@willbooster/wb 14.1.0 → 14.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/bin/dotenv.js +96 -23
- package/dist/index.js +38 -31
- package/package.json +1 -1
package/dist/index.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import e from"node:fs";import t from"node:path";import n,{execFileSync as r,spawn as i,spawnSync as a}from"node:child_process";import{config as o,parse as s}from"dotenv";import{expand as c}from"dotenv-expand";import{createHash as l}from"node:crypto";import u from"yargs";import{hideBin as d}from"yargs/helpers";import f from"chalk";import{globby as p}from"globby";import m,{constants as h}from"node:os";import{PromisePool as g}from"minimal-promise-pool";import{parse as _}from"jsonc-parser";import v from"kill-port";import y from"node:fs/promises";import b from"node:assert";import x from"node:http";import{setTimeout as S}from"node:timers/promises";import{createServer as C}from"node:net";import{fileURLToPath as w}from"node:url";import{distance as T}from"fastest-levenshtein";const E={env:{description:`.env files to be loaded.`,nargs:1,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`},"quiet-env":{description:`Suppress .env file loading information.`,type:`boolean`},verbose:{description:`Whether to show verbose information`,type:`boolean`,alias:`v`}};function D(n,r,i){let a=(n.env??[]).map(e=>t.resolve(r,e.toString())),o=process.env,s=n.cascadeEnv??(n.cascadeNodeEnv?o.NODE_ENV||`development`:n.autoCascadeEnv?o.WB_ENV||o.NODE_ENV||`development`:void 0);if(typeof s==`string`){if(a.length===0&&(a.push(t.join(r,`.env`)),n.includeRootEnv)){let n=t.resolve(r,`..`,`..`);e.existsSync(t.join(n,`package.json`))&&a.push(t.join(n,`.env`))}a=a.flatMap(e=>s?[`${e}.${s}.local`,`${e}.local`,`${e}.${s}`,e]:[`${e}.local`,e])}a=a.filter(t=>e.existsSync(t)).map(e=>t.relative(r,e));let l=
|
|
2
|
-
`)){let e=/^\s*(\d+)\s+(\d+)\s*$/.exec(n);if(!e)continue;let r=Number(e[1]),i=Number(e[2]),a=t.get(i);a?a.push(r):t.set(i,[r])}return t}function
|
|
1
|
+
import e from"node:fs";import t from"node:path";import n,{execFileSync as r,spawn as i,spawnSync as a}from"node:child_process";import{config as o,parse as s}from"dotenv";import{expand as c}from"dotenv-expand";import{createHash as l}from"node:crypto";import u from"yargs";import{hideBin as d}from"yargs/helpers";import f from"chalk";import{globby as p}from"globby";import m,{constants as h}from"node:os";import{PromisePool as g}from"minimal-promise-pool";import{parse as _}from"jsonc-parser";import v from"kill-port";import y from"node:fs/promises";import b from"node:assert";import x from"node:http";import{setTimeout as S}from"node:timers/promises";import{createServer as C}from"node:net";import{fileURLToPath as w}from"node:url";import{distance as T}from"fastest-levenshtein";const E={env:{description:`.env files to be loaded.`,nargs:1,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`},"quiet-env":{description:`Suppress .env file loading information.`,type:`boolean`},verbose:{description:`Whether to show verbose information`,type:`boolean`,alias:`v`}};function D(n,r,i){let a=(n.env??[]).map(e=>t.resolve(r,e.toString())),o=process.env,s=n.cascadeEnv??(n.cascadeNodeEnv?o.NODE_ENV||`development`:n.autoCascadeEnv?o.WB_ENV||o.NODE_ENV||`development`:void 0);if(typeof s==`string`){if(a.length===0&&(a.push(t.join(r,`.env`)),n.includeRootEnv)){let n=t.resolve(r,`..`,`..`);e.existsSync(t.join(n,`package.json`))&&a.push(t.join(n,`.env`))}a=a.flatMap(e=>s?[`${e}.${s}.local`,`${e}.local`,`${e}.${s}`,e]:[`${e}.local`,e])}a=a.filter(t=>e.existsSync(t)).map(e=>t.relative(r,e));let l=te(n);n.verbose&&!l&&(console.info(`WB_ENV: ${o.WB_ENV}, NODE_ENV: ${o.NODE_ENV}`),console.info(`Reading env files:`,a.join(`, `)));let u=!!(n.cascadeEnv??(n.cascadeNodeEnv?o.NODE_ENV||`development`:n.autoCascadeEnv?o.WB_ENV:void 0))&&!ee(o.CI),d=new Set;if(u&&typeof s==`string`&&s.length>0){for(let e of a)if(e.endsWith(`.${s}`)||e.endsWith(`.${s}.local`))for(let n of Object.keys(ne(t.join(r,e))))d.add(n)}let f=[],p={};for(let e of a){let a=[];for(let[n,o]of Object.entries(ne(t.join(r,e)))){if(n in p)continue;let t=process.env[n],r=!i?.ignoreProcessEnv&&n in process.env;r&&!(u&&d.has(n))||(r&&t!==o&&!l&&console.warn(`Warning: ${n} in ${e} overrides the value inherited from the parent environment because the ${s} environment is explicitly forced.`),p[n]=o,a.push(n))}f.push([e,a]),n.verbose&&!l&&a.length>0&&console.info(`Read ${a.length} environment variables from ${e}`)}let[m,h]=O(r,s,p,{...i,modeFileOverridesProcessEnv:u});Object.assign(p,m),(h.length>0||A(r))&&(f.push([j(s),h]),n.verbose&&!l&&console.info(`Read ${h.length} environment variables from ${j(s)}`));let[g,_]=M(r,s,p,i);if(Object.assign(p,g),_.length>0&&(f.push([P(s),_]),n.verbose&&!l&&console.info(`Read ${_.length} environment variables from ${P(s)}`)),!n.verbose&&!l&&console.info(`Read env files: ${f.map(([e,t])=>t.length>0?`${e} (${t.join(`, `)})`:e).join(`, `)||`nothing`}`),n.checkEnv){let e=Object.keys(ne(t.join(r,n.checkEnv))).filter(e=>!(e in p)&&!(e in process.env));if(e.length>0)throw Error(`Missing environment variables in [${a.join(`, `)}]: [${e.join(`, `)}]`)}let v={};for(let[e,t]of Object.entries(process.env))t!==void 0&&!(e in p)&&(v[e]=t.replaceAll(`$`,String.raw`\$`));let y={};for(let e of[..._,...h])y[e]=p[e];return Object.assign(y,p),[c({parsed:y,processEnv:v}).parsed??y,f]}function O(e,t,n,r){if(!A(e))return[{},[]];let i=k(e,t,{quiet:!1});if(!i)return[{},[]];let a=!1,o=()=>(a===!1&&(a=k(e,void 0,{quiet:!0,ignoreProfileEnvVar:!0})),a),s={},c=[];for(let[e,a]of Object.entries(i))if(!(typeof a!=`string`||e in n)){if(!r?.ignoreProcessEnv&&e in process.env){let n=r?.modeFileOverridesProcessEnv&&t?o():void 0;if(!(n!==void 0&&n[e]!==a))continue}s[e]=a,c.push(e)}return[s,c]}function k(e,t,r){let i=[`export`,`--format`,`json`,`--no-color`,`--if-missing`,`error`,`--non-interactive`],a={...process.env};t&&i.push(`--profile`,t),r.ignoreProfileEnvVar&&delete a.FNOX_PROFILE;let o=n.spawnSync(`fnox`,i,{cwd:e,env:a,encoding:`utf8`,stdio:[`ignore`,`pipe`,`pipe`]});if(o.error||o.status!==0||!o.stdout?.trim()){r.quiet||console.warn(`Failed to read fnox secrets: ${o.error?.message||o.stderr?.trim()||`fnox exited with status ${o.status}`}`);return}let s;try{s=JSON.parse(o.stdout)}catch{return}let c=s?.secrets;if(!(!c||typeof c!=`object`||Array.isArray(c)))return c}function A(n){for(let r=t.resolve(n);;r=t.dirname(r)){if(e.existsSync(t.join(r,`fnox.toml`)))return!0;if(t.dirname(r)===r)return!1}}function j(e){return e?`fnox export --profile ${e}`:`fnox export`}function M(e,t,r,i){if(!N(e))return[{},[]];let a=[`env`,`--json`,`--cd`,e];t&&a.push(`--env`,t);let o=n.spawnSync(`mise`,a,{encoding:`utf8`,stdio:[`ignore`,`pipe`,`pipe`]});if(o.error||o.status!==0||!o.stdout?.trim())return[{},[]];let s;try{s=JSON.parse(o.stdout)}catch{return[{},[]]}if(!s||typeof s!=`object`||Array.isArray(s))return[{},[]];let c={},l=[];for(let[e,t]of Object.entries(s))if(!(typeof t!=`string`||e in r)){if(i?.ignoreProcessEnv){if(e===`PATH`)continue}else if(process.env[e]===t)continue;c[e]=t,l.push(e)}return[c,l]}function N(n){for(let r=t.resolve(n);;r=t.dirname(r)){if(e.existsSync(t.join(r,`mise.toml`))||e.existsSync(t.join(r,`.mise.toml`)))return!0;if(t.dirname(r)===r)return!1}}function P(e){return e?`mise env --env ${e}`:`mise env`}function ee(e){return!!e&&e!==`0`&&e!==`false`}function te(e){let t=e;return t.quietEnv===!0||t.quietEnv!==!1&&t.silent===!0}const F=new Map;function ne(e){let n=F.get(e);if(n)return n;let r=o({path:t.resolve(e),processEnv:{},quiet:!0}).parsed??{};return F.set(e,r),r}function re(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(let t of Object.keys(e)){let n=t.toUpperCase();(n.startsWith(`NPM_`)||n.startsWith(`YARN_`)||n.startsWith(`BERRY_`)||n===`PROJECT_CWD`||n===`INIT_CWD`)&&delete e[t]}}function ie(e){return e instanceof Error&&`code`in e}function ae(e){let t=new Map;for(let n of e.split(`
|
|
2
|
+
`)){let e=/^\s*(\d+)\s+(\d+)\s*$/.exec(n);if(!e)continue;let r=Number(e[1]),i=Number(e[2]),a=t.get(i);a?a.push(r):t.set(i,[r])}return t}function oe(e,t){let n=[],r=[...t.get(e)??[]],i=0;for(;i<r.length;){let e=r[i];i+=1,n.push(e),r.push(...t.get(e)??[])}return n}function I(e,t=`SIGTERM`){if(!Number.isInteger(e)||e<=0)throw Error(`Invalid pid: ${e}`);if(process.platform===`win32`){ce(e);return}let n=ue(e,le(e));for(let e of n)se(e,t)}function se(e,t){try{process.kill(e,t)}catch(e){if(fe(e))return;throw e}}function ce(e){try{de(`taskkill`,[`/PID`,String(e),`/T`,`/F`],{maxBuffer:1024*1024,timeout:2e3})}catch(e){if(fe(e))return;throw e}}function le(e){let{stdout:t}=de(`ps`,[`-Ao`,`pid=,ppid=`],{maxBuffer:1024*1024,timeout:2e3});return oe(e,ae(t))}function ue(e,t){let n=t.toReversed();return n.push(e),n}function de(e,t,n){try{return{stdout:r(e,[...t],{encoding:`utf8`,maxBuffer:n?.maxBuffer,timeout:n?.timeout,stdio:[`ignore`,`pipe`,`pipe`]}),stderr:``}}catch(n){throw new he(e,t,me(n),pe(n))}}function fe(e){return ie(e)&&e.code===`ESRCH`?!0:e instanceof he&&/no such process|not found|not recognized|there is no running instance/i.test(e.stderr)}function pe(e){if(ie(e))return e.code;if(typeof e==`object`&&e&&`status`in e){let t=e.status;if(typeof t==`number`)return t}}function me(e){if(typeof e!=`object`||!e||!(`stderr`in e))return``;let t=e.stderr;return typeof t==`string`?t:Buffer.isBuffer(t)?t.toString(`utf8`):``}var he=class extends Error{stderr;code;constructor(e,t,n,r){super(`Command failed: ${e} ${t.join(` `)}`),this.name=`CommandExecutionError`,this.stderr=n,this.code=r}};async function L(e,t,n){return new Promise((r,a)=>{try{let o=i(e,t??[],n??{});o.stdout?.setEncoding?.(`utf8`),o.stderr?.setEncoding?.(`utf8`);let s=``,c=``,l=_e(process.stdout,n?.omitBlankLinesWhilePrinting),u=_e(process.stderr,n?.omitBlankLinesWhilePrinting);o.stdout?.on(`data`,e=>{s+=e,n?.printingStdout&&l.write(e)}),o.stderr?.on(`data`,e=>{n?.mergeOutAndError?s+=e:c+=e,n?.printingStderr&&u.write(e)});let d=!1,f=()=>{if(!(d||!o.pid)){d=!0,n?.verbose&&console.info(`treeKill(${o.pid})`);try{I(o.pid)}catch(e){n?.verbose&&console.warn(`Failed to treeKill(${o.pid})`,e)}}},p=process.platform===`win32`?[`SIGINT`,`SIGTERM`]:[`SIGINT`,`SIGTERM`,`SIGQUIT`],m=new Map,h=()=>{process.removeListener(`beforeExit`,f);for(let[e,t]of m)process.removeListener(e,t);m.clear()};if(n?.killOnExit){process.on(`beforeExit`,f);for(let e of p){let t=()=>{f(),h(),process.listenerCount(e)===0&&process.kill(process.pid,e)};m.set(e,t),process.on(e,t)}}o.on(`error`,e=>{h(),o.removeAllListeners(`close`),a(e)}),o.on(`close`,(e,t)=>{h(),l.flush(),u.flush(),o.pid===void 0?a(Error(`Process has no pid.`)):r({pid:o.pid,stdout:s,stderr:c,status:e,signal:t})}),n?.input&&(o.stdin?.write(n.input),o.stdin?.end())}catch(e){a(e)}})}const ge=RegExp(`${String.fromCodePoint(27)}\\[[0-?]*[ -/]*[@-~]`,`g`);function _e(e,t=!1){if(!t)return{write:t=>e.write(t),flush:()=>{}};let n=``;return{write:t=>{n+=t;let r=n.split(/\r?\n/);n=r.pop()??``;for(let t of r)ve(t)||e.write(`${t}\n`)},flush:()=>{ve(n)||e.write(n),n=``}}}function ve(e){return e.replaceAll(ge,``).trim().length===0}async function ye(e){try{return await e()}catch(e){if(typeof e==`object`&&e&&`code`in e&&e.code===`ENOENT`)return;throw e}}
|
|
3
3
|
/**
|
|
4
4
|
* [js-sha3]{@link https://github.com/emn178/js-sha3}
|
|
5
5
|
*
|
|
@@ -8,23 +8,29 @@ import e from"node:fs";import t from"node:path";import n,{execFileSync as r,spaw
|
|
|
8
8
|
* @copyright Chen, Yi-Cyuan 2015-2023
|
|
9
9
|
* @license MIT
|
|
10
10
|
*/
|
|
11
|
-
const L=[...`0123456789abcdef`],ye=[6,1536,393216,100663296],R=[0,8,16,24],be=[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];function xe(e){return new Ce(512,ye,512).update(e).hex()}const Se=e=>{let t=[];for(let[n,r]of e.entries())t[n]=r;return t};var Ce=class{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 Error(`finalize already called`);let t=this.blocks,n=this.byteCount,r=e.length,i=this.blockCount,a=this.s,o,s,c=0;for(;c<r;){if(this.reset)for(this.reset=!1,t[0]=this.block,o=1;o<i+1;++o)t[o]=0;for(o=this.start;c<r&&o<n;++c)s=e.codePointAt(c)||0,s<128?t[o>>2]|=s<<R[3&o++]:s<2048?(t[o>>2]|=(192|s>>6)<<R[3&o++],t[o>>2]|=(128|63&s)<<R[3&o++]):s<55296||s>=57344?(t[o>>2]|=(224|s>>12)<<R[3&o++],t[o>>2]|=(128|s>>6&63)<<R[3&o++],t[o>>2]|=(128|63&s)<<R[3&o++]):(s=65536+((1023&s)<<10|1023&(e.codePointAt(++c)||0)),t[o>>2]|=(240|s>>18)<<R[3&o++],t[o>>2]|=(128|s>>12&63)<<R[3&o++],t[o>>2]|=(128|s>>6&63)<<R[3&o++],t[o>>2]|=(128|63&s)<<R[3&o++]);if(this.lastByteIndex=o,o>=n){for(this.start=o-n,this.block=t[i],o=0;o<i;++o)a[o]^=t[o];we(a),this.reset=!0}else this.start=o}return this}finalize(){if(this.finalized)return;this.finalized=!0;let e=this.blocks,t=this.lastByteIndex,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];we(r)}hex(){this.finalize();let e=this.blockCount,t=this.s,n=this.outputBlocks,r=this.extraBytes,i,a=0,o=0,s=``;for(;o<n;){for(a=0;a<e&&o<n;++a,++o)i=t[a],s+=L[i>>4&15]+L[15&i]+L[i>>12&15]+L[i>>8&15]+L[i>>20&15]+L[i>>16&15]+L[i>>28&15]+L[i>>24&15];o%e===0&&(t=Se(t),we(t),a=0)}return r&&(i=t[a],s+=L[i>>4&15]+L[15&i],r>1&&(s+=L[i>>12&15]+L[i>>8&15]),r>2&&(s+=L[i>>20&15]+L[i>>16&15])),s}};const we=function(e){let t,n,r,i,a,o,s,c,l,u,d,f,p,m,h,g,_,v,y,b,x,S,C,w,T,E,D,O,k,A,j,M,N,P,ee,te,ne,re,ie,ae,F,oe,se,ce,le,ue,de,fe,pe,me,I,he,ge,_e,ve,L,ye,R,xe,Se,Ce,we,Te;for(r=0;r<48;r+=2)i=e[0]^e[10]^e[20]^e[30]^e[40],a=e[1]^e[11]^e[21]^e[31]^e[41],o=e[2]^e[12]^e[22]^e[32]^e[42],s=e[3]^e[13]^e[23]^e[33]^e[43],c=e[4]^e[14]^e[24]^e[34]^e[44],l=e[5]^e[15]^e[25]^e[35]^e[45],u=e[6]^e[16]^e[26]^e[36]^e[46],d=e[7]^e[17]^e[27]^e[37]^e[47],f=e[8]^e[18]^e[28]^e[38]^e[48],p=e[9]^e[19]^e[29]^e[39]^e[49],t=f^(o<<1|s>>>31),n=p^(s<<1|o>>>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=i^(c<<1|l>>>31),n=a^(l<<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=o^(u<<1|d>>>31),n=s^(d<<1|u>>>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^(f<<1|p>>>31),n=l^(p<<1|f>>>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=u^(i<<1|a>>>31),n=d^(a<<1|i>>>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,m=e[0],h=e[1],ue=e[11]<<4|e[10]>>>28,de=e[10]<<4|e[11]>>>28,O=e[20]<<3|e[21]>>>29,k=e[21]<<3|e[20]>>>29,Se=e[31]<<9|e[30]>>>23,Ce=e[30]<<9|e[31]>>>23,oe=e[40]<<18|e[41]>>>14,se=e[41]<<18|e[40]>>>14,P=e[2]<<1|e[3]>>>31,ee=e[3]<<1|e[2]>>>31,g=e[13]<<12|e[12]>>>20,_=e[12]<<12|e[13]>>>20,fe=e[22]<<10|e[23]>>>22,pe=e[23]<<10|e[22]>>>22,A=e[33]<<13|e[32]>>>19,j=e[32]<<13|e[33]>>>19,we=e[42]<<2|e[43]>>>30,Te=e[43]<<2|e[42]>>>30,_e=e[5]<<30|e[4]>>>2,ve=e[4]<<30|e[5]>>>2,te=e[14]<<6|e[15]>>>26,ne=e[15]<<6|e[14]>>>26,v=e[25]<<11|e[24]>>>21,y=e[24]<<11|e[25]>>>21,me=e[34]<<15|e[35]>>>17,I=e[35]<<15|e[34]>>>17,M=e[45]<<29|e[44]>>>3,N=e[44]<<29|e[45]>>>3,w=e[6]<<28|e[7]>>>4,T=e[7]<<28|e[6]>>>4,L=e[17]<<23|e[16]>>>9,ye=e[16]<<23|e[17]>>>9,re=e[26]<<25|e[27]>>>7,ie=e[27]<<25|e[26]>>>7,b=e[36]<<21|e[37]>>>11,x=e[37]<<21|e[36]>>>11,he=e[47]<<24|e[46]>>>8,ge=e[46]<<24|e[47]>>>8,ce=e[8]<<27|e[9]>>>5,le=e[9]<<27|e[8]>>>5,E=e[18]<<20|e[19]>>>12,D=e[19]<<20|e[18]>>>12,R=e[29]<<7|e[28]>>>25,xe=e[28]<<7|e[29]>>>25,ae=e[38]<<8|e[39]>>>24,F=e[39]<<8|e[38]>>>24,S=e[48]<<14|e[49]>>>18,C=e[49]<<14|e[48]>>>18,e[0]=m^~g&v,e[1]=h^~_&y,e[10]=w^~E&O,e[11]=T^~D&k,e[20]=P^~te&re,e[21]=ee^~ne&ie,e[30]=ce^~ue&fe,e[31]=le^~de&pe,e[40]=_e^~L&R,e[41]=ve^~ye&xe,e[2]=g^~v&b,e[3]=_^~y&x,e[12]=E^~O&A,e[13]=D^~k&j,e[22]=te^~re&ae,e[23]=ne^~ie&F,e[32]=ue^~fe&me,e[33]=de^~pe&I,e[42]=L^~R&Se,e[43]=ye^~xe&Ce,e[4]=v^~b&S,e[5]=y^~x&C,e[14]=O^~A&M,e[15]=k^~j&N,e[24]=re^~ae&oe,e[25]=ie^~F&se,e[34]=fe^~me&he,e[35]=pe^~I&ge,e[44]=R^~Se&we,e[45]=xe^~Ce&Te,e[6]=b^~S&m,e[7]=x^~C&h,e[16]=A^~M&w,e[17]=j^~N&T,e[26]=ae^~oe&P,e[27]=F^~se&ee,e[36]=me^~he&ce,e[37]=I^~ge&le,e[46]=Se^~we&_e,e[47]=Ce^~Te&ve,e[8]=S^~m&g,e[9]=C^~h&_,e[18]=M^~w&E,e[19]=N^~T&D,e[28]=oe^~P&te,e[29]=se^~ee&ne,e[38]=he^~ce&ue,e[39]=ge^~le&de,e[48]=we^~_e&L,e[49]=Te^~ve&ye,e[0]^=be[r],e[1]^=be[r+1]},Te=function(){return new Map([{instance:Error,from:e=>{let t=[e.name,e.message];return e.stack!==void 0&&t.push(e.stack),e.cause!==void 0&&(e.stack===void 0&&t.push(void 0),t.push(e.cause)),t},stub:()=>Error(),hydrate:(e,[t,n,r,i])=>{e.name=t,e.message=n,r===void 0?delete e.stack:e.stack=r,i!==void 0&&(e.cause=i)}},{instance:Uint8Array,from:e=>[btoa(De.decode(e))],create:([e])=>Ee.encode(atob(e))},{instance:Map,from:e=>[...e.entries()],stub:()=>new Map,hydrate:(e,t)=>{for(let[n,r]of t)e.set(n,r)}},{instance:Set,from:e=>[...e.values()],stub:()=>new Set,hydrate:(e,t)=>{for(let n of t)e.add(n)}},{instance:Date,from:e=>[e.toJSON()],create:([e])=>new Date(e)},{instance:RegExp,from:({flags:e,source:t})=>e?[t,e]:[t],create:([e,t])=>new RegExp(e,t)},{instance:URL,from:e=>[e.href],create:([e])=>new URL(e)}].map(e=>[e.instance.name,e]))}(),Ee=new TextEncoder,De=new TextDecoder(`utf-8`);function Oe(e,t=Te){return JSON.stringify(je(e,t))}function ke(e){if(e===void 0)return-1;if(typeof e==`number`){if(Number.isNaN(e))return-3;if(!Number.isFinite(e))return e<0?-5:-4}return null}const Ae=[];function je(e,t=Te){let n=ke(e);if(n!==null)return n;let r=[],i=new Map;return function e(n){let a=ke(n);if(a!==null)return a;let o=i.get(n);if(o!==void 0)return o;switch(o=r.length,typeof n){case`number`:case`string`:case`boolean`:r[o]=n,i.set(n,o);break;case`bigint`:r[o]=[-6,n.toString(16)],i.set(n,o);break;case`object`:if(n===null)r[o]=n,i.set(n,o);else if(Array.isArray(n)){let t=function(e){if(Ae.length<e){let t=Ae.length;Ae.length=e,Ae.fill(-2,t,e)}return Ae.slice(0,e)}(n.length);r[o]=t,i.set(n,o);for(let[r,i]of n.entries())t[r]=e(i)}else{let[a,s]=function(e,t){let n=e.constructor;if(typeof n==`function`){let r=n.name,i=t.get(r);if(i!==void 0)return[r,i.from(e)]}let r=Object.entries(e),i=r.length,a=Array.from({length:i+i});for(let e=0;e<i;e++){let t=r[e],n=e+e;a[n]=t[0],a[n+1]=t[1]}return[``,a]}(n,t),c=s.length,l=Array.from({length:c+1});l[0]=a,r[o]=l,i.set(n,o);for(let t=0;t<c;t++)l[t+1]=e(s[t])}}return o}(e),r}function Me(e,t){return xe(Oe([e,t]))}function Ne(){return``}const z=Pe({getCacheKey:Me});Pe({getCacheKey:Ne});function Pe({cacheDuration:e=1/0,getCacheKey:t=Me}={}){return function(n,r){let i,a,o;return r?.kind===`getter`?function(){let r=t(this,[]),s=Date.now();return(o!==r||s-a>e)&&(o=r,i=n.call(this),a=s),i}:function(...s){let c=t(this,s),l=Date.now();return(o!==c||l-a>e)&&(o=c,i=r?n.call(this,...s):n(...s),a=l),i}}}function Fe(n,r){let i=[],a=t.resolve(n);for(;;){let n=t.join(a,`node_modules`,`.bin`);if(e.existsSync(n)&&i.push(n),e.existsSync(t.join(a,`.git`)))break;let r=t.dirname(a);if(a===r)break;a=r}return i.length===0?!1:(r.PATH=r.PATH?`${i.join(`:`)}:${r.PATH}`:i.join(`:`),!0)}function Ie(e){return!!e&&e!==`0`&&e!==`false`}let Le;function Re(e,t,n,r,i,a){var o,s,c,l,u,d,f,p=Symbol.metadata||Symbol.for(`Symbol.metadata`),m=Object.defineProperty,h=Object.create,g=[h(null),h(null)],_=t.length;function v(t,n,r){return function(i,a){n&&(a=i,i=e);for(var o=0;o<t.length;o++)a=t[o].apply(i,r?[a]:[]);return r?a:i}}function y(e,t,n,r){if(typeof e!=`function`&&(r||e!==void 0))throw TypeError(t+` must `+(n||`be`)+` a function`+(r?``:` or undefined`));return e}function b(e,t,n,r,i,a,c,l,u,d,f){function p(e){if(!f(e))throw TypeError(`Attempted to access private element on non-instance`)}var h=[].concat(t[0]),_=t[3],b=!c,x=i===1,S=i===3,C=i===4,w=i===2;function T(t,n,r){return function(i,a){return n&&(a=i,i=e),r&&r(i),E[t].call(i,a)}}if(!b){var E={},D=[],O=S?`get`:C||x?`set`:`value`;if(u?(d||x?E={get:Ve(function(){return _(this)},r,`get`),set:function(e){t[4](this,e)}}:E[O]=_,d||Ve(E[O],r,w?``:O)):d||(E=Object.getOwnPropertyDescriptor(e,r)),!d&&!u){if((s=g[+l][r])&&(s^i)!==7)throw Error(`Decorating two elements with the same name (`+E[O].name+`) is not supported yet`);g[+l][r]=i<3?1:i}}for(var k=e,A=h.length-1;A>=0;A-=n?2:1){var j=y(h[A],`A decorator`,`be`,!0),M=n?h[A-1]:void 0,N={},P={kind:[`field`,`accessor`,`method`,`getter`,`setter`,`class`][i],name:r,metadata:o,addInitializer:function(e,t){if(e.v)throw TypeError(`attempted to call addInitializer after decoration was finished`);y(t,`An initializer`,`be`,!0),a.push(t)}.bind(null,N)};if(b)s=j.call(M,k,P),N.v=1,y(s,`class decorators`,`return`)&&(k=s);else if(P.static=l,P.private=u,s=P.access={has:u?f.bind():function(e){return r in e}},C||(s.get=u?w?function(e){return p(e),E.value}:T(`get`,0,p):function(e){return e[r]}),w||S||(s.set=u?T(`set`,0,p):function(e,t){e[r]=t}),k=j.call(M,x?{get:E.get,set:E.set}:E[O],P),N.v=1,x){if(typeof k==`object`&&k)(s=y(k.get,`accessor.get`))&&(E.get=s),(s=y(k.set,`accessor.set`))&&(E.set=s),(s=y(k.init,`accessor.init`))&&D.unshift(s);else if(k!==void 0)throw TypeError(`accessor decorators must return an object with get, set, or init properties or undefined`)}else y(k,(d?`field`:`method`)+` decorators`,`return`)&&(d?D.unshift(k):E[O]=k)}return i<2&&c.push(v(D,l,1),v(a,l,0)),d||b||(u?x?c.splice(-1,0,T(`get`,l),T(`set`,l)):c.push(w?E[O]:y.call.bind(E[O])):m(e,r,E)),k}function x(e){return m(e,p,{configurable:!0,enumerable:!0,value:o})}return a!==void 0&&(o=a[p]),o=h(o??null),u=[],d=function(e){e&&u.push(v(e))},f=function(t,r){for(var a=0;a<n.length;a++){var o=n[a],s=o[1],d=7&s;if((8&s)==t&&!d==r){var f=o[2],p=!!o[3],m=16&s;b(t?e:e.prototype,o,m,p?`#`+f:ze(f),d,d<2?[]:t?l||=[]:c||=[],u,!!t,p,r,t&&p?function(t){return He(t)===e}:i)}}},f(8,0),f(0,0),f(8,1),f(0,1),d(c),d(l),s=u,_||x(e),{e:s,get c(){var n=[];return _&&[x(e=b(e,[t],r,e.name,5,n)),v(n,1)]}}}function ze(e){var t=Be(e,`string`);return typeof t==`symbol`?t:t+``}function Be(e,t){if(typeof e!=`object`||!e)return e;var n=e[Symbol.toPrimitive];if(n!==void 0){var r=n.call(e,t||`default`);if(typeof r!=`object`)return r;throw TypeError(`@@toPrimitive must return a primitive value.`)}return(t===`string`?String:Number)(e)}function Ve(e,t,n){typeof t==`symbol`&&(t=(t=t.description)?`[`+t+`]`:``);try{Object.defineProperty(e,"name",{configurable:!0,value:n?n+` `+t:t})}catch{}return e}function He(e){if(Object(e)!==e)throw TypeError(`right-hand side of 'in' should be an object, got `+(e===null?`null`:typeof e));return e}const Ue=`file:`;var We=class{static{[Le]=Re(this,[],[[z,3,`isBunAvailable`],[z,3,`usesBunPackageManager`],[z,3,`buildCommand`],[z,3,`rootDirPath`],[z,3,`dockerfile`],[z,3,`hasDockerfile`],[z,3,`hasSourceCode`],[z,3,`name`],[z,3,`dockerImageName`],[z,3,`packageJson`],[z,3,`packageJsonPath`],[z,3,`hasPrisma`],[z,3,`hasDrizzle`],[z,3,`databaseOrm`],[z,3,`hasVitest`],[z,3,`hasOxlint`],[z,3,`hasTypeAwareOxlint`],[z,3,`hasOxfmt`],[z,3,`hasPrettier`],[z,3,`hasPoetryLock`],[z,3,`hasPubspecYaml`],[z,3,`hasCargoToml`],[z,3,`preferredLinter`],[z,3,`hasPlaywrightConfig`],[z,3,`skipLaunchingServerForPlaywright`],[z,3,`dockerPackageJson`],[z,3,`binExists`],[z,3,`rootPackageJson`]]).e}argv=void Le(this);loadEnv;pathByName=new Map;_dirPath;constructor(e,n,r){this._dirPath=t.resolve(e),this.argv=n,this.loadEnv=r}get isBunAvailable(){return this.usesBunPackageManager}get packageManagerCommand(){return this.isBunAvailable?`bun`:`yarn`}get packageManagerRunCommand(){return this.isBunAvailable?`bun run`:`yarn`}get usesBunPackageManager(){return this.hasBunToolVersion()||this.hasBunLockfile()?!0:this.hasBunPackageManager()}hasBunToolVersion(){return Ye(t.join(this.rootDirPath,`.tool-versions`),/(^|\n)bun\s/)?!0:[`mise.toml`,`.mise.toml`].some(e=>Ye(t.join(this.rootDirPath,e),/^\s*(?:"bun"|bun)\s*=/m))}hasBunLockfile(){return[`bun.lock`,`bun.lockb`].some(n=>e.existsSync(t.join(this.rootDirPath,n)))}hasBunPackageManager(){let e=this.rootPackageJson?.packageManager??this.packageJson.packageManager;return typeof e==`string`&&e.startsWith(`bun@`)}get buildCommand(){return this.packageJson.scripts?.build?.includes(`buildIfNeeded`)?`YARN run build`:this.packageJson.scripts?.build?`YARN wb buildIfNeeded ${this.argv.verbose?`--verbose`:``}`:`echo 'No build script'`}get dirPath(){return this._dirPath}get rootDirPath(){return e.existsSync(t.join(this.dirPath,`..`,`..`,`package.json`))?t.resolve(this.dirPath,`..`,`..`):this.dirPath}get dockerfile(){return e.readFileSync(this.findFile(`Dockerfile`),`utf8`)}get hasDockerfile(){try{return!!this.findFile(`Dockerfile`)}catch{return!1}}get hasSourceCode(){return e.existsSync(t.join(this.dirPath,`src`))}get name(){return this.packageJson.name||`unknown`}get dockerImageName(){return(this.packageJson.name||`unknown`).replaceAll(`@`,``).replaceAll(`/`,`-`)}envCache;get env(){if(this.envCache)return this.envCache;if(!this.loadEnv)return this.envCache=process.env,this.envCache;let[e,t]=D(this.argv,this.dirPath);if(!P(this.argv))for(let[e,n]of t)console.info(`Loaded ${n} environment variables from ${e}`);return this.envCache={...process.env,...e},this.envCache}get packageJson(){return JSON.parse(e.readFileSync(this.packageJsonPath,`utf8`))}get packageJsonPath(){return t.join(this.dirPath,`package.json`)}get hasPrisma(){return!!this.getOwnDependencyVersion(`prisma`)}get hasDrizzle(){return!!this.getOwnDependencyVersion(`drizzle-orm`)}get databaseOrm(){if(this.hasPrisma)return`prisma`;if(this.hasDrizzle)return`drizzle`}get hasVitest(){return!!(this.packageJson.dependencies?.vitest??this.packageJson.devDependencies?.vitest)}get hasOxlint(){return this.hasDependency(`oxlint`)}get hasTypeAwareOxlint(){return this.hasOxlint&&this.hasDependency(`oxlint-tsgolint`)}get hasOxfmt(){return this.hasDependency(`oxfmt`)}get hasPrettier(){return this.hasDependency(`prettier`)}get hasPoetryLock(){return e.existsSync(t.join(this.dirPath,`poetry.lock`))||e.existsSync(t.join(this.rootDirPath,`poetry.lock`))}get hasPubspecYaml(){return e.existsSync(t.join(this.dirPath,`pubspec.yaml`))||e.existsSync(t.join(this.rootDirPath,`pubspec.yaml`))}get hasCargoToml(){return e.existsSync(t.join(this.dirPath,`Cargo.toml`))}get preferredLinter(){if(this.hasOxlint)return`oxlint`}hasOwnDependency(e){return!!this.getOwnDependencyVersion(e)}get hasPlaywrightConfig(){try{return!!this.findFile(`playwright.config.ts`)}catch{return!1}}get skipLaunchingServerForPlaywright(){if(Ie(this.env.CI))return!1;try{let t=this.findFile(`playwright.config.ts`);return/\bwebServer\b/.test(e.readFileSync(t,`utf8`))}catch{return!1}}get dockerPackageJson(){return t.dirname(this.findFile(`Dockerfile`))===this.dirPath?this.packageJson:JSON.parse(e.readFileSync(t.join(t.dirname(this.findFile(`Dockerfile`)),`package.json`),`utf8`))}get binExists(){return Fe(this.dirPath,this.env)}findFile(n){let r=this.pathByName.get(n);if(r)return r;if(r=[n,t.join(`..`,`..`,n)].map(e=>t.resolve(this.dirPath,e)).find(t=>e.existsSync(t)),!r)throw Error(`File not found: ${n}`);return this.pathByName.set(n,r),r}hasDependency(e){return!!(this.getOwnDependencyVersion(e)??this.getDependencyVersion(this.rootPackageJson,e))}getOwnDependencyVersion(e){return this.getDependencyVersion(this.packageJson,e)}getDependencyVersion(e,t){if(e)return e.dependencies?.[t]??e.devDependencies?.[t]??e.optionalDependencies?.[t]??e.peerDependencies?.[t]}get rootPackageJson(){if(this.rootDirPath===this.dirPath)return this.packageJson;try{return JSON.parse(e.readFileSync(t.join(this.rootDirPath,`package.json`),`utf8`))}catch(e){console.error(`[wb] Failed to read or parse ${t.join(this.rootDirPath,`package.json`)}`,e);return}}};function Ge(e){let t=e.env.DATABASE_URL;if(!t?.startsWith(`file:`))return;let n=t.slice(5).replace(/[?#].*$/,``);return(n.startsWith(`//`)?n.slice(2):n)||void 0}function Ke(e){let n=Ge(e);if(!n)return;if(t.isAbsolute(n))return n;let r=e.rootDirPath??e.dirPath;return r?t.resolve(r,n):void 0}function B(n,r=!0,i){if(i??=process.cwd(),e.existsSync(t.join(i,`package.json`)))return new We(i,n,r)}function qe(e,t){return e.env.WB_ENV===t||e.env.MISE_ENV===t}async function V(e,t=!0,n){let r=Je(e,t,n);if(r)return{...r,descendants:r.root===r.self?await Xe(e,r.root,t):[r.self]}}function Je(n,r=!0,i){if(i??=process.cwd(),!e.existsSync(t.join(i,`package.json`)))return;let a=new We(i,n,r),o=a;if(!a.packageJson.workspaces&&t.dirname(i).endsWith(`/packages`)){let a=t.resolve(i,`..`,`..`);e.existsSync(t.join(a,`package.json`))&&(o=new We(a,n,r))}return{root:o,self:a}}function Ye(t,n){try{return n.test(e.readFileSync(t,`utf8`))}catch{return!1}}async function Xe(n,r,i){let a=[r],o=r.packageJson.workspaces;if(!Array.isArray(o))return a;let s=[],c=[];for(let n of o.map(e=>t.join(r.dirPath,e)))e.existsSync(n)?c.push(n):s.push(n);c.push(...await p(s,{dot:!0,onlyDirectories:!0}));for(let r of c)e.existsSync(t.join(r,`package.json`))&&a.push(new We(r,n,i));return a}const Ze={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(e){await Qe(e)}};async function Qe(n,r){let i=B(n,!0,r);if(!i)return console.error(f.red(`No project found.`)),!0;let a=n.command??(i.packageJson.scripts?.build?`${i.packageManagerRunCommand} build`:void 0);if(!a)return console.info(f.green(`Skip to build because no build command is defined.`)),!1;if(n={...n,command:a},!e.existsSync(t.join(i.rootDirPath,`.git`)))return $e(i,n),!0;let[o,s,c]=await tt(i,n);if(o)return console.info(f.green(`Skip to run '${n.command}' 💫`)),!1;if($e(i,n))return n.dryRun||await e.promises.writeFile(s,c,`utf8`),!0}function $e(e,t){if(console.info(f.green(`Run '${t.command}'`)),!t.dryRun){let r=n.spawnSync(t.command??``,{cwd:e.dirPath,env:e.env,shell:!0,stdio:`inherit`});if(r.status!==0)return process.exitCode=r.status??1,!1}return!0}const et=new Set([`CI`,`PWDEBUG`,`TMPDIR`]);async function tt(r,i){let a=t.resolve(r.dirPath,`node_modules`,`.cache`,`build`),o=t.resolve(a,`last-build`);await e.promises.mkdir(a,{recursive:!0});let s=l(`sha256`),c=n.execSync(`git rev-parse HEAD`,{cwd:r.dirPath}).toString().trim();s.update(c);let u=JSON.stringify(Object.entries(r.env).filter(([e])=>!et.has(e)).toSorted(([e],[t])=>e.localeCompare(t)));s.update(u),await at(r,i,s);let d=s.digest(`hex`);return[await ve(()=>e.promises.readFile(o,`utf8`))===d,o,d]}const nt=[`src/`,`public/`],rt=[`.js`,`.cjs`,`.mjs`,`.jsx`,`.ts`,`.cts`,`.mts`,`.tsx`,`.json`,`.browserslistrc`,`package.json`,`yarn.lock`],it=[`test/`,`tests/`,`__tests__/`,`test-fixtures/`,`test/fixtures/`];async function at(e,t,r){return new Promise(i=>{let a=n.spawnSync(`git`,[`status`,`--porcelain`],{cwd:e.dirPath,env:e.env,stdio:`pipe`,encoding:`utf8`}).stdout.trim().split(`
|
|
12
|
-
`).filter(e=>e.length>0).map(e=>e.slice(2).trim()).map(t=>e.env.WB_ENV===`test`?t.replace(/packages\/wb\/test\/fixtures\/[^/]+\//,``):t).filter(e=>(nt.some(t=>e.includes(t))||rt.some(t=>e.endsWith(t)))&&!it.some(t=>e.includes(t)));t.verbose&&console.info(`Changed files: ${a.join(`, `)}`);let o=n.spawn(`git`,[`diff`,`--`,...a],{cwd:e.rootDirPath});o.stdout.on(`data`,e=>{r.update(e),t.verbose&&(console.info(`Data:`,e),console.info(`Hash:`,r.copy().digest(`hex`)))}),o.on(`close`,()=>{i()})})}const ot=new g,st={exitIfFailed:!0};async function H(e,t,n,r=st){let i=lt(e,t);if(n.silent&&r.omitSilentStart&&!n.dryRun||W(i.printable,t,n.silent?`Command`:`Start`),n.verbose&&W(i.runnable,t,`Start (raw)`,!0),n.dryRun)return ut(i.printable,0,r,{silentSuccess:n.silent}),0;let a=!!(n.silent&&(r.processSilentOutput??r.printSilentOutputOnFailureOnly)),o=!1,s=n.silent&&r.silentProgressIntervalMs?setInterval(()=>{process.stdout.write(`.`),o=!0},r.silentProgressIntervalMs):void 0,c=await I(i.runnable,void 0,{cwd:t.dirPath,env:dt(t.env,{...r,preserveColor:r.preserveColor??(n.silent?!0:void 0)}),shell:!0,stdio:n.silent?`pipe`:`inherit`,timeout:r.timeout,mergeOutAndError:a,killOnExit:!0,printingStdout:n.silent&&!a,printingStderr:n.silent&&!a,omitBlankLinesWhilePrinting:n.silent,verbose:n.verbose}).finally(()=>{s&&clearInterval(s)}),l=c.status??1;if(o&&process.stdout.write(`
|
|
11
|
+
const R=[...`0123456789abcdef`],be=[6,1536,393216,100663296],z=[0,8,16,24],xe=[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];function Se(e){return new we(512,be,512).update(e).hex()}const Ce=e=>{let t=[];for(let[n,r]of e.entries())t[n]=r;return t};var we=class{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 Error(`finalize already called`);let t=this.blocks,n=this.byteCount,r=e.length,i=this.blockCount,a=this.s,o,s,c=0;for(;c<r;){if(this.reset)for(this.reset=!1,t[0]=this.block,o=1;o<i+1;++o)t[o]=0;for(o=this.start;c<r&&o<n;++c)s=e.codePointAt(c)||0,s<128?t[o>>2]|=s<<z[3&o++]:s<2048?(t[o>>2]|=(192|s>>6)<<z[3&o++],t[o>>2]|=(128|63&s)<<z[3&o++]):s<55296||s>=57344?(t[o>>2]|=(224|s>>12)<<z[3&o++],t[o>>2]|=(128|s>>6&63)<<z[3&o++],t[o>>2]|=(128|63&s)<<z[3&o++]):(s=65536+((1023&s)<<10|1023&(e.codePointAt(++c)||0)),t[o>>2]|=(240|s>>18)<<z[3&o++],t[o>>2]|=(128|s>>12&63)<<z[3&o++],t[o>>2]|=(128|s>>6&63)<<z[3&o++],t[o>>2]|=(128|63&s)<<z[3&o++]);if(this.lastByteIndex=o,o>=n){for(this.start=o-n,this.block=t[i],o=0;o<i;++o)a[o]^=t[o];Te(a),this.reset=!0}else this.start=o}return this}finalize(){if(this.finalized)return;this.finalized=!0;let e=this.blocks,t=this.lastByteIndex,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];Te(r)}hex(){this.finalize();let e=this.blockCount,t=this.s,n=this.outputBlocks,r=this.extraBytes,i,a=0,o=0,s=``;for(;o<n;){for(a=0;a<e&&o<n;++a,++o)i=t[a],s+=R[i>>4&15]+R[15&i]+R[i>>12&15]+R[i>>8&15]+R[i>>20&15]+R[i>>16&15]+R[i>>28&15]+R[i>>24&15];o%e===0&&(t=Ce(t),Te(t),a=0)}return r&&(i=t[a],s+=R[i>>4&15]+R[15&i],r>1&&(s+=R[i>>12&15]+R[i>>8&15]),r>2&&(s+=R[i>>20&15]+R[i>>16&15])),s}};const Te=function(e){let t,n,r,i,a,o,s,c,l,u,d,f,p,m,h,g,_,v,y,b,x,S,C,w,T,E,D,O,k,A,j,M,N,P,ee,te,F,ne,re,ie,ae,oe,I,se,ce,le,ue,de,fe,pe,me,he,L,ge,_e,ve,ye,R,be,z,Se,Ce,we;for(r=0;r<48;r+=2)i=e[0]^e[10]^e[20]^e[30]^e[40],a=e[1]^e[11]^e[21]^e[31]^e[41],o=e[2]^e[12]^e[22]^e[32]^e[42],s=e[3]^e[13]^e[23]^e[33]^e[43],c=e[4]^e[14]^e[24]^e[34]^e[44],l=e[5]^e[15]^e[25]^e[35]^e[45],u=e[6]^e[16]^e[26]^e[36]^e[46],d=e[7]^e[17]^e[27]^e[37]^e[47],f=e[8]^e[18]^e[28]^e[38]^e[48],p=e[9]^e[19]^e[29]^e[39]^e[49],t=f^(o<<1|s>>>31),n=p^(s<<1|o>>>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=i^(c<<1|l>>>31),n=a^(l<<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=o^(u<<1|d>>>31),n=s^(d<<1|u>>>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^(f<<1|p>>>31),n=l^(p<<1|f>>>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=u^(i<<1|a>>>31),n=d^(a<<1|i>>>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,m=e[0],h=e[1],le=e[11]<<4|e[10]>>>28,ue=e[10]<<4|e[11]>>>28,O=e[20]<<3|e[21]>>>29,k=e[21]<<3|e[20]>>>29,z=e[31]<<9|e[30]>>>23,Se=e[30]<<9|e[31]>>>23,oe=e[40]<<18|e[41]>>>14,I=e[41]<<18|e[40]>>>14,P=e[2]<<1|e[3]>>>31,ee=e[3]<<1|e[2]>>>31,g=e[13]<<12|e[12]>>>20,_=e[12]<<12|e[13]>>>20,de=e[22]<<10|e[23]>>>22,fe=e[23]<<10|e[22]>>>22,A=e[33]<<13|e[32]>>>19,j=e[32]<<13|e[33]>>>19,Ce=e[42]<<2|e[43]>>>30,we=e[43]<<2|e[42]>>>30,ge=e[5]<<30|e[4]>>>2,_e=e[4]<<30|e[5]>>>2,te=e[14]<<6|e[15]>>>26,F=e[15]<<6|e[14]>>>26,v=e[25]<<11|e[24]>>>21,y=e[24]<<11|e[25]>>>21,pe=e[34]<<15|e[35]>>>17,me=e[35]<<15|e[34]>>>17,M=e[45]<<29|e[44]>>>3,N=e[44]<<29|e[45]>>>3,w=e[6]<<28|e[7]>>>4,T=e[7]<<28|e[6]>>>4,ve=e[17]<<23|e[16]>>>9,ye=e[16]<<23|e[17]>>>9,ne=e[26]<<25|e[27]>>>7,re=e[27]<<25|e[26]>>>7,b=e[36]<<21|e[37]>>>11,x=e[37]<<21|e[36]>>>11,he=e[47]<<24|e[46]>>>8,L=e[46]<<24|e[47]>>>8,se=e[8]<<27|e[9]>>>5,ce=e[9]<<27|e[8]>>>5,E=e[18]<<20|e[19]>>>12,D=e[19]<<20|e[18]>>>12,R=e[29]<<7|e[28]>>>25,be=e[28]<<7|e[29]>>>25,ie=e[38]<<8|e[39]>>>24,ae=e[39]<<8|e[38]>>>24,S=e[48]<<14|e[49]>>>18,C=e[49]<<14|e[48]>>>18,e[0]=m^~g&v,e[1]=h^~_&y,e[10]=w^~E&O,e[11]=T^~D&k,e[20]=P^~te&ne,e[21]=ee^~F&re,e[30]=se^~le&de,e[31]=ce^~ue&fe,e[40]=ge^~ve&R,e[41]=_e^~ye&be,e[2]=g^~v&b,e[3]=_^~y&x,e[12]=E^~O&A,e[13]=D^~k&j,e[22]=te^~ne&ie,e[23]=F^~re&ae,e[32]=le^~de&pe,e[33]=ue^~fe&me,e[42]=ve^~R&z,e[43]=ye^~be&Se,e[4]=v^~b&S,e[5]=y^~x&C,e[14]=O^~A&M,e[15]=k^~j&N,e[24]=ne^~ie&oe,e[25]=re^~ae&I,e[34]=de^~pe&he,e[35]=fe^~me&L,e[44]=R^~z&Ce,e[45]=be^~Se&we,e[6]=b^~S&m,e[7]=x^~C&h,e[16]=A^~M&w,e[17]=j^~N&T,e[26]=ie^~oe&P,e[27]=ae^~I&ee,e[36]=pe^~he&se,e[37]=me^~L&ce,e[46]=z^~Ce&ge,e[47]=Se^~we&_e,e[8]=S^~m&g,e[9]=C^~h&_,e[18]=M^~w&E,e[19]=N^~T&D,e[28]=oe^~P&te,e[29]=I^~ee&F,e[38]=he^~se&le,e[39]=L^~ce&ue,e[48]=Ce^~ge&ve,e[49]=we^~_e&ye,e[0]^=xe[r],e[1]^=xe[r+1]},Ee=function(){return new Map([{instance:Error,from:e=>{let t=[e.name,e.message];return e.stack!==void 0&&t.push(e.stack),e.cause!==void 0&&(e.stack===void 0&&t.push(void 0),t.push(e.cause)),t},stub:()=>Error(),hydrate:(e,[t,n,r,i])=>{e.name=t,e.message=n,r===void 0?delete e.stack:e.stack=r,i!==void 0&&(e.cause=i)}},{instance:Uint8Array,from:e=>[btoa(Oe.decode(e))],create:([e])=>De.encode(atob(e))},{instance:Map,from:e=>[...e.entries()],stub:()=>new Map,hydrate:(e,t)=>{for(let[n,r]of t)e.set(n,r)}},{instance:Set,from:e=>[...e.values()],stub:()=>new Set,hydrate:(e,t)=>{for(let n of t)e.add(n)}},{instance:Date,from:e=>[e.toJSON()],create:([e])=>new Date(e)},{instance:RegExp,from:({flags:e,source:t})=>e?[t,e]:[t],create:([e,t])=>new RegExp(e,t)},{instance:URL,from:e=>[e.href],create:([e])=>new URL(e)}].map(e=>[e.instance.name,e]))}(),De=new TextEncoder,Oe=new TextDecoder(`utf-8`);function ke(e,t=Ee){return JSON.stringify(Me(e,t))}function Ae(e){if(e===void 0)return-1;if(typeof e==`number`){if(Number.isNaN(e))return-3;if(!Number.isFinite(e))return e<0?-5:-4}return null}const je=[];function Me(e,t=Ee){let n=Ae(e);if(n!==null)return n;let r=[],i=new Map;return function e(n){let a=Ae(n);if(a!==null)return a;let o=i.get(n);if(o!==void 0)return o;switch(o=r.length,typeof n){case`number`:case`string`:case`boolean`:r[o]=n,i.set(n,o);break;case`bigint`:r[o]=[-6,n.toString(16)],i.set(n,o);break;case`object`:if(n===null)r[o]=n,i.set(n,o);else if(Array.isArray(n)){let t=function(e){if(je.length<e){let t=je.length;je.length=e,je.fill(-2,t,e)}return je.slice(0,e)}(n.length);r[o]=t,i.set(n,o);for(let[r,i]of n.entries())t[r]=e(i)}else{let[a,s]=function(e,t){let n=e.constructor;if(typeof n==`function`){let r=n.name,i=t.get(r);if(i!==void 0)return[r,i.from(e)]}let r=Object.entries(e),i=r.length,a=Array.from({length:i+i});for(let e=0;e<i;e++){let t=r[e],n=e+e;a[n]=t[0],a[n+1]=t[1]}return[``,a]}(n,t),c=s.length,l=Array.from({length:c+1});l[0]=a,r[o]=l,i.set(n,o);for(let t=0;t<c;t++)l[t+1]=e(s[t])}}return o}(e),r}function Ne(e,t){return Se(ke([e,t]))}function Pe(){return``}const B=Fe({getCacheKey:Ne});Fe({getCacheKey:Pe});function Fe({cacheDuration:e=1/0,getCacheKey:t=Ne}={}){return function(n,r){let i,a,o;return r?.kind===`getter`?function(){let r=t(this,[]),s=Date.now();return(o!==r||s-a>e)&&(o=r,i=n.call(this),a=s),i}:function(...s){let c=t(this,s),l=Date.now();return(o!==c||l-a>e)&&(o=c,i=r?n.call(this,...s):n(...s),a=l),i}}}function Ie(n,r){let i=[],a=t.resolve(n);for(;;){let n=t.join(a,`node_modules`,`.bin`);if(e.existsSync(n)&&i.push(n),e.existsSync(t.join(a,`.git`)))break;let r=t.dirname(a);if(a===r)break;a=r}return i.length===0?!1:(r.PATH=r.PATH?`${i.join(`:`)}:${r.PATH}`:i.join(`:`),!0)}function Le(e){return!!e&&e!==`0`&&e!==`false`}let Re;function ze(e,t,n,r,i,a){var o,s,c,l,u,d,f,p=Symbol.metadata||Symbol.for(`Symbol.metadata`),m=Object.defineProperty,h=Object.create,g=[h(null),h(null)],_=t.length;function v(t,n,r){return function(i,a){n&&(a=i,i=e);for(var o=0;o<t.length;o++)a=t[o].apply(i,r?[a]:[]);return r?a:i}}function y(e,t,n,r){if(typeof e!=`function`&&(r||e!==void 0))throw TypeError(t+` must `+(n||`be`)+` a function`+(r?``:` or undefined`));return e}function b(e,t,n,r,i,a,c,l,u,d,f){function p(e){if(!f(e))throw TypeError(`Attempted to access private element on non-instance`)}var h=[].concat(t[0]),_=t[3],b=!c,x=i===1,S=i===3,C=i===4,w=i===2;function T(t,n,r){return function(i,a){return n&&(a=i,i=e),r&&r(i),E[t].call(i,a)}}if(!b){var E={},D=[],O=S?`get`:C||x?`set`:`value`;if(u?(d||x?E={get:He(function(){return _(this)},r,`get`),set:function(e){t[4](this,e)}}:E[O]=_,d||He(E[O],r,w?``:O)):d||(E=Object.getOwnPropertyDescriptor(e,r)),!d&&!u){if((s=g[+l][r])&&(s^i)!==7)throw Error(`Decorating two elements with the same name (`+E[O].name+`) is not supported yet`);g[+l][r]=i<3?1:i}}for(var k=e,A=h.length-1;A>=0;A-=n?2:1){var j=y(h[A],`A decorator`,`be`,!0),M=n?h[A-1]:void 0,N={},P={kind:[`field`,`accessor`,`method`,`getter`,`setter`,`class`][i],name:r,metadata:o,addInitializer:function(e,t){if(e.v)throw TypeError(`attempted to call addInitializer after decoration was finished`);y(t,`An initializer`,`be`,!0),a.push(t)}.bind(null,N)};if(b)s=j.call(M,k,P),N.v=1,y(s,`class decorators`,`return`)&&(k=s);else if(P.static=l,P.private=u,s=P.access={has:u?f.bind():function(e){return r in e}},C||(s.get=u?w?function(e){return p(e),E.value}:T(`get`,0,p):function(e){return e[r]}),w||S||(s.set=u?T(`set`,0,p):function(e,t){e[r]=t}),k=j.call(M,x?{get:E.get,set:E.set}:E[O],P),N.v=1,x){if(typeof k==`object`&&k)(s=y(k.get,`accessor.get`))&&(E.get=s),(s=y(k.set,`accessor.set`))&&(E.set=s),(s=y(k.init,`accessor.init`))&&D.unshift(s);else if(k!==void 0)throw TypeError(`accessor decorators must return an object with get, set, or init properties or undefined`)}else y(k,(d?`field`:`method`)+` decorators`,`return`)&&(d?D.unshift(k):E[O]=k)}return i<2&&c.push(v(D,l,1),v(a,l,0)),d||b||(u?x?c.splice(-1,0,T(`get`,l),T(`set`,l)):c.push(w?E[O]:y.call.bind(E[O])):m(e,r,E)),k}function x(e){return m(e,p,{configurable:!0,enumerable:!0,value:o})}return a!==void 0&&(o=a[p]),o=h(o??null),u=[],d=function(e){e&&u.push(v(e))},f=function(t,r){for(var a=0;a<n.length;a++){var o=n[a],s=o[1],d=7&s;if((8&s)==t&&!d==r){var f=o[2],p=!!o[3],m=16&s;b(t?e:e.prototype,o,m,p?`#`+f:Be(f),d,d<2?[]:t?l||=[]:c||=[],u,!!t,p,r,t&&p?function(t){return Ue(t)===e}:i)}}},f(8,0),f(0,0),f(8,1),f(0,1),d(c),d(l),s=u,_||x(e),{e:s,get c(){var n=[];return _&&[x(e=b(e,[t],r,e.name,5,n)),v(n,1)]}}}function Be(e){var t=Ve(e,`string`);return typeof t==`symbol`?t:t+``}function Ve(e,t){if(typeof e!=`object`||!e)return e;var n=e[Symbol.toPrimitive];if(n!==void 0){var r=n.call(e,t||`default`);if(typeof r!=`object`)return r;throw TypeError(`@@toPrimitive must return a primitive value.`)}return(t===`string`?String:Number)(e)}function He(e,t,n){typeof t==`symbol`&&(t=(t=t.description)?`[`+t+`]`:``);try{Object.defineProperty(e,"name",{configurable:!0,value:n?n+` `+t:t})}catch{}return e}function Ue(e){if(Object(e)!==e)throw TypeError(`right-hand side of 'in' should be an object, got `+(e===null?`null`:typeof e));return e}const We=`file:`;var Ge=class{static{[Re]=ze(this,[],[[B,3,`isBunAvailable`],[B,3,`usesBunPackageManager`],[B,3,`buildCommand`],[B,3,`rootDirPath`],[B,3,`dockerfile`],[B,3,`hasDockerfile`],[B,3,`hasSourceCode`],[B,3,`name`],[B,3,`dockerImageName`],[B,3,`requiresNextPublicWbEnv`],[B,3,`packageJson`],[B,3,`packageJsonPath`],[B,3,`hasPrisma`],[B,3,`hasDrizzle`],[B,3,`databaseOrm`],[B,3,`hasVitest`],[B,3,`hasOxlint`],[B,3,`hasTypeAwareOxlint`],[B,3,`hasOxfmt`],[B,3,`hasPrettier`],[B,3,`hasPoetryLock`],[B,3,`hasPubspecYaml`],[B,3,`hasCargoToml`],[B,3,`preferredLinter`],[B,3,`hasPlaywrightConfig`],[B,3,`skipLaunchingServerForPlaywright`],[B,3,`dockerPackageJson`],[B,3,`binExists`],[B,3,`rootPackageJson`]]).e}argv=void Re(this);loadEnv;pathByName=new Map;_dirPath;constructor(e,n,r){this._dirPath=t.resolve(e),this.argv=n,this.loadEnv=r}get isBunAvailable(){return this.usesBunPackageManager}get packageManagerCommand(){return this.isBunAvailable?`bun`:`yarn`}get packageManagerRunCommand(){return this.isBunAvailable?`bun run`:`yarn`}get usesBunPackageManager(){return this.hasBunToolVersion()||this.hasBunLockfile()?!0:this.hasBunPackageManager()}hasBunToolVersion(){return Xe(t.join(this.rootDirPath,`.tool-versions`),/(^|\n)bun\s/)?!0:[`mise.toml`,`.mise.toml`].some(e=>Xe(t.join(this.rootDirPath,e),/^\s*(?:"bun"|bun)\s*=/m))}hasBunLockfile(){return[`bun.lock`,`bun.lockb`].some(n=>e.existsSync(t.join(this.rootDirPath,n)))}hasBunPackageManager(){let e=this.rootPackageJson?.packageManager??this.packageJson.packageManager;return typeof e==`string`&&e.startsWith(`bun@`)}get buildCommand(){return this.packageJson.scripts?.build?.includes(`buildIfNeeded`)?`YARN run build`:this.packageJson.scripts?.build?`YARN wb buildIfNeeded ${this.argv.verbose?`--verbose`:``}`:`echo 'No build script'`}get dirPath(){return this._dirPath}get rootDirPath(){return e.existsSync(t.join(this.dirPath,`..`,`..`,`package.json`))?t.resolve(this.dirPath,`..`,`..`):this.dirPath}get dockerfile(){return e.readFileSync(this.findFile(`Dockerfile`),`utf8`)}get hasDockerfile(){try{return!!this.findFile(`Dockerfile`)}catch{return!1}}get hasSourceCode(){return e.existsSync(t.join(this.dirPath,`src`))}get name(){return this.packageJson.name||`unknown`}get dockerImageName(){return(this.packageJson.name||`unknown`).replaceAll(`@`,``).replaceAll(`/`,`-`)}envCache;get env(){if(this.envCache)return this.envCache;if(!this.loadEnv)return this.envCache=process.env,this.envCache;let[e,t]=D(this.argv,this.dirPath);if(!te(this.argv))for(let[e,n]of t)console.info(`Loaded ${n.length} environment variables from ${e}`);return this.envCache={...process.env,...e},this.validateRequiredEnvironmentVariables(t.some(([e])=>!e.startsWith(`mise env`))),this.envCache}validateRequiredEnvironmentVariables(e){let t=this.envCache;if(!t||!e||t.WB_SKIP_ENV_CHECK===`1`||t.WB_SKIP_ENV_CHECK===`true`)return;let n=[];if(t.WB_ENV||n.push(`WB_ENV`),this.requiresNextPublicWbEnv&&!t.NEXT_PUBLIC_WB_ENV&&n.push(`NEXT_PUBLIC_WB_ENV`),n.length===0)return;let r=this.argv.cascadeEnv??(this.argv.cascadeNodeEnv?t.NODE_ENV||`development`:t.WB_ENV??t.NODE_ENV??`development`);console.error(f.red(`${n.join(` and `)} ${n.length===1?`is`:`are`} not defined for the "${r}" environment. Define ${n.join(` and `)} in the mode's env source (e.g. .env.${r} or the fnox "${r}" profile; see guidelines-for-mise-fnox), or set WB_SKIP_ENV_CHECK=1 to skip this check.`)),process.exit(1)}get requiresNextPublicWbEnv(){return!!this.getOwnDependencyVersion(`next`)||!!this.getOwnDependencyVersion(`vinext`)}get packageJson(){return JSON.parse(e.readFileSync(this.packageJsonPath,`utf8`))}get packageJsonPath(){return t.join(this.dirPath,`package.json`)}get hasPrisma(){return!!this.getOwnDependencyVersion(`prisma`)}get hasDrizzle(){return!!this.getOwnDependencyVersion(`drizzle-orm`)}get databaseOrm(){if(this.hasPrisma)return`prisma`;if(this.hasDrizzle)return`drizzle`}get hasVitest(){return!!(this.packageJson.dependencies?.vitest??this.packageJson.devDependencies?.vitest)}get hasOxlint(){return this.hasDependency(`oxlint`)}get hasTypeAwareOxlint(){return this.hasOxlint&&this.hasDependency(`oxlint-tsgolint`)}get hasOxfmt(){return this.hasDependency(`oxfmt`)}get hasPrettier(){return this.hasDependency(`prettier`)}get hasPoetryLock(){return e.existsSync(t.join(this.dirPath,`poetry.lock`))||e.existsSync(t.join(this.rootDirPath,`poetry.lock`))}get hasPubspecYaml(){return e.existsSync(t.join(this.dirPath,`pubspec.yaml`))||e.existsSync(t.join(this.rootDirPath,`pubspec.yaml`))}get hasCargoToml(){return e.existsSync(t.join(this.dirPath,`Cargo.toml`))}get preferredLinter(){if(this.hasOxlint)return`oxlint`}hasOwnDependency(e){return!!this.getOwnDependencyVersion(e)}get hasPlaywrightConfig(){try{return!!this.findFile(`playwright.config.ts`)}catch{return!1}}get skipLaunchingServerForPlaywright(){if(Le(this.env.CI))return!1;try{let t=this.findFile(`playwright.config.ts`);return/\bwebServer\b/.test(e.readFileSync(t,`utf8`))}catch{return!1}}get dockerPackageJson(){return t.dirname(this.findFile(`Dockerfile`))===this.dirPath?this.packageJson:JSON.parse(e.readFileSync(t.join(t.dirname(this.findFile(`Dockerfile`)),`package.json`),`utf8`))}get binExists(){return Ie(this.dirPath,this.env)}findFile(n){let r=this.pathByName.get(n);if(r)return r;if(r=[n,t.join(`..`,`..`,n)].map(e=>t.resolve(this.dirPath,e)).find(t=>e.existsSync(t)),!r)throw Error(`File not found: ${n}`);return this.pathByName.set(n,r),r}hasDependency(e){return!!(this.getOwnDependencyVersion(e)??this.getDependencyVersion(this.rootPackageJson,e))}getOwnDependencyVersion(e){return this.getDependencyVersion(this.packageJson,e)}getDependencyVersion(e,t){if(e)return e.dependencies?.[t]??e.devDependencies?.[t]??e.optionalDependencies?.[t]??e.peerDependencies?.[t]}get rootPackageJson(){if(this.rootDirPath===this.dirPath)return this.packageJson;try{return JSON.parse(e.readFileSync(t.join(this.rootDirPath,`package.json`),`utf8`))}catch(e){console.error(`[wb] Failed to read or parse ${t.join(this.rootDirPath,`package.json`)}`,e);return}}};function Ke(e){let t=e.env.DATABASE_URL;if(!t?.startsWith(`file:`))return;let n=t.slice(5).replace(/[?#].*$/,``);return(n.startsWith(`//`)?n.slice(2):n)||void 0}function qe(e){let n=Ke(e);if(!n)return;if(t.isAbsolute(n))return n;let r=e.rootDirPath??e.dirPath;return r?t.resolve(r,n):void 0}function V(n,r=!0,i){if(i??=process.cwd(),e.existsSync(t.join(i,`package.json`)))return new Ge(i,n,r)}function Je(e,t){return e.env.WB_ENV===t||e.env.MISE_ENV===t}async function H(e,t=!0,n){let r=Ye(e,t,n);if(r)return{...r,descendants:r.root===r.self?await Ze(e,r.root,t):[r.self]}}function Ye(n,r=!0,i){if(i??=process.cwd(),!e.existsSync(t.join(i,`package.json`)))return;let a=new Ge(i,n,r),o=a;if(!a.packageJson.workspaces&&t.dirname(i).endsWith(`/packages`)){let a=t.resolve(i,`..`,`..`);e.existsSync(t.join(a,`package.json`))&&(o=new Ge(a,n,r))}return{root:o,self:a}}function Xe(t,n){try{return n.test(e.readFileSync(t,`utf8`))}catch{return!1}}async function Ze(n,r,i){let a=[r],o=r.packageJson.workspaces;if(!Array.isArray(o))return a;let s=[],c=[];for(let n of o.map(e=>t.join(r.dirPath,e)))e.existsSync(n)?c.push(n):s.push(n);c.push(...await p(s,{dot:!0,onlyDirectories:!0}));for(let r of c)e.existsSync(t.join(r,`package.json`))&&a.push(new Ge(r,n,i));return a}const Qe={command:`buildIfNeeded`,describe:`Build code if changes are detected`,builder:{command:{description:`A build command (default: yarn|bun build)`,type:`string`,alias:`c`},output:{description:`Build output paths (relative to the project directory) that must exist for the cache to be valid (default: auto-detected common output directories)`,type:`array`,alias:`o`}},async handler(e){await $e(e)}};async function $e(n,r){let i=V(n,!0,r);if(!i)return console.error(f.red(`No project found.`)),!0;let a=n.command??(i.packageJson.scripts?.build?`${i.packageManagerRunCommand} build`:void 0);if(!a)return console.info(f.green(`Skip to build because no build command is defined.`)),!1;if(n={...n,command:a},!e.existsSync(t.join(i.rootDirPath,`.git`))||!it(i))return at(i,n),!0;let[o,s,c]=await st(i,n);if(o)return console.info(f.green(`Skip to run '${n.command}' 💫`)),!1;if(at(i,n)){if(!n.dryRun){let t=tt(n)??nt(i);t.length===0&&console.info(f.yellow(`No build output directory detected; pass --output to enable missing-output cache invalidation.`)),await e.promises.writeFile(s,JSON.stringify({hash:c,outputPaths:t}),`utf8`)}return!0}}const et=[`dist`,`build`,`.next`,`out`];function tt(e){return e.output?.length?e.output.map(String):void 0}function nt(n){return et.filter(r=>e.existsSync(t.join(n.dirPath,r)))}function rt(e,t){return e.some(e=>t===e||t.startsWith(`${e}/`))}function it(e){return n.spawnSync(`git`,[`rev-parse`,`--verify`,`HEAD`],{cwd:e.dirPath,stdio:`ignore`}).status===0}function at(e,t){if(console.info(f.green(`Run '${t.command}'`)),!t.dryRun){let r=n.spawnSync(t.command??``,{cwd:e.dirPath,env:e.env,shell:!0,stdio:`inherit`});if(r.status!==0)return process.exitCode=r.status??1,!1}return!0}const ot=new Set([`CI`,`PWDEBUG`,`TMPDIR`]);async function st(r,i){let a=t.resolve(r.dirPath,`node_modules`,`.cache`,`build`),o=t.resolve(a,`last-build`);await e.promises.mkdir(a,{recursive:!0});let s=l(`sha256`),c=n.execSync(`git rev-parse HEAD`,{cwd:r.dirPath}).toString().trim();s.update(c),s.update(i.command??``);let u=JSON.stringify(Object.entries(r.env).filter(([e])=>!ot.has(e)).toSorted(([e],[t])=>e.localeCompare(t)));s.update(u),await ft(r,i,s);let d=s.digest(`hex`),p=ct(await ye(()=>e.promises.readFile(o,`utf8`)));if(p?.hash!==d)return[!1,o,d];let m=(tt(i)??p.outputPaths).filter(n=>!e.existsSync(t.resolve(r.dirPath,n)));return m.length>0?(console.info(f.yellow(`Rebuilding because build outputs are missing: ${m.join(`, `)}`)),[!1,o,d]):[!0,o,d]}function ct(e){if(e)try{let t=JSON.parse(e);if(typeof t?.hash!=`string`)return;let n=Array.isArray(t.outputPaths)?t.outputPaths.filter(e=>typeof e==`string`):[];return{hash:t.hash,outputPaths:n}}catch{return}}const lt=new Set([`src`,`public`]),ut=[`.js`,`.cjs`,`.mjs`,`.jsx`,`.ts`,`.cts`,`.mts`,`.tsx`,`.json`,`.browserslistrc`,`package.json`,`yarn.lock`,`bun.lock`,`bun.lockb`],dt=new Set([`test`,`tests`,`__tests__`,`test-fixtures`]);async function ft(r,i,a){return new Promise(o=>{let s=n.spawnSync(`git`,[`status`,`--porcelain`,`-uall`,`-z`],{cwd:r.dirPath,env:r.env,stdio:`pipe`,encoding:`utf8`}).stdout.split(`\0`).filter(e=>e.length>0),c=[];for(let e=0;e<s.length;e++){let t=s[e],n=t.slice(0,2);if(c.push({untracked:n===`??`,filePath:t.slice(3)}),n.includes(`R`)||n.includes(`C`)){let t=s[++e];t&&c.push({untracked:!1,filePath:t})}}let l=c.map(e=>({...e,hashPath:r.env.WB_ENV===`test`?e.filePath.replace(/packages\/wb\/test\/fixtures\/[^/]+\//,``):e.filePath})),u=t.relative(r.rootDirPath,r.dirPath),d=(tt(i)??[]).map(e=>t.join(u,e)),f=l.filter(({filePath:e,hashPath:t})=>{let n=t.split(`/`).slice(0,-1);return(n.some(e=>lt.has(e))||ut.some(e=>t.endsWith(e)))&&!n.some(e=>dt.has(e))&&!rt(d,e)});i.verbose&&console.info(`Changed files: ${f.map(e=>e.hashPath).join(`, `)}`);for(let n of f.filter(e=>e.untracked))try{a.update(n.hashPath),a.update(e.readFileSync(t.join(r.rootDirPath,n.filePath)))}catch{}let p=f.filter(e=>!e.untracked).map(e=>e.hashPath);if(p.length===0){o();return}let m=n.spawn(`git`,[`diff`,`HEAD`,`--`,...p],{cwd:r.rootDirPath});m.stdout.on(`data`,e=>{a.update(e),i.verbose&&(console.info(`Data:`,e),console.info(`Hash:`,a.copy().digest(`hex`)))}),m.on(`close`,()=>{o()})})}const pt=new g,mt={exitIfFailed:!0};async function U(e,t,n,r=mt){let i=gt(e,t);if(n.silent&&r.omitSilentStart&&!n.dryRun||G(i.printable,t,n.silent?`Command`:`Start`),n.verbose&&G(i.runnable,t,`Start (raw)`,!0),n.dryRun)return _t(i.printable,0,r,{silentSuccess:n.silent}),0;let a=!!(n.silent&&(r.processSilentOutput??r.printSilentOutputOnFailureOnly)),o=!1,s=n.silent&&r.silentProgressIntervalMs?setInterval(()=>{process.stdout.write(`.`),o=!0},r.silentProgressIntervalMs):void 0,c=await L(i.runnable,void 0,{cwd:t.dirPath,env:vt(t.env,{...r,preserveColor:r.preserveColor??(n.silent?!0:void 0)}),shell:!0,stdio:n.silent?`pipe`:`inherit`,timeout:r.timeout,mergeOutAndError:a,killOnExit:!0,printingStdout:n.silent&&!a,printingStderr:n.silent&&!a,omitBlankLinesWhilePrinting:n.silent,verbose:n.verbose}).finally(()=>{s&&clearInterval(s)}),l=c.status??1;if(o&&process.stdout.write(`
|
|
13
12
|
`),a&&(!r.printSilentOutputOnFailureOnly||l!==0)){let e=(r.processSilentOutput?r.processSilentOutput(c.stdout):c.stdout).trim();e&&(process.stdout.write(e),process.stdout.write(`
|
|
14
|
-
`))}return n.silent&&l===0&&r.silentSuccessMessage&&console.info(f.green(r.silentSuccessMessage)),r.onSignal?.(c.signal),
|
|
15
|
-
`)),
|
|
16
|
-
`,``).replaceAll(/\s\s+/g,` `).replaceAll(/PRISMA generate(?!\s+--no-hints)(?=\s|$)/gu,t.packageJson.dependencies?.blitz?`PRISMA generate`:`PRISMA generate --no-hints`).replaceAll(`PRISMA `,t.packageJson.dependencies?.blitz?`YARN blitz prisma `:`YARN prisma `).replaceAll(`BUN run `,t.usesBunPackageManager?`${n} `:`YARN run `).replaceAll(`BUN `,t.usesBunPackageManager?`${n} `:`YARN `).replaceAll(`YARN run `,t.usesBunPackageManager?`${n} `:`yarn run `);t.usesBunPackageManager&&(r=r.replaceAll(`YARN build-ts run`,`bun run`).replaceAll(`bun run bun run`,`bun run`).replaceAll(`dist/index.js`,`src/index.ts`)),r=r.trim();let i=r.replaceAll(`YARN `,`${n} `),a=r.replaceAll(`YARN playwright `,`${n} playwright `).replaceAll(`YARN `,!t.usesBunPackageManager&&t.binExists?``:`${n} `);return{printable:`${n} dotenv -- ${i}`,runnable:a}}function
|
|
17
|
-
`+(r?f.gray:f.cyan)(f.bold(`${n}:`),e)+f.gray(` at ${t.dirPath}`))}function
|
|
18
|
-
`)){if(/^\s*(?:#|\/\/)/u.test(t))continue;let e=/(?:^|[,{])\s*["']?database_name["']?\s*[:=]\s*["']([^"']+)["']/u.exec(t);if(e)return e[1]}}function
|
|
19
|
-
`)){if(/^\s*(?:#|\/\/)/u.test(t))continue;let e=/(?:^|[,{])\s*["']?migrations_dir["']?\s*[:=]\s*["']([^"']+)["']/u.exec(t);if(e){i=e[1];break}}let a=t.join(n.dirPath,i);return e.existsSync(a)?a:void 0}function
|
|
20
|
-
&& litestream restore ${r} -o "${t}" "${t}" && ls -ahl "${t}" && ${i}`}listBackups(e,t){let n=
|
|
13
|
+
`))}return n.silent&&l===0&&r.silentSuccessMessage&&console.info(f.green(r.silentSuccessMessage)),r.onSignal?.(c.signal),_t(i.printable,l,r,{silentSuccess:n.silent}),l}function W(e,t,n,r=mt){return pt.runAndWaitForReturnValue(async()=>{let i=gt(e,t);if(G(i.printable,t,`Start (parallel)`,!0),n.dryRun)return G(i.printable,t,`Started (log)`),n.verbose&&G(i.runnable,t,`Started (raw)`,!0),_t(i.printable,0,r),0;let a=await L(i.runnable,void 0,{cwd:t.dirPath,env:vt(t.env,{...r,preserveColor:r.preserveColor??!0}),shell:!0,stdio:`pipe`,timeout:r.timeout,mergeOutAndError:!0,killOnExit:!0,printingStdout:r.printRawOutput,printingStderr:r.printRawOutput,verbose:n.verbose});r.onSignal?.(a.signal),G(i.printable,t,`Started (log)`),n.verbose&&G(i.runnable,t,`Started (raw)`,!0);let o=a.stdout.trim();return o&&!r.printRawOutput&&(process.stdout.write(o),process.stdout.write(`
|
|
14
|
+
`)),_t(i.printable,a.status,r),a.status??1})}function ht(e,t,n,r=mt){return pt.runAndWaitForReturnValue(async()=>{let i=gt(e,t);if(n.dryRun)return{exitCode:0,output:``};let a=await L(i.runnable,void 0,{cwd:t.dirPath,env:vt(t.env,{...r,preserveColor:r.preserveColor??!0}),shell:!0,stdio:`pipe`,timeout:r.timeout,mergeOutAndError:!0,killOnExit:!0,printingStdout:r.printRawOutput,printingStderr:r.printRawOutput,verbose:n.verbose});return r.onSignal?.(a.signal),{exitCode:a.status??1,output:a.stdout}})}function gt(e,t){let n=t.usesBunPackageManager?`bun run`:`yarn`,r=e.replaceAll(`
|
|
15
|
+
`,``).replaceAll(/\s\s+/g,` `).replaceAll(/PRISMA generate(?!\s+--no-hints)(?=\s|$)/gu,t.packageJson.dependencies?.blitz?`PRISMA generate`:`PRISMA generate --no-hints`).replaceAll(`PRISMA `,t.packageJson.dependencies?.blitz?`YARN blitz prisma `:`YARN prisma `).replaceAll(`BUN run `,t.usesBunPackageManager?`${n} `:`YARN run `).replaceAll(`BUN `,t.usesBunPackageManager?`${n} `:`YARN `).replaceAll(`YARN run `,t.usesBunPackageManager?`${n} `:`yarn run `);t.usesBunPackageManager&&(r=r.replaceAll(`YARN build-ts run`,`bun run`).replaceAll(`bun run bun run`,`bun run`).replaceAll(`dist/index.js`,`src/index.ts`)),r=r.trim();let i=r.replaceAll(`YARN `,`${n} `),a=r.replaceAll(`YARN playwright `,`${n} playwright `).replaceAll(`YARN `,!t.usesBunPackageManager&&t.binExists?``:`${n} `);return{printable:`${n} dotenv -- ${i}`,runnable:a}}function G(e,t,n=`Start`,r=!1){console.info(`
|
|
16
|
+
`+(r?f.gray:f.cyan)(f.bold(`${n}:`),e)+f.gray(` at ${t.dirPath}`))}function _t(e,t,n,r={}){if(t===0){if(r.silentSuccess)return;console.info(f.green(f.bold(`Finished:`),e))}else console.info(f.red(f.bold(`Failed (exit code ${t}): `),e)),n.exitIfFailed!==!1&&process.exit(t??1)}function vt(e,t){let n={...e};return t.ci&&(n.CI=`1`),yt(n,t.preserveColor),n}function yt(e,t){e.NO_COLOR!==void 0||t===!1?delete e.FORCE_COLOR:t&&process.stdout.isTTY&&(e.FORCE_COLOR||=`3`)}const bt={...E,"working-dir":{description:`A working directory`,type:`string`,alias:`w`},"dry-run":{description:`Whether to skip actual command execution`,type:`boolean`,alias:[`dry`,`d`]}};function xt(e){let t=[];for(let n of Object.keys(E)){let r=St(e,n);if(r!==void 0){if(typeof r==`boolean`){t.push(r?`--${n}`:`--${n}=false`);continue}if(typeof r==`string`||typeof r==`number`){t.push(`--${n}=${r}`);continue}if(Array.isArray(r))for(let e of r)t.push(`--${n}=${e}`)}}return e.silent===!0&&St(e,`quiet-env`)===void 0&&t.push(`--quiet-env`),t}function St(e,t){let n=t.replaceAll(/-([a-z])/g,(e,t)=>t.toUpperCase()),r=e;return r[t]??r[n]}const Ct={"kill-others":{description:`Kill other commands when one command exits`,type:`boolean`},"kill-others-on-fail":{description:`Kill other commands when one command fails`,type:`boolean`},success:{description:`Define successful completion criteria`,type:`string`,choices:[`all`,`first`],default:`all`}},wt={commands:{description:`Commands to run concurrently`,type:`array`}},Tt={command:`concurrently <commands...>`,describe:`Run commands concurrently`,builder:{...bt,...Ct,...wt},async handler(e){process.platform===`win32`&&(console.error(f.red(`This command is not supported on Windows.`)),process.exit(1));let t=V(e);t||(console.error(f.red(`No project found.`)),process.exit(1));let n=(e.commands??[]).map(String).filter(Boolean);n.length===0&&(console.error(f.red(`No commands provided.`)),process.exit(1));try{let r=await Et({commands:n,project:t,killOthers:e.killOthers??!1,killOthersOnFail:e.killOthersOnFail??!1,success:e.success,ci:typeof e.ci==`boolean`?e.ci:void 0});process.exit(r)}catch(e){console.error(f.red(e instanceof Error?e.message:String(e))),process.exit(1)}}};async function Et(e){let t=e.commands.map(t=>n.spawn(gt(t,e.project).runnable,{cwd:e.project.dirPath,detached:!0,env:vt(e.project.env,{ci:e.ci}),shell:!0,stdio:`inherit`})),r=!1,i,a,o,s=[],c=Array.from({length:t.length}),l=t.map((n,i)=>new Promise(l=>{let u=!1,d=n=>{u||(u=!0,c[i]=n,a??=n,!r&&Ot(n,e)&&(o=n,r=!0,s.push(kt(t,`SIGTERM`))),l())};n.once(`error`,e=>{console.error(`Failed to start child process:`,e),d(1)}),n.once(`exit`,(e,t)=>{d(Dt(e??void 0,t??void 0))})})),u=e=>{i??=e,!r&&(r=!0,s.push(kt(t,e)))},d=()=>{u(`SIGINT`)},f=()=>{u(`SIGTERM`)},p=()=>{u(`SIGQUIT`)};process.on(`SIGINT`,d),process.on(`SIGTERM`,f),process.on(`SIGQUIT`,p);try{await Promise.all(l),await Promise.all(s)}finally{process.removeListener(`SIGINT`,d),process.removeListener(`SIGTERM`,f),process.removeListener(`SIGQUIT`,p)}if(i)return Dt(void 0,i);if(e.success===`first`)return a??1;if(o!==void 0)return o;for(let e of c)if(e!==void 0&&e!==0)return e;return 0}function Dt(e,t){return e===void 0?t&&t in h.signals?128+h.signals[t]:1:e}function Ot(e,t){return t.success===`first`||t.killOthers||t.killOthersOnFail&&e!==0}async function kt(e,t){let n=jt(At(e),t);n.length!==0&&await Mt(n)&&jt(n,`SIGKILL`)}function At(e){return e.flatMap(e=>e.pid===void 0?[]:[e.pid])}function jt(e,t){let n=[];for(let r of e)try{if(!Ft(r,t))continue;n.push(r),I(r,t)}catch(e){console.warn(`Failed to kill child process:`,e)}return n}async function Mt(e){let t=Date.now()+5e3;for(;Date.now()<t;){if(e.every(Nt))return!1;await Pt(Math.min(100,t-Date.now()))}return!0}function Nt(e){try{return process.kill(-e,0),!1}catch(e){return!!It(e)}}async function Pt(e){await new Promise(t=>setTimeout(t,e))}function Ft(e,t){try{return process.kill(-e,t),!0}catch(e){if(It(e))return!1;throw e}}function It(e){return typeof e==`object`&&!!e&&`code`in e&&e.code===`ESRCH`}function K(e){return e.map(e=>q(e)).join(` `)}function Lt(e,t){return`${e}=${q(t)}`}function q(e){return/^[\w./:=,@%+-]+$/u.test(e)?e:`'${e.replaceAll(`'`,`'"'"'`)}'`}const Rt=[`wrangler.jsonc`,`wrangler.json`,`wrangler.toml`];function zt(e,t){return K([`YARN`,`wb`,`gen-dev-vars`,...xt(e),t])}function Bt(e){return`env -u CLOUDFLARE_ENV YARN wrangler ${e}`.trim()}function Vt(e){let t=Ut(e);if(!(!t||!Wt(e)))return`CI=true YARN wrangler d1 migrations apply ${t} --local --persist-to "${Kt(e)}"`}function Ht(e,n){let r=Ut(e);if(!r)return n;let i=`export DATABASE_URL="file:$(ls "${t.resolve(e.dirPath,Kt(e))}"/v3/d1/miniflare-D1DatabaseObject/*.sqlite | grep -v metadata | head -1)"`;return`${Gt(e,r)} && ${i} && ${n}`}function Ut(t){let n=J(t);if(n)for(let t of e.readFileSync(n,`utf8`).split(`
|
|
17
|
+
`)){if(/^\s*(?:#|\/\/)/u.test(t))continue;let e=/(?:^|[,{])\s*["']?database_name["']?\s*[:=]\s*["']([^"']+)["']/u.exec(t);if(e)return e[1]}}function J(n){if(n.dirPath)for(let r of Rt){let i=t.join(n.dirPath,r);if(e.existsSync(i))return i}}function Wt(n){let r=J(n);if(!r)return;let i=`migrations`;for(let t of e.readFileSync(r,`utf8`).split(`
|
|
18
|
+
`)){if(/^\s*(?:#|\/\/)/u.test(t))continue;let e=/(?:^|[,{])\s*["']?migrations_dir["']?\s*[:=]\s*["']([^"']+)["']/u.exec(t);if(e){i=e[1];break}}let a=t.join(n.dirPath,i);return e.existsSync(a)?a:void 0}function Gt(e,t){return`YARN wrangler d1 execute ${t} --local --persist-to "${Kt(e)}" --command "SELECT 1" > /dev/null`}function Kt(e){let t=[e.env.WB_ENV,e.env.MISE_ENV].includes(`test`)?`test`:e.env.WB_ENV||e.env.MISE_ENV;return!t||t===`development`?`.wrangler/state`:`.wrangler/state-${t}`}const qt=`litestream.yml`,Jt=`/etc/litestream.yml`;var Yt=class{cleanUpLitestream(e){let n=fn(e,`cleanup-litestream`);return`${`if [ -f "${n}" ] && command -v sqlite3 >/dev/null; then printf 'PRAGMA wal_checkpoint(TRUNCATE);' | sqlite3 "${n}"; fi`}; rm -f "${n}".* "${n}"-*; rm -Rf "${t.dirname(n)}/.${t.basename(n)}"* || true`}reset(e,t=``){let n=Ut(e);if(n)return`rm -Rf "${Kt(e)}/v3/d1" && ${Gt(e,n)} && ${this.migrate(e,t)}`;let r=cn(e);return r?`${r} && ${this.migrate(e,t)}`:`echo 'wb db reset supports Drizzle only when file: DATABASE_URL is set.' && exit 1`}migrate(e,t=``){let n=this.seed(e),r=this.deploy(e,t);return n===`true`?r:`${r} && ${n}`}migrateForStart(e,t=``){return Je(e,`test`)&&(cn(e)||Ut(e))?this.reset(e,t):this.migrate(e,t)}deploy(e,t=``){return Xt(e,`migrate ${t}`.trim())}deployForce(e){let t=fn(e,`deploy-force`),n=un(t),r=mn(e),i=Xt(e,`migrate`,`ALLOW_TO_SKIP_SEED=0`);return`${n}; ${this.deploy(e)} && ${n}
|
|
19
|
+
&& litestream restore ${r} -o "${t}" "${t}" && ls -ahl "${t}" && ${i}`}listBackups(e,t){let n=fn(e,`list-backups`);return`litestream ltx ${mn(e,t)} "${n}"`}restore(e,t,n){let r=fn(e,`restore`);return`${ln(t)}; litestream restore ${mn(e,n)} -o "${t}" "${r}"`}generate(e,t=``){return Xt(e,`generate ${t}`.trim())}migrateDev(e,t=``){return this.generate(e,t)}seed(n,r){if(r)return`BUN build-ts run ${r}`;if(n.packageJson.scripts?.seed)return`YARN run seed`;let i=t.join(`db`,`seed.ts`);return e.existsSync(t.join(n.dirPath,i))?n.usesBunPackageManager?`BUN ${i}`:`BUN build-ts run ${i}`:`true`}studio(e,t,n=``){return t?`echo 'wb db studio for Drizzle does not support db-url-or-path.' && exit 1`:Xt(e,`studio ${n}`.trim())}};function Xt(e,t,n=``){let r=`${n&&`${n} `}YARN drizzle-kit ${t}`;return t.includes(`--config`)?r:Zt(e,r)}function Zt(e,t){let n=sn(e);return n&&n.dirPath!==e.dirPath?`(${K([`cd`,n.dirPath])} && ${t})`:t}function Qt(n){if(!n.hasDrizzle)return!1;let r=sn(n);if(!r)return!1;try{let n=on(e.readFileSync(t.join(r.dirPath,r.fileName),`utf8`)),i=tn(n),a=[`export default`,`module.exports`].map(e=>i.indexOf(e)).filter(e=>e!==-1),o=$t(n,i,a.length>0?Math.min(...a):0);return o!==void 0&&nn(o)}catch{return!1}}function $t(e,t,n){let r=t.slice(n).replace(/^(?:export\s+default|module\.exports\s*=)\s*/,``),i=/^([A-Za-z_$][\w$]*)\s*(?:satisfies\b|as\b|;|\n|$)/.exec(r);if(!i){let r=t.slice(n).indexOf(`{`);return r===-1?void 0:an(e.slice(n+r))}let a=en(t,i[1].replaceAll(`$`,String.raw`\$`));if(a===void 0)return;let o=/^\s*(?::[^=;\n]*)?=/.exec(t.slice(a));if(o)return an(e.slice(a+o[0].length))}function en(e,t){let n=new RegExp(String.raw`(?<![\w$])(?:export\s+)?(?:const|let|var)\s+${t}(?![\w$])`,`g`),r=0,i=0;for(let t=n.exec(e);t;t=n.exec(e)){for(;i<t.index;i++){let t=e[i];t===`{`?r++:t===`}`&&r--}if(r===0)return t.index+t[0].length}}function tn(e){let t=``,n;for(let r=0;r<e.length;r++){let i=e[r];if(n){if(i===`\\`){t+=` `,r++;continue}if(i===n||n!=="`"&&i===`
|
|
20
|
+
`){n=void 0,t+=i;continue}t+=i===`
|
|
21
|
+
`?`
|
|
22
|
+
`:` `;continue}(i===`'`||i===`"`||i==="`")&&(n=i),t+=i}return t}function nn(e){let t=rn(e);for(let e=0;e<t.length;e++){let n=t[e],r,i;if(n.type===`code`){let t=/(?:^|[\s{,(])(dialect|driver)\s*:\s*$/.exec(n.value);t&&(r=t[1],i=e+1)}else if(n.value===`dialect`||n.value===`driver`){let a=t[e-1],o=t[e+1];a?.type===`code`&&/[{,(]\s*$/.test(a.value)&&o?.type===`code`&&/^\s*:\s*$/.test(o.value)&&(r=n.value,i=e+2)}if(r===void 0||i===void 0)continue;let a=t[i];if(a?.type===`string`&&(r===`dialect`&&a.value===`sqlite`||r===`driver`&&(a.value===`d1-http`||a.value===`durable-sqlite`)))return!0}return!1}function rn(e){let t=[],n=``;for(let r=0;r<e.length;r++){let i=e[r];if(i===`'`||i===`"`||i==="`"){t.push({type:`code`,value:n}),n=``;let a=``;for(r++;r<e.length&&e[r]!==i;)e[r]===`\\`&&r++,a+=e[r]??``,r++;t.push({type:`string`,value:a});continue}n+=i}return t.push({type:`code`,value:n}),t}function an(e){let t=e.indexOf(`{`);if(t===-1)return;let n=0,r;for(let i=t;i<e.length;i++){let a=e[i];if(r){a===`\\`?i++:(a===r||r!=="`"&&a===`
|
|
23
|
+
`)&&(r=void 0);continue}if(a===`'`||a===`"`||a==="`")r=a;else if(a===`{`)n++;else if(a===`}`&&--n===0)return e.slice(t,i+1)}}function on(e){let t=``,n;for(let r=0;r<e.length;r++){let i=e[r],a=e[r+1];if(n){if(i===`\\`){t+=i+(a??``),r++;continue}(i===n||n!=="`"&&i===`
|
|
24
|
+
`)&&(n=void 0),t+=i;continue}if(i===`'`||i===`"`||i==="`"){n=i,t+=i;continue}if(i===`/`&&a===`/`){for(;r<e.length&&e[r]!==`
|
|
25
|
+
`;)r++;t+=`
|
|
26
|
+
`;continue}if(i===`/`&&a===`*`){for(r+=2;r<e.length&&!(e[r]===`*`&&e[r+1]===`/`);)r++;r++;continue}t+=i}return t}function sn(n){let r=[`drizzle.config.ts`,`drizzle.config.mts`,`drizzle.config.js`,`drizzle.config.mjs`];for(let i of[n.dirPath,n.rootDirPath]){let n=r.find(n=>e.existsSync(t.join(i,n)));if(n)return{dirPath:i,fileName:n}}}function cn(e){let n=pn(e);if(n)return ln(t.isAbsolute(n)?n:t.resolve(e.dirPath,n))}function ln(e){return`rm -f "${e}" "${e}-wal" "${e}-shm"`}function un(e){return`rm -Rf "${e}"*`}function dn(e,t){let n=pn(e);if(!n)throw Error(`wb db ${t} supports Drizzle only when file: DATABASE_URL is set.`);return n}function fn(e,n){let r=dn(e,n);return t.isAbsolute(r)?r:t.resolve(e.dirPath,r)}function pn(e){return qe(e)}function mn(n,r){if(r)return`-config "${r}"`;let i=t.join(n.dirPath,qt);return e.existsSync(i)?`-config ./${qt}`:e.existsSync(Jt)?`-config ${Jt}`:`-config ./${qt}`}const hn=new Yt;function gn(n,r){if(r.migrations_pattern)return!0;let i=t.resolve(n.dirPath,r.migrations_dir??`migrations`);return e.existsSync(i)?e.readdirSync(i).some(e=>e.endsWith(`.sql`)):!1}const _n=new Set([`bindings`,`send_email`,`ratelimits`]),vn=new Set([`wasm_modules`,`text_blobs`,`data_blobs`]);function yn(e,t=new Set,n=``){if(Array.isArray(e)){for(let r of e)yn(r,t,n);return t}if(!e||typeof e!=`object`)return t;for(let[r,i]of Object.entries(e))if(r===`binding`&&typeof i==`string`)t.add(i);else if(r===`name`&&typeof i==`string`&&_n.has(n))t.add(i);else if(vn.has(r)&&i&&typeof i==`object`&&!Array.isArray(i))for(let e of Object.keys(i))t.add(e);else r!==`env`&&r!==`vars`&&r!==`metadata`&&r!==`options`&&yn(i,t,r);return t}function bn(e,t){return t?.site??e.site?[`__STATIC_CONTENT`]:[]}function xn(n,r){let i=J(n);if(!i)return;if(t.extname(i)===`.toml`)throw Error(`wb deploy supports wrangler.jsonc/wrangler.json configs only; migrate wrangler.toml first.`);let a=[],o=_(e.readFileSync(i,`utf8`),a,{allowTrailingComma:!0});if(a.length>0)throw Error(`Failed to parse ${i}: ${a.length} JSONC syntax error(s).`);if(!o)return;let s=o.env?.[r];if(!s&&r!==`production`)throw Error(`The wrangler config has no "env": { "${r}": ... } section.`);return s?{workerName:s.name??(o.name?`${o.name}-${r}`:void 0),accountId:s.account_id??o.account_id,varKeys:Object.keys(s.vars??{}),vars:s.vars??{},bindingNames:[...yn({assets:s.assets??o.assets,logfwdr:s.logfwdr??o.logfwdr,wasm_modules:s.wasm_modules??o.wasm_modules,text_blobs:s.text_blobs??o.text_blobs,data_blobs:s.data_blobs??o.data_blobs},yn(s)),...bn(o,s)],d1Databases:s.d1_databases??[],requiredSecretNames:s.secrets?.required??[],usesEnvSection:!0}:{workerName:o.name,accountId:o.account_id,varKeys:Object.keys(o.vars??{}),vars:o.vars??{},bindingNames:[...yn(o),...bn(o)],d1Databases:o.d1_databases??[],requiredSecretNames:o.secrets?.required??[],usesEnvSection:!1}}const Sn={command:`gen-dev-vars [path]`,describe:"Generate a .dev.vars file for `wrangler dev` from the environment variables loaded from .env files (plus WB_ENV and NEXT_PUBLIC_WB_ENV).",builder:e=>e.positional(`path`,{description:`Output path of the generated .dev.vars file.`,type:`string`,default:`.dev.vars`}),async handler(n){let r=V(n);r||(console.error(f.red(`No project found.`)),process.exit(1));let[i]=D(n,r.dirPath,{ignoreProcessEnv:!0}),a=new Set;for(let e of Object.keys(i)){let t=r.env[e];t!==void 0&&(t===``&&i[e]!==``&&a.add(e),i[e]=t)}for(let e of[...Cn(r),`WB_ENV`,`NEXT_PUBLIC_WB_ENV`]){let t=r.env[e];i[e]||t===void 0||(i[e]===void 0&&t===``&&a.add(e),i[e]=t)}let o=Object.entries(i).filter(([e,t])=>t!==``||a.has(e)).toSorted(([e],[t])=>e.localeCompare(t)).map(([e,t])=>`${e}=${wn(e,t)}`),s=t.resolve(r.dirPath,n.path??`.dev.vars`);if(n.dryRun){console.info(f.cyan(`Would generate ${s} with ${o.length} environment variables.`));return}e.mkdirSync(t.dirname(s),{recursive:!0}),e.writeFileSync(s,o.join(`
|
|
21
27
|
`)+`
|
|
22
|
-
`),console.info(f.green(`Generated ${s} with ${o.length} environment variables.`))}};function
|
|
23
|
-
`,String.raw`\n`).replaceAll(`\r`,String.raw`\r`),r=[`'${t}'`,`\`${t}\``,`"${n}"`];for(let n of r)if(s(`${e}=${n}`)[e]===t)return n;throw Error(`The value of ${e} cannot be losslessly serialized into .dev.vars; simplify its quoting.`)}const un=new Set(`CI.CF_ACCOUNT_ID.CF_API_BASE_URL.CF_API_EMAIL.CF_API_KEY.CF_API_TOKEN.CF_EMAIL.CLOUDFLARE_ACCESS_CLIENT_ID.CLOUDFLARE_ACCESS_CLIENT_SECRET.CLOUDFLARE_ACCOUNT_ID.CLOUDFLARE_API_BASE_URL.CLOUDFLARE_API_KEY.CLOUDFLARE_API_TOKEN.CLOUDFLARE_AUTH_USE_KEYRING.CLOUDFLARE_D1_DATABASE_ID.CLOUDFLARE_EMAIL.CLOUDFLARE_ENV.CLOUDFLARE_INCLUDE_PROCESS_ENV.CLOUDFLARE_LOAD_DEV_VARS_FROM_DOT_ENV.DOCKER_HOST.HTTP_PROXY.HTTPS_PROXY.http_proxy.https_proxy.FORCE_COLOR.MINIFLARE_CACHE_DIR.MISE_ENV.NO_COLOR.NEXT_PUBLIC_WB_ENV.NEXT_PUBLIC_WB_VERSION.NODE_ENV.PORT.WB_ENV.WB_VERSION`.split(`.`)),dn=[`WRANGLER_`,`CLOUDFLARE_HYPERDRIVE_LOCAL_CONNECTION_STRING_`,`CLOUDFLARE_CF_FETCH_`];function fn(e){return un.has(e)||dn.some(t=>e.startsWith(t))}const pn={command:`deploy`,describe:`Deploy a Cloudflare Workers app (vinext or plain Worker) to the WB_ENV environment: validate secrets, build, apply remote D1 migrations, then deploy code and secrets atomically.`,builder:e=>e,async handler(n){delete process.env.CLOUDFLARE_ENV;let r=B(n);r||(console.error(f.red(`No project found.`)),process.exit(1));let a=q(r);a||(console.error(f.red(`wb deploy currently supports only Cloudflare Workers apps (no wrangler config found).`)),process.exit(1));let o=r.env.WB_ENV;(!o||o===`development`||o===`test`)&&(console.error(f.red(`WB_ENV must name a deploy environment (e.g. staging or production), but is ${o}.`)),process.exit(1));let s=mn(r.dirPath,n.includeRootEnv?r.rootDirPath:void 0);for(let[e,t]of Object.entries(s))process.env[e]??=t,r.env[e]??=t;let c;try{c=on(r,o)}catch(e){console.error(f.red(String(e instanceof Error?e.message:e))),process.exit(1)}c||(console.error(f.red(`Failed to parse ${a}.`)),process.exit(1));let l=c.accountId??r.env.CLOUDFLARE_ACCOUNT_ID,u=c.d1Databases.filter(e=>en(r,e));r.hasDrizzle&&u.length>0&&u.length<c.d1Databases.length&&(console.error(f.red(`wb deploy does not support mixing wrangler-native and non-native D1 migration layouts.`)),process.exit(1));let d=u.length===0&&r.hasDrizzle?c.d1Databases[0]:void 0;if(u.length===0&&r.hasDrizzle&&c.d1Databases.length>1&&(console.error(f.red(`wb deploy supports drizzle-kit migrations only for a single D1 binding; found multiple.`)),process.exit(1)),!n.dryRun){d&&!r.env.CLOUDFLARE_API_TOKEN&&(console.error(f.red(`CLOUDFLARE_API_TOKEN is required for remote drizzle-kit migrations.`)),process.exit(1));let e=!!r.env.CLOUDFLARE_API_TOKEN||!!r.env.CF_API_TOKEN||!!(r.env.CLOUDFLARE_API_KEY&&r.env.CLOUDFLARE_EMAIL)||!!(r.env.CF_API_KEY&&r.env.CF_EMAIL);Ie(r.env.CI)&&!e&&(console.error(f.red(`Wrangler authentication (e.g. CLOUDFLARE_API_TOKEN) is required to deploy on CI.`)),process.exit(1))}!Ie(r.env.CI)&&r.packageJson.scripts?.[`deploy/ci-setup`]&&await H(`YARN run deploy/ci-setup`,r,n);let[p,h]=D(n,r.dirPath,{ignoreProcessEnv:!0}),g=new Set(h.filter(([e])=>!e.startsWith(`mise env`)).flatMap(([,e])=>e));for(let e of Object.keys(p))g.has(e)||delete p[e];let _=cn(r);for(let e of _)p[e]??=r.env[e]??``;for(let e of c.requiredSecretNames){let t=r.env[e];p[e]===void 0&&t!==void 0&&(p[e]=t)}for(let e of Object.keys(p)){let t=r.env[e];t!==void 0&&(p[e]=t)}let{missingKeys:v,secrets:y}=hn(p,[...c.varKeys,...c.bindingNames],_);r.env.WB_VERSION&&c.bindingNames.includes(`WB_VERSION`)&&(console.error(f.red(`WB_VERSION collides with a Worker binding name; rename the binding.`)),process.exit(1));let b=Object.keys(p).filter(e=>c.bindingNames.includes(e));b.length>0&&console.warn(f.yellow(`Skipping env keys that collide with Worker binding names: ${b.join(`, `)}`)),v.length>0&&(console.error(f.red(`Missing required environment variables (from .env.example or wrangler secrets.required): ${v.join(`, `)}`)),process.exit(1));let x=c.requiredSecretNames.filter(e=>!Object.hasOwn(y,e)&&!c.varKeys.includes(e)&&!c.bindingNames.includes(e));x.length>0&&(console.error(f.red(`Secrets required by the wrangler config are not provided: ${x.join(`, `)}`)),process.exit(1));let S=Object.keys(y).toSorted();S.length>100&&(console.error(f.red(`Cloudflare accepts at most 100 secrets per deploy, but ${S.length} were selected.`)),process.exit(1));let C=new Map(Object.entries(c.vars));r.env.WB_VERSION&&C.set(`WB_VERSION`,r.env.WB_VERSION);let w=[...C],T=[...S.filter(e=>Buffer.byteLength(y[e]??``,`utf8`)>5*1024),...w.filter(([,e])=>Buffer.byteLength(typeof e==`string`?e:JSON.stringify(e),`utf8`)>5*1024).map(([e])=>e)];T.length>0&&(console.error(f.red(`Variable or secret values exceed Cloudflare's 5 KB limit: ${T.join(`, `)}`)),process.exit(1));let E=_n((n.dryRun?[]:await gn(r,n,a,c,o))??[],y,w.map(([e])=>e),c.bindingNames),O=new Set([...S,...w.map(([e])=>e)]).size+E.length,k=E.length>0?` (including ${E.length} remote secrets kept from the previous version: ${E.join(`, `)})`:``;O>128&&(console.error(f.red(`Cloudflare allows at most 128 variables and secrets combined, but ${O} were selected${k}.`)),process.exit(1)),O>64&&console.warn(f.yellow(`${O} variables and secrets${k} exceed the Free plan's limit of 64.`)),console.info(f.cyan(`Deploying ${c.workerName??r.name} (${o}) with ${S.length} secrets: ${S.join(`, `)}`));let A=!!(r.packageJson.dependencies?.vinext??r.packageJson.devDependencies?.vinext),j=A?t.join(`dist`,`server`,`wrangler.json`):a,M=c.usesEnvSection?`${At(`CLOUDFLARE_ENV`,o)} `:``;A?(r.env.WB_VERSION&&(r.env.NEXT_PUBLIC_WB_VERSION||=r.env.WB_VERSION),r.packageJson.scripts?.[`gen-code`]&&await H(`YARN run gen-code`,r,n),await H(`${M}YARN vinext build`,r,n),!n.dryRun&&!e.existsSync(t.resolve(r.dirPath,j))&&(console.error(f.red(`${j} not found; the vinext build did not produce a deploy config.`)),process.exit(1)),await H(`YARN wrangler deploy --dry-run --config ${K(j)}`,r,n)):await H(`YARN wrangler deploy --dry-run --config ${K(a)}${c.usesEnvSection?` --env ${K(o)}`:``}`,r,n);let N=c.usesEnvSection?` --env ${K(o)}`:``;for(let e of u){let t=e.database_name??e.binding;t&&await H(`CI=true YARN wrangler d1 migrations apply ${K(t)} --remote --config ${K(a)}${N}`,r,n)}d&&(d.database_id||(console.error(f.red(`The ${o} D1 binding has no database_id in the wrangler config.`)),process.exit(1)),l||(console.error(f.red(`CLOUDFLARE_ACCOUNT_ID (or account_id in the wrangler config) is required for remote drizzle-kit migrations.`)),process.exit(1)),await H(Ut(r,`migrate`,`CLOUDFLARE_D1_DATABASE_ID=${d.database_id} CLOUDFLARE_ACCOUNT_ID=${l}`),r,n));let P=[`deploy`,`--config`,j,...!A&&c.usesEnvSection?[`--env`,o]:[],...r.env.WB_VERSION?[`--var`,`WB_VERSION:${r.env.WB_VERSION}`]:[],`--secrets-file`];if(console.info(f.cyan(`Running: wrangler ${P.join(` `)} <temporary secrets file>`)),!n.dryRun){vn(r);let n={...r.env};delete n.CLOUDFLARE_ENV;let a=e.mkdtempSync(t.join(m.tmpdir(),`wb-deploy-`)),o=[`SIGHUP`,`SIGINT`,`SIGTERM`,`SIGQUIT`],s=new Map,c,l;for(let t of o){let n=()=>{if(l??=t,c)c.kill(t===`SIGINT`||t===`SIGTERM`?t:`SIGTERM`);else{for(let[e,t]of s)process.off(e,t);e.rmSync(a,{force:!0,recursive:!0}),process.kill(process.pid,t)}};s.set(t,n),process.on(t,n)}let u;try{let o=t.join(a,`secrets.json`);e.writeFileSync(o,JSON.stringify(y),{mode:384}),u=await new Promise(e=>{c=i(`wrangler`,[...P,o],{cwd:r.dirPath,env:n,stdio:[`ignore`,`inherit`,`inherit`]}),c.on(`error`,t=>{console.error(t),e(1)}),c.on(`exit`,(t,n)=>{e(n?1:t??void 0)})})}finally{for(let[e,t]of s)process.off(e,t);e.rmSync(a,{force:!0,recursive:!0})}if(l){process.kill(process.pid,l);return}u!==0&&(console.error(f.red(`wrangler deploy failed with exit code ${u??`unknown`}.`)),process.exit(u??1))}if(r.packageJson.scripts?.[`deploy/post`]){let e=c.d1Databases.length===1?c.d1Databases[0]:void 0;delete r.env.CLOUDFLARE_D1_DATABASE_ID,c.d1Databases.length>1&&console.warn(f.yellow(`Multiple D1 bindings exist; CLOUDFLARE_D1_DATABASE_ID is not set for deploy/post.`)),e?.database_id&&(r.env.CLOUDFLARE_D1_DATABASE_ID=e.database_id),l&&(r.env.CLOUDFLARE_ACCOUNT_ID=l),await H(`YARN run deploy/post`,r,n)}}};function mn(n,r){let i={};for(let a of new Set(r?[n,r]:[n])){let n=t.join(a,`.env.cloudflare`);if(!e.existsSync(n))continue;let r=o({path:n,processEnv:{},quiet:!0}).parsed??{};for(let[e,t]of Object.entries(r))e!==`CLOUDFLARE_ENV`&&(i[e]??=t)}return i}function hn(e,t,n){let r=new Set(t),i={};for(let[t,n]of Object.entries(e))r.has(t)||fn(t)||t===`DATABASE_URL`&&n.startsWith(`file:`)||(i[t]=n);return{missingKeys:n.filter(t=>!r.has(t)&&!fn(t)&&!e[t]),secrets:i}}async function gn(e,t,n,r,i){vn(e);let a=[`secret`,`list`,`--format`,`json`,`--config`,n,...r.usesEnvSection?[`--env`,i]:[]];console.info(f.cyan(`Running: wrangler ${a.join(` `)}`));let o;try{o=await I(`wrangler`,a,{cwd:e.dirPath,env:e.env,stdio:`pipe`,killOnExit:!0,verbose:t.verbose})}catch(e){console.warn(f.yellow(`Failed to run wrangler to list remote secrets; checking only the local payload against Cloudflare's limits.\n${e instanceof Error?e.message:String(e)}`));return}if(o.status===0){let e=o.stdout.indexOf(`[`),t=o.stdout.lastIndexOf(`]`);if(e!==-1&&t!==-1&&e<t)try{return JSON.parse(o.stdout.slice(e,t+1)).map(({name:e})=>e).filter(e=>typeof e==`string`)}catch{}}else if(/\[code: 100(07|90)\]|If this is a new Worker/.test(o.stdout+o.stderr))return[];console.warn(f.yellow(`Failed to list the remote Worker secrets; checking only the local payload against Cloudflare's limits.\n${(o.stderr||o.stdout).trim()}`))}function _n(e,t,n,r){let i=new Set([...n,...r]);return e.filter(e=>!Object.hasOwn(t,e)&&!i.has(e))}function vn(e){e.binExists||console.warn(f.yellow(`node_modules/.bin not found; relying on PATH to resolve wrangler.`))}const yn=new Set([`SIGINT`,`SIGTERM`,`SIGQUIT`]),bn={command:`dotenv [args..]`,describe:`Load .env files and run a command.`,builder:e=>e.parserConfiguration({"populate--":!0}),async handler(e){await xn(Sn(e))}};async function xn({command:e}){e.length===0&&(console.error(`Usage: wb dotenv -- <command> [args...]`),process.exit(1));let n=t.resolve(process.cwd());Cn(n);let r=process.env.BERRY_BIN_FOLDER;ne(process.env),!Fe(n,process.env)&&r&&(process.env.PATH=process.env.PATH?`${r}:${process.env.PATH}`:r);let a=i(e[0],e.slice(1),{cwd:n,env:process.env,stdio:`inherit`}),o=new Map,s;a.on(`error`,e=>{console.error(e),process.exit(1)});for(let e of yn){let t=()=>{s=e,a.kill(e)};o.set(e,t),process.once(e,t)}a.on(`exit`,(e,t)=>{for(let[e,t]of o)process.off(e,t);if(t&&t===s&&process.exit(0),t){process.kill(process.pid,t);return}process.exit(e??1)})}function Sn(e){return{command:[...(e.args??[]).map(String),...(e[`--`]??[]).map(String)]}}function Cn(e){let n={...o({path:t.join(e,`.env`),processEnv:{},quiet:!0}).parsed,...process.env.WB_ENV?o({path:t.join(e,`.env.${process.env.WB_ENV}`),processEnv:{},quiet:!0}).parsed??{}:{}},[r]=O(e,process.env.WB_ENV,n),i={...r,...n},a=c({parsed:i,processEnv:{}}).parsed??i;for(let[e,t]of Object.entries(a))e in process.env||(process.env[e]=t)}const wn=`litestream.yml`,Tn=`/etc/litestream.yml`,En=[{schemaPath:t.join(`prisma`,`schema.prisma`),dbPath:`prisma`},{schemaPath:t.join(`prisma`,`schema`),dbPath:t.join(`prisma`,`schema`)},{schemaPath:t.join(`db`,`schema.prisma`),dbPath:`db`}];var Dn=class{cleanUpLitestream(e){let t=On(e);return`${Mn(`${t}/prod.sqlite3`)}; rm -Rf ${t}/.prod.sqlite3* || true`}deploy(e,t=``){return`PRISMA migrate deploy ${t}`}generate(e,t=``){return[`PRISMA generate`,t].filter(Boolean).join(` `)}deployForce(e){let t=On(e),n=jn(`${t}/prod.sqlite3`);return`${n}; PRISMA migrate reset --force --skip-seed && ${n}
|
|
24
|
-
&& litestream restore ${
|
|
25
|
-
`))}function
|
|
26
|
-
`))}function
|
|
27
|
-
`+f.cyan(f.bold(`Command:`),e)+f.gray(` at ${t}`))}function
|
|
28
|
+
`),console.info(f.green(`Generated ${s} with ${o.length} environment variables.`))}};function Cn(t){let n;try{n=t.findFile(`.env.example`)}catch{return[]}return Object.keys(s(e.readFileSync(n,`utf8`)))}function wn(e,t){let n=t.replaceAll(`
|
|
29
|
+
`,String.raw`\n`).replaceAll(`\r`,String.raw`\r`),r=[`'${t}'`,`\`${t}\``,`"${n}"`];for(let n of r)if(s(`${e}=${n}`)[e]===t)return n;throw Error(`The value of ${e} cannot be losslessly serialized into .dev.vars; simplify its quoting.`)}const Tn=new Set(`CI.CF_ACCOUNT_ID.CF_API_BASE_URL.CF_API_EMAIL.CF_API_KEY.CF_API_TOKEN.CF_EMAIL.CLOUDFLARE_ACCESS_CLIENT_ID.CLOUDFLARE_ACCESS_CLIENT_SECRET.CLOUDFLARE_ACCOUNT_ID.CLOUDFLARE_API_BASE_URL.CLOUDFLARE_API_KEY.CLOUDFLARE_API_TOKEN.CLOUDFLARE_AUTH_USE_KEYRING.CLOUDFLARE_D1_DATABASE_ID.CLOUDFLARE_EMAIL.CLOUDFLARE_ENV.CLOUDFLARE_INCLUDE_PROCESS_ENV.CLOUDFLARE_LOAD_DEV_VARS_FROM_DOT_ENV.DOCKER_HOST.HTTP_PROXY.HTTPS_PROXY.http_proxy.https_proxy.FORCE_COLOR.MINIFLARE_CACHE_DIR.MISE_ENV.NO_COLOR.NEXT_PUBLIC_WB_ENV.NEXT_PUBLIC_WB_VERSION.NODE_ENV.PORT.WB_ENV.WB_VERSION`.split(`.`)),En=[`WRANGLER_`,`CLOUDFLARE_HYPERDRIVE_LOCAL_CONNECTION_STRING_`,`CLOUDFLARE_CF_FETCH_`];function Dn(e){return Tn.has(e)||En.some(t=>e.startsWith(t))}const On={command:`deploy`,describe:`Deploy a Cloudflare Workers app (vinext or plain Worker) to the WB_ENV environment: validate secrets, build, apply remote D1 migrations, then deploy code and secrets atomically.`,builder:e=>e,async handler(n){delete process.env.CLOUDFLARE_ENV;let r=V(n);r||(console.error(f.red(`No project found.`)),process.exit(1));let a=J(r);a||(console.error(f.red(`wb deploy currently supports only Cloudflare Workers apps (no wrangler config found).`)),process.exit(1));let o=r.env.WB_ENV;(!o||o===`development`||o===`test`)&&(console.error(f.red(`WB_ENV must name a deploy environment (e.g. staging or production), but is ${o}.`)),process.exit(1));let s=kn(r.dirPath,n.includeRootEnv?r.rootDirPath:void 0);for(let[e,t]of Object.entries(s))process.env[e]??=t,r.env[e]??=t;let c;try{c=xn(r,o)}catch(e){console.error(f.red(String(e instanceof Error?e.message:e))),process.exit(1)}c||(console.error(f.red(`Failed to parse ${a}.`)),process.exit(1));let l=c.accountId??r.env.CLOUDFLARE_ACCOUNT_ID,u=c.d1Databases.filter(e=>gn(r,e)),d=Qt(r);d&&u.length>0&&u.length<c.d1Databases.length&&(console.error(f.red(`wb deploy does not support mixing wrangler-native and non-native D1 migration layouts.`)),process.exit(1));let p=u.length===0&&d?c.d1Databases[0]:void 0;u.length===0&&d&&c.d1Databases.length>1&&(console.error(f.red(`wb deploy supports drizzle-kit migrations only for a single D1 binding; found multiple.`)),process.exit(1));let h=new Set(u);p&&h.add(p);let g=c.d1Databases.filter(e=>!h.has(e));if(g.length>0&&console.warn(f.yellow(`No D1 migration mechanism detected for ${g.map(e=>e.binding??e.database_name??`unnamed binding`).join(`, `)} (no wrangler migrations directory and no drizzle config targeting sqlite/d1-http/durable-sqlite); wb deploy will not run D1 migrations for them.`)),!n.dryRun){p&&!r.env.CLOUDFLARE_API_TOKEN&&(console.error(f.red(`CLOUDFLARE_API_TOKEN is required for remote drizzle-kit migrations.`)),process.exit(1));let e=!!r.env.CLOUDFLARE_API_TOKEN||!!r.env.CF_API_TOKEN||!!(r.env.CLOUDFLARE_API_KEY&&r.env.CLOUDFLARE_EMAIL)||!!(r.env.CF_API_KEY&&r.env.CF_EMAIL);Le(r.env.CI)&&!e&&(console.error(f.red(`Wrangler authentication (e.g. CLOUDFLARE_API_TOKEN) is required to deploy on CI.`)),process.exit(1))}!Le(r.env.CI)&&r.packageJson.scripts?.[`deploy/ci-setup`]&&await U(`YARN run deploy/ci-setup`,r,n);let[_,v]=D(n,r.dirPath,{ignoreProcessEnv:!0}),y=new Set(v.filter(([e])=>!e.startsWith(`mise env`)).flatMap(([,e])=>e));for(let e of Object.keys(_))y.has(e)||delete _[e];let b=Cn(r);for(let e of b)_[e]??=r.env[e]??``;for(let e of c.requiredSecretNames){let t=r.env[e];_[e]===void 0&&t!==void 0&&(_[e]=t)}for(let e of Object.keys(_)){let t=r.env[e];t!==void 0&&(_[e]=t)}let{missingKeys:x,secrets:S}=An(_,[...c.varKeys,...c.bindingNames],b);r.env.WB_VERSION&&c.bindingNames.includes(`WB_VERSION`)&&(console.error(f.red(`WB_VERSION collides with a Worker binding name; rename the binding.`)),process.exit(1));let C=Object.keys(_).filter(e=>c.bindingNames.includes(e));C.length>0&&console.warn(f.yellow(`Skipping env keys that collide with Worker binding names: ${C.join(`, `)}`)),x.length>0&&(console.error(f.red(`Missing required environment variables (from .env.example or wrangler secrets.required): ${x.join(`, `)}`)),process.exit(1));let w=c.requiredSecretNames.filter(e=>!Object.hasOwn(S,e)&&!c.varKeys.includes(e)&&!c.bindingNames.includes(e));w.length>0&&(console.error(f.red(`Secrets required by the wrangler config are not provided: ${w.join(`, `)}`)),process.exit(1));let T=Object.keys(S).toSorted();T.length>100&&(console.error(f.red(`Cloudflare accepts at most 100 secrets per deploy, but ${T.length} were selected.`)),process.exit(1));let E=new Map(Object.entries(c.vars));r.env.WB_VERSION&&E.set(`WB_VERSION`,r.env.WB_VERSION);let O=[...E],k=[...T.filter(e=>Buffer.byteLength(S[e]??``,`utf8`)>5*1024),...O.filter(([,e])=>Buffer.byteLength(typeof e==`string`?e:JSON.stringify(e),`utf8`)>5*1024).map(([e])=>e)];k.length>0&&(console.error(f.red(`Variable or secret values exceed Cloudflare's 5 KB limit: ${k.join(`, `)}`)),process.exit(1));let A=Mn((n.dryRun?[]:await jn(r,n,a,c,o))??[],S,O.map(([e])=>e),c.bindingNames),j=new Set([...T,...O.map(([e])=>e)]).size+A.length,M=A.length>0?` (including ${A.length} remote secrets kept from the previous version: ${A.join(`, `)})`:``;j>128&&(console.error(f.red(`Cloudflare allows at most 128 variables and secrets combined, but ${j} were selected${M}.`)),process.exit(1)),j>64&&console.warn(f.yellow(`${j} variables and secrets${M} exceed the Free plan's limit of 64.`)),console.info(f.cyan(`Deploying ${c.workerName??r.name} (${o}) with ${T.length} secrets: ${T.join(`, `)}`));let N=!!(r.packageJson.dependencies?.vinext??r.packageJson.devDependencies?.vinext),P=N?t.join(`dist`,`server`,`wrangler.json`):a,ee=c.usesEnvSection?`${Lt(`CLOUDFLARE_ENV`,o)} `:``;N?(r.env.WB_VERSION&&(r.env.NEXT_PUBLIC_WB_VERSION||=r.env.WB_VERSION),r.packageJson.scripts?.[`gen-code`]&&await U(`YARN run gen-code`,r,n),await U(`${ee}YARN vinext build`,r,n),!n.dryRun&&!e.existsSync(t.resolve(r.dirPath,P))&&(console.error(f.red(`${P} not found; the vinext build did not produce a deploy config.`)),process.exit(1)),await U(`YARN wrangler deploy --dry-run --config ${q(P)}`,r,n)):await U(`YARN wrangler deploy --dry-run --config ${q(a)}${c.usesEnvSection?` --env ${q(o)}`:``}`,r,n);let te=c.usesEnvSection?` --env ${q(o)}`:``;for(let e of u){let t=e.database_name??e.binding;t&&await U(`CI=true YARN wrangler d1 migrations apply ${q(t)} --remote --config ${q(a)}${te}`,r,n)}p&&(p.database_id||(console.error(f.red(`The ${o} D1 binding has no database_id in the wrangler config.`)),process.exit(1)),l||(console.error(f.red(`CLOUDFLARE_ACCOUNT_ID (or account_id in the wrangler config) is required for remote drizzle-kit migrations.`)),process.exit(1)),await U(Xt(r,`migrate`,`CLOUDFLARE_D1_DATABASE_ID=${p.database_id} CLOUDFLARE_ACCOUNT_ID=${l}`),r,n));let F=[`deploy`,`--config`,P,...!N&&c.usesEnvSection?[`--env`,o]:[],...r.env.WB_VERSION?[`--var`,`WB_VERSION:${r.env.WB_VERSION}`]:[],`--secrets-file`];if(console.info(f.cyan(`Running: wrangler ${F.join(` `)} <temporary secrets file>`)),!n.dryRun){Nn(r);let n={...r.env};delete n.CLOUDFLARE_ENV;let a=e.mkdtempSync(t.join(m.tmpdir(),`wb-deploy-`)),o=[`SIGHUP`,`SIGINT`,`SIGTERM`,`SIGQUIT`],s=new Map,c,l;for(let t of o){let n=()=>{if(l??=t,c)c.kill(t===`SIGINT`||t===`SIGTERM`?t:`SIGTERM`);else{for(let[e,t]of s)process.off(e,t);e.rmSync(a,{force:!0,recursive:!0}),process.kill(process.pid,t)}};s.set(t,n),process.on(t,n)}let u;try{let o=t.join(a,`secrets.json`);e.writeFileSync(o,JSON.stringify(S),{mode:384}),u=await new Promise(e=>{c=i(`wrangler`,[...F,o],{cwd:r.dirPath,env:n,stdio:[`ignore`,`inherit`,`inherit`]}),c.on(`error`,t=>{console.error(t),e(1)}),c.on(`exit`,(t,n)=>{e(n?1:t??void 0)})})}finally{for(let[e,t]of s)process.off(e,t);e.rmSync(a,{force:!0,recursive:!0})}if(l){process.kill(process.pid,l);return}u!==0&&(console.error(f.red(`wrangler deploy failed with exit code ${u??`unknown`}.`)),process.exit(u??1))}if(r.packageJson.scripts?.[`deploy/post`]){let e=c.d1Databases.length===1?c.d1Databases[0]:void 0;delete r.env.CLOUDFLARE_D1_DATABASE_ID,c.d1Databases.length>1&&console.warn(f.yellow(`Multiple D1 bindings exist; CLOUDFLARE_D1_DATABASE_ID is not set for deploy/post.`)),e?.database_id&&(r.env.CLOUDFLARE_D1_DATABASE_ID=e.database_id),l&&(r.env.CLOUDFLARE_ACCOUNT_ID=l),await U(`YARN run deploy/post`,r,n)}}};function kn(n,r){let i={};for(let a of new Set(r?[n,r]:[n])){let n=t.join(a,`.env.cloudflare`);if(!e.existsSync(n))continue;let r=o({path:n,processEnv:{},quiet:!0}).parsed??{};for(let[e,t]of Object.entries(r))e!==`CLOUDFLARE_ENV`&&(i[e]??=t)}return i}function An(e,t,n){let r=new Set(t),i={};for(let[t,n]of Object.entries(e))r.has(t)||Dn(t)||t===`DATABASE_URL`&&n.startsWith(`file:`)||(i[t]=n);return{missingKeys:n.filter(t=>!r.has(t)&&!Dn(t)&&!e[t]),secrets:i}}async function jn(e,t,n,r,i){Nn(e);let a=[`secret`,`list`,`--format`,`json`,`--config`,n,...r.usesEnvSection?[`--env`,i]:[]];console.info(f.cyan(`Running: wrangler ${a.join(` `)}`));let o;try{o=await L(`wrangler`,a,{cwd:e.dirPath,env:e.env,stdio:`pipe`,killOnExit:!0,verbose:t.verbose})}catch(e){console.warn(f.yellow(`Failed to run wrangler to list remote secrets; checking only the local payload against Cloudflare's limits.\n${e instanceof Error?e.message:String(e)}`));return}if(o.status===0){let e=o.stdout.indexOf(`[`),t=o.stdout.lastIndexOf(`]`);if(e!==-1&&t!==-1&&e<t)try{return JSON.parse(o.stdout.slice(e,t+1)).map(({name:e})=>e).filter(e=>typeof e==`string`)}catch{}}else if(/\[code: 100(07|90)\]|If this is a new Worker/.test(o.stdout+o.stderr))return[];console.warn(f.yellow(`Failed to list the remote Worker secrets; checking only the local payload against Cloudflare's limits.\n${(o.stderr||o.stdout).trim()}`))}function Mn(e,t,n,r){let i=new Set([...n,...r]);return e.filter(e=>!Object.hasOwn(t,e)&&!i.has(e))}function Nn(e){e.binExists||console.warn(f.yellow(`node_modules/.bin not found; relying on PATH to resolve wrangler.`))}const Pn=new Set([`SIGINT`,`SIGTERM`,`SIGQUIT`]),Fn={command:`dotenv [args..]`,describe:`Load .env files and run a command.`,builder:e=>e.parserConfiguration({"populate--":!0}),async handler(e){await In(Ln(e))}};async function In({command:e}){e.length===0&&(console.error(`Usage: wb dotenv -- <command> [args...]`),process.exit(1));let n=t.resolve(process.cwd());Rn(n);let r=process.env.BERRY_BIN_FOLDER;re(process.env),!Ie(n,process.env)&&r&&(process.env.PATH=process.env.PATH?`${r}:${process.env.PATH}`:r);let a=i(e[0],e.slice(1),{cwd:n,env:process.env,stdio:`inherit`}),o=new Map;a.on(`error`,e=>{console.error(e),process.exit(1)});for(let e of Pn){let t=()=>{a.kill(e)};o.set(e,t),process.once(e,t)}a.on(`exit`,(e,t)=>{for(let[e,t]of o)process.off(e,t);if(t){process.kill(process.pid,t);return}process.exit(e??1)})}function Ln(e){return{command:[...(e.args??[]).map(String),...(e[`--`]??[]).map(String)]}}function Rn(e){let n=process.env.WB_ENV,r=n=>o({path:t.join(e,n),processEnv:{},quiet:!0}).parsed??{},i=n?{...r(`.env.${n}`),...r(`.env.${n}.local`)}:{},a={...r(`.env`),...n?r(`.env.${n}`):{},...r(`.env.local`),...n?r(`.env.${n}.local`):{}},s=!!n&&!Le(process.env.CI),[l]=O(e,n,a,{modeFileOverridesProcessEnv:s}),u={...l,...a},d=e=>!(e in process.env)||s&&(e in i||e in l),f={};for(let[e,t]of Object.entries(process.env))t!==void 0&&!(e in u&&d(e))&&(f[e]=t.replaceAll(`$`,String.raw`\$`));let p=c({parsed:u,processEnv:f}).parsed??u;for(let[e,t]of Object.entries(p)){if(!(e in process.env)){process.env[e]=t;continue}!(e in i||e in l)||process.env[e]===t||s&&(console.warn(`Warning: ${e} in the "${n}" mode's env sources overrides the value inherited from the parent environment because WB_ENV is explicitly set.`),process.env[e]=t)}}const zn=`litestream.yml`,Bn=`/etc/litestream.yml`,Vn=[{schemaPath:t.join(`prisma`,`schema.prisma`),dbPath:`prisma`},{schemaPath:t.join(`prisma`,`schema`),dbPath:t.join(`prisma`,`schema`)},{schemaPath:t.join(`db`,`schema.prisma`),dbPath:`db`}];var Hn=class{cleanUpLitestream(e){let t=Un(e);return`${qn(`${t}/prod.sqlite3`)}; rm -Rf ${t}/.prod.sqlite3* || true`}deploy(e,t=``){return`PRISMA migrate deploy ${t}`}generate(e,t=``){return[`PRISMA generate`,t].filter(Boolean).join(` `)}deployForce(e){let t=Un(e),n=Kn(`${t}/prod.sqlite3`);return`${n}; PRISMA migrate reset --force --skip-seed && ${n}
|
|
30
|
+
&& litestream restore ${Gn(e)} -o ${t}/prod.sqlite3 ${t}/prod.sqlite3 && ls -ahl ${t}/prod.sqlite3 && ALLOW_TO_SKIP_SEED=0 PRISMA migrate deploy`}listBackups(e,t){let n=Un(e);return`litestream ltx ${Gn(e,t)} ${n}/prod.sqlite3`}migrate(e,t=``){return`PRISMA migrate deploy ${t} && ${this.generate(e)} && ${this.seed(e)}`}migrateDev(e,t=``){return`PRISMA migrate dev ${t}`}reset(e,t=``){let n=[],r=Jn(e);r&&n.push(r);let i=[`PRISMA migrate reset --force`,t].filter(Boolean).join(` `);return n.push(i),e.packageJson.dependencies?.blitz&&n.push(this.seed(e)),n.filter(Boolean).join(` && `)}restore(e,t,n){let r=Un(e);return`rm -Rf ${t}*; litestream restore ${Gn(e,n)} -o ${t} ${r}/prod.sqlite3`}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(e,n,r=``){let i=``;if(n)try{new URL(n),i=`DATABASE_URL=${n} `}catch{i=`DATABASE_URL=${We}${t.resolve(n)} `}else if(e.env.DATABASE_URL?.startsWith(`file:`)){let n=Wn(e);n&&(i=`DATABASE_URL=${We}${t.resolve(e.dirPath,n,e.env.DATABASE_URL.slice(5))} `)}return`${i}PRISMA studio ${r}`}};function Un(e){return e.packageJson.dependencies?.blitz?`db/mount`:`prisma/mount`}function Wn(n){return Vn.find(({schemaPath:r})=>e.existsSync(t.resolve(n.dirPath,r)))?.dbPath}function Gn(n,r){if(r)return`-config "${r}"`;let i=t.join(n.dirPath,zn);return e.existsSync(i)?`-config ./${zn}`:e.existsSync(Bn)?`-config ${Bn}`:`-config ./${zn}`}function Kn(e){return`rm -Rf "${e}"*`}function qn(e){return`if [ -f "${e}" ]; then printf 'PRAGMA wal_checkpoint(TRUNCATE);' | PRISMA db execute --stdin --url "${We}${e}"; fi && rm -f "${e}".* "${e}"-*`}function Jn(e){let n=Ke(e);if(!n)return;let r=Wn(e),i=t.isAbsolute(n)?n:t.resolve(e.dirPath,r??`.`,n);return`rm -f "${i}" "${i}-wal" "${i}-shm"`}const Yn=new Hn,Xn={command:`gen-code`,describe:`Generate code for the current project`,builder:{},async handler(e){let t=await H(e);t||(console.error(f.red(`No project found.`)),process.exit(1));let n=t.descendants.map(e=>({project:e,scripts:Zn(e)})).filter(({scripts:e})=>e.length>0);if(n.length===0){console.info(f.green(`No code generation needed.`));return}for(let{project:t,scripts:r}of n){console.info(`Running "gen-code" for ${t.name} ...`);for(let n of r)await U(n,t,e)}}};function Zn(e){let t=[],n=$n(e);e.hasOwnDependency(`blitz`)&&e.hasSourceCode&&t.push(`YARN blitz codegen`),n&&t.push(n);let r=er(e);r&&t.push(r);let i=t.length===0?tr(e):void 0;i&&t.push(i);let a=Qn(e);return a&&t.push(a),t}function Qn(n){if(n.packageJson.scripts?.[`gen-i18n-ts`])return n.hasSourceCode?`YARN run gen-i18n-ts`:void 0;if(n.hasOwnDependency(`gen-i18n-ts`)&&n.hasSourceCode&&e.existsSync(t.join(n.dirPath,`i18n`)))return`YARN gen-i18n-ts -i i18n -o src/__generated__/i18n.ts -d ja-JP`}function $n(e){if(e.hasPrisma&&ir(e))return Yn.generate(e)}function er(e){if(e.hasOwnDependency(`@chakra-ui/cli`)){if(nr(e,`@chakra-ui/cli`)===2)return`YARN chakra-cli tokens src/core/theme.ts`;if(rr(e,`src/theme.ts`))return`YARN chakra typegen src/theme.ts --strict`}}function tr(e){if(!e.hasDrizzle)return;let t=sn(e);if(t)return`${Zt(e,`YARN drizzle-kit check --config ${t.fileName}`)} || true`}function nr(e,t){let n=e.packageJson,r=(n.dependencies?.[t]??n.devDependencies?.[t]??n.optionalDependencies?.[t]??n.peerDependencies?.[t])?.match(/\d+/u)?.[0];return r===void 0?void 0:Number(r)}function rr(n,r){return e.existsSync(t.join(n.dirPath,r))}function ir(e){return[`prisma/schema.prisma`,`prisma/schema`,`db/schema.prisma`].some(t=>rr(e,t))}const ar={command:`kill-port-if-non-ci`,describe:`Kill the port specified by PORT environment variable if non-CI.`,builder:{},async handler(e){await or(e)}};async function or(e){let t=V(e);if(t||(console.error(f.red(`No project found.`)),process.exit(1)),Le(t.env.CI)){console.info(`Skip killing port due to CI: ${t.env.CI}`);return}let n=t.env.PORT,r=Number(n);(!Number.isInteger(r)||r<=0)&&(console.error(f.red(`PORT environment variable is invalid: ${n}`)),process.exit(1)),console.info(`Killing the port: ${r}`);try{await v(r)}catch{}}function sr(e,t){if(!cr(e,t))return;let n=lr(t);n&&(process.stdout.write(n),process.stdout.write(`
|
|
31
|
+
`))}function cr(e,t){return e!==0||ur(t)}function lr(e){return e.trim()}function ur(e){return/\bwarn(?:ing)?s?\b/i.test(e.replaceAll(/\b(?:0|no) warnings?\b/gi,``))}const dr={fix:{description:`Fix the linting errors`,type:`boolean`},format:{description:`Format the code`,type:`boolean`},quiet:{description:`Report errors only`,type:`boolean`},silent:{description:`Print only failed or warning command output`,type:`boolean`}},fr=new Set([`astro`,`cjs`,`cts`,`js`,`jsx`,`mjs`,`mts`,`svelte`,`ts`,`tsx`,`vue`]),pr=new Set([`py`]),mr=new Set([`dart`]),hr=new Set([`rs`]),gr=new Set([...fr,`css`,`gql`,`graphql`,`hbs`,`htm`,`html`,`json`,`json5`,`jsonc`,`less`,`md`,`mdx`,`scss`,`toml`,`yaml`,`yml`]),_r=new Set([`cjs`,`css`,`cts`,`htm`,`html`,`java`,`js`,`json`,`json5`,`jsonc`,`jsx`,`md`,`mjs`,`mts`,`scss`,`ts`,`tsx`,`vue`,`yaml`,`yml`]),vr=new Set([..._r].filter(e=>!gr.has(e))),yr=`!**/test{-,/}fixtures/**`,br={command:`lint [files...]`,describe:`Lint code`,builder:dr,async handler(e){let t=await xr(e);t&&process.exit(t)}};async function xr(e){if(process.platform===`win32`)return console.error(f.red(`This command is not supported on Windows.`)),1;let n=await H(e,!1);if(!n)return console.error(f.red(`No project found.`)),1;let r=Lr(e),i=new Map,a=new Map,o=new Map,s=new Map,c=new Set,l=[],u=[],d=!1,p,m;if(r.length>0){let h=await Promise.all(r.map(async e=>{let n=t.resolve(e);return{fileKind:await Rr(n),filePath:n}}));for(let{fileKind:r,filePath:p}of h){if(p.endsWith(`/test/fixtures`)||p.includes(`/test/fixtures/`)||p.endsWith(`/test-fixtures`)||p.includes(`/test-fixtures/`))continue;let m=t.extname(p).slice(1);if(p.endsWith(`/package.json`)){u.push(p);continue}u.push(...Hr(n.descendants,p,r));for(let{lintPath:t,project:u}of Ur(n.descendants,p,r)){if(u.hasPoetryLock&&(r===`directory`||pr.has(m))){let e=o.get(u)??[];if(e.push(t),o.set(u,e),r!==`directory`)continue}if(u.hasPubspecYaml&&(r===`directory`||mr.has(m))){let e=s.get(u)??[];if(e.push(t),s.set(u,e),r!==`directory`)continue}if(!(u.hasCargoToml&&(r===`directory`||hr.has(m))&&(c.add(u),r!==`directory`)))if(r===`directory`||Gr(u,m)){let n=i.get(u)??[];if(n.push(t),i.set(u,n),e.format)if(r===`directory`&&u.hasOxfmt){let e=a.get(u)??[];e.push(t),a.set(u,e),l.push(Vr(t),yr)}else for(let e of Br(u,t,r,m))if(u.hasOxfmt){let t=a.get(u)??[];t.push(e),a.set(u,t)}else l.push(e)}else if(e.format&&(_r.has(m)||gr.has(m)))if(u.hasOxfmt&&gr.has(m)){let e=a.get(u)??[];e.push(t),a.set(u,e)}else _r.has(m)&&l.push(t);else Wr(m)&&!u.preferredLinter&&(console.error(f.red(`No linter found for ${u.name}. Install Oxlint.`)),d=!0)}}p=[...new Set(l)],m=[...new Set(u)]}else p=Fr(n.self.dirPath,n.descendants),m=n.descendants.map(e=>e.packageJsonPath);let h=[],g=[],_={exitIfFailed:!1,preserveColor:!e.printAllOutput},v=!!e.format,y=!e.format||e.fix;if(r.length>0){if(y)for(let[t,n]of i){let r=Or(t,e,n);r&&g.push({command:r,project:t})}for(let[t,n]of o)y&&g.push({command:jr(e,n),project:t}),v&&h.push({command:Ar(n),project:t});for(let[e,t]of s)y&&g.push({command:Pr(t),project:e}),v&&h.push({command:Nr(t),project:e});if(v){for(let e of c)h.push({command:Mr(),project:e});for(let[e,t]of a)h.push({command:kr(t),project:e})}}else for(let t of n.descendants){if(y){if(!t.packageJson.workspaces||t.hasSourceCode){let n=Or(t,e);n&&g.push({command:n,project:t})}t.hasPoetryLock&&g.push({command:jr(e),project:t}),t.hasPubspecYaml&&g.push({command:Pr(),project:t})}v&&(t.hasOxfmt&&h.push({command:kr(),project:t}),t.hasPoetryLock&&h.push({command:Ar(),project:t}),t.hasPubspecYaml&&h.push({command:Nr(),project:t}),t.hasCargoToml&&h.push({command:Mr(),project:t}))}let b=[];if(v){let t=await Sr(h,e,_);if(wr(t,e),b.push(...t.map(e=>e.exitCode)),b.some(e=>e!==0))return 1}if(d)return 1;if(v){if(p.length>0&&n.self.hasPrettier){let t=await Cr(K([`YARN`,`prettier`,`--cache`,`--no-error-on-unmatched-pattern`,`--write`,`--`,...p]),n.self,e,_);wr([t],e),b.push(t.exitCode)}if(m.length>0){let t=await Cr(K([`YARN`,`sort-package-json`,`--`,...m]),n.self,e,_);wr([t],e),b.push(t.exitCode)}if(b.some(e=>e!==0))return 1}if(y){let t=await Sr(g,e,_);wr(t,e),b.push(...t.map(e=>e.exitCode))}return+!!b.some(e=>e!==0)}function Sr(e,t,n){return Promise.all(e.map(({command:e,project:r})=>Cr(e,r,t,n)))}function Cr(e,t,n,r){if(n.silent){let i=gt(e,t);return ht(e,t,n,r).then(e=>({...e,command:i.printable,cwd:t.dirPath}))}return W(e,t,n,r).then(e=>({exitCode:e}))}function wr(e,t){let n=t.silent&&!t.printAllOutput?e.filter(e=>`output`in e&&cr(e.exitCode,e.output)):e;if(n.length!==0)for(let e of n)`output`in e&&(t.printAllOutput?Tr(e):(t.silent&&Er(e.command,e.cwd),sr(e.exitCode,e.output)))}function Tr(e){if(Er(e.command,e.cwd),e.exitCode===0&&Dr(e.command)){console.info(f.green(`Succeeded.`));return}let t=e.output.trim();t&&(process.stdout.write(t),process.stdout.write(`
|
|
32
|
+
`))}function Er(e,t){console.info(`
|
|
33
|
+
`+f.cyan(f.bold(`Command:`),e)+f.gray(` at ${t}`))}function Dr(e){return e.includes(` oxfmt `)||e.includes(` sort-package-json `)}function Or(e,t,n){if(e.preferredLinter===`oxlint`)return K([`YARN`,`oxlint`,`--no-error-on-unmatched-pattern`,...e.hasTypeAwareOxlint?[`--type-aware`,`--type-check`]:[],...t.quiet?[`--quiet`]:[],...t.fix?[`--fix`]:[],...n??[`.`]])}function kr(e){return K([`YARN`,`oxfmt`,`--write`,`--no-error-on-unmatched-pattern`,...e??[`.`],`!**/package.json`])}function Ar(e){let t=e&&e.length>0?e:[`.`];return[K([`poetry`,`run`,`isort`,`--profile`,`black`,`--filter-files`,...t]),K([`poetry`,`run`,`black`,...t])].join(` && `)}function jr(e,t){let n=t&&t.length>0?t:[`.`];return K([`poetry`,`run`,`flake8`,...e.quiet?[`-q`]:[],...n])}function Mr(){return K([`cargo`,`fmt`,`--all`])}function Nr(e){return K([`dart`,`format`,...e&&e.length>0?e:[`.`]])}function Pr(e){return K([`dart`,`analyze`,...e&&e.length>0?e:[`.`]])}function Fr(e,n){let r=new Set([`**/{.*/,}*.{${[...vr].join(`,`)}}`,yr]);for(let i of n){if(!Kr(i))continue;let n=t.join(i.dirPath,`**/{.*/,}*.{`+[..._r].join(`,`)+`}`);r.add(t.relative(e,n)||n)}return[...r]}function Ir(e,t){let n;for(let r of e)(t===r.dirPath||t.startsWith(`${r.dirPath}/`))&&(!n||r.dirPath.length>n.dirPath.length)&&(n=r);return n}function Lr(e){let t=new Set;for(let n of[...e.files??[],...e._.slice(1),...e[`--`]??[]])t.add(String(n));return[...t]}async function Rr(e){try{if((await y.stat(e)).isDirectory())return`directory`}catch{}return`other`}function zr(e,t){return e.hasOxfmt?gr.has(t):Kr(e)?!0:vr.has(t)}function Br(e,t,n,r){return n===`directory`&&e.hasOxfmt?[t]:n===`directory`&&Kr(e)?[t,yr]:zr(e,r)?[t]:[]}function Vr(e){return t.join(e,`**/{.*/,}*.{${[...vr].join(`,`)}}`)}function Hr(e,n,r){return r===`directory`?e.filter(e=>e.packageJsonPath===t.join(n,`package.json`)||e.packageJsonPath.startsWith(`${n}/`)).map(e=>e.packageJsonPath):[]}function Ur(e,t,n){if(n===`directory`){let n=e.filter(e=>e.dirPath===t||e.dirPath.startsWith(`${t}/`));if(n.length>0)return n.map(e=>({lintPath:e.dirPath,project:e}))}let r=Ir(e,t);return r?[{lintPath:t,project:r}]:[]}function Wr(e){return fr.has(e)||pr.has(e)||mr.has(e)}function Gr(e,t){return e.preferredLinter===`oxlint`&&fr.has(t)}function Kr(e){return!e.hasOxfmt&&e.preferredLinter===`oxlint`}async function qr(e,t){let n=Number(e);if(!n)throw Error(`The given port (${n}) is invalid.`);return await Zr(n,t),n}async function Jr(e){for(let t of[`127.0.0.1`,`::`])if(!await Yr(t,e))return!1;return!0}async function Yr(e,t){return new Promise(n=>{let r=C();r.once(`error`,e=>{if(e.code===`EADDRINUSE`){n(!1);return}if(e.code===`EAFNOSUPPORT`){n(!0);return}n(!1)}),r.once(`listening`,()=>{r.close(()=>{n(!0)})}),r.listen(t,e)})}const Xr=new Set;async function Zr(e,t){await Jr(e)||await Qr(e,t);let n=async()=>{Xr.has(e)||(Xr.add(e),await Qr(e,t))};for(let e of[`beforeExit`,`SIGINT`,`SIGTERM`,`SIGQUIT`])process.on(e,n)}async function Qr(e,t){await ni(e,t),$r(e)}function $r(e){for(let t of ei(e))try{process.kill(t,`SIGKILL`)}catch{}}function ei(e){try{return r(`lsof`,[`-ti`,`tcp:${e}`,`-sTCP:LISTEN`],{encoding:`utf8`,stdio:[`ignore`,`pipe`,`ignore`],timeout:2e3}).split(/\s+/).map(e=>Number(e.trim())).filter(e=>Number.isInteger(e)&&e>0&&e!==process.pid)}catch{return[]}}async function ti(e){for(let t=0;t<10;t++){await S(100);try{process.kill(e,0)}catch(e){if(e.code===`ESRCH`)return}}try{process.kill(e,`SIGKILL`)}catch{}}async function ni(e,t){await ri([`--filter`,`publish=${e}`],t)}async function ri(e,t){try{let n=await ii(e,t);if(n.length===0)return;await L(`docker`,[`rm`,`-f`,...n],{cwd:t.dirPath,env:t.env})}catch{}}async function ii(e,t){let{stdout:n}=await L(`docker`,[`ps`,`-q`,...e],{cwd:t.dirPath,env:t.env});return n.split(/\s+/).map(e=>e.trim()).filter(Boolean)}function ai(e,t){let n=()=>{if(Xr.has(e))return;Xr.add(e),G(e,t);let{status:n}=a(e,{cwd:t.dirPath,shell:!0,stdio:`inherit`});_t(e,n,{})};for(let e of[`beforeExit`,`SIGINT`,`SIGTERM`,`SIGQUIT`])process.on(e,n)}const oi={"delay-ms":{default:5e3,describe:`Delay before starting the maintenance page server.`,type:`number`}},si=2147483647,ci={command:`maintenance <action>`,describe:`Start or stop a lightweight maintenance page server. Example: wb maintenance start`,builder:e=>e.positional(`action`,{choices:[`start`,`stop`],describe:`Maintenance server action`,type:`string`}).options(oi),async handler(e){let t=V(e);t||(console.error(f.red(`No project found.`)),process.exit(1));let n=e.action;if(t.env.WB_ENV===`test`){console.info(`Skip maintenance ${n} because WB_ENV is test.`);return}let r=li(t.env.PORT);if(n===`start`){await ui(t,r,e.delayMs);return}if(n===`stop`){await mi(t,r);return}throw Error(`Unknown maintenance action: ${n}`)}};function li(e){let t=Number(e);return b.ok(Number.isInteger(t)&&t>0,`PORT environment variable is invalid: ${e}`),t}async function ui(e,t,n){b.ok(Number.isFinite(n)&&n>=0&&n<=si,`delay-ms must be between 0 and ${si}: ${n}`);let r=await yi(e,t),i=new AbortController,a=async()=>{await xi(r,process.pid)},o=()=>{i.abort()},s=()=>{process.off(`SIGINT`,o),process.off(`SIGTERM`,o),process.off(`SIGQUIT`,o)};process.once(`SIGINT`,o),process.once(`SIGTERM`,o),process.once(`SIGQUIT`,o);try{await S(n,void 0,{signal:i.signal}),s();let e=await di(t);if(!e)return;console.info(`Started maintenance server on port ${t}.`),await _i(e)}catch(e){if(e instanceof Error&&e.name===`AbortError`)return;throw e}finally{s(),await a()}}async function di(e){for(let t=1;t<=5;t++){let n=hi();try{return await gi(n,e,pi),n}catch(r){await vi(n);let i=r;if(i.code===`EADDRINUSE`&&t<5){await S(100);continue}if(i.code===`EADDRINUSE`){console.info(`Skip maintenance server because port ${e} is already in use.`);return}fi(e,i)}}throw Error(`Unreachable maintenance server startup state.`)}function fi(e,t){t.code===`EADDRINUSE`?console.error(f.red(`Port ${e} is already in use.`)):console.error(f.red(`Maintenance server error: ${t.message}`)),process.exit(1)}function pi(e){console.error(f.red(`Maintenance server error: ${e.message}`)),process.exit(1)}async function mi(e,t){await bi(e,t),await Qr(t,e),console.info(`Stopped maintenance server on port ${t}.`)}function hi(){return x.createServer((e,t)=>{t.writeHead(503,{"cache-control":`no-store`,"content-type":`text/html; charset=utf-8`}),t.end(`<!doctype html>
|
|
28
34
|
<html lang="ja">
|
|
29
35
|
<head>
|
|
30
36
|
<meta charset="utf-8">
|
|
@@ -66,7 +72,8 @@ const L=[...`0123456789abcdef`],ye=[6,1536,393216,100663296],R=[0,8,16,24],be=[1
|
|
|
66
72
|
<p>皆様にはご不便をおかけしますが、メンテナンス終了までしばらくお待ちください。</p>
|
|
67
73
|
</main>
|
|
68
74
|
</body>
|
|
69
|
-
</html>`)})}async function ti(e,t,n){await new Promise((r,i)=>{let a=t=>{e.off(`listening`,o),i(t)},o=()=>{e.off(`error`,a),e.on(`error`,n),r()};e.once(`error`,a),e.once(`listening`,o),e.listen(t,`0.0.0.0`)})}async function ni(e){await new Promise(t=>{let n=()=>{process.off(`SIGINT`,n),process.off(`SIGTERM`,n),process.off(`SIGQUIT`,n),(async()=>{try{await ri(e)}catch(e){console.error(f.red(`Failed to close maintenance server: ${e.message}`))}finally{t()}})()};process.once(`SIGINT`,n),process.once(`SIGTERM`,n),process.once(`SIGQUIT`,n)})}async function ri(e){await new Promise((t,n)=>{e.close(e=>{if(e){if(e.code===`ERR_SERVER_NOT_RUNNING`){t();return}n(e);return}t()}),e.closeAllConnections()})}async function ii(e,n){let r=ci(e,n);return await y.mkdir(t.dirname(r),{recursive:!0}),await y.writeFile(r,`${process.pid}\n`,`utf8`),r}async function ai(e,t){let n=ci(e,t),r=await si(n);if(r!==void 0&&r!==process.pid){try{F(r,`SIGTERM`)}catch{}await Br(r)}await oi(n,r)}async function oi(e,t){t!==void 0&&await si(e)!==t||await y.rm(e,{force:!0})}async function si(e){try{let t=await y.readFile(e,`utf8`),n=Number(t.trim());return Number.isInteger(n)&&n>0?n:void 0}catch{return}}function ci(e,t){return li(e.rootDirPath,t)}function li(e,n){return t.join(e,`.wb`,`maintenance-${n}.pid`)}function*ui(e,t){for(let n of t)console.info(`Running "${e}" for ${n.name} ...`),yield n}const di=[`dependencies`,`devDependencies`,`optionalDependencies`,`peerDependencies`],fi=/\.(?:sqlite3?|db)(?:[-.](?:journal|shm|wal))?$/i,pi=[`.cache`,`.mypy_cache`,`.next/cache`,`.parcel-cache`,`.pytest_cache`,`.ruff_cache`,`.tox`,`.turbo`,`.venv`,`.yarn/cache`,`.yarn/install-state.gz`,`__pycache__`,`coverage`,`node_modules/.cache`,`playwright-report`,`storybook-static`,`target`,`test-results`],mi=[`**/*.pyc`,`**/*.tsbuildinfo`,`**/__pycache__`],hi=[`prisma`,`db`,`drizzle`],gi=[`/data`],_i={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(r){let i=await V(r);i||(console.error(f.red(`No project found.`)),process.exit(1));let a=[];for(let n of ui(`optimizeForDockerBuild`,i.descendants)){let i=n.packageJson;vi(n,i);let o=wi(r,i);if(Ei(i,{removeWbPostinstall:!r.outside&&o.includes(`@willbooster/wb`)}),Di(i),r.dryRun)continue;let s=r.outside?t.join(n.dirPath,`dist`):n.dirPath;await e.promises.mkdir(s,{recursive:!0}),await e.promises.writeFile(t.join(s,`package.json`),JSON.stringify(i),`utf8`),r.outside&&await Si(t.join(s,`bash`)),a.push(n)}!r.dryRun&&!r.outside&&(n.spawnSync(i.root.packageManagerCommand,[`install`],{stdio:`inherit`}),console.info(`Installed dependencies.`),await Oi(a))}};function vi(e,t){return yi(e.rootDirPath,e.dirPath,t)}function yi(e,t,n){let r=[];for(let i of di){let a=n[i]??{};for(let[n,o]of Object.entries(a))o?.startsWith(`git@github.com:`)&&(a[n]=bi(e,t,n),r.push(`${i}.${n}`))}return console.info(`Rewrote private GitHub dependencies:`,r.join(`, `)||`none`),r}function bi(e,n,r){let i=t.join(e,`@willbooster`,xi(r)),a=t.relative(n,i);return a.startsWith(`.`)?a:`./${a}`}function xi(e){return e.replace(/^@willbooster\//,``)}async function Si(n){let r=Ci();await e.promises.mkdir(n,{recursive:!0});for(let i of await e.promises.readdir(r,{withFileTypes:!0})){if(!i.isFile()||!i.name.endsWith(`.sh`))continue;let a=t.join(n,i.name);await e.promises.copyFile(t.join(r,i.name),a),await e.promises.chmod(a,493)}console.info(`Generated Docker shell scripts: ${t.relative(process.cwd(),n)||n}`)}function Ci(){let n=t.dirname(w(import.meta.url));for(;;){let r=t.join(n,`docker`,`bash`);if(e.existsSync(r))return r;let i=t.dirname(n);if(i===n)throw Error(`Docker shell scripts directory not found.`);n=i}}function wi(e,t){if(e.outside)return Ti(t);let n=Object.keys(t.devDependencies??{});return delete t.devDependencies,console.info(`Removed all devDependencies.`),n}function Ti(e){let t=e.devDependencies??{},n=[`artillery`,`biome`,`concurrently`,`conventional-changelog-conventionalcommits`,`eslint`,`husky`,`imagemin`,`jest`,`kill-port`,`lint-staged`,`open-cli`,`oxfmt`,`oxlint`,`playwright`,`prettier`,`pinst`,`railway`,`semantic-release`,`sort-package-json`,`wait-on`,`vitest`],r=[];for(let e of Object.keys(t))(n.some(t=>e.includes(t))||e.includes(`willbooster`)&&e.includes(`config`))&&(delete t[e],r.push(e));return console.info(`Removed devDependencies:`,r.join(`, `)||`none`),r}function Ei(e,t){let n=[`check`,`deploy`,`format`,`lint`,`start`,`test`],r=[`pinst `,`husky `],i=e.scripts??{},a=[];for(let[e,o]of Object.entries(i))(t.removeWbPostinstall&&e===`postinstall`&&o.trim()===`wb gen-code`||n.some(t=>e.startsWith(t))||r.some(e=>o.includes(e)||o.trim()===e.trim()))&&(delete i[e],a.push(e));console.info(`Removed scripts:`,a.join(`, `)||`none`)}function Di(e){delete e.private,delete e.publishConfig,delete e.prettier}async function Oi(e){for(let t of e)await ki(t),await Mi(t),Ji(t)}async function ki(e){let t=[...await Ai(e),...await ji(e)];console.info(`Removed Docker build caches:`,t.join(`, `)||`none`)}async function Ai(n){let r=[];for(let i of pi){let a=t.join(n.dirPath,i);e.existsSync(a)&&(await e.promises.rm(a,{force:!0,recursive:!0}),r.push(i))}return r}async function ji(n){let r=await p(mi,{cwd:n.dirPath,dot:!0,followSymbolicLinks:!1,ignore:[`**/node_modules`,`**/node_modules/**`,`**/.yarn`,`**/.yarn/**`,`**/.git`,`**/.git/**`],onlyFiles:!1});return await Promise.all(r.map(r=>e.promises.rm(t.join(n.dirPath,r),{force:!0,recursive:!0}))),r}async function Mi(e){let t=(await Promise.all([Ni(e),Fi(e)])).flat();console.info(`Removed generated local data:`,t.join(`, `)||`none`)}async function Ni(n){let r=Pi(n),i=[];for(let a of r){let r=t.join(n.dirPath,a);e.existsSync(r)&&(await e.promises.rm(r,{force:!0,recursive:!0}),i.push(a))}return i}function Pi(e){let n=hi.map(e=>t.join(e,`mount`)),r=Ke(e);if(!r)return n;let i=t.dirname(r);if(t.basename(i)!==`mount`||!Ui(e,i))return n;let a=t.relative(e.dirPath,i);return a?[...new Set([...n,a])]:n}async function Fi(e){return(await Promise.all([Ii(e),Ri(e)])).flat()}async function Ii(e){let t=await Li(e);return(await Promise.all(t.map(t=>qi(e,t)))).flat()}async function Li(e){let n=hi.map(n=>t.join(e.dirPath,n)),r=await Promise.all(n.map(e=>Ki(e)));return n.filter((e,t)=>r[t])}async function Ri(n){let r=zi(n),i=[];for(let a of r)for(let r of Hi(a))await Gi(r)&&(await e.promises.rm(r,{force:!0}),i.push(t.relative(n.dirPath,r)));return i}function zi(e){let n=Ge(e),r=Ke(e);if(!n||!r)return[];let i=t.isAbsolute(n)?[n]:[r,...hi.map(r=>t.resolve(e.dirPath,r,n))];return[...new Set(i)].filter(t=>Bi(e,t))}function Bi(e,t){return Ui(e,t)||Vi(e,t)}function Vi(e,n){return Wi(e)?gi.some(e=>{let r=t.relative(e,n);return r!==``&&r!==`..`&&!r.startsWith(`../`)}):!1}function Hi(e){return[e,`${e}-journal`,`${e}-shm`,`${e}-wal`,`${e}.journal`,`${e}.shm`,`${e}.wal`]}function Ui(e,n){let r=t.relative(e.dirPath,n);return r===``||r!==`..`&&!r.startsWith(`..${t.sep}`)}function Wi(e){return!!e.env.WB_DOCKER&&e.env.WB_DOCKER!==`0`&&e.env.WB_DOCKER!==`false`}async function Gi(t){try{return(await e.promises.stat(t)).isFile()}catch{return!1}}async function Ki(t){try{return(await e.promises.stat(t)).isDirectory()}catch{return!1}}async function qi(n,r){let i=(await e.promises.readdir(r,{withFileTypes:!0})).filter(e=>e.isFile()&&fi.test(e.name)).map(e=>e.name);await Promise.all(i.map(n=>e.promises.rm(t.join(r,n),{force:!0})));let a=t.relative(n.dirPath,r);return i.map(e=>t.join(a,e))}function Ji(r){if(!Wi(r))return;let i=t.join(r.dirPath,`bash`,`cleanup.sh`);if(e.existsSync(i)&&n.spawnSync(`bash`,[i,`--keep-scripts`],{cwd:r.dirPath,stdio:`inherit`}).status!==0)throw Error(`Failed to run ${t.relative(r.dirPath,i)}`)}const J={},Yi={command:`prisma`,aliases:[`db`],describe:`Run database commands. Use '--' to stop wb option parsing and forward the remaining arguments to Prisma. Drizzle projects use drizzle-kit. Example: wb prisma migrate-dev -- --name init`,builder:e=>e.parserConfiguration({"populate--":!0}).command(Xi).command(Zi).command(Qi).command($i).command(ea).command(na).command(ra).command(sa).command(ca).command(la).command(ua).command(da).command(fa).demandCommand().strict(!1),handler(){}},Xi={command:`cleanup-litestream`,describe:`Clean up temporal Litestream files`,builder:J,async handler(e){let t=await X(e);for(let{orm:n,project:r}of Q(`db cleanup-litestream`,t))await H(Z(n).cleanUpLitestream(r),r,e)}},Zi={command:`create-litestream-config`,describe:`Create Litestream configuration file`,builder:{...J,output:{description:`Output path of the Litestream configuration file.`,type:`string`,default:`/etc/litestream.yml`}},async handler(e){let t=await X(e);if(t.length>1)throw Error(`Creating Litestream configuration for multiple projects at once is not supported because they would overwrite each other.`);for(let{orm:n,project:r}of Q(`db create-litestream-config`,t))pa(r,n,e.output)}},Qi={command:`deploy`,describe:`Apply migration to DB without initializing it`,builder:J,async handler(e){let t=await X(e),n=ga(e);for(let{orm:r,project:i}of Q(`db deploy`,t))await H(Y(r,i,Z(r).deploy(i,n)),i,e)}},$i={command:`deploy-force`,describe:`Force to apply migration to DB utilizing Litestream's backup without initializing it`,builder:J,async handler(e){let t=await X(e);for(let{orm:n,project:r}of Q(`db deploy-force`,t))await H(Z(n).deployForce(r),r,e)}},ea={command:`generate`,describe:`Generate ORM client code`,builder:J,async handler(e){let t=await X(e),n=ga(e);for(let{orm:r,project:i}of Q(`db generate`,t))await H(Z(r).generate(i,n),i,e)}},ta={...J,config:{description:`Path of the Litestream configuration file.`,type:`string`}},na={command:`list-backups`,describe:`List Litestream backups`,builder:ta,async handler(e){let t=await X(e);for(let{orm:n,project:r}of Q(`db list-backups`,t))await H(Z(n).listBackups(r,e.config),r,e)}},ra={command:`migrate`,describe:`Apply migration to DB with initializing it`,builder:{...J,"check-idempotency":{description:`Run the migration command twice to confirm it is idempotent.`,type:`boolean`}},async handler(e){let t=await X(e),n=ga(e,[`check-idempotency`]);for(let{orm:r,project:i}of Q(`db migrate`,t)){let t=Z(r);await H(Y(r,i,t.migrate(i,n)),i,e),ia(i,e.checkIdempotency)&&(oa(i)?console.info(f.yellow(`Skipping idempotency check for ${i.name} in production environment.`)):await H(Y(r,i,t.deploy(i,n)),i,e))}}};function ia(e,t){return t??aa(e)}function aa(e){return!!e.env.WB_DOCKER&&e.env.WB_DOCKER!==`0`&&e.env.WB_DOCKER!==`false`}function oa(e){return qe(e,`production`)}const sa={command:`migrate-dev`,describe:`Create a migration file`,builder:J,async handler(e){let t=await X(e),n=ga(e);for(let{orm:r,project:i}of Q(`db migrate-dev`,t))await H(Z(r).migrateDev(i,n),i,e)}},ca={command:`reset`,describe:`Reset DB`,builder:J,async handler(e){let t=await X(e),n=ga(e);for(let{orm:r,project:i}of Q(`db reset`,t))await H(Y(r,i,Z(r).reset(i,n)),i,e);if(process.env.WB_ENV!==`test`){process.env.WB_ENV=`test`;for(let{orm:t,project:r}of Q(`WB_ENV=test db reset`,await X(e)))await H(Y(t,r,Z(t).reset(r,n)),r,e)}}},la={command:`restore`,describe:`Restore DB from Litestream's backup`,builder:{...ta,output:{description:`Output path of the restored database. Defaults to "<db|drizzle|prisma>/restored.sqlite3".`,type:`string`}},async handler(e){let t=await X(e);for(let{orm:n,project:r}of Q(`db restore`,t)){let t=e.output??ma(r,n);await H(Z(n).restore(r,t,e.config),r,e)}}},ua={command:`seed`,describe:`Populate DB with seed data`,builder:{...J,file:{alias:`f`,description:`Path of the seed script.`,type:`string`}},async handler(e){let t=await X(e);for(let{orm:n,project:r}of Q(`db seed`,t))await H(Y(n,r,Z(n).seed(r,e.file)),r,e)}},da={command:`studio [db-url-or-path]`,describe:`Open database studio`,builder:{...J,"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 Error(`You cannot specify both --restored and --db-url-or-path.`);let t=await X(e),n=ga(e,[`db-url-or-path`,`restored`]);for(let{orm:r,project:i}of Q(`db studio`,t)){let t=e.restored?i.packageJson.dependencies?.blitz?`db/restored.sqlite3`:`prisma/restored.sqlite3`:e.dbUrlOrPath?.toString();await H(Y(r,i,Z(r).studio(i,t,n)),i,e)}}},fa={command:`$0 <args..>`,describe:`Pass the command and arguments to the detected ORM as is. Additional Prisma flags can also be forwarded after '--'.`,builder:{args:{type:`array`}},async handler(e){let t=await X(e),n=[(e.args?.join(` `)??``).trimEnd(),ga(e,[`args`])].filter(Boolean).join(` `);for(let{orm:r,project:i}of Q(`db ${n}`,t))await H(Y(r,i,r===`prisma`?`PRISMA ${n}`:Ut(i,n)),i,e)}};function Y(e,t,n){return e===`drizzle`?Ft(t,n):n}function pa(t,n,r){let i=ha(t,n),a={CLOUDFLARE_R2_LITESTREAM_ACCOUNT_ID:t.env.CLOUDFLARE_R2_LITESTREAM_ACCOUNT_ID,CLOUDFLARE_R2_LITESTREAM_BUCKET_NAME:t.env.CLOUDFLARE_R2_LITESTREAM_BUCKET_NAME,CLOUDFLARE_R2_LITESTREAM_ACCESS_KEY_ID:t.env.CLOUDFLARE_R2_LITESTREAM_ACCESS_KEY_ID,CLOUDFLARE_R2_LITESTREAM_SECRET_ACCESS_KEY:t.env.CLOUDFLARE_R2_LITESTREAM_SECRET_ACCESS_KEY},o=Object.entries(a).filter(([,e])=>!e).map(([e])=>e);if(o.length>0)throw Error(`Missing environment variables for Litestream: ${o.join(`, `)}`);let s=`snapshot:
|
|
75
|
+
</html>`)})}async function gi(e,t,n){await new Promise((r,i)=>{let a=t=>{e.off(`listening`,o),i(t)},o=()=>{e.off(`error`,a),e.on(`error`,n),r()};e.once(`error`,a),e.once(`listening`,o),e.listen(t,`0.0.0.0`)})}async function _i(e){await new Promise(t=>{let n=()=>{process.off(`SIGINT`,n),process.off(`SIGTERM`,n),process.off(`SIGQUIT`,n),(async()=>{try{await vi(e)}catch(e){console.error(f.red(`Failed to close maintenance server: ${e.message}`))}finally{t()}})()};process.once(`SIGINT`,n),process.once(`SIGTERM`,n),process.once(`SIGQUIT`,n)})}async function vi(e){await new Promise((t,n)=>{e.close(e=>{if(e){if(e.code===`ERR_SERVER_NOT_RUNNING`){t();return}n(e);return}t()}),e.closeAllConnections()})}async function yi(e,n){let r=Ci(e,n);return await y.mkdir(t.dirname(r),{recursive:!0}),await y.writeFile(r,`${process.pid}\n`,`utf8`),r}async function bi(e,t){let n=Ci(e,t),r=await Si(n);if(r!==void 0&&r!==process.pid){try{I(r,`SIGTERM`)}catch{}await ti(r)}await xi(n,r)}async function xi(e,t){t!==void 0&&await Si(e)!==t||await y.rm(e,{force:!0})}async function Si(e){try{let t=await y.readFile(e,`utf8`),n=Number(t.trim());return Number.isInteger(n)&&n>0?n:void 0}catch{return}}function Ci(e,t){return wi(e.rootDirPath,t)}function wi(e,n){return t.join(e,`.wb`,`maintenance-${n}.pid`)}const Ti=`@willbooster-private`,Ei=[`git:`,`git+`,`git@`,`file:`,`link:`,`workspace:`,`http:`,`https:`,`portal:`,`patch:`],Di=/^git@github\.com:(?:WillBooster|WillBoosterLab)\/[^/#]+(?:\.git)?(?:#.*)?$/;function Oi(e){return typeof e==`string`&&Di.test(e)}function ki(e,t){return e.startsWith(`@willbooster-private/`)&&typeof t==`string`&&!Ei.some(e=>t.startsWith(e))}function Ai(n){let r={};for(let i of[t.join(m.homedir(),`.npmrc`),t.join(n,`.npmrc`)])try{Object.assign(r,ji(e.readFileSync(i,`utf8`)))}catch{}let i=r[`${Ti}:registry`]?.replace(/\/+$/,``);if(!i)return;let a=`${i.replace(/^https?:/,``).replace(/\/+$/,``)}/`,o,s=-1;for(let[e,t]of Object.entries(r)){if(!e.endsWith(`:_authToken`)||!t)continue;let n=`${e.slice(0,-11).replace(/\/+$/,``)}/`;a.startsWith(n)&&n.length>s&&(s=n.length,o=t)}return{registryUrl:i,authToken:o??process.env.VERDACCIO_TOKEN}}function ji(e){let t={};for(let n of e.split(`
|
|
76
|
+
`)){let e=n.trim();if(!e||e.startsWith(`#`)||e.startsWith(`;`))continue;let r=e.indexOf(`=`);if(r<=0)continue;let i=e.slice(0,r).trim();t[i]=e.slice(r+1).trim().replaceAll(/\$\{([^}]+)\}/g,(e,t)=>process.env[t]??``)}return t}async function Mi(r,i,a,o){let s=await Ni(r,i,a),c=(await Pi(r,`${r.registryUrl}/${Li(i)}/${s}`)).dist?.tarball;if(!c)throw Error(`No tarball URL for ${i}@${s} in ${r.registryUrl}.`);let l=await Fi(r,c),u=t.join(await e.promises.mkdtemp(t.join(m.tmpdir(),`wb-private-package-`)),`package.tgz`);try{if(await e.promises.writeFile(u,Buffer.from(await l.arrayBuffer())),await e.promises.rm(o,{force:!0,recursive:!0}),await e.promises.mkdir(o,{recursive:!0}),n.spawnSync(`tar`,[`-xzf`,u,`-C`,o,`--strip-components=1`],{stdio:`inherit`}).status!==0)throw Error(`Failed to extract ${i}@${s} (${c}).`)}finally{await e.promises.rm(t.dirname(u),{force:!0,recursive:!0})}}async function Ni(e,t,n){let r=Bi(n);if(r)return r;let i=(await Pi(e,`${e.registryUrl}/${Li(t)}`))[`dist-tags`]?.[n===`*`?`latest`:n];if(!i)throw Error(`Cannot resolve ${t}@${n}; use an exact version, a ^/~ range, or a dist-tag.`);return i}async function Pi(e,t){return await(await Fi(e,t)).json()}async function Fi(e,t){let n=!!e.authToken&&Ii(t,e.registryUrl),r=await fetch(t,{headers:n?{authorization:`Bearer ${e.authToken}`}:{}});if(!r.ok)throw Error(`Failed to fetch ${t}: ${r.status} ${r.statusText}`);return r}function Ii(e,t){try{return new URL(e).origin===new URL(t).origin}catch{return!1}}function Li(e){return e.replace(`/`,`%2F`)}const Ri=/^(?:0|[1-9]\d*)\.(?:0|[1-9]\d*)\.(?:0|[1-9]\d*)(?:-(?:0|[1-9]\d*|\d*[a-zA-Z-][0-9a-zA-Z-]*)(?:\.(?:0|[1-9]\d*|\d*[a-zA-Z-][0-9a-zA-Z-]*))*)?(?:\+[0-9a-zA-Z-]+(?:\.[0-9a-zA-Z-]+)*)?$/;function zi(e){return!!e&&Ri.test(e)}function Bi(e){if(!e)return;let t=e.replace(/^[\^~]/,``);return Ri.test(t)?t:void 0}function Vi(e,t){let n=e.replace(/^[\^~]/,``).split(`+`)[0],r=t.split(`+`)[0];if(n.includes(`-`)||r.includes(`-`))return!1;let i=Hi(n),a=Hi(r);return!i||!a?!1:e.startsWith(`^`)?i[0]===0?i[1]===0?Ui(a,i)===0:a[0]===0&&a[1]===i[1]&&Ui(a,i)>=0:a[0]===i[0]&&Ui(a,i)>=0:e.startsWith(`~`)?a[0]===i[0]&&a[1]===i[1]&&Ui(a,i)>=0:!1}function Hi(e){let t=/^(\d+)\.(\d+)\.(\d+)$/.exec(e);return t?[Number(t[1]),Number(t[2]),Number(t[3])]:void 0}function Ui(e,t){for(let n=0;n<3;n++)if(e[n]!==t[n])return e[n]-t[n];return 0}function*Wi(e,t){for(let n of t)console.info(`Running "${e}" for ${n.name} ...`),yield n}const Gi=[`dependencies`,`devDependencies`,`optionalDependencies`,`peerDependencies`],Ki=/\.(?:sqlite3?|db)(?:[-.](?:journal|shm|wal))?$/i,qi=[`.cache`,`.mypy_cache`,`.next/cache`,`.parcel-cache`,`.pytest_cache`,`.ruff_cache`,`.tox`,`.turbo`,`.venv`,`.yarn/cache`,`.yarn/install-state.gz`,`__pycache__`,`coverage`,`node_modules/.cache`,`playwright-report`,`storybook-static`,`target`,`test-results`],Ji=[`**/*.pyc`,`**/*.tsbuildinfo`,`**/__pycache__`],Yi=[`prisma`,`db`,`drizzle`],Xi=[`/data`],Zi={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(r){let i=await H(r);i||(console.error(f.red(`No project found.`)),process.exit(1));let a=[];for(let n of Wi(`optimizeForDockerBuild`,i.descendants)){let i=n.packageJson;Qi(n,i);let o=aa(r,i);if(sa(i,{removeWbPostinstall:!r.outside&&o.includes(`@willbooster/wb`)}),ca(i),r.dryRun)continue;let s=r.outside?t.join(n.dirPath,`dist`):n.dirPath;await e.promises.mkdir(s,{recursive:!0}),await e.promises.writeFile(t.join(s,`package.json`),JSON.stringify(i),`utf8`),r.outside&&await ra(t.join(s,`bash`)),a.push(n)}!r.dryRun&&!r.outside&&(n.spawnSync(i.root.packageManagerCommand,[`install`],{stdio:`inherit`}),console.info(`Installed dependencies.`),await la(a))}};function Qi(e,t){return $i(e.rootDirPath,e.dirPath,t)}function $i(e,t,n){let r=[];for(let i of Gi){let a=n[i]??{};for(let[n,o]of Object.entries(a))if(Oi(o))a[n]=ea(e,t,`@willbooster`,n),r.push(`${i}.${n}`);else if(ki(n,o)){let s=na(e,n);if(s===void 0){console.warn(f.yellow(`${n} is not materialized under ${Ti}/; run \`wb setup-private-packages\` so the Docker build does not need registry credentials.`));continue}let c=Bi(o);c!==void 0&&s!==c&&!Vi(o,s)&&(console.error(f.red(`Materialized ${n} is ${s} but package.json requires ${o}; rerun \`wb setup-private-packages\`.`)),process.exit(1)),a[n]=ea(e,t,Ti,n),r.push(`${i}.${n}`)}}return console.info(`Rewrote private dependencies:`,r.join(`, `)||`none`),r}function ea(e,n,r,i){let a=t.join(e,r,ta(i)),o=t.relative(n,a);return o.startsWith(`.`)?o:`./${o}`}function ta(e){return e.replace(/^@willbooster(?:-private)?\//,``)}function na(n,r){let i=t.join(n,Ti,ta(r),`package.json`);try{return JSON.parse(e.readFileSync(i,`utf8`)).version}catch{return}}async function ra(n){let r=ia();await e.promises.mkdir(n,{recursive:!0});for(let i of await e.promises.readdir(r,{withFileTypes:!0})){if(!i.isFile()||!i.name.endsWith(`.sh`))continue;let a=t.join(n,i.name);await e.promises.copyFile(t.join(r,i.name),a),await e.promises.chmod(a,493)}console.info(`Generated Docker shell scripts: ${t.relative(process.cwd(),n)||n}`)}function ia(){let n=t.dirname(w(import.meta.url));for(;;){let r=t.join(n,`docker`,`bash`);if(e.existsSync(r))return r;let i=t.dirname(n);if(i===n)throw Error(`Docker shell scripts directory not found.`);n=i}}function aa(e,t){if(e.outside)return oa(t);let n=Object.keys(t.devDependencies??{});return delete t.devDependencies,console.info(`Removed all devDependencies.`),n}function oa(e){let t=e.devDependencies??{},n=[`artillery`,`biome`,`concurrently`,`conventional-changelog-conventionalcommits`,`eslint`,`husky`,`imagemin`,`jest`,`kill-port`,`lint-staged`,`open-cli`,`oxfmt`,`oxlint`,`playwright`,`prettier`,`pinst`,`railway`,`semantic-release`,`sort-package-json`,`wait-on`,`vitest`],r=[];for(let e of Object.keys(t))(n.some(t=>e.includes(t))||e.includes(`willbooster`)&&e.includes(`config`))&&(delete t[e],r.push(e));return console.info(`Removed devDependencies:`,r.join(`, `)||`none`),r}function sa(e,t){let n=[`check`,`deploy`,`format`,`lint`,`start`,`test`],r=[`pinst `,`husky `],i=e.scripts??{},a=[];for(let[e,o]of Object.entries(i))(t.removeWbPostinstall&&e===`postinstall`&&o.trim()===`wb gen-code`||n.some(t=>e.startsWith(t))||r.some(e=>o.includes(e)||o.trim()===e.trim()))&&(delete i[e],a.push(e));console.info(`Removed scripts:`,a.join(`, `)||`none`)}function ca(e){delete e.private,delete e.publishConfig,delete e.prettier}async function la(e){for(let t of e)await ua(t),await pa(t),ka(t)}async function ua(e){let t=[...await da(e),...await fa(e)];console.info(`Removed Docker build caches:`,t.join(`, `)||`none`)}async function da(n){let r=[];for(let i of qi){let a=t.join(n.dirPath,i);e.existsSync(a)&&(await e.promises.rm(a,{force:!0,recursive:!0}),r.push(i))}return r}async function fa(n){let r=await p(Ji,{cwd:n.dirPath,dot:!0,followSymbolicLinks:!1,ignore:[`**/node_modules`,`**/node_modules/**`,`**/.yarn`,`**/.yarn/**`,`**/.git`,`**/.git/**`],onlyFiles:!1});return await Promise.all(r.map(r=>e.promises.rm(t.join(n.dirPath,r),{force:!0,recursive:!0}))),r}async function pa(e){let t=(await Promise.all([ma(e),ga(e)])).flat();console.info(`Removed generated local data:`,t.join(`, `)||`none`)}async function ma(n){let r=ha(n),i=[];for(let a of r){let r=t.join(n.dirPath,a);e.existsSync(r)&&(await e.promises.rm(r,{force:!0,recursive:!0}),i.push(a))}return i}function ha(e){let n=Yi.map(e=>t.join(e,`mount`)),r=qe(e);if(!r)return n;let i=t.dirname(r);if(t.basename(i)!==`mount`||!wa(e,i))return n;let a=t.relative(e.dirPath,i);return a?[...new Set([...n,a])]:n}async function ga(e){return(await Promise.all([_a(e),ya(e)])).flat()}async function _a(e){let t=await va(e);return(await Promise.all(t.map(t=>Oa(e,t)))).flat()}async function va(e){let n=Yi.map(n=>t.join(e.dirPath,n)),r=await Promise.all(n.map(e=>Da(e)));return n.filter((e,t)=>r[t])}async function ya(n){let r=ba(n),i=[];for(let a of r)for(let r of Ca(a))await Ea(r)&&(await e.promises.rm(r,{force:!0}),i.push(t.relative(n.dirPath,r)));return i}function ba(e){let n=Ke(e),r=qe(e);if(!n||!r)return[];let i=t.isAbsolute(n)?[n]:[r,...Yi.map(r=>t.resolve(e.dirPath,r,n))];return[...new Set(i)].filter(t=>xa(e,t))}function xa(e,t){return wa(e,t)||Sa(e,t)}function Sa(e,n){return Ta(e)?Xi.some(e=>{let r=t.relative(e,n);return r!==``&&r!==`..`&&!r.startsWith(`../`)}):!1}function Ca(e){return[e,`${e}-journal`,`${e}-shm`,`${e}-wal`,`${e}.journal`,`${e}.shm`,`${e}.wal`]}function wa(e,n){let r=t.relative(e.dirPath,n);return r===``||r!==`..`&&!r.startsWith(`..${t.sep}`)}function Ta(e){return!!e.env.WB_DOCKER&&e.env.WB_DOCKER!==`0`&&e.env.WB_DOCKER!==`false`}async function Ea(t){try{return(await e.promises.stat(t)).isFile()}catch{return!1}}async function Da(t){try{return(await e.promises.stat(t)).isDirectory()}catch{return!1}}async function Oa(n,r){let i=(await e.promises.readdir(r,{withFileTypes:!0})).filter(e=>e.isFile()&&Ki.test(e.name)).map(e=>e.name);await Promise.all(i.map(n=>e.promises.rm(t.join(r,n),{force:!0})));let a=t.relative(n.dirPath,r);return i.map(e=>t.join(a,e))}function ka(r){if(!Ta(r))return;let i=t.join(r.dirPath,`bash`,`cleanup.sh`);if(e.existsSync(i)&&n.spawnSync(`bash`,[i,`--keep-scripts`],{cwd:r.dirPath,stdio:`inherit`}).status!==0)throw Error(`Failed to run ${t.relative(r.dirPath,i)}`)}const Y={},Aa={command:`prisma`,aliases:[`db`],describe:`Run database commands. Use '--' to stop wb option parsing and forward the remaining arguments to Prisma. Drizzle projects use drizzle-kit. Example: wb prisma migrate-dev -- --name init`,builder:e=>e.parserConfiguration({"populate--":!0}).command(ja).command(Ma).command(Na).command(Pa).command(Fa).command(La).command(Ra).command(Ha).command(Ua).command(Wa).command(Ga).command(Ka).command(qa).demandCommand().strict(!1),handler(){}},ja={command:`cleanup-litestream`,describe:`Clean up temporal Litestream files`,builder:Y,async handler(e){let t=await X(e);for(let{orm:n,project:r}of Q(`db cleanup-litestream`,t))await U(Z(n).cleanUpLitestream(r),r,e)}},Ma={command:`create-litestream-config`,describe:`Create Litestream configuration file`,builder:{...Y,output:{description:`Output path of the Litestream configuration file.`,type:`string`,default:`/etc/litestream.yml`}},async handler(e){let t=await X(e);if(t.length>1)throw Error(`Creating Litestream configuration for multiple projects at once is not supported because they would overwrite each other.`);for(let{orm:n,project:r}of Q(`db create-litestream-config`,t))Ya(r,n,e.output)}},Na={command:`deploy`,describe:`Apply migration to DB without initializing it`,builder:Y,async handler(e){let t=await X(e),n=Qa(e);for(let{orm:r,project:i}of Q(`db deploy`,t))await U(Ja(r,i,Z(r).deploy(i,n)),i,e)}},Pa={command:`deploy-force`,describe:`Force to apply migration to DB utilizing Litestream's backup without initializing it`,builder:Y,async handler(e){let t=await X(e);for(let{orm:n,project:r}of Q(`db deploy-force`,t))await U(Z(n).deployForce(r),r,e)}},Fa={command:`generate`,describe:`Generate ORM client code`,builder:Y,async handler(e){let t=await X(e),n=Qa(e);for(let{orm:r,project:i}of Q(`db generate`,t))await U(Z(r).generate(i,n),i,e)}},Ia={...Y,config:{description:`Path of the Litestream configuration file.`,type:`string`}},La={command:`list-backups`,describe:`List Litestream backups`,builder:Ia,async handler(e){let t=await X(e);for(let{orm:n,project:r}of Q(`db list-backups`,t))await U(Z(n).listBackups(r,e.config),r,e)}},Ra={command:`migrate`,describe:`Apply migration to DB with initializing it`,builder:{...Y,"check-idempotency":{description:`Run the migration command twice to confirm it is idempotent.`,type:`boolean`}},async handler(e){let t=await X(e),n=Qa(e,[`check-idempotency`]);for(let{orm:r,project:i}of Q(`db migrate`,t)){let t=Z(r);await U(Ja(r,i,t.migrate(i,n)),i,e),za(i,e.checkIdempotency)&&(Va(i)?console.info(f.yellow(`Skipping idempotency check for ${i.name} in production environment.`)):await U(Ja(r,i,t.deploy(i,n)),i,e))}}};function za(e,t){return t??Ba(e)}function Ba(e){return!!e.env.WB_DOCKER&&e.env.WB_DOCKER!==`0`&&e.env.WB_DOCKER!==`false`}function Va(e){return Je(e,`production`)}const Ha={command:`migrate-dev`,describe:`Create a migration file`,builder:Y,async handler(e){let t=await X(e),n=Qa(e);for(let{orm:r,project:i}of Q(`db migrate-dev`,t))await U(Z(r).migrateDev(i,n),i,e)}},Ua={command:`reset`,describe:`Reset DB`,builder:Y,async handler(e){let t=await X(e),n=Qa(e);for(let{orm:r,project:i}of Q(`db reset`,t))await U(Ja(r,i,Z(r).reset(i,n)),i,e);if(process.env.WB_ENV!==`test`){process.env.WB_ENV=`test`;for(let{orm:t,project:r}of Q(`WB_ENV=test db reset`,await X(e)))await U(Ja(t,r,Z(t).reset(r,n)),r,e)}}},Wa={command:`restore`,describe:`Restore DB from Litestream's backup`,builder:{...Ia,output:{description:`Output path of the restored database. Defaults to "<db|drizzle|prisma>/restored.sqlite3".`,type:`string`}},async handler(e){let t=await X(e);for(let{orm:n,project:r}of Q(`db restore`,t)){let t=e.output??Xa(r,n);await U(Z(n).restore(r,t,e.config),r,e)}}},Ga={command:`seed`,describe:`Populate DB with seed data`,builder:{...Y,file:{alias:`f`,description:`Path of the seed script.`,type:`string`}},async handler(e){let t=await X(e);for(let{orm:n,project:r}of Q(`db seed`,t))await U(Ja(n,r,Z(n).seed(r,e.file)),r,e)}},Ka={command:`studio [db-url-or-path]`,describe:`Open database studio`,builder:{...Y,"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 Error(`You cannot specify both --restored and --db-url-or-path.`);let t=await X(e),n=Qa(e,[`db-url-or-path`,`restored`]);for(let{orm:r,project:i}of Q(`db studio`,t)){let t=e.restored?i.packageJson.dependencies?.blitz?`db/restored.sqlite3`:`prisma/restored.sqlite3`:e.dbUrlOrPath?.toString();await U(Ja(r,i,Z(r).studio(i,t,n)),i,e)}}},qa={command:`$0 <args..>`,describe:`Pass the command and arguments to the detected ORM as is. Additional Prisma flags can also be forwarded after '--'.`,builder:{args:{type:`array`}},async handler(e){let t=await X(e),n=[(e.args?.join(` `)??``).trimEnd(),Qa(e,[`args`])].filter(Boolean).join(` `);for(let{orm:r,project:i}of Q(`db ${n}`,t))await U(Ja(r,i,r===`prisma`?`PRISMA ${n}`:Xt(i,n)),i,e)}};function Ja(e,t,n){return e===`drizzle`?Ht(t,n):n}function Ya(t,n,r){let i=Za(t,n),a={CLOUDFLARE_R2_LITESTREAM_ACCOUNT_ID:t.env.CLOUDFLARE_R2_LITESTREAM_ACCOUNT_ID,CLOUDFLARE_R2_LITESTREAM_BUCKET_NAME:t.env.CLOUDFLARE_R2_LITESTREAM_BUCKET_NAME,CLOUDFLARE_R2_LITESTREAM_ACCESS_KEY_ID:t.env.CLOUDFLARE_R2_LITESTREAM_ACCESS_KEY_ID,CLOUDFLARE_R2_LITESTREAM_SECRET_ACCESS_KEY:t.env.CLOUDFLARE_R2_LITESTREAM_SECRET_ACCESS_KEY},o=Object.entries(a).filter(([,e])=>!e).map(([e])=>e);if(o.length>0)throw Error(`Missing environment variables for Litestream: ${o.join(`, `)}`);let s=`snapshot:
|
|
70
77
|
interval: 24h # Create a backup per day
|
|
71
78
|
retention: 72h # Keep backups for 3 days
|
|
72
79
|
dbs:
|
|
@@ -80,26 +87,26 @@ dbs:
|
|
|
80
87
|
access-key-id: ${a.CLOUDFLARE_R2_LITESTREAM_ACCESS_KEY_ID}
|
|
81
88
|
secret-access-key: ${a.CLOUDFLARE_R2_LITESTREAM_SECRET_ACCESS_KEY}
|
|
82
89
|
sync-interval: 1m
|
|
83
|
-
`;try{e.writeFileSync(r,s),console.info(`Generated ${r}`)}catch(e){let t=e instanceof Error?e.message:String(e);throw Error(`Failed to write ${r}: ${t}`,{cause:e})}}function ma(e,t){return t===`prisma`?e.packageJson.dependencies?.blitz?`db/restored.sqlite3`:`prisma/restored.sqlite3`:`drizzle/restored.sqlite3`}function ha(e,t){if(t===`prisma`)return`${e.packageJson.dependencies?.blitz?`db`:`prisma`}/mount/prod.sqlite3`;let n=Ke(e);if(!n)throw Error(`wb db create-litestream-config for Drizzle requires file: DATABASE_URL.`);return n}async function X(e,t){let n=await V(e);n||(console.error(f.red(`No project found.`)),process.exit(1));let r=n.descendants.map(e=>e.databaseOrm?{project:e,orm:e.databaseOrm}:void 0).filter(e=>!!e&&(!t||e.orm===t));return r.length===0&&(console.error(f.red(t?`No ${t} project found.`:`No supported database ORM project found.`)),process.exit(1)),r}function Z(e){return e===`prisma`?Pn:$t}function*Q(e,t){let n=new Map(t.map(e=>[e.project,e]));for(let r of ui(e,t.map(({project:e})=>e))){let e=n.get(r);if(!e)throw Error(`Failed to detect database ORM for ${r.name}.`);yield e}}function ga(e,t=[]){let n=[],r=Object.keys(pt),i=Object.values(pt).flatMap(e=>`alias`in e?Array.isArray(e.alias)?e.alias:[e.alias]:[]).map(String),a=new Set([...t,...r,...i,`--`,`_`,`$0`]);for(let[t,r]of Object.entries(e))if(!a.has(t)){let i=t.replaceAll(/[A-Z]/g,e=>`-${e.toLowerCase()}`);if(i!==t&&e[i]!==void 0)continue;if(typeof r==`boolean`&&r)n.push(`--${t}`);else if(typeof r==`string`||typeof r==`number`)n.push(`--${t}`,String(r));else if(Array.isArray(r))for(let e of r)n.push(`--${t}`,String(e))}let o=Array.isArray(e[`--`])?e[`--`].map(String):[];return G([...n,...o])}const _a={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){let t=B(e);t||(console.error(f.red(`No project found.`)),process.exit(1));let n=[e.command,...e.args??[],...e._.slice(1)].filter(Boolean),r=0;for(let i=0;i<e.retry;i++)if(i>0&&console.info(`\n${f.yellow(`#${i} Retrying: ${n.join(` `)}`)}`),r=await H(n.join(` `),t,e,{exitIfFailed:!1,onSignal:e=>{e&&process.exit(1)}}),r===0)return;process.exit(r)}},va={command:`setup`,describe:`Setup development environment. .env files are ignored.`,builder:{},async handler(e){await ya(e)}};async function ya(e,t){let r=await V(e,!1,t);r||(console.error(f.red(`No project found.`)),process.exit(1));for(let t of ui(`setup`,r.descendants)){let i=await y.readdir(t.dirPath,{withFileTypes:!0});if(t===r.root&&(m.platform()===`darwin`&&await U(`brew install ${[`pstree`].join(` `)}`,t,e),i.some(e=>e.isFile()&&e.name.includes(`-version`))&&await H(`asdf install`,t,e,{exitIfFailed:!1})),i.some(e=>e.isFile()&&e.name===`pyproject.toml`)){await U(`poetry config virtualenvs.in-project true`,t,e);let[,r]=n.execSync(`asdf current python`).toString().trim().split(/\s+/);await U(`poetry env use ${r}`,t,e),await ot.promiseAll(),await H(`poetry run pip install --upgrade pip`,t,e),await H(`poetry install --ansi`,t,e)}(t===r.root||!r.root.packageJson.scripts?.[`gen-code`])&&t.packageJson.scripts?.[`gen-code`]&&await H(`${t.packageManagerRunCommand} gen-code`,t,e)}let i=r.descendants.find(e=>e.packageJson.devDependencies?.playwright);i&&await H(`${i.packageManagerRunCommand} playwright install --with-deps`,i,e)}const ba=[`dependencies`,`devDependencies`,`optionalDependencies`,`peerDependencies`],xa=/^git@github\.com:(?:WillBooster|WillBoosterLab)\/[^/#]+(?:\.git)?(?:#.*)?$/,Sa={command:`setup-private-packages`,describe:`Copy private git dependencies for Docker builds`,builder:{"out-dir":{description:`Directory to copy private packages into`,type:`string`,default:`@willbooster`}},async handler(n){let r=Je(n,!1);r||(console.error(f.red(`No project found.`)),process.exit(1));let i=t.resolve(r.root.dirPath,n.outDir);wa(r.root.dirPath,i);let a=await Ca(r.root.dirPath,r.root.packageJson,i);if(n.dryRun){Na(i,a);return}await e.promises.rm(i,{recursive:!0,force:!0}),await e.promises.mkdir(i,{recursive:!0});for(let n of a.values())await e.promises.cp(n.sourceDirPath,n.targetDirPath,{recursive:!0,force:!0,filter:e=>{let r=t.relative(n.sourceDirPath,e).split(t.sep);return!r.includes(`node_modules`)&&!r.includes(`.git`)}}),console.info(`Copied ${n.name} to ${t.relative(r.root.dirPath,n.targetDirPath)}`);await Da(i,a)}};async function Ca(e,t,n){let r=new Map,i=Ea(t),a=new Set(i);for(let t=0;t<i.length;t++){let o=i[t];if(!o||r.has(o))continue;let s=Ta(e,n,o);r.set(o,s);for(let e of await ka(s.sourceDirPath)){let t=await Aa(e);for(let e of Ea(t))a.has(e)||(a.add(e),i.push(e))}}return r}function wa(e,n){let r=t.relative(e,n);r&&!r.startsWith(`..`)&&!t.isAbsolute(r)||(console.error(f.red(`Output directory must be a subdirectory of the project root: ${n}`)),process.exit(1))}function Ta(n,r,i){let a=Ma(i),o=t.join(n,`node_modules`,`@willbooster`,a);if(!e.existsSync(t.join(o,`package.json`)))throw Error(`Private package is not installed: ${i} (${o})`);return{name:i,sourceDirPath:o,targetDirPath:t.join(r,a)}}function Ea(e){let t=[];for(let n of ba){let r=e[n];if(r){for(let[e,n]of Object.entries(r))if(ja(n)){if(!e.startsWith(`@willbooster/`))throw Error(`Private git dependency must be an @willbooster package: ${e}`);t.push(e)}}}return[...new Set(t)]}async function Da(n,r){for(let i of r.values())for(let a of await ka(i.targetDirPath)){let i=await Aa(a);Oa(a,i,r)&&(await e.promises.writeFile(a,`${JSON.stringify(i,void 0,2)}\n`,`utf8`),console.info(`Rewrote private dependencies in ${t.relative(n,a)}`))}}function Oa(e,n,r){let i=!1;for(let a of ba){let o=n[a];if(o)for(let[n,a]of Object.entries(o)){if(!ja(a))continue;let s=r.get(n);s&&(o[n]=`file:${t.relative(t.dirname(e),s.targetDirPath)}`,i=!0)}}return i}async function ka(n){let r=[];for(let i of await e.promises.readdir(n,{withFileTypes:!0})){if(i.name===`node_modules`||i.name===`.git`)continue;let e=t.join(n,i.name);if(i.isDirectory()){r.push(...await ka(e));continue}i.isFile()&&i.name===`package.json`&&r.push(e)}return r}async function Aa(t){return JSON.parse(await e.promises.readFile(t,`utf8`))}function ja(e){return typeof e==`string`&&xa.test(e)}function Ma(e){return e.replace(/^@willbooster\//,``)}function Na(e,t){console.info(`[dry-run] Would recreate ${e}`);for(let e of t.values())console.info(`[dry-run] Would copy ${e.name}: ${e.sourceDirPath}`);console.info(`[dry-run] Would rewrite copied private git dependencies to file:../<name>`)}const Pa={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:[]}};function Fa(e){e.normalizedArgsText=[...e.args??[],...e._?.slice(1)??[],...e[`--`]??[]].map(e=>K(String(e))).join(` `),e.normalizedDockerOptionsText=(e.dockerOptions??[]).map(e=>K(String(e))).join(` `)}function Ia(e){return e.silent?` > /dev/null`:``}const $=new class{buildImage(e,n){let r=e.dockerPackageJson.scripts?.[`docker/build/prepare`]?`YARN run docker/build/prepare && `:``,i=e.env.MISE_AGE_KEY?`
|
|
90
|
+
`;try{e.writeFileSync(r,s),console.info(`Generated ${r}`)}catch(e){let t=e instanceof Error?e.message:String(e);throw Error(`Failed to write ${r}: ${t}`,{cause:e})}}function Xa(e,t){return t===`prisma`?e.packageJson.dependencies?.blitz?`db/restored.sqlite3`:`prisma/restored.sqlite3`:`drizzle/restored.sqlite3`}function Za(e,t){if(t===`prisma`)return`${e.packageJson.dependencies?.blitz?`db`:`prisma`}/mount/prod.sqlite3`;let n=qe(e);if(!n)throw Error(`wb db create-litestream-config for Drizzle requires file: DATABASE_URL.`);return n}async function X(e,t){let n=await H(e);n||(console.error(f.red(`No project found.`)),process.exit(1));let r=n.descendants.map(e=>e.databaseOrm?{project:e,orm:e.databaseOrm}:void 0).filter(e=>!!e&&(!t||e.orm===t));return r.length===0&&(console.error(f.red(t?`No ${t} project found.`:`No supported database ORM project found.`)),process.exit(1)),r}function Z(e){return e===`prisma`?Yn:hn}function*Q(e,t){let n=new Map(t.map(e=>[e.project,e]));for(let r of Wi(e,t.map(({project:e})=>e))){let e=n.get(r);if(!e)throw Error(`Failed to detect database ORM for ${r.name}.`);yield e}}function Qa(e,t=[]){let n=[],r=Object.keys(bt),i=Object.values(bt).flatMap(e=>`alias`in e?Array.isArray(e.alias)?e.alias:[e.alias]:[]).map(String),a=new Set([...t,...r,...i,`--`,`_`,`$0`]);for(let[t,r]of Object.entries(e))if(!a.has(t)){let i=t.replaceAll(/[A-Z]/g,e=>`-${e.toLowerCase()}`);if(i!==t&&e[i]!==void 0)continue;if(typeof r==`boolean`&&r)n.push(`--${t}`);else if(typeof r==`string`||typeof r==`number`)n.push(`--${t}`,String(r));else if(Array.isArray(r))for(let e of r)n.push(`--${t}`,String(e))}let o=Array.isArray(e[`--`])?e[`--`].map(String):[];return K([...n,...o])}const $a={command:`release [args..]`,describe:"Run semantic-release (or multi-semantic-release) so that repositories using Bun isolated installs can publish to npm: reinstall with the hoisted linker (npm cannot walk Bun's isolated node_modules layout), rewrite `workspace:` ranges npm cannot parse, run the release, then restore the modified files. Extra arguments (e.g. `--debug`, after `--`) are forwarded to the release command.",builder:e=>e.parserConfiguration({"populate--":!0}),async handler(e){await eo(e)}};async function eo(e,n){let r=Ye(e,!1,n);r||(console.error(f.red(`No project found.`)),process.exit(1));let i=r.root,a=new Map,o,s={current:void 0},c=e=>{o=e;try{s.current?.pid&&I(s.current.pid,e)}catch(t){console.error(f.red(`Failed to terminate the release child process tree: ${String(t)}`)),s.current?.kill(e)}},l=[`SIGINT`,`SIGTERM`];for(let e of l)process.on(e,c);let u=0,d=!1;try{if(await no(i,e,a,s),o)throw Error(`Aborted by ${o} before running the release.`);u=await uo(i,e,s),d=u===0}catch(e){console.error(f.red(String(e instanceof Error?e.message:e))),u=1}finally{let e=[];for(let[t,n]of a)ro(t,n,d)&&e.push(t);e.length>0&&console.info(f.cyan(`Restored ${e.map(e=>t.relative(i.dirPath,e)).join(`, `)}.`)),[...a.keys()].some(e=>t.basename(e)===`bunfig.toml`)&&!Le(i.env.CI)&&console.info(f.yellow("node_modules now uses the hoisted layout; run a clean reinstall (`rm -rf node_modules packages/*/node_modules && bun install`) to restore the isolated layout."));for(let e of l)process.off(e,c)}if(o){process.kill(process.pid,o);return}u!==0&&process.exit(u)}async function to(e,t,r,i){return await new Promise(a=>{let o=n.spawn(t,r,i);e.current=o,o.on(`error`,t=>{e.current=void 0,console.error(f.red(String(t))),a(1)}),o.on(`exit`,t=>{e.current=void 0,a(t??1)})})}async function no(n,r,i,a){let o=t.join(n.dirPath,`bunfig.toml`),s=e.existsSync(o)?e.readFileSync(o,`utf8`):void 0,c=s===void 0?void 0:io(s);if(s!==void 0&&c!==s&&(console.info(f.cyan(`Clean-reinstalling with the hoisted linker so npm can walk node_modules...`)),!r.dryRun)){i.set(o,Buffer.from(s,`utf8`));for(let r of[`bun.lock`,`bun.lockb`]){let a=t.join(n.dirPath,r);i.set(a,e.existsSync(a)?e.readFileSync(a):void 0)}e.writeFileSync(o,c??``,`utf8`);for(let r of[n.dirPath,...await fo(n)])e.rmSync(t.join(r,`node_modules`),{force:!0,recursive:!0});if(await to(a,`bun`,[`install`],{cwd:n.dirPath,env:n.env,stdio:`inherit`})!==0)throw Error(`bun install failed while preparing the release.`)}let l=await fo(n);for(let a of[n.packageJsonPath,...l.map(e=>t.join(e,`package.json`))]){if(!e.existsSync(a))continue;let o=e.readFileSync(a,`utf8`);r.dryRun||i.set(a,Buffer.from(o,`utf8`));let s=ao(o);s!==o&&(console.info(f.cyan(`Rewriting workspace: ranges in ${t.relative(n.dirPath,a)}...`)),r.dryRun||e.writeFileSync(a,s,`utf8`))}}function ro(n,r,i){if(r===void 0){let t=e.existsSync(n);return e.rmSync(n,{force:!0}),t}if(i&&t.basename(n)===`package.json`&&e.existsSync(n)){let t=e.readFileSync(n,`utf8`),i=r.toString(`utf8`);if(t!==ao(i)){let r=oo(t,i);return r===t?!1:(e.writeFileSync(n,r,`utf8`),!0)}}return(e.existsSync(n)?e.readFileSync(n):void 0)?.equals(r)?!1:(e.writeFileSync(n,r),!0)}function io(e){return e.replace(/^(\s*linker\s*=\s*)["']isolated["']/mu,`$1"hoisted"`).replace(/^\s*globalStore\s*=\s*true[^\n]*\n?/mu,``)}function ao(e){return so(e,e=>e.replaceAll(/("[^"\n]+"\s*:\s*)"workspace:[^"]*"/gu,`$1"*"`))}function oo(e,t){let n=co(t);return so(e,(e,t)=>{let r=e;for(let{section:e,name:i,specifier:a}of n)e===t&&(r=r.replaceAll(RegExp(`("${lo(i)}"\\s*:\\s*)"[^"]*"`,`gu`),(e,t)=>`${t}${JSON.stringify(a)}`));return r})}function so(e,t){return e.replaceAll(/("(dependencies|devDependencies|optionalDependencies|peerDependencies)"\s*:\s*\{)([^{}]*)(\})/gu,(e,n,r,i,a)=>`${n}${t(i,r)}${a}`)}function co(e){let t;try{t=JSON.parse(e)}catch{return[]}let n=[];for(let e of[`dependencies`,`devDependencies`,`optionalDependencies`,`peerDependencies`])for(let[r,i]of Object.entries(t[e]??{}))typeof i==`string`&&i.startsWith(`workspace:`)&&n.push({section:e,name:r,specifier:i});return n}function lo(e){return e.replaceAll(/[$()*+.?[\\\]^{|}]/g,String.raw`\$&`)}async function uo(n,r,i){let a=[...r.args??[],...r[`--`]??[]].map(String),o=[`@anolilab/multi-semantic-release`,`multi-semantic-release`,`@qiwi/multi-semantic-release`].find(e=>n.packageJson.devDependencies?.[e]),s=o?`multi-semantic-release`:`semantic-release`,c={...n.env};Ie(n.dirPath,c);let l=e.existsSync(t.join(n.dirPath,`node_modules`,`.bin`,s)),u=o??`semantic-release`,d=l?[s,...a]:n.packageManagerCommand===`bun`?[`bunx`,u,...a]:[`yarn`,`dlx`,u,...a];return console.info(f.cyan(`Running: ${d.join(` `)}`)),r.dryRun?0:await to(i,d[0],d.slice(1),{cwd:n.dirPath,env:c,stdio:`inherit`})}async function fo(e){let n=e.packageJson.workspaces,r=Array.isArray(n)?n:n?.packages??[];return r.length===0?[]:(await p(r,{cwd:e.dirPath,onlyDirectories:!0})).map(n=>t.join(e.dirPath,n))}const po={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){let t=V(e);t||(console.error(f.red(`No project found.`)),process.exit(1));let n=[e.command,...e.args??[],...e._.slice(1)].filter(Boolean),r=0;for(let i=0;i<e.retry;i++)if(i>0&&console.info(`\n${f.yellow(`#${i} Retrying: ${n.join(` `)}`)}`),r=await U(n.join(` `),t,e,{exitIfFailed:!1,onSignal:e=>{e&&process.exit(1)}}),r===0)return;process.exit(r)}},mo={command:`setup`,describe:`Setup development environment. .env files are ignored.`,builder:{},async handler(e){await ho(e)}};async function ho(e,t){let r=await H(e,!1,t);r||(console.error(f.red(`No project found.`)),process.exit(1));for(let t of Wi(`setup`,r.descendants)){let i=await y.readdir(t.dirPath,{withFileTypes:!0});if(t===r.root&&(m.platform()===`darwin`&&await W(`brew install ${[`pstree`].join(` `)}`,t,e),i.some(e=>e.isFile()&&e.name.includes(`-version`))&&await U(`asdf install`,t,e,{exitIfFailed:!1})),i.some(e=>e.isFile()&&e.name===`pyproject.toml`)){await W(`poetry config virtualenvs.in-project true`,t,e);let[,r]=n.execSync(`asdf current python`).toString().trim().split(/\s+/);await W(`poetry env use ${r}`,t,e),await pt.promiseAll(),await U(`poetry run pip install --upgrade pip`,t,e),await U(`poetry install --ansi`,t,e)}(t===r.root||!r.root.packageJson.scripts?.[`gen-code`])&&t.packageJson.scripts?.[`gen-code`]&&await U(`${t.packageManagerRunCommand} gen-code`,t,e)}let i=r.descendants.find(e=>e.packageJson.devDependencies?.playwright);i&&await U(`${i.packageManagerRunCommand} playwright install --with-deps`,i,e)}const go=[`dependencies`,`devDependencies`,`optionalDependencies`,`peerDependencies`],_o={command:`setup-private-packages`,describe:`Materialize private dependencies for Docker builds: copy git dependencies and download @willbooster-private/* registry packages (auth via .npmrc / ~/.npmrc locally, or VERDACCIO_TOKEN on CI)`,builder:{"out-dir":{description:`Directory to copy private packages into`,type:`string`,default:`@willbooster`}},async handler(n){let r=Ye(n,!1);r||(console.error(f.red(`No project found.`)),process.exit(1));let i=t.resolve(r.root.dirPath,n.outDir);wo(r.root.dirPath,i);let a=t.join(r.root.dirPath,Ti);So(i,a)&&(console.error(f.red(`--out-dir must not overlap the ${Ti} registry output directory.`)),process.exit(1)),t.relative(r.root.dirPath,i)!==`@willbooster`&&console.warn(f.yellow(`Note: wb optimizeForDockerBuild rewrites git dependencies to <root>/@willbooster; a custom --out-dir requires a matching Dockerfile layout.`));let o=await vo(r.root.dirPath,r.root.packageJson,i,a);if(n.dryRun){No(i,o);return}let s=[...o.values()].filter(e=>e.kind===`git`),c=[...o.values()].filter(e=>e.kind===`registry`),l=c.length>0?Ai(r.root.dirPath):void 0;c.length>0&&!l&&(console.error(f.red(`No registry configured for the ${Ti} scope; add "${Ti}:registry=..." to .npmrc or ~/.npmrc.`)),process.exit(1)),await e.promises.rm(i,{recursive:!0,force:!0}),await e.promises.mkdir(i,{recursive:!0});for(let e of s)await bo(r.root.dirPath,e);if(l){let n=t.join(r.root.dirPath,`.tmp`,`wb-private-registry-staging`),s=e=>t.join(n,t.relative(a,e));await e.promises.rm(n,{recursive:!0,force:!0}),await e.promises.mkdir(n,{recursive:!0});try{for(let e of c)await Mi(l,e.name,e.versionSpecifier??`latest`,s(e.targetDirPath)),console.info(`Downloaded ${e.name} to ${t.relative(r.root.dirPath,e.targetDirPath)}`),await yo(r.root.dirPath,l,e,o,i,a,s);await e.promises.rm(a,{recursive:!0,force:!0}),await e.promises.rename(n,a)}catch(t){throw await e.promises.rm(n,{recursive:!0,force:!0}),t}}else await e.promises.rm(a,{recursive:!0,force:!0}),await e.promises.mkdir(a,{recursive:!0});await Oo(r.root.dirPath,o)}};async function vo(e,t,n,r){let i=new Map,a=Eo(t,n,r),o=new Map(a.map(e=>[e.name,e]));for(let t=0;t<a.length;t++){let s=a[t];if(s&&!i.has(s.name)){if(s.kind===`git`){s.sourceDirPath=To(e,s.name);for(let e of await Ao(s.sourceDirPath)){let t=await jo(e);for(let e of Eo(t,n,r)){let t=o.get(e.name);t?xo(t,e,s.name):(o.set(e.name,e),a.push(e))}}}i.set(s.name,s)}}return i}async function yo(e,t,n,r,i,a,o){let s=n.kind===`registry`?o(n.targetDirPath):n.targetDirPath;for(let c of await Ao(s))for(let s of Eo(await jo(c),i,a)){let c=r.get(s.name);if(c){xo(c,s,n.name);continue}s.kind===`git`?(s.sourceDirPath=To(e,s.name),await bo(e,s)):(await Mi(t,s.name,s.versionSpecifier??`latest`,o(s.targetDirPath)),console.info(`Downloaded ${s.name} (nested dependency) to ${s.targetDirPath}`)),r.set(s.name,s),await yo(e,t,s,r,i,a,o)}}async function bo(n,r){await e.promises.cp(r.sourceDirPath,r.targetDirPath,{recursive:!0,force:!0,dereference:!0,filter:e=>{let n=t.relative(r.sourceDirPath,e).split(t.sep);return!n.includes(`node_modules`)&&!n.includes(`.git`)}}),console.info(`Copied ${r.name} to ${t.relative(n,r.targetDirPath)}`)}function xo(e,t,n){if(e.kind===t.kind){if(e.versionSpecifier===t.versionSpecifier)return;let n=Bi(e.versionSpecifier);if(n!==void 0&&t.versionSpecifier!==void 0&&(zi(t.versionSpecifier)&&t.versionSpecifier===n||Vi(t.versionSpecifier,n)))return}throw Error(`Conflicting requirements for ${e.name}: ${e.versionSpecifier??e.kind} is already selected, but ${n} requires ${t.versionSpecifier??t.kind}. Only a single version per private package is supported.`)}function So(e,t){return Co(e,t)||Co(t,e)}function Co(e,n){let r=t.relative(e,n);return r===``||!r.startsWith(`..`)&&!t.isAbsolute(r)}function wo(e,n){let r=t.relative(e,n);r&&!r.startsWith(`..`)&&!t.isAbsolute(r)||(console.error(f.red(`Output directory must be a subdirectory of the project root: ${n}`)),process.exit(1))}function To(n,r){let i=Mo(r),a=t.join(n,`node_modules`,`@willbooster`,i);if(e.existsSync(t.join(a,`package.json`)))return e.realpathSync(a);let o=t.join(n,`node_modules`,`.bun`),s=new Set;try{for(let n of e.readdirSync(o,{withFileTypes:!0})){let r=t.join(o,n.name,`node_modules`,`@willbooster`,i);e.existsSync(t.join(r,`package.json`))&&s.add(e.realpathSync(r))}}catch{}if(s.size===1)return[...s][0];throw s.size>1?Error(`Multiple installed resolutions found for ${r}: ${[...s].join(`, `)}. Deduplicate the dependency so a single resolution remains.`):Error(`Private package is not installed: ${r} (${a})`)}function Eo(e,n,r){let i=new Map;for(let a of go){let o=e[a];if(o)for(let[e,a]of Object.entries(o)){let o=Oi(a);if(!o&&!ki(e,a))continue;if(o&&!e.startsWith(`@willbooster/`))throw Error(`Private git dependency must be an @willbooster package: ${e}`);let s=Mo(e);if(!/^[\w.-]+$/.test(s)||s.startsWith(`.`))throw Error(`Invalid private package name: ${e}`);let c={name:e,kind:o?`git`:`registry`,sourceDirPath:void 0,targetDirPath:t.join(o?n:r,s),versionSpecifier:a},l=i.get(e);i.set(e,l?Do(l,c):c)}}return[...i.values()]}function Do(e,t){if(e.kind===t.kind){if(e.versionSpecifier===t.versionSpecifier)return e;let[n,r]=zi(e.versionSpecifier)?[e,t]:[t,e];if(zi(n.versionSpecifier)&&r.versionSpecifier!==void 0&&(r.versionSpecifier===n.versionSpecifier||Vi(r.versionSpecifier,n.versionSpecifier)||Bi(r.versionSpecifier)===n.versionSpecifier))return n;let i=Bi(e.versionSpecifier);if(i!==void 0&&i===Bi(t.versionSpecifier))return e}throw Error(`Conflicting requirements for ${e.name} within one manifest: ${e.versionSpecifier??e.kind} vs ${t.versionSpecifier??t.kind}.`)}async function Oo(n,r){for(let i of r.values())for(let a of await Ao(i.targetDirPath)){let i=await jo(a);ko(a,i,r)&&(await e.promises.writeFile(a,`${JSON.stringify(i,void 0,2)}\n`,`utf8`),console.info(`Rewrote private dependencies in ${t.relative(n,a)}`))}}function ko(e,n,r){let i=!1;for(let a of go){let o=n[a];if(o)for(let[n,a]of Object.entries(o)){if(!Oi(a)&&!ki(n,a))continue;let s=r.get(n);s&&(o[n]=`file:${t.relative(t.dirname(e),s.targetDirPath)}`,i=!0)}}return i}async function Ao(n){if(!e.existsSync(n))return[];let r=[];for(let i of await e.promises.readdir(n,{withFileTypes:!0})){if(i.name===`node_modules`||i.name===`.git`)continue;let e=t.join(n,i.name);if(i.isDirectory()){r.push(...await Ao(e));continue}i.isFile()&&i.name===`package.json`&&r.push(e)}return r}async function jo(t){return JSON.parse(await e.promises.readFile(t,`utf8`))}function Mo(e){return e.replace(/^@willbooster(?:-private)?\//,``)}function No(e,t){console.info(`[dry-run] Would recreate ${e}`);for(let e of t.values())console.info(e.kind===`git`?`[dry-run] Would copy ${e.name}: ${e.sourceDirPath??`(installed under node_modules)`}`:`[dry-run] Would download ${e.name}@${e.versionSpecifier} to ${e.targetDirPath}`);console.info(`[dry-run] Would rewrite copied private dependencies to file:../<name>`)}const Po={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:[]}};function Fo(e){e.normalizedArgsText=[...e.args??[],...e._?.slice(1)??[],...e[`--`]??[]].map(e=>q(String(e))).join(` `),e.normalizedDockerOptionsText=(e.dockerOptions??[]).map(e=>q(String(e))).join(` `)}function Io(e){return e.silent?` > /dev/null`:``}const $=new class{buildImage(e,n){let r=e.dockerPackageJson.scripts?.[`docker/build/prepare`]?`YARN run docker/build/prepare && `:``,i=e.env.MISE_AGE_KEY?`
|
|
84
91
|
--secret id=mise_age_key,env=MISE_AGE_KEY`:``;return`cd ${t.dirname(e.findFile(`Dockerfile`))}
|
|
85
92
|
&& ${r}YARN wb optimizeForDockerBuild --outside
|
|
86
93
|
&& YARN wb retry -- docker build -t ${e.dockerImageName}
|
|
87
94
|
--build-arg ARCH=$([ $(uname -m) = 'arm64' ] && echo arm64 || echo x86_64)
|
|
88
95
|
--build-arg WB_ENV=${e.env.WB_ENV}
|
|
89
|
-
--build-arg WB_VERSION=${n}${i} .`}stopAndStart(e,t=``,n=``){return`${this.stop(e)} && ${this.start(e,t,n)}`}start(e,t=``,n=``){
|
|
90
|
-
&& ${
|
|
91
|
-
&& ${$.stopAndStart(e,t.normalizedDockerOptionsText??``,t.normalizedArgsText??``)}`}startProductionProtected(e,n){let r=
|
|
92
|
-
&& ${s}${o}`])}testUnit(e,t){let n=t.targets?.map(String);return e.hasVitest?
|
|
96
|
+
--build-arg WB_VERSION=${n}${i} .`}stopAndStart(e,t=``,n=``){return`${this.stop(e)} && ${this.start(e,t,n)}`}start(e,t=``,n=``){ai(this.stop(e),e);let r=n.includes(`/bin/bash`),i=e.env.MISE_AGE_KEY?`--env MISE_AGE_KEY `:``;return`docker run --rm ${r?`-it `:``}${i}--publish ${e.env.PORT}:8080 --name ${e.dockerImageName} ${t} ${e.dockerImageName} ${n}`}stop(e){return`docker rm -f ${e.dockerImageName} > /dev/null 2>&1 || true`}stopAll(){return`true $(docker rm -f $(docker ps -q) 2> /dev/null)`}};var Lo=class{shouldWaitAndOpenApp;constructor(e){this.shouldWaitAndOpenApp=e}buildDocker(e,t){return $.buildImage(e,t)}async startDev(e,t){return await qr(e.env.PORT,e),this.shouldWaitAndOpenApp?K([`YARN`,`wb`,`concurrently`,...xt(t),`--kill-others-on-fail`,this.startDevProtected(e,t),this.waitAndOpenApp(e)]):this.startDevProtected(e,t)}async startProduction(e,t){return await qr(e.env.PORT,e),this.shouldWaitAndOpenApp?K([`YARN`,`wb`,`concurrently`,...xt(t),`--kill-others-on-fail`,this.startProductionProtected(e,t),this.waitAndOpenApp(e)]):this.startProductionProtected(e,t)}async startTest(e,t){return await qr(e.env.PORT,e),this.startProductionProtected(e,t)}async startDocker(e,t){return await qr(e.env.PORT,e),this.shouldWaitAndOpenApp?`${this.buildDocker(e,`development`)}
|
|
97
|
+
&& ${K([`YARN`,`wb`,`concurrently`,...xt(t),`--kill-others-on-fail`,$.stopAndStart(e,t.normalizedDockerOptionsText??``,t.normalizedArgsText??``),this.waitAndOpenApp(e)])}`:`${this.buildDocker(e,`development`)}
|
|
98
|
+
&& ${$.stopAndStart(e,t.normalizedDockerOptionsText??``,t.normalizedArgsText??``)}`}startProductionProtected(e,n){let r=Ro(e);if(r){let i=`${K([`bash`,r])} ${n.normalizedArgsText??``}`.trim(),a=t.dirname(t.dirname(r));return this.buildProductionCommand(e,n,[e.buildCommand,a===e.dirPath?i:`(${K([`cd`,a])} && ${i})`])}let i=zo(e),a=i?[e.buildCommand,`pm2-runtime start --no-autorestart ${i}`]:this.buildDefaultProductionStartCommands(e,n);return this.buildProductionCommand(e,n,a)}buildDefaultProductionStartCommands(e,t){return[e.buildCommand,`${e.isBunAvailable?`bun`:`node`} dist/index.js ${t.normalizedArgsText??``}`.trim()]}buildProductionCommand(e,t,n){let r=Je(e,`test`)&&J(e)?[`rm -Rf "${Kt(e)}"`]:[],i=!!Wt(e);return[...[...r,...e.hasPrisma?[Yn.migrate(e)]:[],...e.hasDrizzle&&!i?[Ht(e,hn.migrateForStart(e))]:[]].flatMap(e=>e.split(`&&`)),...n].filter(Boolean).map(e=>`${e} ${Io(t)}`.trim()).join(` && `)}testE2EDev(e,t,n){return this.testE2EProtected(e,t,this.startDevProtected(e,t),n)}testE2EProduction(e,t,n){return this.testE2EProtected(e,t,this.startProductionProtected(e,t),n)}testE2EDocker(e,t,n){return this.testE2EProtected(e,t,$.stopAndStart(e),n)}async testStart(e,t){return e.env.PORT||=`3000`,await qr(e.env.PORT,e),`${Lt(`NODE_ENV`,``)} ${K([`YARN`,`wb`,`concurrently`,...xt(t),`--kill-others`,`--success`,`first`,this.startDevProtected(e,t),this.waitApp(e)])}`}async testE2EProtected(e,t,n,{forwardedPlaywrightArgs:r=[],playwrightArgs:i=[`test`,`test/e2e/`]}){e.env.PORT||=`3000`;let a=await qr(e.env.PORT,e),o=e.packageJson.scripts?.[`test/e2e-additional`]?` && YARN test/e2e-additional`:``,s=Bo(i,t.targets,t.bail,r);return e.skipLaunchingServerForPlaywright?`${s}${o}`:K([`YARN`,`wb`,`concurrently`,...xt(t),`--kill-others`,`--success`,`first`,`${n} && exit 1`,`wait-on -t 600000 -i 2000 http-get://127.0.0.1:${a}
|
|
99
|
+
&& ${s}${o}`])}testUnit(e,t){let n=t.targets?.map(String);return e.hasVitest?K([`YARN`,`vitest`,`run`,...n?.length?n:[`test/unit/`],`--passWithNoTests`,`--allowOnly`,`--watch=false`,...t.bail?[`--bail=1`]:[]]):e.isBunAvailable?K([`bun`,`test`,...n?.length?n:[`test/unit/`],...t.bail?[`--bail`]:[]]):`echo "No tests."`}waitApp(e){let t=e.env.PORT;return`wait-on -t 10000 http-get://127.0.0.1:${t} 2> /dev/null
|
|
93
100
|
|| wait-on -t 10000 -i 500 http-get://127.0.0.1:${t} 2> /dev/null
|
|
94
101
|
|| wait-on -t 10000 -i 1000 http-get://127.0.0.1:${t} 2> /dev/null
|
|
95
102
|
|| wait-on -t 10000 -i 2000 http-get://127.0.0.1:${t} 2> /dev/null
|
|
96
103
|
|| wait-on -t 20000 -i 4000 http-get://127.0.0.1:${t} 2> /dev/null
|
|
97
104
|
|| wait-on -t 60000 -i 5000 http-get://127.0.0.1:${t} 2> /dev/null
|
|
98
|
-
|| wait-on -t 90000 -i 10000 http-get://127.0.0.1:${t}`}waitAndOpenApp(e){let t=e.env.PORT;return`${this.waitApp(e)} || wait-on http-get://127.0.0.1:${t} && open-cli http://\${HOST:-localhost}:${t}`}};function Ra(e){try{return e.findFile(`scripts/start-production.sh`)}catch{return}}function za(e){try{return e.findFile(`ecosystem.config.cjs`)}catch{return}}function Ba(e,t,n,r=[]){let i=[`BUN`,`playwright`],a=t?.map(String);if(e[0]!==`test`||!a?.length)return Va([...i,...e,...r],n);let o=e.slice(1),s=Ha(o),c=s.length===0?o:o.filter((e,t)=>!s.includes(t));return Va([...i,`test`,...a,...c,...r],n)}function Va(e,t){let n=e.indexOf(`playwright`),r=n!==-1&&e[n+1]===`test`;return!t||!r||e.some(e=>e===`--max-failures`||e.startsWith(`--max-failures=`))?G(e):G([...e,`--max-failures=1`])}function Ha(e){let t,n=[];for(let[r,i]of e.entries()){if(t){if(t===`required`||!i.startsWith(`-`)){t=void 0;continue}t=void 0}if(i===`--`)return[...n,...e.slice(r+1).map((e,t)=>r+1+t)];if(i.startsWith(`--`)){if(i.includes(`=`))continue;Ua.has(i)?t=`required`:Wa.has(i)&&(t=`optional`);continue}if(i.startsWith(`-`)&&i!==`-`){let e=i.slice(0,2);i.length===2&&Ga.has(e)&&(t=`required`);continue}n.push(r)}return n}const Ua=new Set([`--browser`,`--config`,`--grep`,`--grep-invert`,`--global-timeout`,`--max-failures`,`--output`,`--project`,`--repeat-each`,`--reporter`,`--retries`,`--shard`,`--test-list`,`--test-list-invert`,`--timeout`,`--trace`,`--tsconfig`,`--ui-host`,`--ui-port`,`--ui-title`,`--workers`]),Wa=new Set([`--only-changed`,`--update-snapshots`,`--update-source-method`]),Ga=new Set([`-c`,`-g`,`-j`]),Ka=new class extends La{constructor(){super(!0)}startDevProtected(e,t){return`blitz dev ${t.normalizedArgsText??``}`}};var qa=class extends La{constructor(){super(!1)}startDevProtected(e,t){return`YARN build-ts run ${t.watch?`--watch`:``} src/index.ts -- ${t.normalizedArgsText??``}`}async testE2EProtected(e,t,n,r={}){if(e.hasPlaywrightConfig)return super.testE2EProtected(e,t,n,r);e.env.PORT||=`3000`;let i=await Mr(e.env.PORT,e),a=e.packageJson.scripts?.[`test/e2e-additional`]?` && YARN test/e2e-additional`:``,o=t.targets?.map(String),s=o?.length?o:[`test/e2e/`],c=this.testUnit(e,{...t,targets:s});return G([`YARN`,`wb`,`concurrently`,...mt(t),`--kill-others`,`--success`,`first`,`${n} && exit 1`,`wait-on -t 600000 -i 2000 http-get://127.0.0.1:${i} && ${c}${a}`])}};const Ja=new qa,Ya=new class extends La{constructor(){super(!0)}startDevProtected(e,t){return`YARN next dev --turbopack ${t.normalizedArgsText??``}`}buildDefaultProductionStartCommands(e,t){return[e.buildCommand,`YARN next start ${t.normalizedArgsText??``}`.trim()]}},Xa=new class extends La{constructor(){super(!1)}startDevProtected(e,t){throw Error(`This method should not be called.`)}startDev(e,t){return Promise.resolve(`YARN build-ts run ${t.watch?`--watch`:``} src/index.ts -- ${t.normalizedArgsText??``}`)}startProduction(e,t){return Promise.resolve(`${e.buildCommand} && ${e.isBunAvailable?`bun run`:`node`} dist/index.js ${t.normalizedArgsText??``} | tee server.log`)}startTest(){return Promise.resolve(`echo 'do nothing.'`)}startDocker(e,t){return Promise.resolve(`${this.buildDocker(e,`development`)} && ${$.stopAndStart(e,t.normalizedDockerOptionsText??``,t.normalizedArgsText??``)}`)}testE2EDev(){return Promise.resolve(`echo 'do nothing.'`)}testE2EProduction(){return Promise.resolve(`echo 'do nothing.'`)}testE2EDocker(){return Promise.resolve(`echo 'do nothing.'`)}testStart(){return Promise.resolve(`echo 'do nothing.'`)}},Za=new class extends La{constructor(){super(!0)}startDevProtected(e,t){return`remix dev ${t.normalizedArgsText??``}`}},Qa=new class extends La{constructor(){super(!0)}startDevProtected(e,t){e.env.PORT||=`3000`;let n=`YARN vinext dev --port ${e.env.PORT} ${t.normalizedArgsText??``}`.trim(),r=[Mt(t,`.dev.vars`)],i=qe(e,`test`)?Pt(e):void 0;return i&&r.push(i),[...r,n].join(` && `)}buildDefaultProductionStartCommands(e,t){e.env.PORT||=`3000`;let n=e.env.PORT,r=Pt(e);return[e.buildCommand,Mt(t,`dist/server/.dev.vars`),...r?[r]:[],Nt(`dev --config dist/server/wrangler.json --ip 127.0.0.1 --port ${n} --persist-to "${zt(e)}" --local-upstream localhost:${n} ${t.normalizedArgsText??``}`.trim())]}},$a=new class extends La{constructor(){super(!0)}startDevProtected(e,t){return`YARN vite dev ${t.normalizedArgsText??``}`.trim()}startProductionProtected(e,t){return`${e.buildCommand} && YARN vite preview ${t.normalizedArgsText??``}`.trim()}},eo=new class extends qa{startDevProtected(e,t){return this.buildWranglerDevCommands(e,t).join(` && `)}buildDefaultProductionStartCommands(e,t){return this.buildWranglerDevCommands(e,t)}buildWranglerDevCommands(e,t){e.env.PORT||=`8787`;let n=zt(e),r=[Mt(t,`.dev.vars`)],i=Pt(e);return i&&r.push(i),r.push(Nt(`dev --ip 127.0.0.1 --port ${e.env.PORT} --persist-to "${n}" ${t.normalizedArgsText??``}`.trim())),r}},to=[`express`,`fastify`,`elysia`,`hono`],no={...Pa,mode:{description:`Start mode: dev[elopment] (default) | staging | docker | docker-debug | test`,type:`string`,alias:`m`}},ro={command:`start [args..]`,describe:`Start app. Use '--' to stop wb option parsing and forward the remaining arguments to the underlying app command. Example: wb start -- --host 0.0.0.0`,builder:e=>e.parserConfiguration({"populate--":!0}).options(no),async handler(e){Fa(e);let t=await V(e);t||(console.error(f.red(`No project found.`)),process.exit(1));for(let n of t.descendants){let t=n.packageJson.dependencies??{},r=n.packageJson.devDependencies??{},i;if(t.blitz)i=Ka;else if(t.vinext||r.vinext)i=Qa;else if(t.next)i=Ya;else if(r[`@remix-run/dev`])i=Za;else if(r.vite)i=$a;else if(q(n))i=eo;else if(to.some(e=>t[e])&&!t[`firebase-functions`]||n.hasDockerfile&&/EXPOSE\s+8080/.test(n.dockerfile))i=Ja;else if(t[`build-ts`]||r[`build-ts`])i=Xa;else continue;switch(console.info(`Running "start" for ${n.name} ...`),e.mode??`dev`){case`dev`:case`development`:process.env.WB_ENV||=`development`,await H(await i.startDev(n,e),n,e);break;case`staging`:process.env.WB_ENV||=`staging`,await H(await i.startProduction(n,e),n,e);break;case`docker`:process.env.WB_ENV||=`staging`,await H(await i.startDocker(n,e),n,e);break;case`docker-debug`:process.env.WB_ENV||=`staging`,e.normalizedArgsText=`'/bin/bash'`,await H(await i.startDocker(n,e),n,e);break;case`test`:process.env.WB_ENV||=`test`,await H(await i.startTest(n,e),n,e);break;default:throw Error(`Unknown start mode: ${e.mode}`)}}}},io=RegExp(`${String.fromCodePoint(27)}\\[[0-?]*[ -/]*[@-~]`,`g`),ao=.05,oo={e2e:{description:`How to run E2E tests`,type:`string`,choices:[`headless`,`headless-dev`,`headed`,`headed-dev`,`docker`,`docker-debug`,`debug`,`generate`,`trace`],default:`headless`},silent:{description:`Reduce redundant outputs`,type:`boolean`},bail:{description:`Stop tests after the first failure`,type:`boolean`},"unit-timeout":{description:`Timeout for unit tests`,type:`number`}},so={targets:{array:!0,description:`Unit or E2E test target paths`,type:`string`}},co={command:`test [targets...]`,describe:`Test project. If you pass no arguments, it will run all tests. Use '--' to stop wb option parsing and forward the remaining flags to Playwright. Example: wb test -- --grep 'uploaded image asset'`,builder:e=>e.parserConfiguration({"populate--":!0}).options(oo).positional(`targets`,so.targets),async handler(e){process.exit(await lo(e))}};async function lo(n,r={}){let i=fo(n),a=await V(i);if(!a)return console.error(f.red(`No project found.`)),1;let o=i.targets??[],s=i[`--`]??[],{shouldRunE2e:c,shouldRunUnit:l}=Co(o,s);for(let n of a.descendants){n.env.WB_ENV||=`test`;let a=n.packageJson.dependencies??{},u=n.packageJson.devDependencies??{},d;d=a.blitz?Ka:a.vinext||u.vinext?Qa:a.next?Ya:u[`@remix-run/dev`]?Za:u.vite?$a:q(n)?eo:to.some(e=>a[e])&&!a[`firebase-functions`]?Ja:Xa,console.info(`Running "test" for ${n.name} ...`);let f=po(n);if(l&&f!==!1){let e=o.filter(e=>e.includes(`/unit`)),t=e.length>0?e:f.length>0?f:void 0,a={...i,targets:t},s=await go(d.testUnit(n,a),n,i,{exitIfFailed:r.exitIfFailed,timeout:i.unitTimeout});if(s!==0)return s}if(!c||!e.existsSync(t.join(n.dirPath,`test`,`e2e`))){c&&uo(n);continue}let p=o.filter(e=>e.includes(`/e2e`)),m={...i,targets:p.length>0?p:void 0};switch(i.e2e){case`headless`:{let e=await ho(await d.testE2EProduction(n,m,{playwrightArgs:So(p,s),forwardedPlaywrightArgs:s}),n,i,{exitIfFailed:r.exitIfFailed});if(e!==0)return e;continue}case`headless-dev`:{let e=await ho(await d.testE2EDev(n,m,{playwrightArgs:So(p,s),forwardedPlaywrightArgs:s}),n,i,{exitIfFailed:r.exitIfFailed});if(e!==0)return e;continue}case`docker`:{let e=await mo(n,m,d,So(p,s),s,r);if(e!==0)return e;continue}case`docker-debug`:{let e=await mo(n,m,d,So(p,s,[`--debug`]),s,r);if(e!==0)return e;continue}}if(a.blitz||a.next||u[`@remix-run/dev`]||u.vite)switch(i.e2e){case`headed`:{let e=await ho(await d.testE2EProduction(n,m,{playwrightArgs:So(p,s,[`--headed`]),forwardedPlaywrightArgs:s}),n,i,{exitIfFailed:r.exitIfFailed});if(e!==0)return e;break}case`headed-dev`:{let e=await ho(await d.testE2EDev(n,m,{playwrightArgs:So(p,s,[`--headed`]),forwardedPlaywrightArgs:s}),n,i,{exitIfFailed:r.exitIfFailed});if(e!==0)return e;break}case`debug`:{let e=await ho(await d.testE2EProduction(n,m,{playwrightArgs:So(p,s,[`--debug`]),forwardedPlaywrightArgs:s}),n,i,{exitIfFailed:r.exitIfFailed});if(e!==0)return e;break}case`generate`:{let e=await ho(await d.testE2EProduction(n,m,{playwrightArgs:[`codegen`,`http://localhost:${n.env.PORT}`]}),n,i,{exitIfFailed:r.exitIfFailed});if(e!==0)return e;break}case`trace`:{let e=await ho(`BUN playwright show-trace`,n,i,{exitIfFailed:r.exitIfFailed});if(e!==0)return e;break}}}return 0}function uo(n){n.packageJson.workspaces||e.existsSync(t.join(n.dirPath,`playwright.config.ts`))&&console.warn(f.yellow(`Skipping e2e tests for ${n.name}: a Playwright config exists but the test/e2e directory is missing. wb only discovers Playwright specs under test/e2e/, so move them there to run e2e tests.`))}function fo(e){return e.env?.length||e.cascadeEnv||e.cascadeNodeEnv||e.autoCascadeEnv===!1?e:{...e,cascadeEnv:`test`}}function po(n){return e.existsSync(t.join(n.dirPath,`test`,`unit`))?[]:n.hasVitest&&e.existsSync(t.join(n.dirPath,`test`))?e.existsSync(t.join(n.dirPath,`test`,`e2e`))?[`test`,`--exclude`,`test/e2e/**`]:[`test`]:!1}async function mo(e,t,n,r,i,a={}){e.env.WB_DOCKER||=`1`;let o=await H(`${n.buildDocker(e,`test`)}${Ia(t)}`,e,t,{exitIfFailed:a.exitIfFailed});if(o!==0)return o;let s=await ho(await n.testE2EDocker(e,t,{playwrightArgs:r,forwardedPlaywrightArgs:i}),e,t,{exitIfFailed:!1}),c=await H($.stop(e),e,t,{exitIfFailed:a.exitIfFailed});return s===0?c:s}function ho(e,t,n,r={}){return H(e,t,n,{...r,processSilentOutput:_o})}function go(e,t,n,r={}){return H(e,t,n,{...r,omitSilentStart:!0,printSilentOutputOnFailureOnly:!0,silentProgressIntervalMs:1e4,silentSuccessMessage:`Unit tests passed.`})}function _o(e){let t=[],n=new Set,r=[];for(let i of vo(e)){let e=bo(i);n.has(e)||t.some(t=>xo(t,e))||(yo(t,n,e),r.push(i))}return r.join(`
|
|
99
|
-
`)}function*
|
|
100
|
-
`,t);if(n===-1){yield e.slice(t);return}yield e.slice(t,n),t=n+1}}function
|
|
101
|
-
No type errors found. Please ignore the previous type errors, as they were caused by outdated Next.js cache files.`:`No type errors found.`)),s}function
|
|
102
|
-
`+f.cyan(f.bold(`Start:`),e));let r=await t()??0;return r===0||n.allowFailure?n.silent||console.info(f.green(f.bold(`Finished:`),e)):(console.info(f.red(f.bold(`Failed (exit code ${r}):`),e)),process.exit(r)),r}async function
|
|
103
|
-
`))}function
|
|
104
|
-
`+f.cyan(f.bold(`Command:`),e)+f.gray(` at ${t}`))}function
|
|
105
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJuYW1lcyI6WyJjb2xsZWN0RGVzY2VuZGFudFBpZHMiLCJpc05vU3VjaFByb2Nlc3NFcnJvciIsImNvbGxlY3REZXNjZW5kYW50UGlkc0Zyb21NYXAiLCJBTlNJX0VTQ0FQRV9DT0RFX1JFR0VYUCIsInQiLCJpIiwibyIsIm4iLCJyIiwiYSIsIm4iLCJyIiwibiIsInQiLCJlIiwiYnVpbGRlciIsImNoaWxkX3Byb2Nlc3MiLCJidWlsZGVyIiwiYXJndW1lbnRzQnVpbGRlciIsImNoaWxkX3Byb2Nlc3MiLCJMSVRFU1RSRUFNX0NPTkZJR19GSUxFX05BTUUiLCJERUZBVUxUX0xJVEVTVFJFQU1fQ09ORklHX1BBVEgiLCJidWlsZFJlbW92ZVNxbGl0ZURiQ29tbWFuZCIsImdldExpdGVzdHJlYW1Db25maWdPcHRpb24iLCJwYXJzZSIsInBhcnNlRG90ZW52IiwiZGVwbG95Q29tbWFuZCIsImJ1aWxkZXIiLCJidWlsZGVyIiwiZnMiLCJzZXRUaW1lb3V0IiwiYnVpbGRlciIsInNldFRpbWVvdXQiLCJmcyIsImJ1aWxkZXIiLCJ0b1Vuc2NvcGVkUGFja2FnZU5hbWUiLCJpc0RvY2tlckVuYWJsZWQiLCJjaGlsZF9wcm9jZXNzIiwiYnVpbGRlciIsImJ1aWxkZXIiLCJidWlsZGVyIiwiZnMiLCJjaGlsZF9wcm9jZXNzIiwiYnVpbGRlciIsImJ1aWxkZXIiLCJidWlsZGVyIiwiYnVpbGRlciIsImJ1aWxkZXIiLCJkZXBsb3lDb21tYW5kIl0sInNvdXJjZXMiOlsiLi4vLi4vc2hhcmVkLWxpYi1ub2RlL3NyYy9lbnYudHMiLCIuLi8uLi9zaGFyZWQtbGliLW5vZGUvc3JjL2Vycm5vLnRzIiwiLi4vLi4vc2hhcmVkLWxpYi1ub2RlL3NyYy9wcm9jZXNzVHJlZS50cyIsIi4uLy4uL3NoYXJlZC1saWItbm9kZS9zcmMvdHJlZUtpbGwudHMiLCIuLi8uLi9zaGFyZWQtbGliLW5vZGUvc3JjL3NwYXduLnRzIiwiLi4vLi4vc2hhcmVkLWxpYi9zcmMvZXJyb3IudHMiLCIuLi8uLi8uLi9ub2RlX21vZHVsZXMvYXQtZGVjb3JhdG9ycy9kaXN0L2hhc2guanMiLCIuLi8uLi8uLi9ub2RlX21vZHVsZXMvYXQtZGVjb3JhdG9ycy9kaXN0L29zb24vY29uc3RydWN0b3JzLmpzIiwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2F0LWRlY29yYXRvcnMvZGlzdC9vc29uL3N0cmluZ2lmeS5qcyIsIi4uLy4uLy4uL25vZGVfbW9kdWxlcy9hdC1kZWNvcmF0b3JzL2Rpc3QvZ2V0Q2FjaGVLZXkuanMiLCIuLi8uLi8uLi9ub2RlX21vZHVsZXMvYXQtZGVjb3JhdG9ycy9kaXN0L21lbW9pemVPbmUuanMiLCIuLi9zcmMvdXRpbHMvYmluUGF0aC50cyIsIi4uL3NyYy91dGlscy9jaS50cyIsIi4uL3NyYy9wcm9qZWN0LnRzIiwiLi4vc3JjL2NvbW1hbmRzL2J1aWxkSWZOZWVkZWQudHMiLCIuLi9zcmMvdXRpbHMvcHJvbWlzZVBvb2wudHMiLCIuLi9zcmMvc2NyaXB0cy9ydW4udHMiLCIuLi9zcmMvc2hhcmVkT3B0aW9uc0J1aWxkZXIudHMiLCIuLi9zcmMvY29tbWFuZHMvY29uY3VycmVudGx5LnRzIiwiLi4vc3JjL3V0aWxzL3NoZWxsLnRzIiwiLi4vc3JjL3V0aWxzL3dyYW5nbGVyLnRzIiwiLi4vc3JjL3NjcmlwdHMvZHJpenpsZVNjcmlwdHMudHMiLCIuLi9zcmMvdXRpbHMvd3JhbmdsZXJDb25maWcudHMiLCIuLi9zcmMvY29tbWFuZHMvZ2VuRGV2VmFycy50cyIsIi4uL3NyYy9jb21tYW5kcy9kZXBsb3kudHMiLCIuLi9zcmMvY29tbWFuZHMvZG90ZW52LnRzIiwiLi4vc3JjL3NjcmlwdHMvcHJpc21hU2NyaXB0cy50cyIsIi4uL3NyYy9jb21tYW5kcy9nZW5Db2RlLnRzIiwiLi4vc3JjL2NvbW1hbmRzL2tpbGxQb3J0SWZOb25DaS50cyIsIi4uL3NyYy91dGlscy9vdXRwdXQudHMiLCIuLi9zcmMvY29tbWFuZHMvbGludC50cyIsIi4uL3NyYy91dGlscy9wb3J0LnRzIiwiLi4vc3JjL3V0aWxzL3Byb2Nlc3MudHMiLCIuLi9zcmMvY29tbWFuZHMvbWFpbnRlbmFuY2UudHMiLCIuLi9zcmMvY29tbWFuZHMvY29tbWFuZFV0aWxzLnRzIiwiLi4vc3JjL2NvbW1hbmRzL29wdGltaXplRm9yRG9ja2VyQnVpbGQudHMiLCIuLi9zcmMvY29tbWFuZHMvcHJpc21hLnRzIiwiLi4vc3JjL2NvbW1hbmRzL3JldHJ5LnRzIiwiLi4vc3JjL2NvbW1hbmRzL3NldHVwLnRzIiwiLi4vc3JjL2NvbW1hbmRzL3NldHVwUHJpdmF0ZVBhY2thZ2VzLnRzIiwiLi4vc3JjL3NjcmlwdHMvYnVpbGRlci50cyIsIi4uL3NyYy9zY3JpcHRzL2RvY2tlclNjcmlwdHMudHMiLCIuLi9zcmMvc2NyaXB0cy9leGVjdXRpb24vYmFzZVNjcmlwdHMudHMiLCIuLi9zcmMvc2NyaXB0cy9leGVjdXRpb24vYmxpdHpTY3JpcHRzLnRzIiwiLi4vc3JjL3NjcmlwdHMvZXhlY3V0aW9uL2h0dHBTZXJ2ZXJTY3JpcHRzLnRzIiwiLi4vc3JjL3NjcmlwdHMvZXhlY3V0aW9uL25leHRTY3JpcHRzLnRzIiwiLi4vc3JjL3V0aWxzL2xvZy50cyIsIi4uL3NyYy9zY3JpcHRzL2V4ZWN1dGlvbi9wbGFpbkFwcFNjcmlwdHMudHMiLCIuLi9zcmMvc2NyaXB0cy9leGVjdXRpb24vcmVtaXhTY3JpcHRzLnRzIiwiLi4vc3JjL3NjcmlwdHMvZXhlY3V0aW9uL3ZpbmV4dFNjcmlwdHMudHMiLCIuLi9zcmMvc2NyaXB0cy9leGVjdXRpb24vdml0ZVNjcmlwdHMudHMiLCIuLi9zcmMvc2NyaXB0cy9leGVjdXRpb24vd29ya2Vyc1NjcmlwdHMudHMiLCIuLi9zcmMvY29tbWFuZHMvaHR0cFNlcnZlclBhY2thZ2VzLnRzIiwiLi4vc3JjL2NvbW1hbmRzL3N0YXJ0LnRzIiwiLi4vc3JjL2NvbW1hbmRzL3Rlc3QudHMiLCIuLi9zcmMvY29tbWFuZHMvdGVzdE9uQ2kudHMiLCIuLi9zcmMvY29tbWFuZHMvdHJlZUtpbGwudHMiLCIuLi9zcmMvY29tbWFuZHMvdHlwZWNoZWNrLnRzIiwiLi4vc3JjL2NvbW1hbmRzL3ZlcmlmeUNvZGUudHMiLCIuLi9zcmMvaW5kZXgudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcbmltcG9ydCBjaGlsZFByb2Nlc3MgZnJvbSAnbm9kZTpjaGlsZF9wcm9jZXNzJztcblxuaW1wb3J0IHsgY29uZmlnIH0gZnJvbSAnZG90ZW52JztcbmltcG9ydCB7IGV4cGFuZCB9IGZyb20gJ2RvdGVudi1leHBhbmQnO1xuaW1wb3J0IHR5cGUgeyBBcmd1bWVudHNDYW1lbENhc2UsIEluZmVycmVkT3B0aW9uVHlwZXMgfSBmcm9tICd5YXJncyc7XG5cbmV4cG9ydCBjb25zdCB5YXJnc09wdGlvbnNCdWlsZGVyRm9yRW52ID0ge1xuICBlbnY6IHtcbiAgICBkZXNjcmlwdGlvbjogJy5lbnYgZmlsZXMgdG8gYmUgbG9hZGVkLicsXG4gICAgbmFyZ3M6IDEsXG4gICAgdHlwZTogJ2FycmF5JyxcbiAgfSxcbiAgJ2Nhc2NhZGUtZW52Jzoge1xuICAgIGRlc2NyaXB0aW9uOlxuICAgICAgJ0Vudmlyb25tZW50IHRvIGxvYWQgY2FzY2FkaW5nIC5lbnYgZmlsZXMgKGUuZy4sIGAuZW52YCwgYC5lbnYuPGVudmlyb25tZW50PmAsIGAuZW52LmxvY2FsYCBhbmQgYC5lbnYuPGVudmlyb25tZW50Pi5sb2NhbGApLiBQcmVmZXJyZWQgb3ZlciBgY2FzY2FkZS1ub2RlLWVudmAgYW5kIGBhdXRvLWNhc2NhZGUtZW52YC4nLFxuICAgIHR5cGU6ICdzdHJpbmcnLFxuICB9LFxuICAnY2FzY2FkZS1ub2RlLWVudic6IHtcbiAgICBkZXNjcmlwdGlvbjogJ1NhbWUgd2l0aCAtLWNhc2NhZGUtZW52PTxOT0RFX0VOViB8fCBcImRldmVsb3BtZW50XCI+LiBQcmVmZXJyZWQgb3ZlciBgYXV0by1jYXNjYWRlLWVudmAuJyxcbiAgICB0eXBlOiAnYm9vbGVhbicsXG4gIH0sXG4gICdhdXRvLWNhc2NhZGUtZW52Jzoge1xuICAgIGRlc2NyaXB0aW9uOiAnU2FtZSB3aXRoIC0tY2FzY2FkZS1lbnY9PFdCX0VOViB8fCBOT0RFX0VOViB8fCBcImRldmVsb3BtZW50XCI+LicsXG4gICAgdHlwZTogJ2Jvb2xlYW4nLFxuICAgIGRlZmF1bHQ6IHRydWUsXG4gIH0sXG4gICdpbmNsdWRlLXJvb3QtZW52Jzoge1xuICAgIGRlc2NyaXB0aW9uOiAnSW5jbHVkZSAuZW52IGZpbGVzIGluIHJvb3QgZGlyZWN0b3J5IGlmIHRoZSBwcm9qZWN0IGlzIGluIGEgbW9ub3JlcG8gYW5kIC0tZW52IG9wdGlvbiBpcyBub3QgdXNlZC4nLFxuICAgIHR5cGU6ICdib29sZWFuJyxcbiAgICBkZWZhdWx0OiB0cnVlLFxuICB9LFxuICAnY2hlY2stZW52Jzoge1xuICAgIGRlc2NyaXB0aW9uOiAnQ2hlY2sgd2hldGhlciB0aGUga2V5cyBvZiB0aGUgbG9hZGVkIC5lbnYgZmlsZXMgYXJlIHNhbWUgd2l0aCB0aGUgZ2l2ZW4gLmVudiBmaWxlLicsXG4gICAgdHlwZTogJ3N0cmluZycsXG4gICAgZGVmYXVsdDogJy5lbnYuZXhhbXBsZScsXG4gIH0sXG4gICdxdWlldC1lbnYnOiB7XG4gICAgZGVzY3JpcHRpb246ICdTdXBwcmVzcyAuZW52IGZpbGUgbG9hZGluZyBpbmZvcm1hdGlvbi4nLFxuICAgIHR5cGU6ICdib29sZWFuJyxcbiAgfSxcbiAgdmVyYm9zZToge1xuICAgIGRlc2NyaXB0aW9uOiAnV2hldGhlciB0byBzaG93IHZlcmJvc2UgaW5mb3JtYXRpb24nLFxuICAgIHR5cGU6ICdib29sZWFuJyxcbiAgICBhbGlhczogJ3YnLFxuICB9LFxufSBhcyBjb25zdDtcblxuZXhwb3J0IHR5cGUgRW52UmVhZGVyT3B0aW9ucyA9IFBhcnRpYWw8QXJndW1lbnRzQ2FtZWxDYXNlPEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIHlhcmdzT3B0aW9uc0J1aWxkZXJGb3JFbnY+Pj47XG5cbi8qKlxuICogVGhpcyBmdW5jdGlvbiByZWFkcyBlbnZpcm9ubWVudCB2YXJpYWJsZXMgZnJvbSBgLmVudmAgZmlsZXMuXG4gKiBOb3RlIGl0IGRvZXMgbm90IGFzc2lnbiB0aGVtIGluIGBwcm9jZXNzLmVudmAuXG4gKiBAcmV0dXJuIFtlbnZWYXJzLCBbZW52UGF0aHMsIGVudlZhck5hbWVzXVtdXVxuICogKi9cbmV4cG9ydCBmdW5jdGlvbiByZWFkRW52aXJvbm1lbnRWYXJpYWJsZXMoXG4gIGFyZ3Y6IEVudlJlYWRlck9wdGlvbnMsXG4gIGN3ZDogc3RyaW5nLFxuICBvcHRpb25zPzoge1xuICAgIC8qKlxuICAgICAqIExvYWQgdmFyaWFibGVzIGV2ZW4gaWYgdGhleSBhbHJlYWR5IGV4aXN0IGluIHByb2Nlc3MuZW52LlxuICAgICAqIFVzZWZ1bCB3aGVuIGEgcGFyZW50IHByb2Nlc3MgaGFzIGFscmVhZHkgaW5qZWN0ZWQgdGhlIC5lbnYgdmFsdWVzIGludG8gdGhlIGVudmlyb25tZW50XG4gICAgICogYW5kIHRoZSBmaWxlLWRlZmluZWQgdmFyaWFibGVzIHRoZW1zZWx2ZXMgYXJlIG5lZWRlZCAoZS5nLiBgd2IgZ2VuLWRldi12YXJzYCkuXG4gICAgICovXG4gICAgaWdub3JlUHJvY2Vzc0Vudj86IGJvb2xlYW47XG4gIH1cbik6IFtSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+LCBbc3RyaW5nLCBzdHJpbmdbXV1bXV0ge1xuICBsZXQgZW52UGF0aHMgPSAoYXJndi5lbnYgPz8gW10pLm1hcCgoZW52UGF0aCkgPT4gcGF0aC5yZXNvbHZlKGN3ZCwgZW52UGF0aC50b1N0cmluZygpKSk7XG4gIC8vIFJlYWQgTk9ERV9FTlYgdGhyb3VnaCBhbiBhbGlhcywgbmV2ZXIgYXMgdGhlIGBwcm9jZXNzLmVudi5OT0RFX0VOVmAgbWVtYmVyIGV4cHJlc3Npb246XG4gIC8vIGJ1bmRsZXJzIHJlcGxhY2UgdGhhdCBleGFjdCBleHByZXNzaW9uIGF0IGJ1aWxkIHRpbWUgKHJvbGxkb3duL2J1aWxkLXRzIGlubGluZSBpdCBhc1xuICAvLyAncHJvZHVjdGlvbicpLCB3aGljaCBjb25zdGFudC1mb2xkcyB0aGUgZmFsbGJhY2sgYmVsb3cgYW5kIG1hZGUgdGhlIHB1Ymxpc2hlZCB3YiBzZWxlY3RcbiAgLy8gdGhlIHByb2R1Y3Rpb24gcHJvZmlsZSB3aGVuZXZlciBXQl9FTlYgd2FzIHVuc2V0LlxuICBjb25zdCBydW50aW1lRW52ID0gcHJvY2Vzcy5lbnY7XG4gIGNvbnN0IGNhc2NhZGUgPVxuICAgIGFyZ3YuY2FzY2FkZUVudiA/P1xuICAgIChhcmd2LmNhc2NhZGVOb2RlRW52XG4gICAgICA/IHJ1bnRpbWVFbnYuTk9ERV9FTlYgfHwgJ2RldmVsb3BtZW50J1xuICAgICAgOiBhcmd2LmF1dG9DYXNjYWRlRW52XG4gICAgICAgID8gcnVudGltZUVudi5XQl9FTlYgfHwgcnVudGltZUVudi5OT0RFX0VOViB8fCAnZGV2ZWxvcG1lbnQnXG4gICAgICAgIDogdW5kZWZpbmVkKTtcbiAgaWYgKHR5cGVvZiBjYXNjYWRlID09PSAnc3RyaW5nJykge1xuICAgIGlmIChlbnZQYXRocy5sZW5ndGggPT09IDApIHtcbiAgICAgIGVudlBhdGhzLnB1c2gocGF0aC5qb2luKGN3ZCwgJy5lbnYnKSk7XG4gICAgICBpZiAoYXJndi5pbmNsdWRlUm9vdEVudikge1xuICAgICAgICBjb25zdCByb290UGF0aCA9IHBhdGgucmVzb2x2ZShjd2QsICcuLicsICcuLicpO1xuICAgICAgICBpZiAoZnMuZXhpc3RzU3luYyhwYXRoLmpvaW4ocm9vdFBhdGgsICdwYWNrYWdlLmpzb24nKSkpIHtcbiAgICAgICAgICBlbnZQYXRocy5wdXNoKHBhdGguam9pbihyb290UGF0aCwgJy5lbnYnKSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgZW52UGF0aHMgPSBlbnZQYXRocy5mbGF0TWFwKChlbnZQYXRoKSA9PlxuICAgICAgY2FzY2FkZVxuICAgICAgICA/IFtgJHtlbnZQYXRofS4ke2Nhc2NhZGV9LmxvY2FsYCwgYCR7ZW52UGF0aH0ubG9jYWxgLCBgJHtlbnZQYXRofS4ke2Nhc2NhZGV9YCwgZW52UGF0aF1cbiAgICAgICAgOiBbYCR7ZW52UGF0aH0ubG9jYWxgLCBlbnZQYXRoXVxuICAgICk7XG4gIH1cbiAgZW52UGF0aHMgPSBlbnZQYXRocy5maWx0ZXIoKGVudlBhdGgpID0+IGZzLmV4aXN0c1N5bmMoZW52UGF0aCkpLm1hcCgoZW52UGF0aCkgPT4gcGF0aC5yZWxhdGl2ZShjd2QsIGVudlBhdGgpKTtcbiAgY29uc3Qgc2hvdWxkU3VwcHJlc3NPdXRwdXQgPSBzaG91bGRTdXBwcmVzc0Vudmlyb25tZW50T3V0cHV0KGFyZ3YpO1xuICBpZiAoYXJndi52ZXJib3NlICYmICFzaG91bGRTdXBwcmVzc091dHB1dCkge1xuICAgIGNvbnNvbGUuaW5mbyhgV0JfRU5WOiAke3J1bnRpbWVFbnYuV0JfRU5WfSwgTk9ERV9FTlY6ICR7cnVudGltZUVudi5OT0RFX0VOVn1gKTtcbiAgICBjb25zb2xlLmluZm8oJ1JlYWRpbmcgZW52IGZpbGVzOicsIGVudlBhdGhzLmpvaW4oJywgJykpO1xuICB9XG5cbiAgY29uc3QgZW52UGF0aEFuZExvYWRlZEVudlZhck5hbWVzOiBbc3RyaW5nLCBzdHJpbmdbXV1bXSA9IFtdO1xuICBjb25zdCBlbnZWYXJzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge307XG4gIGZvciAoY29uc3QgZW52UGF0aCBvZiBlbnZQYXRocykge1xuICAgIGNvbnN0IGtleXM6IHN0cmluZ1tdID0gW107XG4gICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMocmVhZEVudkZpbGUocGF0aC5qb2luKGN3ZCwgZW52UGF0aCkpKSkge1xuICAgICAgaWYgKCEoa2V5IGluIGVudlZhcnMpICYmIChvcHRpb25zPy5pZ25vcmVQcm9jZXNzRW52IHx8ICEoa2V5IGluIHByb2Nlc3MuZW52KSkpIHtcbiAgICAgICAgZW52VmFyc1trZXldID0gdmFsdWU7XG4gICAgICAgIGtleXMucHVzaChrZXkpO1xuICAgICAgfVxuICAgIH1cbiAgICBlbnZQYXRoQW5kTG9hZGVkRW52VmFyTmFtZXMucHVzaChbZW52UGF0aCwga2V5c10pO1xuICAgIGlmIChhcmd2LnZlcmJvc2UgJiYgIXNob3VsZFN1cHByZXNzT3V0cHV0ICYmIGtleXMubGVuZ3RoID4gMCkge1xuICAgICAgY29uc29sZS5pbmZvKGBSZWFkICR7a2V5cy5sZW5ndGh9IGVudmlyb25tZW50IHZhcmlhYmxlcyBmcm9tICR7ZW52UGF0aH1gKTtcbiAgICB9XG4gIH1cbiAgY29uc3QgW2Zub3hFbnZWYXJzLCBmbm94RW52VmFyTmFtZXNdID0gcmVhZEZub3hFbnZpcm9ubWVudFZhcmlhYmxlcyhjd2QsIGNhc2NhZGUsIGVudlZhcnMsIG9wdGlvbnMpO1xuICBPYmplY3QuYXNzaWduKGVudlZhcnMsIGZub3hFbnZWYXJzKTtcbiAgaWYgKGZub3hFbnZWYXJOYW1lcy5sZW5ndGggPiAwKSB7XG4gICAgZW52UGF0aEFuZExvYWRlZEVudlZhck5hbWVzLnB1c2goW2Zub3hFbnZpcm9ubWVudFNvdXJjZU5hbWUoY2FzY2FkZSksIGZub3hFbnZWYXJOYW1lc10pO1xuICAgIGlmIChhcmd2LnZlcmJvc2UgJiYgIXNob3VsZFN1cHByZXNzT3V0cHV0KSB7XG4gICAgICBjb25zb2xlLmluZm8oYFJlYWQgJHtmbm94RW52VmFyTmFtZXMubGVuZ3RofSBlbnZpcm9ubWVudCB2YXJpYWJsZXMgZnJvbSAke2Zub3hFbnZpcm9ubWVudFNvdXJjZU5hbWUoY2FzY2FkZSl9YCk7XG4gICAgfVxuICB9XG4gIGNvbnN0IFttaXNlRW52VmFycywgbWlzZUVudlZhck5hbWVzXSA9IHJlYWRNaXNlRW52aXJvbm1lbnRWYXJpYWJsZXMoY3dkLCBjYXNjYWRlLCBlbnZWYXJzLCBvcHRpb25zKTtcbiAgT2JqZWN0LmFzc2lnbihlbnZWYXJzLCBtaXNlRW52VmFycyk7XG4gIGlmIChtaXNlRW52VmFyTmFtZXMubGVuZ3RoID4gMCkge1xuICAgIGVudlBhdGhBbmRMb2FkZWRFbnZWYXJOYW1lcy5wdXNoKFttaXNlRW52aXJvbm1lbnRTb3VyY2VOYW1lKGNhc2NhZGUpLCBtaXNlRW52VmFyTmFtZXNdKTtcbiAgICBpZiAoYXJndi52ZXJib3NlICYmICFzaG91bGRTdXBwcmVzc091dHB1dCkge1xuICAgICAgY29uc29sZS5pbmZvKGBSZWFkICR7bWlzZUVudlZhck5hbWVzLmxlbmd0aH0gZW52aXJvbm1lbnQgdmFyaWFibGVzIGZyb20gJHttaXNlRW52aXJvbm1lbnRTb3VyY2VOYW1lKGNhc2NhZGUpfWApO1xuICAgIH1cbiAgfVxuICBpZiAoIWFyZ3YudmVyYm9zZSAmJiAhc2hvdWxkU3VwcHJlc3NPdXRwdXQpIHtcbiAgICBjb25zb2xlLmluZm8oXG4gICAgICBgUmVhZCBlbnYgZmlsZXM6ICR7ZW52UGF0aEFuZExvYWRlZEVudlZhck5hbWVzLm1hcCgoW2VudlBhdGgsIGtleXNdKSA9PiAoa2V5cy5sZW5ndGggPiAwID8gYCR7ZW52UGF0aH0gKCR7a2V5cy5qb2luKCcsICcpfSlgIDogZW52UGF0aCkpLmpvaW4oJywgJykgfHwgJ25vdGhpbmcnfWBcbiAgICApO1xuICB9XG5cbiAgaWYgKGFyZ3YuY2hlY2tFbnYpIHtcbiAgICBjb25zdCBleGFtcGxlS2V5cyA9IE9iamVjdC5rZXlzKHJlYWRFbnZGaWxlKHBhdGguam9pbihjd2QsIGFyZ3YuY2hlY2tFbnYpKSk7XG4gICAgY29uc3QgbWlzc2luZ0tleXMgPSBleGFtcGxlS2V5cy5maWx0ZXIoKGtleSkgPT4gIShrZXkgaW4gZW52VmFycykgJiYgIShrZXkgaW4gcHJvY2Vzcy5lbnYpKTtcbiAgICBpZiAobWlzc2luZ0tleXMubGVuZ3RoID4gMCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBNaXNzaW5nIGVudmlyb25tZW50IHZhcmlhYmxlcyBpbiBbJHtlbnZQYXRocy5qb2luKCcsICcpfV06IFske21pc3NpbmdLZXlzLmpvaW4oJywgJyl9XWApO1xuICAgIH1cbiAgfVxuICAvLyBFeHBhbmQgcmVmZXJlbmNlcyBhZ2FpbnN0IHRoZSBsaXZlIGVudmlyb25tZW50IGZvciBrZXlzIE5PVCBsb2FkZWQgZnJvbSBmaWxlcywgc28gdGhhdCBhXG4gIC8vIHJlZmVyZW5jZSB0byBhbiBleHBvcnRlZCBrZXkgKGV4Y2x1ZGVkIGZyb20gZW52VmFycyBieSBwcm9jZXNzLWVudiBwcmVjZWRlbmNlKSByZXNvbHZlcyB0b1xuICAvLyB0aGUgZWZmZWN0aXZlIHZhbHVlIGluc3RlYWQgb2YgYW4gZW1wdHkgc3RyaW5nLiBMb2FkZWQga2V5cyBhcmUgZGVsaWJlcmF0ZWx5IGFic2VudCBmcm9tXG4gIC8vIHRoZSByZWZlcmVuY2Ugc2V0OiBkb3RlbnYtZXhwYW5kIHdvdWxkIG90aGVyd2lzZSByZXBsYWNlIHRoZWlyIHBhcnNlZCB2YWx1ZXMgd2l0aCB0aGVcbiAgLy8gcHJvY2VzcyB2YWx1ZXMsIGJyZWFraW5nIGNhbGxlcnMgdGhhdCBuZWVkIHRoZSBmaWxlLWRlZmluZWQgdmFsdWVzIHRoZW1zZWx2ZXMuXG4gIGNvbnN0IHJlZmVyZW5jZUVudjogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHt9O1xuICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhwcm9jZXNzLmVudikpIHtcbiAgICAvLyBFc2NhcGUgZG9sbGFyIHNpZ25zIHNvIGRvdGVudi1leHBhbmQgc3Vic3RpdHV0ZXMgZXhwb3J0ZWQgdmFsdWVzIGxpdGVyYWxseSBpbnN0ZWFkIG9mXG4gICAgLy8gcmVjdXJzaXZlbHkgcmUtZXhwYW5kaW5nIHRoZW0gKGFuIGV4cG9ydGVkIGBwYSR3b3JkYCBtdXN0IHN0YXkgYHBhJHdvcmRgKS5cbiAgICBpZiAodmFsdWUgIT09IHVuZGVmaW5lZCAmJiAhKGtleSBpbiBlbnZWYXJzKSkgcmVmZXJlbmNlRW52W2tleV0gPSB2YWx1ZS5yZXBsYWNlQWxsKCckJywgU3RyaW5nLnJhd2BcXCRgKTtcbiAgfVxuICAvLyBkb3RlbnYtZXhwYW5kIHJlc29sdmVzIHJlZmVyZW5jZXMgaW4ga2V5LWluc2VydGlvbiBvcmRlciwgc28gYSAuZW52IHZhbHVlIHJlZmVyZW5jaW5nIGFcbiAgLy8gZm5veC9taXNlLXByb3ZpZGVkIGtleSB3b3VsZCBzZWUgYW4gZW1wdHkgc3RyaW5nIGlmIHRoZSBmbm94L21pc2UgZW50cmllcyBzdGF5ZWQgYXBwZW5kZWRcbiAgLy8gYWZ0ZXIgdGhlIC5lbnYgZW50cmllcy4gUmVidWlsZCB0aGUgZXhwYW5zaW9uIGlucHV0IHdpdGggdGhlIGxvd2VyLXByaW9yaXR5IHNvdXJjZXMgZmlyc3Q7XG4gIC8vIHRoZSB2YWx1ZXMgdGhlbXNlbHZlcyBhbHJlYWR5IHJlZmxlY3QgdGhlIGludGVuZGVkIC5lbnYtb3Zlci1mbm94LW92ZXItbWlzZSBwcmVjZWRlbmNlLlxuICBjb25zdCBvcmRlcmVkRW52VmFyczogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHt9O1xuICBmb3IgKGNvbnN0IGtleSBvZiBbLi4ubWlzZUVudlZhck5hbWVzLCAuLi5mbm94RW52VmFyTmFtZXNdKSBvcmRlcmVkRW52VmFyc1trZXldID0gZW52VmFyc1trZXldITtcbiAgT2JqZWN0LmFzc2lnbihvcmRlcmVkRW52VmFycywgZW52VmFycyk7XG4gIHJldHVybiBbXG4gICAgZXhwYW5kKHsgcGFyc2VkOiBvcmRlcmVkRW52VmFycywgcHJvY2Vzc0VudjogcmVmZXJlbmNlRW52IH0pLnBhcnNlZCA/PyBvcmRlcmVkRW52VmFycyxcbiAgICBlbnZQYXRoQW5kTG9hZGVkRW52VmFyTmFtZXMsXG4gIF07XG59XG5cbi8qKlxuICogVGhpcyBmdW5jdGlvbiByZWFkcyBlbnZpcm9ubWVudCB2YXJpYWJsZXMgZnJvbSB0aGUgcmVwb3NpdG9yeSdzIGZub3ggY29uZmlndXJhdGlvbiAoYGZub3gudG9tbGApLlxuICogVGhlIGJhc2UgYFtzZWNyZXRzXWAgdGFibGUgY29ycmVzcG9uZHMgdG8gYC5lbnZgLCBhbmQgYFtwcm9maWxlcy48Y2FzY2FkZT4uc2VjcmV0c11gIGNvcnJlc3BvbmRzIHRvXG4gKiBgLmVudi48Y2FzY2FkZT5gOyBhbiB1bmtub3duIHByb2ZpbGUgZmFsbHMgYmFjayB0byB0aGUgYmFzZSBzZWNyZXRzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVhZEZub3hFbnZpcm9ubWVudFZhcmlhYmxlcyhcbiAgY3dkOiBzdHJpbmcsXG4gIGNhc2NhZGU6IHN0cmluZyB8IHVuZGVmaW5lZCxcbiAgY3VycmVudEVudlZhcnM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4sXG4gIG9wdGlvbnM/OiB7IGlnbm9yZVByb2Nlc3NFbnY/OiBib29sZWFuIH1cbik6IFtSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+LCBzdHJpbmdbXV0ge1xuICBpZiAoIWhhc1Byb2plY3RGbm94Q29uZmlnKGN3ZCkpIHJldHVybiBbe30sIFtdXTtcblxuICAvLyBgLS1pZi1taXNzaW5nIGVycm9yYDogZm5veCBvdGhlcndpc2UgZXhpdHMgMCBhbmQgc2lsZW50bHkgb21pdHMgc2VjcmV0cyBpdCBmYWlscyB0byByZXNvbHZlXG4gIC8vIChlLmcuIGEgbWlzc2luZyBhZ2Uga2V5KSwgd2hpY2ggd291bGQgYmUgaW5kaXN0aW5ndWlzaGFibGUgZnJvbSB1bmRlY2xhcmVkIHNlY3JldHMuXG4gIC8vIGAtLW5vbi1pbnRlcmFjdGl2ZWA6IHByb21wdHMgb3IgYnJvd3NlciBhdXRoIGZsb3dzIHdvdWxkIGhhbmcgZm9yZXZlciBiZWNhdXNlIHN0ZGluIGlzIGlnbm9yZWQuXG4gIGNvbnN0IGFyZ3MgPSBbJ2V4cG9ydCcsICctLWZvcm1hdCcsICdqc29uJywgJy0tbm8tY29sb3InLCAnLS1pZi1taXNzaW5nJywgJ2Vycm9yJywgJy0tbm9uLWludGVyYWN0aXZlJ107XG4gIGlmIChjYXNjYWRlKSB7XG4gICAgYXJncy5wdXNoKCctLXByb2ZpbGUnLCBjYXNjYWRlKTtcbiAgfVxuICBjb25zdCByZXN1bHQgPSBjaGlsZFByb2Nlc3Muc3Bhd25TeW5jKCdmbm94JywgYXJncywge1xuICAgIGN3ZCxcbiAgICBlbmNvZGluZzogJ3V0ZjgnLFxuICAgIHN0ZGlvOiBbJ2lnbm9yZScsICdwaXBlJywgJ3BpcGUnXSxcbiAgfSk7XG4gIGlmIChyZXN1bHQuZXJyb3IgfHwgcmVzdWx0LnN0YXR1cyAhPT0gMCB8fCAhcmVzdWx0LnN0ZG91dD8udHJpbSgpKSB7XG4gICAgLy8gVGhlIHJlcG9zaXRvcnkgZGVjbGFyZXMgZm5veC1tYW5hZ2VkIHNlY3JldHMgKGZub3gudG9tbCBleGlzdHMpLCBzbyBhIGZhaWxpbmcgZXhwb3J0IG11c3QgYmVcbiAgICAvLyBzdXJmYWNlZDogc3dhbGxvd2luZyBpdCB3b3VsZCBtYWtlIGRlY2xhcmVkIHNlY3JldHMgaW5kaXN0aW5ndWlzaGFibGUgZnJvbSB1bmRlY2xhcmVkIG9uZXMuXG4gICAgY29uc29sZS53YXJuKFxuICAgICAgYEZhaWxlZCB0byByZWFkIGZub3ggc2VjcmV0czogJHtyZXN1bHQuZXJyb3I/Lm1lc3NhZ2UgfHwgcmVzdWx0LnN0ZGVycj8udHJpbSgpIHx8IGBmbm94IGV4aXRlZCB3aXRoIHN0YXR1cyAke3Jlc3VsdC5zdGF0dXN9YH1gXG4gICAgKTtcbiAgICByZXR1cm4gW3t9LCBbXV07XG4gIH1cblxuICBsZXQgcGFyc2VkOiB1bmtub3duO1xuICB0cnkge1xuICAgIHBhcnNlZCA9IEpTT04ucGFyc2UocmVzdWx0LnN0ZG91dCk7XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiBbe30sIFtdXTtcbiAgfVxuICBjb25zdCBzZWNyZXRzID0gKHBhcnNlZCBhcyB7IHNlY3JldHM/OiB1bmtub3duIH0gfCB1bmRlZmluZWQpPy5zZWNyZXRzO1xuICBpZiAoIXNlY3JldHMgfHwgdHlwZW9mIHNlY3JldHMgIT09ICdvYmplY3QnIHx8IEFycmF5LmlzQXJyYXkoc2VjcmV0cykpIHJldHVybiBbe30sIFtdXTtcblxuICBjb25zdCBlbnZWYXJzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge307XG4gIGNvbnN0IGtleXM6IHN0cmluZ1tdID0gW107XG4gIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKHNlY3JldHMpKSB7XG4gICAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gJ3N0cmluZycgfHwga2V5IGluIGN1cnJlbnRFbnZWYXJzKSBjb250aW51ZTtcbiAgICAvLyBFeHBsaWNpdGx5IGV4cG9ydGVkIGVudmlyb25tZW50IHZhcmlhYmxlcyB3aW4gb3ZlciBmbm94IHZhbHVlcywgbWlycm9yaW5nIHRoZSAuZW52IHJ1bGUuXG4gICAgLy8gKFRoZSBtaXNlIHJlYWRlciBiZWxvdyBpbnRlbnRpb25hbGx5IHVzZXMgYSB2YWx1ZS1lcXVhbGl0eSBjaGVjayBpbnN0ZWFkOiBgbWlzZSBlbnZgIGVjaG9lc1xuICAgIC8vIGJhY2sgdmFyaWFibGVzIHRoZSBhbWJpZW50IG1pc2UgYWN0aXZhdGlvbiBhbHJlYWR5IGV4cG9ydGVkLCBhbmQgYSBkaWZmZXJpbmcgdmFsdWUgbWVhbnMgdGhlXG4gICAgLy8gcmVxdWVzdGVkIGNhc2NhZGUgcHJvZmlsZSBzaG91bGQgd2luIG92ZXIgdGhlIHN0YWxlIGFjdGl2YXRpb24uKVxuICAgIGlmICghb3B0aW9ucz8uaWdub3JlUHJvY2Vzc0VudiAmJiBrZXkgaW4gcHJvY2Vzcy5lbnYpIGNvbnRpbnVlO1xuICAgIGVudlZhcnNba2V5XSA9IHZhbHVlO1xuICAgIGtleXMucHVzaChrZXkpO1xuICB9XG4gIHJldHVybiBbZW52VmFycywga2V5c107XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBoYXNQcm9qZWN0Rm5veENvbmZpZyhjd2Q6IHN0cmluZyk6IGJvb2xlYW4ge1xuICBmb3IgKGxldCBjdXJyZW50UGF0aCA9IHBhdGgucmVzb2x2ZShjd2QpOyA7IGN1cnJlbnRQYXRoID0gcGF0aC5kaXJuYW1lKGN1cnJlbnRQYXRoKSkge1xuICAgIGlmIChmcy5leGlzdHNTeW5jKHBhdGguam9pbihjdXJyZW50UGF0aCwgJ2Zub3gudG9tbCcpKSkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIGNvbnN0IHBhcmVudFBhdGggPSBwYXRoLmRpcm5hbWUoY3VycmVudFBhdGgpO1xuICAgIGlmIChwYXJlbnRQYXRoID09PSBjdXJyZW50UGF0aCkgcmV0dXJuIGZhbHNlO1xuICB9XG59XG5cbmZ1bmN0aW9uIGZub3hFbnZpcm9ubWVudFNvdXJjZU5hbWUoY2FzY2FkZTogc3RyaW5nIHwgdW5kZWZpbmVkKTogc3RyaW5nIHtcbiAgcmV0dXJuIGNhc2NhZGUgPyBgZm5veCBleHBvcnQgLS1wcm9maWxlICR7Y2FzY2FkZX1gIDogJ2Zub3ggZXhwb3J0Jztcbn1cblxuZnVuY3Rpb24gcmVhZE1pc2VFbnZpcm9ubWVudFZhcmlhYmxlcyhcbiAgY3dkOiBzdHJpbmcsXG4gIGNhc2NhZGU6IHN0cmluZyB8IHVuZGVmaW5lZCxcbiAgY3VycmVudEVudlZhcnM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4sXG4gIG9wdGlvbnM/OiB7IGlnbm9yZVByb2Nlc3NFbnY/OiBib29sZWFuIH1cbik6IFtSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+LCBzdHJpbmdbXV0ge1xuICBpZiAoIWhhc1Byb2plY3RNaXNlQ29uZmlnKGN3ZCkpIHJldHVybiBbe30sIFtdXTtcblxuICBjb25zdCBhcmdzID0gWydlbnYnLCAnLS1qc29uJywgJy0tY2QnLCBjd2RdO1xuICBpZiAoY2FzY2FkZSkge1xuICAgIGFyZ3MucHVzaCgnLS1lbnYnLCBjYXNjYWRlKTtcbiAgfVxuICBjb25zdCByZXN1bHQgPSBjaGlsZFByb2Nlc3Muc3Bhd25TeW5jKCdtaXNlJywgYXJncywge1xuICAgIGVuY29kaW5nOiAndXRmOCcsXG4gICAgc3RkaW86IFsnaWdub3JlJywgJ3BpcGUnLCAncGlwZSddLFxuICB9KTtcbiAgaWYgKHJlc3VsdC5lcnJvciB8fCByZXN1bHQuc3RhdHVzICE9PSAwIHx8ICFyZXN1bHQuc3Rkb3V0Py50cmltKCkpIHJldHVybiBbe30sIFtdXTtcblxuICBsZXQgcGFyc2VkOiB1bmtub3duO1xuICB0cnkge1xuICAgIHBhcnNlZCA9IEpTT04ucGFyc2UocmVzdWx0LnN0ZG91dCk7XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiBbe30sIFtdXTtcbiAgfVxuICBpZiAoIXBhcnNlZCB8fCB0eXBlb2YgcGFyc2VkICE9PSAnb2JqZWN0JyB8fCBBcnJheS5pc0FycmF5KHBhcnNlZCkpIHJldHVybiBbe30sIFtdXTtcblxuICBjb25zdCBlbnZWYXJzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge307XG4gIGNvbnN0IGtleXM6IHN0cmluZ1tdID0gW107XG4gIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKHBhcnNlZCkpIHtcbiAgICBpZiAodHlwZW9mIHZhbHVlICE9PSAnc3RyaW5nJyB8fCBrZXkgaW4gY3VycmVudEVudlZhcnMpIGNvbnRpbnVlO1xuICAgIGlmIChvcHRpb25zPy5pZ25vcmVQcm9jZXNzRW52KSB7XG4gICAgICAvLyBgbWlzZSBlbnZgIGFsd2F5cyBlbWl0cyBQQVRIIGR1ZSB0byB0b29sIHNoaW1zOyBjb25zdW1lcnMgb2YgZmlsZS1kZWZpbmVkIHZhcmlhYmxlc1xuICAgICAgLy8gKGUuZy4gYHdiIGdlbi1kZXYtdmFyc2ApIG11c3Qgbm90IHByb3BhZ2F0ZSBpdC5cbiAgICAgIGlmIChrZXkgPT09ICdQQVRIJykgY29udGludWU7XG4gICAgfSBlbHNlIGlmIChwcm9jZXNzLmVudltrZXldID09PSB2YWx1ZSkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGVudlZhcnNba2V5XSA9IHZhbHVlO1xuICAgIGtleXMucHVzaChrZXkpO1xuICB9XG4gIHJldHVybiBbZW52VmFycywga2V5c107XG59XG5cbmZ1bmN0aW9uIGhhc1Byb2plY3RNaXNlQ29uZmlnKGN3ZDogc3RyaW5nKTogYm9vbGVhbiB7XG4gIGZvciAobGV0IGN1cnJlbnRQYXRoID0gcGF0aC5yZXNvbHZlKGN3ZCk7IDsgY3VycmVudFBhdGggPSBwYXRoLmRpcm5hbWUoY3VycmVudFBhdGgpKSB7XG4gICAgaWYgKGZzLmV4aXN0c1N5bmMocGF0aC5qb2luKGN1cnJlbnRQYXRoLCAnbWlzZS50b21sJykpIHx8IGZzLmV4aXN0c1N5bmMocGF0aC5qb2luKGN1cnJlbnRQYXRoLCAnLm1pc2UudG9tbCcpKSkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIGNvbnN0IHBhcmVudFBhdGggPSBwYXRoLmRpcm5hbWUoY3VycmVudFBhdGgpO1xuICAgIGlmIChwYXJlbnRQYXRoID09PSBjdXJyZW50UGF0aCkgcmV0dXJuIGZhbHNlO1xuICB9XG59XG5cbmZ1bmN0aW9uIG1pc2VFbnZpcm9ubWVudFNvdXJjZU5hbWUoY2FzY2FkZTogc3RyaW5nIHwgdW5kZWZpbmVkKTogc3RyaW5nIHtcbiAgcmV0dXJuIGNhc2NhZGUgPyBgbWlzZSBlbnYgLS1lbnYgJHtjYXNjYWRlfWAgOiAnbWlzZSBlbnYnO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gc2hvdWxkU3VwcHJlc3NFbnZpcm9ubWVudE91dHB1dChhcmd2OiBFbnZSZWFkZXJPcHRpb25zKTogYm9vbGVhbiB7XG4gIGNvbnN0IG91dHB1dE9wdGlvbnMgPSBhcmd2IGFzIEVudlJlYWRlck9wdGlvbnMgJiB7IHF1aWV0RW52PzogYm9vbGVhbjsgc2lsZW50PzogYm9vbGVhbiB9O1xuICByZXR1cm4gb3V0cHV0T3B0aW9ucy5xdWlldEVudiA9PT0gdHJ1ZSB8fCAob3V0cHV0T3B0aW9ucy5xdWlldEVudiAhPT0gZmFsc2UgJiYgb3V0cHV0T3B0aW9ucy5zaWxlbnQgPT09IHRydWUpO1xufVxuXG4vKipcbiAqIFRoaXMgZnVuY3Rpb24gcmVhZCBlbnZpcm9ubWVudCB2YXJpYWJsZXMgZnJvbSBgLmVudmAgZmlsZXMgYW5kIGFzc2lnbiB0aGVtIGluIGBwcm9jZXNzLmVudmAuXG4gKiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlYWRBbmRBcHBseUVudmlyb25tZW50VmFyaWFibGVzKFxuICBhcmd2OiBFbnZSZWFkZXJPcHRpb25zLFxuICBjd2Q6IHN0cmluZ1xuKTogUmVjb3JkPHN0cmluZywgc3RyaW5nIHwgdW5kZWZpbmVkPiB7XG4gIGNvbnN0IFtlbnZWYXJzXSA9IHJlYWRFbnZpcm9ubWVudFZhcmlhYmxlcyhhcmd2LCBjd2QpO1xuICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhlbnZWYXJzKSkge1xuICAgIGlmICghKGtleSBpbiBwcm9jZXNzLmVudikpIHtcbiAgICAgIHByb2Nlc3MuZW52W2tleV0gPSB2YWx1ZTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGVudlZhcnM7XG59XG5cbmNvbnN0IGNhY2hlZEVudlZhcnMgPSBuZXcgTWFwPHN0cmluZywgUmVjb3JkPHN0cmluZywgc3RyaW5nPj4oKTtcblxuZnVuY3Rpb24gcmVhZEVudkZpbGUoZmlsZVBhdGg6IHN0cmluZyk6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4ge1xuICBjb25zdCBjYWNoZWQgPSBjYWNoZWRFbnZWYXJzLmdldChmaWxlUGF0aCk7XG4gIGlmIChjYWNoZWQpIHJldHVybiBjYWNoZWQ7XG5cbiAgY29uc3QgcGFyc2VkID0gY29uZmlnKHsgcGF0aDogcGF0aC5yZXNvbHZlKGZpbGVQYXRoKSwgcHJvY2Vzc0Vudjoge30sIHF1aWV0OiB0cnVlIH0pLnBhcnNlZCA/PyB7fTtcbiAgY2FjaGVkRW52VmFycy5zZXQoZmlsZVBhdGgsIHBhcnNlZCk7XG4gIHJldHVybiBwYXJzZWQ7XG59XG5cbi8qKlxuICogVGhpcyBmdW5jdGlvbiByZW1vdmVzIGVudmlyb25tZW50IHZhcmlhYmxlcyByZWxhdGVkIHRvIG5wbSBhbmQgeWFybiBmcm9tIHRoZSBnaXZlbiBlbnZpcm9ubWVudCB2YXJpYWJsZXMuXG4gKiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlbW92ZU5wbUFuZFlhcm5FbnZpcm9ubWVudFZhcmlhYmxlcyhlbnZWYXJzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmcgfCB1bmRlZmluZWQ+KTogdm9pZCB7XG4gIC8vIFJlbW92ZSBucG0gJiB5YXJuIGVudmlyb25tZW50IHZhcmlhYmxlcyBmcm9tIHByb2Nlc3MuZW52XG4gIGlmIChlbnZWYXJzLlBBVEggJiYgZW52VmFycy5CRVJSWV9CSU5fRk9MREVSKSB7XG4gICAgZW52VmFycy5QQVRIID0gZW52VmFycy5QQVRILnJlcGxhY2UoYCR7ZW52VmFycy5CRVJSWV9CSU5fRk9MREVSfTpgLCAnJylcbiAgICAgIC8vIFRlbXBvcmFyeSBkaXJlY3RvcnkgaW4gbWFjT1NcbiAgICAgIC5yZXBsYWNlQWxsKC9cXC9wcml2YXRlXFwvdmFyXFwvZm9sZGVyc1xcL1teOl0rOi9nLCAnJylcbiAgICAgIC8vIFRlbXBvcmFyeSBkaXJlY3RvcmllcyBpbiBMaW51eFxuICAgICAgLnJlcGxhY2VBbGwoL1xcL3ZhclxcL3RtcFxcL1teOl0rOi9nLCAnJylcbiAgICAgIC5yZXBsYWNlQWxsKC9cXC90bXBcXC9bXjpdKzovZywgJycpO1xuICB9XG4gIGZvciAoY29uc3Qga2V5IG9mIE9iamVjdC5rZXlzKGVudlZhcnMpKSB7XG4gICAgY29uc3QgdXBwZXJLZXkgPSBrZXkudG9VcHBlckNhc2UoKTtcbiAgICBpZiAoXG4gICAgICB1cHBlcktleS5zdGFydHNXaXRoKCdOUE1fJykgfHxcbiAgICAgIHVwcGVyS2V5LnN0YXJ0c1dpdGgoJ1lBUk5fJykgfHxcbiAgICAgIHVwcGVyS2V5LnN0YXJ0c1dpdGgoJ0JFUlJZXycpIHx8XG4gICAgICB1cHBlcktleSA9PT0gJ1BST0pFQ1RfQ1dEJyB8fFxuICAgICAgdXBwZXJLZXkgPT09ICdJTklUX0NXRCdcbiAgICApIHtcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZHluYW1pYy1kZWxldGVcbiAgICAgIGRlbGV0ZSBlbnZWYXJzW2tleV07XG4gICAgfVxuICB9XG59XG4iLCJleHBvcnQgZnVuY3Rpb24gaXNFcnJub0V4Y2VwdGlvbihlcnJvcjogdW5rbm93bik6IGVycm9yIGlzIE5vZGVKUy5FcnJub0V4Y2VwdGlvbiB7XG4gIHJldHVybiBlcnJvciBpbnN0YW5jZW9mIEVycm9yICYmICdjb2RlJyBpbiBlcnJvcjtcbn1cbiIsImV4cG9ydCBmdW5jdGlvbiBidWlsZENoaWxkcmVuQnlQYXJlbnRNYXAocHNPdXRwdXQ6IHN0cmluZyk6IE1hcDxudW1iZXIsIG51bWJlcltdPiB7XG4gIGNvbnN0IGNoaWxkcmVuQnlQYXJlbnQgPSBuZXcgTWFwPG51bWJlciwgbnVtYmVyW10+KCk7XG4gIGZvciAoY29uc3QgbGluZSBvZiBwc091dHB1dC5zcGxpdCgnXFxuJykpIHtcbiAgICBjb25zdCBtYXRjaGVkID0gL15cXHMqKFxcZCspXFxzKyhcXGQrKVxccyokLy5leGVjKGxpbmUpO1xuICAgIGlmICghbWF0Y2hlZCkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgY29uc3QgY2hpbGRQaWQgPSBOdW1iZXIobWF0Y2hlZFsxXSk7XG4gICAgY29uc3QgcGFyZW50UGlkID0gTnVtYmVyKG1hdGNoZWRbMl0pO1xuICAgIGNvbnN0IGNoaWxkcmVuID0gY2hpbGRyZW5CeVBhcmVudC5nZXQocGFyZW50UGlkKTtcbiAgICBpZiAoY2hpbGRyZW4pIHtcbiAgICAgIGNoaWxkcmVuLnB1c2goY2hpbGRQaWQpO1xuICAgIH0gZWxzZSB7XG4gICAgICBjaGlsZHJlbkJ5UGFyZW50LnNldChwYXJlbnRQaWQsIFtjaGlsZFBpZF0pO1xuICAgIH1cbiAgfVxuICByZXR1cm4gY2hpbGRyZW5CeVBhcmVudDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNvbGxlY3REZXNjZW5kYW50UGlkcyhyb290UGlkOiBudW1iZXIsIGNoaWxkcmVuQnlQYXJlbnQ6IE1hcDxudW1iZXIsIG51bWJlcltdPik6IG51bWJlcltdIHtcbiAgY29uc3QgZGVzY2VuZGFudHM6IG51bWJlcltdID0gW107XG4gIGNvbnN0IHF1ZXVlID0gWy4uLihjaGlsZHJlbkJ5UGFyZW50LmdldChyb290UGlkKSA/PyBbXSldO1xuICBsZXQgaW5kZXggPSAwO1xuICB3aGlsZSAoaW5kZXggPCBxdWV1ZS5sZW5ndGgpIHtcbiAgICBjb25zdCBwaWQgPSBxdWV1ZVtpbmRleF0gYXMgbnVtYmVyO1xuICAgIGluZGV4ICs9IDE7XG4gICAgZGVzY2VuZGFudHMucHVzaChwaWQpO1xuICAgIHF1ZXVlLnB1c2goLi4uKGNoaWxkcmVuQnlQYXJlbnQuZ2V0KHBpZCkgPz8gW10pKTtcbiAgfVxuICByZXR1cm4gZGVzY2VuZGFudHM7XG59XG4iLCJpbXBvcnQgeyBleGVjRmlsZVN5bmMgfSBmcm9tICdub2RlOmNoaWxkX3Byb2Nlc3MnO1xuXG5pbXBvcnQgeyBpc0Vycm5vRXhjZXB0aW9uIH0gZnJvbSAnLi9lcnJuby5qcyc7XG5pbXBvcnQgeyBidWlsZENoaWxkcmVuQnlQYXJlbnRNYXAsIGNvbGxlY3REZXNjZW5kYW50UGlkcyBhcyBjb2xsZWN0RGVzY2VuZGFudFBpZHNGcm9tTWFwIH0gZnJvbSAnLi9wcm9jZXNzVHJlZS5qcyc7XG5cbmV4cG9ydCBmdW5jdGlvbiB0cmVlS2lsbChwaWQ6IG51bWJlciwgc2lnbmFsOiBOb2RlSlMuU2lnbmFscyA9ICdTSUdURVJNJyk6IHZvaWQge1xuICBpZiAoIU51bWJlci5pc0ludGVnZXIocGlkKSB8fCBwaWQgPD0gMCkge1xuICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBwaWQ6ICR7cGlkfWApO1xuICB9XG5cbiAgaWYgKHByb2Nlc3MucGxhdGZvcm0gPT09ICd3aW4zMicpIHtcbiAgICBraWxsVHJlZU9uV2luZG93cyhwaWQpO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGNvbnN0IGRlc2NlbmRhbnRzID0gY29sbGVjdERlc2NlbmRhbnRQaWRzKHBpZCk7XG4gIGNvbnN0IHRhcmdldFBpZHMgPSB0b0NoaWxkcmVuRmlyc3RQaWRzKHBpZCwgZGVzY2VuZGFudHMpO1xuICBmb3IgKGNvbnN0IHRhcmdldFBpZCBvZiB0YXJnZXRQaWRzKSB7XG4gICAga2lsbElmTmVlZGVkKHRhcmdldFBpZCwgc2lnbmFsKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBraWxsSWZOZWVkZWQocGlkOiBudW1iZXIsIHNpZ25hbDogTm9kZUpTLlNpZ25hbHMpOiB2b2lkIHtcbiAgdHJ5IHtcbiAgICBwcm9jZXNzLmtpbGwocGlkLCBzaWduYWwpO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGlmIChpc05vU3VjaFByb2Nlc3NFcnJvcihlcnJvcikpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhyb3cgZXJyb3I7XG4gIH1cbn1cblxuZnVuY3Rpb24ga2lsbFRyZWVPbldpbmRvd3MocGlkOiBudW1iZXIpOiB2b2lkIHtcbiAgdHJ5IHtcbiAgICBydW5Db21tYW5kKCd0YXNra2lsbCcsIFsnL1BJRCcsIFN0cmluZyhwaWQpLCAnL1QnLCAnL0YnXSwge1xuICAgICAgbWF4QnVmZmVyOiAxMDI0ICogMTAyNCxcbiAgICAgIHRpbWVvdXQ6IDIwMDAsXG4gICAgfSk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgaWYgKGlzTm9TdWNoUHJvY2Vzc0Vycm9yKGVycm9yKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aHJvdyBlcnJvcjtcbiAgfVxufVxuXG5mdW5jdGlvbiBjb2xsZWN0RGVzY2VuZGFudFBpZHMocm9vdFBpZDogbnVtYmVyKTogbnVtYmVyW10ge1xuICBjb25zdCB7IHN0ZG91dCB9ID0gcnVuQ29tbWFuZChcbiAgICAncHMnLFxuICAgIFsnLUFvJywgJ3BpZD0scHBpZD0nXSxcbiAgICAvLyBLZWVwIGNvbW1hbmQgYm91bmRlZCBzbyB3YXRjaC1tb2RlIGtpbGwgbG9vcHMgY2Fubm90IGhhbmcgdGhpcyBwYXRoLlxuICAgIHsgbWF4QnVmZmVyOiAxMDI0ICogMTAyNCwgdGltZW91dDogMjAwMCB9XG4gICk7XG4gIGNvbnN0IGNoaWxkcmVuQnlQYXJlbnQgPSBidWlsZENoaWxkcmVuQnlQYXJlbnRNYXAoc3Rkb3V0KTtcbiAgcmV0dXJuIGNvbGxlY3REZXNjZW5kYW50UGlkc0Zyb21NYXAocm9vdFBpZCwgY2hpbGRyZW5CeVBhcmVudCk7XG59XG5cbmZ1bmN0aW9uIHRvQ2hpbGRyZW5GaXJzdFBpZHMocGlkOiBudW1iZXIsIGRlc2NlbmRhbnRzOiByZWFkb25seSBudW1iZXJbXSk6IG51bWJlcltdIHtcbiAgY29uc3QgdGFyZ2V0UGlkcyA9IGRlc2NlbmRhbnRzLnRvUmV2ZXJzZWQoKTtcbiAgdGFyZ2V0UGlkcy5wdXNoKHBpZCk7XG4gIHJldHVybiB0YXJnZXRQaWRzO1xufVxuXG5mdW5jdGlvbiBydW5Db21tYW5kKFxuICBjb21tYW5kOiBzdHJpbmcsXG4gIGFyZ3M6IHJlYWRvbmx5IHN0cmluZ1tdLFxuICBvcHRpb25zPzogeyB0aW1lb3V0OiBudW1iZXI7IG1heEJ1ZmZlcjogbnVtYmVyIH1cbik6IHsgc3Rkb3V0OiBzdHJpbmc7IHN0ZGVycjogc3RyaW5nIH0ge1xuICB0cnkge1xuICAgIGNvbnN0IHN0ZG91dCA9IGV4ZWNGaWxlU3luYyhjb21tYW5kLCBbLi4uYXJnc10sIHtcbiAgICAgIGVuY29kaW5nOiAndXRmOCcsXG4gICAgICBtYXhCdWZmZXI6IG9wdGlvbnM/Lm1heEJ1ZmZlcixcbiAgICAgIHRpbWVvdXQ6IG9wdGlvbnM/LnRpbWVvdXQsXG4gICAgICBzdGRpbzogWydpZ25vcmUnLCAncGlwZScsICdwaXBlJ10sXG4gICAgfSk7XG4gICAgcmV0dXJuIHsgc3Rkb3V0LCBzdGRlcnI6ICcnIH07XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgY29uc3Qgc3RkZXJyID0gZXh0cmFjdFN0ZGVycihlcnJvcik7XG4gICAgdGhyb3cgbmV3IENvbW1hbmRFeGVjdXRpb25FcnJvcihjb21tYW5kLCBhcmdzLCBzdGRlcnIsIHRvRXhpdENvZGUoZXJyb3IpKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBpc05vU3VjaFByb2Nlc3NFcnJvcihlcnJvcjogdW5rbm93bik6IGJvb2xlYW4ge1xuICBpZiAoaXNFcnJub0V4Y2VwdGlvbihlcnJvcikgJiYgZXJyb3IuY29kZSA9PT0gJ0VTUkNIJykge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgaWYgKGVycm9yIGluc3RhbmNlb2YgQ29tbWFuZEV4ZWN1dGlvbkVycm9yKSB7XG4gICAgcmV0dXJuIC9ubyBzdWNoIHByb2Nlc3N8bm90IGZvdW5kfG5vdCByZWNvZ25pemVkfHRoZXJlIGlzIG5vIHJ1bm5pbmcgaW5zdGFuY2UvaS50ZXN0KGVycm9yLnN0ZGVycik7XG4gIH1cbiAgcmV0dXJuIGZhbHNlO1xufVxuXG5mdW5jdGlvbiB0b0V4aXRDb2RlKGVycm9yOiB1bmtub3duKTogbnVtYmVyIHwgc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgaWYgKGlzRXJybm9FeGNlcHRpb24oZXJyb3IpKSB7XG4gICAgcmV0dXJuIGVycm9yLmNvZGU7XG4gIH1cbiAgaWYgKHR5cGVvZiBlcnJvciA9PT0gJ29iamVjdCcgJiYgZXJyb3IgIT09IG51bGwgJiYgJ3N0YXR1cycgaW4gZXJyb3IpIHtcbiAgICBjb25zdCBzdGF0dXMgPSAoZXJyb3IgYXMgeyBzdGF0dXM6IHVua25vd24gfSkuc3RhdHVzO1xuICAgIGlmICh0eXBlb2Ygc3RhdHVzID09PSAnbnVtYmVyJykge1xuICAgICAgcmV0dXJuIHN0YXR1cztcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHVuZGVmaW5lZDtcbn1cblxuZnVuY3Rpb24gZXh0cmFjdFN0ZGVycihlcnJvcjogdW5rbm93bik6IHN0cmluZyB7XG4gIGlmICh0eXBlb2YgZXJyb3IgIT09ICdvYmplY3QnIHx8IGVycm9yID09PSBudWxsIHx8ICEoJ3N0ZGVycicgaW4gZXJyb3IpKSB7XG4gICAgcmV0dXJuICcnO1xuICB9XG5cbiAgY29uc3Qgc3RkZXJyID0gKGVycm9yIGFzIFJlY29yZDwnc3RkZXJyJywgdW5rbm93bj4pLnN0ZGVycjtcbiAgaWYgKHR5cGVvZiBzdGRlcnIgPT09ICdzdHJpbmcnKSB7XG4gICAgcmV0dXJuIHN0ZGVycjtcbiAgfVxuICBpZiAoQnVmZmVyLmlzQnVmZmVyKHN0ZGVycikpIHtcbiAgICByZXR1cm4gc3RkZXJyLnRvU3RyaW5nKCd1dGY4Jyk7XG4gIH1cbiAgcmV0dXJuICcnO1xufVxuXG5jbGFzcyBDb21tYW5kRXhlY3V0aW9uRXJyb3IgZXh0ZW5kcyBFcnJvciB7XG4gIHJlYWRvbmx5IHN0ZGVycjogc3RyaW5nO1xuICByZWFkb25seSBjb2RlOiBudW1iZXIgfCBzdHJpbmcgfCB1bmRlZmluZWQ7XG5cbiAgY29uc3RydWN0b3IoY29tbWFuZDogc3RyaW5nLCBhcmdzOiByZWFkb25seSBzdHJpbmdbXSwgc3RkZXJyOiBzdHJpbmcsIGNvZGU6IG51bWJlciB8IHN0cmluZyB8IHVuZGVmaW5lZCkge1xuICAgIHN1cGVyKGBDb21tYW5kIGZhaWxlZDogJHtjb21tYW5kfSAke2FyZ3Muam9pbignICcpfWApO1xuICAgIHRoaXMubmFtZSA9ICdDb21tYW5kRXhlY3V0aW9uRXJyb3InO1xuICAgIHRoaXMuc3RkZXJyID0gc3RkZXJyO1xuICAgIHRoaXMuY29kZSA9IGNvZGU7XG4gIH1cbn1cbiIsImltcG9ydCB0eXBlIHtcbiAgU3Bhd25PcHRpb25zLFxuICBTcGF3bk9wdGlvbnNXaXRob3V0U3RkaW8sXG4gIFNwYXduT3B0aW9uc1dpdGhTdGRpb1R1cGxlLFxuICBTcGF3blN5bmNSZXR1cm5zLFxuICBTdGRpb051bGwsXG4gIFN0ZGlvUGlwZSxcbn0gZnJvbSAnbm9kZTpjaGlsZF9wcm9jZXNzJztcbmltcG9ydCB7IHNwYXduIH0gZnJvbSAnbm9kZTpjaGlsZF9wcm9jZXNzJztcblxuaW1wb3J0IHsgdHJlZUtpbGwgfSBmcm9tICcuL3RyZWVLaWxsLmpzJztcblxuLyoqXG4gKiBSZXR1cm4gdHlwZSBmb3Igc3Bhd25Bc3luYyBmdW5jdGlvbiwgYmFzZWQgb24gU3Bhd25TeW5jUmV0dXJucyBidXQgd2l0aG91dCBvdXRwdXQgYW5kIGVycm9yIHByb3BlcnRpZXNcbiAqL1xuZXhwb3J0IHR5cGUgU3Bhd25Bc3luY1JldHVybnMgPSBPbWl0PFNwYXduU3luY1JldHVybnM8c3RyaW5nPiwgJ291dHB1dCcgfCAnZXJyb3InPjtcblxuLyoqXG4gKiBPcHRpb25zIGZvciBzcGF3bkFzeW5jIGZ1bmN0aW9uLCBleHRlbmRpbmcgdmFyaW91cyBOb2RlLmpzIHNwYXduIG9wdGlvbnMgd2l0aCBhZGRpdGlvbmFsIGZ1bmN0aW9uYWxpdHlcbiAqL1xuZXhwb3J0IHR5cGUgU3Bhd25Bc3luY09wdGlvbnMgPSAoXG4gIHwgU3Bhd25PcHRpb25zV2l0aG91dFN0ZGlvXG4gIHwgU3Bhd25PcHRpb25zV2l0aFN0ZGlvVHVwbGU8U3RkaW9QaXBlLCBTdGRpb1BpcGUsIFN0ZGlvUGlwZT5cbiAgfCBTcGF3bk9wdGlvbnNXaXRoU3RkaW9UdXBsZTxTdGRpb1BpcGUsIFN0ZGlvUGlwZSwgU3RkaW9OdWxsPlxuICB8IFNwYXduT3B0aW9uc1dpdGhTdGRpb1R1cGxlPFN0ZGlvUGlwZSwgU3RkaW9OdWxsLCBTdGRpb1BpcGU+XG4gIHwgU3Bhd25PcHRpb25zV2l0aFN0ZGlvVHVwbGU8U3RkaW9OdWxsLCBTdGRpb1BpcGUsIFN0ZGlvUGlwZT5cbiAgfCBTcGF3bk9wdGlvbnNXaXRoU3RkaW9UdXBsZTxTdGRpb1BpcGUsIFN0ZGlvTnVsbCwgU3RkaW9OdWxsPlxuICB8IFNwYXduT3B0aW9uc1dpdGhTdGRpb1R1cGxlPFN0ZGlvTnVsbCwgU3RkaW9QaXBlLCBTdGRpb051bGw+XG4gIHwgU3Bhd25PcHRpb25zV2l0aFN0ZGlvVHVwbGU8U3RkaW9OdWxsLCBTdGRpb051bGwsIFN0ZGlvUGlwZT5cbiAgfCBTcGF3bk9wdGlvbnNXaXRoU3RkaW9UdXBsZTxTdGRpb051bGwsIFN0ZGlvTnVsbCwgU3RkaW9OdWxsPlxuICB8IFNwYXduT3B0aW9uc1xuKSAmIHtcbiAgLyoqIElucHV0IHN0cmluZyB0byB3cml0ZSB0byB0aGUgc3Bhd25lZCBwcm9jZXNzJ3Mgc3RkaW4gKi9cbiAgaW5wdXQ/OiBzdHJpbmc7XG4gIC8qKiBJZiB0cnVlLCBzdGRlcnIgb3V0cHV0IHdpbGwgYmUgbWVyZ2VkIGludG8gc3Rkb3V0ICovXG4gIG1lcmdlT3V0QW5kRXJyb3I/OiBib29sZWFuO1xuICAvKiogSWYgdHJ1ZSwgdGhlIHNwYXduZWQgcHJvY2VzcyB3aWxsIGJlIGtpbGxlZCB3aGVuIHRoZSBwYXJlbnQgcHJvY2VzcyBleGl0cyAqL1xuICBraWxsT25FeGl0PzogYm9vbGVhbjtcbiAgLyoqIElmIHRydWUsIGVuYWJsZXMgdmVyYm9zZSBsb2dnaW5nIG9mIHByb2Nlc3Mgb3BlcmF0aW9ucyAqL1xuICB2ZXJib3NlPzogYm9vbGVhbjtcbiAgLyoqIElmIHRydWUsIHN0ZG91dCBkYXRhIHdpbGwgYmUgcHJpbnRlZCB0byBjb25zb2xlIGFzIGl0J3MgcmVjZWl2ZWQgKi9cbiAgcHJpbnRpbmdTdGRvdXQ/OiBib29sZWFuO1xuICAvKiogSWYgdHJ1ZSwgc3RkZXJyIGRhdGEgd2lsbCBiZSBwcmludGVkIHRvIGNvbnNvbGUgYXMgaXQncyByZWNlaXZlZCAqL1xuICBwcmludGluZ1N0ZGVycj86IGJvb2xlYW47XG4gIC8qKiBJZiB0cnVlLCBibGFuay1vbmx5IGxpbmVzIGFyZSBza2lwcGVkIHdoaWxlIHByaW50aW5nIHN0ZG91dC9zdGRlcnIgaW4gcmVhbHRpbWUgKi9cbiAgb21pdEJsYW5rTGluZXNXaGlsZVByaW50aW5nPzogYm9vbGVhbjtcbn07XG5cbi8qKlxuICogU3Bhd25zIGEgY2hpbGQgcHJvY2VzcyBhc3luY2hyb25vdXNseSBhbmQgcmV0dXJucyBhIHByb21pc2UgdGhhdCByZXNvbHZlcyB3aXRoIHRoZSBwcm9jZXNzIHJlc3VsdHNcbiAqXG4gKiBUaGlzIGZ1bmN0aW9uIHByb3ZpZGVzIGEgUHJvbWlzZS1iYXNlZCB3cmFwcGVyIGFyb3VuZCBOb2RlLmpzJ3Mgc3Bhd24gZnVuY3Rpb24gd2l0aCBhZGRpdGlvbmFsIGZlYXR1cmVzOlxuICogLSBBdXRvbWF0aWMgZW5jb2Rpbmcgb2Ygc3Rkb3V0L3N0ZGVyciBhcyBVVEYtOFxuICogLSBPcHRpb24gdG8gbWVyZ2Ugc3RkZXJyIGludG8gc3Rkb3V0XG4gKiAtIE9wdGlvbiB0byBhdXRvbWF0aWNhbGx5IGtpbGwgdGhlIHByb2Nlc3Mgb24gcGFyZW50IGV4aXRcbiAqIC0gT3B0aW9uIHRvIHByb3ZpZGUgaW5wdXQgdmlhIHN0ZGluXG4gKiAtIFZlcmJvc2UgbG9nZ2luZyBjYXBhYmlsaXR5XG4gKlxuICogQHBhcmFtIGNvbW1hbmQgLSBUaGUgY29tbWFuZCB0byBydW5cbiAqIEBwYXJhbSBhcmdzIC0gTGlzdCBvZiBzdHJpbmcgYXJndW1lbnRzXG4gKiBAcGFyYW0gb3B0aW9ucyAtIENvbmZpZ3VyYXRpb24gb3B0aW9ucyBmb3IgdGhlIHNwYXduZWQgcHJvY2Vzc1xuICogQHJldHVybnMgUHJvbWlzZSB0aGF0IHJlc29sdmVzIHdpdGggdGhlIHByb2Nlc3MgcmVzdWx0cyBpbmNsdWRpbmcgcGlkLCBzdGRvdXQsIHN0ZGVyciwgc3RhdHVzLCBhbmQgc2lnbmFsXG4gKiBAdGhyb3dzIFdpbGwgcmVqZWN0IHRoZSBwcm9taXNlIGlmIHRoZSBwcm9jZXNzIGZhaWxzIHRvIHNwYXduIG9yIGVuY291bnRlcnMgYW4gZXJyb3JcbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogY29uc3QgcmVzdWx0ID0gYXdhaXQgc3Bhd25Bc3luYygnbHMnLCBbJy1sYSddLCB7IHZlcmJvc2U6IHRydWUgfSk7XG4gKiBjb25zb2xlLmxvZyhyZXN1bHQuc3Rkb3V0KTtcbiAqIGBgYFxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gc3Bhd25Bc3luYyhcbiAgY29tbWFuZDogc3RyaW5nLFxuICBhcmdzPzogcmVhZG9ubHkgc3RyaW5nW10sXG4gIG9wdGlvbnM/OiBTcGF3bkFzeW5jT3B0aW9uc1xuKTogUHJvbWlzZTxTcGF3bkFzeW5jUmV0dXJucz4ge1xuICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBwcm9jID0gc3Bhd24oY29tbWFuZCwgYXJncyA/PyBbXSwgb3B0aW9ucyA/PyB7fSk7XG4gICAgICAvLyBgc2V0RW5jb2RpbmdgIGlzIHVuZGVmaW5lZCBpbiBCdW5cbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW5uZWNlc3NhcnktY29uZGl0aW9uXG4gICAgICBwcm9jLnN0ZG91dD8uc2V0RW5jb2Rpbmc/LigndXRmOCcpO1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bm5lY2Vzc2FyeS1jb25kaXRpb25cbiAgICAgIHByb2Muc3RkZXJyPy5zZXRFbmNvZGluZz8uKCd1dGY4Jyk7XG5cbiAgICAgIGxldCBzdGRvdXQgPSAnJztcbiAgICAgIGxldCBzdGRlcnIgPSAnJztcbiAgICAgIGNvbnN0IHN0ZG91dFByaW50ZXIgPSBjcmVhdGVSZWFsdGltZVByaW50ZXIocHJvY2Vzcy5zdGRvdXQsIG9wdGlvbnM/Lm9taXRCbGFua0xpbmVzV2hpbGVQcmludGluZyk7XG4gICAgICBjb25zdCBzdGRlcnJQcmludGVyID0gY3JlYXRlUmVhbHRpbWVQcmludGVyKHByb2Nlc3Muc3RkZXJyLCBvcHRpb25zPy5vbWl0QmxhbmtMaW5lc1doaWxlUHJpbnRpbmcpO1xuICAgICAgcHJvYy5zdGRvdXQ/Lm9uKCdkYXRhJywgKGRhdGE6IHN0cmluZykgPT4ge1xuICAgICAgICBzdGRvdXQgKz0gZGF0YTtcbiAgICAgICAgaWYgKG9wdGlvbnM/LnByaW50aW5nU3Rkb3V0KSB7XG4gICAgICAgICAgc3Rkb3V0UHJpbnRlci53cml0ZShkYXRhKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICBwcm9jLnN0ZGVycj8ub24oJ2RhdGEnLCAoZGF0YTogc3RyaW5nKSA9PiB7XG4gICAgICAgIGlmIChvcHRpb25zPy5tZXJnZU91dEFuZEVycm9yKSB7XG4gICAgICAgICAgc3Rkb3V0ICs9IGRhdGE7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgc3RkZXJyICs9IGRhdGE7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG9wdGlvbnM/LnByaW50aW5nU3RkZXJyKSB7XG4gICAgICAgICAgc3RkZXJyUHJpbnRlci53cml0ZShkYXRhKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAgIGxldCBzdG9wcGVkID0gZmFsc2U7XG4gICAgICBjb25zdCBzdG9wUHJvY2VzcyA9ICgpOiB2b2lkID0+IHtcbiAgICAgICAgaWYgKHN0b3BwZWQgfHwgIXByb2MucGlkKSByZXR1cm47XG5cbiAgICAgICAgc3RvcHBlZCA9IHRydWU7XG4gICAgICAgIGlmIChvcHRpb25zPy52ZXJib3NlKSB7XG4gICAgICAgICAgY29uc29sZS5pbmZvKGB0cmVlS2lsbCgke3Byb2MucGlkfSlgKTtcbiAgICAgICAgfVxuICAgICAgICB0cnkge1xuICAgICAgICAgIHRyZWVLaWxsKHByb2MucGlkKTtcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICBpZiAob3B0aW9ucz8udmVyYm9zZSkge1xuICAgICAgICAgICAgY29uc29sZS53YXJuKGBGYWlsZWQgdG8gdHJlZUtpbGwoJHtwcm9jLnBpZH0pYCwgZXJyb3IpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfTtcbiAgICAgIGNvbnN0IGNsZWFudXBTaWduYWxzOiBOb2RlSlMuU2lnbmFsc1tdID1cbiAgICAgICAgcHJvY2Vzcy5wbGF0Zm9ybSA9PT0gJ3dpbjMyJyA/IFsnU0lHSU5UJywgJ1NJR1RFUk0nXSA6IFsnU0lHSU5UJywgJ1NJR1RFUk0nLCAnU0lHUVVJVCddO1xuICAgICAgY29uc3Qgc2lnbmFsSGFuZGxlcnMgPSBuZXcgTWFwPE5vZGVKUy5TaWduYWxzLCAoKSA9PiB2b2lkPigpO1xuICAgICAgY29uc3QgcmVtb3ZlS2lsbE9uRXhpdEhhbmRsZXJzID0gKCk6IHZvaWQgPT4ge1xuICAgICAgICBwcm9jZXNzLnJlbW92ZUxpc3RlbmVyKCdiZWZvcmVFeGl0Jywgc3RvcFByb2Nlc3MpO1xuICAgICAgICBmb3IgKGNvbnN0IFtzaWduYWwsIGhhbmRsZXJdIG9mIHNpZ25hbEhhbmRsZXJzKSB7XG4gICAgICAgICAgcHJvY2Vzcy5yZW1vdmVMaXN0ZW5lcihzaWduYWwsIGhhbmRsZXIpO1xuICAgICAgICB9XG4gICAgICAgIHNpZ25hbEhhbmRsZXJzLmNsZWFyKCk7XG4gICAgICB9O1xuICAgICAgaWYgKG9wdGlvbnM/LmtpbGxPbkV4aXQpIHtcbiAgICAgICAgcHJvY2Vzcy5vbignYmVmb3JlRXhpdCcsIHN0b3BQcm9jZXNzKTtcbiAgICAgICAgZm9yIChjb25zdCBzaWduYWwgb2YgY2xlYW51cFNpZ25hbHMpIHtcbiAgICAgICAgICBjb25zdCBoYW5kbGVTaWduYWwgPSAoKTogdm9pZCA9PiB7XG4gICAgICAgICAgICBzdG9wUHJvY2VzcygpO1xuICAgICAgICAgICAgcmVtb3ZlS2lsbE9uRXhpdEhhbmRsZXJzKCk7XG4gICAgICAgICAgICBpZiAocHJvY2Vzcy5saXN0ZW5lckNvdW50KHNpZ25hbCkgPT09IDApIHtcbiAgICAgICAgICAgICAgcHJvY2Vzcy5raWxsKHByb2Nlc3MucGlkLCBzaWduYWwpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH07XG4gICAgICAgICAgc2lnbmFsSGFuZGxlcnMuc2V0KHNpZ25hbCwgaGFuZGxlU2lnbmFsKTtcbiAgICAgICAgICBwcm9jZXNzLm9uKHNpZ25hbCwgaGFuZGxlU2lnbmFsKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBwcm9jLm9uKCdlcnJvcicsIChlcnJvcikgPT4ge1xuICAgICAgICByZW1vdmVLaWxsT25FeGl0SGFuZGxlcnMoKTtcbiAgICAgICAgcHJvYy5yZW1vdmVBbGxMaXN0ZW5lcnMoJ2Nsb3NlJyk7XG4gICAgICAgIHJlamVjdChlcnJvcik7XG4gICAgICB9KTtcbiAgICAgIHByb2Mub24oJ2Nsb3NlJywgKGNvZGU6IG51bWJlciB8IG51bGwsIHNpZ25hbDogTm9kZUpTLlNpZ25hbHMgfCBudWxsKSA9PiB7XG4gICAgICAgIHJlbW92ZUtpbGxPbkV4aXRIYW5kbGVycygpO1xuICAgICAgICBzdGRvdXRQcmludGVyLmZsdXNoKCk7XG4gICAgICAgIHN0ZGVyclByaW50ZXIuZmx1c2goKTtcbiAgICAgICAgaWYgKHByb2MucGlkID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICByZWplY3QobmV3IEVycm9yKCdQcm9jZXNzIGhhcyBubyBwaWQuJykpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJlc29sdmUoe1xuICAgICAgICAgICAgcGlkOiBwcm9jLnBpZCxcbiAgICAgICAgICAgIHN0ZG91dCxcbiAgICAgICAgICAgIHN0ZGVycixcbiAgICAgICAgICAgIHN0YXR1czogY29kZSxcbiAgICAgICAgICAgIHNpZ25hbCxcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAgIGlmIChvcHRpb25zPy5pbnB1dCkge1xuICAgICAgICBwcm9jLnN0ZGluPy53cml0ZShvcHRpb25zLmlucHV0KTtcbiAgICAgICAgcHJvYy5zdGRpbj8uZW5kKCk7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvcHJlZmVyLXByb21pc2UtcmVqZWN0LWVycm9yc1xuICAgICAgcmVqZWN0KGVycm9yKTtcbiAgICB9XG4gIH0pO1xufVxuXG5jb25zdCBBTlNJX0VTQ0FQRV9DT0RFX1JFR0VYUCA9IG5ldyBSZWdFeHAoYCR7U3RyaW5nLmZyb21Db2RlUG9pbnQoMjcpfVxcXFxbWzAtP10qWyAtL10qW0Atfl1gLCAnZycpO1xuXG5mdW5jdGlvbiBjcmVhdGVSZWFsdGltZVByaW50ZXIoXG4gIHN0cmVhbTogTm9kZUpTLldyaXRlU3RyZWFtLFxuICBvbWl0QmxhbmtMaW5lcyA9IGZhbHNlXG4pOiB7IHdyaXRlOiAoZGF0YTogc3RyaW5nKSA9PiB2b2lkOyBmbHVzaDogKCkgPT4gdm9pZCB9IHtcbiAgaWYgKCFvbWl0QmxhbmtMaW5lcykge1xuICAgIHJldHVybiB7XG4gICAgICB3cml0ZTogKGRhdGEpID0+IHN0cmVhbS53cml0ZShkYXRhKSxcbiAgICAgIGZsdXNoOiAoKSA9PiB7fSxcbiAgICB9O1xuICB9XG5cbiAgbGV0IHBlbmRpbmcgPSAnJztcbiAgcmV0dXJuIHtcbiAgICB3cml0ZTogKGRhdGEpID0+IHtcbiAgICAgIHBlbmRpbmcgKz0gZGF0YTtcbiAgICAgIGNvbnN0IGxpbmVzID0gcGVuZGluZy5zcGxpdCgvXFxyP1xcbi8pO1xuICAgICAgcGVuZGluZyA9IGxpbmVzLnBvcCgpID8/ICcnO1xuICAgICAgZm9yIChjb25zdCBsaW5lIG9mIGxpbmVzKSB7XG4gICAgICAgIGlmICghaXNCbGFua0xpbmUobGluZSkpIHtcbiAgICAgICAgICBzdHJlYW0ud3JpdGUoYCR7bGluZX1cXG5gKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0sXG4gICAgZmx1c2g6ICgpID0+IHtcbiAgICAgIGlmICghaXNCbGFua0xpbmUocGVuZGluZykpIHtcbiAgICAgICAgc3RyZWFtLndyaXRlKHBlbmRpbmcpO1xuICAgICAgfVxuICAgICAgcGVuZGluZyA9ICcnO1xuICAgIH0sXG4gIH07XG59XG5cbmZ1bmN0aW9uIGlzQmxhbmtMaW5lKGxpbmU6IHN0cmluZyk6IGJvb2xlYW4ge1xuICByZXR1cm4gbGluZS5yZXBsYWNlQWxsKEFOU0lfRVNDQVBFX0NPREVfUkVHRVhQLCAnJykudHJpbSgpLmxlbmd0aCA9PT0gMDtcbn1cbiIsImltcG9ydCB7IHNsZWVwIH0gZnJvbSAnLi9zbGVlcC5qcyc7XG5cbi8qKlxuICogQ29udmVydCBhbiBvYmplY3QgdG8gYW4gZXJyb3IuXG4gKiBAcGFyYW0gb2JqIFRoZSBvYmplY3QgdG8gY29udmVydC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGVycm9yaWZ5KG9iajogdW5rbm93bik6IEVycm9yIHtcbiAgaWYgKG9iaiBpbnN0YW5jZW9mIEVycm9yKSByZXR1cm4gb2JqO1xuICBpZiAodHlwZW9mIG9iaiA9PT0gJ3N0cmluZycpIHJldHVybiBuZXcgRXJyb3Iob2JqKTtcbiAgdHJ5IHtcbiAgICByZXR1cm4gbmV3IEVycm9yKEpTT04uc3RyaW5naWZ5KG9iaikpO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gbmV3IEVycm9yKFN0cmluZyhvYmopKTtcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gaWdub3JlRXJyb3I8VD4oZm46ICgpID0+IFQpOiBUIHwgdW5kZWZpbmVkIHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gZm4oKTtcbiAgfSBjYXRjaCB7XG4gICAgLy8gZG8gbm90aGluZ1xuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpZ25vcmVFbm9lbnQ8VD4oZm46ICgpID0+IFQpOiBUIHwgdW5kZWZpbmVkIHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gZm4oKTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBpZiAodHlwZW9mIGVycm9yID09PSAnb2JqZWN0JyAmJiBlcnJvciAmJiAnY29kZScgaW4gZXJyb3IgJiYgZXJyb3IuY29kZSA9PT0gJ0VOT0VOVCcpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhyb3cgZXJyb3I7XG4gIH1cbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGlnbm9yZUVycm9yQXN5bmM8VD4oZm46ICgpID0+IFByb21pc2U8VD4pOiBQcm9taXNlPFQgfCB1bmRlZmluZWQ+IHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gYXdhaXQgZm4oKTtcbiAgfSBjYXRjaCB7XG4gICAgLy8gZG8gbm90aGluZ1xuICB9XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBpZ25vcmVFbm9lbnRBc3luYzxUPihmbjogKCkgPT4gUHJvbWlzZTxUPik6IFByb21pc2U8VCB8IHVuZGVmaW5lZD4ge1xuICB0cnkge1xuICAgIHJldHVybiBhd2FpdCBmbigpO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGlmICh0eXBlb2YgZXJyb3IgPT09ICdvYmplY3QnICYmIGVycm9yICYmICdjb2RlJyBpbiBlcnJvciAmJiBlcnJvci5jb2RlID09PSAnRU5PRU5UJykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aHJvdyBlcnJvcjtcbiAgfVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIFJldHJ5T3B0aW9ucyB7XG4gIGJlZm9yZVJldHJ5PzogKGVycm9yOiB1bmtub3duKSA9PiBQcm9taXNlPHZvaWQ+O1xuICBoYW5kbGVFcnJvcj86IChlcnJvcjogdW5rbm93bikgPT4gUHJvbWlzZTx2b2lkPjtcbiAgLyoqXG4gICAqIFRoZSBtYXhpbXVtIG51bWJlciBvZiB0b3RhbCBhdHRlbXB0cywgaW5jbHVkaW5nIHRoZSBpbml0aWFsIGF0dGVtcHQuXG4gICAqIEZvciBleGFtcGxlLCBgcmV0cnlDb3VudDogM2AgcnVucyB0aGUgZnVuY3Rpb24gYXQgbW9zdCAzIHRpbWVzOiAxIGluaXRpYWwgYXR0ZW1wdCBhbmQgdXAgdG8gMiByZXRyaWVzLlxuICAgKi9cbiAgcmV0cnlDb3VudD86IG51bWJlcjtcbiAgcmV0cnlMb2dnZXI/OiAobWVzc2FnZTogc3RyaW5nKSA9PiB2b2lkO1xuICBzaG91bGRSZXRyeT86IChlcnJvcjogdW5rbm93bikgPT4gYm9vbGVhbjtcbiAgc2xlZXBNaWxsaXNlY29uZHM/OiBudW1iZXI7XG4gIHVwZGF0ZVNsZWVwTWlsbGlzZWNvbmRzPzogKHNsZWVwTWlsbGlzZWNvbmRzOiBudW1iZXIpID0+IG51bWJlcjtcbn1cblxuLyoqXG4gKiBSZXRyeSB0aGUgZ2l2ZW4gZnVuY3Rpb24uXG4gKiBAcGFyYW0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gcmV0cnkuXG4gKiBAcGFyYW0gYmVmb3JlUmV0cnkgVGhlIGZ1bmN0aW9uIHRvIGNhbGwgaW1tZWRpYXRlbHkgYmVmb3JlIHJldHJ5aW5nLlxuICogQHBhcmFtIGhhbmRsZUVycm9yIFRoZSBmdW5jdGlvbiB0byBjYWxsIHdoZW4gYW4gZXJyb3Igb2NjdXJzLlxuICogQHBhcmFtIHJldHJ5Q291bnQgVGhlIG1heGltdW0gbnVtYmVyIG9mIHRvdGFsIGF0dGVtcHRzLCBpbmNsdWRpbmcgdGhlIGluaXRpYWwgYXR0ZW1wdC5cbiAqIEBwYXJhbSByZXRyeUxvZ2dlciBUaGUgZnVuY3Rpb24gdG8gbG9nIHJldHJ5aW5nLlxuICogQHBhcmFtIHNsZWVwTWlsbGlzZWNvbmRzIFRoZSBudW1iZXIgb2YgbWlsbGlzZWNvbmRzIHRvIHNsZWVwIGJlZm9yZSByZXRyeWluZy5cbiAqIEBwYXJhbSB1cGRhdGVTbGVlcE1pbGxpc2Vjb25kcyBUaGUgZnVuY3Rpb24gdG8gdXBkYXRlIHNsZWVwIG1pbGxpc2Vjb25kcyBhZnRlciBlYWNoIHJldHJ5LlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gd2l0aFJldHJ5PFQ+KFxuICBmdW5jOiAoZmFpbGVkQ291bnQ6IG51bWJlcikgPT4gVCB8IFByb21pc2U8VD4sXG4gIHtcbiAgICBiZWZvcmVSZXRyeSxcbiAgICBoYW5kbGVFcnJvcixcbiAgICByZXRyeUNvdW50ID0gMyxcbiAgICByZXRyeUxvZ2dlcixcbiAgICBzaG91bGRSZXRyeSxcbiAgICBzbGVlcE1pbGxpc2Vjb25kcyA9IDAsXG4gICAgdXBkYXRlU2xlZXBNaWxsaXNlY29uZHMsXG4gIH06IFJldHJ5T3B0aW9ucyA9IHt9XG4pOiBQcm9taXNlPFQ+IHtcbiAgbGV0IGZhaWxlZENvdW50ID0gMDtcbiAgZm9yICg7Oykge1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gYXdhaXQgZnVuYyhmYWlsZWRDb3VudCk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGF3YWl0IGhhbmRsZUVycm9yPy4oZXJyb3IpO1xuICAgICAgZmFpbGVkQ291bnQrKztcbiAgICAgIGlmIChmYWlsZWRDb3VudCA+PSByZXRyeUNvdW50KSB7XG4gICAgICAgIHRocm93IGVycm9yO1xuICAgICAgfVxuICAgICAgaWYgKHNob3VsZFJldHJ5ICYmICFzaG91bGRSZXRyeShlcnJvcikpIHtcbiAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICB9XG4gICAgICBpZiAoc2xlZXBNaWxsaXNlY29uZHMgPiAwKSB7XG4gICAgICAgIGF3YWl0IHNsZWVwKHNsZWVwTWlsbGlzZWNvbmRzKTtcbiAgICAgIH1cbiAgICAgIGlmICh1cGRhdGVTbGVlcE1pbGxpc2Vjb25kcykge1xuICAgICAgICBzbGVlcE1pbGxpc2Vjb25kcyA9IHVwZGF0ZVNsZWVwTWlsbGlzZWNvbmRzKHNsZWVwTWlsbGlzZWNvbmRzKTtcbiAgICAgIH1cbiAgICAgIHJldHJ5TG9nZ2VyPy4oYFJldHJ5IGR1ZSB0bzogJHtlcnJvcn1cbiR7ZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/ICctLS1cXG4nICsgKGVycm9yLnN0YWNrID8/ICcnKSA6ICcnfWApO1xuICAgICAgYXdhaXQgYmVmb3JlUmV0cnk/LihlcnJvcik7XG4gICAgfVxuICB9XG59XG4iLCIvKipcbiAqIFtqcy1zaGEzXXtAbGluayBodHRwczovL2dpdGh1Yi5jb20vZW1uMTc4L2pzLXNoYTN9XG4gKlxuICogQHZlcnNpb24gMC45LjNcbiAqIEBhdXRob3IgQ2hlbiwgWWktQ3l1YW4gW2VtbjE3OEBnbWFpbC5jb21dXG4gKiBAY29weXJpZ2h0IENoZW4sIFlpLUN5dWFuIDIwMTUtMjAyM1xuICogQGxpY2Vuc2UgTUlUXG4gKi9cbmNvbnN0IHQ9Wy4uLlwiMDEyMzQ1Njc4OWFiY2RlZlwiXSxzPVs2LDE1MzYsMzkzMjE2LDEwMDY2MzI5Nl0saT1bMCw4LDE2LDI0XSxlPVsxLDAsMzI4OTgsMCwzMjkwNiwyMTQ3NDgzNjQ4LDIxNDc1MTY0MTYsMjE0NzQ4MzY0OCwzMjkwNywwLDIxNDc0ODM2NDksMCwyMTQ3NTE2NTQ1LDIxNDc0ODM2NDgsMzI3NzcsMjE0NzQ4MzY0OCwxMzgsMCwxMzYsMCwyMTQ3NTE2NDI1LDAsMjE0NzQ4MzY1OCwwLDIxNDc1MTY1NTUsMCwxMzksMjE0NzQ4MzY0OCwzMjkwNSwyMTQ3NDgzNjQ4LDMyNzcxLDIxNDc0ODM2NDgsMzI3NzAsMjE0NzQ4MzY0OCwxMjgsMjE0NzQ4MzY0OCwzMjc3OCwwLDIxNDc0ODM2NTgsMjE0NzQ4MzY0OCwyMTQ3NTE2NTQ1LDIxNDc0ODM2NDgsMzI4OTYsMjE0NzQ4MzY0OCwyMTQ3NDgzNjQ5LDAsMjE0NzUxNjQyNCwyMTQ3NDgzNjQ4XTtmdW5jdGlvbiBvKHQpe3JldHVybiBuZXcgaCg1MTIscyw1MTIpLnVwZGF0ZSh0KS5oZXgoKX1jb25zdCBuPXQ9Pntjb25zdCBzPVtdO2Zvcihjb25zdFtpLGVdb2YgdC5lbnRyaWVzKCkpc1tpXT1lO3JldHVybiBzfTtjbGFzcyBoe2Jsb2Nrcz1bXTtzPVtdO3Jlc2V0PSEwO2ZpbmFsaXplZD0hMTtibG9jaz0wO3N0YXJ0PTA7bGFzdEJ5dGVJbmRleD0wO2NvbnN0cnVjdG9yKHQscyxpKXt0aGlzLnBhZGRpbmc9cyx0aGlzLm91dHB1dEJpdHM9aSx0aGlzLmJsb2NrQ291bnQ9MTYwMC0odDw8MSk+PjUsdGhpcy5ieXRlQ291bnQ9dGhpcy5ibG9ja0NvdW50PDwyLHRoaXMub3V0cHV0QmxvY2tzPWk+PjUsdGhpcy5leHRyYUJ5dGVzPSgzMSZpKT4+Mztmb3IobGV0IHQ9MDt0PDUwOysrdCl0aGlzLnNbdF09MH11cGRhdGUodCl7aWYodGhpcy5maW5hbGl6ZWQpdGhyb3cgbmV3IEVycm9yKFwiZmluYWxpemUgYWxyZWFkeSBjYWxsZWRcIik7Y29uc3Qgcz10aGlzLmJsb2NrcyxlPXRoaXMuYnl0ZUNvdW50LG89dC5sZW5ndGgsbj10aGlzLmJsb2NrQ291bnQsaD10aGlzLnM7bGV0IGwsYyxmPTA7Zm9yKDtmPG87KXtpZih0aGlzLnJlc2V0KWZvcih0aGlzLnJlc2V0PSExLHNbMF09dGhpcy5ibG9jayxsPTE7bDxuKzE7KytsKXNbbF09MDtmb3IobD10aGlzLnN0YXJ0O2Y8byYmbDxlOysrZiljPXQuY29kZVBvaW50QXQoZil8fDAsYzwxMjg/c1tsPj4yXXw9Yzw8aVszJmwrK106YzwyMDQ4PyhzW2w+PjJdfD0oMTkyfGM+PjYpPDxpWzMmbCsrXSxzW2w+PjJdfD0oMTI4fDYzJmMpPDxpWzMmbCsrXSk6Yzw1NTI5Nnx8Yz49NTczNDQ/KHNbbD4+Ml18PSgyMjR8Yz4+MTIpPDxpWzMmbCsrXSxzW2w+PjJdfD0oMTI4fGM+PjYmNjMpPDxpWzMmbCsrXSxzW2w+PjJdfD0oMTI4fDYzJmMpPDxpWzMmbCsrXSk6KGM9NjU1MzYrKCgxMDIzJmMpPDwxMHwxMDIzJih0LmNvZGVQb2ludEF0KCsrZil8fDApKSxzW2w+PjJdfD0oMjQwfGM+PjE4KTw8aVszJmwrK10sc1tsPj4yXXw9KDEyOHxjPj4xMiY2Myk8PGlbMyZsKytdLHNbbD4+Ml18PSgxMjh8Yz4+NiY2Myk8PGlbMyZsKytdLHNbbD4+Ml18PSgxMjh8NjMmYyk8PGlbMyZsKytdKTtpZih0aGlzLmxhc3RCeXRlSW5kZXg9bCxsPj1lKXtmb3IodGhpcy5zdGFydD1sLWUsdGhpcy5ibG9jaz1zW25dLGw9MDtsPG47KytsKWhbbF1ePXNbbF07cihoKSx0aGlzLnJlc2V0PSEwfWVsc2UgdGhpcy5zdGFydD1sfXJldHVybiB0aGlzfWZpbmFsaXplKCl7aWYodGhpcy5maW5hbGl6ZWQpcmV0dXJuO3RoaXMuZmluYWxpemVkPSEwO2NvbnN0IHQ9dGhpcy5ibG9ja3M7bGV0IHM9dGhpcy5sYXN0Qnl0ZUluZGV4O2NvbnN0IGk9dGhpcy5ibG9ja0NvdW50LGU9dGhpcy5zO2lmKHRbcz4+Ml18PXRoaXMucGFkZGluZ1szJnNdLHRoaXMubGFzdEJ5dGVJbmRleD09PXRoaXMuYnl0ZUNvdW50KWZvcih0WzBdPXRbaV0scz0xO3M8aSsxOysrcyl0W3NdPTA7Zm9yKHRbaS0xXXw9MjE0NzQ4MzY0OCxzPTA7czxpOysrcyllW3NdXj10W3NdO3IoZSl9aGV4KCl7dGhpcy5maW5hbGl6ZSgpO2NvbnN0IHM9dGhpcy5ibG9ja0NvdW50O2xldCBpPXRoaXMucztjb25zdCBlPXRoaXMub3V0cHV0QmxvY2tzLG89dGhpcy5leHRyYUJ5dGVzO2xldCBoLGw9MCxjPTAsZj1cIlwiO2Zvcig7YzxlOyl7Zm9yKGw9MDtsPHMmJmM8ZTsrK2wsKytjKWg9aVtsXSxmKz10W2g+PjQmMTVdK3RbMTUmaF0rdFtoPj4xMiYxNV0rdFtoPj44JjE1XSt0W2g+PjIwJjE1XSt0W2g+PjE2JjE1XSt0W2g+PjI4JjE1XSt0W2g+PjI0JjE1XTtjJXM9PT0wJiYoaT1uKGkpLHIoaSksbD0wKX1yZXR1cm4gbyYmKGg9aVtsXSxmKz10W2g+PjQmMTVdK3RbMTUmaF0sbz4xJiYoZis9dFtoPj4xMiYxNV0rdFtoPj44JjE1XSksbz4yJiYoZis9dFtoPj4yMCYxNV0rdFtoPj4xNiYxNV0pKSxmfX1jb25zdCByPWZ1bmN0aW9uKHQpe2xldCBzLGksbyxuLGgscixsLGMsZixhLHUsZCxiLGsseSx4LEIscCxDLHosSSxnLHcsQSxQLEUsaixtLHEsdixELEYsRyxILEosSyxMLE0sTixPLFEsUixTLFQsVSxWLFcsWCxZLFosJCxfLHR0LHN0LGl0LGV0LG90LG50LGh0LHJ0LGx0LGN0LGZ0O2ZvcihvPTA7bzw0ODtvKz0yKW49dFswXV50WzEwXV50WzIwXV50WzMwXV50WzQwXSxoPXRbMV1edFsxMV1edFsyMV1edFszMV1edFs0MV0scj10WzJdXnRbMTJdXnRbMjJdXnRbMzJdXnRbNDJdLGw9dFszXV50WzEzXV50WzIzXV50WzMzXV50WzQzXSxjPXRbNF1edFsxNF1edFsyNF1edFszNF1edFs0NF0sZj10WzVdXnRbMTVdXnRbMjVdXnRbMzVdXnRbNDVdLGE9dFs2XV50WzE2XV50WzI2XV50WzM2XV50WzQ2XSx1PXRbN11edFsxN11edFsyN11edFszN11edFs0N10sZD10WzhdXnRbMThdXnRbMjhdXnRbMzhdXnRbNDhdLGI9dFs5XV50WzE5XV50WzI5XV50WzM5XV50WzQ5XSxzPWReKHI8PDF8bD4+PjMxKSxpPWJeKGw8PDF8cj4+PjMxKSx0WzBdXj1zLHRbMV1ePWksdFsxMF1ePXMsdFsxMV1ePWksdFsyMF1ePXMsdFsyMV1ePWksdFszMF1ePXMsdFszMV1ePWksdFs0MF1ePXMsdFs0MV1ePWkscz1uXihjPDwxfGY+Pj4zMSksaT1oXihmPDwxfGM+Pj4zMSksdFsyXV49cyx0WzNdXj1pLHRbMTJdXj1zLHRbMTNdXj1pLHRbMjJdXj1zLHRbMjNdXj1pLHRbMzJdXj1zLHRbMzNdXj1pLHRbNDJdXj1zLHRbNDNdXj1pLHM9cl4oYTw8MXx1Pj4+MzEpLGk9bF4odTw8MXxhPj4+MzEpLHRbNF1ePXMsdFs1XV49aSx0WzE0XV49cyx0WzE1XV49aSx0WzI0XV49cyx0WzI1XV49aSx0WzM0XV49cyx0WzM1XV49aSx0WzQ0XV49cyx0WzQ1XV49aSxzPWNeKGQ8PDF8Yj4+PjMxKSxpPWZeKGI8PDF8ZD4+PjMxKSx0WzZdXj1zLHRbN11ePWksdFsxNl1ePXMsdFsxN11ePWksdFsyNl1ePXMsdFsyN11ePWksdFszNl1ePXMsdFszN11ePWksdFs0Nl1ePXMsdFs0N11ePWkscz1hXihuPDwxfGg+Pj4zMSksaT11XihoPDwxfG4+Pj4zMSksdFs4XV49cyx0WzldXj1pLHRbMThdXj1zLHRbMTldXj1pLHRbMjhdXj1zLHRbMjldXj1pLHRbMzhdXj1zLHRbMzldXj1pLHRbNDhdXj1zLHRbNDldXj1pLGs9dFswXSx5PXRbMV0sVj10WzExXTw8NHx0WzEwXT4+PjI4LFc9dFsxMF08PDR8dFsxMV0+Pj4yOCxtPXRbMjBdPDwzfHRbMjFdPj4+MjkscT10WzIxXTw8M3x0WzIwXT4+PjI5LHJ0PXRbMzFdPDw5fHRbMzBdPj4+MjMsbHQ9dFszMF08PDl8dFszMV0+Pj4yMyxSPXRbNDBdPDwxOHx0WzQxXT4+PjE0LFM9dFs0MV08PDE4fHRbNDBdPj4+MTQsSD10WzJdPDwxfHRbM10+Pj4zMSxKPXRbM108PDF8dFsyXT4+PjMxLHg9dFsxM108PDEyfHRbMTJdPj4+MjAsQj10WzEyXTw8MTJ8dFsxM10+Pj4yMCxYPXRbMjJdPDwxMHx0WzIzXT4+PjIyLFk9dFsyM108PDEwfHRbMjJdPj4+MjIsdj10WzMzXTw8MTN8dFszMl0+Pj4xOSxEPXRbMzJdPDwxM3x0WzMzXT4+PjE5LGN0PXRbNDJdPDwyfHRbNDNdPj4+MzAsZnQ9dFs0M108PDJ8dFs0Ml0+Pj4zMCxzdD10WzVdPDwzMHx0WzRdPj4+MixpdD10WzRdPDwzMHx0WzVdPj4+MixLPXRbMTRdPDw2fHRbMTVdPj4+MjYsTD10WzE1XTw8Nnx0WzE0XT4+PjI2LHA9dFsyNV08PDExfHRbMjRdPj4+MjEsQz10WzI0XTw8MTF8dFsyNV0+Pj4yMSxaPXRbMzRdPDwxNXx0WzM1XT4+PjE3LCQ9dFszNV08PDE1fHRbMzRdPj4+MTcsRj10WzQ1XTw8Mjl8dFs0NF0+Pj4zLEc9dFs0NF08PDI5fHRbNDVdPj4+MyxBPXRbNl08PDI4fHRbN10+Pj40LFA9dFs3XTw8Mjh8dFs2XT4+PjQsZXQ9dFsxN108PDIzfHRbMTZdPj4+OSxvdD10WzE2XTw8MjN8dFsxN10+Pj45LE09dFsyNl08PDI1fHRbMjddPj4+NyxOPXRbMjddPDwyNXx0WzI2XT4+Pjcsej10WzM2XTw8MjF8dFszN10+Pj4xMSxJPXRbMzddPDwyMXx0WzM2XT4+PjExLF89dFs0N108PDI0fHRbNDZdPj4+OCx0dD10WzQ2XTw8MjR8dFs0N10+Pj44LFQ9dFs4XTw8Mjd8dFs5XT4+PjUsVT10WzldPDwyN3x0WzhdPj4+NSxFPXRbMThdPDwyMHx0WzE5XT4+PjEyLGo9dFsxOV08PDIwfHRbMThdPj4+MTIsbnQ9dFsyOV08PDd8dFsyOF0+Pj4yNSxodD10WzI4XTw8N3x0WzI5XT4+PjI1LE89dFszOF08PDh8dFszOV0+Pj4yNCxRPXRbMzldPDw4fHRbMzhdPj4+MjQsZz10WzQ4XTw8MTR8dFs0OV0+Pj4xOCx3PXRbNDldPDwxNHx0WzQ4XT4+PjE4LHRbMF09a15+eCZwLHRbMV09eV5+QiZDLHRbMTBdPUFefkUmbSx0WzExXT1QXn5qJnEsdFsyMF09SF5+SyZNLHRbMjFdPUpefkwmTix0WzMwXT1UXn5WJlgsdFszMV09VV5+VyZZLHRbNDBdPXN0Xn5ldCZudCx0WzQxXT1pdF5+b3QmaHQsdFsyXT14Xn5wJnosdFszXT1CXn5DJkksdFsxMl09RV5+bSZ2LHRbMTNdPWpefnEmRCx0WzIyXT1LXn5NJk8sdFsyM109TF5+TiZRLHRbMzJdPVZeflgmWix0WzMzXT1XXn5ZJiQsdFs0Ml09ZXRefm50JnJ0LHRbNDNdPW90Xn5odCZsdCx0WzRdPXBefnomZyx0WzVdPUNefkkmdyx0WzE0XT1tXn52JkYsdFsxNV09cV5+RCZHLHRbMjRdPU1efk8mUix0WzI1XT1OXn5RJlMsdFszNF09WF5+WiZfLHRbMzVdPVlefiQmdHQsdFs0NF09bnRefnJ0JmN0LHRbNDVdPWh0Xn5sdCZmdCx0WzZdPXpefmcmayx0WzddPUlefncmeSx0WzE2XT12Xn5GJkEsdFsxN109RF5+RyZQLHRbMjZdPU9eflImSCx0WzI3XT1RXn5TJkosdFszNl09Wl5+XyZULHRbMzddPSRefnR0JlUsdFs0Nl09cnRefmN0JnN0LHRbNDddPWx0Xn5mdCZpdCx0WzhdPWdefmsmeCx0WzldPXdefnkmQix0WzE4XT1GXn5BJkUsdFsxOV09R15+UCZqLHRbMjhdPVJefkgmSyx0WzI5XT1TXn5KJkwsdFszOF09X15+VCZWLHRbMzldPXR0Xn5VJlcsdFs0OF09Y3RefnN0JmV0LHRbNDldPWZ0Xn5pdCZvdCx0WzBdXj1lW29dLHRbMV1ePWVbbysxXX07ZXhwb3J0e28gYXMgc2hhM181MTJ9O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9aGFzaC5qcy5tYXBcbiIsImNvbnN0IGU9XCJcIix0PWZ1bmN0aW9uKCl7Y29uc3QgZT17aW5zdGFuY2U6RXJyb3IsZnJvbTplPT57Y29uc3QgdD1bZS5uYW1lLGUubWVzc2FnZV07cmV0dXJuIHZvaWQgMCE9PWUuc3RhY2smJnQucHVzaChlLnN0YWNrKSx2b2lkIDAhPT1lLmNhdXNlJiYodm9pZCAwPT09ZS5zdGFjayYmdC5wdXNoKHZvaWQgMCksdC5wdXNoKGUuY2F1c2UpKSx0fSxzdHViOigpPT5uZXcgRXJyb3IsaHlkcmF0ZTooZSxbdCxuLGEsc10pPT57ZS5uYW1lPXQsZS5tZXNzYWdlPW4sdm9pZCAwPT09YT9kZWxldGUgZS5zdGFjazplLnN0YWNrPWEsdm9pZCAwIT09cyYmKGUuY2F1c2U9cyl9fSx0PXtpbnN0YW5jZTpVaW50OEFycmF5LGZyb206ZT0+W2J0b2EoYS5kZWNvZGUoZSkpXSxjcmVhdGU6KFtlXSk9Pm4uZW5jb2RlKGF0b2IoZSkpfSxzPXtpbnN0YW5jZTpNYXAsZnJvbTplPT5bLi4uZS5lbnRyaWVzKCldLHN0dWI6KCk9Pm5ldyBNYXAsaHlkcmF0ZTooZSx0KT0+e2Zvcihjb25zdFtuLGFdb2YgdCllLnNldChuLGEpfX0sbz17aW5zdGFuY2U6U2V0LGZyb206ZT0+Wy4uLmUudmFsdWVzKCldLHN0dWI6KCk9Pm5ldyBTZXQsaHlkcmF0ZTooZSx0KT0+e2Zvcihjb25zdCBuIG9mIHQpZS5hZGQobil9fSxyPXtpbnN0YW5jZTpEYXRlLGZyb206ZT0+W2UudG9KU09OKCldLGNyZWF0ZTooW2VdKT0+bmV3IERhdGUoZSl9LGM9e2luc3RhbmNlOlJlZ0V4cCxmcm9tOih7ZmxhZ3M6ZSxzb3VyY2U6dH0pPT5lP1t0LGVdOlt0XSxjcmVhdGU6KFtlLHRdKT0+bmV3IFJlZ0V4cChlLHQpfSxkPXtpbnN0YW5jZTpVUkwsZnJvbTplPT5bZS5ocmVmXSxjcmVhdGU6KFtlXSk9Pm5ldyBVUkwoZSl9O3JldHVybiBuZXcgTWFwKFtlLHQscyxvLHIsYyxkXS5tYXAoZT0+W2UuaW5zdGFuY2UubmFtZSxlXSkpfSgpLG49bmV3IFRleHRFbmNvZGVyLGE9bmV3IFRleHREZWNvZGVyKFwidXRmLThcIik7ZXhwb3J0e3QgYXMgR0xPQkFMX0NPTlNUUlVDVE9SX01BUCxlIGFzIFBMQUlOX09CSkVDVF9MQUJFTH07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1jb25zdHJ1Y3RvcnMuanMubWFwXG4iLCJpbXBvcnR7R0xPQkFMX0NPTlNUUlVDVE9SX01BUCBhcyB0LFBMQUlOX09CSkVDVF9MQUJFTCBhcyBufWZyb21cIi4vY29uc3RydWN0b3JzLmpzXCI7Y29uc3QgZT0tMSxyPS0yLG89LTMsaT0tNCxzPS01LGM9LTY7ZnVuY3Rpb24gZihuLGU9dCl7cmV0dXJuIEpTT04uc3RyaW5naWZ5KGEobixlKSl9ZnVuY3Rpb24gdSh0KXtpZih2b2lkIDA9PT10KXJldHVybi0xO2lmKFwibnVtYmVyXCI9PXR5cGVvZiB0KXtpZihOdW1iZXIuaXNOYU4odCkpcmV0dXJuLTM7aWYoIU51bWJlci5pc0Zpbml0ZSh0KSlyZXR1cm4gdDwwPy01Oi00fXJldHVybiBudWxsfWNvbnN0IGw9W107ZnVuY3Rpb24gYShlLHI9dCl7Y29uc3Qgbz11KGUpO2lmKG51bGwhPT1vKXJldHVybiBvO2NvbnN0IGk9W10scz1uZXcgTWFwO3JldHVybiBmdW5jdGlvbiB0KGUpe2NvbnN0IG89dShlKTtpZihudWxsIT09bylyZXR1cm4gbztsZXQgYz1zLmdldChlKTtpZih2b2lkIDAhPT1jKXJldHVybiBjO3N3aXRjaChjPWkubGVuZ3RoLHR5cGVvZiBlKXtjYXNlXCJudW1iZXJcIjpjYXNlXCJzdHJpbmdcIjpjYXNlXCJib29sZWFuXCI6aVtjXT1lLHMuc2V0KGUsYyk7YnJlYWs7Y2FzZVwiYmlnaW50XCI6aVtjXT1bLTYsZS50b1N0cmluZygxNildLHMuc2V0KGUsYyk7YnJlYWs7Y2FzZVwib2JqZWN0XCI6aWYobnVsbD09PWUpaVtjXT1lLHMuc2V0KGUsYyk7ZWxzZSBpZihBcnJheS5pc0FycmF5KGUpKXtjb25zdCBuPWZ1bmN0aW9uKHQpe2lmKGwubGVuZ3RoPHQpe2NvbnN0IG49bC5sZW5ndGg7bC5sZW5ndGg9dCxsLmZpbGwoLTIsbix0KX1yZXR1cm4gbC5zbGljZSgwLHQpfShlLmxlbmd0aCk7aVtjXT1uLHMuc2V0KGUsYyk7Zm9yKGNvbnN0W3Isb11vZiBlLmVudHJpZXMoKSluW3JdPXQobyl9ZWxzZXtjb25zdFtvLGZdPWZ1bmN0aW9uKHQsZSl7Y29uc3Qgcj10LmNvbnN0cnVjdG9yO2lmKFwiZnVuY3Rpb25cIj09dHlwZW9mIHIpe2NvbnN0IG49ci5uYW1lLG89ZS5nZXQobik7aWYodm9pZCAwIT09bylyZXR1cm5bbixvLmZyb20odCldfWNvbnN0IG89T2JqZWN0LmVudHJpZXModCksaT1vLmxlbmd0aCxzPUFycmF5LmZyb20oe2xlbmd0aDppK2l9KTtmb3IobGV0IHQ9MDt0PGk7dCsrKXtjb25zdCBuPW9bdF0sZT10K3Q7c1tlXT1uWzBdLHNbZSsxXT1uWzFdfXJldHVybltuLHNdfShlLHIpLHU9Zi5sZW5ndGgsbD1BcnJheS5mcm9tKHtsZW5ndGg6dSsxfSk7bFswXT1vLGlbY109bCxzLnNldChlLGMpO2ZvcihsZXQgbj0wO248dTtuKyspbFtuKzFdPXQoZltuXSl9fXJldHVybiBjfShlKSxpfWV4cG9ydHtyIGFzIEFSUkFZX0hPTEVfSU5ERVgsYyBhcyBCSUdfSU5UX0xBQkVMLG8gYXMgTkFOX0lOREVYLHMgYXMgTkVHX0lORl9JTkRFWCxpIGFzIFBPU19JTkZfSU5ERVgsZSBhcyBVTkRFRklORURfSU5ERVgsYSBhcyBsaXN0aWZ5LGYgYXMgc3RyaW5naWZ5fTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXN0cmluZ2lmeS5qcy5tYXBcbiIsImltcG9ydHtzaGEzXzUxMiBhcyByfWZyb21cIi4vaGFzaC5qc1wiO2ltcG9ydHtzdHJpbmdpZnkgYXMgbn1mcm9tXCIuL29zb24vc3RyaW5naWZ5LmpzXCI7ZnVuY3Rpb24gbyhvLHQpe3JldHVybiByKG4oW28sdF0pKX1mdW5jdGlvbiB0KHIsbyl7cmV0dXJuIG4oW3Isb10pfWZ1bmN0aW9uIGkoKXtyZXR1cm5cIlwifWV4cG9ydHtpIGFzIGdldENhY2hlS2V5T2ZFbXB0eVN0cmluZyxvIGFzIGdldENhY2hlS2V5T2ZIYXNoLHQgYXMgZ2V0Q2FjaGVLZXlPZlN0cmluZ2lmaWVkfTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWdldENhY2hlS2V5LmpzLm1hcFxuIiwiaW1wb3J0e2dldENhY2hlS2V5T2ZIYXNoIGFzIHQsZ2V0Q2FjaGVLZXlPZkVtcHR5U3RyaW5nIGFzIGV9ZnJvbVwiLi9nZXRDYWNoZUtleS5qc1wiO2NvbnN0IG49cih7Z2V0Q2FjaGVLZXk6dH0pLGM9cih7Z2V0Q2FjaGVLZXk6ZX0pO2Z1bmN0aW9uIHIoe2NhY2hlRHVyYXRpb246ZT1OdW1iZXIuUE9TSVRJVkVfSU5GSU5JVFksZ2V0Q2FjaGVLZXk6bj10fT17fSl7cmV0dXJuIGZ1bmN0aW9uKHQsYyl7bGV0IHIsbyxpO3JldHVyblwiZ2V0dGVyXCI9PT1jPy5raW5kP2Z1bmN0aW9uKCl7Y29uc3QgYz1uKHRoaXMsW10pLGE9RGF0ZS5ub3coKTtyZXR1cm4oaSE9PWN8fGEtbz5lKSYmKGk9YyxyPXQuY2FsbCh0aGlzKSxvPWEpLHJ9OmZ1bmN0aW9uKC4uLmEpe2NvbnN0IHU9bih0aGlzLGEpLGg9RGF0ZS5ub3coKTtyZXR1cm4oaSE9PXV8fGgtbz5lKSYmKGk9dSxyPWM/dC5jYWxsKHRoaXMsLi4uYSk6dCguLi5hKSxvPWgpLHJ9fX1leHBvcnR7biBhcyBtZW1vaXplT25lLHIgYXMgbWVtb2l6ZU9uZUZhY3RvcnksYyBhcyBtZW1vaXplT25lV2l0aEVtcHR5SGFzaH07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1tZW1vaXplT25lLmpzLm1hcFxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuLyoqXG4gKiBQcmVwZW5kIGV2ZXJ5IGV4aXN0aW5nIGBub2RlX21vZHVsZXMvLmJpbmAgZGlyZWN0b3J5IGZyb20gdGhlIGdpdmVuIGRpcmVjdG9yeSB1cCB0byB0aGVcbiAqIHJlcG9zaXRvcnkgcm9vdCAob3IgZmlsZXN5c3RlbSByb290KSB0byB0aGUgZW52aXJvbm1lbnQncyBQQVRILCBuZWFyZXN0IGRpcmVjdG9yeSBmaXJzdCBzb1xuICogYSB3b3Jrc3BhY2UtbG9jYWwgZGVwZW5kZW5jeSB3aW5zIG92ZXIgYSByZXBvc2l0b3J5LXJvb3Qgb25lLiBOZWVkZWQgd2hlcmV2ZXIgd2Igc3RyaXBzXG4gKiB5YXJuJ3MgdGVtcG9yYXJ5IGJpbiBmb2xkZXIgZnJvbSBQQVRIICh5YXJuIEJlcnJ5IGV4cG9zZXMgZGVwZW5kZW5jeSBleGVjdXRhYmxlcyBvbmx5XG4gKiB0aHJvdWdoIHRoYXQgZm9sZGVyLCBuZXZlciB0aHJvdWdoIGBub2RlX21vZHVsZXMvLmJpbmAgb24gUEFUSCksIHNvIHRoYXQgYmFyZSBiaW5hcnkgbmFtZXNcbiAqIGluIHdyYXBwZWQgY29tbWFuZHMga2VlcCByZXNvbHZpbmcuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwcmVwZW5kTm9kZU1vZHVsZXNCaW5Ub1BhdGgoZGlyUGF0aDogc3RyaW5nLCBlbnY6IFJlY29yZDxzdHJpbmcsIHN0cmluZyB8IHVuZGVmaW5lZD4pOiBib29sZWFuIHtcbiAgY29uc3QgYmluUGF0aHM6IHN0cmluZ1tdID0gW107XG4gIGxldCBjdXJyZW50UGF0aCA9IHBhdGgucmVzb2x2ZShkaXJQYXRoKTtcbiAgZm9yICg7Oykge1xuICAgIGNvbnN0IGJpblBhdGggPSBwYXRoLmpvaW4oY3VycmVudFBhdGgsICdub2RlX21vZHVsZXMnLCAnLmJpbicpO1xuICAgIGlmIChmcy5leGlzdHNTeW5jKGJpblBhdGgpKSB7XG4gICAgICBiaW5QYXRocy5wdXNoKGJpblBhdGgpO1xuICAgIH1cblxuICAgIGlmIChmcy5leGlzdHNTeW5jKHBhdGguam9pbihjdXJyZW50UGF0aCwgJy5naXQnKSkpIHtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgICBjb25zdCBwYXJlbnRQYXRoID0gcGF0aC5kaXJuYW1lKGN1cnJlbnRQYXRoKTtcbiAgICBpZiAoY3VycmVudFBhdGggPT09IHBhcmVudFBhdGgpIHtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgICBjdXJyZW50UGF0aCA9IHBhcmVudFBhdGg7XG4gIH1cbiAgaWYgKGJpblBhdGhzLmxlbmd0aCA9PT0gMCkgcmV0dXJuIGZhbHNlO1xuICBlbnYuUEFUSCA9IGVudi5QQVRIID8gYCR7YmluUGF0aHMuam9pbignOicpfToke2Vudi5QQVRIfWAgOiBiaW5QYXRocy5qb2luKCc6Jyk7XG4gIHJldHVybiB0cnVlO1xufVxuIiwiZXhwb3J0IGZ1bmN0aW9uIGlzQ0koY2lFbnY6IHN0cmluZyB8IHVuZGVmaW5lZCk6IGJvb2xlYW4ge1xuICByZXR1cm4gISFjaUVudiAmJiBjaUVudiAhPT0gJzAnICYmIGNpRW52ICE9PSAnZmFsc2UnO1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHR5cGUgeyBFbnZSZWFkZXJPcHRpb25zIH0gZnJvbSAnQHdpbGxib29zdGVyL3NoYXJlZC1saWItbm9kZS9zcmMnO1xuaW1wb3J0IHsgcmVhZEVudmlyb25tZW50VmFyaWFibGVzLCBzaG91bGRTdXBwcmVzc0Vudmlyb25tZW50T3V0cHV0IH0gZnJvbSAnQHdpbGxib29zdGVyL3NoYXJlZC1saWItbm9kZS9zcmMnO1xuaW1wb3J0IHsgbWVtb2l6ZU9uZSB9IGZyb20gJ2F0LWRlY29yYXRvcnMnO1xuaW1wb3J0IHsgZ2xvYmJ5IH0gZnJvbSAnZ2xvYmJ5JztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUpzb24gfSBmcm9tICd0eXBlLWZlc3QnO1xuXG5pbXBvcnQgeyBwcmVwZW5kTm9kZU1vZHVsZXNCaW5Ub1BhdGggfSBmcm9tICcuL3V0aWxzL2JpblBhdGguanMnO1xuaW1wb3J0IHsgaXNDSSB9IGZyb20gJy4vdXRpbHMvY2kuanMnO1xuXG5leHBvcnQgdHlwZSBEYXRhYmFzZU9ybSA9ICdwcmlzbWEnIHwgJ2RyaXp6bGUnO1xuXG5leHBvcnQgY29uc3QgRklMRV9TQ0hFTUEgPSAnZmlsZTonO1xuXG5leHBvcnQgY2xhc3MgUHJvamVjdCB7XG4gIHByaXZhdGUgcmVhZG9ubHkgYXJndjogRW52UmVhZGVyT3B0aW9ucztcbiAgcHJpdmF0ZSByZWFkb25seSBsb2FkRW52OiBib29sZWFuO1xuICBwcml2YXRlIHJlYWRvbmx5IHBhdGhCeU5hbWUgPSBuZXcgTWFwPHN0cmluZywgc3RyaW5nPigpO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgX2RpclBhdGg6IHN0cmluZztcblxuICBjb25zdHJ1Y3RvcihkaXJQYXRoOiBzdHJpbmcsIGFyZ3Y6IEVudlJlYWRlck9wdGlvbnMsIGxvYWRFbnY6IGJvb2xlYW4pIHtcbiAgICB0aGlzLl9kaXJQYXRoID0gcGF0aC5yZXNvbHZlKGRpclBhdGgpO1xuICAgIHRoaXMuYXJndiA9IGFyZ3Y7XG4gICAgdGhpcy5sb2FkRW52ID0gbG9hZEVudjtcbiAgfVxuXG4gIEBtZW1vaXplT25lXG4gIGdldCBpc0J1bkF2YWlsYWJsZSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy51c2VzQnVuUGFja2FnZU1hbmFnZXI7XG4gIH1cblxuICAvLyBUaGUgcGFja2FnZSBtYW5hZ2VyIG11c3QgZm9sbG93IHRoZSB0YXJnZXQgcHJvamVjdCwgbm90IHRoZSBydW50aW1lIHRoYXQgbGF1bmNoZWQgd2I6XG4gIC8vIGBub2RlIHdiIC4uLmAgYWdhaW5zdCBhIEJ1biByZXBvIG11c3Qgc3RpbGwgcnVuIGBidW4gaW5zdGFsbGAsIGFuZCB2aWNlIHZlcnNhLlxuICBnZXQgcGFja2FnZU1hbmFnZXJDb21tYW5kKCk6ICdidW4nIHwgJ3lhcm4nIHtcbiAgICByZXR1cm4gdGhpcy5pc0J1bkF2YWlsYWJsZSA/ICdidW4nIDogJ3lhcm4nO1xuICB9XG5cbiAgZ2V0IHBhY2thZ2VNYW5hZ2VyUnVuQ29tbWFuZCgpOiAnYnVuIHJ1bicgfCAneWFybicge1xuICAgIHJldHVybiB0aGlzLmlzQnVuQXZhaWxhYmxlID8gJ2J1biBydW4nIDogJ3lhcm4nO1xuICB9XG5cbiAgLy8gQSBzaW5nbGUgc2lnbmFsIGRlY2lkZXMgZXZlcnkgYnVuLXZzLXlhcm4gYnJhbmNoIGluIHdiIChzY3JpcHQgbm9ybWFsaXphdGlvbiBpbmNsdWRlZCk6XG4gIC8vIHNwbGl0dGluZyB0aGUgdG9vbC1tYW5pZmVzdCBzaWduYWwgZnJvbSB0aGUgbG9ja2ZpbGUgc2lnbmFsIG9uY2UgcHJvZHVjZWQgY29tbWFuZHMgbWl4aW5nXG4gIC8vIGBidW4gaW5zdGFsbGAgd2l0aCBgeWFybiBwcmlzbWEgLi4uYCBpbiBtaXNlLXBpbm5lZCByZXBvcyB3aG9zZSBidW4ubG9jayBpcyBnaXRpZ25vcmVkLlxuICBAbWVtb2l6ZU9uZVxuICBnZXQgdXNlc0J1blBhY2thZ2VNYW5hZ2VyKCk6IGJvb2xlYW4ge1xuICAgIGlmICh0aGlzLmhhc0J1blRvb2xWZXJzaW9uKCkpIHJldHVybiB0cnVlO1xuICAgIGlmICh0aGlzLmhhc0J1bkxvY2tmaWxlKCkpIHJldHVybiB0cnVlO1xuICAgIHJldHVybiB0aGlzLmhhc0J1blBhY2thZ2VNYW5hZ2VyKCk7XG4gIH1cblxuICBwcml2YXRlIGhhc0J1blRvb2xWZXJzaW9uKCk6IGJvb2xlYW4ge1xuICAgIC8vIHdiZnkgbWlncmF0ZXMgLnRvb2wtdmVyc2lvbnMgaW50byBtaXNlLnRvbWwsIHNvIGEgbWlzZS1waW5uZWQgYnVuIG11c3QgY291bnQgYXMgd2VsbDpcbiAgICAvLyByZXBvcyB0aGF0IGdpdGlnbm9yZSBidW4ubG9jayBhbmQgaGF2ZSBubyBwYWNrYWdlTWFuYWdlciBmaWVsZCByZWx5IG9uIHRoZSB0b29sIG1hbmlmZXN0LlxuICAgIGlmICh0ZXN0RmlsZUNvbnRlbnQocGF0aC5qb2luKHRoaXMucm9vdERpclBhdGgsICcudG9vbC12ZXJzaW9ucycpLCAvKF58XFxuKWJ1blxccy8pKSByZXR1cm4gdHJ1ZTtcbiAgICByZXR1cm4gWydtaXNlLnRvbWwnLCAnLm1pc2UudG9tbCddLnNvbWUoKGZpbGVOYW1lKSA9PlxuICAgICAgdGVzdEZpbGVDb250ZW50KHBhdGguam9pbih0aGlzLnJvb3REaXJQYXRoLCBmaWxlTmFtZSksIC9eXFxzKig/OlwiYnVuXCJ8YnVuKVxccyo9L20pXG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgaGFzQnVuTG9ja2ZpbGUoKTogYm9vbGVhbiB7XG4gICAgLy8gU29tZSByZXBvc2l0b3JpZXMgcmVseSBvbiB0aGUgbG9ja2ZpbGUgb3IgcGFja2FnZU1hbmFnZXIgZmllbGQgaW5zdGVhZCBvZiBtaXNlLlxuICAgIC8vIERvY2tlciBvcHRpbWl6YXRpb24gbXVzdCBmb2xsb3cgdGhlIHRhcmdldCBwcm9qZWN0LCBub3QgdGhlIHJ1bnRpbWUgdGhhdCBsYXVuY2hlZCB3Yi5cbiAgICByZXR1cm4gWydidW4ubG9jaycsICdidW4ubG9ja2InXS5zb21lKChmaWxlTmFtZSkgPT4gZnMuZXhpc3RzU3luYyhwYXRoLmpvaW4odGhpcy5yb290RGlyUGF0aCwgZmlsZU5hbWUpKSk7XG4gIH1cblxuICBwcml2YXRlIGhhc0J1blBhY2thZ2VNYW5hZ2VyKCk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IHBhY2thZ2VNYW5hZ2VyID0gdGhpcy5yb290UGFja2FnZUpzb24/LnBhY2thZ2VNYW5hZ2VyID8/IHRoaXMucGFja2FnZUpzb24ucGFja2FnZU1hbmFnZXI7XG4gICAgcmV0dXJuIHR5cGVvZiBwYWNrYWdlTWFuYWdlciA9PT0gJ3N0cmluZycgJiYgcGFja2FnZU1hbmFnZXIuc3RhcnRzV2l0aCgnYnVuQCcpO1xuICB9XG5cbiAgQG1lbW9pemVPbmVcbiAgZ2V0IGJ1aWxkQ29tbWFuZCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLnBhY2thZ2VKc29uLnNjcmlwdHM/LmJ1aWxkPy5pbmNsdWRlcygnYnVpbGRJZk5lZWRlZCcpXG4gICAgICA/ICdZQVJOIHJ1biBidWlsZCdcbiAgICAgIDogdGhpcy5wYWNrYWdlSnNvbi5zY3JpcHRzPy5idWlsZFxuICAgICAgICA/IGBZQVJOIHdiIGJ1aWxkSWZOZWVkZWQgJHt0aGlzLmFyZ3YudmVyYm9zZSA/ICctLXZlcmJvc2UnIDogJyd9YFxuICAgICAgICA6IFwiZWNobyAnTm8gYnVpbGQgc2NyaXB0J1wiO1xuICB9XG5cbiAgZ2V0IGRpclBhdGgoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5fZGlyUGF0aDtcbiAgfVxuXG4gIEBtZW1vaXplT25lXG4gIGdldCByb290RGlyUGF0aCgpOiBzdHJpbmcge1xuICAgIHJldHVybiBmcy5leGlzdHNTeW5jKHBhdGguam9pbih0aGlzLmRpclBhdGgsICcuLicsICcuLicsICdwYWNrYWdlLmpzb24nKSlcbiAgICAgID8gcGF0aC5yZXNvbHZlKHRoaXMuZGlyUGF0aCwgJy4uJywgJy4uJylcbiAgICAgIDogdGhpcy5kaXJQYXRoO1xuICB9XG5cbiAgQG1lbW9pemVPbmVcbiAgZ2V0IGRvY2tlcmZpbGUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gZnMucmVhZEZpbGVTeW5jKHRoaXMuZmluZEZpbGUoJ0RvY2tlcmZpbGUnKSwgJ3V0ZjgnKTtcbiAgfVxuXG4gIEBtZW1vaXplT25lXG4gIGdldCBoYXNEb2NrZXJmaWxlKCk6IGJvb2xlYW4ge1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gISF0aGlzLmZpbmRGaWxlKCdEb2NrZXJmaWxlJyk7XG4gICAgfSBjYXRjaCB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgQG1lbW9pemVPbmVcbiAgZ2V0IGhhc1NvdXJjZUNvZGUoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIGZzLmV4aXN0c1N5bmMocGF0aC5qb2luKHRoaXMuZGlyUGF0aCwgJ3NyYycpKTtcbiAgfVxuXG4gIEBtZW1vaXplT25lXG4gIGdldCBuYW1lKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMucGFja2FnZUpzb24ubmFtZSB8fCAndW5rbm93bic7XG4gIH1cblxuICBAbWVtb2l6ZU9uZVxuICBnZXQgZG9ja2VySW1hZ2VOYW1lKCk6IHN0cmluZyB7XG4gICAgY29uc3QgbmFtZSA9IHRoaXMucGFja2FnZUpzb24ubmFtZSB8fCAndW5rbm93bic7XG4gICAgcmV0dXJuIG5hbWUucmVwbGFjZUFsbCgnQCcsICcnKS5yZXBsYWNlQWxsKCcvJywgJy0nKTtcbiAgfVxuXG4gIC8vIENhY2hlZCBpbiBhIHBsYWluIGZpZWxkIHJhdGhlciB0aGFuIHdpdGggQG1lbW9pemVPbmU6IHRoYXQgZGVjb3JhdG9yIGtleXMgaXRzIGNhY2hlIG9uIGEgaGFzaFxuICAvLyBvZiB0aGUgaW5zdGFuY2UsIHdoaWNoIGNoYW5nZXMgYXMgb3RoZXIgbWVtb2l6ZWQgZ2V0dGVycyBwb3B1bGF0ZSB0aGUgaW5zdGFuY2UsIHNvIGBlbnZgIGNvdWxkXG4gIC8vIHNpbGVudGx5IGJlIHJlY29tcHV0ZWQg4oCUIGRyb3BwaW5nIGluLXBsYWNlIG11dGF0aW9ucyAoZS5nLiBgcHJvamVjdC5lbnYuUE9SVCB8fD0g4oCmYCwgb3IgdGhlXG4gIC8vIHNlY3JldHMgYHdiIGRlcGxveWAgbWVyZ2VzIGZyb20gLmVudi5jbG91ZGZsYXJlKSB0aGF0IGNhbGxlcnMgcmVseSBvbiBmb3Igc3Bhd25lZCBjb21tYW5kcy5cbiAgcHJpdmF0ZSBlbnZDYWNoZTogUmVjb3JkPHN0cmluZywgc3RyaW5nIHwgdW5kZWZpbmVkPiB8IHVuZGVmaW5lZDtcblxuICBnZXQgZW52KCk6IFJlY29yZDxzdHJpbmcsIHN0cmluZyB8IHVuZGVmaW5lZD4ge1xuICAgIGlmICh0aGlzLmVudkNhY2hlKSByZXR1cm4gdGhpcy5lbnZDYWNoZTtcbiAgICBpZiAoIXRoaXMubG9hZEVudikge1xuICAgICAgdGhpcy5lbnZDYWNoZSA9IHByb2Nlc3MuZW52O1xuICAgICAgcmV0dXJuIHRoaXMuZW52Q2FjaGU7XG4gICAgfVxuXG4gICAgY29uc3QgW2VudlZhcnMsIGVudlBhdGhBbmRMb2FkZWRFbnZWYXJDb3VudFBhaXJzXSA9IHJlYWRFbnZpcm9ubWVudFZhcmlhYmxlcyh0aGlzLmFyZ3YsIHRoaXMuZGlyUGF0aCk7XG4gICAgaWYgKCFzaG91bGRTdXBwcmVzc0Vudmlyb25tZW50T3V0cHV0KHRoaXMuYXJndikpIHtcbiAgICAgIGZvciAoY29uc3QgW2VudlBhdGgsIGNvdW50XSBvZiBlbnZQYXRoQW5kTG9hZGVkRW52VmFyQ291bnRQYWlycykge1xuICAgICAgICBjb25zb2xlLmluZm8oYExvYWRlZCAke2NvdW50fSBlbnZpcm9ubWVudCB2YXJpYWJsZXMgZnJvbSAke2VudlBhdGh9YCk7XG4gICAgICB9XG4gICAgfVxuICAgIC8vIFNwcmVhZGluZyBlbnZWYXJzIGxhc3QgaXMgc2FmZSBmb3IgZXhwb3J0ZWQtdmFyaWFibGUgcHJlY2VkZW5jZTogcmVhZEVudmlyb25tZW50VmFyaWFibGVzXG4gICAgLy8gYWxyZWFkeSBleGNsdWRlcyBrZXlzIHByZXNlbnQgaW4gcHJvY2Vzcy5lbnYgZnJvbSAuZW52L2Zub3ggc291cmNlcy4gTWlzZSB2YWx1ZXMgdGhhdFxuICAgIC8vIGRpZmZlciBmcm9tIHRoZSBhbWJpZW50IGFjdGl2YXRpb24gYXJlIGRlbGliZXJhdGVseSBrZXB0IHNvIHRoZSByZXF1ZXN0ZWQgY2FzY2FkZSBwcm9maWxlXG4gICAgLy8gKGUuZy4gYC0tY2FzY2FkZS1lbnY9dGVzdGApIHdpbnMgb3ZlciBhIHN0YWxlIGBtaXNlIGFjdGl2YXRlYCBlbnZpcm9ubWVudC5cbiAgICB0aGlzLmVudkNhY2hlID0geyAuLi5wcm9jZXNzLmVudiwgLi4uZW52VmFycyB9O1xuICAgIHJldHVybiB0aGlzLmVudkNhY2hlO1xuICB9XG5cbiAgQG1lbW9pemVPbmVcbiAgZ2V0IHBhY2thZ2VKc29uKCk6IFBhY2thZ2VKc29uIHtcbiAgICByZXR1cm4gSlNPTi5wYXJzZShmcy5yZWFkRmlsZVN5bmModGhpcy5wYWNrYWdlSnNvblBhdGgsICd1dGY4JykpIGFzIFBhY2thZ2VKc29uO1xuICB9XG5cbiAgQG1lbW9pemVPbmVcbiAgZ2V0IHBhY2thZ2VKc29uUGF0aCgpOiBzdHJpbmcge1xuICAgIHJldHVybiBwYXRoLmpvaW4odGhpcy5kaXJQYXRoLCAncGFja2FnZS5qc29uJyk7XG4gIH1cblxuICBAbWVtb2l6ZU9uZVxuICBnZXQgaGFzUHJpc21hKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAhIXRoaXMuZ2V0T3duRGVwZW5kZW5jeVZlcnNpb24oJ3ByaXNtYScpO1xuICB9XG5cbiAgQG1lbW9pemVPbmVcbiAgZ2V0IGhhc0RyaXp6bGUoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuICEhdGhpcy5nZXRPd25EZXBlbmRlbmN5VmVyc2lvbignZHJpenpsZS1vcm0nKTtcbiAgfVxuXG4gIEBtZW1vaXplT25lXG4gIGdldCBkYXRhYmFzZU9ybSgpOiBEYXRhYmFzZU9ybSB8IHVuZGVmaW5lZCB7XG4gICAgaWYgKHRoaXMuaGFzUHJpc21hKSByZXR1cm4gJ3ByaXNtYSc7XG4gICAgaWYgKHRoaXMuaGFzRHJpenpsZSkgcmV0dXJuICdkcml6emxlJztcbiAgICByZXR1cm47XG4gIH1cblxuICBAbWVtb2l6ZU9uZVxuICBnZXQgaGFzVml0ZXN0KCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAhISh0aGlzLnBhY2thZ2VKc29uLmRlcGVuZGVuY2llcz8udml0ZXN0ID8/IHRoaXMucGFja2FnZUpzb24uZGV2RGVwZW5kZW5jaWVzPy52aXRlc3QpO1xuICB9XG5cbiAgQG1lbW9pemVPbmVcbiAgZ2V0IGhhc094bGludCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5oYXNEZXBlbmRlbmN5KCdveGxpbnQnKTtcbiAgfVxuXG4gIEBtZW1vaXplT25lXG4gIGdldCBoYXNUeXBlQXdhcmVPeGxpbnQoKTogYm9vbGVhbiB7XG4gICAgLy8gT3hsaW50J3MgdHlwZS1hd2FyZSBtb2RlIHJlcXVpcmVzIHRoZSBveGxpbnQtdHNnb2xpbnQgYmluYXJ5LlxuICAgIHJldHVybiB0aGlzLmhhc094bGludCAmJiB0aGlzLmhhc0RlcGVuZGVuY3koJ294bGludC10c2dvbGludCcpO1xuICB9XG5cbiAgQG1lbW9pemVPbmVcbiAgZ2V0IGhhc094Zm10KCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmhhc0RlcGVuZGVuY3koJ294Zm10Jyk7XG4gIH1cblxuICBAbWVtb2l6ZU9uZVxuICBnZXQgaGFzUHJldHRpZXIoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuaGFzRGVwZW5kZW5jeSgncHJldHRpZXInKTtcbiAgfVxuXG4gIEBtZW1vaXplT25lXG4gIGdldCBoYXNQb2V0cnlMb2NrKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAoXG4gICAgICBmcy5leGlzdHNTeW5jKHBhdGguam9pbih0aGlzLmRpclBhdGgsICdwb2V0cnkubG9jaycpKSB8fCBmcy5leGlzdHNTeW5jKHBhdGguam9pbih0aGlzLnJvb3REaXJQYXRoLCAncG9ldHJ5LmxvY2snKSlcbiAgICApO1xuICB9XG5cbiAgQG1lbW9pemVPbmVcbiAgZ2V0IGhhc1B1YnNwZWNZYW1sKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAoXG4gICAgICBmcy5leGlzdHNTeW5jKHBhdGguam9pbih0aGlzLmRpclBhdGgsICdwdWJzcGVjLnlhbWwnKSkgfHxcbiAgICAgIGZzLmV4aXN0c1N5bmMocGF0aC5qb2luKHRoaXMucm9vdERpclBhdGgsICdwdWJzcGVjLnlhbWwnKSlcbiAgICApO1xuICB9XG5cbiAgQG1lbW9pemVPbmVcbiAgZ2V0IGhhc0NhcmdvVG9tbCgpOiBib29sZWFuIHtcbiAgICAvLyBPbmx5IHRoZSBwcm9qZWN0J3Mgb3duIGRpcmVjdG9yeSBpcyBjaGVja2VkIGJlY2F1c2UgYGNhcmdvIGZtdCAtLWFsbGBcbiAgICAvLyBjb3ZlcnMgdGhlIHdob2xlIHdvcmtzcGFjZTsgbWF0Y2hpbmcgdGhlIHJvb3QgZGlyZWN0b3J5IHRvbyB3b3VsZCBtYWtlXG4gICAgLy8gZXZlcnkgZGVzY2VuZGFudCBwcm9qZWN0IHJ1biB0aGUgc2FtZSB3b3Jrc3BhY2Utd2lkZSBjb21tYW5kIGluXG4gICAgLy8gcGFyYWxsZWwuXG4gICAgcmV0dXJuIGZzLmV4aXN0c1N5bmMocGF0aC5qb2luKHRoaXMuZGlyUGF0aCwgJ0NhcmdvLnRvbWwnKSk7XG4gIH1cblxuICBAbWVtb2l6ZU9uZVxuICBnZXQgcHJlZmVycmVkTGludGVyKCk6ICdveGxpbnQnIHwgdW5kZWZpbmVkIHtcbiAgICBpZiAodGhpcy5oYXNPeGxpbnQpIHJldHVybiAnb3hsaW50JztcbiAgICByZXR1cm47XG4gIH1cblxuICBoYXNPd25EZXBlbmRlbmN5KHBhY2thZ2VOYW1lOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICByZXR1cm4gISF0aGlzLmdldE93bkRlcGVuZGVuY3lWZXJzaW9uKHBhY2thZ2VOYW1lKTtcbiAgfVxuXG4gIEBtZW1vaXplT25lXG4gIGdldCBoYXNQbGF5d3JpZ2h0Q29uZmlnKCk6IGJvb2xlYW4ge1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gISF0aGlzLmZpbmRGaWxlKCdwbGF5d3JpZ2h0LmNvbmZpZy50cycpO1xuICAgIH0gY2F0Y2gge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIEBtZW1vaXplT25lXG4gIGdldCBza2lwTGF1bmNoaW5nU2VydmVyRm9yUGxheXdyaWdodCgpOiBib29sZWFuIHtcbiAgICBpZiAoaXNDSSh0aGlzLmVudi5DSSkpIHJldHVybiBmYWxzZTtcbiAgICB0cnkge1xuICAgICAgY29uc3QgY29uZmlnUGF0aCA9IHRoaXMuZmluZEZpbGUoJ3BsYXl3cmlnaHQuY29uZmlnLnRzJyk7XG4gICAgICByZXR1cm4gL1xcYndlYlNlcnZlclxcYi8udGVzdChmcy5yZWFkRmlsZVN5bmMoY29uZmlnUGF0aCwgJ3V0ZjgnKSk7XG4gICAgfSBjYXRjaCB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgQG1lbW9pemVPbmVcbiAgZ2V0IGRvY2tlclBhY2thZ2VKc29uKCk6IFBhY2thZ2VKc29uIHtcbiAgICByZXR1cm4gcGF0aC5kaXJuYW1lKHRoaXMuZmluZEZpbGUoJ0RvY2tlcmZpbGUnKSkgPT09IHRoaXMuZGlyUGF0aFxuICAgICAgPyB0aGlzLnBhY2thZ2VKc29uXG4gICAgICA6IChKU09OLnBhcnNlKFxuICAgICAgICAgIGZzLnJlYWRGaWxlU3luYyhwYXRoLmpvaW4ocGF0aC5kaXJuYW1lKHRoaXMuZmluZEZpbGUoJ0RvY2tlcmZpbGUnKSksICdwYWNrYWdlLmpzb24nKSwgJ3V0ZjgnKVxuICAgICAgICApIGFzIFBhY2thZ2VKc29uKTtcbiAgfVxuXG4gIEBtZW1vaXplT25lXG4gIGdldCBiaW5FeGlzdHMoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHByZXBlbmROb2RlTW9kdWxlc0JpblRvUGF0aCh0aGlzLmRpclBhdGgsIHRoaXMuZW52KTtcbiAgfVxuXG4gIGZpbmRGaWxlKGZpbGVOYW1lOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGxldCBmaWxlUGF0aCA9IHRoaXMucGF0aEJ5TmFtZS5nZXQoZmlsZU5hbWUpO1xuICAgIGlmIChmaWxlUGF0aCkgcmV0dXJuIGZpbGVQYXRoO1xuXG4gICAgZmlsZVBhdGggPSBbZmlsZU5hbWUsIHBhdGguam9pbignLi4nLCAnLi4nLCBmaWxlTmFtZSldXG4gICAgICAubWFwKChwKSA9PiBwYXRoLnJlc29sdmUodGhpcy5kaXJQYXRoLCBwKSlcbiAgICAgIC5maW5kKChwKSA9PiBmcy5leGlzdHNTeW5jKHApKTtcbiAgICBpZiAoIWZpbGVQYXRoKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEZpbGUgbm90IGZvdW5kOiAke2ZpbGVOYW1lfWApO1xuICAgIH1cbiAgICB0aGlzLnBhdGhCeU5hbWUuc2V0KGZpbGVOYW1lLCBmaWxlUGF0aCk7XG4gICAgcmV0dXJuIGZpbGVQYXRoO1xuICB9XG5cbiAgcHJpdmF0ZSBoYXNEZXBlbmRlbmN5KHBhY2thZ2VOYW1lOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICByZXR1cm4gISEoXG4gICAgICB0aGlzLmdldE93bkRlcGVuZGVuY3lWZXJzaW9uKHBhY2thZ2VOYW1lKSA/PyB0aGlzLmdldERlcGVuZGVuY3lWZXJzaW9uKHRoaXMucm9vdFBhY2thZ2VKc29uLCBwYWNrYWdlTmFtZSlcbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRPd25EZXBlbmRlbmN5VmVyc2lvbihwYWNrYWdlTmFtZTogc3RyaW5nKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5nZXREZXBlbmRlbmN5VmVyc2lvbih0aGlzLnBhY2thZ2VKc29uLCBwYWNrYWdlTmFtZSk7XG4gIH1cblxuICBwcml2YXRlIGdldERlcGVuZGVuY3lWZXJzaW9uKHBhY2thZ2VKc29uOiBQYWNrYWdlSnNvbiB8IHVuZGVmaW5lZCwgcGFja2FnZU5hbWU6IHN0cmluZyk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgaWYgKCFwYWNrYWdlSnNvbikgcmV0dXJuO1xuXG4gICAgcmV0dXJuIChcbiAgICAgIHBhY2thZ2VKc29uLmRlcGVuZGVuY2llcz8uW3BhY2thZ2VOYW1lXSA/P1xuICAgICAgcGFja2FnZUpzb24uZGV2RGVwZW5kZW5jaWVzPy5bcGFja2FnZU5hbWVdID8/XG4gICAgICBwYWNrYWdlSnNvbi5vcHRpb25hbERlcGVuZGVuY2llcz8uW3BhY2thZ2VOYW1lXSA/P1xuICAgICAgcGFja2FnZUpzb24ucGVlckRlcGVuZGVuY2llcz8uW3BhY2thZ2VOYW1lXVxuICAgICk7XG4gIH1cblxuICBAbWVtb2l6ZU9uZVxuICBwcml2YXRlIGdldCByb290UGFja2FnZUpzb24oKTogUGFja2FnZUpzb24gfCB1bmRlZmluZWQge1xuICAgIGlmICh0aGlzLnJvb3REaXJQYXRoID09PSB0aGlzLmRpclBhdGgpIHJldHVybiB0aGlzLnBhY2thZ2VKc29uO1xuXG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiBKU09OLnBhcnNlKGZzLnJlYWRGaWxlU3luYyhwYXRoLmpvaW4odGhpcy5yb290RGlyUGF0aCwgJ3BhY2thZ2UuanNvbicpLCAndXRmOCcpKSBhcyBQYWNrYWdlSnNvbjtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgY29uc29sZS5lcnJvcihgW3diXSBGYWlsZWQgdG8gcmVhZCBvciBwYXJzZSAke3BhdGguam9pbih0aGlzLnJvb3REaXJQYXRoLCAncGFja2FnZS5qc29uJyl9YCwgZXJyb3IpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0RmlsZURhdGFiYXNlVXJsUGF0aChwcm9qZWN0OiBQaWNrPFByb2plY3QsICdlbnYnPik6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IGRiVXJsID0gcHJvamVjdC5lbnYuREFUQUJBU0VfVVJMO1xuICBpZiAoIWRiVXJsPy5zdGFydHNXaXRoKEZJTEVfU0NIRU1BKSkgcmV0dXJuO1xuXG4gIGNvbnN0IHJhd1BhdGggPSBkYlVybC5zbGljZShGSUxFX1NDSEVNQS5sZW5ndGgpLnJlcGxhY2UoL1s/I10uKiQvLCAnJyk7XG4gIGNvbnN0IG5vcm1hbGl6ZWRQYXRoID0gcmF3UGF0aC5zdGFydHNXaXRoKCcvLycpID8gcmF3UGF0aC5zbGljZSgyKSA6IHJhd1BhdGg7XG4gIHJldHVybiBub3JtYWxpemVkUGF0aCB8fCB1bmRlZmluZWQ7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRBYnNvbHV0ZUZpbGVEYXRhYmFzZVVybFBhdGgoXG4gIHByb2plY3Q6IFBpY2s8UHJvamVjdCwgJ2Vudic+ICYgUGFydGlhbDxQaWNrPFByb2plY3QsICdkaXJQYXRoJyB8ICdyb290RGlyUGF0aCc+PlxuKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgZGJQYXRoID0gZ2V0RmlsZURhdGFiYXNlVXJsUGF0aChwcm9qZWN0KTtcbiAgaWYgKCFkYlBhdGgpIHJldHVybjtcblxuICBpZiAocGF0aC5pc0Fic29sdXRlKGRiUGF0aCkpIHJldHVybiBkYlBhdGg7XG5cbiAgY29uc3QgYmFzZURpclBhdGggPSBwcm9qZWN0LnJvb3REaXJQYXRoID8/IHByb2plY3QuZGlyUGF0aDtcbiAgcmV0dXJuIGJhc2VEaXJQYXRoID8gcGF0aC5yZXNvbHZlKGJhc2VEaXJQYXRoLCBkYlBhdGgpIDogdW5kZWZpbmVkO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEZvdW5kUHJvamVjdHMge1xuICByb290OiBQcm9qZWN0O1xuICBzZWxmOiBQcm9qZWN0O1xuICBkZXNjZW5kYW50czogUHJvamVjdFtdO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZmluZFNlbGZQcm9qZWN0KGFyZ3Y6IEVudlJlYWRlck9wdGlvbnMsIGxvYWRFbnYgPSB0cnVlLCBkaXJQYXRoPzogc3RyaW5nKTogUHJvamVjdCB8IHVuZGVmaW5lZCB7XG4gIGRpclBhdGggPz89IHByb2Nlc3MuY3dkKCk7XG4gIGlmICghZnMuZXhpc3RzU3luYyhwYXRoLmpvaW4oZGlyUGF0aCwgJ3BhY2thZ2UuanNvbicpKSkgcmV0dXJuO1xuXG4gIHJldHVybiBuZXcgUHJvamVjdChkaXJQYXRoLCBhcmd2LCBsb2FkRW52KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzUHJvamVjdEVudmlyb25tZW50KHByb2plY3Q6IFByb2plY3QsIG5hbWU6IHN0cmluZyk6IGJvb2xlYW4ge1xuICByZXR1cm4gcHJvamVjdC5lbnYuV0JfRU5WID09PSBuYW1lIHx8IHByb2plY3QuZW52Lk1JU0VfRU5WID09PSBuYW1lO1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZmluZERlc2NlbmRhbnRQcm9qZWN0cyhcbiAgYXJndjogRW52UmVhZGVyT3B0aW9ucyxcbiAgbG9hZEVudiA9IHRydWUsXG4gIGRpclBhdGg/OiBzdHJpbmdcbik6IFByb21pc2U8Rm91bmRQcm9qZWN0cyB8IHVuZGVmaW5lZD4ge1xuICBjb25zdCByb290QW5kU2VsZlByb2plY3RzID0gZmluZFJvb3RBbmRTZWxmUHJvamVjdHMoYXJndiwgbG9hZEVudiwgZGlyUGF0aCk7XG4gIGlmICghcm9vdEFuZFNlbGZQcm9qZWN0cykgcmV0dXJuO1xuXG4gIHJldHVybiB7XG4gICAgLi4ucm9vdEFuZFNlbGZQcm9qZWN0cyxcbiAgICBkZXNjZW5kYW50czpcbiAgICAgIHJvb3RBbmRTZWxmUHJvamVjdHMucm9vdCA9PT0gcm9vdEFuZFNlbGZQcm9qZWN0cy5zZWxmXG4gICAgICAgID8gYXdhaXQgZ2V0QWxsRGVzY2VuZGFudFByb2plY3RzKGFyZ3YsIHJvb3RBbmRTZWxmUHJvamVjdHMucm9vdCwgbG9hZEVudilcbiAgICAgICAgOiBbcm9vdEFuZFNlbGZQcm9qZWN0cy5zZWxmXSxcbiAgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGZpbmRSb290QW5kU2VsZlByb2plY3RzKFxuICBhcmd2OiBFbnZSZWFkZXJPcHRpb25zLFxuICBsb2FkRW52ID0gdHJ1ZSxcbiAgZGlyUGF0aD86IHN0cmluZ1xuKTogT21pdDxGb3VuZFByb2plY3RzLCAnZGVzY2VuZGFudHMnPiB8IHVuZGVmaW5lZCB7XG4gIGRpclBhdGggPz89IHByb2Nlc3MuY3dkKCk7XG4gIGlmICghZnMuZXhpc3RzU3luYyhwYXRoLmpvaW4oZGlyUGF0aCwgJ3BhY2thZ2UuanNvbicpKSkgcmV0dXJuO1xuXG4gIGNvbnN0IHRoaXNQcm9qZWN0ID0gbmV3IFByb2plY3QoZGlyUGF0aCwgYXJndiwgbG9hZEVudik7XG4gIGxldCByb290UHJvamVjdCA9IHRoaXNQcm9qZWN0O1xuICBpZiAoIXRoaXNQcm9qZWN0LnBhY2thZ2VKc29uLndvcmtzcGFjZXMgJiYgcGF0aC5kaXJuYW1lKGRpclBhdGgpLmVuZHNXaXRoKCcvcGFja2FnZXMnKSkge1xuICAgIGNvbnN0IHJvb3REaXJQYXRoID0gcGF0aC5yZXNvbHZlKGRpclBhdGgsICcuLicsICcuLicpO1xuICAgIGlmIChmcy5leGlzdHNTeW5jKHBhdGguam9pbihyb290RGlyUGF0aCwgJ3BhY2thZ2UuanNvbicpKSkge1xuICAgICAgcm9vdFByb2plY3QgPSBuZXcgUHJvamVjdChyb290RGlyUGF0aCwgYXJndiwgbG9hZEVudik7XG4gICAgfVxuICB9XG4gIHJldHVybiB7IHJvb3Q6IHJvb3RQcm9qZWN0LCBzZWxmOiB0aGlzUHJvamVjdCB9O1xufVxuXG5mdW5jdGlvbiB0ZXN0RmlsZUNvbnRlbnQoZmlsZVBhdGg6IHN0cmluZywgcGF0dGVybjogUmVnRXhwKTogYm9vbGVhbiB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIHBhdHRlcm4udGVzdChmcy5yZWFkRmlsZVN5bmMoZmlsZVBhdGgsICd1dGY4JykpO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn1cblxuYXN5bmMgZnVuY3Rpb24gZ2V0QWxsRGVzY2VuZGFudFByb2plY3RzKFxuICBhcmd2OiBFbnZSZWFkZXJPcHRpb25zLFxuICByb290UHJvamVjdDogUHJvamVjdCxcbiAgbG9hZEVudjogYm9vbGVhblxuKTogUHJvbWlzZTxQcm9qZWN0W10+IHtcbiAgY29uc3QgcHJvamVjdHMgPSBbcm9vdFByb2plY3RdO1xuXG4gIGNvbnN0IHdvcmtzcGFjZSA9IHJvb3RQcm9qZWN0LnBhY2thZ2VKc29uLndvcmtzcGFjZXM7XG4gIGlmICghQXJyYXkuaXNBcnJheSh3b3Jrc3BhY2UpKSByZXR1cm4gcHJvamVjdHM7XG5cbiAgY29uc3QgZ2xvYlBhdHRlcm46IHN0cmluZ1tdID0gW107XG4gIGNvbnN0IHBhY2thZ2VEaXJzOiBzdHJpbmdbXSA9IFtdO1xuICBmb3IgKGNvbnN0IHdvcmtzcGFjZVBhdGggb2Ygd29ya3NwYWNlLm1hcCgod3M6IHN0cmluZykgPT4gcGF0aC5qb2luKHJvb3RQcm9qZWN0LmRpclBhdGgsIHdzKSkpIHtcbiAgICBpZiAoZnMuZXhpc3RzU3luYyh3b3Jrc3BhY2VQYXRoKSkge1xuICAgICAgcGFja2FnZURpcnMucHVzaCh3b3Jrc3BhY2VQYXRoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgZ2xvYlBhdHRlcm4ucHVzaCh3b3Jrc3BhY2VQYXRoKTtcbiAgICB9XG4gIH1cbiAgcGFja2FnZURpcnMucHVzaCguLi4oYXdhaXQgZ2xvYmJ5KGdsb2JQYXR0ZXJuLCB7IGRvdDogdHJ1ZSwgb25seURpcmVjdG9yaWVzOiB0cnVlIH0pKSk7XG4gIGZvciAoY29uc3Qgc3ViUGFja2FnZURpclBhdGggb2YgcGFja2FnZURpcnMpIHtcbiAgICBpZiAoIWZzLmV4aXN0c1N5bmMocGF0aC5qb2luKHN1YlBhY2thZ2VEaXJQYXRoLCAncGFja2FnZS5qc29uJykpKSBjb250aW51ZTtcblxuICAgIHByb2plY3RzLnB1c2gobmV3IFByb2plY3Qoc3ViUGFja2FnZURpclBhdGgsIGFyZ3YsIGxvYWRFbnYpKTtcbiAgfVxuICByZXR1cm4gcHJvamVjdHM7XG59XG4iLCJpbXBvcnQgY2hpbGRfcHJvY2VzcyBmcm9tICdub2RlOmNoaWxkX3Byb2Nlc3MnO1xuaW1wb3J0IHR5cGUgeyBCaW5hcnlMaWtlLCBIYXNoIH0gZnJvbSAnbm9kZTpjcnlwdG8nO1xuaW1wb3J0IHsgY3JlYXRlSGFzaCB9IGZyb20gJ25vZGU6Y3J5cHRvJztcbmltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB7IGlnbm9yZUVub2VudEFzeW5jIH0gZnJvbSAnQHdpbGxib29zdGVyL3NoYXJlZC1saWIvc3JjJztcbmltcG9ydCBjaGFsayBmcm9tICdjaGFsayc7XG5pbXBvcnQgdHlwZSB7IEFyZ3VtZW50c0NhbWVsQ2FzZSwgQ29tbWFuZE1vZHVsZSwgSW5mZXJyZWRPcHRpb25UeXBlcyB9IGZyb20gJ3lhcmdzJztcblxuaW1wb3J0IHR5cGUgeyBQcm9qZWN0IH0gZnJvbSAnLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQgeyBmaW5kU2VsZlByb2plY3QgfSBmcm9tICcuLi9wcm9qZWN0LmpzJztcbmltcG9ydCB0eXBlIHsgc2hhcmVkT3B0aW9uc0J1aWxkZXIgfSBmcm9tICcuLi9zaGFyZWRPcHRpb25zQnVpbGRlci5qcyc7XG5cbmNvbnN0IGJ1aWxkZXIgPSB7XG4gIGNvbW1hbmQ6IHtcbiAgICBkZXNjcmlwdGlvbjogJ0EgYnVpbGQgY29tbWFuZCAoZGVmYXVsdDogeWFybnxidW4gYnVpbGQpJyxcbiAgICB0eXBlOiAnc3RyaW5nJyxcbiAgICBhbGlhczogJ2MnLFxuICB9LFxufSBhcyBjb25zdDtcblxuZXhwb3J0IGNvbnN0IGJ1aWxkSWZOZWVkZWRDb21tYW5kOiBDb21tYW5kTW9kdWxlPHVua25vd24sIEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIGJ1aWxkZXI+PiA9IHtcbiAgY29tbWFuZDogJ2J1aWxkSWZOZWVkZWQnLFxuICBkZXNjcmliZTogJ0J1aWxkIGNvZGUgaWYgY2hhbmdlcyBhcmUgZGV0ZWN0ZWQnLFxuICBidWlsZGVyLFxuICBhc3luYyBoYW5kbGVyKGFyZ3YpIHtcbiAgICBhd2FpdCBidWlsZElmTmVlZGVkKGFyZ3YpO1xuICB9LFxufTtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGJ1aWxkSWZOZWVkZWQoXG4gIC8vIFRlc3QgY29kZSByZXF1aXJlcyBQYXJ0aWFsPC4uLj5cbiAgYXJndjogUGFydGlhbDxBcmd1bWVudHNDYW1lbENhc2U8SW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgYnVpbGRlciAmIHR5cGVvZiBzaGFyZWRPcHRpb25zQnVpbGRlcj4+PixcbiAgcHJvamVjdFBhdGhGb3JUZXN0aW5nPzogc3RyaW5nXG4pOiBQcm9taXNlPGJvb2xlYW4gfCB1bmRlZmluZWQ+IHtcbiAgY29uc3QgcHJvamVjdCA9IGZpbmRTZWxmUHJvamVjdChhcmd2LCB0cnVlLCBwcm9qZWN0UGF0aEZvclRlc3RpbmcpO1xuICBpZiAoIXByb2plY3QpIHtcbiAgICBjb25zb2xlLmVycm9yKGNoYWxrLnJlZCgnTm8gcHJvamVjdCBmb3VuZC4nKSk7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBjb25zdCBidWlsZENvbW1hbmQgPVxuICAgIGFyZ3YuY29tbWFuZCA/PyAocHJvamVjdC5wYWNrYWdlSnNvbi5zY3JpcHRzPy5idWlsZCA/IGAke3Byb2plY3QucGFja2FnZU1hbmFnZXJSdW5Db21tYW5kfSBidWlsZGAgOiB1bmRlZmluZWQpO1xuICBpZiAoIWJ1aWxkQ29tbWFuZCkge1xuICAgIGNvbnNvbGUuaW5mbyhjaGFsay5ncmVlbignU2tpcCB0byBidWlsZCBiZWNhdXNlIG5vIGJ1aWxkIGNvbW1hbmQgaXMgZGVmaW5lZC4nKSk7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIGFyZ3YgPSB7IC4uLmFyZ3YsIGNvbW1hbmQ6IGJ1aWxkQ29tbWFuZCB9O1xuXG4gIGlmICghZnMuZXhpc3RzU3luYyhwYXRoLmpvaW4ocHJvamVjdC5yb290RGlyUGF0aCwgJy5naXQnKSkpIHtcbiAgICBidWlsZChwcm9qZWN0LCBhcmd2KTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIGNvbnN0IFtjYW5Ta2lwLCBjYWNoZUZpbGVQYXRoLCBjb250ZW50SGFzaF0gPSBhd2FpdCBjYW5Ta2lwQnVpbGQocHJvamVjdCwgYXJndik7XG4gIGlmIChjYW5Ta2lwKSB7XG4gICAgY29uc29sZS5pbmZvKGNoYWxrLmdyZWVuKGBTa2lwIHRvIHJ1biAnJHthcmd2LmNvbW1hbmR9JyDwn5KrYCkpO1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGlmICghYnVpbGQocHJvamVjdCwgYXJndikpIHJldHVybjtcblxuICBpZiAoIWFyZ3YuZHJ5UnVuKSB7XG4gICAgYXdhaXQgZnMucHJvbWlzZXMud3JpdGVGaWxlKGNhY2hlRmlsZVBhdGgsIGNvbnRlbnRIYXNoLCAndXRmOCcpO1xuICB9XG4gIHJldHVybiB0cnVlO1xufVxuXG5mdW5jdGlvbiBidWlsZChwcm9qZWN0OiBQcm9qZWN0LCBhcmd2OiBQYXJ0aWFsPEFyZ3VtZW50c0NhbWVsQ2FzZTxJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBidWlsZGVyPj4+KTogYm9vbGVhbiB7XG4gIGNvbnNvbGUuaW5mbyhjaGFsay5ncmVlbihgUnVuICcke2FyZ3YuY29tbWFuZH0nYCkpO1xuICBpZiAoIWFyZ3YuZHJ5UnVuKSB7XG4gICAgY29uc3QgcmV0ID0gY2hpbGRfcHJvY2Vzcy5zcGF3blN5bmMoYXJndi5jb21tYW5kID8/ICcnLCB7XG4gICAgICBjd2Q6IHByb2plY3QuZGlyUGF0aCxcbiAgICAgIGVudjogcHJvamVjdC5lbnYsXG4gICAgICBzaGVsbDogdHJ1ZSxcbiAgICAgIHN0ZGlvOiAnaW5oZXJpdCcsXG4gICAgfSk7XG4gICAgaWYgKHJldC5zdGF0dXMgIT09IDApIHtcbiAgICAgIHByb2Nlc3MuZXhpdENvZGUgPSByZXQuc3RhdHVzID8/IDE7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG4gIHJldHVybiB0cnVlO1xufVxuXG5jb25zdCBpZ25vcmluZ0VudlZhck5hbWVzID0gbmV3IFNldChbJ0NJJywgJ1BXREVCVUcnLCAnVE1QRElSJ10pO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gY2FuU2tpcEJ1aWxkKFxuICBwcm9qZWN0OiBQcm9qZWN0LFxuICBhcmd2OiBQYXJ0aWFsPEFyZ3VtZW50c0NhbWVsQ2FzZTxJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBidWlsZGVyPj4+XG4pOiBQcm9taXNlPFtib29sZWFuLCBzdHJpbmcsIHN0cmluZ10+IHtcbiAgY29uc3QgY2FjaGVEaXJlY3RvcnlQYXRoID0gcGF0aC5yZXNvbHZlKHByb2plY3QuZGlyUGF0aCwgJ25vZGVfbW9kdWxlcycsICcuY2FjaGUnLCAnYnVpbGQnKTtcbiAgY29uc3QgY2FjaGVGaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShjYWNoZURpcmVjdG9yeVBhdGgsICdsYXN0LWJ1aWxkJyk7XG4gIGF3YWl0IGZzLnByb21pc2VzLm1rZGlyKGNhY2hlRGlyZWN0b3J5UGF0aCwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG5cbiAgY29uc3QgaGFzaCA9IGNyZWF0ZUhhc2goJ3NoYTI1NicpO1xuXG4gIGNvbnN0IGNvbW1pdEhhc2ggPSBjaGlsZF9wcm9jZXNzLmV4ZWNTeW5jKCdnaXQgcmV2LXBhcnNlIEhFQUQnLCB7IGN3ZDogcHJvamVjdC5kaXJQYXRoIH0pLnRvU3RyaW5nKCkudHJpbSgpO1xuICBoYXNoLnVwZGF0ZShjb21taXRIYXNoKTtcblxuICBjb25zdCBlbnZpcm9ubWVudEpzb24gPSBKU09OLnN0cmluZ2lmeShcbiAgICBPYmplY3QuZW50cmllcyhwcm9qZWN0LmVudilcbiAgICAgIC5maWx0ZXIoKFtrZXldKSA9PiAhaWdub3JpbmdFbnZWYXJOYW1lcy5oYXMoa2V5KSlcbiAgICAgIC50b1NvcnRlZCgoW2tleTFdLCBba2V5Ml0pID0+IGtleTEubG9jYWxlQ29tcGFyZShrZXkyKSlcbiAgKTtcbiAgaGFzaC51cGRhdGUoZW52aXJvbm1lbnRKc29uKTtcblxuICBhd2FpdCB1cGRhdGVIYXNoV2l0aERpZmZSZXN1bHQocHJvamVjdCwgYXJndiwgaGFzaCk7XG4gIGNvbnN0IGNvbnRlbnRIYXNoID0gaGFzaC5kaWdlc3QoJ2hleCcpO1xuXG4gIGNvbnN0IGNhY2hlZENvbnRlbnRIYXNoID0gYXdhaXQgaWdub3JlRW5vZW50QXN5bmMoKCkgPT4gZnMucHJvbWlzZXMucmVhZEZpbGUoY2FjaGVGaWxlUGF0aCwgJ3V0ZjgnKSk7XG4gIHJldHVybiBbY2FjaGVkQ29udGVudEhhc2ggPT09IGNvbnRlbnRIYXNoLCBjYWNoZUZpbGVQYXRoLCBjb250ZW50SGFzaF07XG59XG5cbmNvbnN0IGluY2x1ZGVQYXR0ZXJucyA9IFsnc3JjLycsICdwdWJsaWMvJ107XG5jb25zdCBpbmNsdWRlU3VmZml4ID0gW1xuICAnLmpzJyxcbiAgJy5janMnLFxuICAnLm1qcycsXG4gICcuanN4JyxcbiAgJy50cycsXG4gICcuY3RzJyxcbiAgJy5tdHMnLFxuICAnLnRzeCcsXG4gICcuanNvbicsXG4gICcuYnJvd3NlcnNsaXN0cmMnLFxuICAvLyBCZWNhdXNlIHNvbWUgYnVpbGQgY29tbWFuZHMgYWZmZWN0ZWQgYnkgY2hhbmdlcyBpbiBgcGFja2FnZS5qc29uYFxuICAncGFja2FnZS5qc29uJyxcbiAgJ3lhcm4ubG9jaycsXG5dO1xuY29uc3QgZXhjbHVkZVBhdHRlcm5zID0gWyd0ZXN0LycsICd0ZXN0cy8nLCAnX190ZXN0c19fLycsICd0ZXN0LWZpeHR1cmVzLycsICd0ZXN0L2ZpeHR1cmVzLyddO1xuXG5hc3luYyBmdW5jdGlvbiB1cGRhdGVIYXNoV2l0aERpZmZSZXN1bHQoXG4gIHByb2plY3Q6IFByb2plY3QsXG4gIGFyZ3Y6IFBhcnRpYWw8QXJndW1lbnRzQ2FtZWxDYXNlPEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIGJ1aWxkZXI+Pj4sXG4gIGhhc2g6IEhhc2hcbik6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcbiAgICBjb25zdCByZXQgPSBjaGlsZF9wcm9jZXNzLnNwYXduU3luYygnZ2l0JywgWydzdGF0dXMnLCAnLS1wb3JjZWxhaW4nXSwge1xuICAgICAgY3dkOiBwcm9qZWN0LmRpclBhdGgsXG4gICAgICBlbnY6IHByb2plY3QuZW52LFxuICAgICAgc3RkaW86ICdwaXBlJyxcbiAgICAgIGVuY29kaW5nOiAndXRmOCcsXG4gICAgfSk7XG4gICAgY29uc3QgbGluZXMgPSByZXQuc3Rkb3V0XG4gICAgICAudHJpbSgpXG4gICAgICAuc3BsaXQoJ1xcbicpXG4gICAgICAuZmlsdGVyKChsaW5lKSA9PiBsaW5lLmxlbmd0aCA+IDApO1xuICAgIGNvbnN0IGZpbGVQYXRocyA9IGxpbmVzXG4gICAgICAubWFwKChsaW5lKSA9PiBsaW5lLnNsaWNlKDIpLnRyaW0oKSlcbiAgICAgIC5tYXAoKGZpbGVQYXRoKSA9PlxuICAgICAgICBwcm9qZWN0LmVudi5XQl9FTlYgPT09ICd0ZXN0JyA/IGZpbGVQYXRoLnJlcGxhY2UoL3BhY2thZ2VzXFwvd2JcXC90ZXN0XFwvZml4dHVyZXNcXC9bXi9dK1xcLy8sICcnKSA6IGZpbGVQYXRoXG4gICAgICApO1xuICAgIGNvbnN0IGZpbHRlcmVkRmlsZVBhdGhzID0gZmlsZVBhdGhzLmZpbHRlcihcbiAgICAgIChmaWxlUGF0aCkgPT5cbiAgICAgICAgKGluY2x1ZGVQYXR0ZXJucy5zb21lKChwYXR0ZXJuKSA9PiBmaWxlUGF0aC5pbmNsdWRlcyhwYXR0ZXJuKSkgfHxcbiAgICAgICAgICBpbmNsdWRlU3VmZml4LnNvbWUoKHN1ZmZpeCkgPT4gZmlsZVBhdGguZW5kc1dpdGgoc3VmZml4KSkpICYmXG4gICAgICAgICFleGNsdWRlUGF0dGVybnMuc29tZSgocGF0dGVybikgPT4gZmlsZVBhdGguaW5jbHVkZXMocGF0dGVybikpXG4gICAgKTtcbiAgICBpZiAoYXJndi52ZXJib3NlKSB7XG4gICAgICBjb25zb2xlLmluZm8oYENoYW5nZWQgZmlsZXM6ICR7ZmlsdGVyZWRGaWxlUGF0aHMuam9pbignLCAnKX1gKTtcbiAgICB9XG5cbiAgICAvLyAnZ2l0IGRpZmYgLS0nIHdvcmtzIG9ubHkgb24gcm9vdERpclBhdGhcbiAgICBjb25zdCBwcm9jID0gY2hpbGRfcHJvY2Vzcy5zcGF3bignZ2l0JywgWydkaWZmJywgJy0tJywgLi4uZmlsdGVyZWRGaWxlUGF0aHNdLCB7IGN3ZDogcHJvamVjdC5yb290RGlyUGF0aCB9KTtcbiAgICBwcm9jLnN0ZG91dC5vbignZGF0YScsIChkYXRhOiBCaW5hcnlMaWtlKSA9PiB7XG4gICAgICBoYXNoLnVwZGF0ZShkYXRhKTtcbiAgICAgIGlmIChhcmd2LnZlcmJvc2UpIHtcbiAgICAgICAgY29uc29sZS5pbmZvKCdEYXRhOicsIGRhdGEpO1xuICAgICAgICBjb25zb2xlLmluZm8oJ0hhc2g6JywgaGFzaC5jb3B5KCkuZGlnZXN0KCdoZXgnKSk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgcHJvYy5vbignY2xvc2UnLCAoKSA9PiB7XG4gICAgICByZXNvbHZlKCk7XG4gICAgfSk7XG4gIH0pO1xufVxuIiwiaW1wb3J0IHsgUHJvbWlzZVBvb2wgfSBmcm9tICdtaW5pbWFsLXByb21pc2UtcG9vbCc7XG5cbmV4cG9ydCBjb25zdCBwcm9taXNlUG9vbCA9IG5ldyBQcm9taXNlUG9vbCgpO1xuIiwiaW1wb3J0IHsgc3Bhd25Bc3luYyB9IGZyb20gJ0B3aWxsYm9vc3Rlci9zaGFyZWQtbGliLW5vZGUvc3JjJztcbmltcG9ydCBjaGFsayBmcm9tICdjaGFsayc7XG5pbXBvcnQgdHlwZSB7IEFyZ3VtZW50c0NhbWVsQ2FzZSwgSW5mZXJyZWRPcHRpb25UeXBlcyB9IGZyb20gJ3lhcmdzJztcblxuaW1wb3J0IHR5cGUgeyBQcm9qZWN0IH0gZnJvbSAnLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQgdHlwZSB7IHNoYXJlZE9wdGlvbnNCdWlsZGVyIH0gZnJvbSAnLi4vc2hhcmVkT3B0aW9uc0J1aWxkZXIuanMnO1xuaW1wb3J0IHsgcHJvbWlzZVBvb2wgfSBmcm9tICcuLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5cbmludGVyZmFjZSBPcHRpb25zIHtcbiAgY2k/OiBib29sZWFuO1xuICBleGl0SWZGYWlsZWQ/OiBib29sZWFuO1xuICBvblNpZ25hbD86IChzaWduYWw6IE5vZGVKUy5TaWduYWxzIHwgbnVsbCkgPT4gdm9pZDtcbiAgb21pdFNpbGVudFN0YXJ0PzogYm9vbGVhbjtcbiAgcHJlc2VydmVDb2xvcj86IGJvb2xlYW47XG4gIHByb2Nlc3NTaWxlbnRPdXRwdXQ/OiAob3V0cHV0OiBzdHJpbmcpID0+IHN0cmluZztcbiAgcHJpbnRSYXdPdXRwdXQ/OiBib29sZWFuO1xuICBwcmludFNpbGVudE91dHB1dE9uRmFpbHVyZU9ubHk/OiBib29sZWFuO1xuICBzaWxlbnRQcm9ncmVzc0ludGVydmFsTXM/OiBudW1iZXI7XG4gIHNpbGVudFN1Y2Nlc3NNZXNzYWdlPzogc3RyaW5nO1xuICB0aW1lb3V0PzogbnVtYmVyO1xufVxuXG5jb25zdCBkZWZhdWx0T3B0aW9uczogT3B0aW9ucyA9IHtcbiAgZXhpdElmRmFpbGVkOiB0cnVlLFxufTtcblxuZXhwb3J0IGludGVyZmFjZSBCdWZmZXJlZFJ1blJlc3VsdCB7XG4gIGV4aXRDb2RlOiBudW1iZXI7XG4gIG91dHB1dDogc3RyaW5nO1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcnVuV2l0aFNwYXduKFxuICBzY3JpcHQ6IHN0cmluZyxcbiAgcHJvamVjdDogUHJvamVjdCxcbiAgYXJndjogUGFydGlhbDxBcmd1bWVudHNDYW1lbENhc2U8SW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2Ygc2hhcmVkT3B0aW9uc0J1aWxkZXI+Pj4gJiB7IHNpbGVudD86IGJvb2xlYW4gfSxcbiAgb3B0czogT3B0aW9ucyA9IGRlZmF1bHRPcHRpb25zXG4pOiBQcm9taXNlPG51bWJlcj4ge1xuICBjb25zdCBub3JtYWxpemVkU2NyaXB0ID0gbm9ybWFsaXplU2NyaXB0KHNjcmlwdCwgcHJvamVjdCk7XG4gIGlmICghKGFyZ3Yuc2lsZW50ICYmIG9wdHMub21pdFNpbGVudFN0YXJ0ICYmICFhcmd2LmRyeVJ1bikpIHtcbiAgICBwcmludFN0YXJ0KG5vcm1hbGl6ZWRTY3JpcHQucHJpbnRhYmxlLCBwcm9qZWN0LCBhcmd2LnNpbGVudCA/ICdDb21tYW5kJyA6ICdTdGFydCcpO1xuICB9XG4gIGlmIChhcmd2LnZlcmJvc2UpIHtcbiAgICBwcmludFN0YXJ0KG5vcm1hbGl6ZWRTY3JpcHQucnVubmFibGUsIHByb2plY3QsICdTdGFydCAocmF3KScsIHRydWUpO1xuICB9XG4gIGlmIChhcmd2LmRyeVJ1bikge1xuICAgIHByaW50RmluaXNoZWRBbmRFeGl0SWZOZWVkZWQobm9ybWFsaXplZFNjcmlwdC5wcmludGFibGUsIDAsIG9wdHMsIHsgc2lsZW50U3VjY2VzczogYXJndi5zaWxlbnQgfSk7XG4gICAgcmV0dXJuIDA7XG4gIH1cblxuICBjb25zdCBzaG91bGRQcm9jZXNzU2lsZW50T3V0cHV0ID0gQm9vbGVhbihcbiAgICBhcmd2LnNpbGVudCAmJiAob3B0cy5wcm9jZXNzU2lsZW50T3V0cHV0ID8/IG9wdHMucHJpbnRTaWxlbnRPdXRwdXRPbkZhaWx1cmVPbmx5KVxuICApO1xuICBsZXQgd3JvdGVTaWxlbnRQcm9ncmVzcyA9IGZhbHNlO1xuICBjb25zdCBwcm9ncmVzc1RpbWVyID1cbiAgICBhcmd2LnNpbGVudCAmJiBvcHRzLnNpbGVudFByb2dyZXNzSW50ZXJ2YWxNc1xuICAgICAgPyBzZXRJbnRlcnZhbCgoKSA9PiB7XG4gICAgICAgICAgcHJvY2Vzcy5zdGRvdXQud3JpdGUoJy4nKTtcbiAgICAgICAgICB3cm90ZVNpbGVudFByb2dyZXNzID0gdHJ1ZTtcbiAgICAgICAgfSwgb3B0cy5zaWxlbnRQcm9ncmVzc0ludGVydmFsTXMpXG4gICAgICA6IHVuZGVmaW5lZDtcbiAgY29uc3QgcmV0ID0gYXdhaXQgc3Bhd25Bc3luYyhub3JtYWxpemVkU2NyaXB0LnJ1bm5hYmxlLCB1bmRlZmluZWQsIHtcbiAgICBjd2Q6IHByb2plY3QuZGlyUGF0aCxcbiAgICBlbnY6IGNvbmZpZ3VyZUVudihwcm9qZWN0LmVudiwgeyAuLi5vcHRzLCBwcmVzZXJ2ZUNvbG9yOiBvcHRzLnByZXNlcnZlQ29sb3IgPz8gKGFyZ3Yuc2lsZW50ID8gdHJ1ZSA6IHVuZGVmaW5lZCkgfSksXG4gICAgc2hlbGw6IHRydWUsXG4gICAgc3RkaW86IGFyZ3Yuc2lsZW50ID8gJ3BpcGUnIDogJ2luaGVyaXQnLFxuICAgIHRpbWVvdXQ6IG9wdHMudGltZW91dCxcbiAgICBtZXJnZU91dEFuZEVycm9yOiBzaG91bGRQcm9jZXNzU2lsZW50T3V0cHV0LFxuICAgIGtpbGxPbkV4aXQ6IHRydWUsXG4gICAgcHJpbnRpbmdTdGRvdXQ6IGFyZ3Yuc2lsZW50ICYmICFzaG91bGRQcm9jZXNzU2lsZW50T3V0cHV0LFxuICAgIHByaW50aW5nU3RkZXJyOiBhcmd2LnNpbGVudCAmJiAhc2hvdWxkUHJvY2Vzc1NpbGVudE91dHB1dCxcbiAgICBvbWl0QmxhbmtMaW5lc1doaWxlUHJpbnRpbmc6IGFyZ3Yuc2lsZW50LFxuICAgIHZlcmJvc2U6IGFyZ3YudmVyYm9zZSxcbiAgfSkuZmluYWxseSgoKSA9PiB7XG4gICAgaWYgKHByb2dyZXNzVGltZXIpIHtcbiAgICAgIGNsZWFySW50ZXJ2YWwocHJvZ3Jlc3NUaW1lcik7XG4gICAgfVxuICB9KTtcbiAgY29uc3QgZXhpdENvZGUgPSByZXQuc3RhdHVzID8/IDE7XG4gIGlmICh3cm90ZVNpbGVudFByb2dyZXNzKSB7XG4gICAgcHJvY2Vzcy5zdGRvdXQud3JpdGUoJ1xcbicpO1xuICB9XG4gIGlmIChzaG91bGRQcm9jZXNzU2lsZW50T3V0cHV0ICYmICghb3B0cy5wcmludFNpbGVudE91dHB1dE9uRmFpbHVyZU9ubHkgfHwgZXhpdENvZGUgIT09IDApKSB7XG4gICAgY29uc3Qgb3V0cHV0ID0gKG9wdHMucHJvY2Vzc1NpbGVudE91dHB1dCA/IG9wdHMucHJvY2Vzc1NpbGVudE91dHB1dChyZXQuc3Rkb3V0KSA6IHJldC5zdGRvdXQpLnRyaW0oKTtcbiAgICBpZiAob3V0cHV0KSB7XG4gICAgICBwcm9jZXNzLnN0ZG91dC53cml0ZShvdXRwdXQpO1xuICAgICAgcHJvY2Vzcy5zdGRvdXQud3JpdGUoJ1xcbicpO1xuICAgIH1cbiAgfVxuICBpZiAoYXJndi5zaWxlbnQgJiYgZXhpdENvZGUgPT09IDAgJiYgb3B0cy5zaWxlbnRTdWNjZXNzTWVzc2FnZSkge1xuICAgIGNvbnNvbGUuaW5mbyhjaGFsay5ncmVlbihvcHRzLnNpbGVudFN1Y2Nlc3NNZXNzYWdlKSk7XG4gIH1cbiAgb3B0cy5vblNpZ25hbD8uKHJldC5zaWduYWwpO1xuICBwcmludEZpbmlzaGVkQW5kRXhpdElmTmVlZGVkKG5vcm1hbGl6ZWRTY3JpcHQucHJpbnRhYmxlLCBleGl0Q29kZSwgb3B0cywgeyBzaWxlbnRTdWNjZXNzOiBhcmd2LnNpbGVudCB9KTtcbiAgcmV0dXJuIGV4aXRDb2RlO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcnVuV2l0aFNwYXduSW5QYXJhbGxlbChcbiAgc2NyaXB0OiBzdHJpbmcsXG4gIHByb2plY3Q6IFByb2plY3QsXG4gIGFyZ3Y6IFBhcnRpYWw8QXJndW1lbnRzQ2FtZWxDYXNlPEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIHNoYXJlZE9wdGlvbnNCdWlsZGVyPj4+LFxuICBvcHRzOiBPcHRpb25zID0gZGVmYXVsdE9wdGlvbnNcbik6IFByb21pc2U8bnVtYmVyPiB7XG4gIHJldHVybiBwcm9taXNlUG9vbC5ydW5BbmRXYWl0Rm9yUmV0dXJuVmFsdWUoYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IG5vcm1hbGl6ZWRTY3JpcHQgPSBub3JtYWxpemVTY3JpcHQoc2NyaXB0LCBwcm9qZWN0KTtcbiAgICBwcmludFN0YXJ0KG5vcm1hbGl6ZWRTY3JpcHQucHJpbnRhYmxlLCBwcm9qZWN0LCAnU3RhcnQgKHBhcmFsbGVsKScsIHRydWUpO1xuICAgIGlmIChhcmd2LmRyeVJ1bikge1xuICAgICAgcHJpbnRTdGFydChub3JtYWxpemVkU2NyaXB0LnByaW50YWJsZSwgcHJvamVjdCwgJ1N0YXJ0ZWQgKGxvZyknKTtcbiAgICAgIGlmIChhcmd2LnZlcmJvc2UpIHtcbiAgICAgICAgcHJpbnRTdGFydChub3JtYWxpemVkU2NyaXB0LnJ1bm5hYmxlLCBwcm9qZWN0LCAnU3RhcnRlZCAocmF3KScsIHRydWUpO1xuICAgICAgfVxuICAgICAgcHJpbnRGaW5pc2hlZEFuZEV4aXRJZk5lZWRlZChub3JtYWxpemVkU2NyaXB0LnByaW50YWJsZSwgMCwgb3B0cyk7XG4gICAgICByZXR1cm4gMDtcbiAgICB9XG5cbiAgICBjb25zdCByZXQgPSBhd2FpdCBzcGF3bkFzeW5jKG5vcm1hbGl6ZWRTY3JpcHQucnVubmFibGUsIHVuZGVmaW5lZCwge1xuICAgICAgY3dkOiBwcm9qZWN0LmRpclBhdGgsXG4gICAgICBlbnY6IGNvbmZpZ3VyZUVudihwcm9qZWN0LmVudiwgeyAuLi5vcHRzLCBwcmVzZXJ2ZUNvbG9yOiBvcHRzLnByZXNlcnZlQ29sb3IgPz8gdHJ1ZSB9KSxcbiAgICAgIHNoZWxsOiB0cnVlLFxuICAgICAgc3RkaW86ICdwaXBlJyxcbiAgICAgIHRpbWVvdXQ6IG9wdHMudGltZW91dCxcbiAgICAgIG1lcmdlT3V0QW5kRXJyb3I6IHRydWUsXG4gICAgICBraWxsT25FeGl0OiB0cnVlLFxuICAgICAgcHJpbnRpbmdTdGRvdXQ6IG9wdHMucHJpbnRSYXdPdXRwdXQsXG4gICAgICBwcmludGluZ1N0ZGVycjogb3B0cy5wcmludFJhd091dHB1dCxcbiAgICAgIHZlcmJvc2U6IGFyZ3YudmVyYm9zZSxcbiAgICB9KTtcbiAgICBvcHRzLm9uU2lnbmFsPy4ocmV0LnNpZ25hbCk7XG4gICAgcHJpbnRTdGFydChub3JtYWxpemVkU2NyaXB0LnByaW50YWJsZSwgcHJvamVjdCwgJ1N0YXJ0ZWQgKGxvZyknKTtcbiAgICBpZiAoYXJndi52ZXJib3NlKSB7XG4gICAgICBwcmludFN0YXJ0KG5vcm1hbGl6ZWRTY3JpcHQucnVubmFibGUsIHByb2plY3QsICdTdGFydGVkIChyYXcpJywgdHJ1ZSk7XG4gICAgfVxuICAgIGNvbnN0IG91dCA9IHJldC5zdGRvdXQudHJpbSgpO1xuICAgIGlmIChvdXQgJiYgIW9wdHMucHJpbnRSYXdPdXRwdXQpIHtcbiAgICAgIHByb2Nlc3Muc3Rkb3V0LndyaXRlKG91dCk7XG4gICAgICBwcm9jZXNzLnN0ZG91dC53cml0ZSgnXFxuJyk7XG4gICAgfVxuICAgIHByaW50RmluaXNoZWRBbmRFeGl0SWZOZWVkZWQobm9ybWFsaXplZFNjcmlwdC5wcmludGFibGUsIHJldC5zdGF0dXMsIG9wdHMpO1xuICAgIHJldHVybiByZXQuc3RhdHVzID8/IDE7XG4gIH0pO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcnVuV2l0aFNwYXduSW5QYXJhbGxlbEJ1ZmZlcmVkKFxuICBzY3JpcHQ6IHN0cmluZyxcbiAgcHJvamVjdDogUHJvamVjdCxcbiAgYXJndjogUGFydGlhbDxBcmd1bWVudHNDYW1lbENhc2U8SW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2Ygc2hhcmVkT3B0aW9uc0J1aWxkZXI+Pj4sXG4gIG9wdHM6IE9wdGlvbnMgPSBkZWZhdWx0T3B0aW9uc1xuKTogUHJvbWlzZTxCdWZmZXJlZFJ1blJlc3VsdD4ge1xuICByZXR1cm4gcHJvbWlzZVBvb2wucnVuQW5kV2FpdEZvclJldHVyblZhbHVlKGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBub3JtYWxpemVkU2NyaXB0ID0gbm9ybWFsaXplU2NyaXB0KHNjcmlwdCwgcHJvamVjdCk7XG4gICAgaWYgKGFyZ3YuZHJ5UnVuKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBleGl0Q29kZTogMCxcbiAgICAgICAgb3V0cHV0OiAnJyxcbiAgICAgIH07XG4gICAgfVxuXG4gICAgY29uc3QgcmV0ID0gYXdhaXQgc3Bhd25Bc3luYyhub3JtYWxpemVkU2NyaXB0LnJ1bm5hYmxlLCB1bmRlZmluZWQsIHtcbiAgICAgIGN3ZDogcHJvamVjdC5kaXJQYXRoLFxuICAgICAgZW52OiBjb25maWd1cmVFbnYocHJvamVjdC5lbnYsIHsgLi4ub3B0cywgcHJlc2VydmVDb2xvcjogb3B0cy5wcmVzZXJ2ZUNvbG9yID8/IHRydWUgfSksXG4gICAgICBzaGVsbDogdHJ1ZSxcbiAgICAgIHN0ZGlvOiAncGlwZScsXG4gICAgICB0aW1lb3V0OiBvcHRzLnRpbWVvdXQsXG4gICAgICBtZXJnZU91dEFuZEVycm9yOiB0cnVlLFxuICAgICAga2lsbE9uRXhpdDogdHJ1ZSxcbiAgICAgIHByaW50aW5nU3Rkb3V0OiBvcHRzLnByaW50UmF3T3V0cHV0LFxuICAgICAgcHJpbnRpbmdTdGRlcnI6IG9wdHMucHJpbnRSYXdPdXRwdXQsXG4gICAgICB2ZXJib3NlOiBhcmd2LnZlcmJvc2UsXG4gICAgfSk7XG4gICAgb3B0cy5vblNpZ25hbD8uKHJldC5zaWduYWwpO1xuICAgIHJldHVybiB7XG4gICAgICBleGl0Q29kZTogcmV0LnN0YXR1cyA/PyAxLFxuICAgICAgb3V0cHV0OiByZXQuc3Rkb3V0LFxuICAgIH07XG4gIH0pO1xufVxuXG4vKipcbiAqIFJlcGxhY2UgY2FwaXRhbGl6ZWQgY29tbWFuZHMgKGUuZy4sIFlBUk4sIFBSSVNNQSwgQlVOKSB3aXRoIHN1aXRhYmxlIGNvbW1hbmRzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gbm9ybWFsaXplU2NyaXB0KHNjcmlwdDogc3RyaW5nLCBwcm9qZWN0OiBQcm9qZWN0KTogeyBwcmludGFibGU6IHN0cmluZzsgcnVubmFibGU6IHN0cmluZyB9IHtcbiAgLy8gTm8gYC0tYnVuYDogaXRzIG5vZGUtPmJ1biBQQVRIIHNoaW0gbGVha3MgaW50byBldmVyeSBjaGlsZCBwcm9jZXNzIGFuZCBicmVha3MgdG9vbHMgcmVxdWlyaW5nXG4gIC8vIHJlYWwgTm9kZS5qcyAoUGxheXdyaWdodCwgd3JhbmdsZXIsIHZpbmV4dCkuXG4gIGNvbnN0IHByb2plY3RQYWNrYWdlTWFuYWdlcldpdGhSdW4gPSBwcm9qZWN0LnVzZXNCdW5QYWNrYWdlTWFuYWdlciA/ICdidW4gcnVuJyA6ICd5YXJuJztcbiAgbGV0IG5ld1NjcmlwdCA9IHNjcmlwdFxuICAgIC5yZXBsYWNlQWxsKCdcXG4nLCAnJylcbiAgICAucmVwbGFjZUFsbCgvXFxzXFxzKy9nLCAnICcpXG4gICAgLnJlcGxhY2VBbGwoXG4gICAgICAvUFJJU01BIGdlbmVyYXRlKD8hXFxzKy0tbm8taGludHMpKD89XFxzfCQpL2d1LFxuICAgICAgcHJvamVjdC5wYWNrYWdlSnNvbi5kZXBlbmRlbmNpZXM/LmJsaXR6ID8gJ1BSSVNNQSBnZW5lcmF0ZScgOiAnUFJJU01BIGdlbmVyYXRlIC0tbm8taGludHMnXG4gICAgKVxuICAgIC5yZXBsYWNlQWxsKCdQUklTTUEgJywgcHJvamVjdC5wYWNrYWdlSnNvbi5kZXBlbmRlbmNpZXM/LmJsaXR6ID8gJ1lBUk4gYmxpdHogcHJpc21hICcgOiAnWUFSTiBwcmlzbWEgJylcbiAgICAucmVwbGFjZUFsbCgnQlVOIHJ1biAnLCBwcm9qZWN0LnVzZXNCdW5QYWNrYWdlTWFuYWdlciA/IGAke3Byb2plY3RQYWNrYWdlTWFuYWdlcldpdGhSdW59IGAgOiAnWUFSTiBydW4gJylcbiAgICAucmVwbGFjZUFsbCgnQlVOICcsIHByb2plY3QudXNlc0J1blBhY2thZ2VNYW5hZ2VyID8gYCR7cHJvamVjdFBhY2thZ2VNYW5hZ2VyV2l0aFJ1bn0gYCA6ICdZQVJOICcpXG4gICAgLy8gQXZvaWQgcmVwbGFjaW5nIGBZQVJOIHJ1bmAgd2l0aCBgcnVuYCBieSByZXBsYWNpbmcgYFlBUk5gIHdpdGggYCh5YXJufGJ1bikgcnVuYC5cbiAgICAucmVwbGFjZUFsbCgnWUFSTiBydW4gJywgcHJvamVjdC51c2VzQnVuUGFja2FnZU1hbmFnZXIgPyBgJHtwcm9qZWN0UGFja2FnZU1hbmFnZXJXaXRoUnVufSBgIDogJ3lhcm4gcnVuICcpO1xuICBpZiAocHJvamVjdC51c2VzQnVuUGFja2FnZU1hbmFnZXIpIHtcbiAgICBuZXdTY3JpcHQgPSBuZXdTY3JpcHRcbiAgICAgIC5yZXBsYWNlQWxsKCdZQVJOIGJ1aWxkLXRzIHJ1bicsICdidW4gcnVuJylcbiAgICAgIC5yZXBsYWNlQWxsKCdidW4gcnVuIGJ1biBydW4nLCAnYnVuIHJ1bicpXG4gICAgICAvLyBCZWNhdXNlIGJ1biBjYW4gcnVuIHNyYy9pbmRleC50cyBkaXJlY3RseS5cbiAgICAgIC5yZXBsYWNlQWxsKCdkaXN0L2luZGV4LmpzJywgJ3NyYy9pbmRleC50cycpO1xuICB9XG4gIG5ld1NjcmlwdCA9IG5ld1NjcmlwdC50cmltKCk7XG4gIGNvbnN0IHByaW50YWJsZVNjcmlwdCA9IG5ld1NjcmlwdC5yZXBsYWNlQWxsKCdZQVJOICcsIGAke3Byb2plY3RQYWNrYWdlTWFuYWdlcldpdGhSdW59IGApO1xuICBjb25zdCBydW5uYWJsZVNjcmlwdCA9IG5ld1NjcmlwdFxuICAgIC8vIEtlZXAgUGxheXdyaWdodCBhcyBhIHBhY2thZ2UtbWFuYWdlciBjb21tYW5kIGluc3RlYWQgb2YgcmVzb2x2aW5nIGl0IHRocm91Z2ggbm9kZV9tb2R1bGVzLy5iaW4uXG4gICAgLnJlcGxhY2VBbGwoJ1lBUk4gcGxheXdyaWdodCAnLCBgJHtwcm9qZWN0UGFja2FnZU1hbmFnZXJXaXRoUnVufSBwbGF5d3JpZ2h0IGApXG4gICAgLnJlcGxhY2VBbGwoJ1lBUk4gJywgIXByb2plY3QudXNlc0J1blBhY2thZ2VNYW5hZ2VyICYmIHByb2plY3QuYmluRXhpc3RzID8gJycgOiBgJHtwcm9qZWN0UGFja2FnZU1hbmFnZXJXaXRoUnVufSBgKTtcbiAgcmV0dXJuIHtcbiAgICBwcmludGFibGU6IGAke3Byb2plY3RQYWNrYWdlTWFuYWdlcldpdGhSdW59IGRvdGVudiAtLSAke3ByaW50YWJsZVNjcmlwdH1gLFxuICAgIHJ1bm5hYmxlOiBydW5uYWJsZVNjcmlwdCxcbiAgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHByaW50U3RhcnQobm9ybWFsaXplZFNjcmlwdDogc3RyaW5nLCBwcm9qZWN0OiBQcm9qZWN0LCBwcmVmaXggPSAnU3RhcnQnLCB3ZWFrID0gZmFsc2UpOiB2b2lkIHtcbiAgY29uc29sZS5pbmZvKFxuICAgICdcXG4nICtcbiAgICAgICh3ZWFrID8gY2hhbGsuZ3JheSA6IGNoYWxrLmN5YW4pKGNoYWxrLmJvbGQoYCR7cHJlZml4fTpgKSwgbm9ybWFsaXplZFNjcmlwdCkgK1xuICAgICAgY2hhbGsuZ3JheShgIGF0ICR7cHJvamVjdC5kaXJQYXRofWApXG4gICk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBwcmludEZpbmlzaGVkQW5kRXhpdElmTmVlZGVkKFxuICBzY3JpcHQ6IHN0cmluZyxcbiAgZXhpdENvZGU6IG51bWJlciB8IG51bGwsXG4gIG9wdHM6IE9taXQ8T3B0aW9ucywgJ3RpbWVvdXQnPixcbiAgcHJpbnRPcHRpb25zOiB7IHNpbGVudFN1Y2Nlc3M/OiBib29sZWFuIH0gPSB7fVxuKTogdm9pZCB7XG4gIGlmIChleGl0Q29kZSA9PT0gMCkge1xuICAgIGlmIChwcmludE9wdGlvbnMuc2lsZW50U3VjY2VzcykgcmV0dXJuO1xuICAgIGNvbnNvbGUuaW5mbyhjaGFsay5ncmVlbihjaGFsay5ib2xkKCdGaW5pc2hlZDonKSwgc2NyaXB0KSk7XG4gIH0gZWxzZSB7XG4gICAgY29uc29sZS5pbmZvKGNoYWxrLnJlZChjaGFsay5ib2xkKGBGYWlsZWQgKGV4aXQgY29kZSAke2V4aXRDb2RlfSk6IGApLCBzY3JpcHQpKTtcbiAgICBpZiAob3B0cy5leGl0SWZGYWlsZWQgIT09IGZhbHNlKSB7XG4gICAgICBwcm9jZXNzLmV4aXQoZXhpdENvZGUgPz8gMSk7XG4gICAgfVxuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjb25maWd1cmVFbnYoXG4gIGVudjogUmVjb3JkPHN0cmluZywgc3RyaW5nIHwgdW5kZWZpbmVkPixcbiAgb3B0czogT3B0aW9uc1xuKTogUmVjb3JkPHN0cmluZywgc3RyaW5nIHwgdW5kZWZpbmVkPiB7XG4gIGNvbnN0IG5ld0VudiA9IHsgLi4uZW52IH07XG4gIGlmIChvcHRzLmNpKSB7XG4gICAgbmV3RW52LkNJID0gJzEnO1xuICB9XG4gIGNvbmZpZ3VyZUNvbG9yRW52KG5ld0Vudiwgb3B0cy5wcmVzZXJ2ZUNvbG9yKTtcbiAgcmV0dXJuIG5ld0Vudjtcbn1cblxuLyoqXG4gKiBDb25maWd1cmVzIGNoaWxkLXByb2Nlc3MgY29sb3IgZW52aXJvbm1lbnQgdmFyaWFibGVzIGZvciB3Yi1tYW5hZ2VkIG91dHB1dC5cbiAqXG4gKiBAcGFyYW0gZW52IFRoZSBjaGlsZC1wcm9jZXNzIGVudmlyb25tZW50IHRvIG11dGF0ZS5cbiAqIEBwYXJhbSBwcmVzZXJ2ZUNvbG9yIFdoZXRoZXIgd2Igc2hvdWxkIHByZXNlcnZlIGNvbG9ycyBmb3Igb3V0cHV0IHRoYXQgaXQgY2FwdHVyZXMgYW5kIHJlcHJpbnRzIHRvIGFuIGludGVyYWN0aXZlIFRUWS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNvbmZpZ3VyZUNvbG9yRW52KGVudjogUmVjb3JkPHN0cmluZywgc3RyaW5nIHwgdW5kZWZpbmVkPiwgcHJlc2VydmVDb2xvcj86IGJvb2xlYW4pOiB2b2lkIHtcbiAgaWYgKGVudi5OT19DT0xPUiAhPT0gdW5kZWZpbmVkIHx8IHByZXNlcnZlQ29sb3IgPT09IGZhbHNlKSB7XG4gICAgLy8gTk9fQ09MT1IgYW5kIHByZXNlcnZlQ29sb3I9ZmFsc2UgYXJlIGV4cGxpY2l0IG5vLWNvbG9yIGNob2ljZXMsIHNvIGluaGVyaXRlZCBGT1JDRV9DT0xPUiBtdXN0IG5vdCBsZWFrIHRocm91Z2guXG4gICAgZGVsZXRlIGVudi5GT1JDRV9DT0xPUjtcbiAgfSBlbHNlIGlmIChwcmVzZXJ2ZUNvbG9yICYmIHByb2Nlc3Muc3Rkb3V0LmlzVFRZKSB7XG4gICAgZW52LkZPUkNFX0NPTE9SIHx8PSAnMyc7XG4gIH1cbn1cbiIsImltcG9ydCB7IHlhcmdzT3B0aW9uc0J1aWxkZXJGb3JFbnYgfSBmcm9tICdAd2lsbGJvb3N0ZXIvc2hhcmVkLWxpYi1ub2RlL3NyYyc7XG5pbXBvcnQgdHlwZSB7IEVudlJlYWRlck9wdGlvbnMgfSBmcm9tICdAd2lsbGJvb3N0ZXIvc2hhcmVkLWxpYi1ub2RlL3NyYyc7XG5cbmV4cG9ydCBjb25zdCBzaGFyZWRPcHRpb25zQnVpbGRlciA9IHtcbiAgLi4ueWFyZ3NPcHRpb25zQnVpbGRlckZvckVudixcbiAgLy8gVGhpcyBvcHRpb24gaXMgZm9yIGRlYnVnZ2luZyBtYWlubHkuXG4gICd3b3JraW5nLWRpcic6IHtcbiAgICBkZXNjcmlwdGlvbjogJ0Egd29ya2luZyBkaXJlY3RvcnknLFxuICAgIHR5cGU6ICdzdHJpbmcnLFxuICAgIGFsaWFzOiAndycsXG4gIH0sXG4gICdkcnktcnVuJzoge1xuICAgIGRlc2NyaXB0aW9uOiAnV2hldGhlciB0byBza2lwIGFjdHVhbCBjb21tYW5kIGV4ZWN1dGlvbicsXG4gICAgdHlwZTogJ2Jvb2xlYW4nLFxuICAgIGFsaWFzOiBbJ2RyeScsICdkJ10sXG4gIH0sXG59IGFzIGNvbnN0O1xuXG5leHBvcnQgZnVuY3Rpb24gYnVpbGRFbnZSZWFkZXJPcHRpb25BcmdzKGFyZ3Y6IEVudlJlYWRlck9wdGlvbnMpOiBzdHJpbmdbXSB7XG4gIGNvbnN0IGFyZ3M6IHN0cmluZ1tdID0gW107XG4gIGZvciAoY29uc3Qgb3B0aW9uTmFtZSBvZiBPYmplY3Qua2V5cyh5YXJnc09wdGlvbnNCdWlsZGVyRm9yRW52KSkge1xuICAgIGNvbnN0IHZhbHVlID0gZ2V0T3B0aW9uVmFsdWUoYXJndiwgb3B0aW9uTmFtZSk7XG4gICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQpIGNvbnRpbnVlO1xuXG4gICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ2Jvb2xlYW4nKSB7XG4gICAgICBhcmdzLnB1c2godmFsdWUgPyBgLS0ke29wdGlvbk5hbWV9YCA6IGAtLSR7b3B0aW9uTmFtZX09ZmFsc2VgKTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJyB8fCB0eXBlb2YgdmFsdWUgPT09ICdudW1iZXInKSB7XG4gICAgICBhcmdzLnB1c2goYC0tJHtvcHRpb25OYW1lfT0ke3ZhbHVlfWApO1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgICAgZm9yIChjb25zdCBpdGVtIG9mIHZhbHVlKSB7XG4gICAgICAgIGFyZ3MucHVzaChgLS0ke29wdGlvbk5hbWV9PSR7aXRlbX1gKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgaWYgKFxuICAgIChhcmd2IGFzIEVudlJlYWRlck9wdGlvbnMgJiB7IHNpbGVudD86IGJvb2xlYW4gfSkuc2lsZW50ID09PSB0cnVlICYmXG4gICAgZ2V0T3B0aW9uVmFsdWUoYXJndiwgJ3F1aWV0LWVudicpID09PSB1bmRlZmluZWRcbiAgKSB7XG4gICAgYXJncy5wdXNoKCctLXF1aWV0LWVudicpO1xuICB9XG4gIHJldHVybiBhcmdzO1xufVxuXG5mdW5jdGlvbiBnZXRPcHRpb25WYWx1ZShhcmd2OiBFbnZSZWFkZXJPcHRpb25zLCBvcHRpb25OYW1lOiBzdHJpbmcpOiB1bmtub3duIHtcbiAgY29uc3QgY2FtZWxDYXNlT3B0aW9uTmFtZSA9IG9wdGlvbk5hbWUucmVwbGFjZUFsbCgvLShbYS16XSkvZywgKF8sIGNoYXJhY3Rlcjogc3RyaW5nKSA9PiBjaGFyYWN0ZXIudG9VcHBlckNhc2UoKSk7XG4gIGNvbnN0IG9wdGlvbnMgPSBhcmd2IGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICByZXR1cm4gb3B0aW9uc1tvcHRpb25OYW1lXSA/PyBvcHRpb25zW2NhbWVsQ2FzZU9wdGlvbk5hbWVdO1xufVxuIiwiaW1wb3J0IGNoaWxkX3Byb2Nlc3MgZnJvbSAnbm9kZTpjaGlsZF9wcm9jZXNzJztcbmltcG9ydCB7IGNvbnN0YW50cyB9IGZyb20gJ25vZGU6b3MnO1xuXG5pbXBvcnQgeyB0cmVlS2lsbCB9IGZyb20gJ0B3aWxsYm9vc3Rlci9zaGFyZWQtbGliLW5vZGUvc3JjJztcbmltcG9ydCBjaGFsayBmcm9tICdjaGFsayc7XG5pbXBvcnQgdHlwZSB7IENvbW1hbmRNb2R1bGUsIEluZmVycmVkT3B0aW9uVHlwZXMgfSBmcm9tICd5YXJncyc7XG5cbmltcG9ydCB7IGZpbmRTZWxmUHJvamVjdCwgdHlwZSBQcm9qZWN0IH0gZnJvbSAnLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQgeyBjb25maWd1cmVFbnYsIG5vcm1hbGl6ZVNjcmlwdCB9IGZyb20gJy4uL3NjcmlwdHMvcnVuLmpzJztcbmltcG9ydCB7IHNoYXJlZE9wdGlvbnNCdWlsZGVyIH0gZnJvbSAnLi4vc2hhcmVkT3B0aW9uc0J1aWxkZXIuanMnO1xuXG5jb25zdCBGT1JDRV9LSUxMX0RFTEFZX01TID0gNTAwMDtcblxuY29uc3QgYnVpbGRlciA9IHtcbiAgJ2tpbGwtb3RoZXJzJzoge1xuICAgIGRlc2NyaXB0aW9uOiAnS2lsbCBvdGhlciBjb21tYW5kcyB3aGVuIG9uZSBjb21tYW5kIGV4aXRzJyxcbiAgICB0eXBlOiAnYm9vbGVhbicsXG4gIH0sXG4gICdraWxsLW90aGVycy1vbi1mYWlsJzoge1xuICAgIGRlc2NyaXB0aW9uOiAnS2lsbCBvdGhlciBjb21tYW5kcyB3aGVuIG9uZSBjb21tYW5kIGZhaWxzJyxcbiAgICB0eXBlOiAnYm9vbGVhbicsXG4gIH0sXG4gIHN1Y2Nlc3M6IHtcbiAgICBkZXNjcmlwdGlvbjogJ0RlZmluZSBzdWNjZXNzZnVsIGNvbXBsZXRpb24gY3JpdGVyaWEnLFxuICAgIHR5cGU6ICdzdHJpbmcnLFxuICAgIGNob2ljZXM6IFsnYWxsJywgJ2ZpcnN0J10sXG4gICAgZGVmYXVsdDogJ2FsbCcsXG4gIH0sXG59IGFzIGNvbnN0O1xuXG5jb25zdCBhcmd1bWVudHNCdWlsZGVyID0ge1xuICBjb21tYW5kczoge1xuICAgIGRlc2NyaXB0aW9uOiAnQ29tbWFuZHMgdG8gcnVuIGNvbmN1cnJlbnRseScsXG4gICAgdHlwZTogJ2FycmF5JyxcbiAgfSxcbn0gYXMgY29uc3Q7XG5cbmludGVyZmFjZSBSdW5Db25jdXJyZW50bHlPcHRpb25zIHtcbiAgY29tbWFuZHM6IHN0cmluZ1tdO1xuICBwcm9qZWN0OiBQcm9qZWN0O1xuICBraWxsT3RoZXJzOiBib29sZWFuO1xuICBraWxsT3RoZXJzT25GYWlsOiBib29sZWFuO1xuICBzdWNjZXNzOiAnYWxsJyB8ICdmaXJzdCc7XG4gIGNpPzogYm9vbGVhbjtcbn1cblxuZXhwb3J0IGNvbnN0IGNvbmN1cnJlbnRseUNvbW1hbmQ6IENvbW1hbmRNb2R1bGU8XG4gIHVua25vd24sXG4gIEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIGJ1aWxkZXIgJiB0eXBlb2YgYXJndW1lbnRzQnVpbGRlciAmIHR5cGVvZiBzaGFyZWRPcHRpb25zQnVpbGRlcj5cbj4gPSB7XG4gIGNvbW1hbmQ6ICdjb25jdXJyZW50bHkgPGNvbW1hbmRzLi4uPicsXG4gIGRlc2NyaWJlOiAnUnVuIGNvbW1hbmRzIGNvbmN1cnJlbnRseScsXG4gIGJ1aWxkZXI6IHsgLi4uc2hhcmVkT3B0aW9uc0J1aWxkZXIsIC4uLmJ1aWxkZXIsIC4uLmFyZ3VtZW50c0J1aWxkZXIgfSxcbiAgYXN5bmMgaGFuZGxlcihhcmd2KSB7XG4gICAgaWYgKHByb2Nlc3MucGxhdGZvcm0gPT09ICd3aW4zMicpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoY2hhbGsucmVkKCdUaGlzIGNvbW1hbmQgaXMgbm90IHN1cHBvcnRlZCBvbiBXaW5kb3dzLicpKTtcbiAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICB9XG5cbiAgICBjb25zdCBwcm9qZWN0ID0gZmluZFNlbGZQcm9qZWN0KGFyZ3YpO1xuICAgIGlmICghcHJvamVjdCkge1xuICAgICAgY29uc29sZS5lcnJvcihjaGFsay5yZWQoJ05vIHByb2plY3QgZm91bmQuJykpO1xuICAgICAgcHJvY2Vzcy5leGl0KDEpO1xuICAgIH1cblxuICAgIGNvbnN0IGNvbW1hbmRzID0gKGFyZ3YuY29tbWFuZHMgPz8gW10pLm1hcChTdHJpbmcpLmZpbHRlcihCb29sZWFuKTtcbiAgICBpZiAoY29tbWFuZHMubGVuZ3RoID09PSAwKSB7XG4gICAgICBjb25zb2xlLmVycm9yKGNoYWxrLnJlZCgnTm8gY29tbWFuZHMgcHJvdmlkZWQuJykpO1xuICAgICAgcHJvY2Vzcy5leGl0KDEpO1xuICAgIH1cblxuICAgIHRyeSB7XG4gICAgICBjb25zdCBleGl0Q29kZSA9IGF3YWl0IHJ1bkNvbmN1cnJlbnRseSh7XG4gICAgICAgIGNvbW1hbmRzLFxuICAgICAgICBwcm9qZWN0LFxuICAgICAgICBraWxsT3RoZXJzOiBhcmd2LmtpbGxPdGhlcnMgPz8gZmFsc2UsXG4gICAgICAgIGtpbGxPdGhlcnNPbkZhaWw6IGFyZ3Yua2lsbE90aGVyc09uRmFpbCA/PyBmYWxzZSxcbiAgICAgICAgc3VjY2VzczogYXJndi5zdWNjZXNzLFxuICAgICAgICBjaTogdHlwZW9mIGFyZ3YuY2kgPT09ICdib29sZWFuJyA/IGFyZ3YuY2kgOiB1bmRlZmluZWQsXG4gICAgICB9KTtcbiAgICAgIHByb2Nlc3MuZXhpdChleGl0Q29kZSk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoY2hhbGsucmVkKGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogU3RyaW5nKGVycm9yKSkpO1xuICAgICAgcHJvY2Vzcy5leGl0KDEpO1xuICAgIH1cbiAgfSxcbn07XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBydW5Db25jdXJyZW50bHkob3B0aW9uczogUnVuQ29uY3VycmVudGx5T3B0aW9ucyk6IFByb21pc2U8bnVtYmVyPiB7XG4gIGNvbnN0IGNoaWxkcmVuID0gb3B0aW9ucy5jb21tYW5kcy5tYXAoKGNvbW1hbmQpID0+XG4gICAgY2hpbGRfcHJvY2Vzcy5zcGF3bihub3JtYWxpemVTY3JpcHQoY29tbWFuZCwgb3B0aW9ucy5wcm9qZWN0KS5ydW5uYWJsZSwge1xuICAgICAgY3dkOiBvcHRpb25zLnByb2plY3QuZGlyUGF0aCxcbiAgICAgIGRldGFjaGVkOiB0cnVlLFxuICAgICAgZW52OiBjb25maWd1cmVFbnYob3B0aW9ucy5wcm9qZWN0LmVudiwgeyBjaTogb3B0aW9ucy5jaSB9KSxcbiAgICAgIHNoZWxsOiB0cnVlLFxuICAgICAgc3RkaW86ICdpbmhlcml0JyxcbiAgICB9KVxuICApO1xuXG4gIGxldCBzdG9wcGluZyA9IGZhbHNlO1xuICBsZXQgaW50ZXJydXB0ZWRTaWduYWw6IE5vZGVKUy5TaWduYWxzIHwgdW5kZWZpbmVkO1xuICBsZXQgZmlyc3RSZXN1bHQ6IG51bWJlciB8IHVuZGVmaW5lZDtcbiAgbGV0IHN0b3BSZXN1bHQ6IG51bWJlciB8IHVuZGVmaW5lZDtcbiAgY29uc3QgZm9yY2VLaWxsUHJvbWlzZXM6IFByb21pc2U8dm9pZD5bXSA9IFtdO1xuICBjb25zdCByZXN1bHRzID0gQXJyYXkuZnJvbTxudW1iZXIgfCB1bmRlZmluZWQ+KHsgbGVuZ3RoOiBjaGlsZHJlbi5sZW5ndGggfSk7XG4gIGNvbnN0IHdhaXRGb3JFeGl0UHJvbWlzZXMgPSBjaGlsZHJlbi5tYXAoKGNoaWxkLCBpbmRleCkgPT4ge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZTx2b2lkPigocmVzb2x2ZSkgPT4ge1xuICAgICAgbGV0IHNldHRsZWQgPSBmYWxzZTtcbiAgICAgIGNvbnN0IHNldHRsZSA9IChleGl0Q29kZTogbnVtYmVyKTogdm9pZCA9PiB7XG4gICAgICAgIGlmIChzZXR0bGVkKSByZXR1cm47XG5cbiAgICAgICAgc2V0dGxlZCA9IHRydWU7XG4gICAgICAgIHJlc3VsdHNbaW5kZXhdID0gZXhpdENvZGU7XG4gICAgICAgIGZpcnN0UmVzdWx0ID8/PSBleGl0Q29kZTtcblxuICAgICAgICBpZiAoIXN0b3BwaW5nICYmIHNob3VsZFN0b3BPdGhlcnMoZXhpdENvZGUsIG9wdGlvbnMpKSB7XG4gICAgICAgICAgc3RvcFJlc3VsdCA9IGV4aXRDb2RlO1xuICAgICAgICAgIHN0b3BwaW5nID0gdHJ1ZTtcbiAgICAgICAgICBmb3JjZUtpbGxQcm9taXNlcy5wdXNoKHRlcm1pbmF0ZUNoaWxkcmVuKGNoaWxkcmVuLCAnU0lHVEVSTScpKTtcbiAgICAgICAgfVxuICAgICAgICByZXNvbHZlKCk7XG4gICAgICB9O1xuXG4gICAgICBjaGlsZC5vbmNlKCdlcnJvcicsIChlcnJvcikgPT4ge1xuICAgICAgICBjb25zb2xlLmVycm9yKCdGYWlsZWQgdG8gc3RhcnQgY2hpbGQgcHJvY2VzczonLCBlcnJvcik7XG4gICAgICAgIHNldHRsZSgxKTtcbiAgICAgIH0pO1xuICAgICAgY2hpbGQub25jZSgnZXhpdCcsIChjb2RlLCBzaWduYWwpID0+IHtcbiAgICAgICAgc2V0dGxlKGdldEV4aXRDb2RlKGNvZGUgPz8gdW5kZWZpbmVkLCBzaWduYWwgPz8gdW5kZWZpbmVkKSk7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgY29uc3Qgc3RvcEFsbCA9IChzaWduYWw6IE5vZGVKUy5TaWduYWxzKTogdm9pZCA9PiB7XG4gICAgaW50ZXJydXB0ZWRTaWduYWwgPz89IHNpZ25hbDtcbiAgICBpZiAoc3RvcHBpbmcpIHJldHVybjtcblxuICAgIHN0b3BwaW5nID0gdHJ1ZTtcbiAgICBmb3JjZUtpbGxQcm9taXNlcy5wdXNoKHRlcm1pbmF0ZUNoaWxkcmVuKGNoaWxkcmVuLCBzaWduYWwpKTtcbiAgfTtcbiAgY29uc3Qgc3RvcE9uU2lnaW50ID0gKCk6IHZvaWQgPT4ge1xuICAgIHN0b3BBbGwoJ1NJR0lOVCcpO1xuICB9O1xuICBjb25zdCBzdG9wT25TaWd0ZXJtID0gKCk6IHZvaWQgPT4ge1xuICAgIHN0b3BBbGwoJ1NJR1RFUk0nKTtcbiAgfTtcbiAgY29uc3Qgc3RvcE9uU2lncXVpdCA9ICgpOiB2b2lkID0+IHtcbiAgICBzdG9wQWxsKCdTSUdRVUlUJyk7XG4gIH07XG4gIHByb2Nlc3Mub24oJ1NJR0lOVCcsIHN0b3BPblNpZ2ludCk7XG4gIHByb2Nlc3Mub24oJ1NJR1RFUk0nLCBzdG9wT25TaWd0ZXJtKTtcbiAgcHJvY2Vzcy5vbignU0lHUVVJVCcsIHN0b3BPblNpZ3F1aXQpO1xuICB0cnkge1xuICAgIGF3YWl0IFByb21pc2UuYWxsKHdhaXRGb3JFeGl0UHJvbWlzZXMpO1xuICAgIGF3YWl0IFByb21pc2UuYWxsKGZvcmNlS2lsbFByb21pc2VzKTtcbiAgfSBmaW5hbGx5IHtcbiAgICBwcm9jZXNzLnJlbW92ZUxpc3RlbmVyKCdTSUdJTlQnLCBzdG9wT25TaWdpbnQpO1xuICAgIHByb2Nlc3MucmVtb3ZlTGlzdGVuZXIoJ1NJR1RFUk0nLCBzdG9wT25TaWd0ZXJtKTtcbiAgICBwcm9jZXNzLnJlbW92ZUxpc3RlbmVyKCdTSUdRVUlUJywgc3RvcE9uU2lncXVpdCk7XG4gIH1cblxuICBpZiAoaW50ZXJydXB0ZWRTaWduYWwpIHtcbiAgICByZXR1cm4gZ2V0RXhpdENvZGUodW5kZWZpbmVkLCBpbnRlcnJ1cHRlZFNpZ25hbCk7XG4gIH1cblxuICBpZiAob3B0aW9ucy5zdWNjZXNzID09PSAnZmlyc3QnKSB7XG4gICAgcmV0dXJuIGZpcnN0UmVzdWx0ID8/IDE7XG4gIH1cbiAgaWYgKHN0b3BSZXN1bHQgIT09IHVuZGVmaW5lZCkge1xuICAgIHJldHVybiBzdG9wUmVzdWx0O1xuICB9XG4gIGZvciAoY29uc3QgcmVzdWx0IG9mIHJlc3VsdHMpIHtcbiAgICBpZiAocmVzdWx0ICE9PSB1bmRlZmluZWQgJiYgcmVzdWx0ICE9PSAwKSB7XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgfVxuICByZXR1cm4gMDtcbn1cblxuZnVuY3Rpb24gZ2V0RXhpdENvZGUoY29kZTogbnVtYmVyIHwgdW5kZWZpbmVkLCBzaWduYWw6IE5vZGVKUy5TaWduYWxzIHwgdW5kZWZpbmVkKTogbnVtYmVyIHtcbiAgaWYgKGNvZGUgIT09IHVuZGVmaW5lZCkge1xuICAgIHJldHVybiBjb2RlO1xuICB9XG4gIGlmIChzaWduYWwgJiYgc2lnbmFsIGluIGNvbnN0YW50cy5zaWduYWxzKSB7XG4gICAgcmV0dXJuIDEyOCArIGNvbnN0YW50cy5zaWduYWxzW3NpZ25hbF07XG4gIH1cbiAgcmV0dXJuIDE7XG59XG5cbmZ1bmN0aW9uIHNob3VsZFN0b3BPdGhlcnMoXG4gIGV4aXRDb2RlOiBudW1iZXIsXG4gIG9wdGlvbnM6IFBpY2s8UnVuQ29uY3VycmVudGx5T3B0aW9ucywgJ2tpbGxPdGhlcnMnIHwgJ2tpbGxPdGhlcnNPbkZhaWwnIHwgJ3N1Y2Nlc3MnPlxuKTogYm9vbGVhbiB7XG4gIHJldHVybiBvcHRpb25zLnN1Y2Nlc3MgPT09ICdmaXJzdCcgfHwgb3B0aW9ucy5raWxsT3RoZXJzIHx8IChvcHRpb25zLmtpbGxPdGhlcnNPbkZhaWwgJiYgZXhpdENvZGUgIT09IDApO1xufVxuXG5hc3luYyBmdW5jdGlvbiB0ZXJtaW5hdGVDaGlsZHJlbihjaGlsZHJlbjogY2hpbGRfcHJvY2Vzcy5DaGlsZFByb2Nlc3NbXSwgc2lnbmFsOiBOb2RlSlMuU2lnbmFscyk6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBmb3JjZUtpbGxQaWRzID0gc2lnbmFsUGlkcyh0b0NoaWxkUGlkcyhjaGlsZHJlbiksIHNpZ25hbCk7XG4gIGlmIChmb3JjZUtpbGxQaWRzLmxlbmd0aCA9PT0gMCkgcmV0dXJuO1xuXG4gIGlmIChhd2FpdCB3YWl0Rm9yRm9yY2VLaWxsKGZvcmNlS2lsbFBpZHMpKSB7XG4gICAgc2lnbmFsUGlkcyhmb3JjZUtpbGxQaWRzLCAnU0lHS0lMTCcpO1xuICB9XG59XG5cbmZ1bmN0aW9uIHRvQ2hpbGRQaWRzKGNoaWxkcmVuOiBjaGlsZF9wcm9jZXNzLkNoaWxkUHJvY2Vzc1tdKTogbnVtYmVyW10ge1xuICByZXR1cm4gY2hpbGRyZW4uZmxhdE1hcCgoY2hpbGQpID0+IChjaGlsZC5waWQgPT09IHVuZGVmaW5lZCA/IFtdIDogW2NoaWxkLnBpZF0pKTtcbn1cblxuZnVuY3Rpb24gc2lnbmFsUGlkcyhwaWRzOiByZWFkb25seSBudW1iZXJbXSwgc2lnbmFsOiBOb2RlSlMuU2lnbmFscyk6IG51bWJlcltdIHtcbiAgY29uc3Qgc2lnbmFsZWRQaWRzOiBudW1iZXJbXSA9IFtdO1xuICBmb3IgKGNvbnN0IHBpZCBvZiBwaWRzKSB7XG4gICAgdHJ5IHtcbiAgICAgIGlmICgha2lsbFByb2Nlc3NHcm91cChwaWQsIHNpZ25hbCkpIGNvbnRpbnVlO1xuXG4gICAgICBzaWduYWxlZFBpZHMucHVzaChwaWQpO1xuICAgICAgdHJlZUtpbGwocGlkLCBzaWduYWwpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBjb25zb2xlLndhcm4oJ0ZhaWxlZCB0byBraWxsIGNoaWxkIHByb2Nlc3M6JywgZXJyb3IpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gc2lnbmFsZWRQaWRzO1xufVxuXG5hc3luYyBmdW5jdGlvbiB3YWl0Rm9yRm9yY2VLaWxsKHBpZHM6IHJlYWRvbmx5IG51bWJlcltdKTogUHJvbWlzZTxib29sZWFuPiB7XG4gIGNvbnN0IGRlYWRsaW5lID0gRGF0ZS5ub3coKSArIEZPUkNFX0tJTExfREVMQVlfTVM7XG4gIHdoaWxlIChEYXRlLm5vdygpIDwgZGVhZGxpbmUpIHtcbiAgICBpZiAocGlkcy5ldmVyeShpc1Byb2Nlc3NHcm91cEdvbmUpKSByZXR1cm4gZmFsc2U7XG5cbiAgICBhd2FpdCBzbGVlcChNYXRoLm1pbigxMDAsIGRlYWRsaW5lIC0gRGF0ZS5ub3coKSkpO1xuICB9XG4gIHJldHVybiB0cnVlO1xufVxuXG5mdW5jdGlvbiBpc1Byb2Nlc3NHcm91cEdvbmUocGlkOiBudW1iZXIpOiBib29sZWFuIHtcbiAgdHJ5IHtcbiAgICBwcm9jZXNzLmtpbGwoLXBpZCwgMCk7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGlmIChpc05vU3VjaFByb2Nlc3NFcnJvcihlcnJvcikpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn1cblxuYXN5bmMgZnVuY3Rpb24gc2xlZXAobXM6IG51bWJlcik6IFByb21pc2U8dm9pZD4ge1xuICBhd2FpdCBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4gc2V0VGltZW91dChyZXNvbHZlLCBtcykpO1xufVxuXG5mdW5jdGlvbiBraWxsUHJvY2Vzc0dyb3VwKHBpZDogbnVtYmVyLCBzaWduYWw6IE5vZGVKUy5TaWduYWxzKTogYm9vbGVhbiB7XG4gIHRyeSB7XG4gICAgcHJvY2Vzcy5raWxsKC1waWQsIHNpZ25hbCk7XG4gICAgcmV0dXJuIHRydWU7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgaWYgKGlzTm9TdWNoUHJvY2Vzc0Vycm9yKGVycm9yKSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICB0aHJvdyBlcnJvcjtcbiAgfVxufVxuXG5mdW5jdGlvbiBpc05vU3VjaFByb2Nlc3NFcnJvcihlcnJvcjogdW5rbm93bik6IGJvb2xlYW4ge1xuICByZXR1cm4gdHlwZW9mIGVycm9yID09PSAnb2JqZWN0JyAmJiBlcnJvciAhPT0gbnVsbCAmJiAnY29kZScgaW4gZXJyb3IgJiYgZXJyb3IuY29kZSA9PT0gJ0VTUkNIJztcbn1cbiIsImV4cG9ydCBmdW5jdGlvbiBidWlsZFNoZWxsQ29tbWFuZChhcmdzOiBzdHJpbmdbXSk6IHN0cmluZyB7XG4gIHJldHVybiBhcmdzLm1hcCgoYXJnKSA9PiBzaGVsbEVzY2FwZUFyZ3VtZW50KGFyZykpLmpvaW4oJyAnKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGJ1aWxkU2hlbGxFbnZpcm9ubWVudEFzc2lnbm1lbnQobmFtZTogc3RyaW5nLCB2YWx1ZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIGAke25hbWV9PSR7c2hlbGxFc2NhcGVBcmd1bWVudCh2YWx1ZSl9YDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHNoZWxsRXNjYXBlQXJndW1lbnQoYXJnOiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gL15bXFx3Li86PSxAJSstXSskL3UudGVzdChhcmcpID8gYXJnIDogYCcke2FyZy5yZXBsYWNlQWxsKFwiJ1wiLCBgJ1wiJ1wiJ2ApfSdgO1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHR5cGUgeyBQcm9qZWN0IH0gZnJvbSAnLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQgeyBidWlsZEVudlJlYWRlck9wdGlvbkFyZ3MgfSBmcm9tICcuLi9zaGFyZWRPcHRpb25zQnVpbGRlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFNjcmlwdEFyZ3YgfSBmcm9tICcuLi9zY3JpcHRzL2J1aWxkZXIuanMnO1xuaW1wb3J0IHsgYnVpbGRTaGVsbENvbW1hbmQgfSBmcm9tICcuL3NoZWxsLmpzJztcblxuY29uc3Qgd3JhbmdsZXJDb25maWdGaWxlTmFtZXMgPSBbJ3dyYW5nbGVyLmpzb25jJywgJ3dyYW5nbGVyLmpzb24nLCAnd3JhbmdsZXIudG9tbCddO1xuXG4vKipcbiAqIEJ1aWxkIGEgY29tbWFuZCBnZW5lcmF0aW5nIGEgLmRldi52YXJzIGZpbGUgKHZpYSBgd2IgZ2VuLWRldi12YXJzYCkgc28gdGhhdFxuICogYHdyYW5nbGVyIGRldmAgY2FuIHNlZSB0aGUgd2ItbWFuYWdlZCBlbnZpcm9ubWVudCB2YXJpYWJsZXMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBidWlsZEdlbkRldlZhcnNDb21tYW5kKGFyZ3Y6IFNjcmlwdEFyZ3YsIG91dHB1dFBhdGg6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiBidWlsZFNoZWxsQ29tbWFuZChbJ1lBUk4nLCAnd2InLCAnZ2VuLWRldi12YXJzJywgLi4uYnVpbGRFbnZSZWFkZXJPcHRpb25BcmdzKGFyZ3YpLCBvdXRwdXRQYXRoXSk7XG59XG5cbi8qKlxuICogQnVpbGQgYSBgd3JhbmdsZXIgZGV2YC1zdHlsZSBjb21tYW5kLiBgZW52IC11IENMT1VERkxBUkVfRU5WYCBtYWtlcyB3cmFuZ2xlciBzZXJ2ZSB0aGUgdG9wLWxldmVsXG4gKiAobm9uLWRlcGxveSkgY29uZmlnLiB3cmFuZ2xlciAobGlrZSB2aW5leHQpIHJlcXVpcmVzIHJlYWwgTm9kZS5qcyDigJQgYGJ1biBydW5gIHJlc3BlY3RzIHRoZSBiaW4nc1xuICogbm9kZSBzaGViYW5nLCBhbmQgd2IgbmV2ZXIgY29tcG9zZXMgYC0tYnVuYCAod2hvc2Ugbm9kZS0+YnVuIFBBVEggc2hpbSBicmVha3MgYm90aCB0b29scykuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBidWlsZFdyYW5nbGVyRGV2Q29tbWFuZChhcmdzOiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gYGVudiAtdSBDTE9VREZMQVJFX0VOViBZQVJOIHdyYW5nbGVyICR7YXJnc31gLnRyaW0oKTtcbn1cblxuLyoqXG4gKiBCdWlsZCBhIGNvbW1hbmQgYXBwbHlpbmcgd3JhbmdsZXItbmF0aXZlIEQxIG1pZ3JhdGlvbnMgdG8gdGhlIGxvY2FsIGRhdGFiYXNlLCBvciB1bmRlZmluZWRcbiAqIGlmIHRoZSBwcm9qZWN0IGhhcyBubyBEMSBkYXRhYmFzZSBvciBubyB3cmFuZ2xlci1uYXRpdmUgbWlncmF0aW9ucyBkaXJlY3RvcnkuXG4gKiBDST10cnVlIHN1cHByZXNzZXMgd3JhbmdsZXIncyBpbnRlcmFjdGl2ZSBjb25maXJtYXRpb24gcHJvbXB0LlxuICovXG5leHBvcnQgZnVuY3Rpb24gYnVpbGREMU1pZ3JhdGlvbnNBcHBseUNvbW1hbmQocHJvamVjdDogUGljazxQcm9qZWN0LCAnZGlyUGF0aCcgfCAnZW52Jz4pOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBjb25zdCBkYXRhYmFzZU5hbWUgPSBnZXREMURhdGFiYXNlTmFtZShwcm9qZWN0KTtcbiAgaWYgKCFkYXRhYmFzZU5hbWUgfHwgIWZpbmREMU1pZ3JhdGlvbnNEaXJQYXRoKHByb2plY3QpKSByZXR1cm47XG5cbiAgcmV0dXJuIGBDST10cnVlIFlBUk4gd3JhbmdsZXIgZDEgbWlncmF0aW9ucyBhcHBseSAke2RhdGFiYXNlTmFtZX0gLS1sb2NhbCAtLXBlcnNpc3QtdG8gXCIke2dldExvY2FsV3JhbmdsZXJTdGF0ZURpcihwcm9qZWN0KX1cImA7XG59XG5cbi8qKlxuICogUHJlZml4IHRoZSBnaXZlbiBzY3JpcHQgd2l0aCBjb21tYW5kcyBleHBvcnRpbmcgREFUQUJBU0VfVVJMIHBvaW50aW5nIHRvIHRoZSBsb2NhbCBtaW5pZmxhcmUgRDEgU1FMaXRlIGZpbGUsXG4gKiBzbyB0aGF0IGRyaXp6bGUta2l0IGFuZCBzZWVkIHNjcmlwdHMgY2FuIG9wZXJhdGUgb24gdGhlIHNhbWUgZGF0YWJhc2UgYXMgdGhlIGFwcC5cbiAqIERvIG5vdGhpbmcgaWYgdGhlIHByb2plY3QgaGFzIG5vIEQxIGRhdGFiYXNlIGluIGl0cyB3cmFuZ2xlciBjb25maWcuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB3cmFwV2l0aExvY2FsRDFEYXRhYmFzZVVybChwcm9qZWN0OiBQaWNrPFByb2plY3QsICdkaXJQYXRoJyB8ICdlbnYnPiwgc2NyaXB0OiBzdHJpbmcpOiBzdHJpbmcge1xuICBjb25zdCBkYXRhYmFzZU5hbWUgPSBnZXREMURhdGFiYXNlTmFtZShwcm9qZWN0KTtcbiAgaWYgKCFkYXRhYmFzZU5hbWUpIHJldHVybiBzY3JpcHQ7XG5cbiAgLy8gRXhjbHVkaW5nIG1pbmlmbGFyZSdzIG1ldGFkYXRhLnNxbGl0ZSwgd2hpY2ggbGl2ZXMgbmV4dCB0byB0aGUgaGFzaC1uYW1lZCBkYXRhYmFzZSBmaWxlLlxuICAvLyBBbiB1bm1hdGNoZWQgZ2xvYiBjYW5ub3QgaGFwcGVuIGhlcmU6IHRoZSBzY3JpcHQgcnVucyB1bmRlciAvYmluL3NoICh2aWEgTm9kZSdzIGBzaGVsbDogdHJ1ZWApLFxuICAvLyBhbmQgdGhlIHByZWNlZGluZyBtYXRlcmlhbGl6YXRpb24gY29tbWFuZCBndWFyYW50ZWVzIHRoZSBTUUxpdGUgZmlsZSBleGlzdHMuXG4gIC8vIFByb2plY3RzIHdpdGggbXVsdGlwbGUgRDEgZGF0YWJhc2VzIGFyZSBub3Qgc3VwcG9ydGVkOiB0aGUgaGFzaC1uYW1lZCBmaWxlcyBjYW5ub3QgYmVcbiAgLy8gZGlzdGluZ3Vpc2hlZCBjaGVhcGx5IChtYXRlcmlhbGl6YXRpb24gZG9lcyBub3QgZXZlbiB1cGRhdGUgdGhlIHRhcmdldCBmaWxlJ3MgbXRpbWUpLlxuICAvLyBUaGUgc3RhdGUgZGlyZWN0b3J5IG11c3QgYmUgYWJzb2x1dGUgYmVjYXVzZSB0aGUgd3JhcHBlZCBzY3JpcHQgbWF5IGBjZGAgdG8gdGhlIG1vbm9yZXBvIHJvb3QuXG4gIGNvbnN0IHN0YXRlRGlyUGF0aCA9IHBhdGgucmVzb2x2ZShwcm9qZWN0LmRpclBhdGgsIGdldExvY2FsV3JhbmdsZXJTdGF0ZURpcihwcm9qZWN0KSk7XG4gIGNvbnN0IGV4cG9ydENvbW1hbmQgPSBgZXhwb3J0IERBVEFCQVNFX1VSTD1cImZpbGU6JChscyBcIiR7c3RhdGVEaXJQYXRofVwiL3YzL2QxL21pbmlmbGFyZS1EMURhdGFiYXNlT2JqZWN0Lyouc3FsaXRlIHwgZ3JlcCAtdiBtZXRhZGF0YSB8IGhlYWQgLTEpXCJgO1xuICByZXR1cm4gYCR7YnVpbGRNYXRlcmlhbGl6ZUxvY2FsRDFDb21tYW5kKHByb2plY3QsIGRhdGFiYXNlTmFtZSl9ICYmICR7ZXhwb3J0Q29tbWFuZH0gJiYgJHtzY3JpcHR9YDtcbn1cblxuLyoqXG4gKiBHZXQgdGhlIG5hbWUgb2YgdGhlIGZpcnN0IEQxIGRhdGFiYXNlIGRlY2xhcmVkIGluIHRoZSB3cmFuZ2xlciBjb25maWcgZmlsZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldEQxRGF0YWJhc2VOYW1lKHByb2plY3Q6IFBpY2s8UHJvamVjdCwgJ2RpclBhdGgnPik6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IGNvbmZpZ1BhdGggPSBmaW5kV3JhbmdsZXJDb25maWdQYXRoKHByb2plY3QpO1xuICBpZiAoIWNvbmZpZ1BhdGgpIHJldHVybjtcblxuICAvLyBDb3ZlciBKU09OKEMpIChgXCJkYXRhYmFzZV9uYW1lXCI6IFwiLi4uXCJgKSBhbmQgVE9NTCwgaW5jbHVkaW5nIGl0cyBpbmxpbmUtdGFibGUgZm9ybVxuICAvLyAoYGQxX2RhdGFiYXNlcyA9IFt7IC4uLiwgZGF0YWJhc2VfbmFtZSA9IFwiLi4uXCIgfV1gKSwgd2l0aG91dCBmdWxsIHBhcnNlcnMuXG4gIC8vIENvbW1lbnRlZC1vdXQgbGluZXMgYXJlIHNraXBwZWQgc28gdGhhdCB0aGV5IGNhbm5vdCBzaGFkb3cgdGhlIGFjdGl2ZSBkYXRhYmFzZSBuYW1lLFxuICAvLyBhbmQgdGhlIGtleSBtdXN0IGZvbGxvdyBhIGxpbmUgc3RhcnQsIGB7YCBvciBgLGAgc28gdGhhdCBwcm9zZSBtZW50aW9uaW5nIGl0IGNhbm5vdCBtYXRjaC5cbiAgZm9yIChjb25zdCBsaW5lIG9mIGZzLnJlYWRGaWxlU3luYyhjb25maWdQYXRoLCAndXRmOCcpLnNwbGl0KCdcXG4nKSkge1xuICAgIGlmICgvXlxccyooPzojfFxcL1xcLykvdS50ZXN0KGxpbmUpKSBjb250aW51ZTtcblxuICAgIGNvbnN0IG1hdGNoID0gLyg/Ol58Wyx7XSlcXHMqW1wiJ10/ZGF0YWJhc2VfbmFtZVtcIiddP1xccypbOj1dXFxzKltcIiddKFteXCInXSspW1wiJ10vdS5leGVjKGxpbmUpO1xuICAgIGlmIChtYXRjaCkgcmV0dXJuIG1hdGNoWzFdO1xuICB9XG4gIHJldHVybjtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGZpbmRXcmFuZ2xlckNvbmZpZ1BhdGgocHJvamVjdDogUGljazxQcm9qZWN0LCAnZGlyUGF0aCc+KTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgLy8gVGVzdHMgbWF5IHBhc3MgcGFydGlhbCBQcm9qZWN0IG9iamVjdHMgd2l0aG91dCBkaXJQYXRoLlxuICBpZiAoIXByb2plY3QuZGlyUGF0aCkgcmV0dXJuO1xuXG4gIGZvciAoY29uc3QgZmlsZU5hbWUgb2Ygd3JhbmdsZXJDb25maWdGaWxlTmFtZXMpIHtcbiAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGguam9pbihwcm9qZWN0LmRpclBhdGgsIGZpbGVOYW1lKTtcbiAgICBpZiAoZnMuZXhpc3RzU3luYyhmaWxlUGF0aCkpIHJldHVybiBmaWxlUGF0aDtcbiAgfVxuICByZXR1cm47XG59XG5cbi8qKlxuICogR2V0IHRoZSBwYXRoIG9mIHRoZSB3cmFuZ2xlci1uYXRpdmUgRDEgbWlncmF0aW9ucyBkaXJlY3RvcnkgKGBtaWdyYXRpb25zX2RpcmAgaW4gdGhlIHdyYW5nbGVyXG4gKiBjb25maWcsIGRlZmF1bHRpbmcgdG8gYG1pZ3JhdGlvbnNgKSBpZiBpdCBleGlzdHMgb24gZGlzay5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGZpbmREMU1pZ3JhdGlvbnNEaXJQYXRoKHByb2plY3Q6IFBpY2s8UHJvamVjdCwgJ2RpclBhdGgnPik6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IGNvbmZpZ1BhdGggPSBmaW5kV3JhbmdsZXJDb25maWdQYXRoKHByb2plY3QpO1xuICBpZiAoIWNvbmZpZ1BhdGgpIHJldHVybjtcblxuICBsZXQgbWlncmF0aW9uc0RpciA9ICdtaWdyYXRpb25zJztcbiAgZm9yIChjb25zdCBsaW5lIG9mIGZzLnJlYWRGaWxlU3luYyhjb25maWdQYXRoLCAndXRmOCcpLnNwbGl0KCdcXG4nKSkge1xuICAgIGlmICgvXlxccyooPzojfFxcL1xcLykvdS50ZXN0KGxpbmUpKSBjb250aW51ZTtcblxuICAgIGNvbnN0IG1hdGNoID0gLyg/Ol58Wyx7XSlcXHMqW1wiJ10/bWlncmF0aW9uc19kaXJbXCInXT9cXHMqWzo9XVxccypbXCInXShbXlwiJ10rKVtcIiddL3UuZXhlYyhsaW5lKTtcbiAgICBpZiAobWF0Y2gpIHtcbiAgICAgIG1pZ3JhdGlvbnNEaXIgPSBtYXRjaFsxXSBhcyBzdHJpbmc7XG4gICAgICBicmVhaztcbiAgICB9XG4gIH1cbiAgY29uc3QgbWlncmF0aW9uc0RpclBhdGggPSBwYXRoLmpvaW4ocHJvamVjdC5kaXJQYXRoLCBtaWdyYXRpb25zRGlyKTtcbiAgcmV0dXJuIGZzLmV4aXN0c1N5bmMobWlncmF0aW9uc0RpclBhdGgpID8gbWlncmF0aW9uc0RpclBhdGggOiB1bmRlZmluZWQ7XG59XG5cbi8qKlxuICogQnVpbGQgYSBjb21tYW5kIG1hdGVyaWFsaXppbmcgdGhlIGxvY2FsIG1pbmlmbGFyZSBEMSBTUUxpdGUgZmlsZS5cbiAqIEEgbm8tb3AgcXVlcnkgZm9yY2VzIG1pbmlmbGFyZSB0byBjcmVhdGUgdGhlIFNRTGl0ZSBmaWxlIGlmIGl0IGRvZXNuJ3QgZXhpc3QgeWV0LlxuICogT25seSBzdGRvdXQgaXMgc3VwcHJlc3NlZDsgd3JhbmdsZXIgcmVwb3J0cyBlcnJvcnMgb24gc3RkZXJyLCB3aGljaCBtdXN0IHN0YXkgdmlzaWJsZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGJ1aWxkTWF0ZXJpYWxpemVMb2NhbEQxQ29tbWFuZChwcm9qZWN0OiBQaWNrPFByb2plY3QsICdlbnYnPiwgZGF0YWJhc2VOYW1lOiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gYFlBUk4gd3JhbmdsZXIgZDEgZXhlY3V0ZSAke2RhdGFiYXNlTmFtZX0gLS1sb2NhbCAtLXBlcnNpc3QtdG8gXCIke2dldExvY2FsV3JhbmdsZXJTdGF0ZURpcihwcm9qZWN0KX1cIiAtLWNvbW1hbmQgXCJTRUxFQ1QgMVwiID4gL2Rldi9udWxsYDtcbn1cblxuLyoqXG4gKiBHZXQgdGhlIGxvY2FsIHdyYW5nbGVyL21pbmlmbGFyZSBzdGF0ZSBkaXJlY3RvcnkuXG4gKiBEZXZlbG9wbWVudCBmb2xsb3dzIHdyYW5nbGVyJ3MgZGVmYXVsdCBkaXJlY3Rvcnkgc28gdGhhdCBwbGFpbiBgd3JhbmdsZXIgZGV2YCAvIGB2aW5leHQgZGV2YFxuICogKHdpdGhvdXQgYSBwZXJzaXN0LXBhdGggb3ZlcnJpZGUpIHNoYXJlcyB0aGUgc2FtZSBkYXRhYmFzZSBhcyB3Yi1tYW5hZ2VkIGRiIGNvbW1hbmRzLlxuICogT3RoZXIgZW52aXJvbm1lbnRzIChlLmcuIHRlc3QpIGdldCB0aGVpciBvd24gZGlyZWN0b3J5IHNvIHRoYXQgdGhleSBjYW4gYmUgcmVzZXRcbiAqIHdpdGhvdXQgZGVzdHJveWluZyBkZXZlbG9wbWVudCBzdGF0ZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldExvY2FsV3JhbmdsZXJTdGF0ZURpcihwcm9qZWN0OiBQaWNrPFByb2plY3QsICdlbnYnPik6IHN0cmluZyB7XG4gIC8vIERlc3RydWN0aXZlIHRlc3QgcmVzZXRzIGFyZSBnYXRlZCBvbiBpc1Byb2plY3RFbnZpcm9ubWVudChwcm9qZWN0LCAndGVzdCcpLCB3aGljaCBhY2NlcHRzXG4gIC8vIGVpdGhlciBXQl9FTlYgb3IgTUlTRV9FTlY7IHJlc29sdmUgdG8gdGhlIHRlc3QgZGlyZWN0b3J5IHdoZW5ldmVyIGVpdGhlciBzYXlzICd0ZXN0JyBzb1xuICAvLyB0aGF0IHN1Y2ggcmVzZXRzIGNhbiBuZXZlciB0YXJnZXQgdGhlIGRldmVsb3BtZW50IHN0YXRlLlxuICBjb25zdCB3YkVudiA9IFtwcm9qZWN0LmVudi5XQl9FTlYsIHByb2plY3QuZW52Lk1JU0VfRU5WXS5pbmNsdWRlcygndGVzdCcpXG4gICAgPyAndGVzdCdcbiAgICA6IHByb2plY3QuZW52LldCX0VOViB8fCBwcm9qZWN0LmVudi5NSVNFX0VOVjtcbiAgcmV0dXJuICF3YkVudiB8fCB3YkVudiA9PT0gJ2RldmVsb3BtZW50JyA/ICcud3JhbmdsZXIvc3RhdGUnIDogYC53cmFuZ2xlci9zdGF0ZS0ke3diRW52fWA7XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgeyBnZXRBYnNvbHV0ZUZpbGVEYXRhYmFzZVVybFBhdGgsIGlzUHJvamVjdEVudmlyb25tZW50LCB0eXBlIFByb2plY3QgfSBmcm9tICcuLi9wcm9qZWN0LmpzJztcbmltcG9ydCB7IGJ1aWxkU2hlbGxDb21tYW5kIH0gZnJvbSAnLi4vdXRpbHMvc2hlbGwuanMnO1xuaW1wb3J0IHsgYnVpbGRNYXRlcmlhbGl6ZUxvY2FsRDFDb21tYW5kLCBnZXREMURhdGFiYXNlTmFtZSwgZ2V0TG9jYWxXcmFuZ2xlclN0YXRlRGlyIH0gZnJvbSAnLi4vdXRpbHMvd3JhbmdsZXIuanMnO1xuXG5jb25zdCBMSVRFU1RSRUFNX0NPTkZJR19GSUxFX05BTUUgPSAnbGl0ZXN0cmVhbS55bWwnO1xuY29uc3QgREVGQVVMVF9MSVRFU1RSRUFNX0NPTkZJR19QQVRIID0gJy9ldGMvbGl0ZXN0cmVhbS55bWwnO1xuXG5jbGFzcyBEcml6emxlU2NyaXB0cyB7XG4gIGNsZWFuVXBMaXRlc3RyZWFtKHByb2plY3Q6IFByb2plY3QpOiBzdHJpbmcge1xuICAgIGNvbnN0IGRiUGF0aCA9IGdldEFic29sdXRlU3FsaXRlRGJQYXRoKHByb2plY3QsICdjbGVhbnVwLWxpdGVzdHJlYW0nKTtcbiAgICBjb25zdCB3YWxDaGVja3BvaW50Q29tbWFuZCA9IGBpZiBbIC1mIFwiJHtkYlBhdGh9XCIgXSAmJiBjb21tYW5kIC12IHNxbGl0ZTMgPi9kZXYvbnVsbDsgdGhlbiBwcmludGYgJ1BSQUdNQSB3YWxfY2hlY2twb2ludChUUlVOQ0FURSk7JyB8IHNxbGl0ZTMgXCIke2RiUGF0aH1cIjsgZmlgO1xuICAgIHJldHVybiBgJHt3YWxDaGVja3BvaW50Q29tbWFuZH07IHJtIC1mIFwiJHtkYlBhdGh9XCIuKiBcIiR7ZGJQYXRofVwiLSo7IHJtIC1SZiBcIiR7cGF0aC5kaXJuYW1lKGRiUGF0aCl9Ly4ke3BhdGguYmFzZW5hbWUoZGJQYXRoKX1cIiogfHwgdHJ1ZWA7XG4gIH1cblxuICByZXNldChwcm9qZWN0OiBQcm9qZWN0LCBhZGRpdGlvbmFsT3B0aW9ucyA9ICcnKTogc3RyaW5nIHtcbiAgICBjb25zdCBkMURhdGFiYXNlTmFtZSA9IGdldEQxRGF0YWJhc2VOYW1lKHByb2plY3QpO1xuICAgIGlmIChkMURhdGFiYXNlTmFtZSkge1xuICAgICAgLy8gUmVtb3ZlIG9ubHkgdGhlIEQxIHN1YnRyZWUgc28gdGhhdCBvdGhlciBsb2NhbGx5LXBlcnNpc3RlZCBiaW5kaW5ncyAoS1YsIFIyLCBEdXJhYmxlIE9iamVjdHMpIHN1cnZpdmUsXG4gICAgICAvLyB0aGVuIHJlLW1hdGVyaWFsaXplIHRoZSBEMSBTUUxpdGUgZmlsZS4gSXRzIHBhdGggaXMgZGV0ZXJtaW5pc3RpYywgc28gYSBEQVRBQkFTRV9VUkwgZXhwb3J0ZWRcbiAgICAgIC8vIGJlZm9yZSB0aGUgcmVtb3ZhbCBzdGF5cyB2YWxpZC5cbiAgICAgIHJldHVybiBgcm0gLVJmIFwiJHtnZXRMb2NhbFdyYW5nbGVyU3RhdGVEaXIocHJvamVjdCl9L3YzL2QxXCIgJiYgJHtidWlsZE1hdGVyaWFsaXplTG9jYWxEMUNvbW1hbmQocHJvamVjdCwgZDFEYXRhYmFzZU5hbWUpfSAmJiAke3RoaXMubWlncmF0ZShwcm9qZWN0LCBhZGRpdGlvbmFsT3B0aW9ucyl9YDtcbiAgICB9XG5cbiAgICBjb25zdCByZW1vdmVDb21tYW5kID0gYnVpbGRSZW1vdmVTcWxpdGVEYkNvbW1hbmQocHJvamVjdCk7XG4gICAgaWYgKCFyZW1vdmVDb21tYW5kKSB7XG4gICAgICByZXR1cm4gXCJlY2hvICd3YiBkYiByZXNldCBzdXBwb3J0cyBEcml6emxlIG9ubHkgd2hlbiBmaWxlOiBEQVRBQkFTRV9VUkwgaXMgc2V0LicgJiYgZXhpdCAxXCI7XG4gICAgfVxuXG4gICAgcmV0dXJuIGAke3JlbW92ZUNvbW1hbmR9ICYmICR7dGhpcy5taWdyYXRlKHByb2plY3QsIGFkZGl0aW9uYWxPcHRpb25zKX1gO1xuICB9XG5cbiAgbWlncmF0ZShwcm9qZWN0OiBQcm9qZWN0LCBhZGRpdGlvbmFsT3B0aW9ucyA9ICcnKTogc3RyaW5nIHtcbiAgICBjb25zdCBzZWVkQ29tbWFuZCA9IHRoaXMuc2VlZChwcm9qZWN0KTtcbiAgICBjb25zdCBtaWdyYXRlQ29tbWFuZCA9IHRoaXMuZGVwbG95KHByb2plY3QsIGFkZGl0aW9uYWxPcHRpb25zKTtcbiAgICByZXR1cm4gc2VlZENvbW1hbmQgPT09ICd0cnVlJyA/IG1pZ3JhdGVDb21tYW5kIDogYCR7bWlncmF0ZUNvbW1hbmR9ICYmICR7c2VlZENvbW1hbmR9YDtcbiAgfVxuXG4gIG1pZ3JhdGVGb3JTdGFydChwcm9qZWN0OiBQcm9qZWN0LCBhZGRpdGlvbmFsT3B0aW9ucyA9ICcnKTogc3RyaW5nIHtcbiAgICBpZiAoaXNQcm9qZWN0RW52aXJvbm1lbnQocHJvamVjdCwgJ3Rlc3QnKSAmJiAoYnVpbGRSZW1vdmVTcWxpdGVEYkNvbW1hbmQocHJvamVjdCkgfHwgZ2V0RDFEYXRhYmFzZU5hbWUocHJvamVjdCkpKSB7XG4gICAgICByZXR1cm4gdGhpcy5yZXNldChwcm9qZWN0LCBhZGRpdGlvbmFsT3B0aW9ucyk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLm1pZ3JhdGUocHJvamVjdCwgYWRkaXRpb25hbE9wdGlvbnMpO1xuICB9XG5cbiAgZGVwbG95KHByb2plY3Q6IFByb2plY3QsIGFkZGl0aW9uYWxPcHRpb25zID0gJycpOiBzdHJpbmcge1xuICAgIHJldHVybiBidWlsZERyaXp6bGVLaXRDb21tYW5kKHByb2plY3QsIGBtaWdyYXRlICR7YWRkaXRpb25hbE9wdGlvbnN9YC50cmltKCkpO1xuICB9XG5cbiAgZGVwbG95Rm9yY2UocHJvamVjdDogUHJvamVjdCk6IHN0cmluZyB7XG4gICAgY29uc3QgZGJQYXRoID0gZ2V0QWJzb2x1dGVTcWxpdGVEYlBhdGgocHJvamVjdCwgJ2RlcGxveS1mb3JjZScpO1xuICAgIGNvbnN0IHJlbW92ZURiQ29tbWFuZCA9IGJ1aWxkUmVtb3ZlU3FsaXRlRGJGYW1pbHlDb21tYW5kKGRiUGF0aCk7XG4gICAgY29uc3QgbGl0ZXN0cmVhbUNvbmZpZ09wdGlvbiA9IGdldExpdGVzdHJlYW1Db25maWdPcHRpb24ocHJvamVjdCk7XG4gICAgLy8gVGhlIGVudmlyb25tZW50IGFzc2lnbm1lbnQgbXVzdCBnbyB0aHJvdWdoIGJ1aWxkRHJpenpsZUtpdENvbW1hbmQ6IHByZWZpeGluZyBpdHNcbiAgICAvLyBwb3NzaWJseS1wYXJlbnRoZXNpemVkIHJlc3VsdCB3aXRoIGBBTExPV19UT19TS0lQX1NFRUQ9MGAgd291bGQgYmUgYSBzaGVsbCBzeW50YXggZXJyb3IuXG4gICAgY29uc3QgbWlncmF0ZVdpdGhTZWVkQ29tbWFuZCA9IGJ1aWxkRHJpenpsZUtpdENvbW1hbmQocHJvamVjdCwgJ21pZ3JhdGUnLCAnQUxMT1dfVE9fU0tJUF9TRUVEPTAnKTtcbiAgICByZXR1cm4gYCR7cmVtb3ZlRGJDb21tYW5kfTsgJHt0aGlzLmRlcGxveShwcm9qZWN0KX0gJiYgJHtyZW1vdmVEYkNvbW1hbmR9XG4gICAgICAmJiBsaXRlc3RyZWFtIHJlc3RvcmUgJHtsaXRlc3RyZWFtQ29uZmlnT3B0aW9ufSAtbyBcIiR7ZGJQYXRofVwiIFwiJHtkYlBhdGh9XCIgJiYgbHMgLWFobCBcIiR7ZGJQYXRofVwiICYmICR7bWlncmF0ZVdpdGhTZWVkQ29tbWFuZH1gO1xuICB9XG5cbiAgbGlzdEJhY2t1cHMocHJvamVjdDogUHJvamVjdCwgY29uZmlnUGF0aD86IHN0cmluZyk6IHN0cmluZyB7XG4gICAgY29uc3QgZGJQYXRoID0gZ2V0QWJzb2x1dGVTcWxpdGVEYlBhdGgocHJvamVjdCwgJ2xpc3QtYmFja3VwcycpO1xuICAgIHJldHVybiBgbGl0ZXN0cmVhbSBsdHggJHtnZXRMaXRlc3RyZWFtQ29uZmlnT3B0aW9uKHByb2plY3QsIGNvbmZpZ1BhdGgpfSBcIiR7ZGJQYXRofVwiYDtcbiAgfVxuXG4gIHJlc3RvcmUocHJvamVjdDogUHJvamVjdCwgb3V0cHV0UGF0aDogc3RyaW5nLCBjb25maWdQYXRoPzogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBjb25zdCBkYlBhdGggPSBnZXRBYnNvbHV0ZVNxbGl0ZURiUGF0aChwcm9qZWN0LCAncmVzdG9yZScpO1xuICAgIHJldHVybiBgJHtidWlsZFJlbW92ZVNxbGl0ZURiQ29tbWFuZEZvclBhdGgob3V0cHV0UGF0aCl9OyBsaXRlc3RyZWFtIHJlc3RvcmUgJHtnZXRMaXRlc3RyZWFtQ29uZmlnT3B0aW9uKHByb2plY3QsIGNvbmZpZ1BhdGgpfSAtbyBcIiR7b3V0cHV0UGF0aH1cIiBcIiR7ZGJQYXRofVwiYDtcbiAgfVxuXG4gIGdlbmVyYXRlKHByb2plY3Q6IFByb2plY3QsIGFkZGl0aW9uYWxPcHRpb25zID0gJycpOiBzdHJpbmcge1xuICAgIHJldHVybiBidWlsZERyaXp6bGVLaXRDb21tYW5kKHByb2plY3QsIGBnZW5lcmF0ZSAke2FkZGl0aW9uYWxPcHRpb25zfWAudHJpbSgpKTtcbiAgfVxuXG4gIG1pZ3JhdGVEZXYocHJvamVjdDogUHJvamVjdCwgYWRkaXRpb25hbE9wdGlvbnMgPSAnJyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuZ2VuZXJhdGUocHJvamVjdCwgYWRkaXRpb25hbE9wdGlvbnMpO1xuICB9XG5cbiAgc2VlZChwcm9qZWN0OiBQcm9qZWN0LCBzY3JpcHRQYXRoPzogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBpZiAoc2NyaXB0UGF0aCkgcmV0dXJuIGBCVU4gYnVpbGQtdHMgcnVuICR7c2NyaXB0UGF0aH1gO1xuICAgIGlmIChwcm9qZWN0LnBhY2thZ2VKc29uLnNjcmlwdHM/LnNlZWQpIHJldHVybiAnWUFSTiBydW4gc2VlZCc7XG4gICAgY29uc3QgZGVmYXVsdFNlZWRQYXRoID0gcGF0aC5qb2luKCdkYicsICdzZWVkLnRzJyk7XG4gICAgaWYgKGZzLmV4aXN0c1N5bmMocGF0aC5qb2luKHByb2plY3QuZGlyUGF0aCwgZGVmYXVsdFNlZWRQYXRoKSkpIHtcbiAgICAgIHJldHVybiBwcm9qZWN0LnVzZXNCdW5QYWNrYWdlTWFuYWdlciA/IGBCVU4gJHtkZWZhdWx0U2VlZFBhdGh9YCA6IGBCVU4gYnVpbGQtdHMgcnVuICR7ZGVmYXVsdFNlZWRQYXRofWA7XG4gICAgfVxuICAgIHJldHVybiAndHJ1ZSc7XG4gIH1cblxuICBzdHVkaW8ocHJvamVjdDogUHJvamVjdCwgZGJVcmxPclBhdGg/OiBzdHJpbmcsIGFkZGl0aW9uYWxPcHRpb25zID0gJycpOiBzdHJpbmcge1xuICAgIGlmIChkYlVybE9yUGF0aCkge1xuICAgICAgcmV0dXJuIFwiZWNobyAnd2IgZGIgc3R1ZGlvIGZvciBEcml6emxlIGRvZXMgbm90IHN1cHBvcnQgZGItdXJsLW9yLXBhdGguJyAmJiBleGl0IDFcIjtcbiAgICB9XG5cbiAgICByZXR1cm4gYnVpbGREcml6emxlS2l0Q29tbWFuZChwcm9qZWN0LCBgc3R1ZGlvICR7YWRkaXRpb25hbE9wdGlvbnN9YC50cmltKCkpO1xuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBidWlsZERyaXp6bGVLaXRDb21tYW5kKHByb2plY3Q6IFByb2plY3QsIGFyZ3M6IHN0cmluZywgZW52aXJvbm1lbnRBc3NpZ25tZW50ID0gJycpOiBzdHJpbmcge1xuICBjb25zdCBjb21tYW5kID0gYCR7ZW52aXJvbm1lbnRBc3NpZ25tZW50ICYmIGAke2Vudmlyb25tZW50QXNzaWdubWVudH0gYH1ZQVJOIGRyaXp6bGUta2l0ICR7YXJnc31gO1xuICAvLyBBIGNhbGxlci1zdXBwbGllZCAtLWNvbmZpZyByZXNvbHZlcyBhZ2FpbnN0IHRoZSBwcm9qZWN0IGRpcmVjdG9yeSwgc28gdGhlIGN3ZCBtdXN0IHN0YXkgdGhlcmUuXG4gIHJldHVybiBhcmdzLmluY2x1ZGVzKCctLWNvbmZpZycpID8gY29tbWFuZCA6IHdyYXBXaXRoRHJpenpsZUNvbmZpZ0Rpcihwcm9qZWN0LCBjb21tYW5kKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHdyYXBXaXRoRHJpenpsZUNvbmZpZ0Rpcihwcm9qZWN0OiBQcm9qZWN0LCBjb21tYW5kOiBzdHJpbmcpOiBzdHJpbmcge1xuICBjb25zdCBjb25maWcgPSBmaW5kRHJpenpsZUNvbmZpZyhwcm9qZWN0KTtcbiAgLy8gZHJpenpsZS1raXQgcmVzb2x2ZXMgcmVsYXRpdmUgcGF0aHMgaW4gaXRzIGNvbmZpZyBhZ2FpbnN0IHRoZSBjd2QsIHNvIHRoZSBjb21tYW5kIG11c3QgcnVuXG4gIC8vIGluIHRoZSBkaXJlY3RvcnkgY29udGFpbmluZyBkcml6emxlLmNvbmZpZy4qIGV2ZW4gd2hlbiBtb25vcmVwbyBwYWNrYWdlcyBzaGFyZSBpdCBhdCB0aGUgcm9vdC5cbiAgcmV0dXJuIGNvbmZpZyAmJiBjb25maWcuZGlyUGF0aCAhPT0gcHJvamVjdC5kaXJQYXRoXG4gICAgPyBgKCR7YnVpbGRTaGVsbENvbW1hbmQoWydjZCcsIGNvbmZpZy5kaXJQYXRoXSl9ICYmICR7Y29tbWFuZH0pYFxuICAgIDogY29tbWFuZDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGZpbmREcml6emxlQ29uZmlnKHByb2plY3Q6IFByb2plY3QpOiB7IGRpclBhdGg6IHN0cmluZzsgZmlsZU5hbWU6IHN0cmluZyB9IHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgY2FuZGlkYXRlcyA9IFsnZHJpenpsZS5jb25maWcudHMnLCAnZHJpenpsZS5jb25maWcubXRzJywgJ2RyaXp6bGUuY29uZmlnLmpzJywgJ2RyaXp6bGUuY29uZmlnLm1qcyddO1xuICBmb3IgKGNvbnN0IGRpclBhdGggb2YgW3Byb2plY3QuZGlyUGF0aCwgcHJvamVjdC5yb290RGlyUGF0aF0pIHtcbiAgICBjb25zdCBmaWxlTmFtZSA9IGNhbmRpZGF0ZXMuZmluZCgoZmlsZU5hbWUpID0+IGZzLmV4aXN0c1N5bmMocGF0aC5qb2luKGRpclBhdGgsIGZpbGVOYW1lKSkpO1xuICAgIGlmIChmaWxlTmFtZSkgcmV0dXJuIHsgZGlyUGF0aCwgZmlsZU5hbWUgfTtcbiAgfVxuICByZXR1cm47XG59XG5cbmZ1bmN0aW9uIGJ1aWxkUmVtb3ZlU3FsaXRlRGJDb21tYW5kKHByb2plY3Q6IFByb2plY3QpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBjb25zdCBkYlBhdGggPSBnZXRTcWxpdGVEYlBhdGgocHJvamVjdCk7XG4gIGlmICghZGJQYXRoKSByZXR1cm47XG5cbiAgY29uc3QgYWJzb2x1dGVQYXRoID0gcGF0aC5pc0Fic29sdXRlKGRiUGF0aCkgPyBkYlBhdGggOiBwYXRoLnJlc29sdmUocHJvamVjdC5kaXJQYXRoLCBkYlBhdGgpO1xuICByZXR1cm4gYnVpbGRSZW1vdmVTcWxpdGVEYkNvbW1hbmRGb3JQYXRoKGFic29sdXRlUGF0aCk7XG59XG5cbmZ1bmN0aW9uIGJ1aWxkUmVtb3ZlU3FsaXRlRGJDb21tYW5kRm9yUGF0aChkYlBhdGg6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiBgcm0gLWYgXCIke2RiUGF0aH1cIiBcIiR7ZGJQYXRofS13YWxcIiBcIiR7ZGJQYXRofS1zaG1cImA7XG59XG5cbmZ1bmN0aW9uIGJ1aWxkUmVtb3ZlU3FsaXRlRGJGYW1pbHlDb21tYW5kKGRiUGF0aDogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIGBybSAtUmYgXCIke2RiUGF0aH1cIipgO1xufVxuXG5mdW5jdGlvbiBnZXRTcWxpdGVEYlBhdGhPckVycm9yKHByb2plY3Q6IFByb2plY3QsIGNvbW1hbmROYW1lOiBzdHJpbmcpOiBzdHJpbmcge1xuICBjb25zdCBkYlBhdGggPSBnZXRTcWxpdGVEYlBhdGgocHJvamVjdCk7XG4gIGlmICghZGJQYXRoKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGB3YiBkYiAke2NvbW1hbmROYW1lfSBzdXBwb3J0cyBEcml6emxlIG9ubHkgd2hlbiBmaWxlOiBEQVRBQkFTRV9VUkwgaXMgc2V0LmApO1xuICB9XG4gIHJldHVybiBkYlBhdGg7XG59XG5cbmZ1bmN0aW9uIGdldEFic29sdXRlU3FsaXRlRGJQYXRoKHByb2plY3Q6IFByb2plY3QsIGNvbW1hbmROYW1lOiBzdHJpbmcpOiBzdHJpbmcge1xuICBjb25zdCBkYlBhdGggPSBnZXRTcWxpdGVEYlBhdGhPckVycm9yKHByb2plY3QsIGNvbW1hbmROYW1lKTtcbiAgcmV0dXJuIHBhdGguaXNBYnNvbHV0ZShkYlBhdGgpID8gZGJQYXRoIDogcGF0aC5yZXNvbHZlKHByb2plY3QuZGlyUGF0aCwgZGJQYXRoKTtcbn1cblxuZnVuY3Rpb24gZ2V0U3FsaXRlRGJQYXRoKHByb2plY3Q6IFByb2plY3QpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICByZXR1cm4gZ2V0QWJzb2x1dGVGaWxlRGF0YWJhc2VVcmxQYXRoKHByb2plY3QpO1xufVxuXG5mdW5jdGlvbiBnZXRMaXRlc3RyZWFtQ29uZmlnT3B0aW9uKHByb2plY3Q6IFByb2plY3QsIGNvbmZpZ1BhdGg/OiBzdHJpbmcpOiBzdHJpbmcge1xuICBpZiAoY29uZmlnUGF0aCkgcmV0dXJuIGAtY29uZmlnIFwiJHtjb25maWdQYXRofVwiYDtcblxuICBjb25zdCBsb2NhbENvbmZpZ1BhdGggPSBwYXRoLmpvaW4ocHJvamVjdC5kaXJQYXRoLCBMSVRFU1RSRUFNX0NPTkZJR19GSUxFX05BTUUpO1xuICBpZiAoZnMuZXhpc3RzU3luYyhsb2NhbENvbmZpZ1BhdGgpKSByZXR1cm4gYC1jb25maWcgLi8ke0xJVEVTVFJFQU1fQ09ORklHX0ZJTEVfTkFNRX1gO1xuICBpZiAoZnMuZXhpc3RzU3luYyhERUZBVUxUX0xJVEVTVFJFQU1fQ09ORklHX1BBVEgpKSByZXR1cm4gYC1jb25maWcgJHtERUZBVUxUX0xJVEVTVFJFQU1fQ09ORklHX1BBVEh9YDtcbiAgcmV0dXJuIGAtY29uZmlnIC4vJHtMSVRFU1RSRUFNX0NPTkZJR19GSUxFX05BTUV9YDtcbn1cblxuZXhwb3J0IGNvbnN0IGRyaXp6bGVTY3JpcHRzID0gbmV3IERyaXp6bGVTY3JpcHRzKCk7XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgdHlwZSB7IFBhcnNlRXJyb3IgfSBmcm9tICdqc29uYy1wYXJzZXInO1xuaW1wb3J0IHsgcGFyc2UgfSBmcm9tICdqc29uYy1wYXJzZXInO1xuXG5pbXBvcnQgdHlwZSB7IFByb2plY3QgfSBmcm9tICcuLi9wcm9qZWN0LmpzJztcblxuaW1wb3J0IHsgZmluZFdyYW5nbGVyQ29uZmlnUGF0aCB9IGZyb20gJy4vd3JhbmdsZXIuanMnO1xuXG5leHBvcnQgaW50ZXJmYWNlIFdyYW5nbGVyRDFEYXRhYmFzZSB7XG4gIGJpbmRpbmc/OiBzdHJpbmc7XG4gIGRhdGFiYXNlX25hbWU/OiBzdHJpbmc7XG4gIGRhdGFiYXNlX2lkPzogc3RyaW5nO1xuICBtaWdyYXRpb25zX2Rpcj86IHN0cmluZztcbiAgbWlncmF0aW9uc19wYXR0ZXJuPzogc3RyaW5nO1xufVxuXG4vKipcbiAqIFdoZXRoZXIgdGhlIEQxIGJpbmRpbmcgdXNlcyB3cmFuZ2xlci1uYXRpdmUgbWlncmF0aW9ucyB0aGF0IGB3cmFuZ2xlciBkMSBtaWdyYXRpb25zIGFwcGx5YFxuICogd291bGQgYWN0dWFsbHkgZGlzY292ZXI6IGFuIGV4cGxpY2l0IGBtaWdyYXRpb25zX3BhdHRlcm5gIG9wdHMgaW4sIG90aGVyd2lzZSB0aGUgbWlncmF0aW9uc1xuICogZGlyZWN0b3J5IG11c3QgY29udGFpbiBmbGF0IGAqLnNxbGAgZmlsZXMgKHdyYW5nbGVyJ3MgZGVmYXVsdCBwYXR0ZXJuKS4gQSBkcml6emxlLWtpdCBgb3V0YFxuICogZGlyZWN0b3J5IHdpdGggbmVzdGVkIGA8bmFtZT4vbWlncmF0aW9uLnNxbGAgZmlsZXMgYW5kIG5vIHBhdHRlcm4gd291bGQgbWF0Y2ggbm90aGluZyBhbmRcbiAqIHNpbGVudGx5IGFwcGx5IHplcm8gbWlncmF0aW9ucywgc28gaXQgbXVzdCBmYWxsIHRocm91Z2ggdG8gdGhlIGRyaXp6bGUta2l0IG1lY2hhbmlzbS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHVzZXNXcmFuZ2xlck5hdGl2ZU1pZ3JhdGlvbnMocHJvamVjdDogUGljazxQcm9qZWN0LCAnZGlyUGF0aCc+LCBkYXRhYmFzZTogV3JhbmdsZXJEMURhdGFiYXNlKTogYm9vbGVhbiB7XG4gIC8vIEFuIGV4cGxpY2l0IHBhdHRlcm4gb3B0cyBpbnRvIHRoZSB3cmFuZ2xlci1uYXRpdmUgbWVjaGFuaXNtIGV2ZW4gYmVmb3JlIHRoZSBkaXJlY3RvcnlcbiAgLy8gZXhpc3RzOyB3cmFuZ2xlciB0aGVuIGZhaWxzIHNhZmVseSB3aXRoIFwiTm8gbWlncmF0aW9ucyBmb2xkZXIgZm91bmRcIiBpbnN0ZWFkIG9mIHdiXG4gIC8vIHNpbGVudGx5IHN3aXRjaGluZyB0byBhIGRpZmZlcmVudCBtaWdyYXRpb24gZW5naW5lLlxuICBpZiAoZGF0YWJhc2UubWlncmF0aW9uc19wYXR0ZXJuKSByZXR1cm4gdHJ1ZTtcbiAgY29uc3QgbWlncmF0aW9uc0RpclBhdGggPSBwYXRoLnJlc29sdmUocHJvamVjdC5kaXJQYXRoLCBkYXRhYmFzZS5taWdyYXRpb25zX2RpciA/PyAnbWlncmF0aW9ucycpO1xuICBpZiAoIWZzLmV4aXN0c1N5bmMobWlncmF0aW9uc0RpclBhdGgpKSByZXR1cm4gZmFsc2U7XG4gIHJldHVybiBmcy5yZWFkZGlyU3luYyhtaWdyYXRpb25zRGlyUGF0aCkuc29tZSgoZmlsZU5hbWUpID0+IGZpbGVOYW1lLmVuZHNXaXRoKCcuc3FsJykpO1xufVxuXG5jb25zdCBOQU1FX0tFWUVEX0JJTkRJTkdfUEFSRU5UUyA9IG5ldyBTZXQoWydiaW5kaW5ncycsICdzZW5kX2VtYWlsJywgJ3JhdGVsaW1pdHMnXSk7XG5jb25zdCBSRUNPUkRfS0VZRURfQklORElOR19LRVlTID0gbmV3IFNldChbJ3dhc21fbW9kdWxlcycsICd0ZXh0X2Jsb2JzJywgJ2RhdGFfYmxvYnMnXSk7XG5cbi8qKlxuICogQ29sbGVjdCBldmVyeSBiaW5kaW5nIG5hbWUgZGVjbGFyZWQgaW4gdGhlIChlbnZpcm9ubWVudC1yZXNvbHZlZCkgY29uZmlnIHN1YnRyZWU6IGBiaW5kaW5nYFxuICogcHJvcGVydGllcyBhbnl3aGVyZSAoRDEsIEtWLCBSMiwgc2VydmljZXMsIGFzc2V0cywgcXVldWVzLCBldGMuKSwgdGhlIGBuYW1lYC1rZXllZCBiaW5kaW5nc1xuICogKGBkdXJhYmxlX29iamVjdHMuYmluZGluZ3NgLCBgbG9nZndkci5iaW5kaW5nc2AsIGBzZW5kX2VtYWlsYCwgYHJhdGVsaW1pdHNgKSwgYW5kIHRoZVxuICogcmVjb3JkLWtleWVkIGxlZ2FjeSBtb2R1bGUgYmluZGluZ3MgKGB3YXNtX21vZHVsZXNgLCBgdGV4dF9ibG9ic2AsIGBkYXRhX2Jsb2JzYCkuIEEgc2VjcmV0XG4gKiBzaGFyaW5nIGEgYmluZGluZydzIG5hbWUgd291bGQgc2lsZW50bHkgcmVwbGFjZSB0aGF0IGJpbmRpbmcgd2l0aCBhIHBsYWluIHN0cmluZyBvbiBkZXBsb3kuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjb2xsZWN0QmluZGluZ05hbWVzKHZhbHVlOiB1bmtub3duLCBuYW1lcyA9IG5ldyBTZXQ8c3RyaW5nPigpLCBwYXJlbnRLZXkgPSAnJyk6IFNldDxzdHJpbmc+IHtcbiAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgZm9yIChjb25zdCBpdGVtIG9mIHZhbHVlKSBjb2xsZWN0QmluZGluZ05hbWVzKGl0ZW0sIG5hbWVzLCBwYXJlbnRLZXkpO1xuICAgIHJldHVybiBuYW1lcztcbiAgfVxuICBpZiAoIXZhbHVlIHx8IHR5cGVvZiB2YWx1ZSAhPT0gJ29iamVjdCcpIHJldHVybiBuYW1lcztcbiAgZm9yIChjb25zdCBba2V5LCBjaGlsZF0gb2YgT2JqZWN0LmVudHJpZXModmFsdWUpKSB7XG4gICAgaWYgKGtleSA9PT0gJ2JpbmRpbmcnICYmIHR5cGVvZiBjaGlsZCA9PT0gJ3N0cmluZycpIHtcbiAgICAgIG5hbWVzLmFkZChjaGlsZCk7XG4gICAgfSBlbHNlIGlmIChrZXkgPT09ICduYW1lJyAmJiB0eXBlb2YgY2hpbGQgPT09ICdzdHJpbmcnICYmIE5BTUVfS0VZRURfQklORElOR19QQVJFTlRTLmhhcyhwYXJlbnRLZXkpKSB7XG4gICAgICBuYW1lcy5hZGQoY2hpbGQpO1xuICAgIH0gZWxzZSBpZiAoUkVDT1JEX0tFWUVEX0JJTkRJTkdfS0VZUy5oYXMoa2V5KSAmJiBjaGlsZCAmJiB0eXBlb2YgY2hpbGQgPT09ICdvYmplY3QnICYmICFBcnJheS5pc0FycmF5KGNoaWxkKSkge1xuICAgICAgZm9yIChjb25zdCBiaW5kaW5nTmFtZSBvZiBPYmplY3Qua2V5cyhjaGlsZCkpIG5hbWVzLmFkZChiaW5kaW5nTmFtZSk7XG4gICAgfSBlbHNlIGlmIChrZXkgIT09ICdlbnYnICYmIGtleSAhPT0gJ3ZhcnMnICYmIGtleSAhPT0gJ21ldGFkYXRhJyAmJiBrZXkgIT09ICdvcHRpb25zJykge1xuICAgICAgLy8gTmVzdGVkIGBlbnZgIHN1YnRyZWVzIGJlbG9uZyB0byBvdGhlciBlbnZpcm9ubWVudHM7IGB2YXJzYCB2YWx1ZXMsIGB1bnNhZmUubWV0YWRhdGFgLFxuICAgICAgLy8gYW5kIGB1bnNhZmUuYmluZGluZ3NbXS5kZXYub3B0aW9uc2AgYXJlIGFyYml0cmFyeSBKU09OIHdob3NlIHByb3BlcnRpZXMgKGUuZy4gYVxuICAgICAgLy8gXCJiaW5kaW5nXCIgZmllbGQpIGFyZSBkYXRhLCBub3QgV29ya2VyIGJpbmRpbmdzLlxuICAgICAgY29sbGVjdEJpbmRpbmdOYW1lcyhjaGlsZCwgbmFtZXMsIGtleSk7XG4gICAgfVxuICB9XG4gIHJldHVybiBuYW1lcztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBSZXNvbHZlZFdyYW5nbGVyQ29uZmlnIHtcbiAgLyoqIFRoZSBXb3JrZXIgbmFtZSBmb3IgdGhlIGRlcGxveSBlbnZpcm9ubWVudCAod3JhbmdsZXIgYXBwZW5kcyBgLTxlbnY+YCB3aGVuIHRoZSBlbnYgc2VjdGlvbiBoYXMgbm8gb3duIG5hbWUpLiAqL1xuICB3b3JrZXJOYW1lPzogc3RyaW5nO1xuICBhY2NvdW50SWQ/OiBzdHJpbmc7XG4gIHZhcktleXM6IHN0cmluZ1tdO1xuICAvKiogVGhlIGVudmlyb25tZW50J3MgYHZhcnNgIHZhbHVlcyAobmVlZGVkIGZvciBDbG91ZGZsYXJlJ3MgY29tYmluZWQgY291bnQvc2l6ZSBsaW1pdHMpLiAqL1xuICB2YXJzOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgLyoqIFNlY3JldHMgZGVjbGFyZWQgYXMgcmVxdWlyZWQgdmlhIHdyYW5nbGVyJ3MgYHNlY3JldHMucmVxdWlyZWRgICh2YWxpZGF0ZWQgYXQgZGVwbG95IHRpbWUpLiAqL1xuICByZXF1aXJlZFNlY3JldE5hbWVzOiBzdHJpbmdbXTtcbiAgLyoqIE5hbWVzIG9mIGFsbCBub24tdmFyIGJpbmRpbmdzIChEMSwgS1YsIFIyLCBEdXJhYmxlIE9iamVjdHMsIHNlbmRfZW1haWwsIHNlcnZpY2VzLCAuLi4pLiAqL1xuICBiaW5kaW5nTmFtZXM6IHN0cmluZ1tdO1xuICBkMURhdGFiYXNlczogV3JhbmdsZXJEMURhdGFiYXNlW107XG4gIC8qKlxuICAgKiBXaGV0aGVyIHRoZSBlbnZpcm9ubWVudCBjb21lcyBmcm9tIGFuIGBlbnYuPG5hbWU+YCBzZWN0aW9uICh0aGVuIHdyYW5nbGVyIGNvbW1hbmRzIG5lZWRcbiAgICogYC0tZW52IDxuYW1lPmAgLyBgQ0xPVURGTEFSRV9FTlY9PG5hbWU+YCkuIGBwcm9kdWN0aW9uYCBtYXkgYmUgZWl0aGVyIHRoZSB0b3AgbGV2ZWwgb3IgYVxuICAgKiBuYW1lZCBgZW52LnByb2R1Y3Rpb25gIHNlY3Rpb247IHRoZSBzZWN0aW9uIHdpbnMgd2hlbiBpdCBleGlzdHMuXG4gICAqL1xuICB1c2VzRW52U2VjdGlvbjogYm9vbGVhbjtcbn1cblxuaW50ZXJmYWNlIFJhd1dyYW5nbGVyQ29uZmlnIHtcbiAgbmFtZT86IHN0cmluZztcbiAgYWNjb3VudF9pZD86IHN0cmluZztcbiAgdmFycz86IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICBkMV9kYXRhYmFzZXM/OiBXcmFuZ2xlckQxRGF0YWJhc2VbXTtcbiAgYXNzZXRzPzogdW5rbm93bjtcbiAgbG9nZndkcj86IHVua25vd247XG4gIHdhc21fbW9kdWxlcz86IHVua25vd247XG4gIHRleHRfYmxvYnM/OiB1bmtub3duO1xuICBkYXRhX2Jsb2JzPzogdW5rbm93bjtcbiAgc2l0ZT86IHVua25vd247XG4gIHNlY3JldHM/OiB7IHJlcXVpcmVkPzogc3RyaW5nW10gfTtcbiAgZW52PzogUmVjb3JkPHN0cmluZywgUmF3V3JhbmdsZXJDb25maWc+O1xufVxuXG4vLyBXb3JrZXJzIFNpdGVzIGltcGxpY2l0bHkgYmluZHMgaXRzIEtWIG5hbWVzcGFjZSBhcyBfX1NUQVRJQ19DT05URU5ULlxuZnVuY3Rpb24gc2l0ZUJpbmRpbmdOYW1lcyhjb25maWc6IFJhd1dyYW5nbGVyQ29uZmlnLCBlbnZDb25maWc/OiBSYXdXcmFuZ2xlckNvbmZpZyk6IHN0cmluZ1tdIHtcbiAgcmV0dXJuIChlbnZDb25maWc/LnNpdGUgPz8gY29uZmlnLnNpdGUpID8gWydfX1NUQVRJQ19DT05URU5UJ10gOiBbXTtcbn1cblxuLyoqXG4gKiBSZXNvbHZlIHRoZSB3cmFuZ2xlciBjb25maWcgdmFsdWVzIG5lZWRlZCBmb3IgZGVwbG95aW5nIHRvIHRoZSBnaXZlbiBlbnZpcm9ubWVudC5cbiAqIEZvbGxvd3Mgd3JhbmdsZXIncyBpbmhlcml0YW5jZSBydWxlczogYGFjY291bnRfaWRgIGlzIGluaGVyaXRlZCBieSBuYW1lZCBlbnZpcm9ubWVudHMsXG4gKiB3aGlsZSBgdmFyc2AgYW5kIGBkMV9kYXRhYmFzZXNgIGFyZSBub3QgYW5kIG11c3QgYmUgcmVkZWNsYXJlZCBwZXIgZW52aXJvbm1lbnQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZXNvbHZlV3JhbmdsZXJDb25maWdGb3JFbnYoXG4gIHByb2plY3Q6IFBpY2s8UHJvamVjdCwgJ2RpclBhdGgnPixcbiAgZW52TmFtZTogc3RyaW5nXG4pOiBSZXNvbHZlZFdyYW5nbGVyQ29uZmlnIHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgY29uZmlnUGF0aCA9IGZpbmRXcmFuZ2xlckNvbmZpZ1BhdGgocHJvamVjdCk7XG4gIGlmICghY29uZmlnUGF0aCkgcmV0dXJuO1xuICBpZiAocGF0aC5leHRuYW1lKGNvbmZpZ1BhdGgpID09PSAnLnRvbWwnKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCd3YiBkZXBsb3kgc3VwcG9ydHMgd3JhbmdsZXIuanNvbmMvd3JhbmdsZXIuanNvbiBjb25maWdzIG9ubHk7IG1pZ3JhdGUgd3JhbmdsZXIudG9tbCBmaXJzdC4nKTtcbiAgfVxuXG4gIC8vIGpzb25jLXBhcnNlciBpcyBmYXVsdCB0b2xlcmFudCBhbmQgd291bGQgcmV0dXJuIGEgcGFydGlhbCBvYmplY3QgZm9yIG1hbGZvcm1lZCBpbnB1dCxcbiAgLy8gd2hpY2ggY291bGQgbWlncmF0ZSBhIHJlbW90ZSBkYXRhYmFzZSBmcm9tIGEgaGFsZi1yZWFkIGNvbmZpZzsgcmVqZWN0IGFueSBwYXJzZSBlcnJvci5cbiAgY29uc3QgcGFyc2VFcnJvcnM6IFBhcnNlRXJyb3JbXSA9IFtdO1xuICBjb25zdCBjb25maWcgPSBwYXJzZShmcy5yZWFkRmlsZVN5bmMoY29uZmlnUGF0aCwgJ3V0ZjgnKSwgcGFyc2VFcnJvcnMsIHtcbiAgICBhbGxvd1RyYWlsaW5nQ29tbWE6IHRydWUsXG4gIH0pIGFzIFJhd1dyYW5nbGVyQ29uZmlnIHwgdW5kZWZpbmVkO1xuICBpZiAocGFyc2VFcnJvcnMubGVuZ3RoID4gMCkge1xuICAgIHRocm93IG5ldyBFcnJvcihgRmFpbGVkIHRvIHBhcnNlICR7Y29uZmlnUGF0aH06ICR7cGFyc2VFcnJvcnMubGVuZ3RofSBKU09OQyBzeW50YXggZXJyb3IocykuYCk7XG4gIH1cbiAgaWYgKCFjb25maWcpIHJldHVybjtcblxuICBjb25zdCBlbnZDb25maWcgPSBjb25maWcuZW52Py5bZW52TmFtZV07XG4gIGlmICghZW52Q29uZmlnICYmIGVudk5hbWUgIT09ICdwcm9kdWN0aW9uJykge1xuICAgIHRocm93IG5ldyBFcnJvcihgVGhlIHdyYW5nbGVyIGNvbmZpZyBoYXMgbm8gXCJlbnZcIjogeyBcIiR7ZW52TmFtZX1cIjogLi4uIH0gc2VjdGlvbi5gKTtcbiAgfVxuICByZXR1cm4gZW52Q29uZmlnXG4gICAgPyB7XG4gICAgICAgIHdvcmtlck5hbWU6IGVudkNvbmZpZy5uYW1lID8/IChjb25maWcubmFtZSA/IGAke2NvbmZpZy5uYW1lfS0ke2Vudk5hbWV9YCA6IHVuZGVmaW5lZCksXG4gICAgICAgIGFjY291bnRJZDogZW52Q29uZmlnLmFjY291bnRfaWQgPz8gY29uZmlnLmFjY291bnRfaWQsXG4gICAgICAgIHZhcktleXM6IE9iamVjdC5rZXlzKGVudkNvbmZpZy52YXJzID8/IHt9KSxcbiAgICAgICAgdmFyczogZW52Q29uZmlnLnZhcnMgPz8ge30sXG4gICAgICAgIC8vIE1vc3QgYmluZGluZ3MgYXJlIG5vbi1pbmhlcml0YWJsZSBhbmQgbXVzdCBiZSByZWRlY2xhcmVkIHBlciBlbnZpcm9ubWVudCwgc28gb25seSB0aGVcbiAgICAgICAgLy8gZW52aXJvbm1lbnQncyBvd24gbmFtZXMgY291bnQg4oCUIHBsdXMgdGhlIGdlbnVpbmVseSBpbmhlcml0ZWQgc2hhcGVzIChhc3NldHMsIGxvZ2Z3ZHIpLFxuICAgICAgICAvLyB3aGljaCB3cmFuZ2xlciByZXNvbHZlcyBhcyB3aG9sZSBmaWVsZHM6IHRoZSBlbnZpcm9ubWVudCdzIG93biBmaWVsZCBvdmVycmlkZXMgdGhlXG4gICAgICAgIC8vIHRvcCBsZXZlbCBlbnRpcmVseSwgc28gb25seSB0aGUgZWZmZWN0aXZlIHZhbHVlJ3MgbmFtZXMgY291bnQuXG4gICAgICAgIGJpbmRpbmdOYW1lczogW1xuICAgICAgICAgIC4uLmNvbGxlY3RCaW5kaW5nTmFtZXMoXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIGFzc2V0czogZW52Q29uZmlnLmFzc2V0cyA/PyBjb25maWcuYXNzZXRzLFxuICAgICAgICAgICAgICBsb2dmd2RyOiBlbnZDb25maWcubG9nZndkciA/PyBjb25maWcubG9nZndkcixcbiAgICAgICAgICAgICAgd2FzbV9tb2R1bGVzOiBlbnZDb25maWcud2FzbV9tb2R1bGVzID8/IGNvbmZpZy53YXNtX21vZHVsZXMsXG4gICAgICAgICAgICAgIHRleHRfYmxvYnM6IGVudkNvbmZpZy50ZXh0X2Jsb2JzID8/IGNvbmZpZy50ZXh0X2Jsb2JzLFxuICAgICAgICAgICAgICBkYXRhX2Jsb2JzOiBlbnZDb25maWcuZGF0YV9ibG9icyA/PyBjb25maWcuZGF0YV9ibG9icyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBjb2xsZWN0QmluZGluZ05hbWVzKGVudkNvbmZpZylcbiAgICAgICAgICApLFxuICAgICAgICAgIC4uLnNpdGVCaW5kaW5nTmFtZXMoY29uZmlnLCBlbnZDb25maWcpLFxuICAgICAgICBdLFxuICAgICAgICBkMURhdGFiYXNlczogZW52Q29uZmlnLmQxX2RhdGFiYXNlcyA/PyBbXSxcbiAgICAgICAgLy8gYHNlY3JldHNgIGlzIG5vbi1pbmhlcml0YWJsZTogYSB0b3AtbGV2ZWwgcmVxdWlyZW1lbnQgbXVzdCBub3QgZm9yY2UgKG9yIHVwbG9hZClcbiAgICAgICAgLy8gYSBzZWNyZXQgaW50byBhIG5hbWVkIGVudmlyb25tZW50LlxuICAgICAgICByZXF1aXJlZFNlY3JldE5hbWVzOiBlbnZDb25maWcuc2VjcmV0cz8ucmVxdWlyZWQgPz8gW10sXG4gICAgICAgIHVzZXNFbnZTZWN0aW9uOiB0cnVlLFxuICAgICAgfVxuICAgIDoge1xuICAgICAgICB3b3JrZXJOYW1lOiBjb25maWcubmFtZSxcbiAgICAgICAgYWNjb3VudElkOiBjb25maWcuYWNjb3VudF9pZCxcbiAgICAgICAgdmFyS2V5czogT2JqZWN0LmtleXMoY29uZmlnLnZhcnMgPz8ge30pLFxuICAgICAgICB2YXJzOiBjb25maWcudmFycyA/PyB7fSxcbiAgICAgICAgYmluZGluZ05hbWVzOiBbLi4uY29sbGVjdEJpbmRpbmdOYW1lcyhjb25maWcpLCAuLi5zaXRlQmluZGluZ05hbWVzKGNvbmZpZyldLFxuICAgICAgICBkMURhdGFiYXNlczogY29uZmlnLmQxX2RhdGFiYXNlcyA/PyBbXSxcbiAgICAgICAgcmVxdWlyZWRTZWNyZXROYW1lczogY29uZmlnLnNlY3JldHM/LnJlcXVpcmVkID8/IFtdLFxuICAgICAgICB1c2VzRW52U2VjdGlvbjogZmFsc2UsXG4gICAgICB9O1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHsgcmVhZEVudmlyb25tZW50VmFyaWFibGVzIH0gZnJvbSAnQHdpbGxib29zdGVyL3NoYXJlZC1saWItbm9kZS9zcmMnO1xuaW1wb3J0IGNoYWxrIGZyb20gJ2NoYWxrJztcbmltcG9ydCB7IHBhcnNlIGFzIHBhcnNlRG90ZW52IH0gZnJvbSAnZG90ZW52JztcbmltcG9ydCB0eXBlIHsgQXJndW1lbnRzQ2FtZWxDYXNlLCBBcmd2LCBDb21tYW5kTW9kdWxlLCBJbmZlcnJlZE9wdGlvblR5cGVzIH0gZnJvbSAneWFyZ3MnO1xuXG5pbXBvcnQgdHlwZSB7IFByb2plY3QgfSBmcm9tICcuLi9wcm9qZWN0LmpzJztcbmltcG9ydCB7IGZpbmRTZWxmUHJvamVjdCB9IGZyb20gJy4uL3Byb2plY3QuanMnO1xuaW1wb3J0IHR5cGUgeyBzaGFyZWRPcHRpb25zQnVpbGRlciB9IGZyb20gJy4uL3NoYXJlZE9wdGlvbnNCdWlsZGVyLmpzJztcblxuLy8gQ2xvdWRmbGFyZSBXb3JrZXJzIGRvbid0IHNlZSB0aGUgcHJvY2VzcyBlbnZpcm9ubWVudDsgd3JhbmdsZXIgZGV2IHJlYWRzIHZhcnMgZnJvbSBhIC5kZXYudmFyc1xuLy8gZmlsZSBuZXh0IHRvIGl0cyBjb25maWcgZmlsZSBpbnN0ZWFkLiBUaGlzIGNvbW1hbmQgYnJpZGdlcyB3Yi1tYW5hZ2VkIC5lbnYgZmlsZXMgdG8gdGhhdCBmaWxlLlxuY29uc3QgYnVpbGRlciA9IHt9IGFzIGNvbnN0O1xuXG50eXBlIEdlbkRldlZhcnNDb21tYW5kT3B0aW9ucyA9IEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIGJ1aWxkZXIgJiB0eXBlb2Ygc2hhcmVkT3B0aW9uc0J1aWxkZXI+O1xudHlwZSBHZW5EZXZWYXJzQ29tbWFuZEFyZ3YgPSBBcmd1bWVudHNDYW1lbENhc2U8R2VuRGV2VmFyc0NvbW1hbmRPcHRpb25zICYgeyBwYXRoPzogc3RyaW5nIH0+O1xuXG5leHBvcnQgY29uc3QgZ2VuRGV2VmFyc0NvbW1hbmQ6IENvbW1hbmRNb2R1bGU8dW5rbm93biwgR2VuRGV2VmFyc0NvbW1hbmRPcHRpb25zPiA9IHtcbiAgY29tbWFuZDogJ2dlbi1kZXYtdmFycyBbcGF0aF0nLFxuICBkZXNjcmliZTpcbiAgICAnR2VuZXJhdGUgYSAuZGV2LnZhcnMgZmlsZSBmb3IgYHdyYW5nbGVyIGRldmAgZnJvbSB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGVzIGxvYWRlZCBmcm9tIC5lbnYgZmlsZXMgKHBsdXMgV0JfRU5WIGFuZCBORVhUX1BVQkxJQ19XQl9FTlYpLicsXG4gIGJ1aWxkZXI6ICh5YXJncykgPT5cbiAgICB5YXJncy5wb3NpdGlvbmFsKCdwYXRoJywge1xuICAgICAgZGVzY3JpcHRpb246ICdPdXRwdXQgcGF0aCBvZiB0aGUgZ2VuZXJhdGVkIC5kZXYudmFycyBmaWxlLicsXG4gICAgICB0eXBlOiAnc3RyaW5nJyxcbiAgICAgIGRlZmF1bHQ6ICcuZGV2LnZhcnMnLFxuICAgIH0pIGFzIHVua25vd24gYXMgQXJndjxHZW5EZXZWYXJzQ29tbWFuZE9wdGlvbnM+LFxuICBhc3luYyBoYW5kbGVyKGFyZ3Y6IEdlbkRldlZhcnNDb21tYW5kQXJndikge1xuICAgIGNvbnN0IHByb2plY3QgPSBmaW5kU2VsZlByb2plY3QoYXJndik7XG4gICAgaWYgKCFwcm9qZWN0KSB7XG4gICAgICBjb25zb2xlLmVycm9yKGNoYWxrLnJlZCgnTm8gcHJvamVjdCBmb3VuZC4nKSk7XG4gICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgfVxuXG4gICAgLy8gUmVzdHJpY3QgdG8gdGhlIHZhcmlhYmxlcyBsb2FkZWQgZnJvbSAuZW52IGZpbGVzICh3YidzIGVudmlyb25tZW50IGNvbnRyYWN0KSBzbyB0aGF0XG4gICAgLy8gdW5yZWxhdGVkIHByb2Nlc3MgZW52aXJvbm1lbnQgdmFyaWFibGVzIG5ldmVyIGxlYWsgaW50byB0aGUgZ2VuZXJhdGVkIGZpbGUuIElnbm9yZVxuICAgIC8vIHByb2Nlc3MuZW52IGJlY2F1c2UgdGhlIHBhcmVudCB3YiBwcm9jZXNzIGluamVjdHMgdGhlIC5lbnYgdmFsdWVzIGludG8gaXQsIHdoaWNoIHdvdWxkXG4gICAgLy8gb3RoZXJ3aXNlIHN1cHByZXNzIGxvYWRpbmcgdGhlbSBoZXJlLlxuICAgIGNvbnN0IFtlbnZWYXJzXSA9IHJlYWRFbnZpcm9ubWVudFZhcmlhYmxlcyhhcmd2LCBwcm9qZWN0LmRpclBhdGgsIHsgaWdub3JlUHJvY2Vzc0VudjogdHJ1ZSB9KTtcbiAgICAvLyBFeHBsaWNpdGx5IGV4cG9ydGVkIGVudmlyb25tZW50IHZhcmlhYmxlcyBtdXN0IHdpbiBvdmVyIGRvdGVudiB2YWx1ZXMgZm9yIGZpbGUtZGVmaW5lZFxuICAgIC8vIGtleXMgKHByb2plY3QuZW52IGFwcGxpZXMgdGhhdCBwcmVjZWRlbmNlKSwgb3IgYEFVVEhfU0VDUkVUPS4uLiB3YiBzdGFydGAgd291bGQgc2VydmVcbiAgICAvLyB0aGUgc3RhbGUgZmlsZSB2YWx1ZS4gQW4gZXhwb3J0IHRoYXQgZW1wdGllcyBhIG5vbi1lbXB0eSBmaWxlIHZhbHVlIGlzIGRlbGliZXJhdGUgYW5kXG4gICAgLy8gbXVzdCBzdXJ2aXZlIHRoZSBlbXB0eS12YWx1ZSBmaWx0ZXIgYmVsb3cgKHVubGlrZSBgS0VZPWAgcGxhY2Vob2xkZXJzIGluIC5lbnYgZmlsZXMsXG4gICAgLy8gd2hpY2ggc3RheSBvbWl0dGVkIHNvIHRoZXkgY2Fubm90IG92ZXJyaWRlIHdyYW5nbGVyIGB2YXJzYCB3aXRoIGVtcHR5IHN0cmluZ3MpLlxuICAgIGNvbnN0IGV4cGxpY2l0bHlFbXB0aWVkS2V5cyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICAgIGZvciAoY29uc3Qga2V5IG9mIE9iamVjdC5rZXlzKGVudlZhcnMpKSB7XG4gICAgICBjb25zdCBlZmZlY3RpdmVWYWx1ZSA9IHByb2plY3QuZW52W2tleV07XG4gICAgICBpZiAoZWZmZWN0aXZlVmFsdWUgPT09IHVuZGVmaW5lZCkgY29udGludWU7XG4gICAgICBpZiAoZWZmZWN0aXZlVmFsdWUgPT09ICcnICYmIGVudlZhcnNba2V5XSAhPT0gJycpIGV4cGxpY2l0bHlFbXB0aWVkS2V5cy5hZGQoa2V5KTtcbiAgICAgIGVudlZhcnNba2V5XSA9IGVmZmVjdGl2ZVZhbHVlO1xuICAgIH1cbiAgICAvLyBTdXBwbGVtZW50IHdpdGggcHJvY2VzcyBlbnZpcm9ubWVudCB2YWx1ZXMgZm9yIHRoZSBrZXlzIG5hbWVkIGluIC5lbnYuZXhhbXBsZTogQ0kgb2Z0ZW5cbiAgICAvLyBwcm92aWRlcyB0aGVtIGFzIHdvcmtmbG93IGVudiBpbnN0ZWFkIG9mIC5lbnYgZmlsZXMgKHN0aWxsIGFuIGFsbG93bGlzdCwgc28gdW5yZWxhdGVkXG4gICAgLy8gcHJvY2VzcyBlbnZpcm9ubWVudCB2YXJpYWJsZXMgY2Fubm90IGxlYWspLlxuICAgIGZvciAoY29uc3Qga2V5IG9mIFsuLi5yZWFkRW52RXhhbXBsZUtleXMocHJvamVjdCksICdXQl9FTlYnLCAnTkVYVF9QVUJMSUNfV0JfRU5WJ10pIHtcbiAgICAgIGNvbnN0IGVmZmVjdGl2ZVZhbHVlID0gcHJvamVjdC5lbnZba2V5XTtcbiAgICAgIGlmIChlbnZWYXJzW2tleV0gfHwgZWZmZWN0aXZlVmFsdWUgPT09IHVuZGVmaW5lZCkgY29udGludWU7XG4gICAgICBpZiAoZW52VmFyc1trZXldID09PSB1bmRlZmluZWQgJiYgZWZmZWN0aXZlVmFsdWUgPT09ICcnKSBleHBsaWNpdGx5RW1wdGllZEtleXMuYWRkKGtleSk7XG4gICAgICBlbnZWYXJzW2tleV0gPSBlZmZlY3RpdmVWYWx1ZTtcbiAgICB9XG5cbiAgICBjb25zdCBsaW5lcyA9IE9iamVjdC5lbnRyaWVzKGVudlZhcnMpXG4gICAgICAuZmlsdGVyKChba2V5LCB2YWx1ZV0pID0+IHZhbHVlICE9PSAnJyB8fCBleHBsaWNpdGx5RW1wdGllZEtleXMuaGFzKGtleSkpXG4gICAgICAudG9Tb3J0ZWQoKFthXSwgW2JdKSA9PiBhLmxvY2FsZUNvbXBhcmUoYikpXG4gICAgICAubWFwKChba2V5LCB2YWx1ZV0pID0+IGAke2tleX09JHtxdW90ZURvdGVudlZhbHVlKGtleSwgdmFsdWUpfWApO1xuICAgIGNvbnN0IG91dHB1dFBhdGggPSBwYXRoLnJlc29sdmUocHJvamVjdC5kaXJQYXRoLCBhcmd2LnBhdGggPz8gJy5kZXYudmFycycpO1xuICAgIGlmIChhcmd2LmRyeVJ1bikge1xuICAgICAgY29uc29sZS5pbmZvKGNoYWxrLmN5YW4oYFdvdWxkIGdlbmVyYXRlICR7b3V0cHV0UGF0aH0gd2l0aCAke2xpbmVzLmxlbmd0aH0gZW52aXJvbm1lbnQgdmFyaWFibGVzLmApKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBmcy5ta2RpclN5bmMocGF0aC5kaXJuYW1lKG91dHB1dFBhdGgpLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgICBmcy53cml0ZUZpbGVTeW5jKG91dHB1dFBhdGgsIGxpbmVzLmpvaW4oJ1xcbicpICsgJ1xcbicpO1xuICAgIGNvbnNvbGUuaW5mbyhjaGFsay5ncmVlbihgR2VuZXJhdGVkICR7b3V0cHV0UGF0aH0gd2l0aCAke2xpbmVzLmxlbmd0aH0gZW52aXJvbm1lbnQgdmFyaWFibGVzLmApKTtcbiAgfSxcbn07XG5cbmV4cG9ydCBmdW5jdGlvbiByZWFkRW52RXhhbXBsZUtleXMocHJvamVjdDogUHJvamVjdCk6IHN0cmluZ1tdIHtcbiAgbGV0IGVudkV4YW1wbGVQYXRoOiBzdHJpbmc7XG4gIHRyeSB7XG4gICAgZW52RXhhbXBsZVBhdGggPSBwcm9qZWN0LmZpbmRGaWxlKCcuZW52LmV4YW1wbGUnKTtcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIFtdO1xuICB9XG4gIC8vIGRvdGVudidzIG93biBwYXJzZXIgY292ZXJzIGBleHBvcnQgS0VZPWAgcHJlZml4ZXMgYW5kIHdoaXRlc3BhY2UgYXJvdW5kIGA9YCxcbiAgLy8gd2hpY2ggYSBsaW5lIHJlZ2V4IHdvdWxkIHNpbGVudGx5IG1pc3MuXG4gIHJldHVybiBPYmplY3Qua2V5cyhwYXJzZURvdGVudihmcy5yZWFkRmlsZVN5bmMoZW52RXhhbXBsZVBhdGgsICd1dGY4JykpKTtcbn1cblxuLyoqXG4gKiBRdW90ZSBhIHZhbHVlIGZvciBkb3RlbnYgKHdoaWNoIHdyYW5nbGVyIHVzZXMgZm9yIC5kZXYudmFycykuIEV2ZXJ5IGNhbmRpZGF0ZSByZXByZXNlbnRhdGlvblxuICogaXMgdmVyaWZpZWQgYnkgYWN0dWFsbHkgcGFyc2luZyBpdCBiYWNrIChvdXIgZG90ZW52IHBhcnNlciBtYXRjaGVzIHdyYW5nbGVyJ3MgYnVuZGxlZCBkb3RlbnZcbiAqIDE2IGZvciB0aGVzZSBjb25zdHJ1Y3RzKSwgc28gYSB2YWx1ZSBpcyBlaXRoZXIgc2VyaWFsaXplZCBsb3NzbGVzc2x5IG9yIHJlamVjdGVkIOKAlCBuZXZlclxuICogc2lsZW50bHkgY29ycnVwdGVkLiBDYW5kaWRhdGVzOiBzaW5nbGUgcXVvdGVzIChsaXRlcmFsIHNwYW47IGNsb3NlZCBlYXJseSBieSBhbiBhcG9zdHJvcGhlKSxcbiAqIGJhY2t0aWNrcyAoZXF1YWxseSBsaXRlcmFsKSwgdGhlbiBkb3VibGUgcXVvdGVzIHdpdGggZXNjYXBlZCBuZXdsaW5lcy9DUnMgKGRvdGVudiBkb2VzIG5vdFxuICogdW5lc2NhcGUgaW5uZXIgXFxcIiDigJQgYSBgI2AgYWZ0ZXIgYW4gZW1iZWRkZWQgcXVvdGUgc3RhcnRzIGEgY29tbWVudCwgd2hpY2ggdGhlIHJvdW5kLXRyaXBcbiAqIGNoZWNrIGNhdGNoZXMgYW5kIHJlamVjdHMpLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcXVvdGVEb3RlbnZWYWx1ZShrZXk6IHN0cmluZywgdmFsdWU6IHN0cmluZyk6IHN0cmluZyB7XG4gIGNvbnN0IGRvdWJsZVF1b3RlZEJvZHkgPSB2YWx1ZS5yZXBsYWNlQWxsKCdcXG4nLCBTdHJpbmcucmF3YFxcbmApLnJlcGxhY2VBbGwoJ1xccicsIFN0cmluZy5yYXdgXFxyYCk7XG4gIGNvbnN0IGNhbmRpZGF0ZXMgPSBbYCcke3ZhbHVlfSdgLCBgXFxgJHt2YWx1ZX1cXGBgLCBgXCIke2RvdWJsZVF1b3RlZEJvZHl9XCJgXTtcbiAgZm9yIChjb25zdCBjYW5kaWRhdGUgb2YgY2FuZGlkYXRlcykge1xuICAgIGlmIChwYXJzZURvdGVudihgJHtrZXl9PSR7Y2FuZGlkYXRlfWApW2tleV0gPT09IHZhbHVlKSByZXR1cm4gY2FuZGlkYXRlO1xuICB9XG4gIHRocm93IG5ldyBFcnJvcihgVGhlIHZhbHVlIG9mICR7a2V5fSBjYW5ub3QgYmUgbG9zc2xlc3NseSBzZXJpYWxpemVkIGludG8gLmRldi52YXJzOyBzaW1wbGlmeSBpdHMgcXVvdGluZy5gKTtcbn1cbiIsImltcG9ydCB7IHNwYXduIH0gZnJvbSAnbm9kZTpjaGlsZF9wcm9jZXNzJztcbmltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBvcyBmcm9tICdub2RlOm9zJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB7IHJlYWRFbnZpcm9ubWVudFZhcmlhYmxlcywgc3Bhd25Bc3luYyB9IGZyb20gJ0B3aWxsYm9vc3Rlci9zaGFyZWQtbGliLW5vZGUvc3JjJztcbmltcG9ydCBjaGFsayBmcm9tICdjaGFsayc7XG5pbXBvcnQgeyBjb25maWcgfSBmcm9tICdkb3RlbnYnO1xuaW1wb3J0IHR5cGUgeyBBcmd1bWVudHNDYW1lbENhc2UsIEFyZ3YsIENvbW1hbmRNb2R1bGUsIEluZmVycmVkT3B0aW9uVHlwZXMgfSBmcm9tICd5YXJncyc7XG5cbmltcG9ydCB0eXBlIHsgUHJvamVjdCB9IGZyb20gJy4uL3Byb2plY3QuanMnO1xuaW1wb3J0IHsgZmluZFNlbGZQcm9qZWN0IH0gZnJvbSAnLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQgeyBidWlsZERyaXp6bGVLaXRDb21tYW5kIH0gZnJvbSAnLi4vc2NyaXB0cy9kcml6emxlU2NyaXB0cy5qcyc7XG5pbXBvcnQgeyBydW5XaXRoU3Bhd24gfSBmcm9tICcuLi9zY3JpcHRzL3J1bi5qcyc7XG5pbXBvcnQgdHlwZSB7IHNoYXJlZE9wdGlvbnNCdWlsZGVyIH0gZnJvbSAnLi4vc2hhcmVkT3B0aW9uc0J1aWxkZXIuanMnO1xuaW1wb3J0IHsgaXNDSSB9IGZyb20gJy4uL3V0aWxzL2NpLmpzJztcbmltcG9ydCB7IGJ1aWxkU2hlbGxFbnZpcm9ubWVudEFzc2lnbm1lbnQsIHNoZWxsRXNjYXBlQXJndW1lbnQgfSBmcm9tICcuLi91dGlscy9zaGVsbC5qcyc7XG5pbXBvcnQgeyBmaW5kV3JhbmdsZXJDb25maWdQYXRoIH0gZnJvbSAnLi4vdXRpbHMvd3JhbmdsZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBSZXNvbHZlZFdyYW5nbGVyQ29uZmlnLCBXcmFuZ2xlckQxRGF0YWJhc2UgfSBmcm9tICcuLi91dGlscy93cmFuZ2xlckNvbmZpZy5qcyc7XG5pbXBvcnQgeyByZXNvbHZlV3JhbmdsZXJDb25maWdGb3JFbnYsIHVzZXNXcmFuZ2xlck5hdGl2ZU1pZ3JhdGlvbnMgfSBmcm9tICcuLi91dGlscy93cmFuZ2xlckNvbmZpZy5qcyc7XG5cbmltcG9ydCB7IHJlYWRFbnZFeGFtcGxlS2V5cyB9IGZyb20gJy4vZ2VuRGV2VmFycy5qcyc7XG5cbi8qKlxuICogS2V5cyB0aGF0IGRyaXZlIHRoZSBkZXBsb3kgaXRzZWxmIChvciBhcmUgbWVhbmluZ2Z1bCBvbmx5IGxvY2FsbHkpIGFuZCB0aHVzIG11c3QgbmV2ZXIgYmVcbiAqIHB1c2hlZCB0byB0aGUgV29ya2VyIGFzIHNlY3JldHMuIGBXQl9FTlZgIC8gYE5FWFRfUFVCTElDX1dCX0VOVmAgYmVsb25nIGluIHdyYW5nbGVyIGB2YXJzYC5cbiAqL1xuY29uc3QgTk9OX1NFQ1JFVF9LRVlTID0gbmV3IFNldChbXG4gICdDSScsXG4gIC8vIFdyYW5nbGVyIHN5c3RlbS9hdXRoZW50aWNhdGlvbiB2YXJpYWJsZXMgKGh0dHBzOi8vZGV2ZWxvcGVycy5jbG91ZGZsYXJlLmNvbS93b3JrZXJzL3dyYW5nbGVyL3N5c3RlbS1lbnZpcm9ubWVudC12YXJpYWJsZXMvKSxcbiAgLy8gaW5jbHVkaW5nIGxlZ2FjeSBhbGlhc2VzOyBhcHAtc3BlY2lmaWMgbmFtZXMgc3VjaCBhcyBDTE9VREZMQVJFX1IyX0FDQ0VTU19LRVlfSUQgc3RheSBlbGlnaWJsZS5cbiAgJ0NGX0FDQ09VTlRfSUQnLFxuICAnQ0ZfQVBJX0JBU0VfVVJMJyxcbiAgJ0NGX0FQSV9FTUFJTCcsXG4gICdDRl9BUElfS0VZJyxcbiAgJ0NGX0FQSV9UT0tFTicsXG4gICdDRl9FTUFJTCcsXG4gICdDTE9VREZMQVJFX0FDQ0VTU19DTElFTlRfSUQnLFxuICAnQ0xPVURGTEFSRV9BQ0NFU1NfQ0xJRU5UX1NFQ1JFVCcsXG4gICdDTE9VREZMQVJFX0FDQ09VTlRfSUQnLFxuICAnQ0xPVURGTEFSRV9BUElfQkFTRV9VUkwnLFxuICAnQ0xPVURGTEFSRV9BUElfS0VZJyxcbiAgJ0NMT1VERkxBUkVfQVBJX1RPS0VOJyxcbiAgJ0NMT1VERkxBUkVfQVVUSF9VU0VfS0VZUklORycsXG4gICdDTE9VREZMQVJFX0QxX0RBVEFCQVNFX0lEJyxcbiAgJ0NMT1VERkxBUkVfRU1BSUwnLFxuICAnQ0xPVURGTEFSRV9FTlYnLFxuICAnQ0xPVURGTEFSRV9JTkNMVURFX1BST0NFU1NfRU5WJyxcbiAgJ0NMT1VERkxBUkVfTE9BRF9ERVZfVkFSU19GUk9NX0RPVF9FTlYnLFxuICAnRE9DS0VSX0hPU1QnLFxuICAnSFRUUF9QUk9YWScsXG4gICdIVFRQU19QUk9YWScsXG4gICdodHRwX3Byb3h5JyxcbiAgJ2h0dHBzX3Byb3h5JyxcbiAgJ0ZPUkNFX0NPTE9SJyxcbiAgJ01JTklGTEFSRV9DQUNIRV9ESVInLFxuICAnTUlTRV9FTlYnLFxuICAnTk9fQ09MT1InLFxuICAnTkVYVF9QVUJMSUNfV0JfRU5WJyxcbiAgJ05FWFRfUFVCTElDX1dCX1ZFUlNJT04nLFxuICAnTk9ERV9FTlYnLFxuICAnUE9SVCcsXG4gICdXQl9FTlYnLFxuICAnV0JfVkVSU0lPTicsXG5dKTtcblxuY29uc3QgTk9OX1NFQ1JFVF9LRVlfUFJFRklYRVMgPSBbJ1dSQU5HTEVSXycsICdDTE9VREZMQVJFX0hZUEVSRFJJVkVfTE9DQUxfQ09OTkVDVElPTl9TVFJJTkdfJywgJ0NMT1VERkxBUkVfQ0ZfRkVUQ0hfJ107XG5cbmZ1bmN0aW9uIGlzTm9uU2VjcmV0S2V5KGtleTogc3RyaW5nKTogYm9vbGVhbiB7XG4gIHJldHVybiBOT05fU0VDUkVUX0tFWVMuaGFzKGtleSkgfHwgTk9OX1NFQ1JFVF9LRVlfUFJFRklYRVMuc29tZSgocHJlZml4KSA9PiBrZXkuc3RhcnRzV2l0aChwcmVmaXgpKTtcbn1cblxuY29uc3QgYnVpbGRlciA9IHt9IGFzIGNvbnN0O1xuXG50eXBlIERlcGxveUNvbW1hbmRPcHRpb25zID0gSW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgYnVpbGRlciAmIHR5cGVvZiBzaGFyZWRPcHRpb25zQnVpbGRlcj47XG50eXBlIERlcGxveUNvbW1hbmRBcmd2ID0gQXJndW1lbnRzQ2FtZWxDYXNlPERlcGxveUNvbW1hbmRPcHRpb25zPjtcblxuZXhwb3J0IGNvbnN0IGRlcGxveUNvbW1hbmQ6IENvbW1hbmRNb2R1bGU8dW5rbm93biwgRGVwbG95Q29tbWFuZE9wdGlvbnM+ID0ge1xuICBjb21tYW5kOiAnZGVwbG95JyxcbiAgZGVzY3JpYmU6XG4gICAgJ0RlcGxveSBhIENsb3VkZmxhcmUgV29ya2VycyBhcHAgKHZpbmV4dCBvciBwbGFpbiBXb3JrZXIpIHRvIHRoZSBXQl9FTlYgZW52aXJvbm1lbnQ6IHZhbGlkYXRlIHNlY3JldHMsIGJ1aWxkLCBhcHBseSByZW1vdGUgRDEgbWlncmF0aW9ucywgdGhlbiBkZXBsb3kgY29kZSBhbmQgc2VjcmV0cyBhdG9taWNhbGx5LicsXG4gIGJ1aWxkZXI6ICh5YXJncykgPT4geWFyZ3MgYXMgdW5rbm93biBhcyBBcmd2PERlcGxveUNvbW1hbmRPcHRpb25zPixcbiAgYXN5bmMgaGFuZGxlcihhcmd2OiBEZXBsb3lDb21tYW5kQXJndikge1xuICAgIC8vIEEgc3RyYXkgZXhwb3J0ZWQgQ0xPVURGTEFSRV9FTlYgd291bGQgYmFrZSB0aGUgd3JvbmcgZW52aXJvbm1lbnQgaW50byB0aGUgYnVpbGQgYW5kXG4gICAgLy8gYXBwbHkgdGhlIGVudmlyb25tZW50IHN1ZmZpeCB0d2ljZSBvbiBkZXBsb3k7IGl0IGlzIHJlLXNldCBleHBsaWNpdGx5IHdoZXJlIG5lZWRlZC5cbiAgICAvLyBBIGRvdGVudiBmaWxlIGRlZmluaW5nIGl0IHN0aWxsIHN1cmZhY2VzIHRocm91Z2ggcHJvamVjdC5lbnYsIHdoaWNoIHRoZSBleHBsaWNpdCBgLS1lbnZgXG4gICAgLy8gZmxhZ3MgYmVsb3cgb3ZlcnJpZGUuXG4gICAgZGVsZXRlIHByb2Nlc3MuZW52LkNMT1VERkxBUkVfRU5WO1xuXG4gICAgY29uc3QgcHJvamVjdCA9IGZpbmRTZWxmUHJvamVjdChhcmd2KTtcbiAgICBpZiAoIXByb2plY3QpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoY2hhbGsucmVkKCdObyBwcm9qZWN0IGZvdW5kLicpKTtcbiAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICB9XG4gICAgY29uc3Qgd3JhbmdsZXJDb25maWdQYXRoID0gZmluZFdyYW5nbGVyQ29uZmlnUGF0aChwcm9qZWN0KTtcbiAgICBpZiAoIXdyYW5nbGVyQ29uZmlnUGF0aCkge1xuICAgICAgY29uc29sZS5lcnJvcihjaGFsay5yZWQoJ3diIGRlcGxveSBjdXJyZW50bHkgc3VwcG9ydHMgb25seSBDbG91ZGZsYXJlIFdvcmtlcnMgYXBwcyAobm8gd3JhbmdsZXIgY29uZmlnIGZvdW5kKS4nKSk7XG4gICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgfVxuICAgIGNvbnN0IGVudk5hbWUgPSBwcm9qZWN0LmVudi5XQl9FTlY7XG4gICAgaWYgKCFlbnZOYW1lIHx8IGVudk5hbWUgPT09ICdkZXZlbG9wbWVudCcgfHwgZW52TmFtZSA9PT0gJ3Rlc3QnKSB7XG4gICAgICBjb25zb2xlLmVycm9yKFxuICAgICAgICBjaGFsay5yZWQoYFdCX0VOViBtdXN0IG5hbWUgYSBkZXBsb3kgZW52aXJvbm1lbnQgKGUuZy4gc3RhZ2luZyBvciBwcm9kdWN0aW9uKSwgYnV0IGlzICR7ZW52TmFtZX0uYClcbiAgICAgICk7XG4gICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgfVxuXG4gICAgLy8gVGhlIHZhbHVlcyBnbyBpbnRvIGJvdGggcHJvY2Vzcy5lbnYgKGluaGVyaXRlZCBieSBldmVyeXRoaW5nIHdiIHNwYXducykgYW5kIHByb2plY3QuZW52XG4gICAgLy8gKHRoZSBlbnZpcm9ubWVudCB3YiBpdHNlbGYgcmVhZHMgYW5kIHBhc3NlcyBleHBsaWNpdGx5KTsgdGhlIGxhdHRlciBpcyBhIGNhY2hlZCBzbmFwc2hvdFxuICAgIC8vIHRha2VuIGJlZm9yZSB0aGlzIHBvaW50LCBzbyB3cml0aW5nIG9ubHkgdG8gcHJvY2Vzcy5lbnYgd291bGQgbGVhdmUgd2IncyBvd24gcHJlZmxpZ2h0IOKAlFxuICAgIC8vIGFuZCBhbnkgY29tbWFuZCBzcGF3bmVkIHdpdGggcHJvamVjdC5lbnYg4oCUIHdpdGhvdXQgdGhlIHRva2VuLlxuICAgIC8vIE9ubHkgLS1pbmNsdWRlLXJvb3QtZW52IGdhdGVzIHRoZSByb290IGxvb2t1cCwgbm90IGFuIGV4cGxpY2l0IC0tZW52OiAtLWVudiByZXBsYWNlcyB0aGVcbiAgICAvLyBkb3RlbnYgVkFSSUFCTEUgc291cmNlcywgd2hpbGUgLmVudi5jbG91ZGZsYXJlIGlzIGEgY3JlZGVudGlhbCBzaWRlY2FyIHJlYWQgb3V0c2lkZSB0aGF0XG4gICAgLy8gY2FzY2FkZSAodGhlIHByb2plY3QncyBvd24gY29weSBpcyByZWFkIHJlZ2FyZGxlc3Mgb2YgLS1lbnYsIGFzIGl0IGFsd2F5cyBoYXMgYmVlbikuXG4gICAgLy8gR2F0aW5nIG9uIC0tZW52IHdvdWxkIG1ha2UgYHdiIGRlcGxveSAtLWVudiA8ZmlsZT5gIHNpbGVudGx5IHN0b3AgZmluZGluZyB0aGUgcmVwbydzIHRva2VuLlxuICAgIGNvbnN0IGNsb3VkZmxhcmVFbnZWYXJzID0gcmVhZENsb3VkZmxhcmVFbnZGaWxlcyhcbiAgICAgIHByb2plY3QuZGlyUGF0aCxcbiAgICAgIGFyZ3YuaW5jbHVkZVJvb3RFbnYgPyBwcm9qZWN0LnJvb3REaXJQYXRoIDogdW5kZWZpbmVkXG4gICAgKTtcbiAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhjbG91ZGZsYXJlRW52VmFycykpIHtcbiAgICAgIC8vID8/PSBzbyB0aGF0IGFuIGV4cGxpY2l0bHkgZXhwb3J0ZWQgZW1wdHkgdmFsdWUgc3RpbGwgd2lucyBvdmVyIHRoZSBmaWxlLlxuICAgICAgcHJvY2Vzcy5lbnZba2V5XSA/Pz0gdmFsdWU7XG4gICAgICBwcm9qZWN0LmVudltrZXldID8/PSB2YWx1ZTtcbiAgICB9XG5cbiAgICBsZXQgcmVzb2x2ZWRDb25maWc6IFJlc29sdmVkV3JhbmdsZXJDb25maWcgfCB1bmRlZmluZWQ7XG4gICAgdHJ5IHtcbiAgICAgIHJlc29sdmVkQ29uZmlnID0gcmVzb2x2ZVdyYW5nbGVyQ29uZmlnRm9yRW52KHByb2plY3QsIGVudk5hbWUpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBjb25zb2xlLmVycm9yKGNoYWxrLnJlZChTdHJpbmcoZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiBlcnJvcikpKTtcbiAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICB9XG4gICAgaWYgKCFyZXNvbHZlZENvbmZpZykge1xuICAgICAgY29uc29sZS5lcnJvcihjaGFsay5yZWQoYEZhaWxlZCB0byBwYXJzZSAke3dyYW5nbGVyQ29uZmlnUGF0aH0uYCkpO1xuICAgICAgcHJvY2Vzcy5leGl0KDEpO1xuICAgIH1cbiAgICBjb25zdCBhY2NvdW50SWQgPSByZXNvbHZlZENvbmZpZy5hY2NvdW50SWQgPz8gcHJvamVjdC5lbnYuQ0xPVURGTEFSRV9BQ0NPVU5UX0lEO1xuICAgIC8vIFByZWZlciB3cmFuZ2xlci1uYXRpdmUgbWlncmF0aW9ucyB3aGVuZXZlciB0aGUgcmVzb2x2ZWQgZW52aXJvbm1lbnQncyBEMSBiaW5kaW5ncyBoYXZlIGFuXG4gICAgLy8gZXhpc3RpbmcgbWlncmF0aW9ucyBkaXJlY3Rvcnk6IGEgZHJpenpsZS1vcm0gZGVwZW5kZW5jeSBhbG9uZSBkb2VzIG5vdCBpbXBseSB0aGUgcHJvamVjdFxuICAgIC8vIG1pZ3JhdGVzIEQxIHdpdGggZHJpenpsZS1raXQncyBkMS1odHRwIGRyaXZlciAoc29tZSBkcml6emxlIGFwcHMgdXNlIHdyYW5nbGVyLW5hdGl2ZSkuXG4gICAgY29uc3Qgd3JhbmdsZXJOYXRpdmVEMURhdGFiYXNlcyA9IHJlc29sdmVkQ29uZmlnLmQxRGF0YWJhc2VzLmZpbHRlcigoZGF0YWJhc2UpID0+XG4gICAgICB1c2VzV3JhbmdsZXJOYXRpdmVNaWdyYXRpb25zKHByb2plY3QsIGRhdGFiYXNlKVxuICAgICk7XG4gICAgaWYgKFxuICAgICAgcHJvamVjdC5oYXNEcml6emxlICYmXG4gICAgICB3cmFuZ2xlck5hdGl2ZUQxRGF0YWJhc2VzLmxlbmd0aCA+IDAgJiZcbiAgICAgIHdyYW5nbGVyTmF0aXZlRDFEYXRhYmFzZXMubGVuZ3RoIDwgcmVzb2x2ZWRDb25maWcuZDFEYXRhYmFzZXMubGVuZ3RoXG4gICAgKSB7XG4gICAgICAvLyBNaWdyYXRpbmcgb25seSB0aGUgd3JhbmdsZXItbmF0aXZlIHN1YnNldCB3b3VsZCBzaWxlbnRseSBkZXBsb3kgY29kZSBhZ2FpbnN0IHRoZVxuICAgICAgLy8gb3RoZXIsIHVubWlncmF0ZWQgZGF0YWJhc2VzLlxuICAgICAgY29uc29sZS5lcnJvcihcbiAgICAgICAgY2hhbGsucmVkKCd3YiBkZXBsb3kgZG9lcyBub3Qgc3VwcG9ydCBtaXhpbmcgd3JhbmdsZXItbmF0aXZlIGFuZCBub24tbmF0aXZlIEQxIG1pZ3JhdGlvbiBsYXlvdXRzLicpXG4gICAgICApO1xuICAgICAgcHJvY2Vzcy5leGl0KDEpO1xuICAgIH1cbiAgICBjb25zdCBkcml6emxlRDFEYXRhYmFzZSA9XG4gICAgICB3cmFuZ2xlck5hdGl2ZUQxRGF0YWJhc2VzLmxlbmd0aCA9PT0gMCAmJiBwcm9qZWN0Lmhhc0RyaXp6bGUgPyByZXNvbHZlZENvbmZpZy5kMURhdGFiYXNlc1swXSA6IHVuZGVmaW5lZDtcbiAgICBpZiAod3JhbmdsZXJOYXRpdmVEMURhdGFiYXNlcy5sZW5ndGggPT09IDAgJiYgcHJvamVjdC5oYXNEcml6emxlICYmIHJlc29sdmVkQ29uZmlnLmQxRGF0YWJhc2VzLmxlbmd0aCA+IDEpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICAgIGNoYWxrLnJlZCgnd2IgZGVwbG95IHN1cHBvcnRzIGRyaXp6bGUta2l0IG1pZ3JhdGlvbnMgb25seSBmb3IgYSBzaW5nbGUgRDEgYmluZGluZzsgZm91bmQgbXVsdGlwbGUuJylcbiAgICAgICk7XG4gICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgfVxuICAgIC8vIERyeSBydW5zIGV4ZWN1dGUgbm90aGluZyBhdXRoZW50aWNhdGVkLCBzbyB0aGV5IHNraXAgdGhlIGNyZWRlbnRpYWwgcHJlZmxpZ2h0IGVudGlyZWx5LlxuICAgIGlmICghYXJndi5kcnlSdW4pIHtcbiAgICAgIGlmIChkcml6emxlRDFEYXRhYmFzZSAmJiAhcHJvamVjdC5lbnYuQ0xPVURGTEFSRV9BUElfVE9LRU4pIHtcbiAgICAgICAgLy8gZHJpenpsZS1raXQncyBkMS1odHRwIGRyaXZlciByZXF1aXJlcyB0aGlzIHNwZWNpZmljIHRva2VuIGV2ZW4gZm9yIGxvY2FsIHJ1bnM7IGFcbiAgICAgICAgLy8gbG9jYWwgd3JhbmdsZXIgT0F1dGggbG9naW4gY292ZXJzIG9ubHkgdGhlIHdyYW5nbGVyLW5hdGl2ZSBwYXRoLlxuICAgICAgICBjb25zb2xlLmVycm9yKGNoYWxrLnJlZCgnQ0xPVURGTEFSRV9BUElfVE9LRU4gaXMgcmVxdWlyZWQgZm9yIHJlbW90ZSBkcml6emxlLWtpdCBtaWdyYXRpb25zLicpKTtcbiAgICAgICAgcHJvY2Vzcy5leGl0KDEpO1xuICAgICAgfVxuICAgICAgY29uc3QgaGFzV3JhbmdsZXJBdXRoZW50aWNhdGlvbiA9XG4gICAgICAgICEhcHJvamVjdC5lbnYuQ0xPVURGTEFSRV9BUElfVE9LRU4gfHxcbiAgICAgICAgISFwcm9qZWN0LmVudi5DRl9BUElfVE9LRU4gfHxcbiAgICAgICAgISEocHJvamVjdC5lbnYuQ0xPVURGTEFSRV9BUElfS0VZICYmIHByb2plY3QuZW52LkNMT1VERkxBUkVfRU1BSUwpIHx8XG4gICAgICAgICEhKHByb2plY3QuZW52LkNGX0FQSV9LRVkgJiYgcHJvamVjdC5lbnYuQ0ZfRU1BSUwpO1xuICAgICAgaWYgKGlzQ0kocHJvamVjdC5lbnYuQ0kpICYmICFoYXNXcmFuZ2xlckF1dGhlbnRpY2F0aW9uKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoY2hhbGsucmVkKCdXcmFuZ2xlciBhdXRoZW50aWNhdGlvbiAoZS5nLiBDTE9VREZMQVJFX0FQSV9UT0tFTikgaXMgcmVxdWlyZWQgdG8gZGVwbG95IG9uIENJLicpKTtcbiAgICAgICAgcHJvY2Vzcy5leGl0KDEpO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIEFwcC1zcGVjaWZpYyB2YWxpZGF0aW9uIGhvb2sgKGUuZy4gc2VjcmV0IHBhaXJzIHRoYXQgbXVzdCBiZSBib3RoLXNldC1vci1ib3RoLWVtcHR5KS5cbiAgICAvLyBUaGUgcmV1c2FibGUgZGVwbG95LnltbCBhbHJlYWR5IHJ1bnMgaXQgb24gQ0k7IHJ1biBpdCBoZXJlIGZvciBsb2NhbCBkZXBsb3lzLlxuICAgIGlmICghaXNDSShwcm9qZWN0LmVudi5DSSkgJiYgcHJvamVjdC5wYWNrYWdlSnNvbi5zY3JpcHRzPy5bJ2RlcGxveS9jaS1zZXR1cCddKSB7XG4gICAgICBhd2FpdCBydW5XaXRoU3Bhd24oJ1lBUk4gcnVuIGRlcGxveS9jaS1zZXR1cCcsIHByb2plY3QsIGFyZ3YpO1xuICAgIH1cblxuICAgIC8vIDEuIFJlc29sdmUgYW5kIHZhbGlkYXRlIGFsbCBzZWNyZXRzIGJlZm9yZSBhbnkgYnVpbGQgb3IgcmVtb3RlIG11dGF0aW9uLCBzbyBhIG1pc3NpbmdcbiAgICAvLyAgICBzZWNyZXQgYWJvcnRzIHRoZSBkZXBsb3kgaW5zdGVhZCBvZiBsZWF2aW5nIGEgbWlncmF0ZWQgZGF0YWJhc2UgYmVoaW5kIGFuIG9sZCBXb3JrZXIuXG4gICAgY29uc3QgW2VudlZhcnMsIGVudlNvdXJjZXNdID0gcmVhZEVudmlyb25tZW50VmFyaWFibGVzKGFyZ3YsIHByb2plY3QuZGlyUGF0aCwgeyBpZ25vcmVQcm9jZXNzRW52OiB0cnVlIH0pO1xuICAgIC8vIFJlc3RyaWN0IHRoZSBzZWNyZXRzIGRvbWFpbiB0byBrZXlzIGRlZmluZWQgaW4gdGhlIHByb2plY3QncyAuZW52IGZpbGVzOiBgbWlzZSBlbnZgXG4gICAgLy8gb3V0cHV0IChyZXBvcnRlZCBhcyBhIHBzZXVkby1zb3VyY2UpIG1peGVzIGluIGhvc3QvdG9vbCB2YXJpYWJsZXMgc3VjaCBhcyBDQVJHT19IT01FLFxuICAgIC8vIHdoaWNoIG11c3QgbmV2ZXIgYmUgdXBsb2FkZWQgYXMgV29ya2VyIHNlY3JldHMuXG4gICAgY29uc3QgZG90ZW52S2V5cyA9IG5ldyBTZXQoXG4gICAgICBlbnZTb3VyY2VzLmZpbHRlcigoW3NvdXJjZV0pID0+ICFzb3VyY2Uuc3RhcnRzV2l0aCgnbWlzZSBlbnYnKSkuZmxhdE1hcCgoWywga2V5c10pID0+IGtleXMpXG4gICAgKTtcbiAgICBmb3IgKGNvbnN0IGtleSBvZiBPYmplY3Qua2V5cyhlbnZWYXJzKSkge1xuICAgICAgaWYgKCFkb3RlbnZLZXlzLmhhcyhrZXkpKSBkZWxldGUgZW52VmFyc1trZXldO1xuICAgIH1cbiAgICBjb25zdCByZXF1aXJlZEtleXMgPSByZWFkRW52RXhhbXBsZUtleXMocHJvamVjdCk7XG4gICAgZm9yIChjb25zdCBrZXkgb2YgcmVxdWlyZWRLZXlzKSB7XG4gICAgICBlbnZWYXJzW2tleV0gPz89IHByb2plY3QuZW52W2tleV0gPz8gJyc7XG4gICAgfVxuICAgIC8vIE5hbWVzIGRlY2xhcmVkIHZpYSB3cmFuZ2xlciBgc2VjcmV0cy5yZXF1aXJlZGAgbWF5IGxpa2V3aXNlIGJlIHN1cHBsaWVkIHB1cmVseSBhc1xuICAgIC8vIGV4cG9ydGVkIGVudmlyb25tZW50IHZhcmlhYmxlcyAoZS5nLiBDSSB3b3JrZmxvdyBlbnYpIGluc3RlYWQgb2YgZG90ZW52IHZhbHVlcy5cbiAgICBmb3IgKGNvbnN0IGtleSBvZiByZXNvbHZlZENvbmZpZy5yZXF1aXJlZFNlY3JldE5hbWVzKSB7XG4gICAgICBjb25zdCBleHBvcnRlZFZhbHVlID0gcHJvamVjdC5lbnZba2V5XTtcbiAgICAgIGlmIChlbnZWYXJzW2tleV0gPT09IHVuZGVmaW5lZCAmJiBleHBvcnRlZFZhbHVlICE9PSB1bmRlZmluZWQpIGVudlZhcnNba2V5XSA9IGV4cG9ydGVkVmFsdWU7XG4gICAgfVxuICAgIC8vIEV4cGxpY2l0bHkgZXhwb3J0ZWQgZW52aXJvbm1lbnQgdmFyaWFibGVzIG11c3Qgd2luIG92ZXIgZG90ZW52IHZhbHVlcyAocHJvamVjdC5lbnYgYWxyZWFkeVxuICAgIC8vIGFwcGxpZXMgdGhhdCBwcmVjZWRlbmNlKSwgb3IgYEFVVEhfU0VDUkVUPS4uLiB3YiBkZXBsb3lgIHdvdWxkIHB1c2ggdGhlIHN0YWxlIGZpbGUgdmFsdWUuXG4gICAgZm9yIChjb25zdCBrZXkgb2YgT2JqZWN0LmtleXMoZW52VmFycykpIHtcbiAgICAgIGNvbnN0IGVmZmVjdGl2ZVZhbHVlID0gcHJvamVjdC5lbnZba2V5XTtcbiAgICAgIGlmIChlZmZlY3RpdmVWYWx1ZSAhPT0gdW5kZWZpbmVkKSBlbnZWYXJzW2tleV0gPSBlZmZlY3RpdmVWYWx1ZTtcbiAgICB9XG4gICAgY29uc3QgeyBtaXNzaW5nS2V5cywgc2VjcmV0cyB9ID0gc2VsZWN0V29ya2VyU2VjcmV0cyhcbiAgICAgIGVudlZhcnMsXG4gICAgICBbLi4ucmVzb2x2ZWRDb25maWcudmFyS2V5cywgLi4ucmVzb2x2ZWRDb25maWcuYmluZGluZ05hbWVzXSxcbiAgICAgIHJlcXVpcmVkS2V5c1xuICAgICk7XG4gICAgLy8gYC0tdmFyIFdCX1ZFUlNJT046Li4uYCB0YWtlcyBwcmVjZWRlbmNlIG92ZXIgY29uZmlndXJhdGlvbiB2YWx1ZXMgb24gZGVwbG95LCBzbyBhXG4gICAgLy8gcmVzb3VyY2UgYmluZGluZyBvZiB0aGF0IG5hbWUgd291bGQgc2lsZW50bHkgYmVjb21lIGEgc3RyaW5nIHZhcmlhYmxlLlxuICAgIGlmIChwcm9qZWN0LmVudi5XQl9WRVJTSU9OICYmIHJlc29sdmVkQ29uZmlnLmJpbmRpbmdOYW1lcy5pbmNsdWRlcygnV0JfVkVSU0lPTicpKSB7XG4gICAgICBjb25zb2xlLmVycm9yKGNoYWxrLnJlZCgnV0JfVkVSU0lPTiBjb2xsaWRlcyB3aXRoIGEgV29ya2VyIGJpbmRpbmcgbmFtZTsgcmVuYW1lIHRoZSBiaW5kaW5nLicpKTtcbiAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICB9XG4gICAgY29uc3QgYmluZGluZ0NvbGxpc2lvbnMgPSBPYmplY3Qua2V5cyhlbnZWYXJzKS5maWx0ZXIoKGtleSkgPT4gcmVzb2x2ZWRDb25maWcuYmluZGluZ05hbWVzLmluY2x1ZGVzKGtleSkpO1xuICAgIGlmIChiaW5kaW5nQ29sbGlzaW9ucy5sZW5ndGggPiAwKSB7XG4gICAgICAvLyBVcGxvYWRpbmcgYSBzZWNyZXQgbmFtZWQgbGlrZSBhIGJpbmRpbmcgd291bGQgcmVwbGFjZSB0aGUgYmluZGluZyB3aXRoIGEgcGxhaW4gc3RyaW5nLlxuICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICBjaGFsay55ZWxsb3coYFNraXBwaW5nIGVudiBrZXlzIHRoYXQgY29sbGlkZSB3aXRoIFdvcmtlciBiaW5kaW5nIG5hbWVzOiAke2JpbmRpbmdDb2xsaXNpb25zLmpvaW4oJywgJyl9YClcbiAgICAgICk7XG4gICAgfVxuICAgIGlmIChtaXNzaW5nS2V5cy5sZW5ndGggPiAwKSB7XG4gICAgICBjb25zb2xlLmVycm9yKFxuICAgICAgICBjaGFsay5yZWQoXG4gICAgICAgICAgYE1pc3NpbmcgcmVxdWlyZWQgZW52aXJvbm1lbnQgdmFyaWFibGVzIChmcm9tIC5lbnYuZXhhbXBsZSBvciB3cmFuZ2xlciBzZWNyZXRzLnJlcXVpcmVkKTogJHttaXNzaW5nS2V5cy5qb2luKCcsICcpfWBcbiAgICAgICAgKVxuICAgICAgKTtcbiAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICB9XG4gICAgLy8gV3JhbmdsZXIgdmFsaWRhdGVzIGBzZWNyZXRzLnJlcXVpcmVkYCBvbmx5IGR1cmluZyB0aGUgcmVhbCB1cGxvYWQg4oCUIGFmdGVyIG1pZ3JhdGlvbnMg4oCUXG4gICAgLy8gc28gd2IgY2hlY2tzIHVwZnJvbnQ6IGVhY2ggcmVxdWlyZWQgbmFtZSBtdXN0IGJlIGEga2V5IGluIHRoZSBvdXRnb2luZyBwYXlsb2FkIChwcmVzZW5jZSxcbiAgICAvLyBub3QgdHJ1dGhpbmVzcyDigJQgYW4gZXhwbGljaXQgZW1wdHkgY2xlYXJzIGEgc3RhbGUgdmFsdWUpIG9yIGFuIGVmZmVjdGl2ZSB2YXIvYmluZGluZy5cbiAgICBjb25zdCB1bnNhdGlzZmllZFJlcXVpcmVkU2VjcmV0TmFtZXMgPSByZXNvbHZlZENvbmZpZy5yZXF1aXJlZFNlY3JldE5hbWVzLmZpbHRlcihcbiAgICAgIChuYW1lKSA9PlxuICAgICAgICAhT2JqZWN0Lmhhc093bihzZWNyZXRzLCBuYW1lKSAmJlxuICAgICAgICAhcmVzb2x2ZWRDb25maWcudmFyS2V5cy5pbmNsdWRlcyhuYW1lKSAmJlxuICAgICAgICAhcmVzb2x2ZWRDb25maWcuYmluZGluZ05hbWVzLmluY2x1ZGVzKG5hbWUpXG4gICAgKTtcbiAgICBpZiAodW5zYXRpc2ZpZWRSZXF1aXJlZFNlY3JldE5hbWVzLmxlbmd0aCA+IDApIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICAgIGNoYWxrLnJlZChcbiAgICAgICAgICBgU2VjcmV0cyByZXF1aXJlZCBieSB0aGUgd3JhbmdsZXIgY29uZmlnIGFyZSBub3QgcHJvdmlkZWQ6ICR7dW5zYXRpc2ZpZWRSZXF1aXJlZFNlY3JldE5hbWVzLmpvaW4oJywgJyl9YFxuICAgICAgICApXG4gICAgICApO1xuICAgICAgcHJvY2Vzcy5leGl0KDEpO1xuICAgIH1cbiAgICBjb25zdCBzZWNyZXRLZXlzID0gT2JqZWN0LmtleXMoc2VjcmV0cykudG9Tb3J0ZWQoKTtcbiAgICAvLyBDbG91ZGZsYXJlIGxpbWl0cyBhIGJ1bGsgdXBsb2FkIHRvIDEwMCBzZWNyZXRzLCBlYWNoIHZhcmlhYmxlL3NlY3JldCB2YWx1ZSB0byA1IEtCLCBhbmRcbiAgICAvLyB0aGUgY29tYmluZWQgdmFyaWFibGUrc2VjcmV0IGNvdW50IHRvIDEyOCAoNjQgb24gdGhlIEZyZWUgcGxhbiwgd2hpY2ggY2Fubm90IGJlIGRldGVjdGVkXG4gICAgLy8gaGVyZSDigJQgaGVuY2UgYSB3YXJuaW5nKS4gRmFpbGluZyBiZWZvcmUgYW55IGJ1aWxkIG9yIG1pZ3JhdGlvbiBrZWVwcyBhbiBvdmVyc2l6ZWQgcGF5bG9hZFxuICAgIC8vIGZyb20gYWJvcnRpbmcgdGhlIGRlcGxveSBhZnRlciByZW1vdGUgbWlncmF0aW9ucyBhbHJlYWR5IHJhbi5cbiAgICBpZiAoc2VjcmV0S2V5cy5sZW5ndGggPiAxMDApIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICAgIGNoYWxrLnJlZChgQ2xvdWRmbGFyZSBhY2NlcHRzIGF0IG1vc3QgMTAwIHNlY3JldHMgcGVyIGRlcGxveSwgYnV0ICR7c2VjcmV0S2V5cy5sZW5ndGh9IHdlcmUgc2VsZWN0ZWQuYClcbiAgICAgICk7XG4gICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgfVxuICAgIC8vIFRoZSBDTEktcHJvdmlkZWQgV0JfVkVSU0lPTiBvdmVybGF5cyBhIGNvbmZpZ3VyZWQgdmFyIG9mIHRoZSBzYW1lIG5hbWUgb24gZGVwbG95LFxuICAgIC8vIHNvIG9ubHkgdGhlIGVmZmVjdGl2ZSB2YWx1ZSBwYXJ0aWNpcGF0ZXMgaW4gdGhlIGxpbWl0IGNoZWNrcy5cbiAgICBjb25zdCBlZmZlY3RpdmVWYXJzID0gbmV3IE1hcChPYmplY3QuZW50cmllczx1bmtub3duPihyZXNvbHZlZENvbmZpZy52YXJzKSk7XG4gICAgaWYgKHByb2plY3QuZW52LldCX1ZFUlNJT04pIGVmZmVjdGl2ZVZhcnMuc2V0KCdXQl9WRVJTSU9OJywgcHJvamVjdC5lbnYuV0JfVkVSU0lPTik7XG4gICAgY29uc3QgdmFyRW50cmllcyA9IFsuLi5lZmZlY3RpdmVWYXJzXTtcbiAgICBjb25zdCBvdmVyc2l6ZWRLZXlzID0gW1xuICAgICAgLi4uc2VjcmV0S2V5cy5maWx0ZXIoKGtleSkgPT4gQnVmZmVyLmJ5dGVMZW5ndGgoc2VjcmV0c1trZXldID8/ICcnLCAndXRmOCcpID4gNSAqIDEwMjQpLFxuICAgICAgLi4udmFyRW50cmllc1xuICAgICAgICAuZmlsdGVyKFxuICAgICAgICAgIChbLCB2YWx1ZV0pID0+IEJ1ZmZlci5ieXRlTGVuZ3RoKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycgPyB2YWx1ZSA6IEpTT04uc3RyaW5naWZ5KHZhbHVlKSwgJ3V0ZjgnKSA+IDUgKiAxMDI0XG4gICAgICAgIClcbiAgICAgICAgLm1hcCgoW2tleV0pID0+IGtleSksXG4gICAgXTtcbiAgICBpZiAob3ZlcnNpemVkS2V5cy5sZW5ndGggPiAwKSB7XG4gICAgICBjb25zb2xlLmVycm9yKGNoYWxrLnJlZChgVmFyaWFibGUgb3Igc2VjcmV0IHZhbHVlcyBleGNlZWQgQ2xvdWRmbGFyZSdzIDUgS0IgbGltaXQ6ICR7b3ZlcnNpemVkS2V5cy5qb2luKCcsICcpfWApKTtcbiAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICB9XG4gICAgLy8gYC0tc2VjcmV0cy1maWxlYCBpcyBhZGRpdGl2ZTogcmVtb3RlIHNlY3JldHMgYWJzZW50IGZyb20gdGhlIHBheWxvYWQgc3RheSBhdHRhY2hlZCB0byB0aGVcbiAgICAvLyBuZXcgdmVyc2lvbiwgc28gdGhleSBjb3VudCBhZ2FpbnN0IHRoZSBjb21iaW5lZCBsaW1pdCB0b28uIExpc3RpbmcgdGhlbSBuZWVkcyBhblxuICAgIC8vIGF1dGhlbnRpY2F0ZWQgcmVtb3RlIHJvdW5kLXRyaXAsIHdoaWNoIGRyeSBydW5zIHNraXA7IHdoZW4gdGhlIGxpc3RpbmcgZmFpbHMgZm9yIGFueVxuICAgIC8vIHJlYXNvbiBvdGhlciB0aGFuIGEgbm90LXlldC1jcmVhdGVkIFdvcmtlciwgZGVncmFkZSB0byB0aGUgbG9jYWwtb25seSBjb3VudCBpbnN0ZWFkIG9mXG4gICAgLy8gYmxvY2tpbmcgYSBkZXBsb3kgdGhhdCB3cmFuZ2xlciBpdHNlbGYgbWlnaHQgYWNjZXB0LlxuICAgIGNvbnN0IHJlbW90ZVNlY3JldE5hbWVzID0gYXJndi5kcnlSdW5cbiAgICAgID8gW11cbiAgICAgIDogYXdhaXQgbGlzdFJlbW90ZVdvcmtlclNlY3JldE5hbWVzKHByb2plY3QsIGFyZ3YsIHdyYW5nbGVyQ29uZmlnUGF0aCwgcmVzb2x2ZWRDb25maWcsIGVudk5hbWUpO1xuICAgIGNvbnN0IGluaGVyaXRlZFNlY3JldE5hbWVzID0gc2VsZWN0SW5oZXJpdGVkUmVtb3RlU2VjcmV0TmFtZXMoXG4gICAgICByZW1vdGVTZWNyZXROYW1lcyA/PyBbXSxcbiAgICAgIHNlY3JldHMsXG4gICAgICB2YXJFbnRyaWVzLm1hcCgoW2tleV0pID0+IGtleSksXG4gICAgICByZXNvbHZlZENvbmZpZy5iaW5kaW5nTmFtZXNcbiAgICApO1xuICAgIGNvbnN0IGNvbWJpbmVkQ291bnQgPVxuICAgICAgbmV3IFNldChbLi4uc2VjcmV0S2V5cywgLi4udmFyRW50cmllcy5tYXAoKFtrZXldKSA9PiBrZXkpXSkuc2l6ZSArIGluaGVyaXRlZFNlY3JldE5hbWVzLmxlbmd0aDtcbiAgICBjb25zdCBpbmhlcml0ZWROb3RlID1cbiAgICAgIGluaGVyaXRlZFNlY3JldE5hbWVzLmxlbmd0aCA+IDBcbiAgICAgICAgPyBgIChpbmNsdWRpbmcgJHtpbmhlcml0ZWRTZWNyZXROYW1lcy5sZW5ndGh9IHJlbW90ZSBzZWNyZXRzIGtlcHQgZnJvbSB0aGUgcHJldmlvdXMgdmVyc2lvbjogJHtpbmhlcml0ZWRTZWNyZXROYW1lcy5qb2luKCcsICcpfSlgXG4gICAgICAgIDogJyc7XG4gICAgaWYgKGNvbWJpbmVkQ291bnQgPiAxMjgpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICAgIGNoYWxrLnJlZChcbiAgICAgICAgICBgQ2xvdWRmbGFyZSBhbGxvd3MgYXQgbW9zdCAxMjggdmFyaWFibGVzIGFuZCBzZWNyZXRzIGNvbWJpbmVkLCBidXQgJHtjb21iaW5lZENvdW50fSB3ZXJlIHNlbGVjdGVkJHtpbmhlcml0ZWROb3RlfS5gXG4gICAgICAgIClcbiAgICAgICk7XG4gICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgfVxuICAgIGlmIChjb21iaW5lZENvdW50ID4gNjQpIHtcbiAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgY2hhbGsueWVsbG93KGAke2NvbWJpbmVkQ291bnR9IHZhcmlhYmxlcyBhbmQgc2VjcmV0cyR7aW5oZXJpdGVkTm90ZX0gZXhjZWVkIHRoZSBGcmVlIHBsYW4ncyBsaW1pdCBvZiA2NC5gKVxuICAgICAgKTtcbiAgICB9XG4gICAgY29uc29sZS5pbmZvKFxuICAgICAgY2hhbGsuY3lhbihcbiAgICAgICAgYERlcGxveWluZyAke3Jlc29sdmVkQ29uZmlnLndvcmtlck5hbWUgPz8gcHJvamVjdC5uYW1lfSAoJHtlbnZOYW1lfSkgd2l0aCAke3NlY3JldEtleXMubGVuZ3RofSBzZWNyZXRzOiAke3NlY3JldEtleXMuam9pbignLCAnKX1gXG4gICAgICApXG4gICAgKTtcblxuICAgIC8vIDIuIEJ1aWxkICh2aW5leHQgZW1iZWRzIHRoZSBlbnZpcm9ubWVudC1hcHBsaWVkIHdyYW5nbGVyIGNvbmZpZyBpbnRvIGRpc3Qvc2VydmVyL3dyYW5nbGVyLmpzb24pLlxuICAgIC8vICAgIEJ1aWxkaW5nIGJlZm9yZSBtaWdyYXRpbmcga2VlcHMgYSBidWlsZCBmYWlsdXJlIGZyb20gbGVhdmluZyBhIG1pZ3JhdGVkIHNjaGVtYSBiZWhpbmRcbiAgICAvLyAgICB0aGUgb2xkIFdvcmtlci4gUGxhaW4gV29ya2VycyBoYXZlIG5vIGJ1aWxkIHN0ZXA7IHdyYW5nbGVyIGJ1bmRsZXMgdGhlIGVudHJ5IGl0c2VsZi5cbiAgICBjb25zdCBpc1ZpbmV4dCA9ICEhKHByb2plY3QucGFja2FnZUpzb24uZGVwZW5kZW5jaWVzPy52aW5leHQgPz8gcHJvamVjdC5wYWNrYWdlSnNvbi5kZXZEZXBlbmRlbmNpZXM/LnZpbmV4dCk7XG4gICAgY29uc3QgZGVwbG95Q29uZmlnUGF0aCA9IGlzVmluZXh0ID8gcGF0aC5qb2luKCdkaXN0JywgJ3NlcnZlcicsICd3cmFuZ2xlci5qc29uJykgOiB3cmFuZ2xlckNvbmZpZ1BhdGg7XG4gICAgY29uc3QgY2xvdWRmbGFyZUVudkFzc2lnbm1lbnQgPSByZXNvbHZlZENvbmZpZy51c2VzRW52U2VjdGlvblxuICAgICAgPyBgJHtidWlsZFNoZWxsRW52aXJvbm1lbnRBc3NpZ25tZW50KCdDTE9VREZMQVJFX0VOVicsIGVudk5hbWUpfSBgXG4gICAgICA6ICcnO1xuICAgIGlmIChpc1ZpbmV4dCkge1xuICAgICAgaWYgKHByb2plY3QuZW52LldCX1ZFUlNJT04pIHtcbiAgICAgICAgcHJvamVjdC5lbnYuTkVYVF9QVUJMSUNfV0JfVkVSU0lPTiB8fD0gcHJvamVjdC5lbnYuV0JfVkVSU0lPTjtcbiAgICAgIH1cbiAgICAgIGlmIChwcm9qZWN0LnBhY2thZ2VKc29uLnNjcmlwdHM/LlsnZ2VuLWNvZGUnXSkge1xuICAgICAgICBhd2FpdCBydW5XaXRoU3Bhd24oJ1lBUk4gcnVuIGdlbi1jb2RlJywgcHJvamVjdCwgYXJndik7XG4gICAgICB9XG4gICAgICBhd2FpdCBydW5XaXRoU3Bhd24oYCR7Y2xvdWRmbGFyZUVudkFzc2lnbm1lbnR9WUFSTiB2aW5leHQgYnVpbGRgLCBwcm9qZWN0LCBhcmd2KTtcbiAgICAgIC8vIE9uIGRyeSBydW5zIHRoZSB2aW5leHQgYnVpbGQgYWJvdmUgaXMgYSBwcmludGVkIG5vLW9wLCBzbyB0aGUgYnVpbHQgY29uZmlnIGlzXG4gICAgICAvLyBsZWdpdGltYXRlbHkgYWJzZW50IGFuZCBtdXN0IG5vdCBhYm9ydCB0aGUgcnVuLlxuICAgICAgaWYgKCFhcmd2LmRyeVJ1biAmJiAhZnMuZXhpc3RzU3luYyhwYXRoLnJlc29sdmUocHJvamVjdC5kaXJQYXRoLCBkZXBsb3lDb25maWdQYXRoKSkpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcihjaGFsay5yZWQoYCR7ZGVwbG95Q29uZmlnUGF0aH0gbm90IGZvdW5kOyB0aGUgdmluZXh0IGJ1aWxkIGRpZCBub3QgcHJvZHVjZSBhIGRlcGxveSBjb25maWcuYCkpO1xuICAgICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgICB9XG4gICAgICAvLyBXcmFuZ2xlciB2YWxpZGF0ZXMgaXRzIGNvbmZpZyBzY2hlbWEgb25seSB3aGVuIGl0IHJ1bnMsIHNvIGEgZHJ5IHJ1biBvZiB0aGUgYnVpbHRcbiAgICAgIC8vIGNvbmZpZyBzdXJmYWNlcyBjb25maWcgYW5kIGJ1bmRsZSBlcnJvcnMgQkVGT1JFIHRoZSByZW1vdGUgbWlncmF0aW9ucyBiZWxvdyBtdXRhdGVcbiAgICAgIC8vIHRoZSBkYXRhYmFzZSwgbWlycm9yaW5nIHRoZSBwbGFpbi1Xb3JrZXIgZHJ5IHJ1bi4gTm8gLS1lbnY6IHRoZSBidWlsdCBjb25maWcgYWxyZWFkeVxuICAgICAgLy8gaGFzIHRoZSBlbnZpcm9ubWVudCBhcHBsaWVkLlxuICAgICAgYXdhaXQgcnVuV2l0aFNwYXduKFxuICAgICAgICBgWUFSTiB3cmFuZ2xlciBkZXBsb3kgLS1kcnktcnVuIC0tY29uZmlnICR7c2hlbGxFc2NhcGVBcmd1bWVudChkZXBsb3lDb25maWdQYXRoKX1gLFxuICAgICAgICBwcm9qZWN0LFxuICAgICAgICBhcmd2XG4gICAgICApO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBQbGFpbiBXb3JrZXJzIGFyZSBmaXJzdCBjb21waWxlZCBieSB3cmFuZ2xlciBkdXJpbmcgdGhlIGRlcGxveSBpdHNlbGY7IGEgZHJ5IHJ1blxuICAgICAgLy8gc3VyZmFjZXMgY29tcGlsZSBlcnJvcnMgKGUuZy4gYSBtaXNzaW5nIGVudHJ5IHBvaW50KSBCRUZPUkUgdGhlIHJlbW90ZSBtaWdyYXRpb25zXG4gICAgICAvLyBiZWxvdyBtdXRhdGUgdGhlIGRhdGFiYXNlLlxuICAgICAgYXdhaXQgcnVuV2l0aFNwYXduKFxuICAgICAgICBgWUFSTiB3cmFuZ2xlciBkZXBsb3kgLS1kcnktcnVuIC0tY29uZmlnICR7c2hlbGxFc2NhcGVBcmd1bWVudCh3cmFuZ2xlckNvbmZpZ1BhdGgpfSR7cmVzb2x2ZWRDb25maWcudXNlc0VudlNlY3Rpb24gPyBgIC0tZW52ICR7c2hlbGxFc2NhcGVBcmd1bWVudChlbnZOYW1lKX1gIDogJyd9YCxcbiAgICAgICAgcHJvamVjdCxcbiAgICAgICAgYXJndlxuICAgICAgKTtcbiAgICB9XG5cbiAgICAvLyAzLiBBcHBseSBEMSBtaWdyYXRpb25zIHRvIHRoZSByZW1vdGUgZGF0YWJhc2Ugd2l0aCB0aGUgcHJvamVjdCdzIHNpbmdsZSBtaWdyYXRpb25cbiAgICAvLyAgICBtZWNoYW5pc20gKHdyYW5nbGVyLW5hdGl2ZSB3aGVuIGEgbWlncmF0aW9ucyBkaXJlY3RvcnkgZXhpc3RzLCBlbHNlIGRyaXp6bGUta2l0IGZvclxuICAgIC8vICAgIGRyaXp6bGUtb3JtIGFwcHMpLiBNaWdyYXRpb25zIG11c3QgYmUgYmFja3dhcmQgY29tcGF0aWJsZTogdGhlIG9sZCBXb3JrZXIgc2VydmVzXG4gICAgLy8gICAgdHJhZmZpYyB1bnRpbCB0aGUgZGVwbG95IGJlbG93LlxuICAgIGNvbnN0IGVudk9wdGlvbiA9IHJlc29sdmVkQ29uZmlnLnVzZXNFbnZTZWN0aW9uID8gYCAtLWVudiAke3NoZWxsRXNjYXBlQXJndW1lbnQoZW52TmFtZSl9YCA6ICcnO1xuICAgIGZvciAoY29uc3QgZGF0YWJhc2Ugb2Ygd3JhbmdsZXJOYXRpdmVEMURhdGFiYXNlcykge1xuICAgICAgY29uc3QgZGF0YWJhc2VOYW1lID0gZGF0YWJhc2UuZGF0YWJhc2VfbmFtZSA/PyBkYXRhYmFzZS5iaW5kaW5nO1xuICAgICAgaWYgKCFkYXRhYmFzZU5hbWUpIGNvbnRpbnVlO1xuICAgICAgYXdhaXQgcnVuV2l0aFNwYXduKFxuICAgICAgICBgQ0k9dHJ1ZSBZQVJOIHdyYW5nbGVyIGQxIG1pZ3JhdGlvbnMgYXBwbHkgJHtzaGVsbEVzY2FwZUFyZ3VtZW50KGRhdGFiYXNlTmFtZSl9IC0tcmVtb3RlIC0tY29uZmlnICR7c2hlbGxFc2NhcGVBcmd1bWVudCh3cmFuZ2xlckNvbmZpZ1BhdGgpfSR7ZW52T3B0aW9ufWAsXG4gICAgICAgIHByb2plY3QsXG4gICAgICAgIGFyZ3ZcbiAgICAgICk7XG4gICAgfVxuICAgIGlmIChkcml6emxlRDFEYXRhYmFzZSkge1xuICAgICAgaWYgKCFkcml6emxlRDFEYXRhYmFzZS5kYXRhYmFzZV9pZCkge1xuICAgICAgICBjb25zb2xlLmVycm9yKGNoYWxrLnJlZChgVGhlICR7ZW52TmFtZX0gRDEgYmluZGluZyBoYXMgbm8gZGF0YWJhc2VfaWQgaW4gdGhlIHdyYW5nbGVyIGNvbmZpZy5gKSk7XG4gICAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICAgIH1cbiAgICAgIGlmICghYWNjb3VudElkKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICAgICAgY2hhbGsucmVkKFxuICAgICAgICAgICAgJ0NMT1VERkxBUkVfQUNDT1VOVF9JRCAob3IgYWNjb3VudF9pZCBpbiB0aGUgd3JhbmdsZXIgY29uZmlnKSBpcyByZXF1aXJlZCBmb3IgcmVtb3RlIGRyaXp6bGUta2l0IG1pZ3JhdGlvbnMuJ1xuICAgICAgICAgIClcbiAgICAgICAgKTtcbiAgICAgICAgcHJvY2Vzcy5leGl0KDEpO1xuICAgICAgfVxuICAgICAgYXdhaXQgcnVuV2l0aFNwYXduKFxuICAgICAgICBidWlsZERyaXp6bGVLaXRDb21tYW5kKFxuICAgICAgICAgIHByb2plY3QsXG4gICAgICAgICAgJ21pZ3JhdGUnLFxuICAgICAgICAgIGBDTE9VREZMQVJFX0QxX0RBVEFCQVNFX0lEPSR7ZHJpenpsZUQxRGF0YWJhc2UuZGF0YWJhc2VfaWR9IENMT1VERkxBUkVfQUNDT1VOVF9JRD0ke2FjY291bnRJZH1gXG4gICAgICAgICksXG4gICAgICAgIHByb2plY3QsXG4gICAgICAgIGFyZ3ZcbiAgICAgICk7XG4gICAgfVxuXG4gICAgLy8gNC4gRGVwbG95IGNvZGUgYW5kIHNlY3JldHMgYXRvbWljYWxseSAobm8gcG9zdC1kZXBsb3kgc2VjcmV0IHB1c2ggdGhhdCBjb3VsZCBsZWF2ZSB0aGVcbiAgICAvLyAgICBuZXcgdmVyc2lvbiBydW5uaW5nIHdpdGhvdXQg4oCUIG9yIHdpdGggc3RhbGUg4oCUIHNlY3JldHMpLiBUaGUgc2VjcmV0cyBKU09OIGdvZXMgdGhyb3VnaFxuICAgIC8vICAgIGEgbW9kZS0wNjAwIGZpbGUgaW4gYSBwcml2YXRlIHRlbXBvcmFyeSBkaXJlY3RvcnkgZGVsZXRlZCByaWdodCBhZnRlciB0aGUgZGVwbG95OlxuICAgIC8vICAgIC9kZXYvc3RkaW4gaXMgTk9UIHJlbGlhYmxlIGhlcmUgYmVjYXVzZSB3cmFuZ2xlciByZWFkcyB0aGUgc2VjcmV0cyBmaWxlIG9ubHkgYWZ0ZXJcbiAgICAvLyAgICB1cGxvYWRpbmcgYXNzZXRzLCBieSB3aGljaCBwb2ludCB0aGUgcGlwZWQgc3RkaW4gbWF5IGFscmVhZHkgaGF2ZSBiZWVuIGNvbnN1bWVkIOKAlFxuICAgIC8vICAgIG9ic2VydmVkIGFzIGEgZmxha3kgYENvdWxkIG5vdCByZWFkIGZpbGU6IC9kZXYvc3RkaW5gIG9uIENJLiBFeHBsaWNpdGx5IGVtcHR5IHZhbHVlc1xuICAgIC8vICAgIHN0YXkgaW4gdGhlIHBheWxvYWQ6IC0tc2VjcmV0cy1maWxlIGlzIGFkZGl0aXZlLCBzbyBwdXNoaW5nICcnIGlzIHRoZSBvbmx5IHdheSB0b1xuICAgIC8vICAgIGNsZWFyIGEgc3RhbGUgc2VjcmV0LlxuICAgIGNvbnN0IGRlcGxveUFyZ3MgPSBbXG4gICAgICAnZGVwbG95JyxcbiAgICAgICctLWNvbmZpZycsXG4gICAgICBkZXBsb3lDb25maWdQYXRoLFxuICAgICAgLy8gdmluZXh0J3MgYnVpbHQgY29uZmlnIGFscmVhZHkgaGFzIHRoZSBlbnZpcm9ubWVudCBhcHBsaWVkOyBwYXNzaW5nIC0tZW52IHRoZXJlIHdvdWxkXG4gICAgICAvLyBhcHBseSB0aGUgZW52aXJvbm1lbnQgc3VmZml4IHR3aWNlLlxuICAgICAgLi4uKCFpc1ZpbmV4dCAmJiByZXNvbHZlZENvbmZpZy51c2VzRW52U2VjdGlvbiA/IFsnLS1lbnYnLCBlbnZOYW1lXSA6IFtdKSxcbiAgICAgIC4uLihwcm9qZWN0LmVudi5XQl9WRVJTSU9OID8gWyctLXZhcicsIGBXQl9WRVJTSU9OOiR7cHJvamVjdC5lbnYuV0JfVkVSU0lPTn1gXSA6IFtdKSxcbiAgICAgICctLXNlY3JldHMtZmlsZScsXG4gICAgXTtcbiAgICBjb25zb2xlLmluZm8oY2hhbGsuY3lhbihgUnVubmluZzogd3JhbmdsZXIgJHtkZXBsb3lBcmdzLmpvaW4oJyAnKX0gPHRlbXBvcmFyeSBzZWNyZXRzIGZpbGU+YCkpO1xuICAgIGlmICghYXJndi5kcnlSdW4pIHtcbiAgICAgIHByZXBhcmVMb2NhbEJpblBhdGgocHJvamVjdCk7XG4gICAgICBjb25zdCBkZXBsb3lFbnYgPSB7IC4uLnByb2plY3QuZW52IH07XG4gICAgICBkZWxldGUgZGVwbG95RW52LkNMT1VERkxBUkVfRU5WO1xuICAgICAgLy8gMG83MDAgZGlyZWN0b3J5ICsgMG82MDAgZmlsZTogcmVhZGFibGUgb25seSBieSB0aGUgZGVwbG95aW5nIHVzZXIsIGxpa2UgdGhlIGRvdGVudlxuICAgICAgLy8gZmlsZXMgdGhlIENJIHdvcmtmbG93IGFscmVhZHkgd3JpdGVzIG5leHQgdG8gaXQuIHdyYW5nbGVyIHJ1bnMgdGhyb3VnaCBhbiBhc3luYyBzcGF3blxuICAgICAgLy8gKHNwYXduU3luYyB3b3VsZCBibG9jayB0aGUgZXZlbnQgbG9vcCwgc28gYSBzaHV0ZG93biBzaWduYWwgd291bGQga2lsbCB0aGUgcHJvY2Vzc1xuICAgICAgLy8gYmVmb3JlIGFueSBjbGVhbnVwKSBhbmQgdGhlIGRpcmVjdG9yeSBpcyByZW1vdmVkIGluIGEgZmluYWxseSwgc28gYW4gaW50ZXJydXB0ZWRcbiAgICAgIC8vIGRlcGxveSBjYW5ub3QgbGVhdmUgdGhlIHBsYWludGV4dCBzZWNyZXRzIGJlaGluZC4gU2h1dGRvd24gaGFuZGxpbmcgZGV0YWlsczpcbiAgICAgIC8vIC0gSGFuZGxlcnMgKGluY2x1ZGluZyBTSUdIVVAsIG9uIHdoaWNoIE5vZGUgYWxzbyB0ZXJtaW5hdGVzIGJ5IGRlZmF1bHQpIGFyZSBpbnN0YWxsZWRcbiAgICAgIC8vICAgQkVGT1JFIHRoZSBmaWxlIGlzIHdyaXR0ZW4gYW5kIHVzZSBwcm9jZXNzLm9uLCBub3Qgb25jZSwgc28gYSByZXBlYXRlZCBzaWduYWwgY2Fubm90XG4gICAgICAvLyAgIGZhbGwgYmFjayB0byBkZWZhdWx0IHRlcm1pbmF0aW9uIGFuZCBieXBhc3MgdGhlIGZpbmFsbHkgY2xlYW51cC5cbiAgICAgIC8vIC0gU0lHSFVQL1NJR1FVSVQgYXJlIGZvcndhcmRlZCB0byB3cmFuZ2xlciBhcyBTSUdURVJNOiB3cmFuZ2xlcidzIGxhdW5jaGVyIHJlbGF5cyBvbmx5XG4gICAgICAvLyAgIFNJR0lOVC9TSUdURVJNIHRvIGl0cyBpbm5lciBOb2RlIHByb2Nlc3MsIGFuZCBhbnl0aGluZyBlbHNlIHdvdWxkIG9ycGhhbiBhIGRlcGxveW1lbnRcbiAgICAgIC8vICAgdGhhdCBrZWVwcyBtdXRhdGluZyB0aGUgcmVtb3RlIFdvcmtlciBhZnRlciB3YiBleGl0cy5cbiAgICAgIC8vIC0gVGhlIHJlLXJhaXNlIGJlbG93IHVzZXMgdGhlIHNpZ25hbCB3YiBpdHNlbGYgcmVjZWl2ZWQ6IHdyYW5nbGVyIGNhdGNoZXMgU0lHSU5UIGFuZFxuICAgICAgLy8gICBleGl0cyBudW1lcmljYWxseSAoZS5nLiAxNDMpLCB3aGljaCBtdXN0IG5vdCBtYXNxdWVyYWRlIGFzIGFuIG9yZGluYXJ5IGZhaWx1cmUuXG4gICAgICBjb25zdCBzZWNyZXRzRGlyUGF0aCA9IGZzLm1rZHRlbXBTeW5jKHBhdGguam9pbihvcy50bXBkaXIoKSwgJ3diLWRlcGxveS0nKSk7XG4gICAgICBjb25zdCBzaHV0ZG93blNpZ25hbHMgPSBbJ1NJR0hVUCcsICdTSUdJTlQnLCAnU0lHVEVSTScsICdTSUdRVUlUJ10gYXMgY29uc3Q7XG4gICAgICBjb25zdCBzaWduYWxIYW5kbGVycyA9IG5ldyBNYXA8Tm9kZUpTLlNpZ25hbHMsICgpID0+IHZvaWQ+KCk7XG4gICAgICBsZXQgd3JhbmdsZXJQcm9jZXNzOiBSZXR1cm5UeXBlPHR5cGVvZiBzcGF3bj4gfCB1bmRlZmluZWQ7XG4gICAgICBsZXQgcmVjZWl2ZWRTaHV0ZG93blNpZ25hbDogTm9kZUpTLlNpZ25hbHMgfCB1bmRlZmluZWQ7XG4gICAgICBmb3IgKGNvbnN0IHNpZ25hbCBvZiBzaHV0ZG93blNpZ25hbHMpIHtcbiAgICAgICAgY29uc3Qgc2lnbmFsSGFuZGxlciA9ICgpOiB2b2lkID0+IHtcbiAgICAgICAgICByZWNlaXZlZFNodXRkb3duU2lnbmFsID8/PSBzaWduYWw7XG4gICAgICAgICAgaWYgKHdyYW5nbGVyUHJvY2Vzcykge1xuICAgICAgICAgICAgd3JhbmdsZXJQcm9jZXNzLmtpbGwoc2lnbmFsID09PSAnU0lHSU5UJyB8fCBzaWduYWwgPT09ICdTSUdURVJNJyA/IHNpZ25hbCA6ICdTSUdURVJNJyk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGZvciAoY29uc3QgW3NodXRkb3duU2lnbmFsLCBoYW5kbGVyXSBvZiBzaWduYWxIYW5kbGVycykge1xuICAgICAgICAgICAgICBwcm9jZXNzLm9mZihzaHV0ZG93blNpZ25hbCwgaGFuZGxlcik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBmcy5ybVN5bmMoc2VjcmV0c0RpclBhdGgsIHsgZm9yY2U6IHRydWUsIHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgICAgICAgICAgIC8vIFdpdGggdGhlIGhhbmRsZXJzIHJlbW92ZWQsIHJlLXJhaXNpbmcgdHJpZ2dlcnMgdGhlIGRlZmF1bHQgYmVoYXZpb3IuXG4gICAgICAgICAgICBwcm9jZXNzLmtpbGwocHJvY2Vzcy5waWQsIHNpZ25hbCk7XG4gICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgICBzaWduYWxIYW5kbGVycy5zZXQoc2lnbmFsLCBzaWduYWxIYW5kbGVyKTtcbiAgICAgICAgcHJvY2Vzcy5vbihzaWduYWwsIHNpZ25hbEhhbmRsZXIpO1xuICAgICAgfVxuICAgICAgbGV0IGRlcGxveVN0YXR1czogbnVtYmVyIHwgdW5kZWZpbmVkO1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3Qgc2VjcmV0c0ZpbGVQYXRoID0gcGF0aC5qb2luKHNlY3JldHNEaXJQYXRoLCAnc2VjcmV0cy5qc29uJyk7XG4gICAgICAgIGZzLndyaXRlRmlsZVN5bmMoc2VjcmV0c0ZpbGVQYXRoLCBKU09OLnN0cmluZ2lmeShzZWNyZXRzKSwgeyBtb2RlOiAwbzYwMCB9KTtcbiAgICAgICAgZGVwbG95U3RhdHVzID0gYXdhaXQgbmV3IFByb21pc2U8bnVtYmVyIHwgdW5kZWZpbmVkPigocmVzb2x2ZSkgPT4ge1xuICAgICAgICAgIHdyYW5nbGVyUHJvY2VzcyA9IHNwYXduKCd3cmFuZ2xlcicsIFsuLi5kZXBsb3lBcmdzLCBzZWNyZXRzRmlsZVBhdGhdLCB7XG4gICAgICAgICAgICBjd2Q6IHByb2plY3QuZGlyUGF0aCxcbiAgICAgICAgICAgIGVudjogZGVwbG95RW52IGFzIE5vZGVKUy5Qcm9jZXNzRW52LFxuICAgICAgICAgICAgc3RkaW86IFsnaWdub3JlJywgJ2luaGVyaXQnLCAnaW5oZXJpdCddLFxuICAgICAgICAgIH0pO1xuICAgICAgICAgIHdyYW5nbGVyUHJvY2Vzcy5vbignZXJyb3InLCAoZXJyb3IpID0+IHtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZXJyb3IpO1xuICAgICAgICAgICAgcmVzb2x2ZSgxKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgICB3cmFuZ2xlclByb2Nlc3Mub24oJ2V4aXQnLCAoY29kZSwgc2lnbmFsKSA9PiB7XG4gICAgICAgICAgICByZXNvbHZlKHNpZ25hbCA/IDEgOiAoY29kZSA/PyB1bmRlZmluZWQpKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICAvLyBwcm9jZXNzLmV4aXQgc2tpcHMgZmluYWxseSBibG9ja3MsIHNvIHRoZSBleGl0LW9uLWZhaWx1cmUgYmVsb3cgc3RheXMgb3V0c2lkZS5cbiAgICAgICAgZm9yIChjb25zdCBbc2h1dGRvd25TaWduYWwsIHNpZ25hbEhhbmRsZXJdIG9mIHNpZ25hbEhhbmRsZXJzKSB7XG4gICAgICAgICAgcHJvY2Vzcy5vZmYoc2h1dGRvd25TaWduYWwsIHNpZ25hbEhhbmRsZXIpO1xuICAgICAgICB9XG4gICAgICAgIGZzLnJtU3luYyhzZWNyZXRzRGlyUGF0aCwgeyBmb3JjZTogdHJ1ZSwgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICAgICAgfVxuICAgICAgaWYgKHJlY2VpdmVkU2h1dGRvd25TaWduYWwpIHtcbiAgICAgICAgLy8gUmUtcmFpc2Ugc28gdGhlIGNhbGxlciBvYnNlcnZlcyB0aGUgc2FtZSBzaWduYWwtZGVyaXZlZCBleGl0IHN0YXR1cy5cbiAgICAgICAgcHJvY2Vzcy5raWxsKHByb2Nlc3MucGlkLCByZWNlaXZlZFNodXRkb3duU2lnbmFsKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgaWYgKGRlcGxveVN0YXR1cyAhPT0gMCkge1xuICAgICAgICBjb25zb2xlLmVycm9yKGNoYWxrLnJlZChgd3JhbmdsZXIgZGVwbG95IGZhaWxlZCB3aXRoIGV4aXQgY29kZSAke2RlcGxveVN0YXR1cyA/PyAndW5rbm93bid9LmApKTtcbiAgICAgICAgcHJvY2Vzcy5leGl0KGRlcGxveVN0YXR1cyA/PyAxKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyA1LiBPcHRpb25hbCBwb3N0LWRlcGxveSBob29rIChlLmcuIHNlZWRpbmcgdGhlIHJlbW90ZSBEMSB2aWEgZHJpenpsZSdzIGQxLWh0dHAgZHJpdmVyKS5cbiAgICAvLyAgICBBc3NpZ24gdGhlIHJlc29sdmVkIGlkcyB1bmNvbmRpdGlvbmFsbHk6IGEgc3RhbGUgZXhwb3J0ZWQgQ0xPVURGTEFSRV9EMV9EQVRBQkFTRV9JRFxuICAgIC8vICAgIG11c3Qgbm90IHJlZGlyZWN0IHRoZSBob29rIHRvIGFub3RoZXIgZGF0YWJhc2UuXG4gICAgaWYgKHByb2plY3QucGFja2FnZUpzb24uc2NyaXB0cz8uWydkZXBsb3kvcG9zdCddKSB7XG4gICAgICAvLyBUaGUgaWQgaXMgdW5hbWJpZ3VvdXMgb25seSB3aXRoIGEgc2luZ2xlIEQxIGJpbmRpbmc7IHdpdGggbXVsdGlwbGUsIHRoZSBob29rIG11c3RcbiAgICAgIC8vIHJlc29sdmUgaXRzIHRhcmdldCBpdHNlbGYuIENsZWFyIGZpcnN0IGVpdGhlciB3YXk6IGEgc3RhbGUgaW5oZXJpdGVkIGlkIG11c3Qgbm90XG4gICAgICAvLyByZWRpcmVjdCB0aGUgaG9vayB0byBhbm90aGVyIGRhdGFiYXNlLlxuICAgICAgY29uc3QgaG9va0QxRGF0YWJhc2U6IFdyYW5nbGVyRDFEYXRhYmFzZSB8IHVuZGVmaW5lZCA9XG4gICAgICAgIHJlc29sdmVkQ29uZmlnLmQxRGF0YWJhc2VzLmxlbmd0aCA9PT0gMSA/IHJlc29sdmVkQ29uZmlnLmQxRGF0YWJhc2VzWzBdIDogdW5kZWZpbmVkO1xuICAgICAgZGVsZXRlIHByb2plY3QuZW52LkNMT1VERkxBUkVfRDFfREFUQUJBU0VfSUQ7XG4gICAgICBpZiAocmVzb2x2ZWRDb25maWcuZDFEYXRhYmFzZXMubGVuZ3RoID4gMSkge1xuICAgICAgICBjb25zb2xlLndhcm4oY2hhbGsueWVsbG93KCdNdWx0aXBsZSBEMSBiaW5kaW5ncyBleGlzdDsgQ0xPVURGTEFSRV9EMV9EQVRBQkFTRV9JRCBpcyBub3Qgc2V0IGZvciBkZXBsb3kvcG9zdC4nKSk7XG4gICAgICB9XG4gICAgICBpZiAoaG9va0QxRGF0YWJhc2U/LmRhdGFiYXNlX2lkKSBwcm9qZWN0LmVudi5DTE9VREZMQVJFX0QxX0RBVEFCQVNFX0lEID0gaG9va0QxRGF0YWJhc2UuZGF0YWJhc2VfaWQ7XG4gICAgICBpZiAoYWNjb3VudElkKSBwcm9qZWN0LmVudi5DTE9VREZMQVJFX0FDQ09VTlRfSUQgPSBhY2NvdW50SWQ7XG4gICAgICBhd2FpdCBydW5XaXRoU3Bhd24oJ1lBUk4gcnVuIGRlcGxveS9wb3N0JywgcHJvamVjdCwgYXJndik7XG4gICAgfVxuICB9LFxufTtcblxuLyoqXG4gKiBSZWFkIHRoZSBDbG91ZGZsYXJlIEFQSSB0b2tlbiB0aGF0IENJIGRyb3BzIGluIGEgYC5lbnYuY2xvdWRmbGFyZWAgZmlsZSAoZS5nLiB0aGUgcmV1c2FibGVcbiAqIGRlcGxveSB3b3JrZmxvdydzIGBmaWxlX3BhdGhfMWApLCBsb29raW5nIGJlc2lkZSB0aGUgV29ya2VyJ3Mgd3JhbmdsZXIgY29uZmlnIGFuZCBhdCB0aGVcbiAqIG1vbm9yZXBvIHJvb3Qg4oCUIGBmaWxlX3BhdGhfMWAgaXMgcmVwby1yZWxhdGl2ZSwgc28gYm90aCBzcGVsbGluZ3Mgb2NjdXIgaW4gcHJhY3RpY2UuXG4gKiBOZWFyZXIgZmlsZXMgd2luLCBtaXJyb3JpbmcgdGhlIGAuZW52YCBjYXNjYWRlOiBhIHdvcmtzcGFjZSBtYXkgb3ZlcnJpZGUgdGhlIHJvb3QgdG9rZW4sXG4gKiBuZXZlciB0aGUgcmV2ZXJzZS4gUGFzcyBgcm9vdERpclBhdGhgIGFzIHVuZGVmaW5lZCB0byByZWFkIHRoZSB3b3Jrc3BhY2UgYWxvbmUsIHNvIHRoYXRcbiAqIGAtLWluY2x1ZGUtcm9vdC1lbnY9ZmFsc2VgIGlzb2xhdGVzIHRoaXMgZmlsZSBmcm9tIHRoZSByb290IGp1c3QgYXMgaXQgZG9lcyB0aGUgY2FzY2FkZS5cbiAqIGBDTE9VREZMQVJFX0VOVmAgaXMgZHJvcHBlZDsgaXQgd291bGQgZG91YmxlLWFwcGx5IHRoZSBlbnZpcm9ubWVudCBzdWZmaXguXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZWFkQ2xvdWRmbGFyZUVudkZpbGVzKGRpclBhdGg6IHN0cmluZywgcm9vdERpclBhdGg6IHN0cmluZyB8IHVuZGVmaW5lZCk6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4ge1xuICBjb25zdCBlbnZWYXJzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge307XG4gIGZvciAoY29uc3QgY3VycmVudERpclBhdGggb2YgbmV3IFNldChyb290RGlyUGF0aCA/IFtkaXJQYXRoLCByb290RGlyUGF0aF0gOiBbZGlyUGF0aF0pKSB7XG4gICAgY29uc3QgY2xvdWRmbGFyZUVudlBhdGggPSBwYXRoLmpvaW4oY3VycmVudERpclBhdGgsICcuZW52LmNsb3VkZmxhcmUnKTtcbiAgICBpZiAoIWZzLmV4aXN0c1N5bmMoY2xvdWRmbGFyZUVudlBhdGgpKSBjb250aW51ZTtcbiAgICBjb25zdCBwYXJzZWQgPSBjb25maWcoeyBwYXRoOiBjbG91ZGZsYXJlRW52UGF0aCwgcHJvY2Vzc0Vudjoge30sIHF1aWV0OiB0cnVlIH0pLnBhcnNlZCA/PyB7fTtcbiAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhwYXJzZWQpKSB7XG4gICAgICBpZiAoa2V5ID09PSAnQ0xPVURGTEFSRV9FTlYnKSBjb250aW51ZTtcbiAgICAgIGVudlZhcnNba2V5XSA/Pz0gdmFsdWU7XG4gICAgfVxuICB9XG4gIHJldHVybiBlbnZWYXJzO1xufVxuXG4vKipcbiAqIFNlbGVjdCB0aGUgc2VjcmV0cyB0byBwdXNoIHRvIHRoZSBXb3JrZXIgZnJvbSB0aGUgZG90ZW52LWxvYWRlZCBlbnZpcm9ubWVudCB2YXJpYWJsZXM6XG4gKiBldmVyeSBleHBsaWNpdGx5IHNldCB2YWx1ZSDigJQgaW5jbHVkaW5nIGVtcHR5IHN0cmluZ3MsIHdoaWNoIGNsZWFyIHN0YWxlIHJlbW90ZSBzZWNyZXRzXG4gKiBzaW5jZSBgd3JhbmdsZXIgZGVwbG95IC0tc2VjcmV0cy1maWxlYCBpcyBhZGRpdGl2ZSDigJQgZXhjZXB0IHdyYW5nbGVyIGB2YXJzYCAoYSBzZWNyZXQgbWF5XG4gKiBub3Qgc2hhcmUgYSBuYW1lIHdpdGggYSB2YXIpLCBkZXBsb3ktY29udHJvbCBrZXlzLCBhbmQgbG9jYWwgYGZpbGU6YCBEQVRBQkFTRV9VUkxzLlxuICogUmV0dXJucyB0aGUgcmVxdWlyZWQga2V5cyAoZnJvbSAuZW52LmV4YW1wbGUpIHRoYXQgYXJlIHN0aWxsIGVtcHR5IHNvIHRoZSBkZXBsb3kgY2FuXG4gKiBhYm9ydCBiZWZvcmUgYW55IHJlbW90ZSBtdXRhdGlvbi5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNlbGVjdFdvcmtlclNlY3JldHMoXG4gIGVudlZhcnM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4sXG4gIGNvbmZpZ1ZhcktleXM6IHN0cmluZ1tdLFxuICByZXF1aXJlZEtleXM6IHN0cmluZ1tdXG4pOiB7IG1pc3NpbmdLZXlzOiBzdHJpbmdbXTsgc2VjcmV0czogUmVjb3JkPHN0cmluZywgc3RyaW5nPiB9IHtcbiAgY29uc3QgY29uZmlnS2V5cyA9IG5ldyBTZXQoY29uZmlnVmFyS2V5cyk7XG4gIGNvbnN0IHNlY3JldHM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7fTtcbiAgLy8gTm8gcnVudGltZSB1bmRlZmluZWQgY2hlY2sgb24gYHZhbHVlYDogZW52VmFycyBpcyBidWlsdCBleGNsdXNpdmVseSBmcm9tIGRvdGVudi1wYXJzZWRcbiAgLy8gc3RyaW5ncywgYW5kIGV2ZXJ5IGNhbGxlci1zaWRlIG1lcmdlIGVpdGhlciBjb2FsZXNjZXMgd2l0aCBgPz8gJydgIG9yIGd1YXJkcyBhZ2FpbnN0XG4gIC8vIHVuZGVmaW5lZCBiZWZvcmUgYXNzaWduaW5nLCBzbyB0aGUgUmVjb3JkPHN0cmluZywgc3RyaW5nPiB0eXBlIGhvbGRzIGF0IHJ1bnRpbWUgdG9vLlxuICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhlbnZWYXJzKSkge1xuICAgIGlmIChjb25maWdLZXlzLmhhcyhrZXkpIHx8IGlzTm9uU2VjcmV0S2V5KGtleSkpIGNvbnRpbnVlO1xuICAgIGlmIChrZXkgPT09ICdEQVRBQkFTRV9VUkwnICYmIHZhbHVlLnN0YXJ0c1dpdGgoJ2ZpbGU6JykpIGNvbnRpbnVlO1xuICAgIHNlY3JldHNba2V5XSA9IHZhbHVlO1xuICB9XG4gIGNvbnN0IG1pc3NpbmdLZXlzID0gcmVxdWlyZWRLZXlzLmZpbHRlcigoa2V5KSA9PiAhY29uZmlnS2V5cy5oYXMoa2V5KSAmJiAhaXNOb25TZWNyZXRLZXkoa2V5KSAmJiAhZW52VmFyc1trZXldKTtcbiAgcmV0dXJuIHsgbWlzc2luZ0tleXMsIHNlY3JldHMgfTtcbn1cblxuLyoqXG4gKiBMaXN0IHRoZSBzZWNyZXQgbmFtZXMgY3VycmVudGx5IGF0dGFjaGVkIHRvIHRoZSBkZXBsb3kgdGFyZ2V0IFdvcmtlci4gUmV0dXJucyB1bmRlZmluZWQgd2hlblxuICogdGhlIGxpc3RpbmcgZmFpbHMgZm9yIGFueSByZWFzb24gb3RoZXIgdGhhbiB0aGUgV29ya2VyIG5vdCBleGlzdGluZyB5ZXQgKGZpcnN0IGRlcGxveSksIHNvXG4gKiB0aGUgY2FsbGVyIGNhbiBkZWdyYWRlIHRvIHRoZSBsb2NhbC1vbmx5IGxpbWl0IGNoZWNrcyBpbnN0ZWFkIG9mIGJsb2NraW5nIGEgZGVwbG95IHRoYXRcbiAqIHdyYW5nbGVyIGl0c2VsZiBtaWdodCBhY2NlcHQuIEZhaWxpbmcgY2xvc2VkIGluc3RlYWQgd291bGQgdHVybiBldmVyeSB0cmFuc2llbnQgbGlzdGluZ1xuICogZmFpbHVyZSAobmV0d29yaywgYSB0b2tlbiB3aXRob3V0IHNlY3JldC1yZWFkIHBlcm1pc3Npb24pIGludG8gYSBkZXBsb3kgYmxvY2tlciwgYW5kIOKAlCBzaW5jZVxuICogd3JhbmdsZXIgNC54IHJlcG9ydHMgYSBtaXNzaW5nIFdvcmtlciBvbmx5IHZpYSBhbiBlcnJvci1tZXNzYWdlIGhpbnQg4oCUIGFueSB1bnJlY29nbml6ZWRcbiAqIG5vdC1mb3VuZCBzaGFwZSB3b3VsZCB0aGVuIGJsb2NrIGZpcnN0IGRlcGxveXMgZW50aXJlbHk7IHRoaXMgcHJlZmxpZ2h0IG11c3Qgb25seSBldmVyIGFkZFxuICogZmFpbHVyZXMgdGhhdCB3cmFuZ2xlciBpdHNlbGYgd291bGQgcmFpc2UgYWZ0ZXIgdGhlIG1pZ3JhdGlvbnMuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGxpc3RSZW1vdGVXb3JrZXJTZWNyZXROYW1lcyhcbiAgcHJvamVjdDogUHJvamVjdCxcbiAgYXJndjogRGVwbG95Q29tbWFuZEFyZ3YsXG4gIHdyYW5nbGVyQ29uZmlnUGF0aDogc3RyaW5nLFxuICByZXNvbHZlZENvbmZpZzogUmVzb2x2ZWRXcmFuZ2xlckNvbmZpZyxcbiAgZW52TmFtZTogc3RyaW5nXG4pOiBQcm9taXNlPHN0cmluZ1tdIHwgdW5kZWZpbmVkPiB7XG4gIHByZXBhcmVMb2NhbEJpblBhdGgocHJvamVjdCk7XG4gIGNvbnN0IGxpc3RBcmdzID0gW1xuICAgICdzZWNyZXQnLFxuICAgICdsaXN0JyxcbiAgICAnLS1mb3JtYXQnLFxuICAgICdqc29uJyxcbiAgICAnLS1jb25maWcnLFxuICAgIHdyYW5nbGVyQ29uZmlnUGF0aCxcbiAgICAuLi4ocmVzb2x2ZWRDb25maWcudXNlc0VudlNlY3Rpb24gPyBbJy0tZW52JywgZW52TmFtZV0gOiBbXSksXG4gIF07XG4gIGNvbnNvbGUuaW5mbyhjaGFsay5jeWFuKGBSdW5uaW5nOiB3cmFuZ2xlciAke2xpc3RBcmdzLmpvaW4oJyAnKX1gKSk7XG4gIGxldCByZXQ7XG4gIHRyeSB7XG4gICAgcmV0ID0gYXdhaXQgc3Bhd25Bc3luYygnd3JhbmdsZXInLCBsaXN0QXJncywge1xuICAgICAgY3dkOiBwcm9qZWN0LmRpclBhdGgsXG4gICAgICBlbnY6IHByb2plY3QuZW52IGFzIE5vZGVKUy5Qcm9jZXNzRW52LFxuICAgICAgc3RkaW86ICdwaXBlJyxcbiAgICAgIGtpbGxPbkV4aXQ6IHRydWUsXG4gICAgICB2ZXJib3NlOiBhcmd2LnZlcmJvc2UsXG4gICAgfSk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgY29uc29sZS53YXJuKFxuICAgICAgY2hhbGsueWVsbG93KFxuICAgICAgICBgRmFpbGVkIHRvIHJ1biB3cmFuZ2xlciB0byBsaXN0IHJlbW90ZSBzZWNyZXRzOyBjaGVja2luZyBvbmx5IHRoZSBsb2NhbCBwYXlsb2FkIGFnYWluc3QgQ2xvdWRmbGFyZSdzIGxpbWl0cy5cXG4ke2Vycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogU3RyaW5nKGVycm9yKX1gXG4gICAgICApXG4gICAgKTtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG4gIGlmIChyZXQuc3RhdHVzID09PSAwKSB7XG4gICAgLy8gQ3V0IHRoZSBKU09OIGFycmF5IG91dCBvZiB0aGUgc3Vycm91bmRpbmcgb3V0cHV0OiB3cmFuZ2xlciBtYXkgcHJpbnQgaXRzIGJhbm5lciBhbmRcbiAgICAvLyBcIk11bHRpcGxlIGVudmlyb25tZW50c1wiIHdhcm5pbmdzIGFyb3VuZCB0aGUgcGF5bG9hZC5cbiAgICBjb25zdCBqc29uU3RhcnQgPSByZXQuc3Rkb3V0LmluZGV4T2YoJ1snKTtcbiAgICBjb25zdCBqc29uRW5kID0gcmV0LnN0ZG91dC5sYXN0SW5kZXhPZignXScpO1xuICAgIGlmIChqc29uU3RhcnQgIT09IC0xICYmIGpzb25FbmQgIT09IC0xICYmIGpzb25TdGFydCA8IGpzb25FbmQpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHBhcnNlZCA9IEpTT04ucGFyc2UocmV0LnN0ZG91dC5zbGljZShqc29uU3RhcnQsIGpzb25FbmQgKyAxKSkgYXMgeyBuYW1lPzogdW5rbm93biB9W107XG4gICAgICAgIHJldHVybiBwYXJzZWQubWFwKCh7IG5hbWUgfSkgPT4gbmFtZSkuZmlsdGVyKChuYW1lKTogbmFtZSBpcyBzdHJpbmcgPT4gdHlwZW9mIG5hbWUgPT09ICdzdHJpbmcnKTtcbiAgICAgIH0gY2F0Y2gge1xuICAgICAgICAvLyBGYWxsIHRocm91Z2ggdG8gdGhlIHdhcm5pbmcgYmVsb3cuXG4gICAgICB9XG4gICAgfVxuICB9IGVsc2UgaWYgKC9cXFtjb2RlOiAxMDAoMDd8OTApXFxdfElmIHRoaXMgaXMgYSBuZXcgV29ya2VyLy50ZXN0KHJldC5zdGRvdXQgKyByZXQuc3RkZXJyKSkge1xuICAgIC8vIFRoZSBXb3JrZXIgZG9lcyBub3QgZXhpc3QgeWV0LCBzbyBhIGZpcnN0IGRlcGxveSBpbmhlcml0cyBub3RoaW5nLiBXcmFuZ2xlciA0LnggY2F0Y2hlc1xuICAgIC8vIHRoZSBDbG91ZGZsYXJlIEFQSSBlcnJvcnMgMTAwMDcgKHdvcmtlcnMuYXBpLmVycm9yLnNlcnZpY2Vfbm90X2ZvdW5kKSBhbmQgMTAwOTBcbiAgICAvLyAod29ya2Vycy5hcGkuZXJyb3Iuc2NyaXB0X25vdF9mb3VuZCkgYW5kIHJldGhyb3dzIHRoZW0gYXMgYSBVc2VyRXJyb3IgY29udGFpbmluZyB0aGVcbiAgICAvLyAnSWYgdGhpcyBpcyBhIG5ldyBXb3JrZXIsIHJ1biBgd3JhbmdsZXIgZGVwbG95YCBmaXJzdCcgaGludCB3aXRob3V0IHRoZSBudW1lcmljIGNvZGUsXG4gICAgLy8gc28gbWF0Y2ggYm90aCBzaGFwZXMuXG4gICAgcmV0dXJuIFtdO1xuICB9XG4gIGNvbnNvbGUud2FybihcbiAgICBjaGFsay55ZWxsb3coXG4gICAgICBgRmFpbGVkIHRvIGxpc3QgdGhlIHJlbW90ZSBXb3JrZXIgc2VjcmV0czsgY2hlY2tpbmcgb25seSB0aGUgbG9jYWwgcGF5bG9hZCBhZ2FpbnN0IENsb3VkZmxhcmUncyBsaW1pdHMuXFxuJHsocmV0LnN0ZGVyciB8fCByZXQuc3Rkb3V0KS50cmltKCl9YFxuICAgIClcbiAgKTtcbiAgcmV0dXJuIHVuZGVmaW5lZDtcbn1cblxuLyoqXG4gKiBSZW1vdGUgc2VjcmV0cyB0aGF0IHN0YXkgYXR0YWNoZWQgdG8gdGhlIG5ldyB2ZXJzaW9uOiBgd3JhbmdsZXIgZGVwbG95IC0tc2VjcmV0cy1maWxlYCBpc1xuICogYWRkaXRpdmUsIHNvIGV2ZXJ5IHJlbW90ZSBzZWNyZXQgdGhlIG91dGdvaW5nIHBheWxvYWQgZG9lcyBub3Qgb3ZlcndyaXRlIGtlZXBzIGNvdW50aW5nXG4gKiBhZ2FpbnN0IENsb3VkZmxhcmUncyBjb21iaW5lZCB2YXJpYWJsZStzZWNyZXQgbGltaXQg4oCUIGV4Y2VwdCBuYW1lcyB0aGF0IGFuIGVmZmVjdGl2ZSB2YXIgb3JcbiAqIGJpbmRpbmcgcmVwbGFjZXMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzZWxlY3RJbmhlcml0ZWRSZW1vdGVTZWNyZXROYW1lcyhcbiAgcmVtb3RlU2VjcmV0TmFtZXM6IHN0cmluZ1tdLFxuICBvdXRnb2luZ1NlY3JldHM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4sXG4gIGVmZmVjdGl2ZVZhcktleXM6IHJlYWRvbmx5IHN0cmluZ1tdLFxuICBiaW5kaW5nTmFtZXM6IHJlYWRvbmx5IHN0cmluZ1tdXG4pOiBzdHJpbmdbXSB7XG4gIGNvbnN0IHJlcGxhY2VkTmFtZXMgPSBuZXcgU2V0KFsuLi5lZmZlY3RpdmVWYXJLZXlzLCAuLi5iaW5kaW5nTmFtZXNdKTtcbiAgcmV0dXJuIHJlbW90ZVNlY3JldE5hbWVzLmZpbHRlcigobmFtZSkgPT4gIU9iamVjdC5oYXNPd24ob3V0Z29pbmdTZWNyZXRzLCBuYW1lKSAmJiAhcmVwbGFjZWROYW1lcy5oYXMobmFtZSkpO1xufVxuXG4vKipcbiAqIFJlYWRpbmcgYmluRXhpc3RzIHByZXBlbmRzIG5vZGVfbW9kdWxlcy8uYmluIGRpcmVjdG9yaWVzIHRvIHByb2plY3QuZW52LlBBVEgsXG4gKiBzbyB0aGUgZGlyZWN0IChub24tc2hlbGwpIHdyYW5nbGVyIHNwYXducyByZXNvbHZlIHRoZSBsb2NhbCBiaW5hcnkuXG4gKi9cbmZ1bmN0aW9uIHByZXBhcmVMb2NhbEJpblBhdGgocHJvamVjdDogUHJvamVjdCk6IHZvaWQge1xuICBpZiAoIXByb2plY3QuYmluRXhpc3RzKSB7XG4gICAgY29uc29sZS53YXJuKGNoYWxrLnllbGxvdygnbm9kZV9tb2R1bGVzLy5iaW4gbm90IGZvdW5kOyByZWx5aW5nIG9uIFBBVEggdG8gcmVzb2x2ZSB3cmFuZ2xlci4nKSk7XG4gIH1cbn1cbiIsImltcG9ydCB7IHNwYXduIH0gZnJvbSAnbm9kZTpjaGlsZF9wcm9jZXNzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB7IHJlYWRGbm94RW52aXJvbm1lbnRWYXJpYWJsZXMsIHJlbW92ZU5wbUFuZFlhcm5FbnZpcm9ubWVudFZhcmlhYmxlcyB9IGZyb20gJ0B3aWxsYm9vc3Rlci9zaGFyZWQtbGliLW5vZGUvc3JjJztcbmltcG9ydCB7IGNvbmZpZyB9IGZyb20gJ2RvdGVudic7XG5pbXBvcnQgeyBleHBhbmQgfSBmcm9tICdkb3RlbnYtZXhwYW5kJztcbmltcG9ydCB0eXBlIHsgQXJndW1lbnRzQ2FtZWxDYXNlLCBBcmd2LCBDb21tYW5kTW9kdWxlIH0gZnJvbSAneWFyZ3MnO1xuXG5pbXBvcnQgeyBwcmVwZW5kTm9kZU1vZHVsZXNCaW5Ub1BhdGggfSBmcm9tICcuLi91dGlscy9iaW5QYXRoLmpzJztcblxuaW50ZXJmYWNlIFBhcnNlZERvdGVudkFyZ3Mge1xuICBjb21tYW5kOiBzdHJpbmdbXTtcbn1cblxuY29uc3Qgc2h1dGRvd25TaWduYWxzID0gbmV3IFNldDxOb2RlSlMuU2lnbmFscz4oWydTSUdJTlQnLCAnU0lHVEVSTScsICdTSUdRVUlUJ10pO1xuXG5leHBvcnQgY29uc3QgZG90ZW52Q29tbWFuZDogQ29tbWFuZE1vZHVsZSA9IHtcbiAgY29tbWFuZDogJ2RvdGVudiBbYXJncy4uXScsXG4gIGRlc2NyaWJlOiAnTG9hZCAuZW52IGZpbGVzIGFuZCBydW4gYSBjb21tYW5kLicsXG4gIGJ1aWxkZXI6ICh5YXJnczogQXJndjx1bmtub3duPikgPT4geWFyZ3MucGFyc2VyQ29uZmlndXJhdGlvbih7ICdwb3B1bGF0ZS0tJzogdHJ1ZSB9KSxcbiAgYXN5bmMgaGFuZGxlcihhcmd2KSB7XG4gICAgYXdhaXQgcnVuUGFyc2VkRG90ZW52Q29tbWFuZChnZXRQYXJzZWREb3RlbnZBcmdzRnJvbVlhcmdzKGFyZ3YpKTtcbiAgfSxcbn07XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBydW5Eb3RlbnZDb21tYW5kKGFyZ3M6IHN0cmluZ1tdKTogUHJvbWlzZTx2b2lkPiB7XG4gIGF3YWl0IHJ1blBhcnNlZERvdGVudkNvbW1hbmQocGFyc2VEb3RlbnZBcmdzKGFyZ3MpKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gcnVuUGFyc2VkRG90ZW52Q29tbWFuZCh7IGNvbW1hbmQgfTogUGFyc2VkRG90ZW52QXJncyk6IFByb21pc2U8dm9pZD4ge1xuICBpZiAoY29tbWFuZC5sZW5ndGggPT09IDApIHtcbiAgICBjb25zb2xlLmVycm9yKCdVc2FnZTogd2IgZG90ZW52IC0tIDxjb21tYW5kPiBbYXJncy4uLl0nKTtcbiAgICBwcm9jZXNzLmV4aXQoMSk7XG4gIH1cblxuICBjb25zdCBjd2QgPSBwYXRoLnJlc29sdmUocHJvY2Vzcy5jd2QoKSk7XG4gIHJlYWRBbmRBcHBseUVudmlyb25tZW50VmFyaWFibGVzKGN3ZCk7XG4gIGNvbnN0IGJlcnJ5QmluRm9sZGVyUGF0aCA9IHByb2Nlc3MuZW52LkJFUlJZX0JJTl9GT0xERVI7XG4gIHJlbW92ZU5wbUFuZFlhcm5FbnZpcm9ubWVudFZhcmlhYmxlcyhwcm9jZXNzLmVudik7XG4gIC8vIFN0cmlwcGluZyB5YXJuJ3MgZW52aXJvbm1lbnQgYWxzbyByZW1vdmVzIGl0cyB0ZW1wb3JhcnkgYmluIGZvbGRlciDigJQgdGhlIE9OTFkgcGxhY2VcbiAgLy8geWFybiBCZXJyeSBleHBvc2VzIGRlcGVuZGVuY3kgZXhlY3V0YWJsZXMg4oCUIHNvIHJlc3RvcmUgdGhlIHByb2plY3QncyBvd25cbiAgLy8gbm9kZV9tb2R1bGVzLy5iaW4gZGlyZWN0b3JpZXMgdG8ga2VlcCBiYXJlIGJpbmFyeSBuYW1lcyByZXNvbHZhYmxlLiBQbHVnJ24nUGxheSBpbnN0YWxsc1xuICAvLyBjcmVhdGUgbm8gbm9kZV9tb2R1bGVzIGF0IGFsbDsgdGhlIHRlbXBvcmFyeSBiaW4gZm9sZGVyIGlzIHRoZW4gdGhlIHNvbGUgc291cmNlIG9mXG4gIC8vIGRlcGVuZGVuY3kgZXhlY3V0YWJsZXMsIHNvIHJlc3RvcmUgaXQgaW5zdGVhZC5cbiAgLy8gVGhlIHRlbXBvcmFyeSBmb2xkZXIgaXMgZGVsaWJlcmF0ZWx5IE5PVCByZXN0b3JlZCB3aGVuIC5iaW4gZGlyZWN0b3JpZXMgZXhpc3Q6IGl0IGFsc29cbiAgLy8gY29udGFpbnMgbm9kZS95YXJuIHNoaW1zLCBhbmQgYSBsZWFrZWQgbm9kZSBzaGltIHdvdWxkIHZpb2xhdGUgd2IncyByZWFsLU5vZGUgZ3VhcmFudGVlXG4gIC8vIGZvciB0b29scyBsaWtlIHdyYW5nbGVyL3ZpbmV4dC4gQ2hpbGQgYHlhcm5gIGludm9jYXRpb25zIHN0YXkgcmVzb2x2YWJsZSB0aHJvdWdoIHRoZVxuICAvLyBsYXVuY2hlciBvbiB0aGUgYmFzZSBQQVRIIChtaXNlL2NvcmVwYWNrKSwgd2hpY2ggZXZlcnkgc3VwcG9ydGVkIGVudmlyb25tZW50IGhhcyDigJRcbiAgLy8gbm90aGluZyBjb3VsZCBoYXZlIHN0YXJ0ZWQgYHlhcm4gcnVuYC9gd2IgZG90ZW52YCB3aXRob3V0IGl0LlxuICBpZiAoIXByZXBlbmROb2RlTW9kdWxlc0JpblRvUGF0aChjd2QsIHByb2Nlc3MuZW52KSAmJiBiZXJyeUJpbkZvbGRlclBhdGgpIHtcbiAgICBwcm9jZXNzLmVudi5QQVRIID0gcHJvY2Vzcy5lbnYuUEFUSCA/IGAke2JlcnJ5QmluRm9sZGVyUGF0aH06JHtwcm9jZXNzLmVudi5QQVRIfWAgOiBiZXJyeUJpbkZvbGRlclBhdGg7XG4gIH1cblxuICBjb25zdCBjaGlsZCA9IHNwYXduKGNvbW1hbmRbMF0hLCBjb21tYW5kLnNsaWNlKDEpLCB7XG4gICAgY3dkLFxuICAgIGVudjogcHJvY2Vzcy5lbnYsXG4gICAgc3RkaW86ICdpbmhlcml0JyxcbiAgfSk7XG4gIGNvbnN0IHNpZ25hbEhhbmRsZXJzID0gbmV3IE1hcDxOb2RlSlMuU2lnbmFscywgKCkgPT4gdm9pZD4oKTtcbiAgbGV0IGZvcndhcmRlZFNodXRkb3duU2lnbmFsOiBOb2RlSlMuU2lnbmFscyB8IHVuZGVmaW5lZDtcbiAgY2hpbGQub24oJ2Vycm9yJywgKGVycm9yKSA9PiB7XG4gICAgY29uc29sZS5lcnJvcihlcnJvcik7XG4gICAgcHJvY2Vzcy5leGl0KDEpO1xuICB9KTtcbiAgZm9yIChjb25zdCBzaWduYWwgb2Ygc2h1dGRvd25TaWduYWxzKSB7XG4gICAgY29uc3Qgc2lnbmFsSGFuZGxlciA9ICgpOiB2b2lkID0+IHtcbiAgICAgIGZvcndhcmRlZFNodXRkb3duU2lnbmFsID0gc2lnbmFsO1xuICAgICAgY2hpbGQua2lsbChzaWduYWwpO1xuICAgIH07XG4gICAgc2lnbmFsSGFuZGxlcnMuc2V0KHNpZ25hbCwgc2lnbmFsSGFuZGxlcik7XG4gICAgcHJvY2Vzcy5vbmNlKHNpZ25hbCwgc2lnbmFsSGFuZGxlcik7XG4gIH1cbiAgY2hpbGQub24oJ2V4aXQnLCAoY29kZSwgc2lnbmFsKSA9PiB7XG4gICAgZm9yIChjb25zdCBbc2h1dGRvd25TaWduYWwsIHNpZ25hbEhhbmRsZXJdIG9mIHNpZ25hbEhhbmRsZXJzKSB7XG4gICAgICBwcm9jZXNzLm9mZihzaHV0ZG93blNpZ25hbCwgc2lnbmFsSGFuZGxlcik7XG4gICAgfVxuICAgIGlmIChzaWduYWwgJiYgc2lnbmFsID09PSBmb3J3YXJkZWRTaHV0ZG93blNpZ25hbCkge1xuICAgICAgcHJvY2Vzcy5leGl0KDApO1xuICAgIH1cbiAgICBpZiAoc2lnbmFsKSB7XG4gICAgICBwcm9jZXNzLmtpbGwocHJvY2Vzcy5waWQsIHNpZ25hbCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHByb2Nlc3MuZXhpdChjb2RlID8/IDEpO1xuICB9KTtcbn1cblxuZnVuY3Rpb24gZ2V0UGFyc2VkRG90ZW52QXJnc0Zyb21ZYXJncyhhcmd2OiBBcmd1bWVudHNDYW1lbENhc2UpOiBQYXJzZWREb3RlbnZBcmdzIHtcbiAgcmV0dXJuIHtcbiAgICBjb21tYW5kOiBbXG4gICAgICAuLi4oKGFyZ3YuYXJncyBhcyB1bmtub3duW10gfCB1bmRlZmluZWQpID8/IFtdKS5tYXAoU3RyaW5nKSxcbiAgICAgIC4uLigoYXJndlsnLS0nXSBhcyB1bmtub3duW10gfCB1bmRlZmluZWQpID8/IFtdKS5tYXAoU3RyaW5nKSxcbiAgICBdLFxuICB9O1xufVxuXG5mdW5jdGlvbiBwYXJzZURvdGVudkFyZ3MoYXJnczogc3RyaW5nW10pOiBQYXJzZWREb3RlbnZBcmdzIHtcbiAgY29uc3Qgc2VwYXJhdG9ySW5kZXggPSBhcmdzLmluZGV4T2YoJy0tJyk7XG4gIHJldHVybiB7IGNvbW1hbmQ6IHNlcGFyYXRvckluZGV4ID09PSAtMSA/IGFyZ3MgOiBhcmdzLnNsaWNlKHNlcGFyYXRvckluZGV4ICsgMSkgfTtcbn1cblxuZnVuY3Rpb24gcmVhZEFuZEFwcGx5RW52aXJvbm1lbnRWYXJpYWJsZXMoY3dkOiBzdHJpbmcpOiB2b2lkIHtcbiAgY29uc3QgZG90ZW52VmFycyA9IHtcbiAgICAuLi5jb25maWcoeyBwYXRoOiBwYXRoLmpvaW4oY3dkLCAnLmVudicpLCBwcm9jZXNzRW52OiB7fSwgcXVpZXQ6IHRydWUgfSkucGFyc2VkLFxuICAgIC4uLihwcm9jZXNzLmVudi5XQl9FTlZcbiAgICAgID8gKGNvbmZpZyh7IHBhdGg6IHBhdGguam9pbihjd2QsIGAuZW52LiR7cHJvY2Vzcy5lbnYuV0JfRU5WfWApLCBwcm9jZXNzRW52OiB7fSwgcXVpZXQ6IHRydWUgfSkucGFyc2VkID8/IHt9KVxuICAgICAgOiB7fSksXG4gIH07XG4gIC8vIGZub3gudG9tbCBpcyB0aGUgY29tbWl0dGVkLCBlbmNyeXB0ZWQgZXF1aXZhbGVudCBvZiAuZW52IGZpbGVzOyBsb2NhbCAuZW52IGZpbGVzIHN0aWxsIHdpbiBvdmVyIGl0LlxuICBjb25zdCBbZm5veFZhcnNdID0gcmVhZEZub3hFbnZpcm9ubWVudFZhcmlhYmxlcyhjd2QsIHByb2Nlc3MuZW52LldCX0VOViwgZG90ZW52VmFycyk7XG4gIGNvbnN0IHBhcnNlZCA9IHsgLi4uZm5veFZhcnMsIC4uLmRvdGVudlZhcnMgfTtcbiAgY29uc3QgZW52VmFycyA9IGV4cGFuZCh7IHBhcnNlZCwgcHJvY2Vzc0Vudjoge30gfSkucGFyc2VkID8/IHBhcnNlZDtcbiAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMoZW52VmFycykpIHtcbiAgICBpZiAoIShrZXkgaW4gcHJvY2Vzcy5lbnYpKSB7XG4gICAgICBwcm9jZXNzLmVudltrZXldID0gdmFsdWU7XG4gICAgfVxuICB9XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgdHlwZSB7IFByb2plY3QgfSBmcm9tICcuLi9wcm9qZWN0LmpzJztcbmltcG9ydCB7IEZJTEVfU0NIRU1BLCBnZXRGaWxlRGF0YWJhc2VVcmxQYXRoIH0gZnJvbSAnLi4vcHJvamVjdC5qcyc7XG5cbmNvbnN0IExJVEVTVFJFQU1fQ09ORklHX0ZJTEVfTkFNRSA9ICdsaXRlc3RyZWFtLnltbCc7XG5jb25zdCBERUZBVUxUX0xJVEVTVFJFQU1fQ09ORklHX1BBVEggPSAnL2V0Yy9saXRlc3RyZWFtLnltbCc7XG5cbmNvbnN0IFBPU1NJQkxFX1BSSVNNQV9QQVRIUyA9IFtcbiAgeyBzY2hlbWFQYXRoOiBwYXRoLmpvaW4oJ3ByaXNtYScsICdzY2hlbWEucHJpc21hJyksIGRiUGF0aDogJ3ByaXNtYScgfSxcbiAgeyBzY2hlbWFQYXRoOiBwYXRoLmpvaW4oJ3ByaXNtYScsICdzY2hlbWEnKSwgZGJQYXRoOiBwYXRoLmpvaW4oJ3ByaXNtYScsICdzY2hlbWEnKSB9LFxuICB7IHNjaGVtYVBhdGg6IHBhdGguam9pbignZGInLCAnc2NoZW1hLnByaXNtYScpLCBkYlBhdGg6ICdkYicgfSxcbl07XG5cbi8qKlxuICogQSBjb2xsZWN0aW9uIG9mIHNjcmlwdHMgZm9yIGV4ZWN1dGluZyBQcmlzbWEgY29tbWFuZHMuXG4gKiBOb3RlIHRoYXQgYFBSSVNNQWAgaXMgcmVwbGFjZWQgd2l0aCBgWUFSTiBwcmlzbWFgIG9yIGBZQVJOIGJsaXR6IHByaXNtYWBcbiAqIGFuZCBgWUFSTiB6enpgIGlzIHJlcGxhY2VkIHdpdGggYHlhcm4genp6YCBvciBgbm9kZV9tb2R1bGVzLy5iaW4venp6YC5cbiAqL1xuY2xhc3MgUHJpc21hU2NyaXB0cyB7XG4gIGNsZWFuVXBMaXRlc3RyZWFtKHByb2plY3Q6IFByb2plY3QpOiBzdHJpbmcge1xuICAgIGNvbnN0IGRpclBhdGggPSBnZXREYXRhYmFzZURpclBhdGgocHJvamVjdCk7XG4gICAgY29uc3QgY2xlYW5VcENvbW1hbmQgPSBidWlsZFdhbENoZWNrcG9pbnRBbmRSZW1vdmVTcWxpdGVTaWRlY2FyRmlsZXNDb21tYW5kKGAke2RpclBhdGh9L3Byb2Quc3FsaXRlM2ApO1xuICAgIC8vIENsZWFudXAgZXhpc3RpbmcgYXJ0aWZhY3RzIHRvIGF2b2lkIGlzc3VlcyB3aXRoIExpdGVzdHJlYW0gcmVwbGljYXRpb24uXG4gICAgLy8gTm90ZSB0aGF0IGRvbid0IG1lcmdlIG11bHRpcGxlIHJtIGNvbW1hbmRzIGludG8gb25lLCBiZWNhdXNlIGlmIG9uZSBmYWlscywgdGhlIHN1YnNlcXVlbnQgb25lcyB3b24ndCBydW4uXG4gICAgcmV0dXJuIGAke2NsZWFuVXBDb21tYW5kfTsgcm0gLVJmICR7ZGlyUGF0aH0vLnByb2Quc3FsaXRlMyogfHwgdHJ1ZWA7XG4gIH1cblxuICBkZXBsb3koXzogUHJvamVjdCwgYWRkaXRpb25hbE9wdGlvbnMgPSAnJyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGBQUklTTUEgbWlncmF0ZSBkZXBsb3kgJHthZGRpdGlvbmFsT3B0aW9uc31gO1xuICB9XG5cbiAgZ2VuZXJhdGUoXzogUHJvamVjdCwgYWRkaXRpb25hbE9wdGlvbnMgPSAnJyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIFsnUFJJU01BIGdlbmVyYXRlJywgYWRkaXRpb25hbE9wdGlvbnNdLmZpbHRlcihCb29sZWFuKS5qb2luKCcgJyk7XG4gIH1cblxuICBkZXBsb3lGb3JjZShwcm9qZWN0OiBQcm9qZWN0KTogc3RyaW5nIHtcbiAgICBjb25zdCBkaXJQYXRoID0gZ2V0RGF0YWJhc2VEaXJQYXRoKHByb2plY3QpO1xuICAgIGNvbnN0IHJlbW92ZURiQ29tbWFuZCA9IGJ1aWxkUmVtb3ZlU3FsaXRlRGJDb21tYW5kKGAke2RpclBhdGh9L3Byb2Quc3FsaXRlM2ApO1xuICAgIGNvbnN0IGxpdGVzdHJlYW1Db25maWdPcHRpb24gPSBnZXRMaXRlc3RyZWFtQ29uZmlnT3B0aW9uKHByb2plY3QpO1xuICAgIC8vIGBwcmlzbWEgbWlncmF0ZSByZXNldGAgY2FuIGZhaWwgZGVwZW5kaW5nIG9uIHRoZSBzdGF0ZSBvZiB0aGUgZXhpc3RpbmcgZGF0YWJhc2UsIHNvIHdlIHJlbW92ZSBpdCBmaXJzdC5cbiAgICAvLyBEb24ndCBza2lwIFwibWlncmF0ZSBkZXBsb3lcIiBiZWNhdXNlIHJlc3RvcmVkIGRhdGFiYXNlIG1heSBiZSBvbGRlciB0aGFuIHRoZSBjdXJyZW50IHNjaGVtYS5cbiAgICByZXR1cm4gYCR7cmVtb3ZlRGJDb21tYW5kfTsgUFJJU01BIG1pZ3JhdGUgcmVzZXQgLS1mb3JjZSAtLXNraXAtc2VlZCAmJiAke3JlbW92ZURiQ29tbWFuZH1cbiAgICAgICYmIGxpdGVzdHJlYW0gcmVzdG9yZSAke2xpdGVzdHJlYW1Db25maWdPcHRpb259IC1vICR7ZGlyUGF0aH0vcHJvZC5zcWxpdGUzICR7ZGlyUGF0aH0vcHJvZC5zcWxpdGUzICYmIGxzIC1haGwgJHtkaXJQYXRofS9wcm9kLnNxbGl0ZTMgJiYgQUxMT1dfVE9fU0tJUF9TRUVEPTAgUFJJU01BIG1pZ3JhdGUgZGVwbG95YDtcbiAgfVxuXG4gIGxpc3RCYWNrdXBzKHByb2plY3Q6IFByb2plY3QsIGNvbmZpZ1BhdGg/OiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGNvbnN0IGRpclBhdGggPSBnZXREYXRhYmFzZURpclBhdGgocHJvamVjdCk7XG4gICAgcmV0dXJuIGBsaXRlc3RyZWFtIGx0eCAke2dldExpdGVzdHJlYW1Db25maWdPcHRpb24ocHJvamVjdCwgY29uZmlnUGF0aCl9ICR7ZGlyUGF0aH0vcHJvZC5zcWxpdGUzYDtcbiAgfVxuXG4gIG1pZ3JhdGUocHJvamVjdDogUHJvamVjdCwgYWRkaXRpb25hbE9wdGlvbnMgPSAnJyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGBQUklTTUEgbWlncmF0ZSBkZXBsb3kgJHthZGRpdGlvbmFsT3B0aW9uc30gJiYgJHt0aGlzLmdlbmVyYXRlKHByb2plY3QpfSAmJiAke3RoaXMuc2VlZChwcm9qZWN0KX1gO1xuICB9XG5cbiAgbWlncmF0ZURldihfOiBQcm9qZWN0LCBhZGRpdGlvbmFsT3B0aW9ucyA9ICcnKTogc3RyaW5nIHtcbiAgICByZXR1cm4gYFBSSVNNQSBtaWdyYXRlIGRldiAke2FkZGl0aW9uYWxPcHRpb25zfWA7XG4gIH1cblxuICByZXNldChwcm9qZWN0OiBQcm9qZWN0LCBhZGRpdGlvbmFsT3B0aW9ucyA9ICcnKTogc3RyaW5nIHtcbiAgICAvLyBjZi4gaHR0cHM6Ly93d3cucHJpc21hLmlvL2RvY3MvZ3VpZGVzL2RhdGFiYXNlL3NlZWQtZGF0YWJhc2UjaW50ZWdyYXRlZC1zZWVkaW5nLXdpdGgtcHJpc21hLW1pZ3JhdGVcbiAgICBjb25zdCBzdGVwczogc3RyaW5nW10gPSBbXTtcbiAgICBjb25zdCBjbGVhbnVwQ29tbWFuZCA9IGNsZWFuVXBTcWxpdGVEYklmTmVlZGVkKHByb2plY3QpO1xuICAgIGlmIChjbGVhbnVwQ29tbWFuZCkgc3RlcHMucHVzaChjbGVhbnVwQ29tbWFuZCk7XG4gICAgY29uc3QgcmVzZXRDb21tYW5kID0gWydQUklTTUEgbWlncmF0ZSByZXNldCAtLWZvcmNlJywgYWRkaXRpb25hbE9wdGlvbnNdLmZpbHRlcihCb29sZWFuKS5qb2luKCcgJyk7XG4gICAgc3RlcHMucHVzaChyZXNldENvbW1hbmQpO1xuICAgIGlmIChwcm9qZWN0LnBhY2thZ2VKc29uLmRlcGVuZGVuY2llcz8uYmxpdHopIHtcbiAgICAgIC8vIEJsaXR6IGRvZXMgbm90IHRyaWdnZXIgc2VlZCBhdXRvbWF0aWNhbGx5LCBzbyB3ZSBuZWVkIHRvIHJ1biBpdCBtYW51YWxseS5cbiAgICAgIHN0ZXBzLnB1c2godGhpcy5zZWVkKHByb2plY3QpKTtcbiAgICB9XG4gICAgcmV0dXJuIHN0ZXBzLmZpbHRlcihCb29sZWFuKS5qb2luKCcgJiYgJyk7XG4gIH1cblxuICByZXN0b3JlKHByb2plY3Q6IFByb2plY3QsIG91dHB1dFBhdGg6IHN0cmluZywgY29uZmlnUGF0aD86IHN0cmluZyk6IHN0cmluZyB7XG4gICAgY29uc3QgZGlyUGF0aCA9IGdldERhdGFiYXNlRGlyUGF0aChwcm9qZWN0KTtcbiAgICByZXR1cm4gYHJtIC1SZiAke291dHB1dFBhdGh9KjsgbGl0ZXN0cmVhbSByZXN0b3JlICR7Z2V0TGl0ZXN0cmVhbUNvbmZpZ09wdGlvbihwcm9qZWN0LCBjb25maWdQYXRoKX0gLW8gJHtvdXRwdXRQYXRofSAke2RpclBhdGh9L3Byb2Quc3FsaXRlM2A7XG4gIH1cblxuICBzZWVkKHByb2plY3Q6IFByb2plY3QsIHNjcmlwdFBhdGg/OiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGlmIChwcm9qZWN0LnBhY2thZ2VKc29uLmRlcGVuZGVuY2llcz8uYmxpdHopIHJldHVybiBgWUFSTiBibGl0eiBkYiBzZWVkJHtzY3JpcHRQYXRoID8gYCAtZiAke3NjcmlwdFBhdGh9YCA6ICcnfWA7XG4gICAgaWYgKHNjcmlwdFBhdGgpIHJldHVybiBgQlVOIGJ1aWxkLXRzIHJ1biAke3NjcmlwdFBhdGh9YDtcbiAgICBpZiAoKHByb2plY3QucGFja2FnZUpzb24ucHJpc21hIGFzIFJlY29yZDxzdHJpbmcsIHN0cmluZz4gfCB1bmRlZmluZWQpPy5zZWVkKSByZXR1cm4gYFlBUk4gcHJpc21hIGRiIHNlZWRgO1xuICAgIHJldHVybiBgaWYgWyAtZSBcInByaXNtYS9zZWVkcy50c1wiIF07IHRoZW4gQlVOIGJ1aWxkLXRzIHJ1biBwcmlzbWEvc2VlZHMudHM7IGZpYDtcbiAgfVxuXG4gIHN0dWRpbyhwcm9qZWN0OiBQcm9qZWN0LCBkYlVybE9yUGF0aD86IHN0cmluZywgYWRkaXRpb25hbE9wdGlvbnMgPSAnJyk6IHN0cmluZyB7XG4gICAgbGV0IHByZWZpeCA9ICcnO1xuICAgIC8vIERlYWwgd2l0aCBQcmlzbWEgaXNzdWU6IGh0dHBzOi8vZ2l0aHViLmNvbS9wcmlzbWEvc3R1ZGlvL2lzc3Vlcy8xMjczXG4gICAgaWYgKGRiVXJsT3JQYXRoKSB7XG4gICAgICB0cnkge1xuICAgICAgICBuZXcgVVJMKGRiVXJsT3JQYXRoKTtcbiAgICAgICAgcHJlZml4ID0gYERBVEFCQVNFX1VSTD0ke2RiVXJsT3JQYXRofSBgO1xuICAgICAgfSBjYXRjaCB7XG4gICAgICAgIGNvbnN0IGFic29sdXRlUGF0aCA9IHBhdGgucmVzb2x2ZShkYlVybE9yUGF0aCk7XG4gICAgICAgIHByZWZpeCA9IGBEQVRBQkFTRV9VUkw9JHtGSUxFX1NDSEVNQX0ke2Fic29sdXRlUGF0aH0gYDtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHByb2plY3QuZW52LkRBVEFCQVNFX1VSTD8uc3RhcnRzV2l0aChGSUxFX1NDSEVNQSkpIHtcbiAgICAgIGNvbnN0IGJhc2VEaXIgPSBnZXRQcmlzbWFCYXNlRGlyKHByb2plY3QpO1xuICAgICAgaWYgKGJhc2VEaXIpIHtcbiAgICAgICAgY29uc3QgYWJzb2x1dGVQYXRoID0gcGF0aC5yZXNvbHZlKHByb2plY3QuZGlyUGF0aCwgYmFzZURpciwgcHJvamVjdC5lbnYuREFUQUJBU0VfVVJMLnNsaWNlKEZJTEVfU0NIRU1BLmxlbmd0aCkpO1xuICAgICAgICBwcmVmaXggPSBgREFUQUJBU0VfVVJMPSR7RklMRV9TQ0hFTUF9JHthYnNvbHV0ZVBhdGh9IGA7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBgJHtwcmVmaXh9UFJJU01BIHN0dWRpbyAke2FkZGl0aW9uYWxPcHRpb25zfWA7XG4gIH1cbn1cblxuZnVuY3Rpb24gZ2V0RGF0YWJhc2VEaXJQYXRoKHByb2plY3Q6IFByb2plY3QpOiBzdHJpbmcge1xuICByZXR1cm4gcHJvamVjdC5wYWNrYWdlSnNvbi5kZXBlbmRlbmNpZXM/LmJsaXR6ID8gJ2RiL21vdW50JyA6ICdwcmlzbWEvbW91bnQnO1xufVxuXG5mdW5jdGlvbiBnZXRQcmlzbWFCYXNlRGlyKHByb2plY3Q6IFByb2plY3QpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICByZXR1cm4gUE9TU0lCTEVfUFJJU01BX1BBVEhTLmZpbmQoKHsgc2NoZW1hUGF0aCB9KSA9PiBmcy5leGlzdHNTeW5jKHBhdGgucmVzb2x2ZShwcm9qZWN0LmRpclBhdGgsIHNjaGVtYVBhdGgpKSlcbiAgICA/LmRiUGF0aDtcbn1cblxuZnVuY3Rpb24gZ2V0TGl0ZXN0cmVhbUNvbmZpZ09wdGlvbihwcm9qZWN0OiBQcm9qZWN0LCBjb25maWdQYXRoPzogc3RyaW5nKTogc3RyaW5nIHtcbiAgaWYgKGNvbmZpZ1BhdGgpIHJldHVybiBgLWNvbmZpZyBcIiR7Y29uZmlnUGF0aH1cImA7XG5cbiAgY29uc3QgbG9jYWxDb25maWdQYXRoID0gcGF0aC5qb2luKHByb2plY3QuZGlyUGF0aCwgTElURVNUUkVBTV9DT05GSUdfRklMRV9OQU1FKTtcbiAgaWYgKGZzLmV4aXN0c1N5bmMobG9jYWxDb25maWdQYXRoKSkgcmV0dXJuIGAtY29uZmlnIC4vJHtMSVRFU1RSRUFNX0NPTkZJR19GSUxFX05BTUV9YDtcbiAgaWYgKGZzLmV4aXN0c1N5bmMoREVGQVVMVF9MSVRFU1RSRUFNX0NPTkZJR19QQVRIKSkgcmV0dXJuIGAtY29uZmlnICR7REVGQVVMVF9MSVRFU1RSRUFNX0NPTkZJR19QQVRIfWA7XG4gIHJldHVybiBgLWNvbmZpZyAuLyR7TElURVNUUkVBTV9DT05GSUdfRklMRV9OQU1FfWA7XG59XG5cbmZ1bmN0aW9uIGJ1aWxkUmVtb3ZlU3FsaXRlRGJDb21tYW5kKGRiUGF0aDogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIGBybSAtUmYgXCIke2RiUGF0aH1cIipgO1xufVxuXG5mdW5jdGlvbiBidWlsZFdhbENoZWNrcG9pbnRBbmRSZW1vdmVTcWxpdGVTaWRlY2FyRmlsZXNDb21tYW5kKGRiUGF0aDogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIGBpZiBbIC1mIFwiJHtkYlBhdGh9XCIgXTsgdGhlbiBwcmludGYgJ1BSQUdNQSB3YWxfY2hlY2twb2ludChUUlVOQ0FURSk7JyB8IFBSSVNNQSBkYiBleGVjdXRlIC0tc3RkaW4gLS11cmwgXCIke0ZJTEVfU0NIRU1BfSR7ZGJQYXRofVwiOyBmaSAmJiBybSAtZiBcIiR7ZGJQYXRofVwiLiogXCIke2RiUGF0aH1cIi0qYDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNsZWFuVXBTcWxpdGVEYklmTmVlZGVkKHByb2plY3Q6IFByb2plY3QpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBjb25zdCByYXdEYlBhdGggPSBnZXRGaWxlRGF0YWJhc2VVcmxQYXRoKHByb2plY3QpO1xuICBpZiAoIXJhd0RiUGF0aCkgcmV0dXJuO1xuXG4gIGNvbnN0IGJhc2VEaXIgPSBnZXRQcmlzbWFCYXNlRGlyKHByb2plY3QpO1xuICBjb25zdCBhYnNvbHV0ZVBhdGggPSBwYXRoLmlzQWJzb2x1dGUocmF3RGJQYXRoKVxuICAgID8gcmF3RGJQYXRoXG4gICAgOiBwYXRoLnJlc29sdmUocHJvamVjdC5kaXJQYXRoLCBiYXNlRGlyID8/ICcuJywgcmF3RGJQYXRoKTtcblxuICByZXR1cm4gYHJtIC1mIFwiJHthYnNvbHV0ZVBhdGh9XCIgXCIke2Fic29sdXRlUGF0aH0td2FsXCIgXCIke2Fic29sdXRlUGF0aH0tc2htXCJgO1xufVxuXG5leHBvcnQgY29uc3QgcHJpc21hU2NyaXB0cyA9IG5ldyBQcmlzbWFTY3JpcHRzKCk7XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgY2hhbGsgZnJvbSAnY2hhbGsnO1xuaW1wb3J0IHR5cGUgeyBDb21tYW5kTW9kdWxlIH0gZnJvbSAneWFyZ3MnO1xuXG5pbXBvcnQgdHlwZSB7IFByb2plY3QgfSBmcm9tICcuLi9wcm9qZWN0LmpzJztcbmltcG9ydCB7IGZpbmREZXNjZW5kYW50UHJvamVjdHMgfSBmcm9tICcuLi9wcm9qZWN0LmpzJztcbmltcG9ydCB7IGZpbmREcml6emxlQ29uZmlnLCB3cmFwV2l0aERyaXp6bGVDb25maWdEaXIgfSBmcm9tICcuLi9zY3JpcHRzL2RyaXp6bGVTY3JpcHRzLmpzJztcbmltcG9ydCB7IHByaXNtYVNjcmlwdHMgfSBmcm9tICcuLi9zY3JpcHRzL3ByaXNtYVNjcmlwdHMuanMnO1xuaW1wb3J0IHsgcnVuV2l0aFNwYXduIH0gZnJvbSAnLi4vc2NyaXB0cy9ydW4uanMnO1xuXG5jb25zdCBidWlsZGVyID0ge30gYXMgY29uc3Q7XG5cbmV4cG9ydCBjb25zdCBnZW5Db2RlQ29tbWFuZDogQ29tbWFuZE1vZHVsZSA9IHtcbiAgY29tbWFuZDogJ2dlbi1jb2RlJyxcbiAgZGVzY3JpYmU6ICdHZW5lcmF0ZSBjb2RlIGZvciB0aGUgY3VycmVudCBwcm9qZWN0JyxcbiAgYnVpbGRlcixcbiAgYXN5bmMgaGFuZGxlcihhcmd2KSB7XG4gICAgY29uc3QgcHJvamVjdHMgPSBhd2FpdCBmaW5kRGVzY2VuZGFudFByb2plY3RzKGFyZ3YpO1xuICAgIGlmICghcHJvamVjdHMpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoY2hhbGsucmVkKCdObyBwcm9qZWN0IGZvdW5kLicpKTtcbiAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICB9XG5cbiAgICBjb25zdCBnZW5Db2RlVGFyZ2V0cyA9IHByb2plY3RzLmRlc2NlbmRhbnRzXG4gICAgICAubWFwKChwcm9qZWN0KSA9PiAoeyBwcm9qZWN0LCBzY3JpcHRzOiBnZXRHZW5Db2RlU2NyaXB0cyhwcm9qZWN0KSB9KSlcbiAgICAgIC5maWx0ZXIoKHsgc2NyaXB0cyB9KSA9PiBzY3JpcHRzLmxlbmd0aCA+IDApO1xuICAgIGlmIChnZW5Db2RlVGFyZ2V0cy5sZW5ndGggPT09IDApIHtcbiAgICAgIGNvbnNvbGUuaW5mbyhjaGFsay5ncmVlbignTm8gY29kZSBnZW5lcmF0aW9uIG5lZWRlZC4nKSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGZvciAoY29uc3QgeyBwcm9qZWN0LCBzY3JpcHRzIH0gb2YgZ2VuQ29kZVRhcmdldHMpIHtcbiAgICAgIGNvbnNvbGUuaW5mbyhgUnVubmluZyBcImdlbi1jb2RlXCIgZm9yICR7cHJvamVjdC5uYW1lfSAuLi5gKTtcbiAgICAgIGZvciAoY29uc3Qgc2NyaXB0IG9mIHNjcmlwdHMpIHtcbiAgICAgICAgYXdhaXQgcnVuV2l0aFNwYXduKHNjcmlwdCwgcHJvamVjdCwgYXJndik7XG4gICAgICB9XG4gICAgfVxuICB9LFxufTtcblxuZXhwb3J0IGZ1bmN0aW9uIGdldEdlbkNvZGVTY3JpcHRzKHByb2plY3Q6IFByb2plY3QpOiBzdHJpbmdbXSB7XG4gIGNvbnN0IHNjcmlwdHM6IHN0cmluZ1tdID0gW107XG4gIGNvbnN0IHByaXNtYUdlbmVyYXRlU2NyaXB0ID0gZ2V0UHJpc21hR2VuZXJhdGVTY3JpcHQocHJvamVjdCk7XG4gIGlmIChwcm9qZWN0Lmhhc093bkRlcGVuZGVuY3koJ2JsaXR6JykgJiYgcHJvamVjdC5oYXNTb3VyY2VDb2RlKSB7XG4gICAgc2NyaXB0cy5wdXNoKCdZQVJOIGJsaXR6IGNvZGVnZW4nKTtcbiAgICBpZiAocHJpc21hR2VuZXJhdGVTY3JpcHQpIHtcbiAgICAgIHNjcmlwdHMucHVzaChwcmlzbWFHZW5lcmF0ZVNjcmlwdCk7XG4gICAgfVxuICB9IGVsc2UgaWYgKHByaXNtYUdlbmVyYXRlU2NyaXB0KSB7XG4gICAgc2NyaXB0cy5wdXNoKHByaXNtYUdlbmVyYXRlU2NyaXB0KTtcbiAgfVxuXG4gIGNvbnN0IGNoYWtyYVR5cGVnZW5TY3JpcHQgPSBnZXRDaGFrcmFTY3JpcHQocHJvamVjdCk7XG4gIGlmIChjaGFrcmFUeXBlZ2VuU2NyaXB0KSB7XG4gICAgc2NyaXB0cy5wdXNoKGNoYWtyYVR5cGVnZW5TY3JpcHQpO1xuICB9XG5cbiAgY29uc3QgZHJpenpsZUNoZWNrU2NyaXB0ID0gc2NyaXB0cy5sZW5ndGggPT09IDAgPyBnZXREcml6emxlQ2hlY2tTY3JpcHQocHJvamVjdCkgOiB1bmRlZmluZWQ7XG4gIGlmIChkcml6emxlQ2hlY2tTY3JpcHQpIHtcbiAgICBzY3JpcHRzLnB1c2goZHJpenpsZUNoZWNrU2NyaXB0KTtcbiAgfVxuICBjb25zdCBnZW5JMThuVHNTY3JpcHQgPSBnZXRHZW5JMThuVHNTY3JpcHQocHJvamVjdCk7XG4gIGlmIChnZW5JMThuVHNTY3JpcHQpIHtcbiAgICBzY3JpcHRzLnB1c2goZ2VuSTE4blRzU2NyaXB0KTtcbiAgfVxuICByZXR1cm4gc2NyaXB0cztcbn1cblxuZnVuY3Rpb24gZ2V0R2VuSTE4blRzU2NyaXB0KHByb2plY3Q6IFByb2plY3QpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBpZiAocHJvamVjdC5wYWNrYWdlSnNvbi5zY3JpcHRzPy5bJ2dlbi1pMThuLXRzJ10pIHtcbiAgICBpZiAoIXByb2plY3QuaGFzU291cmNlQ29kZSkgcmV0dXJuO1xuICAgIHJldHVybiAnWUFSTiBydW4gZ2VuLWkxOG4tdHMnO1xuICB9XG4gIGlmIChcbiAgICBwcm9qZWN0Lmhhc093bkRlcGVuZGVuY3koJ2dlbi1pMThuLXRzJykgJiZcbiAgICBwcm9qZWN0Lmhhc1NvdXJjZUNvZGUgJiZcbiAgICBmcy5leGlzdHNTeW5jKHBhdGguam9pbihwcm9qZWN0LmRpclBhdGgsICdpMThuJykpXG4gICkge1xuICAgIHJldHVybiAnWUFSTiBnZW4taTE4bi10cyAtaSBpMThuIC1vIHNyYy9fX2dlbmVyYXRlZF9fL2kxOG4udHMgLWQgamEtSlAnO1xuICB9XG4gIHJldHVybjtcbn1cblxuZnVuY3Rpb24gZ2V0UHJpc21hR2VuZXJhdGVTY3JpcHQocHJvamVjdDogUHJvamVjdCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGlmICghcHJvamVjdC5oYXNQcmlzbWEpIHJldHVybjtcbiAgaWYgKCFoYXNQcmlzbWFTY2hlbWEocHJvamVjdCkpIHJldHVybjtcbiAgcmV0dXJuIHByaXNtYVNjcmlwdHMuZ2VuZXJhdGUocHJvamVjdCk7XG59XG5cbmZ1bmN0aW9uIGdldENoYWtyYVNjcmlwdChwcm9qZWN0OiBQcm9qZWN0KTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgaWYgKCFwcm9qZWN0Lmhhc093bkRlcGVuZGVuY3koJ0BjaGFrcmEtdWkvY2xpJykpIHJldHVybjtcblxuICBpZiAoZ2V0T3duRGVwZW5kZW5jeU1ham9yKHByb2plY3QsICdAY2hha3JhLXVpL2NsaScpID09PSAyKSB7XG4gICAgcmV0dXJuICdZQVJOIGNoYWtyYS1jbGkgdG9rZW5zIHNyYy9jb3JlL3RoZW1lLnRzJztcbiAgfVxuICBpZiAoZmlsZUV4aXN0cyhwcm9qZWN0LCAnc3JjL3RoZW1lLnRzJykpIHtcbiAgICByZXR1cm4gJ1lBUk4gY2hha3JhIHR5cGVnZW4gc3JjL3RoZW1lLnRzIC0tc3RyaWN0JztcbiAgfVxuICByZXR1cm47XG59XG5cbmZ1bmN0aW9uIGdldERyaXp6bGVDaGVja1NjcmlwdChwcm9qZWN0OiBQcm9qZWN0KTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgaWYgKCFwcm9qZWN0Lmhhc0RyaXp6bGUpIHJldHVybjtcbiAgY29uc3QgY29uZmlnID0gZmluZERyaXp6bGVDb25maWcocHJvamVjdCk7XG4gIGlmICghY29uZmlnKSByZXR1cm47XG4gIC8vIEtlZXAgdGhlIGV4cGxpY2l0IC0tY29uZmlnIGJlY2F1c2UgZHJpenpsZS1raXQncyBkZWZhdWx0IGxvb2t1cCBtaXNzZXMgc29tZSBleHRlbnNpb25zIChlLmcuIC5tdHMpLlxuICByZXR1cm4gYCR7d3JhcFdpdGhEcml6emxlQ29uZmlnRGlyKHByb2plY3QsIGBZQVJOIGRyaXp6bGUta2l0IGNoZWNrIC0tY29uZmlnICR7Y29uZmlnLmZpbGVOYW1lfWApfSB8fCB0cnVlYDtcbn1cblxuZnVuY3Rpb24gZ2V0T3duRGVwZW5kZW5jeU1ham9yKHByb2plY3Q6IFByb2plY3QsIHBhY2thZ2VOYW1lOiBzdHJpbmcpOiBudW1iZXIgfCB1bmRlZmluZWQge1xuICBjb25zdCBwYWNrYWdlSnNvbiA9IHByb2plY3QucGFja2FnZUpzb247XG4gIGNvbnN0IHZlcnNpb24gPVxuICAgIHBhY2thZ2VKc29uLmRlcGVuZGVuY2llcz8uW3BhY2thZ2VOYW1lXSA/P1xuICAgIHBhY2thZ2VKc29uLmRldkRlcGVuZGVuY2llcz8uW3BhY2thZ2VOYW1lXSA/P1xuICAgIHBhY2thZ2VKc29uLm9wdGlvbmFsRGVwZW5kZW5jaWVzPy5bcGFja2FnZU5hbWVdID8/XG4gICAgcGFja2FnZUpzb24ucGVlckRlcGVuZGVuY2llcz8uW3BhY2thZ2VOYW1lXTtcbiAgY29uc3QgbWFqb3IgPSB2ZXJzaW9uPy5tYXRjaCgvXFxkKy91KT8uWzBdO1xuICByZXR1cm4gbWFqb3IgPT09IHVuZGVmaW5lZCA/IHVuZGVmaW5lZCA6IE51bWJlcihtYWpvcik7XG59XG5cbmZ1bmN0aW9uIGZpbGVFeGlzdHMocHJvamVjdDogUHJvamVjdCwgZmlsZVBhdGg6IHN0cmluZyk6IGJvb2xlYW4ge1xuICByZXR1cm4gZnMuZXhpc3RzU3luYyhwYXRoLmpvaW4ocHJvamVjdC5kaXJQYXRoLCBmaWxlUGF0aCkpO1xufVxuXG5mdW5jdGlvbiBoYXNQcmlzbWFTY2hlbWEocHJvamVjdDogUHJvamVjdCk6IGJvb2xlYW4ge1xuICByZXR1cm4gWydwcmlzbWEvc2NoZW1hLnByaXNtYScsICdwcmlzbWEvc2NoZW1hJywgJ2RiL3NjaGVtYS5wcmlzbWEnXS5zb21lKChmaWxlUGF0aCkgPT5cbiAgICBmaWxlRXhpc3RzKHByb2plY3QsIGZpbGVQYXRoKVxuICApO1xufVxuIiwiaW1wb3J0IGNoYWxrIGZyb20gJ2NoYWxrJztcbmltcG9ydCBraWxsUG9ydFByb2Nlc3MgZnJvbSAna2lsbC1wb3J0JztcbmltcG9ydCB0eXBlIHsgQXJndW1lbnRzQ2FtZWxDYXNlLCBDb21tYW5kTW9kdWxlLCBJbmZlcnJlZE9wdGlvblR5cGVzIH0gZnJvbSAneWFyZ3MnO1xuXG5pbXBvcnQgeyBmaW5kU2VsZlByb2plY3QgfSBmcm9tICcuLi9wcm9qZWN0LmpzJztcbmltcG9ydCB0eXBlIHsgc2hhcmVkT3B0aW9uc0J1aWxkZXIgfSBmcm9tICcuLi9zaGFyZWRPcHRpb25zQnVpbGRlci5qcyc7XG5pbXBvcnQgeyBpc0NJIH0gZnJvbSAnLi4vdXRpbHMvY2kuanMnO1xuXG5jb25zdCBraWxsUG9ydElmTm9uQ2lCdWlsZGVyID0ge30gYXMgY29uc3Q7XG5cbmV4cG9ydCBjb25zdCBraWxsUG9ydElmTm9uQ2lDb21tYW5kOiBDb21tYW5kTW9kdWxlPFxuICB1bmtub3duLFxuICBJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBraWxsUG9ydElmTm9uQ2lCdWlsZGVyICYgdHlwZW9mIHNoYXJlZE9wdGlvbnNCdWlsZGVyPlxuPiA9IHtcbiAgY29tbWFuZDogJ2tpbGwtcG9ydC1pZi1ub24tY2knLFxuICBkZXNjcmliZTogJ0tpbGwgdGhlIHBvcnQgc3BlY2lmaWVkIGJ5IFBPUlQgZW52aXJvbm1lbnQgdmFyaWFibGUgaWYgbm9uLUNJLicsXG4gIGJ1aWxkZXI6IGtpbGxQb3J0SWZOb25DaUJ1aWxkZXIsXG4gIGFzeW5jIGhhbmRsZXIoYXJndikge1xuICAgIGF3YWl0IGtpbGxQb3J0SWZOb25DaShhcmd2KTtcbiAgfSxcbn07XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBraWxsUG9ydElmTm9uQ2koXG4gIGFyZ3Y6IEFyZ3VtZW50c0NhbWVsQ2FzZTxJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBraWxsUG9ydElmTm9uQ2lCdWlsZGVyICYgdHlwZW9mIHNoYXJlZE9wdGlvbnNCdWlsZGVyPj5cbik6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBwcm9qZWN0ID0gZmluZFNlbGZQcm9qZWN0KGFyZ3YpO1xuICBpZiAoIXByb2plY3QpIHtcbiAgICBjb25zb2xlLmVycm9yKGNoYWxrLnJlZCgnTm8gcHJvamVjdCBmb3VuZC4nKSk7XG4gICAgcHJvY2Vzcy5leGl0KDEpO1xuICB9XG5cbiAgaWYgKGlzQ0kocHJvamVjdC5lbnYuQ0kpKSB7XG4gICAgY29uc29sZS5pbmZvKGBTa2lwIGtpbGxpbmcgcG9ydCBkdWUgdG8gQ0k6ICR7cHJvamVjdC5lbnYuQ0l9YCk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgY29uc3QgcG9ydEVudiA9IHByb2plY3QuZW52LlBPUlQ7XG4gIGNvbnN0IHBvcnQgPSBOdW1iZXIocG9ydEVudik7XG4gIGlmICghTnVtYmVyLmlzSW50ZWdlcihwb3J0KSB8fCBwb3J0IDw9IDApIHtcbiAgICBjb25zb2xlLmVycm9yKGNoYWxrLnJlZChgUE9SVCBlbnZpcm9ubWVudCB2YXJpYWJsZSBpcyBpbnZhbGlkOiAke3BvcnRFbnZ9YCkpO1xuICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgfVxuXG4gIGNvbnNvbGUuaW5mbyhgS2lsbGluZyB0aGUgcG9ydDogJHtwb3J0fWApO1xuICB0cnkge1xuICAgIGF3YWl0IGtpbGxQb3J0UHJvY2Vzcyhwb3J0KTtcbiAgfSBjYXRjaCB7XG4gICAgLy8gZG8gbm90aGluZ1xuICB9XG59XG4iLCJleHBvcnQgZnVuY3Rpb24gcHJpbnRCdWZmZXJlZE91dHB1dChleGl0Q29kZTogbnVtYmVyLCBvdXRwdXQ6IHN0cmluZyk6IHZvaWQge1xuICBpZiAoIXNob3VsZFByaW50QnVmZmVyZWRPdXRwdXQoZXhpdENvZGUsIG91dHB1dCkpIHJldHVybjtcblxuICBjb25zdCBub3JtYWxpemVkT3V0cHV0ID0gbm9ybWFsaXplQnVmZmVyZWRPdXRwdXQob3V0cHV0KTtcbiAgaWYgKG5vcm1hbGl6ZWRPdXRwdXQpIHtcbiAgICBwcm9jZXNzLnN0ZG91dC53cml0ZShub3JtYWxpemVkT3V0cHV0KTtcbiAgICBwcm9jZXNzLnN0ZG91dC53cml0ZSgnXFxuJyk7XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHNob3VsZFByaW50QnVmZmVyZWRPdXRwdXQoZXhpdENvZGU6IG51bWJlciwgb3V0cHV0OiBzdHJpbmcpOiBib29sZWFuIHtcbiAgcmV0dXJuIGV4aXRDb2RlICE9PSAwIHx8IGhhc1dhcm5pbmdPdXRwdXQob3V0cHV0KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIG5vcm1hbGl6ZUJ1ZmZlcmVkT3V0cHV0KG91dHB1dDogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIG91dHB1dC50cmltKCk7XG59XG5cbmZ1bmN0aW9uIGhhc1dhcm5pbmdPdXRwdXQob3V0cHV0OiBzdHJpbmcpOiBib29sZWFuIHtcbiAgcmV0dXJuIC9cXGJ3YXJuKD86aW5nKT9zP1xcYi9pLnRlc3Qob3V0cHV0LnJlcGxhY2VBbGwoL1xcYig/OjB8bm8pIHdhcm5pbmdzP1xcYi9naSwgJycpKTtcbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzL3Byb21pc2VzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCBjaGFsayBmcm9tICdjaGFsayc7XG5pbXBvcnQgdHlwZSB7IEFyZ3VtZW50c0NhbWVsQ2FzZSwgQ29tbWFuZE1vZHVsZSwgSW5mZXJyZWRPcHRpb25UeXBlcyB9IGZyb20gJ3lhcmdzJztcblxuaW1wb3J0IHR5cGUgeyBQcm9qZWN0IH0gZnJvbSAnLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQgeyBmaW5kRGVzY2VuZGFudFByb2plY3RzIH0gZnJvbSAnLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQgdHlwZSB7IEJ1ZmZlcmVkUnVuUmVzdWx0IH0gZnJvbSAnLi4vc2NyaXB0cy9ydW4uanMnO1xuaW1wb3J0IHsgbm9ybWFsaXplU2NyaXB0LCBydW5XaXRoU3Bhd25JblBhcmFsbGVsLCBydW5XaXRoU3Bhd25JblBhcmFsbGVsQnVmZmVyZWQgfSBmcm9tICcuLi9zY3JpcHRzL3J1bi5qcyc7XG5pbXBvcnQgdHlwZSB7IHNoYXJlZE9wdGlvbnNCdWlsZGVyIH0gZnJvbSAnLi4vc2hhcmVkT3B0aW9uc0J1aWxkZXIuanMnO1xuaW1wb3J0IHsgcHJpbnRCdWZmZXJlZE91dHB1dCwgc2hvdWxkUHJpbnRCdWZmZXJlZE91dHB1dCB9IGZyb20gJy4uL3V0aWxzL291dHB1dC5qcyc7XG5pbXBvcnQgeyBidWlsZFNoZWxsQ29tbWFuZCB9IGZyb20gJy4uL3V0aWxzL3NoZWxsLmpzJztcblxuY29uc3QgYnVpbGRlciA9IHtcbiAgZml4OiB7XG4gICAgZGVzY3JpcHRpb246ICdGaXggdGhlIGxpbnRpbmcgZXJyb3JzJyxcbiAgICB0eXBlOiAnYm9vbGVhbicsXG4gIH0sXG4gIGZvcm1hdDoge1xuICAgIGRlc2NyaXB0aW9uOiAnRm9ybWF0IHRoZSBjb2RlJyxcbiAgICB0eXBlOiAnYm9vbGVhbicsXG4gIH0sXG4gIHF1aWV0OiB7XG4gICAgZGVzY3JpcHRpb246ICdSZXBvcnQgZXJyb3JzIG9ubHknLFxuICAgIHR5cGU6ICdib29sZWFuJyxcbiAgfSxcbiAgc2lsZW50OiB7XG4gICAgZGVzY3JpcHRpb246ICdQcmludCBvbmx5IGZhaWxlZCBvciB3YXJuaW5nIGNvbW1hbmQgb3V0cHV0JyxcbiAgICB0eXBlOiAnYm9vbGVhbicsXG4gIH0sXG59IGFzIGNvbnN0O1xuXG5jb25zdCBfYXJndW1lbnRzQnVpbGRlciA9IHtcbiAgZmlsZXM6IHtcbiAgICBkZXNjcmlwdGlvbjogJ0ZpbGUgYW5kIGRpcmVjdG9yeSBwYXRocyB0byBsaW50JyxcbiAgICB0eXBlOiAnYXJyYXknLFxuICB9LFxufSBhcyBjb25zdDtcblxuZXhwb3J0IHR5cGUgTGludENvbW1hbmRPcHRpb25zID0gSW5mZXJyZWRPcHRpb25UeXBlczxcbiAgdHlwZW9mIGJ1aWxkZXIgJiB0eXBlb2Ygc2hhcmVkT3B0aW9uc0J1aWxkZXIgJiB0eXBlb2YgX2FyZ3VtZW50c0J1aWxkZXJcbj47XG5leHBvcnQgdHlwZSBMaW50Q29tbWFuZEFyZ3YgPSBBcmd1bWVudHNDYW1lbENhc2U8TGludENvbW1hbmRPcHRpb25zPiAmIHtcbiAgJy0tJz86IHVua25vd25bXTtcbiAgXzogdW5rbm93bltdO1xuICBwcmludEFsbE91dHB1dD86IGJvb2xlYW47XG59O1xuXG5jb25zdCBveGxpbnRFeHRlbnNpb25zID0gbmV3IFNldChbJ2FzdHJvJywgJ2NqcycsICdjdHMnLCAnanMnLCAnanN4JywgJ21qcycsICdtdHMnLCAnc3ZlbHRlJywgJ3RzJywgJ3RzeCcsICd2dWUnXSk7XG5jb25zdCBweXRob25FeHRlbnNpb25zID0gbmV3IFNldChbJ3B5J10pO1xuY29uc3QgZGFydEV4dGVuc2lvbnMgPSBuZXcgU2V0KFsnZGFydCddKTtcbmNvbnN0IHJ1c3RFeHRlbnNpb25zID0gbmV3IFNldChbJ3JzJ10pO1xuY29uc3Qgb3hmbXRFeHRlbnNpb25zID0gbmV3IFNldChbXG4gIC4uLm94bGludEV4dGVuc2lvbnMsXG4gICdjc3MnLFxuICAnZ3FsJyxcbiAgJ2dyYXBocWwnLFxuICAnaGJzJyxcbiAgJ2h0bScsXG4gICdodG1sJyxcbiAgJ2pzb24nLFxuICAnanNvbjUnLFxuICAnanNvbmMnLFxuICAnbGVzcycsXG4gICdtZCcsXG4gICdtZHgnLFxuICAnc2NzcycsXG4gICd0b21sJyxcbiAgJ3lhbWwnLFxuICAneW1sJyxcbl0pO1xuY29uc3QgcHJldHRpZXJFeHRlbnNpb25zID0gbmV3IFNldChbXG4gICdjanMnLFxuICAnY3NzJyxcbiAgJ2N0cycsXG4gICdodG0nLFxuICAnaHRtbCcsXG4gICdqYXZhJyxcbiAgJ2pzJyxcbiAgJ2pzb24nLFxuICAnanNvbjUnLFxuICAnanNvbmMnLFxuICAnanN4JyxcbiAgJ21kJyxcbiAgJ21qcycsXG4gICdtdHMnLFxuICAnc2NzcycsXG4gICd0cycsXG4gICd0c3gnLFxuICAndnVlJyxcbiAgJ3lhbWwnLFxuICAneW1sJyxcbl0pO1xuY29uc3QgcHJldHRpZXJPbmx5RXh0ZW5zaW9ucyA9IG5ldyBTZXQoWy4uLnByZXR0aWVyRXh0ZW5zaW9uc10uZmlsdGVyKChleHQpID0+ICFveGZtdEV4dGVuc2lvbnMuaGFzKGV4dCkpKTtcbmNvbnN0IHByZXR0aWVyRml4dHVyZUlnbm9yZVBhdHRlcm4gPSAnISoqL3Rlc3R7LSwvfWZpeHR1cmVzLyoqJztcblxudHlwZSBCdWZmZXJlZExpbnRSdW5SZXN1bHQgPSBCdWZmZXJlZFJ1blJlc3VsdCAmIHsgY29tbWFuZDogc3RyaW5nOyBjd2Q6IHN0cmluZyB9O1xudHlwZSBMaW50UnVuUmVzdWx0ID0gQnVmZmVyZWRMaW50UnVuUmVzdWx0IHwgeyBleGl0Q29kZTogbnVtYmVyIH07XG5pbnRlcmZhY2UgTGludFJ1bkNvbW1hbmQge1xuICBjb21tYW5kOiBzdHJpbmc7XG4gIHByb2plY3Q6IFByb2plY3Q7XG59XG5cbmV4cG9ydCBjb25zdCBsaW50Q29tbWFuZDogQ29tbWFuZE1vZHVsZTx1bmtub3duLCBMaW50Q29tbWFuZE9wdGlvbnM+ID0ge1xuICBjb21tYW5kOiAnbGludCBbZmlsZXMuLi5dJyxcbiAgZGVzY3JpYmU6ICdMaW50IGNvZGUnLFxuICBidWlsZGVyLFxuICBhc3luYyBoYW5kbGVyKGFyZ3YpIHtcbiAgICBjb25zdCBleGl0Q29kZSA9IGF3YWl0IGxpbnQoYXJndiBhcyBMaW50Q29tbWFuZEFyZ3YpO1xuICAgIGlmIChleGl0Q29kZSkgcHJvY2Vzcy5leGl0KGV4aXRDb2RlKTtcbiAgfSxcbn07XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBsaW50KGFyZ3Y6IExpbnRDb21tYW5kQXJndik6IFByb21pc2U8bnVtYmVyPiB7XG4gIGlmIChwcm9jZXNzLnBsYXRmb3JtID09PSAnd2luMzInKSB7XG4gICAgY29uc29sZS5lcnJvcihjaGFsay5yZWQoJ1RoaXMgY29tbWFuZCBpcyBub3Qgc3VwcG9ydGVkIG9uIFdpbmRvd3MuJykpO1xuICAgIHJldHVybiAxO1xuICB9XG5cbiAgY29uc3QgcHJvamVjdHMgPSBhd2FpdCBmaW5kRGVzY2VuZGFudFByb2plY3RzKGFyZ3YsIGZhbHNlKTtcbiAgaWYgKCFwcm9qZWN0cykge1xuICAgIGNvbnNvbGUuZXJyb3IoY2hhbGsucmVkKCdObyBwcm9qZWN0IGZvdW5kLicpKTtcbiAgICByZXR1cm4gMTtcbiAgfVxuXG4gIGNvbnN0IGZpbGVzID0gZ2V0TGludFRhcmdldEZpbGVzKGFyZ3YpO1xuICBjb25zdCBsaW50RmlsZVBhdGhzQnlQcm9qZWN0ID0gbmV3IE1hcDxQcm9qZWN0LCBzdHJpbmdbXT4oKTtcbiAgY29uc3Qgb3hmbXRGaWxlUGF0aHNCeVByb2plY3QgPSBuZXcgTWFwPFByb2plY3QsIHN0cmluZ1tdPigpO1xuICBjb25zdCBweXRob25GaWxlUGF0aHNCeVByb2plY3QgPSBuZXcgTWFwPFByb2plY3QsIHN0cmluZ1tdPigpO1xuICBjb25zdCBkYXJ0RmlsZVBhdGhzQnlQcm9qZWN0ID0gbmV3IE1hcDxQcm9qZWN0LCBzdHJpbmdbXT4oKTtcbiAgLy8gYGNhcmdvIGZtdCAtLWFsbGAgYWx3YXlzIGZvcm1hdHMgdGhlIHdob2xlIHdvcmtzcGFjZSwgc28gd2UgdHJhY2sgdGFyZ2V0XG4gIC8vIHByb2plY3RzIHJhdGhlciB0aGFuIGluZGl2aWR1YWwgZmlsZSBwYXRocy4gRXZlcnkgcHJvamVjdCB3aXRoIGl0cyBvd25cbiAgLy8gYENhcmdvLnRvbWxgIHJ1bnMgaXRzIG93biBgY2FyZ28gZm10IC0tYWxsYDsgd2UgaW50ZW50aW9uYWxseSBkbyBub3QgZGVkdXBcbiAgLy8gYnkgZGlyZWN0b3J5LiBBIG5lc3RlZCBvciBzaWJsaW5nIGNyYXRlIGNhbiBiZSBhbiBpbmRlcGVuZGVudCBDYXJnb1xuICAvLyB3b3Jrc3BhY2UgdGhhdCBhIHBhcmVudCdzIGBjYXJnbyBmbXQgLS1hbGxgIG5ldmVyIHJlYWNoZXMsIHNvIHNraXBwaW5nIGl0XG4gIC8vIHdvdWxkIGxlYXZlIGl0IHVuZm9ybWF0dGVkLCB3aGlsZSBhbnkgZ2VudWluZWx5IG92ZXJsYXBwaW5nIHJ1bnMgYXJlXG4gIC8vIGhhcm1sZXNzIGJlY2F1c2UgcnVzdGZtdCBpcyBkZXRlcm1pbmlzdGljIGFuZCBpZGVtcG90ZW50LiBEZWR1cGluZyBieSByZWFsXG4gIC8vIHdvcmtzcGFjZSBtZW1iZXJzaGlwIHdvdWxkIHJlcXVpcmUgaW52b2tpbmcgYGNhcmdvIGxvY2F0ZS1wcm9qZWN0YC5cbiAgY29uc3QgY2FyZ29Gb3JtYXRQcm9qZWN0cyA9IG5ldyBTZXQ8UHJvamVjdD4oKTtcbiAgY29uc3QgcHJldHRpZXJGaWxlUGF0aHM6IHN0cmluZ1tdID0gW107XG4gIGNvbnN0IHBhY2thZ2VKc29uRmlsZVBhdGhzOiBzdHJpbmdbXSA9IFtdO1xuICBsZXQgbWlzc2luZ0xpbnRUb29sRm9yRXhwbGljaXRGaWxlcyA9IGZhbHNlO1xuICBsZXQgcHJldHRpZXJBcmdzOiBzdHJpbmdbXTtcbiAgbGV0IHNvcnRQYWNrYWdlSnNvbkFyZ3M6IHN0cmluZ1tdO1xuICBpZiAoZmlsZXMubGVuZ3RoID4gMCkge1xuICAgIGNvbnN0IGxpbnRUYXJnZXRzID0gYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgICBmaWxlcy5tYXAoYXN5bmMgKGZpbGUpID0+IHtcbiAgICAgICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLnJlc29sdmUoZmlsZSk7XG4gICAgICAgIGNvbnN0IGZpbGVLaW5kID0gYXdhaXQgZ2V0TGludFRhcmdldEZpbGVLaW5kKGZpbGVQYXRoKTtcbiAgICAgICAgcmV0dXJuIHsgZmlsZUtpbmQsIGZpbGVQYXRoIH07XG4gICAgICB9KVxuICAgICk7XG4gICAgZm9yIChjb25zdCB7IGZpbGVLaW5kLCBmaWxlUGF0aCB9IG9mIGxpbnRUYXJnZXRzKSB7XG4gICAgICBpZiAoXG4gICAgICAgIGZpbGVQYXRoLmVuZHNXaXRoKCcvdGVzdC9maXh0dXJlcycpIHx8XG4gICAgICAgIGZpbGVQYXRoLmluY2x1ZGVzKCcvdGVzdC9maXh0dXJlcy8nKSB8fFxuICAgICAgICBmaWxlUGF0aC5lbmRzV2l0aCgnL3Rlc3QtZml4dHVyZXMnKSB8fFxuICAgICAgICBmaWxlUGF0aC5pbmNsdWRlcygnL3Rlc3QtZml4dHVyZXMvJylcbiAgICAgICkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgZXh0ZW5zaW9uID0gcGF0aC5leHRuYW1lKGZpbGVQYXRoKS5zbGljZSgxKTtcbiAgICAgIGlmIChmaWxlUGF0aC5lbmRzV2l0aCgnL3BhY2thZ2UuanNvbicpKSB7XG4gICAgICAgIHBhY2thZ2VKc29uRmlsZVBhdGhzLnB1c2goZmlsZVBhdGgpO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIHBhY2thZ2VKc29uRmlsZVBhdGhzLnB1c2goLi4uZ2V0RXhwbGljaXRQYWNrYWdlSnNvblBhdGhzKHByb2plY3RzLmRlc2NlbmRhbnRzLCBmaWxlUGF0aCwgZmlsZUtpbmQpKTtcblxuICAgICAgZm9yIChjb25zdCB7IGxpbnRQYXRoLCBwcm9qZWN0IH0gb2YgZ2V0RXhwbGljaXRMaW50VGFyZ2V0cyhwcm9qZWN0cy5kZXNjZW5kYW50cywgZmlsZVBhdGgsIGZpbGVLaW5kKSkge1xuICAgICAgICBpZiAocHJvamVjdC5oYXNQb2V0cnlMb2NrICYmIChmaWxlS2luZCA9PT0gJ2RpcmVjdG9yeScgfHwgcHl0aG9uRXh0ZW5zaW9ucy5oYXMoZXh0ZW5zaW9uKSkpIHtcbiAgICAgICAgICBjb25zdCBweXRob25GaWxlUGF0aHMgPSBweXRob25GaWxlUGF0aHNCeVByb2plY3QuZ2V0KHByb2plY3QpID8/IFtdO1xuICAgICAgICAgIHB5dGhvbkZpbGVQYXRocy5wdXNoKGxpbnRQYXRoKTtcbiAgICAgICAgICBweXRob25GaWxlUGF0aHNCeVByb2plY3Quc2V0KHByb2plY3QsIHB5dGhvbkZpbGVQYXRocyk7XG4gICAgICAgICAgaWYgKGZpbGVLaW5kICE9PSAnZGlyZWN0b3J5JykgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHByb2plY3QuaGFzUHVic3BlY1lhbWwgJiYgKGZpbGVLaW5kID09PSAnZGlyZWN0b3J5JyB8fCBkYXJ0RXh0ZW5zaW9ucy5oYXMoZXh0ZW5zaW9uKSkpIHtcbiAgICAgICAgICBjb25zdCBkYXJ0RmlsZVBhdGhzID0gZGFydEZpbGVQYXRoc0J5UHJvamVjdC5nZXQocHJvamVjdCkgPz8gW107XG4gICAgICAgICAgZGFydEZpbGVQYXRocy5wdXNoKGxpbnRQYXRoKTtcbiAgICAgICAgICBkYXJ0RmlsZVBhdGhzQnlQcm9qZWN0LnNldChwcm9qZWN0LCBkYXJ0RmlsZVBhdGhzKTtcbiAgICAgICAgICBpZiAoZmlsZUtpbmQgIT09ICdkaXJlY3RvcnknKSBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocHJvamVjdC5oYXNDYXJnb1RvbWwgJiYgKGZpbGVLaW5kID09PSAnZGlyZWN0b3J5JyB8fCBydXN0RXh0ZW5zaW9ucy5oYXMoZXh0ZW5zaW9uKSkpIHtcbiAgICAgICAgICBjYXJnb0Zvcm1hdFByb2plY3RzLmFkZChwcm9qZWN0KTtcbiAgICAgICAgICBpZiAoZmlsZUtpbmQgIT09ICdkaXJlY3RvcnknKSBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZmlsZUtpbmQgPT09ICdkaXJlY3RvcnknIHx8IHN1cHBvcnRzTGludGluZ0V4dGVuc2lvbihwcm9qZWN0LCBleHRlbnNpb24pKSB7XG4gICAgICAgICAgY29uc3QgbGludEZpbGVQYXRocyA9IGxpbnRGaWxlUGF0aHNCeVByb2plY3QuZ2V0KHByb2plY3QpID8/IFtdO1xuICAgICAgICAgIGxpbnRGaWxlUGF0aHMucHVzaChsaW50UGF0aCk7XG4gICAgICAgICAgbGludEZpbGVQYXRoc0J5UHJvamVjdC5zZXQocHJvamVjdCwgbGludEZpbGVQYXRocyk7XG4gICAgICAgICAgaWYgKGFyZ3YuZm9ybWF0KSB7XG4gICAgICAgICAgICBpZiAoZmlsZUtpbmQgPT09ICdkaXJlY3RvcnknICYmIHByb2plY3QuaGFzT3hmbXQpIHtcbiAgICAgICAgICAgICAgY29uc3Qgb3hmbXRGaWxlUGF0aHMgPSBveGZtdEZpbGVQYXRoc0J5UHJvamVjdC5nZXQocHJvamVjdCkgPz8gW107XG4gICAgICAgICAgICAgIG94Zm10RmlsZVBhdGhzLnB1c2gobGludFBhdGgpO1xuICAgICAgICAgICAgICBveGZtdEZpbGVQYXRoc0J5UHJvamVjdC5zZXQocHJvamVjdCwgb3hmbXRGaWxlUGF0aHMpO1xuICAgICAgICAgICAgICBwcmV0dGllckZpbGVQYXRocy5wdXNoKGJ1aWxkUHJldHRpZXJPbmx5RGlyZWN0b3J5UGF0dGVybihsaW50UGF0aCksIHByZXR0aWVyRml4dHVyZUlnbm9yZVBhdHRlcm4pO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgZm9yIChjb25zdCBmb3JtYXR0ZXJQYXRoIG9mIGJ1aWxkRXhwbGljaXRGb3JtYXR0ZXJBcmdzKHByb2plY3QsIGxpbnRQYXRoLCBmaWxlS2luZCwgZXh0ZW5zaW9uKSkge1xuICAgICAgICAgICAgICAgIGlmIChwcm9qZWN0Lmhhc094Zm10KSB7XG4gICAgICAgICAgICAgICAgICBjb25zdCBveGZtdEZpbGVQYXRocyA9IG94Zm10RmlsZVBhdGhzQnlQcm9qZWN0LmdldChwcm9qZWN0KSA/PyBbXTtcbiAgICAgICAgICAgICAgICAgIG94Zm10RmlsZVBhdGhzLnB1c2goZm9ybWF0dGVyUGF0aCk7XG4gICAgICAgICAgICAgICAgICBveGZtdEZpbGVQYXRoc0J5UHJvamVjdC5zZXQocHJvamVjdCwgb3hmbXRGaWxlUGF0aHMpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICBwcmV0dGllckZpbGVQYXRocy5wdXNoKGZvcm1hdHRlclBhdGgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmIChhcmd2LmZvcm1hdCAmJiAocHJldHRpZXJFeHRlbnNpb25zLmhhcyhleHRlbnNpb24pIHx8IG94Zm10RXh0ZW5zaW9ucy5oYXMoZXh0ZW5zaW9uKSkpIHtcbiAgICAgICAgICBpZiAocHJvamVjdC5oYXNPeGZtdCAmJiBveGZtdEV4dGVuc2lvbnMuaGFzKGV4dGVuc2lvbikpIHtcbiAgICAgICAgICAgIGNvbnN0IG94Zm10RmlsZVBhdGhzID0gb3hmbXRGaWxlUGF0aHNCeVByb2plY3QuZ2V0KHByb2plY3QpID8/IFtdO1xuICAgICAgICAgICAgb3hmbXRGaWxlUGF0aHMucHVzaChsaW50UGF0aCk7XG4gICAgICAgICAgICBveGZtdEZpbGVQYXRoc0J5UHJvamVjdC5zZXQocHJvamVjdCwgb3hmbXRGaWxlUGF0aHMpO1xuICAgICAgICAgIH0gZWxzZSBpZiAocHJldHRpZXJFeHRlbnNpb25zLmhhcyhleHRlbnNpb24pKSB7XG4gICAgICAgICAgICBwcmV0dGllckZpbGVQYXRocy5wdXNoKGxpbnRQYXRoKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAoaXNQb3RlbnRpYWxMaW50VGFyZ2V0KGV4dGVuc2lvbikgJiYgIXByb2plY3QucHJlZmVycmVkTGludGVyKSB7XG4gICAgICAgICAgY29uc29sZS5lcnJvcihjaGFsay5yZWQoYE5vIGxpbnRlciBmb3VuZCBmb3IgJHtwcm9qZWN0Lm5hbWV9LiBJbnN0YWxsIE94bGludC5gKSk7XG4gICAgICAgICAgbWlzc2luZ0xpbnRUb29sRm9yRXhwbGljaXRGaWxlcyA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcHJldHRpZXJBcmdzID0gWy4uLm5ldyBTZXQocHJldHRpZXJGaWxlUGF0aHMpXTtcbiAgICBzb3J0UGFja2FnZUpzb25BcmdzID0gWy4uLm5ldyBTZXQocGFja2FnZUpzb25GaWxlUGF0aHMpXTtcbiAgfSBlbHNlIHtcbiAgICBwcmV0dGllckFyZ3MgPSBidWlsZFByZXR0aWVyQXJncyhwcm9qZWN0cy5zZWxmLmRpclBhdGgsIHByb2plY3RzLmRlc2NlbmRhbnRzKTtcbiAgICBzb3J0UGFja2FnZUpzb25BcmdzID0gcHJvamVjdHMuZGVzY2VuZGFudHMubWFwKChwKSA9PiBwLnBhY2thZ2VKc29uUGF0aCk7XG4gIH1cblxuICBjb25zdCBmb3JtYXR0ZXJDb21tYW5kczogTGludFJ1bkNvbW1hbmRbXSA9IFtdO1xuICBjb25zdCBsaW50ZXJDb21tYW5kczogTGludFJ1bkNvbW1hbmRbXSA9IFtdO1xuICBjb25zdCBsaW50UnVuT3B0aW9ucyA9IHsgZXhpdElmRmFpbGVkOiBmYWxzZSwgcHJlc2VydmVDb2xvcjogIWFyZ3YucHJpbnRBbGxPdXRwdXQgfSBhcyBjb25zdDtcbiAgY29uc3Qgc2hvdWxkUnVuRm9ybWF0dGVycyA9IEJvb2xlYW4oYXJndi5mb3JtYXQpO1xuICBjb25zdCBzaG91bGRSdW5MaW50ZXJzID0gIWFyZ3YuZm9ybWF0IHx8IGFyZ3YuZml4O1xuICBpZiAoZmlsZXMubGVuZ3RoID4gMCkge1xuICAgIGlmIChzaG91bGRSdW5MaW50ZXJzKSB7XG4gICAgICBmb3IgKGNvbnN0IFtwcm9qZWN0LCBsaW50RmlsZVBhdGhzXSBvZiBsaW50RmlsZVBhdGhzQnlQcm9qZWN0KSB7XG4gICAgICAgIGNvbnN0IGxpbnRDb21tYW5kID0gYnVpbGRMaW50Q29tbWFuZChwcm9qZWN0LCBhcmd2LCBsaW50RmlsZVBhdGhzKTtcbiAgICAgICAgaWYgKCFsaW50Q29tbWFuZCkgY29udGludWU7XG5cbiAgICAgICAgbGludGVyQ29tbWFuZHMucHVzaCh7IGNvbW1hbmQ6IGxpbnRDb21tYW5kLCBwcm9qZWN0IH0pO1xuICAgICAgfVxuICAgIH1cbiAgICBmb3IgKGNvbnN0IFtwcm9qZWN0LCBweXRob25GaWxlUGF0aHNdIG9mIHB5dGhvbkZpbGVQYXRoc0J5UHJvamVjdCkge1xuICAgICAgaWYgKHNob3VsZFJ1bkxpbnRlcnMpIHtcbiAgICAgICAgbGludGVyQ29tbWFuZHMucHVzaCh7IGNvbW1hbmQ6IGJ1aWxkUG9ldHJ5TGludENvbW1hbmQoYXJndiwgcHl0aG9uRmlsZVBhdGhzKSwgcHJvamVjdCB9KTtcbiAgICAgIH1cbiAgICAgIGlmIChzaG91bGRSdW5Gb3JtYXR0ZXJzKSB7XG4gICAgICAgIGZvcm1hdHRlckNvbW1hbmRzLnB1c2goeyBjb21tYW5kOiBidWlsZFBvZXRyeUZvcm1hdENvbW1hbmQocHl0aG9uRmlsZVBhdGhzKSwgcHJvamVjdCB9KTtcbiAgICAgIH1cbiAgICB9XG4gICAgZm9yIChjb25zdCBbcHJvamVjdCwgZGFydEZpbGVQYXRoc10gb2YgZGFydEZpbGVQYXRoc0J5UHJvamVjdCkge1xuICAgICAgaWYgKHNob3VsZFJ1bkxpbnRlcnMpIHtcbiAgICAgICAgbGludGVyQ29tbWFuZHMucHVzaCh7IGNvbW1hbmQ6IGJ1aWxkRGFydExpbnRDb21tYW5kKGRhcnRGaWxlUGF0aHMpLCBwcm9qZWN0IH0pO1xuICAgICAgfVxuICAgICAgaWYgKHNob3VsZFJ1bkZvcm1hdHRlcnMpIHtcbiAgICAgICAgZm9ybWF0dGVyQ29tbWFuZHMucHVzaCh7IGNvbW1hbmQ6IGJ1aWxkRGFydEZvcm1hdENvbW1hbmQoZGFydEZpbGVQYXRocyksIHByb2plY3QgfSk7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChzaG91bGRSdW5Gb3JtYXR0ZXJzKSB7XG4gICAgICBmb3IgKGNvbnN0IHByb2plY3Qgb2YgY2FyZ29Gb3JtYXRQcm9qZWN0cykge1xuICAgICAgICBmb3JtYXR0ZXJDb21tYW5kcy5wdXNoKHsgY29tbWFuZDogYnVpbGRDYXJnb0Zvcm1hdENvbW1hbmQoKSwgcHJvamVjdCB9KTtcbiAgICAgIH1cbiAgICAgIGZvciAoY29uc3QgW3Byb2plY3QsIG94Zm10RmlsZVBhdGhzXSBvZiBveGZtdEZpbGVQYXRoc0J5UHJvamVjdCkge1xuICAgICAgICBmb3JtYXR0ZXJDb21tYW5kcy5wdXNoKHsgY29tbWFuZDogYnVpbGRPeGZtdENvbW1hbmQob3hmbXRGaWxlUGF0aHMpLCBwcm9qZWN0IH0pO1xuICAgICAgfVxuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBmb3IgKGNvbnN0IHByb2plY3Qgb2YgcHJvamVjdHMuZGVzY2VuZGFudHMpIHtcbiAgICAgIGlmIChzaG91bGRSdW5MaW50ZXJzKSB7XG4gICAgICAgIGlmICghcHJvamVjdC5wYWNrYWdlSnNvbi53b3Jrc3BhY2VzIHx8IHByb2plY3QuaGFzU291cmNlQ29kZSkge1xuICAgICAgICAgIGNvbnN0IGxpbnRDb21tYW5kID0gYnVpbGRMaW50Q29tbWFuZChwcm9qZWN0LCBhcmd2KTtcbiAgICAgICAgICBpZiAobGludENvbW1hbmQpIGxpbnRlckNvbW1hbmRzLnB1c2goeyBjb21tYW5kOiBsaW50Q29tbWFuZCwgcHJvamVjdCB9KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocHJvamVjdC5oYXNQb2V0cnlMb2NrKSBsaW50ZXJDb21tYW5kcy5wdXNoKHsgY29tbWFuZDogYnVpbGRQb2V0cnlMaW50Q29tbWFuZChhcmd2KSwgcHJvamVjdCB9KTtcbiAgICAgICAgaWYgKHByb2plY3QuaGFzUHVic3BlY1lhbWwpIGxpbnRlckNvbW1hbmRzLnB1c2goeyBjb21tYW5kOiBidWlsZERhcnRMaW50Q29tbWFuZCgpLCBwcm9qZWN0IH0pO1xuICAgICAgfVxuICAgICAgaWYgKHNob3VsZFJ1bkZvcm1hdHRlcnMpIHtcbiAgICAgICAgaWYgKHByb2plY3QuaGFzT3hmbXQpIGZvcm1hdHRlckNvbW1hbmRzLnB1c2goeyBjb21tYW5kOiBidWlsZE94Zm10Q29tbWFuZCgpLCBwcm9qZWN0IH0pO1xuICAgICAgICBpZiAocHJvamVjdC5oYXNQb2V0cnlMb2NrKSBmb3JtYXR0ZXJDb21tYW5kcy5wdXNoKHsgY29tbWFuZDogYnVpbGRQb2V0cnlGb3JtYXRDb21tYW5kKCksIHByb2plY3QgfSk7XG4gICAgICAgIGlmIChwcm9qZWN0Lmhhc1B1YnNwZWNZYW1sKSBmb3JtYXR0ZXJDb21tYW5kcy5wdXNoKHsgY29tbWFuZDogYnVpbGREYXJ0Rm9ybWF0Q29tbWFuZCgpLCBwcm9qZWN0IH0pO1xuICAgICAgICBpZiAocHJvamVjdC5oYXNDYXJnb1RvbWwpIGZvcm1hdHRlckNvbW1hbmRzLnB1c2goeyBjb21tYW5kOiBidWlsZENhcmdvRm9ybWF0Q29tbWFuZCgpLCBwcm9qZWN0IH0pO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICBjb25zdCBsaW50RXhpdENvZGVzOiBudW1iZXJbXSA9IFtdO1xuXG4gIGlmIChzaG91bGRSdW5Gb3JtYXR0ZXJzKSB7XG4gICAgY29uc3QgZm9ybWF0dGVyUmVzdWx0cyA9IGF3YWl0IHJ1bkxpbnRDb21tYW5kcyhmb3JtYXR0ZXJDb21tYW5kcywgYXJndiwgbGludFJ1bk9wdGlvbnMpO1xuICAgIHByaW50U2lsZW50TGludE91dHB1dHMoZm9ybWF0dGVyUmVzdWx0cywgYXJndik7XG4gICAgbGludEV4aXRDb2Rlcy5wdXNoKC4uLmZvcm1hdHRlclJlc3VsdHMubWFwKChyZXN1bHQpID0+IHJlc3VsdC5leGl0Q29kZSkpO1xuXG4gICAgaWYgKGxpbnRFeGl0Q29kZXMuc29tZSgoZXhpdENvZGUpID0+IGV4aXRDb2RlICE9PSAwKSkge1xuICAgICAgcmV0dXJuIDE7XG4gICAgfVxuICB9XG5cbiAgaWYgKG1pc3NpbmdMaW50VG9vbEZvckV4cGxpY2l0RmlsZXMpIHtcbiAgICByZXR1cm4gMTtcbiAgfVxuXG4gIGlmIChzaG91bGRSdW5Gb3JtYXR0ZXJzKSB7XG4gICAgaWYgKHByZXR0aWVyQXJncy5sZW5ndGggPiAwICYmIHByb2plY3RzLnNlbGYuaGFzUHJldHRpZXIpIHtcbiAgICAgIGNvbnN0IHByZXR0aWVyUmVzdWx0ID0gYXdhaXQgcnVuTGludENvbW1hbmQoXG4gICAgICAgIGJ1aWxkU2hlbGxDb21tYW5kKFtcbiAgICAgICAgICAnWUFSTicsXG4gICAgICAgICAgJ3ByZXR0aWVyJyxcbiAgICAgICAgICAnLS1jYWNoZScsXG4gICAgICAgICAgJy0tbm8tZXJyb3Itb24tdW5tYXRjaGVkLXBhdHRlcm4nLFxuICAgICAgICAgICctLXdyaXRlJyxcbiAgICAgICAgICAnLS0nLFxuICAgICAgICAgIC4uLnByZXR0aWVyQXJncyxcbiAgICAgICAgXSksXG4gICAgICAgIHByb2plY3RzLnNlbGYsXG4gICAgICAgIGFyZ3YsXG4gICAgICAgIGxpbnRSdW5PcHRpb25zXG4gICAgICApO1xuICAgICAgcHJpbnRTaWxlbnRMaW50T3V0cHV0cyhbcHJldHRpZXJSZXN1bHRdLCBhcmd2KTtcbiAgICAgIGxpbnRFeGl0Q29kZXMucHVzaChwcmV0dGllclJlc3VsdC5leGl0Q29kZSk7XG4gICAgfVxuICAgIGlmIChzb3J0UGFja2FnZUpzb25BcmdzLmxlbmd0aCA+IDApIHtcbiAgICAgIGNvbnN0IHNvcnRQYWNrYWdlSnNvblJlc3VsdCA9IGF3YWl0IHJ1bkxpbnRDb21tYW5kKFxuICAgICAgICBidWlsZFNoZWxsQ29tbWFuZChbJ1lBUk4nLCAnc29ydC1wYWNrYWdlLWpzb24nLCAnLS0nLCAuLi5zb3J0UGFja2FnZUpzb25BcmdzXSksXG4gICAgICAgIHByb2plY3RzLnNlbGYsXG4gICAgICAgIGFyZ3YsXG4gICAgICAgIGxpbnRSdW5PcHRpb25zXG4gICAgICApO1xuICAgICAgcHJpbnRTaWxlbnRMaW50T3V0cHV0cyhbc29ydFBhY2thZ2VKc29uUmVzdWx0XSwgYXJndik7XG4gICAgICBsaW50RXhpdENvZGVzLnB1c2goc29ydFBhY2thZ2VKc29uUmVzdWx0LmV4aXRDb2RlKTtcbiAgICB9XG5cbiAgICBpZiAobGludEV4aXRDb2Rlcy5zb21lKChleGl0Q29kZSkgPT4gZXhpdENvZGUgIT09IDApKSB7XG4gICAgICByZXR1cm4gMTtcbiAgICB9XG4gIH1cblxuICBpZiAoc2hvdWxkUnVuTGludGVycykge1xuICAgIGNvbnN0IGxpbnRlclJlc3VsdHMgPSBhd2FpdCBydW5MaW50Q29tbWFuZHMobGludGVyQ29tbWFuZHMsIGFyZ3YsIGxpbnRSdW5PcHRpb25zKTtcbiAgICBwcmludFNpbGVudExpbnRPdXRwdXRzKGxpbnRlclJlc3VsdHMsIGFyZ3YpO1xuICAgIGxpbnRFeGl0Q29kZXMucHVzaCguLi5saW50ZXJSZXN1bHRzLm1hcCgocmVzdWx0KSA9PiByZXN1bHQuZXhpdENvZGUpKTtcbiAgfVxuXG4gIHJldHVybiBsaW50RXhpdENvZGVzLnNvbWUoKGV4aXRDb2RlKSA9PiBleGl0Q29kZSAhPT0gMCkgPyAxIDogMDtcbn1cblxuZnVuY3Rpb24gcnVuTGludENvbW1hbmRzKFxuICBjb21tYW5kczogTGludFJ1bkNvbW1hbmRbXSxcbiAgYXJndjogTGludENvbW1hbmRBcmd2LFxuICBvcHRpb25zOiBQYXJhbWV0ZXJzPHR5cGVvZiBydW5XaXRoU3Bhd25JblBhcmFsbGVsPlszXVxuKTogUHJvbWlzZTxMaW50UnVuUmVzdWx0W10+IHtcbiAgcmV0dXJuIFByb21pc2UuYWxsKGNvbW1hbmRzLm1hcCgoeyBjb21tYW5kLCBwcm9qZWN0IH0pID0+IHJ1bkxpbnRDb21tYW5kKGNvbW1hbmQsIHByb2plY3QsIGFyZ3YsIG9wdGlvbnMpKSk7XG59XG5cbmZ1bmN0aW9uIHJ1bkxpbnRDb21tYW5kKFxuICBjb21tYW5kOiBzdHJpbmcsXG4gIHByb2plY3Q6IFByb2plY3QsXG4gIGFyZ3Y6IExpbnRDb21tYW5kQXJndixcbiAgb3B0aW9uczogUGFyYW1ldGVyczx0eXBlb2YgcnVuV2l0aFNwYXduSW5QYXJhbGxlbD5bM11cbik6IFByb21pc2U8TGludFJ1blJlc3VsdD4ge1xuICBpZiAoYXJndi5zaWxlbnQpIHtcbiAgICBjb25zdCBub3JtYWxpemVkU2NyaXB0ID0gbm9ybWFsaXplU2NyaXB0KGNvbW1hbmQsIHByb2plY3QpO1xuICAgIHJldHVybiBydW5XaXRoU3Bhd25JblBhcmFsbGVsQnVmZmVyZWQoY29tbWFuZCwgcHJvamVjdCwgYXJndiwgb3B0aW9ucykudGhlbigocmVzdWx0KSA9PiAoe1xuICAgICAgLi4ucmVzdWx0LFxuICAgICAgY29tbWFuZDogbm9ybWFsaXplZFNjcmlwdC5wcmludGFibGUsXG4gICAgICBjd2Q6IHByb2plY3QuZGlyUGF0aCxcbiAgICB9KSk7XG4gIH1cbiAgcmV0dXJuIHJ1bldpdGhTcGF3bkluUGFyYWxsZWwoY29tbWFuZCwgcHJvamVjdCwgYXJndiwgb3B0aW9ucykudGhlbigoZXhpdENvZGUpID0+ICh7IGV4aXRDb2RlIH0pKTtcbn1cblxuZnVuY3Rpb24gcHJpbnRTaWxlbnRMaW50T3V0cHV0cyhcbiAgcmVzdWx0czogTGludFJ1blJlc3VsdFtdLFxuICBhcmd2OiBQaWNrPExpbnRDb21tYW5kQXJndiwgJ3ByaW50QWxsT3V0cHV0JyB8ICdzaWxlbnQnPlxuKTogdm9pZCB7XG4gIGNvbnN0IHByaW50YWJsZVJlc3VsdHMgPVxuICAgIGFyZ3Yuc2lsZW50ICYmICFhcmd2LnByaW50QWxsT3V0cHV0XG4gICAgICA/IHJlc3VsdHMuZmlsdGVyKChyZXN1bHQpID0+ICdvdXRwdXQnIGluIHJlc3VsdCAmJiBzaG91bGRQcmludEJ1ZmZlcmVkT3V0cHV0KHJlc3VsdC5leGl0Q29kZSwgcmVzdWx0Lm91dHB1dCkpXG4gICAgICA6IHJlc3VsdHM7XG4gIGlmIChwcmludGFibGVSZXN1bHRzLmxlbmd0aCA9PT0gMCkgcmV0dXJuO1xuXG4gIGZvciAoY29uc3QgcmVzdWx0IG9mIHByaW50YWJsZVJlc3VsdHMpIHtcbiAgICBpZiAoISgnb3V0cHV0JyBpbiByZXN1bHQpKSBjb250aW51ZTtcblxuICAgIGlmIChhcmd2LnByaW50QWxsT3V0cHV0KSB7XG4gICAgICBwcmludENvbW1hbmRPdXRwdXQocmVzdWx0KTtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKGFyZ3Yuc2lsZW50KSB7XG4gICAgICAgIHByaW50Q29tbWFuZEhlYWRlcihyZXN1bHQuY29tbWFuZCwgcmVzdWx0LmN3ZCk7XG4gICAgICB9XG4gICAgICBwcmludEJ1ZmZlcmVkT3V0cHV0KHJlc3VsdC5leGl0Q29kZSwgcmVzdWx0Lm91dHB1dCk7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIHByaW50Q29tbWFuZE91dHB1dChyZXN1bHQ6IEJ1ZmZlcmVkTGludFJ1blJlc3VsdCk6IHZvaWQge1xuICBwcmludENvbW1hbmRIZWFkZXIocmVzdWx0LmNvbW1hbmQsIHJlc3VsdC5jd2QpO1xuXG4gIGlmIChyZXN1bHQuZXhpdENvZGUgPT09IDAgJiYgc2hvdWxkU3VwcHJlc3NTdWNjZXNzZnVsVmVyaWZ5T3V0cHV0KHJlc3VsdC5jb21tYW5kKSkge1xuICAgIGNvbnNvbGUuaW5mbyhjaGFsay5ncmVlbignU3VjY2VlZGVkLicpKTtcbiAgICByZXR1cm47XG4gIH1cblxuICBjb25zdCBvdXRwdXQgPSByZXN1bHQub3V0cHV0LnRyaW0oKTtcbiAgaWYgKG91dHB1dCkge1xuICAgIHByb2Nlc3Muc3Rkb3V0LndyaXRlKG91dHB1dCk7XG4gICAgcHJvY2Vzcy5zdGRvdXQud3JpdGUoJ1xcbicpO1xuICB9XG59XG5cbmZ1bmN0aW9uIHByaW50Q29tbWFuZEhlYWRlcihjb21tYW5kOiBzdHJpbmcsIGN3ZDogc3RyaW5nKTogdm9pZCB7XG4gIGNvbnNvbGUuaW5mbygnXFxuJyArIGNoYWxrLmN5YW4oY2hhbGsuYm9sZCgnQ29tbWFuZDonKSwgY29tbWFuZCkgKyBjaGFsay5ncmF5KGAgYXQgJHtjd2R9YCkpO1xufVxuXG5mdW5jdGlvbiBzaG91bGRTdXBwcmVzc1N1Y2Nlc3NmdWxWZXJpZnlPdXRwdXQoY29tbWFuZDogc3RyaW5nKTogYm9vbGVhbiB7XG4gIHJldHVybiBjb21tYW5kLmluY2x1ZGVzKCcgb3hmbXQgJykgfHwgY29tbWFuZC5pbmNsdWRlcygnIHNvcnQtcGFja2FnZS1qc29uICcpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gYnVpbGRMaW50Q29tbWFuZChcbiAgcHJvamVjdDogUGljazxQcm9qZWN0LCAncHJlZmVycmVkTGludGVyJyB8ICdoYXNUeXBlQXdhcmVPeGxpbnQnPixcbiAgYXJndjogUGljazxMaW50Q29tbWFuZE9wdGlvbnMsICdmaXgnIHwgJ2Zvcm1hdCc+ICYgUGFydGlhbDxQaWNrPExpbnRDb21tYW5kT3B0aW9ucywgJ3F1aWV0Jz4+LFxuICBmaWxlcz86IHN0cmluZ1tdXG4pOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBpZiAocHJvamVjdC5wcmVmZXJyZWRMaW50ZXIgPT09ICdveGxpbnQnKSB7XG4gICAgcmV0dXJuIGJ1aWxkU2hlbGxDb21tYW5kKFtcbiAgICAgICdZQVJOJyxcbiAgICAgICdveGxpbnQnLFxuICAgICAgJy0tbm8tZXJyb3Itb24tdW5tYXRjaGVkLXBhdHRlcm4nLFxuICAgICAgLy8gVHlwZS1hd2FyZSBtb2RlIG1ha2VzIG94bGludCByZXBvcnQgdHlwZS1jaGVjayBkaWFnbm9zdGljcy4gUGFzcyB0aGUgZmxhZ3MgZXhwbGljaXRseVxuICAgICAgLy8gYmVjYXVzZSBveGxpbnQgcmVqZWN0cyB0aGUgZXF1aXZhbGVudCBvcHRpb25zIGluIG5vbi1yb290IGNvbmZpZ3MsIHNvIHBlci1wYWNrYWdlIHJ1bnNcbiAgICAgIC8vIGluIG1vbm9yZXBvcyB3b3VsZCBvdGhlcndpc2UgbWlzcyB0eXBlIGVycm9ycy5cbiAgICAgIC4uLihwcm9qZWN0Lmhhc1R5cGVBd2FyZU94bGludCA/IFsnLS10eXBlLWF3YXJlJywgJy0tdHlwZS1jaGVjayddIDogW10pLFxuICAgICAgLi4uKGFyZ3YucXVpZXQgPyBbJy0tcXVpZXQnXSA6IFtdKSxcbiAgICAgIC4uLihhcmd2LmZpeCA/IFsnLS1maXgnXSA6IFtdKSxcbiAgICAgIC4uLihmaWxlcyA/PyBbJy4nXSksXG4gICAgXSk7XG4gIH1cbiAgcmV0dXJuO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gYnVpbGRPeGZtdENvbW1hbmQoZmlsZXM/OiBzdHJpbmdbXSk6IHN0cmluZyB7XG4gIHJldHVybiBidWlsZFNoZWxsQ29tbWFuZChbXG4gICAgJ1lBUk4nLFxuICAgICdveGZtdCcsXG4gICAgJy0td3JpdGUnLFxuICAgICctLW5vLWVycm9yLW9uLXVubWF0Y2hlZC1wYXR0ZXJuJyxcbiAgICAuLi4oZmlsZXMgPz8gWycuJ10pLFxuICAgICchKiovcGFja2FnZS5qc29uJyxcbiAgXSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBidWlsZFBvZXRyeUZvcm1hdENvbW1hbmQoZmlsZXM/OiBzdHJpbmdbXSk6IHN0cmluZyB7XG4gIGNvbnN0IHRhcmdldHMgPSBmaWxlcyAmJiBmaWxlcy5sZW5ndGggPiAwID8gZmlsZXMgOiBbJy4nXTtcbiAgcmV0dXJuIFtcbiAgICBidWlsZFNoZWxsQ29tbWFuZChbJ3BvZXRyeScsICdydW4nLCAnaXNvcnQnLCAnLS1wcm9maWxlJywgJ2JsYWNrJywgJy0tZmlsdGVyLWZpbGVzJywgLi4udGFyZ2V0c10pLFxuICAgIGJ1aWxkU2hlbGxDb21tYW5kKFsncG9ldHJ5JywgJ3J1bicsICdibGFjaycsIC4uLnRhcmdldHNdKSxcbiAgXS5qb2luKCcgJiYgJyk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBidWlsZFBvZXRyeUxpbnRDb21tYW5kKGFyZ3Y6IFBhcnRpYWw8UGljazxMaW50Q29tbWFuZE9wdGlvbnMsICdxdWlldCc+PiwgZmlsZXM/OiBzdHJpbmdbXSk6IHN0cmluZyB7XG4gIGNvbnN0IHRhcmdldHMgPSBmaWxlcyAmJiBmaWxlcy5sZW5ndGggPiAwID8gZmlsZXMgOiBbJy4nXTtcbiAgcmV0dXJuIGJ1aWxkU2hlbGxDb21tYW5kKFsncG9ldHJ5JywgJ3J1bicsICdmbGFrZTgnLCAuLi4oYXJndi5xdWlldCA/IFsnLXEnXSA6IFtdKSwgLi4udGFyZ2V0c10pO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gYnVpbGRDYXJnb0Zvcm1hdENvbW1hbmQoKTogc3RyaW5nIHtcbiAgLy8gRm9ybWF0dGluZyBtdXN0IGdvIHRocm91Z2ggY2FyZ28gKG5vdCBydXN0Zm10IG9uIGluZGl2aWR1YWwgZmlsZXMpIHNvIGVhY2hcbiAgLy8gY3JhdGUncyBlZGl0aW9uIGFuZCBydXN0Zm10IGNvbmZpZ3VyYXRpb24gYXJlIHJlc3BlY3RlZDsgYC0tYWxsYCBjb3ZlcnNcbiAgLy8gZXZlcnkgd29ya3NwYWNlIG1lbWJlciBhbmQgaXMgYSBuby1vcCBzdWZmaXggZm9yIHNpbmdsZS1jcmF0ZSBwcm9qZWN0cy5cbiAgcmV0dXJuIGJ1aWxkU2hlbGxDb21tYW5kKFsnY2FyZ28nLCAnZm10JywgJy0tYWxsJ10pO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gYnVpbGREYXJ0Rm9ybWF0Q29tbWFuZChmaWxlcz86IHN0cmluZ1tdKTogc3RyaW5nIHtcbiAgY29uc3QgdGFyZ2V0cyA9IGZpbGVzICYmIGZpbGVzLmxlbmd0aCA+IDAgPyBmaWxlcyA6IFsnLiddO1xuICByZXR1cm4gYnVpbGRTaGVsbENvbW1hbmQoWydkYXJ0JywgJ2Zvcm1hdCcsIC4uLnRhcmdldHNdKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGJ1aWxkRGFydExpbnRDb21tYW5kKGZpbGVzPzogc3RyaW5nW10pOiBzdHJpbmcge1xuICBjb25zdCB0YXJnZXRzID0gZmlsZXMgJiYgZmlsZXMubGVuZ3RoID4gMCA/IGZpbGVzIDogWycuJ107XG4gIHJldHVybiBidWlsZFNoZWxsQ29tbWFuZChbJ2RhcnQnLCAnYW5hbHl6ZScsIC4uLnRhcmdldHNdKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGJ1aWxkUHJldHRpZXJBcmdzKFxuICBzZWxmRGlyUGF0aDogc3RyaW5nLFxuICBwcm9qZWN0czogUGljazxQcm9qZWN0LCAnZGlyUGF0aCcgfCAncHJlZmVycmVkTGludGVyJyB8ICdoYXNPeGZtdCc+W11cbik6IHN0cmluZ1tdIHtcbiAgY29uc3QgYXJncyA9IG5ldyBTZXQ8c3RyaW5nPihbYCoqL3suKi8sfSoueyR7Wy4uLnByZXR0aWVyT25seUV4dGVuc2lvbnNdLmpvaW4oJywnKX19YCwgcHJldHRpZXJGaXh0dXJlSWdub3JlUGF0dGVybl0pO1xuICBmb3IgKGNvbnN0IHByb2plY3Qgb2YgcHJvamVjdHMpIHtcbiAgICBpZiAoIW5lZWRzUHJldHRpZXIocHJvamVjdCkpIGNvbnRpbnVlO1xuXG4gICAgY29uc3QgcHJvamVjdFBhdHRlcm4gPSBwYXRoLmpvaW4ocHJvamVjdC5kaXJQYXRoLCAnKiovey4qLyx9Ki57JyArIFsuLi5wcmV0dGllckV4dGVuc2lvbnNdLmpvaW4oJywnKSArICd9Jyk7XG4gICAgYXJncy5hZGQocGF0aC5yZWxhdGl2ZShzZWxmRGlyUGF0aCwgcHJvamVjdFBhdHRlcm4pIHx8IHByb2plY3RQYXR0ZXJuKTtcbiAgfVxuICByZXR1cm4gWy4uLmFyZ3NdO1xufVxuXG5mdW5jdGlvbiBmaW5kT3duaW5nUHJvamVjdChwcm9qZWN0czogUHJvamVjdFtdLCBmaWxlUGF0aDogc3RyaW5nKTogUHJvamVjdCB8IHVuZGVmaW5lZCB7XG4gIGxldCBvd25pbmdQcm9qZWN0OiBQcm9qZWN0IHwgdW5kZWZpbmVkO1xuICBmb3IgKGNvbnN0IHByb2plY3Qgb2YgcHJvamVjdHMpIHtcbiAgICBpZiAoXG4gICAgICAoZmlsZVBhdGggPT09IHByb2plY3QuZGlyUGF0aCB8fCBmaWxlUGF0aC5zdGFydHNXaXRoKGAke3Byb2plY3QuZGlyUGF0aH0vYCkpICYmXG4gICAgICAoIW93bmluZ1Byb2plY3QgfHwgcHJvamVjdC5kaXJQYXRoLmxlbmd0aCA+IG93bmluZ1Byb2plY3QuZGlyUGF0aC5sZW5ndGgpXG4gICAgKSB7XG4gICAgICBvd25pbmdQcm9qZWN0ID0gcHJvamVjdDtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIG93bmluZ1Byb2plY3Q7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRMaW50VGFyZ2V0RmlsZXMoYXJndjogUGljazxMaW50Q29tbWFuZEFyZ3YsICctLScgfCAnXycgfCAnZmlsZXMnPik6IHN0cmluZ1tdIHtcbiAgY29uc3QgbGludFRhcmdldHMgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgZm9yIChjb25zdCB2YWx1ZSBvZiBbLi4uKGFyZ3YuZmlsZXMgPz8gW10pLCAuLi5hcmd2Ll8uc2xpY2UoMSksIC4uLihhcmd2WyctLSddID8/IFtdKV0pIHtcbiAgICBsaW50VGFyZ2V0cy5hZGQoU3RyaW5nKHZhbHVlKSk7XG4gIH1cbiAgcmV0dXJuIFsuLi5saW50VGFyZ2V0c107XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZXRMaW50VGFyZ2V0RmlsZUtpbmQoZmlsZVBhdGg6IHN0cmluZyk6IFByb21pc2U8J2RpcmVjdG9yeScgfCAnb3RoZXInPiB7XG4gIHRyeSB7XG4gICAgY29uc3Qgc3RhdHMgPSBhd2FpdCBmcy5zdGF0KGZpbGVQYXRoKTtcbiAgICBpZiAoc3RhdHMuaXNEaXJlY3RvcnkoKSkgcmV0dXJuICdkaXJlY3RvcnknO1xuICB9IGNhdGNoIHtcbiAgICAvLyBNaXNzaW5nIHBhdGhzIGFyZSBoYW5kbGVkIGJ5IHRoZSBkb3duc3RyZWFtIHRvb2xzLlxuICB9XG5cbiAgcmV0dXJuICdvdGhlcic7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBzaG91bGRGb3JtYXRFeHBsaWNpdFBhdGhXaXRoUHJldHRpZXIoXG4gIHByb2plY3Q6IFBpY2s8UHJvamVjdCwgJ3ByZWZlcnJlZExpbnRlcicgfCAnaGFzT3hmbXQnPixcbiAgZXh0ZW5zaW9uOiBzdHJpbmdcbik6IGJvb2xlYW4ge1xuICBpZiAocHJvamVjdC5oYXNPeGZtdCkgcmV0dXJuIG94Zm10RXh0ZW5zaW9ucy5oYXMoZXh0ZW5zaW9uKTtcbiAgaWYgKG5lZWRzUHJldHRpZXIocHJvamVjdCkpIHJldHVybiB0cnVlO1xuICByZXR1cm4gcHJldHRpZXJPbmx5RXh0ZW5zaW9ucy5oYXMoZXh0ZW5zaW9uKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGJ1aWxkRXhwbGljaXRGb3JtYXR0ZXJBcmdzKFxuICBwcm9qZWN0OiBQaWNrPFByb2plY3QsICdwcmVmZXJyZWRMaW50ZXInIHwgJ2hhc094Zm10Jz4sXG4gIGZpbGVQYXRoOiBzdHJpbmcsXG4gIGZpbGVLaW5kOiAnZGlyZWN0b3J5JyB8ICdvdGhlcicsXG4gIGV4dGVuc2lvbjogc3RyaW5nXG4pOiBzdHJpbmdbXSB7XG4gIGlmIChmaWxlS2luZCA9PT0gJ2RpcmVjdG9yeScgJiYgcHJvamVjdC5oYXNPeGZtdCkge1xuICAgIHJldHVybiBbZmlsZVBhdGhdO1xuICB9XG4gIGlmIChmaWxlS2luZCA9PT0gJ2RpcmVjdG9yeScgJiYgbmVlZHNQcmV0dGllcihwcm9qZWN0KSkge1xuICAgIHJldHVybiBbZmlsZVBhdGgsIHByZXR0aWVyRml4dHVyZUlnbm9yZVBhdHRlcm5dO1xuICB9XG4gIGlmIChzaG91bGRGb3JtYXRFeHBsaWNpdFBhdGhXaXRoUHJldHRpZXIocHJvamVjdCwgZXh0ZW5zaW9uKSkge1xuICAgIHJldHVybiBbZmlsZVBhdGhdO1xuICB9XG4gIHJldHVybiBbXTtcbn1cblxuZnVuY3Rpb24gYnVpbGRQcmV0dGllck9ubHlEaXJlY3RvcnlQYXR0ZXJuKGZpbGVQYXRoOiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gcGF0aC5qb2luKGZpbGVQYXRoLCBgKiovey4qLyx9Ki57JHtbLi4ucHJldHRpZXJPbmx5RXh0ZW5zaW9uc10uam9pbignLCcpfX1gKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldEV4cGxpY2l0UGFja2FnZUpzb25QYXRocyhcbiAgcHJvamVjdHM6IFBpY2s8UHJvamVjdCwgJ2RpclBhdGgnIHwgJ3BhY2thZ2VKc29uUGF0aCc+W10sXG4gIGZpbGVQYXRoOiBzdHJpbmcsXG4gIGZpbGVLaW5kOiAnZGlyZWN0b3J5JyB8ICdvdGhlcidcbik6IHN0cmluZ1tdIHtcbiAgaWYgKGZpbGVLaW5kICE9PSAnZGlyZWN0b3J5JykgcmV0dXJuIFtdO1xuICByZXR1cm4gcHJvamVjdHNcbiAgICAuZmlsdGVyKFxuICAgICAgKHByb2plY3QpID0+XG4gICAgICAgIHByb2plY3QucGFja2FnZUpzb25QYXRoID09PSBwYXRoLmpvaW4oZmlsZVBhdGgsICdwYWNrYWdlLmpzb24nKSB8fFxuICAgICAgICBwcm9qZWN0LnBhY2thZ2VKc29uUGF0aC5zdGFydHNXaXRoKGAke2ZpbGVQYXRofS9gKVxuICAgIClcbiAgICAubWFwKChwcm9qZWN0KSA9PiBwcm9qZWN0LnBhY2thZ2VKc29uUGF0aCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRFeHBsaWNpdExpbnRUYXJnZXRzKFxuICBwcm9qZWN0czogUHJvamVjdFtdLFxuICBmaWxlUGF0aDogc3RyaW5nLFxuICBmaWxlS2luZDogJ2RpcmVjdG9yeScgfCAnb3RoZXInXG4pOiB7IGxpbnRQYXRoOiBzdHJpbmc7IHByb2plY3Q6IFByb2plY3QgfVtdIHtcbiAgaWYgKGZpbGVLaW5kID09PSAnZGlyZWN0b3J5Jykge1xuICAgIGNvbnN0IGRlc2NlbmRhbnRQcm9qZWN0cyA9IHByb2plY3RzLmZpbHRlcihcbiAgICAgIChwcm9qZWN0KSA9PiBwcm9qZWN0LmRpclBhdGggPT09IGZpbGVQYXRoIHx8IHByb2plY3QuZGlyUGF0aC5zdGFydHNXaXRoKGAke2ZpbGVQYXRofS9gKVxuICAgICk7XG4gICAgaWYgKGRlc2NlbmRhbnRQcm9qZWN0cy5sZW5ndGggPiAwKSB7XG4gICAgICByZXR1cm4gZGVzY2VuZGFudFByb2plY3RzLm1hcCgocHJvamVjdCkgPT4gKHsgbGludFBhdGg6IHByb2plY3QuZGlyUGF0aCwgcHJvamVjdCB9KSk7XG4gICAgfVxuICB9XG5cbiAgY29uc3QgcHJvamVjdCA9IGZpbmRPd25pbmdQcm9qZWN0KHByb2plY3RzLCBmaWxlUGF0aCk7XG4gIHJldHVybiBwcm9qZWN0ID8gW3sgbGludFBhdGg6IGZpbGVQYXRoLCBwcm9qZWN0IH1dIDogW107XG59XG5cbmZ1bmN0aW9uIGlzUG90ZW50aWFsTGludFRhcmdldChleHRlbnNpb246IHN0cmluZyk6IGJvb2xlYW4ge1xuICByZXR1cm4gb3hsaW50RXh0ZW5zaW9ucy5oYXMoZXh0ZW5zaW9uKSB8fCBweXRob25FeHRlbnNpb25zLmhhcyhleHRlbnNpb24pIHx8IGRhcnRFeHRlbnNpb25zLmhhcyhleHRlbnNpb24pO1xufVxuXG5mdW5jdGlvbiBzdXBwb3J0c0xpbnRpbmdFeHRlbnNpb24ocHJvamVjdDogUGljazxQcm9qZWN0LCAncHJlZmVycmVkTGludGVyJz4sIGV4dGVuc2lvbjogc3RyaW5nKTogYm9vbGVhbiB7XG4gIGlmIChwcm9qZWN0LnByZWZlcnJlZExpbnRlciA9PT0gJ294bGludCcpIHJldHVybiBveGxpbnRFeHRlbnNpb25zLmhhcyhleHRlbnNpb24pO1xuICByZXR1cm4gZmFsc2U7XG59XG5cbmZ1bmN0aW9uIG5lZWRzUHJldHRpZXIocHJvamVjdDogUGljazxQcm9qZWN0LCAncHJlZmVycmVkTGludGVyJyB8ICdoYXNPeGZtdCc+KTogYm9vbGVhbiB7XG4gIHJldHVybiAhcHJvamVjdC5oYXNPeGZtdCAmJiBwcm9qZWN0LnByZWZlcnJlZExpbnRlciA9PT0gJ294bGludCc7XG59XG4iLCJpbXBvcnQgeyBjcmVhdGVTZXJ2ZXIgfSBmcm9tICdub2RlOm5ldCc7XG5cbmltcG9ydCB0eXBlIHsgUHJvamVjdCB9IGZyb20gJy4uL3Byb2plY3QuanMnO1xuXG5pbXBvcnQgeyBraWxsUG9ydFByb2Nlc3NJbW1lZGlhdGVseUFuZE9uRXhpdCB9IGZyb20gJy4vcHJvY2Vzcy5qcyc7XG5cbi8qKlxuICogQ2hlY2tzIHRoZSBnaXZlbiBwb3J0IGFuZCBraWxscyBhbnkgcHJvY2VzcyB1c2luZyBpdC5cbiAqIE5vdGUgd2IgYWx3YXlzIHJlcXVpcmVzIFBPUlQgZW52aXJvbm1lbnQgdmFyaWFibGUuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBjaGVja0FuZEtpbGxQb3J0UHJvY2VzcyhyYXdQb3J0OiB1bmtub3duLCBwcm9qZWN0OiBQcm9qZWN0KTogUHJvbWlzZTxudW1iZXI+IHtcbiAgY29uc3QgcG9ydCA9IE51bWJlcihyYXdQb3J0KTtcbiAgaWYgKCFwb3J0KSB0aHJvdyBuZXcgRXJyb3IoYFRoZSBnaXZlbiBwb3J0ICgke3BvcnR9KSBpcyBpbnZhbGlkLmApO1xuXG4gIGF3YWl0IGtpbGxQb3J0UHJvY2Vzc0ltbWVkaWF0ZWx5QW5kT25FeGl0KHBvcnQsIHByb2plY3QpO1xuICByZXR1cm4gcG9ydDtcbn1cblxuLyoqXG4gKiBDaGVja3MgaWYgYSBwb3J0IGlzIGF2YWlsYWJsZS5cbiAqIEBwYXJhbSBwb3J0IC0gVGhlIHBvcnQgbnVtYmVyIHRvIGNoZWNrXG4gKiBAcmV0dXJucyBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB0byB0cnVlIGlmIHRoZSBwb3J0IGlzIGF2YWlsYWJsZSwgZmFsc2Ugb3RoZXJ3aXNlXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBpc1BvcnRBdmFpbGFibGUocG9ydDogbnVtYmVyKTogUHJvbWlzZTxib29sZWFuPiB7XG4gIC8vIENoZWNrIGJvdGggc3RhY2tzIHRvIGNhdGNoIHByb2Nlc3NlcyBib3VuZCBvbmx5IG9uIElQdjYgb3IgSVB2NC5cbiAgZm9yIChjb25zdCBob3N0IG9mIFsnMTI3LjAuMC4xJywgJzo6J10pIHtcbiAgICBjb25zdCBhdmFpbGFibGUgPSBhd2FpdCBwcm9iZVBvcnQoaG9zdCwgcG9ydCk7XG4gICAgaWYgKCFhdmFpbGFibGUpIHJldHVybiBmYWxzZTtcbiAgfVxuICByZXR1cm4gdHJ1ZTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gcHJvYmVQb3J0KGhvc3Q6IHN0cmluZywgcG9ydDogbnVtYmVyKTogUHJvbWlzZTxib29sZWFuPiB7XG4gIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xuICAgIGNvbnN0IHNlcnZlciA9IGNyZWF0ZVNlcnZlcigpO1xuXG4gICAgc2VydmVyLm9uY2UoJ2Vycm9yJywgKGVycjogTm9kZUpTLkVycm5vRXhjZXB0aW9uKSA9PiB7XG4gICAgICBpZiAoZXJyLmNvZGUgPT09ICdFQUREUklOVVNFJykge1xuICAgICAgICByZXNvbHZlKGZhbHNlKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgaWYgKGVyci5jb2RlID09PSAnRUFGTk9TVVBQT1JUJykge1xuICAgICAgICByZXNvbHZlKHRydWUpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICByZXNvbHZlKGZhbHNlKTtcbiAgICB9KTtcblxuICAgIHNlcnZlci5vbmNlKCdsaXN0ZW5pbmcnLCAoKSA9PiB7XG4gICAgICBzZXJ2ZXIuY2xvc2UoKCkgPT4ge1xuICAgICAgICByZXNvbHZlKHRydWUpO1xuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBzZXJ2ZXIubGlzdGVuKHBvcnQsIGhvc3QpO1xuICB9KTtcbn1cbiIsImltcG9ydCB7IGV4ZWNGaWxlU3luYywgc3Bhd25TeW5jIH0gZnJvbSAnbm9kZTpjaGlsZF9wcm9jZXNzJztcbmltcG9ydCB7IHNldFRpbWVvdXQgfSBmcm9tICdub2RlOnRpbWVycy9wcm9taXNlcyc7XG5cbmltcG9ydCB7IHNwYXduQXN5bmMgfSBmcm9tICdAd2lsbGJvb3N0ZXIvc2hhcmVkLWxpYi1ub2RlL3NyYyc7XG5cbmltcG9ydCB0eXBlIHsgUHJvamVjdCB9IGZyb20gJy4uL3Byb2plY3QuanMnO1xuaW1wb3J0IHsgcHJpbnRGaW5pc2hlZEFuZEV4aXRJZk5lZWRlZCwgcHJpbnRTdGFydCB9IGZyb20gJy4uL3NjcmlwdHMvcnVuLmpzJztcblxuaW1wb3J0IHsgaXNQb3J0QXZhaWxhYmxlIH0gZnJvbSAnLi9wb3J0LmpzJztcblxuY29uc3Qga2lsbGVkID0gbmV3IFNldDxudW1iZXIgfCBzdHJpbmc+KCk7XG5jb25zdCBzdGFsZVByb2Nlc3NQb2xsSW50ZXJ2YWxNcyA9IDEwMDtcbmNvbnN0IHN0YWxlUHJvY2Vzc01heFBvbGxzID0gMTA7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBraWxsUG9ydFByb2Nlc3NJbW1lZGlhdGVseUFuZE9uRXhpdChwb3J0OiBudW1iZXIsIHByb2plY3Q6IFByb2plY3QpOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgYXZhaWxhYmxlID0gYXdhaXQgaXNQb3J0QXZhaWxhYmxlKHBvcnQpO1xuICBpZiAoIWF2YWlsYWJsZSkge1xuICAgIGF3YWl0IGtpbGxQb3J0Q29udGFpbmVyQW5kUHJvY2Vzcyhwb3J0LCBwcm9qZWN0KTtcbiAgfVxuXG4gIGNvbnN0IGtpbGxGdW5jID0gYXN5bmMgKCk6IFByb21pc2U8dm9pZD4gPT4ge1xuICAgIGlmIChraWxsZWQuaGFzKHBvcnQpKSByZXR1cm47XG5cbiAgICBraWxsZWQuYWRkKHBvcnQpO1xuICAgIGF3YWl0IGtpbGxQb3J0Q29udGFpbmVyQW5kUHJvY2Vzcyhwb3J0LCBwcm9qZWN0KTtcbiAgfTtcbiAgZm9yIChjb25zdCBzaWduYWwgb2YgWydiZWZvcmVFeGl0JywgJ1NJR0lOVCcsICdTSUdURVJNJywgJ1NJR1FVSVQnXSkge1xuICAgIHByb2Nlc3Mub24oc2lnbmFsLCBraWxsRnVuYyk7XG4gIH1cbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGtpbGxQb3J0Q29udGFpbmVyQW5kUHJvY2Vzcyhwb3J0OiBudW1iZXIsIHByb2plY3Q6IFByb2plY3QpOiBQcm9taXNlPHZvaWQ+IHtcbiAgYXdhaXQgc3RvcERvY2tlckNvbnRhaW5lckJ5UG9ydChwb3J0LCBwcm9qZWN0KTtcbiAga2lsbExpc3RlbmluZ1Byb2Nlc3Nlc0J5UG9ydChwb3J0KTtcbn1cblxuZnVuY3Rpb24ga2lsbExpc3RlbmluZ1Byb2Nlc3Nlc0J5UG9ydChwb3J0OiBudW1iZXIpOiB2b2lkIHtcbiAgZm9yIChjb25zdCBwaWQgb2YgbGlzdExpc3RlbmluZ1Byb2Nlc3NJZHMocG9ydCkpIHtcbiAgICB0cnkge1xuICAgICAgcHJvY2Vzcy5raWxsKHBpZCwgJ1NJR0tJTEwnKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIGRvIG5vdGhpbmdcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gbGlzdExpc3RlbmluZ1Byb2Nlc3NJZHMocG9ydDogbnVtYmVyKTogbnVtYmVyW10ge1xuICB0cnkge1xuICAgIGNvbnN0IHN0ZG91dCA9IGV4ZWNGaWxlU3luYygnbHNvZicsIFsnLXRpJywgYHRjcDoke3BvcnR9YCwgJy1zVENQOkxJU1RFTiddLCB7XG4gICAgICBlbmNvZGluZzogJ3V0ZjgnLFxuICAgICAgc3RkaW86IFsnaWdub3JlJywgJ3BpcGUnLCAnaWdub3JlJ10sXG4gICAgICB0aW1lb3V0OiAyMDAwLFxuICAgIH0pO1xuICAgIHJldHVybiBzdGRvdXRcbiAgICAgIC5zcGxpdCgvXFxzKy8pXG4gICAgICAubWFwKChwaWQpID0+IE51bWJlcihwaWQudHJpbSgpKSlcbiAgICAgIC5maWx0ZXIoKHBpZCkgPT4gTnVtYmVyLmlzSW50ZWdlcihwaWQpICYmIHBpZCA+IDAgJiYgcGlkICE9PSBwcm9jZXNzLnBpZCk7XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiBbXTtcbiAgfVxufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcmVtb3ZlU3RhbGVQcm9jZXNzKHBpZDogbnVtYmVyKTogUHJvbWlzZTx2b2lkPiB7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgc3RhbGVQcm9jZXNzTWF4UG9sbHM7IGkrKykge1xuICAgIGF3YWl0IHNldFRpbWVvdXQoc3RhbGVQcm9jZXNzUG9sbEludGVydmFsTXMpO1xuICAgIHRyeSB7XG4gICAgICBwcm9jZXNzLmtpbGwocGlkLCAwKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgaWYgKChlcnJvciBhcyBOb2RlSlMuRXJybm9FeGNlcHRpb24pLmNvZGUgPT09ICdFU1JDSCcpIHJldHVybjtcbiAgICB9XG4gIH1cblxuICB0cnkge1xuICAgIHByb2Nlc3Mua2lsbChwaWQsICdTSUdLSUxMJyk7XG4gIH0gY2F0Y2gge1xuICAgIC8vIGRvIG5vdGhpbmdcbiAgfVxufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gc3RvcERvY2tlckNvbnRhaW5lckJ5SW1hZ2VOYW1lKGltYWdlTmFtZTogc3RyaW5nLCBwcm9qZWN0OiBQcm9qZWN0KTogUHJvbWlzZTx2b2lkPiB7XG4gIGF3YWl0IHJlbW92ZURvY2tlckNvbnRhaW5lcnMoWyctLWZpbHRlcicsIGBuYW1lPSR7aW1hZ2VOYW1lfWBdLCBwcm9qZWN0KTtcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHN0b3BEb2NrZXJDb250YWluZXJCeVBvcnQocG9ydDogbnVtYmVyLCBwcm9qZWN0OiBQcm9qZWN0KTogUHJvbWlzZTx2b2lkPiB7XG4gIGF3YWl0IHJlbW92ZURvY2tlckNvbnRhaW5lcnMoWyctLWZpbHRlcicsIGBwdWJsaXNoPSR7cG9ydH1gXSwgcHJvamVjdCk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHJlbW92ZURvY2tlckNvbnRhaW5lcnMoZmlsdGVyQXJnczogc3RyaW5nW10sIHByb2plY3Q6IFByb2plY3QpOiBQcm9taXNlPHZvaWQ+IHtcbiAgdHJ5IHtcbiAgICBjb25zdCBjb250YWluZXJJZHMgPSBhd2FpdCBsaXN0RG9ja2VyQ29udGFpbmVySWRzKGZpbHRlckFyZ3MsIHByb2plY3QpO1xuICAgIGlmIChjb250YWluZXJJZHMubGVuZ3RoID09PSAwKSByZXR1cm47XG5cbiAgICBhd2FpdCBzcGF3bkFzeW5jKCdkb2NrZXInLCBbJ3JtJywgJy1mJywgLi4uY29udGFpbmVySWRzXSwge1xuICAgICAgY3dkOiBwcm9qZWN0LmRpclBhdGgsXG4gICAgICBlbnY6IHByb2plY3QuZW52LFxuICAgIH0pO1xuICB9IGNhdGNoIHtcbiAgICAvLyBkbyBub3RoaW5nXG4gIH1cbn1cblxuYXN5bmMgZnVuY3Rpb24gbGlzdERvY2tlckNvbnRhaW5lcklkcyhmaWx0ZXJBcmdzOiBzdHJpbmdbXSwgcHJvamVjdDogUHJvamVjdCk6IFByb21pc2U8c3RyaW5nW10+IHtcbiAgY29uc3QgeyBzdGRvdXQgfSA9IGF3YWl0IHNwYXduQXN5bmMoJ2RvY2tlcicsIFsncHMnLCAnLXEnLCAuLi5maWx0ZXJBcmdzXSwge1xuICAgIGN3ZDogcHJvamVjdC5kaXJQYXRoLFxuICAgIGVudjogcHJvamVjdC5lbnYsXG4gIH0pO1xuICByZXR1cm4gc3Rkb3V0XG4gICAgLnNwbGl0KC9cXHMrLylcbiAgICAubWFwKChpZCkgPT4gaWQudHJpbSgpKVxuICAgIC5maWx0ZXIoQm9vbGVhbik7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBzcGF3blN5bmNPbkV4aXQoc2NyaXB0OiBzdHJpbmcsIHByb2plY3Q6IFByb2plY3QpOiB2b2lkIHtcbiAgY29uc3Qga2lsbEZ1bmMgPSAoKTogdm9pZCA9PiB7XG4gICAgaWYgKGtpbGxlZC5oYXMoc2NyaXB0KSkgcmV0dXJuO1xuXG4gICAga2lsbGVkLmFkZChzY3JpcHQpO1xuICAgIHByaW50U3RhcnQoc2NyaXB0LCBwcm9qZWN0KTtcbiAgICBjb25zdCB7IHN0YXR1cyB9ID0gc3Bhd25TeW5jKHNjcmlwdCwgeyBjd2Q6IHByb2plY3QuZGlyUGF0aCwgc2hlbGw6IHRydWUsIHN0ZGlvOiAnaW5oZXJpdCcgfSk7XG4gICAgcHJpbnRGaW5pc2hlZEFuZEV4aXRJZk5lZWRlZChzY3JpcHQsIHN0YXR1cywge30pO1xuICB9O1xuICBmb3IgKGNvbnN0IHNpZ25hbCBvZiBbJ2JlZm9yZUV4aXQnLCAnU0lHSU5UJywgJ1NJR1RFUk0nLCAnU0lHUVVJVCddKSB7XG4gICAgcHJvY2Vzcy5vbihzaWduYWwsIGtpbGxGdW5jKTtcbiAgfVxufVxuIiwiaW1wb3J0IGFzc2VydCBmcm9tICdub2RlOmFzc2VydCc7XG5pbXBvcnQgZnMgZnJvbSAnbm9kZTpmcy9wcm9taXNlcyc7XG5pbXBvcnQgaHR0cCBmcm9tICdub2RlOmh0dHAnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcbmltcG9ydCB7IHNldFRpbWVvdXQgfSBmcm9tICdub2RlOnRpbWVycy9wcm9taXNlcyc7XG5cbmltcG9ydCB7IHRyZWVLaWxsIH0gZnJvbSAnQHdpbGxib29zdGVyL3NoYXJlZC1saWItbm9kZS9zcmMnO1xuaW1wb3J0IGNoYWxrIGZyb20gJ2NoYWxrJztcbmltcG9ydCB0eXBlIHsgQXJndiwgQ29tbWFuZE1vZHVsZSwgSW5mZXJyZWRPcHRpb25UeXBlcyB9IGZyb20gJ3lhcmdzJztcblxuaW1wb3J0IHsgZmluZFNlbGZQcm9qZWN0LCB0eXBlIFByb2plY3QgfSBmcm9tICcuLi9wcm9qZWN0LmpzJztcbmltcG9ydCB0eXBlIHsgc2hhcmVkT3B0aW9uc0J1aWxkZXIgfSBmcm9tICcuLi9zaGFyZWRPcHRpb25zQnVpbGRlci5qcyc7XG5pbXBvcnQgeyBraWxsUG9ydENvbnRhaW5lckFuZFByb2Nlc3MsIHJlbW92ZVN0YWxlUHJvY2VzcyB9IGZyb20gJy4uL3V0aWxzL3Byb2Nlc3MuanMnO1xuXG5jb25zdCBidWlsZGVyID0ge1xuICAnZGVsYXktbXMnOiB7XG4gICAgZGVmYXVsdDogNTAwMCxcbiAgICBkZXNjcmliZTogJ0RlbGF5IGJlZm9yZSBzdGFydGluZyB0aGUgbWFpbnRlbmFuY2UgcGFnZSBzZXJ2ZXIuJyxcbiAgICB0eXBlOiAnbnVtYmVyJyxcbiAgfSxcbn0gYXMgY29uc3Q7XG50eXBlIE1haW50ZW5hbmNlQXJndiA9IEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIGJ1aWxkZXIgJiB0eXBlb2Ygc2hhcmVkT3B0aW9uc0J1aWxkZXI+ICYge1xuICBhY3Rpb246ICdzdGFydCcgfCAnc3RvcCc7XG59O1xuY29uc3QgbWFpbnRlbmFuY2VMaXN0ZW5NYXhBdHRlbXB0cyA9IDU7XG5jb25zdCBtYWludGVuYW5jZUxpc3RlblJldHJ5RGVsYXlNcyA9IDEwMDtcbmNvbnN0IG1heFRpbWVvdXREZWxheU1zID0gMl8xNDdfNDgzXzY0NztcbmNvbnN0IG1haW50ZW5hbmNlUGlkRGlyZWN0b3J5TmFtZSA9ICcud2InO1xuY29uc3QgbWFpbnRlbmFuY2VIdG1sID0gYDwhZG9jdHlwZSBodG1sPlxuPGh0bWwgbGFuZz1cImphXCI+XG4gIDxoZWFkPlxuICAgIDxtZXRhIGNoYXJzZXQ9XCJ1dGYtOFwiPlxuICAgIDxtZXRhIG5hbWU9XCJ2aWV3cG9ydFwiIGNvbnRlbnQ9XCJ3aWR0aD1kZXZpY2Utd2lkdGgsIGluaXRpYWwtc2NhbGU9MVwiPlxuICAgIDx0aXRsZT7jg6Hjg7Pjg4bjg4rjg7PjgrnkuK08L3RpdGxlPlxuICAgIDxzdHlsZT5cbiAgICAgIGJvZHkge1xuICAgICAgICBhbGlnbi1pdGVtczogY2VudGVyO1xuICAgICAgICBiYWNrZ3JvdW5kOiAjZjhmYWZjO1xuICAgICAgICBjb2xvcjogIzExMTgyNztcbiAgICAgICAgZGlzcGxheTogZmxleDtcbiAgICAgICAgZm9udC1mYW1pbHk6IC1hcHBsZS1zeXN0ZW0sIEJsaW5rTWFjU3lzdGVtRm9udCwgXCJTZWdvZSBVSVwiLCBzYW5zLXNlcmlmO1xuICAgICAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjtcbiAgICAgICAgbWFyZ2luOiAwO1xuICAgICAgICBtaW4taGVpZ2h0OiAxMDB2aDtcbiAgICAgIH1cblxuICAgICAgbWFpbiB7XG4gICAgICAgIHBhZGRpbmc6IDI0cHg7XG4gICAgICAgIHRleHQtYWxpZ246IGNlbnRlcjtcbiAgICAgIH1cblxuICAgICAgaDEge1xuICAgICAgICBmb250LXNpemU6IDI4cHg7XG4gICAgICAgIGxpbmUtaGVpZ2h0OiAxLjQ7XG4gICAgICAgIG1hcmdpbjogMCAwIDE2cHg7XG4gICAgICB9XG5cbiAgICAgIHAge1xuICAgICAgICBmb250LXNpemU6IDE2cHg7XG4gICAgICAgIGxpbmUtaGVpZ2h0OiAxLjg7XG4gICAgICAgIG1hcmdpbjogMDtcbiAgICAgIH1cbiAgICA8L3N0eWxlPlxuICA8L2hlYWQ+XG4gIDxib2R5PlxuICAgIDxtYWluPlxuICAgICAgPGgxPuePvuWcqOODoeODs+ODhuODiuODs+OCueS4reOBp+OBmTwvaDE+XG4gICAgICA8cD7nmobmp5jjgavjga/jgZTkuI3kvr/jgpLjgYrjgYvjgZHjgZfjgb7jgZnjgYzjgIHjg6Hjg7Pjg4bjg4rjg7PjgrnntYLkuobjgb7jgafjgZfjgbDjgonjgY/jgYrlvoXjgaHjgY/jgaDjgZXjgYTjgII8L3A+XG4gICAgPC9tYWluPlxuICA8L2JvZHk+XG48L2h0bWw+YDtcblxuZXhwb3J0IGNvbnN0IG1haW50ZW5hbmNlQ29tbWFuZDogQ29tbWFuZE1vZHVsZTx1bmtub3duLCBNYWludGVuYW5jZUFyZ3Y+ID0ge1xuICBjb21tYW5kOiAnbWFpbnRlbmFuY2UgPGFjdGlvbj4nLFxuICBkZXNjcmliZTogJ1N0YXJ0IG9yIHN0b3AgYSBsaWdodHdlaWdodCBtYWludGVuYW5jZSBwYWdlIHNlcnZlci4gRXhhbXBsZTogd2IgbWFpbnRlbmFuY2Ugc3RhcnQnLFxuICBidWlsZGVyOiAoeWFyZ3M6IEFyZ3Y8dW5rbm93bj4pID0+XG4gICAgeWFyZ3NcbiAgICAgIC5wb3NpdGlvbmFsKCdhY3Rpb24nLCB7XG4gICAgICAgIGNob2ljZXM6IFsnc3RhcnQnLCAnc3RvcCddIGFzIGNvbnN0LFxuICAgICAgICBkZXNjcmliZTogJ01haW50ZW5hbmNlIHNlcnZlciBhY3Rpb24nLFxuICAgICAgICB0eXBlOiAnc3RyaW5nJyxcbiAgICAgIH0pXG4gICAgICAub3B0aW9ucyhidWlsZGVyKSBhcyB1bmtub3duIGFzIEFyZ3Y8TWFpbnRlbmFuY2VBcmd2PixcbiAgYXN5bmMgaGFuZGxlcihhcmd2KSB7XG4gICAgY29uc3QgcHJvamVjdCA9IGZpbmRTZWxmUHJvamVjdChhcmd2KTtcbiAgICBpZiAoIXByb2plY3QpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoY2hhbGsucmVkKCdObyBwcm9qZWN0IGZvdW5kLicpKTtcbiAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICB9XG5cbiAgICBjb25zdCBhY3Rpb24gPSBhcmd2LmFjdGlvbjtcbiAgICBpZiAocHJvamVjdC5lbnYuV0JfRU5WID09PSAndGVzdCcpIHtcbiAgICAgIGNvbnNvbGUuaW5mbyhgU2tpcCBtYWludGVuYW5jZSAke2FjdGlvbn0gYmVjYXVzZSBXQl9FTlYgaXMgdGVzdC5gKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBwb3J0ID0gcGFyc2VQb3J0KHByb2plY3QuZW52LlBPUlQpO1xuICAgIGlmIChhY3Rpb24gPT09ICdzdGFydCcpIHtcbiAgICAgIGF3YWl0IHN0YXJ0TWFpbnRlbmFuY2VTZXJ2ZXIocHJvamVjdCwgcG9ydCwgYXJndi5kZWxheU1zKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKGFjdGlvbiA9PT0gJ3N0b3AnKSB7XG4gICAgICBhd2FpdCBzdG9wTWFpbnRlbmFuY2VTZXJ2ZXIocHJvamVjdCwgcG9ydCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhyb3cgbmV3IEVycm9yKGBVbmtub3duIG1haW50ZW5hbmNlIGFjdGlvbjogJHthY3Rpb259YCk7XG4gIH0sXG59O1xuXG5mdW5jdGlvbiBwYXJzZVBvcnQocG9ydEVudjogc3RyaW5nIHwgdW5kZWZpbmVkKTogbnVtYmVyIHtcbiAgY29uc3QgcG9ydCA9IE51bWJlcihwb3J0RW52KTtcbiAgYXNzZXJ0Lm9rKE51bWJlci5pc0ludGVnZXIocG9ydCkgJiYgcG9ydCA+IDAsIGBQT1JUIGVudmlyb25tZW50IHZhcmlhYmxlIGlzIGludmFsaWQ6ICR7cG9ydEVudn1gKTtcbiAgcmV0dXJuIHBvcnQ7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHN0YXJ0TWFpbnRlbmFuY2VTZXJ2ZXIocHJvamVjdDogUHJvamVjdCwgcG9ydDogbnVtYmVyLCBkZWxheU1zOiBudW1iZXIpOiBQcm9taXNlPHZvaWQ+IHtcbiAgYXNzZXJ0Lm9rKFxuICAgIE51bWJlci5pc0Zpbml0ZShkZWxheU1zKSAmJiBkZWxheU1zID49IDAgJiYgZGVsYXlNcyA8PSBtYXhUaW1lb3V0RGVsYXlNcyxcbiAgICBgZGVsYXktbXMgbXVzdCBiZSBiZXR3ZWVuIDAgYW5kICR7bWF4VGltZW91dERlbGF5TXN9OiAke2RlbGF5TXN9YFxuICApO1xuXG4gIGNvbnN0IHBpZEZpbGVQYXRoID0gYXdhaXQgd3JpdGVNYWludGVuYW5jZVBpZEZpbGUocHJvamVjdCwgcG9ydCk7XG4gIGNvbnN0IGFib3J0Q29udHJvbGxlciA9IG5ldyBBYm9ydENvbnRyb2xsZXIoKTtcbiAgY29uc3QgY2xlYW51cCA9IGFzeW5jICgpOiBQcm9taXNlPHZvaWQ+ID0+IHtcbiAgICBhd2FpdCByZW1vdmVNYWludGVuYW5jZVBpZEZpbGUocGlkRmlsZVBhdGgsIHByb2Nlc3MucGlkKTtcbiAgfTtcbiAgY29uc3QgaGFuZGxlU2lnbmFsID0gKCk6IHZvaWQgPT4ge1xuICAgIGFib3J0Q29udHJvbGxlci5hYm9ydCgpO1xuICB9O1xuICBjb25zdCByZW1vdmVTaWduYWxIYW5kbGVycyA9ICgpOiB2b2lkID0+IHtcbiAgICBwcm9jZXNzLm9mZignU0lHSU5UJywgaGFuZGxlU2lnbmFsKTtcbiAgICBwcm9jZXNzLm9mZignU0lHVEVSTScsIGhhbmRsZVNpZ25hbCk7XG4gICAgcHJvY2Vzcy5vZmYoJ1NJR1FVSVQnLCBoYW5kbGVTaWduYWwpO1xuICB9O1xuXG4gIHByb2Nlc3Mub25jZSgnU0lHSU5UJywgaGFuZGxlU2lnbmFsKTtcbiAgcHJvY2Vzcy5vbmNlKCdTSUdURVJNJywgaGFuZGxlU2lnbmFsKTtcbiAgcHJvY2Vzcy5vbmNlKCdTSUdRVUlUJywgaGFuZGxlU2lnbmFsKTtcblxuICB0cnkge1xuICAgIGF3YWl0IHNldFRpbWVvdXQoZGVsYXlNcywgdW5kZWZpbmVkLCB7IHNpZ25hbDogYWJvcnRDb250cm9sbGVyLnNpZ25hbCB9KTtcbiAgICByZW1vdmVTaWduYWxIYW5kbGVycygpO1xuICAgIGNvbnN0IHNlcnZlciA9IGF3YWl0IGNyZWF0ZUFuZExpc3Rlbk1haW50ZW5hbmNlU2VydmVyKHBvcnQpO1xuICAgIGlmICghc2VydmVyKSByZXR1cm47XG5cbiAgICBjb25zb2xlLmluZm8oYFN0YXJ0ZWQgbWFpbnRlbmFuY2Ugc2VydmVyIG9uIHBvcnQgJHtwb3J0fS5gKTtcbiAgICBhd2FpdCB3YWl0Rm9yU2h1dGRvd24oc2VydmVyKTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBFcnJvciAmJiBlcnJvci5uYW1lID09PSAnQWJvcnRFcnJvcicpIHJldHVybjtcblxuICAgIHRocm93IGVycm9yO1xuICB9IGZpbmFsbHkge1xuICAgIHJlbW92ZVNpZ25hbEhhbmRsZXJzKCk7XG4gICAgYXdhaXQgY2xlYW51cCgpO1xuICB9XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGNyZWF0ZUFuZExpc3Rlbk1haW50ZW5hbmNlU2VydmVyKHBvcnQ6IG51bWJlcik6IFByb21pc2U8aHR0cC5TZXJ2ZXIgfCB1bmRlZmluZWQ+IHtcbiAgZm9yIChsZXQgYXR0ZW1wdCA9IDE7IGF0dGVtcHQgPD0gbWFpbnRlbmFuY2VMaXN0ZW5NYXhBdHRlbXB0czsgYXR0ZW1wdCsrKSB7XG4gICAgY29uc3Qgc2VydmVyID0gY3JlYXRlTWFpbnRlbmFuY2VTZXJ2ZXIoKTtcbiAgICB0cnkge1xuICAgICAgYXdhaXQgbGlzdGVuTWFpbnRlbmFuY2VTZXJ2ZXIoc2VydmVyLCBwb3J0LCBoYW5kbGVSdW50aW1lTWFpbnRlbmFuY2VTZXJ2ZXJFcnJvcik7XG4gICAgICByZXR1cm4gc2VydmVyO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBhd2FpdCBjbG9zZU1haW50ZW5hbmNlU2VydmVyKHNlcnZlcik7XG4gICAgICBjb25zdCBlcnIgPSBlcnJvciBhcyBOb2RlSlMuRXJybm9FeGNlcHRpb247XG4gICAgICBpZiAoZXJyLmNvZGUgPT09ICdFQUREUklOVVNFJyAmJiBhdHRlbXB0IDwgbWFpbnRlbmFuY2VMaXN0ZW5NYXhBdHRlbXB0cykge1xuICAgICAgICBhd2FpdCBzZXRUaW1lb3V0KG1haW50ZW5hbmNlTGlzdGVuUmV0cnlEZWxheU1zKTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBpZiAoZXJyLmNvZGUgPT09ICdFQUREUklOVVNFJykge1xuICAgICAgICBjb25zb2xlLmluZm8oYFNraXAgbWFpbnRlbmFuY2Ugc2VydmVyIGJlY2F1c2UgcG9ydCAke3BvcnR9IGlzIGFscmVhZHkgaW4gdXNlLmApO1xuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgfVxuICAgICAgaGFuZGxlTWFpbnRlbmFuY2VTdGFydHVwRXJyb3IocG9ydCwgZXJyKTtcbiAgICB9XG4gIH1cblxuICB0aHJvdyBuZXcgRXJyb3IoJ1VucmVhY2hhYmxlIG1haW50ZW5hbmNlIHNlcnZlciBzdGFydHVwIHN0YXRlLicpO1xufVxuXG5mdW5jdGlvbiBoYW5kbGVNYWludGVuYW5jZVN0YXJ0dXBFcnJvcihwb3J0OiBudW1iZXIsIGVycm9yOiBOb2RlSlMuRXJybm9FeGNlcHRpb24pOiBuZXZlciB7XG4gIGlmIChlcnJvci5jb2RlID09PSAnRUFERFJJTlVTRScpIHtcbiAgICBjb25zb2xlLmVycm9yKGNoYWxrLnJlZChgUG9ydCAke3BvcnR9IGlzIGFscmVhZHkgaW4gdXNlLmApKTtcbiAgfSBlbHNlIHtcbiAgICBjb25zb2xlLmVycm9yKGNoYWxrLnJlZChgTWFpbnRlbmFuY2Ugc2VydmVyIGVycm9yOiAke2Vycm9yLm1lc3NhZ2V9YCkpO1xuICB9XG4gIHByb2Nlc3MuZXhpdCgxKTtcbn1cblxuZnVuY3Rpb24gaGFuZGxlUnVudGltZU1haW50ZW5hbmNlU2VydmVyRXJyb3IoZXJyb3I6IEVycm9yKTogdm9pZCB7XG4gIGNvbnNvbGUuZXJyb3IoY2hhbGsucmVkKGBNYWludGVuYW5jZSBzZXJ2ZXIgZXJyb3I6ICR7ZXJyb3IubWVzc2FnZX1gKSk7XG4gIHByb2Nlc3MuZXhpdCgxKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gc3RvcE1haW50ZW5hbmNlU2VydmVyKHByb2plY3Q6IFByb2plY3QsIHBvcnQ6IG51bWJlcik6IFByb21pc2U8dm9pZD4ge1xuICBhd2FpdCBraWxsTWFpbnRlbmFuY2VQcm9jZXNzKHByb2plY3QsIHBvcnQpO1xuICBhd2FpdCBraWxsUG9ydENvbnRhaW5lckFuZFByb2Nlc3MocG9ydCwgcHJvamVjdCk7XG4gIGNvbnNvbGUuaW5mbyhgU3RvcHBlZCBtYWludGVuYW5jZSBzZXJ2ZXIgb24gcG9ydCAke3BvcnR9LmApO1xufVxuXG5mdW5jdGlvbiBjcmVhdGVNYWludGVuYW5jZVNlcnZlcigpOiBodHRwLlNlcnZlciB7XG4gIHJldHVybiBodHRwLmNyZWF0ZVNlcnZlcigoX3JlcXVlc3QsIHJlc3BvbnNlKSA9PiB7XG4gICAgcmVzcG9uc2Uud3JpdGVIZWFkKDUwMywge1xuICAgICAgJ2NhY2hlLWNvbnRyb2wnOiAnbm8tc3RvcmUnLFxuICAgICAgJ2NvbnRlbnQtdHlwZSc6ICd0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgnLFxuICAgIH0pO1xuICAgIHJlc3BvbnNlLmVuZChtYWludGVuYW5jZUh0bWwpO1xuICB9KTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gbGlzdGVuTWFpbnRlbmFuY2VTZXJ2ZXIoXG4gIHNlcnZlcjogaHR0cC5TZXJ2ZXIsXG4gIHBvcnQ6IG51bWJlcixcbiAgb25SdW50aW1lRXJyb3I6IChlcnJvcjogRXJyb3IpID0+IHZvaWRcbik6IFByb21pc2U8dm9pZD4ge1xuICBhd2FpdCBuZXcgUHJvbWlzZTx2b2lkPigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgY29uc3Qgb25TdGFydHVwRXJyb3IgPSAoZXJyb3I6IEVycm9yKTogdm9pZCA9PiB7XG4gICAgICBzZXJ2ZXIub2ZmKCdsaXN0ZW5pbmcnLCBvbkxpc3RlbmluZyk7XG4gICAgICByZWplY3QoZXJyb3IpO1xuICAgIH07XG4gICAgY29uc3Qgb25MaXN0ZW5pbmcgPSAoKTogdm9pZCA9PiB7XG4gICAgICBzZXJ2ZXIub2ZmKCdlcnJvcicsIG9uU3RhcnR1cEVycm9yKTtcbiAgICAgIHNlcnZlci5vbignZXJyb3InLCBvblJ1bnRpbWVFcnJvcik7XG4gICAgICByZXNvbHZlKCk7XG4gICAgfTtcbiAgICBzZXJ2ZXIub25jZSgnZXJyb3InLCBvblN0YXJ0dXBFcnJvcik7XG4gICAgc2VydmVyLm9uY2UoJ2xpc3RlbmluZycsIG9uTGlzdGVuaW5nKTtcbiAgICBzZXJ2ZXIubGlzdGVuKHBvcnQsICcwLjAuMC4wJyk7XG4gIH0pO1xufVxuXG5hc3luYyBmdW5jdGlvbiB3YWl0Rm9yU2h1dGRvd24oc2VydmVyOiBodHRwLlNlcnZlcik6IFByb21pc2U8dm9pZD4ge1xuICBhd2FpdCBuZXcgUHJvbWlzZTx2b2lkPigocmVzb2x2ZSkgPT4ge1xuICAgIGNvbnN0IHNodXRkb3duID0gKCk6IHZvaWQgPT4ge1xuICAgICAgcHJvY2Vzcy5vZmYoJ1NJR0lOVCcsIHNodXRkb3duKTtcbiAgICAgIHByb2Nlc3Mub2ZmKCdTSUdURVJNJywgc2h1dGRvd24pO1xuICAgICAgcHJvY2Vzcy5vZmYoJ1NJR1FVSVQnLCBzaHV0ZG93bik7XG4gICAgICB2b2lkIChhc3luYyAoKSA9PiB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgYXdhaXQgY2xvc2VNYWludGVuYW5jZVNlcnZlcihzZXJ2ZXIpO1xuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoY2hhbGsucmVkKGBGYWlsZWQgdG8gY2xvc2UgbWFpbnRlbmFuY2Ugc2VydmVyOiAkeyhlcnJvciBhcyBFcnJvcikubWVzc2FnZX1gKSk7XG4gICAgICAgIH0gZmluYWxseSB7XG4gICAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgICB9XG4gICAgICB9KSgpO1xuICAgIH07XG4gICAgcHJvY2Vzcy5vbmNlKCdTSUdJTlQnLCBzaHV0ZG93bik7XG4gICAgcHJvY2Vzcy5vbmNlKCdTSUdURVJNJywgc2h1dGRvd24pO1xuICAgIHByb2Nlc3Mub25jZSgnU0lHUVVJVCcsIHNodXRkb3duKTtcbiAgfSk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGNsb3NlTWFpbnRlbmFuY2VTZXJ2ZXIoc2VydmVyOiBodHRwLlNlcnZlcik6IFByb21pc2U8dm9pZD4ge1xuICBhd2FpdCBuZXcgUHJvbWlzZTx2b2lkPigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgc2VydmVyLmNsb3NlKChlcnJvcikgPT4ge1xuICAgICAgaWYgKGVycm9yKSB7XG4gICAgICAgIGlmICgoZXJyb3IgYXMgTm9kZUpTLkVycm5vRXhjZXB0aW9uKS5jb2RlID09PSAnRVJSX1NFUlZFUl9OT1RfUlVOTklORycpIHtcbiAgICAgICAgICByZXNvbHZlKCk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHJlamVjdChlcnJvcik7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIHJlc29sdmUoKTtcbiAgICB9KTtcbiAgICBzZXJ2ZXIuY2xvc2VBbGxDb25uZWN0aW9ucygpO1xuICB9KTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gd3JpdGVNYWludGVuYW5jZVBpZEZpbGUocHJvamVjdDogUHJvamVjdCwgcG9ydDogbnVtYmVyKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgY29uc3QgcGlkRmlsZVBhdGggPSBtYWludGVuYW5jZVBpZEZpbGVQYXRoKHByb2plY3QsIHBvcnQpO1xuICBhd2FpdCBmcy5ta2RpcihwYXRoLmRpcm5hbWUocGlkRmlsZVBhdGgpLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgYXdhaXQgZnMud3JpdGVGaWxlKHBpZEZpbGVQYXRoLCBgJHtwcm9jZXNzLnBpZH1cXG5gLCAndXRmOCcpO1xuICByZXR1cm4gcGlkRmlsZVBhdGg7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGtpbGxNYWludGVuYW5jZVByb2Nlc3MocHJvamVjdDogUHJvamVjdCwgcG9ydDogbnVtYmVyKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IHBpZEZpbGVQYXRoID0gbWFpbnRlbmFuY2VQaWRGaWxlUGF0aChwcm9qZWN0LCBwb3J0KTtcbiAgY29uc3QgcGlkID0gYXdhaXQgcmVhZE1haW50ZW5hbmNlUGlkRmlsZShwaWRGaWxlUGF0aCk7XG4gIGlmIChwaWQgIT09IHVuZGVmaW5lZCAmJiBwaWQgIT09IHByb2Nlc3MucGlkKSB7XG4gICAgdHJ5IHtcbiAgICAgIHRyZWVLaWxsKHBpZCwgJ1NJR1RFUk0nKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIGRvIG5vdGhpbmdcbiAgICB9XG4gICAgYXdhaXQgcmVtb3ZlU3RhbGVQcm9jZXNzKHBpZCk7XG4gIH1cbiAgYXdhaXQgcmVtb3ZlTWFpbnRlbmFuY2VQaWRGaWxlKHBpZEZpbGVQYXRoLCBwaWQpO1xufVxuXG5hc3luYyBmdW5jdGlvbiByZW1vdmVNYWludGVuYW5jZVBpZEZpbGUocGlkRmlsZVBhdGg6IHN0cmluZywgZXhwZWN0ZWRQaWQ/OiBudW1iZXIpOiBQcm9taXNlPHZvaWQ+IHtcbiAgaWYgKGV4cGVjdGVkUGlkICE9PSB1bmRlZmluZWQpIHtcbiAgICBjb25zdCBwaWQgPSBhd2FpdCByZWFkTWFpbnRlbmFuY2VQaWRGaWxlKHBpZEZpbGVQYXRoKTtcbiAgICBpZiAocGlkICE9PSBleHBlY3RlZFBpZCkgcmV0dXJuO1xuICB9XG4gIGF3YWl0IGZzLnJtKHBpZEZpbGVQYXRoLCB7IGZvcmNlOiB0cnVlIH0pO1xufVxuXG5hc3luYyBmdW5jdGlvbiByZWFkTWFpbnRlbmFuY2VQaWRGaWxlKHBpZEZpbGVQYXRoOiBzdHJpbmcpOiBQcm9taXNlPG51bWJlciB8IHVuZGVmaW5lZD4ge1xuICB0cnkge1xuICAgIGNvbnN0IHBpZFRleHQgPSBhd2FpdCBmcy5yZWFkRmlsZShwaWRGaWxlUGF0aCwgJ3V0ZjgnKTtcbiAgICBjb25zdCBwaWQgPSBOdW1iZXIocGlkVGV4dC50cmltKCkpO1xuICAgIHJldHVybiBOdW1iZXIuaXNJbnRlZ2VyKHBpZCkgJiYgcGlkID4gMCA/IHBpZCA6IHVuZGVmaW5lZDtcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxufVxuXG5mdW5jdGlvbiBtYWludGVuYW5jZVBpZEZpbGVQYXRoKHByb2plY3Q6IFByb2plY3QsIHBvcnQ6IG51bWJlcik6IHN0cmluZyB7XG4gIHJldHVybiBnZXRNYWludGVuYW5jZVBpZEZpbGVQYXRoKHByb2plY3Qucm9vdERpclBhdGgsIHBvcnQpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0TWFpbnRlbmFuY2VQaWRGaWxlUGF0aChyb290RGlyUGF0aDogc3RyaW5nLCBwb3J0OiBudW1iZXIpOiBzdHJpbmcge1xuICByZXR1cm4gcGF0aC5qb2luKHJvb3REaXJQYXRoLCBtYWludGVuYW5jZVBpZERpcmVjdG9yeU5hbWUsIGBtYWludGVuYW5jZS0ke3BvcnR9LnBpZGApO1xufVxuIiwiaW1wb3J0IHR5cGUgeyBQcm9qZWN0IH0gZnJvbSAnLi4vcHJvamVjdC5qcyc7XG5cbmV4cG9ydCBmdW5jdGlvbiogcHJlcGFyZUZvclJ1bm5pbmdDb21tYW5kKGNvbW1hbmROYW1lOiBzdHJpbmcsIHByb2plY3RzOiBQcm9qZWN0W10pOiBHZW5lcmF0b3I8UHJvamVjdCwgdm9pZCwgdW5rbm93bj4ge1xuICBmb3IgKGNvbnN0IHByb2plY3Qgb2YgcHJvamVjdHMpIHtcbiAgICBjb25zb2xlLmluZm8oYFJ1bm5pbmcgXCIke2NvbW1hbmROYW1lfVwiIGZvciAke3Byb2plY3QubmFtZX0gLi4uYCk7XG5cbiAgICB5aWVsZCBwcm9qZWN0O1xuICB9XG59XG4iLCJpbXBvcnQgY2hpbGRfcHJvY2VzcyBmcm9tICdub2RlOmNoaWxkX3Byb2Nlc3MnO1xuaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcbmltcG9ydCB7IGZpbGVVUkxUb1BhdGggfSBmcm9tICdub2RlOnVybCc7XG5cbmltcG9ydCBjaGFsayBmcm9tICdjaGFsayc7XG5pbXBvcnQgeyBnbG9iYnkgfSBmcm9tICdnbG9iYnknO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlSnNvbiB9IGZyb20gJ3R5cGUtZmVzdCc7XG5pbXBvcnQgdHlwZSB7IENvbW1hbmRNb2R1bGUsIEluZmVycmVkT3B0aW9uVHlwZXMgfSBmcm9tICd5YXJncyc7XG5cbmltcG9ydCB7XG4gIGZpbmREZXNjZW5kYW50UHJvamVjdHMsXG4gIGdldEFic29sdXRlRmlsZURhdGFiYXNlVXJsUGF0aCxcbiAgZ2V0RmlsZURhdGFiYXNlVXJsUGF0aCxcbiAgdHlwZSBQcm9qZWN0LFxufSBmcm9tICcuLi9wcm9qZWN0LmpzJztcblxuaW1wb3J0IHsgcHJlcGFyZUZvclJ1bm5pbmdDb21tYW5kIH0gZnJvbSAnLi9jb21tYW5kVXRpbHMuanMnO1xuXG5jb25zdCBkZXBlbmRlbmN5U2VjdGlvbktleXMgPSBbJ2RlcGVuZGVuY2llcycsICdkZXZEZXBlbmRlbmNpZXMnLCAnb3B0aW9uYWxEZXBlbmRlbmNpZXMnLCAncGVlckRlcGVuZGVuY2llcyddIGFzIGNvbnN0O1xuY29uc3Qgc3FsaXRlRmlsZVBhdHRlcm4gPSAvXFwuKD86c3FsaXRlMz98ZGIpKD86Wy0uXSg/OmpvdXJuYWx8c2htfHdhbCkpPyQvaTtcbmNvbnN0IGRvY2tlckJ1aWxkQ2FjaGVQYXRocyA9IFtcbiAgJy5jYWNoZScsXG4gICcubXlweV9jYWNoZScsXG4gICcubmV4dC9jYWNoZScsXG4gICcucGFyY2VsLWNhY2hlJyxcbiAgJy5weXRlc3RfY2FjaGUnLFxuICAnLnJ1ZmZfY2FjaGUnLFxuICAnLnRveCcsXG4gICcudHVyYm8nLFxuICAnLnZlbnYnLFxuICAnLnlhcm4vY2FjaGUnLFxuICAnLnlhcm4vaW5zdGFsbC1zdGF0ZS5neicsXG4gICdfX3B5Y2FjaGVfXycsXG4gICdjb3ZlcmFnZScsXG4gICdub2RlX21vZHVsZXMvLmNhY2hlJyxcbiAgJ3BsYXl3cmlnaHQtcmVwb3J0JyxcbiAgJ3N0b3J5Ym9vay1zdGF0aWMnLFxuICAndGFyZ2V0JyxcbiAgJ3Rlc3QtcmVzdWx0cycsXG5dO1xuY29uc3QgZG9ja2VyQnVpbGRDYWNoZVBhdHRlcm5zID0gWycqKi8qLnB5YycsICcqKi8qLnRzYnVpbGRpbmZvJywgJyoqL19fcHljYWNoZV9fJ107XG5jb25zdCBnZW5lcmF0ZWRTcWxpdGVEaXJOYW1lcyA9IFsncHJpc21hJywgJ2RiJywgJ2RyaXp6bGUnXSBhcyBjb25zdDtcbmNvbnN0IGRvY2tlckdlbmVyYXRlZERhdGFEaXJQYXRocyA9IFsnL2RhdGEnXSBhcyBjb25zdDtcblxuY29uc3QgYnVpbGRlciA9IHtcbiAgb3V0c2lkZToge1xuICAgIGRlc2NyaXB0aW9uOiAnV2hldGhlciB0aGUgb3B0aW1pemF0aW9uIGlzIGV4ZWN1dGVkIG91dHNpZGUgYSBkb2NrZXIgY29udGFpbmVyIG9yIG5vdCcsXG4gICAgdHlwZTogJ2Jvb2xlYW4nLFxuICAgIGFsaWFzOiAnbycsXG4gIH0sXG59IGFzIGNvbnN0O1xuXG5leHBvcnQgY29uc3Qgb3B0aW1pemVGb3JEb2NrZXJCdWlsZENvbW1hbmQ6IENvbW1hbmRNb2R1bGU8dW5rbm93biwgSW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgYnVpbGRlcj4+ID0ge1xuICBjb21tYW5kOiAnb3B0aW1pemVGb3JEb2NrZXJCdWlsZCcsXG4gIGRlc2NyaWJlOiAnT3B0aW1pemUgY29uZmlndXJhdGlvbiB3aGVuIGJ1aWxkaW5nIGEgRG9ja2VyIGltYWdlJyxcbiAgYnVpbGRlcixcbiAgYXN5bmMgaGFuZGxlcihhcmd2KSB7XG4gICAgY29uc3QgcHJvamVjdHMgPSBhd2FpdCBmaW5kRGVzY2VuZGFudFByb2plY3RzKGFyZ3YpO1xuICAgIGlmICghcHJvamVjdHMpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoY2hhbGsucmVkKCdObyBwcm9qZWN0IGZvdW5kLicpKTtcbiAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICB9XG5cbiAgICBjb25zdCBvcHRpbWl6ZWRQcm9qZWN0czogUHJvamVjdFtdID0gW107XG4gICAgZm9yIChjb25zdCBwcm9qZWN0IG9mIHByZXBhcmVGb3JSdW5uaW5nQ29tbWFuZCgnb3B0aW1pemVGb3JEb2NrZXJCdWlsZCcsIHByb2plY3RzLmRlc2NlbmRhbnRzKSkge1xuICAgICAgY29uc3QgcGFja2FnZUpzb246IFBhY2thZ2VKc29uID0gcHJvamVjdC5wYWNrYWdlSnNvbjtcbiAgICAgIHJld3JpdGVQcml2YXRlR2l0SHViRGVwZW5kZW5jaWVzKHByb2plY3QsIHBhY2thZ2VKc29uKTtcbiAgICAgIGNvbnN0IHJlbW92ZWREZXZEZXBlbmRlbmNpZXMgPSBvcHRpbWl6ZURldkRlcGVuZGVuY2llcyhhcmd2LCBwYWNrYWdlSnNvbik7XG5cbiAgICAgIG9wdGltaXplU2NyaXB0cyhwYWNrYWdlSnNvbiwge1xuICAgICAgICByZW1vdmVXYlBvc3RpbnN0YWxsOiAhYXJndi5vdXRzaWRlICYmIHJlbW92ZWREZXZEZXBlbmRlbmNpZXMuaW5jbHVkZXMoJ0B3aWxsYm9vc3Rlci93YicpLFxuICAgICAgfSk7XG5cbiAgICAgIG9wdGltaXplUm9vdFByb3BzKHBhY2thZ2VKc29uKTtcblxuICAgICAgaWYgKGFyZ3YuZHJ5UnVuKSBjb250aW51ZTtcblxuICAgICAgY29uc3QgZGlzdERpclBhdGggPSBhcmd2Lm91dHNpZGUgPyBwYXRoLmpvaW4ocHJvamVjdC5kaXJQYXRoLCAnZGlzdCcpIDogcHJvamVjdC5kaXJQYXRoO1xuICAgICAgYXdhaXQgZnMucHJvbWlzZXMubWtkaXIoZGlzdERpclBhdGgsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICAgICAgYXdhaXQgZnMucHJvbWlzZXMud3JpdGVGaWxlKHBhdGguam9pbihkaXN0RGlyUGF0aCwgJ3BhY2thZ2UuanNvbicpLCBKU09OLnN0cmluZ2lmeShwYWNrYWdlSnNvbiksICd1dGY4Jyk7XG4gICAgICBpZiAoYXJndi5vdXRzaWRlKSB7XG4gICAgICAgIGF3YWl0IHdyaXRlRG9ja2VyU2hlbGxTY3JpcHRzKHBhdGguam9pbihkaXN0RGlyUGF0aCwgJ2Jhc2gnKSk7XG4gICAgICB9XG4gICAgICBvcHRpbWl6ZWRQcm9qZWN0cy5wdXNoKHByb2plY3QpO1xuICAgIH1cbiAgICBpZiAoIWFyZ3YuZHJ5UnVuICYmICFhcmd2Lm91dHNpZGUpIHtcbiAgICAgIGNoaWxkX3Byb2Nlc3Muc3Bhd25TeW5jKHByb2plY3RzLnJvb3QucGFja2FnZU1hbmFnZXJDb21tYW5kLCBbJ2luc3RhbGwnXSwge1xuICAgICAgICBzdGRpbzogJ2luaGVyaXQnLFxuICAgICAgfSk7XG4gICAgICBjb25zb2xlLmluZm8oJ0luc3RhbGxlZCBkZXBlbmRlbmNpZXMuJyk7XG4gICAgICBhd2FpdCBjbGVhbnVwRG9ja2VyQnVpbGRBcnRpZmFjdHMob3B0aW1pemVkUHJvamVjdHMpO1xuICAgIH1cbiAgfSxcbn07XG5cbmZ1bmN0aW9uIHJld3JpdGVQcml2YXRlR2l0SHViRGVwZW5kZW5jaWVzKHByb2plY3Q6IFByb2plY3QsIHBhY2thZ2VKc29uOiBQYWNrYWdlSnNvbik6IHN0cmluZ1tdIHtcbiAgcmV0dXJuIHJld3JpdGVQcml2YXRlR2l0SHViRGVwZW5kZW5jaWVzRm9yRGlyKHByb2plY3Qucm9vdERpclBhdGgsIHByb2plY3QuZGlyUGF0aCwgcGFja2FnZUpzb24pO1xufVxuXG5mdW5jdGlvbiByZXdyaXRlUHJpdmF0ZUdpdEh1YkRlcGVuZGVuY2llc0ZvckRpcihcbiAgcm9vdERpclBhdGg6IHN0cmluZyxcbiAgcGFja2FnZURpclBhdGg6IHN0cmluZyxcbiAgcGFja2FnZUpzb246IFBhY2thZ2VKc29uXG4pOiBzdHJpbmdbXSB7XG4gIGNvbnN0IHJld3JpdHRlbkRlcGVuZGVuY2llczogc3RyaW5nW10gPSBbXTtcbiAgZm9yIChjb25zdCBrZXkgb2YgZGVwZW5kZW5jeVNlY3Rpb25LZXlzKSB7XG4gICAgY29uc3QgZGVwcyA9IHBhY2thZ2VKc29uW2tleV0gPz8ge307XG4gICAgZm9yIChjb25zdCBbbmFtZSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKGRlcHMpKSB7XG4gICAgICBpZiAodmFsdWU/LnN0YXJ0c1dpdGgoJ2dpdEBnaXRodWIuY29tOicpKSB7XG4gICAgICAgIC8vIERvY2tlciBidWlsZHMgY2Fubm90IGFjY2VzcyBwcml2YXRlIFNTSCBVUkxzIHVubGVzcyBjcmVkZW50aWFscyBhcmUgZm9yd2FyZGVkLlxuICAgICAgICAvLyBUaGUgRG9ja2VyZmlsZSBjb3BpZXMgdGhvc2Ugd29ya3NwYWNlIHBhY2thZ2VzIGludG8gdGhlIGltYWdlIGluc3RlYWQuXG4gICAgICAgIGRlcHNbbmFtZV0gPSBnZXRQcml2YXRlUGFja2FnZURvY2tlclNwZWNpZmllcihyb290RGlyUGF0aCwgcGFja2FnZURpclBhdGgsIG5hbWUpO1xuICAgICAgICByZXdyaXR0ZW5EZXBlbmRlbmNpZXMucHVzaChgJHtrZXl9LiR7bmFtZX1gKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgY29uc29sZS5pbmZvKCdSZXdyb3RlIHByaXZhdGUgR2l0SHViIGRlcGVuZGVuY2llczonLCByZXdyaXR0ZW5EZXBlbmRlbmNpZXMuam9pbignLCAnKSB8fCAnbm9uZScpO1xuICByZXR1cm4gcmV3cml0dGVuRGVwZW5kZW5jaWVzO1xufVxuXG5mdW5jdGlvbiBnZXRQcml2YXRlUGFja2FnZURvY2tlclNwZWNpZmllcihyb290RGlyUGF0aDogc3RyaW5nLCBwYWNrYWdlRGlyUGF0aDogc3RyaW5nLCBwYWNrYWdlTmFtZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgY29uc3QgcHJpdmF0ZVBhY2thZ2VEaXJQYXRoID0gcGF0aC5qb2luKHJvb3REaXJQYXRoLCAnQHdpbGxib29zdGVyJywgdG9VbnNjb3BlZFBhY2thZ2VOYW1lKHBhY2thZ2VOYW1lKSk7XG4gIGNvbnN0IHJlbGF0aXZlUGF0aCA9IHBhdGgucmVsYXRpdmUocGFja2FnZURpclBhdGgsIHByaXZhdGVQYWNrYWdlRGlyUGF0aCk7XG4gIHJldHVybiByZWxhdGl2ZVBhdGguc3RhcnRzV2l0aCgnLicpID8gcmVsYXRpdmVQYXRoIDogYC4vJHtyZWxhdGl2ZVBhdGh9YDtcbn1cblxuZnVuY3Rpb24gdG9VbnNjb3BlZFBhY2thZ2VOYW1lKHBhY2thZ2VOYW1lOiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gcGFja2FnZU5hbWUucmVwbGFjZSgvXkB3aWxsYm9vc3RlclxcLy8sICcnKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gd3JpdGVEb2NrZXJTaGVsbFNjcmlwdHMoZGlyUGF0aDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IHNvdXJjZURpclBhdGggPSBmaW5kRG9ja2VyU2hlbGxTY3JpcHRzRGlyUGF0aCgpO1xuICBhd2FpdCBmcy5wcm9taXNlcy5ta2RpcihkaXJQYXRoLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgZm9yIChjb25zdCBkaXJlbnQgb2YgYXdhaXQgZnMucHJvbWlzZXMucmVhZGRpcihzb3VyY2VEaXJQYXRoLCB7IHdpdGhGaWxlVHlwZXM6IHRydWUgfSkpIHtcbiAgICBpZiAoIWRpcmVudC5pc0ZpbGUoKSB8fCAhZGlyZW50Lm5hbWUuZW5kc1dpdGgoJy5zaCcpKSBjb250aW51ZTtcblxuICAgIGNvbnN0IHRhcmdldEZpbGVQYXRoID0gcGF0aC5qb2luKGRpclBhdGgsIGRpcmVudC5uYW1lKTtcbiAgICBhd2FpdCBmcy5wcm9taXNlcy5jb3B5RmlsZShwYXRoLmpvaW4oc291cmNlRGlyUGF0aCwgZGlyZW50Lm5hbWUpLCB0YXJnZXRGaWxlUGF0aCk7XG4gICAgYXdhaXQgZnMucHJvbWlzZXMuY2htb2QodGFyZ2V0RmlsZVBhdGgsIDBvNzU1KTtcbiAgfVxuICBjb25zb2xlLmluZm8oYEdlbmVyYXRlZCBEb2NrZXIgc2hlbGwgc2NyaXB0czogJHtwYXRoLnJlbGF0aXZlKHByb2Nlc3MuY3dkKCksIGRpclBhdGgpIHx8IGRpclBhdGh9YCk7XG59XG5cbmZ1bmN0aW9uIGZpbmREb2NrZXJTaGVsbFNjcmlwdHNEaXJQYXRoKCk6IHN0cmluZyB7XG4gIGxldCBjdXJyZW50RGlyUGF0aCA9IHBhdGguZGlybmFtZShmaWxlVVJMVG9QYXRoKGltcG9ydC5tZXRhLnVybCkpO1xuICBmb3IgKDs7KSB7XG4gICAgY29uc3QgY2FuZGlkYXRlID0gcGF0aC5qb2luKGN1cnJlbnREaXJQYXRoLCAnZG9ja2VyJywgJ2Jhc2gnKTtcbiAgICBpZiAoZnMuZXhpc3RzU3luYyhjYW5kaWRhdGUpKSByZXR1cm4gY2FuZGlkYXRlO1xuXG4gICAgY29uc3QgcGFyZW50RGlyUGF0aCA9IHBhdGguZGlybmFtZShjdXJyZW50RGlyUGF0aCk7XG4gICAgaWYgKHBhcmVudERpclBhdGggPT09IGN1cnJlbnREaXJQYXRoKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0RvY2tlciBzaGVsbCBzY3JpcHRzIGRpcmVjdG9yeSBub3QgZm91bmQuJyk7XG4gICAgfVxuICAgIGN1cnJlbnREaXJQYXRoID0gcGFyZW50RGlyUGF0aDtcbiAgfVxufVxuXG5mdW5jdGlvbiBvcHRpbWl6ZURldkRlcGVuZGVuY2llcyhhcmd2OiBJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBidWlsZGVyPiwgcGFja2FnZUpzb246IFBhY2thZ2VKc29uKTogc3RyaW5nW10ge1xuICBpZiAoYXJndi5vdXRzaWRlKSB7XG4gICAgLy8gT3V0c2lkZSBvcHRpbWl6YXRpb24gd3JpdGVzIGRpc3QvcGFja2FnZS5qc29uIGJlZm9yZSBEb2NrZXIgYnVpbGRzIHRoZSBhcHAuXG4gICAgLy8gS2VlcCBidWlsZC10aW1lIGRlcGVuZGVuY2llcyBhbmQgcmVtb3ZlIG9ubHkga25vd24gbm9uLWJ1aWxkIHRvb2xpbmcuXG4gICAgcmV0dXJuIHJlbW92ZVVubmVjZXNzYXJ5RGV2RGVwZW5kZW5jaWVzRm9yT3V0c2lkZURvY2tlckJ1aWxkKHBhY2thZ2VKc29uKTtcbiAgfVxuXG4gIC8vIEluc2lkZSBEb2NrZXIsIGNvZGVnZW4vYnVpbGQgaGFzIGFscmVhZHkgZmluaXNoZWQsIHNvIHByb2R1Y3Rpb24gaW5zdGFsbCBzaG91bGQgbm90IHNlZSBkZXYgdG9vbGluZy5cbiAgY29uc3QgcmVtb3ZlZERlcGVuZGVuY2llcyA9IE9iamVjdC5rZXlzKHBhY2thZ2VKc29uLmRldkRlcGVuZGVuY2llcyA/PyB7fSk7XG4gIGRlbGV0ZSBwYWNrYWdlSnNvbi5kZXZEZXBlbmRlbmNpZXM7XG4gIGNvbnNvbGUuaW5mbygnUmVtb3ZlZCBhbGwgZGV2RGVwZW5kZW5jaWVzLicpO1xuICByZXR1cm4gcmVtb3ZlZERlcGVuZGVuY2llcztcbn1cblxuZnVuY3Rpb24gcmVtb3ZlVW5uZWNlc3NhcnlEZXZEZXBlbmRlbmNpZXNGb3JPdXRzaWRlRG9ja2VyQnVpbGQocGFja2FnZUpzb246IFBhY2thZ2VKc29uKTogc3RyaW5nW10ge1xuICBjb25zdCBkZXZEZXBzID0gcGFja2FnZUpzb24uZGV2RGVwZW5kZW5jaWVzID8/IHt9O1xuICAvLyBJbiAtLW91dHNpZGUgbW9kZSwgRG9ja2VyIHN0aWxsIHJ1bnMgY29kZWdlbi9idWlsZCBiZWZvcmUgYSBzZWNvbmQgaW4taW1hZ2Ugb3B0aW1pemF0aW9uLlxuICAvLyBSZW1vdmUgb25seSB0b29saW5nIHRoYXQgaXMgbm90IG5lZWRlZCBmb3IgdGhhdCBidWlsZCBwaGFzZS5cbiAgY29uc3QgbmFtZVdvcmRzVG9CZVJlbW92ZWQgPSBbXG4gICAgJ2FydGlsbGVyeScsXG4gICAgJ2Jpb21lJyxcbiAgICAnY29uY3VycmVudGx5JyxcbiAgICAnY29udmVudGlvbmFsLWNoYW5nZWxvZy1jb252ZW50aW9uYWxjb21taXRzJyxcbiAgICAnZXNsaW50JyxcbiAgICAnaHVza3knLFxuICAgICdpbWFnZW1pbicsXG4gICAgJ2plc3QnLFxuICAgICdraWxsLXBvcnQnLFxuICAgICdsaW50LXN0YWdlZCcsXG4gICAgJ29wZW4tY2xpJyxcbiAgICAnb3hmbXQnLFxuICAgICdveGxpbnQnLFxuICAgICdwbGF5d3JpZ2h0JyxcbiAgICAncHJldHRpZXInLFxuICAgICdwaW5zdCcsXG4gICAgJ3JhaWx3YXknLFxuICAgICdzZW1hbnRpYy1yZWxlYXNlJyxcbiAgICAnc29ydC1wYWNrYWdlLWpzb24nLFxuICAgICd3YWl0LW9uJyxcbiAgICAndml0ZXN0JyxcbiAgXTtcbiAgY29uc3QgcmVtb3ZlZERlcHM6IHN0cmluZ1tdID0gW107XG4gIGZvciAoY29uc3QgbmFtZSBvZiBPYmplY3Qua2V5cyhkZXZEZXBzKSkge1xuICAgIGlmIChcbiAgICAgIG5hbWVXb3Jkc1RvQmVSZW1vdmVkLnNvbWUoKHdvcmQpID0+IG5hbWUuaW5jbHVkZXMod29yZCkpIHx8XG4gICAgICAvLyBTaGFyZWQgY29uZmlnIHBhY2thZ2VzIGFyZSBuZWVkZWQgb25seSBmb3IgbGludC9mb3JtYXQvdGVzdCBjb21tYW5kcywgbm90IERvY2tlciBidWlsZHMuXG4gICAgICAobmFtZS5pbmNsdWRlcygnd2lsbGJvb3N0ZXInKSAmJiBuYW1lLmluY2x1ZGVzKCdjb25maWcnKSlcbiAgICApIHtcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZHluYW1pYy1kZWxldGVcbiAgICAgIGRlbGV0ZSBkZXZEZXBzW25hbWVdO1xuICAgICAgcmVtb3ZlZERlcHMucHVzaChuYW1lKTtcbiAgICB9XG4gIH1cbiAgY29uc29sZS5pbmZvKCdSZW1vdmVkIGRldkRlcGVuZGVuY2llczonLCByZW1vdmVkRGVwcy5qb2luKCcsICcpIHx8ICdub25lJyk7XG4gIHJldHVybiByZW1vdmVkRGVwcztcbn1cblxuZnVuY3Rpb24gb3B0aW1pemVTY3JpcHRzKHBhY2thZ2VKc29uOiBQYWNrYWdlSnNvbiwgb3B0aW9uczogeyByZW1vdmVXYlBvc3RpbnN0YWxsOiBib29sZWFuIH0pOiB2b2lkIHtcbiAgY29uc3QgbmFtZVdvcmRzT2ZVbm5lY2Vzc2FyeVNjcmlwdHMgPSBbJ2NoZWNrJywgJ2RlcGxveScsICdmb3JtYXQnLCAnbGludCcsICdzdGFydCcsICd0ZXN0J107XG4gIGNvbnN0IGNvbnRlbnRXb3Jkc09mVW5uZWNlc3NhcnlTY3JpcHRzID0gWydwaW5zdCAnLCAnaHVza3kgJ107XG4gIGNvbnN0IHNjcmlwdHMgPSAocGFja2FnZUpzb24uc2NyaXB0cyA/PyB7fSkgYXMgUmVjb3JkPHN0cmluZywgc3RyaW5nPjtcbiAgY29uc3QgcmVtb3ZlZFNjcmlwdHM6IHN0cmluZ1tdID0gW107XG4gIGZvciAoY29uc3QgW25hbWUsIGNvbnRlbnRdIG9mIE9iamVjdC5lbnRyaWVzKHNjcmlwdHMpKSB7XG4gICAgaWYgKFxuICAgICAgKG9wdGlvbnMucmVtb3ZlV2JQb3N0aW5zdGFsbCAmJiBuYW1lID09PSAncG9zdGluc3RhbGwnICYmIGNvbnRlbnQudHJpbSgpID09PSAnd2IgZ2VuLWNvZGUnKSB8fFxuICAgICAgbmFtZVdvcmRzT2ZVbm5lY2Vzc2FyeVNjcmlwdHMuc29tZSgod29yZCkgPT4gbmFtZS5zdGFydHNXaXRoKHdvcmQpKSB8fFxuICAgICAgLy8gU3VwcG9ydCBcImh1c2t5XCIgc2luY2UgaHVza3kgdjkgcmVxdWlyZXMgYFwicG9zdGluc3RhbGxcIjogXCJodXNreVwiYFxuICAgICAgY29udGVudFdvcmRzT2ZVbm5lY2Vzc2FyeVNjcmlwdHMuc29tZSgod29yZCkgPT4gY29udGVudC5pbmNsdWRlcyh3b3JkKSB8fCBjb250ZW50LnRyaW0oKSA9PT0gd29yZC50cmltKCkpXG4gICAgKSB7XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWR5bmFtaWMtZGVsZXRlXG4gICAgICBkZWxldGUgc2NyaXB0c1tuYW1lXTtcbiAgICAgIHJlbW92ZWRTY3JpcHRzLnB1c2gobmFtZSk7XG4gICAgfVxuICB9XG4gIGNvbnNvbGUuaW5mbygnUmVtb3ZlZCBzY3JpcHRzOicsIHJlbW92ZWRTY3JpcHRzLmpvaW4oJywgJykgfHwgJ25vbmUnKTtcbn1cblxuZnVuY3Rpb24gb3B0aW1pemVSb290UHJvcHMocGFja2FnZUpzb246IFBhY2thZ2VKc29uKTogdm9pZCB7XG4gIGRlbGV0ZSBwYWNrYWdlSnNvbi5wcml2YXRlO1xuICBkZWxldGUgcGFja2FnZUpzb24ucHVibGlzaENvbmZpZztcbiAgZGVsZXRlIHBhY2thZ2VKc29uLnByZXR0aWVyO1xufVxuXG5hc3luYyBmdW5jdGlvbiBjbGVhbnVwRG9ja2VyQnVpbGRBcnRpZmFjdHMocHJvamVjdHM6IFByb2plY3RbXSk6IFByb21pc2U8dm9pZD4ge1xuICBmb3IgKGNvbnN0IHByb2plY3Qgb2YgcHJvamVjdHMpIHtcbiAgICBhd2FpdCByZW1vdmVQcm9qZWN0Q2FjaGVzKHByb2plY3QpO1xuICAgIGF3YWl0IHJlbW92ZUdlbmVyYXRlZExvY2FsRGF0YShwcm9qZWN0KTtcbiAgICBydW5Eb2NrZXJDbGVhbnVwU2NyaXB0KHByb2plY3QpO1xuICB9XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHJlbW92ZVByb2plY3RDYWNoZXMocHJvamVjdDogUHJvamVjdCk6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCByZWxhdGl2ZVBhdGhzID0gW1xuICAgIC4uLihhd2FpdCByZW1vdmVEb2NrZXJCdWlsZENhY2hlUGF0aHMocHJvamVjdCkpLFxuICAgIC4uLihhd2FpdCByZW1vdmVEb2NrZXJCdWlsZENhY2hlUGF0dGVybnMocHJvamVjdCkpLFxuICBdO1xuICBjb25zb2xlLmluZm8oJ1JlbW92ZWQgRG9ja2VyIGJ1aWxkIGNhY2hlczonLCByZWxhdGl2ZVBhdGhzLmpvaW4oJywgJykgfHwgJ25vbmUnKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gcmVtb3ZlRG9ja2VyQnVpbGRDYWNoZVBhdGhzKHByb2plY3Q6IFByb2plY3QpOiBQcm9taXNlPHN0cmluZ1tdPiB7XG4gIGNvbnN0IHJlbW92ZWRQYXRoczogc3RyaW5nW10gPSBbXTtcbiAgZm9yIChjb25zdCByZWxhdGl2ZVBhdGggb2YgZG9ja2VyQnVpbGRDYWNoZVBhdGhzKSB7XG4gICAgY29uc3QgdGFyZ2V0UGF0aCA9IHBhdGguam9pbihwcm9qZWN0LmRpclBhdGgsIHJlbGF0aXZlUGF0aCk7XG4gICAgaWYgKCFmcy5leGlzdHNTeW5jKHRhcmdldFBhdGgpKSBjb250aW51ZTtcblxuICAgIGF3YWl0IGZzLnByb21pc2VzLnJtKHRhcmdldFBhdGgsIHsgZm9yY2U6IHRydWUsIHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgICByZW1vdmVkUGF0aHMucHVzaChyZWxhdGl2ZVBhdGgpO1xuICB9XG4gIHJldHVybiByZW1vdmVkUGF0aHM7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHJlbW92ZURvY2tlckJ1aWxkQ2FjaGVQYXR0ZXJucyhwcm9qZWN0OiBQcm9qZWN0KTogUHJvbWlzZTxzdHJpbmdbXT4ge1xuICBjb25zdCByZWxhdGl2ZVBhdGhzID0gYXdhaXQgZ2xvYmJ5KGRvY2tlckJ1aWxkQ2FjaGVQYXR0ZXJucywge1xuICAgIGN3ZDogcHJvamVjdC5kaXJQYXRoLFxuICAgIGRvdDogdHJ1ZSxcbiAgICBmb2xsb3dTeW1ib2xpY0xpbmtzOiBmYWxzZSxcbiAgICBpZ25vcmU6IFsnKiovbm9kZV9tb2R1bGVzJywgJyoqL25vZGVfbW9kdWxlcy8qKicsICcqKi8ueWFybicsICcqKi8ueWFybi8qKicsICcqKi8uZ2l0JywgJyoqLy5naXQvKionXSxcbiAgICBvbmx5RmlsZXM6IGZhbHNlLFxuICB9KTtcbiAgYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgcmVsYXRpdmVQYXRocy5tYXAoKHJlbGF0aXZlUGF0aCkgPT5cbiAgICAgIGZzLnByb21pc2VzLnJtKHBhdGguam9pbihwcm9qZWN0LmRpclBhdGgsIHJlbGF0aXZlUGF0aCksIHsgZm9yY2U6IHRydWUsIHJlY3Vyc2l2ZTogdHJ1ZSB9KVxuICAgIClcbiAgKTtcbiAgcmV0dXJuIHJlbGF0aXZlUGF0aHM7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHJlbW92ZUdlbmVyYXRlZExvY2FsRGF0YShwcm9qZWN0OiBQcm9qZWN0KTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IHJlbW92ZWRQYXRoR3JvdXBzID0gYXdhaXQgUHJvbWlzZS5hbGwoW3JlbW92ZUdlbmVyYXRlZE1vdW50RGlycyhwcm9qZWN0KSwgcmVtb3ZlR2VuZXJhdGVkU3FsaXRlRmlsZXMocHJvamVjdCldKTtcbiAgY29uc3QgcmVtb3ZlZFBhdGhzID0gcmVtb3ZlZFBhdGhHcm91cHMuZmxhdCgpO1xuICBjb25zb2xlLmluZm8oJ1JlbW92ZWQgZ2VuZXJhdGVkIGxvY2FsIGRhdGE6JywgcmVtb3ZlZFBhdGhzLmpvaW4oJywgJykgfHwgJ25vbmUnKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gcmVtb3ZlR2VuZXJhdGVkTW91bnREaXJzKHByb2plY3Q6IFByb2plY3QpOiBQcm9taXNlPHN0cmluZ1tdPiB7XG4gIGNvbnN0IHJlbGF0aXZlUGF0aHMgPSBnZXRHZW5lcmF0ZWRNb3VudERpclBhdGhzKHByb2plY3QpO1xuICBjb25zdCByZW1vdmVkUGF0aHM6IHN0cmluZ1tdID0gW107XG4gIGZvciAoY29uc3QgcmVsYXRpdmVQYXRoIG9mIHJlbGF0aXZlUGF0aHMpIHtcbiAgICBjb25zdCB0YXJnZXRQYXRoID0gcGF0aC5qb2luKHByb2plY3QuZGlyUGF0aCwgcmVsYXRpdmVQYXRoKTtcbiAgICBpZiAoIWZzLmV4aXN0c1N5bmModGFyZ2V0UGF0aCkpIGNvbnRpbnVlO1xuXG4gICAgYXdhaXQgZnMucHJvbWlzZXMucm0odGFyZ2V0UGF0aCwgeyBmb3JjZTogdHJ1ZSwgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICAgIHJlbW92ZWRQYXRocy5wdXNoKHJlbGF0aXZlUGF0aCk7XG4gIH1cbiAgcmV0dXJuIHJlbW92ZWRQYXRocztcbn1cblxuZnVuY3Rpb24gZ2V0R2VuZXJhdGVkTW91bnREaXJQYXRocyhwcm9qZWN0OiBQcm9qZWN0KTogc3RyaW5nW10ge1xuICBjb25zdCBkZWZhdWx0UGF0aHMgPSBnZW5lcmF0ZWRTcWxpdGVEaXJOYW1lcy5tYXAoKGRpck5hbWUpID0+IHBhdGguam9pbihkaXJOYW1lLCAnbW91bnQnKSk7XG4gIGNvbnN0IGRiUGF0aCA9IGdldEFic29sdXRlRmlsZURhdGFiYXNlVXJsUGF0aChwcm9qZWN0KTtcbiAgaWYgKCFkYlBhdGgpIHJldHVybiBkZWZhdWx0UGF0aHM7XG5cbiAgY29uc3QgYWJzb2x1dGVEaXJQYXRoID0gcGF0aC5kaXJuYW1lKGRiUGF0aCk7XG4gIGlmIChwYXRoLmJhc2VuYW1lKGFic29sdXRlRGlyUGF0aCkgIT09ICdtb3VudCcgfHwgIWlzUGF0aEluc2lkZVByb2plY3QocHJvamVjdCwgYWJzb2x1dGVEaXJQYXRoKSkge1xuICAgIHJldHVybiBkZWZhdWx0UGF0aHM7XG4gIH1cbiAgY29uc3QgcmVsYXRpdmVQYXRoID0gcGF0aC5yZWxhdGl2ZShwcm9qZWN0LmRpclBhdGgsIGFic29sdXRlRGlyUGF0aCk7XG4gIGlmICghcmVsYXRpdmVQYXRoKSByZXR1cm4gZGVmYXVsdFBhdGhzO1xuXG4gIHJldHVybiBbLi4ubmV3IFNldChbLi4uZGVmYXVsdFBhdGhzLCByZWxhdGl2ZVBhdGhdKV07XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHJlbW92ZUdlbmVyYXRlZFNxbGl0ZUZpbGVzKHByb2plY3Q6IFByb2plY3QpOiBQcm9taXNlPHN0cmluZ1tdPiB7XG4gIGNvbnN0IHJlbW92ZWRQYXRocyA9IGF3YWl0IFByb21pc2UuYWxsKFtcbiAgICByZW1vdmVHZW5lcmF0ZWRTcWxpdGVGaWxlc0luRGVmYXVsdERpcnMocHJvamVjdCksXG4gICAgcmVtb3ZlRW52R2VuZXJhdGVkU3FsaXRlRmlsZXMocHJvamVjdCksXG4gIF0pO1xuICByZXR1cm4gcmVtb3ZlZFBhdGhzLmZsYXQoKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gcmVtb3ZlR2VuZXJhdGVkU3FsaXRlRmlsZXNJbkRlZmF1bHREaXJzKHByb2plY3Q6IFByb2plY3QpOiBQcm9taXNlPHN0cmluZ1tdPiB7XG4gIGNvbnN0IGRpclBhdGhzID0gYXdhaXQgZ2V0R2VuZXJhdGVkU3FsaXRlRGlyUGF0aHMocHJvamVjdCk7XG4gIGNvbnN0IHJlbW92ZWRQYXRocyA9IGF3YWl0IFByb21pc2UuYWxsKGRpclBhdGhzLm1hcCgoZGlyUGF0aCkgPT4gcmVtb3ZlR2VuZXJhdGVkU3FsaXRlRmlsZXNJbkRpcihwcm9qZWN0LCBkaXJQYXRoKSkpO1xuICByZXR1cm4gcmVtb3ZlZFBhdGhzLmZsYXQoKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gZ2V0R2VuZXJhdGVkU3FsaXRlRGlyUGF0aHMocHJvamVjdDogUHJvamVjdCk6IFByb21pc2U8c3RyaW5nW10+IHtcbiAgY29uc3QgZGlyUGF0aHMgPSBnZW5lcmF0ZWRTcWxpdGVEaXJOYW1lcy5tYXAoKGRpck5hbWUpID0+IHBhdGguam9pbihwcm9qZWN0LmRpclBhdGgsIGRpck5hbWUpKTtcbiAgY29uc3QgcmVzdWx0cyA9IGF3YWl0IFByb21pc2UuYWxsKGRpclBhdGhzLm1hcCgoZGlyUGF0aCkgPT4gaXNEaXJlY3RvcnkoZGlyUGF0aCkpKTtcbiAgcmV0dXJuIGRpclBhdGhzLmZpbHRlcigoXywgaW5kZXgpID0+IHJlc3VsdHNbaW5kZXhdKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gcmVtb3ZlRW52R2VuZXJhdGVkU3FsaXRlRmlsZXMocHJvamVjdDogUHJvamVjdCk6IFByb21pc2U8c3RyaW5nW10+IHtcbiAgY29uc3QgZGJGaWxlUGF0aHMgPSBnZXRFbnZHZW5lcmF0ZWRTcWxpdGVGaWxlUGF0aHMocHJvamVjdCk7XG4gIGNvbnN0IHJlbW92ZWRQYXRoczogc3RyaW5nW10gPSBbXTtcbiAgZm9yIChjb25zdCBkYkZpbGVQYXRoIG9mIGRiRmlsZVBhdGhzKSB7XG4gICAgZm9yIChjb25zdCB0YXJnZXRQYXRoIG9mIGdldFNxbGl0ZUZpbGVGYW1pbHlQYXRocyhkYkZpbGVQYXRoKSkge1xuICAgICAgaWYgKCEoYXdhaXQgaXNGaWxlKHRhcmdldFBhdGgpKSkgY29udGludWU7XG5cbiAgICAgIGF3YWl0IGZzLnByb21pc2VzLnJtKHRhcmdldFBhdGgsIHsgZm9yY2U6IHRydWUgfSk7XG4gICAgICByZW1vdmVkUGF0aHMucHVzaChwYXRoLnJlbGF0aXZlKHByb2plY3QuZGlyUGF0aCwgdGFyZ2V0UGF0aCkpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gcmVtb3ZlZFBhdGhzO1xufVxuXG5mdW5jdGlvbiBnZXRFbnZHZW5lcmF0ZWRTcWxpdGVGaWxlUGF0aHMocHJvamVjdDogUHJvamVjdCk6IHN0cmluZ1tdIHtcbiAgY29uc3QgZGJQYXRoID0gZ2V0RmlsZURhdGFiYXNlVXJsUGF0aChwcm9qZWN0KTtcbiAgY29uc3QgYWJzb2x1dGVEYlBhdGggPSBnZXRBYnNvbHV0ZUZpbGVEYXRhYmFzZVVybFBhdGgocHJvamVjdCk7XG4gIGlmICghZGJQYXRoIHx8ICFhYnNvbHV0ZURiUGF0aCkgcmV0dXJuIFtdO1xuXG4gIGNvbnN0IGZpbGVQYXRocyA9IHBhdGguaXNBYnNvbHV0ZShkYlBhdGgpXG4gICAgPyBbZGJQYXRoXVxuICAgIDogW2Fic29sdXRlRGJQYXRoLCAuLi5nZW5lcmF0ZWRTcWxpdGVEaXJOYW1lcy5tYXAoKGRpck5hbWUpID0+IHBhdGgucmVzb2x2ZShwcm9qZWN0LmRpclBhdGgsIGRpck5hbWUsIGRiUGF0aCkpXTtcbiAgcmV0dXJuIFsuLi5uZXcgU2V0KGZpbGVQYXRocyldLmZpbHRlcigoZmlsZVBhdGgpID0+IGlzR2VuZXJhdGVkU3FsaXRlRmlsZVBhdGhTYWZlKHByb2plY3QsIGZpbGVQYXRoKSk7XG59XG5cbmZ1bmN0aW9uIGlzR2VuZXJhdGVkU3FsaXRlRmlsZVBhdGhTYWZlKHByb2plY3Q6IFByb2plY3QsIGZpbGVQYXRoOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgcmV0dXJuIGlzUGF0aEluc2lkZVByb2plY3QocHJvamVjdCwgZmlsZVBhdGgpIHx8IGlzRG9ja2VyR2VuZXJhdGVkRGF0YUZpbGVQYXRoKHByb2plY3QsIGZpbGVQYXRoKTtcbn1cblxuZnVuY3Rpb24gaXNEb2NrZXJHZW5lcmF0ZWREYXRhRmlsZVBhdGgocHJvamVjdDogUHJvamVjdCwgZmlsZVBhdGg6IHN0cmluZyk6IGJvb2xlYW4ge1xuICBpZiAoIWlzRG9ja2VyRW5hYmxlZChwcm9qZWN0KSkgcmV0dXJuIGZhbHNlO1xuXG4gIHJldHVybiBkb2NrZXJHZW5lcmF0ZWREYXRhRGlyUGF0aHMuc29tZSgoZGlyUGF0aCkgPT4ge1xuICAgIGNvbnN0IHJlbGF0aXZlUGF0aCA9IHBhdGgucmVsYXRpdmUoZGlyUGF0aCwgZmlsZVBhdGgpO1xuICAgIHJldHVybiByZWxhdGl2ZVBhdGggIT09ICcnICYmIHJlbGF0aXZlUGF0aCAhPT0gJy4uJyAmJiAhcmVsYXRpdmVQYXRoLnN0YXJ0c1dpdGgoJy4uLycpO1xuICB9KTtcbn1cblxuZnVuY3Rpb24gZ2V0U3FsaXRlRmlsZUZhbWlseVBhdGhzKGRiRmlsZVBhdGg6IHN0cmluZyk6IHN0cmluZ1tdIHtcbiAgcmV0dXJuIFtcbiAgICBkYkZpbGVQYXRoLFxuICAgIGAke2RiRmlsZVBhdGh9LWpvdXJuYWxgLFxuICAgIGAke2RiRmlsZVBhdGh9LXNobWAsXG4gICAgYCR7ZGJGaWxlUGF0aH0td2FsYCxcbiAgICBgJHtkYkZpbGVQYXRofS5qb3VybmFsYCxcbiAgICBgJHtkYkZpbGVQYXRofS5zaG1gLFxuICAgIGAke2RiRmlsZVBhdGh9LndhbGAsXG4gIF07XG59XG5cbmZ1bmN0aW9uIGlzUGF0aEluc2lkZVByb2plY3QocHJvamVjdDogUHJvamVjdCwgdGFyZ2V0UGF0aDogc3RyaW5nKTogYm9vbGVhbiB7XG4gIGNvbnN0IHJlbGF0aXZlUGF0aCA9IHBhdGgucmVsYXRpdmUocHJvamVjdC5kaXJQYXRoLCB0YXJnZXRQYXRoKTtcbiAgLy8gYHN0YXJ0c1dpdGgoJy4uJylgIHdvdWxkIHJlamVjdCBwcm9qZWN0LWxvY2FsIG5hbWVzIHN1Y2ggYXMgYC4uY2FjaGVgLlxuICByZXR1cm4gcmVsYXRpdmVQYXRoID09PSAnJyB8fCAocmVsYXRpdmVQYXRoICE9PSAnLi4nICYmICFyZWxhdGl2ZVBhdGguc3RhcnRzV2l0aChgLi4ke3BhdGguc2VwfWApKTtcbn1cblxuZnVuY3Rpb24gaXNEb2NrZXJFbmFibGVkKHByb2plY3Q6IFByb2plY3QpOiBib29sZWFuIHtcbiAgcmV0dXJuICEhcHJvamVjdC5lbnYuV0JfRE9DS0VSICYmIHByb2plY3QuZW52LldCX0RPQ0tFUiAhPT0gJzAnICYmIHByb2plY3QuZW52LldCX0RPQ0tFUiAhPT0gJ2ZhbHNlJztcbn1cblxuYXN5bmMgZnVuY3Rpb24gaXNGaWxlKGZpbGVQYXRoOiBzdHJpbmcpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgdHJ5IHtcbiAgICBjb25zdCBzdGF0ID0gYXdhaXQgZnMucHJvbWlzZXMuc3RhdChmaWxlUGF0aCk7XG4gICAgcmV0dXJuIHN0YXQuaXNGaWxlKCk7XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxufVxuXG5hc3luYyBmdW5jdGlvbiBpc0RpcmVjdG9yeShkaXJQYXRoOiBzdHJpbmcpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgdHJ5IHtcbiAgICBjb25zdCBzdGF0ID0gYXdhaXQgZnMucHJvbWlzZXMuc3RhdChkaXJQYXRoKTtcbiAgICByZXR1cm4gc3RhdC5pc0RpcmVjdG9yeSgpO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn1cblxuYXN5bmMgZnVuY3Rpb24gcmVtb3ZlR2VuZXJhdGVkU3FsaXRlRmlsZXNJbkRpcihwcm9qZWN0OiBQcm9qZWN0LCBkaXJQYXRoOiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZ1tdPiB7XG4gIGNvbnN0IGRpcmVudHMgPSBhd2FpdCBmcy5wcm9taXNlcy5yZWFkZGlyKGRpclBhdGgsIHsgd2l0aEZpbGVUeXBlczogdHJ1ZSB9KTtcbiAgY29uc3Qgc3FsaXRlRmlsZU5hbWVzID0gZGlyZW50c1xuICAgIC5maWx0ZXIoKGRpcmVudCkgPT4gZGlyZW50LmlzRmlsZSgpICYmIHNxbGl0ZUZpbGVQYXR0ZXJuLnRlc3QoZGlyZW50Lm5hbWUpKVxuICAgIC5tYXAoKGRpcmVudCkgPT4gZGlyZW50Lm5hbWUpO1xuICBhd2FpdCBQcm9taXNlLmFsbChzcWxpdGVGaWxlTmFtZXMubWFwKChmaWxlTmFtZSkgPT4gZnMucHJvbWlzZXMucm0ocGF0aC5qb2luKGRpclBhdGgsIGZpbGVOYW1lKSwgeyBmb3JjZTogdHJ1ZSB9KSkpO1xuXG4gIGNvbnN0IHJlbGF0aXZlRGlyUGF0aCA9IHBhdGgucmVsYXRpdmUocHJvamVjdC5kaXJQYXRoLCBkaXJQYXRoKTtcbiAgcmV0dXJuIHNxbGl0ZUZpbGVOYW1lcy5tYXAoKGZpbGVOYW1lKSA9PiBwYXRoLmpvaW4ocmVsYXRpdmVEaXJQYXRoLCBmaWxlTmFtZSkpO1xufVxuXG5mdW5jdGlvbiBydW5Eb2NrZXJDbGVhbnVwU2NyaXB0KHByb2plY3Q6IFByb2plY3QpOiB2b2lkIHtcbiAgaWYgKCFpc0RvY2tlckVuYWJsZWQocHJvamVjdCkpIHJldHVybjtcblxuICBjb25zdCBzY3JpcHRQYXRoID0gcGF0aC5qb2luKHByb2plY3QuZGlyUGF0aCwgJ2Jhc2gnLCAnY2xlYW51cC5zaCcpO1xuICBpZiAoIWZzLmV4aXN0c1N5bmMoc2NyaXB0UGF0aCkpIHJldHVybjtcblxuICBjb25zdCByZXN1bHQgPSBjaGlsZF9wcm9jZXNzLnNwYXduU3luYygnYmFzaCcsIFtzY3JpcHRQYXRoLCAnLS1rZWVwLXNjcmlwdHMnXSwge1xuICAgIGN3ZDogcHJvamVjdC5kaXJQYXRoLFxuICAgIHN0ZGlvOiAnaW5oZXJpdCcsXG4gIH0pO1xuICBpZiAocmVzdWx0LnN0YXR1cyAhPT0gMCkge1xuICAgIHRocm93IG5ldyBFcnJvcihgRmFpbGVkIHRvIHJ1biAke3BhdGgucmVsYXRpdmUocHJvamVjdC5kaXJQYXRoLCBzY3JpcHRQYXRoKX1gKTtcbiAgfVxufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuXG5pbXBvcnQgdHlwZSB7IEVudlJlYWRlck9wdGlvbnMgfSBmcm9tICdAd2lsbGJvb3N0ZXIvc2hhcmVkLWxpYi1ub2RlL3NyYyc7XG5pbXBvcnQgY2hhbGsgZnJvbSAnY2hhbGsnO1xuaW1wb3J0IHR5cGUgeyBDb21tYW5kTW9kdWxlLCBJbmZlcnJlZE9wdGlvblR5cGVzIH0gZnJvbSAneWFyZ3MnO1xuXG5pbXBvcnQgdHlwZSB7IERhdGFiYXNlT3JtLCBQcm9qZWN0IH0gZnJvbSAnLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQgeyBmaW5kRGVzY2VuZGFudFByb2plY3RzLCBnZXRBYnNvbHV0ZUZpbGVEYXRhYmFzZVVybFBhdGgsIGlzUHJvamVjdEVudmlyb25tZW50IH0gZnJvbSAnLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQgeyBidWlsZERyaXp6bGVLaXRDb21tYW5kLCBkcml6emxlU2NyaXB0cyB9IGZyb20gJy4uL3NjcmlwdHMvZHJpenpsZVNjcmlwdHMuanMnO1xuaW1wb3J0IHsgcHJpc21hU2NyaXB0cyB9IGZyb20gJy4uL3NjcmlwdHMvcHJpc21hU2NyaXB0cy5qcyc7XG5pbXBvcnQgeyBydW5XaXRoU3Bhd24gfSBmcm9tICcuLi9zY3JpcHRzL3J1bi5qcyc7XG5pbXBvcnQgeyBzaGFyZWRPcHRpb25zQnVpbGRlciB9IGZyb20gJy4uL3NoYXJlZE9wdGlvbnNCdWlsZGVyLmpzJztcbmltcG9ydCB7IGJ1aWxkU2hlbGxDb21tYW5kIH0gZnJvbSAnLi4vdXRpbHMvc2hlbGwuanMnO1xuaW1wb3J0IHsgd3JhcFdpdGhMb2NhbEQxRGF0YWJhc2VVcmwgfSBmcm9tICcuLi91dGlscy93cmFuZ2xlci5qcyc7XG5cbmltcG9ydCB7IHByZXBhcmVGb3JSdW5uaW5nQ29tbWFuZCB9IGZyb20gJy4vY29tbWFuZFV0aWxzLmpzJztcblxuY29uc3QgYnVpbGRlciA9IHt9IGFzIGNvbnN0O1xuXG5leHBvcnQgY29uc3QgcHJpc21hQ29tbWFuZDogQ29tbWFuZE1vZHVsZSA9IHtcbiAgY29tbWFuZDogJ3ByaXNtYScsXG4gIGFsaWFzZXM6IFsnZGInXSxcbiAgZGVzY3JpYmU6XG4gICAgXCJSdW4gZGF0YWJhc2UgY29tbWFuZHMuIFVzZSAnLS0nIHRvIHN0b3Agd2Igb3B0aW9uIHBhcnNpbmcgYW5kIGZvcndhcmQgdGhlIHJlbWFpbmluZyBhcmd1bWVudHMgdG8gUHJpc21hLiBEcml6emxlIHByb2plY3RzIHVzZSBkcml6emxlLWtpdC4gRXhhbXBsZTogd2IgcHJpc21hIG1pZ3JhdGUtZGV2IC0tIC0tbmFtZSBpbml0XCIsXG4gIGJ1aWxkZXI6ICh5YXJncykgPT4ge1xuICAgIHJldHVybiB5YXJnc1xuICAgICAgLnBhcnNlckNvbmZpZ3VyYXRpb24oeyAncG9wdWxhdGUtLSc6IHRydWUgfSlcbiAgICAgIC5jb21tYW5kKGNsZWFuVXBMaXRlc3RyZWFtQ29tbWFuZClcbiAgICAgIC5jb21tYW5kKGNyZWF0ZUxpdGVzdHJlYW1Db25maWdDb21tYW5kKVxuICAgICAgLmNvbW1hbmQoZGVwbG95Q29tbWFuZClcbiAgICAgIC5jb21tYW5kKGRlcGxveUZvcmNlQ29tbWFuZClcbiAgICAgIC5jb21tYW5kKGdlbmVyYXRlQ29tbWFuZClcbiAgICAgIC5jb21tYW5kKGxpc3RCYWNrdXBzQ29tbWFuZClcbiAgICAgIC5jb21tYW5kKG1pZ3JhdGVDb21tYW5kKVxuICAgICAgLmNvbW1hbmQobWlncmF0ZURldkNvbW1hbmQpXG4gICAgICAuY29tbWFuZChyZXNldENvbW1hbmQpXG4gICAgICAuY29tbWFuZChyZXN0b3JlQ29tbWFuZClcbiAgICAgIC5jb21tYW5kKHNlZWRDb21tYW5kKVxuICAgICAgLmNvbW1hbmQoc3R1ZGlvQ29tbWFuZClcbiAgICAgIC5jb21tYW5kKGRlZmF1bHRDb21tYW5kKVxuICAgICAgLmRlbWFuZENvbW1hbmQoKVxuICAgICAgLnN0cmljdChmYWxzZSk7IC8vIEFsbG93IHVua25vd24gb3B0aW9ucyB0byBiZSBwYXNzZWQgdGhyb3VnaFxuICB9LFxuICBoYW5kbGVyKCkge1xuICAgIC8vIERvIG5vdGhpbmdcbiAgfSxcbn07XG5cbmNvbnN0IGNsZWFuVXBMaXRlc3RyZWFtQ29tbWFuZDogQ29tbWFuZE1vZHVsZTx1bmtub3duLCBJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBidWlsZGVyPj4gPSB7XG4gIGNvbW1hbmQ6ICdjbGVhbnVwLWxpdGVzdHJlYW0nLFxuICBkZXNjcmliZTogJ0NsZWFuIHVwIHRlbXBvcmFsIExpdGVzdHJlYW0gZmlsZXMnLFxuICBidWlsZGVyLFxuICBhc3luYyBoYW5kbGVyKGFyZ3YpIHtcbiAgICBjb25zdCBhbGxQcm9qZWN0cyA9IGF3YWl0IGZpbmREYXRhYmFzZU9ybVByb2plY3RzKGFyZ3YpO1xuICAgIGZvciAoY29uc3QgeyBvcm0sIHByb2plY3QgfSBvZiBwcmVwYXJlRm9yUnVubmluZ0RhdGFiYXNlT3JtQ29tbWFuZCgnZGIgY2xlYW51cC1saXRlc3RyZWFtJywgYWxsUHJvamVjdHMpKSB7XG4gICAgICBhd2FpdCBydW5XaXRoU3Bhd24oZ2V0RGF0YWJhc2VPcm1TY3JpcHRzKG9ybSkuY2xlYW5VcExpdGVzdHJlYW0ocHJvamVjdCksIHByb2plY3QsIGFyZ3YpO1xuICAgIH1cbiAgfSxcbn07XG5cbmNvbnN0IGNyZWF0ZUxpdGVzdHJlYW1Db25maWdCdWlsZGVyID0ge1xuICAuLi5idWlsZGVyLFxuICBvdXRwdXQ6IHtcbiAgICBkZXNjcmlwdGlvbjogJ091dHB1dCBwYXRoIG9mIHRoZSBMaXRlc3RyZWFtIGNvbmZpZ3VyYXRpb24gZmlsZS4nLFxuICAgIHR5cGU6ICdzdHJpbmcnLFxuICAgIGRlZmF1bHQ6ICcvZXRjL2xpdGVzdHJlYW0ueW1sJyxcbiAgfSxcbn0gYXMgY29uc3Q7XG5cbmNvbnN0IGNyZWF0ZUxpdGVzdHJlYW1Db25maWdDb21tYW5kOiBDb21tYW5kTW9kdWxlPFxuICB1bmtub3duLFxuICBJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBjcmVhdGVMaXRlc3RyZWFtQ29uZmlnQnVpbGRlcj5cbj4gPSB7XG4gIGNvbW1hbmQ6ICdjcmVhdGUtbGl0ZXN0cmVhbS1jb25maWcnLFxuICBkZXNjcmliZTogJ0NyZWF0ZSBMaXRlc3RyZWFtIGNvbmZpZ3VyYXRpb24gZmlsZScsXG4gIGJ1aWxkZXI6IGNyZWF0ZUxpdGVzdHJlYW1Db25maWdCdWlsZGVyLFxuICBhc3luYyBoYW5kbGVyKGFyZ3YpIHtcbiAgICBjb25zdCBhbGxQcm9qZWN0cyA9IGF3YWl0IGZpbmREYXRhYmFzZU9ybVByb2plY3RzKGFyZ3YpO1xuICAgIGlmIChhbGxQcm9qZWN0cy5sZW5ndGggPiAxKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICdDcmVhdGluZyBMaXRlc3RyZWFtIGNvbmZpZ3VyYXRpb24gZm9yIG11bHRpcGxlIHByb2plY3RzIGF0IG9uY2UgaXMgbm90IHN1cHBvcnRlZCBiZWNhdXNlIHRoZXkgd291bGQgb3ZlcndyaXRlIGVhY2ggb3RoZXIuJ1xuICAgICAgKTtcbiAgICB9XG4gICAgZm9yIChjb25zdCB7IG9ybSwgcHJvamVjdCB9IG9mIHByZXBhcmVGb3JSdW5uaW5nRGF0YWJhc2VPcm1Db21tYW5kKCdkYiBjcmVhdGUtbGl0ZXN0cmVhbS1jb25maWcnLCBhbGxQcm9qZWN0cykpIHtcbiAgICAgIGNyZWF0ZUxpdGVzdHJlYW1Db25maWcocHJvamVjdCwgb3JtLCBhcmd2Lm91dHB1dCk7XG4gICAgfVxuICB9LFxufTtcblxuY29uc3QgZGVwbG95Q29tbWFuZDogQ29tbWFuZE1vZHVsZTx1bmtub3duLCBJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBidWlsZGVyPj4gPSB7XG4gIGNvbW1hbmQ6ICdkZXBsb3knLFxuICBkZXNjcmliZTogJ0FwcGx5IG1pZ3JhdGlvbiB0byBEQiB3aXRob3V0IGluaXRpYWxpemluZyBpdCcsXG4gIGJ1aWxkZXIsXG4gIGFzeW5jIGhhbmRsZXIoYXJndikge1xuICAgIGNvbnN0IGFsbFByb2plY3RzID0gYXdhaXQgZmluZERhdGFiYXNlT3JtUHJvamVjdHMoYXJndik7XG4gICAgY29uc3QgdW5rbm93bk9wdGlvbnMgPSBleHRyYWN0VW5rbm93bk9wdGlvbnMoYXJndik7XG4gICAgZm9yIChjb25zdCB7IG9ybSwgcHJvamVjdCB9IG9mIHByZXBhcmVGb3JSdW5uaW5nRGF0YWJhc2VPcm1Db21tYW5kKCdkYiBkZXBsb3knLCBhbGxQcm9qZWN0cykpIHtcbiAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bihcbiAgICAgICAgd2l0aExvY2FsRDFJZk5lZWRlZChvcm0sIHByb2plY3QsIGdldERhdGFiYXNlT3JtU2NyaXB0cyhvcm0pLmRlcGxveShwcm9qZWN0LCB1bmtub3duT3B0aW9ucykpLFxuICAgICAgICBwcm9qZWN0LFxuICAgICAgICBhcmd2XG4gICAgICApO1xuICAgIH1cbiAgfSxcbn07XG5cbmNvbnN0IGRlcGxveUZvcmNlQ29tbWFuZDogQ29tbWFuZE1vZHVsZTx1bmtub3duLCBJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBidWlsZGVyPj4gPSB7XG4gIGNvbW1hbmQ6ICdkZXBsb3ktZm9yY2UnLFxuICBkZXNjcmliZTogXCJGb3JjZSB0byBhcHBseSBtaWdyYXRpb24gdG8gREIgdXRpbGl6aW5nIExpdGVzdHJlYW0ncyBiYWNrdXAgd2l0aG91dCBpbml0aWFsaXppbmcgaXRcIixcbiAgYnVpbGRlcixcbiAgYXN5bmMgaGFuZGxlcihhcmd2KSB7XG4gICAgY29uc3QgYWxsUHJvamVjdHMgPSBhd2FpdCBmaW5kRGF0YWJhc2VPcm1Qcm9qZWN0cyhhcmd2KTtcbiAgICBmb3IgKGNvbnN0IHsgb3JtLCBwcm9qZWN0IH0gb2YgcHJlcGFyZUZvclJ1bm5pbmdEYXRhYmFzZU9ybUNvbW1hbmQoJ2RiIGRlcGxveS1mb3JjZScsIGFsbFByb2plY3RzKSkge1xuICAgICAgYXdhaXQgcnVuV2l0aFNwYXduKGdldERhdGFiYXNlT3JtU2NyaXB0cyhvcm0pLmRlcGxveUZvcmNlKHByb2plY3QpLCBwcm9qZWN0LCBhcmd2KTtcbiAgICB9XG4gIH0sXG59O1xuXG5jb25zdCBnZW5lcmF0ZUNvbW1hbmQ6IENvbW1hbmRNb2R1bGU8dW5rbm93biwgSW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgYnVpbGRlcj4+ID0ge1xuICBjb21tYW5kOiAnZ2VuZXJhdGUnLFxuICBkZXNjcmliZTogJ0dlbmVyYXRlIE9STSBjbGllbnQgY29kZScsXG4gIGJ1aWxkZXIsXG4gIGFzeW5jIGhhbmRsZXIoYXJndikge1xuICAgIGNvbnN0IGFsbFByb2plY3RzID0gYXdhaXQgZmluZERhdGFiYXNlT3JtUHJvamVjdHMoYXJndik7XG4gICAgY29uc3QgdW5rbm93bk9wdGlvbnMgPSBleHRyYWN0VW5rbm93bk9wdGlvbnMoYXJndik7XG4gICAgZm9yIChjb25zdCB7IG9ybSwgcHJvamVjdCB9IG9mIHByZXBhcmVGb3JSdW5uaW5nRGF0YWJhc2VPcm1Db21tYW5kKCdkYiBnZW5lcmF0ZScsIGFsbFByb2plY3RzKSkge1xuICAgICAgYXdhaXQgcnVuV2l0aFNwYXduKGdldERhdGFiYXNlT3JtU2NyaXB0cyhvcm0pLmdlbmVyYXRlKHByb2plY3QsIHVua25vd25PcHRpb25zKSwgcHJvamVjdCwgYXJndik7XG4gICAgfVxuICB9LFxufTtcblxuY29uc3QgbGl0ZXN0cmVhbUNvbmZpZ0J1aWxkZXIgPSB7XG4gIC4uLmJ1aWxkZXIsXG4gIGNvbmZpZzoge1xuICAgIGRlc2NyaXB0aW9uOiAnUGF0aCBvZiB0aGUgTGl0ZXN0cmVhbSBjb25maWd1cmF0aW9uIGZpbGUuJyxcbiAgICB0eXBlOiAnc3RyaW5nJyxcbiAgfSxcbn0gYXMgY29uc3Q7XG5cbmNvbnN0IGxpc3RCYWNrdXBzQ29tbWFuZDogQ29tbWFuZE1vZHVsZTx1bmtub3duLCBJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBsaXRlc3RyZWFtQ29uZmlnQnVpbGRlcj4+ID0ge1xuICBjb21tYW5kOiAnbGlzdC1iYWNrdXBzJyxcbiAgZGVzY3JpYmU6ICdMaXN0IExpdGVzdHJlYW0gYmFja3VwcycsXG4gIGJ1aWxkZXI6IGxpdGVzdHJlYW1Db25maWdCdWlsZGVyLFxuICBhc3luYyBoYW5kbGVyKGFyZ3YpIHtcbiAgICBjb25zdCBhbGxQcm9qZWN0cyA9IGF3YWl0IGZpbmREYXRhYmFzZU9ybVByb2plY3RzKGFyZ3YpO1xuICAgIGZvciAoY29uc3QgeyBvcm0sIHByb2plY3QgfSBvZiBwcmVwYXJlRm9yUnVubmluZ0RhdGFiYXNlT3JtQ29tbWFuZCgnZGIgbGlzdC1iYWNrdXBzJywgYWxsUHJvamVjdHMpKSB7XG4gICAgICBhd2FpdCBydW5XaXRoU3Bhd24oZ2V0RGF0YWJhc2VPcm1TY3JpcHRzKG9ybSkubGlzdEJhY2t1cHMocHJvamVjdCwgYXJndi5jb25maWcpLCBwcm9qZWN0LCBhcmd2KTtcbiAgICB9XG4gIH0sXG59O1xuXG5jb25zdCBtaWdyYXRlQnVpbGRlciA9IHtcbiAgLi4uYnVpbGRlcixcbiAgJ2NoZWNrLWlkZW1wb3RlbmN5Jzoge1xuICAgIGRlc2NyaXB0aW9uOiAnUnVuIHRoZSBtaWdyYXRpb24gY29tbWFuZCB0d2ljZSB0byBjb25maXJtIGl0IGlzIGlkZW1wb3RlbnQuJyxcbiAgICB0eXBlOiAnYm9vbGVhbicsXG4gIH0sXG59IGFzIGNvbnN0O1xuXG5jb25zdCBtaWdyYXRlQ29tbWFuZDogQ29tbWFuZE1vZHVsZTx1bmtub3duLCBJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBtaWdyYXRlQnVpbGRlcj4+ID0ge1xuICBjb21tYW5kOiAnbWlncmF0ZScsXG4gIGRlc2NyaWJlOiAnQXBwbHkgbWlncmF0aW9uIHRvIERCIHdpdGggaW5pdGlhbGl6aW5nIGl0JyxcbiAgYnVpbGRlcjogbWlncmF0ZUJ1aWxkZXIsXG4gIGFzeW5jIGhhbmRsZXIoYXJndikge1xuICAgIGNvbnN0IGFsbFByb2plY3RzID0gYXdhaXQgZmluZERhdGFiYXNlT3JtUHJvamVjdHMoYXJndik7XG4gICAgY29uc3QgdW5rbm93bk9wdGlvbnMgPSBleHRyYWN0VW5rbm93bk9wdGlvbnMoYXJndiwgWydjaGVjay1pZGVtcG90ZW5jeSddKTtcbiAgICBmb3IgKGNvbnN0IHsgb3JtLCBwcm9qZWN0IH0gb2YgcHJlcGFyZUZvclJ1bm5pbmdEYXRhYmFzZU9ybUNvbW1hbmQoJ2RiIG1pZ3JhdGUnLCBhbGxQcm9qZWN0cykpIHtcbiAgICAgIGNvbnN0IG9ybVNjcmlwdHMgPSBnZXREYXRhYmFzZU9ybVNjcmlwdHMob3JtKTtcbiAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bih3aXRoTG9jYWxEMUlmTmVlZGVkKG9ybSwgcHJvamVjdCwgb3JtU2NyaXB0cy5taWdyYXRlKHByb2plY3QsIHVua25vd25PcHRpb25zKSksIHByb2plY3QsIGFyZ3YpO1xuICAgICAgaWYgKHNob3VsZENoZWNrSWRlbXBvdGVuY3kocHJvamVjdCwgYXJndi5jaGVja0lkZW1wb3RlbmN5KSkge1xuICAgICAgICBpZiAoaXNQcm9kdWN0aW9uRW52aXJvbm1lbnQocHJvamVjdCkpIHtcbiAgICAgICAgICBjb25zb2xlLmluZm8oY2hhbGsueWVsbG93KGBTa2lwcGluZyBpZGVtcG90ZW5jeSBjaGVjayBmb3IgJHtwcm9qZWN0Lm5hbWV9IGluIHByb2R1Y3Rpb24gZW52aXJvbm1lbnQuYCkpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bihcbiAgICAgICAgICAgIHdpdGhMb2NhbEQxSWZOZWVkZWQob3JtLCBwcm9qZWN0LCBvcm1TY3JpcHRzLmRlcGxveShwcm9qZWN0LCB1bmtub3duT3B0aW9ucykpLFxuICAgICAgICAgICAgcHJvamVjdCxcbiAgICAgICAgICAgIGFyZ3ZcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9LFxufTtcblxuZnVuY3Rpb24gc2hvdWxkQ2hlY2tJZGVtcG90ZW5jeShwcm9qZWN0OiBQcm9qZWN0LCBjaGVja0lkZW1wb3RlbmN5OiBib29sZWFuIHwgdW5kZWZpbmVkKTogYm9vbGVhbiB7XG4gIHJldHVybiBjaGVja0lkZW1wb3RlbmN5ID8/IGlzRG9ja2VyRW5hYmxlZChwcm9qZWN0KTtcbn1cblxuZnVuY3Rpb24gaXNEb2NrZXJFbmFibGVkKHByb2plY3Q6IFByb2plY3QpOiBib29sZWFuIHtcbiAgcmV0dXJuICEhcHJvamVjdC5lbnYuV0JfRE9DS0VSICYmIHByb2plY3QuZW52LldCX0RPQ0tFUiAhPT0gJzAnICYmIHByb2plY3QuZW52LldCX0RPQ0tFUiAhPT0gJ2ZhbHNlJztcbn1cblxuZnVuY3Rpb24gaXNQcm9kdWN0aW9uRW52aXJvbm1lbnQocHJvamVjdDogUHJvamVjdCk6IGJvb2xlYW4ge1xuICByZXR1cm4gaXNQcm9qZWN0RW52aXJvbm1lbnQocHJvamVjdCwgJ3Byb2R1Y3Rpb24nKTtcbn1cblxuY29uc3QgbWlncmF0ZURldkNvbW1hbmQ6IENvbW1hbmRNb2R1bGU8dW5rbm93biwgSW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgYnVpbGRlcj4+ID0ge1xuICBjb21tYW5kOiAnbWlncmF0ZS1kZXYnLFxuICBkZXNjcmliZTogJ0NyZWF0ZSBhIG1pZ3JhdGlvbiBmaWxlJyxcbiAgYnVpbGRlcixcbiAgYXN5bmMgaGFuZGxlcihhcmd2KSB7XG4gICAgY29uc3QgYWxsUHJvamVjdHMgPSBhd2FpdCBmaW5kRGF0YWJhc2VPcm1Qcm9qZWN0cyhhcmd2KTtcbiAgICBjb25zdCB1bmtub3duT3B0aW9ucyA9IGV4dHJhY3RVbmtub3duT3B0aW9ucyhhcmd2KTtcbiAgICBmb3IgKGNvbnN0IHsgb3JtLCBwcm9qZWN0IH0gb2YgcHJlcGFyZUZvclJ1bm5pbmdEYXRhYmFzZU9ybUNvbW1hbmQoJ2RiIG1pZ3JhdGUtZGV2JywgYWxsUHJvamVjdHMpKSB7XG4gICAgICBhd2FpdCBydW5XaXRoU3Bhd24oZ2V0RGF0YWJhc2VPcm1TY3JpcHRzKG9ybSkubWlncmF0ZURldihwcm9qZWN0LCB1bmtub3duT3B0aW9ucyksIHByb2plY3QsIGFyZ3YpO1xuICAgIH1cbiAgfSxcbn07XG5cbmNvbnN0IHJlc2V0Q29tbWFuZDogQ29tbWFuZE1vZHVsZTx1bmtub3duLCBJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBidWlsZGVyPj4gPSB7XG4gIGNvbW1hbmQ6ICdyZXNldCcsXG4gIGRlc2NyaWJlOiAnUmVzZXQgREInLFxuICBidWlsZGVyLFxuICBhc3luYyBoYW5kbGVyKGFyZ3YpIHtcbiAgICBjb25zdCBhbGxQcm9qZWN0cyA9IGF3YWl0IGZpbmREYXRhYmFzZU9ybVByb2plY3RzKGFyZ3YpO1xuICAgIGNvbnN0IHVua25vd25PcHRpb25zID0gZXh0cmFjdFVua25vd25PcHRpb25zKGFyZ3YpO1xuICAgIGZvciAoY29uc3QgeyBvcm0sIHByb2plY3QgfSBvZiBwcmVwYXJlRm9yUnVubmluZ0RhdGFiYXNlT3JtQ29tbWFuZCgnZGIgcmVzZXQnLCBhbGxQcm9qZWN0cykpIHtcbiAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bihcbiAgICAgICAgd2l0aExvY2FsRDFJZk5lZWRlZChvcm0sIHByb2plY3QsIGdldERhdGFiYXNlT3JtU2NyaXB0cyhvcm0pLnJlc2V0KHByb2plY3QsIHVua25vd25PcHRpb25zKSksXG4gICAgICAgIHByb2plY3QsXG4gICAgICAgIGFyZ3ZcbiAgICAgICk7XG4gICAgfVxuICAgIC8vIEZvcmNlIHRvIHJlc2V0IHRlc3QgZGF0YWJhc2VcbiAgICBpZiAocHJvY2Vzcy5lbnYuV0JfRU5WICE9PSAndGVzdCcpIHtcbiAgICAgIHByb2Nlc3MuZW52LldCX0VOViA9ICd0ZXN0JztcbiAgICAgIGZvciAoY29uc3QgeyBvcm0sIHByb2plY3QgfSBvZiBwcmVwYXJlRm9yUnVubmluZ0RhdGFiYXNlT3JtQ29tbWFuZChcbiAgICAgICAgJ1dCX0VOVj10ZXN0IGRiIHJlc2V0JyxcbiAgICAgICAgYXdhaXQgZmluZERhdGFiYXNlT3JtUHJvamVjdHMoYXJndilcbiAgICAgICkpIHtcbiAgICAgICAgYXdhaXQgcnVuV2l0aFNwYXduKFxuICAgICAgICAgIHdpdGhMb2NhbEQxSWZOZWVkZWQob3JtLCBwcm9qZWN0LCBnZXREYXRhYmFzZU9ybVNjcmlwdHMob3JtKS5yZXNldChwcm9qZWN0LCB1bmtub3duT3B0aW9ucykpLFxuICAgICAgICAgIHByb2plY3QsXG4gICAgICAgICAgYXJndlxuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cbiAgfSxcbn07XG5cbmNvbnN0IHJlc3RvcmVCdWlsZGVyID0ge1xuICAuLi5saXRlc3RyZWFtQ29uZmlnQnVpbGRlcixcbiAgb3V0cHV0OiB7XG4gICAgZGVzY3JpcHRpb246ICdPdXRwdXQgcGF0aCBvZiB0aGUgcmVzdG9yZWQgZGF0YWJhc2UuIERlZmF1bHRzIHRvIFwiPGRifGRyaXp6bGV8cHJpc21hPi9yZXN0b3JlZC5zcWxpdGUzXCIuJyxcbiAgICB0eXBlOiAnc3RyaW5nJyxcbiAgfSxcbn0gYXMgY29uc3Q7XG5cbmNvbnN0IHJlc3RvcmVDb21tYW5kOiBDb21tYW5kTW9kdWxlPHVua25vd24sIEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIHJlc3RvcmVCdWlsZGVyPj4gPSB7XG4gIGNvbW1hbmQ6ICdyZXN0b3JlJyxcbiAgZGVzY3JpYmU6IFwiUmVzdG9yZSBEQiBmcm9tIExpdGVzdHJlYW0ncyBiYWNrdXBcIixcbiAgYnVpbGRlcjogcmVzdG9yZUJ1aWxkZXIsXG4gIGFzeW5jIGhhbmRsZXIoYXJndikge1xuICAgIGNvbnN0IGFsbFByb2plY3RzID0gYXdhaXQgZmluZERhdGFiYXNlT3JtUHJvamVjdHMoYXJndik7XG4gICAgZm9yIChjb25zdCB7IG9ybSwgcHJvamVjdCB9IG9mIHByZXBhcmVGb3JSdW5uaW5nRGF0YWJhc2VPcm1Db21tYW5kKCdkYiByZXN0b3JlJywgYWxsUHJvamVjdHMpKSB7XG4gICAgICBjb25zdCBvdXRwdXQgPSBhcmd2Lm91dHB1dCA/PyBnZXREZWZhdWx0UmVzdG9yZU91dHB1dChwcm9qZWN0LCBvcm0pO1xuICAgICAgYXdhaXQgcnVuV2l0aFNwYXduKGdldERhdGFiYXNlT3JtU2NyaXB0cyhvcm0pLnJlc3RvcmUocHJvamVjdCwgb3V0cHV0LCBhcmd2LmNvbmZpZyksIHByb2plY3QsIGFyZ3YpO1xuICAgIH1cbiAgfSxcbn07XG5cbmNvbnN0IHNlZWRCdWlsZGVyID0ge1xuICAuLi5idWlsZGVyLFxuICBmaWxlOiB7XG4gICAgYWxpYXM6ICdmJyxcbiAgICBkZXNjcmlwdGlvbjogJ1BhdGggb2YgdGhlIHNlZWQgc2NyaXB0LicsXG4gICAgdHlwZTogJ3N0cmluZycsXG4gIH0sXG59IGFzIGNvbnN0O1xuXG5jb25zdCBzZWVkQ29tbWFuZDogQ29tbWFuZE1vZHVsZTx1bmtub3duLCBJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBzZWVkQnVpbGRlcj4+ID0ge1xuICBjb21tYW5kOiAnc2VlZCcsXG4gIGRlc2NyaWJlOiAnUG9wdWxhdGUgREIgd2l0aCBzZWVkIGRhdGEnLFxuICBidWlsZGVyOiBzZWVkQnVpbGRlcixcbiAgYXN5bmMgaGFuZGxlcihhcmd2KSB7XG4gICAgY29uc3QgYWxsUHJvamVjdHMgPSBhd2FpdCBmaW5kRGF0YWJhc2VPcm1Qcm9qZWN0cyhhcmd2KTtcbiAgICBmb3IgKGNvbnN0IHsgb3JtLCBwcm9qZWN0IH0gb2YgcHJlcGFyZUZvclJ1bm5pbmdEYXRhYmFzZU9ybUNvbW1hbmQoJ2RiIHNlZWQnLCBhbGxQcm9qZWN0cykpIHtcbiAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bihcbiAgICAgICAgd2l0aExvY2FsRDFJZk5lZWRlZChvcm0sIHByb2plY3QsIGdldERhdGFiYXNlT3JtU2NyaXB0cyhvcm0pLnNlZWQocHJvamVjdCwgYXJndi5maWxlKSksXG4gICAgICAgIHByb2plY3QsXG4gICAgICAgIGFyZ3ZcbiAgICAgICk7XG4gICAgfVxuICB9LFxufTtcblxuY29uc3Qgc3R1ZGlvQnVpbGRlciA9IHtcbiAgLi4uYnVpbGRlcixcbiAgJ2RiLXVybC1vci1wYXRoJzoge1xuICAgIGRlc2NyaXB0aW9uOiAnVVJMIG9yIHBhdGggdG8gdGhlIGRhdGFiYXNlJyxcbiAgICB0eXBlOiAnc3RyaW5nJyxcbiAgfSxcbiAgcmVzdG9yZWQ6IHtcbiAgICBkZXNjcmlwdGlvbjogJ1doZXRoZXIgdG8gb3BlbiB0aGUgZGVmYXVsdCByZXN0b3JlZCBkYXRhYmFzZSAoPGRifHByaXNtYT4vcmVzdG9yZWQuc3FsaXRlMykuJyxcbiAgICB0eXBlOiAnYm9vbGVhbicsXG4gIH0sXG59IGFzIGNvbnN0O1xuXG5jb25zdCBzdHVkaW9Db21tYW5kOiBDb21tYW5kTW9kdWxlPHVua25vd24sIEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIHN0dWRpb0J1aWxkZXI+PiA9IHtcbiAgY29tbWFuZDogJ3N0dWRpbyBbZGItdXJsLW9yLXBhdGhdJyxcbiAgZGVzY3JpYmU6ICdPcGVuIGRhdGFiYXNlIHN0dWRpbycsXG4gIGJ1aWxkZXI6IHN0dWRpb0J1aWxkZXIsXG4gIGFzeW5jIGhhbmRsZXIoYXJndikge1xuICAgIGlmIChhcmd2LnJlc3RvcmVkICYmIGFyZ3YuZGJVcmxPclBhdGgpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignWW91IGNhbm5vdCBzcGVjaWZ5IGJvdGggLS1yZXN0b3JlZCBhbmQgLS1kYi11cmwtb3ItcGF0aC4nKTtcbiAgICB9XG5cbiAgICBjb25zdCBhbGxQcm9qZWN0cyA9IGF3YWl0IGZpbmREYXRhYmFzZU9ybVByb2plY3RzKGFyZ3YpO1xuICAgIGNvbnN0IHVua25vd25PcHRpb25zID0gZXh0cmFjdFVua25vd25PcHRpb25zKGFyZ3YsIFsnZGItdXJsLW9yLXBhdGgnLCAncmVzdG9yZWQnXSk7XG4gICAgZm9yIChjb25zdCB7IG9ybSwgcHJvamVjdCB9IG9mIHByZXBhcmVGb3JSdW5uaW5nRGF0YWJhc2VPcm1Db21tYW5kKCdkYiBzdHVkaW8nLCBhbGxQcm9qZWN0cykpIHtcbiAgICAgIGNvbnN0IGRiVXJsT3JQYXRoID0gYXJndi5yZXN0b3JlZFxuICAgICAgICA/IHByb2plY3QucGFja2FnZUpzb24uZGVwZW5kZW5jaWVzPy5ibGl0elxuICAgICAgICAgID8gJ2RiL3Jlc3RvcmVkLnNxbGl0ZTMnXG4gICAgICAgICAgOiAncHJpc21hL3Jlc3RvcmVkLnNxbGl0ZTMnXG4gICAgICAgIDogYXJndi5kYlVybE9yUGF0aD8udG9TdHJpbmcoKTtcbiAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bihcbiAgICAgICAgd2l0aExvY2FsRDFJZk5lZWRlZChvcm0sIHByb2plY3QsIGdldERhdGFiYXNlT3JtU2NyaXB0cyhvcm0pLnN0dWRpbyhwcm9qZWN0LCBkYlVybE9yUGF0aCwgdW5rbm93bk9wdGlvbnMpKSxcbiAgICAgICAgcHJvamVjdCxcbiAgICAgICAgYXJndlxuICAgICAgKTtcbiAgICB9XG4gIH0sXG59O1xuXG5jb25zdCBkZWZhdWx0Q29tbWFuZEJ1aWxkZXIgPSB7IGFyZ3M6IHsgdHlwZTogJ2FycmF5JyB9IH0gYXMgY29uc3Q7XG5cbmNvbnN0IGRlZmF1bHRDb21tYW5kOiBDb21tYW5kTW9kdWxlPHVua25vd24sIEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIGRlZmF1bHRDb21tYW5kQnVpbGRlcj4+ID0ge1xuICBjb21tYW5kOiAnJDAgPGFyZ3MuLj4nLFxuICBkZXNjcmliZTpcbiAgICBcIlBhc3MgdGhlIGNvbW1hbmQgYW5kIGFyZ3VtZW50cyB0byB0aGUgZGV0ZWN0ZWQgT1JNIGFzIGlzLiBBZGRpdGlvbmFsIFByaXNtYSBmbGFncyBjYW4gYWxzbyBiZSBmb3J3YXJkZWQgYWZ0ZXIgJy0tJy5cIixcbiAgYnVpbGRlcjogZGVmYXVsdENvbW1hbmRCdWlsZGVyLFxuICBhc3luYyBoYW5kbGVyKGFyZ3YpIHtcbiAgICBjb25zdCBhbGxQcm9qZWN0cyA9IGF3YWl0IGZpbmREYXRhYmFzZU9ybVByb2plY3RzKGFyZ3YpO1xuICAgIGNvbnN0IHNjcmlwdCA9IChhcmd2LmFyZ3M/LmpvaW4oJyAnKSA/PyAnJykudHJpbUVuZCgpO1xuICAgIGNvbnN0IHVua25vd25PcHRpb25zID0gZXh0cmFjdFVua25vd25PcHRpb25zKGFyZ3YsIFsnYXJncyddKTtcbiAgICBjb25zdCBmdWxsQ29tbWFuZCA9IFtzY3JpcHQsIHVua25vd25PcHRpb25zXS5maWx0ZXIoQm9vbGVhbikuam9pbignICcpO1xuICAgIGZvciAoY29uc3QgeyBvcm0sIHByb2plY3QgfSBvZiBwcmVwYXJlRm9yUnVubmluZ0RhdGFiYXNlT3JtQ29tbWFuZChgZGIgJHtmdWxsQ29tbWFuZH1gLCBhbGxQcm9qZWN0cykpIHtcbiAgICAgIGNvbnN0IGNvbW1hbmQgPSBvcm0gPT09ICdwcmlzbWEnID8gYFBSSVNNQSAke2Z1bGxDb21tYW5kfWAgOiBidWlsZERyaXp6bGVLaXRDb21tYW5kKHByb2plY3QsIGZ1bGxDb21tYW5kKTtcbiAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bih3aXRoTG9jYWxEMUlmTmVlZGVkKG9ybSwgcHJvamVjdCwgY29tbWFuZCksIHByb2plY3QsIGFyZ3YpO1xuICAgIH1cbiAgfSxcbn07XG5cbi8qKlxuICogTWFrZSBEcml6emxlIGNvbW1hbmRzIHdvcmsgb24gQ2xvdWRmbGFyZSBEMSBwcm9qZWN0cyBieSBwb2ludGluZyBEQVRBQkFTRV9VUkxcbiAqIGF0IHRoZSBsb2NhbCBtaW5pZmxhcmUgRDEgU1FMaXRlIGZpbGUuXG4gKi9cbmZ1bmN0aW9uIHdpdGhMb2NhbEQxSWZOZWVkZWQob3JtOiBEYXRhYmFzZU9ybSwgcHJvamVjdDogUHJvamVjdCwgc2NyaXB0OiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gb3JtID09PSAnZHJpenpsZScgPyB3cmFwV2l0aExvY2FsRDFEYXRhYmFzZVVybChwcm9qZWN0LCBzY3JpcHQpIDogc2NyaXB0O1xufVxuXG5mdW5jdGlvbiBjcmVhdGVMaXRlc3RyZWFtQ29uZmlnKHByb2plY3Q6IFByb2plY3QsIG9ybTogRGF0YWJhc2VPcm0sIGNvbmZpZ1BhdGg6IHN0cmluZyk6IHZvaWQge1xuICBjb25zdCBkYlBhdGggPSBnZXRMaXRlc3RyZWFtRGJQYXRoKHByb2plY3QsIG9ybSk7XG4gIGNvbnN0IHJlcXVpcmVkRW52VmFycyA9IHtcbiAgICBDTE9VREZMQVJFX1IyX0xJVEVTVFJFQU1fQUNDT1VOVF9JRDogcHJvamVjdC5lbnYuQ0xPVURGTEFSRV9SMl9MSVRFU1RSRUFNX0FDQ09VTlRfSUQsXG4gICAgQ0xPVURGTEFSRV9SMl9MSVRFU1RSRUFNX0JVQ0tFVF9OQU1FOiBwcm9qZWN0LmVudi5DTE9VREZMQVJFX1IyX0xJVEVTVFJFQU1fQlVDS0VUX05BTUUsXG4gICAgQ0xPVURGTEFSRV9SMl9MSVRFU1RSRUFNX0FDQ0VTU19LRVlfSUQ6IHByb2plY3QuZW52LkNMT1VERkxBUkVfUjJfTElURVNUUkVBTV9BQ0NFU1NfS0VZX0lELFxuICAgIENMT1VERkxBUkVfUjJfTElURVNUUkVBTV9TRUNSRVRfQUNDRVNTX0tFWTogcHJvamVjdC5lbnYuQ0xPVURGTEFSRV9SMl9MSVRFU1RSRUFNX1NFQ1JFVF9BQ0NFU1NfS0VZLFxuICB9IGFzIGNvbnN0O1xuICBjb25zdCBtaXNzaW5nRW52VmFycyA9IE9iamVjdC5lbnRyaWVzKHJlcXVpcmVkRW52VmFycylcbiAgICAuZmlsdGVyKChbLCB2YWx1ZV0pID0+ICF2YWx1ZSlcbiAgICAubWFwKChba2V5XSkgPT4ga2V5KTtcbiAgaWYgKG1pc3NpbmdFbnZWYXJzLmxlbmd0aCA+IDApIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYE1pc3NpbmcgZW52aXJvbm1lbnQgdmFyaWFibGVzIGZvciBMaXRlc3RyZWFtOiAke21pc3NpbmdFbnZWYXJzLmpvaW4oJywgJyl9YCk7XG4gIH1cblxuICBjb25zdCBsaXRlc3RyZWFtQ29uZmlnID0gYHNuYXBzaG90OlxuICBpbnRlcnZhbDogMjRoICAjIENyZWF0ZSBhIGJhY2t1cCBwZXIgZGF5XG4gIHJldGVudGlvbjogNzJoICMgS2VlcCBiYWNrdXBzIGZvciAzIGRheXNcbmRiczpcbiAgLSBwYXRoOiAke2RiUGF0aH1cbiAgICBidXN5LXRpbWVvdXQ6IDVzXG4gICAgY2hlY2twb2ludC1pbnRlcnZhbDogMW1cbiAgICByZXBsaWNhOlxuICAgICAgdHlwZTogczNcbiAgICAgIGVuZHBvaW50OiBodHRwczovLyR7cmVxdWlyZWRFbnZWYXJzLkNMT1VERkxBUkVfUjJfTElURVNUUkVBTV9BQ0NPVU5UX0lEfS5yMi5jbG91ZGZsYXJlc3RvcmFnZS5jb21cbiAgICAgIGJ1Y2tldDogJHtyZXF1aXJlZEVudlZhcnMuQ0xPVURGTEFSRV9SMl9MSVRFU1RSRUFNX0JVQ0tFVF9OQU1FfVxuICAgICAgYWNjZXNzLWtleS1pZDogJHtyZXF1aXJlZEVudlZhcnMuQ0xPVURGTEFSRV9SMl9MSVRFU1RSRUFNX0FDQ0VTU19LRVlfSUR9XG4gICAgICBzZWNyZXQtYWNjZXNzLWtleTogJHtyZXF1aXJlZEVudlZhcnMuQ0xPVURGTEFSRV9SMl9MSVRFU1RSRUFNX1NFQ1JFVF9BQ0NFU1NfS0VZfVxuICAgICAgc3luYy1pbnRlcnZhbDogMW1cbmA7XG5cbiAgdHJ5IHtcbiAgICBmcy53cml0ZUZpbGVTeW5jKGNvbmZpZ1BhdGgsIGxpdGVzdHJlYW1Db25maWcpO1xuICAgIGNvbnNvbGUuaW5mbyhgR2VuZXJhdGVkICR7Y29uZmlnUGF0aH1gKTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBjb25zdCByZWFzb24gPSBlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6IFN0cmluZyhlcnJvcik7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBGYWlsZWQgdG8gd3JpdGUgJHtjb25maWdQYXRofTogJHtyZWFzb259YCwge1xuICAgICAgY2F1c2U6IGVycm9yLFxuICAgIH0pO1xuICB9XG59XG5cbmZ1bmN0aW9uIGdldERlZmF1bHRSZXN0b3JlT3V0cHV0KHByb2plY3Q6IFByb2plY3QsIG9ybTogRGF0YWJhc2VPcm0pOiBzdHJpbmcge1xuICBpZiAob3JtID09PSAncHJpc21hJylcbiAgICByZXR1cm4gcHJvamVjdC5wYWNrYWdlSnNvbi5kZXBlbmRlbmNpZXM/LmJsaXR6ID8gJ2RiL3Jlc3RvcmVkLnNxbGl0ZTMnIDogJ3ByaXNtYS9yZXN0b3JlZC5zcWxpdGUzJztcbiAgcmV0dXJuICdkcml6emxlL3Jlc3RvcmVkLnNxbGl0ZTMnO1xufVxuXG5mdW5jdGlvbiBnZXRMaXRlc3RyZWFtRGJQYXRoKHByb2plY3Q6IFByb2plY3QsIG9ybTogRGF0YWJhc2VPcm0pOiBzdHJpbmcge1xuICBpZiAob3JtID09PSAncHJpc21hJykge1xuICAgIGNvbnN0IGRpck5hbWUgPSBwcm9qZWN0LnBhY2thZ2VKc29uLmRlcGVuZGVuY2llcz8uYmxpdHogPyAnZGInIDogJ3ByaXNtYSc7XG4gICAgcmV0dXJuIGAke2Rpck5hbWV9L21vdW50L3Byb2Quc3FsaXRlM2A7XG4gIH1cblxuICBjb25zdCBkYlBhdGggPSBnZXRBYnNvbHV0ZUZpbGVEYXRhYmFzZVVybFBhdGgocHJvamVjdCk7XG4gIGlmICghZGJQYXRoKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCd3YiBkYiBjcmVhdGUtbGl0ZXN0cmVhbS1jb25maWcgZm9yIERyaXp6bGUgcmVxdWlyZXMgZmlsZTogREFUQUJBU0VfVVJMLicpO1xuICB9XG4gIHJldHVybiBkYlBhdGg7XG59XG5cbmludGVyZmFjZSBEYXRhYmFzZU9ybVByb2plY3Qge1xuICBwcm9qZWN0OiBQcm9qZWN0O1xuICBvcm06IERhdGFiYXNlT3JtO1xufVxuXG5hc3luYyBmdW5jdGlvbiBmaW5kRGF0YWJhc2VPcm1Qcm9qZWN0cyhhcmd2OiBFbnZSZWFkZXJPcHRpb25zLCBvcm0/OiBEYXRhYmFzZU9ybSk6IFByb21pc2U8RGF0YWJhc2VPcm1Qcm9qZWN0W10+IHtcbiAgY29uc3QgcHJvamVjdHMgPSBhd2FpdCBmaW5kRGVzY2VuZGFudFByb2plY3RzKGFyZ3YpO1xuICBpZiAoIXByb2plY3RzKSB7XG4gICAgY29uc29sZS5lcnJvcihjaGFsay5yZWQoJ05vIHByb2plY3QgZm91bmQuJykpO1xuICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgfVxuXG4gIGNvbnN0IGZpbHRlcmVkID0gcHJvamVjdHMuZGVzY2VuZGFudHNcbiAgICAubWFwKChwcm9qZWN0KSA9PiAocHJvamVjdC5kYXRhYmFzZU9ybSA/IHsgcHJvamVjdCwgb3JtOiBwcm9qZWN0LmRhdGFiYXNlT3JtIH0gOiB1bmRlZmluZWQpKVxuICAgIC5maWx0ZXIoKHByb2plY3QpOiBwcm9qZWN0IGlzIERhdGFiYXNlT3JtUHJvamVjdCA9PiAhIXByb2plY3QgJiYgKCFvcm0gfHwgcHJvamVjdC5vcm0gPT09IG9ybSkpO1xuICBpZiAoZmlsdGVyZWQubGVuZ3RoID09PSAwKSB7XG4gICAgY29uc29sZS5lcnJvcihjaGFsay5yZWQob3JtID8gYE5vICR7b3JtfSBwcm9qZWN0IGZvdW5kLmAgOiAnTm8gc3VwcG9ydGVkIGRhdGFiYXNlIE9STSBwcm9qZWN0IGZvdW5kLicpKTtcbiAgICBwcm9jZXNzLmV4aXQoMSk7XG4gIH1cbiAgcmV0dXJuIGZpbHRlcmVkO1xufVxuXG5mdW5jdGlvbiBnZXREYXRhYmFzZU9ybVNjcmlwdHMob3JtOiBEYXRhYmFzZU9ybSk6IHR5cGVvZiBwcmlzbWFTY3JpcHRzIHwgdHlwZW9mIGRyaXp6bGVTY3JpcHRzIHtcbiAgcmV0dXJuIG9ybSA9PT0gJ3ByaXNtYScgPyBwcmlzbWFTY3JpcHRzIDogZHJpenpsZVNjcmlwdHM7XG59XG5cbmZ1bmN0aW9uKiBwcmVwYXJlRm9yUnVubmluZ0RhdGFiYXNlT3JtQ29tbWFuZChcbiAgY29tbWFuZE5hbWU6IHN0cmluZyxcbiAgcHJvamVjdHM6IERhdGFiYXNlT3JtUHJvamVjdFtdXG4pOiBHZW5lcmF0b3I8RGF0YWJhc2VPcm1Qcm9qZWN0LCB2b2lkLCB1bmtub3duPiB7XG4gIGNvbnN0IG9ybVByb2plY3RCeVByb2plY3QgPSBuZXcgTWFwKHByb2plY3RzLm1hcCgocHJvamVjdCkgPT4gW3Byb2plY3QucHJvamVjdCwgcHJvamVjdF0pKTtcbiAgZm9yIChjb25zdCBwcm9qZWN0IG9mIHByZXBhcmVGb3JSdW5uaW5nQ29tbWFuZChcbiAgICBjb21tYW5kTmFtZSxcbiAgICBwcm9qZWN0cy5tYXAoKHsgcHJvamVjdCB9KSA9PiBwcm9qZWN0KVxuICApKSB7XG4gICAgY29uc3Qgb3JtUHJvamVjdCA9IG9ybVByb2plY3RCeVByb2plY3QuZ2V0KHByb2plY3QpO1xuICAgIGlmICghb3JtUHJvamVjdCkgdGhyb3cgbmV3IEVycm9yKGBGYWlsZWQgdG8gZGV0ZWN0IGRhdGFiYXNlIE9STSBmb3IgJHtwcm9qZWN0Lm5hbWV9LmApO1xuXG4gICAgeWllbGQgb3JtUHJvamVjdDtcbiAgfVxufVxuXG4vKipcbiAqIEV4dHJhY3QgdW5rbm93biBvcHRpb25zIGZyb20gYXJndiB0byBwYXNzIHRvIE9STSBjb21tYW5kcy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGV4dHJhY3RVbmtub3duT3B0aW9ucyhhcmd2OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiwga25vd25PcHRpb25zOiBzdHJpbmdbXSA9IFtdKTogc3RyaW5nIHtcbiAgY29uc3QgdW5rbm93bk9wdGlvbnM6IHN0cmluZ1tdID0gW107XG5cbiAgLy8gQnVpbGQgbGlzdCBvZiBrbm93biBvcHRpb25zIGZyb20gc2hhcmVkIG9wdGlvbnMgYnVpbGRlcnNcbiAgY29uc3Qgc2hhcmVkT3B0aW9uS2V5cyA9IE9iamVjdC5rZXlzKHNoYXJlZE9wdGlvbnNCdWlsZGVyKTtcbiAgY29uc3Qgc2hhcmVkT3B0aW9uQWxpYXNlcyA9IE9iamVjdC52YWx1ZXMoc2hhcmVkT3B0aW9uc0J1aWxkZXIpXG4gICAgLmZsYXRNYXAoKG9wdGlvbikgPT4ge1xuICAgICAgaWYgKCdhbGlhcycgaW4gb3B0aW9uKSB7XG4gICAgICAgIHJldHVybiBBcnJheS5pc0FycmF5KG9wdGlvbi5hbGlhcykgPyBvcHRpb24uYWxpYXMgOiBbb3B0aW9uLmFsaWFzXTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBbXTtcbiAgICB9KVxuICAgIC5tYXAoU3RyaW5nKTtcblxuICBjb25zdCBhbGxLbm93bk9wdGlvbnMgPSBuZXcgU2V0KFtcbiAgICAuLi5rbm93bk9wdGlvbnMsXG4gICAgLi4uc2hhcmVkT3B0aW9uS2V5cyxcbiAgICAuLi5zaGFyZWRPcHRpb25BbGlhc2VzLFxuICAgIC8vIEludGVybmFsIHlhcmdzIHByb3BlcnRpZXNcbiAgICAnLS0nLFxuICAgICdfJyxcbiAgICAnJDAnLFxuICBdKTtcblxuICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhhcmd2KSkge1xuICAgIGlmICghYWxsS25vd25PcHRpb25zLmhhcyhrZXkpKSB7XG4gICAgICAvLyBTa2lwIGNhbWVsQ2FzZSB2ZXJzaW9ucyBvZiBrZWJhYi1jYXNlIG9wdGlvbnMgdG8gYXZvaWQgZHVwbGljYXRpb25cbiAgICAgIC8vIElmIHdlIGhhdmUgYm90aCAnY3JlYXRlLW9ubHknIGFuZCAnY3JlYXRlT25seScsIHByZWZlciB0aGUga2ViYWItY2FzZSB2ZXJzaW9uXG4gICAgICBjb25zdCBrZWJhYkNhc2VLZXkgPSBrZXkucmVwbGFjZUFsbCgvW0EtWl0vZywgKG1hdGNoKSA9PiBgLSR7bWF0Y2gudG9Mb3dlckNhc2UoKX1gKTtcbiAgICAgIGlmIChrZWJhYkNhc2VLZXkgIT09IGtleSAmJiBhcmd2W2tlYmFiQ2FzZUtleV0gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBjb250aW51ZTsgLy8gU2tpcCBjYW1lbENhc2UgdmVyc2lvbiBpZiBrZWJhYi1jYXNlIGV4aXN0c1xuICAgICAgfVxuXG4gICAgICAvLyBIYW5kbGUgYm9vbGVhbiBmbGFnc1xuICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ2Jvb2xlYW4nICYmIHZhbHVlKSB7XG4gICAgICAgIHVua25vd25PcHRpb25zLnB1c2goYC0tJHtrZXl9YCk7XG4gICAgICB9XG4gICAgICAvLyBIYW5kbGUgc3RyaW5nL251bWJlciB2YWx1ZXNcbiAgICAgIGVsc2UgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycgfHwgdHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJykge1xuICAgICAgICB1bmtub3duT3B0aW9ucy5wdXNoKGAtLSR7a2V5fWAsIFN0cmluZyh2YWx1ZSkpO1xuICAgICAgfVxuICAgICAgLy8gSGFuZGxlIGFycmF5c1xuICAgICAgZWxzZSBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgICAgZm9yIChjb25zdCBpdGVtIG9mIHZhbHVlKSB7XG4gICAgICAgICAgdW5rbm93bk9wdGlvbnMucHVzaChgLS0ke2tleX1gLCBTdHJpbmcoaXRlbSkpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgY29uc3QgcGFzc3Rocm91Z2hBcmdzID0gQXJyYXkuaXNBcnJheShhcmd2WyctLSddKSA/IGFyZ3ZbJy0tJ10ubWFwKFN0cmluZykgOiBbXTtcbiAgcmV0dXJuIGJ1aWxkU2hlbGxDb21tYW5kKFsuLi51bmtub3duT3B0aW9ucywgLi4ucGFzc3Rocm91Z2hBcmdzXSk7XG59XG4iLCJpbXBvcnQgY2hhbGsgZnJvbSAnY2hhbGsnO1xuaW1wb3J0IHR5cGUgeyBDb21tYW5kTW9kdWxlLCBJbmZlcnJlZE9wdGlvblR5cGVzIH0gZnJvbSAneWFyZ3MnO1xuXG5pbXBvcnQgeyBmaW5kU2VsZlByb2plY3QgfSBmcm9tICcuLi9wcm9qZWN0LmpzJztcbmltcG9ydCB7IHJ1bldpdGhTcGF3biB9IGZyb20gJy4uL3NjcmlwdHMvcnVuLmpzJztcbmltcG9ydCB0eXBlIHsgc2hhcmVkT3B0aW9uc0J1aWxkZXIgfSBmcm9tICcuLi9zaGFyZWRPcHRpb25zQnVpbGRlci5qcyc7XG5cbmNvbnN0IGJ1aWxkZXIgPSB7XG4gIHJldHJ5OiB7XG4gICAgZGVzY3JpcHRpb246ICdBIG1heGltdW0gcmV0cnkgY291bnQnLFxuICAgIHR5cGU6ICdudW1iZXInLFxuICAgIGFsaWFzOiAncicsXG4gICAgZGVmYXVsdDogMyxcbiAgfSxcbn0gYXMgY29uc3Q7XG5cbmNvbnN0IF9hcmd1bWVudHNCdWlsZGVyID0ge1xuICBjb21tYW5kOiB7XG4gICAgZGVzY3JpcHRpb246ICdBIGNvbW1hbmQgdG8gcmV0cnknLFxuICAgIHR5cGU6ICdzdHJpbmcnLFxuICB9LFxuICBhcmdzOiB7XG4gICAgZGVzY3JpcHRpb246ICdBcmd1bWVudHMgZm9yIHRoZSBjb21tYW5kJyxcbiAgICB0eXBlOiAnYXJyYXknLFxuICB9LFxufSBhcyBjb25zdDtcblxuZXhwb3J0IGNvbnN0IHJldHJ5Q29tbWFuZDogQ29tbWFuZE1vZHVsZTxcbiAgdW5rbm93bixcbiAgSW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgYnVpbGRlciAmIHR5cGVvZiBzaGFyZWRPcHRpb25zQnVpbGRlciAmIHR5cGVvZiBfYXJndW1lbnRzQnVpbGRlcj5cbj4gPSB7XG4gIGNvbW1hbmQ6ICdyZXRyeSBbY29tbWFuZF0gW2FyZ3MuLi5dJyxcbiAgZGVzY3JpYmU6ICdSZXRyeSB0aGUgZ2l2ZW4gY29tbWFuZCB1bnRpbCBpdCBzdWNjZWVkcycsXG4gIGJ1aWxkZXIsXG4gIGFzeW5jIGhhbmRsZXIoYXJndikge1xuICAgIGNvbnN0IHByb2plY3QgPSBmaW5kU2VsZlByb2plY3QoYXJndik7XG4gICAgaWYgKCFwcm9qZWN0KSB7XG4gICAgICBjb25zb2xlLmVycm9yKGNoYWxrLnJlZCgnTm8gcHJvamVjdCBmb3VuZC4nKSk7XG4gICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgfVxuXG4gICAgY29uc3QgY21kQW5kQXJncyA9IFthcmd2LmNvbW1hbmQsIC4uLihhcmd2LmFyZ3MgPz8gW10pLCAuLi5hcmd2Ll8uc2xpY2UoMSldLmZpbHRlcihCb29sZWFuKTtcbiAgICBsZXQgbGFzdFN0YXR1cyA9IDA7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBhcmd2LnJldHJ5OyBpKyspIHtcbiAgICAgIGlmIChpID4gMCkge1xuICAgICAgICBjb25zb2xlLmluZm8oYFxcbiR7Y2hhbGsueWVsbG93KGAjJHtpfSBSZXRyeWluZzogJHtjbWRBbmRBcmdzLmpvaW4oJyAnKX1gKX1gKTtcbiAgICAgIH1cbiAgICAgIC8vIFRPRE86IHNob3VsZCB3ZSBhZGQgc2luZ2xlIHF1b3RlcyBhcm91bmQgZWFjaCBhcmd1bWVudD9cbiAgICAgIGxhc3RTdGF0dXMgPSBhd2FpdCBydW5XaXRoU3Bhd24oY21kQW5kQXJncy5qb2luKCcgJyksIHByb2plY3QsIGFyZ3YsIHtcbiAgICAgICAgZXhpdElmRmFpbGVkOiBmYWxzZSxcbiAgICAgICAgb25TaWduYWw6IChzaWduYWwpID0+IHtcbiAgICAgICAgICBpZiAoc2lnbmFsKSB7XG4gICAgICAgICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgfSk7XG4gICAgICBpZiAobGFzdFN0YXR1cyA9PT0gMCkgcmV0dXJuO1xuICAgIH1cbiAgICBwcm9jZXNzLmV4aXQobGFzdFN0YXR1cyk7XG4gIH0sXG59O1xuIiwiaW1wb3J0IGNoaWxkX3Byb2Nlc3MgZnJvbSAnbm9kZTpjaGlsZF9wcm9jZXNzJztcbmltcG9ydCBmcyBmcm9tICdub2RlOmZzL3Byb21pc2VzJztcbmltcG9ydCBvcyBmcm9tICdub2RlOm9zJztcblxuaW1wb3J0IGNoYWxrIGZyb20gJ2NoYWxrJztcbmltcG9ydCB0eXBlIHsgQXJndW1lbnRzQ2FtZWxDYXNlLCBDb21tYW5kTW9kdWxlLCBJbmZlcnJlZE9wdGlvblR5cGVzIH0gZnJvbSAneWFyZ3MnO1xuXG5pbXBvcnQgeyBmaW5kRGVzY2VuZGFudFByb2plY3RzIH0gZnJvbSAnLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQgeyBydW5XaXRoU3Bhd24sIHJ1bldpdGhTcGF3bkluUGFyYWxsZWwgfSBmcm9tICcuLi9zY3JpcHRzL3J1bi5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcblxuaW1wb3J0IHsgcHJlcGFyZUZvclJ1bm5pbmdDb21tYW5kIH0gZnJvbSAnLi9jb21tYW5kVXRpbHMuanMnO1xuXG5jb25zdCBidWlsZGVyID0ge30gYXMgY29uc3Q7XG5cbmV4cG9ydCBjb25zdCBzZXR1cENvbW1hbmQ6IENvbW1hbmRNb2R1bGU8dW5rbm93biwgSW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgYnVpbGRlcj4+ID0ge1xuICBjb21tYW5kOiAnc2V0dXAnLFxuICBkZXNjcmliZTogJ1NldHVwIGRldmVsb3BtZW50IGVudmlyb25tZW50LiAuZW52IGZpbGVzIGFyZSBpZ25vcmVkLicsXG4gIGJ1aWxkZXIsXG4gIGFzeW5jIGhhbmRsZXIoYXJndikge1xuICAgIGF3YWl0IHNldHVwKGFyZ3YpO1xuICB9LFxufTtcblxuLy8gVGVzdCBjb2RlIHJlcXVpcmVzIFBhcnRpYWw8Li4uPlxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHNldHVwKFxuICBhcmd2OiBQYXJ0aWFsPEFyZ3VtZW50c0NhbWVsQ2FzZTxJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBidWlsZGVyPj4+LFxuICBwcm9qZWN0UGF0aEZvclRlc3Rpbmc/OiBzdHJpbmdcbik6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBwcm9qZWN0cyA9IGF3YWl0IGZpbmREZXNjZW5kYW50UHJvamVjdHMoYXJndiwgZmFsc2UsIHByb2plY3RQYXRoRm9yVGVzdGluZyk7XG4gIGlmICghcHJvamVjdHMpIHtcbiAgICBjb25zb2xlLmVycm9yKGNoYWxrLnJlZCgnTm8gcHJvamVjdCBmb3VuZC4nKSk7XG4gICAgcHJvY2Vzcy5leGl0KDEpO1xuICB9XG5cbiAgZm9yIChjb25zdCBwcm9qZWN0IG9mIHByZXBhcmVGb3JSdW5uaW5nQ29tbWFuZCgnc2V0dXAnLCBwcm9qZWN0cy5kZXNjZW5kYW50cykpIHtcbiAgICBjb25zdCBkaXJlbnRzID0gYXdhaXQgZnMucmVhZGRpcihwcm9qZWN0LmRpclBhdGgsIHsgd2l0aEZpbGVUeXBlczogdHJ1ZSB9KTtcbiAgICBpZiAocHJvamVjdCA9PT0gcHJvamVjdHMucm9vdCkge1xuICAgICAgaWYgKG9zLnBsYXRmb3JtKCkgPT09ICdkYXJ3aW4nKSB7XG4gICAgICAgIGNvbnN0IHBhY2thZ2VzID0gWydwc3RyZWUnXTtcbiAgICAgICAgYXdhaXQgcnVuV2l0aFNwYXduSW5QYXJhbGxlbChgYnJldyBpbnN0YWxsICR7cGFja2FnZXMuam9pbignICcpfWAsIHByb2plY3QsIGFyZ3YpO1xuICAgICAgfVxuXG4gICAgICBpZiAoZGlyZW50cy5zb21lKChkKSA9PiBkLmlzRmlsZSgpICYmIGQubmFtZS5pbmNsdWRlcygnLXZlcnNpb24nKSkpIHtcbiAgICAgICAgYXdhaXQgcnVuV2l0aFNwYXduKCdhc2RmIGluc3RhbGwnLCBwcm9qZWN0LCBhcmd2LCB7IGV4aXRJZkZhaWxlZDogZmFsc2UgfSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGRpcmVudHMuc29tZSgoZCkgPT4gZC5pc0ZpbGUoKSAmJiBkLm5hbWUgPT09ICdweXByb2plY3QudG9tbCcpKSB7XG4gICAgICBhd2FpdCBydW5XaXRoU3Bhd25JblBhcmFsbGVsKCdwb2V0cnkgY29uZmlnIHZpcnR1YWxlbnZzLmluLXByb2plY3QgdHJ1ZScsIHByb2plY3QsIGFyZ3YpO1xuICAgICAgY29uc3QgWywgdmVyc2lvbl0gPSBjaGlsZF9wcm9jZXNzLmV4ZWNTeW5jKCdhc2RmIGN1cnJlbnQgcHl0aG9uJykudG9TdHJpbmcoKS50cmltKCkuc3BsaXQoL1xccysvKTtcbiAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bkluUGFyYWxsZWwoYHBvZXRyeSBlbnYgdXNlICR7dmVyc2lvbn1gLCBwcm9qZWN0LCBhcmd2KTtcbiAgICAgIGF3YWl0IHByb21pc2VQb29sLnByb21pc2VBbGwoKTtcbiAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bigncG9ldHJ5IHJ1biBwaXAgaW5zdGFsbCAtLXVwZ3JhZGUgcGlwJywgcHJvamVjdCwgYXJndik7XG4gICAgICBhd2FpdCBydW5XaXRoU3Bhd24oJ3BvZXRyeSBpbnN0YWxsIC0tYW5zaScsIHByb2plY3QsIGFyZ3YpO1xuICAgIH1cblxuICAgIGlmIChcbiAgICAgIChwcm9qZWN0ID09PSBwcm9qZWN0cy5yb290IHx8ICFwcm9qZWN0cy5yb290LnBhY2thZ2VKc29uLnNjcmlwdHM/LlsnZ2VuLWNvZGUnXSkgJiZcbiAgICAgIHByb2plY3QucGFja2FnZUpzb24uc2NyaXB0cz8uWydnZW4tY29kZSddXG4gICAgKSB7XG4gICAgICBhd2FpdCBydW5XaXRoU3Bhd24oYCR7cHJvamVjdC5wYWNrYWdlTWFuYWdlclJ1bkNvbW1hbmR9IGdlbi1jb2RlYCwgcHJvamVjdCwgYXJndik7XG4gICAgfVxuICB9XG5cbiAgY29uc3QgcHJvamVjdCA9IHByb2plY3RzLmRlc2NlbmRhbnRzLmZpbmQoKHApID0+IHAucGFja2FnZUpzb24uZGV2RGVwZW5kZW5jaWVzPy5wbGF5d3JpZ2h0KTtcbiAgaWYgKHByb2plY3QpIHtcbiAgICBhd2FpdCBydW5XaXRoU3Bhd24oYCR7cHJvamVjdC5wYWNrYWdlTWFuYWdlclJ1bkNvbW1hbmR9IHBsYXl3cmlnaHQgaW5zdGFsbCAtLXdpdGgtZGVwc2AsIHByb2plY3QsIGFyZ3YpO1xuICB9XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgY2hhbGsgZnJvbSAnY2hhbGsnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlSnNvbiB9IGZyb20gJ3R5cGUtZmVzdCc7XG5pbXBvcnQgdHlwZSB7IENvbW1hbmRNb2R1bGUsIEluZmVycmVkT3B0aW9uVHlwZXMgfSBmcm9tICd5YXJncyc7XG5cbmltcG9ydCB7IGZpbmRSb290QW5kU2VsZlByb2plY3RzIH0gZnJvbSAnLi4vcHJvamVjdC5qcyc7XG5cbmludGVyZmFjZSBQcml2YXRlUGFja2FnZSB7XG4gIG5hbWU6IHN0cmluZztcbiAgc291cmNlRGlyUGF0aDogc3RyaW5nO1xuICB0YXJnZXREaXJQYXRoOiBzdHJpbmc7XG59XG5cbmNvbnN0IGRlcGVuZGVuY3lLZXlzID0gWydkZXBlbmRlbmNpZXMnLCAnZGV2RGVwZW5kZW5jaWVzJywgJ29wdGlvbmFsRGVwZW5kZW5jaWVzJywgJ3BlZXJEZXBlbmRlbmNpZXMnXSBhcyBjb25zdDtcbmNvbnN0IHByaXZhdGVHaXREZXBlbmRlbmN5UGF0dGVybiA9IC9eZ2l0QGdpdGh1YlxcLmNvbTooPzpXaWxsQm9vc3RlcnxXaWxsQm9vc3RlckxhYilcXC9bXi8jXSsoPzpcXC5naXQpPyg/OiMuKik/JC87XG5cbmNvbnN0IGJ1aWxkZXIgPSB7XG4gICdvdXQtZGlyJzoge1xuICAgIGRlc2NyaXB0aW9uOiAnRGlyZWN0b3J5IHRvIGNvcHkgcHJpdmF0ZSBwYWNrYWdlcyBpbnRvJyxcbiAgICB0eXBlOiAnc3RyaW5nJyxcbiAgICBkZWZhdWx0OiAnQHdpbGxib29zdGVyJyxcbiAgfSxcbn0gYXMgY29uc3Q7XG5cbmV4cG9ydCBjb25zdCBzZXR1cFByaXZhdGVQYWNrYWdlc0NvbW1hbmQ6IENvbW1hbmRNb2R1bGU8eyBkcnlSdW4/OiBib29sZWFuIH0sIEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIGJ1aWxkZXI+PiA9IHtcbiAgY29tbWFuZDogJ3NldHVwLXByaXZhdGUtcGFja2FnZXMnLFxuICBkZXNjcmliZTogJ0NvcHkgcHJpdmF0ZSBnaXQgZGVwZW5kZW5jaWVzIGZvciBEb2NrZXIgYnVpbGRzJyxcbiAgYnVpbGRlcixcbiAgYXN5bmMgaGFuZGxlcihhcmd2KSB7XG4gICAgY29uc3QgcHJvamVjdHMgPSBmaW5kUm9vdEFuZFNlbGZQcm9qZWN0cyhhcmd2LCBmYWxzZSk7XG4gICAgaWYgKCFwcm9qZWN0cykge1xuICAgICAgY29uc29sZS5lcnJvcihjaGFsay5yZWQoJ05vIHByb2plY3QgZm91bmQuJykpO1xuICAgICAgcHJvY2Vzcy5leGl0KDEpO1xuICAgIH1cblxuICAgIGNvbnN0IG91dERpclBhdGggPSBwYXRoLnJlc29sdmUocHJvamVjdHMucm9vdC5kaXJQYXRoLCBhcmd2Lm91dERpcik7XG4gICAgYXNzZXJ0U3ViZGlyZWN0b3J5KHByb2plY3RzLnJvb3QuZGlyUGF0aCwgb3V0RGlyUGF0aCk7XG4gICAgY29uc3QgY29waWVkUGFja2FnZXMgPSBhd2FpdCBjb2xsZWN0UHJpdmF0ZVBhY2thZ2VzKHByb2plY3RzLnJvb3QuZGlyUGF0aCwgcHJvamVjdHMucm9vdC5wYWNrYWdlSnNvbiwgb3V0RGlyUGF0aCk7XG5cbiAgICBpZiAoYXJndi5kcnlSdW4pIHtcbiAgICAgIHByaW50RHJ5UnVuUmVzdWx0KG91dERpclBhdGgsIGNvcGllZFBhY2thZ2VzKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBhd2FpdCBmcy5wcm9taXNlcy5ybShvdXREaXJQYXRoLCB7IHJlY3Vyc2l2ZTogdHJ1ZSwgZm9yY2U6IHRydWUgfSk7XG4gICAgYXdhaXQgZnMucHJvbWlzZXMubWtkaXIob3V0RGlyUGF0aCwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gICAgZm9yIChjb25zdCBwcml2YXRlUGFja2FnZSBvZiBjb3BpZWRQYWNrYWdlcy52YWx1ZXMoKSkge1xuICAgICAgYXdhaXQgZnMucHJvbWlzZXMuY3AocHJpdmF0ZVBhY2thZ2Uuc291cmNlRGlyUGF0aCwgcHJpdmF0ZVBhY2thZ2UudGFyZ2V0RGlyUGF0aCwge1xuICAgICAgICByZWN1cnNpdmU6IHRydWUsXG4gICAgICAgIGZvcmNlOiB0cnVlLFxuICAgICAgICBmaWx0ZXI6IChzcmMpID0+IHtcbiAgICAgICAgICBjb25zdCBzZWdtZW50cyA9IHBhdGgucmVsYXRpdmUocHJpdmF0ZVBhY2thZ2Uuc291cmNlRGlyUGF0aCwgc3JjKS5zcGxpdChwYXRoLnNlcCk7XG4gICAgICAgICAgcmV0dXJuICFzZWdtZW50cy5pbmNsdWRlcygnbm9kZV9tb2R1bGVzJykgJiYgIXNlZ21lbnRzLmluY2x1ZGVzKCcuZ2l0Jyk7XG4gICAgICAgIH0sXG4gICAgICB9KTtcbiAgICAgIGNvbnNvbGUuaW5mbyhcbiAgICAgICAgYENvcGllZCAke3ByaXZhdGVQYWNrYWdlLm5hbWV9IHRvICR7cGF0aC5yZWxhdGl2ZShwcm9qZWN0cy5yb290LmRpclBhdGgsIHByaXZhdGVQYWNrYWdlLnRhcmdldERpclBhdGgpfWBcbiAgICAgICk7XG4gICAgfVxuXG4gICAgYXdhaXQgcmVwbGFjZVByaXZhdGVHaXREZXBlbmRlbmNpZXMob3V0RGlyUGF0aCwgY29waWVkUGFja2FnZXMpO1xuICB9LFxufTtcblxuYXN5bmMgZnVuY3Rpb24gY29sbGVjdFByaXZhdGVQYWNrYWdlcyhcbiAgcm9vdERpclBhdGg6IHN0cmluZyxcbiAgcm9vdFBhY2thZ2VKc29uOiBQYWNrYWdlSnNvbixcbiAgb3V0RGlyUGF0aDogc3RyaW5nXG4pOiBQcm9taXNlPE1hcDxzdHJpbmcsIFByaXZhdGVQYWNrYWdlPj4ge1xuICBjb25zdCBjb3BpZWRQYWNrYWdlcyA9IG5ldyBNYXA8c3RyaW5nLCBQcml2YXRlUGFja2FnZT4oKTtcbiAgLy8gU3RhcnQgZnJvbSB0aGUgcm9vdCBwYWNrYWdlLmpzb24gYnkgZGVzaWduOyB3b3Jrc3BhY2UgcGFja2FnZSBkZXBlbmRlbmNpZXMgYXJlIG91dHNpZGUgdGhpcyBjb21tYW5kJ3MgdGFyZ2V0LlxuICBjb25zdCBwYWNrYWdlTmFtZXNUb0NvcHkgPSBmaW5kUHJpdmF0ZUdpdERlcGVuZGVuY3lOYW1lcyhyb290UGFja2FnZUpzb24pO1xuICBjb25zdCBxdWV1ZWRQYWNrYWdlTmFtZXMgPSBuZXcgU2V0KHBhY2thZ2VOYW1lc1RvQ29weSk7XG5cbiAgZm9yIChsZXQgaW5kZXggPSAwOyBpbmRleCA8IHBhY2thZ2VOYW1lc1RvQ29weS5sZW5ndGg7IGluZGV4KyspIHtcbiAgICBjb25zdCBwYWNrYWdlTmFtZSA9IHBhY2thZ2VOYW1lc1RvQ29weVtpbmRleF07XG4gICAgaWYgKCFwYWNrYWdlTmFtZSkgY29udGludWU7XG4gICAgaWYgKGNvcGllZFBhY2thZ2VzLmhhcyhwYWNrYWdlTmFtZSkpIGNvbnRpbnVlO1xuXG4gICAgY29uc3QgcHJpdmF0ZVBhY2thZ2UgPSBidWlsZFByaXZhdGVQYWNrYWdlKHJvb3REaXJQYXRoLCBvdXREaXJQYXRoLCBwYWNrYWdlTmFtZSk7XG4gICAgY29waWVkUGFja2FnZXMuc2V0KHBhY2thZ2VOYW1lLCBwcml2YXRlUGFja2FnZSk7XG5cbiAgICBmb3IgKGNvbnN0IHBhY2thZ2VKc29uUGF0aCBvZiBhd2FpdCBmaW5kUGFja2FnZUpzb25QYXRocyhwcml2YXRlUGFja2FnZS5zb3VyY2VEaXJQYXRoKSkge1xuICAgICAgY29uc3QgcGFja2FnZUpzb24gPSBhd2FpdCByZWFkUGFja2FnZUpzb24ocGFja2FnZUpzb25QYXRoKTtcbiAgICAgIGZvciAoY29uc3QgbmVzdGVkUGFja2FnZU5hbWUgb2YgZmluZFByaXZhdGVHaXREZXBlbmRlbmN5TmFtZXMocGFja2FnZUpzb24pKSB7XG4gICAgICAgIGlmICghcXVldWVkUGFja2FnZU5hbWVzLmhhcyhuZXN0ZWRQYWNrYWdlTmFtZSkpIHtcbiAgICAgICAgICBxdWV1ZWRQYWNrYWdlTmFtZXMuYWRkKG5lc3RlZFBhY2thZ2VOYW1lKTtcbiAgICAgICAgICBwYWNrYWdlTmFtZXNUb0NvcHkucHVzaChuZXN0ZWRQYWNrYWdlTmFtZSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gY29waWVkUGFja2FnZXM7XG59XG5cbmZ1bmN0aW9uIGFzc2VydFN1YmRpcmVjdG9yeShyb290RGlyUGF0aDogc3RyaW5nLCBvdXREaXJQYXRoOiBzdHJpbmcpOiB2b2lkIHtcbiAgY29uc3QgcmVsYXRpdmVQYXRoID0gcGF0aC5yZWxhdGl2ZShyb290RGlyUGF0aCwgb3V0RGlyUGF0aCk7XG4gIGlmIChyZWxhdGl2ZVBhdGggJiYgIXJlbGF0aXZlUGF0aC5zdGFydHNXaXRoKCcuLicpICYmICFwYXRoLmlzQWJzb2x1dGUocmVsYXRpdmVQYXRoKSkgcmV0dXJuO1xuXG4gIGNvbnNvbGUuZXJyb3IoY2hhbGsucmVkKGBPdXRwdXQgZGlyZWN0b3J5IG11c3QgYmUgYSBzdWJkaXJlY3Rvcnkgb2YgdGhlIHByb2plY3Qgcm9vdDogJHtvdXREaXJQYXRofWApKTtcbiAgcHJvY2Vzcy5leGl0KDEpO1xufVxuXG5mdW5jdGlvbiBidWlsZFByaXZhdGVQYWNrYWdlKHJvb3REaXJQYXRoOiBzdHJpbmcsIG91dERpclBhdGg6IHN0cmluZywgcGFja2FnZU5hbWU6IHN0cmluZyk6IFByaXZhdGVQYWNrYWdlIHtcbiAgY29uc3QgdW5zY29wZWRQYWNrYWdlTmFtZSA9IHRvVW5zY29wZWRQYWNrYWdlTmFtZShwYWNrYWdlTmFtZSk7XG4gIGNvbnN0IHNvdXJjZURpclBhdGggPSBwYXRoLmpvaW4ocm9vdERpclBhdGgsICdub2RlX21vZHVsZXMnLCAnQHdpbGxib29zdGVyJywgdW5zY29wZWRQYWNrYWdlTmFtZSk7XG4gIGlmICghZnMuZXhpc3RzU3luYyhwYXRoLmpvaW4oc291cmNlRGlyUGF0aCwgJ3BhY2thZ2UuanNvbicpKSkge1xuICAgIHRocm93IG5ldyBFcnJvcihgUHJpdmF0ZSBwYWNrYWdlIGlzIG5vdCBpbnN0YWxsZWQ6ICR7cGFja2FnZU5hbWV9ICgke3NvdXJjZURpclBhdGh9KWApO1xuICB9XG5cbiAgcmV0dXJuIHtcbiAgICBuYW1lOiBwYWNrYWdlTmFtZSxcbiAgICBzb3VyY2VEaXJQYXRoLFxuICAgIHRhcmdldERpclBhdGg6IHBhdGguam9pbihvdXREaXJQYXRoLCB1bnNjb3BlZFBhY2thZ2VOYW1lKSxcbiAgfTtcbn1cblxuZnVuY3Rpb24gZmluZFByaXZhdGVHaXREZXBlbmRlbmN5TmFtZXMocGFja2FnZUpzb246IFBhY2thZ2VKc29uKTogc3RyaW5nW10ge1xuICBjb25zdCBwYWNrYWdlTmFtZXM6IHN0cmluZ1tdID0gW107XG4gIGZvciAoY29uc3Qga2V5IG9mIGRlcGVuZGVuY3lLZXlzKSB7XG4gICAgY29uc3QgZGVwZW5kZW5jaWVzID0gcGFja2FnZUpzb25ba2V5XTtcbiAgICBpZiAoIWRlcGVuZGVuY2llcykgY29udGludWU7XG5cbiAgICBmb3IgKGNvbnN0IFtuYW1lLCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMoZGVwZW5kZW5jaWVzKSkge1xuICAgICAgaWYgKCFpc1ByaXZhdGVHaXREZXBlbmRlbmN5KHZhbHVlKSkgY29udGludWU7XG5cbiAgICAgIGlmICghbmFtZS5zdGFydHNXaXRoKCdAd2lsbGJvb3N0ZXIvJykpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBQcml2YXRlIGdpdCBkZXBlbmRlbmN5IG11c3QgYmUgYW4gQHdpbGxib29zdGVyIHBhY2thZ2U6ICR7bmFtZX1gKTtcbiAgICAgIH1cbiAgICAgIHBhY2thZ2VOYW1lcy5wdXNoKG5hbWUpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gWy4uLm5ldyBTZXQocGFja2FnZU5hbWVzKV07XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHJlcGxhY2VQcml2YXRlR2l0RGVwZW5kZW5jaWVzKFxuICBvdXREaXJQYXRoOiBzdHJpbmcsXG4gIGNvcGllZFBhY2thZ2VzOiBNYXA8c3RyaW5nLCBQcml2YXRlUGFja2FnZT5cbik6IFByb21pc2U8dm9pZD4ge1xuICBmb3IgKGNvbnN0IHByaXZhdGVQYWNrYWdlIG9mIGNvcGllZFBhY2thZ2VzLnZhbHVlcygpKSB7XG4gICAgZm9yIChjb25zdCBwYWNrYWdlSnNvblBhdGggb2YgYXdhaXQgZmluZFBhY2thZ2VKc29uUGF0aHMocHJpdmF0ZVBhY2thZ2UudGFyZ2V0RGlyUGF0aCkpIHtcbiAgICAgIGNvbnN0IHBhY2thZ2VKc29uID0gYXdhaXQgcmVhZFBhY2thZ2VKc29uKHBhY2thZ2VKc29uUGF0aCk7XG4gICAgICBpZiAoIXJlcGxhY2VQYWNrYWdlSnNvbkRlcGVuZGVuY2llcyhwYWNrYWdlSnNvblBhdGgsIHBhY2thZ2VKc29uLCBjb3BpZWRQYWNrYWdlcykpIGNvbnRpbnVlO1xuXG4gICAgICBhd2FpdCBmcy5wcm9taXNlcy53cml0ZUZpbGUocGFja2FnZUpzb25QYXRoLCBgJHtKU09OLnN0cmluZ2lmeShwYWNrYWdlSnNvbiwgdW5kZWZpbmVkLCAyKX1cXG5gLCAndXRmOCcpO1xuICAgICAgY29uc29sZS5pbmZvKGBSZXdyb3RlIHByaXZhdGUgZGVwZW5kZW5jaWVzIGluICR7cGF0aC5yZWxhdGl2ZShvdXREaXJQYXRoLCBwYWNrYWdlSnNvblBhdGgpfWApO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiByZXBsYWNlUGFja2FnZUpzb25EZXBlbmRlbmNpZXMoXG4gIHBhY2thZ2VKc29uUGF0aDogc3RyaW5nLFxuICBwYWNrYWdlSnNvbjogUGFja2FnZUpzb24sXG4gIGNvcGllZFBhY2thZ2VzOiBNYXA8c3RyaW5nLCBQcml2YXRlUGFja2FnZT5cbik6IGJvb2xlYW4ge1xuICBsZXQgY2hhbmdlZCA9IGZhbHNlO1xuICBmb3IgKGNvbnN0IGtleSBvZiBkZXBlbmRlbmN5S2V5cykge1xuICAgIGNvbnN0IGRlcGVuZGVuY2llcyA9IHBhY2thZ2VKc29uW2tleV07XG4gICAgaWYgKCFkZXBlbmRlbmNpZXMpIGNvbnRpbnVlO1xuXG4gICAgZm9yIChjb25zdCBbbmFtZSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKGRlcGVuZGVuY2llcykpIHtcbiAgICAgIGlmICghaXNQcml2YXRlR2l0RGVwZW5kZW5jeSh2YWx1ZSkpIGNvbnRpbnVlO1xuICAgICAgY29uc3QgdGFyZ2V0UGFja2FnZSA9IGNvcGllZFBhY2thZ2VzLmdldChuYW1lKTtcbiAgICAgIGlmICghdGFyZ2V0UGFja2FnZSkgY29udGludWU7XG5cbiAgICAgIGRlcGVuZGVuY2llc1tuYW1lXSA9IGBmaWxlOiR7cGF0aC5yZWxhdGl2ZShwYXRoLmRpcm5hbWUocGFja2FnZUpzb25QYXRoKSwgdGFyZ2V0UGFja2FnZS50YXJnZXREaXJQYXRoKX1gO1xuICAgICAgY2hhbmdlZCA9IHRydWU7XG4gICAgfVxuICB9XG4gIHJldHVybiBjaGFuZ2VkO1xufVxuXG5hc3luYyBmdW5jdGlvbiBmaW5kUGFja2FnZUpzb25QYXRocyhkaXJQYXRoOiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZ1tdPiB7XG4gIGNvbnN0IHBhY2thZ2VKc29uUGF0aHM6IHN0cmluZ1tdID0gW107XG4gIGZvciAoY29uc3QgZGlyZW50IG9mIGF3YWl0IGZzLnByb21pc2VzLnJlYWRkaXIoZGlyUGF0aCwgeyB3aXRoRmlsZVR5cGVzOiB0cnVlIH0pKSB7XG4gICAgaWYgKGRpcmVudC5uYW1lID09PSAnbm9kZV9tb2R1bGVzJyB8fCBkaXJlbnQubmFtZSA9PT0gJy5naXQnKSBjb250aW51ZTtcblxuICAgIGNvbnN0IGNoaWxkUGF0aCA9IHBhdGguam9pbihkaXJQYXRoLCBkaXJlbnQubmFtZSk7XG4gICAgaWYgKGRpcmVudC5pc0RpcmVjdG9yeSgpKSB7XG4gICAgICBwYWNrYWdlSnNvblBhdGhzLnB1c2goLi4uKGF3YWl0IGZpbmRQYWNrYWdlSnNvblBhdGhzKGNoaWxkUGF0aCkpKTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBpZiAoZGlyZW50LmlzRmlsZSgpICYmIGRpcmVudC5uYW1lID09PSAncGFja2FnZS5qc29uJykge1xuICAgICAgcGFja2FnZUpzb25QYXRocy5wdXNoKGNoaWxkUGF0aCk7XG4gICAgfVxuICB9XG4gIHJldHVybiBwYWNrYWdlSnNvblBhdGhzO1xufVxuXG5hc3luYyBmdW5jdGlvbiByZWFkUGFja2FnZUpzb24ocGFja2FnZUpzb25QYXRoOiBzdHJpbmcpOiBQcm9taXNlPFBhY2thZ2VKc29uPiB7XG4gIHJldHVybiBKU09OLnBhcnNlKGF3YWl0IGZzLnByb21pc2VzLnJlYWRGaWxlKHBhY2thZ2VKc29uUGF0aCwgJ3V0ZjgnKSkgYXMgUGFja2FnZUpzb247XG59XG5cbmZ1bmN0aW9uIGlzUHJpdmF0ZUdpdERlcGVuZGVuY3kodmFsdWU6IHVua25vd24pOiB2YWx1ZSBpcyBzdHJpbmcge1xuICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJyAmJiBwcml2YXRlR2l0RGVwZW5kZW5jeVBhdHRlcm4udGVzdCh2YWx1ZSk7XG59XG5cbmZ1bmN0aW9uIHRvVW5zY29wZWRQYWNrYWdlTmFtZShwYWNrYWdlTmFtZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIHBhY2thZ2VOYW1lLnJlcGxhY2UoL15Ad2lsbGJvb3N0ZXJcXC8vLCAnJyk7XG59XG5cbmZ1bmN0aW9uIHByaW50RHJ5UnVuUmVzdWx0KG91dERpclBhdGg6IHN0cmluZywgY29waWVkUGFja2FnZXM6IE1hcDxzdHJpbmcsIFByaXZhdGVQYWNrYWdlPik6IHZvaWQge1xuICBjb25zb2xlLmluZm8oYFtkcnktcnVuXSBXb3VsZCByZWNyZWF0ZSAke291dERpclBhdGh9YCk7XG4gIGZvciAoY29uc3QgcHJpdmF0ZVBhY2thZ2Ugb2YgY29waWVkUGFja2FnZXMudmFsdWVzKCkpIHtcbiAgICBjb25zb2xlLmluZm8oYFtkcnktcnVuXSBXb3VsZCBjb3B5ICR7cHJpdmF0ZVBhY2thZ2UubmFtZX06ICR7cHJpdmF0ZVBhY2thZ2Uuc291cmNlRGlyUGF0aH1gKTtcbiAgfVxuICBjb25zb2xlLmluZm8oYFtkcnktcnVuXSBXb3VsZCByZXdyaXRlIGNvcGllZCBwcml2YXRlIGdpdCBkZXBlbmRlbmNpZXMgdG8gZmlsZTouLi88bmFtZT5gKTtcbn1cbiIsImltcG9ydCB0eXBlIHsgQXJndW1lbnRzQ2FtZWxDYXNlLCBJbmZlcnJlZE9wdGlvblR5cGVzIH0gZnJvbSAneWFyZ3MnO1xuXG5pbXBvcnQgeyBzaGVsbEVzY2FwZUFyZ3VtZW50IH0gZnJvbSAnLi4vdXRpbHMvc2hlbGwuanMnO1xuXG5leHBvcnQgY29uc3Qgc2NyaXB0T3B0aW9uc0J1aWxkZXIgPSB7XG4gIHdhdGNoOiB7XG4gICAgZGVzY3JpcHRpb246ICdXaGV0aGVyIHRvIHdhdGNoIGZpbGVzJyxcbiAgICB0eXBlOiAnYm9vbGVhbicsXG4gIH0sXG4gIGFyZ3M6IHtcbiAgICBkZXNjcmlwdGlvbjogJ0FyZ3VtZW50cyBmb3IgY29yZSBjb21tYW5kJyxcbiAgICB0eXBlOiAnYXJyYXknLFxuICAgIGFsaWFzOiAnYScsXG4gICAgZGVmYXVsdDogW10sXG4gIH0sXG4gICdkb2NrZXItb3B0aW9ucyc6IHtcbiAgICBkZXNjcmlwdGlvbjogJ0FyZ3VtZW50cyBmb3IgXCJkb2NrZXIgcnVuXCInLFxuICAgIHR5cGU6ICdhcnJheScsXG4gICAgZGVmYXVsdDogW10sXG4gIH0sXG59IGFzIGNvbnN0O1xuXG5leHBvcnQgdHlwZSBTY3JpcHRBcmd2ID0gUGFydGlhbDxBcmd1bWVudHNDYW1lbENhc2U8SW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2Ygc2NyaXB0T3B0aW9uc0J1aWxkZXI+Pj4gJiB7XG4gICctLSc/OiBzdHJpbmdbXTtcbiAgbm9ybWFsaXplZEFyZ3NUZXh0Pzogc3RyaW5nO1xuICBub3JtYWxpemVkRG9ja2VyT3B0aW9uc1RleHQ/OiBzdHJpbmc7XG4gIHNpbGVudD86IGJvb2xlYW47XG4gIHZlcmJvc2U/OiBib29sZWFuO1xufTtcblxuZXhwb3J0IGZ1bmN0aW9uIG5vcm1hbGl6ZUFyZ3MoXG4gIGFyZ3Y6IFBhcnRpYWw8QXJndW1lbnRzQ2FtZWxDYXNlPEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIHNjcmlwdE9wdGlvbnNCdWlsZGVyPj4+ICYgeyAnLS0nPzogc3RyaW5nW10gfVxuKTogdm9pZCB7XG4gIChhcmd2IGFzIFNjcmlwdEFyZ3YpLm5vcm1hbGl6ZWRBcmdzVGV4dCA9IFsuLi4oYXJndi5hcmdzID8/IFtdKSwgLi4uKGFyZ3YuXz8uc2xpY2UoMSkgPz8gW10pLCAuLi4oYXJndlsnLS0nXSA/PyBbXSldXG4gICAgLm1hcCgoYXJnKSA9PiBzaGVsbEVzY2FwZUFyZ3VtZW50KFN0cmluZyhhcmcpKSlcbiAgICAuam9pbignICcpO1xuICAoYXJndiBhcyBTY3JpcHRBcmd2KS5ub3JtYWxpemVkRG9ja2VyT3B0aW9uc1RleHQgPSAoYXJndi5kb2NrZXJPcHRpb25zID8/IFtdKVxuICAgIC5tYXAoKGFyZykgPT4gc2hlbGxFc2NhcGVBcmd1bWVudChTdHJpbmcoYXJnKSkpXG4gICAgLmpvaW4oJyAnKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHRvRGV2TnVsbChhcmd2OiB1bmtub3duKTogc3RyaW5nIHtcbiAgcmV0dXJuIChhcmd2IGFzIHsgc2lsZW50OiBib29sZWFuIH0pLnNpbGVudCA/IGAgPiAvZGV2L251bGxgIDogJyc7XG59XG4iLCJpbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgdHlwZSB7IFByb2plY3QgfSBmcm9tICcuLi9wcm9qZWN0LmpzJztcbmltcG9ydCB7IHNwYXduU3luY09uRXhpdCB9IGZyb20gJy4uL3V0aWxzL3Byb2Nlc3MuanMnO1xuXG4vKipcbiAqIEEgY29sbGVjdGlvbiBvZiBzY3JpcHRzIGZvciBleGVjdXRpbmcgRG9ja2VyIGNvbW1hbmRzLlxuICogTm90ZSB0aGF0IGBZQVJOIHp6emAgaXMgcmVwbGFjZWQgd2l0aCBgeWFybiB6enpgIG9yIGBub2RlX21vZHVsZXMvLmJpbi96enpgLlxuICovXG5jbGFzcyBEb2NrZXJTY3JpcHRzIHtcbiAgYnVpbGRJbWFnZShwcm9qZWN0OiBQcm9qZWN0LCB2ZXJzaW9uOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIC8vIGUuZy4gY29kaW5nLWJvb3N0ZXIgdXNlcyBgXCJkb2NrZXIvYnVpbGQvcHJlcGFyZVwiOiBcInRvdWNoIGRyaWxsLXVzZXJzLmNzdlwiLGBcbiAgICBjb25zdCBwcmVmaXggPSBwcm9qZWN0LmRvY2tlclBhY2thZ2VKc29uLnNjcmlwdHM/LlsnZG9ja2VyL2J1aWxkL3ByZXBhcmUnXVxuICAgICAgPyAnWUFSTiBydW4gZG9ja2VyL2J1aWxkL3ByZXBhcmUgJiYgJ1xuICAgICAgOiAnJztcbiAgICBjb25zdCBtaXNlQWdlS2V5U2VjcmV0T3B0aW9uID0gcHJvamVjdC5lbnYuTUlTRV9BR0VfS0VZXG4gICAgICA/ICdcXG4gICAgICAgIC0tc2VjcmV0IGlkPW1pc2VfYWdlX2tleSxlbnY9TUlTRV9BR0VfS0VZJ1xuICAgICAgOiAnJztcbiAgICByZXR1cm4gYGNkICR7cGF0aC5kaXJuYW1lKHByb2plY3QuZmluZEZpbGUoJ0RvY2tlcmZpbGUnKSl9XG4gICAgJiYgJHtwcmVmaXh9WUFSTiB3YiBvcHRpbWl6ZUZvckRvY2tlckJ1aWxkIC0tb3V0c2lkZVxuICAgICYmIFlBUk4gd2IgcmV0cnkgLS0gZG9ja2VyIGJ1aWxkIC10ICR7cHJvamVjdC5kb2NrZXJJbWFnZU5hbWV9XG4gICAgICAgIC0tYnVpbGQtYXJnIEFSQ0g9JChbICQodW5hbWUgLW0pID0gJ2FybTY0JyBdICYmIGVjaG8gYXJtNjQgfHwgZWNobyB4ODZfNjQpXG4gICAgICAgIC0tYnVpbGQtYXJnIFdCX0VOVj0ke3Byb2plY3QuZW52LldCX0VOVn1cbiAgICAgICAgLS1idWlsZC1hcmcgV0JfVkVSU0lPTj0ke3ZlcnNpb259JHttaXNlQWdlS2V5U2VjcmV0T3B0aW9ufSAuYDtcbiAgfVxuXG4gIHN0b3BBbmRTdGFydChwcm9qZWN0OiBQcm9qZWN0LCBhZGRpdGlvbmFsT3B0aW9ucyA9ICcnLCBhZGRpdGlvbmFsQXJncyA9ICcnKTogc3RyaW5nIHtcbiAgICByZXR1cm4gYCR7dGhpcy5zdG9wKHByb2plY3QpfSAmJiAke3RoaXMuc3RhcnQocHJvamVjdCwgYWRkaXRpb25hbE9wdGlvbnMsIGFkZGl0aW9uYWxBcmdzKX1gO1xuICB9XG5cbiAgc3RhcnQocHJvamVjdDogUHJvamVjdCwgYWRkaXRpb25hbE9wdGlvbnMgPSAnJywgYWRkaXRpb25hbEFyZ3MgPSAnJyk6IHN0cmluZyB7XG4gICAgc3Bhd25TeW5jT25FeGl0KHRoaXMuc3RvcChwcm9qZWN0KSwgcHJvamVjdCk7XG4gICAgY29uc3QgYWxsb2NhdGVUdHkgPSBhZGRpdGlvbmFsQXJncy5pbmNsdWRlcygnL2Jpbi9iYXNoJyk7XG4gICAgY29uc3QgbWlzZUFnZUtleUVudk9wdGlvbiA9IHByb2plY3QuZW52Lk1JU0VfQUdFX0tFWSA/ICctLWVudiBNSVNFX0FHRV9LRVkgJyA6ICcnO1xuICAgIHJldHVybiBgZG9ja2VyIHJ1biAtLXJtICR7YWxsb2NhdGVUdHkgPyAnLWl0ICcgOiAnJ30ke21pc2VBZ2VLZXlFbnZPcHRpb259LS1wdWJsaXNoICR7cHJvamVjdC5lbnYuUE9SVH06ODA4MCAtLW5hbWUgJHtwcm9qZWN0LmRvY2tlckltYWdlTmFtZX0gJHthZGRpdGlvbmFsT3B0aW9uc30gJHtwcm9qZWN0LmRvY2tlckltYWdlTmFtZX0gJHthZGRpdGlvbmFsQXJnc31gO1xuICB9XG5cbiAgc3RvcChwcm9qZWN0OiBQcm9qZWN0KTogc3RyaW5nIHtcbiAgICByZXR1cm4gYGRvY2tlciBybSAtZiAke3Byb2plY3QuZG9ja2VySW1hZ2VOYW1lfSA+IC9kZXYvbnVsbCAyPiYxIHx8IHRydWVgO1xuICB9XG5cbiAgc3RvcEFsbCgpOiBzdHJpbmcge1xuICAgIHJldHVybiBgdHJ1ZSAkKGRvY2tlciBybSAtZiAkKGRvY2tlciBwcyAtcSkgMj4gL2Rldi9udWxsKWA7XG4gIH1cbn1cblxuZXhwb3J0IGNvbnN0IGRvY2tlclNjcmlwdHMgPSBuZXcgRG9ja2VyU2NyaXB0cygpO1xuIiwiaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHR5cGUgeyBUZXN0QXJndiB9IGZyb20gJy4uLy4uL2NvbW1hbmRzL3Rlc3QuanMnO1xuaW1wb3J0IHR5cGUgeyBQcm9qZWN0IH0gZnJvbSAnLi4vLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQgeyBpc1Byb2plY3RFbnZpcm9ubWVudCB9IGZyb20gJy4uLy4uL3Byb2plY3QuanMnO1xuaW1wb3J0IHsgYnVpbGRFbnZSZWFkZXJPcHRpb25BcmdzIH0gZnJvbSAnLi4vLi4vc2hhcmVkT3B0aW9uc0J1aWxkZXIuanMnO1xuaW1wb3J0IHsgY2hlY2tBbmRLaWxsUG9ydFByb2Nlc3MgfSBmcm9tICcuLi8uLi91dGlscy9wb3J0LmpzJztcbmltcG9ydCB7IGJ1aWxkU2hlbGxDb21tYW5kLCBidWlsZFNoZWxsRW52aXJvbm1lbnRBc3NpZ25tZW50IH0gZnJvbSAnLi4vLi4vdXRpbHMvc2hlbGwuanMnO1xuaW1wb3J0IHtcbiAgZmluZEQxTWlncmF0aW9uc0RpclBhdGgsXG4gIGZpbmRXcmFuZ2xlckNvbmZpZ1BhdGgsXG4gIGdldExvY2FsV3JhbmdsZXJTdGF0ZURpcixcbiAgd3JhcFdpdGhMb2NhbEQxRGF0YWJhc2VVcmwsXG59IGZyb20gJy4uLy4uL3V0aWxzL3dyYW5nbGVyLmpzJztcbmltcG9ydCB0eXBlIHsgU2NyaXB0QXJndiB9IGZyb20gJy4uL2J1aWxkZXIuanMnO1xuaW1wb3J0IHsgdG9EZXZOdWxsIH0gZnJvbSAnLi4vYnVpbGRlci5qcyc7XG5pbXBvcnQgeyBkb2NrZXJTY3JpcHRzIH0gZnJvbSAnLi4vZG9ja2VyU2NyaXB0cy5qcyc7XG5pbXBvcnQgeyBkcml6emxlU2NyaXB0cyB9IGZyb20gJy4uL2RyaXp6bGVTY3JpcHRzLmpzJztcbmltcG9ydCB7IHByaXNtYVNjcmlwdHMgfSBmcm9tICcuLi9wcmlzbWFTY3JpcHRzLmpzJztcblxuZXhwb3J0IGludGVyZmFjZSBUZXN0RTJFT3B0aW9ucyB7XG4gIC8qKiAnLS1lMmUgZ2VuZXJhdGUnIGNhbGxzICdjb2RlZ2VuIGh0dHA6Ly9sb2NhbGhvc3Q6ODA4MCcgKi9cbiAgcGxheXdyaWdodEFyZ3M/OiBzdHJpbmdbXTtcbiAgLyoqIFJhdyBQbGF5d3JpZ2h0IGFyZ3MgZm9yd2FyZGVkIGFmdGVyIGB3YiB0ZXN0IC0tIC4uLmAgKi9cbiAgZm9yd2FyZGVkUGxheXdyaWdodEFyZ3M/OiBzdHJpbmdbXTtcbn1cblxuLyoqXG4gKiBBIGNvbGxlY3Rpb24gb2Ygc2NyaXB0cyBmb3IgZXhlY3V0aW5nIGFuIGFwcC5cbiAqIE5vdGUgdGhhdCBZQVJOIHp6emAgaXMgcmVwbGFjZWQgd2l0aCBgeWFybiB6enpgIG9yIGBub2RlX21vZHVsZXMvLmJpbi96enpgLlxuICovXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgQmFzZVNjcmlwdHMge1xuICBwcml2YXRlIHJlYWRvbmx5IHNob3VsZFdhaXRBbmRPcGVuQXBwOiBib29sZWFuO1xuICBwcm90ZWN0ZWQgY29uc3RydWN0b3Ioc2hvdWxkV2FpdEFuZE9wZW5BcHA6IGJvb2xlYW4pIHtcbiAgICB0aGlzLnNob3VsZFdhaXRBbmRPcGVuQXBwID0gc2hvdWxkV2FpdEFuZE9wZW5BcHA7XG4gIH1cblxuICBidWlsZERvY2tlcihwcm9qZWN0OiBQcm9qZWN0LCB2ZXJzaW9uOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIHJldHVybiBkb2NrZXJTY3JpcHRzLmJ1aWxkSW1hZ2UocHJvamVjdCwgdmVyc2lvbik7XG4gIH1cblxuICAvLyAtLS0tLS0tLS0tLS0gU1RBUlQ6IHN0YXJ0IGNvbW1hbmRzIC0tLS0tLS0tLS0tLVxuICBhc3luYyBzdGFydERldihwcm9qZWN0OiBQcm9qZWN0LCBhcmd2OiBTY3JpcHRBcmd2KTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICBhd2FpdCBjaGVja0FuZEtpbGxQb3J0UHJvY2Vzcyhwcm9qZWN0LmVudi5QT1JULCBwcm9qZWN0KTtcbiAgICBpZiAoIXRoaXMuc2hvdWxkV2FpdEFuZE9wZW5BcHApIHJldHVybiB0aGlzLnN0YXJ0RGV2UHJvdGVjdGVkKHByb2plY3QsIGFyZ3YpO1xuXG4gICAgcmV0dXJuIGJ1aWxkU2hlbGxDb21tYW5kKFtcbiAgICAgICdZQVJOJyxcbiAgICAgICd3YicsXG4gICAgICAnY29uY3VycmVudGx5JyxcbiAgICAgIC4uLmJ1aWxkRW52UmVhZGVyT3B0aW9uQXJncyhhcmd2KSxcbiAgICAgICctLWtpbGwtb3RoZXJzLW9uLWZhaWwnLFxuICAgICAgdGhpcy5zdGFydERldlByb3RlY3RlZChwcm9qZWN0LCBhcmd2KSxcbiAgICAgIHRoaXMud2FpdEFuZE9wZW5BcHAocHJvamVjdCksXG4gICAgXSk7XG4gIH1cbiAgYXN5bmMgc3RhcnRQcm9kdWN0aW9uKHByb2plY3Q6IFByb2plY3QsIGFyZ3Y6IFNjcmlwdEFyZ3YpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIGF3YWl0IGNoZWNrQW5kS2lsbFBvcnRQcm9jZXNzKHByb2plY3QuZW52LlBPUlQsIHByb2plY3QpO1xuICAgIGlmICghdGhpcy5zaG91bGRXYWl0QW5kT3BlbkFwcCkgcmV0dXJuIHRoaXMuc3RhcnRQcm9kdWN0aW9uUHJvdGVjdGVkKHByb2plY3QsIGFyZ3YpO1xuXG4gICAgcmV0dXJuIGJ1aWxkU2hlbGxDb21tYW5kKFtcbiAgICAgICdZQVJOJyxcbiAgICAgICd3YicsXG4gICAgICAnY29uY3VycmVudGx5JyxcbiAgICAgIC4uLmJ1aWxkRW52UmVhZGVyT3B0aW9uQXJncyhhcmd2KSxcbiAgICAgICctLWtpbGwtb3RoZXJzLW9uLWZhaWwnLFxuICAgICAgdGhpcy5zdGFydFByb2R1Y3Rpb25Qcm90ZWN0ZWQocHJvamVjdCwgYXJndiksXG4gICAgICB0aGlzLndhaXRBbmRPcGVuQXBwKHByb2plY3QpLFxuICAgIF0pO1xuICB9XG4gIGFzeW5jIHN0YXJ0VGVzdChwcm9qZWN0OiBQcm9qZWN0LCBhcmd2OiBTY3JpcHRBcmd2KTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICBhd2FpdCBjaGVja0FuZEtpbGxQb3J0UHJvY2Vzcyhwcm9qZWN0LmVudi5QT1JULCBwcm9qZWN0KTtcbiAgICByZXR1cm4gdGhpcy5zdGFydFByb2R1Y3Rpb25Qcm90ZWN0ZWQocHJvamVjdCwgYXJndik7XG4gIH1cbiAgYXN5bmMgc3RhcnREb2NrZXIocHJvamVjdDogUHJvamVjdCwgYXJndjogU2NyaXB0QXJndik6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgYXdhaXQgY2hlY2tBbmRLaWxsUG9ydFByb2Nlc3MocHJvamVjdC5lbnYuUE9SVCwgcHJvamVjdCk7XG4gICAgaWYgKCF0aGlzLnNob3VsZFdhaXRBbmRPcGVuQXBwKSB7XG4gICAgICByZXR1cm4gYCR7dGhpcy5idWlsZERvY2tlcihwcm9qZWN0LCAnZGV2ZWxvcG1lbnQnKX1cbiAgICAgICYmICR7ZG9ja2VyU2NyaXB0cy5zdG9wQW5kU3RhcnQocHJvamVjdCwgYXJndi5ub3JtYWxpemVkRG9ja2VyT3B0aW9uc1RleHQgPz8gJycsIGFyZ3Yubm9ybWFsaXplZEFyZ3NUZXh0ID8/ICcnKX1gO1xuICAgIH1cblxuICAgIHJldHVybiBgJHt0aGlzLmJ1aWxkRG9ja2VyKHByb2plY3QsICdkZXZlbG9wbWVudCcpfVxuICAgICAgJiYgJHtidWlsZFNoZWxsQ29tbWFuZChbXG4gICAgICAgICdZQVJOJyxcbiAgICAgICAgJ3diJyxcbiAgICAgICAgJ2NvbmN1cnJlbnRseScsXG4gICAgICAgIC4uLmJ1aWxkRW52UmVhZGVyT3B0aW9uQXJncyhhcmd2KSxcbiAgICAgICAgJy0ta2lsbC1vdGhlcnMtb24tZmFpbCcsXG4gICAgICAgIGRvY2tlclNjcmlwdHMuc3RvcEFuZFN0YXJ0KHByb2plY3QsIGFyZ3Yubm9ybWFsaXplZERvY2tlck9wdGlvbnNUZXh0ID8/ICcnLCBhcmd2Lm5vcm1hbGl6ZWRBcmdzVGV4dCA/PyAnJyksXG4gICAgICAgIHRoaXMud2FpdEFuZE9wZW5BcHAocHJvamVjdCksXG4gICAgICBdKX1gO1xuICB9XG5cbiAgcHJvdGVjdGVkIGFic3RyYWN0IHN0YXJ0RGV2UHJvdGVjdGVkKF86IFByb2plY3QsIGFyZ3Y6IFNjcmlwdEFyZ3YpOiBzdHJpbmc7XG4gIHByb3RlY3RlZCBzdGFydFByb2R1Y3Rpb25Qcm90ZWN0ZWQocHJvamVjdDogUHJvamVjdCwgYXJndjogU2NyaXB0QXJndik6IHN0cmluZyB7XG4gICAgY29uc3QgY3VzdG9tU3RhcnRTY3JpcHRQYXRoID0gZmluZEN1c3RvbVByb2R1Y3Rpb25TdGFydFNjcmlwdFBhdGgocHJvamVjdCk7XG4gICAgaWYgKGN1c3RvbVN0YXJ0U2NyaXB0UGF0aCkge1xuICAgICAgY29uc3Qgc3RhcnRDb21tYW5kID1cbiAgICAgICAgYCR7YnVpbGRTaGVsbENvbW1hbmQoWydiYXNoJywgY3VzdG9tU3RhcnRTY3JpcHRQYXRoXSl9ICR7YXJndi5ub3JtYWxpemVkQXJnc1RleHQgPz8gJyd9YC50cmltKCk7XG4gICAgICAvLyBBIHN0YXJ0IHNjcmlwdCBmb3VuZCBhdCB0aGUgbW9ub3JlcG8gcm9vdCAoY2YuIFByb2plY3QuZmluZEZpbGUpIGlzIHdyaXR0ZW4gdG8gcnVuIGZyb21cbiAgICAgIC8vIHRoZSByb290LCBsaWtlIERvY2tlcidzIFdPUktESVIsIHNvIGl0cyBjd2QgbXVzdCBiZSB0aGUgZGlyZWN0b3J5IGNvbnRhaW5pbmcgc2NyaXB0cy8uXG4gICAgICBjb25zdCBzY3JpcHRSb290RGlyUGF0aCA9IHBhdGguZGlybmFtZShwYXRoLmRpcm5hbWUoY3VzdG9tU3RhcnRTY3JpcHRQYXRoKSk7XG4gICAgICByZXR1cm4gdGhpcy5idWlsZFByb2R1Y3Rpb25Db21tYW5kKHByb2plY3QsIGFyZ3YsIFtcbiAgICAgICAgcHJvamVjdC5idWlsZENvbW1hbmQsXG4gICAgICAgIHNjcmlwdFJvb3REaXJQYXRoID09PSBwcm9qZWN0LmRpclBhdGhcbiAgICAgICAgICA/IHN0YXJ0Q29tbWFuZFxuICAgICAgICAgIDogYCgke2J1aWxkU2hlbGxDb21tYW5kKFsnY2QnLCBzY3JpcHRSb290RGlyUGF0aF0pfSAmJiAke3N0YXJ0Q29tbWFuZH0pYCxcbiAgICAgIF0pO1xuICAgIH1cblxuICAgIGNvbnN0IGVjb3N5c3RlbUNvbmZpZ1BhdGggPSBmaW5kRWNvc3lzdGVtQ29uZmlnUGF0aChwcm9qZWN0KTtcbiAgICBjb25zdCBjb21tYW5kcyA9IGVjb3N5c3RlbUNvbmZpZ1BhdGhcbiAgICAgID8gW3Byb2plY3QuYnVpbGRDb21tYW5kLCBgcG0yLXJ1bnRpbWUgc3RhcnQgLS1uby1hdXRvcmVzdGFydCAke2Vjb3N5c3RlbUNvbmZpZ1BhdGh9YF1cbiAgICAgIDogdGhpcy5idWlsZERlZmF1bHRQcm9kdWN0aW9uU3RhcnRDb21tYW5kcyhwcm9qZWN0LCBhcmd2KTtcblxuICAgIHJldHVybiB0aGlzLmJ1aWxkUHJvZHVjdGlvbkNvbW1hbmQocHJvamVjdCwgYXJndiwgY29tbWFuZHMpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGJ1aWxkRGVmYXVsdFByb2R1Y3Rpb25TdGFydENvbW1hbmRzKHByb2plY3Q6IFByb2plY3QsIGFyZ3Y6IFNjcmlwdEFyZ3YpOiBzdHJpbmdbXSB7XG4gICAgcmV0dXJuIFtcbiAgICAgIHByb2plY3QuYnVpbGRDb21tYW5kLFxuICAgICAgYCR7cHJvamVjdC5pc0J1bkF2YWlsYWJsZSA/ICdidW4nIDogJ25vZGUnfSBkaXN0L2luZGV4LmpzICR7YXJndi5ub3JtYWxpemVkQXJnc1RleHQgPz8gJyd9YC50cmltKCksXG4gICAgXTtcbiAgfVxuXG4gIHByb3RlY3RlZCBidWlsZFByb2R1Y3Rpb25Db21tYW5kKHByb2plY3Q6IFByb2plY3QsIGFyZ3Y6IFNjcmlwdEFyZ3YsIGNvbW1hbmRzOiBzdHJpbmdbXSk6IHN0cmluZyB7XG4gICAgLy8gVGVzdC1lbnZpcm9ubWVudCB3cmFuZ2xlciBzdGF0ZSBpcyBkaXNwb3NhYmxlOyB3aXBlIGl0IGVudGlyZWx5IChub3QganVzdCBEMSkgYmVmb3JlXG4gICAgLy8gbWlncmF0aW5nLCBzaW5jZSBzdGFsZSBLViBjYWNoZSBlbnRyaWVzIG9yIER1cmFibGUgT2JqZWN0IHN0b3JhZ2UgY2FuIGJyZWFrIGUyZSB0ZXN0cy5cbiAgICBjb25zdCB3cmFuZ2xlclN0YXRlV2lwZUNvbW1hbmRzID1cbiAgICAgIGlzUHJvamVjdEVudmlyb25tZW50KHByb2plY3QsICd0ZXN0JykgJiYgZmluZFdyYW5nbGVyQ29uZmlnUGF0aChwcm9qZWN0KVxuICAgICAgICA/IFtgcm0gLVJmIFwiJHtnZXRMb2NhbFdyYW5nbGVyU3RhdGVEaXIocHJvamVjdCl9XCJgXVxuICAgICAgICA6IFtdO1xuICAgIC8vIEEgcHJvamVjdCB3aG9zZSBEMSBiaW5kaW5ncyBjYXJyeSB3cmFuZ2xlci1uYXRpdmUgbWlncmF0aW9ucyBhcHBsaWVzIHRoZW0gd2l0aCB3cmFuZ2xlclxuICAgIC8vIChzZWUgV29ya2Vyc1NjcmlwdHMgLyBidWlsZEQxTWlncmF0aW9uc0FwcGx5Q29tbWFuZCkuIFJ1bm5pbmcgZHJpenpsZS1raXQgbWlncmF0ZSBhZ2FpbnN0XG4gICAgLy8gdGhlIHNhbWUgbG9jYWwgRDEgd291bGQgYXBwbHkgdGhlIHNhbWUgU1FMIHR3aWNlIOKAlCBkcml6emxlJ3MgZ2VuZXJhdGVkIHN0YXRlbWVudHMgYXJlIG5vdFxuICAgIC8vIGlkZW1wb3RlbnQgKGBDUkVBVEUgSU5ERVhgIHdpdGhvdXQgSUYgTk9UIEVYSVNUUykg4oCUIHNvIGRyaXp6bGUgc3RheXMgT1JNLW9ubHkgdGhlcmUuXG4gICAgY29uc3QgbWlncmF0ZXNEMVdpdGhXcmFuZ2xlciA9ICEhZmluZEQxTWlncmF0aW9uc0RpclBhdGgocHJvamVjdCk7XG4gICAgY29uc3QgbWlncmF0aW9uQ29tbWFuZHMgPSBbXG4gICAgICAuLi53cmFuZ2xlclN0YXRlV2lwZUNvbW1hbmRzLFxuICAgICAgLi4uKHByb2plY3QuaGFzUHJpc21hID8gW3ByaXNtYVNjcmlwdHMubWlncmF0ZShwcm9qZWN0KV0gOiBbXSksXG4gICAgICAuLi4ocHJvamVjdC5oYXNEcml6emxlICYmICFtaWdyYXRlc0QxV2l0aFdyYW5nbGVyXG4gICAgICAgID8gW3dyYXBXaXRoTG9jYWxEMURhdGFiYXNlVXJsKHByb2plY3QsIGRyaXp6bGVTY3JpcHRzLm1pZ3JhdGVGb3JTdGFydChwcm9qZWN0KSldXG4gICAgICAgIDogW10pLFxuICAgIF07XG4gICAgLy8gU3BsaXR0aW5nIG1heSBjdXQgdGhyb3VnaCBhIGAoY2Qg4oCmICYmIOKApilgIHN1YnNoZWxsLCBidXQgcmVqb2luaW5nIHdpdGggJyAmJiAnIGFuZCBwZXItcGllY2VcbiAgICAvLyByZWRpcmVjdHMga2VlcHMgdGhlIHNjcmlwdCB2YWxpZCwgYW5kIHdiLWdlbmVyYXRlZCBwYXRocyBuZXZlciBjb250YWluICcmJicuXG4gICAgcmV0dXJuIFsuLi5taWdyYXRpb25Db21tYW5kcy5mbGF0TWFwKChjbWQpID0+IGNtZC5zcGxpdCgnJiYnKSksIC4uLmNvbW1hbmRzXVxuICAgICAgLmZpbHRlcihCb29sZWFuKVxuICAgICAgLm1hcCgoY21kKSA9PiBgJHtjbWR9ICR7dG9EZXZOdWxsKGFyZ3YpfWAudHJpbSgpKVxuICAgICAgLmpvaW4oJyAmJiAnKTtcbiAgfVxuICAvLyAtLS0tLS0tLS0tLS0gRU5EOiBzdGFydCBjb21tYW5kcyAtLS0tLS0tLS0tLS1cblxuICAvLyAtLS0tLS0tLS0tLS0gU1RBUlQ6IHRlc3QgKGUyZSkgY29tbWFuZHMgLS0tLS0tLS0tLS0tXG4gIHRlc3RFMkVEZXYocHJvamVjdDogUHJvamVjdCwgYXJndjogVGVzdEFyZ3YsIG9wdGlvbnM6IFRlc3RFMkVPcHRpb25zKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICByZXR1cm4gdGhpcy50ZXN0RTJFUHJvdGVjdGVkKHByb2plY3QsIGFyZ3YsIHRoaXMuc3RhcnREZXZQcm90ZWN0ZWQocHJvamVjdCwgYXJndiksIG9wdGlvbnMpO1xuICB9XG4gIHRlc3RFMkVQcm9kdWN0aW9uKHByb2plY3Q6IFByb2plY3QsIGFyZ3Y6IFRlc3RBcmd2LCBvcHRpb25zOiBUZXN0RTJFT3B0aW9ucyk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgcmV0dXJuIHRoaXMudGVzdEUyRVByb3RlY3RlZChwcm9qZWN0LCBhcmd2LCB0aGlzLnN0YXJ0UHJvZHVjdGlvblByb3RlY3RlZChwcm9qZWN0LCBhcmd2KSwgb3B0aW9ucyk7XG4gIH1cbiAgdGVzdEUyRURvY2tlcihwcm9qZWN0OiBQcm9qZWN0LCBhcmd2OiBUZXN0QXJndiwgb3B0aW9uczogVGVzdEUyRU9wdGlvbnMpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIHJldHVybiB0aGlzLnRlc3RFMkVQcm90ZWN0ZWQocHJvamVjdCwgYXJndiwgZG9ja2VyU2NyaXB0cy5zdG9wQW5kU3RhcnQocHJvamVjdCksIG9wdGlvbnMpO1xuICB9XG4gIGFzeW5jIHRlc3RTdGFydChwcm9qZWN0OiBQcm9qZWN0LCBhcmd2OiBTY3JpcHRBcmd2KTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICBwcm9qZWN0LmVudi5QT1JUIHx8PSAnMzAwMCc7XG4gICAgYXdhaXQgY2hlY2tBbmRLaWxsUG9ydFByb2Nlc3MocHJvamVjdC5lbnYuUE9SVCwgcHJvamVjdCk7XG4gICAgLy8gVXNlIGVtcHR5IE5PREVfRU5WIHRvIGF2b2lkIFwicHJvZHVjdGlvblwiIG1vZGUgaW4gc29tZSBmcmFtZXdvcmtzIGxpa2UgQmxpdHouanMuXG4gICAgcmV0dXJuIGAke2J1aWxkU2hlbGxFbnZpcm9ubWVudEFzc2lnbm1lbnQoJ05PREVfRU5WJywgJycpfSAke2J1aWxkU2hlbGxDb21tYW5kKFtcbiAgICAgICdZQVJOJyxcbiAgICAgICd3YicsXG4gICAgICAnY29uY3VycmVudGx5JyxcbiAgICAgIC4uLmJ1aWxkRW52UmVhZGVyT3B0aW9uQXJncyhhcmd2KSxcbiAgICAgICctLWtpbGwtb3RoZXJzJyxcbiAgICAgICctLXN1Y2Nlc3MnLFxuICAgICAgJ2ZpcnN0JyxcbiAgICAgIHRoaXMuc3RhcnREZXZQcm90ZWN0ZWQocHJvamVjdCwgYXJndiksXG4gICAgICB0aGlzLndhaXRBcHAocHJvamVjdCksXG4gICAgXSl9YDtcbiAgfVxuXG4gIGFzeW5jIHRlc3RFMkVQcm90ZWN0ZWQoXG4gICAgcHJvamVjdDogUHJvamVjdCxcbiAgICBhcmd2OiBUZXN0QXJndixcbiAgICBzdGFydENvbW1hbmQ6IHN0cmluZyxcbiAgICB7IGZvcndhcmRlZFBsYXl3cmlnaHRBcmdzID0gW10sIHBsYXl3cmlnaHRBcmdzID0gWyd0ZXN0JywgJ3Rlc3QvZTJlLyddIH06IFRlc3RFMkVPcHRpb25zXG4gICk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgcHJvamVjdC5lbnYuUE9SVCB8fD0gJzMwMDAnO1xuICAgIGNvbnN0IHBvcnQgPSBhd2FpdCBjaGVja0FuZEtpbGxQb3J0UHJvY2Vzcyhwcm9qZWN0LmVudi5QT1JULCBwcm9qZWN0KTtcbiAgICBjb25zdCBzdWZmaXggPSBwcm9qZWN0LnBhY2thZ2VKc29uLnNjcmlwdHM/LlsndGVzdC9lMmUtYWRkaXRpb25hbCddID8gJyAmJiBZQVJOIHRlc3QvZTJlLWFkZGl0aW9uYWwnIDogJyc7XG4gICAgY29uc3QgcGxheXdyaWdodENvbW1hbmQgPSBidWlsZFBsYXl3cmlnaHRDb21tYW5kKHBsYXl3cmlnaHRBcmdzLCBhcmd2LnRhcmdldHMsIGFyZ3YuYmFpbCwgZm9yd2FyZGVkUGxheXdyaWdodEFyZ3MpO1xuICAgIGlmIChwcm9qZWN0LnNraXBMYXVuY2hpbmdTZXJ2ZXJGb3JQbGF5d3JpZ2h0KSB7XG4gICAgICByZXR1cm4gYCR7cGxheXdyaWdodENvbW1hbmR9JHtzdWZmaXh9YDtcbiAgICB9XG5cbiAgICByZXR1cm4gYnVpbGRTaGVsbENvbW1hbmQoW1xuICAgICAgJ1lBUk4nLFxuICAgICAgJ3diJyxcbiAgICAgICdjb25jdXJyZW50bHknLFxuICAgICAgLi4uYnVpbGRFbnZSZWFkZXJPcHRpb25BcmdzKGFyZ3YpLFxuICAgICAgJy0ta2lsbC1vdGhlcnMnLFxuICAgICAgJy0tc3VjY2VzcycsXG4gICAgICAnZmlyc3QnLFxuICAgICAgYCR7c3RhcnRDb21tYW5kfSAmJiBleGl0IDFgLFxuICAgICAgYHdhaXQtb24gLXQgNjAwMDAwIC1pIDIwMDAgaHR0cC1nZXQ6Ly8xMjcuMC4wLjE6JHtwb3J0fVxuICAgICAgICAmJiAke3BsYXl3cmlnaHRDb21tYW5kfSR7c3VmZml4fWAsXG4gICAgXSk7XG4gIH1cbiAgLy8gLS0tLS0tLS0tLS0tIEVORDogdGVzdCAoZTJlKSBjb21tYW5kcyAtLS0tLS0tLS0tLS1cblxuICB0ZXN0VW5pdChwcm9qZWN0OiBQcm9qZWN0LCBhcmd2OiBUZXN0QXJndik6IHN0cmluZyB7XG4gICAgY29uc3QgdGFyZ2V0cyA9IGFyZ3YudGFyZ2V0cz8ubWFwKFN0cmluZyk7XG4gICAgaWYgKHByb2plY3QuaGFzVml0ZXN0KSB7XG4gICAgICAvLyBTaW5jZSB0aGlzIGNvbW1hbmQgaXMgcmVmZXJyZWQgZnJvbSBvdGhlciBjb21tYW5kcywgd2UgaGF2ZSB0byB1c2UgXCJ2aXRlc3QgcnVuXCIgKG5vbi1pbnRlcmFjdGl2ZSBtb2RlKS5cbiAgICAgIHJldHVybiBidWlsZFNoZWxsQ29tbWFuZChbXG4gICAgICAgICdZQVJOJyxcbiAgICAgICAgJ3ZpdGVzdCcsXG4gICAgICAgICdydW4nLFxuICAgICAgICAuLi4odGFyZ2V0cz8ubGVuZ3RoID8gdGFyZ2V0cyA6IFsndGVzdC91bml0LyddKSxcbiAgICAgICAgJy0tcGFzc1dpdGhOb1Rlc3RzJyxcbiAgICAgICAgJy0tYWxsb3dPbmx5JyxcbiAgICAgICAgJy0td2F0Y2g9ZmFsc2UnLFxuICAgICAgICAuLi4oYXJndi5iYWlsID8gWyctLWJhaWw9MSddIDogW10pLFxuICAgICAgXSk7XG4gICAgfSBlbHNlIGlmIChwcm9qZWN0LmlzQnVuQXZhaWxhYmxlKSB7XG4gICAgICByZXR1cm4gYnVpbGRTaGVsbENvbW1hbmQoW1xuICAgICAgICAnYnVuJyxcbiAgICAgICAgJ3Rlc3QnLFxuICAgICAgICAuLi4odGFyZ2V0cz8ubGVuZ3RoID8gdGFyZ2V0cyA6IFsndGVzdC91bml0LyddKSxcbiAgICAgICAgLi4uKGFyZ3YuYmFpbCA/IFsnLS1iYWlsJ10gOiBbXSksXG4gICAgICBdKTtcbiAgICB9XG4gICAgcmV0dXJuICdlY2hvIFwiTm8gdGVzdHMuXCInO1xuICB9XG5cbiAgcHJvdGVjdGVkIHdhaXRBcHAocHJvamVjdDogUHJvamVjdCk6IHN0cmluZyB7XG4gICAgY29uc3QgcG9ydCA9IHByb2plY3QuZW52LlBPUlQ7XG4gICAgcmV0dXJuIGB3YWl0LW9uIC10IDEwMDAwIGh0dHAtZ2V0Oi8vMTI3LjAuMC4xOiR7cG9ydH0gMj4gL2Rldi9udWxsXG4gICAgICB8fCB3YWl0LW9uIC10IDEwMDAwIC1pIDUwMCBodHRwLWdldDovLzEyNy4wLjAuMToke3BvcnR9IDI+IC9kZXYvbnVsbFxuICAgICAgfHwgd2FpdC1vbiAtdCAxMDAwMCAtaSAxMDAwIGh0dHAtZ2V0Oi8vMTI3LjAuMC4xOiR7cG9ydH0gMj4gL2Rldi9udWxsXG4gICAgICB8fCB3YWl0LW9uIC10IDEwMDAwIC1pIDIwMDAgaHR0cC1nZXQ6Ly8xMjcuMC4wLjE6JHtwb3J0fSAyPiAvZGV2L251bGxcbiAgICAgIHx8IHdhaXQtb24gLXQgMjAwMDAgLWkgNDAwMCBodHRwLWdldDovLzEyNy4wLjAuMToke3BvcnR9IDI+IC9kZXYvbnVsbFxuICAgICAgfHwgd2FpdC1vbiAtdCA2MDAwMCAtaSA1MDAwIGh0dHAtZ2V0Oi8vMTI3LjAuMC4xOiR7cG9ydH0gMj4gL2Rldi9udWxsXG4gICAgICB8fCB3YWl0LW9uIC10IDkwMDAwIC1pIDEwMDAwIGh0dHAtZ2V0Oi8vMTI3LjAuMC4xOiR7cG9ydH1gO1xuICB9XG5cbiAgcHJvdGVjdGVkIHdhaXRBbmRPcGVuQXBwKHByb2plY3Q6IFByb2plY3QpOiBzdHJpbmcge1xuICAgIGNvbnN0IHBvcnQgPSBwcm9qZWN0LmVudi5QT1JUO1xuICAgIHJldHVybiBgJHt0aGlzLndhaXRBcHAoXG4gICAgICBwcm9qZWN0XG4gICAgKX0gfHwgd2FpdC1vbiBodHRwLWdldDovLzEyNy4wLjAuMToke3BvcnR9ICYmIG9wZW4tY2xpIGh0dHA6Ly9cXCR7SE9TVDotbG9jYWxob3N0fToke3BvcnR9YDtcbiAgfVxufVxuXG5mdW5jdGlvbiBmaW5kQ3VzdG9tUHJvZHVjdGlvblN0YXJ0U2NyaXB0UGF0aChwcm9qZWN0OiBQcm9qZWN0KTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gcHJvamVjdC5maW5kRmlsZSgnc2NyaXB0cy9zdGFydC1wcm9kdWN0aW9uLnNoJyk7XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybjtcbiAgfVxufVxuXG5mdW5jdGlvbiBmaW5kRWNvc3lzdGVtQ29uZmlnUGF0aChwcm9qZWN0OiBQcm9qZWN0KTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gcHJvamVjdC5maW5kRmlsZSgnZWNvc3lzdGVtLmNvbmZpZy5janMnKTtcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuO1xuICB9XG59XG5cbmZ1bmN0aW9uIGJ1aWxkUGxheXdyaWdodENvbW1hbmQoXG4gIHBsYXl3cmlnaHRBcmdzOiBzdHJpbmdbXSxcbiAgdGFyZ2V0czogVGVzdEFyZ3ZbJ3RhcmdldHMnXSxcbiAgYmFpbD86IGJvb2xlYW4sXG4gIGZvcndhcmRlZFBsYXl3cmlnaHRBcmdzOiBzdHJpbmdbXSA9IFtdXG4pOiBzdHJpbmcge1xuICBjb25zdCBiYXNlID0gWydCVU4nLCAncGxheXdyaWdodCddO1xuICBjb25zdCBub3JtYWxpemVkVGFyZ2V0cyA9IHRhcmdldHM/Lm1hcChTdHJpbmcpO1xuICBpZiAocGxheXdyaWdodEFyZ3NbMF0gIT09ICd0ZXN0JyB8fCAhbm9ybWFsaXplZFRhcmdldHM/Lmxlbmd0aCkge1xuICAgIHJldHVybiBhcHBlbmRQbGF5d3JpZ2h0QmFpbE9wdGlvbihbLi4uYmFzZSwgLi4ucGxheXdyaWdodEFyZ3MsIC4uLmZvcndhcmRlZFBsYXl3cmlnaHRBcmdzXSwgYmFpbCk7XG4gIH1cblxuICBjb25zdCByZXN0ID0gcGxheXdyaWdodEFyZ3Muc2xpY2UoMSk7XG4gIGNvbnN0IGV4cGxpY2l0VGFyZ2V0SW5kZXhlcyA9IGZpbmRFeHBsaWNpdFBsYXl3cmlnaHRUYXJnZXRJbmRleGVzKHJlc3QpO1xuICBjb25zdCByZXN0V2l0aG91dEV4cGxpY2l0VGFyZ2V0ID1cbiAgICBleHBsaWNpdFRhcmdldEluZGV4ZXMubGVuZ3RoID09PSAwID8gcmVzdCA6IHJlc3QuZmlsdGVyKChfLCBpbmRleCkgPT4gIWV4cGxpY2l0VGFyZ2V0SW5kZXhlcy5pbmNsdWRlcyhpbmRleCkpO1xuICByZXR1cm4gYXBwZW5kUGxheXdyaWdodEJhaWxPcHRpb24oXG4gICAgWy4uLmJhc2UsICd0ZXN0JywgLi4ubm9ybWFsaXplZFRhcmdldHMsIC4uLnJlc3RXaXRob3V0RXhwbGljaXRUYXJnZXQsIC4uLmZvcndhcmRlZFBsYXl3cmlnaHRBcmdzXSxcbiAgICBiYWlsXG4gICk7XG59XG5cbmZ1bmN0aW9uIGFwcGVuZFBsYXl3cmlnaHRCYWlsT3B0aW9uKGNvbW1hbmRBcmdzOiBzdHJpbmdbXSwgYmFpbD86IGJvb2xlYW4pOiBzdHJpbmcge1xuICBjb25zdCBwbGF5d3JpZ2h0SW5kZXggPSBjb21tYW5kQXJncy5pbmRleE9mKCdwbGF5d3JpZ2h0Jyk7XG4gIGNvbnN0IGlzUGxheXdyaWdodFRlc3RDb21tYW5kID0gcGxheXdyaWdodEluZGV4ICE9PSAtMSAmJiBjb21tYW5kQXJnc1twbGF5d3JpZ2h0SW5kZXggKyAxXSA9PT0gJ3Rlc3QnO1xuICBpZiAoIWJhaWwgfHwgIWlzUGxheXdyaWdodFRlc3RDb21tYW5kKSB7XG4gICAgcmV0dXJuIGJ1aWxkU2hlbGxDb21tYW5kKGNvbW1hbmRBcmdzKTtcbiAgfVxuICBpZiAoY29tbWFuZEFyZ3Muc29tZSgoYXJnKSA9PiBhcmcgPT09ICctLW1heC1mYWlsdXJlcycgfHwgYXJnLnN0YXJ0c1dpdGgoJy0tbWF4LWZhaWx1cmVzPScpKSkge1xuICAgIHJldHVybiBidWlsZFNoZWxsQ29tbWFuZChjb21tYW5kQXJncyk7XG4gIH1cbiAgcmV0dXJuIGJ1aWxkU2hlbGxDb21tYW5kKFsuLi5jb21tYW5kQXJncywgJy0tbWF4LWZhaWx1cmVzPTEnXSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBmaW5kRXhwbGljaXRQbGF5d3JpZ2h0VGFyZ2V0SW5kZXhlcyhhcmdzOiBzdHJpbmdbXSk6IG51bWJlcltdIHtcbiAgbGV0IHBlbmRpbmdWYWx1ZU1vZGU6ICdvcHRpb25hbCcgfCAncmVxdWlyZWQnIHwgdW5kZWZpbmVkO1xuICBjb25zdCB0YXJnZXRJbmRleGVzOiBudW1iZXJbXSA9IFtdO1xuXG4gIGZvciAoY29uc3QgW2luZGV4LCBhcmddIG9mIGFyZ3MuZW50cmllcygpKSB7XG4gICAgaWYgKHBlbmRpbmdWYWx1ZU1vZGUpIHtcbiAgICAgIGlmIChwZW5kaW5nVmFsdWVNb2RlID09PSAncmVxdWlyZWQnIHx8ICFhcmcuc3RhcnRzV2l0aCgnLScpKSB7XG4gICAgICAgIHBlbmRpbmdWYWx1ZU1vZGUgPSB1bmRlZmluZWQ7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgcGVuZGluZ1ZhbHVlTW9kZSA9IHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICBpZiAoYXJnID09PSAnLS0nKSB7XG4gICAgICByZXR1cm4gWy4uLnRhcmdldEluZGV4ZXMsIC4uLmFyZ3Muc2xpY2UoaW5kZXggKyAxKS5tYXAoKF8sIG9mZnNldCkgPT4gaW5kZXggKyAxICsgb2Zmc2V0KV07XG4gICAgfVxuICAgIGlmIChhcmcuc3RhcnRzV2l0aCgnLS0nKSkge1xuICAgICAgaWYgKGFyZy5pbmNsdWRlcygnPScpKSBjb250aW51ZTtcbiAgICAgIGlmIChQTEFZV1JJR0hUX1RFU1RfT1BUSU9OU19XSVRIX1JFUVVJUkVEX1ZBTFVFUy5oYXMoYXJnKSkge1xuICAgICAgICBwZW5kaW5nVmFsdWVNb2RlID0gJ3JlcXVpcmVkJztcbiAgICAgIH0gZWxzZSBpZiAoUExBWVdSSUdIVF9URVNUX09QVElPTlNfV0lUSF9PUFRJT05BTF9WQUxVRVMuaGFzKGFyZykpIHtcbiAgICAgICAgcGVuZGluZ1ZhbHVlTW9kZSA9ICdvcHRpb25hbCc7XG4gICAgICB9XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgaWYgKGFyZy5zdGFydHNXaXRoKCctJykgJiYgYXJnICE9PSAnLScpIHtcbiAgICAgIGNvbnN0IHNob3J0T3B0aW9uID0gYXJnLnNsaWNlKDAsIDIpO1xuICAgICAgaWYgKGFyZy5sZW5ndGggPT09IDIgJiYgUExBWVdSSUdIVF9URVNUX1NIT1JUX09QVElPTlNfV0lUSF9SRVFVSVJFRF9WQUxVRVMuaGFzKHNob3J0T3B0aW9uKSkge1xuICAgICAgICBwZW5kaW5nVmFsdWVNb2RlID0gJ3JlcXVpcmVkJztcbiAgICAgIH1cbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICB0YXJnZXRJbmRleGVzLnB1c2goaW5kZXgpO1xuICB9XG5cbiAgcmV0dXJuIHRhcmdldEluZGV4ZXM7XG59XG5cbmNvbnN0IFBMQVlXUklHSFRfVEVTVF9PUFRJT05TX1dJVEhfUkVRVUlSRURfVkFMVUVTID0gbmV3IFNldChbXG4gICctLWJyb3dzZXInLFxuICAnLS1jb25maWcnLFxuICAnLS1ncmVwJyxcbiAgJy0tZ3JlcC1pbnZlcnQnLFxuICAnLS1nbG9iYWwtdGltZW91dCcsXG4gICctLW1heC1mYWlsdXJlcycsXG4gICctLW91dHB1dCcsXG4gICctLXByb2plY3QnLFxuICAnLS1yZXBlYXQtZWFjaCcsXG4gICctLXJlcG9ydGVyJyxcbiAgJy0tcmV0cmllcycsXG4gICctLXNoYXJkJyxcbiAgJy0tdGVzdC1saXN0JyxcbiAgJy0tdGVzdC1saXN0LWludmVydCcsXG4gICctLXRpbWVvdXQnLFxuICAnLS10cmFjZScsXG4gICctLXRzY29uZmlnJyxcbiAgJy0tdWktaG9zdCcsXG4gICctLXVpLXBvcnQnLFxuICAnLS11aS10aXRsZScsXG4gICctLXdvcmtlcnMnLFxuXSk7XG5cbmNvbnN0IFBMQVlXUklHSFRfVEVTVF9PUFRJT05TX1dJVEhfT1BUSU9OQUxfVkFMVUVTID0gbmV3IFNldChbXG4gICctLW9ubHktY2hhbmdlZCcsXG4gICctLXVwZGF0ZS1zbmFwc2hvdHMnLFxuICAnLS11cGRhdGUtc291cmNlLW1ldGhvZCcsXG5dKTtcblxuY29uc3QgUExBWVdSSUdIVF9URVNUX1NIT1JUX09QVElPTlNfV0lUSF9SRVFVSVJFRF9WQUxVRVMgPSBuZXcgU2V0KFsnLWMnLCAnLWcnLCAnLWonXSk7XG4iLCJpbXBvcnQgdHlwZSB7IFByb2plY3QgfSBmcm9tICcuLi8uLi9wcm9qZWN0LmpzJztcbmltcG9ydCB0eXBlIHsgU2NyaXB0QXJndiB9IGZyb20gJy4uL2J1aWxkZXIuanMnO1xuXG5pbXBvcnQgeyBCYXNlU2NyaXB0cyB9IGZyb20gJy4vYmFzZVNjcmlwdHMuanMnO1xuXG4vKipcbiAqIEEgY29sbGVjdGlvbiBvZiBzY3JpcHRzIGZvciBleGVjdXRpbmcgQmxpdHouanMgY29tbWFuZHMuXG4gKiBOb3RlIHRoYXQgYFlBUk4genp6YCBpcyByZXBsYWNlZCB3aXRoIGB5YXJuIHp6emAgb3IgYG5vZGVfbW9kdWxlcy8uYmluL3p6emAuXG4gKi9cbmNsYXNzIEJsaXR6U2NyaXB0cyBleHRlbmRzIEJhc2VTY3JpcHRzIHtcbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIodHJ1ZSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgb3ZlcnJpZGUgc3RhcnREZXZQcm90ZWN0ZWQoXzogUHJvamVjdCwgYXJndjogU2NyaXB0QXJndik6IHN0cmluZyB7XG4gICAgcmV0dXJuIGBibGl0eiBkZXYgJHthcmd2Lm5vcm1hbGl6ZWRBcmdzVGV4dCA/PyAnJ31gO1xuICB9XG59XG5cbmV4cG9ydCBjb25zdCBibGl0elNjcmlwdHMgPSBuZXcgQmxpdHpTY3JpcHRzKCk7XG4iLCJpbXBvcnQgdHlwZSB7IFRlc3RBcmd2IH0gZnJvbSAnLi4vLi4vY29tbWFuZHMvdGVzdC5qcyc7XG5pbXBvcnQgdHlwZSB7IFByb2plY3QgfSBmcm9tICcuLi8uLi9wcm9qZWN0LmpzJztcbmltcG9ydCB7IGJ1aWxkRW52UmVhZGVyT3B0aW9uQXJncyB9IGZyb20gJy4uLy4uL3NoYXJlZE9wdGlvbnNCdWlsZGVyLmpzJztcbmltcG9ydCB7IGNoZWNrQW5kS2lsbFBvcnRQcm9jZXNzIH0gZnJvbSAnLi4vLi4vdXRpbHMvcG9ydC5qcyc7XG5pbXBvcnQgeyBidWlsZFNoZWxsQ29tbWFuZCB9IGZyb20gJy4uLy4uL3V0aWxzL3NoZWxsLmpzJztcbmltcG9ydCB0eXBlIHsgU2NyaXB0QXJndiB9IGZyb20gJy4uL2J1aWxkZXIuanMnO1xuXG5pbXBvcnQgeyBCYXNlU2NyaXB0cywgdHlwZSBUZXN0RTJFT3B0aW9ucyB9IGZyb20gJy4vYmFzZVNjcmlwdHMuanMnO1xuXG4vKipcbiAqIEEgY29sbGVjdGlvbiBvZiBzY3JpcHRzIGZvciBleGVjdXRpbmcgYW4gYXBwIHRoYXQgdXRpbGl6ZXMgYW4gSFRUUCBzZXJ2ZXIgbGlrZSBleHByZXNzLlxuICogTm90ZSB0aGF0IGBZQVJOIHp6emAgaXMgcmVwbGFjZWQgd2l0aCBgeWFybiB6enpgIG9yIGBub2RlX21vZHVsZXMvLmJpbi96enpgLlxuICovXG5leHBvcnQgY2xhc3MgSHR0cFNlcnZlclNjcmlwdHMgZXh0ZW5kcyBCYXNlU2NyaXB0cyB7XG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKGZhbHNlKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBvdmVycmlkZSBzdGFydERldlByb3RlY3RlZChfOiBQcm9qZWN0LCBhcmd2OiBTY3JpcHRBcmd2KTogc3RyaW5nIHtcbiAgICByZXR1cm4gYFlBUk4gYnVpbGQtdHMgcnVuICR7YXJndi53YXRjaCA/ICctLXdhdGNoJyA6ICcnfSBzcmMvaW5kZXgudHMgLS0gJHthcmd2Lm5vcm1hbGl6ZWRBcmdzVGV4dCA/PyAnJ31gO1xuICB9XG5cbiAgb3ZlcnJpZGUgYXN5bmMgdGVzdEUyRVByb3RlY3RlZChcbiAgICBwcm9qZWN0OiBQcm9qZWN0LFxuICAgIGFyZ3Y6IFRlc3RBcmd2LFxuICAgIHN0YXJ0Q29tbWFuZDogc3RyaW5nLFxuICAgIG9wdGlvbnM6IFRlc3RFMkVPcHRpb25zID0ge31cbiAgKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICBpZiAocHJvamVjdC5oYXNQbGF5d3JpZ2h0Q29uZmlnKSB7XG4gICAgICByZXR1cm4gc3VwZXIudGVzdEUyRVByb3RlY3RlZChwcm9qZWN0LCBhcmd2LCBzdGFydENvbW1hbmQsIG9wdGlvbnMpO1xuICAgIH1cblxuICAgIHByb2plY3QuZW52LlBPUlQgfHw9ICczMDAwJztcbiAgICBjb25zdCBwb3J0ID0gYXdhaXQgY2hlY2tBbmRLaWxsUG9ydFByb2Nlc3MocHJvamVjdC5lbnYuUE9SVCwgcHJvamVjdCk7XG4gICAgY29uc3Qgc3VmZml4ID0gcHJvamVjdC5wYWNrYWdlSnNvbi5zY3JpcHRzPy5bJ3Rlc3QvZTJlLWFkZGl0aW9uYWwnXSA/ICcgJiYgWUFSTiB0ZXN0L2UyZS1hZGRpdGlvbmFsJyA6ICcnO1xuICAgIGNvbnN0IHRhcmdldHMgPSBhcmd2LnRhcmdldHM/Lm1hcChTdHJpbmcpO1xuICAgIGNvbnN0IG5vcm1hbGl6ZWRUYXJnZXRzID0gdGFyZ2V0cz8ubGVuZ3RoID8gdGFyZ2V0cyA6IFsndGVzdC9lMmUvJ107XG4gICAgY29uc3QgdGVzdENvbW1hbmQgPSB0aGlzLnRlc3RVbml0KHByb2plY3QsIHsgLi4uYXJndiwgdGFyZ2V0czogbm9ybWFsaXplZFRhcmdldHMgfSk7XG4gICAgcmV0dXJuIGJ1aWxkU2hlbGxDb21tYW5kKFtcbiAgICAgICdZQVJOJyxcbiAgICAgICd3YicsXG4gICAgICAnY29uY3VycmVudGx5JyxcbiAgICAgIC4uLmJ1aWxkRW52UmVhZGVyT3B0aW9uQXJncyhhcmd2KSxcbiAgICAgICctLWtpbGwtb3RoZXJzJyxcbiAgICAgICctLXN1Y2Nlc3MnLFxuICAgICAgJ2ZpcnN0JyxcbiAgICAgIGAke3N0YXJ0Q29tbWFuZH0gJiYgZXhpdCAxYCxcbiAgICAgIGB3YWl0LW9uIC10IDYwMDAwMCAtaSAyMDAwIGh0dHAtZ2V0Oi8vMTI3LjAuMC4xOiR7cG9ydH0gJiYgJHt0ZXN0Q29tbWFuZH0ke3N1ZmZpeH1gLFxuICAgIF0pO1xuICB9XG59XG5cbmV4cG9ydCBjb25zdCBodHRwU2VydmVyU2NyaXB0cyA9IG5ldyBIdHRwU2VydmVyU2NyaXB0cygpO1xuIiwiaW1wb3J0IHR5cGUgeyBQcm9qZWN0IH0gZnJvbSAnLi4vLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQgdHlwZSB7IFNjcmlwdEFyZ3YgfSBmcm9tICcuLi9idWlsZGVyLmpzJztcblxuaW1wb3J0IHsgQmFzZVNjcmlwdHMgfSBmcm9tICcuL2Jhc2VTY3JpcHRzLmpzJztcblxuLyoqXG4gKiBBIGNvbGxlY3Rpb24gb2Ygc2NyaXB0cyBmb3IgZXhlY3V0aW5nIE5leHQuanMgY29tbWFuZHMuXG4gKiBOb3RlIHRoYXQgYFlBUk4genp6YCBpcyByZXBsYWNlZCB3aXRoIGB5YXJuIHp6emAgb3IgYG5vZGVfbW9kdWxlcy8uYmluL3p6emAuXG4gKi9cbmNsYXNzIE5leHRTY3JpcHRzIGV4dGVuZHMgQmFzZVNjcmlwdHMge1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcih0cnVlKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBvdmVycmlkZSBzdGFydERldlByb3RlY3RlZChfOiBQcm9qZWN0LCBhcmd2OiBTY3JpcHRBcmd2KTogc3RyaW5nIHtcbiAgICByZXR1cm4gYFlBUk4gbmV4dCBkZXYgLS10dXJib3BhY2sgJHthcmd2Lm5vcm1hbGl6ZWRBcmdzVGV4dCA/PyAnJ31gO1xuICB9XG5cbiAgcHJvdGVjdGVkIG92ZXJyaWRlIGJ1aWxkRGVmYXVsdFByb2R1Y3Rpb25TdGFydENvbW1hbmRzKHByb2plY3Q6IFByb2plY3QsIGFyZ3Y6IFNjcmlwdEFyZ3YpOiBzdHJpbmdbXSB7XG4gICAgcmV0dXJuIFtwcm9qZWN0LmJ1aWxkQ29tbWFuZCwgYFlBUk4gbmV4dCBzdGFydCAke2FyZ3Yubm9ybWFsaXplZEFyZ3NUZXh0ID8/ICcnfWAudHJpbSgpXTtcbiAgfVxufVxuXG5leHBvcnQgY29uc3QgbmV4dFNjcmlwdHMgPSBuZXcgTmV4dFNjcmlwdHMoKTtcbiIsImV4cG9ydCBjb25zdCBTRVJWRVJfTE9HX0ZJTEUgPSAnc2VydmVyLmxvZyc7XG4iLCJpbXBvcnQgdHlwZSB7IFByb2plY3QgfSBmcm9tICcuLi8uLi9wcm9qZWN0LmpzJztcbmltcG9ydCB7IFNFUlZFUl9MT0dfRklMRSB9IGZyb20gJy4uLy4uL3V0aWxzL2xvZy5qcyc7XG5pbXBvcnQgdHlwZSB7IFNjcmlwdEFyZ3YgfSBmcm9tICcuLi9idWlsZGVyLmpzJztcbmltcG9ydCB7IGRvY2tlclNjcmlwdHMgfSBmcm9tICcuLi9kb2NrZXJTY3JpcHRzLmpzJztcblxuaW1wb3J0IHsgQmFzZVNjcmlwdHMgfSBmcm9tICcuL2Jhc2VTY3JpcHRzLmpzJztcblxuLyoqXG4gKiBBIGNvbGxlY3Rpb24gb2Ygc2NyaXB0cyBmb3IgZXhlY3V0aW5nIGFuIGFwcCB0aGF0IHV0aWxpemVzIGFuIEhUVFAgc2VydmVyIGxpa2UgZXhwcmVzcy5cbiAqIE5vdGUgdGhhdCBgWUFSTiB6enpgIGlzIHJlcGxhY2VkIHdpdGggYHlhcm4genp6YCBvciBgbm9kZV9tb2R1bGVzLy5iaW4venp6YC5cbiAqL1xuY2xhc3MgUGxhaW5BcHBTY3JpcHRzIGV4dGVuZHMgQmFzZVNjcmlwdHMge1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcihmYWxzZSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgc3RhcnREZXZQcm90ZWN0ZWQoXzE6IFByb2plY3QsIF8yOiBTY3JpcHRBcmd2KTogc3RyaW5nIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ1RoaXMgbWV0aG9kIHNob3VsZCBub3QgYmUgY2FsbGVkLicpO1xuICB9XG5cbiAgb3ZlcnJpZGUgc3RhcnREZXYoXzogUHJvamVjdCwgYXJndjogU2NyaXB0QXJndik6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShcbiAgICAgIGBZQVJOIGJ1aWxkLXRzIHJ1biAke2FyZ3Yud2F0Y2ggPyAnLS13YXRjaCcgOiAnJ30gc3JjL2luZGV4LnRzIC0tICR7YXJndi5ub3JtYWxpemVkQXJnc1RleHQgPz8gJyd9YFxuICAgICk7XG4gIH1cbiAgb3ZlcnJpZGUgc3RhcnRQcm9kdWN0aW9uKHByb2plY3Q6IFByb2plY3QsIGFyZ3Y6IFNjcmlwdEFyZ3YpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoXG4gICAgICBgJHtwcm9qZWN0LmJ1aWxkQ29tbWFuZH0gJiYgJHtwcm9qZWN0LmlzQnVuQXZhaWxhYmxlID8gJ2J1biBydW4nIDogJ25vZGUnfSBkaXN0L2luZGV4LmpzICR7YXJndi5ub3JtYWxpemVkQXJnc1RleHQgPz8gJyd9IHwgdGVlICR7U0VSVkVSX0xPR19GSUxFfWBcbiAgICApO1xuICB9XG4gIG92ZXJyaWRlIHN0YXJ0VGVzdCgpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoYGVjaG8gJ2RvIG5vdGhpbmcuJ2ApO1xuICB9XG4gIG92ZXJyaWRlIHN0YXJ0RG9ja2VyKHByb2plY3Q6IFByb2plY3QsIGFyZ3Y6IFNjcmlwdEFyZ3YpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoXG4gICAgICBgJHt0aGlzLmJ1aWxkRG9ja2VyKHByb2plY3QsICdkZXZlbG9wbWVudCcpfSAmJiAke2RvY2tlclNjcmlwdHMuc3RvcEFuZFN0YXJ0KFxuICAgICAgICBwcm9qZWN0LFxuICAgICAgICBhcmd2Lm5vcm1hbGl6ZWREb2NrZXJPcHRpb25zVGV4dCA/PyAnJyxcbiAgICAgICAgYXJndi5ub3JtYWxpemVkQXJnc1RleHQgPz8gJydcbiAgICAgICl9YFxuICAgICk7XG4gIH1cblxuICBvdmVycmlkZSB0ZXN0RTJFRGV2KCk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShgZWNobyAnZG8gbm90aGluZy4nYCk7XG4gIH1cbiAgb3ZlcnJpZGUgdGVzdEUyRVByb2R1Y3Rpb24oKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKGBlY2hvICdkbyBub3RoaW5nLidgKTtcbiAgfVxuICBvdmVycmlkZSB0ZXN0RTJFRG9ja2VyKCk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShgZWNobyAnZG8gbm90aGluZy4nYCk7XG4gIH1cbiAgb3ZlcnJpZGUgdGVzdFN0YXJ0KCk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShgZWNobyAnZG8gbm90aGluZy4nYCk7XG4gIH1cbn1cblxuZXhwb3J0IGNvbnN0IHBsYWluQXBwU2NyaXB0cyA9IG5ldyBQbGFpbkFwcFNjcmlwdHMoKTtcbiIsImltcG9ydCB0eXBlIHsgUHJvamVjdCB9IGZyb20gJy4uLy4uL3Byb2plY3QuanMnO1xuaW1wb3J0IHR5cGUgeyBTY3JpcHRBcmd2IH0gZnJvbSAnLi4vYnVpbGRlci5qcyc7XG5cbmltcG9ydCB7IEJhc2VTY3JpcHRzIH0gZnJvbSAnLi9iYXNlU2NyaXB0cy5qcyc7XG5cbi8qKlxuICogQSBjb2xsZWN0aW9uIG9mIHNjcmlwdHMgZm9yIGV4ZWN1dGluZyBSZW1peCBjb21tYW5kcy5cbiAqIE5vdGUgdGhhdCBgWUFSTiB6enpgIGlzIHJlcGxhY2VkIHdpdGggYHlhcm4genp6YCBvciBgbm9kZV9tb2R1bGVzLy5iaW4venp6YC5cbiAqL1xuY2xhc3MgUmVtaXhTY3JpcHRzIGV4dGVuZHMgQmFzZVNjcmlwdHMge1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcih0cnVlKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBvdmVycmlkZSBzdGFydERldlByb3RlY3RlZChfOiBQcm9qZWN0LCBhcmd2OiBTY3JpcHRBcmd2KTogc3RyaW5nIHtcbiAgICByZXR1cm4gYHJlbWl4IGRldiAke2FyZ3Yubm9ybWFsaXplZEFyZ3NUZXh0ID8/ICcnfWA7XG4gIH1cbn1cblxuZXhwb3J0IGNvbnN0IHJlbWl4U2NyaXB0cyA9IG5ldyBSZW1peFNjcmlwdHMoKTtcbiIsImltcG9ydCB0eXBlIHsgUHJvamVjdCB9IGZyb20gJy4uLy4uL3Byb2plY3QuanMnO1xuaW1wb3J0IHsgaXNQcm9qZWN0RW52aXJvbm1lbnQgfSBmcm9tICcuLi8uLi9wcm9qZWN0LmpzJztcbmltcG9ydCB7XG4gIGJ1aWxkRDFNaWdyYXRpb25zQXBwbHlDb21tYW5kLFxuICBidWlsZEdlbkRldlZhcnNDb21tYW5kLFxuICBidWlsZFdyYW5nbGVyRGV2Q29tbWFuZCxcbiAgZ2V0TG9jYWxXcmFuZ2xlclN0YXRlRGlyLFxufSBmcm9tICcuLi8uLi91dGlscy93cmFuZ2xlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFNjcmlwdEFyZ3YgfSBmcm9tICcuLi9idWlsZGVyLmpzJztcblxuaW1wb3J0IHsgQmFzZVNjcmlwdHMgfSBmcm9tICcuL2Jhc2VTY3JpcHRzLmpzJztcblxuLyoqXG4gKiBBIGNvbGxlY3Rpb24gb2Ygc2NyaXB0cyBmb3IgZXhlY3V0aW5nIHZpbmV4dCAoTmV4dC5qcyBvbiBWaXRlKSBhcHBzIHRhcmdldGluZyBDbG91ZGZsYXJlIFdvcmtlcnMuXG4gKiBOb3RlIHRoYXQgYFlBUk4genp6YCBpcyByZXBsYWNlZCB3aXRoIGB5YXJuIHp6emAgb3IgYG5vZGVfbW9kdWxlcy8uYmluL3p6emAuXG4gKi9cbmNsYXNzIFZpbmV4dFNjcmlwdHMgZXh0ZW5kcyBCYXNlU2NyaXB0cyB7XG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKHRydWUpO1xuICB9XG5cbiAgcHJvdGVjdGVkIG92ZXJyaWRlIHN0YXJ0RGV2UHJvdGVjdGVkKHByb2plY3Q6IFByb2plY3QsIGFyZ3Y6IFNjcmlwdEFyZ3YpOiBzdHJpbmcge1xuICAgIHByb2plY3QuZW52LlBPUlQgfHw9ICczMDAwJztcbiAgICAvLyBVbmxpa2UgYG5leHQgZGV2YCwgVml0ZS1iYXNlZCB2aW5leHQgZG9lcyBub3QgcmVhZCB0aGUgUE9SVCBlbnZpcm9ubWVudCB2YXJpYWJsZS5cbiAgICBjb25zdCBkZXZDb21tYW5kID0gYFlBUk4gdmluZXh0IGRldiAtLXBvcnQgJHtwcm9qZWN0LmVudi5QT1JUfSAke2FyZ3Yubm9ybWFsaXplZEFyZ3NUZXh0ID8/ICcnfWAudHJpbSgpO1xuICAgIC8vIFRoZSBDbG91ZGZsYXJlIHZpdGUgcGx1Z2luIChtaW5pZmxhcmUpIHJlYWRzIHJ1bnRpbWUgdmFycyBvbmx5IGZyb20gYSAuZGV2LnZhcnMgZmlsZSxcbiAgICAvLyBzbyBpdCBtdXN0IGJlIHJlZ2VuZXJhdGVkIGZyb20gdGhlIHdiLW1hbmFnZWQgLmVudiBmaWxlcyBiZWZvcmUgc2VydmluZy5cbiAgICBjb25zdCBjb21tYW5kcyA9IFtidWlsZEdlbkRldlZhcnNDb21tYW5kKGFyZ3YsICcuZGV2LnZhcnMnKV07XG4gICAgLy8gYHZpbmV4dCBkZXZgIChtaW5pZmxhcmUpIHN0YXJ0cyB3aXRoIGFuIGVtcHR5IGxvY2FsIEQxIGFuZCBhcHBsaWVzIG5vIG1pZ3JhdGlvbnMgaXRzZWxmO1xuICAgIC8vIHRoZSB0ZXN0IGVudmlyb25tZW50IHdpcGVzIGl0cyBzdGF0ZSBkaXJlY3RvcnksIHNvIGV2ZXJ5IHBhZ2Ugd291bGQgNTAwIHdpdGhvdXQgdGhpcy5cbiAgICBjb25zdCBtaWdyYXRpb25Db21tYW5kID0gaXNQcm9qZWN0RW52aXJvbm1lbnQocHJvamVjdCwgJ3Rlc3QnKSA/IGJ1aWxkRDFNaWdyYXRpb25zQXBwbHlDb21tYW5kKHByb2plY3QpIDogdW5kZWZpbmVkO1xuICAgIGlmIChtaWdyYXRpb25Db21tYW5kKSBjb21tYW5kcy5wdXNoKG1pZ3JhdGlvbkNvbW1hbmQpO1xuICAgIHJldHVybiBbLi4uY29tbWFuZHMsIGRldkNvbW1hbmRdLmpvaW4oJyAmJiAnKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBvdmVycmlkZSBidWlsZERlZmF1bHRQcm9kdWN0aW9uU3RhcnRDb21tYW5kcyhwcm9qZWN0OiBQcm9qZWN0LCBhcmd2OiBTY3JpcHRBcmd2KTogc3RyaW5nW10ge1xuICAgIHByb2plY3QuZW52LlBPUlQgfHw9ICczMDAwJztcbiAgICBjb25zdCBwb3J0ID0gcHJvamVjdC5lbnYuUE9SVDtcbiAgICAvLyBTZXJ2aW5nIHRoZSBidWlsdCB3b3JrZXIgc3RhcnRzIGZyb20gYW4gZW1wdHkgKG9yIHdpcGVkKSBsb2NhbCBEMSwgc28gd3JhbmdsZXItbmF0aXZlXG4gICAgLy8gbWlncmF0aW9ucyAoaWYgYW55KSBtdXN0IGJlIGFwcGxpZWQgZmlyc3Q7IGRyaXp6bGUvcHJpc21hIG1pZ3JhdGlvbnMgYXJlIGhhbmRsZWQgYnlcbiAgICAvLyBidWlsZFByb2R1Y3Rpb25Db21tYW5kLlxuICAgIGNvbnN0IGQxTWlncmF0aW9uc0NvbW1hbmQgPSBidWlsZEQxTWlncmF0aW9uc0FwcGx5Q29tbWFuZChwcm9qZWN0KTtcbiAgICAvLyBgdmluZXh0IGJ1aWxkYCBlbWl0cyBhIHdvcmtlciBidW5kbGUgYW5kIGl0cyB3cmFuZ2xlciBjb25maWcgdW5kZXIgZGlzdC9zZXJ2ZXIsIHNvIHRoZVxuICAgIC8vIC5kZXYudmFycyBmaWxlIGV4cG9zaW5nIHdiLW1hbmFnZWQgZW52aXJvbm1lbnQgdmFyaWFibGVzIG11c3QgYmUgZ2VuZXJhdGVkIGFmdGVyIGJ1aWxkaW5nLlxuICAgIC8vIGAtLWxvY2FsLXVwc3RyZWFtYCBrZWVwcyByZXF1ZXN0IFVSTHMgb24gdGhlIGxvY2FsIGhvc3Q7IG90aGVyd2lzZSwgd3JhbmdsZXIgZGV2IHNpbXVsYXRlc1xuICAgIC8vIHRoZSBwcm9kdWN0aW9uIGN1c3RvbSBkb21haW4gZGVjbGFyZWQgaW4gdGhlIHdyYW5nbGVyIGNvbmZpZyByb3V0ZXMuXG4gICAgcmV0dXJuIFtcbiAgICAgIHByb2plY3QuYnVpbGRDb21tYW5kLFxuICAgICAgYnVpbGRHZW5EZXZWYXJzQ29tbWFuZChhcmd2LCAnZGlzdC9zZXJ2ZXIvLmRldi52YXJzJyksXG4gICAgICAuLi4oZDFNaWdyYXRpb25zQ29tbWFuZCA/IFtkMU1pZ3JhdGlvbnNDb21tYW5kXSA6IFtdKSxcbiAgICAgIGJ1aWxkV3JhbmdsZXJEZXZDb21tYW5kKFxuICAgICAgICBgZGV2IC0tY29uZmlnIGRpc3Qvc2VydmVyL3dyYW5nbGVyLmpzb24gLS1pcCAxMjcuMC4wLjEgLS1wb3J0ICR7cG9ydH0gLS1wZXJzaXN0LXRvIFwiJHtnZXRMb2NhbFdyYW5nbGVyU3RhdGVEaXIocHJvamVjdCl9XCIgLS1sb2NhbC11cHN0cmVhbSBsb2NhbGhvc3Q6JHtwb3J0fSAke2FyZ3Yubm9ybWFsaXplZEFyZ3NUZXh0ID8/ICcnfWAudHJpbSgpXG4gICAgICApLFxuICAgIF07XG4gIH1cbn1cblxuZXhwb3J0IGNvbnN0IHZpbmV4dFNjcmlwdHMgPSBuZXcgVmluZXh0U2NyaXB0cygpO1xuIiwiaW1wb3J0IHR5cGUgeyBQcm9qZWN0IH0gZnJvbSAnLi4vLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQgdHlwZSB7IFNjcmlwdEFyZ3YgfSBmcm9tICcuLi9idWlsZGVyLmpzJztcblxuaW1wb3J0IHsgQmFzZVNjcmlwdHMgfSBmcm9tICcuL2Jhc2VTY3JpcHRzLmpzJztcblxuLyoqXG4gKiBBIGNvbGxlY3Rpb24gb2Ygc2NyaXB0cyBmb3IgZXhlY3V0aW5nIFZpdGUtYmFzZWQgYXBwcyB3aXRoIFBsYXl3cmlnaHQgZTJlIHRlc3RzLlxuICogTm90ZSB0aGF0IGBZQVJOIHp6emAgaXMgcmVwbGFjZWQgd2l0aCBgeWFybiB6enpgIG9yIGBub2RlX21vZHVsZXMvLmJpbi96enpgLlxuICovXG5jbGFzcyBWaXRlU2NyaXB0cyBleHRlbmRzIEJhc2VTY3JpcHRzIHtcbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIodHJ1ZSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgb3ZlcnJpZGUgc3RhcnREZXZQcm90ZWN0ZWQoXzogUHJvamVjdCwgYXJndjogU2NyaXB0QXJndik6IHN0cmluZyB7XG4gICAgcmV0dXJuIGBZQVJOIHZpdGUgZGV2ICR7YXJndi5ub3JtYWxpemVkQXJnc1RleHQgPz8gJyd9YC50cmltKCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgb3ZlcnJpZGUgc3RhcnRQcm9kdWN0aW9uUHJvdGVjdGVkKHByb2plY3Q6IFByb2plY3QsIGFyZ3Y6IFNjcmlwdEFyZ3YpOiBzdHJpbmcge1xuICAgIHJldHVybiBgJHtwcm9qZWN0LmJ1aWxkQ29tbWFuZH0gJiYgWUFSTiB2aXRlIHByZXZpZXcgJHthcmd2Lm5vcm1hbGl6ZWRBcmdzVGV4dCA/PyAnJ31gLnRyaW0oKTtcbiAgfVxufVxuXG5leHBvcnQgY29uc3Qgdml0ZVNjcmlwdHMgPSBuZXcgVml0ZVNjcmlwdHMoKTtcbiIsImltcG9ydCB0eXBlIHsgUHJvamVjdCB9IGZyb20gJy4uLy4uL3Byb2plY3QuanMnO1xuaW1wb3J0IHtcbiAgYnVpbGREMU1pZ3JhdGlvbnNBcHBseUNvbW1hbmQsXG4gIGJ1aWxkR2VuRGV2VmFyc0NvbW1hbmQsXG4gIGJ1aWxkV3JhbmdsZXJEZXZDb21tYW5kLFxuICBnZXRMb2NhbFdyYW5nbGVyU3RhdGVEaXIsXG59IGZyb20gJy4uLy4uL3V0aWxzL3dyYW5nbGVyLmpzJztcbmltcG9ydCB0eXBlIHsgU2NyaXB0QXJndiB9IGZyb20gJy4uL2J1aWxkZXIuanMnO1xuXG5pbXBvcnQgeyBIdHRwU2VydmVyU2NyaXB0cyB9IGZyb20gJy4vaHR0cFNlcnZlclNjcmlwdHMuanMnO1xuXG4vKipcbiAqIEEgY29sbGVjdGlvbiBvZiBzY3JpcHRzIGZvciBleGVjdXRpbmcgcGxhaW4gQ2xvdWRmbGFyZSBXb3JrZXJzIGFwcHMgKGRldGVjdGVkIHZpYSBhIHdyYW5nbGVyXG4gKiBjb25maWcgZmlsZSB3aGVuIG5vIG90aGVyIGZyYW1ld29yayBtYXRjaGVzOyB2aW5leHQgYXBwcyBoYXZlIHRoZWlyIG93biBzY3JpcHRzKS5cbiAqIEV4dGVuZHMgSHR0cFNlcnZlclNjcmlwdHMgc28gdGhhdCBlMmUgdGVzdHMgcnVuIHZpYSB0aGUgdW5pdC10ZXN0IHJ1bm5lciBhZ2FpbnN0IHRoZSBydW5uaW5nXG4gKiB3b3JrZXIgd2hlbiB0aGUgcHJvamVjdCBoYXMgbm8gUGxheXdyaWdodCBjb25maWcuXG4gKiBOb3RlIHRoYXQgYFlBUk4genp6YCBpcyByZXBsYWNlZCB3aXRoIGB5YXJuIHp6emAgb3IgYG5vZGVfbW9kdWxlcy8uYmluL3p6emAuXG4gKi9cbmNsYXNzIFdvcmtlcnNTY3JpcHRzIGV4dGVuZHMgSHR0cFNlcnZlclNjcmlwdHMge1xuICBwcm90ZWN0ZWQgb3ZlcnJpZGUgc3RhcnREZXZQcm90ZWN0ZWQocHJvamVjdDogUHJvamVjdCwgYXJndjogU2NyaXB0QXJndik6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuYnVpbGRXcmFuZ2xlckRldkNvbW1hbmRzKHByb2plY3QsIGFyZ3YpLmpvaW4oJyAmJiAnKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBvdmVycmlkZSBidWlsZERlZmF1bHRQcm9kdWN0aW9uU3RhcnRDb21tYW5kcyhwcm9qZWN0OiBQcm9qZWN0LCBhcmd2OiBTY3JpcHRBcmd2KTogc3RyaW5nW10ge1xuICAgIC8vIHdyYW5nbGVyIGRldiBidW5kbGVzIHRoZSB3b3JrZXIgaXRzZWxmLCBzbyBubyBzZXBhcmF0ZSBidWlsZCBzdGVwIGlzIG5lZWRlZC5cbiAgICByZXR1cm4gdGhpcy5idWlsZFdyYW5nbGVyRGV2Q29tbWFuZHMocHJvamVjdCwgYXJndik7XG4gIH1cblxuICBwcml2YXRlIGJ1aWxkV3JhbmdsZXJEZXZDb21tYW5kcyhwcm9qZWN0OiBQcm9qZWN0LCBhcmd2OiBTY3JpcHRBcmd2KTogc3RyaW5nW10ge1xuICAgIHByb2plY3QuZW52LlBPUlQgfHw9ICc4Nzg3JztcbiAgICBjb25zdCBzdGF0ZURpciA9IGdldExvY2FsV3JhbmdsZXJTdGF0ZURpcihwcm9qZWN0KTtcblxuICAgIC8vIFRoZXNlIGhlbHBlcnMgcmVhZCB0aGUgZGVmYXVsdC1uYW1lZCB3cmFuZ2xlciBjb25maWc7IHRoYXQgaXMgc2FmZSBiZWNhdXNlIHdvcmtlcnNTY3JpcHRzXG4gICAgLy8gaXRzZWxmIGlzIG9ubHkgc2VsZWN0ZWQgd2hlbiBzdWNoIGEgY29uZmlnIGZpbGUgZXhpc3RzIGluIHRoZSBwcm9qZWN0IGRpcmVjdG9yeS5cbiAgICBjb25zdCBjb21tYW5kcyA9IFtidWlsZEdlbkRldlZhcnNDb21tYW5kKGFyZ3YsICcuZGV2LnZhcnMnKV07XG4gICAgLy8gQXBwbHkgd3JhbmdsZXItbmF0aXZlIEQxIG1pZ3JhdGlvbnMgKGlmIGFueSkgc28gdGhlIGxvY2FsIGRhdGFiYXNlIG1hdGNoZXMgdGhlIGRlcGxveWVkIG9uZS5cbiAgICBjb25zdCBkMU1pZ3JhdGlvbnNDb21tYW5kID0gYnVpbGREMU1pZ3JhdGlvbnNBcHBseUNvbW1hbmQocHJvamVjdCk7XG4gICAgaWYgKGQxTWlncmF0aW9uc0NvbW1hbmQpIHtcbiAgICAgIGNvbW1hbmRzLnB1c2goZDFNaWdyYXRpb25zQ29tbWFuZCk7XG4gICAgfVxuICAgIGNvbW1hbmRzLnB1c2goXG4gICAgICBidWlsZFdyYW5nbGVyRGV2Q29tbWFuZChcbiAgICAgICAgYGRldiAtLWlwIDEyNy4wLjAuMSAtLXBvcnQgJHtwcm9qZWN0LmVudi5QT1JUfSAtLXBlcnNpc3QtdG8gXCIke3N0YXRlRGlyfVwiICR7YXJndi5ub3JtYWxpemVkQXJnc1RleHQgPz8gJyd9YC50cmltKClcbiAgICAgIClcbiAgICApO1xuICAgIHJldHVybiBjb21tYW5kcztcbiAgfVxufVxuXG5leHBvcnQgY29uc3Qgd29ya2Vyc1NjcmlwdHMgPSBuZXcgV29ya2Vyc1NjcmlwdHMoKTtcbiIsImV4cG9ydCBjb25zdCBodHRwU2VydmVyUGFja2FnZXMgPSBbJ2V4cHJlc3MnLCAnZmFzdGlmeScsICdlbHlzaWEnLCAnaG9ubyddO1xuIiwiaW1wb3J0IGNoYWxrIGZyb20gJ2NoYWxrJztcbmltcG9ydCB0eXBlIHsgQXJndiwgQ29tbWFuZE1vZHVsZSwgSW5mZXJyZWRPcHRpb25UeXBlcyB9IGZyb20gJ3lhcmdzJztcblxuaW1wb3J0IHsgZmluZERlc2NlbmRhbnRQcm9qZWN0cyB9IGZyb20gJy4uL3Byb2plY3QuanMnO1xuaW1wb3J0IHsgbm9ybWFsaXplQXJncywgc2NyaXB0T3B0aW9uc0J1aWxkZXIgfSBmcm9tICcuLi9zY3JpcHRzL2J1aWxkZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBCYXNlU2NyaXB0cyB9IGZyb20gJy4uL3NjcmlwdHMvZXhlY3V0aW9uL2Jhc2VTY3JpcHRzLmpzJztcbmltcG9ydCB7IGJsaXR6U2NyaXB0cyB9IGZyb20gJy4uL3NjcmlwdHMvZXhlY3V0aW9uL2JsaXR6U2NyaXB0cy5qcyc7XG5pbXBvcnQgeyBodHRwU2VydmVyU2NyaXB0cyB9IGZyb20gJy4uL3NjcmlwdHMvZXhlY3V0aW9uL2h0dHBTZXJ2ZXJTY3JpcHRzLmpzJztcbmltcG9ydCB7IG5leHRTY3JpcHRzIH0gZnJvbSAnLi4vc2NyaXB0cy9leGVjdXRpb24vbmV4dFNjcmlwdHMuanMnO1xuaW1wb3J0IHsgcGxhaW5BcHBTY3JpcHRzIH0gZnJvbSAnLi4vc2NyaXB0cy9leGVjdXRpb24vcGxhaW5BcHBTY3JpcHRzLmpzJztcbmltcG9ydCB7IHJlbWl4U2NyaXB0cyB9IGZyb20gJy4uL3NjcmlwdHMvZXhlY3V0aW9uL3JlbWl4U2NyaXB0cy5qcyc7XG5pbXBvcnQgeyB2aW5leHRTY3JpcHRzIH0gZnJvbSAnLi4vc2NyaXB0cy9leGVjdXRpb24vdmluZXh0U2NyaXB0cy5qcyc7XG5pbXBvcnQgeyB2aXRlU2NyaXB0cyB9IGZyb20gJy4uL3NjcmlwdHMvZXhlY3V0aW9uL3ZpdGVTY3JpcHRzLmpzJztcbmltcG9ydCB7IHdvcmtlcnNTY3JpcHRzIH0gZnJvbSAnLi4vc2NyaXB0cy9leGVjdXRpb24vd29ya2Vyc1NjcmlwdHMuanMnO1xuaW1wb3J0IHsgcnVuV2l0aFNwYXduIH0gZnJvbSAnLi4vc2NyaXB0cy9ydW4uanMnO1xuaW1wb3J0IHsgZmluZFdyYW5nbGVyQ29uZmlnUGF0aCB9IGZyb20gJy4uL3V0aWxzL3dyYW5nbGVyLmpzJztcbmltcG9ydCB0eXBlIHsgc2hhcmVkT3B0aW9uc0J1aWxkZXIgfSBmcm9tICcuLi9zaGFyZWRPcHRpb25zQnVpbGRlci5qcyc7XG5cbmltcG9ydCB7IGh0dHBTZXJ2ZXJQYWNrYWdlcyB9IGZyb20gJy4vaHR0cFNlcnZlclBhY2thZ2VzLmpzJztcblxuY29uc3QgYnVpbGRlciA9IHtcbiAgLi4uc2NyaXB0T3B0aW9uc0J1aWxkZXIsXG4gIG1vZGU6IHtcbiAgICBkZXNjcmlwdGlvbjogJ1N0YXJ0IG1vZGU6IGRldltlbG9wbWVudF0gKGRlZmF1bHQpIHwgc3RhZ2luZyB8IGRvY2tlciB8IGRvY2tlci1kZWJ1ZyB8IHRlc3QnLFxuICAgIHR5cGU6ICdzdHJpbmcnLFxuICAgIGFsaWFzOiAnbScsXG4gIH0sXG59IGFzIGNvbnN0O1xuXG5leHBvcnQgY29uc3Qgc3RhcnRDb21tYW5kOiBDb21tYW5kTW9kdWxlPHVua25vd24sIEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIGJ1aWxkZXIgJiB0eXBlb2Ygc2hhcmVkT3B0aW9uc0J1aWxkZXI+PiA9IHtcbiAgY29tbWFuZDogJ3N0YXJ0IFthcmdzLi5dJyxcbiAgZGVzY3JpYmU6XG4gICAgXCJTdGFydCBhcHAuIFVzZSAnLS0nIHRvIHN0b3Agd2Igb3B0aW9uIHBhcnNpbmcgYW5kIGZvcndhcmQgdGhlIHJlbWFpbmluZyBhcmd1bWVudHMgdG8gdGhlIHVuZGVybHlpbmcgYXBwIGNvbW1hbmQuIEV4YW1wbGU6IHdiIHN0YXJ0IC0tIC0taG9zdCAwLjAuMC4wXCIsXG4gIGJ1aWxkZXI6ICh5YXJnczogQXJndjx1bmtub3duPikgPT5cbiAgICB5YXJncy5wYXJzZXJDb25maWd1cmF0aW9uKHsgJ3BvcHVsYXRlLS0nOiB0cnVlIH0pLm9wdGlvbnMoYnVpbGRlcikgYXMgQXJndjxcbiAgICAgIEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIGJ1aWxkZXIgJiB0eXBlb2Ygc2hhcmVkT3B0aW9uc0J1aWxkZXI+XG4gICAgPixcbiAgYXN5bmMgaGFuZGxlcihhcmd2KSB7XG4gICAgbm9ybWFsaXplQXJncyhhcmd2KTtcblxuICAgIGNvbnN0IHByb2plY3RzID0gYXdhaXQgZmluZERlc2NlbmRhbnRQcm9qZWN0cyhhcmd2KTtcbiAgICBpZiAoIXByb2plY3RzKSB7XG4gICAgICBjb25zb2xlLmVycm9yKGNoYWxrLnJlZCgnTm8gcHJvamVjdCBmb3VuZC4nKSk7XG4gICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgfVxuXG4gICAgZm9yIChjb25zdCBwcm9qZWN0IG9mIHByb2plY3RzLmRlc2NlbmRhbnRzKSB7XG4gICAgICBjb25zdCBkZXBzID0gcHJvamVjdC5wYWNrYWdlSnNvbi5kZXBlbmRlbmNpZXMgPz8ge307XG4gICAgICBjb25zdCBkZXZEZXBzID0gcHJvamVjdC5wYWNrYWdlSnNvbi5kZXZEZXBlbmRlbmNpZXMgPz8ge307XG4gICAgICBsZXQgc2NyaXB0czogQmFzZVNjcmlwdHM7XG4gICAgICBpZiAoZGVwcy5ibGl0eikge1xuICAgICAgICBzY3JpcHRzID0gYmxpdHpTY3JpcHRzO1xuICAgICAgfSBlbHNlIGlmIChkZXBzLnZpbmV4dCB8fCBkZXZEZXBzLnZpbmV4dCkge1xuICAgICAgICAvLyB2aW5leHQgYXBwcyBhbHNvIGRlcGVuZCBvbiBuZXh0LCBzbyB0aGlzIGNoZWNrIG11c3QgY29tZSBmaXJzdC5cbiAgICAgICAgc2NyaXB0cyA9IHZpbmV4dFNjcmlwdHM7XG4gICAgICB9IGVsc2UgaWYgKGRlcHMubmV4dCkge1xuICAgICAgICBzY3JpcHRzID0gbmV4dFNjcmlwdHM7XG4gICAgICB9IGVsc2UgaWYgKGRldkRlcHNbJ0ByZW1peC1ydW4vZGV2J10pIHtcbiAgICAgICAgc2NyaXB0cyA9IHJlbWl4U2NyaXB0cztcbiAgICAgIH0gZWxzZSBpZiAoZGV2RGVwcy52aXRlKSB7XG4gICAgICAgIHNjcmlwdHMgPSB2aXRlU2NyaXB0cztcbiAgICAgIH0gZWxzZSBpZiAoZmluZFdyYW5nbGVyQ29uZmlnUGF0aChwcm9qZWN0KSkge1xuICAgICAgICAvLyBQbGFpbiBDbG91ZGZsYXJlIFdvcmtlcnMgYXBwOyB2aW5leHQgYXBwcyBhcmUgZGV0ZWN0ZWQgYWJvdmUuXG4gICAgICAgIHNjcmlwdHMgPSB3b3JrZXJzU2NyaXB0cztcbiAgICAgIH0gZWxzZSBpZiAoXG4gICAgICAgIChodHRwU2VydmVyUGFja2FnZXMuc29tZSgocCkgPT4gZGVwc1twXSkgJiYgIWRlcHNbJ2ZpcmViYXNlLWZ1bmN0aW9ucyddKSB8fFxuICAgICAgICAocHJvamVjdC5oYXNEb2NrZXJmaWxlICYmIC9FWFBPU0VcXHMrODA4MC8udGVzdChwcm9qZWN0LmRvY2tlcmZpbGUpKVxuICAgICAgKSB7XG4gICAgICAgIHNjcmlwdHMgPSBodHRwU2VydmVyU2NyaXB0cztcbiAgICAgIH0gZWxzZSBpZiAoZGVwc1snYnVpbGQtdHMnXSB8fCBkZXZEZXBzWydidWlsZC10cyddKSB7XG4gICAgICAgIHNjcmlwdHMgPSBwbGFpbkFwcFNjcmlwdHM7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGNvbnNvbGUuaW5mbyhgUnVubmluZyBcInN0YXJ0XCIgZm9yICR7cHJvamVjdC5uYW1lfSAuLi5gKTtcblxuICAgICAgc3dpdGNoIChhcmd2Lm1vZGUgPz8gJ2RldicpIHtcbiAgICAgICAgY2FzZSAnZGV2JzpcbiAgICAgICAgY2FzZSAnZGV2ZWxvcG1lbnQnOiB7XG4gICAgICAgICAgcHJvY2Vzcy5lbnYuV0JfRU5WIHx8PSAnZGV2ZWxvcG1lbnQnO1xuICAgICAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bihhd2FpdCBzY3JpcHRzLnN0YXJ0RGV2KHByb2plY3QsIGFyZ3YpLCBwcm9qZWN0LCBhcmd2KTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBjYXNlICdzdGFnaW5nJzoge1xuICAgICAgICAgIHByb2Nlc3MuZW52LldCX0VOViB8fD0gJ3N0YWdpbmcnO1xuICAgICAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bihhd2FpdCBzY3JpcHRzLnN0YXJ0UHJvZHVjdGlvbihwcm9qZWN0LCBhcmd2KSwgcHJvamVjdCwgYXJndik7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSAnZG9ja2VyJzoge1xuICAgICAgICAgIHByb2Nlc3MuZW52LldCX0VOViB8fD0gJ3N0YWdpbmcnO1xuICAgICAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bihhd2FpdCBzY3JpcHRzLnN0YXJ0RG9ja2VyKHByb2plY3QsIGFyZ3YpLCBwcm9qZWN0LCBhcmd2KTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBjYXNlICdkb2NrZXItZGVidWcnOiB7XG4gICAgICAgICAgcHJvY2Vzcy5lbnYuV0JfRU5WIHx8PSAnc3RhZ2luZyc7XG4gICAgICAgICAgYXJndi5ub3JtYWxpemVkQXJnc1RleHQgPSBgJy9iaW4vYmFzaCdgO1xuICAgICAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bihhd2FpdCBzY3JpcHRzLnN0YXJ0RG9ja2VyKHByb2plY3QsIGFyZ3YpLCBwcm9qZWN0LCBhcmd2KTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBjYXNlICd0ZXN0Jzoge1xuICAgICAgICAgIHByb2Nlc3MuZW52LldCX0VOViB8fD0gJ3Rlc3QnO1xuICAgICAgICAgIGNvbnN0IHNjcmlwdCA9IGF3YWl0IHNjcmlwdHMuc3RhcnRUZXN0KHByb2plY3QsIGFyZ3YpO1xuICAgICAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bihzY3JpcHQsIHByb2plY3QsIGFyZ3YpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGRlZmF1bHQ6IHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFVua25vd24gc3RhcnQgbW9kZTogJHthcmd2Lm1vZGV9YCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH0sXG59O1xuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IGNoYWxrIGZyb20gJ2NoYWxrJztcbmltcG9ydCB7IGRpc3RhbmNlIH0gZnJvbSAnZmFzdGVzdC1sZXZlbnNodGVpbic7XG5pbXBvcnQgdHlwZSB7IEFyZ3YsIEFyZ3VtZW50c0NhbWVsQ2FzZSwgQ29tbWFuZE1vZHVsZSwgSW5mZXJyZWRPcHRpb25UeXBlcyB9IGZyb20gJ3lhcmdzJztcblxuaW1wb3J0IHR5cGUgeyBQcm9qZWN0IH0gZnJvbSAnLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQgeyBmaW5kRGVzY2VuZGFudFByb2plY3RzIH0gZnJvbSAnLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQgdHlwZSB7IHNjcmlwdE9wdGlvbnNCdWlsZGVyIH0gZnJvbSAnLi4vc2NyaXB0cy9idWlsZGVyLmpzJztcbmltcG9ydCB7IHRvRGV2TnVsbCB9IGZyb20gJy4uL3NjcmlwdHMvYnVpbGRlci5qcyc7XG5pbXBvcnQgeyBkb2NrZXJTY3JpcHRzIH0gZnJvbSAnLi4vc2NyaXB0cy9kb2NrZXJTY3JpcHRzLmpzJztcbmltcG9ydCB0eXBlIHsgQmFzZVNjcmlwdHMgfSBmcm9tICcuLi9zY3JpcHRzL2V4ZWN1dGlvbi9iYXNlU2NyaXB0cy5qcyc7XG5pbXBvcnQgeyBmaW5kRXhwbGljaXRQbGF5d3JpZ2h0VGFyZ2V0SW5kZXhlcyB9IGZyb20gJy4uL3NjcmlwdHMvZXhlY3V0aW9uL2Jhc2VTY3JpcHRzLmpzJztcbmltcG9ydCB7IGJsaXR6U2NyaXB0cyB9IGZyb20gJy4uL3NjcmlwdHMvZXhlY3V0aW9uL2JsaXR6U2NyaXB0cy5qcyc7XG5pbXBvcnQgeyBodHRwU2VydmVyU2NyaXB0cyB9IGZyb20gJy4uL3NjcmlwdHMvZXhlY3V0aW9uL2h0dHBTZXJ2ZXJTY3JpcHRzLmpzJztcbmltcG9ydCB7IG5leHRTY3JpcHRzIH0gZnJvbSAnLi4vc2NyaXB0cy9leGVjdXRpb24vbmV4dFNjcmlwdHMuanMnO1xuaW1wb3J0IHsgcGxhaW5BcHBTY3JpcHRzIH0gZnJvbSAnLi4vc2NyaXB0cy9leGVjdXRpb24vcGxhaW5BcHBTY3JpcHRzLmpzJztcbmltcG9ydCB7IHJlbWl4U2NyaXB0cyB9IGZyb20gJy4uL3NjcmlwdHMvZXhlY3V0aW9uL3JlbWl4U2NyaXB0cy5qcyc7XG5pbXBvcnQgeyB2aW5leHRTY3JpcHRzIH0gZnJvbSAnLi4vc2NyaXB0cy9leGVjdXRpb24vdmluZXh0U2NyaXB0cy5qcyc7XG5pbXBvcnQgeyB2aXRlU2NyaXB0cyB9IGZyb20gJy4uL3NjcmlwdHMvZXhlY3V0aW9uL3ZpdGVTY3JpcHRzLmpzJztcbmltcG9ydCB7IHdvcmtlcnNTY3JpcHRzIH0gZnJvbSAnLi4vc2NyaXB0cy9leGVjdXRpb24vd29ya2Vyc1NjcmlwdHMuanMnO1xuaW1wb3J0IHsgcnVuV2l0aFNwYXduIH0gZnJvbSAnLi4vc2NyaXB0cy9ydW4uanMnO1xuaW1wb3J0IHR5cGUgeyBzaGFyZWRPcHRpb25zQnVpbGRlciB9IGZyb20gJy4uL3NoYXJlZE9wdGlvbnNCdWlsZGVyLmpzJztcbmltcG9ydCB7IGZpbmRXcmFuZ2xlckNvbmZpZ1BhdGggfSBmcm9tICcuLi91dGlscy93cmFuZ2xlci5qcyc7XG5cbmltcG9ydCB7IGh0dHBTZXJ2ZXJQYWNrYWdlcyB9IGZyb20gJy4vaHR0cFNlcnZlclBhY2thZ2VzLmpzJztcblxuY29uc3QgQU5TSV9FU0NBUEVfQ09ERV9SRUdFWFAgPSBuZXcgUmVnRXhwKGAke1N0cmluZy5mcm9tQ29kZVBvaW50KDI3KX1cXFxcW1swLT9dKlsgLS9dKltALX5dYCwgJ2cnKTtcbmNvbnN0IFNJTUlMQVJfVEVTVF9PVVRQVVRfTE9PS0JBQ0tfTElORV9DT1VOVCA9IDIwMDtcbmNvbnN0IFNJTUlMQVJfVEVTVF9PVVRQVVRfRElTVEFOQ0VfUkFUSU8gPSAwLjA1O1xuXG5jb25zdCBidWlsZGVyID0ge1xuICBlMmU6IHtcbiAgICBkZXNjcmlwdGlvbjogJ0hvdyB0byBydW4gRTJFIHRlc3RzJyxcbiAgICB0eXBlOiAnc3RyaW5nJyxcbiAgICBjaG9pY2VzOiBbXG4gICAgICAnaGVhZGxlc3MnLFxuICAgICAgJ2hlYWRsZXNzLWRldicsXG4gICAgICAnaGVhZGVkJyxcbiAgICAgICdoZWFkZWQtZGV2JyxcbiAgICAgICdkb2NrZXInLFxuICAgICAgJ2RvY2tlci1kZWJ1ZycsXG4gICAgICAnZGVidWcnLFxuICAgICAgJ2dlbmVyYXRlJyxcbiAgICAgICd0cmFjZScsXG4gICAgXSxcbiAgICBkZWZhdWx0OiAnaGVhZGxlc3MnLFxuICB9LFxuICBzaWxlbnQ6IHtcbiAgICBkZXNjcmlwdGlvbjogJ1JlZHVjZSByZWR1bmRhbnQgb3V0cHV0cycsXG4gICAgdHlwZTogJ2Jvb2xlYW4nLFxuICB9LFxuICBiYWlsOiB7XG4gICAgZGVzY3JpcHRpb246ICdTdG9wIHRlc3RzIGFmdGVyIHRoZSBmaXJzdCBmYWlsdXJlJyxcbiAgICB0eXBlOiAnYm9vbGVhbicsXG4gIH0sXG4gICd1bml0LXRpbWVvdXQnOiB7XG4gICAgZGVzY3JpcHRpb246ICdUaW1lb3V0IGZvciB1bml0IHRlc3RzJyxcbiAgICB0eXBlOiAnbnVtYmVyJyxcbiAgfSxcbn0gYXMgY29uc3Q7XG5cbmNvbnN0IGFyZ3VtZW50c0J1aWxkZXIgPSB7XG4gIHRhcmdldHM6IHtcbiAgICBhcnJheTogdHJ1ZSxcbiAgICBkZXNjcmlwdGlvbjogJ1VuaXQgb3IgRTJFIHRlc3QgdGFyZ2V0IHBhdGhzJyxcbiAgICB0eXBlOiAnc3RyaW5nJyxcbiAgfSxcbn0gYXMgY29uc3Q7XG5cbnR5cGUgVGVzdENvbW1hbmRPcHRpb25zID0gSW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgYnVpbGRlciAmIHR5cGVvZiBzaGFyZWRPcHRpb25zQnVpbGRlciAmIHR5cGVvZiBhcmd1bWVudHNCdWlsZGVyPjtcblxuZXhwb3J0IHR5cGUgVGVzdEFyZ3YgPSBQYXJ0aWFsPFxuICBBcmd1bWVudHNDYW1lbENhc2U8SW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgYnVpbGRlciAmIHR5cGVvZiBzY3JpcHRPcHRpb25zQnVpbGRlciAmIHR5cGVvZiBhcmd1bWVudHNCdWlsZGVyPj5cbj47XG5cbmV4cG9ydCB0eXBlIFRlc3RDb21tYW5kQXJndiA9IEFyZ3VtZW50c0NhbWVsQ2FzZTxUZXN0Q29tbWFuZE9wdGlvbnM+ICYgeyAnLS0nPzogc3RyaW5nW10gfTtcblxuZXhwb3J0IGludGVyZmFjZSBUZXN0UnVuT3B0aW9ucyB7XG4gIGV4aXRJZkZhaWxlZD86IGJvb2xlYW47XG59XG5cbmV4cG9ydCBjb25zdCB0ZXN0Q29tbWFuZDogQ29tbWFuZE1vZHVsZTx1bmtub3duLCBUZXN0Q29tbWFuZE9wdGlvbnM+ID0ge1xuICBjb21tYW5kOiAndGVzdCBbdGFyZ2V0cy4uLl0nLFxuICBkZXNjcmliZTpcbiAgICBcIlRlc3QgcHJvamVjdC4gSWYgeW91IHBhc3Mgbm8gYXJndW1lbnRzLCBpdCB3aWxsIHJ1biBhbGwgdGVzdHMuIFVzZSAnLS0nIHRvIHN0b3Agd2Igb3B0aW9uIHBhcnNpbmcgYW5kIGZvcndhcmQgdGhlIHJlbWFpbmluZyBmbGFncyB0byBQbGF5d3JpZ2h0LiBFeGFtcGxlOiB3YiB0ZXN0IC0tIC0tZ3JlcCAndXBsb2FkZWQgaW1hZ2UgYXNzZXQnXCIsXG4gIGJ1aWxkZXI6ICh5YXJnczogQXJndjx1bmtub3duPik6IEFyZ3Y8VGVzdENvbW1hbmRPcHRpb25zPiA9PlxuICAgIHlhcmdzXG4gICAgICAucGFyc2VyQ29uZmlndXJhdGlvbih7ICdwb3B1bGF0ZS0tJzogdHJ1ZSB9KVxuICAgICAgLm9wdGlvbnMoYnVpbGRlcilcbiAgICAgIC5wb3NpdGlvbmFsKCd0YXJnZXRzJywgYXJndW1lbnRzQnVpbGRlci50YXJnZXRzKSBhcyBBcmd2PFRlc3RDb21tYW5kT3B0aW9ucz4sXG4gIGFzeW5jIGhhbmRsZXIoYXJndikge1xuICAgIHByb2Nlc3MuZXhpdChhd2FpdCB0ZXN0KGFyZ3YgYXMgVGVzdENvbW1hbmRBcmd2KSk7XG4gIH0sXG59O1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gdGVzdChhcmd2OiBUZXN0Q29tbWFuZEFyZ3YsIG9wdGlvbnM6IFRlc3RSdW5PcHRpb25zID0ge30pOiBQcm9taXNlPG51bWJlcj4ge1xuICBjb25zdCB0ZXN0QXJndiA9IHdpdGhEZWZhdWx0VGVzdENhc2NhZGVFbnYoYXJndik7XG4gIGNvbnN0IHByb2plY3RzID0gYXdhaXQgZmluZERlc2NlbmRhbnRQcm9qZWN0cyh0ZXN0QXJndik7XG4gIGlmICghcHJvamVjdHMpIHtcbiAgICBjb25zb2xlLmVycm9yKGNoYWxrLnJlZCgnTm8gcHJvamVjdCBmb3VuZC4nKSk7XG4gICAgcmV0dXJuIDE7XG4gIH1cblxuICAvLyBHZXQgdGVzdCB0YXJnZXRzIGZyb20gcG9zaXRpb25hbCBhcmd1bWVudHNcbiAgY29uc3QgdGVzdFRhcmdldHMgPSAodGVzdEFyZ3YudGFyZ2V0cyA/PyBbXSkgYXMgc3RyaW5nW107XG4gIGNvbnN0IGZvcndhcmRlZFBsYXl3cmlnaHRBcmdzID0gdGVzdEFyZ3ZbJy0tJ10gPz8gW107XG4gIGNvbnN0IHsgc2hvdWxkUnVuRTJlLCBzaG91bGRSdW5Vbml0IH0gPSByZXNvbHZlVGVzdEV4ZWN1dGlvblRhcmdldHModGVzdFRhcmdldHMsIGZvcndhcmRlZFBsYXl3cmlnaHRBcmdzKTtcblxuICBmb3IgKGNvbnN0IHByb2plY3Qgb2YgcHJvamVjdHMuZGVzY2VuZGFudHMpIHtcbiAgICBwcm9qZWN0LmVudi5XQl9FTlYgfHw9ICd0ZXN0JztcblxuICAgIGNvbnN0IGRlcHMgPSBwcm9qZWN0LnBhY2thZ2VKc29uLmRlcGVuZGVuY2llcyA/PyB7fTtcbiAgICBjb25zdCBkZXZEZXBzID0gcHJvamVjdC5wYWNrYWdlSnNvbi5kZXZEZXBlbmRlbmNpZXMgPz8ge307XG4gICAgbGV0IHNjcmlwdHM6IEJhc2VTY3JpcHRzO1xuICAgIGlmIChkZXBzLmJsaXR6KSB7XG4gICAgICBzY3JpcHRzID0gYmxpdHpTY3JpcHRzO1xuICAgIH0gZWxzZSBpZiAoZGVwcy52aW5leHQgfHwgZGV2RGVwcy52aW5leHQpIHtcbiAgICAgIC8vIHZpbmV4dCBhcHBzIGFsc28gZGVwZW5kIG9uIG5leHQsIHNvIHRoaXMgY2hlY2sgbXVzdCBjb21lIGZpcnN0LlxuICAgICAgc2NyaXB0cyA9IHZpbmV4dFNjcmlwdHM7XG4gICAgfSBlbHNlIGlmIChkZXBzLm5leHQpIHtcbiAgICAgIHNjcmlwdHMgPSBuZXh0U2NyaXB0cztcbiAgICB9IGVsc2UgaWYgKGRldkRlcHNbJ0ByZW1peC1ydW4vZGV2J10pIHtcbiAgICAgIHNjcmlwdHMgPSByZW1peFNjcmlwdHM7XG4gICAgfSBlbHNlIGlmIChkZXZEZXBzLnZpdGUpIHtcbiAgICAgIHNjcmlwdHMgPSB2aXRlU2NyaXB0cztcbiAgICB9IGVsc2UgaWYgKGZpbmRXcmFuZ2xlckNvbmZpZ1BhdGgocHJvamVjdCkpIHtcbiAgICAgIC8vIFBsYWluIENsb3VkZmxhcmUgV29ya2VycyBhcHA7IHZpbmV4dCBhcHBzIGFyZSBkZXRlY3RlZCBhYm92ZS5cbiAgICAgIHNjcmlwdHMgPSB3b3JrZXJzU2NyaXB0cztcbiAgICB9IGVsc2UgaWYgKGh0dHBTZXJ2ZXJQYWNrYWdlcy5zb21lKChwKSA9PiBkZXBzW3BdKSAmJiAhZGVwc1snZmlyZWJhc2UtZnVuY3Rpb25zJ10pIHtcbiAgICAgIHNjcmlwdHMgPSBodHRwU2VydmVyU2NyaXB0cztcbiAgICB9IGVsc2Uge1xuICAgICAgc2NyaXB0cyA9IHBsYWluQXBwU2NyaXB0cztcbiAgICB9XG5cbiAgICBjb25zb2xlLmluZm8oYFJ1bm5pbmcgXCJ0ZXN0XCIgZm9yICR7cHJvamVjdC5uYW1lfSAuLi5gKTtcblxuICAgIC8vIFJ1biB1bml0IHRlc3RzIGlmIG5lZWRlZFxuICAgIGNvbnN0IGRlZmF1bHRVbml0VGFyZ2V0cyA9IGdldERlZmF1bHRVbml0VGFyZ2V0cyhwcm9qZWN0KTtcbiAgICBpZiAoc2hvdWxkUnVuVW5pdCAmJiBkZWZhdWx0VW5pdFRhcmdldHMgIT09IGZhbHNlKSB7XG4gICAgICBjb25zdCB1bml0VGFyZ2V0cyA9IHRlc3RUYXJnZXRzLmZpbHRlcigodGFyZ2V0KSA9PiB0YXJnZXQuaW5jbHVkZXMoJy91bml0JykpO1xuICAgICAgY29uc3QgdGFyZ2V0cyA9XG4gICAgICAgIHVuaXRUYXJnZXRzLmxlbmd0aCA+IDAgPyB1bml0VGFyZ2V0cyA6IGRlZmF1bHRVbml0VGFyZ2V0cy5sZW5ndGggPiAwID8gZGVmYXVsdFVuaXRUYXJnZXRzIDogdW5kZWZpbmVkO1xuICAgICAgY29uc3QgdW5pdEFyZ3YgPSB7IC4uLnRlc3RBcmd2LCB0YXJnZXRzIH07XG4gICAgICBjb25zdCBleGl0Q29kZSA9IGF3YWl0IHJ1blVuaXRUZXN0Q29tbWFuZChzY3JpcHRzLnRlc3RVbml0KHByb2plY3QsIHVuaXRBcmd2KSwgcHJvamVjdCwgdGVzdEFyZ3YsIHtcbiAgICAgICAgZXhpdElmRmFpbGVkOiBvcHRpb25zLmV4aXRJZkZhaWxlZCxcbiAgICAgICAgdGltZW91dDogdGVzdEFyZ3YudW5pdFRpbWVvdXQsXG4gICAgICB9KTtcbiAgICAgIGlmIChleGl0Q29kZSAhPT0gMCkge1xuICAgICAgICByZXR1cm4gZXhpdENvZGU7XG4gICAgICB9XG4gICAgfVxuICAgIC8vIFNraXAgZTJlIHRlc3RzIGlmIG5vdCBuZWVkZWQgb3Igbm8gZTJlIGRpcmVjdG9yeSBleGlzdHNcbiAgICBpZiAoIXNob3VsZFJ1bkUyZSB8fCAhZnMuZXhpc3RzU3luYyhwYXRoLmpvaW4ocHJvamVjdC5kaXJQYXRoLCAndGVzdCcsICdlMmUnKSkpIHtcbiAgICAgIGlmIChzaG91bGRSdW5FMmUpIHdhcm5JZlBsYXl3cmlnaHRTcGVjc0FyZVVuZGlzY292ZXJhYmxlKHByb2plY3QpO1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgLy8gR2V0IGUyZSB0YXJnZXRzIGZvciB0aGlzIHByb2plY3RcbiAgICBjb25zdCBlMmVUYXJnZXRzID0gdGVzdFRhcmdldHMuZmlsdGVyKCh0YXJnZXQpID0+IHRhcmdldC5pbmNsdWRlcygnL2UyZScpKTtcbiAgICBjb25zdCBlMmVBcmd2ID0geyAuLi50ZXN0QXJndiwgdGFyZ2V0czogZTJlVGFyZ2V0cy5sZW5ndGggPiAwID8gZTJlVGFyZ2V0cyA6IHVuZGVmaW5lZCB9O1xuXG4gICAgc3dpdGNoICh0ZXN0QXJndi5lMmUpIHtcbiAgICAgIGNhc2UgJ2hlYWRsZXNzJzoge1xuICAgICAgICBjb25zdCBleGl0Q29kZSA9IGF3YWl0IHJ1blRlc3RDb21tYW5kKFxuICAgICAgICAgIGF3YWl0IHNjcmlwdHMudGVzdEUyRVByb2R1Y3Rpb24ocHJvamVjdCwgZTJlQXJndiwge1xuICAgICAgICAgICAgcGxheXdyaWdodEFyZ3M6IGJ1aWxkUGxheXdyaWdodEFyZ3NGb3JFMkUoZTJlVGFyZ2V0cywgZm9yd2FyZGVkUGxheXdyaWdodEFyZ3MpLFxuICAgICAgICAgICAgZm9yd2FyZGVkUGxheXdyaWdodEFyZ3MsXG4gICAgICAgICAgfSksXG4gICAgICAgICAgcHJvamVjdCxcbiAgICAgICAgICB0ZXN0QXJndixcbiAgICAgICAgICB7IGV4aXRJZkZhaWxlZDogb3B0aW9ucy5leGl0SWZGYWlsZWQgfVxuICAgICAgICApO1xuICAgICAgICBpZiAoZXhpdENvZGUgIT09IDApIHJldHVybiBleGl0Q29kZTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBjYXNlICdoZWFkbGVzcy1kZXYnOiB7XG4gICAgICAgIGNvbnN0IGV4aXRDb2RlID0gYXdhaXQgcnVuVGVzdENvbW1hbmQoXG4gICAgICAgICAgYXdhaXQgc2NyaXB0cy50ZXN0RTJFRGV2KHByb2plY3QsIGUyZUFyZ3YsIHtcbiAgICAgICAgICAgIHBsYXl3cmlnaHRBcmdzOiBidWlsZFBsYXl3cmlnaHRBcmdzRm9yRTJFKGUyZVRhcmdldHMsIGZvcndhcmRlZFBsYXl3cmlnaHRBcmdzKSxcbiAgICAgICAgICAgIGZvcndhcmRlZFBsYXl3cmlnaHRBcmdzLFxuICAgICAgICAgIH0pLFxuICAgICAgICAgIHByb2plY3QsXG4gICAgICAgICAgdGVzdEFyZ3YsXG4gICAgICAgICAgeyBleGl0SWZGYWlsZWQ6IG9wdGlvbnMuZXhpdElmRmFpbGVkIH1cbiAgICAgICAgKTtcbiAgICAgICAgaWYgKGV4aXRDb2RlICE9PSAwKSByZXR1cm4gZXhpdENvZGU7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgY2FzZSAnZG9ja2VyJzoge1xuICAgICAgICBjb25zdCBleGl0Q29kZSA9IGF3YWl0IHRlc3RPbkRvY2tlcihcbiAgICAgICAgICBwcm9qZWN0LFxuICAgICAgICAgIGUyZUFyZ3YsXG4gICAgICAgICAgc2NyaXB0cyxcbiAgICAgICAgICBidWlsZFBsYXl3cmlnaHRBcmdzRm9yRTJFKGUyZVRhcmdldHMsIGZvcndhcmRlZFBsYXl3cmlnaHRBcmdzKSxcbiAgICAgICAgICBmb3J3YXJkZWRQbGF5d3JpZ2h0QXJncyxcbiAgICAgICAgICBvcHRpb25zXG4gICAgICAgICk7XG4gICAgICAgIGlmIChleGl0Q29kZSAhPT0gMCkgcmV0dXJuIGV4aXRDb2RlO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGNhc2UgJ2RvY2tlci1kZWJ1Zyc6IHtcbiAgICAgICAgY29uc3QgZXhpdENvZGUgPSBhd2FpdCB0ZXN0T25Eb2NrZXIoXG4gICAgICAgICAgcHJvamVjdCxcbiAgICAgICAgICBlMmVBcmd2LFxuICAgICAgICAgIHNjcmlwdHMsXG4gICAgICAgICAgYnVpbGRQbGF5d3JpZ2h0QXJnc0ZvckUyRShlMmVUYXJnZXRzLCBmb3J3YXJkZWRQbGF5d3JpZ2h0QXJncywgWyctLWRlYnVnJ10pLFxuICAgICAgICAgIGZvcndhcmRlZFBsYXl3cmlnaHRBcmdzLFxuICAgICAgICAgIG9wdGlvbnNcbiAgICAgICAgKTtcbiAgICAgICAgaWYgKGV4aXRDb2RlICE9PSAwKSByZXR1cm4gZXhpdENvZGU7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoZGVwcy5ibGl0eiB8fCBkZXBzLm5leHQgfHwgZGV2RGVwc1snQHJlbWl4LXJ1bi9kZXYnXSB8fCBkZXZEZXBzLnZpdGUpIHtcbiAgICAgIHN3aXRjaCAodGVzdEFyZ3YuZTJlKSB7XG4gICAgICAgIGNhc2UgJ2hlYWRlZCc6IHtcbiAgICAgICAgICBjb25zdCBleGl0Q29kZSA9IGF3YWl0IHJ1blRlc3RDb21tYW5kKFxuICAgICAgICAgICAgYXdhaXQgc2NyaXB0cy50ZXN0RTJFUHJvZHVjdGlvbihwcm9qZWN0LCBlMmVBcmd2LCB7XG4gICAgICAgICAgICAgIHBsYXl3cmlnaHRBcmdzOiBidWlsZFBsYXl3cmlnaHRBcmdzRm9yRTJFKGUyZVRhcmdldHMsIGZvcndhcmRlZFBsYXl3cmlnaHRBcmdzLCBbJy0taGVhZGVkJ10pLFxuICAgICAgICAgICAgICBmb3J3YXJkZWRQbGF5d3JpZ2h0QXJncyxcbiAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgcHJvamVjdCxcbiAgICAgICAgICAgIHRlc3RBcmd2LFxuICAgICAgICAgICAgeyBleGl0SWZGYWlsZWQ6IG9wdGlvbnMuZXhpdElmRmFpbGVkIH1cbiAgICAgICAgICApO1xuICAgICAgICAgIGlmIChleGl0Q29kZSAhPT0gMCkgcmV0dXJuIGV4aXRDb2RlO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgJ2hlYWRlZC1kZXYnOiB7XG4gICAgICAgICAgY29uc3QgZXhpdENvZGUgPSBhd2FpdCBydW5UZXN0Q29tbWFuZChcbiAgICAgICAgICAgIGF3YWl0IHNjcmlwdHMudGVzdEUyRURldihwcm9qZWN0LCBlMmVBcmd2LCB7XG4gICAgICAgICAgICAgIHBsYXl3cmlnaHRBcmdzOiBidWlsZFBsYXl3cmlnaHRBcmdzRm9yRTJFKGUyZVRhcmdldHMsIGZvcndhcmRlZFBsYXl3cmlnaHRBcmdzLCBbJy0taGVhZGVkJ10pLFxuICAgICAgICAgICAgICBmb3J3YXJkZWRQbGF5d3JpZ2h0QXJncyxcbiAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgcHJvamVjdCxcbiAgICAgICAgICAgIHRlc3RBcmd2LFxuICAgICAgICAgICAgeyBleGl0SWZGYWlsZWQ6IG9wdGlvbnMuZXhpdElmRmFpbGVkIH1cbiAgICAgICAgICApO1xuICAgICAgICAgIGlmIChleGl0Q29kZSAhPT0gMCkgcmV0dXJuIGV4aXRDb2RlO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgJ2RlYnVnJzoge1xuICAgICAgICAgIGNvbnN0IGV4aXRDb2RlID0gYXdhaXQgcnVuVGVzdENvbW1hbmQoXG4gICAgICAgICAgICBhd2FpdCBzY3JpcHRzLnRlc3RFMkVQcm9kdWN0aW9uKHByb2plY3QsIGUyZUFyZ3YsIHtcbiAgICAgICAgICAgICAgcGxheXdyaWdodEFyZ3M6IGJ1aWxkUGxheXdyaWdodEFyZ3NGb3JFMkUoZTJlVGFyZ2V0cywgZm9yd2FyZGVkUGxheXdyaWdodEFyZ3MsIFsnLS1kZWJ1ZyddKSxcbiAgICAgICAgICAgICAgZm9yd2FyZGVkUGxheXdyaWdodEFyZ3MsXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICAgIHByb2plY3QsXG4gICAgICAgICAgICB0ZXN0QXJndixcbiAgICAgICAgICAgIHsgZXhpdElmRmFpbGVkOiBvcHRpb25zLmV4aXRJZkZhaWxlZCB9XG4gICAgICAgICAgKTtcbiAgICAgICAgICBpZiAoZXhpdENvZGUgIT09IDApIHJldHVybiBleGl0Q29kZTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBjYXNlICdnZW5lcmF0ZSc6IHtcbiAgICAgICAgICBjb25zdCBleGl0Q29kZSA9IGF3YWl0IHJ1blRlc3RDb21tYW5kKFxuICAgICAgICAgICAgYXdhaXQgc2NyaXB0cy50ZXN0RTJFUHJvZHVjdGlvbihwcm9qZWN0LCBlMmVBcmd2LCB7XG4gICAgICAgICAgICAgIHBsYXl3cmlnaHRBcmdzOiBbJ2NvZGVnZW4nLCBgaHR0cDovL2xvY2FsaG9zdDoke3Byb2plY3QuZW52LlBPUlR9YF0sXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICAgIHByb2plY3QsXG4gICAgICAgICAgICB0ZXN0QXJndixcbiAgICAgICAgICAgIHsgZXhpdElmRmFpbGVkOiBvcHRpb25zLmV4aXRJZkZhaWxlZCB9XG4gICAgICAgICAgKTtcbiAgICAgICAgICBpZiAoZXhpdENvZGUgIT09IDApIHJldHVybiBleGl0Q29kZTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBjYXNlICd0cmFjZSc6IHtcbiAgICAgICAgICBjb25zdCBleGl0Q29kZSA9IGF3YWl0IHJ1blRlc3RDb21tYW5kKGBCVU4gcGxheXdyaWdodCBzaG93LXRyYWNlYCwgcHJvamVjdCwgdGVzdEFyZ3YsIHtcbiAgICAgICAgICAgIGV4aXRJZkZhaWxlZDogb3B0aW9ucy5leGl0SWZGYWlsZWQsXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgaWYgKGV4aXRDb2RlICE9PSAwKSByZXR1cm4gZXhpdENvZGU7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcmV0dXJuIDA7XG59XG5cbi8qKlxuICogV2FybiB3aGVuIGEgcHJvamVjdCBoYXMgYSBQbGF5d3JpZ2h0IGNvbmZpZyBidXQgbm8gdGVzdC9lMmUgZGlyZWN0b3J5LlxuICogd2IgZGlzY292ZXJzIGUyZSB0ZXN0cyBvbmx5IHVuZGVyIHRlc3QvZTJlLywgc28gc3VjaCBwcm9qZWN0cyB3b3VsZCBvdGhlcndpc2UgaGF2ZSB0aGVpclxuICogUGxheXdyaWdodCBzcGVjcyBzaWxlbnRseSBza2lwcGVkIGFuZCBgd2IgdGVzdGAgLyBgd2IgdmVyaWZ5IC0tZnVsbGAgd291bGQgcmVwb3J0IHN1Y2Nlc3NcbiAqIHdpdGhvdXQgcnVubmluZyBhbnkgdGVzdHMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB3YXJuSWZQbGF5d3JpZ2h0U3BlY3NBcmVVbmRpc2NvdmVyYWJsZShcbiAgcHJvamVjdDogUGljazxQcm9qZWN0LCAnZGlyUGF0aCcgfCAnbmFtZScgfCAncGFja2FnZUpzb24nPlxuKTogdm9pZCB7XG4gIC8vIENhbGxlcnMgaW52b2tlIHRoaXMgb25seSBhZnRlciBlc3RhYmxpc2hpbmcgdGhhdCB0ZXN0L2UyZSBpcyBtaXNzaW5nLCBzbyBpdCBpcyBub3QgcmUtY2hlY2tlZFxuICAvLyBoZXJlLiBBIHdvcmtzcGFjZSByb290IGRlbGVnYXRlcyBlMmUgdG8gaXRzIHBhY2thZ2VzLCBzbyBpdCBuZXZlciB3YXJucyAoY2hlY2tlZCBmaXJzdCB0byBza2lwXG4gIC8vIHRoZSBmaWxlc3lzdGVtIGxvb2t1cCBiZWxvdykuIE9ubHkgYSBwcm9qZWN0J3MgT1dOIFBsYXl3cmlnaHQgY29uZmlnIGNvdW50czogYGhhc1BsYXl3cmlnaHRDb25maWdgXG4gIC8vIHdhbGtzIHVwIHRvIHRoZSBtb25vcmVwbyByb290LCBzbyByZXVzaW5nIGl0IHdvdWxkIGZhbHNlLXBvc2l0aXZlIG9uIGxpYnJhcnkgcGFja2FnZXMgYW5kIHRoZVxuICAvLyByb290IGl0c2VsZiwgd2hpY2ggbGVnaXRpbWF0ZWx5IHNoYXJlIGEgcm9vdC1sZXZlbCBwbGF5d3JpZ2h0LmNvbmZpZy50cyBidXQga2VlcCBlMmUgc3BlY3MgaW4gYVxuICAvLyBzaW5nbGUgYXBwIHBhY2thZ2UuXG4gIGlmIChwcm9qZWN0LnBhY2thZ2VKc29uLndvcmtzcGFjZXMpIHJldHVybjtcbiAgaWYgKCFmcy5leGlzdHNTeW5jKHBhdGguam9pbihwcm9qZWN0LmRpclBhdGgsICdwbGF5d3JpZ2h0LmNvbmZpZy50cycpKSkgcmV0dXJuO1xuXG4gIGNvbnNvbGUud2FybihcbiAgICBjaGFsay55ZWxsb3coXG4gICAgICBgU2tpcHBpbmcgZTJlIHRlc3RzIGZvciAke3Byb2plY3QubmFtZX06IGEgUGxheXdyaWdodCBjb25maWcgZXhpc3RzIGJ1dCB0aGUgdGVzdC9lMmUgZGlyZWN0b3J5IGlzIG1pc3NpbmcuIHdiIG9ubHkgZGlzY292ZXJzIFBsYXl3cmlnaHQgc3BlY3MgdW5kZXIgdGVzdC9lMmUvLCBzbyBtb3ZlIHRoZW0gdGhlcmUgdG8gcnVuIGUyZSB0ZXN0cy5gXG4gICAgKVxuICApO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gd2l0aERlZmF1bHRUZXN0Q2FzY2FkZUVudihhcmd2OiBUZXN0Q29tbWFuZEFyZ3YpOiBUZXN0Q29tbWFuZEFyZ3Yge1xuICBpZiAoYXJndi5lbnY/Lmxlbmd0aCB8fCBhcmd2LmNhc2NhZGVFbnYgfHwgYXJndi5jYXNjYWRlTm9kZUVudiB8fCBhcmd2LmF1dG9DYXNjYWRlRW52ID09PSBmYWxzZSkge1xuICAgIHJldHVybiBhcmd2O1xuICB9XG4gIHJldHVybiB7IC4uLmFyZ3YsIGNhc2NhZGVFbnY6ICd0ZXN0JyB9O1xufVxuXG5mdW5jdGlvbiBnZXREZWZhdWx0VW5pdFRhcmdldHMocHJvamVjdDogUHJvamVjdCk6IHN0cmluZ1tdIHwgZmFsc2Uge1xuICBpZiAoZnMuZXhpc3RzU3luYyhwYXRoLmpvaW4ocHJvamVjdC5kaXJQYXRoLCAndGVzdCcsICd1bml0JykpKSB7XG4gICAgcmV0dXJuIFtdO1xuICB9XG4gIGlmIChwcm9qZWN0Lmhhc1ZpdGVzdCAmJiBmcy5leGlzdHNTeW5jKHBhdGguam9pbihwcm9qZWN0LmRpclBhdGgsICd0ZXN0JykpKSB7XG4gICAgcmV0dXJuIGZzLmV4aXN0c1N5bmMocGF0aC5qb2luKHByb2plY3QuZGlyUGF0aCwgJ3Rlc3QnLCAnZTJlJykpID8gWyd0ZXN0JywgJy0tZXhjbHVkZScsICd0ZXN0L2UyZS8qKiddIDogWyd0ZXN0J107XG4gIH1cbiAgcmV0dXJuIGZhbHNlO1xufVxuXG5hc3luYyBmdW5jdGlvbiB0ZXN0T25Eb2NrZXIoXG4gIHByb2plY3Q6IFByb2plY3QsXG4gIGFyZ3Y6IEFyZ3VtZW50c0NhbWVsQ2FzZTxJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBidWlsZGVyICYgdHlwZW9mIGFyZ3VtZW50c0J1aWxkZXI+PixcbiAgc2NyaXB0czogQmFzZVNjcmlwdHMsXG4gIHBsYXl3cmlnaHRBcmdzPzogc3RyaW5nW10sXG4gIGZvcndhcmRlZFBsYXl3cmlnaHRBcmdzPzogc3RyaW5nW10sXG4gIG9wdGlvbnM6IFRlc3RSdW5PcHRpb25zID0ge31cbik6IFByb21pc2U8bnVtYmVyPiB7XG4gIHByb2plY3QuZW52LldCX0RPQ0tFUiB8fD0gJzEnO1xuICBjb25zdCBidWlsZEV4aXRDb2RlID0gYXdhaXQgcnVuV2l0aFNwYXduKGAke3NjcmlwdHMuYnVpbGREb2NrZXIocHJvamVjdCwgJ3Rlc3QnKX0ke3RvRGV2TnVsbChhcmd2KX1gLCBwcm9qZWN0LCBhcmd2LCB7XG4gICAgZXhpdElmRmFpbGVkOiBvcHRpb25zLmV4aXRJZkZhaWxlZCxcbiAgfSk7XG4gIGlmIChidWlsZEV4aXRDb2RlICE9PSAwKSB7XG4gICAgcmV0dXJuIGJ1aWxkRXhpdENvZGU7XG4gIH1cbiAgY29uc3QgdGVzdEV4aXRDb2RlID0gYXdhaXQgcnVuVGVzdENvbW1hbmQoXG4gICAgYXdhaXQgc2NyaXB0cy50ZXN0RTJFRG9ja2VyKHByb2plY3QsIGFyZ3YsIHtcbiAgICAgIHBsYXl3cmlnaHRBcmdzLFxuICAgICAgZm9yd2FyZGVkUGxheXdyaWdodEFyZ3MsXG4gICAgfSksXG4gICAgcHJvamVjdCxcbiAgICBhcmd2LFxuICAgIHsgZXhpdElmRmFpbGVkOiBmYWxzZSB9XG4gICk7XG4gIGNvbnN0IHN0b3BFeGl0Q29kZSA9IGF3YWl0IHJ1bldpdGhTcGF3bihkb2NrZXJTY3JpcHRzLnN0b3AocHJvamVjdCksIHByb2plY3QsIGFyZ3YsIHtcbiAgICBleGl0SWZGYWlsZWQ6IG9wdGlvbnMuZXhpdElmRmFpbGVkLFxuICB9KTtcbiAgaWYgKHRlc3RFeGl0Q29kZSAhPT0gMCkge1xuICAgIHJldHVybiB0ZXN0RXhpdENvZGU7XG4gIH1cbiAgcmV0dXJuIHN0b3BFeGl0Q29kZTtcbn1cblxuZnVuY3Rpb24gcnVuVGVzdENvbW1hbmQoXG4gIHNjcmlwdDogc3RyaW5nLFxuICBwcm9qZWN0OiBQcm9qZWN0LFxuICBhcmd2OiBQYXJhbWV0ZXJzPHR5cGVvZiBydW5XaXRoU3Bhd24+WzJdLFxuICBvcHRpb25zOiBQYXJhbWV0ZXJzPHR5cGVvZiBydW5XaXRoU3Bhd24+WzNdID0ge31cbik6IFByb21pc2U8bnVtYmVyPiB7XG4gIHJldHVybiBydW5XaXRoU3Bhd24oc2NyaXB0LCBwcm9qZWN0LCBhcmd2LCB7XG4gICAgLi4ub3B0aW9ucyxcbiAgICBwcm9jZXNzU2lsZW50T3V0cHV0OiBkZWR1cGVOb2lzeVRlc3RPdXRwdXQsXG4gIH0pO1xufVxuXG5mdW5jdGlvbiBydW5Vbml0VGVzdENvbW1hbmQoXG4gIHNjcmlwdDogc3RyaW5nLFxuICBwcm9qZWN0OiBQcm9qZWN0LFxuICBhcmd2OiBQYXJhbWV0ZXJzPHR5cGVvZiBydW5XaXRoU3Bhd24+WzJdLFxuICBvcHRpb25zOiBQYXJhbWV0ZXJzPHR5cGVvZiBydW5XaXRoU3Bhd24+WzNdID0ge31cbik6IFByb21pc2U8bnVtYmVyPiB7XG4gIHJldHVybiBydW5XaXRoU3Bhd24oc2NyaXB0LCBwcm9qZWN0LCBhcmd2LCB7XG4gICAgLi4ub3B0aW9ucyxcbiAgICBvbWl0U2lsZW50U3RhcnQ6IHRydWUsXG4gICAgcHJpbnRTaWxlbnRPdXRwdXRPbkZhaWx1cmVPbmx5OiB0cnVlLFxuICAgIHNpbGVudFByb2dyZXNzSW50ZXJ2YWxNczogMTBfMDAwLFxuICAgIHNpbGVudFN1Y2Nlc3NNZXNzYWdlOiAnVW5pdCB0ZXN0cyBwYXNzZWQuJyxcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIGRlZHVwZU5vaXN5VGVzdE91dHB1dChvdXRwdXQ6IHN0cmluZyk6IHN0cmluZyB7XG4gIGNvbnN0IHJlY2VudFByaW50ZWRMaW5lczogc3RyaW5nW10gPSBbXTtcbiAgY29uc3QgcmVjZW50UHJpbnRlZExpbmVTZXQgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgY29uc3QgZGVkdXBlZExpbmVzOiBzdHJpbmdbXSA9IFtdO1xuICBmb3IgKGNvbnN0IGxpbmUgb2YgaXRlcmF0ZUxpbmVzKG91dHB1dCkpIHtcbiAgICBjb25zdCBub3JtYWxpemVkTGluZSA9IG5vcm1hbGl6ZUxpbmVGb3JTaW1pbGFyaXR5KGxpbmUpO1xuICAgIGlmIChyZWNlbnRQcmludGVkTGluZVNldC5oYXMobm9ybWFsaXplZExpbmUpKSBjb250aW51ZTtcbiAgICBpZiAocmVjZW50UHJpbnRlZExpbmVzLnNvbWUoKHByaW50ZWRMaW5lKSA9PiBhcmVMaW5lc1NpbWlsYXIocHJpbnRlZExpbmUsIG5vcm1hbGl6ZWRMaW5lKSkpIGNvbnRpbnVlO1xuXG4gICAgcHVzaFJlY2VudFByaW50ZWRMaW5lKHJlY2VudFByaW50ZWRMaW5lcywgcmVjZW50UHJpbnRlZExpbmVTZXQsIG5vcm1hbGl6ZWRMaW5lKTtcbiAgICBkZWR1cGVkTGluZXMucHVzaChsaW5lKTtcbiAgfVxuICByZXR1cm4gZGVkdXBlZExpbmVzLmpvaW4oJ1xcbicpO1xufVxuXG5mdW5jdGlvbiogaXRlcmF0ZUxpbmVzKG91dHB1dDogc3RyaW5nKTogR2VuZXJhdG9yPHN0cmluZz4ge1xuICBsZXQgbGluZVN0YXJ0SW5kZXggPSAwO1xuICB3aGlsZSAobGluZVN0YXJ0SW5kZXggPD0gb3V0cHV0Lmxlbmd0aCkge1xuICAgIGNvbnN0IGxpbmVFbmRJbmRleCA9IG91dHB1dC5pbmRleE9mKCdcXG4nLCBsaW5lU3RhcnRJbmRleCk7XG4gICAgaWYgKGxpbmVFbmRJbmRleCA9PT0gLTEpIHtcbiAgICAgIHlpZWxkIG91dHB1dC5zbGljZShsaW5lU3RhcnRJbmRleCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgeWllbGQgb3V0cHV0LnNsaWNlKGxpbmVTdGFydEluZGV4LCBsaW5lRW5kSW5kZXgpO1xuICAgIGxpbmVTdGFydEluZGV4ID0gbGluZUVuZEluZGV4ICsgMTtcbiAgfVxufVxuXG5mdW5jdGlvbiBwdXNoUmVjZW50UHJpbnRlZExpbmUobGluZXM6IHN0cmluZ1tdLCBsaW5lU2V0OiBTZXQ8c3RyaW5nPiwgbGluZTogc3RyaW5nKTogdm9pZCB7XG4gIGxpbmVzLnB1c2gobGluZSk7XG4gIGxpbmVTZXQuYWRkKGxpbmUpO1xuICBpZiAobGluZXMubGVuZ3RoIDw9IFNJTUlMQVJfVEVTVF9PVVRQVVRfTE9PS0JBQ0tfTElORV9DT1VOVCkgcmV0dXJuO1xuXG4gIGNvbnN0IHJlbW92ZWRMaW5lID0gbGluZXMuc2hpZnQoKTtcbiAgaWYgKHJlbW92ZWRMaW5lICE9PSB1bmRlZmluZWQpIHtcbiAgICBsaW5lU2V0LmRlbGV0ZShyZW1vdmVkTGluZSk7XG4gIH1cbn1cblxuZnVuY3Rpb24gbm9ybWFsaXplTGluZUZvclNpbWlsYXJpdHkobGluZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIGxpbmVcbiAgICAucmVwbGFjZUFsbChBTlNJX0VTQ0FQRV9DT0RFX1JFR0VYUCwgJycpXG4gICAgLnRyaW0oKVxuICAgIC5yZXBsYWNlQWxsKC9eKD86XFxbW15cXF1dK1xcXVxccyopKy9nLCAnJylcbiAgICAucmVwbGFjZUFsbCgvXFwobm9kZTpcXGQrXFwpL2csICcobm9kZTo8bnVtYmVyPiknKVxuICAgIC5yZXBsYWNlQWxsKC9cXGJcXGR7NH0tXFxkezJ9LVxcZHsyfVRcXGR7Mn06XFxkezJ9OlxcZHsyfSg/OlxcLlxcZCspP1o/XFxiL2csICc8dGltZXN0YW1wPicpXG4gICAgLnJlcGxhY2VBbGwoLyhbPyZdY2FjaGU9KVxcZCsvZywgJyQxPG51bWJlcj4nKTtcbn1cblxuZnVuY3Rpb24gYXJlTGluZXNTaW1pbGFyKGE6IHN0cmluZywgYjogc3RyaW5nKTogYm9vbGVhbiB7XG4gIGNvbnN0IG1heExlbmd0aCA9IE1hdGgubWF4KGEubGVuZ3RoLCBiLmxlbmd0aCk7XG4gIGlmIChtYXhMZW5ndGggPT09IDApIHJldHVybiB0cnVlO1xuICBpZiAoTWF0aC5hYnMoYS5sZW5ndGggLSBiLmxlbmd0aCkgPiBtYXhMZW5ndGggKiBTSU1JTEFSX1RFU1RfT1VUUFVUX0RJU1RBTkNFX1JBVElPKSByZXR1cm4gZmFsc2U7XG5cbiAgcmV0dXJuIGRpc3RhbmNlKGEsIGIpIC8gbWF4TGVuZ3RoIDw9IFNJTUlMQVJfVEVTVF9PVVRQVVRfRElTVEFOQ0VfUkFUSU87XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBidWlsZFBsYXl3cmlnaHRBcmdzRm9yRTJFKFxuICBlMmVUYXJnZXRzOiBzdHJpbmdbXSxcbiAgZm9yd2FyZGVkUGxheXdyaWdodEFyZ3M6IHN0cmluZ1tdID0gW10sXG4gIGFkZGl0aW9uYWxBcmdzOiBzdHJpbmdbXSA9IFtdXG4pOiBzdHJpbmdbXSB7XG4gIGNvbnN0IGhhc0ZvcndhcmRlZFBsYXl3cmlnaHRUYXJnZXRzID0gZmluZEV4cGxpY2l0UGxheXdyaWdodFRhcmdldEluZGV4ZXMoZm9yd2FyZGVkUGxheXdyaWdodEFyZ3MpLmxlbmd0aCA+IDA7XG4gIHJldHVybiBbJ3Rlc3QnLCAuLi4oZTJlVGFyZ2V0cy5sZW5ndGggPiAwIHx8IGhhc0ZvcndhcmRlZFBsYXl3cmlnaHRUYXJnZXRzID8gW10gOiBbJ3Rlc3QvZTJlLyddKSwgLi4uYWRkaXRpb25hbEFyZ3NdO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcmVzb2x2ZVRlc3RFeGVjdXRpb25UYXJnZXRzKFxuICB0ZXN0VGFyZ2V0czogc3RyaW5nW10sXG4gIGZvcndhcmRlZFBsYXl3cmlnaHRBcmdzOiBzdHJpbmdbXSA9IFtdXG4pOiB7IHNob3VsZFJ1blVuaXQ6IGJvb2xlYW47IHNob3VsZFJ1bkUyZTogYm9vbGVhbiB9IHtcbiAgY29uc3QgaGFzRTJlVGFyZ2V0cyA9IHRlc3RUYXJnZXRzLnNvbWUoKHRhcmdldCkgPT4gdGFyZ2V0LmluY2x1ZGVzKCcvZTJlJykpO1xuICBjb25zdCBoYXNVbml0VGFyZ2V0cyA9IHRlc3RUYXJnZXRzLnNvbWUoKHRhcmdldCkgPT4gdGFyZ2V0LmluY2x1ZGVzKCcvdW5pdCcpKTtcbiAgY29uc3Qgc2hvdWxkUnVuQWxsVGVzdHMgPSB0ZXN0VGFyZ2V0cy5sZW5ndGggPT09IDAgJiYgZm9yd2FyZGVkUGxheXdyaWdodEFyZ3MubGVuZ3RoID09PSAwO1xuXG4gIHJldHVybiB7XG4gICAgc2hvdWxkUnVuVW5pdDogc2hvdWxkUnVuQWxsVGVzdHMgfHwgaGFzVW5pdFRhcmdldHMsXG4gICAgc2hvdWxkUnVuRTJlOiBzaG91bGRSdW5BbGxUZXN0cyB8fCBoYXNFMmVUYXJnZXRzIHx8IGZvcndhcmRlZFBsYXl3cmlnaHRBcmdzLmxlbmd0aCA+IDAsXG4gIH07XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgY2hhbGsgZnJvbSAnY2hhbGsnO1xuaW1wb3J0IHR5cGUgeyBBcmd1bWVudHNDYW1lbENhc2UsIENvbW1hbmRNb2R1bGUsIEluZmVycmVkT3B0aW9uVHlwZXMgfSBmcm9tICd5YXJncyc7XG5cbmltcG9ydCB7IGZpbmREZXNjZW5kYW50UHJvamVjdHMgfSBmcm9tICcuLi9wcm9qZWN0LmpzJztcbmltcG9ydCB7IHRvRGV2TnVsbCB9IGZyb20gJy4uL3NjcmlwdHMvYnVpbGRlci5qcyc7XG5pbXBvcnQgeyBkb2NrZXJTY3JpcHRzIH0gZnJvbSAnLi4vc2NyaXB0cy9kb2NrZXJTY3JpcHRzLmpzJztcbmltcG9ydCB0eXBlIHsgQmFzZVNjcmlwdHMgfSBmcm9tICcuLi9zY3JpcHRzL2V4ZWN1dGlvbi9iYXNlU2NyaXB0cy5qcyc7XG5pbXBvcnQgeyBibGl0elNjcmlwdHMgfSBmcm9tICcuLi9zY3JpcHRzL2V4ZWN1dGlvbi9ibGl0elNjcmlwdHMuanMnO1xuaW1wb3J0IHsgaHR0cFNlcnZlclNjcmlwdHMgfSBmcm9tICcuLi9zY3JpcHRzL2V4ZWN1dGlvbi9odHRwU2VydmVyU2NyaXB0cy5qcyc7XG5pbXBvcnQgeyBuZXh0U2NyaXB0cyB9IGZyb20gJy4uL3NjcmlwdHMvZXhlY3V0aW9uL25leHRTY3JpcHRzLmpzJztcbmltcG9ydCB7IHBsYWluQXBwU2NyaXB0cyB9IGZyb20gJy4uL3NjcmlwdHMvZXhlY3V0aW9uL3BsYWluQXBwU2NyaXB0cy5qcyc7XG5pbXBvcnQgeyByZW1peFNjcmlwdHMgfSBmcm9tICcuLi9zY3JpcHRzL2V4ZWN1dGlvbi9yZW1peFNjcmlwdHMuanMnO1xuaW1wb3J0IHsgdmluZXh0U2NyaXB0cyB9IGZyb20gJy4uL3NjcmlwdHMvZXhlY3V0aW9uL3ZpbmV4dFNjcmlwdHMuanMnO1xuaW1wb3J0IHsgdml0ZVNjcmlwdHMgfSBmcm9tICcuLi9zY3JpcHRzL2V4ZWN1dGlvbi92aXRlU2NyaXB0cy5qcyc7XG5pbXBvcnQgeyB3b3JrZXJzU2NyaXB0cyB9IGZyb20gJy4uL3NjcmlwdHMvZXhlY3V0aW9uL3dvcmtlcnNTY3JpcHRzLmpzJztcbmltcG9ydCB7IHJ1bldpdGhTcGF3biwgcnVuV2l0aFNwYXduSW5QYXJhbGxlbCB9IGZyb20gJy4uL3NjcmlwdHMvcnVuLmpzJztcbmltcG9ydCB0eXBlIHsgc2hhcmVkT3B0aW9uc0J1aWxkZXIgfSBmcm9tICcuLi9zaGFyZWRPcHRpb25zQnVpbGRlci5qcyc7XG5pbXBvcnQgeyBmaW5kV3JhbmdsZXJDb25maWdQYXRoIH0gZnJvbSAnLi4vdXRpbHMvd3JhbmdsZXIuanMnO1xuaW1wb3J0IHsgcHJvbWlzZVBvb2wgfSBmcm9tICcuLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5cbmltcG9ydCB7IGh0dHBTZXJ2ZXJQYWNrYWdlcyB9IGZyb20gJy4vaHR0cFNlcnZlclBhY2thZ2VzLmpzJztcbmltcG9ydCB7IHdhcm5JZlBsYXl3cmlnaHRTcGVjc0FyZVVuZGlzY292ZXJhYmxlIH0gZnJvbSAnLi90ZXN0LmpzJztcblxuY29uc3QgdGVzdE9uQ2lCdWlsZGVyID0ge1xuICBzaWxlbnQ6IHtcbiAgICBkZXNjcmlwdGlvbjogJ1JlZHVjZSByZWR1bmRhbnQgb3V0cHV0cycsXG4gICAgdHlwZTogJ2Jvb2xlYW4nLFxuICB9LFxufSBhcyBjb25zdDtcbmV4cG9ydCBjb25zdCB0ZXN0T25DaUNvbW1hbmQ6IENvbW1hbmRNb2R1bGU8XG4gIHVua25vd24sXG4gIEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIHRlc3RPbkNpQnVpbGRlciAmIHR5cGVvZiBzaGFyZWRPcHRpb25zQnVpbGRlcj5cbj4gPSB7XG4gIGNvbW1hbmQ6ICd0ZXN0LW9uLWNpJyxcbiAgZGVzY3JpYmU6ICdUZXN0IHByb2plY3Qgb24gQ0kgd2l0aCBubyBvcHRpb25zLicsXG4gIGJ1aWxkZXI6IHRlc3RPbkNpQnVpbGRlcixcbiAgYXN5bmMgaGFuZGxlcihhcmd2KSB7XG4gICAgYXdhaXQgdGVzdE9uQ2koYXJndik7XG4gIH0sXG59O1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gdGVzdE9uQ2koXG4gIGFyZ3Y6IEFyZ3VtZW50c0NhbWVsQ2FzZTxJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiB0ZXN0T25DaUJ1aWxkZXIgJiB0eXBlb2Ygc2hhcmVkT3B0aW9uc0J1aWxkZXI+PlxuKTogUHJvbWlzZTx2b2lkPiB7XG4gIC8vIFNwYXduZWQgY29tbWFuZHMgcmUtZGVyaXZlIHRoZWlyIGRvdGVudiBjYXNjYWRlIGZyb20gdGhlIGV4cG9ydGVkIFdCX0VOViwgc28gYW4gdW5leHBvcnRlZFxuICAvLyBXQl9FTlYgd291bGQgbGV0IGEgY29tbWl0dGVkIGAuZW52YCAoZS5nLiBXQl9FTlY9ZGV2ZWxvcG1lbnQpIHNlbGVjdCB0aGUgZGV2ZWxvcG1lbnRcbiAgLy8gZW52aXJvbm1lbnQg4oCUIHJ1bm5pbmcgdGhlIGRlc3RydWN0aXZlIGUyZSBzdWl0ZSBhZ2FpbnN0IHRoZSBkZXZlbG9wZXIncyBvd24gZGF0YWJhc2UuXG4gIHByb2Nlc3MuZW52LldCX0VOViB8fD0gJ3Rlc3QnO1xuXG4gIGNvbnN0IHByb2plY3RzID0gYXdhaXQgZmluZERlc2NlbmRhbnRQcm9qZWN0cyhhcmd2KTtcbiAgaWYgKCFwcm9qZWN0cykge1xuICAgIGNvbnNvbGUuZXJyb3IoY2hhbGsucmVkKCdObyBwcm9qZWN0IGZvdW5kLicpKTtcbiAgICBwcm9jZXNzLmV4aXQoMSk7XG4gIH1cblxuICBmb3IgKGNvbnN0IHByb2plY3Qgb2YgcHJvamVjdHMuZGVzY2VuZGFudHMpIHtcbiAgICBwcm9qZWN0LmVudi5DSSB8fD0gJzEnO1xuICAgIC8vIE92ZXJ3cml0ZSwgbm90IHx8PTogcHJvamVjdC5lbnYgYWxyZWFkeSBjYXJyaWVzIHRoZSBkb3RlbnYtZGVyaXZlZCB2YWx1ZS5cbiAgICBwcm9qZWN0LmVudi5XQl9FTlYgPSBwcm9jZXNzLmVudi5XQl9FTlY7XG5cbiAgICBjb25zdCBkZXBzID0gcHJvamVjdC5wYWNrYWdlSnNvbi5kZXBlbmRlbmNpZXMgPz8ge307XG4gICAgY29uc3QgZGV2RGVwcyA9IHByb2plY3QucGFja2FnZUpzb24uZGV2RGVwZW5kZW5jaWVzID8/IHt9O1xuICAgIGxldCBzY3JpcHRzOiBCYXNlU2NyaXB0cztcbiAgICBpZiAoZGVwcy5ibGl0eikge1xuICAgICAgc2NyaXB0cyA9IGJsaXR6U2NyaXB0cztcbiAgICB9IGVsc2UgaWYgKGRlcHMudmluZXh0IHx8IGRldkRlcHMudmluZXh0KSB7XG4gICAgICAvLyB2aW5leHQgYXBwcyBhbHNvIGRlcGVuZCBvbiBuZXh0LCBzbyB0aGlzIGNoZWNrIG11c3QgY29tZSBmaXJzdC5cbiAgICAgIHNjcmlwdHMgPSB2aW5leHRTY3JpcHRzO1xuICAgIH0gZWxzZSBpZiAoZGVwcy5uZXh0KSB7XG4gICAgICBzY3JpcHRzID0gbmV4dFNjcmlwdHM7XG4gICAgfSBlbHNlIGlmIChkZXZEZXBzWydAcmVtaXgtcnVuL2RldiddKSB7XG4gICAgICBzY3JpcHRzID0gcmVtaXhTY3JpcHRzO1xuICAgIH0gZWxzZSBpZiAoZGV2RGVwcy52aXRlKSB7XG4gICAgICBzY3JpcHRzID0gdml0ZVNjcmlwdHM7XG4gICAgfSBlbHNlIGlmIChmaW5kV3JhbmdsZXJDb25maWdQYXRoKHByb2plY3QpKSB7XG4gICAgICAvLyBQbGFpbiBDbG91ZGZsYXJlIFdvcmtlcnMgYXBwOyB2aW5leHQgYXBwcyBhcmUgZGV0ZWN0ZWQgYWJvdmUuXG4gICAgICBzY3JpcHRzID0gd29ya2Vyc1NjcmlwdHM7XG4gICAgfSBlbHNlIGlmIChodHRwU2VydmVyUGFja2FnZXMuc29tZSgocCkgPT4gZGVwc1twXSkgJiYgIWRlcHNbJ2ZpcmViYXNlLWZ1bmN0aW9ucyddKSB7XG4gICAgICBzY3JpcHRzID0gaHR0cFNlcnZlclNjcmlwdHM7XG4gICAgfSBlbHNlIHtcbiAgICAgIHNjcmlwdHMgPSBwbGFpbkFwcFNjcmlwdHM7XG4gICAgfVxuXG4gICAgY29uc29sZS5pbmZvKGBSdW5uaW5nIFwidGVzdC1vbi1jaVwiIGZvciAke3Byb2plY3QubmFtZX0gLi4uYCk7XG5cbiAgICBjb25zdCBoYXNEb2NrZXJmaWxlID0gcHJvamVjdC5oYXNEb2NrZXJmaWxlO1xuICAgIGlmIChoYXNEb2NrZXJmaWxlKSB7XG4gICAgICBhd2FpdCBydW5XaXRoU3Bhd25JblBhcmFsbGVsKGRvY2tlclNjcmlwdHMuc3RvcEFsbCgpLCBwcm9qZWN0LCBhcmd2KTtcbiAgICB9XG4gICAgaWYgKGZzLmV4aXN0c1N5bmMocGF0aC5qb2luKHByb2plY3QuZGlyUGF0aCwgJ3Rlc3QnLCAndW5pdCcpKSkge1xuICAgICAgLy8gQ0kgbW9kZSBkaXNhbGxvd3MgYG9ubHlgIHRvIGF2b2lkIGluY2x1ZGluZyBkZWJ1ZyB0ZXN0c1xuICAgICAgYXdhaXQgcnVuV2l0aFNwYXduSW5QYXJhbGxlbChzY3JpcHRzLnRlc3RVbml0KHByb2plY3QsIGFyZ3YpLnJlcGxhY2VBbGwoJyAtLWFsbG93T25seScsICcnKSwgcHJvamVjdCwgYXJndik7XG4gICAgfVxuICAgIGlmIChmcy5leGlzdHNTeW5jKHBhdGguam9pbihwcm9qZWN0LmRpclBhdGgsICd0ZXN0JywgJ2UyZScpKSkge1xuICAgICAgLy8gQ29uZmlybSBkZXYgc2VydmVyIHN0YXJ0dXAgZm9yIGNvbnNpc3RlbmN5IGFjcm9zcyBwcm9qZWN0cyB3aXRoIEUyRSB0ZXN0cy5cbiAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bkluUGFyYWxsZWwoYXdhaXQgc2NyaXB0cy50ZXN0U3RhcnQocHJvamVjdCwgYXJndiksIHByb2plY3QsIGFyZ3YpO1xuICAgICAgYXdhaXQgcHJvbWlzZVBvb2wucHJvbWlzZUFsbCgpO1xuICAgICAgaWYgKGhhc0RvY2tlcmZpbGUpIHtcbiAgICAgICAgcHJvamVjdC5lbnYuV0JfRE9DS0VSIHx8PSAnMSc7XG4gICAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bihgJHtzY3JpcHRzLmJ1aWxkRG9ja2VyKHByb2plY3QsICd0ZXN0Jyl9JHt0b0Rldk51bGwoYXJndil9YCwgcHJvamVjdCwgYXJndik7XG4gICAgICB9XG4gICAgICBjb25zdCBzY3JpcHQgPSBoYXNEb2NrZXJmaWxlXG4gICAgICAgID8gYXdhaXQgc2NyaXB0cy50ZXN0RTJFRG9ja2VyKHByb2plY3QsIGFyZ3YsIHt9KVxuICAgICAgICA6IGF3YWl0IHNjcmlwdHMudGVzdEUyRVByb2R1Y3Rpb24ocHJvamVjdCwgYXJndiwge30pO1xuICAgICAgcHJvY2Vzcy5leGl0Q29kZSA9IGF3YWl0IHJ1bldpdGhTcGF3bihcbiAgICAgICAgLy8gQ0kgbW9kZSBkaXNhbGxvd3MgYG9ubHlgIHRvIGF2b2lkIGluY2x1ZGluZyBkZWJ1ZyB0ZXN0c1xuICAgICAgICBzY3JpcHQucmVwbGFjZUFsbCgnIC0tYWxsb3dPbmx5JywgJycpLFxuICAgICAgICBwcm9qZWN0LFxuICAgICAgICBhcmd2LFxuICAgICAgICB7XG4gICAgICAgICAgZXhpdElmRmFpbGVkOiBmYWxzZSxcbiAgICAgICAgfVxuICAgICAgKTtcbiAgICAgIGlmIChoYXNEb2NrZXJmaWxlKSB7XG4gICAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bihkb2NrZXJTY3JpcHRzLnN0b3AocHJvamVjdCksIHByb2plY3QsIGFyZ3YpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICB3YXJuSWZQbGF5d3JpZ2h0U3BlY3NBcmVVbmRpc2NvdmVyYWJsZShwcm9qZWN0KTtcbiAgICB9XG4gIH1cbn1cbiIsImltcG9ydCB7IGNvbnN0YW50cyB9IGZyb20gJ25vZGU6b3MnO1xuXG5pbXBvcnQgeyB0cmVlS2lsbCB9IGZyb20gJ0B3aWxsYm9vc3Rlci9zaGFyZWQtbGliLW5vZGUvc3JjJztcbmltcG9ydCB0eXBlIHsgQXJndiwgQ29tbWFuZE1vZHVsZSB9IGZyb20gJ3lhcmdzJztcblxuaW50ZXJmYWNlIFRyZWVLaWxsQ29tbWFuZEFyZ3Mge1xuICBwaWQ6IG51bWJlcjtcbiAgc2lnbmFsOiBzdHJpbmc7XG59XG5cbmNvbnN0IGJ1aWxkZXIgPSAoeWFyZ3M6IEFyZ3YpOiBBcmd2PFRyZWVLaWxsQ29tbWFuZEFyZ3M+ID0+XG4gIHlhcmdzXG4gICAgLnBvc2l0aW9uYWwoJ3BpZCcsIHtcbiAgICAgIGRlc2NyaXB0aW9uOiAnVGhlIHByb2Nlc3MgSUQgdG8ga2lsbC4nLFxuICAgICAgdHlwZTogJ251bWJlcicsXG4gICAgICBkZW1hbmRPcHRpb246IHRydWUsXG4gICAgfSlcbiAgICAub3B0aW9uKCdzaWduYWwnLCB7XG4gICAgICBkZXNjcmlwdGlvbjogJ1NpZ25hbCB0byBzZW5kIHRvIHRoZSBwcm9jZXNzIHRyZWUuJyxcbiAgICAgIHR5cGU6ICdzdHJpbmcnLFxuICAgICAgZGVmYXVsdDogJ1NJR1RFUk0nLFxuICAgIH0pIGFzIEFyZ3Y8VHJlZUtpbGxDb21tYW5kQXJncz47XG5cbmV4cG9ydCBjb25zdCB0cmVlS2lsbENvbW1hbmQ6IENvbW1hbmRNb2R1bGU8b2JqZWN0LCBUcmVlS2lsbENvbW1hbmRBcmdzPiA9IHtcbiAgY29tbWFuZDogJ3RyZWUta2lsbCA8cGlkPiBbc2lnbmFsXScsXG4gIGRlc2NyaWJlOiAnS2lsbCB0aGUgZ2l2ZW4gcHJvY2VzcyBhbmQgYWxsIGRlc2NlbmRhbnRzJyxcbiAgYnVpbGRlcixcbiAgaGFuZGxlcihhcmd2KSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHNpZ25hbCA9IGFyZ3Yuc2lnbmFsIGFzIE5vZGVKUy5TaWduYWxzO1xuICAgICAgaWYgKCEoc2lnbmFsIGluIGNvbnN0YW50cy5zaWduYWxzKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgc2lnbmFsOiAke3NpZ25hbH1gKTtcbiAgICAgIH1cbiAgICAgIHRyZWVLaWxsKGFyZ3YucGlkLCBzaWduYWwpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBjb25zb2xlLmVycm9yKGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogU3RyaW5nKGVycm9yKSk7XG4gICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgfVxuICB9LFxufTtcbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCBjaGFsayBmcm9tICdjaGFsayc7XG5pbXBvcnQgdHlwZSB7IEFyZ3VtZW50c0NhbWVsQ2FzZSwgQ29tbWFuZE1vZHVsZSwgSW5mZXJyZWRPcHRpb25UeXBlcyB9IGZyb20gJ3lhcmdzJztcblxuaW1wb3J0IHsgZmluZERlc2NlbmRhbnRQcm9qZWN0cyB9IGZyb20gJy4uL3Byb2plY3QuanMnO1xuaW1wb3J0IHR5cGUgeyBQcm9qZWN0IH0gZnJvbSAnLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQgeyBydW5XaXRoU3Bhd25JblBhcmFsbGVsIH0gZnJvbSAnLi4vc2NyaXB0cy9ydW4uanMnO1xuaW1wb3J0IHR5cGUgeyBzaGFyZWRPcHRpb25zQnVpbGRlciB9IGZyb20gJy4uL3NoYXJlZE9wdGlvbnNCdWlsZGVyLmpzJztcblxuY29uc3QgYnVpbGRlciA9IHt9IGFzIGNvbnN0O1xuXG50eXBlIFR5cGVDaGVja0NvbW1hbmRPcHRpb25zID0gSW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgYnVpbGRlciAmIHR5cGVvZiBzaGFyZWRPcHRpb25zQnVpbGRlcj47XG5leHBvcnQgdHlwZSBUeXBlQ2hlY2tDb21tYW5kQXJndiA9IEFyZ3VtZW50c0NhbWVsQ2FzZTxUeXBlQ2hlY2tDb21tYW5kT3B0aW9ucz47XG5cbmV4cG9ydCBjb25zdCB0eXBlQ2hlY2tDb21tYW5kOiBDb21tYW5kTW9kdWxlPHVua25vd24sIFR5cGVDaGVja0NvbW1hbmRPcHRpb25zPiA9IHtcbiAgY29tbWFuZDogJ3R5cGVjaGVjaycsXG4gIGRlc2NyaWJlOiAnUnVuIHR5cGUgY2hlY2tpbmcuIC5lbnYgZmlsZXMgYXJlIGlnbm9yZWQuJyxcbiAgYnVpbGRlcixcbiAgYXN5bmMgaGFuZGxlcihhcmd2KSB7XG4gICAgcHJvY2Vzcy5leGl0KGF3YWl0IHR5cGVDaGVjayhhcmd2KSk7XG4gIH0sXG59O1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gdHlwZUNoZWNrKGFyZ3Y6IFR5cGVDaGVja0NvbW1hbmRBcmd2KTogUHJvbWlzZTxudW1iZXI+IHtcbiAgY29uc3QgcHJvamVjdHMgPSBhd2FpdCBmaW5kRGVzY2VuZGFudFByb2plY3RzKGFyZ3YsIGZhbHNlKTtcbiAgaWYgKCFwcm9qZWN0cykge1xuICAgIGNvbnNvbGUuZXJyb3IoY2hhbGsucmVkKCdObyBwcm9qZWN0IGZvdW5kLicpKTtcbiAgICByZXR1cm4gMTtcbiAgfVxuXG4gIGxldCByZW1vdmVkTmV4dERpciA9IGZhbHNlIGFzIGJvb2xlYW47XG4gIGNvbnN0IHByb21pc2VzID0gcHJvamVjdHMuZGVzY2VuZGFudHMubWFwKGFzeW5jIChwcm9qZWN0KSA9PiB7XG4gICAgY29uc3QgY29tbWFuZHM6IHN0cmluZ1tdID0gW107XG4gICAgaWYgKCFwcm9qZWN0LnBhY2thZ2VKc29uLndvcmtzcGFjZXMgfHwgcHJvamVjdC5oYXNTb3VyY2VDb2RlKSB7XG4gICAgICBjb21tYW5kcy5wdXNoKC4uLmJ1aWxkVHlwZVNjcmlwdFR5cGVDaGVja0NvbW1hbmRzKHByb2plY3QpKTtcbiAgICB9XG4gICAgaWYgKCFwcm9qZWN0LnBhY2thZ2VKc29uLndvcmtzcGFjZXMgJiYgcHJvamVjdC5oYXNPd25EZXBlbmRlbmN5KCdweXJpZ2h0JykpIHtcbiAgICAgIGNvbW1hbmRzLnB1c2goJ1lBUk4gcHlyaWdodCcpO1xuICAgIH1cbiAgICB3aGlsZSAoY29tbWFuZHMubGVuZ3RoID4gMCkge1xuICAgICAgY29uc3QgZXhpdENvZGUgPSBhd2FpdCBydW5XaXRoU3Bhd25JblBhcmFsbGVsKGNvbW1hbmRzLmpvaW4oJyAmJiAnKSwgcHJvamVjdCwgYXJndiwge1xuICAgICAgICAvLyBEaXNhYmxlIGludGVyYWN0aXZlIG1vZGVcbiAgICAgICAgY2k6IHByb2plY3RzLmRlc2NlbmRhbnRzLmxlbmd0aCA+IDEsXG4gICAgICAgIGV4aXRJZkZhaWxlZDogZmFsc2UsXG4gICAgICAgIHByZXNlcnZlQ29sb3I6IHRydWUsXG4gICAgICB9KTtcblxuICAgICAgLy8gUmUtdHJ5IHR5cGUgY2hlY2tpbmcgYWZ0ZXIgcmVtb3ZpbmcgYC5uZXh0YCBkaXJlY3RvcnlcbiAgICAgIGNvbnN0IG5leHREaXJQYXRoID0gcGF0aC5qb2luKHByb2plY3QuZGlyUGF0aCwgJy5uZXh0Jyk7XG4gICAgICBpZiAoZXhpdENvZGUgJiYgZnMuZXhpc3RzU3luYyhuZXh0RGlyUGF0aCkpIHtcbiAgICAgICAgZnMucm1TeW5jKG5leHREaXJQYXRoLCB7IGZvcmNlOiB0cnVlLCByZWN1cnNpdmU6IHRydWUgfSk7XG4gICAgICAgIGNvbnNvbGUuaW5mbyhjaGFsay55ZWxsb3coJ1JlbW92ZWQgYC5uZXh0YCBkaXJlY3RvcnkuIFdlIHdpbGwgcmUtdHJ5IHR5cGUgY2hlY2tpbmcuJykpO1xuICAgICAgICByZW1vdmVkTmV4dERpciA9IHRydWU7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gZXhpdENvZGU7XG4gICAgfVxuICB9KTtcbiAgY29uc3QgZXhpdENvZGVzID0gYXdhaXQgUHJvbWlzZS5hbGwocHJvbWlzZXMpO1xuICBsZXQgZmluYWxFeGl0Q29kZSA9IDA7XG4gIGZvciAoY29uc3QgW2ksIGV4aXRDb2RlXSBvZiBleGl0Q29kZXMuZW50cmllcygpKSB7XG4gICAgaWYgKGV4aXRDb2RlKSB7XG4gICAgICBjb25zdCBkZXBzID0gcHJvamVjdHMuZGVzY2VuZGFudHNbaV0/LnBhY2thZ2VKc29uLmRlcGVuZGVuY2llcyA/PyB7fTtcbiAgICAgIGlmIChkZXBzLmJsaXR6KSB7XG4gICAgICAgIGNvbnNvbGUuaW5mbyhjaGFsay55ZWxsb3coJ1BsZWFzZSB0cnkgXCJ5YXJuIGdlbi1jb2RlXCIgaWYgeW91IGZhY2UgdW5rbm93biB0eXBlIGVycm9ycy4nKSk7XG4gICAgICB9XG4gICAgICBmaW5hbEV4aXRDb2RlID0gZXhpdENvZGU7XG4gICAgfVxuICB9XG4gIGlmICghZmluYWxFeGl0Q29kZSlcbiAgICBjb25zb2xlLmluZm8oXG4gICAgICBjaGFsay5ncmVlbihcbiAgICAgICAgcmVtb3ZlZE5leHREaXJcbiAgICAgICAgICA/ICctLS0tLVxcbk5vIHR5cGUgZXJyb3JzIGZvdW5kLiBQbGVhc2UgaWdub3JlIHRoZSBwcmV2aW91cyB0eXBlIGVycm9ycywgYXMgdGhleSB3ZXJlIGNhdXNlZCBieSBvdXRkYXRlZCBOZXh0LmpzIGNhY2hlIGZpbGVzLidcbiAgICAgICAgICA6ICdObyB0eXBlIGVycm9ycyBmb3VuZC4nXG4gICAgICApXG4gICAgKTtcbiAgcmV0dXJuIGZpbmFsRXhpdENvZGU7XG59XG5cbmZ1bmN0aW9uIGJ1aWxkVHlwZVNjcmlwdFR5cGVDaGVja0NvbW1hbmRzKHByb2plY3Q6IFByb2plY3QpOiBzdHJpbmdbXSB7XG4gIC8vIFR5cGVTY3JpcHQgNyBzaGlwcyB0aGUgbmF0aXZlIGNvbXBpbGVyIGFzIGB0eXBlc2NyaXB0YCAoYHRzY2ApOyB3YmZ5IHJlbW92ZXMgdGhlXG4gIC8vIGBAdHlwZXNjcmlwdC9uYXRpdmUtcHJldmlld2AgKHRzZ28pIHByZXZpZXcgZnJvbSBub24tTmV4dC5qcyByZXBvcyAoTmV4dC5qcy1mYW1pbHlcbiAgLy8gcmVwb3Mga2VlcCBpdCBmb3IgYG5leHQgYnVpbGRgKSwgc28gcmVwb3Mgc3RpbGwgb24gdGhlIHByZXZpZXcgc2hvdWxkIHJ1biB3YmZ5XG4gIC8vIGluc3RlYWQgb2YgcmVseWluZyBvbiBhIHRzZ28gZmFsbGJhY2sgaGVyZS5cbiAgaWYgKHByb2plY3QuaGFzT3duRGVwZW5kZW5jeSgndHlwZXNjcmlwdCcpKSB7XG4gICAgcmV0dXJuIFsnQlVOIHRzYyAtLW5vRW1pdCddO1xuICB9XG4gIHJldHVybiBbXTtcbn1cblxuZXhwb3J0IGNvbnN0IHRjQ29tbWFuZDogQ29tbWFuZE1vZHVsZTx1bmtub3duLCBUeXBlQ2hlY2tDb21tYW5kT3B0aW9ucz4gPSB7XG4gIC4uLnR5cGVDaGVja0NvbW1hbmQsXG4gIGNvbW1hbmQ6ICd0YycsXG59O1xuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHsgc3Bhd25Bc3luYyB9IGZyb20gJ0B3aWxsYm9vc3Rlci9zaGFyZWQtbGliLW5vZGUvc3JjJztcbmltcG9ydCBjaGFsayBmcm9tICdjaGFsayc7XG5pbXBvcnQgdHlwZSB7IEFyZ3VtZW50c0NhbWVsQ2FzZSwgQ29tbWFuZE1vZHVsZSwgSW5mZXJyZWRPcHRpb25UeXBlcyB9IGZyb20gJ3lhcmdzJztcblxuaW1wb3J0IHR5cGUgeyBQcm9qZWN0IH0gZnJvbSAnLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQgeyBmaW5kUm9vdEFuZFNlbGZQcm9qZWN0cywgZmluZFNlbGZQcm9qZWN0IH0gZnJvbSAnLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQgeyBjb25maWd1cmVFbnYgfSBmcm9tICcuLi9zY3JpcHRzL3J1bi5qcyc7XG5pbXBvcnQgdHlwZSB7IHNoYXJlZE9wdGlvbnNCdWlsZGVyIH0gZnJvbSAnLi4vc2hhcmVkT3B0aW9uc0J1aWxkZXIuanMnO1xuXG5pbXBvcnQgeyBsaW50LCB0eXBlIExpbnRDb21tYW5kQXJndiB9IGZyb20gJy4vbGludC5qcyc7XG5pbXBvcnQgeyB0ZXN0LCB0eXBlIFRlc3RDb21tYW5kQXJndiwgd2l0aERlZmF1bHRUZXN0Q2FzY2FkZUVudiB9IGZyb20gJy4vdGVzdC5qcyc7XG5pbXBvcnQgeyB0eXBlQ2hlY2ssIHR5cGUgVHlwZUNoZWNrQ29tbWFuZEFyZ3YgfSBmcm9tICcuL3R5cGVjaGVjay5qcyc7XG5cbmNvbnN0IGJ1aWxkZXIgPSB7XG4gIGZ1bGw6IHtcbiAgICB0eXBlOiAnYm9vbGVhbicsXG4gICAgZGVmYXVsdDogZmFsc2UsXG4gICAgZGVzY3JpYmU6ICdSdW4gdGVzdHMgYWZ0ZXIgdmVyaWZ5aW5nIHByb2plY3QgY29kZScsXG4gIH0sXG59IGFzIGNvbnN0O1xuXG50eXBlIFZlcmlmeUNvZGVDb21tYW5kT3B0aW9ucyA9IEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIGJ1aWxkZXIgJiB0eXBlb2Ygc2hhcmVkT3B0aW9uc0J1aWxkZXI+O1xudHlwZSBWZXJpZnlDb2RlQ29tbWFuZEFyZ3YgPSBBcmd1bWVudHNDYW1lbENhc2U8VmVyaWZ5Q29kZUNvbW1hbmRPcHRpb25zPjtcbnR5cGUgUGFja2FnZUNvbW1hbmRBcmd2ID0gUGljazxWZXJpZnlDb2RlQ29tbWFuZEFyZ3YsICdkcnlSdW4nIHwgJ3ZlcmJvc2UnPjtcblxuZXhwb3J0IGNvbnN0IHZlcmlmeUNvZGVDb21tYW5kOiBDb21tYW5kTW9kdWxlPHVua25vd24sIFZlcmlmeUNvZGVDb21tYW5kT3B0aW9ucz4gPSB7XG4gIGNvbW1hbmQ6ICd2ZXJpZnknLFxuICBkZXNjcmliZTogJ1ZlcmlmeSBwcm9qZWN0IGNvZGUnLFxuICBidWlsZGVyLFxuICBhc3luYyBoYW5kbGVyKGFyZ3YpIHtcbiAgICBjb25zdCBwcm9qZWN0cyA9IGZpbmRSb290QW5kU2VsZlByb2plY3RzKGFyZ3YsIGZhbHNlKTtcbiAgICBpZiAoIXByb2plY3RzKSB7XG4gICAgICBjb25zb2xlLmVycm9yKGNoYWxrLnJlZCgnTm8gcHJvamVjdCBmb3VuZC4nKSk7XG4gICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgfVxuXG4gICAgYXdhaXQgKGFyZ3YuZnVsbCA/IHZlcmlmeUNvZGVGdWxseShwcm9qZWN0cy5zZWxmLCBhcmd2KSA6IHZlcmlmeUNvZGUocHJvamVjdHMuc2VsZiwgYXJndikpO1xuICB9LFxufTtcblxuYXN5bmMgZnVuY3Rpb24gdmVyaWZ5Q29kZUZ1bGx5KHByb2plY3Q6IFByb2plY3QsIGFyZ3Y6IFZlcmlmeUNvZGVDb21tYW5kQXJndik6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCByZXBvcnRlciA9IHN0YXJ0VmVyaWZ5RnVsbFJlcG9ydGVyKHByb2plY3QpO1xuICB0cnkge1xuICAgIGF3YWl0IHZlcmlmeUNvZGUocHJvamVjdCwgYXJndik7XG4gICAgYXdhaXQgcnVuUHJvamVjdFRlc3QocHJvamVjdCwgYXJndik7XG4gICAgcmVwb3J0ZXIuc3VjY2VlZCgpO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIHJlcG9ydGVyLmZhaWwoZXJyb3IpO1xuICAgIHRocm93IGVycm9yO1xuICB9IGZpbmFsbHkge1xuICAgIHJlcG9ydGVyLmZpbmlzaCgpO1xuICB9XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHZlcmlmeUNvZGUocHJvamVjdDogUHJvamVjdCwgYXJndjogVmVyaWZ5Q29kZUNvbW1hbmRBcmd2KTogUHJvbWlzZTx2b2lkPiB7XG4gIGF3YWl0IHJ1blBhY2thZ2VDb21tYW5kKGAke3Byb2plY3QucGFja2FnZU1hbmFnZXJDb21tYW5kfSBpbnN0YWxsYCwgcHJvamVjdCwgYXJndik7XG4gIGlmIChwcm9qZWN0LnBhY2thZ2VKc29uLnNjcmlwdHM/LlsnZ2VuLWNvZGUnXSkge1xuICAgIGF3YWl0IHJ1blBhY2thZ2VDb21tYW5kKGAke3Byb2plY3QucGFja2FnZU1hbmFnZXJDb21tYW5kfSBnZW4tY29kZWAsIHByb2plY3QsIGFyZ3YpO1xuICB9XG4gIGF3YWl0IHJ1bkluUHJvY2Vzc0NvbW1hbmQoXG4gICAgJ2NsZWFudXAnLFxuICAgICgpID0+XG4gICAgICBsaW50KHtcbiAgICAgICAgLi4uYXJndixcbiAgICAgICAgXzogWydsaW50J10sXG4gICAgICAgIGZpeDogdHJ1ZSxcbiAgICAgICAgZm9ybWF0OiB0cnVlLFxuICAgICAgICBzaWxlbnQ6IHRydWUsXG4gICAgICB9IGFzIHVua25vd24gYXMgTGludENvbW1hbmRBcmd2KSxcbiAgICB7IHNpbGVudDogdHJ1ZSB9XG4gICk7XG4gIC8vIFR5cGUtYXdhcmUgbGludCByZXBvcnRzIFR5cGVTY3JpcHQgZGlhZ25vc3RpY3Mgb25seSBmb3IgdGhlIGZpbGVzIG94bGludCBhY3R1YWxseSBsaW50cywgYW5kXG4gIC8vIHRoZSBzaGFyZWQgY29uZmlnIGlnbm9yZXMgZGlyZWN0b3JpZXMgdHNjIHN0aWxsIGNvbXBpbGVzIChlLmcuIGBfX2dlbmVyYXRlZF9fYCwgYEB0eXBlc2AsXG4gIC8vIGBkaXN0YCkuIEtlZXAgdGhlIHR5cGVjaGVjayBjb21tYW5kIHNvIGB2ZXJpZnlgIHN0YXlzIGVxdWl2YWxlbnQgdG8gXCJ0aGUgcmVwb3NpdG9yeSBjb21waWxlc1wiLlxuICAvLyBUaGUgb3ZlcmxhcCB3aXRoIGxpbnQgaXMgZGVsaWJlcmF0ZTogYC0tdHlwZS1hd2FyZWAgYWxzbyBwb3dlcnMgdHlwZS1hd2FyZSBsaW50IHJ1bGVzLCBhbmRcbiAgLy8gZHJvcHBpbmcgb25seSBgLS10eXBlLWNoZWNrYCBmcm9tIGxpbnQgc2F2ZXMgfjAuMXMsIGZhciBsZXNzIHRoYW4gdGhlIGNvdmVyYWdlIGl0IHdvdWxkIGNvc3QuXG4gIGF3YWl0IHJ1bkluUHJvY2Vzc0NvbW1hbmQoXG4gICAgJ3R5cGVjaGVjaycsXG4gICAgKCkgPT4gdHlwZUNoZWNrKHsgLi4uYXJndiwgXzogWyd0eXBlY2hlY2snXSB9IGFzIHVua25vd24gYXMgVHlwZUNoZWNrQ29tbWFuZEFyZ3YpLFxuICAgIHsgc2lsZW50OiB0cnVlIH1cbiAgKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gcnVuUHJvamVjdFRlc3QocHJvamVjdDogUHJvamVjdCwgYXJndjogVmVyaWZ5Q29kZUNvbW1hbmRBcmd2KTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IHRlc3RBcmd2ID0gd2l0aERlZmF1bHRUZXN0Q2FzY2FkZUVudih7XG4gICAgLi4uYXJndixcbiAgICBfOiBbJ3Rlc3QnXSxcbiAgICBlMmU6ICdoZWFkbGVzcycsXG4gICAgc2lsZW50OiB0cnVlLFxuICB9IGFzIHVua25vd24gYXMgVGVzdENvbW1hbmRBcmd2KTtcbiAgY29uc3QgZXhpdENvZGUgPSBhd2FpdCB0ZXN0KHRlc3RBcmd2LCB7IGV4aXRJZkZhaWxlZDogZmFsc2UgfSk7XG4gIGlmIChleGl0Q29kZSA9PT0gMCkgcmV0dXJuO1xuXG4gIGlmICghcHJvamVjdC5wYWNrYWdlSnNvbi5zY3JpcHRzPy5bJ2RiLXJlc2V0J10pIHtcbiAgICBjb25zb2xlLmluZm8oY2hhbGsucmVkKGNoYWxrLmJvbGQoYEZhaWxlZCAoZXhpdCBjb2RlICR7ZXhpdENvZGV9KTpgKSwgJ3Rlc3QnKSk7XG4gICAgcHJvY2Vzcy5leGl0KGV4aXRDb2RlKTtcbiAgfVxuXG4gIGNvbnNvbGUuaW5mbyhcbiAgICBjaGFsay55ZWxsb3coJ1Rlc3RzIGZhaWxlZC4gVGhpcyBwcm9qZWN0IGRlZmluZXMgXCJkYi1yZXNldFwiLCBzbyB3YiB3aWxsIHJlc2V0IHRoZSBkYXRhYmFzZSBvbmNlIGFuZCByZXRyeSB0ZXN0cy4nKVxuICApO1xuICBhd2FpdCBydW5QYWNrYWdlQ29tbWFuZChgJHtwcm9qZWN0LnBhY2thZ2VNYW5hZ2VyQ29tbWFuZH0gZGItcmVzZXRgLCBmaW5kVGVzdFByb2plY3QocHJvamVjdCwgdGVzdEFyZ3YpLCB0ZXN0QXJndiwge1xuICAgIHByaW50UmF3T3V0cHV0OiB0cnVlLFxuICB9KTtcblxuICBjb25zdCByZXRyeUV4aXRDb2RlID0gYXdhaXQgdGVzdCh0ZXN0QXJndiwgeyBleGl0SWZGYWlsZWQ6IGZhbHNlIH0pO1xuICBpZiAocmV0cnlFeGl0Q29kZSAhPT0gMCkge1xuICAgIGNvbnNvbGUuaW5mbyhjaGFsay5yZWQoY2hhbGsuYm9sZChgRmFpbGVkIChleGl0IGNvZGUgJHtyZXRyeUV4aXRDb2RlfSk6YCksICd0ZXN0IGFmdGVyIGRiLXJlc2V0IHJldHJ5JykpO1xuICAgIHByb2Nlc3MuZXhpdChyZXRyeUV4aXRDb2RlKTtcbiAgfVxuICBjb25zb2xlLmluZm8oY2hhbGsuZ3JlZW4oJ1Rlc3RzIHBhc3NlZCBhZnRlciBkYi1yZXNldCByZXRyeS4nKSk7XG59XG5cbmZ1bmN0aW9uIGZpbmRUZXN0UHJvamVjdChwcm9qZWN0OiBQcm9qZWN0LCBhcmd2OiBUZXN0Q29tbWFuZEFyZ3YpOiBQcm9qZWN0IHtcbiAgY29uc3QgdGVzdFByb2plY3QgPSBmaW5kU2VsZlByb2plY3QoYXJndiwgdHJ1ZSwgcHJvamVjdC5kaXJQYXRoKTtcbiAgaWYgKCF0ZXN0UHJvamVjdCkge1xuICAgIHRocm93IG5ldyBFcnJvcihgUHJvamVjdCBub3QgZm91bmQ6ICR7cHJvamVjdC5kaXJQYXRofWApO1xuICB9XG4gIHJldHVybiB0ZXN0UHJvamVjdDtcbn1cblxuYXN5bmMgZnVuY3Rpb24gcnVuSW5Qcm9jZXNzQ29tbWFuZChcbiAgY29tbWFuZE5hbWU6IHN0cmluZyxcbiAgY29tbWFuZDogKCkgPT4gUHJvbWlzZTxudW1iZXIgfCB1bmRlZmluZWQ+LFxuICBvcHRpb25zOiB7IGFsbG93RmFpbHVyZT86IGJvb2xlYW47IHNpbGVudD86IGJvb2xlYW4gfSA9IHt9XG4pOiBQcm9taXNlPG51bWJlcj4ge1xuICBpZiAoIW9wdGlvbnMuc2lsZW50KSB7XG4gICAgY29uc29sZS5pbmZvKCdcXG4nICsgY2hhbGsuY3lhbihjaGFsay5ib2xkKCdTdGFydDonKSwgY29tbWFuZE5hbWUpKTtcbiAgfVxuICBjb25zdCBleGl0Q29kZSA9IChhd2FpdCBjb21tYW5kKCkpID8/IDA7XG4gIGlmIChleGl0Q29kZSA9PT0gMCB8fCBvcHRpb25zLmFsbG93RmFpbHVyZSkge1xuICAgIGlmICghb3B0aW9ucy5zaWxlbnQpIHtcbiAgICAgIGNvbnNvbGUuaW5mbyhjaGFsay5ncmVlbihjaGFsay5ib2xkKCdGaW5pc2hlZDonKSwgY29tbWFuZE5hbWUpKTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgY29uc29sZS5pbmZvKGNoYWxrLnJlZChjaGFsay5ib2xkKGBGYWlsZWQgKGV4aXQgY29kZSAke2V4aXRDb2RlfSk6YCksIGNvbW1hbmROYW1lKSk7XG4gICAgcHJvY2Vzcy5leGl0KGV4aXRDb2RlKTtcbiAgfVxuICByZXR1cm4gZXhpdENvZGU7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHJ1blBhY2thZ2VDb21tYW5kKFxuICBjb21tYW5kOiBzdHJpbmcsXG4gIHByb2plY3Q6IFByb2plY3QsXG4gIGFyZ3Y6IFBhY2thZ2VDb21tYW5kQXJndixcbiAgb3B0aW9uczogeyBhbGxvd0ZhaWx1cmU/OiBib29sZWFuOyBwcmludFJhd091dHB1dD86IGJvb2xlYW4gfSA9IHt9XG4pOiBQcm9taXNlPG51bWJlcj4ge1xuICBwcmludENvbW1hbmQoY29tbWFuZCwgcHJvamVjdC5kaXJQYXRoKTtcbiAgaWYgKGFyZ3YuZHJ5UnVuKSB7XG4gICAgcmV0dXJuIDA7XG4gIH1cblxuICBjb25zdCByZXQgPSBhd2FpdCBzcGF3bkFzeW5jKGNvbW1hbmQsIHVuZGVmaW5lZCwge1xuICAgIGN3ZDogcHJvamVjdC5kaXJQYXRoLFxuICAgIGVudjogY29uZmlndXJlRW52KHByb2plY3QuZW52LCB7IHByZXNlcnZlQ29sb3I6IGZhbHNlIH0pLFxuICAgIHNoZWxsOiB0cnVlLFxuICAgIHN0ZGlvOiAncGlwZScsXG4gICAgbWVyZ2VPdXRBbmRFcnJvcjogdHJ1ZSxcbiAgICBraWxsT25FeGl0OiB0cnVlLFxuICAgIHByaW50aW5nU3Rkb3V0OiBvcHRpb25zLnByaW50UmF3T3V0cHV0LFxuICAgIHByaW50aW5nU3RkZXJyOiBvcHRpb25zLnByaW50UmF3T3V0cHV0LFxuICAgIHZlcmJvc2U6IGFyZ3YudmVyYm9zZSxcbiAgfSk7XG4gIGNvbnN0IGV4aXRDb2RlID0gcmV0LnN0YXR1cyA/PyAxO1xuICBpZiAoIW9wdGlvbnMucHJpbnRSYXdPdXRwdXQpIHtcbiAgICBwcmludFBhY2thZ2VDb21tYW5kT3V0cHV0KGNvbW1hbmQsIGV4aXRDb2RlLCByZXQuc3Rkb3V0KTtcbiAgfVxuXG4gIGlmIChleGl0Q29kZSAhPT0gMCAmJiAhb3B0aW9ucy5hbGxvd0ZhaWx1cmUpIHtcbiAgICBjb25zb2xlLmluZm8oY2hhbGsucmVkKGNoYWxrLmJvbGQoYEZhaWxlZCAoZXhpdCBjb2RlICR7ZXhpdENvZGV9KTpgKSwgY29tbWFuZCkpO1xuICAgIHByb2Nlc3MuZXhpdChleGl0Q29kZSk7XG4gIH1cbiAgcmV0dXJuIGV4aXRDb2RlO1xufVxuXG4vKipcbiAqIFByaW50cyBwYWNrYWdlIGNvbW1hbmQgb3V0cHV0IGZvciBgd2IgdmVyaWZ5YC5cbiAqXG4gKiBgd2IgdmVyaWZ5YCBpcyBwcmltYXJpbHkgY29uc3VtZWQgYnkgQUkgY29kaW5nIGFnZW50cywgc28gc3VjY2Vzc2Z1bCBub2lzeVxuICogY29tbWFuZHMgYXJlIHN1bW1hcml6ZWQgd2hpbGUgZmFpbHVyZSBvdXRwdXQgcmVtYWlucyBhdmFpbGFibGUgZm9yIGRpYWdub3Npcy5cbiAqXG4gKiBAcGFyYW0gY29tbWFuZCBUaGUgZXhlY3V0ZWQgY29tbWFuZC5cbiAqIEBwYXJhbSBleGl0Q29kZSBUaGUgY29tbWFuZCBleGl0IGNvZGUuXG4gKiBAcGFyYW0gb3V0cHV0IFRoZSBtZXJnZWQgc3Rkb3V0IGFuZCBzdGRlcnIgb3V0cHV0IGZyb20gdGhlIGNvbW1hbmQuXG4gKi9cbmZ1bmN0aW9uIHByaW50UGFja2FnZUNvbW1hbmRPdXRwdXQoY29tbWFuZDogc3RyaW5nLCBleGl0Q29kZTogbnVtYmVyLCBvdXRwdXQ6IHN0cmluZyk6IHZvaWQge1xuICBpZiAoZXhpdENvZGUgPT09IDAgJiYgL14oPzpidW58eWFybikgKD86aW5zdGFsbHxnZW4tY29kZSkkL3UudGVzdChjb21tYW5kKSkge1xuICAgIGNvbnNvbGUuaW5mbyhjaGFsay5ncmVlbignU3VjY2VlZGVkLicpKTtcbiAgICByZXR1cm47XG4gIH1cblxuICBjb25zdCB0cmltbWVkT3V0cHV0ID0gb3V0cHV0LnRyaW0oKTtcbiAgaWYgKHRyaW1tZWRPdXRwdXQpIHtcbiAgICBwcm9jZXNzLnN0ZG91dC53cml0ZSh0cmltbWVkT3V0cHV0KTtcbiAgICBwcm9jZXNzLnN0ZG91dC53cml0ZSgnXFxuJyk7XG4gIH1cbn1cblxuZnVuY3Rpb24gcHJpbnRDb21tYW5kKGNvbW1hbmQ6IHN0cmluZywgY3dkOiBzdHJpbmcpOiB2b2lkIHtcbiAgY29uc29sZS5pbmZvKCdcXG4nICsgY2hhbGsuY3lhbihjaGFsay5ib2xkKCdDb21tYW5kOicpLCBjb21tYW5kKSArIGNoYWxrLmdyYXkoYCBhdCAke2N3ZH1gKSk7XG59XG5cbmZ1bmN0aW9uIHN0YXJ0VmVyaWZ5RnVsbFJlcG9ydGVyKHByb2plY3Q6IFByb2plY3QpOiB7XG4gIGZhaWw6IChlcnJvcj86IHVua25vd24pID0+IHZvaWQ7XG4gIGZpbmlzaDogKCkgPT4gdm9pZDtcbiAgc3VjY2VlZDogKCkgPT4gdm9pZDtcbn0ge1xuICBjb25zdCBzdGFydGVkQXQgPSBEYXRlLm5vdygpO1xuICBjb25zdCB3YkRpclBhdGggPSBwYXRoLmpvaW4ocHJvamVjdC5kaXJQYXRoLCAnLndiJyk7XG4gIGZzLm1rZGlyU3luYyh3YkRpclBhdGgsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuXG4gIGNvbnN0IGxvZ0ZpbGVQYXRoID0gcGF0aC5qb2luKHdiRGlyUGF0aCwgJ3ZlcmlmeS1mdWxsLmxvZycpO1xuICBjb25zdCBsb2dGaWxlID0gZnMub3BlblN5bmMobG9nRmlsZVBhdGgsICd3Jyk7XG4gIGNvbnN0IG9yaWdpbmFsU3Rkb3V0V3JpdGUgPSBwcm9jZXNzLnN0ZG91dC53cml0ZS5iaW5kKHByb2Nlc3Muc3Rkb3V0KTtcbiAgY29uc3Qgb3JpZ2luYWxTdGRlcnJXcml0ZSA9IHByb2Nlc3Muc3RkZXJyLndyaXRlLmJpbmQocHJvY2Vzcy5zdGRlcnIpO1xuICBsZXQgc3VjY2VlZGVkID0gZmFsc2U7XG4gIGxldCBmaW5pc2hlZCA9IGZhbHNlO1xuXG4gIHByb2Nlc3Muc3Rkb3V0LndyaXRlID0gdGVlV3JpdGUob3JpZ2luYWxTdGRvdXRXcml0ZSwgbG9nRmlsZSkgYXMgdHlwZW9mIHByb2Nlc3Muc3Rkb3V0LndyaXRlO1xuICBwcm9jZXNzLnN0ZGVyci53cml0ZSA9IHRlZVdyaXRlKG9yaWdpbmFsU3RkZXJyV3JpdGUsIGxvZ0ZpbGUpIGFzIHR5cGVvZiBwcm9jZXNzLnN0ZGVyci53cml0ZTtcbiAgY29uc29sZS5pbmZvKGNoYWxrLmN5YW4oY2hhbGsuYm9sZCgnRnVsbCBsb2c6JyksIGxvZ0ZpbGVQYXRoKSk7XG5cbiAgY29uc3QgZmluaXNoID0gKCk6IHZvaWQgPT4ge1xuICAgIGlmIChmaW5pc2hlZCkgcmV0dXJuO1xuICAgIGZpbmlzaGVkID0gdHJ1ZTtcblxuICAgIHByb2Nlc3Muc3Rkb3V0LndyaXRlID0gb3JpZ2luYWxTdGRvdXRXcml0ZSBhcyB0eXBlb2YgcHJvY2Vzcy5zdGRvdXQud3JpdGU7XG4gICAgcHJvY2Vzcy5zdGRlcnIud3JpdGUgPSBvcmlnaW5hbFN0ZGVycldyaXRlIGFzIHR5cGVvZiBwcm9jZXNzLnN0ZGVyci53cml0ZTtcblxuICAgIGNvbnN0IGVsYXBzZWRUaW1lID0gZm9ybWF0RWxhcHNlZFRpbWUoRGF0ZS5ub3coKSAtIHN0YXJ0ZWRBdCk7XG4gICAgY29uc3Qgc3RhdHVzID0gc3VjY2VlZGVkID8gJ1N1Y2NlZWRlZCcgOiAnRmFpbGVkJztcbiAgICBjb25zdCBzdW1tYXJ5ID0gYCR7c3RhdHVzfSBpbiAke2VsYXBzZWRUaW1lfS4gRnVsbCBsb2c6ICR7bG9nRmlsZVBhdGh9XFxuYDtcbiAgICBjb25zdCBjb2xvcmVkU3VtbWFyeSA9IHN1Y2NlZWRlZCA/IGNoYWxrLmdyZWVuKHN1bW1hcnkpIDogY2hhbGsucmVkKHN1bW1hcnkpO1xuICAgIG9yaWdpbmFsU3Rkb3V0V3JpdGUoY29sb3JlZFN1bW1hcnkpO1xuICAgIGZzLndyaXRlU3luYyhsb2dGaWxlLCBzdW1tYXJ5KTtcbiAgICBmcy5jbG9zZVN5bmMobG9nRmlsZSk7XG4gIH07XG5cbiAgcHJvY2Vzcy5vbmNlKCdleGl0JywgZmluaXNoKTtcblxuICByZXR1cm4ge1xuICAgIGZhaWw6IChlcnJvcikgPT4ge1xuICAgICAgc3VjY2VlZGVkID0gZmFsc2U7XG4gICAgICBpZiAoZXJyb3IpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcihlcnJvcik7XG4gICAgICB9XG4gICAgfSxcbiAgICBmaW5pc2g6ICgpID0+IHtcbiAgICAgIHByb2Nlc3MucmVtb3ZlTGlzdGVuZXIoJ2V4aXQnLCBmaW5pc2gpO1xuICAgICAgZmluaXNoKCk7XG4gICAgfSxcbiAgICBzdWNjZWVkOiAoKSA9PiB7XG4gICAgICBzdWNjZWVkZWQgPSB0cnVlO1xuICAgIH0sXG4gIH07XG59XG5cbmZ1bmN0aW9uIHRlZVdyaXRlKG9yaWdpbmFsV3JpdGU6IHR5cGVvZiBwcm9jZXNzLnN0ZG91dC53cml0ZSwgbG9nRmlsZTogbnVtYmVyKTogdHlwZW9mIHByb2Nlc3Muc3Rkb3V0LndyaXRlIHtcbiAgcmV0dXJuICgoXG4gICAgY2h1bms6IFVpbnQ4QXJyYXkgfCBzdHJpbmcsXG4gICAgZW5jb2RpbmdPckNhbGxiYWNrPzogQnVmZmVyRW5jb2RpbmcgfCAoKGVycm9yPzogRXJyb3IgfCBudWxsKSA9PiB2b2lkKSxcbiAgICBjYWxsYmFjaz86IChlcnJvcj86IEVycm9yIHwgbnVsbCkgPT4gdm9pZFxuICApID0+IHtcbiAgICBjb25zdCBidWZmZXIgPVxuICAgICAgdHlwZW9mIGNodW5rID09PSAnc3RyaW5nJ1xuICAgICAgICA/IEJ1ZmZlci5mcm9tKGNodW5rLCB0eXBlb2YgZW5jb2RpbmdPckNhbGxiYWNrID09PSAnc3RyaW5nJyA/IGVuY29kaW5nT3JDYWxsYmFjayA6ICd1dGY4JylcbiAgICAgICAgOiBjaHVuaztcbiAgICBmcy53cml0ZVN5bmMobG9nRmlsZSwgYnVmZmVyKTtcbiAgICAvLyBXcml0ZSB0byB0aGUgdGVybWluYWwgdmlhIHRoZSBvcmlnaW5hbCBzdHJlYW0gbWV0aG9kOiBhIHN5bmNocm9ub3VzIGZzLndyaXRlU3luYyBvbiB0aGVcbiAgICAvLyBzdGRvdXQvc3RkZXJyIGZkIHRocm93cyBFQUdBSU4gb24gQ0kncyBub24tYmxvY2tpbmcgcGlwZXMgd2hlbiBsYXJnZSBvdXRwdXQgZmx1c2hlcyBhdCBvbmNlLFxuICAgIC8vIHdoaWxlIHRoZSBzdHJlYW0gbWV0aG9kIGJ1ZmZlcnMgaW50ZXJuYWxseSBhbmQgaGFuZGxlcyBiYWNrcHJlc3N1cmUuXG4gICAgcmV0dXJuIG9yaWdpbmFsV3JpdGUoYnVmZmVyLCB0eXBlb2YgZW5jb2RpbmdPckNhbGxiYWNrID09PSAnZnVuY3Rpb24nID8gZW5jb2RpbmdPckNhbGxiYWNrIDogY2FsbGJhY2spO1xuICB9KSBhcyB0eXBlb2YgcHJvY2Vzcy5zdGRvdXQud3JpdGU7XG59XG5cbmZ1bmN0aW9uIGZvcm1hdEVsYXBzZWRUaW1lKG1pbGxpc2Vjb25kczogbnVtYmVyKTogc3RyaW5nIHtcbiAgY29uc3Qgc2Vjb25kcyA9IE1hdGgucm91bmQobWlsbGlzZWNvbmRzIC8gMTAwMCk7XG4gIGNvbnN0IG1pbnV0ZXMgPSBNYXRoLmZsb29yKHNlY29uZHMgLyA2MCk7XG4gIGNvbnN0IHJlbWFpbmluZ1NlY29uZHMgPSBzZWNvbmRzICUgNjA7XG4gIGlmIChtaW51dGVzID09PSAwKSB7XG4gICAgcmV0dXJuIGAke3JlbWFpbmluZ1NlY29uZHN9c2A7XG4gIH1cbiAgcmV0dXJuIGAke21pbnV0ZXN9bSAke3JlbWFpbmluZ1NlY29uZHN9c2A7XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgeyByZW1vdmVOcG1BbmRZYXJuRW52aXJvbm1lbnRWYXJpYWJsZXMsIHRyZWVLaWxsIH0gZnJvbSAnQHdpbGxib29zdGVyL3NoYXJlZC1saWItbm9kZS9zcmMnO1xuaW1wb3J0IHlhcmdzIGZyb20gJ3lhcmdzJztcbmltcG9ydCB7IGhpZGVCaW4gfSBmcm9tICd5YXJncy9oZWxwZXJzJztcblxuaW1wb3J0IHsgYnVpbGRJZk5lZWRlZENvbW1hbmQgfSBmcm9tICcuL2NvbW1hbmRzL2J1aWxkSWZOZWVkZWQuanMnO1xuaW1wb3J0IHsgY29uY3VycmVudGx5Q29tbWFuZCB9IGZyb20gJy4vY29tbWFuZHMvY29uY3VycmVudGx5LmpzJztcbmltcG9ydCB7IGRlcGxveUNvbW1hbmQgfSBmcm9tICcuL2NvbW1hbmRzL2RlcGxveS5qcyc7XG5pbXBvcnQgeyBkb3RlbnZDb21tYW5kIH0gZnJvbSAnLi9jb21tYW5kcy9kb3RlbnYuanMnO1xuaW1wb3J0IHsgZ2VuQ29kZUNvbW1hbmQgfSBmcm9tICcuL2NvbW1hbmRzL2dlbkNvZGUuanMnO1xuaW1wb3J0IHsgZ2VuRGV2VmFyc0NvbW1hbmQgfSBmcm9tICcuL2NvbW1hbmRzL2dlbkRldlZhcnMuanMnO1xuaW1wb3J0IHsga2lsbFBvcnRJZk5vbkNpQ29tbWFuZCB9IGZyb20gJy4vY29tbWFuZHMva2lsbFBvcnRJZk5vbkNpLmpzJztcbmltcG9ydCB7IGxpbnRDb21tYW5kIH0gZnJvbSAnLi9jb21tYW5kcy9saW50LmpzJztcbmltcG9ydCB7IG1haW50ZW5hbmNlQ29tbWFuZCB9IGZyb20gJy4vY29tbWFuZHMvbWFpbnRlbmFuY2UuanMnO1xuaW1wb3J0IHsgb3B0aW1pemVGb3JEb2NrZXJCdWlsZENvbW1hbmQgfSBmcm9tICcuL2NvbW1hbmRzL29wdGltaXplRm9yRG9ja2VyQnVpbGQuanMnO1xuaW1wb3J0IHsgcHJpc21hQ29tbWFuZCB9IGZyb20gJy4vY29tbWFuZHMvcHJpc21hLmpzJztcbmltcG9ydCB7IHJldHJ5Q29tbWFuZCB9IGZyb20gJy4vY29tbWFuZHMvcmV0cnkuanMnO1xuaW1wb3J0IHsgc2V0dXBDb21tYW5kIH0gZnJvbSAnLi9jb21tYW5kcy9zZXR1cC5qcyc7XG5pbXBvcnQgeyBzZXR1cFByaXZhdGVQYWNrYWdlc0NvbW1hbmQgfSBmcm9tICcuL2NvbW1hbmRzL3NldHVwUHJpdmF0ZVBhY2thZ2VzLmpzJztcbmltcG9ydCB7IHN0YXJ0Q29tbWFuZCB9IGZyb20gJy4vY29tbWFuZHMvc3RhcnQuanMnO1xuaW1wb3J0IHsgdGVzdENvbW1hbmQgfSBmcm9tICcuL2NvbW1hbmRzL3Rlc3QuanMnO1xuaW1wb3J0IHsgdGVzdE9uQ2lDb21tYW5kIH0gZnJvbSAnLi9jb21tYW5kcy90ZXN0T25DaS5qcyc7XG5pbXBvcnQgeyB0cmVlS2lsbENvbW1hbmQgfSBmcm9tICcuL2NvbW1hbmRzL3RyZWVLaWxsLmpzJztcbmltcG9ydCB7IHRjQ29tbWFuZCwgdHlwZUNoZWNrQ29tbWFuZCB9IGZyb20gJy4vY29tbWFuZHMvdHlwZWNoZWNrLmpzJztcbmltcG9ydCB7IHZlcmlmeUNvZGVDb21tYW5kIH0gZnJvbSAnLi9jb21tYW5kcy92ZXJpZnlDb2RlLmpzJztcbmltcG9ydCB7IHNoYXJlZE9wdGlvbnNCdWlsZGVyIH0gZnJvbSAnLi9zaGFyZWRPcHRpb25zQnVpbGRlci5qcyc7XG5cbmF3YWl0IHlhcmdzKGhpZGVCaW4ocHJvY2Vzcy5hcmd2KSlcbiAgLnNjcmlwdE5hbWUoJ3diJylcbiAgLm9wdGlvbnMoc2hhcmVkT3B0aW9uc0J1aWxkZXIpXG4gIC5taWRkbGV3YXJlKChhcmd2KSA9PiB7XG4gICAgY29uc3Qgd29ya2luZ0RpciA9IGFyZ3ZbJ3dvcmtpbmctZGlyJ107XG4gICAgaWYgKHdvcmtpbmdEaXIpIHtcbiAgICAgIGNvbnN0IGRpclBhdGggPSBwYXRoLnJlc29sdmUod29ya2luZ0Rpcik7XG4gICAgICBwcm9jZXNzLmNoZGlyKGRpclBhdGgpO1xuICAgIH1cblxuICAgIGlmIChwcm9jZXNzLmVudi5QQVRIPy5pbmNsdWRlcygnL2J1bi1ub2RlLScpKSB7XG4gICAgICAvLyBOb3QgZml4ZWQgdXAgaGVyZTogdG9vbHMgcmVxdWlyaW5nIHJlYWwgTm9kZS5qcyAoUGxheXdyaWdodCwgd3JhbmdsZXIsIHZpbmV4dCkgbWF5IGhhbmcgb3JcbiAgICAgIC8vIGNyYXNoIHVuZGVyIHRoZSBzaGltLCBhbmQgc29tZSAod3JhbmdsZXIgZGV2KSBmYWlsIHNpbGVudGx5LCBzbyBzdXJmYWNlIHRoZSBjYXVzZSB1cGZyb250LlxuICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICBcIldhcm5pbmc6IFBBVEggY29udGFpbnMgYSBidW4tbm9kZSBzaGltIChmcm9tIGBidW4gLS1idW5gIG9yIGJ1bmZpZydzIGBydW4uYnVuYCk7IFwiICtcbiAgICAgICAgICAncnVuIHdiIHdpdGhvdXQgYC0tYnVuYCBhbmQgcmVtb3ZlIGBbcnVuXSBidW5gIGZyb20gYnVuZmlnLnRvbWwuJ1xuICAgICAgKTtcbiAgICB9XG5cbiAgICByZW1vdmVOcG1BbmRZYXJuRW52aXJvbm1lbnRWYXJpYWJsZXMocHJvY2Vzcy5lbnYpO1xuICB9KVxuICAuY29tbWFuZCh2ZXJpZnlDb2RlQ29tbWFuZClcbiAgLmNvbW1hbmQoYnVpbGRJZk5lZWRlZENvbW1hbmQpXG4gIC5jb21tYW5kKGNvbmN1cnJlbnRseUNvbW1hbmQpXG4gIC5jb21tYW5kKGRlcGxveUNvbW1hbmQpXG4gIC5jb21tYW5kKGRvdGVudkNvbW1hbmQpXG4gIC5jb21tYW5kKGdlbkNvZGVDb21tYW5kKVxuICAuY29tbWFuZChnZW5EZXZWYXJzQ29tbWFuZClcbiAgLmNvbW1hbmQoa2lsbFBvcnRJZk5vbkNpQ29tbWFuZClcbiAgLmNvbW1hbmQobGludENvbW1hbmQpXG4gIC5jb21tYW5kKG1haW50ZW5hbmNlQ29tbWFuZClcbiAgLmNvbW1hbmQob3B0aW1pemVGb3JEb2NrZXJCdWlsZENvbW1hbmQpXG4gIC5jb21tYW5kKHByaXNtYUNvbW1hbmQpXG4gIC5jb21tYW5kKHJldHJ5Q29tbWFuZClcbiAgLmNvbW1hbmQoc2V0dXBDb21tYW5kKVxuICAuY29tbWFuZChzZXR1cFByaXZhdGVQYWNrYWdlc0NvbW1hbmQpXG4gIC5jb21tYW5kKHN0YXJ0Q29tbWFuZClcbiAgLmNvbW1hbmQodGVzdENvbW1hbmQpXG4gIC5jb21tYW5kKHRlc3RPbkNpQ29tbWFuZClcbiAgLmNvbW1hbmQodHJlZUtpbGxDb21tYW5kKVxuICAuY29tbWFuZCh0eXBlQ2hlY2tDb21tYW5kKVxuICAuY29tbWFuZCh0Y0NvbW1hbmQpXG4gIC5kZW1hbmRDb21tYW5kKClcbiAgLnN0cmljdCgpXG4gIC52ZXJzaW9uKGdldFZlcnNpb24oKSlcbiAgLmhlbHAoKS5hcmd2O1xuXG5mdW5jdGlvbiBnZXRWZXJzaW9uKCk6IHN0cmluZyB7XG4gIGxldCBwYWNrYWdlSnNvbkRpciA9IHBhdGguZGlybmFtZShuZXcgVVJMKGltcG9ydC5tZXRhLnVybCkucGF0aG5hbWUpO1xuICB3aGlsZSAoIWZzLmV4aXN0c1N5bmMocGF0aC5qb2luKHBhY2thZ2VKc29uRGlyLCAncGFja2FnZS5qc29uJykpKSB7XG4gICAgcGFja2FnZUpzb25EaXIgPSBwYXRoLmRpcm5hbWUocGFja2FnZUpzb25EaXIpO1xuICB9XG4gIGNvbnN0IHBhY2thZ2VKc29uID0gSlNPTi5wYXJzZShmcy5yZWFkRmlsZVN5bmMocGF0aC5qb2luKHBhY2thZ2VKc29uRGlyLCAncGFja2FnZS5qc29uJyksICd1dGY4JykpIGFzIHtcbiAgICB2ZXJzaW9uOiBzdHJpbmc7XG4gIH07XG4gIHJldHVybiBwYWNrYWdlSnNvbi52ZXJzaW9uO1xufVxuXG5sZXQgc2h1dHRpbmdEb3duID0gZmFsc2U7XG5mb3IgKGNvbnN0IHNpZ25hbCBvZiBbJ1NJR0lOVCcsICdTSUdURVJNJywgJ1NJR1FVSVQnXSkge1xuICBwcm9jZXNzLm9uKHNpZ25hbCwgKCkgPT4ge1xuICAgIGlmIChzaHV0dGluZ0Rvd24pIHJldHVybjtcblxuICAgIHNodXR0aW5nRG93biA9IHRydWU7XG4gICAgdHJ5IHtcbiAgICAgIHRyZWVLaWxsKHByb2Nlc3MucGlkKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgY29uc29sZS53YXJuKGBGYWlsZWQgdG8gdHJlZUtpbGwoJHtwcm9jZXNzLnBpZH0pIGR1cmluZyBzaHV0ZG93bjpgLCBlcnJvcik7XG4gICAgfVxuICAgIHByb2Nlc3MuZXhpdCgpO1xuICB9KTtcbn1cbiJdLCJ4X2dvb2dsZV9pZ25vcmVMaXN0IjpbNiw3LDgsOSwxMF0sIm1hcHBpbmdzIjoiMHdCQVFBLE1BQWEsRUFBNEIsQ0FDdkMsSUFBSyxDQUNILFlBQWEsMkJBQ2IsTUFBTyxFQUNQLEtBQU0sT0FDUixFQUNBLGNBQWUsQ0FDYixZQUNFLHdMQUNGLEtBQU0sUUFDUixFQUNBLG1CQUFvQixDQUNsQixZQUFhLDBGQUNiLEtBQU0sU0FDUixFQUNBLG1CQUFvQixDQUNsQixZQUFhLGlFQUNiLEtBQU0sVUFDTixRQUFTLEVBQ1gsRUFDQSxtQkFBb0IsQ0FDbEIsWUFBYSxxR0FDYixLQUFNLFVBQ04sUUFBUyxFQUNYLEVBQ0EsWUFBYSxDQUNYLFlBQWEscUZBQ2IsS0FBTSxTQUNOLFFBQVMsY0FDWCxFQUNBLFlBQWEsQ0FDWCxZQUFhLDBDQUNiLEtBQU0sU0FDUixFQUNBLFFBQVMsQ0FD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QWtCLEVBQUUsR0FBRSxDQUFDLEVBQUUsS0FBSyxPQUFPLFNBQVMsRUFBRUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxHQUFHLEVBQUUsRUFBRSxHQUFFLENBQUMsRUFBRSxFQUFFLE1BQU0sRUFBRSxNQUFNLFdBQVcsV0FBVyxXQUFXLE1BQU0sRUFBRSxXQUFXLEVBQUUsV0FBVyxXQUFXLE1BQU0sV0FBVyxJQUFJLEVBQUUsSUFBSSxFQUFFLFdBQVcsRUFBRSxXQUFXLEVBQUUsV0FBVyxFQUFFLElBQUksV0FBVyxNQUFNLFdBQVcsTUFBTSxXQUFXLE1BQU0sV0FBVyxJQUFJLFdBQVcsTUFBTSxFQUFFLFdBQVcsV0FBVyxXQUFXLFdBQVcsTUFBTSxXQUFXLFdBQVcsRUFBRSxXQUFXLFVBQVUsRUFBRSxTQUFTQyxHQUFFLEVBQUUsQ0FBQyxPQUFPLElBQUksR0FBRSxJQUFJLEdBQUUsR0FBRyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxNQUFNQyxHQUFFLEdBQUcsQ0FBQyxJQUFNLEVBQUUsQ0FBQyxFQUFFLElBQUksR0FBSyxDQUFDLEVBQUUsS0FBSyxFQUFFLFFBQVEsRUFBRSxFQUFFLEdBQUcsRUFBRSxPQUFPLENBQUMsRUFBRSxJQUFNLEdBQU4sS0FBTyxDQUFDLE9BQU8sQ0FBQyxFQUFFLEVBQUUsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxFQUFFLFVBQVUsQ0FBQyxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsY0FBYyxFQUFFLFlBQVksRUFBRSxFQUFFLEVBQUUsQ0FBQyxLQUFLLFFBQVEsRUFBRSxLQUFLLFdBQVcsRUFBRSxLQUFLLFdBQVcsTUFBTSxHQUFHLElBQUksRUFBRSxLQUFLLFVBQVUsS0FBSyxZQUFZLEVBQUUsS0FBSyxhQUFhLEdBQUcsRUFBRSxLQUFLLFlBQVksR0FBRyxJQUFJLEVBQUUsSUFBSSxJQUFJLEVBQUUsRUFBRSxFQUFFLEdBQUcsRUFBRSxFQUFFLEtBQUssRUFBRSxHQUFHLENBQUMsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxHQUFHLEtBQUssVUFBVSxNQUFVLE1BQU0seUJBQXlCLEVBQUUsSUFBTSxFQUFFLEtBQUssT0FBTyxFQUFFLEtBQUssVUFBVSxFQUFFLEVBQUUsT0FBTyxFQUFFLEtBQUssV0FBVyxFQUFFLEtBQUssRUFBTSxFQUFFLEVBQUUsRUFBRSxFQUFFLEtBQUssRUFBRSxHQUFHLENBQUMsR0FBRyxLQUFLLE1BQU0sSUFBSSxLQUFLLE1BQU0sQ0FBQyxFQUFFLEVBQUUsR0FBRyxLQUFLLE1BQU0sRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEdBQUcsRUFBRSxJQUFJLEVBQUUsS0FBSyxNQUFNLEVBQUUsR0FBRyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxZQUFZLENBQUMsR0FBRyxFQUFFLEVBQUUsSUFBSSxFQUFFLEdBQUcsSUFBSSxHQUFHRixFQUFFLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxHQUFHLEtBQUssSUFBSSxHQUFHLElBQUlBLEVBQUUsRUFBRSxLQUFLLEVBQUUsR0FBRyxLQUFLLElBQUksR0FBRyxJQUFJQSxFQUFFLEVBQUUsTUFBTSxFQUFFLE9BQU8sR0FBRyxPQUFPLEVBQUUsR0FBRyxLQUFLLElBQUksR0FBRyxLQUFLQSxFQUFFLEVBQUUsS0FBSyxFQUFFLEdBQUcsS0FBSyxJQUFJLEdBQUcsRUFBRSxLQUFLQSxFQUFFLEVBQUUsS0FBSyxFQUFFLEdBQUcsS0FBSyxJQUFJLEdBQUcsSUFBSUEsRUFBRSxFQUFFLE9BQU8sRUFBRSxRQUFRLEtBQUssSUFBSSxHQUFHLE1BQU0sRUFBRSxZQUFZLEVBQUUsQ0FBQyxHQUFHLElBQUksRUFBRSxHQUFHLEtBQUssSUFBSSxHQUFHLEtBQUtBLEVBQUUsRUFBRSxLQUFLLEVBQUUsR0FBRyxLQUFLLElBQUksR0FBRyxHQUFHLEtBQUtBLEVBQUUsRUFBRSxLQUFLLEVBQUUsR0FBRyxLQUFLLElBQUksR0FBRyxFQUFFLEtBQUtBLEVBQUUsRUFBRSxLQUFLLEVBQUUsR0FBRyxLQUFLLElBQUksR0FBRyxJQUFJQSxFQUFFLEVBQUUsTUFBTSxHQUFHLEtBQUssY0FBYyxFQUFFLEdBQUcsRUFBRSxDQUFDLElBQUksS0FBSyxNQUFNLEVBQUUsRUFBRSxLQUFLLE1BQU0sRUFBRSxHQUFHLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsSUFBSSxFQUFFLEdBQUcsR0FBRSxDQUFDLEVBQUUsS0FBSyxNQUFNLENBQUMsQ0FBQyxLQUFNLE1BQUssTUFBTSxDQUFDLENBQUMsT0FBTyxJQUFJLENBQUMsVUFBVSxDQUFDLEdBQUcsS0FBSyxVQUFVLE9BQU8sS0FBSyxVQUFVLENBQUMsRUFBRSxJQUFNLEVBQUUsS0FBSyxPQUFXLEVBQUUsS0FBSyxjQUFvQixFQUFFLEtBQUssV0FBVyxFQUFFLEtBQUssRUFBRSxHQUFHLEVBQUUsR0FBRyxJQUFJLEtBQUssUUFBUSxFQUFFLEdBQUcsS0FBSyxnQkFBZ0IsS0FBSyxVQUFVLElBQUksRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsR0FBRyxFQUFFLElBQUksRUFBRSxFQUFFLElBQUksV0FBVyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLElBQUksRUFBRSxHQUFHLEdBQUUsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLEtBQUssU0FBUyxFQUFFLElBQU0sRUFBRSxLQUFLLFdBQWUsRUFBRSxLQUFLLEVBQVEsRUFBRSxLQUFLLGFBQWEsRUFBRSxLQUFLLFdBQWUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsR0FBRyxLQUFLLEVBQUUsR0FBRyxDQUFDLElBQUksRUFBRSxFQUFFLEVBQUUsR0FBRyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsR0FBRyxHQUFHRCxFQUFFLEdBQUcsRUFBRSxJQUFJQSxFQUFFLEdBQUcsR0FBR0EsRUFBRSxHQUFHLEdBQUcsSUFBSUEsRUFBRSxHQUFHLEVBQUUsSUFBSUEsRUFBRSxHQUFHLEdBQUcsSUFBSUEsRUFBRSxHQUFHLEdBQUcsSUFBSUEsRUFBRSxHQUFHLEdBQUcsSUFBSUEsRUFBRSxHQUFHLEdBQUcsSUFBSSxFQUFFLElBQUksSUFBSSxFQUFFRyxHQUFFLENBQUMsRUFBRUMsR0FBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsT0FBTyxJQUFJLEVBQUUsRUFBRSxHQUFHLEdBQUdKLEVBQUUsR0FBRyxFQUFFLElBQUlBLEVBQUUsR0FBRyxHQUFHLEVBQUUsSUFBSSxHQUFHQSxFQUFFLEdBQUcsR0FBRyxJQUFJQSxFQUFFLEdBQUcsRUFBRSxLQUFLLEVBQUUsSUFBSSxHQUFHQSxFQUFFLEdBQUcsR0FBRyxJQUFJQSxFQUFFLEdBQUcsR0FBRyxNQUFNLENBQUMsQ0FBQyxFQUFDLE1BQU1JLEdBQUUsU0FBUyxFQUFFLENBQUMsSUFBSSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEdBQUUsR0FBRSxHQUFFLEdBQUUsR0FBRSxHQUFFLEVBQUUsR0FBRSxHQUFFLEdBQUUsR0FBRSxHQUFFLEdBQUUsR0FBRSxHQUFFLEdBQUUsRUFBRSxHQUFFLEdBQUcsR0FBRyxHQUFHLEVBQUcsR0FBRyxFQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxJQUFJLEVBQUUsRUFBRSxFQUFFLEdBQUcsR0FBRyxFQUFFLEVBQUUsRUFBRSxHQUFHLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLEVBQUUsR0FBRyxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxFQUFFLEdBQUcsRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsRUFBRSxHQUFHLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLEVBQUUsR0FBRyxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxFQUFFLEdBQUcsRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsRUFBRSxHQUFHLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLEVBQUUsR0FBRyxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxFQUFFLEdBQUcsRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsRUFBRSxHQUFHLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLEdBQUcsR0FBRyxFQUFFLElBQUksSUFBSSxFQUFFLEdBQUcsR0FBRyxFQUFFLElBQUksSUFBSSxFQUFFLElBQUksRUFBRSxFQUFFLElBQUksRUFBRSxFQUFFLEtBQUssRUFBRSxFQUFFLEtBQUssRUFBRSxFQUFFLEtBQUssRUFBRSxFQUFFLEtBQUssRUFBRSxFQUFFLEtBQUssRUFBRSxFQUFFLEtBQUssRUFBRSxFQUFFLEtBQUssRUFBRSxFQUFFLEtBQUssRUFBRSxFQUFFLEdBQUcsR0FBRyxFQUFFLElBQUksSUFBSSxFQUFFLEdBQUcsR0FBRyxFQUFFLElBQUksSUFBSSxFQUFFLElBQUksRUFBRSxFQUFFLElBQUksRUFBRSxFQUFFLEtBQUssRUFBRSxFQUFFLEtBQUssRUFBRSxFQUFFLEtBQUssRUFBRSxFQUFFLEtBQUssRUFBRSxFQUFFLEtBQUssRUFBRSxFQUFFLEtBQUssRUFBRSxFQUFFLEtBQUssRUFBRSxFQUFFLEtBQUssRUFBRSxFQUFFLEdBQUcsR0FBRyxFQUFFLElBQUksSUFBSSxFQUFFLEdBQUcsR0FBRyxFQUFFLElBQUksSUFBSSxFQUFFLElBQUksRUFBRSxFQUFFLElBQUksRUFBRSxFQUFFLEtBQUssRUFBRSxFQUFFLEtBQUssRUFBRSxFQUFFLEtBQUssRUFBRSxFQUFFLEtBQUssRUFBRSxFQUFFLEtBQUssRUFBRSxFQUFFLEtBQUssRUFBRSxFQUFFLEtBQUssRUFBRSxFQUFFLEtBQUssRUFBRSxFQUFFLEdBQUcsR0FBRyxFQUFFLElBQUksSUFBSSxFQUFFLEdBQUcsR0FBRyxFQUFFLElBQUksSUFBSSxFQUFFLElBQUksRUFBRSxFQUFFLElBQUksRUFBRSxFQUFFLEtBQUssRUFBRSxFQUFFLEtBQUssRUFBRSxFQUFFLEtBQUssRUFBRSxFQUFFLEtBQUssRUFBRSxFQUFFLEtBQUssRUFBRSxFQUFFLEtBQUssRUFBRSxFQUFFLEtBQUssRUFBRSxFQUFFLEtBQUssRUFBRSxFQUFFLEdBQUcsR0FBRyxFQUFFLElBQUksSUFBSSxFQUFFLEdBQUcsR0FBRyxFQUFFLElBQUksSUFBSSxFQUFFLElBQUksRUFBRSxFQUFFLElBQUksRUFBRSxFQUFFLEtBQUssRUFBRSxFQUFFLEtBQUssRUFBRSxFQUFFLEtBQUssRUFBRSxFQUFFLEtBQUssRUFBRSxFQUFFLEtBQUssRUFBRSxFQUFFLEtBQUssRUFBRSxFQUFFLEtBQUssRUFBRSxFQUFFLEtBQUssRUFBRSxFQUFFLEVBQUUsR0FBRyxFQUFFLEVBQUUsR0FBRyxHQUFFLEVBQUUsS0FBSyxFQUFFLEVBQUUsTUFBTSxHQUFHLEdBQUUsRUFBRSxLQUFLLEVBQUUsRUFBRSxNQUFNLEdBQUcsRUFBRSxFQUFFLEtBQUssRUFBRSxFQUFFLE1BQU0sR0FBRyxFQUFFLEVBQUUsS0FBSyxFQUFFLEVBQUUsTUFBTSxHQUFHLEdBQUcsRUFBRSxLQUFLLEVBQUUsRUFBRSxNQUFNLEdBQUcsR0FBRyxFQUFFLEtBQUssRUFBRSxFQUFFLE1BQU0sR0FBRyxHQUFFLEVBQUUsS0FBSyxHQUFHLEVBQUUsTUFBTSxHQUFHLEdBQUUsRUFBRSxLQUFLLEdBQUcsRUFBRSxNQUFNLEdBQUcsRUFBRSxFQUFFLElBQUksRUFBRSxFQUFFLEtBQUssR0FBRyxHQUFFLEVBQUUsSUFBSSxFQUFFLEVBQUUsS0FBSyxHQUFHLEVBQUUsRUFBRSxLQUFLLEdBQUcsRUFBRSxNQUFNLEdBQUcsRUFBRSxFQUFFLEtBQUssR0FBRyxFQUFFLE1BQU0sR0FBRyxHQUFFLEVBQUUsS0FBSyxHQUFHLEVBQUUsTUFBTSxHQUFHLEdBQUUsRUFBRSxLQUFLLEdBQUcsRUFBRSxNQUFNLEdBQUcsRUFBRSxFQUFFLEtBQUssR0FBRyxFQUFFLE1BQU0sR0FBRyxFQUFFLEVBQUUsS0FBSyxHQUFHLEVBQUUsTUFBTSxHQUFHLEdBQUcsRUFBRSxLQUFLLEVBQUUsRUFBRSxNQUFNLEdBQUcsR0FBRyxFQUFFLEtBQUssRUFBRSxFQUFFLE1BQU0sR0FBRyxHQUFHLEVBQUUsSUFBSSxHQUFHLEVBQUUsS0FBSyxFQUFFLEdBQUcsRUFBRSxJQUFJLEdBQUcsRUFBRSxLQUFLLEVBQUUsR0FBRSxFQUFFLEtBQUssRUFBRSxFQUFFLE1BQU0sR0FBRyxHQUFFLEVBQUUsS0FBSyxFQUFFLEVBQUUsTUFBTSxHQUFHLEVBQUUsRUFBRSxLQUFLLEdBQUcsRUFBRSxNQUFNLEdBQUcsRUFBRSxFQUFFLEtBQUssR0FBRyxFQUFFLE1BQU0sR0FBRyxHQUFFLEVBQUUsS0FBSyxHQUFHLEVBQUUsTUFBTSxHQUFHLEVBQUUsRUFBRSxLQUFLLEdBQUcsRUFBRSxNQUFNLEdBQUcsRUFBRSxFQUFFLEtBQUssR0FBRyxFQUFFLE1BQU0sRUFBRSxFQUFFLEVBQUUsS0FBSyxHQUFHLEVBQUUsTUFBTSxFQUFFLEVBQUUsRUFBRSxJQUFJLEdBQUcsRUFBRSxLQUFLLEVBQUUsRUFBRSxFQUFFLElBQUksR0FBRyxFQUFFLEtBQUssRUFBRSxFQUFHLEVBQUUsS0FBSyxHQUFHLEVBQUUsTUFBTSxFQUFFLEdBQUcsRUFBRSxLQUFLLEdBQUcsRUFBRSxNQUFNLEVBQUUsR0FBRSxFQUFFLEtBQUssR0FBRyxFQUFFLE1BQU0sRUFBRSxHQUFFLEVBQUUsS0FBSyxHQUFHLEVBQUUsTUFBTSxFQUFFLEVBQUUsRUFBRSxLQUFLLEdBQUcsRUFBRSxNQUFNLEdBQUcsRUFBRSxFQUFFLEtBQUssR0FBRyxFQUFFLE1BQU0sR0FBRyxHQUFFLEVBQUUsS0FBSyxHQUFHLEVBQUUsTUFBTSxFQUFFLEdBQUcsRUFBRSxLQUFLLEdBQUcsRUFBRSxNQUFNLEVBQUUsR0FBRSxFQUFFLElBQUksR0FBRyxFQUFFLEtBQUssRUFBRSxHQUFFLEVBQUUsSUFBSSxHQUFHLEVBQUUsS0FBSyxFQUFFLEVBQUUsRUFBRSxLQUFLLEdBQUcsRUFBRSxNQUFNLEdBQUcsRUFBRSxFQUFFLEtBQUssR0FBRyxFQUFFLE1BQU0sR0FBRyxFQUFHLEVBQUUsS0FBSyxFQUFFLEVBQUUsTUFBTSxHQUFHLEdBQUcsRUFBRSxLQUFLLEVBQUUsRUFBRSxNQUFNLEdBQUcsR0FBRSxFQUFFLEtBQUssRUFBRSxFQUFFLE1BQU0sR0FBRyxFQUFFLEVBQUUsS0FBSyxFQUFFLEVBQUUsTUFBTSxHQUFHLEVBQUUsRUFBRSxLQUFLLEdBQUcsRUFBRSxNQUFNLEdBQUcsRUFBRSxFQUFFLEtBQUssR0FBRyxFQUFFLE1BQU0sR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLEdBQUcsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLElBQUksRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLElBQUksRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLElBQUksRUFBRSxDQUFDLEdBQUUsR0FBRSxFQUFFLElBQUksR0FBRSxDQUFDLEdBQUUsR0FBRSxFQUFFLElBQUksR0FBRSxDQUFDLEdBQUUsR0FBRSxFQUFFLElBQUksR0FBRSxDQUFDLEdBQUUsR0FBRSxFQUFFLElBQUksR0FBRyxDQUFDLEVBQUcsRUFBRyxFQUFFLElBQUksR0FBRyxDQUFDLEdBQUcsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLEdBQUcsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLElBQUksRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLElBQUksRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLElBQUksR0FBRSxDQUFDLEdBQUUsR0FBRSxFQUFFLElBQUksR0FBRSxDQUFDLEdBQUUsRUFBRSxFQUFFLElBQUksR0FBRSxDQUFDLEdBQUUsR0FBRSxFQUFFLElBQUksR0FBRSxDQUFDLEdBQUUsRUFBRSxFQUFFLElBQUksRUFBRyxDQUFDLEVBQUcsR0FBRyxFQUFFLElBQUksR0FBRyxDQUFDLEdBQUcsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLEdBQUcsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLElBQUksRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLElBQUksRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLElBQUksR0FBRSxDQUFDLEdBQUUsR0FBRSxFQUFFLElBQUksR0FBRSxDQUFDLEVBQUUsR0FBRSxFQUFFLElBQUksR0FBRSxDQUFDLEdBQUUsR0FBRSxFQUFFLElBQUksR0FBRSxDQUFDLEVBQUUsR0FBRyxFQUFFLElBQUksRUFBRyxDQUFDLEdBQUcsR0FBRyxFQUFFLElBQUksR0FBRyxDQUFDLEdBQUcsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLEdBQUcsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLElBQUksRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLElBQUksRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLElBQUksR0FBRSxDQUFDLEdBQUUsRUFBRSxFQUFFLElBQUksRUFBRSxDQUFDLEdBQUUsR0FBRSxFQUFFLElBQUksR0FBRSxDQUFDLEdBQUUsR0FBRSxFQUFFLElBQUksRUFBRSxDQUFDLEdBQUcsR0FBRSxFQUFFLElBQUksR0FBRyxDQUFDLEdBQUcsR0FBRyxFQUFFLElBQUksR0FBRyxDQUFDLEdBQUcsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLEdBQUcsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLElBQUksRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLElBQUksRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLElBQUksR0FBRSxDQUFDLEVBQUUsR0FBRSxFQUFFLElBQUksR0FBRSxDQUFDLEdBQUUsR0FBRSxFQUFFLElBQUksR0FBRSxDQUFDLEdBQUUsR0FBRSxF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RUFBRSxFQUFFLElBQUksSUFBSSxPQUFPLFNBQVMsRUFBRSxFQUFFLENBQUMsSUFBTSxFQUFFLEdBQUUsQ0FBQyxFQUFFLEdBQVUsSUFBUCxLQUFTLE9BQU8sRUFBRSxJQUFJLEVBQUUsRUFBRSxJQUFJLENBQUMsRUFBRSxHQUFZLElBQVQsSUFBSyxHQUFNLE9BQU8sRUFBRSxPQUFPLEVBQUUsRUFBRSxPQUFPLE9BQU8sRUFBekIsQ0FBNEIsSUFBSSxTQUFTLElBQUksU0FBUyxJQUFJLFVBQVUsRUFBRSxHQUFHLEVBQUUsRUFBRSxJQUFJLEVBQUUsQ0FBQyxFQUFFLE1BQU0sSUFBSSxTQUFTLEVBQUUsR0FBRyxDQUFDLEdBQUcsRUFBRSxTQUFTLEVBQUUsQ0FBQyxFQUFFLEVBQUUsSUFBSSxFQUFFLENBQUMsRUFBRSxNQUFNLElBQUksU0FBUyxHQUFVLElBQVAsS0FBUyxFQUFFLEdBQUcsRUFBRSxFQUFFLElBQUksRUFBRSxDQUFDLE9BQU8sR0FBRyxNQUFNLFFBQVEsQ0FBQyxFQUFFLENBQUMsSUFBTSxFQUFFLFNBQVMsRUFBRSxDQUFDLEdBQUcsR0FBRSxPQUFPLEVBQUUsQ0FBQyxJQUFNLEVBQUUsR0FBRSxPQUFPLEdBQUUsT0FBTyxFQUFFLEdBQUUsS0FBSyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsT0FBTyxHQUFFLE1BQU0sRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLE1BQU0sRUFBRSxFQUFFLEdBQUcsRUFBRSxFQUFFLElBQUksRUFBRSxDQUFDLEVBQUUsSUFBSSxHQUFLLENBQUMsRUFBRSxLQUFLLEVBQUUsUUFBUSxFQUFFLEVBQUUsR0FBRyxFQUFFLENBQUMsQ0FBQyxLQUFLLENBQUMsR0FBSyxDQUFDLEVBQUUsR0FBRyxTQUFTLEVBQUUsRUFBRSxDQUFDLElBQU0sRUFBRSxFQUFFLFlBQVksR0FBZSxPQUFPLEdBQW5CLFdBQXFCLENBQUMsSUFBTSxFQUFFLEVBQUUsS0FBSyxFQUFFLEVBQUUsSUFBSSxDQUFDLEVBQUUsR0FBWSxJQUFULElBQUssR0FBTSxNQUFNLENBQUMsRUFBRSxFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFNLEVBQUUsT0FBTyxRQUFRLENBQUMsRUFBRSxFQUFFLEVBQUUsT0FBTyxFQUFFLE1BQU0sS0FBSyxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUMsRUFBRSxJQUFJLElBQUksRUFBRSxFQUFFLEVBQUUsRUFBRSxJQUFJLENBQUMsSUFBTSxFQUFFLEVBQUUsR0FBRyxFQUFFLEVBQUUsRUFBRSxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsRUFBRSxHQUFHLEVBQUUsRUFBRSxDQUFDLE1BQU0sQ0FBQSxHQUFHLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxPQUFPLEVBQUUsTUFBTSxLQUFLLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsR0FBRyxFQUFFLEVBQUUsR0FBRyxFQUFFLEVBQUUsSUFBSSxFQUFFLENBQUMsRUFBRSxJQUFJLElBQUksRUFBRSxFQUFFLEVBQUUsRUFBRSxJQUFJLEVBQUUsRUFBRSxHQUFHLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENDQXZwQyxTQUFTLEdBQUUsRUFBRSxFQUFFLENBQUMsT0FBT0UsR0FBRUMsR0FBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFpQyxTQUFTLElBQUcsQ0FBQyxNQUFNLEVBQUUsQ0NBMUYsTUFBTSxFQUFFLEdBQUUsQ0FBQyxZQUFZQyxFQUFDLENBQUMsRUFBSSxHQUFFLENBQUMsWUFBWUMsRUFBQyxDQUFDLEVBQUUsU0FBUyxHQUFFLENBQUMsY0FBYyxFQUFFLElBQXlCLFlBQVksRUFBRUQsSUFBRyxDQUFDLEVBQUUsQ0FBQyxPQUFPLFNBQVMsRUFBRSxFQUFFLENBQUMsSUFBSSxFQUFFLEVBQUUsRUFBRSxPQUFpQixHQUFHLE9BQWQsU0FBbUIsVUFBVSxDQUFDLElBQU0sRUFBRSxFQUFFLEtBQUssQ0FBQyxDQUFDLEVBQUUsRUFBRSxLQUFLLElBQUksRUFBRSxPQUFPLElBQUksR0FBRyxFQUFFLEVBQUUsS0FBSyxFQUFFLEVBQUUsRUFBRSxFQUFFLEtBQUssSUFBSSxFQUFFLEVBQUUsR0FBRyxDQUFDLEVBQUUsU0FBUyxHQUFHLEVBQUUsQ0FBQyxJQUFNLEVBQUUsRUFBRSxLQUFLLENBQUMsRUFBRSxFQUFFLEtBQUssSUFBSSxFQUFFLE9BQU8sSUFBSSxHQUFHLEVBQUUsRUFBRSxLQUFLLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxLQUFLLEtBQUssR0FBRyxDQUFDLEVBQUUsRUFBRSxHQUFHLENBQUMsRUFBRSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0NXamQsU0FBZ0IsR0FBNEIsRUFBaUIsRUFBa0QsQ0FDN0csSUFBTSxFQUFxQixDQUFDLEVBQ3hCLEVBQWMsRUFBSyxRQUFRLENBQU8sRUFDdEMsT0FBUyxDQUNQLElBQU0sRUFBVSxFQUFLLEtBQUssRUFBYSxlQUFnQixNQUFNLEVBSzdELEdBSkksRUFBRyxXQUFXLENBQU8sR0FDdkIsRUFBUyxLQUFLLENBQU8sRUFHbkIsRUFBRyxXQUFXLEVBQUssS0FBSyxFQUFhLE1BQU0sQ0FBQyxFQUM5QyxNQUVGLElBQU0sRUFBYSxFQUFLLFFBQVEsQ0FBVyxFQUMzQyxHQUFJLElBQWdCLEVBQ2xCLE1BRUYsRUFBYyxDQUNoQixDQUdBLE9BRkksRUFBUyxTQUFXLEVBQVUsSUFDbEMsRUFBSSxLQUFPLEVBQUksS0FBTyxHQUFHLEVBQVMsS0FBSyxHQUFHLEVBQUUsR0FBRyxFQUFJLE9BQVMsRUFBUyxLQUFLLEdBQUcsRUFDdEUsR0FDVCxDQ2hDQSxTQUFnQixHQUFLLEVBQW9DLENBQ3ZELE1BQU8sQ0FBQyxDQUFDLEdBQVMsSUFBVSxLQUFPLElBQVUsT0FDL0MsMHlHQ1lBLE1BQWEsR0FBYyxRQUUzQixJQUFhLEdBQWIsS0FBcUIsQ0FBQSxPQUFBLENBQUEsSUFBQSxHQUFBLEtBQUEsQ0FBQSxFQUFBLENBQUEsQ0FhbEIsRUFBVSxFQUFBLGdCQUFBLEVBQUEsQ0FrQlYsRUFBVSxFQUFBLHVCQUFBLEVBQUEsQ0EyQlYsRUFBVSxFQUFBLGNBQUEsRUFBQSxDQWFWLEVBQVUsRUFBQSxhQUFBLEVBQUEsQ0FPVixFQUFVLEVBQUEsWUFBQSxFQUFBLENBS1YsRUFBVSxFQUFBLGVBQUEsRUFBQSxDQVNWLEVBQVUsRUFBQSxlQUFBLEVBQUEsQ0FLVixFQUFVLEVBQUEsTUFBQSxFQUFBLENBS1YsRUFBVSxFQUFBLGlCQUFBLEVBQUEsQ0FpQ1YsRUFBVSxFQUFBLGFBQUEsRUFBQSxDQUtWLEVBQVUsRUFBQSxpQkFBQSxFQUFBLENBS1YsRUFBVSxFQUFBLFdBQUEsRUFBQSxDQUtWLEVBQVUsRUFBQSxZQUFBLEVBQUEsQ0FLVixFQUFVLEVBQUEsYUFBQSxFQUFBLENBT1YsRUFBVSxFQUFBLFdBQUEsRUFBQSxDQUtWLEVBQVUsRUFBQSxXQUFBLEVBQUEsQ0FLVixFQUFVLEVBQUEsb0JBQUEsRUFBQSxDQU1WLEVBQVUsRUFBQSxVQUFBLEVBQUEsQ0FLVixFQUFVLEVBQUEsYUFBQSxFQUFBLENBS1YsRUFBVSxFQUFBLGVBQUEsRUFBQSxDQU9WLEVBQVUsRUFBQSxnQkFBQSxFQUFBLENBUVYsRUFBVSxFQUFBLGNBQUEsRUFBQSxDQVNWLEVBQVUsRUFBQSxpQkFBQSxFQUFBLENBVVYsRUFBVSxFQUFBLHFCQUFBLEVBQUEsQ0FTVixFQUFVLEVBQUEsa0NBQUEsRUFBQSxDQVdWLEVBQVUsRUFBQSxtQkFBQSxFQUFBLENBU1YsRUFBVSxFQUFBLFdBQUEsRUFBQSxDQXdDVixFQUFVLEVBQUEsaUJBQUEsQ0FBQSxDQUFBLENBQUEsQ0FBQSxDQUFBLENBbFNNLEtBQUksS0FBQSxHQUFBLElBQUEsRUFDSixRQUNBLFdBQWEsSUFBSSxJQUVqQixTQUVqQixZQUFZLEVBQWlCLEVBQXdCLEVBQWtCLENBQ3JFLEtBQUssU0FBVyxFQUFLLFFBQVEsQ0FBTyxFQUNwQyxLQUFLLEtBQU8sRUFDWixLQUFLLFFBQVUsQ0FDakIsQ0FFQSxJQUNJLGdCQUEwQixDQUM1QixPQUFPLEtBQUsscUJBQ2QsQ0FJQSxJQUFJLHVCQUF3QyxDQUMxQyxPQUFPLEtBQUssZUFBaUIsTUFBUSxNQUN2QyxDQUVBLElBQUksMEJBQStDLENBQ2pELE9BQU8sS0FBSyxlQUFpQixVQUFZLE1BQzNDLENBS0EsSUFDSSx1QkFBaUMsQ0FHbkMsT0FGSSxLQUFLLGtCQUFrQixHQUN2QixLQUFLLGVBQWUsRUFBVSxHQUMzQixLQUFLLHFCQUFxQixDQUNuQyxDQUVRLG1CQUE2QixDQUluQyxPQURJLEdBQWdCLEVBQUssS0FBSyxLQUFLLFlBQWEsZ0JBQWdCLEVBQUcsYUFBYSxFQUFVLEdBQ25GLENBQUMsWUFBYSxZQUFZLENBQUMsQ0FBQyxLQUFNLEdBQ3ZDLEdBQWdCLEVBQUssS0FBSyxLQUFLLFlBQWEsQ0FBUSxFQUFHLHdCQUF3QixDQUNqRixDQUNGLENBRVEsZ0JBQTBCLENBR2hDLE1BQU8sQ0FBQyxXQUFZLFdBQVcsQ0FBQyxDQUFDLEtBQU0sR0FBYSxFQUFHLFdBQVcsRUFBSyxLQUFLLEtBQUssWUFBYSxDQUFRLENBQUMsQ0FBQyxDQUMxRyxDQUVRLHNCQUFnQyxDQUN0QyxJQUFNLEVBQWlCLEtBQUssaUJBQWlCLGdCQUFrQixLQUFLLFlBQVksZUFDaEYsT0FBTyxPQUFPLEdBQW1CLFVBQVksRUFBZSxXQUFXLE1BQU0sQ0FDL0UsQ0FFQSxJQUNJLGNBQXVCLENBQ3pCLE9BQU8sS0FBSyxZQUFZLFNBQVMsT0FBTyxTQUFTLGVBQWUsRUFDNUQsaUJBQ0EsS0FBSyxZQUFZLFNBQVMsTUFDeEIseUJBQXlCLEtBQUssS0FBSyxRQUFVLFlBQWMsS0FDM0Qsd0JBQ1IsQ0FFQSxJQUFJLFNBQWtCLENBQ3BCLE9BQU8sS0FBSyxRQUNkLENBRUEsSUFDSSxhQUFzQixDQUN4QixPQUFPLEVBQUcsV0FBVyxFQUFLLEtBQUssS0FBSyxRQUFTLEtBQU0sS0FBTSxjQUFjLENBQUMsRUFDcEUsRUFBSyxRQUFRLEtBQUssUUFBUyxLQUFNLElBQUksRUFDckMsS0FBSyxPQUNYLENBRUEsSUFDSSxZQUFxQixDQUN2QixPQUFPLEVBQUcsYUFBYSxLQUFLLFNBQVMsWUFBWSxFQUFHLE1BQU0sQ0FDNUQsQ0FFQSxJQUNJLGVBQXlCLENBQzNCLEdBQUksQ0FDRixNQUFPLENBQUMsQ0FBQyxLQUFLLFNBQVMsWUFBWSxDQUNyQyxNQUFRLENBQ04sTUFBTyxFQUNULENBQ0YsQ0FFQSxJQUNJLGVBQXlCLENBQzNCLE9BQU8sRUFBRyxXQUFXLEVBQUssS0FBSyxLQUFLLFFBQVMsS0FBSyxDQUFDLENBQ3JELENBRUEsSUFDSSxNQUFlLENBQ2pCLE9BQU8sS0FBSyxZQUFZLE1BQVEsU0FDbEMsQ0FFQSxJQUNJLGlCQUEwQixDQUU1QixPQURhLEtBQUssWUFBWSxNQUFRLFVBQUEsQ0FDMUIsV0FBVyxJQUFLLEVBQUUsQ0FBQyxDQUFDLFdBQVcsSUFBSyxHQUFHLENBQ3JELENBTVEsU0FFUixJQUFJLEtBQTBDLENBQzVDLEdBQUksS0FBSyxTQUFVLE9BQU8sS0FBSyxTQUMvQixHQUFJLENBQUMsS0FBSyxRQUVSLE1BREEsTUFBSyxTQUFXLFFBQVEsSUFDakIsS0FBSyxTQUdkLEdBQU0sQ0FBQyxFQUFTLEdBQW9DLEVBQXlCLEtBQUssS0FBTSxLQUFLLE9BQU8sRUFDcEcsR0FBSSxDQUFDLEVBQWdDLEtBQUssSUFBSSxFQUM1QyxJQUFLLEdBQU0sQ0FBQyxFQUFTLEtBQVUsRUFDN0IsUUFBUSxLQUFLLFVBQVUsRUFBSyw4QkFBK0IsR0FBUyxFQVF4RSxNQURBLE1BQUssU0FBVyxDQUFFLEdBQUcsUUFBUSxJQUFLLEdBQUcsQ0FBUSxFQUN0QyxLQUFLLFFBQ2QsQ0FFQSxJQUNJLGFBQTJCLENBQzdCLE9BQU8sS0FBSyxNQUFNLEVBQUcsYUFBYSxLQUFLLGdCQUFpQixNQUFNLENBQUMsQ0FDakUsQ0FFQSxJQUNJLGlCQUEwQixDQUM1QixPQUFPLEVBQUssS0FBSyxLQUFLLFFBQVMsY0FBYyxDQUMvQyxDQUVBLElBQ0ksV0FBcUIsQ0FDdkIsTUFBTyxDQUFDLENBQUMsS0FBSyx3QkFBd0IsUUFBUSxDQUNoRCxDQUVBLElBQ0ksWUFBc0IsQ0FDeEIsTUFBTyxDQUFDLENBQUMsS0FBSyx3QkFBd0IsYUFBYSxDQUNyRCxDQUVBLElBQ0ksYUFBdUMsQ0FDekMsR0FBSSxLQUFLLFVBQVcsTUFBTyxTQUMzQixHQUFJLEtBQUssV0FBWSxNQUFPLFNBRTlCLENBRUEsSUFDSSxXQUFxQixDQUN2QixNQUFPLENBQUMsRUFBRSxLQUFLLFlBQVksY0FBYyxRQUFVLEtBQUssWUFBWSxpQkFBaUIsT0FDdkYsQ0FFQSxJQUNJLFdBQXFCLENBQ3ZCLE9BQU8sS0FBSyxjQUFjLFFBQVEsQ0FDcEMsQ0FFQSxJQUNJLG9CQUE4QixDQUVoQyxPQUFPLEtBQUssV0FBYSxLQUFLLGNBQWMsaUJBQWlCLENBQy9ELENBRUEsSUFDSSxVQUFvQixDQUN0QixPQUFPLEtBQUssY0FBYyxPQUFPLENBQ25DLENBRUEsSUFDSSxhQUF1QixDQUN6QixPQUFPLEtBQUssY0FBYyxVQUFVLENBQ3RDLENBRUEsSUFDSSxlQUF5QixDQUMzQixPQUNFLEVBQUcsV0FBVyxFQUFLLEtBQUssS0FBSyxRQUFTLGFBQWEsQ0FBQyxHQUFLLEVBQUcsV0FBVyxFQUFLLEtBQUssS0FBSyxZQUFhLGFBQWEsQ0FBQyxDQUVySCxDQUVBLElBQ0ksZ0JBQTBCLENBQzVCLE9BQ0UsRUFBRyxXQUFXLEVBQUssS0FBSyxLQUFLLFFBQVMsY0FBYyxDQUFDLEdBQ3JELEVBQUcsV0FBVyxFQUFLLEtBQUssS0FBSyxZQUFhLGNBQWMsQ0FBQyxDQUU3RCxDQUVBLElBQ0ksY0FBd0IsQ0FLMUIsT0FBTyxFQUFHLFdBQVcsRUFBSyxLQUFLLEtBQUssUUFBUyxZQUFZLENBQUMsQ0FDNUQsQ0FFQSxJQUNJLGlCQUF3QyxDQUMxQyxHQUFJLEtBQUssVUFBVyxNQUFPLFFBRTdCLENBRUEsaUJBQWlCLEVBQThCLENBQzdDLE1BQU8sQ0FBQyxDQUFDLEtBQUssd0JBQXdCLENBQVcsQ0FDbkQsQ0FFQSxJQUNJLHFCQUErQixDQUNqQyxHQUFJLENBQ0YsTUFBTyxDQUFDLENBQUMsS0FBSyxTQUFTLHNCQUFzQixDQUMvQyxNQUFRLENBQ04sTUFBTyxFQUNULENBQ0YsQ0FFQSxJQUNJLGtDQUE0QyxDQUM5QyxHQUFJLEdBQUssS0FBSyxJQUFJLEVBQUUsRUFBRyxNQUFPLEdBQzlCLEdBQUksQ0FDRixJQUFNLEVBQWEsS0FBSyxTQUFTLHNCQUFzQixFQUN2RCxNQUFPLGdCQUFnQixLQUFLLEVBQUcsYUFBYSxFQUFZLE1BQU0sQ0FBQyxDQUNqRSxNQUFRLENBQ04sTUFBTyxFQUNULENBQ0YsQ0FFQSxJQUNJLG1CQUFpQyxDQUNuQyxPQUFPLEVBQUssUUFBUSxLQUFLLFNBQVMsWUFBWSxDQUFDLElBQU0sS0FBSyxRQUN0RCxLQUFLLFlBQ0osS0FBSyxNQUNKLEVBQUcsYUFBYSxFQUFLLEtBQUssRUFBSyxRQUFRLEtBQUssU0FBUyxZQUFZLENBQUMsRUFBRyxjQUFjLEVBQUcsTUFBTSxDQUM5RixDQUNOLENBRUEsSUFDSSxXQUFxQixDQUN2QixPQUFPLEdBQTRCLEtBQUssUUFBUyxLQUFLLEdBQUcsQ0FDM0QsQ0FFQSxTQUFTLEVBQTBCLENBQ2pDLElBQUksRUFBVyxLQUFLLFdBQVcsSUFBSSxDQUFRLEVBQzNDLEdBQUksRUFBVSxPQUFPLEVBS3JCLEdBSEEsRUFBVyxDQUFDLEVBQVUsRUFBSyxLQUFLLEtBQU0sS0FBTSxDQUFRLENBQUMsQ0FBQyxDQUNuRCxJQUFLLEdBQU0sRUFBSyxRQUFRLEtBQUssUUFBUyxDQUFDLENBQUMsQ0FBQyxDQUN6QyxLQUFNLEdBQU0sRUFBRyxXQUFXLENBQUMsQ0FBQyxFQUMzQixDQUFDLEVBQ0gsTUFBVSxNQUFNLG1CQUFtQixHQUFVLEVBRy9DLE9BREEsS0FBSyxXQUFXLElBQUksRUFBVSxDQUFRLEVBQy9CLENBQ1QsQ0FFUSxjQUFjLEVBQThCLENBQ2xELE1BQU8sQ0FBQyxFQUNOLEtBQUssd0JBQXdCLENBQVcsR0FBSyxLQUFLLHFCQUFxQixLQUFLLGdCQUFpQixDQUFXLEVBRTVHLENBRVEsd0JBQXdCLEVBQXlDLENBQ3ZFLE9BQU8sS0FBSyxxQkFBcUIsS0FBSyxZQUFhLENBQVcsQ0FDaEUsQ0FFUSxxQkFBcUIsRUFBc0MsRUFBeUMsQ0FDckcsS0FFTCxPQUNFLEVBQVksZUFBZSxJQUMzQixFQUFZLGtCQUFrQixJQUM5QixFQUFZLHVCQUF1QixJQUNuQyxFQUFZLG1CQUFtQixFQUVuQyxDQUVBLElBQ1ksaUJBQTJDLENBQ3JELEdBQUksS0FBSyxjQUFnQixLQUFLLFFBQVMsT0FBTyxLQUFLLFlBRW5ELEdBQUksQ0FDRixPQUFPLEtBQUssTUFBTSxFQUFHLGFBQWEsRUFBSyxLQUFLLEtBQUssWUFBYSxjQUFjLEVBQUcsTUFBTSxDQUFDLENBQ3hGLE9BQVMsRUFBTyxDQUNkLFFBQVEsTUFBTSxnQ0FBZ0MsRUFBSyxLQUFLLEtBQUssWUFBYSxjQUFjLElBQUssQ0FBSyxFQUNsRyxNQUNGLENBQ0YsQ0FDRixFQUVBLFNBQWdCLEdBQXVCLEVBQW1ELENBQ3hGLElBQU0sRUFBUSxFQUFRLElBQUksYUFDMUIsR0FBSSxDQUFDLEdBQU8sV0FBQSxPQUFzQixFQUFHLE9BRXJDLElBQU0sRUFBVSxFQUFNLE1BQU0sQ0FBa0IsQ0FBQyxDQUFDLFFBQVEsVUFBVyxFQUFFLEVBRXJFLE9BRHVCLEVBQVEsV0FBVyxJQUFJLEVBQUksRUFBUSxNQUFNLENBQUMsRUFBSSxJQUM1QyxJQUFBLEVBQzNCLENBRUEsU0FBZ0IsR0FDZCxFQUNvQixDQUNwQixJQUFNLEVBQVMsR0FBdUIsQ0FBTyxFQUM3QyxHQUFJLENBQUMsRUFBUSxPQUViLEdBQUksRUFBSyxXQUFXLENBQU0sRUFBRyxPQUFPLEVBRXBDLElBQU0sRUFBYyxFQUFRLGFBQWUsRUFBUSxRQUNuRCxPQUFPLEVBQWMsRUFBSyxRQUFRLEVBQWEsQ0FBTSxFQUFJLElBQUEsRUFDM0QsQ0FRQSxTQUFnQixFQUFnQixFQUF3QixFQUFVLEdBQU0sRUFBdUMsQ0FDN0csT0FBWSxRQUFRLElBQUksRUFDbkIsRUFBRyxXQUFXLEVBQUssS0FBSyxFQUFTLGNBQWMsQ0FBQyxFQUVyRCxPQUFPLElBQUksR0FBUSxFQUFTLEVBQU0sQ0FBTyxDQUMzQyxDQUVBLFNBQWdCLEdBQXFCLEVBQWtCLEVBQXVCLENBQzVFLE9BQU8sRUFBUSxJQUFJLFNBQVcsR0FBUSxFQUFRLElBQUksV0FBYSxDQUNqRSxDQUVBLGVBQXNCLEVBQ3BCLEVBQ0EsRUFBVSxHQUNWLEVBQ29DLENBQ3BDLElBQU0sRUFBc0IsR0FBd0IsRUFBTSxFQUFTLENBQU8sRUFDckUsS0FFTCxNQUFPLENBQ0wsR0FBRyxFQUNILFlBQ0UsRUFBb0IsT0FBUyxFQUFvQixLQUM3QyxNQUFNLEdBQXlCLEVBQU0sRUFBb0IsS0FBTSxDQUFPLEVBQ3RFLENBQUMsRUFBb0IsSUFBSSxDQUNqQyxDQUNGLENBRUEsU0FBZ0IsR0FDZCxFQUNBLEVBQVUsR0FDVixFQUNnRCxDQUVoRCxHQURBLElBQVksUUFBUSxJQUFJLEVBQ3BCLENBQUMsRUFBRyxXQUFXLEVBQUssS0FBSyxFQUFTLGNBQWMsQ0FBQyxFQUFHLE9BRXhELElBQU0sRUFBYyxJQUFJLEdBQVEsRUFBUyxFQUFNLENBQU8sRUFDbEQsRUFBYyxFQUNsQixHQUFJLENBQUMsRUFBWSxZQUFZLFlBQWMsRUFBSyxRQUFRLENBQU8sQ0FBQyxDQUFDLFNBQVMsV0FBVyxFQUFHLENBQ3RGLElBQU0sRUFBYyxFQUFLLFFBQVEsRUFBUyxLQUFNLElBQUksRUFDaEQsRUFBRyxXQUFXLEVBQUssS0FBSyxFQUFhLGNBQWMsQ0FBQyxJQUN0RCxFQUFjLElBQUksR0FBUSxFQUFhLEVBQU0sQ0FBTyxFQUV4RCxDQUNBLE1BQU8sQ0FBRSxLQUFNLEVBQWEsS0FBTSxDQUFZLENBQ2hELENBRUEsU0FBUyxHQUFnQixFQUFrQixFQUEwQixDQUNuRSxHQUFJLENBQ0YsT0FBTyxFQUFRLEtBQUssRUFBRyxhQUFhLEVBQVUsTUFBTSxDQUFDLENBQ3ZELE1BQVEsQ0FDTixNQUFPLEVBQ1QsQ0FDRixDQUVBLGVBQWUsR0FDYixFQUNBLEVBQ0EsRUFDb0IsQ0FDcEIsSUFBTSxFQUFXLENBQUMsQ0FBVyxFQUV2QixFQUFZLEVBQVksWUFBWSxXQUMxQyxHQUFJLENBQUMsTUFBTSxRQUFRLENBQVMsRUFBRyxPQUFPLEVBRXRDLElBQU0sRUFBd0IsQ0FBQSxFQUN4QixFQUF3QixDQUFBLEVBQzlCLElBQUssSUFBTSxLQUFpQixFQUFVLElBQUssR0FBZSxFQUFLLEtBQUssRUFBWSxRQUFTLENBQUUsQ0FBQyxFQUN0RixFQUFHLFdBQVcsQ0FBYSxFQUM3QixFQUFZLEtBQUssQ0FBYSxFQUU5QixFQUFZLEtBQUssQ0FBYSxFQUdsQyxFQUFZLEtBQUssR0FBSSxNQUFNLEVBQU8sRUFBYSxDQUFFLElBQUssR0FBTSxnQkFBaUIsRUFBSyxDQUFDLENBQUUsRUFDckYsSUFBSyxJQUFNLEtBQXFCLEVBQ3pCLEVBQUcsV0FBVyxFQUFLLEtBQUssRUFBbUIsY0FBYyxDQUFDLEdBRS9ELEVBQVMsS0FBSyxJQUFJLEdBQVEsRUFBbUIsRUFBTSxDQUFPLENBQUMsRUFFN0QsT0FBTyxDQUNULENDdFpBLE1BQWEsR0FBb0YsQ0FDL0YsUUFBUyxnQkFDVCxTQUFVLHFDQUNWLFFBQUEsQ0FWQSxRQUFTLENBQ1AsWUFBYSw0Q0FDYixLQUFNLFNBQ04sTUFBTyxHQUNULENBTUEsRUFDQSxNQUFNLFFBQVEsRUFBTSxDQUNsQixNQUFNLEdBQWMsQ0FBSSxDQUMxQixDQUNGLEVBRUEsZUFBc0IsR0FFcEIsRUFDQSxFQUM4QixDQUM5QixJQUFNLEVBQVUsRUFBZ0IsRUFBTSxHQUFNLENBQXFCLEVBQ2pFLEdBQUksQ0FBQyxFQUVILE9BREEsUUFBUSxNQUFNLEVBQU0sSUFBSSxtQkFBbUIsQ0FBQyxFQUNyQyxHQUdULElBQU0sRUFDSixFQUFLLFVBQVksRUFBUSxZQUFZLFNBQVMsTUFBUSxHQUFHLEVBQVEseUJBQXlCLFFBQVUsSUFBQSxJQUN0RyxHQUFJLENBQUMsRUFFSCxPQURBLFFBQVEsS0FBSyxFQUFNLE1BQU0sb0RBQW9ELENBQUMsRUFDdkUsR0FJVCxHQUZBLEVBQU8sQ0FBRSxHQUFHLEVBQU0sUUFBUyxDQUFhLEVBRXBDLENBQUMsRUFBRyxXQUFXLEVBQUssS0FBSyxFQUFRLFlBQWEsTUFBTSxDQUFDLEVBRXZELE9BREEsR0FBTSxFQUFTLENBQUksRUFDWixHQUdULEdBQU0sQ0FBQyxFQUFTLEVBQWUsR0FBZSxNQUFNLEdBQWEsRUFBUyxDQUFJLEVBQzlFLEdBQUksRUFFRixPQURBLFFBQVEsS0FBSyxFQUFNLE1BQU0sZ0JBQWdCLEVBQUssUUFBUSxLQUFLLENBQUMsRUFDckQsR0FHSixNQUFNLEVBQVMsQ0FBSSxFQUt4QixPQUhLLEVBQUssUUFDUixNQUFNLEVBQUcsU0FBUyxVQUFVLEVBQWUsRUFBYSxNQUFNLEVBRXpELEVBQ1QsQ0FFQSxTQUFTLEdBQU0sRUFBa0IsRUFBaUYsQ0FFaEgsR0FEQSxRQUFRLEtBQUssRUFBTSxNQUFNLFFBQVEsRUFBSyxRQUFRLEVBQUUsQ0FBQyxFQUM3QyxDQUFDLEVBQUssT0FBUSxDQUNoQixJQUFNLEVBQU1HLEVBQWMsVUFBVSxFQUFLLFNBQVcsR0FBSSxDQUN0RCxJQUFLLEVBQVEsUUFDYixJQUFLLEVBQVEsSUFDYixNQUFPLEdBQ1AsTUFBTyxTQUNULENBQUMsRUFDRCxHQUFJLEVBQUksU0FBVyxFQUVqQixNQURBLFNBQVEsU0FBVyxFQUFJLFFBQVUsRUFDMUIsRUFFWCxDQUNBLE1BQU8sRUFDVCxDQUVBLE1BQU0sR0FBc0IsSUFBSSxJQUFJLENBQUMsS0FBTSxVQUFXLFFBQVEsQ0FBQyxFQUUvRCxlQUFzQixHQUNwQixFQUNBLEVBQ29DLENBQ3BDLElBQU0sRUFBcUIsRUFBSyxRQUFRLEVBQVEsUUFBUyxlQUFnQixTQUFVLE9BQU8sRUFDcEYsRUFBZ0IsRUFBSyxRQUFRLEVBQW9CLFlBQVksRUFDbkUsTUFBTSxFQUFHLFNBQVMsTUFBTSxFQUFvQixDQUFFLFVBQVcsRUFBSyxDQUFDLEVBRS9ELElBQU0sRUFBTyxFQUFXLFFBQVEsRUFFMUIsRUFBYUEsRUFBYyxTQUFTLHFCQUFzQixDQUFFLElBQUssRUFBUSxPQUFRLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLEtBQUssRUFDMUcsRUFBSyxPQUFPLENBQVUsRUFFdEIsSUFBTSxFQUFrQixLQUFLLFVBQzNCLE9BQU8sUUFBUSxFQUFRLEdBQUcsQ0FBQyxDQUN4QixRQUFRLENBQUMsS0FBUyxDQUFDLEdBQW9CLElBQUksQ0FBRyxDQUFDLENBQUMsQ0FDaEQsVUFBVSxDQUFDLEdBQU8sQ0FBQyxLQUFVLEVBQUssY0FBYyxDQUFJLENBQUMsQ0FDMUQsRUFDQSxFQUFLLE9BQU8sQ0FBZSxFQUUzQixNQUFNLEdBQXlCLEVBQVMsRUFBTSxDQUFJLEVBQ2xELElBQU0sRUFBYyxFQUFLLE9BQU8sS0FBSyxFQUdyQyxNQUFPLENBQUMsTUFEd0IsT0FBd0IsRUFBRyxTQUFTLFNBQVMsRUFBZSxNQUFNLENBQUMsSUFDckUsRUFBYSxFQUFlLENBQVcsQ0FDdkUsQ0FFQSxNQUFNLEdBQWtCLENBQUMsT0FBUSxTQUFTLEVBQ3BDLEdBQWdCLENBQ3BCLE1BQ0EsT0FDQSxPQUNBLE9BQ0EsTUFDQSxPQUNBLE9BQ0EsT0FDQSxRQUNBLGtCQUVBLGVBQ0EsV0FDRixFQUNNLEdBQWtCLENBQUMsUUFBUyxTQUFVLGFBQWMsaUJBQWtCLGdCQUFnQixFQUU1RixlQUFlLEdBQ2IsRUFDQSxFQUNBLEVBQ2UsQ0FDZixPQUFPLElBQUksUUFBUyxHQUFZLENBZ0I5QixJQUFNLEVBZk1BLEVBQWMsVUFBVSxNQUFPLENBQUMsU0FBVSxhQUFhLEVBQUcsQ0FDcEUsSUFBSyxFQUFRLFFBQ2IsSUFBSyxFQUFRLElBQ2IsTUFBTyxPQUNQLFNBQVUsTUFDWixDQUNnQixDQUFDLENBQUMsT0FDZixLQUFLLENBQUMsQ0FDTixNQUFNO0NBQUksQ0FBQyxDQUNYLE9BQVEsR0FBUyxFQUFLLE9BQVMsQ0FDWixDQUFDLENBQ3BCLElBQUssR0FBUyxFQUFLLE1BQU0sQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FDbkMsSUFBSyxHQUNKLEVBQVEsSUFBSSxTQUFXLE9BQVMsRUFBUyxRQUFRLHdDQUF5QyxFQUFFLEVBQUksQ0FFbEUsQ0FBQyxDQUFDLE9BQ2pDLElBQ0UsR0FBZ0IsS0FBTSxHQUFZLEVBQVMsU0FBUyxDQUFPLENBQUMsR0FDM0QsR0FBYyxLQUFNLEdBQVcsRUFBUyxTQUFTLENBQU0sQ0FBQyxJQUMxRCxDQUFDLEdBQWdCLEtBQU0sR0FBWSxFQUFTLFNBQVMsQ0FBTyxDQUFDLENBQ2pFLEVBQ0ksRUFBSyxTQUNQLFFBQVEsS0FBSyxrQkFBa0IsRUFBa0IsS0FBSyxJQUFJLEdBQUcsRUFJL0QsSUFBTSxFQUFPQSxFQUFjLE1BQU0sTUFBTyxDQUFDLE9BQVEsS0FBTSxHQUFHLENBQWlCLEVBQUcsQ0FBRSxJQUFLLEVBQVEsV0FBWSxDQUFDLEVBQzFHLEVBQUssT0FBTyxHQUFHLE9BQVMsR0FBcUIsQ0FDM0MsRUFBSyxPQUFPLENBQUksRUFDWixFQUFLLFVBQ1AsUUFBUSxLQUFLLFFBQVMsQ0FBSSxFQUMxQixRQUFRLEtBQUssUUFBUyxFQUFLLEtBQUssQ0FBQyxDQUFDLE9BQU8sS0FBSyxDQUFDLEVBRW5ELENBQUMsRUFDRCxFQUFLLEdBQUcsWUFBZSxDQUNyQixFQUFRLENBQ1YsQ0FBQyxDQUNILENBQUMsQ0FDSCxDQy9LQSxNQUFhLEdBQWMsSUFBSSxFQ29CekIsR0FBMEIsQ0FDOUIsYUFBYyxFQUNoQixFQU9BLGVBQXNCLEVBQ3BCLEVBQ0EsRUFDQSxFQUNBLEVBQWdCLEdBQ0MsQ0FDakIsSUFBTSxFQUFtQixHQUFnQixFQUFRLENBQU8sRUFPeEQsR0FOTSxFQUFLLFFBQVUsRUFBSyxpQkFBbUIsQ0FBQyxFQUFLLFFBQ2pELEVBQVcsRUFBaUIsVUFBVyxFQUFTLEVBQUssT0FBUyxVQUFZLE9BQU8sRUFFL0UsRUFBSyxTQUNQLEVBQVcsRUFBaUIsU0FBVSxFQUFTLGNBQWUsRUFBSSxFQUVoRSxFQUFLLE9BRVAsT0FEQSxHQUE2QixFQUFpQixVQUFXLEVBQUcsRUFBTSxDQUFFLGNBQWUsRUFBSyxNQUFPLENBQUMsRUFDekYsRUFHVCxJQUFNLEVBQTRCLEdBQ2hDLEVBQUssU0FBVyxFQUFLLHFCQUF1QixFQUFLLGlDQUUvQyxFQUFzQixHQUNwQixFQUNKLEVBQUssUUFBVSxFQUFLLHlCQUNoQixnQkFBa0IsQ0FDaEIsUUFBUSxPQUFPLE1BQU0sR0FBRyxFQUN4QixFQUFzQixFQUN4QixFQUFHLEVBQUssd0JBQXdCLEVBQ2hDLElBQUEsR0FDQSxFQUFNLE1BQU0sRUFBVyxFQUFpQixTQUFVLElBQUEsR0FBVyxDQUNqRSxJQUFLLEVBQVEsUUFDYixJQUFLLEdBQWEsRUFBUSxJQUFLLENBQUUsR0FBRyxFQUFNLGNBQWUsRUFBSyxnQkFBa0IsRUFBSyxPQUFTLEdBQU8sSUFBQSxHQUFXLENBQUMsRUFDakgsTUFBTyxHQUNQLE1BQU8sRUFBSyxPQUFTLE9BQVMsVUFDOUIsUUFBUyxFQUFLLFFBQ2QsaUJBQWtCLEVBQ2xCLFdBQVksR0FDWixlQUFnQixFQUFLLFFBQVUsQ0FBQyxFQUNoQyxlQUFnQixFQUFLLFFBQVUsQ0FBQyxFQUNoQyw0QkFBNkIsRUFBSyxPQUNsQyxRQUFTLEVBQUssT0FDaEIsQ0FBQyxDQUFDLENBQUMsWUFBYyxDQUNYLEdBQ0YsY0FBYyxDQUFhLENBRS9CLENBQUMsRUFDSyxFQUFXLEVBQUksUUFBVSxFQUkvQixHQUhJLEdBQ0YsUUFBUSxPQUFPLE1BQU07Q0FBSSxFQUV2QixJQUE4QixDQUFDLEVBQUssZ0NBQWtDLElBQWEsR0FBSSxDQUN6RixJQUFNLEdBQVUsRUFBSyxvQkFBc0IsRUFBSyxvQkFBb0IsRUFBSSxNQUFNLEVBQUksRUFBSSxPQUFBLENBQVEsS0FBSyxFQUMvRixJQUNGLFFBQVEsT0FBTyxNQUFNLENBQU0sRUFDM0IsUUFBUSxPQUFPLE1BQU07Q0FBSSxFQUU3QixDQU1BLE9BTEksRUFBSyxRQUFVLElBQWEsR0FBSyxFQUFLLHNCQUN4QyxRQUFRLEtBQUssRUFBTSxNQUFNLEVBQUssb0JBQW9CLENBQUMsRUFFckQsRUFBSyxXQUFXLEVBQUksTUFBTSxFQUMxQixHQUE2QixFQUFpQixVQUFXLEVBQVUsRUFBTSxDQUFFLGNBQWUsRUFBSyxNQUFPLENBQUMsRUFDaEcsQ0FDVCxDQUVBLFNBQWdCLEVBQ2QsRUFDQSxFQUNBLEVBQ0EsRUFBZ0IsR0FDQyxDQUNqQixPQUFPLEdBQVkseUJBQXlCLFNBQVksQ0FDdEQsSUFBTSxFQUFtQixHQUFnQixFQUFRLENBQU8sRUFFeEQsR0FEQSxFQUFXLEVBQWlCLFVBQVcsRUFBUyxtQkFBb0IsRUFBSSxFQUNwRSxFQUFLLE9BTVAsT0FMQSxFQUFXLEVBQWlCLFVBQVcsRUFBUyxlQUFlLEVBQzNELEVBQUssU0FDUCxFQUFXLEVBQWlCLFNBQVUsRUFBUyxnQkFBaUIsRUFBSSxFQUV0RSxHQUE2QixFQUFpQixVQUFXLEVBQUcsQ0FBSSxFQUN6RCxFQUdULElBQU0sRUFBTSxNQUFNLEVBQVcsRUFBaUIsU0FBVSxJQUFBLEdBQVcsQ0FDakUsSUFBSyxFQUFRLFFBQ2IsSUFBSyxHQUFhLEVBQVEsSUFBSyxDQUFFLEdBQUcsRUFBTSxjQUFlLEVBQUssZUFBaUIsRUFBSyxDQUFDLEVBQ3JGLE1BQU8sR0FDUCxNQUFPLE9BQ1AsUUFBUyxFQUFLLFFBQ2QsaUJBQWtCLEdBQ2xCLFdBQVksR0FDWixlQUFnQixFQUFLLGVBQ3JCLGVBQWdCLEVBQUssZUFDckIsUUFBUyxFQUFLLE9BQ2hCLENBQUMsRUFDRCxFQUFLLFdBQVcsRUFBSSxNQUFNLEVBQzFCLEVBQVcsRUFBaUIsVUFBVyxFQUFTLGVBQWUsRUFDM0QsRUFBSyxTQUNQLEVBQVcsRUFBaUIsU0FBVSxFQUFTLGdCQUFpQixFQUFJLEVBRXRFLElBQU0sRUFBTSxFQUFJLE9BQU8sS0FBSyxFQU01QixPQUxJLEdBQU8sQ0FBQyxFQUFLLGlCQUNmLFFBQVEsT0FBTyxNQUFNLENBQUcsRUFDeEIsUUFBUSxPQUFPLE1BQU07Q0FBSSxHQUUzQixHQUE2QixFQUFpQixVQUFXLEVBQUksT0FBUSxDQUFJLEVBQ2xFLEVBQUksUUFBVSxDQUN2QixDQUFDLENBQ0gsQ0FFQSxTQUFnQixHQUNkLEVBQ0EsRUFDQSxFQUNBLEVBQWdCLEdBQ1ksQ0FDNUIsT0FBTyxHQUFZLHlCQUF5QixTQUFZLENBQ3RELElBQU0sRUFBbUIsR0FBZ0IsRUFBUSxDQUFPLEVBQ3hELEdBQUksRUFBSyxPQUNQLE1BQU8sQ0FDTCxTQUFVLEVBQ1YsT0FBUSxFQUNWLEVBR0YsSUFBTSxFQUFNLE1BQU0sRUFBVyxFQUFpQixTQUFVLElBQUEsR0FBVyxDQUNqRSxJQUFLLEVBQVEsUUFDYixJQUFLLEdBQWEsRUFBUSxJQUFLLENBQUUsR0FBRyxFQUFNLGNBQWUsRUFBSyxlQUFpQixFQUFLLENBQUMsRUFDckYsTUFBTyxHQUNQLE1BQU8sT0FDUCxRQUFTLEVBQUssUUFDZCxpQkFBa0IsR0FDbEIsV0FBWSxHQUNaLGVBQWdCLEVBQUssZUFDckIsZUFBZ0IsRUFBSyxlQUNyQixRQUFTLEVBQUssT0FDaEIsQ0FBQyxFQUVELE9BREEsRUFBSyxXQUFXLEVBQUksTUFBTSxFQUNuQixDQUNMLFNBQVUsRUFBSSxRQUFVLEVBQ3hCLE9BQVEsRUFBSSxNQUNkLENBQ0YsQ0FBQyxDQUNILENBS0EsU0FBZ0IsR0FBZ0IsRUFBZ0IsRUFBMkQsQ0FHekcsSUFBTSxFQUErQixFQUFRLHNCQUF3QixVQUFZLE9BQzdFLEVBQVksRUFDYixXQUFXO0VBQU0sRUFBRSxDQUFDLENBQ3BCLFdBQVcsU0FBVSxHQUFHLENBQUMsQ0FDekIsV0FDQyw2Q0FDQSxFQUFRLFlBQVksY0FBYyxNQUFRLGtCQUFvQiw0QkFDaEUsQ0FBQyxDQUNBLFdBQVcsVUFBVyxFQUFRLFlBQVksY0FBYyxNQUFRLHFCQUF1QixjQUFjLENBQUMsQ0FDdEcsV0FBVyxXQUFZLEVBQVEsc0JBQXdCLEdBQUcsRUFBNkIsR0FBSyxXQUFXLENBQUMsQ0FDeEcsV0FBVyxPQUFRLEVBQVEsc0JBQXdCLEdBQUcsRUFBNkIsR0FBSyxPQUFPLENBQUMsQ0FFaEcsV0FBVyxZQUFhLEVBQVEsc0JBQXdCLEdBQUcsRUFBNkIsR0FBSyxXQUFXLEVBQ3ZHLEVBQVEsd0JBQ1YsRUFBWSxFQUNULFdBQVcsb0JBQXFCLFNBQVMsQ0FBQyxDQUMxQyxXQUFXLGtCQUFtQixTQUFTLENBQUMsQ0FFeEMsV0FBVyxnQkFBaUIsY0FBYyxHQUUvQyxFQUFZLEVBQVUsS0FBSyxFQUMzQixJQUFNLEVBQWtCLEVBQVUsV0FBVyxRQUFTLEdBQUcsRUFBNkIsRUFBRSxFQUNsRixFQUFpQixFQUVwQixXQUFXLG1CQUFvQixHQUFHLEVBQTZCLGFBQWEsQ0FBQyxDQUM3RSxXQUFXLFFBQVMsQ0FBQyxFQUFRLHVCQUF5QixFQUFRLFVBQVksR0FBSyxHQUFHLEVBQTZCLEVBQUUsRUFDcEgsTUFBTyxDQUNMLFVBQVcsR0FBRyxFQUE2QixhQUFhLElBQ3hELFNBQVUsQ0FDWixDQUNGLENBRUEsU0FBZ0IsRUFBVyxFQUEwQixFQUFrQixFQUFTLFFBQVMsRUFBTyxHQUFhLENBQzNHLFFBQVEsS0FDTjtHQUNHLEVBQU8sRUFBTSxLQUFPLEVBQU0sS0FBQSxDQUFNLEVBQU0sS0FBSyxHQUFHLEVBQU8sRUFBRSxFQUFHLENBQWdCLEVBQzNFLEVBQU0sS0FBSyxPQUFPLEVBQVEsU0FBUyxDQUN2QyxDQUNGLENBRUEsU0FBZ0IsR0FDZCxFQUNBLEVBQ0EsRUFDQSxFQUE0QyxDQUFDLEVBQ3ZDLENBQ04sR0FBSSxJQUFhLEVBQUcsQ0FDbEIsR0FBSSxFQUFhLGNBQWUsT0FDaEMsUUFBUSxLQUFLLEVBQU0sTUFBTSxFQUFNLEtBQUssV0FBVyxFQUFHLENBQU0sQ0FBQyxDQUMzRCxNQUNFLFFBQVEsS0FBSyxFQUFNLElBQUksRUFBTSxLQUFLLHFCQUFxQixFQUFTLElBQUksRUFBRyxDQUFNLENBQUMsRUFDMUUsRUFBSyxlQUFpQixJQUN4QixRQUFRLEtBQUssR0FBWSxDQUFDLENBR2hDLENBRUEsU0FBZ0IsR0FDZCxFQUNBLEVBQ29DLENBQ3BDLElBQU0sRUFBUyxDQUFFLEdBQUcsQ0FBSSxFQUt4QixPQUpJLEVBQUssS0FDUCxFQUFPLEdBQUssS0FFZCxHQUFrQixFQUFRLEVBQUssYUFBYSxFQUNyQyxDQUNULENBUUEsU0FBZ0IsR0FBa0IsRUFBeUMsRUFBK0IsQ0FDcEcsRUFBSSxXQUFhLElBQUEsSUFBYSxJQUFrQixHQUVsRCxPQUFPLEVBQUksWUFDRixHQUFpQixRQUFRLE9BQU8sUUFDekMsRUFBSSxjQUFnQixJQUV4QixDQ3JRQSxNQUFhLEdBQXVCLENBQ2xDLEdBQUcsRUFFSCxjQUFlLENBQ2IsWUFBYSxzQkFDYixLQUFNLFNBQ04sTUFBTyxHQUNULEVBQ0EsVUFBVyxDQUNULFlBQWEsMkNBQ2IsS0FBTSxVQUNOLE1BQU8sQ0FBQyxNQUFPLEdBQUcsQ0FDcEIsQ0FDRixFQUVBLFNBQWdCLEdBQXlCLEVBQWtDLENBQ3pFLElBQU0sRUFBaUIsQ0FBQyxFQUN4QixJQUFLLElBQU0sS0FBYyxPQUFPLEtBQUssQ0FBeUIsRUFBRyxDQUMvRCxJQUFNLEVBQVEsR0FBZSxFQUFNLENBQVUsRUFDekMsT0FBVSxJQUFBLEdBRWQsSUFBSSxPQUFPLEdBQVUsVUFBVyxDQUM5QixFQUFLLEtBQUssRUFBUSxLQUFLLElBQWUsS0FBSyxFQUFXLE9BQU8sRUFDN0QsUUFDRixDQUNBLEdBQUksT0FBTyxHQUFVLFVBQVksT0FBTyxHQUFVLFNBQVUsQ0FDMUQsRUFBSyxLQUFLLEtBQUssRUFBVyxHQUFHLEdBQU8sRUFDcEMsUUFDRixDQUNBLEdBQUksTUFBTSxRQUFRLENBQUssRUFDckIsSUFBSyxJQUFNLEtBQVEsRUFDakIsRUFBSyxLQUFLLEtBQUssRUFBVyxHQUFHLEdBQU0sQ0FQdkMsQ0FVRixDQU9BLE9BTEcsRUFBaUQsU0FBVyxJQUM3RCxHQUFlLEVBQU0sV0FBVyxJQUFNLElBQUEsSUFFdEMsRUFBSyxLQUFLLGFBQWEsRUFFbEIsQ0FDVCxDQUVBLFNBQVMsR0FBZSxFQUF3QixFQUE2QixDQUMzRSxJQUFNLEVBQXNCLEVBQVcsV0FBVyxhQUFjLEVBQUcsSUFBc0IsRUFBVSxZQUFZLENBQUMsRUFDMUcsRUFBVSxFQUNoQixPQUFPLEVBQVEsSUFBZSxFQUFRLEVBQ3hDLENDeENBLE1BRU1DLEdBQVUsQ0FDZCxjQUFlLENBQ2IsWUFBYSw2Q0FDYixLQUFNLFNBQ1IsRUFDQSxzQkFBdUIsQ0FDckIsWUFBYSw2Q0FDYixLQUFNLFNBQ1IsRUFDQSxRQUFTLENBQ1AsWUFBYSx3Q0FDYixLQUFNLFNBQ04sUUFBUyxDQUFDLE1BQU8sT0FBTyxFQUN4QixRQUFTLEtBQ1gsQ0FDRixFQUVNQyxHQUFtQixDQUN2QixTQUFVLENBQ1IsWUFBYSwrQkFDYixLQUFNLE9BQ1IsQ0FDRixFQVdhLEdBR1QsQ0FDRixRQUFTLDZCQUNULFNBQVUsNEJBQ1YsUUFBUyxDQUFFLEdBQUcsR0FBc0IsR0FBR0QsR0FBUyxHQUFHQyxFQUFpQixFQUNwRSxNQUFNLFFBQVEsRUFBTSxDQUNkLFFBQVEsV0FBYSxVQUN2QixRQUFRLE1BQU0sRUFBTSxJQUFJLDJDQUEyQyxDQUFDLEVBQ3BFLFFBQVEsS0FBSyxDQUFDLEdBR2hCLElBQU0sRUFBVSxFQUFnQixDQUFJLEVBQy9CLElBQ0gsUUFBUSxNQUFNLEVBQU0sSUFBSSxtQkFBbUIsQ0FBQyxFQUM1QyxRQUFRLEtBQUssQ0FBQyxHQUdoQixJQUFNLEdBQVksRUFBSyxVQUFZLENBQUMsRUFBQSxDQUFHLElBQUksTUFBTSxDQUFDLENBQUMsT0FBTyxPQUFPLEVBQzdELEVBQVMsU0FBVyxJQUN0QixRQUFRLE1BQU0sRUFBTSxJQUFJLHVCQUF1QixDQUFDLEVBQ2hELFFBQVEsS0FBSyxDQUFDLEdBR2hCLEdBQUksQ0FDRixJQUFNLEVBQVcsTUFBTSxHQUFnQixDQUNyQyxXQUNBLFVBQ0EsV0FBWSxFQUFLLFlBQWMsR0FDL0IsaUJBQWtCLEVBQUssa0JBQW9CLEdBQzNDLFFBQVMsRUFBSyxRQUNkLEdBQUksT0FBTyxFQUFLLElBQU8sVUFBWSxFQUFLLEdBQUssSUFBQSxFQUMvQyxDQUFDLEVBQ0QsUUFBUSxLQUFLLENBQVEsQ0FDdkIsT0FBUyxFQUFPLENBQ2QsUUFBUSxNQUFNLEVBQU0sSUFBSSxhQUFpQixNQUFRLEVBQU0sUUFBVSxPQUFPLENBQUssQ0FBQyxDQUFDLEVBQy9FLFFBQVEsS0FBSyxDQUFDLENBQ2hCLENBQ0YsQ0FDRixFQUVBLGVBQXNCLEdBQWdCLEVBQWtELENBQ3RGLElBQU0sRUFBVyxFQUFRLFNBQVMsSUFBSyxHQUNyQ0MsRUFBYyxNQUFNLEdBQWdCLEVBQVMsRUFBUSxPQUFPLENBQUMsQ0FBQyxTQUFVLENBQ3RFLElBQUssRUFBUSxRQUFRLFFBQ3JCLFNBQVUsR0FDVixJQUFLLEdBQWEsRUFBUSxRQUFRLElBQUssQ0FBRSxHQUFJLEVBQVEsRUFBRyxDQUFDLEVBQ3pELE1BQU8sR0FDUCxNQUFPLFNBQ1QsQ0FBQyxDQUNILEVBRUksRUFBVyxHQUNYLEVBQ0EsRUFDQSxFQUNFLEVBQXFDLENBQUMsRUFDdEMsRUFBVSxNQUFNLEtBQXlCLENBQUUsT0FBUSxFQUFTLE1BQU8sQ0FBQyxFQUNwRSxFQUFzQixFQUFTLEtBQUssRUFBTyxJQUN4QyxJQUFJLFFBQWUsR0FBWSxDQUNwQyxJQUFJLEVBQVUsR0FDUixFQUFVLEdBQTJCLENBQ3JDLElBRUosRUFBVSxHQUNWLEVBQVEsR0FBUyxFQUNqQixJQUFnQixFQUVaLENBQUMsR0FBWSxHQUFpQixFQUFVLENBQU8sSUFDakQsRUFBYSxFQUNiLEVBQVcsR0FDWCxFQUFrQixLQUFLLEdBQWtCLEVBQVUsU0FBUyxDQUFDLEdBRS9ELEVBQVEsRUFDVixFQUVBLEVBQU0sS0FBSyxRQUFVLEdBQVUsQ0FDN0IsUUFBUSxNQUFNLGlDQUFrQyxDQUFLLEVBQ3JELEVBQU8sQ0FBQyxDQUNWLENBQUMsRUFDRCxFQUFNLEtBQUssUUFBUyxFQUFNLElBQVcsQ0FDbkMsRUFBTyxHQUFZLEdBQVEsSUFBQSxHQUFXLEdBQVUsSUFBQSxFQUFTLENBQUMsQ0FDNUQsQ0FBQyxDQUNILENBQUMsQ0FDRixFQUVLLEVBQVcsR0FBaUMsQ0FDaEQsSUFBc0IsRUFDbEIsS0FFSixFQUFXLEdBQ1gsRUFBa0IsS0FBSyxHQUFrQixFQUFVLENBQU0sQ0FBQyxFQUM1RCxFQUNNLE1BQTJCLENBQy9CLEVBQVEsUUFBUSxDQUNsQixFQUNNLE1BQTRCLENBQ2hDLEVBQVEsU0FBUyxDQUNuQixFQUNNLE1BQTRCLENBQ2hDLEVBQVEsU0FBUyxDQUNuQixFQUNBLFFBQVEsR0FBRyxTQUFVLENBQVksRUFDakMsUUFBUSxHQUFHLFVBQVcsQ0FBYSxFQUNuQyxRQUFRLEdBQUcsVUFBVyxDQUFhLEVBQ25DLEdBQUksQ0FDRixNQUFNLFFBQVEsSUFBSSxDQUFtQixFQUNyQyxNQUFNLFFBQVEsSUFBSSxDQUFpQixDQUNyQyxRQUFVLENBQ1IsUUFBUSxlQUFlLFNBQVUsQ0FBWSxFQUM3QyxRQUFRLGVBQWUsVUFBVyxDQUFhLEVBQy9DLFFBQVEsZUFBZSxVQUFXLENBQWEsQ0FDakQsQ0FFQSxHQUFJLEVBQ0YsT0FBTyxHQUFZLElBQUEsR0FBVyxDQUFpQixFQUdqRCxHQUFJLEVBQVEsVUFBWSxRQUN0QixPQUFPLEdBQWUsRUFFeEIsR0FBSSxJQUFlLElBQUEsR0FDakIsT0FBTyxFQUVULElBQUssSUFBTSxLQUFVLEVBQ25CLEdBQUksSUFBVyxJQUFBLElBQWEsSUFBVyxFQUNyQyxPQUFPLEVBR1gsTUFBTyxFQUNULENBRUEsU0FBUyxHQUFZLEVBQTBCLEVBQTRDLENBT3pGLE9BTkksSUFBUyxJQUFBLEdBR1QsR0FBVSxLQUFVLEVBQVUsUUFDekIsSUFBTSxFQUFVLFFBQVEsR0FFMUIsRUFMRSxDQU1YLENBRUEsU0FBUyxHQUNQLEVBQ0EsRUFDUyxDQUNULE9BQU8sRUFBUSxVQUFZLFNBQVcsRUFBUSxZQUFlLEVBQVEsa0JBQW9CLElBQWEsQ0FDeEcsQ0FFQSxlQUFlLEdBQWtCLEVBQXdDLEVBQXVDLENBQzlHLElBQU0sRUFBZ0IsR0FBVyxHQUFZLENBQVEsRUFBRyxDQUFNLEVBQzFELEVBQWMsU0FBVyxHQUV6QixNQUFNLEdBQWlCLENBQWEsR0FDdEMsR0FBVyxFQUFlLFNBQVMsQ0FFdkMsQ0FFQSxTQUFTLEdBQVksRUFBa0QsQ0FDckUsT0FBTyxFQUFTLFFBQVMsR0FBVyxFQUFNLE1BQVEsSUFBQSxHQUFZLENBQUMsRUFBSSxDQUFDLEVBQU0sR0FBRyxDQUFFLENBQ2pGLENBRUEsU0FBUyxHQUFXLEVBQXlCLEVBQWtDLENBQzdFLElBQU0sRUFBeUIsQ0FBQyxFQUNoQyxJQUFLLElBQU0sS0FBTyxFQUNoQixHQUFJLENBQ0YsR0FBSSxDQUFDLEdBQWlCLEVBQUssQ0FBTSxFQUFHLFNBRXBDLEVBQWEsS0FBSyxDQUFHLEVBQ3JCLEVBQVMsRUFBSyxDQUFNLENBQ3RCLE9BQVMsRUFBTyxDQUNkLFFBQVEsS0FBSyxnQ0FBaUMsQ0FBSyxDQUNyRCxDQUVGLE9BQU8sQ0FDVCxDQUVBLGVBQWUsR0FBaUIsRUFBMkMsQ0FDekUsSUFBTSxFQUFXLEtBQUssSUFBSSxFQUFJLElBQzlCLEtBQU8sS0FBSyxJQUFJLEVBQUksR0FBVSxDQUM1QixHQUFJLEVBQUssTUFBTSxFQUFrQixFQUFHLE1BQU8sR0FFM0MsTUFBTSxHQUFNLEtBQUssSUFBSSxJQUFLLEVBQVcsS0FBSyxJQUFJLENBQUMsQ0FBQyxDQUNsRCxDQUNBLE1BQU8sRUFDVCxDQUVBLFNBQVMsR0FBbUIsRUFBc0IsQ0FDaEQsR0FBSSxDQUVGLE9BREEsUUFBUSxLQUFLLENBQUMsRUFBSyxDQUFDLEVBQ2IsRUFDVCxPQUFTLEVBQU8sQ0FJZCxNQUhBLEVBQUksR0FBcUIsQ0FBSyxDQUloQyxDQUNGLENBRUEsZUFBZSxHQUFNLEVBQTJCLENBQzlDLE1BQU0sSUFBSSxRQUFTLEdBQVksV0FBVyxFQUFTLENBQUUsQ0FBQyxDQUN4RCxDQUVBLFNBQVMsR0FBaUIsRUFBYSxFQUFpQyxDQUN0RSxHQUFJLENBRUYsT0FEQSxRQUFRLEtBQUssQ0FBQyxFQUFLLENBQU0sRUFDbEIsRUFDVCxPQUFTLEVBQU8sQ0FDZCxHQUFJLEdBQXFCLENBQUssRUFDNUIsTUFBTyxHQUVULE1BQU0sQ0FDUixDQUNGLENBRUEsU0FBUyxHQUFxQixFQUF5QixDQUNyRCxPQUFPLE9BQU8sR0FBVSxZQUFZLEdBQWtCLFNBQVUsR0FBUyxFQUFNLE9BQVMsT0FDMUYsQ0N4UUEsU0FBZ0IsRUFBa0IsRUFBd0IsQ0FDeEQsT0FBTyxFQUFLLElBQUssR0FBUSxFQUFvQixDQUFHLENBQUMsQ0FBQyxDQUFDLEtBQUssR0FBRyxDQUM3RCxDQUVBLFNBQWdCLEdBQWdDLEVBQWMsRUFBdUIsQ0FDbkYsTUFBTyxHQUFHLEVBQUssR0FBRyxFQUFvQixDQUFLLEdBQzdDLENBRUEsU0FBZ0IsRUFBb0IsRUFBcUIsQ0FDdkQsTUFBTyxvQkFBb0IsS0FBSyxDQUFHLEVBQUksRUFBTSxJQUFJLEVBQUksV0FBVyxJQUFLLE9BQU8sRUFBRSxFQUNoRixDQ0ZBLE1BQU0sR0FBMEIsQ0FBQyxpQkFBa0IsZ0JBQWlCLGVBQWUsRUFNbkYsU0FBZ0IsR0FBdUIsRUFBa0IsRUFBNEIsQ0FDbkYsT0FBTyxFQUFrQixDQUFDLE9BQVEsS0FBTSxlQUFnQixHQUFHLEdBQXlCLENBQUksRUFBRyxDQUFVLENBQUMsQ0FDeEcsQ0FPQSxTQUFnQixHQUF3QixFQUFzQixDQUM1RCxNQUFPLHVDQUF1QyxJQUFPLEtBQUssQ0FDNUQsQ0FPQSxTQUFnQixHQUE4QixFQUErRCxDQUMzRyxJQUFNLEVBQWUsR0FBa0IsQ0FBTyxFQUMxQyxNQUFDLEdBQWdCLENBQUMsR0FBd0IsQ0FBTyxHQUVyRCxNQUFPLDZDQUE2QyxFQUFhLHlCQUF5QixHQUF5QixDQUFPLEVBQUUsRUFDOUgsQ0FPQSxTQUFnQixHQUEyQixFQUEyQyxFQUF3QixDQUM1RyxJQUFNLEVBQWUsR0FBa0IsQ0FBTyxFQUM5QyxHQUFJLENBQUMsRUFBYyxPQUFPLEVBUzFCLElBQU0sRUFBZ0IsbUNBREQsRUFBSyxRQUFRLEVBQVEsUUFBUyxHQUF5QixDQUFPLENBQ2YsRUFBRSw0RUFDdEUsTUFBTyxHQUFHLEdBQStCLEVBQVMsQ0FBWSxFQUFFLE1BQU0sRUFBYyxNQUFNLEdBQzVGLENBS0EsU0FBZ0IsR0FBa0IsRUFBdUQsQ0FDdkYsSUFBTSxFQUFhLEVBQXVCLENBQU8sRUFDNUMsS0FNTCxJQUFLLElBQU0sS0FBUSxFQUFHLGFBQWEsRUFBWSxNQUFNLENBQUMsQ0FBQyxNQUFNO0NBQUksRUFBRyxDQUNsRSxHQUFJLGtCQUFrQixLQUFLLENBQUksRUFBRyxTQUVsQyxJQUFNLEVBQVEsa0VBQWtFLEtBQUssQ0FBSSxFQUN6RixHQUFJLEVBQU8sT0FBTyxFQUFNLEVBQzFCLENBRUYsQ0FFQSxTQUFnQixFQUF1QixFQUF1RCxDQUV2RixLQUFRLFFBRWIsSUFBSyxJQUFNLEtBQVksR0FBeUIsQ0FDOUMsSUFBTSxFQUFXLEVBQUssS0FBSyxFQUFRLFFBQVMsQ0FBUSxFQUNwRCxHQUFJLEVBQUcsV0FBVyxDQUFRLEVBQUcsT0FBTyxDQUN0QyxDQUVGLENBTUEsU0FBZ0IsR0FBd0IsRUFBdUQsQ0FDN0YsSUFBTSxFQUFhLEVBQXVCLENBQU8sRUFDakQsR0FBSSxDQUFDLEVBQVksT0FFakIsSUFBSSxFQUFnQixhQUNwQixJQUFLLElBQU0sS0FBUSxFQUFHLGFBQWEsRUFBWSxNQUFNLENBQUMsQ0FBQyxNQUFNO0NBQUksRUFBRyxDQUNsRSxHQUFJLGtCQUFrQixLQUFLLENBQUksRUFBRyxTQUVsQyxJQUFNLEVBQVEsbUVBQW1FLEtBQUssQ0FBSSxFQUMxRixHQUFJLEVBQU8sQ0FDVCxFQUFnQixFQUFNLEdBQ3RCLEtBQ0YsQ0FDRixDQUNBLElBQU0sRUFBb0IsRUFBSyxLQUFLLEVBQVEsUUFBUyxDQUFhLEVBQ2xFLE9BQU8sRUFBRyxXQUFXLENBQWlCLEVBQUksRUFBb0IsSUFBQSxFQUNoRSxDQU9BLFNBQWdCLEdBQStCLEVBQStCLEVBQThCLENBQzFHLE1BQU8sNEJBQTRCLEVBQWEseUJBQXlCLEdBQXlCLENBQU8sRUFBRSxtQ0FDN0csQ0FTQSxTQUFnQixHQUF5QixFQUF1QyxDQUk5RSxJQUFNLEVBQVEsQ0FBQyxFQUFRLElBQUksT0FBUSxFQUFRLElBQUksUUFBUSxDQUFDLENBQUMsU0FBUyxNQUFNLEVBQ3BFLE9BQ0EsRUFBUSxJQUFJLFFBQVUsRUFBUSxJQUFJLFNBQ3RDLE1BQU8sQ0FBQyxHQUFTLElBQVUsY0FBZ0Isa0JBQW9CLG1CQUFtQixHQUNwRixDQ2pJQSxNQUFNQyxHQUE4QixpQkFDOUJDLEdBQWlDLHNCQUV2QyxJQUFNLEdBQU4sS0FBcUIsQ0FDbkIsa0JBQWtCLEVBQTBCLENBQzFDLElBQU0sRUFBUyxHQUF3QixFQUFTLG9CQUFvQixFQUVwRSxNQUFPLEdBQUcsWUFEK0IsRUFBTyxrR0FBa0csRUFBTyxPQUMxSCxXQUFXLEVBQU8sT0FBTyxFQUFPLGVBQWUsRUFBSyxRQUFRLENBQU0sRUFBRSxJQUFJLEVBQUssU0FBUyxDQUFNLEVBQUUsV0FDL0gsQ0FFQSxNQUFNLEVBQWtCLEVBQW9CLEdBQVksQ0FDdEQsSUFBTSxFQUFpQixHQUFrQixDQUFPLEVBQ2hELEdBQUksRUFJRixNQUFPLFdBQVcsR0FBeUIsQ0FBTyxFQUFFLGFBQWEsR0FBK0IsRUFBUyxDQUFjLEVBQUUsTUFBTSxLQUFLLFFBQVEsRUFBUyxDQUFpQixJQUd4SyxJQUFNLEVBQWdCQyxHQUEyQixDQUFPLEVBS3hELE9BSkssRUFJRSxHQUFHLEVBQWMsTUFBTSxLQUFLLFFBQVEsRUFBUyxDQUFpQixJQUg1RCxvRkFJWCxDQUVBLFFBQVEsRUFBa0IsRUFBb0IsR0FBWSxDQUN4RCxJQUFNLEVBQWMsS0FBSyxLQUFLLENBQU8sRUFDL0IsRUFBaUIsS0FBSyxPQUFPLEVBQVMsQ0FBaUIsRUFDN0QsT0FBTyxJQUFnQixPQUFTLEVBQWlCLEdBQUcsRUFBZSxNQUFNLEdBQzNFLENBRUEsZ0JBQWdCLEVBQWtCLEVBQW9CLEdBQVksQ0FJaEUsT0FISSxHQUFxQixFQUFTLE1BQU0sSUFBTUEsR0FBMkIsQ0FBTyxHQUFLLEdBQWtCLENBQU8sR0FDckcsS0FBSyxNQUFNLEVBQVMsQ0FBaUIsRUFFdkMsS0FBSyxRQUFRLEVBQVMsQ0FBaUIsQ0FDaEQsQ0FFQSxPQUFPLEVBQWtCLEVBQW9CLEdBQVksQ0FDdkQsT0FBTyxHQUF1QixFQUFTLFdBQVcsSUFBb0IsS0FBSyxDQUFDLENBQzlFLENBRUEsWUFBWSxFQUEwQixDQUNwQyxJQUFNLEVBQVMsR0FBd0IsRUFBUyxjQUFjLEVBQ3hELEVBQWtCLEdBQWlDLENBQU0sRUFDekQsRUFBeUJDLEdBQTBCLENBQU8sRUFHMUQsRUFBeUIsR0FBdUIsRUFBUyxVQUFXLHNCQUFzQixFQUNoRyxNQUFPLEdBQUcsRUFBZ0IsSUFBSSxLQUFLLE9BQU8sQ0FBTyxFQUFFLE1BQU0sRUFBZ0I7OEJBQy9DLEVBQXVCLE9BQU8sRUFBTyxLQUFLLEVBQU8sZ0JBQWdCLEVBQU8sT0FBTyxHQUMzRyxDQUVBLFlBQVksRUFBa0IsRUFBNkIsQ0FDekQsSUFBTSxFQUFTLEdBQXdCLEVBQVMsY0FBYyxFQUM5RCxNQUFPLGtCQUFrQkEsR0FBMEIsRUFBUyxDQUFVLEVBQUUsSUFBSSxFQUFPLEVBQ3JGLENBRUEsUUFBUSxFQUFrQixFQUFvQixFQUE2QixDQUN6RSxJQUFNLEVBQVMsR0FBd0IsRUFBUyxTQUFTLEVBQ3pELE1BQU8sR0FBRyxHQUFrQyxDQUFVLEVBQUUsdUJBQXVCQSxHQUEwQixFQUFTLENBQVUsRUFBRSxPQUFPLEVBQVcsS0FBSyxFQUFPLEVBQzlKLENBRUEsU0FBUyxFQUFrQixFQUFvQixHQUFZLENBQ3pELE9BQU8sR0FBdUIsRUFBUyxZQUFZLElBQW9CLEtBQUssQ0FBQyxDQUMvRSxDQUVBLFdBQVcsRUFBa0IsRUFBb0IsR0FBWSxDQUMzRCxPQUFPLEtBQUssU0FBUyxFQUFTLENBQWlCLENBQ2pELENBRUEsS0FBSyxFQUFrQixFQUE2QixDQUNsRCxHQUFJLEVBQVksTUFBTyxvQkFBb0IsSUFDM0MsR0FBSSxFQUFRLFlBQVksU0FBUyxLQUFNLE1BQU8sZ0JBQzlDLElBQU0sRUFBa0IsRUFBSyxLQUFLLEtBQU0sU0FBUyxFQUlqRCxPQUhJLEVBQUcsV0FBVyxFQUFLLEtBQUssRUFBUSxRQUFTLENBQWUsQ0FBQyxFQUNwRCxFQUFRLHNCQUF3QixPQUFPLElBQW9CLG9CQUFvQixJQUVqRixNQUNULENBRUEsT0FBTyxFQUFrQixFQUFzQixFQUFvQixHQUFZLENBSzdFLE9BSkksRUFDSyw2RUFHRixHQUF1QixFQUFTLFVBQVUsSUFBb0IsS0FBSyxDQUFDLENBQzdFLENBQ0YsRUFFQSxTQUFnQixHQUF1QixFQUFrQixFQUFjLEVBQXdCLEdBQVksQ0FDekcsSUFBTSxFQUFVLEdBQUcsR0FBeUIsR0FBRyxFQUFzQixHQUFHLG1CQUFtQixJQUUzRixPQUFPLEVBQUssU0FBUyxVQUFVLEVBQUksRUFBVSxHQUF5QixFQUFTLENBQU8sQ0FDeEYsQ0FFQSxTQUFnQixHQUF5QixFQUFrQixFQUF5QixDQUNsRixJQUFNLEVBQVMsR0FBa0IsQ0FBTyxFQUd4QyxPQUFPLEdBQVUsRUFBTyxVQUFZLEVBQVEsUUFDeEMsSUFBSSxFQUFrQixDQUFDLEtBQU0sRUFBTyxPQUFPLENBQUMsRUFBRSxNQUFNLEVBQVEsR0FDNUQsQ0FDTixDQUVBLFNBQWdCLEdBQWtCLEVBQXFFLENBQ3JHLElBQU0sRUFBYSxDQUFDLG9CQUFxQixxQkFBc0Isb0JBQXFCLG9CQUFvQixFQUN4RyxJQUFLLElBQU0sSUFBVyxDQUFDLEVBQVEsUUFBUyxFQUFRLFdBQVcsRUFBRyxDQUM1RCxJQUFNLEVBQVcsRUFBVyxLQUFNLEdBQWEsRUFBRyxXQUFXLEVBQUssS0FBSyxFQUFTLENBQVEsQ0FBQyxDQUFDLEVBQzFGLEdBQUksRUFBVSxNQUFPLENBQUUsVUFBUyxVQUFTLENBQzNDLENBRUYsQ0FFQSxTQUFTRCxHQUEyQixFQUFzQyxDQUN4RSxJQUFNLEVBQVMsR0FBZ0IsQ0FBTyxFQUNqQyxLQUdMLE9BQU8sR0FEYyxFQUFLLFdBQVcsQ0FBTSxFQUFJLEVBQVMsRUFBSyxRQUFRLEVBQVEsUUFBUyxDQUFNLENBQ3ZDLENBQ3ZELENBRUEsU0FBUyxHQUFrQyxFQUF3QixDQUNqRSxNQUFPLFVBQVUsRUFBTyxLQUFLLEVBQU8sU0FBUyxFQUFPLE1BQ3RELENBRUEsU0FBUyxHQUFpQyxFQUF3QixDQUNoRSxNQUFPLFdBQVcsRUFBTyxHQUMzQixDQUVBLFNBQVMsR0FBdUIsRUFBa0IsRUFBNkIsQ0FDN0UsSUFBTSxFQUFTLEdBQWdCLENBQU8sRUFDdEMsR0FBSSxDQUFDLEVBQ0gsTUFBVSxNQUFNLFNBQVMsRUFBWSx1REFBdUQsRUFFOUYsT0FBTyxDQUNULENBRUEsU0FBUyxHQUF3QixFQUFrQixFQUE2QixDQUM5RSxJQUFNLEVBQVMsR0FBdUIsRUFBUyxDQUFXLEVBQzFELE9BQU8sRUFBSyxXQUFXLENBQU0sRUFBSSxFQUFTLEVBQUssUUFBUSxFQUFRLFFBQVMsQ0FBTSxDQUNoRixDQUVBLFNBQVMsR0FBZ0IsRUFBc0MsQ0FDN0QsT0FBTyxHQUErQixDQUFPLENBQy9DLENBRUEsU0FBU0MsR0FBMEIsRUFBa0IsRUFBNkIsQ0FDaEYsR0FBSSxFQUFZLE1BQU8sWUFBWSxFQUFXLEdBRTlDLElBQU0sRUFBa0IsRUFBSyxLQUFLLEVBQVEsUUFBU0gsRUFBMkIsRUFHOUUsT0FGSSxFQUFHLFdBQVcsQ0FBZSxFQUFVLGFBQWFBLEtBQ3BELEVBQUcsV0FBV0MsRUFBOEIsRUFBVSxXQUFXQSxLQUM5RCxhQUFhRCxJQUN0QixDQUVBLE1BQWEsR0FBaUIsSUFBSSxHQzVJbEMsU0FBZ0IsR0FBNkIsRUFBbUMsRUFBdUMsQ0FJckgsR0FBSSxFQUFTLG1CQUFvQixNQUFPLEdBQ3hDLElBQU0sRUFBb0IsRUFBSyxRQUFRLEVBQVEsUUFBUyxFQUFTLGdCQUFrQixZQUFZLEVBRS9GLE9BREssRUFBRyxXQUFXLENBQWlCLEVBQzdCLEVBQUcsWUFBWSxDQUFpQixDQUFDLENBQUMsS0FBTSxHQUFhLEVBQVMsU0FBUyxNQUFNLENBQUMsRUFEdkMsRUFFaEQsQ0FFQSxNQUFNLEdBQTZCLElBQUksSUFBSSxDQUFDLFdBQVksYUFBYyxZQUFZLENBQUMsRUFDN0UsR0FBNEIsSUFBSSxJQUFJLENBQUMsZUFBZ0IsYUFBYyxZQUFZLENBQUMsRUFTdEYsU0FBZ0IsR0FBb0IsRUFBZ0IsRUFBUSxJQUFJLElBQWUsRUFBWSxHQUFpQixDQUMxRyxHQUFJLE1BQU0sUUFBUSxDQUFLLEVBQUcsQ0FDeEIsSUFBSyxJQUFNLEtBQVEsRUFBTyxHQUFvQixFQUFNLEVBQU8sQ0FBUyxFQUNwRSxPQUFPLENBQ1QsQ0FDQSxHQUFJLENBQUMsR0FBUyxPQUFPLEdBQVUsU0FBVSxPQUFPLEVBQ2hELElBQUssR0FBTSxDQUFDLEVBQUssS0FBVSxPQUFPLFFBQVEsQ0FBSyxFQUM3QyxHQUFJLElBQVEsV0FBYSxPQUFPLEdBQVUsU0FDeEMsRUFBTSxJQUFJLENBQUssT0FDVixHQUFJLElBQVEsUUFBVSxPQUFPLEdBQVUsVUFBWSxHQUEyQixJQUFJLENBQVMsRUFDaEcsRUFBTSxJQUFJLENBQUssT0FDVixHQUFJLEdBQTBCLElBQUksQ0FBRyxHQUFLLEdBQVMsT0FBTyxHQUFVLFVBQVksQ0FBQyxNQUFNLFFBQVEsQ0FBSyxFQUN6RyxJQUFLLElBQU0sS0FBZSxPQUFPLEtBQUssQ0FBSyxFQUFHLEVBQU0sSUFBSSxDQUFXLE9BQzFELElBQVEsT0FBUyxJQUFRLFFBQVUsSUFBUSxZQUFjLElBQVEsV0FJMUUsR0FBb0IsRUFBTyxFQUFPLENBQUcsRUFHekMsT0FBTyxDQUNULENBc0NBLFNBQVMsR0FBaUIsRUFBMkIsRUFBeUMsQ0FDNUYsT0FBUSxHQUFXLE1BQVEsRUFBTyxLQUFRLENBQUMsa0JBQWtCLEVBQUksQ0FBQyxDQUNwRSxDQU9BLFNBQWdCLEdBQ2QsRUFDQSxFQUNvQyxDQUNwQyxJQUFNLEVBQWEsRUFBdUIsQ0FBTyxFQUNqRCxHQUFJLENBQUMsRUFBWSxPQUNqQixHQUFJLEVBQUssUUFBUSxDQUFVLElBQU0sUUFDL0IsTUFBVSxNQUFNLDRGQUE0RixFQUs5RyxJQUFNLEVBQTRCLENBQUMsRUFDN0IsRUFBU0ksRUFBTSxFQUFHLGFBQWEsRUFBWSxNQUFNLEVBQUcsRUFBYSxDQUNyRSxtQkFBb0IsRUFDdEIsQ0FBQyxFQUNELEdBQUksRUFBWSxPQUFTLEVBQ3ZCLE1BQVUsTUFBTSxtQkFBbUIsRUFBVyxJQUFJLEVBQVksT0FBTyx3QkFBd0IsRUFFL0YsR0FBSSxDQUFDLEVBQVEsT0FFYixJQUFNLEVBQVksRUFBTyxNQUFNLEdBQy9CLEdBQUksQ0FBQyxHQUFhLElBQVksYUFDNUIsTUFBVSxNQUFNLHdDQUF3QyxFQUFRLGtCQUFrQixFQUVwRixPQUFPLEVBQ0gsQ0FDRSxXQUFZLEVBQVUsT0FBUyxFQUFPLEtBQU8sR0FBRyxFQUFPLEtBQUssR0FBRyxJQUFZLElBQUEsSUFDM0UsVUFBVyxFQUFVLFlBQWMsRUFBTyxXQUMxQyxRQUFTLE9BQU8sS0FBSyxFQUFVLE1BQVEsQ0FBQyxDQUFDLEVBQ3pDLEtBQU0sRUFBVSxNQUFRLENBQUMsRUFLekIsYUFBYyxDQUNaLEdBQUcsR0FDRCxDQUNFLE9BQVEsRUFBVSxRQUFVLEVBQU8sT0FDbkMsUUFBUyxFQUFVLFNBQVcsRUFBTyxRQUNyQyxhQUFjLEVBQVUsY0FBZ0IsRUFBTyxhQUMvQyxXQUFZLEVBQVUsWUFBYyxFQUFPLFdBQzNDLFdBQVksRUFBVSxZQUFjLEVBQU8sVUFDN0MsRUFDQSxHQUFvQixDQUFTLENBQy9CLEVBQ0EsR0FBRyxHQUFpQixFQUFRLENBQVMsQ0FDdkMsRUFDQSxZQUFhLEVBQVUsY0FBZ0IsQ0FBQyxFQUd4QyxvQkFBcUIsRUFBVSxTQUFTLFVBQVksQ0FBQyxFQUNyRCxlQUFnQixFQUNsQixFQUNBLENBQ0UsV0FBWSxFQUFPLEtBQ25CLFVBQVcsRUFBTyxXQUNsQixRQUFTLE9BQU8sS0FBSyxFQUFPLE1BQVEsQ0FBQyxDQUFDLEVBQ3RDLEtBQU0sRUFBTyxNQUFRLENBQUMsRUFDdEIsYUFBYyxDQUFDLEdBQUcsR0FBb0IsQ0FBTSxFQUFHLEdBQUcsR0FBaUIsQ0FBTSxDQUFDLEVBQzFFLFlBQWEsRUFBTyxjQUFnQixDQUFDLEVBQ3JDLG9CQUFxQixFQUFPLFNBQVMsVUFBWSxDQUFDLEVBQ2xELGVBQWdCLEVBQ2xCLENBQ04sQ0M5SkEsTUFBYSxHQUFzRSxDQUNqRixRQUFTLHNCQUNULFNBQ0UsMklBQ0YsUUFBVSxHQUNSLEVBQU0sV0FBVyxPQUFRLENBQ3ZCLFlBQWEsK0NBQ2IsS0FBTSxTQUNOLFFBQVMsV0FDWCxDQUFDLEVBQ0gsTUFBTSxRQUFRLEVBQTZCLENBQ3pDLElBQU0sRUFBVSxFQUFnQixDQUFJLEVBQy9CLElBQ0gsUUFBUSxNQUFNLEVBQU0sSUFBSSxtQkFBbUIsQ0FBQyxFQUM1QyxRQUFRLEtBQUssQ0FBQyxHQU9oQixHQUFNLENBQUMsR0FBVyxFQUF5QixFQUFNLEVBQVEsUUFBUyxDQUFFLGlCQUFrQixFQUFLLENBQUMsRUFNdEYsRUFBd0IsSUFBSSxJQUNsQyxJQUFLLElBQU0sS0FBTyxPQUFPLEtBQUssQ0FBTyxFQUFHLENBQ3RDLElBQU0sRUFBaUIsRUFBUSxJQUFJLEdBQy9CLElBQW1CLElBQUEsS0FDbkIsSUFBbUIsSUFBTSxFQUFRLEtBQVMsSUFBSSxFQUFzQixJQUFJLENBQUcsRUFDL0UsRUFBUSxHQUFPLEVBQ2pCLENBSUEsSUFBSyxJQUFNLElBQU8sQ0FBQyxHQUFHLEdBQW1CLENBQU8sRUFBRyxTQUFVLG9CQUFvQixFQUFHLENBQ2xGLElBQU0sRUFBaUIsRUFBUSxJQUFJLEdBQy9CLEVBQVEsSUFBUSxJQUFtQixJQUFBLEtBQ25DLEVBQVEsS0FBUyxJQUFBLElBQWEsSUFBbUIsSUFBSSxFQUFzQixJQUFJLENBQUcsRUFDdEYsRUFBUSxHQUFPLEVBQ2pCLENBRUEsSUFBTSxFQUFRLE9BQU8sUUFBUSxDQUFPLENBQUMsQ0FDbEMsUUFBUSxDQUFDLEVBQUssS0FBVyxJQUFVLElBQU0sRUFBc0IsSUFBSSxDQUFHLENBQUMsQ0FBQyxDQUN4RSxVQUFVLENBQUMsR0FBSSxDQUFDLEtBQU8sRUFBRSxjQUFjLENBQUMsQ0FBQyxDQUFDLENBQzFDLEtBQUssQ0FBQyxFQUFLLEtBQVcsR0FBRyxFQUFJLEdBQUcsR0FBaUIsRUFBSyxDQUFLLEdBQUcsRUFDM0QsRUFBYSxFQUFLLFFBQVEsRUFBUSxRQUFTLEVBQUssTUFBUSxXQUFXLEVBQ3pFLEdBQUksRUFBSyxPQUFRLENBQ2YsUUFBUSxLQUFLLEVBQU0sS0FBSyxrQkFBa0IsRUFBVyxRQUFRLEVBQU0sT0FBTyx3QkFBd0IsQ0FBQyxFQUNuRyxNQUNGLENBRUEsRUFBRyxVQUFVLEVBQUssUUFBUSxDQUFVLEVBQUcsQ0FBRSxVQUFXLEVBQUssQ0FBQyxFQUMxRCxFQUFHLGNBQWMsRUFBWSxFQUFNLEtBQUs7Q0FBSSxFQUFJO0NBQUksRUFDcEQsUUFBUSxLQUFLLEVBQU0sTUFBTSxhQUFhLEVBQVcsUUFBUSxFQUFNLE9BQU8sd0JBQXdCLENBQUMsQ0FDakcsQ0FDRixFQUVBLFNBQWdCLEdBQW1CLEVBQTRCLENBQzdELElBQUksRUFDSixHQUFJLENBQ0YsRUFBaUIsRUFBUSxTQUFTLGNBQWMsQ0FDbEQsTUFBUSxDQUNOLE1BQU8sQ0FBQyxDQUNWLENBR0EsT0FBTyxPQUFPLEtBQUtDLEVBQVksRUFBRyxhQUFhLEVBQWdCLE1BQU0sQ0FBQyxDQUFDLENBQ3pFLENBV0EsU0FBZ0IsR0FBaUIsRUFBYSxFQUF1QixDQUNuRSxJQUFNLEVBQW1CLEVBQU0sV0FBVztFQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsQ0FBQyxXQUFXLEtBQU0sT0FBTyxHQUFHLElBQUksRUFDekYsRUFBYSxDQUFDLElBQUksRUFBTSxHQUFJLEtBQUssRUFBTSxJQUFLLElBQUksRUFBaUIsRUFBRSxFQUN6RSxJQUFLLElBQU0sS0FBYSxFQUN0QixHQUFJQSxFQUFZLEdBQUcsRUFBSSxHQUFHLEdBQVcsQ0FBQyxDQUFDLEtBQVMsRUFBTyxPQUFPLEVBRWhFLE1BQVUsTUFBTSxnQkFBZ0IsRUFBSSx1RUFBdUUsQ0FDN0csQ0NoRkEsTUFBTSxHQUFrQixJQUFJLElBQUksNmpCQXFDaEMsQ0FBQyxFQUVLLEdBQTBCLENBQUMsWUFBYSxpREFBa0Qsc0JBQXNCLEVBRXRILFNBQVMsR0FBZSxFQUFzQixDQUM1QyxPQUFPLEdBQWdCLElBQUksQ0FBRyxHQUFLLEdBQXdCLEtBQU0sR0FBVyxFQUFJLFdBQVcsQ0FBTSxDQUFDLENBQ3BHLENBT0EsTUFBYUMsR0FBOEQsQ0FDekUsUUFBUyxTQUNULFNBQ0Usb0xBQ0YsUUFBVSxHQUFVLEVBQ3BCLE1BQU0sUUFBUSxFQUF5QixDQUtyQyxPQUFPLFFBQVEsSUFBSSxlQUVuQixJQUFNLEVBQVUsRUFBZ0IsQ0FBSSxFQUMvQixJQUNILFFBQVEsTUFBTSxFQUFNLElBQUksbUJBQW1CLENBQUMsRUFDNUMsUUFBUSxLQUFLLENBQUMsR0FFaEIsSUFBTSxFQUFxQixFQUF1QixDQUFPLEVBQ3BELElBQ0gsUUFBUSxNQUFNLEVBQU0sSUFBSSx1RkFBdUYsQ0FBQyxFQUNoSCxRQUFRLEtBQUssQ0FBQyxHQUVoQixJQUFNLEVBQVUsRUFBUSxJQUFJLFFBQ3hCLENBQUMsR0FBVyxJQUFZLGVBQWlCLElBQVksVUFDdkQsUUFBUSxNQUNOLEVBQU0sSUFBSSw4RUFBOEUsRUFBUSxFQUFFLENBQ3BHLEVBQ0EsUUFBUSxLQUFLLENBQUMsR0FXaEIsSUFBTSxFQUFvQixHQUN4QixFQUFRLFFBQ1IsRUFBSyxlQUFpQixFQUFRLFlBQWMsSUFBQSxFQUM5QyxFQUNBLElBQUssR0FBTSxDQUFDLEVBQUssS0FBVSxPQUFPLFFBQVEsQ0FBaUIsRUFFekQsUUFBUSxJQUFJLEtBQVMsRUFDckIsRUFBUSxJQUFJLEtBQVMsRUFHdkIsSUFBSSxFQUNKLEdBQUksQ0FDRixFQUFpQixHQUE0QixFQUFTLENBQU8sQ0FDL0QsT0FBUyxFQUFPLENBQ2QsUUFBUSxNQUFNLEVBQU0sSUFBSSxPQUFPLGFBQWlCLE1BQVEsRUFBTSxRQUFVLENBQUssQ0FBQyxDQUFDLEVBQy9FLFFBQVEsS0FBSyxDQUFDLENBQ2hCLENBQ0ssSUFDSCxRQUFRLE1BQU0sRUFBTSxJQUFJLG1CQUFtQixFQUFtQixFQUFFLENBQUMsRUFDakUsUUFBUSxLQUFLLENBQUMsR0FFaEIsSUFBTSxFQUFZLEVBQWUsV0FBYSxFQUFRLElBQUksc0JBSXBELEVBQTRCLEVBQWUsWUFBWSxPQUFRLEdBQ25FLEdBQTZCLEVBQVMsQ0FBUSxDQUNoRCxFQUVFLEVBQVEsWUFDUixFQUEwQixPQUFTLEdBQ25DLEVBQTBCLE9BQVMsRUFBZSxZQUFZLFNBSTlELFFBQVEsTUFDTixFQUFNLElBQUksd0ZBQXdGLENBQ3BHLEVBQ0EsUUFBUSxLQUFLLENBQUMsR0FFaEIsSUFBTSxFQUNKLEVBQTBCLFNBQVcsR0FBSyxFQUFRLFdBQWEsRUFBZSxZQUFZLEdBQUssSUFBQSxHQVFqRyxHQVBJLEVBQTBCLFNBQVcsR0FBSyxFQUFRLFlBQWMsRUFBZSxZQUFZLE9BQVMsSUFDdEcsUUFBUSxNQUNOLEVBQU0sSUFBSSx5RkFBeUYsQ0FDckcsRUFDQSxRQUFRLEtBQUssQ0FBQyxHQUdaLENBQUMsRUFBSyxPQUFRLENBQ1osR0FBcUIsQ0FBQyxFQUFRLElBQUksdUJBR3BDLFFBQVEsTUFBTSxFQUFNLElBQUkscUVBQXFFLENBQUMsRUFDOUYsUUFBUSxLQUFLLENBQUMsR0FFaEIsSUFBTSxFQUNKLENBQUMsQ0FBQyxFQUFRLElBQUksc0JBQ2QsQ0FBQyxDQUFDLEVBQVEsSUFBSSxjQUNkLENBQUMsRUFBRSxFQUFRLElBQUksb0JBQXNCLEVBQVEsSUFBSSxtQkFDakQsQ0FBQyxFQUFFLEVBQVEsSUFBSSxZQUFjLEVBQVEsSUFBSSxVQUN2QyxHQUFLLEVBQVEsSUFBSSxFQUFFLEdBQUssQ0FBQyxJQUMzQixRQUFRLE1BQU0sRUFBTSxJQUFJLGtGQUFrRixDQUFDLEVBQzNHLFFBQVEsS0FBSyxDQUFDLEVBRWxCLENBSUksQ0FBQyxHQUFLLEVBQVEsSUFBSSxFQUFFLEdBQUssRUFBUSxZQUFZLFVBQVUsb0JBQ3pELE1BQU0sRUFBYSwyQkFBNEIsRUFBUyxDQUFJLEVBSzlELEdBQU0sQ0FBQyxFQUFTLEdBQWMsRUFBeUIsRUFBTSxFQUFRLFFBQVMsQ0FBRSxpQkFBa0IsRUFBSyxDQUFDLEVBSWxHLEVBQWEsSUFBSSxJQUNyQixFQUFXLFFBQVEsQ0FBQyxLQUFZLENBQUMsRUFBTyxXQUFXLFVBQVUsQ0FBQyxDQUFDLENBQUMsU0FBUyxFQUFHLEtBQVUsQ0FBSSxDQUM1RixFQUNBLElBQUssSUFBTSxLQUFPLE9BQU8sS0FBSyxDQUFPLEVBQzlCLEVBQVcsSUFBSSxDQUFHLEdBQUcsT0FBTyxFQUFRLEdBRTNDLElBQU0sRUFBZSxHQUFtQixDQUFPLEVBQy9DLElBQUssSUFBTSxLQUFPLEVBQ2hCLEVBQVEsS0FBUyxFQUFRLElBQUksSUFBUSxHQUl2QyxJQUFLLElBQU0sS0FBTyxFQUFlLG9CQUFxQixDQUNwRCxJQUFNLEVBQWdCLEVBQVEsSUFBSSxHQUM5QixFQUFRLEtBQVMsSUFBQSxJQUFhLElBQWtCLElBQUEsS0FBVyxFQUFRLEdBQU8sRUFDaEYsQ0FHQSxJQUFLLElBQU0sS0FBTyxPQUFPLEtBQUssQ0FBTyxFQUFHLENBQ3RDLElBQU0sRUFBaUIsRUFBUSxJQUFJLEdBQy9CLElBQW1CLElBQUEsS0FBVyxFQUFRLEdBQU8sRUFDbkQsQ0FDQSxHQUFNLENBQUUsY0FBYSxXQUFZLEdBQy9CLEVBQ0EsQ0FBQyxHQUFHLEVBQWUsUUFBUyxHQUFHLEVBQWUsWUFBWSxFQUMxRCxDQUNGLEVBR0ksRUFBUSxJQUFJLFlBQWMsRUFBZSxhQUFhLFNBQVMsWUFBWSxJQUM3RSxRQUFRLE1BQU0sRUFBTSxJQUFJLHFFQUFxRSxDQUFDLEVBQzlGLFFBQVEsS0FBSyxDQUFDLEdBRWhCLElBQU0sRUFBb0IsT0FBTyxLQUFLLENBQU8sQ0FBQyxDQUFDLE9BQVEsR0FBUSxFQUFlLGFBQWEsU0FBUyxDQUFHLENBQUMsRUFDcEcsRUFBa0IsT0FBUyxHQUU3QixRQUFRLEtBQ04sRUFBTSxPQUFPLDZEQUE2RCxFQUFrQixLQUFLLElBQUksR0FBRyxDQUMxRyxFQUVFLEVBQVksT0FBUyxJQUN2QixRQUFRLE1BQ04sRUFBTSxJQUNKLDRGQUE0RixFQUFZLEtBQUssSUFBSSxHQUNuSCxDQUNGLEVBQ0EsUUFBUSxLQUFLLENBQUMsR0FLaEIsSUFBTSxFQUFpQyxFQUFlLG9CQUFvQixPQUN2RSxHQUNDLENBQUMsT0FBTyxPQUFPLEVBQVMsQ0FBSSxHQUM1QixDQUFDLEVBQWUsUUFBUSxTQUFTLENBQUksR0FDckMsQ0FBQyxFQUFlLGFBQWEsU0FBUyxDQUFJLENBQzlDLEVBQ0ksRUFBK0IsT0FBUyxJQUMxQyxRQUFRLE1BQ04sRUFBTSxJQUNKLDZEQUE2RCxFQUErQixLQUFLLElBQUksR0FDdkcsQ0FDRixFQUNBLFFBQVEsS0FBSyxDQUFDLEdBRWhCLElBQU0sRUFBYSxPQUFPLEtBQUssQ0FBTyxDQUFDLENBQUMsU0FBUyxFQUs3QyxFQUFXLE9BQVMsTUFDdEIsUUFBUSxNQUNOLEVBQU0sSUFBSSwwREFBMEQsRUFBVyxPQUFPLGdCQUFnQixDQUN4RyxFQUNBLFFBQVEsS0FBSyxDQUFDLEdBSWhCLElBQU0sRUFBZ0IsSUFBSSxJQUFJLE9BQU8sUUFBaUIsRUFBZSxJQUFJLENBQUMsRUFDdEUsRUFBUSxJQUFJLFlBQVksRUFBYyxJQUFJLGFBQWMsRUFBUSxJQUFJLFVBQVUsRUFDbEYsSUFBTSxFQUFhLENBQUMsR0FBRyxDQUFhLEVBQzlCLEVBQWdCLENBQ3BCLEdBQUcsRUFBVyxPQUFRLEdBQVEsT0FBTyxXQUFXLEVBQVEsSUFBUSxHQUFJLE1BQU0sRUFBSSxFQUFJLElBQUksRUFDdEYsR0FBRyxFQUNBLFFBQ0UsRUFBRyxLQUFXLE9BQU8sV0FBVyxPQUFPLEdBQVUsU0FBVyxFQUFRLEtBQUssVUFBVSxDQUFLLEVBQUcsTUFBTSxFQUFJLEVBQUksSUFDNUcsQ0FBQyxDQUNBLEtBQUssQ0FBQyxLQUFTLENBQUcsQ0FDdkIsRUFDSSxFQUFjLE9BQVMsSUFDekIsUUFBUSxNQUFNLEVBQU0sSUFBSSw2REFBNkQsRUFBYyxLQUFLLElBQUksR0FBRyxDQUFDLEVBQ2hILFFBQVEsS0FBSyxDQUFDLEdBVWhCLElBQU0sRUFBdUIsSUFISCxFQUFLLE9BQzNCLENBQUMsRUFDRCxNQUFNLEdBQTRCLEVBQVMsRUFBTSxFQUFvQixFQUFnQixDQUFPLElBRXpFLENBQUMsRUFDdEIsRUFDQSxFQUFXLEtBQUssQ0FBQyxLQUFTLENBQUcsRUFDN0IsRUFBZSxZQUNqQixFQUNNLEVBQ0osSUFBSSxJQUFJLENBQUMsR0FBRyxFQUFZLEdBQUcsRUFBVyxLQUFLLENBQUMsS0FBUyxDQUFHLENBQUMsQ0FBQyxDQUFBLENBQUUsS0FBTyxFQUFxQixPQUNwRixFQUNKLEVBQXFCLE9BQVMsRUFDMUIsZUFBZSxFQUFxQixPQUFPLGtEQUFrRCxFQUFxQixLQUFLLElBQUksRUFBRSxHQUM3SCxHQUNGLEVBQWdCLE1BQ2xCLFFBQVEsTUFDTixFQUFNLElBQ0oscUVBQXFFLEVBQWMsZ0JBQWdCLEVBQWMsRUFDbkgsQ0FDRixFQUNBLFFBQVEsS0FBSyxDQUFDLEdBRVosRUFBZ0IsSUFDbEIsUUFBUSxLQUNOLEVBQU0sT0FBTyxHQUFHLEVBQWMsd0JBQXdCLEVBQWMscUNBQXFDLENBQzNHLEVBRUYsUUFBUSxLQUNOLEVBQU0sS0FDSixhQUFhLEVBQWUsWUFBYyxFQUFRLEtBQUssSUFBSSxFQUFRLFNBQVMsRUFBVyxPQUFPLFlBQVksRUFBVyxLQUFLLElBQUksR0FDaEksQ0FDRixFQUtBLElBQU0sRUFBVyxDQUFDLEVBQUUsRUFBUSxZQUFZLGNBQWMsUUFBVSxFQUFRLFlBQVksaUJBQWlCLFFBQy9GLEVBQW1CLEVBQVcsRUFBSyxLQUFLLE9BQVEsU0FBVSxlQUFlLEVBQUksRUFDN0UsRUFBMEIsRUFBZSxlQUMzQyxHQUFHLEdBQWdDLGlCQUFrQixDQUFPLEVBQUUsR0FDOUQsR0FDQSxHQUNFLEVBQVEsSUFBSSxhQUNkLEVBQVEsSUFBSSx5QkFBMkIsRUFBUSxJQUFJLFlBRWpELEVBQVEsWUFBWSxVQUFVLGFBQ2hDLE1BQU0sRUFBYSxvQkFBcUIsRUFBUyxDQUFJLEVBRXZELE1BQU0sRUFBYSxHQUFHLEVBQXdCLG1CQUFvQixFQUFTLENBQUksRUFHM0UsQ0FBQyxFQUFLLFFBQVUsQ0FBQyxFQUFHLFdBQVcsRUFBSyxRQUFRLEVBQVEsUUFBUyxDQUFnQixDQUFDLElBQ2hGLFFBQVEsTUFBTSxFQUFNLElBQUksR0FBRyxFQUFpQiw4REFBOEQsQ0FBQyxFQUMzRyxRQUFRLEtBQUssQ0FBQyxHQU1oQixNQUFNLEVBQ0osMkNBQTJDLEVBQW9CLENBQWdCLElBQy9FLEVBQ0EsQ0FDRixHQUtBLE1BQU0sRUFDSiwyQ0FBMkMsRUFBb0IsQ0FBa0IsSUFBSSxFQUFlLGVBQWlCLFVBQVUsRUFBb0IsQ0FBTyxJQUFNLEtBQ2hLLEVBQ0EsQ0FDRixFQU9GLElBQU0sRUFBWSxFQUFlLGVBQWlCLFVBQVUsRUFBb0IsQ0FBTyxJQUFNLEdBQzdGLElBQUssSUFBTSxLQUFZLEVBQTJCLENBQ2hELElBQU0sRUFBZSxFQUFTLGVBQWlCLEVBQVMsUUFDbkQsR0FDTCxNQUFNLEVBQ0osNkNBQTZDLEVBQW9CLENBQVksRUFBRSxxQkFBcUIsRUFBb0IsQ0FBa0IsSUFBSSxJQUM5SSxFQUNBLENBQ0YsQ0FDRixDQUNJLElBQ0csRUFBa0IsY0FDckIsUUFBUSxNQUFNLEVBQU0sSUFBSSxPQUFPLEVBQVEsdURBQXVELENBQUMsRUFDL0YsUUFBUSxLQUFLLENBQUMsR0FFWCxJQUNILFFBQVEsTUFDTixFQUFNLElBQ0osNkdBQ0YsQ0FDRixFQUNBLFFBQVEsS0FBSyxDQUFDLEdBRWhCLE1BQU0sRUFDSixHQUNFLEVBQ0EsVUFDQSw2QkFBNkIsRUFBa0IsWUFBWSx5QkFBeUIsR0FDdEYsRUFDQSxFQUNBLENBQ0YsR0FXRixJQUFNLEVBQWEsQ0FDakIsU0FDQSxXQUNBLEVBR0EsR0FBSSxDQUFDLEdBQVksRUFBZSxlQUFpQixDQUFDLFFBQVMsQ0FBTyxFQUFJLENBQUMsRUFDdkUsR0FBSSxFQUFRLElBQUksV0FBYSxDQUFDLFFBQVMsY0FBYyxFQUFRLElBQUksWUFBWSxFQUFJLENBQUMsRUFDbEYsZ0JBQ0YsRUFFQSxHQURBLFFBQVEsS0FBSyxFQUFNLEtBQUsscUJBQXFCLEVBQVcsS0FBSyxHQUFHLEVBQUUsMEJBQTBCLENBQUMsRUFDekYsQ0FBQyxFQUFLLE9BQVEsQ0FDaEIsR0FBb0IsQ0FBTyxFQUMzQixJQUFNLEVBQVksQ0FBRSxHQUFHLEVBQVEsR0FBSSxFQUNuQyxPQUFPLEVBQVUsZUFjakIsSUFBTSxFQUFpQixFQUFHLFlBQVksRUFBSyxLQUFLLEVBQUcsT0FBTyxFQUFHLFlBQVksQ0FBQyxFQUNwRSxFQUFrQixDQUFDLFNBQVUsU0FBVSxVQUFXLFNBQVMsRUFDM0QsRUFBaUIsSUFBSSxJQUN2QixFQUNBLEVBQ0osSUFBSyxJQUFNLEtBQVUsRUFBaUIsQ0FDcEMsSUFBTSxNQUE0QixDQUVoQyxHQURBLElBQTJCLEVBQ3ZCLEVBQ0YsRUFBZ0IsS0FBSyxJQUFXLFVBQVksSUFBVyxVQUFZLEVBQVMsU0FBUyxNQUNoRixDQUNMLElBQUssR0FBTSxDQUFDLEVBQWdCLEtBQVksRUFDdEMsUUFBUSxJQUFJLEVBQWdCLENBQU8sRUFFckMsRUFBRyxPQUFPLEVBQWdCLENBQUUsTUFBTyxHQUFNLFVBQVcsRUFBSyxDQUFDLEVBRTFELFFBQVEsS0FBSyxRQUFRLElBQUssQ0FBTSxDQUNsQyxDQUNGLEVBQ0EsRUFBZSxJQUFJLEVBQVEsQ0FBYSxFQUN4QyxRQUFRLEdBQUcsRUFBUSxDQUFhLENBQ2xDLENBQ0EsSUFBSSxFQUNKLEdBQUksQ0FDRixJQUFNLEVBQWtCLEVBQUssS0FBSyxFQUFnQixjQUFjLEVBQ2hFLEVBQUcsY0FBYyxFQUFpQixLQUFLLFVBQVUsQ0FBTyxFQUFHLENBQUUsS0FBTSxHQUFNLENBQUMsRUFDMUUsRUFBZSxNQUFNLElBQUksUUFBNkIsR0FBWSxDQUNoRSxFQUFrQixFQUFNLFdBQVksQ0FBQyxHQUFHLEVBQVksQ0FBZSxFQUFHLENBQ3BFLElBQUssRUFBUSxRQUNiLElBQUssRUFDTCxNQUFPLENBQUMsU0FBVSxVQUFXLFNBQVMsQ0FDeEMsQ0FBQyxFQUNELEVBQWdCLEdBQUcsUUFBVSxHQUFVLENBQ3JDLFFBQVEsTUFBTSxDQUFLLEVBQ25CLEVBQVEsQ0FBQyxDQUNYLENBQUMsRUFDRCxFQUFnQixHQUFHLFFBQVMsRUFBTSxJQUFXLENBQzNDLEVBQVEsRUFBUyxFQUFLLEdBQVEsSUFBQSxFQUFVLENBQzFDLENBQUMsQ0FDSCxDQUFDLENBQ0gsUUFBVSxDQUVSLElBQUssR0FBTSxDQUFDLEVBQWdCLEtBQWtCLEVBQzVDLFFBQVEsSUFBSSxFQUFnQixDQUFhLEVBRTNDLEVBQUcsT0FBTyxFQUFnQixDQUFFLE1BQU8sR0FBTSxVQUFXLEVBQUssQ0FBQyxDQUM1RCxDQUNBLEdBQUksRUFBd0IsQ0FFMUIsUUFBUSxLQUFLLFFBQVEsSUFBSyxDQUFzQixFQUNoRCxNQUNGLENBQ0ksSUFBaUIsSUFDbkIsUUFBUSxNQUFNLEVBQU0sSUFBSSx5Q0FBeUMsR0FBZ0IsVUFBVSxFQUFFLENBQUMsRUFDOUYsUUFBUSxLQUFLLEdBQWdCLENBQUMsRUFFbEMsQ0FLQSxHQUFJLEVBQVEsWUFBWSxVQUFVLGVBQWdCLENBSWhELElBQU0sRUFDSixFQUFlLFlBQVksU0FBVyxFQUFJLEVBQWUsWUFBWSxHQUFLLElBQUEsR0FDNUUsT0FBTyxFQUFRLElBQUksMEJBQ2YsRUFBZSxZQUFZLE9BQVMsR0FDdEMsUUFBUSxLQUFLLEVBQU0sT0FBTyxtRkFBbUYsQ0FBQyxFQUU1RyxHQUFnQixjQUFhLEVBQVEsSUFBSSwwQkFBNEIsRUFBZSxhQUNwRixJQUFXLEVBQVEsSUFBSSxzQkFBd0IsR0FDbkQsTUFBTSxFQUFhLHVCQUF3QixFQUFTLENBQUksQ0FDMUQsQ0FDRixDQUNGLEVBV0EsU0FBZ0IsR0FBdUIsRUFBaUIsRUFBeUQsQ0FDL0csSUFBTSxFQUFrQyxDQUFDLEVBQ3pDLElBQUssSUFBTSxLQUFrQixJQUFJLElBQUksRUFBYyxDQUFDLEVBQVMsQ0FBVyxFQUFJLENBQUMsQ0FBTyxDQUFDLEVBQUcsQ0FDdEYsSUFBTSxFQUFvQixFQUFLLEtBQUssRUFBZ0IsaUJBQWlCLEVBQ3JFLEdBQUksQ0FBQyxFQUFHLFdBQVcsQ0FBaUIsRUFBRyxTQUN2QyxJQUFNLEVBQVMsRUFBTyxDQUFFLEtBQU0sRUFBbUIsV0FBWSxDQUFDLEVBQUcsTUFBTyxFQUFLLENBQUMsQ0FBQyxDQUFDLFFBQVUsQ0FBQyxFQUMzRixJQUFLLEdBQU0sQ0FBQyxFQUFLLEtBQVUsT0FBTyxRQUFRLENBQU0sRUFDMUMsSUFBUSxtQkFDWixFQUFRLEtBQVMsRUFFckIsQ0FDQSxPQUFPLENBQ1QsQ0FVQSxTQUFnQixHQUNkLEVBQ0EsRUFDQSxFQUM0RCxDQUM1RCxJQUFNLEVBQWEsSUFBSSxJQUFJLENBQWEsRUFDbEMsRUFBa0MsQ0FBQyxFQUl6QyxJQUFLLEdBQU0sQ0FBQyxFQUFLLEtBQVUsT0FBTyxRQUFRLENBQU8sRUFDM0MsRUFBVyxJQUFJLENBQUcsR0FBSyxHQUFlLENBQUcsR0FDekMsSUFBUSxnQkFBa0IsRUFBTSxXQUFXLE9BQU8sSUFDdEQsRUFBUSxHQUFPLEdBR2pCLE1BQU8sQ0FBRSxZQURXLEVBQWEsT0FBUSxHQUFRLENBQUMsRUFBVyxJQUFJLENBQUcsR0FBSyxDQUFDLEdBQWUsQ0FBRyxHQUFLLENBQUMsRUFBUSxFQUN2RixFQUFHLFNBQVEsQ0FDaEMsQ0FZQSxlQUFlLEdBQ2IsRUFDQSxFQUNBLEVBQ0EsRUFDQSxFQUMrQixDQUMvQixHQUFvQixDQUFPLEVBQzNCLElBQU0sRUFBVyxDQUNmLFNBQ0EsT0FDQSxXQUNBLE9BQ0EsV0FDQSxFQUNBLEdBQUksRUFBZSxlQUFpQixDQUFDLFFBQVMsQ0FBTyxFQUFJLENBQUMsQ0FDNUQsRUFDQSxRQUFRLEtBQUssRUFBTSxLQUFLLHFCQUFxQixFQUFTLEtBQUssR0FBRyxHQUFHLENBQUMsRUFDbEUsSUFBSSxFQUNKLEdBQUksQ0FDRixFQUFNLE1BQU0sRUFBVyxXQUFZLEVBQVUsQ0FDM0MsSUFBSyxFQUFRLFFBQ2IsSUFBSyxFQUFRLElBQ2IsTUFBTyxPQUNQLFdBQVksR0FDWixRQUFTLEVBQUssT0FDaEIsQ0FBQyxDQUNILE9BQVMsRUFBTyxDQUNkLFFBQVEsS0FDTixFQUFNLE9BQ0osZ0hBQWdILGFBQWlCLE1BQVEsRUFBTSxRQUFVLE9BQU8sQ0FBSyxHQUN2SyxDQUNGLEVBQ0EsTUFDRixDQUNBLEdBQUksRUFBSSxTQUFXLEVBQUcsQ0FHcEIsSUFBTSxFQUFZLEVBQUksT0FBTyxRQUFRLEdBQUcsRUFDbEMsRUFBVSxFQUFJLE9BQU8sWUFBWSxHQUFHLEVBQzFDLEdBQUksSUFBYyxJQUFNLElBQVksSUFBTSxFQUFZLEVBQ3BELEdBQUksQ0FFRixPQURlLEtBQUssTUFBTSxFQUFJLE9BQU8sTUFBTSxFQUFXLEVBQVUsQ0FBQyxDQUNyRCxDQUFDLENBQUMsS0FBSyxDQUFFLFVBQVcsQ0FBSSxDQUFDLENBQUMsT0FBUSxHQUF5QixPQUFPLEdBQVMsUUFBUSxDQUNqRyxNQUFRLENBRVIsQ0FFSixNQUFPLEdBQUksK0NBQStDLEtBQUssRUFBSSxPQUFTLEVBQUksTUFBTSxFQU1wRixNQUFPLENBQUMsRUFFVixRQUFRLEtBQ04sRUFBTSxPQUNKLDRHQUE0RyxFQUFJLFFBQVUsRUFBSSxPQUFBLENBQVEsS0FBSyxHQUM3SSxDQUNGLENBRUYsQ0FRQSxTQUFnQixHQUNkLEVBQ0EsRUFDQSxFQUNBLEVBQ1UsQ0FDVixJQUFNLEVBQWdCLElBQUksSUFBSSxDQUFDLEdBQUcsRUFBa0IsR0FBRyxDQUFZLENBQUMsRUFDcEUsT0FBTyxFQUFrQixPQUFRLEdBQVMsQ0FBQyxPQUFPLE9BQU8sRUFBaUIsQ0FBSSxHQUFLLENBQUMsRUFBYyxJQUFJLENBQUksQ0FBQyxDQUM3RyxDQU1BLFNBQVMsR0FBb0IsRUFBd0IsQ0FDOUMsRUFBUSxXQUNYLFFBQVEsS0FBSyxFQUFNLE9BQU8sbUVBQW1FLENBQUMsQ0FFbEcsQ0M5b0JBLE1BQU0sR0FBa0IsSUFBSSxJQUFvQixDQUFDLFNBQVUsVUFBVyxTQUFTLENBQUMsRUFFbkUsR0FBK0IsQ0FDMUMsUUFBUyxrQkFDVCxTQUFVLHFDQUNWLFFBQVUsR0FBeUIsRUFBTSxvQkFBb0IsQ0FBRSxhQUFjLEVBQUssQ0FBQyxFQUNuRixNQUFNLFFBQVEsRUFBTSxDQUNsQixNQUFNLEdBQXVCLEdBQTZCLENBQUksQ0FBQyxDQUNqRSxDQUNGLEVBTUEsZUFBZSxHQUF1QixDQUFFLFdBQTRDLENBQzlFLEVBQVEsU0FBVyxJQUNyQixRQUFRLE1BQU0seUNBQXlDLEVBQ3ZELFFBQVEsS0FBSyxDQUFDLEdBR2hCLElBQU0sRUFBTSxFQUFLLFFBQVEsUUFBUSxJQUFJLENBQUMsRUFDdEMsR0FBaUMsQ0FBRyxFQUNwQyxJQUFNLEVBQXFCLFFBQVEsSUFBSSxpQkFDdkMsR0FBcUMsUUFBUSxHQUFHLEVBVzVDLENBQUMsR0FBNEIsRUFBSyxRQUFRLEdBQUcsR0FBSyxJQUNwRCxRQUFRLElBQUksS0FBTyxRQUFRLElBQUksS0FBTyxHQUFHLEVBQW1CLEdBQUcsUUFBUSxJQUFJLE9BQVMsR0FHdEYsSUFBTSxFQUFRLEVBQU0sRUFBUSxHQUFLLEVBQVEsTUFBTSxDQUFDLEVBQUcsQ0FDakQsTUFDQSxJQUFLLFFBQVEsSUFDYixNQUFPLFNBQ1QsQ0FBQyxFQUNLLEVBQWlCLElBQUksSUFDdkIsRUFDSixFQUFNLEdBQUcsUUFBVSxHQUFVLENBQzNCLFFBQVEsTUFBTSxDQUFLLEVBQ25CLFFBQVEsS0FBSyxDQUFDLENBQ2hCLENBQUMsRUFDRCxJQUFLLElBQU0sS0FBVSxHQUFpQixDQUNwQyxJQUFNLE1BQTRCLENBQ2hDLEVBQTBCLEVBQzFCLEVBQU0sS0FBSyxDQUFNLENBQ25CLEVBQ0EsRUFBZSxJQUFJLEVBQVEsQ0FBYSxFQUN4QyxRQUFRLEtBQUssRUFBUSxDQUFhLENBQ3BDLENBQ0EsRUFBTSxHQUFHLFFBQVMsRUFBTSxJQUFXLENBQ2pDLElBQUssR0FBTSxDQUFDLEVBQWdCLEtBQWtCLEVBQzVDLFFBQVEsSUFBSSxFQUFnQixDQUFhLEVBSzNDLEdBSEksR0FBVSxJQUFXLEdBQ3ZCLFFBQVEsS0FBSyxDQUFDLEVBRVosRUFBUSxDQUNWLFFBQVEsS0FBSyxRQUFRLElBQUssQ0FBTSxFQUNoQyxNQUNGLENBQ0EsUUFBUSxLQUFLLEdBQVEsQ0FBQyxDQUN4QixDQUFDLENBQ0gsQ0FFQSxTQUFTLEdBQTZCLEVBQTRDLENBQ2hGLE1BQU8sQ0FDTCxRQUFTLENBQ1AsSUFBSyxFQUFLLE1BQWtDLENBQUMsRUFBQSxDQUFHLElBQUksTUFBTSxFQUMxRCxJQUFLLEVBQUssT0FBbUMsQ0FBQyxFQUFBLENBQUcsSUFBSSxNQUFNLENBQzdELENBQ0YsQ0FDRixDQU9BLFNBQVMsR0FBaUMsRUFBbUIsQ0FDM0QsSUFBTSxFQUFhLENBQ2pCLEdBQUcsRUFBTyxDQUFFLEtBQU0sRUFBSyxLQUFLLEVBQUssTUFBTSxFQUFHLFdBQVksQ0FBQyxFQUFHLE1BQU8sRUFBSyxDQUFDLENBQUMsQ0FBQyxPQUN6RSxHQUFJLFFBQVEsSUFBSSxPQUNYLEVBQU8sQ0FBRSxLQUFNLEVBQUssS0FBSyxFQUFLLFFBQVEsUUFBUSxJQUFJLFFBQVEsRUFBRyxXQUFZLENBQUMsRUFBRyxNQUFPLEVBQUssQ0FBQyxDQUFDLENBQUMsUUFBVSxDQUFDLEVBQ3hHLENBQUMsQ0FDUCxFQUVNLENBQUMsR0FBWSxFQUE2QixFQUFLLFFBQVEsSUFBSSxPQUFRLENBQVUsRUFDN0UsRUFBUyxDQUFFLEdBQUcsRUFBVSxHQUFHLENBQVcsRUFDdEMsRUFBVSxFQUFPLENBQUUsU0FBUSxXQUFZLENBQUMsQ0FBRSxDQUFDLENBQUMsQ0FBQyxRQUFVLEVBQzdELElBQUssR0FBTSxDQUFDLEVBQUssS0FBVSxPQUFPLFFBQVEsQ0FBTyxFQUN6QyxLQUFPLFFBQVEsTUFDbkIsUUFBUSxJQUFJLEdBQU8sRUFHekIsQ0MvR0EsTUFBTSxHQUE4QixpQkFDOUIsR0FBaUMsc0JBRWpDLEdBQXdCLENBQzVCLENBQUUsV0FBWSxFQUFLLEtBQUssU0FBVSxlQUFlLEVBQUcsT0FBUSxRQUFTLEVBQ3JFLENBQUUsV0FBWSxFQUFLLEtBQUssU0FBVSxRQUFRLEVBQUcsT0FBUSxFQUFLLEtBQUssU0FBVSxRQUFRLENBQUUsRUFDbkYsQ0FBRSxXQUFZLEVBQUssS0FBSyxLQUFNLGVBQWUsRUFBRyxPQUFRLElBQUssQ0FDL0QsRUFPQSxJQUFNLEdBQU4sS0FBb0IsQ0FDbEIsa0JBQWtCLEVBQTBCLENBQzFDLElBQU0sRUFBVSxHQUFtQixDQUFPLEVBSTFDLE1BQU8sR0FIZ0IsR0FBcUQsR0FBRyxFQUFRLGNBR2hFLEVBQUUsV0FBVyxFQUFRLHdCQUM5QyxDQUVBLE9BQU8sRUFBWSxFQUFvQixHQUFZLENBQ2pELE1BQU8seUJBQXlCLEdBQ2xDLENBRUEsU0FBUyxFQUFZLEVBQW9CLEdBQVksQ0FDbkQsTUFBTyxDQUFDLGtCQUFtQixDQUFpQixDQUFDLENBQUMsT0FBTyxPQUFPLENBQUMsQ0FBQyxLQUFLLEdBQUcsQ0FDeEUsQ0FFQSxZQUFZLEVBQTBCLENBQ3BDLElBQU0sRUFBVSxHQUFtQixDQUFPLEVBQ3BDLEVBQWtCLEdBQTJCLEdBQUcsRUFBUSxjQUFjLEVBSTVFLE1BQU8sR0FBRyxFQUFnQixnREFBZ0QsRUFBZ0I7OEJBSDNELEdBQTBCLENBSVYsRUFBRSxNQUFNLEVBQVEsZ0JBQWdCLEVBQVEsMkJBQTJCLEVBQVEsNERBQzVILENBRUEsWUFBWSxFQUFrQixFQUE2QixDQUN6RCxJQUFNLEVBQVUsR0FBbUIsQ0FBTyxFQUMxQyxNQUFPLGtCQUFrQixHQUEwQixFQUFTLENBQVUsRUFBRSxHQUFHLEVBQVEsY0FDckYsQ0FFQSxRQUFRLEVBQWtCLEVBQW9CLEdBQVksQ0FDeEQsTUFBTyx5QkFBeUIsRUFBa0IsTUFBTSxLQUFLLFNBQVMsQ0FBTyxFQUFFLE1BQU0sS0FBSyxLQUFLLENBQU8sR0FDeEcsQ0FFQSxXQUFXLEVBQVksRUFBb0IsR0FBWSxDQUNyRCxNQUFPLHNCQUFzQixHQUMvQixDQUVBLE1BQU0sRUFBa0IsRUFBb0IsR0FBWSxDQUV0RCxJQUFNLEVBQWtCLENBQUMsRUFDbkIsRUFBaUIsR0FBd0IsQ0FBTyxFQUNsRCxHQUFnQixFQUFNLEtBQUssQ0FBYyxFQUM3QyxJQUFNLEVBQWUsQ0FBQywrQkFBZ0MsQ0FBaUIsQ0FBQyxDQUFDLE9BQU8sT0FBTyxDQUFDLENBQUMsS0FBSyxHQUFHLEVBTWpHLE9BTEEsRUFBTSxLQUFLLENBQVksRUFDbkIsRUFBUSxZQUFZLGNBQWMsT0FFcEMsRUFBTSxLQUFLLEtBQUssS0FBSyxDQUFPLENBQUMsRUFFeEIsRUFBTSxPQUFPLE9BQU8sQ0FBQyxDQUFDLEtBQUssTUFBTSxDQUMxQyxDQUVBLFFBQVEsRUFBa0IsRUFBb0IsRUFBNkIsQ0FDekUsSUFBTSxFQUFVLEdBQW1CLENBQU8sRUFDMUMsTUFBTyxVQUFVLEVBQVcsd0JBQXdCLEdBQTBCLEVBQVMsQ0FBVSxFQUFFLE1BQU0sRUFBVyxHQUFHLEVBQVEsY0FDakksQ0FFQSxLQUFLLEVBQWtCLEVBQTZCLENBSWxELE9BSEksRUFBUSxZQUFZLGNBQWMsTUFBYyxxQkFBcUIsRUFBYSxPQUFPLElBQWUsS0FDeEcsRUFBbUIsb0JBQW9CLElBQ3RDLEVBQVEsWUFBWSxRQUErQyxLQUFhLHNCQUM5RSx3RUFDVCxDQUVBLE9BQU8sRUFBa0IsRUFBc0IsRUFBb0IsR0FBWSxDQUM3RSxJQUFJLEVBQVMsR0FFYixHQUFJLEVBQ0YsR0FBSSxDQUNGLElBQUksSUFBSSxDQUFXLEVBQ25CLEVBQVMsZ0JBQWdCLEVBQVksRUFDdkMsTUFBUSxDQUVOLEVBQVMsZ0JBQWdCLEtBREosRUFBSyxRQUFRLENBQ2dCLEVBQUUsRUFDdEQsTUFDSyxHQUFJLEVBQVEsSUFBSSxjQUFjLFdBQUEsT0FBc0IsRUFBRyxDQUM1RCxJQUFNLEVBQVUsR0FBaUIsQ0FBTyxFQUNwQyxJQUVGLEVBQVMsZ0JBQWdCLEtBREosRUFBSyxRQUFRLEVBQVEsUUFBUyxFQUFTLEVBQVEsSUFBSSxhQUFhLE1BQU0sQ0FBa0IsQ0FDM0QsRUFBRSxHQUV4RCxDQUNBLE1BQU8sR0FBRyxFQUFPLGdCQUFnQixHQUNuQyxDQUNGLEVBRUEsU0FBUyxHQUFtQixFQUEwQixDQUNwRCxPQUFPLEVBQVEsWUFBWSxjQUFjLE1BQVEsV0FBYSxjQUNoRSxDQUVBLFNBQVMsR0FBaUIsRUFBc0MsQ0FDOUQsT0FBTyxHQUFzQixNQUFNLENBQUUsZ0JBQWlCLEVBQUcsV0FBVyxFQUFLLFFBQVEsRUFBUSxRQUFTLENBQVUsQ0FBQyxDQUFDLENBQUMsRUFDM0csTUFDTixDQUVBLFNBQVMsR0FBMEIsRUFBa0IsRUFBNkIsQ0FDaEYsR0FBSSxFQUFZLE1BQU8sWUFBWSxFQUFXLEdBRTlDLElBQU0sRUFBa0IsRUFBSyxLQUFLLEVBQVEsUUFBUyxFQUEyQixFQUc5RSxPQUZJLEVBQUcsV0FBVyxDQUFlLEVBQVUsYUFBYSxLQUNwRCxFQUFHLFdBQVcsRUFBOEIsRUFBVSxXQUFXLEtBQzlELGFBQWEsSUFDdEIsQ0FFQSxTQUFTLEdBQTJCLEVBQXdCLENBQzFELE1BQU8sV0FBVyxFQUFPLEdBQzNCLENBRUEsU0FBUyxHQUFxRCxFQUF3QixDQUNwRixNQUFPLFlBQVksRUFBTyx5RkFBeUYsS0FBYyxFQUFPLGtCQUFrQixFQUFPLE9BQU8sRUFBTyxJQUNqTCxDQUVBLFNBQWdCLEdBQXdCLEVBQXNDLENBQzVFLElBQU0sRUFBWSxHQUF1QixDQUFPLEVBQ2hELEdBQUksQ0FBQyxFQUFXLE9BRWhCLElBQU0sRUFBVSxHQUFpQixDQUFPLEVBQ2xDLEVBQWUsRUFBSyxXQUFXLENBQVMsRUFDMUMsRUFDQSxFQUFLLFFBQVEsRUFBUSxRQUFTLEdBQVcsSUFBSyxDQUFTLEVBRTNELE1BQU8sVUFBVSxFQUFhLEtBQUssRUFBYSxTQUFTLEVBQWEsTUFDeEUsQ0FFQSxNQUFhLEdBQWdCLElBQUksR0NwSXBCLEdBQWdDLENBQzNDLFFBQVMsV0FDVCxTQUFVLHdDQUNWLFFBQUEsQ0FBQSxFQUNBLE1BQU0sUUFBUSxFQUFNLENBQ2xCLElBQU0sRUFBVyxNQUFNLEVBQXVCLENBQUksRUFDN0MsSUFDSCxRQUFRLE1BQU0sRUFBTSxJQUFJLG1CQUFtQixDQUFDLEVBQzVDLFFBQVEsS0FBSyxDQUFDLEdBR2hCLElBQU0sRUFBaUIsRUFBUyxZQUM3QixJQUFLLElBQWEsQ0FBRSxVQUFTLFFBQVMsR0FBa0IsQ0FBTyxDQUFFLEVBQUUsQ0FBQyxDQUNwRSxRQUFRLENBQUUsYUFBYyxFQUFRLE9BQVMsQ0FBQyxFQUM3QyxHQUFJLEVBQWUsU0FBVyxFQUFHLENBQy9CLFFBQVEsS0FBSyxFQUFNLE1BQU0sNEJBQTRCLENBQUMsRUFDdEQsTUFDRixDQUNBLElBQUssR0FBTSxDQUFFLFVBQVMsYUFBYSxFQUFnQixDQUNqRCxRQUFRLEtBQUssMEJBQTBCLEVBQVEsS0FBSyxLQUFLLEVBQ3pELElBQUssSUFBTSxLQUFVLEVBQ25CLE1BQU0sRUFBYSxFQUFRLEVBQVMsQ0FBSSxDQUU1QyxDQUNGLENBQ0YsRUFFQSxTQUFnQixHQUFrQixFQUE0QixDQUM1RCxJQUFNLEVBQW9CLENBQUMsRUFDckIsRUFBdUIsR0FBd0IsQ0FBTyxFQUN4RCxFQUFRLGlCQUFpQixPQUFPLEdBQUssRUFBUSxlQUMvQyxFQUFRLEtBQUssb0JBQW9CLEVBSXhCLEdBQ1QsRUFBUSxLQUFLLENBQW9CLEVBR25DLElBQU0sRUFBc0IsR0FBZ0IsQ0FBTyxFQUMvQyxHQUNGLEVBQVEsS0FBSyxDQUFtQixFQUdsQyxJQUFNLEVBQXFCLEVBQVEsU0FBVyxFQUFJLEdBQXNCLENBQU8sRUFBSSxJQUFBLEdBQy9FLEdBQ0YsRUFBUSxLQUFLLENBQWtCLEVBRWpDLElBQU0sRUFBa0IsR0FBbUIsQ0FBTyxFQUlsRCxPQUhJLEdBQ0YsRUFBUSxLQUFLLENBQWUsRUFFdkIsQ0FDVCxDQUVBLFNBQVMsR0FBbUIsRUFBc0MsQ0FDaEUsR0FBSSxFQUFRLFlBQVksVUFBVSxlQUVoQyxPQURLLEVBQVEsY0FDTix1QkFEcUIsT0FHOUIsR0FDRSxFQUFRLGlCQUFpQixhQUFhLEdBQ3RDLEVBQVEsZUFDUixFQUFHLFdBQVcsRUFBSyxLQUFLLEVBQVEsUUFBUyxNQUFNLENBQUMsRUFFaEQsTUFBTyxnRUFHWCxDQUVBLFNBQVMsR0FBd0IsRUFBc0MsQ0FDaEUsS0FBUSxXQUNSLEdBQWdCLENBQU8sRUFDNUIsT0FBTyxHQUFjLFNBQVMsQ0FBTyxDQUN2QyxDQUVBLFNBQVMsR0FBZ0IsRUFBc0MsQ0FDeEQsS0FBUSxpQkFBaUIsZ0JBQWdCLEVBRTlDLElBQUksR0FBc0IsRUFBUyxnQkFBZ0IsSUFBTSxFQUN2RCxNQUFPLDJDQUVULEdBQUksR0FBVyxFQUFTLGNBQWMsRUFDcEMsTUFBTywyQ0FIQSxDQU1YLENBRUEsU0FBUyxHQUFzQixFQUFzQyxDQUNuRSxHQUFJLENBQUMsRUFBUSxXQUFZLE9BQ3pCLElBQU0sRUFBUyxHQUFrQixDQUFPLEVBQ25DLEtBRUwsTUFBTyxHQUFHLEdBQXlCLEVBQVMsbUNBQW1DLEVBQU8sVUFBVSxFQUFFLFNBQ3BHLENBRUEsU0FBUyxHQUFzQixFQUFrQixFQUF5QyxDQUN4RixJQUFNLEVBQWMsRUFBUSxZQU10QixHQUpKLEVBQVksZUFBZSxJQUMzQixFQUFZLGtCQUFrQixJQUM5QixFQUFZLHVCQUF1QixJQUNuQyxFQUFZLG1CQUFtQixHQUFBLEVBQ1YsTUFBTSxNQUFNLENBQUMsR0FBRyxHQUN2QyxPQUFPLElBQVUsSUFBQSxHQUFZLElBQUEsR0FBWSxPQUFPLENBQUssQ0FDdkQsQ0FFQSxTQUFTLEdBQVcsRUFBa0IsRUFBMkIsQ0FDL0QsT0FBTyxFQUFHLFdBQVcsRUFBSyxLQUFLLEVBQVEsUUFBUyxDQUFRLENBQUMsQ0FDM0QsQ0FFQSxTQUFTLEdBQWdCLEVBQTJCLENBQ2xELE1BQU8sQ0FBQyx1QkFBd0IsZ0JBQWlCLGtCQUFrQixDQUFDLENBQUMsS0FBTSxHQUN6RSxHQUFXLEVBQVMsQ0FBUSxDQUM5QixDQUNGLENDdkhBLE1BQWEsR0FHVCxDQUNGLFFBQVMsc0JBQ1QsU0FBVSxrRUFDVixRQUFTLENBQUEsRUFDVCxNQUFNLFFBQVEsRUFBTSxDQUNsQixNQUFNLEdBQWdCLENBQUksQ0FDNUIsQ0FDRixFQUVBLGVBQXNCLEdBQ3BCLEVBQ2UsQ0FDZixJQUFNLEVBQVUsRUFBZ0IsQ0FBSSxFQU1wQyxHQUxLLElBQ0gsUUFBUSxNQUFNLEVBQU0sSUFBSSxtQkFBbUIsQ0FBQyxFQUM1QyxRQUFRLEtBQUssQ0FBQyxHQUdaLEdBQUssRUFBUSxJQUFJLEVBQUUsRUFBRyxDQUN4QixRQUFRLEtBQUssZ0NBQWdDLEVBQVEsSUFBSSxJQUFJLEVBQzdELE1BQ0YsQ0FFQSxJQUFNLEVBQVUsRUFBUSxJQUFJLEtBQ3RCLEVBQU8sT0FBTyxDQUFPLEdBQ3ZCLENBQUMsT0FBTyxVQUFVLENBQUksR0FBSyxHQUFRLEtBQ3JDLFFBQVEsTUFBTSxFQUFNLElBQUkseUNBQXlDLEdBQVMsQ0FBQyxFQUMzRSxRQUFRLEtBQUssQ0FBQyxHQUdoQixRQUFRLEtBQUsscUJBQXFCLEdBQU0sRUFDeEMsR0FBSSxDQUNGLE1BQU0sRUFBZ0IsQ0FBSSxDQUM1QixNQUFRLENBRVIsQ0FDRixDQ2pEQSxTQUFnQixHQUFvQixFQUFrQixFQUFzQixDQUMxRSxHQUFJLENBQUMsR0FBMEIsRUFBVSxDQUFNLEVBQUcsT0FFbEQsSUFBTSxFQUFtQixHQUF3QixDQUFNLEVBQ25ELElBQ0YsUUFBUSxPQUFPLE1BQU0sQ0FBZ0IsRUFDckMsUUFBUSxPQUFPLE1BQU07Q0FBSSxFQUU3QixDQUVBLFNBQWdCLEdBQTBCLEVBQWtCLEVBQXlCLENBQ25GLE9BQU8sSUFBYSxHQUFLLEdBQWlCLENBQU0sQ0FDbEQsQ0FFQSxTQUFnQixHQUF3QixFQUF3QixDQUM5RCxPQUFPLEVBQU8sS0FBSyxDQUNyQixDQUVBLFNBQVMsR0FBaUIsRUFBeUIsQ0FDakQsTUFBTyxzQkFBc0IsS0FBSyxFQUFPLFdBQVcsMkJBQTRCLEVBQUUsQ0FBQyxDQUNyRixDQ05BLE1BQU1FLEdBQVUsQ0FDZCxJQUFLLENBQ0gsWUFBYSx5QkFDYixLQUFNLFNBQ1IsRUFDQSxPQUFRLENBQ04sWUFBYSxrQkFDYixLQUFNLFNBQ1IsRUFDQSxNQUFPLENBQ0wsWUFBYSxxQkFDYixLQUFNLFNBQ1IsRUFDQSxPQUFRLENBQ04sWUFBYSw4Q0FDYixLQUFNLFNBQ1IsQ0FDRixFQWtCTSxHQUFtQixJQUFJLElBQUksQ0FBQyxRQUFTLE1BQU8sTUFBTyxLQUFNLE1BQU8sTUFBTyxNQUFPLFNBQVUsS0FBTSxNQUFPLEtBQUssQ0FBQyxFQUMzRyxHQUFtQixJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsRUFDakMsR0FBaUIsSUFBSSxJQUFJLENBQUMsTUFBTSxDQUFDLEVBQ2pDLEdBQWlCLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxFQUMvQixHQUFrQixJQUFJLElBQUksQ0FDOUIsR0FBRyxHQUNILE1BQ0EsTUFDQSxVQUNBLE1BQ0EsTUFDQSxPQUNBLE9BQ0EsUUFDQSxRQUNBLE9BQ0EsS0FDQSxNQUNBLE9BQ0EsT0FDQSxPQUNBLEtBQ0YsQ0FBQyxFQUNLLEdBQXFCLElBQUksSUFBSSxDQUNqQyxNQUNBLE1BQ0EsTUFDQSxNQUNBLE9BQ0EsT0FDQSxLQUNBLE9BQ0EsUUFDQSxRQUNBLE1BQ0EsS0FDQSxNQUNBLE1BQ0EsT0FDQSxLQUNBLE1BQ0EsTUFDQSxPQUNBLEtBQ0YsQ0FBQyxFQUNLLEdBQXlCLElBQUksSUFBSSxDQUFDLEdBQUcsRUFBa0IsQ0FBQyxDQUFDLE9BQVEsR0FBUSxDQUFDLEdBQWdCLElBQUksQ0FBRyxDQUFDLENBQUMsRUFDbkcsR0FBK0IsMkJBU3hCLEdBQTBELENBQ3JFLFFBQVMsa0JBQ1QsU0FBVSxZQUNWLFFBQUEsR0FDQSxNQUFNLFFBQVEsRUFBTSxDQUNsQixJQUFNLEVBQVcsTUFBTSxHQUFLLENBQXVCLEVBQy9DLEdBQVUsUUFBUSxLQUFLLENBQVEsQ0FDckMsQ0FDRixFQUVBLGVBQXNCLEdBQUssRUFBd0MsQ0FDakUsR0FBSSxRQUFRLFdBQWEsUUFFdkIsT0FEQSxRQUFRLE1BQU0sRUFBTSxJQUFJLDJDQUEyQyxDQUFDLEVBQzdELEVBR1QsSUFBTSxFQUFXLE1BQU0sRUFBdUIsRUFBTSxFQUFLLEVBQ3pELEdBQUksQ0FBQyxFQUVILE9BREEsUUFBUSxNQUFNLEVBQU0sSUFBSSxtQkFBbUIsQ0FBQyxFQUNyQyxFQUdULElBQU0sRUFBUSxHQUFtQixDQUFJLEVBQy9CLEVBQXlCLElBQUksSUFDN0IsRUFBMEIsSUFBSSxJQUM5QixFQUEyQixJQUFJLElBQy9CLEVBQXlCLElBQUksSUFTN0IsRUFBc0IsSUFBSSxJQUMxQixFQUE4QixDQUFDLEVBQy9CLEVBQWlDLENBQUMsRUFDcEMsRUFBa0MsR0FDbEMsRUFDQSxFQUNKLEdBQUksRUFBTSxPQUFTLEVBQUcsQ0FDcEIsSUFBTSxFQUFjLE1BQU0sUUFBUSxJQUNoQyxFQUFNLElBQUksS0FBTyxJQUFTLENBQ3hCLElBQU0sRUFBVyxFQUFLLFFBQVEsQ0FBSSxFQUVsQyxNQUFPLENBQUUsU0FBQSxNQURjLEdBQXNCLENBQVEsRUFDbEMsVUFBUyxDQUM5QixDQUFDLENBQ0gsRUFDQSxJQUFLLEdBQU0sQ0FBRSxXQUFVLGNBQWMsRUFBYSxDQUNoRCxHQUNFLEVBQVMsU0FBUyxnQkFBZ0IsR0FDbEMsRUFBUyxTQUFTLGlCQUFpQixHQUNuQyxFQUFTLFNBQVMsZ0JBQWdCLEdBQ2xDLEVBQVMsU0FBUyxpQkFBaUIsRUFFbkMsU0FHRixJQUFNLEVBQVksRUFBSyxRQUFRLENBQVEsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxFQUNoRCxHQUFJLEVBQVMsU0FBUyxlQUFlLEVBQUcsQ0FDdEMsRUFBcUIsS0FBSyxDQUFRLEVBQ2xDLFFBQ0YsQ0FDQSxFQUFxQixLQUFLLEdBQUcsR0FBNEIsRUFBUyxZQUFhLEVBQVUsQ0FBUSxDQUFDLEVBRWxHLElBQUssR0FBTSxDQUFFLFdBQVUsYUFBYSxHQUF1QixFQUFTLFlBQWEsRUFBVSxDQUFRLEVBQUcsQ0FDcEcsR0FBSSxFQUFRLGdCQUFrQixJQUFhLGFBQWUsR0FBaUIsSUFBSSxDQUFTLEdBQUksQ0FDMUYsSUFBTSxFQUFrQixFQUF5QixJQUFJLENBQU8sR0FBSyxDQUFDLEVBR2xFLEdBRkEsRUFBZ0IsS0FBSyxDQUFRLEVBQzdCLEVBQXlCLElBQUksRUFBUyxDQUFlLEVBQ2pELElBQWEsWUFBYSxRQUNoQyxDQUNBLEdBQUksRUFBUSxpQkFBbUIsSUFBYSxhQUFlLEdBQWUsSUFBSSxDQUFTLEdBQUksQ0FDekYsSUFBTSxFQUFnQixFQUF1QixJQUFJLENBQU8sR0FBSyxDQUFDLEVBRzlELEdBRkEsRUFBYyxLQUFLLENBQVEsRUFDM0IsRUFBdUIsSUFBSSxFQUFTLENBQWEsRUFDN0MsSUFBYSxZQUFhLFFBQ2hDLE1BQ0ksRUFBUSxlQUFpQixJQUFhLGFBQWUsR0FBZSxJQUFJLENBQVMsS0FDbkYsRUFBb0IsSUFBSSxDQUFPLEVBQzNCLElBQWEsY0FFbkIsR0FBSSxJQUFhLGFBQWUsR0FBeUIsRUFBUyxDQUFTLEVBQUcsQ0FDNUUsSUFBTSxFQUFnQixFQUF1QixJQUFJLENBQU8sR0FBSyxDQUFDLEVBRzlELEdBRkEsRUFBYyxLQUFLLENBQVEsRUFDM0IsRUFBdUIsSUFBSSxFQUFTLENBQWEsRUFDN0MsRUFBSyxPQUNQLEdBQUksSUFBYSxhQUFlLEVBQVEsU0FBVSxDQUNoRCxJQUFNLEVBQWlCLEVBQXdCLElBQUksQ0FBTyxHQUFLLENBQUMsRUFDaEUsRUFBZSxLQUFLLENBQVEsRUFDNUIsRUFBd0IsSUFBSSxFQUFTLENBQWMsRUFDbkQsRUFBa0IsS0FBSyxHQUFrQyxDQUFRLEVBQUcsRUFBNEIsQ0FDbEcsTUFDRSxJQUFLLElBQU0sS0FBaUIsR0FBMkIsRUFBUyxFQUFVLEVBQVUsQ0FBUyxFQUMzRixHQUFJLEVBQVEsU0FBVSxDQUNwQixJQUFNLEVBQWlCLEVBQXdCLElBQUksQ0FBTyxHQUFLLENBQUMsRUFDaEUsRUFBZSxLQUFLLENBQWEsRUFDakMsRUFBd0IsSUFBSSxFQUFTLENBQWMsQ0FDckQsTUFDRSxFQUFrQixLQUFLLENBQWEsQ0FLOUMsTUFBTyxHQUFJLEVBQUssU0FBVyxHQUFtQixJQUFJLENBQVMsR0FBSyxHQUFnQixJQUFJLENBQVMsTUFDdkYsRUFBUSxVQUFZLEdBQWdCLElBQUksQ0FBUyxFQUFHLENBQ3RELElBQU0sRUFBaUIsRUFBd0IsSUFBSSxDQUFPLEdBQUssQ0FBQyxFQUNoRSxFQUFlLEtBQUssQ0FBUSxFQUM1QixFQUF3QixJQUFJLEVBQVMsQ0FBYyxDQUNyRCxNQUFXLEdBQW1CLElBQUksQ0FBUyxHQUN6QyxFQUFrQixLQUFLLENBQVEsT0FFeEIsR0FBc0IsQ0FBUyxHQUFLLENBQUMsRUFBUSxrQkFDdEQsUUFBUSxNQUFNLEVBQU0sSUFBSSx1QkFBdUIsRUFBUSxLQUFLLGtCQUFrQixDQUFDLEVBQy9FLEVBQWtDLEdBRXRDLENBQ0YsQ0FDQSxFQUFlLENBQUMsR0FBRyxJQUFJLElBQUksQ0FBaUIsQ0FBQyxFQUM3QyxFQUFzQixDQUFDLEdBQUcsSUFBSSxJQUFJLENBQW9CLENBQUMsQ0FDekQsS0FDRSxHQUFlLEdBQWtCLEVBQVMsS0FBSyxRQUFTLEVBQVMsV0FBVyxFQUM1RSxFQUFzQixFQUFTLFlBQVksSUFBSyxHQUFNLEVBQUUsZUFBZSxFQUd6RSxJQUFNLEVBQXNDLENBQUMsRUFDdkMsRUFBbUMsQ0FBQyxFQUNwQyxFQUFpQixDQUFFLGFBQWMsR0FBTyxjQUFlLENBQUMsRUFBSyxjQUFlLEVBQzVFLEVBQXNCLEVBQVEsRUFBSyxPQUNuQyxFQUFtQixDQUFDLEVBQUssUUFBVSxFQUFLLElBQzlDLEdBQUksRUFBTSxPQUFTLEVBQUcsQ0FDcEIsR0FBSSxFQUNGLElBQUssR0FBTSxDQUFDLEVBQVMsS0FBa0IsRUFBd0IsQ0FDN0QsSUFBTSxFQUFjLEdBQWlCLEVBQVMsRUFBTSxDQUFhLEVBQzVELEdBRUwsRUFBZSxLQUFLLENBQUUsUUFBUyxFQUFhLFNBQVEsQ0FBQyxDQUN2RCxDQUVGLElBQUssR0FBTSxDQUFDLEVBQVMsS0FBb0IsRUFDbkMsR0FDRixFQUFlLEtBQUssQ0FBRSxRQUFTLEdBQXVCLEVBQU0sQ0FBZSxFQUFHLFNBQVEsQ0FBQyxFQUVyRixHQUNGLEVBQWtCLEtBQUssQ0FBRSxRQUFTLEdBQXlCLENBQWUsRUFBRyxTQUFRLENBQUMsRUFHMUYsSUFBSyxHQUFNLENBQUMsRUFBUyxLQUFrQixFQUNqQyxHQUNGLEVBQWUsS0FBSyxDQUFFLFFBQVMsR0FBcUIsQ0FBYSxFQUFHLFNBQVEsQ0FBQyxFQUUzRSxHQUNGLEVBQWtCLEtBQUssQ0FBRSxRQUFTLEdBQXVCLENBQWEsRUFBRyxTQUFRLENBQUMsRUFHdEYsR0FBSSxFQUFxQixDQUN2QixJQUFLLElBQU0sS0FBVyxFQUNwQixFQUFrQixLQUFLLENBQUUsUUFBUyxHQUF3QixFQUFHLFNBQVEsQ0FBQyxFQUV4RSxJQUFLLEdBQU0sQ0FBQyxFQUFTLEtBQW1CLEVBQ3RDLEVBQWtCLEtBQUssQ0FBRSxRQUFTLEdBQWtCLENBQWMsRUFBRyxTQUFRLENBQUMsQ0FFbEYsQ0FDRixNQUNFLElBQUssSUFBTSxLQUFXLEVBQVMsWUFBYSxDQUMxQyxHQUFJLEVBQWtCLENBQ3BCLEdBQUksQ0FBQyxFQUFRLFlBQVksWUFBYyxFQUFRLGNBQWUsQ0FDNUQsSUFBTSxFQUFjLEdBQWlCLEVBQVMsQ0FBSSxFQUM5QyxHQUFhLEVBQWUsS0FBSyxDQUFFLFFBQVMsRUFBYSxTQUFRLENBQUMsQ0FDeEUsQ0FDSSxFQUFRLGVBQWUsRUFBZSxLQUFLLENBQUUsUUFBUyxHQUF1QixDQUFJLEVBQUcsU0FBUSxDQUFDLEVBQzdGLEVBQVEsZ0JBQWdCLEVBQWUsS0FBSyxDQUFFLFFBQVMsR0FBcUIsRUFBRyxTQUFRLENBQUMsQ0FDOUYsQ0FDSSxJQUNFLEVBQVEsVUFBVSxFQUFrQixLQUFLLENBQUUsUUFBUyxHQUFrQixFQUFHLFNBQVEsQ0FBQyxFQUNsRixFQUFRLGVBQWUsRUFBa0IsS0FBSyxDQUFFLFFBQVMsR0FBeUIsRUFBRyxTQUFRLENBQUMsRUFDOUYsRUFBUSxnQkFBZ0IsRUFBa0IsS0FBSyxDQUFFLFFBQVMsR0FBdUIsRUFBRyxTQUFRLENBQUMsRUFDN0YsRUFBUSxjQUFjLEVBQWtCLEtBQUssQ0FBRSxRQUFTLEdBQXdCLEVBQUcsU0FBUSxDQUFDLEVBRXBHLENBRUYsSUFBTSxFQUEwQixDQUFDLEVBRWpDLEdBQUksRUFBcUIsQ0FDdkIsSUFBTSxFQUFtQixNQUFNLEdBQWdCLEVBQW1CLEVBQU0sQ0FBYyxFQUl0RixHQUhBLEdBQXVCLEVBQWtCLENBQUksRUFDN0MsRUFBYyxLQUFLLEdBQUcsRUFBaUIsSUFBSyxHQUFXLEVBQU8sUUFBUSxDQUFDLEVBRW5FLEVBQWMsS0FBTSxHQUFhLElBQWEsQ0FBQyxFQUNqRCxNQUFPLEVBRVgsQ0FFQSxHQUFJLEVBQ0YsTUFBTyxHQUdULEdBQUksRUFBcUIsQ0FDdkIsR0FBSSxFQUFhLE9BQVMsR0FBSyxFQUFTLEtBQUssWUFBYSxDQUN4RCxJQUFNLEVBQWlCLE1BQU0sR0FDM0IsRUFBa0IsQ0FDaEIsT0FDQSxXQUNBLFVBQ0Esa0NBQ0EsVUFDQSxLQUNBLEdBQUcsQ0FDTCxDQUFDLEVBQ0QsRUFBUyxLQUNULEVBQ0EsQ0FDRixFQUNBLEdBQXVCLENBQUMsQ0FBYyxFQUFHLENBQUksRUFDN0MsRUFBYyxLQUFLLEVBQWUsUUFBUSxDQUM1QyxDQUNBLEdBQUksRUFBb0IsT0FBUyxFQUFHLENBQ2xDLElBQU0sRUFBd0IsTUFBTSxHQUNsQyxFQUFrQixDQUFDLE9BQVEsb0JBQXFCLEtBQU0sR0FBRyxDQUFtQixDQUFDLEVBQzdFLEVBQVMsS0FDVCxFQUNBLENBQ0YsRUFDQSxHQUF1QixDQUFDLENBQXFCLEVBQUcsQ0FBSSxFQUNwRCxFQUFjLEtBQUssRUFBc0IsUUFBUSxDQUNuRCxDQUVBLEdBQUksRUFBYyxLQUFNLEdBQWEsSUFBYSxDQUFDLEVBQ2pELE1BQU8sRUFFWCxDQUVBLEdBQUksRUFBa0IsQ0FDcEIsSUFBTSxFQUFnQixNQUFNLEdBQWdCLEVBQWdCLEVBQU0sQ0FBYyxFQUNoRixHQUF1QixFQUFlLENBQUksRUFDMUMsRUFBYyxLQUFLLEdBQUcsRUFBYyxJQUFLLEdBQVcsRUFBTyxRQUFRLENBQUMsQ0FDdEUsQ0FFQSxNQUFPLEtBQWMsS0FBTSxHQUFhLElBQWEsQ0FBQyxDQUN4RCxDQUVBLFNBQVMsR0FDUCxFQUNBLEVBQ0EsRUFDMEIsQ0FDMUIsT0FBTyxRQUFRLElBQUksRUFBUyxLQUFLLENBQUUsVUFBUyxhQUFjLEdBQWUsRUFBUyxFQUFTLEVBQU0sQ0FBTyxDQUFDLENBQUMsQ0FDNUcsQ0FFQSxTQUFTLEdBQ1AsRUFDQSxFQUNBLEVBQ0EsRUFDd0IsQ0FDeEIsR0FBSSxFQUFLLE9BQVEsQ0FDZixJQUFNLEVBQW1CLEdBQWdCLEVBQVMsQ0FBTyxFQUN6RCxPQUFPLEdBQStCLEVBQVMsRUFBUyxFQUFNLENBQU8sQ0FBQyxDQUFDLEtBQU0sSUFBWSxDQUN2RixHQUFHLEVBQ0gsUUFBUyxFQUFpQixVQUMxQixJQUFLLEVBQVEsT0FDZixFQUFFLENBQ0osQ0FDQSxPQUFPLEVBQXVCLEVBQVMsRUFBUyxFQUFNLENBQU8sQ0FBQyxDQUFDLEtBQU0sSUFBYyxDQUFFLFVBQVMsRUFBRSxDQUNsRyxDQUVBLFNBQVMsR0FDUCxFQUNBLEVBQ00sQ0FDTixJQUFNLEVBQ0osRUFBSyxRQUFVLENBQUMsRUFBSyxlQUNqQixFQUFRLE9BQVEsR0FBVyxXQUFZLEdBQVUsR0FBMEIsRUFBTyxTQUFVLEVBQU8sTUFBTSxDQUFDLEVBQzFHLEVBQ0YsS0FBaUIsU0FBVyxFQUVoQyxJQUFLLElBQU0sS0FBVSxFQUNiLFdBQVksSUFFZCxFQUFLLGVBQ1AsR0FBbUIsQ0FBTSxHQUVyQixFQUFLLFFBQ1AsR0FBbUIsRUFBTyxRQUFTLEVBQU8sR0FBRyxFQUUvQyxHQUFvQixFQUFPLFNBQVUsRUFBTyxNQUFNLEdBR3hELENBRUEsU0FBUyxHQUFtQixFQUFxQyxDQUcvRCxHQUZBLEdBQW1CLEVBQU8sUUFBUyxFQUFPLEdBQUcsRUFFekMsRUFBTyxXQUFhLEdBQUssR0FBcUMsRUFBTyxPQUFPLEVBQUcsQ0FDakYsUUFBUSxLQUFLLEVBQU0sTUFBTSxZQUFZLENBQUMsRUFDdEMsTUFDRixDQUVBLElBQU0sRUFBUyxFQUFPLE9BQU8sS0FBSyxFQUM5QixJQUNGLFFBQVEsT0FBTyxNQUFNLENBQU0sRUFDM0IsUUFBUSxPQUFPLE1BQU07Q0FBSSxFQUU3QixDQUVBLFNBQVMsR0FBbUIsRUFBaUIsRUFBbUIsQ0FDOUQsUUFBUSxLQUFLO0VBQU8sRUFBTSxLQUFLLEVBQU0sS0FBSyxVQUFVLEVBQUcsQ0FBTyxFQUFJLEVBQU0sS0FBSyxPQUFPLEdBQUssQ0FBQyxDQUM1RixDQUVBLFNBQVMsR0FBcUMsRUFBMEIsQ0FDdEUsT0FBTyxFQUFRLFNBQVMsU0FBUyxHQUFLLEVBQVEsU0FBUyxxQkFBcUIsQ0FDOUUsQ0FFQSxTQUFnQixHQUNkLEVBQ0EsRUFDQSxFQUNvQixDQUNwQixHQUFJLEVBQVEsa0JBQW9CLFNBQzlCLE9BQU8sRUFBa0IsQ0FDdkIsT0FDQSxTQUNBLGtDQUlBLEdBQUksRUFBUSxtQkFBcUIsQ0FBQyxlQUFnQixjQUFjLEVBQUksQ0FBQyxFQUNyRSxHQUFJLEVBQUssTUFBUSxDQUFDLFNBQVMsRUFBSSxDQUFDLEVBQ2hDLEdBQUksRUFBSyxJQUFNLENBQUMsT0FBTyxFQUFJLENBQUMsRUFDNUIsR0FBSSxHQUFTLENBQUMsR0FBRyxDQUNuQixDQUFDLENBR0wsQ0FFQSxTQUFnQixHQUFrQixFQUEwQixDQUMxRCxPQUFPLEVBQWtCLENBQ3ZCLE9BQ0EsUUFDQSxVQUNBLGtDQUNBLEdBQUksR0FBUyxDQUFDLEdBQUcsRUFDakIsa0JBQ0YsQ0FBQyxDQUNILENBRUEsU0FBZ0IsR0FBeUIsRUFBMEIsQ0FDakUsSUFBTSxFQUFVLEdBQVMsRUFBTSxPQUFTLEVBQUksRUFBUSxDQUFDLEdBQUcsRUFDeEQsTUFBTyxDQUNMLEVBQWtCLENBQUMsU0FBVSxNQUFPLFFBQVMsWUFBYSxRQUFTLGlCQUFrQixHQUFHLENBQU8sQ0FBQyxFQUNoRyxFQUFrQixDQUFDLFNBQVUsTUFBTyxRQUFTLEdBQUcsQ0FBTyxDQUFDLENBQzFELENBQUMsQ0FBQyxLQUFLLE1BQU0sQ0FDZixDQUVBLFNBQWdCLEdBQXVCLEVBQWtELEVBQTBCLENBQ2pILElBQU0sRUFBVSxHQUFTLEVBQU0sT0FBUyxFQUFJLEVBQVEsQ0FBQyxHQUFHLEVBQ3hELE9BQU8sRUFBa0IsQ0FBQyxTQUFVLE1BQU8sU0FBVSxHQUFJLEVBQUssTUFBUSxDQUFDLElBQUksRUFBSSxDQUFDLEVBQUksR0FBRyxDQUFPLENBQUMsQ0FDakcsQ0FFQSxTQUFnQixJQUFrQyxDQUloRCxPQUFPLEVBQWtCLENBQUMsUUFBUyxNQUFPLE9BQU8sQ0FBQyxDQUNwRCxDQUVBLFNBQWdCLEdBQXVCLEVBQTBCLENBRS9ELE9BQU8sRUFBa0IsQ0FBQyxPQUFRLFNBQVUsR0FENUIsR0FBUyxFQUFNLE9BQVMsRUFBSSxFQUFRLENBQUMsR0FBRyxDQUNGLENBQUMsQ0FDekQsQ0FFQSxTQUFnQixHQUFxQixFQUEwQixDQUU3RCxPQUFPLEVBQWtCLENBQUMsT0FBUSxVQUFXLEdBRDdCLEdBQVMsRUFBTSxPQUFTLEVBQUksRUFBUSxDQUFDLEdBQUcsQ0FDRCxDQUFDLENBQzFELENBRUEsU0FBZ0IsR0FDZCxFQUNBLEVBQ1UsQ0FDVixJQUFNLEVBQU8sSUFBSSxJQUFZLENBQUMsZUFBZSxDQUFDLEdBQUcsRUFBc0IsQ0FBQyxDQUFDLEtBQUssR0FBRyxFQUFFLEdBQUksRUFBNEIsQ0FBQyxFQUNwSCxJQUFLLElBQU0sS0FBVyxFQUFVLENBQzlCLEdBQUksQ0FBQyxHQUFjLENBQU8sRUFBRyxTQUU3QixJQUFNLEVBQWlCLEVBQUssS0FBSyxFQUFRLFFBQVMsZUFBaUIsQ0FBQyxHQUFHLEVBQWtCLENBQUMsQ0FBQyxLQUFLLEdBQUcsRUFBSSxHQUFHLEVBQzFHLEVBQUssSUFBSSxFQUFLLFNBQVMsRUFBYSxDQUFjLEdBQUssQ0FBYyxDQUN2RSxDQUNBLE1BQU8sQ0FBQyxHQUFHLENBQUksQ0FDakIsQ0FFQSxTQUFTLEdBQWtCLEVBQXFCLEVBQXVDLENBQ3JGLElBQUksRUFDSixJQUFLLElBQU0sS0FBVyxHQUVqQixJQUFhLEVBQVEsU0FBVyxFQUFTLFdBQVcsR0FBRyxFQUFRLFFBQVEsRUFBRSxLQUN6RSxDQUFDLEdBQWlCLEVBQVEsUUFBUSxPQUFTLEVBQWMsUUFBUSxVQUVsRSxFQUFnQixHQUdwQixPQUFPLENBQ1QsQ0FFQSxTQUFnQixHQUFtQixFQUE2RCxDQUM5RixJQUFNLEVBQWMsSUFBSSxJQUN4QixJQUFLLElBQU0sSUFBUyxDQUFDLEdBQUksRUFBSyxPQUFTLENBQUMsRUFBSSxHQUFHLEVBQUssRUFBRSxNQUFNLENBQUMsRUFBRyxHQUFJLEVBQUssT0FBUyxDQUFDLENBQUUsRUFDbkYsRUFBWSxJQUFJLE9BQU8sQ0FBSyxDQUFDLEVBRS9CLE1BQU8sQ0FBQyxHQUFHLENBQVcsQ0FDeEIsQ0FFQSxlQUFzQixHQUFzQixFQUFrRCxDQUM1RixHQUFJLENBRUYsSUFBSSxNQURnQkMsRUFBRyxLQUFLLENBQVEsRUFBQSxDQUMxQixZQUFZLEVBQUcsTUFBTyxXQUNsQyxNQUFRLENBRVIsQ0FFQSxNQUFPLE9BQ1QsQ0FFQSxTQUFnQixHQUNkLEVBQ0EsRUFDUyxDQUdULE9BRkksRUFBUSxTQUFpQixHQUFnQixJQUFJLENBQVMsRUFDdEQsR0FBYyxDQUFPLEVBQVUsR0FDNUIsR0FBdUIsSUFBSSxDQUFTLENBQzdDLENBRUEsU0FBZ0IsR0FDZCxFQUNBLEVBQ0EsRUFDQSxFQUNVLENBVVYsT0FUSSxJQUFhLGFBQWUsRUFBUSxTQUMvQixDQUFDLENBQVEsRUFFZCxJQUFhLGFBQWUsR0FBYyxDQUFPLEVBQzVDLENBQUMsRUFBVSxFQUE0QixFQUU1QyxHQUFxQyxFQUFTLENBQVMsRUFDbEQsQ0FBQyxDQUFRLEVBRVgsQ0FBQyxDQUNWLENBRUEsU0FBUyxHQUFrQyxFQUEwQixDQUNuRSxPQUFPLEVBQUssS0FBSyxFQUFVLGVBQWUsQ0FBQyxHQUFHLEVBQXNCLENBQUMsQ0FBQyxLQUFLLEdBQUcsRUFBRSxFQUFFLENBQ3BGLENBRUEsU0FBZ0IsR0FDZCxFQUNBLEVBQ0EsRUFDVSxDQUVWLE9BREksSUFBYSxZQUNWLEVBQ0osT0FDRSxHQUNDLEVBQVEsa0JBQW9CLEVBQUssS0FBSyxFQUFVLGNBQWMsR0FDOUQsRUFBUSxnQkFBZ0IsV0FBVyxHQUFHLEVBQVMsRUFBRSxDQUNyRCxDQUFDLENBQ0EsSUFBSyxHQUFZLEVBQVEsZUFBZSxFQVBOLENBQUMsQ0FReEMsQ0FFQSxTQUFnQixHQUNkLEVBQ0EsRUFDQSxFQUMwQyxDQUMxQyxHQUFJLElBQWEsWUFBYSxDQUM1QixJQUFNLEVBQXFCLEVBQVMsT0FDakMsR0FBWSxFQUFRLFVBQVksR0FBWSxFQUFRLFFBQVEsV0FBVyxHQUFHLEVBQVMsRUFBRSxDQUN4RixFQUNBLEdBQUksRUFBbUIsT0FBUyxFQUM5QixPQUFPLEVBQW1CLElBQUssSUFBYSxDQUFFLFNBQVUsRUFBUSxRQUFTLFNBQVEsRUFBRSxDQUV2RixDQUVBLElBQU0sRUFBVSxHQUFrQixFQUFVLENBQVEsRUFDcEQsT0FBTyxFQUFVLENBQUMsQ0FBRSxTQUFVLEVBQVUsU0FBUSxDQUFDLEVBQUksQ0FBQyxDQUN4RCxDQUVBLFNBQVMsR0FBc0IsRUFBNEIsQ0FDekQsT0FBTyxHQUFpQixJQUFJLENBQVMsR0FBSyxHQUFpQixJQUFJLENBQVMsR0FBSyxHQUFlLElBQUksQ0FBUyxDQUMzRyxDQUVBLFNBQVMsR0FBeUIsRUFBMkMsRUFBNEIsQ0FFdkcsT0FESSxFQUFRLGtCQUFvQixVQUFpQixHQUFpQixJQUFJLENBQVMsQ0FFakYsQ0FFQSxTQUFTLEdBQWMsRUFBaUUsQ0FDdEYsTUFBTyxDQUFDLEVBQVEsVUFBWSxFQUFRLGtCQUFvQixRQUMxRCxDQ2hsQkEsZUFBc0IsR0FBd0IsRUFBa0IsRUFBbUMsQ0FDakcsSUFBTSxFQUFPLE9BQU8sQ0FBTyxFQUMzQixHQUFJLENBQUMsRUFBTSxNQUFVLE1BQU0sbUJBQW1CLEVBQUssY0FBYyxFQUdqRSxPQURBLE1BQU0sR0FBb0MsRUFBTSxDQUFPLEVBQ2hELENBQ1QsQ0FPQSxlQUFzQixHQUFnQixFQUFnQyxDQUVwRSxJQUFLLElBQU0sSUFBUSxDQUFDLFlBQWEsSUFBSSxFQUVuQyxHQUFJLENBQUMsTUFEbUIsR0FBVSxFQUFNLENBQUksRUFDNUIsTUFBTyxHQUV6QixNQUFPLEVBQ1QsQ0FFQSxlQUFlLEdBQVUsRUFBYyxFQUFnQyxDQUNyRSxPQUFPLElBQUksUUFBUyxHQUFZLENBQzlCLElBQU0sRUFBUyxFQUFhLEVBRTVCLEVBQU8sS0FBSyxRQUFVLEdBQStCLENBQ25ELEdBQUksRUFBSSxPQUFTLGFBQWMsQ0FDN0IsRUFBUSxFQUFLLEVBQ2IsTUFDRixDQUNBLEdBQUksRUFBSSxPQUFTLGVBQWdCLENBQy9CLEVBQVEsRUFBSSxFQUNaLE1BQ0YsQ0FDQSxFQUFRLEVBQUssQ0FDZixDQUFDLEVBRUQsRUFBTyxLQUFLLGdCQUFtQixDQUM3QixFQUFPLFVBQVksQ0FDakIsRUFBUSxFQUFJLENBQ2QsQ0FBQyxDQUNILENBQUMsRUFFRCxFQUFPLE9BQU8sRUFBTSxDQUFJLENBQzFCLENBQUMsQ0FDSCxDQzlDQSxNQUFNLEdBQVMsSUFBSSxJQUluQixlQUFzQixHQUFvQyxFQUFjLEVBQWlDLENBRWxHLE1BRG1CLEdBQWdCLENBQUksR0FFMUMsTUFBTSxHQUE0QixFQUFNLENBQU8sRUFHakQsSUFBTSxFQUFXLFNBQTJCLENBQ3RDLEdBQU8sSUFBSSxDQUFJLElBRW5CLEdBQU8sSUFBSSxDQUFJLEVBQ2YsTUFBTSxHQUE0QixFQUFNLENBQU8sRUFDakQsRUFDQSxJQUFLLElBQU0sSUFBVSxDQUFDLGFBQWMsU0FBVSxVQUFXLFNBQVMsRUFDaEUsUUFBUSxHQUFHLEVBQVEsQ0FBUSxDQUUvQixDQUVBLGVBQXNCLEdBQTRCLEVBQWMsRUFBaUMsQ0FDL0YsTUFBTSxHQUEwQixFQUFNLENBQU8sRUFDN0MsR0FBNkIsQ0FBSSxDQUNuQyxDQUVBLFNBQVMsR0FBNkIsRUFBb0IsQ0FDeEQsSUFBSyxJQUFNLEtBQU8sR0FBd0IsQ0FBSSxFQUM1QyxHQUFJLENBQ0YsUUFBUSxLQUFLLEVBQUssU0FBUyxDQUM3QixNQUFRLENBRVIsQ0FFSixDQUVBLFNBQVMsR0FBd0IsRUFBd0IsQ0FDdkQsR0FBSSxDQU1GLE9BTGUsRUFBYSxPQUFRLENBQUMsTUFBTyxPQUFPLElBQVEsY0FBYyxFQUFHLENBQzFFLFNBQVUsT0FDVixNQUFPLENBQUMsU0FBVSxPQUFRLFFBQVEsRUFDbEMsUUFBUyxHQUNYLENBQ1ksQ0FBQyxDQUNWLE1BQU0sS0FBSyxDQUFDLENBQ1osSUFBSyxHQUFRLE9BQU8sRUFBSSxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQ2hDLE9BQVEsR0FBUSxPQUFPLFVBQVUsQ0FBRyxHQUFLLEVBQU0sR0FBSyxJQUFRLFFBQVEsR0FBRyxDQUM1RSxNQUFRLENBQ04sTUFBTyxDQUFDLENBQ1YsQ0FDRixDQUVBLGVBQXNCLEdBQW1CLEVBQTRCLENBQ25FLElBQUssSUFBSSxFQUFJLEVBQUcsRUFBSSxHQUFzQixJQUFLLENBQzdDLE1BQU1DLEVBQVcsR0FBMEIsRUFDM0MsR0FBSSxDQUNGLFFBQVEsS0FBSyxFQUFLLENBQUMsQ0FDckIsT0FBUyxFQUFPLENBQ2QsR0FBSyxFQUFnQyxPQUFTLFFBQVMsTUFDekQsQ0FDRixDQUVBLEdBQUksQ0FDRixRQUFRLEtBQUssRUFBSyxTQUFTLENBQzdCLE1BQVEsQ0FFUixDQUNGLENBTUEsZUFBc0IsR0FBMEIsRUFBYyxFQUFpQyxDQUM3RixNQUFNLEdBQXVCLENBQUMsV0FBWSxXQUFXLEdBQU0sRUFBRyxDQUFPLENBQ3ZFLENBRUEsZUFBZSxHQUF1QixFQUFzQixFQUFpQyxDQUMzRixHQUFJLENBQ0YsSUFBTSxFQUFlLE1BQU0sR0FBdUIsRUFBWSxDQUFPLEVBQ3JFLEdBQUksRUFBYSxTQUFXLEVBQUcsT0FFL0IsTUFBTSxFQUFXLFNBQVUsQ0FBQyxLQUFNLEtBQU0sR0FBRyxDQUFZLEVBQUcsQ0FDeEQsSUFBSyxFQUFRLFFBQ2IsSUFBSyxFQUFRLEdBQ2YsQ0FBQyxDQUNILE1BQVEsQ0FFUixDQUNGLENBRUEsZUFBZSxHQUF1QixFQUFzQixFQUFxQyxDQUMvRixHQUFNLENBQUUsVUFBVyxNQUFNLEVBQVcsU0FBVSxDQUFDLEtBQU0sS0FBTSxHQUFHLENBQVUsRUFBRyxDQUN6RSxJQUFLLEVBQVEsUUFDYixJQUFLLEVBQVEsR0FDZixDQUFDLEVBQ0QsT0FBTyxFQUNKLE1BQU0sS0FBSyxDQUFDLENBQ1osSUFBSyxHQUFPLEVBQUcsS0FBSyxDQUFDLENBQUMsQ0FDdEIsT0FBTyxPQUFPLENBQ25CLENBRUEsU0FBZ0IsR0FBZ0IsRUFBZ0IsRUFBd0IsQ0FDdEUsSUFBTSxNQUF1QixDQUMzQixHQUFJLEdBQU8sSUFBSSxDQUFNLEVBQUcsT0FFeEIsR0FBTyxJQUFJLENBQU0sRUFDakIsRUFBVyxFQUFRLENBQU8sRUFDMUIsR0FBTSxDQUFFLFVBQVcsRUFBVSxFQUFRLENBQUUsSUFBSyxFQUFRLFFBQVMsTUFBTyxHQUFNLE1BQU8sU0FBVSxDQUFDLEVBQzVGLEdBQTZCLEVBQVEsRUFBUSxDQUFDLENBQUMsQ0FDakQsRUFDQSxJQUFLLElBQU0sSUFBVSxDQUFDLGFBQWMsU0FBVSxVQUFXLFNBQVMsRUFDaEUsUUFBUSxHQUFHLEVBQVEsQ0FBUSxDQUUvQixDQzlHQSxNQUFNQyxHQUFVLENBQ2QsV0FBWSxDQUNWLFFBQVMsSUFDVCxTQUFVLHFEQUNWLEtBQU0sUUFDUixDQUNGLEVBTU0sR0FBb0IsV0E4Q2IsR0FBOEQsQ0FDekUsUUFBUyx1QkFDVCxTQUFVLHFGQUNWLFFBQVUsR0FDUixFQUNHLFdBQVcsU0FBVSxDQUNwQixRQUFTLENBQUMsUUFBUyxNQUFNLEVBQ3pCLFNBQVUsNEJBQ1YsS0FBTSxRQUNSLENBQUMsQ0FBQyxDQUNELFFBQVFBLEVBQU8sRUFDcEIsTUFBTSxRQUFRLEVBQU0sQ0FDbEIsSUFBTSxFQUFVLEVBQWdCLENBQUksRUFDL0IsSUFDSCxRQUFRLE1BQU0sRUFBTSxJQUFJLG1CQUFtQixDQUFDLEVBQzVDLFFBQVEsS0FBSyxDQUFDLEdBR2hCLElBQU0sRUFBUyxFQUFLLE9BQ3BCLEdBQUksRUFBUSxJQUFJLFNBQVcsT0FBUSxDQUNqQyxRQUFRLEtBQUssb0JBQW9CLEVBQU8seUJBQXlCLEVBQ2pFLE1BQ0YsQ0FFQSxJQUFNLEVBQU8sR0FBVSxFQUFRLElBQUksSUFBSSxFQUN2QyxHQUFJLElBQVcsUUFBUyxDQUN0QixNQUFNLEdBQXVCLEVBQVMsRUFBTSxFQUFLLE9BQU8sRUFDeEQsTUFDRixDQUNBLEdBQUksSUFBVyxPQUFRLENBQ3JCLE1BQU0sR0FBc0IsRUFBUyxDQUFJLEVBQ3pDLE1BQ0YsQ0FFQSxNQUFVLE1BQU0sK0JBQStCLEdBQVEsQ0FDekQsQ0FDRixFQUVBLFNBQVMsR0FBVSxFQUFxQyxDQUN0RCxJQUFNLEVBQU8sT0FBTyxDQUFPLEVBRTNCLE9BREEsRUFBTyxHQUFHLE9BQU8sVUFBVSxDQUFJLEdBQUssRUFBTyxFQUFHLHlDQUF5QyxHQUFTLEVBQ3pGLENBQ1QsQ0FFQSxlQUFlLEdBQXVCLEVBQWtCLEVBQWMsRUFBZ0MsQ0FDcEcsRUFBTyxHQUNMLE9BQU8sU0FBUyxDQUFPLEdBQUssR0FBVyxHQUFLLEdBQVcsR0FDdkQsa0NBQWtDLEdBQWtCLElBQUksR0FDMUQsRUFFQSxJQUFNLEVBQWMsTUFBTSxHQUF3QixFQUFTLENBQUksRUFDekQsRUFBa0IsSUFBSSxnQkFDdEIsRUFBVSxTQUEyQixDQUN6QyxNQUFNLEdBQXlCLEVBQWEsUUFBUSxHQUFHLENBQ3pELEVBQ00sTUFBMkIsQ0FDL0IsRUFBZ0IsTUFBTSxDQUN4QixFQUNNLE1BQW1DLENBQ3ZDLFFBQVEsSUFBSSxTQUFVLENBQVksRUFDbEMsUUFBUSxJQUFJLFVBQVcsQ0FBWSxFQUNuQyxRQUFRLElBQUksVUFBVyxDQUFZLENBQ3JDLEVBRUEsUUFBUSxLQUFLLFNBQVUsQ0FBWSxFQUNuQyxRQUFRLEtBQUssVUFBVyxDQUFZLEVBQ3BDLFFBQVEsS0FBSyxVQUFXLENBQVksRUFFcEMsR0FBSSxDQUNGLE1BQU1DLEVBQVcsRUFBUyxJQUFBLEdBQVcsQ0FBRSxPQUFRLEVBQWdCLE1BQU8sQ0FBQyxFQUN2RSxFQUFxQixFQUNyQixJQUFNLEVBQVMsTUFBTSxHQUFpQyxDQUFJLEVBQzFELEdBQUksQ0FBQyxFQUFRLE9BRWIsUUFBUSxLQUFLLHNDQUFzQyxFQUFLLEVBQUUsRUFDMUQsTUFBTSxHQUFnQixDQUFNLENBQzlCLE9BQVMsRUFBTyxDQUNkLEdBQUksYUFBaUIsT0FBUyxFQUFNLE9BQVMsYUFBYyxPQUUzRCxNQUFNLENBQ1IsUUFBVSxDQUNSLEVBQXFCLEVBQ3JCLE1BQU0sRUFBUSxDQUNoQixDQUNGLENBRUEsZUFBZSxHQUFpQyxFQUFnRCxDQUM5RixJQUFLLElBQUksRUFBVSxFQUFHLEdBQVcsRUFBOEIsSUFBVyxDQUN4RSxJQUFNLEVBQVMsR0FBd0IsRUFDdkMsR0FBSSxDQUVGLE9BREEsTUFBTSxHQUF3QixFQUFRLEVBQU0sRUFBbUMsRUFDeEUsQ0FDVCxPQUFTLEVBQU8sQ0FDZCxNQUFNLEdBQXVCLENBQU0sRUFDbkMsSUFBTSxFQUFNLEVBQ1osR0FBSSxFQUFJLE9BQVMsY0FBZ0IsRUFBVSxFQUE4QixDQUN2RSxNQUFNQSxFQUFXLEdBQTZCLEVBQzlDLFFBQ0YsQ0FDQSxHQUFJLEVBQUksT0FBUyxhQUFjLENBQzdCLFFBQVEsS0FBSyx3Q0FBd0MsRUFBSyxvQkFBb0IsRUFDOUUsTUFDRixDQUNBLEdBQThCLEVBQU0sQ0FBRyxDQUN6QyxDQUNGLENBRUEsTUFBVSxNQUFNLCtDQUErQyxDQUNqRSxDQUVBLFNBQVMsR0FBOEIsRUFBYyxFQUFxQyxDQUNwRixFQUFNLE9BQVMsYUFDakIsUUFBUSxNQUFNLEVBQU0sSUFBSSxRQUFRLEVBQUssb0JBQW9CLENBQUMsRUFFMUQsUUFBUSxNQUFNLEVBQU0sSUFBSSw2QkFBNkIsRUFBTSxTQUFTLENBQUMsRUFFdkUsUUFBUSxLQUFLLENBQUMsQ0FDaEIsQ0FFQSxTQUFTLEdBQW9DLEVBQW9CLENBQy9ELFFBQVEsTUFBTSxFQUFNLElBQUksNkJBQTZCLEVBQU0sU0FBUyxDQUFDLEVBQ3JFLFFBQVEsS0FBSyxDQUFDLENBQ2hCLENBRUEsZUFBZSxHQUFzQixFQUFrQixFQUE2QixDQUNsRixNQUFNLEdBQXVCLEVBQVMsQ0FBSSxFQUMxQyxNQUFNLEdBQTRCLEVBQU0sQ0FBTyxFQUMvQyxRQUFRLEtBQUssc0NBQXNDLEVBQUssRUFBRSxDQUM1RCxDQUVBLFNBQVMsSUFBdUMsQ0FDOUMsT0FBTyxFQUFLLGNBQWMsRUFBVSxJQUFhLENBQy9DLEVBQVMsVUFBVSxJQUFLLENBQ3RCLGdCQUFpQixXQUNqQixlQUFnQiwwQkFDbEIsQ0FBQyxFQUNELEVBQVMsSUFBSTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O1FBQWUsQ0FDOUIsQ0FBQyxDQUNILENBRUEsZUFBZSxHQUNiLEVBQ0EsRUFDQSxFQUNlLENBQ2YsTUFBTSxJQUFJLFNBQWUsRUFBUyxJQUFXLENBQzNDLElBQU0sRUFBa0IsR0FBdUIsQ0FDN0MsRUFBTyxJQUFJLFlBQWEsQ0FBVyxFQUNuQyxFQUFPLENBQUssQ0FDZCxFQUNNLE1BQTBCLENBQzlCLEVBQU8sSUFBSSxRQUFTLENBQWMsRUFDbEMsRUFBTyxHQUFHLFFBQVMsQ0FBYyxFQUNqQyxFQUFRLENBQ1YsRUFDQSxFQUFPLEtBQUssUUFBUyxDQUFjLEVBQ25DLEVBQU8sS0FBSyxZQUFhLENBQVcsRUFDcEMsRUFBTyxPQUFPLEVBQU0sU0FBUyxDQUMvQixDQUFDLENBQ0gsQ0FFQSxlQUFlLEdBQWdCLEVBQW9DLENBQ2pFLE1BQU0sSUFBSSxRQUFlLEdBQVksQ0FDbkMsSUFBTSxNQUF1QixDQUMzQixRQUFRLElBQUksU0FBVSxDQUFRLEVBQzlCLFFBQVEsSUFBSSxVQUFXLENBQVEsRUFDL0IsUUFBUSxJQUFJLFVBQVcsQ0FBUSxHQUN6QixTQUFZLENBQ2hCLEdBQUksQ0FDRixNQUFNLEdBQXVCLENBQU0sQ0FDckMsT0FBUyxFQUFPLENBQ2QsUUFBUSxNQUFNLEVBQU0sSUFBSSx1Q0FBd0MsRUFBZ0IsU0FBUyxDQUFDLENBQzVGLFFBQVUsQ0FDUixFQUFRLENBQ1YsQ0FDRixFQUFBLENBQUcsQ0FDTCxFQUNBLFFBQVEsS0FBSyxTQUFVLENBQVEsRUFDL0IsUUFBUSxLQUFLLFVBQVcsQ0FBUSxFQUNoQyxRQUFRLEtBQUssVUFBVyxDQUFRLENBQ2xDLENBQUMsQ0FDSCxDQUVBLGVBQWUsR0FBdUIsRUFBb0MsQ0FDeEUsTUFBTSxJQUFJLFNBQWUsRUFBUyxJQUFXLENBQzNDLEVBQU8sTUFBTyxHQUFVLENBQ3RCLEdBQUksRUFBTyxDQUNULEdBQUssRUFBZ0MsT0FBUyx5QkFBMEIsQ0FDdEUsRUFBUSxFQUNSLE1BQ0YsQ0FDQSxFQUFPLENBQUssRUFDWixNQUNGLENBQ0EsRUFBUSxDQUNWLENBQUMsRUFDRCxFQUFPLG9CQUFvQixDQUM3QixDQUFDLENBQ0gsQ0FFQSxlQUFlLEdBQXdCLEVBQWtCLEVBQStCLENBQ3RGLElBQU0sRUFBYyxHQUF1QixFQUFTLENBQUksRUFHeEQsT0FGQSxNQUFNQyxFQUFHLE1BQU0sRUFBSyxRQUFRLENBQVcsRUFBRyxDQUFFLFVBQVcsRUFBSyxDQUFDLEVBQzdELE1BQU1BLEVBQUcsVUFBVSxFQUFhLEdBQUcsUUFBUSxJQUFJLElBQUssTUFBTSxFQUNuRCxDQUNULENBRUEsZUFBZSxHQUF1QixFQUFrQixFQUE2QixDQUNuRixJQUFNLEVBQWMsR0FBdUIsRUFBUyxDQUFJLEVBQ2xELEVBQU0sTUFBTSxHQUF1QixDQUFXLEVBQ3BELEdBQUksSUFBUSxJQUFBLElBQWEsSUFBUSxRQUFRLElBQUssQ0FDNUMsR0FBSSxDQUNGLEVBQVMsRUFBSyxTQUFTLENBQ3pCLE1BQVEsQ0FFUixDQUNBLE1BQU0sR0FBbUIsQ0FBRyxDQUM5QixDQUNBLE1BQU0sR0FBeUIsRUFBYSxDQUFHLENBQ2pELENBRUEsZUFBZSxHQUF5QixFQUFxQixFQUFxQyxDQUM1RixJQUFnQixJQUFBLElBRWQsTUFEYyxHQUF1QixDQUFXLElBQ3hDLEdBRWQsTUFBTUEsRUFBRyxHQUFHLEVBQWEsQ0FBRSxNQUFPLEVBQUssQ0FBQyxDQUMxQyxDQUVBLGVBQWUsR0FBdUIsRUFBa0QsQ0FDdEYsR0FBSSxDQUNGLElBQU0sRUFBVSxNQUFNQSxFQUFHLFNBQVMsRUFBYSxNQUFNLEVBQy9DLEVBQU0sT0FBTyxFQUFRLEtBQUssQ0FBQyxFQUNqQyxPQUFPLE9BQU8sVUFBVSxDQUFHLEdBQUssRUFBTSxFQUFJLEVBQU0sSUFBQSxFQUNsRCxNQUFRLENBQ04sTUFDRixDQUNGLENBRUEsU0FBUyxHQUF1QixFQUFrQixFQUFzQixDQUN0RSxPQUFPLEdBQTBCLEVBQVEsWUFBYSxDQUFJLENBQzVELENBRUEsU0FBZ0IsR0FBMEIsRUFBcUIsRUFBc0IsQ0FDbkYsT0FBTyxFQUFLLEtBQUssRUFBYSxNQUE2QixlQUFlLEVBQUssS0FBSyxDQUN0RixDQzNUQSxTQUFpQixHQUF5QixFQUFxQixFQUF3RCxDQUNySCxJQUFLLElBQU0sS0FBVyxFQUNwQixRQUFRLEtBQUssWUFBWSxFQUFZLFFBQVEsRUFBUSxLQUFLLEtBQUssRUFFL0QsTUFBTSxDQUVWLENDV0EsTUFBTSxHQUF3QixDQUFDLGVBQWdCLGtCQUFtQix1QkFBd0Isa0JBQWtCLEVBQ3RHLEdBQW9CLGtEQUNwQixHQUF3QixDQUM1QixTQUNBLGNBQ0EsY0FDQSxnQkFDQSxnQkFDQSxjQUNBLE9BQ0EsU0FDQSxRQUNBLGNBQ0EseUJBQ0EsY0FDQSxXQUNBLHNCQUNBLG9CQUNBLG1CQUNBLFNBQ0EsY0FDRixFQUNNLEdBQTJCLENBQUMsV0FBWSxtQkFBb0IsZ0JBQWdCLEVBQzVFLEdBQTBCLENBQUMsU0FBVSxLQUFNLFNBQVMsRUFDcEQsR0FBOEIsQ0FBQyxPQUFPLEVBVS9CLEdBQTZGLENBQ3hHLFFBQVMseUJBQ1QsU0FBVSxzREFDVixRQUFBLENBVkEsUUFBUyxDQUNQLFlBQWEseUVBQ2IsS0FBTSxVQUNOLE1BQU8sR0FDVCxDQU1BLEVBQ0EsTUFBTSxRQUFRLEVBQU0sQ0FDbEIsSUFBTSxFQUFXLE1BQU0sRUFBdUIsQ0FBSSxFQUM3QyxJQUNILFFBQVEsTUFBTSxFQUFNLElBQUksbUJBQW1CLENBQUMsRUFDNUMsUUFBUSxLQUFLLENBQUMsR0FHaEIsSUFBTSxFQUErQixDQUFDLEVBQ3RDLElBQUssSUFBTSxLQUFXLEdBQXlCLHlCQUEwQixFQUFTLFdBQVcsRUFBRyxDQUM5RixJQUFNLEVBQTJCLEVBQVEsWUFDekMsR0FBaUMsRUFBUyxDQUFXLEVBQ3JELElBQU0sRUFBeUIsR0FBd0IsRUFBTSxDQUFXLEVBUXhFLEdBTkEsR0FBZ0IsRUFBYSxDQUMzQixvQkFBcUIsQ0FBQyxFQUFLLFNBQVcsRUFBdUIsU0FBUyxpQkFBaUIsQ0FDekYsQ0FBQyxFQUVELEdBQWtCLENBQVcsRUFFekIsRUFBSyxPQUFRLFNBRWpCLElBQU0sRUFBYyxFQUFLLFFBQVUsRUFBSyxLQUFLLEVBQVEsUUFBUyxNQUFNLEVBQUksRUFBUSxRQUNoRixNQUFNLEVBQUcsU0FBUyxNQUFNLEVBQWEsQ0FBRSxVQUFXLEVBQUssQ0FBQyxFQUN4RCxNQUFNLEVBQUcsU0FBUyxVQUFVLEVBQUssS0FBSyxFQUFhLGNBQWMsRUFBRyxLQUFLLFVBQVUsQ0FBVyxFQUFHLE1BQU0sRUFDbkcsRUFBSyxTQUNQLE1BQU0sR0FBd0IsRUFBSyxLQUFLLEVBQWEsTUFBTSxDQUFDLEVBRTlELEVBQWtCLEtBQUssQ0FBTyxDQUNoQyxDQUNJLENBQUMsRUFBSyxRQUFVLENBQUMsRUFBSyxVQUN4QixFQUFjLFVBQVUsRUFBUyxLQUFLLHNCQUF1QixDQUFDLFNBQVMsRUFBRyxDQUN4RSxNQUFPLFNBQ1QsQ0FBQyxFQUNELFFBQVEsS0FBSyx5QkFBeUIsRUFDdEMsTUFBTSxHQUE0QixDQUFpQixFQUV2RCxDQUNGLEVBRUEsU0FBUyxHQUFpQyxFQUFrQixFQUFvQyxDQUM5RixPQUFPLEdBQXVDLEVBQVEsWUFBYSxFQUFRLFFBQVMsQ0FBVyxDQUNqRyxDQUVBLFNBQVMsR0FDUCxFQUNBLEVBQ0EsRUFDVSxDQUNWLElBQU0sRUFBa0MsQ0FBQyxFQUN6QyxJQUFLLElBQU0sS0FBTyxHQUF1QixDQUN2QyxJQUFNLEVBQU8sRUFBWSxJQUFRLENBQUMsRUFDbEMsSUFBSyxHQUFNLENBQUMsRUFBTSxLQUFVLE9BQU8sUUFBUSxDQUFJLEVBQ3pDLEdBQU8sV0FBVyxpQkFBaUIsSUFHckMsRUFBSyxHQUFRLEdBQWlDLEVBQWEsRUFBZ0IsQ0FBSSxFQUMvRSxFQUFzQixLQUFLLEdBQUcsRUFBSSxHQUFHLEdBQU0sRUFHakQsQ0FFQSxPQURBLFFBQVEsS0FBSyx1Q0FBd0MsRUFBc0IsS0FBSyxJQUFJLEdBQUssTUFBTSxFQUN4RixDQUNULENBRUEsU0FBUyxHQUFpQyxFQUFxQixFQUF3QixFQUE2QixDQUNsSCxJQUFNLEVBQXdCLEVBQUssS0FBSyxFQUFhLGVBQWdCRSxHQUFzQixDQUFXLENBQUMsRUFDakcsRUFBZSxFQUFLLFNBQVMsRUFBZ0IsQ0FBcUIsRUFDeEUsT0FBTyxFQUFhLFdBQVcsR0FBRyxFQUFJLEVBQWUsS0FBSyxHQUM1RCxDQUVBLFNBQVNBLEdBQXNCLEVBQTZCLENBQzFELE9BQU8sRUFBWSxRQUFRLGtCQUFtQixFQUFFLENBQ2xELENBRUEsZUFBZSxHQUF3QixFQUFnQyxDQUNyRSxJQUFNLEVBQWdCLEdBQThCLEVBQ3BELE1BQU0sRUFBRyxTQUFTLE1BQU0sRUFBUyxDQUFFLFVBQVcsRUFBSyxDQUFDLEVBQ3BELElBQUssSUFBTSxLQUFVLE1BQU0sRUFBRyxTQUFTLFFBQVEsRUFBZSxDQUFFLGNBQWUsRUFBSyxDQUFDLEVBQUcsQ0FDdEYsR0FBSSxDQUFDLEVBQU8sT0FBTyxHQUFLLENBQUMsRUFBTyxLQUFLLFNBQVMsS0FBSyxFQUFHLFNBRXRELElBQU0sRUFBaUIsRUFBSyxLQUFLLEVBQVMsRUFBTyxJQUFJLEVBQ3JELE1BQU0sRUFBRyxTQUFTLFNBQVMsRUFBSyxLQUFLLEVBQWUsRUFBTyxJQUFJLEVBQUcsQ0FBYyxFQUNoRixNQUFNLEVBQUcsU0FBUyxNQUFNLEVBQWdCLEdBQUssQ0FDL0MsQ0FDQSxRQUFRLEtBQUssbUNBQW1DLEVBQUssU0FBUyxRQUFRLElBQUksRUFBRyxDQUFPLEdBQUssR0FBUyxDQUNwRyxDQUVBLFNBQVMsSUFBd0MsQ0FDL0MsSUFBSSxFQUFpQixFQUFLLFFBQVEsRUFBYyxPQUFPLEtBQUssR0FBRyxDQUFDLEVBQ2hFLE9BQVMsQ0FDUCxJQUFNLEVBQVksRUFBSyxLQUFLLEVBQWdCLFNBQVUsTUFBTSxFQUM1RCxHQUFJLEVBQUcsV0FBVyxDQUFTLEVBQUcsT0FBTyxFQUVyQyxJQUFNLEVBQWdCLEVBQUssUUFBUSxDQUFjLEVBQ2pELEdBQUksSUFBa0IsRUFDcEIsTUFBVSxNQUFNLDJDQUEyQyxFQUU3RCxFQUFpQixDQUNuQixDQUNGLENBRUEsU0FBUyxHQUF3QixFQUEyQyxFQUFvQyxDQUM5RyxHQUFJLEVBQUssUUFHUCxPQUFPLEdBQXNELENBQVcsRUFJMUUsSUFBTSxFQUFzQixPQUFPLEtBQUssRUFBWSxpQkFBbUIsQ0FBQyxDQUFDLEVBR3pFLE9BRkEsT0FBTyxFQUFZLGdCQUNuQixRQUFRLEtBQUssOEJBQThCLEVBQ3BDLENBQ1QsQ0FFQSxTQUFTLEdBQXNELEVBQW9DLENBQ2pHLElBQU0sRUFBVSxFQUFZLGlCQUFtQixDQUFDLEVBRzFDLEVBQXVCLENBQzNCLFlBQ0EsUUFDQSxlQUNBLDZDQUNBLFNBQ0EsUUFDQSxXQUNBLE9BQ0EsWUFDQSxjQUNBLFdBQ0EsUUFDQSxTQUNBLGFBQ0EsV0FDQSxRQUNBLFVBQ0EsbUJBQ0Esb0JBQ0EsVUFDQSxRQUNGLEVBQ00sRUFBd0IsQ0FBQyxFQUMvQixJQUFLLElBQU0sS0FBUSxPQUFPLEtBQUssQ0FBTyxHQUVsQyxFQUFxQixLQUFNLEdBQVMsRUFBSyxTQUFTLENBQUksQ0FBQyxHQUV0RCxFQUFLLFNBQVMsYUFBYSxHQUFLLEVBQUssU0FBUyxRQUFRLEtBR3ZELE9BQU8sRUFBUSxHQUNmLEVBQVksS0FBSyxDQUFJLEdBSXpCLE9BREEsUUFBUSxLQUFLLDJCQUE0QixFQUFZLEtBQUssSUFBSSxHQUFLLE1BQU0sRUFDbEUsQ0FDVCxDQUVBLFNBQVMsR0FBZ0IsRUFBMEIsRUFBaUQsQ0FDbEcsSUFBTSxFQUFnQyxDQUFDLFFBQVMsU0FBVSxTQUFVLE9BQVEsUUFBUyxNQUFNLEVBQ3JGLEVBQW1DLENBQUMsU0FBVSxRQUFRLEVBQ3RELEVBQVcsRUFBWSxTQUFXLENBQUMsRUFDbkMsRUFBMkIsQ0FBQyxFQUNsQyxJQUFLLEdBQU0sQ0FBQyxFQUFNLEtBQVksT0FBTyxRQUFRLENBQU8sR0FFL0MsRUFBUSxxQkFBdUIsSUFBUyxlQUFpQixFQUFRLEtBQUssSUFBTSxlQUM3RSxFQUE4QixLQUFNLEdBQVMsRUFBSyxXQUFXLENBQUksQ0FBQyxHQUVsRSxFQUFpQyxLQUFNLEdBQVMsRUFBUSxTQUFTLENBQUksR0FBSyxFQUFRLEtBQUssSUFBTSxFQUFLLEtBQUssQ0FBQyxLQUd4RyxPQUFPLEVBQVEsR0FDZixFQUFlLEtBQUssQ0FBSSxHQUc1QixRQUFRLEtBQUssbUJBQW9CLEVBQWUsS0FBSyxJQUFJLEdBQUssTUFBTSxDQUN0RSxDQUVBLFNBQVMsR0FBa0IsRUFBZ0MsQ0FDekQsT0FBTyxFQUFZLFFBQ25CLE9BQU8sRUFBWSxjQUNuQixPQUFPLEVBQVksUUFDckIsQ0FFQSxlQUFlLEdBQTRCLEVBQW9DLENBQzdFLElBQUssSUFBTSxLQUFXLEVBQ3BCLE1BQU0sR0FBb0IsQ0FBTyxFQUNqQyxNQUFNLEdBQXlCLENBQU8sRUFDdEMsR0FBdUIsQ0FBTyxDQUVsQyxDQUVBLGVBQWUsR0FBb0IsRUFBaUMsQ0FDbEUsSUFBTSxFQUFnQixDQUNwQixHQUFJLE1BQU0sR0FBNEIsQ0FBTyxFQUM3QyxHQUFJLE1BQU0sR0FBK0IsQ0FBTyxDQUNsRCxFQUNBLFFBQVEsS0FBSywrQkFBZ0MsRUFBYyxLQUFLLElBQUksR0FBSyxNQUFNLENBQ2pGLENBRUEsZUFBZSxHQUE0QixFQUFxQyxDQUM5RSxJQUFNLEVBQXlCLENBQUMsRUFDaEMsSUFBSyxJQUFNLEtBQWdCLEdBQXVCLENBQ2hELElBQU0sRUFBYSxFQUFLLEtBQUssRUFBUSxRQUFTLENBQVksRUFDckQsRUFBRyxXQUFXLENBQVUsSUFFN0IsTUFBTSxFQUFHLFNBQVMsR0FBRyxFQUFZLENBQUUsTUFBTyxHQUFNLFVBQVcsRUFBSyxDQUFDLEVBQ2pFLEVBQWEsS0FBSyxDQUFZLEVBQ2hDLENBQ0EsT0FBTyxDQUNULENBRUEsZUFBZSxHQUErQixFQUFxQyxDQUNqRixJQUFNLEVBQWdCLE1BQU0sRUFBTyxHQUEwQixDQUMzRCxJQUFLLEVBQVEsUUFDYixJQUFLLEdBQ0wsb0JBQXFCLEdBQ3JCLE9BQVEsQ0FBQyxrQkFBbUIscUJBQXNCLFdBQVksY0FBZSxVQUFXLFlBQVksRUFDcEcsVUFBVyxFQUNiLENBQUMsRUFNRCxPQUxBLE1BQU0sUUFBUSxJQUNaLEVBQWMsSUFBSyxHQUNqQixFQUFHLFNBQVMsR0FBRyxFQUFLLEtBQUssRUFBUSxRQUFTLENBQVksRUFBRyxDQUFFLE1BQU8sR0FBTSxVQUFXLEVBQUssQ0FBQyxDQUMzRixDQUNGLEVBQ08sQ0FDVCxDQUVBLGVBQWUsR0FBeUIsRUFBaUMsQ0FFdkUsSUFBTSxHQUFlLE1BRFcsUUFBUSxJQUFJLENBQUMsR0FBeUIsQ0FBTyxFQUFHLEdBQTJCLENBQU8sQ0FBQyxDQUFDLEVBQUEsQ0FDN0UsS0FBSyxFQUM1QyxRQUFRLEtBQUssZ0NBQWlDLEVBQWEsS0FBSyxJQUFJLEdBQUssTUFBTSxDQUNqRixDQUVBLGVBQWUsR0FBeUIsRUFBcUMsQ0FDM0UsSUFBTSxFQUFnQixHQUEwQixDQUFPLEVBQ2pELEVBQXlCLENBQUMsRUFDaEMsSUFBSyxJQUFNLEtBQWdCLEVBQWUsQ0FDeEMsSUFBTSxFQUFhLEVBQUssS0FBSyxFQUFRLFFBQVMsQ0FBWSxFQUNyRCxFQUFHLFdBQVcsQ0FBVSxJQUU3QixNQUFNLEVBQUcsU0FBUyxHQUFHLEVBQVksQ0FBRSxNQUFPLEdBQU0sVUFBVyxFQUFLLENBQUMsRUFDakUsRUFBYSxLQUFLLENBQVksRUFDaEMsQ0FDQSxPQUFPLENBQ1QsQ0FFQSxTQUFTLEdBQTBCLEVBQTRCLENBQzdELElBQU0sRUFBZSxHQUF3QixJQUFLLEdBQVksRUFBSyxLQUFLLEVBQVMsT0FBTyxDQUFDLEVBQ25GLEVBQVMsR0FBK0IsQ0FBTyxFQUNyRCxHQUFJLENBQUMsRUFBUSxPQUFPLEVBRXBCLElBQU0sRUFBa0IsRUFBSyxRQUFRLENBQU0sRUFDM0MsR0FBSSxFQUFLLFNBQVMsQ0FBZSxJQUFNLFNBQVcsQ0FBQyxHQUFvQixFQUFTLENBQWUsRUFDN0YsT0FBTyxFQUVULElBQU0sRUFBZSxFQUFLLFNBQVMsRUFBUSxRQUFTLENBQWUsRUFHbkUsT0FGSyxFQUVFLENBQUMsR0FBRyxJQUFJLElBQUksQ0FBQyxHQUFHLEVBQWMsQ0FBWSxDQUFDLENBQUMsRUFGekIsQ0FHNUIsQ0FFQSxlQUFlLEdBQTJCLEVBQXFDLENBSzdFLE9BQU8sTUFKb0IsUUFBUSxJQUFJLENBQ3JDLEdBQXdDLENBQU8sRUFDL0MsR0FBOEIsQ0FBTyxDQUN2QyxDQUFDLEVBQUEsQ0FDbUIsS0FBSyxDQUMzQixDQUVBLGVBQWUsR0FBd0MsRUFBcUMsQ0FDMUYsSUFBTSxFQUFXLE1BQU0sR0FBMkIsQ0FBTyxFQUV6RCxPQUFPLE1BRG9CLFFBQVEsSUFBSSxFQUFTLElBQUssR0FBWSxHQUFnQyxFQUFTLENBQU8sQ0FBQyxDQUFDLEVBQUEsQ0FDL0YsS0FBSyxDQUMzQixDQUVBLGVBQWUsR0FBMkIsRUFBcUMsQ0FDN0UsSUFBTSxFQUFXLEdBQXdCLElBQUssR0FBWSxFQUFLLEtBQUssRUFBUSxRQUFTLENBQU8sQ0FBQyxFQUN2RixFQUFVLE1BQU0sUUFBUSxJQUFJLEVBQVMsSUFBSyxHQUFZLEdBQVksQ0FBTyxDQUFDLENBQUMsRUFDakYsT0FBTyxFQUFTLFFBQVEsRUFBRyxJQUFVLEVBQVEsRUFBTSxDQUNyRCxDQUVBLGVBQWUsR0FBOEIsRUFBcUMsQ0FDaEYsSUFBTSxFQUFjLEdBQStCLENBQU8sRUFDcEQsRUFBeUIsQ0FBQyxFQUNoQyxJQUFLLElBQU0sS0FBYyxFQUN2QixJQUFLLElBQU0sS0FBYyxHQUF5QixDQUFVLEVBQ3BELE1BQU0sR0FBTyxDQUFVLElBRTdCLE1BQU0sRUFBRyxTQUFTLEdBQUcsRUFBWSxDQUFFLE1BQU8sRUFBSyxDQUFDLEVBQ2hELEVBQWEsS0FBSyxFQUFLLFNBQVMsRUFBUSxRQUFTLENBQVUsQ0FBQyxHQUdoRSxPQUFPLENBQ1QsQ0FFQSxTQUFTLEdBQStCLEVBQTRCLENBQ2xFLElBQU0sRUFBUyxHQUF1QixDQUFPLEVBQ3ZDLEVBQWlCLEdBQStCLENBQU8sRUFDN0QsR0FBSSxDQUFDLEdBQVUsQ0FBQyxFQUFnQixNQUFPLENBQUMsRUFFeEMsSUFBTSxFQUFZLEVBQUssV0FBVyxDQUFNLEVBQ3BDLENBQUMsQ0FBTSxFQUNQLENBQUMsRUFBZ0IsR0FBRyxHQUF3QixJQUFLLEdBQVksRUFBSyxRQUFRLEVBQVEsUUFBUyxFQUFTLENBQU0sQ0FBQyxDQUFDLEVBQ2hILE1BQU8sQ0FBQyxHQUFHLElBQUksSUFBSSxDQUFTLENBQUMsQ0FBQyxDQUFDLE9BQVEsR0FBYSxHQUE4QixFQUFTLENBQVEsQ0FBQyxDQUN0RyxDQUVBLFNBQVMsR0FBOEIsRUFBa0IsRUFBMkIsQ0FDbEYsT0FBTyxHQUFvQixFQUFTLENBQVEsR0FBSyxHQUE4QixFQUFTLENBQVEsQ0FDbEcsQ0FFQSxTQUFTLEdBQThCLEVBQWtCLEVBQTJCLENBR2xGLE9BRktDLEdBQWdCLENBQU8sRUFFckIsR0FBNEIsS0FBTSxHQUFZLENBQ25ELElBQU0sRUFBZSxFQUFLLFNBQVMsRUFBUyxDQUFRLEVBQ3BELE9BQU8sSUFBaUIsSUFBTSxJQUFpQixNQUFRLENBQUMsRUFBYSxXQUFXLEtBQUssQ0FDdkYsQ0FBQyxFQUxxQyxFQU14QyxDQUVBLFNBQVMsR0FBeUIsRUFBOEIsQ0FDOUQsTUFBTyxDQUNMLEVBQ0EsR0FBRyxFQUFXLFVBQ2QsR0FBRyxFQUFXLE1BQ2QsR0FBRyxFQUFXLE1BQ2QsR0FBRyxFQUFXLFVBQ2QsR0FBRyxFQUFXLE1BQ2QsR0FBRyxFQUFXLEtBQ2hCLENBQ0YsQ0FFQSxTQUFTLEdBQW9CLEVBQWtCLEVBQTZCLENBQzFFLElBQU0sRUFBZSxFQUFLLFNBQVMsRUFBUSxRQUFTLENBQVUsRUFFOUQsT0FBTyxJQUFpQixJQUFPLElBQWlCLE1BQVEsQ0FBQyxFQUFhLFdBQVcsS0FBSyxFQUFLLEtBQUssQ0FDbEcsQ0FFQSxTQUFTQSxHQUFnQixFQUEyQixDQUNsRCxNQUFPLENBQUMsQ0FBQyxFQUFRLElBQUksV0FBYSxFQUFRLElBQUksWUFBYyxLQUFPLEVBQVEsSUFBSSxZQUFjLE9BQy9GLENBRUEsZUFBZSxHQUFPLEVBQW9DLENBQ3hELEdBQUksQ0FFRixPQUFPLE1BRFksRUFBRyxTQUFTLEtBQUssQ0FBUSxFQUFBLENBQ2hDLE9BQU8sQ0FDckIsTUFBUSxDQUNOLE1BQU8sRUFDVCxDQUNGLENBRUEsZUFBZSxHQUFZLEVBQW1DLENBQzVELEdBQUksQ0FFRixPQUFPLE1BRFksRUFBRyxTQUFTLEtBQUssQ0FBTyxFQUFBLENBQy9CLFlBQVksQ0FDMUIsTUFBUSxDQUNOLE1BQU8sRUFDVCxDQUNGLENBRUEsZUFBZSxHQUFnQyxFQUFrQixFQUFvQyxDQUVuRyxJQUFNLEdBQWtCLE1BREYsRUFBRyxTQUFTLFFBQVEsRUFBUyxDQUFFLGNBQWUsRUFBSyxDQUFDLEVBQUEsQ0FFdkUsT0FBUSxHQUFXLEVBQU8sT0FBTyxHQUFLLEdBQWtCLEtBQUssRUFBTyxJQUFJLENBQUMsQ0FBQyxDQUMxRSxJQUFLLEdBQVcsRUFBTyxJQUFJLEVBQzlCLE1BQU0sUUFBUSxJQUFJLEVBQWdCLElBQUssR0FBYSxFQUFHLFNBQVMsR0FBRyxFQUFLLEtBQUssRUFBUyxDQUFRLEVBQUcsQ0FBRSxNQUFPLEVBQUssQ0FBQyxDQUFDLENBQUMsRUFFbEgsSUFBTSxFQUFrQixFQUFLLFNBQVMsRUFBUSxRQUFTLENBQU8sRUFDOUQsT0FBTyxFQUFnQixJQUFLLEdBQWEsRUFBSyxLQUFLLEVBQWlCLENBQVEsQ0FBQyxDQUMvRSxDQUVBLFNBQVMsR0FBdUIsRUFBd0IsQ0FDdEQsR0FBSSxDQUFDQSxHQUFnQixDQUFPLEVBQUcsT0FFL0IsSUFBTSxFQUFhLEVBQUssS0FBSyxFQUFRLFFBQVMsT0FBUSxZQUFZLEVBQzdELEtBQUcsV0FBVyxDQUFVLEdBRWRDLEVBQWMsVUFBVSxPQUFRLENBQUMsRUFBWSxnQkFBZ0IsRUFBRyxDQUM3RSxJQUFLLEVBQVEsUUFDYixNQUFPLFNBQ1QsQ0FDUyxDQUFDLENBQUMsU0FBVyxFQUNwQixNQUFVLE1BQU0saUJBQWlCLEVBQUssU0FBUyxFQUFRLFFBQVMsQ0FBVSxHQUFHLENBRWpGLENDeGFBLE1BQU1DLEVBQVUsQ0FBQyxFQUVKLEdBQStCLENBQzFDLFFBQVMsU0FDVCxRQUFTLENBQUMsSUFBSSxFQUNkLFNBQ0UsMkxBQ0YsUUFBVSxHQUNELEVBQ0osb0JBQW9CLENBQUUsYUFBYyxFQUFLLENBQUMsQ0FBQyxDQUMzQyxRQUFRLEVBQXdCLENBQUMsQ0FDakMsUUFBUSxFQUE2QixDQUFDLENBQ3RDLFFBQVEsRUFBYSxDQUFDLENBQ3RCLFFBQVEsRUFBa0IsQ0FBQyxDQUMzQixRQUFRLEVBQWUsQ0FBQyxDQUN4QixRQUFRLEVBQWtCLENBQUMsQ0FDM0IsUUFBUSxFQUFjLENBQUMsQ0FDdkIsUUFBUSxFQUFpQixDQUFDLENBQzFCLFFBQVEsRUFBWSxDQUFDLENBQ3JCLFFBQVEsRUFBYyxDQUFDLENBQ3ZCLFFBQVEsRUFBVyxDQUFDLENBQ3BCLFFBQVEsRUFBYSxDQUFDLENBQ3RCLFFBQVEsRUFBYyxDQUFDLENBQ3ZCLGNBQWMsQ0FBQyxDQUNmLE9BQU8sRUFBSyxFQUVqQixTQUFVLENBRVYsQ0FDRixFQUVNLEdBQXdGLENBQzVGLFFBQVMscUJBQ1QsU0FBVSxxQ0FDVixRQUFBLEVBQ0EsTUFBTSxRQUFRLEVBQU0sQ0FDbEIsSUFBTSxFQUFjLE1BQU0sRUFBd0IsQ0FBSSxFQUN0RCxJQUFLLEdBQU0sQ0FBRSxNQUFLLGFBQWEsRUFBb0Msd0JBQXlCLENBQVcsRUFDckcsTUFBTSxFQUFhLEVBQXNCLENBQUcsQ0FBQyxDQUFDLGtCQUFrQixDQUFPLEVBQUcsRUFBUyxDQUFJLENBRTNGLENBQ0YsRUFXTSxHQUdGLENBQ0YsUUFBUywyQkFDVCxTQUFVLHVDQUNWLFFBQVMsQ0FkVCxHQUFHQSxFQUNILE9BQVEsQ0FDTixZQUFhLG9EQUNiLEtBQU0sU0FDTixRQUFTLHFCQUNYLENBU3FDLEVBQ3JDLE1BQU0sUUFBUSxFQUFNLENBQ2xCLElBQU0sRUFBYyxNQUFNLEVBQXdCLENBQUksRUFDdEQsR0FBSSxFQUFZLE9BQVMsRUFDdkIsTUFBVSxNQUNSLDJIQUNGLEVBRUYsSUFBSyxHQUFNLENBQUUsTUFBSyxhQUFhLEVBQW9DLDhCQUErQixDQUFXLEVBQzNHLEdBQXVCLEVBQVMsRUFBSyxFQUFLLE1BQU0sQ0FFcEQsQ0FDRixFQUVNLEdBQTZFLENBQ2pGLFFBQVMsU0FDVCxTQUFVLGdEQUNWLFFBQUEsRUFDQSxNQUFNLFFBQVEsRUFBTSxDQUNsQixJQUFNLEVBQWMsTUFBTSxFQUF3QixDQUFJLEVBQ2hELEVBQWlCLEdBQXNCLENBQUksRUFDakQsSUFBSyxHQUFNLENBQUUsTUFBSyxhQUFhLEVBQW9DLFlBQWEsQ0FBVyxFQUN6RixNQUFNLEVBQ0osRUFBb0IsRUFBSyxFQUFTLEVBQXNCLENBQUcsQ0FBQyxDQUFDLE9BQU8sRUFBUyxDQUFjLENBQUMsRUFDNUYsRUFDQSxDQUNGLENBRUosQ0FDRixFQUVNLEdBQWtGLENBQ3RGLFFBQVMsZUFDVCxTQUFVLHVGQUNWLFFBQUEsRUFDQSxNQUFNLFFBQVEsRUFBTSxDQUNsQixJQUFNLEVBQWMsTUFBTSxFQUF3QixDQUFJLEVBQ3RELElBQUssR0FBTSxDQUFFLE1BQUssYUFBYSxFQUFvQyxrQkFBbUIsQ0FBVyxFQUMvRixNQUFNLEVBQWEsRUFBc0IsQ0FBRyxDQUFDLENBQUMsWUFBWSxDQUFPLEVBQUcsRUFBUyxDQUFJLENBRXJGLENBQ0YsRUFFTSxHQUErRSxDQUNuRixRQUFTLFdBQ1QsU0FBVSwyQkFDVixRQUFBLEVBQ0EsTUFBTSxRQUFRLEVBQU0sQ0FDbEIsSUFBTSxFQUFjLE1BQU0sRUFBd0IsQ0FBSSxFQUNoRCxFQUFpQixHQUFzQixDQUFJLEVBQ2pELElBQUssR0FBTSxDQUFFLE1BQUssYUFBYSxFQUFvQyxjQUFlLENBQVcsRUFDM0YsTUFBTSxFQUFhLEVBQXNCLENBQUcsQ0FBQyxDQUFDLFNBQVMsRUFBUyxDQUFjLEVBQUcsRUFBUyxDQUFJLENBRWxHLENBQ0YsRUFFTSxHQUEwQixDQUM5QixHQUFHQSxFQUNILE9BQVEsQ0FDTixZQUFhLDZDQUNiLEtBQU0sUUFDUixDQUNGLEVBRU0sR0FBa0csQ0FDdEcsUUFBUyxlQUNULFNBQVUsMEJBQ1YsUUFBUyxHQUNULE1BQU0sUUFBUSxFQUFNLENBQ2xCLElBQU0sRUFBYyxNQUFNLEVBQXdCLENBQUksRUFDdEQsSUFBSyxHQUFNLENBQUUsTUFBSyxhQUFhLEVBQW9DLGtCQUFtQixDQUFXLEVBQy9GLE1BQU0sRUFBYSxFQUFzQixDQUFHLENBQUMsQ0FBQyxZQUFZLEVBQVMsRUFBSyxNQUFNLEVBQUcsRUFBUyxDQUFJLENBRWxHLENBQ0YsRUFVTSxHQUFxRixDQUN6RixRQUFTLFVBQ1QsU0FBVSw2Q0FDVixRQUFTLENBVlQsR0FBR0EsRUFDSCxvQkFBcUIsQ0FDbkIsWUFBYSwrREFDYixLQUFNLFNBQ1IsQ0FNc0IsRUFDdEIsTUFBTSxRQUFRLEVBQU0sQ0FDbEIsSUFBTSxFQUFjLE1BQU0sRUFBd0IsQ0FBSSxFQUNoRCxFQUFpQixHQUFzQixFQUFNLENBQUMsbUJBQW1CLENBQUMsRUFDeEUsSUFBSyxHQUFNLENBQUUsTUFBSyxhQUFhLEVBQW9DLGFBQWMsQ0FBVyxFQUFHLENBQzdGLElBQU0sRUFBYSxFQUFzQixDQUFHLEVBQzVDLE1BQU0sRUFBYSxFQUFvQixFQUFLLEVBQVMsRUFBVyxRQUFRLEVBQVMsQ0FBYyxDQUFDLEVBQUcsRUFBUyxDQUFJLEVBQzVHLEdBQXVCLEVBQVMsRUFBSyxnQkFBZ0IsSUFDbkQsR0FBd0IsQ0FBTyxFQUNqQyxRQUFRLEtBQUssRUFBTSxPQUFPLGtDQUFrQyxFQUFRLEtBQUssNEJBQTRCLENBQUMsRUFFdEcsTUFBTSxFQUNKLEVBQW9CLEVBQUssRUFBUyxFQUFXLE9BQU8sRUFBUyxDQUFjLENBQUMsRUFDNUUsRUFDQSxDQUNGLEVBR04sQ0FDRixDQUNGLEVBRUEsU0FBUyxHQUF1QixFQUFrQixFQUFnRCxDQUNoRyxPQUFPLEdBQW9CLEdBQWdCLENBQU8sQ0FDcEQsQ0FFQSxTQUFTLEdBQWdCLEVBQTJCLENBQ2xELE1BQU8sQ0FBQyxDQUFDLEVBQVEsSUFBSSxXQUFhLEVBQVEsSUFBSSxZQUFjLEtBQU8sRUFBUSxJQUFJLFlBQWMsT0FDL0YsQ0FFQSxTQUFTLEdBQXdCLEVBQTJCLENBQzFELE9BQU8sR0FBcUIsRUFBUyxZQUFZLENBQ25ELENBRUEsTUFBTSxHQUFpRixDQUNyRixRQUFTLGNBQ1QsU0FBVSwwQkFDVixRQUFBLEVBQ0EsTUFBTSxRQUFRLEVBQU0sQ0FDbEIsSUFBTSxFQUFjLE1BQU0sRUFBd0IsQ0FBSSxFQUNoRCxFQUFpQixHQUFzQixDQUFJLEVBQ2pELElBQUssR0FBTSxDQUFFLE1BQUssYUFBYSxFQUFvQyxpQkFBa0IsQ0FBVyxFQUM5RixNQUFNLEVBQWEsRUFBc0IsQ0FBRyxDQUFDLENBQUMsV0FBVyxFQUFTLENBQWMsRUFBRyxFQUFTLENBQUksQ0FFcEcsQ0FDRixFQUVNLEdBQTRFLENBQ2hGLFFBQVMsUUFDVCxTQUFVLFdBQ1YsUUFBQSxFQUNBLE1BQU0sUUFBUSxFQUFNLENBQ2xCLElBQU0sRUFBYyxNQUFNLEVBQXdCLENBQUksRUFDaEQsRUFBaUIsR0FBc0IsQ0FBSSxFQUNqRCxJQUFLLEdBQU0sQ0FBRSxNQUFLLGFBQWEsRUFBb0MsV0FBWSxDQUFXLEVBQ3hGLE1BQU0sRUFDSixFQUFvQixFQUFLLEVBQVMsRUFBc0IsQ0FBRyxDQUFDLENBQUMsTUFBTSxFQUFTLENBQWMsQ0FBQyxFQUMzRixFQUNBLENBQ0YsRUFHRixHQUFJLFFBQVEsSUFBSSxTQUFXLE9BQVEsQ0FDakMsUUFBUSxJQUFJLE9BQVMsT0FDckIsSUFBSyxHQUFNLENBQUUsTUFBSyxhQUFhLEVBQzdCLHVCQUNBLE1BQU0sRUFBd0IsQ0FBSSxDQUNwQyxFQUNFLE1BQU0sRUFDSixFQUFvQixFQUFLLEVBQVMsRUFBc0IsQ0FBRyxDQUFDLENBQUMsTUFBTSxFQUFTLENBQWMsQ0FBQyxFQUMzRixFQUNBLENBQ0YsQ0FFSixDQUNGLENBQ0YsRUFVTSxHQUFxRixDQUN6RixRQUFTLFVBQ1QsU0FBVSxzQ0FDVixRQUFTLENBVlQsR0FBRyxHQUNILE9BQVEsQ0FDTixZQUFhLDRGQUNiLEtBQU0sUUFDUixDQU1zQixFQUN0QixNQUFNLFFBQVEsRUFBTSxDQUNsQixJQUFNLEVBQWMsTUFBTSxFQUF3QixDQUFJLEVBQ3RELElBQUssR0FBTSxDQUFFLE1BQUssYUFBYSxFQUFvQyxhQUFjLENBQVcsRUFBRyxDQUM3RixJQUFNLEVBQVMsRUFBSyxRQUFVLEdBQXdCLEVBQVMsQ0FBRyxFQUNsRSxNQUFNLEVBQWEsRUFBc0IsQ0FBRyxDQUFDLENBQUMsUUFBUSxFQUFTLEVBQVEsRUFBSyxNQUFNLEVBQUcsRUFBUyxDQUFJLENBQ3BHLENBQ0YsQ0FDRixFQVdNLEdBQStFLENBQ25GLFFBQVMsT0FDVCxTQUFVLDZCQUNWLFFBQVMsQ0FYVCxHQUFHQSxFQUNILEtBQU0sQ0FDSixNQUFPLElBQ1AsWUFBYSwyQkFDYixLQUFNLFFBQ1IsQ0FNbUIsRUFDbkIsTUFBTSxRQUFRLEVBQU0sQ0FDbEIsSUFBTSxFQUFjLE1BQU0sRUFBd0IsQ0FBSSxFQUN0RCxJQUFLLEdBQU0sQ0FBRSxNQUFLLGFBQWEsRUFBb0MsVUFBVyxDQUFXLEVBQ3ZGLE1BQU0sRUFDSixFQUFvQixFQUFLLEVBQVMsRUFBc0IsQ0FBRyxDQUFDLENBQUMsS0FBSyxFQUFTLEVBQUssSUFBSSxDQUFDLEVBQ3JGLEVBQ0EsQ0FDRixDQUVKLENBQ0YsRUFjTSxHQUFtRixDQUN2RixRQUFTLDBCQUNULFNBQVUsdUJBQ1YsUUFBUyxDQWRULEdBQUdBLEVBQ0gsaUJBQWtCLENBQ2hCLFlBQWEsOEJBQ2IsS0FBTSxRQUNSLEVBQ0EsU0FBVSxDQUNSLFlBQWEsZ0ZBQ2IsS0FBTSxTQUNSLENBTXFCLEVBQ3JCLE1BQU0sUUFBUSxFQUFNLENBQ2xCLEdBQUksRUFBSyxVQUFZLEVBQUssWUFDeEIsTUFBVSxNQUFNLDBEQUEwRCxFQUc1RSxJQUFNLEVBQWMsTUFBTSxFQUF3QixDQUFJLEVBQ2hELEVBQWlCLEdBQXNCLEVBQU0sQ0FBQyxpQkFBa0IsVUFBVSxDQUFDLEVBQ2pGLElBQUssR0FBTSxDQUFFLE1BQUssYUFBYSxFQUFvQyxZQUFhLENBQVcsRUFBRyxDQUM1RixJQUFNLEVBQWMsRUFBSyxTQUNyQixFQUFRLFlBQVksY0FBYyxNQUNoQyxzQkFDQSwwQkFDRixFQUFLLGFBQWEsU0FBUyxFQUMvQixNQUFNLEVBQ0osRUFBb0IsRUFBSyxFQUFTLEVBQXNCLENBQUcsQ0FBQyxDQUFDLE9BQU8sRUFBUyxFQUFhLENBQWMsQ0FBQyxFQUN6RyxFQUNBLENBQ0YsQ0FDRixDQUNGLENBQ0YsRUFJTSxHQUE0RixDQUNoRyxRQUFTLGNBQ1QsU0FDRSxzSEFDRixRQUFTLENBTnFCLEtBQU0sQ0FBRSxLQUFNLE9BQVEsQ0FNdkIsRUFDN0IsTUFBTSxRQUFRLEVBQU0sQ0FDbEIsSUFBTSxFQUFjLE1BQU0sRUFBd0IsQ0FBSSxFQUdoRCxFQUFjLEVBRkosRUFBSyxNQUFNLEtBQUssR0FBRyxHQUFLLEdBQUEsQ0FBSSxRQUVsQixFQURILEdBQXNCLEVBQU0sQ0FBQyxNQUFNLENBQ2hCLENBQUMsQ0FBQyxDQUFDLE9BQU8sT0FBTyxDQUFDLENBQUMsS0FBSyxHQUFHLEVBQ3JFLElBQUssR0FBTSxDQUFFLE1BQUssYUFBYSxFQUFvQyxNQUFNLElBQWUsQ0FBVyxFQUVqRyxNQUFNLEVBQWEsRUFBb0IsRUFBSyxFQUQ1QixJQUFRLFNBQVcsVUFBVSxJQUFnQixHQUF1QixFQUFTLENBQVcsQ0FDNUMsRUFBRyxFQUFTLENBQUksQ0FFaEYsQ0FDRixFQU1BLFNBQVMsRUFBb0IsRUFBa0IsRUFBa0IsRUFBd0IsQ0FDdkYsT0FBTyxJQUFRLFVBQVksR0FBMkIsRUFBUyxDQUFNLEVBQUksQ0FDM0UsQ0FFQSxTQUFTLEdBQXVCLEVBQWtCLEVBQWtCLEVBQTBCLENBQzVGLElBQU0sRUFBUyxHQUFvQixFQUFTLENBQUcsRUFDekMsRUFBa0IsQ0FDdEIsb0NBQXFDLEVBQVEsSUFBSSxvQ0FDakQscUNBQXNDLEVBQVEsSUFBSSxxQ0FDbEQsdUNBQXdDLEVBQVEsSUFBSSx1Q0FDcEQsMkNBQTRDLEVBQVEsSUFBSSwwQ0FDMUQsRUFDTSxFQUFpQixPQUFPLFFBQVEsQ0FBZSxDQUFDLENBQ25ELFFBQVEsRUFBRyxLQUFXLENBQUMsQ0FBSyxDQUFDLENBQzdCLEtBQUssQ0FBQyxLQUFTLENBQUcsRUFDckIsR0FBSSxFQUFlLE9BQVMsRUFDMUIsTUFBVSxNQUFNLGlEQUFpRCxFQUFlLEtBQUssSUFBSSxHQUFHLEVBRzlGLElBQU0sRUFBbUI7Ozs7WUFJZixFQUFPOzs7OzswQkFLTyxFQUFnQixvQ0FBb0M7Z0JBQzlELEVBQWdCLHFDQUFxQzt1QkFDOUMsRUFBZ0IsdUNBQXVDOzJCQUNuRCxFQUFnQiwyQ0FBMkM7O0VBSXBGLEdBQUksQ0FDRixFQUFHLGNBQWMsRUFBWSxDQUFnQixFQUM3QyxRQUFRLEtBQUssYUFBYSxHQUFZLENBQ3hDLE9BQVMsRUFBTyxDQUNkLElBQU0sRUFBUyxhQUFpQixNQUFRLEVBQU0sUUFBVSxPQUFPLENBQUssRUFDcEUsTUFBVSxNQUFNLG1CQUFtQixFQUFXLElBQUksSUFBVSxDQUMxRCxNQUFPLENBQ1QsQ0FBQyxDQUNILENBQ0YsQ0FFQSxTQUFTLEdBQXdCLEVBQWtCLEVBQTBCLENBRzNFLE9BRkksSUFBUSxTQUNILEVBQVEsWUFBWSxjQUFjLE1BQVEsc0JBQXdCLDBCQUNwRSwwQkFDVCxDQUVBLFNBQVMsR0FBb0IsRUFBa0IsRUFBMEIsQ0FDdkUsR0FBSSxJQUFRLFNBRVYsTUFBTyxHQURTLEVBQVEsWUFBWSxjQUFjLE1BQVEsS0FBTyxTQUMvQyxxQkFHcEIsSUFBTSxFQUFTLEdBQStCLENBQU8sRUFDckQsR0FBSSxDQUFDLEVBQ0gsTUFBVSxNQUFNLHlFQUF5RSxFQUUzRixPQUFPLENBQ1QsQ0FPQSxlQUFlLEVBQXdCLEVBQXdCLEVBQWtELENBQy9HLElBQU0sRUFBVyxNQUFNLEVBQXVCLENBQUksRUFDN0MsSUFDSCxRQUFRLE1BQU0sRUFBTSxJQUFJLG1CQUFtQixDQUFDLEVBQzVDLFFBQVEsS0FBSyxDQUFDLEdBR2hCLElBQU0sRUFBVyxFQUFTLFlBQ3ZCLElBQUssR0FBYSxFQUFRLFlBQWMsQ0FBRSxVQUFTLElBQUssRUFBUSxXQUFZLEVBQUksSUFBQSxFQUFVLENBQUMsQ0FDM0YsT0FBUSxHQUEyQyxDQUFDLENBQUMsSUFBWSxDQUFDLEdBQU8sRUFBUSxNQUFRLEVBQUksRUFLaEcsT0FKSSxFQUFTLFNBQVcsSUFDdEIsUUFBUSxNQUFNLEVBQU0sSUFBSSxFQUFNLE1BQU0sRUFBSSxpQkFBbUIsMENBQTBDLENBQUMsRUFDdEcsUUFBUSxLQUFLLENBQUMsR0FFVCxDQUNULENBRUEsU0FBUyxFQUFzQixFQUFnRSxDQUM3RixPQUFPLElBQVEsU0FBVyxHQUFnQixFQUM1QyxDQUVBLFNBQVUsRUFDUixFQUNBLEVBQzhDLENBQzlDLElBQU0sRUFBc0IsSUFBSSxJQUFJLEVBQVMsSUFBSyxHQUFZLENBQUMsRUFBUSxRQUFTLENBQU8sQ0FBQyxDQUFDLEVBQ3pGLElBQUssSUFBTSxLQUFXLEdBQ3BCLEVBQ0EsRUFBUyxLQUFLLENBQUUsYUFBYyxDQUFPLENBQ3ZDLEVBQUcsQ0FDRCxJQUFNLEVBQWEsRUFBb0IsSUFBSSxDQUFPLEVBQ2xELEdBQUksQ0FBQyxFQUFZLE1BQVUsTUFBTSxxQ0FBcUMsRUFBUSxLQUFLLEVBQUUsRUFFckYsTUFBTSxDQUNSLENBQ0YsQ0FLQSxTQUFnQixHQUFzQixFQUErQixFQUF5QixDQUFDLEVBQVcsQ0FDeEcsSUFBTSxFQUEyQixDQUFDLEVBRzVCLEVBQW1CLE9BQU8sS0FBSyxFQUFvQixFQUNuRCxFQUFzQixPQUFPLE9BQU8sRUFBb0IsQ0FBQyxDQUM1RCxRQUFTLEdBQ0osVUFBVyxFQUNOLE1BQU0sUUFBUSxFQUFPLEtBQUssRUFBSSxFQUFPLE1BQVEsQ0FBQyxFQUFPLEtBQUssRUFFNUQsQ0FBQyxDQUNULENBQUMsQ0FDRCxJQUFJLE1BQU0sRUFFUCxFQUFrQixJQUFJLElBQUksQ0FDOUIsR0FBRyxFQUNILEdBQUcsRUFDSCxHQUFHLEVBRUgsS0FDQSxJQUNBLElBQ0YsQ0FBQyxFQUVELElBQUssR0FBTSxDQUFDLEVBQUssS0FBVSxPQUFPLFFBQVEsQ0FBSSxFQUM1QyxHQUFJLENBQUMsRUFBZ0IsSUFBSSxDQUFHLEVBQUcsQ0FHN0IsSUFBTSxFQUFlLEVBQUksV0FBVyxTQUFXLEdBQVUsSUFBSSxFQUFNLFlBQVksR0FBRyxFQUNsRixHQUFJLElBQWlCLEdBQU8sRUFBSyxLQUFrQixJQUFBLEdBQ2pELFNBSUYsR0FBSSxPQUFPLEdBQVUsV0FBYSxFQUNoQyxFQUFlLEtBQUssS0FBSyxHQUFLLE9BRzNCLEdBQUksT0FBTyxHQUFVLFVBQVksT0FBTyxHQUFVLFNBQ3JELEVBQWUsS0FBSyxLQUFLLElBQU8sT0FBTyxDQUFLLENBQUMsT0FHMUMsR0FBSSxNQUFNLFFBQVEsQ0FBSyxFQUMxQixJQUFLLElBQU0sS0FBUSxFQUNqQixFQUFlLEtBQUssS0FBSyxJQUFPLE9BQU8sQ0FBSSxDQUFDLENBR2xELENBR0YsSUFBTSxFQUFrQixNQUFNLFFBQVEsRUFBSyxLQUFLLEVBQUksRUFBSyxLQUFLLENBQUMsSUFBSSxNQUFNLEVBQUksQ0FBQyxFQUM5RSxPQUFPLEVBQWtCLENBQUMsR0FBRyxFQUFnQixHQUFHLENBQWUsQ0FBQyxDQUNsRSxDQ2xlQSxNQUFhLEdBR1QsQ0FDRixRQUFTLDRCQUNULFNBQVUsNENBQ1YsUUFBQSxDQXpCQSxNQUFPLENBQ0wsWUFBYSx3QkFDYixLQUFNLFNBQ04sTUFBTyxJQUNQLFFBQVMsQ0FDWCxDQW9CQSxFQUNBLE1BQU0sUUFBUSxFQUFNLENBQ2xCLElBQU0sRUFBVSxFQUFnQixDQUFJLEVBQy9CLElBQ0gsUUFBUSxNQUFNLEVBQU0sSUFBSSxtQkFBbUIsQ0FBQyxFQUM1QyxRQUFRLEtBQUssQ0FBQyxHQUdoQixJQUFNLEVBQWEsQ0FBQyxFQUFLLFFBQVMsR0FBSSxFQUFLLE1BQVEsQ0FBQyxFQUFJLEdBQUcsRUFBSyxFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLE9BQU8sRUFDdEYsRUFBYSxFQUNqQixJQUFLLElBQUksRUFBSSxFQUFHLEVBQUksRUFBSyxNQUFPLElBYTlCLEdBWkksRUFBSSxHQUNOLFFBQVEsS0FBSyxLQUFLLEVBQU0sT0FBTyxJQUFJLEVBQUUsYUFBYSxFQUFXLEtBQUssR0FBRyxHQUFHLEdBQUcsRUFHN0UsRUFBYSxNQUFNLEVBQWEsRUFBVyxLQUFLLEdBQUcsRUFBRyxFQUFTLEVBQU0sQ0FDbkUsYUFBYyxHQUNkLFNBQVcsR0FBVyxDQUNoQixHQUNGLFFBQVEsS0FBSyxDQUFDLENBRWxCLENBQ0YsQ0FBQyxFQUNHLElBQWUsRUFBRyxPQUV4QixRQUFRLEtBQUssQ0FBVSxDQUN6QixDQUNGLEVDN0NhLEdBQTRFLENBQ3ZGLFFBQVMsUUFDVCxTQUFVLHlEQUNWLFFBQUEsQ0FBQSxFQUNBLE1BQU0sUUFBUSxFQUFNLENBQ2xCLE1BQU0sR0FBTSxDQUFJLENBQ2xCLENBQ0YsRUFHQSxlQUFzQixHQUNwQixFQUNBLEVBQ2UsQ0FDZixJQUFNLEVBQVcsTUFBTSxFQUF1QixFQUFNLEdBQU8sQ0FBcUIsRUFDM0UsSUFDSCxRQUFRLE1BQU0sRUFBTSxJQUFJLG1CQUFtQixDQUFDLEVBQzVDLFFBQVEsS0FBSyxDQUFDLEdBR2hCLElBQUssSUFBTSxLQUFXLEdBQXlCLFFBQVMsRUFBUyxXQUFXLEVBQUcsQ0FDN0UsSUFBTSxFQUFVLE1BQU1HLEVBQUcsUUFBUSxFQUFRLFFBQVMsQ0FBRSxjQUFlLEVBQUssQ0FBQyxFQVl6RSxHQVhJLElBQVksRUFBUyxPQUNuQixFQUFHLFNBQVMsSUFBTSxVQUVwQixNQUFNLEVBQXVCLGdCQUFnQixDQUQzQixRQUNrQyxDQUFDLENBQUMsS0FBSyxHQUFHLElBQUssRUFBUyxDQUFJLEVBRzlFLEVBQVEsS0FBTSxHQUFNLEVBQUUsT0FBTyxHQUFLLEVBQUUsS0FBSyxTQUFTLFVBQVUsQ0FBQyxHQUMvRCxNQUFNLEVBQWEsZUFBZ0IsRUFBUyxFQUFNLENBQUUsYUFBYyxFQUFNLENBQUMsR0FJekUsRUFBUSxLQUFNLEdBQU0sRUFBRSxPQUFPLEdBQUssRUFBRSxPQUFTLGdCQUFnQixFQUFHLENBQ2xFLE1BQU0sRUFBdUIsNENBQTZDLEVBQVMsQ0FBSSxFQUN2RixHQUFNLEVBQUcsR0FBV0MsRUFBYyxTQUFTLHFCQUFxQixDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsTUFBTSxLQUFLLEVBQy9GLE1BQU0sRUFBdUIsa0JBQWtCLElBQVcsRUFBUyxDQUFJLEVBQ3ZFLE1BQU0sR0FBWSxXQUFXLEVBQzdCLE1BQU0sRUFBYSx1Q0FBd0MsRUFBUyxDQUFJLEVBQ3hFLE1BQU0sRUFBYSx3QkFBeUIsRUFBUyxDQUFJLENBQzNELEVBR0csSUFBWSxFQUFTLE1BQVEsQ0FBQyxFQUFTLEtBQUssWUFBWSxVQUFVLGNBQ25FLEVBQVEsWUFBWSxVQUFVLGFBRTlCLE1BQU0sRUFBYSxHQUFHLEVBQVEseUJBQXlCLFdBQVksRUFBUyxDQUFJLENBRXBGLENBRUEsSUFBTSxFQUFVLEVBQVMsWUFBWSxLQUFNLEdBQU0sRUFBRSxZQUFZLGlCQUFpQixVQUFVLEVBQ3RGLEdBQ0YsTUFBTSxFQUFhLEdBQUcsRUFBUSx5QkFBeUIsaUNBQWtDLEVBQVMsQ0FBSSxDQUUxRyxDQ3REQSxNQUFNLEdBQWlCLENBQUMsZUFBZ0Isa0JBQW1CLHVCQUF3QixrQkFBa0IsRUFDL0YsR0FBOEIsNkVBVXZCLEdBQXdHLENBQ25ILFFBQVMseUJBQ1QsU0FBVSxrREFDVixRQUFBLENBVkEsVUFBVyxDQUNULFlBQWEsMENBQ2IsS0FBTSxTQUNOLFFBQVMsY0FDWCxDQU1BLEVBQ0EsTUFBTSxRQUFRLEVBQU0sQ0FDbEIsSUFBTSxFQUFXLEdBQXdCLEVBQU0sRUFBSyxFQUMvQyxJQUNILFFBQVEsTUFBTSxFQUFNLElBQUksbUJBQW1CLENBQUMsRUFDNUMsUUFBUSxLQUFLLENBQUMsR0FHaEIsSUFBTSxFQUFhLEVBQUssUUFBUSxFQUFTLEtBQUssUUFBUyxFQUFLLE1BQU0sRUFDbEUsR0FBbUIsRUFBUyxLQUFLLFFBQVMsQ0FBVSxFQUNwRCxJQUFNLEVBQWlCLE1BQU0sR0FBdUIsRUFBUyxLQUFLLFFBQVMsRUFBUyxLQUFLLFlBQWEsQ0FBVSxFQUVoSCxHQUFJLEVBQUssT0FBUSxDQUNmLEdBQWtCLEVBQVksQ0FBYyxFQUM1QyxNQUNGLENBRUEsTUFBTSxFQUFHLFNBQVMsR0FBRyxFQUFZLENBQUUsVUFBVyxHQUFNLE1BQU8sRUFBSyxDQUFDLEVBQ2pFLE1BQU0sRUFBRyxTQUFTLE1BQU0sRUFBWSxDQUFFLFVBQVcsRUFBSyxDQUFDLEVBQ3ZELElBQUssSUFBTSxLQUFrQixFQUFlLE9BQU8sRUFDakQsTUFBTSxFQUFHLFNBQVMsR0FBRyxFQUFlLGNBQWUsRUFBZSxjQUFlLENBQy9FLFVBQVcsR0FDWCxNQUFPLEdBQ1AsT0FBUyxHQUFRLENBQ2YsSUFBTSxFQUFXLEVBQUssU0FBUyxFQUFlLGNBQWUsQ0FBRyxDQUFDLENBQUMsTUFBTSxFQUFLLEdBQUcsRUFDaEYsTUFBTyxDQUFDLEVBQVMsU0FBUyxjQUFjLEdBQUssQ0FBQyxFQUFTLFNBQVMsTUFBTSxDQUN4RSxDQUNGLENBQUMsRUFDRCxRQUFRLEtBQ04sVUFBVSxFQUFlLEtBQUssTUFBTSxFQUFLLFNBQVMsRUFBUyxLQUFLLFFBQVMsRUFBZSxhQUFhLEdBQ3ZHLEVBR0YsTUFBTSxHQUE4QixFQUFZLENBQWMsQ0FDaEUsQ0FDRixFQUVBLGVBQWUsR0FDYixFQUNBLEVBQ0EsRUFDc0MsQ0FDdEMsSUFBTSxFQUFpQixJQUFJLElBRXJCLEVBQXFCLEdBQThCLENBQWUsRUFDbEUsRUFBcUIsSUFBSSxJQUFJLENBQWtCLEVBRXJELElBQUssSUFBSSxFQUFRLEVBQUcsRUFBUSxFQUFtQixPQUFRLElBQVMsQ0FDOUQsSUFBTSxFQUFjLEVBQW1CLEdBRXZDLEdBREksQ0FBQyxHQUNELEVBQWUsSUFBSSxDQUFXLEVBQUcsU0FFckMsSUFBTSxFQUFpQixHQUFvQixFQUFhLEVBQVksQ0FBVyxFQUMvRSxFQUFlLElBQUksRUFBYSxDQUFjLEVBRTlDLElBQUssSUFBTSxLQUFtQixNQUFNLEdBQXFCLEVBQWUsYUFBYSxFQUFHLENBQ3RGLElBQU0sRUFBYyxNQUFNLEdBQWdCLENBQWUsRUFDekQsSUFBSyxJQUFNLEtBQXFCLEdBQThCLENBQVcsRUFDbEUsRUFBbUIsSUFBSSxDQUFpQixJQUMzQyxFQUFtQixJQUFJLENBQWlCLEVBQ3hDLEVBQW1CLEtBQUssQ0FBaUIsRUFHL0MsQ0FDRixDQUVBLE9BQU8sQ0FDVCxDQUVBLFNBQVMsR0FBbUIsRUFBcUIsRUFBMEIsQ0FDekUsSUFBTSxFQUFlLEVBQUssU0FBUyxFQUFhLENBQVUsRUFDdEQsR0FBZ0IsQ0FBQyxFQUFhLFdBQVcsSUFBSSxHQUFLLENBQUMsRUFBSyxXQUFXLENBQVksSUFFbkYsUUFBUSxNQUFNLEVBQU0sSUFBSSxnRUFBZ0UsR0FBWSxDQUFDLEVBQ3JHLFFBQVEsS0FBSyxDQUFDLEVBQ2hCLENBRUEsU0FBUyxHQUFvQixFQUFxQixFQUFvQixFQUFxQyxDQUN6RyxJQUFNLEVBQXNCLEdBQXNCLENBQVcsRUFDdkQsRUFBZ0IsRUFBSyxLQUFLLEVBQWEsZUFBZ0IsZUFBZ0IsQ0FBbUIsRUFDaEcsR0FBSSxDQUFDLEVBQUcsV0FBVyxFQUFLLEtBQUssRUFBZSxjQUFjLENBQUMsRUFDekQsTUFBVSxNQUFNLHFDQUFxQyxFQUFZLElBQUksRUFBYyxFQUFFLEVBR3ZGLE1BQU8sQ0FDTCxLQUFNLEVBQ04sZ0JBQ0EsY0FBZSxFQUFLLEtBQUssRUFBWSxDQUFtQixDQUMxRCxDQUNGLENBRUEsU0FBUyxHQUE4QixFQUFvQyxDQUN6RSxJQUFNLEVBQXlCLENBQUMsRUFDaEMsSUFBSyxJQUFNLEtBQU8sR0FBZ0IsQ0FDaEMsSUFBTSxFQUFlLEVBQVksR0FDNUIsS0FFTCxLQUFLLEdBQU0sQ0FBQyxFQUFNLEtBQVUsT0FBTyxRQUFRLENBQVksRUFDaEQsTUFBdUIsQ0FBSyxFQUVqQyxJQUFJLENBQUMsRUFBSyxXQUFXLGVBQWUsRUFDbEMsTUFBVSxNQUFNLDJEQUEyRCxHQUFNLEVBRW5GLEVBQWEsS0FBSyxDQUFJLENBRjZELENBR3JGLENBQ0YsQ0FDQSxNQUFPLENBQUMsR0FBRyxJQUFJLElBQUksQ0FBWSxDQUFDLENBQ2xDLENBRUEsZUFBZSxHQUNiLEVBQ0EsRUFDZSxDQUNmLElBQUssSUFBTSxLQUFrQixFQUFlLE9BQU8sRUFDakQsSUFBSyxJQUFNLEtBQW1CLE1BQU0sR0FBcUIsRUFBZSxhQUFhLEVBQUcsQ0FDdEYsSUFBTSxFQUFjLE1BQU0sR0FBZ0IsQ0FBZSxFQUNwRCxHQUErQixFQUFpQixFQUFhLENBQWMsSUFFaEYsTUFBTSxFQUFHLFNBQVMsVUFBVSxFQUFpQixHQUFHLEtBQUssVUFBVSxFQUFhLElBQUEsR0FBVyxDQUFDLEVBQUUsSUFBSyxNQUFNLEVBQ3JHLFFBQVEsS0FBSyxtQ0FBbUMsRUFBSyxTQUFTLEVBQVksQ0FBZSxHQUFHLEVBQzlGLENBRUosQ0FFQSxTQUFTLEdBQ1AsRUFDQSxFQUNBLEVBQ1MsQ0FDVCxJQUFJLEVBQVUsR0FDZCxJQUFLLElBQU0sS0FBTyxHQUFnQixDQUNoQyxJQUFNLEVBQWUsRUFBWSxHQUM1QixLQUVMLElBQUssR0FBTSxDQUFDLEVBQU0sS0FBVSxPQUFPLFFBQVEsQ0FBWSxFQUFHLENBQ3hELEdBQUksQ0FBQyxHQUF1QixDQUFLLEVBQUcsU0FDcEMsSUFBTSxFQUFnQixFQUFlLElBQUksQ0FBSSxFQUN4QyxJQUVMLEVBQWEsR0FBUSxRQUFRLEVBQUssU0FBUyxFQUFLLFFBQVEsQ0FBZSxFQUFHLEVBQWMsYUFBYSxJQUNyRyxFQUFVLEdBQ1osQ0FDRixDQUNBLE9BQU8sQ0FDVCxDQUVBLGVBQWUsR0FBcUIsRUFBb0MsQ0FDdEUsSUFBTSxFQUE2QixDQUFDLEVBQ3BDLElBQUssSUFBTSxLQUFVLE1BQU0sRUFBRyxTQUFTLFFBQVEsRUFBUyxDQUFFLGNBQWUsRUFBSyxDQUFDLEVBQUcsQ0FDaEYsR0FBSSxFQUFPLE9BQVMsZ0JBQWtCLEVBQU8sT0FBUyxPQUFRLFNBRTlELElBQU0sRUFBWSxFQUFLLEtBQUssRUFBUyxFQUFPLElBQUksRUFDaEQsR0FBSSxFQUFPLFlBQVksRUFBRyxDQUN4QixFQUFpQixLQUFLLEdBQUksTUFBTSxHQUFxQixDQUFTLENBQUUsRUFDaEUsUUFDRixDQUNJLEVBQU8sT0FBTyxHQUFLLEVBQU8sT0FBUyxnQkFDckMsRUFBaUIsS0FBSyxDQUFTLENBRW5DLENBQ0EsT0FBTyxDQUNULENBRUEsZUFBZSxHQUFnQixFQUErQyxDQUM1RSxPQUFPLEtBQUssTUFBTSxNQUFNLEVBQUcsU0FBUyxTQUFTLEVBQWlCLE1BQU0sQ0FBQyxDQUN2RSxDQUVBLFNBQVMsR0FBdUIsRUFBaUMsQ0FDL0QsT0FBTyxPQUFPLEdBQVUsVUFBWSxHQUE0QixLQUFLLENBQUssQ0FDNUUsQ0FFQSxTQUFTLEdBQXNCLEVBQTZCLENBQzFELE9BQU8sRUFBWSxRQUFRLGtCQUFtQixFQUFFLENBQ2xELENBRUEsU0FBUyxHQUFrQixFQUFvQixFQUFtRCxDQUNoRyxRQUFRLEtBQUssNEJBQTRCLEdBQVksRUFDckQsSUFBSyxJQUFNLEtBQWtCLEVBQWUsT0FBTyxFQUNqRCxRQUFRLEtBQUssd0JBQXdCLEVBQWUsS0FBSyxJQUFJLEVBQWUsZUFBZSxFQUU3RixRQUFRLEtBQUssMkVBQTJFLENBQzFGLENDOU1BLE1BQWEsR0FBdUIsQ0FDbEMsTUFBTyxDQUNMLFlBQWEseUJBQ2IsS0FBTSxTQUNSLEVBQ0EsS0FBTSxDQUNKLFlBQWEsNkJBQ2IsS0FBTSxRQUNOLE1BQU8sSUFDUCxRQUFTLENBQUMsQ0FDWixFQUNBLGlCQUFrQixDQUNoQixZQUFhLDZCQUNiLEtBQU0sUUFDTixRQUFTLENBQUMsQ0FDWixDQUNGLEVBVUEsU0FBZ0IsR0FDZCxFQUNNLENBQ04sRUFBcUIsbUJBQXFCLENBQUMsR0FBSSxFQUFLLE1BQVEsQ0FBQyxFQUFJLEdBQUksRUFBSyxHQUFHLE1BQU0sQ0FBQyxHQUFLLENBQUMsRUFBSSxHQUFJLEVBQUssT0FBUyxDQUFDLENBQUUsQ0FBQyxDQUNqSCxJQUFLLEdBQVEsRUFBb0IsT0FBTyxDQUFHLENBQUMsQ0FBQyxDQUFDLENBQzlDLEtBQUssR0FBRyxFQUNYLEVBQXFCLDZCQUErQixFQUFLLGVBQWlCLENBQUMsRUFBQSxDQUN4RSxJQUFLLEdBQVEsRUFBb0IsT0FBTyxDQUFHLENBQUMsQ0FBQyxDQUFDLENBQzlDLEtBQUssR0FBRyxDQUNiLENBRUEsU0FBZ0IsR0FBVSxFQUF1QixDQUMvQyxPQUFRLEVBQTZCLE9BQVMsZUFBaUIsRUFDakUsQ0NHQSxNQUFhLEVBQWdCLElBQUksS0FyQ2IsQ0FDbEIsV0FBVyxFQUFrQixFQUF5QixDQUVwRCxJQUFNLEVBQVMsRUFBUSxrQkFBa0IsVUFBVSx3QkFDL0Msb0NBQ0EsR0FDRSxFQUF5QixFQUFRLElBQUksYUFDdkM7bURBQ0EsR0FDSixNQUFPLE1BQU0sRUFBSyxRQUFRLEVBQVEsU0FBUyxZQUFZLENBQUMsRUFBRTtTQUNyRCxFQUFPOzBDQUMwQixFQUFRLGdCQUFnQjs7NkJBRXJDLEVBQVEsSUFBSSxPQUFPO2lDQUNmLElBQVUsRUFBdUIsR0FDaEUsQ0FFQSxhQUFhLEVBQWtCLEVBQW9CLEdBQUksRUFBaUIsR0FBWSxDQUNsRixNQUFPLEdBQUcsS0FBSyxLQUFLLENBQU8sRUFBRSxNQUFNLEtBQUssTUFBTSxFQUFTLEVBQW1CLENBQWMsR0FDMUYsQ0FFQSxNQUFNLEVBQWtCLEVBQW9CLEdBQUksRUFBaUIsR0FBWSxDQUMzRSxHQUFnQixLQUFLLEtBQUssQ0FBTyxFQUFHLENBQU8sRUFDM0MsSUFBTSxFQUFjLEVBQWUsU0FBUyxXQUFXLEVBQ2pELEVBQXNCLEVBQVEsSUFBSSxhQUFlLHNCQUF3QixHQUMvRSxNQUFPLG1CQUFtQixFQUFjLE9BQVMsS0FBSyxFQUFvQixZQUFZLEVBQVEsSUFBSSxLQUFLLGVBQWUsRUFBUSxnQkFBZ0IsR0FBRyxFQUFrQixHQUFHLEVBQVEsZ0JBQWdCLEdBQUcsR0FDbk0sQ0FFQSxLQUFLLEVBQTBCLENBQzdCLE1BQU8sZ0JBQWdCLEVBQVEsZ0JBQWdCLDBCQUNqRCxDQUVBLFNBQWtCLENBQ2hCLE1BQU8sbURBQ1QsQ0FDRixFQ2JBLElBQXNCLEdBQXRCLEtBQWtDLENBQ2hDLHFCQUNBLFlBQXNCLEVBQStCLENBQ25ELEtBQUsscUJBQXVCLENBQzlCLENBRUEsWUFBWSxFQUFrQixFQUF5QixDQUNyRCxPQUFPLEVBQWMsV0FBVyxFQUFTLENBQU8sQ0FDbEQsQ0FHQSxNQUFNLFNBQVMsRUFBa0IsRUFBbUMsQ0FJbEUsT0FIQSxNQUFNLEdBQXdCLEVBQVEsSUFBSSxLQUFNLENBQU8sRUFDbEQsS0FBSyxxQkFFSCxFQUFrQixDQUN2QixPQUNBLEtBQ0EsZUFDQSxHQUFHLEdBQXlCLENBQUksRUFDaEMsd0JBQ0EsS0FBSyxrQkFBa0IsRUFBUyxDQUFJLEVBQ3BDLEtBQUssZUFBZSxDQUFPLENBQzdCLENBQUMsRUFWc0MsS0FBSyxrQkFBa0IsRUFBUyxDQUFJLENBVzdFLENBQ0EsTUFBTSxnQkFBZ0IsRUFBa0IsRUFBbUMsQ0FJekUsT0FIQSxNQUFNLEdBQXdCLEVBQVEsSUFBSSxLQUFNLENBQU8sRUFDbEQsS0FBSyxxQkFFSCxFQUFrQixDQUN2QixPQUNBLEtBQ0EsZUFDQSxHQUFHLEdBQXlCLENBQUksRUFDaEMsd0JBQ0EsS0FBSyx5QkFBeUIsRUFBUyxDQUFJLEVBQzNDLEtBQUssZUFBZSxDQUFPLENBQzdCLENBQUMsRUFWc0MsS0FBSyx5QkFBeUIsRUFBUyxDQUFJLENBV3BGLENBQ0EsTUFBTSxVQUFVLEVBQWtCLEVBQW1DLENBRW5FLE9BREEsTUFBTSxHQUF3QixFQUFRLElBQUksS0FBTSxDQUFPLEVBQ2hELEtBQUsseUJBQXlCLEVBQVMsQ0FBSSxDQUNwRCxDQUNBLE1BQU0sWUFBWSxFQUFrQixFQUFtQyxDQU9yRSxPQU5BLE1BQU0sR0FBd0IsRUFBUSxJQUFJLEtBQU0sQ0FBTyxFQUNsRCxLQUFLLHFCQUtILEdBQUcsS0FBSyxZQUFZLEVBQVMsYUFBYSxFQUFFO1dBQzVDLEVBQWtCLENBQ3JCLE9BQ0EsS0FDQSxlQUNBLEdBQUcsR0FBeUIsQ0FBSSxFQUNoQyx3QkFDQSxFQUFjLGFBQWEsRUFBUyxFQUFLLDZCQUErQixHQUFJLEVBQUssb0JBQXNCLEVBQUUsRUFDekcsS0FBSyxlQUFlLENBQU8sQ0FDN0IsQ0FBQyxJQWJNLEdBQUcsS0FBSyxZQUFZLEVBQVMsYUFBYSxFQUFFO1dBQzlDLEVBQWMsYUFBYSxFQUFTLEVBQUssNkJBQStCLEdBQUksRUFBSyxvQkFBc0IsRUFBRSxHQWFsSCxDQUdBLHlCQUFtQyxFQUFrQixFQUEwQixDQUM3RSxJQUFNLEVBQXdCLEdBQW9DLENBQU8sRUFDekUsR0FBSSxFQUF1QixDQUN6QixJQUFNLEVBQ0osR0FBRyxFQUFrQixDQUFDLE9BQVEsQ0FBcUIsQ0FBQyxFQUFFLEdBQUcsRUFBSyxvQkFBc0IsS0FBSyxLQUFLLEVBRzFGLEVBQW9CLEVBQUssUUFBUSxFQUFLLFFBQVEsQ0FBcUIsQ0FBQyxFQUMxRSxPQUFPLEtBQUssdUJBQXVCLEVBQVMsRUFBTSxDQUNoRCxFQUFRLGFBQ1IsSUFBc0IsRUFBUSxRQUMxQixFQUNBLElBQUksRUFBa0IsQ0FBQyxLQUFNLENBQWlCLENBQUMsRUFBRSxNQUFNLEVBQWEsRUFDMUUsQ0FBQyxDQUNILENBRUEsSUFBTSxFQUFzQixHQUF3QixDQUFPLEVBQ3JELEVBQVcsRUFDYixDQUFDLEVBQVEsYUFBYyxzQ0FBc0MsR0FBcUIsRUFDbEYsS0FBSyxvQ0FBb0MsRUFBUyxDQUFJLEVBRTFELE9BQU8sS0FBSyx1QkFBdUIsRUFBUyxFQUFNLENBQVEsQ0FDNUQsQ0FFQSxvQ0FBOEMsRUFBa0IsRUFBNEIsQ0FDMUYsTUFBTyxDQUNMLEVBQVEsYUFDUixHQUFHLEVBQVEsZUFBaUIsTUFBUSxPQUFPLGlCQUFpQixFQUFLLG9CQUFzQixLQUFLLEtBQUssQ0FDbkcsQ0FDRixDQUVBLHVCQUFpQyxFQUFrQixFQUFrQixFQUE0QixDQUcvRixJQUFNLEVBQ0osR0FBcUIsRUFBUyxNQUFNLEdBQUssRUFBdUIsQ0FBTyxFQUNuRSxDQUFDLFdBQVcsR0FBeUIsQ0FBTyxFQUFFLEVBQUUsRUFDaEQsQ0FBQyxFQUtELEVBQXlCLENBQUMsQ0FBQyxHQUF3QixDQUFPLEVBVWhFLE1BQU8sQ0FBQyxHQUFHLENBUlQsR0FBRyxFQUNILEdBQUksRUFBUSxVQUFZLENBQUMsR0FBYyxRQUFRLENBQU8sQ0FBQyxFQUFJLENBQUMsRUFDNUQsR0FBSSxFQUFRLFlBQWMsQ0FBQyxFQUN2QixDQUFDLEdBQTJCLEVBQVMsR0FBZSxnQkFBZ0IsQ0FBTyxDQUFDLENBQUMsRUFDN0UsQ0FBQyxDQUlvQixDQUFDLENBQUMsUUFBUyxHQUFRLEVBQUksTUFBTSxJQUFJLENBQUMsRUFBRyxHQUFHLENBQVEsQ0FBQyxDQUN6RSxPQUFPLE9BQU8sQ0FBQyxDQUNmLElBQUssR0FBUSxHQUFHLEVBQUksR0FBRyxHQUFVLENBQUksSUFBSSxLQUFLLENBQUMsQ0FBQyxDQUNoRCxLQUFLLE1BQU0sQ0FDaEIsQ0FJQSxXQUFXLEVBQWtCLEVBQWdCLEVBQTBDLENBQ3JGLE9BQU8sS0FBSyxpQkFBaUIsRUFBUyxFQUFNLEtBQUssa0JBQWtCLEVBQVMsQ0FBSSxFQUFHLENBQU8sQ0FDNUYsQ0FDQSxrQkFBa0IsRUFBa0IsRUFBZ0IsRUFBMEMsQ0FDNUYsT0FBTyxLQUFLLGlCQUFpQixFQUFTLEVBQU0sS0FBSyx5QkFBeUIsRUFBUyxDQUFJLEVBQUcsQ0FBTyxDQUNuRyxDQUNBLGNBQWMsRUFBa0IsRUFBZ0IsRUFBMEMsQ0FDeEYsT0FBTyxLQUFLLGlCQUFpQixFQUFTLEVBQU0sRUFBYyxhQUFhLENBQU8sRUFBRyxDQUFPLENBQzFGLENBQ0EsTUFBTSxVQUFVLEVBQWtCLEVBQW1DLENBSW5FLE1BSEEsR0FBUSxJQUFJLE9BQVMsT0FDckIsTUFBTSxHQUF3QixFQUFRLElBQUksS0FBTSxDQUFPLEVBRWhELEdBQUcsR0FBZ0MsV0FBWSxFQUFFLEVBQUUsR0FBRyxFQUFrQixDQUM3RSxPQUNBLEtBQ0EsZUFDQSxHQUFHLEdBQXlCLENBQUksRUFDaEMsZ0JBQ0EsWUFDQSxRQUNBLEtBQUssa0JBQWtCLEVBQVMsQ0FBSSxFQUNwQyxLQUFLLFFBQVEsQ0FBTyxDQUN0QixDQUFDLEdBQ0gsQ0FFQSxNQUFNLGlCQUNKLEVBQ0EsRUFDQSxFQUNBLENBQUUsMEJBQTBCLENBQUMsRUFBRyxpQkFBaUIsQ0FBQyxPQUFRLFdBQVcsR0FDcEQsQ0FDakIsRUFBUSxJQUFJLE9BQVMsT0FDckIsSUFBTSxFQUFPLE1BQU0sR0FBd0IsRUFBUSxJQUFJLEtBQU0sQ0FBTyxFQUM5RCxFQUFTLEVBQVEsWUFBWSxVQUFVLHVCQUF5QiwrQkFBaUMsR0FDakcsRUFBb0IsR0FBdUIsRUFBZ0IsRUFBSyxRQUFTLEVBQUssS0FBTSxDQUF1QixFQUtqSCxPQUpJLEVBQVEsaUNBQ0gsR0FBRyxJQUFvQixJQUd6QixFQUFrQixDQUN2QixPQUNBLEtBQ0EsZUFDQSxHQUFHLEdBQXlCLENBQUksRUFDaEMsZ0JBQ0EsWUFDQSxRQUNBLEdBQUcsRUFBYSxZQUNoQixrREFBa0QsRUFBSzthQUNoRCxJQUFvQixHQUM3QixDQUFDLENBQ0gsQ0FHQSxTQUFTLEVBQWtCLEVBQXdCLENBQ2pELElBQU0sRUFBVSxFQUFLLFNBQVMsSUFBSSxNQUFNLEVBcUJ4QyxPQXBCSSxFQUFRLFVBRUgsRUFBa0IsQ0FDdkIsT0FDQSxTQUNBLE1BQ0EsR0FBSSxHQUFTLE9BQVMsRUFBVSxDQUFDLFlBQVksRUFDN0Msb0JBQ0EsY0FDQSxnQkFDQSxHQUFJLEVBQUssS0FBTyxDQUFDLFVBQVUsRUFBSSxDQUFDLENBQ2xDLENBQUMsRUFDUSxFQUFRLGVBQ1YsRUFBa0IsQ0FDdkIsTUFDQSxPQUNBLEdBQUksR0FBUyxPQUFTLEVBQVUsQ0FBQyxZQUFZLEVBQzdDLEdBQUksRUFBSyxLQUFPLENBQUMsUUFBUSxFQUFJLENBQUMsQ0FDaEMsQ0FBQyxFQUVJLGtCQUNULENBRUEsUUFBa0IsRUFBMEIsQ0FDMUMsSUFBTSxFQUFPLEVBQVEsSUFBSSxLQUN6QixNQUFPLHlDQUF5QyxFQUFLO3dEQUNELEVBQUs7eURBQ0osRUFBSzt5REFDTCxFQUFLO3lEQUNMLEVBQUs7eURBQ0wsRUFBSzswREFDSixHQUN4RCxDQUVBLGVBQXlCLEVBQTBCLENBQ2pELElBQU0sRUFBTyxFQUFRLElBQUksS0FDekIsTUFBTyxHQUFHLEtBQUssUUFDYixDQUNGLEVBQUUsbUNBQW1DLEVBQUssMENBQTBDLEdBQ3RGLENBQ0YsRUFFQSxTQUFTLEdBQW9DLEVBQXNDLENBQ2pGLEdBQUksQ0FDRixPQUFPLEVBQVEsU0FBUyw2QkFBNkIsQ0FDdkQsTUFBUSxDQUNOLE1BQ0YsQ0FDRixDQUVBLFNBQVMsR0FBd0IsRUFBc0MsQ0FDckUsR0FBSSxDQUNGLE9BQU8sRUFBUSxTQUFTLHNCQUFzQixDQUNoRCxNQUFRLENBQ04sTUFDRixDQUNGLENBRUEsU0FBUyxHQUNQLEVBQ0EsRUFDQSxFQUNBLEVBQW9DLENBQUMsRUFDN0IsQ0FDUixJQUFNLEVBQU8sQ0FBQyxNQUFPLFlBQVksRUFDM0IsRUFBb0IsR0FBUyxJQUFJLE1BQU0sRUFDN0MsR0FBSSxFQUFlLEtBQU8sUUFBVSxDQUFDLEdBQW1CLE9BQ3RELE9BQU8sR0FBMkIsQ0FBQyxHQUFHLEVBQU0sR0FBRyxFQUFnQixHQUFHLENBQXVCLEVBQUcsQ0FBSSxFQUdsRyxJQUFNLEVBQU8sRUFBZSxNQUFNLENBQUMsRUFDN0IsRUFBd0IsR0FBb0MsQ0FBSSxFQUNoRSxFQUNKLEVBQXNCLFNBQVcsRUFBSSxFQUFPLEVBQUssUUFBUSxFQUFHLElBQVUsQ0FBQyxFQUFzQixTQUFTLENBQUssQ0FBQyxFQUM5RyxPQUFPLEdBQ0wsQ0FBQyxHQUFHLEVBQU0sT0FBUSxHQUFHLEVBQW1CLEdBQUcsRUFBMkIsR0FBRyxDQUF1QixFQUNoRyxDQUNGLENBQ0YsQ0FFQSxTQUFTLEdBQTJCLEVBQXVCLEVBQXdCLENBQ2pGLElBQU0sRUFBa0IsRUFBWSxRQUFRLFlBQVksRUFDbEQsRUFBMEIsSUFBb0IsSUFBTSxFQUFZLEVBQWtCLEtBQU8sT0FPL0YsTUFOSSxDQUFDLEdBQVEsQ0FBQyxHQUdWLEVBQVksS0FBTSxHQUFRLElBQVEsa0JBQW9CLEVBQUksV0FBVyxpQkFBaUIsQ0FBQyxFQUNsRixFQUFrQixDQUFXLEVBRS9CLEVBQWtCLENBQUMsR0FBRyxFQUFhLGtCQUFrQixDQUFDLENBQy9ELENBRUEsU0FBZ0IsR0FBb0MsRUFBMEIsQ0FDNUUsSUFBSSxFQUNFLEVBQTBCLENBQUMsRUFFakMsSUFBSyxHQUFNLENBQUMsRUFBTyxLQUFRLEVBQUssUUFBUSxFQUFHLENBQ3pDLEdBQUksRUFBa0IsQ0FDcEIsR0FBSSxJQUFxQixZQUFjLENBQUMsRUFBSSxXQUFXLEdBQUcsRUFBRyxDQUMzRCxFQUFtQixJQUFBLEdBQ25CLFFBQ0YsQ0FDQSxFQUFtQixJQUFBLEVBQ3JCLENBRUEsR0FBSSxJQUFRLEtBQ1YsTUFBTyxDQUFDLEdBQUcsRUFBZSxHQUFHLEVBQUssTUFBTSxFQUFRLENBQUMsQ0FBQyxDQUFDLEtBQUssRUFBRyxJQUFXLEVBQVEsRUFBSSxDQUFNLENBQUMsRUFFM0YsR0FBSSxFQUFJLFdBQVcsSUFBSSxFQUFHLENBQ3hCLEdBQUksRUFBSSxTQUFTLEdBQUcsRUFBRyxTQUNuQixHQUE2QyxJQUFJLENBQUcsRUFDdEQsRUFBbUIsV0FDVixHQUE2QyxJQUFJLENBQUcsSUFDN0QsRUFBbUIsWUFFckIsUUFDRixDQUNBLEdBQUksRUFBSSxXQUFXLEdBQUcsR0FBSyxJQUFRLElBQUssQ0FDdEMsSUFBTSxFQUFjLEVBQUksTUFBTSxFQUFHLENBQUMsRUFDOUIsRUFBSSxTQUFXLEdBQUssR0FBbUQsSUFBSSxDQUFXLElBQ3hGLEVBQW1CLFlBRXJCLFFBQ0YsQ0FDQSxFQUFjLEtBQUssQ0FBSyxDQUMxQixDQUVBLE9BQU8sQ0FDVCxDQUVBLE1BQU0sR0FBK0MsSUFBSSxJQUFJLENBQzNELFlBQ0EsV0FDQSxTQUNBLGdCQUNBLG1CQUNBLGlCQUNBLFdBQ0EsWUFDQSxnQkFDQSxhQUNBLFlBQ0EsVUFDQSxjQUNBLHFCQUNBLFlBQ0EsVUFDQSxhQUNBLFlBQ0EsWUFDQSxhQUNBLFdBQ0YsQ0FBQyxFQUVLLEdBQStDLElBQUksSUFBSSxDQUMzRCxpQkFDQSxxQkFDQSx3QkFDRixDQUFDLEVBRUssR0FBcUQsSUFBSSxJQUFJLENBQUMsS0FBTSxLQUFNLElBQUksQ0FBQyxFQ2hXeEUsR0FBZSxJQUFJLGNBVkwsRUFBWSxDQUNyQyxhQUFjLENBQ1osTUFBTSxFQUFJLENBQ1osQ0FFQSxrQkFBcUMsRUFBWSxFQUEwQixDQUN6RSxNQUFPLGFBQWEsRUFBSyxvQkFBc0IsSUFDakQsQ0FDRixFQ0pBLElBQWEsR0FBYixjQUF1QyxFQUFZLENBQ2pELGFBQWMsQ0FDWixNQUFNLEVBQUssQ0FDYixDQUVBLGtCQUFxQyxFQUFZLEVBQTBCLENBQ3pFLE1BQU8scUJBQXFCLEVBQUssTUFBUSxVQUFZLEdBQUcsbUJBQW1CLEVBQUssb0JBQXNCLElBQ3hHLENBRUEsTUFBZSxpQkFDYixFQUNBLEVBQ0EsRUFDQSxFQUEwQixDQUFDLEVBQ1YsQ0FDakIsR0FBSSxFQUFRLG9CQUNWLE9BQU8sTUFBTSxpQkFBaUIsRUFBUyxFQUFNLEVBQWMsQ0FBTyxFQUdwRSxFQUFRLElBQUksT0FBUyxPQUNyQixJQUFNLEVBQU8sTUFBTSxHQUF3QixFQUFRLElBQUksS0FBTSxDQUFPLEVBQzlELEVBQVMsRUFBUSxZQUFZLFVBQVUsdUJBQXlCLCtCQUFpQyxHQUNqRyxFQUFVLEVBQUssU0FBUyxJQUFJLE1BQU0sRUFDbEMsRUFBb0IsR0FBUyxPQUFTLEVBQVUsQ0FBQyxXQUFXLEVBQzVELEVBQWMsS0FBSyxTQUFTLEVBQVMsQ0FBRSxHQUFHLEVBQU0sUUFBUyxDQUFrQixDQUFDLEVBQ2xGLE9BQU8sRUFBa0IsQ0FDdkIsT0FDQSxLQUNBLGVBQ0EsR0FBRyxHQUF5QixDQUFJLEVBQ2hDLGdCQUNBLFlBQ0EsUUFDQSxHQUFHLEVBQWEsWUFDaEIsa0RBQWtELEVBQUssTUFBTSxJQUFjLEdBQzdFLENBQUMsQ0FDSCxDQUNGLEVBRUEsTUFBYSxHQUFvQixJQUFJLEdDN0J4QixHQUFjLElBQUksY0FkTCxFQUFZLENBQ3BDLGFBQWMsQ0FDWixNQUFNLEVBQUksQ0FDWixDQUVBLGtCQUFxQyxFQUFZLEVBQTBCLENBQ3pFLE1BQU8sNkJBQTZCLEVBQUssb0JBQXNCLElBQ2pFLENBRUEsb0NBQXVELEVBQWtCLEVBQTRCLENBQ25HLE1BQU8sQ0FBQyxFQUFRLGFBQWMsbUJBQW1CLEVBQUssb0JBQXNCLEtBQUssS0FBSyxDQUFDLENBQ3pGLENBQ0YsRUVvQ2EsR0FBa0IsSUFBSSxjQTlDTCxFQUFZLENBQ3hDLGFBQWMsQ0FDWixNQUFNLEVBQUssQ0FDYixDQUVBLGtCQUE0QixFQUFhLEVBQXdCLENBQy9ELE1BQVUsTUFBTSxtQ0FBbUMsQ0FDckQsQ0FFQSxTQUFrQixFQUFZLEVBQW1DLENBQy9ELE9BQU8sUUFBUSxRQUNiLHFCQUFxQixFQUFLLE1BQVEsVUFBWSxHQUFHLG1CQUFtQixFQUFLLG9CQUFzQixJQUNqRyxDQUNGLENBQ0EsZ0JBQXlCLEVBQWtCLEVBQW1DLENBQzVFLE9BQU8sUUFBUSxRQUNiLEdBQUcsRUFBUSxhQUFhLE1BQU0sRUFBUSxlQUFpQixVQUFZLE9BQU8saUJBQWlCLEVBQUssb0JBQXNCLEdBQUcsa0JBQzNILENBQ0YsQ0FDQSxXQUFzQyxDQUNwQyxPQUFPLFFBQVEsUUFBUSxvQkFBb0IsQ0FDN0MsQ0FDQSxZQUFxQixFQUFrQixFQUFtQyxDQUN4RSxPQUFPLFFBQVEsUUFDYixHQUFHLEtBQUssWUFBWSxFQUFTLGFBQWEsRUFBRSxNQUFNLEVBQWMsYUFDOUQsRUFDQSxFQUFLLDZCQUErQixHQUNwQyxFQUFLLG9CQUFzQixFQUM3QixHQUNGLENBQ0YsQ0FFQSxZQUF1QyxDQUNyQyxPQUFPLFFBQVEsUUFBUSxvQkFBb0IsQ0FDN0MsQ0FDQSxtQkFBOEMsQ0FDNUMsT0FBTyxRQUFRLFFBQVEsb0JBQW9CLENBQzdDLENBQ0EsZUFBMEMsQ0FDeEMsT0FBTyxRQUFRLFFBQVEsb0JBQW9CLENBQzdDLENBQ0EsV0FBc0MsQ0FDcEMsT0FBTyxRQUFRLFFBQVEsb0JBQW9CLENBQzdDLENBQ0YsRUNwQ2EsR0FBZSxJQUFJLGNBVkwsRUFBWSxDQUNyQyxhQUFjLENBQ1osTUFBTSxFQUFJLENBQ1osQ0FFQSxrQkFBcUMsRUFBWSxFQUEwQixDQUN6RSxNQUFPLGFBQWEsRUFBSyxvQkFBc0IsSUFDakQsQ0FDRixFQ3dDYSxHQUFnQixJQUFJLGNBekNMLEVBQVksQ0FDdEMsYUFBYyxDQUNaLE1BQU0sRUFBSSxDQUNaLENBRUEsa0JBQXFDLEVBQWtCLEVBQTBCLENBQy9FLEVBQVEsSUFBSSxPQUFTLE9BRXJCLElBQU0sRUFBYSwwQkFBMEIsRUFBUSxJQUFJLEtBQUssR0FBRyxFQUFLLG9CQUFzQixLQUFLLEtBQUssRUFHaEcsRUFBVyxDQUFDLEdBQXVCLEVBQU0sV0FBVyxDQUFDLEVBR3JELEVBQW1CLEdBQXFCLEVBQVMsTUFBTSxFQUFJLEdBQThCLENBQU8sRUFBSSxJQUFBLEdBRTFHLE9BREksR0FBa0IsRUFBUyxLQUFLLENBQWdCLEVBQzdDLENBQUMsR0FBRyxFQUFVLENBQVUsQ0FBQyxDQUFDLEtBQUssTUFBTSxDQUM5QyxDQUVBLG9DQUF1RCxFQUFrQixFQUE0QixDQUNuRyxFQUFRLElBQUksT0FBUyxPQUNyQixJQUFNLEVBQU8sRUFBUSxJQUFJLEtBSW5CLEVBQXNCLEdBQThCLENBQU8sRUFLakUsTUFBTyxDQUNMLEVBQVEsYUFDUixHQUF1QixFQUFNLHVCQUF1QixFQUNwRCxHQUFJLEVBQXNCLENBQUMsQ0FBbUIsRUFBSSxDQUFDLEVBQ25ELEdBQ0UsZ0VBQWdFLEVBQUssaUJBQWlCLEdBQXlCLENBQU8sRUFBRSwrQkFBK0IsRUFBSyxHQUFHLEVBQUssb0JBQXNCLEtBQUssS0FBSyxDQUN0TSxDQUNGLENBQ0YsQ0FDRixFQ2hDYSxHQUFjLElBQUksY0FkTCxFQUFZLENBQ3BDLGFBQWMsQ0FDWixNQUFNLEVBQUksQ0FDWixDQUVBLGtCQUFxQyxFQUFZLEVBQTBCLENBQ3pFLE1BQU8saUJBQWlCLEVBQUssb0JBQXNCLEtBQUssS0FBSyxDQUMvRCxDQUVBLHlCQUE0QyxFQUFrQixFQUEwQixDQUN0RixNQUFPLEdBQUcsRUFBUSxhQUFhLHdCQUF3QixFQUFLLG9CQUFzQixLQUFLLEtBQUssQ0FDOUYsQ0FDRixFQzRCYSxHQUFpQixJQUFJLGNBL0JMLEVBQWtCLENBQzdDLGtCQUFxQyxFQUFrQixFQUEwQixDQUMvRSxPQUFPLEtBQUsseUJBQXlCLEVBQVMsQ0FBSSxDQUFDLENBQUMsS0FBSyxNQUFNLENBQ2pFLENBRUEsb0NBQXVELEVBQWtCLEVBQTRCLENBRW5HLE9BQU8sS0FBSyx5QkFBeUIsRUFBUyxDQUFJLENBQ3BELENBRUEseUJBQWlDLEVBQWtCLEVBQTRCLENBQzdFLEVBQVEsSUFBSSxPQUFTLE9BQ3JCLElBQU0sRUFBVyxHQUF5QixDQUFPLEVBSTNDLEVBQVcsQ0FBQyxHQUF1QixFQUFNLFdBQVcsQ0FBQyxFQUVyRCxFQUFzQixHQUE4QixDQUFPLEVBU2pFLE9BUkksR0FDRixFQUFTLEtBQUssQ0FBbUIsRUFFbkMsRUFBUyxLQUNQLEdBQ0UsNkJBQTZCLEVBQVEsSUFBSSxLQUFLLGlCQUFpQixFQUFTLElBQUksRUFBSyxvQkFBc0IsS0FBSyxLQUFLLENBQ25ILENBQ0YsRUFDTyxDQUNULENBQ0YsRUMvQ2EsR0FBcUIsQ0FBQyxVQUFXLFVBQVcsU0FBVSxNQUFNLEVDb0JuRUUsR0FBVSxDQUNkLEdBQUcsR0FDSCxLQUFNLENBQ0osWUFBYSwrRUFDYixLQUFNLFNBQ04sTUFBTyxHQUNULENBQ0YsRUFFYSxHQUEwRyxDQUNySCxRQUFTLGlCQUNULFNBQ0UsdUpBQ0YsUUFBVSxHQUNSLEVBQU0sb0JBQW9CLENBQUUsYUFBYyxFQUFLLENBQUMsQ0FBQyxDQUFDLFFBQVFBLEVBQU8sRUFHbkUsTUFBTSxRQUFRLEVBQU0sQ0FDbEIsR0FBYyxDQUFJLEVBRWxCLElBQU0sRUFBVyxNQUFNLEVBQXVCLENBQUksRUFDN0MsSUFDSCxRQUFRLE1BQU0sRUFBTSxJQUFJLG1CQUFtQixDQUFDLEVBQzVDLFFBQVEsS0FBSyxDQUFDLEdBR2hCLElBQUssSUFBTSxLQUFXLEVBQVMsWUFBYSxDQUMxQyxJQUFNLEVBQU8sRUFBUSxZQUFZLGNBQWdCLENBQUMsRUFDNUMsRUFBVSxFQUFRLFlBQVksaUJBQW1CLENBQUMsRUFDcEQsRUFDSixHQUFJLEVBQUssTUFDUCxFQUFVLFFBQ0wsR0FBSSxFQUFLLFFBQVUsRUFBUSxPQUVoQyxFQUFVLFFBQ0wsR0FBSSxFQUFLLEtBQ2QsRUFBVSxRQUNMLEdBQUksRUFBUSxrQkFDakIsRUFBVSxRQUNMLEdBQUksRUFBUSxLQUNqQixFQUFVLFFBQ0wsR0FBSSxFQUF1QixDQUFPLEVBRXZDLEVBQVUsUUFDTCxHQUNKLEdBQW1CLEtBQU0sR0FBTSxFQUFLLEVBQUUsR0FBSyxDQUFDLEVBQUssdUJBQ2pELEVBQVEsZUFBaUIsZ0JBQWdCLEtBQUssRUFBUSxVQUFVLEVBRWpFLEVBQVUsUUFDTCxHQUFJLEVBQUssYUFBZSxFQUFRLFlBQ3JDLEVBQVUsUUFFVixTQUlGLE9BRkEsUUFBUSxLQUFLLHVCQUF1QixFQUFRLEtBQUssS0FBSyxFQUU5QyxFQUFLLE1BQVEsTUFBckIsQ0FDRSxJQUFLLE1BQ0wsSUFBSyxjQUNILFFBQVEsSUFBSSxTQUFXLGNBQ3ZCLE1BQU0sRUFBYSxNQUFNLEVBQVEsU0FBUyxFQUFTLENBQUksRUFBRyxFQUFTLENBQUksRUFDdkUsTUFFRixJQUFLLFVBQ0gsUUFBUSxJQUFJLFNBQVcsVUFDdkIsTUFBTSxFQUFhLE1BQU0sRUFBUSxnQkFBZ0IsRUFBUyxDQUFJLEVBQUcsRUFBUyxDQUFJLEVBQzlFLE1BRUYsSUFBSyxTQUNILFFBQVEsSUFBSSxTQUFXLFVBQ3ZCLE1BQU0sRUFBYSxNQUFNLEVBQVEsWUFBWSxFQUFTLENBQUksRUFBRyxFQUFTLENBQUksRUFDMUUsTUFFRixJQUFLLGVBQ0gsUUFBUSxJQUFJLFNBQVcsVUFDdkIsRUFBSyxtQkFBcUIsY0FDMUIsTUFBTSxFQUFhLE1BQU0sRUFBUSxZQUFZLEVBQVMsQ0FBSSxFQUFHLEVBQVMsQ0FBSSxFQUMxRSxNQUVGLElBQUssT0FDSCxRQUFRLElBQUksU0FBVyxPQUV2QixNQUFNLEVBQWEsTUFERSxFQUFRLFVBQVUsRUFBUyxDQUFJLEVBQ3pCLEVBQVMsQ0FBSSxFQUN4QyxNQUVGLFFBQ0UsTUFBVSxNQUFNLHVCQUF1QixFQUFLLE1BQU0sQ0FFdEQsQ0FDRixDQUNGLENBQ0YsRUNuRk0sR0FBOEIsT0FBTyxHQUFHLE9BQU8sY0FBYyxFQUFFLEVBQUUsc0JBQXVCLEdBQUcsRUFFM0YsR0FBcUMsSUFFckNDLEdBQVUsQ0FDZCxJQUFLLENBQ0gsWUFBYSx1QkFDYixLQUFNLFNBQ04sUUFBUyxDQUNQLFdBQ0EsZUFDQSxTQUNBLGFBQ0EsU0FDQSxlQUNBLFFBQ0EsV0FDQSxPQUNGLEVBQ0EsUUFBUyxVQUNYLEVBQ0EsT0FBUSxDQUNOLFlBQWEsMkJBQ2IsS0FBTSxTQUNSLEVBQ0EsS0FBTSxDQUNKLFlBQWEscUNBQ2IsS0FBTSxTQUNSLEVBQ0EsZUFBZ0IsQ0FDZCxZQUFhLHlCQUNiLEtBQU0sUUFDUixDQUNGLEVBRU0sR0FBbUIsQ0FDdkIsUUFBUyxDQUNQLE1BQU8sR0FDUCxZQUFhLGdDQUNiLEtBQU0sUUFDUixDQUNGLEVBY2EsR0FBMEQsQ0FDckUsUUFBUyxvQkFDVCxTQUNFLHFNQUNGLFFBQVUsR0FDUixFQUNHLG9CQUFvQixDQUFFLGFBQWMsRUFBSyxDQUFDLENBQUMsQ0FDM0MsUUFBUUEsRUFBTyxDQUFDLENBQ2hCLFdBQVcsVUFBVyxHQUFpQixPQUFPLEVBQ25ELE1BQU0sUUFBUSxFQUFNLENBQ2xCLFFBQVEsS0FBSyxNQUFNLEdBQUssQ0FBdUIsQ0FBQyxDQUNsRCxDQUNGLEVBRUEsZUFBc0IsR0FBSyxFQUF1QixFQUEwQixDQUFDLEVBQW9CLENBQy9GLElBQU0sRUFBVyxHQUEwQixDQUFJLEVBQ3pDLEVBQVcsTUFBTSxFQUF1QixDQUFRLEVBQ3RELEdBQUksQ0FBQyxFQUVILE9BREEsUUFBUSxNQUFNLEVBQU0sSUFBSSxtQkFBbUIsQ0FBQyxFQUNyQyxFQUlULElBQU0sRUFBZSxFQUFTLFNBQVcsQ0FBQyxFQUNwQyxFQUEwQixFQUFTLE9BQVMsQ0FBQyxFQUM3QyxDQUFFLGVBQWMsaUJBQWtCLEdBQTRCLEVBQWEsQ0FBdUIsRUFFeEcsSUFBSyxJQUFNLEtBQVcsRUFBUyxZQUFhLENBQzFDLEVBQVEsSUFBSSxTQUFXLE9BRXZCLElBQU0sRUFBTyxFQUFRLFlBQVksY0FBZ0IsQ0FBQyxFQUM1QyxFQUFVLEVBQVEsWUFBWSxpQkFBbUIsQ0FBQyxFQUNwRCxFQUNKLEFBaUJFLEVBakJFLEVBQUssTUFDRyxHQUNELEVBQUssUUFBVSxFQUFRLE9BRXRCLEdBQ0QsRUFBSyxLQUNKLEdBQ0QsRUFBUSxrQkFDUCxHQUNELEVBQVEsS0FDUCxHQUNELEVBQXVCLENBQU8sRUFFN0IsR0FDRCxHQUFtQixLQUFNLEdBQU0sRUFBSyxFQUFFLEdBQUssQ0FBQyxFQUFLLHNCQUNoRCxHQUVBLEdBR1osUUFBUSxLQUFLLHNCQUFzQixFQUFRLEtBQUssS0FBSyxFQUdyRCxJQUFNLEVBQXFCLEdBQXNCLENBQU8sRUFDeEQsR0FBSSxHQUFpQixJQUF1QixHQUFPLENBQ2pELElBQU0sRUFBYyxFQUFZLE9BQVEsR0FBVyxFQUFPLFNBQVMsT0FBTyxDQUFDLEVBQ3JFLEVBQ0osRUFBWSxPQUFTLEVBQUksRUFBYyxFQUFtQixPQUFTLEVBQUksRUFBcUIsSUFBQSxHQUN4RixFQUFXLENBQUUsR0FBRyxFQUFVLFNBQVEsRUFDbEMsRUFBVyxNQUFNLEdBQW1CLEVBQVEsU0FBUyxFQUFTLENBQVEsRUFBRyxFQUFTLEVBQVUsQ0FDaEcsYUFBYyxFQUFRLGFBQ3RCLFFBQVMsRUFBUyxXQUNwQixDQUFDLEVBQ0QsR0FBSSxJQUFhLEVBQ2YsT0FBTyxDQUVYLENBRUEsR0FBSSxDQUFDLEdBQWdCLENBQUMsRUFBRyxXQUFXLEVBQUssS0FBSyxFQUFRLFFBQVMsT0FBUSxLQUFLLENBQUMsRUFBRyxDQUMxRSxHQUFjLEdBQXVDLENBQU8sRUFDaEUsUUFDRixDQUdBLElBQU0sRUFBYSxFQUFZLE9BQVEsR0FBVyxFQUFPLFNBQVMsTUFBTSxDQUFDLEVBQ25FLEVBQVUsQ0FBRSxHQUFHLEVBQVUsUUFBUyxFQUFXLE9BQVMsRUFBSSxFQUFhLElBQUEsRUFBVSxFQUV2RixPQUFRLEVBQVMsSUFBakIsQ0FDRSxJQUFLLFdBQVksQ0FDZixJQUFNLEVBQVcsTUFBTSxHQUNyQixNQUFNLEVBQVEsa0JBQWtCLEVBQVMsRUFBUyxDQUNoRCxlQUFnQixHQUEwQixFQUFZLENBQXVCLEVBQzdFLHlCQUNGLENBQUMsRUFDRCxFQUNBLEVBQ0EsQ0FBRSxhQUFjLEVBQVEsWUFBYSxDQUN2QyxFQUNBLEdBQUksSUFBYSxFQUFHLE9BQU8sRUFDM0IsUUFDRixDQUNBLElBQUssZUFBZ0IsQ0FDbkIsSUFBTSxFQUFXLE1BQU0sR0FDckIsTUFBTSxFQUFRLFdBQVcsRUFBUyxFQUFTLENBQ3pDLGVBQWdCLEdBQTBCLEVBQVksQ0FBdUIsRUFDN0UseUJBQ0YsQ0FBQyxFQUNELEVBQ0EsRUFDQSxDQUFFLGFBQWMsRUFBUSxZQUFhLENBQ3ZDLEVBQ0EsR0FBSSxJQUFhLEVBQUcsT0FBTyxFQUMzQixRQUNGLENBQ0EsSUFBSyxTQUFVLENBQ2IsSUFBTSxFQUFXLE1BQU0sR0FDckIsRUFDQSxFQUNBLEVBQ0EsR0FBMEIsRUFBWSxDQUF1QixFQUM3RCxFQUNBLENBQ0YsRUFDQSxHQUFJLElBQWEsRUFBRyxPQUFPLEVBQzNCLFFBQ0YsQ0FDQSxJQUFLLGVBQWdCLENBQ25CLElBQU0sRUFBVyxNQUFNLEdBQ3JCLEVBQ0EsRUFDQSxFQUNBLEdBQTBCLEVBQVksRUFBeUIsQ0FBQyxTQUFTLENBQUMsRUFDMUUsRUFDQSxDQUNGLEVBQ0EsR0FBSSxJQUFhLEVBQUcsT0FBTyxFQUMzQixRQUNGLENBQ0YsQ0FDQSxHQUFJLEVBQUssT0FBUyxFQUFLLE1BQVEsRUFBUSxtQkFBcUIsRUFBUSxLQUNsRSxPQUFRLEVBQVMsSUFBakIsQ0FDRSxJQUFLLFNBQVUsQ0FDYixJQUFNLEVBQVcsTUFBTSxHQUNyQixNQUFNLEVBQVEsa0JBQWtCLEVBQVMsRUFBUyxDQUNoRCxlQUFnQixHQUEwQixFQUFZLEVBQXlCLENBQUMsVUFBVSxDQUFDLEVBQzNGLHlCQUNGLENBQUMsRUFDRCxFQUNBLEVBQ0EsQ0FBRSxhQUFjLEVBQVEsWUFBYSxDQUN2QyxFQUNBLEdBQUksSUFBYSxFQUFHLE9BQU8sRUFDM0IsS0FDRixDQUNBLElBQUssYUFBYyxDQUNqQixJQUFNLEVBQVcsTUFBTSxHQUNyQixNQUFNLEVBQVEsV0FBVyxFQUFTLEVBQVMsQ0FDekMsZUFBZ0IsR0FBMEIsRUFBWSxFQUF5QixDQUFDLFVBQVUsQ0FBQyxFQUMzRix5QkFDRixDQUFDLEVBQ0QsRUFDQSxFQUNBLENBQUUsYUFBYyxFQUFRLFlBQWEsQ0FDdkMsRUFDQSxHQUFJLElBQWEsRUFBRyxPQUFPLEVBQzNCLEtBQ0YsQ0FDQSxJQUFLLFFBQVMsQ0FDWixJQUFNLEVBQVcsTUFBTSxHQUNyQixNQUFNLEVBQVEsa0JBQWtCLEVBQVMsRUFBUyxDQUNoRCxlQUFnQixHQUEwQixFQUFZLEVBQXlCLENBQUMsU0FBUyxDQUFDLEVBQzFGLHlCQUNGLENBQUMsRUFDRCxFQUNBLEVBQ0EsQ0FBRSxhQUFjLEVBQVEsWUFBYSxDQUN2QyxFQUNBLEdBQUksSUFBYSxFQUFHLE9BQU8sRUFDM0IsS0FDRixDQUNBLElBQUssV0FBWSxDQUNmLElBQU0sRUFBVyxNQUFNLEdBQ3JCLE1BQU0sRUFBUSxrQkFBa0IsRUFBUyxFQUFTLENBQ2hELGVBQWdCLENBQUMsVUFBVyxvQkFBb0IsRUFBUSxJQUFJLE1BQU0sQ0FDcEUsQ0FBQyxFQUNELEVBQ0EsRUFDQSxDQUFFLGFBQWMsRUFBUSxZQUFhLENBQ3ZDLEVBQ0EsR0FBSSxJQUFhLEVBQUcsT0FBTyxFQUMzQixLQUNGLENBQ0EsSUFBSyxRQUFTLENBQ1osSUFBTSxFQUFXLE1BQU0sR0FBZSw0QkFBNkIsRUFBUyxFQUFVLENBQ3BGLGFBQWMsRUFBUSxZQUN4QixDQUFDLEVBQ0QsR0FBSSxJQUFhLEVBQUcsT0FBTyxFQUMzQixLQUNGLENBQ0YsQ0FFSixDQUNBLE1BQU8sRUFDVCxDQVFBLFNBQWdCLEdBQ2QsRUFDTSxDQU9GLEVBQVEsWUFBWSxZQUNuQixFQUFHLFdBQVcsRUFBSyxLQUFLLEVBQVEsUUFBUyxzQkFBc0IsQ0FBQyxHQUVyRSxRQUFRLEtBQ04sRUFBTSxPQUNKLDBCQUEwQixFQUFRLEtBQUssNkpBQ3pDLENBQ0YsQ0FDRixDQUVBLFNBQWdCLEdBQTBCLEVBQXdDLENBSWhGLE9BSEksRUFBSyxLQUFLLFFBQVUsRUFBSyxZQUFjLEVBQUssZ0JBQWtCLEVBQUssaUJBQW1CLEdBQ2pGLEVBRUYsQ0FBRSxHQUFHLEVBQU0sV0FBWSxNQUFPLENBQ3ZDLENBRUEsU0FBUyxHQUFzQixFQUFvQyxDQU9qRSxPQU5JLEVBQUcsV0FBVyxFQUFLLEtBQUssRUFBUSxRQUFTLE9BQVEsTUFBTSxDQUFDLEVBQ25ELENBQUMsRUFFTixFQUFRLFdBQWEsRUFBRyxXQUFXLEVBQUssS0FBSyxFQUFRLFFBQVMsTUFBTSxDQUFDLEVBQ2hFLEVBQUcsV0FBVyxFQUFLLEtBQUssRUFBUSxRQUFTLE9BQVEsS0FBSyxDQUFDLEVBQUksQ0FBQyxPQUFRLFlBQWEsYUFBYSxFQUFJLENBQUMsTUFBTSxFQUUzRyxFQUNULENBRUEsZUFBZSxHQUNiLEVBQ0EsRUFDQSxFQUNBLEVBQ0EsRUFDQSxFQUEwQixDQUFDLEVBQ1YsQ0FDakIsRUFBUSxJQUFJLFlBQWMsSUFDMUIsSUFBTSxFQUFnQixNQUFNLEVBQWEsR0FBRyxFQUFRLFlBQVksRUFBUyxNQUFNLElBQUksR0FBVSxDQUFJLElBQUssRUFBUyxFQUFNLENBQ25ILGFBQWMsRUFBUSxZQUN4QixDQUFDLEVBQ0QsR0FBSSxJQUFrQixFQUNwQixPQUFPLEVBRVQsSUFBTSxFQUFlLE1BQU0sR0FDekIsTUFBTSxFQUFRLGNBQWMsRUFBUyxFQUFNLENBQ3pDLGlCQUNBLHlCQUNGLENBQUMsRUFDRCxFQUNBLEVBQ0EsQ0FBRSxhQUFjLEVBQU0sQ0FDeEIsRUFDTSxFQUFlLE1BQU0sRUFBYSxFQUFjLEtBQUssQ0FBTyxFQUFHLEVBQVMsRUFBTSxDQUNsRixhQUFjLEVBQVEsWUFDeEIsQ0FBQyxFQUlELE9BSEksSUFBaUIsRUFHZCxFQUZFLENBR1gsQ0FFQSxTQUFTLEdBQ1AsRUFDQSxFQUNBLEVBQ0EsRUFBOEMsQ0FBQyxFQUM5QixDQUNqQixPQUFPLEVBQWEsRUFBUSxFQUFTLEVBQU0sQ0FDekMsR0FBRyxFQUNILG9CQUFxQixFQUN2QixDQUFDLENBQ0gsQ0FFQSxTQUFTLEdBQ1AsRUFDQSxFQUNBLEVBQ0EsRUFBOEMsQ0FBQyxFQUM5QixDQUNqQixPQUFPLEVBQWEsRUFBUSxFQUFTLEVBQU0sQ0FDekMsR0FBRyxFQUNILGdCQUFpQixHQUNqQiwrQkFBZ0MsR0FDaEMseUJBQTBCLElBQzFCLHFCQUFzQixvQkFDeEIsQ0FBQyxDQUNILENBRUEsU0FBUyxHQUFzQixFQUF3QixDQUNyRCxJQUFNLEVBQStCLENBQUMsRUFDaEMsRUFBdUIsSUFBSSxJQUMzQixFQUF5QixDQUFDLEVBQ2hDLElBQUssSUFBTSxLQUFRLEdBQWEsQ0FBTSxFQUFHLENBQ3ZDLElBQU0sRUFBaUIsR0FBMkIsQ0FBSSxFQUNsRCxFQUFxQixJQUFJLENBQWMsR0FDdkMsRUFBbUIsS0FBTSxHQUFnQixHQUFnQixFQUFhLENBQWMsQ0FBQyxJQUV6RixHQUFzQixFQUFvQixFQUFzQixDQUFjLEVBQzlFLEVBQWEsS0FBSyxDQUFJLEVBQ3hCLENBQ0EsT0FBTyxFQUFhLEtBQUs7Q0FBSSxDQUMvQixDQUVBLFNBQVUsR0FBYSxFQUFtQyxDQUN4RCxJQUFJLEVBQWlCLEVBQ3JCLEtBQU8sR0FBa0IsRUFBTyxRQUFRLENBQ3RDLElBQU0sRUFBZSxFQUFPLFFBQVE7RUFBTSxDQUFjLEVBQ3hELEdBQUksSUFBaUIsR0FBSSxDQUN2QixNQUFNLEVBQU8sTUFBTSxDQUFjLEVBQ2pDLE1BQ0YsQ0FFQSxNQUFNLEVBQU8sTUFBTSxFQUFnQixDQUFZLEVBQy9DLEVBQWlCLEVBQWUsQ0FDbEMsQ0FDRixDQUVBLFNBQVMsR0FBc0IsRUFBaUIsRUFBc0IsRUFBb0IsQ0FHeEYsR0FGQSxFQUFNLEtBQUssQ0FBSSxFQUNmLEVBQVEsSUFBSSxDQUFJLEVBQ1osRUFBTSxRQUFVLElBQXlDLE9BRTdELElBQU0sRUFBYyxFQUFNLE1BQU0sRUFDNUIsSUFBZ0IsSUFBQSxJQUNsQixFQUFRLE9BQU8sQ0FBVyxDQUU5QixDQUVBLFNBQVMsR0FBMkIsRUFBc0IsQ0FDeEQsT0FBTyxFQUNKLFdBQVcsR0FBeUIsRUFBRSxDQUFDLENBQ3ZDLEtBQUssQ0FBQyxDQUNOLFdBQVcsdUJBQXdCLEVBQUUsQ0FBQyxDQUN0QyxXQUFXLGdCQUFpQixpQkFBaUIsQ0FBQyxDQUM5QyxXQUFXLHVEQUF3RCxhQUFhLENBQUMsQ0FDakYsV0FBVyxtQkFBb0IsWUFBWSxDQUNoRCxDQUVBLFNBQVMsR0FBZ0IsRUFBVyxFQUFvQixDQUN0RCxJQUFNLEVBQVksS0FBSyxJQUFJLEVBQUUsT0FBUSxFQUFFLE1BQU0sRUFJN0MsT0FISSxJQUFjLEVBQVUsR0FDeEIsS0FBSyxJQUFJLEVBQUUsT0FBUyxFQUFFLE1BQU0sRUFBSSxFQUFZLEdBQTJDLEdBRXBGLEVBQVMsRUFBRyxDQUFDLEVBQUksR0FBYSxFQUN2QyxDQUVBLFNBQWdCLEdBQ2QsRUFDQSxFQUFvQyxDQUFDLEVBQ3JDLEVBQTJCLENBQUMsRUFDbEIsQ0FDVixJQUFNLEVBQWdDLEdBQW9DLENBQXVCLENBQUMsQ0FBQyxPQUFTLEVBQzVHLE1BQU8sQ0FBQyxPQUFRLEdBQUksRUFBVyxPQUFTLEdBQUssRUFBZ0MsQ0FBQyxFQUFJLENBQUMsV0FBVyxFQUFJLEdBQUcsQ0FBYyxDQUNySCxDQUVBLFNBQWdCLEdBQ2QsRUFDQSxFQUFvQyxDQUFDLEVBQ2MsQ0FDbkQsSUFBTSxFQUFnQixFQUFZLEtBQU0sR0FBVyxFQUFPLFNBQVMsTUFBTSxDQUFDLEVBQ3BFLEVBQWlCLEVBQVksS0FBTSxHQUFXLEVBQU8sU0FBUyxPQUFPLENBQUMsRUFDdEUsRUFBb0IsRUFBWSxTQUFXLEdBQUssRUFBd0IsU0FBVyxFQUV6RixNQUFPLENBQ0wsY0FBZSxHQUFxQixFQUNwQyxhQUFjLEdBQXFCLEdBQWlCLEVBQXdCLE9BQVMsQ0FDdkYsQ0FDRixDQzlhQSxNQUFhLEdBR1QsQ0FDRixRQUFTLGFBQ1QsU0FBVSxzQ0FDVixRQUFTLENBWFQsT0FBUSxDQUNOLFlBQWEsMkJBQ2IsS0FBTSxTQUNSLENBUVMsRUFDVCxNQUFNLFFBQVEsRUFBTSxDQUNsQixNQUFNLEdBQVMsQ0FBSSxDQUNyQixDQUNGLEVBRUEsZUFBc0IsR0FDcEIsRUFDZSxDQUlmLFFBQVEsSUFBSSxTQUFXLE9BRXZCLElBQU0sRUFBVyxNQUFNLEVBQXVCLENBQUksRUFDN0MsSUFDSCxRQUFRLE1BQU0sRUFBTSxJQUFJLG1CQUFtQixDQUFDLEVBQzVDLFFBQVEsS0FBSyxDQUFDLEdBR2hCLElBQUssSUFBTSxLQUFXLEVBQVMsWUFBYSxDQUMxQyxFQUFRLElBQUksS0FBTyxJQUVuQixFQUFRLElBQUksT0FBUyxRQUFRLElBQUksT0FFakMsSUFBTSxFQUFPLEVBQVEsWUFBWSxjQUFnQixDQUFDLEVBQzVDLEVBQVUsRUFBUSxZQUFZLGlCQUFtQixDQUFDLEVBQ3BELEVBQ0osQUFpQkUsRUFqQkUsRUFBSyxNQUNHLEdBQ0QsRUFBSyxRQUFVLEVBQVEsT0FFdEIsR0FDRCxFQUFLLEtBQ0osR0FDRCxFQUFRLGtCQUNQLEdBQ0QsRUFBUSxLQUNQLEdBQ0QsRUFBdUIsQ0FBTyxFQUU3QixHQUNELEdBQW1CLEtBQU0sR0FBTSxFQUFLLEVBQUUsR0FBSyxDQUFDLEVBQUssc0JBQ2hELEdBRUEsR0FHWixRQUFRLEtBQUssNEJBQTRCLEVBQVEsS0FBSyxLQUFLLEVBRTNELElBQU0sRUFBZ0IsRUFBUSxjQVE5QixHQVBJLEdBQ0YsTUFBTSxFQUF1QixFQUFjLFFBQVEsRUFBRyxFQUFTLENBQUksRUFFakUsRUFBRyxXQUFXLEVBQUssS0FBSyxFQUFRLFFBQVMsT0FBUSxNQUFNLENBQUMsR0FFMUQsTUFBTSxFQUF1QixFQUFRLFNBQVMsRUFBUyxDQUFJLENBQUMsQ0FBQyxXQUFXLGVBQWdCLEVBQUUsRUFBRyxFQUFTLENBQUksRUFFeEcsRUFBRyxXQUFXLEVBQUssS0FBSyxFQUFRLFFBQVMsT0FBUSxLQUFLLENBQUMsRUFBRyxDQUU1RCxNQUFNLEVBQXVCLE1BQU0sRUFBUSxVQUFVLEVBQVMsQ0FBSSxFQUFHLEVBQVMsQ0FBSSxFQUNsRixNQUFNLEdBQVksV0FBVyxFQUN6QixJQUNGLEVBQVEsSUFBSSxZQUFjLElBQzFCLE1BQU0sRUFBYSxHQUFHLEVBQVEsWUFBWSxFQUFTLE1BQU0sSUFBSSxHQUFVLENBQUksSUFBSyxFQUFTLENBQUksR0FFL0YsSUFBTSxFQUFTLEVBQ1gsTUFBTSxFQUFRLGNBQWMsRUFBUyxFQUFNLENBQUMsQ0FBQyxFQUM3QyxNQUFNLEVBQVEsa0JBQWtCLEVBQVMsRUFBTSxDQUFDLENBQUMsRUFDckQsUUFBUSxTQUFXLE1BQU0sRUFFdkIsRUFBTyxXQUFXLGVBQWdCLEVBQUUsRUFDcEMsRUFDQSxFQUNBLENBQ0UsYUFBYyxFQUNoQixDQUNGLEVBQ0ksR0FDRixNQUFNLEVBQWEsRUFBYyxLQUFLLENBQU8sRUFBRyxFQUFTLENBQUksQ0FFakUsTUFDRSxHQUF1QyxDQUFPLENBRWxELENBQ0YsQ0NwR0EsTUFBYSxHQUE4RCxDQUN6RSxRQUFTLDJCQUNULFNBQVUsNkNBQ1YsUUFoQmUsR0FDZixFQUNHLFdBQVcsTUFBTyxDQUNqQixZQUFhLDBCQUNiLEtBQU0sU0FDTixhQUFjLEVBQ2hCLENBQUMsQ0FBQyxDQUNELE9BQU8sU0FBVSxDQUNoQixZQUFhLHNDQUNiLEtBQU0sU0FDTixRQUFTLFNBQ1gsQ0FBQyxFQU1ILFFBQVEsRUFBTSxDQUNaLEdBQUksQ0FDRixJQUFNLEVBQVMsRUFBSyxPQUNwQixHQUFJLEVBQUUsS0FBVSxFQUFVLFNBQ3hCLE1BQVUsTUFBTSxtQkFBbUIsR0FBUSxFQUU3QyxFQUFTLEVBQUssSUFBSyxDQUFNLENBQzNCLE9BQVMsRUFBTyxDQUNkLFFBQVEsTUFBTSxhQUFpQixNQUFRLEVBQU0sUUFBVSxPQUFPLENBQUssQ0FBQyxFQUNwRSxRQUFRLEtBQUssQ0FBQyxDQUNoQixDQUNGLENBQ0YsRUN2QmEsR0FBb0UsQ0FDL0UsUUFBUyxZQUNULFNBQVUsNkNBQ1YsUUFBQSxDQUFBLEVBQ0EsTUFBTSxRQUFRLEVBQU0sQ0FDbEIsUUFBUSxLQUFLLE1BQU0sR0FBVSxDQUFJLENBQUMsQ0FDcEMsQ0FDRixFQUVBLGVBQXNCLEdBQVUsRUFBNkMsQ0FDM0UsSUFBTSxFQUFXLE1BQU0sRUFBdUIsRUFBTSxFQUFLLEVBQ3pELEdBQUksQ0FBQyxFQUVILE9BREEsUUFBUSxNQUFNLEVBQU0sSUFBSSxtQkFBbUIsQ0FBQyxFQUNyQyxFQUdULElBQUksRUFBaUIsR0FDZixFQUFXLEVBQVMsWUFBWSxJQUFJLEtBQU8sSUFBWSxDQUMzRCxJQUFNLEVBQXFCLENBQUMsRUFPNUIsS0FOSSxDQUFDLEVBQVEsWUFBWSxZQUFjLEVBQVEsZ0JBQzdDLEVBQVMsS0FBSyxHQUFHLEdBQWlDLENBQU8sQ0FBQyxFQUV4RCxDQUFDLEVBQVEsWUFBWSxZQUFjLEVBQVEsaUJBQWlCLFNBQVMsR0FDdkUsRUFBUyxLQUFLLGNBQWMsRUFFdkIsRUFBUyxPQUFTLEdBQUcsQ0FDMUIsSUFBTSxFQUFXLE1BQU0sRUFBdUIsRUFBUyxLQUFLLE1BQU0sRUFBRyxFQUFTLEVBQU0sQ0FFbEYsR0FBSSxFQUFTLFlBQVksT0FBUyxFQUNsQyxhQUFjLEdBQ2QsY0FBZSxFQUNqQixDQUFDLEVBR0ssRUFBYyxFQUFLLEtBQUssRUFBUSxRQUFTLE9BQU8sRUFDdEQsR0FBSSxHQUFZLEVBQUcsV0FBVyxDQUFXLEVBQUcsQ0FDMUMsRUFBRyxPQUFPLEVBQWEsQ0FBRSxNQUFPLEdBQU0sVUFBVyxFQUFLLENBQUMsRUFDdkQsUUFBUSxLQUFLLEVBQU0sT0FBTywwREFBMEQsQ0FBQyxFQUNyRixFQUFpQixHQUNqQixRQUNGLENBRUEsT0FBTyxDQUNULENBQ0YsQ0FBQyxFQUNLLEVBQVksTUFBTSxRQUFRLElBQUksQ0FBUSxFQUN4QyxFQUFnQixFQUNwQixJQUFLLEdBQU0sQ0FBQyxFQUFHLEtBQWEsRUFBVSxRQUFRLEVBQ3hDLEtBQ1csRUFBUyxZQUFZLEVBQUUsRUFBRSxZQUFZLGNBQWdCLENBQUMsRUFBQSxDQUMxRCxPQUNQLFFBQVEsS0FBSyxFQUFNLE9BQU8sNkRBQTZELENBQUMsRUFFMUYsRUFBZ0IsR0FXcEIsT0FSSyxHQUNILFFBQVEsS0FDTixFQUFNLE1BQ0osRUFDSTtvSEFDQSx1QkFDTixDQUNGLEVBQ0ssQ0FDVCxDQUVBLFNBQVMsR0FBaUMsRUFBNEIsQ0FRcEUsT0FISSxFQUFRLGlCQUFpQixZQUFZLEVBQ2hDLENBQUMsa0JBQWtCLEVBRXJCLENBQUMsQ0FDVixDQUVBLE1BQWEsR0FBNkQsQ0FDeEUsR0FBRyxHQUNILFFBQVMsSUFDWCxFQ3JFYSxHQUFzRSxDQUNqRixRQUFTLFNBQ1QsU0FBVSxzQkFDVixTQWRBLEtBQU0sQ0FDSixLQUFNLFVBQ04sUUFBUyxHQUNULFNBQVUsd0NBQ1osQ0FVQSxFQUNBLE1BQU0sUUFBUSxFQUFNLENBQ2xCLElBQU0sRUFBVyxHQUF3QixFQUFNLEVBQUssRUFDL0MsSUFDSCxRQUFRLE1BQU0sRUFBTSxJQUFJLG1CQUFtQixDQUFDLEVBQzVDLFFBQVEsS0FBSyxDQUFDLEdBR2hCLE1BQU8sRUFBSyxLQUFPLEdBQWdCLEVBQVMsS0FBTSxDQUFJLEVBQUksR0FBVyxFQUFTLEtBQU0sQ0FBSSxFQUMxRixDQUNGLEVBRUEsZUFBZSxHQUFnQixFQUFrQixFQUE0QyxDQUMzRixJQUFNLEVBQVcsR0FBd0IsQ0FBTyxFQUNoRCxHQUFJLENBQ0YsTUFBTSxHQUFXLEVBQVMsQ0FBSSxFQUM5QixNQUFNLEdBQWUsRUFBUyxDQUFJLEVBQ2xDLEVBQVMsUUFBUSxDQUNuQixPQUFTLEVBQU8sQ0FFZCxNQURBLEVBQVMsS0FBSyxDQUFLLEVBQ2IsQ0FDUixRQUFVLENBQ1IsRUFBUyxPQUFPLENBQ2xCLENBQ0YsQ0FFQSxlQUFlLEdBQVcsRUFBa0IsRUFBNEMsQ0FDdEYsTUFBTSxHQUFrQixHQUFHLEVBQVEsc0JBQXNCLFVBQVcsRUFBUyxDQUFJLEVBQzdFLEVBQVEsWUFBWSxVQUFVLGFBQ2hDLE1BQU0sR0FBa0IsR0FBRyxFQUFRLHNCQUFzQixXQUFZLEVBQVMsQ0FBSSxFQUVwRixNQUFNLEdBQ0osY0FFRSxHQUFLLENBQ0gsR0FBRyxFQUNILEVBQUcsQ0FBQyxNQUFNLEVBQ1YsSUFBSyxHQUNMLE9BQVEsR0FDUixPQUFRLEVBQ1YsQ0FBK0IsRUFDakMsQ0FBRSxPQUFRLEVBQUssQ0FDakIsRUFNQSxNQUFNLEdBQ0osZ0JBQ00sR0FBVSxDQUFFLEdBQUcsRUFBTSxFQUFHLENBQUMsV0FBVyxDQUFFLENBQW9DLEVBQ2hGLENBQUUsT0FBUSxFQUFLLENBQ2pCLENBQ0YsQ0FFQSxlQUFlLEdBQWUsRUFBa0IsRUFBNEMsQ0FDMUYsSUFBTSxFQUFXLEdBQTBCLENBQ3pDLEdBQUcsRUFDSCxFQUFHLENBQUMsTUFBTSxFQUNWLElBQUssV0FDTCxPQUFRLEVBQ1YsQ0FBK0IsRUFDekIsRUFBVyxNQUFNLEdBQUssRUFBVSxDQUFFLGFBQWMsRUFBTSxDQUFDLEVBQzdELEdBQUksSUFBYSxFQUFHLE9BRWYsRUFBUSxZQUFZLFVBQVUsY0FDakMsUUFBUSxLQUFLLEVBQU0sSUFBSSxFQUFNLEtBQUsscUJBQXFCLEVBQVMsR0FBRyxFQUFHLE1BQU0sQ0FBQyxFQUM3RSxRQUFRLEtBQUssQ0FBUSxHQUd2QixRQUFRLEtBQ04sRUFBTSxPQUFPLG9HQUFvRyxDQUNuSCxFQUNBLE1BQU0sR0FBa0IsR0FBRyxFQUFRLHNCQUFzQixXQUFZLEdBQWdCLEVBQVMsQ0FBUSxFQUFHLEVBQVUsQ0FDakgsZUFBZ0IsRUFDbEIsQ0FBQyxFQUVELElBQU0sRUFBZ0IsTUFBTSxHQUFLLEVBQVUsQ0FBRSxhQUFjLEVBQU0sQ0FBQyxFQUM5RCxJQUFrQixJQUNwQixRQUFRLEtBQUssRUFBTSxJQUFJLEVBQU0sS0FBSyxxQkFBcUIsRUFBYyxHQUFHLEVBQUcsMkJBQTJCLENBQUMsRUFDdkcsUUFBUSxLQUFLLENBQWEsR0FFNUIsUUFBUSxLQUFLLEVBQU0sTUFBTSxvQ0FBb0MsQ0FBQyxDQUNoRSxDQUVBLFNBQVMsR0FBZ0IsRUFBa0IsRUFBZ0MsQ0FDekUsSUFBTSxFQUFjLEVBQWdCLEVBQU0sR0FBTSxFQUFRLE9BQU8sRUFDL0QsR0FBSSxDQUFDLEVBQ0gsTUFBVSxNQUFNLHNCQUFzQixFQUFRLFNBQVMsRUFFekQsT0FBTyxDQUNULENBRUEsZUFBZSxHQUNiLEVBQ0EsRUFDQSxFQUF3RCxDQUFDLEVBQ3hDLENBQ1osRUFBUSxRQUNYLFFBQVEsS0FBSztFQUFPLEVBQU0sS0FBSyxFQUFNLEtBQUssUUFBUSxFQUFHLENBQVcsQ0FBQyxFQUVuRSxJQUFNLEVBQVksTUFBTSxFQUFRLEdBQU0sRUFTdEMsT0FSSSxJQUFhLEdBQUssRUFBUSxhQUN2QixFQUFRLFFBQ1gsUUFBUSxLQUFLLEVBQU0sTUFBTSxFQUFNLEtBQUssV0FBVyxFQUFHLENBQVcsQ0FBQyxHQUdoRSxRQUFRLEtBQUssRUFBTSxJQUFJLEVBQU0sS0FBSyxxQkFBcUIsRUFBUyxHQUFHLEVBQUcsQ0FBVyxDQUFDLEVBQ2xGLFFBQVEsS0FBSyxDQUFRLEdBRWhCLENBQ1QsQ0FFQSxlQUFlLEdBQ2IsRUFDQSxFQUNBLEVBQ0EsRUFBZ0UsQ0FBQyxFQUNoRCxDQUVqQixHQURBLEdBQWEsRUFBUyxFQUFRLE9BQU8sRUFDakMsRUFBSyxPQUNQLE1BQU8sR0FHVCxJQUFNLEVBQU0sTUFBTSxFQUFXLEVBQVMsSUFBQSxHQUFXLENBQy9DLElBQUssRUFBUSxRQUNiLElBQUssR0FBYSxFQUFRLElBQUssQ0FBRSxjQUFlLEVBQU0sQ0FBQyxFQUN2RCxNQUFPLEdBQ1AsTUFBTyxPQUNQLGlCQUFrQixHQUNsQixXQUFZLEdBQ1osZUFBZ0IsRUFBUSxlQUN4QixlQUFnQixFQUFRLGVBQ3hCLFFBQVMsRUFBSyxPQUNoQixDQUFDLEVBQ0ssRUFBVyxFQUFJLFFBQVUsRUFTL0IsT0FSSyxFQUFRLGdCQUNYLEdBQTBCLEVBQVMsRUFBVSxFQUFJLE1BQU0sRUFHckQsSUFBYSxHQUFLLENBQUMsRUFBUSxlQUM3QixRQUFRLEtBQUssRUFBTSxJQUFJLEVBQU0sS0FBSyxxQkFBcUIsRUFBUyxHQUFHLEVBQUcsQ0FBTyxDQUFDLEVBQzlFLFFBQVEsS0FBSyxDQUFRLEdBRWhCLENBQ1QsQ0FZQSxTQUFTLEdBQTBCLEVBQWlCLEVBQWtCLEVBQXNCLENBQzFGLEdBQUksSUFBYSxHQUFLLHVDQUF1QyxLQUFLLENBQU8sRUFBRyxDQUMxRSxRQUFRLEtBQUssRUFBTSxNQUFNLFlBQVksQ0FBQyxFQUN0QyxNQUNGLENBRUEsSUFBTSxFQUFnQixFQUFPLEtBQUssRUFDOUIsSUFDRixRQUFRLE9BQU8sTUFBTSxDQUFhLEVBQ2xDLFFBQVEsT0FBTyxNQUFNO0NBQUksRUFFN0IsQ0FFQSxTQUFTLEdBQWEsRUFBaUIsRUFBbUIsQ0FDeEQsUUFBUSxLQUFLO0VBQU8sRUFBTSxLQUFLLEVBQU0sS0FBSyxVQUFVLEVBQUcsQ0FBTyxFQUFJLEVBQU0sS0FBSyxPQUFPLEdBQUssQ0FBQyxDQUM1RixDQUVBLFNBQVMsR0FBd0IsRUFJL0IsQ0FDQSxJQUFNLEVBQVksS0FBSyxJQUFJLEVBQ3JCLEVBQVksRUFBSyxLQUFLLEVBQVEsUUFBUyxLQUFLLEVBQ2xELEVBQUcsVUFBVSxFQUFXLENBQUUsVUFBVyxFQUFLLENBQUMsRUFFM0MsSUFBTSxFQUFjLEVBQUssS0FBSyxFQUFXLGlCQUFpQixFQUNwRCxFQUFVLEVBQUcsU0FBUyxFQUFhLEdBQUcsRUFDdEMsRUFBc0IsUUFBUSxPQUFPLE1BQU0sS0FBSyxRQUFRLE1BQU0sRUFDOUQsRUFBc0IsUUFBUSxPQUFPLE1BQU0sS0FBSyxRQUFRLE1BQU0sRUFDaEUsRUFBWSxHQUNaLEVBQVcsR0FFZixRQUFRLE9BQU8sTUFBUSxHQUFTLEVBQXFCLENBQU8sRUFDNUQsUUFBUSxPQUFPLE1BQVEsR0FBUyxFQUFxQixDQUFPLEVBQzVELFFBQVEsS0FBSyxFQUFNLEtBQUssRUFBTSxLQUFLLFdBQVcsRUFBRyxDQUFXLENBQUMsRUFFN0QsSUFBTSxNQUFxQixDQUN6QixHQUFJLEVBQVUsT0FDZCxFQUFXLEdBRVgsUUFBUSxPQUFPLE1BQVEsRUFDdkIsUUFBUSxPQUFPLE1BQVEsRUFFdkIsSUFBTSxFQUFjLEdBQWtCLEtBQUssSUFBSSxFQUFJLENBQVMsRUFFdEQsRUFBVSxHQURELEVBQVksWUFBYyxTQUNmLE1BQU0sRUFBWSxjQUFjLEVBQVksSUFDaEUsRUFBaUIsRUFBWSxFQUFNLE1BQU0sQ0FBTyxFQUFJLEVBQU0sSUFBSSxDQUFPLEVBQzNFLEVBQW9CLENBQWMsRUFDbEMsRUFBRyxVQUFVLEVBQVMsQ0FBTyxFQUM3QixFQUFHLFVBQVUsQ0FBTyxDQUN0QixFQUlBLE9BRkEsUUFBUSxLQUFLLE9BQVEsQ0FBTSxFQUVwQixDQUNMLEtBQU8sR0FBVSxDQUNmLEVBQVksR0FDUixHQUNGLFFBQVEsTUFBTSxDQUFLLENBRXZCLEVBQ0EsV0FBYyxDQUNaLFFBQVEsZUFBZSxPQUFRLENBQU0sRUFDckMsRUFBTyxDQUNULEVBQ0EsWUFBZSxDQUNiLEVBQVksRUFDZCxDQUNGLENBQ0YsQ0FFQSxTQUFTLEdBQVMsRUFBNEMsRUFBOEMsQ0FDMUcsUUFDRSxFQUNBLEVBQ0EsSUFDRyxDQUNILElBQU0sRUFDSixPQUFPLEdBQVUsU0FDYixPQUFPLEtBQUssRUFBTyxPQUFPLEdBQXVCLFNBQVcsRUFBcUIsTUFBTSxFQUN2RixFQUtOLE9BSkEsRUFBRyxVQUFVLEVBQVMsQ0FBTSxFQUlyQixFQUFjLEVBQVEsT0FBTyxHQUF1QixXQUFhLEVBQXFCLENBQVEsQ0FDdkcsRUFDRixDQUVBLFNBQVMsR0FBa0IsRUFBOEIsQ0FDdkQsSUFBTSxFQUFVLEtBQUssTUFBTSxFQUFlLEdBQUksRUFDeEMsRUFBVSxLQUFLLE1BQU0sRUFBVSxFQUFFLEVBQ2pDLEVBQW1CLEVBQVUsR0FJbkMsT0FISSxJQUFZLEVBQ1AsR0FBRyxFQUFpQixHQUV0QixHQUFHLEVBQVEsSUFBSSxFQUFpQixFQUN6QyxDQ2pRQSxNQUFNLEVBQU0sRUFBUSxRQUFRLElBQUksQ0FBQyxDQUFDLENBQy9CLFdBQVcsSUFBSSxDQUFDLENBQ2hCLFFBQVEsRUFBb0IsQ0FBQyxDQUM3QixXQUFZLEdBQVMsQ0FDcEIsSUFBTSxFQUFhLEVBQUssZUFDeEIsR0FBSSxFQUFZLENBQ2QsSUFBTSxFQUFVLEVBQUssUUFBUSxDQUFVLEVBQ3ZDLFFBQVEsTUFBTSxDQUFPLENBQ3ZCLENBRUksUUFBUSxJQUFJLE1BQU0sU0FBUyxZQUFZLEdBR3pDLFFBQVEsS0FDTixrSkFFRixFQUdGLEdBQXFDLFFBQVEsR0FBRyxDQUNsRCxDQUFDLENBQUMsQ0FDRCxRQUFRLEVBQWlCLENBQUMsQ0FDMUIsUUFBUSxFQUFvQixDQUFDLENBQzdCLFFBQVEsRUFBbUIsQ0FBQyxDQUM1QixRQUFRRyxFQUFhLENBQUMsQ0FDdEIsUUFBUSxFQUFhLENBQUMsQ0FDdEIsUUFBUSxFQUFjLENBQUMsQ0FDdkIsUUFBUSxFQUFpQixDQUFDLENBQzFCLFFBQVEsRUFBc0IsQ0FBQyxDQUMvQixRQUFRLEVBQVcsQ0FBQyxDQUNwQixRQUFRLEVBQWtCLENBQUMsQ0FDM0IsUUFBUSxFQUE2QixDQUFDLENBQ3RDLFFBQVEsRUFBYSxDQUFDLENBQ3RCLFFBQVEsRUFBWSxDQUFDLENBQ3JCLFFBQVEsRUFBWSxDQUFDLENBQ3JCLFFBQVEsRUFBMkIsQ0FBQyxDQUNwQyxRQUFRLEVBQVksQ0FBQyxDQUNyQixRQUFRLEVBQVcsQ0FBQyxDQUNwQixRQUFRLEVBQWUsQ0FBQyxDQUN4QixRQUFRLEVBQWUsQ0FBQyxDQUN4QixRQUFRLEVBQWdCLENBQUMsQ0FDekIsUUFBUSxFQUFTLENBQUMsQ0FDbEIsY0FBYyxDQUFDLENBQ2YsT0FBTyxDQUFDLENBQ1IsUUFBUSxHQUFXLENBQUMsQ0FBQyxDQUNyQixLQUFLLENBQUMsQ0FBQyxLQUVWLFNBQVMsSUFBcUIsQ0FDNUIsSUFBSSxFQUFpQixFQUFLLFFBQVEsSUFBSSxJQUFJLE9BQU8sS0FBSyxHQUFHLENBQUMsQ0FBQyxRQUFRLEVBQ25FLEtBQU8sQ0FBQyxFQUFHLFdBQVcsRUFBSyxLQUFLLEVBQWdCLGNBQWMsQ0FBQyxHQUM3RCxFQUFpQixFQUFLLFFBQVEsQ0FBYyxFQUs5QyxPQUhvQixLQUFLLE1BQU0sRUFBRyxhQUFhLEVBQUssS0FBSyxFQUFnQixjQUFjLEVBQUcsTUFBTSxDQUcvRSxDQUFDLENBQUMsT0FDckIsQ0FFQSxJQUFJLEdBQWUsR0FDbkIsSUFBSyxJQUFNLElBQVUsQ0FBQyxTQUFVLFVBQVcsU0FBUyxFQUNsRCxRQUFRLEdBQUcsTUFBYyxDQUNuQixPQUVKLElBQWUsR0FDZixHQUFJLENBQ0YsRUFBUyxRQUFRLEdBQUcsQ0FDdEIsT0FBUyxFQUFPLENBQ2QsUUFBUSxLQUFLLHNCQUFzQixRQUFRLElBQUksb0JBQXFCLENBQUssQ0FDM0UsQ0FDQSxRQUFRLEtBQUssQ0FORSxDQU9qQixDQUFDIn0=
|
|
105
|
+
|| wait-on -t 90000 -i 10000 http-get://127.0.0.1:${t}`}waitAndOpenApp(e){let t=e.env.PORT;return`${this.waitApp(e)} || wait-on http-get://127.0.0.1:${t} && open-cli http://\${HOST:-localhost}:${t}`}};function Ro(e){try{return e.findFile(`scripts/start-production.sh`)}catch{return}}function zo(e){try{return e.findFile(`ecosystem.config.cjs`)}catch{return}}function Bo(e,t,n,r=[]){let i=[`BUN`,`playwright`],a=t?.map(String);if(e[0]!==`test`||!a?.length)return Vo([...i,...e,...r],n);let o=e.slice(1),s=Ho(o),c=s.length===0?o:o.filter((e,t)=>!s.includes(t));return Vo([...i,`test`,...a,...c,...r],n)}function Vo(e,t){let n=e.indexOf(`playwright`),r=n!==-1&&e[n+1]===`test`;return!t||!r||e.some(e=>e===`--max-failures`||e.startsWith(`--max-failures=`))?K(e):K([...e,`--max-failures=1`])}function Ho(e){let t,n=[];for(let[r,i]of e.entries()){if(t){if(t===`required`||!i.startsWith(`-`)){t=void 0;continue}t=void 0}if(i===`--`)return[...n,...e.slice(r+1).map((e,t)=>r+1+t)];if(i.startsWith(`--`)){if(i.includes(`=`))continue;Uo.has(i)?t=`required`:Wo.has(i)&&(t=`optional`);continue}if(i.startsWith(`-`)&&i!==`-`){let e=i.slice(0,2);i.length===2&&Go.has(e)&&(t=`required`);continue}n.push(r)}return n}const Uo=new Set([`--browser`,`--config`,`--grep`,`--grep-invert`,`--global-timeout`,`--max-failures`,`--output`,`--project`,`--repeat-each`,`--reporter`,`--retries`,`--shard`,`--test-list`,`--test-list-invert`,`--timeout`,`--trace`,`--tsconfig`,`--ui-host`,`--ui-port`,`--ui-title`,`--workers`]),Wo=new Set([`--only-changed`,`--update-snapshots`,`--update-source-method`]),Go=new Set([`-c`,`-g`,`-j`]),Ko=new class extends Lo{constructor(){super(!0)}startDevProtected(e,t){return`blitz dev ${t.normalizedArgsText??``}`}};var qo=class extends Lo{constructor(){super(!1)}startDevProtected(e,t){return`YARN build-ts run ${t.watch?`--watch`:``} src/index.ts -- ${t.normalizedArgsText??``}`}async testE2EProtected(e,t,n,r={}){if(e.hasPlaywrightConfig)return super.testE2EProtected(e,t,n,r);e.env.PORT||=`3000`;let i=await qr(e.env.PORT,e),a=e.packageJson.scripts?.[`test/e2e-additional`]?` && YARN test/e2e-additional`:``,o=t.targets?.map(String),s=o?.length?o:[`test/e2e/`],c=this.testUnit(e,{...t,targets:s});return K([`YARN`,`wb`,`concurrently`,...xt(t),`--kill-others`,`--success`,`first`,`${n} && exit 1`,`wait-on -t 600000 -i 2000 http-get://127.0.0.1:${i} && ${c}${a}`])}};const Jo=new qo,Yo=new class extends Lo{constructor(){super(!0)}startDevProtected(e,t){return`YARN next dev --turbopack ${t.normalizedArgsText??``}`}buildDefaultProductionStartCommands(e,t){return[e.buildCommand,`YARN next start ${t.normalizedArgsText??``}`.trim()]}},Xo=new class extends Lo{constructor(){super(!1)}startDevProtected(e,t){throw Error(`This method should not be called.`)}startDev(e,t){return Promise.resolve(`YARN build-ts run ${t.watch?`--watch`:``} src/index.ts -- ${t.normalizedArgsText??``}`)}startProduction(e,t){return Promise.resolve(`${e.buildCommand} && ${e.isBunAvailable?`bun run`:`node`} dist/index.js ${t.normalizedArgsText??``} | tee server.log`)}startTest(){return Promise.resolve(`echo 'do nothing.'`)}startDocker(e,t){return Promise.resolve(`${this.buildDocker(e,`development`)} && ${$.stopAndStart(e,t.normalizedDockerOptionsText??``,t.normalizedArgsText??``)}`)}testE2EDev(){return Promise.resolve(`echo 'do nothing.'`)}testE2EProduction(){return Promise.resolve(`echo 'do nothing.'`)}testE2EDocker(){return Promise.resolve(`echo 'do nothing.'`)}testStart(){return Promise.resolve(`echo 'do nothing.'`)}},Zo=new class extends Lo{constructor(){super(!0)}startDevProtected(e,t){return`remix dev ${t.normalizedArgsText??``}`}},Qo=new class extends Lo{constructor(){super(!0)}startDevProtected(e,t){e.env.PORT||=`3000`;let n=`YARN vinext dev --port ${e.env.PORT} ${t.normalizedArgsText??``}`.trim(),r=[zt(t,`.dev.vars`)],i=Je(e,`test`)?Vt(e):void 0;return i&&r.push(i),[...r,n].join(` && `)}buildDefaultProductionStartCommands(e,t){e.env.PORT||=`3000`;let n=e.env.PORT,r=Vt(e);return[e.buildCommand,zt(t,`dist/server/.dev.vars`),...r?[r]:[],Bt(`dev --config dist/server/wrangler.json --ip 127.0.0.1 --port ${n} --persist-to "${Kt(e)}" --local-upstream localhost:${n} ${t.normalizedArgsText??``}`.trim())]}},$o=new class extends Lo{constructor(){super(!0)}startDevProtected(e,t){return`YARN vite dev ${t.normalizedArgsText??``}`.trim()}startProductionProtected(e,t){return`${e.buildCommand} && YARN vite preview ${t.normalizedArgsText??``}`.trim()}},es=new class extends qo{startDevProtected(e,t){return this.buildWranglerDevCommands(e,t).join(` && `)}buildDefaultProductionStartCommands(e,t){return this.buildWranglerDevCommands(e,t)}buildWranglerDevCommands(e,t){e.env.PORT||=`8787`;let n=Kt(e),r=[zt(t,`.dev.vars`)],i=Vt(e);return i&&r.push(i),r.push(Bt(`dev --ip 127.0.0.1 --port ${e.env.PORT} --persist-to "${n}" ${t.normalizedArgsText??``}`.trim())),r}},ts=[`express`,`fastify`,`elysia`,`hono`],ns={...Po,mode:{description:`Start mode: dev[elopment] (default) | staging | docker | docker-debug | test`,type:`string`,alias:`m`}},rs={command:`start [args..]`,describe:`Start app. Use '--' to stop wb option parsing and forward the remaining arguments to the underlying app command. Example: wb start -- --host 0.0.0.0`,builder:e=>e.parserConfiguration({"populate--":!0}).options(ns),async handler(e){Fo(e);let t=await H(e);t||(console.error(f.red(`No project found.`)),process.exit(1));for(let n of t.descendants){let t=n.packageJson.dependencies??{},r=n.packageJson.devDependencies??{},i;if(t.blitz)i=Ko;else if(t.vinext||r.vinext)i=Qo;else if(t.next)i=Yo;else if(r[`@remix-run/dev`])i=Zo;else if(r.vite)i=$o;else if(J(n))i=es;else if(ts.some(e=>t[e])&&!t[`firebase-functions`]||n.hasDockerfile&&/EXPOSE\s+8080/.test(n.dockerfile))i=Jo;else if(t[`build-ts`]||r[`build-ts`])i=Xo;else continue;switch(console.info(`Running "start" for ${n.name} ...`),e.mode??`dev`){case`dev`:case`development`:process.env.WB_ENV||=`development`,await U(await i.startDev(n,e),n,e);break;case`staging`:process.env.WB_ENV||=`staging`,await U(await i.startProduction(n,e),n,e);break;case`docker`:process.env.WB_ENV||=`staging`,await U(await i.startDocker(n,e),n,e);break;case`docker-debug`:process.env.WB_ENV||=`staging`,e.normalizedArgsText=`'/bin/bash'`,await U(await i.startDocker(n,e),n,e);break;case`test`:process.env.WB_ENV||=`test`,await U(await i.startTest(n,e),n,e);break;default:throw Error(`Unknown start mode: ${e.mode}`)}}}},is=RegExp(`${String.fromCodePoint(27)}\\[[0-?]*[ -/]*[@-~]`,`g`),as=.05,os={e2e:{description:`How to run E2E tests`,type:`string`,choices:[`headless`,`headless-dev`,`headed`,`headed-dev`,`docker`,`docker-debug`,`debug`,`generate`,`trace`],default:`headless`},silent:{description:`Reduce redundant outputs`,type:`boolean`},bail:{description:`Stop tests after the first failure`,type:`boolean`},"unit-timeout":{description:`Timeout for unit tests`,type:`number`}},ss={targets:{array:!0,description:`Unit or E2E test target paths`,type:`string`}},cs={command:`test [targets...]`,describe:`Test project. If you pass no arguments, it will run all tests. Use '--' to stop wb option parsing and forward the remaining flags to Playwright. Example: wb test -- --grep 'uploaded image asset'`,builder:e=>e.parserConfiguration({"populate--":!0}).options(os).positional(`targets`,ss.targets),async handler(e){process.exit(await ls(e))}};async function ls(n,r={}){let i=ds(n),a=await H(i);if(!a)return console.error(f.red(`No project found.`)),1;let o=i.targets??[],s=i[`--`]??[],{shouldRunE2e:c,shouldRunUnit:l}=Ss(o,s);for(let n of a.descendants){n.env.WB_ENV||=`test`;let a=n.packageJson.dependencies??{},u=n.packageJson.devDependencies??{},d;d=a.blitz?Ko:a.vinext||u.vinext?Qo:a.next?Yo:u[`@remix-run/dev`]?Zo:u.vite?$o:J(n)?es:ts.some(e=>a[e])&&!a[`firebase-functions`]?Jo:Xo,console.info(`Running "test" for ${n.name} ...`);let f=fs(n);if(l&&f!==!1){let e=o.filter(e=>e.includes(`/unit`)),t=e.length>0?e:f.length>0?f:void 0,a={...i,targets:t},s=await hs(d.testUnit(n,a),n,i,{exitIfFailed:r.exitIfFailed,timeout:i.unitTimeout});if(s!==0)return s}if(!c||!e.existsSync(t.join(n.dirPath,`test`,`e2e`))){c&&us(n);continue}let p=o.filter(e=>e.includes(`/e2e`)),m={...i,targets:p.length>0?p:void 0};switch(i.e2e){case`headless`:{let e=await ms(await d.testE2EProduction(n,m,{playwrightArgs:xs(p,s),forwardedPlaywrightArgs:s}),n,i,{exitIfFailed:r.exitIfFailed});if(e!==0)return e;continue}case`headless-dev`:{let e=await ms(await d.testE2EDev(n,m,{playwrightArgs:xs(p,s),forwardedPlaywrightArgs:s}),n,i,{exitIfFailed:r.exitIfFailed});if(e!==0)return e;continue}case`docker`:{let e=await ps(n,m,d,xs(p,s),s,r);if(e!==0)return e;continue}case`docker-debug`:{let e=await ps(n,m,d,xs(p,s,[`--debug`]),s,r);if(e!==0)return e;continue}}if(a.blitz||a.next||u[`@remix-run/dev`]||u.vite)switch(i.e2e){case`headed`:{let e=await ms(await d.testE2EProduction(n,m,{playwrightArgs:xs(p,s,[`--headed`]),forwardedPlaywrightArgs:s}),n,i,{exitIfFailed:r.exitIfFailed});if(e!==0)return e;break}case`headed-dev`:{let e=await ms(await d.testE2EDev(n,m,{playwrightArgs:xs(p,s,[`--headed`]),forwardedPlaywrightArgs:s}),n,i,{exitIfFailed:r.exitIfFailed});if(e!==0)return e;break}case`debug`:{let e=await ms(await d.testE2EProduction(n,m,{playwrightArgs:xs(p,s,[`--debug`]),forwardedPlaywrightArgs:s}),n,i,{exitIfFailed:r.exitIfFailed});if(e!==0)return e;break}case`generate`:{let e=await ms(await d.testE2EProduction(n,m,{playwrightArgs:[`codegen`,`http://localhost:${n.env.PORT}`]}),n,i,{exitIfFailed:r.exitIfFailed});if(e!==0)return e;break}case`trace`:{let e=await ms(`BUN playwright show-trace`,n,i,{exitIfFailed:r.exitIfFailed});if(e!==0)return e;break}}}return 0}function us(n){n.packageJson.workspaces||e.existsSync(t.join(n.dirPath,`playwright.config.ts`))&&console.warn(f.yellow(`Skipping e2e tests for ${n.name}: a Playwright config exists but the test/e2e directory is missing. wb only discovers Playwright specs under test/e2e/, so move them there to run e2e tests.`))}function ds(e){return e.env?.length||e.cascadeEnv||e.cascadeNodeEnv||e.autoCascadeEnv===!1?e:{...e,cascadeEnv:`test`}}function fs(n){return e.existsSync(t.join(n.dirPath,`test`,`unit`))?[]:n.hasVitest&&e.existsSync(t.join(n.dirPath,`test`))?e.existsSync(t.join(n.dirPath,`test`,`e2e`))?[`test`,`--exclude`,`test/e2e/**`]:[`test`]:!1}async function ps(e,t,n,r,i,a={}){e.env.WB_DOCKER||=`1`;let o=await U(`${n.buildDocker(e,`test`)}${Io(t)}`,e,t,{exitIfFailed:a.exitIfFailed});if(o!==0)return o;let s=await ms(await n.testE2EDocker(e,t,{playwrightArgs:r,forwardedPlaywrightArgs:i}),e,t,{exitIfFailed:!1}),c=await U($.stop(e),e,t,{exitIfFailed:a.exitIfFailed});return s===0?c:s}function ms(e,t,n,r={}){return U(e,t,n,{...r,processSilentOutput:gs})}function hs(e,t,n,r={}){return U(e,t,n,{...r,omitSilentStart:!0,printSilentOutputOnFailureOnly:!0,silentProgressIntervalMs:1e4,silentSuccessMessage:`Unit tests passed.`})}function gs(e){let t=[],n=new Set,r=[];for(let i of _s(e)){let e=ys(i);n.has(e)||t.some(t=>bs(t,e))||(vs(t,n,e),r.push(i))}return r.join(`
|
|
106
|
+
`)}function*_s(e){let t=0;for(;t<=e.length;){let n=e.indexOf(`
|
|
107
|
+
`,t);if(n===-1){yield e.slice(t);return}yield e.slice(t,n),t=n+1}}function vs(e,t,n){if(e.push(n),t.add(n),e.length<=200)return;let r=e.shift();r!==void 0&&t.delete(r)}function ys(e){return e.replaceAll(is,``).trim().replaceAll(/^(?:\[[^\]]+\]\s*)+/g,``).replaceAll(/\(node:\d+\)/g,`(node:<number>)`).replaceAll(/\b\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}(?:\.\d+)?Z?\b/g,`<timestamp>`).replaceAll(/([?&]cache=)\d+/g,`$1<number>`)}function bs(e,t){let n=Math.max(e.length,t.length);return n===0?!0:Math.abs(e.length-t.length)>n*as?!1:T(e,t)/n<=as}function xs(e,t=[],n=[]){let r=Ho(t).length>0;return[`test`,...e.length>0||r?[]:[`test/e2e/`],...n]}function Ss(e,t=[]){let n=e.some(e=>e.includes(`/e2e`)),r=e.some(e=>e.includes(`/unit`)),i=e.length===0&&t.length===0;return{shouldRunUnit:i||r,shouldRunE2e:i||n||t.length>0}}const Cs={command:`test-on-ci`,describe:`Test project on CI with no options.`,builder:{silent:{description:`Reduce redundant outputs`,type:`boolean`}},async handler(e){await ws(e)}};async function ws(n){process.env.WB_ENV||=`test`;let r=await H(n);r||(console.error(f.red(`No project found.`)),process.exit(1));for(let i of r.descendants){i.env.CI||=`1`,i.env.WB_ENV=process.env.WB_ENV;let r=i.packageJson.dependencies??{},a=i.packageJson.devDependencies??{},o;o=r.blitz?Ko:r.vinext||a.vinext?Qo:r.next?Yo:a[`@remix-run/dev`]?Zo:a.vite?$o:J(i)?es:ts.some(e=>r[e])&&!r[`firebase-functions`]?Jo:Xo,console.info(`Running "test-on-ci" for ${i.name} ...`);let s=i.hasDockerfile;if(s&&await W($.stopAll(),i,n),e.existsSync(t.join(i.dirPath,`test`,`unit`))&&await W(o.testUnit(i,n).replaceAll(` --allowOnly`,``),i,n),e.existsSync(t.join(i.dirPath,`test`,`e2e`))){await W(await o.testStart(i,n),i,n),await pt.promiseAll(),s&&(i.env.WB_DOCKER||=`1`,await U(`${o.buildDocker(i,`test`)}${Io(n)}`,i,n));let e=s?await o.testE2EDocker(i,n,{}):await o.testE2EProduction(i,n,{});process.exitCode=await U(e.replaceAll(` --allowOnly`,``),i,n,{exitIfFailed:!1}),s&&await U($.stop(i),i,n)}else us(i)}}const Ts={command:`tree-kill <pid> [signal]`,describe:`Kill the given process and all descendants`,builder:e=>e.positional(`pid`,{description:`The process ID to kill.`,type:`number`,demandOption:!0}).option(`signal`,{description:`Signal to send to the process tree.`,type:`string`,default:`SIGTERM`}),handler(e){try{let t=e.signal;if(!(t in h.signals))throw Error(`Invalid signal: ${t}`);I(e.pid,t)}catch(e){console.error(e instanceof Error?e.message:String(e)),process.exit(1)}}},Es={command:`typecheck`,describe:`Run type checking. .env files are ignored.`,builder:{},async handler(e){process.exit(await Ds(e))}};async function Ds(n){let r=await H(n,!1);if(!r)return console.error(f.red(`No project found.`)),1;let i=!1,a=r.descendants.map(async a=>{let o=[];for((!a.packageJson.workspaces||a.hasSourceCode)&&o.push(...Os(a)),!a.packageJson.workspaces&&a.hasOwnDependency(`pyright`)&&o.push(`YARN pyright`);o.length>0;){let s=await W(o.join(` && `),a,n,{ci:r.descendants.length>1,exitIfFailed:!1,preserveColor:!0}),c=t.join(a.dirPath,`.next`);if(s&&e.existsSync(c)){e.rmSync(c,{force:!0,recursive:!0}),console.info(f.yellow("Removed `.next` directory. We will re-try type checking.")),i=!0;continue}return s}}),o=await Promise.all(a),s=0;for(let[e,t]of o.entries())t&&((r.descendants[e]?.packageJson.dependencies??{}).blitz&&console.info(f.yellow(`Please try "yarn gen-code" if you face unknown type errors.`)),s=t);return s||console.info(f.green(i?`-----
|
|
108
|
+
No type errors found. Please ignore the previous type errors, as they were caused by outdated Next.js cache files.`:`No type errors found.`)),s}function Os(e){return e.hasOwnDependency(`typescript`)?[`BUN tsc --noEmit`]:[]}const ks={...Es,command:`tc`},As={command:`verify`,describe:`Verify project code`,builder:{full:{type:`boolean`,default:!1,describe:`Run tests after verifying project code`}},async handler(e){let t=Ye(e,!1);t||(console.error(f.red(`No project found.`)),process.exit(1)),await(e.full?js(t.self,e):Ms(t.self,e))}};async function js(e,t){let n=zs(e);try{await Ms(e,t),await Ns(e,t),n.succeed()}catch(e){throw n.fail(e),e}finally{n.finish()}}async function Ms(e,t){await Is(`${e.packageManagerCommand} install`,e,t),e.packageJson.scripts?.[`gen-code`]&&await Is(`${e.packageManagerCommand} gen-code`,e,t),await Fs(`cleanup`,()=>xr({...t,_:[`lint`],fix:!0,format:!0,silent:!0}),{silent:!0}),await Fs(`typecheck`,()=>Ds({...t,_:[`typecheck`]}),{silent:!0})}async function Ns(e,t){let n=ds({...t,_:[`test`],e2e:`headless`,silent:!0}),r=await ls(n,{exitIfFailed:!1});if(r===0)return;e.packageJson.scripts?.[`db-reset`]||(console.info(f.red(f.bold(`Failed (exit code ${r}):`),`test`)),process.exit(r)),console.info(f.yellow(`Tests failed. This project defines "db-reset", so wb will reset the database once and retry tests.`)),await Is(`${e.packageManagerCommand} db-reset`,Ps(e,n),n,{printRawOutput:!0});let i=await ls(n,{exitIfFailed:!1});i!==0&&(console.info(f.red(f.bold(`Failed (exit code ${i}):`),`test after db-reset retry`)),process.exit(i)),console.info(f.green(`Tests passed after db-reset retry.`))}function Ps(e,t){let n=V(t,!0,e.dirPath);if(!n)throw Error(`Project not found: ${e.dirPath}`);return n}async function Fs(e,t,n={}){n.silent||console.info(`
|
|
109
|
+
`+f.cyan(f.bold(`Start:`),e));let r=await t()??0;return r===0||n.allowFailure?n.silent||console.info(f.green(f.bold(`Finished:`),e)):(console.info(f.red(f.bold(`Failed (exit code ${r}):`),e)),process.exit(r)),r}async function Is(e,t,n,r={}){if(Rs(e,t.dirPath),n.dryRun)return 0;let i=await L(e,void 0,{cwd:t.dirPath,env:vt(t.env,{preserveColor:!1}),shell:!0,stdio:`pipe`,mergeOutAndError:!0,killOnExit:!0,printingStdout:r.printRawOutput,printingStderr:r.printRawOutput,verbose:n.verbose}),a=i.status??1;return r.printRawOutput||Ls(e,a,i.stdout),a!==0&&!r.allowFailure&&(console.info(f.red(f.bold(`Failed (exit code ${a}):`),e)),process.exit(a)),a}function Ls(e,t,n){if(t===0&&/^(?:bun|yarn) (?:install|gen-code)$/u.test(e)){console.info(f.green(`Succeeded.`));return}let r=n.trim();r&&(process.stdout.write(r),process.stdout.write(`
|
|
110
|
+
`))}function Rs(e,t){console.info(`
|
|
111
|
+
`+f.cyan(f.bold(`Command:`),e)+f.gray(` at ${t}`))}function zs(n){let r=Date.now(),i=t.join(n.dirPath,`.wb`);e.mkdirSync(i,{recursive:!0});let a=t.join(i,`verify-full.log`),o=e.openSync(a,`w`),s=process.stdout.write.bind(process.stdout),c=process.stderr.write.bind(process.stderr),l=!1,u=!1;process.stdout.write=Bs(s,o),process.stderr.write=Bs(c,o),console.info(f.cyan(f.bold(`Full log:`),a));let d=()=>{if(u)return;u=!0,process.stdout.write=s,process.stderr.write=c;let t=Vs(Date.now()-r),n=`${l?`Succeeded`:`Failed`} in ${t}. Full log: ${a}\n`,i=l?f.green(n):f.red(n);s(i),e.writeSync(o,n),e.closeSync(o)};return process.once(`exit`,d),{fail:e=>{l=!1,e&&console.error(e)},finish:()=>{process.removeListener(`exit`,d),d()},succeed:()=>{l=!0}}}function Bs(t,n){return((r,i,a)=>{let o=typeof r==`string`?Buffer.from(r,typeof i==`string`?i:`utf8`):r;return e.writeSync(n,o),t(o,typeof i==`function`?i:a)})}function Vs(e){let t=Math.round(e/1e3),n=Math.floor(t/60),r=t%60;return n===0?`${r}s`:`${n}m ${r}s`}await u(d(process.argv)).scriptName(`wb`).options(bt).middleware(e=>{let n=e[`working-dir`];if(n){let e=t.resolve(n);process.chdir(e)}process.env.PATH?.includes(`/bun-node-`)&&console.warn("Warning: PATH contains a bun-node shim (from `bun --bun` or bunfig's `run.bun`); run wb without `--bun` and remove `[run] bun` from bunfig.toml."),re(process.env)}).command(As).command(Qe).command(Tt).command(On).command(Fn).command(Xn).command(Sn).command(ar).command(br).command(ci).command(Zi).command(Aa).command($a).command(po).command(mo).command(_o).command(rs).command(cs).command(Cs).command(Ts).command(Es).command(ks).demandCommand().strict().version(Hs()).help().argv;function Hs(){let n=t.dirname(new URL(import.meta.url).pathname);for(;!e.existsSync(t.join(n,`package.json`));)n=t.dirname(n);return JSON.parse(e.readFileSync(t.join(n,`package.json`),`utf8`)).version}let Us=!1;for(let e of[`SIGINT`,`SIGTERM`,`SIGQUIT`])process.on(e,()=>{if(!Us){Us=!0;try{I(process.pid)}catch(e){console.warn(`Failed to treeKill(${process.pid}) during shutdown:`,e)}process.exit()}});
|
|
112
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJuYW1lcyI6WyJjb2xsZWN0RGVzY2VuZGFudFBpZHMiLCJpc05vU3VjaFByb2Nlc3NFcnJvciIsImNvbGxlY3REZXNjZW5kYW50UGlkc0Zyb21NYXAiLCJBTlNJX0VTQ0FQRV9DT0RFX1JFR0VYUCIsInQiLCJpIiwibyIsIm4iLCJyIiwiYSIsIm4iLCJyIiwibiIsInQiLCJlIiwiYnVpbGRlciIsImNoaWxkX3Byb2Nlc3MiLCJidWlsZGVyIiwiYXJndW1lbnRzQnVpbGRlciIsImNoaWxkX3Byb2Nlc3MiLCJMSVRFU1RSRUFNX0NPTkZJR19GSUxFX05BTUUiLCJERUZBVUxUX0xJVEVTVFJFQU1fQ09ORklHX1BBVEgiLCJidWlsZFJlbW92ZVNxbGl0ZURiQ29tbWFuZCIsImdldExpdGVzdHJlYW1Db25maWdPcHRpb24iLCJwYXJzZSIsInBhcnNlRG90ZW52IiwiZGVwbG95Q29tbWFuZCIsImJ1aWxkZXIiLCJidWlsZGVyIiwiZnMiLCJzZXRUaW1lb3V0IiwiYnVpbGRlciIsInNldFRpbWVvdXQiLCJmcyIsImNoaWxkX3Byb2Nlc3MiLCJidWlsZGVyIiwidG9VbnNjb3BlZFBhY2thZ2VOYW1lIiwiaXNEb2NrZXJFbmFibGVkIiwiY2hpbGRfcHJvY2VzcyIsImJ1aWxkZXIiLCJjaGlsZF9wcm9jZXNzIiwiYnVpbGRlciIsImJ1aWxkZXIiLCJmcyIsImNoaWxkX3Byb2Nlc3MiLCJidWlsZGVyIiwiYnVpbGRlciIsImJ1aWxkZXIiLCJidWlsZGVyIiwiYnVpbGRlciIsImRlcGxveUNvbW1hbmQiXSwic291cmNlcyI6WyIuLi8uLi9zaGFyZWQtbGliLW5vZGUvc3JjL2Vudi50cyIsIi4uLy4uL3NoYXJlZC1saWItbm9kZS9zcmMvZXJybm8udHMiLCIuLi8uLi9zaGFyZWQtbGliLW5vZGUvc3JjL3Byb2Nlc3NUcmVlLnRzIiwiLi4vLi4vc2hhcmVkLWxpYi1ub2RlL3NyYy90cmVlS2lsbC50cyIsIi4uLy4uL3NoYXJlZC1saWItbm9kZS9zcmMvc3Bhd24udHMiLCIuLi8uLi9zaGFyZWQtbGliL3NyYy9lcnJvci50cyIsIi4uLy4uLy4uL25vZGVfbW9kdWxlcy9hdC1kZWNvcmF0b3JzL2Rpc3QvaGFzaC5qcyIsIi4uLy4uLy4uL25vZGVfbW9kdWxlcy9hdC1kZWNvcmF0b3JzL2Rpc3Qvb3Nvbi9jb25zdHJ1Y3RvcnMuanMiLCIuLi8uLi8uLi9ub2RlX21vZHVsZXMvYXQtZGVjb3JhdG9ycy9kaXN0L29zb24vc3RyaW5naWZ5LmpzIiwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2F0LWRlY29yYXRvcnMvZGlzdC9nZXRDYWNoZUtleS5qcyIsIi4uLy4uLy4uL25vZGVfbW9kdWxlcy9hdC1kZWNvcmF0b3JzL2Rpc3QvbWVtb2l6ZU9uZS5qcyIsIi4uL3NyYy91dGlscy9iaW5QYXRoLnRzIiwiLi4vc3JjL3V0aWxzL2NpLnRzIiwiLi4vc3JjL3Byb2plY3QudHMiLCIuLi9zcmMvY29tbWFuZHMvYnVpbGRJZk5lZWRlZC50cyIsIi4uL3NyYy91dGlscy9wcm9taXNlUG9vbC50cyIsIi4uL3NyYy9zY3JpcHRzL3J1bi50cyIsIi4uL3NyYy9zaGFyZWRPcHRpb25zQnVpbGRlci50cyIsIi4uL3NyYy9jb21tYW5kcy9jb25jdXJyZW50bHkudHMiLCIuLi9zcmMvdXRpbHMvc2hlbGwudHMiLCIuLi9zcmMvdXRpbHMvd3JhbmdsZXIudHMiLCIuLi9zcmMvc2NyaXB0cy9kcml6emxlU2NyaXB0cy50cyIsIi4uL3NyYy91dGlscy93cmFuZ2xlckNvbmZpZy50cyIsIi4uL3NyYy9jb21tYW5kcy9nZW5EZXZWYXJzLnRzIiwiLi4vc3JjL2NvbW1hbmRzL2RlcGxveS50cyIsIi4uL3NyYy9jb21tYW5kcy9kb3RlbnYudHMiLCIuLi9zcmMvc2NyaXB0cy9wcmlzbWFTY3JpcHRzLnRzIiwiLi4vc3JjL2NvbW1hbmRzL2dlbkNvZGUudHMiLCIuLi9zcmMvY29tbWFuZHMva2lsbFBvcnRJZk5vbkNpLnRzIiwiLi4vc3JjL3V0aWxzL291dHB1dC50cyIsIi4uL3NyYy9jb21tYW5kcy9saW50LnRzIiwiLi4vc3JjL3V0aWxzL3BvcnQudHMiLCIuLi9zcmMvdXRpbHMvcHJvY2Vzcy50cyIsIi4uL3NyYy9jb21tYW5kcy9tYWludGVuYW5jZS50cyIsIi4uL3NyYy91dGlscy9wcml2YXRlUmVnaXN0cnkudHMiLCIuLi9zcmMvY29tbWFuZHMvY29tbWFuZFV0aWxzLnRzIiwiLi4vc3JjL2NvbW1hbmRzL29wdGltaXplRm9yRG9ja2VyQnVpbGQudHMiLCIuLi9zcmMvY29tbWFuZHMvcHJpc21hLnRzIiwiLi4vc3JjL2NvbW1hbmRzL3JlbGVhc2UudHMiLCIuLi9zcmMvY29tbWFuZHMvcmV0cnkudHMiLCIuLi9zcmMvY29tbWFuZHMvc2V0dXAudHMiLCIuLi9zcmMvY29tbWFuZHMvc2V0dXBQcml2YXRlUGFja2FnZXMudHMiLCIuLi9zcmMvc2NyaXB0cy9idWlsZGVyLnRzIiwiLi4vc3JjL3NjcmlwdHMvZG9ja2VyU2NyaXB0cy50cyIsIi4uL3NyYy9zY3JpcHRzL2V4ZWN1dGlvbi9iYXNlU2NyaXB0cy50cyIsIi4uL3NyYy9zY3JpcHRzL2V4ZWN1dGlvbi9ibGl0elNjcmlwdHMudHMiLCIuLi9zcmMvc2NyaXB0cy9leGVjdXRpb24vaHR0cFNlcnZlclNjcmlwdHMudHMiLCIuLi9zcmMvc2NyaXB0cy9leGVjdXRpb24vbmV4dFNjcmlwdHMudHMiLCIuLi9zcmMvdXRpbHMvbG9nLnRzIiwiLi4vc3JjL3NjcmlwdHMvZXhlY3V0aW9uL3BsYWluQXBwU2NyaXB0cy50cyIsIi4uL3NyYy9zY3JpcHRzL2V4ZWN1dGlvbi9yZW1peFNjcmlwdHMudHMiLCIuLi9zcmMvc2NyaXB0cy9leGVjdXRpb24vdmluZXh0U2NyaXB0cy50cyIsIi4uL3NyYy9zY3JpcHRzL2V4ZWN1dGlvbi92aXRlU2NyaXB0cy50cyIsIi4uL3NyYy9zY3JpcHRzL2V4ZWN1dGlvbi93b3JrZXJzU2NyaXB0cy50cyIsIi4uL3NyYy9jb21tYW5kcy9odHRwU2VydmVyUGFja2FnZXMudHMiLCIuLi9zcmMvY29tbWFuZHMvc3RhcnQudHMiLCIuLi9zcmMvY29tbWFuZHMvdGVzdC50cyIsIi4uL3NyYy9jb21tYW5kcy90ZXN0T25DaS50cyIsIi4uL3NyYy9jb21tYW5kcy90cmVlS2lsbC50cyIsIi4uL3NyYy9jb21tYW5kcy90eXBlY2hlY2sudHMiLCIuLi9zcmMvY29tbWFuZHMvdmVyaWZ5Q29kZS50cyIsIi4uL3NyYy9pbmRleC50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuaW1wb3J0IGNoaWxkUHJvY2VzcyBmcm9tICdub2RlOmNoaWxkX3Byb2Nlc3MnO1xuXG5pbXBvcnQgeyBjb25maWcgfSBmcm9tICdkb3RlbnYnO1xuaW1wb3J0IHsgZXhwYW5kIH0gZnJvbSAnZG90ZW52LWV4cGFuZCc7XG5pbXBvcnQgdHlwZSB7IEFyZ3VtZW50c0NhbWVsQ2FzZSwgSW5mZXJyZWRPcHRpb25UeXBlcyB9IGZyb20gJ3lhcmdzJztcblxuZXhwb3J0IGNvbnN0IHlhcmdzT3B0aW9uc0J1aWxkZXJGb3JFbnYgPSB7XG4gIGVudjoge1xuICAgIGRlc2NyaXB0aW9uOiAnLmVudiBmaWxlcyB0byBiZSBsb2FkZWQuJyxcbiAgICBuYXJnczogMSxcbiAgICB0eXBlOiAnYXJyYXknLFxuICB9LFxuICAnY2FzY2FkZS1lbnYnOiB7XG4gICAgZGVzY3JpcHRpb246XG4gICAgICAnRW52aXJvbm1lbnQgdG8gbG9hZCBjYXNjYWRpbmcgLmVudiBmaWxlcyAoZS5nLiwgYC5lbnZgLCBgLmVudi48ZW52aXJvbm1lbnQ+YCwgYC5lbnYubG9jYWxgIGFuZCBgLmVudi48ZW52aXJvbm1lbnQ+LmxvY2FsYCkuIFByZWZlcnJlZCBvdmVyIGBjYXNjYWRlLW5vZGUtZW52YCBhbmQgYGF1dG8tY2FzY2FkZS1lbnZgLicsXG4gICAgdHlwZTogJ3N0cmluZycsXG4gIH0sXG4gICdjYXNjYWRlLW5vZGUtZW52Jzoge1xuICAgIGRlc2NyaXB0aW9uOiAnU2FtZSB3aXRoIC0tY2FzY2FkZS1lbnY9PE5PREVfRU5WIHx8IFwiZGV2ZWxvcG1lbnRcIj4uIFByZWZlcnJlZCBvdmVyIGBhdXRvLWNhc2NhZGUtZW52YC4nLFxuICAgIHR5cGU6ICdib29sZWFuJyxcbiAgfSxcbiAgJ2F1dG8tY2FzY2FkZS1lbnYnOiB7XG4gICAgZGVzY3JpcHRpb246ICdTYW1lIHdpdGggLS1jYXNjYWRlLWVudj08V0JfRU5WIHx8IE5PREVfRU5WIHx8IFwiZGV2ZWxvcG1lbnRcIj4uJyxcbiAgICB0eXBlOiAnYm9vbGVhbicsXG4gICAgZGVmYXVsdDogdHJ1ZSxcbiAgfSxcbiAgJ2luY2x1ZGUtcm9vdC1lbnYnOiB7XG4gICAgZGVzY3JpcHRpb246ICdJbmNsdWRlIC5lbnYgZmlsZXMgaW4gcm9vdCBkaXJlY3RvcnkgaWYgdGhlIHByb2plY3QgaXMgaW4gYSBtb25vcmVwbyBhbmQgLS1lbnYgb3B0aW9uIGlzIG5vdCB1c2VkLicsXG4gICAgdHlwZTogJ2Jvb2xlYW4nLFxuICAgIGRlZmF1bHQ6IHRydWUsXG4gIH0sXG4gICdjaGVjay1lbnYnOiB7XG4gICAgZGVzY3JpcHRpb246ICdDaGVjayB3aGV0aGVyIHRoZSBrZXlzIG9mIHRoZSBsb2FkZWQgLmVudiBmaWxlcyBhcmUgc2FtZSB3aXRoIHRoZSBnaXZlbiAuZW52IGZpbGUuJyxcbiAgICB0eXBlOiAnc3RyaW5nJyxcbiAgICBkZWZhdWx0OiAnLmVudi5leGFtcGxlJyxcbiAgfSxcbiAgJ3F1aWV0LWVudic6IHtcbiAgICBkZXNjcmlwdGlvbjogJ1N1cHByZXNzIC5lbnYgZmlsZSBsb2FkaW5nIGluZm9ybWF0aW9uLicsXG4gICAgdHlwZTogJ2Jvb2xlYW4nLFxuICB9LFxuICB2ZXJib3NlOiB7XG4gICAgZGVzY3JpcHRpb246ICdXaGV0aGVyIHRvIHNob3cgdmVyYm9zZSBpbmZvcm1hdGlvbicsXG4gICAgdHlwZTogJ2Jvb2xlYW4nLFxuICAgIGFsaWFzOiAndicsXG4gIH0sXG59IGFzIGNvbnN0O1xuXG5leHBvcnQgdHlwZSBFbnZSZWFkZXJPcHRpb25zID0gUGFydGlhbDxBcmd1bWVudHNDYW1lbENhc2U8SW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgeWFyZ3NPcHRpb25zQnVpbGRlckZvckVudj4+PjtcblxuLyoqXG4gKiBUaGlzIGZ1bmN0aW9uIHJlYWRzIGVudmlyb25tZW50IHZhcmlhYmxlcyBmcm9tIGAuZW52YCBmaWxlcy5cbiAqIE5vdGUgaXQgZG9lcyBub3QgYXNzaWduIHRoZW0gaW4gYHByb2Nlc3MuZW52YC5cbiAqIEByZXR1cm4gW2VudlZhcnMsIFtlbnZQYXRocywgZW52VmFyTmFtZXNdW11dXG4gKiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlYWRFbnZpcm9ubWVudFZhcmlhYmxlcyhcbiAgYXJndjogRW52UmVhZGVyT3B0aW9ucyxcbiAgY3dkOiBzdHJpbmcsXG4gIG9wdGlvbnM/OiB7XG4gICAgLyoqXG4gICAgICogTG9hZCB2YXJpYWJsZXMgZXZlbiBpZiB0aGV5IGFscmVhZHkgZXhpc3QgaW4gcHJvY2Vzcy5lbnYuXG4gICAgICogVXNlZnVsIHdoZW4gYSBwYXJlbnQgcHJvY2VzcyBoYXMgYWxyZWFkeSBpbmplY3RlZCB0aGUgLmVudiB2YWx1ZXMgaW50byB0aGUgZW52aXJvbm1lbnRcbiAgICAgKiBhbmQgdGhlIGZpbGUtZGVmaW5lZCB2YXJpYWJsZXMgdGhlbXNlbHZlcyBhcmUgbmVlZGVkIChlLmcuIGB3YiBnZW4tZGV2LXZhcnNgKS5cbiAgICAgKi9cbiAgICBpZ25vcmVQcm9jZXNzRW52PzogYm9vbGVhbjtcbiAgfVxuKTogW1JlY29yZDxzdHJpbmcsIHN0cmluZz4sIFtzdHJpbmcsIHN0cmluZ1tdXVtdXSB7XG4gIGxldCBlbnZQYXRocyA9IChhcmd2LmVudiA/PyBbXSkubWFwKChlbnZQYXRoKSA9PiBwYXRoLnJlc29sdmUoY3dkLCBlbnZQYXRoLnRvU3RyaW5nKCkpKTtcbiAgLy8gUmVhZCBOT0RFX0VOViB0aHJvdWdoIGFuIGFsaWFzLCBuZXZlciBhcyB0aGUgYHByb2Nlc3MuZW52Lk5PREVfRU5WYCBtZW1iZXIgZXhwcmVzc2lvbjpcbiAgLy8gYnVuZGxlcnMgcmVwbGFjZSB0aGF0IGV4YWN0IGV4cHJlc3Npb24gYXQgYnVpbGQgdGltZSAocm9sbGRvd24vYnVpbGQtdHMgaW5saW5lIGl0IGFzXG4gIC8vICdwcm9kdWN0aW9uJyksIHdoaWNoIGNvbnN0YW50LWZvbGRzIHRoZSBmYWxsYmFjayBiZWxvdyBhbmQgbWFkZSB0aGUgcHVibGlzaGVkIHdiIHNlbGVjdFxuICAvLyB0aGUgcHJvZHVjdGlvbiBwcm9maWxlIHdoZW5ldmVyIFdCX0VOViB3YXMgdW5zZXQuXG4gIGNvbnN0IHJ1bnRpbWVFbnYgPSBwcm9jZXNzLmVudjtcbiAgY29uc3QgY2FzY2FkZSA9XG4gICAgYXJndi5jYXNjYWRlRW52ID8/XG4gICAgKGFyZ3YuY2FzY2FkZU5vZGVFbnZcbiAgICAgID8gcnVudGltZUVudi5OT0RFX0VOViB8fCAnZGV2ZWxvcG1lbnQnXG4gICAgICA6IGFyZ3YuYXV0b0Nhc2NhZGVFbnZcbiAgICAgICAgPyBydW50aW1lRW52LldCX0VOViB8fCBydW50aW1lRW52Lk5PREVfRU5WIHx8ICdkZXZlbG9wbWVudCdcbiAgICAgICAgOiB1bmRlZmluZWQpO1xuICBpZiAodHlwZW9mIGNhc2NhZGUgPT09ICdzdHJpbmcnKSB7XG4gICAgaWYgKGVudlBhdGhzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgZW52UGF0aHMucHVzaChwYXRoLmpvaW4oY3dkLCAnLmVudicpKTtcbiAgICAgIGlmIChhcmd2LmluY2x1ZGVSb290RW52KSB7XG4gICAgICAgIGNvbnN0IHJvb3RQYXRoID0gcGF0aC5yZXNvbHZlKGN3ZCwgJy4uJywgJy4uJyk7XG4gICAgICAgIGlmIChmcy5leGlzdHNTeW5jKHBhdGguam9pbihyb290UGF0aCwgJ3BhY2thZ2UuanNvbicpKSkge1xuICAgICAgICAgIGVudlBhdGhzLnB1c2gocGF0aC5qb2luKHJvb3RQYXRoLCAnLmVudicpKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICBlbnZQYXRocyA9IGVudlBhdGhzLmZsYXRNYXAoKGVudlBhdGgpID0+XG4gICAgICBjYXNjYWRlXG4gICAgICAgID8gW2Ake2VudlBhdGh9LiR7Y2FzY2FkZX0ubG9jYWxgLCBgJHtlbnZQYXRofS5sb2NhbGAsIGAke2VudlBhdGh9LiR7Y2FzY2FkZX1gLCBlbnZQYXRoXVxuICAgICAgICA6IFtgJHtlbnZQYXRofS5sb2NhbGAsIGVudlBhdGhdXG4gICAgKTtcbiAgfVxuICBlbnZQYXRocyA9IGVudlBhdGhzLmZpbHRlcigoZW52UGF0aCkgPT4gZnMuZXhpc3RzU3luYyhlbnZQYXRoKSkubWFwKChlbnZQYXRoKSA9PiBwYXRoLnJlbGF0aXZlKGN3ZCwgZW52UGF0aCkpO1xuICBjb25zdCBzaG91bGRTdXBwcmVzc091dHB1dCA9IHNob3VsZFN1cHByZXNzRW52aXJvbm1lbnRPdXRwdXQoYXJndik7XG4gIGlmIChhcmd2LnZlcmJvc2UgJiYgIXNob3VsZFN1cHByZXNzT3V0cHV0KSB7XG4gICAgY29uc29sZS5pbmZvKGBXQl9FTlY6ICR7cnVudGltZUVudi5XQl9FTlZ9LCBOT0RFX0VOVjogJHtydW50aW1lRW52Lk5PREVfRU5WfWApO1xuICAgIGNvbnNvbGUuaW5mbygnUmVhZGluZyBlbnYgZmlsZXM6JywgZW52UGF0aHMuam9pbignLCAnKSk7XG4gIH1cblxuICAvLyBXaGVuIHRoZSBjYWxsZXIgZXhwbGljaXRseSBmb3JjZXMgYSBtb2RlICgtLWNhc2NhZGUtZW52IC8gLS1jYXNjYWRlLW5vZGUtZW52IC8gYW4gZXhwb3J0ZWRcbiAgLy8gV0JfRU5WKSwgdmFsdWVzIHRoYXQgdGhlIG1vZGUncyBvd24gZW52IGZpbGVzIGRlZmluZSBtdXN0IHdpbiBvdmVyIHZhcmlhYmxlcyBpbmhlcml0ZWQgZnJvbVxuICAvLyB0aGUgcGFyZW50IHNoZWxsOiBhIHN0YWxlIGBleHBvcnQgREFUQUJBU0VfVVJMPS4uLmAgZnJvbSBhIGRldmVsb3BtZW50IHNoZWxsIG11c3Qgbm90IGxlYWtcbiAgLy8gaW50byBgd2IgdGVzdGAncyB0ZXN0IG1vZGUgKGNmLiBodHRwczovL2dpdGh1Yi5jb20vV2lsbEJvb3N0ZXIvc2hhcmVkL2lzc3Vlcy85MzApLiBPbiBDSSB0aGVcbiAgLy8gaW5oZXJpdGVkIHZhcmlhYmxlcyBrZWVwIHdpbm5pbmcg4oCUIHdvcmtmbG93cyBkZWxpYmVyYXRlbHkgaW5qZWN0IGVudiB2YXJzIHRoYXQgb3ZlcnJpZGUgdGhlXG4gIC8vIGNvbW1pdHRlZCBmaWxlcyDigJQgYW5kIHRoYXQgc2hhZG93aW5nIGlzIHRoZSBkZXNpZ25lZCBiZWhhdmlvciwgc28gbm8gd2FybmluZyBpcyBlbWl0dGVkLlxuICBjb25zdCBtb2RlSXNGb3JjZWQgPSBCb29sZWFuKFxuICAgIGFyZ3YuY2FzY2FkZUVudiA/P1xuICAgIChhcmd2LmNhc2NhZGVOb2RlRW52ID8gcnVudGltZUVudi5OT0RFX0VOViB8fCAnZGV2ZWxvcG1lbnQnIDogYXJndi5hdXRvQ2FzY2FkZUVudiA/IHJ1bnRpbWVFbnYuV0JfRU5WIDogdW5kZWZpbmVkKVxuICApO1xuICBjb25zdCBtb2RlRmlsZU92ZXJyaWRlc1Byb2Nlc3NFbnYgPSBtb2RlSXNGb3JjZWQgJiYgIWlzQ0lFbnZpcm9ubWVudChydW50aW1lRW52LkNJKTtcbiAgLy8gT3ZlcnJpZGUgZWxpZ2liaWxpdHkgaXMgZGVjaWRlZCBwZXIgS0VZLCBub3QgcGVyIGZpbGU6IGAuZW52LmxvY2FsYCBvdXRyYW5rcyBgLmVudi48bW9kZT5gXG4gIC8vIGluIHRoZSBjYXNjYWRlLCBzbyBvbmNlIHRoZSBtb2RlIGRlZmluZXMgYSBrZXksIHRoZSB2YWx1ZSB3aW5uaW5nIHRoZSBub3JtYWwgZmlsZSBwcmVjZWRlbmNlXG4gIC8vICh3aGljaCBtYXkgY29tZSBmcm9tIGAuZW52LmxvY2FsYCkgbXVzdCBiZSB0aGUgb25lIG92ZXJyaWRpbmcgdGhlIHNoZWxsLlxuICBjb25zdCBtb2RlU3BlY2lmaWNFbnZLZXlzID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gIGlmIChtb2RlRmlsZU92ZXJyaWRlc1Byb2Nlc3NFbnYgJiYgdHlwZW9mIGNhc2NhZGUgPT09ICdzdHJpbmcnICYmIGNhc2NhZGUubGVuZ3RoID4gMCkge1xuICAgIGZvciAoY29uc3QgZW52UGF0aCBvZiBlbnZQYXRocykge1xuICAgICAgaWYgKGVudlBhdGguZW5kc1dpdGgoYC4ke2Nhc2NhZGV9YCkgfHwgZW52UGF0aC5lbmRzV2l0aChgLiR7Y2FzY2FkZX0ubG9jYWxgKSkge1xuICAgICAgICBmb3IgKGNvbnN0IGtleSBvZiBPYmplY3Qua2V5cyhyZWFkRW52RmlsZShwYXRoLmpvaW4oY3dkLCBlbnZQYXRoKSkpKSBtb2RlU3BlY2lmaWNFbnZLZXlzLmFkZChrZXkpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGNvbnN0IGVudlBhdGhBbmRMb2FkZWRFbnZWYXJOYW1lczogW3N0cmluZywgc3RyaW5nW11dW10gPSBbXTtcbiAgY29uc3QgZW52VmFyczogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHt9O1xuICBmb3IgKGNvbnN0IGVudlBhdGggb2YgZW52UGF0aHMpIHtcbiAgICBjb25zdCBrZXlzOiBzdHJpbmdbXSA9IFtdO1xuICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKHJlYWRFbnZGaWxlKHBhdGguam9pbihjd2QsIGVudlBhdGgpKSkpIHtcbiAgICAgIGlmIChrZXkgaW4gZW52VmFycykgY29udGludWU7XG5cbiAgICAgIGNvbnN0IGluaGVyaXRlZFZhbHVlID0gcHJvY2Vzcy5lbnZba2V5XTtcbiAgICAgIGNvbnN0IHNoYWRvd2VkQnlQcm9jZXNzRW52ID0gIW9wdGlvbnM/Lmlnbm9yZVByb2Nlc3NFbnYgJiYga2V5IGluIHByb2Nlc3MuZW52O1xuICAgICAgaWYgKHNoYWRvd2VkQnlQcm9jZXNzRW52ICYmICEobW9kZUZpbGVPdmVycmlkZXNQcm9jZXNzRW52ICYmIG1vZGVTcGVjaWZpY0VudktleXMuaGFzKGtleSkpKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgaWYgKHNoYWRvd2VkQnlQcm9jZXNzRW52ICYmIGluaGVyaXRlZFZhbHVlICE9PSB2YWx1ZSAmJiAhc2hvdWxkU3VwcHJlc3NPdXRwdXQpIHtcbiAgICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICAgIGBXYXJuaW5nOiAke2tleX0gaW4gJHtlbnZQYXRofSBvdmVycmlkZXMgdGhlIHZhbHVlIGluaGVyaXRlZCBmcm9tIHRoZSBwYXJlbnQgZW52aXJvbm1lbnQgYmVjYXVzZSB0aGUgJHtjYXNjYWRlfSBlbnZpcm9ubWVudCBpcyBleHBsaWNpdGx5IGZvcmNlZC5gXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICBlbnZWYXJzW2tleV0gPSB2YWx1ZTtcbiAgICAgIGtleXMucHVzaChrZXkpO1xuICAgIH1cbiAgICBlbnZQYXRoQW5kTG9hZGVkRW52VmFyTmFtZXMucHVzaChbZW52UGF0aCwga2V5c10pO1xuICAgIGlmIChhcmd2LnZlcmJvc2UgJiYgIXNob3VsZFN1cHByZXNzT3V0cHV0ICYmIGtleXMubGVuZ3RoID4gMCkge1xuICAgICAgY29uc29sZS5pbmZvKGBSZWFkICR7a2V5cy5sZW5ndGh9IGVudmlyb25tZW50IHZhcmlhYmxlcyBmcm9tICR7ZW52UGF0aH1gKTtcbiAgICB9XG4gIH1cbiAgY29uc3QgW2Zub3hFbnZWYXJzLCBmbm94RW52VmFyTmFtZXNdID0gcmVhZEZub3hFbnZpcm9ubWVudFZhcmlhYmxlcyhjd2QsIGNhc2NhZGUsIGVudlZhcnMsIHtcbiAgICAuLi5vcHRpb25zLFxuICAgIG1vZGVGaWxlT3ZlcnJpZGVzUHJvY2Vzc0VudixcbiAgfSk7XG4gIE9iamVjdC5hc3NpZ24oZW52VmFycywgZm5veEVudlZhcnMpO1xuICAvLyBSZXBvcnQgdGhlIGZub3ggc291cmNlIHdoZW5ldmVyIGZub3gudG9tbCBleGlzdHMg4oCUIGV2ZW4gd2hlbiBpdCB5aWVsZHMgbm8ga2V5cyAoYWxsIHNoYWRvd2VkLFxuICAvLyBlbXB0eSBwcm9maWxlLCBvciBhIGZhaWxpbmcgZXhwb3J0KTogY29uc3VtZXJzIHN1Y2ggYXMgd2IncyByZXF1aXJlZC1lbnZpcm9ubWVudCB2YWxpZGF0aW9uXG4gIC8vIG11c3Qgc2VlIHRoYXQgYSBkZWNsYXJlZCBlbnYgc291cmNlIGV4aXN0cyByYXRoZXIgdGhhbiBzaWxlbnRseSBmYWlsaW5nIG9wZW4uXG4gIGlmIChmbm94RW52VmFyTmFtZXMubGVuZ3RoID4gMCB8fCBoYXNQcm9qZWN0Rm5veENvbmZpZyhjd2QpKSB7XG4gICAgZW52UGF0aEFuZExvYWRlZEVudlZhck5hbWVzLnB1c2goW2Zub3hFbnZpcm9ubWVudFNvdXJjZU5hbWUoY2FzY2FkZSksIGZub3hFbnZWYXJOYW1lc10pO1xuICAgIGlmIChhcmd2LnZlcmJvc2UgJiYgIXNob3VsZFN1cHByZXNzT3V0cHV0KSB7XG4gICAgICBjb25zb2xlLmluZm8oYFJlYWQgJHtmbm94RW52VmFyTmFtZXMubGVuZ3RofSBlbnZpcm9ubWVudCB2YXJpYWJsZXMgZnJvbSAke2Zub3hFbnZpcm9ubWVudFNvdXJjZU5hbWUoY2FzY2FkZSl9YCk7XG4gICAgfVxuICB9XG4gIGNvbnN0IFttaXNlRW52VmFycywgbWlzZUVudlZhck5hbWVzXSA9IHJlYWRNaXNlRW52aXJvbm1lbnRWYXJpYWJsZXMoY3dkLCBjYXNjYWRlLCBlbnZWYXJzLCBvcHRpb25zKTtcbiAgT2JqZWN0LmFzc2lnbihlbnZWYXJzLCBtaXNlRW52VmFycyk7XG4gIGlmIChtaXNlRW52VmFyTmFtZXMubGVuZ3RoID4gMCkge1xuICAgIGVudlBhdGhBbmRMb2FkZWRFbnZWYXJOYW1lcy5wdXNoKFttaXNlRW52aXJvbm1lbnRTb3VyY2VOYW1lKGNhc2NhZGUpLCBtaXNlRW52VmFyTmFtZXNdKTtcbiAgICBpZiAoYXJndi52ZXJib3NlICYmICFzaG91bGRTdXBwcmVzc091dHB1dCkge1xuICAgICAgY29uc29sZS5pbmZvKGBSZWFkICR7bWlzZUVudlZhck5hbWVzLmxlbmd0aH0gZW52aXJvbm1lbnQgdmFyaWFibGVzIGZyb20gJHttaXNlRW52aXJvbm1lbnRTb3VyY2VOYW1lKGNhc2NhZGUpfWApO1xuICAgIH1cbiAgfVxuICBpZiAoIWFyZ3YudmVyYm9zZSAmJiAhc2hvdWxkU3VwcHJlc3NPdXRwdXQpIHtcbiAgICBjb25zb2xlLmluZm8oXG4gICAgICBgUmVhZCBlbnYgZmlsZXM6ICR7ZW52UGF0aEFuZExvYWRlZEVudlZhck5hbWVzLm1hcCgoW2VudlBhdGgsIGtleXNdKSA9PiAoa2V5cy5sZW5ndGggPiAwID8gYCR7ZW52UGF0aH0gKCR7a2V5cy5qb2luKCcsICcpfSlgIDogZW52UGF0aCkpLmpvaW4oJywgJykgfHwgJ25vdGhpbmcnfWBcbiAgICApO1xuICB9XG5cbiAgaWYgKGFyZ3YuY2hlY2tFbnYpIHtcbiAgICBjb25zdCBleGFtcGxlS2V5cyA9IE9iamVjdC5rZXlzKHJlYWRFbnZGaWxlKHBhdGguam9pbihjd2QsIGFyZ3YuY2hlY2tFbnYpKSk7XG4gICAgY29uc3QgbWlzc2luZ0tleXMgPSBleGFtcGxlS2V5cy5maWx0ZXIoKGtleSkgPT4gIShrZXkgaW4gZW52VmFycykgJiYgIShrZXkgaW4gcHJvY2Vzcy5lbnYpKTtcbiAgICBpZiAobWlzc2luZ0tleXMubGVuZ3RoID4gMCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBNaXNzaW5nIGVudmlyb25tZW50IHZhcmlhYmxlcyBpbiBbJHtlbnZQYXRocy5qb2luKCcsICcpfV06IFske21pc3NpbmdLZXlzLmpvaW4oJywgJyl9XWApO1xuICAgIH1cbiAgfVxuICAvLyBFeHBhbmQgcmVmZXJlbmNlcyBhZ2FpbnN0IHRoZSBsaXZlIGVudmlyb25tZW50IGZvciBrZXlzIE5PVCBsb2FkZWQgZnJvbSBmaWxlcywgc28gdGhhdCBhXG4gIC8vIHJlZmVyZW5jZSB0byBhbiBleHBvcnRlZCBrZXkgKGV4Y2x1ZGVkIGZyb20gZW52VmFycyBieSBwcm9jZXNzLWVudiBwcmVjZWRlbmNlKSByZXNvbHZlcyB0b1xuICAvLyB0aGUgZWZmZWN0aXZlIHZhbHVlIGluc3RlYWQgb2YgYW4gZW1wdHkgc3RyaW5nLiBMb2FkZWQga2V5cyBhcmUgZGVsaWJlcmF0ZWx5IGFic2VudCBmcm9tXG4gIC8vIHRoZSByZWZlcmVuY2Ugc2V0OiBkb3RlbnYtZXhwYW5kIHdvdWxkIG90aGVyd2lzZSByZXBsYWNlIHRoZWlyIHBhcnNlZCB2YWx1ZXMgd2l0aCB0aGVcbiAgLy8gcHJvY2VzcyB2YWx1ZXMsIGJyZWFraW5nIGNhbGxlcnMgdGhhdCBuZWVkIHRoZSBmaWxlLWRlZmluZWQgdmFsdWVzIHRoZW1zZWx2ZXMuXG4gIGNvbnN0IHJlZmVyZW5jZUVudjogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHt9O1xuICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhwcm9jZXNzLmVudikpIHtcbiAgICAvLyBFc2NhcGUgZG9sbGFyIHNpZ25zIHNvIGRvdGVudi1leHBhbmQgc3Vic3RpdHV0ZXMgZXhwb3J0ZWQgdmFsdWVzIGxpdGVyYWxseSBpbnN0ZWFkIG9mXG4gICAgLy8gcmVjdXJzaXZlbHkgcmUtZXhwYW5kaW5nIHRoZW0gKGFuIGV4cG9ydGVkIGBwYSR3b3JkYCBtdXN0IHN0YXkgYHBhJHdvcmRgKS5cbiAgICBpZiAodmFsdWUgIT09IHVuZGVmaW5lZCAmJiAhKGtleSBpbiBlbnZWYXJzKSkgcmVmZXJlbmNlRW52W2tleV0gPSB2YWx1ZS5yZXBsYWNlQWxsKCckJywgU3RyaW5nLnJhd2BcXCRgKTtcbiAgfVxuICAvLyBkb3RlbnYtZXhwYW5kIHJlc29sdmVzIHJlZmVyZW5jZXMgaW4ga2V5LWluc2VydGlvbiBvcmRlciwgc28gYSAuZW52IHZhbHVlIHJlZmVyZW5jaW5nIGFcbiAgLy8gZm5veC9taXNlLXByb3ZpZGVkIGtleSB3b3VsZCBzZWUgYW4gZW1wdHkgc3RyaW5nIGlmIHRoZSBmbm94L21pc2UgZW50cmllcyBzdGF5ZWQgYXBwZW5kZWRcbiAgLy8gYWZ0ZXIgdGhlIC5lbnYgZW50cmllcy4gUmVidWlsZCB0aGUgZXhwYW5zaW9uIGlucHV0IHdpdGggdGhlIGxvd2VyLXByaW9yaXR5IHNvdXJjZXMgZmlyc3Q7XG4gIC8vIHRoZSB2YWx1ZXMgdGhlbXNlbHZlcyBhbHJlYWR5IHJlZmxlY3QgdGhlIGludGVuZGVkIC5lbnYtb3Zlci1mbm94LW92ZXItbWlzZSBwcmVjZWRlbmNlLlxuICBjb25zdCBvcmRlcmVkRW52VmFyczogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHt9O1xuICBmb3IgKGNvbnN0IGtleSBvZiBbLi4ubWlzZUVudlZhck5hbWVzLCAuLi5mbm94RW52VmFyTmFtZXNdKSBvcmRlcmVkRW52VmFyc1trZXldID0gZW52VmFyc1trZXldITtcbiAgT2JqZWN0LmFzc2lnbihvcmRlcmVkRW52VmFycywgZW52VmFycyk7XG4gIHJldHVybiBbXG4gICAgZXhwYW5kKHsgcGFyc2VkOiBvcmRlcmVkRW52VmFycywgcHJvY2Vzc0VudjogcmVmZXJlbmNlRW52IH0pLnBhcnNlZCA/PyBvcmRlcmVkRW52VmFycyxcbiAgICBlbnZQYXRoQW5kTG9hZGVkRW52VmFyTmFtZXMsXG4gIF07XG59XG5cbi8qKlxuICogVGhpcyBmdW5jdGlvbiByZWFkcyBlbnZpcm9ubWVudCB2YXJpYWJsZXMgZnJvbSB0aGUgcmVwb3NpdG9yeSdzIGZub3ggY29uZmlndXJhdGlvbiAoYGZub3gudG9tbGApLlxuICogVGhlIGJhc2UgYFtzZWNyZXRzXWAgdGFibGUgY29ycmVzcG9uZHMgdG8gYC5lbnZgLCBhbmQgYFtwcm9maWxlcy48Y2FzY2FkZT4uc2VjcmV0c11gIGNvcnJlc3BvbmRzIHRvXG4gKiBgLmVudi48Y2FzY2FkZT5gOyBhbiB1bmtub3duIHByb2ZpbGUgZmFsbHMgYmFjayB0byB0aGUgYmFzZSBzZWNyZXRzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVhZEZub3hFbnZpcm9ubWVudFZhcmlhYmxlcyhcbiAgY3dkOiBzdHJpbmcsXG4gIGNhc2NhZGU6IHN0cmluZyB8IHVuZGVmaW5lZCxcbiAgY3VycmVudEVudlZhcnM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4sXG4gIG9wdGlvbnM/OiB7IGlnbm9yZVByb2Nlc3NFbnY/OiBib29sZWFuOyBtb2RlRmlsZU92ZXJyaWRlc1Byb2Nlc3NFbnY/OiBib29sZWFuIH1cbik6IFtSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+LCBzdHJpbmdbXV0ge1xuICBpZiAoIWhhc1Byb2plY3RGbm94Q29uZmlnKGN3ZCkpIHJldHVybiBbe30sIFtdXTtcblxuICBjb25zdCBzZWNyZXRzID0gcnVuRm5veEV4cG9ydChjd2QsIGNhc2NhZGUsIHsgcXVpZXQ6IGZhbHNlIH0pO1xuICBpZiAoIXNlY3JldHMpIHJldHVybiBbe30sIFtdXTtcbiAgLy8gYFtwcm9maWxlcy48Y2FzY2FkZT4uc2VjcmV0c11gIGlzIHRoZSBmbm94IGFuYWxvZ3VlIG9mIGAuZW52LjxjYXNjYWRlPmA6IHdoZW4gdGhlIGNhbGxlclxuICAvLyBmb3JjZXMgYSBtb2RlIG9mZiBDSSwgcHJvZmlsZS1zcGVjaWZpYyB2YWx1ZXMgbXVzdCBvdmVycmlkZSBpbmhlcml0ZWQgc2hlbGwgdmFyaWFibGVzIGp1c3RcbiAgLy8gbGlrZSBgLmVudi48bW9kZT5gIHZhbHVlcyBkbywgd2hpbGUgYmFzZSBgW3NlY3JldHNdYCB2YWx1ZXMga2VlcCBsb3NpbmcgdG8gcHJvY2Vzcy5lbnYuIEEga2V5XG4gIC8vIGlzIHByb2ZpbGUtc3BlY2lmaWMgd2hlbiB0aGUgcHJvZmlsZSBleHBvcnQncyB2YWx1ZSBkaWZmZXJzIGZyb20gdGhlIGJhc2UgZXhwb3J0J3M7IHdoZW4gdGhlXG4gIC8vIGJhc2UgZXhwb3J0IGZhaWxzLCBubyBvdmVycmlkZSBpcyBhcHBsaWVkIChjb25zZXJ2YXRpdmUpLiBUaGUgYmFzZSBleHBvcnQgcnVucyBMQVpJTFksIG9ubHlcbiAgLy8gd2hlbiBhIHByb2Nlc3MuZW52IGNvbGxpc2lvbiBhY3R1YWxseSBuZWVkcyBhZGp1ZGljYXRpbmcg4oCUIGl0IHdvdWxkIG90aGVyd2lzZSBhZGQgYVxuICAvLyBzdWJwcm9jZXNzIChpbmNsdWRpbmcgYWdlIGRlY3J5cHRpb24pIHRvIGV2ZXJ5IGZvcmNlZC1tb2RlIGludm9jYXRpb24gZm9yIG5vdGhpbmcuXG4gIGxldCBjYWNoZWRCYXNlU2VjcmV0czogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gfCB1bmRlZmluZWQgfCBmYWxzZSA9IGZhbHNlO1xuICBjb25zdCBnZXRCYXNlU2VjcmV0cyA9ICgpOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB8IHVuZGVmaW5lZCA9PiB7XG4gICAgaWYgKGNhY2hlZEJhc2VTZWNyZXRzID09PSBmYWxzZSkge1xuICAgICAgY2FjaGVkQmFzZVNlY3JldHMgPSBydW5Gbm94RXhwb3J0KGN3ZCwgdW5kZWZpbmVkLCB7IHF1aWV0OiB0cnVlLCBpZ25vcmVQcm9maWxlRW52VmFyOiB0cnVlIH0pO1xuICAgIH1cbiAgICByZXR1cm4gY2FjaGVkQmFzZVNlY3JldHM7XG4gIH07XG5cbiAgY29uc3QgZW52VmFyczogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHt9O1xuICBjb25zdCBrZXlzOiBzdHJpbmdbXSA9IFtdO1xuICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhzZWNyZXRzKSkge1xuICAgIGlmICh0eXBlb2YgdmFsdWUgIT09ICdzdHJpbmcnIHx8IGtleSBpbiBjdXJyZW50RW52VmFycykgY29udGludWU7XG4gICAgLy8gRXhwbGljaXRseSBleHBvcnRlZCBlbnZpcm9ubWVudCB2YXJpYWJsZXMgd2luIG92ZXIgZm5veCBiYXNlIHZhbHVlcywgbWlycm9yaW5nIHRoZSAuZW52IHJ1bGUuXG4gICAgLy8gKFRoZSBtaXNlIHJlYWRlciBiZWxvdyBpbnRlbnRpb25hbGx5IHVzZXMgYSB2YWx1ZS1lcXVhbGl0eSBjaGVjayBpbnN0ZWFkOiBgbWlzZSBlbnZgIGVjaG9lc1xuICAgIC8vIGJhY2sgdmFyaWFibGVzIHRoZSBhbWJpZW50IG1pc2UgYWN0aXZhdGlvbiBhbHJlYWR5IGV4cG9ydGVkLCBhbmQgYSBkaWZmZXJpbmcgdmFsdWUgbWVhbnMgdGhlXG4gICAgLy8gcmVxdWVzdGVkIGNhc2NhZGUgcHJvZmlsZSBzaG91bGQgd2luIG92ZXIgdGhlIHN0YWxlIGFjdGl2YXRpb24uKVxuICAgIGlmICghb3B0aW9ucz8uaWdub3JlUHJvY2Vzc0VudiAmJiBrZXkgaW4gcHJvY2Vzcy5lbnYpIHtcbiAgICAgIGNvbnN0IGJhc2VTZWNyZXRzID0gb3B0aW9ucz8ubW9kZUZpbGVPdmVycmlkZXNQcm9jZXNzRW52ICYmIGNhc2NhZGUgPyBnZXRCYXNlU2VjcmV0cygpIDogdW5kZWZpbmVkO1xuICAgICAgY29uc3Qgb3ZlcnJpZGVzUHJvY2Vzc0VudiA9IGJhc2VTZWNyZXRzICE9PSB1bmRlZmluZWQgJiYgYmFzZVNlY3JldHNba2V5XSAhPT0gdmFsdWU7XG4gICAgICBpZiAoIW92ZXJyaWRlc1Byb2Nlc3NFbnYpIGNvbnRpbnVlO1xuICAgIH1cbiAgICBlbnZWYXJzW2tleV0gPSB2YWx1ZTtcbiAgICBrZXlzLnB1c2goa2V5KTtcbiAgfVxuICByZXR1cm4gW2VudlZhcnMsIGtleXNdO1xufVxuXG5mdW5jdGlvbiBydW5Gbm94RXhwb3J0KFxuICBjd2Q6IHN0cmluZyxcbiAgY2FzY2FkZTogc3RyaW5nIHwgdW5kZWZpbmVkLFxuICBvcHRpb25zOiB7IHF1aWV0OiBib29sZWFuOyBpZ25vcmVQcm9maWxlRW52VmFyPzogYm9vbGVhbiB9XG4pOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB8IHVuZGVmaW5lZCB7XG4gIC8vIGAtLWlmLW1pc3NpbmcgZXJyb3JgOiBmbm94IG90aGVyd2lzZSBleGl0cyAwIGFuZCBzaWxlbnRseSBvbWl0cyBzZWNyZXRzIGl0IGZhaWxzIHRvIHJlc29sdmVcbiAgLy8gKGUuZy4gYSBtaXNzaW5nIGFnZSBrZXkpLCB3aGljaCB3b3VsZCBiZSBpbmRpc3Rpbmd1aXNoYWJsZSBmcm9tIHVuZGVjbGFyZWQgc2VjcmV0cy5cbiAgLy8gYC0tbm9uLWludGVyYWN0aXZlYDogcHJvbXB0cyBvciBicm93c2VyIGF1dGggZmxvd3Mgd291bGQgaGFuZyBmb3JldmVyIGJlY2F1c2Ugc3RkaW4gaXMgaWdub3JlZC5cbiAgY29uc3QgYXJncyA9IFsnZXhwb3J0JywgJy0tZm9ybWF0JywgJ2pzb24nLCAnLS1uby1jb2xvcicsICctLWlmLW1pc3NpbmcnLCAnZXJyb3InLCAnLS1ub24taW50ZXJhY3RpdmUnXTtcbiAgY29uc3QgZW52ID0geyAuLi5wcm9jZXNzLmVudiB9O1xuICBpZiAoY2FzY2FkZSkge1xuICAgIGFyZ3MucHVzaCgnLS1wcm9maWxlJywgY2FzY2FkZSk7XG4gIH1cbiAgaWYgKG9wdGlvbnMuaWdub3JlUHJvZmlsZUVudlZhcikge1xuICAgIC8vIFdpdGhvdXQgYC0tcHJvZmlsZWAsIGZub3ggZmFsbHMgYmFjayB0byBGTk9YX1BST0ZJTEU7IHRoZSBiYXNlLWFkanVkaWNhdGlvbiBleHBvcnQgbXVzdFxuICAgIC8vIHJlYWQgdGhlIEJBU0Ugc2VjcmV0cywgc28gdGhlIGluaGVyaXRlZCBwcm9maWxlIHNlbGVjdGlvbiBpcyBjbGVhcmVkIGZvciBpdCDigJQgYW5kIG9ubHkgZm9yXG4gICAgLy8gaXQ6IGEgcHJvZmlsZS1sZXNzIFBSSU1BUlkgZXhwb3J0IChlLmcuIGB3YiBkb3RlbnZgIHdpdGhvdXQgV0JfRU5WKSBrZWVwcyBob25vcmluZ1xuICAgIC8vIEZOT1hfUFJPRklMRS5cbiAgICBkZWxldGUgZW52LkZOT1hfUFJPRklMRTtcbiAgfVxuICBjb25zdCByZXN1bHQgPSBjaGlsZFByb2Nlc3Muc3Bhd25TeW5jKCdmbm94JywgYXJncywge1xuICAgIGN3ZCxcbiAgICBlbnYsXG4gICAgZW5jb2Rpbmc6ICd1dGY4JyxcbiAgICBzdGRpbzogWydpZ25vcmUnLCAncGlwZScsICdwaXBlJ10sXG4gIH0pO1xuICBpZiAocmVzdWx0LmVycm9yIHx8IHJlc3VsdC5zdGF0dXMgIT09IDAgfHwgIXJlc3VsdC5zdGRvdXQ/LnRyaW0oKSkge1xuICAgIC8vIFRoZSByZXBvc2l0b3J5IGRlY2xhcmVzIGZub3gtbWFuYWdlZCBzZWNyZXRzIChmbm94LnRvbWwgZXhpc3RzKSwgc28gYSBmYWlsaW5nIGV4cG9ydCBtdXN0IGJlXG4gICAgLy8gc3VyZmFjZWQ6IHN3YWxsb3dpbmcgaXQgd291bGQgbWFrZSBkZWNsYXJlZCBzZWNyZXRzIGluZGlzdGluZ3Vpc2hhYmxlIGZyb20gdW5kZWNsYXJlZCBvbmVzLlxuICAgIGlmICghb3B0aW9ucy5xdWlldCkge1xuICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICBgRmFpbGVkIHRvIHJlYWQgZm5veCBzZWNyZXRzOiAke3Jlc3VsdC5lcnJvcj8ubWVzc2FnZSB8fCByZXN1bHQuc3RkZXJyPy50cmltKCkgfHwgYGZub3ggZXhpdGVkIHdpdGggc3RhdHVzICR7cmVzdWx0LnN0YXR1c31gfWBcbiAgICAgICk7XG4gICAgfVxuICAgIHJldHVybjtcbiAgfVxuXG4gIGxldCBwYXJzZWQ6IHVua25vd247XG4gIHRyeSB7XG4gICAgcGFyc2VkID0gSlNPTi5wYXJzZShyZXN1bHQuc3Rkb3V0KTtcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuO1xuICB9XG4gIGNvbnN0IHNlY3JldHMgPSAocGFyc2VkIGFzIHsgc2VjcmV0cz86IHVua25vd24gfSB8IHVuZGVmaW5lZCk/LnNlY3JldHM7XG4gIGlmICghc2VjcmV0cyB8fCB0eXBlb2Ygc2VjcmV0cyAhPT0gJ29iamVjdCcgfHwgQXJyYXkuaXNBcnJheShzZWNyZXRzKSkgcmV0dXJuO1xuICByZXR1cm4gc2VjcmV0cyBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGhhc1Byb2plY3RGbm94Q29uZmlnKGN3ZDogc3RyaW5nKTogYm9vbGVhbiB7XG4gIGZvciAobGV0IGN1cnJlbnRQYXRoID0gcGF0aC5yZXNvbHZlKGN3ZCk7IDsgY3VycmVudFBhdGggPSBwYXRoLmRpcm5hbWUoY3VycmVudFBhdGgpKSB7XG4gICAgaWYgKGZzLmV4aXN0c1N5bmMocGF0aC5qb2luKGN1cnJlbnRQYXRoLCAnZm5veC50b21sJykpKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgY29uc3QgcGFyZW50UGF0aCA9IHBhdGguZGlybmFtZShjdXJyZW50UGF0aCk7XG4gICAgaWYgKHBhcmVudFBhdGggPT09IGN1cnJlbnRQYXRoKSByZXR1cm4gZmFsc2U7XG4gIH1cbn1cblxuZnVuY3Rpb24gZm5veEVudmlyb25tZW50U291cmNlTmFtZShjYXNjYWRlOiBzdHJpbmcgfCB1bmRlZmluZWQpOiBzdHJpbmcge1xuICByZXR1cm4gY2FzY2FkZSA/IGBmbm94IGV4cG9ydCAtLXByb2ZpbGUgJHtjYXNjYWRlfWAgOiAnZm5veCBleHBvcnQnO1xufVxuXG5mdW5jdGlvbiByZWFkTWlzZUVudmlyb25tZW50VmFyaWFibGVzKFxuICBjd2Q6IHN0cmluZyxcbiAgY2FzY2FkZTogc3RyaW5nIHwgdW5kZWZpbmVkLFxuICBjdXJyZW50RW52VmFyczogUmVjb3JkPHN0cmluZywgc3RyaW5nPixcbiAgb3B0aW9ucz86IHsgaWdub3JlUHJvY2Vzc0Vudj86IGJvb2xlYW4gfVxuKTogW1JlY29yZDxzdHJpbmcsIHN0cmluZz4sIHN0cmluZ1tdXSB7XG4gIGlmICghaGFzUHJvamVjdE1pc2VDb25maWcoY3dkKSkgcmV0dXJuIFt7fSwgW11dO1xuXG4gIGNvbnN0IGFyZ3MgPSBbJ2VudicsICctLWpzb24nLCAnLS1jZCcsIGN3ZF07XG4gIGlmIChjYXNjYWRlKSB7XG4gICAgYXJncy5wdXNoKCctLWVudicsIGNhc2NhZGUpO1xuICB9XG4gIGNvbnN0IHJlc3VsdCA9IGNoaWxkUHJvY2Vzcy5zcGF3blN5bmMoJ21pc2UnLCBhcmdzLCB7XG4gICAgZW5jb2Rpbmc6ICd1dGY4JyxcbiAgICBzdGRpbzogWydpZ25vcmUnLCAncGlwZScsICdwaXBlJ10sXG4gIH0pO1xuICBpZiAocmVzdWx0LmVycm9yIHx8IHJlc3VsdC5zdGF0dXMgIT09IDAgfHwgIXJlc3VsdC5zdGRvdXQ/LnRyaW0oKSkgcmV0dXJuIFt7fSwgW11dO1xuXG4gIGxldCBwYXJzZWQ6IHVua25vd247XG4gIHRyeSB7XG4gICAgcGFyc2VkID0gSlNPTi5wYXJzZShyZXN1bHQuc3Rkb3V0KTtcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIFt7fSwgW11dO1xuICB9XG4gIGlmICghcGFyc2VkIHx8IHR5cGVvZiBwYXJzZWQgIT09ICdvYmplY3QnIHx8IEFycmF5LmlzQXJyYXkocGFyc2VkKSkgcmV0dXJuIFt7fSwgW11dO1xuXG4gIGNvbnN0IGVudlZhcnM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7fTtcbiAgY29uc3Qga2V5czogc3RyaW5nW10gPSBbXTtcbiAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMocGFyc2VkKSkge1xuICAgIGlmICh0eXBlb2YgdmFsdWUgIT09ICdzdHJpbmcnIHx8IGtleSBpbiBjdXJyZW50RW52VmFycykgY29udGludWU7XG4gICAgaWYgKG9wdGlvbnM/Lmlnbm9yZVByb2Nlc3NFbnYpIHtcbiAgICAgIC8vIGBtaXNlIGVudmAgYWx3YXlzIGVtaXRzIFBBVEggZHVlIHRvIHRvb2wgc2hpbXM7IGNvbnN1bWVycyBvZiBmaWxlLWRlZmluZWQgdmFyaWFibGVzXG4gICAgICAvLyAoZS5nLiBgd2IgZ2VuLWRldi12YXJzYCkgbXVzdCBub3QgcHJvcGFnYXRlIGl0LlxuICAgICAgaWYgKGtleSA9PT0gJ1BBVEgnKSBjb250aW51ZTtcbiAgICB9IGVsc2UgaWYgKHByb2Nlc3MuZW52W2tleV0gPT09IHZhbHVlKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgZW52VmFyc1trZXldID0gdmFsdWU7XG4gICAga2V5cy5wdXNoKGtleSk7XG4gIH1cbiAgcmV0dXJuIFtlbnZWYXJzLCBrZXlzXTtcbn1cblxuZnVuY3Rpb24gaGFzUHJvamVjdE1pc2VDb25maWcoY3dkOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgZm9yIChsZXQgY3VycmVudFBhdGggPSBwYXRoLnJlc29sdmUoY3dkKTsgOyBjdXJyZW50UGF0aCA9IHBhdGguZGlybmFtZShjdXJyZW50UGF0aCkpIHtcbiAgICBpZiAoZnMuZXhpc3RzU3luYyhwYXRoLmpvaW4oY3VycmVudFBhdGgsICdtaXNlLnRvbWwnKSkgfHwgZnMuZXhpc3RzU3luYyhwYXRoLmpvaW4oY3VycmVudFBhdGgsICcubWlzZS50b21sJykpKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgY29uc3QgcGFyZW50UGF0aCA9IHBhdGguZGlybmFtZShjdXJyZW50UGF0aCk7XG4gICAgaWYgKHBhcmVudFBhdGggPT09IGN1cnJlbnRQYXRoKSByZXR1cm4gZmFsc2U7XG4gIH1cbn1cblxuZnVuY3Rpb24gbWlzZUVudmlyb25tZW50U291cmNlTmFtZShjYXNjYWRlOiBzdHJpbmcgfCB1bmRlZmluZWQpOiBzdHJpbmcge1xuICByZXR1cm4gY2FzY2FkZSA/IGBtaXNlIGVudiAtLWVudiAke2Nhc2NhZGV9YCA6ICdtaXNlIGVudic7XG59XG5cbmZ1bmN0aW9uIGlzQ0lFbnZpcm9ubWVudChjaUVudjogc3RyaW5nIHwgdW5kZWZpbmVkKTogYm9vbGVhbiB7XG4gIHJldHVybiAhIWNpRW52ICYmIGNpRW52ICE9PSAnMCcgJiYgY2lFbnYgIT09ICdmYWxzZSc7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBzaG91bGRTdXBwcmVzc0Vudmlyb25tZW50T3V0cHV0KGFyZ3Y6IEVudlJlYWRlck9wdGlvbnMpOiBib29sZWFuIHtcbiAgY29uc3Qgb3V0cHV0T3B0aW9ucyA9IGFyZ3YgYXMgRW52UmVhZGVyT3B0aW9ucyAmIHsgcXVpZXRFbnY/OiBib29sZWFuOyBzaWxlbnQ/OiBib29sZWFuIH07XG4gIHJldHVybiBvdXRwdXRPcHRpb25zLnF1aWV0RW52ID09PSB0cnVlIHx8IChvdXRwdXRPcHRpb25zLnF1aWV0RW52ICE9PSBmYWxzZSAmJiBvdXRwdXRPcHRpb25zLnNpbGVudCA9PT0gdHJ1ZSk7XG59XG5cbi8qKlxuICogVGhpcyBmdW5jdGlvbiByZWFkIGVudmlyb25tZW50IHZhcmlhYmxlcyBmcm9tIGAuZW52YCBmaWxlcyBhbmQgYXNzaWduIHRoZW0gaW4gYHByb2Nlc3MuZW52YC5cbiAqICovXG5leHBvcnQgZnVuY3Rpb24gcmVhZEFuZEFwcGx5RW52aXJvbm1lbnRWYXJpYWJsZXMoXG4gIGFyZ3Y6IEVudlJlYWRlck9wdGlvbnMsXG4gIGN3ZDogc3RyaW5nXG4pOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmcgfCB1bmRlZmluZWQ+IHtcbiAgY29uc3QgW2VudlZhcnNdID0gcmVhZEVudmlyb25tZW50VmFyaWFibGVzKGFyZ3YsIGN3ZCk7XG4gIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKGVudlZhcnMpKSB7XG4gICAgLy8gRXhpc3RpbmcgcHJvY2Vzcy5lbnYga2V5cyBhcmUga2VwdDogZW52VmFycyBtYXkgZGVsaWJlcmF0ZWx5IGNvbnRhaW4gZGlmZmVyaW5nIHZhbHVlcyB0aGF0XG4gICAgLy8gbXVzdCB3aW4gb25seSBpbiB0aGUgcmV0dXJuZWQgcmVjb3JkIChtaXNlIGNhc2NhZGUtcHJvZmlsZSB2YWx1ZXMsIGZvcmNlZC1tb2RlIG92ZXJyaWRlc1xuICAgIC8vIGNvbnN1bWVkIHZpYSBgcHJvamVjdC5lbnZgKSwgbmV2ZXIgY2xvYmJlciB0aGUgY2FsbGVyJ3Mgb3duIHByb2Nlc3MgZW52aXJvbm1lbnQuXG4gICAgaWYgKCEoa2V5IGluIHByb2Nlc3MuZW52KSkge1xuICAgICAgcHJvY2Vzcy5lbnZba2V5XSA9IHZhbHVlO1xuICAgIH1cbiAgfVxuICByZXR1cm4gZW52VmFycztcbn1cblxuY29uc3QgY2FjaGVkRW52VmFycyA9IG5ldyBNYXA8c3RyaW5nLCBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+PigpO1xuXG5mdW5jdGlvbiByZWFkRW52RmlsZShmaWxlUGF0aDogc3RyaW5nKTogUmVjb3JkPHN0cmluZywgc3RyaW5nPiB7XG4gIGNvbnN0IGNhY2hlZCA9IGNhY2hlZEVudlZhcnMuZ2V0KGZpbGVQYXRoKTtcbiAgaWYgKGNhY2hlZCkgcmV0dXJuIGNhY2hlZDtcblxuICBjb25zdCBwYXJzZWQgPSBjb25maWcoeyBwYXRoOiBwYXRoLnJlc29sdmUoZmlsZVBhdGgpLCBwcm9jZXNzRW52OiB7fSwgcXVpZXQ6IHRydWUgfSkucGFyc2VkID8/IHt9O1xuICBjYWNoZWRFbnZWYXJzLnNldChmaWxlUGF0aCwgcGFyc2VkKTtcbiAgcmV0dXJuIHBhcnNlZDtcbn1cblxuLyoqXG4gKiBUaGlzIGZ1bmN0aW9uIHJlbW92ZXMgZW52aXJvbm1lbnQgdmFyaWFibGVzIHJlbGF0ZWQgdG8gbnBtIGFuZCB5YXJuIGZyb20gdGhlIGdpdmVuIGVudmlyb25tZW50IHZhcmlhYmxlcy5cbiAqICovXG5leHBvcnQgZnVuY3Rpb24gcmVtb3ZlTnBtQW5kWWFybkVudmlyb25tZW50VmFyaWFibGVzKGVudlZhcnM6IFJlY29yZDxzdHJpbmcsIHN0cmluZyB8IHVuZGVmaW5lZD4pOiB2b2lkIHtcbiAgLy8gUmVtb3ZlIG5wbSAmIHlhcm4gZW52aXJvbm1lbnQgdmFyaWFibGVzIGZyb20gcHJvY2Vzcy5lbnZcbiAgaWYgKGVudlZhcnMuUEFUSCAmJiBlbnZWYXJzLkJFUlJZX0JJTl9GT0xERVIpIHtcbiAgICBlbnZWYXJzLlBBVEggPSBlbnZWYXJzLlBBVEgucmVwbGFjZShgJHtlbnZWYXJzLkJFUlJZX0JJTl9GT0xERVJ9OmAsICcnKVxuICAgICAgLy8gVGVtcG9yYXJ5IGRpcmVjdG9yeSBpbiBtYWNPU1xuICAgICAgLnJlcGxhY2VBbGwoL1xcL3ByaXZhdGVcXC92YXJcXC9mb2xkZXJzXFwvW146XSs6L2csICcnKVxuICAgICAgLy8gVGVtcG9yYXJ5IGRpcmVjdG9yaWVzIGluIExpbnV4XG4gICAgICAucmVwbGFjZUFsbCgvXFwvdmFyXFwvdG1wXFwvW146XSs6L2csICcnKVxuICAgICAgLnJlcGxhY2VBbGwoL1xcL3RtcFxcL1teOl0rOi9nLCAnJyk7XG4gIH1cbiAgZm9yIChjb25zdCBrZXkgb2YgT2JqZWN0LmtleXMoZW52VmFycykpIHtcbiAgICBjb25zdCB1cHBlcktleSA9IGtleS50b1VwcGVyQ2FzZSgpO1xuICAgIGlmIChcbiAgICAgIHVwcGVyS2V5LnN0YXJ0c1dpdGgoJ05QTV8nKSB8fFxuICAgICAgdXBwZXJLZXkuc3RhcnRzV2l0aCgnWUFSTl8nKSB8fFxuICAgICAgdXBwZXJLZXkuc3RhcnRzV2l0aCgnQkVSUllfJykgfHxcbiAgICAgIHVwcGVyS2V5ID09PSAnUFJPSkVDVF9DV0QnIHx8XG4gICAgICB1cHBlcktleSA9PT0gJ0lOSVRfQ1dEJ1xuICAgICkge1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1keW5hbWljLWRlbGV0ZVxuICAgICAgZGVsZXRlIGVudlZhcnNba2V5XTtcbiAgICB9XG4gIH1cbn1cbiIsImV4cG9ydCBmdW5jdGlvbiBpc0Vycm5vRXhjZXB0aW9uKGVycm9yOiB1bmtub3duKTogZXJyb3IgaXMgTm9kZUpTLkVycm5vRXhjZXB0aW9uIHtcbiAgcmV0dXJuIGVycm9yIGluc3RhbmNlb2YgRXJyb3IgJiYgJ2NvZGUnIGluIGVycm9yO1xufVxuIiwiZXhwb3J0IGZ1bmN0aW9uIGJ1aWxkQ2hpbGRyZW5CeVBhcmVudE1hcChwc091dHB1dDogc3RyaW5nKTogTWFwPG51bWJlciwgbnVtYmVyW10+IHtcbiAgY29uc3QgY2hpbGRyZW5CeVBhcmVudCA9IG5ldyBNYXA8bnVtYmVyLCBudW1iZXJbXT4oKTtcbiAgZm9yIChjb25zdCBsaW5lIG9mIHBzT3V0cHV0LnNwbGl0KCdcXG4nKSkge1xuICAgIGNvbnN0IG1hdGNoZWQgPSAvXlxccyooXFxkKylcXHMrKFxcZCspXFxzKiQvLmV4ZWMobGluZSk7XG4gICAgaWYgKCFtYXRjaGVkKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICBjb25zdCBjaGlsZFBpZCA9IE51bWJlcihtYXRjaGVkWzFdKTtcbiAgICBjb25zdCBwYXJlbnRQaWQgPSBOdW1iZXIobWF0Y2hlZFsyXSk7XG4gICAgY29uc3QgY2hpbGRyZW4gPSBjaGlsZHJlbkJ5UGFyZW50LmdldChwYXJlbnRQaWQpO1xuICAgIGlmIChjaGlsZHJlbikge1xuICAgICAgY2hpbGRyZW4ucHVzaChjaGlsZFBpZCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNoaWxkcmVuQnlQYXJlbnQuc2V0KHBhcmVudFBpZCwgW2NoaWxkUGlkXSk7XG4gICAgfVxuICB9XG4gIHJldHVybiBjaGlsZHJlbkJ5UGFyZW50O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY29sbGVjdERlc2NlbmRhbnRQaWRzKHJvb3RQaWQ6IG51bWJlciwgY2hpbGRyZW5CeVBhcmVudDogTWFwPG51bWJlciwgbnVtYmVyW10+KTogbnVtYmVyW10ge1xuICBjb25zdCBkZXNjZW5kYW50czogbnVtYmVyW10gPSBbXTtcbiAgY29uc3QgcXVldWUgPSBbLi4uKGNoaWxkcmVuQnlQYXJlbnQuZ2V0KHJvb3RQaWQpID8/IFtdKV07XG4gIGxldCBpbmRleCA9IDA7XG4gIHdoaWxlIChpbmRleCA8IHF1ZXVlLmxlbmd0aCkge1xuICAgIGNvbnN0IHBpZCA9IHF1ZXVlW2luZGV4XSBhcyBudW1iZXI7XG4gICAgaW5kZXggKz0gMTtcbiAgICBkZXNjZW5kYW50cy5wdXNoKHBpZCk7XG4gICAgcXVldWUucHVzaCguLi4oY2hpbGRyZW5CeVBhcmVudC5nZXQocGlkKSA/PyBbXSkpO1xuICB9XG4gIHJldHVybiBkZXNjZW5kYW50cztcbn1cbiIsImltcG9ydCB7IGV4ZWNGaWxlU3luYyB9IGZyb20gJ25vZGU6Y2hpbGRfcHJvY2Vzcyc7XG5cbmltcG9ydCB7IGlzRXJybm9FeGNlcHRpb24gfSBmcm9tICcuL2Vycm5vLmpzJztcbmltcG9ydCB7IGJ1aWxkQ2hpbGRyZW5CeVBhcmVudE1hcCwgY29sbGVjdERlc2NlbmRhbnRQaWRzIGFzIGNvbGxlY3REZXNjZW5kYW50UGlkc0Zyb21NYXAgfSBmcm9tICcuL3Byb2Nlc3NUcmVlLmpzJztcblxuZXhwb3J0IGZ1bmN0aW9uIHRyZWVLaWxsKHBpZDogbnVtYmVyLCBzaWduYWw6IE5vZGVKUy5TaWduYWxzID0gJ1NJR1RFUk0nKTogdm9pZCB7XG4gIGlmICghTnVtYmVyLmlzSW50ZWdlcihwaWQpIHx8IHBpZCA8PSAwKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIHBpZDogJHtwaWR9YCk7XG4gIH1cblxuICBpZiAocHJvY2Vzcy5wbGF0Zm9ybSA9PT0gJ3dpbjMyJykge1xuICAgIGtpbGxUcmVlT25XaW5kb3dzKHBpZCk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgY29uc3QgZGVzY2VuZGFudHMgPSBjb2xsZWN0RGVzY2VuZGFudFBpZHMocGlkKTtcbiAgY29uc3QgdGFyZ2V0UGlkcyA9IHRvQ2hpbGRyZW5GaXJzdFBpZHMocGlkLCBkZXNjZW5kYW50cyk7XG4gIGZvciAoY29uc3QgdGFyZ2V0UGlkIG9mIHRhcmdldFBpZHMpIHtcbiAgICBraWxsSWZOZWVkZWQodGFyZ2V0UGlkLCBzaWduYWwpO1xuICB9XG59XG5cbmZ1bmN0aW9uIGtpbGxJZk5lZWRlZChwaWQ6IG51bWJlciwgc2lnbmFsOiBOb2RlSlMuU2lnbmFscyk6IHZvaWQge1xuICB0cnkge1xuICAgIHByb2Nlc3Mua2lsbChwaWQsIHNpZ25hbCk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgaWYgKGlzTm9TdWNoUHJvY2Vzc0Vycm9yKGVycm9yKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aHJvdyBlcnJvcjtcbiAgfVxufVxuXG5mdW5jdGlvbiBraWxsVHJlZU9uV2luZG93cyhwaWQ6IG51bWJlcik6IHZvaWQge1xuICB0cnkge1xuICAgIHJ1bkNvbW1hbmQoJ3Rhc2traWxsJywgWycvUElEJywgU3RyaW5nKHBpZCksICcvVCcsICcvRiddLCB7XG4gICAgICBtYXhCdWZmZXI6IDEwMjQgKiAxMDI0LFxuICAgICAgdGltZW91dDogMjAwMCxcbiAgICB9KTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBpZiAoaXNOb1N1Y2hQcm9jZXNzRXJyb3IoZXJyb3IpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRocm93IGVycm9yO1xuICB9XG59XG5cbmZ1bmN0aW9uIGNvbGxlY3REZXNjZW5kYW50UGlkcyhyb290UGlkOiBudW1iZXIpOiBudW1iZXJbXSB7XG4gIGNvbnN0IHsgc3Rkb3V0IH0gPSBydW5Db21tYW5kKFxuICAgICdwcycsXG4gICAgWyctQW8nLCAncGlkPSxwcGlkPSddLFxuICAgIC8vIEtlZXAgY29tbWFuZCBib3VuZGVkIHNvIHdhdGNoLW1vZGUga2lsbCBsb29wcyBjYW5ub3QgaGFuZyB0aGlzIHBhdGguXG4gICAgeyBtYXhCdWZmZXI6IDEwMjQgKiAxMDI0LCB0aW1lb3V0OiAyMDAwIH1cbiAgKTtcbiAgY29uc3QgY2hpbGRyZW5CeVBhcmVudCA9IGJ1aWxkQ2hpbGRyZW5CeVBhcmVudE1hcChzdGRvdXQpO1xuICByZXR1cm4gY29sbGVjdERlc2NlbmRhbnRQaWRzRnJvbU1hcChyb290UGlkLCBjaGlsZHJlbkJ5UGFyZW50KTtcbn1cblxuZnVuY3Rpb24gdG9DaGlsZHJlbkZpcnN0UGlkcyhwaWQ6IG51bWJlciwgZGVzY2VuZGFudHM6IHJlYWRvbmx5IG51bWJlcltdKTogbnVtYmVyW10ge1xuICBjb25zdCB0YXJnZXRQaWRzID0gZGVzY2VuZGFudHMudG9SZXZlcnNlZCgpO1xuICB0YXJnZXRQaWRzLnB1c2gocGlkKTtcbiAgcmV0dXJuIHRhcmdldFBpZHM7XG59XG5cbmZ1bmN0aW9uIHJ1bkNvbW1hbmQoXG4gIGNvbW1hbmQ6IHN0cmluZyxcbiAgYXJnczogcmVhZG9ubHkgc3RyaW5nW10sXG4gIG9wdGlvbnM/OiB7IHRpbWVvdXQ6IG51bWJlcjsgbWF4QnVmZmVyOiBudW1iZXIgfVxuKTogeyBzdGRvdXQ6IHN0cmluZzsgc3RkZXJyOiBzdHJpbmcgfSB7XG4gIHRyeSB7XG4gICAgY29uc3Qgc3Rkb3V0ID0gZXhlY0ZpbGVTeW5jKGNvbW1hbmQsIFsuLi5hcmdzXSwge1xuICAgICAgZW5jb2Rpbmc6ICd1dGY4JyxcbiAgICAgIG1heEJ1ZmZlcjogb3B0aW9ucz8ubWF4QnVmZmVyLFxuICAgICAgdGltZW91dDogb3B0aW9ucz8udGltZW91dCxcbiAgICAgIHN0ZGlvOiBbJ2lnbm9yZScsICdwaXBlJywgJ3BpcGUnXSxcbiAgICB9KTtcbiAgICByZXR1cm4geyBzdGRvdXQsIHN0ZGVycjogJycgfTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBjb25zdCBzdGRlcnIgPSBleHRyYWN0U3RkZXJyKGVycm9yKTtcbiAgICB0aHJvdyBuZXcgQ29tbWFuZEV4ZWN1dGlvbkVycm9yKGNvbW1hbmQsIGFyZ3MsIHN0ZGVyciwgdG9FeGl0Q29kZShlcnJvcikpO1xuICB9XG59XG5cbmZ1bmN0aW9uIGlzTm9TdWNoUHJvY2Vzc0Vycm9yKGVycm9yOiB1bmtub3duKTogYm9vbGVhbiB7XG4gIGlmIChpc0Vycm5vRXhjZXB0aW9uKGVycm9yKSAmJiBlcnJvci5jb2RlID09PSAnRVNSQ0gnKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBDb21tYW5kRXhlY3V0aW9uRXJyb3IpIHtcbiAgICByZXR1cm4gL25vIHN1Y2ggcHJvY2Vzc3xub3QgZm91bmR8bm90IHJlY29nbml6ZWR8dGhlcmUgaXMgbm8gcnVubmluZyBpbnN0YW5jZS9pLnRlc3QoZXJyb3Iuc3RkZXJyKTtcbiAgfVxuICByZXR1cm4gZmFsc2U7XG59XG5cbmZ1bmN0aW9uIHRvRXhpdENvZGUoZXJyb3I6IHVua25vd24pOiBudW1iZXIgfCBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBpZiAoaXNFcnJub0V4Y2VwdGlvbihlcnJvcikpIHtcbiAgICByZXR1cm4gZXJyb3IuY29kZTtcbiAgfVxuICBpZiAodHlwZW9mIGVycm9yID09PSAnb2JqZWN0JyAmJiBlcnJvciAhPT0gbnVsbCAmJiAnc3RhdHVzJyBpbiBlcnJvcikge1xuICAgIGNvbnN0IHN0YXR1cyA9IChlcnJvciBhcyB7IHN0YXR1czogdW5rbm93biB9KS5zdGF0dXM7XG4gICAgaWYgKHR5cGVvZiBzdGF0dXMgPT09ICdudW1iZXInKSB7XG4gICAgICByZXR1cm4gc3RhdHVzO1xuICAgIH1cbiAgfVxuICByZXR1cm4gdW5kZWZpbmVkO1xufVxuXG5mdW5jdGlvbiBleHRyYWN0U3RkZXJyKGVycm9yOiB1bmtub3duKTogc3RyaW5nIHtcbiAgaWYgKHR5cGVvZiBlcnJvciAhPT0gJ29iamVjdCcgfHwgZXJyb3IgPT09IG51bGwgfHwgISgnc3RkZXJyJyBpbiBlcnJvcikpIHtcbiAgICByZXR1cm4gJyc7XG4gIH1cblxuICBjb25zdCBzdGRlcnIgPSAoZXJyb3IgYXMgUmVjb3JkPCdzdGRlcnInLCB1bmtub3duPikuc3RkZXJyO1xuICBpZiAodHlwZW9mIHN0ZGVyciA9PT0gJ3N0cmluZycpIHtcbiAgICByZXR1cm4gc3RkZXJyO1xuICB9XG4gIGlmIChCdWZmZXIuaXNCdWZmZXIoc3RkZXJyKSkge1xuICAgIHJldHVybiBzdGRlcnIudG9TdHJpbmcoJ3V0ZjgnKTtcbiAgfVxuICByZXR1cm4gJyc7XG59XG5cbmNsYXNzIENvbW1hbmRFeGVjdXRpb25FcnJvciBleHRlbmRzIEVycm9yIHtcbiAgcmVhZG9ubHkgc3RkZXJyOiBzdHJpbmc7XG4gIHJlYWRvbmx5IGNvZGU6IG51bWJlciB8IHN0cmluZyB8IHVuZGVmaW5lZDtcblxuICBjb25zdHJ1Y3Rvcihjb21tYW5kOiBzdHJpbmcsIGFyZ3M6IHJlYWRvbmx5IHN0cmluZ1tdLCBzdGRlcnI6IHN0cmluZywgY29kZTogbnVtYmVyIHwgc3RyaW5nIHwgdW5kZWZpbmVkKSB7XG4gICAgc3VwZXIoYENvbW1hbmQgZmFpbGVkOiAke2NvbW1hbmR9ICR7YXJncy5qb2luKCcgJyl9YCk7XG4gICAgdGhpcy5uYW1lID0gJ0NvbW1hbmRFeGVjdXRpb25FcnJvcic7XG4gICAgdGhpcy5zdGRlcnIgPSBzdGRlcnI7XG4gICAgdGhpcy5jb2RlID0gY29kZTtcbiAgfVxufVxuIiwiaW1wb3J0IHR5cGUge1xuICBTcGF3bk9wdGlvbnMsXG4gIFNwYXduT3B0aW9uc1dpdGhvdXRTdGRpbyxcbiAgU3Bhd25PcHRpb25zV2l0aFN0ZGlvVHVwbGUsXG4gIFNwYXduU3luY1JldHVybnMsXG4gIFN0ZGlvTnVsbCxcbiAgU3RkaW9QaXBlLFxufSBmcm9tICdub2RlOmNoaWxkX3Byb2Nlc3MnO1xuaW1wb3J0IHsgc3Bhd24gfSBmcm9tICdub2RlOmNoaWxkX3Byb2Nlc3MnO1xuXG5pbXBvcnQgeyB0cmVlS2lsbCB9IGZyb20gJy4vdHJlZUtpbGwuanMnO1xuXG4vKipcbiAqIFJldHVybiB0eXBlIGZvciBzcGF3bkFzeW5jIGZ1bmN0aW9uLCBiYXNlZCBvbiBTcGF3blN5bmNSZXR1cm5zIGJ1dCB3aXRob3V0IG91dHB1dCBhbmQgZXJyb3IgcHJvcGVydGllc1xuICovXG5leHBvcnQgdHlwZSBTcGF3bkFzeW5jUmV0dXJucyA9IE9taXQ8U3Bhd25TeW5jUmV0dXJuczxzdHJpbmc+LCAnb3V0cHV0JyB8ICdlcnJvcic+O1xuXG4vKipcbiAqIE9wdGlvbnMgZm9yIHNwYXduQXN5bmMgZnVuY3Rpb24sIGV4dGVuZGluZyB2YXJpb3VzIE5vZGUuanMgc3Bhd24gb3B0aW9ucyB3aXRoIGFkZGl0aW9uYWwgZnVuY3Rpb25hbGl0eVxuICovXG5leHBvcnQgdHlwZSBTcGF3bkFzeW5jT3B0aW9ucyA9IChcbiAgfCBTcGF3bk9wdGlvbnNXaXRob3V0U3RkaW9cbiAgfCBTcGF3bk9wdGlvbnNXaXRoU3RkaW9UdXBsZTxTdGRpb1BpcGUsIFN0ZGlvUGlwZSwgU3RkaW9QaXBlPlxuICB8IFNwYXduT3B0aW9uc1dpdGhTdGRpb1R1cGxlPFN0ZGlvUGlwZSwgU3RkaW9QaXBlLCBTdGRpb051bGw+XG4gIHwgU3Bhd25PcHRpb25zV2l0aFN0ZGlvVHVwbGU8U3RkaW9QaXBlLCBTdGRpb051bGwsIFN0ZGlvUGlwZT5cbiAgfCBTcGF3bk9wdGlvbnNXaXRoU3RkaW9UdXBsZTxTdGRpb051bGwsIFN0ZGlvUGlwZSwgU3RkaW9QaXBlPlxuICB8IFNwYXduT3B0aW9uc1dpdGhTdGRpb1R1cGxlPFN0ZGlvUGlwZSwgU3RkaW9OdWxsLCBTdGRpb051bGw+XG4gIHwgU3Bhd25PcHRpb25zV2l0aFN0ZGlvVHVwbGU8U3RkaW9OdWxsLCBTdGRpb1BpcGUsIFN0ZGlvTnVsbD5cbiAgfCBTcGF3bk9wdGlvbnNXaXRoU3RkaW9UdXBsZTxTdGRpb051bGwsIFN0ZGlvTnVsbCwgU3RkaW9QaXBlPlxuICB8IFNwYXduT3B0aW9uc1dpdGhTdGRpb1R1cGxlPFN0ZGlvTnVsbCwgU3RkaW9OdWxsLCBTdGRpb051bGw+XG4gIHwgU3Bhd25PcHRpb25zXG4pICYge1xuICAvKiogSW5wdXQgc3RyaW5nIHRvIHdyaXRlIHRvIHRoZSBzcGF3bmVkIHByb2Nlc3MncyBzdGRpbiAqL1xuICBpbnB1dD86IHN0cmluZztcbiAgLyoqIElmIHRydWUsIHN0ZGVyciBvdXRwdXQgd2lsbCBiZSBtZXJnZWQgaW50byBzdGRvdXQgKi9cbiAgbWVyZ2VPdXRBbmRFcnJvcj86IGJvb2xlYW47XG4gIC8qKiBJZiB0cnVlLCB0aGUgc3Bhd25lZCBwcm9jZXNzIHdpbGwgYmUga2lsbGVkIHdoZW4gdGhlIHBhcmVudCBwcm9jZXNzIGV4aXRzICovXG4gIGtpbGxPbkV4aXQ/OiBib29sZWFuO1xuICAvKiogSWYgdHJ1ZSwgZW5hYmxlcyB2ZXJib3NlIGxvZ2dpbmcgb2YgcHJvY2VzcyBvcGVyYXRpb25zICovXG4gIHZlcmJvc2U/OiBib29sZWFuO1xuICAvKiogSWYgdHJ1ZSwgc3Rkb3V0IGRhdGEgd2lsbCBiZSBwcmludGVkIHRvIGNvbnNvbGUgYXMgaXQncyByZWNlaXZlZCAqL1xuICBwcmludGluZ1N0ZG91dD86IGJvb2xlYW47XG4gIC8qKiBJZiB0cnVlLCBzdGRlcnIgZGF0YSB3aWxsIGJlIHByaW50ZWQgdG8gY29uc29sZSBhcyBpdCdzIHJlY2VpdmVkICovXG4gIHByaW50aW5nU3RkZXJyPzogYm9vbGVhbjtcbiAgLyoqIElmIHRydWUsIGJsYW5rLW9ubHkgbGluZXMgYXJlIHNraXBwZWQgd2hpbGUgcHJpbnRpbmcgc3Rkb3V0L3N0ZGVyciBpbiByZWFsdGltZSAqL1xuICBvbWl0QmxhbmtMaW5lc1doaWxlUHJpbnRpbmc/OiBib29sZWFuO1xufTtcblxuLyoqXG4gKiBTcGF3bnMgYSBjaGlsZCBwcm9jZXNzIGFzeW5jaHJvbm91c2x5IGFuZCByZXR1cm5zIGEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHdpdGggdGhlIHByb2Nlc3MgcmVzdWx0c1xuICpcbiAqIFRoaXMgZnVuY3Rpb24gcHJvdmlkZXMgYSBQcm9taXNlLWJhc2VkIHdyYXBwZXIgYXJvdW5kIE5vZGUuanMncyBzcGF3biBmdW5jdGlvbiB3aXRoIGFkZGl0aW9uYWwgZmVhdHVyZXM6XG4gKiAtIEF1dG9tYXRpYyBlbmNvZGluZyBvZiBzdGRvdXQvc3RkZXJyIGFzIFVURi04XG4gKiAtIE9wdGlvbiB0byBtZXJnZSBzdGRlcnIgaW50byBzdGRvdXRcbiAqIC0gT3B0aW9uIHRvIGF1dG9tYXRpY2FsbHkga2lsbCB0aGUgcHJvY2VzcyBvbiBwYXJlbnQgZXhpdFxuICogLSBPcHRpb24gdG8gcHJvdmlkZSBpbnB1dCB2aWEgc3RkaW5cbiAqIC0gVmVyYm9zZSBsb2dnaW5nIGNhcGFiaWxpdHlcbiAqXG4gKiBAcGFyYW0gY29tbWFuZCAtIFRoZSBjb21tYW5kIHRvIHJ1blxuICogQHBhcmFtIGFyZ3MgLSBMaXN0IG9mIHN0cmluZyBhcmd1bWVudHNcbiAqIEBwYXJhbSBvcHRpb25zIC0gQ29uZmlndXJhdGlvbiBvcHRpb25zIGZvciB0aGUgc3Bhd25lZCBwcm9jZXNzXG4gKiBAcmV0dXJucyBQcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2l0aCB0aGUgcHJvY2VzcyByZXN1bHRzIGluY2x1ZGluZyBwaWQsIHN0ZG91dCwgc3RkZXJyLCBzdGF0dXMsIGFuZCBzaWduYWxcbiAqIEB0aHJvd3MgV2lsbCByZWplY3QgdGhlIHByb21pc2UgaWYgdGhlIHByb2Nlc3MgZmFpbHMgdG8gc3Bhd24gb3IgZW5jb3VudGVycyBhbiBlcnJvclxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBjb25zdCByZXN1bHQgPSBhd2FpdCBzcGF3bkFzeW5jKCdscycsIFsnLWxhJ10sIHsgdmVyYm9zZTogdHJ1ZSB9KTtcbiAqIGNvbnNvbGUubG9nKHJlc3VsdC5zdGRvdXQpO1xuICogYGBgXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBzcGF3bkFzeW5jKFxuICBjb21tYW5kOiBzdHJpbmcsXG4gIGFyZ3M/OiByZWFkb25seSBzdHJpbmdbXSxcbiAgb3B0aW9ucz86IFNwYXduQXN5bmNPcHRpb25zXG4pOiBQcm9taXNlPFNwYXduQXN5bmNSZXR1cm5zPiB7XG4gIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHByb2MgPSBzcGF3bihjb21tYW5kLCBhcmdzID8/IFtdLCBvcHRpb25zID8/IHt9KTtcbiAgICAgIC8vIGBzZXRFbmNvZGluZ2AgaXMgdW5kZWZpbmVkIGluIEJ1blxuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bm5lY2Vzc2FyeS1jb25kaXRpb25cbiAgICAgIHByb2Muc3Rkb3V0Py5zZXRFbmNvZGluZz8uKCd1dGY4Jyk7XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVubmVjZXNzYXJ5LWNvbmRpdGlvblxuICAgICAgcHJvYy5zdGRlcnI/LnNldEVuY29kaW5nPy4oJ3V0ZjgnKTtcblxuICAgICAgbGV0IHN0ZG91dCA9ICcnO1xuICAgICAgbGV0IHN0ZGVyciA9ICcnO1xuICAgICAgY29uc3Qgc3Rkb3V0UHJpbnRlciA9IGNyZWF0ZVJlYWx0aW1lUHJpbnRlcihwcm9jZXNzLnN0ZG91dCwgb3B0aW9ucz8ub21pdEJsYW5rTGluZXNXaGlsZVByaW50aW5nKTtcbiAgICAgIGNvbnN0IHN0ZGVyclByaW50ZXIgPSBjcmVhdGVSZWFsdGltZVByaW50ZXIocHJvY2Vzcy5zdGRlcnIsIG9wdGlvbnM/Lm9taXRCbGFua0xpbmVzV2hpbGVQcmludGluZyk7XG4gICAgICBwcm9jLnN0ZG91dD8ub24oJ2RhdGEnLCAoZGF0YTogc3RyaW5nKSA9PiB7XG4gICAgICAgIHN0ZG91dCArPSBkYXRhO1xuICAgICAgICBpZiAob3B0aW9ucz8ucHJpbnRpbmdTdGRvdXQpIHtcbiAgICAgICAgICBzdGRvdXRQcmludGVyLndyaXRlKGRhdGEpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIHByb2Muc3RkZXJyPy5vbignZGF0YScsIChkYXRhOiBzdHJpbmcpID0+IHtcbiAgICAgICAgaWYgKG9wdGlvbnM/Lm1lcmdlT3V0QW5kRXJyb3IpIHtcbiAgICAgICAgICBzdGRvdXQgKz0gZGF0YTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBzdGRlcnIgKz0gZGF0YTtcbiAgICAgICAgfVxuICAgICAgICBpZiAob3B0aW9ucz8ucHJpbnRpbmdTdGRlcnIpIHtcbiAgICAgICAgICBzdGRlcnJQcmludGVyLndyaXRlKGRhdGEpO1xuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgICAgbGV0IHN0b3BwZWQgPSBmYWxzZTtcbiAgICAgIGNvbnN0IHN0b3BQcm9jZXNzID0gKCk6IHZvaWQgPT4ge1xuICAgICAgICBpZiAoc3RvcHBlZCB8fCAhcHJvYy5waWQpIHJldHVybjtcblxuICAgICAgICBzdG9wcGVkID0gdHJ1ZTtcbiAgICAgICAgaWYgKG9wdGlvbnM/LnZlcmJvc2UpIHtcbiAgICAgICAgICBjb25zb2xlLmluZm8oYHRyZWVLaWxsKCR7cHJvYy5waWR9KWApO1xuICAgICAgICB9XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgdHJlZUtpbGwocHJvYy5waWQpO1xuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgIGlmIChvcHRpb25zPy52ZXJib3NlKSB7XG4gICAgICAgICAgICBjb25zb2xlLndhcm4oYEZhaWxlZCB0byB0cmVlS2lsbCgke3Byb2MucGlkfSlgLCBlcnJvcik7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9O1xuICAgICAgY29uc3QgY2xlYW51cFNpZ25hbHM6IE5vZGVKUy5TaWduYWxzW10gPVxuICAgICAgICBwcm9jZXNzLnBsYXRmb3JtID09PSAnd2luMzInID8gWydTSUdJTlQnLCAnU0lHVEVSTSddIDogWydTSUdJTlQnLCAnU0lHVEVSTScsICdTSUdRVUlUJ107XG4gICAgICBjb25zdCBzaWduYWxIYW5kbGVycyA9IG5ldyBNYXA8Tm9kZUpTLlNpZ25hbHMsICgpID0+IHZvaWQ+KCk7XG4gICAgICBjb25zdCByZW1vdmVLaWxsT25FeGl0SGFuZGxlcnMgPSAoKTogdm9pZCA9PiB7XG4gICAgICAgIHByb2Nlc3MucmVtb3ZlTGlzdGVuZXIoJ2JlZm9yZUV4aXQnLCBzdG9wUHJvY2Vzcyk7XG4gICAgICAgIGZvciAoY29uc3QgW3NpZ25hbCwgaGFuZGxlcl0gb2Ygc2lnbmFsSGFuZGxlcnMpIHtcbiAgICAgICAgICBwcm9jZXNzLnJlbW92ZUxpc3RlbmVyKHNpZ25hbCwgaGFuZGxlcik7XG4gICAgICAgIH1cbiAgICAgICAgc2lnbmFsSGFuZGxlcnMuY2xlYXIoKTtcbiAgICAgIH07XG4gICAgICBpZiAob3B0aW9ucz8ua2lsbE9uRXhpdCkge1xuICAgICAgICBwcm9jZXNzLm9uKCdiZWZvcmVFeGl0Jywgc3RvcFByb2Nlc3MpO1xuICAgICAgICBmb3IgKGNvbnN0IHNpZ25hbCBvZiBjbGVhbnVwU2lnbmFscykge1xuICAgICAgICAgIGNvbnN0IGhhbmRsZVNpZ25hbCA9ICgpOiB2b2lkID0+IHtcbiAgICAgICAgICAgIHN0b3BQcm9jZXNzKCk7XG4gICAgICAgICAgICByZW1vdmVLaWxsT25FeGl0SGFuZGxlcnMoKTtcbiAgICAgICAgICAgIGlmIChwcm9jZXNzLmxpc3RlbmVyQ291bnQoc2lnbmFsKSA9PT0gMCkge1xuICAgICAgICAgICAgICBwcm9jZXNzLmtpbGwocHJvY2Vzcy5waWQsIHNpZ25hbCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfTtcbiAgICAgICAgICBzaWduYWxIYW5kbGVycy5zZXQoc2lnbmFsLCBoYW5kbGVTaWduYWwpO1xuICAgICAgICAgIHByb2Nlc3Mub24oc2lnbmFsLCBoYW5kbGVTaWduYWwpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHByb2Mub24oJ2Vycm9yJywgKGVycm9yKSA9PiB7XG4gICAgICAgIHJlbW92ZUtpbGxPbkV4aXRIYW5kbGVycygpO1xuICAgICAgICBwcm9jLnJlbW92ZUFsbExpc3RlbmVycygnY2xvc2UnKTtcbiAgICAgICAgcmVqZWN0KGVycm9yKTtcbiAgICAgIH0pO1xuICAgICAgcHJvYy5vbignY2xvc2UnLCAoY29kZTogbnVtYmVyIHwgbnVsbCwgc2lnbmFsOiBOb2RlSlMuU2lnbmFscyB8IG51bGwpID0+IHtcbiAgICAgICAgcmVtb3ZlS2lsbE9uRXhpdEhhbmRsZXJzKCk7XG4gICAgICAgIHN0ZG91dFByaW50ZXIuZmx1c2goKTtcbiAgICAgICAgc3RkZXJyUHJpbnRlci5mbHVzaCgpO1xuICAgICAgICBpZiAocHJvYy5waWQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIHJlamVjdChuZXcgRXJyb3IoJ1Byb2Nlc3MgaGFzIG5vIHBpZC4nKSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmVzb2x2ZSh7XG4gICAgICAgICAgICBwaWQ6IHByb2MucGlkLFxuICAgICAgICAgICAgc3Rkb3V0LFxuICAgICAgICAgICAgc3RkZXJyLFxuICAgICAgICAgICAgc3RhdHVzOiBjb2RlLFxuICAgICAgICAgICAgc2lnbmFsLFxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgICAgaWYgKG9wdGlvbnM/LmlucHV0KSB7XG4gICAgICAgIHByb2Muc3RkaW4/LndyaXRlKG9wdGlvbnMuaW5wdXQpO1xuICAgICAgICBwcm9jLnN0ZGluPy5lbmQoKTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9wcmVmZXItcHJvbWlzZS1yZWplY3QtZXJyb3JzXG4gICAgICByZWplY3QoZXJyb3IpO1xuICAgIH1cbiAgfSk7XG59XG5cbmNvbnN0IEFOU0lfRVNDQVBFX0NPREVfUkVHRVhQID0gbmV3IFJlZ0V4cChgJHtTdHJpbmcuZnJvbUNvZGVQb2ludCgyNyl9XFxcXFtbMC0/XSpbIC0vXSpbQC1+XWAsICdnJyk7XG5cbmZ1bmN0aW9uIGNyZWF0ZVJlYWx0aW1lUHJpbnRlcihcbiAgc3RyZWFtOiBOb2RlSlMuV3JpdGVTdHJlYW0sXG4gIG9taXRCbGFua0xpbmVzID0gZmFsc2Vcbik6IHsgd3JpdGU6IChkYXRhOiBzdHJpbmcpID0+IHZvaWQ7IGZsdXNoOiAoKSA9PiB2b2lkIH0ge1xuICBpZiAoIW9taXRCbGFua0xpbmVzKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHdyaXRlOiAoZGF0YSkgPT4gc3RyZWFtLndyaXRlKGRhdGEpLFxuICAgICAgZmx1c2g6ICgpID0+IHt9LFxuICAgIH07XG4gIH1cblxuICBsZXQgcGVuZGluZyA9ICcnO1xuICByZXR1cm4ge1xuICAgIHdyaXRlOiAoZGF0YSkgPT4ge1xuICAgICAgcGVuZGluZyArPSBkYXRhO1xuICAgICAgY29uc3QgbGluZXMgPSBwZW5kaW5nLnNwbGl0KC9cXHI/XFxuLyk7XG4gICAgICBwZW5kaW5nID0gbGluZXMucG9wKCkgPz8gJyc7XG4gICAgICBmb3IgKGNvbnN0IGxpbmUgb2YgbGluZXMpIHtcbiAgICAgICAgaWYgKCFpc0JsYW5rTGluZShsaW5lKSkge1xuICAgICAgICAgIHN0cmVhbS53cml0ZShgJHtsaW5lfVxcbmApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSxcbiAgICBmbHVzaDogKCkgPT4ge1xuICAgICAgaWYgKCFpc0JsYW5rTGluZShwZW5kaW5nKSkge1xuICAgICAgICBzdHJlYW0ud3JpdGUocGVuZGluZyk7XG4gICAgICB9XG4gICAgICBwZW5kaW5nID0gJyc7XG4gICAgfSxcbiAgfTtcbn1cblxuZnVuY3Rpb24gaXNCbGFua0xpbmUobGluZTogc3RyaW5nKTogYm9vbGVhbiB7XG4gIHJldHVybiBsaW5lLnJlcGxhY2VBbGwoQU5TSV9FU0NBUEVfQ09ERV9SRUdFWFAsICcnKS50cmltKCkubGVuZ3RoID09PSAwO1xufVxuIiwiaW1wb3J0IHsgc2xlZXAgfSBmcm9tICcuL3NsZWVwLmpzJztcblxuLyoqXG4gKiBDb252ZXJ0IGFuIG9iamVjdCB0byBhbiBlcnJvci5cbiAqIEBwYXJhbSBvYmogVGhlIG9iamVjdCB0byBjb252ZXJ0LlxuICovXG5leHBvcnQgZnVuY3Rpb24gZXJyb3JpZnkob2JqOiB1bmtub3duKTogRXJyb3Ige1xuICBpZiAob2JqIGluc3RhbmNlb2YgRXJyb3IpIHJldHVybiBvYmo7XG4gIGlmICh0eXBlb2Ygb2JqID09PSAnc3RyaW5nJykgcmV0dXJuIG5ldyBFcnJvcihvYmopO1xuICB0cnkge1xuICAgIHJldHVybiBuZXcgRXJyb3IoSlNPTi5zdHJpbmdpZnkob2JqKSk7XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiBuZXcgRXJyb3IoU3RyaW5nKG9iaikpO1xuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpZ25vcmVFcnJvcjxUPihmbjogKCkgPT4gVCk6IFQgfCB1bmRlZmluZWQge1xuICB0cnkge1xuICAgIHJldHVybiBmbigpO1xuICB9IGNhdGNoIHtcbiAgICAvLyBkbyBub3RoaW5nXG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlnbm9yZUVub2VudDxUPihmbjogKCkgPT4gVCk6IFQgfCB1bmRlZmluZWQge1xuICB0cnkge1xuICAgIHJldHVybiBmbigpO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGlmICh0eXBlb2YgZXJyb3IgPT09ICdvYmplY3QnICYmIGVycm9yICYmICdjb2RlJyBpbiBlcnJvciAmJiBlcnJvci5jb2RlID09PSAnRU5PRU5UJykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aHJvdyBlcnJvcjtcbiAgfVxufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gaWdub3JlRXJyb3JBc3luYzxUPihmbjogKCkgPT4gUHJvbWlzZTxUPik6IFByb21pc2U8VCB8IHVuZGVmaW5lZD4ge1xuICB0cnkge1xuICAgIHJldHVybiBhd2FpdCBmbigpO1xuICB9IGNhdGNoIHtcbiAgICAvLyBkbyBub3RoaW5nXG4gIH1cbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGlnbm9yZUVub2VudEFzeW5jPFQ+KGZuOiAoKSA9PiBQcm9taXNlPFQ+KTogUHJvbWlzZTxUIHwgdW5kZWZpbmVkPiB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIGF3YWl0IGZuKCk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgaWYgKHR5cGVvZiBlcnJvciA9PT0gJ29iamVjdCcgJiYgZXJyb3IgJiYgJ2NvZGUnIGluIGVycm9yICYmIGVycm9yLmNvZGUgPT09ICdFTk9FTlQnKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRocm93IGVycm9yO1xuICB9XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUmV0cnlPcHRpb25zIHtcbiAgYmVmb3JlUmV0cnk/OiAoZXJyb3I6IHVua25vd24pID0+IFByb21pc2U8dm9pZD47XG4gIGhhbmRsZUVycm9yPzogKGVycm9yOiB1bmtub3duKSA9PiBQcm9taXNlPHZvaWQ+O1xuICAvKipcbiAgICogVGhlIG1heGltdW0gbnVtYmVyIG9mIHRvdGFsIGF0dGVtcHRzLCBpbmNsdWRpbmcgdGhlIGluaXRpYWwgYXR0ZW1wdC5cbiAgICogRm9yIGV4YW1wbGUsIGByZXRyeUNvdW50OiAzYCBydW5zIHRoZSBmdW5jdGlvbiBhdCBtb3N0IDMgdGltZXM6IDEgaW5pdGlhbCBhdHRlbXB0IGFuZCB1cCB0byAyIHJldHJpZXMuXG4gICAqL1xuICByZXRyeUNvdW50PzogbnVtYmVyO1xuICByZXRyeUxvZ2dlcj86IChtZXNzYWdlOiBzdHJpbmcpID0+IHZvaWQ7XG4gIHNob3VsZFJldHJ5PzogKGVycm9yOiB1bmtub3duKSA9PiBib29sZWFuO1xuICBzbGVlcE1pbGxpc2Vjb25kcz86IG51bWJlcjtcbiAgdXBkYXRlU2xlZXBNaWxsaXNlY29uZHM/OiAoc2xlZXBNaWxsaXNlY29uZHM6IG51bWJlcikgPT4gbnVtYmVyO1xufVxuXG4vKipcbiAqIFJldHJ5IHRoZSBnaXZlbiBmdW5jdGlvbi5cbiAqIEBwYXJhbSBmdW5jIFRoZSBmdW5jdGlvbiB0byByZXRyeS5cbiAqIEBwYXJhbSBiZWZvcmVSZXRyeSBUaGUgZnVuY3Rpb24gdG8gY2FsbCBpbW1lZGlhdGVseSBiZWZvcmUgcmV0cnlpbmcuXG4gKiBAcGFyYW0gaGFuZGxlRXJyb3IgVGhlIGZ1bmN0aW9uIHRvIGNhbGwgd2hlbiBhbiBlcnJvciBvY2N1cnMuXG4gKiBAcGFyYW0gcmV0cnlDb3VudCBUaGUgbWF4aW11bSBudW1iZXIgb2YgdG90YWwgYXR0ZW1wdHMsIGluY2x1ZGluZyB0aGUgaW5pdGlhbCBhdHRlbXB0LlxuICogQHBhcmFtIHJldHJ5TG9nZ2VyIFRoZSBmdW5jdGlvbiB0byBsb2cgcmV0cnlpbmcuXG4gKiBAcGFyYW0gc2xlZXBNaWxsaXNlY29uZHMgVGhlIG51bWJlciBvZiBtaWxsaXNlY29uZHMgdG8gc2xlZXAgYmVmb3JlIHJldHJ5aW5nLlxuICogQHBhcmFtIHVwZGF0ZVNsZWVwTWlsbGlzZWNvbmRzIFRoZSBmdW5jdGlvbiB0byB1cGRhdGUgc2xlZXAgbWlsbGlzZWNvbmRzIGFmdGVyIGVhY2ggcmV0cnkuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiB3aXRoUmV0cnk8VD4oXG4gIGZ1bmM6IChmYWlsZWRDb3VudDogbnVtYmVyKSA9PiBUIHwgUHJvbWlzZTxUPixcbiAge1xuICAgIGJlZm9yZVJldHJ5LFxuICAgIGhhbmRsZUVycm9yLFxuICAgIHJldHJ5Q291bnQgPSAzLFxuICAgIHJldHJ5TG9nZ2VyLFxuICAgIHNob3VsZFJldHJ5LFxuICAgIHNsZWVwTWlsbGlzZWNvbmRzID0gMCxcbiAgICB1cGRhdGVTbGVlcE1pbGxpc2Vjb25kcyxcbiAgfTogUmV0cnlPcHRpb25zID0ge31cbik6IFByb21pc2U8VD4ge1xuICBsZXQgZmFpbGVkQ291bnQgPSAwO1xuICBmb3IgKDs7KSB7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiBhd2FpdCBmdW5jKGZhaWxlZENvdW50KTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgYXdhaXQgaGFuZGxlRXJyb3I/LihlcnJvcik7XG4gICAgICBmYWlsZWRDb3VudCsrO1xuICAgICAgaWYgKGZhaWxlZENvdW50ID49IHJldHJ5Q291bnQpIHtcbiAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICB9XG4gICAgICBpZiAoc2hvdWxkUmV0cnkgJiYgIXNob3VsZFJldHJ5KGVycm9yKSkge1xuICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgIH1cbiAgICAgIGlmIChzbGVlcE1pbGxpc2Vjb25kcyA+IDApIHtcbiAgICAgICAgYXdhaXQgc2xlZXAoc2xlZXBNaWxsaXNlY29uZHMpO1xuICAgICAgfVxuICAgICAgaWYgKHVwZGF0ZVNsZWVwTWlsbGlzZWNvbmRzKSB7XG4gICAgICAgIHNsZWVwTWlsbGlzZWNvbmRzID0gdXBkYXRlU2xlZXBNaWxsaXNlY29uZHMoc2xlZXBNaWxsaXNlY29uZHMpO1xuICAgICAgfVxuICAgICAgcmV0cnlMb2dnZXI/LihgUmV0cnkgZHVlIHRvOiAke2Vycm9yfVxuJHtlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gJy0tLVxcbicgKyAoZXJyb3Iuc3RhY2sgPz8gJycpIDogJyd9YCk7XG4gICAgICBhd2FpdCBiZWZvcmVSZXRyeT8uKGVycm9yKTtcbiAgICB9XG4gIH1cbn1cbiIsIi8qKlxuICogW2pzLXNoYTNde0BsaW5rIGh0dHBzOi8vZ2l0aHViLmNvbS9lbW4xNzgvanMtc2hhM31cbiAqXG4gKiBAdmVyc2lvbiAwLjkuM1xuICogQGF1dGhvciBDaGVuLCBZaS1DeXVhbiBbZW1uMTc4QGdtYWlsLmNvbV1cbiAqIEBjb3B5cmlnaHQgQ2hlbiwgWWktQ3l1YW4gMjAxNS0yMDIzXG4gKiBAbGljZW5zZSBNSVRcbiAqL1xuY29uc3QgdD1bLi4uXCIwMTIzNDU2Nzg5YWJjZGVmXCJdLHM9WzYsMTUzNiwzOTMyMTYsMTAwNjYzMjk2XSxpPVswLDgsMTYsMjRdLGU9WzEsMCwzMjg5OCwwLDMyOTA2LDIxNDc0ODM2NDgsMjE0NzUxNjQxNiwyMTQ3NDgzNjQ4LDMyOTA3LDAsMjE0NzQ4MzY0OSwwLDIxNDc1MTY1NDUsMjE0NzQ4MzY0OCwzMjc3NywyMTQ3NDgzNjQ4LDEzOCwwLDEzNiwwLDIxNDc1MTY0MjUsMCwyMTQ3NDgzNjU4LDAsMjE0NzUxNjU1NSwwLDEzOSwyMTQ3NDgzNjQ4LDMyOTA1LDIxNDc0ODM2NDgsMzI3NzEsMjE0NzQ4MzY0OCwzMjc3MCwyMTQ3NDgzNjQ4LDEyOCwyMTQ3NDgzNjQ4LDMyNzc4LDAsMjE0NzQ4MzY1OCwyMTQ3NDgzNjQ4LDIxNDc1MTY1NDUsMjE0NzQ4MzY0OCwzMjg5NiwyMTQ3NDgzNjQ4LDIxNDc0ODM2NDksMCwyMTQ3NTE2NDI0LDIxNDc0ODM2NDhdO2Z1bmN0aW9uIG8odCl7cmV0dXJuIG5ldyBoKDUxMixzLDUxMikudXBkYXRlKHQpLmhleCgpfWNvbnN0IG49dD0+e2NvbnN0IHM9W107Zm9yKGNvbnN0W2ksZV1vZiB0LmVudHJpZXMoKSlzW2ldPWU7cmV0dXJuIHN9O2NsYXNzIGh7YmxvY2tzPVtdO3M9W107cmVzZXQ9ITA7ZmluYWxpemVkPSExO2Jsb2NrPTA7c3RhcnQ9MDtsYXN0Qnl0ZUluZGV4PTA7Y29uc3RydWN0b3IodCxzLGkpe3RoaXMucGFkZGluZz1zLHRoaXMub3V0cHV0Qml0cz1pLHRoaXMuYmxvY2tDb3VudD0xNjAwLSh0PDwxKT4+NSx0aGlzLmJ5dGVDb3VudD10aGlzLmJsb2NrQ291bnQ8PDIsdGhpcy5vdXRwdXRCbG9ja3M9aT4+NSx0aGlzLmV4dHJhQnl0ZXM9KDMxJmkpPj4zO2ZvcihsZXQgdD0wO3Q8NTA7Kyt0KXRoaXMuc1t0XT0wfXVwZGF0ZSh0KXtpZih0aGlzLmZpbmFsaXplZCl0aHJvdyBuZXcgRXJyb3IoXCJmaW5hbGl6ZSBhbHJlYWR5IGNhbGxlZFwiKTtjb25zdCBzPXRoaXMuYmxvY2tzLGU9dGhpcy5ieXRlQ291bnQsbz10Lmxlbmd0aCxuPXRoaXMuYmxvY2tDb3VudCxoPXRoaXMucztsZXQgbCxjLGY9MDtmb3IoO2Y8bzspe2lmKHRoaXMucmVzZXQpZm9yKHRoaXMucmVzZXQ9ITEsc1swXT10aGlzLmJsb2NrLGw9MTtsPG4rMTsrK2wpc1tsXT0wO2ZvcihsPXRoaXMuc3RhcnQ7ZjxvJiZsPGU7KytmKWM9dC5jb2RlUG9pbnRBdChmKXx8MCxjPDEyOD9zW2w+PjJdfD1jPDxpWzMmbCsrXTpjPDIwNDg/KHNbbD4+Ml18PSgxOTJ8Yz4+Nik8PGlbMyZsKytdLHNbbD4+Ml18PSgxMjh8NjMmYyk8PGlbMyZsKytdKTpjPDU1Mjk2fHxjPj01NzM0ND8oc1tsPj4yXXw9KDIyNHxjPj4xMik8PGlbMyZsKytdLHNbbD4+Ml18PSgxMjh8Yz4+NiY2Myk8PGlbMyZsKytdLHNbbD4+Ml18PSgxMjh8NjMmYyk8PGlbMyZsKytdKTooYz02NTUzNisoKDEwMjMmYyk8PDEwfDEwMjMmKHQuY29kZVBvaW50QXQoKytmKXx8MCkpLHNbbD4+Ml18PSgyNDB8Yz4+MTgpPDxpWzMmbCsrXSxzW2w+PjJdfD0oMTI4fGM+PjEyJjYzKTw8aVszJmwrK10sc1tsPj4yXXw9KDEyOHxjPj42JjYzKTw8aVszJmwrK10sc1tsPj4yXXw9KDEyOHw2MyZjKTw8aVszJmwrK10pO2lmKHRoaXMubGFzdEJ5dGVJbmRleD1sLGw+PWUpe2Zvcih0aGlzLnN0YXJ0PWwtZSx0aGlzLmJsb2NrPXNbbl0sbD0wO2w8bjsrK2wpaFtsXV49c1tsXTtyKGgpLHRoaXMucmVzZXQ9ITB9ZWxzZSB0aGlzLnN0YXJ0PWx9cmV0dXJuIHRoaXN9ZmluYWxpemUoKXtpZih0aGlzLmZpbmFsaXplZClyZXR1cm47dGhpcy5maW5hbGl6ZWQ9ITA7Y29uc3QgdD10aGlzLmJsb2NrcztsZXQgcz10aGlzLmxhc3RCeXRlSW5kZXg7Y29uc3QgaT10aGlzLmJsb2NrQ291bnQsZT10aGlzLnM7aWYodFtzPj4yXXw9dGhpcy5wYWRkaW5nWzMmc10sdGhpcy5sYXN0Qnl0ZUluZGV4PT09dGhpcy5ieXRlQ291bnQpZm9yKHRbMF09dFtpXSxzPTE7czxpKzE7KytzKXRbc109MDtmb3IodFtpLTFdfD0yMTQ3NDgzNjQ4LHM9MDtzPGk7KytzKWVbc11ePXRbc107cihlKX1oZXgoKXt0aGlzLmZpbmFsaXplKCk7Y29uc3Qgcz10aGlzLmJsb2NrQ291bnQ7bGV0IGk9dGhpcy5zO2NvbnN0IGU9dGhpcy5vdXRwdXRCbG9ja3Msbz10aGlzLmV4dHJhQnl0ZXM7bGV0IGgsbD0wLGM9MCxmPVwiXCI7Zm9yKDtjPGU7KXtmb3IobD0wO2w8cyYmYzxlOysrbCwrK2MpaD1pW2xdLGYrPXRbaD4+NCYxNV0rdFsxNSZoXSt0W2g+PjEyJjE1XSt0W2g+PjgmMTVdK3RbaD4+MjAmMTVdK3RbaD4+MTYmMTVdK3RbaD4+MjgmMTVdK3RbaD4+MjQmMTVdO2Mlcz09PTAmJihpPW4oaSkscihpKSxsPTApfXJldHVybiBvJiYoaD1pW2xdLGYrPXRbaD4+NCYxNV0rdFsxNSZoXSxvPjEmJihmKz10W2g+PjEyJjE1XSt0W2g+PjgmMTVdKSxvPjImJihmKz10W2g+PjIwJjE1XSt0W2g+PjE2JjE1XSkpLGZ9fWNvbnN0IHI9ZnVuY3Rpb24odCl7bGV0IHMsaSxvLG4saCxyLGwsYyxmLGEsdSxkLGIsayx5LHgsQixwLEMseixJLGcsdyxBLFAsRSxqLG0scSx2LEQsRixHLEgsSixLLEwsTSxOLE8sUSxSLFMsVCxVLFYsVyxYLFksWiwkLF8sdHQsc3QsaXQsZXQsb3QsbnQsaHQscnQsbHQsY3QsZnQ7Zm9yKG89MDtvPDQ4O28rPTIpbj10WzBdXnRbMTBdXnRbMjBdXnRbMzBdXnRbNDBdLGg9dFsxXV50WzExXV50WzIxXV50WzMxXV50WzQxXSxyPXRbMl1edFsxMl1edFsyMl1edFszMl1edFs0Ml0sbD10WzNdXnRbMTNdXnRbMjNdXnRbMzNdXnRbNDNdLGM9dFs0XV50WzE0XV50WzI0XV50WzM0XV50WzQ0XSxmPXRbNV1edFsxNV1edFsyNV1edFszNV1edFs0NV0sYT10WzZdXnRbMTZdXnRbMjZdXnRbMzZdXnRbNDZdLHU9dFs3XV50WzE3XV50WzI3XV50WzM3XV50WzQ3XSxkPXRbOF1edFsxOF1edFsyOF1edFszOF1edFs0OF0sYj10WzldXnRbMTldXnRbMjldXnRbMzldXnRbNDldLHM9ZF4ocjw8MXxsPj4+MzEpLGk9Yl4obDw8MXxyPj4+MzEpLHRbMF1ePXMsdFsxXV49aSx0WzEwXV49cyx0WzExXV49aSx0WzIwXV49cyx0WzIxXV49aSx0WzMwXV49cyx0WzMxXV49aSx0WzQwXV49cyx0WzQxXV49aSxzPW5eKGM8PDF8Zj4+PjMxKSxpPWheKGY8PDF8Yz4+PjMxKSx0WzJdXj1zLHRbM11ePWksdFsxMl1ePXMsdFsxM11ePWksdFsyMl1ePXMsdFsyM11ePWksdFszMl1ePXMsdFszM11ePWksdFs0Ml1ePXMsdFs0M11ePWkscz1yXihhPDwxfHU+Pj4zMSksaT1sXih1PDwxfGE+Pj4zMSksdFs0XV49cyx0WzVdXj1pLHRbMTRdXj1zLHRbMTVdXj1pLHRbMjRdXj1zLHRbMjVdXj1pLHRbMzRdXj1zLHRbMzVdXj1pLHRbNDRdXj1zLHRbNDVdXj1pLHM9Y14oZDw8MXxiPj4+MzEpLGk9Zl4oYjw8MXxkPj4+MzEpLHRbNl1ePXMsdFs3XV49aSx0WzE2XV49cyx0WzE3XV49aSx0WzI2XV49cyx0WzI3XV49aSx0WzM2XV49cyx0WzM3XV49aSx0WzQ2XV49cyx0WzQ3XV49aSxzPWFeKG48PDF8aD4+PjMxKSxpPXVeKGg8PDF8bj4+PjMxKSx0WzhdXj1zLHRbOV1ePWksdFsxOF1ePXMsdFsxOV1ePWksdFsyOF1ePXMsdFsyOV1ePWksdFszOF1ePXMsdFszOV1ePWksdFs0OF1ePXMsdFs0OV1ePWksaz10WzBdLHk9dFsxXSxWPXRbMTFdPDw0fHRbMTBdPj4+MjgsVz10WzEwXTw8NHx0WzExXT4+PjI4LG09dFsyMF08PDN8dFsyMV0+Pj4yOSxxPXRbMjFdPDwzfHRbMjBdPj4+MjkscnQ9dFszMV08PDl8dFszMF0+Pj4yMyxsdD10WzMwXTw8OXx0WzMxXT4+PjIzLFI9dFs0MF08PDE4fHRbNDFdPj4+MTQsUz10WzQxXTw8MTh8dFs0MF0+Pj4xNCxIPXRbMl08PDF8dFszXT4+PjMxLEo9dFszXTw8MXx0WzJdPj4+MzEseD10WzEzXTw8MTJ8dFsxMl0+Pj4yMCxCPXRbMTJdPDwxMnx0WzEzXT4+PjIwLFg9dFsyMl08PDEwfHRbMjNdPj4+MjIsWT10WzIzXTw8MTB8dFsyMl0+Pj4yMix2PXRbMzNdPDwxM3x0WzMyXT4+PjE5LEQ9dFszMl08PDEzfHRbMzNdPj4+MTksY3Q9dFs0Ml08PDJ8dFs0M10+Pj4zMCxmdD10WzQzXTw8Mnx0WzQyXT4+PjMwLHN0PXRbNV08PDMwfHRbNF0+Pj4yLGl0PXRbNF08PDMwfHRbNV0+Pj4yLEs9dFsxNF08PDZ8dFsxNV0+Pj4yNixMPXRbMTVdPDw2fHRbMTRdPj4+MjYscD10WzI1XTw8MTF8dFsyNF0+Pj4yMSxDPXRbMjRdPDwxMXx0WzI1XT4+PjIxLFo9dFszNF08PDE1fHRbMzVdPj4+MTcsJD10WzM1XTw8MTV8dFszNF0+Pj4xNyxGPXRbNDVdPDwyOXx0WzQ0XT4+PjMsRz10WzQ0XTw8Mjl8dFs0NV0+Pj4zLEE9dFs2XTw8Mjh8dFs3XT4+PjQsUD10WzddPDwyOHx0WzZdPj4+NCxldD10WzE3XTw8MjN8dFsxNl0+Pj45LG90PXRbMTZdPDwyM3x0WzE3XT4+PjksTT10WzI2XTw8MjV8dFsyN10+Pj43LE49dFsyN108PDI1fHRbMjZdPj4+Nyx6PXRbMzZdPDwyMXx0WzM3XT4+PjExLEk9dFszN108PDIxfHRbMzZdPj4+MTEsXz10WzQ3XTw8MjR8dFs0Nl0+Pj44LHR0PXRbNDZdPDwyNHx0WzQ3XT4+PjgsVD10WzhdPDwyN3x0WzldPj4+NSxVPXRbOV08PDI3fHRbOF0+Pj41LEU9dFsxOF08PDIwfHRbMTldPj4+MTIsaj10WzE5XTw8MjB8dFsxOF0+Pj4xMixudD10WzI5XTw8N3x0WzI4XT4+PjI1LGh0PXRbMjhdPDw3fHRbMjldPj4+MjUsTz10WzM4XTw8OHx0WzM5XT4+PjI0LFE9dFszOV08PDh8dFszOF0+Pj4yNCxnPXRbNDhdPDwxNHx0WzQ5XT4+PjE4LHc9dFs0OV08PDE0fHRbNDhdPj4+MTgsdFswXT1rXn54JnAsdFsxXT15Xn5CJkMsdFsxMF09QV5+RSZtLHRbMTFdPVBefmomcSx0WzIwXT1IXn5LJk0sdFsyMV09Sl5+TCZOLHRbMzBdPVReflYmWCx0WzMxXT1VXn5XJlksdFs0MF09c3RefmV0Jm50LHRbNDFdPWl0Xn5vdCZodCx0WzJdPXhefnAmeix0WzNdPUJefkMmSSx0WzEyXT1FXn5tJnYsdFsxM109al5+cSZELHRbMjJdPUtefk0mTyx0WzIzXT1MXn5OJlEsdFszMl09Vl5+WCZaLHRbMzNdPVdeflkmJCx0WzQyXT1ldF5+bnQmcnQsdFs0M109b3Refmh0Jmx0LHRbNF09cF5+eiZnLHRbNV09Q15+SSZ3LHRbMTRdPW1efnYmRix0WzE1XT1xXn5EJkcsdFsyNF09TV5+TyZSLHRbMjVdPU5eflEmUyx0WzM0XT1YXn5aJl8sdFszNV09WV5+JCZ0dCx0WzQ0XT1udF5+cnQmY3QsdFs0NV09aHRefmx0JmZ0LHRbNl09el5+ZyZrLHRbN109SV5+dyZ5LHRbMTZdPXZefkYmQSx0WzE3XT1EXn5HJlAsdFsyNl09T15+UiZILHRbMjddPVFeflMmSix0WzM2XT1aXn5fJlQsdFszN109JF5+dHQmVSx0WzQ2XT1ydF5+Y3Qmc3QsdFs0N109bHRefmZ0Jml0LHRbOF09Z15+ayZ4LHRbOV09d15+eSZCLHRbMThdPUZefkEmRSx0WzE5XT1HXn5QJmosdFsyOF09Ul5+SCZLLHRbMjldPVNefkomTCx0WzM4XT1fXn5UJlYsdFszOV09dHReflUmVyx0WzQ4XT1jdF5+c3QmZXQsdFs0OV09ZnRefml0Jm90LHRbMF1ePWVbb10sdFsxXV49ZVtvKzFdfTtleHBvcnR7byBhcyBzaGEzXzUxMn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1oYXNoLmpzLm1hcFxuIiwiY29uc3QgZT1cIlwiLHQ9ZnVuY3Rpb24oKXtjb25zdCBlPXtpbnN0YW5jZTpFcnJvcixmcm9tOmU9Pntjb25zdCB0PVtlLm5hbWUsZS5tZXNzYWdlXTtyZXR1cm4gdm9pZCAwIT09ZS5zdGFjayYmdC5wdXNoKGUuc3RhY2spLHZvaWQgMCE9PWUuY2F1c2UmJih2b2lkIDA9PT1lLnN0YWNrJiZ0LnB1c2godm9pZCAwKSx0LnB1c2goZS5jYXVzZSkpLHR9LHN0dWI6KCk9Pm5ldyBFcnJvcixoeWRyYXRlOihlLFt0LG4sYSxzXSk9PntlLm5hbWU9dCxlLm1lc3NhZ2U9bix2b2lkIDA9PT1hP2RlbGV0ZSBlLnN0YWNrOmUuc3RhY2s9YSx2b2lkIDAhPT1zJiYoZS5jYXVzZT1zKX19LHQ9e2luc3RhbmNlOlVpbnQ4QXJyYXksZnJvbTplPT5bYnRvYShhLmRlY29kZShlKSldLGNyZWF0ZTooW2VdKT0+bi5lbmNvZGUoYXRvYihlKSl9LHM9e2luc3RhbmNlOk1hcCxmcm9tOmU9PlsuLi5lLmVudHJpZXMoKV0sc3R1YjooKT0+bmV3IE1hcCxoeWRyYXRlOihlLHQpPT57Zm9yKGNvbnN0W24sYV1vZiB0KWUuc2V0KG4sYSl9fSxvPXtpbnN0YW5jZTpTZXQsZnJvbTplPT5bLi4uZS52YWx1ZXMoKV0sc3R1YjooKT0+bmV3IFNldCxoeWRyYXRlOihlLHQpPT57Zm9yKGNvbnN0IG4gb2YgdCllLmFkZChuKX19LHI9e2luc3RhbmNlOkRhdGUsZnJvbTplPT5bZS50b0pTT04oKV0sY3JlYXRlOihbZV0pPT5uZXcgRGF0ZShlKX0sYz17aW5zdGFuY2U6UmVnRXhwLGZyb206KHtmbGFnczplLHNvdXJjZTp0fSk9PmU/W3QsZV06W3RdLGNyZWF0ZTooW2UsdF0pPT5uZXcgUmVnRXhwKGUsdCl9LGQ9e2luc3RhbmNlOlVSTCxmcm9tOmU9PltlLmhyZWZdLGNyZWF0ZTooW2VdKT0+bmV3IFVSTChlKX07cmV0dXJuIG5ldyBNYXAoW2UsdCxzLG8scixjLGRdLm1hcChlPT5bZS5pbnN0YW5jZS5uYW1lLGVdKSl9KCksbj1uZXcgVGV4dEVuY29kZXIsYT1uZXcgVGV4dERlY29kZXIoXCJ1dGYtOFwiKTtleHBvcnR7dCBhcyBHTE9CQUxfQ09OU1RSVUNUT1JfTUFQLGUgYXMgUExBSU5fT0JKRUNUX0xBQkVMfTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWNvbnN0cnVjdG9ycy5qcy5tYXBcbiIsImltcG9ydHtHTE9CQUxfQ09OU1RSVUNUT1JfTUFQIGFzIHQsUExBSU5fT0JKRUNUX0xBQkVMIGFzIG59ZnJvbVwiLi9jb25zdHJ1Y3RvcnMuanNcIjtjb25zdCBlPS0xLHI9LTIsbz0tMyxpPS00LHM9LTUsYz0tNjtmdW5jdGlvbiBmKG4sZT10KXtyZXR1cm4gSlNPTi5zdHJpbmdpZnkoYShuLGUpKX1mdW5jdGlvbiB1KHQpe2lmKHZvaWQgMD09PXQpcmV0dXJuLTE7aWYoXCJudW1iZXJcIj09dHlwZW9mIHQpe2lmKE51bWJlci5pc05hTih0KSlyZXR1cm4tMztpZighTnVtYmVyLmlzRmluaXRlKHQpKXJldHVybiB0PDA/LTU6LTR9cmV0dXJuIG51bGx9Y29uc3QgbD1bXTtmdW5jdGlvbiBhKGUscj10KXtjb25zdCBvPXUoZSk7aWYobnVsbCE9PW8pcmV0dXJuIG87Y29uc3QgaT1bXSxzPW5ldyBNYXA7cmV0dXJuIGZ1bmN0aW9uIHQoZSl7Y29uc3Qgbz11KGUpO2lmKG51bGwhPT1vKXJldHVybiBvO2xldCBjPXMuZ2V0KGUpO2lmKHZvaWQgMCE9PWMpcmV0dXJuIGM7c3dpdGNoKGM9aS5sZW5ndGgsdHlwZW9mIGUpe2Nhc2VcIm51bWJlclwiOmNhc2VcInN0cmluZ1wiOmNhc2VcImJvb2xlYW5cIjppW2NdPWUscy5zZXQoZSxjKTticmVhaztjYXNlXCJiaWdpbnRcIjppW2NdPVstNixlLnRvU3RyaW5nKDE2KV0scy5zZXQoZSxjKTticmVhaztjYXNlXCJvYmplY3RcIjppZihudWxsPT09ZSlpW2NdPWUscy5zZXQoZSxjKTtlbHNlIGlmKEFycmF5LmlzQXJyYXkoZSkpe2NvbnN0IG49ZnVuY3Rpb24odCl7aWYobC5sZW5ndGg8dCl7Y29uc3Qgbj1sLmxlbmd0aDtsLmxlbmd0aD10LGwuZmlsbCgtMixuLHQpfXJldHVybiBsLnNsaWNlKDAsdCl9KGUubGVuZ3RoKTtpW2NdPW4scy5zZXQoZSxjKTtmb3IoY29uc3RbcixvXW9mIGUuZW50cmllcygpKW5bcl09dChvKX1lbHNle2NvbnN0W28sZl09ZnVuY3Rpb24odCxlKXtjb25zdCByPXQuY29uc3RydWN0b3I7aWYoXCJmdW5jdGlvblwiPT10eXBlb2Ygcil7Y29uc3Qgbj1yLm5hbWUsbz1lLmdldChuKTtpZih2b2lkIDAhPT1vKXJldHVybltuLG8uZnJvbSh0KV19Y29uc3Qgbz1PYmplY3QuZW50cmllcyh0KSxpPW8ubGVuZ3RoLHM9QXJyYXkuZnJvbSh7bGVuZ3RoOmkraX0pO2ZvcihsZXQgdD0wO3Q8aTt0Kyspe2NvbnN0IG49b1t0XSxlPXQrdDtzW2VdPW5bMF0sc1tlKzFdPW5bMV19cmV0dXJuW24sc119KGUsciksdT1mLmxlbmd0aCxsPUFycmF5LmZyb20oe2xlbmd0aDp1KzF9KTtsWzBdPW8saVtjXT1sLHMuc2V0KGUsYyk7Zm9yKGxldCBuPTA7bjx1O24rKylsW24rMV09dChmW25dKX19cmV0dXJuIGN9KGUpLGl9ZXhwb3J0e3IgYXMgQVJSQVlfSE9MRV9JTkRFWCxjIGFzIEJJR19JTlRfTEFCRUwsbyBhcyBOQU5fSU5ERVgscyBhcyBORUdfSU5GX0lOREVYLGkgYXMgUE9TX0lORl9JTkRFWCxlIGFzIFVOREVGSU5FRF9JTkRFWCxhIGFzIGxpc3RpZnksZiBhcyBzdHJpbmdpZnl9O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9c3RyaW5naWZ5LmpzLm1hcFxuIiwiaW1wb3J0e3NoYTNfNTEyIGFzIHJ9ZnJvbVwiLi9oYXNoLmpzXCI7aW1wb3J0e3N0cmluZ2lmeSBhcyBufWZyb21cIi4vb3Nvbi9zdHJpbmdpZnkuanNcIjtmdW5jdGlvbiBvKG8sdCl7cmV0dXJuIHIobihbbyx0XSkpfWZ1bmN0aW9uIHQocixvKXtyZXR1cm4gbihbcixvXSl9ZnVuY3Rpb24gaSgpe3JldHVyblwiXCJ9ZXhwb3J0e2kgYXMgZ2V0Q2FjaGVLZXlPZkVtcHR5U3RyaW5nLG8gYXMgZ2V0Q2FjaGVLZXlPZkhhc2gsdCBhcyBnZXRDYWNoZUtleU9mU3RyaW5naWZpZWR9O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Z2V0Q2FjaGVLZXkuanMubWFwXG4iLCJpbXBvcnR7Z2V0Q2FjaGVLZXlPZkhhc2ggYXMgdCxnZXRDYWNoZUtleU9mRW1wdHlTdHJpbmcgYXMgZX1mcm9tXCIuL2dldENhY2hlS2V5LmpzXCI7Y29uc3Qgbj1yKHtnZXRDYWNoZUtleTp0fSksYz1yKHtnZXRDYWNoZUtleTplfSk7ZnVuY3Rpb24gcih7Y2FjaGVEdXJhdGlvbjplPU51bWJlci5QT1NJVElWRV9JTkZJTklUWSxnZXRDYWNoZUtleTpuPXR9PXt9KXtyZXR1cm4gZnVuY3Rpb24odCxjKXtsZXQgcixvLGk7cmV0dXJuXCJnZXR0ZXJcIj09PWM/LmtpbmQ/ZnVuY3Rpb24oKXtjb25zdCBjPW4odGhpcyxbXSksYT1EYXRlLm5vdygpO3JldHVybihpIT09Y3x8YS1vPmUpJiYoaT1jLHI9dC5jYWxsKHRoaXMpLG89YSkscn06ZnVuY3Rpb24oLi4uYSl7Y29uc3QgdT1uKHRoaXMsYSksaD1EYXRlLm5vdygpO3JldHVybihpIT09dXx8aC1vPmUpJiYoaT11LHI9Yz90LmNhbGwodGhpcywuLi5hKTp0KC4uLmEpLG89aCkscn19fWV4cG9ydHtuIGFzIG1lbW9pemVPbmUsciBhcyBtZW1vaXplT25lRmFjdG9yeSxjIGFzIG1lbW9pemVPbmVXaXRoRW1wdHlIYXNofTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPW1lbW9pemVPbmUuanMubWFwXG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG4vKipcbiAqIFByZXBlbmQgZXZlcnkgZXhpc3RpbmcgYG5vZGVfbW9kdWxlcy8uYmluYCBkaXJlY3RvcnkgZnJvbSB0aGUgZ2l2ZW4gZGlyZWN0b3J5IHVwIHRvIHRoZVxuICogcmVwb3NpdG9yeSByb290IChvciBmaWxlc3lzdGVtIHJvb3QpIHRvIHRoZSBlbnZpcm9ubWVudCdzIFBBVEgsIG5lYXJlc3QgZGlyZWN0b3J5IGZpcnN0IHNvXG4gKiBhIHdvcmtzcGFjZS1sb2NhbCBkZXBlbmRlbmN5IHdpbnMgb3ZlciBhIHJlcG9zaXRvcnktcm9vdCBvbmUuIE5lZWRlZCB3aGVyZXZlciB3YiBzdHJpcHNcbiAqIHlhcm4ncyB0ZW1wb3JhcnkgYmluIGZvbGRlciBmcm9tIFBBVEggKHlhcm4gQmVycnkgZXhwb3NlcyBkZXBlbmRlbmN5IGV4ZWN1dGFibGVzIG9ubHlcbiAqIHRocm91Z2ggdGhhdCBmb2xkZXIsIG5ldmVyIHRocm91Z2ggYG5vZGVfbW9kdWxlcy8uYmluYCBvbiBQQVRIKSwgc28gdGhhdCBiYXJlIGJpbmFyeSBuYW1lc1xuICogaW4gd3JhcHBlZCBjb21tYW5kcyBrZWVwIHJlc29sdmluZy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHByZXBlbmROb2RlTW9kdWxlc0JpblRvUGF0aChkaXJQYXRoOiBzdHJpbmcsIGVudjogUmVjb3JkPHN0cmluZywgc3RyaW5nIHwgdW5kZWZpbmVkPik6IGJvb2xlYW4ge1xuICBjb25zdCBiaW5QYXRoczogc3RyaW5nW10gPSBbXTtcbiAgbGV0IGN1cnJlbnRQYXRoID0gcGF0aC5yZXNvbHZlKGRpclBhdGgpO1xuICBmb3IgKDs7KSB7XG4gICAgY29uc3QgYmluUGF0aCA9IHBhdGguam9pbihjdXJyZW50UGF0aCwgJ25vZGVfbW9kdWxlcycsICcuYmluJyk7XG4gICAgaWYgKGZzLmV4aXN0c1N5bmMoYmluUGF0aCkpIHtcbiAgICAgIGJpblBhdGhzLnB1c2goYmluUGF0aCk7XG4gICAgfVxuXG4gICAgaWYgKGZzLmV4aXN0c1N5bmMocGF0aC5qb2luKGN1cnJlbnRQYXRoLCAnLmdpdCcpKSkge1xuICAgICAgYnJlYWs7XG4gICAgfVxuICAgIGNvbnN0IHBhcmVudFBhdGggPSBwYXRoLmRpcm5hbWUoY3VycmVudFBhdGgpO1xuICAgIGlmIChjdXJyZW50UGF0aCA9PT0gcGFyZW50UGF0aCkge1xuICAgICAgYnJlYWs7XG4gICAgfVxuICAgIGN1cnJlbnRQYXRoID0gcGFyZW50UGF0aDtcbiAgfVxuICBpZiAoYmluUGF0aHMubGVuZ3RoID09PSAwKSByZXR1cm4gZmFsc2U7XG4gIGVudi5QQVRIID0gZW52LlBBVEggPyBgJHtiaW5QYXRocy5qb2luKCc6Jyl9OiR7ZW52LlBBVEh9YCA6IGJpblBhdGhzLmpvaW4oJzonKTtcbiAgcmV0dXJuIHRydWU7XG59XG4iLCJleHBvcnQgZnVuY3Rpb24gaXNDSShjaUVudjogc3RyaW5nIHwgdW5kZWZpbmVkKTogYm9vbGVhbiB7XG4gIHJldHVybiAhIWNpRW52ICYmIGNpRW52ICE9PSAnMCcgJiYgY2lFbnYgIT09ICdmYWxzZSc7XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgdHlwZSB7IEVudlJlYWRlck9wdGlvbnMgfSBmcm9tICdAd2lsbGJvb3N0ZXIvc2hhcmVkLWxpYi1ub2RlL3NyYyc7XG5pbXBvcnQgeyByZWFkRW52aXJvbm1lbnRWYXJpYWJsZXMsIHNob3VsZFN1cHByZXNzRW52aXJvbm1lbnRPdXRwdXQgfSBmcm9tICdAd2lsbGJvb3N0ZXIvc2hhcmVkLWxpYi1ub2RlL3NyYyc7XG5pbXBvcnQgeyBtZW1vaXplT25lIH0gZnJvbSAnYXQtZGVjb3JhdG9ycyc7XG5pbXBvcnQgY2hhbGsgZnJvbSAnY2hhbGsnO1xuaW1wb3J0IHsgZ2xvYmJ5IH0gZnJvbSAnZ2xvYmJ5JztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUpzb24gfSBmcm9tICd0eXBlLWZlc3QnO1xuXG5pbXBvcnQgeyBwcmVwZW5kTm9kZU1vZHVsZXNCaW5Ub1BhdGggfSBmcm9tICcuL3V0aWxzL2JpblBhdGguanMnO1xuaW1wb3J0IHsgaXNDSSB9IGZyb20gJy4vdXRpbHMvY2kuanMnO1xuXG5leHBvcnQgdHlwZSBEYXRhYmFzZU9ybSA9ICdwcmlzbWEnIHwgJ2RyaXp6bGUnO1xuXG5leHBvcnQgY29uc3QgRklMRV9TQ0hFTUEgPSAnZmlsZTonO1xuXG5leHBvcnQgY2xhc3MgUHJvamVjdCB7XG4gIHByaXZhdGUgcmVhZG9ubHkgYXJndjogRW52UmVhZGVyT3B0aW9ucztcbiAgcHJpdmF0ZSByZWFkb25seSBsb2FkRW52OiBib29sZWFuO1xuICBwcml2YXRlIHJlYWRvbmx5IHBhdGhCeU5hbWUgPSBuZXcgTWFwPHN0cmluZywgc3RyaW5nPigpO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgX2RpclBhdGg6IHN0cmluZztcblxuICBjb25zdHJ1Y3RvcihkaXJQYXRoOiBzdHJpbmcsIGFyZ3Y6IEVudlJlYWRlck9wdGlvbnMsIGxvYWRFbnY6IGJvb2xlYW4pIHtcbiAgICB0aGlzLl9kaXJQYXRoID0gcGF0aC5yZXNvbHZlKGRpclBhdGgpO1xuICAgIHRoaXMuYXJndiA9IGFyZ3Y7XG4gICAgdGhpcy5sb2FkRW52ID0gbG9hZEVudjtcbiAgfVxuXG4gIEBtZW1vaXplT25lXG4gIGdldCBpc0J1bkF2YWlsYWJsZSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy51c2VzQnVuUGFja2FnZU1hbmFnZXI7XG4gIH1cblxuICAvLyBUaGUgcGFja2FnZSBtYW5hZ2VyIG11c3QgZm9sbG93IHRoZSB0YXJnZXQgcHJvamVjdCwgbm90IHRoZSBydW50aW1lIHRoYXQgbGF1bmNoZWQgd2I6XG4gIC8vIGBub2RlIHdiIC4uLmAgYWdhaW5zdCBhIEJ1biByZXBvIG11c3Qgc3RpbGwgcnVuIGBidW4gaW5zdGFsbGAsIGFuZCB2aWNlIHZlcnNhLlxuICBnZXQgcGFja2FnZU1hbmFnZXJDb21tYW5kKCk6ICdidW4nIHwgJ3lhcm4nIHtcbiAgICByZXR1cm4gdGhpcy5pc0J1bkF2YWlsYWJsZSA/ICdidW4nIDogJ3lhcm4nO1xuICB9XG5cbiAgZ2V0IHBhY2thZ2VNYW5hZ2VyUnVuQ29tbWFuZCgpOiAnYnVuIHJ1bicgfCAneWFybicge1xuICAgIHJldHVybiB0aGlzLmlzQnVuQXZhaWxhYmxlID8gJ2J1biBydW4nIDogJ3lhcm4nO1xuICB9XG5cbiAgLy8gQSBzaW5nbGUgc2lnbmFsIGRlY2lkZXMgZXZlcnkgYnVuLXZzLXlhcm4gYnJhbmNoIGluIHdiIChzY3JpcHQgbm9ybWFsaXphdGlvbiBpbmNsdWRlZCk6XG4gIC8vIHNwbGl0dGluZyB0aGUgdG9vbC1tYW5pZmVzdCBzaWduYWwgZnJvbSB0aGUgbG9ja2ZpbGUgc2lnbmFsIG9uY2UgcHJvZHVjZWQgY29tbWFuZHMgbWl4aW5nXG4gIC8vIGBidW4gaW5zdGFsbGAgd2l0aCBgeWFybiBwcmlzbWEgLi4uYCBpbiBtaXNlLXBpbm5lZCByZXBvcyB3aG9zZSBidW4ubG9jayBpcyBnaXRpZ25vcmVkLlxuICBAbWVtb2l6ZU9uZVxuICBnZXQgdXNlc0J1blBhY2thZ2VNYW5hZ2VyKCk6IGJvb2xlYW4ge1xuICAgIGlmICh0aGlzLmhhc0J1blRvb2xWZXJzaW9uKCkpIHJldHVybiB0cnVlO1xuICAgIGlmICh0aGlzLmhhc0J1bkxvY2tmaWxlKCkpIHJldHVybiB0cnVlO1xuICAgIHJldHVybiB0aGlzLmhhc0J1blBhY2thZ2VNYW5hZ2VyKCk7XG4gIH1cblxuICBwcml2YXRlIGhhc0J1blRvb2xWZXJzaW9uKCk6IGJvb2xlYW4ge1xuICAgIC8vIHdiZnkgbWlncmF0ZXMgLnRvb2wtdmVyc2lvbnMgaW50byBtaXNlLnRvbWwsIHNvIGEgbWlzZS1waW5uZWQgYnVuIG11c3QgY291bnQgYXMgd2VsbDpcbiAgICAvLyByZXBvcyB0aGF0IGdpdGlnbm9yZSBidW4ubG9jayBhbmQgaGF2ZSBubyBwYWNrYWdlTWFuYWdlciBmaWVsZCByZWx5IG9uIHRoZSB0b29sIG1hbmlmZXN0LlxuICAgIGlmICh0ZXN0RmlsZUNvbnRlbnQocGF0aC5qb2luKHRoaXMucm9vdERpclBhdGgsICcudG9vbC12ZXJzaW9ucycpLCAvKF58XFxuKWJ1blxccy8pKSByZXR1cm4gdHJ1ZTtcbiAgICByZXR1cm4gWydtaXNlLnRvbWwnLCAnLm1pc2UudG9tbCddLnNvbWUoKGZpbGVOYW1lKSA9PlxuICAgICAgdGVzdEZpbGVDb250ZW50KHBhdGguam9pbih0aGlzLnJvb3REaXJQYXRoLCBmaWxlTmFtZSksIC9eXFxzKig/OlwiYnVuXCJ8YnVuKVxccyo9L20pXG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgaGFzQnVuTG9ja2ZpbGUoKTogYm9vbGVhbiB7XG4gICAgLy8gU29tZSByZXBvc2l0b3JpZXMgcmVseSBvbiB0aGUgbG9ja2ZpbGUgb3IgcGFja2FnZU1hbmFnZXIgZmllbGQgaW5zdGVhZCBvZiBtaXNlLlxuICAgIC8vIERvY2tlciBvcHRpbWl6YXRpb24gbXVzdCBmb2xsb3cgdGhlIHRhcmdldCBwcm9qZWN0LCBub3QgdGhlIHJ1bnRpbWUgdGhhdCBsYXVuY2hlZCB3Yi5cbiAgICByZXR1cm4gWydidW4ubG9jaycsICdidW4ubG9ja2InXS5zb21lKChmaWxlTmFtZSkgPT4gZnMuZXhpc3RzU3luYyhwYXRoLmpvaW4odGhpcy5yb290RGlyUGF0aCwgZmlsZU5hbWUpKSk7XG4gIH1cblxuICBwcml2YXRlIGhhc0J1blBhY2thZ2VNYW5hZ2VyKCk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IHBhY2thZ2VNYW5hZ2VyID0gdGhpcy5yb290UGFja2FnZUpzb24/LnBhY2thZ2VNYW5hZ2VyID8/IHRoaXMucGFja2FnZUpzb24ucGFja2FnZU1hbmFnZXI7XG4gICAgcmV0dXJuIHR5cGVvZiBwYWNrYWdlTWFuYWdlciA9PT0gJ3N0cmluZycgJiYgcGFja2FnZU1hbmFnZXIuc3RhcnRzV2l0aCgnYnVuQCcpO1xuICB9XG5cbiAgQG1lbW9pemVPbmVcbiAgZ2V0IGJ1aWxkQ29tbWFuZCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLnBhY2thZ2VKc29uLnNjcmlwdHM/LmJ1aWxkPy5pbmNsdWRlcygnYnVpbGRJZk5lZWRlZCcpXG4gICAgICA/ICdZQVJOIHJ1biBidWlsZCdcbiAgICAgIDogdGhpcy5wYWNrYWdlSnNvbi5zY3JpcHRzPy5idWlsZFxuICAgICAgICA/IGBZQVJOIHdiIGJ1aWxkSWZOZWVkZWQgJHt0aGlzLmFyZ3YudmVyYm9zZSA/ICctLXZlcmJvc2UnIDogJyd9YFxuICAgICAgICA6IFwiZWNobyAnTm8gYnVpbGQgc2NyaXB0J1wiO1xuICB9XG5cbiAgZ2V0IGRpclBhdGgoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5fZGlyUGF0aDtcbiAgfVxuXG4gIEBtZW1vaXplT25lXG4gIGdldCByb290RGlyUGF0aCgpOiBzdHJpbmcge1xuICAgIHJldHVybiBmcy5leGlzdHNTeW5jKHBhdGguam9pbih0aGlzLmRpclBhdGgsICcuLicsICcuLicsICdwYWNrYWdlLmpzb24nKSlcbiAgICAgID8gcGF0aC5yZXNvbHZlKHRoaXMuZGlyUGF0aCwgJy4uJywgJy4uJylcbiAgICAgIDogdGhpcy5kaXJQYXRoO1xuICB9XG5cbiAgQG1lbW9pemVPbmVcbiAgZ2V0IGRvY2tlcmZpbGUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gZnMucmVhZEZpbGVTeW5jKHRoaXMuZmluZEZpbGUoJ0RvY2tlcmZpbGUnKSwgJ3V0ZjgnKTtcbiAgfVxuXG4gIEBtZW1vaXplT25lXG4gIGdldCBoYXNEb2NrZXJmaWxlKCk6IGJvb2xlYW4ge1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gISF0aGlzLmZpbmRGaWxlKCdEb2NrZXJmaWxlJyk7XG4gICAgfSBjYXRjaCB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgQG1lbW9pemVPbmVcbiAgZ2V0IGhhc1NvdXJjZUNvZGUoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIGZzLmV4aXN0c1N5bmMocGF0aC5qb2luKHRoaXMuZGlyUGF0aCwgJ3NyYycpKTtcbiAgfVxuXG4gIEBtZW1vaXplT25lXG4gIGdldCBuYW1lKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMucGFja2FnZUpzb24ubmFtZSB8fCAndW5rbm93bic7XG4gIH1cblxuICBAbWVtb2l6ZU9uZVxuICBnZXQgZG9ja2VySW1hZ2VOYW1lKCk6IHN0cmluZyB7XG4gICAgY29uc3QgbmFtZSA9IHRoaXMucGFja2FnZUpzb24ubmFtZSB8fCAndW5rbm93bic7XG4gICAgcmV0dXJuIG5hbWUucmVwbGFjZUFsbCgnQCcsICcnKS5yZXBsYWNlQWxsKCcvJywgJy0nKTtcbiAgfVxuXG4gIC8vIENhY2hlZCBpbiBhIHBsYWluIGZpZWxkIHJhdGhlciB0aGFuIHdpdGggQG1lbW9pemVPbmU6IHRoYXQgZGVjb3JhdG9yIGtleXMgaXRzIGNhY2hlIG9uIGEgaGFzaFxuICAvLyBvZiB0aGUgaW5zdGFuY2UsIHdoaWNoIGNoYW5nZXMgYXMgb3RoZXIgbWVtb2l6ZWQgZ2V0dGVycyBwb3B1bGF0ZSB0aGUgaW5zdGFuY2UsIHNvIGBlbnZgIGNvdWxkXG4gIC8vIHNpbGVudGx5IGJlIHJlY29tcHV0ZWQg4oCUIGRyb3BwaW5nIGluLXBsYWNlIG11dGF0aW9ucyAoZS5nLiBgcHJvamVjdC5lbnYuUE9SVCB8fD0g4oCmYCwgb3IgdGhlXG4gIC8vIHNlY3JldHMgYHdiIGRlcGxveWAgbWVyZ2VzIGZyb20gLmVudi5jbG91ZGZsYXJlKSB0aGF0IGNhbGxlcnMgcmVseSBvbiBmb3Igc3Bhd25lZCBjb21tYW5kcy5cbiAgcHJpdmF0ZSBlbnZDYWNoZTogUmVjb3JkPHN0cmluZywgc3RyaW5nIHwgdW5kZWZpbmVkPiB8IHVuZGVmaW5lZDtcblxuICBnZXQgZW52KCk6IFJlY29yZDxzdHJpbmcsIHN0cmluZyB8IHVuZGVmaW5lZD4ge1xuICAgIGlmICh0aGlzLmVudkNhY2hlKSByZXR1cm4gdGhpcy5lbnZDYWNoZTtcbiAgICBpZiAoIXRoaXMubG9hZEVudikge1xuICAgICAgdGhpcy5lbnZDYWNoZSA9IHByb2Nlc3MuZW52O1xuICAgICAgcmV0dXJuIHRoaXMuZW52Q2FjaGU7XG4gICAgfVxuXG4gICAgY29uc3QgW2VudlZhcnMsIGVudlBhdGhBbmRMb2FkZWRFbnZWYXJOYW1lUGFpcnNdID0gcmVhZEVudmlyb25tZW50VmFyaWFibGVzKHRoaXMuYXJndiwgdGhpcy5kaXJQYXRoKTtcbiAgICBpZiAoIXNob3VsZFN1cHByZXNzRW52aXJvbm1lbnRPdXRwdXQodGhpcy5hcmd2KSkge1xuICAgICAgZm9yIChjb25zdCBbZW52UGF0aCwgbmFtZXNdIG9mIGVudlBhdGhBbmRMb2FkZWRFbnZWYXJOYW1lUGFpcnMpIHtcbiAgICAgICAgY29uc29sZS5pbmZvKGBMb2FkZWQgJHtuYW1lcy5sZW5ndGh9IGVudmlyb25tZW50IHZhcmlhYmxlcyBmcm9tICR7ZW52UGF0aH1gKTtcbiAgICAgIH1cbiAgICB9XG4gICAgLy8gU3ByZWFkaW5nIGVudlZhcnMgbGFzdCBpcyBzYWZlIGZvciBleHBvcnRlZC12YXJpYWJsZSBwcmVjZWRlbmNlOiByZWFkRW52aXJvbm1lbnRWYXJpYWJsZXNcbiAgICAvLyBhbHJlYWR5IGV4Y2x1ZGVzIGtleXMgcHJlc2VudCBpbiBwcm9jZXNzLmVudiBmcm9tIC5lbnYvZm5veCBzb3VyY2VzIChyZXR1cm5pbmcgYSBrZXkgdGhhdFxuICAgIC8vIGV4aXN0cyBpbiBwcm9jZXNzLmVudiBvbmx5IGZvciBkZWxpYmVyYXRlIGZvcmNlZC1tb2RlIG92ZXJyaWRlcykuIE1pc2UgdmFsdWVzIHRoYXRcbiAgICAvLyBkaWZmZXIgZnJvbSB0aGUgYW1iaWVudCBhY3RpdmF0aW9uIGFyZSBkZWxpYmVyYXRlbHkga2VwdCBzbyB0aGUgcmVxdWVzdGVkIGNhc2NhZGUgcHJvZmlsZVxuICAgIC8vIChlLmcuIGAtLWNhc2NhZGUtZW52PXRlc3RgKSB3aW5zIG92ZXIgYSBzdGFsZSBgbWlzZSBhY3RpdmF0ZWAgZW52aXJvbm1lbnQuXG4gICAgdGhpcy5lbnZDYWNoZSA9IHsgLi4ucHJvY2Vzcy5lbnYsIC4uLmVudlZhcnMgfTtcbiAgICAvLyBgbWlzZSBlbnZgIGlzIGV4Y2x1ZGVkOiBpdCByZXBvcnRzIHRvb2wtYWN0aXZhdGlvbiBvdXRwdXQgKGUuZy4gUEFUSCkgZXZlbiBpbiByZXBvcyB0aGF0XG4gICAgLy8gZGVjbGFyZSBubyBlbnZpcm9ubWVudCB2YXJpYWJsZXMgYXQgYWxsLCB3aGljaCBtdXN0IG5vdCBmb3JjZSB0aGUgV0JfRU5WIHJlcXVpcmVtZW50LlxuICAgIHRoaXMudmFsaWRhdGVSZXF1aXJlZEVudmlyb25tZW50VmFyaWFibGVzKFxuICAgICAgZW52UGF0aEFuZExvYWRlZEVudlZhck5hbWVQYWlycy5zb21lKChbc291cmNlXSkgPT4gIXNvdXJjZS5zdGFydHNXaXRoKCdtaXNlIGVudicpKVxuICAgICk7XG4gICAgcmV0dXJuIHRoaXMuZW52Q2FjaGU7XG4gIH1cblxuICAvKipcbiAgICogRmFpbCBmYXN0IHdoZW4gdGhlIHJlc29sdmVkIGVudmlyb25tZW50IHZpb2xhdGVzIHRoZSBvcmcgc3RhbmRhcmQ6IGV2ZXJ5IG1vZGVcbiAgICogKGRldmVsb3BtZW50L3Rlc3Qvc3RhZ2luZy9wcm9kdWN0aW9uKSBtdXN0IGRlZmluZSBgV0JfRU5WYCwgYW5kIE5leHQuanMvdmluZXh0IGFwcHMgbXVzdCBhbHNvXG4gICAqIGRlZmluZSBgTkVYVF9QVUJMSUNfV0JfRU5WYCAoc2VlIHRoZSBndWlkZWxpbmVzLWZvci1taXNlLWZub3ggc2tpbGwpLiBTa2lwcGVkIHdoaWxlIG5vIGVudlxuICAgKiBzb3VyY2VzIGV4aXN0IHlldCAoZS5nLiBkdXJpbmcgYHdiIHNldHVwYCBib290c3RyYXAgYmVmb3JlIGVudiBmaWxlcy9mbm94LnRvbWwgYXJlIGNyZWF0ZWQpXG4gICAqIGFuZCB3aGVuIGBXQl9TS0lQX0VOVl9DSEVDSz0xYCBpcyBzZXQuXG4gICAqL1xuICBwcml2YXRlIHZhbGlkYXRlUmVxdWlyZWRFbnZpcm9ubWVudFZhcmlhYmxlcyhoYXNFbnZpcm9ubWVudFNvdXJjZXM6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICBjb25zdCBlbnYgPSB0aGlzLmVudkNhY2hlO1xuICAgIGlmICghZW52IHx8ICFoYXNFbnZpcm9ubWVudFNvdXJjZXMpIHJldHVybjtcbiAgICBpZiAoZW52LldCX1NLSVBfRU5WX0NIRUNLID09PSAnMScgfHwgZW52LldCX1NLSVBfRU5WX0NIRUNLID09PSAndHJ1ZScpIHJldHVybjtcblxuICAgIGNvbnN0IG1pc3NpbmdLZXlzOiBzdHJpbmdbXSA9IFtdO1xuICAgIGlmICghZW52LldCX0VOVikgbWlzc2luZ0tleXMucHVzaCgnV0JfRU5WJyk7XG4gICAgaWYgKHRoaXMucmVxdWlyZXNOZXh0UHVibGljV2JFbnYgJiYgIWVudi5ORVhUX1BVQkxJQ19XQl9FTlYpIG1pc3NpbmdLZXlzLnB1c2goJ05FWFRfUFVCTElDX1dCX0VOVicpO1xuICAgIGlmIChtaXNzaW5nS2V5cy5sZW5ndGggPT09IDApIHJldHVybjtcblxuICAgIC8vIFJlc29sdmUgdGhlIG1vZGUgbGFiZWwgZnJvbSB0aGUgbG9hZGVkIGVudmlyb25tZW50IChub3QgcHJvY2Vzcy5lbnYpOiBhIFdCX0VOVi9OT0RFX0VOVlxuICAgIC8vIHN1cHBsaWVkIG9ubHkgYnkgZW52IGZpbGVzIG9yIGZub3ggbXVzdCBzdGlsbCBuYW1lIHRoZSBjb3JyZWN0IG1vZGUgaW4gdGhlIGVycm9yIG1lc3NhZ2UuXG4gICAgY29uc3QgbW9kZSA9XG4gICAgICB0aGlzLmFyZ3YuY2FzY2FkZUVudiA/P1xuICAgICAgKHRoaXMuYXJndi5jYXNjYWRlTm9kZUVudiA/IGVudi5OT0RFX0VOViB8fCAnZGV2ZWxvcG1lbnQnIDogKGVudi5XQl9FTlYgPz8gZW52Lk5PREVfRU5WID8/ICdkZXZlbG9wbWVudCcpKTtcbiAgICBjb25zb2xlLmVycm9yKFxuICAgICAgY2hhbGsucmVkKFxuICAgICAgICBgJHttaXNzaW5nS2V5cy5qb2luKCcgYW5kICcpfSAke21pc3NpbmdLZXlzLmxlbmd0aCA9PT0gMSA/ICdpcycgOiAnYXJlJ30gbm90IGRlZmluZWQgZm9yIHRoZSBcIiR7bW9kZX1cIiBlbnZpcm9ubWVudC4gYCArXG4gICAgICAgICAgYERlZmluZSAke21pc3NpbmdLZXlzLmpvaW4oJyBhbmQgJyl9IGluIHRoZSBtb2RlJ3MgZW52IHNvdXJjZSAoZS5nLiAuZW52LiR7bW9kZX0gb3IgdGhlIGZub3ggXCIke21vZGV9XCIgcHJvZmlsZTsgc2VlIGd1aWRlbGluZXMtZm9yLW1pc2UtZm5veCksIGAgK1xuICAgICAgICAgICdvciBzZXQgV0JfU0tJUF9FTlZfQ0hFQ0s9MSB0byBza2lwIHRoaXMgY2hlY2suJ1xuICAgICAgKVxuICAgICk7XG4gICAgcHJvY2Vzcy5leGl0KDEpO1xuICB9XG5cbiAgQG1lbW9pemVPbmVcbiAgcHJpdmF0ZSBnZXQgcmVxdWlyZXNOZXh0UHVibGljV2JFbnYoKTogYm9vbGVhbiB7XG4gICAgLy8gT1dOIGRlcGVuZGVuY2llcyBvbmx5OiBhIHJvb3QtbGV2ZWwgbmV4dC92aW5leHQgZGV2RGVwZW5kZW5jeSBpbiBhIG1peGVkIG1vbm9yZXBvIG11c3Qgbm90XG4gICAgLy8gZm9yY2UgTkVYVF9QVUJMSUNfV0JfRU5WIG9udG8gZXZlcnkgbm9uLU5leHQgd29ya3NwYWNlIHBhY2thZ2UuXG4gICAgcmV0dXJuICEhdGhpcy5nZXRPd25EZXBlbmRlbmN5VmVyc2lvbignbmV4dCcpIHx8ICEhdGhpcy5nZXRPd25EZXBlbmRlbmN5VmVyc2lvbigndmluZXh0Jyk7XG4gIH1cblxuICBAbWVtb2l6ZU9uZVxuICBnZXQgcGFja2FnZUpzb24oKTogUGFja2FnZUpzb24ge1xuICAgIHJldHVybiBKU09OLnBhcnNlKGZzLnJlYWRGaWxlU3luYyh0aGlzLnBhY2thZ2VKc29uUGF0aCwgJ3V0ZjgnKSkgYXMgUGFja2FnZUpzb247XG4gIH1cblxuICBAbWVtb2l6ZU9uZVxuICBnZXQgcGFja2FnZUpzb25QYXRoKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHBhdGguam9pbih0aGlzLmRpclBhdGgsICdwYWNrYWdlLmpzb24nKTtcbiAgfVxuXG4gIEBtZW1vaXplT25lXG4gIGdldCBoYXNQcmlzbWEoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuICEhdGhpcy5nZXRPd25EZXBlbmRlbmN5VmVyc2lvbigncHJpc21hJyk7XG4gIH1cblxuICBAbWVtb2l6ZU9uZVxuICBnZXQgaGFzRHJpenpsZSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gISF0aGlzLmdldE93bkRlcGVuZGVuY3lWZXJzaW9uKCdkcml6emxlLW9ybScpO1xuICB9XG5cbiAgQG1lbW9pemVPbmVcbiAgZ2V0IGRhdGFiYXNlT3JtKCk6IERhdGFiYXNlT3JtIHwgdW5kZWZpbmVkIHtcbiAgICBpZiAodGhpcy5oYXNQcmlzbWEpIHJldHVybiAncHJpc21hJztcbiAgICBpZiAodGhpcy5oYXNEcml6emxlKSByZXR1cm4gJ2RyaXp6bGUnO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIEBtZW1vaXplT25lXG4gIGdldCBoYXNWaXRlc3QoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuICEhKHRoaXMucGFja2FnZUpzb24uZGVwZW5kZW5jaWVzPy52aXRlc3QgPz8gdGhpcy5wYWNrYWdlSnNvbi5kZXZEZXBlbmRlbmNpZXM/LnZpdGVzdCk7XG4gIH1cblxuICBAbWVtb2l6ZU9uZVxuICBnZXQgaGFzT3hsaW50KCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmhhc0RlcGVuZGVuY3koJ294bGludCcpO1xuICB9XG5cbiAgQG1lbW9pemVPbmVcbiAgZ2V0IGhhc1R5cGVBd2FyZU94bGludCgpOiBib29sZWFuIHtcbiAgICAvLyBPeGxpbnQncyB0eXBlLWF3YXJlIG1vZGUgcmVxdWlyZXMgdGhlIG94bGludC10c2dvbGludCBiaW5hcnkuXG4gICAgcmV0dXJuIHRoaXMuaGFzT3hsaW50ICYmIHRoaXMuaGFzRGVwZW5kZW5jeSgnb3hsaW50LXRzZ29saW50Jyk7XG4gIH1cblxuICBAbWVtb2l6ZU9uZVxuICBnZXQgaGFzT3hmbXQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuaGFzRGVwZW5kZW5jeSgnb3hmbXQnKTtcbiAgfVxuXG4gIEBtZW1vaXplT25lXG4gIGdldCBoYXNQcmV0dGllcigpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5oYXNEZXBlbmRlbmN5KCdwcmV0dGllcicpO1xuICB9XG5cbiAgQG1lbW9pemVPbmVcbiAgZ2V0IGhhc1BvZXRyeUxvY2soKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIChcbiAgICAgIGZzLmV4aXN0c1N5bmMocGF0aC5qb2luKHRoaXMuZGlyUGF0aCwgJ3BvZXRyeS5sb2NrJykpIHx8IGZzLmV4aXN0c1N5bmMocGF0aC5qb2luKHRoaXMucm9vdERpclBhdGgsICdwb2V0cnkubG9jaycpKVxuICAgICk7XG4gIH1cblxuICBAbWVtb2l6ZU9uZVxuICBnZXQgaGFzUHVic3BlY1lhbWwoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIChcbiAgICAgIGZzLmV4aXN0c1N5bmMocGF0aC5qb2luKHRoaXMuZGlyUGF0aCwgJ3B1YnNwZWMueWFtbCcpKSB8fFxuICAgICAgZnMuZXhpc3RzU3luYyhwYXRoLmpvaW4odGhpcy5yb290RGlyUGF0aCwgJ3B1YnNwZWMueWFtbCcpKVxuICAgICk7XG4gIH1cblxuICBAbWVtb2l6ZU9uZVxuICBnZXQgaGFzQ2FyZ29Ub21sKCk6IGJvb2xlYW4ge1xuICAgIC8vIE9ubHkgdGhlIHByb2plY3QncyBvd24gZGlyZWN0b3J5IGlzIGNoZWNrZWQgYmVjYXVzZSBgY2FyZ28gZm10IC0tYWxsYFxuICAgIC8vIGNvdmVycyB0aGUgd2hvbGUgd29ya3NwYWNlOyBtYXRjaGluZyB0aGUgcm9vdCBkaXJlY3RvcnkgdG9vIHdvdWxkIG1ha2VcbiAgICAvLyBldmVyeSBkZXNjZW5kYW50IHByb2plY3QgcnVuIHRoZSBzYW1lIHdvcmtzcGFjZS13aWRlIGNvbW1hbmQgaW5cbiAgICAvLyBwYXJhbGxlbC5cbiAgICByZXR1cm4gZnMuZXhpc3RzU3luYyhwYXRoLmpvaW4odGhpcy5kaXJQYXRoLCAnQ2FyZ28udG9tbCcpKTtcbiAgfVxuXG4gIEBtZW1vaXplT25lXG4gIGdldCBwcmVmZXJyZWRMaW50ZXIoKTogJ294bGludCcgfCB1bmRlZmluZWQge1xuICAgIGlmICh0aGlzLmhhc094bGludCkgcmV0dXJuICdveGxpbnQnO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGhhc093bkRlcGVuZGVuY3kocGFja2FnZU5hbWU6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAhIXRoaXMuZ2V0T3duRGVwZW5kZW5jeVZlcnNpb24ocGFja2FnZU5hbWUpO1xuICB9XG5cbiAgQG1lbW9pemVPbmVcbiAgZ2V0IGhhc1BsYXl3cmlnaHRDb25maWcoKTogYm9vbGVhbiB7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiAhIXRoaXMuZmluZEZpbGUoJ3BsYXl3cmlnaHQuY29uZmlnLnRzJyk7XG4gICAgfSBjYXRjaCB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgQG1lbW9pemVPbmVcbiAgZ2V0IHNraXBMYXVuY2hpbmdTZXJ2ZXJGb3JQbGF5d3JpZ2h0KCk6IGJvb2xlYW4ge1xuICAgIGlmIChpc0NJKHRoaXMuZW52LkNJKSkgcmV0dXJuIGZhbHNlO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBjb25maWdQYXRoID0gdGhpcy5maW5kRmlsZSgncGxheXdyaWdodC5jb25maWcudHMnKTtcbiAgICAgIHJldHVybiAvXFxid2ViU2VydmVyXFxiLy50ZXN0KGZzLnJlYWRGaWxlU3luYyhjb25maWdQYXRoLCAndXRmOCcpKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cblxuICBAbWVtb2l6ZU9uZVxuICBnZXQgZG9ja2VyUGFja2FnZUpzb24oKTogUGFja2FnZUpzb24ge1xuICAgIHJldHVybiBwYXRoLmRpcm5hbWUodGhpcy5maW5kRmlsZSgnRG9ja2VyZmlsZScpKSA9PT0gdGhpcy5kaXJQYXRoXG4gICAgICA/IHRoaXMucGFja2FnZUpzb25cbiAgICAgIDogKEpTT04ucGFyc2UoXG4gICAgICAgICAgZnMucmVhZEZpbGVTeW5jKHBhdGguam9pbihwYXRoLmRpcm5hbWUodGhpcy5maW5kRmlsZSgnRG9ja2VyZmlsZScpKSwgJ3BhY2thZ2UuanNvbicpLCAndXRmOCcpXG4gICAgICAgICkgYXMgUGFja2FnZUpzb24pO1xuICB9XG5cbiAgQG1lbW9pemVPbmVcbiAgZ2V0IGJpbkV4aXN0cygpOiBib29sZWFuIHtcbiAgICByZXR1cm4gcHJlcGVuZE5vZGVNb2R1bGVzQmluVG9QYXRoKHRoaXMuZGlyUGF0aCwgdGhpcy5lbnYpO1xuICB9XG5cbiAgZmluZEZpbGUoZmlsZU5hbWU6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgbGV0IGZpbGVQYXRoID0gdGhpcy5wYXRoQnlOYW1lLmdldChmaWxlTmFtZSk7XG4gICAgaWYgKGZpbGVQYXRoKSByZXR1cm4gZmlsZVBhdGg7XG5cbiAgICBmaWxlUGF0aCA9IFtmaWxlTmFtZSwgcGF0aC5qb2luKCcuLicsICcuLicsIGZpbGVOYW1lKV1cbiAgICAgIC5tYXAoKHApID0+IHBhdGgucmVzb2x2ZSh0aGlzLmRpclBhdGgsIHApKVxuICAgICAgLmZpbmQoKHApID0+IGZzLmV4aXN0c1N5bmMocCkpO1xuICAgIGlmICghZmlsZVBhdGgpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgRmlsZSBub3QgZm91bmQ6ICR7ZmlsZU5hbWV9YCk7XG4gICAgfVxuICAgIHRoaXMucGF0aEJ5TmFtZS5zZXQoZmlsZU5hbWUsIGZpbGVQYXRoKTtcbiAgICByZXR1cm4gZmlsZVBhdGg7XG4gIH1cblxuICBwcml2YXRlIGhhc0RlcGVuZGVuY3kocGFja2FnZU5hbWU6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAhIShcbiAgICAgIHRoaXMuZ2V0T3duRGVwZW5kZW5jeVZlcnNpb24ocGFja2FnZU5hbWUpID8/IHRoaXMuZ2V0RGVwZW5kZW5jeVZlcnNpb24odGhpcy5yb290UGFja2FnZUpzb24sIHBhY2thZ2VOYW1lKVxuICAgICk7XG4gIH1cblxuICBwcml2YXRlIGdldE93bkRlcGVuZGVuY3lWZXJzaW9uKHBhY2thZ2VOYW1lOiBzdHJpbmcpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLmdldERlcGVuZGVuY3lWZXJzaW9uKHRoaXMucGFja2FnZUpzb24sIHBhY2thZ2VOYW1lKTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0RGVwZW5kZW5jeVZlcnNpb24ocGFja2FnZUpzb246IFBhY2thZ2VKc29uIHwgdW5kZWZpbmVkLCBwYWNrYWdlTmFtZTogc3RyaW5nKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICBpZiAoIXBhY2thZ2VKc29uKSByZXR1cm47XG5cbiAgICByZXR1cm4gKFxuICAgICAgcGFja2FnZUpzb24uZGVwZW5kZW5jaWVzPy5bcGFja2FnZU5hbWVdID8/XG4gICAgICBwYWNrYWdlSnNvbi5kZXZEZXBlbmRlbmNpZXM/LltwYWNrYWdlTmFtZV0gPz9cbiAgICAgIHBhY2thZ2VKc29uLm9wdGlvbmFsRGVwZW5kZW5jaWVzPy5bcGFja2FnZU5hbWVdID8/XG4gICAgICBwYWNrYWdlSnNvbi5wZWVyRGVwZW5kZW5jaWVzPy5bcGFja2FnZU5hbWVdXG4gICAgKTtcbiAgfVxuXG4gIEBtZW1vaXplT25lXG4gIHByaXZhdGUgZ2V0IHJvb3RQYWNrYWdlSnNvbigpOiBQYWNrYWdlSnNvbiB8IHVuZGVmaW5lZCB7XG4gICAgaWYgKHRoaXMucm9vdERpclBhdGggPT09IHRoaXMuZGlyUGF0aCkgcmV0dXJuIHRoaXMucGFja2FnZUpzb247XG5cbiAgICB0cnkge1xuICAgICAgcmV0dXJuIEpTT04ucGFyc2UoZnMucmVhZEZpbGVTeW5jKHBhdGguam9pbih0aGlzLnJvb3REaXJQYXRoLCAncGFja2FnZS5qc29uJyksICd1dGY4JykpIGFzIFBhY2thZ2VKc29uO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBjb25zb2xlLmVycm9yKGBbd2JdIEZhaWxlZCB0byByZWFkIG9yIHBhcnNlICR7cGF0aC5qb2luKHRoaXMucm9vdERpclBhdGgsICdwYWNrYWdlLmpzb24nKX1gLCBlcnJvcik7XG4gICAgICByZXR1cm47XG4gICAgfVxuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRGaWxlRGF0YWJhc2VVcmxQYXRoKHByb2plY3Q6IFBpY2s8UHJvamVjdCwgJ2Vudic+KTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgZGJVcmwgPSBwcm9qZWN0LmVudi5EQVRBQkFTRV9VUkw7XG4gIGlmICghZGJVcmw/LnN0YXJ0c1dpdGgoRklMRV9TQ0hFTUEpKSByZXR1cm47XG5cbiAgY29uc3QgcmF3UGF0aCA9IGRiVXJsLnNsaWNlKEZJTEVfU0NIRU1BLmxlbmd0aCkucmVwbGFjZSgvWz8jXS4qJC8sICcnKTtcbiAgY29uc3Qgbm9ybWFsaXplZFBhdGggPSByYXdQYXRoLnN0YXJ0c1dpdGgoJy8vJykgPyByYXdQYXRoLnNsaWNlKDIpIDogcmF3UGF0aDtcbiAgcmV0dXJuIG5vcm1hbGl6ZWRQYXRoIHx8IHVuZGVmaW5lZDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldEFic29sdXRlRmlsZURhdGFiYXNlVXJsUGF0aChcbiAgcHJvamVjdDogUGljazxQcm9qZWN0LCAnZW52Jz4gJiBQYXJ0aWFsPFBpY2s8UHJvamVjdCwgJ2RpclBhdGgnIHwgJ3Jvb3REaXJQYXRoJz4+XG4pOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBjb25zdCBkYlBhdGggPSBnZXRGaWxlRGF0YWJhc2VVcmxQYXRoKHByb2plY3QpO1xuICBpZiAoIWRiUGF0aCkgcmV0dXJuO1xuXG4gIGlmIChwYXRoLmlzQWJzb2x1dGUoZGJQYXRoKSkgcmV0dXJuIGRiUGF0aDtcblxuICBjb25zdCBiYXNlRGlyUGF0aCA9IHByb2plY3Qucm9vdERpclBhdGggPz8gcHJvamVjdC5kaXJQYXRoO1xuICByZXR1cm4gYmFzZURpclBhdGggPyBwYXRoLnJlc29sdmUoYmFzZURpclBhdGgsIGRiUGF0aCkgOiB1bmRlZmluZWQ7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgRm91bmRQcm9qZWN0cyB7XG4gIHJvb3Q6IFByb2plY3Q7XG4gIHNlbGY6IFByb2plY3Q7XG4gIGRlc2NlbmRhbnRzOiBQcm9qZWN0W107XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBmaW5kU2VsZlByb2plY3QoYXJndjogRW52UmVhZGVyT3B0aW9ucywgbG9hZEVudiA9IHRydWUsIGRpclBhdGg/OiBzdHJpbmcpOiBQcm9qZWN0IHwgdW5kZWZpbmVkIHtcbiAgZGlyUGF0aCA/Pz0gcHJvY2Vzcy5jd2QoKTtcbiAgaWYgKCFmcy5leGlzdHNTeW5jKHBhdGguam9pbihkaXJQYXRoLCAncGFja2FnZS5qc29uJykpKSByZXR1cm47XG5cbiAgcmV0dXJuIG5ldyBQcm9qZWN0KGRpclBhdGgsIGFyZ3YsIGxvYWRFbnYpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNQcm9qZWN0RW52aXJvbm1lbnQocHJvamVjdDogUHJvamVjdCwgbmFtZTogc3RyaW5nKTogYm9vbGVhbiB7XG4gIHJldHVybiBwcm9qZWN0LmVudi5XQl9FTlYgPT09IG5hbWUgfHwgcHJvamVjdC5lbnYuTUlTRV9FTlYgPT09IG5hbWU7XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBmaW5kRGVzY2VuZGFudFByb2plY3RzKFxuICBhcmd2OiBFbnZSZWFkZXJPcHRpb25zLFxuICBsb2FkRW52ID0gdHJ1ZSxcbiAgZGlyUGF0aD86IHN0cmluZ1xuKTogUHJvbWlzZTxGb3VuZFByb2plY3RzIHwgdW5kZWZpbmVkPiB7XG4gIGNvbnN0IHJvb3RBbmRTZWxmUHJvamVjdHMgPSBmaW5kUm9vdEFuZFNlbGZQcm9qZWN0cyhhcmd2LCBsb2FkRW52LCBkaXJQYXRoKTtcbiAgaWYgKCFyb290QW5kU2VsZlByb2plY3RzKSByZXR1cm47XG5cbiAgcmV0dXJuIHtcbiAgICAuLi5yb290QW5kU2VsZlByb2plY3RzLFxuICAgIGRlc2NlbmRhbnRzOlxuICAgICAgcm9vdEFuZFNlbGZQcm9qZWN0cy5yb290ID09PSByb290QW5kU2VsZlByb2plY3RzLnNlbGZcbiAgICAgICAgPyBhd2FpdCBnZXRBbGxEZXNjZW5kYW50UHJvamVjdHMoYXJndiwgcm9vdEFuZFNlbGZQcm9qZWN0cy5yb290LCBsb2FkRW52KVxuICAgICAgICA6IFtyb290QW5kU2VsZlByb2plY3RzLnNlbGZdLFxuICB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZmluZFJvb3RBbmRTZWxmUHJvamVjdHMoXG4gIGFyZ3Y6IEVudlJlYWRlck9wdGlvbnMsXG4gIGxvYWRFbnYgPSB0cnVlLFxuICBkaXJQYXRoPzogc3RyaW5nXG4pOiBPbWl0PEZvdW5kUHJvamVjdHMsICdkZXNjZW5kYW50cyc+IHwgdW5kZWZpbmVkIHtcbiAgZGlyUGF0aCA/Pz0gcHJvY2Vzcy5jd2QoKTtcbiAgaWYgKCFmcy5leGlzdHNTeW5jKHBhdGguam9pbihkaXJQYXRoLCAncGFja2FnZS5qc29uJykpKSByZXR1cm47XG5cbiAgY29uc3QgdGhpc1Byb2plY3QgPSBuZXcgUHJvamVjdChkaXJQYXRoLCBhcmd2LCBsb2FkRW52KTtcbiAgbGV0IHJvb3RQcm9qZWN0ID0gdGhpc1Byb2plY3Q7XG4gIGlmICghdGhpc1Byb2plY3QucGFja2FnZUpzb24ud29ya3NwYWNlcyAmJiBwYXRoLmRpcm5hbWUoZGlyUGF0aCkuZW5kc1dpdGgoJy9wYWNrYWdlcycpKSB7XG4gICAgY29uc3Qgcm9vdERpclBhdGggPSBwYXRoLnJlc29sdmUoZGlyUGF0aCwgJy4uJywgJy4uJyk7XG4gICAgaWYgKGZzLmV4aXN0c1N5bmMocGF0aC5qb2luKHJvb3REaXJQYXRoLCAncGFja2FnZS5qc29uJykpKSB7XG4gICAgICByb290UHJvamVjdCA9IG5ldyBQcm9qZWN0KHJvb3REaXJQYXRoLCBhcmd2LCBsb2FkRW52KTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHsgcm9vdDogcm9vdFByb2plY3QsIHNlbGY6IHRoaXNQcm9qZWN0IH07XG59XG5cbmZ1bmN0aW9uIHRlc3RGaWxlQ29udGVudChmaWxlUGF0aDogc3RyaW5nLCBwYXR0ZXJuOiBSZWdFeHApOiBib29sZWFuIHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gcGF0dGVybi50ZXN0KGZzLnJlYWRGaWxlU3luYyhmaWxlUGF0aCwgJ3V0ZjgnKSk7XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxufVxuXG5hc3luYyBmdW5jdGlvbiBnZXRBbGxEZXNjZW5kYW50UHJvamVjdHMoXG4gIGFyZ3Y6IEVudlJlYWRlck9wdGlvbnMsXG4gIHJvb3RQcm9qZWN0OiBQcm9qZWN0LFxuICBsb2FkRW52OiBib29sZWFuXG4pOiBQcm9taXNlPFByb2plY3RbXT4ge1xuICBjb25zdCBwcm9qZWN0cyA9IFtyb290UHJvamVjdF07XG5cbiAgY29uc3Qgd29ya3NwYWNlID0gcm9vdFByb2plY3QucGFja2FnZUpzb24ud29ya3NwYWNlcztcbiAgaWYgKCFBcnJheS5pc0FycmF5KHdvcmtzcGFjZSkpIHJldHVybiBwcm9qZWN0cztcblxuICBjb25zdCBnbG9iUGF0dGVybjogc3RyaW5nW10gPSBbXTtcbiAgY29uc3QgcGFja2FnZURpcnM6IHN0cmluZ1tdID0gW107XG4gIGZvciAoY29uc3Qgd29ya3NwYWNlUGF0aCBvZiB3b3Jrc3BhY2UubWFwKCh3czogc3RyaW5nKSA9PiBwYXRoLmpvaW4ocm9vdFByb2plY3QuZGlyUGF0aCwgd3MpKSkge1xuICAgIGlmIChmcy5leGlzdHNTeW5jKHdvcmtzcGFjZVBhdGgpKSB7XG4gICAgICBwYWNrYWdlRGlycy5wdXNoKHdvcmtzcGFjZVBhdGgpO1xuICAgIH0gZWxzZSB7XG4gICAgICBnbG9iUGF0dGVybi5wdXNoKHdvcmtzcGFjZVBhdGgpO1xuICAgIH1cbiAgfVxuICBwYWNrYWdlRGlycy5wdXNoKC4uLihhd2FpdCBnbG9iYnkoZ2xvYlBhdHRlcm4sIHsgZG90OiB0cnVlLCBvbmx5RGlyZWN0b3JpZXM6IHRydWUgfSkpKTtcbiAgZm9yIChjb25zdCBzdWJQYWNrYWdlRGlyUGF0aCBvZiBwYWNrYWdlRGlycykge1xuICAgIGlmICghZnMuZXhpc3RzU3luYyhwYXRoLmpvaW4oc3ViUGFja2FnZURpclBhdGgsICdwYWNrYWdlLmpzb24nKSkpIGNvbnRpbnVlO1xuXG4gICAgcHJvamVjdHMucHVzaChuZXcgUHJvamVjdChzdWJQYWNrYWdlRGlyUGF0aCwgYXJndiwgbG9hZEVudikpO1xuICB9XG4gIHJldHVybiBwcm9qZWN0cztcbn1cbiIsImltcG9ydCBjaGlsZF9wcm9jZXNzIGZyb20gJ25vZGU6Y2hpbGRfcHJvY2Vzcyc7XG5pbXBvcnQgdHlwZSB7IEJpbmFyeUxpa2UsIEhhc2ggfSBmcm9tICdub2RlOmNyeXB0byc7XG5pbXBvcnQgeyBjcmVhdGVIYXNoIH0gZnJvbSAnbm9kZTpjcnlwdG8nO1xuaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHsgaWdub3JlRW5vZW50QXN5bmMgfSBmcm9tICdAd2lsbGJvb3N0ZXIvc2hhcmVkLWxpYi9zcmMnO1xuaW1wb3J0IGNoYWxrIGZyb20gJ2NoYWxrJztcbmltcG9ydCB0eXBlIHsgQXJndW1lbnRzQ2FtZWxDYXNlLCBDb21tYW5kTW9kdWxlLCBJbmZlcnJlZE9wdGlvblR5cGVzIH0gZnJvbSAneWFyZ3MnO1xuXG5pbXBvcnQgdHlwZSB7IFByb2plY3QgfSBmcm9tICcuLi9wcm9qZWN0LmpzJztcbmltcG9ydCB7IGZpbmRTZWxmUHJvamVjdCB9IGZyb20gJy4uL3Byb2plY3QuanMnO1xuaW1wb3J0IHR5cGUgeyBzaGFyZWRPcHRpb25zQnVpbGRlciB9IGZyb20gJy4uL3NoYXJlZE9wdGlvbnNCdWlsZGVyLmpzJztcblxuY29uc3QgYnVpbGRlciA9IHtcbiAgY29tbWFuZDoge1xuICAgIGRlc2NyaXB0aW9uOiAnQSBidWlsZCBjb21tYW5kIChkZWZhdWx0OiB5YXJufGJ1biBidWlsZCknLFxuICAgIHR5cGU6ICdzdHJpbmcnLFxuICAgIGFsaWFzOiAnYycsXG4gIH0sXG4gIG91dHB1dDoge1xuICAgIGRlc2NyaXB0aW9uOlxuICAgICAgJ0J1aWxkIG91dHB1dCBwYXRocyAocmVsYXRpdmUgdG8gdGhlIHByb2plY3QgZGlyZWN0b3J5KSB0aGF0IG11c3QgZXhpc3QgZm9yIHRoZSBjYWNoZSB0byBiZSB2YWxpZCAoZGVmYXVsdDogYXV0by1kZXRlY3RlZCBjb21tb24gb3V0cHV0IGRpcmVjdG9yaWVzKScsXG4gICAgdHlwZTogJ2FycmF5JyxcbiAgICBhbGlhczogJ28nLFxuICB9LFxufSBhcyBjb25zdDtcblxuZXhwb3J0IGNvbnN0IGJ1aWxkSWZOZWVkZWRDb21tYW5kOiBDb21tYW5kTW9kdWxlPHVua25vd24sIEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIGJ1aWxkZXI+PiA9IHtcbiAgY29tbWFuZDogJ2J1aWxkSWZOZWVkZWQnLFxuICBkZXNjcmliZTogJ0J1aWxkIGNvZGUgaWYgY2hhbmdlcyBhcmUgZGV0ZWN0ZWQnLFxuICBidWlsZGVyLFxuICBhc3luYyBoYW5kbGVyKGFyZ3YpIHtcbiAgICBhd2FpdCBidWlsZElmTmVlZGVkKGFyZ3YpO1xuICB9LFxufTtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGJ1aWxkSWZOZWVkZWQoXG4gIC8vIFRlc3QgY29kZSByZXF1aXJlcyBQYXJ0aWFsPC4uLj5cbiAgYXJndjogUGFydGlhbDxBcmd1bWVudHNDYW1lbENhc2U8SW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgYnVpbGRlciAmIHR5cGVvZiBzaGFyZWRPcHRpb25zQnVpbGRlcj4+PixcbiAgcHJvamVjdFBhdGhGb3JUZXN0aW5nPzogc3RyaW5nXG4pOiBQcm9taXNlPGJvb2xlYW4gfCB1bmRlZmluZWQ+IHtcbiAgY29uc3QgcHJvamVjdCA9IGZpbmRTZWxmUHJvamVjdChhcmd2LCB0cnVlLCBwcm9qZWN0UGF0aEZvclRlc3RpbmcpO1xuICBpZiAoIXByb2plY3QpIHtcbiAgICBjb25zb2xlLmVycm9yKGNoYWxrLnJlZCgnTm8gcHJvamVjdCBmb3VuZC4nKSk7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBjb25zdCBidWlsZENvbW1hbmQgPVxuICAgIGFyZ3YuY29tbWFuZCA/PyAocHJvamVjdC5wYWNrYWdlSnNvbi5zY3JpcHRzPy5idWlsZCA/IGAke3Byb2plY3QucGFja2FnZU1hbmFnZXJSdW5Db21tYW5kfSBidWlsZGAgOiB1bmRlZmluZWQpO1xuICBpZiAoIWJ1aWxkQ29tbWFuZCkge1xuICAgIGNvbnNvbGUuaW5mbyhjaGFsay5ncmVlbignU2tpcCB0byBidWlsZCBiZWNhdXNlIG5vIGJ1aWxkIGNvbW1hbmQgaXMgZGVmaW5lZC4nKSk7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIGFyZ3YgPSB7IC4uLmFyZ3YsIGNvbW1hbmQ6IGJ1aWxkQ29tbWFuZCB9O1xuXG4gIC8vIFRoZSBjYWNoZSByZXF1aXJlcyB0aGUgZ2l0IHJlcG9zaXRvcnkgcm9vdCB0byBCRSByb290RGlyUGF0aDogcG9yY2VsYWluIHBhdGhzIGFuZCBkaWZmXG4gIC8vIHBhdGhzcGVjcyBiZWxvdyBhcmUgam9pbmVkL2V4ZWN1dGVkIGFnYWluc3Qgcm9vdERpclBhdGguIFdoZW4gdGhlIHJlcG8gcm9vdCBpcyBlbHNld2hlcmVcbiAgLy8gKGUuZy4gYSBzdWJwcm9qZWN0IG9mIGEgbGFyZ2VyIHJlcG9zaXRvcnkpLCBhbHdheXMgYnVpbGQgaW5zdGVhZCBvZiBtaXMtcmVzb2x2aW5nIHBhdGhzLlxuICAvLyBBIGZyZXNobHkgaW5pdGlhbGl6ZWQgcmVwbyB3aXRob3V0IGNvbW1pdHMgKHVuYm9ybiBIRUFEKSBsaWtld2lzZSBidWlsZHMgd2l0aG91dCBjYWNoaW5nOlxuICAvLyBgZ2l0IHJldi1wYXJzZSBIRUFEYCB3b3VsZCB0aHJvdy5cbiAgaWYgKCFmcy5leGlzdHNTeW5jKHBhdGguam9pbihwcm9qZWN0LnJvb3REaXJQYXRoLCAnLmdpdCcpKSB8fCAhaGFzR2l0Q29tbWl0KHByb2plY3QpKSB7XG4gICAgYnVpbGQocHJvamVjdCwgYXJndik7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBjb25zdCBbY2FuU2tpcCwgY2FjaGVGaWxlUGF0aCwgY29udGVudEhhc2hdID0gYXdhaXQgY2FuU2tpcEJ1aWxkKHByb2plY3QsIGFyZ3YpO1xuICBpZiAoY2FuU2tpcCkge1xuICAgIGNvbnNvbGUuaW5mbyhjaGFsay5ncmVlbihgU2tpcCB0byBydW4gJyR7YXJndi5jb21tYW5kfScg8J+Sq2ApKTtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBpZiAoIWJ1aWxkKHByb2plY3QsIGFyZ3YpKSByZXR1cm47XG5cbiAgaWYgKCFhcmd2LmRyeVJ1bikge1xuICAgIGNvbnN0IG91dHB1dFBhdGhzID0gZ2V0RXhwbGljaXRPdXRwdXRQYXRocyhhcmd2KSA/PyBkZXRlY3RFeGlzdGluZ0RlZmF1bHRPdXRwdXRQYXRocyhwcm9qZWN0KTtcbiAgICBpZiAob3V0cHV0UGF0aHMubGVuZ3RoID09PSAwKSB7XG4gICAgICAvLyBXaXRoIG5vIHJlY29yZGVkIG91dHB1dHMsIGEgZGVsZXRlZCBidWlsZCBkaXJlY3RvcnkgY2FuIG5ldmVyIGludmFsaWRhdGUgdGhlIGNhY2hlOyBtYWtlXG4gICAgICAvLyB0aGUgaW5hY3RpdmUgcHJvdGVjdGlvbiB2aXNpYmxlIGluc3RlYWQgb2YgZmFpbGluZyBzaWxlbnRseSAoY2YuIGlzc3VlICM5ODEpLlxuICAgICAgY29uc29sZS5pbmZvKFxuICAgICAgICBjaGFsay55ZWxsb3coJ05vIGJ1aWxkIG91dHB1dCBkaXJlY3RvcnkgZGV0ZWN0ZWQ7IHBhc3MgLS1vdXRwdXQgdG8gZW5hYmxlIG1pc3Npbmctb3V0cHV0IGNhY2hlIGludmFsaWRhdGlvbi4nKVxuICAgICAgKTtcbiAgICB9XG4gICAgYXdhaXQgZnMucHJvbWlzZXMud3JpdGVGaWxlKGNhY2hlRmlsZVBhdGgsIEpTT04uc3RyaW5naWZ5KHsgaGFzaDogY29udGVudEhhc2gsIG91dHB1dFBhdGhzIH0pLCAndXRmOCcpO1xuICB9XG4gIHJldHVybiB0cnVlO1xufVxuXG4vLyBDb21tb24gYnVpbGQgb3V0cHV0IGRpcmVjdG9yaWVzIHVzZWQgYWNyb3NzIG9yZyBwcm9qZWN0cyAodmluZXh0L2J1aWxkLXRzIGVtaXQgZGlzdCxcbi8vIE5leHQuanMgZW1pdHMgLm5leHQsIENSQS1zdHlsZSBhcHBzIGVtaXQgYnVpbGQsIGBuZXh0IGV4cG9ydGAgZW1pdHMgb3V0KS5cbmNvbnN0IGRlZmF1bHRPdXRwdXRDYW5kaWRhdGVzID0gWydkaXN0JywgJ2J1aWxkJywgJy5uZXh0JywgJ291dCddO1xuXG5mdW5jdGlvbiBnZXRFeHBsaWNpdE91dHB1dFBhdGhzKFxuICBhcmd2OiBQYXJ0aWFsPEFyZ3VtZW50c0NhbWVsQ2FzZTxJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBidWlsZGVyPj4+XG4pOiBzdHJpbmdbXSB8IHVuZGVmaW5lZCB7XG4gIHJldHVybiBhcmd2Lm91dHB1dD8ubGVuZ3RoID8gYXJndi5vdXRwdXQubWFwKFN0cmluZykgOiB1bmRlZmluZWQ7XG59XG5cbmZ1bmN0aW9uIGRldGVjdEV4aXN0aW5nRGVmYXVsdE91dHB1dFBhdGhzKHByb2plY3Q6IFByb2plY3QpOiBzdHJpbmdbXSB7XG4gIHJldHVybiBkZWZhdWx0T3V0cHV0Q2FuZGlkYXRlcy5maWx0ZXIoKG91dHB1dFBhdGgpID0+IGZzLmV4aXN0c1N5bmMocGF0aC5qb2luKHByb2plY3QuZGlyUGF0aCwgb3V0cHV0UGF0aCkpKTtcbn1cblxuLyoqIEFuIGAtLW91dHB1dGAgdmFsdWUgbWF5IG5hbWUgYSBmaWxlLCBzbyBtYXRjaCB0aGUgZXhhY3QgcGF0aCBhcyB3ZWxsIGFzIGRlc2NlbmRhbnRzLiAqL1xuZnVuY3Rpb24gbWF0Y2hlc091dHB1dFBhdGgob3V0cHV0UGF0aHM6IHN0cmluZ1tdLCBmaWxlUGF0aDogc3RyaW5nKTogYm9vbGVhbiB7XG4gIHJldHVybiBvdXRwdXRQYXRocy5zb21lKChvdXRwdXRQYXRoKSA9PiBmaWxlUGF0aCA9PT0gb3V0cHV0UGF0aCB8fCBmaWxlUGF0aC5zdGFydHNXaXRoKGAke291dHB1dFBhdGh9L2ApKTtcbn1cblxuZnVuY3Rpb24gaGFzR2l0Q29tbWl0KHByb2plY3Q6IFByb2plY3QpOiBib29sZWFuIHtcbiAgcmV0dXJuIChcbiAgICBjaGlsZF9wcm9jZXNzLnNwYXduU3luYygnZ2l0JywgWydyZXYtcGFyc2UnLCAnLS12ZXJpZnknLCAnSEVBRCddLCB7XG4gICAgICBjd2Q6IHByb2plY3QuZGlyUGF0aCxcbiAgICAgIHN0ZGlvOiAnaWdub3JlJyxcbiAgICB9KS5zdGF0dXMgPT09IDBcbiAgKTtcbn1cblxuZnVuY3Rpb24gYnVpbGQocHJvamVjdDogUHJvamVjdCwgYXJndjogUGFydGlhbDxBcmd1bWVudHNDYW1lbENhc2U8SW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgYnVpbGRlcj4+Pik6IGJvb2xlYW4ge1xuICBjb25zb2xlLmluZm8oY2hhbGsuZ3JlZW4oYFJ1biAnJHthcmd2LmNvbW1hbmR9J2ApKTtcbiAgaWYgKCFhcmd2LmRyeVJ1bikge1xuICAgIGNvbnN0IHJldCA9IGNoaWxkX3Byb2Nlc3Muc3Bhd25TeW5jKGFyZ3YuY29tbWFuZCA/PyAnJywge1xuICAgICAgY3dkOiBwcm9qZWN0LmRpclBhdGgsXG4gICAgICBlbnY6IHByb2plY3QuZW52LFxuICAgICAgc2hlbGw6IHRydWUsXG4gICAgICBzdGRpbzogJ2luaGVyaXQnLFxuICAgIH0pO1xuICAgIGlmIChyZXQuc3RhdHVzICE9PSAwKSB7XG4gICAgICBwcm9jZXNzLmV4aXRDb2RlID0gcmV0LnN0YXR1cyA/PyAxO1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuICByZXR1cm4gdHJ1ZTtcbn1cblxuY29uc3QgaWdub3JpbmdFbnZWYXJOYW1lcyA9IG5ldyBTZXQoWydDSScsICdQV0RFQlVHJywgJ1RNUERJUiddKTtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGNhblNraXBCdWlsZChcbiAgcHJvamVjdDogUHJvamVjdCxcbiAgYXJndjogUGFydGlhbDxBcmd1bWVudHNDYW1lbENhc2U8SW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgYnVpbGRlcj4+PlxuKTogUHJvbWlzZTxbYm9vbGVhbiwgc3RyaW5nLCBzdHJpbmddPiB7XG4gIGNvbnN0IGNhY2hlRGlyZWN0b3J5UGF0aCA9IHBhdGgucmVzb2x2ZShwcm9qZWN0LmRpclBhdGgsICdub2RlX21vZHVsZXMnLCAnLmNhY2hlJywgJ2J1aWxkJyk7XG4gIGNvbnN0IGNhY2hlRmlsZVBhdGggPSBwYXRoLnJlc29sdmUoY2FjaGVEaXJlY3RvcnlQYXRoLCAnbGFzdC1idWlsZCcpO1xuICBhd2FpdCBmcy5wcm9taXNlcy5ta2RpcihjYWNoZURpcmVjdG9yeVBhdGgsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuXG4gIGNvbnN0IGhhc2ggPSBjcmVhdGVIYXNoKCdzaGEyNTYnKTtcblxuICBjb25zdCBjb21taXRIYXNoID0gY2hpbGRfcHJvY2Vzcy5leGVjU3luYygnZ2l0IHJldi1wYXJzZSBIRUFEJywgeyBjd2Q6IHByb2plY3QuZGlyUGF0aCB9KS50b1N0cmluZygpLnRyaW0oKTtcbiAgaGFzaC51cGRhdGUoY29tbWl0SGFzaCk7XG5cbiAgLy8gVGhlIGludm9rZWQgYnVpbGQgY29tbWFuZCBpcyBwYXJ0IG9mIHRoZSBjYWNoZSBpZGVudGl0eTogYC1jIGNvbW1hbmRCYCBtdXN0IG5vdCByZXVzZSBhXG4gIC8vIGNhY2hlIHJlY29yZGVkIGZvciBjb21tYW5kQSB3aXRoIG90aGVyd2lzZSB1bmNoYW5nZWQgaW5wdXRzLlxuICBoYXNoLnVwZGF0ZShhcmd2LmNvbW1hbmQgPz8gJycpO1xuXG4gIGNvbnN0IGVudmlyb25tZW50SnNvbiA9IEpTT04uc3RyaW5naWZ5KFxuICAgIE9iamVjdC5lbnRyaWVzKHByb2plY3QuZW52KVxuICAgICAgLmZpbHRlcigoW2tleV0pID0+ICFpZ25vcmluZ0VudlZhck5hbWVzLmhhcyhrZXkpKVxuICAgICAgLnRvU29ydGVkKChba2V5MV0sIFtrZXkyXSkgPT4ga2V5MS5sb2NhbGVDb21wYXJlKGtleTIpKVxuICApO1xuICBoYXNoLnVwZGF0ZShlbnZpcm9ubWVudEpzb24pO1xuXG4gIGF3YWl0IHVwZGF0ZUhhc2hXaXRoRGlmZlJlc3VsdChwcm9qZWN0LCBhcmd2LCBoYXNoKTtcbiAgY29uc3QgY29udGVudEhhc2ggPSBoYXNoLmRpZ2VzdCgnaGV4Jyk7XG5cbiAgY29uc3QgY2FjaGVkQ29udGVudCA9IGF3YWl0IGlnbm9yZUVub2VudEFzeW5jKCgpID0+IGZzLnByb21pc2VzLnJlYWRGaWxlKGNhY2hlRmlsZVBhdGgsICd1dGY4JykpO1xuICBjb25zdCBjYWNoZSA9IHBhcnNlQnVpbGRDYWNoZShjYWNoZWRDb250ZW50KTtcbiAgaWYgKGNhY2hlPy5oYXNoICE9PSBjb250ZW50SGFzaCkgcmV0dXJuIFtmYWxzZSwgY2FjaGVGaWxlUGF0aCwgY29udGVudEhhc2hdO1xuXG4gIC8vIFRoZSBjYWNoZSBpcyB2YWxpZCBvbmx5IHdoaWxlIHRoZSByZWNvcmRlZCAob3IgZXhwbGljaXRseSByZXF1ZXN0ZWQpIGJ1aWxkIG91dHB1dHMgc3RpbGxcbiAgLy8gZXhpc3Q6IGEgZGVsZXRlZCBvdXRwdXQgZGlyZWN0b3J5IChlLmcuIGBybSAtcmYgZGlzdGApIG11c3QgdHJpZ2dlciBhIHJlYnVpbGQgZXZlbiB3aGVuIHRoZVxuICAvLyBpbnB1dHMgYXJlIHVuY2hhbmdlZCAoaHR0cHM6Ly9naXRodWIuY29tL1dpbGxCb29zdGVyL3NoYXJlZC9pc3N1ZXMvOTgxKS5cbiAgY29uc3QgcmVxdWlyZWRPdXRwdXRQYXRocyA9IGdldEV4cGxpY2l0T3V0cHV0UGF0aHMoYXJndikgPz8gY2FjaGUub3V0cHV0UGF0aHM7XG4gIGNvbnN0IG1pc3NpbmdPdXRwdXRQYXRocyA9IHJlcXVpcmVkT3V0cHV0UGF0aHMuZmlsdGVyKFxuICAgIChvdXRwdXRQYXRoKSA9PiAhZnMuZXhpc3RzU3luYyhwYXRoLnJlc29sdmUocHJvamVjdC5kaXJQYXRoLCBvdXRwdXRQYXRoKSlcbiAgKTtcbiAgaWYgKG1pc3NpbmdPdXRwdXRQYXRocy5sZW5ndGggPiAwKSB7XG4gICAgY29uc29sZS5pbmZvKGNoYWxrLnllbGxvdyhgUmVidWlsZGluZyBiZWNhdXNlIGJ1aWxkIG91dHB1dHMgYXJlIG1pc3Npbmc6ICR7bWlzc2luZ091dHB1dFBhdGhzLmpvaW4oJywgJyl9YCkpO1xuICAgIHJldHVybiBbZmFsc2UsIGNhY2hlRmlsZVBhdGgsIGNvbnRlbnRIYXNoXTtcbiAgfVxuICByZXR1cm4gW3RydWUsIGNhY2hlRmlsZVBhdGgsIGNvbnRlbnRIYXNoXTtcbn1cblxuZnVuY3Rpb24gcGFyc2VCdWlsZENhY2hlKGNhY2hlZENvbnRlbnQ6IHN0cmluZyB8IHVuZGVmaW5lZCk6IHsgaGFzaDogc3RyaW5nOyBvdXRwdXRQYXRoczogc3RyaW5nW10gfSB8IHVuZGVmaW5lZCB7XG4gIGlmICghY2FjaGVkQ29udGVudCkgcmV0dXJuO1xuICB0cnkge1xuICAgIGNvbnN0IHBhcnNlZCA9IEpTT04ucGFyc2UoY2FjaGVkQ29udGVudCkgYXMgeyBoYXNoPzogdW5rbm93bjsgb3V0cHV0UGF0aHM/OiB1bmtub3duIH0gfCB1bmRlZmluZWQ7XG4gICAgaWYgKHR5cGVvZiBwYXJzZWQ/Lmhhc2ggIT09ICdzdHJpbmcnKSByZXR1cm47XG4gICAgY29uc3Qgb3V0cHV0UGF0aHMgPSBBcnJheS5pc0FycmF5KHBhcnNlZC5vdXRwdXRQYXRocylcbiAgICAgID8gcGFyc2VkLm91dHB1dFBhdGhzLmZpbHRlcigocCkgPT4gdHlwZW9mIHAgPT09ICdzdHJpbmcnKVxuICAgICAgOiBbXTtcbiAgICByZXR1cm4geyBoYXNoOiBwYXJzZWQuaGFzaCwgb3V0cHV0UGF0aHMgfTtcbiAgfSBjYXRjaCB7XG4gICAgLy8gQSBsZWdhY3kgY2FjaGUgZmlsZSBjb250YWlucyBhIHJhdyBjb250ZW50IGhhc2ggd2l0aG91dCBvdXRwdXQgcmVjb3Jkcy4gVHJlYXQgaXQgYXMgYSBtaXNzOlxuICAgIC8vIGhvbm9yaW5nIGl0IHdvdWxkIGxldCBhIG1hdGNoaW5nIGhhc2ggc2tpcCBhIGJ1aWxkIHdob3NlIG91dHB1dHMgd2VyZSBkZWxldGVkLCBhbmQgb25lXG4gICAgLy8gcmVidWlsZCB1cGdyYWRlcyB0aGUgcmVjb3JkIHRvIHRoZSBKU09OIGZvcm1hdC5cbiAgICByZXR1cm47XG4gIH1cbn1cblxuLy8gTWF0Y2hlZCBhcyBjb21wbGV0ZSBwYXRoIFNFR01FTlRTIChub3Qgc3Vic3RyaW5ncyk6IGBzcmMvY29udGVzdC9gIG11c3Qgbm90IGJlIGV4Y2x1ZGVkIGJ5XG4vLyBgdGVzdGAsIGFuZCBgbXlzcmMvYCBtdXN0IG5vdCBiZSBpbmNsdWRlZCBieSBgc3JjYC5cbmNvbnN0IGluY2x1ZGVEaXJOYW1lcyA9IG5ldyBTZXQoWydzcmMnLCAncHVibGljJ10pO1xuY29uc3QgaW5jbHVkZVN1ZmZpeCA9IFtcbiAgJy5qcycsXG4gICcuY2pzJyxcbiAgJy5tanMnLFxuICAnLmpzeCcsXG4gICcudHMnLFxuICAnLmN0cycsXG4gICcubXRzJyxcbiAgJy50c3gnLFxuICAnLmpzb24nLFxuICAnLmJyb3dzZXJzbGlzdHJjJyxcbiAgLy8gQmVjYXVzZSBzb21lIGJ1aWxkIGNvbW1hbmRzIGFmZmVjdGVkIGJ5IGNoYW5nZXMgaW4gYHBhY2thZ2UuanNvbmBcbiAgJ3BhY2thZ2UuanNvbicsXG4gICd5YXJuLmxvY2snLFxuICAnYnVuLmxvY2snLFxuICAnYnVuLmxvY2tiJyxcbl07XG5jb25zdCBleGNsdWRlRGlyTmFtZXMgPSBuZXcgU2V0KFsndGVzdCcsICd0ZXN0cycsICdfX3Rlc3RzX18nLCAndGVzdC1maXh0dXJlcyddKTtcblxuYXN5bmMgZnVuY3Rpb24gdXBkYXRlSGFzaFdpdGhEaWZmUmVzdWx0KFxuICBwcm9qZWN0OiBQcm9qZWN0LFxuICBhcmd2OiBQYXJ0aWFsPEFyZ3VtZW50c0NhbWVsQ2FzZTxJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBidWlsZGVyPj4+LFxuICBoYXNoOiBIYXNoXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XG4gICAgLy8gYC11YWxsYCBsaXN0cyB1bnRyYWNrZWQgZmlsZXMgaW5kaXZpZHVhbGx5IChub3QganVzdCB0aGVpciBkaXJlY3RvcnkpLCBzbyBuZXcgZmlsZXMgaW4gYVxuICAgIC8vIGJyYW5kLW5ldyBzb3VyY2UgZGlyZWN0b3J5IHBhcnRpY2lwYXRlIGluIHRoZSBoYXNoIGJlbG93LiBgLXpgIHlpZWxkcyBOVUwtZGVsaW1pdGVkLFxuICAgIC8vIFVOUVVPVEVEIHJlY29yZHM6IHdpdGhvdXQgaXQgZ2l0IEMtcXVvdGVzIG5vbi1BU0NJSSBwYXRocywgd2hpY2ggd291bGQgc2lsZW50bHkgZHJvcCB0aG9zZVxuICAgIC8vIGZpbGVzIGZyb20gYm90aCB0aGUgdW50cmFja2VkIGhhc2hpbmcgYW5kIHRoZSBgZ2l0IGRpZmZgIHBhdGhzcGVjcy5cbiAgICBjb25zdCByZXQgPSBjaGlsZF9wcm9jZXNzLnNwYXduU3luYygnZ2l0JywgWydzdGF0dXMnLCAnLS1wb3JjZWxhaW4nLCAnLXVhbGwnLCAnLXonXSwge1xuICAgICAgY3dkOiBwcm9qZWN0LmRpclBhdGgsXG4gICAgICBlbnY6IHByb2plY3QuZW52LFxuICAgICAgc3RkaW86ICdwaXBlJyxcbiAgICAgIGVuY29kaW5nOiAndXRmOCcsXG4gICAgfSk7XG4gICAgY29uc3QgdG9rZW5zID0gcmV0LnN0ZG91dC5zcGxpdCgnXFwwJykuZmlsdGVyKCh0b2tlbikgPT4gdG9rZW4ubGVuZ3RoID4gMCk7XG4gICAgY29uc3Qgc3RhdHVzRW50cmllczogeyB1bnRyYWNrZWQ6IGJvb2xlYW47IGZpbGVQYXRoOiBzdHJpbmcgfVtdID0gW107XG4gICAgZm9yIChsZXQgaW5kZXggPSAwOyBpbmRleCA8IHRva2Vucy5sZW5ndGg7IGluZGV4KyspIHtcbiAgICAgIGNvbnN0IHRva2VuID0gdG9rZW5zW2luZGV4XSE7XG4gICAgICBjb25zdCBzdGF0dXMgPSB0b2tlbi5zbGljZSgwLCAyKTtcbiAgICAgIHN0YXR1c0VudHJpZXMucHVzaCh7IHVudHJhY2tlZDogc3RhdHVzID09PSAnPz8nLCBmaWxlUGF0aDogdG9rZW4uc2xpY2UoMykgfSk7XG4gICAgICAvLyBSZW5hbWUvY29weSByZWNvcmRzIGNhcnJ5IHRoZSBPUklHSU5BTCBwYXRoIGFzIGFuIGV4dHJhIE5VTC1kZWxpbWl0ZWQgZmllbGQ7IGluY2x1ZGUgaXRcbiAgICAgIC8vIHNvIGEgZmlsZSByZW5hbWVkIG91dCBvZiB0aGUgYnVpbGQgaW5wdXRzIHN0aWxsIGludmFsaWRhdGVzIHRoZSBjYWNoZS5cbiAgICAgIGlmIChzdGF0dXMuaW5jbHVkZXMoJ1InKSB8fCBzdGF0dXMuaW5jbHVkZXMoJ0MnKSkge1xuICAgICAgICBjb25zdCBvcmlnaW5hbFBhdGggPSB0b2tlbnNbKytpbmRleF07XG4gICAgICAgIGlmIChvcmlnaW5hbFBhdGgpIHN0YXR1c0VudHJpZXMucHVzaCh7IHVudHJhY2tlZDogZmFsc2UsIGZpbGVQYXRoOiBvcmlnaW5hbFBhdGggfSk7XG4gICAgICB9XG4gICAgfVxuICAgIGNvbnN0IG5vcm1hbGl6ZWRFbnRyaWVzID0gc3RhdHVzRW50cmllcy5tYXAoKGVudHJ5KSA9PiAoe1xuICAgICAgLi4uZW50cnksXG4gICAgICBoYXNoUGF0aDpcbiAgICAgICAgcHJvamVjdC5lbnYuV0JfRU5WID09PSAndGVzdCdcbiAgICAgICAgICA/IGVudHJ5LmZpbGVQYXRoLnJlcGxhY2UoL3BhY2thZ2VzXFwvd2JcXC90ZXN0XFwvZml4dHVyZXNcXC9bXi9dK1xcLy8sICcnKVxuICAgICAgICAgIDogZW50cnkuZmlsZVBhdGgsXG4gICAgfSkpO1xuICAgIC8vIEJ1aWxkIE9VVFBVVFMgbXVzdCBuZXZlciBjb3VudCBhcyBidWlsZCBpbnB1dHM6IGhhc2hpbmcgZS5nLiBhbiB1bnRyYWNrZWQgZGlzdC8gZmlsZSB3b3VsZFxuICAgIC8vIGNoYW5nZSB0aGUgaGFzaCBvbiBldmVyeSBidWlsZCBhbmQgZGlzYWJsZSB0aGUgY2FjaGUgcGVybWFuZW50bHkuXG4gICAgY29uc3QgcHJvamVjdFJlbGF0aXZlRGlyUGF0aCA9IHBhdGgucmVsYXRpdmUocHJvamVjdC5yb290RGlyUGF0aCwgcHJvamVjdC5kaXJQYXRoKTtcbiAgICBjb25zdCBleHBsaWNpdE91dHB1dFBhdGhzID0gKGdldEV4cGxpY2l0T3V0cHV0UGF0aHMoYXJndikgPz8gW10pLm1hcCgob3V0cHV0UGF0aCkgPT5cbiAgICAgIHBhdGguam9pbihwcm9qZWN0UmVsYXRpdmVEaXJQYXRoLCBvdXRwdXRQYXRoKVxuICAgICk7XG4gICAgY29uc3QgZmlsdGVyZWRFbnRyaWVzID0gbm9ybWFsaXplZEVudHJpZXMuZmlsdGVyKCh7IGZpbGVQYXRoLCBoYXNoUGF0aCB9KSA9PiB7XG4gICAgICBjb25zdCBkaXJlY3RvcnlTZWdtZW50cyA9IGhhc2hQYXRoLnNwbGl0KCcvJykuc2xpY2UoMCwgLTEpO1xuICAgICAgcmV0dXJuIChcbiAgICAgICAgKGRpcmVjdG9yeVNlZ21lbnRzLnNvbWUoKHNlZ21lbnQpID0+IGluY2x1ZGVEaXJOYW1lcy5oYXMoc2VnbWVudCkpIHx8XG4gICAgICAgICAgaW5jbHVkZVN1ZmZpeC5zb21lKChzdWZmaXgpID0+IGhhc2hQYXRoLmVuZHNXaXRoKHN1ZmZpeCkpKSAmJlxuICAgICAgICAhZGlyZWN0b3J5U2VnbWVudHMuc29tZSgoc2VnbWVudCkgPT4gZXhjbHVkZURpck5hbWVzLmhhcyhzZWdtZW50KSkgJiZcbiAgICAgICAgLy8gT25seSBFWFBMSUNJVExZIGRlY2xhcmVkIG91dHB1dHMgYXJlIGV4Y2x1ZGVkIGZyb20gdGhlIGlucHV0IGhhc2guIERlZmF1bHQgY2FuZGlkYXRlc1xuICAgICAgICAvLyAoZGlzdC9idWlsZC8ubmV4dC9vdXQpIGFyZSBOT1Q6IGdpdGlnbm9yZWQgYXJ0aWZhY3RzIG5ldmVyIGFwcGVhciBpbiBgZ2l0IHN0YXR1c2BcbiAgICAgICAgLy8gYW55d2F5LCBhbmQgYSBub24taWdub3JlZCBmaWxlIHRoZXJlIG1heSBiZSBnZW51aW5lIHNvdXJjZSAoZS5nLiBidWlsZC8gc2NyaXB0cyksIHdob3NlXG4gICAgICAgIC8vIGNoYW5nZXMgbXVzdCBpbnZhbGlkYXRlIHRoZSBjYWNoZSDigJQgY29ycmVjdG5lc3Mgb3ZlciBjYWNoZSBoaXRzLiBQcm9qZWN0cyBrZWVwaW5nXG4gICAgICAgIC8vIG5vbi1pZ25vcmVkIGFydGlmYWN0cyBpbiB0aG9zZSBkaXJlY3RvcmllcyBzaG91bGQgZ2l0aWdub3JlIHRoZW0gb3IgcGFzcyAtLW91dHB1dC5cbiAgICAgICAgIW1hdGNoZXNPdXRwdXRQYXRoKGV4cGxpY2l0T3V0cHV0UGF0aHMsIGZpbGVQYXRoKVxuICAgICAgKTtcbiAgICB9KTtcbiAgICBpZiAoYXJndi52ZXJib3NlKSB7XG4gICAgICBjb25zb2xlLmluZm8oYENoYW5nZWQgZmlsZXM6ICR7ZmlsdGVyZWRFbnRyaWVzLm1hcCgoZW50cnkpID0+IGVudHJ5Lmhhc2hQYXRoKS5qb2luKCcsICcpfWApO1xuICAgIH1cblxuICAgIC8vIFVudHJhY2tlZCBmaWxlcyBuZXZlciBhcHBlYXIgaW4gYGdpdCBkaWZmYCwgc28gaGFzaCB0aGVpciBjb250ZW50cyBkaXJlY3RseS5cbiAgICBmb3IgKGNvbnN0IGVudHJ5IG9mIGZpbHRlcmVkRW50cmllcy5maWx0ZXIoKGVudHJ5KSA9PiBlbnRyeS51bnRyYWNrZWQpKSB7XG4gICAgICB0cnkge1xuICAgICAgICBoYXNoLnVwZGF0ZShlbnRyeS5oYXNoUGF0aCk7XG4gICAgICAgIGhhc2gudXBkYXRlKGZzLnJlYWRGaWxlU3luYyhwYXRoLmpvaW4ocHJvamVjdC5yb290RGlyUGF0aCwgZW50cnkuZmlsZVBhdGgpKSk7XG4gICAgICB9IGNhdGNoIHtcbiAgICAgICAgLy8gVGhlIGZpbGUgbWF5IHZhbmlzaCBjb25jdXJyZW50bHk7IHRoZSB0cmFja2VkLXN0YXRlIGRpZmYgYmVsb3cgaXMgdW5hZmZlY3RlZC5cbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCB0cmFja2VkUGF0aHMgPSBmaWx0ZXJlZEVudHJpZXMuZmlsdGVyKChlbnRyeSkgPT4gIWVudHJ5LnVudHJhY2tlZCkubWFwKChlbnRyeSkgPT4gZW50cnkuaGFzaFBhdGgpO1xuICAgIGlmICh0cmFja2VkUGF0aHMubGVuZ3RoID09PSAwKSB7XG4gICAgICAvLyBgZ2l0IGRpZmYgSEVBRCAtLWAgd2l0aCBubyBwYXRoc3BlYyB3b3VsZCBkaWZmIEVWRVJZIGZpbGUsIGxldHRpbmcgZXhjbHVkZWQgY2hhbmdlc1xuICAgICAgLy8gKGRvY3MsIHRlc3RzKSBpbnZhbGlkYXRlIHRoZSBjYWNoZS5cbiAgICAgIHJlc29sdmUoKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgLy8gYGdpdCBkaWZmIEhFQURgIChub3QgcGxhaW4gYGdpdCBkaWZmYCkgc28gc3RhZ2VkLW9ubHkgY2hhbmdlcyBpbnZhbGlkYXRlIHRoZSBjYWNoZSB0b287XG4gICAgLy8gJ2dpdCBkaWZmIC0tJyB3b3JrcyBvbmx5IG9uIHJvb3REaXJQYXRoLlxuICAgIGNvbnN0IHByb2MgPSBjaGlsZF9wcm9jZXNzLnNwYXduKCdnaXQnLCBbJ2RpZmYnLCAnSEVBRCcsICctLScsIC4uLnRyYWNrZWRQYXRoc10sIHsgY3dkOiBwcm9qZWN0LnJvb3REaXJQYXRoIH0pO1xuICAgIHByb2Muc3Rkb3V0Lm9uKCdkYXRhJywgKGRhdGE6IEJpbmFyeUxpa2UpID0+IHtcbiAgICAgIGhhc2gudXBkYXRlKGRhdGEpO1xuICAgICAgaWYgKGFyZ3YudmVyYm9zZSkge1xuICAgICAgICBjb25zb2xlLmluZm8oJ0RhdGE6JywgZGF0YSk7XG4gICAgICAgIGNvbnNvbGUuaW5mbygnSGFzaDonLCBoYXNoLmNvcHkoKS5kaWdlc3QoJ2hleCcpKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICBwcm9jLm9uKCdjbG9zZScsICgpID0+IHtcbiAgICAgIHJlc29sdmUoKTtcbiAgICB9KTtcbiAgfSk7XG59XG4iLCJpbXBvcnQgeyBQcm9taXNlUG9vbCB9IGZyb20gJ21pbmltYWwtcHJvbWlzZS1wb29sJztcblxuZXhwb3J0IGNvbnN0IHByb21pc2VQb29sID0gbmV3IFByb21pc2VQb29sKCk7XG4iLCJpbXBvcnQgeyBzcGF3bkFzeW5jIH0gZnJvbSAnQHdpbGxib29zdGVyL3NoYXJlZC1saWItbm9kZS9zcmMnO1xuaW1wb3J0IGNoYWxrIGZyb20gJ2NoYWxrJztcbmltcG9ydCB0eXBlIHsgQXJndW1lbnRzQ2FtZWxDYXNlLCBJbmZlcnJlZE9wdGlvblR5cGVzIH0gZnJvbSAneWFyZ3MnO1xuXG5pbXBvcnQgdHlwZSB7IFByb2plY3QgfSBmcm9tICcuLi9wcm9qZWN0LmpzJztcbmltcG9ydCB0eXBlIHsgc2hhcmVkT3B0aW9uc0J1aWxkZXIgfSBmcm9tICcuLi9zaGFyZWRPcHRpb25zQnVpbGRlci5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcblxuaW50ZXJmYWNlIE9wdGlvbnMge1xuICBjaT86IGJvb2xlYW47XG4gIGV4aXRJZkZhaWxlZD86IGJvb2xlYW47XG4gIG9uU2lnbmFsPzogKHNpZ25hbDogTm9kZUpTLlNpZ25hbHMgfCBudWxsKSA9PiB2b2lkO1xuICBvbWl0U2lsZW50U3RhcnQ/OiBib29sZWFuO1xuICBwcmVzZXJ2ZUNvbG9yPzogYm9vbGVhbjtcbiAgcHJvY2Vzc1NpbGVudE91dHB1dD86IChvdXRwdXQ6IHN0cmluZykgPT4gc3RyaW5nO1xuICBwcmludFJhd091dHB1dD86IGJvb2xlYW47XG4gIHByaW50U2lsZW50T3V0cHV0T25GYWlsdXJlT25seT86IGJvb2xlYW47XG4gIHNpbGVudFByb2dyZXNzSW50ZXJ2YWxNcz86IG51bWJlcjtcbiAgc2lsZW50U3VjY2Vzc01lc3NhZ2U/OiBzdHJpbmc7XG4gIHRpbWVvdXQ/OiBudW1iZXI7XG59XG5cbmNvbnN0IGRlZmF1bHRPcHRpb25zOiBPcHRpb25zID0ge1xuICBleGl0SWZGYWlsZWQ6IHRydWUsXG59O1xuXG5leHBvcnQgaW50ZXJmYWNlIEJ1ZmZlcmVkUnVuUmVzdWx0IHtcbiAgZXhpdENvZGU6IG51bWJlcjtcbiAgb3V0cHV0OiBzdHJpbmc7XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBydW5XaXRoU3Bhd24oXG4gIHNjcmlwdDogc3RyaW5nLFxuICBwcm9qZWN0OiBQcm9qZWN0LFxuICBhcmd2OiBQYXJ0aWFsPEFyZ3VtZW50c0NhbWVsQ2FzZTxJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBzaGFyZWRPcHRpb25zQnVpbGRlcj4+PiAmIHsgc2lsZW50PzogYm9vbGVhbiB9LFxuICBvcHRzOiBPcHRpb25zID0gZGVmYXVsdE9wdGlvbnNcbik6IFByb21pc2U8bnVtYmVyPiB7XG4gIGNvbnN0IG5vcm1hbGl6ZWRTY3JpcHQgPSBub3JtYWxpemVTY3JpcHQoc2NyaXB0LCBwcm9qZWN0KTtcbiAgaWYgKCEoYXJndi5zaWxlbnQgJiYgb3B0cy5vbWl0U2lsZW50U3RhcnQgJiYgIWFyZ3YuZHJ5UnVuKSkge1xuICAgIHByaW50U3RhcnQobm9ybWFsaXplZFNjcmlwdC5wcmludGFibGUsIHByb2plY3QsIGFyZ3Yuc2lsZW50ID8gJ0NvbW1hbmQnIDogJ1N0YXJ0Jyk7XG4gIH1cbiAgaWYgKGFyZ3YudmVyYm9zZSkge1xuICAgIHByaW50U3RhcnQobm9ybWFsaXplZFNjcmlwdC5ydW5uYWJsZSwgcHJvamVjdCwgJ1N0YXJ0IChyYXcpJywgdHJ1ZSk7XG4gIH1cbiAgaWYgKGFyZ3YuZHJ5UnVuKSB7XG4gICAgcHJpbnRGaW5pc2hlZEFuZEV4aXRJZk5lZWRlZChub3JtYWxpemVkU2NyaXB0LnByaW50YWJsZSwgMCwgb3B0cywgeyBzaWxlbnRTdWNjZXNzOiBhcmd2LnNpbGVudCB9KTtcbiAgICByZXR1cm4gMDtcbiAgfVxuXG4gIGNvbnN0IHNob3VsZFByb2Nlc3NTaWxlbnRPdXRwdXQgPSBCb29sZWFuKFxuICAgIGFyZ3Yuc2lsZW50ICYmIChvcHRzLnByb2Nlc3NTaWxlbnRPdXRwdXQgPz8gb3B0cy5wcmludFNpbGVudE91dHB1dE9uRmFpbHVyZU9ubHkpXG4gICk7XG4gIGxldCB3cm90ZVNpbGVudFByb2dyZXNzID0gZmFsc2U7XG4gIGNvbnN0IHByb2dyZXNzVGltZXIgPVxuICAgIGFyZ3Yuc2lsZW50ICYmIG9wdHMuc2lsZW50UHJvZ3Jlc3NJbnRlcnZhbE1zXG4gICAgICA/IHNldEludGVydmFsKCgpID0+IHtcbiAgICAgICAgICBwcm9jZXNzLnN0ZG91dC53cml0ZSgnLicpO1xuICAgICAgICAgIHdyb3RlU2lsZW50UHJvZ3Jlc3MgPSB0cnVlO1xuICAgICAgICB9LCBvcHRzLnNpbGVudFByb2dyZXNzSW50ZXJ2YWxNcylcbiAgICAgIDogdW5kZWZpbmVkO1xuICBjb25zdCByZXQgPSBhd2FpdCBzcGF3bkFzeW5jKG5vcm1hbGl6ZWRTY3JpcHQucnVubmFibGUsIHVuZGVmaW5lZCwge1xuICAgIGN3ZDogcHJvamVjdC5kaXJQYXRoLFxuICAgIGVudjogY29uZmlndXJlRW52KHByb2plY3QuZW52LCB7IC4uLm9wdHMsIHByZXNlcnZlQ29sb3I6IG9wdHMucHJlc2VydmVDb2xvciA/PyAoYXJndi5zaWxlbnQgPyB0cnVlIDogdW5kZWZpbmVkKSB9KSxcbiAgICBzaGVsbDogdHJ1ZSxcbiAgICBzdGRpbzogYXJndi5zaWxlbnQgPyAncGlwZScgOiAnaW5oZXJpdCcsXG4gICAgdGltZW91dDogb3B0cy50aW1lb3V0LFxuICAgIG1lcmdlT3V0QW5kRXJyb3I6IHNob3VsZFByb2Nlc3NTaWxlbnRPdXRwdXQsXG4gICAga2lsbE9uRXhpdDogdHJ1ZSxcbiAgICBwcmludGluZ1N0ZG91dDogYXJndi5zaWxlbnQgJiYgIXNob3VsZFByb2Nlc3NTaWxlbnRPdXRwdXQsXG4gICAgcHJpbnRpbmdTdGRlcnI6IGFyZ3Yuc2lsZW50ICYmICFzaG91bGRQcm9jZXNzU2lsZW50T3V0cHV0LFxuICAgIG9taXRCbGFua0xpbmVzV2hpbGVQcmludGluZzogYXJndi5zaWxlbnQsXG4gICAgdmVyYm9zZTogYXJndi52ZXJib3NlLFxuICB9KS5maW5hbGx5KCgpID0+IHtcbiAgICBpZiAocHJvZ3Jlc3NUaW1lcikge1xuICAgICAgY2xlYXJJbnRlcnZhbChwcm9ncmVzc1RpbWVyKTtcbiAgICB9XG4gIH0pO1xuICBjb25zdCBleGl0Q29kZSA9IHJldC5zdGF0dXMgPz8gMTtcbiAgaWYgKHdyb3RlU2lsZW50UHJvZ3Jlc3MpIHtcbiAgICBwcm9jZXNzLnN0ZG91dC53cml0ZSgnXFxuJyk7XG4gIH1cbiAgaWYgKHNob3VsZFByb2Nlc3NTaWxlbnRPdXRwdXQgJiYgKCFvcHRzLnByaW50U2lsZW50T3V0cHV0T25GYWlsdXJlT25seSB8fCBleGl0Q29kZSAhPT0gMCkpIHtcbiAgICBjb25zdCBvdXRwdXQgPSAob3B0cy5wcm9jZXNzU2lsZW50T3V0cHV0ID8gb3B0cy5wcm9jZXNzU2lsZW50T3V0cHV0KHJldC5zdGRvdXQpIDogcmV0LnN0ZG91dCkudHJpbSgpO1xuICAgIGlmIChvdXRwdXQpIHtcbiAgICAgIHByb2Nlc3Muc3Rkb3V0LndyaXRlKG91dHB1dCk7XG4gICAgICBwcm9jZXNzLnN0ZG91dC53cml0ZSgnXFxuJyk7XG4gICAgfVxuICB9XG4gIGlmIChhcmd2LnNpbGVudCAmJiBleGl0Q29kZSA9PT0gMCAmJiBvcHRzLnNpbGVudFN1Y2Nlc3NNZXNzYWdlKSB7XG4gICAgY29uc29sZS5pbmZvKGNoYWxrLmdyZWVuKG9wdHMuc2lsZW50U3VjY2Vzc01lc3NhZ2UpKTtcbiAgfVxuICBvcHRzLm9uU2lnbmFsPy4ocmV0LnNpZ25hbCk7XG4gIHByaW50RmluaXNoZWRBbmRFeGl0SWZOZWVkZWQobm9ybWFsaXplZFNjcmlwdC5wcmludGFibGUsIGV4aXRDb2RlLCBvcHRzLCB7IHNpbGVudFN1Y2Nlc3M6IGFyZ3Yuc2lsZW50IH0pO1xuICByZXR1cm4gZXhpdENvZGU7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBydW5XaXRoU3Bhd25JblBhcmFsbGVsKFxuICBzY3JpcHQ6IHN0cmluZyxcbiAgcHJvamVjdDogUHJvamVjdCxcbiAgYXJndjogUGFydGlhbDxBcmd1bWVudHNDYW1lbENhc2U8SW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2Ygc2hhcmVkT3B0aW9uc0J1aWxkZXI+Pj4sXG4gIG9wdHM6IE9wdGlvbnMgPSBkZWZhdWx0T3B0aW9uc1xuKTogUHJvbWlzZTxudW1iZXI+IHtcbiAgcmV0dXJuIHByb21pc2VQb29sLnJ1bkFuZFdhaXRGb3JSZXR1cm5WYWx1ZShhc3luYyAoKSA9PiB7XG4gICAgY29uc3Qgbm9ybWFsaXplZFNjcmlwdCA9IG5vcm1hbGl6ZVNjcmlwdChzY3JpcHQsIHByb2plY3QpO1xuICAgIHByaW50U3RhcnQobm9ybWFsaXplZFNjcmlwdC5wcmludGFibGUsIHByb2plY3QsICdTdGFydCAocGFyYWxsZWwpJywgdHJ1ZSk7XG4gICAgaWYgKGFyZ3YuZHJ5UnVuKSB7XG4gICAgICBwcmludFN0YXJ0KG5vcm1hbGl6ZWRTY3JpcHQucHJpbnRhYmxlLCBwcm9qZWN0LCAnU3RhcnRlZCAobG9nKScpO1xuICAgICAgaWYgKGFyZ3YudmVyYm9zZSkge1xuICAgICAgICBwcmludFN0YXJ0KG5vcm1hbGl6ZWRTY3JpcHQucnVubmFibGUsIHByb2plY3QsICdTdGFydGVkIChyYXcpJywgdHJ1ZSk7XG4gICAgICB9XG4gICAgICBwcmludEZpbmlzaGVkQW5kRXhpdElmTmVlZGVkKG5vcm1hbGl6ZWRTY3JpcHQucHJpbnRhYmxlLCAwLCBvcHRzKTtcbiAgICAgIHJldHVybiAwO1xuICAgIH1cblxuICAgIGNvbnN0IHJldCA9IGF3YWl0IHNwYXduQXN5bmMobm9ybWFsaXplZFNjcmlwdC5ydW5uYWJsZSwgdW5kZWZpbmVkLCB7XG4gICAgICBjd2Q6IHByb2plY3QuZGlyUGF0aCxcbiAgICAgIGVudjogY29uZmlndXJlRW52KHByb2plY3QuZW52LCB7IC4uLm9wdHMsIHByZXNlcnZlQ29sb3I6IG9wdHMucHJlc2VydmVDb2xvciA/PyB0cnVlIH0pLFxuICAgICAgc2hlbGw6IHRydWUsXG4gICAgICBzdGRpbzogJ3BpcGUnLFxuICAgICAgdGltZW91dDogb3B0cy50aW1lb3V0LFxuICAgICAgbWVyZ2VPdXRBbmRFcnJvcjogdHJ1ZSxcbiAgICAgIGtpbGxPbkV4aXQ6IHRydWUsXG4gICAgICBwcmludGluZ1N0ZG91dDogb3B0cy5wcmludFJhd091dHB1dCxcbiAgICAgIHByaW50aW5nU3RkZXJyOiBvcHRzLnByaW50UmF3T3V0cHV0LFxuICAgICAgdmVyYm9zZTogYXJndi52ZXJib3NlLFxuICAgIH0pO1xuICAgIG9wdHMub25TaWduYWw/LihyZXQuc2lnbmFsKTtcbiAgICBwcmludFN0YXJ0KG5vcm1hbGl6ZWRTY3JpcHQucHJpbnRhYmxlLCBwcm9qZWN0LCAnU3RhcnRlZCAobG9nKScpO1xuICAgIGlmIChhcmd2LnZlcmJvc2UpIHtcbiAgICAgIHByaW50U3RhcnQobm9ybWFsaXplZFNjcmlwdC5ydW5uYWJsZSwgcHJvamVjdCwgJ1N0YXJ0ZWQgKHJhdyknLCB0cnVlKTtcbiAgICB9XG4gICAgY29uc3Qgb3V0ID0gcmV0LnN0ZG91dC50cmltKCk7XG4gICAgaWYgKG91dCAmJiAhb3B0cy5wcmludFJhd091dHB1dCkge1xuICAgICAgcHJvY2Vzcy5zdGRvdXQud3JpdGUob3V0KTtcbiAgICAgIHByb2Nlc3Muc3Rkb3V0LndyaXRlKCdcXG4nKTtcbiAgICB9XG4gICAgcHJpbnRGaW5pc2hlZEFuZEV4aXRJZk5lZWRlZChub3JtYWxpemVkU2NyaXB0LnByaW50YWJsZSwgcmV0LnN0YXR1cywgb3B0cyk7XG4gICAgcmV0dXJuIHJldC5zdGF0dXMgPz8gMTtcbiAgfSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBydW5XaXRoU3Bhd25JblBhcmFsbGVsQnVmZmVyZWQoXG4gIHNjcmlwdDogc3RyaW5nLFxuICBwcm9qZWN0OiBQcm9qZWN0LFxuICBhcmd2OiBQYXJ0aWFsPEFyZ3VtZW50c0NhbWVsQ2FzZTxJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBzaGFyZWRPcHRpb25zQnVpbGRlcj4+PixcbiAgb3B0czogT3B0aW9ucyA9IGRlZmF1bHRPcHRpb25zXG4pOiBQcm9taXNlPEJ1ZmZlcmVkUnVuUmVzdWx0PiB7XG4gIHJldHVybiBwcm9taXNlUG9vbC5ydW5BbmRXYWl0Rm9yUmV0dXJuVmFsdWUoYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IG5vcm1hbGl6ZWRTY3JpcHQgPSBub3JtYWxpemVTY3JpcHQoc2NyaXB0LCBwcm9qZWN0KTtcbiAgICBpZiAoYXJndi5kcnlSdW4pIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGV4aXRDb2RlOiAwLFxuICAgICAgICBvdXRwdXQ6ICcnLFxuICAgICAgfTtcbiAgICB9XG5cbiAgICBjb25zdCByZXQgPSBhd2FpdCBzcGF3bkFzeW5jKG5vcm1hbGl6ZWRTY3JpcHQucnVubmFibGUsIHVuZGVmaW5lZCwge1xuICAgICAgY3dkOiBwcm9qZWN0LmRpclBhdGgsXG4gICAgICBlbnY6IGNvbmZpZ3VyZUVudihwcm9qZWN0LmVudiwgeyAuLi5vcHRzLCBwcmVzZXJ2ZUNvbG9yOiBvcHRzLnByZXNlcnZlQ29sb3IgPz8gdHJ1ZSB9KSxcbiAgICAgIHNoZWxsOiB0cnVlLFxuICAgICAgc3RkaW86ICdwaXBlJyxcbiAgICAgIHRpbWVvdXQ6IG9wdHMudGltZW91dCxcbiAgICAgIG1lcmdlT3V0QW5kRXJyb3I6IHRydWUsXG4gICAgICBraWxsT25FeGl0OiB0cnVlLFxuICAgICAgcHJpbnRpbmdTdGRvdXQ6IG9wdHMucHJpbnRSYXdPdXRwdXQsXG4gICAgICBwcmludGluZ1N0ZGVycjogb3B0cy5wcmludFJhd091dHB1dCxcbiAgICAgIHZlcmJvc2U6IGFyZ3YudmVyYm9zZSxcbiAgICB9KTtcbiAgICBvcHRzLm9uU2lnbmFsPy4ocmV0LnNpZ25hbCk7XG4gICAgcmV0dXJuIHtcbiAgICAgIGV4aXRDb2RlOiByZXQuc3RhdHVzID8/IDEsXG4gICAgICBvdXRwdXQ6IHJldC5zdGRvdXQsXG4gICAgfTtcbiAgfSk7XG59XG5cbi8qKlxuICogUmVwbGFjZSBjYXBpdGFsaXplZCBjb21tYW5kcyAoZS5nLiwgWUFSTiwgUFJJU01BLCBCVU4pIHdpdGggc3VpdGFibGUgY29tbWFuZHMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBub3JtYWxpemVTY3JpcHQoc2NyaXB0OiBzdHJpbmcsIHByb2plY3Q6IFByb2plY3QpOiB7IHByaW50YWJsZTogc3RyaW5nOyBydW5uYWJsZTogc3RyaW5nIH0ge1xuICAvLyBObyBgLS1idW5gOiBpdHMgbm9kZS0+YnVuIFBBVEggc2hpbSBsZWFrcyBpbnRvIGV2ZXJ5IGNoaWxkIHByb2Nlc3MgYW5kIGJyZWFrcyB0b29scyByZXF1aXJpbmdcbiAgLy8gcmVhbCBOb2RlLmpzIChQbGF5d3JpZ2h0LCB3cmFuZ2xlciwgdmluZXh0KS5cbiAgY29uc3QgcHJvamVjdFBhY2thZ2VNYW5hZ2VyV2l0aFJ1biA9IHByb2plY3QudXNlc0J1blBhY2thZ2VNYW5hZ2VyID8gJ2J1biBydW4nIDogJ3lhcm4nO1xuICBsZXQgbmV3U2NyaXB0ID0gc2NyaXB0XG4gICAgLnJlcGxhY2VBbGwoJ1xcbicsICcnKVxuICAgIC5yZXBsYWNlQWxsKC9cXHNcXHMrL2csICcgJylcbiAgICAucmVwbGFjZUFsbChcbiAgICAgIC9QUklTTUEgZ2VuZXJhdGUoPyFcXHMrLS1uby1oaW50cykoPz1cXHN8JCkvZ3UsXG4gICAgICBwcm9qZWN0LnBhY2thZ2VKc29uLmRlcGVuZGVuY2llcz8uYmxpdHogPyAnUFJJU01BIGdlbmVyYXRlJyA6ICdQUklTTUEgZ2VuZXJhdGUgLS1uby1oaW50cydcbiAgICApXG4gICAgLnJlcGxhY2VBbGwoJ1BSSVNNQSAnLCBwcm9qZWN0LnBhY2thZ2VKc29uLmRlcGVuZGVuY2llcz8uYmxpdHogPyAnWUFSTiBibGl0eiBwcmlzbWEgJyA6ICdZQVJOIHByaXNtYSAnKVxuICAgIC5yZXBsYWNlQWxsKCdCVU4gcnVuICcsIHByb2plY3QudXNlc0J1blBhY2thZ2VNYW5hZ2VyID8gYCR7cHJvamVjdFBhY2thZ2VNYW5hZ2VyV2l0aFJ1bn0gYCA6ICdZQVJOIHJ1biAnKVxuICAgIC5yZXBsYWNlQWxsKCdCVU4gJywgcHJvamVjdC51c2VzQnVuUGFja2FnZU1hbmFnZXIgPyBgJHtwcm9qZWN0UGFja2FnZU1hbmFnZXJXaXRoUnVufSBgIDogJ1lBUk4gJylcbiAgICAvLyBBdm9pZCByZXBsYWNpbmcgYFlBUk4gcnVuYCB3aXRoIGBydW5gIGJ5IHJlcGxhY2luZyBgWUFSTmAgd2l0aCBgKHlhcm58YnVuKSBydW5gLlxuICAgIC5yZXBsYWNlQWxsKCdZQVJOIHJ1biAnLCBwcm9qZWN0LnVzZXNCdW5QYWNrYWdlTWFuYWdlciA/IGAke3Byb2plY3RQYWNrYWdlTWFuYWdlcldpdGhSdW59IGAgOiAneWFybiBydW4gJyk7XG4gIGlmIChwcm9qZWN0LnVzZXNCdW5QYWNrYWdlTWFuYWdlcikge1xuICAgIG5ld1NjcmlwdCA9IG5ld1NjcmlwdFxuICAgICAgLnJlcGxhY2VBbGwoJ1lBUk4gYnVpbGQtdHMgcnVuJywgJ2J1biBydW4nKVxuICAgICAgLnJlcGxhY2VBbGwoJ2J1biBydW4gYnVuIHJ1bicsICdidW4gcnVuJylcbiAgICAgIC8vIEJlY2F1c2UgYnVuIGNhbiBydW4gc3JjL2luZGV4LnRzIGRpcmVjdGx5LlxuICAgICAgLnJlcGxhY2VBbGwoJ2Rpc3QvaW5kZXguanMnLCAnc3JjL2luZGV4LnRzJyk7XG4gIH1cbiAgbmV3U2NyaXB0ID0gbmV3U2NyaXB0LnRyaW0oKTtcbiAgY29uc3QgcHJpbnRhYmxlU2NyaXB0ID0gbmV3U2NyaXB0LnJlcGxhY2VBbGwoJ1lBUk4gJywgYCR7cHJvamVjdFBhY2thZ2VNYW5hZ2VyV2l0aFJ1bn0gYCk7XG4gIGNvbnN0IHJ1bm5hYmxlU2NyaXB0ID0gbmV3U2NyaXB0XG4gICAgLy8gS2VlcCBQbGF5d3JpZ2h0IGFzIGEgcGFja2FnZS1tYW5hZ2VyIGNvbW1hbmQgaW5zdGVhZCBvZiByZXNvbHZpbmcgaXQgdGhyb3VnaCBub2RlX21vZHVsZXMvLmJpbi5cbiAgICAucmVwbGFjZUFsbCgnWUFSTiBwbGF5d3JpZ2h0ICcsIGAke3Byb2plY3RQYWNrYWdlTWFuYWdlcldpdGhSdW59IHBsYXl3cmlnaHQgYClcbiAgICAucmVwbGFjZUFsbCgnWUFSTiAnLCAhcHJvamVjdC51c2VzQnVuUGFja2FnZU1hbmFnZXIgJiYgcHJvamVjdC5iaW5FeGlzdHMgPyAnJyA6IGAke3Byb2plY3RQYWNrYWdlTWFuYWdlcldpdGhSdW59IGApO1xuICByZXR1cm4ge1xuICAgIHByaW50YWJsZTogYCR7cHJvamVjdFBhY2thZ2VNYW5hZ2VyV2l0aFJ1bn0gZG90ZW52IC0tICR7cHJpbnRhYmxlU2NyaXB0fWAsXG4gICAgcnVubmFibGU6IHJ1bm5hYmxlU2NyaXB0LFxuICB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcHJpbnRTdGFydChub3JtYWxpemVkU2NyaXB0OiBzdHJpbmcsIHByb2plY3Q6IFByb2plY3QsIHByZWZpeCA9ICdTdGFydCcsIHdlYWsgPSBmYWxzZSk6IHZvaWQge1xuICBjb25zb2xlLmluZm8oXG4gICAgJ1xcbicgK1xuICAgICAgKHdlYWsgPyBjaGFsay5ncmF5IDogY2hhbGsuY3lhbikoY2hhbGsuYm9sZChgJHtwcmVmaXh9OmApLCBub3JtYWxpemVkU2NyaXB0KSArXG4gICAgICBjaGFsay5ncmF5KGAgYXQgJHtwcm9qZWN0LmRpclBhdGh9YClcbiAgKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHByaW50RmluaXNoZWRBbmRFeGl0SWZOZWVkZWQoXG4gIHNjcmlwdDogc3RyaW5nLFxuICBleGl0Q29kZTogbnVtYmVyIHwgbnVsbCxcbiAgb3B0czogT21pdDxPcHRpb25zLCAndGltZW91dCc+LFxuICBwcmludE9wdGlvbnM6IHsgc2lsZW50U3VjY2Vzcz86IGJvb2xlYW4gfSA9IHt9XG4pOiB2b2lkIHtcbiAgaWYgKGV4aXRDb2RlID09PSAwKSB7XG4gICAgaWYgKHByaW50T3B0aW9ucy5zaWxlbnRTdWNjZXNzKSByZXR1cm47XG4gICAgY29uc29sZS5pbmZvKGNoYWxrLmdyZWVuKGNoYWxrLmJvbGQoJ0ZpbmlzaGVkOicpLCBzY3JpcHQpKTtcbiAgfSBlbHNlIHtcbiAgICBjb25zb2xlLmluZm8oY2hhbGsucmVkKGNoYWxrLmJvbGQoYEZhaWxlZCAoZXhpdCBjb2RlICR7ZXhpdENvZGV9KTogYCksIHNjcmlwdCkpO1xuICAgIGlmIChvcHRzLmV4aXRJZkZhaWxlZCAhPT0gZmFsc2UpIHtcbiAgICAgIHByb2Nlc3MuZXhpdChleGl0Q29kZSA/PyAxKTtcbiAgICB9XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNvbmZpZ3VyZUVudihcbiAgZW52OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmcgfCB1bmRlZmluZWQ+LFxuICBvcHRzOiBPcHRpb25zXG4pOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmcgfCB1bmRlZmluZWQ+IHtcbiAgY29uc3QgbmV3RW52ID0geyAuLi5lbnYgfTtcbiAgaWYgKG9wdHMuY2kpIHtcbiAgICBuZXdFbnYuQ0kgPSAnMSc7XG4gIH1cbiAgY29uZmlndXJlQ29sb3JFbnYobmV3RW52LCBvcHRzLnByZXNlcnZlQ29sb3IpO1xuICByZXR1cm4gbmV3RW52O1xufVxuXG4vKipcbiAqIENvbmZpZ3VyZXMgY2hpbGQtcHJvY2VzcyBjb2xvciBlbnZpcm9ubWVudCB2YXJpYWJsZXMgZm9yIHdiLW1hbmFnZWQgb3V0cHV0LlxuICpcbiAqIEBwYXJhbSBlbnYgVGhlIGNoaWxkLXByb2Nlc3MgZW52aXJvbm1lbnQgdG8gbXV0YXRlLlxuICogQHBhcmFtIHByZXNlcnZlQ29sb3IgV2hldGhlciB3YiBzaG91bGQgcHJlc2VydmUgY29sb3JzIGZvciBvdXRwdXQgdGhhdCBpdCBjYXB0dXJlcyBhbmQgcmVwcmludHMgdG8gYW4gaW50ZXJhY3RpdmUgVFRZLlxuICovXG5leHBvcnQgZnVuY3Rpb24gY29uZmlndXJlQ29sb3JFbnYoZW52OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmcgfCB1bmRlZmluZWQ+LCBwcmVzZXJ2ZUNvbG9yPzogYm9vbGVhbik6IHZvaWQge1xuICBpZiAoZW52Lk5PX0NPTE9SICE9PSB1bmRlZmluZWQgfHwgcHJlc2VydmVDb2xvciA9PT0gZmFsc2UpIHtcbiAgICAvLyBOT19DT0xPUiBhbmQgcHJlc2VydmVDb2xvcj1mYWxzZSBhcmUgZXhwbGljaXQgbm8tY29sb3IgY2hvaWNlcywgc28gaW5oZXJpdGVkIEZPUkNFX0NPTE9SIG11c3Qgbm90IGxlYWsgdGhyb3VnaC5cbiAgICBkZWxldGUgZW52LkZPUkNFX0NPTE9SO1xuICB9IGVsc2UgaWYgKHByZXNlcnZlQ29sb3IgJiYgcHJvY2Vzcy5zdGRvdXQuaXNUVFkpIHtcbiAgICBlbnYuRk9SQ0VfQ09MT1IgfHw9ICczJztcbiAgfVxufVxuIiwiaW1wb3J0IHsgeWFyZ3NPcHRpb25zQnVpbGRlckZvckVudiB9IGZyb20gJ0B3aWxsYm9vc3Rlci9zaGFyZWQtbGliLW5vZGUvc3JjJztcbmltcG9ydCB0eXBlIHsgRW52UmVhZGVyT3B0aW9ucyB9IGZyb20gJ0B3aWxsYm9vc3Rlci9zaGFyZWQtbGliLW5vZGUvc3JjJztcblxuZXhwb3J0IGNvbnN0IHNoYXJlZE9wdGlvbnNCdWlsZGVyID0ge1xuICAuLi55YXJnc09wdGlvbnNCdWlsZGVyRm9yRW52LFxuICAvLyBUaGlzIG9wdGlvbiBpcyBmb3IgZGVidWdnaW5nIG1haW5seS5cbiAgJ3dvcmtpbmctZGlyJzoge1xuICAgIGRlc2NyaXB0aW9uOiAnQSB3b3JraW5nIGRpcmVjdG9yeScsXG4gICAgdHlwZTogJ3N0cmluZycsXG4gICAgYWxpYXM6ICd3JyxcbiAgfSxcbiAgJ2RyeS1ydW4nOiB7XG4gICAgZGVzY3JpcHRpb246ICdXaGV0aGVyIHRvIHNraXAgYWN0dWFsIGNvbW1hbmQgZXhlY3V0aW9uJyxcbiAgICB0eXBlOiAnYm9vbGVhbicsXG4gICAgYWxpYXM6IFsnZHJ5JywgJ2QnXSxcbiAgfSxcbn0gYXMgY29uc3Q7XG5cbmV4cG9ydCBmdW5jdGlvbiBidWlsZEVudlJlYWRlck9wdGlvbkFyZ3MoYXJndjogRW52UmVhZGVyT3B0aW9ucyk6IHN0cmluZ1tdIHtcbiAgY29uc3QgYXJnczogc3RyaW5nW10gPSBbXTtcbiAgZm9yIChjb25zdCBvcHRpb25OYW1lIG9mIE9iamVjdC5rZXlzKHlhcmdzT3B0aW9uc0J1aWxkZXJGb3JFbnYpKSB7XG4gICAgY29uc3QgdmFsdWUgPSBnZXRPcHRpb25WYWx1ZShhcmd2LCBvcHRpb25OYW1lKTtcbiAgICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCkgY29udGludWU7XG5cbiAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnYm9vbGVhbicpIHtcbiAgICAgIGFyZ3MucHVzaCh2YWx1ZSA/IGAtLSR7b3B0aW9uTmFtZX1gIDogYC0tJHtvcHRpb25OYW1lfT1mYWxzZWApO1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnIHx8IHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicpIHtcbiAgICAgIGFyZ3MucHVzaChgLS0ke29wdGlvbk5hbWV9PSR7dmFsdWV9YCk7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgICBmb3IgKGNvbnN0IGl0ZW0gb2YgdmFsdWUpIHtcbiAgICAgICAgYXJncy5wdXNoKGAtLSR7b3B0aW9uTmFtZX09JHtpdGVtfWApO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICBpZiAoXG4gICAgKGFyZ3YgYXMgRW52UmVhZGVyT3B0aW9ucyAmIHsgc2lsZW50PzogYm9vbGVhbiB9KS5zaWxlbnQgPT09IHRydWUgJiZcbiAgICBnZXRPcHRpb25WYWx1ZShhcmd2LCAncXVpZXQtZW52JykgPT09IHVuZGVmaW5lZFxuICApIHtcbiAgICBhcmdzLnB1c2goJy0tcXVpZXQtZW52Jyk7XG4gIH1cbiAgcmV0dXJuIGFyZ3M7XG59XG5cbmZ1bmN0aW9uIGdldE9wdGlvblZhbHVlKGFyZ3Y6IEVudlJlYWRlck9wdGlvbnMsIG9wdGlvbk5hbWU6IHN0cmluZyk6IHVua25vd24ge1xuICBjb25zdCBjYW1lbENhc2VPcHRpb25OYW1lID0gb3B0aW9uTmFtZS5yZXBsYWNlQWxsKC8tKFthLXpdKS9nLCAoXywgY2hhcmFjdGVyOiBzdHJpbmcpID0+IGNoYXJhY3Rlci50b1VwcGVyQ2FzZSgpKTtcbiAgY29uc3Qgb3B0aW9ucyA9IGFyZ3YgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gIHJldHVybiBvcHRpb25zW29wdGlvbk5hbWVdID8/IG9wdGlvbnNbY2FtZWxDYXNlT3B0aW9uTmFtZV07XG59XG4iLCJpbXBvcnQgY2hpbGRfcHJvY2VzcyBmcm9tICdub2RlOmNoaWxkX3Byb2Nlc3MnO1xuaW1wb3J0IHsgY29uc3RhbnRzIH0gZnJvbSAnbm9kZTpvcyc7XG5cbmltcG9ydCB7IHRyZWVLaWxsIH0gZnJvbSAnQHdpbGxib29zdGVyL3NoYXJlZC1saWItbm9kZS9zcmMnO1xuaW1wb3J0IGNoYWxrIGZyb20gJ2NoYWxrJztcbmltcG9ydCB0eXBlIHsgQ29tbWFuZE1vZHVsZSwgSW5mZXJyZWRPcHRpb25UeXBlcyB9IGZyb20gJ3lhcmdzJztcblxuaW1wb3J0IHsgZmluZFNlbGZQcm9qZWN0LCB0eXBlIFByb2plY3QgfSBmcm9tICcuLi9wcm9qZWN0LmpzJztcbmltcG9ydCB7IGNvbmZpZ3VyZUVudiwgbm9ybWFsaXplU2NyaXB0IH0gZnJvbSAnLi4vc2NyaXB0cy9ydW4uanMnO1xuaW1wb3J0IHsgc2hhcmVkT3B0aW9uc0J1aWxkZXIgfSBmcm9tICcuLi9zaGFyZWRPcHRpb25zQnVpbGRlci5qcyc7XG5cbmNvbnN0IEZPUkNFX0tJTExfREVMQVlfTVMgPSA1MDAwO1xuXG5jb25zdCBidWlsZGVyID0ge1xuICAna2lsbC1vdGhlcnMnOiB7XG4gICAgZGVzY3JpcHRpb246ICdLaWxsIG90aGVyIGNvbW1hbmRzIHdoZW4gb25lIGNvbW1hbmQgZXhpdHMnLFxuICAgIHR5cGU6ICdib29sZWFuJyxcbiAgfSxcbiAgJ2tpbGwtb3RoZXJzLW9uLWZhaWwnOiB7XG4gICAgZGVzY3JpcHRpb246ICdLaWxsIG90aGVyIGNvbW1hbmRzIHdoZW4gb25lIGNvbW1hbmQgZmFpbHMnLFxuICAgIHR5cGU6ICdib29sZWFuJyxcbiAgfSxcbiAgc3VjY2Vzczoge1xuICAgIGRlc2NyaXB0aW9uOiAnRGVmaW5lIHN1Y2Nlc3NmdWwgY29tcGxldGlvbiBjcml0ZXJpYScsXG4gICAgdHlwZTogJ3N0cmluZycsXG4gICAgY2hvaWNlczogWydhbGwnLCAnZmlyc3QnXSxcbiAgICBkZWZhdWx0OiAnYWxsJyxcbiAgfSxcbn0gYXMgY29uc3Q7XG5cbmNvbnN0IGFyZ3VtZW50c0J1aWxkZXIgPSB7XG4gIGNvbW1hbmRzOiB7XG4gICAgZGVzY3JpcHRpb246ICdDb21tYW5kcyB0byBydW4gY29uY3VycmVudGx5JyxcbiAgICB0eXBlOiAnYXJyYXknLFxuICB9LFxufSBhcyBjb25zdDtcblxuaW50ZXJmYWNlIFJ1bkNvbmN1cnJlbnRseU9wdGlvbnMge1xuICBjb21tYW5kczogc3RyaW5nW107XG4gIHByb2plY3Q6IFByb2plY3Q7XG4gIGtpbGxPdGhlcnM6IGJvb2xlYW47XG4gIGtpbGxPdGhlcnNPbkZhaWw6IGJvb2xlYW47XG4gIHN1Y2Nlc3M6ICdhbGwnIHwgJ2ZpcnN0JztcbiAgY2k/OiBib29sZWFuO1xufVxuXG5leHBvcnQgY29uc3QgY29uY3VycmVudGx5Q29tbWFuZDogQ29tbWFuZE1vZHVsZTxcbiAgdW5rbm93bixcbiAgSW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgYnVpbGRlciAmIHR5cGVvZiBhcmd1bWVudHNCdWlsZGVyICYgdHlwZW9mIHNoYXJlZE9wdGlvbnNCdWlsZGVyPlxuPiA9IHtcbiAgY29tbWFuZDogJ2NvbmN1cnJlbnRseSA8Y29tbWFuZHMuLi4+JyxcbiAgZGVzY3JpYmU6ICdSdW4gY29tbWFuZHMgY29uY3VycmVudGx5JyxcbiAgYnVpbGRlcjogeyAuLi5zaGFyZWRPcHRpb25zQnVpbGRlciwgLi4uYnVpbGRlciwgLi4uYXJndW1lbnRzQnVpbGRlciB9LFxuICBhc3luYyBoYW5kbGVyKGFyZ3YpIHtcbiAgICBpZiAocHJvY2Vzcy5wbGF0Zm9ybSA9PT0gJ3dpbjMyJykge1xuICAgICAgY29uc29sZS5lcnJvcihjaGFsay5yZWQoJ1RoaXMgY29tbWFuZCBpcyBub3Qgc3VwcG9ydGVkIG9uIFdpbmRvd3MuJykpO1xuICAgICAgcHJvY2Vzcy5leGl0KDEpO1xuICAgIH1cblxuICAgIGNvbnN0IHByb2plY3QgPSBmaW5kU2VsZlByb2plY3QoYXJndik7XG4gICAgaWYgKCFwcm9qZWN0KSB7XG4gICAgICBjb25zb2xlLmVycm9yKGNoYWxrLnJlZCgnTm8gcHJvamVjdCBmb3VuZC4nKSk7XG4gICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgfVxuXG4gICAgY29uc3QgY29tbWFuZHMgPSAoYXJndi5jb21tYW5kcyA/PyBbXSkubWFwKFN0cmluZykuZmlsdGVyKEJvb2xlYW4pO1xuICAgIGlmIChjb21tYW5kcy5sZW5ndGggPT09IDApIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoY2hhbGsucmVkKCdObyBjb21tYW5kcyBwcm92aWRlZC4nKSk7XG4gICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgfVxuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGV4aXRDb2RlID0gYXdhaXQgcnVuQ29uY3VycmVudGx5KHtcbiAgICAgICAgY29tbWFuZHMsXG4gICAgICAgIHByb2plY3QsXG4gICAgICAgIGtpbGxPdGhlcnM6IGFyZ3Yua2lsbE90aGVycyA/PyBmYWxzZSxcbiAgICAgICAga2lsbE90aGVyc09uRmFpbDogYXJndi5raWxsT3RoZXJzT25GYWlsID8/IGZhbHNlLFxuICAgICAgICBzdWNjZXNzOiBhcmd2LnN1Y2Nlc3MsXG4gICAgICAgIGNpOiB0eXBlb2YgYXJndi5jaSA9PT0gJ2Jvb2xlYW4nID8gYXJndi5jaSA6IHVuZGVmaW5lZCxcbiAgICAgIH0pO1xuICAgICAgcHJvY2Vzcy5leGl0KGV4aXRDb2RlKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgY29uc29sZS5lcnJvcihjaGFsay5yZWQoZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiBTdHJpbmcoZXJyb3IpKSk7XG4gICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgfVxuICB9LFxufTtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJ1bkNvbmN1cnJlbnRseShvcHRpb25zOiBSdW5Db25jdXJyZW50bHlPcHRpb25zKTogUHJvbWlzZTxudW1iZXI+IHtcbiAgY29uc3QgY2hpbGRyZW4gPSBvcHRpb25zLmNvbW1hbmRzLm1hcCgoY29tbWFuZCkgPT5cbiAgICBjaGlsZF9wcm9jZXNzLnNwYXduKG5vcm1hbGl6ZVNjcmlwdChjb21tYW5kLCBvcHRpb25zLnByb2plY3QpLnJ1bm5hYmxlLCB7XG4gICAgICBjd2Q6IG9wdGlvbnMucHJvamVjdC5kaXJQYXRoLFxuICAgICAgZGV0YWNoZWQ6IHRydWUsXG4gICAgICBlbnY6IGNvbmZpZ3VyZUVudihvcHRpb25zLnByb2plY3QuZW52LCB7IGNpOiBvcHRpb25zLmNpIH0pLFxuICAgICAgc2hlbGw6IHRydWUsXG4gICAgICBzdGRpbzogJ2luaGVyaXQnLFxuICAgIH0pXG4gICk7XG5cbiAgbGV0IHN0b3BwaW5nID0gZmFsc2U7XG4gIGxldCBpbnRlcnJ1cHRlZFNpZ25hbDogTm9kZUpTLlNpZ25hbHMgfCB1bmRlZmluZWQ7XG4gIGxldCBmaXJzdFJlc3VsdDogbnVtYmVyIHwgdW5kZWZpbmVkO1xuICBsZXQgc3RvcFJlc3VsdDogbnVtYmVyIHwgdW5kZWZpbmVkO1xuICBjb25zdCBmb3JjZUtpbGxQcm9taXNlczogUHJvbWlzZTx2b2lkPltdID0gW107XG4gIGNvbnN0IHJlc3VsdHMgPSBBcnJheS5mcm9tPG51bWJlciB8IHVuZGVmaW5lZD4oeyBsZW5ndGg6IGNoaWxkcmVuLmxlbmd0aCB9KTtcbiAgY29uc3Qgd2FpdEZvckV4aXRQcm9taXNlcyA9IGNoaWxkcmVuLm1hcCgoY2hpbGQsIGluZGV4KSA9PiB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlPHZvaWQ+KChyZXNvbHZlKSA9PiB7XG4gICAgICBsZXQgc2V0dGxlZCA9IGZhbHNlO1xuICAgICAgY29uc3Qgc2V0dGxlID0gKGV4aXRDb2RlOiBudW1iZXIpOiB2b2lkID0+IHtcbiAgICAgICAgaWYgKHNldHRsZWQpIHJldHVybjtcblxuICAgICAgICBzZXR0bGVkID0gdHJ1ZTtcbiAgICAgICAgcmVzdWx0c1tpbmRleF0gPSBleGl0Q29kZTtcbiAgICAgICAgZmlyc3RSZXN1bHQgPz89IGV4aXRDb2RlO1xuXG4gICAgICAgIGlmICghc3RvcHBpbmcgJiYgc2hvdWxkU3RvcE90aGVycyhleGl0Q29kZSwgb3B0aW9ucykpIHtcbiAgICAgICAgICBzdG9wUmVzdWx0ID0gZXhpdENvZGU7XG4gICAgICAgICAgc3RvcHBpbmcgPSB0cnVlO1xuICAgICAgICAgIGZvcmNlS2lsbFByb21pc2VzLnB1c2godGVybWluYXRlQ2hpbGRyZW4oY2hpbGRyZW4sICdTSUdURVJNJykpO1xuICAgICAgICB9XG4gICAgICAgIHJlc29sdmUoKTtcbiAgICAgIH07XG5cbiAgICAgIGNoaWxkLm9uY2UoJ2Vycm9yJywgKGVycm9yKSA9PiB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoJ0ZhaWxlZCB0byBzdGFydCBjaGlsZCBwcm9jZXNzOicsIGVycm9yKTtcbiAgICAgICAgc2V0dGxlKDEpO1xuICAgICAgfSk7XG4gICAgICBjaGlsZC5vbmNlKCdleGl0JywgKGNvZGUsIHNpZ25hbCkgPT4ge1xuICAgICAgICBzZXR0bGUoZ2V0RXhpdENvZGUoY29kZSA/PyB1bmRlZmluZWQsIHNpZ25hbCA/PyB1bmRlZmluZWQpKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9KTtcblxuICBjb25zdCBzdG9wQWxsID0gKHNpZ25hbDogTm9kZUpTLlNpZ25hbHMpOiB2b2lkID0+IHtcbiAgICBpbnRlcnJ1cHRlZFNpZ25hbCA/Pz0gc2lnbmFsO1xuICAgIGlmIChzdG9wcGluZykgcmV0dXJuO1xuXG4gICAgc3RvcHBpbmcgPSB0cnVlO1xuICAgIGZvcmNlS2lsbFByb21pc2VzLnB1c2godGVybWluYXRlQ2hpbGRyZW4oY2hpbGRyZW4sIHNpZ25hbCkpO1xuICB9O1xuICBjb25zdCBzdG9wT25TaWdpbnQgPSAoKTogdm9pZCA9PiB7XG4gICAgc3RvcEFsbCgnU0lHSU5UJyk7XG4gIH07XG4gIGNvbnN0IHN0b3BPblNpZ3Rlcm0gPSAoKTogdm9pZCA9PiB7XG4gICAgc3RvcEFsbCgnU0lHVEVSTScpO1xuICB9O1xuICBjb25zdCBzdG9wT25TaWdxdWl0ID0gKCk6IHZvaWQgPT4ge1xuICAgIHN0b3BBbGwoJ1NJR1FVSVQnKTtcbiAgfTtcbiAgcHJvY2Vzcy5vbignU0lHSU5UJywgc3RvcE9uU2lnaW50KTtcbiAgcHJvY2Vzcy5vbignU0lHVEVSTScsIHN0b3BPblNpZ3Rlcm0pO1xuICBwcm9jZXNzLm9uKCdTSUdRVUlUJywgc3RvcE9uU2lncXVpdCk7XG4gIHRyeSB7XG4gICAgYXdhaXQgUHJvbWlzZS5hbGwod2FpdEZvckV4aXRQcm9taXNlcyk7XG4gICAgYXdhaXQgUHJvbWlzZS5hbGwoZm9yY2VLaWxsUHJvbWlzZXMpO1xuICB9IGZpbmFsbHkge1xuICAgIHByb2Nlc3MucmVtb3ZlTGlzdGVuZXIoJ1NJR0lOVCcsIHN0b3BPblNpZ2ludCk7XG4gICAgcHJvY2Vzcy5yZW1vdmVMaXN0ZW5lcignU0lHVEVSTScsIHN0b3BPblNpZ3Rlcm0pO1xuICAgIHByb2Nlc3MucmVtb3ZlTGlzdGVuZXIoJ1NJR1FVSVQnLCBzdG9wT25TaWdxdWl0KTtcbiAgfVxuXG4gIGlmIChpbnRlcnJ1cHRlZFNpZ25hbCkge1xuICAgIHJldHVybiBnZXRFeGl0Q29kZSh1bmRlZmluZWQsIGludGVycnVwdGVkU2lnbmFsKTtcbiAgfVxuXG4gIGlmIChvcHRpb25zLnN1Y2Nlc3MgPT09ICdmaXJzdCcpIHtcbiAgICByZXR1cm4gZmlyc3RSZXN1bHQgPz8gMTtcbiAgfVxuICBpZiAoc3RvcFJlc3VsdCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuIHN0b3BSZXN1bHQ7XG4gIH1cbiAgZm9yIChjb25zdCByZXN1bHQgb2YgcmVzdWx0cykge1xuICAgIGlmIChyZXN1bHQgIT09IHVuZGVmaW5lZCAmJiByZXN1bHQgIT09IDApIHtcbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuICB9XG4gIHJldHVybiAwO1xufVxuXG5mdW5jdGlvbiBnZXRFeGl0Q29kZShjb2RlOiBudW1iZXIgfCB1bmRlZmluZWQsIHNpZ25hbDogTm9kZUpTLlNpZ25hbHMgfCB1bmRlZmluZWQpOiBudW1iZXIge1xuICBpZiAoY29kZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuIGNvZGU7XG4gIH1cbiAgaWYgKHNpZ25hbCAmJiBzaWduYWwgaW4gY29uc3RhbnRzLnNpZ25hbHMpIHtcbiAgICByZXR1cm4gMTI4ICsgY29uc3RhbnRzLnNpZ25hbHNbc2lnbmFsXTtcbiAgfVxuICByZXR1cm4gMTtcbn1cblxuZnVuY3Rpb24gc2hvdWxkU3RvcE90aGVycyhcbiAgZXhpdENvZGU6IG51bWJlcixcbiAgb3B0aW9uczogUGljazxSdW5Db25jdXJyZW50bHlPcHRpb25zLCAna2lsbE90aGVycycgfCAna2lsbE90aGVyc09uRmFpbCcgfCAnc3VjY2Vzcyc+XG4pOiBib29sZWFuIHtcbiAgcmV0dXJuIG9wdGlvbnMuc3VjY2VzcyA9PT0gJ2ZpcnN0JyB8fCBvcHRpb25zLmtpbGxPdGhlcnMgfHwgKG9wdGlvbnMua2lsbE90aGVyc09uRmFpbCAmJiBleGl0Q29kZSAhPT0gMCk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHRlcm1pbmF0ZUNoaWxkcmVuKGNoaWxkcmVuOiBjaGlsZF9wcm9jZXNzLkNoaWxkUHJvY2Vzc1tdLCBzaWduYWw6IE5vZGVKUy5TaWduYWxzKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IGZvcmNlS2lsbFBpZHMgPSBzaWduYWxQaWRzKHRvQ2hpbGRQaWRzKGNoaWxkcmVuKSwgc2lnbmFsKTtcbiAgaWYgKGZvcmNlS2lsbFBpZHMubGVuZ3RoID09PSAwKSByZXR1cm47XG5cbiAgaWYgKGF3YWl0IHdhaXRGb3JGb3JjZUtpbGwoZm9yY2VLaWxsUGlkcykpIHtcbiAgICBzaWduYWxQaWRzKGZvcmNlS2lsbFBpZHMsICdTSUdLSUxMJyk7XG4gIH1cbn1cblxuZnVuY3Rpb24gdG9DaGlsZFBpZHMoY2hpbGRyZW46IGNoaWxkX3Byb2Nlc3MuQ2hpbGRQcm9jZXNzW10pOiBudW1iZXJbXSB7XG4gIHJldHVybiBjaGlsZHJlbi5mbGF0TWFwKChjaGlsZCkgPT4gKGNoaWxkLnBpZCA9PT0gdW5kZWZpbmVkID8gW10gOiBbY2hpbGQucGlkXSkpO1xufVxuXG5mdW5jdGlvbiBzaWduYWxQaWRzKHBpZHM6IHJlYWRvbmx5IG51bWJlcltdLCBzaWduYWw6IE5vZGVKUy5TaWduYWxzKTogbnVtYmVyW10ge1xuICBjb25zdCBzaWduYWxlZFBpZHM6IG51bWJlcltdID0gW107XG4gIGZvciAoY29uc3QgcGlkIG9mIHBpZHMpIHtcbiAgICB0cnkge1xuICAgICAgaWYgKCFraWxsUHJvY2Vzc0dyb3VwKHBpZCwgc2lnbmFsKSkgY29udGludWU7XG5cbiAgICAgIHNpZ25hbGVkUGlkcy5wdXNoKHBpZCk7XG4gICAgICB0cmVlS2lsbChwaWQsIHNpZ25hbCk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNvbnNvbGUud2FybignRmFpbGVkIHRvIGtpbGwgY2hpbGQgcHJvY2VzczonLCBlcnJvcik7XG4gICAgfVxuICB9XG4gIHJldHVybiBzaWduYWxlZFBpZHM7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHdhaXRGb3JGb3JjZUtpbGwocGlkczogcmVhZG9ubHkgbnVtYmVyW10pOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgY29uc3QgZGVhZGxpbmUgPSBEYXRlLm5vdygpICsgRk9SQ0VfS0lMTF9ERUxBWV9NUztcbiAgd2hpbGUgKERhdGUubm93KCkgPCBkZWFkbGluZSkge1xuICAgIGlmIChwaWRzLmV2ZXJ5KGlzUHJvY2Vzc0dyb3VwR29uZSkpIHJldHVybiBmYWxzZTtcblxuICAgIGF3YWl0IHNsZWVwKE1hdGgubWluKDEwMCwgZGVhZGxpbmUgLSBEYXRlLm5vdygpKSk7XG4gIH1cbiAgcmV0dXJuIHRydWU7XG59XG5cbmZ1bmN0aW9uIGlzUHJvY2Vzc0dyb3VwR29uZShwaWQ6IG51bWJlcik6IGJvb2xlYW4ge1xuICB0cnkge1xuICAgIHByb2Nlc3Mua2lsbCgtcGlkLCAwKTtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgaWYgKGlzTm9TdWNoUHJvY2Vzc0Vycm9yKGVycm9yKSkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxufVxuXG5hc3luYyBmdW5jdGlvbiBzbGVlcChtczogbnVtYmVyKTogUHJvbWlzZTx2b2lkPiB7XG4gIGF3YWl0IG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiBzZXRUaW1lb3V0KHJlc29sdmUsIG1zKSk7XG59XG5cbmZ1bmN0aW9uIGtpbGxQcm9jZXNzR3JvdXAocGlkOiBudW1iZXIsIHNpZ25hbDogTm9kZUpTLlNpZ25hbHMpOiBib29sZWFuIHtcbiAgdHJ5IHtcbiAgICBwcm9jZXNzLmtpbGwoLXBpZCwgc2lnbmFsKTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBpZiAoaXNOb1N1Y2hQcm9jZXNzRXJyb3IoZXJyb3IpKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHRocm93IGVycm9yO1xuICB9XG59XG5cbmZ1bmN0aW9uIGlzTm9TdWNoUHJvY2Vzc0Vycm9yKGVycm9yOiB1bmtub3duKTogYm9vbGVhbiB7XG4gIHJldHVybiB0eXBlb2YgZXJyb3IgPT09ICdvYmplY3QnICYmIGVycm9yICE9PSBudWxsICYmICdjb2RlJyBpbiBlcnJvciAmJiBlcnJvci5jb2RlID09PSAnRVNSQ0gnO1xufVxuIiwiZXhwb3J0IGZ1bmN0aW9uIGJ1aWxkU2hlbGxDb21tYW5kKGFyZ3M6IHN0cmluZ1tdKTogc3RyaW5nIHtcbiAgcmV0dXJuIGFyZ3MubWFwKChhcmcpID0+IHNoZWxsRXNjYXBlQXJndW1lbnQoYXJnKSkuam9pbignICcpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gYnVpbGRTaGVsbEVudmlyb25tZW50QXNzaWdubWVudChuYW1lOiBzdHJpbmcsIHZhbHVlOiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gYCR7bmFtZX09JHtzaGVsbEVzY2FwZUFyZ3VtZW50KHZhbHVlKX1gO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gc2hlbGxFc2NhcGVBcmd1bWVudChhcmc6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiAvXltcXHcuLzo9LEAlKy1dKyQvdS50ZXN0KGFyZykgPyBhcmcgOiBgJyR7YXJnLnJlcGxhY2VBbGwoXCInXCIsIGAnXCInXCInYCl9J2A7XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgdHlwZSB7IFByb2plY3QgfSBmcm9tICcuLi9wcm9qZWN0LmpzJztcbmltcG9ydCB7IGJ1aWxkRW52UmVhZGVyT3B0aW9uQXJncyB9IGZyb20gJy4uL3NoYXJlZE9wdGlvbnNCdWlsZGVyLmpzJztcbmltcG9ydCB0eXBlIHsgU2NyaXB0QXJndiB9IGZyb20gJy4uL3NjcmlwdHMvYnVpbGRlci5qcyc7XG5pbXBvcnQgeyBidWlsZFNoZWxsQ29tbWFuZCB9IGZyb20gJy4vc2hlbGwuanMnO1xuXG5jb25zdCB3cmFuZ2xlckNvbmZpZ0ZpbGVOYW1lcyA9IFsnd3JhbmdsZXIuanNvbmMnLCAnd3JhbmdsZXIuanNvbicsICd3cmFuZ2xlci50b21sJ107XG5cbi8qKlxuICogQnVpbGQgYSBjb21tYW5kIGdlbmVyYXRpbmcgYSAuZGV2LnZhcnMgZmlsZSAodmlhIGB3YiBnZW4tZGV2LXZhcnNgKSBzbyB0aGF0XG4gKiBgd3JhbmdsZXIgZGV2YCBjYW4gc2VlIHRoZSB3Yi1tYW5hZ2VkIGVudmlyb25tZW50IHZhcmlhYmxlcy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGJ1aWxkR2VuRGV2VmFyc0NvbW1hbmQoYXJndjogU2NyaXB0QXJndiwgb3V0cHV0UGF0aDogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIGJ1aWxkU2hlbGxDb21tYW5kKFsnWUFSTicsICd3YicsICdnZW4tZGV2LXZhcnMnLCAuLi5idWlsZEVudlJlYWRlck9wdGlvbkFyZ3MoYXJndiksIG91dHB1dFBhdGhdKTtcbn1cblxuLyoqXG4gKiBCdWlsZCBhIGB3cmFuZ2xlciBkZXZgLXN0eWxlIGNvbW1hbmQuIGBlbnYgLXUgQ0xPVURGTEFSRV9FTlZgIG1ha2VzIHdyYW5nbGVyIHNlcnZlIHRoZSB0b3AtbGV2ZWxcbiAqIChub24tZGVwbG95KSBjb25maWcuIHdyYW5nbGVyIChsaWtlIHZpbmV4dCkgcmVxdWlyZXMgcmVhbCBOb2RlLmpzIOKAlCBgYnVuIHJ1bmAgcmVzcGVjdHMgdGhlIGJpbidzXG4gKiBub2RlIHNoZWJhbmcsIGFuZCB3YiBuZXZlciBjb21wb3NlcyBgLS1idW5gICh3aG9zZSBub2RlLT5idW4gUEFUSCBzaGltIGJyZWFrcyBib3RoIHRvb2xzKS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGJ1aWxkV3JhbmdsZXJEZXZDb21tYW5kKGFyZ3M6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiBgZW52IC11IENMT1VERkxBUkVfRU5WIFlBUk4gd3JhbmdsZXIgJHthcmdzfWAudHJpbSgpO1xufVxuXG4vKipcbiAqIEJ1aWxkIGEgY29tbWFuZCBhcHBseWluZyB3cmFuZ2xlci1uYXRpdmUgRDEgbWlncmF0aW9ucyB0byB0aGUgbG9jYWwgZGF0YWJhc2UsIG9yIHVuZGVmaW5lZFxuICogaWYgdGhlIHByb2plY3QgaGFzIG5vIEQxIGRhdGFiYXNlIG9yIG5vIHdyYW5nbGVyLW5hdGl2ZSBtaWdyYXRpb25zIGRpcmVjdG9yeS5cbiAqIENJPXRydWUgc3VwcHJlc3NlcyB3cmFuZ2xlcidzIGludGVyYWN0aXZlIGNvbmZpcm1hdGlvbiBwcm9tcHQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBidWlsZEQxTWlncmF0aW9uc0FwcGx5Q29tbWFuZChwcm9qZWN0OiBQaWNrPFByb2plY3QsICdkaXJQYXRoJyB8ICdlbnYnPik6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IGRhdGFiYXNlTmFtZSA9IGdldEQxRGF0YWJhc2VOYW1lKHByb2plY3QpO1xuICBpZiAoIWRhdGFiYXNlTmFtZSB8fCAhZmluZEQxTWlncmF0aW9uc0RpclBhdGgocHJvamVjdCkpIHJldHVybjtcblxuICByZXR1cm4gYENJPXRydWUgWUFSTiB3cmFuZ2xlciBkMSBtaWdyYXRpb25zIGFwcGx5ICR7ZGF0YWJhc2VOYW1lfSAtLWxvY2FsIC0tcGVyc2lzdC10byBcIiR7Z2V0TG9jYWxXcmFuZ2xlclN0YXRlRGlyKHByb2plY3QpfVwiYDtcbn1cblxuLyoqXG4gKiBQcmVmaXggdGhlIGdpdmVuIHNjcmlwdCB3aXRoIGNvbW1hbmRzIGV4cG9ydGluZyBEQVRBQkFTRV9VUkwgcG9pbnRpbmcgdG8gdGhlIGxvY2FsIG1pbmlmbGFyZSBEMSBTUUxpdGUgZmlsZSxcbiAqIHNvIHRoYXQgZHJpenpsZS1raXQgYW5kIHNlZWQgc2NyaXB0cyBjYW4gb3BlcmF0ZSBvbiB0aGUgc2FtZSBkYXRhYmFzZSBhcyB0aGUgYXBwLlxuICogRG8gbm90aGluZyBpZiB0aGUgcHJvamVjdCBoYXMgbm8gRDEgZGF0YWJhc2UgaW4gaXRzIHdyYW5nbGVyIGNvbmZpZy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHdyYXBXaXRoTG9jYWxEMURhdGFiYXNlVXJsKHByb2plY3Q6IFBpY2s8UHJvamVjdCwgJ2RpclBhdGgnIHwgJ2Vudic+LCBzY3JpcHQ6IHN0cmluZyk6IHN0cmluZyB7XG4gIGNvbnN0IGRhdGFiYXNlTmFtZSA9IGdldEQxRGF0YWJhc2VOYW1lKHByb2plY3QpO1xuICBpZiAoIWRhdGFiYXNlTmFtZSkgcmV0dXJuIHNjcmlwdDtcblxuICAvLyBFeGNsdWRpbmcgbWluaWZsYXJlJ3MgbWV0YWRhdGEuc3FsaXRlLCB3aGljaCBsaXZlcyBuZXh0IHRvIHRoZSBoYXNoLW5hbWVkIGRhdGFiYXNlIGZpbGUuXG4gIC8vIEFuIHVubWF0Y2hlZCBnbG9iIGNhbm5vdCBoYXBwZW4gaGVyZTogdGhlIHNjcmlwdCBydW5zIHVuZGVyIC9iaW4vc2ggKHZpYSBOb2RlJ3MgYHNoZWxsOiB0cnVlYCksXG4gIC8vIGFuZCB0aGUgcHJlY2VkaW5nIG1hdGVyaWFsaXphdGlvbiBjb21tYW5kIGd1YXJhbnRlZXMgdGhlIFNRTGl0ZSBmaWxlIGV4aXN0cy5cbiAgLy8gUHJvamVjdHMgd2l0aCBtdWx0aXBsZSBEMSBkYXRhYmFzZXMgYXJlIG5vdCBzdXBwb3J0ZWQ6IHRoZSBoYXNoLW5hbWVkIGZpbGVzIGNhbm5vdCBiZVxuICAvLyBkaXN0aW5ndWlzaGVkIGNoZWFwbHkgKG1hdGVyaWFsaXphdGlvbiBkb2VzIG5vdCBldmVuIHVwZGF0ZSB0aGUgdGFyZ2V0IGZpbGUncyBtdGltZSkuXG4gIC8vIFRoZSBzdGF0ZSBkaXJlY3RvcnkgbXVzdCBiZSBhYnNvbHV0ZSBiZWNhdXNlIHRoZSB3cmFwcGVkIHNjcmlwdCBtYXkgYGNkYCB0byB0aGUgbW9ub3JlcG8gcm9vdC5cbiAgY29uc3Qgc3RhdGVEaXJQYXRoID0gcGF0aC5yZXNvbHZlKHByb2plY3QuZGlyUGF0aCwgZ2V0TG9jYWxXcmFuZ2xlclN0YXRlRGlyKHByb2plY3QpKTtcbiAgY29uc3QgZXhwb3J0Q29tbWFuZCA9IGBleHBvcnQgREFUQUJBU0VfVVJMPVwiZmlsZTokKGxzIFwiJHtzdGF0ZURpclBhdGh9XCIvdjMvZDEvbWluaWZsYXJlLUQxRGF0YWJhc2VPYmplY3QvKi5zcWxpdGUgfCBncmVwIC12IG1ldGFkYXRhIHwgaGVhZCAtMSlcImA7XG4gIHJldHVybiBgJHtidWlsZE1hdGVyaWFsaXplTG9jYWxEMUNvbW1hbmQocHJvamVjdCwgZGF0YWJhc2VOYW1lKX0gJiYgJHtleHBvcnRDb21tYW5kfSAmJiAke3NjcmlwdH1gO1xufVxuXG4vKipcbiAqIEdldCB0aGUgbmFtZSBvZiB0aGUgZmlyc3QgRDEgZGF0YWJhc2UgZGVjbGFyZWQgaW4gdGhlIHdyYW5nbGVyIGNvbmZpZyBmaWxlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0RDFEYXRhYmFzZU5hbWUocHJvamVjdDogUGljazxQcm9qZWN0LCAnZGlyUGF0aCc+KTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgY29uZmlnUGF0aCA9IGZpbmRXcmFuZ2xlckNvbmZpZ1BhdGgocHJvamVjdCk7XG4gIGlmICghY29uZmlnUGF0aCkgcmV0dXJuO1xuXG4gIC8vIENvdmVyIEpTT04oQykgKGBcImRhdGFiYXNlX25hbWVcIjogXCIuLi5cImApIGFuZCBUT01MLCBpbmNsdWRpbmcgaXRzIGlubGluZS10YWJsZSBmb3JtXG4gIC8vIChgZDFfZGF0YWJhc2VzID0gW3sgLi4uLCBkYXRhYmFzZV9uYW1lID0gXCIuLi5cIiB9XWApLCB3aXRob3V0IGZ1bGwgcGFyc2Vycy5cbiAgLy8gQ29tbWVudGVkLW91dCBsaW5lcyBhcmUgc2tpcHBlZCBzbyB0aGF0IHRoZXkgY2Fubm90IHNoYWRvdyB0aGUgYWN0aXZlIGRhdGFiYXNlIG5hbWUsXG4gIC8vIGFuZCB0aGUga2V5IG11c3QgZm9sbG93IGEgbGluZSBzdGFydCwgYHtgIG9yIGAsYCBzbyB0aGF0IHByb3NlIG1lbnRpb25pbmcgaXQgY2Fubm90IG1hdGNoLlxuICBmb3IgKGNvbnN0IGxpbmUgb2YgZnMucmVhZEZpbGVTeW5jKGNvbmZpZ1BhdGgsICd1dGY4Jykuc3BsaXQoJ1xcbicpKSB7XG4gICAgaWYgKC9eXFxzKig/OiN8XFwvXFwvKS91LnRlc3QobGluZSkpIGNvbnRpbnVlO1xuXG4gICAgY29uc3QgbWF0Y2ggPSAvKD86XnxbLHtdKVxccypbXCInXT9kYXRhYmFzZV9uYW1lW1wiJ10/XFxzKls6PV1cXHMqW1wiJ10oW15cIiddKylbXCInXS91LmV4ZWMobGluZSk7XG4gICAgaWYgKG1hdGNoKSByZXR1cm4gbWF0Y2hbMV07XG4gIH1cbiAgcmV0dXJuO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZmluZFdyYW5nbGVyQ29uZmlnUGF0aChwcm9qZWN0OiBQaWNrPFByb2plY3QsICdkaXJQYXRoJz4pOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAvLyBUZXN0cyBtYXkgcGFzcyBwYXJ0aWFsIFByb2plY3Qgb2JqZWN0cyB3aXRob3V0IGRpclBhdGguXG4gIGlmICghcHJvamVjdC5kaXJQYXRoKSByZXR1cm47XG5cbiAgZm9yIChjb25zdCBmaWxlTmFtZSBvZiB3cmFuZ2xlckNvbmZpZ0ZpbGVOYW1lcykge1xuICAgIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5qb2luKHByb2plY3QuZGlyUGF0aCwgZmlsZU5hbWUpO1xuICAgIGlmIChmcy5leGlzdHNTeW5jKGZpbGVQYXRoKSkgcmV0dXJuIGZpbGVQYXRoO1xuICB9XG4gIHJldHVybjtcbn1cblxuLyoqXG4gKiBHZXQgdGhlIHBhdGggb2YgdGhlIHdyYW5nbGVyLW5hdGl2ZSBEMSBtaWdyYXRpb25zIGRpcmVjdG9yeSAoYG1pZ3JhdGlvbnNfZGlyYCBpbiB0aGUgd3JhbmdsZXJcbiAqIGNvbmZpZywgZGVmYXVsdGluZyB0byBgbWlncmF0aW9uc2ApIGlmIGl0IGV4aXN0cyBvbiBkaXNrLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZmluZEQxTWlncmF0aW9uc0RpclBhdGgocHJvamVjdDogUGljazxQcm9qZWN0LCAnZGlyUGF0aCc+KTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgY29uZmlnUGF0aCA9IGZpbmRXcmFuZ2xlckNvbmZpZ1BhdGgocHJvamVjdCk7XG4gIGlmICghY29uZmlnUGF0aCkgcmV0dXJuO1xuXG4gIGxldCBtaWdyYXRpb25zRGlyID0gJ21pZ3JhdGlvbnMnO1xuICBmb3IgKGNvbnN0IGxpbmUgb2YgZnMucmVhZEZpbGVTeW5jKGNvbmZpZ1BhdGgsICd1dGY4Jykuc3BsaXQoJ1xcbicpKSB7XG4gICAgaWYgKC9eXFxzKig/OiN8XFwvXFwvKS91LnRlc3QobGluZSkpIGNvbnRpbnVlO1xuXG4gICAgY29uc3QgbWF0Y2ggPSAvKD86XnxbLHtdKVxccypbXCInXT9taWdyYXRpb25zX2RpcltcIiddP1xccypbOj1dXFxzKltcIiddKFteXCInXSspW1wiJ10vdS5leGVjKGxpbmUpO1xuICAgIGlmIChtYXRjaCkge1xuICAgICAgbWlncmF0aW9uc0RpciA9IG1hdGNoWzFdIGFzIHN0cmluZztcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuICBjb25zdCBtaWdyYXRpb25zRGlyUGF0aCA9IHBhdGguam9pbihwcm9qZWN0LmRpclBhdGgsIG1pZ3JhdGlvbnNEaXIpO1xuICByZXR1cm4gZnMuZXhpc3RzU3luYyhtaWdyYXRpb25zRGlyUGF0aCkgPyBtaWdyYXRpb25zRGlyUGF0aCA6IHVuZGVmaW5lZDtcbn1cblxuLyoqXG4gKiBCdWlsZCBhIGNvbW1hbmQgbWF0ZXJpYWxpemluZyB0aGUgbG9jYWwgbWluaWZsYXJlIEQxIFNRTGl0ZSBmaWxlLlxuICogQSBuby1vcCBxdWVyeSBmb3JjZXMgbWluaWZsYXJlIHRvIGNyZWF0ZSB0aGUgU1FMaXRlIGZpbGUgaWYgaXQgZG9lc24ndCBleGlzdCB5ZXQuXG4gKiBPbmx5IHN0ZG91dCBpcyBzdXBwcmVzc2VkOyB3cmFuZ2xlciByZXBvcnRzIGVycm9ycyBvbiBzdGRlcnIsIHdoaWNoIG11c3Qgc3RheSB2aXNpYmxlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gYnVpbGRNYXRlcmlhbGl6ZUxvY2FsRDFDb21tYW5kKHByb2plY3Q6IFBpY2s8UHJvamVjdCwgJ2Vudic+LCBkYXRhYmFzZU5hbWU6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiBgWUFSTiB3cmFuZ2xlciBkMSBleGVjdXRlICR7ZGF0YWJhc2VOYW1lfSAtLWxvY2FsIC0tcGVyc2lzdC10byBcIiR7Z2V0TG9jYWxXcmFuZ2xlclN0YXRlRGlyKHByb2plY3QpfVwiIC0tY29tbWFuZCBcIlNFTEVDVCAxXCIgPiAvZGV2L251bGxgO1xufVxuXG4vKipcbiAqIEdldCB0aGUgbG9jYWwgd3JhbmdsZXIvbWluaWZsYXJlIHN0YXRlIGRpcmVjdG9yeS5cbiAqIERldmVsb3BtZW50IGZvbGxvd3Mgd3JhbmdsZXIncyBkZWZhdWx0IGRpcmVjdG9yeSBzbyB0aGF0IHBsYWluIGB3cmFuZ2xlciBkZXZgIC8gYHZpbmV4dCBkZXZgXG4gKiAod2l0aG91dCBhIHBlcnNpc3QtcGF0aCBvdmVycmlkZSkgc2hhcmVzIHRoZSBzYW1lIGRhdGFiYXNlIGFzIHdiLW1hbmFnZWQgZGIgY29tbWFuZHMuXG4gKiBPdGhlciBlbnZpcm9ubWVudHMgKGUuZy4gdGVzdCkgZ2V0IHRoZWlyIG93biBkaXJlY3Rvcnkgc28gdGhhdCB0aGV5IGNhbiBiZSByZXNldFxuICogd2l0aG91dCBkZXN0cm95aW5nIGRldmVsb3BtZW50IHN0YXRlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0TG9jYWxXcmFuZ2xlclN0YXRlRGlyKHByb2plY3Q6IFBpY2s8UHJvamVjdCwgJ2Vudic+KTogc3RyaW5nIHtcbiAgLy8gRGVzdHJ1Y3RpdmUgdGVzdCByZXNldHMgYXJlIGdhdGVkIG9uIGlzUHJvamVjdEVudmlyb25tZW50KHByb2plY3QsICd0ZXN0JyksIHdoaWNoIGFjY2VwdHNcbiAgLy8gZWl0aGVyIFdCX0VOViBvciBNSVNFX0VOVjsgcmVzb2x2ZSB0byB0aGUgdGVzdCBkaXJlY3Rvcnkgd2hlbmV2ZXIgZWl0aGVyIHNheXMgJ3Rlc3QnIHNvXG4gIC8vIHRoYXQgc3VjaCByZXNldHMgY2FuIG5ldmVyIHRhcmdldCB0aGUgZGV2ZWxvcG1lbnQgc3RhdGUuXG4gIGNvbnN0IHdiRW52ID0gW3Byb2plY3QuZW52LldCX0VOViwgcHJvamVjdC5lbnYuTUlTRV9FTlZdLmluY2x1ZGVzKCd0ZXN0JylcbiAgICA/ICd0ZXN0J1xuICAgIDogcHJvamVjdC5lbnYuV0JfRU5WIHx8IHByb2plY3QuZW52Lk1JU0VfRU5WO1xuICByZXR1cm4gIXdiRW52IHx8IHdiRW52ID09PSAnZGV2ZWxvcG1lbnQnID8gJy53cmFuZ2xlci9zdGF0ZScgOiBgLndyYW5nbGVyL3N0YXRlLSR7d2JFbnZ9YDtcbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB7IGdldEFic29sdXRlRmlsZURhdGFiYXNlVXJsUGF0aCwgaXNQcm9qZWN0RW52aXJvbm1lbnQsIHR5cGUgUHJvamVjdCB9IGZyb20gJy4uL3Byb2plY3QuanMnO1xuaW1wb3J0IHsgYnVpbGRTaGVsbENvbW1hbmQgfSBmcm9tICcuLi91dGlscy9zaGVsbC5qcyc7XG5pbXBvcnQgeyBidWlsZE1hdGVyaWFsaXplTG9jYWxEMUNvbW1hbmQsIGdldEQxRGF0YWJhc2VOYW1lLCBnZXRMb2NhbFdyYW5nbGVyU3RhdGVEaXIgfSBmcm9tICcuLi91dGlscy93cmFuZ2xlci5qcyc7XG5cbmNvbnN0IExJVEVTVFJFQU1fQ09ORklHX0ZJTEVfTkFNRSA9ICdsaXRlc3RyZWFtLnltbCc7XG5jb25zdCBERUZBVUxUX0xJVEVTVFJFQU1fQ09ORklHX1BBVEggPSAnL2V0Yy9saXRlc3RyZWFtLnltbCc7XG5cbmNsYXNzIERyaXp6bGVTY3JpcHRzIHtcbiAgY2xlYW5VcExpdGVzdHJlYW0ocHJvamVjdDogUHJvamVjdCk6IHN0cmluZyB7XG4gICAgY29uc3QgZGJQYXRoID0gZ2V0QWJzb2x1dGVTcWxpdGVEYlBhdGgocHJvamVjdCwgJ2NsZWFudXAtbGl0ZXN0cmVhbScpO1xuICAgIGNvbnN0IHdhbENoZWNrcG9pbnRDb21tYW5kID0gYGlmIFsgLWYgXCIke2RiUGF0aH1cIiBdICYmIGNvbW1hbmQgLXYgc3FsaXRlMyA+L2Rldi9udWxsOyB0aGVuIHByaW50ZiAnUFJBR01BIHdhbF9jaGVja3BvaW50KFRSVU5DQVRFKTsnIHwgc3FsaXRlMyBcIiR7ZGJQYXRofVwiOyBmaWA7XG4gICAgcmV0dXJuIGAke3dhbENoZWNrcG9pbnRDb21tYW5kfTsgcm0gLWYgXCIke2RiUGF0aH1cIi4qIFwiJHtkYlBhdGh9XCItKjsgcm0gLVJmIFwiJHtwYXRoLmRpcm5hbWUoZGJQYXRoKX0vLiR7cGF0aC5iYXNlbmFtZShkYlBhdGgpfVwiKiB8fCB0cnVlYDtcbiAgfVxuXG4gIHJlc2V0KHByb2plY3Q6IFByb2plY3QsIGFkZGl0aW9uYWxPcHRpb25zID0gJycpOiBzdHJpbmcge1xuICAgIGNvbnN0IGQxRGF0YWJhc2VOYW1lID0gZ2V0RDFEYXRhYmFzZU5hbWUocHJvamVjdCk7XG4gICAgaWYgKGQxRGF0YWJhc2VOYW1lKSB7XG4gICAgICAvLyBSZW1vdmUgb25seSB0aGUgRDEgc3VidHJlZSBzbyB0aGF0IG90aGVyIGxvY2FsbHktcGVyc2lzdGVkIGJpbmRpbmdzIChLViwgUjIsIER1cmFibGUgT2JqZWN0cykgc3Vydml2ZSxcbiAgICAgIC8vIHRoZW4gcmUtbWF0ZXJpYWxpemUgdGhlIEQxIFNRTGl0ZSBmaWxlLiBJdHMgcGF0aCBpcyBkZXRlcm1pbmlzdGljLCBzbyBhIERBVEFCQVNFX1VSTCBleHBvcnRlZFxuICAgICAgLy8gYmVmb3JlIHRoZSByZW1vdmFsIHN0YXlzIHZhbGlkLlxuICAgICAgcmV0dXJuIGBybSAtUmYgXCIke2dldExvY2FsV3JhbmdsZXJTdGF0ZURpcihwcm9qZWN0KX0vdjMvZDFcIiAmJiAke2J1aWxkTWF0ZXJpYWxpemVMb2NhbEQxQ29tbWFuZChwcm9qZWN0LCBkMURhdGFiYXNlTmFtZSl9ICYmICR7dGhpcy5taWdyYXRlKHByb2plY3QsIGFkZGl0aW9uYWxPcHRpb25zKX1gO1xuICAgIH1cblxuICAgIGNvbnN0IHJlbW92ZUNvbW1hbmQgPSBidWlsZFJlbW92ZVNxbGl0ZURiQ29tbWFuZChwcm9qZWN0KTtcbiAgICBpZiAoIXJlbW92ZUNvbW1hbmQpIHtcbiAgICAgIHJldHVybiBcImVjaG8gJ3diIGRiIHJlc2V0IHN1cHBvcnRzIERyaXp6bGUgb25seSB3aGVuIGZpbGU6IERBVEFCQVNFX1VSTCBpcyBzZXQuJyAmJiBleGl0IDFcIjtcbiAgICB9XG5cbiAgICByZXR1cm4gYCR7cmVtb3ZlQ29tbWFuZH0gJiYgJHt0aGlzLm1pZ3JhdGUocHJvamVjdCwgYWRkaXRpb25hbE9wdGlvbnMpfWA7XG4gIH1cblxuICBtaWdyYXRlKHByb2plY3Q6IFByb2plY3QsIGFkZGl0aW9uYWxPcHRpb25zID0gJycpOiBzdHJpbmcge1xuICAgIGNvbnN0IHNlZWRDb21tYW5kID0gdGhpcy5zZWVkKHByb2plY3QpO1xuICAgIGNvbnN0IG1pZ3JhdGVDb21tYW5kID0gdGhpcy5kZXBsb3kocHJvamVjdCwgYWRkaXRpb25hbE9wdGlvbnMpO1xuICAgIHJldHVybiBzZWVkQ29tbWFuZCA9PT0gJ3RydWUnID8gbWlncmF0ZUNvbW1hbmQgOiBgJHttaWdyYXRlQ29tbWFuZH0gJiYgJHtzZWVkQ29tbWFuZH1gO1xuICB9XG5cbiAgbWlncmF0ZUZvclN0YXJ0KHByb2plY3Q6IFByb2plY3QsIGFkZGl0aW9uYWxPcHRpb25zID0gJycpOiBzdHJpbmcge1xuICAgIGlmIChpc1Byb2plY3RFbnZpcm9ubWVudChwcm9qZWN0LCAndGVzdCcpICYmIChidWlsZFJlbW92ZVNxbGl0ZURiQ29tbWFuZChwcm9qZWN0KSB8fCBnZXREMURhdGFiYXNlTmFtZShwcm9qZWN0KSkpIHtcbiAgICAgIHJldHVybiB0aGlzLnJlc2V0KHByb2plY3QsIGFkZGl0aW9uYWxPcHRpb25zKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMubWlncmF0ZShwcm9qZWN0LCBhZGRpdGlvbmFsT3B0aW9ucyk7XG4gIH1cblxuICBkZXBsb3kocHJvamVjdDogUHJvamVjdCwgYWRkaXRpb25hbE9wdGlvbnMgPSAnJyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGJ1aWxkRHJpenpsZUtpdENvbW1hbmQocHJvamVjdCwgYG1pZ3JhdGUgJHthZGRpdGlvbmFsT3B0aW9uc31gLnRyaW0oKSk7XG4gIH1cblxuICBkZXBsb3lGb3JjZShwcm9qZWN0OiBQcm9qZWN0KTogc3RyaW5nIHtcbiAgICBjb25zdCBkYlBhdGggPSBnZXRBYnNvbHV0ZVNxbGl0ZURiUGF0aChwcm9qZWN0LCAnZGVwbG95LWZvcmNlJyk7XG4gICAgY29uc3QgcmVtb3ZlRGJDb21tYW5kID0gYnVpbGRSZW1vdmVTcWxpdGVEYkZhbWlseUNvbW1hbmQoZGJQYXRoKTtcbiAgICBjb25zdCBsaXRlc3RyZWFtQ29uZmlnT3B0aW9uID0gZ2V0TGl0ZXN0cmVhbUNvbmZpZ09wdGlvbihwcm9qZWN0KTtcbiAgICAvLyBUaGUgZW52aXJvbm1lbnQgYXNzaWdubWVudCBtdXN0IGdvIHRocm91Z2ggYnVpbGREcml6emxlS2l0Q29tbWFuZDogcHJlZml4aW5nIGl0c1xuICAgIC8vIHBvc3NpYmx5LXBhcmVudGhlc2l6ZWQgcmVzdWx0IHdpdGggYEFMTE9XX1RPX1NLSVBfU0VFRD0wYCB3b3VsZCBiZSBhIHNoZWxsIHN5bnRheCBlcnJvci5cbiAgICBjb25zdCBtaWdyYXRlV2l0aFNlZWRDb21tYW5kID0gYnVpbGREcml6emxlS2l0Q29tbWFuZChwcm9qZWN0LCAnbWlncmF0ZScsICdBTExPV19UT19TS0lQX1NFRUQ9MCcpO1xuICAgIHJldHVybiBgJHtyZW1vdmVEYkNvbW1hbmR9OyAke3RoaXMuZGVwbG95KHByb2plY3QpfSAmJiAke3JlbW92ZURiQ29tbWFuZH1cbiAgICAgICYmIGxpdGVzdHJlYW0gcmVzdG9yZSAke2xpdGVzdHJlYW1Db25maWdPcHRpb259IC1vIFwiJHtkYlBhdGh9XCIgXCIke2RiUGF0aH1cIiAmJiBscyAtYWhsIFwiJHtkYlBhdGh9XCIgJiYgJHttaWdyYXRlV2l0aFNlZWRDb21tYW5kfWA7XG4gIH1cblxuICBsaXN0QmFja3Vwcyhwcm9qZWN0OiBQcm9qZWN0LCBjb25maWdQYXRoPzogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBjb25zdCBkYlBhdGggPSBnZXRBYnNvbHV0ZVNxbGl0ZURiUGF0aChwcm9qZWN0LCAnbGlzdC1iYWNrdXBzJyk7XG4gICAgcmV0dXJuIGBsaXRlc3RyZWFtIGx0eCAke2dldExpdGVzdHJlYW1Db25maWdPcHRpb24ocHJvamVjdCwgY29uZmlnUGF0aCl9IFwiJHtkYlBhdGh9XCJgO1xuICB9XG5cbiAgcmVzdG9yZShwcm9qZWN0OiBQcm9qZWN0LCBvdXRwdXRQYXRoOiBzdHJpbmcsIGNvbmZpZ1BhdGg/OiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGNvbnN0IGRiUGF0aCA9IGdldEFic29sdXRlU3FsaXRlRGJQYXRoKHByb2plY3QsICdyZXN0b3JlJyk7XG4gICAgcmV0dXJuIGAke2J1aWxkUmVtb3ZlU3FsaXRlRGJDb21tYW5kRm9yUGF0aChvdXRwdXRQYXRoKX07IGxpdGVzdHJlYW0gcmVzdG9yZSAke2dldExpdGVzdHJlYW1Db25maWdPcHRpb24ocHJvamVjdCwgY29uZmlnUGF0aCl9IC1vIFwiJHtvdXRwdXRQYXRofVwiIFwiJHtkYlBhdGh9XCJgO1xuICB9XG5cbiAgZ2VuZXJhdGUocHJvamVjdDogUHJvamVjdCwgYWRkaXRpb25hbE9wdGlvbnMgPSAnJyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGJ1aWxkRHJpenpsZUtpdENvbW1hbmQocHJvamVjdCwgYGdlbmVyYXRlICR7YWRkaXRpb25hbE9wdGlvbnN9YC50cmltKCkpO1xuICB9XG5cbiAgbWlncmF0ZURldihwcm9qZWN0OiBQcm9qZWN0LCBhZGRpdGlvbmFsT3B0aW9ucyA9ICcnKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5nZW5lcmF0ZShwcm9qZWN0LCBhZGRpdGlvbmFsT3B0aW9ucyk7XG4gIH1cblxuICBzZWVkKHByb2plY3Q6IFByb2plY3QsIHNjcmlwdFBhdGg/OiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGlmIChzY3JpcHRQYXRoKSByZXR1cm4gYEJVTiBidWlsZC10cyBydW4gJHtzY3JpcHRQYXRofWA7XG4gICAgaWYgKHByb2plY3QucGFja2FnZUpzb24uc2NyaXB0cz8uc2VlZCkgcmV0dXJuICdZQVJOIHJ1biBzZWVkJztcbiAgICBjb25zdCBkZWZhdWx0U2VlZFBhdGggPSBwYXRoLmpvaW4oJ2RiJywgJ3NlZWQudHMnKTtcbiAgICBpZiAoZnMuZXhpc3RzU3luYyhwYXRoLmpvaW4ocHJvamVjdC5kaXJQYXRoLCBkZWZhdWx0U2VlZFBhdGgpKSkge1xuICAgICAgcmV0dXJuIHByb2plY3QudXNlc0J1blBhY2thZ2VNYW5hZ2VyID8gYEJVTiAke2RlZmF1bHRTZWVkUGF0aH1gIDogYEJVTiBidWlsZC10cyBydW4gJHtkZWZhdWx0U2VlZFBhdGh9YDtcbiAgICB9XG4gICAgcmV0dXJuICd0cnVlJztcbiAgfVxuXG4gIHN0dWRpbyhwcm9qZWN0OiBQcm9qZWN0LCBkYlVybE9yUGF0aD86IHN0cmluZywgYWRkaXRpb25hbE9wdGlvbnMgPSAnJyk6IHN0cmluZyB7XG4gICAgaWYgKGRiVXJsT3JQYXRoKSB7XG4gICAgICByZXR1cm4gXCJlY2hvICd3YiBkYiBzdHVkaW8gZm9yIERyaXp6bGUgZG9lcyBub3Qgc3VwcG9ydCBkYi11cmwtb3ItcGF0aC4nICYmIGV4aXQgMVwiO1xuICAgIH1cblxuICAgIHJldHVybiBidWlsZERyaXp6bGVLaXRDb21tYW5kKHByb2plY3QsIGBzdHVkaW8gJHthZGRpdGlvbmFsT3B0aW9uc31gLnRyaW0oKSk7XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGJ1aWxkRHJpenpsZUtpdENvbW1hbmQocHJvamVjdDogUHJvamVjdCwgYXJnczogc3RyaW5nLCBlbnZpcm9ubWVudEFzc2lnbm1lbnQgPSAnJyk6IHN0cmluZyB7XG4gIGNvbnN0IGNvbW1hbmQgPSBgJHtlbnZpcm9ubWVudEFzc2lnbm1lbnQgJiYgYCR7ZW52aXJvbm1lbnRBc3NpZ25tZW50fSBgfVlBUk4gZHJpenpsZS1raXQgJHthcmdzfWA7XG4gIC8vIEEgY2FsbGVyLXN1cHBsaWVkIC0tY29uZmlnIHJlc29sdmVzIGFnYWluc3QgdGhlIHByb2plY3QgZGlyZWN0b3J5LCBzbyB0aGUgY3dkIG11c3Qgc3RheSB0aGVyZS5cbiAgcmV0dXJuIGFyZ3MuaW5jbHVkZXMoJy0tY29uZmlnJykgPyBjb21tYW5kIDogd3JhcFdpdGhEcml6emxlQ29uZmlnRGlyKHByb2plY3QsIGNvbW1hbmQpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gd3JhcFdpdGhEcml6emxlQ29uZmlnRGlyKHByb2plY3Q6IFByb2plY3QsIGNvbW1hbmQ6IHN0cmluZyk6IHN0cmluZyB7XG4gIGNvbnN0IGNvbmZpZyA9IGZpbmREcml6emxlQ29uZmlnKHByb2plY3QpO1xuICAvLyBkcml6emxlLWtpdCByZXNvbHZlcyByZWxhdGl2ZSBwYXRocyBpbiBpdHMgY29uZmlnIGFnYWluc3QgdGhlIGN3ZCwgc28gdGhlIGNvbW1hbmQgbXVzdCBydW5cbiAgLy8gaW4gdGhlIGRpcmVjdG9yeSBjb250YWluaW5nIGRyaXp6bGUuY29uZmlnLiogZXZlbiB3aGVuIG1vbm9yZXBvIHBhY2thZ2VzIHNoYXJlIGl0IGF0IHRoZSByb290LlxuICByZXR1cm4gY29uZmlnICYmIGNvbmZpZy5kaXJQYXRoICE9PSBwcm9qZWN0LmRpclBhdGhcbiAgICA/IGAoJHtidWlsZFNoZWxsQ29tbWFuZChbJ2NkJywgY29uZmlnLmRpclBhdGhdKX0gJiYgJHtjb21tYW5kfSlgXG4gICAgOiBjb21tYW5kO1xufVxuXG4vKipcbiAqIFdoZXRoZXIgZHJpenpsZS1raXQgaXMgdGhlIHByb2plY3QncyBEMSBtaWdyYXRpb24gbWVjaGFuaXNtLiBBIGRyaXp6bGUtb3JtIGRlcGVuZGVuY3kgYWxvbmUgaXNcbiAqIG5vdCBhIHJlbGlhYmxlIG1hcmtlcjogYSBXb3JrZXIgbWF5IHVzZSBEMSBvbmx5IGZvciBjYWNoaW5nIHdoaWxlIGl0cyBkcml6emxlIGNvbmZpZyB0YXJnZXRzIGFuXG4gKiB1bnJlbGF0ZWQgZGF0YWJhc2UgKGUuZy4gUG9zdGdyZVNRTCB2aWEgSHlwZXJkcml2ZSksIGFuZCBydW5uaW5nIGBkcml6emxlLWtpdCBtaWdyYXRlYCBhZ2FpbnN0XG4gKiB0aGF0IGRhdGFiYXNlIGR1cmluZyBhIEQxIGRlcGxveSB3b3VsZCBiZSB3cm9uZyAoaHR0cHM6Ly9naXRodWIuY29tL1dpbGxCb29zdGVyL3NoYXJlZC9pc3N1ZXMvOTQyKS5cbiAqIFNvIHJlcXVpcmUgYW4gZXhwbGljaXQgbWFya2VyOiBhIGRyaXp6bGUgY29uZmlnIHdob3NlIGRpYWxlY3QvZHJpdmVyIHRhcmdldHMgc3FsaXRlLCBkMS1odHRwLCBvclxuICogZHVyYWJsZS1zcWxpdGUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1c2VzRHJpenpsZUtpdEZvckQxKHByb2plY3Q6IFByb2plY3QpOiBib29sZWFuIHtcbiAgaWYgKCFwcm9qZWN0Lmhhc0RyaXp6bGUpIHJldHVybiBmYWxzZTtcblxuICBjb25zdCBjb25maWcgPSBmaW5kRHJpenpsZUNvbmZpZyhwcm9qZWN0KTtcbiAgaWYgKCFjb25maWcpIHJldHVybiBmYWxzZTtcblxuICB0cnkge1xuICAgIGNvbnN0IGNvbnRlbnQgPSBzdHJpcEpzQ29tbWVudHMoZnMucmVhZEZpbGVTeW5jKHBhdGguam9pbihjb25maWcuZGlyUGF0aCwgY29uZmlnLmZpbGVOYW1lKSwgJ3V0ZjgnKSk7XG4gICAgLy8gU2NhbiBvbmx5IHRoZSBleHBvcnRlZCBjb25maWcncyBvYmplY3QgbGl0ZXJhbDogZHJpenpsZS1raXQgY29uc3VtZXMgdGhlIGRlZmF1bHQgZXhwb3J0LFxuICAgIC8vIGFuZCBtYXRjaGluZyBvdGhlciB0ZXh0IChhbiB1bnVzZWQgc3FsaXRlLXNoYXBlZCBjb25zdGFudCBhYm92ZSB0aGUgZXhwb3J0LCBvciBtYXJrZXItbGlrZVxuICAgIC8vIHN0cmluZyBjb250ZW50IGluIHN0YXRlbWVudHMgYWZ0ZXIgaXQpIHdvdWxkIHNlbGVjdCB0aGUgd3JvbmcgbWlncmF0aW9uIG1lY2hhbmlzbS5cbiAgICAvLyBQT1NJVElPTlMgKGV4cG9ydCBtYXJrZXJzLCBkZWNsYXJhdGlvbnMpIGFyZSBsb2NhdGVkIG9uIGEgc3RyaW5nLW1hc2tlZCB2aWV3IG9mIHRoZSBzYW1lXG4gICAgLy8gbGVuZ3RoLCBzbyBgZXhwb3J0IGRlZmF1bHRgIGluc2lkZSBhIHN0cmluZyBsaXRlcmFsIGNhbm5vdCBtaXNsZWFkIHRoZSBzZWFyY2guXG4gICAgY29uc3QgbWFza2VkQ29udGVudCA9IG1hc2tTdHJpbmdDb250ZW50cyhjb250ZW50KTtcbiAgICBjb25zdCBleHBvcnRJbmRpY2VzID0gWydleHBvcnQgZGVmYXVsdCcsICdtb2R1bGUuZXhwb3J0cyddXG4gICAgICAubWFwKChtYXJrZXIpID0+IG1hc2tlZENvbnRlbnQuaW5kZXhPZihtYXJrZXIpKVxuICAgICAgLmZpbHRlcigoaW5kZXgpID0+IGluZGV4ICE9PSAtMSk7XG4gICAgY29uc3QgZXhwb3J0U3RhcnRJbmRleCA9IGV4cG9ydEluZGljZXMubGVuZ3RoID4gMCA/IE1hdGgubWluKC4uLmV4cG9ydEluZGljZXMpIDogMDtcbiAgICBjb25zdCBvYmplY3RTcGFuID0gZXh0cmFjdEV4cG9ydGVkQ29uZmlnT2JqZWN0KGNvbnRlbnQsIG1hc2tlZENvbnRlbnQsIGV4cG9ydFN0YXJ0SW5kZXgpO1xuICAgIHJldHVybiBvYmplY3RTcGFuICE9PSB1bmRlZmluZWQgJiYgZGVjbGFyZXNTcWxpdGVUYXJnZXQob2JqZWN0U3Bhbik7XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxufVxuXG4vKipcbiAqIFRoZSBvYmplY3QgbGl0ZXJhbCB0aGUgZXhwb3J0IGFjdHVhbGx5IGV2YWx1YXRlcyB0bzogZm9yIGBleHBvcnQgZGVmYXVsdCB7Li4ufWAgb3JcbiAqIGBleHBvcnQgZGVmYXVsdCBkZWZpbmVDb25maWcoey4uLn0pYCB0aGUgZmlyc3QgYmFsYW5jZWQgb2JqZWN0IGFmdGVyIHRoZSBtYXJrZXIsIGFuZCBmb3JcbiAqIGBleHBvcnQgZGVmYXVsdCBjb25maWc7YCB0aGUgaW5pdGlhbGl6ZXIgb2YgdGhhdCBpZGVudGlmaWVyJ3MgZGVjbGFyYXRpb24g4oCUIG5ldmVyIHRoZSB3aG9sZVxuICogZmlsZSwgc2luY2UgYW4gdW5yZWxhdGVkIG9iamVjdCAoZS5nLiBhbiB1bnVzZWQgc3FsaXRlLXNoYXBlZCBjb25zdGFudCkgbXVzdCBub3QgYmUgc2VsZWN0ZWQuXG4gKiBVbmRlZmluZWQgd2hlbiB0aGUgZXhwcmVzc2lvbiBjYW5ub3QgYmUgcmVzb2x2ZWQ7IHdiIGRlcGxveSdzIHVubWFuYWdlZC1EMSB3YXJuaW5nIGNvdmVycyB0aGF0LlxuICovXG5mdW5jdGlvbiBleHRyYWN0RXhwb3J0ZWRDb25maWdPYmplY3QoXG4gIGNvbnRlbnQ6IHN0cmluZyxcbiAgbWFza2VkQ29udGVudDogc3RyaW5nLFxuICBleHBvcnRTdGFydEluZGV4OiBudW1iZXJcbik6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IGV4cG9ydGVkRXhwcmVzc2lvbiA9IG1hc2tlZENvbnRlbnRcbiAgICAuc2xpY2UoZXhwb3J0U3RhcnRJbmRleClcbiAgICAucmVwbGFjZSgvXig/OmV4cG9ydFxccytkZWZhdWx0fG1vZHVsZVxcLmV4cG9ydHNcXHMqPSlcXHMqLywgJycpO1xuICAvLyBBbiBpZGVudGlmaWVyIGV4cG9ydCBtYXkgY2FycnkgYSBUeXBlU2NyaXB0IHR5cGUgcG9zdGZpeCAoYGNvbmZpZyBzYXRpc2ZpZXMgQ29uZmlnO2AgL1xuICAvLyBgY29uZmlnIGFzIENvbmZpZztgKTsgdGhlIGlkZW50aWZpZXIgaXMgcmVjb2duaXplZCBGSVJTVCBzbyBhIHBvc3RmaXggY29udGFpbmluZyBhIFRZUEVcbiAgLy8gbGl0ZXJhbCAoYHNhdGlzZmllcyB7IGRpYWxlY3Q6ICdzcWxpdGUnIHwgLi4uIH1gKSBpcyBuZXZlciBtaXN0YWtlbiBmb3IgdGhlIHJ1bnRpbWUgY29uZmlnLlxuICBjb25zdCBpZGVudGlmaWVyTWF0Y2ggPSAvXihbQS1aYS16XyRdW1xcdyRdKilcXHMqKD86c2F0aXNmaWVzXFxifGFzXFxifDt8XFxufCQpLy5leGVjKGV4cG9ydGVkRXhwcmVzc2lvbik7XG4gIGlmICghaWRlbnRpZmllck1hdGNoKSB7XG4gICAgY29uc3QgYnJhY2VPZmZzZXQgPSBtYXNrZWRDb250ZW50LnNsaWNlKGV4cG9ydFN0YXJ0SW5kZXgpLmluZGV4T2YoJ3snKTtcbiAgICBpZiAoYnJhY2VPZmZzZXQgPT09IC0xKSByZXR1cm47XG4gICAgcmV0dXJuIGV4dHJhY3RGaXJzdEJhbGFuY2VkT2JqZWN0KGNvbnRlbnQuc2xpY2UoZXhwb3J0U3RhcnRJbmRleCArIGJyYWNlT2Zmc2V0KSk7XG4gIH1cblxuICAvLyBgJGAgaXMgbGVnYWwgaW4gaWRlbnRpZmllcnMgYnV0IGEgcmVnZXggYW5jaG9yLCBzbyBpdCBtdXN0IGJlIGVzY2FwZWQgYmVmb3JlIGludGVycG9sYXRpb247XG4gIC8vIGAoPyFbXFx3JF0pYCAobm90IGBcXGJgKSBlbmRzIHRoZSBtYXRjaCBiZWNhdXNlIGBcXGJgIG5ldmVyIGZpcmVzIGFmdGVyIGEgdHJhaWxpbmcgYCRgLlxuICBjb25zdCBlc2NhcGVkSWRlbnRpZmllciA9IGlkZW50aWZpZXJNYXRjaFsxXSEucmVwbGFjZUFsbCgnJCcsIFN0cmluZy5yYXdgXFwkYCk7XG4gIGNvbnN0IGRlY2xhcmF0aW9uRW5kSW5kZXggPSBmaW5kTW9kdWxlU2NvcGVEZWNsYXJhdGlvbkVuZChtYXNrZWRDb250ZW50LCBlc2NhcGVkSWRlbnRpZmllcik7XG4gIGlmIChkZWNsYXJhdGlvbkVuZEluZGV4ID09PSB1bmRlZmluZWQpIHJldHVybjtcbiAgLy8gVGhlIGluaXRpYWxpemVyIG11c3QgYmVsb25nIHRvIFRISVMgZGVjbGFyYXRpb24gKGEgdHlwZSBhbm5vdGF0aW9uIG1heSBwcmVjZWRlIHRoZSBgPWApOyBhblxuICAvLyB1bmluaXRpYWxpemVkIGBsZXQgY29uZmlnO2Agc3RheXMgdW5yZXNvbHZlZCBpbnN0ZWFkIG9mIGdyYWJiaW5nIGEgbGF0ZXIgc3RhdGVtZW50J3MgYD1gLlxuICBjb25zdCBhc3NpZ25tZW50TWF0Y2ggPSAvXlxccyooPzo6W149O1xcbl0qKT89Ly5leGVjKG1hc2tlZENvbnRlbnQuc2xpY2UoZGVjbGFyYXRpb25FbmRJbmRleCkpO1xuICBpZiAoIWFzc2lnbm1lbnRNYXRjaCkgcmV0dXJuO1xuICByZXR1cm4gZXh0cmFjdEZpcnN0QmFsYW5jZWRPYmplY3QoY29udGVudC5zbGljZShkZWNsYXJhdGlvbkVuZEluZGV4ICsgYXNzaWdubWVudE1hdGNoWzBdLmxlbmd0aCkpO1xufVxuXG4vKipcbiAqIFRoZSBlbmQgaW5kZXggb2YgdGhlIGlkZW50aWZpZXIncyBkZWNsYXJhdGlvbiBhdCBicmFjZSBkZXB0aCBaRVJPIChtb2R1bGUgc2NvcGUpOiBhIHNhbWUtbmFtZWRcbiAqIGRlY2xhcmF0aW9uIGluc2lkZSBhIGZ1bmN0aW9uIGJvZHkgbXVzdCBub3Qgc2hhZG93IHRoZSBiaW5kaW5nIHRoZSBleHBvcnQgcmVmZXJlbmNlcywgYW5kXG4gKiBpbmRlbnRhdGlvbiBpcyBubyBzY29wZSBzaWduYWwg4oCUIGRlcHRoIG92ZXIgdGhlIHN0cmluZy1tYXNrZWQgY29udGVudCBpcy5cbiAqL1xuZnVuY3Rpb24gZmluZE1vZHVsZVNjb3BlRGVjbGFyYXRpb25FbmQobWFza2VkQ29udGVudDogc3RyaW5nLCBlc2NhcGVkSWRlbnRpZmllcjogc3RyaW5nKTogbnVtYmVyIHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgZGVjbGFyYXRpb25SZWdleCA9IG5ldyBSZWdFeHAoXG4gICAgU3RyaW5nLnJhd2AoPzwhW1xcdyRdKSg/OmV4cG9ydFxccyspPyg/OmNvbnN0fGxldHx2YXIpXFxzKyR7ZXNjYXBlZElkZW50aWZpZXJ9KD8hW1xcdyRdKWAsXG4gICAgJ2cnXG4gICk7XG4gIGxldCBkZXB0aCA9IDA7XG4gIGxldCBzY2FuSW5kZXggPSAwO1xuICBmb3IgKGxldCBtYXRjaCA9IGRlY2xhcmF0aW9uUmVnZXguZXhlYyhtYXNrZWRDb250ZW50KTsgbWF0Y2g7IG1hdGNoID0gZGVjbGFyYXRpb25SZWdleC5leGVjKG1hc2tlZENvbnRlbnQpKSB7XG4gICAgZm9yICg7IHNjYW5JbmRleCA8IG1hdGNoLmluZGV4OyBzY2FuSW5kZXgrKykge1xuICAgICAgY29uc3QgY2hhciA9IG1hc2tlZENvbnRlbnRbc2NhbkluZGV4XTtcbiAgICAgIGlmIChjaGFyID09PSAneycpIGRlcHRoKys7XG4gICAgICBlbHNlIGlmIChjaGFyID09PSAnfScpIGRlcHRoLS07XG4gICAgfVxuICAgIGlmIChkZXB0aCA9PT0gMCkgcmV0dXJuIG1hdGNoLmluZGV4ICsgbWF0Y2hbMF0ubGVuZ3RoO1xuICB9XG4gIHJldHVybjtcbn1cblxuLyoqXG4gKiBSZXBsYWNlIHRoZSBDT05URU5UUyBvZiBzdHJpbmcgbGl0ZXJhbHMgd2l0aCBzcGFjZXMgKHNhbWUgbGVuZ3RoLCBuZXdsaW5lcyBrZXB0KSwgc28gcG9zaXRpb25cbiAqIHNlYXJjaGVzIG92ZXIgdGhlIHJlc3VsdCBjYW5ub3QgbWF0Y2ggdGV4dCBpbnNpZGUgc3RyaW5ncyB3aGlsZSBhbGwgaW5kZXhlcyBzdGlsbCBtYXAgMToxIHRvXG4gKiB0aGUgb3JpZ2luYWwgY29udGVudC5cbiAqL1xuZnVuY3Rpb24gbWFza1N0cmluZ0NvbnRlbnRzKGNvbnRlbnQ6IHN0cmluZyk6IHN0cmluZyB7XG4gIGxldCByZXN1bHQgPSAnJztcbiAgbGV0IHN0cmluZ0RlbGltaXRlcjogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgY29udGVudC5sZW5ndGg7IGluZGV4KyspIHtcbiAgICBjb25zdCBjaGFyID0gY29udGVudFtpbmRleF0hO1xuICAgIGlmIChzdHJpbmdEZWxpbWl0ZXIpIHtcbiAgICAgIGlmIChjaGFyID09PSAnXFxcXCcpIHtcbiAgICAgICAgcmVzdWx0ICs9ICcgICc7XG4gICAgICAgIGluZGV4Kys7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgaWYgKGNoYXIgPT09IHN0cmluZ0RlbGltaXRlciB8fCAoc3RyaW5nRGVsaW1pdGVyICE9PSAnYCcgJiYgY2hhciA9PT0gJ1xcbicpKSB7XG4gICAgICAgIHN0cmluZ0RlbGltaXRlciA9IHVuZGVmaW5lZDtcbiAgICAgICAgcmVzdWx0ICs9IGNoYXI7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgcmVzdWx0ICs9IGNoYXIgPT09ICdcXG4nID8gJ1xcbicgOiAnICc7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgaWYgKGNoYXIgPT09IFwiJ1wiIHx8IGNoYXIgPT09ICdcIicgfHwgY2hhciA9PT0gJ2AnKSBzdHJpbmdEZWxpbWl0ZXIgPSBjaGFyO1xuICAgIHJlc3VsdCArPSBjaGFyO1xuICB9XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbi8qKlxuICogU3RyaW5nLWF3YXJlIHNjYW4gZm9yIHRoZSBtYXJrZXJzIGluZGljYXRpbmcgdGhlIGNvbmZpZyBtYW5hZ2VzIGEgKENsb3VkZmxhcmUgRDEgY29tcGF0aWJsZSlcbiAqIFNRTGl0ZSBkYXRhYmFzZSDigJQgYSBgZGlhbGVjdDogJ3NxbGl0ZSdgLCBgZHJpdmVyOiAnZDEtaHR0cCdgLCBvciBgZHJpdmVyOiAnZHVyYWJsZS1zcWxpdGUnYFxuICogUFJPUEVSVFkgKHBsYWluIG9yIHF1b3RlZCBrZXkpLiBLZXlzIGFyZSBvbmx5IHJlY29nbml6ZWQgaW4gY29kZSBwb3NpdGlvbiwgc28gbWFya2VyLWxpa2UgdGV4dFxuICogZW1iZWRkZWQgaW4gdW5yZWxhdGVkIHN0cmluZyB2YWx1ZXMgKGUuZy4gYSBzY2hlbWEgcGF0aCkgY2Fubm90IG1hdGNoLlxuICovXG5mdW5jdGlvbiBkZWNsYXJlc1NxbGl0ZVRhcmdldChjb250ZW50OiBzdHJpbmcpOiBib29sZWFuIHtcbiAgY29uc3QgdG9rZW5zID0gdG9rZW5pemVTdHJpbmdzKGNvbnRlbnQpO1xuICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgdG9rZW5zLmxlbmd0aDsgaW5kZXgrKykge1xuICAgIGNvbnN0IHRva2VuID0gdG9rZW5zW2luZGV4XSE7XG4gICAgbGV0IGtleTogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICAgIGxldCB2YWx1ZVRva2VuSW5kZXg6IG51bWJlciB8IHVuZGVmaW5lZDtcbiAgICBpZiAodG9rZW4udHlwZSA9PT0gJ2NvZGUnKSB7XG4gICAgICBjb25zdCBtYXRjaCA9IC8oPzpefFtcXHN7LChdKShkaWFsZWN0fGRyaXZlcilcXHMqOlxccyokLy5leGVjKHRva2VuLnZhbHVlKTtcbiAgICAgIGlmIChtYXRjaCkge1xuICAgICAgICBrZXkgPSBtYXRjaFsxXTtcbiAgICAgICAgdmFsdWVUb2tlbkluZGV4ID0gaW5kZXggKyAxO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAodG9rZW4udmFsdWUgPT09ICdkaWFsZWN0JyB8fCB0b2tlbi52YWx1ZSA9PT0gJ2RyaXZlcicpIHtcbiAgICAgIC8vIEEgcXVvdGVkIGtleTogdGhlIHN1cnJvdW5kaW5nIGNvZGUgdG9rZW5zIG11c3QgZm9ybSBhIHByb3BlcnR5IHBvc2l0aW9uIChge2AvYCxgIGJlZm9yZSxcbiAgICAgIC8vIGA6YCBhZnRlcikuXG4gICAgICBjb25zdCBwcmV2aW91c1Rva2VuID0gdG9rZW5zW2luZGV4IC0gMV07XG4gICAgICBjb25zdCBuZXh0VG9rZW4gPSB0b2tlbnNbaW5kZXggKyAxXTtcbiAgICAgIGlmIChcbiAgICAgICAgcHJldmlvdXNUb2tlbj8udHlwZSA9PT0gJ2NvZGUnICYmXG4gICAgICAgIC9beywoXVxccyokLy50ZXN0KHByZXZpb3VzVG9rZW4udmFsdWUpICYmXG4gICAgICAgIG5leHRUb2tlbj8udHlwZSA9PT0gJ2NvZGUnICYmXG4gICAgICAgIC9eXFxzKjpcXHMqJC8udGVzdChuZXh0VG9rZW4udmFsdWUpXG4gICAgICApIHtcbiAgICAgICAga2V5ID0gdG9rZW4udmFsdWU7XG4gICAgICAgIHZhbHVlVG9rZW5JbmRleCA9IGluZGV4ICsgMjtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGtleSA9PT0gdW5kZWZpbmVkIHx8IHZhbHVlVG9rZW5JbmRleCA9PT0gdW5kZWZpbmVkKSBjb250aW51ZTtcblxuICAgIGNvbnN0IHZhbHVlVG9rZW4gPSB0b2tlbnNbdmFsdWVUb2tlbkluZGV4XTtcbiAgICBpZiAodmFsdWVUb2tlbj8udHlwZSAhPT0gJ3N0cmluZycpIGNvbnRpbnVlO1xuICAgIGlmIChrZXkgPT09ICdkaWFsZWN0JyAmJiB2YWx1ZVRva2VuLnZhbHVlID09PSAnc3FsaXRlJykgcmV0dXJuIHRydWU7XG4gICAgaWYgKGtleSA9PT0gJ2RyaXZlcicgJiYgKHZhbHVlVG9rZW4udmFsdWUgPT09ICdkMS1odHRwJyB8fCB2YWx1ZVRva2VuLnZhbHVlID09PSAnZHVyYWJsZS1zcWxpdGUnKSkgcmV0dXJuIHRydWU7XG4gIH1cbiAgcmV0dXJuIGZhbHNlO1xufVxuXG4vKipcbiAqIFNwbGl0IGludG8gYWx0ZXJuYXRpbmcgY29kZSBhbmQgc3RyaW5nLWxpdGVyYWwtY29udGVudCB0b2tlbnMgKHF1b3RlcyBleGNsdWRlZCkuIFRoZSBpbnB1dCBpc1xuICogYWxyZWFkeSBjb21tZW50LWZyZWUg4oCUIHVzZXNEcml6emxlS2l0Rm9yRDEgcnVucyBzdHJpcEpzQ29tbWVudHMgYmVmb3JlIGFueSBzY2FubmluZyDigJQgc29cbiAqIGNvbW1lbnQgZGVsaW1pdGVycyBuZWVkIG5vIGhhbmRsaW5nIGhlcmUgKGEgY29tbWVudGVkLW91dCBgLy8gZGlhbGVjdDogJ3NxbGl0ZSdgIGNhbiBuZXZlclxuICogcmVhY2ggdGhpcyB0b2tlbml6ZXIpLlxuICovXG5mdW5jdGlvbiB0b2tlbml6ZVN0cmluZ3MoY29udGVudDogc3RyaW5nKTogeyB0eXBlOiAnY29kZScgfCAnc3RyaW5nJzsgdmFsdWU6IHN0cmluZyB9W10ge1xuICBjb25zdCB0b2tlbnM6IHsgdHlwZTogJ2NvZGUnIHwgJ3N0cmluZyc7IHZhbHVlOiBzdHJpbmcgfVtdID0gW107XG4gIGxldCBjb2RlID0gJyc7XG4gIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCBjb250ZW50Lmxlbmd0aDsgaW5kZXgrKykge1xuICAgIGNvbnN0IGNoYXIgPSBjb250ZW50W2luZGV4XSE7XG4gICAgaWYgKGNoYXIgPT09IFwiJ1wiIHx8IGNoYXIgPT09ICdcIicgfHwgY2hhciA9PT0gJ2AnKSB7XG4gICAgICB0b2tlbnMucHVzaCh7IHR5cGU6ICdjb2RlJywgdmFsdWU6IGNvZGUgfSk7XG4gICAgICBjb2RlID0gJyc7XG4gICAgICBsZXQgdmFsdWUgPSAnJztcbiAgICAgIGluZGV4Kys7XG4gICAgICB3aGlsZSAoaW5kZXggPCBjb250ZW50Lmxlbmd0aCAmJiBjb250ZW50W2luZGV4XSAhPT0gY2hhcikge1xuICAgICAgICBpZiAoY29udGVudFtpbmRleF0gPT09ICdcXFxcJykgaW5kZXgrKztcbiAgICAgICAgdmFsdWUgKz0gY29udGVudFtpbmRleF0gPz8gJyc7XG4gICAgICAgIGluZGV4Kys7XG4gICAgICB9XG4gICAgICB0b2tlbnMucHVzaCh7IHR5cGU6ICdzdHJpbmcnLCB2YWx1ZSB9KTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBjb2RlICs9IGNoYXI7XG4gIH1cbiAgdG9rZW5zLnB1c2goeyB0eXBlOiAnY29kZScsIHZhbHVlOiBjb2RlIH0pO1xuICByZXR1cm4gdG9rZW5zO1xufVxuXG4vKiogVGhlIGZpcnN0IGB7IC4uLiB9YCBzcGFuIChzdHJpbmctYXdhcmUgYnJhY2UgbWF0Y2hpbmcpLCBvciB1bmRlZmluZWQgd2hlbiBub25lIGV4aXN0cy4gKi9cbmZ1bmN0aW9uIGV4dHJhY3RGaXJzdEJhbGFuY2VkT2JqZWN0KGNvbnRlbnQ6IHN0cmluZyk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IHN0YXJ0SW5kZXggPSBjb250ZW50LmluZGV4T2YoJ3snKTtcbiAgaWYgKHN0YXJ0SW5kZXggPT09IC0xKSByZXR1cm47XG5cbiAgbGV0IGRlcHRoID0gMDtcbiAgbGV0IHN0cmluZ0RlbGltaXRlcjogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICBmb3IgKGxldCBpbmRleCA9IHN0YXJ0SW5kZXg7IGluZGV4IDwgY29udGVudC5sZW5ndGg7IGluZGV4KyspIHtcbiAgICBjb25zdCBjaGFyID0gY29udGVudFtpbmRleF0hO1xuICAgIGlmIChzdHJpbmdEZWxpbWl0ZXIpIHtcbiAgICAgIGlmIChjaGFyID09PSAnXFxcXCcpIGluZGV4Kys7XG4gICAgICBlbHNlIGlmIChjaGFyID09PSBzdHJpbmdEZWxpbWl0ZXIgfHwgKHN0cmluZ0RlbGltaXRlciAhPT0gJ2AnICYmIGNoYXIgPT09ICdcXG4nKSkgc3RyaW5nRGVsaW1pdGVyID0gdW5kZWZpbmVkO1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGlmIChjaGFyID09PSBcIidcIiB8fCBjaGFyID09PSAnXCInIHx8IGNoYXIgPT09ICdgJykgc3RyaW5nRGVsaW1pdGVyID0gY2hhcjtcbiAgICBlbHNlIGlmIChjaGFyID09PSAneycpIGRlcHRoKys7XG4gICAgZWxzZSBpZiAoY2hhciA9PT0gJ30nICYmIC0tZGVwdGggPT09IDApIHJldHVybiBjb250ZW50LnNsaWNlKHN0YXJ0SW5kZXgsIGluZGV4ICsgMSk7XG4gIH1cbiAgcmV0dXJuO1xufVxuXG4vKipcbiAqIFJlbW92ZSBibG9jayBhbmQgbGluZSBjb21tZW50cyBzbyBjb21tZW50ZWQtb3V0IG1hcmtlcnMgKGUuZy4gYC8vIGRpYWxlY3Q6ICdzcWxpdGUnYCBpbiBhXG4gKiBQb3N0Z3JlU1FMIGNvbmZpZykgY2Fubm90IG1pc2NsYXNzaWZ5IHRoZSBjb25maWcuIFRoZSBzY2FubmVyIHRyYWNrcyBzdHJpbmcgc3RhdGUsIHNvIGAvL2BcbiAqIGluc2lkZSBzdHJpbmcgbGl0ZXJhbHMgKFVSTHMgc3VjaCBhcyBgaHR0cHM6Ly8uLi5gIGluIGNvbm5lY3Rpb24gc3RyaW5ncykgc3Vydml2ZXMgd2hpbGVcbiAqIGNvbW1lbnRzIGRpcmVjdGx5IGFmdGVyIGEgc3RyaW5nIGxpdGVyYWwgYXJlIHN0aWxsIHJlbW92ZWQuXG4gKi9cbmZ1bmN0aW9uIHN0cmlwSnNDb21tZW50cyhjb250ZW50OiBzdHJpbmcpOiBzdHJpbmcge1xuICBsZXQgcmVzdWx0ID0gJyc7XG4gIGxldCBzdHJpbmdEZWxpbWl0ZXI6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgZm9yIChsZXQgaW5kZXggPSAwOyBpbmRleCA8IGNvbnRlbnQubGVuZ3RoOyBpbmRleCsrKSB7XG4gICAgY29uc3QgY2hhciA9IGNvbnRlbnRbaW5kZXhdITtcbiAgICBjb25zdCBuZXh0Q2hhciA9IGNvbnRlbnRbaW5kZXggKyAxXTtcbiAgICBpZiAoc3RyaW5nRGVsaW1pdGVyKSB7XG4gICAgICBpZiAoY2hhciA9PT0gJ1xcXFwnKSB7XG4gICAgICAgIHJlc3VsdCArPSBjaGFyICsgKG5leHRDaGFyID8/ICcnKTtcbiAgICAgICAgaW5kZXgrKztcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBpZiAoY2hhciA9PT0gc3RyaW5nRGVsaW1pdGVyIHx8IChzdHJpbmdEZWxpbWl0ZXIgIT09ICdgJyAmJiBjaGFyID09PSAnXFxuJykpIHtcbiAgICAgICAgc3RyaW5nRGVsaW1pdGVyID0gdW5kZWZpbmVkO1xuICAgICAgfVxuICAgICAgcmVzdWx0ICs9IGNoYXI7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgaWYgKGNoYXIgPT09IFwiJ1wiIHx8IGNoYXIgPT09ICdcIicgfHwgY2hhciA9PT0gJ2AnKSB7XG4gICAgICBzdHJpbmdEZWxpbWl0ZXIgPSBjaGFyO1xuICAgICAgcmVzdWx0ICs9IGNoYXI7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgaWYgKGNoYXIgPT09ICcvJyAmJiBuZXh0Q2hhciA9PT0gJy8nKSB7XG4gICAgICB3aGlsZSAoaW5kZXggPCBjb250ZW50Lmxlbmd0aCAmJiBjb250ZW50W2luZGV4XSAhPT0gJ1xcbicpIGluZGV4Kys7XG4gICAgICByZXN1bHQgKz0gJ1xcbic7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgaWYgKGNoYXIgPT09ICcvJyAmJiBuZXh0Q2hhciA9PT0gJyonKSB7XG4gICAgICBpbmRleCArPSAyO1xuICAgICAgd2hpbGUgKGluZGV4IDwgY29udGVudC5sZW5ndGggJiYgIShjb250ZW50W2luZGV4XSA9PT0gJyonICYmIGNvbnRlbnRbaW5kZXggKyAxXSA9PT0gJy8nKSkgaW5kZXgrKztcbiAgICAgIGluZGV4Kys7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgcmVzdWx0ICs9IGNoYXI7XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGZpbmREcml6emxlQ29uZmlnKHByb2plY3Q6IFByb2plY3QpOiB7IGRpclBhdGg6IHN0cmluZzsgZmlsZU5hbWU6IHN0cmluZyB9IHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgY2FuZGlkYXRlcyA9IFsnZHJpenpsZS5jb25maWcudHMnLCAnZHJpenpsZS5jb25maWcubXRzJywgJ2RyaXp6bGUuY29uZmlnLmpzJywgJ2RyaXp6bGUuY29uZmlnLm1qcyddO1xuICBmb3IgKGNvbnN0IGRpclBhdGggb2YgW3Byb2plY3QuZGlyUGF0aCwgcHJvamVjdC5yb290RGlyUGF0aF0pIHtcbiAgICBjb25zdCBmaWxlTmFtZSA9IGNhbmRpZGF0ZXMuZmluZCgoZmlsZU5hbWUpID0+IGZzLmV4aXN0c1N5bmMocGF0aC5qb2luKGRpclBhdGgsIGZpbGVOYW1lKSkpO1xuICAgIGlmIChmaWxlTmFtZSkgcmV0dXJuIHsgZGlyUGF0aCwgZmlsZU5hbWUgfTtcbiAgfVxuICByZXR1cm47XG59XG5cbmZ1bmN0aW9uIGJ1aWxkUmVtb3ZlU3FsaXRlRGJDb21tYW5kKHByb2plY3Q6IFByb2plY3QpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBjb25zdCBkYlBhdGggPSBnZXRTcWxpdGVEYlBhdGgocHJvamVjdCk7XG4gIGlmICghZGJQYXRoKSByZXR1cm47XG5cbiAgY29uc3QgYWJzb2x1dGVQYXRoID0gcGF0aC5pc0Fic29sdXRlKGRiUGF0aCkgPyBkYlBhdGggOiBwYXRoLnJlc29sdmUocHJvamVjdC5kaXJQYXRoLCBkYlBhdGgpO1xuICByZXR1cm4gYnVpbGRSZW1vdmVTcWxpdGVEYkNvbW1hbmRGb3JQYXRoKGFic29sdXRlUGF0aCk7XG59XG5cbmZ1bmN0aW9uIGJ1aWxkUmVtb3ZlU3FsaXRlRGJDb21tYW5kRm9yUGF0aChkYlBhdGg6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiBgcm0gLWYgXCIke2RiUGF0aH1cIiBcIiR7ZGJQYXRofS13YWxcIiBcIiR7ZGJQYXRofS1zaG1cImA7XG59XG5cbmZ1bmN0aW9uIGJ1aWxkUmVtb3ZlU3FsaXRlRGJGYW1pbHlDb21tYW5kKGRiUGF0aDogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIGBybSAtUmYgXCIke2RiUGF0aH1cIipgO1xufVxuXG5mdW5jdGlvbiBnZXRTcWxpdGVEYlBhdGhPckVycm9yKHByb2plY3Q6IFByb2plY3QsIGNvbW1hbmROYW1lOiBzdHJpbmcpOiBzdHJpbmcge1xuICBjb25zdCBkYlBhdGggPSBnZXRTcWxpdGVEYlBhdGgocHJvamVjdCk7XG4gIGlmICghZGJQYXRoKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGB3YiBkYiAke2NvbW1hbmROYW1lfSBzdXBwb3J0cyBEcml6emxlIG9ubHkgd2hlbiBmaWxlOiBEQVRBQkFTRV9VUkwgaXMgc2V0LmApO1xuICB9XG4gIHJldHVybiBkYlBhdGg7XG59XG5cbmZ1bmN0aW9uIGdldEFic29sdXRlU3FsaXRlRGJQYXRoKHByb2plY3Q6IFByb2plY3QsIGNvbW1hbmROYW1lOiBzdHJpbmcpOiBzdHJpbmcge1xuICBjb25zdCBkYlBhdGggPSBnZXRTcWxpdGVEYlBhdGhPckVycm9yKHByb2plY3QsIGNvbW1hbmROYW1lKTtcbiAgcmV0dXJuIHBhdGguaXNBYnNvbHV0ZShkYlBhdGgpID8gZGJQYXRoIDogcGF0aC5yZXNvbHZlKHByb2plY3QuZGlyUGF0aCwgZGJQYXRoKTtcbn1cblxuZnVuY3Rpb24gZ2V0U3FsaXRlRGJQYXRoKHByb2plY3Q6IFByb2plY3QpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICByZXR1cm4gZ2V0QWJzb2x1dGVGaWxlRGF0YWJhc2VVcmxQYXRoKHByb2plY3QpO1xufVxuXG5mdW5jdGlvbiBnZXRMaXRlc3RyZWFtQ29uZmlnT3B0aW9uKHByb2plY3Q6IFByb2plY3QsIGNvbmZpZ1BhdGg/OiBzdHJpbmcpOiBzdHJpbmcge1xuICBpZiAoY29uZmlnUGF0aCkgcmV0dXJuIGAtY29uZmlnIFwiJHtjb25maWdQYXRofVwiYDtcblxuICBjb25zdCBsb2NhbENvbmZpZ1BhdGggPSBwYXRoLmpvaW4ocHJvamVjdC5kaXJQYXRoLCBMSVRFU1RSRUFNX0NPTkZJR19GSUxFX05BTUUpO1xuICBpZiAoZnMuZXhpc3RzU3luYyhsb2NhbENvbmZpZ1BhdGgpKSByZXR1cm4gYC1jb25maWcgLi8ke0xJVEVTVFJFQU1fQ09ORklHX0ZJTEVfTkFNRX1gO1xuICBpZiAoZnMuZXhpc3RzU3luYyhERUZBVUxUX0xJVEVTVFJFQU1fQ09ORklHX1BBVEgpKSByZXR1cm4gYC1jb25maWcgJHtERUZBVUxUX0xJVEVTVFJFQU1fQ09ORklHX1BBVEh9YDtcbiAgcmV0dXJuIGAtY29uZmlnIC4vJHtMSVRFU1RSRUFNX0NPTkZJR19GSUxFX05BTUV9YDtcbn1cblxuZXhwb3J0IGNvbnN0IGRyaXp6bGVTY3JpcHRzID0gbmV3IERyaXp6bGVTY3JpcHRzKCk7XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgdHlwZSB7IFBhcnNlRXJyb3IgfSBmcm9tICdqc29uYy1wYXJzZXInO1xuaW1wb3J0IHsgcGFyc2UgfSBmcm9tICdqc29uYy1wYXJzZXInO1xuXG5pbXBvcnQgdHlwZSB7IFByb2plY3QgfSBmcm9tICcuLi9wcm9qZWN0LmpzJztcblxuaW1wb3J0IHsgZmluZFdyYW5nbGVyQ29uZmlnUGF0aCB9IGZyb20gJy4vd3JhbmdsZXIuanMnO1xuXG5leHBvcnQgaW50ZXJmYWNlIFdyYW5nbGVyRDFEYXRhYmFzZSB7XG4gIGJpbmRpbmc/OiBzdHJpbmc7XG4gIGRhdGFiYXNlX25hbWU/OiBzdHJpbmc7XG4gIGRhdGFiYXNlX2lkPzogc3RyaW5nO1xuICBtaWdyYXRpb25zX2Rpcj86IHN0cmluZztcbiAgbWlncmF0aW9uc19wYXR0ZXJuPzogc3RyaW5nO1xufVxuXG4vKipcbiAqIFdoZXRoZXIgdGhlIEQxIGJpbmRpbmcgdXNlcyB3cmFuZ2xlci1uYXRpdmUgbWlncmF0aW9ucyB0aGF0IGB3cmFuZ2xlciBkMSBtaWdyYXRpb25zIGFwcGx5YFxuICogd291bGQgYWN0dWFsbHkgZGlzY292ZXI6IGFuIGV4cGxpY2l0IGBtaWdyYXRpb25zX3BhdHRlcm5gIG9wdHMgaW4sIG90aGVyd2lzZSB0aGUgbWlncmF0aW9uc1xuICogZGlyZWN0b3J5IG11c3QgY29udGFpbiBmbGF0IGAqLnNxbGAgZmlsZXMgKHdyYW5nbGVyJ3MgZGVmYXVsdCBwYXR0ZXJuKS4gQSBkcml6emxlLWtpdCBgb3V0YFxuICogZGlyZWN0b3J5IHdpdGggbmVzdGVkIGA8bmFtZT4vbWlncmF0aW9uLnNxbGAgZmlsZXMgYW5kIG5vIHBhdHRlcm4gd291bGQgbWF0Y2ggbm90aGluZyBhbmRcbiAqIHNpbGVudGx5IGFwcGx5IHplcm8gbWlncmF0aW9ucywgc28gaXQgbXVzdCBmYWxsIHRocm91Z2ggdG8gdGhlIGRyaXp6bGUta2l0IG1lY2hhbmlzbS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHVzZXNXcmFuZ2xlck5hdGl2ZU1pZ3JhdGlvbnMocHJvamVjdDogUGljazxQcm9qZWN0LCAnZGlyUGF0aCc+LCBkYXRhYmFzZTogV3JhbmdsZXJEMURhdGFiYXNlKTogYm9vbGVhbiB7XG4gIC8vIEFuIGV4cGxpY2l0IHBhdHRlcm4gb3B0cyBpbnRvIHRoZSB3cmFuZ2xlci1uYXRpdmUgbWVjaGFuaXNtIGV2ZW4gYmVmb3JlIHRoZSBkaXJlY3RvcnlcbiAgLy8gZXhpc3RzOyB3cmFuZ2xlciB0aGVuIGZhaWxzIHNhZmVseSB3aXRoIFwiTm8gbWlncmF0aW9ucyBmb2xkZXIgZm91bmRcIiBpbnN0ZWFkIG9mIHdiXG4gIC8vIHNpbGVudGx5IHN3aXRjaGluZyB0byBhIGRpZmZlcmVudCBtaWdyYXRpb24gZW5naW5lLlxuICBpZiAoZGF0YWJhc2UubWlncmF0aW9uc19wYXR0ZXJuKSByZXR1cm4gdHJ1ZTtcbiAgY29uc3QgbWlncmF0aW9uc0RpclBhdGggPSBwYXRoLnJlc29sdmUocHJvamVjdC5kaXJQYXRoLCBkYXRhYmFzZS5taWdyYXRpb25zX2RpciA/PyAnbWlncmF0aW9ucycpO1xuICBpZiAoIWZzLmV4aXN0c1N5bmMobWlncmF0aW9uc0RpclBhdGgpKSByZXR1cm4gZmFsc2U7XG4gIHJldHVybiBmcy5yZWFkZGlyU3luYyhtaWdyYXRpb25zRGlyUGF0aCkuc29tZSgoZmlsZU5hbWUpID0+IGZpbGVOYW1lLmVuZHNXaXRoKCcuc3FsJykpO1xufVxuXG5jb25zdCBOQU1FX0tFWUVEX0JJTkRJTkdfUEFSRU5UUyA9IG5ldyBTZXQoWydiaW5kaW5ncycsICdzZW5kX2VtYWlsJywgJ3JhdGVsaW1pdHMnXSk7XG5jb25zdCBSRUNPUkRfS0VZRURfQklORElOR19LRVlTID0gbmV3IFNldChbJ3dhc21fbW9kdWxlcycsICd0ZXh0X2Jsb2JzJywgJ2RhdGFfYmxvYnMnXSk7XG5cbi8qKlxuICogQ29sbGVjdCBldmVyeSBiaW5kaW5nIG5hbWUgZGVjbGFyZWQgaW4gdGhlIChlbnZpcm9ubWVudC1yZXNvbHZlZCkgY29uZmlnIHN1YnRyZWU6IGBiaW5kaW5nYFxuICogcHJvcGVydGllcyBhbnl3aGVyZSAoRDEsIEtWLCBSMiwgc2VydmljZXMsIGFzc2V0cywgcXVldWVzLCBldGMuKSwgdGhlIGBuYW1lYC1rZXllZCBiaW5kaW5nc1xuICogKGBkdXJhYmxlX29iamVjdHMuYmluZGluZ3NgLCBgbG9nZndkci5iaW5kaW5nc2AsIGBzZW5kX2VtYWlsYCwgYHJhdGVsaW1pdHNgKSwgYW5kIHRoZVxuICogcmVjb3JkLWtleWVkIGxlZ2FjeSBtb2R1bGUgYmluZGluZ3MgKGB3YXNtX21vZHVsZXNgLCBgdGV4dF9ibG9ic2AsIGBkYXRhX2Jsb2JzYCkuIEEgc2VjcmV0XG4gKiBzaGFyaW5nIGEgYmluZGluZydzIG5hbWUgd291bGQgc2lsZW50bHkgcmVwbGFjZSB0aGF0IGJpbmRpbmcgd2l0aCBhIHBsYWluIHN0cmluZyBvbiBkZXBsb3kuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjb2xsZWN0QmluZGluZ05hbWVzKHZhbHVlOiB1bmtub3duLCBuYW1lcyA9IG5ldyBTZXQ8c3RyaW5nPigpLCBwYXJlbnRLZXkgPSAnJyk6IFNldDxzdHJpbmc+IHtcbiAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgZm9yIChjb25zdCBpdGVtIG9mIHZhbHVlKSBjb2xsZWN0QmluZGluZ05hbWVzKGl0ZW0sIG5hbWVzLCBwYXJlbnRLZXkpO1xuICAgIHJldHVybiBuYW1lcztcbiAgfVxuICBpZiAoIXZhbHVlIHx8IHR5cGVvZiB2YWx1ZSAhPT0gJ29iamVjdCcpIHJldHVybiBuYW1lcztcbiAgZm9yIChjb25zdCBba2V5LCBjaGlsZF0gb2YgT2JqZWN0LmVudHJpZXModmFsdWUpKSB7XG4gICAgaWYgKGtleSA9PT0gJ2JpbmRpbmcnICYmIHR5cGVvZiBjaGlsZCA9PT0gJ3N0cmluZycpIHtcbiAgICAgIG5hbWVzLmFkZChjaGlsZCk7XG4gICAgfSBlbHNlIGlmIChrZXkgPT09ICduYW1lJyAmJiB0eXBlb2YgY2hpbGQgPT09ICdzdHJpbmcnICYmIE5BTUVfS0VZRURfQklORElOR19QQVJFTlRTLmhhcyhwYXJlbnRLZXkpKSB7XG4gICAgICBuYW1lcy5hZGQoY2hpbGQpO1xuICAgIH0gZWxzZSBpZiAoUkVDT1JEX0tFWUVEX0JJTkRJTkdfS0VZUy5oYXMoa2V5KSAmJiBjaGlsZCAmJiB0eXBlb2YgY2hpbGQgPT09ICdvYmplY3QnICYmICFBcnJheS5pc0FycmF5KGNoaWxkKSkge1xuICAgICAgZm9yIChjb25zdCBiaW5kaW5nTmFtZSBvZiBPYmplY3Qua2V5cyhjaGlsZCkpIG5hbWVzLmFkZChiaW5kaW5nTmFtZSk7XG4gICAgfSBlbHNlIGlmIChrZXkgIT09ICdlbnYnICYmIGtleSAhPT0gJ3ZhcnMnICYmIGtleSAhPT0gJ21ldGFkYXRhJyAmJiBrZXkgIT09ICdvcHRpb25zJykge1xuICAgICAgLy8gTmVzdGVkIGBlbnZgIHN1YnRyZWVzIGJlbG9uZyB0byBvdGhlciBlbnZpcm9ubWVudHM7IGB2YXJzYCB2YWx1ZXMsIGB1bnNhZmUubWV0YWRhdGFgLFxuICAgICAgLy8gYW5kIGB1bnNhZmUuYmluZGluZ3NbXS5kZXYub3B0aW9uc2AgYXJlIGFyYml0cmFyeSBKU09OIHdob3NlIHByb3BlcnRpZXMgKGUuZy4gYVxuICAgICAgLy8gXCJiaW5kaW5nXCIgZmllbGQpIGFyZSBkYXRhLCBub3QgV29ya2VyIGJpbmRpbmdzLlxuICAgICAgY29sbGVjdEJpbmRpbmdOYW1lcyhjaGlsZCwgbmFtZXMsIGtleSk7XG4gICAgfVxuICB9XG4gIHJldHVybiBuYW1lcztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBSZXNvbHZlZFdyYW5nbGVyQ29uZmlnIHtcbiAgLyoqIFRoZSBXb3JrZXIgbmFtZSBmb3IgdGhlIGRlcGxveSBlbnZpcm9ubWVudCAod3JhbmdsZXIgYXBwZW5kcyBgLTxlbnY+YCB3aGVuIHRoZSBlbnYgc2VjdGlvbiBoYXMgbm8gb3duIG5hbWUpLiAqL1xuICB3b3JrZXJOYW1lPzogc3RyaW5nO1xuICBhY2NvdW50SWQ/OiBzdHJpbmc7XG4gIHZhcktleXM6IHN0cmluZ1tdO1xuICAvKiogVGhlIGVudmlyb25tZW50J3MgYHZhcnNgIHZhbHVlcyAobmVlZGVkIGZvciBDbG91ZGZsYXJlJ3MgY29tYmluZWQgY291bnQvc2l6ZSBsaW1pdHMpLiAqL1xuICB2YXJzOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgLyoqIFNlY3JldHMgZGVjbGFyZWQgYXMgcmVxdWlyZWQgdmlhIHdyYW5nbGVyJ3MgYHNlY3JldHMucmVxdWlyZWRgICh2YWxpZGF0ZWQgYXQgZGVwbG95IHRpbWUpLiAqL1xuICByZXF1aXJlZFNlY3JldE5hbWVzOiBzdHJpbmdbXTtcbiAgLyoqIE5hbWVzIG9mIGFsbCBub24tdmFyIGJpbmRpbmdzIChEMSwgS1YsIFIyLCBEdXJhYmxlIE9iamVjdHMsIHNlbmRfZW1haWwsIHNlcnZpY2VzLCAuLi4pLiAqL1xuICBiaW5kaW5nTmFtZXM6IHN0cmluZ1tdO1xuICBkMURhdGFiYXNlczogV3JhbmdsZXJEMURhdGFiYXNlW107XG4gIC8qKlxuICAgKiBXaGV0aGVyIHRoZSBlbnZpcm9ubWVudCBjb21lcyBmcm9tIGFuIGBlbnYuPG5hbWU+YCBzZWN0aW9uICh0aGVuIHdyYW5nbGVyIGNvbW1hbmRzIG5lZWRcbiAgICogYC0tZW52IDxuYW1lPmAgLyBgQ0xPVURGTEFSRV9FTlY9PG5hbWU+YCkuIGBwcm9kdWN0aW9uYCBtYXkgYmUgZWl0aGVyIHRoZSB0b3AgbGV2ZWwgb3IgYVxuICAgKiBuYW1lZCBgZW52LnByb2R1Y3Rpb25gIHNlY3Rpb247IHRoZSBzZWN0aW9uIHdpbnMgd2hlbiBpdCBleGlzdHMuXG4gICAqL1xuICB1c2VzRW52U2VjdGlvbjogYm9vbGVhbjtcbn1cblxuaW50ZXJmYWNlIFJhd1dyYW5nbGVyQ29uZmlnIHtcbiAgbmFtZT86IHN0cmluZztcbiAgYWNjb3VudF9pZD86IHN0cmluZztcbiAgdmFycz86IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICBkMV9kYXRhYmFzZXM/OiBXcmFuZ2xlckQxRGF0YWJhc2VbXTtcbiAgYXNzZXRzPzogdW5rbm93bjtcbiAgbG9nZndkcj86IHVua25vd247XG4gIHdhc21fbW9kdWxlcz86IHVua25vd247XG4gIHRleHRfYmxvYnM/OiB1bmtub3duO1xuICBkYXRhX2Jsb2JzPzogdW5rbm93bjtcbiAgc2l0ZT86IHVua25vd247XG4gIHNlY3JldHM/OiB7IHJlcXVpcmVkPzogc3RyaW5nW10gfTtcbiAgZW52PzogUmVjb3JkPHN0cmluZywgUmF3V3JhbmdsZXJDb25maWc+O1xufVxuXG4vLyBXb3JrZXJzIFNpdGVzIGltcGxpY2l0bHkgYmluZHMgaXRzIEtWIG5hbWVzcGFjZSBhcyBfX1NUQVRJQ19DT05URU5ULlxuZnVuY3Rpb24gc2l0ZUJpbmRpbmdOYW1lcyhjb25maWc6IFJhd1dyYW5nbGVyQ29uZmlnLCBlbnZDb25maWc/OiBSYXdXcmFuZ2xlckNvbmZpZyk6IHN0cmluZ1tdIHtcbiAgcmV0dXJuIChlbnZDb25maWc/LnNpdGUgPz8gY29uZmlnLnNpdGUpID8gWydfX1NUQVRJQ19DT05URU5UJ10gOiBbXTtcbn1cblxuLyoqXG4gKiBSZXNvbHZlIHRoZSB3cmFuZ2xlciBjb25maWcgdmFsdWVzIG5lZWRlZCBmb3IgZGVwbG95aW5nIHRvIHRoZSBnaXZlbiBlbnZpcm9ubWVudC5cbiAqIEZvbGxvd3Mgd3JhbmdsZXIncyBpbmhlcml0YW5jZSBydWxlczogYGFjY291bnRfaWRgIGlzIGluaGVyaXRlZCBieSBuYW1lZCBlbnZpcm9ubWVudHMsXG4gKiB3aGlsZSBgdmFyc2AgYW5kIGBkMV9kYXRhYmFzZXNgIGFyZSBub3QgYW5kIG11c3QgYmUgcmVkZWNsYXJlZCBwZXIgZW52aXJvbm1lbnQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZXNvbHZlV3JhbmdsZXJDb25maWdGb3JFbnYoXG4gIHByb2plY3Q6IFBpY2s8UHJvamVjdCwgJ2RpclBhdGgnPixcbiAgZW52TmFtZTogc3RyaW5nXG4pOiBSZXNvbHZlZFdyYW5nbGVyQ29uZmlnIHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgY29uZmlnUGF0aCA9IGZpbmRXcmFuZ2xlckNvbmZpZ1BhdGgocHJvamVjdCk7XG4gIGlmICghY29uZmlnUGF0aCkgcmV0dXJuO1xuICBpZiAocGF0aC5leHRuYW1lKGNvbmZpZ1BhdGgpID09PSAnLnRvbWwnKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCd3YiBkZXBsb3kgc3VwcG9ydHMgd3JhbmdsZXIuanNvbmMvd3JhbmdsZXIuanNvbiBjb25maWdzIG9ubHk7IG1pZ3JhdGUgd3JhbmdsZXIudG9tbCBmaXJzdC4nKTtcbiAgfVxuXG4gIC8vIGpzb25jLXBhcnNlciBpcyBmYXVsdCB0b2xlcmFudCBhbmQgd291bGQgcmV0dXJuIGEgcGFydGlhbCBvYmplY3QgZm9yIG1hbGZvcm1lZCBpbnB1dCxcbiAgLy8gd2hpY2ggY291bGQgbWlncmF0ZSBhIHJlbW90ZSBkYXRhYmFzZSBmcm9tIGEgaGFsZi1yZWFkIGNvbmZpZzsgcmVqZWN0IGFueSBwYXJzZSBlcnJvci5cbiAgY29uc3QgcGFyc2VFcnJvcnM6IFBhcnNlRXJyb3JbXSA9IFtdO1xuICBjb25zdCBjb25maWcgPSBwYXJzZShmcy5yZWFkRmlsZVN5bmMoY29uZmlnUGF0aCwgJ3V0ZjgnKSwgcGFyc2VFcnJvcnMsIHtcbiAgICBhbGxvd1RyYWlsaW5nQ29tbWE6IHRydWUsXG4gIH0pIGFzIFJhd1dyYW5nbGVyQ29uZmlnIHwgdW5kZWZpbmVkO1xuICBpZiAocGFyc2VFcnJvcnMubGVuZ3RoID4gMCkge1xuICAgIHRocm93IG5ldyBFcnJvcihgRmFpbGVkIHRvIHBhcnNlICR7Y29uZmlnUGF0aH06ICR7cGFyc2VFcnJvcnMubGVuZ3RofSBKU09OQyBzeW50YXggZXJyb3IocykuYCk7XG4gIH1cbiAgaWYgKCFjb25maWcpIHJldHVybjtcblxuICBjb25zdCBlbnZDb25maWcgPSBjb25maWcuZW52Py5bZW52TmFtZV07XG4gIGlmICghZW52Q29uZmlnICYmIGVudk5hbWUgIT09ICdwcm9kdWN0aW9uJykge1xuICAgIHRocm93IG5ldyBFcnJvcihgVGhlIHdyYW5nbGVyIGNvbmZpZyBoYXMgbm8gXCJlbnZcIjogeyBcIiR7ZW52TmFtZX1cIjogLi4uIH0gc2VjdGlvbi5gKTtcbiAgfVxuICByZXR1cm4gZW52Q29uZmlnXG4gICAgPyB7XG4gICAgICAgIHdvcmtlck5hbWU6IGVudkNvbmZpZy5uYW1lID8/IChjb25maWcubmFtZSA/IGAke2NvbmZpZy5uYW1lfS0ke2Vudk5hbWV9YCA6IHVuZGVmaW5lZCksXG4gICAgICAgIGFjY291bnRJZDogZW52Q29uZmlnLmFjY291bnRfaWQgPz8gY29uZmlnLmFjY291bnRfaWQsXG4gICAgICAgIHZhcktleXM6IE9iamVjdC5rZXlzKGVudkNvbmZpZy52YXJzID8/IHt9KSxcbiAgICAgICAgdmFyczogZW52Q29uZmlnLnZhcnMgPz8ge30sXG4gICAgICAgIC8vIE1vc3QgYmluZGluZ3MgYXJlIG5vbi1pbmhlcml0YWJsZSBhbmQgbXVzdCBiZSByZWRlY2xhcmVkIHBlciBlbnZpcm9ubWVudCwgc28gb25seSB0aGVcbiAgICAgICAgLy8gZW52aXJvbm1lbnQncyBvd24gbmFtZXMgY291bnQg4oCUIHBsdXMgdGhlIGdlbnVpbmVseSBpbmhlcml0ZWQgc2hhcGVzIChhc3NldHMsIGxvZ2Z3ZHIpLFxuICAgICAgICAvLyB3aGljaCB3cmFuZ2xlciByZXNvbHZlcyBhcyB3aG9sZSBmaWVsZHM6IHRoZSBlbnZpcm9ubWVudCdzIG93biBmaWVsZCBvdmVycmlkZXMgdGhlXG4gICAgICAgIC8vIHRvcCBsZXZlbCBlbnRpcmVseSwgc28gb25seSB0aGUgZWZmZWN0aXZlIHZhbHVlJ3MgbmFtZXMgY291bnQuXG4gICAgICAgIGJpbmRpbmdOYW1lczogW1xuICAgICAgICAgIC4uLmNvbGxlY3RCaW5kaW5nTmFtZXMoXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIGFzc2V0czogZW52Q29uZmlnLmFzc2V0cyA/PyBjb25maWcuYXNzZXRzLFxuICAgICAgICAgICAgICBsb2dmd2RyOiBlbnZDb25maWcubG9nZndkciA/PyBjb25maWcubG9nZndkcixcbiAgICAgICAgICAgICAgd2FzbV9tb2R1bGVzOiBlbnZDb25maWcud2FzbV9tb2R1bGVzID8/IGNvbmZpZy53YXNtX21vZHVsZXMsXG4gICAgICAgICAgICAgIHRleHRfYmxvYnM6IGVudkNvbmZpZy50ZXh0X2Jsb2JzID8/IGNvbmZpZy50ZXh0X2Jsb2JzLFxuICAgICAgICAgICAgICBkYXRhX2Jsb2JzOiBlbnZDb25maWcuZGF0YV9ibG9icyA/PyBjb25maWcuZGF0YV9ibG9icyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBjb2xsZWN0QmluZGluZ05hbWVzKGVudkNvbmZpZylcbiAgICAgICAgICApLFxuICAgICAgICAgIC4uLnNpdGVCaW5kaW5nTmFtZXMoY29uZmlnLCBlbnZDb25maWcpLFxuICAgICAgICBdLFxuICAgICAgICBkMURhdGFiYXNlczogZW52Q29uZmlnLmQxX2RhdGFiYXNlcyA/PyBbXSxcbiAgICAgICAgLy8gYHNlY3JldHNgIGlzIG5vbi1pbmhlcml0YWJsZTogYSB0b3AtbGV2ZWwgcmVxdWlyZW1lbnQgbXVzdCBub3QgZm9yY2UgKG9yIHVwbG9hZClcbiAgICAgICAgLy8gYSBzZWNyZXQgaW50byBhIG5hbWVkIGVudmlyb25tZW50LlxuICAgICAgICByZXF1aXJlZFNlY3JldE5hbWVzOiBlbnZDb25maWcuc2VjcmV0cz8ucmVxdWlyZWQgPz8gW10sXG4gICAgICAgIHVzZXNFbnZTZWN0aW9uOiB0cnVlLFxuICAgICAgfVxuICAgIDoge1xuICAgICAgICB3b3JrZXJOYW1lOiBjb25maWcubmFtZSxcbiAgICAgICAgYWNjb3VudElkOiBjb25maWcuYWNjb3VudF9pZCxcbiAgICAgICAgdmFyS2V5czogT2JqZWN0LmtleXMoY29uZmlnLnZhcnMgPz8ge30pLFxuICAgICAgICB2YXJzOiBjb25maWcudmFycyA/PyB7fSxcbiAgICAgICAgYmluZGluZ05hbWVzOiBbLi4uY29sbGVjdEJpbmRpbmdOYW1lcyhjb25maWcpLCAuLi5zaXRlQmluZGluZ05hbWVzKGNvbmZpZyldLFxuICAgICAgICBkMURhdGFiYXNlczogY29uZmlnLmQxX2RhdGFiYXNlcyA/PyBbXSxcbiAgICAgICAgcmVxdWlyZWRTZWNyZXROYW1lczogY29uZmlnLnNlY3JldHM/LnJlcXVpcmVkID8/IFtdLFxuICAgICAgICB1c2VzRW52U2VjdGlvbjogZmFsc2UsXG4gICAgICB9O1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHsgcmVhZEVudmlyb25tZW50VmFyaWFibGVzIH0gZnJvbSAnQHdpbGxib29zdGVyL3NoYXJlZC1saWItbm9kZS9zcmMnO1xuaW1wb3J0IGNoYWxrIGZyb20gJ2NoYWxrJztcbmltcG9ydCB7IHBhcnNlIGFzIHBhcnNlRG90ZW52IH0gZnJvbSAnZG90ZW52JztcbmltcG9ydCB0eXBlIHsgQXJndW1lbnRzQ2FtZWxDYXNlLCBBcmd2LCBDb21tYW5kTW9kdWxlLCBJbmZlcnJlZE9wdGlvblR5cGVzIH0gZnJvbSAneWFyZ3MnO1xuXG5pbXBvcnQgdHlwZSB7IFByb2plY3QgfSBmcm9tICcuLi9wcm9qZWN0LmpzJztcbmltcG9ydCB7IGZpbmRTZWxmUHJvamVjdCB9IGZyb20gJy4uL3Byb2plY3QuanMnO1xuaW1wb3J0IHR5cGUgeyBzaGFyZWRPcHRpb25zQnVpbGRlciB9IGZyb20gJy4uL3NoYXJlZE9wdGlvbnNCdWlsZGVyLmpzJztcblxuLy8gQ2xvdWRmbGFyZSBXb3JrZXJzIGRvbid0IHNlZSB0aGUgcHJvY2VzcyBlbnZpcm9ubWVudDsgd3JhbmdsZXIgZGV2IHJlYWRzIHZhcnMgZnJvbSBhIC5kZXYudmFyc1xuLy8gZmlsZSBuZXh0IHRvIGl0cyBjb25maWcgZmlsZSBpbnN0ZWFkLiBUaGlzIGNvbW1hbmQgYnJpZGdlcyB3Yi1tYW5hZ2VkIC5lbnYgZmlsZXMgdG8gdGhhdCBmaWxlLlxuY29uc3QgYnVpbGRlciA9IHt9IGFzIGNvbnN0O1xuXG50eXBlIEdlbkRldlZhcnNDb21tYW5kT3B0aW9ucyA9IEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIGJ1aWxkZXIgJiB0eXBlb2Ygc2hhcmVkT3B0aW9uc0J1aWxkZXI+O1xudHlwZSBHZW5EZXZWYXJzQ29tbWFuZEFyZ3YgPSBBcmd1bWVudHNDYW1lbENhc2U8R2VuRGV2VmFyc0NvbW1hbmRPcHRpb25zICYgeyBwYXRoPzogc3RyaW5nIH0+O1xuXG5leHBvcnQgY29uc3QgZ2VuRGV2VmFyc0NvbW1hbmQ6IENvbW1hbmRNb2R1bGU8dW5rbm93biwgR2VuRGV2VmFyc0NvbW1hbmRPcHRpb25zPiA9IHtcbiAgY29tbWFuZDogJ2dlbi1kZXYtdmFycyBbcGF0aF0nLFxuICBkZXNjcmliZTpcbiAgICAnR2VuZXJhdGUgYSAuZGV2LnZhcnMgZmlsZSBmb3IgYHdyYW5nbGVyIGRldmAgZnJvbSB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGVzIGxvYWRlZCBmcm9tIC5lbnYgZmlsZXMgKHBsdXMgV0JfRU5WIGFuZCBORVhUX1BVQkxJQ19XQl9FTlYpLicsXG4gIGJ1aWxkZXI6ICh5YXJncykgPT5cbiAgICB5YXJncy5wb3NpdGlvbmFsKCdwYXRoJywge1xuICAgICAgZGVzY3JpcHRpb246ICdPdXRwdXQgcGF0aCBvZiB0aGUgZ2VuZXJhdGVkIC5kZXYudmFycyBmaWxlLicsXG4gICAgICB0eXBlOiAnc3RyaW5nJyxcbiAgICAgIGRlZmF1bHQ6ICcuZGV2LnZhcnMnLFxuICAgIH0pIGFzIHVua25vd24gYXMgQXJndjxHZW5EZXZWYXJzQ29tbWFuZE9wdGlvbnM+LFxuICBhc3luYyBoYW5kbGVyKGFyZ3Y6IEdlbkRldlZhcnNDb21tYW5kQXJndikge1xuICAgIGNvbnN0IHByb2plY3QgPSBmaW5kU2VsZlByb2plY3QoYXJndik7XG4gICAgaWYgKCFwcm9qZWN0KSB7XG4gICAgICBjb25zb2xlLmVycm9yKGNoYWxrLnJlZCgnTm8gcHJvamVjdCBmb3VuZC4nKSk7XG4gICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgfVxuXG4gICAgLy8gUmVzdHJpY3QgdG8gdGhlIHZhcmlhYmxlcyBsb2FkZWQgZnJvbSAuZW52IGZpbGVzICh3YidzIGVudmlyb25tZW50IGNvbnRyYWN0KSBzbyB0aGF0XG4gICAgLy8gdW5yZWxhdGVkIHByb2Nlc3MgZW52aXJvbm1lbnQgdmFyaWFibGVzIG5ldmVyIGxlYWsgaW50byB0aGUgZ2VuZXJhdGVkIGZpbGUuIElnbm9yZVxuICAgIC8vIHByb2Nlc3MuZW52IGJlY2F1c2UgdGhlIHBhcmVudCB3YiBwcm9jZXNzIGluamVjdHMgdGhlIC5lbnYgdmFsdWVzIGludG8gaXQsIHdoaWNoIHdvdWxkXG4gICAgLy8gb3RoZXJ3aXNlIHN1cHByZXNzIGxvYWRpbmcgdGhlbSBoZXJlLlxuICAgIGNvbnN0IFtlbnZWYXJzXSA9IHJlYWRFbnZpcm9ubWVudFZhcmlhYmxlcyhhcmd2LCBwcm9qZWN0LmRpclBhdGgsIHsgaWdub3JlUHJvY2Vzc0VudjogdHJ1ZSB9KTtcbiAgICAvLyBFeHBsaWNpdGx5IGV4cG9ydGVkIGVudmlyb25tZW50IHZhcmlhYmxlcyBtdXN0IHdpbiBvdmVyIGRvdGVudiB2YWx1ZXMgZm9yIGZpbGUtZGVmaW5lZFxuICAgIC8vIGtleXMgKHByb2plY3QuZW52IGFwcGxpZXMgdGhhdCBwcmVjZWRlbmNlKSwgb3IgYEFVVEhfU0VDUkVUPS4uLiB3YiBzdGFydGAgd291bGQgc2VydmVcbiAgICAvLyB0aGUgc3RhbGUgZmlsZSB2YWx1ZS4gQW4gZXhwb3J0IHRoYXQgZW1wdGllcyBhIG5vbi1lbXB0eSBmaWxlIHZhbHVlIGlzIGRlbGliZXJhdGUgYW5kXG4gICAgLy8gbXVzdCBzdXJ2aXZlIHRoZSBlbXB0eS12YWx1ZSBmaWx0ZXIgYmVsb3cgKHVubGlrZSBgS0VZPWAgcGxhY2Vob2xkZXJzIGluIC5lbnYgZmlsZXMsXG4gICAgLy8gd2hpY2ggc3RheSBvbWl0dGVkIHNvIHRoZXkgY2Fubm90IG92ZXJyaWRlIHdyYW5nbGVyIGB2YXJzYCB3aXRoIGVtcHR5IHN0cmluZ3MpLlxuICAgIGNvbnN0IGV4cGxpY2l0bHlFbXB0aWVkS2V5cyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICAgIGZvciAoY29uc3Qga2V5IG9mIE9iamVjdC5rZXlzKGVudlZhcnMpKSB7XG4gICAgICBjb25zdCBlZmZlY3RpdmVWYWx1ZSA9IHByb2plY3QuZW52W2tleV07XG4gICAgICBpZiAoZWZmZWN0aXZlVmFsdWUgPT09IHVuZGVmaW5lZCkgY29udGludWU7XG4gICAgICBpZiAoZWZmZWN0aXZlVmFsdWUgPT09ICcnICYmIGVudlZhcnNba2V5XSAhPT0gJycpIGV4cGxpY2l0bHlFbXB0aWVkS2V5cy5hZGQoa2V5KTtcbiAgICAgIGVudlZhcnNba2V5XSA9IGVmZmVjdGl2ZVZhbHVlO1xuICAgIH1cbiAgICAvLyBTdXBwbGVtZW50IHdpdGggcHJvY2VzcyBlbnZpcm9ubWVudCB2YWx1ZXMgZm9yIHRoZSBrZXlzIG5hbWVkIGluIC5lbnYuZXhhbXBsZTogQ0kgb2Z0ZW5cbiAgICAvLyBwcm92aWRlcyB0aGVtIGFzIHdvcmtmbG93IGVudiBpbnN0ZWFkIG9mIC5lbnYgZmlsZXMgKHN0aWxsIGFuIGFsbG93bGlzdCwgc28gdW5yZWxhdGVkXG4gICAgLy8gcHJvY2VzcyBlbnZpcm9ubWVudCB2YXJpYWJsZXMgY2Fubm90IGxlYWspLlxuICAgIGZvciAoY29uc3Qga2V5IG9mIFsuLi5yZWFkRW52RXhhbXBsZUtleXMocHJvamVjdCksICdXQl9FTlYnLCAnTkVYVF9QVUJMSUNfV0JfRU5WJ10pIHtcbiAgICAgIGNvbnN0IGVmZmVjdGl2ZVZhbHVlID0gcHJvamVjdC5lbnZba2V5XTtcbiAgICAgIGlmIChlbnZWYXJzW2tleV0gfHwgZWZmZWN0aXZlVmFsdWUgPT09IHVuZGVmaW5lZCkgY29udGludWU7XG4gICAgICBpZiAoZW52VmFyc1trZXldID09PSB1bmRlZmluZWQgJiYgZWZmZWN0aXZlVmFsdWUgPT09ICcnKSBleHBsaWNpdGx5RW1wdGllZEtleXMuYWRkKGtleSk7XG4gICAgICBlbnZWYXJzW2tleV0gPSBlZmZlY3RpdmVWYWx1ZTtcbiAgICB9XG5cbiAgICBjb25zdCBsaW5lcyA9IE9iamVjdC5lbnRyaWVzKGVudlZhcnMpXG4gICAgICAuZmlsdGVyKChba2V5LCB2YWx1ZV0pID0+IHZhbHVlICE9PSAnJyB8fCBleHBsaWNpdGx5RW1wdGllZEtleXMuaGFzKGtleSkpXG4gICAgICAudG9Tb3J0ZWQoKFthXSwgW2JdKSA9PiBhLmxvY2FsZUNvbXBhcmUoYikpXG4gICAgICAubWFwKChba2V5LCB2YWx1ZV0pID0+IGAke2tleX09JHtxdW90ZURvdGVudlZhbHVlKGtleSwgdmFsdWUpfWApO1xuICAgIGNvbnN0IG91dHB1dFBhdGggPSBwYXRoLnJlc29sdmUocHJvamVjdC5kaXJQYXRoLCBhcmd2LnBhdGggPz8gJy5kZXYudmFycycpO1xuICAgIGlmIChhcmd2LmRyeVJ1bikge1xuICAgICAgY29uc29sZS5pbmZvKGNoYWxrLmN5YW4oYFdvdWxkIGdlbmVyYXRlICR7b3V0cHV0UGF0aH0gd2l0aCAke2xpbmVzLmxlbmd0aH0gZW52aXJvbm1lbnQgdmFyaWFibGVzLmApKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBmcy5ta2RpclN5bmMocGF0aC5kaXJuYW1lKG91dHB1dFBhdGgpLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgICBmcy53cml0ZUZpbGVTeW5jKG91dHB1dFBhdGgsIGxpbmVzLmpvaW4oJ1xcbicpICsgJ1xcbicpO1xuICAgIGNvbnNvbGUuaW5mbyhjaGFsay5ncmVlbihgR2VuZXJhdGVkICR7b3V0cHV0UGF0aH0gd2l0aCAke2xpbmVzLmxlbmd0aH0gZW52aXJvbm1lbnQgdmFyaWFibGVzLmApKTtcbiAgfSxcbn07XG5cbmV4cG9ydCBmdW5jdGlvbiByZWFkRW52RXhhbXBsZUtleXMocHJvamVjdDogUHJvamVjdCk6IHN0cmluZ1tdIHtcbiAgbGV0IGVudkV4YW1wbGVQYXRoOiBzdHJpbmc7XG4gIHRyeSB7XG4gICAgZW52RXhhbXBsZVBhdGggPSBwcm9qZWN0LmZpbmRGaWxlKCcuZW52LmV4YW1wbGUnKTtcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIFtdO1xuICB9XG4gIC8vIGRvdGVudidzIG93biBwYXJzZXIgY292ZXJzIGBleHBvcnQgS0VZPWAgcHJlZml4ZXMgYW5kIHdoaXRlc3BhY2UgYXJvdW5kIGA9YCxcbiAgLy8gd2hpY2ggYSBsaW5lIHJlZ2V4IHdvdWxkIHNpbGVudGx5IG1pc3MuXG4gIHJldHVybiBPYmplY3Qua2V5cyhwYXJzZURvdGVudihmcy5yZWFkRmlsZVN5bmMoZW52RXhhbXBsZVBhdGgsICd1dGY4JykpKTtcbn1cblxuLyoqXG4gKiBRdW90ZSBhIHZhbHVlIGZvciBkb3RlbnYgKHdoaWNoIHdyYW5nbGVyIHVzZXMgZm9yIC5kZXYudmFycykuIEV2ZXJ5IGNhbmRpZGF0ZSByZXByZXNlbnRhdGlvblxuICogaXMgdmVyaWZpZWQgYnkgYWN0dWFsbHkgcGFyc2luZyBpdCBiYWNrIChvdXIgZG90ZW52IHBhcnNlciBtYXRjaGVzIHdyYW5nbGVyJ3MgYnVuZGxlZCBkb3RlbnZcbiAqIDE2IGZvciB0aGVzZSBjb25zdHJ1Y3RzKSwgc28gYSB2YWx1ZSBpcyBlaXRoZXIgc2VyaWFsaXplZCBsb3NzbGVzc2x5IG9yIHJlamVjdGVkIOKAlCBuZXZlclxuICogc2lsZW50bHkgY29ycnVwdGVkLiBDYW5kaWRhdGVzOiBzaW5nbGUgcXVvdGVzIChsaXRlcmFsIHNwYW47IGNsb3NlZCBlYXJseSBieSBhbiBhcG9zdHJvcGhlKSxcbiAqIGJhY2t0aWNrcyAoZXF1YWxseSBsaXRlcmFsKSwgdGhlbiBkb3VibGUgcXVvdGVzIHdpdGggZXNjYXBlZCBuZXdsaW5lcy9DUnMgKGRvdGVudiBkb2VzIG5vdFxuICogdW5lc2NhcGUgaW5uZXIgXFxcIiDigJQgYSBgI2AgYWZ0ZXIgYW4gZW1iZWRkZWQgcXVvdGUgc3RhcnRzIGEgY29tbWVudCwgd2hpY2ggdGhlIHJvdW5kLXRyaXBcbiAqIGNoZWNrIGNhdGNoZXMgYW5kIHJlamVjdHMpLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcXVvdGVEb3RlbnZWYWx1ZShrZXk6IHN0cmluZywgdmFsdWU6IHN0cmluZyk6IHN0cmluZyB7XG4gIGNvbnN0IGRvdWJsZVF1b3RlZEJvZHkgPSB2YWx1ZS5yZXBsYWNlQWxsKCdcXG4nLCBTdHJpbmcucmF3YFxcbmApLnJlcGxhY2VBbGwoJ1xccicsIFN0cmluZy5yYXdgXFxyYCk7XG4gIGNvbnN0IGNhbmRpZGF0ZXMgPSBbYCcke3ZhbHVlfSdgLCBgXFxgJHt2YWx1ZX1cXGBgLCBgXCIke2RvdWJsZVF1b3RlZEJvZHl9XCJgXTtcbiAgZm9yIChjb25zdCBjYW5kaWRhdGUgb2YgY2FuZGlkYXRlcykge1xuICAgIGlmIChwYXJzZURvdGVudihgJHtrZXl9PSR7Y2FuZGlkYXRlfWApW2tleV0gPT09IHZhbHVlKSByZXR1cm4gY2FuZGlkYXRlO1xuICB9XG4gIHRocm93IG5ldyBFcnJvcihgVGhlIHZhbHVlIG9mICR7a2V5fSBjYW5ub3QgYmUgbG9zc2xlc3NseSBzZXJpYWxpemVkIGludG8gLmRldi52YXJzOyBzaW1wbGlmeSBpdHMgcXVvdGluZy5gKTtcbn1cbiIsImltcG9ydCB7IHNwYXduIH0gZnJvbSAnbm9kZTpjaGlsZF9wcm9jZXNzJztcbmltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBvcyBmcm9tICdub2RlOm9zJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB7IHJlYWRFbnZpcm9ubWVudFZhcmlhYmxlcywgc3Bhd25Bc3luYyB9IGZyb20gJ0B3aWxsYm9vc3Rlci9zaGFyZWQtbGliLW5vZGUvc3JjJztcbmltcG9ydCBjaGFsayBmcm9tICdjaGFsayc7XG5pbXBvcnQgeyBjb25maWcgfSBmcm9tICdkb3RlbnYnO1xuaW1wb3J0IHR5cGUgeyBBcmd1bWVudHNDYW1lbENhc2UsIEFyZ3YsIENvbW1hbmRNb2R1bGUsIEluZmVycmVkT3B0aW9uVHlwZXMgfSBmcm9tICd5YXJncyc7XG5cbmltcG9ydCB0eXBlIHsgUHJvamVjdCB9IGZyb20gJy4uL3Byb2plY3QuanMnO1xuaW1wb3J0IHsgZmluZFNlbGZQcm9qZWN0IH0gZnJvbSAnLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQgeyBidWlsZERyaXp6bGVLaXRDb21tYW5kLCB1c2VzRHJpenpsZUtpdEZvckQxIH0gZnJvbSAnLi4vc2NyaXB0cy9kcml6emxlU2NyaXB0cy5qcyc7XG5pbXBvcnQgeyBydW5XaXRoU3Bhd24gfSBmcm9tICcuLi9zY3JpcHRzL3J1bi5qcyc7XG5pbXBvcnQgdHlwZSB7IHNoYXJlZE9wdGlvbnNCdWlsZGVyIH0gZnJvbSAnLi4vc2hhcmVkT3B0aW9uc0J1aWxkZXIuanMnO1xuaW1wb3J0IHsgaXNDSSB9IGZyb20gJy4uL3V0aWxzL2NpLmpzJztcbmltcG9ydCB7IGJ1aWxkU2hlbGxFbnZpcm9ubWVudEFzc2lnbm1lbnQsIHNoZWxsRXNjYXBlQXJndW1lbnQgfSBmcm9tICcuLi91dGlscy9zaGVsbC5qcyc7XG5pbXBvcnQgeyBmaW5kV3JhbmdsZXJDb25maWdQYXRoIH0gZnJvbSAnLi4vdXRpbHMvd3JhbmdsZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBSZXNvbHZlZFdyYW5nbGVyQ29uZmlnLCBXcmFuZ2xlckQxRGF0YWJhc2UgfSBmcm9tICcuLi91dGlscy93cmFuZ2xlckNvbmZpZy5qcyc7XG5pbXBvcnQgeyByZXNvbHZlV3JhbmdsZXJDb25maWdGb3JFbnYsIHVzZXNXcmFuZ2xlck5hdGl2ZU1pZ3JhdGlvbnMgfSBmcm9tICcuLi91dGlscy93cmFuZ2xlckNvbmZpZy5qcyc7XG5cbmltcG9ydCB7IHJlYWRFbnZFeGFtcGxlS2V5cyB9IGZyb20gJy4vZ2VuRGV2VmFycy5qcyc7XG5cbi8qKlxuICogS2V5cyB0aGF0IGRyaXZlIHRoZSBkZXBsb3kgaXRzZWxmIChvciBhcmUgbWVhbmluZ2Z1bCBvbmx5IGxvY2FsbHkpIGFuZCB0aHVzIG11c3QgbmV2ZXIgYmVcbiAqIHB1c2hlZCB0byB0aGUgV29ya2VyIGFzIHNlY3JldHMuIGBXQl9FTlZgIC8gYE5FWFRfUFVCTElDX1dCX0VOVmAgYmVsb25nIGluIHdyYW5nbGVyIGB2YXJzYC5cbiAqL1xuY29uc3QgTk9OX1NFQ1JFVF9LRVlTID0gbmV3IFNldChbXG4gICdDSScsXG4gIC8vIFdyYW5nbGVyIHN5c3RlbS9hdXRoZW50aWNhdGlvbiB2YXJpYWJsZXMgKGh0dHBzOi8vZGV2ZWxvcGVycy5jbG91ZGZsYXJlLmNvbS93b3JrZXJzL3dyYW5nbGVyL3N5c3RlbS1lbnZpcm9ubWVudC12YXJpYWJsZXMvKSxcbiAgLy8gaW5jbHVkaW5nIGxlZ2FjeSBhbGlhc2VzOyBhcHAtc3BlY2lmaWMgbmFtZXMgc3VjaCBhcyBDTE9VREZMQVJFX1IyX0FDQ0VTU19LRVlfSUQgc3RheSBlbGlnaWJsZS5cbiAgJ0NGX0FDQ09VTlRfSUQnLFxuICAnQ0ZfQVBJX0JBU0VfVVJMJyxcbiAgJ0NGX0FQSV9FTUFJTCcsXG4gICdDRl9BUElfS0VZJyxcbiAgJ0NGX0FQSV9UT0tFTicsXG4gICdDRl9FTUFJTCcsXG4gICdDTE9VREZMQVJFX0FDQ0VTU19DTElFTlRfSUQnLFxuICAnQ0xPVURGTEFSRV9BQ0NFU1NfQ0xJRU5UX1NFQ1JFVCcsXG4gICdDTE9VREZMQVJFX0FDQ09VTlRfSUQnLFxuICAnQ0xPVURGTEFSRV9BUElfQkFTRV9VUkwnLFxuICAnQ0xPVURGTEFSRV9BUElfS0VZJyxcbiAgJ0NMT1VERkxBUkVfQVBJX1RPS0VOJyxcbiAgJ0NMT1VERkxBUkVfQVVUSF9VU0VfS0VZUklORycsXG4gICdDTE9VREZMQVJFX0QxX0RBVEFCQVNFX0lEJyxcbiAgJ0NMT1VERkxBUkVfRU1BSUwnLFxuICAnQ0xPVURGTEFSRV9FTlYnLFxuICAnQ0xPVURGTEFSRV9JTkNMVURFX1BST0NFU1NfRU5WJyxcbiAgJ0NMT1VERkxBUkVfTE9BRF9ERVZfVkFSU19GUk9NX0RPVF9FTlYnLFxuICAnRE9DS0VSX0hPU1QnLFxuICAnSFRUUF9QUk9YWScsXG4gICdIVFRQU19QUk9YWScsXG4gICdodHRwX3Byb3h5JyxcbiAgJ2h0dHBzX3Byb3h5JyxcbiAgJ0ZPUkNFX0NPTE9SJyxcbiAgJ01JTklGTEFSRV9DQUNIRV9ESVInLFxuICAnTUlTRV9FTlYnLFxuICAnTk9fQ09MT1InLFxuICAnTkVYVF9QVUJMSUNfV0JfRU5WJyxcbiAgJ05FWFRfUFVCTElDX1dCX1ZFUlNJT04nLFxuICAnTk9ERV9FTlYnLFxuICAnUE9SVCcsXG4gICdXQl9FTlYnLFxuICAnV0JfVkVSU0lPTicsXG5dKTtcblxuY29uc3QgTk9OX1NFQ1JFVF9LRVlfUFJFRklYRVMgPSBbJ1dSQU5HTEVSXycsICdDTE9VREZMQVJFX0hZUEVSRFJJVkVfTE9DQUxfQ09OTkVDVElPTl9TVFJJTkdfJywgJ0NMT1VERkxBUkVfQ0ZfRkVUQ0hfJ107XG5cbmZ1bmN0aW9uIGlzTm9uU2VjcmV0S2V5KGtleTogc3RyaW5nKTogYm9vbGVhbiB7XG4gIHJldHVybiBOT05fU0VDUkVUX0tFWVMuaGFzKGtleSkgfHwgTk9OX1NFQ1JFVF9LRVlfUFJFRklYRVMuc29tZSgocHJlZml4KSA9PiBrZXkuc3RhcnRzV2l0aChwcmVmaXgpKTtcbn1cblxuY29uc3QgYnVpbGRlciA9IHt9IGFzIGNvbnN0O1xuXG50eXBlIERlcGxveUNvbW1hbmRPcHRpb25zID0gSW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgYnVpbGRlciAmIHR5cGVvZiBzaGFyZWRPcHRpb25zQnVpbGRlcj47XG50eXBlIERlcGxveUNvbW1hbmRBcmd2ID0gQXJndW1lbnRzQ2FtZWxDYXNlPERlcGxveUNvbW1hbmRPcHRpb25zPjtcblxuZXhwb3J0IGNvbnN0IGRlcGxveUNvbW1hbmQ6IENvbW1hbmRNb2R1bGU8dW5rbm93biwgRGVwbG95Q29tbWFuZE9wdGlvbnM+ID0ge1xuICBjb21tYW5kOiAnZGVwbG95JyxcbiAgZGVzY3JpYmU6XG4gICAgJ0RlcGxveSBhIENsb3VkZmxhcmUgV29ya2VycyBhcHAgKHZpbmV4dCBvciBwbGFpbiBXb3JrZXIpIHRvIHRoZSBXQl9FTlYgZW52aXJvbm1lbnQ6IHZhbGlkYXRlIHNlY3JldHMsIGJ1aWxkLCBhcHBseSByZW1vdGUgRDEgbWlncmF0aW9ucywgdGhlbiBkZXBsb3kgY29kZSBhbmQgc2VjcmV0cyBhdG9taWNhbGx5LicsXG4gIGJ1aWxkZXI6ICh5YXJncykgPT4geWFyZ3MgYXMgdW5rbm93biBhcyBBcmd2PERlcGxveUNvbW1hbmRPcHRpb25zPixcbiAgYXN5bmMgaGFuZGxlcihhcmd2OiBEZXBsb3lDb21tYW5kQXJndikge1xuICAgIC8vIEEgc3RyYXkgZXhwb3J0ZWQgQ0xPVURGTEFSRV9FTlYgd291bGQgYmFrZSB0aGUgd3JvbmcgZW52aXJvbm1lbnQgaW50byB0aGUgYnVpbGQgYW5kXG4gICAgLy8gYXBwbHkgdGhlIGVudmlyb25tZW50IHN1ZmZpeCB0d2ljZSBvbiBkZXBsb3k7IGl0IGlzIHJlLXNldCBleHBsaWNpdGx5IHdoZXJlIG5lZWRlZC5cbiAgICAvLyBBIGRvdGVudiBmaWxlIGRlZmluaW5nIGl0IHN0aWxsIHN1cmZhY2VzIHRocm91Z2ggcHJvamVjdC5lbnYsIHdoaWNoIHRoZSBleHBsaWNpdCBgLS1lbnZgXG4gICAgLy8gZmxhZ3MgYmVsb3cgb3ZlcnJpZGUuXG4gICAgZGVsZXRlIHByb2Nlc3MuZW52LkNMT1VERkxBUkVfRU5WO1xuXG4gICAgY29uc3QgcHJvamVjdCA9IGZpbmRTZWxmUHJvamVjdChhcmd2KTtcbiAgICBpZiAoIXByb2plY3QpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoY2hhbGsucmVkKCdObyBwcm9qZWN0IGZvdW5kLicpKTtcbiAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICB9XG4gICAgY29uc3Qgd3JhbmdsZXJDb25maWdQYXRoID0gZmluZFdyYW5nbGVyQ29uZmlnUGF0aChwcm9qZWN0KTtcbiAgICBpZiAoIXdyYW5nbGVyQ29uZmlnUGF0aCkge1xuICAgICAgY29uc29sZS5lcnJvcihjaGFsay5yZWQoJ3diIGRlcGxveSBjdXJyZW50bHkgc3VwcG9ydHMgb25seSBDbG91ZGZsYXJlIFdvcmtlcnMgYXBwcyAobm8gd3JhbmdsZXIgY29uZmlnIGZvdW5kKS4nKSk7XG4gICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgfVxuICAgIGNvbnN0IGVudk5hbWUgPSBwcm9qZWN0LmVudi5XQl9FTlY7XG4gICAgaWYgKCFlbnZOYW1lIHx8IGVudk5hbWUgPT09ICdkZXZlbG9wbWVudCcgfHwgZW52TmFtZSA9PT0gJ3Rlc3QnKSB7XG4gICAgICBjb25zb2xlLmVycm9yKFxuICAgICAgICBjaGFsay5yZWQoYFdCX0VOViBtdXN0IG5hbWUgYSBkZXBsb3kgZW52aXJvbm1lbnQgKGUuZy4gc3RhZ2luZyBvciBwcm9kdWN0aW9uKSwgYnV0IGlzICR7ZW52TmFtZX0uYClcbiAgICAgICk7XG4gICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgfVxuXG4gICAgLy8gVGhlIHZhbHVlcyBnbyBpbnRvIGJvdGggcHJvY2Vzcy5lbnYgKGluaGVyaXRlZCBieSBldmVyeXRoaW5nIHdiIHNwYXducykgYW5kIHByb2plY3QuZW52XG4gICAgLy8gKHRoZSBlbnZpcm9ubWVudCB3YiBpdHNlbGYgcmVhZHMgYW5kIHBhc3NlcyBleHBsaWNpdGx5KTsgdGhlIGxhdHRlciBpcyBhIGNhY2hlZCBzbmFwc2hvdFxuICAgIC8vIHRha2VuIGJlZm9yZSB0aGlzIHBvaW50LCBzbyB3cml0aW5nIG9ubHkgdG8gcHJvY2Vzcy5lbnYgd291bGQgbGVhdmUgd2IncyBvd24gcHJlZmxpZ2h0IOKAlFxuICAgIC8vIGFuZCBhbnkgY29tbWFuZCBzcGF3bmVkIHdpdGggcHJvamVjdC5lbnYg4oCUIHdpdGhvdXQgdGhlIHRva2VuLlxuICAgIC8vIE9ubHkgLS1pbmNsdWRlLXJvb3QtZW52IGdhdGVzIHRoZSByb290IGxvb2t1cCwgbm90IGFuIGV4cGxpY2l0IC0tZW52OiAtLWVudiByZXBsYWNlcyB0aGVcbiAgICAvLyBkb3RlbnYgVkFSSUFCTEUgc291cmNlcywgd2hpbGUgLmVudi5jbG91ZGZsYXJlIGlzIGEgY3JlZGVudGlhbCBzaWRlY2FyIHJlYWQgb3V0c2lkZSB0aGF0XG4gICAgLy8gY2FzY2FkZSAodGhlIHByb2plY3QncyBvd24gY29weSBpcyByZWFkIHJlZ2FyZGxlc3Mgb2YgLS1lbnYsIGFzIGl0IGFsd2F5cyBoYXMgYmVlbikuXG4gICAgLy8gR2F0aW5nIG9uIC0tZW52IHdvdWxkIG1ha2UgYHdiIGRlcGxveSAtLWVudiA8ZmlsZT5gIHNpbGVudGx5IHN0b3AgZmluZGluZyB0aGUgcmVwbydzIHRva2VuLlxuICAgIGNvbnN0IGNsb3VkZmxhcmVFbnZWYXJzID0gcmVhZENsb3VkZmxhcmVFbnZGaWxlcyhcbiAgICAgIHByb2plY3QuZGlyUGF0aCxcbiAgICAgIGFyZ3YuaW5jbHVkZVJvb3RFbnYgPyBwcm9qZWN0LnJvb3REaXJQYXRoIDogdW5kZWZpbmVkXG4gICAgKTtcbiAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhjbG91ZGZsYXJlRW52VmFycykpIHtcbiAgICAgIC8vID8/PSBzbyB0aGF0IGFuIGV4cGxpY2l0bHkgZXhwb3J0ZWQgZW1wdHkgdmFsdWUgc3RpbGwgd2lucyBvdmVyIHRoZSBmaWxlLlxuICAgICAgcHJvY2Vzcy5lbnZba2V5XSA/Pz0gdmFsdWU7XG4gICAgICBwcm9qZWN0LmVudltrZXldID8/PSB2YWx1ZTtcbiAgICB9XG5cbiAgICBsZXQgcmVzb2x2ZWRDb25maWc6IFJlc29sdmVkV3JhbmdsZXJDb25maWcgfCB1bmRlZmluZWQ7XG4gICAgdHJ5IHtcbiAgICAgIHJlc29sdmVkQ29uZmlnID0gcmVzb2x2ZVdyYW5nbGVyQ29uZmlnRm9yRW52KHByb2plY3QsIGVudk5hbWUpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBjb25zb2xlLmVycm9yKGNoYWxrLnJlZChTdHJpbmcoZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiBlcnJvcikpKTtcbiAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICB9XG4gICAgaWYgKCFyZXNvbHZlZENvbmZpZykge1xuICAgICAgY29uc29sZS5lcnJvcihjaGFsay5yZWQoYEZhaWxlZCB0byBwYXJzZSAke3dyYW5nbGVyQ29uZmlnUGF0aH0uYCkpO1xuICAgICAgcHJvY2Vzcy5leGl0KDEpO1xuICAgIH1cbiAgICBjb25zdCBhY2NvdW50SWQgPSByZXNvbHZlZENvbmZpZy5hY2NvdW50SWQgPz8gcHJvamVjdC5lbnYuQ0xPVURGTEFSRV9BQ0NPVU5UX0lEO1xuICAgIC8vIFByZWZlciB3cmFuZ2xlci1uYXRpdmUgbWlncmF0aW9ucyB3aGVuZXZlciB0aGUgcmVzb2x2ZWQgZW52aXJvbm1lbnQncyBEMSBiaW5kaW5ncyBoYXZlIGFuXG4gICAgLy8gZXhpc3RpbmcgbWlncmF0aW9ucyBkaXJlY3RvcnkuIEEgZHJpenpsZS1vcm0gZGVwZW5kZW5jeSBhbG9uZSBkb2VzIG5vdCBpbXBseSB0aGUgcHJvamVjdFxuICAgIC8vIG1pZ3JhdGVzIEQxIHdpdGggZHJpenpsZS1raXQncyBkMS1odHRwIGRyaXZlcjogdGhlIGV4cGxpY2l0IG1hcmtlciBpcyBhIGRyaXp6bGUgY29uZmlnXG4gICAgLy8gd2hvc2UgZGlhbGVjdC9kcml2ZXIgdGFyZ2V0cyBzcWxpdGUgLyBkMS1odHRwIC8gZHVyYWJsZS1zcWxpdGUgKHNlZSB1c2VzRHJpenpsZUtpdEZvckQxO1xuICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9XaWxsQm9vc3Rlci9zaGFyZWQvaXNzdWVzLzk0MikuIEEgZHJpenpsZSBjb25maWcgdGFyZ2V0aW5nIGFub3RoZXJcbiAgICAvLyBkYXRhYmFzZSAoZS5nLiBQb3N0Z3JlU1FMIHZpYSBIeXBlcmRyaXZlKSBsZWF2ZXMgdGhlIEQxIGJpbmRpbmdzIHVubWFuYWdlZCBieSB3YiBkZXBsb3kuXG4gICAgY29uc3Qgd3JhbmdsZXJOYXRpdmVEMURhdGFiYXNlcyA9IHJlc29sdmVkQ29uZmlnLmQxRGF0YWJhc2VzLmZpbHRlcigoZGF0YWJhc2UpID0+XG4gICAgICB1c2VzV3JhbmdsZXJOYXRpdmVNaWdyYXRpb25zKHByb2plY3QsIGRhdGFiYXNlKVxuICAgICk7XG4gICAgY29uc3QgZHJpenpsZUtpdE1hbmFnZXNEMSA9IHVzZXNEcml6emxlS2l0Rm9yRDEocHJvamVjdCk7XG4gICAgaWYgKFxuICAgICAgZHJpenpsZUtpdE1hbmFnZXNEMSAmJlxuICAgICAgd3JhbmdsZXJOYXRpdmVEMURhdGFiYXNlcy5sZW5ndGggPiAwICYmXG4gICAgICB3cmFuZ2xlck5hdGl2ZUQxRGF0YWJhc2VzLmxlbmd0aCA8IHJlc29sdmVkQ29uZmlnLmQxRGF0YWJhc2VzLmxlbmd0aFxuICAgICkge1xuICAgICAgLy8gTWlncmF0aW5nIG9ubHkgdGhlIHdyYW5nbGVyLW5hdGl2ZSBzdWJzZXQgd291bGQgc2lsZW50bHkgZGVwbG95IGNvZGUgYWdhaW5zdCB0aGVcbiAgICAgIC8vIG90aGVyLCB1bm1pZ3JhdGVkIGRhdGFiYXNlcy5cbiAgICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICAgIGNoYWxrLnJlZCgnd2IgZGVwbG95IGRvZXMgbm90IHN1cHBvcnQgbWl4aW5nIHdyYW5nbGVyLW5hdGl2ZSBhbmQgbm9uLW5hdGl2ZSBEMSBtaWdyYXRpb24gbGF5b3V0cy4nKVxuICAgICAgKTtcbiAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICB9XG4gICAgY29uc3QgZHJpenpsZUQxRGF0YWJhc2UgPVxuICAgICAgd3JhbmdsZXJOYXRpdmVEMURhdGFiYXNlcy5sZW5ndGggPT09IDAgJiYgZHJpenpsZUtpdE1hbmFnZXNEMSA/IHJlc29sdmVkQ29uZmlnLmQxRGF0YWJhc2VzWzBdIDogdW5kZWZpbmVkO1xuICAgIGlmICh3cmFuZ2xlck5hdGl2ZUQxRGF0YWJhc2VzLmxlbmd0aCA9PT0gMCAmJiBkcml6emxlS2l0TWFuYWdlc0QxICYmIHJlc29sdmVkQ29uZmlnLmQxRGF0YWJhc2VzLmxlbmd0aCA+IDEpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICAgIGNoYWxrLnJlZCgnd2IgZGVwbG95IHN1cHBvcnRzIGRyaXp6bGUta2l0IG1pZ3JhdGlvbnMgb25seSBmb3IgYSBzaW5nbGUgRDEgYmluZGluZzsgZm91bmQgbXVsdGlwbGUuJylcbiAgICAgICk7XG4gICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgfVxuICAgIGNvbnN0IG1hbmFnZWREMURhdGFiYXNlcyA9IG5ldyBTZXQod3JhbmdsZXJOYXRpdmVEMURhdGFiYXNlcyk7XG4gICAgaWYgKGRyaXp6bGVEMURhdGFiYXNlKSBtYW5hZ2VkRDFEYXRhYmFzZXMuYWRkKGRyaXp6bGVEMURhdGFiYXNlKTtcbiAgICBjb25zdCB1bm1hbmFnZWREMURhdGFiYXNlcyA9IHJlc29sdmVkQ29uZmlnLmQxRGF0YWJhc2VzLmZpbHRlcigoZGF0YWJhc2UpID0+ICFtYW5hZ2VkRDFEYXRhYmFzZXMuaGFzKGRhdGFiYXNlKSk7XG4gICAgaWYgKHVubWFuYWdlZEQxRGF0YWJhc2VzLmxlbmd0aCA+IDApIHtcbiAgICAgIC8vIFNheSBzbyBvdXQgbG91ZCBpbnN0ZWFkIG9mIHNpbGVudGx5IGRlcGxveWluZyBjb2RlIGFnYWluc3QgdW5taWdyYXRlZCBkYXRhYmFzZXM6IHRoZVxuICAgICAgLy8gZHJpenpsZSBtYXJrZXIgZGV0ZWN0aW9uIGlzIGhldXJpc3RpYyAodGV4dCBzY2FuIG9mIGRyaXp6bGUuY29uZmlnLiopLCBzbyBhIHByb2plY3QgdGhhdFxuICAgICAgLy8gZ2VudWluZWx5IG1pZ3JhdGVzIEQxIG11c3QgYmUgYWJsZSB0byBub3RpY2Ugd2hlbiBubyBtZWNoYW5pc20gd2FzIHNlbGVjdGVkLiBUaGlzIGFsc29cbiAgICAgIC8vIGNvdmVycyBwYXJ0aWFsIGxheW91dHMgKHNvbWUgYmluZGluZ3Mgd3JhbmdsZXItbmF0aXZlLCBvdGhlcnMgdW5tYW5hZ2VkKS5cbiAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgY2hhbGsueWVsbG93KFxuICAgICAgICAgIGBObyBEMSBtaWdyYXRpb24gbWVjaGFuaXNtIGRldGVjdGVkIGZvciAke3VubWFuYWdlZEQxRGF0YWJhc2VzXG4gICAgICAgICAgICAubWFwKChkYXRhYmFzZSkgPT4gZGF0YWJhc2UuYmluZGluZyA/PyBkYXRhYmFzZS5kYXRhYmFzZV9uYW1lID8/ICd1bm5hbWVkIGJpbmRpbmcnKVxuICAgICAgICAgICAgLmpvaW4oJywgJyl9IGAgK1xuICAgICAgICAgICAgJyhubyB3cmFuZ2xlciBtaWdyYXRpb25zIGRpcmVjdG9yeSBhbmQgbm8gZHJpenpsZSBjb25maWcgdGFyZ2V0aW5nIHNxbGl0ZS9kMS1odHRwL2R1cmFibGUtc3FsaXRlKTsgd2IgZGVwbG95IHdpbGwgbm90IHJ1biBEMSBtaWdyYXRpb25zIGZvciB0aGVtLidcbiAgICAgICAgKVxuICAgICAgKTtcbiAgICB9XG4gICAgLy8gRHJ5IHJ1bnMgZXhlY3V0ZSBub3RoaW5nIGF1dGhlbnRpY2F0ZWQsIHNvIHRoZXkgc2tpcCB0aGUgY3JlZGVudGlhbCBwcmVmbGlnaHQgZW50aXJlbHkuXG4gICAgaWYgKCFhcmd2LmRyeVJ1bikge1xuICAgICAgLy8gQSBkcml6emxlLXNlbGVjdGVkIEQxIGRhdGFiYXNlIHJvdXRlcyBib3RoIHRoZSBtaWdyYXRpb24gaW4gc3RlcCAzIGFuZCBhbnkgZGVwbG95L3Bvc3RcbiAgICAgIC8vIGhvb2sgdGhyb3VnaCBkcml6emxlLWtpdCdzIGQxLWh0dHAgZHJpdmVyLCB3aGljaCBuZWVkcyBDTE9VREZMQVJFX0FQSV9UT0tFTiBldmVuIGZvclxuICAgICAgLy8gbG9jYWwsIHdyYW5nbGVyLU9BdXRoIGRlcGxveXMuIEZhaWxpbmcgaGVyZSBrZWVwcyB0aGUgZmFpbC1mYXN0IG9yZGVyaW5nOiBhIG1pc3NpbmcgdG9rZW5cbiAgICAgIC8vIG11c3QgYWJvcnQgYmVmb3JlIHRoZSBkZXBsb3kgZ29lcyBsaXZlLCBub3QgZHVyaW5nIG1pZ3JhdGlvbiBvciBkZXBsb3kvcG9zdFxuICAgICAgLy8gKGh0dHBzOi8vZ2l0aHViLmNvbS9XaWxsQm9vc3Rlci9zaGFyZWQvaXNzdWVzLzk1NikuIFdyYW5nbGVyLW5hdGl2ZSBwcm9qZWN0cyAod2l0aCBvclxuICAgICAgLy8gd2l0aG91dCBob29rcykgbXVzdCBub3QgcmVxdWlyZSB0aGUgdG9rZW46IGEgbG9jYWwgd3JhbmdsZXIgT0F1dGggbG9naW4gc3VmZmljZXMgdGhlcmUsXG4gICAgICAvLyBldmVuIHRob3VnaCBzdGVwIDUgc3RpbGwgZXhwb3J0cyBDTE9VREZMQVJFX0QxX0RBVEFCQVNFX0lEIHRvIHRoZWlyIGhvb2tzLlxuICAgICAgaWYgKGRyaXp6bGVEMURhdGFiYXNlICYmICFwcm9qZWN0LmVudi5DTE9VREZMQVJFX0FQSV9UT0tFTikge1xuICAgICAgICBjb25zb2xlLmVycm9yKGNoYWxrLnJlZCgnQ0xPVURGTEFSRV9BUElfVE9LRU4gaXMgcmVxdWlyZWQgZm9yIHJlbW90ZSBkcml6emxlLWtpdCBtaWdyYXRpb25zLicpKTtcbiAgICAgICAgcHJvY2Vzcy5leGl0KDEpO1xuICAgICAgfVxuICAgICAgY29uc3QgaGFzV3JhbmdsZXJBdXRoZW50aWNhdGlvbiA9XG4gICAgICAgICEhcHJvamVjdC5lbnYuQ0xPVURGTEFSRV9BUElfVE9LRU4gfHxcbiAgICAgICAgISFwcm9qZWN0LmVudi5DRl9BUElfVE9LRU4gfHxcbiAgICAgICAgISEocHJvamVjdC5lbnYuQ0xPVURGTEFSRV9BUElfS0VZICYmIHByb2plY3QuZW52LkNMT1VERkxBUkVfRU1BSUwpIHx8XG4gICAgICAgICEhKHByb2plY3QuZW52LkNGX0FQSV9LRVkgJiYgcHJvamVjdC5lbnYuQ0ZfRU1BSUwpO1xuICAgICAgaWYgKGlzQ0kocHJvamVjdC5lbnYuQ0kpICYmICFoYXNXcmFuZ2xlckF1dGhlbnRpY2F0aW9uKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoY2hhbGsucmVkKCdXcmFuZ2xlciBhdXRoZW50aWNhdGlvbiAoZS5nLiBDTE9VREZMQVJFX0FQSV9UT0tFTikgaXMgcmVxdWlyZWQgdG8gZGVwbG95IG9uIENJLicpKTtcbiAgICAgICAgcHJvY2Vzcy5leGl0KDEpO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIEFwcC1zcGVjaWZpYyB2YWxpZGF0aW9uIGhvb2sgKGUuZy4gc2VjcmV0IHBhaXJzIHRoYXQgbXVzdCBiZSBib3RoLXNldC1vci1ib3RoLWVtcHR5KS5cbiAgICAvLyBUaGUgcmV1c2FibGUgZGVwbG95LnltbCBhbHJlYWR5IHJ1bnMgaXQgb24gQ0k7IHJ1biBpdCBoZXJlIGZvciBsb2NhbCBkZXBsb3lzLlxuICAgIGlmICghaXNDSShwcm9qZWN0LmVudi5DSSkgJiYgcHJvamVjdC5wYWNrYWdlSnNvbi5zY3JpcHRzPy5bJ2RlcGxveS9jaS1zZXR1cCddKSB7XG4gICAgICBhd2FpdCBydW5XaXRoU3Bhd24oJ1lBUk4gcnVuIGRlcGxveS9jaS1zZXR1cCcsIHByb2plY3QsIGFyZ3YpO1xuICAgIH1cblxuICAgIC8vIDEuIFJlc29sdmUgYW5kIHZhbGlkYXRlIGFsbCBzZWNyZXRzIGJlZm9yZSBhbnkgYnVpbGQgb3IgcmVtb3RlIG11dGF0aW9uLCBzbyBhIG1pc3NpbmdcbiAgICAvLyAgICBzZWNyZXQgYWJvcnRzIHRoZSBkZXBsb3kgaW5zdGVhZCBvZiBsZWF2aW5nIGEgbWlncmF0ZWQgZGF0YWJhc2UgYmVoaW5kIGFuIG9sZCBXb3JrZXIuXG4gICAgY29uc3QgW2VudlZhcnMsIGVudlNvdXJjZXNdID0gcmVhZEVudmlyb25tZW50VmFyaWFibGVzKGFyZ3YsIHByb2plY3QuZGlyUGF0aCwgeyBpZ25vcmVQcm9jZXNzRW52OiB0cnVlIH0pO1xuICAgIC8vIFJlc3RyaWN0IHRoZSBzZWNyZXRzIGRvbWFpbiB0byBrZXlzIGRlZmluZWQgaW4gdGhlIHByb2plY3QncyAuZW52IGZpbGVzOiBgbWlzZSBlbnZgXG4gICAgLy8gb3V0cHV0IChyZXBvcnRlZCBhcyBhIHBzZXVkby1zb3VyY2UpIG1peGVzIGluIGhvc3QvdG9vbCB2YXJpYWJsZXMgc3VjaCBhcyBDQVJHT19IT01FLFxuICAgIC8vIHdoaWNoIG11c3QgbmV2ZXIgYmUgdXBsb2FkZWQgYXMgV29ya2VyIHNlY3JldHMuXG4gICAgY29uc3QgZG90ZW52S2V5cyA9IG5ldyBTZXQoXG4gICAgICBlbnZTb3VyY2VzLmZpbHRlcigoW3NvdXJjZV0pID0+ICFzb3VyY2Uuc3RhcnRzV2l0aCgnbWlzZSBlbnYnKSkuZmxhdE1hcCgoWywga2V5c10pID0+IGtleXMpXG4gICAgKTtcbiAgICBmb3IgKGNvbnN0IGtleSBvZiBPYmplY3Qua2V5cyhlbnZWYXJzKSkge1xuICAgICAgaWYgKCFkb3RlbnZLZXlzLmhhcyhrZXkpKSBkZWxldGUgZW52VmFyc1trZXldO1xuICAgIH1cbiAgICBjb25zdCByZXF1aXJlZEtleXMgPSByZWFkRW52RXhhbXBsZUtleXMocHJvamVjdCk7XG4gICAgZm9yIChjb25zdCBrZXkgb2YgcmVxdWlyZWRLZXlzKSB7XG4gICAgICBlbnZWYXJzW2tleV0gPz89IHByb2plY3QuZW52W2tleV0gPz8gJyc7XG4gICAgfVxuICAgIC8vIE5hbWVzIGRlY2xhcmVkIHZpYSB3cmFuZ2xlciBgc2VjcmV0cy5yZXF1aXJlZGAgbWF5IGxpa2V3aXNlIGJlIHN1cHBsaWVkIHB1cmVseSBhc1xuICAgIC8vIGV4cG9ydGVkIGVudmlyb25tZW50IHZhcmlhYmxlcyAoZS5nLiBDSSB3b3JrZmxvdyBlbnYpIGluc3RlYWQgb2YgZG90ZW52IHZhbHVlcy5cbiAgICBmb3IgKGNvbnN0IGtleSBvZiByZXNvbHZlZENvbmZpZy5yZXF1aXJlZFNlY3JldE5hbWVzKSB7XG4gICAgICBjb25zdCBleHBvcnRlZFZhbHVlID0gcHJvamVjdC5lbnZba2V5XTtcbiAgICAgIGlmIChlbnZWYXJzW2tleV0gPT09IHVuZGVmaW5lZCAmJiBleHBvcnRlZFZhbHVlICE9PSB1bmRlZmluZWQpIGVudlZhcnNba2V5XSA9IGV4cG9ydGVkVmFsdWU7XG4gICAgfVxuICAgIC8vIEV4cGxpY2l0bHkgZXhwb3J0ZWQgZW52aXJvbm1lbnQgdmFyaWFibGVzIG11c3Qgd2luIG92ZXIgZG90ZW52IHZhbHVlcyAocHJvamVjdC5lbnYgYWxyZWFkeVxuICAgIC8vIGFwcGxpZXMgdGhhdCBwcmVjZWRlbmNlKSwgb3IgYEFVVEhfU0VDUkVUPS4uLiB3YiBkZXBsb3lgIHdvdWxkIHB1c2ggdGhlIHN0YWxlIGZpbGUgdmFsdWUuXG4gICAgZm9yIChjb25zdCBrZXkgb2YgT2JqZWN0LmtleXMoZW52VmFycykpIHtcbiAgICAgIGNvbnN0IGVmZmVjdGl2ZVZhbHVlID0gcHJvamVjdC5lbnZba2V5XTtcbiAgICAgIGlmIChlZmZlY3RpdmVWYWx1ZSAhPT0gdW5kZWZpbmVkKSBlbnZWYXJzW2tleV0gPSBlZmZlY3RpdmVWYWx1ZTtcbiAgICB9XG4gICAgY29uc3QgeyBtaXNzaW5nS2V5cywgc2VjcmV0cyB9ID0gc2VsZWN0V29ya2VyU2VjcmV0cyhcbiAgICAgIGVudlZhcnMsXG4gICAgICBbLi4ucmVzb2x2ZWRDb25maWcudmFyS2V5cywgLi4ucmVzb2x2ZWRDb25maWcuYmluZGluZ05hbWVzXSxcbiAgICAgIHJlcXVpcmVkS2V5c1xuICAgICk7XG4gICAgLy8gYC0tdmFyIFdCX1ZFUlNJT046Li4uYCB0YWtlcyBwcmVjZWRlbmNlIG92ZXIgY29uZmlndXJhdGlvbiB2YWx1ZXMgb24gZGVwbG95LCBzbyBhXG4gICAgLy8gcmVzb3VyY2UgYmluZGluZyBvZiB0aGF0IG5hbWUgd291bGQgc2lsZW50bHkgYmVjb21lIGEgc3RyaW5nIHZhcmlhYmxlLlxuICAgIGlmIChwcm9qZWN0LmVudi5XQl9WRVJTSU9OICYmIHJlc29sdmVkQ29uZmlnLmJpbmRpbmdOYW1lcy5pbmNsdWRlcygnV0JfVkVSU0lPTicpKSB7XG4gICAgICBjb25zb2xlLmVycm9yKGNoYWxrLnJlZCgnV0JfVkVSU0lPTiBjb2xsaWRlcyB3aXRoIGEgV29ya2VyIGJpbmRpbmcgbmFtZTsgcmVuYW1lIHRoZSBiaW5kaW5nLicpKTtcbiAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICB9XG4gICAgY29uc3QgYmluZGluZ0NvbGxpc2lvbnMgPSBPYmplY3Qua2V5cyhlbnZWYXJzKS5maWx0ZXIoKGtleSkgPT4gcmVzb2x2ZWRDb25maWcuYmluZGluZ05hbWVzLmluY2x1ZGVzKGtleSkpO1xuICAgIGlmIChiaW5kaW5nQ29sbGlzaW9ucy5sZW5ndGggPiAwKSB7XG4gICAgICAvLyBVcGxvYWRpbmcgYSBzZWNyZXQgbmFtZWQgbGlrZSBhIGJpbmRpbmcgd291bGQgcmVwbGFjZSB0aGUgYmluZGluZyB3aXRoIGEgcGxhaW4gc3RyaW5nLlxuICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICBjaGFsay55ZWxsb3coYFNraXBwaW5nIGVudiBrZXlzIHRoYXQgY29sbGlkZSB3aXRoIFdvcmtlciBiaW5kaW5nIG5hbWVzOiAke2JpbmRpbmdDb2xsaXNpb25zLmpvaW4oJywgJyl9YClcbiAgICAgICk7XG4gICAgfVxuICAgIGlmIChtaXNzaW5nS2V5cy5sZW5ndGggPiAwKSB7XG4gICAgICBjb25zb2xlLmVycm9yKFxuICAgICAgICBjaGFsay5yZWQoXG4gICAgICAgICAgYE1pc3NpbmcgcmVxdWlyZWQgZW52aXJvbm1lbnQgdmFyaWFibGVzIChmcm9tIC5lbnYuZXhhbXBsZSBvciB3cmFuZ2xlciBzZWNyZXRzLnJlcXVpcmVkKTogJHttaXNzaW5nS2V5cy5qb2luKCcsICcpfWBcbiAgICAgICAgKVxuICAgICAgKTtcbiAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICB9XG4gICAgLy8gV3JhbmdsZXIgdmFsaWRhdGVzIGBzZWNyZXRzLnJlcXVpcmVkYCBvbmx5IGR1cmluZyB0aGUgcmVhbCB1cGxvYWQg4oCUIGFmdGVyIG1pZ3JhdGlvbnMg4oCUXG4gICAgLy8gc28gd2IgY2hlY2tzIHVwZnJvbnQ6IGVhY2ggcmVxdWlyZWQgbmFtZSBtdXN0IGJlIGEga2V5IGluIHRoZSBvdXRnb2luZyBwYXlsb2FkIChwcmVzZW5jZSxcbiAgICAvLyBub3QgdHJ1dGhpbmVzcyDigJQgYW4gZXhwbGljaXQgZW1wdHkgY2xlYXJzIGEgc3RhbGUgdmFsdWUpIG9yIGFuIGVmZmVjdGl2ZSB2YXIvYmluZGluZy5cbiAgICBjb25zdCB1bnNhdGlzZmllZFJlcXVpcmVkU2VjcmV0TmFtZXMgPSByZXNvbHZlZENvbmZpZy5yZXF1aXJlZFNlY3JldE5hbWVzLmZpbHRlcihcbiAgICAgIChuYW1lKSA9PlxuICAgICAgICAhT2JqZWN0Lmhhc093bihzZWNyZXRzLCBuYW1lKSAmJlxuICAgICAgICAhcmVzb2x2ZWRDb25maWcudmFyS2V5cy5pbmNsdWRlcyhuYW1lKSAmJlxuICAgICAgICAhcmVzb2x2ZWRDb25maWcuYmluZGluZ05hbWVzLmluY2x1ZGVzKG5hbWUpXG4gICAgKTtcbiAgICBpZiAodW5zYXRpc2ZpZWRSZXF1aXJlZFNlY3JldE5hbWVzLmxlbmd0aCA+IDApIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICAgIGNoYWxrLnJlZChcbiAgICAgICAgICBgU2VjcmV0cyByZXF1aXJlZCBieSB0aGUgd3JhbmdsZXIgY29uZmlnIGFyZSBub3QgcHJvdmlkZWQ6ICR7dW5zYXRpc2ZpZWRSZXF1aXJlZFNlY3JldE5hbWVzLmpvaW4oJywgJyl9YFxuICAgICAgICApXG4gICAgICApO1xuICAgICAgcHJvY2Vzcy5leGl0KDEpO1xuICAgIH1cbiAgICBjb25zdCBzZWNyZXRLZXlzID0gT2JqZWN0LmtleXMoc2VjcmV0cykudG9Tb3J0ZWQoKTtcbiAgICAvLyBDbG91ZGZsYXJlIGxpbWl0cyBhIGJ1bGsgdXBsb2FkIHRvIDEwMCBzZWNyZXRzLCBlYWNoIHZhcmlhYmxlL3NlY3JldCB2YWx1ZSB0byA1IEtCLCBhbmRcbiAgICAvLyB0aGUgY29tYmluZWQgdmFyaWFibGUrc2VjcmV0IGNvdW50IHRvIDEyOCAoNjQgb24gdGhlIEZyZWUgcGxhbiwgd2hpY2ggY2Fubm90IGJlIGRldGVjdGVkXG4gICAgLy8gaGVyZSDigJQgaGVuY2UgYSB3YXJuaW5nKS4gRmFpbGluZyBiZWZvcmUgYW55IGJ1aWxkIG9yIG1pZ3JhdGlvbiBrZWVwcyBhbiBvdmVyc2l6ZWQgcGF5bG9hZFxuICAgIC8vIGZyb20gYWJvcnRpbmcgdGhlIGRlcGxveSBhZnRlciByZW1vdGUgbWlncmF0aW9ucyBhbHJlYWR5IHJhbi5cbiAgICBpZiAoc2VjcmV0S2V5cy5sZW5ndGggPiAxMDApIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICAgIGNoYWxrLnJlZChgQ2xvdWRmbGFyZSBhY2NlcHRzIGF0IG1vc3QgMTAwIHNlY3JldHMgcGVyIGRlcGxveSwgYnV0ICR7c2VjcmV0S2V5cy5sZW5ndGh9IHdlcmUgc2VsZWN0ZWQuYClcbiAgICAgICk7XG4gICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgfVxuICAgIC8vIFRoZSBDTEktcHJvdmlkZWQgV0JfVkVSU0lPTiBvdmVybGF5cyBhIGNvbmZpZ3VyZWQgdmFyIG9mIHRoZSBzYW1lIG5hbWUgb24gZGVwbG95LFxuICAgIC8vIHNvIG9ubHkgdGhlIGVmZmVjdGl2ZSB2YWx1ZSBwYXJ0aWNpcGF0ZXMgaW4gdGhlIGxpbWl0IGNoZWNrcy5cbiAgICBjb25zdCBlZmZlY3RpdmVWYXJzID0gbmV3IE1hcChPYmplY3QuZW50cmllczx1bmtub3duPihyZXNvbHZlZENvbmZpZy52YXJzKSk7XG4gICAgaWYgKHByb2plY3QuZW52LldCX1ZFUlNJT04pIGVmZmVjdGl2ZVZhcnMuc2V0KCdXQl9WRVJTSU9OJywgcHJvamVjdC5lbnYuV0JfVkVSU0lPTik7XG4gICAgY29uc3QgdmFyRW50cmllcyA9IFsuLi5lZmZlY3RpdmVWYXJzXTtcbiAgICBjb25zdCBvdmVyc2l6ZWRLZXlzID0gW1xuICAgICAgLi4uc2VjcmV0S2V5cy5maWx0ZXIoKGtleSkgPT4gQnVmZmVyLmJ5dGVMZW5ndGgoc2VjcmV0c1trZXldID8/ICcnLCAndXRmOCcpID4gNSAqIDEwMjQpLFxuICAgICAgLi4udmFyRW50cmllc1xuICAgICAgICAuZmlsdGVyKFxuICAgICAgICAgIChbLCB2YWx1ZV0pID0+IEJ1ZmZlci5ieXRlTGVuZ3RoKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycgPyB2YWx1ZSA6IEpTT04uc3RyaW5naWZ5KHZhbHVlKSwgJ3V0ZjgnKSA+IDUgKiAxMDI0XG4gICAgICAgIClcbiAgICAgICAgLm1hcCgoW2tleV0pID0+IGtleSksXG4gICAgXTtcbiAgICBpZiAob3ZlcnNpemVkS2V5cy5sZW5ndGggPiAwKSB7XG4gICAgICBjb25zb2xlLmVycm9yKGNoYWxrLnJlZChgVmFyaWFibGUgb3Igc2VjcmV0IHZhbHVlcyBleGNlZWQgQ2xvdWRmbGFyZSdzIDUgS0IgbGltaXQ6ICR7b3ZlcnNpemVkS2V5cy5qb2luKCcsICcpfWApKTtcbiAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICB9XG4gICAgLy8gYC0tc2VjcmV0cy1maWxlYCBpcyBhZGRpdGl2ZTogcmVtb3RlIHNlY3JldHMgYWJzZW50IGZyb20gdGhlIHBheWxvYWQgc3RheSBhdHRhY2hlZCB0byB0aGVcbiAgICAvLyBuZXcgdmVyc2lvbiwgc28gdGhleSBjb3VudCBhZ2FpbnN0IHRoZSBjb21iaW5lZCBsaW1pdCB0b28uIExpc3RpbmcgdGhlbSBuZWVkcyBhblxuICAgIC8vIGF1dGhlbnRpY2F0ZWQgcmVtb3RlIHJvdW5kLXRyaXAsIHdoaWNoIGRyeSBydW5zIHNraXA7IHdoZW4gdGhlIGxpc3RpbmcgZmFpbHMgZm9yIGFueVxuICAgIC8vIHJlYXNvbiBvdGhlciB0aGFuIGEgbm90LXlldC1jcmVhdGVkIFdvcmtlciwgZGVncmFkZSB0byB0aGUgbG9jYWwtb25seSBjb3VudCBpbnN0ZWFkIG9mXG4gICAgLy8gYmxvY2tpbmcgYSBkZXBsb3kgdGhhdCB3cmFuZ2xlciBpdHNlbGYgbWlnaHQgYWNjZXB0LlxuICAgIGNvbnN0IHJlbW90ZVNlY3JldE5hbWVzID0gYXJndi5kcnlSdW5cbiAgICAgID8gW11cbiAgICAgIDogYXdhaXQgbGlzdFJlbW90ZVdvcmtlclNlY3JldE5hbWVzKHByb2plY3QsIGFyZ3YsIHdyYW5nbGVyQ29uZmlnUGF0aCwgcmVzb2x2ZWRDb25maWcsIGVudk5hbWUpO1xuICAgIGNvbnN0IGluaGVyaXRlZFNlY3JldE5hbWVzID0gc2VsZWN0SW5oZXJpdGVkUmVtb3RlU2VjcmV0TmFtZXMoXG4gICAgICByZW1vdGVTZWNyZXROYW1lcyA/PyBbXSxcbiAgICAgIHNlY3JldHMsXG4gICAgICB2YXJFbnRyaWVzLm1hcCgoW2tleV0pID0+IGtleSksXG4gICAgICByZXNvbHZlZENvbmZpZy5iaW5kaW5nTmFtZXNcbiAgICApO1xuICAgIGNvbnN0IGNvbWJpbmVkQ291bnQgPVxuICAgICAgbmV3IFNldChbLi4uc2VjcmV0S2V5cywgLi4udmFyRW50cmllcy5tYXAoKFtrZXldKSA9PiBrZXkpXSkuc2l6ZSArIGluaGVyaXRlZFNlY3JldE5hbWVzLmxlbmd0aDtcbiAgICBjb25zdCBpbmhlcml0ZWROb3RlID1cbiAgICAgIGluaGVyaXRlZFNlY3JldE5hbWVzLmxlbmd0aCA+IDBcbiAgICAgICAgPyBgIChpbmNsdWRpbmcgJHtpbmhlcml0ZWRTZWNyZXROYW1lcy5sZW5ndGh9IHJlbW90ZSBzZWNyZXRzIGtlcHQgZnJvbSB0aGUgcHJldmlvdXMgdmVyc2lvbjogJHtpbmhlcml0ZWRTZWNyZXROYW1lcy5qb2luKCcsICcpfSlgXG4gICAgICAgIDogJyc7XG4gICAgaWYgKGNvbWJpbmVkQ291bnQgPiAxMjgpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICAgIGNoYWxrLnJlZChcbiAgICAgICAgICBgQ2xvdWRmbGFyZSBhbGxvd3MgYXQgbW9zdCAxMjggdmFyaWFibGVzIGFuZCBzZWNyZXRzIGNvbWJpbmVkLCBidXQgJHtjb21iaW5lZENvdW50fSB3ZXJlIHNlbGVjdGVkJHtpbmhlcml0ZWROb3RlfS5gXG4gICAgICAgIClcbiAgICAgICk7XG4gICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgfVxuICAgIGlmIChjb21iaW5lZENvdW50ID4gNjQpIHtcbiAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgY2hhbGsueWVsbG93KGAke2NvbWJpbmVkQ291bnR9IHZhcmlhYmxlcyBhbmQgc2VjcmV0cyR7aW5oZXJpdGVkTm90ZX0gZXhjZWVkIHRoZSBGcmVlIHBsYW4ncyBsaW1pdCBvZiA2NC5gKVxuICAgICAgKTtcbiAgICB9XG4gICAgY29uc29sZS5pbmZvKFxuICAgICAgY2hhbGsuY3lhbihcbiAgICAgICAgYERlcGxveWluZyAke3Jlc29sdmVkQ29uZmlnLndvcmtlck5hbWUgPz8gcHJvamVjdC5uYW1lfSAoJHtlbnZOYW1lfSkgd2l0aCAke3NlY3JldEtleXMubGVuZ3RofSBzZWNyZXRzOiAke3NlY3JldEtleXMuam9pbignLCAnKX1gXG4gICAgICApXG4gICAgKTtcblxuICAgIC8vIDIuIEJ1aWxkICh2aW5leHQgZW1iZWRzIHRoZSBlbnZpcm9ubWVudC1hcHBsaWVkIHdyYW5nbGVyIGNvbmZpZyBpbnRvIGRpc3Qvc2VydmVyL3dyYW5nbGVyLmpzb24pLlxuICAgIC8vICAgIEJ1aWxkaW5nIGJlZm9yZSBtaWdyYXRpbmcga2VlcHMgYSBidWlsZCBmYWlsdXJlIGZyb20gbGVhdmluZyBhIG1pZ3JhdGVkIHNjaGVtYSBiZWhpbmRcbiAgICAvLyAgICB0aGUgb2xkIFdvcmtlci4gUGxhaW4gV29ya2VycyBoYXZlIG5vIGJ1aWxkIHN0ZXA7IHdyYW5nbGVyIGJ1bmRsZXMgdGhlIGVudHJ5IGl0c2VsZi5cbiAgICBjb25zdCBpc1ZpbmV4dCA9ICEhKHByb2plY3QucGFja2FnZUpzb24uZGVwZW5kZW5jaWVzPy52aW5leHQgPz8gcHJvamVjdC5wYWNrYWdlSnNvbi5kZXZEZXBlbmRlbmNpZXM/LnZpbmV4dCk7XG4gICAgY29uc3QgZGVwbG95Q29uZmlnUGF0aCA9IGlzVmluZXh0ID8gcGF0aC5qb2luKCdkaXN0JywgJ3NlcnZlcicsICd3cmFuZ2xlci5qc29uJykgOiB3cmFuZ2xlckNvbmZpZ1BhdGg7XG4gICAgY29uc3QgY2xvdWRmbGFyZUVudkFzc2lnbm1lbnQgPSByZXNvbHZlZENvbmZpZy51c2VzRW52U2VjdGlvblxuICAgICAgPyBgJHtidWlsZFNoZWxsRW52aXJvbm1lbnRBc3NpZ25tZW50KCdDTE9VREZMQVJFX0VOVicsIGVudk5hbWUpfSBgXG4gICAgICA6ICcnO1xuICAgIGlmIChpc1ZpbmV4dCkge1xuICAgICAgaWYgKHByb2plY3QuZW52LldCX1ZFUlNJT04pIHtcbiAgICAgICAgcHJvamVjdC5lbnYuTkVYVF9QVUJMSUNfV0JfVkVSU0lPTiB8fD0gcHJvamVjdC5lbnYuV0JfVkVSU0lPTjtcbiAgICAgIH1cbiAgICAgIGlmIChwcm9qZWN0LnBhY2thZ2VKc29uLnNjcmlwdHM/LlsnZ2VuLWNvZGUnXSkge1xuICAgICAgICBhd2FpdCBydW5XaXRoU3Bhd24oJ1lBUk4gcnVuIGdlbi1jb2RlJywgcHJvamVjdCwgYXJndik7XG4gICAgICB9XG4gICAgICBhd2FpdCBydW5XaXRoU3Bhd24oYCR7Y2xvdWRmbGFyZUVudkFzc2lnbm1lbnR9WUFSTiB2aW5leHQgYnVpbGRgLCBwcm9qZWN0LCBhcmd2KTtcbiAgICAgIC8vIE9uIGRyeSBydW5zIHRoZSB2aW5leHQgYnVpbGQgYWJvdmUgaXMgYSBwcmludGVkIG5vLW9wLCBzbyB0aGUgYnVpbHQgY29uZmlnIGlzXG4gICAgICAvLyBsZWdpdGltYXRlbHkgYWJzZW50IGFuZCBtdXN0IG5vdCBhYm9ydCB0aGUgcnVuLlxuICAgICAgaWYgKCFhcmd2LmRyeVJ1biAmJiAhZnMuZXhpc3RzU3luYyhwYXRoLnJlc29sdmUocHJvamVjdC5kaXJQYXRoLCBkZXBsb3lDb25maWdQYXRoKSkpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcihjaGFsay5yZWQoYCR7ZGVwbG95Q29uZmlnUGF0aH0gbm90IGZvdW5kOyB0aGUgdmluZXh0IGJ1aWxkIGRpZCBub3QgcHJvZHVjZSBhIGRlcGxveSBjb25maWcuYCkpO1xuICAgICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgICB9XG4gICAgICAvLyBXcmFuZ2xlciB2YWxpZGF0ZXMgaXRzIGNvbmZpZyBzY2hlbWEgb25seSB3aGVuIGl0IHJ1bnMsIHNvIGEgZHJ5IHJ1biBvZiB0aGUgYnVpbHRcbiAgICAgIC8vIGNvbmZpZyBzdXJmYWNlcyBjb25maWcgYW5kIGJ1bmRsZSBlcnJvcnMgQkVGT1JFIHRoZSByZW1vdGUgbWlncmF0aW9ucyBiZWxvdyBtdXRhdGVcbiAgICAgIC8vIHRoZSBkYXRhYmFzZSwgbWlycm9yaW5nIHRoZSBwbGFpbi1Xb3JrZXIgZHJ5IHJ1bi4gTm8gLS1lbnY6IHRoZSBidWlsdCBjb25maWcgYWxyZWFkeVxuICAgICAgLy8gaGFzIHRoZSBlbnZpcm9ubWVudCBhcHBsaWVkLlxuICAgICAgYXdhaXQgcnVuV2l0aFNwYXduKFxuICAgICAgICBgWUFSTiB3cmFuZ2xlciBkZXBsb3kgLS1kcnktcnVuIC0tY29uZmlnICR7c2hlbGxFc2NhcGVBcmd1bWVudChkZXBsb3lDb25maWdQYXRoKX1gLFxuICAgICAgICBwcm9qZWN0LFxuICAgICAgICBhcmd2XG4gICAgICApO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBQbGFpbiBXb3JrZXJzIGFyZSBmaXJzdCBjb21waWxlZCBieSB3cmFuZ2xlciBkdXJpbmcgdGhlIGRlcGxveSBpdHNlbGY7IGEgZHJ5IHJ1blxuICAgICAgLy8gc3VyZmFjZXMgY29tcGlsZSBlcnJvcnMgKGUuZy4gYSBtaXNzaW5nIGVudHJ5IHBvaW50KSBCRUZPUkUgdGhlIHJlbW90ZSBtaWdyYXRpb25zXG4gICAgICAvLyBiZWxvdyBtdXRhdGUgdGhlIGRhdGFiYXNlLlxuICAgICAgYXdhaXQgcnVuV2l0aFNwYXduKFxuICAgICAgICBgWUFSTiB3cmFuZ2xlciBkZXBsb3kgLS1kcnktcnVuIC0tY29uZmlnICR7c2hlbGxFc2NhcGVBcmd1bWVudCh3cmFuZ2xlckNvbmZpZ1BhdGgpfSR7cmVzb2x2ZWRDb25maWcudXNlc0VudlNlY3Rpb24gPyBgIC0tZW52ICR7c2hlbGxFc2NhcGVBcmd1bWVudChlbnZOYW1lKX1gIDogJyd9YCxcbiAgICAgICAgcHJvamVjdCxcbiAgICAgICAgYXJndlxuICAgICAgKTtcbiAgICB9XG5cbiAgICAvLyAzLiBBcHBseSBEMSBtaWdyYXRpb25zIHRvIHRoZSByZW1vdGUgZGF0YWJhc2Ugd2l0aCB0aGUgcHJvamVjdCdzIHNpbmdsZSBtaWdyYXRpb25cbiAgICAvLyAgICBtZWNoYW5pc20gKHdyYW5nbGVyLW5hdGl2ZSB3aGVuIGEgbWlncmF0aW9ucyBkaXJlY3RvcnkgZXhpc3RzLCBlbHNlIGRyaXp6bGUta2l0IHdoZW5cbiAgICAvLyAgICB0aGUgZHJpenpsZSBjb25maWcgdGFyZ2V0cyBzcWxpdGUvZDEtaHR0cC9kdXJhYmxlLXNxbGl0ZSkuIE1pZ3JhdGlvbnMgbXVzdCBiZSBiYWNrd2FyZFxuICAgIC8vICAgIGNvbXBhdGlibGU6IHRoZSBvbGQgV29ya2VyIHNlcnZlc1xuICAgIC8vICAgIHRyYWZmaWMgdW50aWwgdGhlIGRlcGxveSBiZWxvdy5cbiAgICBjb25zdCBlbnZPcHRpb24gPSByZXNvbHZlZENvbmZpZy51c2VzRW52U2VjdGlvbiA/IGAgLS1lbnYgJHtzaGVsbEVzY2FwZUFyZ3VtZW50KGVudk5hbWUpfWAgOiAnJztcbiAgICBmb3IgKGNvbnN0IGRhdGFiYXNlIG9mIHdyYW5nbGVyTmF0aXZlRDFEYXRhYmFzZXMpIHtcbiAgICAgIGNvbnN0IGRhdGFiYXNlTmFtZSA9IGRhdGFiYXNlLmRhdGFiYXNlX25hbWUgPz8gZGF0YWJhc2UuYmluZGluZztcbiAgICAgIGlmICghZGF0YWJhc2VOYW1lKSBjb250aW51ZTtcbiAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bihcbiAgICAgICAgYENJPXRydWUgWUFSTiB3cmFuZ2xlciBkMSBtaWdyYXRpb25zIGFwcGx5ICR7c2hlbGxFc2NhcGVBcmd1bWVudChkYXRhYmFzZU5hbWUpfSAtLXJlbW90ZSAtLWNvbmZpZyAke3NoZWxsRXNjYXBlQXJndW1lbnQod3JhbmdsZXJDb25maWdQYXRoKX0ke2Vudk9wdGlvbn1gLFxuICAgICAgICBwcm9qZWN0LFxuICAgICAgICBhcmd2XG4gICAgICApO1xuICAgIH1cbiAgICBpZiAoZHJpenpsZUQxRGF0YWJhc2UpIHtcbiAgICAgIGlmICghZHJpenpsZUQxRGF0YWJhc2UuZGF0YWJhc2VfaWQpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcihjaGFsay5yZWQoYFRoZSAke2Vudk5hbWV9IEQxIGJpbmRpbmcgaGFzIG5vIGRhdGFiYXNlX2lkIGluIHRoZSB3cmFuZ2xlciBjb25maWcuYCkpO1xuICAgICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgICB9XG4gICAgICBpZiAoIWFjY291bnRJZCkge1xuICAgICAgICBjb25zb2xlLmVycm9yKFxuICAgICAgICAgIGNoYWxrLnJlZChcbiAgICAgICAgICAgICdDTE9VREZMQVJFX0FDQ09VTlRfSUQgKG9yIGFjY291bnRfaWQgaW4gdGhlIHdyYW5nbGVyIGNvbmZpZykgaXMgcmVxdWlyZWQgZm9yIHJlbW90ZSBkcml6emxlLWtpdCBtaWdyYXRpb25zLidcbiAgICAgICAgICApXG4gICAgICAgICk7XG4gICAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICAgIH1cbiAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bihcbiAgICAgICAgYnVpbGREcml6emxlS2l0Q29tbWFuZChcbiAgICAgICAgICBwcm9qZWN0LFxuICAgICAgICAgICdtaWdyYXRlJyxcbiAgICAgICAgICBgQ0xPVURGTEFSRV9EMV9EQVRBQkFTRV9JRD0ke2RyaXp6bGVEMURhdGFiYXNlLmRhdGFiYXNlX2lkfSBDTE9VREZMQVJFX0FDQ09VTlRfSUQ9JHthY2NvdW50SWR9YFxuICAgICAgICApLFxuICAgICAgICBwcm9qZWN0LFxuICAgICAgICBhcmd2XG4gICAgICApO1xuICAgIH1cblxuICAgIC8vIDQuIERlcGxveSBjb2RlIGFuZCBzZWNyZXRzIGF0b21pY2FsbHkgKG5vIHBvc3QtZGVwbG95IHNlY3JldCBwdXNoIHRoYXQgY291bGQgbGVhdmUgdGhlXG4gICAgLy8gICAgbmV3IHZlcnNpb24gcnVubmluZyB3aXRob3V0IOKAlCBvciB3aXRoIHN0YWxlIOKAlCBzZWNyZXRzKS4gVGhlIHNlY3JldHMgSlNPTiBnb2VzIHRocm91Z2hcbiAgICAvLyAgICBhIG1vZGUtMDYwMCBmaWxlIGluIGEgcHJpdmF0ZSB0ZW1wb3JhcnkgZGlyZWN0b3J5IGRlbGV0ZWQgcmlnaHQgYWZ0ZXIgdGhlIGRlcGxveTpcbiAgICAvLyAgICAvZGV2L3N0ZGluIGlzIE5PVCByZWxpYWJsZSBoZXJlIGJlY2F1c2Ugd3JhbmdsZXIgcmVhZHMgdGhlIHNlY3JldHMgZmlsZSBvbmx5IGFmdGVyXG4gICAgLy8gICAgdXBsb2FkaW5nIGFzc2V0cywgYnkgd2hpY2ggcG9pbnQgdGhlIHBpcGVkIHN0ZGluIG1heSBhbHJlYWR5IGhhdmUgYmVlbiBjb25zdW1lZCDigJRcbiAgICAvLyAgICBvYnNlcnZlZCBhcyBhIGZsYWt5IGBDb3VsZCBub3QgcmVhZCBmaWxlOiAvZGV2L3N0ZGluYCBvbiBDSS4gRXhwbGljaXRseSBlbXB0eSB2YWx1ZXNcbiAgICAvLyAgICBzdGF5IGluIHRoZSBwYXlsb2FkOiAtLXNlY3JldHMtZmlsZSBpcyBhZGRpdGl2ZSwgc28gcHVzaGluZyAnJyBpcyB0aGUgb25seSB3YXkgdG9cbiAgICAvLyAgICBjbGVhciBhIHN0YWxlIHNlY3JldC5cbiAgICBjb25zdCBkZXBsb3lBcmdzID0gW1xuICAgICAgJ2RlcGxveScsXG4gICAgICAnLS1jb25maWcnLFxuICAgICAgZGVwbG95Q29uZmlnUGF0aCxcbiAgICAgIC8vIHZpbmV4dCdzIGJ1aWx0IGNvbmZpZyBhbHJlYWR5IGhhcyB0aGUgZW52aXJvbm1lbnQgYXBwbGllZDsgcGFzc2luZyAtLWVudiB0aGVyZSB3b3VsZFxuICAgICAgLy8gYXBwbHkgdGhlIGVudmlyb25tZW50IHN1ZmZpeCB0d2ljZS5cbiAgICAgIC4uLighaXNWaW5leHQgJiYgcmVzb2x2ZWRDb25maWcudXNlc0VudlNlY3Rpb24gPyBbJy0tZW52JywgZW52TmFtZV0gOiBbXSksXG4gICAgICAuLi4ocHJvamVjdC5lbnYuV0JfVkVSU0lPTiA/IFsnLS12YXInLCBgV0JfVkVSU0lPTjoke3Byb2plY3QuZW52LldCX1ZFUlNJT059YF0gOiBbXSksXG4gICAgICAnLS1zZWNyZXRzLWZpbGUnLFxuICAgIF07XG4gICAgY29uc29sZS5pbmZvKGNoYWxrLmN5YW4oYFJ1bm5pbmc6IHdyYW5nbGVyICR7ZGVwbG95QXJncy5qb2luKCcgJyl9IDx0ZW1wb3Jhcnkgc2VjcmV0cyBmaWxlPmApKTtcbiAgICBpZiAoIWFyZ3YuZHJ5UnVuKSB7XG4gICAgICBwcmVwYXJlTG9jYWxCaW5QYXRoKHByb2plY3QpO1xuICAgICAgY29uc3QgZGVwbG95RW52ID0geyAuLi5wcm9qZWN0LmVudiB9O1xuICAgICAgZGVsZXRlIGRlcGxveUVudi5DTE9VREZMQVJFX0VOVjtcbiAgICAgIC8vIDBvNzAwIGRpcmVjdG9yeSArIDBvNjAwIGZpbGU6IHJlYWRhYmxlIG9ubHkgYnkgdGhlIGRlcGxveWluZyB1c2VyLCBsaWtlIHRoZSBkb3RlbnZcbiAgICAgIC8vIGZpbGVzIHRoZSBDSSB3b3JrZmxvdyBhbHJlYWR5IHdyaXRlcyBuZXh0IHRvIGl0LiB3cmFuZ2xlciBydW5zIHRocm91Z2ggYW4gYXN5bmMgc3Bhd25cbiAgICAgIC8vIChzcGF3blN5bmMgd291bGQgYmxvY2sgdGhlIGV2ZW50IGxvb3AsIHNvIGEgc2h1dGRvd24gc2lnbmFsIHdvdWxkIGtpbGwgdGhlIHByb2Nlc3NcbiAgICAgIC8vIGJlZm9yZSBhbnkgY2xlYW51cCkgYW5kIHRoZSBkaXJlY3RvcnkgaXMgcmVtb3ZlZCBpbiBhIGZpbmFsbHksIHNvIGFuIGludGVycnVwdGVkXG4gICAgICAvLyBkZXBsb3kgY2Fubm90IGxlYXZlIHRoZSBwbGFpbnRleHQgc2VjcmV0cyBiZWhpbmQuIFNodXRkb3duIGhhbmRsaW5nIGRldGFpbHM6XG4gICAgICAvLyAtIEhhbmRsZXJzIChpbmNsdWRpbmcgU0lHSFVQLCBvbiB3aGljaCBOb2RlIGFsc28gdGVybWluYXRlcyBieSBkZWZhdWx0KSBhcmUgaW5zdGFsbGVkXG4gICAgICAvLyAgIEJFRk9SRSB0aGUgZmlsZSBpcyB3cml0dGVuIGFuZCB1c2UgcHJvY2Vzcy5vbiwgbm90IG9uY2UsIHNvIGEgcmVwZWF0ZWQgc2lnbmFsIGNhbm5vdFxuICAgICAgLy8gICBmYWxsIGJhY2sgdG8gZGVmYXVsdCB0ZXJtaW5hdGlvbiBhbmQgYnlwYXNzIHRoZSBmaW5hbGx5IGNsZWFudXAuXG4gICAgICAvLyAtIFNJR0hVUC9TSUdRVUlUIGFyZSBmb3J3YXJkZWQgdG8gd3JhbmdsZXIgYXMgU0lHVEVSTTogd3JhbmdsZXIncyBsYXVuY2hlciByZWxheXMgb25seVxuICAgICAgLy8gICBTSUdJTlQvU0lHVEVSTSB0byBpdHMgaW5uZXIgTm9kZSBwcm9jZXNzLCBhbmQgYW55dGhpbmcgZWxzZSB3b3VsZCBvcnBoYW4gYSBkZXBsb3ltZW50XG4gICAgICAvLyAgIHRoYXQga2VlcHMgbXV0YXRpbmcgdGhlIHJlbW90ZSBXb3JrZXIgYWZ0ZXIgd2IgZXhpdHMuXG4gICAgICAvLyAtIFRoZSByZS1yYWlzZSBiZWxvdyB1c2VzIHRoZSBzaWduYWwgd2IgaXRzZWxmIHJlY2VpdmVkOiB3cmFuZ2xlciBjYXRjaGVzIFNJR0lOVCBhbmRcbiAgICAgIC8vICAgZXhpdHMgbnVtZXJpY2FsbHkgKGUuZy4gMTQzKSwgd2hpY2ggbXVzdCBub3QgbWFzcXVlcmFkZSBhcyBhbiBvcmRpbmFyeSBmYWlsdXJlLlxuICAgICAgY29uc3Qgc2VjcmV0c0RpclBhdGggPSBmcy5ta2R0ZW1wU3luYyhwYXRoLmpvaW4ob3MudG1wZGlyKCksICd3Yi1kZXBsb3ktJykpO1xuICAgICAgY29uc3Qgc2h1dGRvd25TaWduYWxzID0gWydTSUdIVVAnLCAnU0lHSU5UJywgJ1NJR1RFUk0nLCAnU0lHUVVJVCddIGFzIGNvbnN0O1xuICAgICAgY29uc3Qgc2lnbmFsSGFuZGxlcnMgPSBuZXcgTWFwPE5vZGVKUy5TaWduYWxzLCAoKSA9PiB2b2lkPigpO1xuICAgICAgbGV0IHdyYW5nbGVyUHJvY2VzczogUmV0dXJuVHlwZTx0eXBlb2Ygc3Bhd24+IHwgdW5kZWZpbmVkO1xuICAgICAgbGV0IHJlY2VpdmVkU2h1dGRvd25TaWduYWw6IE5vZGVKUy5TaWduYWxzIHwgdW5kZWZpbmVkO1xuICAgICAgZm9yIChjb25zdCBzaWduYWwgb2Ygc2h1dGRvd25TaWduYWxzKSB7XG4gICAgICAgIGNvbnN0IHNpZ25hbEhhbmRsZXIgPSAoKTogdm9pZCA9PiB7XG4gICAgICAgICAgcmVjZWl2ZWRTaHV0ZG93blNpZ25hbCA/Pz0gc2lnbmFsO1xuICAgICAgICAgIGlmICh3cmFuZ2xlclByb2Nlc3MpIHtcbiAgICAgICAgICAgIHdyYW5nbGVyUHJvY2Vzcy5raWxsKHNpZ25hbCA9PT0gJ1NJR0lOVCcgfHwgc2lnbmFsID09PSAnU0lHVEVSTScgPyBzaWduYWwgOiAnU0lHVEVSTScpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IFtzaHV0ZG93blNpZ25hbCwgaGFuZGxlcl0gb2Ygc2lnbmFsSGFuZGxlcnMpIHtcbiAgICAgICAgICAgICAgcHJvY2Vzcy5vZmYoc2h1dGRvd25TaWduYWwsIGhhbmRsZXIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZnMucm1TeW5jKHNlY3JldHNEaXJQYXRoLCB7IGZvcmNlOiB0cnVlLCByZWN1cnNpdmU6IHRydWUgfSk7XG4gICAgICAgICAgICAvLyBXaXRoIHRoZSBoYW5kbGVycyByZW1vdmVkLCByZS1yYWlzaW5nIHRyaWdnZXJzIHRoZSBkZWZhdWx0IGJlaGF2aW9yLlxuICAgICAgICAgICAgcHJvY2Vzcy5raWxsKHByb2Nlc3MucGlkLCBzaWduYWwpO1xuICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgICAgc2lnbmFsSGFuZGxlcnMuc2V0KHNpZ25hbCwgc2lnbmFsSGFuZGxlcik7XG4gICAgICAgIHByb2Nlc3Mub24oc2lnbmFsLCBzaWduYWxIYW5kbGVyKTtcbiAgICAgIH1cbiAgICAgIGxldCBkZXBsb3lTdGF0dXM6IG51bWJlciB8IHVuZGVmaW5lZDtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHNlY3JldHNGaWxlUGF0aCA9IHBhdGguam9pbihzZWNyZXRzRGlyUGF0aCwgJ3NlY3JldHMuanNvbicpO1xuICAgICAgICBmcy53cml0ZUZpbGVTeW5jKHNlY3JldHNGaWxlUGF0aCwgSlNPTi5zdHJpbmdpZnkoc2VjcmV0cyksIHsgbW9kZTogMG82MDAgfSk7XG4gICAgICAgIGRlcGxveVN0YXR1cyA9IGF3YWl0IG5ldyBQcm9taXNlPG51bWJlciB8IHVuZGVmaW5lZD4oKHJlc29sdmUpID0+IHtcbiAgICAgICAgICB3cmFuZ2xlclByb2Nlc3MgPSBzcGF3bignd3JhbmdsZXInLCBbLi4uZGVwbG95QXJncywgc2VjcmV0c0ZpbGVQYXRoXSwge1xuICAgICAgICAgICAgY3dkOiBwcm9qZWN0LmRpclBhdGgsXG4gICAgICAgICAgICBlbnY6IGRlcGxveUVudiBhcyBOb2RlSlMuUHJvY2Vzc0VudixcbiAgICAgICAgICAgIHN0ZGlvOiBbJ2lnbm9yZScsICdpbmhlcml0JywgJ2luaGVyaXQnXSxcbiAgICAgICAgICB9KTtcbiAgICAgICAgICB3cmFuZ2xlclByb2Nlc3Mub24oJ2Vycm9yJywgKGVycm9yKSA9PiB7XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKGVycm9yKTtcbiAgICAgICAgICAgIHJlc29sdmUoMSk7XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgd3JhbmdsZXJQcm9jZXNzLm9uKCdleGl0JywgKGNvZGUsIHNpZ25hbCkgPT4ge1xuICAgICAgICAgICAgcmVzb2x2ZShzaWduYWwgPyAxIDogKGNvZGUgPz8gdW5kZWZpbmVkKSk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgLy8gcHJvY2Vzcy5leGl0IHNraXBzIGZpbmFsbHkgYmxvY2tzLCBzbyB0aGUgZXhpdC1vbi1mYWlsdXJlIGJlbG93IHN0YXlzIG91dHNpZGUuXG4gICAgICAgIGZvciAoY29uc3QgW3NodXRkb3duU2lnbmFsLCBzaWduYWxIYW5kbGVyXSBvZiBzaWduYWxIYW5kbGVycykge1xuICAgICAgICAgIHByb2Nlc3Mub2ZmKHNodXRkb3duU2lnbmFsLCBzaWduYWxIYW5kbGVyKTtcbiAgICAgICAgfVxuICAgICAgICBmcy5ybVN5bmMoc2VjcmV0c0RpclBhdGgsIHsgZm9yY2U6IHRydWUsIHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgICAgIH1cbiAgICAgIGlmIChyZWNlaXZlZFNodXRkb3duU2lnbmFsKSB7XG4gICAgICAgIC8vIFJlLXJhaXNlIHNvIHRoZSBjYWxsZXIgb2JzZXJ2ZXMgdGhlIHNhbWUgc2lnbmFsLWRlcml2ZWQgZXhpdCBzdGF0dXMuXG4gICAgICAgIHByb2Nlc3Mua2lsbChwcm9jZXNzLnBpZCwgcmVjZWl2ZWRTaHV0ZG93blNpZ25hbCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGlmIChkZXBsb3lTdGF0dXMgIT09IDApIHtcbiAgICAgICAgY29uc29sZS5lcnJvcihjaGFsay5yZWQoYHdyYW5nbGVyIGRlcGxveSBmYWlsZWQgd2l0aCBleGl0IGNvZGUgJHtkZXBsb3lTdGF0dXMgPz8gJ3Vua25vd24nfS5gKSk7XG4gICAgICAgIHByb2Nlc3MuZXhpdChkZXBsb3lTdGF0dXMgPz8gMSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gNS4gT3B0aW9uYWwgcG9zdC1kZXBsb3kgaG9vayAoZS5nLiBzZWVkaW5nIHRoZSByZW1vdGUgRDEgdmlhIGRyaXp6bGUncyBkMS1odHRwIGRyaXZlcikuXG4gICAgLy8gICAgQXNzaWduIHRoZSByZXNvbHZlZCBpZHMgdW5jb25kaXRpb25hbGx5OiBhIHN0YWxlIGV4cG9ydGVkIENMT1VERkxBUkVfRDFfREFUQUJBU0VfSURcbiAgICAvLyAgICBtdXN0IG5vdCByZWRpcmVjdCB0aGUgaG9vayB0byBhbm90aGVyIGRhdGFiYXNlLlxuICAgIGlmIChwcm9qZWN0LnBhY2thZ2VKc29uLnNjcmlwdHM/LlsnZGVwbG95L3Bvc3QnXSkge1xuICAgICAgLy8gVGhlIGlkIGlzIHVuYW1iaWd1b3VzIG9ubHkgd2l0aCBhIHNpbmdsZSBEMSBiaW5kaW5nOyB3aXRoIG11bHRpcGxlLCB0aGUgaG9vayBtdXN0XG4gICAgICAvLyByZXNvbHZlIGl0cyB0YXJnZXQgaXRzZWxmLiBDbGVhciBmaXJzdCBlaXRoZXIgd2F5OiBhIHN0YWxlIGluaGVyaXRlZCBpZCBtdXN0IG5vdFxuICAgICAgLy8gcmVkaXJlY3QgdGhlIGhvb2sgdG8gYW5vdGhlciBkYXRhYmFzZS5cbiAgICAgIGNvbnN0IGhvb2tEMURhdGFiYXNlOiBXcmFuZ2xlckQxRGF0YWJhc2UgfCB1bmRlZmluZWQgPVxuICAgICAgICByZXNvbHZlZENvbmZpZy5kMURhdGFiYXNlcy5sZW5ndGggPT09IDEgPyByZXNvbHZlZENvbmZpZy5kMURhdGFiYXNlc1swXSA6IHVuZGVmaW5lZDtcbiAgICAgIGRlbGV0ZSBwcm9qZWN0LmVudi5DTE9VREZMQVJFX0QxX0RBVEFCQVNFX0lEO1xuICAgICAgaWYgKHJlc29sdmVkQ29uZmlnLmQxRGF0YWJhc2VzLmxlbmd0aCA+IDEpIHtcbiAgICAgICAgY29uc29sZS53YXJuKGNoYWxrLnllbGxvdygnTXVsdGlwbGUgRDEgYmluZGluZ3MgZXhpc3Q7IENMT1VERkxBUkVfRDFfREFUQUJBU0VfSUQgaXMgbm90IHNldCBmb3IgZGVwbG95L3Bvc3QuJykpO1xuICAgICAgfVxuICAgICAgaWYgKGhvb2tEMURhdGFiYXNlPy5kYXRhYmFzZV9pZCkgcHJvamVjdC5lbnYuQ0xPVURGTEFSRV9EMV9EQVRBQkFTRV9JRCA9IGhvb2tEMURhdGFiYXNlLmRhdGFiYXNlX2lkO1xuICAgICAgaWYgKGFjY291bnRJZCkgcHJvamVjdC5lbnYuQ0xPVURGTEFSRV9BQ0NPVU5UX0lEID0gYWNjb3VudElkO1xuICAgICAgYXdhaXQgcnVuV2l0aFNwYXduKCdZQVJOIHJ1biBkZXBsb3kvcG9zdCcsIHByb2plY3QsIGFyZ3YpO1xuICAgIH1cbiAgfSxcbn07XG5cbi8qKlxuICogUmVhZCB0aGUgQ2xvdWRmbGFyZSBBUEkgdG9rZW4gdGhhdCBDSSBkcm9wcyBpbiBhIGAuZW52LmNsb3VkZmxhcmVgIGZpbGUgKGUuZy4gdGhlIHJldXNhYmxlXG4gKiBkZXBsb3kgd29ya2Zsb3cncyBgZmlsZV9wYXRoXzFgKSwgbG9va2luZyBiZXNpZGUgdGhlIFdvcmtlcidzIHdyYW5nbGVyIGNvbmZpZyBhbmQgYXQgdGhlXG4gKiBtb25vcmVwbyByb290IOKAlCBgZmlsZV9wYXRoXzFgIGlzIHJlcG8tcmVsYXRpdmUsIHNvIGJvdGggc3BlbGxpbmdzIG9jY3VyIGluIHByYWN0aWNlLlxuICogTmVhcmVyIGZpbGVzIHdpbiwgbWlycm9yaW5nIHRoZSBgLmVudmAgY2FzY2FkZTogYSB3b3Jrc3BhY2UgbWF5IG92ZXJyaWRlIHRoZSByb290IHRva2VuLFxuICogbmV2ZXIgdGhlIHJldmVyc2UuIFBhc3MgYHJvb3REaXJQYXRoYCBhcyB1bmRlZmluZWQgdG8gcmVhZCB0aGUgd29ya3NwYWNlIGFsb25lLCBzbyB0aGF0XG4gKiBgLS1pbmNsdWRlLXJvb3QtZW52PWZhbHNlYCBpc29sYXRlcyB0aGlzIGZpbGUgZnJvbSB0aGUgcm9vdCBqdXN0IGFzIGl0IGRvZXMgdGhlIGNhc2NhZGUuXG4gKiBgQ0xPVURGTEFSRV9FTlZgIGlzIGRyb3BwZWQ7IGl0IHdvdWxkIGRvdWJsZS1hcHBseSB0aGUgZW52aXJvbm1lbnQgc3VmZml4LlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVhZENsb3VkZmxhcmVFbnZGaWxlcyhkaXJQYXRoOiBzdHJpbmcsIHJvb3REaXJQYXRoOiBzdHJpbmcgfCB1bmRlZmluZWQpOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+IHtcbiAgY29uc3QgZW52VmFyczogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHt9O1xuICBmb3IgKGNvbnN0IGN1cnJlbnREaXJQYXRoIG9mIG5ldyBTZXQocm9vdERpclBhdGggPyBbZGlyUGF0aCwgcm9vdERpclBhdGhdIDogW2RpclBhdGhdKSkge1xuICAgIGNvbnN0IGNsb3VkZmxhcmVFbnZQYXRoID0gcGF0aC5qb2luKGN1cnJlbnREaXJQYXRoLCAnLmVudi5jbG91ZGZsYXJlJyk7XG4gICAgaWYgKCFmcy5leGlzdHNTeW5jKGNsb3VkZmxhcmVFbnZQYXRoKSkgY29udGludWU7XG4gICAgY29uc3QgcGFyc2VkID0gY29uZmlnKHsgcGF0aDogY2xvdWRmbGFyZUVudlBhdGgsIHByb2Nlc3NFbnY6IHt9LCBxdWlldDogdHJ1ZSB9KS5wYXJzZWQgPz8ge307XG4gICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMocGFyc2VkKSkge1xuICAgICAgaWYgKGtleSA9PT0gJ0NMT1VERkxBUkVfRU5WJykgY29udGludWU7XG4gICAgICBlbnZWYXJzW2tleV0gPz89IHZhbHVlO1xuICAgIH1cbiAgfVxuICByZXR1cm4gZW52VmFycztcbn1cblxuLyoqXG4gKiBTZWxlY3QgdGhlIHNlY3JldHMgdG8gcHVzaCB0byB0aGUgV29ya2VyIGZyb20gdGhlIGRvdGVudi1sb2FkZWQgZW52aXJvbm1lbnQgdmFyaWFibGVzOlxuICogZXZlcnkgZXhwbGljaXRseSBzZXQgdmFsdWUg4oCUIGluY2x1ZGluZyBlbXB0eSBzdHJpbmdzLCB3aGljaCBjbGVhciBzdGFsZSByZW1vdGUgc2VjcmV0c1xuICogc2luY2UgYHdyYW5nbGVyIGRlcGxveSAtLXNlY3JldHMtZmlsZWAgaXMgYWRkaXRpdmUg4oCUIGV4Y2VwdCB3cmFuZ2xlciBgdmFyc2AgKGEgc2VjcmV0IG1heVxuICogbm90IHNoYXJlIGEgbmFtZSB3aXRoIGEgdmFyKSwgZGVwbG95LWNvbnRyb2wga2V5cywgYW5kIGxvY2FsIGBmaWxlOmAgREFUQUJBU0VfVVJMcy5cbiAqIFJldHVybnMgdGhlIHJlcXVpcmVkIGtleXMgKGZyb20gLmVudi5leGFtcGxlKSB0aGF0IGFyZSBzdGlsbCBlbXB0eSBzbyB0aGUgZGVwbG95IGNhblxuICogYWJvcnQgYmVmb3JlIGFueSByZW1vdGUgbXV0YXRpb24uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzZWxlY3RXb3JrZXJTZWNyZXRzKFxuICBlbnZWYXJzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+LFxuICBjb25maWdWYXJLZXlzOiBzdHJpbmdbXSxcbiAgcmVxdWlyZWRLZXlzOiBzdHJpbmdbXVxuKTogeyBtaXNzaW5nS2V5czogc3RyaW5nW107IHNlY3JldHM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gfSB7XG4gIGNvbnN0IGNvbmZpZ0tleXMgPSBuZXcgU2V0KGNvbmZpZ1ZhcktleXMpO1xuICBjb25zdCBzZWNyZXRzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge307XG4gIC8vIE5vIHJ1bnRpbWUgdW5kZWZpbmVkIGNoZWNrIG9uIGB2YWx1ZWA6IGVudlZhcnMgaXMgYnVpbHQgZXhjbHVzaXZlbHkgZnJvbSBkb3RlbnYtcGFyc2VkXG4gIC8vIHN0cmluZ3MsIGFuZCBldmVyeSBjYWxsZXItc2lkZSBtZXJnZSBlaXRoZXIgY29hbGVzY2VzIHdpdGggYD8/ICcnYCBvciBndWFyZHMgYWdhaW5zdFxuICAvLyB1bmRlZmluZWQgYmVmb3JlIGFzc2lnbmluZywgc28gdGhlIFJlY29yZDxzdHJpbmcsIHN0cmluZz4gdHlwZSBob2xkcyBhdCBydW50aW1lIHRvby5cbiAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMoZW52VmFycykpIHtcbiAgICBpZiAoY29uZmlnS2V5cy5oYXMoa2V5KSB8fCBpc05vblNlY3JldEtleShrZXkpKSBjb250aW51ZTtcbiAgICBpZiAoa2V5ID09PSAnREFUQUJBU0VfVVJMJyAmJiB2YWx1ZS5zdGFydHNXaXRoKCdmaWxlOicpKSBjb250aW51ZTtcbiAgICBzZWNyZXRzW2tleV0gPSB2YWx1ZTtcbiAgfVxuICBjb25zdCBtaXNzaW5nS2V5cyA9IHJlcXVpcmVkS2V5cy5maWx0ZXIoKGtleSkgPT4gIWNvbmZpZ0tleXMuaGFzKGtleSkgJiYgIWlzTm9uU2VjcmV0S2V5KGtleSkgJiYgIWVudlZhcnNba2V5XSk7XG4gIHJldHVybiB7IG1pc3NpbmdLZXlzLCBzZWNyZXRzIH07XG59XG5cbi8qKlxuICogTGlzdCB0aGUgc2VjcmV0IG5hbWVzIGN1cnJlbnRseSBhdHRhY2hlZCB0byB0aGUgZGVwbG95IHRhcmdldCBXb3JrZXIuIFJldHVybnMgdW5kZWZpbmVkIHdoZW5cbiAqIHRoZSBsaXN0aW5nIGZhaWxzIGZvciBhbnkgcmVhc29uIG90aGVyIHRoYW4gdGhlIFdvcmtlciBub3QgZXhpc3RpbmcgeWV0IChmaXJzdCBkZXBsb3kpLCBzb1xuICogdGhlIGNhbGxlciBjYW4gZGVncmFkZSB0byB0aGUgbG9jYWwtb25seSBsaW1pdCBjaGVja3MgaW5zdGVhZCBvZiBibG9ja2luZyBhIGRlcGxveSB0aGF0XG4gKiB3cmFuZ2xlciBpdHNlbGYgbWlnaHQgYWNjZXB0LiBGYWlsaW5nIGNsb3NlZCBpbnN0ZWFkIHdvdWxkIHR1cm4gZXZlcnkgdHJhbnNpZW50IGxpc3RpbmdcbiAqIGZhaWx1cmUgKG5ldHdvcmssIGEgdG9rZW4gd2l0aG91dCBzZWNyZXQtcmVhZCBwZXJtaXNzaW9uKSBpbnRvIGEgZGVwbG95IGJsb2NrZXIsIGFuZCDigJQgc2luY2VcbiAqIHdyYW5nbGVyIDQueCByZXBvcnRzIGEgbWlzc2luZyBXb3JrZXIgb25seSB2aWEgYW4gZXJyb3ItbWVzc2FnZSBoaW50IOKAlCBhbnkgdW5yZWNvZ25pemVkXG4gKiBub3QtZm91bmQgc2hhcGUgd291bGQgdGhlbiBibG9jayBmaXJzdCBkZXBsb3lzIGVudGlyZWx5OyB0aGlzIHByZWZsaWdodCBtdXN0IG9ubHkgZXZlciBhZGRcbiAqIGZhaWx1cmVzIHRoYXQgd3JhbmdsZXIgaXRzZWxmIHdvdWxkIHJhaXNlIGFmdGVyIHRoZSBtaWdyYXRpb25zLlxuICovXG5hc3luYyBmdW5jdGlvbiBsaXN0UmVtb3RlV29ya2VyU2VjcmV0TmFtZXMoXG4gIHByb2plY3Q6IFByb2plY3QsXG4gIGFyZ3Y6IERlcGxveUNvbW1hbmRBcmd2LFxuICB3cmFuZ2xlckNvbmZpZ1BhdGg6IHN0cmluZyxcbiAgcmVzb2x2ZWRDb25maWc6IFJlc29sdmVkV3JhbmdsZXJDb25maWcsXG4gIGVudk5hbWU6IHN0cmluZ1xuKTogUHJvbWlzZTxzdHJpbmdbXSB8IHVuZGVmaW5lZD4ge1xuICBwcmVwYXJlTG9jYWxCaW5QYXRoKHByb2plY3QpO1xuICBjb25zdCBsaXN0QXJncyA9IFtcbiAgICAnc2VjcmV0JyxcbiAgICAnbGlzdCcsXG4gICAgJy0tZm9ybWF0JyxcbiAgICAnanNvbicsXG4gICAgJy0tY29uZmlnJyxcbiAgICB3cmFuZ2xlckNvbmZpZ1BhdGgsXG4gICAgLi4uKHJlc29sdmVkQ29uZmlnLnVzZXNFbnZTZWN0aW9uID8gWyctLWVudicsIGVudk5hbWVdIDogW10pLFxuICBdO1xuICBjb25zb2xlLmluZm8oY2hhbGsuY3lhbihgUnVubmluZzogd3JhbmdsZXIgJHtsaXN0QXJncy5qb2luKCcgJyl9YCkpO1xuICBsZXQgcmV0O1xuICB0cnkge1xuICAgIHJldCA9IGF3YWl0IHNwYXduQXN5bmMoJ3dyYW5nbGVyJywgbGlzdEFyZ3MsIHtcbiAgICAgIGN3ZDogcHJvamVjdC5kaXJQYXRoLFxuICAgICAgZW52OiBwcm9qZWN0LmVudiBhcyBOb2RlSlMuUHJvY2Vzc0VudixcbiAgICAgIHN0ZGlvOiAncGlwZScsXG4gICAgICBraWxsT25FeGl0OiB0cnVlLFxuICAgICAgdmVyYm9zZTogYXJndi52ZXJib3NlLFxuICAgIH0pO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGNvbnNvbGUud2FybihcbiAgICAgIGNoYWxrLnllbGxvdyhcbiAgICAgICAgYEZhaWxlZCB0byBydW4gd3JhbmdsZXIgdG8gbGlzdCByZW1vdGUgc2VjcmV0czsgY2hlY2tpbmcgb25seSB0aGUgbG9jYWwgcGF5bG9hZCBhZ2FpbnN0IENsb3VkZmxhcmUncyBsaW1pdHMuXFxuJHtlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6IFN0cmluZyhlcnJvcil9YFxuICAgICAgKVxuICAgICk7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuICBpZiAocmV0LnN0YXR1cyA9PT0gMCkge1xuICAgIC8vIEN1dCB0aGUgSlNPTiBhcnJheSBvdXQgb2YgdGhlIHN1cnJvdW5kaW5nIG91dHB1dDogd3JhbmdsZXIgbWF5IHByaW50IGl0cyBiYW5uZXIgYW5kXG4gICAgLy8gXCJNdWx0aXBsZSBlbnZpcm9ubWVudHNcIiB3YXJuaW5ncyBhcm91bmQgdGhlIHBheWxvYWQuXG4gICAgY29uc3QganNvblN0YXJ0ID0gcmV0LnN0ZG91dC5pbmRleE9mKCdbJyk7XG4gICAgY29uc3QganNvbkVuZCA9IHJldC5zdGRvdXQubGFzdEluZGV4T2YoJ10nKTtcbiAgICBpZiAoanNvblN0YXJ0ICE9PSAtMSAmJiBqc29uRW5kICE9PSAtMSAmJiBqc29uU3RhcnQgPCBqc29uRW5kKSB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBwYXJzZWQgPSBKU09OLnBhcnNlKHJldC5zdGRvdXQuc2xpY2UoanNvblN0YXJ0LCBqc29uRW5kICsgMSkpIGFzIHsgbmFtZT86IHVua25vd24gfVtdO1xuICAgICAgICByZXR1cm4gcGFyc2VkLm1hcCgoeyBuYW1lIH0pID0+IG5hbWUpLmZpbHRlcigobmFtZSk6IG5hbWUgaXMgc3RyaW5nID0+IHR5cGVvZiBuYW1lID09PSAnc3RyaW5nJyk7XG4gICAgICB9IGNhdGNoIHtcbiAgICAgICAgLy8gRmFsbCB0aHJvdWdoIHRvIHRoZSB3YXJuaW5nIGJlbG93LlxuICAgICAgfVxuICAgIH1cbiAgfSBlbHNlIGlmICgvXFxbY29kZTogMTAwKDA3fDkwKVxcXXxJZiB0aGlzIGlzIGEgbmV3IFdvcmtlci8udGVzdChyZXQuc3Rkb3V0ICsgcmV0LnN0ZGVycikpIHtcbiAgICAvLyBUaGUgV29ya2VyIGRvZXMgbm90IGV4aXN0IHlldCwgc28gYSBmaXJzdCBkZXBsb3kgaW5oZXJpdHMgbm90aGluZy4gV3JhbmdsZXIgNC54IGNhdGNoZXNcbiAgICAvLyB0aGUgQ2xvdWRmbGFyZSBBUEkgZXJyb3JzIDEwMDA3ICh3b3JrZXJzLmFwaS5lcnJvci5zZXJ2aWNlX25vdF9mb3VuZCkgYW5kIDEwMDkwXG4gICAgLy8gKHdvcmtlcnMuYXBpLmVycm9yLnNjcmlwdF9ub3RfZm91bmQpIGFuZCByZXRocm93cyB0aGVtIGFzIGEgVXNlckVycm9yIGNvbnRhaW5pbmcgdGhlXG4gICAgLy8gJ0lmIHRoaXMgaXMgYSBuZXcgV29ya2VyLCBydW4gYHdyYW5nbGVyIGRlcGxveWAgZmlyc3QnIGhpbnQgd2l0aG91dCB0aGUgbnVtZXJpYyBjb2RlLFxuICAgIC8vIHNvIG1hdGNoIGJvdGggc2hhcGVzLlxuICAgIHJldHVybiBbXTtcbiAgfVxuICBjb25zb2xlLndhcm4oXG4gICAgY2hhbGsueWVsbG93KFxuICAgICAgYEZhaWxlZCB0byBsaXN0IHRoZSByZW1vdGUgV29ya2VyIHNlY3JldHM7IGNoZWNraW5nIG9ubHkgdGhlIGxvY2FsIHBheWxvYWQgYWdhaW5zdCBDbG91ZGZsYXJlJ3MgbGltaXRzLlxcbiR7KHJldC5zdGRlcnIgfHwgcmV0LnN0ZG91dCkudHJpbSgpfWBcbiAgICApXG4gICk7XG4gIHJldHVybiB1bmRlZmluZWQ7XG59XG5cbi8qKlxuICogUmVtb3RlIHNlY3JldHMgdGhhdCBzdGF5IGF0dGFjaGVkIHRvIHRoZSBuZXcgdmVyc2lvbjogYHdyYW5nbGVyIGRlcGxveSAtLXNlY3JldHMtZmlsZWAgaXNcbiAqIGFkZGl0aXZlLCBzbyBldmVyeSByZW1vdGUgc2VjcmV0IHRoZSBvdXRnb2luZyBwYXlsb2FkIGRvZXMgbm90IG92ZXJ3cml0ZSBrZWVwcyBjb3VudGluZ1xuICogYWdhaW5zdCBDbG91ZGZsYXJlJ3MgY29tYmluZWQgdmFyaWFibGUrc2VjcmV0IGxpbWl0IOKAlCBleGNlcHQgbmFtZXMgdGhhdCBhbiBlZmZlY3RpdmUgdmFyIG9yXG4gKiBiaW5kaW5nIHJlcGxhY2VzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gc2VsZWN0SW5oZXJpdGVkUmVtb3RlU2VjcmV0TmFtZXMoXG4gIHJlbW90ZVNlY3JldE5hbWVzOiBzdHJpbmdbXSxcbiAgb3V0Z29pbmdTZWNyZXRzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+LFxuICBlZmZlY3RpdmVWYXJLZXlzOiByZWFkb25seSBzdHJpbmdbXSxcbiAgYmluZGluZ05hbWVzOiByZWFkb25seSBzdHJpbmdbXVxuKTogc3RyaW5nW10ge1xuICBjb25zdCByZXBsYWNlZE5hbWVzID0gbmV3IFNldChbLi4uZWZmZWN0aXZlVmFyS2V5cywgLi4uYmluZGluZ05hbWVzXSk7XG4gIHJldHVybiByZW1vdGVTZWNyZXROYW1lcy5maWx0ZXIoKG5hbWUpID0+ICFPYmplY3QuaGFzT3duKG91dGdvaW5nU2VjcmV0cywgbmFtZSkgJiYgIXJlcGxhY2VkTmFtZXMuaGFzKG5hbWUpKTtcbn1cblxuLyoqXG4gKiBSZWFkaW5nIGJpbkV4aXN0cyBwcmVwZW5kcyBub2RlX21vZHVsZXMvLmJpbiBkaXJlY3RvcmllcyB0byBwcm9qZWN0LmVudi5QQVRILFxuICogc28gdGhlIGRpcmVjdCAobm9uLXNoZWxsKSB3cmFuZ2xlciBzcGF3bnMgcmVzb2x2ZSB0aGUgbG9jYWwgYmluYXJ5LlxuICovXG5mdW5jdGlvbiBwcmVwYXJlTG9jYWxCaW5QYXRoKHByb2plY3Q6IFByb2plY3QpOiB2b2lkIHtcbiAgaWYgKCFwcm9qZWN0LmJpbkV4aXN0cykge1xuICAgIGNvbnNvbGUud2FybihjaGFsay55ZWxsb3coJ25vZGVfbW9kdWxlcy8uYmluIG5vdCBmb3VuZDsgcmVseWluZyBvbiBQQVRIIHRvIHJlc29sdmUgd3JhbmdsZXIuJykpO1xuICB9XG59XG4iLCJpbXBvcnQgeyBzcGF3biB9IGZyb20gJ25vZGU6Y2hpbGRfcHJvY2Vzcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgeyByZWFkRm5veEVudmlyb25tZW50VmFyaWFibGVzLCByZW1vdmVOcG1BbmRZYXJuRW52aXJvbm1lbnRWYXJpYWJsZXMgfSBmcm9tICdAd2lsbGJvb3N0ZXIvc2hhcmVkLWxpYi1ub2RlL3NyYyc7XG5pbXBvcnQgeyBjb25maWcgfSBmcm9tICdkb3RlbnYnO1xuaW1wb3J0IHsgZXhwYW5kIH0gZnJvbSAnZG90ZW52LWV4cGFuZCc7XG5pbXBvcnQgdHlwZSB7IEFyZ3VtZW50c0NhbWVsQ2FzZSwgQXJndiwgQ29tbWFuZE1vZHVsZSB9IGZyb20gJ3lhcmdzJztcblxuaW1wb3J0IHsgcHJlcGVuZE5vZGVNb2R1bGVzQmluVG9QYXRoIH0gZnJvbSAnLi4vdXRpbHMvYmluUGF0aC5qcyc7XG5pbXBvcnQgeyBpc0NJIH0gZnJvbSAnLi4vdXRpbHMvY2kuanMnO1xuXG5pbnRlcmZhY2UgUGFyc2VkRG90ZW52QXJncyB7XG4gIGNvbW1hbmQ6IHN0cmluZ1tdO1xufVxuXG5jb25zdCBzaHV0ZG93blNpZ25hbHMgPSBuZXcgU2V0PE5vZGVKUy5TaWduYWxzPihbJ1NJR0lOVCcsICdTSUdURVJNJywgJ1NJR1FVSVQnXSk7XG5cbmV4cG9ydCBjb25zdCBkb3RlbnZDb21tYW5kOiBDb21tYW5kTW9kdWxlID0ge1xuICBjb21tYW5kOiAnZG90ZW52IFthcmdzLi5dJyxcbiAgZGVzY3JpYmU6ICdMb2FkIC5lbnYgZmlsZXMgYW5kIHJ1biBhIGNvbW1hbmQuJyxcbiAgYnVpbGRlcjogKHlhcmdzOiBBcmd2PHVua25vd24+KSA9PiB5YXJncy5wYXJzZXJDb25maWd1cmF0aW9uKHsgJ3BvcHVsYXRlLS0nOiB0cnVlIH0pLFxuICBhc3luYyBoYW5kbGVyKGFyZ3YpIHtcbiAgICBhd2FpdCBydW5QYXJzZWREb3RlbnZDb21tYW5kKGdldFBhcnNlZERvdGVudkFyZ3NGcm9tWWFyZ3MoYXJndikpO1xuICB9LFxufTtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJ1bkRvdGVudkNvbW1hbmQoYXJnczogc3RyaW5nW10pOiBQcm9taXNlPHZvaWQ+IHtcbiAgYXdhaXQgcnVuUGFyc2VkRG90ZW52Q29tbWFuZChwYXJzZURvdGVudkFyZ3MoYXJncykpO1xufVxuXG5hc3luYyBmdW5jdGlvbiBydW5QYXJzZWREb3RlbnZDb21tYW5kKHsgY29tbWFuZCB9OiBQYXJzZWREb3RlbnZBcmdzKTogUHJvbWlzZTx2b2lkPiB7XG4gIGlmIChjb21tYW5kLmxlbmd0aCA9PT0gMCkge1xuICAgIGNvbnNvbGUuZXJyb3IoJ1VzYWdlOiB3YiBkb3RlbnYgLS0gPGNvbW1hbmQ+IFthcmdzLi4uXScpO1xuICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgfVxuXG4gIGNvbnN0IGN3ZCA9IHBhdGgucmVzb2x2ZShwcm9jZXNzLmN3ZCgpKTtcbiAgcmVhZEFuZEFwcGx5RW52aXJvbm1lbnRWYXJpYWJsZXMoY3dkKTtcbiAgY29uc3QgYmVycnlCaW5Gb2xkZXJQYXRoID0gcHJvY2Vzcy5lbnYuQkVSUllfQklOX0ZPTERFUjtcbiAgcmVtb3ZlTnBtQW5kWWFybkVudmlyb25tZW50VmFyaWFibGVzKHByb2Nlc3MuZW52KTtcbiAgLy8gU3RyaXBwaW5nIHlhcm4ncyBlbnZpcm9ubWVudCBhbHNvIHJlbW92ZXMgaXRzIHRlbXBvcmFyeSBiaW4gZm9sZGVyIOKAlCB0aGUgT05MWSBwbGFjZVxuICAvLyB5YXJuIEJlcnJ5IGV4cG9zZXMgZGVwZW5kZW5jeSBleGVjdXRhYmxlcyDigJQgc28gcmVzdG9yZSB0aGUgcHJvamVjdCdzIG93blxuICAvLyBub2RlX21vZHVsZXMvLmJpbiBkaXJlY3RvcmllcyB0byBrZWVwIGJhcmUgYmluYXJ5IG5hbWVzIHJlc29sdmFibGUuIFBsdWcnbidQbGF5IGluc3RhbGxzXG4gIC8vIGNyZWF0ZSBubyBub2RlX21vZHVsZXMgYXQgYWxsOyB0aGUgdGVtcG9yYXJ5IGJpbiBmb2xkZXIgaXMgdGhlbiB0aGUgc29sZSBzb3VyY2Ugb2ZcbiAgLy8gZGVwZW5kZW5jeSBleGVjdXRhYmxlcywgc28gcmVzdG9yZSBpdCBpbnN0ZWFkLlxuICAvLyBUaGUgdGVtcG9yYXJ5IGZvbGRlciBpcyBkZWxpYmVyYXRlbHkgTk9UIHJlc3RvcmVkIHdoZW4gLmJpbiBkaXJlY3RvcmllcyBleGlzdDogaXQgYWxzb1xuICAvLyBjb250YWlucyBub2RlL3lhcm4gc2hpbXMsIGFuZCBhIGxlYWtlZCBub2RlIHNoaW0gd291bGQgdmlvbGF0ZSB3YidzIHJlYWwtTm9kZSBndWFyYW50ZWVcbiAgLy8gZm9yIHRvb2xzIGxpa2Ugd3JhbmdsZXIvdmluZXh0LiBDaGlsZCBgeWFybmAgaW52b2NhdGlvbnMgc3RheSByZXNvbHZhYmxlIHRocm91Z2ggdGhlXG4gIC8vIGxhdW5jaGVyIG9uIHRoZSBiYXNlIFBBVEggKG1pc2UvY29yZXBhY2spLCB3aGljaCBldmVyeSBzdXBwb3J0ZWQgZW52aXJvbm1lbnQgaGFzIOKAlFxuICAvLyBub3RoaW5nIGNvdWxkIGhhdmUgc3RhcnRlZCBgeWFybiBydW5gL2B3YiBkb3RlbnZgIHdpdGhvdXQgaXQuXG4gIGlmICghcHJlcGVuZE5vZGVNb2R1bGVzQmluVG9QYXRoKGN3ZCwgcHJvY2Vzcy5lbnYpICYmIGJlcnJ5QmluRm9sZGVyUGF0aCkge1xuICAgIHByb2Nlc3MuZW52LlBBVEggPSBwcm9jZXNzLmVudi5QQVRIID8gYCR7YmVycnlCaW5Gb2xkZXJQYXRofToke3Byb2Nlc3MuZW52LlBBVEh9YCA6IGJlcnJ5QmluRm9sZGVyUGF0aDtcbiAgfVxuXG4gIGNvbnN0IGNoaWxkID0gc3Bhd24oY29tbWFuZFswXSEsIGNvbW1hbmQuc2xpY2UoMSksIHtcbiAgICBjd2QsXG4gICAgZW52OiBwcm9jZXNzLmVudixcbiAgICBzdGRpbzogJ2luaGVyaXQnLFxuICB9KTtcbiAgY29uc3Qgc2lnbmFsSGFuZGxlcnMgPSBuZXcgTWFwPE5vZGVKUy5TaWduYWxzLCAoKSA9PiB2b2lkPigpO1xuICBjaGlsZC5vbignZXJyb3InLCAoZXJyb3IpID0+IHtcbiAgICBjb25zb2xlLmVycm9yKGVycm9yKTtcbiAgICBwcm9jZXNzLmV4aXQoMSk7XG4gIH0pO1xuICBmb3IgKGNvbnN0IHNpZ25hbCBvZiBzaHV0ZG93blNpZ25hbHMpIHtcbiAgICBjb25zdCBzaWduYWxIYW5kbGVyID0gKCk6IHZvaWQgPT4ge1xuICAgICAgY2hpbGQua2lsbChzaWduYWwpO1xuICAgIH07XG4gICAgc2lnbmFsSGFuZGxlcnMuc2V0KHNpZ25hbCwgc2lnbmFsSGFuZGxlcik7XG4gICAgcHJvY2Vzcy5vbmNlKHNpZ25hbCwgc2lnbmFsSGFuZGxlcik7XG4gIH1cbiAgY2hpbGQub24oJ2V4aXQnLCAoY29kZSwgc2lnbmFsKSA9PiB7XG4gICAgZm9yIChjb25zdCBbc2h1dGRvd25TaWduYWwsIHNpZ25hbEhhbmRsZXJdIG9mIHNpZ25hbEhhbmRsZXJzKSB7XG4gICAgICBwcm9jZXNzLm9mZihzaHV0ZG93blNpZ25hbCwgc2lnbmFsSGFuZGxlcik7XG4gICAgfVxuICAgIGlmIChzaWduYWwpIHtcbiAgICAgIC8vIFJlLXJhaXNlIGV2ZW4gZm9yIGZvcndhcmRlZCBzaHV0ZG93biBzaWduYWxzIHNvIGNhbGxlcnMgb2JzZXJ2ZSB0aGUgY29udmVudGlvbmFsXG4gICAgICAvLyBzaWduYWwgZXhpdCBzdGF0dXMgKGUuZy4gMTMwIGZvciBTSUdJTlQpIGluc3RlYWQgb2YgYSBtaXNsZWFkaW5nIHN1Y2Nlc3MuXG4gICAgICBwcm9jZXNzLmtpbGwocHJvY2Vzcy5waWQsIHNpZ25hbCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHByb2Nlc3MuZXhpdChjb2RlID8/IDEpO1xuICB9KTtcbn1cblxuZnVuY3Rpb24gZ2V0UGFyc2VkRG90ZW52QXJnc0Zyb21ZYXJncyhhcmd2OiBBcmd1bWVudHNDYW1lbENhc2UpOiBQYXJzZWREb3RlbnZBcmdzIHtcbiAgcmV0dXJuIHtcbiAgICBjb21tYW5kOiBbXG4gICAgICAuLi4oKGFyZ3YuYXJncyBhcyB1bmtub3duW10gfCB1bmRlZmluZWQpID8/IFtdKS5tYXAoU3RyaW5nKSxcbiAgICAgIC4uLigoYXJndlsnLS0nXSBhcyB1bmtub3duW10gfCB1bmRlZmluZWQpID8/IFtdKS5tYXAoU3RyaW5nKSxcbiAgICBdLFxuICB9O1xufVxuXG5mdW5jdGlvbiBwYXJzZURvdGVudkFyZ3MoYXJnczogc3RyaW5nW10pOiBQYXJzZWREb3RlbnZBcmdzIHtcbiAgY29uc3Qgc2VwYXJhdG9ySW5kZXggPSBhcmdzLmluZGV4T2YoJy0tJyk7XG4gIHJldHVybiB7IGNvbW1hbmQ6IHNlcGFyYXRvckluZGV4ID09PSAtMSA/IGFyZ3MgOiBhcmdzLnNsaWNlKHNlcGFyYXRvckluZGV4ICsgMSkgfTtcbn1cblxuLy8gTk9URTogYHdiIGRvdGVudmAgZGVsaWJlcmF0ZWx5IHNraXBzIFByb2plY3QuZW52J3MgV0JfRU5WL05FWFRfUFVCTElDX1dCX0VOViB2YWxpZGF0aW9uOiBpdCBpc1xuLy8gYSBnZW5lcmljIHJ1bm5lciBhbHNvIHVzZWQgYmVmb3JlIGVudiBzb3VyY2VzIGV4aXN0IChib290c3RyYXApIGFuZCBtdXN0IG5vdCBmYWlsIGZhc3QgZm9yXG4vLyByZXBvc2l0b3JpZXMgdGhhdCBoYXZlIG5vdCBhZG9wdGVkIHRoZSBvcmcgZW52IHN0YW5kYXJkLlxuZnVuY3Rpb24gcmVhZEFuZEFwcGx5RW52aXJvbm1lbnRWYXJpYWJsZXMoY3dkOiBzdHJpbmcpOiB2b2lkIHtcbiAgY29uc3QgbW9kZSA9IHByb2Nlc3MuZW52LldCX0VOVjtcbiAgY29uc3QgcmVhZEVudkZpbGUgPSAoZmlsZU5hbWU6IHN0cmluZyk6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPT5cbiAgICBjb25maWcoeyBwYXRoOiBwYXRoLmpvaW4oY3dkLCBmaWxlTmFtZSksIHByb2Nlc3NFbnY6IHt9LCBxdWlldDogdHJ1ZSB9KS5wYXJzZWQgPz8ge307XG4gIC8vIE1vZGUtc3BlY2lmaWMgc291cmNlcyBkcml2ZSB0aGUgZm9yY2VkLW1vZGUgb3ZlcnJpZGUgYmVsb3cuXG4gIGNvbnN0IG1vZGVWYXJzID0gbW9kZSA/IHsgLi4ucmVhZEVudkZpbGUoYC5lbnYuJHttb2RlfWApLCAuLi5yZWFkRW52RmlsZShgLmVudi4ke21vZGV9LmxvY2FsYCkgfSA6IHt9O1xuICAvLyBNaXJyb3IgdGhlIHNoYXJlZCBjYXNjYWRlJ3MgcHJlY2VkZW5jZTogLmVudi48bW9kZT4ubG9jYWwgPiAuZW52LmxvY2FsID4gLmVudi48bW9kZT4gPiAuZW52LlxuICBjb25zdCBkb3RlbnZWYXJzID0ge1xuICAgIC4uLnJlYWRFbnZGaWxlKCcuZW52JyksXG4gICAgLi4uKG1vZGUgPyByZWFkRW52RmlsZShgLmVudi4ke21vZGV9YCkgOiB7fSksXG4gICAgLi4ucmVhZEVudkZpbGUoJy5lbnYubG9jYWwnKSxcbiAgICAuLi4obW9kZSA/IHJlYWRFbnZGaWxlKGAuZW52LiR7bW9kZX0ubG9jYWxgKSA6IHt9KSxcbiAgfTtcbiAgLy8gV0JfRU5WIGluIHByb2Nlc3MuZW52IG1lYW5zIHRoZSBtb2RlIGlzIGV4cGxpY2l0bHkgZm9yY2VkLCBzbyB2YWx1ZXMgZnJvbSB0aGUgbW9kZSdzIG93blxuICAvLyBzb3VyY2VzICguZW52Ljxtb2RlPlsubG9jYWxdIGFuZCB0aGUgZm5veCBwcm9maWxlKSB3aW4gb3ZlciB2YXJpYWJsZXMgaW5oZXJpdGVkIGZyb20gdGhlXG4gIC8vIHBhcmVudCBzaGVsbCDigJQgZXhjZXB0IG9uIENJLCB3aGVyZSBpbmplY3RlZCBlbnYgdmFycyBtdXN0IGtlZXAgb3ZlcnJpZGluZyBjb21taXR0ZWQgZmlsZXNcbiAgLy8gKHNlZSBodHRwczovL2dpdGh1Yi5jb20vV2lsbEJvb3N0ZXIvc2hhcmVkL2lzc3Vlcy85MzApLlxuICBjb25zdCBtb2RlRmlsZU92ZXJyaWRlc1Byb2Nlc3NFbnYgPSAhIW1vZGUgJiYgIWlzQ0kocHJvY2Vzcy5lbnYuQ0kpO1xuICAvLyBmbm94LnRvbWwgaXMgdGhlIGNvbW1pdHRlZCwgZW5jcnlwdGVkIGVxdWl2YWxlbnQgb2YgLmVudiBmaWxlczsgbG9jYWwgLmVudiBmaWxlcyBzdGlsbCB3aW4gb3ZlciBpdC5cbiAgY29uc3QgW2Zub3hWYXJzXSA9IHJlYWRGbm94RW52aXJvbm1lbnRWYXJpYWJsZXMoY3dkLCBtb2RlLCBkb3RlbnZWYXJzLCB7IG1vZGVGaWxlT3ZlcnJpZGVzUHJvY2Vzc0VudiB9KTtcbiAgY29uc3QgcGFyc2VkID0geyAuLi5mbm94VmFycywgLi4uZG90ZW52VmFycyB9O1xuICAvLyBFeHBhbmQgJHsuLi59IHJlZmVyZW5jZXMgYWdhaW5zdCBleHBvcnRlZCB2YXJpYWJsZXMgd2hvc2UgRklMRSB2YWx1ZSBsb3NlcyB0byB0aGUgc2hlbGxcbiAgLy8gKG1pcnJvcmluZyByZWFkRW52aXJvbm1lbnRWYXJpYWJsZXMnIGVmZmVjdGl2ZS12YWx1ZSBzZW1hbnRpY3MpOiBhIHJlZmVyZW5jZSBtdXN0IHJlc29sdmUgdG9cbiAgLy8gdGhlIHZhbHVlIHRoZSBjaGlsZCB3aWxsIGFjdHVhbGx5IHNlZSwgc28gYSBzaGVsbC1zaGFkb3dlZCBrZXkgZXhwYW5kcyB0byB0aGUgc2hlbGwgdmFsdWVcbiAgLy8gd2hpbGUgYSB3aW5uaW5nIGZpbGUvb3ZlcnJpZGUgdmFsdWUgZXhwYW5kcyB0byB0aGUgZmlsZSB2YWx1ZS5cbiAgY29uc3QgZmlsZVZhbHVlV2lucyA9IChrZXk6IHN0cmluZyk6IGJvb2xlYW4gPT5cbiAgICAhKGtleSBpbiBwcm9jZXNzLmVudikgfHwgKG1vZGVGaWxlT3ZlcnJpZGVzUHJvY2Vzc0VudiAmJiAoa2V5IGluIG1vZGVWYXJzIHx8IGtleSBpbiBmbm94VmFycykpO1xuICBjb25zdCByZWZlcmVuY2VFbnY6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7fTtcbiAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMocHJvY2Vzcy5lbnYpKSB7XG4gICAgLy8gRXNjYXBlIGRvbGxhciBzaWducyBzbyBleHBvcnRlZCB2YWx1ZXMgc3Vic3RpdHV0ZSBsaXRlcmFsbHkgKHBhJHdvcmQgc3RheXMgcGEkd29yZCkuXG4gICAgaWYgKHZhbHVlICE9PSB1bmRlZmluZWQgJiYgIShrZXkgaW4gcGFyc2VkICYmIGZpbGVWYWx1ZVdpbnMoa2V5KSkpIHtcbiAgICAgIHJlZmVyZW5jZUVudltrZXldID0gdmFsdWUucmVwbGFjZUFsbCgnJCcsIFN0cmluZy5yYXdgXFwkYCk7XG4gICAgfVxuICB9XG4gIGNvbnN0IGVudlZhcnMgPSBleHBhbmQoeyBwYXJzZWQsIHByb2Nlc3NFbnY6IHJlZmVyZW5jZUVudiB9KS5wYXJzZWQgPz8gcGFyc2VkO1xuICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhlbnZWYXJzKSkge1xuICAgIGlmICghKGtleSBpbiBwcm9jZXNzLmVudikpIHtcbiAgICAgIHByb2Nlc3MuZW52W2tleV0gPSB2YWx1ZTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICAvLyByZWFkRm5veEVudmlyb25tZW50VmFyaWFibGVzIHJldHVybnMgYSBwcm9jZXNzLmVudi1zaGFkb3dlZCBrZXkgb25seSB3aGVuIHRoZSBmb3JjZWRcbiAgICAvLyBwcm9maWxlIG92ZXJyaWRlcyBpdCwgc28gZm5veC1wcm92aWRlZCBrZXlzIGNvdW50IGFzIG1vZGUtc3BlY2lmaWMgaGVyZS5cbiAgICBpZiAoIShrZXkgaW4gbW9kZVZhcnMgfHwga2V5IGluIGZub3hWYXJzKSB8fCBwcm9jZXNzLmVudltrZXldID09PSB2YWx1ZSkgY29udGludWU7XG5cbiAgICBpZiAobW9kZUZpbGVPdmVycmlkZXNQcm9jZXNzRW52KSB7XG4gICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgIGBXYXJuaW5nOiAke2tleX0gaW4gdGhlIFwiJHttb2RlfVwiIG1vZGUncyBlbnYgc291cmNlcyBvdmVycmlkZXMgdGhlIHZhbHVlIGluaGVyaXRlZCBmcm9tIHRoZSBwYXJlbnQgZW52aXJvbm1lbnQgYmVjYXVzZSBXQl9FTlYgaXMgZXhwbGljaXRseSBzZXQuYFxuICAgICAgKTtcbiAgICAgIHByb2Nlc3MuZW52W2tleV0gPSB2YWx1ZTtcbiAgICB9XG4gICAgLy8gT24gQ0ksIGluaGVyaXRlZCB2YXJpYWJsZXMgaW50ZW50aW9uYWxseSB3aW4gKHdvcmtmbG93cyBkZWxpYmVyYXRlbHkgaW5qZWN0IGVudiB2YXJzIHRoYXRcbiAgICAvLyBvdmVycmlkZSB0aGUgY29tbWl0dGVkIGZpbGVzKTsgdGhpcyBpcyB0aGUgZGVzaWduZWQgYmVoYXZpb3IsIHNvIG5vIHdhcm5pbmcgaXMgZW1pdHRlZC5cbiAgfVxufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHR5cGUgeyBQcm9qZWN0IH0gZnJvbSAnLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQgeyBGSUxFX1NDSEVNQSwgZ2V0RmlsZURhdGFiYXNlVXJsUGF0aCB9IGZyb20gJy4uL3Byb2plY3QuanMnO1xuXG5jb25zdCBMSVRFU1RSRUFNX0NPTkZJR19GSUxFX05BTUUgPSAnbGl0ZXN0cmVhbS55bWwnO1xuY29uc3QgREVGQVVMVF9MSVRFU1RSRUFNX0NPTkZJR19QQVRIID0gJy9ldGMvbGl0ZXN0cmVhbS55bWwnO1xuXG5jb25zdCBQT1NTSUJMRV9QUklTTUFfUEFUSFMgPSBbXG4gIHsgc2NoZW1hUGF0aDogcGF0aC5qb2luKCdwcmlzbWEnLCAnc2NoZW1hLnByaXNtYScpLCBkYlBhdGg6ICdwcmlzbWEnIH0sXG4gIHsgc2NoZW1hUGF0aDogcGF0aC5qb2luKCdwcmlzbWEnLCAnc2NoZW1hJyksIGRiUGF0aDogcGF0aC5qb2luKCdwcmlzbWEnLCAnc2NoZW1hJykgfSxcbiAgeyBzY2hlbWFQYXRoOiBwYXRoLmpvaW4oJ2RiJywgJ3NjaGVtYS5wcmlzbWEnKSwgZGJQYXRoOiAnZGInIH0sXG5dO1xuXG4vKipcbiAqIEEgY29sbGVjdGlvbiBvZiBzY3JpcHRzIGZvciBleGVjdXRpbmcgUHJpc21hIGNvbW1hbmRzLlxuICogTm90ZSB0aGF0IGBQUklTTUFgIGlzIHJlcGxhY2VkIHdpdGggYFlBUk4gcHJpc21hYCBvciBgWUFSTiBibGl0eiBwcmlzbWFgXG4gKiBhbmQgYFlBUk4genp6YCBpcyByZXBsYWNlZCB3aXRoIGB5YXJuIHp6emAgb3IgYG5vZGVfbW9kdWxlcy8uYmluL3p6emAuXG4gKi9cbmNsYXNzIFByaXNtYVNjcmlwdHMge1xuICBjbGVhblVwTGl0ZXN0cmVhbShwcm9qZWN0OiBQcm9qZWN0KTogc3RyaW5nIHtcbiAgICBjb25zdCBkaXJQYXRoID0gZ2V0RGF0YWJhc2VEaXJQYXRoKHByb2plY3QpO1xuICAgIGNvbnN0IGNsZWFuVXBDb21tYW5kID0gYnVpbGRXYWxDaGVja3BvaW50QW5kUmVtb3ZlU3FsaXRlU2lkZWNhckZpbGVzQ29tbWFuZChgJHtkaXJQYXRofS9wcm9kLnNxbGl0ZTNgKTtcbiAgICAvLyBDbGVhbnVwIGV4aXN0aW5nIGFydGlmYWN0cyB0byBhdm9pZCBpc3N1ZXMgd2l0aCBMaXRlc3RyZWFtIHJlcGxpY2F0aW9uLlxuICAgIC8vIE5vdGUgdGhhdCBkb24ndCBtZXJnZSBtdWx0aXBsZSBybSBjb21tYW5kcyBpbnRvIG9uZSwgYmVjYXVzZSBpZiBvbmUgZmFpbHMsIHRoZSBzdWJzZXF1ZW50IG9uZXMgd29uJ3QgcnVuLlxuICAgIHJldHVybiBgJHtjbGVhblVwQ29tbWFuZH07IHJtIC1SZiAke2RpclBhdGh9Ly5wcm9kLnNxbGl0ZTMqIHx8IHRydWVgO1xuICB9XG5cbiAgZGVwbG95KF86IFByb2plY3QsIGFkZGl0aW9uYWxPcHRpb25zID0gJycpOiBzdHJpbmcge1xuICAgIHJldHVybiBgUFJJU01BIG1pZ3JhdGUgZGVwbG95ICR7YWRkaXRpb25hbE9wdGlvbnN9YDtcbiAgfVxuXG4gIGdlbmVyYXRlKF86IFByb2plY3QsIGFkZGl0aW9uYWxPcHRpb25zID0gJycpOiBzdHJpbmcge1xuICAgIHJldHVybiBbJ1BSSVNNQSBnZW5lcmF0ZScsIGFkZGl0aW9uYWxPcHRpb25zXS5maWx0ZXIoQm9vbGVhbikuam9pbignICcpO1xuICB9XG5cbiAgZGVwbG95Rm9yY2UocHJvamVjdDogUHJvamVjdCk6IHN0cmluZyB7XG4gICAgY29uc3QgZGlyUGF0aCA9IGdldERhdGFiYXNlRGlyUGF0aChwcm9qZWN0KTtcbiAgICBjb25zdCByZW1vdmVEYkNvbW1hbmQgPSBidWlsZFJlbW92ZVNxbGl0ZURiQ29tbWFuZChgJHtkaXJQYXRofS9wcm9kLnNxbGl0ZTNgKTtcbiAgICBjb25zdCBsaXRlc3RyZWFtQ29uZmlnT3B0aW9uID0gZ2V0TGl0ZXN0cmVhbUNvbmZpZ09wdGlvbihwcm9qZWN0KTtcbiAgICAvLyBgcHJpc21hIG1pZ3JhdGUgcmVzZXRgIGNhbiBmYWlsIGRlcGVuZGluZyBvbiB0aGUgc3RhdGUgb2YgdGhlIGV4aXN0aW5nIGRhdGFiYXNlLCBzbyB3ZSByZW1vdmUgaXQgZmlyc3QuXG4gICAgLy8gRG9uJ3Qgc2tpcCBcIm1pZ3JhdGUgZGVwbG95XCIgYmVjYXVzZSByZXN0b3JlZCBkYXRhYmFzZSBtYXkgYmUgb2xkZXIgdGhhbiB0aGUgY3VycmVudCBzY2hlbWEuXG4gICAgcmV0dXJuIGAke3JlbW92ZURiQ29tbWFuZH07IFBSSVNNQSBtaWdyYXRlIHJlc2V0IC0tZm9yY2UgLS1za2lwLXNlZWQgJiYgJHtyZW1vdmVEYkNvbW1hbmR9XG4gICAgICAmJiBsaXRlc3RyZWFtIHJlc3RvcmUgJHtsaXRlc3RyZWFtQ29uZmlnT3B0aW9ufSAtbyAke2RpclBhdGh9L3Byb2Quc3FsaXRlMyAke2RpclBhdGh9L3Byb2Quc3FsaXRlMyAmJiBscyAtYWhsICR7ZGlyUGF0aH0vcHJvZC5zcWxpdGUzICYmIEFMTE9XX1RPX1NLSVBfU0VFRD0wIFBSSVNNQSBtaWdyYXRlIGRlcGxveWA7XG4gIH1cblxuICBsaXN0QmFja3Vwcyhwcm9qZWN0OiBQcm9qZWN0LCBjb25maWdQYXRoPzogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBjb25zdCBkaXJQYXRoID0gZ2V0RGF0YWJhc2VEaXJQYXRoKHByb2plY3QpO1xuICAgIHJldHVybiBgbGl0ZXN0cmVhbSBsdHggJHtnZXRMaXRlc3RyZWFtQ29uZmlnT3B0aW9uKHByb2plY3QsIGNvbmZpZ1BhdGgpfSAke2RpclBhdGh9L3Byb2Quc3FsaXRlM2A7XG4gIH1cblxuICBtaWdyYXRlKHByb2plY3Q6IFByb2plY3QsIGFkZGl0aW9uYWxPcHRpb25zID0gJycpOiBzdHJpbmcge1xuICAgIHJldHVybiBgUFJJU01BIG1pZ3JhdGUgZGVwbG95ICR7YWRkaXRpb25hbE9wdGlvbnN9ICYmICR7dGhpcy5nZW5lcmF0ZShwcm9qZWN0KX0gJiYgJHt0aGlzLnNlZWQocHJvamVjdCl9YDtcbiAgfVxuXG4gIG1pZ3JhdGVEZXYoXzogUHJvamVjdCwgYWRkaXRpb25hbE9wdGlvbnMgPSAnJyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGBQUklTTUEgbWlncmF0ZSBkZXYgJHthZGRpdGlvbmFsT3B0aW9uc31gO1xuICB9XG5cbiAgcmVzZXQocHJvamVjdDogUHJvamVjdCwgYWRkaXRpb25hbE9wdGlvbnMgPSAnJyk6IHN0cmluZyB7XG4gICAgLy8gY2YuIGh0dHBzOi8vd3d3LnByaXNtYS5pby9kb2NzL2d1aWRlcy9kYXRhYmFzZS9zZWVkLWRhdGFiYXNlI2ludGVncmF0ZWQtc2VlZGluZy13aXRoLXByaXNtYS1taWdyYXRlXG4gICAgY29uc3Qgc3RlcHM6IHN0cmluZ1tdID0gW107XG4gICAgY29uc3QgY2xlYW51cENvbW1hbmQgPSBjbGVhblVwU3FsaXRlRGJJZk5lZWRlZChwcm9qZWN0KTtcbiAgICBpZiAoY2xlYW51cENvbW1hbmQpIHN0ZXBzLnB1c2goY2xlYW51cENvbW1hbmQpO1xuICAgIGNvbnN0IHJlc2V0Q29tbWFuZCA9IFsnUFJJU01BIG1pZ3JhdGUgcmVzZXQgLS1mb3JjZScsIGFkZGl0aW9uYWxPcHRpb25zXS5maWx0ZXIoQm9vbGVhbikuam9pbignICcpO1xuICAgIHN0ZXBzLnB1c2gocmVzZXRDb21tYW5kKTtcbiAgICBpZiAocHJvamVjdC5wYWNrYWdlSnNvbi5kZXBlbmRlbmNpZXM/LmJsaXR6KSB7XG4gICAgICAvLyBCbGl0eiBkb2VzIG5vdCB0cmlnZ2VyIHNlZWQgYXV0b21hdGljYWxseSwgc28gd2UgbmVlZCB0byBydW4gaXQgbWFudWFsbHkuXG4gICAgICBzdGVwcy5wdXNoKHRoaXMuc2VlZChwcm9qZWN0KSk7XG4gICAgfVxuICAgIHJldHVybiBzdGVwcy5maWx0ZXIoQm9vbGVhbikuam9pbignICYmICcpO1xuICB9XG5cbiAgcmVzdG9yZShwcm9qZWN0OiBQcm9qZWN0LCBvdXRwdXRQYXRoOiBzdHJpbmcsIGNvbmZpZ1BhdGg/OiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGNvbnN0IGRpclBhdGggPSBnZXREYXRhYmFzZURpclBhdGgocHJvamVjdCk7XG4gICAgcmV0dXJuIGBybSAtUmYgJHtvdXRwdXRQYXRofSo7IGxpdGVzdHJlYW0gcmVzdG9yZSAke2dldExpdGVzdHJlYW1Db25maWdPcHRpb24ocHJvamVjdCwgY29uZmlnUGF0aCl9IC1vICR7b3V0cHV0UGF0aH0gJHtkaXJQYXRofS9wcm9kLnNxbGl0ZTNgO1xuICB9XG5cbiAgc2VlZChwcm9qZWN0OiBQcm9qZWN0LCBzY3JpcHRQYXRoPzogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBpZiAocHJvamVjdC5wYWNrYWdlSnNvbi5kZXBlbmRlbmNpZXM/LmJsaXR6KSByZXR1cm4gYFlBUk4gYmxpdHogZGIgc2VlZCR7c2NyaXB0UGF0aCA/IGAgLWYgJHtzY3JpcHRQYXRofWAgOiAnJ31gO1xuICAgIGlmIChzY3JpcHRQYXRoKSByZXR1cm4gYEJVTiBidWlsZC10cyBydW4gJHtzY3JpcHRQYXRofWA7XG4gICAgaWYgKChwcm9qZWN0LnBhY2thZ2VKc29uLnByaXNtYSBhcyBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+IHwgdW5kZWZpbmVkKT8uc2VlZCkgcmV0dXJuIGBZQVJOIHByaXNtYSBkYiBzZWVkYDtcbiAgICByZXR1cm4gYGlmIFsgLWUgXCJwcmlzbWEvc2VlZHMudHNcIiBdOyB0aGVuIEJVTiBidWlsZC10cyBydW4gcHJpc21hL3NlZWRzLnRzOyBmaWA7XG4gIH1cblxuICBzdHVkaW8ocHJvamVjdDogUHJvamVjdCwgZGJVcmxPclBhdGg/OiBzdHJpbmcsIGFkZGl0aW9uYWxPcHRpb25zID0gJycpOiBzdHJpbmcge1xuICAgIGxldCBwcmVmaXggPSAnJztcbiAgICAvLyBEZWFsIHdpdGggUHJpc21hIGlzc3VlOiBodHRwczovL2dpdGh1Yi5jb20vcHJpc21hL3N0dWRpby9pc3N1ZXMvMTI3M1xuICAgIGlmIChkYlVybE9yUGF0aCkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgbmV3IFVSTChkYlVybE9yUGF0aCk7XG4gICAgICAgIHByZWZpeCA9IGBEQVRBQkFTRV9VUkw9JHtkYlVybE9yUGF0aH0gYDtcbiAgICAgIH0gY2F0Y2gge1xuICAgICAgICBjb25zdCBhYnNvbHV0ZVBhdGggPSBwYXRoLnJlc29sdmUoZGJVcmxPclBhdGgpO1xuICAgICAgICBwcmVmaXggPSBgREFUQUJBU0VfVVJMPSR7RklMRV9TQ0hFTUF9JHthYnNvbHV0ZVBhdGh9IGA7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChwcm9qZWN0LmVudi5EQVRBQkFTRV9VUkw/LnN0YXJ0c1dpdGgoRklMRV9TQ0hFTUEpKSB7XG4gICAgICBjb25zdCBiYXNlRGlyID0gZ2V0UHJpc21hQmFzZURpcihwcm9qZWN0KTtcbiAgICAgIGlmIChiYXNlRGlyKSB7XG4gICAgICAgIGNvbnN0IGFic29sdXRlUGF0aCA9IHBhdGgucmVzb2x2ZShwcm9qZWN0LmRpclBhdGgsIGJhc2VEaXIsIHByb2plY3QuZW52LkRBVEFCQVNFX1VSTC5zbGljZShGSUxFX1NDSEVNQS5sZW5ndGgpKTtcbiAgICAgICAgcHJlZml4ID0gYERBVEFCQVNFX1VSTD0ke0ZJTEVfU0NIRU1BfSR7YWJzb2x1dGVQYXRofSBgO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gYCR7cHJlZml4fVBSSVNNQSBzdHVkaW8gJHthZGRpdGlvbmFsT3B0aW9uc31gO1xuICB9XG59XG5cbmZ1bmN0aW9uIGdldERhdGFiYXNlRGlyUGF0aChwcm9qZWN0OiBQcm9qZWN0KTogc3RyaW5nIHtcbiAgcmV0dXJuIHByb2plY3QucGFja2FnZUpzb24uZGVwZW5kZW5jaWVzPy5ibGl0eiA/ICdkYi9tb3VudCcgOiAncHJpc21hL21vdW50Jztcbn1cblxuZnVuY3Rpb24gZ2V0UHJpc21hQmFzZURpcihwcm9qZWN0OiBQcm9qZWN0KTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgcmV0dXJuIFBPU1NJQkxFX1BSSVNNQV9QQVRIUy5maW5kKCh7IHNjaGVtYVBhdGggfSkgPT4gZnMuZXhpc3RzU3luYyhwYXRoLnJlc29sdmUocHJvamVjdC5kaXJQYXRoLCBzY2hlbWFQYXRoKSkpXG4gICAgPy5kYlBhdGg7XG59XG5cbmZ1bmN0aW9uIGdldExpdGVzdHJlYW1Db25maWdPcHRpb24ocHJvamVjdDogUHJvamVjdCwgY29uZmlnUGF0aD86IHN0cmluZyk6IHN0cmluZyB7XG4gIGlmIChjb25maWdQYXRoKSByZXR1cm4gYC1jb25maWcgXCIke2NvbmZpZ1BhdGh9XCJgO1xuXG4gIGNvbnN0IGxvY2FsQ29uZmlnUGF0aCA9IHBhdGguam9pbihwcm9qZWN0LmRpclBhdGgsIExJVEVTVFJFQU1fQ09ORklHX0ZJTEVfTkFNRSk7XG4gIGlmIChmcy5leGlzdHNTeW5jKGxvY2FsQ29uZmlnUGF0aCkpIHJldHVybiBgLWNvbmZpZyAuLyR7TElURVNUUkVBTV9DT05GSUdfRklMRV9OQU1FfWA7XG4gIGlmIChmcy5leGlzdHNTeW5jKERFRkFVTFRfTElURVNUUkVBTV9DT05GSUdfUEFUSCkpIHJldHVybiBgLWNvbmZpZyAke0RFRkFVTFRfTElURVNUUkVBTV9DT05GSUdfUEFUSH1gO1xuICByZXR1cm4gYC1jb25maWcgLi8ke0xJVEVTVFJFQU1fQ09ORklHX0ZJTEVfTkFNRX1gO1xufVxuXG5mdW5jdGlvbiBidWlsZFJlbW92ZVNxbGl0ZURiQ29tbWFuZChkYlBhdGg6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiBgcm0gLVJmIFwiJHtkYlBhdGh9XCIqYDtcbn1cblxuZnVuY3Rpb24gYnVpbGRXYWxDaGVja3BvaW50QW5kUmVtb3ZlU3FsaXRlU2lkZWNhckZpbGVzQ29tbWFuZChkYlBhdGg6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiBgaWYgWyAtZiBcIiR7ZGJQYXRofVwiIF07IHRoZW4gcHJpbnRmICdQUkFHTUEgd2FsX2NoZWNrcG9pbnQoVFJVTkNBVEUpOycgfCBQUklTTUEgZGIgZXhlY3V0ZSAtLXN0ZGluIC0tdXJsIFwiJHtGSUxFX1NDSEVNQX0ke2RiUGF0aH1cIjsgZmkgJiYgcm0gLWYgXCIke2RiUGF0aH1cIi4qIFwiJHtkYlBhdGh9XCItKmA7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjbGVhblVwU3FsaXRlRGJJZk5lZWRlZChwcm9qZWN0OiBQcm9qZWN0KTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgcmF3RGJQYXRoID0gZ2V0RmlsZURhdGFiYXNlVXJsUGF0aChwcm9qZWN0KTtcbiAgaWYgKCFyYXdEYlBhdGgpIHJldHVybjtcblxuICBjb25zdCBiYXNlRGlyID0gZ2V0UHJpc21hQmFzZURpcihwcm9qZWN0KTtcbiAgY29uc3QgYWJzb2x1dGVQYXRoID0gcGF0aC5pc0Fic29sdXRlKHJhd0RiUGF0aClcbiAgICA/IHJhd0RiUGF0aFxuICAgIDogcGF0aC5yZXNvbHZlKHByb2plY3QuZGlyUGF0aCwgYmFzZURpciA/PyAnLicsIHJhd0RiUGF0aCk7XG5cbiAgcmV0dXJuIGBybSAtZiBcIiR7YWJzb2x1dGVQYXRofVwiIFwiJHthYnNvbHV0ZVBhdGh9LXdhbFwiIFwiJHthYnNvbHV0ZVBhdGh9LXNobVwiYDtcbn1cblxuZXhwb3J0IGNvbnN0IHByaXNtYVNjcmlwdHMgPSBuZXcgUHJpc21hU2NyaXB0cygpO1xuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IGNoYWxrIGZyb20gJ2NoYWxrJztcbmltcG9ydCB0eXBlIHsgQ29tbWFuZE1vZHVsZSB9IGZyb20gJ3lhcmdzJztcblxuaW1wb3J0IHR5cGUgeyBQcm9qZWN0IH0gZnJvbSAnLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQgeyBmaW5kRGVzY2VuZGFudFByb2plY3RzIH0gZnJvbSAnLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQgeyBmaW5kRHJpenpsZUNvbmZpZywgd3JhcFdpdGhEcml6emxlQ29uZmlnRGlyIH0gZnJvbSAnLi4vc2NyaXB0cy9kcml6emxlU2NyaXB0cy5qcyc7XG5pbXBvcnQgeyBwcmlzbWFTY3JpcHRzIH0gZnJvbSAnLi4vc2NyaXB0cy9wcmlzbWFTY3JpcHRzLmpzJztcbmltcG9ydCB7IHJ1bldpdGhTcGF3biB9IGZyb20gJy4uL3NjcmlwdHMvcnVuLmpzJztcblxuY29uc3QgYnVpbGRlciA9IHt9IGFzIGNvbnN0O1xuXG5leHBvcnQgY29uc3QgZ2VuQ29kZUNvbW1hbmQ6IENvbW1hbmRNb2R1bGUgPSB7XG4gIGNvbW1hbmQ6ICdnZW4tY29kZScsXG4gIGRlc2NyaWJlOiAnR2VuZXJhdGUgY29kZSBmb3IgdGhlIGN1cnJlbnQgcHJvamVjdCcsXG4gIGJ1aWxkZXIsXG4gIGFzeW5jIGhhbmRsZXIoYXJndikge1xuICAgIGNvbnN0IHByb2plY3RzID0gYXdhaXQgZmluZERlc2NlbmRhbnRQcm9qZWN0cyhhcmd2KTtcbiAgICBpZiAoIXByb2plY3RzKSB7XG4gICAgICBjb25zb2xlLmVycm9yKGNoYWxrLnJlZCgnTm8gcHJvamVjdCBmb3VuZC4nKSk7XG4gICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgfVxuXG4gICAgY29uc3QgZ2VuQ29kZVRhcmdldHMgPSBwcm9qZWN0cy5kZXNjZW5kYW50c1xuICAgICAgLm1hcCgocHJvamVjdCkgPT4gKHsgcHJvamVjdCwgc2NyaXB0czogZ2V0R2VuQ29kZVNjcmlwdHMocHJvamVjdCkgfSkpXG4gICAgICAuZmlsdGVyKCh7IHNjcmlwdHMgfSkgPT4gc2NyaXB0cy5sZW5ndGggPiAwKTtcbiAgICBpZiAoZ2VuQ29kZVRhcmdldHMubGVuZ3RoID09PSAwKSB7XG4gICAgICBjb25zb2xlLmluZm8oY2hhbGsuZ3JlZW4oJ05vIGNvZGUgZ2VuZXJhdGlvbiBuZWVkZWQuJykpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBmb3IgKGNvbnN0IHsgcHJvamVjdCwgc2NyaXB0cyB9IG9mIGdlbkNvZGVUYXJnZXRzKSB7XG4gICAgICBjb25zb2xlLmluZm8oYFJ1bm5pbmcgXCJnZW4tY29kZVwiIGZvciAke3Byb2plY3QubmFtZX0gLi4uYCk7XG4gICAgICBmb3IgKGNvbnN0IHNjcmlwdCBvZiBzY3JpcHRzKSB7XG4gICAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bihzY3JpcHQsIHByb2plY3QsIGFyZ3YpO1xuICAgICAgfVxuICAgIH1cbiAgfSxcbn07XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRHZW5Db2RlU2NyaXB0cyhwcm9qZWN0OiBQcm9qZWN0KTogc3RyaW5nW10ge1xuICBjb25zdCBzY3JpcHRzOiBzdHJpbmdbXSA9IFtdO1xuICBjb25zdCBwcmlzbWFHZW5lcmF0ZVNjcmlwdCA9IGdldFByaXNtYUdlbmVyYXRlU2NyaXB0KHByb2plY3QpO1xuICBpZiAocHJvamVjdC5oYXNPd25EZXBlbmRlbmN5KCdibGl0eicpICYmIHByb2plY3QuaGFzU291cmNlQ29kZSkge1xuICAgIHNjcmlwdHMucHVzaCgnWUFSTiBibGl0eiBjb2RlZ2VuJyk7XG4gICAgaWYgKHByaXNtYUdlbmVyYXRlU2NyaXB0KSB7XG4gICAgICBzY3JpcHRzLnB1c2gocHJpc21hR2VuZXJhdGVTY3JpcHQpO1xuICAgIH1cbiAgfSBlbHNlIGlmIChwcmlzbWFHZW5lcmF0ZVNjcmlwdCkge1xuICAgIHNjcmlwdHMucHVzaChwcmlzbWFHZW5lcmF0ZVNjcmlwdCk7XG4gIH1cblxuICBjb25zdCBjaGFrcmFUeXBlZ2VuU2NyaXB0ID0gZ2V0Q2hha3JhU2NyaXB0KHByb2plY3QpO1xuICBpZiAoY2hha3JhVHlwZWdlblNjcmlwdCkge1xuICAgIHNjcmlwdHMucHVzaChjaGFrcmFUeXBlZ2VuU2NyaXB0KTtcbiAgfVxuXG4gIGNvbnN0IGRyaXp6bGVDaGVja1NjcmlwdCA9IHNjcmlwdHMubGVuZ3RoID09PSAwID8gZ2V0RHJpenpsZUNoZWNrU2NyaXB0KHByb2plY3QpIDogdW5kZWZpbmVkO1xuICBpZiAoZHJpenpsZUNoZWNrU2NyaXB0KSB7XG4gICAgc2NyaXB0cy5wdXNoKGRyaXp6bGVDaGVja1NjcmlwdCk7XG4gIH1cbiAgY29uc3QgZ2VuSTE4blRzU2NyaXB0ID0gZ2V0R2VuSTE4blRzU2NyaXB0KHByb2plY3QpO1xuICBpZiAoZ2VuSTE4blRzU2NyaXB0KSB7XG4gICAgc2NyaXB0cy5wdXNoKGdlbkkxOG5Uc1NjcmlwdCk7XG4gIH1cbiAgcmV0dXJuIHNjcmlwdHM7XG59XG5cbmZ1bmN0aW9uIGdldEdlbkkxOG5Uc1NjcmlwdChwcm9qZWN0OiBQcm9qZWN0KTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgaWYgKHByb2plY3QucGFja2FnZUpzb24uc2NyaXB0cz8uWydnZW4taTE4bi10cyddKSB7XG4gICAgaWYgKCFwcm9qZWN0Lmhhc1NvdXJjZUNvZGUpIHJldHVybjtcbiAgICByZXR1cm4gJ1lBUk4gcnVuIGdlbi1pMThuLXRzJztcbiAgfVxuICBpZiAoXG4gICAgcHJvamVjdC5oYXNPd25EZXBlbmRlbmN5KCdnZW4taTE4bi10cycpICYmXG4gICAgcHJvamVjdC5oYXNTb3VyY2VDb2RlICYmXG4gICAgZnMuZXhpc3RzU3luYyhwYXRoLmpvaW4ocHJvamVjdC5kaXJQYXRoLCAnaTE4bicpKVxuICApIHtcbiAgICByZXR1cm4gJ1lBUk4gZ2VuLWkxOG4tdHMgLWkgaTE4biAtbyBzcmMvX19nZW5lcmF0ZWRfXy9pMThuLnRzIC1kIGphLUpQJztcbiAgfVxuICByZXR1cm47XG59XG5cbmZ1bmN0aW9uIGdldFByaXNtYUdlbmVyYXRlU2NyaXB0KHByb2plY3Q6IFByb2plY3QpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBpZiAoIXByb2plY3QuaGFzUHJpc21hKSByZXR1cm47XG4gIGlmICghaGFzUHJpc21hU2NoZW1hKHByb2plY3QpKSByZXR1cm47XG4gIHJldHVybiBwcmlzbWFTY3JpcHRzLmdlbmVyYXRlKHByb2plY3QpO1xufVxuXG5mdW5jdGlvbiBnZXRDaGFrcmFTY3JpcHQocHJvamVjdDogUHJvamVjdCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGlmICghcHJvamVjdC5oYXNPd25EZXBlbmRlbmN5KCdAY2hha3JhLXVpL2NsaScpKSByZXR1cm47XG5cbiAgaWYgKGdldE93bkRlcGVuZGVuY3lNYWpvcihwcm9qZWN0LCAnQGNoYWtyYS11aS9jbGknKSA9PT0gMikge1xuICAgIHJldHVybiAnWUFSTiBjaGFrcmEtY2xpIHRva2VucyBzcmMvY29yZS90aGVtZS50cyc7XG4gIH1cbiAgaWYgKGZpbGVFeGlzdHMocHJvamVjdCwgJ3NyYy90aGVtZS50cycpKSB7XG4gICAgcmV0dXJuICdZQVJOIGNoYWtyYSB0eXBlZ2VuIHNyYy90aGVtZS50cyAtLXN0cmljdCc7XG4gIH1cbiAgcmV0dXJuO1xufVxuXG5mdW5jdGlvbiBnZXREcml6emxlQ2hlY2tTY3JpcHQocHJvamVjdDogUHJvamVjdCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGlmICghcHJvamVjdC5oYXNEcml6emxlKSByZXR1cm47XG4gIGNvbnN0IGNvbmZpZyA9IGZpbmREcml6emxlQ29uZmlnKHByb2plY3QpO1xuICBpZiAoIWNvbmZpZykgcmV0dXJuO1xuICAvLyBLZWVwIHRoZSBleHBsaWNpdCAtLWNvbmZpZyBiZWNhdXNlIGRyaXp6bGUta2l0J3MgZGVmYXVsdCBsb29rdXAgbWlzc2VzIHNvbWUgZXh0ZW5zaW9ucyAoZS5nLiAubXRzKS5cbiAgcmV0dXJuIGAke3dyYXBXaXRoRHJpenpsZUNvbmZpZ0Rpcihwcm9qZWN0LCBgWUFSTiBkcml6emxlLWtpdCBjaGVjayAtLWNvbmZpZyAke2NvbmZpZy5maWxlTmFtZX1gKX0gfHwgdHJ1ZWA7XG59XG5cbmZ1bmN0aW9uIGdldE93bkRlcGVuZGVuY3lNYWpvcihwcm9qZWN0OiBQcm9qZWN0LCBwYWNrYWdlTmFtZTogc3RyaW5nKTogbnVtYmVyIHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgcGFja2FnZUpzb24gPSBwcm9qZWN0LnBhY2thZ2VKc29uO1xuICBjb25zdCB2ZXJzaW9uID1cbiAgICBwYWNrYWdlSnNvbi5kZXBlbmRlbmNpZXM/LltwYWNrYWdlTmFtZV0gPz9cbiAgICBwYWNrYWdlSnNvbi5kZXZEZXBlbmRlbmNpZXM/LltwYWNrYWdlTmFtZV0gPz9cbiAgICBwYWNrYWdlSnNvbi5vcHRpb25hbERlcGVuZGVuY2llcz8uW3BhY2thZ2VOYW1lXSA/P1xuICAgIHBhY2thZ2VKc29uLnBlZXJEZXBlbmRlbmNpZXM/LltwYWNrYWdlTmFtZV07XG4gIGNvbnN0IG1ham9yID0gdmVyc2lvbj8ubWF0Y2goL1xcZCsvdSk/LlswXTtcbiAgcmV0dXJuIG1ham9yID09PSB1bmRlZmluZWQgPyB1bmRlZmluZWQgOiBOdW1iZXIobWFqb3IpO1xufVxuXG5mdW5jdGlvbiBmaWxlRXhpc3RzKHByb2plY3Q6IFByb2plY3QsIGZpbGVQYXRoOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgcmV0dXJuIGZzLmV4aXN0c1N5bmMocGF0aC5qb2luKHByb2plY3QuZGlyUGF0aCwgZmlsZVBhdGgpKTtcbn1cblxuZnVuY3Rpb24gaGFzUHJpc21hU2NoZW1hKHByb2plY3Q6IFByb2plY3QpOiBib29sZWFuIHtcbiAgcmV0dXJuIFsncHJpc21hL3NjaGVtYS5wcmlzbWEnLCAncHJpc21hL3NjaGVtYScsICdkYi9zY2hlbWEucHJpc21hJ10uc29tZSgoZmlsZVBhdGgpID0+XG4gICAgZmlsZUV4aXN0cyhwcm9qZWN0LCBmaWxlUGF0aClcbiAgKTtcbn1cbiIsImltcG9ydCBjaGFsayBmcm9tICdjaGFsayc7XG5pbXBvcnQga2lsbFBvcnRQcm9jZXNzIGZyb20gJ2tpbGwtcG9ydCc7XG5pbXBvcnQgdHlwZSB7IEFyZ3VtZW50c0NhbWVsQ2FzZSwgQ29tbWFuZE1vZHVsZSwgSW5mZXJyZWRPcHRpb25UeXBlcyB9IGZyb20gJ3lhcmdzJztcblxuaW1wb3J0IHsgZmluZFNlbGZQcm9qZWN0IH0gZnJvbSAnLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQgdHlwZSB7IHNoYXJlZE9wdGlvbnNCdWlsZGVyIH0gZnJvbSAnLi4vc2hhcmVkT3B0aW9uc0J1aWxkZXIuanMnO1xuaW1wb3J0IHsgaXNDSSB9IGZyb20gJy4uL3V0aWxzL2NpLmpzJztcblxuY29uc3Qga2lsbFBvcnRJZk5vbkNpQnVpbGRlciA9IHt9IGFzIGNvbnN0O1xuXG5leHBvcnQgY29uc3Qga2lsbFBvcnRJZk5vbkNpQ29tbWFuZDogQ29tbWFuZE1vZHVsZTxcbiAgdW5rbm93bixcbiAgSW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2Yga2lsbFBvcnRJZk5vbkNpQnVpbGRlciAmIHR5cGVvZiBzaGFyZWRPcHRpb25zQnVpbGRlcj5cbj4gPSB7XG4gIGNvbW1hbmQ6ICdraWxsLXBvcnQtaWYtbm9uLWNpJyxcbiAgZGVzY3JpYmU6ICdLaWxsIHRoZSBwb3J0IHNwZWNpZmllZCBieSBQT1JUIGVudmlyb25tZW50IHZhcmlhYmxlIGlmIG5vbi1DSS4nLFxuICBidWlsZGVyOiBraWxsUG9ydElmTm9uQ2lCdWlsZGVyLFxuICBhc3luYyBoYW5kbGVyKGFyZ3YpIHtcbiAgICBhd2FpdCBraWxsUG9ydElmTm9uQ2koYXJndik7XG4gIH0sXG59O1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24ga2lsbFBvcnRJZk5vbkNpKFxuICBhcmd2OiBBcmd1bWVudHNDYW1lbENhc2U8SW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2Yga2lsbFBvcnRJZk5vbkNpQnVpbGRlciAmIHR5cGVvZiBzaGFyZWRPcHRpb25zQnVpbGRlcj4+XG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgcHJvamVjdCA9IGZpbmRTZWxmUHJvamVjdChhcmd2KTtcbiAgaWYgKCFwcm9qZWN0KSB7XG4gICAgY29uc29sZS5lcnJvcihjaGFsay5yZWQoJ05vIHByb2plY3QgZm91bmQuJykpO1xuICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgfVxuXG4gIGlmIChpc0NJKHByb2plY3QuZW52LkNJKSkge1xuICAgIGNvbnNvbGUuaW5mbyhgU2tpcCBraWxsaW5nIHBvcnQgZHVlIHRvIENJOiAke3Byb2plY3QuZW52LkNJfWApO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGNvbnN0IHBvcnRFbnYgPSBwcm9qZWN0LmVudi5QT1JUO1xuICBjb25zdCBwb3J0ID0gTnVtYmVyKHBvcnRFbnYpO1xuICBpZiAoIU51bWJlci5pc0ludGVnZXIocG9ydCkgfHwgcG9ydCA8PSAwKSB7XG4gICAgY29uc29sZS5lcnJvcihjaGFsay5yZWQoYFBPUlQgZW52aXJvbm1lbnQgdmFyaWFibGUgaXMgaW52YWxpZDogJHtwb3J0RW52fWApKTtcbiAgICBwcm9jZXNzLmV4aXQoMSk7XG4gIH1cblxuICBjb25zb2xlLmluZm8oYEtpbGxpbmcgdGhlIHBvcnQ6ICR7cG9ydH1gKTtcbiAgdHJ5IHtcbiAgICBhd2FpdCBraWxsUG9ydFByb2Nlc3MocG9ydCk7XG4gIH0gY2F0Y2gge1xuICAgIC8vIGRvIG5vdGhpbmdcbiAgfVxufVxuIiwiZXhwb3J0IGZ1bmN0aW9uIHByaW50QnVmZmVyZWRPdXRwdXQoZXhpdENvZGU6IG51bWJlciwgb3V0cHV0OiBzdHJpbmcpOiB2b2lkIHtcbiAgaWYgKCFzaG91bGRQcmludEJ1ZmZlcmVkT3V0cHV0KGV4aXRDb2RlLCBvdXRwdXQpKSByZXR1cm47XG5cbiAgY29uc3Qgbm9ybWFsaXplZE91dHB1dCA9IG5vcm1hbGl6ZUJ1ZmZlcmVkT3V0cHV0KG91dHB1dCk7XG4gIGlmIChub3JtYWxpemVkT3V0cHV0KSB7XG4gICAgcHJvY2Vzcy5zdGRvdXQud3JpdGUobm9ybWFsaXplZE91dHB1dCk7XG4gICAgcHJvY2Vzcy5zdGRvdXQud3JpdGUoJ1xcbicpO1xuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBzaG91bGRQcmludEJ1ZmZlcmVkT3V0cHV0KGV4aXRDb2RlOiBudW1iZXIsIG91dHB1dDogc3RyaW5nKTogYm9vbGVhbiB7XG4gIHJldHVybiBleGl0Q29kZSAhPT0gMCB8fCBoYXNXYXJuaW5nT3V0cHV0KG91dHB1dCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBub3JtYWxpemVCdWZmZXJlZE91dHB1dChvdXRwdXQ6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiBvdXRwdXQudHJpbSgpO1xufVxuXG5mdW5jdGlvbiBoYXNXYXJuaW5nT3V0cHV0KG91dHB1dDogc3RyaW5nKTogYm9vbGVhbiB7XG4gIHJldHVybiAvXFxid2Fybig/OmluZyk/cz9cXGIvaS50ZXN0KG91dHB1dC5yZXBsYWNlQWxsKC9cXGIoPzowfG5vKSB3YXJuaW5ncz9cXGIvZ2ksICcnKSk7XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcy9wcm9taXNlcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgY2hhbGsgZnJvbSAnY2hhbGsnO1xuaW1wb3J0IHR5cGUgeyBBcmd1bWVudHNDYW1lbENhc2UsIENvbW1hbmRNb2R1bGUsIEluZmVycmVkT3B0aW9uVHlwZXMgfSBmcm9tICd5YXJncyc7XG5cbmltcG9ydCB0eXBlIHsgUHJvamVjdCB9IGZyb20gJy4uL3Byb2plY3QuanMnO1xuaW1wb3J0IHsgZmluZERlc2NlbmRhbnRQcm9qZWN0cyB9IGZyb20gJy4uL3Byb2plY3QuanMnO1xuaW1wb3J0IHR5cGUgeyBCdWZmZXJlZFJ1blJlc3VsdCB9IGZyb20gJy4uL3NjcmlwdHMvcnVuLmpzJztcbmltcG9ydCB7IG5vcm1hbGl6ZVNjcmlwdCwgcnVuV2l0aFNwYXduSW5QYXJhbGxlbCwgcnVuV2l0aFNwYXduSW5QYXJhbGxlbEJ1ZmZlcmVkIH0gZnJvbSAnLi4vc2NyaXB0cy9ydW4uanMnO1xuaW1wb3J0IHR5cGUgeyBzaGFyZWRPcHRpb25zQnVpbGRlciB9IGZyb20gJy4uL3NoYXJlZE9wdGlvbnNCdWlsZGVyLmpzJztcbmltcG9ydCB7IHByaW50QnVmZmVyZWRPdXRwdXQsIHNob3VsZFByaW50QnVmZmVyZWRPdXRwdXQgfSBmcm9tICcuLi91dGlscy9vdXRwdXQuanMnO1xuaW1wb3J0IHsgYnVpbGRTaGVsbENvbW1hbmQgfSBmcm9tICcuLi91dGlscy9zaGVsbC5qcyc7XG5cbmNvbnN0IGJ1aWxkZXIgPSB7XG4gIGZpeDoge1xuICAgIGRlc2NyaXB0aW9uOiAnRml4IHRoZSBsaW50aW5nIGVycm9ycycsXG4gICAgdHlwZTogJ2Jvb2xlYW4nLFxuICB9LFxuICBmb3JtYXQ6IHtcbiAgICBkZXNjcmlwdGlvbjogJ0Zvcm1hdCB0aGUgY29kZScsXG4gICAgdHlwZTogJ2Jvb2xlYW4nLFxuICB9LFxuICBxdWlldDoge1xuICAgIGRlc2NyaXB0aW9uOiAnUmVwb3J0IGVycm9ycyBvbmx5JyxcbiAgICB0eXBlOiAnYm9vbGVhbicsXG4gIH0sXG4gIHNpbGVudDoge1xuICAgIGRlc2NyaXB0aW9uOiAnUHJpbnQgb25seSBmYWlsZWQgb3Igd2FybmluZyBjb21tYW5kIG91dHB1dCcsXG4gICAgdHlwZTogJ2Jvb2xlYW4nLFxuICB9LFxufSBhcyBjb25zdDtcblxuY29uc3QgX2FyZ3VtZW50c0J1aWxkZXIgPSB7XG4gIGZpbGVzOiB7XG4gICAgZGVzY3JpcHRpb246ICdGaWxlIGFuZCBkaXJlY3RvcnkgcGF0aHMgdG8gbGludCcsXG4gICAgdHlwZTogJ2FycmF5JyxcbiAgfSxcbn0gYXMgY29uc3Q7XG5cbmV4cG9ydCB0eXBlIExpbnRDb21tYW5kT3B0aW9ucyA9IEluZmVycmVkT3B0aW9uVHlwZXM8XG4gIHR5cGVvZiBidWlsZGVyICYgdHlwZW9mIHNoYXJlZE9wdGlvbnNCdWlsZGVyICYgdHlwZW9mIF9hcmd1bWVudHNCdWlsZGVyXG4+O1xuZXhwb3J0IHR5cGUgTGludENvbW1hbmRBcmd2ID0gQXJndW1lbnRzQ2FtZWxDYXNlPExpbnRDb21tYW5kT3B0aW9ucz4gJiB7XG4gICctLSc/OiB1bmtub3duW107XG4gIF86IHVua25vd25bXTtcbiAgcHJpbnRBbGxPdXRwdXQ/OiBib29sZWFuO1xufTtcblxuY29uc3Qgb3hsaW50RXh0ZW5zaW9ucyA9IG5ldyBTZXQoWydhc3RybycsICdjanMnLCAnY3RzJywgJ2pzJywgJ2pzeCcsICdtanMnLCAnbXRzJywgJ3N2ZWx0ZScsICd0cycsICd0c3gnLCAndnVlJ10pO1xuY29uc3QgcHl0aG9uRXh0ZW5zaW9ucyA9IG5ldyBTZXQoWydweSddKTtcbmNvbnN0IGRhcnRFeHRlbnNpb25zID0gbmV3IFNldChbJ2RhcnQnXSk7XG5jb25zdCBydXN0RXh0ZW5zaW9ucyA9IG5ldyBTZXQoWydycyddKTtcbmNvbnN0IG94Zm10RXh0ZW5zaW9ucyA9IG5ldyBTZXQoW1xuICAuLi5veGxpbnRFeHRlbnNpb25zLFxuICAnY3NzJyxcbiAgJ2dxbCcsXG4gICdncmFwaHFsJyxcbiAgJ2hicycsXG4gICdodG0nLFxuICAnaHRtbCcsXG4gICdqc29uJyxcbiAgJ2pzb241JyxcbiAgJ2pzb25jJyxcbiAgJ2xlc3MnLFxuICAnbWQnLFxuICAnbWR4JyxcbiAgJ3Njc3MnLFxuICAndG9tbCcsXG4gICd5YW1sJyxcbiAgJ3ltbCcsXG5dKTtcbmNvbnN0IHByZXR0aWVyRXh0ZW5zaW9ucyA9IG5ldyBTZXQoW1xuICAnY2pzJyxcbiAgJ2NzcycsXG4gICdjdHMnLFxuICAnaHRtJyxcbiAgJ2h0bWwnLFxuICAnamF2YScsXG4gICdqcycsXG4gICdqc29uJyxcbiAgJ2pzb241JyxcbiAgJ2pzb25jJyxcbiAgJ2pzeCcsXG4gICdtZCcsXG4gICdtanMnLFxuICAnbXRzJyxcbiAgJ3Njc3MnLFxuICAndHMnLFxuICAndHN4JyxcbiAgJ3Z1ZScsXG4gICd5YW1sJyxcbiAgJ3ltbCcsXG5dKTtcbmNvbnN0IHByZXR0aWVyT25seUV4dGVuc2lvbnMgPSBuZXcgU2V0KFsuLi5wcmV0dGllckV4dGVuc2lvbnNdLmZpbHRlcigoZXh0KSA9PiAhb3hmbXRFeHRlbnNpb25zLmhhcyhleHQpKSk7XG5jb25zdCBwcmV0dGllckZpeHR1cmVJZ25vcmVQYXR0ZXJuID0gJyEqKi90ZXN0ey0sL31maXh0dXJlcy8qKic7XG5cbnR5cGUgQnVmZmVyZWRMaW50UnVuUmVzdWx0ID0gQnVmZmVyZWRSdW5SZXN1bHQgJiB7IGNvbW1hbmQ6IHN0cmluZzsgY3dkOiBzdHJpbmcgfTtcbnR5cGUgTGludFJ1blJlc3VsdCA9IEJ1ZmZlcmVkTGludFJ1blJlc3VsdCB8IHsgZXhpdENvZGU6IG51bWJlciB9O1xuaW50ZXJmYWNlIExpbnRSdW5Db21tYW5kIHtcbiAgY29tbWFuZDogc3RyaW5nO1xuICBwcm9qZWN0OiBQcm9qZWN0O1xufVxuXG5leHBvcnQgY29uc3QgbGludENvbW1hbmQ6IENvbW1hbmRNb2R1bGU8dW5rbm93biwgTGludENvbW1hbmRPcHRpb25zPiA9IHtcbiAgY29tbWFuZDogJ2xpbnQgW2ZpbGVzLi4uXScsXG4gIGRlc2NyaWJlOiAnTGludCBjb2RlJyxcbiAgYnVpbGRlcixcbiAgYXN5bmMgaGFuZGxlcihhcmd2KSB7XG4gICAgY29uc3QgZXhpdENvZGUgPSBhd2FpdCBsaW50KGFyZ3YgYXMgTGludENvbW1hbmRBcmd2KTtcbiAgICBpZiAoZXhpdENvZGUpIHByb2Nlc3MuZXhpdChleGl0Q29kZSk7XG4gIH0sXG59O1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gbGludChhcmd2OiBMaW50Q29tbWFuZEFyZ3YpOiBQcm9taXNlPG51bWJlcj4ge1xuICBpZiAocHJvY2Vzcy5wbGF0Zm9ybSA9PT0gJ3dpbjMyJykge1xuICAgIGNvbnNvbGUuZXJyb3IoY2hhbGsucmVkKCdUaGlzIGNvbW1hbmQgaXMgbm90IHN1cHBvcnRlZCBvbiBXaW5kb3dzLicpKTtcbiAgICByZXR1cm4gMTtcbiAgfVxuXG4gIGNvbnN0IHByb2plY3RzID0gYXdhaXQgZmluZERlc2NlbmRhbnRQcm9qZWN0cyhhcmd2LCBmYWxzZSk7XG4gIGlmICghcHJvamVjdHMpIHtcbiAgICBjb25zb2xlLmVycm9yKGNoYWxrLnJlZCgnTm8gcHJvamVjdCBmb3VuZC4nKSk7XG4gICAgcmV0dXJuIDE7XG4gIH1cblxuICBjb25zdCBmaWxlcyA9IGdldExpbnRUYXJnZXRGaWxlcyhhcmd2KTtcbiAgY29uc3QgbGludEZpbGVQYXRoc0J5UHJvamVjdCA9IG5ldyBNYXA8UHJvamVjdCwgc3RyaW5nW10+KCk7XG4gIGNvbnN0IG94Zm10RmlsZVBhdGhzQnlQcm9qZWN0ID0gbmV3IE1hcDxQcm9qZWN0LCBzdHJpbmdbXT4oKTtcbiAgY29uc3QgcHl0aG9uRmlsZVBhdGhzQnlQcm9qZWN0ID0gbmV3IE1hcDxQcm9qZWN0LCBzdHJpbmdbXT4oKTtcbiAgY29uc3QgZGFydEZpbGVQYXRoc0J5UHJvamVjdCA9IG5ldyBNYXA8UHJvamVjdCwgc3RyaW5nW10+KCk7XG4gIC8vIGBjYXJnbyBmbXQgLS1hbGxgIGFsd2F5cyBmb3JtYXRzIHRoZSB3aG9sZSB3b3Jrc3BhY2UsIHNvIHdlIHRyYWNrIHRhcmdldFxuICAvLyBwcm9qZWN0cyByYXRoZXIgdGhhbiBpbmRpdmlkdWFsIGZpbGUgcGF0aHMuIEV2ZXJ5IHByb2plY3Qgd2l0aCBpdHMgb3duXG4gIC8vIGBDYXJnby50b21sYCBydW5zIGl0cyBvd24gYGNhcmdvIGZtdCAtLWFsbGA7IHdlIGludGVudGlvbmFsbHkgZG8gbm90IGRlZHVwXG4gIC8vIGJ5IGRpcmVjdG9yeS4gQSBuZXN0ZWQgb3Igc2libGluZyBjcmF0ZSBjYW4gYmUgYW4gaW5kZXBlbmRlbnQgQ2FyZ29cbiAgLy8gd29ya3NwYWNlIHRoYXQgYSBwYXJlbnQncyBgY2FyZ28gZm10IC0tYWxsYCBuZXZlciByZWFjaGVzLCBzbyBza2lwcGluZyBpdFxuICAvLyB3b3VsZCBsZWF2ZSBpdCB1bmZvcm1hdHRlZCwgd2hpbGUgYW55IGdlbnVpbmVseSBvdmVybGFwcGluZyBydW5zIGFyZVxuICAvLyBoYXJtbGVzcyBiZWNhdXNlIHJ1c3RmbXQgaXMgZGV0ZXJtaW5pc3RpYyBhbmQgaWRlbXBvdGVudC4gRGVkdXBpbmcgYnkgcmVhbFxuICAvLyB3b3Jrc3BhY2UgbWVtYmVyc2hpcCB3b3VsZCByZXF1aXJlIGludm9raW5nIGBjYXJnbyBsb2NhdGUtcHJvamVjdGAuXG4gIGNvbnN0IGNhcmdvRm9ybWF0UHJvamVjdHMgPSBuZXcgU2V0PFByb2plY3Q+KCk7XG4gIGNvbnN0IHByZXR0aWVyRmlsZVBhdGhzOiBzdHJpbmdbXSA9IFtdO1xuICBjb25zdCBwYWNrYWdlSnNvbkZpbGVQYXRoczogc3RyaW5nW10gPSBbXTtcbiAgbGV0IG1pc3NpbmdMaW50VG9vbEZvckV4cGxpY2l0RmlsZXMgPSBmYWxzZTtcbiAgbGV0IHByZXR0aWVyQXJnczogc3RyaW5nW107XG4gIGxldCBzb3J0UGFja2FnZUpzb25BcmdzOiBzdHJpbmdbXTtcbiAgaWYgKGZpbGVzLmxlbmd0aCA+IDApIHtcbiAgICBjb25zdCBsaW50VGFyZ2V0cyA9IGF3YWl0IFByb21pc2UuYWxsKFxuICAgICAgZmlsZXMubWFwKGFzeW5jIChmaWxlKSA9PiB7XG4gICAgICAgIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKGZpbGUpO1xuICAgICAgICBjb25zdCBmaWxlS2luZCA9IGF3YWl0IGdldExpbnRUYXJnZXRGaWxlS2luZChmaWxlUGF0aCk7XG4gICAgICAgIHJldHVybiB7IGZpbGVLaW5kLCBmaWxlUGF0aCB9O1xuICAgICAgfSlcbiAgICApO1xuICAgIGZvciAoY29uc3QgeyBmaWxlS2luZCwgZmlsZVBhdGggfSBvZiBsaW50VGFyZ2V0cykge1xuICAgICAgaWYgKFxuICAgICAgICBmaWxlUGF0aC5lbmRzV2l0aCgnL3Rlc3QvZml4dHVyZXMnKSB8fFxuICAgICAgICBmaWxlUGF0aC5pbmNsdWRlcygnL3Rlc3QvZml4dHVyZXMvJykgfHxcbiAgICAgICAgZmlsZVBhdGguZW5kc1dpdGgoJy90ZXN0LWZpeHR1cmVzJykgfHxcbiAgICAgICAgZmlsZVBhdGguaW5jbHVkZXMoJy90ZXN0LWZpeHR1cmVzLycpXG4gICAgICApIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGV4dGVuc2lvbiA9IHBhdGguZXh0bmFtZShmaWxlUGF0aCkuc2xpY2UoMSk7XG4gICAgICBpZiAoZmlsZVBhdGguZW5kc1dpdGgoJy9wYWNrYWdlLmpzb24nKSkge1xuICAgICAgICBwYWNrYWdlSnNvbkZpbGVQYXRocy5wdXNoKGZpbGVQYXRoKTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBwYWNrYWdlSnNvbkZpbGVQYXRocy5wdXNoKC4uLmdldEV4cGxpY2l0UGFja2FnZUpzb25QYXRocyhwcm9qZWN0cy5kZXNjZW5kYW50cywgZmlsZVBhdGgsIGZpbGVLaW5kKSk7XG5cbiAgICAgIGZvciAoY29uc3QgeyBsaW50UGF0aCwgcHJvamVjdCB9IG9mIGdldEV4cGxpY2l0TGludFRhcmdldHMocHJvamVjdHMuZGVzY2VuZGFudHMsIGZpbGVQYXRoLCBmaWxlS2luZCkpIHtcbiAgICAgICAgaWYgKHByb2plY3QuaGFzUG9ldHJ5TG9jayAmJiAoZmlsZUtpbmQgPT09ICdkaXJlY3RvcnknIHx8IHB5dGhvbkV4dGVuc2lvbnMuaGFzKGV4dGVuc2lvbikpKSB7XG4gICAgICAgICAgY29uc3QgcHl0aG9uRmlsZVBhdGhzID0gcHl0aG9uRmlsZVBhdGhzQnlQcm9qZWN0LmdldChwcm9qZWN0KSA/PyBbXTtcbiAgICAgICAgICBweXRob25GaWxlUGF0aHMucHVzaChsaW50UGF0aCk7XG4gICAgICAgICAgcHl0aG9uRmlsZVBhdGhzQnlQcm9qZWN0LnNldChwcm9qZWN0LCBweXRob25GaWxlUGF0aHMpO1xuICAgICAgICAgIGlmIChmaWxlS2luZCAhPT0gJ2RpcmVjdG9yeScpIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChwcm9qZWN0Lmhhc1B1YnNwZWNZYW1sICYmIChmaWxlS2luZCA9PT0gJ2RpcmVjdG9yeScgfHwgZGFydEV4dGVuc2lvbnMuaGFzKGV4dGVuc2lvbikpKSB7XG4gICAgICAgICAgY29uc3QgZGFydEZpbGVQYXRocyA9IGRhcnRGaWxlUGF0aHNCeVByb2plY3QuZ2V0KHByb2plY3QpID8/IFtdO1xuICAgICAgICAgIGRhcnRGaWxlUGF0aHMucHVzaChsaW50UGF0aCk7XG4gICAgICAgICAgZGFydEZpbGVQYXRoc0J5UHJvamVjdC5zZXQocHJvamVjdCwgZGFydEZpbGVQYXRocyk7XG4gICAgICAgICAgaWYgKGZpbGVLaW5kICE9PSAnZGlyZWN0b3J5JykgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHByb2plY3QuaGFzQ2FyZ29Ub21sICYmIChmaWxlS2luZCA9PT0gJ2RpcmVjdG9yeScgfHwgcnVzdEV4dGVuc2lvbnMuaGFzKGV4dGVuc2lvbikpKSB7XG4gICAgICAgICAgY2FyZ29Gb3JtYXRQcm9qZWN0cy5hZGQocHJvamVjdCk7XG4gICAgICAgICAgaWYgKGZpbGVLaW5kICE9PSAnZGlyZWN0b3J5JykgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGZpbGVLaW5kID09PSAnZGlyZWN0b3J5JyB8fCBzdXBwb3J0c0xpbnRpbmdFeHRlbnNpb24ocHJvamVjdCwgZXh0ZW5zaW9uKSkge1xuICAgICAgICAgIGNvbnN0IGxpbnRGaWxlUGF0aHMgPSBsaW50RmlsZVBhdGhzQnlQcm9qZWN0LmdldChwcm9qZWN0KSA/PyBbXTtcbiAgICAgICAgICBsaW50RmlsZVBhdGhzLnB1c2gobGludFBhdGgpO1xuICAgICAgICAgIGxpbnRGaWxlUGF0aHNCeVByb2plY3Quc2V0KHByb2plY3QsIGxpbnRGaWxlUGF0aHMpO1xuICAgICAgICAgIGlmIChhcmd2LmZvcm1hdCkge1xuICAgICAgICAgICAgaWYgKGZpbGVLaW5kID09PSAnZGlyZWN0b3J5JyAmJiBwcm9qZWN0Lmhhc094Zm10KSB7XG4gICAgICAgICAgICAgIGNvbnN0IG94Zm10RmlsZVBhdGhzID0gb3hmbXRGaWxlUGF0aHNCeVByb2plY3QuZ2V0KHByb2plY3QpID8/IFtdO1xuICAgICAgICAgICAgICBveGZtdEZpbGVQYXRocy5wdXNoKGxpbnRQYXRoKTtcbiAgICAgICAgICAgICAgb3hmbXRGaWxlUGF0aHNCeVByb2plY3Quc2V0KHByb2plY3QsIG94Zm10RmlsZVBhdGhzKTtcbiAgICAgICAgICAgICAgcHJldHRpZXJGaWxlUGF0aHMucHVzaChidWlsZFByZXR0aWVyT25seURpcmVjdG9yeVBhdHRlcm4obGludFBhdGgpLCBwcmV0dGllckZpeHR1cmVJZ25vcmVQYXR0ZXJuKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIGZvciAoY29uc3QgZm9ybWF0dGVyUGF0aCBvZiBidWlsZEV4cGxpY2l0Rm9ybWF0dGVyQXJncyhwcm9qZWN0LCBsaW50UGF0aCwgZmlsZUtpbmQsIGV4dGVuc2lvbikpIHtcbiAgICAgICAgICAgICAgICBpZiAocHJvamVjdC5oYXNPeGZtdCkge1xuICAgICAgICAgICAgICAgICAgY29uc3Qgb3hmbXRGaWxlUGF0aHMgPSBveGZtdEZpbGVQYXRoc0J5UHJvamVjdC5nZXQocHJvamVjdCkgPz8gW107XG4gICAgICAgICAgICAgICAgICBveGZtdEZpbGVQYXRocy5wdXNoKGZvcm1hdHRlclBhdGgpO1xuICAgICAgICAgICAgICAgICAgb3hmbXRGaWxlUGF0aHNCeVByb2plY3Quc2V0KHByb2plY3QsIG94Zm10RmlsZVBhdGhzKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgcHJldHRpZXJGaWxlUGF0aHMucHVzaChmb3JtYXR0ZXJQYXRoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAoYXJndi5mb3JtYXQgJiYgKHByZXR0aWVyRXh0ZW5zaW9ucy5oYXMoZXh0ZW5zaW9uKSB8fCBveGZtdEV4dGVuc2lvbnMuaGFzKGV4dGVuc2lvbikpKSB7XG4gICAgICAgICAgaWYgKHByb2plY3QuaGFzT3hmbXQgJiYgb3hmbXRFeHRlbnNpb25zLmhhcyhleHRlbnNpb24pKSB7XG4gICAgICAgICAgICBjb25zdCBveGZtdEZpbGVQYXRocyA9IG94Zm10RmlsZVBhdGhzQnlQcm9qZWN0LmdldChwcm9qZWN0KSA/PyBbXTtcbiAgICAgICAgICAgIG94Zm10RmlsZVBhdGhzLnB1c2gobGludFBhdGgpO1xuICAgICAgICAgICAgb3hmbXRGaWxlUGF0aHNCeVByb2plY3Quc2V0KHByb2plY3QsIG94Zm10RmlsZVBhdGhzKTtcbiAgICAgICAgICB9IGVsc2UgaWYgKHByZXR0aWVyRXh0ZW5zaW9ucy5oYXMoZXh0ZW5zaW9uKSkge1xuICAgICAgICAgICAgcHJldHRpZXJGaWxlUGF0aHMucHVzaChsaW50UGF0aCk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKGlzUG90ZW50aWFsTGludFRhcmdldChleHRlbnNpb24pICYmICFwcm9qZWN0LnByZWZlcnJlZExpbnRlcikge1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoY2hhbGsucmVkKGBObyBsaW50ZXIgZm91bmQgZm9yICR7cHJvamVjdC5uYW1lfS4gSW5zdGFsbCBPeGxpbnQuYCkpO1xuICAgICAgICAgIG1pc3NpbmdMaW50VG9vbEZvckV4cGxpY2l0RmlsZXMgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHByZXR0aWVyQXJncyA9IFsuLi5uZXcgU2V0KHByZXR0aWVyRmlsZVBhdGhzKV07XG4gICAgc29ydFBhY2thZ2VKc29uQXJncyA9IFsuLi5uZXcgU2V0KHBhY2thZ2VKc29uRmlsZVBhdGhzKV07XG4gIH0gZWxzZSB7XG4gICAgcHJldHRpZXJBcmdzID0gYnVpbGRQcmV0dGllckFyZ3MocHJvamVjdHMuc2VsZi5kaXJQYXRoLCBwcm9qZWN0cy5kZXNjZW5kYW50cyk7XG4gICAgc29ydFBhY2thZ2VKc29uQXJncyA9IHByb2plY3RzLmRlc2NlbmRhbnRzLm1hcCgocCkgPT4gcC5wYWNrYWdlSnNvblBhdGgpO1xuICB9XG5cbiAgY29uc3QgZm9ybWF0dGVyQ29tbWFuZHM6IExpbnRSdW5Db21tYW5kW10gPSBbXTtcbiAgY29uc3QgbGludGVyQ29tbWFuZHM6IExpbnRSdW5Db21tYW5kW10gPSBbXTtcbiAgY29uc3QgbGludFJ1bk9wdGlvbnMgPSB7IGV4aXRJZkZhaWxlZDogZmFsc2UsIHByZXNlcnZlQ29sb3I6ICFhcmd2LnByaW50QWxsT3V0cHV0IH0gYXMgY29uc3Q7XG4gIGNvbnN0IHNob3VsZFJ1bkZvcm1hdHRlcnMgPSBCb29sZWFuKGFyZ3YuZm9ybWF0KTtcbiAgY29uc3Qgc2hvdWxkUnVuTGludGVycyA9ICFhcmd2LmZvcm1hdCB8fCBhcmd2LmZpeDtcbiAgaWYgKGZpbGVzLmxlbmd0aCA+IDApIHtcbiAgICBpZiAoc2hvdWxkUnVuTGludGVycykge1xuICAgICAgZm9yIChjb25zdCBbcHJvamVjdCwgbGludEZpbGVQYXRoc10gb2YgbGludEZpbGVQYXRoc0J5UHJvamVjdCkge1xuICAgICAgICBjb25zdCBsaW50Q29tbWFuZCA9IGJ1aWxkTGludENvbW1hbmQocHJvamVjdCwgYXJndiwgbGludEZpbGVQYXRocyk7XG4gICAgICAgIGlmICghbGludENvbW1hbmQpIGNvbnRpbnVlO1xuXG4gICAgICAgIGxpbnRlckNvbW1hbmRzLnB1c2goeyBjb21tYW5kOiBsaW50Q29tbWFuZCwgcHJvamVjdCB9KTtcbiAgICAgIH1cbiAgICB9XG4gICAgZm9yIChjb25zdCBbcHJvamVjdCwgcHl0aG9uRmlsZVBhdGhzXSBvZiBweXRob25GaWxlUGF0aHNCeVByb2plY3QpIHtcbiAgICAgIGlmIChzaG91bGRSdW5MaW50ZXJzKSB7XG4gICAgICAgIGxpbnRlckNvbW1hbmRzLnB1c2goeyBjb21tYW5kOiBidWlsZFBvZXRyeUxpbnRDb21tYW5kKGFyZ3YsIHB5dGhvbkZpbGVQYXRocyksIHByb2plY3QgfSk7XG4gICAgICB9XG4gICAgICBpZiAoc2hvdWxkUnVuRm9ybWF0dGVycykge1xuICAgICAgICBmb3JtYXR0ZXJDb21tYW5kcy5wdXNoKHsgY29tbWFuZDogYnVpbGRQb2V0cnlGb3JtYXRDb21tYW5kKHB5dGhvbkZpbGVQYXRocyksIHByb2plY3QgfSk7XG4gICAgICB9XG4gICAgfVxuICAgIGZvciAoY29uc3QgW3Byb2plY3QsIGRhcnRGaWxlUGF0aHNdIG9mIGRhcnRGaWxlUGF0aHNCeVByb2plY3QpIHtcbiAgICAgIGlmIChzaG91bGRSdW5MaW50ZXJzKSB7XG4gICAgICAgIGxpbnRlckNvbW1hbmRzLnB1c2goeyBjb21tYW5kOiBidWlsZERhcnRMaW50Q29tbWFuZChkYXJ0RmlsZVBhdGhzKSwgcHJvamVjdCB9KTtcbiAgICAgIH1cbiAgICAgIGlmIChzaG91bGRSdW5Gb3JtYXR0ZXJzKSB7XG4gICAgICAgIGZvcm1hdHRlckNvbW1hbmRzLnB1c2goeyBjb21tYW5kOiBidWlsZERhcnRGb3JtYXRDb21tYW5kKGRhcnRGaWxlUGF0aHMpLCBwcm9qZWN0IH0pO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoc2hvdWxkUnVuRm9ybWF0dGVycykge1xuICAgICAgZm9yIChjb25zdCBwcm9qZWN0IG9mIGNhcmdvRm9ybWF0UHJvamVjdHMpIHtcbiAgICAgICAgZm9ybWF0dGVyQ29tbWFuZHMucHVzaCh7IGNvbW1hbmQ6IGJ1aWxkQ2FyZ29Gb3JtYXRDb21tYW5kKCksIHByb2plY3QgfSk7XG4gICAgICB9XG4gICAgICBmb3IgKGNvbnN0IFtwcm9qZWN0LCBveGZtdEZpbGVQYXRoc10gb2Ygb3hmbXRGaWxlUGF0aHNCeVByb2plY3QpIHtcbiAgICAgICAgZm9ybWF0dGVyQ29tbWFuZHMucHVzaCh7IGNvbW1hbmQ6IGJ1aWxkT3hmbXRDb21tYW5kKG94Zm10RmlsZVBhdGhzKSwgcHJvamVjdCB9KTtcbiAgICAgIH1cbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgZm9yIChjb25zdCBwcm9qZWN0IG9mIHByb2plY3RzLmRlc2NlbmRhbnRzKSB7XG4gICAgICBpZiAoc2hvdWxkUnVuTGludGVycykge1xuICAgICAgICBpZiAoIXByb2plY3QucGFja2FnZUpzb24ud29ya3NwYWNlcyB8fCBwcm9qZWN0Lmhhc1NvdXJjZUNvZGUpIHtcbiAgICAgICAgICBjb25zdCBsaW50Q29tbWFuZCA9IGJ1aWxkTGludENvbW1hbmQocHJvamVjdCwgYXJndik7XG4gICAgICAgICAgaWYgKGxpbnRDb21tYW5kKSBsaW50ZXJDb21tYW5kcy5wdXNoKHsgY29tbWFuZDogbGludENvbW1hbmQsIHByb2plY3QgfSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHByb2plY3QuaGFzUG9ldHJ5TG9jaykgbGludGVyQ29tbWFuZHMucHVzaCh7IGNvbW1hbmQ6IGJ1aWxkUG9ldHJ5TGludENvbW1hbmQoYXJndiksIHByb2plY3QgfSk7XG4gICAgICAgIGlmIChwcm9qZWN0Lmhhc1B1YnNwZWNZYW1sKSBsaW50ZXJDb21tYW5kcy5wdXNoKHsgY29tbWFuZDogYnVpbGREYXJ0TGludENvbW1hbmQoKSwgcHJvamVjdCB9KTtcbiAgICAgIH1cbiAgICAgIGlmIChzaG91bGRSdW5Gb3JtYXR0ZXJzKSB7XG4gICAgICAgIGlmIChwcm9qZWN0Lmhhc094Zm10KSBmb3JtYXR0ZXJDb21tYW5kcy5wdXNoKHsgY29tbWFuZDogYnVpbGRPeGZtdENvbW1hbmQoKSwgcHJvamVjdCB9KTtcbiAgICAgICAgaWYgKHByb2plY3QuaGFzUG9ldHJ5TG9jaykgZm9ybWF0dGVyQ29tbWFuZHMucHVzaCh7IGNvbW1hbmQ6IGJ1aWxkUG9ldHJ5Rm9ybWF0Q29tbWFuZCgpLCBwcm9qZWN0IH0pO1xuICAgICAgICBpZiAocHJvamVjdC5oYXNQdWJzcGVjWWFtbCkgZm9ybWF0dGVyQ29tbWFuZHMucHVzaCh7IGNvbW1hbmQ6IGJ1aWxkRGFydEZvcm1hdENvbW1hbmQoKSwgcHJvamVjdCB9KTtcbiAgICAgICAgaWYgKHByb2plY3QuaGFzQ2FyZ29Ub21sKSBmb3JtYXR0ZXJDb21tYW5kcy5wdXNoKHsgY29tbWFuZDogYnVpbGRDYXJnb0Zvcm1hdENvbW1hbmQoKSwgcHJvamVjdCB9KTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgY29uc3QgbGludEV4aXRDb2RlczogbnVtYmVyW10gPSBbXTtcblxuICBpZiAoc2hvdWxkUnVuRm9ybWF0dGVycykge1xuICAgIGNvbnN0IGZvcm1hdHRlclJlc3VsdHMgPSBhd2FpdCBydW5MaW50Q29tbWFuZHMoZm9ybWF0dGVyQ29tbWFuZHMsIGFyZ3YsIGxpbnRSdW5PcHRpb25zKTtcbiAgICBwcmludFNpbGVudExpbnRPdXRwdXRzKGZvcm1hdHRlclJlc3VsdHMsIGFyZ3YpO1xuICAgIGxpbnRFeGl0Q29kZXMucHVzaCguLi5mb3JtYXR0ZXJSZXN1bHRzLm1hcCgocmVzdWx0KSA9PiByZXN1bHQuZXhpdENvZGUpKTtcblxuICAgIGlmIChsaW50RXhpdENvZGVzLnNvbWUoKGV4aXRDb2RlKSA9PiBleGl0Q29kZSAhPT0gMCkpIHtcbiAgICAgIHJldHVybiAxO1xuICAgIH1cbiAgfVxuXG4gIGlmIChtaXNzaW5nTGludFRvb2xGb3JFeHBsaWNpdEZpbGVzKSB7XG4gICAgcmV0dXJuIDE7XG4gIH1cblxuICBpZiAoc2hvdWxkUnVuRm9ybWF0dGVycykge1xuICAgIGlmIChwcmV0dGllckFyZ3MubGVuZ3RoID4gMCAmJiBwcm9qZWN0cy5zZWxmLmhhc1ByZXR0aWVyKSB7XG4gICAgICBjb25zdCBwcmV0dGllclJlc3VsdCA9IGF3YWl0IHJ1bkxpbnRDb21tYW5kKFxuICAgICAgICBidWlsZFNoZWxsQ29tbWFuZChbXG4gICAgICAgICAgJ1lBUk4nLFxuICAgICAgICAgICdwcmV0dGllcicsXG4gICAgICAgICAgJy0tY2FjaGUnLFxuICAgICAgICAgICctLW5vLWVycm9yLW9uLXVubWF0Y2hlZC1wYXR0ZXJuJyxcbiAgICAgICAgICAnLS13cml0ZScsXG4gICAgICAgICAgJy0tJyxcbiAgICAgICAgICAuLi5wcmV0dGllckFyZ3MsXG4gICAgICAgIF0pLFxuICAgICAgICBwcm9qZWN0cy5zZWxmLFxuICAgICAgICBhcmd2LFxuICAgICAgICBsaW50UnVuT3B0aW9uc1xuICAgICAgKTtcbiAgICAgIHByaW50U2lsZW50TGludE91dHB1dHMoW3ByZXR0aWVyUmVzdWx0XSwgYXJndik7XG4gICAgICBsaW50RXhpdENvZGVzLnB1c2gocHJldHRpZXJSZXN1bHQuZXhpdENvZGUpO1xuICAgIH1cbiAgICBpZiAoc29ydFBhY2thZ2VKc29uQXJncy5sZW5ndGggPiAwKSB7XG4gICAgICBjb25zdCBzb3J0UGFja2FnZUpzb25SZXN1bHQgPSBhd2FpdCBydW5MaW50Q29tbWFuZChcbiAgICAgICAgYnVpbGRTaGVsbENvbW1hbmQoWydZQVJOJywgJ3NvcnQtcGFja2FnZS1qc29uJywgJy0tJywgLi4uc29ydFBhY2thZ2VKc29uQXJnc10pLFxuICAgICAgICBwcm9qZWN0cy5zZWxmLFxuICAgICAgICBhcmd2LFxuICAgICAgICBsaW50UnVuT3B0aW9uc1xuICAgICAgKTtcbiAgICAgIHByaW50U2lsZW50TGludE91dHB1dHMoW3NvcnRQYWNrYWdlSnNvblJlc3VsdF0sIGFyZ3YpO1xuICAgICAgbGludEV4aXRDb2Rlcy5wdXNoKHNvcnRQYWNrYWdlSnNvblJlc3VsdC5leGl0Q29kZSk7XG4gICAgfVxuXG4gICAgaWYgKGxpbnRFeGl0Q29kZXMuc29tZSgoZXhpdENvZGUpID0+IGV4aXRDb2RlICE9PSAwKSkge1xuICAgICAgcmV0dXJuIDE7XG4gICAgfVxuICB9XG5cbiAgaWYgKHNob3VsZFJ1bkxpbnRlcnMpIHtcbiAgICBjb25zdCBsaW50ZXJSZXN1bHRzID0gYXdhaXQgcnVuTGludENvbW1hbmRzKGxpbnRlckNvbW1hbmRzLCBhcmd2LCBsaW50UnVuT3B0aW9ucyk7XG4gICAgcHJpbnRTaWxlbnRMaW50T3V0cHV0cyhsaW50ZXJSZXN1bHRzLCBhcmd2KTtcbiAgICBsaW50RXhpdENvZGVzLnB1c2goLi4ubGludGVyUmVzdWx0cy5tYXAoKHJlc3VsdCkgPT4gcmVzdWx0LmV4aXRDb2RlKSk7XG4gIH1cblxuICByZXR1cm4gbGludEV4aXRDb2Rlcy5zb21lKChleGl0Q29kZSkgPT4gZXhpdENvZGUgIT09IDApID8gMSA6IDA7XG59XG5cbmZ1bmN0aW9uIHJ1bkxpbnRDb21tYW5kcyhcbiAgY29tbWFuZHM6IExpbnRSdW5Db21tYW5kW10sXG4gIGFyZ3Y6IExpbnRDb21tYW5kQXJndixcbiAgb3B0aW9uczogUGFyYW1ldGVyczx0eXBlb2YgcnVuV2l0aFNwYXduSW5QYXJhbGxlbD5bM11cbik6IFByb21pc2U8TGludFJ1blJlc3VsdFtdPiB7XG4gIHJldHVybiBQcm9taXNlLmFsbChjb21tYW5kcy5tYXAoKHsgY29tbWFuZCwgcHJvamVjdCB9KSA9PiBydW5MaW50Q29tbWFuZChjb21tYW5kLCBwcm9qZWN0LCBhcmd2LCBvcHRpb25zKSkpO1xufVxuXG5mdW5jdGlvbiBydW5MaW50Q29tbWFuZChcbiAgY29tbWFuZDogc3RyaW5nLFxuICBwcm9qZWN0OiBQcm9qZWN0LFxuICBhcmd2OiBMaW50Q29tbWFuZEFyZ3YsXG4gIG9wdGlvbnM6IFBhcmFtZXRlcnM8dHlwZW9mIHJ1bldpdGhTcGF3bkluUGFyYWxsZWw+WzNdXG4pOiBQcm9taXNlPExpbnRSdW5SZXN1bHQ+IHtcbiAgaWYgKGFyZ3Yuc2lsZW50KSB7XG4gICAgY29uc3Qgbm9ybWFsaXplZFNjcmlwdCA9IG5vcm1hbGl6ZVNjcmlwdChjb21tYW5kLCBwcm9qZWN0KTtcbiAgICByZXR1cm4gcnVuV2l0aFNwYXduSW5QYXJhbGxlbEJ1ZmZlcmVkKGNvbW1hbmQsIHByb2plY3QsIGFyZ3YsIG9wdGlvbnMpLnRoZW4oKHJlc3VsdCkgPT4gKHtcbiAgICAgIC4uLnJlc3VsdCxcbiAgICAgIGNvbW1hbmQ6IG5vcm1hbGl6ZWRTY3JpcHQucHJpbnRhYmxlLFxuICAgICAgY3dkOiBwcm9qZWN0LmRpclBhdGgsXG4gICAgfSkpO1xuICB9XG4gIHJldHVybiBydW5XaXRoU3Bhd25JblBhcmFsbGVsKGNvbW1hbmQsIHByb2plY3QsIGFyZ3YsIG9wdGlvbnMpLnRoZW4oKGV4aXRDb2RlKSA9PiAoeyBleGl0Q29kZSB9KSk7XG59XG5cbmZ1bmN0aW9uIHByaW50U2lsZW50TGludE91dHB1dHMoXG4gIHJlc3VsdHM6IExpbnRSdW5SZXN1bHRbXSxcbiAgYXJndjogUGljazxMaW50Q29tbWFuZEFyZ3YsICdwcmludEFsbE91dHB1dCcgfCAnc2lsZW50Jz5cbik6IHZvaWQge1xuICBjb25zdCBwcmludGFibGVSZXN1bHRzID1cbiAgICBhcmd2LnNpbGVudCAmJiAhYXJndi5wcmludEFsbE91dHB1dFxuICAgICAgPyByZXN1bHRzLmZpbHRlcigocmVzdWx0KSA9PiAnb3V0cHV0JyBpbiByZXN1bHQgJiYgc2hvdWxkUHJpbnRCdWZmZXJlZE91dHB1dChyZXN1bHQuZXhpdENvZGUsIHJlc3VsdC5vdXRwdXQpKVxuICAgICAgOiByZXN1bHRzO1xuICBpZiAocHJpbnRhYmxlUmVzdWx0cy5sZW5ndGggPT09IDApIHJldHVybjtcblxuICBmb3IgKGNvbnN0IHJlc3VsdCBvZiBwcmludGFibGVSZXN1bHRzKSB7XG4gICAgaWYgKCEoJ291dHB1dCcgaW4gcmVzdWx0KSkgY29udGludWU7XG5cbiAgICBpZiAoYXJndi5wcmludEFsbE91dHB1dCkge1xuICAgICAgcHJpbnRDb21tYW5kT3V0cHV0KHJlc3VsdCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmIChhcmd2LnNpbGVudCkge1xuICAgICAgICBwcmludENvbW1hbmRIZWFkZXIocmVzdWx0LmNvbW1hbmQsIHJlc3VsdC5jd2QpO1xuICAgICAgfVxuICAgICAgcHJpbnRCdWZmZXJlZE91dHB1dChyZXN1bHQuZXhpdENvZGUsIHJlc3VsdC5vdXRwdXQpO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBwcmludENvbW1hbmRPdXRwdXQocmVzdWx0OiBCdWZmZXJlZExpbnRSdW5SZXN1bHQpOiB2b2lkIHtcbiAgcHJpbnRDb21tYW5kSGVhZGVyKHJlc3VsdC5jb21tYW5kLCByZXN1bHQuY3dkKTtcblxuICBpZiAocmVzdWx0LmV4aXRDb2RlID09PSAwICYmIHNob3VsZFN1cHByZXNzU3VjY2Vzc2Z1bFZlcmlmeU91dHB1dChyZXN1bHQuY29tbWFuZCkpIHtcbiAgICBjb25zb2xlLmluZm8oY2hhbGsuZ3JlZW4oJ1N1Y2NlZWRlZC4nKSk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgY29uc3Qgb3V0cHV0ID0gcmVzdWx0Lm91dHB1dC50cmltKCk7XG4gIGlmIChvdXRwdXQpIHtcbiAgICBwcm9jZXNzLnN0ZG91dC53cml0ZShvdXRwdXQpO1xuICAgIHByb2Nlc3Muc3Rkb3V0LndyaXRlKCdcXG4nKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBwcmludENvbW1hbmRIZWFkZXIoY29tbWFuZDogc3RyaW5nLCBjd2Q6IHN0cmluZyk6IHZvaWQge1xuICBjb25zb2xlLmluZm8oJ1xcbicgKyBjaGFsay5jeWFuKGNoYWxrLmJvbGQoJ0NvbW1hbmQ6JyksIGNvbW1hbmQpICsgY2hhbGsuZ3JheShgIGF0ICR7Y3dkfWApKTtcbn1cblxuZnVuY3Rpb24gc2hvdWxkU3VwcHJlc3NTdWNjZXNzZnVsVmVyaWZ5T3V0cHV0KGNvbW1hbmQ6IHN0cmluZyk6IGJvb2xlYW4ge1xuICByZXR1cm4gY29tbWFuZC5pbmNsdWRlcygnIG94Zm10ICcpIHx8IGNvbW1hbmQuaW5jbHVkZXMoJyBzb3J0LXBhY2thZ2UtanNvbiAnKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGJ1aWxkTGludENvbW1hbmQoXG4gIHByb2plY3Q6IFBpY2s8UHJvamVjdCwgJ3ByZWZlcnJlZExpbnRlcicgfCAnaGFzVHlwZUF3YXJlT3hsaW50Jz4sXG4gIGFyZ3Y6IFBpY2s8TGludENvbW1hbmRPcHRpb25zLCAnZml4JyB8ICdmb3JtYXQnPiAmIFBhcnRpYWw8UGljazxMaW50Q29tbWFuZE9wdGlvbnMsICdxdWlldCc+PixcbiAgZmlsZXM/OiBzdHJpbmdbXVxuKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgaWYgKHByb2plY3QucHJlZmVycmVkTGludGVyID09PSAnb3hsaW50Jykge1xuICAgIHJldHVybiBidWlsZFNoZWxsQ29tbWFuZChbXG4gICAgICAnWUFSTicsXG4gICAgICAnb3hsaW50JyxcbiAgICAgICctLW5vLWVycm9yLW9uLXVubWF0Y2hlZC1wYXR0ZXJuJyxcbiAgICAgIC8vIFR5cGUtYXdhcmUgbW9kZSBtYWtlcyBveGxpbnQgcmVwb3J0IHR5cGUtY2hlY2sgZGlhZ25vc3RpY3MuIFBhc3MgdGhlIGZsYWdzIGV4cGxpY2l0bHlcbiAgICAgIC8vIGJlY2F1c2Ugb3hsaW50IHJlamVjdHMgdGhlIGVxdWl2YWxlbnQgb3B0aW9ucyBpbiBub24tcm9vdCBjb25maWdzLCBzbyBwZXItcGFja2FnZSBydW5zXG4gICAgICAvLyBpbiBtb25vcmVwb3Mgd291bGQgb3RoZXJ3aXNlIG1pc3MgdHlwZSBlcnJvcnMuXG4gICAgICAuLi4ocHJvamVjdC5oYXNUeXBlQXdhcmVPeGxpbnQgPyBbJy0tdHlwZS1hd2FyZScsICctLXR5cGUtY2hlY2snXSA6IFtdKSxcbiAgICAgIC4uLihhcmd2LnF1aWV0ID8gWyctLXF1aWV0J10gOiBbXSksXG4gICAgICAuLi4oYXJndi5maXggPyBbJy0tZml4J10gOiBbXSksXG4gICAgICAuLi4oZmlsZXMgPz8gWycuJ10pLFxuICAgIF0pO1xuICB9XG4gIHJldHVybjtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGJ1aWxkT3hmbXRDb21tYW5kKGZpbGVzPzogc3RyaW5nW10pOiBzdHJpbmcge1xuICByZXR1cm4gYnVpbGRTaGVsbENvbW1hbmQoW1xuICAgICdZQVJOJyxcbiAgICAnb3hmbXQnLFxuICAgICctLXdyaXRlJyxcbiAgICAnLS1uby1lcnJvci1vbi11bm1hdGNoZWQtcGF0dGVybicsXG4gICAgLi4uKGZpbGVzID8/IFsnLiddKSxcbiAgICAnISoqL3BhY2thZ2UuanNvbicsXG4gIF0pO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gYnVpbGRQb2V0cnlGb3JtYXRDb21tYW5kKGZpbGVzPzogc3RyaW5nW10pOiBzdHJpbmcge1xuICBjb25zdCB0YXJnZXRzID0gZmlsZXMgJiYgZmlsZXMubGVuZ3RoID4gMCA/IGZpbGVzIDogWycuJ107XG4gIHJldHVybiBbXG4gICAgYnVpbGRTaGVsbENvbW1hbmQoWydwb2V0cnknLCAncnVuJywgJ2lzb3J0JywgJy0tcHJvZmlsZScsICdibGFjaycsICctLWZpbHRlci1maWxlcycsIC4uLnRhcmdldHNdKSxcbiAgICBidWlsZFNoZWxsQ29tbWFuZChbJ3BvZXRyeScsICdydW4nLCAnYmxhY2snLCAuLi50YXJnZXRzXSksXG4gIF0uam9pbignICYmICcpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gYnVpbGRQb2V0cnlMaW50Q29tbWFuZChhcmd2OiBQYXJ0aWFsPFBpY2s8TGludENvbW1hbmRPcHRpb25zLCAncXVpZXQnPj4sIGZpbGVzPzogc3RyaW5nW10pOiBzdHJpbmcge1xuICBjb25zdCB0YXJnZXRzID0gZmlsZXMgJiYgZmlsZXMubGVuZ3RoID4gMCA/IGZpbGVzIDogWycuJ107XG4gIHJldHVybiBidWlsZFNoZWxsQ29tbWFuZChbJ3BvZXRyeScsICdydW4nLCAnZmxha2U4JywgLi4uKGFyZ3YucXVpZXQgPyBbJy1xJ10gOiBbXSksIC4uLnRhcmdldHNdKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGJ1aWxkQ2FyZ29Gb3JtYXRDb21tYW5kKCk6IHN0cmluZyB7XG4gIC8vIEZvcm1hdHRpbmcgbXVzdCBnbyB0aHJvdWdoIGNhcmdvIChub3QgcnVzdGZtdCBvbiBpbmRpdmlkdWFsIGZpbGVzKSBzbyBlYWNoXG4gIC8vIGNyYXRlJ3MgZWRpdGlvbiBhbmQgcnVzdGZtdCBjb25maWd1cmF0aW9uIGFyZSByZXNwZWN0ZWQ7IGAtLWFsbGAgY292ZXJzXG4gIC8vIGV2ZXJ5IHdvcmtzcGFjZSBtZW1iZXIgYW5kIGlzIGEgbm8tb3Agc3VmZml4IGZvciBzaW5nbGUtY3JhdGUgcHJvamVjdHMuXG4gIHJldHVybiBidWlsZFNoZWxsQ29tbWFuZChbJ2NhcmdvJywgJ2ZtdCcsICctLWFsbCddKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGJ1aWxkRGFydEZvcm1hdENvbW1hbmQoZmlsZXM/OiBzdHJpbmdbXSk6IHN0cmluZyB7XG4gIGNvbnN0IHRhcmdldHMgPSBmaWxlcyAmJiBmaWxlcy5sZW5ndGggPiAwID8gZmlsZXMgOiBbJy4nXTtcbiAgcmV0dXJuIGJ1aWxkU2hlbGxDb21tYW5kKFsnZGFydCcsICdmb3JtYXQnLCAuLi50YXJnZXRzXSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBidWlsZERhcnRMaW50Q29tbWFuZChmaWxlcz86IHN0cmluZ1tdKTogc3RyaW5nIHtcbiAgY29uc3QgdGFyZ2V0cyA9IGZpbGVzICYmIGZpbGVzLmxlbmd0aCA+IDAgPyBmaWxlcyA6IFsnLiddO1xuICByZXR1cm4gYnVpbGRTaGVsbENvbW1hbmQoWydkYXJ0JywgJ2FuYWx5emUnLCAuLi50YXJnZXRzXSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBidWlsZFByZXR0aWVyQXJncyhcbiAgc2VsZkRpclBhdGg6IHN0cmluZyxcbiAgcHJvamVjdHM6IFBpY2s8UHJvamVjdCwgJ2RpclBhdGgnIHwgJ3ByZWZlcnJlZExpbnRlcicgfCAnaGFzT3hmbXQnPltdXG4pOiBzdHJpbmdbXSB7XG4gIGNvbnN0IGFyZ3MgPSBuZXcgU2V0PHN0cmluZz4oW2AqKi97LiovLH0qLnske1suLi5wcmV0dGllck9ubHlFeHRlbnNpb25zXS5qb2luKCcsJyl9fWAsIHByZXR0aWVyRml4dHVyZUlnbm9yZVBhdHRlcm5dKTtcbiAgZm9yIChjb25zdCBwcm9qZWN0IG9mIHByb2plY3RzKSB7XG4gICAgaWYgKCFuZWVkc1ByZXR0aWVyKHByb2plY3QpKSBjb250aW51ZTtcblxuICAgIGNvbnN0IHByb2plY3RQYXR0ZXJuID0gcGF0aC5qb2luKHByb2plY3QuZGlyUGF0aCwgJyoqL3suKi8sfSoueycgKyBbLi4ucHJldHRpZXJFeHRlbnNpb25zXS5qb2luKCcsJykgKyAnfScpO1xuICAgIGFyZ3MuYWRkKHBhdGgucmVsYXRpdmUoc2VsZkRpclBhdGgsIHByb2plY3RQYXR0ZXJuKSB8fCBwcm9qZWN0UGF0dGVybik7XG4gIH1cbiAgcmV0dXJuIFsuLi5hcmdzXTtcbn1cblxuZnVuY3Rpb24gZmluZE93bmluZ1Byb2plY3QocHJvamVjdHM6IFByb2plY3RbXSwgZmlsZVBhdGg6IHN0cmluZyk6IFByb2plY3QgfCB1bmRlZmluZWQge1xuICBsZXQgb3duaW5nUHJvamVjdDogUHJvamVjdCB8IHVuZGVmaW5lZDtcbiAgZm9yIChjb25zdCBwcm9qZWN0IG9mIHByb2plY3RzKSB7XG4gICAgaWYgKFxuICAgICAgKGZpbGVQYXRoID09PSBwcm9qZWN0LmRpclBhdGggfHwgZmlsZVBhdGguc3RhcnRzV2l0aChgJHtwcm9qZWN0LmRpclBhdGh9L2ApKSAmJlxuICAgICAgKCFvd25pbmdQcm9qZWN0IHx8IHByb2plY3QuZGlyUGF0aC5sZW5ndGggPiBvd25pbmdQcm9qZWN0LmRpclBhdGgubGVuZ3RoKVxuICAgICkge1xuICAgICAgb3duaW5nUHJvamVjdCA9IHByb2plY3Q7XG4gICAgfVxuICB9XG4gIHJldHVybiBvd25pbmdQcm9qZWN0O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0TGludFRhcmdldEZpbGVzKGFyZ3Y6IFBpY2s8TGludENvbW1hbmRBcmd2LCAnLS0nIHwgJ18nIHwgJ2ZpbGVzJz4pOiBzdHJpbmdbXSB7XG4gIGNvbnN0IGxpbnRUYXJnZXRzID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gIGZvciAoY29uc3QgdmFsdWUgb2YgWy4uLihhcmd2LmZpbGVzID8/IFtdKSwgLi4uYXJndi5fLnNsaWNlKDEpLCAuLi4oYXJndlsnLS0nXSA/PyBbXSldKSB7XG4gICAgbGludFRhcmdldHMuYWRkKFN0cmluZyh2YWx1ZSkpO1xuICB9XG4gIHJldHVybiBbLi4ubGludFRhcmdldHNdO1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2V0TGludFRhcmdldEZpbGVLaW5kKGZpbGVQYXRoOiBzdHJpbmcpOiBQcm9taXNlPCdkaXJlY3RvcnknIHwgJ290aGVyJz4ge1xuICB0cnkge1xuICAgIGNvbnN0IHN0YXRzID0gYXdhaXQgZnMuc3RhdChmaWxlUGF0aCk7XG4gICAgaWYgKHN0YXRzLmlzRGlyZWN0b3J5KCkpIHJldHVybiAnZGlyZWN0b3J5JztcbiAgfSBjYXRjaCB7XG4gICAgLy8gTWlzc2luZyBwYXRocyBhcmUgaGFuZGxlZCBieSB0aGUgZG93bnN0cmVhbSB0b29scy5cbiAgfVxuXG4gIHJldHVybiAnb3RoZXInO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gc2hvdWxkRm9ybWF0RXhwbGljaXRQYXRoV2l0aFByZXR0aWVyKFxuICBwcm9qZWN0OiBQaWNrPFByb2plY3QsICdwcmVmZXJyZWRMaW50ZXInIHwgJ2hhc094Zm10Jz4sXG4gIGV4dGVuc2lvbjogc3RyaW5nXG4pOiBib29sZWFuIHtcbiAgaWYgKHByb2plY3QuaGFzT3hmbXQpIHJldHVybiBveGZtdEV4dGVuc2lvbnMuaGFzKGV4dGVuc2lvbik7XG4gIGlmIChuZWVkc1ByZXR0aWVyKHByb2plY3QpKSByZXR1cm4gdHJ1ZTtcbiAgcmV0dXJuIHByZXR0aWVyT25seUV4dGVuc2lvbnMuaGFzKGV4dGVuc2lvbik7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBidWlsZEV4cGxpY2l0Rm9ybWF0dGVyQXJncyhcbiAgcHJvamVjdDogUGljazxQcm9qZWN0LCAncHJlZmVycmVkTGludGVyJyB8ICdoYXNPeGZtdCc+LFxuICBmaWxlUGF0aDogc3RyaW5nLFxuICBmaWxlS2luZDogJ2RpcmVjdG9yeScgfCAnb3RoZXInLFxuICBleHRlbnNpb246IHN0cmluZ1xuKTogc3RyaW5nW10ge1xuICBpZiAoZmlsZUtpbmQgPT09ICdkaXJlY3RvcnknICYmIHByb2plY3QuaGFzT3hmbXQpIHtcbiAgICByZXR1cm4gW2ZpbGVQYXRoXTtcbiAgfVxuICBpZiAoZmlsZUtpbmQgPT09ICdkaXJlY3RvcnknICYmIG5lZWRzUHJldHRpZXIocHJvamVjdCkpIHtcbiAgICByZXR1cm4gW2ZpbGVQYXRoLCBwcmV0dGllckZpeHR1cmVJZ25vcmVQYXR0ZXJuXTtcbiAgfVxuICBpZiAoc2hvdWxkRm9ybWF0RXhwbGljaXRQYXRoV2l0aFByZXR0aWVyKHByb2plY3QsIGV4dGVuc2lvbikpIHtcbiAgICByZXR1cm4gW2ZpbGVQYXRoXTtcbiAgfVxuICByZXR1cm4gW107XG59XG5cbmZ1bmN0aW9uIGJ1aWxkUHJldHRpZXJPbmx5RGlyZWN0b3J5UGF0dGVybihmaWxlUGF0aDogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIHBhdGguam9pbihmaWxlUGF0aCwgYCoqL3suKi8sfSoueyR7Wy4uLnByZXR0aWVyT25seUV4dGVuc2lvbnNdLmpvaW4oJywnKX19YCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRFeHBsaWNpdFBhY2thZ2VKc29uUGF0aHMoXG4gIHByb2plY3RzOiBQaWNrPFByb2plY3QsICdkaXJQYXRoJyB8ICdwYWNrYWdlSnNvblBhdGgnPltdLFxuICBmaWxlUGF0aDogc3RyaW5nLFxuICBmaWxlS2luZDogJ2RpcmVjdG9yeScgfCAnb3RoZXInXG4pOiBzdHJpbmdbXSB7XG4gIGlmIChmaWxlS2luZCAhPT0gJ2RpcmVjdG9yeScpIHJldHVybiBbXTtcbiAgcmV0dXJuIHByb2plY3RzXG4gICAgLmZpbHRlcihcbiAgICAgIChwcm9qZWN0KSA9PlxuICAgICAgICBwcm9qZWN0LnBhY2thZ2VKc29uUGF0aCA9PT0gcGF0aC5qb2luKGZpbGVQYXRoLCAncGFja2FnZS5qc29uJykgfHxcbiAgICAgICAgcHJvamVjdC5wYWNrYWdlSnNvblBhdGguc3RhcnRzV2l0aChgJHtmaWxlUGF0aH0vYClcbiAgICApXG4gICAgLm1hcCgocHJvamVjdCkgPT4gcHJvamVjdC5wYWNrYWdlSnNvblBhdGgpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0RXhwbGljaXRMaW50VGFyZ2V0cyhcbiAgcHJvamVjdHM6IFByb2plY3RbXSxcbiAgZmlsZVBhdGg6IHN0cmluZyxcbiAgZmlsZUtpbmQ6ICdkaXJlY3RvcnknIHwgJ290aGVyJ1xuKTogeyBsaW50UGF0aDogc3RyaW5nOyBwcm9qZWN0OiBQcm9qZWN0IH1bXSB7XG4gIGlmIChmaWxlS2luZCA9PT0gJ2RpcmVjdG9yeScpIHtcbiAgICBjb25zdCBkZXNjZW5kYW50UHJvamVjdHMgPSBwcm9qZWN0cy5maWx0ZXIoXG4gICAgICAocHJvamVjdCkgPT4gcHJvamVjdC5kaXJQYXRoID09PSBmaWxlUGF0aCB8fCBwcm9qZWN0LmRpclBhdGguc3RhcnRzV2l0aChgJHtmaWxlUGF0aH0vYClcbiAgICApO1xuICAgIGlmIChkZXNjZW5kYW50UHJvamVjdHMubGVuZ3RoID4gMCkge1xuICAgICAgcmV0dXJuIGRlc2NlbmRhbnRQcm9qZWN0cy5tYXAoKHByb2plY3QpID0+ICh7IGxpbnRQYXRoOiBwcm9qZWN0LmRpclBhdGgsIHByb2plY3QgfSkpO1xuICAgIH1cbiAgfVxuXG4gIGNvbnN0IHByb2plY3QgPSBmaW5kT3duaW5nUHJvamVjdChwcm9qZWN0cywgZmlsZVBhdGgpO1xuICByZXR1cm4gcHJvamVjdCA/IFt7IGxpbnRQYXRoOiBmaWxlUGF0aCwgcHJvamVjdCB9XSA6IFtdO1xufVxuXG5mdW5jdGlvbiBpc1BvdGVudGlhbExpbnRUYXJnZXQoZXh0ZW5zaW9uOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgcmV0dXJuIG94bGludEV4dGVuc2lvbnMuaGFzKGV4dGVuc2lvbikgfHwgcHl0aG9uRXh0ZW5zaW9ucy5oYXMoZXh0ZW5zaW9uKSB8fCBkYXJ0RXh0ZW5zaW9ucy5oYXMoZXh0ZW5zaW9uKTtcbn1cblxuZnVuY3Rpb24gc3VwcG9ydHNMaW50aW5nRXh0ZW5zaW9uKHByb2plY3Q6IFBpY2s8UHJvamVjdCwgJ3ByZWZlcnJlZExpbnRlcic+LCBleHRlbnNpb246IHN0cmluZyk6IGJvb2xlYW4ge1xuICBpZiAocHJvamVjdC5wcmVmZXJyZWRMaW50ZXIgPT09ICdveGxpbnQnKSByZXR1cm4gb3hsaW50RXh0ZW5zaW9ucy5oYXMoZXh0ZW5zaW9uKTtcbiAgcmV0dXJuIGZhbHNlO1xufVxuXG5mdW5jdGlvbiBuZWVkc1ByZXR0aWVyKHByb2plY3Q6IFBpY2s8UHJvamVjdCwgJ3ByZWZlcnJlZExpbnRlcicgfCAnaGFzT3hmbXQnPik6IGJvb2xlYW4ge1xuICByZXR1cm4gIXByb2plY3QuaGFzT3hmbXQgJiYgcHJvamVjdC5wcmVmZXJyZWRMaW50ZXIgPT09ICdveGxpbnQnO1xufVxuIiwiaW1wb3J0IHsgY3JlYXRlU2VydmVyIH0gZnJvbSAnbm9kZTpuZXQnO1xuXG5pbXBvcnQgdHlwZSB7IFByb2plY3QgfSBmcm9tICcuLi9wcm9qZWN0LmpzJztcblxuaW1wb3J0IHsga2lsbFBvcnRQcm9jZXNzSW1tZWRpYXRlbHlBbmRPbkV4aXQgfSBmcm9tICcuL3Byb2Nlc3MuanMnO1xuXG4vKipcbiAqIENoZWNrcyB0aGUgZ2l2ZW4gcG9ydCBhbmQga2lsbHMgYW55IHByb2Nlc3MgdXNpbmcgaXQuXG4gKiBOb3RlIHdiIGFsd2F5cyByZXF1aXJlcyBQT1JUIGVudmlyb25tZW50IHZhcmlhYmxlLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gY2hlY2tBbmRLaWxsUG9ydFByb2Nlc3MocmF3UG9ydDogdW5rbm93biwgcHJvamVjdDogUHJvamVjdCk6IFByb21pc2U8bnVtYmVyPiB7XG4gIGNvbnN0IHBvcnQgPSBOdW1iZXIocmF3UG9ydCk7XG4gIGlmICghcG9ydCkgdGhyb3cgbmV3IEVycm9yKGBUaGUgZ2l2ZW4gcG9ydCAoJHtwb3J0fSkgaXMgaW52YWxpZC5gKTtcblxuICBhd2FpdCBraWxsUG9ydFByb2Nlc3NJbW1lZGlhdGVseUFuZE9uRXhpdChwb3J0LCBwcm9qZWN0KTtcbiAgcmV0dXJuIHBvcnQ7XG59XG5cbi8qKlxuICogQ2hlY2tzIGlmIGEgcG9ydCBpcyBhdmFpbGFibGUuXG4gKiBAcGFyYW0gcG9ydCAtIFRoZSBwb3J0IG51bWJlciB0byBjaGVja1xuICogQHJldHVybnMgQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgdG8gdHJ1ZSBpZiB0aGUgcG9ydCBpcyBhdmFpbGFibGUsIGZhbHNlIG90aGVyd2lzZVxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gaXNQb3J0QXZhaWxhYmxlKHBvcnQ6IG51bWJlcik6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAvLyBDaGVjayBib3RoIHN0YWNrcyB0byBjYXRjaCBwcm9jZXNzZXMgYm91bmQgb25seSBvbiBJUHY2IG9yIElQdjQuXG4gIGZvciAoY29uc3QgaG9zdCBvZiBbJzEyNy4wLjAuMScsICc6OiddKSB7XG4gICAgY29uc3QgYXZhaWxhYmxlID0gYXdhaXQgcHJvYmVQb3J0KGhvc3QsIHBvcnQpO1xuICAgIGlmICghYXZhaWxhYmxlKSByZXR1cm4gZmFsc2U7XG4gIH1cbiAgcmV0dXJuIHRydWU7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHByb2JlUG9ydChob3N0OiBzdHJpbmcsIHBvcnQ6IG51bWJlcik6IFByb21pc2U8Ym9vbGVhbj4ge1xuICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcbiAgICBjb25zdCBzZXJ2ZXIgPSBjcmVhdGVTZXJ2ZXIoKTtcblxuICAgIHNlcnZlci5vbmNlKCdlcnJvcicsIChlcnI6IE5vZGVKUy5FcnJub0V4Y2VwdGlvbikgPT4ge1xuICAgICAgaWYgKGVyci5jb2RlID09PSAnRUFERFJJTlVTRScpIHtcbiAgICAgICAgcmVzb2x2ZShmYWxzZSk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGlmIChlcnIuY29kZSA9PT0gJ0VBRk5PU1VQUE9SVCcpIHtcbiAgICAgICAgcmVzb2x2ZSh0cnVlKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgcmVzb2x2ZShmYWxzZSk7XG4gICAgfSk7XG5cbiAgICBzZXJ2ZXIub25jZSgnbGlzdGVuaW5nJywgKCkgPT4ge1xuICAgICAgc2VydmVyLmNsb3NlKCgpID0+IHtcbiAgICAgICAgcmVzb2x2ZSh0cnVlKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgc2VydmVyLmxpc3Rlbihwb3J0LCBob3N0KTtcbiAgfSk7XG59XG4iLCJpbXBvcnQgeyBleGVjRmlsZVN5bmMsIHNwYXduU3luYyB9IGZyb20gJ25vZGU6Y2hpbGRfcHJvY2Vzcyc7XG5pbXBvcnQgeyBzZXRUaW1lb3V0IH0gZnJvbSAnbm9kZTp0aW1lcnMvcHJvbWlzZXMnO1xuXG5pbXBvcnQgeyBzcGF3bkFzeW5jIH0gZnJvbSAnQHdpbGxib29zdGVyL3NoYXJlZC1saWItbm9kZS9zcmMnO1xuXG5pbXBvcnQgdHlwZSB7IFByb2plY3QgfSBmcm9tICcuLi9wcm9qZWN0LmpzJztcbmltcG9ydCB7IHByaW50RmluaXNoZWRBbmRFeGl0SWZOZWVkZWQsIHByaW50U3RhcnQgfSBmcm9tICcuLi9zY3JpcHRzL3J1bi5qcyc7XG5cbmltcG9ydCB7IGlzUG9ydEF2YWlsYWJsZSB9IGZyb20gJy4vcG9ydC5qcyc7XG5cbmNvbnN0IGtpbGxlZCA9IG5ldyBTZXQ8bnVtYmVyIHwgc3RyaW5nPigpO1xuY29uc3Qgc3RhbGVQcm9jZXNzUG9sbEludGVydmFsTXMgPSAxMDA7XG5jb25zdCBzdGFsZVByb2Nlc3NNYXhQb2xscyA9IDEwO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24ga2lsbFBvcnRQcm9jZXNzSW1tZWRpYXRlbHlBbmRPbkV4aXQocG9ydDogbnVtYmVyLCBwcm9qZWN0OiBQcm9qZWN0KTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IGF2YWlsYWJsZSA9IGF3YWl0IGlzUG9ydEF2YWlsYWJsZShwb3J0KTtcbiAgaWYgKCFhdmFpbGFibGUpIHtcbiAgICBhd2FpdCBraWxsUG9ydENvbnRhaW5lckFuZFByb2Nlc3MocG9ydCwgcHJvamVjdCk7XG4gIH1cblxuICBjb25zdCBraWxsRnVuYyA9IGFzeW5jICgpOiBQcm9taXNlPHZvaWQ+ID0+IHtcbiAgICBpZiAoa2lsbGVkLmhhcyhwb3J0KSkgcmV0dXJuO1xuXG4gICAga2lsbGVkLmFkZChwb3J0KTtcbiAgICBhd2FpdCBraWxsUG9ydENvbnRhaW5lckFuZFByb2Nlc3MocG9ydCwgcHJvamVjdCk7XG4gIH07XG4gIGZvciAoY29uc3Qgc2lnbmFsIG9mIFsnYmVmb3JlRXhpdCcsICdTSUdJTlQnLCAnU0lHVEVSTScsICdTSUdRVUlUJ10pIHtcbiAgICBwcm9jZXNzLm9uKHNpZ25hbCwga2lsbEZ1bmMpO1xuICB9XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBraWxsUG9ydENvbnRhaW5lckFuZFByb2Nlc3MocG9ydDogbnVtYmVyLCBwcm9qZWN0OiBQcm9qZWN0KTogUHJvbWlzZTx2b2lkPiB7XG4gIGF3YWl0IHN0b3BEb2NrZXJDb250YWluZXJCeVBvcnQocG9ydCwgcHJvamVjdCk7XG4gIGtpbGxMaXN0ZW5pbmdQcm9jZXNzZXNCeVBvcnQocG9ydCk7XG59XG5cbmZ1bmN0aW9uIGtpbGxMaXN0ZW5pbmdQcm9jZXNzZXNCeVBvcnQocG9ydDogbnVtYmVyKTogdm9pZCB7XG4gIGZvciAoY29uc3QgcGlkIG9mIGxpc3RMaXN0ZW5pbmdQcm9jZXNzSWRzKHBvcnQpKSB7XG4gICAgdHJ5IHtcbiAgICAgIHByb2Nlc3Mua2lsbChwaWQsICdTSUdLSUxMJyk7XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBkbyBub3RoaW5nXG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGxpc3RMaXN0ZW5pbmdQcm9jZXNzSWRzKHBvcnQ6IG51bWJlcik6IG51bWJlcltdIHtcbiAgdHJ5IHtcbiAgICBjb25zdCBzdGRvdXQgPSBleGVjRmlsZVN5bmMoJ2xzb2YnLCBbJy10aScsIGB0Y3A6JHtwb3J0fWAsICctc1RDUDpMSVNURU4nXSwge1xuICAgICAgZW5jb2Rpbmc6ICd1dGY4JyxcbiAgICAgIHN0ZGlvOiBbJ2lnbm9yZScsICdwaXBlJywgJ2lnbm9yZSddLFxuICAgICAgdGltZW91dDogMjAwMCxcbiAgICB9KTtcbiAgICByZXR1cm4gc3Rkb3V0XG4gICAgICAuc3BsaXQoL1xccysvKVxuICAgICAgLm1hcCgocGlkKSA9PiBOdW1iZXIocGlkLnRyaW0oKSkpXG4gICAgICAuZmlsdGVyKChwaWQpID0+IE51bWJlci5pc0ludGVnZXIocGlkKSAmJiBwaWQgPiAwICYmIHBpZCAhPT0gcHJvY2Vzcy5waWQpO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gW107XG4gIH1cbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJlbW92ZVN0YWxlUHJvY2VzcyhwaWQ6IG51bWJlcik6IFByb21pc2U8dm9pZD4ge1xuICBmb3IgKGxldCBpID0gMDsgaSA8IHN0YWxlUHJvY2Vzc01heFBvbGxzOyBpKyspIHtcbiAgICBhd2FpdCBzZXRUaW1lb3V0KHN0YWxlUHJvY2Vzc1BvbGxJbnRlcnZhbE1zKTtcbiAgICB0cnkge1xuICAgICAgcHJvY2Vzcy5raWxsKHBpZCwgMCk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGlmICgoZXJyb3IgYXMgTm9kZUpTLkVycm5vRXhjZXB0aW9uKS5jb2RlID09PSAnRVNSQ0gnKSByZXR1cm47XG4gICAgfVxuICB9XG5cbiAgdHJ5IHtcbiAgICBwcm9jZXNzLmtpbGwocGlkLCAnU0lHS0lMTCcpO1xuICB9IGNhdGNoIHtcbiAgICAvLyBkbyBub3RoaW5nXG4gIH1cbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHN0b3BEb2NrZXJDb250YWluZXJCeUltYWdlTmFtZShpbWFnZU5hbWU6IHN0cmluZywgcHJvamVjdDogUHJvamVjdCk6IFByb21pc2U8dm9pZD4ge1xuICBhd2FpdCByZW1vdmVEb2NrZXJDb250YWluZXJzKFsnLS1maWx0ZXInLCBgbmFtZT0ke2ltYWdlTmFtZX1gXSwgcHJvamVjdCk7XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBzdG9wRG9ja2VyQ29udGFpbmVyQnlQb3J0KHBvcnQ6IG51bWJlciwgcHJvamVjdDogUHJvamVjdCk6IFByb21pc2U8dm9pZD4ge1xuICBhd2FpdCByZW1vdmVEb2NrZXJDb250YWluZXJzKFsnLS1maWx0ZXInLCBgcHVibGlzaD0ke3BvcnR9YF0sIHByb2plY3QpO1xufVxuXG5hc3luYyBmdW5jdGlvbiByZW1vdmVEb2NrZXJDb250YWluZXJzKGZpbHRlckFyZ3M6IHN0cmluZ1tdLCBwcm9qZWN0OiBQcm9qZWN0KTogUHJvbWlzZTx2b2lkPiB7XG4gIHRyeSB7XG4gICAgY29uc3QgY29udGFpbmVySWRzID0gYXdhaXQgbGlzdERvY2tlckNvbnRhaW5lcklkcyhmaWx0ZXJBcmdzLCBwcm9qZWN0KTtcbiAgICBpZiAoY29udGFpbmVySWRzLmxlbmd0aCA9PT0gMCkgcmV0dXJuO1xuXG4gICAgYXdhaXQgc3Bhd25Bc3luYygnZG9ja2VyJywgWydybScsICctZicsIC4uLmNvbnRhaW5lcklkc10sIHtcbiAgICAgIGN3ZDogcHJvamVjdC5kaXJQYXRoLFxuICAgICAgZW52OiBwcm9qZWN0LmVudixcbiAgICB9KTtcbiAgfSBjYXRjaCB7XG4gICAgLy8gZG8gbm90aGluZ1xuICB9XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGxpc3REb2NrZXJDb250YWluZXJJZHMoZmlsdGVyQXJnczogc3RyaW5nW10sIHByb2plY3Q6IFByb2plY3QpOiBQcm9taXNlPHN0cmluZ1tdPiB7XG4gIGNvbnN0IHsgc3Rkb3V0IH0gPSBhd2FpdCBzcGF3bkFzeW5jKCdkb2NrZXInLCBbJ3BzJywgJy1xJywgLi4uZmlsdGVyQXJnc10sIHtcbiAgICBjd2Q6IHByb2plY3QuZGlyUGF0aCxcbiAgICBlbnY6IHByb2plY3QuZW52LFxuICB9KTtcbiAgcmV0dXJuIHN0ZG91dFxuICAgIC5zcGxpdCgvXFxzKy8pXG4gICAgLm1hcCgoaWQpID0+IGlkLnRyaW0oKSlcbiAgICAuZmlsdGVyKEJvb2xlYW4pO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gc3Bhd25TeW5jT25FeGl0KHNjcmlwdDogc3RyaW5nLCBwcm9qZWN0OiBQcm9qZWN0KTogdm9pZCB7XG4gIGNvbnN0IGtpbGxGdW5jID0gKCk6IHZvaWQgPT4ge1xuICAgIGlmIChraWxsZWQuaGFzKHNjcmlwdCkpIHJldHVybjtcblxuICAgIGtpbGxlZC5hZGQoc2NyaXB0KTtcbiAgICBwcmludFN0YXJ0KHNjcmlwdCwgcHJvamVjdCk7XG4gICAgY29uc3QgeyBzdGF0dXMgfSA9IHNwYXduU3luYyhzY3JpcHQsIHsgY3dkOiBwcm9qZWN0LmRpclBhdGgsIHNoZWxsOiB0cnVlLCBzdGRpbzogJ2luaGVyaXQnIH0pO1xuICAgIHByaW50RmluaXNoZWRBbmRFeGl0SWZOZWVkZWQoc2NyaXB0LCBzdGF0dXMsIHt9KTtcbiAgfTtcbiAgZm9yIChjb25zdCBzaWduYWwgb2YgWydiZWZvcmVFeGl0JywgJ1NJR0lOVCcsICdTSUdURVJNJywgJ1NJR1FVSVQnXSkge1xuICAgIHByb2Nlc3Mub24oc2lnbmFsLCBraWxsRnVuYyk7XG4gIH1cbn1cbiIsImltcG9ydCBhc3NlcnQgZnJvbSAnbm9kZTphc3NlcnQnO1xuaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMvcHJvbWlzZXMnO1xuaW1wb3J0IGh0dHAgZnJvbSAnbm9kZTpodHRwJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5pbXBvcnQgeyBzZXRUaW1lb3V0IH0gZnJvbSAnbm9kZTp0aW1lcnMvcHJvbWlzZXMnO1xuXG5pbXBvcnQgeyB0cmVlS2lsbCB9IGZyb20gJ0B3aWxsYm9vc3Rlci9zaGFyZWQtbGliLW5vZGUvc3JjJztcbmltcG9ydCBjaGFsayBmcm9tICdjaGFsayc7XG5pbXBvcnQgdHlwZSB7IEFyZ3YsIENvbW1hbmRNb2R1bGUsIEluZmVycmVkT3B0aW9uVHlwZXMgfSBmcm9tICd5YXJncyc7XG5cbmltcG9ydCB7IGZpbmRTZWxmUHJvamVjdCwgdHlwZSBQcm9qZWN0IH0gZnJvbSAnLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQgdHlwZSB7IHNoYXJlZE9wdGlvbnNCdWlsZGVyIH0gZnJvbSAnLi4vc2hhcmVkT3B0aW9uc0J1aWxkZXIuanMnO1xuaW1wb3J0IHsga2lsbFBvcnRDb250YWluZXJBbmRQcm9jZXNzLCByZW1vdmVTdGFsZVByb2Nlc3MgfSBmcm9tICcuLi91dGlscy9wcm9jZXNzLmpzJztcblxuY29uc3QgYnVpbGRlciA9IHtcbiAgJ2RlbGF5LW1zJzoge1xuICAgIGRlZmF1bHQ6IDUwMDAsXG4gICAgZGVzY3JpYmU6ICdEZWxheSBiZWZvcmUgc3RhcnRpbmcgdGhlIG1haW50ZW5hbmNlIHBhZ2Ugc2VydmVyLicsXG4gICAgdHlwZTogJ251bWJlcicsXG4gIH0sXG59IGFzIGNvbnN0O1xudHlwZSBNYWludGVuYW5jZUFyZ3YgPSBJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBidWlsZGVyICYgdHlwZW9mIHNoYXJlZE9wdGlvbnNCdWlsZGVyPiAmIHtcbiAgYWN0aW9uOiAnc3RhcnQnIHwgJ3N0b3AnO1xufTtcbmNvbnN0IG1haW50ZW5hbmNlTGlzdGVuTWF4QXR0ZW1wdHMgPSA1O1xuY29uc3QgbWFpbnRlbmFuY2VMaXN0ZW5SZXRyeURlbGF5TXMgPSAxMDA7XG5jb25zdCBtYXhUaW1lb3V0RGVsYXlNcyA9IDJfMTQ3XzQ4M182NDc7XG5jb25zdCBtYWludGVuYW5jZVBpZERpcmVjdG9yeU5hbWUgPSAnLndiJztcbmNvbnN0IG1haW50ZW5hbmNlSHRtbCA9IGA8IWRvY3R5cGUgaHRtbD5cbjxodG1sIGxhbmc9XCJqYVwiPlxuICA8aGVhZD5cbiAgICA8bWV0YSBjaGFyc2V0PVwidXRmLThcIj5cbiAgICA8bWV0YSBuYW1lPVwidmlld3BvcnRcIiBjb250ZW50PVwid2lkdGg9ZGV2aWNlLXdpZHRoLCBpbml0aWFsLXNjYWxlPTFcIj5cbiAgICA8dGl0bGU+44Oh44Oz44OG44OK44Oz44K55LitPC90aXRsZT5cbiAgICA8c3R5bGU+XG4gICAgICBib2R5IHtcbiAgICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgICAgICAgYmFja2dyb3VuZDogI2Y4ZmFmYztcbiAgICAgICAgY29sb3I6ICMxMTE4Mjc7XG4gICAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgICAgIGZvbnQtZmFtaWx5OiAtYXBwbGUtc3lzdGVtLCBCbGlua01hY1N5c3RlbUZvbnQsIFwiU2Vnb2UgVUlcIiwgc2Fucy1zZXJpZjtcbiAgICAgICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7XG4gICAgICAgIG1hcmdpbjogMDtcbiAgICAgICAgbWluLWhlaWdodDogMTAwdmg7XG4gICAgICB9XG5cbiAgICAgIG1haW4ge1xuICAgICAgICBwYWRkaW5nOiAyNHB4O1xuICAgICAgICB0ZXh0LWFsaWduOiBjZW50ZXI7XG4gICAgICB9XG5cbiAgICAgIGgxIHtcbiAgICAgICAgZm9udC1zaXplOiAyOHB4O1xuICAgICAgICBsaW5lLWhlaWdodDogMS40O1xuICAgICAgICBtYXJnaW46IDAgMCAxNnB4O1xuICAgICAgfVxuXG4gICAgICBwIHtcbiAgICAgICAgZm9udC1zaXplOiAxNnB4O1xuICAgICAgICBsaW5lLWhlaWdodDogMS44O1xuICAgICAgICBtYXJnaW46IDA7XG4gICAgICB9XG4gICAgPC9zdHlsZT5cbiAgPC9oZWFkPlxuICA8Ym9keT5cbiAgICA8bWFpbj5cbiAgICAgIDxoMT7nj77lnKjjg6Hjg7Pjg4bjg4rjg7PjgrnkuK3jgafjgZk8L2gxPlxuICAgICAgPHA+55qG5qeY44Gr44Gv44GU5LiN5L6/44KS44GK44GL44GR44GX44G+44GZ44GM44CB44Oh44Oz44OG44OK44Oz44K557WC5LqG44G+44Gn44GX44Gw44KJ44GP44GK5b6F44Gh44GP44Gg44GV44GE44CCPC9wPlxuICAgIDwvbWFpbj5cbiAgPC9ib2R5PlxuPC9odG1sPmA7XG5cbmV4cG9ydCBjb25zdCBtYWludGVuYW5jZUNvbW1hbmQ6IENvbW1hbmRNb2R1bGU8dW5rbm93biwgTWFpbnRlbmFuY2VBcmd2PiA9IHtcbiAgY29tbWFuZDogJ21haW50ZW5hbmNlIDxhY3Rpb24+JyxcbiAgZGVzY3JpYmU6ICdTdGFydCBvciBzdG9wIGEgbGlnaHR3ZWlnaHQgbWFpbnRlbmFuY2UgcGFnZSBzZXJ2ZXIuIEV4YW1wbGU6IHdiIG1haW50ZW5hbmNlIHN0YXJ0JyxcbiAgYnVpbGRlcjogKHlhcmdzOiBBcmd2PHVua25vd24+KSA9PlxuICAgIHlhcmdzXG4gICAgICAucG9zaXRpb25hbCgnYWN0aW9uJywge1xuICAgICAgICBjaG9pY2VzOiBbJ3N0YXJ0JywgJ3N0b3AnXSBhcyBjb25zdCxcbiAgICAgICAgZGVzY3JpYmU6ICdNYWludGVuYW5jZSBzZXJ2ZXIgYWN0aW9uJyxcbiAgICAgICAgdHlwZTogJ3N0cmluZycsXG4gICAgICB9KVxuICAgICAgLm9wdGlvbnMoYnVpbGRlcikgYXMgdW5rbm93biBhcyBBcmd2PE1haW50ZW5hbmNlQXJndj4sXG4gIGFzeW5jIGhhbmRsZXIoYXJndikge1xuICAgIGNvbnN0IHByb2plY3QgPSBmaW5kU2VsZlByb2plY3QoYXJndik7XG4gICAgaWYgKCFwcm9qZWN0KSB7XG4gICAgICBjb25zb2xlLmVycm9yKGNoYWxrLnJlZCgnTm8gcHJvamVjdCBmb3VuZC4nKSk7XG4gICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgfVxuXG4gICAgY29uc3QgYWN0aW9uID0gYXJndi5hY3Rpb247XG4gICAgaWYgKHByb2plY3QuZW52LldCX0VOViA9PT0gJ3Rlc3QnKSB7XG4gICAgICBjb25zb2xlLmluZm8oYFNraXAgbWFpbnRlbmFuY2UgJHthY3Rpb259IGJlY2F1c2UgV0JfRU5WIGlzIHRlc3QuYCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgcG9ydCA9IHBhcnNlUG9ydChwcm9qZWN0LmVudi5QT1JUKTtcbiAgICBpZiAoYWN0aW9uID09PSAnc3RhcnQnKSB7XG4gICAgICBhd2FpdCBzdGFydE1haW50ZW5hbmNlU2VydmVyKHByb2plY3QsIHBvcnQsIGFyZ3YuZGVsYXlNcyk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmIChhY3Rpb24gPT09ICdzdG9wJykge1xuICAgICAgYXdhaXQgc3RvcE1haW50ZW5hbmNlU2VydmVyKHByb2plY3QsIHBvcnQpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRocm93IG5ldyBFcnJvcihgVW5rbm93biBtYWludGVuYW5jZSBhY3Rpb246ICR7YWN0aW9ufWApO1xuICB9LFxufTtcblxuZnVuY3Rpb24gcGFyc2VQb3J0KHBvcnRFbnY6IHN0cmluZyB8IHVuZGVmaW5lZCk6IG51bWJlciB7XG4gIGNvbnN0IHBvcnQgPSBOdW1iZXIocG9ydEVudik7XG4gIGFzc2VydC5vayhOdW1iZXIuaXNJbnRlZ2VyKHBvcnQpICYmIHBvcnQgPiAwLCBgUE9SVCBlbnZpcm9ubWVudCB2YXJpYWJsZSBpcyBpbnZhbGlkOiAke3BvcnRFbnZ9YCk7XG4gIHJldHVybiBwb3J0O1xufVxuXG5hc3luYyBmdW5jdGlvbiBzdGFydE1haW50ZW5hbmNlU2VydmVyKHByb2plY3Q6IFByb2plY3QsIHBvcnQ6IG51bWJlciwgZGVsYXlNczogbnVtYmVyKTogUHJvbWlzZTx2b2lkPiB7XG4gIGFzc2VydC5vayhcbiAgICBOdW1iZXIuaXNGaW5pdGUoZGVsYXlNcykgJiYgZGVsYXlNcyA+PSAwICYmIGRlbGF5TXMgPD0gbWF4VGltZW91dERlbGF5TXMsXG4gICAgYGRlbGF5LW1zIG11c3QgYmUgYmV0d2VlbiAwIGFuZCAke21heFRpbWVvdXREZWxheU1zfTogJHtkZWxheU1zfWBcbiAgKTtcblxuICBjb25zdCBwaWRGaWxlUGF0aCA9IGF3YWl0IHdyaXRlTWFpbnRlbmFuY2VQaWRGaWxlKHByb2plY3QsIHBvcnQpO1xuICBjb25zdCBhYm9ydENvbnRyb2xsZXIgPSBuZXcgQWJvcnRDb250cm9sbGVyKCk7XG4gIGNvbnN0IGNsZWFudXAgPSBhc3luYyAoKTogUHJvbWlzZTx2b2lkPiA9PiB7XG4gICAgYXdhaXQgcmVtb3ZlTWFpbnRlbmFuY2VQaWRGaWxlKHBpZEZpbGVQYXRoLCBwcm9jZXNzLnBpZCk7XG4gIH07XG4gIGNvbnN0IGhhbmRsZVNpZ25hbCA9ICgpOiB2b2lkID0+IHtcbiAgICBhYm9ydENvbnRyb2xsZXIuYWJvcnQoKTtcbiAgfTtcbiAgY29uc3QgcmVtb3ZlU2lnbmFsSGFuZGxlcnMgPSAoKTogdm9pZCA9PiB7XG4gICAgcHJvY2Vzcy5vZmYoJ1NJR0lOVCcsIGhhbmRsZVNpZ25hbCk7XG4gICAgcHJvY2Vzcy5vZmYoJ1NJR1RFUk0nLCBoYW5kbGVTaWduYWwpO1xuICAgIHByb2Nlc3Mub2ZmKCdTSUdRVUlUJywgaGFuZGxlU2lnbmFsKTtcbiAgfTtcblxuICBwcm9jZXNzLm9uY2UoJ1NJR0lOVCcsIGhhbmRsZVNpZ25hbCk7XG4gIHByb2Nlc3Mub25jZSgnU0lHVEVSTScsIGhhbmRsZVNpZ25hbCk7XG4gIHByb2Nlc3Mub25jZSgnU0lHUVVJVCcsIGhhbmRsZVNpZ25hbCk7XG5cbiAgdHJ5IHtcbiAgICBhd2FpdCBzZXRUaW1lb3V0KGRlbGF5TXMsIHVuZGVmaW5lZCwgeyBzaWduYWw6IGFib3J0Q29udHJvbGxlci5zaWduYWwgfSk7XG4gICAgcmVtb3ZlU2lnbmFsSGFuZGxlcnMoKTtcbiAgICBjb25zdCBzZXJ2ZXIgPSBhd2FpdCBjcmVhdGVBbmRMaXN0ZW5NYWludGVuYW5jZVNlcnZlcihwb3J0KTtcbiAgICBpZiAoIXNlcnZlcikgcmV0dXJuO1xuXG4gICAgY29uc29sZS5pbmZvKGBTdGFydGVkIG1haW50ZW5hbmNlIHNlcnZlciBvbiBwb3J0ICR7cG9ydH0uYCk7XG4gICAgYXdhaXQgd2FpdEZvclNodXRkb3duKHNlcnZlcik7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgaWYgKGVycm9yIGluc3RhbmNlb2YgRXJyb3IgJiYgZXJyb3IubmFtZSA9PT0gJ0Fib3J0RXJyb3InKSByZXR1cm47XG5cbiAgICB0aHJvdyBlcnJvcjtcbiAgfSBmaW5hbGx5IHtcbiAgICByZW1vdmVTaWduYWxIYW5kbGVycygpO1xuICAgIGF3YWl0IGNsZWFudXAoKTtcbiAgfVxufVxuXG5hc3luYyBmdW5jdGlvbiBjcmVhdGVBbmRMaXN0ZW5NYWludGVuYW5jZVNlcnZlcihwb3J0OiBudW1iZXIpOiBQcm9taXNlPGh0dHAuU2VydmVyIHwgdW5kZWZpbmVkPiB7XG4gIGZvciAobGV0IGF0dGVtcHQgPSAxOyBhdHRlbXB0IDw9IG1haW50ZW5hbmNlTGlzdGVuTWF4QXR0ZW1wdHM7IGF0dGVtcHQrKykge1xuICAgIGNvbnN0IHNlcnZlciA9IGNyZWF0ZU1haW50ZW5hbmNlU2VydmVyKCk7XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IGxpc3Rlbk1haW50ZW5hbmNlU2VydmVyKHNlcnZlciwgcG9ydCwgaGFuZGxlUnVudGltZU1haW50ZW5hbmNlU2VydmVyRXJyb3IpO1xuICAgICAgcmV0dXJuIHNlcnZlcjtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgYXdhaXQgY2xvc2VNYWludGVuYW5jZVNlcnZlcihzZXJ2ZXIpO1xuICAgICAgY29uc3QgZXJyID0gZXJyb3IgYXMgTm9kZUpTLkVycm5vRXhjZXB0aW9uO1xuICAgICAgaWYgKGVyci5jb2RlID09PSAnRUFERFJJTlVTRScgJiYgYXR0ZW1wdCA8IG1haW50ZW5hbmNlTGlzdGVuTWF4QXR0ZW1wdHMpIHtcbiAgICAgICAgYXdhaXQgc2V0VGltZW91dChtYWludGVuYW5jZUxpc3RlblJldHJ5RGVsYXlNcyk7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgaWYgKGVyci5jb2RlID09PSAnRUFERFJJTlVTRScpIHtcbiAgICAgICAgY29uc29sZS5pbmZvKGBTa2lwIG1haW50ZW5hbmNlIHNlcnZlciBiZWNhdXNlIHBvcnQgJHtwb3J0fSBpcyBhbHJlYWR5IGluIHVzZS5gKTtcbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgIH1cbiAgICAgIGhhbmRsZU1haW50ZW5hbmNlU3RhcnR1cEVycm9yKHBvcnQsIGVycik7XG4gICAgfVxuICB9XG5cbiAgdGhyb3cgbmV3IEVycm9yKCdVbnJlYWNoYWJsZSBtYWludGVuYW5jZSBzZXJ2ZXIgc3RhcnR1cCBzdGF0ZS4nKTtcbn1cblxuZnVuY3Rpb24gaGFuZGxlTWFpbnRlbmFuY2VTdGFydHVwRXJyb3IocG9ydDogbnVtYmVyLCBlcnJvcjogTm9kZUpTLkVycm5vRXhjZXB0aW9uKTogbmV2ZXIge1xuICBpZiAoZXJyb3IuY29kZSA9PT0gJ0VBRERSSU5VU0UnKSB7XG4gICAgY29uc29sZS5lcnJvcihjaGFsay5yZWQoYFBvcnQgJHtwb3J0fSBpcyBhbHJlYWR5IGluIHVzZS5gKSk7XG4gIH0gZWxzZSB7XG4gICAgY29uc29sZS5lcnJvcihjaGFsay5yZWQoYE1haW50ZW5hbmNlIHNlcnZlciBlcnJvcjogJHtlcnJvci5tZXNzYWdlfWApKTtcbiAgfVxuICBwcm9jZXNzLmV4aXQoMSk7XG59XG5cbmZ1bmN0aW9uIGhhbmRsZVJ1bnRpbWVNYWludGVuYW5jZVNlcnZlckVycm9yKGVycm9yOiBFcnJvcik6IHZvaWQge1xuICBjb25zb2xlLmVycm9yKGNoYWxrLnJlZChgTWFpbnRlbmFuY2Ugc2VydmVyIGVycm9yOiAke2Vycm9yLm1lc3NhZ2V9YCkpO1xuICBwcm9jZXNzLmV4aXQoMSk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHN0b3BNYWludGVuYW5jZVNlcnZlcihwcm9qZWN0OiBQcm9qZWN0LCBwb3J0OiBudW1iZXIpOiBQcm9taXNlPHZvaWQ+IHtcbiAgYXdhaXQga2lsbE1haW50ZW5hbmNlUHJvY2Vzcyhwcm9qZWN0LCBwb3J0KTtcbiAgYXdhaXQga2lsbFBvcnRDb250YWluZXJBbmRQcm9jZXNzKHBvcnQsIHByb2plY3QpO1xuICBjb25zb2xlLmluZm8oYFN0b3BwZWQgbWFpbnRlbmFuY2Ugc2VydmVyIG9uIHBvcnQgJHtwb3J0fS5gKTtcbn1cblxuZnVuY3Rpb24gY3JlYXRlTWFpbnRlbmFuY2VTZXJ2ZXIoKTogaHR0cC5TZXJ2ZXIge1xuICByZXR1cm4gaHR0cC5jcmVhdGVTZXJ2ZXIoKF9yZXF1ZXN0LCByZXNwb25zZSkgPT4ge1xuICAgIHJlc3BvbnNlLndyaXRlSGVhZCg1MDMsIHtcbiAgICAgICdjYWNoZS1jb250cm9sJzogJ25vLXN0b3JlJyxcbiAgICAgICdjb250ZW50LXR5cGUnOiAndGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04JyxcbiAgICB9KTtcbiAgICByZXNwb25zZS5lbmQobWFpbnRlbmFuY2VIdG1sKTtcbiAgfSk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGxpc3Rlbk1haW50ZW5hbmNlU2VydmVyKFxuICBzZXJ2ZXI6IGh0dHAuU2VydmVyLFxuICBwb3J0OiBudW1iZXIsXG4gIG9uUnVudGltZUVycm9yOiAoZXJyb3I6IEVycm9yKSA9PiB2b2lkXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgYXdhaXQgbmV3IFByb21pc2U8dm9pZD4oKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgIGNvbnN0IG9uU3RhcnR1cEVycm9yID0gKGVycm9yOiBFcnJvcik6IHZvaWQgPT4ge1xuICAgICAgc2VydmVyLm9mZignbGlzdGVuaW5nJywgb25MaXN0ZW5pbmcpO1xuICAgICAgcmVqZWN0KGVycm9yKTtcbiAgICB9O1xuICAgIGNvbnN0IG9uTGlzdGVuaW5nID0gKCk6IHZvaWQgPT4ge1xuICAgICAgc2VydmVyLm9mZignZXJyb3InLCBvblN0YXJ0dXBFcnJvcik7XG4gICAgICBzZXJ2ZXIub24oJ2Vycm9yJywgb25SdW50aW1lRXJyb3IpO1xuICAgICAgcmVzb2x2ZSgpO1xuICAgIH07XG4gICAgc2VydmVyLm9uY2UoJ2Vycm9yJywgb25TdGFydHVwRXJyb3IpO1xuICAgIHNlcnZlci5vbmNlKCdsaXN0ZW5pbmcnLCBvbkxpc3RlbmluZyk7XG4gICAgc2VydmVyLmxpc3Rlbihwb3J0LCAnMC4wLjAuMCcpO1xuICB9KTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gd2FpdEZvclNodXRkb3duKHNlcnZlcjogaHR0cC5TZXJ2ZXIpOiBQcm9taXNlPHZvaWQ+IHtcbiAgYXdhaXQgbmV3IFByb21pc2U8dm9pZD4oKHJlc29sdmUpID0+IHtcbiAgICBjb25zdCBzaHV0ZG93biA9ICgpOiB2b2lkID0+IHtcbiAgICAgIHByb2Nlc3Mub2ZmKCdTSUdJTlQnLCBzaHV0ZG93bik7XG4gICAgICBwcm9jZXNzLm9mZignU0lHVEVSTScsIHNodXRkb3duKTtcbiAgICAgIHByb2Nlc3Mub2ZmKCdTSUdRVUlUJywgc2h1dGRvd24pO1xuICAgICAgdm9pZCAoYXN5bmMgKCkgPT4ge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGF3YWl0IGNsb3NlTWFpbnRlbmFuY2VTZXJ2ZXIoc2VydmVyKTtcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKGNoYWxrLnJlZChgRmFpbGVkIHRvIGNsb3NlIG1haW50ZW5hbmNlIHNlcnZlcjogJHsoZXJyb3IgYXMgRXJyb3IpLm1lc3NhZ2V9YCkpO1xuICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgIHJlc29sdmUoKTtcbiAgICAgICAgfVxuICAgICAgfSkoKTtcbiAgICB9O1xuICAgIHByb2Nlc3Mub25jZSgnU0lHSU5UJywgc2h1dGRvd24pO1xuICAgIHByb2Nlc3Mub25jZSgnU0lHVEVSTScsIHNodXRkb3duKTtcbiAgICBwcm9jZXNzLm9uY2UoJ1NJR1FVSVQnLCBzaHV0ZG93bik7XG4gIH0pO1xufVxuXG5hc3luYyBmdW5jdGlvbiBjbG9zZU1haW50ZW5hbmNlU2VydmVyKHNlcnZlcjogaHR0cC5TZXJ2ZXIpOiBQcm9taXNlPHZvaWQ+IHtcbiAgYXdhaXQgbmV3IFByb21pc2U8dm9pZD4oKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgIHNlcnZlci5jbG9zZSgoZXJyb3IpID0+IHtcbiAgICAgIGlmIChlcnJvcikge1xuICAgICAgICBpZiAoKGVycm9yIGFzIE5vZGVKUy5FcnJub0V4Y2VwdGlvbikuY29kZSA9PT0gJ0VSUl9TRVJWRVJfTk9UX1JVTk5JTkcnKSB7XG4gICAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICByZWplY3QoZXJyb3IpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICByZXNvbHZlKCk7XG4gICAgfSk7XG4gICAgc2VydmVyLmNsb3NlQWxsQ29ubmVjdGlvbnMoKTtcbiAgfSk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHdyaXRlTWFpbnRlbmFuY2VQaWRGaWxlKHByb2plY3Q6IFByb2plY3QsIHBvcnQ6IG51bWJlcik6IFByb21pc2U8c3RyaW5nPiB7XG4gIGNvbnN0IHBpZEZpbGVQYXRoID0gbWFpbnRlbmFuY2VQaWRGaWxlUGF0aChwcm9qZWN0LCBwb3J0KTtcbiAgYXdhaXQgZnMubWtkaXIocGF0aC5kaXJuYW1lKHBpZEZpbGVQYXRoKSwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gIGF3YWl0IGZzLndyaXRlRmlsZShwaWRGaWxlUGF0aCwgYCR7cHJvY2Vzcy5waWR9XFxuYCwgJ3V0ZjgnKTtcbiAgcmV0dXJuIHBpZEZpbGVQYXRoO1xufVxuXG5hc3luYyBmdW5jdGlvbiBraWxsTWFpbnRlbmFuY2VQcm9jZXNzKHByb2plY3Q6IFByb2plY3QsIHBvcnQ6IG51bWJlcik6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBwaWRGaWxlUGF0aCA9IG1haW50ZW5hbmNlUGlkRmlsZVBhdGgocHJvamVjdCwgcG9ydCk7XG4gIGNvbnN0IHBpZCA9IGF3YWl0IHJlYWRNYWludGVuYW5jZVBpZEZpbGUocGlkRmlsZVBhdGgpO1xuICBpZiAocGlkICE9PSB1bmRlZmluZWQgJiYgcGlkICE9PSBwcm9jZXNzLnBpZCkge1xuICAgIHRyeSB7XG4gICAgICB0cmVlS2lsbChwaWQsICdTSUdURVJNJyk7XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBkbyBub3RoaW5nXG4gICAgfVxuICAgIGF3YWl0IHJlbW92ZVN0YWxlUHJvY2VzcyhwaWQpO1xuICB9XG4gIGF3YWl0IHJlbW92ZU1haW50ZW5hbmNlUGlkRmlsZShwaWRGaWxlUGF0aCwgcGlkKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gcmVtb3ZlTWFpbnRlbmFuY2VQaWRGaWxlKHBpZEZpbGVQYXRoOiBzdHJpbmcsIGV4cGVjdGVkUGlkPzogbnVtYmVyKTogUHJvbWlzZTx2b2lkPiB7XG4gIGlmIChleHBlY3RlZFBpZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgY29uc3QgcGlkID0gYXdhaXQgcmVhZE1haW50ZW5hbmNlUGlkRmlsZShwaWRGaWxlUGF0aCk7XG4gICAgaWYgKHBpZCAhPT0gZXhwZWN0ZWRQaWQpIHJldHVybjtcbiAgfVxuICBhd2FpdCBmcy5ybShwaWRGaWxlUGF0aCwgeyBmb3JjZTogdHJ1ZSB9KTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gcmVhZE1haW50ZW5hbmNlUGlkRmlsZShwaWRGaWxlUGF0aDogc3RyaW5nKTogUHJvbWlzZTxudW1iZXIgfCB1bmRlZmluZWQ+IHtcbiAgdHJ5IHtcbiAgICBjb25zdCBwaWRUZXh0ID0gYXdhaXQgZnMucmVhZEZpbGUocGlkRmlsZVBhdGgsICd1dGY4Jyk7XG4gICAgY29uc3QgcGlkID0gTnVtYmVyKHBpZFRleHQudHJpbSgpKTtcbiAgICByZXR1cm4gTnVtYmVyLmlzSW50ZWdlcihwaWQpICYmIHBpZCA+IDAgPyBwaWQgOiB1bmRlZmluZWQ7XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cbn1cblxuZnVuY3Rpb24gbWFpbnRlbmFuY2VQaWRGaWxlUGF0aChwcm9qZWN0OiBQcm9qZWN0LCBwb3J0OiBudW1iZXIpOiBzdHJpbmcge1xuICByZXR1cm4gZ2V0TWFpbnRlbmFuY2VQaWRGaWxlUGF0aChwcm9qZWN0LnJvb3REaXJQYXRoLCBwb3J0KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldE1haW50ZW5hbmNlUGlkRmlsZVBhdGgocm9vdERpclBhdGg6IHN0cmluZywgcG9ydDogbnVtYmVyKTogc3RyaW5nIHtcbiAgcmV0dXJuIHBhdGguam9pbihyb290RGlyUGF0aCwgbWFpbnRlbmFuY2VQaWREaXJlY3RvcnlOYW1lLCBgbWFpbnRlbmFuY2UtJHtwb3J0fS5waWRgKTtcbn1cbiIsImltcG9ydCBjaGlsZF9wcm9jZXNzIGZyb20gJ25vZGU6Y2hpbGRfcHJvY2Vzcyc7XG5pbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgb3MgZnJvbSAnbm9kZTpvcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG4vKipcbiAqIE1hdGVyaWFsaXphdGlvbiBvZiBgQHdpbGxib29zdGVyLXByaXZhdGUvKmAgcmVnaXN0cnkgKFZlcmRhY2NpbykgZGVwZW5kZW5jaWVzIGZvciBEb2NrZXIgYnVpbGRzOlxuICogdGhlIHBhY2thZ2VzIGFyZSBkb3dubG9hZGVkIG9uIHRoZSBob3N0IChhdXRoIHZpYSAubnBtcmMgLyB+Ly5ucG1yYyBsb2NhbGx5LCBvciBWRVJEQUNDSU9fVE9LRU5cbiAqIG9uIENJKSBhbmQgZXh0cmFjdGVkIG5leHQgdG8gdGhlIHJlcG9zaXRvcnkgc28gaW1hZ2UgYnVpbGRzIG5lZWQgbm8gcmVnaXN0cnkgY3JlZGVudGlhbHNcbiAqIChodHRwczovL2dpdGh1Yi5jb20vV2lsbEJvb3N0ZXIvc2hhcmVkL2lzc3Vlcy85NjQpLlxuICovXG5leHBvcnQgY29uc3QgUFJJVkFURV9SRUdJU1RSWV9TQ09QRSA9ICdAd2lsbGJvb3N0ZXItcHJpdmF0ZSc7XG5cbi8vIGBnaXQ6YC9gZ2l0K2AvYGdpdEBgIChub3QgdGhlIGJhcmUgd29yZCBgZ2l0YCk6IG5wbSBhbGxvd3MgYXJiaXRyYXJ5IGRpc3QtdGFncywgc28gYSB0YWcgbmFtZWRcbi8vIGBnaXRgIG9yIGBnaXQtbmV4dGAgbXVzdCBzdGlsbCBiZSB0cmVhdGVkIGFzIGEgcmVnaXN0cnkgc3BlY2lmaWVyLlxuY29uc3Qgbm9uUmVnaXN0cnlTcGVjaWZpZXJQcmVmaXhlcyA9IFtcbiAgJ2dpdDonLFxuICAnZ2l0KycsXG4gICdnaXRAJyxcbiAgJ2ZpbGU6JyxcbiAgJ2xpbms6JyxcbiAgJ3dvcmtzcGFjZTonLFxuICAnaHR0cDonLFxuICAnaHR0cHM6JyxcbiAgJ3BvcnRhbDonLFxuICAncGF0Y2g6Jyxcbl07XG5cbi8vIFRoZSBzaW5nbGUgc291cmNlIG9mIHRydXRoIGZvciB3aGljaCBnaXQgc3BlY2lmaWVycyB0aGUgcHJpdmF0ZS1wYWNrYWdlIHRvb2xpbmcgc3VwcG9ydHM6XG4vLyBgd2Igc2V0dXAtcHJpdmF0ZS1wYWNrYWdlc2AgbWF0ZXJpYWxpemVzIGV4YWN0bHkgdGhlc2UsIGFuZCBgd2Igb3B0aW1pemVGb3JEb2NrZXJCdWlsZGAgbXVzdFxuLy8gcmV3cml0ZSBleGFjdGx5IHRoZXNlIChyZXdyaXRpbmcgb3RoZXIgb3JncycgU1NIIFVSTHMgd291bGQgcG9pbnQgYXQgbmV2ZXItbWF0ZXJpYWxpemVkIHBhdGhzKS5cbmNvbnN0IHByaXZhdGVHaXREZXBlbmRlbmN5UGF0dGVybiA9IC9eZ2l0QGdpdGh1YlxcLmNvbTooPzpXaWxsQm9vc3RlcnxXaWxsQm9vc3RlckxhYilcXC9bXi8jXSsoPzpcXC5naXQpPyg/OiMuKik/JC87XG5cbi8vIFJldHVybnMgYm9vbGVhbiAobm90IGEgYHZhbHVlIGlzIHN0cmluZ2AgcHJlZGljYXRlKTogYSBwcmVkaWNhdGUgd291bGQgbmFycm93IHRoZSBuZWdhdGl2ZVxuLy8gYnJhbmNoIHRvIGB1bmRlZmluZWRgIGFuZCBicmVhayBgZWxzZSBpZmAgY2hhaW5zIG92ZXIgYHN0cmluZyB8IHVuZGVmaW5lZGAgZGVwZW5kZW5jeSB2YWx1ZXMuXG5leHBvcnQgZnVuY3Rpb24gaXNQcml2YXRlR2l0RGVwZW5kZW5jeSh2YWx1ZTogdW5rbm93bik6IGJvb2xlYW4ge1xuICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJyAmJiBwcml2YXRlR2l0RGVwZW5kZW5jeVBhdHRlcm4udGVzdCh2YWx1ZSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc1ByaXZhdGVSZWdpc3RyeURlcGVuZGVuY3kobmFtZTogc3RyaW5nLCB2YWx1ZTogdW5rbm93bik6IHZhbHVlIGlzIHN0cmluZyB7XG4gIHJldHVybiAoXG4gICAgbmFtZS5zdGFydHNXaXRoKGAke1BSSVZBVEVfUkVHSVNUUllfU0NPUEV9L2ApICYmXG4gICAgdHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJyAmJlxuICAgICFub25SZWdpc3RyeVNwZWNpZmllclByZWZpeGVzLnNvbWUoKHByZWZpeCkgPT4gdmFsdWUuc3RhcnRzV2l0aChwcmVmaXgpKVxuICApO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFByaXZhdGVSZWdpc3RyeUF1dGgge1xuICByZWdpc3RyeVVybDogc3RyaW5nO1xuICBhdXRoVG9rZW46IHN0cmluZyB8IHVuZGVmaW5lZDtcbn1cblxuLyoqXG4gKiBSZXNvbHZlIHRoZSByZWdpc3RyeSBVUkwgYW5kIGF1dGggdG9rZW4gZm9yIHRoZSBwcml2YXRlIHNjb3BlIGZyb20gdGhlIHByb2plY3QncyAubnBtcmMgYW5kXG4gKiB+Ly5ucG1yYyAobmVhcmVyIGZpbGUgd2lucyksIGV4cGFuZGluZyBgJHtWQVJ9YCByZWZlcmVuY2VzIGZyb20gdGhlIGVudmlyb25tZW50LiBPbiBDSSB0aGVcbiAqIFZFUkRBQ0NJT19UT0tFTiBlbnZpcm9ubWVudCB2YXJpYWJsZSBzZXJ2ZXMgYXMgdGhlIGZhbGxiYWNrIHRva2VuLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVzb2x2ZVByaXZhdGVSZWdpc3RyeUF1dGgocm9vdERpclBhdGg6IHN0cmluZyk6IFByaXZhdGVSZWdpc3RyeUF1dGggfCB1bmRlZmluZWQge1xuICBjb25zdCBlbnRyaWVzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge307XG4gIC8vIFJldmVyc2Ugb3JkZXIgc28gbmVhcmVyIGZpbGVzIG92ZXJ3cml0ZSB0aGUgaG9tZS1kaXJlY3RvcnkgZGVmYXVsdHMuXG4gIGZvciAoY29uc3QgbnBtcmNQYXRoIG9mIFtwYXRoLmpvaW4ob3MuaG9tZWRpcigpLCAnLm5wbXJjJyksIHBhdGguam9pbihyb290RGlyUGF0aCwgJy5ucG1yYycpXSkge1xuICAgIHRyeSB7XG4gICAgICBPYmplY3QuYXNzaWduKGVudHJpZXMsIHBhcnNlTnBtcmMoZnMucmVhZEZpbGVTeW5jKG5wbXJjUGF0aCwgJ3V0ZjgnKSkpO1xuICAgIH0gY2F0Y2gge1xuICAgICAgLy8gTWlzc2luZyBucG1yYyBmaWxlcyBhcmUgZmluZTsgdGhlIG90aGVyIGZpbGUgb3IgVkVSREFDQ0lPX1RPS0VOIG1heSBzdGlsbCBwcm92aWRlIGF1dGguXG4gICAgfVxuICB9XG5cbiAgY29uc3QgcmVnaXN0cnlVcmwgPSBlbnRyaWVzW2Ake1BSSVZBVEVfUkVHSVNUUllfU0NPUEV9OnJlZ2lzdHJ5YF0/LnJlcGxhY2UoL1xcLyskLywgJycpO1xuICBpZiAoIXJlZ2lzdHJ5VXJsKSByZXR1cm47XG5cbiAgLy8gbnBtLXN0eWxlIFVSSSBtYXRjaGluZzogbm9ybWFsaXplIGJvdGggc2lkZXMgdG8gYSB0cmFpbGluZyBzbGFzaCBzbyBhIHRva2VuIGZvclxuICAvLyBgLy92ZXJkYWNjaW8uZXhhbXBsZS5jb20vYCBjYW4gbmV2ZXIgbWF0Y2ggYC8vdmVyZGFjY2lvLmV4YW1wbGUuY29tLW90aGVyLm9yZy9gLCBhbmQgcGljayB0aGVcbiAgLy8gTU9TVCBTUEVDSUZJQyAobG9uZ2VzdCkgbWF0Y2hpbmcgcHJlZml4IHNvIGAvL2hvc3QvcHJpdmF0ZS9gIGJlYXRzIGAvL2hvc3QvYC5cbiAgY29uc3Qgbm9ybWFsaXplZFJlZ2lzdHJ5VXJsID0gYCR7cmVnaXN0cnlVcmwucmVwbGFjZSgvXmh0dHBzPzovLCAnJykucmVwbGFjZSgvXFwvKyQvLCAnJyl9L2A7XG4gIGxldCBtYXRjaGVkVG9rZW46IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgbGV0IG1hdGNoZWRQcmVmaXhMZW5ndGggPSAtMTtcbiAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMoZW50cmllcykpIHtcbiAgICAvLyBTa2lwIGVtcHR5IHRva2VucyAoYW4gdW5zZXQgYCR7VkFSfWAgZXhwYW5kcyB0byAnJyk6IGFuIGVtcHR5IG1hdGNoIG11c3Qgbm90IGRlZmVhdCB0aGVcbiAgICAvLyBWRVJEQUNDSU9fVE9LRU4gZmFsbGJhY2sgYmVsb3cuXG4gICAgaWYgKCFrZXkuZW5kc1dpdGgoJzpfYXV0aFRva2VuJykgfHwgIXZhbHVlKSBjb250aW51ZTtcbiAgICBjb25zdCBwcmVmaXggPSBgJHtrZXkuc2xpY2UoMCwgLSc6X2F1dGhUb2tlbicubGVuZ3RoKS5yZXBsYWNlKC9cXC8rJC8sICcnKX0vYDtcbiAgICBpZiAobm9ybWFsaXplZFJlZ2lzdHJ5VXJsLnN0YXJ0c1dpdGgocHJlZml4KSAmJiBwcmVmaXgubGVuZ3RoID4gbWF0Y2hlZFByZWZpeExlbmd0aCkge1xuICAgICAgbWF0Y2hlZFByZWZpeExlbmd0aCA9IHByZWZpeC5sZW5ndGg7XG4gICAgICBtYXRjaGVkVG9rZW4gPSB2YWx1ZTtcbiAgICB9XG4gIH1cbiAgLy8gTm8gUHJvamVjdCBpbnN0YW5jZSBleGlzdHMgYXQgdGhpcyBsYXllciwgc28gcHJvY2Vzcy5lbnYgaXMgdGhlIG9ubHkgc291cmNlIGZvciB0aGVcbiAgLy8gQ0ktaW5qZWN0ZWQgZmFsbGJhY2sgdG9rZW4uXG4gIGNvbnN0IGF1dGhUb2tlbiA9IG1hdGNoZWRUb2tlbiA/PyBwcm9jZXNzLmVudi5WRVJEQUNDSU9fVE9LRU47XG4gIHJldHVybiB7IHJlZ2lzdHJ5VXJsLCBhdXRoVG9rZW4gfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlTnBtcmMoY29udGVudDogc3RyaW5nKTogUmVjb3JkPHN0cmluZywgc3RyaW5nPiB7XG4gIGNvbnN0IGVudHJpZXM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7fTtcbiAgZm9yIChjb25zdCByYXdMaW5lIG9mIGNvbnRlbnQuc3BsaXQoJ1xcbicpKSB7XG4gICAgY29uc3QgbGluZSA9IHJhd0xpbmUudHJpbSgpO1xuICAgIGlmICghbGluZSB8fCBsaW5lLnN0YXJ0c1dpdGgoJyMnKSB8fCBsaW5lLnN0YXJ0c1dpdGgoJzsnKSkgY29udGludWU7XG5cbiAgICBjb25zdCBzZXBhcmF0b3JJbmRleCA9IGxpbmUuaW5kZXhPZignPScpO1xuICAgIGlmIChzZXBhcmF0b3JJbmRleCA8PSAwKSBjb250aW51ZTtcblxuICAgIGNvbnN0IGtleSA9IGxpbmUuc2xpY2UoMCwgc2VwYXJhdG9ySW5kZXgpLnRyaW0oKTtcbiAgICBjb25zdCB2YWx1ZSA9IGxpbmVcbiAgICAgIC5zbGljZShzZXBhcmF0b3JJbmRleCArIDEpXG4gICAgICAudHJpbSgpXG4gICAgICAucmVwbGFjZUFsbCgvXFwkXFx7KFtefV0rKVxcfS9nLCAoXywgdmFyaWFibGVOYW1lOiBzdHJpbmcpID0+IHByb2Nlc3MuZW52W3ZhcmlhYmxlTmFtZV0gPz8gJycpO1xuICAgIGVudHJpZXNba2V5XSA9IHZhbHVlO1xuICB9XG4gIHJldHVybiBlbnRyaWVzO1xufVxuXG4vKipcbiAqIERvd25sb2FkIGFuZCBleHRyYWN0IG9uZSByZWdpc3RyeSBwYWNrYWdlIGludG8gYHRhcmdldERpclBhdGhgLiBUaGUgdmVyc2lvbiBtdXN0IGJlIGFuIGV4YWN0XG4gKiBzZW12ZXIgKHRoZSBvcmcgcGlucyBleGFjdCB2ZXJzaW9ucyB2aWEgYnVuZmlnIGBleGFjdCA9IHRydWVgKTsgYGxhdGVzdGAgYW5kIHNpbXBsZSBgXmAvYH5gXG4gKiByYW5nZXMgZGVncmFkZSB0byB0aGUgcmFuZ2UncyBiYXNlIHZlcnNpb24gb3IgdGhlIHJlZ2lzdHJ5J3MgbGF0ZXN0IGRpc3QtdGFnLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZG93bmxvYWRBbmRFeHRyYWN0UmVnaXN0cnlQYWNrYWdlKFxuICBhdXRoOiBQcml2YXRlUmVnaXN0cnlBdXRoLFxuICBwYWNrYWdlTmFtZTogc3RyaW5nLFxuICB2ZXJzaW9uU3BlY2lmaWVyOiBzdHJpbmcsXG4gIHRhcmdldERpclBhdGg6IHN0cmluZ1xuKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IHZlcnNpb24gPSBhd2FpdCByZXNvbHZlVmVyc2lvbihhdXRoLCBwYWNrYWdlTmFtZSwgdmVyc2lvblNwZWNpZmllcik7XG4gIGNvbnN0IG1ldGFkYXRhID0gYXdhaXQgZmV0Y2hSZWdpc3RyeUpzb248eyBkaXN0PzogeyB0YXJiYWxsPzogc3RyaW5nIH0gfT4oXG4gICAgYXV0aCxcbiAgICBgJHthdXRoLnJlZ2lzdHJ5VXJsfS8ke2VuY29kZVBhY2thZ2VOYW1lKHBhY2thZ2VOYW1lKX0vJHt2ZXJzaW9ufWBcbiAgKTtcbiAgY29uc3QgdGFyYmFsbFVybCA9IG1ldGFkYXRhLmRpc3Q/LnRhcmJhbGw7XG4gIGlmICghdGFyYmFsbFVybCkge1xuICAgIHRocm93IG5ldyBFcnJvcihgTm8gdGFyYmFsbCBVUkwgZm9yICR7cGFja2FnZU5hbWV9QCR7dmVyc2lvbn0gaW4gJHthdXRoLnJlZ2lzdHJ5VXJsfS5gKTtcbiAgfVxuXG4gIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2hGcm9tUmVnaXN0cnkoYXV0aCwgdGFyYmFsbFVybCk7XG4gIGNvbnN0IHRhcmJhbGxQYXRoID0gcGF0aC5qb2luKFxuICAgIGF3YWl0IGZzLnByb21pc2VzLm1rZHRlbXAocGF0aC5qb2luKG9zLnRtcGRpcigpLCAnd2ItcHJpdmF0ZS1wYWNrYWdlLScpKSxcbiAgICAncGFja2FnZS50Z3onXG4gICk7XG4gIHRyeSB7XG4gICAgYXdhaXQgZnMucHJvbWlzZXMud3JpdGVGaWxlKHRhcmJhbGxQYXRoLCBCdWZmZXIuZnJvbShhd2FpdCByZXNwb25zZS5hcnJheUJ1ZmZlcigpKSk7XG4gICAgYXdhaXQgZnMucHJvbWlzZXMucm0odGFyZ2V0RGlyUGF0aCwgeyBmb3JjZTogdHJ1ZSwgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICAgIGF3YWl0IGZzLnByb21pc2VzLm1rZGlyKHRhcmdldERpclBhdGgsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICAgIC8vIG5wbSB0YXJiYWxscyBwbGFjZSB0aGUgY29udGVudCB1bmRlciBhIHRvcC1sZXZlbCBgcGFja2FnZS9gIGRpcmVjdG9yeS5cbiAgICBjb25zdCByZXQgPSBjaGlsZF9wcm9jZXNzLnNwYXduU3luYygndGFyJywgWycteHpmJywgdGFyYmFsbFBhdGgsICctQycsIHRhcmdldERpclBhdGgsICctLXN0cmlwLWNvbXBvbmVudHM9MSddLCB7XG4gICAgICBzdGRpbzogJ2luaGVyaXQnLFxuICAgIH0pO1xuICAgIGlmIChyZXQuc3RhdHVzICE9PSAwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEZhaWxlZCB0byBleHRyYWN0ICR7cGFja2FnZU5hbWV9QCR7dmVyc2lvbn0gKCR7dGFyYmFsbFVybH0pLmApO1xuICAgIH1cbiAgfSBmaW5hbGx5IHtcbiAgICBhd2FpdCBmcy5wcm9taXNlcy5ybShwYXRoLmRpcm5hbWUodGFyYmFsbFBhdGgpLCB7IGZvcmNlOiB0cnVlLCByZWN1cnNpdmU6IHRydWUgfSk7XG4gIH1cbn1cblxuYXN5bmMgZnVuY3Rpb24gcmVzb2x2ZVZlcnNpb24oXG4gIGF1dGg6IFByaXZhdGVSZWdpc3RyeUF1dGgsXG4gIHBhY2thZ2VOYW1lOiBzdHJpbmcsXG4gIHZlcnNpb25TcGVjaWZpZXI6IHN0cmluZ1xuKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgLy8gUHJlcmVsZWFzZSBhbmQgYCtidWlsZGAgbWV0YWRhdGEgYXJlIGJvdGggcGFydCBvZiB2YWxpZCBleGFjdCBTZW1WZXIgdmVyc2lvbnMuXG4gIC8vIHRvQmFzZVZlcnNpb24gYXBwbGllcyB0aGUgc2hhcmVkIGFuY2hvcmVkIFNlbVZlciBjbGFzc2lmaWNhdGlvbjogYW4gZXhhY3QgdmVyc2lvbiByZXNvbHZlcyB0b1xuICAvLyBpdHNlbGYgYW5kIGEgc2ltcGxlIGBeYC9gfmAgcmFuZ2UgZGVncmFkZXMgdG8gaXRzIGJhc2UgdmVyc2lvbiAob3JnIHJlcG9zIHBpbiBleGFjdCB2ZXJzaW9ucyxcbiAgLy8gc28gdGhlIHJhbmdlIHBhdGggaXMgYSBiZXN0LWVmZm9ydCBmYWxsYmFjayk7IGFueXRoaW5nIGVsc2UgcmVzb2x2ZXMgYXMgYSBkaXN0LXRhZyBiZWxvdy5cbiAgY29uc3QgZXhhY3RWZXJzaW9uID0gdG9CYXNlVmVyc2lvbih2ZXJzaW9uU3BlY2lmaWVyKTtcbiAgaWYgKGV4YWN0VmVyc2lvbikgcmV0dXJuIGV4YWN0VmVyc2lvbjtcblxuICBjb25zdCBwYWNrdW1lbnQgPSBhd2FpdCBmZXRjaFJlZ2lzdHJ5SnNvbjx7ICdkaXN0LXRhZ3MnPzogUmVjb3JkPHN0cmluZywgc3RyaW5nPiB9PihcbiAgICBhdXRoLFxuICAgIGAke2F1dGgucmVnaXN0cnlVcmx9LyR7ZW5jb2RlUGFja2FnZU5hbWUocGFja2FnZU5hbWUpfWBcbiAgKTtcbiAgY29uc3QgZGlzdFRhZyA9IHBhY2t1bWVudFsnZGlzdC10YWdzJ10/Llt2ZXJzaW9uU3BlY2lmaWVyID09PSAnKicgPyAnbGF0ZXN0JyA6IHZlcnNpb25TcGVjaWZpZXJdO1xuICBpZiAoIWRpc3RUYWcpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICBgQ2Fubm90IHJlc29sdmUgJHtwYWNrYWdlTmFtZX1AJHt2ZXJzaW9uU3BlY2lmaWVyfTsgdXNlIGFuIGV4YWN0IHZlcnNpb24sIGEgXi9+IHJhbmdlLCBvciBhIGRpc3QtdGFnLmBcbiAgICApO1xuICB9XG4gIHJldHVybiBkaXN0VGFnO1xufVxuXG5hc3luYyBmdW5jdGlvbiBmZXRjaFJlZ2lzdHJ5SnNvbjxUPihhdXRoOiBQcml2YXRlUmVnaXN0cnlBdXRoLCB1cmw6IHN0cmluZyk6IFByb21pc2U8VD4ge1xuICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoRnJvbVJlZ2lzdHJ5KGF1dGgsIHVybCk7XG4gIHJldHVybiAoYXdhaXQgcmVzcG9uc2UuanNvbigpKSBhcyBUO1xufVxuXG5hc3luYyBmdW5jdGlvbiBmZXRjaEZyb21SZWdpc3RyeShhdXRoOiBQcml2YXRlUmVnaXN0cnlBdXRoLCB1cmw6IHN0cmluZyk6IFByb21pc2U8UmVzcG9uc2U+IHtcbiAgLy8gVGFyYmFsbCBVUkxzIGNvbWUgZnJvbSByZWdpc3RyeS1jb250cm9sbGVkIG1ldGFkYXRhOyBhdHRhY2ggdGhlIHRva2VuIG9ubHkgdG8gdGhlIGNvbmZpZ3VyZWRcbiAgLy8gcmVnaXN0cnkncyBvd24gb3JpZ2luIHNvIGEgbWFsaWNpb3VzIG9yIG1pc2NvbmZpZ3VyZWQgcmVnaXN0cnkgY2Fubm90IHJlZGlyZWN0IHRoZSBjcmVkZW50aWFsXG4gIC8vIHRvIGEgdGhpcmQtcGFydHkgaG9zdC5cbiAgY29uc3Qgc2VuZEF1dGhUb2tlbiA9ICEhYXV0aC5hdXRoVG9rZW4gJiYgaXNTYW1lT3JpZ2luKHVybCwgYXV0aC5yZWdpc3RyeVVybCk7XG4gIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2godXJsLCB7XG4gICAgaGVhZGVyczogc2VuZEF1dGhUb2tlbiA/IHsgYXV0aG9yaXphdGlvbjogYEJlYXJlciAke2F1dGguYXV0aFRva2VufWAgfSA6IHt9LFxuICB9KTtcbiAgaWYgKCFyZXNwb25zZS5vaykge1xuICAgIHRocm93IG5ldyBFcnJvcihgRmFpbGVkIHRvIGZldGNoICR7dXJsfTogJHtyZXNwb25zZS5zdGF0dXN9ICR7cmVzcG9uc2Uuc3RhdHVzVGV4dH1gKTtcbiAgfVxuICByZXR1cm4gcmVzcG9uc2U7XG59XG5cbmZ1bmN0aW9uIGlzU2FtZU9yaWdpbih1cmw6IHN0cmluZywgcmVnaXN0cnlVcmw6IHN0cmluZyk6IGJvb2xlYW4ge1xuICB0cnkge1xuICAgIHJldHVybiBuZXcgVVJMKHVybCkub3JpZ2luID09PSBuZXcgVVJMKHJlZ2lzdHJ5VXJsKS5vcmlnaW47XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxufVxuXG5mdW5jdGlvbiBlbmNvZGVQYWNrYWdlTmFtZShwYWNrYWdlTmFtZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIHBhY2thZ2VOYW1lLnJlcGxhY2UoJy8nLCAnJTJGJyk7XG59XG5cbi8vIFRoZSBvZmZpY2lhbCBTZW1WZXIgMi4wLjAgZ3JhbW1hciAoc2VtdmVyLm9yZyksIGFuY2hvcmVkOiBudW1lcmljLWxvb2tpbmcgZGlzdC10YWdzIHN1Y2ggYXNcbi8vIGAxLjIuM2xhdGVzdGAsIGxlYWRpbmctemVybyB2ZXJzaW9ucyAoYDAxLjIuM2ApLCBhbmQgdW5kZXJzY29yZSBpZGVudGlmaWVycyBhcmUgTk9UIHZlcnNpb25zIOKAlFxuLy8gcmVzb2x2ZVZlcnNpb24gdHJlYXRzIHRoZW0gYXMgdGFncywgbWF0Y2hpbmcgbm9kZS1zZW12ZXIncyBjbGFzc2lmaWNhdGlvbi5cbmNvbnN0IGV4YWN0U2VtdmVyUGF0dGVybiA9XG4gIC9eKD86MHxbMS05XVxcZCopXFwuKD86MHxbMS05XVxcZCopXFwuKD86MHxbMS05XVxcZCopKD86LSg/OjB8WzEtOV1cXGQqfFxcZCpbYS16QS1aLV1bMC05YS16QS1aLV0qKSg/OlxcLig/OjB8WzEtOV1cXGQqfFxcZCpbYS16QS1aLV1bMC05YS16QS1aLV0qKSkqKT8oPzpcXCtbMC05YS16QS1aLV0rKD86XFwuWzAtOWEtekEtWi1dKykqKT8kLztcblxuLyoqIFdoZXRoZXIgdGhlIHNwZWNpZmllciBpcyBhbiBleGFjdCBTZW1WZXIgdmVyc2lvbiAobm90IGEgcmFuZ2UsIHRhZywgb3IgZ2l0IFVSTCkuICovXG5leHBvcnQgZnVuY3Rpb24gaXNFeGFjdFZlcnNpb24oc3BlY2lmaWVyOiBzdHJpbmcgfCB1bmRlZmluZWQpOiBib29sZWFuIHtcbiAgcmV0dXJuICEhc3BlY2lmaWVyICYmIGV4YWN0U2VtdmVyUGF0dGVybi50ZXN0KHNwZWNpZmllcik7XG59XG5cbi8qKiBUaGUgdmVyc2lvbiB0aGUgc3BlY2lmaWVyIHJlc29sdmVzIHRvIHVuZGVyIHRoZSBkZWdyYWRlLXJhbmdlcyBydWxlLCBvciB1bmRlZmluZWQgZm9yIHRhZ3MvZ2l0LiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRvQmFzZVZlcnNpb24oc3BlY2lmaWVyOiBzdHJpbmcgfCB1bmRlZmluZWQpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBpZiAoIXNwZWNpZmllcikgcmV0dXJuO1xuICBjb25zdCBiYXNlID0gc3BlY2lmaWVyLnJlcGxhY2UoL15bXFxefl0vLCAnJyk7XG4gIHJldHVybiBleGFjdFNlbXZlclBhdHRlcm4udGVzdChiYXNlKSA/IGJhc2UgOiB1bmRlZmluZWQ7XG59XG5cbi8qKlxuICogU2ltcGxpZmllZCBub2RlLXNlbXZlciBydWxlczogYF5gIGFkbWl0cyB2ZXJzaW9ucyBub3QgY2hhbmdpbmcgdGhlIGxlZnQtbW9zdCBub24temVybyBjb21wb25lbnRcbiAqIChzbyBgXjAuMS4wYCByZWplY3RzIGAwLjIuMGAgYW5kIGBeMC4wLjNgIGFkbWl0cyBvbmx5IGAwLjAuM2ApLCBgfmAgYWRtaXRzIHNhbWUtbWFqb3IubWlub3JcbiAqID49IGJhc2UuIFByZXJlbGVhc2UgaWRlbnRpZmllcnMgYXJlIGhhbmRsZWQgY29uc2VydmF0aXZlbHk6IGFueSBgLWAgb24gZWl0aGVyIHNpZGUgbWFrZXMgdGhpc1xuICogcmV0dXJuIGZhbHNlLCBzbyBvbmx5IGFuIGV4YWN0IHN0cmluZyBtYXRjaCAoY2hlY2tlZCBzZXBhcmF0ZWx5IGJ5IHRoZSBjYWxsZXJzKSBpcyBhY2NlcHRlZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJhbmdlQWRtaXRzKHJhbmdlOiBzdHJpbmcsIHZlcnNpb246IHN0cmluZyk6IGJvb2xlYW4ge1xuICAvLyBTZW1WZXIgYnVpbGQgbWV0YWRhdGEgKGArYnVpbGQtMWApIGlzIGlnbm9yZWQgZm9yIG9yZGVyaW5nIGFuZCBtYXkgaXRzZWxmIGNvbnRhaW4gaHlwaGVucyxcbiAgLy8gc28gc3RyaXAgaXQgQkVGT1JFIHRoZSBwcmVyZWxlYXNlIChgLWApIGNoZWNrLlxuICBjb25zdCByYW5nZUJhc2UgPSByYW5nZS5yZXBsYWNlKC9eW1xcXn5dLywgJycpLnNwbGl0KCcrJylbMF0hO1xuICBjb25zdCBjYW5kaWRhdGVWZXJzaW9uID0gdmVyc2lvbi5zcGxpdCgnKycpWzBdITtcbiAgaWYgKHJhbmdlQmFzZS5pbmNsdWRlcygnLScpIHx8IGNhbmRpZGF0ZVZlcnNpb24uaW5jbHVkZXMoJy0nKSkgcmV0dXJuIGZhbHNlO1xuICBjb25zdCBiYXNlVmVyc2lvbiA9IHBhcnNlVmVyc2lvbihyYW5nZUJhc2UpO1xuICBjb25zdCBjYW5kaWRhdGUgPSBwYXJzZVZlcnNpb24oY2FuZGlkYXRlVmVyc2lvbik7XG4gIGlmICghYmFzZVZlcnNpb24gfHwgIWNhbmRpZGF0ZSkgcmV0dXJuIGZhbHNlO1xuICBpZiAocmFuZ2Uuc3RhcnRzV2l0aCgnXicpKSB7XG4gICAgaWYgKGJhc2VWZXJzaW9uWzBdID09PSAwKSB7XG4gICAgICBpZiAoYmFzZVZlcnNpb25bMV0gPT09IDApIHJldHVybiBjb21wYXJlVmVyc2lvbnMoY2FuZGlkYXRlLCBiYXNlVmVyc2lvbikgPT09IDA7XG4gICAgICByZXR1cm4gY2FuZGlkYXRlWzBdID09PSAwICYmIGNhbmRpZGF0ZVsxXSA9PT0gYmFzZVZlcnNpb25bMV0gJiYgY29tcGFyZVZlcnNpb25zKGNhbmRpZGF0ZSwgYmFzZVZlcnNpb24pID49IDA7XG4gICAgfVxuICAgIHJldHVybiBjYW5kaWRhdGVbMF0gPT09IGJhc2VWZXJzaW9uWzBdICYmIGNvbXBhcmVWZXJzaW9ucyhjYW5kaWRhdGUsIGJhc2VWZXJzaW9uKSA+PSAwO1xuICB9XG4gIGlmIChyYW5nZS5zdGFydHNXaXRoKCd+JykpIHtcbiAgICByZXR1cm4gKFxuICAgICAgY2FuZGlkYXRlWzBdID09PSBiYXNlVmVyc2lvblswXSAmJiBjYW5kaWRhdGVbMV0gPT09IGJhc2VWZXJzaW9uWzFdICYmIGNvbXBhcmVWZXJzaW9ucyhjYW5kaWRhdGUsIGJhc2VWZXJzaW9uKSA+PSAwXG4gICAgKTtcbiAgfVxuICByZXR1cm4gZmFsc2U7XG59XG5cbmZ1bmN0aW9uIHBhcnNlVmVyc2lvbih2ZXJzaW9uOiBzdHJpbmcpOiBbbnVtYmVyLCBudW1iZXIsIG51bWJlcl0gfCB1bmRlZmluZWQge1xuICAvLyBBbmNob3JlZDogY2FsbGVycyBzdHJpcCBidWlsZCBtZXRhZGF0YSBhbmQgcmVqZWN0IHByZXJlbGVhc2VzIGJlZm9yZWhhbmQsIHNvIGFueXRoaW5nIGJleW9uZFxuICAvLyB4LnkueiBtYXJrcyBhIG5vbi12ZXJzaW9uIChlLmcuIGEgbnVtZXJpYy1sb29raW5nIGRpc3QtdGFnKS5cbiAgY29uc3QgbWF0Y2ggPSAvXihcXGQrKVxcLihcXGQrKVxcLihcXGQrKSQvLmV4ZWModmVyc2lvbik7XG4gIHJldHVybiBtYXRjaCA/IFtOdW1iZXIobWF0Y2hbMV0pLCBOdW1iZXIobWF0Y2hbMl0pLCBOdW1iZXIobWF0Y2hbM10pXSA6IHVuZGVmaW5lZDtcbn1cblxuZnVuY3Rpb24gY29tcGFyZVZlcnNpb25zKGE6IFtudW1iZXIsIG51bWJlciwgbnVtYmVyXSwgYjogW251bWJlciwgbnVtYmVyLCBudW1iZXJdKTogbnVtYmVyIHtcbiAgZm9yIChsZXQgaW5kZXggPSAwOyBpbmRleCA8IDM7IGluZGV4KyspIHtcbiAgICBpZiAoYVtpbmRleF0hICE9PSBiW2luZGV4XSEpIHJldHVybiBhW2luZGV4XSEgLSBiW2luZGV4XSE7XG4gIH1cbiAgcmV0dXJuIDA7XG59XG4iLCJpbXBvcnQgdHlwZSB7IFByb2plY3QgfSBmcm9tICcuLi9wcm9qZWN0LmpzJztcblxuZXhwb3J0IGZ1bmN0aW9uKiBwcmVwYXJlRm9yUnVubmluZ0NvbW1hbmQoY29tbWFuZE5hbWU6IHN0cmluZywgcHJvamVjdHM6IFByb2plY3RbXSk6IEdlbmVyYXRvcjxQcm9qZWN0LCB2b2lkLCB1bmtub3duPiB7XG4gIGZvciAoY29uc3QgcHJvamVjdCBvZiBwcm9qZWN0cykge1xuICAgIGNvbnNvbGUuaW5mbyhgUnVubmluZyBcIiR7Y29tbWFuZE5hbWV9XCIgZm9yICR7cHJvamVjdC5uYW1lfSAuLi5gKTtcblxuICAgIHlpZWxkIHByb2plY3Q7XG4gIH1cbn1cbiIsImltcG9ydCBjaGlsZF9wcm9jZXNzIGZyb20gJ25vZGU6Y2hpbGRfcHJvY2Vzcyc7XG5pbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuaW1wb3J0IHsgZmlsZVVSTFRvUGF0aCB9IGZyb20gJ25vZGU6dXJsJztcblxuaW1wb3J0IGNoYWxrIGZyb20gJ2NoYWxrJztcbmltcG9ydCB7IGdsb2JieSB9IGZyb20gJ2dsb2JieSc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VKc29uIH0gZnJvbSAndHlwZS1mZXN0JztcbmltcG9ydCB0eXBlIHsgQ29tbWFuZE1vZHVsZSwgSW5mZXJyZWRPcHRpb25UeXBlcyB9IGZyb20gJ3lhcmdzJztcblxuaW1wb3J0IHtcbiAgZmluZERlc2NlbmRhbnRQcm9qZWN0cyxcbiAgZ2V0QWJzb2x1dGVGaWxlRGF0YWJhc2VVcmxQYXRoLFxuICBnZXRGaWxlRGF0YWJhc2VVcmxQYXRoLFxuICB0eXBlIFByb2plY3QsXG59IGZyb20gJy4uL3Byb2plY3QuanMnO1xuXG5pbXBvcnQge1xuICBQUklWQVRFX1JFR0lTVFJZX1NDT1BFLFxuICBpc1ByaXZhdGVHaXREZXBlbmRlbmN5LFxuICBpc1ByaXZhdGVSZWdpc3RyeURlcGVuZGVuY3ksXG4gIHJhbmdlQWRtaXRzLFxuICB0b0Jhc2VWZXJzaW9uLFxufSBmcm9tICcuLi91dGlscy9wcml2YXRlUmVnaXN0cnkuanMnO1xuXG5pbXBvcnQgeyBwcmVwYXJlRm9yUnVubmluZ0NvbW1hbmQgfSBmcm9tICcuL2NvbW1hbmRVdGlscy5qcyc7XG5cbmNvbnN0IGRlcGVuZGVuY3lTZWN0aW9uS2V5cyA9IFsnZGVwZW5kZW5jaWVzJywgJ2RldkRlcGVuZGVuY2llcycsICdvcHRpb25hbERlcGVuZGVuY2llcycsICdwZWVyRGVwZW5kZW5jaWVzJ10gYXMgY29uc3Q7XG5jb25zdCBzcWxpdGVGaWxlUGF0dGVybiA9IC9cXC4oPzpzcWxpdGUzP3xkYikoPzpbLS5dKD86am91cm5hbHxzaG18d2FsKSk/JC9pO1xuY29uc3QgZG9ja2VyQnVpbGRDYWNoZVBhdGhzID0gW1xuICAnLmNhY2hlJyxcbiAgJy5teXB5X2NhY2hlJyxcbiAgJy5uZXh0L2NhY2hlJyxcbiAgJy5wYXJjZWwtY2FjaGUnLFxuICAnLnB5dGVzdF9jYWNoZScsXG4gICcucnVmZl9jYWNoZScsXG4gICcudG94JyxcbiAgJy50dXJibycsXG4gICcudmVudicsXG4gICcueWFybi9jYWNoZScsXG4gICcueWFybi9pbnN0YWxsLXN0YXRlLmd6JyxcbiAgJ19fcHljYWNoZV9fJyxcbiAgJ2NvdmVyYWdlJyxcbiAgJ25vZGVfbW9kdWxlcy8uY2FjaGUnLFxuICAncGxheXdyaWdodC1yZXBvcnQnLFxuICAnc3Rvcnlib29rLXN0YXRpYycsXG4gICd0YXJnZXQnLFxuICAndGVzdC1yZXN1bHRzJyxcbl07XG5jb25zdCBkb2NrZXJCdWlsZENhY2hlUGF0dGVybnMgPSBbJyoqLyoucHljJywgJyoqLyoudHNidWlsZGluZm8nLCAnKiovX19weWNhY2hlX18nXTtcbmNvbnN0IGdlbmVyYXRlZFNxbGl0ZURpck5hbWVzID0gWydwcmlzbWEnLCAnZGInLCAnZHJpenpsZSddIGFzIGNvbnN0O1xuY29uc3QgZG9ja2VyR2VuZXJhdGVkRGF0YURpclBhdGhzID0gWycvZGF0YSddIGFzIGNvbnN0O1xuXG5jb25zdCBidWlsZGVyID0ge1xuICBvdXRzaWRlOiB7XG4gICAgZGVzY3JpcHRpb246ICdXaGV0aGVyIHRoZSBvcHRpbWl6YXRpb24gaXMgZXhlY3V0ZWQgb3V0c2lkZSBhIGRvY2tlciBjb250YWluZXIgb3Igbm90JyxcbiAgICB0eXBlOiAnYm9vbGVhbicsXG4gICAgYWxpYXM6ICdvJyxcbiAgfSxcbn0gYXMgY29uc3Q7XG5cbmV4cG9ydCBjb25zdCBvcHRpbWl6ZUZvckRvY2tlckJ1aWxkQ29tbWFuZDogQ29tbWFuZE1vZHVsZTx1bmtub3duLCBJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBidWlsZGVyPj4gPSB7XG4gIGNvbW1hbmQ6ICdvcHRpbWl6ZUZvckRvY2tlckJ1aWxkJyxcbiAgZGVzY3JpYmU6ICdPcHRpbWl6ZSBjb25maWd1cmF0aW9uIHdoZW4gYnVpbGRpbmcgYSBEb2NrZXIgaW1hZ2UnLFxuICBidWlsZGVyLFxuICBhc3luYyBoYW5kbGVyKGFyZ3YpIHtcbiAgICBjb25zdCBwcm9qZWN0cyA9IGF3YWl0IGZpbmREZXNjZW5kYW50UHJvamVjdHMoYXJndik7XG4gICAgaWYgKCFwcm9qZWN0cykge1xuICAgICAgY29uc29sZS5lcnJvcihjaGFsay5yZWQoJ05vIHByb2plY3QgZm91bmQuJykpO1xuICAgICAgcHJvY2Vzcy5leGl0KDEpO1xuICAgIH1cblxuICAgIGNvbnN0IG9wdGltaXplZFByb2plY3RzOiBQcm9qZWN0W10gPSBbXTtcbiAgICBmb3IgKGNvbnN0IHByb2plY3Qgb2YgcHJlcGFyZUZvclJ1bm5pbmdDb21tYW5kKCdvcHRpbWl6ZUZvckRvY2tlckJ1aWxkJywgcHJvamVjdHMuZGVzY2VuZGFudHMpKSB7XG4gICAgICBjb25zdCBwYWNrYWdlSnNvbjogUGFja2FnZUpzb24gPSBwcm9qZWN0LnBhY2thZ2VKc29uO1xuICAgICAgcmV3cml0ZVByaXZhdGVHaXRIdWJEZXBlbmRlbmNpZXMocHJvamVjdCwgcGFja2FnZUpzb24pO1xuICAgICAgY29uc3QgcmVtb3ZlZERldkRlcGVuZGVuY2llcyA9IG9wdGltaXplRGV2RGVwZW5kZW5jaWVzKGFyZ3YsIHBhY2thZ2VKc29uKTtcblxuICAgICAgb3B0aW1pemVTY3JpcHRzKHBhY2thZ2VKc29uLCB7XG4gICAgICAgIHJlbW92ZVdiUG9zdGluc3RhbGw6ICFhcmd2Lm91dHNpZGUgJiYgcmVtb3ZlZERldkRlcGVuZGVuY2llcy5pbmNsdWRlcygnQHdpbGxib29zdGVyL3diJyksXG4gICAgICB9KTtcblxuICAgICAgb3B0aW1pemVSb290UHJvcHMocGFja2FnZUpzb24pO1xuXG4gICAgICBpZiAoYXJndi5kcnlSdW4pIGNvbnRpbnVlO1xuXG4gICAgICBjb25zdCBkaXN0RGlyUGF0aCA9IGFyZ3Yub3V0c2lkZSA/IHBhdGguam9pbihwcm9qZWN0LmRpclBhdGgsICdkaXN0JykgOiBwcm9qZWN0LmRpclBhdGg7XG4gICAgICBhd2FpdCBmcy5wcm9taXNlcy5ta2RpcihkaXN0RGlyUGF0aCwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gICAgICBhd2FpdCBmcy5wcm9taXNlcy53cml0ZUZpbGUocGF0aC5qb2luKGRpc3REaXJQYXRoLCAncGFja2FnZS5qc29uJyksIEpTT04uc3RyaW5naWZ5KHBhY2thZ2VKc29uKSwgJ3V0ZjgnKTtcbiAgICAgIGlmIChhcmd2Lm91dHNpZGUpIHtcbiAgICAgICAgYXdhaXQgd3JpdGVEb2NrZXJTaGVsbFNjcmlwdHMocGF0aC5qb2luKGRpc3REaXJQYXRoLCAnYmFzaCcpKTtcbiAgICAgIH1cbiAgICAgIG9wdGltaXplZFByb2plY3RzLnB1c2gocHJvamVjdCk7XG4gICAgfVxuICAgIGlmICghYXJndi5kcnlSdW4gJiYgIWFyZ3Yub3V0c2lkZSkge1xuICAgICAgY2hpbGRfcHJvY2Vzcy5zcGF3blN5bmMocHJvamVjdHMucm9vdC5wYWNrYWdlTWFuYWdlckNvbW1hbmQsIFsnaW5zdGFsbCddLCB7XG4gICAgICAgIHN0ZGlvOiAnaW5oZXJpdCcsXG4gICAgICB9KTtcbiAgICAgIGNvbnNvbGUuaW5mbygnSW5zdGFsbGVkIGRlcGVuZGVuY2llcy4nKTtcbiAgICAgIGF3YWl0IGNsZWFudXBEb2NrZXJCdWlsZEFydGlmYWN0cyhvcHRpbWl6ZWRQcm9qZWN0cyk7XG4gICAgfVxuICB9LFxufTtcblxuZnVuY3Rpb24gcmV3cml0ZVByaXZhdGVHaXRIdWJEZXBlbmRlbmNpZXMocHJvamVjdDogUHJvamVjdCwgcGFja2FnZUpzb246IFBhY2thZ2VKc29uKTogc3RyaW5nW10ge1xuICByZXR1cm4gcmV3cml0ZVByaXZhdGVHaXRIdWJEZXBlbmRlbmNpZXNGb3JEaXIocHJvamVjdC5yb290RGlyUGF0aCwgcHJvamVjdC5kaXJQYXRoLCBwYWNrYWdlSnNvbik7XG59XG5cbmZ1bmN0aW9uIHJld3JpdGVQcml2YXRlR2l0SHViRGVwZW5kZW5jaWVzRm9yRGlyKFxuICByb290RGlyUGF0aDogc3RyaW5nLFxuICBwYWNrYWdlRGlyUGF0aDogc3RyaW5nLFxuICBwYWNrYWdlSnNvbjogUGFja2FnZUpzb25cbik6IHN0cmluZ1tdIHtcbiAgY29uc3QgcmV3cml0dGVuRGVwZW5kZW5jaWVzOiBzdHJpbmdbXSA9IFtdO1xuICBmb3IgKGNvbnN0IGtleSBvZiBkZXBlbmRlbmN5U2VjdGlvbktleXMpIHtcbiAgICBjb25zdCBkZXBzID0gcGFja2FnZUpzb25ba2V5XSA/PyB7fTtcbiAgICBmb3IgKGNvbnN0IFtuYW1lLCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMoZGVwcykpIHtcbiAgICAgIGlmIChpc1ByaXZhdGVHaXREZXBlbmRlbmN5KHZhbHVlKSkge1xuICAgICAgICAvLyBEb2NrZXIgYnVpbGRzIGNhbm5vdCBhY2Nlc3MgcHJpdmF0ZSBTU0ggVVJMcyB1bmxlc3MgY3JlZGVudGlhbHMgYXJlIGZvcndhcmRlZC5cbiAgICAgICAgLy8gVGhlIERvY2tlcmZpbGUgY29waWVzIHRob3NlIHdvcmtzcGFjZSBwYWNrYWdlcyBpbnRvIHRoZSBpbWFnZSBpbnN0ZWFkLiBPbmx5IHRoZSBvcmcnc1xuICAgICAgICAvLyBvd24gZ2l0IGRlcGVuZGVuY2llcyBhcmUgcmV3cml0dGVuIOKAlCB0aGUgc2hhcmVkIHByZWRpY2F0ZSBtYXRjaGVzIGV4YWN0bHkgd2hhdFxuICAgICAgICAvLyBgd2Igc2V0dXAtcHJpdmF0ZS1wYWNrYWdlc2AgbWF0ZXJpYWxpemVzLCBzbyBvdGhlciBTU0ggVVJMcyBhcmUgbGVmdCB1bmNoYW5nZWQgaW5zdGVhZFxuICAgICAgICAvLyBvZiBiZWluZyBwb2ludGVkIGF0IG5ldmVyLW1hdGVyaWFsaXplZCBsb2NhbCBwYXRocy5cbiAgICAgICAgZGVwc1tuYW1lXSA9IGdldFByaXZhdGVQYWNrYWdlRG9ja2VyU3BlY2lmaWVyKHJvb3REaXJQYXRoLCBwYWNrYWdlRGlyUGF0aCwgJ0B3aWxsYm9vc3RlcicsIG5hbWUpO1xuICAgICAgICByZXdyaXR0ZW5EZXBlbmRlbmNpZXMucHVzaChgJHtrZXl9LiR7bmFtZX1gKTtcbiAgICAgIH0gZWxzZSBpZiAoaXNQcml2YXRlUmVnaXN0cnlEZXBlbmRlbmN5KG5hbWUsIHZhbHVlKSkge1xuICAgICAgICBjb25zdCBtYXRlcmlhbGl6ZWRWZXJzaW9uID0gcmVhZE1hdGVyaWFsaXplZFBhY2thZ2VWZXJzaW9uKHJvb3REaXJQYXRoLCBuYW1lKTtcbiAgICAgICAgaWYgKG1hdGVyaWFsaXplZFZlcnNpb24gPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIC8vIExlYXZpbmcgdGhlIHJlZ2lzdHJ5IHNwZWNpZmllciBtZWFucyB0aGUgaW4taW1hZ2UgaW5zdGFsbCBuZWVkcyBWZXJkYWNjaW9cbiAgICAgICAgICAvLyBjcmVkZW50aWFscyDigJQgdGhlIGZhaWx1cmUgdGhpcyBmZWF0dXJlIGV4aXN0cyB0byBhdm9pZCDigJQgc28gc2F5IHNvIG91dCBsb3VkLlxuICAgICAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgICAgIGNoYWxrLnllbGxvdyhcbiAgICAgICAgICAgICAgYCR7bmFtZX0gaXMgbm90IG1hdGVyaWFsaXplZCB1bmRlciAke1BSSVZBVEVfUkVHSVNUUllfU0NPUEV9LzsgcnVuIFxcYHdiIHNldHVwLXByaXZhdGUtcGFja2FnZXNcXGAgc28gdGhlIERvY2tlciBidWlsZCBkb2VzIG5vdCBuZWVkIHJlZ2lzdHJ5IGNyZWRlbnRpYWxzLmBcbiAgICAgICAgICAgIClcbiAgICAgICAgICApO1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIC8vIFRoZSBtYXRlcmlhbGl6ZWQgdmVyc2lvbiBpcyBzdGFsZSB3aGVuIGl0IG5laXRoZXIgZXF1YWxzIHRoZSBzcGVjaWZpZXIncyBkZWdyYWRlZCBiYXNlXG4gICAgICAgIC8vIChgd2Igc2V0dXAtcHJpdmF0ZS1wYWNrYWdlc2AgZGVncmFkZXMgXi9+IHRvIHRoZSBiYXNlIHZlcnNpb24pIG5vciBpcyBhZG1pdHRlZCBieSB0aGVcbiAgICAgICAgLy8gXi9+IHJhbmdlIOKAlCBzZXR1cCBtYXkgbGVnaXRpbWF0ZWx5IG1hdGVyaWFsaXplIGEgTkVXRVIgYWRtaXR0ZWQgdmVyc2lvbiBzZWxlY3RlZCBieSBhblxuICAgICAgICAvLyBleGFjdCBwaW4gZWxzZXdoZXJlIGluIHRoZSBtYW5pZmVzdC4gRGlzdC10YWcgc3BlY2lmaWVycyAobm8geC55LnogYmFzZSwgZS5nLlxuICAgICAgICAvLyBgMjAyNi1zdGFibGVgKSBza2lwIHRoZSBzdGFsZW5lc3MgY2hlY2suXG4gICAgICAgIGNvbnN0IHJlcXVlc3RlZEJhc2VWZXJzaW9uID0gdG9CYXNlVmVyc2lvbih2YWx1ZSk7XG4gICAgICAgIGlmIChcbiAgICAgICAgICByZXF1ZXN0ZWRCYXNlVmVyc2lvbiAhPT0gdW5kZWZpbmVkICYmXG4gICAgICAgICAgbWF0ZXJpYWxpemVkVmVyc2lvbiAhPT0gcmVxdWVzdGVkQmFzZVZlcnNpb24gJiZcbiAgICAgICAgICAhcmFuZ2VBZG1pdHModmFsdWUsIG1hdGVyaWFsaXplZFZlcnNpb24pXG4gICAgICAgICkge1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICAgICAgICBjaGFsay5yZWQoXG4gICAgICAgICAgICAgIGBNYXRlcmlhbGl6ZWQgJHtuYW1lfSBpcyAke21hdGVyaWFsaXplZFZlcnNpb259IGJ1dCBwYWNrYWdlLmpzb24gcmVxdWlyZXMgJHt2YWx1ZX07IHJlcnVuIFxcYHdiIHNldHVwLXByaXZhdGUtcGFja2FnZXNcXGAuYFxuICAgICAgICAgICAgKVxuICAgICAgICAgICk7XG4gICAgICAgICAgcHJvY2Vzcy5leGl0KDEpO1xuICAgICAgICB9XG4gICAgICAgIC8vIFJlZ2lzdHJ5IHBhY2thZ2VzIHRoYXQgYHdiIHNldHVwLXByaXZhdGUtcGFja2FnZXNgIG1hdGVyaWFsaXplZCBvbiB0aGUgaG9zdCBhcmUgdXNlZCBhc1xuICAgICAgICAvLyBsb2NhbCBwYXRocyBzbyBpbWFnZSBidWlsZHMgbmVlZCBubyBWZXJkYWNjaW8gY3JlZGVudGlhbHM7IHRoZSBDT01NSVRURUQgcGFja2FnZS5qc29uXG4gICAgICAgIC8vIGtlZXBzIHRoZSByZWdpc3RyeSBzcGVjaWZpZXIg4oCUIG9ubHkgdGhlIGdlbmVyYXRlZCAoZGlzdC8pcGFja2FnZS5qc29uIGlzIHJld3JpdHRlblxuICAgICAgICAvLyAoaHR0cHM6Ly9naXRodWIuY29tL1dpbGxCb29zdGVyL3NoYXJlZC9pc3N1ZXMvOTY0KS5cbiAgICAgICAgZGVwc1tuYW1lXSA9IGdldFByaXZhdGVQYWNrYWdlRG9ja2VyU3BlY2lmaWVyKHJvb3REaXJQYXRoLCBwYWNrYWdlRGlyUGF0aCwgUFJJVkFURV9SRUdJU1RSWV9TQ09QRSwgbmFtZSk7XG4gICAgICAgIHJld3JpdHRlbkRlcGVuZGVuY2llcy5wdXNoKGAke2tleX0uJHtuYW1lfWApO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICBjb25zb2xlLmluZm8oJ1Jld3JvdGUgcHJpdmF0ZSBkZXBlbmRlbmNpZXM6JywgcmV3cml0dGVuRGVwZW5kZW5jaWVzLmpvaW4oJywgJykgfHwgJ25vbmUnKTtcbiAgcmV0dXJuIHJld3JpdHRlbkRlcGVuZGVuY2llcztcbn1cblxuZnVuY3Rpb24gZ2V0UHJpdmF0ZVBhY2thZ2VEb2NrZXJTcGVjaWZpZXIoXG4gIHJvb3REaXJQYXRoOiBzdHJpbmcsXG4gIHBhY2thZ2VEaXJQYXRoOiBzdHJpbmcsXG4gIHNjb3BlRGlyTmFtZTogc3RyaW5nLFxuICBwYWNrYWdlTmFtZTogc3RyaW5nXG4pOiBzdHJpbmcge1xuICBjb25zdCBwcml2YXRlUGFja2FnZURpclBhdGggPSBwYXRoLmpvaW4ocm9vdERpclBhdGgsIHNjb3BlRGlyTmFtZSwgdG9VbnNjb3BlZFBhY2thZ2VOYW1lKHBhY2thZ2VOYW1lKSk7XG4gIGNvbnN0IHJlbGF0aXZlUGF0aCA9IHBhdGgucmVsYXRpdmUocGFja2FnZURpclBhdGgsIHByaXZhdGVQYWNrYWdlRGlyUGF0aCk7XG4gIHJldHVybiByZWxhdGl2ZVBhdGguc3RhcnRzV2l0aCgnLicpID8gcmVsYXRpdmVQYXRoIDogYC4vJHtyZWxhdGl2ZVBhdGh9YDtcbn1cblxuZnVuY3Rpb24gdG9VbnNjb3BlZFBhY2thZ2VOYW1lKHBhY2thZ2VOYW1lOiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gcGFja2FnZU5hbWUucmVwbGFjZSgvXkB3aWxsYm9vc3Rlcig/Oi1wcml2YXRlKT9cXC8vLCAnJyk7XG59XG5cbi8qKiBVbmRlZmluZWQgd2hlbiB0aGUgcGFja2FnZSBpcyBub3QgbWF0ZXJpYWxpemVkIChvciBpdHMgbWFuaWZlc3QgaXMgdW5yZWFkYWJsZS92ZXJzaW9ubGVzcykuICovXG5mdW5jdGlvbiByZWFkTWF0ZXJpYWxpemVkUGFja2FnZVZlcnNpb24ocm9vdERpclBhdGg6IHN0cmluZywgcGFja2FnZU5hbWU6IHN0cmluZyk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IHBhY2thZ2VKc29uUGF0aCA9IHBhdGguam9pbihcbiAgICByb290RGlyUGF0aCxcbiAgICBQUklWQVRFX1JFR0lTVFJZX1NDT1BFLFxuICAgIHRvVW5zY29wZWRQYWNrYWdlTmFtZShwYWNrYWdlTmFtZSksXG4gICAgJ3BhY2thZ2UuanNvbidcbiAgKTtcbiAgdHJ5IHtcbiAgICByZXR1cm4gKEpTT04ucGFyc2UoZnMucmVhZEZpbGVTeW5jKHBhY2thZ2VKc29uUGF0aCwgJ3V0ZjgnKSkgYXMgUGFja2FnZUpzb24pLnZlcnNpb247XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cbn1cblxuYXN5bmMgZnVuY3Rpb24gd3JpdGVEb2NrZXJTaGVsbFNjcmlwdHMoZGlyUGF0aDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IHNvdXJjZURpclBhdGggPSBmaW5kRG9ja2VyU2hlbGxTY3JpcHRzRGlyUGF0aCgpO1xuICBhd2FpdCBmcy5wcm9taXNlcy5ta2RpcihkaXJQYXRoLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgZm9yIChjb25zdCBkaXJlbnQgb2YgYXdhaXQgZnMucHJvbWlzZXMucmVhZGRpcihzb3VyY2VEaXJQYXRoLCB7IHdpdGhGaWxlVHlwZXM6IHRydWUgfSkpIHtcbiAgICBpZiAoIWRpcmVudC5pc0ZpbGUoKSB8fCAhZGlyZW50Lm5hbWUuZW5kc1dpdGgoJy5zaCcpKSBjb250aW51ZTtcblxuICAgIGNvbnN0IHRhcmdldEZpbGVQYXRoID0gcGF0aC5qb2luKGRpclBhdGgsIGRpcmVudC5uYW1lKTtcbiAgICBhd2FpdCBmcy5wcm9taXNlcy5jb3B5RmlsZShwYXRoLmpvaW4oc291cmNlRGlyUGF0aCwgZGlyZW50Lm5hbWUpLCB0YXJnZXRGaWxlUGF0aCk7XG4gICAgYXdhaXQgZnMucHJvbWlzZXMuY2htb2QodGFyZ2V0RmlsZVBhdGgsIDBvNzU1KTtcbiAgfVxuICBjb25zb2xlLmluZm8oYEdlbmVyYXRlZCBEb2NrZXIgc2hlbGwgc2NyaXB0czogJHtwYXRoLnJlbGF0aXZlKHByb2Nlc3MuY3dkKCksIGRpclBhdGgpIHx8IGRpclBhdGh9YCk7XG59XG5cbmZ1bmN0aW9uIGZpbmREb2NrZXJTaGVsbFNjcmlwdHNEaXJQYXRoKCk6IHN0cmluZyB7XG4gIGxldCBjdXJyZW50RGlyUGF0aCA9IHBhdGguZGlybmFtZShmaWxlVVJMVG9QYXRoKGltcG9ydC5tZXRhLnVybCkpO1xuICBmb3IgKDs7KSB7XG4gICAgY29uc3QgY2FuZGlkYXRlID0gcGF0aC5qb2luKGN1cnJlbnREaXJQYXRoLCAnZG9ja2VyJywgJ2Jhc2gnKTtcbiAgICBpZiAoZnMuZXhpc3RzU3luYyhjYW5kaWRhdGUpKSByZXR1cm4gY2FuZGlkYXRlO1xuXG4gICAgY29uc3QgcGFyZW50RGlyUGF0aCA9IHBhdGguZGlybmFtZShjdXJyZW50RGlyUGF0aCk7XG4gICAgaWYgKHBhcmVudERpclBhdGggPT09IGN1cnJlbnREaXJQYXRoKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0RvY2tlciBzaGVsbCBzY3JpcHRzIGRpcmVjdG9yeSBub3QgZm91bmQuJyk7XG4gICAgfVxuICAgIGN1cnJlbnREaXJQYXRoID0gcGFyZW50RGlyUGF0aDtcbiAgfVxufVxuXG5mdW5jdGlvbiBvcHRpbWl6ZURldkRlcGVuZGVuY2llcyhhcmd2OiBJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBidWlsZGVyPiwgcGFja2FnZUpzb246IFBhY2thZ2VKc29uKTogc3RyaW5nW10ge1xuICBpZiAoYXJndi5vdXRzaWRlKSB7XG4gICAgLy8gT3V0c2lkZSBvcHRpbWl6YXRpb24gd3JpdGVzIGRpc3QvcGFja2FnZS5qc29uIGJlZm9yZSBEb2NrZXIgYnVpbGRzIHRoZSBhcHAuXG4gICAgLy8gS2VlcCBidWlsZC10aW1lIGRlcGVuZGVuY2llcyBhbmQgcmVtb3ZlIG9ubHkga25vd24gbm9uLWJ1aWxkIHRvb2xpbmcuXG4gICAgcmV0dXJuIHJlbW92ZVVubmVjZXNzYXJ5RGV2RGVwZW5kZW5jaWVzRm9yT3V0c2lkZURvY2tlckJ1aWxkKHBhY2thZ2VKc29uKTtcbiAgfVxuXG4gIC8vIEluc2lkZSBEb2NrZXIsIGNvZGVnZW4vYnVpbGQgaGFzIGFscmVhZHkgZmluaXNoZWQsIHNvIHByb2R1Y3Rpb24gaW5zdGFsbCBzaG91bGQgbm90IHNlZSBkZXYgdG9vbGluZy5cbiAgY29uc3QgcmVtb3ZlZERlcGVuZGVuY2llcyA9IE9iamVjdC5rZXlzKHBhY2thZ2VKc29uLmRldkRlcGVuZGVuY2llcyA/PyB7fSk7XG4gIGRlbGV0ZSBwYWNrYWdlSnNvbi5kZXZEZXBlbmRlbmNpZXM7XG4gIGNvbnNvbGUuaW5mbygnUmVtb3ZlZCBhbGwgZGV2RGVwZW5kZW5jaWVzLicpO1xuICByZXR1cm4gcmVtb3ZlZERlcGVuZGVuY2llcztcbn1cblxuZnVuY3Rpb24gcmVtb3ZlVW5uZWNlc3NhcnlEZXZEZXBlbmRlbmNpZXNGb3JPdXRzaWRlRG9ja2VyQnVpbGQocGFja2FnZUpzb246IFBhY2thZ2VKc29uKTogc3RyaW5nW10ge1xuICBjb25zdCBkZXZEZXBzID0gcGFja2FnZUpzb24uZGV2RGVwZW5kZW5jaWVzID8/IHt9O1xuICAvLyBJbiAtLW91dHNpZGUgbW9kZSwgRG9ja2VyIHN0aWxsIHJ1bnMgY29kZWdlbi9idWlsZCBiZWZvcmUgYSBzZWNvbmQgaW4taW1hZ2Ugb3B0aW1pemF0aW9uLlxuICAvLyBSZW1vdmUgb25seSB0b29saW5nIHRoYXQgaXMgbm90IG5lZWRlZCBmb3IgdGhhdCBidWlsZCBwaGFzZS5cbiAgY29uc3QgbmFtZVdvcmRzVG9CZVJlbW92ZWQgPSBbXG4gICAgJ2FydGlsbGVyeScsXG4gICAgJ2Jpb21lJyxcbiAgICAnY29uY3VycmVudGx5JyxcbiAgICAnY29udmVudGlvbmFsLWNoYW5nZWxvZy1jb252ZW50aW9uYWxjb21taXRzJyxcbiAgICAnZXNsaW50JyxcbiAgICAnaHVza3knLFxuICAgICdpbWFnZW1pbicsXG4gICAgJ2plc3QnLFxuICAgICdraWxsLXBvcnQnLFxuICAgICdsaW50LXN0YWdlZCcsXG4gICAgJ29wZW4tY2xpJyxcbiAgICAnb3hmbXQnLFxuICAgICdveGxpbnQnLFxuICAgICdwbGF5d3JpZ2h0JyxcbiAgICAncHJldHRpZXInLFxuICAgICdwaW5zdCcsXG4gICAgJ3JhaWx3YXknLFxuICAgICdzZW1hbnRpYy1yZWxlYXNlJyxcbiAgICAnc29ydC1wYWNrYWdlLWpzb24nLFxuICAgICd3YWl0LW9uJyxcbiAgICAndml0ZXN0JyxcbiAgXTtcbiAgY29uc3QgcmVtb3ZlZERlcHM6IHN0cmluZ1tdID0gW107XG4gIGZvciAoY29uc3QgbmFtZSBvZiBPYmplY3Qua2V5cyhkZXZEZXBzKSkge1xuICAgIGlmIChcbiAgICAgIG5hbWVXb3Jkc1RvQmVSZW1vdmVkLnNvbWUoKHdvcmQpID0+IG5hbWUuaW5jbHVkZXMod29yZCkpIHx8XG4gICAgICAvLyBTaGFyZWQgY29uZmlnIHBhY2thZ2VzIGFyZSBuZWVkZWQgb25seSBmb3IgbGludC9mb3JtYXQvdGVzdCBjb21tYW5kcywgbm90IERvY2tlciBidWlsZHMuXG4gICAgICAobmFtZS5pbmNsdWRlcygnd2lsbGJvb3N0ZXInKSAmJiBuYW1lLmluY2x1ZGVzKCdjb25maWcnKSlcbiAgICApIHtcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZHluYW1pYy1kZWxldGVcbiAgICAgIGRlbGV0ZSBkZXZEZXBzW25hbWVdO1xuICAgICAgcmVtb3ZlZERlcHMucHVzaChuYW1lKTtcbiAgICB9XG4gIH1cbiAgY29uc29sZS5pbmZvKCdSZW1vdmVkIGRldkRlcGVuZGVuY2llczonLCByZW1vdmVkRGVwcy5qb2luKCcsICcpIHx8ICdub25lJyk7XG4gIHJldHVybiByZW1vdmVkRGVwcztcbn1cblxuZnVuY3Rpb24gb3B0aW1pemVTY3JpcHRzKHBhY2thZ2VKc29uOiBQYWNrYWdlSnNvbiwgb3B0aW9uczogeyByZW1vdmVXYlBvc3RpbnN0YWxsOiBib29sZWFuIH0pOiB2b2lkIHtcbiAgY29uc3QgbmFtZVdvcmRzT2ZVbm5lY2Vzc2FyeVNjcmlwdHMgPSBbJ2NoZWNrJywgJ2RlcGxveScsICdmb3JtYXQnLCAnbGludCcsICdzdGFydCcsICd0ZXN0J107XG4gIGNvbnN0IGNvbnRlbnRXb3Jkc09mVW5uZWNlc3NhcnlTY3JpcHRzID0gWydwaW5zdCAnLCAnaHVza3kgJ107XG4gIGNvbnN0IHNjcmlwdHMgPSAocGFja2FnZUpzb24uc2NyaXB0cyA/PyB7fSkgYXMgUmVjb3JkPHN0cmluZywgc3RyaW5nPjtcbiAgY29uc3QgcmVtb3ZlZFNjcmlwdHM6IHN0cmluZ1tdID0gW107XG4gIGZvciAoY29uc3QgW25hbWUsIGNvbnRlbnRdIG9mIE9iamVjdC5lbnRyaWVzKHNjcmlwdHMpKSB7XG4gICAgaWYgKFxuICAgICAgKG9wdGlvbnMucmVtb3ZlV2JQb3N0aW5zdGFsbCAmJiBuYW1lID09PSAncG9zdGluc3RhbGwnICYmIGNvbnRlbnQudHJpbSgpID09PSAnd2IgZ2VuLWNvZGUnKSB8fFxuICAgICAgbmFtZVdvcmRzT2ZVbm5lY2Vzc2FyeVNjcmlwdHMuc29tZSgod29yZCkgPT4gbmFtZS5zdGFydHNXaXRoKHdvcmQpKSB8fFxuICAgICAgLy8gU3VwcG9ydCBcImh1c2t5XCIgc2luY2UgaHVza3kgdjkgcmVxdWlyZXMgYFwicG9zdGluc3RhbGxcIjogXCJodXNreVwiYFxuICAgICAgY29udGVudFdvcmRzT2ZVbm5lY2Vzc2FyeVNjcmlwdHMuc29tZSgod29yZCkgPT4gY29udGVudC5pbmNsdWRlcyh3b3JkKSB8fCBjb250ZW50LnRyaW0oKSA9PT0gd29yZC50cmltKCkpXG4gICAgKSB7XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWR5bmFtaWMtZGVsZXRlXG4gICAgICBkZWxldGUgc2NyaXB0c1tuYW1lXTtcbiAgICAgIHJlbW92ZWRTY3JpcHRzLnB1c2gobmFtZSk7XG4gICAgfVxuICB9XG4gIGNvbnNvbGUuaW5mbygnUmVtb3ZlZCBzY3JpcHRzOicsIHJlbW92ZWRTY3JpcHRzLmpvaW4oJywgJykgfHwgJ25vbmUnKTtcbn1cblxuZnVuY3Rpb24gb3B0aW1pemVSb290UHJvcHMocGFja2FnZUpzb246IFBhY2thZ2VKc29uKTogdm9pZCB7XG4gIGRlbGV0ZSBwYWNrYWdlSnNvbi5wcml2YXRlO1xuICBkZWxldGUgcGFja2FnZUpzb24ucHVibGlzaENvbmZpZztcbiAgZGVsZXRlIHBhY2thZ2VKc29uLnByZXR0aWVyO1xufVxuXG5hc3luYyBmdW5jdGlvbiBjbGVhbnVwRG9ja2VyQnVpbGRBcnRpZmFjdHMocHJvamVjdHM6IFByb2plY3RbXSk6IFByb21pc2U8dm9pZD4ge1xuICBmb3IgKGNvbnN0IHByb2plY3Qgb2YgcHJvamVjdHMpIHtcbiAgICBhd2FpdCByZW1vdmVQcm9qZWN0Q2FjaGVzKHByb2plY3QpO1xuICAgIGF3YWl0IHJlbW92ZUdlbmVyYXRlZExvY2FsRGF0YShwcm9qZWN0KTtcbiAgICBydW5Eb2NrZXJDbGVhbnVwU2NyaXB0KHByb2plY3QpO1xuICB9XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHJlbW92ZVByb2plY3RDYWNoZXMocHJvamVjdDogUHJvamVjdCk6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCByZWxhdGl2ZVBhdGhzID0gW1xuICAgIC4uLihhd2FpdCByZW1vdmVEb2NrZXJCdWlsZENhY2hlUGF0aHMocHJvamVjdCkpLFxuICAgIC4uLihhd2FpdCByZW1vdmVEb2NrZXJCdWlsZENhY2hlUGF0dGVybnMocHJvamVjdCkpLFxuICBdO1xuICBjb25zb2xlLmluZm8oJ1JlbW92ZWQgRG9ja2VyIGJ1aWxkIGNhY2hlczonLCByZWxhdGl2ZVBhdGhzLmpvaW4oJywgJykgfHwgJ25vbmUnKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gcmVtb3ZlRG9ja2VyQnVpbGRDYWNoZVBhdGhzKHByb2plY3Q6IFByb2plY3QpOiBQcm9taXNlPHN0cmluZ1tdPiB7XG4gIGNvbnN0IHJlbW92ZWRQYXRoczogc3RyaW5nW10gPSBbXTtcbiAgZm9yIChjb25zdCByZWxhdGl2ZVBhdGggb2YgZG9ja2VyQnVpbGRDYWNoZVBhdGhzKSB7XG4gICAgY29uc3QgdGFyZ2V0UGF0aCA9IHBhdGguam9pbihwcm9qZWN0LmRpclBhdGgsIHJlbGF0aXZlUGF0aCk7XG4gICAgaWYgKCFmcy5leGlzdHNTeW5jKHRhcmdldFBhdGgpKSBjb250aW51ZTtcblxuICAgIGF3YWl0IGZzLnByb21pc2VzLnJtKHRhcmdldFBhdGgsIHsgZm9yY2U6IHRydWUsIHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgICByZW1vdmVkUGF0aHMucHVzaChyZWxhdGl2ZVBhdGgpO1xuICB9XG4gIHJldHVybiByZW1vdmVkUGF0aHM7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHJlbW92ZURvY2tlckJ1aWxkQ2FjaGVQYXR0ZXJucyhwcm9qZWN0OiBQcm9qZWN0KTogUHJvbWlzZTxzdHJpbmdbXT4ge1xuICBjb25zdCByZWxhdGl2ZVBhdGhzID0gYXdhaXQgZ2xvYmJ5KGRvY2tlckJ1aWxkQ2FjaGVQYXR0ZXJucywge1xuICAgIGN3ZDogcHJvamVjdC5kaXJQYXRoLFxuICAgIGRvdDogdHJ1ZSxcbiAgICBmb2xsb3dTeW1ib2xpY0xpbmtzOiBmYWxzZSxcbiAgICBpZ25vcmU6IFsnKiovbm9kZV9tb2R1bGVzJywgJyoqL25vZGVfbW9kdWxlcy8qKicsICcqKi8ueWFybicsICcqKi8ueWFybi8qKicsICcqKi8uZ2l0JywgJyoqLy5naXQvKionXSxcbiAgICBvbmx5RmlsZXM6IGZhbHNlLFxuICB9KTtcbiAgYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgcmVsYXRpdmVQYXRocy5tYXAoKHJlbGF0aXZlUGF0aCkgPT5cbiAgICAgIGZzLnByb21pc2VzLnJtKHBhdGguam9pbihwcm9qZWN0LmRpclBhdGgsIHJlbGF0aXZlUGF0aCksIHsgZm9yY2U6IHRydWUsIHJlY3Vyc2l2ZTogdHJ1ZSB9KVxuICAgIClcbiAgKTtcbiAgcmV0dXJuIHJlbGF0aXZlUGF0aHM7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHJlbW92ZUdlbmVyYXRlZExvY2FsRGF0YShwcm9qZWN0OiBQcm9qZWN0KTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IHJlbW92ZWRQYXRoR3JvdXBzID0gYXdhaXQgUHJvbWlzZS5hbGwoW3JlbW92ZUdlbmVyYXRlZE1vdW50RGlycyhwcm9qZWN0KSwgcmVtb3ZlR2VuZXJhdGVkU3FsaXRlRmlsZXMocHJvamVjdCldKTtcbiAgY29uc3QgcmVtb3ZlZFBhdGhzID0gcmVtb3ZlZFBhdGhHcm91cHMuZmxhdCgpO1xuICBjb25zb2xlLmluZm8oJ1JlbW92ZWQgZ2VuZXJhdGVkIGxvY2FsIGRhdGE6JywgcmVtb3ZlZFBhdGhzLmpvaW4oJywgJykgfHwgJ25vbmUnKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gcmVtb3ZlR2VuZXJhdGVkTW91bnREaXJzKHByb2plY3Q6IFByb2plY3QpOiBQcm9taXNlPHN0cmluZ1tdPiB7XG4gIGNvbnN0IHJlbGF0aXZlUGF0aHMgPSBnZXRHZW5lcmF0ZWRNb3VudERpclBhdGhzKHByb2plY3QpO1xuICBjb25zdCByZW1vdmVkUGF0aHM6IHN0cmluZ1tdID0gW107XG4gIGZvciAoY29uc3QgcmVsYXRpdmVQYXRoIG9mIHJlbGF0aXZlUGF0aHMpIHtcbiAgICBjb25zdCB0YXJnZXRQYXRoID0gcGF0aC5qb2luKHByb2plY3QuZGlyUGF0aCwgcmVsYXRpdmVQYXRoKTtcbiAgICBpZiAoIWZzLmV4aXN0c1N5bmModGFyZ2V0UGF0aCkpIGNvbnRpbnVlO1xuXG4gICAgYXdhaXQgZnMucHJvbWlzZXMucm0odGFyZ2V0UGF0aCwgeyBmb3JjZTogdHJ1ZSwgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICAgIHJlbW92ZWRQYXRocy5wdXNoKHJlbGF0aXZlUGF0aCk7XG4gIH1cbiAgcmV0dXJuIHJlbW92ZWRQYXRocztcbn1cblxuZnVuY3Rpb24gZ2V0R2VuZXJhdGVkTW91bnREaXJQYXRocyhwcm9qZWN0OiBQcm9qZWN0KTogc3RyaW5nW10ge1xuICBjb25zdCBkZWZhdWx0UGF0aHMgPSBnZW5lcmF0ZWRTcWxpdGVEaXJOYW1lcy5tYXAoKGRpck5hbWUpID0+IHBhdGguam9pbihkaXJOYW1lLCAnbW91bnQnKSk7XG4gIGNvbnN0IGRiUGF0aCA9IGdldEFic29sdXRlRmlsZURhdGFiYXNlVXJsUGF0aChwcm9qZWN0KTtcbiAgaWYgKCFkYlBhdGgpIHJldHVybiBkZWZhdWx0UGF0aHM7XG5cbiAgY29uc3QgYWJzb2x1dGVEaXJQYXRoID0gcGF0aC5kaXJuYW1lKGRiUGF0aCk7XG4gIGlmIChwYXRoLmJhc2VuYW1lKGFic29sdXRlRGlyUGF0aCkgIT09ICdtb3VudCcgfHwgIWlzUGF0aEluc2lkZVByb2plY3QocHJvamVjdCwgYWJzb2x1dGVEaXJQYXRoKSkge1xuICAgIHJldHVybiBkZWZhdWx0UGF0aHM7XG4gIH1cbiAgY29uc3QgcmVsYXRpdmVQYXRoID0gcGF0aC5yZWxhdGl2ZShwcm9qZWN0LmRpclBhdGgsIGFic29sdXRlRGlyUGF0aCk7XG4gIGlmICghcmVsYXRpdmVQYXRoKSByZXR1cm4gZGVmYXVsdFBhdGhzO1xuXG4gIHJldHVybiBbLi4ubmV3IFNldChbLi4uZGVmYXVsdFBhdGhzLCByZWxhdGl2ZVBhdGhdKV07XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHJlbW92ZUdlbmVyYXRlZFNxbGl0ZUZpbGVzKHByb2plY3Q6IFByb2plY3QpOiBQcm9taXNlPHN0cmluZ1tdPiB7XG4gIGNvbnN0IHJlbW92ZWRQYXRocyA9IGF3YWl0IFByb21pc2UuYWxsKFtcbiAgICByZW1vdmVHZW5lcmF0ZWRTcWxpdGVGaWxlc0luRGVmYXVsdERpcnMocHJvamVjdCksXG4gICAgcmVtb3ZlRW52R2VuZXJhdGVkU3FsaXRlRmlsZXMocHJvamVjdCksXG4gIF0pO1xuICByZXR1cm4gcmVtb3ZlZFBhdGhzLmZsYXQoKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gcmVtb3ZlR2VuZXJhdGVkU3FsaXRlRmlsZXNJbkRlZmF1bHREaXJzKHByb2plY3Q6IFByb2plY3QpOiBQcm9taXNlPHN0cmluZ1tdPiB7XG4gIGNvbnN0IGRpclBhdGhzID0gYXdhaXQgZ2V0R2VuZXJhdGVkU3FsaXRlRGlyUGF0aHMocHJvamVjdCk7XG4gIGNvbnN0IHJlbW92ZWRQYXRocyA9IGF3YWl0IFByb21pc2UuYWxsKGRpclBhdGhzLm1hcCgoZGlyUGF0aCkgPT4gcmVtb3ZlR2VuZXJhdGVkU3FsaXRlRmlsZXNJbkRpcihwcm9qZWN0LCBkaXJQYXRoKSkpO1xuICByZXR1cm4gcmVtb3ZlZFBhdGhzLmZsYXQoKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gZ2V0R2VuZXJhdGVkU3FsaXRlRGlyUGF0aHMocHJvamVjdDogUHJvamVjdCk6IFByb21pc2U8c3RyaW5nW10+IHtcbiAgY29uc3QgZGlyUGF0aHMgPSBnZW5lcmF0ZWRTcWxpdGVEaXJOYW1lcy5tYXAoKGRpck5hbWUpID0+IHBhdGguam9pbihwcm9qZWN0LmRpclBhdGgsIGRpck5hbWUpKTtcbiAgY29uc3QgcmVzdWx0cyA9IGF3YWl0IFByb21pc2UuYWxsKGRpclBhdGhzLm1hcCgoZGlyUGF0aCkgPT4gaXNEaXJlY3RvcnkoZGlyUGF0aCkpKTtcbiAgcmV0dXJuIGRpclBhdGhzLmZpbHRlcigoXywgaW5kZXgpID0+IHJlc3VsdHNbaW5kZXhdKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gcmVtb3ZlRW52R2VuZXJhdGVkU3FsaXRlRmlsZXMocHJvamVjdDogUHJvamVjdCk6IFByb21pc2U8c3RyaW5nW10+IHtcbiAgY29uc3QgZGJGaWxlUGF0aHMgPSBnZXRFbnZHZW5lcmF0ZWRTcWxpdGVGaWxlUGF0aHMocHJvamVjdCk7XG4gIGNvbnN0IHJlbW92ZWRQYXRoczogc3RyaW5nW10gPSBbXTtcbiAgZm9yIChjb25zdCBkYkZpbGVQYXRoIG9mIGRiRmlsZVBhdGhzKSB7XG4gICAgZm9yIChjb25zdCB0YXJnZXRQYXRoIG9mIGdldFNxbGl0ZUZpbGVGYW1pbHlQYXRocyhkYkZpbGVQYXRoKSkge1xuICAgICAgaWYgKCEoYXdhaXQgaXNGaWxlKHRhcmdldFBhdGgpKSkgY29udGludWU7XG5cbiAgICAgIGF3YWl0IGZzLnByb21pc2VzLnJtKHRhcmdldFBhdGgsIHsgZm9yY2U6IHRydWUgfSk7XG4gICAgICByZW1vdmVkUGF0aHMucHVzaChwYXRoLnJlbGF0aXZlKHByb2plY3QuZGlyUGF0aCwgdGFyZ2V0UGF0aCkpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gcmVtb3ZlZFBhdGhzO1xufVxuXG5mdW5jdGlvbiBnZXRFbnZHZW5lcmF0ZWRTcWxpdGVGaWxlUGF0aHMocHJvamVjdDogUHJvamVjdCk6IHN0cmluZ1tdIHtcbiAgY29uc3QgZGJQYXRoID0gZ2V0RmlsZURhdGFiYXNlVXJsUGF0aChwcm9qZWN0KTtcbiAgY29uc3QgYWJzb2x1dGVEYlBhdGggPSBnZXRBYnNvbHV0ZUZpbGVEYXRhYmFzZVVybFBhdGgocHJvamVjdCk7XG4gIGlmICghZGJQYXRoIHx8ICFhYnNvbHV0ZURiUGF0aCkgcmV0dXJuIFtdO1xuXG4gIGNvbnN0IGZpbGVQYXRocyA9IHBhdGguaXNBYnNvbHV0ZShkYlBhdGgpXG4gICAgPyBbZGJQYXRoXVxuICAgIDogW2Fic29sdXRlRGJQYXRoLCAuLi5nZW5lcmF0ZWRTcWxpdGVEaXJOYW1lcy5tYXAoKGRpck5hbWUpID0+IHBhdGgucmVzb2x2ZShwcm9qZWN0LmRpclBhdGgsIGRpck5hbWUsIGRiUGF0aCkpXTtcbiAgcmV0dXJuIFsuLi5uZXcgU2V0KGZpbGVQYXRocyldLmZpbHRlcigoZmlsZVBhdGgpID0+IGlzR2VuZXJhdGVkU3FsaXRlRmlsZVBhdGhTYWZlKHByb2plY3QsIGZpbGVQYXRoKSk7XG59XG5cbmZ1bmN0aW9uIGlzR2VuZXJhdGVkU3FsaXRlRmlsZVBhdGhTYWZlKHByb2plY3Q6IFByb2plY3QsIGZpbGVQYXRoOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgcmV0dXJuIGlzUGF0aEluc2lkZVByb2plY3QocHJvamVjdCwgZmlsZVBhdGgpIHx8IGlzRG9ja2VyR2VuZXJhdGVkRGF0YUZpbGVQYXRoKHByb2plY3QsIGZpbGVQYXRoKTtcbn1cblxuZnVuY3Rpb24gaXNEb2NrZXJHZW5lcmF0ZWREYXRhRmlsZVBhdGgocHJvamVjdDogUHJvamVjdCwgZmlsZVBhdGg6IHN0cmluZyk6IGJvb2xlYW4ge1xuICBpZiAoIWlzRG9ja2VyRW5hYmxlZChwcm9qZWN0KSkgcmV0dXJuIGZhbHNlO1xuXG4gIHJldHVybiBkb2NrZXJHZW5lcmF0ZWREYXRhRGlyUGF0aHMuc29tZSgoZGlyUGF0aCkgPT4ge1xuICAgIGNvbnN0IHJlbGF0aXZlUGF0aCA9IHBhdGgucmVsYXRpdmUoZGlyUGF0aCwgZmlsZVBhdGgpO1xuICAgIHJldHVybiByZWxhdGl2ZVBhdGggIT09ICcnICYmIHJlbGF0aXZlUGF0aCAhPT0gJy4uJyAmJiAhcmVsYXRpdmVQYXRoLnN0YXJ0c1dpdGgoJy4uLycpO1xuICB9KTtcbn1cblxuZnVuY3Rpb24gZ2V0U3FsaXRlRmlsZUZhbWlseVBhdGhzKGRiRmlsZVBhdGg6IHN0cmluZyk6IHN0cmluZ1tdIHtcbiAgcmV0dXJuIFtcbiAgICBkYkZpbGVQYXRoLFxuICAgIGAke2RiRmlsZVBhdGh9LWpvdXJuYWxgLFxuICAgIGAke2RiRmlsZVBhdGh9LXNobWAsXG4gICAgYCR7ZGJGaWxlUGF0aH0td2FsYCxcbiAgICBgJHtkYkZpbGVQYXRofS5qb3VybmFsYCxcbiAgICBgJHtkYkZpbGVQYXRofS5zaG1gLFxuICAgIGAke2RiRmlsZVBhdGh9LndhbGAsXG4gIF07XG59XG5cbmZ1bmN0aW9uIGlzUGF0aEluc2lkZVByb2plY3QocHJvamVjdDogUHJvamVjdCwgdGFyZ2V0UGF0aDogc3RyaW5nKTogYm9vbGVhbiB7XG4gIGNvbnN0IHJlbGF0aXZlUGF0aCA9IHBhdGgucmVsYXRpdmUocHJvamVjdC5kaXJQYXRoLCB0YXJnZXRQYXRoKTtcbiAgLy8gYHN0YXJ0c1dpdGgoJy4uJylgIHdvdWxkIHJlamVjdCBwcm9qZWN0LWxvY2FsIG5hbWVzIHN1Y2ggYXMgYC4uY2FjaGVgLlxuICByZXR1cm4gcmVsYXRpdmVQYXRoID09PSAnJyB8fCAocmVsYXRpdmVQYXRoICE9PSAnLi4nICYmICFyZWxhdGl2ZVBhdGguc3RhcnRzV2l0aChgLi4ke3BhdGguc2VwfWApKTtcbn1cblxuZnVuY3Rpb24gaXNEb2NrZXJFbmFibGVkKHByb2plY3Q6IFByb2plY3QpOiBib29sZWFuIHtcbiAgcmV0dXJuICEhcHJvamVjdC5lbnYuV0JfRE9DS0VSICYmIHByb2plY3QuZW52LldCX0RPQ0tFUiAhPT0gJzAnICYmIHByb2plY3QuZW52LldCX0RPQ0tFUiAhPT0gJ2ZhbHNlJztcbn1cblxuYXN5bmMgZnVuY3Rpb24gaXNGaWxlKGZpbGVQYXRoOiBzdHJpbmcpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgdHJ5IHtcbiAgICBjb25zdCBzdGF0ID0gYXdhaXQgZnMucHJvbWlzZXMuc3RhdChmaWxlUGF0aCk7XG4gICAgcmV0dXJuIHN0YXQuaXNGaWxlKCk7XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxufVxuXG5hc3luYyBmdW5jdGlvbiBpc0RpcmVjdG9yeShkaXJQYXRoOiBzdHJpbmcpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgdHJ5IHtcbiAgICBjb25zdCBzdGF0ID0gYXdhaXQgZnMucHJvbWlzZXMuc3RhdChkaXJQYXRoKTtcbiAgICByZXR1cm4gc3RhdC5pc0RpcmVjdG9yeSgpO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn1cblxuYXN5bmMgZnVuY3Rpb24gcmVtb3ZlR2VuZXJhdGVkU3FsaXRlRmlsZXNJbkRpcihwcm9qZWN0OiBQcm9qZWN0LCBkaXJQYXRoOiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZ1tdPiB7XG4gIGNvbnN0IGRpcmVudHMgPSBhd2FpdCBmcy5wcm9taXNlcy5yZWFkZGlyKGRpclBhdGgsIHsgd2l0aEZpbGVUeXBlczogdHJ1ZSB9KTtcbiAgY29uc3Qgc3FsaXRlRmlsZU5hbWVzID0gZGlyZW50c1xuICAgIC5maWx0ZXIoKGRpcmVudCkgPT4gZGlyZW50LmlzRmlsZSgpICYmIHNxbGl0ZUZpbGVQYXR0ZXJuLnRlc3QoZGlyZW50Lm5hbWUpKVxuICAgIC5tYXAoKGRpcmVudCkgPT4gZGlyZW50Lm5hbWUpO1xuICBhd2FpdCBQcm9taXNlLmFsbChzcWxpdGVGaWxlTmFtZXMubWFwKChmaWxlTmFtZSkgPT4gZnMucHJvbWlzZXMucm0ocGF0aC5qb2luKGRpclBhdGgsIGZpbGVOYW1lKSwgeyBmb3JjZTogdHJ1ZSB9KSkpO1xuXG4gIGNvbnN0IHJlbGF0aXZlRGlyUGF0aCA9IHBhdGgucmVsYXRpdmUocHJvamVjdC5kaXJQYXRoLCBkaXJQYXRoKTtcbiAgcmV0dXJuIHNxbGl0ZUZpbGVOYW1lcy5tYXAoKGZpbGVOYW1lKSA9PiBwYXRoLmpvaW4ocmVsYXRpdmVEaXJQYXRoLCBmaWxlTmFtZSkpO1xufVxuXG5mdW5jdGlvbiBydW5Eb2NrZXJDbGVhbnVwU2NyaXB0KHByb2plY3Q6IFByb2plY3QpOiB2b2lkIHtcbiAgaWYgKCFpc0RvY2tlckVuYWJsZWQocHJvamVjdCkpIHJldHVybjtcblxuICBjb25zdCBzY3JpcHRQYXRoID0gcGF0aC5qb2luKHByb2plY3QuZGlyUGF0aCwgJ2Jhc2gnLCAnY2xlYW51cC5zaCcpO1xuICBpZiAoIWZzLmV4aXN0c1N5bmMoc2NyaXB0UGF0aCkpIHJldHVybjtcblxuICBjb25zdCByZXN1bHQgPSBjaGlsZF9wcm9jZXNzLnNwYXduU3luYygnYmFzaCcsIFtzY3JpcHRQYXRoLCAnLS1rZWVwLXNjcmlwdHMnXSwge1xuICAgIGN3ZDogcHJvamVjdC5kaXJQYXRoLFxuICAgIHN0ZGlvOiAnaW5oZXJpdCcsXG4gIH0pO1xuICBpZiAocmVzdWx0LnN0YXR1cyAhPT0gMCkge1xuICAgIHRocm93IG5ldyBFcnJvcihgRmFpbGVkIHRvIHJ1biAke3BhdGgucmVsYXRpdmUocHJvamVjdC5kaXJQYXRoLCBzY3JpcHRQYXRoKX1gKTtcbiAgfVxufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuXG5pbXBvcnQgdHlwZSB7IEVudlJlYWRlck9wdGlvbnMgfSBmcm9tICdAd2lsbGJvb3N0ZXIvc2hhcmVkLWxpYi1ub2RlL3NyYyc7XG5pbXBvcnQgY2hhbGsgZnJvbSAnY2hhbGsnO1xuaW1wb3J0IHR5cGUgeyBDb21tYW5kTW9kdWxlLCBJbmZlcnJlZE9wdGlvblR5cGVzIH0gZnJvbSAneWFyZ3MnO1xuXG5pbXBvcnQgdHlwZSB7IERhdGFiYXNlT3JtLCBQcm9qZWN0IH0gZnJvbSAnLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQgeyBmaW5kRGVzY2VuZGFudFByb2plY3RzLCBnZXRBYnNvbHV0ZUZpbGVEYXRhYmFzZVVybFBhdGgsIGlzUHJvamVjdEVudmlyb25tZW50IH0gZnJvbSAnLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQgeyBidWlsZERyaXp6bGVLaXRDb21tYW5kLCBkcml6emxlU2NyaXB0cyB9IGZyb20gJy4uL3NjcmlwdHMvZHJpenpsZVNjcmlwdHMuanMnO1xuaW1wb3J0IHsgcHJpc21hU2NyaXB0cyB9IGZyb20gJy4uL3NjcmlwdHMvcHJpc21hU2NyaXB0cy5qcyc7XG5pbXBvcnQgeyBydW5XaXRoU3Bhd24gfSBmcm9tICcuLi9zY3JpcHRzL3J1bi5qcyc7XG5pbXBvcnQgeyBzaGFyZWRPcHRpb25zQnVpbGRlciB9IGZyb20gJy4uL3NoYXJlZE9wdGlvbnNCdWlsZGVyLmpzJztcbmltcG9ydCB7IGJ1aWxkU2hlbGxDb21tYW5kIH0gZnJvbSAnLi4vdXRpbHMvc2hlbGwuanMnO1xuaW1wb3J0IHsgd3JhcFdpdGhMb2NhbEQxRGF0YWJhc2VVcmwgfSBmcm9tICcuLi91dGlscy93cmFuZ2xlci5qcyc7XG5cbmltcG9ydCB7IHByZXBhcmVGb3JSdW5uaW5nQ29tbWFuZCB9IGZyb20gJy4vY29tbWFuZFV0aWxzLmpzJztcblxuY29uc3QgYnVpbGRlciA9IHt9IGFzIGNvbnN0O1xuXG5leHBvcnQgY29uc3QgcHJpc21hQ29tbWFuZDogQ29tbWFuZE1vZHVsZSA9IHtcbiAgY29tbWFuZDogJ3ByaXNtYScsXG4gIGFsaWFzZXM6IFsnZGInXSxcbiAgZGVzY3JpYmU6XG4gICAgXCJSdW4gZGF0YWJhc2UgY29tbWFuZHMuIFVzZSAnLS0nIHRvIHN0b3Agd2Igb3B0aW9uIHBhcnNpbmcgYW5kIGZvcndhcmQgdGhlIHJlbWFpbmluZyBhcmd1bWVudHMgdG8gUHJpc21hLiBEcml6emxlIHByb2plY3RzIHVzZSBkcml6emxlLWtpdC4gRXhhbXBsZTogd2IgcHJpc21hIG1pZ3JhdGUtZGV2IC0tIC0tbmFtZSBpbml0XCIsXG4gIGJ1aWxkZXI6ICh5YXJncykgPT4ge1xuICAgIHJldHVybiB5YXJnc1xuICAgICAgLnBhcnNlckNvbmZpZ3VyYXRpb24oeyAncG9wdWxhdGUtLSc6IHRydWUgfSlcbiAgICAgIC5jb21tYW5kKGNsZWFuVXBMaXRlc3RyZWFtQ29tbWFuZClcbiAgICAgIC5jb21tYW5kKGNyZWF0ZUxpdGVzdHJlYW1Db25maWdDb21tYW5kKVxuICAgICAgLmNvbW1hbmQoZGVwbG95Q29tbWFuZClcbiAgICAgIC5jb21tYW5kKGRlcGxveUZvcmNlQ29tbWFuZClcbiAgICAgIC5jb21tYW5kKGdlbmVyYXRlQ29tbWFuZClcbiAgICAgIC5jb21tYW5kKGxpc3RCYWNrdXBzQ29tbWFuZClcbiAgICAgIC5jb21tYW5kKG1pZ3JhdGVDb21tYW5kKVxuICAgICAgLmNvbW1hbmQobWlncmF0ZURldkNvbW1hbmQpXG4gICAgICAuY29tbWFuZChyZXNldENvbW1hbmQpXG4gICAgICAuY29tbWFuZChyZXN0b3JlQ29tbWFuZClcbiAgICAgIC5jb21tYW5kKHNlZWRDb21tYW5kKVxuICAgICAgLmNvbW1hbmQoc3R1ZGlvQ29tbWFuZClcbiAgICAgIC5jb21tYW5kKGRlZmF1bHRDb21tYW5kKVxuICAgICAgLmRlbWFuZENvbW1hbmQoKVxuICAgICAgLnN0cmljdChmYWxzZSk7IC8vIEFsbG93IHVua25vd24gb3B0aW9ucyB0byBiZSBwYXNzZWQgdGhyb3VnaFxuICB9LFxuICBoYW5kbGVyKCkge1xuICAgIC8vIERvIG5vdGhpbmdcbiAgfSxcbn07XG5cbmNvbnN0IGNsZWFuVXBMaXRlc3RyZWFtQ29tbWFuZDogQ29tbWFuZE1vZHVsZTx1bmtub3duLCBJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBidWlsZGVyPj4gPSB7XG4gIGNvbW1hbmQ6ICdjbGVhbnVwLWxpdGVzdHJlYW0nLFxuICBkZXNjcmliZTogJ0NsZWFuIHVwIHRlbXBvcmFsIExpdGVzdHJlYW0gZmlsZXMnLFxuICBidWlsZGVyLFxuICBhc3luYyBoYW5kbGVyKGFyZ3YpIHtcbiAgICBjb25zdCBhbGxQcm9qZWN0cyA9IGF3YWl0IGZpbmREYXRhYmFzZU9ybVByb2plY3RzKGFyZ3YpO1xuICAgIGZvciAoY29uc3QgeyBvcm0sIHByb2plY3QgfSBvZiBwcmVwYXJlRm9yUnVubmluZ0RhdGFiYXNlT3JtQ29tbWFuZCgnZGIgY2xlYW51cC1saXRlc3RyZWFtJywgYWxsUHJvamVjdHMpKSB7XG4gICAgICBhd2FpdCBydW5XaXRoU3Bhd24oZ2V0RGF0YWJhc2VPcm1TY3JpcHRzKG9ybSkuY2xlYW5VcExpdGVzdHJlYW0ocHJvamVjdCksIHByb2plY3QsIGFyZ3YpO1xuICAgIH1cbiAgfSxcbn07XG5cbmNvbnN0IGNyZWF0ZUxpdGVzdHJlYW1Db25maWdCdWlsZGVyID0ge1xuICAuLi5idWlsZGVyLFxuICBvdXRwdXQ6IHtcbiAgICBkZXNjcmlwdGlvbjogJ091dHB1dCBwYXRoIG9mIHRoZSBMaXRlc3RyZWFtIGNvbmZpZ3VyYXRpb24gZmlsZS4nLFxuICAgIHR5cGU6ICdzdHJpbmcnLFxuICAgIGRlZmF1bHQ6ICcvZXRjL2xpdGVzdHJlYW0ueW1sJyxcbiAgfSxcbn0gYXMgY29uc3Q7XG5cbmNvbnN0IGNyZWF0ZUxpdGVzdHJlYW1Db25maWdDb21tYW5kOiBDb21tYW5kTW9kdWxlPFxuICB1bmtub3duLFxuICBJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBjcmVhdGVMaXRlc3RyZWFtQ29uZmlnQnVpbGRlcj5cbj4gPSB7XG4gIGNvbW1hbmQ6ICdjcmVhdGUtbGl0ZXN0cmVhbS1jb25maWcnLFxuICBkZXNjcmliZTogJ0NyZWF0ZSBMaXRlc3RyZWFtIGNvbmZpZ3VyYXRpb24gZmlsZScsXG4gIGJ1aWxkZXI6IGNyZWF0ZUxpdGVzdHJlYW1Db25maWdCdWlsZGVyLFxuICBhc3luYyBoYW5kbGVyKGFyZ3YpIHtcbiAgICBjb25zdCBhbGxQcm9qZWN0cyA9IGF3YWl0IGZpbmREYXRhYmFzZU9ybVByb2plY3RzKGFyZ3YpO1xuICAgIGlmIChhbGxQcm9qZWN0cy5sZW5ndGggPiAxKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICdDcmVhdGluZyBMaXRlc3RyZWFtIGNvbmZpZ3VyYXRpb24gZm9yIG11bHRpcGxlIHByb2plY3RzIGF0IG9uY2UgaXMgbm90IHN1cHBvcnRlZCBiZWNhdXNlIHRoZXkgd291bGQgb3ZlcndyaXRlIGVhY2ggb3RoZXIuJ1xuICAgICAgKTtcbiAgICB9XG4gICAgZm9yIChjb25zdCB7IG9ybSwgcHJvamVjdCB9IG9mIHByZXBhcmVGb3JSdW5uaW5nRGF0YWJhc2VPcm1Db21tYW5kKCdkYiBjcmVhdGUtbGl0ZXN0cmVhbS1jb25maWcnLCBhbGxQcm9qZWN0cykpIHtcbiAgICAgIGNyZWF0ZUxpdGVzdHJlYW1Db25maWcocHJvamVjdCwgb3JtLCBhcmd2Lm91dHB1dCk7XG4gICAgfVxuICB9LFxufTtcblxuY29uc3QgZGVwbG95Q29tbWFuZDogQ29tbWFuZE1vZHVsZTx1bmtub3duLCBJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBidWlsZGVyPj4gPSB7XG4gIGNvbW1hbmQ6ICdkZXBsb3knLFxuICBkZXNjcmliZTogJ0FwcGx5IG1pZ3JhdGlvbiB0byBEQiB3aXRob3V0IGluaXRpYWxpemluZyBpdCcsXG4gIGJ1aWxkZXIsXG4gIGFzeW5jIGhhbmRsZXIoYXJndikge1xuICAgIGNvbnN0IGFsbFByb2plY3RzID0gYXdhaXQgZmluZERhdGFiYXNlT3JtUHJvamVjdHMoYXJndik7XG4gICAgY29uc3QgdW5rbm93bk9wdGlvbnMgPSBleHRyYWN0VW5rbm93bk9wdGlvbnMoYXJndik7XG4gICAgZm9yIChjb25zdCB7IG9ybSwgcHJvamVjdCB9IG9mIHByZXBhcmVGb3JSdW5uaW5nRGF0YWJhc2VPcm1Db21tYW5kKCdkYiBkZXBsb3knLCBhbGxQcm9qZWN0cykpIHtcbiAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bihcbiAgICAgICAgd2l0aExvY2FsRDFJZk5lZWRlZChvcm0sIHByb2plY3QsIGdldERhdGFiYXNlT3JtU2NyaXB0cyhvcm0pLmRlcGxveShwcm9qZWN0LCB1bmtub3duT3B0aW9ucykpLFxuICAgICAgICBwcm9qZWN0LFxuICAgICAgICBhcmd2XG4gICAgICApO1xuICAgIH1cbiAgfSxcbn07XG5cbmNvbnN0IGRlcGxveUZvcmNlQ29tbWFuZDogQ29tbWFuZE1vZHVsZTx1bmtub3duLCBJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBidWlsZGVyPj4gPSB7XG4gIGNvbW1hbmQ6ICdkZXBsb3ktZm9yY2UnLFxuICBkZXNjcmliZTogXCJGb3JjZSB0byBhcHBseSBtaWdyYXRpb24gdG8gREIgdXRpbGl6aW5nIExpdGVzdHJlYW0ncyBiYWNrdXAgd2l0aG91dCBpbml0aWFsaXppbmcgaXRcIixcbiAgYnVpbGRlcixcbiAgYXN5bmMgaGFuZGxlcihhcmd2KSB7XG4gICAgY29uc3QgYWxsUHJvamVjdHMgPSBhd2FpdCBmaW5kRGF0YWJhc2VPcm1Qcm9qZWN0cyhhcmd2KTtcbiAgICBmb3IgKGNvbnN0IHsgb3JtLCBwcm9qZWN0IH0gb2YgcHJlcGFyZUZvclJ1bm5pbmdEYXRhYmFzZU9ybUNvbW1hbmQoJ2RiIGRlcGxveS1mb3JjZScsIGFsbFByb2plY3RzKSkge1xuICAgICAgYXdhaXQgcnVuV2l0aFNwYXduKGdldERhdGFiYXNlT3JtU2NyaXB0cyhvcm0pLmRlcGxveUZvcmNlKHByb2plY3QpLCBwcm9qZWN0LCBhcmd2KTtcbiAgICB9XG4gIH0sXG59O1xuXG5jb25zdCBnZW5lcmF0ZUNvbW1hbmQ6IENvbW1hbmRNb2R1bGU8dW5rbm93biwgSW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgYnVpbGRlcj4+ID0ge1xuICBjb21tYW5kOiAnZ2VuZXJhdGUnLFxuICBkZXNjcmliZTogJ0dlbmVyYXRlIE9STSBjbGllbnQgY29kZScsXG4gIGJ1aWxkZXIsXG4gIGFzeW5jIGhhbmRsZXIoYXJndikge1xuICAgIGNvbnN0IGFsbFByb2plY3RzID0gYXdhaXQgZmluZERhdGFiYXNlT3JtUHJvamVjdHMoYXJndik7XG4gICAgY29uc3QgdW5rbm93bk9wdGlvbnMgPSBleHRyYWN0VW5rbm93bk9wdGlvbnMoYXJndik7XG4gICAgZm9yIChjb25zdCB7IG9ybSwgcHJvamVjdCB9IG9mIHByZXBhcmVGb3JSdW5uaW5nRGF0YWJhc2VPcm1Db21tYW5kKCdkYiBnZW5lcmF0ZScsIGFsbFByb2plY3RzKSkge1xuICAgICAgYXdhaXQgcnVuV2l0aFNwYXduKGdldERhdGFiYXNlT3JtU2NyaXB0cyhvcm0pLmdlbmVyYXRlKHByb2plY3QsIHVua25vd25PcHRpb25zKSwgcHJvamVjdCwgYXJndik7XG4gICAgfVxuICB9LFxufTtcblxuY29uc3QgbGl0ZXN0cmVhbUNvbmZpZ0J1aWxkZXIgPSB7XG4gIC4uLmJ1aWxkZXIsXG4gIGNvbmZpZzoge1xuICAgIGRlc2NyaXB0aW9uOiAnUGF0aCBvZiB0aGUgTGl0ZXN0cmVhbSBjb25maWd1cmF0aW9uIGZpbGUuJyxcbiAgICB0eXBlOiAnc3RyaW5nJyxcbiAgfSxcbn0gYXMgY29uc3Q7XG5cbmNvbnN0IGxpc3RCYWNrdXBzQ29tbWFuZDogQ29tbWFuZE1vZHVsZTx1bmtub3duLCBJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBsaXRlc3RyZWFtQ29uZmlnQnVpbGRlcj4+ID0ge1xuICBjb21tYW5kOiAnbGlzdC1iYWNrdXBzJyxcbiAgZGVzY3JpYmU6ICdMaXN0IExpdGVzdHJlYW0gYmFja3VwcycsXG4gIGJ1aWxkZXI6IGxpdGVzdHJlYW1Db25maWdCdWlsZGVyLFxuICBhc3luYyBoYW5kbGVyKGFyZ3YpIHtcbiAgICBjb25zdCBhbGxQcm9qZWN0cyA9IGF3YWl0IGZpbmREYXRhYmFzZU9ybVByb2plY3RzKGFyZ3YpO1xuICAgIGZvciAoY29uc3QgeyBvcm0sIHByb2plY3QgfSBvZiBwcmVwYXJlRm9yUnVubmluZ0RhdGFiYXNlT3JtQ29tbWFuZCgnZGIgbGlzdC1iYWNrdXBzJywgYWxsUHJvamVjdHMpKSB7XG4gICAgICBhd2FpdCBydW5XaXRoU3Bhd24oZ2V0RGF0YWJhc2VPcm1TY3JpcHRzKG9ybSkubGlzdEJhY2t1cHMocHJvamVjdCwgYXJndi5jb25maWcpLCBwcm9qZWN0LCBhcmd2KTtcbiAgICB9XG4gIH0sXG59O1xuXG5jb25zdCBtaWdyYXRlQnVpbGRlciA9IHtcbiAgLi4uYnVpbGRlcixcbiAgJ2NoZWNrLWlkZW1wb3RlbmN5Jzoge1xuICAgIGRlc2NyaXB0aW9uOiAnUnVuIHRoZSBtaWdyYXRpb24gY29tbWFuZCB0d2ljZSB0byBjb25maXJtIGl0IGlzIGlkZW1wb3RlbnQuJyxcbiAgICB0eXBlOiAnYm9vbGVhbicsXG4gIH0sXG59IGFzIGNvbnN0O1xuXG5jb25zdCBtaWdyYXRlQ29tbWFuZDogQ29tbWFuZE1vZHVsZTx1bmtub3duLCBJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBtaWdyYXRlQnVpbGRlcj4+ID0ge1xuICBjb21tYW5kOiAnbWlncmF0ZScsXG4gIGRlc2NyaWJlOiAnQXBwbHkgbWlncmF0aW9uIHRvIERCIHdpdGggaW5pdGlhbGl6aW5nIGl0JyxcbiAgYnVpbGRlcjogbWlncmF0ZUJ1aWxkZXIsXG4gIGFzeW5jIGhhbmRsZXIoYXJndikge1xuICAgIGNvbnN0IGFsbFByb2plY3RzID0gYXdhaXQgZmluZERhdGFiYXNlT3JtUHJvamVjdHMoYXJndik7XG4gICAgY29uc3QgdW5rbm93bk9wdGlvbnMgPSBleHRyYWN0VW5rbm93bk9wdGlvbnMoYXJndiwgWydjaGVjay1pZGVtcG90ZW5jeSddKTtcbiAgICBmb3IgKGNvbnN0IHsgb3JtLCBwcm9qZWN0IH0gb2YgcHJlcGFyZUZvclJ1bm5pbmdEYXRhYmFzZU9ybUNvbW1hbmQoJ2RiIG1pZ3JhdGUnLCBhbGxQcm9qZWN0cykpIHtcbiAgICAgIGNvbnN0IG9ybVNjcmlwdHMgPSBnZXREYXRhYmFzZU9ybVNjcmlwdHMob3JtKTtcbiAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bih3aXRoTG9jYWxEMUlmTmVlZGVkKG9ybSwgcHJvamVjdCwgb3JtU2NyaXB0cy5taWdyYXRlKHByb2plY3QsIHVua25vd25PcHRpb25zKSksIHByb2plY3QsIGFyZ3YpO1xuICAgICAgaWYgKHNob3VsZENoZWNrSWRlbXBvdGVuY3kocHJvamVjdCwgYXJndi5jaGVja0lkZW1wb3RlbmN5KSkge1xuICAgICAgICBpZiAoaXNQcm9kdWN0aW9uRW52aXJvbm1lbnQocHJvamVjdCkpIHtcbiAgICAgICAgICBjb25zb2xlLmluZm8oY2hhbGsueWVsbG93KGBTa2lwcGluZyBpZGVtcG90ZW5jeSBjaGVjayBmb3IgJHtwcm9qZWN0Lm5hbWV9IGluIHByb2R1Y3Rpb24gZW52aXJvbm1lbnQuYCkpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bihcbiAgICAgICAgICAgIHdpdGhMb2NhbEQxSWZOZWVkZWQob3JtLCBwcm9qZWN0LCBvcm1TY3JpcHRzLmRlcGxveShwcm9qZWN0LCB1bmtub3duT3B0aW9ucykpLFxuICAgICAgICAgICAgcHJvamVjdCxcbiAgICAgICAgICAgIGFyZ3ZcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9LFxufTtcblxuZnVuY3Rpb24gc2hvdWxkQ2hlY2tJZGVtcG90ZW5jeShwcm9qZWN0OiBQcm9qZWN0LCBjaGVja0lkZW1wb3RlbmN5OiBib29sZWFuIHwgdW5kZWZpbmVkKTogYm9vbGVhbiB7XG4gIHJldHVybiBjaGVja0lkZW1wb3RlbmN5ID8/IGlzRG9ja2VyRW5hYmxlZChwcm9qZWN0KTtcbn1cblxuZnVuY3Rpb24gaXNEb2NrZXJFbmFibGVkKHByb2plY3Q6IFByb2plY3QpOiBib29sZWFuIHtcbiAgcmV0dXJuICEhcHJvamVjdC5lbnYuV0JfRE9DS0VSICYmIHByb2plY3QuZW52LldCX0RPQ0tFUiAhPT0gJzAnICYmIHByb2plY3QuZW52LldCX0RPQ0tFUiAhPT0gJ2ZhbHNlJztcbn1cblxuZnVuY3Rpb24gaXNQcm9kdWN0aW9uRW52aXJvbm1lbnQocHJvamVjdDogUHJvamVjdCk6IGJvb2xlYW4ge1xuICByZXR1cm4gaXNQcm9qZWN0RW52aXJvbm1lbnQocHJvamVjdCwgJ3Byb2R1Y3Rpb24nKTtcbn1cblxuY29uc3QgbWlncmF0ZURldkNvbW1hbmQ6IENvbW1hbmRNb2R1bGU8dW5rbm93biwgSW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgYnVpbGRlcj4+ID0ge1xuICBjb21tYW5kOiAnbWlncmF0ZS1kZXYnLFxuICBkZXNjcmliZTogJ0NyZWF0ZSBhIG1pZ3JhdGlvbiBmaWxlJyxcbiAgYnVpbGRlcixcbiAgYXN5bmMgaGFuZGxlcihhcmd2KSB7XG4gICAgY29uc3QgYWxsUHJvamVjdHMgPSBhd2FpdCBmaW5kRGF0YWJhc2VPcm1Qcm9qZWN0cyhhcmd2KTtcbiAgICBjb25zdCB1bmtub3duT3B0aW9ucyA9IGV4dHJhY3RVbmtub3duT3B0aW9ucyhhcmd2KTtcbiAgICBmb3IgKGNvbnN0IHsgb3JtLCBwcm9qZWN0IH0gb2YgcHJlcGFyZUZvclJ1bm5pbmdEYXRhYmFzZU9ybUNvbW1hbmQoJ2RiIG1pZ3JhdGUtZGV2JywgYWxsUHJvamVjdHMpKSB7XG4gICAgICBhd2FpdCBydW5XaXRoU3Bhd24oZ2V0RGF0YWJhc2VPcm1TY3JpcHRzKG9ybSkubWlncmF0ZURldihwcm9qZWN0LCB1bmtub3duT3B0aW9ucyksIHByb2plY3QsIGFyZ3YpO1xuICAgIH1cbiAgfSxcbn07XG5cbmNvbnN0IHJlc2V0Q29tbWFuZDogQ29tbWFuZE1vZHVsZTx1bmtub3duLCBJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBidWlsZGVyPj4gPSB7XG4gIGNvbW1hbmQ6ICdyZXNldCcsXG4gIGRlc2NyaWJlOiAnUmVzZXQgREInLFxuICBidWlsZGVyLFxuICBhc3luYyBoYW5kbGVyKGFyZ3YpIHtcbiAgICBjb25zdCBhbGxQcm9qZWN0cyA9IGF3YWl0IGZpbmREYXRhYmFzZU9ybVByb2plY3RzKGFyZ3YpO1xuICAgIGNvbnN0IHVua25vd25PcHRpb25zID0gZXh0cmFjdFVua25vd25PcHRpb25zKGFyZ3YpO1xuICAgIGZvciAoY29uc3QgeyBvcm0sIHByb2plY3QgfSBvZiBwcmVwYXJlRm9yUnVubmluZ0RhdGFiYXNlT3JtQ29tbWFuZCgnZGIgcmVzZXQnLCBhbGxQcm9qZWN0cykpIHtcbiAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bihcbiAgICAgICAgd2l0aExvY2FsRDFJZk5lZWRlZChvcm0sIHByb2plY3QsIGdldERhdGFiYXNlT3JtU2NyaXB0cyhvcm0pLnJlc2V0KHByb2plY3QsIHVua25vd25PcHRpb25zKSksXG4gICAgICAgIHByb2plY3QsXG4gICAgICAgIGFyZ3ZcbiAgICAgICk7XG4gICAgfVxuICAgIC8vIEZvcmNlIHRvIHJlc2V0IHRlc3QgZGF0YWJhc2VcbiAgICBpZiAocHJvY2Vzcy5lbnYuV0JfRU5WICE9PSAndGVzdCcpIHtcbiAgICAgIHByb2Nlc3MuZW52LldCX0VOViA9ICd0ZXN0JztcbiAgICAgIGZvciAoY29uc3QgeyBvcm0sIHByb2plY3QgfSBvZiBwcmVwYXJlRm9yUnVubmluZ0RhdGFiYXNlT3JtQ29tbWFuZChcbiAgICAgICAgJ1dCX0VOVj10ZXN0IGRiIHJlc2V0JyxcbiAgICAgICAgYXdhaXQgZmluZERhdGFiYXNlT3JtUHJvamVjdHMoYXJndilcbiAgICAgICkpIHtcbiAgICAgICAgYXdhaXQgcnVuV2l0aFNwYXduKFxuICAgICAgICAgIHdpdGhMb2NhbEQxSWZOZWVkZWQob3JtLCBwcm9qZWN0LCBnZXREYXRhYmFzZU9ybVNjcmlwdHMob3JtKS5yZXNldChwcm9qZWN0LCB1bmtub3duT3B0aW9ucykpLFxuICAgICAgICAgIHByb2plY3QsXG4gICAgICAgICAgYXJndlxuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cbiAgfSxcbn07XG5cbmNvbnN0IHJlc3RvcmVCdWlsZGVyID0ge1xuICAuLi5saXRlc3RyZWFtQ29uZmlnQnVpbGRlcixcbiAgb3V0cHV0OiB7XG4gICAgZGVzY3JpcHRpb246ICdPdXRwdXQgcGF0aCBvZiB0aGUgcmVzdG9yZWQgZGF0YWJhc2UuIERlZmF1bHRzIHRvIFwiPGRifGRyaXp6bGV8cHJpc21hPi9yZXN0b3JlZC5zcWxpdGUzXCIuJyxcbiAgICB0eXBlOiAnc3RyaW5nJyxcbiAgfSxcbn0gYXMgY29uc3Q7XG5cbmNvbnN0IHJlc3RvcmVDb21tYW5kOiBDb21tYW5kTW9kdWxlPHVua25vd24sIEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIHJlc3RvcmVCdWlsZGVyPj4gPSB7XG4gIGNvbW1hbmQ6ICdyZXN0b3JlJyxcbiAgZGVzY3JpYmU6IFwiUmVzdG9yZSBEQiBmcm9tIExpdGVzdHJlYW0ncyBiYWNrdXBcIixcbiAgYnVpbGRlcjogcmVzdG9yZUJ1aWxkZXIsXG4gIGFzeW5jIGhhbmRsZXIoYXJndikge1xuICAgIGNvbnN0IGFsbFByb2plY3RzID0gYXdhaXQgZmluZERhdGFiYXNlT3JtUHJvamVjdHMoYXJndik7XG4gICAgZm9yIChjb25zdCB7IG9ybSwgcHJvamVjdCB9IG9mIHByZXBhcmVGb3JSdW5uaW5nRGF0YWJhc2VPcm1Db21tYW5kKCdkYiByZXN0b3JlJywgYWxsUHJvamVjdHMpKSB7XG4gICAgICBjb25zdCBvdXRwdXQgPSBhcmd2Lm91dHB1dCA/PyBnZXREZWZhdWx0UmVzdG9yZU91dHB1dChwcm9qZWN0LCBvcm0pO1xuICAgICAgYXdhaXQgcnVuV2l0aFNwYXduKGdldERhdGFiYXNlT3JtU2NyaXB0cyhvcm0pLnJlc3RvcmUocHJvamVjdCwgb3V0cHV0LCBhcmd2LmNvbmZpZyksIHByb2plY3QsIGFyZ3YpO1xuICAgIH1cbiAgfSxcbn07XG5cbmNvbnN0IHNlZWRCdWlsZGVyID0ge1xuICAuLi5idWlsZGVyLFxuICBmaWxlOiB7XG4gICAgYWxpYXM6ICdmJyxcbiAgICBkZXNjcmlwdGlvbjogJ1BhdGggb2YgdGhlIHNlZWQgc2NyaXB0LicsXG4gICAgdHlwZTogJ3N0cmluZycsXG4gIH0sXG59IGFzIGNvbnN0O1xuXG5jb25zdCBzZWVkQ29tbWFuZDogQ29tbWFuZE1vZHVsZTx1bmtub3duLCBJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBzZWVkQnVpbGRlcj4+ID0ge1xuICBjb21tYW5kOiAnc2VlZCcsXG4gIGRlc2NyaWJlOiAnUG9wdWxhdGUgREIgd2l0aCBzZWVkIGRhdGEnLFxuICBidWlsZGVyOiBzZWVkQnVpbGRlcixcbiAgYXN5bmMgaGFuZGxlcihhcmd2KSB7XG4gICAgY29uc3QgYWxsUHJvamVjdHMgPSBhd2FpdCBmaW5kRGF0YWJhc2VPcm1Qcm9qZWN0cyhhcmd2KTtcbiAgICBmb3IgKGNvbnN0IHsgb3JtLCBwcm9qZWN0IH0gb2YgcHJlcGFyZUZvclJ1bm5pbmdEYXRhYmFzZU9ybUNvbW1hbmQoJ2RiIHNlZWQnLCBhbGxQcm9qZWN0cykpIHtcbiAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bihcbiAgICAgICAgd2l0aExvY2FsRDFJZk5lZWRlZChvcm0sIHByb2plY3QsIGdldERhdGFiYXNlT3JtU2NyaXB0cyhvcm0pLnNlZWQocHJvamVjdCwgYXJndi5maWxlKSksXG4gICAgICAgIHByb2plY3QsXG4gICAgICAgIGFyZ3ZcbiAgICAgICk7XG4gICAgfVxuICB9LFxufTtcblxuY29uc3Qgc3R1ZGlvQnVpbGRlciA9IHtcbiAgLi4uYnVpbGRlcixcbiAgJ2RiLXVybC1vci1wYXRoJzoge1xuICAgIGRlc2NyaXB0aW9uOiAnVVJMIG9yIHBhdGggdG8gdGhlIGRhdGFiYXNlJyxcbiAgICB0eXBlOiAnc3RyaW5nJyxcbiAgfSxcbiAgcmVzdG9yZWQ6IHtcbiAgICBkZXNjcmlwdGlvbjogJ1doZXRoZXIgdG8gb3BlbiB0aGUgZGVmYXVsdCByZXN0b3JlZCBkYXRhYmFzZSAoPGRifHByaXNtYT4vcmVzdG9yZWQuc3FsaXRlMykuJyxcbiAgICB0eXBlOiAnYm9vbGVhbicsXG4gIH0sXG59IGFzIGNvbnN0O1xuXG5jb25zdCBzdHVkaW9Db21tYW5kOiBDb21tYW5kTW9kdWxlPHVua25vd24sIEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIHN0dWRpb0J1aWxkZXI+PiA9IHtcbiAgY29tbWFuZDogJ3N0dWRpbyBbZGItdXJsLW9yLXBhdGhdJyxcbiAgZGVzY3JpYmU6ICdPcGVuIGRhdGFiYXNlIHN0dWRpbycsXG4gIGJ1aWxkZXI6IHN0dWRpb0J1aWxkZXIsXG4gIGFzeW5jIGhhbmRsZXIoYXJndikge1xuICAgIGlmIChhcmd2LnJlc3RvcmVkICYmIGFyZ3YuZGJVcmxPclBhdGgpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignWW91IGNhbm5vdCBzcGVjaWZ5IGJvdGggLS1yZXN0b3JlZCBhbmQgLS1kYi11cmwtb3ItcGF0aC4nKTtcbiAgICB9XG5cbiAgICBjb25zdCBhbGxQcm9qZWN0cyA9IGF3YWl0IGZpbmREYXRhYmFzZU9ybVByb2plY3RzKGFyZ3YpO1xuICAgIGNvbnN0IHVua25vd25PcHRpb25zID0gZXh0cmFjdFVua25vd25PcHRpb25zKGFyZ3YsIFsnZGItdXJsLW9yLXBhdGgnLCAncmVzdG9yZWQnXSk7XG4gICAgZm9yIChjb25zdCB7IG9ybSwgcHJvamVjdCB9IG9mIHByZXBhcmVGb3JSdW5uaW5nRGF0YWJhc2VPcm1Db21tYW5kKCdkYiBzdHVkaW8nLCBhbGxQcm9qZWN0cykpIHtcbiAgICAgIGNvbnN0IGRiVXJsT3JQYXRoID0gYXJndi5yZXN0b3JlZFxuICAgICAgICA/IHByb2plY3QucGFja2FnZUpzb24uZGVwZW5kZW5jaWVzPy5ibGl0elxuICAgICAgICAgID8gJ2RiL3Jlc3RvcmVkLnNxbGl0ZTMnXG4gICAgICAgICAgOiAncHJpc21hL3Jlc3RvcmVkLnNxbGl0ZTMnXG4gICAgICAgIDogYXJndi5kYlVybE9yUGF0aD8udG9TdHJpbmcoKTtcbiAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bihcbiAgICAgICAgd2l0aExvY2FsRDFJZk5lZWRlZChvcm0sIHByb2plY3QsIGdldERhdGFiYXNlT3JtU2NyaXB0cyhvcm0pLnN0dWRpbyhwcm9qZWN0LCBkYlVybE9yUGF0aCwgdW5rbm93bk9wdGlvbnMpKSxcbiAgICAgICAgcHJvamVjdCxcbiAgICAgICAgYXJndlxuICAgICAgKTtcbiAgICB9XG4gIH0sXG59O1xuXG5jb25zdCBkZWZhdWx0Q29tbWFuZEJ1aWxkZXIgPSB7IGFyZ3M6IHsgdHlwZTogJ2FycmF5JyB9IH0gYXMgY29uc3Q7XG5cbmNvbnN0IGRlZmF1bHRDb21tYW5kOiBDb21tYW5kTW9kdWxlPHVua25vd24sIEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIGRlZmF1bHRDb21tYW5kQnVpbGRlcj4+ID0ge1xuICBjb21tYW5kOiAnJDAgPGFyZ3MuLj4nLFxuICBkZXNjcmliZTpcbiAgICBcIlBhc3MgdGhlIGNvbW1hbmQgYW5kIGFyZ3VtZW50cyB0byB0aGUgZGV0ZWN0ZWQgT1JNIGFzIGlzLiBBZGRpdGlvbmFsIFByaXNtYSBmbGFncyBjYW4gYWxzbyBiZSBmb3J3YXJkZWQgYWZ0ZXIgJy0tJy5cIixcbiAgYnVpbGRlcjogZGVmYXVsdENvbW1hbmRCdWlsZGVyLFxuICBhc3luYyBoYW5kbGVyKGFyZ3YpIHtcbiAgICBjb25zdCBhbGxQcm9qZWN0cyA9IGF3YWl0IGZpbmREYXRhYmFzZU9ybVByb2plY3RzKGFyZ3YpO1xuICAgIGNvbnN0IHNjcmlwdCA9IChhcmd2LmFyZ3M/LmpvaW4oJyAnKSA/PyAnJykudHJpbUVuZCgpO1xuICAgIGNvbnN0IHVua25vd25PcHRpb25zID0gZXh0cmFjdFVua25vd25PcHRpb25zKGFyZ3YsIFsnYXJncyddKTtcbiAgICBjb25zdCBmdWxsQ29tbWFuZCA9IFtzY3JpcHQsIHVua25vd25PcHRpb25zXS5maWx0ZXIoQm9vbGVhbikuam9pbignICcpO1xuICAgIGZvciAoY29uc3QgeyBvcm0sIHByb2plY3QgfSBvZiBwcmVwYXJlRm9yUnVubmluZ0RhdGFiYXNlT3JtQ29tbWFuZChgZGIgJHtmdWxsQ29tbWFuZH1gLCBhbGxQcm9qZWN0cykpIHtcbiAgICAgIGNvbnN0IGNvbW1hbmQgPSBvcm0gPT09ICdwcmlzbWEnID8gYFBSSVNNQSAke2Z1bGxDb21tYW5kfWAgOiBidWlsZERyaXp6bGVLaXRDb21tYW5kKHByb2plY3QsIGZ1bGxDb21tYW5kKTtcbiAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bih3aXRoTG9jYWxEMUlmTmVlZGVkKG9ybSwgcHJvamVjdCwgY29tbWFuZCksIHByb2plY3QsIGFyZ3YpO1xuICAgIH1cbiAgfSxcbn07XG5cbi8qKlxuICogTWFrZSBEcml6emxlIGNvbW1hbmRzIHdvcmsgb24gQ2xvdWRmbGFyZSBEMSBwcm9qZWN0cyBieSBwb2ludGluZyBEQVRBQkFTRV9VUkxcbiAqIGF0IHRoZSBsb2NhbCBtaW5pZmxhcmUgRDEgU1FMaXRlIGZpbGUuXG4gKi9cbmZ1bmN0aW9uIHdpdGhMb2NhbEQxSWZOZWVkZWQob3JtOiBEYXRhYmFzZU9ybSwgcHJvamVjdDogUHJvamVjdCwgc2NyaXB0OiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gb3JtID09PSAnZHJpenpsZScgPyB3cmFwV2l0aExvY2FsRDFEYXRhYmFzZVVybChwcm9qZWN0LCBzY3JpcHQpIDogc2NyaXB0O1xufVxuXG5mdW5jdGlvbiBjcmVhdGVMaXRlc3RyZWFtQ29uZmlnKHByb2plY3Q6IFByb2plY3QsIG9ybTogRGF0YWJhc2VPcm0sIGNvbmZpZ1BhdGg6IHN0cmluZyk6IHZvaWQge1xuICBjb25zdCBkYlBhdGggPSBnZXRMaXRlc3RyZWFtRGJQYXRoKHByb2plY3QsIG9ybSk7XG4gIGNvbnN0IHJlcXVpcmVkRW52VmFycyA9IHtcbiAgICBDTE9VREZMQVJFX1IyX0xJVEVTVFJFQU1fQUNDT1VOVF9JRDogcHJvamVjdC5lbnYuQ0xPVURGTEFSRV9SMl9MSVRFU1RSRUFNX0FDQ09VTlRfSUQsXG4gICAgQ0xPVURGTEFSRV9SMl9MSVRFU1RSRUFNX0JVQ0tFVF9OQU1FOiBwcm9qZWN0LmVudi5DTE9VREZMQVJFX1IyX0xJVEVTVFJFQU1fQlVDS0VUX05BTUUsXG4gICAgQ0xPVURGTEFSRV9SMl9MSVRFU1RSRUFNX0FDQ0VTU19LRVlfSUQ6IHByb2plY3QuZW52LkNMT1VERkxBUkVfUjJfTElURVNUUkVBTV9BQ0NFU1NfS0VZX0lELFxuICAgIENMT1VERkxBUkVfUjJfTElURVNUUkVBTV9TRUNSRVRfQUNDRVNTX0tFWTogcHJvamVjdC5lbnYuQ0xPVURGTEFSRV9SMl9MSVRFU1RSRUFNX1NFQ1JFVF9BQ0NFU1NfS0VZLFxuICB9IGFzIGNvbnN0O1xuICBjb25zdCBtaXNzaW5nRW52VmFycyA9IE9iamVjdC5lbnRyaWVzKHJlcXVpcmVkRW52VmFycylcbiAgICAuZmlsdGVyKChbLCB2YWx1ZV0pID0+ICF2YWx1ZSlcbiAgICAubWFwKChba2V5XSkgPT4ga2V5KTtcbiAgaWYgKG1pc3NpbmdFbnZWYXJzLmxlbmd0aCA+IDApIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYE1pc3NpbmcgZW52aXJvbm1lbnQgdmFyaWFibGVzIGZvciBMaXRlc3RyZWFtOiAke21pc3NpbmdFbnZWYXJzLmpvaW4oJywgJyl9YCk7XG4gIH1cblxuICBjb25zdCBsaXRlc3RyZWFtQ29uZmlnID0gYHNuYXBzaG90OlxuICBpbnRlcnZhbDogMjRoICAjIENyZWF0ZSBhIGJhY2t1cCBwZXIgZGF5XG4gIHJldGVudGlvbjogNzJoICMgS2VlcCBiYWNrdXBzIGZvciAzIGRheXNcbmRiczpcbiAgLSBwYXRoOiAke2RiUGF0aH1cbiAgICBidXN5LXRpbWVvdXQ6IDVzXG4gICAgY2hlY2twb2ludC1pbnRlcnZhbDogMW1cbiAgICByZXBsaWNhOlxuICAgICAgdHlwZTogczNcbiAgICAgIGVuZHBvaW50OiBodHRwczovLyR7cmVxdWlyZWRFbnZWYXJzLkNMT1VERkxBUkVfUjJfTElURVNUUkVBTV9BQ0NPVU5UX0lEfS5yMi5jbG91ZGZsYXJlc3RvcmFnZS5jb21cbiAgICAgIGJ1Y2tldDogJHtyZXF1aXJlZEVudlZhcnMuQ0xPVURGTEFSRV9SMl9MSVRFU1RSRUFNX0JVQ0tFVF9OQU1FfVxuICAgICAgYWNjZXNzLWtleS1pZDogJHtyZXF1aXJlZEVudlZhcnMuQ0xPVURGTEFSRV9SMl9MSVRFU1RSRUFNX0FDQ0VTU19LRVlfSUR9XG4gICAgICBzZWNyZXQtYWNjZXNzLWtleTogJHtyZXF1aXJlZEVudlZhcnMuQ0xPVURGTEFSRV9SMl9MSVRFU1RSRUFNX1NFQ1JFVF9BQ0NFU1NfS0VZfVxuICAgICAgc3luYy1pbnRlcnZhbDogMW1cbmA7XG5cbiAgdHJ5IHtcbiAgICBmcy53cml0ZUZpbGVTeW5jKGNvbmZpZ1BhdGgsIGxpdGVzdHJlYW1Db25maWcpO1xuICAgIGNvbnNvbGUuaW5mbyhgR2VuZXJhdGVkICR7Y29uZmlnUGF0aH1gKTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBjb25zdCByZWFzb24gPSBlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6IFN0cmluZyhlcnJvcik7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBGYWlsZWQgdG8gd3JpdGUgJHtjb25maWdQYXRofTogJHtyZWFzb259YCwge1xuICAgICAgY2F1c2U6IGVycm9yLFxuICAgIH0pO1xuICB9XG59XG5cbmZ1bmN0aW9uIGdldERlZmF1bHRSZXN0b3JlT3V0cHV0KHByb2plY3Q6IFByb2plY3QsIG9ybTogRGF0YWJhc2VPcm0pOiBzdHJpbmcge1xuICBpZiAob3JtID09PSAncHJpc21hJylcbiAgICByZXR1cm4gcHJvamVjdC5wYWNrYWdlSnNvbi5kZXBlbmRlbmNpZXM/LmJsaXR6ID8gJ2RiL3Jlc3RvcmVkLnNxbGl0ZTMnIDogJ3ByaXNtYS9yZXN0b3JlZC5zcWxpdGUzJztcbiAgcmV0dXJuICdkcml6emxlL3Jlc3RvcmVkLnNxbGl0ZTMnO1xufVxuXG5mdW5jdGlvbiBnZXRMaXRlc3RyZWFtRGJQYXRoKHByb2plY3Q6IFByb2plY3QsIG9ybTogRGF0YWJhc2VPcm0pOiBzdHJpbmcge1xuICBpZiAob3JtID09PSAncHJpc21hJykge1xuICAgIGNvbnN0IGRpck5hbWUgPSBwcm9qZWN0LnBhY2thZ2VKc29uLmRlcGVuZGVuY2llcz8uYmxpdHogPyAnZGInIDogJ3ByaXNtYSc7XG4gICAgcmV0dXJuIGAke2Rpck5hbWV9L21vdW50L3Byb2Quc3FsaXRlM2A7XG4gIH1cblxuICBjb25zdCBkYlBhdGggPSBnZXRBYnNvbHV0ZUZpbGVEYXRhYmFzZVVybFBhdGgocHJvamVjdCk7XG4gIGlmICghZGJQYXRoKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCd3YiBkYiBjcmVhdGUtbGl0ZXN0cmVhbS1jb25maWcgZm9yIERyaXp6bGUgcmVxdWlyZXMgZmlsZTogREFUQUJBU0VfVVJMLicpO1xuICB9XG4gIHJldHVybiBkYlBhdGg7XG59XG5cbmludGVyZmFjZSBEYXRhYmFzZU9ybVByb2plY3Qge1xuICBwcm9qZWN0OiBQcm9qZWN0O1xuICBvcm06IERhdGFiYXNlT3JtO1xufVxuXG5hc3luYyBmdW5jdGlvbiBmaW5kRGF0YWJhc2VPcm1Qcm9qZWN0cyhhcmd2OiBFbnZSZWFkZXJPcHRpb25zLCBvcm0/OiBEYXRhYmFzZU9ybSk6IFByb21pc2U8RGF0YWJhc2VPcm1Qcm9qZWN0W10+IHtcbiAgY29uc3QgcHJvamVjdHMgPSBhd2FpdCBmaW5kRGVzY2VuZGFudFByb2plY3RzKGFyZ3YpO1xuICBpZiAoIXByb2plY3RzKSB7XG4gICAgY29uc29sZS5lcnJvcihjaGFsay5yZWQoJ05vIHByb2plY3QgZm91bmQuJykpO1xuICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgfVxuXG4gIGNvbnN0IGZpbHRlcmVkID0gcHJvamVjdHMuZGVzY2VuZGFudHNcbiAgICAubWFwKChwcm9qZWN0KSA9PiAocHJvamVjdC5kYXRhYmFzZU9ybSA/IHsgcHJvamVjdCwgb3JtOiBwcm9qZWN0LmRhdGFiYXNlT3JtIH0gOiB1bmRlZmluZWQpKVxuICAgIC5maWx0ZXIoKHByb2plY3QpOiBwcm9qZWN0IGlzIERhdGFiYXNlT3JtUHJvamVjdCA9PiAhIXByb2plY3QgJiYgKCFvcm0gfHwgcHJvamVjdC5vcm0gPT09IG9ybSkpO1xuICBpZiAoZmlsdGVyZWQubGVuZ3RoID09PSAwKSB7XG4gICAgY29uc29sZS5lcnJvcihjaGFsay5yZWQob3JtID8gYE5vICR7b3JtfSBwcm9qZWN0IGZvdW5kLmAgOiAnTm8gc3VwcG9ydGVkIGRhdGFiYXNlIE9STSBwcm9qZWN0IGZvdW5kLicpKTtcbiAgICBwcm9jZXNzLmV4aXQoMSk7XG4gIH1cbiAgcmV0dXJuIGZpbHRlcmVkO1xufVxuXG5mdW5jdGlvbiBnZXREYXRhYmFzZU9ybVNjcmlwdHMob3JtOiBEYXRhYmFzZU9ybSk6IHR5cGVvZiBwcmlzbWFTY3JpcHRzIHwgdHlwZW9mIGRyaXp6bGVTY3JpcHRzIHtcbiAgcmV0dXJuIG9ybSA9PT0gJ3ByaXNtYScgPyBwcmlzbWFTY3JpcHRzIDogZHJpenpsZVNjcmlwdHM7XG59XG5cbmZ1bmN0aW9uKiBwcmVwYXJlRm9yUnVubmluZ0RhdGFiYXNlT3JtQ29tbWFuZChcbiAgY29tbWFuZE5hbWU6IHN0cmluZyxcbiAgcHJvamVjdHM6IERhdGFiYXNlT3JtUHJvamVjdFtdXG4pOiBHZW5lcmF0b3I8RGF0YWJhc2VPcm1Qcm9qZWN0LCB2b2lkLCB1bmtub3duPiB7XG4gIGNvbnN0IG9ybVByb2plY3RCeVByb2plY3QgPSBuZXcgTWFwKHByb2plY3RzLm1hcCgocHJvamVjdCkgPT4gW3Byb2plY3QucHJvamVjdCwgcHJvamVjdF0pKTtcbiAgZm9yIChjb25zdCBwcm9qZWN0IG9mIHByZXBhcmVGb3JSdW5uaW5nQ29tbWFuZChcbiAgICBjb21tYW5kTmFtZSxcbiAgICBwcm9qZWN0cy5tYXAoKHsgcHJvamVjdCB9KSA9PiBwcm9qZWN0KVxuICApKSB7XG4gICAgY29uc3Qgb3JtUHJvamVjdCA9IG9ybVByb2plY3RCeVByb2plY3QuZ2V0KHByb2plY3QpO1xuICAgIGlmICghb3JtUHJvamVjdCkgdGhyb3cgbmV3IEVycm9yKGBGYWlsZWQgdG8gZGV0ZWN0IGRhdGFiYXNlIE9STSBmb3IgJHtwcm9qZWN0Lm5hbWV9LmApO1xuXG4gICAgeWllbGQgb3JtUHJvamVjdDtcbiAgfVxufVxuXG4vKipcbiAqIEV4dHJhY3QgdW5rbm93biBvcHRpb25zIGZyb20gYXJndiB0byBwYXNzIHRvIE9STSBjb21tYW5kcy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGV4dHJhY3RVbmtub3duT3B0aW9ucyhhcmd2OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiwga25vd25PcHRpb25zOiBzdHJpbmdbXSA9IFtdKTogc3RyaW5nIHtcbiAgY29uc3QgdW5rbm93bk9wdGlvbnM6IHN0cmluZ1tdID0gW107XG5cbiAgLy8gQnVpbGQgbGlzdCBvZiBrbm93biBvcHRpb25zIGZyb20gc2hhcmVkIG9wdGlvbnMgYnVpbGRlcnNcbiAgY29uc3Qgc2hhcmVkT3B0aW9uS2V5cyA9IE9iamVjdC5rZXlzKHNoYXJlZE9wdGlvbnNCdWlsZGVyKTtcbiAgY29uc3Qgc2hhcmVkT3B0aW9uQWxpYXNlcyA9IE9iamVjdC52YWx1ZXMoc2hhcmVkT3B0aW9uc0J1aWxkZXIpXG4gICAgLmZsYXRNYXAoKG9wdGlvbikgPT4ge1xuICAgICAgaWYgKCdhbGlhcycgaW4gb3B0aW9uKSB7XG4gICAgICAgIHJldHVybiBBcnJheS5pc0FycmF5KG9wdGlvbi5hbGlhcykgPyBvcHRpb24uYWxpYXMgOiBbb3B0aW9uLmFsaWFzXTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBbXTtcbiAgICB9KVxuICAgIC5tYXAoU3RyaW5nKTtcblxuICBjb25zdCBhbGxLbm93bk9wdGlvbnMgPSBuZXcgU2V0KFtcbiAgICAuLi5rbm93bk9wdGlvbnMsXG4gICAgLi4uc2hhcmVkT3B0aW9uS2V5cyxcbiAgICAuLi5zaGFyZWRPcHRpb25BbGlhc2VzLFxuICAgIC8vIEludGVybmFsIHlhcmdzIHByb3BlcnRpZXNcbiAgICAnLS0nLFxuICAgICdfJyxcbiAgICAnJDAnLFxuICBdKTtcblxuICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhhcmd2KSkge1xuICAgIGlmICghYWxsS25vd25PcHRpb25zLmhhcyhrZXkpKSB7XG4gICAgICAvLyBTa2lwIGNhbWVsQ2FzZSB2ZXJzaW9ucyBvZiBrZWJhYi1jYXNlIG9wdGlvbnMgdG8gYXZvaWQgZHVwbGljYXRpb25cbiAgICAgIC8vIElmIHdlIGhhdmUgYm90aCAnY3JlYXRlLW9ubHknIGFuZCAnY3JlYXRlT25seScsIHByZWZlciB0aGUga2ViYWItY2FzZSB2ZXJzaW9uXG4gICAgICBjb25zdCBrZWJhYkNhc2VLZXkgPSBrZXkucmVwbGFjZUFsbCgvW0EtWl0vZywgKG1hdGNoKSA9PiBgLSR7bWF0Y2gudG9Mb3dlckNhc2UoKX1gKTtcbiAgICAgIGlmIChrZWJhYkNhc2VLZXkgIT09IGtleSAmJiBhcmd2W2tlYmFiQ2FzZUtleV0gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBjb250aW51ZTsgLy8gU2tpcCBjYW1lbENhc2UgdmVyc2lvbiBpZiBrZWJhYi1jYXNlIGV4aXN0c1xuICAgICAgfVxuXG4gICAgICAvLyBIYW5kbGUgYm9vbGVhbiBmbGFnc1xuICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ2Jvb2xlYW4nICYmIHZhbHVlKSB7XG4gICAgICAgIHVua25vd25PcHRpb25zLnB1c2goYC0tJHtrZXl9YCk7XG4gICAgICB9XG4gICAgICAvLyBIYW5kbGUgc3RyaW5nL251bWJlciB2YWx1ZXNcbiAgICAgIGVsc2UgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycgfHwgdHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJykge1xuICAgICAgICB1bmtub3duT3B0aW9ucy5wdXNoKGAtLSR7a2V5fWAsIFN0cmluZyh2YWx1ZSkpO1xuICAgICAgfVxuICAgICAgLy8gSGFuZGxlIGFycmF5c1xuICAgICAgZWxzZSBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgICAgZm9yIChjb25zdCBpdGVtIG9mIHZhbHVlKSB7XG4gICAgICAgICAgdW5rbm93bk9wdGlvbnMucHVzaChgLS0ke2tleX1gLCBTdHJpbmcoaXRlbSkpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgY29uc3QgcGFzc3Rocm91Z2hBcmdzID0gQXJyYXkuaXNBcnJheShhcmd2WyctLSddKSA/IGFyZ3ZbJy0tJ10ubWFwKFN0cmluZykgOiBbXTtcbiAgcmV0dXJuIGJ1aWxkU2hlbGxDb21tYW5kKFsuLi51bmtub3duT3B0aW9ucywgLi4ucGFzc3Rocm91Z2hBcmdzXSk7XG59XG4iLCJpbXBvcnQgY2hpbGRfcHJvY2VzcyBmcm9tICdub2RlOmNoaWxkX3Byb2Nlc3MnO1xuaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IGNoYWxrIGZyb20gJ2NoYWxrJztcbmltcG9ydCB7IGdsb2JieSB9IGZyb20gJ2dsb2JieSc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VKc29uIH0gZnJvbSAndHlwZS1mZXN0JztcbmltcG9ydCB0eXBlIHsgQXJndW1lbnRzQ2FtZWxDYXNlLCBBcmd2LCBDb21tYW5kTW9kdWxlLCBJbmZlcnJlZE9wdGlvblR5cGVzIH0gZnJvbSAneWFyZ3MnO1xuXG5pbXBvcnQgeyB0cmVlS2lsbCB9IGZyb20gJ0B3aWxsYm9vc3Rlci9zaGFyZWQtbGliLW5vZGUvc3JjJztcblxuaW1wb3J0IHR5cGUgeyBQcm9qZWN0IH0gZnJvbSAnLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQgeyBmaW5kUm9vdEFuZFNlbGZQcm9qZWN0cyB9IGZyb20gJy4uL3Byb2plY3QuanMnO1xuaW1wb3J0IHR5cGUgeyBzaGFyZWRPcHRpb25zQnVpbGRlciB9IGZyb20gJy4uL3NoYXJlZE9wdGlvbnNCdWlsZGVyLmpzJztcbmltcG9ydCB7IHByZXBlbmROb2RlTW9kdWxlc0JpblRvUGF0aCB9IGZyb20gJy4uL3V0aWxzL2JpblBhdGguanMnO1xuaW1wb3J0IHsgaXNDSSB9IGZyb20gJy4uL3V0aWxzL2NpLmpzJztcblxudHlwZSBSZWxlYXNlQXJndiA9IFBhcnRpYWw8QXJndW1lbnRzQ2FtZWxDYXNlPEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIHNoYXJlZE9wdGlvbnNCdWlsZGVyPj4+ICYge1xuICBhcmdzPzogdW5rbm93bltdO1xuICAnLS0nPzogdW5rbm93bltdO1xufTtcblxuZXhwb3J0IGNvbnN0IHJlbGVhc2VDb21tYW5kOiBDb21tYW5kTW9kdWxlID0ge1xuICBjb21tYW5kOiAncmVsZWFzZSBbYXJncy4uXScsXG4gIGRlc2NyaWJlOlxuICAgICdSdW4gc2VtYW50aWMtcmVsZWFzZSAob3IgbXVsdGktc2VtYW50aWMtcmVsZWFzZSkgc28gdGhhdCByZXBvc2l0b3JpZXMgdXNpbmcgQnVuIGlzb2xhdGVkIGluc3RhbGxzIGNhbiBwdWJsaXNoIHRvIG5wbTogJyArXG4gICAgXCJyZWluc3RhbGwgd2l0aCB0aGUgaG9pc3RlZCBsaW5rZXIgKG5wbSBjYW5ub3Qgd2FsayBCdW4ncyBpc29sYXRlZCBub2RlX21vZHVsZXMgbGF5b3V0KSwgXCIgK1xuICAgICdyZXdyaXRlIGB3b3Jrc3BhY2U6YCByYW5nZXMgbnBtIGNhbm5vdCBwYXJzZSwgcnVuIHRoZSByZWxlYXNlLCB0aGVuIHJlc3RvcmUgdGhlIG1vZGlmaWVkIGZpbGVzLiAnICtcbiAgICAnRXh0cmEgYXJndW1lbnRzIChlLmcuIGAtLWRlYnVnYCwgYWZ0ZXIgYC0tYCkgYXJlIGZvcndhcmRlZCB0byB0aGUgcmVsZWFzZSBjb21tYW5kLicsXG4gIGJ1aWxkZXI6ICh5YXJnczogQXJndjx1bmtub3duPikgPT4geWFyZ3MucGFyc2VyQ29uZmlndXJhdGlvbih7ICdwb3B1bGF0ZS0tJzogdHJ1ZSB9KSxcbiAgYXN5bmMgaGFuZGxlcihhcmd2KSB7XG4gICAgYXdhaXQgcmVsZWFzZShhcmd2IGFzIFJlbGVhc2VBcmd2KTtcbiAgfSxcbn07XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiByZWxlYXNlKGFyZ3Y6IFJlbGVhc2VBcmd2LCBwcm9qZWN0UGF0aEZvclRlc3Rpbmc/OiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgcHJvamVjdHMgPSBmaW5kUm9vdEFuZFNlbGZQcm9qZWN0cyhhcmd2LCBmYWxzZSwgcHJvamVjdFBhdGhGb3JUZXN0aW5nKTtcbiAgaWYgKCFwcm9qZWN0cykge1xuICAgIGNvbnNvbGUuZXJyb3IoY2hhbGsucmVkKCdObyBwcm9qZWN0IGZvdW5kLicpKTtcbiAgICBwcm9jZXNzLmV4aXQoMSk7XG4gIH1cbiAgLy8gc2VtYW50aWMtcmVsZWFzZSBtdXN0IHJ1biBhdCB0aGUgcmVwb3NpdG9yeSByb290OiBpdCByZWFkcyB0aGUgZ2l0IHJlcG8gYW5kLCBmb3IgbW9ub3JlcG9zLFxuICAvLyBtdWx0aS1zZW1hbnRpYy1yZWxlYXNlIHdhbGtzIHRoZSB3b3Jrc3BhY2VzIGl0c2VsZi5cbiAgY29uc3QgcHJvamVjdCA9IHByb2plY3RzLnJvb3Q7XG5cbiAgLy8gTWFwcyBhIG11dGF0ZWQgZmlsZSB0byBpdHMgcHJlLXJlbGVhc2UgY29udGVudCAocmF3IGJ5dGVzIOKAlCBidW4ubG9ja2IgaXMgYmluYXJ5KTsgYHVuZGVmaW5lZGBcbiAgLy8gbWFya3MgYSBmaWxlIHRoYXQgZGlkIG5vdCBleGlzdCBhbmQgbXVzdCBiZSBkZWxldGVkIG9uIHJlc3RvcmUgKGUuZy4gYSBjcmVhdGVkIGxvY2tmaWxlKS5cbiAgY29uc3QgbW9kaWZpZWRGaWxlcyA9IG5ldyBNYXA8c3RyaW5nLCBCdWZmZXIgfCB1bmRlZmluZWQ+KCk7XG4gIC8vIFdpdGggYSBoYW5kbGVyIGluc3RhbGxlZCwgU0lHSU5UL1NJR1RFUk0gbm8gbG9uZ2VyIHRlcm1pbmF0ZSB0aGlzIHByb2Nlc3MsIHNvIHRoZVxuICAvLyBmaW5hbGx5LXJlc3RvcmUgYWx3YXlzIGV4ZWN1dGVzIGFuZCB0aGUgc2lnbmFsIGlzIHJlLXJhaXNlZCBhZnRlcndhcmRzLiBUaGUgaGFuZGxlciBhbHNvXG4gIC8vIEZPUldBUkRTIHRoZSBzaWduYWwgdG8gdGhlIHJ1bm5pbmcgY2hpbGQ6IGNoaWxkcmVuIGFyZSBzcGF3bmVkIGFzeW5jaHJvbm91c2x5IChuZXZlclxuICAvLyBzcGF3blN5bmMsIHdoaWNoIHdvdWxkIGJsb2NrIHRoZSBldmVudCBsb29wIGFuZCBkZWZlciB0aGUgaGFuZGxlciB1bnRpbCBhZnRlciB0aGUgY2hpbGQg4oCUXG4gIC8vIGFuZCBhIHB1Ymxpc2gg4oCUIGNvbXBsZXRlZCksIHNvIGEgc2lnbmFsIHRhcmdldGVkIGF0IHRoaXMgcHJvY2VzcyBhbG9uZSBzdGlsbCBjYW5jZWxzIHRoZVxuICAvLyBjaGlsZCBwcm9tcHRseS5cbiAgbGV0IHJlY2VpdmVkU2lnbmFsOiBOb2RlSlMuU2lnbmFscyB8IHVuZGVmaW5lZDtcbiAgY29uc3QgYWN0aXZlQ2hpbGQ6IEFjdGl2ZUNoaWxkUmVmID0geyBjdXJyZW50OiB1bmRlZmluZWQgfTtcbiAgY29uc3Qgc2lnbmFsSGFuZGxlciA9IChzaWduYWw6IE5vZGVKUy5TaWduYWxzKTogdm9pZCA9PiB7XG4gICAgcmVjZWl2ZWRTaWduYWwgPSBzaWduYWw7XG4gICAgLy8gdHJlZUtpbGwgKG5vdCBjaGlsZC5raWxsKTogc2VtYW50aWMtcmVsZWFzZSBhbmQgYnVuIGluc3RhbGwgc3Bhd24gdGhlaXIgb3duIHN1YnByb2Nlc3Nlc1xuICAgIC8vIChucG0gcHVibGlzaCwgZ2l0IHB1c2gsIC4uLiksIHdoaWNoIG11c3Qgbm90IGtlZXAgcHVibGlzaGluZyBhZnRlciB3YiByZXBvcnRzIGNhbmNlbGxhdGlvbi5cbiAgICAvLyB0cmVlS2lsbCBUSFJPV1MgKG1pc3NpbmcvdGltaW5nLW91dCBgcHNgLCBFUEVSTSksIGFuZCBhbiBleGNlcHRpb24gZXNjYXBpbmcgYSBzaWduYWxcbiAgICAvLyBsaXN0ZW5lciB3b3VsZCB0ZXJtaW5hdGUgdGhlIHByb2Nlc3MgYW5kIHNraXAgdGhlIHJlc3RvcmluZyBmaW5hbGx5IOKAlCBzbyBkZWdyYWRlIHRvXG4gICAgLy8ga2lsbGluZyB0aGUgZGlyZWN0IGNoaWxkIGluc3RlYWQuXG4gICAgdHJ5IHtcbiAgICAgIGlmIChhY3RpdmVDaGlsZC5jdXJyZW50Py5waWQpIHRyZWVLaWxsKGFjdGl2ZUNoaWxkLmN1cnJlbnQucGlkLCBzaWduYWwpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBjb25zb2xlLmVycm9yKGNoYWxrLnJlZChgRmFpbGVkIHRvIHRlcm1pbmF0ZSB0aGUgcmVsZWFzZSBjaGlsZCBwcm9jZXNzIHRyZWU6ICR7U3RyaW5nKGVycm9yKX1gKSk7XG4gICAgICBhY3RpdmVDaGlsZC5jdXJyZW50Py5raWxsKHNpZ25hbCk7XG4gICAgfVxuICB9O1xuICBjb25zdCBndWFyZGVkU2lnbmFsczogTm9kZUpTLlNpZ25hbHNbXSA9IFsnU0lHSU5UJywgJ1NJR1RFUk0nXTtcbiAgZm9yIChjb25zdCBzaWduYWwgb2YgZ3VhcmRlZFNpZ25hbHMpIHByb2Nlc3Mub24oc2lnbmFsLCBzaWduYWxIYW5kbGVyKTtcblxuICBsZXQgZXhpdENvZGUgPSAwO1xuICBsZXQgcmVsZWFzZVJhblN1Y2Nlc3NmdWxseSA9IGZhbHNlO1xuICB0cnkge1xuICAgIGF3YWl0IHByZXBhcmVOcG1Db21wYXRpYmxlTGF5b3V0KHByb2plY3QsIGFyZ3YsIG1vZGlmaWVkRmlsZXMsIGFjdGl2ZUNoaWxkKTtcbiAgICAvLyBBIHNpZ25hbCBtYXkgaGF2ZSBhcnJpdmVkIGJldHdlZW4gY2hpbGRyZW4gKG5vdGhpbmcgdG8gZm9yd2FyZCB0byBhdCB0aGF0IGluc3RhbnQpLCBzbyBpdFxuICAgIC8vIG11c3QgYmUgY2hlY2tlZCBleHBsaWNpdGx5IGJlZm9yZSBhbnl0aGluZyBwdWJsaXNoZXMuXG4gICAgaWYgKHJlY2VpdmVkU2lnbmFsKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEFib3J0ZWQgYnkgJHtyZWNlaXZlZFNpZ25hbH0gYmVmb3JlIHJ1bm5pbmcgdGhlIHJlbGVhc2UuYCk7XG4gICAgfVxuICAgIGV4aXRDb2RlID0gYXdhaXQgcnVuU2VtYW50aWNSZWxlYXNlKHByb2plY3QsIGFyZ3YsIGFjdGl2ZUNoaWxkKTtcbiAgICAvLyBSZWNvcmRlZCBzZXBhcmF0ZWx5IGZyb20gcmVjZWl2ZWRTaWduYWw6IGEgc2lnbmFsIGFycml2aW5nIEFGVEVSIGEgc3VjY2Vzc2Z1bCBwdWJsaXNoIG11c3RcbiAgICAvLyBub3QgZGVtb3RlIHRoZSByZXN0b3JlIHRvIGJ5dGUtZm9yLWJ5dGUgKHRoYXQgd291bGQgcmV2ZXJ0IHRoZSBwdWJsaXNoZWQgdmVyc2lvbiBidW1wcykuXG4gICAgcmVsZWFzZVJhblN1Y2Nlc3NmdWxseSA9IGV4aXRDb2RlID09PSAwO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIC8vIEVycm9ycyBtdXN0IHVud2luZCB0aHJvdWdoIHRoaXMgdHJ5IChuZXZlciBgcHJvY2Vzcy5leGl0YCBpbnNpZGUgaXQpOiB0aGUgcmVzdG9yZSBiZWxvdyBpc1xuICAgIC8vIHRoZSBvbmx5IHRoaW5nIHRoYXQgdW5kb2VzIHRoZSBidW5maWcvcGFja2FnZS5qc29uIG11dGF0aW9ucy5cbiAgICBjb25zb2xlLmVycm9yKGNoYWxrLnJlZChTdHJpbmcoZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiBlcnJvcikpKTtcbiAgICBleGl0Q29kZSA9IDE7XG4gIH0gZmluYWxseSB7XG4gICAgLy8gT24gZmFpbHVyZSBvciBpbnRlcnJ1cHRpb24sIHJlc3RvcmUgYnl0ZS1mb3ItYnl0ZTogc2VtYW50aWMtcmVsZWFzZSBtYXkgaGF2ZSBsZWZ0IFBBUlRJQUxcbiAgICAvLyBlZGl0cyAoZS5nLiBhIHZlcnNpb24gYnVtcCB3aXRob3V0IGEgcHVibGlzaCksIHdoaWNoIG11c3Qgbm90IHN1cnZpdmUuIFRoZSBzZW1hbnRpY1xuICAgIC8vIHdvcmtzcGFjZS1yYW5nZSByZXN0b3JlIGlzIHJlc2VydmVkIGZvciBhIHN1Y2Nlc3NmdWwgcmVsZWFzZS5cbiAgICBjb25zdCByZXN0b3JlZEZpbGVQYXRoczogc3RyaW5nW10gPSBbXTtcbiAgICBmb3IgKGNvbnN0IFtmaWxlUGF0aCwgY29udGVudF0gb2YgbW9kaWZpZWRGaWxlcykge1xuICAgICAgaWYgKHJlc3RvcmVNb2RpZmllZEZpbGUoZmlsZVBhdGgsIGNvbnRlbnQsIHJlbGVhc2VSYW5TdWNjZXNzZnVsbHkpKSByZXN0b3JlZEZpbGVQYXRocy5wdXNoKGZpbGVQYXRoKTtcbiAgICB9XG4gICAgaWYgKHJlc3RvcmVkRmlsZVBhdGhzLmxlbmd0aCA+IDApIHtcbiAgICAgIGNvbnNvbGUuaW5mbyhcbiAgICAgICAgY2hhbGsuY3lhbihgUmVzdG9yZWQgJHtyZXN0b3JlZEZpbGVQYXRocy5tYXAoKHApID0+IHBhdGgucmVsYXRpdmUocHJvamVjdC5kaXJQYXRoLCBwKSkuam9pbignLCAnKX0uYClcbiAgICAgICk7XG4gICAgfVxuICAgIC8vIFRoZSBoaW50IGFwcGxpZXMgb25seSB3aGVuIHRoZSBob2lzdGVkIHJlaW5zdGFsbCBhY3R1YWxseSByYW47IGJ1bmZpZy50b21sIGlzIHNuYXBzaG90dGVkXG4gICAgLy8gZXhhY3RseSBpbiB0aGF0IGJyYW5jaC5cbiAgICBjb25zdCByZWluc3RhbGxlZFdpdGhIb2lzdGVkTGlua2VyID0gWy4uLm1vZGlmaWVkRmlsZXMua2V5cygpXS5zb21lKFxuICAgICAgKGZpbGVQYXRoKSA9PiBwYXRoLmJhc2VuYW1lKGZpbGVQYXRoKSA9PT0gJ2J1bmZpZy50b21sJ1xuICAgICk7XG4gICAgaWYgKHJlaW5zdGFsbGVkV2l0aEhvaXN0ZWRMaW5rZXIgJiYgIWlzQ0kocHJvamVjdC5lbnYuQ0kpKSB7XG4gICAgICBjb25zb2xlLmluZm8oXG4gICAgICAgIGNoYWxrLnllbGxvdyhcbiAgICAgICAgICAnbm9kZV9tb2R1bGVzIG5vdyB1c2VzIHRoZSBob2lzdGVkIGxheW91dDsgcnVuIGEgY2xlYW4gcmVpbnN0YWxsIChgcm0gLXJmIG5vZGVfbW9kdWxlcyBwYWNrYWdlcy8qL25vZGVfbW9kdWxlcyAmJiBidW4gaW5zdGFsbGApIHRvIHJlc3RvcmUgdGhlIGlzb2xhdGVkIGxheW91dC4nXG4gICAgICAgIClcbiAgICAgICk7XG4gICAgfVxuICAgIGZvciAoY29uc3Qgc2lnbmFsIG9mIGd1YXJkZWRTaWduYWxzKSBwcm9jZXNzLm9mZihzaWduYWwsIHNpZ25hbEhhbmRsZXIpO1xuICB9XG4gIGlmIChyZWNlaXZlZFNpZ25hbCkge1xuICAgIHByb2Nlc3Mua2lsbChwcm9jZXNzLnBpZCwgcmVjZWl2ZWRTaWduYWwpO1xuICAgIHJldHVybjtcbiAgfVxuICBpZiAoZXhpdENvZGUgIT09IDApIHtcbiAgICBwcm9jZXNzLmV4aXQoZXhpdENvZGUpO1xuICB9XG59XG5cbmludGVyZmFjZSBBY3RpdmVDaGlsZFJlZiB7XG4gIGN1cnJlbnQ6IGNoaWxkX3Byb2Nlc3MuQ2hpbGRQcm9jZXNzIHwgdW5kZWZpbmVkO1xufVxuXG4vKipcbiAqIFNwYXduIGFzeW5jaHJvbm91c2x5IGFuZCBhd2FpdCB0aGUgZXhpdCBzdGF0dXMuIFRoZSBldmVudCBsb29wIHN0YXlzIGZyZWUsIHNvIHBhcmVudC1vbmx5XG4gKiBzaWduYWxzIGFyZSBoYW5kbGVkIHByb21wdGx5IGFuZCBmb3J3YXJkZWQgdG8gdGhlIGNoaWxkIGJ5IHJlbGVhc2UoKSdzIHNpZ25hbCBoYW5kbGVyLlxuICovXG5hc3luYyBmdW5jdGlvbiBzcGF3bkFuZFdhaXQoXG4gIGFjdGl2ZUNoaWxkOiBBY3RpdmVDaGlsZFJlZixcbiAgY29tbWFuZDogc3RyaW5nLFxuICBhcmdzOiBzdHJpbmdbXSxcbiAgb3B0aW9uczogY2hpbGRfcHJvY2Vzcy5TcGF3bk9wdGlvbnNcbik6IFByb21pc2U8bnVtYmVyPiB7XG4gIHJldHVybiBhd2FpdCBuZXcgUHJvbWlzZTxudW1iZXI+KChyZXNvbHZlKSA9PiB7XG4gICAgY29uc3QgY2hpbGQgPSBjaGlsZF9wcm9jZXNzLnNwYXduKGNvbW1hbmQsIGFyZ3MsIG9wdGlvbnMpO1xuICAgIGFjdGl2ZUNoaWxkLmN1cnJlbnQgPSBjaGlsZDtcbiAgICBjaGlsZC5vbignZXJyb3InLCAoZXJyb3IpID0+IHtcbiAgICAgIGFjdGl2ZUNoaWxkLmN1cnJlbnQgPSB1bmRlZmluZWQ7XG4gICAgICBjb25zb2xlLmVycm9yKGNoYWxrLnJlZChTdHJpbmcoZXJyb3IpKSk7XG4gICAgICByZXNvbHZlKDEpO1xuICAgIH0pO1xuICAgIGNoaWxkLm9uKCdleGl0JywgKGNvZGUpID0+IHtcbiAgICAgIGFjdGl2ZUNoaWxkLmN1cnJlbnQgPSB1bmRlZmluZWQ7XG4gICAgICByZXNvbHZlKGNvZGUgPz8gMSk7XG4gICAgfSk7XG4gIH0pO1xufVxuXG4vKipcbiAqIE1ha2UgdGhlIGNoZWNrb3V0IGRpZ2VzdGlibGUgZm9yIG5wbSwgd2hpY2ggc2VtYW50aWMtcmVsZWFzZSdzIG5wbSBwbHVnaW4gc2hlbGxzIG91dCB0byBmb3JcbiAqIGBucG0gdmVyc2lvbmAgLyBgbnBtIHB1Ymxpc2hgOlxuICogMS4gbnBtJ3MgYXJib3Jpc3QgY2Fubm90IHdhbGsgQnVuJ3MgSVNPTEFURUQgbm9kZV9tb2R1bGVzIGxheW91dCAodGhlIGAuYnVuYCBzeW1saW5rIGZhcm0pLCBzb1xuICogICAgY2xlYW4tcmVpbnN0YWxsIHdpdGggdGhlIGhvaXN0ZWQgbGlua2VyIGZpcnN0LiBBIG5vbi1jbGVhbiBsaW5rZXIgc3dpdGNoIHdvdWxkIGxlYXZlIHN0YWxlXG4gKiAgICBnbG9iYWwtc3RvcmUgc3ltbGlua3MgYmVoaW5kIChwYWNrYWdlcyB0aGVuIHJlc29sdmUgZnJvbSB+Ly5idW4vaW5zdGFsbC9jYWNoZS9saW5rcyB3aGVyZVxuICogICAgcGhhbnRvbSBkZXBlbmRlbmNpZXMgYXJlIHVucmVhY2hhYmxlKSwgc28gZXZlcnkgbm9kZV9tb2R1bGVzIGRpcmVjdG9yeSBpcyB3aXBlZCBmaXJzdC5cbiAqIDIuIG5wbSBjYW5ub3QgcGFyc2UgYHdvcmtzcGFjZTpgIHNwZWNpZmllcnMsIHdoaWxlIEJ1biBSRVFVSVJFUyB0aGUgcHJvdG9jb2wgc28gYSBjb2xkIGluc3RhbGxcbiAqICAgIGxpbmtzIHRoZSB3b3Jrc3BhY2Ug4oCUIHNvIHJld3JpdGUgdGhlIHJhbmdlcyB0byBgKmAgQUZURVIgdGhlIHJlaW5zdGFsbCAoQnVuIG11c3Qgc3RpbGwgc2VlXG4gKiAgICB0aGUgcHJvdG9jb2wgd2hpbGUgaW5zdGFsbGluZzsgbnBtIG9ubHkgbmVlZHMgdGhlIG1hbmlmZXN0IFRFWFQgdG8gYmUgcGFyc2VhYmxlKS4gVGhlXG4gKiAgICBhZmZlY3RlZCBtYW5pZmVzdHMgYXJlIHByaXZhdGUvdW5wdWJsaXNoZWQgb3IgcmV3cml0dGVuIGJ5IHRoZSBucG0gcGx1Z2luIG9uIHB1Ymxpc2guXG4gKiBBbGwgbXV0YXRpb25zIGFyZSByZXN0b3JlZCBieSB0aGUgY2FsbGVyIGFmdGVyIHRoZSByZWxlYXNlLlxuICovXG5hc3luYyBmdW5jdGlvbiBwcmVwYXJlTnBtQ29tcGF0aWJsZUxheW91dChcbiAgcHJvamVjdDogUHJvamVjdCxcbiAgYXJndjogUmVsZWFzZUFyZ3YsXG4gIG1vZGlmaWVkRmlsZXM6IE1hcDxzdHJpbmcsIEJ1ZmZlciB8IHVuZGVmaW5lZD4sXG4gIGFjdGl2ZUNoaWxkOiBBY3RpdmVDaGlsZFJlZlxuKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IGJ1bmZpZ1BhdGggPSBwYXRoLmpvaW4ocHJvamVjdC5kaXJQYXRoLCAnYnVuZmlnLnRvbWwnKTtcbiAgY29uc3QgYnVuZmlnID0gZnMuZXhpc3RzU3luYyhidW5maWdQYXRoKSA/IGZzLnJlYWRGaWxlU3luYyhidW5maWdQYXRoLCAndXRmOCcpIDogdW5kZWZpbmVkO1xuICBjb25zdCBob2lzdGVkQnVuZmlnID0gYnVuZmlnID09PSB1bmRlZmluZWQgPyB1bmRlZmluZWQgOiBidWlsZEhvaXN0ZWRCdW5maWcoYnVuZmlnKTtcbiAgaWYgKGJ1bmZpZyAhPT0gdW5kZWZpbmVkICYmIGhvaXN0ZWRCdW5maWcgIT09IGJ1bmZpZykge1xuICAgIGNvbnNvbGUuaW5mbyhjaGFsay5jeWFuKCdDbGVhbi1yZWluc3RhbGxpbmcgd2l0aCB0aGUgaG9pc3RlZCBsaW5rZXIgc28gbnBtIGNhbiB3YWxrIG5vZGVfbW9kdWxlcy4uLicpKTtcbiAgICBpZiAoIWFyZ3YuZHJ5UnVuKSB7XG4gICAgICBtb2RpZmllZEZpbGVzLnNldChidW5maWdQYXRoLCBCdWZmZXIuZnJvbShidW5maWcsICd1dGY4JykpO1xuICAgICAgLy8gVGhlIGhvaXN0ZWQgcmVpbnN0YWxsIG1heSByZXdyaXRlIChvciBjcmVhdGUpIHRoZSBsb2NrZmlsZTsgc25hcHNob3QgdGhlIHJhdyBieXRlcyBzbyBhXG4gICAgICAvLyBzdWNjZXNzZnVsIHJlbGVhc2UgbGVhdmVzIG5vIHRyYWNrZWQgb3IgdW50cmFja2VkIGxvY2tmaWxlIGNoYW5nZXMgYmVoaW5kLlxuICAgICAgZm9yIChjb25zdCBsb2NrRmlsZU5hbWUgb2YgWydidW4ubG9jaycsICdidW4ubG9ja2InXSkge1xuICAgICAgICBjb25zdCBsb2NrRmlsZVBhdGggPSBwYXRoLmpvaW4ocHJvamVjdC5kaXJQYXRoLCBsb2NrRmlsZU5hbWUpO1xuICAgICAgICBtb2RpZmllZEZpbGVzLnNldChsb2NrRmlsZVBhdGgsIGZzLmV4aXN0c1N5bmMobG9ja0ZpbGVQYXRoKSA/IGZzLnJlYWRGaWxlU3luYyhsb2NrRmlsZVBhdGgpIDogdW5kZWZpbmVkKTtcbiAgICAgIH1cbiAgICAgIGZzLndyaXRlRmlsZVN5bmMoYnVuZmlnUGF0aCwgaG9pc3RlZEJ1bmZpZyA/PyAnJywgJ3V0ZjgnKTtcbiAgICAgIGZvciAoY29uc3QgcGFja2FnZURpclBhdGggb2YgW3Byb2plY3QuZGlyUGF0aCwgLi4uKGF3YWl0IGZpbmRXb3Jrc3BhY2VQYWNrYWdlRGlycyhwcm9qZWN0KSldKSB7XG4gICAgICAgIGZzLnJtU3luYyhwYXRoLmpvaW4ocGFja2FnZURpclBhdGgsICdub2RlX21vZHVsZXMnKSwgeyBmb3JjZTogdHJ1ZSwgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICAgICAgfVxuICAgICAgY29uc3QgaW5zdGFsbFN0YXR1cyA9IGF3YWl0IHNwYXduQW5kV2FpdChhY3RpdmVDaGlsZCwgJ2J1bicsIFsnaW5zdGFsbCddLCB7XG4gICAgICAgIGN3ZDogcHJvamVjdC5kaXJQYXRoLFxuICAgICAgICBlbnY6IHByb2plY3QuZW52LFxuICAgICAgICBzdGRpbzogJ2luaGVyaXQnLFxuICAgICAgfSk7XG4gICAgICBpZiAoaW5zdGFsbFN0YXR1cyAhPT0gMCkge1xuICAgICAgICAvLyBUaHJvd2luZyAoaW5zdGVhZCBvZiBwcm9jZXNzLmV4aXQsIHdoaWNoIHdvdWxkIHNraXAgdGhlIGNhbGxlcidzIGZpbmFsbHkpIGxldHMgdGhlXG4gICAgICAgIC8vIHJlc3RvcmUgcnVuIGJlZm9yZSB0aGUgcHJvY2VzcyB0ZXJtaW5hdGVzLlxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2J1biBpbnN0YWxsIGZhaWxlZCB3aGlsZSBwcmVwYXJpbmcgdGhlIHJlbGVhc2UuJyk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgY29uc3Qgd29ya3NwYWNlUGFja2FnZURpcnMgPSBhd2FpdCBmaW5kV29ya3NwYWNlUGFja2FnZURpcnMocHJvamVjdCk7XG4gIGZvciAoY29uc3QgcGFja2FnZUpzb25QYXRoIG9mIFtcbiAgICBwcm9qZWN0LnBhY2thZ2VKc29uUGF0aCxcbiAgICAuLi53b3Jrc3BhY2VQYWNrYWdlRGlycy5tYXAoKGRpclBhdGgpID0+IHBhdGguam9pbihkaXJQYXRoLCAncGFja2FnZS5qc29uJykpLFxuICBdKSB7XG4gICAgaWYgKCFmcy5leGlzdHNTeW5jKHBhY2thZ2VKc29uUGF0aCkpIGNvbnRpbnVlO1xuXG4gICAgY29uc3Qgb3JpZ2luYWwgPSBmcy5yZWFkRmlsZVN5bmMocGFja2FnZUpzb25QYXRoLCAndXRmOCcpO1xuICAgIC8vIFNuYXBzaG90IEVWRVJZIG1hbmlmZXN0IChub3Qgb25seSByZXdyaXR0ZW4gb25lcyk6IHNlbWFudGljLXJlbGVhc2UgYWxzbyBlZGl0cyBtYW5pZmVzdHNcbiAgICAvLyB3aXRob3V0IHdvcmtzcGFjZTogcmFuZ2VzICh2ZXJzaW9uIGJ1bXBzKSwgYW5kIGEgZmFpbGVkIHJlbGVhc2UgbXVzdCByZXN0b3JlIHRob3NlIHRvby5cbiAgICBpZiAoIWFyZ3YuZHJ5UnVuKSB7XG4gICAgICBtb2RpZmllZEZpbGVzLnNldChwYWNrYWdlSnNvblBhdGgsIEJ1ZmZlci5mcm9tKG9yaWdpbmFsLCAndXRmOCcpKTtcbiAgICB9XG4gICAgY29uc3QgcmV3cml0dGVuID0gcmV3cml0ZVdvcmtzcGFjZVJhbmdlcyhvcmlnaW5hbCk7XG4gICAgaWYgKHJld3JpdHRlbiA9PT0gb3JpZ2luYWwpIGNvbnRpbnVlO1xuXG4gICAgY29uc29sZS5pbmZvKGNoYWxrLmN5YW4oYFJld3JpdGluZyB3b3Jrc3BhY2U6IHJhbmdlcyBpbiAke3BhdGgucmVsYXRpdmUocHJvamVjdC5kaXJQYXRoLCBwYWNrYWdlSnNvblBhdGgpfS4uLmApKTtcbiAgICBpZiAoIWFyZ3YuZHJ5UnVuKSB7XG4gICAgICBmcy53cml0ZUZpbGVTeW5jKHBhY2thZ2VKc29uUGF0aCwgcmV3cml0dGVuLCAndXRmOCcpO1xuICAgIH1cbiAgfVxufVxuXG4vKipcbiAqIFVuZG8gdGhlIHRlbXBvcmFyeSByZWxlYXNlLXRpbWUgbXV0YXRpb25zIG9mIG9uZSBmaWxlLiBgcGFja2FnZS5qc29uYCBmaWxlcyBhcmUgcmVzdG9yZWRcbiAqIHNlbWFudGljYWxseSBpbnN0ZWFkIG9mIGJ5dGUtZm9yLWJ5dGU6IHNlbWFudGljLXJlbGVhc2UncyBucG0gcGx1Z2luIHdyaXRlcyB0aGUgcmVsZWFzZWRcbiAqIHZlcnNpb24gaW50byBtYW5pZmVzdHMgd2hpbGUgdGhleSBob2xkIHRoZSByZXdyaXR0ZW4gcmFuZ2VzLCBhbmQgYSBieXRlIHJlc3RvcmUgd291bGQgc2lsZW50bHlcbiAqIHJldmVydCB0aGF0IGJ1bXAg4oCUIHNvIHdoZW4gdGhlIGZpbGUgY2hhbmdlZCBkdXJpbmcgdGhlIHJlbGVhc2UsIG9ubHkgdGhlIGB3b3Jrc3BhY2U6YFxuICogc3BlY2lmaWVycyBhcmUgd3JpdHRlbiBiYWNrIGludG8gdGhlIENVUlJFTlQgY29udGVudC5cbiAqL1xuLyoqIFJldHVybnMgd2hldGhlciB0aGUgb24tZGlzayBjb250ZW50IGFjdHVhbGx5IGNoYW5nZWQgKGRyaXZlcyB0aGUgXCJSZXN0b3JlZCAuLi5cIiBtZXNzYWdlKS4gKi9cbmZ1bmN0aW9uIHJlc3RvcmVNb2RpZmllZEZpbGUoXG4gIGZpbGVQYXRoOiBzdHJpbmcsXG4gIG9yaWdpbmFsQ29udGVudDogQnVmZmVyIHwgdW5kZWZpbmVkLFxuICByZWxlYXNlU3VjY2VlZGVkOiBib29sZWFuXG4pOiBib29sZWFuIHtcbiAgaWYgKG9yaWdpbmFsQ29udGVudCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgY29uc3QgZXhpc3RlZCA9IGZzLmV4aXN0c1N5bmMoZmlsZVBhdGgpO1xuICAgIGZzLnJtU3luYyhmaWxlUGF0aCwgeyBmb3JjZTogdHJ1ZSB9KTtcbiAgICByZXR1cm4gZXhpc3RlZDtcbiAgfVxuICBpZiAocmVsZWFzZVN1Y2NlZWRlZCAmJiBwYXRoLmJhc2VuYW1lKGZpbGVQYXRoKSA9PT0gJ3BhY2thZ2UuanNvbicgJiYgZnMuZXhpc3RzU3luYyhmaWxlUGF0aCkpIHtcbiAgICBjb25zdCBjdXJyZW50Q29udGVudCA9IGZzLnJlYWRGaWxlU3luYyhmaWxlUGF0aCwgJ3V0ZjgnKTtcbiAgICBjb25zdCBvcmlnaW5hbFRleHQgPSBvcmlnaW5hbENvbnRlbnQudG9TdHJpbmcoJ3V0ZjgnKTtcbiAgICBpZiAoY3VycmVudENvbnRlbnQgIT09IHJld3JpdGVXb3Jrc3BhY2VSYW5nZXMob3JpZ2luYWxUZXh0KSkge1xuICAgICAgY29uc3QgcmVzdG9yZWRDb250ZW50ID0gcmVzdG9yZVdvcmtzcGFjZVJhbmdlcyhjdXJyZW50Q29udGVudCwgb3JpZ2luYWxUZXh0KTtcbiAgICAgIGlmIChyZXN0b3JlZENvbnRlbnQgPT09IGN1cnJlbnRDb250ZW50KSByZXR1cm4gZmFsc2U7XG4gICAgICBmcy53cml0ZUZpbGVTeW5jKGZpbGVQYXRoLCByZXN0b3JlZENvbnRlbnQsICd1dGY4Jyk7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gIH1cbiAgY29uc3QgY3VycmVudEJ1ZmZlciA9IGZzLmV4aXN0c1N5bmMoZmlsZVBhdGgpID8gZnMucmVhZEZpbGVTeW5jKGZpbGVQYXRoKSA6IHVuZGVmaW5lZDtcbiAgaWYgKGN1cnJlbnRCdWZmZXI/LmVxdWFscyhvcmlnaW5hbENvbnRlbnQpKSByZXR1cm4gZmFsc2U7XG4gIC8vIFdyaXRlIHRoZSBzbmFwc2hvdCBieXRlcyB2ZXJiYXRpbTogYnVuLmxvY2tiIGlzIGJpbmFyeSwgc28gYW55IHRleHQgZGVjb2RlL2VuY29kZSByb3VuZCB0cmlwXG4gIC8vIHdvdWxkIGNvcnJ1cHQgaXQuXG4gIGZzLndyaXRlRmlsZVN5bmMoZmlsZVBhdGgsIG9yaWdpbmFsQ29udGVudCk7XG4gIHJldHVybiB0cnVlO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gYnVpbGRIb2lzdGVkQnVuZmlnKGJ1bmZpZzogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIGJ1bmZpZ1xuICAgIC5yZXBsYWNlKC9eKFxccypsaW5rZXJcXHMqPVxccyopW1wiJ11pc29sYXRlZFtcIiddL211LCAnJDFcImhvaXN0ZWRcIicpXG4gICAgLnJlcGxhY2UoL15cXHMqZ2xvYmFsU3RvcmVcXHMqPVxccyp0cnVlW15cXG5dKlxcbj8vbXUsICcnKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJld3JpdGVXb3Jrc3BhY2VSYW5nZXMocGFja2FnZUpzb25Db250ZW50OiBzdHJpbmcpOiBzdHJpbmcge1xuICAvLyBPcGVyYXRlIG9ubHkgaW5zaWRlIHRoZSBkZXBlbmRlbmN5IHNlY3Rpb25zOiBhIGJsYW5rZXQgYFwid29ya3NwYWNlOi4uLlwiYCByZXBsYWNlbWVudCB3b3VsZFxuICAvLyBhbHNvIGNvcnJ1cHQgdW5yZWxhdGVkIHN0cmluZyB2YWx1ZXMgKGUuZy4gYSBkZXNjcmlwdGlvbiBzdGFydGluZyB3aXRoIGB3b3Jrc3BhY2U6YCksIGFuZCBhXG4gIC8vIG5hbWUta2V5ZWQgZ2xvYmFsIHJlcGxhY2VtZW50IHdvdWxkIHRvdWNoIHNhbWUtbmFtZWQga2V5cyBpbiBvdGhlciBzZWN0aW9ucyAoZS5nLiBvdmVycmlkZXMpLlxuICByZXR1cm4gcmVwbGFjZUluRGVwZW5kZW5jeVNlY3Rpb25zKHBhY2thZ2VKc29uQ29udGVudCwgKHNlY3Rpb24pID0+XG4gICAgc2VjdGlvbi5yZXBsYWNlQWxsKC8oXCJbXlwiXFxuXStcIlxccyo6XFxzKilcIndvcmtzcGFjZTpbXlwiXSpcIi9ndSwgJyQxXCIqXCInKVxuICApO1xufVxuXG4vKipcbiAqIFJlLWFwcGx5IHRoZSBvcmlnaW5hbCBgd29ya3NwYWNlOmAgc3BlY2lmaWVycyB0byB0aGUgQ1VSUkVOVCBtYW5pZmVzdCBjb250ZW50LiBNYXRjaGluZyBrZXlzXG4gKiBvZmYgdGhlIGRlcGVuZGVuY3kgTkFNRSAobm90IHRoZSBgXCIqXCJgIHBsYWNlaG9sZGVyKSBpcyBkZWxpYmVyYXRlOiBtdWx0aS1zZW1hbnRpYy1yZWxlYXNlJ3NcbiAqIHByZXBhcmUgc3RlcCBvdmVyd3JpdGVzIGxvY2FsIGRlcGVuZGVuY3kgc3BlY2lmaWVycyB3aXRoIGNvbmNyZXRlIHJlbGVhc2VkIHZlcnNpb25zLCBhbmQgdGhlXG4gKiBjb21taXR0ZWQgbWFuaWZlc3QgbXVzdCBnZXQgaXRzIGB3b3Jrc3BhY2U6YCBwcm90b2NvbCBiYWNrIHJlZ2FyZGxlc3Mg4oCUIEJ1biByZXF1aXJlcyB0aGVcbiAqIHByb3RvY29sIHNvIGEgY29sZCBpbnN0YWxsIGxpbmtzIHRoZSB3b3Jrc3BhY2UgaW5zdGVhZCBvZiByZXNvbHZpbmcgYSByZWdpc3RyeSBjb3B5LlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVzdG9yZVdvcmtzcGFjZVJhbmdlcyhjdXJyZW50Q29udGVudDogc3RyaW5nLCBvcmlnaW5hbENvbnRlbnQ6IHN0cmluZyk6IHN0cmluZyB7XG4gIGNvbnN0IHdvcmtzcGFjZURlcGVuZGVuY2llcyA9IGNvbGxlY3RXb3Jrc3BhY2VEZXBlbmRlbmNpZXMob3JpZ2luYWxDb250ZW50KTtcbiAgLy8gUmVzdG9yZSBwZXIgKHNlY3Rpb24sIG5hbWUpOiBhIHNhbWUtbmFtZWQgZGVwZW5kZW5jeSBpbiBhbm90aGVyIHNlY3Rpb24gbWF5IGxlZ2l0aW1hdGVseVxuICAvLyBob2xkIGEgbm9uLXdvcmtzcGFjZSByYW5nZSAoZS5nLiBhIHBlZXJEZXBlbmRlbmNpZXMgYD49MS4wLjBgIG5leHQgdG8gYSBkZXZEZXBlbmRlbmNpZXNcbiAgLy8gYHdvcmtzcGFjZToqYCkgb3IgYSBkaWZmZXJlbnQgd29ya3NwYWNlIHJhbmdlLCBhbmQgbXVzdCBrZWVwIGl0cyBvd24gdmFsdWUuXG4gIHJldHVybiByZXBsYWNlSW5EZXBlbmRlbmN5U2VjdGlvbnMoY3VycmVudENvbnRlbnQsIChzZWN0aW9uLCBzZWN0aW9uS2V5KSA9PiB7XG4gICAgbGV0IHJlc3VsdCA9IHNlY3Rpb247XG4gICAgZm9yIChjb25zdCB7IHNlY3Rpb246IGRlcGVuZGVuY3lTZWN0aW9uLCBuYW1lLCBzcGVjaWZpZXIgfSBvZiB3b3Jrc3BhY2VEZXBlbmRlbmNpZXMpIHtcbiAgICAgIGlmIChkZXBlbmRlbmN5U2VjdGlvbiAhPT0gc2VjdGlvbktleSkgY29udGludWU7XG4gICAgICByZXN1bHQgPSByZXN1bHQucmVwbGFjZUFsbChcbiAgICAgICAgbmV3IFJlZ0V4cChgKFwiJHtlc2NhcGVSZWdFeHAobmFtZSl9XCJcXFxccyo6XFxcXHMqKVwiW15cIl0qXCJgLCAnZ3UnKSxcbiAgICAgICAgLy8gQSByZXBsYWNlciBmdW5jdGlvbiwgbm90IGEgcmVwbGFjZW1lbnQgc3RyaW5nOiBzcGVjaWZpZXJzIGNvbnRhaW5pbmcgYCRgIG11c3QgYmVcbiAgICAgICAgLy8gaW5zZXJ0ZWQgbGl0ZXJhbGx5IGluc3RlYWQgb2YgYmVpbmcgaW50ZXJwcmV0ZWQgYXMgc3Vic3RpdHV0aW9uIHBhdHRlcm5zLlxuICAgICAgICAoX21hdGNoLCBwcmVmaXg6IHN0cmluZykgPT4gYCR7cHJlZml4fSR7SlNPTi5zdHJpbmdpZnkoc3BlY2lmaWVyKX1gXG4gICAgICApO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9KTtcbn1cblxuLyoqIERlcGVuZGVuY3kgc2VjdGlvbnMgY29udGFpbiBvbmx5IGBcIm5hbWVcIjogXCJzcGVjaWZpZXJcImAgc3RyaW5nIHBhaXJzLCBzbyBgW157fV0qYCBzcGFucyB0aGVtLiAqL1xuZnVuY3Rpb24gcmVwbGFjZUluRGVwZW5kZW5jeVNlY3Rpb25zKFxuICBjb250ZW50OiBzdHJpbmcsXG4gIHJlcGxhY2VTZWN0aW9uOiAoc2VjdGlvbjogc3RyaW5nLCBzZWN0aW9uS2V5OiBzdHJpbmcpID0+IHN0cmluZ1xuKTogc3RyaW5nIHtcbiAgcmV0dXJuIGNvbnRlbnQucmVwbGFjZUFsbChcbiAgICAvKFwiKGRlcGVuZGVuY2llc3xkZXZEZXBlbmRlbmNpZXN8b3B0aW9uYWxEZXBlbmRlbmNpZXN8cGVlckRlcGVuZGVuY2llcylcIlxccyo6XFxzKlxceykoW157fV0qKShcXH0pL2d1LFxuICAgIChfbWF0Y2gsIHByZWZpeDogc3RyaW5nLCBzZWN0aW9uS2V5OiBzdHJpbmcsIGJvZHk6IHN0cmluZywgc3VmZml4OiBzdHJpbmcpID0+XG4gICAgICBgJHtwcmVmaXh9JHtyZXBsYWNlU2VjdGlvbihib2R5LCBzZWN0aW9uS2V5KX0ke3N1ZmZpeH1gXG4gICk7XG59XG5cbmZ1bmN0aW9uIGNvbGxlY3RXb3Jrc3BhY2VEZXBlbmRlbmNpZXMoXG4gIHBhY2thZ2VKc29uQ29udGVudDogc3RyaW5nXG4pOiB7IHNlY3Rpb246IHN0cmluZzsgbmFtZTogc3RyaW5nOyBzcGVjaWZpZXI6IHN0cmluZyB9W10ge1xuICBsZXQgcGFja2FnZUpzb246IFBhY2thZ2VKc29uO1xuICB0cnkge1xuICAgIHBhY2thZ2VKc29uID0gSlNPTi5wYXJzZShwYWNrYWdlSnNvbkNvbnRlbnQpIGFzIFBhY2thZ2VKc29uO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gW107XG4gIH1cbiAgY29uc3QgZGVwZW5kZW5jaWVzOiB7IHNlY3Rpb246IHN0cmluZzsgbmFtZTogc3RyaW5nOyBzcGVjaWZpZXI6IHN0cmluZyB9W10gPSBbXTtcbiAgZm9yIChjb25zdCBrZXkgb2YgWydkZXBlbmRlbmNpZXMnLCAnZGV2RGVwZW5kZW5jaWVzJywgJ29wdGlvbmFsRGVwZW5kZW5jaWVzJywgJ3BlZXJEZXBlbmRlbmNpZXMnXSBhcyBjb25zdCkge1xuICAgIGZvciAoY29uc3QgW25hbWUsIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhwYWNrYWdlSnNvbltrZXldID8/IHt9KSkge1xuICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycgJiYgdmFsdWUuc3RhcnRzV2l0aCgnd29ya3NwYWNlOicpKSB7XG4gICAgICAgIGRlcGVuZGVuY2llcy5wdXNoKHsgc2VjdGlvbjoga2V5LCBuYW1lLCBzcGVjaWZpZXI6IHZhbHVlIH0pO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICByZXR1cm4gZGVwZW5kZW5jaWVzO1xufVxuXG5mdW5jdGlvbiBlc2NhcGVSZWdFeHAodGV4dDogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIHRleHQucmVwbGFjZUFsbCgvWyQoKSorLj9bXFxcXFxcXV57fH1dL2csIFN0cmluZy5yYXdgXFwkJmApO1xufVxuXG5hc3luYyBmdW5jdGlvbiBydW5TZW1hbnRpY1JlbGVhc2UocHJvamVjdDogUHJvamVjdCwgYXJndjogUmVsZWFzZUFyZ3YsIGFjdGl2ZUNoaWxkOiBBY3RpdmVDaGlsZFJlZik6IFByb21pc2U8bnVtYmVyPiB7XG4gIGNvbnN0IGZvcndhcmRlZEFyZ3MgPSBbLi4uKGFyZ3YuYXJncyA/PyBbXSksIC4uLihhcmd2WyctLSddID8/IFtdKV0ubWFwKFN0cmluZyk7XG4gIC8vIFRoZSBQQUNLQUdFIG5hbWUgKGZvciBgYnVueGAvYHlhcm4gZGx4YCwgd2hpY2ggZmV0Y2ggYSBwYWNrYWdlKSBhbmQgdGhlIEJJTiBuYW1lIChmb3IgdGhlXG4gIC8vIGxvY2FsIG5vZGVfbW9kdWxlcy8uYmluIGxvb2t1cCkgZGlmZmVyIGZvciB0aGUgc2NvcGVkIGZvcmtzOiBgYnVueCBtdWx0aS1zZW1hbnRpYy1yZWxlYXNlYFxuICAvLyB3b3VsZCBmZXRjaCB0aGUgdW5yZWxhdGVkIHVuc2NvcGVkIG5wbSBwYWNrYWdlIGluc3RlYWQgb2YgZS5nLiBAYW5vbGlsYWIncyBmb3JrLlxuICBjb25zdCByZWxlYXNlUGFja2FnZU5hbWUgPSAoXG4gICAgWydAYW5vbGlsYWIvbXVsdGktc2VtYW50aWMtcmVsZWFzZScsICdtdWx0aS1zZW1hbnRpYy1yZWxlYXNlJywgJ0BxaXdpL211bHRpLXNlbWFudGljLXJlbGVhc2UnXSBhcyBjb25zdFxuICApLmZpbmQoKHBhY2thZ2VOYW1lKSA9PiBwcm9qZWN0LnBhY2thZ2VKc29uLmRldkRlcGVuZGVuY2llcz8uW3BhY2thZ2VOYW1lXSk7XG4gIGNvbnN0IHJlbGVhc2VCaW4gPSByZWxlYXNlUGFja2FnZU5hbWUgPyAnbXVsdGktc2VtYW50aWMtcmVsZWFzZScgOiAnc2VtYW50aWMtcmVsZWFzZSc7XG5cbiAgLy8gVGhlIHByb2plY3QgaXMgbG9hZGVkIHdpdGggbG9hZEVudjogZmFsc2UgKHNlbWFudGljLXJlbGVhc2UgcnVucyB3aXRoIHRoZSBhbWJpZW50L0NJXG4gIC8vIGVudmlyb25tZW50IGJ5IGRlc2lnbiksIHNvIHByb2plY3QuZW52IGFsaWFzZXMgcHJvY2Vzcy5lbnYgaGVyZTsgdXNpbmcgaXQga2VlcHMgdGhlXG4gIC8vIHByb2plY3QuZW52IGNvbnZlbnRpb24gYW5kIHBpY2tzIHVwIGVudiBsb2FkaW5nIGlmIHRoYXQgZGVzaWduIGV2ZXIgY2hhbmdlcy5cbiAgY29uc3QgZW52ID0geyAuLi5wcm9qZWN0LmVudiB9O1xuICBwcmVwZW5kTm9kZU1vZHVsZXNCaW5Ub1BhdGgocHJvamVjdC5kaXJQYXRoLCBlbnYpO1xuICBjb25zdCBoYXNMb2NhbEJpbiA9IGZzLmV4aXN0c1N5bmMocGF0aC5qb2luKHByb2plY3QuZGlyUGF0aCwgJ25vZGVfbW9kdWxlcycsICcuYmluJywgcmVsZWFzZUJpbikpO1xuICBjb25zdCBmYWxsYmFja1BhY2thZ2VOYW1lID0gcmVsZWFzZVBhY2thZ2VOYW1lID8/ICdzZW1hbnRpYy1yZWxlYXNlJztcbiAgY29uc3QgY29tbWFuZCA9IGhhc0xvY2FsQmluXG4gICAgPyBbcmVsZWFzZUJpbiwgLi4uZm9yd2FyZGVkQXJnc11cbiAgICA6IHByb2plY3QucGFja2FnZU1hbmFnZXJDb21tYW5kID09PSAnYnVuJ1xuICAgICAgPyBbJ2J1bngnLCBmYWxsYmFja1BhY2thZ2VOYW1lLCAuLi5mb3J3YXJkZWRBcmdzXVxuICAgICAgOiBbJ3lhcm4nLCAnZGx4JywgZmFsbGJhY2tQYWNrYWdlTmFtZSwgLi4uZm9yd2FyZGVkQXJnc107XG4gIGNvbnNvbGUuaW5mbyhjaGFsay5jeWFuKGBSdW5uaW5nOiAke2NvbW1hbmQuam9pbignICcpfWApKTtcbiAgaWYgKGFyZ3YuZHJ5UnVuKSByZXR1cm4gMDtcblxuICByZXR1cm4gYXdhaXQgc3Bhd25BbmRXYWl0KGFjdGl2ZUNoaWxkLCBjb21tYW5kWzBdISwgY29tbWFuZC5zbGljZSgxKSwge1xuICAgIGN3ZDogcHJvamVjdC5kaXJQYXRoLFxuICAgIGVudixcbiAgICBzdGRpbzogJ2luaGVyaXQnLFxuICB9KTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gZmluZFdvcmtzcGFjZVBhY2thZ2VEaXJzKHByb2plY3Q6IFByb2plY3QpOiBQcm9taXNlPHN0cmluZ1tdPiB7XG4gIGNvbnN0IHdvcmtzcGFjZXMgPSBwcm9qZWN0LnBhY2thZ2VKc29uLndvcmtzcGFjZXM7XG4gIGNvbnN0IHBhdHRlcm5zID0gQXJyYXkuaXNBcnJheSh3b3Jrc3BhY2VzKSA/IHdvcmtzcGFjZXMgOiAod29ya3NwYWNlcz8ucGFja2FnZXMgPz8gW10pO1xuICBpZiAocGF0dGVybnMubGVuZ3RoID09PSAwKSByZXR1cm4gW107XG5cbiAgY29uc3QgZGlyUGF0aHMgPSBhd2FpdCBnbG9iYnkocGF0dGVybnMsIHsgY3dkOiBwcm9qZWN0LmRpclBhdGgsIG9ubHlEaXJlY3RvcmllczogdHJ1ZSB9KTtcbiAgcmV0dXJuIGRpclBhdGhzLm1hcCgoZGlyUGF0aCkgPT4gcGF0aC5qb2luKHByb2plY3QuZGlyUGF0aCwgZGlyUGF0aCkpO1xufVxuIiwiaW1wb3J0IGNoYWxrIGZyb20gJ2NoYWxrJztcbmltcG9ydCB0eXBlIHsgQ29tbWFuZE1vZHVsZSwgSW5mZXJyZWRPcHRpb25UeXBlcyB9IGZyb20gJ3lhcmdzJztcblxuaW1wb3J0IHsgZmluZFNlbGZQcm9qZWN0IH0gZnJvbSAnLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQgeyBydW5XaXRoU3Bhd24gfSBmcm9tICcuLi9zY3JpcHRzL3J1bi5qcyc7XG5pbXBvcnQgdHlwZSB7IHNoYXJlZE9wdGlvbnNCdWlsZGVyIH0gZnJvbSAnLi4vc2hhcmVkT3B0aW9uc0J1aWxkZXIuanMnO1xuXG5jb25zdCBidWlsZGVyID0ge1xuICByZXRyeToge1xuICAgIGRlc2NyaXB0aW9uOiAnQSBtYXhpbXVtIHJldHJ5IGNvdW50JyxcbiAgICB0eXBlOiAnbnVtYmVyJyxcbiAgICBhbGlhczogJ3InLFxuICAgIGRlZmF1bHQ6IDMsXG4gIH0sXG59IGFzIGNvbnN0O1xuXG5jb25zdCBfYXJndW1lbnRzQnVpbGRlciA9IHtcbiAgY29tbWFuZDoge1xuICAgIGRlc2NyaXB0aW9uOiAnQSBjb21tYW5kIHRvIHJldHJ5JyxcbiAgICB0eXBlOiAnc3RyaW5nJyxcbiAgfSxcbiAgYXJnczoge1xuICAgIGRlc2NyaXB0aW9uOiAnQXJndW1lbnRzIGZvciB0aGUgY29tbWFuZCcsXG4gICAgdHlwZTogJ2FycmF5JyxcbiAgfSxcbn0gYXMgY29uc3Q7XG5cbmV4cG9ydCBjb25zdCByZXRyeUNvbW1hbmQ6IENvbW1hbmRNb2R1bGU8XG4gIHVua25vd24sXG4gIEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIGJ1aWxkZXIgJiB0eXBlb2Ygc2hhcmVkT3B0aW9uc0J1aWxkZXIgJiB0eXBlb2YgX2FyZ3VtZW50c0J1aWxkZXI+XG4+ID0ge1xuICBjb21tYW5kOiAncmV0cnkgW2NvbW1hbmRdIFthcmdzLi4uXScsXG4gIGRlc2NyaWJlOiAnUmV0cnkgdGhlIGdpdmVuIGNvbW1hbmQgdW50aWwgaXQgc3VjY2VlZHMnLFxuICBidWlsZGVyLFxuICBhc3luYyBoYW5kbGVyKGFyZ3YpIHtcbiAgICBjb25zdCBwcm9qZWN0ID0gZmluZFNlbGZQcm9qZWN0KGFyZ3YpO1xuICAgIGlmICghcHJvamVjdCkge1xuICAgICAgY29uc29sZS5lcnJvcihjaGFsay5yZWQoJ05vIHByb2plY3QgZm91bmQuJykpO1xuICAgICAgcHJvY2Vzcy5leGl0KDEpO1xuICAgIH1cblxuICAgIGNvbnN0IGNtZEFuZEFyZ3MgPSBbYXJndi5jb21tYW5kLCAuLi4oYXJndi5hcmdzID8/IFtdKSwgLi4uYXJndi5fLnNsaWNlKDEpXS5maWx0ZXIoQm9vbGVhbik7XG4gICAgbGV0IGxhc3RTdGF0dXMgPSAwO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYXJndi5yZXRyeTsgaSsrKSB7XG4gICAgICBpZiAoaSA+IDApIHtcbiAgICAgICAgY29uc29sZS5pbmZvKGBcXG4ke2NoYWxrLnllbGxvdyhgIyR7aX0gUmV0cnlpbmc6ICR7Y21kQW5kQXJncy5qb2luKCcgJyl9YCl9YCk7XG4gICAgICB9XG4gICAgICAvLyBUT0RPOiBzaG91bGQgd2UgYWRkIHNpbmdsZSBxdW90ZXMgYXJvdW5kIGVhY2ggYXJndW1lbnQ/XG4gICAgICBsYXN0U3RhdHVzID0gYXdhaXQgcnVuV2l0aFNwYXduKGNtZEFuZEFyZ3Muam9pbignICcpLCBwcm9qZWN0LCBhcmd2LCB7XG4gICAgICAgIGV4aXRJZkZhaWxlZDogZmFsc2UsXG4gICAgICAgIG9uU2lnbmFsOiAoc2lnbmFsKSA9PiB7XG4gICAgICAgICAgaWYgKHNpZ25hbCkge1xuICAgICAgICAgICAgcHJvY2Vzcy5leGl0KDEpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgIH0pO1xuICAgICAgaWYgKGxhc3RTdGF0dXMgPT09IDApIHJldHVybjtcbiAgICB9XG4gICAgcHJvY2Vzcy5leGl0KGxhc3RTdGF0dXMpO1xuICB9LFxufTtcbiIsImltcG9ydCBjaGlsZF9wcm9jZXNzIGZyb20gJ25vZGU6Y2hpbGRfcHJvY2Vzcyc7XG5pbXBvcnQgZnMgZnJvbSAnbm9kZTpmcy9wcm9taXNlcyc7XG5pbXBvcnQgb3MgZnJvbSAnbm9kZTpvcyc7XG5cbmltcG9ydCBjaGFsayBmcm9tICdjaGFsayc7XG5pbXBvcnQgdHlwZSB7IEFyZ3VtZW50c0NhbWVsQ2FzZSwgQ29tbWFuZE1vZHVsZSwgSW5mZXJyZWRPcHRpb25UeXBlcyB9IGZyb20gJ3lhcmdzJztcblxuaW1wb3J0IHsgZmluZERlc2NlbmRhbnRQcm9qZWN0cyB9IGZyb20gJy4uL3Byb2plY3QuanMnO1xuaW1wb3J0IHsgcnVuV2l0aFNwYXduLCBydW5XaXRoU3Bhd25JblBhcmFsbGVsIH0gZnJvbSAnLi4vc2NyaXB0cy9ydW4uanMnO1xuaW1wb3J0IHsgcHJvbWlzZVBvb2wgfSBmcm9tICcuLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5cbmltcG9ydCB7IHByZXBhcmVGb3JSdW5uaW5nQ29tbWFuZCB9IGZyb20gJy4vY29tbWFuZFV0aWxzLmpzJztcblxuY29uc3QgYnVpbGRlciA9IHt9IGFzIGNvbnN0O1xuXG5leHBvcnQgY29uc3Qgc2V0dXBDb21tYW5kOiBDb21tYW5kTW9kdWxlPHVua25vd24sIEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIGJ1aWxkZXI+PiA9IHtcbiAgY29tbWFuZDogJ3NldHVwJyxcbiAgZGVzY3JpYmU6ICdTZXR1cCBkZXZlbG9wbWVudCBlbnZpcm9ubWVudC4gLmVudiBmaWxlcyBhcmUgaWdub3JlZC4nLFxuICBidWlsZGVyLFxuICBhc3luYyBoYW5kbGVyKGFyZ3YpIHtcbiAgICBhd2FpdCBzZXR1cChhcmd2KTtcbiAgfSxcbn07XG5cbi8vIFRlc3QgY29kZSByZXF1aXJlcyBQYXJ0aWFsPC4uLj5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBzZXR1cChcbiAgYXJndjogUGFydGlhbDxBcmd1bWVudHNDYW1lbENhc2U8SW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgYnVpbGRlcj4+PixcbiAgcHJvamVjdFBhdGhGb3JUZXN0aW5nPzogc3RyaW5nXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgcHJvamVjdHMgPSBhd2FpdCBmaW5kRGVzY2VuZGFudFByb2plY3RzKGFyZ3YsIGZhbHNlLCBwcm9qZWN0UGF0aEZvclRlc3RpbmcpO1xuICBpZiAoIXByb2plY3RzKSB7XG4gICAgY29uc29sZS5lcnJvcihjaGFsay5yZWQoJ05vIHByb2plY3QgZm91bmQuJykpO1xuICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgfVxuXG4gIGZvciAoY29uc3QgcHJvamVjdCBvZiBwcmVwYXJlRm9yUnVubmluZ0NvbW1hbmQoJ3NldHVwJywgcHJvamVjdHMuZGVzY2VuZGFudHMpKSB7XG4gICAgY29uc3QgZGlyZW50cyA9IGF3YWl0IGZzLnJlYWRkaXIocHJvamVjdC5kaXJQYXRoLCB7IHdpdGhGaWxlVHlwZXM6IHRydWUgfSk7XG4gICAgaWYgKHByb2plY3QgPT09IHByb2plY3RzLnJvb3QpIHtcbiAgICAgIGlmIChvcy5wbGF0Zm9ybSgpID09PSAnZGFyd2luJykge1xuICAgICAgICBjb25zdCBwYWNrYWdlcyA9IFsncHN0cmVlJ107XG4gICAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bkluUGFyYWxsZWwoYGJyZXcgaW5zdGFsbCAke3BhY2thZ2VzLmpvaW4oJyAnKX1gLCBwcm9qZWN0LCBhcmd2KTtcbiAgICAgIH1cblxuICAgICAgaWYgKGRpcmVudHMuc29tZSgoZCkgPT4gZC5pc0ZpbGUoKSAmJiBkLm5hbWUuaW5jbHVkZXMoJy12ZXJzaW9uJykpKSB7XG4gICAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bignYXNkZiBpbnN0YWxsJywgcHJvamVjdCwgYXJndiwgeyBleGl0SWZGYWlsZWQ6IGZhbHNlIH0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChkaXJlbnRzLnNvbWUoKGQpID0+IGQuaXNGaWxlKCkgJiYgZC5uYW1lID09PSAncHlwcm9qZWN0LnRvbWwnKSkge1xuICAgICAgYXdhaXQgcnVuV2l0aFNwYXduSW5QYXJhbGxlbCgncG9ldHJ5IGNvbmZpZyB2aXJ0dWFsZW52cy5pbi1wcm9qZWN0IHRydWUnLCBwcm9qZWN0LCBhcmd2KTtcbiAgICAgIGNvbnN0IFssIHZlcnNpb25dID0gY2hpbGRfcHJvY2Vzcy5leGVjU3luYygnYXNkZiBjdXJyZW50IHB5dGhvbicpLnRvU3RyaW5nKCkudHJpbSgpLnNwbGl0KC9cXHMrLyk7XG4gICAgICBhd2FpdCBydW5XaXRoU3Bhd25JblBhcmFsbGVsKGBwb2V0cnkgZW52IHVzZSAke3ZlcnNpb259YCwgcHJvamVjdCwgYXJndik7XG4gICAgICBhd2FpdCBwcm9taXNlUG9vbC5wcm9taXNlQWxsKCk7XG4gICAgICBhd2FpdCBydW5XaXRoU3Bhd24oJ3BvZXRyeSBydW4gcGlwIGluc3RhbGwgLS11cGdyYWRlIHBpcCcsIHByb2plY3QsIGFyZ3YpO1xuICAgICAgYXdhaXQgcnVuV2l0aFNwYXduKCdwb2V0cnkgaW5zdGFsbCAtLWFuc2knLCBwcm9qZWN0LCBhcmd2KTtcbiAgICB9XG5cbiAgICBpZiAoXG4gICAgICAocHJvamVjdCA9PT0gcHJvamVjdHMucm9vdCB8fCAhcHJvamVjdHMucm9vdC5wYWNrYWdlSnNvbi5zY3JpcHRzPy5bJ2dlbi1jb2RlJ10pICYmXG4gICAgICBwcm9qZWN0LnBhY2thZ2VKc29uLnNjcmlwdHM/LlsnZ2VuLWNvZGUnXVxuICAgICkge1xuICAgICAgYXdhaXQgcnVuV2l0aFNwYXduKGAke3Byb2plY3QucGFja2FnZU1hbmFnZXJSdW5Db21tYW5kfSBnZW4tY29kZWAsIHByb2plY3QsIGFyZ3YpO1xuICAgIH1cbiAgfVxuXG4gIGNvbnN0IHByb2plY3QgPSBwcm9qZWN0cy5kZXNjZW5kYW50cy5maW5kKChwKSA9PiBwLnBhY2thZ2VKc29uLmRldkRlcGVuZGVuY2llcz8ucGxheXdyaWdodCk7XG4gIGlmIChwcm9qZWN0KSB7XG4gICAgYXdhaXQgcnVuV2l0aFNwYXduKGAke3Byb2plY3QucGFja2FnZU1hbmFnZXJSdW5Db21tYW5kfSBwbGF5d3JpZ2h0IGluc3RhbGwgLS13aXRoLWRlcHNgLCBwcm9qZWN0LCBhcmd2KTtcbiAgfVxufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IGNoYWxrIGZyb20gJ2NoYWxrJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUpzb24gfSBmcm9tICd0eXBlLWZlc3QnO1xuaW1wb3J0IHR5cGUgeyBDb21tYW5kTW9kdWxlLCBJbmZlcnJlZE9wdGlvblR5cGVzIH0gZnJvbSAneWFyZ3MnO1xuXG5pbXBvcnQgeyBmaW5kUm9vdEFuZFNlbGZQcm9qZWN0cyB9IGZyb20gJy4uL3Byb2plY3QuanMnO1xuaW1wb3J0IHR5cGUgeyBQcml2YXRlUmVnaXN0cnlBdXRoIH0gZnJvbSAnLi4vdXRpbHMvcHJpdmF0ZVJlZ2lzdHJ5LmpzJztcbmltcG9ydCB7XG4gIFBSSVZBVEVfUkVHSVNUUllfU0NPUEUsXG4gIGRvd25sb2FkQW5kRXh0cmFjdFJlZ2lzdHJ5UGFja2FnZSxcbiAgaXNFeGFjdFZlcnNpb24sXG4gIGlzUHJpdmF0ZUdpdERlcGVuZGVuY3ksXG4gIGlzUHJpdmF0ZVJlZ2lzdHJ5RGVwZW5kZW5jeSxcbiAgcmFuZ2VBZG1pdHMsXG4gIHJlc29sdmVQcml2YXRlUmVnaXN0cnlBdXRoLFxuICB0b0Jhc2VWZXJzaW9uLFxufSBmcm9tICcuLi91dGlscy9wcml2YXRlUmVnaXN0cnkuanMnO1xuXG5pbnRlcmZhY2UgUHJpdmF0ZVBhY2thZ2Uge1xuICBuYW1lOiBzdHJpbmc7XG4gIGtpbmQ6ICdnaXQnIHwgJ3JlZ2lzdHJ5JztcbiAgLyoqIFVuZGVmaW5lZCBmb3IgcmVnaXN0cnkgcGFja2FnZXMsIHdoaWNoIGFyZSBkb3dubG9hZGVkIGluc3RlYWQgb2YgY29waWVkLiAqL1xuICBzb3VyY2VEaXJQYXRoOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gIHRhcmdldERpclBhdGg6IHN0cmluZztcbiAgdmVyc2lvblNwZWNpZmllcjogc3RyaW5nIHwgdW5kZWZpbmVkO1xufVxuXG5jb25zdCBkZXBlbmRlbmN5S2V5cyA9IFsnZGVwZW5kZW5jaWVzJywgJ2RldkRlcGVuZGVuY2llcycsICdvcHRpb25hbERlcGVuZGVuY2llcycsICdwZWVyRGVwZW5kZW5jaWVzJ10gYXMgY29uc3Q7XG5cbmNvbnN0IGJ1aWxkZXIgPSB7XG4gICdvdXQtZGlyJzoge1xuICAgIGRlc2NyaXB0aW9uOiAnRGlyZWN0b3J5IHRvIGNvcHkgcHJpdmF0ZSBwYWNrYWdlcyBpbnRvJyxcbiAgICB0eXBlOiAnc3RyaW5nJyxcbiAgICBkZWZhdWx0OiAnQHdpbGxib29zdGVyJyxcbiAgfSxcbn0gYXMgY29uc3Q7XG5cbmV4cG9ydCBjb25zdCBzZXR1cFByaXZhdGVQYWNrYWdlc0NvbW1hbmQ6IENvbW1hbmRNb2R1bGU8eyBkcnlSdW4/OiBib29sZWFuIH0sIEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIGJ1aWxkZXI+PiA9IHtcbiAgY29tbWFuZDogJ3NldHVwLXByaXZhdGUtcGFja2FnZXMnLFxuICBkZXNjcmliZTpcbiAgICAnTWF0ZXJpYWxpemUgcHJpdmF0ZSBkZXBlbmRlbmNpZXMgZm9yIERvY2tlciBidWlsZHM6IGNvcHkgZ2l0IGRlcGVuZGVuY2llcyBhbmQgZG93bmxvYWQgQHdpbGxib29zdGVyLXByaXZhdGUvKiByZWdpc3RyeSBwYWNrYWdlcyAoYXV0aCB2aWEgLm5wbXJjIC8gfi8ubnBtcmMgbG9jYWxseSwgb3IgVkVSREFDQ0lPX1RPS0VOIG9uIENJKScsXG4gIGJ1aWxkZXIsXG4gIGFzeW5jIGhhbmRsZXIoYXJndikge1xuICAgIGNvbnN0IHByb2plY3RzID0gZmluZFJvb3RBbmRTZWxmUHJvamVjdHMoYXJndiwgZmFsc2UpO1xuICAgIGlmICghcHJvamVjdHMpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoY2hhbGsucmVkKCdObyBwcm9qZWN0IGZvdW5kLicpKTtcbiAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICB9XG5cbiAgICBjb25zdCBvdXREaXJQYXRoID0gcGF0aC5yZXNvbHZlKHByb2plY3RzLnJvb3QuZGlyUGF0aCwgYXJndi5vdXREaXIpO1xuICAgIGFzc2VydFN1YmRpcmVjdG9yeShwcm9qZWN0cy5yb290LmRpclBhdGgsIG91dERpclBhdGgpO1xuICAgIC8vIFJlZ2lzdHJ5IHBhY2thZ2VzIGFsd2F5cyBtYXRlcmlhbGl6ZSBhdCB0aGUgcmVwb3NpdG9yeSByb290OiBgd2Igb3B0aW1pemVGb3JEb2NrZXJCdWlsZGBcbiAgICAvLyByZXNvbHZlcyB0aGVtIGZyb20gYDxyb290Pi9Ad2lsbGJvb3N0ZXItcHJpdmF0ZWAgcmVnYXJkbGVzcyBvZiBgLS1vdXQtZGlyYC5cbiAgICBjb25zdCByZWdpc3RyeU91dERpclBhdGggPSBwYXRoLmpvaW4ocHJvamVjdHMucm9vdC5kaXJQYXRoLCBQUklWQVRFX1JFR0lTVFJZX1NDT1BFKTtcbiAgICBpZiAocGF0aHNPdmVybGFwKG91dERpclBhdGgsIHJlZ2lzdHJ5T3V0RGlyUGF0aCkpIHtcbiAgICAgIC8vIGUuZy4gYC0tb3V0LWRpciBAd2lsbGJvb3N0ZXItcHJpdmF0ZWAgb3IgYC0tb3V0LWRpciBAd2lsbGJvb3N0ZXItcHJpdmF0ZS9zdWJgOiB0aGVcbiAgICAgIC8vIHJlZ2lzdHJ5IHN0ZXAgcmVjdXJzaXZlbHkgZGVsZXRlcyByZWdpc3RyeU91dERpclBhdGgsIHdoaWNoIHdvdWxkIGRlc3Ryb3kgdGhlIGdpdFxuICAgICAgLy8gcGFja2FnZXMgY29waWVkIGludG8gYW4gZXF1YWwgb3IgTkVTVEVEIGRpcmVjdG9yeSBtb21lbnRzIGVhcmxpZXIuXG4gICAgICBjb25zb2xlLmVycm9yKGNoYWxrLnJlZChgLS1vdXQtZGlyIG11c3Qgbm90IG92ZXJsYXAgdGhlICR7UFJJVkFURV9SRUdJU1RSWV9TQ09QRX0gcmVnaXN0cnkgb3V0cHV0IGRpcmVjdG9yeS5gKSk7XG4gICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgfVxuICAgIGlmIChwYXRoLnJlbGF0aXZlKHByb2plY3RzLnJvb3QuZGlyUGF0aCwgb3V0RGlyUGF0aCkgIT09ICdAd2lsbGJvb3N0ZXInKSB7XG4gICAgICAvLyBQcmUtZXhpc3RpbmcgbGltaXRhdGlvbiBvZiB0aGUgb3B0aW9uOiB0aGUgRG9ja2VyIG1hbmlmZXN0IHJld3JpdGUgaGFzIG5vIGFjY2VzcyB0byBpdC5cbiAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgY2hhbGsueWVsbG93KFxuICAgICAgICAgICdOb3RlOiB3YiBvcHRpbWl6ZUZvckRvY2tlckJ1aWxkIHJld3JpdGVzIGdpdCBkZXBlbmRlbmNpZXMgdG8gPHJvb3Q+L0B3aWxsYm9vc3RlcjsgYSBjdXN0b20gLS1vdXQtZGlyIHJlcXVpcmVzIGEgbWF0Y2hpbmcgRG9ja2VyZmlsZSBsYXlvdXQuJ1xuICAgICAgICApXG4gICAgICApO1xuICAgIH1cbiAgICBjb25zdCBwcml2YXRlUGFja2FnZXMgPSBhd2FpdCBjb2xsZWN0UHJpdmF0ZVBhY2thZ2VzKFxuICAgICAgcHJvamVjdHMucm9vdC5kaXJQYXRoLFxuICAgICAgcHJvamVjdHMucm9vdC5wYWNrYWdlSnNvbixcbiAgICAgIG91dERpclBhdGgsXG4gICAgICByZWdpc3RyeU91dERpclBhdGhcbiAgICApO1xuXG4gICAgaWYgKGFyZ3YuZHJ5UnVuKSB7XG4gICAgICBwcmludERyeVJ1blJlc3VsdChvdXREaXJQYXRoLCBwcml2YXRlUGFja2FnZXMpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGNvcGllZFBhY2thZ2VzID0gWy4uLnByaXZhdGVQYWNrYWdlcy52YWx1ZXMoKV0uZmlsdGVyKChwKSA9PiBwLmtpbmQgPT09ICdnaXQnKTtcbiAgICBjb25zdCByZWdpc3RyeVBhY2thZ2VzID0gWy4uLnByaXZhdGVQYWNrYWdlcy52YWx1ZXMoKV0uZmlsdGVyKChwKSA9PiBwLmtpbmQgPT09ICdyZWdpc3RyeScpO1xuICAgIC8vIFJlc29sdmUgcmVxdWlyZWQgY29uZmlndXJhdGlvbiBCRUZPUkUgZGVsZXRpbmcgdGhlIGV4aXN0aW5nIG1hdGVyaWFsaXphdGlvbnMsIHNvIGEgbWlzc2luZ1xuICAgIC8vIHJlZ2lzdHJ5IGNvbmZpZ3VyYXRpb24gY2Fubm90IGRlc3Ryb3kgYSBwcmV2aW91c2x5IHVzYWJsZSBvdXRwdXQgdHJlZS5cbiAgICBjb25zdCBhdXRoID0gcmVnaXN0cnlQYWNrYWdlcy5sZW5ndGggPiAwID8gcmVzb2x2ZVByaXZhdGVSZWdpc3RyeUF1dGgocHJvamVjdHMucm9vdC5kaXJQYXRoKSA6IHVuZGVmaW5lZDtcbiAgICBpZiAocmVnaXN0cnlQYWNrYWdlcy5sZW5ndGggPiAwICYmICFhdXRoKSB7XG4gICAgICBjb25zb2xlLmVycm9yKFxuICAgICAgICBjaGFsay5yZWQoXG4gICAgICAgICAgYE5vIHJlZ2lzdHJ5IGNvbmZpZ3VyZWQgZm9yIHRoZSAke1BSSVZBVEVfUkVHSVNUUllfU0NPUEV9IHNjb3BlOyBhZGQgXCIke1BSSVZBVEVfUkVHSVNUUllfU0NPUEV9OnJlZ2lzdHJ5PS4uLlwiIHRvIC5ucG1yYyBvciB+Ly5ucG1yYy5gXG4gICAgICAgIClcbiAgICAgICk7XG4gICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgfVxuXG4gICAgYXdhaXQgZnMucHJvbWlzZXMucm0ob3V0RGlyUGF0aCwgeyByZWN1cnNpdmU6IHRydWUsIGZvcmNlOiB0cnVlIH0pO1xuICAgIC8vIEJvdGggb3V0cHV0IGRpcmVjdG9yaWVzIGFsd2F5cyBleGlzdCBhZnRlcndhcmRzOiBEb2NrZXJmaWxlcyBDT1BZIHRoZW0gdW5jb25kaXRpb25hbGx5LFxuICAgIC8vIGFuZCBhIG1pc3Npbmcgc291cmNlIHBhdGggZmFpbHMgdGhlIGJ1aWxkLlxuICAgIGF3YWl0IGZzLnByb21pc2VzLm1rZGlyKG91dERpclBhdGgsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICAgIGZvciAoY29uc3QgcHJpdmF0ZVBhY2thZ2Ugb2YgY29waWVkUGFja2FnZXMpIHtcbiAgICAgIGF3YWl0IGNvcHlHaXRQYWNrYWdlKHByb2plY3RzLnJvb3QuZGlyUGF0aCwgcHJpdmF0ZVBhY2thZ2UpO1xuICAgIH1cblxuICAgIGlmIChhdXRoKSB7XG4gICAgICAvLyBEb3dubG9hZCBpbnRvIGEgc3RhZ2luZyBkaXJlY3RvcnkgYW5kIHN3YXAgaXQgaW4gb25seSBhZnRlciBldmVyeSBkb3dubG9hZCBzdWNjZWVkZWQsIHNvXG4gICAgICAvLyBhIGZhaWxpbmcgcmVnaXN0cnkvdG9rZW4vZXh0cmFjdGlvbiBjYW5ub3QgZGVzdHJveSB0aGUgbGFzdCB1c2FibGUgbWF0ZXJpYWxpemF0aW9uLlxuICAgICAgY29uc3Qgc3RhZ2luZ0RpclBhdGggPSBwYXRoLmpvaW4ocHJvamVjdHMucm9vdC5kaXJQYXRoLCAnLnRtcCcsICd3Yi1wcml2YXRlLXJlZ2lzdHJ5LXN0YWdpbmcnKTtcbiAgICAgIGNvbnN0IHRvU3RhZ2VkUGF0aCA9ICh0YXJnZXREaXJQYXRoOiBzdHJpbmcpOiBzdHJpbmcgPT5cbiAgICAgICAgcGF0aC5qb2luKHN0YWdpbmdEaXJQYXRoLCBwYXRoLnJlbGF0aXZlKHJlZ2lzdHJ5T3V0RGlyUGF0aCwgdGFyZ2V0RGlyUGF0aCkpO1xuICAgICAgYXdhaXQgZnMucHJvbWlzZXMucm0oc3RhZ2luZ0RpclBhdGgsIHsgcmVjdXJzaXZlOiB0cnVlLCBmb3JjZTogdHJ1ZSB9KTtcbiAgICAgIGF3YWl0IGZzLnByb21pc2VzLm1rZGlyKHN0YWdpbmdEaXJQYXRoLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgICAgIHRyeSB7XG4gICAgICAgIGZvciAoY29uc3QgcHJpdmF0ZVBhY2thZ2Ugb2YgcmVnaXN0cnlQYWNrYWdlcykge1xuICAgICAgICAgIGF3YWl0IGRvd25sb2FkQW5kRXh0cmFjdFJlZ2lzdHJ5UGFja2FnZShcbiAgICAgICAgICAgIGF1dGgsXG4gICAgICAgICAgICBwcml2YXRlUGFja2FnZS5uYW1lLFxuICAgICAgICAgICAgcHJpdmF0ZVBhY2thZ2UudmVyc2lvblNwZWNpZmllciA/PyAnbGF0ZXN0JyxcbiAgICAgICAgICAgIHRvU3RhZ2VkUGF0aChwcml2YXRlUGFja2FnZS50YXJnZXREaXJQYXRoKVxuICAgICAgICAgICk7XG4gICAgICAgICAgY29uc29sZS5pbmZvKFxuICAgICAgICAgICAgYERvd25sb2FkZWQgJHtwcml2YXRlUGFja2FnZS5uYW1lfSB0byAke3BhdGgucmVsYXRpdmUocHJvamVjdHMucm9vdC5kaXJQYXRoLCBwcml2YXRlUGFja2FnZS50YXJnZXREaXJQYXRoKX1gXG4gICAgICAgICAgKTtcbiAgICAgICAgICAvLyBBIGRvd25sb2FkZWQgcGFja2FnZSBtYXkgaXRzZWxmIGRlcGVuZCBvbiBwcml2YXRlIHBhY2thZ2VzIHRoYXQgd2VyZSBub3QgdmlzaWJsZVxuICAgICAgICAgIC8vIGJlZm9yZSBleHRyYWN0aW9uOyBtYXRlcmlhbGl6ZSB0aGVtIHRvby5cbiAgICAgICAgICBhd2FpdCBjb2xsZWN0TmVzdGVkUHJpdmF0ZVBhY2thZ2VzKFxuICAgICAgICAgICAgcHJvamVjdHMucm9vdC5kaXJQYXRoLFxuICAgICAgICAgICAgYXV0aCxcbiAgICAgICAgICAgIHByaXZhdGVQYWNrYWdlLFxuICAgICAgICAgICAgcHJpdmF0ZVBhY2thZ2VzLFxuICAgICAgICAgICAgb3V0RGlyUGF0aCxcbiAgICAgICAgICAgIHJlZ2lzdHJ5T3V0RGlyUGF0aCxcbiAgICAgICAgICAgIHRvU3RhZ2VkUGF0aFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgYXdhaXQgZnMucHJvbWlzZXMucm0ocmVnaXN0cnlPdXREaXJQYXRoLCB7IHJlY3Vyc2l2ZTogdHJ1ZSwgZm9yY2U6IHRydWUgfSk7XG4gICAgICAgIGF3YWl0IGZzLnByb21pc2VzLnJlbmFtZShzdGFnaW5nRGlyUGF0aCwgcmVnaXN0cnlPdXREaXJQYXRoKTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGF3YWl0IGZzLnByb21pc2VzLnJtKHN0YWdpbmdEaXJQYXRoLCB7IHJlY3Vyc2l2ZTogdHJ1ZSwgZm9yY2U6IHRydWUgfSk7XG4gICAgICAgIHRocm93IGVycm9yO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBhd2FpdCBmcy5wcm9taXNlcy5ybShyZWdpc3RyeU91dERpclBhdGgsIHsgcmVjdXJzaXZlOiB0cnVlLCBmb3JjZTogdHJ1ZSB9KTtcbiAgICAgIGF3YWl0IGZzLnByb21pc2VzLm1rZGlyKHJlZ2lzdHJ5T3V0RGlyUGF0aCwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gICAgfVxuXG4gICAgYXdhaXQgcmVwbGFjZVByaXZhdGVEZXBlbmRlbmNpZXMocHJvamVjdHMucm9vdC5kaXJQYXRoLCBwcml2YXRlUGFja2FnZXMpO1xuICB9LFxufTtcblxuYXN5bmMgZnVuY3Rpb24gY29sbGVjdFByaXZhdGVQYWNrYWdlcyhcbiAgcm9vdERpclBhdGg6IHN0cmluZyxcbiAgcm9vdFBhY2thZ2VKc29uOiBQYWNrYWdlSnNvbixcbiAgb3V0RGlyUGF0aDogc3RyaW5nLFxuICByZWdpc3RyeU91dERpclBhdGg6IHN0cmluZ1xuKTogUHJvbWlzZTxNYXA8c3RyaW5nLCBQcml2YXRlUGFja2FnZT4+IHtcbiAgY29uc3QgcHJpdmF0ZVBhY2thZ2VzID0gbmV3IE1hcDxzdHJpbmcsIFByaXZhdGVQYWNrYWdlPigpO1xuICAvLyBTdGFydCBmcm9tIHRoZSByb290IHBhY2thZ2UuanNvbiBieSBkZXNpZ247IHdvcmtzcGFjZSBwYWNrYWdlIGRlcGVuZGVuY2llcyBhcmUgb3V0c2lkZSB0aGlzIGNvbW1hbmQncyB0YXJnZXQuXG4gIGNvbnN0IHBhY2thZ2VzVG9Qcm9jZXNzID0gZmluZFByaXZhdGVEZXBlbmRlbmNpZXMocm9vdFBhY2thZ2VKc29uLCBvdXREaXJQYXRoLCByZWdpc3RyeU91dERpclBhdGgpO1xuICBjb25zdCBxdWV1ZWRQYWNrYWdlcyA9IG5ldyBNYXAocGFja2FnZXNUb1Byb2Nlc3MubWFwKChwKSA9PiBbcC5uYW1lLCBwXSkpO1xuXG4gIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCBwYWNrYWdlc1RvUHJvY2Vzcy5sZW5ndGg7IGluZGV4KyspIHtcbiAgICBjb25zdCBwcml2YXRlUGFja2FnZSA9IHBhY2thZ2VzVG9Qcm9jZXNzW2luZGV4XTtcbiAgICBpZiAoIXByaXZhdGVQYWNrYWdlKSBjb250aW51ZTtcbiAgICBpZiAocHJpdmF0ZVBhY2thZ2VzLmhhcyhwcml2YXRlUGFja2FnZS5uYW1lKSkgY29udGludWU7XG5cbiAgICBpZiAocHJpdmF0ZVBhY2thZ2Uua2luZCA9PT0gJ2dpdCcpIHtcbiAgICAgIHByaXZhdGVQYWNrYWdlLnNvdXJjZURpclBhdGggPSBmaW5kSW5zdGFsbGVkUGFja2FnZURpcihyb290RGlyUGF0aCwgcHJpdmF0ZVBhY2thZ2UubmFtZSk7XG4gICAgICAvLyBOZXN0ZWQgcHJpdmF0ZSBkZXBlbmRlbmNpZXMgb2YgYW4gaW5zdGFsbGVkIGdpdCBwYWNrYWdlIGFyZSBkaXNjb3ZlcmFibGUgcmlnaHQgYXdheTtcbiAgICAgIC8vIHJlZ2lzdHJ5IHBhY2thZ2VzIGFyZSBpbnNwZWN0ZWQgYWZ0ZXIgZG93bmxvYWQgaW5zdGVhZCAoY29sbGVjdE5lc3RlZFByaXZhdGVQYWNrYWdlcykuXG4gICAgICBmb3IgKGNvbnN0IHBhY2thZ2VKc29uUGF0aCBvZiBhd2FpdCBmaW5kUGFja2FnZUpzb25QYXRocyhwcml2YXRlUGFja2FnZS5zb3VyY2VEaXJQYXRoKSkge1xuICAgICAgICBjb25zdCBwYWNrYWdlSnNvbiA9IGF3YWl0IHJlYWRQYWNrYWdlSnNvbihwYWNrYWdlSnNvblBhdGgpO1xuICAgICAgICBmb3IgKGNvbnN0IG5lc3RlZCBvZiBmaW5kUHJpdmF0ZURlcGVuZGVuY2llcyhwYWNrYWdlSnNvbiwgb3V0RGlyUGF0aCwgcmVnaXN0cnlPdXREaXJQYXRoKSkge1xuICAgICAgICAgIGNvbnN0IHF1ZXVlZCA9IHF1ZXVlZFBhY2thZ2VzLmdldChuZXN0ZWQubmFtZSk7XG4gICAgICAgICAgaWYgKHF1ZXVlZCkge1xuICAgICAgICAgICAgYXNzZXJ0Tm9WZXJzaW9uQ29uZmxpY3QocXVldWVkLCBuZXN0ZWQsIHByaXZhdGVQYWNrYWdlLm5hbWUpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBxdWV1ZWRQYWNrYWdlcy5zZXQobmVzdGVkLm5hbWUsIG5lc3RlZCk7XG4gICAgICAgICAgICBwYWNrYWdlc1RvUHJvY2Vzcy5wdXNoKG5lc3RlZCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHByaXZhdGVQYWNrYWdlcy5zZXQocHJpdmF0ZVBhY2thZ2UubmFtZSwgcHJpdmF0ZVBhY2thZ2UpO1xuICB9XG5cbiAgcmV0dXJuIHByaXZhdGVQYWNrYWdlcztcbn1cblxuYXN5bmMgZnVuY3Rpb24gY29sbGVjdE5lc3RlZFByaXZhdGVQYWNrYWdlcyhcbiAgcm9vdERpclBhdGg6IHN0cmluZyxcbiAgYXV0aDogUHJpdmF0ZVJlZ2lzdHJ5QXV0aCxcbiAgZXh0cmFjdGVkUGFja2FnZTogUHJpdmF0ZVBhY2thZ2UsXG4gIHByaXZhdGVQYWNrYWdlczogTWFwPHN0cmluZywgUHJpdmF0ZVBhY2thZ2U+LFxuICBvdXREaXJQYXRoOiBzdHJpbmcsXG4gIHJlZ2lzdHJ5T3V0RGlyUGF0aDogc3RyaW5nLFxuICB0b1N0YWdlZFBhdGg6ICh0YXJnZXREaXJQYXRoOiBzdHJpbmcpID0+IHN0cmluZ1xuKTogUHJvbWlzZTx2b2lkPiB7XG4gIC8vIFJlZ2lzdHJ5IHBhY2thZ2VzIHN0aWxsIGxpdmUgaW4gdGhlIHN0YWdpbmcgZGlyZWN0b3J5IGF0IHRoaXMgcG9pbnQgKHRoZXkgYXJlIHN3YXBwZWQgaW50b1xuICAvLyBwbGFjZSBvbmx5IGFmdGVyIGV2ZXJ5IGRvd25sb2FkIHN1Y2NlZWRlZCk7IGdpdCBwYWNrYWdlcyBhcmUgY29waWVkIHN0cmFpZ2h0IHRvIHRoZWlyIGZpbmFsXG4gIC8vIGxvY2F0aW9uLCBzbyB0aGVpciBtYW5pZmVzdCBtdXN0IGJlIHJlYWQgdGhlcmUuXG4gIGNvbnN0IGV4dHJhY3RlZERpclBhdGggPVxuICAgIGV4dHJhY3RlZFBhY2thZ2Uua2luZCA9PT0gJ3JlZ2lzdHJ5J1xuICAgICAgPyB0b1N0YWdlZFBhdGgoZXh0cmFjdGVkUGFja2FnZS50YXJnZXREaXJQYXRoKVxuICAgICAgOiBleHRyYWN0ZWRQYWNrYWdlLnRhcmdldERpclBhdGg7XG4gIC8vIFNjYW4gRVZFUlkgbWFuaWZlc3Qgb2YgdGhlIG1hdGVyaWFsaXplZCBwYWNrYWdlIChvcmcgZ2l0IGRlcGVuZGVuY2llcyBhcmUgd2hvbGUgbW9ub3JlcG9cbiAgLy8gY2hlY2tvdXRzIHdpdGggcGFja2FnZXMvKi9wYWNrYWdlLmpzb24pLCBtaXJyb3JpbmcgY29sbGVjdFByaXZhdGVQYWNrYWdlcycgZGVlcCBzY2FuIOKAlCB0aGVcbiAgLy8gZGVwZW5kZW5jeS1yZXdyaXRlIHN0ZXAgd2Fsa3MgdGhlIHNhbWUgc2V0LCBzbyBhbnl0aGluZyBkZWNsYXJlZCB0aGVyZSBtdXN0IGJlIG1hdGVyaWFsaXplZC5cbiAgZm9yIChjb25zdCBwYWNrYWdlSnNvblBhdGggb2YgYXdhaXQgZmluZFBhY2thZ2VKc29uUGF0aHMoZXh0cmFjdGVkRGlyUGF0aCkpIHtcbiAgICBmb3IgKGNvbnN0IG5lc3RlZCBvZiBmaW5kUHJpdmF0ZURlcGVuZGVuY2llcyhcbiAgICAgIGF3YWl0IHJlYWRQYWNrYWdlSnNvbihwYWNrYWdlSnNvblBhdGgpLFxuICAgICAgb3V0RGlyUGF0aCxcbiAgICAgIHJlZ2lzdHJ5T3V0RGlyUGF0aFxuICAgICkpIHtcbiAgICAgIGNvbnN0IGV4aXN0aW5nID0gcHJpdmF0ZVBhY2thZ2VzLmdldChuZXN0ZWQubmFtZSk7XG4gICAgICBpZiAoZXhpc3RpbmcpIHtcbiAgICAgICAgLy8gQ29sbGFwc2luZyBkaWZmZXJlbnQgcmVxdWVzdGVkIHZlcnNpb25zIGludG8gb25lIG1hdGVyaWFsaXphdGlvbiB3b3VsZCBzaWxlbnRseSB2aW9sYXRlXG4gICAgICAgIC8vIHRoZSBkZXBlbmRlbnQncyByZXF1aXJlbWVudCwgc28gY29uZmxpY3RzIG11c3QgZmFpbCBsb3VkbHkuXG4gICAgICAgIGFzc2VydE5vVmVyc2lvbkNvbmZsaWN0KGV4aXN0aW5nLCBuZXN0ZWQsIGV4dHJhY3RlZFBhY2thZ2UubmFtZSk7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBpZiAobmVzdGVkLmtpbmQgPT09ICdnaXQnKSB7XG4gICAgICAgIG5lc3RlZC5zb3VyY2VEaXJQYXRoID0gZmluZEluc3RhbGxlZFBhY2thZ2VEaXIocm9vdERpclBhdGgsIG5lc3RlZC5uYW1lKTtcbiAgICAgICAgYXdhaXQgY29weUdpdFBhY2thZ2Uocm9vdERpclBhdGgsIG5lc3RlZCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBhd2FpdCBkb3dubG9hZEFuZEV4dHJhY3RSZWdpc3RyeVBhY2thZ2UoXG4gICAgICAgICAgYXV0aCxcbiAgICAgICAgICBuZXN0ZWQubmFtZSxcbiAgICAgICAgICBuZXN0ZWQudmVyc2lvblNwZWNpZmllciA/PyAnbGF0ZXN0JyxcbiAgICAgICAgICB0b1N0YWdlZFBhdGgobmVzdGVkLnRhcmdldERpclBhdGgpXG4gICAgICAgICk7XG4gICAgICAgIGNvbnNvbGUuaW5mbyhgRG93bmxvYWRlZCAke25lc3RlZC5uYW1lfSAobmVzdGVkIGRlcGVuZGVuY3kpIHRvICR7bmVzdGVkLnRhcmdldERpclBhdGh9YCk7XG4gICAgICB9XG4gICAgICBwcml2YXRlUGFja2FnZXMuc2V0KG5lc3RlZC5uYW1lLCBuZXN0ZWQpO1xuICAgICAgYXdhaXQgY29sbGVjdE5lc3RlZFByaXZhdGVQYWNrYWdlcyhcbiAgICAgICAgcm9vdERpclBhdGgsXG4gICAgICAgIGF1dGgsXG4gICAgICAgIG5lc3RlZCxcbiAgICAgICAgcHJpdmF0ZVBhY2thZ2VzLFxuICAgICAgICBvdXREaXJQYXRoLFxuICAgICAgICByZWdpc3RyeU91dERpclBhdGgsXG4gICAgICAgIHRvU3RhZ2VkUGF0aFxuICAgICAgKTtcbiAgICB9XG4gIH1cbn1cblxuYXN5bmMgZnVuY3Rpb24gY29weUdpdFBhY2thZ2Uocm9vdERpclBhdGg6IHN0cmluZywgcHJpdmF0ZVBhY2thZ2U6IFByaXZhdGVQYWNrYWdlKTogUHJvbWlzZTx2b2lkPiB7XG4gIGF3YWl0IGZzLnByb21pc2VzLmNwKHByaXZhdGVQYWNrYWdlLnNvdXJjZURpclBhdGghLCBwcml2YXRlUGFja2FnZS50YXJnZXREaXJQYXRoLCB7XG4gICAgcmVjdXJzaXZlOiB0cnVlLFxuICAgIGZvcmNlOiB0cnVlLFxuICAgIC8vIEJ1bidzIGlzb2xhdGVkIGxpbmtlciBleHBvc2VzIGluc3RhbGxlZCBwYWNrYWdlcyB0aHJvdWdoIHN5bWxpbmtzOyB0aGUgbWF0ZXJpYWxpemVkIHRyZWVcbiAgICAvLyBtdXN0IGNvbnRhaW4gcmVhbCBmaWxlcyAoYSBjb3BpZWQgYWJzb2x1dGUgc3ltbGluayB3b3VsZCBkYW5nbGUgaW5zaWRlIHRoZSBEb2NrZXIgaW1hZ2UsXG4gICAgLy8gYW5kIGxhdGVyIGRlcGVuZGVuY3kgcmV3cml0aW5nIHdvdWxkIHdyaXRlIHRocm91Z2ggaXQgaW50byB0aGUgc2hhcmVkIHN0b3JlKS5cbiAgICBkZXJlZmVyZW5jZTogdHJ1ZSxcbiAgICBmaWx0ZXI6IChzcmMpID0+IHtcbiAgICAgIGNvbnN0IHNlZ21lbnRzID0gcGF0aC5yZWxhdGl2ZShwcml2YXRlUGFja2FnZS5zb3VyY2VEaXJQYXRoISwgc3JjKS5zcGxpdChwYXRoLnNlcCk7XG4gICAgICByZXR1cm4gIXNlZ21lbnRzLmluY2x1ZGVzKCdub2RlX21vZHVsZXMnKSAmJiAhc2VnbWVudHMuaW5jbHVkZXMoJy5naXQnKTtcbiAgICB9LFxuICB9KTtcbiAgY29uc29sZS5pbmZvKGBDb3BpZWQgJHtwcml2YXRlUGFja2FnZS5uYW1lfSB0byAke3BhdGgucmVsYXRpdmUocm9vdERpclBhdGgsIHByaXZhdGVQYWNrYWdlLnRhcmdldERpclBhdGgpfWApO1xufVxuXG4vKipcbiAqIFRoZSBtYXRlcmlhbGl6YXRpb24gZm9yIGBleGlzdGluZ2AgaXMgYWxyZWFkeSBzZWxlY3RlZCAoaXRzIGBeYC9gfmAgcmFuZ2UgZGVncmFkZWQgdG8gdGhlIGJhc2VcbiAqIHZlcnNpb24g4oCUIHNlZSBkb3dubG9hZEFuZEV4dHJhY3RSZWdpc3RyeVBhY2thZ2UpLCBzbyBhY2NlcHQgYHJlcXVlc3RlZGAgb25seSB3aGVuIHRoYXQgc2VsZWN0ZWRcbiAqIHZlcnNpb24gc2F0aXNmaWVzIGl0OiBhbiBleGFjdCByZXF1ZXN0IG11c3QgZXF1YWwgaXQsIGEgYF5gL2B+YCByZXF1ZXN0IG11c3QgYWRtaXQgaXQsIGFuZFxuICogbm9uLW51bWVyaWMgc3BlY2lmaWVycyAoZGlzdC10YWdzLCBnaXQgVVJMcy9yZXZpc2lvbnMpIG11c3QgbWF0Y2ggZXhhY3RseS5cbiAqL1xuZnVuY3Rpb24gYXNzZXJ0Tm9WZXJzaW9uQ29uZmxpY3QoZXhpc3Rpbmc6IFByaXZhdGVQYWNrYWdlLCByZXF1ZXN0ZWQ6IFByaXZhdGVQYWNrYWdlLCBkZXBlbmRlbnROYW1lOiBzdHJpbmcpOiB2b2lkIHtcbiAgaWYgKGV4aXN0aW5nLmtpbmQgPT09IHJlcXVlc3RlZC5raW5kKSB7XG4gICAgaWYgKGV4aXN0aW5nLnZlcnNpb25TcGVjaWZpZXIgPT09IHJlcXVlc3RlZC52ZXJzaW9uU3BlY2lmaWVyKSByZXR1cm47XG4gICAgY29uc3Qgc2VsZWN0ZWRWZXJzaW9uID0gdG9CYXNlVmVyc2lvbihleGlzdGluZy52ZXJzaW9uU3BlY2lmaWVyKTtcbiAgICBpZiAoc2VsZWN0ZWRWZXJzaW9uICE9PSB1bmRlZmluZWQgJiYgcmVxdWVzdGVkLnZlcnNpb25TcGVjaWZpZXIgIT09IHVuZGVmaW5lZCkge1xuICAgICAgaWYgKGlzRXhhY3RWZXJzaW9uKHJlcXVlc3RlZC52ZXJzaW9uU3BlY2lmaWVyKSAmJiByZXF1ZXN0ZWQudmVyc2lvblNwZWNpZmllciA9PT0gc2VsZWN0ZWRWZXJzaW9uKSByZXR1cm47XG4gICAgICBpZiAocmFuZ2VBZG1pdHMocmVxdWVzdGVkLnZlcnNpb25TcGVjaWZpZXIsIHNlbGVjdGVkVmVyc2lvbikpIHJldHVybjtcbiAgICB9XG4gIH1cblxuICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgYENvbmZsaWN0aW5nIHJlcXVpcmVtZW50cyBmb3IgJHtleGlzdGluZy5uYW1lfTogYCArXG4gICAgICBgJHtleGlzdGluZy52ZXJzaW9uU3BlY2lmaWVyID8/IGV4aXN0aW5nLmtpbmR9IGlzIGFscmVhZHkgc2VsZWN0ZWQsIGJ1dCAke2RlcGVuZGVudE5hbWV9IHJlcXVpcmVzIGAgK1xuICAgICAgYCR7cmVxdWVzdGVkLnZlcnNpb25TcGVjaWZpZXIgPz8gcmVxdWVzdGVkLmtpbmR9LiBPbmx5IGEgc2luZ2xlIHZlcnNpb24gcGVyIHByaXZhdGUgcGFja2FnZSBpcyBzdXBwb3J0ZWQuYFxuICApO1xufVxuXG4vKiogV2hldGhlciB0aGUgdHdvIHBhdGhzIGFyZSBlcXVhbCBvciBvbmUgY29udGFpbnMgdGhlIG90aGVyLiAqL1xuZnVuY3Rpb24gcGF0aHNPdmVybGFwKGE6IHN0cmluZywgYjogc3RyaW5nKTogYm9vbGVhbiB7XG4gIHJldHVybiBpc0VxdWFsT3JBbmNlc3RvclBhdGgoYSwgYikgfHwgaXNFcXVhbE9yQW5jZXN0b3JQYXRoKGIsIGEpO1xufVxuXG5mdW5jdGlvbiBpc0VxdWFsT3JBbmNlc3RvclBhdGgoYW5jZXN0b3JQYXRoOiBzdHJpbmcsIGRlc2NlbmRhbnRQYXRoOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgY29uc3QgcmVsYXRpdmVQYXRoID0gcGF0aC5yZWxhdGl2ZShhbmNlc3RvclBhdGgsIGRlc2NlbmRhbnRQYXRoKTtcbiAgcmV0dXJuIHJlbGF0aXZlUGF0aCA9PT0gJycgfHwgKCFyZWxhdGl2ZVBhdGguc3RhcnRzV2l0aCgnLi4nKSAmJiAhcGF0aC5pc0Fic29sdXRlKHJlbGF0aXZlUGF0aCkpO1xufVxuXG5mdW5jdGlvbiBhc3NlcnRTdWJkaXJlY3Rvcnkocm9vdERpclBhdGg6IHN0cmluZywgb3V0RGlyUGF0aDogc3RyaW5nKTogdm9pZCB7XG4gIGNvbnN0IHJlbGF0aXZlUGF0aCA9IHBhdGgucmVsYXRpdmUocm9vdERpclBhdGgsIG91dERpclBhdGgpO1xuICBpZiAocmVsYXRpdmVQYXRoICYmICFyZWxhdGl2ZVBhdGguc3RhcnRzV2l0aCgnLi4nKSAmJiAhcGF0aC5pc0Fic29sdXRlKHJlbGF0aXZlUGF0aCkpIHJldHVybjtcblxuICBjb25zb2xlLmVycm9yKGNoYWxrLnJlZChgT3V0cHV0IGRpcmVjdG9yeSBtdXN0IGJlIGEgc3ViZGlyZWN0b3J5IG9mIHRoZSBwcm9qZWN0IHJvb3Q6ICR7b3V0RGlyUGF0aH1gKSk7XG4gIHByb2Nlc3MuZXhpdCgxKTtcbn1cblxuZnVuY3Rpb24gZmluZEluc3RhbGxlZFBhY2thZ2VEaXIocm9vdERpclBhdGg6IHN0cmluZywgcGFja2FnZU5hbWU6IHN0cmluZyk6IHN0cmluZyB7XG4gIGNvbnN0IHVuc2NvcGVkTmFtZSA9IHRvVW5zY29wZWRQYWNrYWdlTmFtZShwYWNrYWdlTmFtZSk7XG4gIC8vIHJlYWxwYXRoU3luYyByZXNvbHZlcyB0aGUgaXNvbGF0ZWQgbGlua2VyJ3Mgc3ltbGluayBzbyBjb3BpZXMgcmVhZCAoYW5kIHRoZSBjb3B5IGZpbHRlclxuICAvLyBjb21wdXRlcyByZWxhdGl2ZSBwYXRocyBhZ2FpbnN0KSB0aGUgYWN0dWFsIHBhY2thZ2UgZGlyZWN0b3J5LlxuICBjb25zdCBkaXJlY3REaXJQYXRoID0gcGF0aC5qb2luKHJvb3REaXJQYXRoLCAnbm9kZV9tb2R1bGVzJywgJ0B3aWxsYm9vc3RlcicsIHVuc2NvcGVkTmFtZSk7XG4gIGlmIChmcy5leGlzdHNTeW5jKHBhdGguam9pbihkaXJlY3REaXJQYXRoLCAncGFja2FnZS5qc29uJykpKSB7XG4gICAgcmV0dXJuIGZzLnJlYWxwYXRoU3luYyhkaXJlY3REaXJQYXRoKTtcbiAgfVxuICAvLyBCdW4ncyBpc29sYXRlZCBsaW5rZXIga2VlcHMgdHJhbnNpdGl2ZS1vbmx5IGRlcGVuZGVuY2llcyBvdXQgb2YgdGhlIHJvb3Qgbm9kZV9tb2R1bGVzO1xuICAvLyBzZWFyY2ggdGhlIC5idW4gc3RvcmUgZm9yIHRoZSBwYWNrYWdlIGJlZm9yZSBnaXZpbmcgdXAuIFRoZSBzdG9yZSBtYXkgbGVnaXRpbWF0ZWx5IGhvbGRcbiAgLy8gTVVMVElQTEUgcmVzb2x1dGlvbnMgb2Ygb25lIHBhY2thZ2UgKGRpZmZlcmVudCB2ZXJzaW9ucy9yZXZpc2lvbnMpLCBhbmQgcGlja2luZyBhbiBhcmJpdHJhcnlcbiAgLy8gb25lIGNvdWxkIHNpbGVudGx5IG1hdGVyaWFsaXplIHRoZSB3cm9uZyBjb250ZW50IOKAlCBzbyBhbWJpZ3VpdHkgZmFpbHMgbG91ZGx5LlxuICBjb25zdCBidW5TdG9yZURpclBhdGggPSBwYXRoLmpvaW4ocm9vdERpclBhdGgsICdub2RlX21vZHVsZXMnLCAnLmJ1bicpO1xuICBjb25zdCBjYW5kaWRhdGVEaXJQYXRocyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICB0cnkge1xuICAgIGZvciAoY29uc3QgZGlyZW50IG9mIGZzLnJlYWRkaXJTeW5jKGJ1blN0b3JlRGlyUGF0aCwgeyB3aXRoRmlsZVR5cGVzOiB0cnVlIH0pKSB7XG4gICAgICBjb25zdCBjYW5kaWRhdGVEaXJQYXRoID0gcGF0aC5qb2luKGJ1blN0b3JlRGlyUGF0aCwgZGlyZW50Lm5hbWUsICdub2RlX21vZHVsZXMnLCAnQHdpbGxib29zdGVyJywgdW5zY29wZWROYW1lKTtcbiAgICAgIGlmIChmcy5leGlzdHNTeW5jKHBhdGguam9pbihjYW5kaWRhdGVEaXJQYXRoLCAncGFja2FnZS5qc29uJykpKSB7XG4gICAgICAgIGNhbmRpZGF0ZURpclBhdGhzLmFkZChmcy5yZWFscGF0aFN5bmMoY2FuZGlkYXRlRGlyUGF0aCkpO1xuICAgICAgfVxuICAgIH1cbiAgfSBjYXRjaCB7XG4gICAgLy8gTm8gLmJ1biBzdG9yZSAoaG9pc3RlZCBpbnN0YWxsKTsgZmFsbCB0aHJvdWdoIHRvIHRoZSBlcnJvciBiZWxvdy5cbiAgfVxuICBpZiAoY2FuZGlkYXRlRGlyUGF0aHMuc2l6ZSA9PT0gMSkgcmV0dXJuIFsuLi5jYW5kaWRhdGVEaXJQYXRoc11bMF0hO1xuICBpZiAoY2FuZGlkYXRlRGlyUGF0aHMuc2l6ZSA+IDEpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICBgTXVsdGlwbGUgaW5zdGFsbGVkIHJlc29sdXRpb25zIGZvdW5kIGZvciAke3BhY2thZ2VOYW1lfTogJHtbLi4uY2FuZGlkYXRlRGlyUGF0aHNdLmpvaW4oJywgJyl9LiBgICtcbiAgICAgICAgJ0RlZHVwbGljYXRlIHRoZSBkZXBlbmRlbmN5IHNvIGEgc2luZ2xlIHJlc29sdXRpb24gcmVtYWlucy4nXG4gICAgKTtcbiAgfVxuICB0aHJvdyBuZXcgRXJyb3IoYFByaXZhdGUgcGFja2FnZSBpcyBub3QgaW5zdGFsbGVkOiAke3BhY2thZ2VOYW1lfSAoJHtkaXJlY3REaXJQYXRofSlgKTtcbn1cblxuZnVuY3Rpb24gZmluZFByaXZhdGVEZXBlbmRlbmNpZXMoXG4gIHBhY2thZ2VKc29uOiBQYWNrYWdlSnNvbixcbiAgb3V0RGlyUGF0aDogc3RyaW5nLFxuICByZWdpc3RyeU91dERpclBhdGg6IHN0cmluZ1xuKTogUHJpdmF0ZVBhY2thZ2VbXSB7XG4gIGNvbnN0IHByaXZhdGVQYWNrYWdlcyA9IG5ldyBNYXA8c3RyaW5nLCBQcml2YXRlUGFja2FnZT4oKTtcbiAgZm9yIChjb25zdCBrZXkgb2YgZGVwZW5kZW5jeUtleXMpIHtcbiAgICBjb25zdCBkZXBlbmRlbmNpZXMgPSBwYWNrYWdlSnNvbltrZXldO1xuICAgIGlmICghZGVwZW5kZW5jaWVzKSBjb250aW51ZTtcblxuICAgIGZvciAoY29uc3QgW25hbWUsIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhkZXBlbmRlbmNpZXMpKSB7XG4gICAgICBjb25zdCBpc0dpdCA9IGlzUHJpdmF0ZUdpdERlcGVuZGVuY3kodmFsdWUpO1xuICAgICAgaWYgKCFpc0dpdCAmJiAhaXNQcml2YXRlUmVnaXN0cnlEZXBlbmRlbmN5KG5hbWUsIHZhbHVlKSkgY29udGludWU7XG4gICAgICBpZiAoaXNHaXQgJiYgIW5hbWUuc3RhcnRzV2l0aCgnQHdpbGxib29zdGVyLycpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgUHJpdmF0ZSBnaXQgZGVwZW5kZW5jeSBtdXN0IGJlIGFuIEB3aWxsYm9vc3RlciBwYWNrYWdlOiAke25hbWV9YCk7XG4gICAgICB9XG4gICAgICBjb25zdCB1bnNjb3BlZE5hbWUgPSB0b1Vuc2NvcGVkUGFja2FnZU5hbWUobmFtZSk7XG4gICAgICAvLyBEZXBlbmRlbmN5IG5hbWVzIGJlY29tZSBleHRlcm5hbCBkYXRhIG9uY2UgbmVzdGVkIG1hbmlmZXN0cyBjb21lIGZyb20gZG93bmxvYWRlZFxuICAgICAgLy8gdGFyYmFsbHM7IHJlamVjdCBhbnl0aGluZyAocGF0aCBzZXBhcmF0b3JzLCBgLi5gLCBoaWRkZW4tZmlsZSBwcmVmaXhlcykgdGhhdCBjb3VsZFxuICAgICAgLy8gZXNjYXBlIHRoZSBvdXRwdXQgZGlyZWN0b3J5IHRoZSBuYW1lIGlzIGpvaW5lZCBpbnRvIGJlZm9yZSBpdCBpcyByZWN1cnNpdmVseSBkZWxldGVkLlxuICAgICAgaWYgKCEvXltcXHcuLV0rJC8udGVzdCh1bnNjb3BlZE5hbWUpIHx8IHVuc2NvcGVkTmFtZS5zdGFydHNXaXRoKCcuJykpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIHByaXZhdGUgcGFja2FnZSBuYW1lOiAke25hbWV9YCk7XG4gICAgICB9XG4gICAgICBjb25zdCByZXF1ZXN0ZWQ6IFByaXZhdGVQYWNrYWdlID0ge1xuICAgICAgICBuYW1lLFxuICAgICAgICBraW5kOiBpc0dpdCA/ICdnaXQnIDogJ3JlZ2lzdHJ5JyxcbiAgICAgICAgc291cmNlRGlyUGF0aDogdW5kZWZpbmVkLFxuICAgICAgICB0YXJnZXREaXJQYXRoOiBwYXRoLmpvaW4oaXNHaXQgPyBvdXREaXJQYXRoIDogcmVnaXN0cnlPdXREaXJQYXRoLCB1bnNjb3BlZE5hbWUpLFxuICAgICAgICAvLyBUaGUgZnVsbCBnaXQgc3BlY2lmaWVyIGlzIHByZXNlcnZlZCBzbyBkaXZlcmdlbnQgVVJMcy9yZXZpc2lvbnMgKCNhYmMgdnMgI2RlZikgYXJlXG4gICAgICAgIC8vIGRldGVjdGVkIGFzIGNvbmZsaWN0cyBpbnN0ZWFkIG9mIHNpbGVudGx5IGNvbGxhcHNpbmcgaW50byBvbmUgY29waWVkIHBhY2thZ2UuXG4gICAgICAgIHZlcnNpb25TcGVjaWZpZXI6IHZhbHVlIGFzIHN0cmluZyxcbiAgICAgIH07XG4gICAgICBjb25zdCBleGlzdGluZyA9IHByaXZhdGVQYWNrYWdlcy5nZXQobmFtZSk7XG4gICAgICBwcml2YXRlUGFja2FnZXMuc2V0KG5hbWUsIGV4aXN0aW5nID8gbWVyZ2VTYW1lTWFuaWZlc3RSZXF1aXJlbWVudChleGlzdGluZywgcmVxdWVzdGVkKSA6IHJlcXVlc3RlZCk7XG4gICAgfVxuICB9XG4gIHJldHVybiBbLi4ucHJpdmF0ZVBhY2thZ2VzLnZhbHVlcygpXTtcbn1cblxuLyoqXG4gKiBBIG1hbmlmZXN0IG1heSBsZWdpdGltYXRlbHkgcmVxdWVzdCBvbmUgcGFja2FnZSBmcm9tIHNldmVyYWwgZGVwZW5kZW5jeSBzZWN0aW9ucyAoZS5nLiBhbiBleGFjdFxuICogZGV2RGVwZW5kZW5jaWVzIHBpbiBhbG9uZ3NpZGUgYSBwZWVyRGVwZW5kZW5jaWVzIHJhbmdlKS4gUHJlZmVyIHRoZSBleGFjdCBwaW4gd2hlbiB0aGUgb3RoZXJcbiAqIHNpZGUgaXMgYSByYW5nZSBhZG1pdHRpbmcgaXQgKHRoYXQgcGluIGJlY29tZXMgdGhlIG1hdGVyaWFsaXplZCB2ZXJzaW9uKTsgZmFpbCBsb3VkbHkgd2hlbiB0aGVcbiAqIHJlcXVpcmVtZW50cyBnZW51aW5lbHkgZGl2ZXJnZS5cbiAqL1xuZnVuY3Rpb24gbWVyZ2VTYW1lTWFuaWZlc3RSZXF1aXJlbWVudChleGlzdGluZzogUHJpdmF0ZVBhY2thZ2UsIHJlcXVlc3RlZDogUHJpdmF0ZVBhY2thZ2UpOiBQcml2YXRlUGFja2FnZSB7XG4gIGlmIChleGlzdGluZy5raW5kID09PSByZXF1ZXN0ZWQua2luZCkge1xuICAgIGlmIChleGlzdGluZy52ZXJzaW9uU3BlY2lmaWVyID09PSByZXF1ZXN0ZWQudmVyc2lvblNwZWNpZmllcikgcmV0dXJuIGV4aXN0aW5nO1xuICAgIGNvbnN0IFtleGFjdCwgb3RoZXJdID0gaXNFeGFjdFZlcnNpb24oZXhpc3RpbmcudmVyc2lvblNwZWNpZmllcikgPyBbZXhpc3RpbmcsIHJlcXVlc3RlZF0gOiBbcmVxdWVzdGVkLCBleGlzdGluZ107XG4gICAgaWYgKFxuICAgICAgaXNFeGFjdFZlcnNpb24oZXhhY3QudmVyc2lvblNwZWNpZmllcikgJiZcbiAgICAgIG90aGVyLnZlcnNpb25TcGVjaWZpZXIgIT09IHVuZGVmaW5lZCAmJlxuICAgICAgKG90aGVyLnZlcnNpb25TcGVjaWZpZXIgPT09IGV4YWN0LnZlcnNpb25TcGVjaWZpZXIgfHxcbiAgICAgICAgcmFuZ2VBZG1pdHMob3RoZXIudmVyc2lvblNwZWNpZmllciwgZXhhY3QudmVyc2lvblNwZWNpZmllciEpIHx8XG4gICAgICAgIHRvQmFzZVZlcnNpb24ob3RoZXIudmVyc2lvblNwZWNpZmllcikgPT09IGV4YWN0LnZlcnNpb25TcGVjaWZpZXIpXG4gICAgKSB7XG4gICAgICByZXR1cm4gZXhhY3Q7XG4gICAgfVxuICAgIC8vIFR3byByYW5nZXMgZGVncmFkaW5nIHRvIHRoZSBzYW1lIGJhc2UgdmVyc2lvbiBzZWxlY3QgdGhlIHNhbWUgbWF0ZXJpYWxpemF0aW9uLlxuICAgIGNvbnN0IGJhc2VWZXJzaW9uID0gdG9CYXNlVmVyc2lvbihleGlzdGluZy52ZXJzaW9uU3BlY2lmaWVyKTtcbiAgICBpZiAoYmFzZVZlcnNpb24gIT09IHVuZGVmaW5lZCAmJiBiYXNlVmVyc2lvbiA9PT0gdG9CYXNlVmVyc2lvbihyZXF1ZXN0ZWQudmVyc2lvblNwZWNpZmllcikpIHJldHVybiBleGlzdGluZztcbiAgfVxuICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgYENvbmZsaWN0aW5nIHJlcXVpcmVtZW50cyBmb3IgJHtleGlzdGluZy5uYW1lfSB3aXRoaW4gb25lIG1hbmlmZXN0OiBgICtcbiAgICAgIGAke2V4aXN0aW5nLnZlcnNpb25TcGVjaWZpZXIgPz8gZXhpc3Rpbmcua2luZH0gdnMgJHtyZXF1ZXN0ZWQudmVyc2lvblNwZWNpZmllciA/PyByZXF1ZXN0ZWQua2luZH0uYFxuICApO1xufVxuXG5hc3luYyBmdW5jdGlvbiByZXBsYWNlUHJpdmF0ZURlcGVuZGVuY2llcyhcbiAgcm9vdERpclBhdGg6IHN0cmluZyxcbiAgcHJpdmF0ZVBhY2thZ2VzOiBNYXA8c3RyaW5nLCBQcml2YXRlUGFja2FnZT5cbik6IFByb21pc2U8dm9pZD4ge1xuICBmb3IgKGNvbnN0IHByaXZhdGVQYWNrYWdlIG9mIHByaXZhdGVQYWNrYWdlcy52YWx1ZXMoKSkge1xuICAgIGZvciAoY29uc3QgcGFja2FnZUpzb25QYXRoIG9mIGF3YWl0IGZpbmRQYWNrYWdlSnNvblBhdGhzKHByaXZhdGVQYWNrYWdlLnRhcmdldERpclBhdGgpKSB7XG4gICAgICBjb25zdCBwYWNrYWdlSnNvbiA9IGF3YWl0IHJlYWRQYWNrYWdlSnNvbihwYWNrYWdlSnNvblBhdGgpO1xuICAgICAgaWYgKCFyZXBsYWNlUGFja2FnZUpzb25EZXBlbmRlbmNpZXMocGFja2FnZUpzb25QYXRoLCBwYWNrYWdlSnNvbiwgcHJpdmF0ZVBhY2thZ2VzKSkgY29udGludWU7XG5cbiAgICAgIGF3YWl0IGZzLnByb21pc2VzLndyaXRlRmlsZShwYWNrYWdlSnNvblBhdGgsIGAke0pTT04uc3RyaW5naWZ5KHBhY2thZ2VKc29uLCB1bmRlZmluZWQsIDIpfVxcbmAsICd1dGY4Jyk7XG4gICAgICBjb25zb2xlLmluZm8oYFJld3JvdGUgcHJpdmF0ZSBkZXBlbmRlbmNpZXMgaW4gJHtwYXRoLnJlbGF0aXZlKHJvb3REaXJQYXRoLCBwYWNrYWdlSnNvblBhdGgpfWApO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiByZXBsYWNlUGFja2FnZUpzb25EZXBlbmRlbmNpZXMoXG4gIHBhY2thZ2VKc29uUGF0aDogc3RyaW5nLFxuICBwYWNrYWdlSnNvbjogUGFja2FnZUpzb24sXG4gIHByaXZhdGVQYWNrYWdlczogTWFwPHN0cmluZywgUHJpdmF0ZVBhY2thZ2U+XG4pOiBib29sZWFuIHtcbiAgbGV0IGNoYW5nZWQgPSBmYWxzZTtcbiAgZm9yIChjb25zdCBrZXkgb2YgZGVwZW5kZW5jeUtleXMpIHtcbiAgICBjb25zdCBkZXBlbmRlbmNpZXMgPSBwYWNrYWdlSnNvbltrZXldO1xuICAgIGlmICghZGVwZW5kZW5jaWVzKSBjb250aW51ZTtcblxuICAgIGZvciAoY29uc3QgW25hbWUsIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhkZXBlbmRlbmNpZXMpKSB7XG4gICAgICBpZiAoIWlzUHJpdmF0ZUdpdERlcGVuZGVuY3kodmFsdWUpICYmICFpc1ByaXZhdGVSZWdpc3RyeURlcGVuZGVuY3kobmFtZSwgdmFsdWUpKSBjb250aW51ZTtcbiAgICAgIGNvbnN0IHRhcmdldFBhY2thZ2UgPSBwcml2YXRlUGFja2FnZXMuZ2V0KG5hbWUpO1xuICAgICAgaWYgKCF0YXJnZXRQYWNrYWdlKSBjb250aW51ZTtcblxuICAgICAgZGVwZW5kZW5jaWVzW25hbWVdID0gYGZpbGU6JHtwYXRoLnJlbGF0aXZlKHBhdGguZGlybmFtZShwYWNrYWdlSnNvblBhdGgpLCB0YXJnZXRQYWNrYWdlLnRhcmdldERpclBhdGgpfWA7XG4gICAgICBjaGFuZ2VkID0gdHJ1ZTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGNoYW5nZWQ7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGZpbmRQYWNrYWdlSnNvblBhdGhzKGRpclBhdGg6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nW10+IHtcbiAgaWYgKCFmcy5leGlzdHNTeW5jKGRpclBhdGgpKSByZXR1cm4gW107XG5cbiAgY29uc3QgcGFja2FnZUpzb25QYXRoczogc3RyaW5nW10gPSBbXTtcbiAgZm9yIChjb25zdCBkaXJlbnQgb2YgYXdhaXQgZnMucHJvbWlzZXMucmVhZGRpcihkaXJQYXRoLCB7IHdpdGhGaWxlVHlwZXM6IHRydWUgfSkpIHtcbiAgICBpZiAoZGlyZW50Lm5hbWUgPT09ICdub2RlX21vZHVsZXMnIHx8IGRpcmVudC5uYW1lID09PSAnLmdpdCcpIGNvbnRpbnVlO1xuXG4gICAgY29uc3QgY2hpbGRQYXRoID0gcGF0aC5qb2luKGRpclBhdGgsIGRpcmVudC5uYW1lKTtcbiAgICBpZiAoZGlyZW50LmlzRGlyZWN0b3J5KCkpIHtcbiAgICAgIHBhY2thZ2VKc29uUGF0aHMucHVzaCguLi4oYXdhaXQgZmluZFBhY2thZ2VKc29uUGF0aHMoY2hpbGRQYXRoKSkpO1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGlmIChkaXJlbnQuaXNGaWxlKCkgJiYgZGlyZW50Lm5hbWUgPT09ICdwYWNrYWdlLmpzb24nKSB7XG4gICAgICBwYWNrYWdlSnNvblBhdGhzLnB1c2goY2hpbGRQYXRoKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHBhY2thZ2VKc29uUGF0aHM7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHJlYWRQYWNrYWdlSnNvbihwYWNrYWdlSnNvblBhdGg6IHN0cmluZyk6IFByb21pc2U8UGFja2FnZUpzb24+IHtcbiAgcmV0dXJuIEpTT04ucGFyc2UoYXdhaXQgZnMucHJvbWlzZXMucmVhZEZpbGUocGFja2FnZUpzb25QYXRoLCAndXRmOCcpKSBhcyBQYWNrYWdlSnNvbjtcbn1cblxuZnVuY3Rpb24gdG9VbnNjb3BlZFBhY2thZ2VOYW1lKHBhY2thZ2VOYW1lOiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gcGFja2FnZU5hbWUucmVwbGFjZSgvXkB3aWxsYm9vc3Rlcig/Oi1wcml2YXRlKT9cXC8vLCAnJyk7XG59XG5cbmZ1bmN0aW9uIHByaW50RHJ5UnVuUmVzdWx0KG91dERpclBhdGg6IHN0cmluZywgcHJpdmF0ZVBhY2thZ2VzOiBNYXA8c3RyaW5nLCBQcml2YXRlUGFja2FnZT4pOiB2b2lkIHtcbiAgY29uc29sZS5pbmZvKGBbZHJ5LXJ1bl0gV291bGQgcmVjcmVhdGUgJHtvdXREaXJQYXRofWApO1xuICBmb3IgKGNvbnN0IHByaXZhdGVQYWNrYWdlIG9mIHByaXZhdGVQYWNrYWdlcy52YWx1ZXMoKSkge1xuICAgIGNvbnNvbGUuaW5mbyhcbiAgICAgIHByaXZhdGVQYWNrYWdlLmtpbmQgPT09ICdnaXQnXG4gICAgICAgID8gYFtkcnktcnVuXSBXb3VsZCBjb3B5ICR7cHJpdmF0ZVBhY2thZ2UubmFtZX06ICR7cHJpdmF0ZVBhY2thZ2Uuc291cmNlRGlyUGF0aCA/PyAnKGluc3RhbGxlZCB1bmRlciBub2RlX21vZHVsZXMpJ31gXG4gICAgICAgIDogYFtkcnktcnVuXSBXb3VsZCBkb3dubG9hZCAke3ByaXZhdGVQYWNrYWdlLm5hbWV9QCR7cHJpdmF0ZVBhY2thZ2UudmVyc2lvblNwZWNpZmllcn0gdG8gJHtwcml2YXRlUGFja2FnZS50YXJnZXREaXJQYXRofWBcbiAgICApO1xuICB9XG4gIGNvbnNvbGUuaW5mbyhgW2RyeS1ydW5dIFdvdWxkIHJld3JpdGUgY29waWVkIHByaXZhdGUgZGVwZW5kZW5jaWVzIHRvIGZpbGU6Li4vPG5hbWU+YCk7XG59XG4iLCJpbXBvcnQgdHlwZSB7IEFyZ3VtZW50c0NhbWVsQ2FzZSwgSW5mZXJyZWRPcHRpb25UeXBlcyB9IGZyb20gJ3lhcmdzJztcblxuaW1wb3J0IHsgc2hlbGxFc2NhcGVBcmd1bWVudCB9IGZyb20gJy4uL3V0aWxzL3NoZWxsLmpzJztcblxuZXhwb3J0IGNvbnN0IHNjcmlwdE9wdGlvbnNCdWlsZGVyID0ge1xuICB3YXRjaDoge1xuICAgIGRlc2NyaXB0aW9uOiAnV2hldGhlciB0byB3YXRjaCBmaWxlcycsXG4gICAgdHlwZTogJ2Jvb2xlYW4nLFxuICB9LFxuICBhcmdzOiB7XG4gICAgZGVzY3JpcHRpb246ICdBcmd1bWVudHMgZm9yIGNvcmUgY29tbWFuZCcsXG4gICAgdHlwZTogJ2FycmF5JyxcbiAgICBhbGlhczogJ2EnLFxuICAgIGRlZmF1bHQ6IFtdLFxuICB9LFxuICAnZG9ja2VyLW9wdGlvbnMnOiB7XG4gICAgZGVzY3JpcHRpb246ICdBcmd1bWVudHMgZm9yIFwiZG9ja2VyIHJ1blwiJyxcbiAgICB0eXBlOiAnYXJyYXknLFxuICAgIGRlZmF1bHQ6IFtdLFxuICB9LFxufSBhcyBjb25zdDtcblxuZXhwb3J0IHR5cGUgU2NyaXB0QXJndiA9IFBhcnRpYWw8QXJndW1lbnRzQ2FtZWxDYXNlPEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIHNjcmlwdE9wdGlvbnNCdWlsZGVyPj4+ICYge1xuICAnLS0nPzogc3RyaW5nW107XG4gIG5vcm1hbGl6ZWRBcmdzVGV4dD86IHN0cmluZztcbiAgbm9ybWFsaXplZERvY2tlck9wdGlvbnNUZXh0Pzogc3RyaW5nO1xuICBzaWxlbnQ/OiBib29sZWFuO1xuICB2ZXJib3NlPzogYm9vbGVhbjtcbn07XG5cbmV4cG9ydCBmdW5jdGlvbiBub3JtYWxpemVBcmdzKFxuICBhcmd2OiBQYXJ0aWFsPEFyZ3VtZW50c0NhbWVsQ2FzZTxJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBzY3JpcHRPcHRpb25zQnVpbGRlcj4+PiAmIHsgJy0tJz86IHN0cmluZ1tdIH1cbik6IHZvaWQge1xuICAoYXJndiBhcyBTY3JpcHRBcmd2KS5ub3JtYWxpemVkQXJnc1RleHQgPSBbLi4uKGFyZ3YuYXJncyA/PyBbXSksIC4uLihhcmd2Ll8/LnNsaWNlKDEpID8/IFtdKSwgLi4uKGFyZ3ZbJy0tJ10gPz8gW10pXVxuICAgIC5tYXAoKGFyZykgPT4gc2hlbGxFc2NhcGVBcmd1bWVudChTdHJpbmcoYXJnKSkpXG4gICAgLmpvaW4oJyAnKTtcbiAgKGFyZ3YgYXMgU2NyaXB0QXJndikubm9ybWFsaXplZERvY2tlck9wdGlvbnNUZXh0ID0gKGFyZ3YuZG9ja2VyT3B0aW9ucyA/PyBbXSlcbiAgICAubWFwKChhcmcpID0+IHNoZWxsRXNjYXBlQXJndW1lbnQoU3RyaW5nKGFyZykpKVxuICAgIC5qb2luKCcgJyk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB0b0Rldk51bGwoYXJndjogdW5rbm93bik6IHN0cmluZyB7XG4gIHJldHVybiAoYXJndiBhcyB7IHNpbGVudDogYm9vbGVhbiB9KS5zaWxlbnQgPyBgID4gL2Rldi9udWxsYCA6ICcnO1xufVxuIiwiaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHR5cGUgeyBQcm9qZWN0IH0gZnJvbSAnLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQgeyBzcGF3blN5bmNPbkV4aXQgfSBmcm9tICcuLi91dGlscy9wcm9jZXNzLmpzJztcblxuLyoqXG4gKiBBIGNvbGxlY3Rpb24gb2Ygc2NyaXB0cyBmb3IgZXhlY3V0aW5nIERvY2tlciBjb21tYW5kcy5cbiAqIE5vdGUgdGhhdCBgWUFSTiB6enpgIGlzIHJlcGxhY2VkIHdpdGggYHlhcm4genp6YCBvciBgbm9kZV9tb2R1bGVzLy5iaW4venp6YC5cbiAqL1xuY2xhc3MgRG9ja2VyU2NyaXB0cyB7XG4gIGJ1aWxkSW1hZ2UocHJvamVjdDogUHJvamVjdCwgdmVyc2lvbjogc3RyaW5nKTogc3RyaW5nIHtcbiAgICAvLyBlLmcuIGNvZGluZy1ib29zdGVyIHVzZXMgYFwiZG9ja2VyL2J1aWxkL3ByZXBhcmVcIjogXCJ0b3VjaCBkcmlsbC11c2Vycy5jc3ZcIixgXG4gICAgY29uc3QgcHJlZml4ID0gcHJvamVjdC5kb2NrZXJQYWNrYWdlSnNvbi5zY3JpcHRzPy5bJ2RvY2tlci9idWlsZC9wcmVwYXJlJ11cbiAgICAgID8gJ1lBUk4gcnVuIGRvY2tlci9idWlsZC9wcmVwYXJlICYmICdcbiAgICAgIDogJyc7XG4gICAgY29uc3QgbWlzZUFnZUtleVNlY3JldE9wdGlvbiA9IHByb2plY3QuZW52Lk1JU0VfQUdFX0tFWVxuICAgICAgPyAnXFxuICAgICAgICAtLXNlY3JldCBpZD1taXNlX2FnZV9rZXksZW52PU1JU0VfQUdFX0tFWSdcbiAgICAgIDogJyc7XG4gICAgcmV0dXJuIGBjZCAke3BhdGguZGlybmFtZShwcm9qZWN0LmZpbmRGaWxlKCdEb2NrZXJmaWxlJykpfVxuICAgICYmICR7cHJlZml4fVlBUk4gd2Igb3B0aW1pemVGb3JEb2NrZXJCdWlsZCAtLW91dHNpZGVcbiAgICAmJiBZQVJOIHdiIHJldHJ5IC0tIGRvY2tlciBidWlsZCAtdCAke3Byb2plY3QuZG9ja2VySW1hZ2VOYW1lfVxuICAgICAgICAtLWJ1aWxkLWFyZyBBUkNIPSQoWyAkKHVuYW1lIC1tKSA9ICdhcm02NCcgXSAmJiBlY2hvIGFybTY0IHx8IGVjaG8geDg2XzY0KVxuICAgICAgICAtLWJ1aWxkLWFyZyBXQl9FTlY9JHtwcm9qZWN0LmVudi5XQl9FTlZ9XG4gICAgICAgIC0tYnVpbGQtYXJnIFdCX1ZFUlNJT049JHt2ZXJzaW9ufSR7bWlzZUFnZUtleVNlY3JldE9wdGlvbn0gLmA7XG4gIH1cblxuICBzdG9wQW5kU3RhcnQocHJvamVjdDogUHJvamVjdCwgYWRkaXRpb25hbE9wdGlvbnMgPSAnJywgYWRkaXRpb25hbEFyZ3MgPSAnJyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGAke3RoaXMuc3RvcChwcm9qZWN0KX0gJiYgJHt0aGlzLnN0YXJ0KHByb2plY3QsIGFkZGl0aW9uYWxPcHRpb25zLCBhZGRpdGlvbmFsQXJncyl9YDtcbiAgfVxuXG4gIHN0YXJ0KHByb2plY3Q6IFByb2plY3QsIGFkZGl0aW9uYWxPcHRpb25zID0gJycsIGFkZGl0aW9uYWxBcmdzID0gJycpOiBzdHJpbmcge1xuICAgIHNwYXduU3luY09uRXhpdCh0aGlzLnN0b3AocHJvamVjdCksIHByb2plY3QpO1xuICAgIGNvbnN0IGFsbG9jYXRlVHR5ID0gYWRkaXRpb25hbEFyZ3MuaW5jbHVkZXMoJy9iaW4vYmFzaCcpO1xuICAgIGNvbnN0IG1pc2VBZ2VLZXlFbnZPcHRpb24gPSBwcm9qZWN0LmVudi5NSVNFX0FHRV9LRVkgPyAnLS1lbnYgTUlTRV9BR0VfS0VZICcgOiAnJztcbiAgICByZXR1cm4gYGRvY2tlciBydW4gLS1ybSAke2FsbG9jYXRlVHR5ID8gJy1pdCAnIDogJyd9JHttaXNlQWdlS2V5RW52T3B0aW9ufS0tcHVibGlzaCAke3Byb2plY3QuZW52LlBPUlR9OjgwODAgLS1uYW1lICR7cHJvamVjdC5kb2NrZXJJbWFnZU5hbWV9ICR7YWRkaXRpb25hbE9wdGlvbnN9ICR7cHJvamVjdC5kb2NrZXJJbWFnZU5hbWV9ICR7YWRkaXRpb25hbEFyZ3N9YDtcbiAgfVxuXG4gIHN0b3AocHJvamVjdDogUHJvamVjdCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGBkb2NrZXIgcm0gLWYgJHtwcm9qZWN0LmRvY2tlckltYWdlTmFtZX0gPiAvZGV2L251bGwgMj4mMSB8fCB0cnVlYDtcbiAgfVxuXG4gIHN0b3BBbGwoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gYHRydWUgJChkb2NrZXIgcm0gLWYgJChkb2NrZXIgcHMgLXEpIDI+IC9kZXYvbnVsbClgO1xuICB9XG59XG5cbmV4cG9ydCBjb25zdCBkb2NrZXJTY3JpcHRzID0gbmV3IERvY2tlclNjcmlwdHMoKTtcbiIsImltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB0eXBlIHsgVGVzdEFyZ3YgfSBmcm9tICcuLi8uLi9jb21tYW5kcy90ZXN0LmpzJztcbmltcG9ydCB0eXBlIHsgUHJvamVjdCB9IGZyb20gJy4uLy4uL3Byb2plY3QuanMnO1xuaW1wb3J0IHsgaXNQcm9qZWN0RW52aXJvbm1lbnQgfSBmcm9tICcuLi8uLi9wcm9qZWN0LmpzJztcbmltcG9ydCB7IGJ1aWxkRW52UmVhZGVyT3B0aW9uQXJncyB9IGZyb20gJy4uLy4uL3NoYXJlZE9wdGlvbnNCdWlsZGVyLmpzJztcbmltcG9ydCB7IGNoZWNrQW5kS2lsbFBvcnRQcm9jZXNzIH0gZnJvbSAnLi4vLi4vdXRpbHMvcG9ydC5qcyc7XG5pbXBvcnQgeyBidWlsZFNoZWxsQ29tbWFuZCwgYnVpbGRTaGVsbEVudmlyb25tZW50QXNzaWdubWVudCB9IGZyb20gJy4uLy4uL3V0aWxzL3NoZWxsLmpzJztcbmltcG9ydCB7XG4gIGZpbmREMU1pZ3JhdGlvbnNEaXJQYXRoLFxuICBmaW5kV3JhbmdsZXJDb25maWdQYXRoLFxuICBnZXRMb2NhbFdyYW5nbGVyU3RhdGVEaXIsXG4gIHdyYXBXaXRoTG9jYWxEMURhdGFiYXNlVXJsLFxufSBmcm9tICcuLi8uLi91dGlscy93cmFuZ2xlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFNjcmlwdEFyZ3YgfSBmcm9tICcuLi9idWlsZGVyLmpzJztcbmltcG9ydCB7IHRvRGV2TnVsbCB9IGZyb20gJy4uL2J1aWxkZXIuanMnO1xuaW1wb3J0IHsgZG9ja2VyU2NyaXB0cyB9IGZyb20gJy4uL2RvY2tlclNjcmlwdHMuanMnO1xuaW1wb3J0IHsgZHJpenpsZVNjcmlwdHMgfSBmcm9tICcuLi9kcml6emxlU2NyaXB0cy5qcyc7XG5pbXBvcnQgeyBwcmlzbWFTY3JpcHRzIH0gZnJvbSAnLi4vcHJpc21hU2NyaXB0cy5qcyc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgVGVzdEUyRU9wdGlvbnMge1xuICAvKiogJy0tZTJlIGdlbmVyYXRlJyBjYWxscyAnY29kZWdlbiBodHRwOi8vbG9jYWxob3N0OjgwODAnICovXG4gIHBsYXl3cmlnaHRBcmdzPzogc3RyaW5nW107XG4gIC8qKiBSYXcgUGxheXdyaWdodCBhcmdzIGZvcndhcmRlZCBhZnRlciBgd2IgdGVzdCAtLSAuLi5gICovXG4gIGZvcndhcmRlZFBsYXl3cmlnaHRBcmdzPzogc3RyaW5nW107XG59XG5cbi8qKlxuICogQSBjb2xsZWN0aW9uIG9mIHNjcmlwdHMgZm9yIGV4ZWN1dGluZyBhbiBhcHAuXG4gKiBOb3RlIHRoYXQgWUFSTiB6enpgIGlzIHJlcGxhY2VkIHdpdGggYHlhcm4genp6YCBvciBgbm9kZV9tb2R1bGVzLy5iaW4venp6YC5cbiAqL1xuZXhwb3J0IGFic3RyYWN0IGNsYXNzIEJhc2VTY3JpcHRzIHtcbiAgcHJpdmF0ZSByZWFkb25seSBzaG91bGRXYWl0QW5kT3BlbkFwcDogYm9vbGVhbjtcbiAgcHJvdGVjdGVkIGNvbnN0cnVjdG9yKHNob3VsZFdhaXRBbmRPcGVuQXBwOiBib29sZWFuKSB7XG4gICAgdGhpcy5zaG91bGRXYWl0QW5kT3BlbkFwcCA9IHNob3VsZFdhaXRBbmRPcGVuQXBwO1xuICB9XG5cbiAgYnVpbGREb2NrZXIocHJvamVjdDogUHJvamVjdCwgdmVyc2lvbjogc3RyaW5nKTogc3RyaW5nIHtcbiAgICByZXR1cm4gZG9ja2VyU2NyaXB0cy5idWlsZEltYWdlKHByb2plY3QsIHZlcnNpb24pO1xuICB9XG5cbiAgLy8gLS0tLS0tLS0tLS0tIFNUQVJUOiBzdGFydCBjb21tYW5kcyAtLS0tLS0tLS0tLS1cbiAgYXN5bmMgc3RhcnREZXYocHJvamVjdDogUHJvamVjdCwgYXJndjogU2NyaXB0QXJndik6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgYXdhaXQgY2hlY2tBbmRLaWxsUG9ydFByb2Nlc3MocHJvamVjdC5lbnYuUE9SVCwgcHJvamVjdCk7XG4gICAgaWYgKCF0aGlzLnNob3VsZFdhaXRBbmRPcGVuQXBwKSByZXR1cm4gdGhpcy5zdGFydERldlByb3RlY3RlZChwcm9qZWN0LCBhcmd2KTtcblxuICAgIHJldHVybiBidWlsZFNoZWxsQ29tbWFuZChbXG4gICAgICAnWUFSTicsXG4gICAgICAnd2InLFxuICAgICAgJ2NvbmN1cnJlbnRseScsXG4gICAgICAuLi5idWlsZEVudlJlYWRlck9wdGlvbkFyZ3MoYXJndiksXG4gICAgICAnLS1raWxsLW90aGVycy1vbi1mYWlsJyxcbiAgICAgIHRoaXMuc3RhcnREZXZQcm90ZWN0ZWQocHJvamVjdCwgYXJndiksXG4gICAgICB0aGlzLndhaXRBbmRPcGVuQXBwKHByb2plY3QpLFxuICAgIF0pO1xuICB9XG4gIGFzeW5jIHN0YXJ0UHJvZHVjdGlvbihwcm9qZWN0OiBQcm9qZWN0LCBhcmd2OiBTY3JpcHRBcmd2KTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICBhd2FpdCBjaGVja0FuZEtpbGxQb3J0UHJvY2Vzcyhwcm9qZWN0LmVudi5QT1JULCBwcm9qZWN0KTtcbiAgICBpZiAoIXRoaXMuc2hvdWxkV2FpdEFuZE9wZW5BcHApIHJldHVybiB0aGlzLnN0YXJ0UHJvZHVjdGlvblByb3RlY3RlZChwcm9qZWN0LCBhcmd2KTtcblxuICAgIHJldHVybiBidWlsZFNoZWxsQ29tbWFuZChbXG4gICAgICAnWUFSTicsXG4gICAgICAnd2InLFxuICAgICAgJ2NvbmN1cnJlbnRseScsXG4gICAgICAuLi5idWlsZEVudlJlYWRlck9wdGlvbkFyZ3MoYXJndiksXG4gICAgICAnLS1raWxsLW90aGVycy1vbi1mYWlsJyxcbiAgICAgIHRoaXMuc3RhcnRQcm9kdWN0aW9uUHJvdGVjdGVkKHByb2plY3QsIGFyZ3YpLFxuICAgICAgdGhpcy53YWl0QW5kT3BlbkFwcChwcm9qZWN0KSxcbiAgICBdKTtcbiAgfVxuICBhc3luYyBzdGFydFRlc3QocHJvamVjdDogUHJvamVjdCwgYXJndjogU2NyaXB0QXJndik6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgYXdhaXQgY2hlY2tBbmRLaWxsUG9ydFByb2Nlc3MocHJvamVjdC5lbnYuUE9SVCwgcHJvamVjdCk7XG4gICAgcmV0dXJuIHRoaXMuc3RhcnRQcm9kdWN0aW9uUHJvdGVjdGVkKHByb2plY3QsIGFyZ3YpO1xuICB9XG4gIGFzeW5jIHN0YXJ0RG9ja2VyKHByb2plY3Q6IFByb2plY3QsIGFyZ3Y6IFNjcmlwdEFyZ3YpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIGF3YWl0IGNoZWNrQW5kS2lsbFBvcnRQcm9jZXNzKHByb2plY3QuZW52LlBPUlQsIHByb2plY3QpO1xuICAgIGlmICghdGhpcy5zaG91bGRXYWl0QW5kT3BlbkFwcCkge1xuICAgICAgcmV0dXJuIGAke3RoaXMuYnVpbGREb2NrZXIocHJvamVjdCwgJ2RldmVsb3BtZW50Jyl9XG4gICAgICAmJiAke2RvY2tlclNjcmlwdHMuc3RvcEFuZFN0YXJ0KHByb2plY3QsIGFyZ3Yubm9ybWFsaXplZERvY2tlck9wdGlvbnNUZXh0ID8/ICcnLCBhcmd2Lm5vcm1hbGl6ZWRBcmdzVGV4dCA/PyAnJyl9YDtcbiAgICB9XG5cbiAgICByZXR1cm4gYCR7dGhpcy5idWlsZERvY2tlcihwcm9qZWN0LCAnZGV2ZWxvcG1lbnQnKX1cbiAgICAgICYmICR7YnVpbGRTaGVsbENvbW1hbmQoW1xuICAgICAgICAnWUFSTicsXG4gICAgICAgICd3YicsXG4gICAgICAgICdjb25jdXJyZW50bHknLFxuICAgICAgICAuLi5idWlsZEVudlJlYWRlck9wdGlvbkFyZ3MoYXJndiksXG4gICAgICAgICctLWtpbGwtb3RoZXJzLW9uLWZhaWwnLFxuICAgICAgICBkb2NrZXJTY3JpcHRzLnN0b3BBbmRTdGFydChwcm9qZWN0LCBhcmd2Lm5vcm1hbGl6ZWREb2NrZXJPcHRpb25zVGV4dCA/PyAnJywgYXJndi5ub3JtYWxpemVkQXJnc1RleHQgPz8gJycpLFxuICAgICAgICB0aGlzLndhaXRBbmRPcGVuQXBwKHByb2plY3QpLFxuICAgICAgXSl9YDtcbiAgfVxuXG4gIHByb3RlY3RlZCBhYnN0cmFjdCBzdGFydERldlByb3RlY3RlZChfOiBQcm9qZWN0LCBhcmd2OiBTY3JpcHRBcmd2KTogc3RyaW5nO1xuICBwcm90ZWN0ZWQgc3RhcnRQcm9kdWN0aW9uUHJvdGVjdGVkKHByb2plY3Q6IFByb2plY3QsIGFyZ3Y6IFNjcmlwdEFyZ3YpOiBzdHJpbmcge1xuICAgIGNvbnN0IGN1c3RvbVN0YXJ0U2NyaXB0UGF0aCA9IGZpbmRDdXN0b21Qcm9kdWN0aW9uU3RhcnRTY3JpcHRQYXRoKHByb2plY3QpO1xuICAgIGlmIChjdXN0b21TdGFydFNjcmlwdFBhdGgpIHtcbiAgICAgIGNvbnN0IHN0YXJ0Q29tbWFuZCA9XG4gICAgICAgIGAke2J1aWxkU2hlbGxDb21tYW5kKFsnYmFzaCcsIGN1c3RvbVN0YXJ0U2NyaXB0UGF0aF0pfSAke2FyZ3Yubm9ybWFsaXplZEFyZ3NUZXh0ID8/ICcnfWAudHJpbSgpO1xuICAgICAgLy8gQSBzdGFydCBzY3JpcHQgZm91bmQgYXQgdGhlIG1vbm9yZXBvIHJvb3QgKGNmLiBQcm9qZWN0LmZpbmRGaWxlKSBpcyB3cml0dGVuIHRvIHJ1biBmcm9tXG4gICAgICAvLyB0aGUgcm9vdCwgbGlrZSBEb2NrZXIncyBXT1JLRElSLCBzbyBpdHMgY3dkIG11c3QgYmUgdGhlIGRpcmVjdG9yeSBjb250YWluaW5nIHNjcmlwdHMvLlxuICAgICAgY29uc3Qgc2NyaXB0Um9vdERpclBhdGggPSBwYXRoLmRpcm5hbWUocGF0aC5kaXJuYW1lKGN1c3RvbVN0YXJ0U2NyaXB0UGF0aCkpO1xuICAgICAgcmV0dXJuIHRoaXMuYnVpbGRQcm9kdWN0aW9uQ29tbWFuZChwcm9qZWN0LCBhcmd2LCBbXG4gICAgICAgIHByb2plY3QuYnVpbGRDb21tYW5kLFxuICAgICAgICBzY3JpcHRSb290RGlyUGF0aCA9PT0gcHJvamVjdC5kaXJQYXRoXG4gICAgICAgICAgPyBzdGFydENvbW1hbmRcbiAgICAgICAgICA6IGAoJHtidWlsZFNoZWxsQ29tbWFuZChbJ2NkJywgc2NyaXB0Um9vdERpclBhdGhdKX0gJiYgJHtzdGFydENvbW1hbmR9KWAsXG4gICAgICBdKTtcbiAgICB9XG5cbiAgICBjb25zdCBlY29zeXN0ZW1Db25maWdQYXRoID0gZmluZEVjb3N5c3RlbUNvbmZpZ1BhdGgocHJvamVjdCk7XG4gICAgY29uc3QgY29tbWFuZHMgPSBlY29zeXN0ZW1Db25maWdQYXRoXG4gICAgICA/IFtwcm9qZWN0LmJ1aWxkQ29tbWFuZCwgYHBtMi1ydW50aW1lIHN0YXJ0IC0tbm8tYXV0b3Jlc3RhcnQgJHtlY29zeXN0ZW1Db25maWdQYXRofWBdXG4gICAgICA6IHRoaXMuYnVpbGREZWZhdWx0UHJvZHVjdGlvblN0YXJ0Q29tbWFuZHMocHJvamVjdCwgYXJndik7XG5cbiAgICByZXR1cm4gdGhpcy5idWlsZFByb2R1Y3Rpb25Db21tYW5kKHByb2plY3QsIGFyZ3YsIGNvbW1hbmRzKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBidWlsZERlZmF1bHRQcm9kdWN0aW9uU3RhcnRDb21tYW5kcyhwcm9qZWN0OiBQcm9qZWN0LCBhcmd2OiBTY3JpcHRBcmd2KTogc3RyaW5nW10ge1xuICAgIHJldHVybiBbXG4gICAgICBwcm9qZWN0LmJ1aWxkQ29tbWFuZCxcbiAgICAgIGAke3Byb2plY3QuaXNCdW5BdmFpbGFibGUgPyAnYnVuJyA6ICdub2RlJ30gZGlzdC9pbmRleC5qcyAke2FyZ3Yubm9ybWFsaXplZEFyZ3NUZXh0ID8/ICcnfWAudHJpbSgpLFxuICAgIF07XG4gIH1cblxuICBwcm90ZWN0ZWQgYnVpbGRQcm9kdWN0aW9uQ29tbWFuZChwcm9qZWN0OiBQcm9qZWN0LCBhcmd2OiBTY3JpcHRBcmd2LCBjb21tYW5kczogc3RyaW5nW10pOiBzdHJpbmcge1xuICAgIC8vIFRlc3QtZW52aXJvbm1lbnQgd3JhbmdsZXIgc3RhdGUgaXMgZGlzcG9zYWJsZTsgd2lwZSBpdCBlbnRpcmVseSAobm90IGp1c3QgRDEpIGJlZm9yZVxuICAgIC8vIG1pZ3JhdGluZywgc2luY2Ugc3RhbGUgS1YgY2FjaGUgZW50cmllcyBvciBEdXJhYmxlIE9iamVjdCBzdG9yYWdlIGNhbiBicmVhayBlMmUgdGVzdHMuXG4gICAgY29uc3Qgd3JhbmdsZXJTdGF0ZVdpcGVDb21tYW5kcyA9XG4gICAgICBpc1Byb2plY3RFbnZpcm9ubWVudChwcm9qZWN0LCAndGVzdCcpICYmIGZpbmRXcmFuZ2xlckNvbmZpZ1BhdGgocHJvamVjdClcbiAgICAgICAgPyBbYHJtIC1SZiBcIiR7Z2V0TG9jYWxXcmFuZ2xlclN0YXRlRGlyKHByb2plY3QpfVwiYF1cbiAgICAgICAgOiBbXTtcbiAgICAvLyBBIHByb2plY3Qgd2hvc2UgRDEgYmluZGluZ3MgY2Fycnkgd3JhbmdsZXItbmF0aXZlIG1pZ3JhdGlvbnMgYXBwbGllcyB0aGVtIHdpdGggd3JhbmdsZXJcbiAgICAvLyAoc2VlIFdvcmtlcnNTY3JpcHRzIC8gYnVpbGREMU1pZ3JhdGlvbnNBcHBseUNvbW1hbmQpLiBSdW5uaW5nIGRyaXp6bGUta2l0IG1pZ3JhdGUgYWdhaW5zdFxuICAgIC8vIHRoZSBzYW1lIGxvY2FsIEQxIHdvdWxkIGFwcGx5IHRoZSBzYW1lIFNRTCB0d2ljZSDigJQgZHJpenpsZSdzIGdlbmVyYXRlZCBzdGF0ZW1lbnRzIGFyZSBub3RcbiAgICAvLyBpZGVtcG90ZW50IChgQ1JFQVRFIElOREVYYCB3aXRob3V0IElGIE5PVCBFWElTVFMpIOKAlCBzbyBkcml6emxlIHN0YXlzIE9STS1vbmx5IHRoZXJlLlxuICAgIGNvbnN0IG1pZ3JhdGVzRDFXaXRoV3JhbmdsZXIgPSAhIWZpbmREMU1pZ3JhdGlvbnNEaXJQYXRoKHByb2plY3QpO1xuICAgIGNvbnN0IG1pZ3JhdGlvbkNvbW1hbmRzID0gW1xuICAgICAgLi4ud3JhbmdsZXJTdGF0ZVdpcGVDb21tYW5kcyxcbiAgICAgIC4uLihwcm9qZWN0Lmhhc1ByaXNtYSA/IFtwcmlzbWFTY3JpcHRzLm1pZ3JhdGUocHJvamVjdCldIDogW10pLFxuICAgICAgLi4uKHByb2plY3QuaGFzRHJpenpsZSAmJiAhbWlncmF0ZXNEMVdpdGhXcmFuZ2xlclxuICAgICAgICA/IFt3cmFwV2l0aExvY2FsRDFEYXRhYmFzZVVybChwcm9qZWN0LCBkcml6emxlU2NyaXB0cy5taWdyYXRlRm9yU3RhcnQocHJvamVjdCkpXVxuICAgICAgICA6IFtdKSxcbiAgICBdO1xuICAgIC8vIFNwbGl0dGluZyBtYXkgY3V0IHRocm91Z2ggYSBgKGNkIOKApiAmJiDigKYpYCBzdWJzaGVsbCwgYnV0IHJlam9pbmluZyB3aXRoICcgJiYgJyBhbmQgcGVyLXBpZWNlXG4gICAgLy8gcmVkaXJlY3RzIGtlZXBzIHRoZSBzY3JpcHQgdmFsaWQsIGFuZCB3Yi1nZW5lcmF0ZWQgcGF0aHMgbmV2ZXIgY29udGFpbiAnJiYnLlxuICAgIHJldHVybiBbLi4ubWlncmF0aW9uQ29tbWFuZHMuZmxhdE1hcCgoY21kKSA9PiBjbWQuc3BsaXQoJyYmJykpLCAuLi5jb21tYW5kc11cbiAgICAgIC5maWx0ZXIoQm9vbGVhbilcbiAgICAgIC5tYXAoKGNtZCkgPT4gYCR7Y21kfSAke3RvRGV2TnVsbChhcmd2KX1gLnRyaW0oKSlcbiAgICAgIC5qb2luKCcgJiYgJyk7XG4gIH1cbiAgLy8gLS0tLS0tLS0tLS0tIEVORDogc3RhcnQgY29tbWFuZHMgLS0tLS0tLS0tLS0tXG5cbiAgLy8gLS0tLS0tLS0tLS0tIFNUQVJUOiB0ZXN0IChlMmUpIGNvbW1hbmRzIC0tLS0tLS0tLS0tLVxuICB0ZXN0RTJFRGV2KHByb2plY3Q6IFByb2plY3QsIGFyZ3Y6IFRlc3RBcmd2LCBvcHRpb25zOiBUZXN0RTJFT3B0aW9ucyk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgcmV0dXJuIHRoaXMudGVzdEUyRVByb3RlY3RlZChwcm9qZWN0LCBhcmd2LCB0aGlzLnN0YXJ0RGV2UHJvdGVjdGVkKHByb2plY3QsIGFyZ3YpLCBvcHRpb25zKTtcbiAgfVxuICB0ZXN0RTJFUHJvZHVjdGlvbihwcm9qZWN0OiBQcm9qZWN0LCBhcmd2OiBUZXN0QXJndiwgb3B0aW9uczogVGVzdEUyRU9wdGlvbnMpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIHJldHVybiB0aGlzLnRlc3RFMkVQcm90ZWN0ZWQocHJvamVjdCwgYXJndiwgdGhpcy5zdGFydFByb2R1Y3Rpb25Qcm90ZWN0ZWQocHJvamVjdCwgYXJndiksIG9wdGlvbnMpO1xuICB9XG4gIHRlc3RFMkVEb2NrZXIocHJvamVjdDogUHJvamVjdCwgYXJndjogVGVzdEFyZ3YsIG9wdGlvbnM6IFRlc3RFMkVPcHRpb25zKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICByZXR1cm4gdGhpcy50ZXN0RTJFUHJvdGVjdGVkKHByb2plY3QsIGFyZ3YsIGRvY2tlclNjcmlwdHMuc3RvcEFuZFN0YXJ0KHByb2plY3QpLCBvcHRpb25zKTtcbiAgfVxuICBhc3luYyB0ZXN0U3RhcnQocHJvamVjdDogUHJvamVjdCwgYXJndjogU2NyaXB0QXJndik6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgcHJvamVjdC5lbnYuUE9SVCB8fD0gJzMwMDAnO1xuICAgIGF3YWl0IGNoZWNrQW5kS2lsbFBvcnRQcm9jZXNzKHByb2plY3QuZW52LlBPUlQsIHByb2plY3QpO1xuICAgIC8vIFVzZSBlbXB0eSBOT0RFX0VOViB0byBhdm9pZCBcInByb2R1Y3Rpb25cIiBtb2RlIGluIHNvbWUgZnJhbWV3b3JrcyBsaWtlIEJsaXR6LmpzLlxuICAgIHJldHVybiBgJHtidWlsZFNoZWxsRW52aXJvbm1lbnRBc3NpZ25tZW50KCdOT0RFX0VOVicsICcnKX0gJHtidWlsZFNoZWxsQ29tbWFuZChbXG4gICAgICAnWUFSTicsXG4gICAgICAnd2InLFxuICAgICAgJ2NvbmN1cnJlbnRseScsXG4gICAgICAuLi5idWlsZEVudlJlYWRlck9wdGlvbkFyZ3MoYXJndiksXG4gICAgICAnLS1raWxsLW90aGVycycsXG4gICAgICAnLS1zdWNjZXNzJyxcbiAgICAgICdmaXJzdCcsXG4gICAgICB0aGlzLnN0YXJ0RGV2UHJvdGVjdGVkKHByb2plY3QsIGFyZ3YpLFxuICAgICAgdGhpcy53YWl0QXBwKHByb2plY3QpLFxuICAgIF0pfWA7XG4gIH1cblxuICBhc3luYyB0ZXN0RTJFUHJvdGVjdGVkKFxuICAgIHByb2plY3Q6IFByb2plY3QsXG4gICAgYXJndjogVGVzdEFyZ3YsXG4gICAgc3RhcnRDb21tYW5kOiBzdHJpbmcsXG4gICAgeyBmb3J3YXJkZWRQbGF5d3JpZ2h0QXJncyA9IFtdLCBwbGF5d3JpZ2h0QXJncyA9IFsndGVzdCcsICd0ZXN0L2UyZS8nXSB9OiBUZXN0RTJFT3B0aW9uc1xuICApOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIHByb2plY3QuZW52LlBPUlQgfHw9ICczMDAwJztcbiAgICBjb25zdCBwb3J0ID0gYXdhaXQgY2hlY2tBbmRLaWxsUG9ydFByb2Nlc3MocHJvamVjdC5lbnYuUE9SVCwgcHJvamVjdCk7XG4gICAgY29uc3Qgc3VmZml4ID0gcHJvamVjdC5wYWNrYWdlSnNvbi5zY3JpcHRzPy5bJ3Rlc3QvZTJlLWFkZGl0aW9uYWwnXSA/ICcgJiYgWUFSTiB0ZXN0L2UyZS1hZGRpdGlvbmFsJyA6ICcnO1xuICAgIGNvbnN0IHBsYXl3cmlnaHRDb21tYW5kID0gYnVpbGRQbGF5d3JpZ2h0Q29tbWFuZChwbGF5d3JpZ2h0QXJncywgYXJndi50YXJnZXRzLCBhcmd2LmJhaWwsIGZvcndhcmRlZFBsYXl3cmlnaHRBcmdzKTtcbiAgICBpZiAocHJvamVjdC5za2lwTGF1bmNoaW5nU2VydmVyRm9yUGxheXdyaWdodCkge1xuICAgICAgcmV0dXJuIGAke3BsYXl3cmlnaHRDb21tYW5kfSR7c3VmZml4fWA7XG4gICAgfVxuXG4gICAgcmV0dXJuIGJ1aWxkU2hlbGxDb21tYW5kKFtcbiAgICAgICdZQVJOJyxcbiAgICAgICd3YicsXG4gICAgICAnY29uY3VycmVudGx5JyxcbiAgICAgIC4uLmJ1aWxkRW52UmVhZGVyT3B0aW9uQXJncyhhcmd2KSxcbiAgICAgICctLWtpbGwtb3RoZXJzJyxcbiAgICAgICctLXN1Y2Nlc3MnLFxuICAgICAgJ2ZpcnN0JyxcbiAgICAgIGAke3N0YXJ0Q29tbWFuZH0gJiYgZXhpdCAxYCxcbiAgICAgIGB3YWl0LW9uIC10IDYwMDAwMCAtaSAyMDAwIGh0dHAtZ2V0Oi8vMTI3LjAuMC4xOiR7cG9ydH1cbiAgICAgICAgJiYgJHtwbGF5d3JpZ2h0Q29tbWFuZH0ke3N1ZmZpeH1gLFxuICAgIF0pO1xuICB9XG4gIC8vIC0tLS0tLS0tLS0tLSBFTkQ6IHRlc3QgKGUyZSkgY29tbWFuZHMgLS0tLS0tLS0tLS0tXG5cbiAgdGVzdFVuaXQocHJvamVjdDogUHJvamVjdCwgYXJndjogVGVzdEFyZ3YpOiBzdHJpbmcge1xuICAgIGNvbnN0IHRhcmdldHMgPSBhcmd2LnRhcmdldHM/Lm1hcChTdHJpbmcpO1xuICAgIGlmIChwcm9qZWN0Lmhhc1ZpdGVzdCkge1xuICAgICAgLy8gU2luY2UgdGhpcyBjb21tYW5kIGlzIHJlZmVycmVkIGZyb20gb3RoZXIgY29tbWFuZHMsIHdlIGhhdmUgdG8gdXNlIFwidml0ZXN0IHJ1blwiIChub24taW50ZXJhY3RpdmUgbW9kZSkuXG4gICAgICByZXR1cm4gYnVpbGRTaGVsbENvbW1hbmQoW1xuICAgICAgICAnWUFSTicsXG4gICAgICAgICd2aXRlc3QnLFxuICAgICAgICAncnVuJyxcbiAgICAgICAgLi4uKHRhcmdldHM/Lmxlbmd0aCA/IHRhcmdldHMgOiBbJ3Rlc3QvdW5pdC8nXSksXG4gICAgICAgICctLXBhc3NXaXRoTm9UZXN0cycsXG4gICAgICAgICctLWFsbG93T25seScsXG4gICAgICAgICctLXdhdGNoPWZhbHNlJyxcbiAgICAgICAgLi4uKGFyZ3YuYmFpbCA/IFsnLS1iYWlsPTEnXSA6IFtdKSxcbiAgICAgIF0pO1xuICAgIH0gZWxzZSBpZiAocHJvamVjdC5pc0J1bkF2YWlsYWJsZSkge1xuICAgICAgcmV0dXJuIGJ1aWxkU2hlbGxDb21tYW5kKFtcbiAgICAgICAgJ2J1bicsXG4gICAgICAgICd0ZXN0JyxcbiAgICAgICAgLi4uKHRhcmdldHM/Lmxlbmd0aCA/IHRhcmdldHMgOiBbJ3Rlc3QvdW5pdC8nXSksXG4gICAgICAgIC4uLihhcmd2LmJhaWwgPyBbJy0tYmFpbCddIDogW10pLFxuICAgICAgXSk7XG4gICAgfVxuICAgIHJldHVybiAnZWNobyBcIk5vIHRlc3RzLlwiJztcbiAgfVxuXG4gIHByb3RlY3RlZCB3YWl0QXBwKHByb2plY3Q6IFByb2plY3QpOiBzdHJpbmcge1xuICAgIGNvbnN0IHBvcnQgPSBwcm9qZWN0LmVudi5QT1JUO1xuICAgIHJldHVybiBgd2FpdC1vbiAtdCAxMDAwMCBodHRwLWdldDovLzEyNy4wLjAuMToke3BvcnR9IDI+IC9kZXYvbnVsbFxuICAgICAgfHwgd2FpdC1vbiAtdCAxMDAwMCAtaSA1MDAgaHR0cC1nZXQ6Ly8xMjcuMC4wLjE6JHtwb3J0fSAyPiAvZGV2L251bGxcbiAgICAgIHx8IHdhaXQtb24gLXQgMTAwMDAgLWkgMTAwMCBodHRwLWdldDovLzEyNy4wLjAuMToke3BvcnR9IDI+IC9kZXYvbnVsbFxuICAgICAgfHwgd2FpdC1vbiAtdCAxMDAwMCAtaSAyMDAwIGh0dHAtZ2V0Oi8vMTI3LjAuMC4xOiR7cG9ydH0gMj4gL2Rldi9udWxsXG4gICAgICB8fCB3YWl0LW9uIC10IDIwMDAwIC1pIDQwMDAgaHR0cC1nZXQ6Ly8xMjcuMC4wLjE6JHtwb3J0fSAyPiAvZGV2L251bGxcbiAgICAgIHx8IHdhaXQtb24gLXQgNjAwMDAgLWkgNTAwMCBodHRwLWdldDovLzEyNy4wLjAuMToke3BvcnR9IDI+IC9kZXYvbnVsbFxuICAgICAgfHwgd2FpdC1vbiAtdCA5MDAwMCAtaSAxMDAwMCBodHRwLWdldDovLzEyNy4wLjAuMToke3BvcnR9YDtcbiAgfVxuXG4gIHByb3RlY3RlZCB3YWl0QW5kT3BlbkFwcChwcm9qZWN0OiBQcm9qZWN0KTogc3RyaW5nIHtcbiAgICBjb25zdCBwb3J0ID0gcHJvamVjdC5lbnYuUE9SVDtcbiAgICByZXR1cm4gYCR7dGhpcy53YWl0QXBwKFxuICAgICAgcHJvamVjdFxuICAgICl9IHx8IHdhaXQtb24gaHR0cC1nZXQ6Ly8xMjcuMC4wLjE6JHtwb3J0fSAmJiBvcGVuLWNsaSBodHRwOi8vXFwke0hPU1Q6LWxvY2FsaG9zdH06JHtwb3J0fWA7XG4gIH1cbn1cblxuZnVuY3Rpb24gZmluZEN1c3RvbVByb2R1Y3Rpb25TdGFydFNjcmlwdFBhdGgocHJvamVjdDogUHJvamVjdCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIHByb2plY3QuZmluZEZpbGUoJ3NjcmlwdHMvc3RhcnQtcHJvZHVjdGlvbi5zaCcpO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm47XG4gIH1cbn1cblxuZnVuY3Rpb24gZmluZEVjb3N5c3RlbUNvbmZpZ1BhdGgocHJvamVjdDogUHJvamVjdCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIHByb2plY3QuZmluZEZpbGUoJ2Vjb3N5c3RlbS5jb25maWcuY2pzJyk7XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybjtcbiAgfVxufVxuXG5mdW5jdGlvbiBidWlsZFBsYXl3cmlnaHRDb21tYW5kKFxuICBwbGF5d3JpZ2h0QXJnczogc3RyaW5nW10sXG4gIHRhcmdldHM6IFRlc3RBcmd2Wyd0YXJnZXRzJ10sXG4gIGJhaWw/OiBib29sZWFuLFxuICBmb3J3YXJkZWRQbGF5d3JpZ2h0QXJnczogc3RyaW5nW10gPSBbXVxuKTogc3RyaW5nIHtcbiAgY29uc3QgYmFzZSA9IFsnQlVOJywgJ3BsYXl3cmlnaHQnXTtcbiAgY29uc3Qgbm9ybWFsaXplZFRhcmdldHMgPSB0YXJnZXRzPy5tYXAoU3RyaW5nKTtcbiAgaWYgKHBsYXl3cmlnaHRBcmdzWzBdICE9PSAndGVzdCcgfHwgIW5vcm1hbGl6ZWRUYXJnZXRzPy5sZW5ndGgpIHtcbiAgICByZXR1cm4gYXBwZW5kUGxheXdyaWdodEJhaWxPcHRpb24oWy4uLmJhc2UsIC4uLnBsYXl3cmlnaHRBcmdzLCAuLi5mb3J3YXJkZWRQbGF5d3JpZ2h0QXJnc10sIGJhaWwpO1xuICB9XG5cbiAgY29uc3QgcmVzdCA9IHBsYXl3cmlnaHRBcmdzLnNsaWNlKDEpO1xuICBjb25zdCBleHBsaWNpdFRhcmdldEluZGV4ZXMgPSBmaW5kRXhwbGljaXRQbGF5d3JpZ2h0VGFyZ2V0SW5kZXhlcyhyZXN0KTtcbiAgY29uc3QgcmVzdFdpdGhvdXRFeHBsaWNpdFRhcmdldCA9XG4gICAgZXhwbGljaXRUYXJnZXRJbmRleGVzLmxlbmd0aCA9PT0gMCA/IHJlc3QgOiByZXN0LmZpbHRlcigoXywgaW5kZXgpID0+ICFleHBsaWNpdFRhcmdldEluZGV4ZXMuaW5jbHVkZXMoaW5kZXgpKTtcbiAgcmV0dXJuIGFwcGVuZFBsYXl3cmlnaHRCYWlsT3B0aW9uKFxuICAgIFsuLi5iYXNlLCAndGVzdCcsIC4uLm5vcm1hbGl6ZWRUYXJnZXRzLCAuLi5yZXN0V2l0aG91dEV4cGxpY2l0VGFyZ2V0LCAuLi5mb3J3YXJkZWRQbGF5d3JpZ2h0QXJnc10sXG4gICAgYmFpbFxuICApO1xufVxuXG5mdW5jdGlvbiBhcHBlbmRQbGF5d3JpZ2h0QmFpbE9wdGlvbihjb21tYW5kQXJnczogc3RyaW5nW10sIGJhaWw/OiBib29sZWFuKTogc3RyaW5nIHtcbiAgY29uc3QgcGxheXdyaWdodEluZGV4ID0gY29tbWFuZEFyZ3MuaW5kZXhPZigncGxheXdyaWdodCcpO1xuICBjb25zdCBpc1BsYXl3cmlnaHRUZXN0Q29tbWFuZCA9IHBsYXl3cmlnaHRJbmRleCAhPT0gLTEgJiYgY29tbWFuZEFyZ3NbcGxheXdyaWdodEluZGV4ICsgMV0gPT09ICd0ZXN0JztcbiAgaWYgKCFiYWlsIHx8ICFpc1BsYXl3cmlnaHRUZXN0Q29tbWFuZCkge1xuICAgIHJldHVybiBidWlsZFNoZWxsQ29tbWFuZChjb21tYW5kQXJncyk7XG4gIH1cbiAgaWYgKGNvbW1hbmRBcmdzLnNvbWUoKGFyZykgPT4gYXJnID09PSAnLS1tYXgtZmFpbHVyZXMnIHx8IGFyZy5zdGFydHNXaXRoKCctLW1heC1mYWlsdXJlcz0nKSkpIHtcbiAgICByZXR1cm4gYnVpbGRTaGVsbENvbW1hbmQoY29tbWFuZEFyZ3MpO1xuICB9XG4gIHJldHVybiBidWlsZFNoZWxsQ29tbWFuZChbLi4uY29tbWFuZEFyZ3MsICctLW1heC1mYWlsdXJlcz0xJ10pO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZmluZEV4cGxpY2l0UGxheXdyaWdodFRhcmdldEluZGV4ZXMoYXJnczogc3RyaW5nW10pOiBudW1iZXJbXSB7XG4gIGxldCBwZW5kaW5nVmFsdWVNb2RlOiAnb3B0aW9uYWwnIHwgJ3JlcXVpcmVkJyB8IHVuZGVmaW5lZDtcbiAgY29uc3QgdGFyZ2V0SW5kZXhlczogbnVtYmVyW10gPSBbXTtcblxuICBmb3IgKGNvbnN0IFtpbmRleCwgYXJnXSBvZiBhcmdzLmVudHJpZXMoKSkge1xuICAgIGlmIChwZW5kaW5nVmFsdWVNb2RlKSB7XG4gICAgICBpZiAocGVuZGluZ1ZhbHVlTW9kZSA9PT0gJ3JlcXVpcmVkJyB8fCAhYXJnLnN0YXJ0c1dpdGgoJy0nKSkge1xuICAgICAgICBwZW5kaW5nVmFsdWVNb2RlID0gdW5kZWZpbmVkO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIHBlbmRpbmdWYWx1ZU1vZGUgPSB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgaWYgKGFyZyA9PT0gJy0tJykge1xuICAgICAgcmV0dXJuIFsuLi50YXJnZXRJbmRleGVzLCAuLi5hcmdzLnNsaWNlKGluZGV4ICsgMSkubWFwKChfLCBvZmZzZXQpID0+IGluZGV4ICsgMSArIG9mZnNldCldO1xuICAgIH1cbiAgICBpZiAoYXJnLnN0YXJ0c1dpdGgoJy0tJykpIHtcbiAgICAgIGlmIChhcmcuaW5jbHVkZXMoJz0nKSkgY29udGludWU7XG4gICAgICBpZiAoUExBWVdSSUdIVF9URVNUX09QVElPTlNfV0lUSF9SRVFVSVJFRF9WQUxVRVMuaGFzKGFyZykpIHtcbiAgICAgICAgcGVuZGluZ1ZhbHVlTW9kZSA9ICdyZXF1aXJlZCc7XG4gICAgICB9IGVsc2UgaWYgKFBMQVlXUklHSFRfVEVTVF9PUFRJT05TX1dJVEhfT1BUSU9OQUxfVkFMVUVTLmhhcyhhcmcpKSB7XG4gICAgICAgIHBlbmRpbmdWYWx1ZU1vZGUgPSAnb3B0aW9uYWwnO1xuICAgICAgfVxuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGlmIChhcmcuc3RhcnRzV2l0aCgnLScpICYmIGFyZyAhPT0gJy0nKSB7XG4gICAgICBjb25zdCBzaG9ydE9wdGlvbiA9IGFyZy5zbGljZSgwLCAyKTtcbiAgICAgIGlmIChhcmcubGVuZ3RoID09PSAyICYmIFBMQVlXUklHSFRfVEVTVF9TSE9SVF9PUFRJT05TX1dJVEhfUkVRVUlSRURfVkFMVUVTLmhhcyhzaG9ydE9wdGlvbikpIHtcbiAgICAgICAgcGVuZGluZ1ZhbHVlTW9kZSA9ICdyZXF1aXJlZCc7XG4gICAgICB9XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgdGFyZ2V0SW5kZXhlcy5wdXNoKGluZGV4KTtcbiAgfVxuXG4gIHJldHVybiB0YXJnZXRJbmRleGVzO1xufVxuXG5jb25zdCBQTEFZV1JJR0hUX1RFU1RfT1BUSU9OU19XSVRIX1JFUVVJUkVEX1ZBTFVFUyA9IG5ldyBTZXQoW1xuICAnLS1icm93c2VyJyxcbiAgJy0tY29uZmlnJyxcbiAgJy0tZ3JlcCcsXG4gICctLWdyZXAtaW52ZXJ0JyxcbiAgJy0tZ2xvYmFsLXRpbWVvdXQnLFxuICAnLS1tYXgtZmFpbHVyZXMnLFxuICAnLS1vdXRwdXQnLFxuICAnLS1wcm9qZWN0JyxcbiAgJy0tcmVwZWF0LWVhY2gnLFxuICAnLS1yZXBvcnRlcicsXG4gICctLXJldHJpZXMnLFxuICAnLS1zaGFyZCcsXG4gICctLXRlc3QtbGlzdCcsXG4gICctLXRlc3QtbGlzdC1pbnZlcnQnLFxuICAnLS10aW1lb3V0JyxcbiAgJy0tdHJhY2UnLFxuICAnLS10c2NvbmZpZycsXG4gICctLXVpLWhvc3QnLFxuICAnLS11aS1wb3J0JyxcbiAgJy0tdWktdGl0bGUnLFxuICAnLS13b3JrZXJzJyxcbl0pO1xuXG5jb25zdCBQTEFZV1JJR0hUX1RFU1RfT1BUSU9OU19XSVRIX09QVElPTkFMX1ZBTFVFUyA9IG5ldyBTZXQoW1xuICAnLS1vbmx5LWNoYW5nZWQnLFxuICAnLS11cGRhdGUtc25hcHNob3RzJyxcbiAgJy0tdXBkYXRlLXNvdXJjZS1tZXRob2QnLFxuXSk7XG5cbmNvbnN0IFBMQVlXUklHSFRfVEVTVF9TSE9SVF9PUFRJT05TX1dJVEhfUkVRVUlSRURfVkFMVUVTID0gbmV3IFNldChbJy1jJywgJy1nJywgJy1qJ10pO1xuIiwiaW1wb3J0IHR5cGUgeyBQcm9qZWN0IH0gZnJvbSAnLi4vLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQgdHlwZSB7IFNjcmlwdEFyZ3YgfSBmcm9tICcuLi9idWlsZGVyLmpzJztcblxuaW1wb3J0IHsgQmFzZVNjcmlwdHMgfSBmcm9tICcuL2Jhc2VTY3JpcHRzLmpzJztcblxuLyoqXG4gKiBBIGNvbGxlY3Rpb24gb2Ygc2NyaXB0cyBmb3IgZXhlY3V0aW5nIEJsaXR6LmpzIGNvbW1hbmRzLlxuICogTm90ZSB0aGF0IGBZQVJOIHp6emAgaXMgcmVwbGFjZWQgd2l0aCBgeWFybiB6enpgIG9yIGBub2RlX21vZHVsZXMvLmJpbi96enpgLlxuICovXG5jbGFzcyBCbGl0elNjcmlwdHMgZXh0ZW5kcyBCYXNlU2NyaXB0cyB7XG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKHRydWUpO1xuICB9XG5cbiAgcHJvdGVjdGVkIG92ZXJyaWRlIHN0YXJ0RGV2UHJvdGVjdGVkKF86IFByb2plY3QsIGFyZ3Y6IFNjcmlwdEFyZ3YpOiBzdHJpbmcge1xuICAgIHJldHVybiBgYmxpdHogZGV2ICR7YXJndi5ub3JtYWxpemVkQXJnc1RleHQgPz8gJyd9YDtcbiAgfVxufVxuXG5leHBvcnQgY29uc3QgYmxpdHpTY3JpcHRzID0gbmV3IEJsaXR6U2NyaXB0cygpO1xuIiwiaW1wb3J0IHR5cGUgeyBUZXN0QXJndiB9IGZyb20gJy4uLy4uL2NvbW1hbmRzL3Rlc3QuanMnO1xuaW1wb3J0IHR5cGUgeyBQcm9qZWN0IH0gZnJvbSAnLi4vLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQgeyBidWlsZEVudlJlYWRlck9wdGlvbkFyZ3MgfSBmcm9tICcuLi8uLi9zaGFyZWRPcHRpb25zQnVpbGRlci5qcyc7XG5pbXBvcnQgeyBjaGVja0FuZEtpbGxQb3J0UHJvY2VzcyB9IGZyb20gJy4uLy4uL3V0aWxzL3BvcnQuanMnO1xuaW1wb3J0IHsgYnVpbGRTaGVsbENvbW1hbmQgfSBmcm9tICcuLi8uLi91dGlscy9zaGVsbC5qcyc7XG5pbXBvcnQgdHlwZSB7IFNjcmlwdEFyZ3YgfSBmcm9tICcuLi9idWlsZGVyLmpzJztcblxuaW1wb3J0IHsgQmFzZVNjcmlwdHMsIHR5cGUgVGVzdEUyRU9wdGlvbnMgfSBmcm9tICcuL2Jhc2VTY3JpcHRzLmpzJztcblxuLyoqXG4gKiBBIGNvbGxlY3Rpb24gb2Ygc2NyaXB0cyBmb3IgZXhlY3V0aW5nIGFuIGFwcCB0aGF0IHV0aWxpemVzIGFuIEhUVFAgc2VydmVyIGxpa2UgZXhwcmVzcy5cbiAqIE5vdGUgdGhhdCBgWUFSTiB6enpgIGlzIHJlcGxhY2VkIHdpdGggYHlhcm4genp6YCBvciBgbm9kZV9tb2R1bGVzLy5iaW4venp6YC5cbiAqL1xuZXhwb3J0IGNsYXNzIEh0dHBTZXJ2ZXJTY3JpcHRzIGV4dGVuZHMgQmFzZVNjcmlwdHMge1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcihmYWxzZSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgb3ZlcnJpZGUgc3RhcnREZXZQcm90ZWN0ZWQoXzogUHJvamVjdCwgYXJndjogU2NyaXB0QXJndik6IHN0cmluZyB7XG4gICAgcmV0dXJuIGBZQVJOIGJ1aWxkLXRzIHJ1biAke2FyZ3Yud2F0Y2ggPyAnLS13YXRjaCcgOiAnJ30gc3JjL2luZGV4LnRzIC0tICR7YXJndi5ub3JtYWxpemVkQXJnc1RleHQgPz8gJyd9YDtcbiAgfVxuXG4gIG92ZXJyaWRlIGFzeW5jIHRlc3RFMkVQcm90ZWN0ZWQoXG4gICAgcHJvamVjdDogUHJvamVjdCxcbiAgICBhcmd2OiBUZXN0QXJndixcbiAgICBzdGFydENvbW1hbmQ6IHN0cmluZyxcbiAgICBvcHRpb25zOiBUZXN0RTJFT3B0aW9ucyA9IHt9XG4gICk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgaWYgKHByb2plY3QuaGFzUGxheXdyaWdodENvbmZpZykge1xuICAgICAgcmV0dXJuIHN1cGVyLnRlc3RFMkVQcm90ZWN0ZWQocHJvamVjdCwgYXJndiwgc3RhcnRDb21tYW5kLCBvcHRpb25zKTtcbiAgICB9XG5cbiAgICBwcm9qZWN0LmVudi5QT1JUIHx8PSAnMzAwMCc7XG4gICAgY29uc3QgcG9ydCA9IGF3YWl0IGNoZWNrQW5kS2lsbFBvcnRQcm9jZXNzKHByb2plY3QuZW52LlBPUlQsIHByb2plY3QpO1xuICAgIGNvbnN0IHN1ZmZpeCA9IHByb2plY3QucGFja2FnZUpzb24uc2NyaXB0cz8uWyd0ZXN0L2UyZS1hZGRpdGlvbmFsJ10gPyAnICYmIFlBUk4gdGVzdC9lMmUtYWRkaXRpb25hbCcgOiAnJztcbiAgICBjb25zdCB0YXJnZXRzID0gYXJndi50YXJnZXRzPy5tYXAoU3RyaW5nKTtcbiAgICBjb25zdCBub3JtYWxpemVkVGFyZ2V0cyA9IHRhcmdldHM/Lmxlbmd0aCA/IHRhcmdldHMgOiBbJ3Rlc3QvZTJlLyddO1xuICAgIGNvbnN0IHRlc3RDb21tYW5kID0gdGhpcy50ZXN0VW5pdChwcm9qZWN0LCB7IC4uLmFyZ3YsIHRhcmdldHM6IG5vcm1hbGl6ZWRUYXJnZXRzIH0pO1xuICAgIHJldHVybiBidWlsZFNoZWxsQ29tbWFuZChbXG4gICAgICAnWUFSTicsXG4gICAgICAnd2InLFxuICAgICAgJ2NvbmN1cnJlbnRseScsXG4gICAgICAuLi5idWlsZEVudlJlYWRlck9wdGlvbkFyZ3MoYXJndiksXG4gICAgICAnLS1raWxsLW90aGVycycsXG4gICAgICAnLS1zdWNjZXNzJyxcbiAgICAgICdmaXJzdCcsXG4gICAgICBgJHtzdGFydENvbW1hbmR9ICYmIGV4aXQgMWAsXG4gICAgICBgd2FpdC1vbiAtdCA2MDAwMDAgLWkgMjAwMCBodHRwLWdldDovLzEyNy4wLjAuMToke3BvcnR9ICYmICR7dGVzdENvbW1hbmR9JHtzdWZmaXh9YCxcbiAgICBdKTtcbiAgfVxufVxuXG5leHBvcnQgY29uc3QgaHR0cFNlcnZlclNjcmlwdHMgPSBuZXcgSHR0cFNlcnZlclNjcmlwdHMoKTtcbiIsImltcG9ydCB0eXBlIHsgUHJvamVjdCB9IGZyb20gJy4uLy4uL3Byb2plY3QuanMnO1xuaW1wb3J0IHR5cGUgeyBTY3JpcHRBcmd2IH0gZnJvbSAnLi4vYnVpbGRlci5qcyc7XG5cbmltcG9ydCB7IEJhc2VTY3JpcHRzIH0gZnJvbSAnLi9iYXNlU2NyaXB0cy5qcyc7XG5cbi8qKlxuICogQSBjb2xsZWN0aW9uIG9mIHNjcmlwdHMgZm9yIGV4ZWN1dGluZyBOZXh0LmpzIGNvbW1hbmRzLlxuICogTm90ZSB0aGF0IGBZQVJOIHp6emAgaXMgcmVwbGFjZWQgd2l0aCBgeWFybiB6enpgIG9yIGBub2RlX21vZHVsZXMvLmJpbi96enpgLlxuICovXG5jbGFzcyBOZXh0U2NyaXB0cyBleHRlbmRzIEJhc2VTY3JpcHRzIHtcbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIodHJ1ZSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgb3ZlcnJpZGUgc3RhcnREZXZQcm90ZWN0ZWQoXzogUHJvamVjdCwgYXJndjogU2NyaXB0QXJndik6IHN0cmluZyB7XG4gICAgcmV0dXJuIGBZQVJOIG5leHQgZGV2IC0tdHVyYm9wYWNrICR7YXJndi5ub3JtYWxpemVkQXJnc1RleHQgPz8gJyd9YDtcbiAgfVxuXG4gIHByb3RlY3RlZCBvdmVycmlkZSBidWlsZERlZmF1bHRQcm9kdWN0aW9uU3RhcnRDb21tYW5kcyhwcm9qZWN0OiBQcm9qZWN0LCBhcmd2OiBTY3JpcHRBcmd2KTogc3RyaW5nW10ge1xuICAgIHJldHVybiBbcHJvamVjdC5idWlsZENvbW1hbmQsIGBZQVJOIG5leHQgc3RhcnQgJHthcmd2Lm5vcm1hbGl6ZWRBcmdzVGV4dCA/PyAnJ31gLnRyaW0oKV07XG4gIH1cbn1cblxuZXhwb3J0IGNvbnN0IG5leHRTY3JpcHRzID0gbmV3IE5leHRTY3JpcHRzKCk7XG4iLCJleHBvcnQgY29uc3QgU0VSVkVSX0xPR19GSUxFID0gJ3NlcnZlci5sb2cnO1xuIiwiaW1wb3J0IHR5cGUgeyBQcm9qZWN0IH0gZnJvbSAnLi4vLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQgeyBTRVJWRVJfTE9HX0ZJTEUgfSBmcm9tICcuLi8uLi91dGlscy9sb2cuanMnO1xuaW1wb3J0IHR5cGUgeyBTY3JpcHRBcmd2IH0gZnJvbSAnLi4vYnVpbGRlci5qcyc7XG5pbXBvcnQgeyBkb2NrZXJTY3JpcHRzIH0gZnJvbSAnLi4vZG9ja2VyU2NyaXB0cy5qcyc7XG5cbmltcG9ydCB7IEJhc2VTY3JpcHRzIH0gZnJvbSAnLi9iYXNlU2NyaXB0cy5qcyc7XG5cbi8qKlxuICogQSBjb2xsZWN0aW9uIG9mIHNjcmlwdHMgZm9yIGV4ZWN1dGluZyBhbiBhcHAgdGhhdCB1dGlsaXplcyBhbiBIVFRQIHNlcnZlciBsaWtlIGV4cHJlc3MuXG4gKiBOb3RlIHRoYXQgYFlBUk4genp6YCBpcyByZXBsYWNlZCB3aXRoIGB5YXJuIHp6emAgb3IgYG5vZGVfbW9kdWxlcy8uYmluL3p6emAuXG4gKi9cbmNsYXNzIFBsYWluQXBwU2NyaXB0cyBleHRlbmRzIEJhc2VTY3JpcHRzIHtcbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoZmFsc2UpO1xuICB9XG5cbiAgcHJvdGVjdGVkIHN0YXJ0RGV2UHJvdGVjdGVkKF8xOiBQcm9qZWN0LCBfMjogU2NyaXB0QXJndik6IHN0cmluZyB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdUaGlzIG1ldGhvZCBzaG91bGQgbm90IGJlIGNhbGxlZC4nKTtcbiAgfVxuXG4gIG92ZXJyaWRlIHN0YXJ0RGV2KF86IFByb2plY3QsIGFyZ3Y6IFNjcmlwdEFyZ3YpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoXG4gICAgICBgWUFSTiBidWlsZC10cyBydW4gJHthcmd2LndhdGNoID8gJy0td2F0Y2gnIDogJyd9IHNyYy9pbmRleC50cyAtLSAke2FyZ3Yubm9ybWFsaXplZEFyZ3NUZXh0ID8/ICcnfWBcbiAgICApO1xuICB9XG4gIG92ZXJyaWRlIHN0YXJ0UHJvZHVjdGlvbihwcm9qZWN0OiBQcm9qZWN0LCBhcmd2OiBTY3JpcHRBcmd2KTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKFxuICAgICAgYCR7cHJvamVjdC5idWlsZENvbW1hbmR9ICYmICR7cHJvamVjdC5pc0J1bkF2YWlsYWJsZSA/ICdidW4gcnVuJyA6ICdub2RlJ30gZGlzdC9pbmRleC5qcyAke2FyZ3Yubm9ybWFsaXplZEFyZ3NUZXh0ID8/ICcnfSB8IHRlZSAke1NFUlZFUl9MT0dfRklMRX1gXG4gICAgKTtcbiAgfVxuICBvdmVycmlkZSBzdGFydFRlc3QoKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKGBlY2hvICdkbyBub3RoaW5nLidgKTtcbiAgfVxuICBvdmVycmlkZSBzdGFydERvY2tlcihwcm9qZWN0OiBQcm9qZWN0LCBhcmd2OiBTY3JpcHRBcmd2KTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKFxuICAgICAgYCR7dGhpcy5idWlsZERvY2tlcihwcm9qZWN0LCAnZGV2ZWxvcG1lbnQnKX0gJiYgJHtkb2NrZXJTY3JpcHRzLnN0b3BBbmRTdGFydChcbiAgICAgICAgcHJvamVjdCxcbiAgICAgICAgYXJndi5ub3JtYWxpemVkRG9ja2VyT3B0aW9uc1RleHQgPz8gJycsXG4gICAgICAgIGFyZ3Yubm9ybWFsaXplZEFyZ3NUZXh0ID8/ICcnXG4gICAgICApfWBcbiAgICApO1xuICB9XG5cbiAgb3ZlcnJpZGUgdGVzdEUyRURldigpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoYGVjaG8gJ2RvIG5vdGhpbmcuJ2ApO1xuICB9XG4gIG92ZXJyaWRlIHRlc3RFMkVQcm9kdWN0aW9uKCk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShgZWNobyAnZG8gbm90aGluZy4nYCk7XG4gIH1cbiAgb3ZlcnJpZGUgdGVzdEUyRURvY2tlcigpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoYGVjaG8gJ2RvIG5vdGhpbmcuJ2ApO1xuICB9XG4gIG92ZXJyaWRlIHRlc3RTdGFydCgpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoYGVjaG8gJ2RvIG5vdGhpbmcuJ2ApO1xuICB9XG59XG5cbmV4cG9ydCBjb25zdCBwbGFpbkFwcFNjcmlwdHMgPSBuZXcgUGxhaW5BcHBTY3JpcHRzKCk7XG4iLCJpbXBvcnQgdHlwZSB7IFByb2plY3QgfSBmcm9tICcuLi8uLi9wcm9qZWN0LmpzJztcbmltcG9ydCB0eXBlIHsgU2NyaXB0QXJndiB9IGZyb20gJy4uL2J1aWxkZXIuanMnO1xuXG5pbXBvcnQgeyBCYXNlU2NyaXB0cyB9IGZyb20gJy4vYmFzZVNjcmlwdHMuanMnO1xuXG4vKipcbiAqIEEgY29sbGVjdGlvbiBvZiBzY3JpcHRzIGZvciBleGVjdXRpbmcgUmVtaXggY29tbWFuZHMuXG4gKiBOb3RlIHRoYXQgYFlBUk4genp6YCBpcyByZXBsYWNlZCB3aXRoIGB5YXJuIHp6emAgb3IgYG5vZGVfbW9kdWxlcy8uYmluL3p6emAuXG4gKi9cbmNsYXNzIFJlbWl4U2NyaXB0cyBleHRlbmRzIEJhc2VTY3JpcHRzIHtcbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIodHJ1ZSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgb3ZlcnJpZGUgc3RhcnREZXZQcm90ZWN0ZWQoXzogUHJvamVjdCwgYXJndjogU2NyaXB0QXJndik6IHN0cmluZyB7XG4gICAgcmV0dXJuIGByZW1peCBkZXYgJHthcmd2Lm5vcm1hbGl6ZWRBcmdzVGV4dCA/PyAnJ31gO1xuICB9XG59XG5cbmV4cG9ydCBjb25zdCByZW1peFNjcmlwdHMgPSBuZXcgUmVtaXhTY3JpcHRzKCk7XG4iLCJpbXBvcnQgdHlwZSB7IFByb2plY3QgfSBmcm9tICcuLi8uLi9wcm9qZWN0LmpzJztcbmltcG9ydCB7IGlzUHJvamVjdEVudmlyb25tZW50IH0gZnJvbSAnLi4vLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQge1xuICBidWlsZEQxTWlncmF0aW9uc0FwcGx5Q29tbWFuZCxcbiAgYnVpbGRHZW5EZXZWYXJzQ29tbWFuZCxcbiAgYnVpbGRXcmFuZ2xlckRldkNvbW1hbmQsXG4gIGdldExvY2FsV3JhbmdsZXJTdGF0ZURpcixcbn0gZnJvbSAnLi4vLi4vdXRpbHMvd3JhbmdsZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBTY3JpcHRBcmd2IH0gZnJvbSAnLi4vYnVpbGRlci5qcyc7XG5cbmltcG9ydCB7IEJhc2VTY3JpcHRzIH0gZnJvbSAnLi9iYXNlU2NyaXB0cy5qcyc7XG5cbi8qKlxuICogQSBjb2xsZWN0aW9uIG9mIHNjcmlwdHMgZm9yIGV4ZWN1dGluZyB2aW5leHQgKE5leHQuanMgb24gVml0ZSkgYXBwcyB0YXJnZXRpbmcgQ2xvdWRmbGFyZSBXb3JrZXJzLlxuICogTm90ZSB0aGF0IGBZQVJOIHp6emAgaXMgcmVwbGFjZWQgd2l0aCBgeWFybiB6enpgIG9yIGBub2RlX21vZHVsZXMvLmJpbi96enpgLlxuICovXG5jbGFzcyBWaW5leHRTY3JpcHRzIGV4dGVuZHMgQmFzZVNjcmlwdHMge1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcih0cnVlKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBvdmVycmlkZSBzdGFydERldlByb3RlY3RlZChwcm9qZWN0OiBQcm9qZWN0LCBhcmd2OiBTY3JpcHRBcmd2KTogc3RyaW5nIHtcbiAgICBwcm9qZWN0LmVudi5QT1JUIHx8PSAnMzAwMCc7XG4gICAgLy8gVW5saWtlIGBuZXh0IGRldmAsIFZpdGUtYmFzZWQgdmluZXh0IGRvZXMgbm90IHJlYWQgdGhlIFBPUlQgZW52aXJvbm1lbnQgdmFyaWFibGUuXG4gICAgY29uc3QgZGV2Q29tbWFuZCA9IGBZQVJOIHZpbmV4dCBkZXYgLS1wb3J0ICR7cHJvamVjdC5lbnYuUE9SVH0gJHthcmd2Lm5vcm1hbGl6ZWRBcmdzVGV4dCA/PyAnJ31gLnRyaW0oKTtcbiAgICAvLyBUaGUgQ2xvdWRmbGFyZSB2aXRlIHBsdWdpbiAobWluaWZsYXJlKSByZWFkcyBydW50aW1lIHZhcnMgb25seSBmcm9tIGEgLmRldi52YXJzIGZpbGUsXG4gICAgLy8gc28gaXQgbXVzdCBiZSByZWdlbmVyYXRlZCBmcm9tIHRoZSB3Yi1tYW5hZ2VkIC5lbnYgZmlsZXMgYmVmb3JlIHNlcnZpbmcuXG4gICAgY29uc3QgY29tbWFuZHMgPSBbYnVpbGRHZW5EZXZWYXJzQ29tbWFuZChhcmd2LCAnLmRldi52YXJzJyldO1xuICAgIC8vIGB2aW5leHQgZGV2YCAobWluaWZsYXJlKSBzdGFydHMgd2l0aCBhbiBlbXB0eSBsb2NhbCBEMSBhbmQgYXBwbGllcyBubyBtaWdyYXRpb25zIGl0c2VsZjtcbiAgICAvLyB0aGUgdGVzdCBlbnZpcm9ubWVudCB3aXBlcyBpdHMgc3RhdGUgZGlyZWN0b3J5LCBzbyBldmVyeSBwYWdlIHdvdWxkIDUwMCB3aXRob3V0IHRoaXMuXG4gICAgY29uc3QgbWlncmF0aW9uQ29tbWFuZCA9IGlzUHJvamVjdEVudmlyb25tZW50KHByb2plY3QsICd0ZXN0JykgPyBidWlsZEQxTWlncmF0aW9uc0FwcGx5Q29tbWFuZChwcm9qZWN0KSA6IHVuZGVmaW5lZDtcbiAgICBpZiAobWlncmF0aW9uQ29tbWFuZCkgY29tbWFuZHMucHVzaChtaWdyYXRpb25Db21tYW5kKTtcbiAgICByZXR1cm4gWy4uLmNvbW1hbmRzLCBkZXZDb21tYW5kXS5qb2luKCcgJiYgJyk7XG4gIH1cblxuICBwcm90ZWN0ZWQgb3ZlcnJpZGUgYnVpbGREZWZhdWx0UHJvZHVjdGlvblN0YXJ0Q29tbWFuZHMocHJvamVjdDogUHJvamVjdCwgYXJndjogU2NyaXB0QXJndik6IHN0cmluZ1tdIHtcbiAgICBwcm9qZWN0LmVudi5QT1JUIHx8PSAnMzAwMCc7XG4gICAgY29uc3QgcG9ydCA9IHByb2plY3QuZW52LlBPUlQ7XG4gICAgLy8gU2VydmluZyB0aGUgYnVpbHQgd29ya2VyIHN0YXJ0cyBmcm9tIGFuIGVtcHR5IChvciB3aXBlZCkgbG9jYWwgRDEsIHNvIHdyYW5nbGVyLW5hdGl2ZVxuICAgIC8vIG1pZ3JhdGlvbnMgKGlmIGFueSkgbXVzdCBiZSBhcHBsaWVkIGZpcnN0OyBkcml6emxlL3ByaXNtYSBtaWdyYXRpb25zIGFyZSBoYW5kbGVkIGJ5XG4gICAgLy8gYnVpbGRQcm9kdWN0aW9uQ29tbWFuZC5cbiAgICBjb25zdCBkMU1pZ3JhdGlvbnNDb21tYW5kID0gYnVpbGREMU1pZ3JhdGlvbnNBcHBseUNvbW1hbmQocHJvamVjdCk7XG4gICAgLy8gYHZpbmV4dCBidWlsZGAgZW1pdHMgYSB3b3JrZXIgYnVuZGxlIGFuZCBpdHMgd3JhbmdsZXIgY29uZmlnIHVuZGVyIGRpc3Qvc2VydmVyLCBzbyB0aGVcbiAgICAvLyAuZGV2LnZhcnMgZmlsZSBleHBvc2luZyB3Yi1tYW5hZ2VkIGVudmlyb25tZW50IHZhcmlhYmxlcyBtdXN0IGJlIGdlbmVyYXRlZCBhZnRlciBidWlsZGluZy5cbiAgICAvLyBgLS1sb2NhbC11cHN0cmVhbWAga2VlcHMgcmVxdWVzdCBVUkxzIG9uIHRoZSBsb2NhbCBob3N0OyBvdGhlcndpc2UsIHdyYW5nbGVyIGRldiBzaW11bGF0ZXNcbiAgICAvLyB0aGUgcHJvZHVjdGlvbiBjdXN0b20gZG9tYWluIGRlY2xhcmVkIGluIHRoZSB3cmFuZ2xlciBjb25maWcgcm91dGVzLlxuICAgIHJldHVybiBbXG4gICAgICBwcm9qZWN0LmJ1aWxkQ29tbWFuZCxcbiAgICAgIGJ1aWxkR2VuRGV2VmFyc0NvbW1hbmQoYXJndiwgJ2Rpc3Qvc2VydmVyLy5kZXYudmFycycpLFxuICAgICAgLi4uKGQxTWlncmF0aW9uc0NvbW1hbmQgPyBbZDFNaWdyYXRpb25zQ29tbWFuZF0gOiBbXSksXG4gICAgICBidWlsZFdyYW5nbGVyRGV2Q29tbWFuZChcbiAgICAgICAgYGRldiAtLWNvbmZpZyBkaXN0L3NlcnZlci93cmFuZ2xlci5qc29uIC0taXAgMTI3LjAuMC4xIC0tcG9ydCAke3BvcnR9IC0tcGVyc2lzdC10byBcIiR7Z2V0TG9jYWxXcmFuZ2xlclN0YXRlRGlyKHByb2plY3QpfVwiIC0tbG9jYWwtdXBzdHJlYW0gbG9jYWxob3N0OiR7cG9ydH0gJHthcmd2Lm5vcm1hbGl6ZWRBcmdzVGV4dCA/PyAnJ31gLnRyaW0oKVxuICAgICAgKSxcbiAgICBdO1xuICB9XG59XG5cbmV4cG9ydCBjb25zdCB2aW5leHRTY3JpcHRzID0gbmV3IFZpbmV4dFNjcmlwdHMoKTtcbiIsImltcG9ydCB0eXBlIHsgUHJvamVjdCB9IGZyb20gJy4uLy4uL3Byb2plY3QuanMnO1xuaW1wb3J0IHR5cGUgeyBTY3JpcHRBcmd2IH0gZnJvbSAnLi4vYnVpbGRlci5qcyc7XG5cbmltcG9ydCB7IEJhc2VTY3JpcHRzIH0gZnJvbSAnLi9iYXNlU2NyaXB0cy5qcyc7XG5cbi8qKlxuICogQSBjb2xsZWN0aW9uIG9mIHNjcmlwdHMgZm9yIGV4ZWN1dGluZyBWaXRlLWJhc2VkIGFwcHMgd2l0aCBQbGF5d3JpZ2h0IGUyZSB0ZXN0cy5cbiAqIE5vdGUgdGhhdCBgWUFSTiB6enpgIGlzIHJlcGxhY2VkIHdpdGggYHlhcm4genp6YCBvciBgbm9kZV9tb2R1bGVzLy5iaW4venp6YC5cbiAqL1xuY2xhc3MgVml0ZVNjcmlwdHMgZXh0ZW5kcyBCYXNlU2NyaXB0cyB7XG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKHRydWUpO1xuICB9XG5cbiAgcHJvdGVjdGVkIG92ZXJyaWRlIHN0YXJ0RGV2UHJvdGVjdGVkKF86IFByb2plY3QsIGFyZ3Y6IFNjcmlwdEFyZ3YpOiBzdHJpbmcge1xuICAgIHJldHVybiBgWUFSTiB2aXRlIGRldiAke2FyZ3Yubm9ybWFsaXplZEFyZ3NUZXh0ID8/ICcnfWAudHJpbSgpO1xuICB9XG5cbiAgcHJvdGVjdGVkIG92ZXJyaWRlIHN0YXJ0UHJvZHVjdGlvblByb3RlY3RlZChwcm9qZWN0OiBQcm9qZWN0LCBhcmd2OiBTY3JpcHRBcmd2KTogc3RyaW5nIHtcbiAgICByZXR1cm4gYCR7cHJvamVjdC5idWlsZENvbW1hbmR9ICYmIFlBUk4gdml0ZSBwcmV2aWV3ICR7YXJndi5ub3JtYWxpemVkQXJnc1RleHQgPz8gJyd9YC50cmltKCk7XG4gIH1cbn1cblxuZXhwb3J0IGNvbnN0IHZpdGVTY3JpcHRzID0gbmV3IFZpdGVTY3JpcHRzKCk7XG4iLCJpbXBvcnQgdHlwZSB7IFByb2plY3QgfSBmcm9tICcuLi8uLi9wcm9qZWN0LmpzJztcbmltcG9ydCB7XG4gIGJ1aWxkRDFNaWdyYXRpb25zQXBwbHlDb21tYW5kLFxuICBidWlsZEdlbkRldlZhcnNDb21tYW5kLFxuICBidWlsZFdyYW5nbGVyRGV2Q29tbWFuZCxcbiAgZ2V0TG9jYWxXcmFuZ2xlclN0YXRlRGlyLFxufSBmcm9tICcuLi8uLi91dGlscy93cmFuZ2xlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFNjcmlwdEFyZ3YgfSBmcm9tICcuLi9idWlsZGVyLmpzJztcblxuaW1wb3J0IHsgSHR0cFNlcnZlclNjcmlwdHMgfSBmcm9tICcuL2h0dHBTZXJ2ZXJTY3JpcHRzLmpzJztcblxuLyoqXG4gKiBBIGNvbGxlY3Rpb24gb2Ygc2NyaXB0cyBmb3IgZXhlY3V0aW5nIHBsYWluIENsb3VkZmxhcmUgV29ya2VycyBhcHBzIChkZXRlY3RlZCB2aWEgYSB3cmFuZ2xlclxuICogY29uZmlnIGZpbGUgd2hlbiBubyBvdGhlciBmcmFtZXdvcmsgbWF0Y2hlczsgdmluZXh0IGFwcHMgaGF2ZSB0aGVpciBvd24gc2NyaXB0cykuXG4gKiBFeHRlbmRzIEh0dHBTZXJ2ZXJTY3JpcHRzIHNvIHRoYXQgZTJlIHRlc3RzIHJ1biB2aWEgdGhlIHVuaXQtdGVzdCBydW5uZXIgYWdhaW5zdCB0aGUgcnVubmluZ1xuICogd29ya2VyIHdoZW4gdGhlIHByb2plY3QgaGFzIG5vIFBsYXl3cmlnaHQgY29uZmlnLlxuICogTm90ZSB0aGF0IGBZQVJOIHp6emAgaXMgcmVwbGFjZWQgd2l0aCBgeWFybiB6enpgIG9yIGBub2RlX21vZHVsZXMvLmJpbi96enpgLlxuICovXG5jbGFzcyBXb3JrZXJzU2NyaXB0cyBleHRlbmRzIEh0dHBTZXJ2ZXJTY3JpcHRzIHtcbiAgcHJvdGVjdGVkIG92ZXJyaWRlIHN0YXJ0RGV2UHJvdGVjdGVkKHByb2plY3Q6IFByb2plY3QsIGFyZ3Y6IFNjcmlwdEFyZ3YpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmJ1aWxkV3JhbmdsZXJEZXZDb21tYW5kcyhwcm9qZWN0LCBhcmd2KS5qb2luKCcgJiYgJyk7XG4gIH1cblxuICBwcm90ZWN0ZWQgb3ZlcnJpZGUgYnVpbGREZWZhdWx0UHJvZHVjdGlvblN0YXJ0Q29tbWFuZHMocHJvamVjdDogUHJvamVjdCwgYXJndjogU2NyaXB0QXJndik6IHN0cmluZ1tdIHtcbiAgICAvLyB3cmFuZ2xlciBkZXYgYnVuZGxlcyB0aGUgd29ya2VyIGl0c2VsZiwgc28gbm8gc2VwYXJhdGUgYnVpbGQgc3RlcCBpcyBuZWVkZWQuXG4gICAgcmV0dXJuIHRoaXMuYnVpbGRXcmFuZ2xlckRldkNvbW1hbmRzKHByb2plY3QsIGFyZ3YpO1xuICB9XG5cbiAgcHJpdmF0ZSBidWlsZFdyYW5nbGVyRGV2Q29tbWFuZHMocHJvamVjdDogUHJvamVjdCwgYXJndjogU2NyaXB0QXJndik6IHN0cmluZ1tdIHtcbiAgICBwcm9qZWN0LmVudi5QT1JUIHx8PSAnODc4Nyc7XG4gICAgY29uc3Qgc3RhdGVEaXIgPSBnZXRMb2NhbFdyYW5nbGVyU3RhdGVEaXIocHJvamVjdCk7XG5cbiAgICAvLyBUaGVzZSBoZWxwZXJzIHJlYWQgdGhlIGRlZmF1bHQtbmFtZWQgd3JhbmdsZXIgY29uZmlnOyB0aGF0IGlzIHNhZmUgYmVjYXVzZSB3b3JrZXJzU2NyaXB0c1xuICAgIC8vIGl0c2VsZiBpcyBvbmx5IHNlbGVjdGVkIHdoZW4gc3VjaCBhIGNvbmZpZyBmaWxlIGV4aXN0cyBpbiB0aGUgcHJvamVjdCBkaXJlY3RvcnkuXG4gICAgY29uc3QgY29tbWFuZHMgPSBbYnVpbGRHZW5EZXZWYXJzQ29tbWFuZChhcmd2LCAnLmRldi52YXJzJyldO1xuICAgIC8vIEFwcGx5IHdyYW5nbGVyLW5hdGl2ZSBEMSBtaWdyYXRpb25zIChpZiBhbnkpIHNvIHRoZSBsb2NhbCBkYXRhYmFzZSBtYXRjaGVzIHRoZSBkZXBsb3llZCBvbmUuXG4gICAgY29uc3QgZDFNaWdyYXRpb25zQ29tbWFuZCA9IGJ1aWxkRDFNaWdyYXRpb25zQXBwbHlDb21tYW5kKHByb2plY3QpO1xuICAgIGlmIChkMU1pZ3JhdGlvbnNDb21tYW5kKSB7XG4gICAgICBjb21tYW5kcy5wdXNoKGQxTWlncmF0aW9uc0NvbW1hbmQpO1xuICAgIH1cbiAgICBjb21tYW5kcy5wdXNoKFxuICAgICAgYnVpbGRXcmFuZ2xlckRldkNvbW1hbmQoXG4gICAgICAgIGBkZXYgLS1pcCAxMjcuMC4wLjEgLS1wb3J0ICR7cHJvamVjdC5lbnYuUE9SVH0gLS1wZXJzaXN0LXRvIFwiJHtzdGF0ZURpcn1cIiAke2FyZ3Yubm9ybWFsaXplZEFyZ3NUZXh0ID8/ICcnfWAudHJpbSgpXG4gICAgICApXG4gICAgKTtcbiAgICByZXR1cm4gY29tbWFuZHM7XG4gIH1cbn1cblxuZXhwb3J0IGNvbnN0IHdvcmtlcnNTY3JpcHRzID0gbmV3IFdvcmtlcnNTY3JpcHRzKCk7XG4iLCJleHBvcnQgY29uc3QgaHR0cFNlcnZlclBhY2thZ2VzID0gWydleHByZXNzJywgJ2Zhc3RpZnknLCAnZWx5c2lhJywgJ2hvbm8nXTtcbiIsImltcG9ydCBjaGFsayBmcm9tICdjaGFsayc7XG5pbXBvcnQgdHlwZSB7IEFyZ3YsIENvbW1hbmRNb2R1bGUsIEluZmVycmVkT3B0aW9uVHlwZXMgfSBmcm9tICd5YXJncyc7XG5cbmltcG9ydCB7IGZpbmREZXNjZW5kYW50UHJvamVjdHMgfSBmcm9tICcuLi9wcm9qZWN0LmpzJztcbmltcG9ydCB7IG5vcm1hbGl6ZUFyZ3MsIHNjcmlwdE9wdGlvbnNCdWlsZGVyIH0gZnJvbSAnLi4vc2NyaXB0cy9idWlsZGVyLmpzJztcbmltcG9ydCB0eXBlIHsgQmFzZVNjcmlwdHMgfSBmcm9tICcuLi9zY3JpcHRzL2V4ZWN1dGlvbi9iYXNlU2NyaXB0cy5qcyc7XG5pbXBvcnQgeyBibGl0elNjcmlwdHMgfSBmcm9tICcuLi9zY3JpcHRzL2V4ZWN1dGlvbi9ibGl0elNjcmlwdHMuanMnO1xuaW1wb3J0IHsgaHR0cFNlcnZlclNjcmlwdHMgfSBmcm9tICcuLi9zY3JpcHRzL2V4ZWN1dGlvbi9odHRwU2VydmVyU2NyaXB0cy5qcyc7XG5pbXBvcnQgeyBuZXh0U2NyaXB0cyB9IGZyb20gJy4uL3NjcmlwdHMvZXhlY3V0aW9uL25leHRTY3JpcHRzLmpzJztcbmltcG9ydCB7IHBsYWluQXBwU2NyaXB0cyB9IGZyb20gJy4uL3NjcmlwdHMvZXhlY3V0aW9uL3BsYWluQXBwU2NyaXB0cy5qcyc7XG5pbXBvcnQgeyByZW1peFNjcmlwdHMgfSBmcm9tICcuLi9zY3JpcHRzL2V4ZWN1dGlvbi9yZW1peFNjcmlwdHMuanMnO1xuaW1wb3J0IHsgdmluZXh0U2NyaXB0cyB9IGZyb20gJy4uL3NjcmlwdHMvZXhlY3V0aW9uL3ZpbmV4dFNjcmlwdHMuanMnO1xuaW1wb3J0IHsgdml0ZVNjcmlwdHMgfSBmcm9tICcuLi9zY3JpcHRzL2V4ZWN1dGlvbi92aXRlU2NyaXB0cy5qcyc7XG5pbXBvcnQgeyB3b3JrZXJzU2NyaXB0cyB9IGZyb20gJy4uL3NjcmlwdHMvZXhlY3V0aW9uL3dvcmtlcnNTY3JpcHRzLmpzJztcbmltcG9ydCB7IHJ1bldpdGhTcGF3biB9IGZyb20gJy4uL3NjcmlwdHMvcnVuLmpzJztcbmltcG9ydCB7IGZpbmRXcmFuZ2xlckNvbmZpZ1BhdGggfSBmcm9tICcuLi91dGlscy93cmFuZ2xlci5qcyc7XG5pbXBvcnQgdHlwZSB7IHNoYXJlZE9wdGlvbnNCdWlsZGVyIH0gZnJvbSAnLi4vc2hhcmVkT3B0aW9uc0J1aWxkZXIuanMnO1xuXG5pbXBvcnQgeyBodHRwU2VydmVyUGFja2FnZXMgfSBmcm9tICcuL2h0dHBTZXJ2ZXJQYWNrYWdlcy5qcyc7XG5cbmNvbnN0IGJ1aWxkZXIgPSB7XG4gIC4uLnNjcmlwdE9wdGlvbnNCdWlsZGVyLFxuICBtb2RlOiB7XG4gICAgZGVzY3JpcHRpb246ICdTdGFydCBtb2RlOiBkZXZbZWxvcG1lbnRdIChkZWZhdWx0KSB8IHN0YWdpbmcgfCBkb2NrZXIgfCBkb2NrZXItZGVidWcgfCB0ZXN0JyxcbiAgICB0eXBlOiAnc3RyaW5nJyxcbiAgICBhbGlhczogJ20nLFxuICB9LFxufSBhcyBjb25zdDtcblxuZXhwb3J0IGNvbnN0IHN0YXJ0Q29tbWFuZDogQ29tbWFuZE1vZHVsZTx1bmtub3duLCBJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBidWlsZGVyICYgdHlwZW9mIHNoYXJlZE9wdGlvbnNCdWlsZGVyPj4gPSB7XG4gIGNvbW1hbmQ6ICdzdGFydCBbYXJncy4uXScsXG4gIGRlc2NyaWJlOlxuICAgIFwiU3RhcnQgYXBwLiBVc2UgJy0tJyB0byBzdG9wIHdiIG9wdGlvbiBwYXJzaW5nIGFuZCBmb3J3YXJkIHRoZSByZW1haW5pbmcgYXJndW1lbnRzIHRvIHRoZSB1bmRlcmx5aW5nIGFwcCBjb21tYW5kLiBFeGFtcGxlOiB3YiBzdGFydCAtLSAtLWhvc3QgMC4wLjAuMFwiLFxuICBidWlsZGVyOiAoeWFyZ3M6IEFyZ3Y8dW5rbm93bj4pID0+XG4gICAgeWFyZ3MucGFyc2VyQ29uZmlndXJhdGlvbih7ICdwb3B1bGF0ZS0tJzogdHJ1ZSB9KS5vcHRpb25zKGJ1aWxkZXIpIGFzIEFyZ3Y8XG4gICAgICBJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBidWlsZGVyICYgdHlwZW9mIHNoYXJlZE9wdGlvbnNCdWlsZGVyPlxuICAgID4sXG4gIGFzeW5jIGhhbmRsZXIoYXJndikge1xuICAgIG5vcm1hbGl6ZUFyZ3MoYXJndik7XG5cbiAgICBjb25zdCBwcm9qZWN0cyA9IGF3YWl0IGZpbmREZXNjZW5kYW50UHJvamVjdHMoYXJndik7XG4gICAgaWYgKCFwcm9qZWN0cykge1xuICAgICAgY29uc29sZS5lcnJvcihjaGFsay5yZWQoJ05vIHByb2plY3QgZm91bmQuJykpO1xuICAgICAgcHJvY2Vzcy5leGl0KDEpO1xuICAgIH1cblxuICAgIGZvciAoY29uc3QgcHJvamVjdCBvZiBwcm9qZWN0cy5kZXNjZW5kYW50cykge1xuICAgICAgY29uc3QgZGVwcyA9IHByb2plY3QucGFja2FnZUpzb24uZGVwZW5kZW5jaWVzID8/IHt9O1xuICAgICAgY29uc3QgZGV2RGVwcyA9IHByb2plY3QucGFja2FnZUpzb24uZGV2RGVwZW5kZW5jaWVzID8/IHt9O1xuICAgICAgbGV0IHNjcmlwdHM6IEJhc2VTY3JpcHRzO1xuICAgICAgaWYgKGRlcHMuYmxpdHopIHtcbiAgICAgICAgc2NyaXB0cyA9IGJsaXR6U2NyaXB0cztcbiAgICAgIH0gZWxzZSBpZiAoZGVwcy52aW5leHQgfHwgZGV2RGVwcy52aW5leHQpIHtcbiAgICAgICAgLy8gdmluZXh0IGFwcHMgYWxzbyBkZXBlbmQgb24gbmV4dCwgc28gdGhpcyBjaGVjayBtdXN0IGNvbWUgZmlyc3QuXG4gICAgICAgIHNjcmlwdHMgPSB2aW5leHRTY3JpcHRzO1xuICAgICAgfSBlbHNlIGlmIChkZXBzLm5leHQpIHtcbiAgICAgICAgc2NyaXB0cyA9IG5leHRTY3JpcHRzO1xuICAgICAgfSBlbHNlIGlmIChkZXZEZXBzWydAcmVtaXgtcnVuL2RldiddKSB7XG4gICAgICAgIHNjcmlwdHMgPSByZW1peFNjcmlwdHM7XG4gICAgICB9IGVsc2UgaWYgKGRldkRlcHMudml0ZSkge1xuICAgICAgICBzY3JpcHRzID0gdml0ZVNjcmlwdHM7XG4gICAgICB9IGVsc2UgaWYgKGZpbmRXcmFuZ2xlckNvbmZpZ1BhdGgocHJvamVjdCkpIHtcbiAgICAgICAgLy8gUGxhaW4gQ2xvdWRmbGFyZSBXb3JrZXJzIGFwcDsgdmluZXh0IGFwcHMgYXJlIGRldGVjdGVkIGFib3ZlLlxuICAgICAgICBzY3JpcHRzID0gd29ya2Vyc1NjcmlwdHM7XG4gICAgICB9IGVsc2UgaWYgKFxuICAgICAgICAoaHR0cFNlcnZlclBhY2thZ2VzLnNvbWUoKHApID0+IGRlcHNbcF0pICYmICFkZXBzWydmaXJlYmFzZS1mdW5jdGlvbnMnXSkgfHxcbiAgICAgICAgKHByb2plY3QuaGFzRG9ja2VyZmlsZSAmJiAvRVhQT1NFXFxzKzgwODAvLnRlc3QocHJvamVjdC5kb2NrZXJmaWxlKSlcbiAgICAgICkge1xuICAgICAgICBzY3JpcHRzID0gaHR0cFNlcnZlclNjcmlwdHM7XG4gICAgICB9IGVsc2UgaWYgKGRlcHNbJ2J1aWxkLXRzJ10gfHwgZGV2RGVwc1snYnVpbGQtdHMnXSkge1xuICAgICAgICBzY3JpcHRzID0gcGxhaW5BcHBTY3JpcHRzO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBjb25zb2xlLmluZm8oYFJ1bm5pbmcgXCJzdGFydFwiIGZvciAke3Byb2plY3QubmFtZX0gLi4uYCk7XG5cbiAgICAgIHN3aXRjaCAoYXJndi5tb2RlID8/ICdkZXYnKSB7XG4gICAgICAgIGNhc2UgJ2Rldic6XG4gICAgICAgIGNhc2UgJ2RldmVsb3BtZW50Jzoge1xuICAgICAgICAgIHByb2Nlc3MuZW52LldCX0VOViB8fD0gJ2RldmVsb3BtZW50JztcbiAgICAgICAgICBhd2FpdCBydW5XaXRoU3Bhd24oYXdhaXQgc2NyaXB0cy5zdGFydERldihwcm9qZWN0LCBhcmd2KSwgcHJvamVjdCwgYXJndik7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSAnc3RhZ2luZyc6IHtcbiAgICAgICAgICBwcm9jZXNzLmVudi5XQl9FTlYgfHw9ICdzdGFnaW5nJztcbiAgICAgICAgICBhd2FpdCBydW5XaXRoU3Bhd24oYXdhaXQgc2NyaXB0cy5zdGFydFByb2R1Y3Rpb24ocHJvamVjdCwgYXJndiksIHByb2plY3QsIGFyZ3YpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgJ2RvY2tlcic6IHtcbiAgICAgICAgICBwcm9jZXNzLmVudi5XQl9FTlYgfHw9ICdzdGFnaW5nJztcbiAgICAgICAgICBhd2FpdCBydW5XaXRoU3Bhd24oYXdhaXQgc2NyaXB0cy5zdGFydERvY2tlcihwcm9qZWN0LCBhcmd2KSwgcHJvamVjdCwgYXJndik7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSAnZG9ja2VyLWRlYnVnJzoge1xuICAgICAgICAgIHByb2Nlc3MuZW52LldCX0VOViB8fD0gJ3N0YWdpbmcnO1xuICAgICAgICAgIGFyZ3Yubm9ybWFsaXplZEFyZ3NUZXh0ID0gYCcvYmluL2Jhc2gnYDtcbiAgICAgICAgICBhd2FpdCBydW5XaXRoU3Bhd24oYXdhaXQgc2NyaXB0cy5zdGFydERvY2tlcihwcm9qZWN0LCBhcmd2KSwgcHJvamVjdCwgYXJndik7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSAndGVzdCc6IHtcbiAgICAgICAgICBwcm9jZXNzLmVudi5XQl9FTlYgfHw9ICd0ZXN0JztcbiAgICAgICAgICBjb25zdCBzY3JpcHQgPSBhd2FpdCBzY3JpcHRzLnN0YXJ0VGVzdChwcm9qZWN0LCBhcmd2KTtcbiAgICAgICAgICBhd2FpdCBydW5XaXRoU3Bhd24oc2NyaXB0LCBwcm9qZWN0LCBhcmd2KTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBkZWZhdWx0OiB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbmtub3duIHN0YXJ0IG1vZGU6ICR7YXJndi5tb2RlfWApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9LFxufTtcbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCBjaGFsayBmcm9tICdjaGFsayc7XG5pbXBvcnQgeyBkaXN0YW5jZSB9IGZyb20gJ2Zhc3Rlc3QtbGV2ZW5zaHRlaW4nO1xuaW1wb3J0IHR5cGUgeyBBcmd2LCBBcmd1bWVudHNDYW1lbENhc2UsIENvbW1hbmRNb2R1bGUsIEluZmVycmVkT3B0aW9uVHlwZXMgfSBmcm9tICd5YXJncyc7XG5cbmltcG9ydCB0eXBlIHsgUHJvamVjdCB9IGZyb20gJy4uL3Byb2plY3QuanMnO1xuaW1wb3J0IHsgZmluZERlc2NlbmRhbnRQcm9qZWN0cyB9IGZyb20gJy4uL3Byb2plY3QuanMnO1xuaW1wb3J0IHR5cGUgeyBzY3JpcHRPcHRpb25zQnVpbGRlciB9IGZyb20gJy4uL3NjcmlwdHMvYnVpbGRlci5qcyc7XG5pbXBvcnQgeyB0b0Rldk51bGwgfSBmcm9tICcuLi9zY3JpcHRzL2J1aWxkZXIuanMnO1xuaW1wb3J0IHsgZG9ja2VyU2NyaXB0cyB9IGZyb20gJy4uL3NjcmlwdHMvZG9ja2VyU2NyaXB0cy5qcyc7XG5pbXBvcnQgdHlwZSB7IEJhc2VTY3JpcHRzIH0gZnJvbSAnLi4vc2NyaXB0cy9leGVjdXRpb24vYmFzZVNjcmlwdHMuanMnO1xuaW1wb3J0IHsgZmluZEV4cGxpY2l0UGxheXdyaWdodFRhcmdldEluZGV4ZXMgfSBmcm9tICcuLi9zY3JpcHRzL2V4ZWN1dGlvbi9iYXNlU2NyaXB0cy5qcyc7XG5pbXBvcnQgeyBibGl0elNjcmlwdHMgfSBmcm9tICcuLi9zY3JpcHRzL2V4ZWN1dGlvbi9ibGl0elNjcmlwdHMuanMnO1xuaW1wb3J0IHsgaHR0cFNlcnZlclNjcmlwdHMgfSBmcm9tICcuLi9zY3JpcHRzL2V4ZWN1dGlvbi9odHRwU2VydmVyU2NyaXB0cy5qcyc7XG5pbXBvcnQgeyBuZXh0U2NyaXB0cyB9IGZyb20gJy4uL3NjcmlwdHMvZXhlY3V0aW9uL25leHRTY3JpcHRzLmpzJztcbmltcG9ydCB7IHBsYWluQXBwU2NyaXB0cyB9IGZyb20gJy4uL3NjcmlwdHMvZXhlY3V0aW9uL3BsYWluQXBwU2NyaXB0cy5qcyc7XG5pbXBvcnQgeyByZW1peFNjcmlwdHMgfSBmcm9tICcuLi9zY3JpcHRzL2V4ZWN1dGlvbi9yZW1peFNjcmlwdHMuanMnO1xuaW1wb3J0IHsgdmluZXh0U2NyaXB0cyB9IGZyb20gJy4uL3NjcmlwdHMvZXhlY3V0aW9uL3ZpbmV4dFNjcmlwdHMuanMnO1xuaW1wb3J0IHsgdml0ZVNjcmlwdHMgfSBmcm9tICcuLi9zY3JpcHRzL2V4ZWN1dGlvbi92aXRlU2NyaXB0cy5qcyc7XG5pbXBvcnQgeyB3b3JrZXJzU2NyaXB0cyB9IGZyb20gJy4uL3NjcmlwdHMvZXhlY3V0aW9uL3dvcmtlcnNTY3JpcHRzLmpzJztcbmltcG9ydCB7IHJ1bldpdGhTcGF3biB9IGZyb20gJy4uL3NjcmlwdHMvcnVuLmpzJztcbmltcG9ydCB0eXBlIHsgc2hhcmVkT3B0aW9uc0J1aWxkZXIgfSBmcm9tICcuLi9zaGFyZWRPcHRpb25zQnVpbGRlci5qcyc7XG5pbXBvcnQgeyBmaW5kV3JhbmdsZXJDb25maWdQYXRoIH0gZnJvbSAnLi4vdXRpbHMvd3JhbmdsZXIuanMnO1xuXG5pbXBvcnQgeyBodHRwU2VydmVyUGFja2FnZXMgfSBmcm9tICcuL2h0dHBTZXJ2ZXJQYWNrYWdlcy5qcyc7XG5cbmNvbnN0IEFOU0lfRVNDQVBFX0NPREVfUkVHRVhQID0gbmV3IFJlZ0V4cChgJHtTdHJpbmcuZnJvbUNvZGVQb2ludCgyNyl9XFxcXFtbMC0/XSpbIC0vXSpbQC1+XWAsICdnJyk7XG5jb25zdCBTSU1JTEFSX1RFU1RfT1VUUFVUX0xPT0tCQUNLX0xJTkVfQ09VTlQgPSAyMDA7XG5jb25zdCBTSU1JTEFSX1RFU1RfT1VUUFVUX0RJU1RBTkNFX1JBVElPID0gMC4wNTtcblxuY29uc3QgYnVpbGRlciA9IHtcbiAgZTJlOiB7XG4gICAgZGVzY3JpcHRpb246ICdIb3cgdG8gcnVuIEUyRSB0ZXN0cycsXG4gICAgdHlwZTogJ3N0cmluZycsXG4gICAgY2hvaWNlczogW1xuICAgICAgJ2hlYWRsZXNzJyxcbiAgICAgICdoZWFkbGVzcy1kZXYnLFxuICAgICAgJ2hlYWRlZCcsXG4gICAgICAnaGVhZGVkLWRldicsXG4gICAgICAnZG9ja2VyJyxcbiAgICAgICdkb2NrZXItZGVidWcnLFxuICAgICAgJ2RlYnVnJyxcbiAgICAgICdnZW5lcmF0ZScsXG4gICAgICAndHJhY2UnLFxuICAgIF0sXG4gICAgZGVmYXVsdDogJ2hlYWRsZXNzJyxcbiAgfSxcbiAgc2lsZW50OiB7XG4gICAgZGVzY3JpcHRpb246ICdSZWR1Y2UgcmVkdW5kYW50IG91dHB1dHMnLFxuICAgIHR5cGU6ICdib29sZWFuJyxcbiAgfSxcbiAgYmFpbDoge1xuICAgIGRlc2NyaXB0aW9uOiAnU3RvcCB0ZXN0cyBhZnRlciB0aGUgZmlyc3QgZmFpbHVyZScsXG4gICAgdHlwZTogJ2Jvb2xlYW4nLFxuICB9LFxuICAndW5pdC10aW1lb3V0Jzoge1xuICAgIGRlc2NyaXB0aW9uOiAnVGltZW91dCBmb3IgdW5pdCB0ZXN0cycsXG4gICAgdHlwZTogJ251bWJlcicsXG4gIH0sXG59IGFzIGNvbnN0O1xuXG5jb25zdCBhcmd1bWVudHNCdWlsZGVyID0ge1xuICB0YXJnZXRzOiB7XG4gICAgYXJyYXk6IHRydWUsXG4gICAgZGVzY3JpcHRpb246ICdVbml0IG9yIEUyRSB0ZXN0IHRhcmdldCBwYXRocycsXG4gICAgdHlwZTogJ3N0cmluZycsXG4gIH0sXG59IGFzIGNvbnN0O1xuXG50eXBlIFRlc3RDb21tYW5kT3B0aW9ucyA9IEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIGJ1aWxkZXIgJiB0eXBlb2Ygc2hhcmVkT3B0aW9uc0J1aWxkZXIgJiB0eXBlb2YgYXJndW1lbnRzQnVpbGRlcj47XG5cbmV4cG9ydCB0eXBlIFRlc3RBcmd2ID0gUGFydGlhbDxcbiAgQXJndW1lbnRzQ2FtZWxDYXNlPEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIGJ1aWxkZXIgJiB0eXBlb2Ygc2NyaXB0T3B0aW9uc0J1aWxkZXIgJiB0eXBlb2YgYXJndW1lbnRzQnVpbGRlcj4+XG4+O1xuXG5leHBvcnQgdHlwZSBUZXN0Q29tbWFuZEFyZ3YgPSBBcmd1bWVudHNDYW1lbENhc2U8VGVzdENvbW1hbmRPcHRpb25zPiAmIHsgJy0tJz86IHN0cmluZ1tdIH07XG5cbmV4cG9ydCBpbnRlcmZhY2UgVGVzdFJ1bk9wdGlvbnMge1xuICBleGl0SWZGYWlsZWQ/OiBib29sZWFuO1xufVxuXG5leHBvcnQgY29uc3QgdGVzdENvbW1hbmQ6IENvbW1hbmRNb2R1bGU8dW5rbm93biwgVGVzdENvbW1hbmRPcHRpb25zPiA9IHtcbiAgY29tbWFuZDogJ3Rlc3QgW3RhcmdldHMuLi5dJyxcbiAgZGVzY3JpYmU6XG4gICAgXCJUZXN0IHByb2plY3QuIElmIHlvdSBwYXNzIG5vIGFyZ3VtZW50cywgaXQgd2lsbCBydW4gYWxsIHRlc3RzLiBVc2UgJy0tJyB0byBzdG9wIHdiIG9wdGlvbiBwYXJzaW5nIGFuZCBmb3J3YXJkIHRoZSByZW1haW5pbmcgZmxhZ3MgdG8gUGxheXdyaWdodC4gRXhhbXBsZTogd2IgdGVzdCAtLSAtLWdyZXAgJ3VwbG9hZGVkIGltYWdlIGFzc2V0J1wiLFxuICBidWlsZGVyOiAoeWFyZ3M6IEFyZ3Y8dW5rbm93bj4pOiBBcmd2PFRlc3RDb21tYW5kT3B0aW9ucz4gPT5cbiAgICB5YXJnc1xuICAgICAgLnBhcnNlckNvbmZpZ3VyYXRpb24oeyAncG9wdWxhdGUtLSc6IHRydWUgfSlcbiAgICAgIC5vcHRpb25zKGJ1aWxkZXIpXG4gICAgICAucG9zaXRpb25hbCgndGFyZ2V0cycsIGFyZ3VtZW50c0J1aWxkZXIudGFyZ2V0cykgYXMgQXJndjxUZXN0Q29tbWFuZE9wdGlvbnM+LFxuICBhc3luYyBoYW5kbGVyKGFyZ3YpIHtcbiAgICBwcm9jZXNzLmV4aXQoYXdhaXQgdGVzdChhcmd2IGFzIFRlc3RDb21tYW5kQXJndikpO1xuICB9LFxufTtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHRlc3QoYXJndjogVGVzdENvbW1hbmRBcmd2LCBvcHRpb25zOiBUZXN0UnVuT3B0aW9ucyA9IHt9KTogUHJvbWlzZTxudW1iZXI+IHtcbiAgY29uc3QgdGVzdEFyZ3YgPSB3aXRoRGVmYXVsdFRlc3RDYXNjYWRlRW52KGFyZ3YpO1xuICBjb25zdCBwcm9qZWN0cyA9IGF3YWl0IGZpbmREZXNjZW5kYW50UHJvamVjdHModGVzdEFyZ3YpO1xuICBpZiAoIXByb2plY3RzKSB7XG4gICAgY29uc29sZS5lcnJvcihjaGFsay5yZWQoJ05vIHByb2plY3QgZm91bmQuJykpO1xuICAgIHJldHVybiAxO1xuICB9XG5cbiAgLy8gR2V0IHRlc3QgdGFyZ2V0cyBmcm9tIHBvc2l0aW9uYWwgYXJndW1lbnRzXG4gIGNvbnN0IHRlc3RUYXJnZXRzID0gKHRlc3RBcmd2LnRhcmdldHMgPz8gW10pIGFzIHN0cmluZ1tdO1xuICBjb25zdCBmb3J3YXJkZWRQbGF5d3JpZ2h0QXJncyA9IHRlc3RBcmd2WyctLSddID8/IFtdO1xuICBjb25zdCB7IHNob3VsZFJ1bkUyZSwgc2hvdWxkUnVuVW5pdCB9ID0gcmVzb2x2ZVRlc3RFeGVjdXRpb25UYXJnZXRzKHRlc3RUYXJnZXRzLCBmb3J3YXJkZWRQbGF5d3JpZ2h0QXJncyk7XG5cbiAgZm9yIChjb25zdCBwcm9qZWN0IG9mIHByb2plY3RzLmRlc2NlbmRhbnRzKSB7XG4gICAgcHJvamVjdC5lbnYuV0JfRU5WIHx8PSAndGVzdCc7XG5cbiAgICBjb25zdCBkZXBzID0gcHJvamVjdC5wYWNrYWdlSnNvbi5kZXBlbmRlbmNpZXMgPz8ge307XG4gICAgY29uc3QgZGV2RGVwcyA9IHByb2plY3QucGFja2FnZUpzb24uZGV2RGVwZW5kZW5jaWVzID8/IHt9O1xuICAgIGxldCBzY3JpcHRzOiBCYXNlU2NyaXB0cztcbiAgICBpZiAoZGVwcy5ibGl0eikge1xuICAgICAgc2NyaXB0cyA9IGJsaXR6U2NyaXB0cztcbiAgICB9IGVsc2UgaWYgKGRlcHMudmluZXh0IHx8IGRldkRlcHMudmluZXh0KSB7XG4gICAgICAvLyB2aW5leHQgYXBwcyBhbHNvIGRlcGVuZCBvbiBuZXh0LCBzbyB0aGlzIGNoZWNrIG11c3QgY29tZSBmaXJzdC5cbiAgICAgIHNjcmlwdHMgPSB2aW5leHRTY3JpcHRzO1xuICAgIH0gZWxzZSBpZiAoZGVwcy5uZXh0KSB7XG4gICAgICBzY3JpcHRzID0gbmV4dFNjcmlwdHM7XG4gICAgfSBlbHNlIGlmIChkZXZEZXBzWydAcmVtaXgtcnVuL2RldiddKSB7XG4gICAgICBzY3JpcHRzID0gcmVtaXhTY3JpcHRzO1xuICAgIH0gZWxzZSBpZiAoZGV2RGVwcy52aXRlKSB7XG4gICAgICBzY3JpcHRzID0gdml0ZVNjcmlwdHM7XG4gICAgfSBlbHNlIGlmIChmaW5kV3JhbmdsZXJDb25maWdQYXRoKHByb2plY3QpKSB7XG4gICAgICAvLyBQbGFpbiBDbG91ZGZsYXJlIFdvcmtlcnMgYXBwOyB2aW5leHQgYXBwcyBhcmUgZGV0ZWN0ZWQgYWJvdmUuXG4gICAgICBzY3JpcHRzID0gd29ya2Vyc1NjcmlwdHM7XG4gICAgfSBlbHNlIGlmIChodHRwU2VydmVyUGFja2FnZXMuc29tZSgocCkgPT4gZGVwc1twXSkgJiYgIWRlcHNbJ2ZpcmViYXNlLWZ1bmN0aW9ucyddKSB7XG4gICAgICBzY3JpcHRzID0gaHR0cFNlcnZlclNjcmlwdHM7XG4gICAgfSBlbHNlIHtcbiAgICAgIHNjcmlwdHMgPSBwbGFpbkFwcFNjcmlwdHM7XG4gICAgfVxuXG4gICAgY29uc29sZS5pbmZvKGBSdW5uaW5nIFwidGVzdFwiIGZvciAke3Byb2plY3QubmFtZX0gLi4uYCk7XG5cbiAgICAvLyBSdW4gdW5pdCB0ZXN0cyBpZiBuZWVkZWRcbiAgICBjb25zdCBkZWZhdWx0VW5pdFRhcmdldHMgPSBnZXREZWZhdWx0VW5pdFRhcmdldHMocHJvamVjdCk7XG4gICAgaWYgKHNob3VsZFJ1blVuaXQgJiYgZGVmYXVsdFVuaXRUYXJnZXRzICE9PSBmYWxzZSkge1xuICAgICAgY29uc3QgdW5pdFRhcmdldHMgPSB0ZXN0VGFyZ2V0cy5maWx0ZXIoKHRhcmdldCkgPT4gdGFyZ2V0LmluY2x1ZGVzKCcvdW5pdCcpKTtcbiAgICAgIGNvbnN0IHRhcmdldHMgPVxuICAgICAgICB1bml0VGFyZ2V0cy5sZW5ndGggPiAwID8gdW5pdFRhcmdldHMgOiBkZWZhdWx0VW5pdFRhcmdldHMubGVuZ3RoID4gMCA/IGRlZmF1bHRVbml0VGFyZ2V0cyA6IHVuZGVmaW5lZDtcbiAgICAgIGNvbnN0IHVuaXRBcmd2ID0geyAuLi50ZXN0QXJndiwgdGFyZ2V0cyB9O1xuICAgICAgY29uc3QgZXhpdENvZGUgPSBhd2FpdCBydW5Vbml0VGVzdENvbW1hbmQoc2NyaXB0cy50ZXN0VW5pdChwcm9qZWN0LCB1bml0QXJndiksIHByb2plY3QsIHRlc3RBcmd2LCB7XG4gICAgICAgIGV4aXRJZkZhaWxlZDogb3B0aW9ucy5leGl0SWZGYWlsZWQsXG4gICAgICAgIHRpbWVvdXQ6IHRlc3RBcmd2LnVuaXRUaW1lb3V0LFxuICAgICAgfSk7XG4gICAgICBpZiAoZXhpdENvZGUgIT09IDApIHtcbiAgICAgICAgcmV0dXJuIGV4aXRDb2RlO1xuICAgICAgfVxuICAgIH1cbiAgICAvLyBTa2lwIGUyZSB0ZXN0cyBpZiBub3QgbmVlZGVkIG9yIG5vIGUyZSBkaXJlY3RvcnkgZXhpc3RzXG4gICAgaWYgKCFzaG91bGRSdW5FMmUgfHwgIWZzLmV4aXN0c1N5bmMocGF0aC5qb2luKHByb2plY3QuZGlyUGF0aCwgJ3Rlc3QnLCAnZTJlJykpKSB7XG4gICAgICBpZiAoc2hvdWxkUnVuRTJlKSB3YXJuSWZQbGF5d3JpZ2h0U3BlY3NBcmVVbmRpc2NvdmVyYWJsZShwcm9qZWN0KTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIC8vIEdldCBlMmUgdGFyZ2V0cyBmb3IgdGhpcyBwcm9qZWN0XG4gICAgY29uc3QgZTJlVGFyZ2V0cyA9IHRlc3RUYXJnZXRzLmZpbHRlcigodGFyZ2V0KSA9PiB0YXJnZXQuaW5jbHVkZXMoJy9lMmUnKSk7XG4gICAgY29uc3QgZTJlQXJndiA9IHsgLi4udGVzdEFyZ3YsIHRhcmdldHM6IGUyZVRhcmdldHMubGVuZ3RoID4gMCA/IGUyZVRhcmdldHMgOiB1bmRlZmluZWQgfTtcblxuICAgIHN3aXRjaCAodGVzdEFyZ3YuZTJlKSB7XG4gICAgICBjYXNlICdoZWFkbGVzcyc6IHtcbiAgICAgICAgY29uc3QgZXhpdENvZGUgPSBhd2FpdCBydW5UZXN0Q29tbWFuZChcbiAgICAgICAgICBhd2FpdCBzY3JpcHRzLnRlc3RFMkVQcm9kdWN0aW9uKHByb2plY3QsIGUyZUFyZ3YsIHtcbiAgICAgICAgICAgIHBsYXl3cmlnaHRBcmdzOiBidWlsZFBsYXl3cmlnaHRBcmdzRm9yRTJFKGUyZVRhcmdldHMsIGZvcndhcmRlZFBsYXl3cmlnaHRBcmdzKSxcbiAgICAgICAgICAgIGZvcndhcmRlZFBsYXl3cmlnaHRBcmdzLFxuICAgICAgICAgIH0pLFxuICAgICAgICAgIHByb2plY3QsXG4gICAgICAgICAgdGVzdEFyZ3YsXG4gICAgICAgICAgeyBleGl0SWZGYWlsZWQ6IG9wdGlvbnMuZXhpdElmRmFpbGVkIH1cbiAgICAgICAgKTtcbiAgICAgICAgaWYgKGV4aXRDb2RlICE9PSAwKSByZXR1cm4gZXhpdENvZGU7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgY2FzZSAnaGVhZGxlc3MtZGV2Jzoge1xuICAgICAgICBjb25zdCBleGl0Q29kZSA9IGF3YWl0IHJ1blRlc3RDb21tYW5kKFxuICAgICAgICAgIGF3YWl0IHNjcmlwdHMudGVzdEUyRURldihwcm9qZWN0LCBlMmVBcmd2LCB7XG4gICAgICAgICAgICBwbGF5d3JpZ2h0QXJnczogYnVpbGRQbGF5d3JpZ2h0QXJnc0ZvckUyRShlMmVUYXJnZXRzLCBmb3J3YXJkZWRQbGF5d3JpZ2h0QXJncyksXG4gICAgICAgICAgICBmb3J3YXJkZWRQbGF5d3JpZ2h0QXJncyxcbiAgICAgICAgICB9KSxcbiAgICAgICAgICBwcm9qZWN0LFxuICAgICAgICAgIHRlc3RBcmd2LFxuICAgICAgICAgIHsgZXhpdElmRmFpbGVkOiBvcHRpb25zLmV4aXRJZkZhaWxlZCB9XG4gICAgICAgICk7XG4gICAgICAgIGlmIChleGl0Q29kZSAhPT0gMCkgcmV0dXJuIGV4aXRDb2RlO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGNhc2UgJ2RvY2tlcic6IHtcbiAgICAgICAgY29uc3QgZXhpdENvZGUgPSBhd2FpdCB0ZXN0T25Eb2NrZXIoXG4gICAgICAgICAgcHJvamVjdCxcbiAgICAgICAgICBlMmVBcmd2LFxuICAgICAgICAgIHNjcmlwdHMsXG4gICAgICAgICAgYnVpbGRQbGF5d3JpZ2h0QXJnc0ZvckUyRShlMmVUYXJnZXRzLCBmb3J3YXJkZWRQbGF5d3JpZ2h0QXJncyksXG4gICAgICAgICAgZm9yd2FyZGVkUGxheXdyaWdodEFyZ3MsXG4gICAgICAgICAgb3B0aW9uc1xuICAgICAgICApO1xuICAgICAgICBpZiAoZXhpdENvZGUgIT09IDApIHJldHVybiBleGl0Q29kZTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBjYXNlICdkb2NrZXItZGVidWcnOiB7XG4gICAgICAgIGNvbnN0IGV4aXRDb2RlID0gYXdhaXQgdGVzdE9uRG9ja2VyKFxuICAgICAgICAgIHByb2plY3QsXG4gICAgICAgICAgZTJlQXJndixcbiAgICAgICAgICBzY3JpcHRzLFxuICAgICAgICAgIGJ1aWxkUGxheXdyaWdodEFyZ3NGb3JFMkUoZTJlVGFyZ2V0cywgZm9yd2FyZGVkUGxheXdyaWdodEFyZ3MsIFsnLS1kZWJ1ZyddKSxcbiAgICAgICAgICBmb3J3YXJkZWRQbGF5d3JpZ2h0QXJncyxcbiAgICAgICAgICBvcHRpb25zXG4gICAgICAgICk7XG4gICAgICAgIGlmIChleGl0Q29kZSAhPT0gMCkgcmV0dXJuIGV4aXRDb2RlO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGRlcHMuYmxpdHogfHwgZGVwcy5uZXh0IHx8IGRldkRlcHNbJ0ByZW1peC1ydW4vZGV2J10gfHwgZGV2RGVwcy52aXRlKSB7XG4gICAgICBzd2l0Y2ggKHRlc3RBcmd2LmUyZSkge1xuICAgICAgICBjYXNlICdoZWFkZWQnOiB7XG4gICAgICAgICAgY29uc3QgZXhpdENvZGUgPSBhd2FpdCBydW5UZXN0Q29tbWFuZChcbiAgICAgICAgICAgIGF3YWl0IHNjcmlwdHMudGVzdEUyRVByb2R1Y3Rpb24ocHJvamVjdCwgZTJlQXJndiwge1xuICAgICAgICAgICAgICBwbGF5d3JpZ2h0QXJnczogYnVpbGRQbGF5d3JpZ2h0QXJnc0ZvckUyRShlMmVUYXJnZXRzLCBmb3J3YXJkZWRQbGF5d3JpZ2h0QXJncywgWyctLWhlYWRlZCddKSxcbiAgICAgICAgICAgICAgZm9yd2FyZGVkUGxheXdyaWdodEFyZ3MsXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICAgIHByb2plY3QsXG4gICAgICAgICAgICB0ZXN0QXJndixcbiAgICAgICAgICAgIHsgZXhpdElmRmFpbGVkOiBvcHRpb25zLmV4aXRJZkZhaWxlZCB9XG4gICAgICAgICAgKTtcbiAgICAgICAgICBpZiAoZXhpdENvZGUgIT09IDApIHJldHVybiBleGl0Q29kZTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBjYXNlICdoZWFkZWQtZGV2Jzoge1xuICAgICAgICAgIGNvbnN0IGV4aXRDb2RlID0gYXdhaXQgcnVuVGVzdENvbW1hbmQoXG4gICAgICAgICAgICBhd2FpdCBzY3JpcHRzLnRlc3RFMkVEZXYocHJvamVjdCwgZTJlQXJndiwge1xuICAgICAgICAgICAgICBwbGF5d3JpZ2h0QXJnczogYnVpbGRQbGF5d3JpZ2h0QXJnc0ZvckUyRShlMmVUYXJnZXRzLCBmb3J3YXJkZWRQbGF5d3JpZ2h0QXJncywgWyctLWhlYWRlZCddKSxcbiAgICAgICAgICAgICAgZm9yd2FyZGVkUGxheXdyaWdodEFyZ3MsXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICAgIHByb2plY3QsXG4gICAgICAgICAgICB0ZXN0QXJndixcbiAgICAgICAgICAgIHsgZXhpdElmRmFpbGVkOiBvcHRpb25zLmV4aXRJZkZhaWxlZCB9XG4gICAgICAgICAgKTtcbiAgICAgICAgICBpZiAoZXhpdENvZGUgIT09IDApIHJldHVybiBleGl0Q29kZTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBjYXNlICdkZWJ1Zyc6IHtcbiAgICAgICAgICBjb25zdCBleGl0Q29kZSA9IGF3YWl0IHJ1blRlc3RDb21tYW5kKFxuICAgICAgICAgICAgYXdhaXQgc2NyaXB0cy50ZXN0RTJFUHJvZHVjdGlvbihwcm9qZWN0LCBlMmVBcmd2LCB7XG4gICAgICAgICAgICAgIHBsYXl3cmlnaHRBcmdzOiBidWlsZFBsYXl3cmlnaHRBcmdzRm9yRTJFKGUyZVRhcmdldHMsIGZvcndhcmRlZFBsYXl3cmlnaHRBcmdzLCBbJy0tZGVidWcnXSksXG4gICAgICAgICAgICAgIGZvcndhcmRlZFBsYXl3cmlnaHRBcmdzLFxuICAgICAgICAgICAgfSksXG4gICAgICAgICAgICBwcm9qZWN0LFxuICAgICAgICAgICAgdGVzdEFyZ3YsXG4gICAgICAgICAgICB7IGV4aXRJZkZhaWxlZDogb3B0aW9ucy5leGl0SWZGYWlsZWQgfVxuICAgICAgICAgICk7XG4gICAgICAgICAgaWYgKGV4aXRDb2RlICE9PSAwKSByZXR1cm4gZXhpdENvZGU7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSAnZ2VuZXJhdGUnOiB7XG4gICAgICAgICAgY29uc3QgZXhpdENvZGUgPSBhd2FpdCBydW5UZXN0Q29tbWFuZChcbiAgICAgICAgICAgIGF3YWl0IHNjcmlwdHMudGVzdEUyRVByb2R1Y3Rpb24ocHJvamVjdCwgZTJlQXJndiwge1xuICAgICAgICAgICAgICBwbGF5d3JpZ2h0QXJnczogWydjb2RlZ2VuJywgYGh0dHA6Ly9sb2NhbGhvc3Q6JHtwcm9qZWN0LmVudi5QT1JUfWBdLFxuICAgICAgICAgICAgfSksXG4gICAgICAgICAgICBwcm9qZWN0LFxuICAgICAgICAgICAgdGVzdEFyZ3YsXG4gICAgICAgICAgICB7IGV4aXRJZkZhaWxlZDogb3B0aW9ucy5leGl0SWZGYWlsZWQgfVxuICAgICAgICAgICk7XG4gICAgICAgICAgaWYgKGV4aXRDb2RlICE9PSAwKSByZXR1cm4gZXhpdENvZGU7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSAndHJhY2UnOiB7XG4gICAgICAgICAgY29uc3QgZXhpdENvZGUgPSBhd2FpdCBydW5UZXN0Q29tbWFuZChgQlVOIHBsYXl3cmlnaHQgc2hvdy10cmFjZWAsIHByb2plY3QsIHRlc3RBcmd2LCB7XG4gICAgICAgICAgICBleGl0SWZGYWlsZWQ6IG9wdGlvbnMuZXhpdElmRmFpbGVkLFxuICAgICAgICAgIH0pO1xuICAgICAgICAgIGlmIChleGl0Q29kZSAhPT0gMCkgcmV0dXJuIGV4aXRDb2RlO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHJldHVybiAwO1xufVxuXG4vKipcbiAqIFdhcm4gd2hlbiBhIHByb2plY3QgaGFzIGEgUGxheXdyaWdodCBjb25maWcgYnV0IG5vIHRlc3QvZTJlIGRpcmVjdG9yeS5cbiAqIHdiIGRpc2NvdmVycyBlMmUgdGVzdHMgb25seSB1bmRlciB0ZXN0L2UyZS8sIHNvIHN1Y2ggcHJvamVjdHMgd291bGQgb3RoZXJ3aXNlIGhhdmUgdGhlaXJcbiAqIFBsYXl3cmlnaHQgc3BlY3Mgc2lsZW50bHkgc2tpcHBlZCBhbmQgYHdiIHRlc3RgIC8gYHdiIHZlcmlmeSAtLWZ1bGxgIHdvdWxkIHJlcG9ydCBzdWNjZXNzXG4gKiB3aXRob3V0IHJ1bm5pbmcgYW55IHRlc3RzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gd2FybklmUGxheXdyaWdodFNwZWNzQXJlVW5kaXNjb3ZlcmFibGUoXG4gIHByb2plY3Q6IFBpY2s8UHJvamVjdCwgJ2RpclBhdGgnIHwgJ25hbWUnIHwgJ3BhY2thZ2VKc29uJz5cbik6IHZvaWQge1xuICAvLyBDYWxsZXJzIGludm9rZSB0aGlzIG9ubHkgYWZ0ZXIgZXN0YWJsaXNoaW5nIHRoYXQgdGVzdC9lMmUgaXMgbWlzc2luZywgc28gaXQgaXMgbm90IHJlLWNoZWNrZWRcbiAgLy8gaGVyZS4gQSB3b3Jrc3BhY2Ugcm9vdCBkZWxlZ2F0ZXMgZTJlIHRvIGl0cyBwYWNrYWdlcywgc28gaXQgbmV2ZXIgd2FybnMgKGNoZWNrZWQgZmlyc3QgdG8gc2tpcFxuICAvLyB0aGUgZmlsZXN5c3RlbSBsb29rdXAgYmVsb3cpLiBPbmx5IGEgcHJvamVjdCdzIE9XTiBQbGF5d3JpZ2h0IGNvbmZpZyBjb3VudHM6IGBoYXNQbGF5d3JpZ2h0Q29uZmlnYFxuICAvLyB3YWxrcyB1cCB0byB0aGUgbW9ub3JlcG8gcm9vdCwgc28gcmV1c2luZyBpdCB3b3VsZCBmYWxzZS1wb3NpdGl2ZSBvbiBsaWJyYXJ5IHBhY2thZ2VzIGFuZCB0aGVcbiAgLy8gcm9vdCBpdHNlbGYsIHdoaWNoIGxlZ2l0aW1hdGVseSBzaGFyZSBhIHJvb3QtbGV2ZWwgcGxheXdyaWdodC5jb25maWcudHMgYnV0IGtlZXAgZTJlIHNwZWNzIGluIGFcbiAgLy8gc2luZ2xlIGFwcCBwYWNrYWdlLlxuICBpZiAocHJvamVjdC5wYWNrYWdlSnNvbi53b3Jrc3BhY2VzKSByZXR1cm47XG4gIGlmICghZnMuZXhpc3RzU3luYyhwYXRoLmpvaW4ocHJvamVjdC5kaXJQYXRoLCAncGxheXdyaWdodC5jb25maWcudHMnKSkpIHJldHVybjtcblxuICBjb25zb2xlLndhcm4oXG4gICAgY2hhbGsueWVsbG93KFxuICAgICAgYFNraXBwaW5nIGUyZSB0ZXN0cyBmb3IgJHtwcm9qZWN0Lm5hbWV9OiBhIFBsYXl3cmlnaHQgY29uZmlnIGV4aXN0cyBidXQgdGhlIHRlc3QvZTJlIGRpcmVjdG9yeSBpcyBtaXNzaW5nLiB3YiBvbmx5IGRpc2NvdmVycyBQbGF5d3JpZ2h0IHNwZWNzIHVuZGVyIHRlc3QvZTJlLywgc28gbW92ZSB0aGVtIHRoZXJlIHRvIHJ1biBlMmUgdGVzdHMuYFxuICAgIClcbiAgKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHdpdGhEZWZhdWx0VGVzdENhc2NhZGVFbnYoYXJndjogVGVzdENvbW1hbmRBcmd2KTogVGVzdENvbW1hbmRBcmd2IHtcbiAgaWYgKGFyZ3YuZW52Py5sZW5ndGggfHwgYXJndi5jYXNjYWRlRW52IHx8IGFyZ3YuY2FzY2FkZU5vZGVFbnYgfHwgYXJndi5hdXRvQ2FzY2FkZUVudiA9PT0gZmFsc2UpIHtcbiAgICByZXR1cm4gYXJndjtcbiAgfVxuICByZXR1cm4geyAuLi5hcmd2LCBjYXNjYWRlRW52OiAndGVzdCcgfTtcbn1cblxuZnVuY3Rpb24gZ2V0RGVmYXVsdFVuaXRUYXJnZXRzKHByb2plY3Q6IFByb2plY3QpOiBzdHJpbmdbXSB8IGZhbHNlIHtcbiAgaWYgKGZzLmV4aXN0c1N5bmMocGF0aC5qb2luKHByb2plY3QuZGlyUGF0aCwgJ3Rlc3QnLCAndW5pdCcpKSkge1xuICAgIHJldHVybiBbXTtcbiAgfVxuICBpZiAocHJvamVjdC5oYXNWaXRlc3QgJiYgZnMuZXhpc3RzU3luYyhwYXRoLmpvaW4ocHJvamVjdC5kaXJQYXRoLCAndGVzdCcpKSkge1xuICAgIHJldHVybiBmcy5leGlzdHNTeW5jKHBhdGguam9pbihwcm9qZWN0LmRpclBhdGgsICd0ZXN0JywgJ2UyZScpKSA/IFsndGVzdCcsICctLWV4Y2x1ZGUnLCAndGVzdC9lMmUvKionXSA6IFsndGVzdCddO1xuICB9XG4gIHJldHVybiBmYWxzZTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gdGVzdE9uRG9ja2VyKFxuICBwcm9qZWN0OiBQcm9qZWN0LFxuICBhcmd2OiBBcmd1bWVudHNDYW1lbENhc2U8SW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgYnVpbGRlciAmIHR5cGVvZiBhcmd1bWVudHNCdWlsZGVyPj4sXG4gIHNjcmlwdHM6IEJhc2VTY3JpcHRzLFxuICBwbGF5d3JpZ2h0QXJncz86IHN0cmluZ1tdLFxuICBmb3J3YXJkZWRQbGF5d3JpZ2h0QXJncz86IHN0cmluZ1tdLFxuICBvcHRpb25zOiBUZXN0UnVuT3B0aW9ucyA9IHt9XG4pOiBQcm9taXNlPG51bWJlcj4ge1xuICBwcm9qZWN0LmVudi5XQl9ET0NLRVIgfHw9ICcxJztcbiAgY29uc3QgYnVpbGRFeGl0Q29kZSA9IGF3YWl0IHJ1bldpdGhTcGF3bihgJHtzY3JpcHRzLmJ1aWxkRG9ja2VyKHByb2plY3QsICd0ZXN0Jyl9JHt0b0Rldk51bGwoYXJndil9YCwgcHJvamVjdCwgYXJndiwge1xuICAgIGV4aXRJZkZhaWxlZDogb3B0aW9ucy5leGl0SWZGYWlsZWQsXG4gIH0pO1xuICBpZiAoYnVpbGRFeGl0Q29kZSAhPT0gMCkge1xuICAgIHJldHVybiBidWlsZEV4aXRDb2RlO1xuICB9XG4gIGNvbnN0IHRlc3RFeGl0Q29kZSA9IGF3YWl0IHJ1blRlc3RDb21tYW5kKFxuICAgIGF3YWl0IHNjcmlwdHMudGVzdEUyRURvY2tlcihwcm9qZWN0LCBhcmd2LCB7XG4gICAgICBwbGF5d3JpZ2h0QXJncyxcbiAgICAgIGZvcndhcmRlZFBsYXl3cmlnaHRBcmdzLFxuICAgIH0pLFxuICAgIHByb2plY3QsXG4gICAgYXJndixcbiAgICB7IGV4aXRJZkZhaWxlZDogZmFsc2UgfVxuICApO1xuICBjb25zdCBzdG9wRXhpdENvZGUgPSBhd2FpdCBydW5XaXRoU3Bhd24oZG9ja2VyU2NyaXB0cy5zdG9wKHByb2plY3QpLCBwcm9qZWN0LCBhcmd2LCB7XG4gICAgZXhpdElmRmFpbGVkOiBvcHRpb25zLmV4aXRJZkZhaWxlZCxcbiAgfSk7XG4gIGlmICh0ZXN0RXhpdENvZGUgIT09IDApIHtcbiAgICByZXR1cm4gdGVzdEV4aXRDb2RlO1xuICB9XG4gIHJldHVybiBzdG9wRXhpdENvZGU7XG59XG5cbmZ1bmN0aW9uIHJ1blRlc3RDb21tYW5kKFxuICBzY3JpcHQ6IHN0cmluZyxcbiAgcHJvamVjdDogUHJvamVjdCxcbiAgYXJndjogUGFyYW1ldGVyczx0eXBlb2YgcnVuV2l0aFNwYXduPlsyXSxcbiAgb3B0aW9uczogUGFyYW1ldGVyczx0eXBlb2YgcnVuV2l0aFNwYXduPlszXSA9IHt9XG4pOiBQcm9taXNlPG51bWJlcj4ge1xuICByZXR1cm4gcnVuV2l0aFNwYXduKHNjcmlwdCwgcHJvamVjdCwgYXJndiwge1xuICAgIC4uLm9wdGlvbnMsXG4gICAgcHJvY2Vzc1NpbGVudE91dHB1dDogZGVkdXBlTm9pc3lUZXN0T3V0cHV0LFxuICB9KTtcbn1cblxuZnVuY3Rpb24gcnVuVW5pdFRlc3RDb21tYW5kKFxuICBzY3JpcHQ6IHN0cmluZyxcbiAgcHJvamVjdDogUHJvamVjdCxcbiAgYXJndjogUGFyYW1ldGVyczx0eXBlb2YgcnVuV2l0aFNwYXduPlsyXSxcbiAgb3B0aW9uczogUGFyYW1ldGVyczx0eXBlb2YgcnVuV2l0aFNwYXduPlszXSA9IHt9XG4pOiBQcm9taXNlPG51bWJlcj4ge1xuICByZXR1cm4gcnVuV2l0aFNwYXduKHNjcmlwdCwgcHJvamVjdCwgYXJndiwge1xuICAgIC4uLm9wdGlvbnMsXG4gICAgb21pdFNpbGVudFN0YXJ0OiB0cnVlLFxuICAgIHByaW50U2lsZW50T3V0cHV0T25GYWlsdXJlT25seTogdHJ1ZSxcbiAgICBzaWxlbnRQcm9ncmVzc0ludGVydmFsTXM6IDEwXzAwMCxcbiAgICBzaWxlbnRTdWNjZXNzTWVzc2FnZTogJ1VuaXQgdGVzdHMgcGFzc2VkLicsXG4gIH0pO1xufVxuXG5mdW5jdGlvbiBkZWR1cGVOb2lzeVRlc3RPdXRwdXQob3V0cHV0OiBzdHJpbmcpOiBzdHJpbmcge1xuICBjb25zdCByZWNlbnRQcmludGVkTGluZXM6IHN0cmluZ1tdID0gW107XG4gIGNvbnN0IHJlY2VudFByaW50ZWRMaW5lU2V0ID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gIGNvbnN0IGRlZHVwZWRMaW5lczogc3RyaW5nW10gPSBbXTtcbiAgZm9yIChjb25zdCBsaW5lIG9mIGl0ZXJhdGVMaW5lcyhvdXRwdXQpKSB7XG4gICAgY29uc3Qgbm9ybWFsaXplZExpbmUgPSBub3JtYWxpemVMaW5lRm9yU2ltaWxhcml0eShsaW5lKTtcbiAgICBpZiAocmVjZW50UHJpbnRlZExpbmVTZXQuaGFzKG5vcm1hbGl6ZWRMaW5lKSkgY29udGludWU7XG4gICAgaWYgKHJlY2VudFByaW50ZWRMaW5lcy5zb21lKChwcmludGVkTGluZSkgPT4gYXJlTGluZXNTaW1pbGFyKHByaW50ZWRMaW5lLCBub3JtYWxpemVkTGluZSkpKSBjb250aW51ZTtcblxuICAgIHB1c2hSZWNlbnRQcmludGVkTGluZShyZWNlbnRQcmludGVkTGluZXMsIHJlY2VudFByaW50ZWRMaW5lU2V0LCBub3JtYWxpemVkTGluZSk7XG4gICAgZGVkdXBlZExpbmVzLnB1c2gobGluZSk7XG4gIH1cbiAgcmV0dXJuIGRlZHVwZWRMaW5lcy5qb2luKCdcXG4nKTtcbn1cblxuZnVuY3Rpb24qIGl0ZXJhdGVMaW5lcyhvdXRwdXQ6IHN0cmluZyk6IEdlbmVyYXRvcjxzdHJpbmc+IHtcbiAgbGV0IGxpbmVTdGFydEluZGV4ID0gMDtcbiAgd2hpbGUgKGxpbmVTdGFydEluZGV4IDw9IG91dHB1dC5sZW5ndGgpIHtcbiAgICBjb25zdCBsaW5lRW5kSW5kZXggPSBvdXRwdXQuaW5kZXhPZignXFxuJywgbGluZVN0YXJ0SW5kZXgpO1xuICAgIGlmIChsaW5lRW5kSW5kZXggPT09IC0xKSB7XG4gICAgICB5aWVsZCBvdXRwdXQuc2xpY2UobGluZVN0YXJ0SW5kZXgpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHlpZWxkIG91dHB1dC5zbGljZShsaW5lU3RhcnRJbmRleCwgbGluZUVuZEluZGV4KTtcbiAgICBsaW5lU3RhcnRJbmRleCA9IGxpbmVFbmRJbmRleCArIDE7XG4gIH1cbn1cblxuZnVuY3Rpb24gcHVzaFJlY2VudFByaW50ZWRMaW5lKGxpbmVzOiBzdHJpbmdbXSwgbGluZVNldDogU2V0PHN0cmluZz4sIGxpbmU6IHN0cmluZyk6IHZvaWQge1xuICBsaW5lcy5wdXNoKGxpbmUpO1xuICBsaW5lU2V0LmFkZChsaW5lKTtcbiAgaWYgKGxpbmVzLmxlbmd0aCA8PSBTSU1JTEFSX1RFU1RfT1VUUFVUX0xPT0tCQUNLX0xJTkVfQ09VTlQpIHJldHVybjtcblxuICBjb25zdCByZW1vdmVkTGluZSA9IGxpbmVzLnNoaWZ0KCk7XG4gIGlmIChyZW1vdmVkTGluZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgbGluZVNldC5kZWxldGUocmVtb3ZlZExpbmUpO1xuICB9XG59XG5cbmZ1bmN0aW9uIG5vcm1hbGl6ZUxpbmVGb3JTaW1pbGFyaXR5KGxpbmU6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiBsaW5lXG4gICAgLnJlcGxhY2VBbGwoQU5TSV9FU0NBUEVfQ09ERV9SRUdFWFAsICcnKVxuICAgIC50cmltKClcbiAgICAucmVwbGFjZUFsbCgvXig/OlxcW1teXFxdXStcXF1cXHMqKSsvZywgJycpXG4gICAgLnJlcGxhY2VBbGwoL1xcKG5vZGU6XFxkK1xcKS9nLCAnKG5vZGU6PG51bWJlcj4pJylcbiAgICAucmVwbGFjZUFsbCgvXFxiXFxkezR9LVxcZHsyfS1cXGR7Mn1UXFxkezJ9OlxcZHsyfTpcXGR7Mn0oPzpcXC5cXGQrKT9aP1xcYi9nLCAnPHRpbWVzdGFtcD4nKVxuICAgIC5yZXBsYWNlQWxsKC8oWz8mXWNhY2hlPSlcXGQrL2csICckMTxudW1iZXI+Jyk7XG59XG5cbmZ1bmN0aW9uIGFyZUxpbmVzU2ltaWxhcihhOiBzdHJpbmcsIGI6IHN0cmluZyk6IGJvb2xlYW4ge1xuICBjb25zdCBtYXhMZW5ndGggPSBNYXRoLm1heChhLmxlbmd0aCwgYi5sZW5ndGgpO1xuICBpZiAobWF4TGVuZ3RoID09PSAwKSByZXR1cm4gdHJ1ZTtcbiAgaWYgKE1hdGguYWJzKGEubGVuZ3RoIC0gYi5sZW5ndGgpID4gbWF4TGVuZ3RoICogU0lNSUxBUl9URVNUX09VVFBVVF9ESVNUQU5DRV9SQVRJTykgcmV0dXJuIGZhbHNlO1xuXG4gIHJldHVybiBkaXN0YW5jZShhLCBiKSAvIG1heExlbmd0aCA8PSBTSU1JTEFSX1RFU1RfT1VUUFVUX0RJU1RBTkNFX1JBVElPO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gYnVpbGRQbGF5d3JpZ2h0QXJnc0ZvckUyRShcbiAgZTJlVGFyZ2V0czogc3RyaW5nW10sXG4gIGZvcndhcmRlZFBsYXl3cmlnaHRBcmdzOiBzdHJpbmdbXSA9IFtdLFxuICBhZGRpdGlvbmFsQXJnczogc3RyaW5nW10gPSBbXVxuKTogc3RyaW5nW10ge1xuICBjb25zdCBoYXNGb3J3YXJkZWRQbGF5d3JpZ2h0VGFyZ2V0cyA9IGZpbmRFeHBsaWNpdFBsYXl3cmlnaHRUYXJnZXRJbmRleGVzKGZvcndhcmRlZFBsYXl3cmlnaHRBcmdzKS5sZW5ndGggPiAwO1xuICByZXR1cm4gWyd0ZXN0JywgLi4uKGUyZVRhcmdldHMubGVuZ3RoID4gMCB8fCBoYXNGb3J3YXJkZWRQbGF5d3JpZ2h0VGFyZ2V0cyA/IFtdIDogWyd0ZXN0L2UyZS8nXSksIC4uLmFkZGl0aW9uYWxBcmdzXTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJlc29sdmVUZXN0RXhlY3V0aW9uVGFyZ2V0cyhcbiAgdGVzdFRhcmdldHM6IHN0cmluZ1tdLFxuICBmb3J3YXJkZWRQbGF5d3JpZ2h0QXJnczogc3RyaW5nW10gPSBbXVxuKTogeyBzaG91bGRSdW5Vbml0OiBib29sZWFuOyBzaG91bGRSdW5FMmU6IGJvb2xlYW4gfSB7XG4gIGNvbnN0IGhhc0UyZVRhcmdldHMgPSB0ZXN0VGFyZ2V0cy5zb21lKCh0YXJnZXQpID0+IHRhcmdldC5pbmNsdWRlcygnL2UyZScpKTtcbiAgY29uc3QgaGFzVW5pdFRhcmdldHMgPSB0ZXN0VGFyZ2V0cy5zb21lKCh0YXJnZXQpID0+IHRhcmdldC5pbmNsdWRlcygnL3VuaXQnKSk7XG4gIGNvbnN0IHNob3VsZFJ1bkFsbFRlc3RzID0gdGVzdFRhcmdldHMubGVuZ3RoID09PSAwICYmIGZvcndhcmRlZFBsYXl3cmlnaHRBcmdzLmxlbmd0aCA9PT0gMDtcblxuICByZXR1cm4ge1xuICAgIHNob3VsZFJ1blVuaXQ6IHNob3VsZFJ1bkFsbFRlc3RzIHx8IGhhc1VuaXRUYXJnZXRzLFxuICAgIHNob3VsZFJ1bkUyZTogc2hvdWxkUnVuQWxsVGVzdHMgfHwgaGFzRTJlVGFyZ2V0cyB8fCBmb3J3YXJkZWRQbGF5d3JpZ2h0QXJncy5sZW5ndGggPiAwLFxuICB9O1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IGNoYWxrIGZyb20gJ2NoYWxrJztcbmltcG9ydCB0eXBlIHsgQXJndW1lbnRzQ2FtZWxDYXNlLCBDb21tYW5kTW9kdWxlLCBJbmZlcnJlZE9wdGlvblR5cGVzIH0gZnJvbSAneWFyZ3MnO1xuXG5pbXBvcnQgeyBmaW5kRGVzY2VuZGFudFByb2plY3RzIH0gZnJvbSAnLi4vcHJvamVjdC5qcyc7XG5pbXBvcnQgeyB0b0Rldk51bGwgfSBmcm9tICcuLi9zY3JpcHRzL2J1aWxkZXIuanMnO1xuaW1wb3J0IHsgZG9ja2VyU2NyaXB0cyB9IGZyb20gJy4uL3NjcmlwdHMvZG9ja2VyU2NyaXB0cy5qcyc7XG5pbXBvcnQgdHlwZSB7IEJhc2VTY3JpcHRzIH0gZnJvbSAnLi4vc2NyaXB0cy9leGVjdXRpb24vYmFzZVNjcmlwdHMuanMnO1xuaW1wb3J0IHsgYmxpdHpTY3JpcHRzIH0gZnJvbSAnLi4vc2NyaXB0cy9leGVjdXRpb24vYmxpdHpTY3JpcHRzLmpzJztcbmltcG9ydCB7IGh0dHBTZXJ2ZXJTY3JpcHRzIH0gZnJvbSAnLi4vc2NyaXB0cy9leGVjdXRpb24vaHR0cFNlcnZlclNjcmlwdHMuanMnO1xuaW1wb3J0IHsgbmV4dFNjcmlwdHMgfSBmcm9tICcuLi9zY3JpcHRzL2V4ZWN1dGlvbi9uZXh0U2NyaXB0cy5qcyc7XG5pbXBvcnQgeyBwbGFpbkFwcFNjcmlwdHMgfSBmcm9tICcuLi9zY3JpcHRzL2V4ZWN1dGlvbi9wbGFpbkFwcFNjcmlwdHMuanMnO1xuaW1wb3J0IHsgcmVtaXhTY3JpcHRzIH0gZnJvbSAnLi4vc2NyaXB0cy9leGVjdXRpb24vcmVtaXhTY3JpcHRzLmpzJztcbmltcG9ydCB7IHZpbmV4dFNjcmlwdHMgfSBmcm9tICcuLi9zY3JpcHRzL2V4ZWN1dGlvbi92aW5leHRTY3JpcHRzLmpzJztcbmltcG9ydCB7IHZpdGVTY3JpcHRzIH0gZnJvbSAnLi4vc2NyaXB0cy9leGVjdXRpb24vdml0ZVNjcmlwdHMuanMnO1xuaW1wb3J0IHsgd29ya2Vyc1NjcmlwdHMgfSBmcm9tICcuLi9zY3JpcHRzL2V4ZWN1dGlvbi93b3JrZXJzU2NyaXB0cy5qcyc7XG5pbXBvcnQgeyBydW5XaXRoU3Bhd24sIHJ1bldpdGhTcGF3bkluUGFyYWxsZWwgfSBmcm9tICcuLi9zY3JpcHRzL3J1bi5qcyc7XG5pbXBvcnQgdHlwZSB7IHNoYXJlZE9wdGlvbnNCdWlsZGVyIH0gZnJvbSAnLi4vc2hhcmVkT3B0aW9uc0J1aWxkZXIuanMnO1xuaW1wb3J0IHsgZmluZFdyYW5nbGVyQ29uZmlnUGF0aCB9IGZyb20gJy4uL3V0aWxzL3dyYW5nbGVyLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuXG5pbXBvcnQgeyBodHRwU2VydmVyUGFja2FnZXMgfSBmcm9tICcuL2h0dHBTZXJ2ZXJQYWNrYWdlcy5qcyc7XG5pbXBvcnQgeyB3YXJuSWZQbGF5d3JpZ2h0U3BlY3NBcmVVbmRpc2NvdmVyYWJsZSB9IGZyb20gJy4vdGVzdC5qcyc7XG5cbmNvbnN0IHRlc3RPbkNpQnVpbGRlciA9IHtcbiAgc2lsZW50OiB7XG4gICAgZGVzY3JpcHRpb246ICdSZWR1Y2UgcmVkdW5kYW50IG91dHB1dHMnLFxuICAgIHR5cGU6ICdib29sZWFuJyxcbiAgfSxcbn0gYXMgY29uc3Q7XG5leHBvcnQgY29uc3QgdGVzdE9uQ2lDb21tYW5kOiBDb21tYW5kTW9kdWxlPFxuICB1bmtub3duLFxuICBJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiB0ZXN0T25DaUJ1aWxkZXIgJiB0eXBlb2Ygc2hhcmVkT3B0aW9uc0J1aWxkZXI+XG4+ID0ge1xuICBjb21tYW5kOiAndGVzdC1vbi1jaScsXG4gIGRlc2NyaWJlOiAnVGVzdCBwcm9qZWN0IG9uIENJIHdpdGggbm8gb3B0aW9ucy4nLFxuICBidWlsZGVyOiB0ZXN0T25DaUJ1aWxkZXIsXG4gIGFzeW5jIGhhbmRsZXIoYXJndikge1xuICAgIGF3YWl0IHRlc3RPbkNpKGFyZ3YpO1xuICB9LFxufTtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHRlc3RPbkNpKFxuICBhcmd2OiBBcmd1bWVudHNDYW1lbENhc2U8SW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgdGVzdE9uQ2lCdWlsZGVyICYgdHlwZW9mIHNoYXJlZE9wdGlvbnNCdWlsZGVyPj5cbik6IFByb21pc2U8dm9pZD4ge1xuICAvLyBTcGF3bmVkIGNvbW1hbmRzIHJlLWRlcml2ZSB0aGVpciBkb3RlbnYgY2FzY2FkZSBmcm9tIHRoZSBleHBvcnRlZCBXQl9FTlYsIHNvIGFuIHVuZXhwb3J0ZWRcbiAgLy8gV0JfRU5WIHdvdWxkIGxldCBhIGNvbW1pdHRlZCBgLmVudmAgKGUuZy4gV0JfRU5WPWRldmVsb3BtZW50KSBzZWxlY3QgdGhlIGRldmVsb3BtZW50XG4gIC8vIGVudmlyb25tZW50IOKAlCBydW5uaW5nIHRoZSBkZXN0cnVjdGl2ZSBlMmUgc3VpdGUgYWdhaW5zdCB0aGUgZGV2ZWxvcGVyJ3Mgb3duIGRhdGFiYXNlLlxuICBwcm9jZXNzLmVudi5XQl9FTlYgfHw9ICd0ZXN0JztcblxuICBjb25zdCBwcm9qZWN0cyA9IGF3YWl0IGZpbmREZXNjZW5kYW50UHJvamVjdHMoYXJndik7XG4gIGlmICghcHJvamVjdHMpIHtcbiAgICBjb25zb2xlLmVycm9yKGNoYWxrLnJlZCgnTm8gcHJvamVjdCBmb3VuZC4nKSk7XG4gICAgcHJvY2Vzcy5leGl0KDEpO1xuICB9XG5cbiAgZm9yIChjb25zdCBwcm9qZWN0IG9mIHByb2plY3RzLmRlc2NlbmRhbnRzKSB7XG4gICAgcHJvamVjdC5lbnYuQ0kgfHw9ICcxJztcbiAgICAvLyBPdmVyd3JpdGUsIG5vdCB8fD06IHByb2plY3QuZW52IGFscmVhZHkgY2FycmllcyB0aGUgZG90ZW52LWRlcml2ZWQgdmFsdWUuXG4gICAgcHJvamVjdC5lbnYuV0JfRU5WID0gcHJvY2Vzcy5lbnYuV0JfRU5WO1xuXG4gICAgY29uc3QgZGVwcyA9IHByb2plY3QucGFja2FnZUpzb24uZGVwZW5kZW5jaWVzID8/IHt9O1xuICAgIGNvbnN0IGRldkRlcHMgPSBwcm9qZWN0LnBhY2thZ2VKc29uLmRldkRlcGVuZGVuY2llcyA/PyB7fTtcbiAgICBsZXQgc2NyaXB0czogQmFzZVNjcmlwdHM7XG4gICAgaWYgKGRlcHMuYmxpdHopIHtcbiAgICAgIHNjcmlwdHMgPSBibGl0elNjcmlwdHM7XG4gICAgfSBlbHNlIGlmIChkZXBzLnZpbmV4dCB8fCBkZXZEZXBzLnZpbmV4dCkge1xuICAgICAgLy8gdmluZXh0IGFwcHMgYWxzbyBkZXBlbmQgb24gbmV4dCwgc28gdGhpcyBjaGVjayBtdXN0IGNvbWUgZmlyc3QuXG4gICAgICBzY3JpcHRzID0gdmluZXh0U2NyaXB0cztcbiAgICB9IGVsc2UgaWYgKGRlcHMubmV4dCkge1xuICAgICAgc2NyaXB0cyA9IG5leHRTY3JpcHRzO1xuICAgIH0gZWxzZSBpZiAoZGV2RGVwc1snQHJlbWl4LXJ1bi9kZXYnXSkge1xuICAgICAgc2NyaXB0cyA9IHJlbWl4U2NyaXB0cztcbiAgICB9IGVsc2UgaWYgKGRldkRlcHMudml0ZSkge1xuICAgICAgc2NyaXB0cyA9IHZpdGVTY3JpcHRzO1xuICAgIH0gZWxzZSBpZiAoZmluZFdyYW5nbGVyQ29uZmlnUGF0aChwcm9qZWN0KSkge1xuICAgICAgLy8gUGxhaW4gQ2xvdWRmbGFyZSBXb3JrZXJzIGFwcDsgdmluZXh0IGFwcHMgYXJlIGRldGVjdGVkIGFib3ZlLlxuICAgICAgc2NyaXB0cyA9IHdvcmtlcnNTY3JpcHRzO1xuICAgIH0gZWxzZSBpZiAoaHR0cFNlcnZlclBhY2thZ2VzLnNvbWUoKHApID0+IGRlcHNbcF0pICYmICFkZXBzWydmaXJlYmFzZS1mdW5jdGlvbnMnXSkge1xuICAgICAgc2NyaXB0cyA9IGh0dHBTZXJ2ZXJTY3JpcHRzO1xuICAgIH0gZWxzZSB7XG4gICAgICBzY3JpcHRzID0gcGxhaW5BcHBTY3JpcHRzO1xuICAgIH1cblxuICAgIGNvbnNvbGUuaW5mbyhgUnVubmluZyBcInRlc3Qtb24tY2lcIiBmb3IgJHtwcm9qZWN0Lm5hbWV9IC4uLmApO1xuXG4gICAgY29uc3QgaGFzRG9ja2VyZmlsZSA9IHByb2plY3QuaGFzRG9ja2VyZmlsZTtcbiAgICBpZiAoaGFzRG9ja2VyZmlsZSkge1xuICAgICAgYXdhaXQgcnVuV2l0aFNwYXduSW5QYXJhbGxlbChkb2NrZXJTY3JpcHRzLnN0b3BBbGwoKSwgcHJvamVjdCwgYXJndik7XG4gICAgfVxuICAgIGlmIChmcy5leGlzdHNTeW5jKHBhdGguam9pbihwcm9qZWN0LmRpclBhdGgsICd0ZXN0JywgJ3VuaXQnKSkpIHtcbiAgICAgIC8vIENJIG1vZGUgZGlzYWxsb3dzIGBvbmx5YCB0byBhdm9pZCBpbmNsdWRpbmcgZGVidWcgdGVzdHNcbiAgICAgIGF3YWl0IHJ1bldpdGhTcGF3bkluUGFyYWxsZWwoc2NyaXB0cy50ZXN0VW5pdChwcm9qZWN0LCBhcmd2KS5yZXBsYWNlQWxsKCcgLS1hbGxvd09ubHknLCAnJyksIHByb2plY3QsIGFyZ3YpO1xuICAgIH1cbiAgICBpZiAoZnMuZXhpc3RzU3luYyhwYXRoLmpvaW4ocHJvamVjdC5kaXJQYXRoLCAndGVzdCcsICdlMmUnKSkpIHtcbiAgICAgIC8vIENvbmZpcm0gZGV2IHNlcnZlciBzdGFydHVwIGZvciBjb25zaXN0ZW5jeSBhY3Jvc3MgcHJvamVjdHMgd2l0aCBFMkUgdGVzdHMuXG4gICAgICBhd2FpdCBydW5XaXRoU3Bhd25JblBhcmFsbGVsKGF3YWl0IHNjcmlwdHMudGVzdFN0YXJ0KHByb2plY3QsIGFyZ3YpLCBwcm9qZWN0LCBhcmd2KTtcbiAgICAgIGF3YWl0IHByb21pc2VQb29sLnByb21pc2VBbGwoKTtcbiAgICAgIGlmIChoYXNEb2NrZXJmaWxlKSB7XG4gICAgICAgIHByb2plY3QuZW52LldCX0RPQ0tFUiB8fD0gJzEnO1xuICAgICAgICBhd2FpdCBydW5XaXRoU3Bhd24oYCR7c2NyaXB0cy5idWlsZERvY2tlcihwcm9qZWN0LCAndGVzdCcpfSR7dG9EZXZOdWxsKGFyZ3YpfWAsIHByb2plY3QsIGFyZ3YpO1xuICAgICAgfVxuICAgICAgY29uc3Qgc2NyaXB0ID0gaGFzRG9ja2VyZmlsZVxuICAgICAgICA/IGF3YWl0IHNjcmlwdHMudGVzdEUyRURvY2tlcihwcm9qZWN0LCBhcmd2LCB7fSlcbiAgICAgICAgOiBhd2FpdCBzY3JpcHRzLnRlc3RFMkVQcm9kdWN0aW9uKHByb2plY3QsIGFyZ3YsIHt9KTtcbiAgICAgIHByb2Nlc3MuZXhpdENvZGUgPSBhd2FpdCBydW5XaXRoU3Bhd24oXG4gICAgICAgIC8vIENJIG1vZGUgZGlzYWxsb3dzIGBvbmx5YCB0byBhdm9pZCBpbmNsdWRpbmcgZGVidWcgdGVzdHNcbiAgICAgICAgc2NyaXB0LnJlcGxhY2VBbGwoJyAtLWFsbG93T25seScsICcnKSxcbiAgICAgICAgcHJvamVjdCxcbiAgICAgICAgYXJndixcbiAgICAgICAge1xuICAgICAgICAgIGV4aXRJZkZhaWxlZDogZmFsc2UsXG4gICAgICAgIH1cbiAgICAgICk7XG4gICAgICBpZiAoaGFzRG9ja2VyZmlsZSkge1xuICAgICAgICBhd2FpdCBydW5XaXRoU3Bhd24oZG9ja2VyU2NyaXB0cy5zdG9wKHByb2plY3QpLCBwcm9qZWN0LCBhcmd2KTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgd2FybklmUGxheXdyaWdodFNwZWNzQXJlVW5kaXNjb3ZlcmFibGUocHJvamVjdCk7XG4gICAgfVxuICB9XG59XG4iLCJpbXBvcnQgeyBjb25zdGFudHMgfSBmcm9tICdub2RlOm9zJztcblxuaW1wb3J0IHsgdHJlZUtpbGwgfSBmcm9tICdAd2lsbGJvb3N0ZXIvc2hhcmVkLWxpYi1ub2RlL3NyYyc7XG5pbXBvcnQgdHlwZSB7IEFyZ3YsIENvbW1hbmRNb2R1bGUgfSBmcm9tICd5YXJncyc7XG5cbmludGVyZmFjZSBUcmVlS2lsbENvbW1hbmRBcmdzIHtcbiAgcGlkOiBudW1iZXI7XG4gIHNpZ25hbDogc3RyaW5nO1xufVxuXG5jb25zdCBidWlsZGVyID0gKHlhcmdzOiBBcmd2KTogQXJndjxUcmVlS2lsbENvbW1hbmRBcmdzPiA9PlxuICB5YXJnc1xuICAgIC5wb3NpdGlvbmFsKCdwaWQnLCB7XG4gICAgICBkZXNjcmlwdGlvbjogJ1RoZSBwcm9jZXNzIElEIHRvIGtpbGwuJyxcbiAgICAgIHR5cGU6ICdudW1iZXInLFxuICAgICAgZGVtYW5kT3B0aW9uOiB0cnVlLFxuICAgIH0pXG4gICAgLm9wdGlvbignc2lnbmFsJywge1xuICAgICAgZGVzY3JpcHRpb246ICdTaWduYWwgdG8gc2VuZCB0byB0aGUgcHJvY2VzcyB0cmVlLicsXG4gICAgICB0eXBlOiAnc3RyaW5nJyxcbiAgICAgIGRlZmF1bHQ6ICdTSUdURVJNJyxcbiAgICB9KSBhcyBBcmd2PFRyZWVLaWxsQ29tbWFuZEFyZ3M+O1xuXG5leHBvcnQgY29uc3QgdHJlZUtpbGxDb21tYW5kOiBDb21tYW5kTW9kdWxlPG9iamVjdCwgVHJlZUtpbGxDb21tYW5kQXJncz4gPSB7XG4gIGNvbW1hbmQ6ICd0cmVlLWtpbGwgPHBpZD4gW3NpZ25hbF0nLFxuICBkZXNjcmliZTogJ0tpbGwgdGhlIGdpdmVuIHByb2Nlc3MgYW5kIGFsbCBkZXNjZW5kYW50cycsXG4gIGJ1aWxkZXIsXG4gIGhhbmRsZXIoYXJndikge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBzaWduYWwgPSBhcmd2LnNpZ25hbCBhcyBOb2RlSlMuU2lnbmFscztcbiAgICAgIGlmICghKHNpZ25hbCBpbiBjb25zdGFudHMuc2lnbmFscykpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIHNpZ25hbDogJHtzaWduYWx9YCk7XG4gICAgICB9XG4gICAgICB0cmVlS2lsbChhcmd2LnBpZCwgc2lnbmFsKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgY29uc29sZS5lcnJvcihlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6IFN0cmluZyhlcnJvcikpO1xuICAgICAgcHJvY2Vzcy5leGl0KDEpO1xuICAgIH1cbiAgfSxcbn07XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgY2hhbGsgZnJvbSAnY2hhbGsnO1xuaW1wb3J0IHR5cGUgeyBBcmd1bWVudHNDYW1lbENhc2UsIENvbW1hbmRNb2R1bGUsIEluZmVycmVkT3B0aW9uVHlwZXMgfSBmcm9tICd5YXJncyc7XG5cbmltcG9ydCB7IGZpbmREZXNjZW5kYW50UHJvamVjdHMgfSBmcm9tICcuLi9wcm9qZWN0LmpzJztcbmltcG9ydCB0eXBlIHsgUHJvamVjdCB9IGZyb20gJy4uL3Byb2plY3QuanMnO1xuaW1wb3J0IHsgcnVuV2l0aFNwYXduSW5QYXJhbGxlbCB9IGZyb20gJy4uL3NjcmlwdHMvcnVuLmpzJztcbmltcG9ydCB0eXBlIHsgc2hhcmVkT3B0aW9uc0J1aWxkZXIgfSBmcm9tICcuLi9zaGFyZWRPcHRpb25zQnVpbGRlci5qcyc7XG5cbmNvbnN0IGJ1aWxkZXIgPSB7fSBhcyBjb25zdDtcblxudHlwZSBUeXBlQ2hlY2tDb21tYW5kT3B0aW9ucyA9IEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIGJ1aWxkZXIgJiB0eXBlb2Ygc2hhcmVkT3B0aW9uc0J1aWxkZXI+O1xuZXhwb3J0IHR5cGUgVHlwZUNoZWNrQ29tbWFuZEFyZ3YgPSBBcmd1bWVudHNDYW1lbENhc2U8VHlwZUNoZWNrQ29tbWFuZE9wdGlvbnM+O1xuXG5leHBvcnQgY29uc3QgdHlwZUNoZWNrQ29tbWFuZDogQ29tbWFuZE1vZHVsZTx1bmtub3duLCBUeXBlQ2hlY2tDb21tYW5kT3B0aW9ucz4gPSB7XG4gIGNvbW1hbmQ6ICd0eXBlY2hlY2snLFxuICBkZXNjcmliZTogJ1J1biB0eXBlIGNoZWNraW5nLiAuZW52IGZpbGVzIGFyZSBpZ25vcmVkLicsXG4gIGJ1aWxkZXIsXG4gIGFzeW5jIGhhbmRsZXIoYXJndikge1xuICAgIHByb2Nlc3MuZXhpdChhd2FpdCB0eXBlQ2hlY2soYXJndikpO1xuICB9LFxufTtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHR5cGVDaGVjayhhcmd2OiBUeXBlQ2hlY2tDb21tYW5kQXJndik6IFByb21pc2U8bnVtYmVyPiB7XG4gIGNvbnN0IHByb2plY3RzID0gYXdhaXQgZmluZERlc2NlbmRhbnRQcm9qZWN0cyhhcmd2LCBmYWxzZSk7XG4gIGlmICghcHJvamVjdHMpIHtcbiAgICBjb25zb2xlLmVycm9yKGNoYWxrLnJlZCgnTm8gcHJvamVjdCBmb3VuZC4nKSk7XG4gICAgcmV0dXJuIDE7XG4gIH1cblxuICBsZXQgcmVtb3ZlZE5leHREaXIgPSBmYWxzZSBhcyBib29sZWFuO1xuICBjb25zdCBwcm9taXNlcyA9IHByb2plY3RzLmRlc2NlbmRhbnRzLm1hcChhc3luYyAocHJvamVjdCkgPT4ge1xuICAgIGNvbnN0IGNvbW1hbmRzOiBzdHJpbmdbXSA9IFtdO1xuICAgIGlmICghcHJvamVjdC5wYWNrYWdlSnNvbi53b3Jrc3BhY2VzIHx8IHByb2plY3QuaGFzU291cmNlQ29kZSkge1xuICAgICAgY29tbWFuZHMucHVzaCguLi5idWlsZFR5cGVTY3JpcHRUeXBlQ2hlY2tDb21tYW5kcyhwcm9qZWN0KSk7XG4gICAgfVxuICAgIGlmICghcHJvamVjdC5wYWNrYWdlSnNvbi53b3Jrc3BhY2VzICYmIHByb2plY3QuaGFzT3duRGVwZW5kZW5jeSgncHlyaWdodCcpKSB7XG4gICAgICBjb21tYW5kcy5wdXNoKCdZQVJOIHB5cmlnaHQnKTtcbiAgICB9XG4gICAgd2hpbGUgKGNvbW1hbmRzLmxlbmd0aCA+IDApIHtcbiAgICAgIGNvbnN0IGV4aXRDb2RlID0gYXdhaXQgcnVuV2l0aFNwYXduSW5QYXJhbGxlbChjb21tYW5kcy5qb2luKCcgJiYgJyksIHByb2plY3QsIGFyZ3YsIHtcbiAgICAgICAgLy8gRGlzYWJsZSBpbnRlcmFjdGl2ZSBtb2RlXG4gICAgICAgIGNpOiBwcm9qZWN0cy5kZXNjZW5kYW50cy5sZW5ndGggPiAxLFxuICAgICAgICBleGl0SWZGYWlsZWQ6IGZhbHNlLFxuICAgICAgICBwcmVzZXJ2ZUNvbG9yOiB0cnVlLFxuICAgICAgfSk7XG5cbiAgICAgIC8vIFJlLXRyeSB0eXBlIGNoZWNraW5nIGFmdGVyIHJlbW92aW5nIGAubmV4dGAgZGlyZWN0b3J5XG4gICAgICBjb25zdCBuZXh0RGlyUGF0aCA9IHBhdGguam9pbihwcm9qZWN0LmRpclBhdGgsICcubmV4dCcpO1xuICAgICAgaWYgKGV4aXRDb2RlICYmIGZzLmV4aXN0c1N5bmMobmV4dERpclBhdGgpKSB7XG4gICAgICAgIGZzLnJtU3luYyhuZXh0RGlyUGF0aCwgeyBmb3JjZTogdHJ1ZSwgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICAgICAgICBjb25zb2xlLmluZm8oY2hhbGsueWVsbG93KCdSZW1vdmVkIGAubmV4dGAgZGlyZWN0b3J5LiBXZSB3aWxsIHJlLXRyeSB0eXBlIGNoZWNraW5nLicpKTtcbiAgICAgICAgcmVtb3ZlZE5leHREaXIgPSB0cnVlO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGV4aXRDb2RlO1xuICAgIH1cbiAgfSk7XG4gIGNvbnN0IGV4aXRDb2RlcyA9IGF3YWl0IFByb21pc2UuYWxsKHByb21pc2VzKTtcbiAgbGV0IGZpbmFsRXhpdENvZGUgPSAwO1xuICBmb3IgKGNvbnN0IFtpLCBleGl0Q29kZV0gb2YgZXhpdENvZGVzLmVudHJpZXMoKSkge1xuICAgIGlmIChleGl0Q29kZSkge1xuICAgICAgY29uc3QgZGVwcyA9IHByb2plY3RzLmRlc2NlbmRhbnRzW2ldPy5wYWNrYWdlSnNvbi5kZXBlbmRlbmNpZXMgPz8ge307XG4gICAgICBpZiAoZGVwcy5ibGl0eikge1xuICAgICAgICBjb25zb2xlLmluZm8oY2hhbGsueWVsbG93KCdQbGVhc2UgdHJ5IFwieWFybiBnZW4tY29kZVwiIGlmIHlvdSBmYWNlIHVua25vd24gdHlwZSBlcnJvcnMuJykpO1xuICAgICAgfVxuICAgICAgZmluYWxFeGl0Q29kZSA9IGV4aXRDb2RlO1xuICAgIH1cbiAgfVxuICBpZiAoIWZpbmFsRXhpdENvZGUpXG4gICAgY29uc29sZS5pbmZvKFxuICAgICAgY2hhbGsuZ3JlZW4oXG4gICAgICAgIHJlbW92ZWROZXh0RGlyXG4gICAgICAgICAgPyAnLS0tLS1cXG5ObyB0eXBlIGVycm9ycyBmb3VuZC4gUGxlYXNlIGlnbm9yZSB0aGUgcHJldmlvdXMgdHlwZSBlcnJvcnMsIGFzIHRoZXkgd2VyZSBjYXVzZWQgYnkgb3V0ZGF0ZWQgTmV4dC5qcyBjYWNoZSBmaWxlcy4nXG4gICAgICAgICAgOiAnTm8gdHlwZSBlcnJvcnMgZm91bmQuJ1xuICAgICAgKVxuICAgICk7XG4gIHJldHVybiBmaW5hbEV4aXRDb2RlO1xufVxuXG5mdW5jdGlvbiBidWlsZFR5cGVTY3JpcHRUeXBlQ2hlY2tDb21tYW5kcyhwcm9qZWN0OiBQcm9qZWN0KTogc3RyaW5nW10ge1xuICAvLyBUeXBlU2NyaXB0IDcgc2hpcHMgdGhlIG5hdGl2ZSBjb21waWxlciBhcyBgdHlwZXNjcmlwdGAgKGB0c2NgKTsgd2JmeSByZW1vdmVzIHRoZVxuICAvLyBgQHR5cGVzY3JpcHQvbmF0aXZlLXByZXZpZXdgICh0c2dvKSBwcmV2aWV3IGZyb20gbm9uLU5leHQuanMgcmVwb3MgKE5leHQuanMtZmFtaWx5XG4gIC8vIHJlcG9zIGtlZXAgaXQgZm9yIGBuZXh0IGJ1aWxkYCksIHNvIHJlcG9zIHN0aWxsIG9uIHRoZSBwcmV2aWV3IHNob3VsZCBydW4gd2JmeVxuICAvLyBpbnN0ZWFkIG9mIHJlbHlpbmcgb24gYSB0c2dvIGZhbGxiYWNrIGhlcmUuXG4gIGlmIChwcm9qZWN0Lmhhc093bkRlcGVuZGVuY3koJ3R5cGVzY3JpcHQnKSkge1xuICAgIHJldHVybiBbJ0JVTiB0c2MgLS1ub0VtaXQnXTtcbiAgfVxuICByZXR1cm4gW107XG59XG5cbmV4cG9ydCBjb25zdCB0Y0NvbW1hbmQ6IENvbW1hbmRNb2R1bGU8dW5rbm93biwgVHlwZUNoZWNrQ29tbWFuZE9wdGlvbnM+ID0ge1xuICAuLi50eXBlQ2hlY2tDb21tYW5kLFxuICBjb21tYW5kOiAndGMnLFxufTtcbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB7IHNwYXduQXN5bmMgfSBmcm9tICdAd2lsbGJvb3N0ZXIvc2hhcmVkLWxpYi1ub2RlL3NyYyc7XG5pbXBvcnQgY2hhbGsgZnJvbSAnY2hhbGsnO1xuaW1wb3J0IHR5cGUgeyBBcmd1bWVudHNDYW1lbENhc2UsIENvbW1hbmRNb2R1bGUsIEluZmVycmVkT3B0aW9uVHlwZXMgfSBmcm9tICd5YXJncyc7XG5cbmltcG9ydCB0eXBlIHsgUHJvamVjdCB9IGZyb20gJy4uL3Byb2plY3QuanMnO1xuaW1wb3J0IHsgZmluZFJvb3RBbmRTZWxmUHJvamVjdHMsIGZpbmRTZWxmUHJvamVjdCB9IGZyb20gJy4uL3Byb2plY3QuanMnO1xuaW1wb3J0IHsgY29uZmlndXJlRW52IH0gZnJvbSAnLi4vc2NyaXB0cy9ydW4uanMnO1xuaW1wb3J0IHR5cGUgeyBzaGFyZWRPcHRpb25zQnVpbGRlciB9IGZyb20gJy4uL3NoYXJlZE9wdGlvbnNCdWlsZGVyLmpzJztcblxuaW1wb3J0IHsgbGludCwgdHlwZSBMaW50Q29tbWFuZEFyZ3YgfSBmcm9tICcuL2xpbnQuanMnO1xuaW1wb3J0IHsgdGVzdCwgdHlwZSBUZXN0Q29tbWFuZEFyZ3YsIHdpdGhEZWZhdWx0VGVzdENhc2NhZGVFbnYgfSBmcm9tICcuL3Rlc3QuanMnO1xuaW1wb3J0IHsgdHlwZUNoZWNrLCB0eXBlIFR5cGVDaGVja0NvbW1hbmRBcmd2IH0gZnJvbSAnLi90eXBlY2hlY2suanMnO1xuXG5jb25zdCBidWlsZGVyID0ge1xuICBmdWxsOiB7XG4gICAgdHlwZTogJ2Jvb2xlYW4nLFxuICAgIGRlZmF1bHQ6IGZhbHNlLFxuICAgIGRlc2NyaWJlOiAnUnVuIHRlc3RzIGFmdGVyIHZlcmlmeWluZyBwcm9qZWN0IGNvZGUnLFxuICB9LFxufSBhcyBjb25zdDtcblxudHlwZSBWZXJpZnlDb2RlQ29tbWFuZE9wdGlvbnMgPSBJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBidWlsZGVyICYgdHlwZW9mIHNoYXJlZE9wdGlvbnNCdWlsZGVyPjtcbnR5cGUgVmVyaWZ5Q29kZUNvbW1hbmRBcmd2ID0gQXJndW1lbnRzQ2FtZWxDYXNlPFZlcmlmeUNvZGVDb21tYW5kT3B0aW9ucz47XG50eXBlIFBhY2thZ2VDb21tYW5kQXJndiA9IFBpY2s8VmVyaWZ5Q29kZUNvbW1hbmRBcmd2LCAnZHJ5UnVuJyB8ICd2ZXJib3NlJz47XG5cbmV4cG9ydCBjb25zdCB2ZXJpZnlDb2RlQ29tbWFuZDogQ29tbWFuZE1vZHVsZTx1bmtub3duLCBWZXJpZnlDb2RlQ29tbWFuZE9wdGlvbnM+ID0ge1xuICBjb21tYW5kOiAndmVyaWZ5JyxcbiAgZGVzY3JpYmU6ICdWZXJpZnkgcHJvamVjdCBjb2RlJyxcbiAgYnVpbGRlcixcbiAgYXN5bmMgaGFuZGxlcihhcmd2KSB7XG4gICAgY29uc3QgcHJvamVjdHMgPSBmaW5kUm9vdEFuZFNlbGZQcm9qZWN0cyhhcmd2LCBmYWxzZSk7XG4gICAgaWYgKCFwcm9qZWN0cykge1xuICAgICAgY29uc29sZS5lcnJvcihjaGFsay5yZWQoJ05vIHByb2plY3QgZm91bmQuJykpO1xuICAgICAgcHJvY2Vzcy5leGl0KDEpO1xuICAgIH1cblxuICAgIGF3YWl0IChhcmd2LmZ1bGwgPyB2ZXJpZnlDb2RlRnVsbHkocHJvamVjdHMuc2VsZiwgYXJndikgOiB2ZXJpZnlDb2RlKHByb2plY3RzLnNlbGYsIGFyZ3YpKTtcbiAgfSxcbn07XG5cbmFzeW5jIGZ1bmN0aW9uIHZlcmlmeUNvZGVGdWxseShwcm9qZWN0OiBQcm9qZWN0LCBhcmd2OiBWZXJpZnlDb2RlQ29tbWFuZEFyZ3YpOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgcmVwb3J0ZXIgPSBzdGFydFZlcmlmeUZ1bGxSZXBvcnRlcihwcm9qZWN0KTtcbiAgdHJ5IHtcbiAgICBhd2FpdCB2ZXJpZnlDb2RlKHByb2plY3QsIGFyZ3YpO1xuICAgIGF3YWl0IHJ1blByb2plY3RUZXN0KHByb2plY3QsIGFyZ3YpO1xuICAgIHJlcG9ydGVyLnN1Y2NlZWQoKTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICByZXBvcnRlci5mYWlsKGVycm9yKTtcbiAgICB0aHJvdyBlcnJvcjtcbiAgfSBmaW5hbGx5IHtcbiAgICByZXBvcnRlci5maW5pc2goKTtcbiAgfVxufVxuXG5hc3luYyBmdW5jdGlvbiB2ZXJpZnlDb2RlKHByb2plY3Q6IFByb2plY3QsIGFyZ3Y6IFZlcmlmeUNvZGVDb21tYW5kQXJndik6IFByb21pc2U8dm9pZD4ge1xuICBhd2FpdCBydW5QYWNrYWdlQ29tbWFuZChgJHtwcm9qZWN0LnBhY2thZ2VNYW5hZ2VyQ29tbWFuZH0gaW5zdGFsbGAsIHByb2plY3QsIGFyZ3YpO1xuICBpZiAocHJvamVjdC5wYWNrYWdlSnNvbi5zY3JpcHRzPy5bJ2dlbi1jb2RlJ10pIHtcbiAgICBhd2FpdCBydW5QYWNrYWdlQ29tbWFuZChgJHtwcm9qZWN0LnBhY2thZ2VNYW5hZ2VyQ29tbWFuZH0gZ2VuLWNvZGVgLCBwcm9qZWN0LCBhcmd2KTtcbiAgfVxuICBhd2FpdCBydW5JblByb2Nlc3NDb21tYW5kKFxuICAgICdjbGVhbnVwJyxcbiAgICAoKSA9PlxuICAgICAgbGludCh7XG4gICAgICAgIC4uLmFyZ3YsXG4gICAgICAgIF86IFsnbGludCddLFxuICAgICAgICBmaXg6IHRydWUsXG4gICAgICAgIGZvcm1hdDogdHJ1ZSxcbiAgICAgICAgc2lsZW50OiB0cnVlLFxuICAgICAgfSBhcyB1bmtub3duIGFzIExpbnRDb21tYW5kQXJndiksXG4gICAgeyBzaWxlbnQ6IHRydWUgfVxuICApO1xuICAvLyBUeXBlLWF3YXJlIGxpbnQgcmVwb3J0cyBUeXBlU2NyaXB0IGRpYWdub3N0aWNzIG9ubHkgZm9yIHRoZSBmaWxlcyBveGxpbnQgYWN0dWFsbHkgbGludHMsIGFuZFxuICAvLyB0aGUgc2hhcmVkIGNvbmZpZyBpZ25vcmVzIGRpcmVjdG9yaWVzIHRzYyBzdGlsbCBjb21waWxlcyAoZS5nLiBgX19nZW5lcmF0ZWRfX2AsIGBAdHlwZXNgLFxuICAvLyBgZGlzdGApLiBLZWVwIHRoZSB0eXBlY2hlY2sgY29tbWFuZCBzbyBgdmVyaWZ5YCBzdGF5cyBlcXVpdmFsZW50IHRvIFwidGhlIHJlcG9zaXRvcnkgY29tcGlsZXNcIi5cbiAgLy8gVGhlIG92ZXJsYXAgd2l0aCBsaW50IGlzIGRlbGliZXJhdGU6IGAtLXR5cGUtYXdhcmVgIGFsc28gcG93ZXJzIHR5cGUtYXdhcmUgbGludCBydWxlcywgYW5kXG4gIC8vIGRyb3BwaW5nIG9ubHkgYC0tdHlwZS1jaGVja2AgZnJvbSBsaW50IHNhdmVzIH4wLjFzLCBmYXIgbGVzcyB0aGFuIHRoZSBjb3ZlcmFnZSBpdCB3b3VsZCBjb3N0LlxuICBhd2FpdCBydW5JblByb2Nlc3NDb21tYW5kKFxuICAgICd0eXBlY2hlY2snLFxuICAgICgpID0+IHR5cGVDaGVjayh7IC4uLmFyZ3YsIF86IFsndHlwZWNoZWNrJ10gfSBhcyB1bmtub3duIGFzIFR5cGVDaGVja0NvbW1hbmRBcmd2KSxcbiAgICB7IHNpbGVudDogdHJ1ZSB9XG4gICk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHJ1blByb2plY3RUZXN0KHByb2plY3Q6IFByb2plY3QsIGFyZ3Y6IFZlcmlmeUNvZGVDb21tYW5kQXJndik6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCB0ZXN0QXJndiA9IHdpdGhEZWZhdWx0VGVzdENhc2NhZGVFbnYoe1xuICAgIC4uLmFyZ3YsXG4gICAgXzogWyd0ZXN0J10sXG4gICAgZTJlOiAnaGVhZGxlc3MnLFxuICAgIHNpbGVudDogdHJ1ZSxcbiAgfSBhcyB1bmtub3duIGFzIFRlc3RDb21tYW5kQXJndik7XG4gIGNvbnN0IGV4aXRDb2RlID0gYXdhaXQgdGVzdCh0ZXN0QXJndiwgeyBleGl0SWZGYWlsZWQ6IGZhbHNlIH0pO1xuICBpZiAoZXhpdENvZGUgPT09IDApIHJldHVybjtcblxuICBpZiAoIXByb2plY3QucGFja2FnZUpzb24uc2NyaXB0cz8uWydkYi1yZXNldCddKSB7XG4gICAgY29uc29sZS5pbmZvKGNoYWxrLnJlZChjaGFsay5ib2xkKGBGYWlsZWQgKGV4aXQgY29kZSAke2V4aXRDb2RlfSk6YCksICd0ZXN0JykpO1xuICAgIHByb2Nlc3MuZXhpdChleGl0Q29kZSk7XG4gIH1cblxuICBjb25zb2xlLmluZm8oXG4gICAgY2hhbGsueWVsbG93KCdUZXN0cyBmYWlsZWQuIFRoaXMgcHJvamVjdCBkZWZpbmVzIFwiZGItcmVzZXRcIiwgc28gd2Igd2lsbCByZXNldCB0aGUgZGF0YWJhc2Ugb25jZSBhbmQgcmV0cnkgdGVzdHMuJylcbiAgKTtcbiAgYXdhaXQgcnVuUGFja2FnZUNvbW1hbmQoYCR7cHJvamVjdC5wYWNrYWdlTWFuYWdlckNvbW1hbmR9IGRiLXJlc2V0YCwgZmluZFRlc3RQcm9qZWN0KHByb2plY3QsIHRlc3RBcmd2KSwgdGVzdEFyZ3YsIHtcbiAgICBwcmludFJhd091dHB1dDogdHJ1ZSxcbiAgfSk7XG5cbiAgY29uc3QgcmV0cnlFeGl0Q29kZSA9IGF3YWl0IHRlc3QodGVzdEFyZ3YsIHsgZXhpdElmRmFpbGVkOiBmYWxzZSB9KTtcbiAgaWYgKHJldHJ5RXhpdENvZGUgIT09IDApIHtcbiAgICBjb25zb2xlLmluZm8oY2hhbGsucmVkKGNoYWxrLmJvbGQoYEZhaWxlZCAoZXhpdCBjb2RlICR7cmV0cnlFeGl0Q29kZX0pOmApLCAndGVzdCBhZnRlciBkYi1yZXNldCByZXRyeScpKTtcbiAgICBwcm9jZXNzLmV4aXQocmV0cnlFeGl0Q29kZSk7XG4gIH1cbiAgY29uc29sZS5pbmZvKGNoYWxrLmdyZWVuKCdUZXN0cyBwYXNzZWQgYWZ0ZXIgZGItcmVzZXQgcmV0cnkuJykpO1xufVxuXG5mdW5jdGlvbiBmaW5kVGVzdFByb2plY3QocHJvamVjdDogUHJvamVjdCwgYXJndjogVGVzdENvbW1hbmRBcmd2KTogUHJvamVjdCB7XG4gIGNvbnN0IHRlc3RQcm9qZWN0ID0gZmluZFNlbGZQcm9qZWN0KGFyZ3YsIHRydWUsIHByb2plY3QuZGlyUGF0aCk7XG4gIGlmICghdGVzdFByb2plY3QpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYFByb2plY3Qgbm90IGZvdW5kOiAke3Byb2plY3QuZGlyUGF0aH1gKTtcbiAgfVxuICByZXR1cm4gdGVzdFByb2plY3Q7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHJ1bkluUHJvY2Vzc0NvbW1hbmQoXG4gIGNvbW1hbmROYW1lOiBzdHJpbmcsXG4gIGNvbW1hbmQ6ICgpID0+IFByb21pc2U8bnVtYmVyIHwgdW5kZWZpbmVkPixcbiAgb3B0aW9uczogeyBhbGxvd0ZhaWx1cmU/OiBib29sZWFuOyBzaWxlbnQ/OiBib29sZWFuIH0gPSB7fVxuKTogUHJvbWlzZTxudW1iZXI+IHtcbiAgaWYgKCFvcHRpb25zLnNpbGVudCkge1xuICAgIGNvbnNvbGUuaW5mbygnXFxuJyArIGNoYWxrLmN5YW4oY2hhbGsuYm9sZCgnU3RhcnQ6JyksIGNvbW1hbmROYW1lKSk7XG4gIH1cbiAgY29uc3QgZXhpdENvZGUgPSAoYXdhaXQgY29tbWFuZCgpKSA/PyAwO1xuICBpZiAoZXhpdENvZGUgPT09IDAgfHwgb3B0aW9ucy5hbGxvd0ZhaWx1cmUpIHtcbiAgICBpZiAoIW9wdGlvbnMuc2lsZW50KSB7XG4gICAgICBjb25zb2xlLmluZm8oY2hhbGsuZ3JlZW4oY2hhbGsuYm9sZCgnRmluaXNoZWQ6JyksIGNvbW1hbmROYW1lKSk7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIGNvbnNvbGUuaW5mbyhjaGFsay5yZWQoY2hhbGsuYm9sZChgRmFpbGVkIChleGl0IGNvZGUgJHtleGl0Q29kZX0pOmApLCBjb21tYW5kTmFtZSkpO1xuICAgIHByb2Nlc3MuZXhpdChleGl0Q29kZSk7XG4gIH1cbiAgcmV0dXJuIGV4aXRDb2RlO1xufVxuXG5hc3luYyBmdW5jdGlvbiBydW5QYWNrYWdlQ29tbWFuZChcbiAgY29tbWFuZDogc3RyaW5nLFxuICBwcm9qZWN0OiBQcm9qZWN0LFxuICBhcmd2OiBQYWNrYWdlQ29tbWFuZEFyZ3YsXG4gIG9wdGlvbnM6IHsgYWxsb3dGYWlsdXJlPzogYm9vbGVhbjsgcHJpbnRSYXdPdXRwdXQ/OiBib29sZWFuIH0gPSB7fVxuKTogUHJvbWlzZTxudW1iZXI+IHtcbiAgcHJpbnRDb21tYW5kKGNvbW1hbmQsIHByb2plY3QuZGlyUGF0aCk7XG4gIGlmIChhcmd2LmRyeVJ1bikge1xuICAgIHJldHVybiAwO1xuICB9XG5cbiAgY29uc3QgcmV0ID0gYXdhaXQgc3Bhd25Bc3luYyhjb21tYW5kLCB1bmRlZmluZWQsIHtcbiAgICBjd2Q6IHByb2plY3QuZGlyUGF0aCxcbiAgICBlbnY6IGNvbmZpZ3VyZUVudihwcm9qZWN0LmVudiwgeyBwcmVzZXJ2ZUNvbG9yOiBmYWxzZSB9KSxcbiAgICBzaGVsbDogdHJ1ZSxcbiAgICBzdGRpbzogJ3BpcGUnLFxuICAgIG1lcmdlT3V0QW5kRXJyb3I6IHRydWUsXG4gICAga2lsbE9uRXhpdDogdHJ1ZSxcbiAgICBwcmludGluZ1N0ZG91dDogb3B0aW9ucy5wcmludFJhd091dHB1dCxcbiAgICBwcmludGluZ1N0ZGVycjogb3B0aW9ucy5wcmludFJhd091dHB1dCxcbiAgICB2ZXJib3NlOiBhcmd2LnZlcmJvc2UsXG4gIH0pO1xuICBjb25zdCBleGl0Q29kZSA9IHJldC5zdGF0dXMgPz8gMTtcbiAgaWYgKCFvcHRpb25zLnByaW50UmF3T3V0cHV0KSB7XG4gICAgcHJpbnRQYWNrYWdlQ29tbWFuZE91dHB1dChjb21tYW5kLCBleGl0Q29kZSwgcmV0LnN0ZG91dCk7XG4gIH1cblxuICBpZiAoZXhpdENvZGUgIT09IDAgJiYgIW9wdGlvbnMuYWxsb3dGYWlsdXJlKSB7XG4gICAgY29uc29sZS5pbmZvKGNoYWxrLnJlZChjaGFsay5ib2xkKGBGYWlsZWQgKGV4aXQgY29kZSAke2V4aXRDb2RlfSk6YCksIGNvbW1hbmQpKTtcbiAgICBwcm9jZXNzLmV4aXQoZXhpdENvZGUpO1xuICB9XG4gIHJldHVybiBleGl0Q29kZTtcbn1cblxuLyoqXG4gKiBQcmludHMgcGFja2FnZSBjb21tYW5kIG91dHB1dCBmb3IgYHdiIHZlcmlmeWAuXG4gKlxuICogYHdiIHZlcmlmeWAgaXMgcHJpbWFyaWx5IGNvbnN1bWVkIGJ5IEFJIGNvZGluZyBhZ2VudHMsIHNvIHN1Y2Nlc3NmdWwgbm9pc3lcbiAqIGNvbW1hbmRzIGFyZSBzdW1tYXJpemVkIHdoaWxlIGZhaWx1cmUgb3V0cHV0IHJlbWFpbnMgYXZhaWxhYmxlIGZvciBkaWFnbm9zaXMuXG4gKlxuICogQHBhcmFtIGNvbW1hbmQgVGhlIGV4ZWN1dGVkIGNvbW1hbmQuXG4gKiBAcGFyYW0gZXhpdENvZGUgVGhlIGNvbW1hbmQgZXhpdCBjb2RlLlxuICogQHBhcmFtIG91dHB1dCBUaGUgbWVyZ2VkIHN0ZG91dCBhbmQgc3RkZXJyIG91dHB1dCBmcm9tIHRoZSBjb21tYW5kLlxuICovXG5mdW5jdGlvbiBwcmludFBhY2thZ2VDb21tYW5kT3V0cHV0KGNvbW1hbmQ6IHN0cmluZywgZXhpdENvZGU6IG51bWJlciwgb3V0cHV0OiBzdHJpbmcpOiB2b2lkIHtcbiAgaWYgKGV4aXRDb2RlID09PSAwICYmIC9eKD86YnVufHlhcm4pICg/Omluc3RhbGx8Z2VuLWNvZGUpJC91LnRlc3QoY29tbWFuZCkpIHtcbiAgICBjb25zb2xlLmluZm8oY2hhbGsuZ3JlZW4oJ1N1Y2NlZWRlZC4nKSk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgY29uc3QgdHJpbW1lZE91dHB1dCA9IG91dHB1dC50cmltKCk7XG4gIGlmICh0cmltbWVkT3V0cHV0KSB7XG4gICAgcHJvY2Vzcy5zdGRvdXQud3JpdGUodHJpbW1lZE91dHB1dCk7XG4gICAgcHJvY2Vzcy5zdGRvdXQud3JpdGUoJ1xcbicpO1xuICB9XG59XG5cbmZ1bmN0aW9uIHByaW50Q29tbWFuZChjb21tYW5kOiBzdHJpbmcsIGN3ZDogc3RyaW5nKTogdm9pZCB7XG4gIGNvbnNvbGUuaW5mbygnXFxuJyArIGNoYWxrLmN5YW4oY2hhbGsuYm9sZCgnQ29tbWFuZDonKSwgY29tbWFuZCkgKyBjaGFsay5ncmF5KGAgYXQgJHtjd2R9YCkpO1xufVxuXG5mdW5jdGlvbiBzdGFydFZlcmlmeUZ1bGxSZXBvcnRlcihwcm9qZWN0OiBQcm9qZWN0KToge1xuICBmYWlsOiAoZXJyb3I/OiB1bmtub3duKSA9PiB2b2lkO1xuICBmaW5pc2g6ICgpID0+IHZvaWQ7XG4gIHN1Y2NlZWQ6ICgpID0+IHZvaWQ7XG59IHtcbiAgY29uc3Qgc3RhcnRlZEF0ID0gRGF0ZS5ub3coKTtcbiAgY29uc3Qgd2JEaXJQYXRoID0gcGF0aC5qb2luKHByb2plY3QuZGlyUGF0aCwgJy53YicpO1xuICBmcy5ta2RpclN5bmMod2JEaXJQYXRoLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcblxuICBjb25zdCBsb2dGaWxlUGF0aCA9IHBhdGguam9pbih3YkRpclBhdGgsICd2ZXJpZnktZnVsbC5sb2cnKTtcbiAgY29uc3QgbG9nRmlsZSA9IGZzLm9wZW5TeW5jKGxvZ0ZpbGVQYXRoLCAndycpO1xuICBjb25zdCBvcmlnaW5hbFN0ZG91dFdyaXRlID0gcHJvY2Vzcy5zdGRvdXQud3JpdGUuYmluZChwcm9jZXNzLnN0ZG91dCk7XG4gIGNvbnN0IG9yaWdpbmFsU3RkZXJyV3JpdGUgPSBwcm9jZXNzLnN0ZGVyci53cml0ZS5iaW5kKHByb2Nlc3Muc3RkZXJyKTtcbiAgbGV0IHN1Y2NlZWRlZCA9IGZhbHNlO1xuICBsZXQgZmluaXNoZWQgPSBmYWxzZTtcblxuICBwcm9jZXNzLnN0ZG91dC53cml0ZSA9IHRlZVdyaXRlKG9yaWdpbmFsU3Rkb3V0V3JpdGUsIGxvZ0ZpbGUpIGFzIHR5cGVvZiBwcm9jZXNzLnN0ZG91dC53cml0ZTtcbiAgcHJvY2Vzcy5zdGRlcnIud3JpdGUgPSB0ZWVXcml0ZShvcmlnaW5hbFN0ZGVycldyaXRlLCBsb2dGaWxlKSBhcyB0eXBlb2YgcHJvY2Vzcy5zdGRlcnIud3JpdGU7XG4gIGNvbnNvbGUuaW5mbyhjaGFsay5jeWFuKGNoYWxrLmJvbGQoJ0Z1bGwgbG9nOicpLCBsb2dGaWxlUGF0aCkpO1xuXG4gIGNvbnN0IGZpbmlzaCA9ICgpOiB2b2lkID0+IHtcbiAgICBpZiAoZmluaXNoZWQpIHJldHVybjtcbiAgICBmaW5pc2hlZCA9IHRydWU7XG5cbiAgICBwcm9jZXNzLnN0ZG91dC53cml0ZSA9IG9yaWdpbmFsU3Rkb3V0V3JpdGUgYXMgdHlwZW9mIHByb2Nlc3Muc3Rkb3V0LndyaXRlO1xuICAgIHByb2Nlc3Muc3RkZXJyLndyaXRlID0gb3JpZ2luYWxTdGRlcnJXcml0ZSBhcyB0eXBlb2YgcHJvY2Vzcy5zdGRlcnIud3JpdGU7XG5cbiAgICBjb25zdCBlbGFwc2VkVGltZSA9IGZvcm1hdEVsYXBzZWRUaW1lKERhdGUubm93KCkgLSBzdGFydGVkQXQpO1xuICAgIGNvbnN0IHN0YXR1cyA9IHN1Y2NlZWRlZCA/ICdTdWNjZWVkZWQnIDogJ0ZhaWxlZCc7XG4gICAgY29uc3Qgc3VtbWFyeSA9IGAke3N0YXR1c30gaW4gJHtlbGFwc2VkVGltZX0uIEZ1bGwgbG9nOiAke2xvZ0ZpbGVQYXRofVxcbmA7XG4gICAgY29uc3QgY29sb3JlZFN1bW1hcnkgPSBzdWNjZWVkZWQgPyBjaGFsay5ncmVlbihzdW1tYXJ5KSA6IGNoYWxrLnJlZChzdW1tYXJ5KTtcbiAgICBvcmlnaW5hbFN0ZG91dFdyaXRlKGNvbG9yZWRTdW1tYXJ5KTtcbiAgICBmcy53cml0ZVN5bmMobG9nRmlsZSwgc3VtbWFyeSk7XG4gICAgZnMuY2xvc2VTeW5jKGxvZ0ZpbGUpO1xuICB9O1xuXG4gIHByb2Nlc3Mub25jZSgnZXhpdCcsIGZpbmlzaCk7XG5cbiAgcmV0dXJuIHtcbiAgICBmYWlsOiAoZXJyb3IpID0+IHtcbiAgICAgIHN1Y2NlZWRlZCA9IGZhbHNlO1xuICAgICAgaWYgKGVycm9yKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoZXJyb3IpO1xuICAgICAgfVxuICAgIH0sXG4gICAgZmluaXNoOiAoKSA9PiB7XG4gICAgICBwcm9jZXNzLnJlbW92ZUxpc3RlbmVyKCdleGl0JywgZmluaXNoKTtcbiAgICAgIGZpbmlzaCgpO1xuICAgIH0sXG4gICAgc3VjY2VlZDogKCkgPT4ge1xuICAgICAgc3VjY2VlZGVkID0gdHJ1ZTtcbiAgICB9LFxuICB9O1xufVxuXG5mdW5jdGlvbiB0ZWVXcml0ZShvcmlnaW5hbFdyaXRlOiB0eXBlb2YgcHJvY2Vzcy5zdGRvdXQud3JpdGUsIGxvZ0ZpbGU6IG51bWJlcik6IHR5cGVvZiBwcm9jZXNzLnN0ZG91dC53cml0ZSB7XG4gIHJldHVybiAoKFxuICAgIGNodW5rOiBVaW50OEFycmF5IHwgc3RyaW5nLFxuICAgIGVuY29kaW5nT3JDYWxsYmFjaz86IEJ1ZmZlckVuY29kaW5nIHwgKChlcnJvcj86IEVycm9yIHwgbnVsbCkgPT4gdm9pZCksXG4gICAgY2FsbGJhY2s/OiAoZXJyb3I/OiBFcnJvciB8IG51bGwpID0+IHZvaWRcbiAgKSA9PiB7XG4gICAgY29uc3QgYnVmZmVyID1cbiAgICAgIHR5cGVvZiBjaHVuayA9PT0gJ3N0cmluZydcbiAgICAgICAgPyBCdWZmZXIuZnJvbShjaHVuaywgdHlwZW9mIGVuY29kaW5nT3JDYWxsYmFjayA9PT0gJ3N0cmluZycgPyBlbmNvZGluZ09yQ2FsbGJhY2sgOiAndXRmOCcpXG4gICAgICAgIDogY2h1bms7XG4gICAgZnMud3JpdGVTeW5jKGxvZ0ZpbGUsIGJ1ZmZlcik7XG4gICAgLy8gV3JpdGUgdG8gdGhlIHRlcm1pbmFsIHZpYSB0aGUgb3JpZ2luYWwgc3RyZWFtIG1ldGhvZDogYSBzeW5jaHJvbm91cyBmcy53cml0ZVN5bmMgb24gdGhlXG4gICAgLy8gc3Rkb3V0L3N0ZGVyciBmZCB0aHJvd3MgRUFHQUlOIG9uIENJJ3Mgbm9uLWJsb2NraW5nIHBpcGVzIHdoZW4gbGFyZ2Ugb3V0cHV0IGZsdXNoZXMgYXQgb25jZSxcbiAgICAvLyB3aGlsZSB0aGUgc3RyZWFtIG1ldGhvZCBidWZmZXJzIGludGVybmFsbHkgYW5kIGhhbmRsZXMgYmFja3ByZXNzdXJlLlxuICAgIHJldHVybiBvcmlnaW5hbFdyaXRlKGJ1ZmZlciwgdHlwZW9mIGVuY29kaW5nT3JDYWxsYmFjayA9PT0gJ2Z1bmN0aW9uJyA/IGVuY29kaW5nT3JDYWxsYmFjayA6IGNhbGxiYWNrKTtcbiAgfSkgYXMgdHlwZW9mIHByb2Nlc3Muc3Rkb3V0LndyaXRlO1xufVxuXG5mdW5jdGlvbiBmb3JtYXRFbGFwc2VkVGltZShtaWxsaXNlY29uZHM6IG51bWJlcik6IHN0cmluZyB7XG4gIGNvbnN0IHNlY29uZHMgPSBNYXRoLnJvdW5kKG1pbGxpc2Vjb25kcyAvIDEwMDApO1xuICBjb25zdCBtaW51dGVzID0gTWF0aC5mbG9vcihzZWNvbmRzIC8gNjApO1xuICBjb25zdCByZW1haW5pbmdTZWNvbmRzID0gc2Vjb25kcyAlIDYwO1xuICBpZiAobWludXRlcyA9PT0gMCkge1xuICAgIHJldHVybiBgJHtyZW1haW5pbmdTZWNvbmRzfXNgO1xuICB9XG4gIHJldHVybiBgJHttaW51dGVzfW0gJHtyZW1haW5pbmdTZWNvbmRzfXNgO1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHsgcmVtb3ZlTnBtQW5kWWFybkVudmlyb25tZW50VmFyaWFibGVzLCB0cmVlS2lsbCB9IGZyb20gJ0B3aWxsYm9vc3Rlci9zaGFyZWQtbGliLW5vZGUvc3JjJztcbmltcG9ydCB5YXJncyBmcm9tICd5YXJncyc7XG5pbXBvcnQgeyBoaWRlQmluIH0gZnJvbSAneWFyZ3MvaGVscGVycyc7XG5cbmltcG9ydCB7IGJ1aWxkSWZOZWVkZWRDb21tYW5kIH0gZnJvbSAnLi9jb21tYW5kcy9idWlsZElmTmVlZGVkLmpzJztcbmltcG9ydCB7IGNvbmN1cnJlbnRseUNvbW1hbmQgfSBmcm9tICcuL2NvbW1hbmRzL2NvbmN1cnJlbnRseS5qcyc7XG5pbXBvcnQgeyBkZXBsb3lDb21tYW5kIH0gZnJvbSAnLi9jb21tYW5kcy9kZXBsb3kuanMnO1xuaW1wb3J0IHsgZG90ZW52Q29tbWFuZCB9IGZyb20gJy4vY29tbWFuZHMvZG90ZW52LmpzJztcbmltcG9ydCB7IGdlbkNvZGVDb21tYW5kIH0gZnJvbSAnLi9jb21tYW5kcy9nZW5Db2RlLmpzJztcbmltcG9ydCB7IGdlbkRldlZhcnNDb21tYW5kIH0gZnJvbSAnLi9jb21tYW5kcy9nZW5EZXZWYXJzLmpzJztcbmltcG9ydCB7IGtpbGxQb3J0SWZOb25DaUNvbW1hbmQgfSBmcm9tICcuL2NvbW1hbmRzL2tpbGxQb3J0SWZOb25DaS5qcyc7XG5pbXBvcnQgeyBsaW50Q29tbWFuZCB9IGZyb20gJy4vY29tbWFuZHMvbGludC5qcyc7XG5pbXBvcnQgeyBtYWludGVuYW5jZUNvbW1hbmQgfSBmcm9tICcuL2NvbW1hbmRzL21haW50ZW5hbmNlLmpzJztcbmltcG9ydCB7IG9wdGltaXplRm9yRG9ja2VyQnVpbGRDb21tYW5kIH0gZnJvbSAnLi9jb21tYW5kcy9vcHRpbWl6ZUZvckRvY2tlckJ1aWxkLmpzJztcbmltcG9ydCB7IHByaXNtYUNvbW1hbmQgfSBmcm9tICcuL2NvbW1hbmRzL3ByaXNtYS5qcyc7XG5pbXBvcnQgeyByZWxlYXNlQ29tbWFuZCB9IGZyb20gJy4vY29tbWFuZHMvcmVsZWFzZS5qcyc7XG5pbXBvcnQgeyByZXRyeUNvbW1hbmQgfSBmcm9tICcuL2NvbW1hbmRzL3JldHJ5LmpzJztcbmltcG9ydCB7IHNldHVwQ29tbWFuZCB9IGZyb20gJy4vY29tbWFuZHMvc2V0dXAuanMnO1xuaW1wb3J0IHsgc2V0dXBQcml2YXRlUGFja2FnZXNDb21tYW5kIH0gZnJvbSAnLi9jb21tYW5kcy9zZXR1cFByaXZhdGVQYWNrYWdlcy5qcyc7XG5pbXBvcnQgeyBzdGFydENvbW1hbmQgfSBmcm9tICcuL2NvbW1hbmRzL3N0YXJ0LmpzJztcbmltcG9ydCB7IHRlc3RDb21tYW5kIH0gZnJvbSAnLi9jb21tYW5kcy90ZXN0LmpzJztcbmltcG9ydCB7IHRlc3RPbkNpQ29tbWFuZCB9IGZyb20gJy4vY29tbWFuZHMvdGVzdE9uQ2kuanMnO1xuaW1wb3J0IHsgdHJlZUtpbGxDb21tYW5kIH0gZnJvbSAnLi9jb21tYW5kcy90cmVlS2lsbC5qcyc7XG5pbXBvcnQgeyB0Y0NvbW1hbmQsIHR5cGVDaGVja0NvbW1hbmQgfSBmcm9tICcuL2NvbW1hbmRzL3R5cGVjaGVjay5qcyc7XG5pbXBvcnQgeyB2ZXJpZnlDb2RlQ29tbWFuZCB9IGZyb20gJy4vY29tbWFuZHMvdmVyaWZ5Q29kZS5qcyc7XG5pbXBvcnQgeyBzaGFyZWRPcHRpb25zQnVpbGRlciB9IGZyb20gJy4vc2hhcmVkT3B0aW9uc0J1aWxkZXIuanMnO1xuXG5hd2FpdCB5YXJncyhoaWRlQmluKHByb2Nlc3MuYXJndikpXG4gIC5zY3JpcHROYW1lKCd3YicpXG4gIC5vcHRpb25zKHNoYXJlZE9wdGlvbnNCdWlsZGVyKVxuICAubWlkZGxld2FyZSgoYXJndikgPT4ge1xuICAgIGNvbnN0IHdvcmtpbmdEaXIgPSBhcmd2Wyd3b3JraW5nLWRpciddO1xuICAgIGlmICh3b3JraW5nRGlyKSB7XG4gICAgICBjb25zdCBkaXJQYXRoID0gcGF0aC5yZXNvbHZlKHdvcmtpbmdEaXIpO1xuICAgICAgcHJvY2Vzcy5jaGRpcihkaXJQYXRoKTtcbiAgICB9XG5cbiAgICBpZiAocHJvY2Vzcy5lbnYuUEFUSD8uaW5jbHVkZXMoJy9idW4tbm9kZS0nKSkge1xuICAgICAgLy8gTm90IGZpeGVkIHVwIGhlcmU6IHRvb2xzIHJlcXVpcmluZyByZWFsIE5vZGUuanMgKFBsYXl3cmlnaHQsIHdyYW5nbGVyLCB2aW5leHQpIG1heSBoYW5nIG9yXG4gICAgICAvLyBjcmFzaCB1bmRlciB0aGUgc2hpbSwgYW5kIHNvbWUgKHdyYW5nbGVyIGRldikgZmFpbCBzaWxlbnRseSwgc28gc3VyZmFjZSB0aGUgY2F1c2UgdXBmcm9udC5cbiAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgXCJXYXJuaW5nOiBQQVRIIGNvbnRhaW5zIGEgYnVuLW5vZGUgc2hpbSAoZnJvbSBgYnVuIC0tYnVuYCBvciBidW5maWcncyBgcnVuLmJ1bmApOyBcIiArXG4gICAgICAgICAgJ3J1biB3YiB3aXRob3V0IGAtLWJ1bmAgYW5kIHJlbW92ZSBgW3J1bl0gYnVuYCBmcm9tIGJ1bmZpZy50b21sLidcbiAgICAgICk7XG4gICAgfVxuXG4gICAgcmVtb3ZlTnBtQW5kWWFybkVudmlyb25tZW50VmFyaWFibGVzKHByb2Nlc3MuZW52KTtcbiAgfSlcbiAgLmNvbW1hbmQodmVyaWZ5Q29kZUNvbW1hbmQpXG4gIC5jb21tYW5kKGJ1aWxkSWZOZWVkZWRDb21tYW5kKVxuICAuY29tbWFuZChjb25jdXJyZW50bHlDb21tYW5kKVxuICAuY29tbWFuZChkZXBsb3lDb21tYW5kKVxuICAuY29tbWFuZChkb3RlbnZDb21tYW5kKVxuICAuY29tbWFuZChnZW5Db2RlQ29tbWFuZClcbiAgLmNvbW1hbmQoZ2VuRGV2VmFyc0NvbW1hbmQpXG4gIC5jb21tYW5kKGtpbGxQb3J0SWZOb25DaUNvbW1hbmQpXG4gIC5jb21tYW5kKGxpbnRDb21tYW5kKVxuICAuY29tbWFuZChtYWludGVuYW5jZUNvbW1hbmQpXG4gIC5jb21tYW5kKG9wdGltaXplRm9yRG9ja2VyQnVpbGRDb21tYW5kKVxuICAuY29tbWFuZChwcmlzbWFDb21tYW5kKVxuICAuY29tbWFuZChyZWxlYXNlQ29tbWFuZClcbiAgLmNvbW1hbmQocmV0cnlDb21tYW5kKVxuICAuY29tbWFuZChzZXR1cENvbW1hbmQpXG4gIC5jb21tYW5kKHNldHVwUHJpdmF0ZVBhY2thZ2VzQ29tbWFuZClcbiAgLmNvbW1hbmQoc3RhcnRDb21tYW5kKVxuICAuY29tbWFuZCh0ZXN0Q29tbWFuZClcbiAgLmNvbW1hbmQodGVzdE9uQ2lDb21tYW5kKVxuICAuY29tbWFuZCh0cmVlS2lsbENvbW1hbmQpXG4gIC5jb21tYW5kKHR5cGVDaGVja0NvbW1hbmQpXG4gIC5jb21tYW5kKHRjQ29tbWFuZClcbiAgLmRlbWFuZENvbW1hbmQoKVxuICAuc3RyaWN0KClcbiAgLnZlcnNpb24oZ2V0VmVyc2lvbigpKVxuICAuaGVscCgpLmFyZ3Y7XG5cbmZ1bmN0aW9uIGdldFZlcnNpb24oKTogc3RyaW5nIHtcbiAgbGV0IHBhY2thZ2VKc29uRGlyID0gcGF0aC5kaXJuYW1lKG5ldyBVUkwoaW1wb3J0Lm1ldGEudXJsKS5wYXRobmFtZSk7XG4gIHdoaWxlICghZnMuZXhpc3RzU3luYyhwYXRoLmpvaW4ocGFja2FnZUpzb25EaXIsICdwYWNrYWdlLmpzb24nKSkpIHtcbiAgICBwYWNrYWdlSnNvbkRpciA9IHBhdGguZGlybmFtZShwYWNrYWdlSnNvbkRpcik7XG4gIH1cbiAgY29uc3QgcGFja2FnZUpzb24gPSBKU09OLnBhcnNlKGZzLnJlYWRGaWxlU3luYyhwYXRoLmpvaW4ocGFja2FnZUpzb25EaXIsICdwYWNrYWdlLmpzb24nKSwgJ3V0ZjgnKSkgYXMge1xuICAgIHZlcnNpb246IHN0cmluZztcbiAgfTtcbiAgcmV0dXJuIHBhY2thZ2VKc29uLnZlcnNpb247XG59XG5cbmxldCBzaHV0dGluZ0Rvd24gPSBmYWxzZTtcbmZvciAoY29uc3Qgc2lnbmFsIG9mIFsnU0lHSU5UJywgJ1NJR1RFUk0nLCAnU0lHUVVJVCddKSB7XG4gIHByb2Nlc3Mub24oc2lnbmFsLCAoKSA9PiB7XG4gICAgaWYgKHNodXR0aW5nRG93bikgcmV0dXJuO1xuXG4gICAgc2h1dHRpbmdEb3duID0gdHJ1ZTtcbiAgICB0cnkge1xuICAgICAgdHJlZUtpbGwocHJvY2Vzcy5waWQpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBjb25zb2xlLndhcm4oYEZhaWxlZCB0byB0cmVlS2lsbCgke3Byb2Nlc3MucGlkfSkgZHVyaW5nIHNodXRkb3duOmAsIGVycm9yKTtcbiAgICB9XG4gICAgcHJvY2Vzcy5leGl0KCk7XG4gIH0pO1xufVxuIl0sInhfZ29vZ2xlX2lnbm9yZUxpc3QiOls2LDcsOCw5LDEwXSwibWFwcGluZ3MiOiIwd0JBUUEsTUFBYSxFQUE0QixDQUN2QyxJQUFLLENBQ0gsWUFBYSwyQkFDYixNQUFPLEVBQ1AsS0FBTSxPQUNSLEVBQ0EsY0FBZSxDQUNiLFlBQ0Usd0xBQ0YsS0FBTSxRQUNSLEVBQ0EsbUJBQW9CLENBQ2xCLFlBQWEsMEZBQ2IsS0FBTSxTQUNSLEVBQ0EsbUJBQW9CLENBQ2xCLFlBQWEsaUVBQ2IsS0FBTSxVQUNOLFFBQVMsRUFDWCxFQUNBLG1CQUFvQixDQUNsQixZQUFhLHFHQUNiLEtBQU0sVUFDTixRQUFTLEVBQ1gsRUFDQSxZQUFhLENBQ1gsWUFBYSxxRkFDYixLQUFNLFNBQ04sUUFBUyxjQUNYLEVBQ0EsWUFBYSxDQUNYLFlBQWEsMENBQ2IsS0FBTSxTQUNSLEVBQ0EsUUFBUyxDQUNQLFlBQWEsc0NBQ2IsS0FBTSxVQUNOLE1BQU8sR0FDVCxDQUNGLEVBU0EsU0FBZ0IsRUFDZCxFQUNBLEVBQ0EsRUFRZ0QsQ0FDaEQsSUFBSSxHQUFZLEVBQUssS0FBTyxDQUFDLEVBQUEsQ0FBRyxJQUFLLEdBQVksRUFBSyxRQUFRLEVBQUssRUFBUSxTQUFTLENBQUMsQ0FBQyxFQUtoRixFQUFhLFFBQVEsSUFDckIsRUFDSixFQUFLLGFBQ0osRUFBSyxlQUNGLEVBQVcsVUFBWSxjQUN2QixFQUFLLGVBQ0gsRUFBVyxRQUFVLEVBQVcsVUFBWSxjQUM1QyxJQUFBLElBQ1IsR0FBSSxPQUFPLEdBQVksU0FBVSxDQUMvQixHQUFJLEVBQVMsU0FBVyxJQUN0QixFQUFTLEtBQUssRUFBSyxLQUFLLEVBQUssTUFBTSxDQUFDLEVBQ2hDLEVBQUssZ0JBQWdCLENBQ3ZCLElB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LEVBQUUsV0FBVyxVQUFVLEVBQUUsU0FBU0MsR0FBRSxFQUFFLENBQUMsT0FBTyxJQUFJLEdBQUUsSUFBSSxHQUFFLEdBQUcsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsTUFBTUMsR0FBRSxHQUFHLENBQUMsSUFBTSxFQUFFLENBQUMsRUFBRSxJQUFJLEdBQUssQ0FBQyxFQUFFLEtBQUssRUFBRSxRQUFRLEVBQUUsRUFBRSxHQUFHLEVBQUUsT0FBTyxDQUFDLEVBQUUsSUFBTSxHQUFOLEtBQU8sQ0FBQyxPQUFPLENBQUMsRUFBRSxFQUFFLENBQUMsRUFBRSxNQUFNLENBQUMsRUFBRSxVQUFVLENBQUMsRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLGNBQWMsRUFBRSxZQUFZLEVBQUUsRUFBRSxFQUFFLENBQUMsS0FBSyxRQUFRLEVBQUUsS0FBSyxXQUFXLEVBQUUsS0FBSyxXQUFXLE1BQU0sR0FBRyxJQUFJLEVBQUUsS0FBSyxVQUFVLEtBQUssWUFBWSxFQUFFLEtBQUssYUFBYSxHQUFHLEVBQUUsS0FBSyxZQUFZLEdBQUcsSUFBSSxFQUFFLElBQUksSUFBSSxFQUFFLEVBQUUsRUFBRSxHQUFHLEVBQUUsRUFBRSxLQUFLLEVBQUUsR0FBRyxDQUFDLENBQUMsT0FBTyxFQUFFLENBQUMsR0FBRyxLQUFLLFVBQVUsTUFBVSxNQUFNLHlCQUF5QixFQUFFLElBQU0sRUFBRSxLQUFLLE9BQU8sRUFBRSxLQUFLLFVBQVUsRUFBRSxFQUFFLE9BQU8sRUFBRSxLQUFLLFdBQVcsRUFBRSxLQUFLLEVBQU0sRUFBRSxFQUFFLEVBQUUsRUFBRSxLQUFLLEVBQUUsR0FBRyxDQUFDLEdBQUcsS0FBSyxNQUFNLElBQUksS0FBSyxNQUFNLENBQUMsRUFBRSxFQUFFLEdBQUcsS0FBSyxNQUFNLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxHQUFHLEVBQUUsSUFBSSxFQUFFLEtBQUssTUFBTSxFQUFFLEdBQUcsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsWUFBWSxDQUFDLEdBQUcsRUFBRSxFQUFFLElBQUksRUFBRSxHQUFHLElBQUksR0FBR0YsRUFBRSxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsR0FBRyxLQUFLLElBQUksR0FBRyxJQUFJQSxFQUFFLEVBQUUsS0FBSyxFQUFFLEdBQUcsS0FBSyxJQUFJLEdBQUcsSUFBSUEsRUFBRSxFQUFFLE1BQU0sRUFBRSxPQUFPLEdBQUcsT0FBTyxFQUFFLEdBQUcsS0FBSyxJQUFJLEdBQUcsS0FBS0EsRUFBRSxFQUFFLEtBQUssRUFBRSxHQUFHLEtBQUssSUFBSSxHQUFHLEVBQUUsS0FBS0EsRUFBRSxFQUFFLEtBQUssRUFBRSxHQUFHLEtBQUssSUFBSSxHQUFHLElBQUlBLEVBQUUsRUFBRSxPQUFPLEVBQUUsUUFBUSxLQUFLLElBQUksR0FBRyxNQUFNLEVBQUUsWUFBWSxFQUFFLENBQUMsR0FBRyxJQUFJLEVBQUUsR0FBRyxLQUFLLElBQUksR0FBRyxLQUFLQSxFQUFFLEVBQUUsS0FBSyxFQUFFLEdBQUcsS0FBSyxJQUFJLEdBQUcsR0FBRyxLQUFLQSxFQUFFLEVBQUUsS0FBSyxFQUFFLEdBQUcsS0FBSyxJQUFJLEdBQUcsRUFBRSxLQUFLQSxFQUFFLEVBQUUsS0FBSyxFQUFFLEdBQUcsS0FBSyxJQUFJLEdBQUcsSUFBSUEsRUFBRSxFQUFFLE1BQU0sR0FBRyxLQUFLLGNBQWMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxJQUFJLEtBQUssTUFBTSxFQUFFLEVBQUUsS0FBSyxNQUFNLEVBQUUsR0FBRyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLElBQUksRUFBRSxHQUFHLEdBQUUsQ0FBQyxFQUFFLEtBQUssTUFBTSxDQUFDLENBQUMsS0FBTSxNQUFLLE1BQU0sQ0FBQyxDQUFDLE9BQU8sSUFBSSxDQUFDLFVBQVUsQ0FBQyxHQUFHLEtBQUssVUFBVSxPQUFPLEtBQUssVUFBVSxDQUFDLEVBQUUsSUFBTSxFQUFFLEtBQUssT0FBVyxFQUFFLEtBQUssY0FBb0IsRUFBRSxLQUFLLFdBQVcsRUFBRSxLQUFLLEVBQUUsR0FBRyxFQUFFLEdBQUcsSUFBSSxLQUFLLFFBQVEsRUFBRSxHQUFHLEtBQUssZ0JBQWdCLEtBQUssVUFBVSxJQUFJLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEdBQUcsRUFBRSxJQUFJLEVBQUUsRUFBRSxJQUFJLFdBQVcsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxJQUFJLEVBQUUsR0FBRyxHQUFFLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxLQUFLLFNBQVMsRUFBRSxJQUFNLEVBQUUsS0FBSyxXQUFlLEVBQUUsS0FBSyxFQUFRLEVBQUUsS0FBSyxhQUFhLEVBQUUsS0FBSyxXQUFlLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEdBQUcsS0FBSyxFQUFFLEdBQUcsQ0FBQyxJQUFJLEVBQUUsRUFBRSxFQUFFLEdBQUcsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEdBQUcsR0FBR0QsRUFBRSxHQUFHLEVBQUUsSUFBSUEsRUFBRSxHQUFHLEdBQUdBLEVBQUUsR0FBRyxHQUFHLElBQUlBLEVBQUUsR0FBRyxFQUFFLElBQUlBLEVBQUUsR0FBRyxHQUFHLElBQUlBLEVBQUUsR0FBRyxHQUFHLElBQUlBLEVBQUUsR0FBRyxHQUFHLElBQUlBLEVBQUUsR0FBRyxHQUFHLElBQUksRUFBRSxJQUFJLElBQUksRUFBRUcsR0FBRSxDQUFDLEVBQUVDLEdBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLE9BQU8sSUFBSSxFQUFFLEVBQUUsR0FBRyxHQUFHSixFQUFFLEdBQUcsRUFBRSxJQUFJQSxFQUFFLEdBQUcsR0FBRyxFQUFFLElBQUksR0FBR0EsRUFBRSxHQUFHLEdBQUcsSUFBSUEsRUFBRSxHQUFHLEVBQUUsS0FBSyxFQUFFLElBQUksR0FBR0EsRUFBRSxHQUFHLEdBQUcsSUFBSUEsRUFBRSxHQUFHLEdBQUcsTUFBTSxDQUFDLENBQUMsRUFBQyxNQUFNSSxHQUFFLFNBQVMsRUFBRSxDQUFDLElBQUksRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxHQUFFLEdBQUUsRUFBRSxHQUFFLEdBQUUsR0FBRSxHQUFFLEdBQUUsRUFBRSxHQUFFLEdBQUUsR0FBRSxHQUFFLEdBQUUsR0FBRSxHQUFFLEdBQUUsR0FBRSxFQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsRUFBRyxHQUFHLEVBQUcsR0FBRyxHQUFHLEdBQUcsSUFBSSxFQUFFLEVBQUUsRUFBRSxHQUFHLEdBQUcsRUFBRSxFQUFFLEVBQUUsR0FBRyxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxFQUFFLEdBQUcsRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsRUFBRSxHQUFHLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLEVBQUUsR0FBRyxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxFQUFFLEdBQUcsRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsRUFBRSxHQUFHLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLEVBQUUsR0FBRyxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxFQUFFLEdBQUcsRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsRUFBRSxHQUFHLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLEVBQUUsR0FBRyxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxHQUFHLEdBQUcsRUFBRSxJQUFJLElBQUksRUFBRSxHQUFHLEdBQUcsRUFBRSxJQUFJLElBQUksRUFBRSxJQUFJLEVBQUUsRUFBRSxJQUFJLEVBQUUsRUFBRSxLQUFLLEVBQUUsRUFBRSxLQUFLLEVBQUUsRUFBRSxLQUFLLEVBQUUsRUFBRSxLQUFLLEVBQUUsRUFBRSxLQUFLLEVBQUUsRUFBRSxLQUFLLEVBQUUsRUFBRSxLQUFLLEVBQUUsRUFBRSxLQUFLLEVBQUUsRUFBRSxHQUFHLEdBQUcsRUFBRSxJQUFJLElBQUksRUFBRSxHQUFHLEdBQUcsRUFBRSxJQUFJLElBQUksRUFBRSxJQUFJLEVBQUUsRUFBRSxJQUFJLEVBQUUsRUFBRSxLQUFLLEVBQUUsRUFBRSxLQUFLLEVBQUUsRUFBRSxLQUFLLEVBQUUsRUFBRSxLQUFLLEVBQUUsRUFBRSxLQUFLLEVBQUUsRUFBRSxLQUFLLEVBQUUsRUFBRSxLQUFLLEVBQUUsRUFBRSxLQUFLLEVBQUUsRUFBRSxHQUFHLEdBQUcsRUFBRSxJQUFJLElBQUksRUFBRSxHQUFHLEdBQUcsRUFBRSxJQUFJLElBQUksRUFBRSxJQUFJLEVBQUUsRUFBRSxJQUFJLEVBQUUsRUFBRSxLQUFLLEVBQUUsRUFBRSxLQUFLLEVBQUUsRUFBRSxLQUFLLEVBQUUsRUFBRSxLQUFLLEVBQUUsRUFBRSxLQUFLLEVBQUUsRUFBRSxLQUFLLEVBQUUsRUFBRSxLQUFLLEVBQUUsRUFBRSxLQUFLLEVBQUUsRUFBRSxHQUFHLEdBQUcsRUFBRSxJQUFJLElBQUksRUFBRSxHQUFHLEdBQUcsRUFBRSxJQUFJLElBQUksRUFBRSxJQUFJLEVBQUUsRUFBRSxJQUFJLEVBQUUsRUFBRSxLQUFLLEVBQUUsRUFBRSxLQUFLLEVBQUUsRUFBRSxLQUFLLEVBQUUsRUFBRSxLQUFLLEVBQUUsRUFBRSxLQUFLLEVBQUUsRUFBRSxLQUFLLEVBQUUsRUFBRSxLQUFLLEVBQUUsRUFBRSxLQUFLLEVBQUUsRUFBRSxHQUFHLEdBQUcsRUFBRSxJQUFJLElBQUksRUFBRSxHQUFHLEdBQUcsRUFBRSxJQUFJLElBQUksRUFBRSxJQUFJLEVBQUUsRUFBRSxJQUFJLEVBQUUsRUFBRSxLQUFLLEVBQUUsRUFBRSxLQUFLLEVBQUUsRUFBRSxLQUFLLEVBQUUsRUFBRSxLQUFLLEVBQUUsRUFBRSxLQUFLLEVBQUUsRUFBRSxLQUFLLEVBQUUsRUFBRSxLQUFLLEVBQUUsRUFBRSxLQUFLLEVBQUUsRUFBRSxFQUFFLEdBQUcsRUFBRSxFQUFFLEdBQUcsR0FBRSxFQUFFLEtBQUssRUFBRSxFQUFFLE1BQU0sR0FBRyxHQUFFLEVBQUUsS0FBSyxFQUFFLEVBQUUsTUFBTSxHQUFHLEVBQUUsRUFBRSxLQUFLLEVBQUUsRUFBRSxNQUFNLEdBQUcsRUFBRSxFQUFFLEtBQUssRUFBRSxFQUFFLE1BQU0sR0FBRyxFQUFHLEVBQUUsS0FBSyxFQUFFLEVBQUUsTUFBTSxHQUFHLEdBQUcsRUFBRSxLQUFLLEVBQUUsRUFBRSxNQUFNLEdBQUcsR0FBRSxFQUFFLEtBQUssR0FBRyxFQUFFLE1BQU0sR0FBRyxFQUFFLEVBQUUsS0FBSyxHQUFHLEVBQUUsTUFBTSxHQUFHLEVBQUUsRUFBRSxJQUFJLEVBQUUsRUFBRSxLQUFLLEdBQUcsR0FBRSxFQUFFLElBQUksRUFBRSxFQUFFLEtBQUssR0FBRyxFQUFFLEVBQUUsS0FBSyxHQUFHLEVBQUUsTUFBTSxHQUFHLEVBQUUsRUFBRSxLQUFLLEdBQUcsRUFBRSxNQUFNLEdBQUcsR0FBRSxFQUFFLEtBQUssR0FBRyxFQUFFLE1BQU0sR0FBRyxHQUFFLEVBQUUsS0FBSyxHQUFHLEVBQUUsTUFBTSxHQUFHLEVBQUUsRUFBRSxLQUFLLEdBQUcsRUFBRSxNQUFNLEdBQUcsRUFBRSxFQUFFLEtBQUssR0FBRyxFQUFFLE1BQU0sR0FBRyxHQUFHLEVBQUUsS0FBSyxFQUFFLEVBQUUsTUFBTSxHQUFHLEdBQUcsRUFBRSxLQUFLLEVBQUUsRUFBRSxNQUFNLEdBQUcsR0FBRyxFQUFFLElBQUksR0FBRyxFQUFFLEtBQUssRUFBRSxHQUFHLEVBQUUsSUFBSSxHQUFHLEVBQUUsS0FBSyxFQUFFLEdBQUUsRUFBRSxLQUFLLEVBQUUsRUFBRSxNQUFNLEdBQUcsRUFBRSxFQUFFLEtBQUssRUFBRSxFQUFFLE1BQU0sR0FBRyxFQUFFLEVBQUUsS0FBSyxHQUFHLEVBQUUsTUFBTSxHQUFHLEVBQUUsRUFBRSxLQUFLLEdBQUcsRUFBRSxNQUFNLEdBQUcsR0FBRSxFQUFFLEtBQUssR0FBRyxFQUFFLE1BQU0sR0FBRyxHQUFFLEVBQUUsS0FBSyxHQUFHLEVBQUUsTUFBTSxHQUFHLEVBQUUsRUFBRSxLQUFLLEdBQUcsRUFBRSxNQUFNLEVBQUUsRUFBRSxFQUFFLEtBQUssR0FBRyxFQUFFLE1BQU0sRUFBRSxFQUFFLEVBQUUsSUFBSSxHQUFHLEVBQUUsS0FBSyxFQUFFLEVBQUUsRUFBRSxJQUFJLEdBQUcsRUFBRSxLQUFLLEVBQUUsR0FBRyxFQUFFLEtBQUssR0FBRyxFQUFFLE1BQU0sRUFBRSxHQUFHLEVBQUUsS0FBSyxHQUFHLEVBQUUsTUFBTSxFQUFFLEdBQUUsRUFBRSxLQUFLLEdBQUcsRUFBRSxNQUFNLEVBQUUsR0FBRSxFQUFFLEtBQUssR0FBRyxFQUFFLE1BQU0sRUFBRSxFQUFFLEVBQUUsS0FBSyxHQUFHLEVBQUUsTUFBTSxHQUFHLEVBQUUsRUFBRSxLQUFLLEdBQUcsRUFBRSxNQUFNLEdBQUcsR0FBRSxFQUFFLEtBQUssR0FBRyxFQUFFLE1BQU0sRUFBRSxFQUFHLEVBQUUsS0FBSyxHQUFHLEVBQUUsTUFBTSxFQUFFLEdBQUUsRUFBRSxJQUFJLEdBQUcsRUFBRSxLQUFLLEVBQUUsR0FBRSxFQUFFLElBQUksR0FBRyxFQUFFLEtBQUssRUFBRSxFQUFFLEVBQUUsS0FBSyxHQUFHLEVBQUUsTUFBTSxHQUFHLEVBQUUsRUFBRSxLQUFLLEdBQUcsRUFBRSxNQUFNLEdBQUcsRUFBRyxFQUFFLEtBQUssRUFBRSxFQUFFLE1BQU0sR0FBRyxHQUFHLEVBQUUsS0FBSyxFQUFFLEVBQUUsTUFBTSxHQUFHLEdBQUUsRUFBRSxLQUFLLEVBQUUsRUFBRSxNQUFNLEdBQUcsR0FBRSxFQUFFLEtBQUssRUFBRSxFQUFFLE1BQU0sR0FBRyxFQUFFLEVBQUUsS0FBSyxHQUFHLEVBQUUsTUFBTSxHQUFHLEVBQUUsRUFBRSxLQUFLLEdBQUcsRUFBRSxNQUFNLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxHQUFHLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxJQUFJLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxJQUFJLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxJQUFJLEVBQUUsQ0FBQyxHQUFFLEdBQUUsRUFBRSxJQUFJLEdBQUUsQ0FBQyxFQUFFLEdBQUUsRUFBRSxJQUFJLEdBQUUsQ0FBQyxHQUFFLEdBQUUsRUFBRSxJQUFJLEdBQUUsQ0FBQyxHQUFFLEdBQUUsRUFBRSxJQUFJLEdBQUcsQ0FBQyxHQUFHLEVBQUcsRUFBRSxJQUFJLEdBQUcsQ0FBQyxHQUFHLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxHQUFHLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxJQUFJLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxJQUFJLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxJQUFJLEdBQUUsQ0FBQyxHQUFFLEdBQUUsRUFBRSxJQUFJLEVBQUUsQ0FBQyxHQUFFLEdBQUUsRUFBRSxJQUFJLEdBQUUsQ0FBQyxHQUFFLEdBQUUsRUFBRSxJQUFJLEdBQUUsQ0FBQyxHQUFFLEdBQUUsRUFBRSxJQUFJLEdBQUcsQ0FBQyxFQUFHLEVBQUcsRUFBRSxJQUFJLEdBQUcsQ0FBQyxHQUFHLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxHQUFHLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxJQUFJLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxJQUFJLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxJQUFJLEdBQUUsQ0FBQyxHQUFFLEdBQUUsRUFBRSxJQUFJLEdBQUUsQ0FBQyxHQUFFLEVBQUUsRUFBRSxJQUFJLEdBQUUsQ0FBQyxHQUFFLEdBQUUsRUFBRSxJQUFJLEdBQUUsQ0FBQyxHQUFFLEVBQUcsRUFBRSxJQUFJLEVBQUcsQ0FBQyxFQUFHLEdBQUcsRUFBRSxJQUFJLEdBQUcsQ0FBQyxHQUFHLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxHQUFHLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxJQUFJLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxJQUFJLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxJQUFJLEdBQUUsQ0FBQyxHQUFFLEVBQUUsRUFBRSxJQUFJLEdBQUUsQ0FBQyxFQUFFLEdBQUUsRUFBRSxJQUFJLEdBQUUsQ0FBQyxHQUFFLEdBQUUsRUFBRSxJQUFJLEdBQUUsQ0FBQyxFQUFHLEdBQUUsRUFBRSxJQUFJLEVBQUcsQ0FBQyxHQUFHLEdBQUcsRUFBRSxJQUFJLEdBQUcsQ0FBQyxHQUFHLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxHQUFHLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxJQUFJLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxJQUFJLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxJQUFJLEdBQUUsQ0FBQyxFQUFFLEdBQUUsRUFBRSxJQUFJLEVBQUUsQ0FBQyxHQUFFLEVBQUUsRUFBRSxJQUFJLEdBQUUsQ0FBQyxHQUFFLEdBQUUsRUFBRSxJQUFJLEVBQUcsQ0FBQyxHQUFFLEdBQUUsRUFBRSxJQUFJLEdBQUcsQ0FBQyxHQUFHLEdBQUcsRUFBRSxJQUFJLEdBQUcsQ0FBQyxHQUFHLEdBQUcsRUFBRSxJQUFJLEdBQUUsR0FBRyxFQUFFLElBQUksR0FBRSxFQUFFLEVBQUUsRUNSaGxLLEdBQUUsVUFBVSxDQUFzeUIsT0FBTyxJQUFJLElBQUksQ0FBQyxDQUE1eUIsU0FBUyxNQUFNLEtBQUssR0FBRyxDQUFDLElBQU0sRUFBRSxDQUFDLEVBQUUsS0FBSyxFQUFFLE9BQU8sRUFBRSxPQUFnQixFQUFFLFFBQVgsSUFBSyxJQUFhLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBVyxFQUFFLFFBQVgsSUFB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QUMsRUFBRSxFQUFFLElBQUksRUFBRSxDQUFDLEVBQUUsTUFBTSxJQUFJLFNBQVMsR0FBVSxJQUFQLEtBQVMsRUFBRSxHQUFHLEVBQUUsRUFBRSxJQUFJLEVBQUUsQ0FBQyxPQUFPLEdBQUcsTUFBTSxRQUFRLENBQUMsRUFBRSxDQUFDLElBQU0sRUFBRSxTQUFTLEVBQUUsQ0FBQyxHQUFHLEdBQUUsT0FBTyxFQUFFLENBQUMsSUFBTSxFQUFFLEdBQUUsT0FBTyxHQUFFLE9BQU8sRUFBRSxHQUFFLEtBQUssR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLE9BQU8sR0FBRSxNQUFNLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxNQUFNLEVBQUUsRUFBRSxHQUFHLEVBQUUsRUFBRSxJQUFJLEVBQUUsQ0FBQyxFQUFFLElBQUksR0FBSyxDQUFDLEVBQUUsS0FBSyxFQUFFLFFBQVEsRUFBRSxFQUFFLEdBQUcsRUFBRSxDQUFDLENBQUMsS0FBSyxDQUFDLEdBQUssQ0FBQyxFQUFFLEdBQUcsU0FBUyxFQUFFLEVBQUUsQ0FBQyxJQUFNLEVBQUUsRUFBRSxZQUFZLEdBQWUsT0FBTyxHQUFuQixXQUFxQixDQUFDLElBQU0sRUFBRSxFQUFFLEtBQUssRUFBRSxFQUFFLElBQUksQ0FBQyxFQUFFLEdBQVksSUFBVCxJQUFLLEdBQU0sTUFBTSxDQUFDLEVBQUUsRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBTSxFQUFFLE9BQU8sUUFBUSxDQUFDLEVBQUUsRUFBRSxFQUFFLE9BQU8sRUFBRSxNQUFNLEtBQUssQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDLEVBQUUsSUFBSSxJQUFJLEVBQUUsRUFBRSxFQUFFLEVBQUUsSUFBSSxDQUFDLElBQU0sRUFBRSxFQUFFLEdBQUcsRUFBRSxFQUFFLEVBQUUsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEVBQUUsR0FBRyxFQUFFLEVBQUUsQ0FBQyxNQUFNLENBQUEsR0FBRyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsT0FBTyxFQUFFLE1BQU0sS0FBSyxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLEdBQUcsRUFBRSxFQUFFLEdBQUcsRUFBRSxFQUFFLElBQUksRUFBRSxDQUFDLEVBQUUsSUFBSSxJQUFJLEVBQUUsRUFBRSxFQUFFLEVBQUUsSUFBSSxFQUFFLEVBQUUsR0FBRyxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQ0F2cEMsU0FBUyxHQUFFLEVBQUUsRUFBRSxDQUFDLE9BQU9FLEdBQUVDLEdBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBaUMsU0FBUyxJQUFHLENBQUMsTUFBTSxFQUFFLENDQTFGLE1BQU0sRUFBRSxHQUFFLENBQUMsWUFBWUMsRUFBQyxDQUFDLEVBQUksR0FBRSxDQUFDLFlBQVlDLEVBQUMsQ0FBQyxFQUFFLFNBQVMsR0FBRSxDQUFDLGNBQWMsRUFBRSxJQUF5QixZQUFZLEVBQUVELElBQUcsQ0FBQyxFQUFFLENBQUMsT0FBTyxTQUFTLEVBQUUsRUFBRSxDQUFDLElBQUksRUFBRSxFQUFFLEVBQUUsT0FBaUIsR0FBRyxPQUFkLFNBQW1CLFVBQVUsQ0FBQyxJQUFNLEVBQUUsRUFBRSxLQUFLLENBQUMsQ0FBQyxFQUFFLEVBQUUsS0FBSyxJQUFJLEVBQUUsT0FBTyxJQUFJLEdBQUcsRUFBRSxFQUFFLEtBQUssRUFBRSxFQUFFLEVBQUUsRUFBRSxLQUFLLElBQUksRUFBRSxFQUFFLEdBQUcsQ0FBQyxFQUFFLFNBQVMsR0FBRyxFQUFFLENBQUMsSUFBTSxFQUFFLEVBQUUsS0FBSyxDQUFDLEVBQUUsRUFBRSxLQUFLLElBQUksRUFBRSxPQUFPLElBQUksR0FBRyxFQUFFLEVBQUUsS0FBSyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsS0FBSyxLQUFLLEdBQUcsQ0FBQyxFQUFFLEVBQUUsR0FBRyxDQUFDLEVBQUUsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENDV2pkLFNBQWdCLEdBQTRCLEVBQWlCLEVBQWtELENBQzdHLElB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
|