@willbooster/wbfy 20.16.0 → 20.16.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (2) hide show
  1. package/dist/index.js +2 -2
  2. package/package.json +4 -4
package/dist/index.js CHANGED
@@ -366,7 +366,7 @@ fi`:``}
366
366
  ${e.doesContainPubspecYaml?`if [ -n "$dart_files" ]; then
367
367
  dart format $dart_files
368
368
  fi`:``}
369
- `.trim()}function As(n){if(!n.isRoot)return!1;let r=t.resolve(n.dirPath,`packages`,`wb`,`package.json`);if(!e.existsSync(r))return!1;try{return JSON.parse(e.readFileSync(r,`utf8`)).name===`@willbooster/wb`}catch{return!1}}function js(e,t){let n=[],r=String.raw`(mise\.toml|\.mise\.toml)`;n.push(String.raw`run_if_changed "${r}" "mise install"`);let i=Ns(e,t,e=>e.depending.blitz||e.depending.next,`.next`),a=i.length>0?` && rm -Rf -- ${i.map(Ms).join(` `)}`:``,o=Ns(e,t,()=>!0,`node_modules`);n.push(String.raw`if git diff --no-color -U0 ORIG_HEAD HEAD -- '*bunfig.toml' | grep --quiet -E '^[+-] *(globalStore|linker|publicHoistPattern)'; then rm -Rf -- ${o.map(de).join(` `)}; fi`),n.push(String.raw`run_if_changed "(package\.json|bun\.lock|bunfig\.toml|\.npmrc|patches/)" "${`bun install`}${a}"`);let s=Ns(e,t,e=>e.depending.vinext||e.depending.vite,`node_modules/.vite`);s.length>0&&n.push(String.raw`run_if_changed "(bunfig\.toml|\.npmrc)" "rm -Rf -- ${s.map(Ms).join(` `)}"`),e.doesContainPoetryLock&&n.push(String.raw`run_if_changed "poetry\.lock" "poetry install"`),e.doesContainUvLock&&n.push(String.raw`run_if_changed "uv\.lock" "uv sync --frozen"`),e.depending.prisma&&n.push(String.raw`run_if_changed ".*\.prisma" "bun wb prisma deploy"`,String.raw`run_if_changed ".*\.prisma" "bun wb prisma generate"`);let c=Pi(e,e.packageJson?.scripts);return c&&n.push(String.raw`run_if_changed "(^|/)i18n/.*\.json$" "${c}"`),n}function Ms(e){return de(e).replaceAll(/[\\`$"]/gu,String.raw`\$&`)}function Ns(e,n,r,i){return[...new Set(n.filter(e=>r(e)).map(n=>{let r=t.relative(e.dirPath,n.dirPath).replaceAll(`\\`,`/`);return r?t.posix.join(r,i):i}))].toSorted()}function Ps(e){return e.doesContainPoetryLock||e.doesContainUvLock}function Fs(e){return e.doesContainUvLock?`uv run`:`poetry run`}function Is(e){return e?.trim()}var Ls=class{blockNames;markerPrefix;toolName;constructor(e){this.blockNames=e.blockNames,this.markerPrefix=e.markerPrefix,this.toolName=e.toolName}getConfigContent(e){return e.existingContent&&this.hasManagedBlocks(e.existingContent)?this.replaceManagedBlocks(e.existingContent,e.desiredContent,e.filePath):e.desiredContent}getBlock(e,t){return`${this.getStartMarker(e)}
369
+ `.trim()}function As(n){if(!n.isRoot)return!1;let r=t.resolve(n.dirPath,`packages`,`wb`,`package.json`);if(!e.existsSync(r))return!1;try{return JSON.parse(e.readFileSync(r,`utf8`)).name===`@willbooster/wb`}catch{return!1}}function js(e,t){let n=[],r=String.raw`(mise\.toml|\.mise\.toml)`;n.push(String.raw`run_if_changed "${r}" "mise install"`),n.push(`eval "$(mise env -s bash)"`);let i=Ns(e,t,e=>e.depending.blitz||e.depending.next,`.next`),a=i.length>0?` && rm -Rf -- ${i.map(Ms).join(` `)}`:``,o=Ns(e,t,()=>!0,`node_modules`);n.push(String.raw`if git diff --no-color -U0 ORIG_HEAD HEAD -- '*bunfig.toml' | grep --quiet -E '^[+-] *(globalStore|linker|publicHoistPattern)'; then rm -Rf -- ${o.map(de).join(` `)}; fi`),n.push(String.raw`run_if_changed "(package\.json|bun\.lock|bunfig\.toml|\.npmrc|patches/)" "${`bun install`}${a}"`);let s=Ns(e,t,e=>e.depending.vinext||e.depending.vite,`node_modules/.vite`);s.length>0&&n.push(String.raw`run_if_changed "(bunfig\.toml|\.npmrc)" "rm -Rf -- ${s.map(Ms).join(` `)}"`),e.doesContainPoetryLock&&n.push(String.raw`run_if_changed "poetry\.lock" "poetry install"`),e.doesContainUvLock&&n.push(String.raw`run_if_changed "uv\.lock" "uv sync --frozen"`),e.depending.prisma&&n.push(String.raw`run_if_changed ".*\.prisma" "bun wb prisma deploy"`,String.raw`run_if_changed ".*\.prisma" "bun wb prisma generate"`);let c=Pi(e,e.packageJson?.scripts);return c&&n.push(String.raw`run_if_changed "(^|/)i18n/.*\.json$" "${c}"`),n}function Ms(e){return de(e).replaceAll(/[\\`$"]/gu,String.raw`\$&`)}function Ns(e,n,r,i){return[...new Set(n.filter(e=>r(e)).map(n=>{let r=t.relative(e.dirPath,n.dirPath).replaceAll(`\\`,`/`);return r?t.posix.join(r,i):i}))].toSorted()}function Ps(e){return e.doesContainPoetryLock||e.doesContainUvLock}function Fs(e){return e.doesContainUvLock?`uv run`:`poetry run`}function Is(e){return e?.trim()}var Ls=class{blockNames;markerPrefix;toolName;constructor(e){this.blockNames=e.blockNames,this.markerPrefix=e.markerPrefix,this.toolName=e.toolName}getConfigContent(e){return e.existingContent&&this.hasManagedBlocks(e.existingContent)?this.replaceManagedBlocks(e.existingContent,e.desiredContent,e.filePath):e.desiredContent}getBlock(e,t){return`${this.getStartMarker(e)}
370
370
  ${t}
371
371
  ${this.getEndMarker(e)}`}hasManagedBlocks(e){return this.blockNames.some(t=>e.includes(this.getStartMarker(t)))}replaceManagedBlocks(e,t,n){let r=e;for(let i of this.blockNames){let a=this.extractManagedBlock(t,i);if(!a)continue;let o=this.replaceManagedBlock(r,i,a);if(!o)return console.warn(`Skipped updating incomplete ${i} block in ${this.toolName} config: ${n}`),e;r=o}return r}extractManagedBlock(e,t){return this.getManagedBlockRegExp(t).exec(e)?.[0]}replaceManagedBlock(e,t,n){let r=this.getManagedBlockRegExp(t);if(r.test(e))return e.replace(r,n)}getManagedBlockRegExp(e){return RegExp(`${ue(this.getStartMarker(e))}[\\s\\S]*?${ue(this.getEndMarker(e))}`)}getStartMarker(e){return`// wbfy:start ${this.markerPrefix}-${e}`}getEndMarker(e){return`// wbfy:end ${this.markerPrefix}-${e}`}};const Rs=new Ls({blockNames:[`base`,`export`],markerPrefix:`oxfmt`,toolName:`oxfmt`});async function zs(e){return D.functionIgnoringException(`generateOxfmtConfig`,async()=>{let n=t.resolve(e.dirPath,`oxfmt.config.ts`),r=await k.readFileIfExists(n),i=Rs.getConfigContent({desiredContent:Bs(e),existingContent:r,filePath:n});Is(r)!==Is(i)&&await k.generateFile(n,i)})}function Bs(e){let t=Ra(e,`@willbooster/oxfmt-config`);return e.isEsmPackage?`${Rs.getBlock(`base`,`import type { OxfmtConfig } from 'oxfmt';
372
372
 
@@ -512,4 +512,4 @@ ${oe(ae)}
512
512
  `);throw Error(`Disallowed Git dependency sources found.\nOnly WillBooster and WillBoosterLab GitHub dependencies are allowed.\n${r}`)}function Xl(e){let t=e.packageJson;if(!t)return[];let n=[];for(let r of Kl){let i=t[r];if(i)for(let[t,a]of Object.entries(i))a&&Zl(a)&&($l(a)||n.push({dependencyName:t,dirPath:e.dirPath,sectionName:r,specifier:a}))}return n}function Zl(e){return Ql(e)||/^(?:bitbucket|gist|github|gitlab):/u.test(e)||/^https?:\/\/(?:bitbucket\.org|github\.com|gitlab\.com)\//u.test(e)||/^(?:https?|ssh):\/\/\S+\.git(?:#\S+)?$/u.test(e)||/^[^@\s]+@[^:\s]+:\S+(?:#\S+)?$/u.test(e)||e.startsWith(`git:`)||e.startsWith(`git+`)||e.startsWith(`ssh://git@`)}function Ql(e){return/^[a-zA-Z0-9][\w.-]*\/[\w.-]+(?:#\S+)?$/u.test(e)}function $l(e){return Jl.some(t=>t.test(e))}const eu=`apply-release-age-gate`,tu=`generate-user-agent-configs`;async function nu(){let e=await o(process.argv.slice(2)).command(eu,`Apply only the organization's minimum-release-age policy to this machine's global package-manager configs`).command(tu,`Overwrite this user's agent instruction files (~/.codex/AGENTS.md, ~/.claude/CLAUDE.md, ~/.gemini/GEMINI.md) with the organization's fixed content and merge the organization's settings into ~/.claude/settings.json and ~/.gemini/settings.json`).command(`$0 [paths..]`,`Make a given project follow the WillBooster standard`,e=>{e.positional(`paths`,{describe:`project paths to be wbfied`,array:!0,type:`string`,default:[`.`]})}).options({force:{description:`Apply wbfy even when the repository already records this wbfy version`,type:`boolean`,default:!1,alias:`f`},skipDeps:{description:"Skip adding managed dependencies and the linker probe (the final `bun install` refreshing the lockfile still runs)",type:`boolean`,default:!1,alias:`d`},verbose:{description:`Whether or not to enable verbose mode`,type:`boolean`,default:!1,alias:`v`}}).version(mi()).strict().argv;if(E.isVerbose=e.verbose,e._[0]===eu){ki()||(process.exitCode=1);return}if(e._[0]===tu){await nl()||(process.exitCode=1);return}let t=!1;try{t=await ru(e.paths,e.skipDeps,e.force)}finally{await ke()}t&&(process.exitCode=1)}async function ru(n,r,i){ki();let a=Bun.version;if(Bun.semver.order(a,`1.4.0`)<0)return console.error(`wbfy requires Bun >= 1.4.0 (found ${a}). Upgrade Bun and re-run.`),!0;let o=gi(),s=!i&&o&&!o.endsWith(`-dirty-local`)?o:void 0,c=!1;for(let i of n){let n=t.resolve(i);if(k.setRootDirPath(e.existsSync(n)?n:void 0),s&&await tc(n)===s){console.info(`Skip ${n}: wbfy ${s} is already applied. Pass --force to re-apply.`);continue}let a=t.join(n,`packages`),o=(await ce(()=>e.promises.readdir(a,{withFileTypes:!0}))??[]).filter(e=>e.isDirectory()).map(e=>t.resolve(a,e.name)),l=Kt({dirPath:n,packageJson:w(()=>JSON.parse(e.readFileSync(t.resolve(n,`package.json`),`utf8`)))??{},doesContainSubPackageJsons:o.some(n=>e.existsSync(t.resolve(n,`package.json`)))}),u=[...new Set([...o,...l])].filter(e=>e!==t.resolve(n)),d=[...[`.gitattributes`,`bunfig.toml`,`lefthook.yml`,`package.json`,`tsconfig.json`].map(e=>t.resolve(n,e)),...u.flatMap(e=>[`package.json`,`tsconfig.json`].map(n=>t.resolve(e,n)))];if((await Promise.all(d.map(e=>k.isConfinedWritablePath(e)))).includes(!1)){console.error(`Skip ${n}: a managed config file is a symlink or resolves outside the repository.`),c=!0;continue}let f=[n,...u].flatMap(n=>{let r=t.resolve(n,`package.json`);if(!e.existsSync(r))return[];try{let t=nr({packageJson:JSON.parse(e.readFileSync(r,`utf8`))});return t?[`${n}: ${t}`]:[]}catch{return[`${r} is invalid`]}});if(f.length>0){console.error(`Skip ${n}:\n${f.join(`
513
513
  `)}`),c=!0;continue}let p=await er(n);if(E.isVerbose,!p){console.error(`there is no valid package.json in ${n}`),c=!0;continue}let m=await Promise.all(u.map(e=>er(e,{isRoot:!1}))),h=u.find((n,r)=>!m[r]&&e.existsSync(t.join(n,`package.json`)));if(h){console.error(`Skip ${n}: ${h}/package.json is invalid.`),c=!0;continue}let g=[p,...m.filter(e=>!!e)],_=g.some(e=>e.isCloudflare)?R(`git`,[`-c`,`core.quotePath=false`,`ls-files`,`--`,`.env.cloudflare`,`*/.env.cloudflare`],p.dirPath).split(`
514
514
  `).filter(Boolean).map(e=>t.resolve(p.dirPath,e)):[];if(_.length>0){console.error(`SECURITY ERROR: Cloudflare credentials must be untracked. Remove ${_.join(`, `)} from Git, purge the token from history, and rotate CLOUDFLARE_API_TOKEN before rerunning wbfy.`),c=!0;continue}let v=En(p);if(await jl(g),E.isVerbose)for(let e of g)console.info(e);Yl(g);let y=Br(n),ee=Vr(g,y,r);await Ur(p,ee),await El(p),await ft(p),await cl(p,g),await A.promiseAll(),!r&&p.doesContainPackageJson&&!iu(n,p,y,ee)&&console.warn(`bun install currently fails in ${n} under the isolated linker.`);let b=!dn(p.repository)&&(p.repository?.startsWith(`github:WillBooster/`)||p.repository?.startsWith(`github:WillBoosterLab/`)),te=!b&&!dn(p.repository)&&!!p.repository?.startsWith(`github:`)&&p.isRoot;await Promise.all([v.then(()=>nc(p)),ei(p),ni(p),ai(p,g),si(p),Gl(p),ji(p),Js(p),Cc(p),yc(p),...b?[un(p)]:[],...te?[_l(p,g)]:[],Nl(p),Ll(p),Vl(p),...p.isRoot?[ws(p,g)]:[]]),await A.promiseAll(),await kr(p,g),await A.promiseAll();let x=[];for(let e of g)e.depending.playwrightTest&&x.push(We(e)),e.depending.next&&x.push(Me(e)),e.depending.chakra&&x.push(ze(e)),await ui(e,p),await A.promiseAll(),(e.isRoot||e.doesContainPackageJson)&&(Ai(e)&&await Gs(e),await Ja(e,p,r),e.doesContainVscodeSettingsJson&&x.push(al(e)),(e.doesContainTypeScript||e.doesContainTypeScriptInPackages)&&x.push(Dc(e)),H(e)?(x.push(zs(e)),x.push(Hs(e,p))):!e.isRoot&&e.doesContainPackageJson&&H(p)&&x.push(Hs(e,p)),e.depending.pyright&&x.push(qs(e)));await Promise.all(x),await A.promiseAll(),ci(n);try{ou(n)}catch(e){console.error(`Failed to refresh the Bun lockfile:`,e?.message??e),c=!0}try{let e=be(n);e&&console.info(`Removed Takumi Guard proxy URLs from ${e} to keep it registry-agnostic.`)}catch(e){console.error(`Failed to normalize the Bun lockfile:`,e?.message??e),c=!0}Jn(`bun`,[`cleanup`],n)}return c}function iu(e,t,n,r){return n!==r&&au(e,t),Yn(`bun`,[`install`],e,1)===0||(au(e,t),!1)}function au(n,r){let i=[t.resolve(n,`node_modules`),...[...qo(r).values()].map(e=>t.resolve(n,e,`node_modules`))],a=e.realpathSync(n);for(let n of i){let r=w(()=>e.realpathSync(t.dirname(n)));r&&(r===a||r.startsWith(a+t.sep))&&e.rmSync(n,{recursive:!0,force:!0})}}function ou(e){let t=Yn(`bun`,[`install`],e,1);if(t!==0)throw Error(`Failed to refresh Bun lockfile: bun install exited with status ${t}`)}await nu();
515
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJuYW1lcyI6WyJmcyIsImZzIiwicGFyc2VKc29uYyIsImZzcCIsInJlbGVhc2VBZ2VHYXRlLmRheXMiLCJyZWxlYXNlQWdlR2F0ZS5leGNsdWRlcyIsIm5ld0NvbnRlbnQiLCJjb21tb25Db250ZW50IiwibmV3Q29udGVudCIsImNoaWxkX3Byb2Nlc3MiLCJjb21tb25Db250ZW50IiwiY2hpbGRfcHJvY2VzcyIsInNvcnRPYmplY3RLZXlzIiwiZ2l0SG9va3MiLCJkZXRlY3ROZXdsaW5lIiwiZGVwZW5kZW5jeVNlY3Rpb25LZXlzIiwiY29yZSIsIm1hbmFnZWRDb25maWdCbG9ja3MiLCJnZXRDb25maWdDb250ZW50Il0sInNvdXJjZXMiOlsiLi4vLi4vc2hhcmVkLWxpYi9zcmMvZ2l0aHViVGVtcGxhdGVzLnRzIiwiLi4vLi4vc2hhcmVkLWxpYi9zcmMvc2xlZXAudHMiLCIuLi8uLi9zaGFyZWQtbGliL3NyYy9lcnJvci50cyIsIi4uLy4uL3NoYXJlZC1saWIvc3JjL3RleHQudHMiLCIuLi8uLi9zaGFyZWQtbGliL3NyYy90ZXN0aW5nUnVsZXMudHMiLCIuLi8uLi9zaGFyZWQtbGliLW5vZGUvc3JjL2J1bldvcmtzcGFjZXMudHMiLCIuLi8uLi9zaGFyZWQtbGliLW5vZGUvc3JjL2J1bkxvY2tmaWxlLnRzIiwiLi4vLi4vc2hhcmVkLWxpYi1ub2RlL3NyYy9kb2NrZXJmaWxlLnRzIiwiLi4vLi4vc2hhcmVkLWxpYi1ub2RlL3NyYy9nbG9iLnRzIiwiLi4vc3JjL29wdGlvbnMudHMiLCIuLi9zcmMvbG9nZ2VyLnRzIiwiLi4vc3JjL3V0aWxzL2ZzVXRpbC50cyIsIi4uL3NyYy91dGlscy9wcm9taXNlUG9vbC50cyIsIi4uL3NyYy91dGlscy90eXBlc2NyaXB0QXBpLnRzIiwiLi4vc3JjL2ZpeGVycy9uZXh0Q29uZmlnLnRzIiwiLi4vc3JjL2ZpeGVycy9jaGFrcmFUb2FzdGVyLnRzIiwiLi4vc3JjL2ZpeGVycy9wbGF5d3JpZ2h0Q29uZmlnLnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvZm5veFRvbWwudHMiLCIuLi9zcmMvdXRpbHMvbWVyZ2VVdGlsLnRzIiwiLi4vc3JjL3V0aWxzL29iamVjdFV0aWwudHMiLCIuLi9zcmMvdXRpbHMvd29ya3NwYWNlVXRpbC50cyIsIi4uL3NyYy91dGlscy9wcml2YXRlUGFja2FnZXMudHMiLCIuLi9zcmMvZ2VuZXJhdG9ycy93b3JrZmxvd1J1bm5lclBvbGljeS50cyIsIi4uL3NyYy9nZW5lcmF0b3JzL3dvcmtmbG93LnRzIiwiLi4vc3JjL2ZpeGVycy90eXBvcy50cyIsIi4uL3NyYy91dGlscy9naXRodWJVdGlsLnRzIiwiLi4vc3JjL3V0aWxzL2pzb25jVXRpbC50cyIsIi4uL3NyYy91dGlscy9tYW5hZ2VkU2NyaXB0U2VnbWVudC50cyIsIi4uL3NyYy91dGlscy9zcGF3blV0aWwudHMiLCIuLi9zcmMvcGFja2FnZUNvbmZpZy50cyIsIi4uL3NyYy9nZW5lcmF0b3JzL2FnZW50cy50cyIsIi4uL2NvbmZpZ3MvcmVsZWFzZUFnZUdhdGUuanNvbiIsIi4uL3NyYy9nZW5lcmF0b3JzL2J1bmZpZy50cyIsIi4uL3NyYy91dGlscy9pZ25vcmVGaWxlVXRpbC50cyIsIi4uL3NyYy9nZW5lcmF0b3JzL2RvY2tlcmlnbm9yZS50cyIsIi4uL3NyYy91dGlscy9leHRlbnNpb25zLnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvZWRpdG9yY29uZmlnLnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvZ2VtaW5pQ29uZmlnLnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvZ2l0YXR0cmlidXRlcy50cyIsIi4uL3NyYy9nZW5lcmF0b3JzL2dpdGlnbm9yZS50cyIsIi4uL3NyYy91dGlscy92ZXJzaW9uLnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvZ2xvYmFsUmVsZWFzZUFnZUdhdGUudHMiLCIuLi9zcmMvdXRpbHMvcGFja2FnZUNhcGFiaWxpdGllcy50cyIsIi4uL3NyYy9nZW5lcmF0b3JzL2lkZWEudHMiLCIuLi9zcmMvdXRpbHMvZ2VuSTE4blRzLnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLmJ1bi9pbnN0YWxsL2NhY2hlL2xpbmtzL3NvcnQtb2JqZWN0LWtleXNAMi4xLjAtMThkZjJmODM3ZTZlYzI5YS9ub2RlX21vZHVsZXMvc29ydC1vYmplY3Qta2V5cy9pbmRleC5qcyIsIi4uLy4uLy4uLy4uLy4uLy4uLy5idW4vaW5zdGFsbC9jYWNoZS9saW5rcy9kZXRlY3QtaW5kZW50QDcuMC4yLTZiNzVkYzBmNTY1MzNiZDkvbm9kZV9tb2R1bGVzL2RldGVjdC1pbmRlbnQvaW5kZXguanMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uYnVuL2luc3RhbGwvY2FjaGUvbGlua3MvZGV0ZWN0LW5ld2xpbmVANC4wLjEtNWRhOWRmNjUxMjVlZTc5NS9ub2RlX21vZHVsZXMvZGV0ZWN0LW5ld2xpbmUvaW5kZXguanMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uYnVuL2luc3RhbGwvY2FjaGUvbGlua3MvZ2l0LWhvb2tzLWxpc3RANC4yLjEtNmNhMmIyNjlkOTE2MzMyZS9ub2RlX21vZHVsZXMvZ2l0LWhvb2tzLWxpc3QvaW5kZXguanNvbiIsIi4uLy4uLy4uLy4uLy4uLy4uLy5idW4vaW5zdGFsbC9jYWNoZS9saW5rcy9pcy1wbGFpbi1vYmpANC4xLjAtNDdmZGRkNzcwNjQ4ZTU3Ny9ub2RlX21vZHVsZXMvaXMtcGxhaW4tb2JqL2luZGV4LmpzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLmJ1bi9pbnN0YWxsL2NhY2hlL2xpbmtzL3NvcnQtcGFja2FnZS1qc29uQDQuMC4wLTYzNTFiOTJmODI2MTU2ZjQvbm9kZV9tb2R1bGVzL3NvcnQtcGFja2FnZS1qc29uL2luZGV4LmpzIiwiLi4vc3JjL2dpdGh1Yi9jb21taXQudHMiLCIuLi9zcmMvdXRpbHMvdHNjb25maWdCYXNlLnRzIiwiLi4vc3JjL3V0aWxzL3dpbGxib29zdGVyQ29uZmlnc1V0aWwudHMiLCIuLi9zcmMvZ2VuZXJhdG9ycy9wYWNrYWdlSnNvbi50cyIsIi4uL3NyYy9nZW5lcmF0b3JzL2xlZnRob29rLnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvY29uZmlnQ29udGVudC50cyIsIi4uL3NyYy9nZW5lcmF0b3JzL21hbmFnZWRDb25maWdCbG9jay50cyIsIi4uL3NyYy9nZW5lcmF0b3JzL294Zm10Q29uZmlnLnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvb3hsaW50Q29uZmlnLnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvcHJldHRpZXJpZ25vcmUudHMiLCIuLi9zcmMvZ2VuZXJhdG9ycy9weXJpZ2h0Q29uZmlnLnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvcmFpbHdheWlnbm9yZS50cyIsIi4uL3NyYy9nZW5lcmF0b3JzL3JlYWRtZS50cyIsIi4uL3NyYy9nZW5lcmF0b3JzL3JlbGVhc2VyYy50cyIsIi4uL3NyYy9nZW5lcmF0b3JzL3Jlbm92YXRlSnNvbmMudHMiLCIuLi9zcmMvZ2VuZXJhdG9ycy90c2NvbmZpZy50cyIsIi4uL3NyYy9nZW5lcmF0b3JzL3VzZXJBZ2VudENvbmZpZ3MudHMiLCIuLi9zcmMvZ2VuZXJhdG9ycy92c2NvZGVTZXR0aW5ncy50cyIsIi4uL3NyYy9nZW5lcmF0b3JzL3diRW52LnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvc2VsZkNvbnRhaW5lZFdvcmtmbG93LnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvbWlzZVRvbWwudHMiLCIuLi9zcmMvZ2VuZXJhdG9ycy9ucG1yYy50cyIsIi4uL3NyYy9naXRodWIvbGFiZWwudHMiLCIuLi9zcmMvZ2l0aHViL3J1bGVzZXQudHMiLCIuLi9zcmMvZ2l0aHViL3NldHRpbmdzLnRzIiwiLi4vc3JjL2dpdGh1Yi90ZW1wbGF0ZS50cyIsIi4uL3NyYy91dGlscy9kZXBlbmRlbmN5U291cmNlUG9saWN5LnRzIiwiLi4vc3JjL2luZGV4LnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQSBzZWN0aW9uIG9mIGEgUFIgb3IgaXNzdWUgYm9keTogaXRzIGhlYWRpbmcgYW5kIHdoYXQgdGhlIHNlY3Rpb24gbXVzdCBzdGF0ZS4gYHJlcXVpcmVtZW50YFxuICogc3RhcnRzIGxvd2VyY2FzZSBhbmQgZW5kcyB3aXRob3V0IHB1bmN0dWF0aW9uLCBzbyB0aGF0IGl0IHJlYWRzIGJvdGggYXMgYSBwbGFjZWhvbGRlciBzZW50ZW5jZVxuICogKGNhcGl0YWxpemVkLCB3aXRoIGEgcGVyaW9kIGFwcGVuZGVkKSBhbmQgYXMgYSBjaGVja2xpc3QgY2xhdXNlIGFmdGVyIHRoZSBoZWFkaW5nLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFRlbXBsYXRlU2VjdGlvbiB7XG4gIHJlYWRvbmx5IGhlYWRpbmc6IHN0cmluZztcbiAgcmVhZG9ubHkgcmVxdWlyZW1lbnQ6IHN0cmluZztcbn1cblxuLyoqIFNlY3Rpb25zIG9mIGEgcHVsbCByZXF1ZXN0IGJvZHksIGluIHRoZSBvcmRlciB0aGV5IGFwcGVhciBpbiB0aGUgUFIgdGVtcGxhdGUuICovXG5leHBvcnQgY29uc3QgUFVMTF9SRVFVRVNUX1NFQ1RJT05TOiByZWFkb25seSBUZW1wbGF0ZVNlY3Rpb25bXSA9IFtcbiAge1xuICAgIGhlYWRpbmc6ICdXaHknLFxuICAgIHJlcXVpcmVtZW50OiAndGhlIHByb2JsZW0sIHdpdGggdGhlIG51bWJlcnMgb3Igb2JzZXJ2YXRpb25zIGJlaGluZCBpdCwgYW5kIHdoeSB0aGlzIGFwcHJvYWNoIG92ZXIgdGhlIGFsdGVybmF0aXZlcycsXG4gIH0sXG4gIHtcbiAgICBoZWFkaW5nOiAnUmVxdWlyZW1lbnRzJyxcbiAgICByZXF1aXJlbWVudDpcbiAgICAgIFwidGhlIHJlcXVpcmVtZW50cyB0aGUgY2hhbmdlIG11c3Qgc2F0aXNmeSBhbmQgdGhlIGd1YXJhbnRlZXMgaXQgbXVzdCBrZWVwLCBvbmUgcGVyIGxpbmUsIGVhY2ggbWFya2VkIGByZXF1aXJlZGAgKGFza2VkIGZvciBieSB0aGUgcmVxdWVzdGVyLCBvciBhbiBleGlzdGluZyBjb250cmFjdCBjYWxsZXJzIGRlcGVuZCBvbikgb3IgYGNob3NlbmAgKHRoZSBpbXBsZW1lbnRlcidzIG93biBkZWNpc2lvbiwgd2hpY2ggYSBzaW1wbGVyIGRlc2lnbiBtYXkgcmVwbGFjZSk7IGNvcHkgdGhlIHJlcXVlc3RlcidzIGluc3RydWN0aW9ucyBoZXJlIGFzIGdpdmVuLCB3aGV0aGVyIHRoZXkgY2FtZSBmcm9tIGFuIGlzc3VlIG9yIGEgY29udmVyc2F0aW9uLCBhbmQga2VlcCB0aGUgbGlzdCB3aGVuIHRoZSBib2R5IGlzIGxhdGVyIHJld3JpdHRlbiB1bmxlc3MgdGhlIHJlcXVlc3RlcidzIGluc3RydWN0aW9ucyBjaGFuZ2VkXCIsXG4gIH0sXG4gIHtcbiAgICBoZWFkaW5nOiAnQ3VzdG9tZXIgU3VtbWFyeScsXG4gICAgcmVxdWlyZW1lbnQ6XG4gICAgICAnYmVoYXZpb3IsIHdvcmtmbG93LCBvciB1c2VyLXZpc2libGUgY2hhbmdlcywgd3JpdHRlbiBmb3IgcmVhZGVycyB3aG8ga25vdyBub3RoaW5nIGFib3V0IHRoZSBpbXBsZW1lbnRhdGlvbicsXG4gIH0sXG4gIHtcbiAgICBoZWFkaW5nOiAnVGVjaG5pY2FsIFN1bW1hcnknLFxuICAgIHJlcXVpcmVtZW50OlxuICAgICAgJ2RlY2lzaW9ucyBhbmQgdGhlaXIgcmVhc29ucywgZGF0YSBmbG93LCB3aGVyZSB0byBsb29rICh0aGUgZmlsZXMgdGhhdCBtYXR0ZXIgbW9zdCksIGFuZCB3aGF0IHRvIGNoZWNrIGhhcmRlc3Q6IHRoZSBwYXJ0cyB3aG9zZSBjb3JyZWN0bmVzcyBpcyBhcmd1ZWQgcmF0aGVyIHRoYW4gcHJvdmVuJyxcbiAgfSxcbiAge1xuICAgIGhlYWRpbmc6ICdUZXN0aW5nJyxcbiAgICByZXF1aXJlbWVudDogJ2NvbW1hbmRzIHJ1biwgdGVzdHMgYWRkZWQsIGFuZCB3aGF0IHdhcyBOT1QgZXhlcmNpc2VkIGFuZCB3aHknLFxuICB9LFxuICB7XG4gICAgaGVhZGluZzogJ05vdGVzJyxcbiAgICByZXF1aXJlbWVudDogJ2tub3duIGxpbWl0YXRpb25zLCBjb21wYXRpYmlsaXR5IGFuZCBtaWdyYXRpb24sIGZvbGxvdy11cCB3b3JrOyBkZWxldGUgdGhpcyBzZWN0aW9uIGlmIHRoZXJlIGlzIG5vbmUnLFxuICB9LFxuXTtcblxuLyoqXG4gKiBIb3cgYSB0b29sIHRoYXQgd3JpdGVzIG9yIHJld3JpdGVzIGEgUFIgYm9keSBkZXJpdmVzIGl0IGZyb20gdGhlIHJlcG9zaXRvcnkncyBQUiB0ZW1wbGF0ZSwgYXNcbiAqIG1hcmtkb3duIGJ1bGxldHMgZm9yIGFuIGFnZW50J3MgaW5zdHJ1Y3Rpb25zLiBTdGF0ZWQgb25jZSBoZXJlIGFuZCByZW5kZXJlZCBieSBldmVyeSB3cml0ZXIgKHRoZVxuICogZ2VuZXJhdGVkIGFnZW50IGluc3RydWN0aW9ucywgdGhlIFBSLWRyYWZ0aW5nIHNraWxscykgc28gdGhlIHdyaXRlcnMgY2Fubm90IGRyaWZ0IGFwYXJ0OyB0aGVcbiAqIHRlbXBsYXRlLWxlc3MgYnJhbmNoIGxldHMgdGhlIHNhbWUgdGV4dCBzZXJ2ZSByZXBvc2l0b3JpZXMgb3V0c2lkZSB0aGUgb3JnYW5pemF0aW9uLlxuICovXG5jb25zdCBQVUxMX1JFUVVFU1RfVEVNUExBVEVfUlVMRVMgPSBgLSBCYXNlIHRoZSBQUiBib2R5IG9uIFxcYC5naXRodWIvcHVsbF9yZXF1ZXN0X3RlbXBsYXRlLm1kXFxgIHdoZW4gY3JlYXRpbmcgb3IgdXBkYXRpbmcgYSBQUiwgZXZlbiB3aGVuIGEgc2tpbGwgb3Igd29ya2Zsb3cgc3VwcGxpZXMgaXRzIG93biBza2VsZXRvbjoga2VlcCB0aGUgdGVtcGxhdGUncyBoZWFkaW5ncyBpbiBvcmRlciwgZmlsbCBlYWNoIHNlY3Rpb24gd2l0aCB3aGF0IGl0cyBwbGFjZWhvbGRlciBjb21tZW50IGFza3MgZm9yIGF0IGEgbGVuZ3RoIGZpdHRpbmcgdGhlIGNoYW5nZSAoYSBzZW50ZW5jZSBmb3IgYSBzbWFsbCBjaGFuZ2UsIG51bWJlcmVkIHN1YnNlY3Rpb25zIGZvciBhIGxhcmdlIG9uZSksIGFuZCBkZWxldGUgdGhlIHBsYWNlaG9sZGVyIGNvbW1lbnRzIGFuZCBhbiBlbXB0eSBOb3RlcyBzZWN0aW9uLiBXaXRob3V0IGEgdGVtcGxhdGUsIHVzZSBubyBmaXhlZCBoZWFkaW5nczogc3RhdGUgdGhlIHNjb3BlLCB0aGUgbW90aXZhdGlvbiwgYW5kIHRoZSB2ZXJpZmljYXRpb24gY29uY2lzZWx5LlxuLSBTdGFydCB0aGUgYm9keSB3aXRoIFxcYENsb3NlICM8bj5cXGAgb25seSB3aGVuIHRoZSBQUiByZXNvbHZlcyBhbiBleGlzdGluZyBpc3N1ZS5gO1xuXG4vKipcbiAqIEhvdyBhIHRvb2wgdGhhdCB3cml0ZXMgb3IgcmV3cml0ZXMgYSBQUiBib2R5IGZpbGxzIHRoZSBSZXF1aXJlbWVudHMgc2VjdGlvbiBvZlxuICogYFBVTExfUkVRVUVTVF9TRUNUSU9OU2AsIGFzIG1hcmtkb3duIGJ1bGxldHMgZm9yIGFuIGFnZW50J3MgaW5zdHJ1Y3Rpb25zLiBTa2lsbHMgdGhhdCBkcmFmdCBQUlxuICogYm9kaWVzIHJlbmRlciB0aGlzIHRleHQgaW5zdGVhZCBvZiByZXN0YXRpbmcgaXQsIHNvIHRoZSB3cml0ZXJzIGFuZCB0aGUgcmV2aWV3ZXJzIHRoYXQgcmVhZCB0aGVcbiAqIHNlY3Rpb24gYXMgdGhlIGJvdW5kYXJ5IGEgZml4IG11c3Qga2VlcCBuZXZlciBkaXNhZ3JlZSBvbiB3aGF0IGEgbGluZSBtZWFucy5cbiAqL1xuZXhwb3J0IGNvbnN0IFBVTExfUkVRVUVTVF9SRVFVSVJFTUVOVFNfUlVMRVMgPSBgLSBSZXF1aXJlbWVudHMgc2VjdGlvbjogb25lIGxpbmUgcGVyIHJlcXVpcmVtZW50LCB0YWtlbiBmcm9tIHRoZSByZXF1ZXN0ZXIncyBpbnN0cnVjdGlvbnMgYXMgdGhleSB3ZXJlIGdpdmVuICh0aGUgaXNzdWUsIHRoZSBjb252ZXJzYXRpb24gdGhhdCBhc2tlZCBmb3IgdGhlIGNoYW5nZSksIGVhY2ggbWFya2VkIFxcYHJlcXVpcmVkXFxgIChhc2tlZCBmb3IsIG9yIGFuIGV4aXN0aW5nIGNvbnRyYWN0IGNhbGxlcnMgZGVwZW5kIG9uKSBvciBcXGBjaG9zZW5cXGAgKHlvdXIgb3duIGRlY2lzaW9uLCB3aGljaCBhIHNpbXBsZXIgZGVzaWduIG1heSByZXBsYWNlKS4gTmV2ZXIgaW5mZXIgYSByZXF1aXJlbWVudCBmcm9tIHRoZSBkaWZmOiB3aGVuIG5vIGlzc3VlLCBQUiBtZXNzYWdlLCBvciBjb252ZXJzYXRpb24gc3RhdGVzIHRoZSByZXF1ZXN0LCB3cml0ZSBcXGByZXF1aXJlZDogbm90IHJlY29yZGVkIOKAlCBhc2sgdGhlIHJlcXVlc3RlclxcYCBhcyB0aGUgb25seSByZXF1ZXN0LWRlcml2ZWQgbGluZSAoYSBcXGByZXF1aXJlZFxcYCBsaW5lIGZvciBhbiBleGlzdGluZyBjb250cmFjdCBjYWxsZXJzIGRlcGVuZCBvbiBtYXkgc3RpbGwgYmUgbGlzdGVkKSBhbmQgc2F5IHNvIGluIE5vdGVzLlxuLSBSZWNvcmQgcnVsZTogYW4gZXhpc3RpbmcgUmVxdWlyZW1lbnRzIHNlY3Rpb24gaXMgYSByZWNvcmQsIG5vdCBhIGRlc2NyaXB0aW9uIG9mIHRoZSBkaWZmLiBLZWVwIGl0cyBcXGByZXF1aXJlZFxcYCBsaW5lcyBhcyB0aGV5IGFyZSwgcmV3cml0aW5nIHRoZW0gb25seSB3aGVuIHRoZSByZXF1ZXN0ZXIncyBpbnN0cnVjdGlvbnMgY2hhbmdlZCAodGhlbiBmcm9tIHRoZSB1cGRhdGVkIGluc3RydWN0aW9ucywgZHJvcHBpbmcgYSBsaW5lIG9ubHkgd2hlbiB0aGUgcmVxdWVzdGVyIHJlbW92ZWQgaXQ7IHdpdGggbm8gaW5zdHJ1Y3Rpb25zIGF2YWlsYWJsZSwga2VlcCB0aGVtIHVuY2hhbmdlZCk7IGFkZCBhIFxcYGNob3NlblxcYCBsaW5lIGZvciBhIG5ldyBkZWNpc2lvbiwgYW5kIHJlcGxhY2Ugb3IgcmVtb3ZlIG9uZSB3aGVuIHRoZSBkZWNpc2lvbiBpdCByZWNvcmRzIGNoYW5nZWQuIEEgc2VjdGlvbiB0aGF0IG1lcmVseSBkZXNjcmliZXMgdGhlIGltcGxlbWVudGF0aW9uLCBvciBob2xkcyBvbmx5IHRoZSB0ZW1wbGF0ZSdzIHBsYWNlaG9sZGVyIG9yIGEgXFxgcmVxdWlyZWQ6IG5vdCByZWNvcmRlZFxcYCBsaW5lLCBpcyBub3QgYSByZWNvcmQ6IHdyaXRlIGl0IGFmcmVzaCBieSB0aGUgcnVsZSBhYm92ZS5cbi0gUGxhY2UgdGhlIHNlY3Rpb24gd2hlcmUgdGhlIHRlbXBsYXRlIHB1dHMgaXQ7IHdoZW4gdGhlIHRlbXBsYXRlIGhhcyBubyBzdWNoIGhlYWRpbmcsIHJpZ2h0IGFmdGVyIHRoZSBpc3N1ZS1jbG9zaW5nIGxpbmUsIG9yIGF0IHRoZSB0b3Agb2YgdGhlIGJvZHkgd2hlbiB0aGVyZSBpcyBub25lLlxuLSBOZXZlciBkcm9wIG9yIHdlYWtlbiBhIFxcYHJlcXVpcmVkXFxgIGxpbmUgdG8gZml0IHdoYXQgd2FzIGltcGxlbWVudGVkOiB3aGVuIG9uZSBjYW5ub3QgaG9sZCBpbiB0aGUgZGlmZiwga2VlcCBpdCBhbmQgc2F5IHNvIGluIE5vdGVzLmA7XG5cbi8qKiBUaGUgY29tcGxldGUgcnVsZXMgZm9yIHdyaXRpbmcgYSBQUiBib2R5OiB0aGUgdGVtcGxhdGUgcnVsZXMgZm9sbG93ZWQgYnkgdGhlIFJlcXVpcmVtZW50cyBydWxlcy4gKi9cbmV4cG9ydCBjb25zdCBQVUxMX1JFUVVFU1RfQk9EWV9SVUxFUyA9IGAke1BVTExfUkVRVUVTVF9URU1QTEFURV9SVUxFU31cXG4ke1BVTExfUkVRVUVTVF9SRVFVSVJFTUVOVFNfUlVMRVN9YDtcblxuLyoqXG4gKiBIb3cgYSB0b29sIHRoYXQgY3JlYXRlcyBhbiBpc3N1ZSBkZXJpdmVzIGl0IGZyb20gdGhlIHJlcG9zaXRvcnkncyBpc3N1ZSB0ZW1wbGF0ZXMsIGFzIG1hcmtkb3duXG4gKiBidWxsZXRzIGZvciBhbiBhZ2VudCdzIGluc3RydWN0aW9uczsgc2hhcmVkIGJ5IHRoZSBzYW1lIHdyaXRlcnMgYXMgYFBVTExfUkVRVUVTVF9CT0RZX1JVTEVTYC5cbiAqIEd1aWRhbmNlIHRoZSB0ZW1wbGF0ZXMgc3RhdGUgaW4gdGhlaXIgb3duIHBsYWNlaG9sZGVyIGNvbW1lbnRzICh3aGljaCBzZWN0aW9ucyB0byBrZWVwLCBkZWxldGluZ1xuICogdGhlIGNvbW1lbnRzKSBpcyBkZWxpYmVyYXRlbHkgbm90IHJlcGVhdGVkIGhlcmUsIHNpbmNlIHRoZSB3cml0ZXIgcmVhZHMgdGhlIHRlbXBsYXRlIGFueXdheS5cbiAqL1xuZXhwb3J0IGNvbnN0IElTU1VFX1RFTVBMQVRFX1JVTEVTID0gYC0gRm9sbG93IHRoZSBjbG9zZXN0IHRlbXBsYXRlIHVuZGVyIFxcYC5naXRodWIvSVNTVUVfVEVNUExBVEUvXFxgOiBcXGBidWcubWRcXGAgZm9yIHdyb25nIGJlaGF2aW9yLCBcXGBjaGFuZ2UubWRcXGAgZm9yIGFueXRoaW5nIHRvIGJ1aWxkIG9yIGFsdGVyOyBhIHF1ZXN0aW9uIG9yIG5vdGUgZml0dGluZyBuZWl0aGVyLCBvciBhIHJlcG9zaXRvcnkgd2l0aG91dCB0ZW1wbGF0ZXMsIG5lZWRzIG5vIHRlbXBsYXRlLlxuLSBUaXRsZTogYSBDb252ZW50aW9uYWwgQ29tbWl0cyBwcmVmaXggZm9yIHRoZSB0eXBlIHRoYXQgZml0cyB0aGUgY2hhbmdlIChcXGBmZWF0OlxcYCwgXFxgZml4OlxcYCwgXFxgcmVmYWN0b3I6XFxgLCBcXGBkb2NzOlxcYCwgXFxgY2hvcmU6XFxgLCAuLi4pOyB3aGVuIGl0IGRpZmZlcnMgZnJvbSB0aGUgdGVtcGxhdGUncyBcXGB0aXRsZVxcYCBwcmVmaXgsIHJlcGxhY2UgdGhlIHRlbXBsYXRlJ3MgdHlwZSBsYWJlbCAoXFxgdDogLi4uXFxgKSB3aXRoIHRoZSBvbmUgbWF0Y2hpbmcgdGhlIHR5cGUuXG4tIFRoZSBZQU1MIGZyb250IG1hdHRlciBiZXR3ZWVuIHRoZSBcXGAtLS1cXGAgbGluZXMgaXMgbWV0YWRhdGEsIG5vdCBib2R5IHRleHQ6IHBhc3MgaXRzIFxcYGxhYmVsc1xcYCB2aWEgXFxgLS1sYWJlbFxcYCBhbmQgc3VibWl0IG9ubHkgdGhlIGNvbnRlbnQgYmVsb3cgdGhlIGNsb3NpbmcgXFxgLS0tXFxgIGFzIHRoZSBib2R5LmA7XG5cbi8qKiBTZWN0aW9ucyBvZiBhIGJ1ZyByZXBvcnQsIGluIHRoZSBvcmRlciB0aGV5IGFwcGVhciBpbiB0aGUgaXNzdWUgdGVtcGxhdGUuICovXG5leHBvcnQgY29uc3QgQlVHX0lTU1VFX1NFQ1RJT05TOiByZWFkb25seSBUZW1wbGF0ZVNlY3Rpb25bXSA9IFtcbiAgeyBoZWFkaW5nOiAnUHJvYmxlbScsIHJlcXVpcmVtZW50OiAnd2hhdCBoYXBwZW5zLCBhbmQgd2hhdCBzaG91bGQgaGFwcGVuIGluc3RlYWQnIH0sXG4gIHsgaGVhZGluZzogJ0V2aWRlbmNlJywgcmVxdWlyZW1lbnQ6ICdyZXByb2R1Y3Rpb24gc3RlcHMsIGxvZ3MsIHJ1biBJRHMsIG9yIGxpbmtzJyB9LFxuICB7IGhlYWRpbmc6ICdJbXBhY3QnLCByZXF1aXJlbWVudDogJ3dobyBvciB3aGF0IGlzIGFmZmVjdGVkLCBhbmQgaG93IGJhZGx5JyB9LFxuICB7IGhlYWRpbmc6ICdQcm9wb3NhbCcsIHJlcXVpcmVtZW50OiAndGhlIGZpeCB5b3UgaGF2ZSBpbiBtaW5kLCBhbmQgdGhlIHJvb3QgY2F1c2UgaWYga25vd24nIH0sXG5dO1xuXG4vKipcbiAqIFNlY3Rpb25zIGEgY2hhbmdlIHNwZWNpZmljYXRpb24gbXVzdCBzZXR0bGUgYmVmb3JlIGEgdGhpcmQgcGFydHkgY2FuIGltcGxlbWVudCBpdCwgZGVmaW5lZFxuICogb25jZSBzbyB0aGF0IHRoZSBpc3N1ZSB0ZW1wbGF0ZSBhbmQgYW55IHRvb2wgdGhhdCBkcmFmdHMgb3IgcmV2aWV3cyBzcGVjaWZpY2F0aW9ucyBhZ2FpbnN0XG4gKiB0aGVzZSBzZWN0aW9ucyBjYW5ub3QgZHJpZnQgYXBhcnQ7IGNoZWNrbGlzdCBjb25zdW1lcnMgcmVuZGVyIGl0IHdpdGggYHJlbmRlclNlY3Rpb25DaGVja2xpc3RgLlxuICogVGhlIGZpcnN0IHRocmVlIHNlY3Rpb25zIHN1ZmZpY2UgZm9yIGEgc21hbGwgY2hhbmdlLCBzbyB0aGV5IGNvbWUgZmlyc3QuXG4gKi9cbmV4cG9ydCBjb25zdCBDSEFOR0VfSVNTVUVfU0VDVElPTlM6IHJlYWRvbmx5IFRlbXBsYXRlU2VjdGlvbltdID0gW1xuICB7XG4gICAgaGVhZGluZzogJ0JhY2tncm91bmQgYW5kIGdvYWwnLFxuICAgIHJlcXVpcmVtZW50OiAndGhlIHByb2JsZW0gYmVpbmcgc29sdmVkLCBmb3Igd2hvbSwgYW5kIHdoYXQgb3V0Y29tZSBjb3VudHMgYXMgc3VjY2VzcycsXG4gIH0sXG4gIHtcbiAgICBoZWFkaW5nOiAnQmVoYXZpb3InLFxuICAgIHJlcXVpcmVtZW50OlxuICAgICAgJ2V2ZXJ5IHVzZXItIG9yIGNhbGxlci1vYnNlcnZhYmxlIGJlaGF2aW9yLCBpbmNsdWRpbmcgaW5wdXRzLCBvdXRwdXRzLCBlcnJvciBjYXNlcywgZWRnZSBjYXNlcywgYW5kIGludGVyYWN0aW9ucyB3aXRoIGV4aXN0aW5nIGJlaGF2aW9yLCBzdGF0ZWQgcHJlY2lzZWx5IGVub3VnaCB0aGF0IHR3byBpbXBsZW1lbnRlcnMgd291bGQgYnVpbGQgdGhlIHNhbWUgdGhpbmcnLFxuICB9LFxuICB7XG4gICAgaGVhZGluZzogJ0FjY2VwdGFuY2UgY3JpdGVyaWEnLFxuICAgIHJlcXVpcmVtZW50OlxuICAgICAgJ2NoZWNrYWJsZSBjb25kaXRpb25zIChHaXZlbi9XaGVuL1RoZW4gb3IgYW4gZXF1aXZhbGVudCkgdGhhdCBkZWNpZGUgd2hldGhlciB0aGUgaW1wbGVtZW50YXRpb24gaXMgZG9uZScsXG4gIH0sXG4gIHtcbiAgICBoZWFkaW5nOiAnU2NvcGUgYW5kIG5vbi1nb2FscycsXG4gICAgcmVxdWlyZW1lbnQ6ICd3aGF0IHRoZSBjaGFuZ2UgY292ZXJzIGFuZCB3aGF0IGl0IGRlbGliZXJhdGVseSBsZWF2ZXMgb3V0LCBzbyBhbiBpbXBsZW1lbnRlciBrbm93cyB3aGVyZSB0byBzdG9wJyxcbiAgfSxcbiAge1xuICAgIGhlYWRpbmc6ICdEZXNpZ24gY29uc3RyYWludHMnLFxuICAgIHJlcXVpcmVtZW50OlxuICAgICAgJ3RoZSBkYXRhLCBBUEksIHNjaGVtYSwgVUksIGFuZCBjb25maWd1cmF0aW9uIGNoYW5nZXMsIG5hbWluZywgYW5kIHRoZSBleGlzdGluZyBjb2RlIG9yIGNvbnZlbnRpb25zIHRoZSBpbXBsZW1lbnRhdGlvbiBtdXN0IGZpdCDigJQgYXMgZmFyIGFzIHRoZSB3cml0ZXIgaW50ZW5kcyB0byBjb25zdHJhaW4gdGhlbSwgd2l0aCBldmVyeXRoaW5nIGVsc2UgZXhwbGljaXRseSBsZWZ0IHRvIHRoZSBpbXBsZW1lbnRlcicsXG4gIH0sXG4gIHtcbiAgICBoZWFkaW5nOiAnQ29tcGF0aWJpbGl0eSBhbmQgbWlncmF0aW9uJyxcbiAgICByZXF1aXJlbWVudDogJ3doYXQgZXhpc3RpbmcgZGF0YSwgdXNlcnMsIGNhbGxlcnMsIG9yIGNvbmZpZ3VyYXRpb25zIGFyZSBhZmZlY3RlZCBhbmQgaG93IHRoZSB0cmFuc2l0aW9uIGhhcHBlbnMnLFxuICB9LFxuICB7XG4gICAgaGVhZGluZzogJ1ZlcmlmaWNhdGlvbicsXG4gICAgcmVxdWlyZW1lbnQ6ICdob3cgdGhlIGNoYW5nZSBpcyB0ZXN0ZWQgb3IgZGVtb25zdHJhdGVkLCBpbmNsdWRpbmcgd2hhdCBuZWVkcyBubyB0ZXN0IGFuZCB3aHknLFxuICB9LFxuICB7XG4gICAgaGVhZGluZzogJ09wZW4gcXVlc3Rpb25zJyxcbiAgICByZXF1aXJlbWVudDogJ3VuZGVjaWRlZCBwb2ludHMsIGVhY2ggd2l0aCBpdHMgb3B0aW9uczsgZW1wdHkgb25jZSB0aGUgc3BlY2lmaWNhdGlvbiBpcyBpbXBsZW1lbnRhYmxlJyxcbiAgfSxcbl07XG5cbi8qKiBSZW5kZXJzIHNlY3Rpb25zIGFzIG1hcmtkb3duIGJ1bGxldHMgKGAtICoqSGVhZGluZyoqOiByZXF1aXJlbWVudGApLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlbmRlclNlY3Rpb25DaGVja2xpc3Qoc2VjdGlvbnM6IHJlYWRvbmx5IFRlbXBsYXRlU2VjdGlvbltdKTogc3RyaW5nIHtcbiAgcmV0dXJuIHNlY3Rpb25zLm1hcCgoc2VjdGlvbikgPT4gYC0gKioke3NlY3Rpb24uaGVhZGluZ30qKjogJHtzZWN0aW9uLnJlcXVpcmVtZW50fWApLmpvaW4oJ1xcbicpO1xufVxuXG4vKiogUmVuZGVycyBzZWN0aW9ucyBhcyBtYXJrZG93biBoZWFkaW5ncywgZWFjaCBmb2xsb3dlZCBieSBpdHMgcmVxdWlyZW1lbnQgYXMgYSBwbGFjZWhvbGRlciBjb21tZW50LiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlbmRlclNlY3Rpb25UZW1wbGF0ZShzZWN0aW9uczogcmVhZG9ubHkgVGVtcGxhdGVTZWN0aW9uW10pOiBzdHJpbmcge1xuICByZXR1cm4gc2VjdGlvbnNcbiAgICAubWFwKFxuICAgICAgKHNlY3Rpb24pID0+XG4gICAgICAgIGAjIyAke3NlY3Rpb24uaGVhZGluZ31cXG5cXG48IS0tICR7c2VjdGlvbi5yZXF1aXJlbWVudC5jaGFyQXQoMCkudG9VcHBlckNhc2UoKX0ke3NlY3Rpb24ucmVxdWlyZW1lbnQuc2xpY2UoMSl9LiAtLT5gXG4gICAgKVxuICAgIC5qb2luKCdcXG5cXG4nKTtcbn1cbiIsImV4cG9ydCBhc3luYyBmdW5jdGlvbiBzbGVlcChtaWxsaXNlY29uZHM6IG51bWJlcik6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHNldFRpbWVvdXQocmVzb2x2ZSwgbWlsbGlzZWNvbmRzKSk7XG59XG4iLCJpbXBvcnQgeyBzbGVlcCB9IGZyb20gJy4vc2xlZXAuanMnO1xuXG4vKipcbiAqIENvbnZlcnQgYW4gb2JqZWN0IHRvIGFuIGVycm9yLlxuICogQHBhcmFtIG9iaiBUaGUgb2JqZWN0IHRvIGNvbnZlcnQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBlcnJvcmlmeShvYmo6IHVua25vd24pOiBFcnJvciB7XG4gIGlmIChvYmogaW5zdGFuY2VvZiBFcnJvcikgcmV0dXJuIG9iajtcbiAgaWYgKHR5cGVvZiBvYmogPT09ICdzdHJpbmcnKSByZXR1cm4gbmV3IEVycm9yKG9iaik7XG4gIC8vIGBKU09OLnN0cmluZ2lmeWAgYW5zd2VycyBgdW5kZWZpbmVkYCBmb3IgYHVuZGVmaW5lZGAsIGEgc3ltYm9sIGFuZCBhIGZ1bmN0aW9uLCBhbmQgdGhyb3dzXG4gIC8vIG9uIGEgYmlnaW50IG9yIGEgY3ljbGU7IGBuZXcgRXJyb3IodW5kZWZpbmVkKWAgaGFzIGFuIGVtcHR5IG1lc3NhZ2UsIHdoaWNoIHdvdWxkIGRyb3AgdGhlXG4gIC8vIG9ubHkgZGlhZ25vc3RpYyBhIGNhbGxlciBoYXMgYWJvdXQgc3VjaCBhIHRocm93biB2YWx1ZS4gTmVpdGhlciByZXByZXNlbnRhdGlvbiBtYXkgdGhyb3dcbiAgLy8gb3V0IG9mIGhlcmU6IHRoaXMgcnVucyBpbiBhIGNhdGNoIGJsb2NrLCB3aGVyZSBpdCB3b3VsZCByZXBsYWNlIHRoZSBlcnJvciBpdCBjb252ZXJ0cy5cbiAgcmV0dXJuIG5ldyBFcnJvcihpZ25vcmVFcnJvcigoKSA9PiBKU09OLnN0cmluZ2lmeShvYmopKSA/PyBpZ25vcmVFcnJvcigoKSA9PiBTdHJpbmcob2JqKSkpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaWdub3JlRXJyb3I8VD4oZm46ICgpID0+IFQpOiBUIHwgdW5kZWZpbmVkIHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gZm4oKTtcbiAgfSBjYXRjaCB7XG4gICAgLy8gZG8gbm90aGluZ1xuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpZ25vcmVFbm9lbnQ8VD4oZm46ICgpID0+IFQpOiBUIHwgdW5kZWZpbmVkIHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gZm4oKTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBpZiAodHlwZW9mIGVycm9yID09PSAnb2JqZWN0JyAmJiBlcnJvciAmJiAnY29kZScgaW4gZXJyb3IgJiYgZXJyb3IuY29kZSA9PT0gJ0VOT0VOVCcpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhyb3cgZXJyb3I7XG4gIH1cbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGlnbm9yZUVycm9yQXN5bmM8VD4oZm46ICgpID0+IFByb21pc2U8VD4pOiBQcm9taXNlPFQgfCB1bmRlZmluZWQ+IHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gYXdhaXQgZm4oKTtcbiAgfSBjYXRjaCB7XG4gICAgLy8gZG8gbm90aGluZ1xuICB9XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBpZ25vcmVFbm9lbnRBc3luYzxUPihmbjogKCkgPT4gUHJvbWlzZTxUPik6IFByb21pc2U8VCB8IHVuZGVmaW5lZD4ge1xuICB0cnkge1xuICAgIHJldHVybiBhd2FpdCBmbigpO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGlmICh0eXBlb2YgZXJyb3IgPT09ICdvYmplY3QnICYmIGVycm9yICYmICdjb2RlJyBpbiBlcnJvciAmJiBlcnJvci5jb2RlID09PSAnRU5PRU5UJykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aHJvdyBlcnJvcjtcbiAgfVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIFJldHJ5T3B0aW9ucyB7XG4gIGJlZm9yZVJldHJ5PzogKGVycm9yOiB1bmtub3duKSA9PiBQcm9taXNlPHZvaWQ+O1xuICBoYW5kbGVFcnJvcj86IChlcnJvcjogdW5rbm93bikgPT4gUHJvbWlzZTx2b2lkPjtcbiAgLyoqXG4gICAqIFRoZSBtYXhpbXVtIG51bWJlciBvZiB0b3RhbCBhdHRlbXB0cywgaW5jbHVkaW5nIHRoZSBpbml0aWFsIGF0dGVtcHQuXG4gICAqIEZvciBleGFtcGxlLCBgcmV0cnlDb3VudDogM2AgcnVucyB0aGUgZnVuY3Rpb24gYXQgbW9zdCAzIHRpbWVzOiAxIGluaXRpYWwgYXR0ZW1wdCBhbmQgdXAgdG8gMiByZXRyaWVzLlxuICAgKi9cbiAgcmV0cnlDb3VudD86IG51bWJlcjtcbiAgcmV0cnlMb2dnZXI/OiAobWVzc2FnZTogc3RyaW5nKSA9PiB2b2lkO1xuICBzaG91bGRSZXRyeT86IChlcnJvcjogdW5rbm93bikgPT4gYm9vbGVhbjtcbiAgc2xlZXBNaWxsaXNlY29uZHM/OiBudW1iZXI7XG4gIHVwZGF0ZVNsZWVwTWlsbGlzZWNvbmRzPzogKHNsZWVwTWlsbGlzZWNvbmRzOiBudW1iZXIpID0+IG51bWJlcjtcbn1cblxuLyoqXG4gKiBSZXRyeSB0aGUgZ2l2ZW4gZnVuY3Rpb24uXG4gKiBAcGFyYW0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gcmV0cnkuXG4gKiBAcGFyYW0gYmVmb3JlUmV0cnkgVGhlIGZ1bmN0aW9uIHRvIGNhbGwgaW1tZWRpYXRlbHkgYmVmb3JlIHJldHJ5aW5nLlxuICogQHBhcmFtIGhhbmRsZUVycm9yIFRoZSBmdW5jdGlvbiB0byBjYWxsIHdoZW4gYW4gZXJyb3Igb2NjdXJzLlxuICogQHBhcmFtIHJldHJ5Q291bnQgVGhlIG1heGltdW0gbnVtYmVyIG9mIHRvdGFsIGF0dGVtcHRzLCBpbmNsdWRpbmcgdGhlIGluaXRpYWwgYXR0ZW1wdC5cbiAqIEBwYXJhbSByZXRyeUxvZ2dlciBUaGUgZnVuY3Rpb24gdG8gbG9nIHJldHJ5aW5nLlxuICogQHBhcmFtIHNsZWVwTWlsbGlzZWNvbmRzIFRoZSBudW1iZXIgb2YgbWlsbGlzZWNvbmRzIHRvIHNsZWVwIGJlZm9yZSByZXRyeWluZy5cbiAqIEBwYXJhbSB1cGRhdGVTbGVlcE1pbGxpc2Vjb25kcyBUaGUgZnVuY3Rpb24gdG8gdXBkYXRlIHNsZWVwIG1pbGxpc2Vjb25kcyBhZnRlciBlYWNoIHJldHJ5LlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gd2l0aFJldHJ5PFQ+KFxuICBmdW5jOiAoZmFpbGVkQ291bnQ6IG51bWJlcikgPT4gVCB8IFByb21pc2U8VD4sXG4gIHtcbiAgICBiZWZvcmVSZXRyeSxcbiAgICBoYW5kbGVFcnJvcixcbiAgICByZXRyeUNvdW50ID0gMyxcbiAgICByZXRyeUxvZ2dlcixcbiAgICBzaG91bGRSZXRyeSxcbiAgICBzbGVlcE1pbGxpc2Vjb25kcyA9IDAsXG4gICAgdXBkYXRlU2xlZXBNaWxsaXNlY29uZHMsXG4gIH06IFJldHJ5T3B0aW9ucyA9IHt9XG4pOiBQcm9taXNlPFQ+IHtcbiAgbGV0IGZhaWxlZENvdW50ID0gMDtcbiAgZm9yICg7Oykge1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gYXdhaXQgZnVuYyhmYWlsZWRDb3VudCk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGF3YWl0IGhhbmRsZUVycm9yPy4oZXJyb3IpO1xuICAgICAgZmFpbGVkQ291bnQrKztcbiAgICAgIGlmIChmYWlsZWRDb3VudCA+PSByZXRyeUNvdW50KSB7XG4gICAgICAgIHRocm93IGVycm9yO1xuICAgICAgfVxuICAgICAgaWYgKHNob3VsZFJldHJ5ICYmICFzaG91bGRSZXRyeShlcnJvcikpIHtcbiAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICB9XG4gICAgICBpZiAoc2xlZXBNaWxsaXNlY29uZHMgPiAwKSB7XG4gICAgICAgIGF3YWl0IHNsZWVwKHNsZWVwTWlsbGlzZWNvbmRzKTtcbiAgICAgIH1cbiAgICAgIGlmICh1cGRhdGVTbGVlcE1pbGxpc2Vjb25kcykge1xuICAgICAgICBzbGVlcE1pbGxpc2Vjb25kcyA9IHVwZGF0ZVNsZWVwTWlsbGlzZWNvbmRzKHNsZWVwTWlsbGlzZWNvbmRzKTtcbiAgICAgIH1cbiAgICAgIHJldHJ5TG9nZ2VyPy4oYFJldHJ5IGR1ZSB0bzogJHtlcnJvcn1cbiR7ZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/ICctLS1cXG4nICsgKGVycm9yLnN0YWNrID8/ICcnKSA6ICcnfWApO1xuICAgICAgYXdhaXQgYmVmb3JlUmV0cnk/LihlcnJvcik7XG4gICAgfVxuICB9XG59XG4iLCIvKiogRXNjYXBlcyBldmVyeSBSZWdFeHAgbWV0YWNoYXJhY3RlciBzbyB0aGUgdGV4dCBtYXRjaGVzIGl0c2VsZiBsaXRlcmFsbHkuICovXG5leHBvcnQgZnVuY3Rpb24gZXNjYXBlUmVnRXhwKHRleHQ6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiB0ZXh0LnJlcGxhY2VBbGwoL1skKCkqKy4/W1xcXFxcXF1ee3x9XS9ndSwgU3RyaW5nLnJhd2BcXCQmYCk7XG59XG5cbi8qKiBBIFBPU0lYIHNoZWxsIHdvcmQ6IHNhZmUgY2hhcmFjdGVycyBwYXNzIHRocm91Z2gsIGFueXRoaW5nIGVsc2UgaXMgc2luZ2xlLXF1b3RlZC4gKi9cbmV4cG9ydCBmdW5jdGlvbiBxdW90ZUZvclNoZWxsKHZhbHVlOiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gL15bXFx3Li8tXSskL3UudGVzdCh2YWx1ZSkgPyB2YWx1ZSA6IGAnJHt2YWx1ZS5yZXBsYWNlQWxsKFwiJ1wiLCBTdHJpbmcucmF3YCdcXCcnYCl9J2A7XG59XG4iLCIvKipcbiAqIFdoZW4gdG8gd3JpdGUgYSB0ZXN0IGFuZCB3aGF0IGEgdGVzdCBtYXkgYXNzZXJ0LCBhcyBtYXJrZG93biBidWxsZXRzIGZvciBhbiBhZ2VudCdzIGluc3RydWN0aW9ucy5cbiAqIFN0YXRlZCBvbmNlIGhlcmUgYW5kIHJlbmRlcmVkIGJ5IHRoZSBnZW5lcmF0ZWQgYWdlbnQgaW5zdHJ1Y3Rpb25zIGFuZCB0aGUgdGVzdGluZyBza2lsbCBzbyB0aGVcbiAqIHR3byBjYW5ub3QgZHJpZnQgYXBhcnQuXG4gKi9cbmV4cG9ydCBjb25zdCBURVNUX1dSSVRJTkdfUlVMRVMgPSBgLSBXcml0ZSBhIHRlc3Qgb25seSB3aGVuIGV4cGxpY2l0bHkgcmVxdWVzdGVkLCBvciB3aGVuIGEgYmVoYXZpb3IgaXMgbGlrZWx5IHRvIHJlZ3Jlc3MgYW5kIG5vIGV4aXN0aW5nIGF1dG9tYXRpYyBjaGVjayAodHlwZSBjaGVja2luZywgbGludGluZywgYW4gZXhpc3RpbmcgdGVzdCBvciBDSSBjaGVjaykgd291bGQgY2F0Y2ggdGhlIGJyZWFrYWdlLiBOZXZlciBhZGQgYSB0ZXN0IHRoYXQgbWVyZWx5IHJlc3RhdGVzIGEgbWFwcGluZyBmcm9tIGNvbmRpdGlvbnMgdG8gY29uc3RhbnQgb3V0cHV0cyAoaXQgZmFpbHMgb25seSBvbiBpbnRlbnRpb25hbCBlZGl0cykgb3IgdGhhdCBvbmx5IGNvbmZpcm1zIGFuIGV4dGVybmFsIGZhY3QgKGEgbGlicmFyeSdzIGJlaGF2aW9yLCB3aGV0aGVyIGEgdmVyc2lvbiBmaXhlcyBhbiBpc3N1ZSk7IHZlcmlmeSB0aG9zZSBvbmNlIG1hbnVhbGx5LlxuLSBUZXN0IGV4dGVybmFsbHkgb2JzZXJ2YWJsZSBiZWhhdmlvciAoZS5nLiwgZW1pdHRlZCBmaWxlcywgQ0xJIG91dHB1dCwgcmVuZGVyZWQgcmVzdWx0cykgYXQgdGhlIHN5c3RlbSBib3VuZGFyeSwgbm90IGltcGxlbWVudGF0aW9uIGRldGFpbHM6IGRvIG5vdCBtaXJyb3IgcHJvZHVjdGlvbiBsb2dpYywgYXNzZXJ0IHRoYXQgYSBicmFuY2ggaXMgdGFrZW4sIG9yIGZlZWQgaGFuZC1hc3NlbWJsZWQgaW50ZXJuYWwgb2JqZWN0cyB0byBpbnRlcm5hbCBmdW5jdGlvbnMuXG4tIFByZWZlciBhY3R1YWwgQVBJIGNhbGxzIG92ZXIgbW9ja3MsIHVubGVzcyBhY3R1YWwgY2FsbHMgYXJlIGltcHJhY3RpY2FsLCBoYXZlIHVuaW50ZW5kZWQgc2lkZSBlZmZlY3RzLCBvciBtb2NrcyBhcmUgZXhwbGljaXRseSByZXF1ZXN0ZWQuXG4tIEVuc3VyZSB0ZXN0cyBhcmUgaWRlbXBvdGVudCBhbmQgaW5kZXBlbmRlbnQgKGUuZy4sIHJlc2V0IHBlcnNpc3RlbnQgZGF0YSkgc28gdGhleSBjYW4gcnVuIHJlcGVhdGVkbHkgb3IgaW4gcGFyYWxsZWwuXG4tIEF2b2lkIGZpeGVkIHdhaXRzIGluIEUyRSB0ZXN0czsgd2FpdCBmb3IgY29uZGl0aW9ucyBpbnN0ZWFkLmA7XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgZmcgZnJvbSAnZmFzdC1nbG9iJztcblxuLyoqIFRoZSBgd29ya3NwYWNlc2AgZmllbGQgb2YgYSByb290IHBhY2thZ2UuanNvbjogdGhlIGFycmF5IGZvcm0gb3IgWWFybiB2MSdzIG9iamVjdCBmb3JtLiAqL1xuZXhwb3J0IHR5cGUgV29ya3NwYWNlc0RlY2xhcmF0aW9uID0gc3RyaW5nW10gfCB7IHBhY2thZ2VzPzogc3RyaW5nW10gfSB8IHVuZGVmaW5lZDtcblxuLyoqXG4gKiBFdmVyeSB3b3Jrc3BhY2UgcGFja2FnZS5qc29uIHBhdGggKHJlbGF0aXZlIHRvIHRoZSBtb25vcmVwbyByb290LCBzb3J0ZWQpIHRoYXQgQnVuIHdvdWxkIGxpbmtcbiAqIGZvciB0aGUgZ2l2ZW4gcm9vdCBwYWNrYWdlLmpzb24gYHdvcmtzcGFjZXNgIGRlY2xhcmF0aW9uLiBDYW5vbmljYWxpemVzIHRoZSBkZWNsYXJlZCBwYXR0ZXJuc1xuICogKHNlZSBnZXRNZWFuaW5nZnVsRGVjbGFyZWRXb3Jrc3BhY2VQYXR0ZXJucyksIGRyb3BzIHBhdHRlcm5zIGVzY2FwaW5nIHRoZSByZXBvc2l0b3J5IChzZWVcbiAqIGlzSW5SZXBvc2l0b3J5V29ya3NwYWNlUGF0dGVybiksIGFuZCByZXNvbHZlcyB0aGUgcmVzdCB3aXRoIEJ1bidzIHNlcXVlbnRpYWwgc2VtYW50aWNzIChzZWVcbiAqIHJlc29sdmVXb3Jrc3BhY2VQYWNrYWdlSnNvblBhdGhzKS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlc29sdmVCdW5Xb3Jrc3BhY2VQYWNrYWdlSnNvblBhdGhzKHdvcmtzcGFjZXM6IFdvcmtzcGFjZXNEZWNsYXJhdGlvbiwgcm9vdERpclBhdGg6IHN0cmluZyk6IHN0cmluZ1tdIHtcbiAgcmV0dXJuIHJlc29sdmVXb3Jrc3BhY2VQYWNrYWdlSnNvblBhdGhzKFxuICAgIGdldE1lYW5pbmdmdWxEZWNsYXJlZFdvcmtzcGFjZVBhdHRlcm5zKHdvcmtzcGFjZXMpLmZpbHRlcigod29ya3NwYWNlUGF0dGVybikgPT5cbiAgICAgIGlzSW5SZXBvc2l0b3J5V29ya3NwYWNlUGF0dGVybih3b3Jrc3BhY2VQYXR0ZXJuKVxuICAgICksXG4gICAgcm9vdERpclBhdGhcbiAgKTtcbn1cblxuLyoqXG4gKiBSZXNvbHZlcyB3b3Jrc3BhY2UgcGF0dGVybnMgdG8gcGFja2FnZS5qc29uIHBhdGhzIG1pbWlja2luZyBCdW4ncyBTRVFVRU5USUFMIGV2YWx1YXRpb24sXG4gKiBkZXJpdmVkIGVtcGlyaWNhbGx5IHdpdGggQnVuIDEuMy4xNCAoZml4dHVyZSByZXBvcyBvYnNlcnZlZCB2aWEgYGJ1biBpbnN0YWxsIC0tbG9ja2ZpbGUtb25seWA7XG4gKiBXaWxsQm9vc3Rlci9zaGFyZWQjMTAwNCAvIFdpbGxCb29zdGVyL3NoYXJlZCMxMDA1KTpcbiAqIDEuIFBhdHRlcm5zIGFyZSBldmFsdWF0ZWQgaW4gZGVjbGFyYXRpb24gb3JkZXIgaW50byBhbiBhY2N1bXVsYXRpbmcgc2V0OiBhIHBvc2l0aXZlIGdsb2JcbiAqICAgIHBhdHRlcm4gYWRkcyBldmVyeSBwYWNrYWdlLmpzb24gaXQgbWF0Y2hlczsgYSBuZWdhdGlvbiBkZWxldGVzIGl0cyBtYXRjaGVzIGZyb20gdGhlIHNldFxuICogICAgYWNjdW11bGF0ZWQgU08gRkFSLCBzbyBhIGxhdGVyIHBvc2l0aXZlIHJlLWFkZHMgdGhlbSAoYFtcIiFhcHBzL2V4Y2x1ZGVkXCIsIFwiYXBwcy8qXCJdYCBsaW5rc1xuICogICAgYXBwcy9leGNsdWRlZCwgd2hpbGUgYFtcImFwcHMvKlwiLCBcIiFhcHBzL2V4Y2x1ZGVkXCJdYCBkb2VzIG5vdCkuXG4gKiAyLiBBIG5lZ2F0aW9uIHdob3NlIG5vcm1hbGl6ZWQgYm9keSBoYXMgRVhBQ1RMWSB0d28gc2VnbWVudHMsIHdob3NlIGxhc3Qgc2VnbWVudCBpcyBhIHN0YXItcnVuXG4gKiAgICAoYCpgLCBgKipgLCBgKioqYCwg4oCmKSwgYW5kIHdob3NlIGZpcnN0IHNlZ21lbnQgaXMgTk9UIGl0c2VsZiBhIHN0YXItcnVuIGZpcnN0IHNlZWRzIHRoZVxuICogICAgaW1wbGljaXQgYmFzZWxpbmUgaW50byB0aGUgc2V0LCB0aGVuIGRlbGV0ZXMgaXRzIG93biBtYXRjaGVzOiBhIGAqKmAgbGFzdCBzZWdtZW50IHNlZWRzXG4gKiAgICBgKipgIChwYWNrYWdlcyBhdCBhbnkgZGVwdGgpLCBhbnkgb3RoZXIgc3Rhci1ydW4gc2VlZHMgYCpcXC8qYCAoZGVwdGggMiBvbmx5KS4gU2VlZGluZ1xuICogICAgaGFwcGVucyBldmVuIGFsb25nc2lkZSBwb3NpdGl2ZSBwYXR0ZXJucyAoYFtcImFwcHMvKlwiLCBcIiFvdGhlci8qXCJdYCBsaW5rcyBldmVyeSBkZXB0aC0yXG4gKiAgICBwYWNrYWdlIG91dHNpZGUgb3RoZXIvKS4gTm8gb3RoZXIgbmVnYXRpb24gc2hhcGUgc2VlZHM6IGAhKmAsIGAhKipgLCBgISpcXC8qYCwgYCEqXFwvKipgLFxuICogICAgYCEqKlxcLypgLCBgIWEvYi8qYCwgYCFhL2IvKipgLCBgIWRpcmAsIGFuZCBgIWRpci8qeGAgZWFjaCBsaW5rIG5vdGhpbmcgb24gdGhlaXIgb3duLlxuICogICAgYD9gLCBicmFjZSwgYW5kIGNoYXJhY3Rlci1jbGFzcyBsYXN0IHNlZ21lbnRzIGJlaGF2ZSBFUlJBVElDQUxMWSAoYFtcIiFvdGhlci8/XCJdYCBsaW5rc1xuICogICAgcGFja2FnZXMvYSB5ZXQgbm90IHRoZSBlcXVhbGx5IGJhc2VsaW5lLXNoYXBlZCBvdGhlci95eSwgYFtcIiFvdGhlci8/P1wiXWAgbGlua3Mgbm90aGluZywgYW5kXG4gKiAgICBgW1wiIT8vP1wiXWAgbGlua3MgdGhlIHZlcnkgb3RoZXIveCBpdCBtYXRjaGVzKSwgc28gbm8gY29uc2lzdGVudCBydWxlIGNhbiBtb2RlbCB0aGVtOyB0aGV5XG4gKiAgICBhcmUgZGVsaWJlcmF0ZWx5IHRyZWF0ZWQgYXMgbm90IHNlZWRpbmcg4oCUIHNlZSBoYXNJbXBsaWNpdFdvcmtzcGFjZUJhc2VsaW5lIGFuZCAjMTAwNS5cbiAqIDMuIEEgbm9uLWdsb2IgcG9zaXRpdmUgcGF0dGVybiBQSU5TIGl0cyBkaXJlY3Rvcnk6IGl0IHN0YXlzIGEgd29ya3NwYWNlIHJlZ2FyZGxlc3Mgb2Ygd2hlcmUgYVxuICogICAgbWF0Y2hpbmcgbmVnYXRpb24gYXBwZWFycyAoYFtcIm90aGVyL3hcIiwgXCIhb3RoZXIveFwiXWAgYW5kIGBbXCIhb3RoZXIveFwiLCBcIm90aGVyL3hcIl1gIGJvdGhcbiAqICAgIGxpbmsgb3RoZXIveCkuXG4gKiA0LiBgKipgIG1hdGNoZXMgemVybyBvciBtb3JlIHBhdGggc2VnbWVudHMgKGBbXCJhcHBzLyoqXCJdYCBsaW5rcyB0aGUgcGFja2FnZSBhdCBhcHBzIGl0c2VsZiwgYW5kXG4gKiAgICBgIWFwcHMvKipgIGRlbGV0ZXMgaXQpLCBtYXRjaGluZyBmYXN0LWdsb2IncyBmaWxlLWdsb2Igc2VtYW50aWNzLlxuICogRG8gbm90IGFwcGx5IGdsb2JJZ25vcmUgaGVyZTogd29ya3NwYWNlIG1lbWJlcnNoaXAgaXMgZGVmaW5lZCBzb2xlbHkgYnkgdGhlIGRlY2xhcmVkIHBhdHRlcm5zLFxuICogYW5kIHNvdXJjZS1zY2FubmluZyBpZ25vcmVzIHN1Y2ggYXMgYGJ1aWxkYCBvciBgZGlzdGAgd291bGQgaGlkZSBsZWdpdGltYXRlbHkgbmFtZWQgd29ya3NwYWNlXG4gKiBkaXJlY3Rvcmllcy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlc29sdmVXb3Jrc3BhY2VQYWNrYWdlSnNvblBhdGhzKHdvcmtzcGFjZVBhdHRlcm5zOiBzdHJpbmdbXSwgcm9vdERpclBhdGg6IHN0cmluZyk6IHN0cmluZ1tdIHtcbiAgLy8gZm9sbG93U3ltYm9saWNMaW5rczogZmFsc2Ugc3RvcHMgR0xPQiB0cmF2ZXJzYWwgdGhyb3VnaCBzeW1saW5rcywgYnV0IGEgbm9uLWdsb2IgcGF0dGVyblxuICAvLyBuYW1pbmcgYSBzeW1saW5rZWQgZGlyZWN0b3J5IChlLmcuIGBsaW5rZWRgIHdpdGggYGxpbmtlZCAtPiAuLi9vdGhlci1yZXBvYCkgc3RpbGwgbWF0Y2hlcyDigJRcbiAgLy8gZmFzdC1nbG9iIHJlc29sdmVzIHN0YXRpYyBwYXR0ZXJucyB3aXRoIGRpcmVjdCBmcyBjaGVja3MsIGFuZCBCdW4gZG9lcyBsaW5rIHN1Y2ggYSB3b3Jrc3BhY2UuXG4gIC8vIERlbGliZXJhdGVseSBkaXZlcmdlIGZyb20gQnVuIHRoZXJlOiBjb25zdW1lcnMgc3VjaCBhcyBub2RlX21vZHVsZXMgY2xlYW51cCBhbmQgbWFuaWZlc3RcbiAgLy8gcmV3cml0aW5nIHdvdWxkIG90aGVyd2lzZSBkZWxldGUgYW5kIHJld3JpdGUgZmlsZXMgaW4gQU5PVEhFUiByZXBvc2l0b3J5IHRocm91Z2ggdGhlIHN5bWxpbmssXG4gIC8vIHNvIGtlZXAgb25seSBtYW5pZmVzdHMgd2hvc2UgcmVhbCBwYXRoIHN0YXlzIGluc2lkZSB0aGUgcmVwb3NpdG9yeSdzIHJlYWwgcm9vdC4gU2Nhbm5pbmcgZWFjaFxuICAvLyBwYXR0ZXJuIHNlcGFyYXRlbHkgKG5vIGNyb3NzLXBhdHRlcm4gY2FjaGluZykgaXMgZGVsaWJlcmF0ZTogZGVjbGFyYXRpb25zIGhvbGQgYSBoYW5kZnVsIG9mXG4gIC8vIHBhdHRlcm5zLCBzbyBhIGNhY2hlIHdvdWxkIGNvbXBsaWNhdGUgdGhpcyBzaGFyZWQgY29kZSB3aXRob3V0IG1lYXN1cmFibGUgZ2Fpbi5cbiAgY29uc3QgZ2xvYk1hbmlmZXN0UGF0aHMgPSAocGF0dGVybjogc3RyaW5nKTogc3RyaW5nW10gPT4ge1xuICAgIC8vIEJ1biBsaW5rcyBkb3QtZGlyZWN0b3J5IHBhY2thZ2VzIG9ubHkgdGhyb3VnaCBmdWxseSBzdGF0aWMgcGF0dGVybnM6IHdpdGggQnVuIDEuMy4xNCxcbiAgICAvLyBgLmhpZGRlbi94YCBwaW5zIHRoZSBwYWNrYWdlIHdoaWxlIGAuaGlkZGVuLypgLCBgLiovKmAsIGFuZCBgKipgIGFsbCBsaW5rIG5vdGhpbmcgdW5kZXJcbiAgICAvLyAuaGlkZGVuIOKAlCBldmVuIHdoZW4gdGhlIGRvdHRlZCBzZWdtZW50IGl0c2VsZiBpcyBsaXRlcmFsIOKAlCBzbyBhbnkgZHluYW1pYyBwYXR0ZXJuIG11c3RcbiAgICAvLyBkcm9wIG1hdGNoZXMgY29udGFpbmluZyBhIGRvdC1sZWQgc2VnbWVudCAoZmFzdC1nbG9iJ3MgYGRvdDogZmFsc2VgIG9ubHkgY292ZXJzIHNlZ21lbnRzXG4gICAgLy8gYSB3aWxkY2FyZCBtYXRjaGVzKS5cbiAgICBjb25zdCBleGNsdWRlc0RvdFNlZ21lbnRzID0gZmcuaXNEeW5hbWljUGF0dGVybihwYXR0ZXJuKTtcbiAgICBjb25zdCBnbG9iT3B0aW9ucyA9IHsgY3dkOiByb290RGlyUGF0aCwgZm9sbG93U3ltYm9saWNMaW5rczogZmFsc2UsIGlnbm9yZTogWycqKi9ub2RlX21vZHVsZXMvKionXSB9O1xuICAgIC8vIGZhc3QtZ2xvYiAzLjMuMyByZXR1cm5zIG5vIG1hdGNoZXMgZm9yIGZpbGUgZ2xvYnMgd2l0aCBhIGxvbmUtYD9gIHNlZ21lbnQgKGUuZy5cbiAgICAvLyBgcGFja2FnZXMvPy9wYWNrYWdlLmpzb25gKSwgYWx0aG91Z2ggbWljcm9tYXRjaCBtYXRjaGVzIHRoZW0gYW5kIEJ1biAxLjMuMTQgbGlua3Mgc3VjaFxuICAgIC8vIHdvcmtzcGFjZXM7IGZvciBgP2AtY2FycnlpbmcgcGF0dGVybnMgb25seSAoYSBkaXJlY3RvcnkgZ2xvYiBmb3IgZS5nLiBgKipgIHdvdWxkIHNjYW4gZXZlcnlcbiAgICAvLyBkaXJlY3RvcnkgaW4gdGhlIHJlcG9zaXRvcnkpLCBnbG9iYmluZyB0aGUgZGlyZWN0b3JpZXMgKHdoZXJlIGA/YCB3b3JrcykgYW5kIGNoZWNraW5nIHRoZWlyXG4gICAgLy8gbWFuaWZlc3RzIGNvbXBsZW1lbnRzIHRoZSBtYW5pZmVzdCBnbG9iLCB3aGljaCBzdGF5cyBuZWNlc3NhcnkgZm9yIGAqKmAncyB6ZXJvLXNlZ21lbnRcbiAgICAvLyBtYXRjaGVzIOKAlCBgZGlyLyoqYCBkb2VzIG5vdCByZXR1cm4gZGlyIGl0c2VsZiBhcyBhIGRpcmVjdG9yeS5cbiAgICBjb25zdCBtYW5pZmVzdFBhdGhzID0gbmV3IFNldChmZy5nbG9iU3luYyhwYXRoLnBvc2l4LmpvaW4ocGF0dGVybiwgJ3BhY2thZ2UuanNvbicpLCBnbG9iT3B0aW9ucykpO1xuICAgIGlmIChwYXR0ZXJuLmluY2x1ZGVzKCc/JykpIHtcbiAgICAgIGZvciAoY29uc3QgZGlyUGF0aCBvZiBmZy5nbG9iU3luYyhwYXR0ZXJuLCB7IC4uLmdsb2JPcHRpb25zLCBvbmx5RGlyZWN0b3JpZXM6IHRydWUgfSkpIHtcbiAgICAgICAgY29uc3QgcGFja2FnZUpzb25QYXRoID0gcGF0aC5wb3NpeC5qb2luKGRpclBhdGgsICdwYWNrYWdlLmpzb24nKTtcbiAgICAgICAgaWYgKGZzLmV4aXN0c1N5bmMocGF0aC5qb2luKHJvb3REaXJQYXRoLCBwYWNrYWdlSnNvblBhdGgpKSkgbWFuaWZlc3RQYXRocy5hZGQocGFja2FnZUpzb25QYXRoKTtcbiAgICAgIH1cbiAgICB9XG4gICAgLy8gQSB6ZXJvLXNlZ21lbnQgYCoqYCBtYXRjaCByZWFjaGVzIHRoZSByb290J3Mgb3duIG1hbmlmZXN0LCBidXQgQnVuIG5ldmVyIHRyZWF0cyB0aGVcbiAgICAvLyBtb25vcmVwbyByb290IGFzIGl0cyBvd24gd29ya3NwYWNlLlxuICAgIHJldHVybiBbLi4ubWFuaWZlc3RQYXRoc10uZmlsdGVyKFxuICAgICAgKHBhY2thZ2VKc29uUGF0aCkgPT5cbiAgICAgICAgcGFja2FnZUpzb25QYXRoICE9PSAncGFja2FnZS5qc29uJyAmJlxuICAgICAgICAoIWV4Y2x1ZGVzRG90U2VnbWVudHMgfHwgIXBhY2thZ2VKc29uUGF0aC5zcGxpdCgnLycpLnNvbWUoKHNlZ21lbnQpID0+IHNlZ21lbnQuc3RhcnRzV2l0aCgnLicpKSkgJiZcbiAgICAgICAgaXNJbnNpZGVSZWFsUm9vdChwYWNrYWdlSnNvblBhdGgpXG4gICAgKTtcbiAgfTtcbiAgbGV0IHJlYWxSb290RGlyUGF0aDogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICBjb25zdCBpc0luc2lkZVJlYWxSb290ID0gKHBhY2thZ2VKc29uUGF0aDogc3RyaW5nKTogYm9vbGVhbiA9PiB7XG4gICAgdHJ5IHtcbiAgICAgIHJlYWxSb290RGlyUGF0aCA/Pz0gZnMucmVhbHBhdGhTeW5jKHJvb3REaXJQYXRoKTtcbiAgICAgIGNvbnN0IHJlbGF0aXZlUGF0aCA9IHBhdGgucmVsYXRpdmUocmVhbFJvb3REaXJQYXRoLCBmcy5yZWFscGF0aFN5bmMocGF0aC5qb2luKHJvb3REaXJQYXRoLCBwYWNrYWdlSnNvblBhdGgpKSk7XG4gICAgICAvLyBDb21wYXJlIHdob2xlIHNlZ21lbnRzLCBub3QgYSBgLi5gIHByZWZpeDogYSBkaXJlY3RvcnkgbGl0ZXJhbGx5IG5hbWVkIGUuZy4gYC4ucGtnYCBpc1xuICAgICAgLy8gaW5zaWRlIHRoZSByb290LCB3aGlsZSBhIHBsYWluIHN0YXJ0c1dpdGgoJy4uJykgd291bGQgbWlzcmVhZCBpdCBhcyBwYXJlbnQgdHJhdmVyc2FsLlxuICAgICAgcmV0dXJuIHJlbGF0aXZlUGF0aCAhPT0gJy4uJyAmJiAhcmVsYXRpdmVQYXRoLnN0YXJ0c1dpdGgoJy4uLycpICYmICFwYXRoLmlzQWJzb2x1dGUocmVsYXRpdmVQYXRoKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIEEgbWFuaWZlc3QgdGhhdCB2YW5pc2hlZCBiZXR3ZWVuIHRoZSBnbG9iIGFuZCB0aGUgcmVhbHBhdGggY2FsbCBpcyBub3QgYSB3b3Jrc3BhY2UuXG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9O1xuICBjb25zdCBhY2N1bXVsYXRlZFBhdGhzID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gIGNvbnN0IHBpbm5lZFBhdGhzID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gIGZvciAoY29uc3Qgd29ya3NwYWNlUGF0dGVybiBvZiB3b3Jrc3BhY2VQYXR0ZXJucykge1xuICAgIGNvbnN0IGlzTmVnYXRpdmUgPSB3b3Jrc3BhY2VQYXR0ZXJuLnN0YXJ0c1dpdGgoJyEnKTtcbiAgICBjb25zdCBwYXR0ZXJuQm9keSA9IG5vcm1hbGl6ZVdvcmtzcGFjZVBhdHRlcm5Cb2R5KGlzTmVnYXRpdmUgPyB3b3Jrc3BhY2VQYXR0ZXJuLnNsaWNlKDEpIDogd29ya3NwYWNlUGF0dGVybik7XG4gICAgaWYgKGlzTmVnYXRpdmUpIHtcbiAgICAgIGNvbnN0IGJhc2VsaW5lR2xvYiA9IGdldFNlZWRlZEJhc2VsaW5lR2xvYihwYXR0ZXJuQm9keSk7XG4gICAgICBpZiAoYmFzZWxpbmVHbG9iICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgZm9yIChjb25zdCBwYWNrYWdlSnNvblBhdGggb2YgZ2xvYk1hbmlmZXN0UGF0aHMoYmFzZWxpbmVHbG9iKSkgYWNjdW11bGF0ZWRQYXRocy5hZGQocGFja2FnZUpzb25QYXRoKTtcbiAgICAgIH1cbiAgICAgIGZvciAoY29uc3QgcGFja2FnZUpzb25QYXRoIG9mIGdsb2JNYW5pZmVzdFBhdGhzKHBhdHRlcm5Cb2R5KSkgYWNjdW11bGF0ZWRQYXRocy5kZWxldGUocGFja2FnZUpzb25QYXRoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgdGFyZ2V0UGF0aHMgPSBmZy5pc0R5bmFtaWNQYXR0ZXJuKHBhdHRlcm5Cb2R5KSA/IGFjY3VtdWxhdGVkUGF0aHMgOiBwaW5uZWRQYXRocztcbiAgICAgIGZvciAoY29uc3QgcGFja2FnZUpzb25QYXRoIG9mIGdsb2JNYW5pZmVzdFBhdGhzKHBhdHRlcm5Cb2R5KSkge1xuICAgICAgICB0YXJnZXRQYXRocy5hZGQocGFja2FnZUpzb25QYXRoKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcmV0dXJuIFsuLi5uZXcgU2V0KFsuLi5hY2N1bXVsYXRlZFBhdGhzLCAuLi5waW5uZWRQYXRoc10pXS50b1NvcnRlZCgpO1xufVxuXG4vKipcbiAqIFdoZXRoZXIgdGhlIGRlY2xhcmF0aW9uIHNlZWRzIEJ1bidzIGltcGxpY2l0IHdvcmtzcGFjZSBiYXNlbGluZTogaXQgY29udGFpbnMgYXQgbGVhc3Qgb25lXG4gKiBuZWdhdGlvbiBvZiB0aGUgc2VlZGluZyBzaGFwZSAoc2VlIHJlc29sdmVXb3Jrc3BhY2VQYWNrYWdlSnNvblBhdGhzIHJ1bGUgMikuIE1lYXN1cmVkIHdpdGggQnVuXG4gKiAxLjMuMTQsIHNlZWRpbmcgaXMgcGVyLW5lZ2F0aW9uIGFuZCBoYXBwZW5zIGV2ZW4gYWxvbmdzaWRlIHBvc2l0aXZlIHBhdHRlcm5zOyBjb25jcmV0ZSBvclxuICogbWl4ZWQtbGl0ZXJhbCBsYXN0IHNlZ21lbnRzIChgIWFwcHMvZXhjbHVkZWRgLCBgIWFwcHMvKmRgKSBuZXZlciBzZWVkLCBhbmQgYD9gLCBicmFjZSwgYW5kXG4gKiBjaGFyYWN0ZXItY2xhc3MgbGFzdCBzZWdtZW50cyBiZWhhdmVkIGluY29uc2lzdGVudGx5IGFjcm9zcyBmaXh0dXJlcyAoc29tZXRpbWVzIGRyb3BwaW5nIGV2ZW5cbiAqIHVucmVsYXRlZCBzaWJsaW5nIHdvcmtzcGFjZXMpLCBzbyB0aGV5IGFyZSBjb25zZXJ2YXRpdmVseSB0cmVhdGVkIGFzIG5vdCBzZWVkaW5nOyBzZWVcbiAqIFdpbGxCb29zdGVyL3NoYXJlZCMxMDA1LlxuICovXG5leHBvcnQgZnVuY3Rpb24gaGFzSW1wbGljaXRXb3Jrc3BhY2VCYXNlbGluZSh3b3Jrc3BhY2VzOiBXb3Jrc3BhY2VzRGVjbGFyYXRpb24pOiBib29sZWFuIHtcbiAgcmV0dXJuIGdldE1lYW5pbmdmdWxEZWNsYXJlZFdvcmtzcGFjZVBhdHRlcm5zKHdvcmtzcGFjZXMpLnNvbWUoXG4gICAgKHdvcmtzcGFjZVBhdHRlcm4pID0+XG4gICAgICB3b3Jrc3BhY2VQYXR0ZXJuLnN0YXJ0c1dpdGgoJyEnKSAmJlxuICAgICAgZ2V0U2VlZGVkQmFzZWxpbmVHbG9iKG5vcm1hbGl6ZVdvcmtzcGFjZVBhdHRlcm5Cb2R5KHdvcmtzcGFjZVBhdHRlcm4uc2xpY2UoMSkpKSAhPT0gdW5kZWZpbmVkXG4gICk7XG59XG5cbi8qKlxuICogRGVjbGFyZWQgd29ya3NwYWNlIHBhdHRlcm5zIHdpdGhvdXQgQnVuJ3Mgbm8tb3Agb25lcyAoYFwiXCJgLCBhIGxvbmUgYFwiIVwiYCwgYW5kIGBcIi5cImApLCB3aGljaCBCdW5cbiAqIGlnbm9yZXMgZW50aXJlbHkg4oCUIGEgbG9uZSBgXCIhXCJgIG11c3Qgbm90IGFjdGl2YXRlIHRoZSBuZWdhdGl2ZS1vbmx5IGltcGxpY2l0IGJhc2VsaW5lLCBhbmQgYFwiXCJgXG4gKiBtdXN0IG5vdCBtYWtlIHRoZSByZXBvc2l0b3J5IHJvb3QgaXRzZWxmIGEgZGlzY292ZXJlZCB3b3Jrc3BhY2UuIERlY2xhcmF0aW9uIG9yZGVyIGFuZFxuICogZHVwbGljYXRlcyBhcmUgcHJlc2VydmVkIOKAlCBCdW4gZXZhbHVhdGVzIHRoZSBwYXR0ZXJucyBzZXF1ZW50aWFsbHksIHNvIHBvc2l0aW9uIG1hdHRlcnMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRNZWFuaW5nZnVsRGVjbGFyZWRXb3Jrc3BhY2VQYXR0ZXJucyh3b3Jrc3BhY2VzOiBXb3Jrc3BhY2VzRGVjbGFyYXRpb24pOiBzdHJpbmdbXSB7XG4gIHJldHVybiBnZXREZWNsYXJlZFdvcmtzcGFjZVBhdHRlcm5zKHdvcmtzcGFjZXMpXG4gICAgLm1hcCgod29ya3NwYWNlUGF0dGVybikgPT4ge1xuICAgICAgLy8gQnVuIGFwcGxpZXMgbGVhZGluZy1iYW5nIFBBUklUWSAodmVyaWZpZWQgd2l0aCBCdW4gMS4zLjE0KTogYCEhcGAgaXMgdGhlIHBvc2l0aXZlIGBwYFxuICAgICAgLy8gYW5kIGAhISFwYCB0aGUgbmVnYXRpb24gYCFwYCwgc28gY2Fub25pY2FsaXplIHRvIGF0IG1vc3Qgb25lIGJhbmcuXG4gICAgICBjb25zdCBiYW5nQ291bnQgPSAvXiEqL3UuZXhlYyh3b3Jrc3BhY2VQYXR0ZXJuKSFbMF0ubGVuZ3RoO1xuICAgICAgY29uc3QgcGF0dGVybkJvZHkgPSB3b3Jrc3BhY2VQYXR0ZXJuLnNsaWNlKGJhbmdDb3VudCk7XG4gICAgICByZXR1cm4gYmFuZ0NvdW50ICUgMiA9PT0gMSA/IGAhJHtwYXR0ZXJuQm9keX1gIDogcGF0dGVybkJvZHk7XG4gICAgfSlcbiAgICAuZmlsdGVyKCh3b3Jrc3BhY2VQYXR0ZXJuKSA9PiB7XG4gICAgICBjb25zdCBwYXR0ZXJuQm9keSA9IHdvcmtzcGFjZVBhdHRlcm4uc3RhcnRzV2l0aCgnIScpID8gd29ya3NwYWNlUGF0dGVybi5zbGljZSgxKSA6IHdvcmtzcGFjZVBhdHRlcm47XG4gICAgICAvLyBOb3JtYWxpemUgc28gc3BlbGxpbmdzIGxpa2UgYC4vYCwgYC4vLmAsIGFuZCBgIS4vYCBhcmUgcmVjb2duaXplZCBhcyB0aGUgc2FtZSBuby1vcHNcbiAgICAgIC8vIChwYXRoLnBvc2l4Lm5vcm1hbGl6ZSgnJykgPT09ICcuJywgc28gdGhlIGVtcHR5IHBhdHRlcm4gaXMgY292ZXJlZCB0b28pLlxuICAgICAgcmV0dXJuIG5vcm1hbGl6ZVdvcmtzcGFjZVBhdHRlcm5Cb2R5KHBhdHRlcm5Cb2R5KSAhPT0gJy4nO1xuICAgIH0pO1xufVxuXG4vKipcbiAqIENvbGxhcHNlcyBgLy9gLCByZXNvbHZlcyBgLi9gLCBhbmQgc3RyaXBzIHRyYWlsaW5nIHNsYXNoZXMsIG1pcnJvcmluZyBCdW4ncyBwYXRoIGhhbmRsaW5nLlxuICogQSBwdXJlIHN0YXItcnVuIHNlZ21lbnQgb2YgdGhyZWUgb3IgbW9yZSBzdGFycyBiZWhhdmVzIGxpa2UgYCpgIHVuZGVyIEJ1biAoYCFvdGhlci8qKipgXG4gKiBtYXRjaGVzIG90aGVyL3gpIGJ1dCBub3QgdW5kZXIgZmFzdC1nbG9iLCBzbyBjYW5vbmljYWxpemUgaXQgdG8gYCpgLlxuICovXG5leHBvcnQgZnVuY3Rpb24gbm9ybWFsaXplV29ya3NwYWNlUGF0dGVybkJvZHkocGF0dGVybkJvZHk6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiBwYXRoLnBvc2l4XG4gICAgLm5vcm1hbGl6ZShwYXR0ZXJuQm9keSlcbiAgICAucmVwbGFjZSgvXFwvKyQvdSwgJycpXG4gICAgLnNwbGl0KCcvJylcbiAgICAubWFwKChzZWdtZW50KSA9PiAoL15cXCp7Myx9JC91LnRlc3Qoc2VnbWVudCkgPyAnKicgOiBzZWdtZW50KSlcbiAgICAuam9pbignLycpO1xufVxuXG4vKiogVGhlIGltcGxpY2l0IGJhc2VsaW5lIGdsb2IgYSBuZWdhdGlvbiBzZWVkcyB1bmRlciBCdW4ncyBydWxlIDIgYWJvdmUsIG9yIHVuZGVmaW5lZCBpZiBub25lLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFNlZWRlZEJhc2VsaW5lR2xvYihuZWdhdGlvbkJvZHk6IHN0cmluZyk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IHNlZ21lbnRzID0gbmVnYXRpb25Cb2R5LnNwbGl0KCcvJyk7XG4gIGlmIChzZWdtZW50cy5sZW5ndGggIT09IDIpIHJldHVybiB1bmRlZmluZWQ7XG4gIGNvbnN0IFtmaXJzdFNlZ21lbnQsIGxhc3RTZWdtZW50XSA9IHNlZ21lbnRzIGFzIFtzdHJpbmcsIHN0cmluZ107XG4gIGlmICghL15cXCorJC91LnRlc3QobGFzdFNlZ21lbnQpIHx8IC9eXFwqKyQvdS50ZXN0KGZpcnN0U2VnbWVudCkpIHJldHVybiB1bmRlZmluZWQ7XG4gIHJldHVybiBsYXN0U2VnbWVudCA9PT0gJyoqJyA/ICcqKicgOiAnKi8qJztcbn1cblxuLyoqIFdvcmtzcGFjZSBwYXR0ZXJucyBmcm9tIGVpdGhlciB0aGUgYXJyYXkgZm9ybSBvciBZYXJuIHYxJ3MgYHsgcGFja2FnZXM6IFvigKZdIH1gIG9iamVjdCBmb3JtLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldERlY2xhcmVkV29ya3NwYWNlUGF0dGVybnMod29ya3NwYWNlczogV29ya3NwYWNlc0RlY2xhcmF0aW9uKTogc3RyaW5nW10ge1xuICBpZiAoQXJyYXkuaXNBcnJheSh3b3Jrc3BhY2VzKSkgcmV0dXJuIHdvcmtzcGFjZXM7XG4gIHJldHVybiBBcnJheS5pc0FycmF5KHdvcmtzcGFjZXM/LnBhY2thZ2VzKSA/IHdvcmtzcGFjZXMucGFja2FnZXMgOiBbXTtcbn1cblxuLyoqXG4gKiBXaGV0aGVyIGEgZGVjbGFyZWQgd29ya3NwYWNlIHBhdHRlcm4gKG5lZ2F0aXZlIG9uZXMgaW5jbHVkZWQpIHN0YXlzIGluc2lkZSB0aGUgcmVwb3NpdG9yeTpcbiAqIGFic29sdXRlIG9yIGAuLmAtdHJhdmVyc2luZyBwYXR0ZXJucyB3b3VsZCBtYWtlIGNvbnN1bWVycyBzdWNoIGFzIG5vZGVfbW9kdWxlcyBjbGVhbnVwIG9wZXJhdGVcbiAqIG9uIGFub3RoZXIgcmVwb3NpdG9yeSdzIGZpbGVzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNJblJlcG9zaXRvcnlXb3Jrc3BhY2VQYXR0ZXJuKHdvcmtzcGFjZVBhdHRlcm46IHN0cmluZyk6IGJvb2xlYW4ge1xuICBjb25zdCBwYXR0ZXJuQm9keSA9IHdvcmtzcGFjZVBhdHRlcm4uc3RhcnRzV2l0aCgnIScpID8gd29ya3NwYWNlUGF0dGVybi5zbGljZSgxKSA6IHdvcmtzcGFjZVBhdHRlcm47XG4gIHJldHVybiAhcGF0aC5wb3NpeC5pc0Fic29sdXRlKHBhdHRlcm5Cb2R5KSAmJiAhcGF0dGVybkJvZHkuc3BsaXQoJy8nKS5pbmNsdWRlcygnLi4nKTtcbn1cbiIsImltcG9ydCBjcnlwdG8gZnJvbSAnbm9kZTpjcnlwdG8nO1xuaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuLyoqXG4gKiBBbmNob3JlZCB0byBgXCIsIGAgc28gb25seSBhIHJlZ2lzdHJ5IGVudHJ5J3MgYHJlc29sdmVkYCBzbG90IGlzIGNsZWFyZWQuIEEgZGlyZWN0IHRhcmJhbGxcbiAqIGRlcGVuZGVuY3kgY2FycmllcyBpdHMgVVJMIGluIHRoZSB3b3Jrc3BhY2UgZGVzY3JpcHRvciBhbmQgdHVwbGUgaWRlbnRpZmllciBpbnN0ZWFkLCBhbmQgdGhvc2VcbiAqIFVSTHMgbXVzdCByZW1haW4gaW50YWN0LlxuICovXG5jb25zdCBndWFyZFJlc29sdmVkVXJsUGF0dGVybiA9IC8oXCIsIClcImh0dHBzOlxcL1xcL25wbVxcLmZsYXR0XFwudGVjaFxcL1teXCJdKlwiL2c7XG5cbi8qKlxuICogUmVtb3ZlIFRha3VtaSBHdWFyZCBwcm94eSBVUkxzIGZyb20gdGhlIG5lYXJlc3QgZW5jbG9zaW5nIGJ1bi5sb2NrLlxuICpcbiAqIEJ1biB3cml0ZXMgdGhlIHdvcmtzcGFjZSByb290J3MgbG9ja2ZpbGUgZXZlbiB3aGVuIGFuIGluc3RhbGwgcnVucyBmcm9tIGEgY2hpbGQgcGFja2FnZS4gSW4gYVxuICogR2l0IGNoZWNrb3V0IHRoZSBzZWFyY2ggY2xpbWJzIHRvIHRoYXQgcm9vdDsgd2l0aG91dCBhIGNoZWNrb3V0IGJvdW5kYXJ5IGl0IGluc3BlY3RzIG9ubHkgdGhlXG4gKiBzdGFydGluZyBkaXJlY3Rvcnkgc28gaXQgY2Fubm90IHJld3JpdGUgYW4gdW5yZWxhdGVkIGFuY2VzdG9yJ3MgbG9ja2ZpbGUuIFRoZSBwcm94eSBpc1xuICogaW5zdGFsbC10aW1lIHBvbGljeSByYXRoZXIgdGhhbiByZXBvc2l0b3J5IHN0YXRlOiBhbiBlbXB0eSByZXNvbHZlZCBzbG90IHN0aWxsIG1ha2VzIEJ1biB1c2UgdGhlXG4gKiBjb25maWd1cmVkIGRlZmF1bHQgcmVnaXN0cnkuXG4gKlxuICogQHJldHVybnMgVGhlIG5vcm1hbGl6ZWQgbG9ja2ZpbGUgcGF0aCwgb3IgdW5kZWZpbmVkIHdoZW4gbm8gY2hhbmdlIHdhcyBuZWVkZWQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBub3JtYWxpemVCdW5Mb2NrZmlsZShzdGFydERpclBhdGg6IHN0cmluZyk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IGxvY2tmaWxlUGF0aCA9IGZpbmRCdW5Mb2NrZmlsZVBhdGgoc3RhcnREaXJQYXRoKTtcbiAgaWYgKCFsb2NrZmlsZVBhdGgpIHJldHVybjtcblxuICBjb25zdCBjb250ZW50ID0gZnMucmVhZEZpbGVTeW5jKGxvY2tmaWxlUGF0aCwgJ3V0ZjgnKTtcbiAgY29uc3Qgbm9ybWFsaXplZENvbnRlbnQgPSBjb250ZW50LnJlcGxhY2VBbGwoZ3VhcmRSZXNvbHZlZFVybFBhdHRlcm4sICckMVwiXCInKTtcbiAgaWYgKG5vcm1hbGl6ZWRDb250ZW50ID09PSBjb250ZW50KSByZXR1cm47XG5cbiAgLy8gQSBzaWJsaW5nIHRlbXAgZmlsZSBtYWtlcyB0aGUgcmVwbGFjZW1lbnQgYW4gYXRvbWljIHNhbWUtZGlyZWN0b3J5IHJlbmFtZSwgc28gYW4gaW50ZXJydXB0ZWRcbiAgLy8gd3JpdGUgY2Fubm90IGxlYXZlIGEgdHJ1bmNhdGVkIGJ1bi5sb2NrIGJlaGluZC5cbiAgY29uc3QgdGVtcG9yYXJ5UGF0aCA9IGAke2xvY2tmaWxlUGF0aH0ubm9ybWFsaXppbmcuJHtwcm9jZXNzLnBpZH0uJHtjcnlwdG8ucmFuZG9tVVVJRCgpfWA7XG4gIHRyeSB7XG4gICAgLy8gc3RhdCdzIG1vZGUgaW5jbHVkZXMgZmlsZS10eXBlIGJpdHMsIHdoaWNoIGNobW9kIGlzIG5vdCBzcGVjaWZpZWQgdG8gYWNjZXB0LlxuICAgIGNvbnN0IG1vZGUgPSBmcy5zdGF0U3luYyhsb2NrZmlsZVBhdGgpLm1vZGUgJiAwbzc3NztcbiAgICBmcy53cml0ZUZpbGVTeW5jKHRlbXBvcmFyeVBhdGgsIG5vcm1hbGl6ZWRDb250ZW50LCB7IG1vZGUgfSk7XG4gICAgLy8gd3JpdGVGaWxlU3luYydzIG1vZGUgaXMgbWFza2VkIGJ5IHRoZSBwcm9jZXNzIHVtYXNrOyBjaG1vZCByZXN0b3JlcyB0aGUgZXhhY3Qgb3JpZ2luYWwgYml0cy5cbiAgICBmcy5jaG1vZFN5bmModGVtcG9yYXJ5UGF0aCwgbW9kZSk7XG4gICAgZnMucmVuYW1lU3luYyh0ZW1wb3JhcnlQYXRoLCBsb2NrZmlsZVBhdGgpO1xuICB9IGZpbmFsbHkge1xuICAgIGZzLnJtU3luYyh0ZW1wb3JhcnlQYXRoLCB7IGZvcmNlOiB0cnVlIH0pO1xuICB9XG4gIHJldHVybiBsb2NrZmlsZVBhdGg7XG59XG5cbmZ1bmN0aW9uIGZpbmRCdW5Mb2NrZmlsZVBhdGgoc3RhcnREaXJQYXRoOiBzdHJpbmcpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBjb25zdCByZXNvbHZlZFN0YXJ0RGlyUGF0aCA9IHBhdGgucmVzb2x2ZShzdGFydERpclBhdGgpO1xuICBjb25zdCByZXBvc2l0b3J5Um9vdERpclBhdGggPSBmaW5kUmVwb3NpdG9yeVJvb3REaXJQYXRoKHJlc29sdmVkU3RhcnREaXJQYXRoKTtcbiAgaWYgKCFyZXBvc2l0b3J5Um9vdERpclBhdGgpIHtcbiAgICBjb25zdCBsb2NrZmlsZVBhdGggPSBwYXRoLmpvaW4ocmVzb2x2ZWRTdGFydERpclBhdGgsICdidW4ubG9jaycpO1xuICAgIHJldHVybiBmcy5leGlzdHNTeW5jKGxvY2tmaWxlUGF0aCkgPyBsb2NrZmlsZVBhdGggOiB1bmRlZmluZWQ7XG4gIH1cblxuICBsZXQgZGlyUGF0aCA9IHJlc29sdmVkU3RhcnREaXJQYXRoO1xuICB3aGlsZSAodHJ1ZSkge1xuICAgIGNvbnN0IGxvY2tmaWxlUGF0aCA9IHBhdGguam9pbihkaXJQYXRoLCAnYnVuLmxvY2snKTtcbiAgICBpZiAoZnMuZXhpc3RzU3luYyhsb2NrZmlsZVBhdGgpKSByZXR1cm4gbG9ja2ZpbGVQYXRoO1xuICAgIGlmIChkaXJQYXRoID09PSByZXBvc2l0b3J5Um9vdERpclBhdGgpIHJldHVybjtcblxuICAgIGRpclBhdGggPSBwYXRoLmRpcm5hbWUoZGlyUGF0aCk7XG4gIH1cbn1cblxuZnVuY3Rpb24gZmluZFJlcG9zaXRvcnlSb290RGlyUGF0aChzdGFydERpclBhdGg6IHN0cmluZyk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGxldCBkaXJQYXRoID0gc3RhcnREaXJQYXRoO1xuICB3aGlsZSAodHJ1ZSkge1xuICAgIGlmIChmcy5leGlzdHNTeW5jKHBhdGguam9pbihkaXJQYXRoLCAnLmdpdCcpKSkgcmV0dXJuIGRpclBhdGg7XG5cbiAgICBjb25zdCBwYXJlbnREaXJQYXRoID0gcGF0aC5kaXJuYW1lKGRpclBhdGgpO1xuICAgIGlmIChwYXJlbnREaXJQYXRoID09PSBkaXJQYXRoKSByZXR1cm47XG4gICAgZGlyUGF0aCA9IHBhcmVudERpclBhdGg7XG4gIH1cbn1cbiIsIi8qKiBXaGV0aGVyIGEgRG9ja2VyZmlsZSBjb25zdW1lcyB3YidzIGdlbmVyYXRlZCBub24tc2VjcmV0IGVudmlyb25tZW50IGRpcmVjdGx5IG9yIHRocm91Z2ggaXRzIGhlbHBlci4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjb25zdW1lc0RvY2tlckVudihkb2NrZXJmaWxlVGV4dDogc3RyaW5nKTogYm9vbGVhbiB7XG4gIHJldHVybiBkb2NrZXJmaWxlVGV4dFxuICAgIC5zcGxpdCgnXFxuJylcbiAgICAuc29tZSgobGluZSkgPT4gIS9eXFxzKiMvdS50ZXN0KGxpbmUpICYmIChsaW5lLmluY2x1ZGVzKCcuZG9ja2VyLmVudicpIHx8IGxpbmUuaW5jbHVkZXMoJ2FwcGx5LWRvY2tlci1lbnYuc2gnKSkpO1xufVxuIiwiZXhwb3J0IGNvbnN0IGdsb2JJZ25vcmUgPSBbXG4gICcqKi9ub2RlX21vZHVsZXMvKionLFxuICAnKiovLmFudGlncmF2aXR5Y2xpLyoqJyxcbiAgLy8gR2l0J3Mgb2JqZWN0IHN0b3JlIGhvbGRzIGNvcGllcyBvZiB0cmFja2VkIGZpbGVzIChhbmQgYGRvdDogdHJ1ZWAgbWFrZXMgdGhlbSB2aXNpYmxlKSwgc29cbiAgLy8gc2Nhbm5pbmcgaXQgd291bGQgYm90aCBzbG93IGV2ZXJ5IGdsb2IgZG93biBhbmQgbGV0IHN0YWxlIGJsb2JzIGluZmx1ZW5jZSBkZXRlY3Rpb24uXG4gICcqKi8uZ2l0LyoqJyxcbiAgLy8gVGhlIG9yZy1zdGFuZGFyZCB0ZW1wb3JhcnkgZGlyZWN0b3J5OyBzdGFsZSBjb3BpZXMgdW5kZXIgaXQgKGUuZy4gcmV2aWV3IHNjcmF0Y2ggZGlycykgbXVzdFxuICAvLyBub3QgaW5mbHVlbmNlIGxhbmd1YWdlIGRldGVjdGlvbi5cbiAgJyoqLy50bXAvKionLFxuICAnKiovLnRtcC0qLyoqJyxcbiAgLy8gTG9jYWwgY2FjaGVzIGNhbiBjb250YWluIGNvbXBsZXRlIHRoaXJkLXBhcnR5IHNvdXJjZSBjaGVja291dHMuIFRyZWF0aW5nIHRob3NlIGFzIHJlcG9zaXRvcnlcbiAgLy8gY29kZSBnZW5lcmF0ZXMgd29ya2Zsb3dzIGZvciBwYXRocyB0aGF0IGFyZSBnaXRpZ25vcmVkIGFuZCBhYnNlbnQgZnJvbSBmcmVzaCBDSSBjaGVja291dHMuXG4gICcqKi8uY2FjaGUvKionLFxuICAnKiovLnZlbnYvKionLFxuICAnKiovdGVzdC1maXh0dXJlcy8qKicsXG4gICcqKi90ZXN0L2ZpeHR1cmVzLyoqJyxcbiAgJyoqL2Rpc3QvKionLFxuICAnKiovYnVpbGQvKionLFxuICAnKiovdGFyZ2V0LyoqJyxcbiAgJyoqL3RlbXAvKionLFxuICAnKiovdG1wLyoqJyxcbl07XG4iLCJjbGFzcyBPcHRpb25zIHtcbiAgaXNWZXJib3NlID0gZmFsc2U7XG59XG5cbmV4cG9ydCBjb25zdCBvcHRpb25zID0gbmV3IE9wdGlvbnMoKTtcbiIsImltcG9ydCB7IG9wdGlvbnMgfSBmcm9tICcuL29wdGlvbnMuanMnO1xuXG5jbGFzcyBMb2dnZXIge1xuICBhc3luYyBmdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKG5hbWU6IHN0cmluZywgZnVuYzogKCkgPT4gUHJvbWlzZTx2b2lkPik6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmIChvcHRpb25zLmlzVmVyYm9zZSkge1xuICAgICAgY29uc29sZS5pbmZvKGAtLS0tLS0tLS0gJHtuYW1lfSBzdGFydCAtLS0tLS0tLS1gKTtcbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IGZ1bmMoKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgY29uc29sZS5pbmZvKGBFcnJvciBvY2N1cnJlZCBpbiAke25hbWV9OiAke2Vycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5zdGFjayA6IFN0cmluZyhlcnJvcil9fWApO1xuICAgIH1cbiAgICBpZiAob3B0aW9ucy5pc1ZlcmJvc2UpIHtcbiAgICAgIGNvbnNvbGUuaW5mbyhgLS0tLS0tLS0tLSAke25hbWV9IGVuZCAtLS0tLS0tLS0tYCk7XG4gICAgfVxuICB9XG59XG5cbmV4cG9ydCBjb25zdCBsb2dnZXIgPSBuZXcgTG9nZ2VyKCk7XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5sZXQgcmVhbFJvb3REaXJQYXRoOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG5cbmV4cG9ydCBjb25zdCBmc1V0aWwgPSB7XG4gIC8qKiBDb25maW5lcyBnZW5lcmF0ZUZpbGUgd3JpdGVzIHRvIHRoZSByZXBvc2l0b3J5IHJvb3RlZCBhdCByb290RGlyUGF0aCAodW5kZWZpbmVkIGRpc2FibGVzIGl0KS4gKi9cbiAgc2V0Um9vdERpclBhdGgocm9vdERpclBhdGg6IHN0cmluZyB8IHVuZGVmaW5lZCk6IHZvaWQge1xuICAgIHJlYWxSb290RGlyUGF0aCA9IHJvb3REaXJQYXRoID09PSB1bmRlZmluZWQgPyB1bmRlZmluZWQgOiBmcy5yZWFscGF0aFN5bmMocm9vdERpclBhdGgpO1xuICB9LFxuICAvKipcbiAgICogUmV0dXJucyB1bmRlZmluZWQgb25seSB3aGVuIHRoZSBmaWxlIGRvZXMgbm90IGV4aXN0LiBPdGhlciBmYWlsdXJlcyAoZS5nLiBwZXJtaXNzaW9ucykgYXJlXG4gICAqIHJldGhyb3duIHNvIGNhbGxlcnMgcmVnZW5lcmF0aW5nIGNvbmZpZyBmaWxlcyBuZXZlciBvdmVyd3JpdGUgY29udGVudCB0aGV5IGNvdWxkIG5vdCByZWFkLlxuICAgKi9cbiAgYXN5bmMgcmVhZEZpbGVJZkV4aXN0cyhmaWxlUGF0aDogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmcgfCB1bmRlZmluZWQ+IHtcbiAgICB0cnkge1xuICAgICAgcmV0dXJuIGF3YWl0IGZzLnByb21pc2VzLnJlYWRGaWxlKGZpbGVQYXRoLCAndXRmOCcpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBpZiAoKGVycm9yIGFzIE5vZGVKUy5FcnJub0V4Y2VwdGlvbikuY29kZSA9PT0gJ0VOT0VOVCcpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICB0aHJvdyBlcnJvcjtcbiAgICB9XG4gIH0sXG4gIC8qKiBUZWxscyB3aGV0aGVyIGEgd3JpdGUgdG8gZmlsZVBhdGggd291bGQgcGFzcyB0aGUgc3ltbGluay9yZXBvc2l0b3J5LWNvbnRhaW5tZW50IGd1YXJkcy4gKi9cbiAgYXN5bmMgaXNDb25maW5lZFdyaXRhYmxlUGF0aChmaWxlUGF0aDogc3RyaW5nKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgcmV0dXJuIGF3YWl0IGlzQ29uZmluZWRXcml0YWJsZVBhdGgoZmlsZVBhdGgpO1xuICB9LFxuICAvKipcbiAgICogUmVhZHMgYSBzb3VyY2UgZmlsZSwgcmV0dXJuaW5nIHVuZGVmaW5lZCB3aGVuIHRoZSBmaWxlIGRvZXMgbm90IGV4aXN0IE9SIHdoZW4gaXRcbiAgICogcmVzb2x2ZXMgb3V0c2lkZSB0aGUgcmVwb3NpdG9yeSDigJQgYSBjb21taXR0ZWQgc3ltbGluayBwb2ludGluZyBvdXRzaWRlIHRoZSByZXBvc2l0b3J5IG11c3RcbiAgICogbm90IGdldCBpdHMgdGFyZ2V0J3MgY29udGVudCBjb3BpZWQgaW50byBhIHRyYWNrZWQgZmlsZS4gQSBzeW1saW5rIHdob3NlIHJlc29sdmVkIHRhcmdldFxuICAgKiBzdGF5cyBpbnNpZGUgdGhlIHJlcG9zaXRvcnkgaXMgbGVnaXRpbWF0ZSAoZS5nLiBgLm5vZGUtdmVyc2lvbiAtPiAubnZtcmNgKSBhbmQgaXMgcmVhZC5cbiAgICovXG4gIGFzeW5jIHJlYWRGaWxlQ29uZmluZWRJZkV4aXN0cyhmaWxlUGF0aDogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmcgfCB1bmRlZmluZWQ+IHtcbiAgICBjb25zdCBzdGF0cyA9IGF3YWl0IGZzLnByb21pc2VzLmxzdGF0KGZpbGVQYXRoKS5jYXRjaCgoKSA9PiB7fSk7XG4gICAgaWYgKCFzdGF0cykgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICBpZiAoc3RhdHMuaXNTeW1ib2xpY0xpbmsoKSkge1xuICAgICAgbGV0IHJlYWxGaWxlUGF0aDogc3RyaW5nO1xuICAgICAgdHJ5IHtcbiAgICAgICAgcmVhbEZpbGVQYXRoID0gYXdhaXQgZnMucHJvbWlzZXMucmVhbHBhdGgoZmlsZVBhdGgpO1xuICAgICAgfSBjYXRjaCB7XG4gICAgICAgIGNvbnNvbGUud2FybihgU2tpcHBlZCByZWFkaW5nICR7ZmlsZVBhdGh9IGJlY2F1c2UgaXQgaXMgYSBkYW5nbGluZyBzeW1ib2xpYyBsaW5rLmApO1xuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgfVxuICAgICAgaWYgKFxuICAgICAgICByZWFsUm9vdERpclBhdGggIT09IHVuZGVmaW5lZCAmJlxuICAgICAgICByZWFsRmlsZVBhdGggIT09IHJlYWxSb290RGlyUGF0aCAmJlxuICAgICAgICAhcmVhbEZpbGVQYXRoLnN0YXJ0c1dpdGgocmVhbFJvb3REaXJQYXRoICsgcGF0aC5zZXApXG4gICAgICApIHtcbiAgICAgICAgY29uc29sZS53YXJuKGBTa2lwcGVkIHJlYWRpbmcgJHtmaWxlUGF0aH0gYmVjYXVzZSBpdCByZXNvbHZlcyBvdXRzaWRlIHRoZSByZXBvc2l0b3J5LmApO1xuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGF3YWl0IGZzVXRpbC5yZWFkRmlsZUlmRXhpc3RzKGZpbGVQYXRoKTtcbiAgICB9XG4gICAgaWYgKCEoYXdhaXQgaGFzQ29uZmluZWRQYXJlbnQoZmlsZVBhdGgpKSkge1xuICAgICAgY29uc29sZS53YXJuKGBTa2lwcGVkIHJlYWRpbmcgJHtmaWxlUGF0aH0gYmVjYXVzZSBpdCByZXNvbHZlcyBvdXRzaWRlIHRoZSByZXBvc2l0b3J5LmApO1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG4gICAgcmV0dXJuIGF3YWl0IGZzVXRpbC5yZWFkRmlsZUlmRXhpc3RzKGZpbGVQYXRoKTtcbiAgfSxcbiAgLyoqXG4gICAqIFJlbW92ZXMgZmlsZVBhdGggKGZvcmNlLCBvcHRpb25hbGx5IHJlY3Vyc2l2ZSkgb25seSB3aGVuIGl0cyBQQVJFTlQgZGlyZWN0b3J5IHJlc29sdmVzIGluc2lkZVxuICAgKiB0aGUgcmVwb3NpdG9yeSwgc28gYSBzeW1saW5rZWQgZGlyZWN0b3J5IChlLmcuIGEgY29tbWl0dGVkIC5naXRodWIvd29ya2Zsb3dzIGxpbmspIGNhbiBuZXZlclxuICAgKiBtYWtlIGNsZWFudXAgZGVsZXRlIGZpbGVzIG91dHNpZGUgdGhlIHJlcG9zaXRvcnkuIFJlbW92aW5nIGEgc3ltbGluayBlbnRyeSBpdHNlbGYgaXMgYWxsb3dlZDpcbiAgICogdGhhdCBkZWxldGVzIG9ubHkgdGhlIGxpbmssIG5ldmVyIGl0cyB0YXJnZXQuIFJldHVybnMgd2hldGhlciB0aGUgcmVtb3ZhbCB3YXMgcGVyZm9ybWVkLlxuICAgKi9cbiAgYXN5bmMgcmVtb3ZlQ29uZmluZWQoZmlsZVBhdGg6IHN0cmluZywgb3B0aW9ucz86IHsgcmVjdXJzaXZlPzogYm9vbGVhbiB9KTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgaWYgKCEoYXdhaXQgaGFzQ29uZmluZWRQYXJlbnQoZmlsZVBhdGgpKSkge1xuICAgICAgY29uc29sZS53YXJuKGBTa2lwcGVkIHJlbW92aW5nICR7ZmlsZVBhdGh9IGJlY2F1c2UgaXQgcmVzb2x2ZXMgb3V0c2lkZSB0aGUgcmVwb3NpdG9yeS5gKTtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgYXdhaXQgZnMucHJvbWlzZXMucm0oZmlsZVBhdGgsIHsgZm9yY2U6IHRydWUsIHJlY3Vyc2l2ZTogb3B0aW9ucz8ucmVjdXJzaXZlID8/IGZhbHNlIH0pO1xuICAgIHJldHVybiB0cnVlO1xuICB9LFxuICAvKiogV3JpdGVzIGNvbnRlbnQgdmVyYmF0aW0sIGFwcGx5aW5nIHRoZSBzYW1lIHN5bWxpbmsvcmVwb3NpdG9yeS1jb250YWlubWVudCBndWFyZHMgYXMgZ2VuZXJhdGVGaWxlLiAqL1xuICBhc3luYyB3cml0ZUZpbGVDb25maW5lZChmaWxlUGF0aDogc3RyaW5nLCBjb250ZW50OiBzdHJpbmcpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICBpZiAoIShhd2FpdCBpc0NvbmZpbmVkV3JpdGFibGVQYXRoKGZpbGVQYXRoKSkpIHJldHVybiBmYWxzZTtcbiAgICBhd2FpdCBmcy5wcm9taXNlcy53cml0ZUZpbGUoZmlsZVBhdGgsIGNvbnRlbnQpO1xuICAgIHJldHVybiB0cnVlO1xuICB9LFxuICAvKiogUmV0dXJucyB3aGV0aGVyIHRoZSBmaWxlIHdhcyBhY3R1YWxseSBnZW5lcmF0ZWQgKGZhbHNlIHdoZW4gdGhlIGNvbmZpbmVtZW50IGd1YXJkcyBza2lwIGl0KS4gKi9cbiAgYXN5bmMgZ2VuZXJhdGVGaWxlKGZpbGVQYXRoOiBzdHJpbmcsIGNvbnRlbnQ6IHN0cmluZywgbGluZUVuZGluZzogJ1xcbicgfCAnXFxyXFxuJyA9ICdcXG4nKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgaWYgKCEoYXdhaXQgaXNDb25maW5lZFdyaXRhYmxlUGF0aChmaWxlUGF0aCkpKSByZXR1cm4gZmFsc2U7XG4gICAgYXdhaXQgZnMucHJvbWlzZXMubWtkaXIocGF0aC5kaXJuYW1lKGZpbGVQYXRoKSwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gICAgLy8gYHRyaW1gIHRyZWF0cyBhIEJPTSBhcyB3aGl0ZXNwYWNlLCBzbyBpdCBpcyByZWF0dGFjaGVkIGF0IHBvc2l0aW9uIDA6IGRyb3BwaW5nIGl0IHdvdWxkXG4gICAgLy8gcmV3cml0ZSB0aGUgZW5jb2RpbmcgbWFya2VyIG9mIGEgZmlsZSB0aGUgZ2VuZXJhdG9yIHdhcyBvbmx5IGFza2VkIHRvIHVwZGF0ZS5cbiAgICBjb25zdCBieXRlT3JkZXJNYXJrID0gY29udGVudC5zdGFydHNXaXRoKCfvu78nKSA/ICfvu78nIDogJyc7XG4gICAgbGV0IG5vcm1hbGl6ZWRDb250ZW50ID0gY29udGVudC50cmltKCk7XG4gICAgaWYgKG5vcm1hbGl6ZWRDb250ZW50KSB7XG4gICAgICBub3JtYWxpemVkQ29udGVudCA9IGAke2J5dGVPcmRlck1hcmt9JHtub3JtYWxpemVkQ29udGVudH0ke2xpbmVFbmRpbmd9YDtcbiAgICB9XG4gICAgYXdhaXQgZnMucHJvbWlzZXMud3JpdGVGaWxlKGZpbGVQYXRoLCBub3JtYWxpemVkQ29udGVudCk7XG4gICAgY29uc29sZS5sb2coYEdlbmVyYXRlZC9VcGRhdGVkICR7ZmlsZVBhdGh9YCk7XG4gICAgcmV0dXJuIHRydWU7XG4gIH0sXG59O1xuXG5hc3luYyBmdW5jdGlvbiBpc0NvbmZpbmVkV3JpdGFibGVQYXRoKGZpbGVQYXRoOiBzdHJpbmcpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgLy8gTmV2ZXIgd3JpdGUgdGhyb3VnaCBhIHN5bWxpbms6IGEgKHBvc3NpYmx5IGRhbmdsaW5nKSBsaW5rIGNvbW1pdHRlZCBpbiB0aGUgdGFyZ2V0IHJlcG9zaXRvcnlcbiAgLy8gY291bGQgcmVkaXJlY3QgdGhlIHdyaXRlIG91dHNpZGUgaXQuXG4gIGNvbnN0IHN0YXRzID0gYXdhaXQgZnMucHJvbWlzZXMubHN0YXQoZmlsZVBhdGgpLmNhdGNoKCgpID0+IHt9KTtcbiAgaWYgKHN0YXRzPy5pc1N5bWJvbGljTGluaygpKSB7XG4gICAgY29uc29sZS53YXJuKGBTa2lwcGVkIHdyaXRpbmcgJHtmaWxlUGF0aH0gYmVjYXVzZSBpdCBpcyBhIHN5bWJvbGljIGxpbmsuYCk7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIGlmICghKGF3YWl0IGhhc0NvbmZpbmVkUGFyZW50KGZpbGVQYXRoKSkpIHtcbiAgICBjb25zb2xlLndhcm4oYFNraXBwZWQgd3JpdGluZyAke2ZpbGVQYXRofSBiZWNhdXNlIGl0IHJlc29sdmVzIG91dHNpZGUgdGhlIHJlcG9zaXRvcnkuYCk7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIHJldHVybiB0cnVlO1xufVxuXG4vLyBBIHN5bWxpbmtlZCBwYXJlbnQgZGlyZWN0b3J5IHdvdWxkIHJlZGlyZWN0IHJlYWRzLCB3cml0ZXMsIGFuZCByZW1vdmFscyBvdXRzaWRlIHRoZSByZXBvc2l0b3J5LFxuLy8gc28gcmVxdWlyZSB0aGUgY2xvc2VzdCBleGlzdGluZyBhbmNlc3RvciB0byByZXNvbHZlIGluc2lkZSB0aGUgcm9vdCBzZXQgYnkgdGhlIENMSSBlbnRyeSBwb2ludC5cbmFzeW5jIGZ1bmN0aW9uIGhhc0NvbmZpbmVkUGFyZW50KGZpbGVQYXRoOiBzdHJpbmcpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgaWYgKHJlYWxSb290RGlyUGF0aCA9PT0gdW5kZWZpbmVkKSByZXR1cm4gdHJ1ZTtcbiAgbGV0IGFuY2VzdG9yUGF0aCA9IHBhdGguZGlybmFtZShmaWxlUGF0aCk7XG4gIHdoaWxlICghZnMuZXhpc3RzU3luYyhhbmNlc3RvclBhdGgpKSB7XG4gICAgYW5jZXN0b3JQYXRoID0gcGF0aC5kaXJuYW1lKGFuY2VzdG9yUGF0aCk7XG4gIH1cbiAgY29uc3QgcmVhbEFuY2VzdG9yUGF0aCA9IGF3YWl0IGZzLnByb21pc2VzLnJlYWxwYXRoKGFuY2VzdG9yUGF0aCk7XG4gIHJldHVybiByZWFsQW5jZXN0b3JQYXRoID09PSByZWFsUm9vdERpclBhdGggfHwgcmVhbEFuY2VzdG9yUGF0aC5zdGFydHNXaXRoKHJlYWxSb290RGlyUGF0aCArIHBhdGguc2VwKTtcbn1cbiIsImltcG9ydCB7IFByb21pc2VQb29sIH0gZnJvbSAnbWluaW1hbC1wcm9taXNlLXBvb2wnO1xuXG5leHBvcnQgY29uc3QgcHJvbWlzZVBvb2wgPSBuZXcgUHJvbWlzZVBvb2woKTtcbiIsImltcG9ydCB7IEFQSSB9IGZyb20gJ3R5cGVzY3JpcHQvdW5zdGFibGUvYXN5bmMnO1xuaW1wb3J0IHR5cGUgeyBTb3VyY2VGaWxlIH0gZnJvbSAndHlwZXNjcmlwdC91bnN0YWJsZS9hc3QnO1xuXG4vLyBUeXBlU2NyaXB0IDcgc2hpcHMgdGhlIG5hdGl2ZSAoR28pIGNvbXBpbGVyIGFzIHRoZSBgdHlwZXNjcmlwdGAgcGFja2FnZSBhbmQgbm9cbi8vIGxvbmdlciBleHBvc2VzIGFuIGluLXByb2Nlc3MgcGFyc2VyIHN1Y2ggYXMgYHRzLmNyZWF0ZVNvdXJjZUZpbGVgLiBQYXJzaW5nIG5vd1xuLy8gaGFwcGVucyBpbiBhIHNwYXduZWQgY29tcGlsZXIgc2VydmVyIHJlYWNoZWQgdGhyb3VnaCB0aGUgYXN5bmNocm9ub3VzIEFQSSwgc28gd2Vcbi8vIGtlZXAgYSBzaW5nbGUgbGF6aWx5LWNyZWF0ZWQgaW5zdGFuY2UgYW5kIHJldXNlIGl0IGFjcm9zcyBldmVyeSBmaXhlciB0byBhdm9pZFxuLy8gcGF5aW5nIHRoZSBwcm9jZXNzLXNwYXduIGNvc3QgcGVyIGZpbGUuXG5sZXQgYXBpOiBBUEkgfCB1bmRlZmluZWQ7XG5sZXQgY29ubmVjdGVkOiBQcm9taXNlPHVua25vd24+IHwgdW5kZWZpbmVkO1xuXG4vKipcbiAqIFBhcnNlcyBhIHNvdXJjZSBmaWxlIGludG8gYSBUeXBlU2NyaXB0IEFTVCB1c2luZyB0aGUgYnVuZGxlZCBuYXRpdmUgY29tcGlsZXIuXG4gKiBSZXR1cm5zIGB1bmRlZmluZWRgIHdoZW4gdGhlIGNvbXBpbGVyIGNhbm5vdCBsb2FkIHRoZSBmaWxlIChlLmcuIGl0IGlzIG1pc3NpbmdcbiAqIG9yIHVucGFyc2FibGUpIHNvIGNhbGxlcnMgY2FuIGZhbGwgYmFjayB0byBjb25zZXJ2YXRpdmUgYmVoYXZpb3IuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBwYXJzZVNvdXJjZUZpbGUoZmlsZVBhdGg6IHN0cmluZyk6IFByb21pc2U8U291cmNlRmlsZSB8IHVuZGVmaW5lZD4ge1xuICB0cnkge1xuICAgIGNvbnN0IGFwaSA9IGF3YWl0IGdldEFwaSgpO1xuICAgIGNvbnN0IHNuYXBzaG90ID0gYXdhaXQgYXBpLnVwZGF0ZVNuYXBzaG90KHsgb3BlbkZpbGVzOiBbZmlsZVBhdGhdIH0pO1xuICAgIGNvbnN0IHByb2plY3QgPSBhd2FpdCBzbmFwc2hvdC5nZXREZWZhdWx0UHJvamVjdEZvckZpbGUoZmlsZVBhdGgpO1xuICAgIHJldHVybiBhd2FpdCBwcm9qZWN0Py5wcm9ncmFtLmdldFNvdXJjZUZpbGUoZmlsZVBhdGgpO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG59XG5cbi8qKlxuICogU2h1dHMgZG93biB0aGUgc3Bhd25lZCBjb21waWxlciBzZXJ2ZXIuIFRoZSBzZXJ2ZXIga2VlcHMgYW4gb3BlbiBJUEMgY2hhbm5lbFxuICogdGhhdCB3b3VsZCBvdGhlcndpc2Uga2VlcCB0aGUgcnVudGltZSBldmVudCBsb29wIGFsaXZlLCBzbyB3YmZ5IG11c3QgY2FsbCB0aGlzXG4gKiBvbmNlIGl0cyBydW4gZmluaXNoZXMgZm9yIHRoZSBwcm9jZXNzIHRvIGV4aXQuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBkaXNwb3NlVHlwZVNjcmlwdEFwaSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgYXdhaXQgYXBpPy5jbG9zZSgpO1xuICBhcGkgPSB1bmRlZmluZWQ7XG4gIGNvbm5lY3RlZCA9IHVuZGVmaW5lZDtcbn1cblxuYXN5bmMgZnVuY3Rpb24gZ2V0QXBpKCk6IFByb21pc2U8QVBJPiB7XG4gIGFwaSA/Pz0gbmV3IEFQSSh7IGN3ZDogcHJvY2Vzcy5jd2QoKSB9KTtcbiAgLy8gVGhlIGNsaWVudCBtYXJrcyBpdHNlbGYgY29ubmVjdGVkIG9ubHkgb25jZSBpdHMgZmlyc3Qgc3Bhd24gY29tcGxldGVzLCBzbyBjb25jdXJyZW50XG4gIC8vIGZpcnN0IHJlcXVlc3RzICh0aGUgZml4ZXJzIHJ1biBpbiBwYXJhbGxlbCkgd291bGQgZWFjaCBzcGF3biBhIGNvbXBpbGVyIHNlcnZlcjsgdGhlXG4gIC8vIGV4dHJhIHNlcnZlcnMgYXJlIG5ldmVyIGNsb3NlZCBhbmQga2VlcCB0aGUgcHJvY2VzcyBhbGl2ZSBhZnRlciBgZGlzcG9zZVR5cGVTY3JpcHRBcGlgLlxuICAvLyBUaGUgZmlyc3QgcmVxdWVzdCBpcyB0aGVyZWZvcmUgYXdhaXRlZCBvbmNlIGJlZm9yZSBhbnkgb3RoZXIgaXMgc2VudDsgYSBmYWlsZWQgb25lIGlzXG4gIC8vIGZvcmdvdHRlbiBzbyB0aGF0IHRoZSBuZXh0IHJlcXVlc3QgY29ubmVjdHMgYWdhaW4gaW5zdGVhZCBvZiBmYWlsaW5nIGZvciB0aGUgd2hvbGUgcnVuLlxuICBjb25uZWN0ZWQgPz89IGFwaS51cGRhdGVTbmFwc2hvdCgpLmNhdGNoKChlcnJvcjogdW5rbm93bikgPT4ge1xuICAgIGNvbm5lY3RlZCA9IHVuZGVmaW5lZDtcbiAgICB0aHJvdyBlcnJvcjtcbiAgfSk7XG4gIGF3YWl0IGNvbm5lY3RlZDtcbiAgcmV0dXJuIGFwaTtcbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCAqIGFzIGFzdCBmcm9tICd0eXBlc2NyaXB0L3Vuc3RhYmxlL2FzdCc7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGZzVXRpbCB9IGZyb20gJy4uL3V0aWxzL2ZzVXRpbC5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcbmltcG9ydCB7IHBhcnNlU291cmNlRmlsZSB9IGZyb20gJy4uL3V0aWxzL3R5cGVzY3JpcHRBcGkuanMnO1xuXG4vLyBTZXR0aW5ncyBldmVyeSBXaWxsQm9vc3RlciBOZXh0LmpzIHByb2plY3Qgc2hvdWxkIGNhcnJ5LiBgbmFtZWAgaXMgdGhlIHRvcC1sZXZlbFxuLy8gcHJvcGVydHkga2V5IHVzZWQgdG8gZGV0ZWN0IHdoZXRoZXIgdGhlIHNldHRpbmcgYWxyZWFkeSBleGlzdHM7IGB0ZXh0YCBpcyBpbnNlcnRlZFxuLy8gdmVyYmF0aW0gKGEgd2hvbGUgYGtleTogdmFsdWVgIHBhaXIpIHdoZW4gdGhlIGtleSBpcyBtaXNzaW5nLlxuY29uc3QgbWFuYWdlZFByb3BlcnRpZXM6IHJlYWRvbmx5IHsgbmFtZTogc3RyaW5nOyB0ZXh0OiBzdHJpbmcgfVtdID0gW1xuICB7IG5hbWU6ICdyZWFjdENvbXBpbGVyJywgdGV4dDogJ3JlYWN0Q29tcGlsZXI6IHRydWUnIH0sXG4gIHsgbmFtZTogJ3JlYWN0U3RyaWN0TW9kZScsIHRleHQ6ICdyZWFjdFN0cmljdE1vZGU6IHRydWUnIH0sXG4gIHsgbmFtZTogJ3R5cGVzY3JpcHQnLCB0ZXh0OiAndHlwZXNjcmlwdDogeyBpZ25vcmVCdWlsZEVycm9yczogdHJ1ZSB9JyB9LFxuXTtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGZpeE5leHRDb25maWdKc29uKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2ZpeE5leHRDb25maWdKc29uJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IGZpbGVQYXRoID0gWyd0cycsICdtdHMnLCAnY3RzJywgJ2pzJywgJ21qcycsICdjanMnXVxuICAgICAgLm1hcCgoZXh0KSA9PiBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsIGBuZXh0LmNvbmZpZy4ke2V4dH1gKSlcbiAgICAgIC5maW5kKChwKSA9PiBmcy5leGlzdHNTeW5jKHApKTtcbiAgICBpZiAoIWZpbGVQYXRoKSByZXR1cm47XG5cbiAgICBjb25zdCBleHRyYWN0ZWQgPSBhd2FpdCBnZXROZXh0Q29uZmlnT2JqZWN0TGl0ZXJhbChmaWxlUGF0aCk7XG4gICAgaWYgKCFleHRyYWN0ZWQpIHJldHVybjtcbiAgICBjb25zdCB7IHNvdXJjZSwgb2JqZWN0TGl0ZXJhbCB9ID0gZXh0cmFjdGVkO1xuXG4gICAgLy8gYHByb3BlcnRpZXNgIGluY2x1ZGVzIHNwcmVhZCBhc3NpZ25tZW50cyAoYC4uLnJlc3RgKSB0aGF0IGNhcnJ5IG5vIG5hbWUsIHNvIGd1YXJkIGJlZm9yZSByZWFkaW5nIGl0LlxuICAgIGNvbnN0IGV4aXN0aW5nUHJvcGVydGllcyA9IG5ldyBTZXQoXG4gICAgICBvYmplY3RMaXRlcmFsLnByb3BlcnRpZXMubWFwKChwcm9wZXJ0eSkgPT5cbiAgICAgICAgJ25hbWUnIGluIHByb3BlcnR5ICYmIHByb3BlcnR5Lm5hbWUgPyBnZXRQcm9wZXJ0eUtleShwcm9wZXJ0eS5uYW1lLCBzb3VyY2UpIDogdW5kZWZpbmVkXG4gICAgICApXG4gICAgKTtcbiAgICBjb25zdCBwcm9wZXJ0eVRleHRzID0gbWFuYWdlZFByb3BlcnRpZXNcbiAgICAgIC5maWx0ZXIoKHByb3BlcnR5KSA9PiAhZXhpc3RpbmdQcm9wZXJ0aWVzLmhhcyhwcm9wZXJ0eS5uYW1lKSlcbiAgICAgIC5tYXAoKHByb3BlcnR5KSA9PiBwcm9wZXJ0eS50ZXh0KTtcbiAgICBpZiAocHJvcGVydHlUZXh0cy5sZW5ndGggPT09IDApIHJldHVybjtcblxuICAgIGNvbnN0IG9sZENvbnRlbnQgPSBzb3VyY2UudGV4dDtcbiAgICBjb25zdCBpbnNlcnRpb25Qb2ludCA9IG9iamVjdExpdGVyYWwuZ2V0RW5kKCkgLSAxO1xuICAgIC8vIFRoZSBuYXRpdmUgVFMgQVNUIGRvZXMgbm90IHJlbGlhYmx5IGV4cG9zZSBgcHJvcGVydGllcy5oYXNUcmFpbGluZ0NvbW1hYCwgc28gc2NhbiB0aGUgc291cmNlXG4gICAgLy8gYmV0d2VlbiB0aGUgbGFzdCBwcm9wZXJ0eSBhbmQgdGhlIGNsb3NpbmcgYnJhY2UuIFN0cmlwIGNvbW1lbnRzIGZpcnN0IHNvIGEgY29tbWEgaW5zaWRlIGFcbiAgICAvLyB0cmFpbGluZyBjb21tZW50IChlLmcuIGBmb286IDEgLy8gYSwgYmApIGlzIG5vdCBtaXN0YWtlbiBmb3IgYSByZWFsIHRyYWlsaW5nIGNvbW1hLlxuICAgIGNvbnN0IGxhc3RQcm9wZXJ0eSA9IG9iamVjdExpdGVyYWwucHJvcGVydGllcy5hdCgtMSk7XG4gICAgY29uc3QgaGFzVHJhaWxpbmdDb21tYSA9IGxhc3RQcm9wZXJ0eVxuICAgICAgPyBzdHJpcENvbW1lbnRzKG9sZENvbnRlbnQuc2xpY2UobGFzdFByb3BlcnR5LmdldEVuZCgpLCBpbnNlcnRpb25Qb2ludCkpLmluY2x1ZGVzKCcsJylcbiAgICAgIDogZmFsc2U7XG4gICAgY29uc3QgcHJlZml4ID0gb2JqZWN0TGl0ZXJhbC5wcm9wZXJ0aWVzLmxlbmd0aCA+IDAgJiYgIWhhc1RyYWlsaW5nQ29tbWEgPyAnLCAnIDogJyc7XG4gICAgY29uc3QgbmV3Q29udGVudCA9IGAke29sZENvbnRlbnQuc2xpY2UoMCwgaW5zZXJ0aW9uUG9pbnQpfSR7cHJlZml4fSR7cHJvcGVydHlUZXh0cy5qb2luKCcsICcpfSR7b2xkQ29udGVudC5zbGljZShcbiAgICAgIGluc2VydGlvblBvaW50XG4gICAgKX1gO1xuICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiBmc1V0aWwuZ2VuZXJhdGVGaWxlKGZpbGVQYXRoLCBuZXdDb250ZW50KSk7XG4gIH0pO1xufVxuXG5hc3luYyBmdW5jdGlvbiBnZXROZXh0Q29uZmlnT2JqZWN0TGl0ZXJhbChcbiAgZmlsZVBhdGg6IHN0cmluZ1xuKTogUHJvbWlzZTx7IHNvdXJjZTogYXN0LlNvdXJjZUZpbGU7IG9iamVjdExpdGVyYWw6IGFzdC5PYmplY3RMaXRlcmFsRXhwcmVzc2lvbiB9IHwgdW5kZWZpbmVkPiB7XG4gIGNvbnN0IHNvdXJjZSA9IGF3YWl0IHBhcnNlU291cmNlRmlsZShmaWxlUGF0aCk7XG4gIGlmICghc291cmNlKSByZXR1cm4gdW5kZWZpbmVkO1xuXG4gIC8vIFRoZSBXaWxsQm9vc3RlciBzdGFuZGFyZCBkZWNsYXJlcyB0aGUgY29uZmlnIGFzIGBjb25zdCBuZXh0Q29uZmlnOiBOZXh0Q29uZmlnID0geyAuLi4gfWAgYW5kXG4gIC8vIGV4cG9ydHMgaXQgKHBvc3NpYmx5IHdyYXBwZWQsIGUuZy4gYHdpdGhTZW50cnlDb25maWcoLi4uKWApLCBzbyB0aGUgb2JqZWN0IGxpdGVyYWwgaXMgcmFyZWx5XG4gIC8vIHRoZSBkaXJlY3Qgb3BlcmFuZCBvZiBgZXhwb3J0IGRlZmF1bHRgL2Btb2R1bGUuZXhwb3J0c2AuIENvbGxlY3QgZXZlcnkgY2FuZGlkYXRlIGFuZCBwaWNrIHRoZVxuICAvLyBtb3N0IGF1dGhvcml0YXRpdmUgb25lIGJlbG93LlxuICBsZXQgZGlyZWN0T2JqZWN0TGl0ZXJhbDogYXN0Lk9iamVjdExpdGVyYWxFeHByZXNzaW9uIHwgdW5kZWZpbmVkO1xuICBsZXQgZXhwb3J0ZWRJZGVudGlmaWVyOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gIGNvbnN0IHZhcmlhYmxlT2JqZWN0TGl0ZXJhbHMgPSBuZXcgTWFwPHN0cmluZywgYXN0Lk9iamVjdExpdGVyYWxFeHByZXNzaW9uPigpO1xuICBjb25zdCB0eXBlZENvbmZpZ09iamVjdExpdGVyYWxzOiBhc3QuT2JqZWN0TGl0ZXJhbEV4cHJlc3Npb25bXSA9IFtdO1xuXG4gIGNvbnN0IHZpc2l0ID0gKG5vZGU6IGFzdC5Ob2RlKTogdm9pZCA9PiB7XG4gICAgaWYgKGFzdC5pc0V4cG9ydEFzc2lnbm1lbnQobm9kZSkpIHtcbiAgICAgIGNvbnN0IG9iamVjdExpdGVyYWwgPSB1bndyYXBPYmplY3RMaXRlcmFsKG5vZGUuZXhwcmVzc2lvbik7XG4gICAgICBpZiAob2JqZWN0TGl0ZXJhbCkge1xuICAgICAgICBkaXJlY3RPYmplY3RMaXRlcmFsID8/PSBvYmplY3RMaXRlcmFsO1xuICAgICAgfSBlbHNlIGlmIChhc3QuaXNJZGVudGlmaWVyKG5vZGUuZXhwcmVzc2lvbikpIHtcbiAgICAgICAgZXhwb3J0ZWRJZGVudGlmaWVyID8/PSBub2RlLmV4cHJlc3Npb24uZ2V0VGV4dChzb3VyY2UpO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoXG4gICAgICBhc3QuaXNCaW5hcnlFeHByZXNzaW9uKG5vZGUpICYmXG4gICAgICBub2RlLm9wZXJhdG9yVG9rZW4ua2luZCA9PT0gYXN0LlN5bnRheEtpbmQuRXF1YWxzVG9rZW4gJiZcbiAgICAgIG5vZGUubGVmdC5nZXRUZXh0KHNvdXJjZSkgPT09ICdtb2R1bGUuZXhwb3J0cydcbiAgICApIHtcbiAgICAgIGNvbnN0IG9iamVjdExpdGVyYWwgPSB1bndyYXBPYmplY3RMaXRlcmFsKG5vZGUucmlnaHQpO1xuICAgICAgaWYgKG9iamVjdExpdGVyYWwpIHtcbiAgICAgICAgZGlyZWN0T2JqZWN0TGl0ZXJhbCA/Pz0gb2JqZWN0TGl0ZXJhbDtcbiAgICAgIH0gZWxzZSBpZiAoYXN0LmlzSWRlbnRpZmllcihub2RlLnJpZ2h0KSkge1xuICAgICAgICBleHBvcnRlZElkZW50aWZpZXIgPz89IG5vZGUucmlnaHQuZ2V0VGV4dChzb3VyY2UpO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoYXN0LmlzVmFyaWFibGVEZWNsYXJhdGlvbihub2RlKSAmJiBub2RlLmluaXRpYWxpemVyKSB7XG4gICAgICBjb25zdCBvYmplY3RMaXRlcmFsID0gdW53cmFwT2JqZWN0TGl0ZXJhbChub2RlLmluaXRpYWxpemVyKTtcbiAgICAgIGlmIChvYmplY3RMaXRlcmFsICYmIGFzdC5pc0lkZW50aWZpZXIobm9kZS5uYW1lKSkge1xuICAgICAgICB2YXJpYWJsZU9iamVjdExpdGVyYWxzLnNldChub2RlLm5hbWUuZ2V0VGV4dChzb3VyY2UpLCBvYmplY3RMaXRlcmFsKTtcbiAgICAgICAgLy8gVGhlIGA6IE5leHRDb25maWdgIGFubm90YXRpb24gd2JmeSB3cml0ZXMgbWFya3MgdGhlIGNhbm9uaWNhbCBjb25maWcgb2JqZWN0IChhY2NlcHRpbmdcbiAgICAgICAgLy8gcXVhbGlmaWVkIG5hbWVzIHN1Y2ggYXMgYGltcG9ydCgnbmV4dCcpLk5leHRDb25maWdgKS5cbiAgICAgICAgY29uc3QgYW5ub3RhdGlvblR5cGUgPSBub2RlLnR5cGU/LmdldFRleHQoc291cmNlKTtcbiAgICAgICAgaWYgKGFubm90YXRpb25UeXBlICE9PSB1bmRlZmluZWQgJiYgaXNOZXh0Q29uZmlnVHlwZShhbm5vdGF0aW9uVHlwZSkpIHtcbiAgICAgICAgICB0eXBlZENvbmZpZ09iamVjdExpdGVyYWxzLnB1c2gob2JqZWN0TGl0ZXJhbCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgbm9kZS5mb3JFYWNoQ2hpbGQodmlzaXQpO1xuICB9O1xuICBzb3VyY2UuZm9yRWFjaENoaWxkKHZpc2l0KTtcblxuICBjb25zdCBvYmplY3RMaXRlcmFsID1cbiAgICB0eXBlZENvbmZpZ09iamVjdExpdGVyYWxzWzBdID8/XG4gICAgZGlyZWN0T2JqZWN0TGl0ZXJhbCA/P1xuICAgIChleHBvcnRlZElkZW50aWZpZXIgPyB2YXJpYWJsZU9iamVjdExpdGVyYWxzLmdldChleHBvcnRlZElkZW50aWZpZXIpIDogdW5kZWZpbmVkKSA/P1xuICAgIHZhcmlhYmxlT2JqZWN0TGl0ZXJhbHMuZ2V0KCduZXh0Q29uZmlnJyk7XG4gIHJldHVybiBvYmplY3RMaXRlcmFsID8geyBzb3VyY2UsIG9iamVjdExpdGVyYWwgfSA6IHVuZGVmaW5lZDtcbn1cblxuZnVuY3Rpb24gdW53cmFwT2JqZWN0TGl0ZXJhbChub2RlOiBhc3QuRXhwcmVzc2lvbik6IGFzdC5PYmplY3RMaXRlcmFsRXhwcmVzc2lvbiB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IGN1cnJlbnQgPSB1bndyYXBQYXJlbnRoZXNlcyhub2RlKTtcbiAgcmV0dXJuIGFzdC5pc09iamVjdExpdGVyYWxFeHByZXNzaW9uKGN1cnJlbnQpID8gY3VycmVudCA6IHVuZGVmaW5lZDtcbn1cblxuZnVuY3Rpb24gdW53cmFwUGFyZW50aGVzZXMobm9kZTogYXN0LkV4cHJlc3Npb24pOiBhc3QuRXhwcmVzc2lvbiB7XG4gIGxldCBjdXJyZW50ID0gbm9kZTtcbiAgd2hpbGUgKGFzdC5pc1BhcmVudGhlc2l6ZWRFeHByZXNzaW9uKGN1cnJlbnQpKSB7XG4gICAgY3VycmVudCA9IGN1cnJlbnQuZXhwcmVzc2lvbjtcbiAgfVxuICByZXR1cm4gY3VycmVudDtcbn1cblxuLy8gTWF0Y2ggYm90aCB0aGUgYmFyZSBgTmV4dENvbmZpZ2AgYW5kIHF1YWxpZmllZCBmb3JtcyBsaWtlIGBpbXBvcnQoJ25leHQnKS5OZXh0Q29uZmlnYC5cbmZ1bmN0aW9uIGlzTmV4dENvbmZpZ1R5cGUodHlwZVRleHQ6IHN0cmluZyk6IGJvb2xlYW4ge1xuICByZXR1cm4gdHlwZVRleHQgPT09ICdOZXh0Q29uZmlnJyB8fCB0eXBlVGV4dC5lbmRzV2l0aCgnLk5leHRDb25maWcnKTtcbn1cblxuLy8gUmV0dXJuIGEgcHJvcGVydHkga2V5IHdpdGhvdXQgc3Vycm91bmRpbmcgcXVvdGVzLCBzbyBgJ3JlYWN0Q29tcGlsZXInYCBtYXRjaGVzIGByZWFjdENvbXBpbGVyYC5cbi8vIElkZW50aWZpZXIsIHN0cmluZy1saXRlcmFsIGFuZCBudW1lcmljLWxpdGVyYWwgbmFtZXMgYWxsIGV4cG9zZSB0aGUgdW5xdW90ZWQgdmFsdWUgdmlhIGAudGV4dGAuXG5mdW5jdGlvbiBnZXRQcm9wZXJ0eUtleShuYW1lOiBhc3QuUHJvcGVydHlOYW1lLCBzb3VyY2U6IGFzdC5Tb3VyY2VGaWxlKTogc3RyaW5nIHtcbiAgcmV0dXJuICd0ZXh0JyBpbiBuYW1lICYmIHR5cGVvZiBuYW1lLnRleHQgPT09ICdzdHJpbmcnID8gbmFtZS50ZXh0IDogbmFtZS5nZXRUZXh0KHNvdXJjZSk7XG59XG5cbmZ1bmN0aW9uIHN0cmlwQ29tbWVudHModGV4dDogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIHRleHQucmVwbGFjZUFsbCgvXFwvXFwvW15cXG5dKnxcXC9cXCpbXFxzXFxTXSo/XFwqXFwvL2csICcnKTtcbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzL3Byb21pc2VzJztcblxuaW1wb3J0IGZnIGZyb20gJ2Zhc3QtZ2xvYic7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGZzVXRpbCB9IGZyb20gJy4uL3V0aWxzL2ZzVXRpbC5qcyc7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBmaXhDaGFrcmFUb2FzdGVyKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2ZpeENoYWtyYVRvYXN0ZXInLCBhc3luYyAoKSA9PiB7XG4gICAgaWYgKCFjb25maWcuZGVwZW5kaW5nLmNoYWtyYSkgcmV0dXJuO1xuXG4gICAgY29uc3QgZmlsZVBhdGhzID0gYXdhaXQgZmcuZ2xvYignKiovdG9hc3Rlci57dHMsdHN4fScsIHtcbiAgICAgIGFic29sdXRlOiB0cnVlLFxuICAgICAgY3dkOiBjb25maWcuZGlyUGF0aCxcbiAgICAgIGlnbm9yZTogWycqKi8uKi8qKicsICcqKi9ub2RlX21vZHVsZXMvKionXSxcbiAgICB9KTtcbiAgICBmb3IgKGNvbnN0IGZpbGVQYXRoIG9mIGZpbGVQYXRocykge1xuICAgICAgY29uc3QgY29udGVudCA9IGF3YWl0IGZzLnJlYWRGaWxlKGZpbGVQYXRoLCAndXRmOCcpO1xuICAgICAgaWYgKFxuICAgICAgICBjb250ZW50LmluY2x1ZGVzKCdDcmVhdGVUb2FzdGVyUmV0dXJuJykgfHxcbiAgICAgICAgIWNvbnRlbnQuaW5jbHVkZXMoXCJmcm9tICdAY2hha3JhLXVpL3JlYWN0J1wiKSB8fFxuICAgICAgICAhY29udGVudC5pbmNsdWRlcygnZXhwb3J0IGNvbnN0IHRvYXN0ZXIgPSBjcmVhdGVUb2FzdGVyKCcpXG4gICAgICApIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBjb25zdCB1cGRhdGVkQ29udGVudCA9IGNvbnRlbnRcbiAgICAgICAgLnJlcGxhY2UoXG4gICAgICAgICAgL15pbXBvcnQgLiogZnJvbSAnQGNoYWtyYS11aVxcL3JlYWN0JzskL211LFxuICAgICAgICAgIFwiJCZcXG5pbXBvcnQgdHlwZSB7IENyZWF0ZVRvYXN0ZXJSZXR1cm4gfSBmcm9tICdAY2hha3JhLXVpL3JlYWN0JztcIlxuICAgICAgICApXG4gICAgICAgIC5yZXBsYWNlKCdleHBvcnQgY29uc3QgdG9hc3RlciA9IGNyZWF0ZVRvYXN0ZXIoJywgJ2V4cG9ydCBjb25zdCB0b2FzdGVyOiBDcmVhdGVUb2FzdGVyUmV0dXJuID0gY3JlYXRlVG9hc3RlcignKTtcbiAgICAgIGlmICh1cGRhdGVkQ29udGVudCAhPT0gY29udGVudCkgYXdhaXQgZnNVdGlsLmdlbmVyYXRlRmlsZShmaWxlUGF0aCwgdXBkYXRlZENvbnRlbnQpO1xuICAgIH1cbiAgfSk7XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgKiBhcyBhc3QgZnJvbSAndHlwZXNjcmlwdC91bnN0YWJsZS9hc3QnO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBmc1V0aWwgfSBmcm9tICcuLi91dGlscy9mc1V0aWwuanMnO1xuaW1wb3J0IHsgcHJvbWlzZVBvb2wgfSBmcm9tICcuLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5pbXBvcnQgeyBwYXJzZVNvdXJjZUZpbGUgfSBmcm9tICcuLi91dGlscy90eXBlc2NyaXB0QXBpLmpzJztcblxudHlwZSBQYXJzZWRWYWx1ZSA9XG4gIHwgeyBraW5kOiAnYXJyYXknOyB2YWx1ZTogUGFyc2VkVmFsdWVbXSB9XG4gIHwgeyBraW5kOiAnbGl0ZXJhbCc7IHZhbHVlOiBzdHJpbmcgfVxuICB8IHsga2luZDogJ29iamVjdCc7IHZhbHVlOiBQYXJzZWRPYmplY3QgfTtcbnR5cGUgT2JqZWN0TWVtYmVyID0geyBraW5kOiAnZXh0cmEnOyBpbmRleDogbnVtYmVyIH0gfCB7IGtpbmQ6ICdwcm9wZXJ0eSc7IGtleTogc3RyaW5nIH07XG5pbnRlcmZhY2UgUGFyc2VkT2JqZWN0IHtcbiAgZXh0cmFNZW1iZXJzOiBzdHJpbmdbXTtcbiAgbWVtYmVyT3JkZXI6IE9iamVjdE1lbWJlcltdO1xuICBwcm9wZXJ0aWVzOiBSZWNvcmQ8c3RyaW5nLCBQYXJzZWRWYWx1ZT47XG59XG5pbnRlcmZhY2UgRXh0cmFjdGVkT2JqZWN0TGl0ZXJhbCB7XG4gIHNvdXJjZTogYXN0LlNvdXJjZUZpbGU7XG4gIG5vZGU6IGFzdC5PYmplY3RMaXRlcmFsRXhwcmVzc2lvbjtcbn1cbmNvbnN0IGxpdGVyYWwgPSAodmFsdWU6IHN0cmluZyk6IFBhcnNlZFZhbHVlID0+ICh7IGtpbmQ6ICdsaXRlcmFsJywgdmFsdWUgfSk7XG5jb25zdCBhc0FycmF5ID0gKHZhbHVlOiBQYXJzZWRWYWx1ZVtdKTogUGFyc2VkVmFsdWUgPT4gKHsga2luZDogJ2FycmF5JywgdmFsdWUgfSk7XG5jb25zdCBhc09iamVjdCA9IChwcm9wZXJ0aWVzOiBSZWNvcmQ8c3RyaW5nLCBQYXJzZWRWYWx1ZT4sIGV4dHJhTWVtYmVyczogc3RyaW5nW10gPSBbXSk6IFBhcnNlZFZhbHVlID0+ICh7XG4gIGtpbmQ6ICdvYmplY3QnLFxuICB2YWx1ZTogdG9QYXJzZWRPYmplY3QocHJvcGVydGllcywgZXh0cmFNZW1iZXJzKSxcbn0pO1xuXG5mdW5jdGlvbiBjcmVhdGVEZWZhdWx0Q29uZmlnKGNvbmZpZzogUGFja2FnZUNvbmZpZywgc2hvdWxkVXNlQXBwU2VydmVyRGVmYXVsdHM6IGJvb2xlYW4pOiBQYXJzZWRPYmplY3Qge1xuICBjb25zdCB1c2UgPSB0b1BhcnNlZE9iamVjdCh7XG4gICAgdHJhY2U6IGxpdGVyYWwoXCJwcm9jZXNzLmVudi5DSSA/ICdvbi1maXJzdC1yZXRyeScgOiAncmV0YWluLW9uLWZhaWx1cmUnXCIpLFxuICAgIHNjcmVlbnNob3Q6IGxpdGVyYWwoXCJwcm9jZXNzLmVudi5DSSA/ICdvbmx5LW9uLWZhaWx1cmUnIDogJ29uJ1wiKSxcbiAgICB2aWRlbzogbGl0ZXJhbChcInByb2Nlc3MuZW52LkNJID8gJ29uLWZpcnN0LXJldHJ5JyA6ICdyZXRhaW4tb24tZmFpbHVyZSdcIiksXG4gIH0pO1xuXG4gIGlmIChzaG91bGRVc2VBcHBTZXJ2ZXJEZWZhdWx0cykge1xuICAgIHVzZS5wcm9wZXJ0aWVzLmJhc2VVUkwgPSBsaXRlcmFsKCdwcm9jZXNzLmVudi5ORVhUX1BVQkxJQ19CQVNFX1VSTCcpO1xuICAgIHVzZS5tZW1iZXJPcmRlci51bnNoaWZ0KHsga2luZDogJ3Byb3BlcnR5Jywga2V5OiAnYmFzZVVSTCcgfSk7XG4gIH1cblxuICByZXR1cm4gdG9QYXJzZWRPYmplY3Qoe1xuICAgIGZvcmJpZE9ubHk6IGxpdGVyYWwoJyEhcHJvY2Vzcy5lbnYuQ0knKSxcbiAgICByZXRyaWVzOiBsaXRlcmFsKCdwcm9jZXNzLmVudi5QV0RFQlVHID8gMCA6IHByb2Nlc3MuZW52LkNJID8gNSA6IDEnKSxcbiAgICB1c2U6IHsga2luZDogJ29iamVjdCcsIHZhbHVlOiB1c2UgfSxcbiAgICAuLi4oc2hvdWxkVXNlQXBwU2VydmVyRGVmYXVsdHNcbiAgICAgID8ge1xuICAgICAgICAgIHdlYlNlcnZlcjogYXNPYmplY3Qoe1xuICAgICAgICAgICAgY29tbWFuZDogbGl0ZXJhbChnZXRXYlN0YXJ0VGVzdENvbW1hbmQoKSksXG4gICAgICAgICAgICB1cmw6IGxpdGVyYWwoJ3Byb2Nlc3MuZW52Lk5FWFRfUFVCTElDX0JBU0VfVVJMJyksXG4gICAgICAgICAgICByZXVzZUV4aXN0aW5nU2VydmVyOiBsaXRlcmFsKCchIXByb2Nlc3MuZW52LkNJJyksXG4gICAgICAgICAgICB0aW1lb3V0OiBsaXRlcmFsKCczMDBfMDAwJyksXG4gICAgICAgICAgICBzdGRvdXQ6IGxpdGVyYWwoXCIncGlwZSdcIiksXG4gICAgICAgICAgICBzdGRlcnI6IGxpdGVyYWwoXCIncGlwZSdcIiksXG4gICAgICAgICAgICBlbnY6IGxpdGVyYWwoYHtcbiAgLi4ucHJvY2Vzcy5lbnYsXG4gIFBSSVNNQV9VU0VSX0NPTlNFTlRfRk9SX0RBTkdFUk9VU19BSV9BQ1RJT046ICd0cnVlJyxcbn1gKSxcbiAgICAgICAgICAgIGdyYWNlZnVsU2h1dGRvd246IGxpdGVyYWwoYHtcbiAgc2lnbmFsOiAnU0lHVEVSTScsXG4gIHRpbWVvdXQ6IDUwMCxcbn1gKSxcbiAgICAgICAgICB9KSxcbiAgICAgICAgfVxuICAgICAgOiB7fSksXG4gIH0pO1xufVxuXG5mdW5jdGlvbiB0b1BhcnNlZE9iamVjdChwcm9wZXJ0aWVzOiBSZWNvcmQ8c3RyaW5nLCBQYXJzZWRWYWx1ZT4sIGV4dHJhTWVtYmVyczogc3RyaW5nW10gPSBbXSk6IFBhcnNlZE9iamVjdCB7XG4gIHJldHVybiB7XG4gICAgZXh0cmFNZW1iZXJzLFxuICAgIG1lbWJlck9yZGVyOiBbXG4gICAgICAuLi5PYmplY3Qua2V5cyhwcm9wZXJ0aWVzKS5tYXAoKGtleSk6IE9iamVjdE1lbWJlciA9PiAoeyBraW5kOiAncHJvcGVydHknLCBrZXkgfSkpLFxuICAgICAgLi4uZXh0cmFNZW1iZXJzLm1hcCgoXywgaW5kZXgpOiBPYmplY3RNZW1iZXIgPT4gKHsga2luZDogJ2V4dHJhJywgaW5kZXggfSkpLFxuICAgIF0sXG4gICAgcHJvcGVydGllcyxcbiAgfTtcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGZpeFBsYXl3cmlnaHRDb25maWcoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCBgcGxheXdyaWdodC5jb25maWcudHNgKTtcbiAgaWYgKCFmcy5leGlzdHNTeW5jKGZpbGVQYXRoKSkgcmV0dXJuO1xuXG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZml4UGxheXdyaWdodENvbmZpZycsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBleHRyYWN0ZWRPYmplY3RMaXRlcmFsID0gYXdhaXQgZXh0cmFjdERlZmluZUNvbmZpZ09iamVjdExpdGVyYWwoZmlsZVBhdGgpO1xuICAgIGlmICghZXh0cmFjdGVkT2JqZWN0TGl0ZXJhbCkgcmV0dXJuO1xuXG4gICAgY29uc3QgcGFyc2VkID0gcGFyc2VPYmplY3RMaXRlcmFsRXhwcmVzc2lvbihleHRyYWN0ZWRPYmplY3RMaXRlcmFsLm5vZGUsIGV4dHJhY3RlZE9iamVjdExpdGVyYWwuc291cmNlKTtcbiAgICBpZiAoIXBhcnNlZCkgcmV0dXJuO1xuXG4gICAgLy8gd2IgZGVyaXZlcyBORVhUX1BVQkxJQ19CQVNFX1VSTCBmcm9tIHRoZSByZXNvbHZlZCBwb3J0IGZvciBOZXh0LmpzL3ZpbmV4dCBhcHBzICh2aW5leHRcbiAgICAvLyBhcHBzIGFsc28gZGVwZW5kIG9uIG5leHQsIHNvIGBkZXBlbmRpbmcubmV4dGAgY292ZXJzIGJvdGgpLCBzbyB0aG9zZSBuZWVkIG5vIGRlY2xhcmVkXG4gICAgLy8gdmFyaWFibGU7IG90aGVyIHBhY2thZ2VzIHN0aWxsIHJlcXVpcmUgYSBkZWNsYXJhdGlvbi5cbiAgICBjb25zdCBzaG91bGRVc2VBcHBTZXJ2ZXJEZWZhdWx0cyA9XG4gICAgICBzaG91bGRNYW5hZ2VBcHBTZXJ2ZXJEZWZhdWx0cyhjb25maWcsIHBhcnNlZCkgJiZcbiAgICAgIChjb25maWcuZGVwZW5kaW5nLm5leHQgfHwgKGF3YWl0IGRvZXNEZWZpbmVOZXh0UHVibGljQmFzZVVybChjb25maWcuZGlyUGF0aCkpKTtcbiAgICBjb25zdCBkZWZhdWx0Q29uZmlnID0gY3JlYXRlRGVmYXVsdENvbmZpZyhjb25maWcsIHNob3VsZFVzZUFwcFNlcnZlckRlZmF1bHRzKTtcbiAgICBjb25zdCBtZXJnZWQgPSBtZXJnZVBhcnNlZE9iamVjdHMoZGVmYXVsdENvbmZpZywgcGFyc2VkKTtcbiAgICBhcHBseU1hbmFnZWRVc2VEZWZhdWx0cyhtZXJnZWQsIGRlZmF1bHRDb25maWcpO1xuICAgIHNldFdlYlNlcnZlckNvbW1hbmQobWVyZ2VkKTtcblxuICAgIGNvbnN0IG5ld09iamVjdExpdGVyYWwgPSBzdHJpbmdpZnlWYWx1ZSh7IGtpbmQ6ICdvYmplY3QnLCB2YWx1ZTogbWVyZ2VkIH0sIDApO1xuICAgIGNvbnN0IG9sZENvbnRlbnQgPSBleHRyYWN0ZWRPYmplY3RMaXRlcmFsLnNvdXJjZS50ZXh0O1xuICAgIGNvbnN0IHN0YXJ0ID0gZXh0cmFjdGVkT2JqZWN0TGl0ZXJhbC5ub2RlLmdldFN0YXJ0KGV4dHJhY3RlZE9iamVjdExpdGVyYWwuc291cmNlKTtcbiAgICBjb25zdCBlbmQgPSBleHRyYWN0ZWRPYmplY3RMaXRlcmFsLm5vZGUuZ2V0RW5kKCk7XG4gICAgY29uc3QgbmV3Q29udGVudCA9IGAke29sZENvbnRlbnQuc2xpY2UoMCwgc3RhcnQpfSR7bmV3T2JqZWN0TGl0ZXJhbH0ke29sZENvbnRlbnQuc2xpY2UoZW5kKX1gO1xuXG4gICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzVXRpbC5nZW5lcmF0ZUZpbGUoZmlsZVBhdGgsIG5ld0NvbnRlbnQpKTtcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIG1lcmdlUGFyc2VkT2JqZWN0cyhiYXNlOiBQYXJzZWRPYmplY3QsIG92ZXJyaWRlOiBQYXJzZWRPYmplY3QpOiBQYXJzZWRPYmplY3Qge1xuICBjb25zdCBvdmVycmlkZVByb3BlcnR5S2V5cyA9IG5ldyBTZXQoT2JqZWN0LmtleXMob3ZlcnJpZGUucHJvcGVydGllcykpO1xuICBjb25zdCBleHRyYU1lbWJlcnMgPSBbLi4uYmFzZS5leHRyYU1lbWJlcnMsIC4uLm92ZXJyaWRlLmV4dHJhTWVtYmVyc107XG4gIC8vIEtlZXAgZGVmYXVsdC1vbmx5IG1lbWJlcnMgYmVmb3JlIHBhcnNlZCBtZW1iZXJzIHNvIHNwcmVhZHMgYW5kIGV4cGxpY2l0IGxvY2FsIHByb3BlcnRpZXMgcmV0YWluIHByZWNlZGVuY2UuXG4gIGNvbnN0IG1lbWJlck9yZGVyID0gW1xuICAgIC4uLmJhc2UubWVtYmVyT3JkZXIuZmlsdGVyKChtZW1iZXIpID0+IG1lbWJlci5raW5kICE9PSAncHJvcGVydHknIHx8ICFvdmVycmlkZVByb3BlcnR5S2V5cy5oYXMobWVtYmVyLmtleSkpLFxuICAgIC4uLm92ZXJyaWRlLm1lbWJlck9yZGVyLm1hcCgobWVtYmVyKTogT2JqZWN0TWVtYmVyID0+IHtcbiAgICAgIGlmIChtZW1iZXIua2luZCA9PT0gJ3Byb3BlcnR5JykgcmV0dXJuIG1lbWJlcjtcbiAgICAgIHJldHVybiB7IGtpbmQ6ICdleHRyYScsIGluZGV4OiBiYXNlLmV4dHJhTWVtYmVycy5sZW5ndGggKyBtZW1iZXIuaW5kZXggfTtcbiAgICB9KSxcbiAgXTtcbiAgY29uc3QgcHJvcGVydGllcyA9IHsgLi4uYmFzZS5wcm9wZXJ0aWVzIH07XG4gIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKG92ZXJyaWRlLnByb3BlcnRpZXMpKSB7XG4gICAgcHJvcGVydGllc1trZXldID0gbWVyZ2VQYXJzZWRWYWx1ZShwcm9wZXJ0aWVzW2tleV0sIHZhbHVlKTtcbiAgfVxuICByZXR1cm4geyBleHRyYU1lbWJlcnMsIG1lbWJlck9yZGVyLCBwcm9wZXJ0aWVzIH07XG59XG5cbmZ1bmN0aW9uIG1lcmdlUGFyc2VkVmFsdWUoYmFzZTogUGFyc2VkVmFsdWUgfCB1bmRlZmluZWQsIG92ZXJyaWRlOiBQYXJzZWRWYWx1ZSk6IFBhcnNlZFZhbHVlIHtcbiAgaWYgKGJhc2U/LmtpbmQgPT09ICdvYmplY3QnICYmIG92ZXJyaWRlLmtpbmQgPT09ICdvYmplY3QnKSB7XG4gICAgcmV0dXJuIHsga2luZDogJ29iamVjdCcsIHZhbHVlOiBtZXJnZVBhcnNlZE9iamVjdHMoYmFzZS52YWx1ZSwgb3ZlcnJpZGUudmFsdWUpIH07XG4gIH1cbiAgcmV0dXJuIG92ZXJyaWRlO1xufVxuXG5mdW5jdGlvbiBhcHBseU1hbmFnZWRVc2VEZWZhdWx0cyhjb25maWc6IFBhcnNlZE9iamVjdCwgZGVmYXVsdENvbmZpZzogUGFyc2VkT2JqZWN0KTogdm9pZCB7XG4gIGNvbnN0IHVzZSA9IGNvbmZpZy5wcm9wZXJ0aWVzLnVzZTtcbiAgY29uc3QgZGVmYXVsdFVzZSA9IGRlZmF1bHRDb25maWcucHJvcGVydGllcy51c2U7XG4gIGlmICh1c2U/LmtpbmQgIT09ICdvYmplY3QnIHx8IGRlZmF1bHRVc2U/LmtpbmQgIT09ICdvYmplY3QnKSByZXR1cm47XG5cbiAgZm9yIChjb25zdCBrZXkgb2YgWyd0cmFjZScsICdzY3JlZW5zaG90JywgJ3ZpZGVvJ10pIHtcbiAgICBjb25zdCBkZWZhdWx0VmFsdWUgPSBkZWZhdWx0VXNlLnZhbHVlLnByb3BlcnRpZXNba2V5XTtcbiAgICBpZiAoZGVmYXVsdFZhbHVlKSB7XG4gICAgICB1c2UudmFsdWUucHJvcGVydGllc1trZXldID0gZGVmYXVsdFZhbHVlO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBzaG91bGRNYW5hZ2VBcHBTZXJ2ZXJEZWZhdWx0cyhjb25maWc6IFBhY2thZ2VDb25maWcsIHBhcnNlZDogUGFyc2VkT2JqZWN0KTogYm9vbGVhbiB7XG4gIHJldHVybiAoXG4gICAgY29uZmlnLmRlcGVuZGluZy5uZXh0IHx8XG4gICAgcGFyc2VkLnByb3BlcnRpZXMud2ViU2VydmVyICE9PSB1bmRlZmluZWQgfHxcbiAgICBkb2VzT2JqZWN0SGF2ZUJhc2VVcmwocGFyc2VkLnByb3BlcnRpZXMudXNlKSB8fFxuICAgIGRvZXNWYWx1ZUNvbnRhaW5MaXRlcmFsKHsga2luZDogJ29iamVjdCcsIHZhbHVlOiBwYXJzZWQgfSwgJ05FWFRfUFVCTElDX0JBU0VfVVJMJylcbiAgKTtcbn1cblxuZnVuY3Rpb24gZG9lc09iamVjdEhhdmVCYXNlVXJsKHZhbHVlOiBQYXJzZWRWYWx1ZSB8IHVuZGVmaW5lZCk6IGJvb2xlYW4ge1xuICByZXR1cm4gdmFsdWU/LmtpbmQgPT09ICdvYmplY3QnICYmIHZhbHVlLnZhbHVlLnByb3BlcnRpZXMuYmFzZVVSTCAhPT0gdW5kZWZpbmVkO1xufVxuXG5mdW5jdGlvbiBkb2VzVmFsdWVDb250YWluTGl0ZXJhbCh2YWx1ZTogUGFyc2VkVmFsdWUsIGxpdGVyYWxUZXh0OiBzdHJpbmcpOiBib29sZWFuIHtcbiAgaWYgKHZhbHVlLmtpbmQgPT09ICdsaXRlcmFsJykgcmV0dXJuIHZhbHVlLnZhbHVlLmluY2x1ZGVzKGxpdGVyYWxUZXh0KTtcbiAgaWYgKHZhbHVlLmtpbmQgPT09ICdhcnJheScpIHJldHVybiB2YWx1ZS52YWx1ZS5zb21lKChjaGlsZCkgPT4gZG9lc1ZhbHVlQ29udGFpbkxpdGVyYWwoY2hpbGQsIGxpdGVyYWxUZXh0KSk7XG4gIHJldHVybiAoXG4gICAgdmFsdWUudmFsdWUuZXh0cmFNZW1iZXJzLnNvbWUoKG1lbWJlcikgPT4gbWVtYmVyLmluY2x1ZGVzKGxpdGVyYWxUZXh0KSkgfHxcbiAgICBPYmplY3QudmFsdWVzKHZhbHVlLnZhbHVlLnByb3BlcnRpZXMpLnNvbWUoKGNoaWxkKSA9PiBkb2VzVmFsdWVDb250YWluTGl0ZXJhbChjaGlsZCwgbGl0ZXJhbFRleHQpKVxuICApO1xufVxuXG5hc3luYyBmdW5jdGlvbiBkb2VzRGVmaW5lTmV4dFB1YmxpY0Jhc2VVcmwoZGlyUGF0aDogc3RyaW5nKTogUHJvbWlzZTxib29sZWFuPiB7XG4gIGZvciAoY29uc3QgZW52RmlsZVBhdGggb2YgZ2V0RW52RmlsZVBhdGhzKGRpclBhdGgpKSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGNvbnRlbnQgPSBhd2FpdCBmcy5wcm9taXNlcy5yZWFkRmlsZShlbnZGaWxlUGF0aCwgJ3V0ZjgnKTtcbiAgICAgIGlmICgvTkVYVF9QVUJMSUNfQkFTRV9VUkxcXHMqPS9tLnRlc3QoY29udGVudCkpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBNaXNzaW5nIGVudiBmaWxlcyBhcmUgZXhwZWN0ZWQgaW4gc29tZSByZXBvcy5cbiAgICB9XG4gIH1cblxuICAvLyBTb21lIFBsYXl3cmlnaHQgY29uZmlncyBvbmx5IGRlZmluZSBicm93c2VyIHByb2plY3RzIG9yIGZpeHR1cmVzIGFuZCBkbyBub3RcbiAgLy8gc3RhcnQgYSB3ZWIgYXBwLiBBdm9pZCBmb3JjaW5nIGFuIGFwcC1zZXJ2ZXIgVVJMIGludG8gdGhvc2UgcGFja2FnZXMuXG4gIHJldHVybiBmYWxzZTtcbn1cblxuZnVuY3Rpb24gZ2V0RW52RmlsZVBhdGhzKGRpclBhdGg6IHN0cmluZyk6IHN0cmluZ1tdIHtcbiAgY29uc3QgZW52RmlsZU5hbWVzID0gWydmbm94LnRvbWwnLCAnbWlzZS50b21sJywgJ21pc2UudGVzdC50b21sJ107XG4gIGNvbnN0IGVudkZpbGVQYXRoczogc3RyaW5nW10gPSBbXTtcblxuICBmb3IgKGxldCBjdXJyZW50RGlyUGF0aCA9IHBhdGgucmVzb2x2ZShkaXJQYXRoKTsgOyBjdXJyZW50RGlyUGF0aCA9IHBhdGguZGlybmFtZShjdXJyZW50RGlyUGF0aCkpIHtcbiAgICBlbnZGaWxlUGF0aHMucHVzaCguLi5lbnZGaWxlTmFtZXMubWFwKChmaWxlTmFtZSkgPT4gcGF0aC5yZXNvbHZlKGN1cnJlbnREaXJQYXRoLCBmaWxlTmFtZSkpKTtcblxuICAgIC8vIFBsYXl3cmlnaHQgY29uZmlncyBvZnRlbiBsaXZlIGluIHBhY2thZ2VzLyogd2hpbGUgc2hhcmVkIGVudiBmaWxlcyBsaXZlIGF0IHRoZVxuICAgIC8vIHJlcG9zaXRvcnkgcm9vdCwgc28gd2FsayB1cHdhcmQgdW50aWwgdGhlIHRhcmdldCByZXBvIGJvdW5kYXJ5LlxuICAgIGlmIChmcy5leGlzdHNTeW5jKHBhdGgucmVzb2x2ZShjdXJyZW50RGlyUGF0aCwgJy5naXQnKSkpIGJyZWFrO1xuXG4gICAgY29uc3QgcGFyZW50RGlyUGF0aCA9IHBhdGguZGlybmFtZShjdXJyZW50RGlyUGF0aCk7XG4gICAgaWYgKHBhcmVudERpclBhdGggPT09IGN1cnJlbnREaXJQYXRoKSBicmVhaztcbiAgfVxuXG4gIHJldHVybiBlbnZGaWxlUGF0aHM7XG59XG5cbmZ1bmN0aW9uIHNldFdlYlNlcnZlckNvbW1hbmQob2JqZWN0OiBQYXJzZWRPYmplY3QpOiB2b2lkIHtcbiAgY29uc3Qgd2ViU2VydmVyID0gb2JqZWN0LnByb3BlcnRpZXMud2ViU2VydmVyO1xuICBpZiAod2ViU2VydmVyPy5raW5kICE9PSAnb2JqZWN0JykgcmV0dXJuO1xuXG4gIGNvbnN0IGNvbW1hbmQgPSB3ZWJTZXJ2ZXIudmFsdWUucHJvcGVydGllcy5jb21tYW5kO1xuICAvLyBMaWJyYXJpZXMgY2FuIHVzZSBQbGF5d3JpZ2h0J3Mgd2ViU2VydmVyIHRvIGJ1aWxkIGFuZCBsYXVuY2ggYSBmaXh0dXJlIGV2ZW4gdGhvdWdoIGB3YiBzdGFydGBcbiAgLy8gaW50ZW50aW9uYWxseSBoYXMgbm8gdGVzdCBzZXJ2ZXIgZm9yIHRoZSBsaWJyYXJ5IGl0c2VsZi4gUHJlc2VydmUgdGhvc2UgY3VzdG9tIGxpZmVjeWNsZVxuICAvLyBjb21tYW5kczsgb25seSBhZGQgdGhlIGNvbW1hbmQgd2hlbiB3YmZ5IGFscmVhZHkgb3ducyBpdC5cbiAgaWYgKGNvbW1hbmQgJiYgIWlzR2VuZXJhdGVkV2JTdGFydFRlc3RDb21tYW5kKGNvbW1hbmQpKSByZXR1cm47XG5cbiAgLy8gUGxheXdyaWdodCByZXF1aXJlcyBgY29tbWFuZGAgd2hlbmV2ZXIgYHdlYlNlcnZlcmAgZXhpc3RzOyBhbiBleHRlcm5hbGx5IG1hbmFnZWQgc2VydmVyIHNob3VsZFxuICAvLyBvbWl0IGB3ZWJTZXJ2ZXJgIGluc3RlYWQuIEtlZXAgZmlsbGluZyB0aGlzIHJlcXVpcmVkIGZpZWxkIHdoZW4gYSBwYXJ0aWFsIG1hbmFnZWQgYmxvY2sgbGFja3MgaXQuXG4gIHdlYlNlcnZlci52YWx1ZS5wcm9wZXJ0aWVzLmNvbW1hbmQgPSBsaXRlcmFsKGdldFdiU3RhcnRUZXN0Q29tbWFuZCgpKTtcbn1cblxuZnVuY3Rpb24gaXNHZW5lcmF0ZWRXYlN0YXJ0VGVzdENvbW1hbmQoY29tbWFuZDogUGFyc2VkVmFsdWUpOiBib29sZWFuIHtcbiAgaWYgKGNvbW1hbmQua2luZCAhPT0gJ2xpdGVyYWwnKSByZXR1cm4gZmFsc2U7XG4gIHJldHVybiBjb21tYW5kLnZhbHVlLnRyaW0oKSA9PT0gZ2V0V2JTdGFydFRlc3RDb21tYW5kKCk7XG59XG5cbmZ1bmN0aW9uIGdldFdiU3RhcnRUZXN0Q29tbWFuZCgpOiBzdHJpbmcge1xuICByZXR1cm4gYCdidW4gd2Igc3RhcnQgLS1tb2RlIHRlc3QnYDtcbn1cblxuYXN5bmMgZnVuY3Rpb24gZXh0cmFjdERlZmluZUNvbmZpZ09iamVjdExpdGVyYWwoZmlsZVBhdGg6IHN0cmluZyk6IFByb21pc2U8RXh0cmFjdGVkT2JqZWN0TGl0ZXJhbCB8IHVuZGVmaW5lZD4ge1xuICBjb25zdCBzb3VyY2UgPSBhd2FpdCBwYXJzZVNvdXJjZUZpbGUoZmlsZVBhdGgpO1xuICBpZiAoIXNvdXJjZSkgcmV0dXJuIHVuZGVmaW5lZDtcblxuICAvLyBUeXBlU2NyaXB0IGFscmVhZHkgdW5kZXJzdGFuZHMgbmVzdGVkIG9iamVjdCBsaXRlcmFscyBhbmQgdGVtcGxhdGUgc3RyaW5ncywgc28gdXNlXG4gIC8vIGl0cyBBU1QgcmFuZ2VzIGluc3RlYWQgb2YgYSByZWdleCB0aGF0IGNhbiBzdG9wIGF0IHRoZSBmaXJzdCBpbm5lciBjbG9zaW5nIGJyYWNlLlxuICBsZXQgZm91bmQ6IGFzdC5PYmplY3RMaXRlcmFsRXhwcmVzc2lvbiB8IHVuZGVmaW5lZDtcbiAgY29uc3QgdmlzaXQgPSAobm9kZTogYXN0Lk5vZGUpOiB2b2lkID0+IHtcbiAgICBpZiAoZm91bmQpIHJldHVybjtcbiAgICBpZiAoYXN0LmlzQ2FsbEV4cHJlc3Npb24obm9kZSkgJiYgbm9kZS5leHByZXNzaW9uLmdldFRleHQoc291cmNlKSA9PT0gJ2RlZmluZUNvbmZpZycpIHtcbiAgICAgIGNvbnN0IGZpcnN0QXJndW1lbnQgPSBub2RlLmFyZ3VtZW50c1swXTtcbiAgICAgIGlmIChmaXJzdEFyZ3VtZW50ICYmIGFzdC5pc09iamVjdExpdGVyYWxFeHByZXNzaW9uKGZpcnN0QXJndW1lbnQpKSB7XG4gICAgICAgIGZvdW5kID0gZmlyc3RBcmd1bWVudDtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgIH1cbiAgICBub2RlLmZvckVhY2hDaGlsZCh2aXNpdCk7XG4gIH07XG4gIHNvdXJjZS5mb3JFYWNoQ2hpbGQodmlzaXQpO1xuXG4gIHJldHVybiBmb3VuZCA/IHsgc291cmNlLCBub2RlOiBmb3VuZCB9IDogdW5kZWZpbmVkO1xufVxuXG5mdW5jdGlvbiBwYXJzZUV4cHJlc3Npb24oZXhwcmVzc2lvbjogYXN0LkV4cHJlc3Npb24sIHNvdXJjZTogYXN0LlNvdXJjZUZpbGUpOiBQYXJzZWRWYWx1ZSB8IHVuZGVmaW5lZCB7XG4gIGlmIChhc3QuaXNPYmplY3RMaXRlcmFsRXhwcmVzc2lvbihleHByZXNzaW9uKSkge1xuICAgIGNvbnN0IHBhcnNlZE9iamVjdCA9IHBhcnNlT2JqZWN0TGl0ZXJhbEV4cHJlc3Npb24oZXhwcmVzc2lvbiwgc291cmNlKTtcbiAgICByZXR1cm4gcGFyc2VkT2JqZWN0ID8geyBraW5kOiAnb2JqZWN0JywgdmFsdWU6IHBhcnNlZE9iamVjdCB9IDogbGl0ZXJhbChleHByZXNzaW9uLmdldFRleHQoc291cmNlKSk7XG4gIH1cbiAgaWYgKGFzdC5pc0FycmF5TGl0ZXJhbEV4cHJlc3Npb24oZXhwcmVzc2lvbikpIHtcbiAgICBjb25zdCBlbGVtZW50cyA9IGV4cHJlc3Npb24uZWxlbWVudHMubWFwKChlbGVtZW50KSA9PiBwYXJzZUV4cHJlc3Npb24oZWxlbWVudCwgc291cmNlKSk7XG4gICAgaWYgKGVsZW1lbnRzLnNvbWUoKGVsZW1lbnQpOiBlbGVtZW50IGlzIHVuZGVmaW5lZCA9PiBlbGVtZW50ID09PSB1bmRlZmluZWQpKSB7XG4gICAgICByZXR1cm4gbGl0ZXJhbChleHByZXNzaW9uLmdldFRleHQoc291cmNlKSk7XG4gICAgfVxuICAgIHJldHVybiBhc0FycmF5KGVsZW1lbnRzIGFzIFBhcnNlZFZhbHVlW10pO1xuICB9XG4gIHJldHVybiBsaXRlcmFsKGV4cHJlc3Npb24uZ2V0VGV4dChzb3VyY2UpKTtcbn1cblxuZnVuY3Rpb24gcGFyc2VPYmplY3RMaXRlcmFsRXhwcmVzc2lvbihcbiAgb2JqZWN0TGl0ZXJhbDogYXN0Lk9iamVjdExpdGVyYWxFeHByZXNzaW9uLFxuICBzb3VyY2U6IGFzdC5Tb3VyY2VGaWxlXG4pOiBQYXJzZWRPYmplY3QgfCB1bmRlZmluZWQge1xuICBjb25zdCBwYXJzZWQ6IFBhcnNlZE9iamVjdCA9IHsgZXh0cmFNZW1iZXJzOiBbXSwgbWVtYmVyT3JkZXI6IFtdLCBwcm9wZXJ0aWVzOiB7fSB9O1xuICBmb3IgKGNvbnN0IHByb3BlcnR5IG9mIG9iamVjdExpdGVyYWwucHJvcGVydGllcykge1xuICAgIGlmIChhc3QuaXNTaG9ydGhhbmRQcm9wZXJ0eUFzc2lnbm1lbnQocHJvcGVydHkpKSB7XG4gICAgICBjb25zdCBrZXkgPSBwcm9wZXJ0eS5uYW1lLmdldFRleHQoc291cmNlKTtcbiAgICAgIHBhcnNlZC5wcm9wZXJ0aWVzW2tleV0gPSBsaXRlcmFsKGtleSk7XG4gICAgICBwYXJzZWQubWVtYmVyT3JkZXIucHVzaCh7IGtpbmQ6ICdwcm9wZXJ0eScsIGtleSB9KTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBpZiAoXG4gICAgICAhYXN0LmlzUHJvcGVydHlBc3NpZ25tZW50KHByb3BlcnR5KSB8fFxuICAgICAgKCFhc3QuaXNJZGVudGlmaWVyKHByb3BlcnR5Lm5hbWUpICYmICFhc3QuaXNTdHJpbmdMaXRlcmFsKHByb3BlcnR5Lm5hbWUpKVxuICAgICkge1xuICAgICAgY29uc3QgaW5kZXggPSBwYXJzZWQuZXh0cmFNZW1iZXJzLnB1c2gocHJvcGVydHkuZ2V0VGV4dChzb3VyY2UpKSAtIDE7XG4gICAgICBwYXJzZWQubWVtYmVyT3JkZXIucHVzaCh7IGtpbmQ6ICdleHRyYScsIGluZGV4IH0pO1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGNvbnN0IHZhbHVlID0gcGFyc2VFeHByZXNzaW9uKHByb3BlcnR5LmluaXRpYWxpemVyLCBzb3VyY2UpO1xuICAgIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkKSByZXR1cm47XG4gICAgY29uc3Qga2V5ID0gcHJvcGVydHkubmFtZS5nZXRUZXh0KHNvdXJjZSk7XG4gICAgcGFyc2VkLnByb3BlcnRpZXNba2V5XSA9IHZhbHVlO1xuICAgIHBhcnNlZC5tZW1iZXJPcmRlci5wdXNoKHsga2luZDogJ3Byb3BlcnR5Jywga2V5IH0pO1xuICB9XG4gIHJldHVybiBwYXJzZWQ7XG59XG5cbmZ1bmN0aW9uIHN0cmluZ2lmeVZhbHVlKHZhbHVlOiBQYXJzZWRWYWx1ZSwgbGV2ZWw6IG51bWJlcik6IHN0cmluZyB7XG4gIGNvbnN0IGNsb3NpbmdJbmRlbnQgPSAnICAnLnJlcGVhdChsZXZlbCk7XG4gIGlmICh2YWx1ZS5raW5kID09PSAnYXJyYXknKSB7XG4gICAgaWYgKHZhbHVlLnZhbHVlLmxlbmd0aCA9PT0gMCkgcmV0dXJuICdbXSc7XG4gICAgY29uc3QgaW5kZW50ID0gJyAgJy5yZXBlYXQobGV2ZWwgKyAxKTtcbiAgICBjb25zdCBsaW5lcyA9IHZhbHVlLnZhbHVlLm1hcCgoaXRlbSkgPT4ge1xuICAgICAgY29uc3Qgc3RyaW5naWZpZWQgPSBzdHJpbmdpZnlWYWx1ZShpdGVtLCBsZXZlbCArIDEpLnNwbGl0KCdcXG4nKTtcbiAgICAgIHN0cmluZ2lmaWVkW3N0cmluZ2lmaWVkLmxlbmd0aCAtIDFdID0gYCR7c3RyaW5naWZpZWQuYXQoLTEpfSxgO1xuICAgICAgaWYgKGl0ZW0ua2luZCA9PT0gJ2xpdGVyYWwnKSB7XG4gICAgICAgIGZvciAobGV0IGluZGV4ID0gMTsgaW5kZXggPCBzdHJpbmdpZmllZC5sZW5ndGg7IGluZGV4ICs9IDEpIHtcbiAgICAgICAgICBzdHJpbmdpZmllZFtpbmRleF0gPSBgJHtpbmRlbnR9JHtzdHJpbmdpZmllZFtpbmRleF19YDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgc3RyaW5naWZpZWRbMF0gPSBgJHtpbmRlbnR9JHtzdHJpbmdpZmllZFswXX1gO1xuICAgICAgcmV0dXJuIHN0cmluZ2lmaWVkLmpvaW4oJ1xcbicpO1xuICAgIH0pO1xuICAgIHJldHVybiBgW1xcbiR7bGluZXMuam9pbignXFxuJyl9XFxuJHtjbG9zaW5nSW5kZW50fV1gO1xuICB9XG4gIGlmICh2YWx1ZS5raW5kID09PSAnbGl0ZXJhbCcpIHJldHVybiB2YWx1ZS52YWx1ZTtcblxuICBjb25zdCBpbmRlbnQgPSAnICAnLnJlcGVhdChsZXZlbCArIDEpO1xuICBjb25zdCBlbWl0dGVkUHJvcGVydGllcyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICBjb25zdCBsYXN0UHJvcGVydHlJbmRleEJ5S2V5ID0gZ2V0TGFzdFByb3BlcnR5SW5kZXhCeUtleSh2YWx1ZS52YWx1ZS5tZW1iZXJPcmRlcik7XG4gIGNvbnN0IGxpbmVzID0gdmFsdWUudmFsdWUubWVtYmVyT3JkZXIuZmxhdE1hcCgobWVtYmVyLCBpbmRleCkgPT4ge1xuICAgIGlmIChtZW1iZXIua2luZCA9PT0gJ2V4dHJhJykge1xuICAgICAgcmV0dXJuIFtzdHJpbmdpZnlPYmplY3RNZW1iZXIodmFsdWUudmFsdWUuZXh0cmFNZW1iZXJzW21lbWJlci5pbmRleF0gPz8gJycsIGluZGVudCldO1xuICAgIH1cblxuICAgIGlmIChsYXN0UHJvcGVydHlJbmRleEJ5S2V5LmdldChtZW1iZXIua2V5KSAhPT0gaW5kZXgpIHJldHVybiBbXTtcbiAgICBjb25zdCBpdGVtID0gdmFsdWUudmFsdWUucHJvcGVydGllc1ttZW1iZXIua2V5XTtcbiAgICBpZiAoIWl0ZW0gfHwgZW1pdHRlZFByb3BlcnRpZXMuaGFzKG1lbWJlci5rZXkpKSByZXR1cm4gW107XG4gICAgZW1pdHRlZFByb3BlcnRpZXMuYWRkKG1lbWJlci5rZXkpO1xuICAgIHJldHVybiBbc3RyaW5naWZ5T2JqZWN0UHJvcGVydHkobWVtYmVyLmtleSwgaXRlbSwgbGV2ZWwsIGluZGVudCldO1xuICB9KTtcbiAgbGluZXMucHVzaChcbiAgICAuLi5PYmplY3QuZW50cmllcyh2YWx1ZS52YWx1ZS5wcm9wZXJ0aWVzKVxuICAgICAgLmZpbHRlcigoW2tleV0pID0+ICFlbWl0dGVkUHJvcGVydGllcy5oYXMoa2V5KSlcbiAgICAgIC5tYXAoKFtrZXksIGl0ZW1dKSA9PiBzdHJpbmdpZnlPYmplY3RQcm9wZXJ0eShrZXksIGl0ZW0sIGxldmVsLCBpbmRlbnQpKVxuICApO1xuICBpZiAobGluZXMubGVuZ3RoID09PSAwKSByZXR1cm4gYHtcXG4ke2Nsb3NpbmdJbmRlbnR9fWA7XG4gIHJldHVybiBge1xcbiR7bGluZXMuam9pbignXFxuJyl9XFxuJHtjbG9zaW5nSW5kZW50fX1gO1xufVxuXG5mdW5jdGlvbiBnZXRMYXN0UHJvcGVydHlJbmRleEJ5S2V5KG1lbWJlck9yZGVyOiBPYmplY3RNZW1iZXJbXSk6IE1hcDxzdHJpbmcsIG51bWJlcj4ge1xuICBjb25zdCBsYXN0UHJvcGVydHlJbmRleEJ5S2V5ID0gbmV3IE1hcDxzdHJpbmcsIG51bWJlcj4oKTtcbiAgZm9yIChjb25zdCBbaW5kZXgsIG1lbWJlcl0gb2YgbWVtYmVyT3JkZXIuZW50cmllcygpKSB7XG4gICAgaWYgKG1lbWJlci5raW5kID09PSAncHJvcGVydHknKSB7XG4gICAgICBsYXN0UHJvcGVydHlJbmRleEJ5S2V5LnNldChtZW1iZXIua2V5LCBpbmRleCk7XG4gICAgfVxuICB9XG4gIHJldHVybiBsYXN0UHJvcGVydHlJbmRleEJ5S2V5O1xufVxuXG5mdW5jdGlvbiBzdHJpbmdpZnlPYmplY3RQcm9wZXJ0eShrZXk6IHN0cmluZywgaXRlbTogUGFyc2VkVmFsdWUsIGxldmVsOiBudW1iZXIsIGluZGVudDogc3RyaW5nKTogc3RyaW5nIHtcbiAgY29uc3Qgc3RyaW5naWZpZWQgPSBzdHJpbmdpZnlWYWx1ZShpdGVtLCBsZXZlbCArIDEpLnNwbGl0KCdcXG4nKTtcbiAgc3RyaW5naWZpZWRbc3RyaW5naWZpZWQubGVuZ3RoIC0gMV0gPSBgJHtzdHJpbmdpZmllZC5hdCgtMSl9LGA7XG4gIGlmIChpdGVtLmtpbmQgPT09ICdsaXRlcmFsJykge1xuICAgIGZvciAobGV0IGluZGV4ID0gMTsgaW5kZXggPCBzdHJpbmdpZmllZC5sZW5ndGg7IGluZGV4ICs9IDEpIHtcbiAgICAgIHN0cmluZ2lmaWVkW2luZGV4XSA9IGAke2luZGVudH0ke3N0cmluZ2lmaWVkW2luZGV4XX1gO1xuICAgIH1cbiAgfVxuICBzdHJpbmdpZmllZFswXSA9IGAke2luZGVudH0ke2tleX06ICR7c3RyaW5naWZpZWRbMF19YDtcbiAgcmV0dXJuIHN0cmluZ2lmaWVkLmpvaW4oJ1xcbicpO1xufVxuXG5mdW5jdGlvbiBzdHJpbmdpZnlPYmplY3RNZW1iZXIobWVtYmVyOiBzdHJpbmcsIGluZGVudDogc3RyaW5nKTogc3RyaW5nIHtcbiAgY29uc3Qgc3RyaW5naWZpZWQgPSBtZW1iZXIuc3BsaXQoJ1xcbicpO1xuICBzdHJpbmdpZmllZFtzdHJpbmdpZmllZC5sZW5ndGggLSAxXSA9IGAke3N0cmluZ2lmaWVkLmF0KC0xKX0sYDtcbiAgZm9yIChjb25zdCBbaW5kZXgsIGxpbmVdIG9mIHN0cmluZ2lmaWVkLmVudHJpZXMoKSkge1xuICAgIHN0cmluZ2lmaWVkW2luZGV4XSA9IGAke2luZGVudH0ke2xpbmV9YDtcbiAgfVxuICByZXR1cm4gc3RyaW5naWZpZWQuam9pbignXFxuJyk7XG59XG4iLCJpbXBvcnQgY2hpbGRfcHJvY2VzcyBmcm9tICdub2RlOmNoaWxkX3Byb2Nlc3MnO1xuaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IG9zIGZyb20gJ25vZGU6b3MnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZnNVdGlsIH0gZnJvbSAnLi4vdXRpbHMvZnNVdGlsLmpzJztcblxudHlwZSBXaWxsQm9vc3Rlck9yZ2FuaXphdGlvbiA9ICdXaWxsQm9vc3RlcicgfCAnV2lsbEJvb3N0ZXJMYWInO1xudHlwZSBSZXBvc2l0b3J5RnVsbE5hbWUgPSBgJHtXaWxsQm9vc3Rlck9yZ2FuaXphdGlvbn0vJHtzdHJpbmd9YDtcblxuZXhwb3J0IGludGVyZmFjZSBGbm94UmVwb3NpdG9yeVNjb3BlIHtcbiAgb3JnYW5pemF0aW9ucz86IHJlYWRvbmx5IFdpbGxCb29zdGVyT3JnYW5pemF0aW9uW107XG4gIHJlcG9zaXRvcmllcz86IHJlYWRvbmx5IFJlcG9zaXRvcnlGdWxsTmFtZVtdO1xuICAvLyBSZXN0cmljdHMgdGhlIHNjb3BlIHRvIHJlcG9zaXRvcmllcyBvZiB0aGUgZ2l2ZW4gdmlzaWJpbGl0eS4gUHVibGljIHJlcG9zaXRvcmllcyBwdWJsaXNoIHRoZWlyXG4gIC8vIGNpcGhlcnRleHRzIHRvIHRoZSB3b3JsZCwgc28gdGhleSBtdXN0IHVzZSBhIENJIGlkZW50aXR5IHNlcGFyYXRlIGZyb20gdGhlIG9yZy1pbnRlcm5hbCBvbmU6XG4gIC8vIGxlYWtpbmcgZWl0aGVyIENJIGtleSBtdXN0IG5vdCBleHBvc2UgdGhlIG90aGVyIHNpZGUncyBzZWNyZXRzLlxuICB2aXNpYmlsaXR5PzogJ3B1YmxpYycgfCAncHJpdmF0ZSc7XG59XG5cbmludGVyZmFjZSBGbm94QWdlUHJpbmNpcGFsIHtcbiAgbmFtZTogc3RyaW5nO1xuICBwdWJsaWNLZXlzOiByZWFkb25seSBzdHJpbmdbXTtcbiAgcmVwb3NpdG9yeVNjb3BlOiBGbm94UmVwb3NpdG9yeVNjb3BlO1xuICAvLyBNYXJrcyB0aGUgcHJpbmNpcGFsIGFzIGEgQ0kgaWRlbnRpdHkgYW5kIG5hbWVzIHRoZSBHaXRIdWIgc2VjcmV0IGhvbGRpbmcgaXRzIHByaXZhdGUga2V5LlxuICAvLyBFdmVyeSBmbm94LW1hbmFnZWQgcmVwb3NpdG9yeSBtdXN0IHJlc29sdmUgb25lIChnZW5lcmF0ZUZub3hUb21sIGZhaWxzIGNsb3NlZCBvdGhlcndpc2U6IGFcbiAgLy8gcm9zdGVyIHdpdGhvdXQgYSBDSSByZWNpcGllbnQgd291bGQgcmUtZW5jcnlwdCBzZWNyZXRzIHRoYXQgQ0kgY2FuIG5ldmVyIGRlY3J5cHQgYWdhaW4pLCBhbmRcbiAgLy8gdGhlIHdvcmtmbG93IGdlbmVyYXRvciBkZXJpdmVzIGl0cyBjYWxsZXIgbWFwcGluZ3MgZnJvbSB0aGUgc2FtZSByZXNvbHV0aW9uIHNvIHRoZSB0d28gY2FuXG4gIC8vIG5ldmVyIGRpc2FncmVlIG9uIHdoaWNoIENJIGlkZW50aXR5IGFwcGxpZXMuXG4gIGNpQWdlS2V5U2VjcmV0TmFtZT86ICdGTk9YX0FHRV9LRVknIHwgJ1BVQkxJQ19GTk9YX0FHRV9LRVknO1xufVxuXG5pbnRlcmZhY2UgRm5veEFnZVJlY2lwaWVudCB7XG4gIG5hbWU6IHN0cmluZztcbiAgcHVibGljS2V5OiBzdHJpbmc7XG59XG5cbi8vIFRoZSBhZ2UgcHJpbmNpcGFscyBhdXRob3JpemVkIHRvIGRlY3J5cHQgZWFjaCBmbm94LW1hbmFnZWQgcmVwb3NpdG9yeS4gVG8gZ3JhbnQgYWNjZXNzLCBhZGQgdGhlXG4vLyBwcmluY2lwYWwncyBwdWJsaWMga2V5cyBhbmQgcmVwb3NpdG9yeSBzY29wZSBoZXJlLiBPcmdhbml6YXRpb24gc2NvcGVzIGluY2x1ZGUgZXZlcnkgY3VycmVudCBhbmRcbi8vIGZ1dHVyZSByZXBvc2l0b3J5IGluIHRoYXQgb3JnYW5pemF0aW9uOyB1c2UgcmVwb3NpdG9yaWVzIGZvciBleGFjdCBvd25lci9yZXBvc2l0b3J5IGdyYW50cy4gVGhlXG4vLyBuZXh0IHdiZnkgcnVuIG9uIGVhY2ggbWF0Y2hpbmcgcmVwb3NpdG9yeSByZXdyaXRlcyBldmVyeSBtYW5hZ2VkIGZub3gudG9tbCBhbmQgcmUtZW5jcnlwdHMgaXRzXG4vLyBjb21taXR0ZWQgc2VjcmV0cyBmb3IgdGhlIHJlc3VsdGluZyByZWNpcGllbnQgc2V0LiBBIHNjb3BlJ3Mgb3B0aW9uYWwgdmlzaWJpbGl0eSBjb25zdHJhaW50XG4vLyBzZWxlY3RzIG9ubHkgcHVibGljIG9yIG9ubHkgcHJpdmF0ZSByZXBvc2l0b3JpZXMgKHVzZWQgdG8ga2VlcCB0aGUgb3JnLWludGVybmFsIGFuZCB0aGVcbi8vIHB1YmxpYy1yZXBvc2l0b3J5IENJIGlkZW50aXRpZXMgYXBhcnQpLiBSZW1vdmluZyBhIHNjb3BlIGNhbm5vdCByZXZva2UgY2lwaGVydGV4dFxuLy8gYWxyZWFkeSBhdmFpbGFibGUgZnJvbSBHaXQgaGlzdG9yeSwgc28gcm90YXRlIHRoZSBzZWNyZXQgdmFsdWVzIHRoYXQgcHJpbmNpcGFsIGNvdWxkIGRlY3J5cHQuXG4vLyBPbmx5IHB1YmxpYyBrZXlzIG1heSBhcHBlYXIgaGVyZTsgYSBDSSBpZGVudGl0eSdzIHByaXZhdGUga2V5IHN1cHBsaWVzIHRoZSBGTk9YX0FHRV9LRVkgKG9yLFxuLy8gZm9yIHB1YmxpYyByZXBvc2l0b3JpZXMsIFBVQkxJQ19GTk9YX0FHRV9LRVkpIG9yZ2FuaXphdGlvbiBzZWNyZXQuXG5leHBvcnQgY29uc3QgRk5PWF9BR0VfUFJJTkNJUEFMUyA9IFtcbiAge1xuICAgIG5hbWU6ICdleGthenV1JyxcbiAgICBwdWJsaWNLZXlzOiBbJ2FnZTFqMjM1NHhodm0zZnY5eTc3dDVnNnkzcThtZXhnazJtZjAwdGdya3pncDczdHlucnZ6NTVzOGF1YXl3J10sXG4gICAgcmVwb3NpdG9yeVNjb3BlOiB7IG9yZ2FuaXphdGlvbnM6IFsnV2lsbEJvb3N0ZXInLCAnV2lsbEJvb3N0ZXJMYWInXSB9LFxuICB9LFxuICB7XG4gICAgbmFtZTogJ3BvbmhhcnUnLFxuICAgIHB1YmxpY0tleXM6IFtcbiAgICAgICdhZ2UxOHJ1Z2xkZjlodGM2dW01ZXBscHgyN2s1M2VwNHpuMGxoendmZmdueHpocnEwYzd6Z3Z5cTN6Y2NkeScsXG4gICAgICAnYWdlMW56Mm45OWNyanI3bnA5eGpnbHdmZmZjM2R1ZDQ1ZGhld3F6cWZ6cHp0a2R3dTRoajc0Z3E2ZWw1MzMnLFxuICAgIF0sXG4gICAgcmVwb3NpdG9yeVNjb3BlOiB7IG9yZ2FuaXphdGlvbnM6IFsnV2lsbEJvb3N0ZXInLCAnV2lsbEJvb3N0ZXJMYWInXSB9LFxuICB9LFxuICB7XG4gICAgLy8gVGhlIG9yZy1pbnRlcm5hbCBDSSBpZGVudGl0eSAodGhlIEZOT1hfQUdFX0tFWSBvcmdhbml6YXRpb24gc2VjcmV0IC8gfi8uY29uZmlnL2Zub3gvYWdlLWNpLXdiLnR4dCkuXG4gICAgbmFtZTogJ2NpJyxcbiAgICBwdWJsaWNLZXlzOiBbJ2FnZTFhMmM2ZWY2YWhsNm1ta2hncXR4ZzBtZ3RkN3lzc3BudHE3cnh1c3YyNmVmeGhudWhsY2RzcjlkcGFrJ10sXG4gICAgcmVwb3NpdG9yeVNjb3BlOiB7IG9yZ2FuaXphdGlvbnM6IFsnV2lsbEJvb3N0ZXInLCAnV2lsbEJvb3N0ZXJMYWInXSwgdmlzaWJpbGl0eTogJ3ByaXZhdGUnIH0sXG4gICAgY2lBZ2VLZXlTZWNyZXROYW1lOiAnRk5PWF9BR0VfS0VZJyxcbiAgfSxcbiAge1xuICAgIC8vIFRoZSBDSSBpZGVudGl0eSBkZWRpY2F0ZWQgdG8gcHVibGljIHJlcG9zaXRvcmllcyAodGhlIFBVQkxJQ19GTk9YX0FHRV9LRVkgb3JnYW5pemF0aW9uXG4gICAgLy8gc2VjcmV0IC8gfi8uY29uZmlnL2Zub3gvYWdlLWNpLXdiLXB1YmxpYy50eHQpLiBTY29wZWQgdG8gV2lsbEJvb3N0ZXIgb25seSBiZWNhdXNlIHRoZVxuICAgIC8vIFBVQkxJQ19GTk9YX0FHRV9LRVkgc2VjcmV0IGlzIHJlZ2lzdGVyZWQgaW4gdGhhdCBvcmdhbml6YXRpb24gYWxvbmU7IGEgcHVibGljXG4gICAgLy8gV2lsbEJvb3N0ZXJMYWIgcmVwb3NpdG9yeSByZXNvbHZlcyBOTyBDSSBpZGVudGl0eSBhbmQgZ2VuZXJhdGVGbm94VG9tbCBmYWlscyBjbG9zZWQgb24gaXRcbiAgICAvLyAoV2lsbEJvb3N0ZXJMYWIgZG9lcyBvd24gcHVibGljIHJlcG9zaXRvcmllcywgZS5nLiBpdHMgcmV1c2FibGUtd29ya2Zsb3dzIHN5bmMgbWlycm9yLCBidXRcbiAgICAvLyBub25lIG9mIHRoZW0gdXNlIGZub3gg4oCUIHJlZ2lzdGVyIHRoZSBzZWNyZXQgdGhlcmUgYW5kIGV4dGVuZCB0aGlzIHNjb3BlIGlmIG9uZSBldmVyIGRvZXMpLlxuICAgIG5hbWU6ICdjaS1wdWJsaWMnLFxuICAgIHB1YmxpY0tleXM6IFsnYWdlMWZoZWE4NXhqd3A4OWx3cTNqY253ajMyc3doM3YyNHB3cGFycWg1bDdxa2d2YzRheDNwMHFsNmR1MzYnXSxcbiAgICByZXBvc2l0b3J5U2NvcGU6IHsgb3JnYW5pemF0aW9uczogWydXaWxsQm9vc3RlciddLCB2aXNpYmlsaXR5OiAncHVibGljJyB9LFxuICAgIGNpQWdlS2V5U2VjcmV0TmFtZTogJ1BVQkxJQ19GTk9YX0FHRV9LRVknLFxuICB9LFxuICB7XG4gICAgbmFtZTogJ3JlbWluJyxcbiAgICBwdWJsaWNLZXlzOiBbJ2FnZTFtdzRwejlkdWp5OWRtaGswcGFscWF3amtqN200azd6eDc4eXI5Zmp0NjNzYTVsM2U0M3VxNm53MDA0J10sXG4gICAgcmVwb3NpdG9yeVNjb3BlOiB7IG9yZ2FuaXphdGlvbnM6IFsnV2lsbEJvb3N0ZXInLCAnV2lsbEJvb3N0ZXJMYWInXSB9LFxuICB9LFxuICB7XG4gICAgbmFtZTogJ2FyaWVzJyxcbiAgICBwdWJsaWNLZXlzOiBbJ2FnZTFubjBlaHlhZW55cThrbW5xNDI5NGt6emd4djVkbmY2cGVwMmNka3JheHpmcWxrN3hnc3JxcW42bm45J10sXG4gICAgcmVwb3NpdG9yeVNjb3BlOiB7XG4gICAgICByZXBvc2l0b3JpZXM6IFtcbiAgICAgICAgJ1dpbGxCb29zdGVyL2FnZW50LWNoYWxsZW5nZXMnLFxuICAgICAgICAnV2lsbEJvb3N0ZXIvYWdlbnRpYy13b3JrZmxvd3MtZGFzaGJvYXJkJyxcbiAgICAgICAgJ1dpbGxCb29zdGVyL2NoZWVybGluZ3MnLFxuICAgICAgICAnV2lsbEJvb3N0ZXIvY2hvZnUtd2Fsa2luZycsXG4gICAgICAgICdXaWxsQm9vc3Rlci9wcm9tcHQtc3R1ZHknLFxuICAgICAgICAnV2lsbEJvb3N0ZXIvZXhlcmNvZGUnLFxuICAgICAgICAnV2lsbEJvb3N0ZXIvanVkZ2UnLFxuICAgICAgXSxcbiAgICB9LFxuICB9LFxuICB7XG4gICAgbmFtZTogJ3N1bmFnYScsXG4gICAgcHVibGljS2V5czogWydhZ2UxdWx4em42eTY4a3UzNGNweDVmeWE1Z2Y3cm5yd3owdWZsbnllNnV4dWhnMzRwMm5qaGdrcW1nNzNnNCddLFxuICAgIHJlcG9zaXRvcnlTY29wZToge1xuICAgICAgcmVwb3NpdG9yaWVzOiBbJ1dpbGxCb29zdGVyL2FpLW9jcicsICdXaWxsQm9vc3Rlci9leGVyY29kZScsICdXaWxsQm9vc3Rlci9qdWRnZSddLFxuICAgIH0sXG4gIH0sXG4gIHtcbiAgICBuYW1lOiAnYXlhbWUnLFxuICAgIHB1YmxpY0tleXM6IFsnYWdlMXZ4bTJnczAwM3J1d204cDZoM2h2N3hhc2p1MnM4azRteG1jMzR6bTZncmR3em5yczA5bnE2eHo1dnonXSxcbiAgICByZXBvc2l0b3J5U2NvcGU6IHtcbiAgICAgIHJlcG9zaXRvcmllczogWydXaWxsQm9vc3Rlci9haS1vY3InLCAnV2lsbEJvb3N0ZXIvY2hvZnUtd2Fsa2luZycsICdXaWxsQm9vc3Rlci9leGVyY29kZScsICdXaWxsQm9vc3Rlci9qdWRnZSddLFxuICAgIH0sXG4gIH0sXG5dIGFzIGNvbnN0IHNhdGlzZmllcyByZWFkb25seSBGbm94QWdlUHJpbmNpcGFsW107XG5cbmludGVyZmFjZSBGbm94VG9tbCB7XG4gIGltcG9ydD86IHVua25vd247XG4gIHByb3ZpZGVycz86IFJlY29yZDxzdHJpbmcsIFJlY29yZDxzdHJpbmcsIHVua25vd24+IHwgdW5kZWZpbmVkPjtcbiAgcHJvZmlsZXM/OiBSZWNvcmQ8c3RyaW5nLCBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB8IHVuZGVmaW5lZD47XG4gIFtrZXk6IHN0cmluZ106IHVua25vd247XG59XG5cbmxldCBmbm94U3luY0ZhaWxlZCA9IGZhbHNlO1xubGV0IG1pZ3JhdGlvbk1hcmtlclBhdGg6IHN0cmluZyB8IHVuZGVmaW5lZDtcbmxldCBtaWdyYXRpb25NYXJrZXJPd25lZCA9IGZhbHNlO1xuXG4vKiogV2hldGhlciBhbnkgZm5veCByZWNpcGllbnQgc3luY2hyb25pemF0aW9uIGZhaWxlZCBpbiB0aGUgY3VycmVudCByZXBvc2l0b3J5OyBzZXR1cFNlY3JldHMgbXVzdCBub3QgdXBsb2FkIHRoZW4uICovXG5leHBvcnQgZnVuY3Rpb24gaGFzRm5veFN5bmNGYWlsZWQoKTogYm9vbGVhbiB7XG4gIHJldHVybiBmbm94U3luY0ZhaWxlZDtcbn1cblxuLyoqXG4gKiBTeW5jaHJvbml6ZXMgdGhlIGFnZSByZWNpcGllbnRzIGluIGV2ZXJ5IGZub3gudG9tbCB3aXRoIHRoZSBwcmluY2lwYWxzIGF1dGhvcml6ZWQgZm9yIHRoaXNcbiAqIHJlcG9zaXRvcnkgYW5kIHJlLWVuY3J5cHRzIHRoZSBjb21taXR0ZWQgc2VjcmV0cyB3aGVuIHRoZSByZWNpcGllbnQgc2V0IGNoYW5nZWQuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZW5lcmF0ZUZub3hUb21sKHJvb3RDb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdnZW5lcmF0ZUZub3hUb21sJywgYXN5bmMgKCkgPT4ge1xuICAgIC8vIFRoZSBmYWlsdXJlIGZsYWcgaXMgcGVyIHJlcG9zaXRvcnk6IHdiZnkgY2FuIHByb2Nlc3MgbXVsdGlwbGUgd29ya2luZyBkaXJlY3RvcmllcyBpbiBvbmVcbiAgICAvLyBpbnZvY2F0aW9uLCBhbmQgYW4gZWFybGllciByZXBvc2l0b3J5J3MgZmFpbHVyZSBtdXN0IG5vdCB2ZXRvIGEgbGF0ZXIgcmVwb3NpdG9yeSdzIHVwbG9hZC5cbiAgICBmbm94U3luY0ZhaWxlZCA9IGZhbHNlO1xuICAgIC8vIEEgcmVwb3NpdG9yeSBvdXRzaWRlIFdpbGxCb29zdGVyL1dpbGxCb29zdGVyTGFiIG1hbmFnZXMgaXRzIG93biByZWNpcGllbnQgc2V0IChlLmcuIGFcbiAgICAvLyBwZXJzb25hbCByZXBvc2l0b3J5IHdpdGggaXRzIG93biBDSSBpZGVudGl0eSksIHNvIHJld3JpdGluZyBpdCB0byB0aGUgb3JnIHJvc3RlciB3b3VsZCBncmFudFxuICAgIC8vIG9yZyBtZW1iZXJzIGFjY2VzcyBhbmQgcmUtZW5jcnlwdCBzZWNyZXRzIGZvciBhIENJIGtleSB0aGF0IHJlcG9zaXRvcnkgZG9lcyBub3QgdXNlLlxuICAgIC8vIHNldHVwU2VjcmV0cyBuZXZlciB1cGxvYWRzIHNlY3JldHMgZm9yIHN1Y2ggcmVwb3NpdG9yaWVzIGVpdGhlciwgc28gc2tpcCBlbnRpcmVseS5cbiAgICBpZiAoIXJvb3RDb25maWcuaXNXaWxsQm9vc3RlclJlcG8pIHJldHVybjtcbiAgICBjb25zdCBhZ2VSZWNpcGllbnRzID0gZ2V0Rm5veEFnZVJlY2lwaWVudHMocm9vdENvbmZpZyk7XG4gICAgY29uc3Qgcm9vdERpclBhdGggPSBwYXRoLnJlc29sdmUocm9vdENvbmZpZy5kaXJQYXRoKTtcbiAgICBpZiAoIWZzLmV4aXN0c1N5bmMocGF0aC5yZXNvbHZlKHJvb3REaXJQYXRoLCAnZm5veC50b21sJykpKSB7XG4gICAgICAvLyBBIG5lc3RlZC1vbmx5IGZub3ggbGF5b3V0IGlzIHVuc3VwcG9ydGVkOiBzZXR1cFNlY3JldHMgd291bGQgdGFrZSB0aGUgZG90ZW52IHBhdGggYW5kXG4gICAgICAvLyBkZWxldGUgRk5PWF9BR0VfS0VZIGV2ZW4gdGhvdWdoIHRoZSBuZXN0ZWQgY29uZmlnJ3MgQ0kgc3RpbGwgbmVlZHMgaXQuXG4gICAgICB0cnkge1xuICAgICAgICAvLyBPbmx5IGFnZS11c2luZyBjb25maWdzIGNhcnJ5IHRoYXQgcmlzay4gV2l0aG91dCBhIHJvb3QgcHJvdmlkaW5nIHRoZSBhZ2UgcHJvdmlkZXIsIGFcbiAgICAgICAgLy8gc3RyYXkgY29uZmlnIHRoYXQgZGVjbGFyZXMgbm9uZSB1c2VzIG5vIGFnZSBlbmNyeXB0aW9uIGF0IGFsbCAoZS5nLiBhIHBsYWludGV4dCB0ZXN0XG4gICAgICAgIC8vIGZpeHR1cmUgb3IgZXhhbXBsZSBjb25maWcgYW55IHJlcG9zaXRvcnkgbWF5IGxlZ2l0aW1hdGVseSBjb21taXQpLCBzbyBpdCBuZWl0aGVyIG5lZWRzXG4gICAgICAgIC8vIHJlY2lwaWVudCBzeW5jaHJvbml6YXRpb24gbm9yIG93bnMgYW4gRk5PWF9BR0VfS0VZIGFuZCBtdXN0IG5vdCBibG9jayB0aGUgcnVuLlxuICAgICAgICBjb25zdCBzdHJheUZpbGVQYXRocyA9IGxpc3RGbm94TGlrZUZpbGVQYXRocyhyb290RGlyUGF0aCkuZmlsdGVyKChmaWxlUGF0aCkgPT5cbiAgICAgICAgICBkZWNsYXJlc0Zub3hBZ2VQcm92aWRlcihmaWxlUGF0aClcbiAgICAgICAgKTtcbiAgICAgICAgaWYgKHN0cmF5RmlsZVBhdGhzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICBmYWlsRm5veFN5bmMoXG4gICAgICAgICAgICBgRmFpbGVkIHRvIHN5bmNocm9uaXplIGZub3ggYWdlIHJlY2lwaWVudHMgYmVjYXVzZSBmbm94IGNvbmZpZ3MgZXhpc3Qgd2l0aG91dCBhIHJvb3QgZm5veC50b21sOiAke3N0cmF5RmlsZVBhdGhzLmpvaW4oJywgJyl9LiBBZGQgYSByb290IGZub3gudG9tbC5gXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgLy8gRmFpbCBjbG9zZWQ6IHdpdGhvdXQgZ2l0IGluZm9ybWF0aW9uIGEgbmVzdGVkLW9ubHkgZm5veCBsYXlvdXQgY2Fubm90IGJlIHJ1bGVkIG91dCwgYW5kXG4gICAgICAgIC8vIHNldHVwU2VjcmV0cyB3b3VsZCBvdGhlcndpc2UgdGFrZSB0aGUgZG90ZW52IHBhdGggYW5kIGRlbGV0ZSBGTk9YX0FHRV9LRVkuXG4gICAgICAgIGZhaWxGbm94U3luYyhcbiAgICAgICAgICBgRmFpbGVkIHRvIGNoZWNrIGZvciBuZXN0ZWQgZm5veCBjb25maWdzIGR1ZSB0bzogJHsoZXJyb3IgYXMgRXJyb3IgfCB1bmRlZmluZWQpPy5tZXNzYWdlID8/IGVycm9yfWBcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgLy8gQSBmYWlsZWQgdmlzaWJpbGl0eSBsb29rdXAgY29sbGFwc2VzIGlzUHVibGljUmVwbyB0byBmYWxzZSwgd2hpY2ggd291bGQgc2lsZW50bHkgcmUtZW5jcnlwdFxuICAgIC8vIGEgcHVibGljIHJlcG9zaXRvcnkncyB3b3JsZC1yZWFkYWJsZSBjaXBoZXJ0ZXh0cyB0byB0aGUgb3JnLWludGVybmFsIENJIGlkZW50aXR5IChhbmQgdmljZVxuICAgIC8vIHZlcnNhIGRyb3AgdGhlIHB1YmxpYyBvbmUpLiBGYWlsIGluc3RlYWQgb2YgZ3Vlc3Npbmcgd2hlbmV2ZXIgdmlzaWJpbGl0eSBjaGFuZ2VzIHRoZSByb3N0ZXIuXG4gICAgaWYgKCFyb290Q29uZmlnLmlzUmVwb1Zpc2liaWxpdHlLbm93biAmJiBkb2VzRm5veFJlY2lwaWVudFNldERlcGVuZE9uVmlzaWJpbGl0eShyb290Q29uZmlnKSkge1xuICAgICAgZmFpbEZub3hTeW5jKFxuICAgICAgICBgRmFpbGVkIHRvIHN5bmNocm9uaXplIGZub3ggYWdlIHJlY2lwaWVudHMgYmVjYXVzZSB0aGUgdmlzaWJpbGl0eSBvZiAke3Jvb3RDb25maWcucmVwb0F1dGhvcn0vJHtyb290Q29uZmlnLnJlcG9OYW1lfSBjb3VsZCBub3QgYmUgZGV0ZXJtaW5lZCAoR2l0SHViIGxvb2t1cCBmYWlsZWQpIGFuZCB0aGUgQ0kgcmVjaXBpZW50IGRlcGVuZHMgb24gaXQuIENoZWNrIG5ldHdvcmsgYW5kIGdoIGF1dGhlbnRpY2F0aW9uLCB0aGVuIHJlcnVuIHdiZnkuYFxuICAgICAgKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgLy8gQm90aCBDSSBpZGVudGl0aWVzIGFyZSB2aXNpYmlsaXR5LWNvbnN0cmFpbmVkLCBzbyBhIHJlcG9zaXRvcnkgY2FuIGZhbGwgdGhyb3VnaCBCT1RIIChlLmcuIGFcbiAgICAvLyBwdWJsaWMgV2lsbEJvb3N0ZXJMYWIgcmVwb3NpdG9yeSwgd2hvc2Ugb3JnYW5pemF0aW9uIGhhcyBubyBQVUJMSUNfRk5PWF9BR0VfS0VZIHNlY3JldCkuXG4gICAgLy8gUmUtZW5jcnlwdGluZyBmb3IgYSByb3N0ZXIgd2l0aG91dCBhIENJIGlkZW50aXR5IHdvdWxkIGxlYXZlIENJIHVuYWJsZSB0byBkZWNyeXB0IGFueXRoaW5nLFxuICAgIC8vIGZhaWxpbmcgb25seSBhdCBydW50aW1lIGluIEFjdGlvbnM7IGZhaWwgbG91ZGx5IGhlcmUgaW5zdGVhZC5cbiAgICBpZiAoIXJlc29sdmVGbm94Q2lBZ2VLZXlTZWNyZXROYW1lKHJvb3RDb25maWcpKSB7XG4gICAgICBmYWlsRm5veFN5bmMoXG4gICAgICAgIGBGYWlsZWQgdG8gc3luY2hyb25pemUgZm5veCBhZ2UgcmVjaXBpZW50cyBiZWNhdXNlIG5vIENJIGlkZW50aXR5IGlzIHNjb3BlZCB0byAke3Jvb3RDb25maWcucmVwb0F1dGhvcn0vJHtyb290Q29uZmlnLnJlcG9OYW1lfSAocHVibGljIHJlcG9zaXRvcmllcyBhcmUgc3VwcG9ydGVkIG9ubHkgaW4gdGhlIFdpbGxCb29zdGVyIG9yZ2FuaXphdGlvbikuIFByb3Zpc2lvbiB0aGUgbWF0Y2hpbmcgb3JnYW5pemF0aW9uIHNlY3JldCBhbmQgZXh0ZW5kIHRoZSBDSSBzY29wZXMgaW4gd2JmeSBmaXJzdC5gXG4gICAgICApO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICAvLyBUaGUgbWlncmF0aW9uIGlzIHRyYW5zYWN0aW9uYWwgb3ZlciBldmVyeSBtYW5hZ2VkIGZub3gudG9tbDogcmVydW5zIG11c3QgcmV0cnkgZnJvbSB0aGVcbiAgICAvLyBvcmlnaW5hbCBzdGF0ZSwgYW5kIGEgcGFydGlhbGx5IG1pZ3JhdGVkIHRyZWUgY291bGQgb3RoZXJ3aXNlIGJlY29tZSB1bmRlY3J5cHRhYmxlIGZvciB0aGVcbiAgICAvLyBpZGVudGl0eSBwZXJmb3JtaW5nIGEgbGF0ZXIgcmV0cnkgKGUuZy4gd2hlbiBhIHJlY2lwaWVudCBpcyBiZWluZyByZW1vdmVkKS5cbiAgICBjb25zdCBzbmFwc2hvdHMgPSBuZXcgTWFwPHN0cmluZywgc3RyaW5nPigpO1xuICAgIC8vIEEgZmFpbGVkIHN5bmNocm9uaXphdGlvbiBtdXN0IGZhaWwgdGhlIHdob2xlIHdiZnkgcnVuOiBleGl0aW5nIHplcm8gd2l0aCBzdGFsZSByZWNpcGllbnRzXG4gICAgLy8gd291bGQgbGVhdmUgc2VjcmV0cyB1bmRlY3J5cHRhYmxlIGZvciBuZXcgcmVjaXBpZW50cyB3aGlsZSBsb29raW5nIHN1Y2Nlc3NmdWwuXG4gICAgdHJ5IHtcbiAgICAgIC8vIEFueSBmbm94IGNvbmZpZyAoaW5jbHVkaW5nIGFsaWFzZXMgYW5kIGxvY2FsIG92ZXJyaWRlcykgaW4gYW4gYW5jZXN0b3IgZGlyZWN0b3J5IHdvdWxkXG4gICAgICAvLyBtZXJnZSBpbnRvIChhbmQgcG9zc2libHkgYmUgUkVXUklUVEVOIGJ5KSB0aGlzIHJlcG9zaXRvcnkncyBgZm5veCByZWVuY3J5cHRgIHRocm91Z2hcbiAgICAgIC8vIGhpZXJhcmNoaWNhbCBsb2FkaW5nLCB1c2luZyB0aGlzIHJlcG9zaXRvcnkncyByZWNpcGllbnQgc2V0IGZvciBmb3JlaWduIHNlY3JldHMuXG4gICAgICBmb3IgKGxldCBkaXJQYXRoID0gcGF0aC5kaXJuYW1lKHJvb3REaXJQYXRoKTsgOyBkaXJQYXRoID0gcGF0aC5kaXJuYW1lKGRpclBhdGgpKSB7XG4gICAgICAgIGNvbnN0IGFuY2VzdG9yRm5veEZpbGVOYW1lcyA9IGxpc3RGbm94TGlrZUZpbGVOYW1lcyhkaXJQYXRoKTtcbiAgICAgICAgaWYgKGFuY2VzdG9yRm5veEZpbGVOYW1lcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgZmFpbEZub3hTeW5jKFxuICAgICAgICAgICAgYEZhaWxlZCB0byBzeW5jaHJvbml6ZSBmbm94IGFnZSByZWNpcGllbnRzIGJlY2F1c2UgYW4gYW5jZXN0b3IgZGlyZWN0b3J5IGNvbnRhaW5zIGZub3ggY29uZmlncyB0aGF0IGZub3ggd291bGQgaGllcmFyY2hpY2FsbHkgbWVyZ2UgYW5kIHJld3JpdGU6ICR7YW5jZXN0b3JGbm94RmlsZU5hbWVzXG4gICAgICAgICAgICAgIC5tYXAoKG5hbWUpID0+IHBhdGguam9pbihkaXJQYXRoLCBuYW1lKSlcbiAgICAgICAgICAgICAgLmpvaW4oJywgJyl9LiBSZW1vdmUgdGhlbSBvciBtb3ZlIHRoZSByZXBvc2l0b3J5LmBcbiAgICAgICAgICApO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAocGF0aC5kaXJuYW1lKGRpclBhdGgpID09PSBkaXJQYXRoKSBicmVhaztcbiAgICAgIH1cbiAgICAgIC8vIGZub3ggYWxzbyBsb2FkcyBjb21taXR0ZWQgY29uZmlnIGFsaWFzZXMgdGhpcyBnZW5lcmF0b3IgY2Fubm90IGtlZXAgaW4gc3luYy5cbiAgICAgIGNvbnN0IGZub3hMaWtlRmlsZVBhdGhzID0gbGlzdEZub3hMaWtlRmlsZVBhdGhzKHJvb3REaXJQYXRoKTtcbiAgICAgIGNvbnN0IHVuc3VwcG9ydGVkRmlsZVBhdGhzID0gZm5veExpa2VGaWxlUGF0aHMuZmlsdGVyKChmaWxlUGF0aCkgPT4gcGF0aC5iYXNlbmFtZShmaWxlUGF0aCkgIT09ICdmbm94LnRvbWwnKTtcbiAgICAgIGlmICh1bnN1cHBvcnRlZEZpbGVQYXRocy5sZW5ndGggPiAwKSB7XG4gICAgICAgIGZhaWxGbm94U3luYyhcbiAgICAgICAgICBgRmFpbGVkIHRvIHN5bmNocm9uaXplIGZub3ggYWdlIHJlY2lwaWVudHMgYmVjYXVzZSBvbmx5IGZub3gudG9tbCBmaWxlcyBhcmUgc3VwcG9ydGVkOiAke3Vuc3VwcG9ydGVkRmlsZVBhdGhzLmpvaW4oJywgJyl9LiBNZXJnZSB0aGVtIGludG8gdGhlIGFkamFjZW50IGZub3gudG9tbC5gXG4gICAgICAgICk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGRpclBhdGhzID0gbGlzdEZub3hUb21sRGlyUGF0aHMoZm5veExpa2VGaWxlUGF0aHMpO1xuICAgICAgaWYgKCFkaXJQYXRocy5pbmNsdWRlcyhyb290RGlyUGF0aCkpIHtcbiAgICAgICAgZmFpbEZub3hTeW5jKFxuICAgICAgICAgIGBGYWlsZWQgdG8gc3luY2hyb25pemUgZm5veCBhZ2UgcmVjaXBpZW50cyBiZWNhdXNlICR7cGF0aC5yZXNvbHZlKHJvb3REaXJQYXRoLCAnZm5veC50b21sJyl9IGlzIGludmlzaWJsZSB0byBnaXQgKGdpdGlnbm9yZWQ/KS4gQ29tbWl0IGl0IG9yIHJlbW92ZSBpdC5gXG4gICAgICAgICk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIC8vIEdpdC1iYXNlZCBkaXNjb3ZlcnkgY2Fubm90IHNlZSBnaXRpZ25vcmVkIGZpbGVzLCBzbyBhbHNvIGluc3BlY3QgZXZlcnkgZGlyZWN0b3J5IGluIGVhY2hcbiAgICAgIC8vIG1hbmFnZWQgY29uZmlnJ3MgaGllcmFyY2h5IHRocm91Z2ggdGhlIGZpbGVzeXN0ZW06IGEgZ2l0aWdub3JlZCBhbGlhcyAoZS5nLiAuZm5veC50b21sKVxuICAgICAgLy8gb3IgYSBnaXRpZ25vcmVkIGZub3gudG9tbCBpbiBhbiBpbnRlcm1lZGlhdGUgZGlyZWN0b3J5IHdvdWxkIHN0aWxsIGJlIGxvYWRlZCBieSBmbm94IGFuZFxuICAgICAgLy8gY291bGQgb3ZlcnJpZGUgdGhlIHByb3ZpZGVyIHVzZWQgZm9yIG5lc3RlZCByZS1lbmNyeXB0aW9uLlxuICAgICAgY29uc3QgbWFuYWdlZERpclBhdGhzID0gbmV3IFNldChkaXJQYXRocyk7XG4gICAgICBmb3IgKGNvbnN0IGRpclBhdGggb2YgZGlyUGF0aHMpIHtcbiAgICAgICAgZm9yIChjb25zdCBoaWVyYXJjaHlEaXJQYXRoIG9mIGxpc3RBbmNlc3RvckRpclBhdGhzKGRpclBhdGgsIHJvb3REaXJQYXRoKSkge1xuICAgICAgICAgIGNvbnN0IHN0cmF5RmlsZU5hbWVzID0gbGlzdEZub3hMaWtlRmlsZU5hbWVzKGhpZXJhcmNoeURpclBhdGgpLmZpbHRlcihcbiAgICAgICAgICAgIChuYW1lKSA9PiBuYW1lICE9PSAnZm5veC5sb2NhbC50b21sJyAmJiAhKG5hbWUgPT09ICdmbm94LnRvbWwnICYmIG1hbmFnZWREaXJQYXRocy5oYXMoaGllcmFyY2h5RGlyUGF0aCkpXG4gICAgICAgICAgKTtcbiAgICAgICAgICBpZiAoc3RyYXlGaWxlTmFtZXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgZmFpbEZub3hTeW5jKFxuICAgICAgICAgICAgICBgRmFpbGVkIHRvIHN5bmNocm9uaXplIGZub3ggYWdlIHJlY2lwaWVudHMgYmVjYXVzZSBmbm94IHdvdWxkIGxvYWQgdW5tYW5hZ2VkIChnaXRpZ25vcmVkPykgY29uZmlnczogJHtzdHJheUZpbGVOYW1lc1xuICAgICAgICAgICAgICAgIC5tYXAoKG5hbWUpID0+IHBhdGguam9pbihoaWVyYXJjaHlEaXJQYXRoLCBuYW1lKSlcbiAgICAgICAgICAgICAgICAuam9pbignLCAnKX0uIENvbW1pdCB0aGVtIGFzIGZub3gudG9tbCBvciByZW1vdmUgdGhlbS5gXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cbiAgICAgICAgICAvLyBBIGZub3gubG9jYWwudG9tbCBhbnl3aGVyZSBpbiB0aGUgbWVyZ2VkIGhpZXJhcmNoeSAobm90IG9ubHkgbmV4dCB0byBhIG1hbmFnZWRcbiAgICAgICAgICAvLyBjb25maWcpIGNhbiBvdmVycmlkZSBwcm92aWRlcnMuXG4gICAgICAgICAgY29uc3QgbG9jYWxJc3N1ZSA9IGZpbmRGbm94TG9jYWxUb21sSXNzdWUoaGllcmFyY2h5RGlyUGF0aCk7XG4gICAgICAgICAgaWYgKGxvY2FsSXNzdWUpIHtcbiAgICAgICAgICAgIGZhaWxGbm94U3luYyhcbiAgICAgICAgICAgICAgYEZhaWxlZCB0byBzeW5jaHJvbml6ZSBmbm94IGFnZSByZWNpcGllbnRzIGJlY2F1c2UgJHtsb2NhbElzc3VlfS4gS2VlcCBvbmx5IG1hY2hpbmUtbG9jYWwgc2VjcmV0IG92ZXJyaWRlcyB0aGVyZS5gXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgLy8gVGhlIGluLW1lbW9yeSBzbmFwc2hvdHMgZG8gbm90IHN1cnZpdmUgYSBraWxsZWQgcHJvY2Vzcywgc28gYSBkdXJhYmxlIG1hcmtlciBpcyB3cml0dGVuXG4gICAgICAvLyBiZWZvcmUgdGhlIGZpcnN0IG11dGF0aW9uIGFuZCByZW1vdmVkIG9ubHkgd2hlbiB0aGUgdHJlZSBpcyBjb25zaXN0ZW50IGFnYWluLiBBIGxlZnRvdmVyXG4gICAgICAvLyBtYXJrZXIgbWVhbnMgYSBwcmV2aW91cyBydW4gd2FzIGtpbGxlZCBtaWQtbWlncmF0aW9uIChvciBjb3VsZCBub3QgcmVzdG9yZSk6IHNvbWVcbiAgICAgIC8vIGNpcGhlcnRleHRzIG1heSBub3QgbWF0Y2ggdGhlIHJlY2lwaWVudHMsIG9yIG1heSBldmVuIGJlIHVuZGVjcnlwdGFibGUgZm9yIHRoZSBleGVjdXRvcidzXG4gICAgICAvLyBpZGVudGl0eSB3aGVuIGEgcmVjaXBpZW50IHdhcyBiZWluZyByZW1vdmVkIOKAlCBzdGF0ZXMgdGhpcyBjb2RlIGNhbm5vdCByZXBhaXIgc2FmZWx5XG4gICAgICAvLyBiZWNhdXNlIHRoZSB3b3JraW5nIHRyZWUgbWF5IGhhdmUgY2hhbmdlZCBzaW5jZSAoYnJhbmNoIHN3aXRjaGVzLCBtYW51YWwgZWRpdHMpLiBUaGVcbiAgICAgIC8vIGZub3gudG9tbCBmaWxlcyBhcmUgZ2l0LXRyYWNrZWQsIHNvIHRoZSB1c2VyIHJlc3RvcmVzIHRoZW0gdmlhIGdpdCBhbmQgY2xlYXJzIHRoZSBtYXJrZXIuXG4gICAgICBtaWdyYXRpb25NYXJrZXJQYXRoID0gcGF0aC5yZXNvbHZlKHJvb3REaXJQYXRoLCAnLnRtcCcsICd3YmZ5LWZub3gtbWlncmF0aW9uLW1hcmtlcicpO1xuICAgICAgaWYgKGZzLmV4aXN0c1N5bmMobWlncmF0aW9uTWFya2VyUGF0aCkpIHtcbiAgICAgICAgZmFpbEZub3hTeW5jKFxuICAgICAgICAgIGBGYWlsZWQgdG8gc3luY2hyb25pemUgZm5veCBhZ2UgcmVjaXBpZW50cyBiZWNhdXNlIGEgcHJldmlvdXMgbWlncmF0aW9uIHdhcyBpbnRlcnJ1cHRlZC4gUmVzdG9yZSB0aGUgZm5veC50b21sIGZpbGVzIHZpYSBnaXQgKGUuZy4gXFxgZ2l0IHN0YXR1c1xcYCBhbmQgXFxgZ2l0IHJlc3RvcmUgLS0gJypmbm94Ki50b21sJ1xcYCBpZiB5b3UgaGF2ZSBubyBpbnRlbnRpb25hbCBsb2NhbCBjaGFuZ2VzKSwgdGhlbiBkZWxldGUgJHttaWdyYXRpb25NYXJrZXJQYXRofSBhbmQgcmVydW4gd2JmeS5gXG4gICAgICAgICk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgLy8gQSB0cmFja2VkIHN5bWxpbmsgbmFtZWQgZm5veC50b21sIChvciBhIHN5bWxpbmtlZCBwYXJlbnQgZGlyZWN0b3J5KSB3b3VsZCBtYWtlIHRoZVxuICAgICAgLy8gcmV3cml0ZSBhbmQgYGZub3ggcmVlbmNyeXB0YCByZWFkIGFuZCBNT0RJRlkgZmlsZXMgb3V0c2lkZSB0aGlzIHJlcG9zaXRvcnkuXG4gICAgICBjb25zdCByZWFsUm9vdERpclBhdGggPSBmcy5yZWFscGF0aFN5bmMocm9vdERpclBhdGgpO1xuICAgICAgZm9yIChjb25zdCBkaXJQYXRoIG9mIGRpclBhdGhzKSB7XG4gICAgICAgIGNvbnN0IGZub3hUb21sUGF0aCA9IHBhdGgucmVzb2x2ZShkaXJQYXRoLCAnZm5veC50b21sJyk7XG4gICAgICAgIGNvbnN0IHJlYWxQYXRoID0gZnMucmVhbHBhdGhTeW5jKGZub3hUb21sUGF0aCk7XG4gICAgICAgIGlmIChmcy5sc3RhdFN5bmMoZm5veFRvbWxQYXRoKS5pc1N5bWJvbGljTGluaygpIHx8ICFyZWFsUGF0aC5zdGFydHNXaXRoKHJlYWxSb290RGlyUGF0aCArIHBhdGguc2VwKSkge1xuICAgICAgICAgIGZhaWxGbm94U3luYyhcbiAgICAgICAgICAgIGBGYWlsZWQgdG8gc3luY2hyb25pemUgZm5veCBhZ2UgcmVjaXBpZW50cyBiZWNhdXNlICR7Zm5veFRvbWxQYXRofSBpcyBhIHN5bWxpbmsgb3IgcmVzb2x2ZXMgb3V0c2lkZSB0aGUgcmVwb3NpdG9yeSAoJHtyZWFsUGF0aH0pLiBSZXBsYWNlIGl0IHdpdGggYSByZWd1bGFyIGluLXJlcG9zaXRvcnkgZmlsZS5gXG4gICAgICAgICAgKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgc25hcHNob3RzLnNldChmbm94VG9tbFBhdGgsIGZzLnJlYWRGaWxlU3luYyhmbm94VG9tbFBhdGgsICd1dGY4JykpO1xuICAgICAgfVxuXG4gICAgICAvLyBTb3J0ZWQgb3JkZXIgcHJvY2Vzc2VzIGFuY2VzdG9ycyBiZWZvcmUgZGVzY2VuZGFudHMsIHNvIGNvbmZpZ3MgaW5oZXJpdGluZyBhbiB1cGRhdGVkXG4gICAgICAvLyBwcm92aWRlciByZS1lbmNyeXB0IGFnYWluc3QgdGhlIGFscmVhZHktdXBkYXRlZCByZWNpcGllbnRzLlxuICAgICAgY29uc3QgY2hhbmdlZERpclBhdGhzOiBzdHJpbmdbXSA9IFtdO1xuICAgICAgbGV0IGFueUZhaWxlZCA9IGZhbHNlO1xuICAgICAgZm9yIChjb25zdCBkaXJQYXRoIG9mIGRpclBhdGhzKSB7XG4gICAgICAgIGNvbnN0IGFuY2VzdG9yQ2hhbmdlZCA9IGNoYW5nZWREaXJQYXRocy5zb21lKChjaGFuZ2VkRGlyUGF0aCkgPT4gZGlyUGF0aC5zdGFydHNXaXRoKGNoYW5nZWREaXJQYXRoICsgcGF0aC5zZXApKTtcbiAgICAgICAgLy8gRXZlcnkgZGlyUGF0aCB3YXMgc25hcHNob3R0ZWQgYWJvdmUuIEEgbWlzc2luZyBzbmFwc2hvdCBtdXN0IGZhaWwgaGFyZDogZmFsbGluZyBiYWNrIHRvXG4gICAgICAgIC8vIGFuIGVtcHR5IHN0cmluZyB3b3VsZCBmbG93IGludG8gcmVwbGFjZUFnZVJlY2lwaWVudHMgYW5kIG92ZXJ3cml0ZSB0aGUgcmVhbCBmbm94LnRvbWxcbiAgICAgICAgLy8gd2l0aCBhIHJlY2lwaWVudHMtb25seSBmaWxlLCBkZXN0cm95aW5nIGV2ZXJ5IGNvbW1pdHRlZCBzZWNyZXQuXG4gICAgICAgIGNvbnN0IHNuYXBzaG90Q29udGVudCA9IHNuYXBzaG90cy5nZXQocGF0aC5yZXNvbHZlKGRpclBhdGgsICdmbm94LnRvbWwnKSk7XG4gICAgICAgIGlmIChzbmFwc2hvdENvbnRlbnQgPT09IHVuZGVmaW5lZCkgdGhyb3cgbmV3IEVycm9yKGBNaXNzaW5nIGZub3gudG9tbCBzbmFwc2hvdCBmb3IgJHtkaXJQYXRofS5gKTtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgc3luY2hyb25pemVGbm94QWdlUmVjaXBpZW50cyhcbiAgICAgICAgICBkaXJQYXRoLFxuICAgICAgICAgIHJvb3REaXJQYXRoLFxuICAgICAgICAgIGRpclBhdGggPT09IHJvb3REaXJQYXRoLFxuICAgICAgICAgIGFuY2VzdG9yQ2hhbmdlZCxcbiAgICAgICAgICBzbmFwc2hvdENvbnRlbnQsXG4gICAgICAgICAgYWdlUmVjaXBpZW50c1xuICAgICAgICApO1xuICAgICAgICBpZiAocmVzdWx0ID09PSAnY2hhbmdlZCcpIGNoYW5nZWREaXJQYXRocy5wdXNoKGRpclBhdGgpO1xuICAgICAgICBhbnlGYWlsZWQgfHw9IHJlc3VsdCA9PT0gJ2ZhaWxlZCc7XG4gICAgICB9XG4gICAgICBpZiAoYW55RmFpbGVkKSB7XG4gICAgICAgIC8vIEEgZmFpbGVkIHJlLWVuY3J5cHRpb24gbWF5IGhhdmUgcmV3cml0dGVuIHNvbWUgY2lwaGVydGV4dHMsIHNvIHJlc3RvcmUgdW5jb25kaXRpb25hbGx5LlxuICAgICAgICAvLyBUaGUgbWFya2VyIGlzIHJlbW92ZWQgb25seSB3aGVuIHJlc3RvcmF0aW9uIGZ1bGx5IHN1Y2NlZWRlZCBhbmQgdGhlIHRyZWUgaXMgY29uc2lzdGVudC5cbiAgICAgICAgLy8gUmVzdG9yZSBPTkxZIHdoZW4gdGhpcyBydW4gb3ducyB0aGUgbWFya2VyOiBldmVyeSBjb21taXR0ZWQtY29uZmlnIG11dGF0aW9uIGhhcHBlbnNcbiAgICAgICAgLy8gYWZ0ZXIgbWFya2VyIGFjcXVpc2l0aW9uLCBzbyBhIG5vbi1vd25lciAoZS5nLiBsb3NpbmcgYSByYWNlIGFnYWluc3QgYSBjb25jdXJyZW50IHdiZnkpXG4gICAgICAgIC8vIGhhcyBjaGFuZ2VkIG5vdGhpbmcgYW5kIG11c3Qgbm90IG92ZXJ3cml0ZSB0aGUgb3duZXIncyBpbi1wcm9ncmVzcyBtaWdyYXRpb24uXG4gICAgICAgIGlmIChtaWdyYXRpb25NYXJrZXJPd25lZCAmJiByZXN0b3JlU25hcHNob3RzKHNuYXBzaG90cykpIHJlbW92ZU93bmVkTWlncmF0aW9uTWFya2VyKCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZW1vdmVPd25lZE1pZ3JhdGlvbk1hcmtlcigpO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBpZiAobWlncmF0aW9uTWFya2VyT3duZWQgJiYgcmVzdG9yZVNuYXBzaG90cyhzbmFwc2hvdHMpKSB7XG4gICAgICAgIHJlbW92ZU93bmVkTWlncmF0aW9uTWFya2VyKCk7XG4gICAgICB9XG4gICAgICBmYWlsRm5veFN5bmMoYEZhaWxlZCB0byBzeW5jaHJvbml6ZSBmbm94IGFnZSByZWNpcGllbnRzIGR1ZSB0bzogJHsoZXJyb3IgYXMgRXJyb3IgfCB1bmRlZmluZWQpPy5zdGFjayA/PyBlcnJvcn1gKTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgbWlncmF0aW9uTWFya2VyUGF0aCA9IHVuZGVmaW5lZDtcbiAgICAgIG1pZ3JhdGlvbk1hcmtlck93bmVkID0gZmFsc2U7XG4gICAgfVxuICB9KTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gc3luY2hyb25pemVGbm94QWdlUmVjaXBpZW50cyhcbiAgZGlyUGF0aDogc3RyaW5nLFxuICByb290RGlyUGF0aDogc3RyaW5nLFxuICBpc1Jvb3Q6IGJvb2xlYW4sXG4gIGFuY2VzdG9yUmVjaXBpZW50c0NoYW5nZWQ6IGJvb2xlYW4sXG4gIG9yaWdpbmFsQ29udGVudDogc3RyaW5nLFxuICBhZ2VSZWNpcGllbnRzOiByZWFkb25seSBGbm94QWdlUmVjaXBpZW50W11cbik6IFByb21pc2U8J2NoYW5nZWQnIHwgJ3VuY2hhbmdlZCcgfCAnZmFpbGVkJz4ge1xuICBjb25zdCBmbm94VG9tbFBhdGggPSBwYXRoLnJlc29sdmUoZGlyUGF0aCwgJ2Zub3gudG9tbCcpO1xuXG4gIC8vIFJlY2lwaWVudCBzeW5jaHJvbml6YXRpb24gb25seSB1bmRlcnN0YW5kcyB0aGUgc3RhbmRhcmQgc2luZ2xlLWZpbGUgbGF5b3V0IHdpdGggb25lXG4gIC8vIHRvcC1sZXZlbCBhZ2UgcHJvdmlkZXIgbmFtZWQgYGFnZWAuIEdpdGlnbm9yZWQgY29uZmlnIGFsaWFzZXMgKGUuZy4gLmZub3gubG9jYWwudG9tbCkgdGhhdFxuICAvLyBnaXQtYmFzZWQgZGlzY292ZXJ5IGNhbm5vdCBzZWUsIGltcG9ydHMsIGRpZmZlcmVudGx5IG5hbWVkIGFnZSBwcm92aWRlcnMsIG9yIHByb3ZpZGVyXG4gIC8vIG92ZXJyaWRlcyB3b3VsZCBrZWVwIHVzaW5nIHJlY2lwaWVudCBzZXRzIHRoaXMgZ2VuZXJhdG9yIGRvZXMgbm90IHJld3JpdGUsIHNvIHRoZWlyIHNlY3JldHNcbiAgLy8gd291bGQgc2lsZW50bHkgc3RheSB1bmRlY3J5cHRhYmxlIGZvciBuZXcgcmVjaXBpZW50czsgZmFpbCBpbnN0ZWFkIG9mIHByb2NlZWRpbmcuIFRoZVxuICAvLyBnaXRpZ25vcmVkIGZub3gubG9jYWwudG9tbCBpcyBhIHN1cHBvcnRlZCBtYWNoaW5lLWxvY2FsIG92ZXJyaWRlLCBidXQgb25seSB3aGlsZSBpdCBsZWF2ZXNcbiAgLy8gcHJvdmlkZXJzIGFsb25lLlxuICBjb25zdCB1bnN1cHBvcnRlZEZpbGVOYW1lcyA9IGxpc3RGbm94TGlrZUZpbGVOYW1lcyhkaXJQYXRoKS5maWx0ZXIoXG4gICAgKG5hbWUpID0+IG5hbWUgIT09ICdmbm94LnRvbWwnICYmIG5hbWUgIT09ICdmbm94LmxvY2FsLnRvbWwnXG4gICk7XG4gIGlmICh1bnN1cHBvcnRlZEZpbGVOYW1lcy5sZW5ndGggPiAwKSB7XG4gICAgZmFpbEZub3hTeW5jKFxuICAgICAgYEZhaWxlZCB0byBzeW5jaHJvbml6ZSBmbm94IGFnZSByZWNpcGllbnRzIGluICR7ZGlyUGF0aH0gYmVjYXVzZSBvbmx5IGZub3gudG9tbCBhbmQgZm5veC5sb2NhbC50b21sIGFyZSBzdXBwb3J0ZWQ6ICR7dW5zdXBwb3J0ZWRGaWxlTmFtZXMuam9pbignLCAnKX0uIE1lcmdlIHRoZW0gaW50byBmbm94LnRvbWwuYFxuICAgICk7XG4gICAgcmV0dXJuICdmYWlsZWQnO1xuICB9XG4gIC8vIEEgc3RhbGUgYmFja3VwIGxlZnQgYnkgYW4gaW50ZXJydXB0ZWQgZWFybGllciBydW4gbXVzdCBiZSByZXN0b3JlZCBzbyB0aGUgdXNlcidzIGxvY2FsXG4gIC8vIG92ZXJyaWRlcyBhcmUgbmV2ZXIgc2lsZW50bHkgbG9zdCAodGhlIG1pZ3JhdGlvbiBtYXJrZXIgc2VwYXJhdGVseSBibG9ja3MgdGhpcyBydW4gd2hlbiB0aGVcbiAgLy8gaW50ZXJydXB0aW9uIGxlZnQgdGhlIG1pZ3JhdGlvbiBpdHNlbGYgaW5jb21wbGV0ZSkuXG4gIHJlY292ZXJTdGFsZUZub3hMb2NhbEJhY2t1cChyb290RGlyUGF0aCwgZGlyUGF0aCk7XG5cbiAgY29uc3QgbGF5b3V0SXNzdWUgPSBmaW5kRm5veExheW91dElzc3VlKG9yaWdpbmFsQ29udGVudCk7XG4gIGlmIChsYXlvdXRJc3N1ZSkge1xuICAgIGZhaWxGbm94U3luYyhgRmFpbGVkIHRvIHN5bmNocm9uaXplIGZub3ggYWdlIHJlY2lwaWVudHMgYmVjYXVzZSAke2Zub3hUb21sUGF0aH0gJHtsYXlvdXRJc3N1ZX0uYCk7XG4gICAgcmV0dXJuICdmYWlsZWQnO1xuICB9XG4gIGNvbnN0IHNldHRpbmdzID0gQnVuLlRPTUwucGFyc2Uob3JpZ2luYWxDb250ZW50KSBhcyBGbm94VG9tbDtcbiAgY29uc3QgcHJvZmlsZU5hbWVzID0gT2JqZWN0LmtleXMoc2V0dGluZ3MucHJvZmlsZXMgPz8ge30pO1xuICBjb25zdCBjdXJyZW50UmVjaXBpZW50cyA9IHJlYWRGbm94QWdlUmVjaXBpZW50cyhvcmlnaW5hbENvbnRlbnQpO1xuXG4gIC8vIEEgbmVzdGVkIGZub3gudG9tbCB3aXRob3V0IGl0cyBvd24gYWdlIHByb3ZpZGVyIGluaGVyaXRzIHRoZSBuZWFyZXN0IGFuY2VzdG9yJ3Mgb25lIHRocm91Z2hcbiAgLy8gZm5veCdzIGhpZXJhcmNoaWNhbCBsb2FkaW5nLCBzbyBvbmx5IHRoZSByb290IGNvbmZpZyBtdXN0IGRlY2xhcmUgdGhlIHByb3ZpZGVyIOKAlCBidXQgdGhlXG4gIC8vIG5lc3RlZCBjb25maWcncyBvd24gY2lwaGVydGV4dHMgc3RpbGwgbXVzdCBiZSByZS1lbmNyeXB0ZWQgd2hlbmV2ZXIgYW4gYW5jZXN0b3IncyByZWNpcGllbnRzXG4gIC8vIGNoYW5nZWQsIGFuZCB0aGF0IG9ubHkgaGFwcGVucyB3aGVuIGBmbm94IHJlZW5jcnlwdGAgcnVucyBmcm9tIHRoZSBuZXN0ZWQgZGlyZWN0b3J5LlxuICBpZiAoIWlzUm9vdCAmJiAhY3VycmVudFJlY2lwaWVudHMpIHtcbiAgICBpZiAoYW5jZXN0b3JSZWNpcGllbnRzQ2hhbmdlZCkge1xuICAgICAgd3JpdGVNaWdyYXRpb25NYXJrZXIoKTtcbiAgICAgIGlmICghcmVlbmNyeXB0Rm5veFNlY3JldHMoZGlyUGF0aCwgcm9vdERpclBhdGgsIHByb2ZpbGVOYW1lcykpIHtcbiAgICAgICAgZmFpbEZub3hTeW5jKFxuICAgICAgICAgIGBGYWlsZWQgdG8gcmUtZW5jcnlwdCBmbm94IHNlY3JldHMgaW4gJHtkaXJQYXRofSBmb3IgdGhlIHVwZGF0ZWQgcmVjaXBpZW50cy4gRml4IHRoZSBlcnJvciBhbmQgcmVydW4gd2JmeS5gXG4gICAgICAgICk7XG4gICAgICAgIHJldHVybiAnZmFpbGVkJztcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuICd1bmNoYW5nZWQnO1xuICB9XG5cbiAgaWYgKFxuICAgIGN1cnJlbnRSZWNpcGllbnRzICYmXG4gICAgY3VycmVudFJlY2lwaWVudHMuc2l6ZSA9PT0gYWdlUmVjaXBpZW50cy5sZW5ndGggJiZcbiAgICBhZ2VSZWNpcGllbnRzLmV2ZXJ5KChyZWNpcGllbnQpID0+IGN1cnJlbnRSZWNpcGllbnRzLmhhcyhyZWNpcGllbnQucHVibGljS2V5KSlcbiAgKSB7XG4gICAgcmV0dXJuICd1bmNoYW5nZWQnO1xuICB9XG5cbiAgLy8gUmV3cml0ZSBvbmx5IHRoZSByZWNpcGllbnRzIGFzc2lnbm1lbnQgc28gdXNlci1hdXRob3JlZCBjb21tZW50cyBhbmQgZm9ybWF0dGluZyBzdXJ2aXZlLlxuICAvLyBSZS1wYXJzZSBiZWZvcmUgd3JpdGluZzogYW4gdW51c3VhbCBsYXlvdXQgKGUuZy4gZG90dGVkIGtleXMpIGNvdWxkIG1ha2UgdGhlIHRleHR1YWwgZWRpdFxuICAvLyBwcm9kdWNlIGEgZHVwbGljYXRlIHRhYmxlIG9yIGxlYXZlIHRoZSBvbGQgcmVjaXBpZW50cyBpbiBlZmZlY3QuXG4gIGNvbnN0IHVwZGF0ZWRDb250ZW50ID0gcmVwbGFjZUFnZVJlY2lwaWVudHMob3JpZ2luYWxDb250ZW50LCBhZ2VSZWNpcGllbnRzKTtcbiAgY29uc3QgdXBkYXRlZFJlY2lwaWVudHMgPSBbLi4uKHJlYWRGbm94QWdlUmVjaXBpZW50cyh1cGRhdGVkQ29udGVudCkgPz8gW10pXTtcbiAgaWYgKFxuICAgIHVwZGF0ZWRSZWNpcGllbnRzLmxlbmd0aCAhPT0gYWdlUmVjaXBpZW50cy5sZW5ndGggfHxcbiAgICAhYWdlUmVjaXBpZW50cy5ldmVyeSgocmVjaXBpZW50KSA9PiB1cGRhdGVkUmVjaXBpZW50cy5pbmNsdWRlcyhyZWNpcGllbnQucHVibGljS2V5KSlcbiAgKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBSZXdyaXRpbmcgdGhlIGFnZSByZWNpcGllbnRzIGluICR7Zm5veFRvbWxQYXRofSBkaWQgbm90IHRha2UgZWZmZWN0OyB1cGRhdGUgdGhlbSBtYW51YWxseS5gKTtcbiAgfVxuICB3cml0ZU1pZ3JhdGlvbk1hcmtlcigpO1xuICBhd2FpdCBmc1V0aWwuZ2VuZXJhdGVGaWxlKGZub3hUb21sUGF0aCwgdXBkYXRlZENvbnRlbnQpO1xuXG4gIGlmICghcmVlbmNyeXB0Rm5veFNlY3JldHMoZGlyUGF0aCwgcm9vdERpclBhdGgsIHByb2ZpbGVOYW1lcykpIHtcbiAgICAvLyBSZXN0b3JlIHRoZSBvcmlnaW5hbCBjb25maWc6IGtlZXBpbmcgdGhlIG5ldyByZWNpcGllbnRzIHdpdGggb2xkIGNpcGhlcnRleHRzIHdvdWxkIG1ha2VcbiAgICAvLyB0aGlzIGdlbmVyYXRvciBza2lwIHJlLWVuY3J5cHRpb24gZm9yZXZlciBhbmQgbGV0IHNldHVwU2VjcmV0cyB1cGxvYWQgYSBDSSBrZXkgdGhhdFxuICAgIC8vIGNhbm5vdCBkZWNyeXB0IGFueXRoaW5nLiBUaGUgb2xkIGNpcGhlcnRleHRzIHJlbWFpbiB2YWxpZCBmb3IgdGhlIG9sZCByZWNpcGllbnRzLlxuICAgIGF3YWl0IGZzVXRpbC5nZW5lcmF0ZUZpbGUoZm5veFRvbWxQYXRoLCBvcmlnaW5hbENvbnRlbnQpO1xuICAgIGZhaWxGbm94U3luYyhcbiAgICAgIGBGYWlsZWQgdG8gcmUtZW5jcnlwdCBmbm94IHNlY3JldHMgaW4gJHtkaXJQYXRofSBmb3IgdGhlIHVwZGF0ZWQgcmVjaXBpZW50cy4gRml4IHRoZSBlcnJvciBhbmQgcmVydW4gd2JmeS5gXG4gICAgKTtcbiAgICByZXR1cm4gJ2ZhaWxlZCc7XG4gIH1cbiAgcmV0dXJuICdjaGFuZ2VkJztcbn1cblxuLyoqXG4gKiBSZXR1cm5zIGEgZGVzY3JpcHRpb24gb2YgYSBmbm94LnRvbWwgbGF5b3V0IHRoYXQgcmVjaXBpZW50IHN5bmNocm9uaXphdGlvbiBhbmQgdGhlIENJLWtleVxuICogdmVyaWZpY2F0aW9uIGNhbm5vdCBjb3Zlciwgb3IgdW5kZWZpbmVkIHdoZW4gdGhlIHN0YW5kYXJkIHNpbmdsZS1maWxlLCBzaW5nbGUtYWdlLXByb3ZpZGVyXG4gKiBsYXlvdXQgaXMgdXNlZC5cbiAqL1xuZnVuY3Rpb24gZmluZEZub3hMYXlvdXRJc3N1ZShmbm94VG9tbENvbnRlbnQ6IHN0cmluZyk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIHRyeSB7XG4gICAgY29uc3Qgc2V0dGluZ3MgPSBCdW4uVE9NTC5wYXJzZShmbm94VG9tbENvbnRlbnQpIGFzIEZub3hUb21sO1xuICAgIGlmIChzZXR0aW5ncy5pbXBvcnQgIT09IHVuZGVmaW5lZCkgcmV0dXJuICd1c2VzIHRoZSB1bnN1cHBvcnRlZCBgaW1wb3J0YCBzZXR0aW5nJztcbiAgICBjb25zdCBub25TdGFuZGFyZEFnZVByb3ZpZGVyTmFtZXMgPSBPYmplY3QuZW50cmllcyhzZXR0aW5ncy5wcm92aWRlcnMgPz8ge30pXG4gICAgICAuZmlsdGVyKChbbmFtZSwgcHJvdmlkZXJdKSA9PiAocHJvdmlkZXI/LnR5cGUgPT09ICdhZ2UnKSAhPT0gKG5hbWUgPT09ICdhZ2UnKSlcbiAgICAgIC5tYXAoKFtuYW1lXSkgPT4gbmFtZSk7XG4gICAgaWYgKG5vblN0YW5kYXJkQWdlUHJvdmlkZXJOYW1lcy5sZW5ndGggPiAwKSB7XG4gICAgICByZXR1cm4gYGRlY2xhcmVzIGFnZSBwcm92aWRlcnMgbm90IG5hbWVkIFxcYGFnZVxcYCAob3IgYW4gXFxgYWdlXFxgIHByb3ZpZGVyIG9mIGFub3RoZXIgdHlwZSk6ICR7bm9uU3RhbmRhcmRBZ2VQcm92aWRlck5hbWVzLmpvaW4oJywgJyl9YDtcbiAgICB9XG4gICAgY29uc3QgcHJvZmlsZXNXaXRoUHJvdmlkZXJzID0gT2JqZWN0LmVudHJpZXMoc2V0dGluZ3MucHJvZmlsZXMgPz8ge30pXG4gICAgICAuZmlsdGVyKChbLCBwcm9maWxlXSkgPT4gcHJvZmlsZT8ucHJvdmlkZXJzKVxuICAgICAgLm1hcCgoW25hbWVdKSA9PiBuYW1lKTtcbiAgICBpZiAocHJvZmlsZXNXaXRoUHJvdmlkZXJzLmxlbmd0aCA+IDApIHtcbiAgICAgIHJldHVybiBgZGVjbGFyZXMgdW5zdXBwb3J0ZWQgcHJvZmlsZS1zcGVjaWZpYyBwcm92aWRlcnM6ICR7cHJvZmlsZXNXaXRoUHJvdmlkZXJzLmpvaW4oJywgJyl9YDtcbiAgICB9XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuICdjYW5ub3QgYmUgcGFyc2VkIGFzIFRPTUwnO1xuICB9XG59XG5cbi8qKlxuICogUmVhZHMgdGhlIFtwcm92aWRlcnMuYWdlXS5yZWNpcGllbnRzIG9mIGEgZm5veC50b21sLCBvciB1bmRlZmluZWQgd2hlbiB0aGUgY29uZmlnIGRlY2xhcmVzIG5vXG4gKiBhZ2UgcHJvdmlkZXIgKG5lc3RlZCBjb25maWdzIHRoZW4gaW5oZXJpdCB0aGUgcm9vdCBvbmUpLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVhZEZub3hBZ2VSZWNpcGllbnRzKGZub3hUb21sQ29udGVudDogc3RyaW5nKTogU2V0PHN0cmluZz4gfCB1bmRlZmluZWQge1xuICB0cnkge1xuICAgIGNvbnN0IHNldHRpbmdzID0gQnVuLlRPTUwucGFyc2UoZm5veFRvbWxDb250ZW50KSBhcyBGbm94VG9tbDtcbiAgICBpZiAoIXNldHRpbmdzLnByb3ZpZGVycz8uYWdlKSByZXR1cm4gdW5kZWZpbmVkO1xuICAgIGNvbnN0IHJlY2lwaWVudHMgPSBzZXR0aW5ncy5wcm92aWRlcnMuYWdlLnJlY2lwaWVudHM7XG4gICAgcmV0dXJuIG5ldyBTZXQoQXJyYXkuaXNBcnJheShyZWNpcGllbnRzKSA/IHJlY2lwaWVudHMuZmlsdGVyKChyKTogciBpcyBzdHJpbmcgPT4gdHlwZW9mIHIgPT09ICdzdHJpbmcnKSA6IFtdKTtcbiAgfSBjYXRjaCB7XG4gICAgLy8gQW4gdW5wYXJzYWJsZSBmbm94LnRvbWwgeWllbGRzIG5vIHJlY2lwaWVudHMsIHNvIHRoZSBjYWxsZXIgcmVwb3J0cyBhbiBlcnJvci5cbiAgICByZXR1cm4gbmV3IFNldCgpO1xuICB9XG59XG5cbnR5cGUgRm5veFJlcG9zaXRvcnlJZGVudGl0eSA9IFBpY2s8UGFja2FnZUNvbmZpZywgJ3JlcG9BdXRob3InIHwgJ3JlcG9OYW1lJyB8ICdpc1B1YmxpY1JlcG8nIHwgJ2lzUmVwb1Zpc2liaWxpdHlLbm93bic+O1xuXG4vKipcbiAqIFRoZSBHaXRIdWIgc2VjcmV0IGhvbGRpbmcgdGhlIHByaXZhdGUga2V5IG9mIHRoZSBDSSBpZGVudGl0eSBzY29wZWQgdG8gdGhlIHJlcG9zaXRvcnksIG9yXG4gKiB1bmRlZmluZWQgd2hlbiBub25lIGlzIChhbiB1bmtub3duIHZpc2liaWxpdHksIG9yIGEgcmVwb3NpdG9yeSBubyBDSSBzY29wZSBjb3ZlcnMpLiBUaGUgc2luZ2xlXG4gKiBzb3VyY2Ugb2YgdHJ1dGggc2hhcmVkIGJ5IHRoZSByZWNpcGllbnQgc3luYyBhbmQgdGhlIHdvcmtmbG93IGdlbmVyYXRvcidzIGNhbGxlciBtYXBwaW5ncy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlc29sdmVGbm94Q2lBZ2VLZXlTZWNyZXROYW1lKFxuICBjb25maWc6IEZub3hSZXBvc2l0b3J5SWRlbnRpdHlcbik6ICdGTk9YX0FHRV9LRVknIHwgJ1BVQkxJQ19GTk9YX0FHRV9LRVknIHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgY2lQcmluY2lwYWw6IEZub3hBZ2VQcmluY2lwYWwgfCB1bmRlZmluZWQgPSBGTk9YX0FHRV9QUklOQ0lQQUxTLmZpbmQoXG4gICAgKHByaW5jaXBhbDogRm5veEFnZVByaW5jaXBhbCkgPT5cbiAgICAgIHByaW5jaXBhbC5jaUFnZUtleVNlY3JldE5hbWUgJiYgbWF0Y2hlc0Zub3hSZXBvc2l0b3J5U2NvcGUocHJpbmNpcGFsLnJlcG9zaXRvcnlTY29wZSwgY29uZmlnKVxuICApO1xuICByZXR1cm4gY2lQcmluY2lwYWw/LmNpQWdlS2V5U2VjcmV0TmFtZTtcbn1cblxuLyoqIFdoZXRoZXIgdGhlIHJlY2lwaWVudCBzZXQgZGlmZmVycyBiZXR3ZWVuIHRoZSBwdWJsaWMgYW5kIHByaXZhdGUgcmVhZGluZyBvZiB0aGUgcmVwb3NpdG9yeS4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkb2VzRm5veFJlY2lwaWVudFNldERlcGVuZE9uVmlzaWJpbGl0eShcbiAgcm9vdENvbmZpZzogUGljazxQYWNrYWdlQ29uZmlnLCAncmVwb0F1dGhvcicgfCAncmVwb05hbWUnPlxuKTogYm9vbGVhbiB7XG4gIGNvbnN0IHB1YmxpY0tleXNGb3IgPSAoaXNQdWJsaWNSZXBvOiBib29sZWFuKTogc3RyaW5nID0+XG4gICAgZ2V0Rm5veEFnZVJlY2lwaWVudHMoeyAuLi5yb290Q29uZmlnLCBpc1B1YmxpY1JlcG8sIGlzUmVwb1Zpc2liaWxpdHlLbm93bjogdHJ1ZSB9KVxuICAgICAgLm1hcCgoeyBwdWJsaWNLZXkgfSkgPT4gcHVibGljS2V5KVxuICAgICAgLmpvaW4oJ1xcbicpO1xuICByZXR1cm4gcHVibGljS2V5c0Zvcih0cnVlKSAhPT0gcHVibGljS2V5c0ZvcihmYWxzZSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRGbm94QWdlUmVjaXBpZW50cyhyb290Q29uZmlnOiBGbm94UmVwb3NpdG9yeUlkZW50aXR5KTogRm5veEFnZVJlY2lwaWVudFtdIHtcbiAgcmV0dXJuIEZOT1hfQUdFX1BSSU5DSVBBTFMuZmlsdGVyKChwcmluY2lwYWwpID0+XG4gICAgbWF0Y2hlc0Zub3hSZXBvc2l0b3J5U2NvcGUocHJpbmNpcGFsLnJlcG9zaXRvcnlTY29wZSwgcm9vdENvbmZpZylcbiAgKS5mbGF0TWFwKChwcmluY2lwYWwpID0+XG4gICAgcHJpbmNpcGFsLnB1YmxpY0tleXMubWFwKChwdWJsaWNLZXksIGluZGV4KSA9PiAoe1xuICAgICAgbmFtZTogcHJpbmNpcGFsLnB1YmxpY0tleXMubGVuZ3RoID09PSAxID8gcHJpbmNpcGFsLm5hbWUgOiBgJHtwcmluY2lwYWwubmFtZX0ke2luZGV4ICsgMX1gLFxuICAgICAgcHVibGljS2V5LFxuICAgIH0pKVxuICApO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gbWF0Y2hlc0Zub3hSZXBvc2l0b3J5U2NvcGUoc2NvcGU6IEZub3hSZXBvc2l0b3J5U2NvcGUsIHJlcG9zaXRvcnk6IEZub3hSZXBvc2l0b3J5SWRlbnRpdHkpOiBib29sZWFuIHtcbiAgY29uc3Qgb3duZXIgPSByZXBvc2l0b3J5LnJlcG9BdXRob3I/LnRvTG93ZXJDYXNlKCk7XG4gIGNvbnN0IG5hbWUgPSByZXBvc2l0b3J5LnJlcG9OYW1lPy50b0xvd2VyQ2FzZSgpO1xuICBpZiAoIW93bmVyIHx8ICFuYW1lKSByZXR1cm4gZmFsc2U7XG5cbiAgLy8gQW4gdW5rbm93biB2aXNpYmlsaXR5IChmYWlsZWQgR2l0SHViIGxvb2t1cCkgbWF0Y2hlcyBubyB2aXNpYmlsaXR5LWNvbnN0cmFpbmVkIHNjb3BlOiBjYWxsZXJzXG4gIC8vIHRoYXQgd291bGQgcmV3cml0ZSByZWNpcGllbnRzIGZhaWwgaW5zdGVhZCBvZiBlbmNyeXB0aW5nIHRvIHRoZSB3cm9uZyBDSSBpZGVudGl0eS5cbiAgaWYgKFxuICAgIHNjb3BlLnZpc2liaWxpdHkgJiZcbiAgICAoIXJlcG9zaXRvcnkuaXNSZXBvVmlzaWJpbGl0eUtub3duIHx8IChzY29wZS52aXNpYmlsaXR5ID09PSAncHVibGljJykgIT09IHJlcG9zaXRvcnkuaXNQdWJsaWNSZXBvKVxuICApIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICByZXR1cm4gKFxuICAgIChzY29wZS5vcmdhbml6YXRpb25zPy5zb21lKChvcmdhbml6YXRpb24pID0+IG9yZ2FuaXphdGlvbi50b0xvd2VyQ2FzZSgpID09PSBvd25lcikgPz8gZmFsc2UpIHx8XG4gICAgKHNjb3BlLnJlcG9zaXRvcmllcz8uc29tZSgoZnVsbE5hbWUpID0+IGZ1bGxOYW1lLnRvTG93ZXJDYXNlKCkgPT09IGAke293bmVyfS8ke25hbWV9YCkgPz8gZmFsc2UpXG4gICk7XG59XG5cbmZ1bmN0aW9uIHJlcGxhY2VBZ2VSZWNpcGllbnRzKGNvbnRlbnQ6IHN0cmluZywgYWdlUmVjaXBpZW50czogcmVhZG9ubHkgRm5veEFnZVJlY2lwaWVudFtdKTogc3RyaW5nIHtcbiAgLy8gVHJhaWxpbmcgbmFtZSBjb21tZW50cyBsZXQgaHVtYW5zIHRlbGwgd2hvc2Uga2V5IGVhY2ggcmVjaXBpZW50IGlzIHdpdGhvdXQgY29uc3VsdGluZyB3YmZ5LlxuICBjb25zdCByZWNpcGllbnRzVGV4dCA9IGByZWNpcGllbnRzID0gW1xcbiR7YWdlUmVjaXBpZW50c1xuICAgIC5tYXAoKHJlY2lwaWVudCkgPT4gYCAgXCIke3JlY2lwaWVudC5wdWJsaWNLZXl9XCIsICMgJHtyZWNpcGllbnQubmFtZX1gKVxuICAgIC5qb2luKCdcXG4nKX1cXG5dYDtcbiAgLy8gd2JmeSB3cml0ZXMgYSBbcHJvdmlkZXJzLmFnZV0gdGFibGUgKHBvc3NpYmx5IHdpdGggYSB0cmFpbGluZyBjb21tZW50KS4gU2NhbiBsaW5lLXdpc2Ugc28gdGhhdFxuICAvLyBhIGBbYCBpbnNpZGUgYSBjb21tZW50IG9yIGEgc3RyaW5nIG5ldmVyIHRlcm1pbmF0ZXMgdGhlIHRhYmxlIGVhcmx5OyB0aGUgdGFibGUgZW5kcyBhdCB0aGVcbiAgLy8gbmV4dCBsaW5lLXN0YXJ0IHRhYmxlIGhlYWRlci4gVGhlIGFzc2lnbm1lbnQgbWF0Y2ggaXMgbGluZS1hbmNob3JlZCBzbyBhIGNvbW1lbnRlZC1vdXRcbiAgLy8gYCMgcmVjaXBpZW50cyA9IFsuLi5dYCBpcyBuZXZlciBtaXN0YWtlbiBmb3IgdGhlIHJlYWwgb25lLCB3aGlsZSBtdWx0aWxpbmUgYXJyYXlzIHN0aWxsIG1hdGNoXG4gIC8vIGJlY2F1c2UgdGhlIG5lZ2F0ZWQgY2xhc3MgW15cXF1dICh1bmxpa2UgYC5gKSBzcGFucyBuZXdsaW5lcy4gQW55IG90aGVyIHNwZWxsaW5nIGZhbGxzIHRocm91Z2hcbiAgLy8gdG8gdGhlIGNhbGxlcidzIHJlLXBhcnNlIHZhbGlkYXRpb24sIHdoaWNoIGZhaWxzIHRoZSBydW4gc2FmZWx5IHdpdGggaW5zdHJ1Y3Rpb25zIGluc3RlYWQgb2ZcbiAgLy8gY29ycnVwdGluZyB0aGUgZmlsZS5cbiAgY29uc3QgbGluZXMgPSBjb250ZW50LnNwbGl0KCdcXG4nKTtcbiAgY29uc3QgaGVhZGVySW5kZXggPSBsaW5lcy5maW5kSW5kZXgoKGxpbmUpID0+IC9eXFxzKlxcW3Byb3ZpZGVyc1xcLmFnZVxcXVxccyooPzojLiopPyQvdS50ZXN0KGxpbmUpKTtcbiAgaWYgKGhlYWRlckluZGV4ICE9PSAtMSkge1xuICAgIGxldCBlbmRJbmRleCA9IGxpbmVzLmxlbmd0aDtcbiAgICBmb3IgKGxldCBpbmRleCA9IGhlYWRlckluZGV4ICsgMTsgaW5kZXggPCBsaW5lcy5sZW5ndGg7IGluZGV4KyspIHtcbiAgICAgIGlmICgvXlxccypcXFsvdS50ZXN0KGxpbmVzW2luZGV4XSA/PyAnJykpIHtcbiAgICAgICAgZW5kSW5kZXggPSBpbmRleDtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuICAgIGNvbnN0IHNlY3Rpb24gPSBsaW5lcy5zbGljZShoZWFkZXJJbmRleCwgZW5kSW5kZXgpLmpvaW4oJ1xcbicpO1xuICAgIGNvbnN0IHJlcGxhY2VkU2VjdGlvbiA9IHNlY3Rpb24ucmVwbGFjZSgvXlxccypyZWNpcGllbnRzXFxzKj1cXHMqXFxbW15cXF1dKlxcXS9tdSwgcmVjaXBpZW50c1RleHQpO1xuICAgIGNvbnN0IG5ld1NlY3Rpb24gPVxuICAgICAgcmVwbGFjZWRTZWN0aW9uID09PSBzZWN0aW9uXG4gICAgICAgID8gW2xpbmVzW2hlYWRlckluZGV4XSwgcmVjaXBpZW50c1RleHQsIC4uLmxpbmVzLnNsaWNlKGhlYWRlckluZGV4ICsgMSwgZW5kSW5kZXgpXS5qb2luKCdcXG4nKVxuICAgICAgICA6IHJlcGxhY2VkU2VjdGlvbjtcbiAgICByZXR1cm4gWy4uLmxpbmVzLnNsaWNlKDAsIGhlYWRlckluZGV4KSwgbmV3U2VjdGlvbiwgLi4ubGluZXMuc2xpY2UoZW5kSW5kZXgpXS5qb2luKCdcXG4nKTtcbiAgfVxuICByZXR1cm4gYCR7Y29udGVudC50cmltRW5kKCl9XFxuXFxuW3Byb3ZpZGVycy5hZ2VdXFxudHlwZSA9IFwiYWdlXCJcXG4ke3JlY2lwaWVudHNUZXh0fVxcbmA7XG59XG5cbi8vIFJlLWVuY3J5cHRzIHRoZSBiYXNlIHNlY3JldHMgYW5kIGVhY2ggcHJvZmlsZSdzIG93biBzZWNyZXRzICgtLW5vLWRlZmF1bHRzIGtlZXBzIHRoZSBtZXJnZWRcbi8vIGJhc2Ugc2VjcmV0cyBmcm9tIGJlaW5nIGR1cGxpY2F0ZWQgaW50byBwcm9maWxlIHRhYmxlcykgZm9yIHRoZSBjdXJyZW50IHJlY2lwaWVudCBzZXQuIFRoZVxuLy8gc3Bhd25lZCBmbm94IHJ1bnMgd2l0aCBhbiBpc29sYXRlZCBIT01FL1hER19DT05GSUdfSE9NRSBiZWNhdXNlIGZub3ggbWVyZ2VzIHRoZSB1c2VyLWdsb2JhbFxuLy8gfi8uY29uZmlnL2Zub3gvY29uZmlnLnRvbWwgaW50byBldmVyeSBwcm9qZWN0IGNvbmZpZyDigJQgYSBwbGFpbiByZWVuY3J5cHQgd291bGQgcmV3cml0ZSB0aGVcbi8vIHVzZXIncyBnbG9iYWwgc2VjcmV0cyB0b28uIERlY3J5cHRpb24gdGhlcmVmb3JlIG5lZWRzIHRoZSBwZXJzb25hbCBpZGVudGl0eSBwYXNzZWQgZXhwbGljaXRseVxuLy8gdmlhIEZOT1hfQUdFX0tFWTsgRk5PWF9QUk9GSUxFIGlzIHN0cmlwcGVkIHNvIGl0IGNhbm5vdCByZWRpcmVjdCB0aGUgYmFzZSAobm8gLVApIHJ1bi5cbmZ1bmN0aW9uIHJlZW5jcnlwdEZub3hTZWNyZXRzKGRpclBhdGg6IHN0cmluZywgcm9vdERpclBhdGg6IHN0cmluZywgcHJvZmlsZU5hbWVzOiBzdHJpbmdbXSk6IGJvb2xlYW4ge1xuICAvLyBUaGUgaWRlbnRpdHkgaXMgb3B0aW9uYWw6IGEgcGxhaW50ZXh0LW9ubHkgY29uZmlnIGhhcyBub3RoaW5nIHRvIGRlY3J5cHQgYW5kIGZub3ggc3VjY2VlZHNcbiAgLy8gd2l0aG91dCBvbmUsIHdoaWxlIGV4aXN0aW5nIGNpcGhlcnRleHRzIG1ha2UgZm5veCBmYWlsIGxvdWRseSBvbiBpdHMgb3duLlxuICBjb25zdCBpZGVudGl0eSA9IHJlYWRQZXJzb25hbEFnZVNlY3JldEtleSgpID8/IHByb2Nlc3MuZW52LkZOT1hfQUdFX0tFWTtcbiAgY29uc3QgZm5veENvbW1hbmQgPSByZXNvbHZlRm5veENvbW1hbmQoZGlyUGF0aCk7XG4gIGNvbnN0IGlzb2xhdGVkSG9tZURpclBhdGggPSBmcy5ta2R0ZW1wU3luYyhwYXRoLmpvaW4ob3MudG1wZGlyKCksICd3YmZ5LWZub3gtaG9tZS0nKSk7XG4gIHRyeSB7XG4gICAgLy8gSGlkZSB0aGUgbG9jYWwgb3ZlcnJpZGVzIG9mIEVWRVJZIGRpcmVjdG9yeSBmbm94IG1lcmdlcyBoaWVyYXJjaGljYWxseSAoZnJvbSB0aGUgY29tbWFuZFxuICAgIC8vIGRpcmVjdG9yeSB1cCB0byB0aGUgcmVwb3NpdG9yeSByb290KTogYW4gYW5jZXN0b3IncyBmbm94LmxvY2FsLnRvbWwgd291bGQgb3RoZXJ3aXNlIHNoYWRvd1xuICAgIC8vIGNvbW1pdHRlZCBzZWNyZXRzIG9yIGl0c2VsZiBnZXQgcmV3cml0dGVuIGJ5IHRoZSByZS1lbmNyeXB0aW9uLlxuICAgIHJldHVybiB3aXRoRm5veExvY2Fsc0hpZGRlbihyb290RGlyUGF0aCwgbGlzdEFuY2VzdG9yRGlyUGF0aHMoZGlyUGF0aCwgcm9vdERpclBhdGgpLCAoKSA9PiB7XG4gICAgICBjb25zdCBlbnYgPSB7XG4gICAgICAgIC4uLk9iamVjdC5mcm9tRW50cmllcyhPYmplY3QuZW50cmllcyhwcm9jZXNzLmVudikuZmlsdGVyKChba2V5XSkgPT4gIWtleS5zdGFydHNXaXRoKCdGTk9YXycpKSksXG4gICAgICAgIC4uLihpZGVudGl0eSA/IHsgRk5PWF9BR0VfS0VZOiBpZGVudGl0eSB9IDoge30pLFxuICAgICAgICBIT01FOiBpc29sYXRlZEhvbWVEaXJQYXRoLFxuICAgICAgICBYREdfQ09ORklHX0hPTUU6IGlzb2xhdGVkSG9tZURpclBhdGgsXG4gICAgICB9O1xuICAgICAgY29uc3QgcHJvZmlsZUFyZ3NMaXN0ID0gW1tdLCAuLi5wcm9maWxlTmFtZXMubWFwKChuYW1lKSA9PiBbJy0tbm8tZGVmYXVsdHMnLCBgLS1wcm9maWxlPSR7bmFtZX1gXSldO1xuICAgICAgZm9yIChjb25zdCBwcm9maWxlQXJncyBvZiBwcm9maWxlQXJnc0xpc3QpIHtcbiAgICAgICAgY29uc3QgYXJncyA9IFsncmVlbmNyeXB0JywgJy0tZm9yY2UnLCAnLS1uby1kYWVtb24nLCAnLS1wcm92aWRlcicsICdhZ2UnLCAuLi5wcm9maWxlQXJnc107XG4gICAgICAgIGNvbnNvbGUubG9nKGAkICR7Zm5veENvbW1hbmR9ICR7YXJncy5qb2luKCcgJyl9IGF0ICR7ZGlyUGF0aH1gKTtcbiAgICAgICAgY29uc3QgcHJvYyA9IGNoaWxkX3Byb2Nlc3Muc3Bhd25TeW5jKGZub3hDb21tYW5kLCBhcmdzLCB7XG4gICAgICAgICAgY3dkOiBkaXJQYXRoLFxuICAgICAgICAgIGVuY29kaW5nOiAndXRmOCcsXG4gICAgICAgICAgc3RkaW86ICdpbmhlcml0JyxcbiAgICAgICAgICBlbnYsXG4gICAgICAgIH0pO1xuICAgICAgICBpZiAoKHByb2Muc3RhdHVzID8/IDEpICE9PSAwKSByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9KTtcbiAgfSBmaW5hbGx5IHtcbiAgICBmcy5ybVN5bmMoaXNvbGF0ZWRIb21lRGlyUGF0aCwgeyByZWN1cnNpdmU6IHRydWUsIGZvcmNlOiB0cnVlIH0pO1xuICB9XG59XG5cbi8qKlxuICogUmVzb2x2ZXMgdGhlIGFjdHVhbCBmbm94IGJpbmFyeS4gYGZub3hgIG9uIFBBVEggaXMgb2Z0ZW4gYSBtaXNlIHNoaW0sIGFuZCBtaXNlIHJlZnVzZXMgdG8gcnVuXG4gKiBvbmNlIEhPTUUvWERHX0NPTkZJR19IT01FIHBvaW50IGF0IHRoZSBpc29sYXRlZCBkaXJlY3RvcnkgKGl0cyB0cnVzdCBzdGF0ZSBkaXNhcHBlYXJzKSwgc28gdGhlXG4gKiBpc29sYXRlZCBzcGF3bnMgbmVlZCB0aGUgc2hpbSByZXNvbHZlZCB0byB0aGUgcmVhbCBleGVjdXRhYmxlIGJlZm9yZWhhbmQuXG4gKi9cbmZ1bmN0aW9uIHJlc29sdmVGbm94Q29tbWFuZChkaXJQYXRoOiBzdHJpbmcpOiBzdHJpbmcge1xuICBjb25zdCBwcm9jID0gY2hpbGRfcHJvY2Vzcy5zcGF3blN5bmMoJ21pc2UnLCBbJ3doaWNoJywgJ2Zub3gnXSwgeyBjd2Q6IGRpclBhdGgsIGVuY29kaW5nOiAndXRmOCcsIHN0ZGlvOiAncGlwZScgfSk7XG4gIGNvbnN0IHJlc29sdmVkID0gcHJvYy5zdGF0dXMgPT09IDAgPyBwcm9jLnN0ZG91dC50cmltKCkgOiAnJztcbiAgcmV0dXJuIHJlc29sdmVkIHx8ICdmbm94Jztcbn1cblxuLy8gVGhlIHBlcnNvbmFsIGlkZW50aXR5IGZpbGUgaXMgbWFjaGluZS1nbG9iYWwsIHNvIGl0IGlzIHJlYWQgb25jZSBwZXIgcHJvY2Vzcy5cbmxldCBoYXNSZWFkUGVyc29uYWxBZ2VTZWNyZXRLZXkgPSBmYWxzZTtcbmxldCBjYWNoZWRQZXJzb25hbEFnZVNlY3JldEtleTogc3RyaW5nIHwgdW5kZWZpbmVkO1xuXG5mdW5jdGlvbiByZWFkUGVyc29uYWxBZ2VTZWNyZXRLZXkoKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgaWYgKGhhc1JlYWRQZXJzb25hbEFnZVNlY3JldEtleSkgcmV0dXJuIGNhY2hlZFBlcnNvbmFsQWdlU2VjcmV0S2V5O1xuICBoYXNSZWFkUGVyc29uYWxBZ2VTZWNyZXRLZXkgPSB0cnVlO1xuICB0cnkge1xuICAgIGNvbnN0IGNvbnRlbnQgPSBmcy5yZWFkRmlsZVN5bmMocGF0aC5qb2luKG9zLmhvbWVkaXIoKSwgJy5jb25maWcnLCAnZm5veCcsICdhZ2UudHh0JyksICd1dGY4Jyk7XG4gICAgY2FjaGVkUGVyc29uYWxBZ2VTZWNyZXRLZXkgPSBjb250ZW50XG4gICAgICAuc3BsaXQoJ1xcbicpXG4gICAgICAuZmluZCgobGluZSkgPT4gbGluZS50cmltKCkuc3RhcnRzV2l0aCgnQUdFLVNFQ1JFVC1LRVktJykpXG4gICAgICA/LnRyaW0oKTtcbiAgfSBjYXRjaCB7XG4gICAgY2FjaGVkUGVyc29uYWxBZ2VTZWNyZXRLZXkgPSB1bmRlZmluZWQ7XG4gIH1cbiAgcmV0dXJuIGNhY2hlZFBlcnNvbmFsQWdlU2VjcmV0S2V5O1xufVxuXG4vKipcbiAqIFJ1bnMgYSBmdW5jdGlvbiB3aGlsZSB0aGUgbWFjaGluZS1sb2NhbCBmbm94LmxvY2FsLnRvbWwgZmlsZXMgb2YgdGhlIGdpdmVuIGRpcmVjdG9yaWVzIGFyZVxuICogdGVtcG9yYXJpbHkgbW92ZWQgYXNpZGU6IGZub3ggbG9hZHMgdGhlbSBhdCBoaWdoZXIgcHJpb3JpdHkgdGhhbiB0aGUgY29tbWl0dGVkIGZub3gudG9tbCwgc28gYVxuICogbG9jYWwgb3ZlcnJpZGUgc2hhZG93aW5nIGEgY29tbWl0dGVkIHNlY3JldCB3b3VsZCBtYWtlIGBmbm94IHJlZW5jcnlwdGAgc2tpcCB0aGF0IHNlY3JldC5cbiAqL1xuZnVuY3Rpb24gd2l0aEZub3hMb2NhbHNIaWRkZW48VD4ocm9vdERpclBhdGg6IHN0cmluZywgZGlyUGF0aHM6IHN0cmluZ1tdLCBmdW5jOiAoKSA9PiBUKTogVCB7XG4gIGNvbnN0IGhpZGRlbkRpclBhdGhzOiBzdHJpbmdbXSA9IFtdO1xuICB0cnkge1xuICAgIGZvciAoY29uc3QgZGlyUGF0aCBvZiBkaXJQYXRocykge1xuICAgICAgcmVjb3ZlclN0YWxlRm5veExvY2FsQmFja3VwKHJvb3REaXJQYXRoLCBkaXJQYXRoKTtcbiAgICAgIGNvbnN0IGxvY2FsUGF0aCA9IHBhdGgucmVzb2x2ZShkaXJQYXRoLCAnZm5veC5sb2NhbC50b21sJyk7XG4gICAgICBpZiAoZnMuZXhpc3RzU3luYyhsb2NhbFBhdGgpKSB7XG4gICAgICAgIGNvbnN0IGJhY2t1cFBhdGggPSBmbm94TG9jYWxCYWNrdXBQYXRoKHJvb3REaXJQYXRoLCBkaXJQYXRoKTtcbiAgICAgICAgZW5zdXJlU2FmZUZub3hMb2NhbEJhY2t1cERpcihyb290RGlyUGF0aCwgYmFja3VwUGF0aCk7XG4gICAgICAgIGZzLnJlbmFtZVN5bmMobG9jYWxQYXRoLCBiYWNrdXBQYXRoKTtcbiAgICAgICAgaGlkZGVuRGlyUGF0aHMucHVzaChkaXJQYXRoKTtcbiAgICAgIH1cbiAgICB9XG4gICAgY29uc3QgcmVzdWx0ID0gZnVuYygpO1xuICAgIC8vIEEgcmVzdG9yYXRpb24gY29uZmxpY3QgdGhyb3dzIGhlcmUgYW5kIHRoZXJlYnkgaW52YWxpZGF0ZXMgdGhlIHNlZW1pbmdseSBzdWNjZXNzZnVsIHJlc3VsdDpcbiAgICAvLyBhIHJlY3JlYXRlZCBvdmVycmlkZSBtYXkgaGF2ZSBzaGFkb3dlZCBjb21taXR0ZWQgc2VjcmV0cyBkdXJpbmcgdGhlIGZub3ggcnVuLCBzbyB0aGUgb3V0ZXJcbiAgICAvLyB0cmFuc2FjdGlvbiBtdXN0IHJlc3RvcmUgZXZlcnkgY29tbWl0dGVkIGZub3gudG9tbCBpbnN0ZWFkIG9mIGNvbW1pdHRpbmcgdGhlIG1pZ3JhdGlvbi5cbiAgICByZXN0b3JlSGlkZGVuRm5veExvY2Fscyhyb290RGlyUGF0aCwgaGlkZGVuRGlyUGF0aHMpO1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgLy8gVGhlIG9yaWdpbmFsIGZhaWx1cmUgbXVzdCB3aW47IGEgcmVzdG9yYXRpb24gY29uZmxpY3Qgb24gdGhpcyBwYXRoIGlzIG9ubHkgcmVwb3J0ZWQgc28gaXRcbiAgICAvLyBjYW5ub3QgbWFzayB0aGUgcm9vdCBjYXVzZS5cbiAgICB0cnkge1xuICAgICAgcmVzdG9yZUhpZGRlbkZub3hMb2NhbHMocm9vdERpclBhdGgsIGhpZGRlbkRpclBhdGhzKTtcbiAgICB9IGNhdGNoIChyZXN0b3JlRXJyb3IpIHtcbiAgICAgIGZhaWxGbm94U3luYygocmVzdG9yZUVycm9yIGFzIEVycm9yIHwgdW5kZWZpbmVkKT8ubWVzc2FnZSA/PyBTdHJpbmcocmVzdG9yZUVycm9yKSk7XG4gICAgfVxuICAgIHRocm93IGVycm9yO1xuICB9XG59XG5cbi8vIE1vdmVzIHRoZSBoaWRkZW4gZm5veC5sb2NhbC50b21sIGZpbGVzIGJhY2ssIGNsZWFyaW5nIHRoZSBnaXZlbiBsaXN0IHNvIGEgc2Vjb25kIGNhbGwgaXMgYVxuLy8gbm8tb3AuIE5ldmVyIGNsb2JiZXJzIGEgZm5veC5sb2NhbC50b21sIHJlY3JlYXRlZCAoZS5nLiBieSBhbiBlZGl0b3IpIHdoaWxlIGZub3ggd2FzIHJ1bm5pbmc6XG4vLyB0aGUgYmFja3VwIGlzIGtlcHQgYW5kIHJlcG9ydGVkIGZvciBhIG1hbnVhbCBtZXJnZS5cbmZ1bmN0aW9uIHJlc3RvcmVIaWRkZW5Gbm94TG9jYWxzKHJvb3REaXJQYXRoOiBzdHJpbmcsIGhpZGRlbkRpclBhdGhzOiBzdHJpbmdbXSk6IHZvaWQge1xuICBjb25zdCBjb25mbGljdGluZ0xvY2FsUGF0aHM6IHN0cmluZ1tdID0gW107XG4gIGZvciAoY29uc3QgZGlyUGF0aCBvZiBoaWRkZW5EaXJQYXRocy5zcGxpY2UoMCkpIHtcbiAgICBjb25zdCBsb2NhbFBhdGggPSBwYXRoLnJlc29sdmUoZGlyUGF0aCwgJ2Zub3gubG9jYWwudG9tbCcpO1xuICAgIGlmIChmcy5leGlzdHNTeW5jKGxvY2FsUGF0aCkpIHtcbiAgICAgIGNvbmZsaWN0aW5nTG9jYWxQYXRocy5wdXNoKGxvY2FsUGF0aCk7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgZnMucmVuYW1lU3luYyhmbm94TG9jYWxCYWNrdXBQYXRoKHJvb3REaXJQYXRoLCBkaXJQYXRoKSwgbG9jYWxQYXRoKTtcbiAgfVxuICBpZiAoY29uZmxpY3RpbmdMb2NhbFBhdGhzLmxlbmd0aCA+IDApIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICBgVGhlIGZvbGxvd2luZyBmbm94LmxvY2FsLnRvbWwgZmlsZXMgd2VyZSByZWNyZWF0ZWQgd2hpbGUgZm5veCB3YXMgcnVubmluZyAob3JpZ2luYWwgZmlsZXMgYXJlIHByZXNlcnZlZCB1bmRlciAke3BhdGgucmVzb2x2ZShyb290RGlyUGF0aCwgJy50bXAnLCAnd2JmeS1mbm94LWxvY2FsLWJhY2t1cCcpfSDigJQgbWVyZ2UgdGhlbSBtYW51YWxseSk6ICR7Y29uZmxpY3RpbmdMb2NhbFBhdGhzLmpvaW4oJywgJyl9YFxuICAgICk7XG4gIH1cbn1cblxuLyoqXG4gKiBSZXN0b3JlcyBhIGZub3gubG9jYWwudG9tbCBiYWNrdXAgbGVmdCBieSBhbiBpbnRlcnJ1cHRlZCBlYXJsaWVyIHJ1biBzbyB0aGUgdXNlcidzIGxvY2FsXG4gKiBvdmVycmlkZXMgYXJlIG5ldmVyIHNpbGVudGx5IGxvc3QuXG4gKi9cbmZ1bmN0aW9uIHJlY292ZXJTdGFsZUZub3hMb2NhbEJhY2t1cChyb290RGlyUGF0aDogc3RyaW5nLCBkaXJQYXRoOiBzdHJpbmcpOiB2b2lkIHtcbiAgY29uc3QgbG9jYWxQYXRoID0gcGF0aC5yZXNvbHZlKGRpclBhdGgsICdmbm94LmxvY2FsLnRvbWwnKTtcbiAgY29uc3QgYmFja3VwUGF0aCA9IGZub3hMb2NhbEJhY2t1cFBhdGgocm9vdERpclBhdGgsIGRpclBhdGgpO1xuICBpZiAoIWZzLmV4aXN0c1N5bmMoYmFja3VwUGF0aCkpIHJldHVybjtcbiAgaWYgKGZzLmV4aXN0c1N5bmMobG9jYWxQYXRoKSkge1xuICAgIHRocm93IG5ldyBFcnJvcihgQm90aCAke2xvY2FsUGF0aH0gYW5kIGl0cyBiYWNrdXAgJHtiYWNrdXBQYXRofSBleGlzdDsgcmVzb2x2ZSB0aGUgbGVmdG92ZXIgYmFja3VwIG1hbnVhbGx5LmApO1xuICB9XG4gIGVuc3VyZVNhZmVGbm94TG9jYWxCYWNrdXBEaXIocm9vdERpclBhdGgsIGJhY2t1cFBhdGgpO1xuICBmcy5yZW5hbWVTeW5jKGJhY2t1cFBhdGgsIGxvY2FsUGF0aCk7XG59XG5cbi8vIENyZWF0ZXMgdGhlIGJhY2t1cCBkaXJlY3RvcnkgYW5kIHByb3ZlcyBubyBwYXRoIGNvbXBvbmVudCBiZWxvdyB0aGUgcmVwb3NpdG9yeSByb290IGlzIGFcbi8vIHN5bWxpbms6IGEgcmVwb3NpdG9yeS1jb250cm9sbGVkIHN5bWxpbmsgKGUuZy4gYSB0cmFja2VkIC50bXAvd2JmeS1mbm94LWxvY2FsLWJhY2t1cCBsaW5rKVxuLy8gY291bGQgb3RoZXJ3aXNlIG1vdmUgdGhlIHBsYWludGV4dCBsb2NhbCBzZWNyZXRzIG91dHNpZGUgdGhlIHJlcG9zaXRvcnksIG9yIHJlc29sdmUgdGhlIGJhY2t1cFxuLy8gYmFjayBvbnRvIHRoZSBzb3VyY2UgZmlsZSBhbmQgdHVybiB0aGUgaGlkZSByZW5hbWUgaW50byBhIG5vLW9wLlxuZnVuY3Rpb24gZW5zdXJlU2FmZUZub3hMb2NhbEJhY2t1cERpcihyb290RGlyUGF0aDogc3RyaW5nLCBiYWNrdXBQYXRoOiBzdHJpbmcpOiB2b2lkIHtcbiAgY29uc3QgYmFja3VwRGlyUGF0aCA9IHBhdGguZGlybmFtZShiYWNrdXBQYXRoKTtcbiAgZnMubWtkaXJTeW5jKGJhY2t1cERpclBhdGgsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICBjb25zdCBleHBlY3RlZFJlYWxQYXRoID0gcGF0aC5qb2luKGZzLnJlYWxwYXRoU3luYyhyb290RGlyUGF0aCksIHBhdGgucmVsYXRpdmUocm9vdERpclBhdGgsIGJhY2t1cERpclBhdGgpKTtcbiAgaWYgKGZzLnJlYWxwYXRoU3luYyhiYWNrdXBEaXJQYXRoKSAhPT0gZXhwZWN0ZWRSZWFsUGF0aCkge1xuICAgIHRocm93IG5ldyBFcnJvcihgJHtiYWNrdXBEaXJQYXRofSByZXNvbHZlcyB0aHJvdWdoIGEgc3ltbGluazsgcmVtb3ZlIHRoZSBzeW1saW5rZWQgY29tcG9uZW50LmApO1xuICB9XG59XG5cbi8vIFRoZSBiYWNrdXAgbGl2ZXMgdW5kZXIgdGhlIGdpdGlnbm9yZWQgLnRtcCBzbyBhIGhpZGRlbiBmbm94LmxvY2FsLnRvbWwgY2FuIG5ldmVyIGJlY29tZVxuLy8gc3RhZ2VhYmxlIChhIHNpYmxpbmcgcmVuYW1lIGxpa2UgZm5veC5sb2NhbC50b21sLndiZnktYmFrIHdvdWxkIG5vIGxvbmdlciBtYXRjaCB0aGUgZG9jdW1lbnRlZFxuLy8gYGZub3gubG9jYWwudG9tbGAgaWdub3JlIGVudHJ5IGFuZCBjb3VsZCBiZSBjb21taXR0ZWQgYnkgYGdpdCBhZGQgLUFgKS5cbmZ1bmN0aW9uIGZub3hMb2NhbEJhY2t1cFBhdGgocm9vdERpclBhdGg6IHN0cmluZywgZGlyUGF0aDogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIHBhdGgucmVzb2x2ZShcbiAgICByb290RGlyUGF0aCxcbiAgICAnLnRtcCcsXG4gICAgJ3diZnktZm5veC1sb2NhbC1iYWNrdXAnLFxuICAgIHBhdGgucmVsYXRpdmUocm9vdERpclBhdGgsIGRpclBhdGgpLFxuICAgICdmbm94LmxvY2FsLnRvbWwnXG4gICk7XG59XG5cbmZ1bmN0aW9uIHdyaXRlTWlncmF0aW9uTWFya2VyKCk6IHZvaWQge1xuICBpZiAoIW1pZ3JhdGlvbk1hcmtlclBhdGggfHwgbWlncmF0aW9uTWFya2VyT3duZWQpIHJldHVybjtcbiAgY29uc3QgdG1wRGlyUGF0aCA9IHBhdGguZGlybmFtZShtaWdyYXRpb25NYXJrZXJQYXRoKTtcbiAgZnMubWtkaXJTeW5jKHRtcERpclBhdGgsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICAvLyBSZWZ1c2UgdG8gd3JpdGUgdGhyb3VnaCBzeW1saW5rczogYSByZXBvc2l0b3J5LWNvbnRyb2xsZWQgLnRtcCBzeW1saW5rIGNvdWxkIG90aGVyd2lzZVxuICAvLyByZWRpcmVjdCB0aGUgbWFya2VyIHdyaXRlIG91dHNpZGUgdGhlIHJlcG9zaXRvcnkuIFRoZSBgd3hgIGZsYWcgbWFrZXMgdGhlIG9wZW4gaXRzZWxmIGZhaWxcbiAgLy8gb24gYW55IHByZS1leGlzdGluZyBwYXRoLCBpbmNsdWRpbmcgYSBkYW5nbGluZyBzeW1saW5rIOKAlCB3aGljaCBhbHNvIGFjcXVpcmVzIHRoZSBtYXJrZXJcbiAgLy8gYXRvbWljYWxseSwgc28gYSBjb25jdXJyZW50IHdiZnkgcnVuIGNhbm5vdCBzdGFydCBhIHNlY29uZCBtaWdyYXRpb24uXG4gIGlmIChmcy5sc3RhdFN5bmModG1wRGlyUGF0aCkuaXNTeW1ib2xpY0xpbmsoKSkge1xuICAgIHRocm93IG5ldyBFcnJvcihgJHt0bXBEaXJQYXRofSBpcyBhIHN5bWxpbms7IHJlcGxhY2UgaXQgd2l0aCBhIHJlZ3VsYXIgZGlyZWN0b3J5LmApO1xuICB9XG4gIHRyeSB7XG4gICAgZnMud3JpdGVGaWxlU3luYyhcbiAgICAgIG1pZ3JhdGlvbk1hcmtlclBhdGgsXG4gICAgICAnd2JmeSBmbm94IG1pZ3JhdGlvbiBpbiBwcm9ncmVzczsgYSBsZWZ0b3ZlciBtYXJrZXIgYmxvY2tzIG5ldyBtaWdyYXRpb25zXFxuJyxcbiAgICAgIHtcbiAgICAgICAgZmxhZzogJ3d4JyxcbiAgICAgIH1cbiAgICApO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIHRocm93IG5ldyBFcnJvcihgQW5vdGhlciB3YmZ5IHByb2Nlc3MgYXBwZWFycyB0byBiZSBtaWdyYXRpbmcgKCR7bWlncmF0aW9uTWFya2VyUGF0aH0gZXhpc3RzKTogJHtlcnJvcn1gKTtcbiAgfVxuICBtaWdyYXRpb25NYXJrZXJPd25lZCA9IHRydWU7XG59XG5cbi8vIE9ubHkgdGhlIHJ1biB0aGF0IGFjcXVpcmVkIHRoZSBtYXJrZXIgbWF5IHJlbW92ZSBpdDogZGVsZXRpbmcgYSBmb3JlaWduIG1hcmtlciB3b3VsZCBkaXNhYmxlXG4vLyBpbnRlcnJ1cHRlZC1taWdyYXRpb24gZGV0ZWN0aW9uIGZvciBhIGNvbmN1cnJlbnRseSBydW5uaW5nIHdiZnkuXG5mdW5jdGlvbiByZW1vdmVPd25lZE1pZ3JhdGlvbk1hcmtlcigpOiB2b2lkIHtcbiAgaWYgKCFtaWdyYXRpb25NYXJrZXJPd25lZCB8fCAhbWlncmF0aW9uTWFya2VyUGF0aCkgcmV0dXJuO1xuICBmcy5ybVN5bmMobWlncmF0aW9uTWFya2VyUGF0aCwgeyBmb3JjZTogdHJ1ZSB9KTtcbiAgbWlncmF0aW9uTWFya2VyT3duZWQgPSBmYWxzZTtcbn1cblxuZnVuY3Rpb24gcmVzdG9yZVNuYXBzaG90cyhzbmFwc2hvdHM6IE1hcDxzdHJpbmcsIHN0cmluZz4pOiBib29sZWFuIHtcbiAgbGV0IHN1Y2NlZWRlZCA9IHRydWU7XG4gIGZvciAoY29uc3QgW2ZpbGVQYXRoLCBjb250ZW50XSBvZiBzbmFwc2hvdHMpIHtcbiAgICB0cnkge1xuICAgICAgZnMud3JpdGVGaWxlU3luYyhmaWxlUGF0aCwgY29udGVudCk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGZhaWxGbm94U3luYyhgRmFpbGVkIHRvIHJlc3RvcmUgJHtmaWxlUGF0aH0gYWZ0ZXIgYSBmYWlsZWQgbWlncmF0aW9uOiAke2Vycm9yfWApO1xuICAgICAgc3VjY2VlZGVkID0gZmFsc2U7XG4gICAgfVxuICB9XG4gIHJldHVybiBzdWNjZWVkZWQ7XG59XG5cbmZ1bmN0aW9uIGZhaWxGbm94U3luYyhtZXNzYWdlOiBzdHJpbmcpOiB2b2lkIHtcbiAgY29uc29sZS5lcnJvcihtZXNzYWdlKTtcbiAgcHJvY2Vzcy5leGl0Q29kZSA9IDE7XG4gIGZub3hTeW5jRmFpbGVkID0gdHJ1ZTtcbn1cblxuLy8gUmV0dXJucyBhIGRlc2NyaXB0aW9uIG9mIGFuIHVuc3VwcG9ydGVkIGZub3gubG9jYWwudG9tbCBpbiB0aGUgZGlyZWN0b3J5LCBvciB1bmRlZmluZWQuIExvY2FsXG4vLyBvdmVycmlkZXMgbWF5IG9ubHkgaG9sZCBtYWNoaW5lLWxvY2FsIHNlY3JldCB2YWx1ZXM7IGltcG9ydHMgb3IgcHJvdmlkZXIgKHJlKWRlZmluaXRpb25zIHdvdWxkXG4vLyBzaWxlbnRseSBjaGFuZ2Ugd2hpY2ggcmVjaXBpZW50IHNldCBnb3Zlcm5zIHJlLWVuY3J5cHRpb24uXG5mdW5jdGlvbiBmaW5kRm5veExvY2FsVG9tbElzc3VlKGRpclBhdGg6IHN0cmluZyk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IGxvY2FsVG9tbFBhdGggPSBwYXRoLnJlc29sdmUoZGlyUGF0aCwgJ2Zub3gubG9jYWwudG9tbCcpO1xuICBpZiAoIWZzLmV4aXN0c1N5bmMobG9jYWxUb21sUGF0aCkpIHJldHVybiB1bmRlZmluZWQ7XG4gIGNvbnN0IGxvY2FsU2V0dGluZ3MgPSBCdW4uVE9NTC5wYXJzZShmcy5yZWFkRmlsZVN5bmMobG9jYWxUb21sUGF0aCwgJ3V0ZjgnKSkgYXMgRm5veFRvbWw7XG4gIGNvbnN0IGRlZmluZXNQcm92aWRlcnMgPVxuICAgIGxvY2FsU2V0dGluZ3MuaW1wb3J0ICE9PSB1bmRlZmluZWQgfHxcbiAgICBsb2NhbFNldHRpbmdzLnByb3ZpZGVycyAhPT0gdW5kZWZpbmVkIHx8XG4gICAgT2JqZWN0LnZhbHVlcyhsb2NhbFNldHRpbmdzLnByb2ZpbGVzID8/IHt9KS5zb21lKChwcm9maWxlKSA9PiBwcm9maWxlPy5wcm92aWRlcnMgIT09IHVuZGVmaW5lZCk7XG4gIHJldHVybiBkZWZpbmVzUHJvdmlkZXJzID8gYCR7bG9jYWxUb21sUGF0aH0gZGVmaW5lcyBpbXBvcnRzLCBwcm92aWRlcnMsIG9yIHByb2ZpbGUgcHJvdmlkZXJzYCA6IHVuZGVmaW5lZDtcbn1cblxuLyoqXG4gKiBMaXN0cyBldmVyeSBkaXJlY3RvcnkgY29udGFpbmluZyBhIGNvbW1pdHRlZCAob3IgY29tbWl0dGFibGUpIGZub3gudG9tbCBhbW9uZyB0aGUgZ2l2ZW5cbiAqIGdpdC1kaXNjb3ZlcmVkIGNvbmZpZyBwYXRocyAoc2VlIGxpc3RGbm94TGlrZUZpbGVQYXRoczogZ2l0LWJhc2VkIGRpc2NvdmVyeSBleGNsdWRlcyBnaXRpZ25vcmVkXG4gKiB0cmVlcyBzdWNoIGFzIG5vZGVfbW9kdWxlcyB3aXRob3V0IGV4Y2x1ZGluZyBsZWdpdGltYXRlIHBhY2thZ2VzIG5hbWVkIGxpa2UgYnVpbGQgb3V0cHV0cykuXG4gKi9cbmZ1bmN0aW9uIGxpc3RGbm94VG9tbERpclBhdGhzKGZub3hMaWtlRmlsZVBhdGhzOiBzdHJpbmdbXSk6IHN0cmluZ1tdIHtcbiAgcmV0dXJuIFtcbiAgICAuLi5uZXcgU2V0KFxuICAgICAgZm5veExpa2VGaWxlUGF0aHNcbiAgICAgICAgLmZpbHRlcigoZmlsZVBhdGgpID0+IHBhdGguYmFzZW5hbWUoZmlsZVBhdGgpID09PSAnZm5veC50b21sJylcbiAgICAgICAgLm1hcCgoZmlsZVBhdGgpID0+IHBhdGguZGlybmFtZShmaWxlUGF0aCkpXG4gICAgKSxcbiAgXS50b1NvcnRlZCgpO1xufVxuXG4vKipcbiAqIFdoZXRoZXIgYSBmbm94IGNvbmZpZyBkZWNsYXJlcyBpdHMgb3duIGBbcHJvdmlkZXJzLmFnZV1gLCBpLmUuIHBhcnRpY2lwYXRlcyBpbiBhZ2UgZW5jcnlwdGlvbi5cbiAqIEEgY29uZmlnIHdpdGhvdXQgb25lIGVpdGhlciBpbmhlcml0cyBhIG1hbmFnZWQgcm9vdCdzIHByb3ZpZGVyIChoYW5kbGVkIGJ5IHRoZSByb290LWV4aXN0cyBwYXRoKVxuICogb3IsIHdoZW4gbm8gcm9vdCBleGlzdHMsIHVzZXMgbm8gYWdlIGVuY3J5cHRpb24gYXQgYWxsIOKAlCBzbyBpdCBuZWVkcyBubyByZWNpcGllbnQgc3luY2hyb25pemF0aW9uXG4gKiBhbmQgb3ducyBubyBGTk9YX0FHRV9LRVkuXG4gKi9cbmZ1bmN0aW9uIGRlY2xhcmVzRm5veEFnZVByb3ZpZGVyKGZpbGVQYXRoOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgbGV0IGNvbnRlbnQ6IHN0cmluZztcbiAgdHJ5IHtcbiAgICBjb250ZW50ID0gZnMucmVhZEZpbGVTeW5jKGZpbGVQYXRoLCAndXRmOCcpO1xuICB9IGNhdGNoIHtcbiAgICAvLyBGYWlsIGNsb3NlZDogYW4gdW5yZWFkYWJsZSBjb25maWcgbWlnaHQgZGVjbGFyZSBhbiBhZ2UgcHJvdmlkZXIuXG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgdHJ5IHtcbiAgICByZXR1cm4gQm9vbGVhbigoQnVuLlRPTUwucGFyc2UoY29udGVudCkgYXMgRm5veFRvbWwpLnByb3ZpZGVycz8uYWdlKTtcbiAgfSBjYXRjaCB7XG4gICAgLy8gRmFpbCBjbG9zZWQ6IGFuIHVucGFyc2FibGUgY29uZmlnIG1pZ2h0IGRlY2xhcmUgYW4gYWdlIHByb3ZpZGVyLlxuICAgIHJldHVybiB0cnVlO1xuICB9XG59XG5cbi8qKlxuICogV2hldGhlciBhIGZub3ggY29uZmlnIHBhdGggbGllcyBpbnNpZGUgYSB0ZXN0LWZpeHR1cmUgdHJlZSAodGVzdC9maXh0dXJlcywgdGVzdC1maXh0dXJlcyxcbiAqIF9fdGVzdHNfXyk6IGZpeHR1cmUgY29uZmlncyBhcmUgdGVzdCBJTlBVVFMsIG5vdCByZXBvc2l0b3J5IGNvbmZpZ3VyYXRpb24uIGZub3ggbmV2ZXIgbG9hZHNcbiAqIHRoZW0gZm9yIHJlYWwgY29tbWFuZHMgKGhpZXJhcmNoaWNhbCBsb2FkaW5nIG9ubHkgd2Fsa3MgY3dkIGFuY2VzdG9ycyksIHJlY2lwaWVudFxuICogc3luY2hyb25pemF0aW9uIG11c3Qgbm90IHJld3JpdGUgb3IgcmUtZW5jcnlwdCB0aGVtIChzaGFyZWQtbGliLW5vZGUncyB1bmRlY3J5cHRhYmxlIGZpeHR1cmVcbiAqIGV4aXN0cyBwcmVjaXNlbHkgdG8gc3RheSB1bmRlY3J5cHRhYmxlKSwgYW5kIGEgZml4dHVyZSBtdXN0IG5vdCBmYWlsIHRoZSBzdHJheS1uZXN0ZWQtY29uZmlnXG4gKiBjaGVjayBpbiByZXBvc2l0b3JpZXMgd2l0aG91dCBhIHJvb3QgZm5veC50b21sLlxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNUZXN0Rml4dHVyZUZub3hQYXRoKGZpbGVQYXRoOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgLy8gYGZpeHR1cmVzYCBjb3VudHMgb25seSBkaXJlY3RseSB1bmRlciBhIHRlc3QgZGlyZWN0b3J5OiB3YmZ5IHN1cHBvcnRzIGFyYml0cmFyeSB3b3Jrc3BhY2VzLFxuICAvLyBzbyBhIGxlZ2l0aW1hdGUgYHBhY2thZ2VzL2ZpeHR1cmVzL2Agd29ya3NwYWNlIG11c3Qgc3RheSBtYW5hZ2VkIGFuZCB2ZXJpZmllZC5cbiAgY29uc3Qgc2VnbWVudHMgPSBmaWxlUGF0aC5zcGxpdCgnLycpO1xuICByZXR1cm4gc2VnbWVudHMuc29tZShcbiAgICAoc2VnbWVudCwgaW5kZXgpID0+XG4gICAgICBzZWdtZW50ID09PSAndGVzdC1maXh0dXJlcycgfHxcbiAgICAgIHNlZ21lbnQgPT09ICdfX3Rlc3RzX18nIHx8XG4gICAgICAoc2VnbWVudCA9PT0gJ2ZpeHR1cmVzJyAmJiAoc2VnbWVudHNbaW5kZXggLSAxXSA9PT0gJ3Rlc3QnIHx8IHNlZ21lbnRzW2luZGV4IC0gMV0gPT09ICd0ZXN0cycpKVxuICApO1xufVxuXG5mdW5jdGlvbiBsaXN0Rm5veExpa2VGaWxlUGF0aHMocm9vdERpclBhdGg6IHN0cmluZyk6IHN0cmluZ1tdIHtcbiAgLy8gLXogcHJpbnRzIE5VTC1kZWxpbWl0ZWQgdmVyYmF0aW0gcGF0aHM7IHdpdGhvdXQgaXQsIGNvcmUucXVvdGVQYXRoIEMtcXVvdGVzIG5vbi1BU0NJSSBwYXRoc1xuICAvLyAoZS5nLiBcIlxcMzQ2XFwyMjdcXDI0NS4uLlwiKSwgd2hpY2ggd291bGQgbWFrZSB0aGUgYmFzZW5hbWUgZmlsdGVyIHNpbGVudGx5IHNraXAgdGhvc2UgY29uZmlncy5cbiAgY29uc3QgcHJvYyA9IGNoaWxkX3Byb2Nlc3Muc3Bhd25TeW5jKFxuICAgICdnaXQnLFxuICAgIFsnbHMtZmlsZXMnLCAnLXonLCAnLS1jYWNoZWQnLCAnLS1vdGhlcnMnLCAnLS1leGNsdWRlLXN0YW5kYXJkJywgJy0tJywgJypmbm94Ki50b21sJ10sXG4gICAgeyBjd2Q6IHJvb3REaXJQYXRoLCBlbmNvZGluZzogJ3V0ZjgnLCBzdGRpbzogJ3BpcGUnIH1cbiAgKTtcbiAgLy8gRmFpbCBjbG9zZWQ6IHRyZWF0aW5nIGEgZ2l0IGZhaWx1cmUgYXMgXCJubyBmbm94IGNvbmZpZ3NcIiB3b3VsZCBza2lwIHN5bmNocm9uaXphdGlvbiBhbmQgbGV0XG4gIC8vIHNldHVwU2VjcmV0cyB1cGxvYWQgYSBrZXkgdGhhdCB3YXMgbmV2ZXIgdmVyaWZpZWQgYWdhaW5zdCB0aGUgcmVwb3NpdG9yeSdzIGNpcGhlcnRleHRzLlxuICBpZiAocHJvYy5zdGF0dXMgIT09IDApIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYGdpdCBscy1maWxlcyBmYWlsZWQgaW4gJHtyb290RGlyUGF0aH06ICR7KHByb2Muc3RkZXJyIHx8IHByb2MuZXJyb3I/Lm1lc3NhZ2UgfHwgJycpLnRyaW0oKX1gKTtcbiAgfVxuICByZXR1cm4gcHJvYy5zdGRvdXRcbiAgICAuc3BsaXQoJ1xcMCcpXG4gICAgLmZpbHRlcigobGluZSkgPT4gL15cXC4/Zm5veChcXC4uKyk/XFwudG9tbCQvdS50ZXN0KHBhdGguYmFzZW5hbWUobGluZSkpICYmICFpc1Rlc3RGaXh0dXJlRm5veFBhdGgobGluZSkpXG4gICAgLm1hcCgobGluZSkgPT4gcGF0aC5yZXNvbHZlKHJvb3REaXJQYXRoLCBsaW5lKSk7XG59XG5cbmZ1bmN0aW9uIGxpc3RGbm94TGlrZUZpbGVOYW1lcyhkaXJQYXRoOiBzdHJpbmcpOiBzdHJpbmdbXSB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIGZzXG4gICAgICAucmVhZGRpclN5bmMoZGlyUGF0aClcbiAgICAgIC5maWx0ZXIoKG5hbWUpID0+IC9eXFwuP2Zub3goXFwuLispP1xcLnRvbWwkL3UudGVzdChuYW1lKSlcbiAgICAgIC50b1NvcnRlZCgpO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGlmICgoZXJyb3IgYXMgeyBjb2RlPzogc3RyaW5nIH0gfCB1bmRlZmluZWQpPy5jb2RlID09PSAnRU5PRU5UJykgcmV0dXJuIFtdO1xuICAgIC8vIEZhaWwgY2xvc2VkOiBmbm94IGNhbiBzdGlsbCBsb2FkIGEgY29uZmlnIGZyb20gYSBkaXJlY3RvcnkgdGhpcyBwcm9jZXNzIGNhbm5vdCBlbnVtZXJhdGVcbiAgICAvLyAoZS5nLiBleGVjdXRlLW9ubHkgcGVybWlzc2lvbiksIHNvIGFuIGVudW1lcmF0aW9uIGZhaWx1cmUgbXVzdCBub3QgcmVhZCBhcyBcIm5vIGNvbmZpZ3NcIi5cbiAgICB0aHJvdyBuZXcgRXJyb3IoYENhbm5vdCBpbnNwZWN0ICR7ZGlyUGF0aH0gZm9yIGZub3ggY29uZmlnczogJHtlcnJvcn1gKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBsaXN0QW5jZXN0b3JEaXJQYXRocyhkaXJQYXRoOiBzdHJpbmcsIHJvb3REaXJQYXRoOiBzdHJpbmcpOiBzdHJpbmdbXSB7XG4gIGNvbnN0IGRpclBhdGhzID0gW2RpclBhdGhdO1xuICB3aGlsZSAoZGlyUGF0aHMuYXQoLTEpICE9PSByb290RGlyUGF0aCkge1xuICAgIGNvbnN0IHBhcmVudCA9IHBhdGguZGlybmFtZShkaXJQYXRocy5hdCgtMSkgPz8gJycpO1xuICAgIGlmIChwYXJlbnQgPT09IGRpclBhdGhzLmF0KC0xKSkgYnJlYWs7XG4gICAgZGlyUGF0aHMucHVzaChwYXJlbnQpO1xuICB9XG4gIHJldHVybiBkaXJQYXRocztcbn1cbiIsImltcG9ydCBtZXJnZSBmcm9tICdkZWVwbWVyZ2UnO1xuXG5leHBvcnQgZnVuY3Rpb24gb3ZlcndyaXRlTWVyZ2U8VD4oZGVzdGluYXRpb25BcnJheTogVFtdLCBzb3VyY2VBcnJheTogVFtdKTogVFtdIHtcbiAgcmV0dXJuIHNvdXJjZUFycmF5O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY29tYmluZU1lcmdlKHRhcmdldDogdW5rbm93bltdLCBzb3VyY2U6IHVua25vd25bXSwgb3B0aW9uczogbWVyZ2UuQXJyYXlNZXJnZU9wdGlvbnMpOiB1bmtub3duW10ge1xuICBjb25zdCBkZXN0aW5hdGlvbiA9IFsuLi50YXJnZXRdO1xuXG4gIGZvciAoY29uc3QgW2luZGV4LCBpdGVtXSBvZiBzb3VyY2UuZW50cmllcygpKSB7XG4gICAgaWYgKGRlc3RpbmF0aW9uW2luZGV4XSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBkZXN0aW5hdGlvbltpbmRleF0gPSBjbG9uZVVubGVzc090aGVyd2lzZVNwZWNpZmllZChpdGVtLCBvcHRpb25zKTtcbiAgICB9IGVsc2UgaWYgKGlzTWVyZ2VhYmxlT2JqZWN0KHRhcmdldFtpbmRleF0sIG9wdGlvbnMpICYmIGlzTWVyZ2VhYmxlT2JqZWN0KGl0ZW0sIG9wdGlvbnMpKSB7XG4gICAgICBkZXN0aW5hdGlvbltpbmRleF0gPSBtZXJnZSh0YXJnZXRbaW5kZXhdLCBpdGVtLCBvcHRpb25zKTtcbiAgICB9IGVsc2UgaWYgKCF0YXJnZXQuaW5jbHVkZXMoaXRlbSkpIHtcbiAgICAgIGRlc3RpbmF0aW9uLnB1c2goaXRlbSk7XG4gICAgfVxuICB9XG4gIHJldHVybiBkZXN0aW5hdGlvbjtcbn1cblxuZnVuY3Rpb24gY2xvbmVVbmxlc3NPdGhlcndpc2VTcGVjaWZpZWQodmFsdWU6IHVua25vd24sIG9wdGlvbnM6IG1lcmdlLkFycmF5TWVyZ2VPcHRpb25zKTogdW5rbm93biB7XG4gIHJldHVybiBpc01lcmdlYWJsZU9iamVjdCh2YWx1ZSwgb3B0aW9ucykgPyBvcHRpb25zLmNsb25lVW5sZXNzT3RoZXJ3aXNlU3BlY2lmaWVkKHZhbHVlLCBvcHRpb25zKSA6IHZhbHVlO1xufVxuXG5mdW5jdGlvbiBpc01lcmdlYWJsZU9iamVjdCh2YWx1ZTogdW5rbm93biwgb3B0aW9uczogbWVyZ2UuQXJyYXlNZXJnZU9wdGlvbnMpOiB2YWx1ZSBpcyBvYmplY3Qge1xuICByZXR1cm4gISF2YWx1ZSAmJiB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnICYmIG9wdGlvbnMuaXNNZXJnZWFibGVPYmplY3QodmFsdWUpO1xufVxuIiwiZXhwb3J0IGZ1bmN0aW9uIG1vdmVUb0JvdHRvbTxUT2JqIGV4dGVuZHMgUmVjb3JkPFRLZXksIHVua25vd24+LCBUS2V5IGV4dGVuZHMgc3RyaW5nIHwgbnVtYmVyIHwgc3ltYm9sPihcbiAgb2JqOiBUT2JqLFxuICBrZXk6IFRLZXlcbik6IFRPYmoge1xuICBjb25zdCB2YWx1ZSA9IG9ialtrZXldO1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWR5bmFtaWMtZGVsZXRlXG4gIGRlbGV0ZSBvYmpba2V5XTtcbiAgKG9iaiBhcyBSZWNvcmQ8VEtleSwgdW5rbm93bj4pW2tleV0gPSB2YWx1ZTtcbiAgcmV0dXJuIG9iajtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHNvcnRLZXlzPFQgZXh0ZW5kcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj4ob2JqOiBUKTogVCB7XG4gIGNvbnN0IGtleUFuZFZhbHVlcyA9IE9iamVjdC5lbnRyaWVzKG9iaikudG9Tb3J0ZWQoKFtrZXkxXSwgW2tleTJdKSA9PiBrZXkxLmxvY2FsZUNvbXBhcmUoa2V5MikpO1xuICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBrZXlBbmRWYWx1ZXMpIHtcbiAgICAvLyBwYWNrYWdlLmpzb24tc3R5bGUga2V5cyBhcmUgbm9uLWFycmF5LWluZGV4IGtleXMsIHNvIEpTT04uc3RyaW5naWZ5IHByZXNlcnZlcyB0aGlzIGluc2VydGlvbiBvcmRlci5cbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWR5bmFtaWMtZGVsZXRlXG4gICAgZGVsZXRlIG9ialtrZXldO1xuICAgIChvYmogYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pW2tleV0gPSB2YWx1ZTtcblxuICAgIGlmICh2YWx1ZSAmJiB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnICYmICFBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgICAgc29ydEtleXModmFsdWUgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pO1xuICAgIH1cbiAgfVxuICByZXR1cm4gb2JqO1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHtcbiAgZ2V0TWVhbmluZ2Z1bERlY2xhcmVkV29ya3NwYWNlUGF0dGVybnMsXG4gIGdldFNlZWRlZEJhc2VsaW5lR2xvYixcbiAgaGFzSW1wbGljaXRXb3Jrc3BhY2VCYXNlbGluZSxcbiAgaXNJblJlcG9zaXRvcnlXb3Jrc3BhY2VQYXR0ZXJuLFxuICBub3JtYWxpemVXb3Jrc3BhY2VQYXR0ZXJuQm9keSxcbiAgcmVzb2x2ZVdvcmtzcGFjZVBhY2thZ2VKc29uUGF0aHMsXG59IGZyb20gJ0B3aWxsYm9vc3Rlci9zaGFyZWQtbGliLW5vZGUvc3JjJztcbmltcG9ydCBmZyBmcm9tICdmYXN0LWdsb2InO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlSnNvbiB9IGZyb20gJ3R5cGUtZmVzdCc7XG5cbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuXG4vLyBUaGUgQnVuLWV4YWN0IHJlc29sdXRpb24gcHJpbWl0aXZlcyBsaXZlIGluIEB3aWxsYm9vc3Rlci9zaGFyZWQtbGliLW5vZGUgKHNyYy9idW5Xb3Jrc3BhY2VzLnRzKVxuLy8gc28gd2IncyByZWxlYXNlIGNvZGUgc2hhcmVzIHRoZW07IHJlLWV4cG9ydCB0aGUgb25lcyB3YmZ5IG1vZHVsZXMgYW5kIHRlc3RzIGNvbnN1bWUuXG5leHBvcnQge1xuICBnZXREZWNsYXJlZFdvcmtzcGFjZVBhdHRlcm5zLFxuICBnZXRNZWFuaW5nZnVsRGVjbGFyZWRXb3Jrc3BhY2VQYXR0ZXJucyxcbiAgaGFzSW1wbGljaXRXb3Jrc3BhY2VCYXNlbGluZSxcbn0gZnJvbSAnQHdpbGxib29zdGVyL3NoYXJlZC1saWItbm9kZS9zcmMnO1xuXG4vKiogVGhlIHN1YnNldCBvZiBQYWNrYWdlQ29uZmlnIHRoYXQgd29ya3NwYWNlIGRpc2NvdmVyeSBuZWVkcywgc28gaXQgY2FuIHJ1biBiZWZvcmUgY29uZmlncyBleGlzdC4gKi9cbmV4cG9ydCB0eXBlIFdvcmtzcGFjZVJvb3RMaWtlID0gUGljazxQYWNrYWdlQ29uZmlnLCAnZGlyUGF0aCcgfCAnZG9lc0NvbnRhaW5TdWJQYWNrYWdlSnNvbnMnIHwgJ3BhY2thZ2VKc29uJz47XG5cbi8qKlxuICogRXZlcnkgZGVjbGFyZWQgd29ya3NwYWNlIGRpcmVjdG9yeSAoYWJzb2x1dGUsIGRlZHVwbGljYXRlZCkgb2YgdGhlIG1vbm9yZXBvIHJvb3QsIGNvdmVyaW5nXG4gKiBub24tcGFja2FnZXMvKiBsYXlvdXRzIHN1Y2ggYXMgYXBwcy8qLiBVbmNhY2hlZCBiZWNhdXNlIGluZGV4LnRzIGNhbGxzIGl0IGJlZm9yZSB3YmZ5IG11dGF0ZXNcbiAqIHRoZSByb290IHBhY2thZ2UuanNvbiAoZ2V0V29ya3NwYWNlUGFja2FnZURpcnMgY2FjaGVzIHRoZSBwb3N0LW11dGF0aW9uIHN0YXRlKS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFdvcmtzcGFjZVN1YkRpclBhdGhzKHJvb3RMaWtlOiBXb3Jrc3BhY2VSb290TGlrZSk6IHN0cmluZ1tdIHtcbiAgcmV0dXJuIFtcbiAgICAuLi5uZXcgU2V0KFxuICAgICAgZ2V0V29ya3NwYWNlUGFja2FnZUpzb25QYXRocyhyb290TGlrZSkubWFwKChwYWNrYWdlSnNvblBhdGgpID0+XG4gICAgICAgIHBhdGgucmVzb2x2ZShyb290TGlrZS5kaXJQYXRoLCBwYXRoLnBvc2l4LmRpcm5hbWUocGFja2FnZUpzb25QYXRoKSlcbiAgICAgIClcbiAgICApLFxuICBdLnRvU29ydGVkKCk7XG59XG5cbi8qKlxuICogRXZlcnkgd29ya3NwYWNlIHBhY2thZ2UuanNvbiBwYXRoIChyZWxhdGl2ZSB0byB0aGUgbW9ub3JlcG8gcm9vdCwgc29ydGVkKSwgaW5jbHVkaW5nIG1hbmlmZXN0c1xuICogd2l0aG91dCBhIGBuYW1lYCBmaWVsZCDigJQgd2JmeSBuYW1lcyB0aG9zZSBsYXRlciwgc28gZGVwZW5kZW5jeSBzY2FucyBtdXN0IG5vdCBza2lwIHRoZW0uXG4gKiBSZXNvbHV0aW9uIG1pbWljcyBCdW4ncyBzZXF1ZW50aWFsIHBhdHRlcm4gZXZhbHVhdGlvbjsgc2VlIHJlc29sdmVXb3Jrc3BhY2VQYWNrYWdlSnNvblBhdGhzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0V29ya3NwYWNlUGFja2FnZUpzb25QYXRocyhyb290Q29uZmlnOiBXb3Jrc3BhY2VSb290TGlrZSk6IHN0cmluZ1tdIHtcbiAgcmV0dXJuIHJlc29sdmVXb3Jrc3BhY2VQYWNrYWdlSnNvblBhdGhzKGdldFNhbml0aXplZFdvcmtzcGFjZVBhdHRlcm5zKHJvb3RDb25maWcpLCByb290Q29uZmlnLmRpclBhdGgpO1xufVxuXG5pbnRlcmZhY2UgV29ya3NwYWNlRGlyUGF0dGVybnMge1xuICAvKiogRGlyZWN0b3J5IHN1YnRyZWVzIChvciBwYWNrYWdlLW93bmVkIHN1YnBhdGhzKSBtYXRjaGVkIGJ5IGVmZmVjdGl2ZSBuZWdhdGlvbnMsIGZvciB0c2NvbmZpZyBgZXhjbHVkZWAgZW50cmllcy4gKi9cbiAgZXhjbHVkZXM6IHN0cmluZ1tdO1xuICAvKiogUG9zaXRpdmUgZGlyZWN0b3J5IHBhdHRlcm5zIChvciBjb25jcmV0ZSBkaXJlY3RvcmllcyBmb3IgQnVuLW9ubHkgZ2xvYiBzeW50YXgpLiAqL1xuICBpbmNsdWRlczogc3RyaW5nW107XG59XG5cbi8qKlxuICogU29ydGVkIHdvcmtzcGFjZSBkaXJlY3RvcnkgcGF0dGVybnMgKHBvc2l4LCByZWxhdGl2ZSB0byB0aGUgbW9ub3JlcG8gcm9vdCkgZm9yIGdlbmVyYXRvcnMgdGhhdFxuICogbmVlZCBwYXR0ZXJuLXNoYXBlZCBnbG9icyBjb3ZlcmluZyBldmVyeSB3b3Jrc3BhY2UgbGF5b3V0IOKAlCBlLmcuIHRoZSByb290IHRzY29uZmlnJ3MgYGFwcHMvKmBcbiAqIGluY2x1ZGUgZW50cmllcyDigJQgaW5zdGVhZCBvZiBjb25jcmV0ZSBkaXJlY3Rvcmllcywgd2hpY2ggd291bGQgY2h1cm4gZ2VuZXJhdGVkIGZpbGVzIHdoZW5ldmVyIGFcbiAqIHdvcmtzcGFjZSBwYWNrYWdlIGlzIGFkZGVkIG9yIHJlbW92ZWQuIEV2ZXJ5IHJldHVybmVkIHBhdHRlcm4gaXMgdmFsaWQgdHNjb25maWcgZ2xvYiBzeW50YXguXG4gKiBBIHBhdHRlcm4gY2FuIG1hdGNoIGEgc2libGluZyBkaXJlY3Rvcnkgd2l0aG91dCBhIHBhY2thZ2UuanNvbiAobm90IGEgd29ya3NwYWNlIHRvIEJ1bik7IHRoYXRcbiAqIGlzIGRlbGliZXJhdGUsIG1pcnJvcmluZyB0aGUgbG9uZy1zdGFuZGluZyBgcGFja2FnZXMvKmAgZW50cmllcycgYmVoYXZpb3IgaW4gZmF2b3Igb2Ygc3RhYmxlXG4gKiBnZW5lcmF0ZWQgb3V0cHV0LiBOZWdhdGlvbnMgZm9sbG93IEJ1bidzIHNlcXVlbnRpYWwgc2VtYW50aWNzIChzZWVcbiAqIHJlc29sdmVXb3Jrc3BhY2VQYWNrYWdlSnNvblBhdGhzKTogYSBuZWdhdGlvbiBzdGF5cyBwYXR0ZXJuLXNoYXBlZCB3aGlsZSBpdCBleGNsdWRlcyBleGFjdGx5XG4gKiB3aGF0IGl0IG1hdGNoZXMsIGJ1dCBpcyBjb25jcmV0aXplZCBwZXIgbWF0Y2hlZCBkaXJlY3Rvcnkgd2hlbiBhIG1hdGNoZWQgZGlyZWN0b3J5IGVuZHMgdXAgYVxuICogd29ya3NwYWNlIGFueXdheSAocmUtaW5jbHVkZWQgYnkgYSBsYXRlciBwb3NpdGl2ZSwgYSBwaW5uZWQgY29uY3JldGUgcG9zaXRpdmUsIG9yIGEgc2VlZGVkXG4gKiBiYXNlbGluZTsgIzEwMDUpIG9yIGlzIGFuIGFuY2VzdG9yIG9mIGEgd29ya3NwYWNlIGRpcmVjdG9yeSwgd2hlcmUgQnVuIGV4Y2x1ZGVzIG9ubHkgdGhlXG4gKiBwYWNrYWdlIEFUIHRoYXQgZGlyZWN0b3J5LCBzbyBvbmx5IGl0cyBwYWNrYWdlLW93bmVkIHN1YnBhdGhzIGFyZSBleGNsdWRlZCAoIzEwMDQpLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0V29ya3NwYWNlRGlyUGF0dGVybnMocm9vdExpa2U6IFdvcmtzcGFjZVJvb3RMaWtlKTogV29ya3NwYWNlRGlyUGF0dGVybnMge1xuICAvLyBVbmxpa2UgZGlzY292ZXJ5LCBnZW5lcmF0ZWQgb3V0cHV0IG11c3Qgbm90IGNvbnRhaW4gYSBuZXZlci1tYXRjaGluZyBgcGFja2FnZXMvKmAgZmFsbGJhY2s6XG4gIC8vIGFuIGFwcHMvKi1vbmx5IG1vbm9yZXBvIHdvdWxkIGdldCBkZWFkIGdsb2JzIGNvbW1pdHRlZCBpbnRvIGl0cyByb290IHRzY29uZmlnLiBNaXJyb3JcbiAgLy8gYXBwbHlQYWNrYWdlSnNvbkNvbnZlbnRpb25zLCB3aGljaCBmb3JjZXMgYHBhY2thZ2VzLypgIG9ubHkgd2hlbiBhIG1hbmlmZXN0IGFjdHVhbGx5IG1hdGNoZXMuXG4gIGNvbnN0IGhhc1BhY2thZ2VzTGF5b3V0ID1cbiAgICByb290TGlrZS5kb2VzQ29udGFpblN1YlBhY2thZ2VKc29ucyAmJlxuICAgIC8vIE1pcnJvciBhcHBseVBhY2thZ2VKc29uQ29udmVudGlvbnMnIGJhc2VsaW5lIGdhdGUgdG9vOiB3aXRoIGFuIGltcGxpY2l0IGJhc2VsaW5lIHNlZWRlZCxcbiAgICAvLyBgcGFja2FnZXMvKmAgZW50cmllcyB3b3VsZCBiZSBkZWFkIGdsb2JzIHN1YnN1bWVkIGJ5IHRoZSBiYXNlbGluZS1kZXJpdmVkIG9uZXMuXG4gICAgIWhhc0ltcGxpY2l0V29ya3NwYWNlQmFzZWxpbmUocm9vdExpa2UucGFja2FnZUpzb24/LndvcmtzcGFjZXMpICYmXG4gICAgZmcuZ2xvYlN5bmMoJ3BhY2thZ2VzLyovcGFja2FnZS5qc29uJywge1xuICAgICAgY3dkOiByb290TGlrZS5kaXJQYXRoLFxuICAgICAgZm9sbG93U3ltYm9saWNMaW5rczogZmFsc2UsXG4gICAgICBpZ25vcmU6IFsnKiovbm9kZV9tb2R1bGVzLyoqJ10sXG4gICAgfSkubGVuZ3RoID4gMDtcbiAgY29uc3Qgd29ya3NwYWNlUGF0dGVybnMgPSBnZXRTYW5pdGl6ZWRXb3Jrc3BhY2VQYXR0ZXJucyh7XG4gICAgLi4ucm9vdExpa2UsXG4gICAgZG9lc0NvbnRhaW5TdWJQYWNrYWdlSnNvbnM6IGhhc1BhY2thZ2VzTGF5b3V0LFxuICB9KTtcbiAgY29uc3Qgd29ya3NwYWNlRGlyUGF0aHMgPSBuZXcgU2V0KFxuICAgIHJlc29sdmVXb3Jrc3BhY2VQYWNrYWdlSnNvblBhdGhzKHdvcmtzcGFjZVBhdHRlcm5zLCByb290TGlrZS5kaXJQYXRoKS5tYXAoKHBhY2thZ2VKc29uUGF0aCkgPT5cbiAgICAgIHBhdGgucG9zaXguZGlybmFtZShwYWNrYWdlSnNvblBhdGgpXG4gICAgKVxuICApO1xuICBjb25zdCBpbmNsdWRlcyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICBjb25zdCBuZWdhdGlvbkJvZGllczogc3RyaW5nW10gPSBbXTtcbiAgZm9yIChjb25zdCB3b3Jrc3BhY2VQYXR0ZXJuIG9mIHdvcmtzcGFjZVBhdHRlcm5zKSB7XG4gICAgY29uc3QgaXNOZWdhdGl2ZSA9IHdvcmtzcGFjZVBhdHRlcm4uc3RhcnRzV2l0aCgnIScpO1xuICAgIGNvbnN0IHBhdHRlcm5Cb2R5ID0gbm9ybWFsaXplV29ya3NwYWNlUGF0dGVybkJvZHkoaXNOZWdhdGl2ZSA/IHdvcmtzcGFjZVBhdHRlcm4uc2xpY2UoMSkgOiB3b3Jrc3BhY2VQYXR0ZXJuKTtcbiAgICBpZiAoaXNOZWdhdGl2ZSkge1xuICAgICAgLy8gQSBzZWVkaW5nIG5lZ2F0aW9uIG1ha2VzIEJ1biBsaW5rIGJhc2VsaW5lLW1hdGNoZWQgZGlyZWN0b3JpZXMsIHNvIHRoZSBiYXNlbGluZSBtdXN0XG4gICAgICAvLyBlbnRlciB0aGUgZ2VuZXJhdGVkIGluY2x1ZGUgcGF0dGVybnMgZXZlbiB3aGVuIGV2ZXJ5IGRlY2xhcmVkIHBhdHRlcm4gaXMgYSBuZWdhdGlvbi5cbiAgICAgIGNvbnN0IGJhc2VsaW5lR2xvYiA9IGdldFNlZWRlZEJhc2VsaW5lR2xvYihwYXR0ZXJuQm9keSk7XG4gICAgICBpZiAoYmFzZWxpbmVHbG9iICE9PSB1bmRlZmluZWQpIGluY2x1ZGVzLmFkZChiYXNlbGluZUdsb2IpO1xuICAgICAgbmVnYXRpb25Cb2RpZXMucHVzaChwYXR0ZXJuQm9keSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGZvciAoY29uc3QgZGlyUGF0dGVybiBvZiB0b1RzY29uZmlnQ29tcGF0aWJsZURpclBhdHRlcm5zKHBhdHRlcm5Cb2R5LCByb290TGlrZS5kaXJQYXRoKSkge1xuICAgICAgICBpbmNsdWRlcy5hZGQoZGlyUGF0dGVybik7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIGNvbnN0IGV4Y2x1ZGVzID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gIGZvciAoY29uc3QgbmVnYXRpb25Cb2R5IG9mIG5lZ2F0aW9uQm9kaWVzKSB7XG4gICAgZm9yIChjb25zdCBleGNsdWRlRW50cnkgb2YgdG9FeGNsdWRlRW50cmllcyhuZWdhdGlvbkJvZHksIHdvcmtzcGFjZURpclBhdGhzLCByb290TGlrZS5kaXJQYXRoKSkge1xuICAgICAgZXhjbHVkZXMuYWRkKGV4Y2x1ZGVFbnRyeSk7XG4gICAgfVxuICB9XG4gIHJldHVybiB7IGV4Y2x1ZGVzOiBbLi4uZXhjbHVkZXNdLnRvU29ydGVkKCksIGluY2x1ZGVzOiBbLi4uaW5jbHVkZXNdLnRvU29ydGVkKCkgfTtcbn1cblxuLyoqXG4gKiB0c2NvbmZpZyBleGNsdWRlIGVudHJpZXMgZm9yIG9uZSBuZWdhdGlvbi4gUGF0dGVybi1zaGFwZWQgd2hlbiB0aGUgbmVnYXRpb24gZXhjbHVkZXMgZXhhY3RseVxuICogd2hhdCBpdCBtYXRjaGVzIChzdGFibGUgb3V0cHV0KTsgcGVyLWRpcmVjdG9yeSBvdGhlcndpc2U6IGEgZGlyZWN0b3J5IHRoYXQgaXMgYSB3b3Jrc3BhY2VcbiAqIGRlc3BpdGUgdGhlIG5lZ2F0aW9uIGlzIG5vdCBleGNsdWRlZCBhdCBhbGwsIGFuZCBuZWl0aGVyIGlzIGEgUExBSU4gKHBhY2thZ2UuanNvbi1sZXNzKVxuICogZGVzY2VuZGFudCBvZiBhIHdvcmtzcGFjZSBkaXJlY3Rvcnkg4oCUIG5lZ2F0aW5nIGEgbm9uLXBhY2thZ2UgZGlyZWN0b3J5IGlzIGEgbm8tb3AgZm9yIEJ1bixcbiAqIGFuZCB0aGUgZW5jbG9zaW5nIHdvcmtzcGFjZSBzdGF5cyBhY3RpdmUgKGUuZy4gYFsnYXBwcy8qKicsICchYXBwcy8qKicsICdhcHBzL3dlYiddYFxuICogcmUtaW5jbHVkZXMgYXBwcy93ZWIsIHdob3NlIHNyYyBtdXN0IGtlZXAgdHlwZS1jaGVja2luZzsgYSB0c2NvbmZpZyBleGNsdWRlIHdvdWxkIG92ZXJyaWRlXG4gKiB0aGUgaW5jbHVkZSkuIEEgZGVzY2VuZGFudCB3aXRoIGl0cyBvd24gbWFuaWZlc3QgdGhhdCB0aGUgbmVnYXRpb24ga2VlcHMgb3V0IG9mIHRoZSB3b3Jrc3BhY2VcbiAqIHNldCBpcyBhbiBleGNsdWRlZCBuZXN0ZWQgcGFja2FnZSBhbmQgc3RheXMgZXhjbHVkZWQuIEEgZGlyZWN0b3J5IHRoYXQgaXMgYW5cbiAqIGFuY2VzdG9yIG9mIGEgd29ya3NwYWNlIGRpcmVjdG9yeSBnZXRzIG9ubHkgaXRzIHBhY2thZ2Utb3duZWQgc3VicGF0aHMgZXhjbHVkZWQsIGJlY2F1c2UgQnVuXG4gKiBleGNsdWRlcyBvbmx5IHRoZSBwYWNrYWdlIEFUIHRoYXQgZGlyZWN0b3J5IHdoaWxlIGtlZXBpbmcgZGVzY2VuZGFudCB3b3Jrc3BhY2VzICgjMTAwNCkuXG4gKi9cbmZ1bmN0aW9uIHRvRXhjbHVkZUVudHJpZXMobmVnYXRpb25Cb2R5OiBzdHJpbmcsIHdvcmtzcGFjZURpclBhdGhzOiBTZXQ8c3RyaW5nPiwgcm9vdERpclBhdGg6IHN0cmluZyk6IHN0cmluZ1tdIHtcbiAgY29uc3QgaXNXb3Jrc3BhY2VBbmNlc3RvciA9IChkaXJQYXRoOiBzdHJpbmcpOiBib29sZWFuID0+XG4gICAgWy4uLndvcmtzcGFjZURpclBhdGhzXS5zb21lKCh3b3Jrc3BhY2VEaXJQYXRoKSA9PiB3b3Jrc3BhY2VEaXJQYXRoLnN0YXJ0c1dpdGgoYCR7ZGlyUGF0aH0vYCkpO1xuICAvLyBPbmx5IFBMQUlOIGRpcmVjdG9yaWVzIChubyBwYWNrYWdlLmpzb24gb2YgdGhlaXIgb3duKSBhcmUgcHJvdGVjdGVkIGJ5IHRoZSBlbmNsb3NpbmdcbiAgLy8gd29ya3NwYWNlOiBhIG1hdGNoZWQgZGlyZWN0b3J5IHRoYXQgY2FycmllcyBpdHMgb3duIG1hbmlmZXN0IHlldCBpcyBhYnNlbnQgZnJvbSB0aGUgZmluYWxcbiAgLy8gd29ya3NwYWNlIHNldCBpcyBhbiBleGNsdWRlZCBuZXN0ZWQgcGFja2FnZSwgYW5kIGl0cyBleGNsdXNpb24gbXVzdCBzdXJ2aXZlLlxuICBjb25zdCBpc1Byb3RlY3RlZFdvcmtzcGFjZURlc2NlbmRhbnQgPSAoZGlyUGF0aDogc3RyaW5nKTogYm9vbGVhbiA9PlxuICAgIFsuLi53b3Jrc3BhY2VEaXJQYXRoc10uc29tZSgod29ya3NwYWNlRGlyUGF0aCkgPT4gZGlyUGF0aC5zdGFydHNXaXRoKGAke3dvcmtzcGFjZURpclBhdGh9L2ApKSAmJlxuICAgICFmcy5leGlzdHNTeW5jKHBhdGguam9pbihyb290RGlyUGF0aCwgZGlyUGF0aCwgJ3BhY2thZ2UuanNvbicpKTtcbiAgY29uc3QgbWF0Y2hlZERpclBhdGhzID0gZ2V0TWF0Y2hlZERpclBhdGhzKG5lZ2F0aW9uQm9keSwgcm9vdERpclBhdGgpO1xuICBpZiAoXG4gICAgIW1hdGNoZWREaXJQYXRocy5zb21lKFxuICAgICAgKGRpclBhdGgpID0+XG4gICAgICAgIHdvcmtzcGFjZURpclBhdGhzLmhhcyhkaXJQYXRoKSB8fCBpc1dvcmtzcGFjZUFuY2VzdG9yKGRpclBhdGgpIHx8IGlzUHJvdGVjdGVkV29ya3NwYWNlRGVzY2VuZGFudChkaXJQYXRoKVxuICAgIClcbiAgKSB7XG4gICAgcmV0dXJuIHRvVHNjb25maWdDb21wYXRpYmxlRGlyUGF0dGVybnMobmVnYXRpb25Cb2R5LCByb290RGlyUGF0aCk7XG4gIH1cbiAgcmV0dXJuIG1hdGNoZWREaXJQYXRocy5mbGF0TWFwKChkaXJQYXRoKSA9PiB7XG4gICAgLy8gVGhlIGRlc2NlbmRhbnQgY2hlY2sgcHJlY2VkZXMgdGhlIGFuY2VzdG9yIG9uZTogYSBkaXJlY3RvcnkgaW5zaWRlIG9uZSB3b3Jrc3BhY2UgYnV0IGFib3ZlXG4gICAgLy8gYSBuZXN0ZWQgb25lIChlLmcuIGFwcHMvd2ViL3BsdWdpbnMgYmV0d2VlbiB3b3Jrc3BhY2VzIGFwcHMvd2ViIGFuZCBhcHBzL3dlYi9wbHVnaW5zL3gpXG4gICAgLy8gc3RpbGwgYmVsb25ncyB0byB0aGUgZW5jbG9zaW5nIGFjdGl2ZSB3b3Jrc3BhY2UsIHNvIG5vdGhpbmcgb2YgaXQgbWF5IGJlIGV4Y2x1ZGVkLlxuICAgIGlmICh3b3Jrc3BhY2VEaXJQYXRocy5oYXMoZGlyUGF0aCkgfHwgaXNQcm90ZWN0ZWRXb3Jrc3BhY2VEZXNjZW5kYW50KGRpclBhdGgpKSByZXR1cm4gW107XG4gICAgaWYgKGlzV29ya3NwYWNlQW5jZXN0b3IoZGlyUGF0aCkpIHtcbiAgICAgIHJldHVybiBbYCR7ZGlyUGF0aH0vKi5jb25maWcudHNgLCBgJHtkaXJQYXRofS9zY3JpcHRzYCwgYCR7ZGlyUGF0aH0vc3JjYCwgYCR7ZGlyUGF0aH0vdGVzdGBdO1xuICAgIH1cbiAgICByZXR1cm4gW2RpclBhdGhdO1xuICB9KTtcbn1cblxuLyoqXG4gKiBEaXJlY3RvcmllcyBhIG5lZ2F0aW9uIG1hdGNoZXMuIFRoZSBtYW5pZmVzdC1iYXNlZCBnbG9iIGNvbXBsZW1lbnRzIG9ubHlEaXJlY3RvcmllcyBiZWNhdXNlXG4gKiBmYXN0LWdsb2IncyBgZGlyLyoqYCBkb2VzIG5vdCByZXR1cm4gYGRpcmAgaXRzZWxmIGFzIGEgZGlyZWN0b3J5LCB3aGlsZSBib3RoIEJ1biBhbmQgdGhlXG4gKiBtYW5pZmVzdCBnbG9iIHRyZWF0IGAqKmAgYXMgemVybyBvciBtb3JlIHNlZ21lbnRzIChgYXBwcy8qKmAgY292ZXJzIHRoZSBwYWNrYWdlIGF0IGFwcHMpLlxuICovXG5mdW5jdGlvbiBnZXRNYXRjaGVkRGlyUGF0aHMobmVnYXRpb25Cb2R5OiBzdHJpbmcsIHJvb3REaXJQYXRoOiBzdHJpbmcpOiBzdHJpbmdbXSB7XG4gIGNvbnN0IGdsb2JPcHRpb25zID0geyBjd2Q6IHJvb3REaXJQYXRoLCBmb2xsb3dTeW1ib2xpY0xpbmtzOiBmYWxzZSwgaWdub3JlOiBbJyoqL25vZGVfbW9kdWxlcy8qKiddIH07XG4gIHJldHVybiBbXG4gICAgLi4ubmV3IFNldChbXG4gICAgICAuLi5mZy5nbG9iU3luYyhuZWdhdGlvbkJvZHksIHsgLi4uZ2xvYk9wdGlvbnMsIG9ubHlEaXJlY3RvcmllczogdHJ1ZSB9KSxcbiAgICAgIC4uLmZnXG4gICAgICAgIC5nbG9iU3luYyhwYXRoLnBvc2l4LmpvaW4obmVnYXRpb25Cb2R5LCAncGFja2FnZS5qc29uJyksIGdsb2JPcHRpb25zKVxuICAgICAgICAubWFwKChwYWNrYWdlSnNvblBhdGgpID0+IHBhdGgucG9zaXguZGlybmFtZShwYWNrYWdlSnNvblBhdGgpKVxuICAgICAgICAvLyBBIHplcm8tc2VnbWVudCBgKipgIG1hdGNoIHJlYWNoZXMgdGhlIHJvb3QgaXRzZWxmLCB3aGljaCBpcyBuZXZlciBhIHdvcmtzcGFjZS5cbiAgICAgICAgLmZpbHRlcigoZGlyUGF0aCkgPT4gZGlyUGF0aCAhPT0gJy4nKSxcbiAgICBdKSxcbiAgXS50b1NvcnRlZCgpO1xufVxuXG4vKipcbiAqIHRzY29uZmlnIGluY2x1ZGUvZXhjbHVkZSBzdXBwb3J0IG9ubHkgdGhlIGAqYCwgYD9gLCBhbmQgYCoqYCB3aWxkY2FyZHMsIHdoaWxlIEJ1biB3b3Jrc3BhY2VzXG4gKiBhY2NlcHQgZnVsbCBnbG9iIHN5bnRheCAoYnJhY2UgZXhwYW5zaW9uLCBjaGFyYWN0ZXIgY2xhc3Nlcywg4oCmKSwgc28gZXhwYW5kIEJ1bi1vbmx5IHBhdHRlcm5zIHRvXG4gKiB0aGUgY29uY3JldGUgZGlyZWN0b3JpZXMgdGhleSBtYXRjaCB0byBrZWVwIHRoZSBnZW5lcmF0ZWQgZ2xvYnMgdmFsaWQgZm9yIFR5cGVTY3JpcHQuXG4gKi9cbmZ1bmN0aW9uIHRvVHNjb25maWdDb21wYXRpYmxlRGlyUGF0dGVybnMocGF0dGVybkJvZHk6IHN0cmluZywgcm9vdERpclBhdGg6IHN0cmluZyk6IHN0cmluZ1tdIHtcbiAgaWYgKCEvWygpW1xcXXt9XS91LnRlc3QocGF0dGVybkJvZHkpKSByZXR1cm4gW3BhdHRlcm5Cb2R5XTtcbiAgcmV0dXJuIGZnLmdsb2JTeW5jKHBhdHRlcm5Cb2R5LCB7XG4gICAgY3dkOiByb290RGlyUGF0aCxcbiAgICBmb2xsb3dTeW1ib2xpY0xpbmtzOiBmYWxzZSxcbiAgICBpZ25vcmU6IFsnKiovbm9kZV9tb2R1bGVzLyoqJ10sXG4gICAgb25seURpcmVjdG9yaWVzOiB0cnVlLFxuICB9KTtcbn1cblxuLyoqXG4gKiBEZWNsYXJlZCB3b3Jrc3BhY2UgcGF0dGVybnMgKG5lZ2F0aXZlIG9uZXMgaW5jbHVkZWQpIHRoYXQgc3RheSBpbnNpZGUgdGhlIHJlcG9zaXRvcnk6IGFic29sdXRlXG4gKiBvciBgLi5gLXRyYXZlcnNpbmcgcGF0dGVybnMgd291bGQgbWFrZSBjb25zdW1lcnMgc3VjaCBhcyByZW1vdmVOb2RlTW9kdWxlcyBvcGVyYXRlIG9uIGFub3RoZXJcbiAqIHJlcG9zaXRvcnkncyBmaWxlcy4gRGVjbGFyYXRpb24gb3JkZXIgYW5kIGR1cGxpY2F0ZXMgYXJlIHByZXNlcnZlZCDigJQgQnVuIGV2YWx1YXRlcyB0aGVcbiAqIHBhdHRlcm5zIHNlcXVlbnRpYWxseSwgc28gcG9zaXRpb24gbWF0dGVycy5cbiAqL1xuZnVuY3Rpb24gZ2V0U2FuaXRpemVkV29ya3NwYWNlUGF0dGVybnMocm9vdExpa2U6IFdvcmtzcGFjZVJvb3RMaWtlKTogc3RyaW5nW10ge1xuICBjb25zdCBkZWNsYXJlZFBhdHRlcm5zID0gZ2V0TWVhbmluZ2Z1bERlY2xhcmVkV29ya3NwYWNlUGF0dGVybnMocm9vdExpa2UucGFja2FnZUpzb24/LndvcmtzcGFjZXMpO1xuICAvLyBhcHBseVBhY2thZ2VKc29uQ29udmVudGlvbnMgZm9yY2VzIGBwYWNrYWdlcy8qYCBpbnRvIGEgbW9ub3JlcG8ncyB3b3Jrc3BhY2VzIHdoZW4gYVxuICAvLyBwYWNrYWdlcy8qL3BhY2thZ2UuanNvbiBhY3R1YWxseSBtYXRjaGVzLCBidXQgaXQgbWF5IG5vdCBoYXZlIHdyaXR0ZW4gdGhlIHJvb3QgcGFja2FnZS5qc29uXG4gIC8vIHlldCwgc28gbWlycm9yIHRoYXQgbm9ybWFsaXphdGlvbiBoZXJlIOKAlCBQUkVQRU5ERUQgbGlrZSB0aGVyZSwgYmVjYXVzZSBhIHBvc2l0aXZlIHBhdHRlcm5cbiAgLy8gcGxhY2VkIGFmdGVyIGEgdXNlciBuZWdhdGlvbiB3b3VsZCByZS1pbmNsdWRlIHRoZSBuZWdhdGVkIHBhY2thZ2VzIHVuZGVyIEJ1bidzIHNlcXVlbnRpYWxcbiAgLy8gZXZhbHVhdGlvbi4gRGlzY292ZXJ5IGNhbGxlcnMgcGFzcyB0aGUgZmFsbGJhY2sgdW5jb25kaXRpb25hbGx5IGZvciBtb25vcmVwb3Mg4oCUIGFcbiAgLy8gbmV2ZXItbWF0Y2hpbmcgcGF0dGVybiBjb250cmlidXRlcyBubyBwYXRocyB0aGVyZSDigJQgd2hpbGUgcGF0dGVybi1zaGFwZWQgY2FsbGVyc1xuICAvLyAoZ2V0V29ya3NwYWNlRGlyUGF0dGVybnMpIGdhdGUgaXQgb24gYW4gYWN0dWFsIG1hdGNoLlxuICBjb25zdCB3b3Jrc3BhY2VQYXR0ZXJucyA9XG4gICAgcm9vdExpa2UuZG9lc0NvbnRhaW5TdWJQYWNrYWdlSnNvbnMgJiYgIWhhc0RlY2xhcmVkUGFja2FnZXNTdGFyUGF0dGVybihyb290TGlrZS5wYWNrYWdlSnNvbj8ud29ya3NwYWNlcylcbiAgICAgID8gWydwYWNrYWdlcy8qJywgLi4uZGVjbGFyZWRQYXR0ZXJuc11cbiAgICAgIDogZGVjbGFyZWRQYXR0ZXJucztcbiAgcmV0dXJuIHdvcmtzcGFjZVBhdHRlcm5zLmZpbHRlcigod29ya3NwYWNlUGF0dGVybikgPT4gaXNJblJlcG9zaXRvcnlXb3Jrc3BhY2VQYXR0ZXJuKHdvcmtzcGFjZVBhdHRlcm4pKTtcbn1cblxuLyoqXG4gKiBXaGV0aGVyIGEgZGVjbGFyZWQgcG9zaXRpdmUgcGF0dGVybiBhbHJlYWR5IGNvdmVycyBgcGFja2FnZXMvKmAgdW5kZXIgcGF0aCBub3JtYWxpemF0aW9uXG4gKiAoZS5nLiBgLi9wYWNrYWdlcy8qYCBvciBhIHRyYWlsaW5nLXNsYXNoIHNwZWxsaW5nKTogZm9yY2luZyBhIHRleHR1YWwgYHBhY2thZ2VzLypgIG5leHQgdG9cbiAqIHN1Y2ggYSBzcGVsbGluZyB3b3VsZCBwZXJzaXN0IGR1cGxpY2F0ZSBlcXVpdmFsZW50IHBhdHRlcm5zIGFuZCByZS1zY2FuIHRoZSBzYW1lIGRpcmVjdG9yaWVzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gaGFzRGVjbGFyZWRQYWNrYWdlc1N0YXJQYXR0ZXJuKHdvcmtzcGFjZXM6IFBhY2thZ2VKc29uWyd3b3Jrc3BhY2VzJ10pOiBib29sZWFuIHtcbiAgcmV0dXJuIGdldE1lYW5pbmdmdWxEZWNsYXJlZFdvcmtzcGFjZVBhdHRlcm5zKHdvcmtzcGFjZXMpLnNvbWUoXG4gICAgKHdvcmtzcGFjZVBhdHRlcm4pID0+XG4gICAgICAhd29ya3NwYWNlUGF0dGVybi5zdGFydHNXaXRoKCchJykgJiZcbiAgICAgIC8vIEEgYC4uYC10cmF2ZXJzaW5nIG9yIGFic29sdXRlIHNwZWxsaW5nIChlLmcuIGB4Ly4uL3BhY2thZ2VzLypgKSBpcyBkaXNjYXJkZWQgYnlcbiAgICAgIC8vIGdldFNhbml0aXplZFdvcmtzcGFjZVBhdHRlcm5zLCBzbyBpdCBtdXN0IG5vdCBjb3VudCBhcyBjb3ZlcmluZyBwYWNrYWdlcy8qIOKAlCB0aGF0IHdvdWxkXG4gICAgICAvLyBzdXBwcmVzcyB0aGUgZmFsbGJhY2sgQU5EIGxvc2UgdGhlIHBhdHRlcm4sIGxlYXZpbmcgbm8gZGlzY292ZXJlZCB3b3Jrc3BhY2VzLlxuICAgICAgaXNJblJlcG9zaXRvcnlXb3Jrc3BhY2VQYXR0ZXJuKHdvcmtzcGFjZVBhdHRlcm4pICYmXG4gICAgICBub3JtYWxpemVXb3Jrc3BhY2VQYXR0ZXJuQm9keSh3b3Jrc3BhY2VQYXR0ZXJuKSA9PT0gJ3BhY2thZ2VzLyonXG4gICk7XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VKc29uIH0gZnJvbSAndHlwZS1mZXN0JztcblxuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5cbmltcG9ydCB7IGdldFdvcmtzcGFjZVBhY2thZ2VKc29uUGF0aHMgfSBmcm9tICcuL3dvcmtzcGFjZVV0aWwuanMnO1xuXG5jb25zdCBQUklWQVRFX1NDT1BFID0gJ0B3aWxsYm9vc3Rlci1wcml2YXRlLyc7XG5cbmNvbnN0IHByaXZhdGVSZWdpc3RyeUhvc3QgPSAndmVyZGFjY2lvLXByb2R1Y3Rpb24tZTM4OS51cC5yYWlsd2F5LmFwcCc7XG5leHBvcnQgY29uc3QgcHJpdmF0ZVJlZ2lzdHJ5U2NvcGVNYXBwaW5nID0gYEB3aWxsYm9vc3Rlci1wcml2YXRlOnJlZ2lzdHJ5PWh0dHBzOi8vJHtwcml2YXRlUmVnaXN0cnlIb3N0fS9gO1xuXG4vKipcbiAqIFdoZXRoZXIgdGhpcyByZXBvc2l0b3J5IGRlYWxzIHdpdGggYEB3aWxsYm9vc3Rlci1wcml2YXRlLypgIHBhY2thZ2VzIOKAlCBieSBjb252ZW50aW9uIHRoYXQgc2NvcGVcbiAqIGxpdmVzIGV4Y2x1c2l2ZWx5IG9uIHRoZSBwcml2YXRlIFZlcmRhY2NpbyByZWdpc3RyeSwgc28gZXhhY3RseSB0aGVzZSByZXBvc2l0b3JpZXMgbmVlZCB0aGVcbiAqIFZFUkRBQ0NJT19UT0tFTiBwYXNzLXRocm91Z2ggaW4gdGhlaXIgcmV1c2FibGUtd29ya2Zsb3cgY2FsbGVycy5cbiAqXG4gKiBBIHJlcG9zaXRvcnkgcXVhbGlmaWVzIHdoZW4gYW55IHdvcmtzcGFjZSBwYWNrYWdlLmpzb24gREVDTEFSRVMgYSBkZXBlbmRlbmN5IGluIHRoZSBzY29wZSAoYW55XG4gKiBkZXBlbmRlbmN5IGZpZWxkKSwgb3IgaXMgaXRzZWxmIE5BTUVEIGluIHRoZSBzY29wZSAoaXQgcHVibGlzaGVzIHRvIFZlcmRhY2NpbywgYW5kIHJlbGVhc2UueW1sXG4gKiBkZXJpdmVzIGl0cyBucG0gYXV0aCBmcm9tIHRoZSBzYW1lIHNlY3JldCkuIE5vdGhpbmcgZWxzZSBpcyBzY2FubmVkOiBsb2NrZmlsZXMgb25seSBtaXJyb3IgdGhlXG4gKiBkZWNsYXJlZCBkZXBlbmRlbmNpZXMsIGFuZCBidW5maWcudG9tbCdzIGBtaW5pbXVtUmVsZWFzZUFnZUV4Y2x1ZGVzYCBtZW50aW9ucyB0aGUgc2NvcGUgZXZlbiBpblxuICogcmVwb3NpdG9yaWVzIHRoYXQgZG8gbm90IGRlcGVuZCBvbiBpdC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlcG9SZXNvbHZlc1ByaXZhdGVQYWNrYWdlcyhcbiAgY29uZmlnOiBQaWNrPFBhY2thZ2VDb25maWcsICdkaXJQYXRoJyB8ICdkb2VzQ29udGFpblN1YlBhY2thZ2VKc29ucycgfCAncGFja2FnZUpzb24nPlxuKTogYm9vbGVhbiB7XG4gIGNvbnN0IG1hbmlmZXN0UmVsUGF0aHMgPSBuZXcgU2V0KFsncGFja2FnZS5qc29uJywgLi4uZ2V0V29ya3NwYWNlUGFja2FnZUpzb25QYXRocyhjb25maWcpXSk7XG4gIHJldHVybiBbLi4ubWFuaWZlc3RSZWxQYXRoc10uc29tZSgocmVsUGF0aCkgPT4ge1xuICAgIGNvbnN0IG1hbmlmZXN0ID0gcmVhZFBhY2thZ2VKc29uSWZFeGlzdHMocGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCByZWxQYXRoKSk7XG4gICAgaWYgKCFtYW5pZmVzdCkgcmV0dXJuIGZhbHNlO1xuICAgIGlmIChtYW5pZmVzdC5uYW1lPy5zdGFydHNXaXRoKFBSSVZBVEVfU0NPUEUpKSByZXR1cm4gdHJ1ZTtcbiAgICByZXR1cm4gW1xuICAgICAgbWFuaWZlc3QuZGVwZW5kZW5jaWVzLFxuICAgICAgbWFuaWZlc3QuZGV2RGVwZW5kZW5jaWVzLFxuICAgICAgbWFuaWZlc3QucGVlckRlcGVuZGVuY2llcyxcbiAgICAgIG1hbmlmZXN0Lm9wdGlvbmFsRGVwZW5kZW5jaWVzLFxuICAgIF0uc29tZSgoZGVwZW5kZW5jaWVzKSA9PiBPYmplY3Qua2V5cyhkZXBlbmRlbmNpZXMgPz8ge30pLnNvbWUoKG5hbWUpID0+IG5hbWUuc3RhcnRzV2l0aChQUklWQVRFX1NDT1BFKSkpO1xuICB9KTtcbn1cblxuZnVuY3Rpb24gcmVhZFBhY2thZ2VKc29uSWZFeGlzdHMoZmlsZVBhdGg6IHN0cmluZyk6IFBhY2thZ2VKc29uIHwgdW5kZWZpbmVkIHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gSlNPTi5wYXJzZShmcy5yZWFkRmlsZVN5bmMoZmlsZVBhdGgsICd1dGY4JykpIGFzIFBhY2thZ2VKc29uO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcy9wcm9taXNlcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgKiBhcyB5YW1sIGZyb20gJ2pzLXlhbWwnO1xuaW1wb3J0IHsgeiB9IGZyb20gJ3pvZCc7XG5cbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuXG5jb25zdCBydW5uZXJTY2hlbWEgPSB6LnVuaW9uKFt6LnN0cmluZygpLCB6LmFycmF5KHouc3RyaW5nKCkpXSk7XG5jb25zdCB3b3JrZmxvd1NjaGVtYSA9IHoub2JqZWN0KHtcbiAgam9iczogei5yZWNvcmQoXG4gICAgei5zdHJpbmcoKSxcbiAgICB6XG4gICAgICAub2JqZWN0KHtcbiAgICAgICAgJ3J1bnMtb24nOiBydW5uZXJTY2hlbWEub3B0aW9uYWwoKSxcbiAgICAgICAgc3RyYXRlZ3k6IHoub2JqZWN0KHsgbWF0cml4OiB6LnJlY29yZCh6LnN0cmluZygpLCB6LnVua25vd24oKSkgfSkub3B0aW9uYWwoKSxcbiAgICAgIH0pXG4gICAgICAubnVsbGFibGUoKVxuICApLFxufSk7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBhc3NlcnRQcml2YXRlV29ya2Zsb3dSdW5uZXJzKGNvbmZpZzogUGFja2FnZUNvbmZpZywgd29ya2Zsb3dzUGF0aDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gIGlmIChjb25maWcuaXNQdWJsaWNSZXBvIHx8ICFjb25maWcuaXNSZXBvVmlzaWJpbGl0eUtub3duKSByZXR1cm47XG4gIGNvbnN0IGVudHJpZXMgPSBhd2FpdCBmcy5yZWFkZGlyKHdvcmtmbG93c1BhdGgsIHsgd2l0aEZpbGVUeXBlczogdHJ1ZSB9KS5jYXRjaCgoZXJyb3I6IE5vZGVKUy5FcnJub0V4Y2VwdGlvbikgPT4ge1xuICAgIGlmIChlcnJvci5jb2RlID09PSAnRU5PRU5UJykgcmV0dXJuIFtdO1xuICAgIHRocm93IGVycm9yO1xuICB9KTtcbiAgZm9yIChjb25zdCB7IG5hbWU6IGZpbGVOYW1lIH0gb2YgZW50cmllcy5maWx0ZXIoKGVudHJ5KSA9PiBlbnRyeS5pc0ZpbGUoKSAmJiAvXFwueWE/bWwkL3UudGVzdChlbnRyeS5uYW1lKSkpIHtcbiAgICBjb25zdCB3b3JrZmxvdyA9IHdvcmtmbG93U2NoZW1hLnBhcnNlKHlhbWwubG9hZChhd2FpdCBmcy5yZWFkRmlsZShwYXRoLmpvaW4od29ya2Zsb3dzUGF0aCwgZmlsZU5hbWUpLCAndXRmOCcpKSk7XG4gICAgZm9yIChjb25zdCBbam9iTmFtZSwgam9iXSBvZiBPYmplY3QuZW50cmllcyh3b3JrZmxvdy5qb2JzKSkge1xuICAgICAgaWYgKCFqb2I/LlsncnVucy1vbiddKSBjb250aW51ZTtcbiAgICAgIGNvbnN0IHJ1bm5lciA9IGpvYlsncnVucy1vbiddO1xuICAgICAgaWYgKGlzU2VsZkhvc3RlZChydW5uZXIpKSBjb250aW51ZTtcbiAgICAgIGNvbnN0IG1hdGNoID0gdHlwZW9mIHJ1bm5lciA9PT0gJ3N0cmluZycgJiYgL15cXCRcXHtcXHtcXHMqbWF0cml4XFwuKFxcdyspXFxzKlxcfVxcfSQvdS5leGVjKHJ1bm5lcik7XG4gICAgICBjb25zdCBjYW5kaWRhdGVzOiB1bmtub3duW10gPSBbXTtcbiAgICAgIGlmIChtYXRjaCAmJiBqb2Iuc3RyYXRlZ3kpIHtcbiAgICAgICAgY29uc3Qga2V5ID0gbWF0Y2hbMV0hO1xuICAgICAgICBjb25zdCBtYXRyaXggPSBqb2Iuc3RyYXRlZ3kubWF0cml4O1xuICAgICAgICBjb25zdCB2YWx1ZXMgPSB6LmFycmF5KHoudW5rbm93bigpKS5zYWZlUGFyc2UobWF0cml4W2tleV0pO1xuICAgICAgICBpZiAodmFsdWVzLnN1Y2Nlc3MpIGNhbmRpZGF0ZXMucHVzaCguLi52YWx1ZXMuZGF0YSk7XG4gICAgICAgIGNvbnN0IGluY2x1ZGUgPSB6LmFycmF5KHoucmVjb3JkKHouc3RyaW5nKCksIHoudW5rbm93bigpKSkuc2FmZVBhcnNlKG1hdHJpeC5pbmNsdWRlKTtcbiAgICAgICAgaWYgKGluY2x1ZGUuc3VjY2VzcylcbiAgICAgICAgICBjYW5kaWRhdGVzLnB1c2goLi4uaW5jbHVkZS5kYXRhLm1hcCgocm93KSA9PiByb3dba2V5XSkuZmlsdGVyKCh2YWx1ZSkgPT4gdmFsdWUgIT09IHVuZGVmaW5lZCkpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY2FuZGlkYXRlcy5wdXNoKHJ1bm5lcik7XG4gICAgICB9XG4gICAgICBjb25zdCBhbGxvd2VkID1cbiAgICAgICAgY2FuZGlkYXRlcy5sZW5ndGggPiAwICYmXG4gICAgICAgIGNhbmRpZGF0ZXMuZXZlcnkoXG4gICAgICAgICAgKGNhbmRpZGF0ZSkgPT5cbiAgICAgICAgICAgIGlzU2VsZkhvc3RlZChjYW5kaWRhdGUpIHx8XG4gICAgICAgICAgICAoY29uZmlnLnJlcG9zaXRvcnk/LnRvTG93ZXJDYXNlKCkgPT09ICdnaXRodWI6d2lsbGJvb3N0ZXIvY2hlZXJsaW5ncycgJiZcbiAgICAgICAgICAgICAgZmlsZU5hbWUgPT09ICdidWlsZC1kZXNrdG9wLWFwcHMueW1sJyAmJlxuICAgICAgICAgICAgICBqb2JOYW1lID09PSAnYnVpbGQnICYmXG4gICAgICAgICAgICAgIGNhbmRpZGF0ZSA9PT0gJ3dpbmRvd3MtbGF0ZXN0JylcbiAgICAgICAgKTtcbiAgICAgIGlmICghYWxsb3dlZCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgYCR7ZmlsZU5hbWV9OiBqb2JzLiR7am9iTmFtZX0ucnVucy1vbiBtdXN0IHNlbGVjdCBzZWxmLWhvc3RlZCBydW5uZXJzIGluIGEgcHJpdmF0ZSByZXBvc2l0b3J5LiBGaXggdGhlIHdvcmtmbG93IGJlZm9yZSBydW5uaW5nIHdiZnkuYFxuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBpc1NlbGZIb3N0ZWQocnVubmVyOiB1bmtub3duKTogYm9vbGVhbiB7XG4gIGNvbnN0IGxhYmVscyA9IHJ1bm5lclNjaGVtYS5zYWZlUGFyc2UocnVubmVyKTtcbiAgaWYgKCFsYWJlbHMuc3VjY2VzcykgcmV0dXJuIGZhbHNlO1xuICBpZiAoQXJyYXkuaXNBcnJheShsYWJlbHMuZGF0YSkpIHJldHVybiBsYWJlbHMuZGF0YS5pbmNsdWRlcygnc2VsZi1ob3N0ZWQnKTtcbiAgcmV0dXJuIGxhYmVscy5kYXRhID09PSAnc2VsZi1ob3N0ZWQnO1xufVxuIiwiLy8gR2l0SHViIEFjdGlvbnMgdmFsdWVsZXNzIGV2ZW50cyBzdWNoIGFzIGBwdWxsX3JlcXVlc3Q6YCByZXF1aXJlIFlBTUwgbnVsbCB2YWx1ZXMuXG4vKiBlc2xpbnQtZGlzYWJsZSB1bmljb3JuL25vLW51bGwgKi9cblxuaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IG1lcmdlIGZyb20gJ2RlZXBtZXJnZSc7XG5pbXBvcnQgKiBhcyB5YW1sIGZyb20gJ2pzLXlhbWwnO1xuaW1wb3J0IHsgeiB9IGZyb20gJ3pvZCc7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgeyBoYXNGbm94U3luY0ZhaWxlZCwgcmVzb2x2ZUZub3hDaUFnZUtleVNlY3JldE5hbWUgfSBmcm9tICcuL2Zub3hUb21sLmpzJztcbmltcG9ydCB7IGZzVXRpbCB9IGZyb20gJy4uL3V0aWxzL2ZzVXRpbC5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGNvbWJpbmVNZXJnZSB9IGZyb20gJy4uL3V0aWxzL21lcmdlVXRpbC5qcyc7XG5pbXBvcnQgeyBtb3ZlVG9Cb3R0b20sIHNvcnRLZXlzIH0gZnJvbSAnLi4vdXRpbHMvb2JqZWN0VXRpbC5qcyc7XG5pbXBvcnQgeyByZXBvUmVzb2x2ZXNQcml2YXRlUGFja2FnZXMgfSBmcm9tICcuLi91dGlscy9wcml2YXRlUGFja2FnZXMuanMnO1xuaW1wb3J0IHsgcHJvbWlzZVBvb2wgfSBmcm9tICcuLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5pbXBvcnQgeyBhc3NlcnRQcml2YXRlV29ya2Zsb3dSdW5uZXJzIH0gZnJvbSAnLi93b3JrZmxvd1J1bm5lclBvbGljeS5qcyc7XG5cbmludGVyZmFjZSBXb3JrZmxvdyB7XG4gIG5hbWU/OiBzdHJpbmc7XG4gIG9uPzogT247XG4gIGNvbmN1cnJlbmN5PzogQ29uY3VycmVuY3k7XG4gIHBlcm1pc3Npb25zPzogUmVjb3JkPHN0cmluZywgc3RyaW5nPjtcbiAgam9iczogUmVjb3JkPHN0cmluZywgSm9iPjtcbn1cblxuaW50ZXJmYWNlIENvbmN1cnJlbmN5IHtcbiAgZ3JvdXA6IHN0cmluZztcbiAgJ2NhbmNlbC1pbi1wcm9ncmVzcyc6IGJvb2xlYW47XG4gIHF1ZXVlPzogJ3NpbmdsZScgfCAnbWF4Jztcbn1cblxuaW50ZXJmYWNlIE9uIHtcbiAgLy8gR2l0SHViIEFjdGlvbnMgdHJlYXRzIGBldmVudDogbnVsbGAgYXMgYSB2YWx1ZWxlc3MgZXZlbnQgbWFwcGluZywgZS5nLlxuICAvLyBgcHVsbF9yZXF1ZXN0OmAuIGB1bmRlZmluZWRgIHdvdWxkIG9taXQgdGhlIGV2ZW50IGVudGlyZWx5IHdoZW4gZHVtcGluZyBZQU1MLlxuICBpc3N1ZXM/OiBUeXBlcyB8IG51bGw7XG4gIHB1bGxfcmVxdWVzdD86IFB1bGxSZXF1ZXN0IHwgbnVsbDtcbiAgcHVsbF9yZXF1ZXN0X3RhcmdldD86IFR5cGVzIHwgbnVsbDtcbiAgcHVzaD86IFB1c2g7XG4gIHNjaGVkdWxlPzogU2NoZWR1bGVbXTtcbiAgd29ya2Zsb3dfZGlzcGF0Y2g/OiBudWxsO1xufVxuXG5pbnRlcmZhY2UgUHVsbFJlcXVlc3Qge1xuICAncGF0aHMtaWdub3JlJz86IHN0cmluZ1tdO1xuICB0eXBlcz86IHN0cmluZ1tdO1xufVxuXG5pbnRlcmZhY2UgUHVzaCB7XG4gIGJyYW5jaGVzOiBzdHJpbmdbXTtcbiAgJ3BhdGhzLWlnbm9yZSc/OiBzdHJpbmdbXTtcbn1cblxuaW50ZXJmYWNlIFNjaGVkdWxlIHtcbiAgY3Jvbjogc3RyaW5nO1xufVxuXG5pbnRlcmZhY2UgVHlwZXMge1xuICB0eXBlczogc3RyaW5nW107XG59XG5cbmludGVyZmFjZSBKb2Ige1xuICAncnVucy1vbic/OiBzdHJpbmc7XG4gIGVudj86IFJlY29yZDxzdHJpbmcsIHN0cmluZz47XG4gIHBlcm1pc3Npb25zPzogUmVjb3JkPHN0cmluZywgc3RyaW5nPjtcbiAgc3RlcHM/OiBTdGVwW107XG4gIHVzZXM/OiBzdHJpbmc7XG4gIGlmPzogc3RyaW5nO1xuICBzZWNyZXRzPzogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gfCAnaW5oZXJpdCc7XG4gIHdpdGg/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbn1cblxuaW50ZXJmYWNlIFN0ZXAge1xuICB1c2VzPzogc3RyaW5nO1xuICB3aXRoPzogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gIHJ1bj86IHN0cmluZztcbn1cblxuY29uc3Qgd29ya2Zsb3dzID0ge1xuICB0ZXN0OiB7XG4gICAgbmFtZTogJ1Rlc3QnLFxuICAgIG9uOiB7XG4gICAgICBwdWxsX3JlcXVlc3Q6IG51bGwsXG4gICAgICBwdXNoOiB7XG4gICAgICAgIGJyYW5jaGVzOiBbJ21haW4nXSxcbiAgICAgIH0sXG4gICAgICAvLyBMZXQgbWFpbnRhaW5lcnMgcmUtcnVuIHRoZSB0ZXN0cyBieSBoYW5kLlxuICAgICAgd29ya2Zsb3dfZGlzcGF0Y2g6IG51bGwsXG4gICAgfSxcbiAgICAvLyBjZi4gaHR0cHM6Ly9kb2NzLmdpdGh1Yi5jb20vZW4vYWN0aW9ucy91c2luZy1qb2JzL3VzaW5nLWNvbmN1cnJlbmN5I2V4YW1wbGUtb25seS1jYW5jZWwtaW4tcHJvZ3Jlc3Mtam9icy1vci1ydW5zLWZvci10aGUtY3VycmVudC13b3JrZmxvd1xuICAgIGNvbmN1cnJlbmN5OiB7XG4gICAgICBncm91cDogJyR7eyBnaXRodWIud29ya2Zsb3cgfX0tJHt7IGdpdGh1Yi5yZWYgfX0nLFxuICAgICAgJ2NhbmNlbC1pbi1wcm9ncmVzcyc6IHRydWUsXG4gICAgfSxcbiAgICAvLyBOb25lIG9mIHRoZXNlIG1heSBiZSBuYXJyb3dlZCBqdXN0IGJlY2F1c2UgdGhlIHJldXNhYmxlIHRlc3Qgd29ya2Zsb3cgbmV2ZXIgcHVzaGVzOlxuICAgIHBlcm1pc3Npb25zOiB7XG4gICAgICAvLyBmb3IgdGhlIHRlc3Qgam9iJ3Mgc2tpcC1kdXBsaWNhdGUtYWN0aW9ucyBjYWxsIHdpdGggY2FuY2VsX290aGVyczogdHJ1ZSAodGhlIHJldXNhYmxlXG4gICAgICAvLyB0ZXN0IHdvcmtmbG93IGRlY2xhcmVzIG5vIHBlcm1pc3Npb25zIG9mIGl0cyBvd24sIHNvIGl0cyBqb2JzIHJ1biBvbiB0aGlzIHRva2VuKVxuICAgICAgYWN0aW9uczogJ3dyaXRlJyxcbiAgICAgIC8vIGZvciBgc2VtYW50aWMtcmVsZWFzZSAtLWRyeS1ydW5gLCB3aGljaCBkb2VzIGEgYGdpdCBwdXNoIC0tZHJ5LXJ1bmAgdG8gdmVyaWZ5IHdyaXRlXG4gICAgICAvLyBhY2Nlc3MgYW5kIGFib3J0cyB3aXRoIEVHSVROT1BFUk1JU1NJT04gd2l0aG91dCBpdFxuICAgICAgY29udGVudHM6ICd3cml0ZScsXG4gICAgICAvLyBmb3IgcGtnLXByZWZsaWdodCBQUiBmaWxlIGxpc3RpbmdcbiAgICAgICdwdWxsLXJlcXVlc3RzJzogJ3JlYWQnLFxuICAgIH0sXG4gICAgam9iczoge1xuICAgICAgdGVzdDoge1xuICAgICAgICB1c2VzOiAnV2lsbEJvb3N0ZXIvcmV1c2FibGUtd29ya2Zsb3dzLy5naXRodWIvd29ya2Zsb3dzL3Rlc3QueW1sQG1haW4nLFxuICAgICAgfSxcbiAgICB9LFxuICB9LFxuICAndGVzdC1ydXN0Jzoge1xuICAgIG5hbWU6ICdUZXN0IFJ1c3QnLFxuICAgIG9uOiB7XG4gICAgICBwdWxsX3JlcXVlc3Q6IG51bGwsXG4gICAgICBwdXNoOiB7XG4gICAgICAgIGJyYW5jaGVzOiBbJ21haW4nXSxcbiAgICAgIH0sXG4gICAgfSxcbiAgICBjb25jdXJyZW5jeToge1xuICAgICAgZ3JvdXA6ICcke3sgZ2l0aHViLndvcmtmbG93IH19LSR7eyBnaXRodWIucmVmIH19JyxcbiAgICAgICdjYW5jZWwtaW4tcHJvZ3Jlc3MnOiB0cnVlLFxuICAgIH0sXG4gICAgam9iczoge1xuICAgICAgJ3Rlc3QtcnVzdCc6IHtcbiAgICAgICAgdXNlczogJ1dpbGxCb29zdGVyL3JldXNhYmxlLXdvcmtmbG93cy8uZ2l0aHViL3dvcmtmbG93cy90ZXN0LXJ1c3QueW1sQG1haW4nLFxuICAgICAgfSxcbiAgICB9LFxuICB9LFxuICByZWxlYXNlOiB7XG4gICAgbmFtZTogJ1JlbGVhc2UnLFxuICAgIG9uOiB7XG4gICAgICBwdXNoOiB7XG4gICAgICAgIGJyYW5jaGVzOiBbXSxcbiAgICAgIH0sXG4gICAgfSxcbiAgICAvLyBgcXVldWU6IG1heGAgaGVyZSB0b28gKCM5NzQpOiBHaXRIdWIncyBkZWZhdWx0IHF1ZXVlIChgc2luZ2xlYCkgY2FuY2VscyBhbiBhbHJlYWR5LVBFTkRJTkdcbiAgICAvLyBjYWxsZXIgcnVuIHdoZW4gYW5vdGhlciBvbmUgcXVldWVzIOKAlCBiZWZvcmUgaXRzIGpvYiAoYW5kIHRoZSByZXVzYWJsZSB3b3JrZmxvdydzIG93blxuICAgIC8vIGpvYi1sZXZlbCBgcXVldWU6IG1heGApIGV2ZXIgc3RhcnRzIOKAlCBzaWxlbnRseSBkcm9wcGluZyB0aGF0IHJlbGVhc2UgdHJpZ2dlci5cbiAgICAvLyBUaGUgY2FsbGVyLWxldmVsIGdyb3VwIG11c3QgTk9UIHJldXNlIHRoZSByZXVzYWJsZSB3b3JrZmxvdydzIGpvYi1sZXZlbCBncm91cCBuYW1lXG4gICAgLy8gKGByZWxlYXNlLSR7eyBnaXRodWIucmVwb3NpdG9yeSB9fWApOiB3b3JrZmxvdy1sZXZlbCBhbmQgam9iLWxldmVsIGdyb3VwcyBzaGFyZSBvbmVcbiAgICAvLyByZXBvc2l0b3J5LXdpZGUgbmFtZXNwYWNlLCBhbmQgaWRlbnRpY2FsIG5hbWVzIGRlYWRsb2NrIHRoZSBydW4gKFwiQ2FuY2VsaW5nIHNpbmNlIGFcbiAgICAvLyBkZWFkbG9jayBmb3IgY29uY3VycmVuY3kgZ3JvdXAgLi4uIHdhcyBkZXRlY3RlZCBiZXR3ZWVuICd0b3AgbGV2ZWwgd29ya2Zsb3cnIGFuZCAnPGpvYj4nXCIpLlxuICAgIGNvbmN1cnJlbmN5OiB7XG4gICAgICBncm91cDogJyR7eyBnaXRodWIud29ya2Zsb3cgfX0nLFxuICAgICAgJ2NhbmNlbC1pbi1wcm9ncmVzcyc6IGZhbHNlLFxuICAgICAgcXVldWU6ICdtYXgnLFxuICAgIH0sXG4gICAgcGVybWlzc2lvbnM6IHtcbiAgICAgIC8vIGh0dHBzOi8vZG9jcy5ucG1qcy5jb20vdHJ1c3RlZC1wdWJsaXNoZXJzI3N0ZXAtMi1jb25maWd1cmUteW91ci1jaWNkLXdvcmtmbG93XG4gICAgICAnaWQtdG9rZW4nOiAnd3JpdGUnLFxuICAgICAgLy8gZm9yIHNlbWFudGljLXJlbGVhc2VcbiAgICAgIGNvbnRlbnRzOiAnd3JpdGUnLFxuICAgIH0sXG4gICAgam9iczoge1xuICAgICAgcmVsZWFzZToge1xuICAgICAgICB1c2VzOiAnV2lsbEJvb3N0ZXIvcmV1c2FibGUtd29ya2Zsb3dzLy5naXRodWIvd29ya2Zsb3dzL3JlbGVhc2UueW1sQG1haW4nLFxuICAgICAgfSxcbiAgICB9LFxuICB9LFxuICAnc2VtYW50aWMtcHInOiB7XG4gICAgbmFtZTogJ0xpbnQgUFIgdGl0bGUnLFxuICAgIG9uOiB7XG4gICAgICBwdWxsX3JlcXVlc3RfdGFyZ2V0OiB7XG4gICAgICAgIHR5cGVzOiBbJ29wZW5lZCcsICdlZGl0ZWQnLCAnc3luY2hyb25pemUnXSxcbiAgICAgIH0sXG4gICAgfSxcbiAgICBqb2JzOiB7XG4gICAgICAnc2VtYW50aWMtcHInOiB7XG4gICAgICAgIHVzZXM6ICdXaWxsQm9vc3Rlci9yZXVzYWJsZS13b3JrZmxvd3MvLmdpdGh1Yi93b3JrZmxvd3Mvc2VtYW50aWMtcHIueW1sQG1haW4nLFxuICAgICAgfSxcbiAgICB9LFxuICB9LFxuICBzeW5jOiB7XG4gICAgbmFtZTogJ1N5bmMnLFxuICAgIG9uOiB7fSxcbiAgICBwZXJtaXNzaW9uczoge1xuICAgICAgLy8gZm9yIGNvbW1pdGluZyBjaGFuZ2VzXG4gICAgICBjb250ZW50czogJ3dyaXRlJyxcbiAgICB9LFxuICAgIGpvYnM6IHtcbiAgICAgIHN5bmM6IHsgdXNlczogJ1dpbGxCb29zdGVyL3JldXNhYmxlLXdvcmtmbG93cy8uZ2l0aHViL3dvcmtmbG93cy9zeW5jLnltbEBtYWluJyB9LFxuICAgIH0sXG4gIH0sXG4gICdjbG9zZS1jb21tZW50Jzoge1xuICAgIG5hbWU6ICdBZGQgY2xvc2UgY29tbWVudCcsXG4gICAgb246IHtcbiAgICAgIHB1bGxfcmVxdWVzdDoge1xuICAgICAgICB0eXBlczogWydvcGVuZWQnXSxcbiAgICAgIH0sXG4gICAgfSxcbiAgICBqb2JzOiB7XG4gICAgICAnY2xvc2UtY29tbWVudCc6IHtcbiAgICAgICAgdXNlczogJ1dpbGxCb29zdGVyL3JldXNhYmxlLXdvcmtmbG93cy8uZ2l0aHViL3dvcmtmbG93cy9jbG9zZS1jb21tZW50LnltbEBtYWluJyxcbiAgICAgIH0sXG4gICAgfSxcbiAgfSxcbn0gYXMgY29uc3Q7XG5cbnR5cGUgS25vd25LaW5kID0ga2V5b2YgdHlwZW9mIHdvcmtmbG93cyB8ICdkZXBsb3knO1xuXG4vKipcbiAqIFBhcnNlcyBhIGB1c2VzOmAgdmFsdWUgY2FsbGluZyBvbmUgb2YgV2lsbEJvb3N0ZXIncyBvd24gcmV1c2FibGUgd29ya2Zsb3dzIChvciB0aGVcbiAqIFdpbGxCb29zdGVyTGFiIHN5bmMgbWlycm9yKSBpbnRvIHRoZSB3b3JrZmxvdyBuYW1lICh3aXRob3V0IGV4dGVuc2lvbikgYW5kIGdpdCByZWYuIE9ubHkgdGhvc2VcbiAqIGZvbGxvdyB0aGUgY29udHJhY3Qgd2JmeSBlbmZvcmNlcyDigJQgY2FsbGVycyBvZiBhbm90aGVyIG9yZ2FuaXphdGlvbidzIHNhbWUtbmFtZWQgcmVwb3NpdG9yeSBhcmVcbiAqIGxlZnQgYWxvbmUuIEdpdEh1YiB0cmVhdHMgb3duZXIvcmVwb3NpdG9yeSBuYW1lcyBjYXNlLWluc2Vuc2l0aXZlbHksIHNvIHRoZSBjb21wYXJpc29uIGRvZXNcbiAqIHRvbywgd2hpbGUgdGhlIHdvcmtmbG93IHBhdGggYW5kIHJlZiBzdGF5IGNhc2Utc2Vuc2l0aXZlLlxuICovXG5mdW5jdGlvbiBwYXJzZU9yZ1JldXNhYmxlV29ya2Zsb3dDYWxsKFxuICB1c2VzOiBzdHJpbmcgfCB1bmRlZmluZWRcbik6IHsgd29ya2Zsb3dOYW1lOiBzdHJpbmc7IGV4dGVuc2lvbjogc3RyaW5nOyByZWY6IHN0cmluZyB9IHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgbWF0Y2ggPSAvXihbXi9dKylcXC8oW14vXSspXFwvXFwuZ2l0aHViXFwvd29ya2Zsb3dzXFwvKFteL0BdKz8pXFwuKHlhP21sKUAoLispJC91LmV4ZWModXNlcyA/PyAnJyk7XG4gIGlmICghbWF0Y2gpIHJldHVybiB1bmRlZmluZWQ7XG4gIGNvbnN0IG93bmVyID0gbWF0Y2hbMV0hLnRvTG93ZXJDYXNlKCk7XG4gIGlmICgob3duZXIgIT09ICd3aWxsYm9vc3RlcicgJiYgb3duZXIgIT09ICd3aWxsYm9vc3RlcmxhYicpIHx8IG1hdGNoWzJdIS50b0xvd2VyQ2FzZSgpICE9PSAncmV1c2FibGUtd29ya2Zsb3dzJykge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cbiAgcmV0dXJuIHsgd29ya2Zsb3dOYW1lOiBtYXRjaFszXSEsIGV4dGVuc2lvbjogbWF0Y2hbNF0hLCByZWY6IG1hdGNoWzVdISB9O1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVXb3JrZmxvd3Mocm9vdENvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICBpZiAoIXJvb3RDb25maWcuaXNSZXBvVmlzaWJpbGl0eUtub3duKSB7XG4gICAgY29uc29sZS53YXJuKCdTa2lwcGVkIHdvcmtmbG93IGdlbmVyYXRpb24gYmVjYXVzZSByZXBvc2l0b3J5IHZpc2liaWxpdHkgaXMgdW5rbm93bi4nKTtcbiAgICByZXR1cm47XG4gIH1cbiAgY29uc3Qgd29ya2Zsb3dzUGF0aCA9IHBhdGgucmVzb2x2ZShyb290Q29uZmlnLmRpclBhdGgsICcuZ2l0aHViJywgJ3dvcmtmbG93cycpO1xuICBpZiAoIWlzUmV1c2FibGVXb3JrZmxvd3NSZXBvKHJvb3RDb25maWcucmVwb3NpdG9yeSkgJiYgKGF3YWl0IGZzVXRpbC5pc0NvbmZpbmVkV3JpdGFibGVQYXRoKHdvcmtmbG93c1BhdGgpKSkge1xuICAgIGF3YWl0IGFzc2VydFByaXZhdGVXb3JrZmxvd1J1bm5lcnMocm9vdENvbmZpZywgd29ya2Zsb3dzUGF0aCk7XG4gIH1cbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdnZW5lcmF0ZVdvcmtmbG93JywgYXN5bmMgKCkgPT4ge1xuICAgIGlmIChpc1JldXNhYmxlV29ya2Zsb3dzUmVwbyhyb290Q29uZmlnLnJlcG9zaXRvcnkpKSB7XG4gICAgICAvLyBEb24ndCB0b3VjaCByZXVzYWJsZS13b3JrZmxvd3MgcmVwbyBiZWNhdXNlIGl0IGhvc3RzIHVwc3RyZWFtIHdvcmtmbG93IGRlZmluaXRpb25zLlxuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIFdpdGggLmdpdGh1YiBvciAuZ2l0aHViL3dvcmtmbG93cyBzeW1saW5rZWQgb3V0c2lkZSB0aGUgcmVwb3NpdG9yeSwgd3JpdGVZYW1sJ3MgZ3VhcmRzXG4gICAgLy8gYWxyZWFkeSByZWZ1c2UgdGhlIHdyaXRlcywgYnV0IHJlYWRkaXIvcm0gYmVsb3cgd291bGQgc3RpbGwgZW51bWVyYXRlIGFuZCBERUxFVEUgZmlsZXNcbiAgICAvLyBvdXRzaWRlIHRoZSByZXBvc2l0b3J5IOKAlCBzbyByZXF1aXJlIHRoZSBkaXJlY3RvcnkgdG8gcmVzb2x2ZSBpbnNpZGUgaXQgYmVmb3JlIGFueVxuICAgIC8vIHRyYXZlcnNhbCwgbWtkaXIsIG9yIGNsZWFudXAuXG4gICAgaWYgKCEoYXdhaXQgZnNVdGlsLmlzQ29uZmluZWRXcml0YWJsZVBhdGgod29ya2Zsb3dzUGF0aCkpKSB7XG4gICAgICBjb25zb2xlLndhcm4oYFNraXBwZWQgZ2VuZXJhdGluZyB3b3JrZmxvd3MgYmVjYXVzZSAke3dvcmtmbG93c1BhdGh9IHJlc29sdmVzIG91dHNpZGUgdGhlIHJlcG9zaXRvcnkuYCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGF3YWl0IGZzLnByb21pc2VzLm1rZGlyKHdvcmtmbG93c1BhdGgsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuXG4gICAgY29uc3QgZW50cmllcyA9IGF3YWl0IGZzLnByb21pc2VzLnJlYWRkaXIod29ya2Zsb3dzUGF0aCwgeyB3aXRoRmlsZVR5cGVzOiB0cnVlIH0pO1xuICAgIC8vIHdiZnkgd3JpdGVzIC55bWwgd29ya2Zsb3dzLCBzbyBlYWNoIGtpbmQgbWFwcyB0byBpdHMgLnltbCBmaWxlLlxuICAgIGNvbnN0IGZpbGVOYW1lc0J5S2luZCA9IG5ldyBNYXA8c3RyaW5nLCBzdHJpbmc+KCk7XG4gICAgZm9yIChjb25zdCBlbnRyeSBvZiBlbnRyaWVzKSB7XG4gICAgICBpZiAoIWVudHJ5LmlzRmlsZSgpIHx8ICFlbnRyeS5uYW1lLmVuZHNXaXRoKCcueW1sJykpIGNvbnRpbnVlO1xuICAgICAgZmlsZU5hbWVzQnlLaW5kLnNldChlbnRyeS5uYW1lLnNsaWNlKDAsIC0nLnltbCcubGVuZ3RoKSwgZW50cnkubmFtZSk7XG4gICAgfVxuICAgIGNvbnN0IG1hbmRhdG9yeUtpbmRzID0gWyd0ZXN0JywgJ3NlbWFudGljLXByJywgJ2Nsb3NlLWNvbW1lbnQnXTtcbiAgICBpZiAocm9vdENvbmZpZy5kZXBlbmRpbmcuc2VtYW50aWNSZWxlYXNlKSB7XG4gICAgICBtYW5kYXRvcnlLaW5kcy5wdXNoKCdyZWxlYXNlJyk7XG4gICAgfVxuICAgIGlmIChyb290Q29uZmlnLmNhcmdvVG9tbERpclBhdGhzLmxlbmd0aCA+IDApIHtcbiAgICAgIG1hbmRhdG9yeUtpbmRzLnB1c2goJ3Rlc3QtcnVzdCcpO1xuICAgIH1cbiAgICAvLyBBIHByZXZpb3VzIHJ1biBtYXkgaGF2ZSBtaXN0YWtlbiBhIGdpdGlnbm9yZWQgdGhpcmQtcGFydHkgY2hlY2tvdXQgZm9yIHJlcG9zaXRvcnkgUnVzdCBjb2RlLlxuICAgIC8vIFJlbW92ZSBvbmx5IHRoZSBnZW5lcmF0ZWQtc3R5bGUgY2FsbGVyOiBhIHNhbWUtbmFtZWQgY3VzdG9tIHdvcmtmbG93IHdpdGggYW55IG90aGVyIGpvYiBzdGF5cy5cbiAgICBpZiAocm9vdENvbmZpZy5jYXJnb1RvbWxEaXJQYXRocy5sZW5ndGggPT09IDApIHtcbiAgICAgIGNvbnN0IHRlc3RSdXN0RmlsZU5hbWUgPSBmaWxlTmFtZXNCeUtpbmQuZ2V0KCd0ZXN0LXJ1c3QnKTtcbiAgICAgIGlmICh0ZXN0UnVzdEZpbGVOYW1lICYmIGpvYnNBbGxDYWxsUmV1c2FibGVXb3JrZmxvdyh3b3JrZmxvd3NQYXRoLCB0ZXN0UnVzdEZpbGVOYW1lLCAndGVzdC1ydXN0JykpIHtcbiAgICAgICAgZmlsZU5hbWVzQnlLaW5kLmRlbGV0ZSgndGVzdC1ydXN0Jyk7XG4gICAgICAgIGF3YWl0IGZzVXRpbC5yZW1vdmVDb25maW5lZChwYXRoLmpvaW4od29ya2Zsb3dzUGF0aCwgdGVzdFJ1c3RGaWxlTmFtZSkpO1xuICAgICAgfVxuICAgIH1cbiAgICBmaWxlTmFtZXNCeUtpbmQuZGVsZXRlKCd3YmZ5Jyk7XG4gICAgZm9yIChjb25zdCBraW5kIG9mIG1hbmRhdG9yeUtpbmRzKSB7XG4gICAgICBpZiAoIWZpbGVOYW1lc0J5S2luZC5oYXMoa2luZCkpIHtcbiAgICAgICAgZmlsZU5hbWVzQnlLaW5kLnNldChraW5kLCBgJHtraW5kfS55bWxgKTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGZpbGVOYW1lc0J5S2luZC5oYXMoJ3N5bmMnKSkge1xuICAgICAgLy8gVGhlIHN5bmMgd29ya2Zsb3cncyBnZW5lcmF0aW9uIG93bnMgdGhlIGZvcmNlLXN5bmMgd29ya2Zsb3csIHNvIHByb2Nlc3NpbmcgaXQgYXMgYW5cbiAgICAgIC8vIGluZGVwZW5kZW50IGtpbmQgd291bGQgcmFjZSBjb25jdXJyZW50IHdyaXRlcyBvbiB0aGUgc2FtZSBwYXRoLlxuICAgICAgZmlsZU5hbWVzQnlLaW5kLmRlbGV0ZSgnc3luYy1mb3JjZScpO1xuICAgIH1cblxuICAgIGZvciAoY29uc3QgW2tpbmQsIGZpbGVOYW1lXSBvZiBmaWxlTmFtZXNCeUtpbmQpIHtcbiAgICAgIC8vIOWun+mam+OBr0tub3duS2luZOS7peWkluOBruWApOOCguS7o+WFpeOBleOCjOOCi+OBk+OBqOOBq+azqOaEj1xuICAgICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IHdyaXRlV29ya2Zsb3dZYW1sKHJvb3RDb25maWcsIHdvcmtmbG93c1BhdGgsIGtpbmQgYXMgS25vd25LaW5kLCBmaWxlTmFtZSkpO1xuICAgIH1cbiAgfSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc1JldXNhYmxlV29ya2Zsb3dzUmVwbyhyZXBvc2l0b3J5Pzogc3RyaW5nKTogYm9vbGVhbiB7XG4gIC8vIENhc2UtaW5zZW5zaXRpdmU6IEdpdEh1YiByZXBvc2l0b3J5IG5hbWVzIGFyZSwgYW5kIGEgcmVtb3RlIG1heSBzcGVsbCB0aGlzIG9uZSBhbnkgd2F5LiBHZXR0aW5nIGl0IHdyb25nXG4gIC8vIGxldHMgd2JmeSByZXdyaXRlIHRoZSByZXBvc2l0b3J5IHRoYXQgaG9zdHMgdGhlIHVwc3RyZWFtIHdvcmtmbG93IGRlZmluaXRpb25zLlxuICByZXR1cm4gcmVwb3NpdG9yeT8udG9Mb3dlckNhc2UoKS5lbmRzV2l0aCgnL3JldXNhYmxlLXdvcmtmbG93cycpID8/IGZhbHNlO1xufVxuXG4vKipcbiAqIFdoZXRoZXIgZXZlcnkgam9iIG9mIHRoZSB3b3JrZmxvdyBmaWxlIGNhbGxzIHRoZSBuYW1lZCBXaWxsQm9vc3RlciByZXVzYWJsZSB3b3JrZmxvdyAob3duZXJcbiAqIHJlc3RyaWN0ZWQgdmlhIHBhcnNlT3JnUmV1c2FibGVXb3JrZmxvd0NhbGwpLiBVc2VkIHRvIGRlY2lkZSB3aGV0aGVyIHdiZnkgb3ducyBhIGZpbGUgZW5vdWdoIHRvXG4gKiBkZWxldGUgaXQ6IHVucGFyc2FibGUgZmlsZXMgYW5kIGZpbGVzIHdpdGggYW55IG90aGVyIGpvYiByZXR1cm4gZmFsc2Ug4oCUIGRlbGV0aW5nIGEgd2hvbGVcbiAqIHdvcmtmbG93IG9uIGEgbG9vc2UgbWF0Y2ggd291bGQgYmUgdG9vIGFnZ3Jlc3NpdmUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBqb2JzQWxsQ2FsbFJldXNhYmxlV29ya2Zsb3cod29ya2Zsb3dzUGF0aDogc3RyaW5nLCBmaWxlTmFtZTogc3RyaW5nLCB3b3JrZmxvd05hbWU6IHN0cmluZyk6IGJvb2xlYW4ge1xuICBpZiAoIWZpbGVOYW1lLmVuZHNXaXRoKCcueW1sJykpIHJldHVybiBmYWxzZTtcbiAgbGV0IGNvbnRlbnQ6IHN0cmluZztcbiAgdHJ5IHtcbiAgICBjb250ZW50ID0gZnMucmVhZEZpbGVTeW5jKHBhdGguam9pbih3b3JrZmxvd3NQYXRoLCBmaWxlTmFtZSksICd1dGY4Jyk7XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBjb25zdCBpc1RhcmdldENhbGwgPSAodXNlczogdW5rbm93bik6IGJvb2xlYW4gPT5cbiAgICB0eXBlb2YgdXNlcyA9PT0gJ3N0cmluZycgJiYgcGFyc2VPcmdSZXVzYWJsZVdvcmtmbG93Q2FsbCh1c2VzKT8ud29ya2Zsb3dOYW1lID09PSB3b3JrZmxvd05hbWU7XG4gIHRyeSB7XG4gICAgY29uc3Qgd29ya2Zsb3cgPSB5YW1sLmxvYWQoY29udGVudCkgYXMgV29ya2Zsb3cgfCB1bmRlZmluZWQ7XG4gICAgaWYgKHdvcmtmbG93ICYmIHR5cGVvZiB3b3JrZmxvdyA9PT0gJ29iamVjdCcgJiYgd29ya2Zsb3cuam9icyAmJiB0eXBlb2Ygd29ya2Zsb3cuam9icyA9PT0gJ29iamVjdCcpIHtcbiAgICAgIGNvbnN0IGpvYnMgPSBPYmplY3QudmFsdWVzKHdvcmtmbG93LmpvYnMpO1xuICAgICAgcmV0dXJuIGpvYnMubGVuZ3RoID4gMCAmJiBqb2JzLmV2ZXJ5KChqb2IpID0+IGlzVGFyZ2V0Q2FsbChqb2I/LnVzZXMpKTtcbiAgICB9XG4gIH0gY2F0Y2gge1xuICAgIC8vIFVucGFyc2FibGUgY29udGVudCBpcyBub3QgcHJvdmFibHkgYSBjYWxsZXIgb2YgdGhlIG5hbWVkIHdvcmtmbG93LlxuICB9XG4gIHJldHVybiBmYWxzZTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gd3JpdGVXb3JrZmxvd1lhbWwoXG4gIGNvbmZpZzogUGFja2FnZUNvbmZpZyxcbiAgd29ya2Zsb3dzUGF0aDogc3RyaW5nLFxuICBraW5kOiBLbm93bktpbmQsXG4gIGZpbGVOYW1lID0gYCR7a2luZH0ueW1sYFxuKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5qb2luKHdvcmtmbG93c1BhdGgsIGZpbGVOYW1lKTtcbiAgY29uc3QgZGVwbG95UHJvZHVjdGlvbkZpbGVOYW1lID0gZnMuZXhpc3RzU3luYyhwYXRoLmpvaW4od29ya2Zsb3dzUGF0aCwgJ2RlcGxveS1wcm9kdWN0aW9uLnltbCcpKVxuICAgID8gJ2RlcGxveS1wcm9kdWN0aW9uLnltbCdcbiAgICA6IHVuZGVmaW5lZDtcblxuICAvLyBBIG5vbi1nZW5lcmF0ZWQgdGVzdC1ydXN0LnltbCBpbiBhIHJlcG8gd2l0aG91dCBSdXN0IGNvZGUgbWVyZWx5IHNoYXJlcyB0aGUgbmFtZTsgbGVhdmUgaXQgYWxvbmUuXG4gIGlmIChraW5kID09PSAndGVzdC1ydXN0JyAmJiBjb25maWcuY2FyZ29Ub21sRGlyUGF0aHMubGVuZ3RoID09PSAwKSByZXR1cm47XG5cbiAgbGV0IG5ld1NldHRpbmdzID0gc3RydWN0dXJlZENsb25lKGtpbmQgaW4gd29ya2Zsb3dzID8gd29ya2Zsb3dzW2tpbmQgYXMga2V5b2YgdHlwZW9mIHdvcmtmbG93c10gOiB7fSkgYXMgV29ya2Zsb3c7XG4gIGNvbnN0IG9sZENvbnRlbnQgPSBhd2FpdCBmc1V0aWwucmVhZEZpbGVJZkV4aXN0cyhmaWxlUGF0aCk7XG4gIGlmIChvbGRDb250ZW50ICE9PSB1bmRlZmluZWQpIHtcbiAgICBsZXQgb2xkU2V0dGluZ3M6IFdvcmtmbG93O1xuICAgIHRyeSB7XG4gICAgICBvbGRTZXR0aW5ncyA9IHlhbWwubG9hZChvbGRDb250ZW50KSBhcyBXb3JrZmxvdztcbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIEFuIGV4aXN0aW5nIHdvcmtmbG93IHdiZnkgY2Fubm90IHBhcnNlIG11c3QgYmUgbGVmdCB1bnRvdWNoZWQ6IHdyaXRpbmcgdGhlIHRlbXBsYXRlXG4gICAgICAvLyB3aXRob3V0IG1lcmdpbmcgd291bGQgc2lsZW50bHkgZGlzY2FyZCB0aGUgcmVwb3NpdG9yeSdzIHdvcmtmbG93LlxuICAgICAgY29uc29sZS53YXJuKGBTa2lwcGVkIGdlbmVyYXRpbmcgJHtmaWxlUGF0aH0gYmVjYXVzZSB0aGUgZXhpc3RpbmcgY29udGVudCBpcyBub3QgcGFyc2FibGUgYXMgWUFNTC5gKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgLy8geWFtbC5sb2FkIHJldHVybnMgdW5kZWZpbmVkIGZvciBlbXB0eS9jb21tZW50LW9ubHkgZmlsZXMgYW5kIG5vbi1vYmplY3RzIGZvciBzY2FsYXJcbiAgICAvLyBkb2N1bWVudHMgd2l0aG91dCB0aHJvd2luZzsgZGVlcG1lcmdlIHdvdWxkIGNyYXNoIG9uIHRoZW0uXG4gICAgaWYgKHR5cGVvZiBvbGRTZXR0aW5ncyAhPT0gJ29iamVjdCcgfHwgb2xkU2V0dGluZ3MgPT09IG51bGwgfHwgQXJyYXkuaXNBcnJheShvbGRTZXR0aW5ncykpIHtcbiAgICAgIGNvbnNvbGUud2FybihgU2tpcHBlZCBnZW5lcmF0aW5nICR7ZmlsZVBhdGh9IGJlY2F1c2UgdGhlIGV4aXN0aW5nIGNvbnRlbnQgaXMgbm90IGEgd29ya2Zsb3cuYCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIG5ld1NldHRpbmdzID0gbWVyZ2UuYWxsKFtuZXdTZXR0aW5ncywgb2xkU2V0dGluZ3MsIG5ld1NldHRpbmdzXSwgeyBhcnJheU1lcmdlOiBjb21iaW5lTWVyZ2UgfSkgYXMgV29ya2Zsb3c7XG4gIH1cblxuICBpZiAoISgnam9icycgaW4gbmV3U2V0dGluZ3MpKSByZXR1cm47XG5cbiAgaWYgKGtpbmQuc3RhcnRzV2l0aCgnZGVwbG95JykpIHtcbiAgICBuZXdTZXR0aW5ncyA9IHtcbiAgICAgIC4uLm5ld1NldHRpbmdzLFxuICAgICAgLy8gVW5saWtlIHRoZSByZWxlYXNlIGNhbGxlciwgdGhlIGRlZmF1bHQgcXVldWUgKGBzaW5nbGVgKSBpcyBpbnRlbnRpb25hbCBoZXJlOiBhIHBlbmRpbmdcbiAgICAgIC8vIGRlcGxveSB0aGF0IGlzIGNhbmNlbGxlZCBhbmQgcmVwbGFjZWQgYnkgYSBuZXdlciBvbmUgbG9zZXMgbm90aGluZyDigJQgdGhlIG5ld2VyIGRlcGxveVxuICAgICAgLy8gY29udmVyZ2VzIHRoZSBlbnZpcm9ubWVudCB0byB0aGUgbGF0ZXN0IHN0YXRlIGFueXdheS5cbiAgICAgIGNvbmN1cnJlbmN5OiB7XG4gICAgICAgIGdyb3VwOiAnJHt7IGdpdGh1Yi53b3JrZmxvdyB9fScsXG4gICAgICAgICdjYW5jZWwtaW4tcHJvZ3Jlc3MnOiBmYWxzZSxcbiAgICAgIH0sXG4gICAgfTtcbiAgICBtb3ZlVG9Cb3R0b20obmV3U2V0dGluZ3MsICdqb2JzJyk7XG4gICAgaWYgKG5ld1NldHRpbmdzLm9uPy5wdXNoKSB7XG4gICAgICBuZXdTZXR0aW5ncy5vbi5wdXNoWydwYXRocy1pZ25vcmUnXSA9IFtcbiAgICAgICAgLi4ubmV3IFNldChbJyoqLm1kJywgJyoqL2RvY3MvKionLCAuLi4obmV3U2V0dGluZ3Mub24ucHVzaFsncGF0aHMtaWdub3JlJ10gPz8gW10pXSksXG4gICAgICBdO1xuICAgIH1cbiAgfVxuXG4gIGlmIChraW5kID09PSAncmVsZWFzZScgJiYgbmV3U2V0dGluZ3Muam9icy5yZWxlYXNlICYmIGRlcGxveVByb2R1Y3Rpb25GaWxlTmFtZSkge1xuICAgIG5ld1NldHRpbmdzLnBlcm1pc3Npb25zID8/PSB7fTtcbiAgICBuZXdTZXR0aW5ncy5wZXJtaXNzaW9ucy5hY3Rpb25zID0gJ3dyaXRlJztcbiAgICBuZXdTZXR0aW5ncy5qb2JzLnJlbGVhc2Uud2l0aCA/Pz0ge307XG4gICAgbmV3U2V0dGluZ3Muam9icy5yZWxlYXNlLndpdGgudHJpZ2dlcl9kZXBsb3lfd29ya2Zsb3cgPSBkZXBsb3lQcm9kdWN0aW9uRmlsZU5hbWU7XG4gIH1cblxuICBsZXQgaXNSZXVzYWJsZVdvcmtmbG93ID0gZmFsc2U7XG4gIGZvciAoY29uc3Qgam9iIG9mIE9iamVjdC52YWx1ZXMobmV3U2V0dGluZ3Muam9icykpIHtcbiAgICAvLyBJZ25vcmUgZW1wdHkgam9icyAoYSBiYXJlIGBqb2JOYW1lOmAgcGFyc2VzIGFzIG51bGwpLCBub24tcmV1c2FibGUgd29ya2Zsb3dzLCBhbmQgb3RoZXJcbiAgICAvLyBvcmdhbml6YXRpb25zJyByZXVzYWJsZSB3b3JrZmxvd3M6IGEgc2FtZS1uYW1lZCBgcmV1c2FibGUtd29ya2Zsb3dzYCByZXBvc2l0b3J5IGVsc2V3aGVyZVxuICAgIC8vIGZvbGxvd3MgYSBkaWZmZXJlbnQgY29udHJhY3QsIGFuZCBub3JtYWxpemluZyBpdHMgY2FsbGVycyAoc2VjcmV0IGluamVjdGlvbi9yZW1vdmFsLFxuICAgIC8vIHBlcm1pc3Npb25zKSBjb3VsZCBicmVhayB0aGVtLlxuICAgIGlmICgham9iIHx8ICFwYXJzZU9yZ1JldXNhYmxlV29ya2Zsb3dDYWxsKGpvYi51c2VzKSkgY29udGludWU7XG5cbiAgICBub3JtYWxpemVKb2IoY29uZmlnLCBqb2IsIGtpbmQpO1xuICAgIGlzUmV1c2FibGVXb3JrZmxvdyA9IHRydWU7XG4gIH1cbiAgaWYgKCFpc1JldXNhYmxlV29ya2Zsb3cpIHJldHVybjtcblxuICAvLyBEZXBsb3kgY2FsbGVycyBuZWVkIG5vIHJlcG9zaXRvcnkgd3JpdGVzOiB0aGUgY2FsbGVkIHJldXNhYmxlIHdvcmtmbG93IGluaGVyaXRzIHRoZSBjYWxsZXInc1xuICAvLyB0b2tlbiBwZXJtaXNzaW9ucywgcmVwb3NpdG9yaWVzIGRlZmF1bHQgdGhlIHRva2VuIHRvIHdyaXRlLCBhbmQgdGhlIHJldXNhYmxlIGRlcGxveSB3b3JrZmxvd1xuICAvLyBhdCBtYWluIHBlcmZvcm1zIG5vIEdJVEhVQl9UT0tFTiB3cml0ZXMuIFRoZSByZWFkLW9ubHkgZGVmYXVsdCBpcyBpbmplY3RlZCBhdCB0aGUgSk9CIGxldmVsXG4gIC8vIChqb2IgcGVybWlzc2lvbnMgZG8gbm90IGFmZmVjdCBzaWJsaW5nIGpvYnMsIHNvIGlubGluZSBqb2JzIG9yIHBpbm5lZCBjYWxsZWVzIOKAlCB3aG9zZSB3cml0ZVxuICAvLyBuZWVkcyBhcmUgdW5hdWRpdGVkIOKAlCBrZWVwIHRoZWlycyksIGFuZCBvbmx5IHdoZW4gbmVpdGhlciB0aGUgd29ya2Zsb3cgbm9yIHRoZSBqb2IgZGVjbGFyZXNcbiAgLy8gaXRzIG93biBwZXJtaXNzaW9ucyAoT0lEQyBkZXBsb3lzIGFsd2F5cyBkbywgZm9yIGlkLXRva2VuKS4gcnVuLXNjcmlwdCBjYWxsZXJzIGFyZSBleGNsdWRlZFxuICAvLyBiZWNhdXNlIGFyYml0cmFyeSBwYWNrYWdlIHNjcmlwdHMgbWF5IHB1c2ggY29tbWl0cy5cbiAgaWYgKCFuZXdTZXR0aW5ncy5wZXJtaXNzaW9ucykge1xuICAgIGZvciAoY29uc3Qgam9iIG9mIE9iamVjdC52YWx1ZXMobmV3U2V0dGluZ3Muam9icykpIHtcbiAgICAgIGlmICgham9iKSBjb250aW51ZTtcbiAgICAgIGNvbnN0IGNhbGwgPSBwYXJzZU9yZ1JldXNhYmxlV29ya2Zsb3dDYWxsKGpvYi51c2VzKTtcbiAgICAgIGlmICgham9iLnBlcm1pc3Npb25zICYmIGNhbGw/LndvcmtmbG93TmFtZSA9PT0gJ2RlcGxveScgJiYgY2FsbC5yZWYgPT09ICdtYWluJykge1xuICAgICAgICBqb2IucGVybWlzc2lvbnMgPSB7IGNvbnRlbnRzOiAncmVhZCcgfTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBzd2l0Y2ggKGtpbmQpIHtcbiAgICBjYXNlICdyZWxlYXNlJzoge1xuICAgICAgaWYgKG5ld1NldHRpbmdzLm9uPy5zY2hlZHVsZSkge1xuICAgICAgICBkZWxldGUgbmV3U2V0dGluZ3Mub24ucHVzaDtcbiAgICAgIH0gZWxzZSBpZiAobmV3U2V0dGluZ3Mub24/LnB1c2ggJiYgY29uZmlnLnJlbGVhc2UuYnJhbmNoZXMubGVuZ3RoID4gMCkge1xuICAgICAgICBuZXdTZXR0aW5ncy5vbi5wdXNoLmJyYW5jaGVzID0gY29uZmlnLnJlbGVhc2UuYnJhbmNoZXM7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBhd2FpdCBmc1V0aWwucmVtb3ZlQ29uZmluZWQoZmlsZVBhdGgpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBpZiAoY29uZmlnLmlzUHVibGljUmVwbykge1xuICAgICAgICBuZXdTZXR0aW5ncy5wZXJtaXNzaW9ucyA/Pz0ge307XG4gICAgICAgIG5ld1NldHRpbmdzLnBlcm1pc3Npb25zWydpZC10b2tlbiddID0gJ3dyaXRlJztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGRlbGV0ZSBuZXdTZXR0aW5ncy5wZXJtaXNzaW9ucz8uWydpZC10b2tlbiddO1xuICAgICAgfVxuICAgICAgYnJlYWs7XG4gICAgfVxuICAgIGNhc2UgJ3Rlc3QnOlxuICAgIGNhc2UgJ3Rlc3QtcnVzdCc6IHtcbiAgICAgIC8vIERvbid0IHVzZSBgcGF0aHMtaWdub3JlYCBmb3IgdGVzdCBiZWNhdXNlIEdpdEh1YidzIEJyYW5jaCBQcm90ZWN0aW9uIGFuZCBSdWxlc2V0cyByZXF1aXJlIGpvYiBydW5uaW5nLlxuICAgICAgaWYgKG5ld1NldHRpbmdzLm9uPy5wdWxsX3JlcXVlc3QpIHtcbiAgICAgICAgZGVsZXRlIG5ld1NldHRpbmdzLm9uLnB1bGxfcmVxdWVzdFsncGF0aHMtaWdub3JlJ107XG4gICAgICB9XG4gICAgICBpZiAobmV3U2V0dGluZ3Mub24/LnB1c2gpIHtcbiAgICAgICAgZGVsZXRlIG5ld1NldHRpbmdzLm9uLnB1c2hbJ3BhdGhzLWlnbm9yZSddO1xuICAgICAgICBuZXdTZXR0aW5ncy5vbi5wdXNoLmJyYW5jaGVzID0gbmV3U2V0dGluZ3Mub24ucHVzaC5icmFuY2hlcy5maWx0ZXIoKGJyYW5jaCkgPT4gYnJhbmNoICE9PSAncmVub3ZhdGUvKionKTtcbiAgICAgIH1cbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuICBhd2FpdCB3cml0ZVlhbWwobmV3U2V0dGluZ3MsIGZpbGVQYXRoKTtcblxuICBpZiAoa2luZCA9PT0gJ3N5bmMnKSB7XG4gICAgaWYgKCFuZXdTZXR0aW5ncy5qb2JzLnN5bmM/LndpdGgpIHJldHVybjtcblxuICAgIC8vIEdlbmVyYXRlIHRoZSBmb3JjZS1zeW5jIHdvcmtmbG93IGJhc2VkIG9uIHRoZSBzeW5jIHdvcmtmbG93IGlmIGl0IGV4aXN0cy5cbiAgICBuZXdTZXR0aW5ncy5qb2JzWydzeW5jLWZvcmNlJ10gPSBuZXdTZXR0aW5ncy5qb2JzLnN5bmM7XG4gICAgY29uc3QgcGFyYW1zID0gbmV3U2V0dGluZ3Muam9icy5zeW5jLndpdGguc3luY19wYXJhbXNfd2l0aG91dF9kZXN0O1xuICAgIGlmICh0eXBlb2YgcGFyYW1zICE9PSAnc3RyaW5nJykgcmV0dXJuO1xuXG4gICAgbmV3U2V0dGluZ3Muam9icy5zeW5jLndpdGguc3luY19wYXJhbXNfd2l0aG91dF9kZXN0ID0gYC0tZm9yY2UgJHtwYXJhbXN9YDtcbiAgICBuZXdTZXR0aW5ncy5uYW1lID0gJ0ZvcmNlIHRvIFN5bmMnO1xuICAgIG5ld1NldHRpbmdzLm9uID0geyB3b3JrZmxvd19kaXNwYXRjaDogbnVsbCB9O1xuICAgIGRlbGV0ZSBuZXdTZXR0aW5ncy5qb2JzLnN5bmM7XG4gICAgYXdhaXQgd3JpdGVZYW1sKG5ld1NldHRpbmdzLCBwYXRoLmpvaW4od29ya2Zsb3dzUGF0aCwgJ3N5bmMtZm9yY2UueW1sJykpO1xuICB9XG59XG5cbi8vIHdiJ3MgZ2xvYmFsIG9wdGlvbnMgdGhhdCBjb25zdW1lIGEgZm9sbG93aW5nIHZhbHVlIHRva2VuIChmcm9tIHNoYXJlZE9wdGlvbnNCdWlsZGVyIHBsdXNcbi8vIHlhcmdzT3B0aW9uc0J1aWxkZXJGb3JFbnYpOyBldmVyeSBvdGhlciBgLWAtcHJlZml4ZWQgdG9rZW4gYmVmb3JlIHRoZSBzdWJjb21tYW5kIGlzIGEgYm9vbGVhbi5cbmNvbnN0IHdiR2xvYmFsVmFsdWVPcHRpb25zID0gbmV3IFNldChbJy0td29ya2luZy1kaXInLCAnLXcnLCAnLS1lbnYnLCAnLS1jYXNjYWRlLWVudiddKTtcblxuLy8gU3ViY29tbWFuZHMgdGhhdCBydW4gYSBCSU5BUlkgKHNvIHRoZSBmb2xsb3dpbmcgdG9rZW4gY2FuIGJlIHRoZSB3YiBleGVjdXRhYmxlKSwgcGVyIHJ1bm5lcjogYnVuXG4vLyByZXNlcnZlcyBvbmx5IGB4YCAoYGJ1biBkbHhgL2BidW4gZXhlY2AgcnVuIGEgcGFja2FnZSBzY3JpcHQgb2YgdGhhdCBuYW1lKSwgbnBtIGhhcyBgZXhlY2AvYHhgLFxuLy8gYW5kIHBucG0veWFybiAoQmVycnkpIGhhdmUgYGV4ZWNgL2BkbHhgLlxuY29uc3QgcnVubmVyRXhlY3V0b3JTdWJjb21tYW5kc0J5UnVubmVyOiBSZWNvcmQ8c3RyaW5nLCBTZXQ8c3RyaW5nPj4gPSB7XG4gIG5wbTogbmV3IFNldChbJ2V4ZWMnLCAneCddKSxcbiAgcG5wbTogbmV3IFNldChbJ2V4ZWMnLCAnZGx4J10pLFxuICB5YXJuOiBuZXcgU2V0KFsnZXhlYycsICdkbHgnXSksXG4gIGJ1bjogbmV3IFNldChbJ3gnXSksXG59O1xuXG4vLyBSdW5uZXIgb3B0aW9ucyB0aGF0IGNvbnN1bWUgdGhlIEZPTExPV0lORyB0b2tlbiBhcyB0aGVpciB2YWx1ZSwgc28gaXQgaXMgbm90IHRoZSB3YiBleGVjdXRhYmxlXG4vLyAoZS5nLiBgYnVuIC0tY3dkIGRpciB3YiBkZXBsb3lgLCBgbnB4IC1wIHBrZyB3YiBkZXBsb3lgKS4gQSBjb25zZXJ2YXRpdmUgc3VwZXJzZXQgYWNyb3NzXG4vLyBucG0vcG5wbS95YXJuL2J1biBhbmQgdGhlIG5weC9idW54IHBhY2thZ2UgZXhlY3V0b3JzLlxuY29uc3QgcnVubmVyVmFsdWVPcHRpb25zID0gbmV3IFNldChbXG4gICctLWN3ZCcsXG4gICctQycsXG4gICctLXByZWZpeCcsXG4gICctLWZpbHRlcicsXG4gICctRicsXG4gICctLXdvcmtzcGFjZScsXG4gICctdycsXG4gICctLWRpcicsXG4gICctcCcsXG4gICctLXBhY2thZ2UnLFxuICAnLWMnLFxuICAnLS1jYWxsJyxcbl0pO1xuXG4vKiogQWR2YW5jZSBwYXN0IGEgcnVubmVyJ3Mgb3B0aW9ucywgY29uc3VtaW5nIGEgc2VwYXJhdGUgdmFsdWUgdG9rZW4gd2hlcmUgb25lIGFwcGxpZXMuICovXG5mdW5jdGlvbiBza2lwUnVubmVyT3B0aW9ucyh0b2tlbnM6IHN0cmluZ1tdLCBzdGFydEluZGV4OiBudW1iZXIpOiBudW1iZXIge1xuICBsZXQgaW5kZXggPSBzdGFydEluZGV4O1xuICB3aGlsZSAoaW5kZXggPCB0b2tlbnMubGVuZ3RoICYmICh0b2tlbnNbaW5kZXhdID8/ICcnKS5zdGFydHNXaXRoKCctJykpIHtcbiAgICBjb25zdCBvcHRpb24gPSB0b2tlbnNbaW5kZXhdID8/ICcnO1xuICAgIGluZGV4Kys7XG4gICAgaWYgKCFvcHRpb24uaW5jbHVkZXMoJz0nKSAmJiBydW5uZXJWYWx1ZU9wdGlvbnMuaGFzKG9wdGlvbikgJiYgaW5kZXggPCB0b2tlbnMubGVuZ3RoKSBpbmRleCsrO1xuICB9XG4gIHJldHVybiBpbmRleDtcbn1cblxuLyoqXG4gKiBUb2tlbml6ZSBhIHNoZWxsIGNvbW1hbmQgbGluZSBpbnRvIGNvbW1hbmQgc2VnbWVudHMsIGVhY2ggYSBsaXN0IG9mIHRva2VucyB3aXRoIHF1b3RlcyByZW1vdmVkLlxuICogQSBuZXcgc2VnbWVudCBzdGFydHMgYXQgYW4gdW5xdW90ZWQgYCYmYC9gfHxgL2A7YC9gfGAvYCZgOyBhbiB1bnF1b3RlZCBgI2Agc3RhcnRzIGEgY29tbWVudCB0b1xuICogZW5kIG9mIGxpbmU7IGEgYmFja3NsYXNoIGVzY2FwZXMgdGhlIG5leHQgY2hhcmFjdGVyIChzbyBgXFw7YCBpcyBhIGxpdGVyYWwsIG5vdCBhIHNlcGFyYXRvcik7XG4gKiBncm91cGluZyBwYXJlbnRoZXNlcyBgKGAvYClgIGFyZSB0b2tlbiBzZXBhcmF0b3JzLCBzbyBgKHdiIGRlcGxveSlgIHRva2VuaXplcyBhcyBgd2IgZGVwbG95YC5cbiAqIFNlZ21lbnRzL3Rva2VucyBtb2RlbCBjb21tYW5kIHN0cnVjdHVyZSBwcmVjaXNlbHkgZW5vdWdoIHRoYXQgcXVvdGVkIG9wZXJhdG9ycywgZXNjYXBlZFxuICogb3BlcmF0b3JzLCBjb21tZW50cywgYW5kIHN1YnNoZWxsIGdyb3VwcyBuZWl0aGVyIGZhYnJpY2F0ZSBub3IgaGlkZSBhIGB3YiBkZXBsb3lgIGludm9jYXRpb24uXG4gKi9cbmZ1bmN0aW9uIHRva2VuaXplU2hlbGxDb21tYW5kKHNjcmlwdDogc3RyaW5nKTogeyBzZWdtZW50czogc3RyaW5nW11bXTsgc2F3SGVyZWRvYzogYm9vbGVhbiB9IHtcbiAgY29uc3Qgc2VnbWVudHM6IHN0cmluZ1tdW10gPSBbXTtcbiAgbGV0IHRva2Vuczogc3RyaW5nW10gPSBbXTtcbiAgbGV0IGN1cnJlbnQgPSAnJztcbiAgbGV0IGluVG9rZW4gPSBmYWxzZTtcbiAgbGV0IHF1b3RlOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gIC8vIFdoZXRoZXIgdGhlIHNjcmlwdCB1c2VzIGFueSBoZXJlZG9jLiBGYWl0aGZ1bGx5IGNsYXNzaWZ5aW5nIHdoaWNoIGJvZHkgbGluZXMgYXJlIGRhdGEgKHRoZVxuICAvLyBkZWxpbWl0ZXIgd29yZCBjYW4gYmUgcXVvdGVkL2JhY2tzbGFzaC1lc2NhcGVkLCBgPDwtYCBzdHJpcHMgbGVhZGluZyB0YWJzLCB0ZXJtaW5hdG9ycyBtYXRjaFxuICAvLyBleGFjdGx5KSBpcyBtb3JlIHRoYW4gdGhpcyBwYXJzZXIgbW9kZWxzLCBzbyBhIGhlcmVkb2MgYW55d2hlcmUgbWFrZXMgZGV0ZWN0aW9uIHJldHVybiBmYWxzZS5cbiAgbGV0IHNhd0hlcmVkb2MgPSBmYWxzZTtcbiAgLy8gSGVyZWRvYyBkZWxpbWl0ZXJzIHdob3NlIGJvZGllcyBiZWdpbiBhdCB0aGUgTkVYVCBuZXdsaW5lOiBgY2F0IDw8QSA8PEJgIHF1ZXVlcyBBIHRoZW4gQiwgYW5kXG4gIC8vIHRoZSBjb21tYW5kcyBBRlRFUiB0aGUgYDw8YCBoZWFkZXIgb24gdGhlIHNhbWUgbGluZSBzdGlsbCBleGVjdXRlLCBzbyB0aGUgaGVhZGVyIGlzIHJlY29yZGVkXG4gIC8vIGhlcmUgYW5kIHRoZSBib2RpZXMgYXJlIHNraXBwZWQgb25seSB3aGVuIHRoZSBsaW5lJ3MgbmV3bGluZSBpcyByZWFjaGVkLlxuICBsZXQgcGVuZGluZ0hlcmVkb2NEZWxpbWl0ZXJzOiBzdHJpbmdbXSA9IFtdO1xuICBjb25zdCBza2lwSGVyZWRvY0JvZGllcyA9IChmcm9tSW5kZXg6IG51bWJlcik6IG51bWJlciA9PiB7XG4gICAgbGV0IGN1cnNvciA9IGZyb21JbmRleDtcbiAgICBmb3IgKGNvbnN0IGRlbGltaXRlciBvZiBwZW5kaW5nSGVyZWRvY0RlbGltaXRlcnMpIHtcbiAgICAgIHdoaWxlIChjdXJzb3IgPCBzY3JpcHQubGVuZ3RoKSB7XG4gICAgICAgIGNvbnN0IGxpbmVTdGFydCA9IGN1cnNvciArIDE7XG4gICAgICAgIGxldCBsaW5lRW5kID0gbGluZVN0YXJ0O1xuICAgICAgICB3aGlsZSAobGluZUVuZCA8IHNjcmlwdC5sZW5ndGggJiYgc2NyaXB0W2xpbmVFbmRdICE9PSAnXFxuJykgbGluZUVuZCsrO1xuICAgICAgICBjdXJzb3IgPSBsaW5lRW5kO1xuICAgICAgICBpZiAoc2NyaXB0LnNsaWNlKGxpbmVTdGFydCwgbGluZUVuZCkudHJpbSgpID09PSBkZWxpbWl0ZXIpIGJyZWFrO1xuICAgICAgICBpZiAobGluZUVuZCA+PSBzY3JpcHQubGVuZ3RoKSBicmVhaztcbiAgICAgIH1cbiAgICB9XG4gICAgcGVuZGluZ0hlcmVkb2NEZWxpbWl0ZXJzID0gW107XG4gICAgcmV0dXJuIGN1cnNvcjtcbiAgfTtcbiAgY29uc3QgZW5kVG9rZW4gPSAoKTogdm9pZCA9PiB7XG4gICAgaWYgKGluVG9rZW4pIHRva2Vucy5wdXNoKGN1cnJlbnQpO1xuICAgIGN1cnJlbnQgPSAnJztcbiAgICBpblRva2VuID0gZmFsc2U7XG4gIH07XG4gIGNvbnN0IGVuZFNlZ21lbnQgPSAoKTogdm9pZCA9PiB7XG4gICAgZW5kVG9rZW4oKTtcbiAgICBzZWdtZW50cy5wdXNoKHRva2Vucyk7XG4gICAgdG9rZW5zID0gW107XG4gIH07XG4gIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCBzY3JpcHQubGVuZ3RoOyBpbmRleCsrKSB7XG4gICAgY29uc3QgY2hhcmFjdGVyID0gc2NyaXB0W2luZGV4XSA/PyAnJztcbiAgICBpZiAocXVvdGUpIHtcbiAgICAgIGlmIChjaGFyYWN0ZXIgPT09ICdcXFxcJyAmJiBxdW90ZSA9PT0gJ1wiJykge1xuICAgICAgICAvLyBJbnNpZGUgZG91YmxlIHF1b3RlcywgYmFja3NsYXNoLW5ld2xpbmUgaXMgc3RpbGwgYSBsaW5lIGNvbnRpbnVhdGlvbiAoYm90aCByZW1vdmVkKTtcbiAgICAgICAgLy8gYW55IG90aGVyIGVzY2FwZWQgY2hhcmFjdGVyIGNvbnRyaWJ1dGVzIGxpdGVyYWxseS5cbiAgICAgICAgaWYgKHNjcmlwdFtpbmRleCArIDFdID09PSAnXFxuJykgaW5kZXgrKztcbiAgICAgICAgZWxzZSBjdXJyZW50ICs9IHNjcmlwdFsrK2luZGV4XSA/PyAnJztcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBpZiAoY2hhcmFjdGVyID09PSBxdW90ZSkgcXVvdGUgPSB1bmRlZmluZWQ7XG4gICAgICBlbHNlIGN1cnJlbnQgKz0gY2hhcmFjdGVyO1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGlmIChjaGFyYWN0ZXIgPT09ICdcXFxcJykge1xuICAgICAgLy8gQmFja3NsYXNoLW5ld2xpbmUgaXMgYSBsaW5lIGNvbnRpbnVhdGlvbjogdGhlIHNoZWxsIHJlbW92ZXMgYm90aCwgam9pbmluZyB0aGUgbGluZXNcbiAgICAgIC8vIHdpdGhvdXQgaW50cm9kdWNpbmcgYSB0b2tlbiBib3VuZGFyeS4gQW55IG90aGVyIGVzY2FwZWQgY2hhcmFjdGVyIGlzIGEgbGl0ZXJhbC5cbiAgICAgIGlmIChzY3JpcHRbaW5kZXggKyAxXSA9PT0gJ1xcbicpIHtcbiAgICAgICAgaW5kZXgrKztcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBjdXJyZW50ICs9IHNjcmlwdFsrK2luZGV4XSA/PyAnJztcbiAgICAgIGluVG9rZW4gPSB0cnVlO1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGlmIChjaGFyYWN0ZXIgPT09IFwiJ1wiIHx8IGNoYXJhY3RlciA9PT0gJ1wiJykge1xuICAgICAgcXVvdGUgPSBjaGFyYWN0ZXI7XG4gICAgICBpblRva2VuID0gdHJ1ZTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICAvLyBBIGA8PGAvYDw8LWAgaGVyZWRvYyByZWRpcmVjdGlvbjogaXRzIGJvZHkgbGluZXMgKHVwIHRvIHRoZSBkZWxpbWl0ZXIgbGluZSkgYXJlIERBVEEsIG5vdFxuICAgIC8vIGNvbW1hbmRzLCBzbyBgY2F0IDw8J0VPRidcXG53YiBkZXBsb3lcXG5FT0ZgIG11c3Qgbm90IHJlYWQgYHdiIGRlcGxveWAgYXMgYW4gaW52b2NhdGlvbi4gU2luY2VcbiAgICAvLyB0aGUgY2FsbGVyIGRlY2xpbmVzIG9uIEFOWSBoZXJlZG9jLCBmbGFnIGl0IHRoZSBpbnN0YW50IGA8PGAgYXBwZWFycyDigJQgYmVmb3JlIHBhcnNpbmcgdGhlXG4gICAgLy8gZGVsaW1pdGVyIHdvcmQg4oCUIHNvIGFuIGV4b3RpYyBkZWxpbWl0ZXIgKGA8PCtgKSB0aGUgd29yZCBzY2FubmVyIGNhbm5vdCByZWFkIHN0aWxsIGRlY2xpbmVzLlxuICAgIGlmIChjaGFyYWN0ZXIgPT09ICc8JyAmJiBzY3JpcHRbaW5kZXggKyAxXSA9PT0gJzwnKSB7XG4gICAgICBzYXdIZXJlZG9jID0gdHJ1ZTtcbiAgICAgIGxldCBjdXJzb3IgPSBpbmRleCArIDI7XG4gICAgICBpZiAoc2NyaXB0W2N1cnNvcl0gPT09ICctJykgY3Vyc29yKys7XG4gICAgICB3aGlsZSAoL1sgXFx0XS91LnRlc3Qoc2NyaXB0W2N1cnNvcl0gPz8gJycpKSBjdXJzb3IrKztcbiAgICAgIGxldCBkZWxpbWl0ZXIgPSAnJztcbiAgICAgIC8vIFRoZSBkZWxpbWl0ZXIgd29yZCBtYXkgYmUgcXVvdGVkIChgPDwnRU9GJ2ApIG9yIGJhY2tzbGFzaC1lc2NhcGVkIChgPDxcXEVPRmApOyBlaXRoZXIgZm9ybVxuICAgICAgLy8ganVzdCBkaXNhYmxlcyBib2R5IGV4cGFuc2lvbiwgc28gY29sbGVjdCB0aGUgYmFyZSB3b3JkLiBNaXNzaW5nIHRoZSBlc2NhcGVkIGZvcm0gd291bGQgZHJvcFxuICAgICAgLy8gYHNhd0hlcmVkb2NgIGFuZCByZWFkIHRoZSBoZXJlZG9jIGJvZHkgYXMgY29tbWFuZHMuXG4gICAgICBsZXQgZGVsaW1pdGVyUXVvdGU6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgICAgIHdoaWxlIChjdXJzb3IgPCBzY3JpcHQubGVuZ3RoKSB7XG4gICAgICAgIGNvbnN0IGRlbGltaXRlckNoYXIgPSBzY3JpcHRbY3Vyc29yXSA/PyAnJztcbiAgICAgICAgaWYgKGRlbGltaXRlclF1b3RlKSB7XG4gICAgICAgICAgaWYgKGRlbGltaXRlckNoYXIgPT09IGRlbGltaXRlclF1b3RlKSBkZWxpbWl0ZXJRdW90ZSA9IHVuZGVmaW5lZDtcbiAgICAgICAgICBlbHNlIGRlbGltaXRlciArPSBkZWxpbWl0ZXJDaGFyO1xuICAgICAgICB9IGVsc2UgaWYgKGRlbGltaXRlckNoYXIgPT09ICdcXFxcJykge1xuICAgICAgICAgIC8vIEEgYmFja3NsYXNoIHF1b3RlcyB0aGUgbmV4dCBjaGFyYWN0ZXIgaW50byB0aGUgZGVsaW1pdGVyIHdvcmQgKGA8PFxcRU9GYCDihpIgYEVPRmApLlxuICAgICAgICAgIGN1cnNvcisrO1xuICAgICAgICAgIGRlbGltaXRlciArPSBzY3JpcHRbY3Vyc29yXSA/PyAnJztcbiAgICAgICAgfSBlbHNlIGlmIChkZWxpbWl0ZXJDaGFyID09PSBcIidcIiB8fCBkZWxpbWl0ZXJDaGFyID09PSAnXCInKSB7XG4gICAgICAgICAgZGVsaW1pdGVyUXVvdGUgPSBkZWxpbWl0ZXJDaGFyO1xuICAgICAgICB9IGVsc2UgaWYgKC9bXFx3Li1dL3UudGVzdChkZWxpbWl0ZXJDaGFyKSkge1xuICAgICAgICAgIGRlbGltaXRlciArPSBkZWxpbWl0ZXJDaGFyO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGN1cnNvcisrO1xuICAgICAgfVxuICAgICAgaWYgKGRlbGltaXRlcikge1xuICAgICAgICAvLyBUaGUgYDw8ZGVsaW1gIGhlYWRlciBpcyBhIHJlZGlyZWN0aW9uIChub3QgYSB0b2tlbik7IHJlY29yZCB0aGUgZGVsaW1pdGVyIGFuZCBrZWVwXG4gICAgICAgIC8vIHBhcnNpbmcgdGhlIHJlc3Qgb2YgdGhpcyBsaW5lIOKAlCBpdHMgYm9keSBpcyBza2lwcGVkIHdoZW4gdGhlIG5ld2xpbmUgaXMgcmVhY2hlZC5cbiAgICAgICAgZW5kVG9rZW4oKTtcbiAgICAgICAgcGVuZGluZ0hlcmVkb2NEZWxpbWl0ZXJzLnB1c2goZGVsaW1pdGVyKTtcbiAgICAgICAgaW5kZXggPSBjdXJzb3IgLSAxO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGNoYXJhY3RlciA9PT0gJyMnICYmICFpblRva2VuKSB7XG4gICAgICAvLyBDb21tZW50IHJ1bnMgdG8gZW5kIG9mIGxpbmU7IGVuZCB0aGUgY3VycmVudCBjb21tYW5kIHNlZ21lbnQgYW5kIGxldCB0aGUgbG9vcCByZXN1bWUgYXRcbiAgICAgIC8vIHRoZSBuZXdsaW5lIHNvIHRoZSBuZXh0IGxpbmUgaXMgcGFyc2VkIGFzIGl0cyBvd24gc2VnbWVudC5cbiAgICAgIGVuZFNlZ21lbnQoKTtcbiAgICAgIHdoaWxlIChpbmRleCArIDEgPCBzY3JpcHQubGVuZ3RoICYmIHNjcmlwdFtpbmRleCArIDFdICE9PSAnXFxuJykgaW5kZXgrKztcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBpZiAoY2hhcmFjdGVyID09PSAnJicgfHwgY2hhcmFjdGVyID09PSAnfCcgfHwgY2hhcmFjdGVyID09PSAnOycgfHwgY2hhcmFjdGVyID09PSAnXFxuJykge1xuICAgICAgZW5kU2VnbWVudCgpO1xuICAgICAgaWYgKChjaGFyYWN0ZXIgPT09ICcmJyB8fCBjaGFyYWN0ZXIgPT09ICd8JykgJiYgc2NyaXB0W2luZGV4ICsgMV0gPT09IGNoYXJhY3RlcikgaW5kZXgrKztcbiAgICAgIC8vIEEgbmV3bGluZSB0aGF0IGNsb3NlcyBhIGhlcmVkb2MgaGVhZGVyIGxpbmUgY29uc3VtZXMgdGhlIHF1ZXVlZCBib2RpZXMgYmVmb3JlIHRoZSBuZXh0XG4gICAgICAvLyBjb21tYW5kLlxuICAgICAgaWYgKGNoYXJhY3RlciA9PT0gJ1xcbicgJiYgcGVuZGluZ0hlcmVkb2NEZWxpbWl0ZXJzLmxlbmd0aCA+IDApIGluZGV4ID0gc2tpcEhlcmVkb2NCb2RpZXMoaW5kZXgpO1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGlmIChjaGFyYWN0ZXIgPT09ICcoJyB8fCBjaGFyYWN0ZXIgPT09ICcpJykge1xuICAgICAgZW5kVG9rZW4oKTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBpZiAoL1xccy91LnRlc3QoY2hhcmFjdGVyKSkge1xuICAgICAgZW5kVG9rZW4oKTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBjdXJyZW50ICs9IGNoYXJhY3RlcjtcbiAgICBpblRva2VuID0gdHJ1ZTtcbiAgfVxuICBlbmRTZWdtZW50KCk7XG4gIHJldHVybiB7IHNlZ21lbnRzLCBzYXdIZXJlZG9jIH07XG59XG5cbi8qKlxuICogV2hldGhlciBhIGRlcGxveSBzY3JpcHQgaW52b2tlcyBgd2Ig4oCmIGRlcGxveWAgYXQgY29tbWFuZCBwb3NpdGlvbi4gRW52IGFzc2lnbm1lbnRzLCBwYWNrYWdlXG4gKiBydW5uZXJzLCBhbmQgZ2xvYmFsIHlhcmdzIG9wdGlvbnMgKHdpdGggdGhlaXIgdmFsdWUgdG9rZW5zKSBtYXkgcHJlY2VkZSB0aGUgZGVwbG95IGNvbW1hbmQ7XG4gKiBzaGVsbCBxdW90aW5nLCBlc2NhcGluZywgY29tbWVudHMsIGFuZCBncm91cGluZyBhcmUgaG9ub3JlZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGludm9rZXNXYkRlcGxveShkZXBsb3lTY3JpcHQ6IHN0cmluZywgc2NyaXB0TmFtZXM6IFJlYWRvbmx5U2V0PHN0cmluZz4pOiBib29sZWFuIHtcbiAgY29uc3QgeyBzZWdtZW50cywgc2F3SGVyZWRvYyB9ID0gdG9rZW5pemVTaGVsbENvbW1hbmQoZGVwbG95U2NyaXB0KTtcbiAgLy8gQSBoZXJlZG9jIG1ha2VzIGJvZHktdnMtY29tbWFuZCBjbGFzc2lmaWNhdGlvbiB1bnJlbGlhYmxlIChzZWUgdG9rZW5pemVTaGVsbENvbW1hbmQpLlxuICBpZiAoc2F3SGVyZWRvYykgcmV0dXJuIGZhbHNlO1xuICBmb3IgKGNvbnN0IHRva2VucyBvZiBzZWdtZW50cykge1xuICAgIGxldCBpbmRleCA9IDA7XG4gICAgd2hpbGUgKGluZGV4IDwgdG9rZW5zLmxlbmd0aCAmJiAvXltBLVphLXpfXVtBLVphLXowLTlfXSo9L3UudGVzdCh0b2tlbnNbaW5kZXhdID8/ICcnKSkgaW5kZXgrKztcbiAgICAvLyBMZWFkaW5nIGxhdW5jaGVycyBydW4gdGhlIGZvbGxvd2luZyBjb21tYW5kOiBgZW52YCAod2l0aCBvcHRpb25zICsgS0VZPXZhbHVlIGFzc2lnbm1lbnRzKVxuICAgIC8vIGFuZCB0aGUgUE9TSVggYGNvbW1hbmRgIGJ1aWx0aW4gKHdpdGggaXRzIGAtcGAvYC12YC9gLVZgIG9wdGlvbnMpLiBDb21tYW5kLXBvc2l0aW9uIHNoZWxsXG4gICAgLy8gcmVzZXJ2ZWQgd29yZHMgYW5kIG90aGVyIGxhdW5jaGVycyAoYGlmYC9gdGhlbmAvYGZvcmAvYHRpbWVgL2BleGVjYC9gIWAvYnJhY2UgZ3JvdXBzLCDigKYpIGFyZVxuICAgIC8vIE5PVCBtb2RlbGVkOiB0aGV5IGxlYXZlIGEgbm9uLWB3YmAgZmlyc3QgdG9rZW4sIHNvIHRoZSBzZWdtZW50IHNpbXBseSBkb2VzIG5vdCBtYXRjaC4gVGhpcyBpc1xuICAgIC8vIGEgZGVsaWJlcmF0ZSBmYWxzZS1uZWdhdGl2ZSBmb3IgZ2VuZXJhdGVkIGd1aWRhbmNlLlxuICAgIGlmICh0b2tlbnNbaW5kZXhdID09PSAnZW52Jykge1xuICAgICAgaW5kZXgrKztcbiAgICAgIHdoaWxlIChpbmRleCA8IHRva2Vucy5sZW5ndGgpIHtcbiAgICAgICAgY29uc3QgdG9rZW4gPSB0b2tlbnNbaW5kZXhdID8/ICcnO1xuICAgICAgICBpZiAoL15bQS1aYS16X11bQS1aYS16MC05X10qPS91LnRlc3QodG9rZW4pKSBpbmRleCsrO1xuICAgICAgICAvLyBlbnYncyBkaXJlY3RvcnkgdmFsdWUgbWF5IGJlIHNlcGFyYXRlIG9yIGF0dGFjaGVkIChgLUNkaXJgLCBgLS1jaGRpcj1kaXJgKS4gSXQgY2hhbmdlc1xuICAgICAgICAvLyB3aGVyZSB3YiBydW5zIGJ1dCBub3Qgd2hldGhlciB0aGUgY29tbWFuZCBpbnZva2VzIHdiIGRlcGxveS5cbiAgICAgICAgZWxzZSBpZiAodG9rZW4gPT09ICctQycgfHwgdG9rZW4gPT09ICctLWNoZGlyJykgaW5kZXggKz0gMjtcbiAgICAgICAgZWxzZSBpZiAodG9rZW4uc3RhcnRzV2l0aCgnLUMnKSB8fCB0b2tlbi5zdGFydHNXaXRoKCctLWNoZGlyPScpKSBpbmRleCsrO1xuICAgICAgICBlbHNlIGlmICh0b2tlbiA9PT0gJy11JykgaW5kZXggKz0gMjtcbiAgICAgICAgZWxzZSBpZiAodG9rZW4uc3RhcnRzV2l0aCgnLScpKSBpbmRleCsrO1xuICAgICAgICBlbHNlIGJyZWFrO1xuICAgICAgfVxuICAgIH1cbiAgICAvLyBgY29tbWFuZCBDTURgIGV4ZWN1dGVzIENNRCwgYnV0IGBjb21tYW5kIC12YC9gLVYgQ01EYCBvbmx5IFFVRVJZIGl0cyBhdmFpbGFiaWxpdHkgd2l0aG91dFxuICAgIC8vIHJ1bm5pbmcgaXQsIHNvIGEgZGVwbG95IGJlaGluZCB0aGVtIGRvZXMgbm90IHJ1bi4gVGhlIGB2YC9gVmAgZmxhZyBtYXkgYmUgY2x1c3RlcmVkIHdpdGhcbiAgICAvLyBvdGhlciBvcHRpb24gbGV0dGVycyAoYGNvbW1hbmQgLXB2IHdiYCksIHNvIG1hdGNoIGFueSBvcHRpb24gbGV0dGVyIGNsdXN0ZXIgY29udGFpbmluZyBpdC5cbiAgICB3aGlsZSAodG9rZW5zW2luZGV4XSA9PT0gJ2NvbW1hbmQnKSB7XG4gICAgICBpbmRleCsrO1xuICAgICAgbGV0IHF1ZXJpZXNPbmx5ID0gZmFsc2U7XG4gICAgICB3aGlsZSAoaW5kZXggPCB0b2tlbnMubGVuZ3RoICYmICh0b2tlbnNbaW5kZXhdID8/ICcnKS5zdGFydHNXaXRoKCctJykpIHtcbiAgICAgICAgaWYgKC9eLVtBLVphLXpdKlt2Vl1bQS1aYS16XSokL3UudGVzdCh0b2tlbnNbaW5kZXhdID8/ICcnKSkgcXVlcmllc09ubHkgPSB0cnVlO1xuICAgICAgICBpbmRleCsrO1xuICAgICAgfVxuICAgICAgaWYgKHF1ZXJpZXNPbmx5KSB7XG4gICAgICAgIGluZGV4ID0gLTE7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoaW5kZXggPCAwKSBjb250aW51ZTtcbiAgICAvLyBSZXNvbHZlIGEgcnVubmVyIHByZWZpeCB0byB3aGV0aGVyIHRoZSBmb2xsb3dpbmcgdG9rZW4gaXMgYSBCSU5BUlkgKHRoZSB3YiBleGVjdXRhYmxlKSBvciBhXG4gICAgLy8gcGFja2FnZSBTQ1JJUFQgbmFtZS4gYGJ1bnhgL2BucHhgIGFuZCBgPHBtPiB4fGRseHxleGVjYCBydW4gYSBiaW5hcnk7IGA8cG0+IHJ1bnxydW4tc2NyaXB0YFxuICAgIC8vIChhbmQgYmFyZSBgbnBtIDxuYW1lPmAsIG9yIGFueSBydW5uZXIgZm9sbG93ZWQgYnkgYC0tYCkgcnVuIGEgcGFja2FnZSBzY3JpcHQg4oCUIHNvXG4gICAgLy8gYG5wbSBydW4gd2IgZGVwbG95YCBleGVjdXRlcyB0aGUgc2NyaXB0IG5hbWVkIGB3YmAsIG5vdCB0aGUgd2IgYmluYXJ5LCBhbmQgbXVzdCBiZSByZWplY3RlZC5cbiAgICBpZiAoWyducG0nLCAncG5wbScsICd5YXJuJywgJ2J1biddLmluY2x1ZGVzKHRva2Vuc1tpbmRleF0gPz8gJycpKSB7XG4gICAgICBjb25zdCBydW5uZXIgPSB0b2tlbnNbaW5kZXhdID8/ICcnO1xuICAgICAgaW5kZXggPSBza2lwUnVubmVyT3B0aW9ucyh0b2tlbnMsIGluZGV4ICsgMSk7XG4gICAgICBjb25zdCBzdWJjb21tYW5kID0gdG9rZW5zW2luZGV4XSA/PyAnJztcbiAgICAgIGlmIChbJ3J1bicsICdydW4tc2NyaXB0J10uaW5jbHVkZXMoc3ViY29tbWFuZCkpIGNvbnRpbnVlOyAvLyBydW5zIGEgcGFja2FnZSBzY3JpcHQsIG5vdCB3YlxuICAgICAgLy8gRXhlY3V0b3Igc3ViY29tbWFuZHMgYXJlIHJ1bm5lci1TUEVDSUZJQzogYnVuIHJlc2VydmVzIG9ubHkgYHhgIChgYnVuIGRseGAvYGJ1biBleGVjYCBydW4gYVxuICAgICAgLy8gcGFja2FnZSBzY3JpcHQgbmFtZWQgZGx4L2V4ZWMpLiBSZWFsIGJ1aWx0LWluIGV4ZWN1dG9ycyAoYGV4ZWNgL2B4YCwgYW5kIGBkbHhgIGZvciBwbnBtKVxuICAgICAgLy8gdGFrZSBwcmVjZWRlbmNlIG92ZXIgYSBzYW1lLW5hbWVkIHNjcmlwdCwgc28gdGhleSBhcmUgTk9UIHNoYWRvdy1jaGVja2VkLiBPbmx5IGB5YXJuIGRseGAgaXNcbiAgICAgIC8vIGFtYmlndW91cyDigJQgYSBCZXJyeSBidWlsdC1pbiBidXQgYSBwYWNrYWdlIFNDUklQVCBpbiBZYXJuIENsYXNzaWMg4oCUIHNvIGEgZGVjbGFyZWQgYGRseGBcbiAgICAgIC8vIHNjcmlwdCBtYWtlcyBgeWFybiBkbHhgIGRlY2xpbmUgKGZhbGwgdGhyb3VnaCB0byB0aGUgcGFja2FnZS1zY3JpcHQgY2hlY2tzKS5cbiAgICAgIGNvbnN0IGlzWWFybkRseFNoYWRvd2VkQnlTY3JpcHQgPSBydW5uZXIgPT09ICd5YXJuJyAmJiBzdWJjb21tYW5kID09PSAnZGx4JyAmJiBzY3JpcHROYW1lcy5oYXMoJ2RseCcpO1xuICAgICAgaWYgKHJ1bm5lckV4ZWN1dG9yU3ViY29tbWFuZHNCeVJ1bm5lcltydW5uZXJdPy5oYXMoc3ViY29tbWFuZCkgJiYgIWlzWWFybkRseFNoYWRvd2VkQnlTY3JpcHQpIHtcbiAgICAgICAgaW5kZXgrKzsgLy8gYmluYXJ5IHJ1bm5lciAocG5wbSBkbHgsIGJ1biB4LCBgbnBtIGV4ZWMgLS0gd2Ig4oCmYClcbiAgICAgICAgaWYgKHRva2Vuc1tpbmRleF0gPT09ICctLScpIGluZGV4Kys7IC8vIHRoZSBleGVjdXRvcidzIG9wdGlvbmFsIGAtLWAgYmVmb3JlIHRoZSBjb21tYW5kXG4gICAgICB9IGVsc2UgaWYgKHJ1bm5lciA9PT0gJ25wbScpIHtcbiAgICAgICAgY29udGludWU7IC8vIGJhcmUgYG5wbSB3YmAgbmV2ZXIgcnVucyBhIGJpbmFyeVxuICAgICAgfSBlbHNlIGlmICh0b2tlbnNbaW5kZXhdID09PSAnd2InICYmIHNjcmlwdE5hbWVzLmhhcygnd2InKSkge1xuICAgICAgICAvLyBCYXJlIGBidW4vcG5wbS95YXJuIHdiYCBydW5zIGEgcGFja2FnZSBTQ1JJUFQgbmFtZWQgYHdiYCB3aGVuIG9uZSBleGlzdHMgKHBhc3NpbmcgYGRlcGxveWBcbiAgICAgICAgLy8gYXMgaXRzIGFyZ3VtZW50KSwgbm90IHRoZSB3YiBiaW5hcnkuXG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoWydidW54JywgJ25weCddLmluY2x1ZGVzKHRva2Vuc1tpbmRleF0gPz8gJycpKSB7XG4gICAgICBpbmRleCA9IHNraXBSdW5uZXJPcHRpb25zKHRva2VucywgaW5kZXggKyAxKTtcbiAgICB9XG4gICAgaWYgKHRva2Vuc1tpbmRleF0gIT09ICd3YicpIGNvbnRpbnVlO1xuICAgIGNvbnN0IHdiQXJncyA9IHRva2Vucy5zbGljZShpbmRleCArIDEpO1xuICAgIC8vIFNraXAgZ2xvYmFsIG9wdGlvbnMgKGFuZCBhbnkgdmFsdWUgdG9rZW4gYSB2YWx1ZS1iZWFyaW5nIG9wdGlvbiBjb25zdW1lcykgc28gdGhlIEZJUlNUXG4gICAgLy8gY29tbWFuZCB0b2tlbiBkZWNpZGVzOiBgd2IgLS1jYXNjYWRlLWVudiBwcm9kdWN0aW9uIGRlcGxveWAgYW5kIGB3YiAtdyBwYWNrYWdlcy9hcGkgZGVwbG95YFxuICAgIC8vIG1hdGNoLCB3aGlsZSBzdWJjb21tYW5kcyBvd25pbmcgdGhlaXIgb3duIGBkZXBsb3lgIChgd2IgcHJpc21hIGRlcGxveWAsIGB3YiByZXRyeSBkZXBsb3lgKVxuICAgIC8vIGRvIG5vdC4gYC0tb3B0PXZhbHVlYCBjYXJyaWVzIGl0cyB2YWx1ZSBpbmxpbmUsIHNvIG9ubHkgdGhlIHNwYWNlLXNlcGFyYXRlZCBmb3JtIHNraXBzIG9uZS5cbiAgICBsZXQgY29tbWFuZEluZGV4ID0gMDtcbiAgICB3aGlsZSAoY29tbWFuZEluZGV4IDwgd2JBcmdzLmxlbmd0aCAmJiAod2JBcmdzW2NvbW1hbmRJbmRleF0gPz8gJycpLnN0YXJ0c1dpdGgoJy0nKSkge1xuICAgICAgY29uc3QgZmxhZyA9IHdiQXJnc1tjb21tYW5kSW5kZXhdID8/ICcnO1xuICAgICAgY29tbWFuZEluZGV4Kys7XG4gICAgICBpZiAod2JHbG9iYWxWYWx1ZU9wdGlvbnMuaGFzKGZsYWcpICYmIGNvbW1hbmRJbmRleCA8IHdiQXJncy5sZW5ndGgpIGNvbW1hbmRJbmRleCsrO1xuICAgIH1cbiAgICBpZiAod2JBcmdzW2NvbW1hbmRJbmRleF0gIT09ICdkZXBsb3knKSBjb250aW51ZTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICByZXR1cm4gZmFsc2U7XG59XG5cbi8qKlxuICogV2hldGhlciB0aGUgd29ya2Zsb3dzIGRpcmVjdG9yeSBob2xkcyBhIGxpdmUgY2FsbGVyIG9mIHRoZSByZXVzYWJsZSBDbG91ZGZsYXJlIGRlcGxveSB3b3JrZmxvdy5cbiAqIFlBTUwgaXMgcGFyc2VkIGFuZCBvbmx5IGBqb2JzLioudXNlc2AgdmFsdWVzIGFyZSBpbnNwZWN0ZWQgKGEgcmF3LXRleHQgc2VhcmNoIHdvdWxkIG1hdGNoXG4gKiBjb21tZW50cyBvciBgcnVuOmAgc3RyaW5ncyksIHdpdGggYSBgZGVwbG95KmAtZmlsZW5hbWUgc2hvcnRjdXQgYW5kIGEgY29uc2VydmF0aXZlIHJhdy10ZXh0XG4gKiBmYWxsYmFjayBmb3IgdW5wYXJzZWFibGUgZmlsZXMuIFVzZWQgYnkgdGhlIGFnZW50LWluc3RydWN0aW9uIGdlbmVyYXRvciBzbyBnZW5lcmF0ZWQgZ3VpZGFuY2VcbiAqIGRlc2NyaWJlcyBvbmx5IHdvcmtmbG93cyB0aGF0IGV4aXN0LlxuICovXG5leHBvcnQgZnVuY3Rpb24gaGFzQ2xvdWRmbGFyZURlcGxveVdvcmtmbG93KHdvcmtmbG93c0RpclBhdGg6IHN0cmluZyk6IGJvb2xlYW4ge1xuICBsZXQgZW50cmllczogZnMuRGlyZW50W107XG4gIHRyeSB7XG4gICAgZW50cmllcyA9IGZzLnJlYWRkaXJTeW5jKHdvcmtmbG93c0RpclBhdGgsIHsgd2l0aEZpbGVUeXBlczogdHJ1ZSB9KTtcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIC8vIENhc2UtaW5zZW5zaXRpdmUgb3duZXIvcmVwb3NpdG9yeSAoR2l0SHViIHRyZWF0cyB0aGVtIHNvKSwgY2FzZS1zZW5zaXRpdmUgcGF0aC9yZWYg4oCUIG1hdGNoaW5nXG4gIC8vIHBhcnNlT3JnUmV1c2FibGVXb3JrZmxvd0NhbGwsIHVzZWQgZm9yIHRoZSB1bnBhcnNlYWJsZS1ZQU1MIHJhdy10ZXh0IGZhbGxiYWNrIG9ubHkuXG4gIGNvbnN0IGRlcGxveUNhbGxQYXR0ZXJuID0gL1teL10rXFwvcmV1c2FibGUtd29ya2Zsb3dzXFwvXFwuZ2l0aHViXFwvd29ya2Zsb3dzXFwvZGVwbG95XFwueWE/bWxAL2l1O1xuICBjb25zdCBjYWxsc0RlcGxveVdvcmtmbG93ID0gKHVzZXM6IHN0cmluZyB8IHVuZGVmaW5lZCk6IGJvb2xlYW4gPT5cbiAgICBwYXJzZU9yZ1JldXNhYmxlV29ya2Zsb3dDYWxsKHVzZXMpPy53b3JrZmxvd05hbWUgPT09ICdkZXBsb3knO1xuICByZXR1cm4gZW50cmllcy5zb21lKChlbnRyeSkgPT4ge1xuICAgIGlmICghZW50cnkuaXNGaWxlKCkgfHwgIS9cXC55YT9tbCQvdS50ZXN0KGVudHJ5Lm5hbWUpKSByZXR1cm4gZmFsc2U7XG4gICAgaWYgKGVudHJ5Lm5hbWUuc3RhcnRzV2l0aCgnZGVwbG95JykpIHJldHVybiB0cnVlO1xuICAgIGxldCBjb250ZW50OiBzdHJpbmc7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnRlbnQgPSBmcy5yZWFkRmlsZVN5bmMocGF0aC5qb2luKHdvcmtmbG93c0RpclBhdGgsIGVudHJ5Lm5hbWUpLCAndXRmOCcpO1xuICAgIH0gY2F0Y2gge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICB0cnkge1xuICAgICAgY29uc3Qgd29ya2Zsb3cgPSB5YW1sLmxvYWQoY29udGVudCkgYXMgV29ya2Zsb3cgfCB1bmRlZmluZWQ7XG4gICAgICBpZiAod29ya2Zsb3cgJiYgdHlwZW9mIHdvcmtmbG93ID09PSAnb2JqZWN0JyAmJiB3b3JrZmxvdy5qb2JzICYmIHR5cGVvZiB3b3JrZmxvdy5qb2JzID09PSAnb2JqZWN0Jykge1xuICAgICAgICByZXR1cm4gT2JqZWN0LnZhbHVlcyh3b3JrZmxvdy5qb2JzKS5zb21lKChqb2IpID0+IGNhbGxzRGVwbG95V29ya2Zsb3coam9iPy51c2VzKSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfSBjYXRjaCB7XG4gICAgICByZXR1cm4gZGVwbG95Q2FsbFBhdHRlcm4udGVzdChjb250ZW50KTtcbiAgICB9XG4gIH0pO1xufVxuXG4vLyBUaGUgcmV1c2FibGUgd29ya2Zsb3dzIHRoYXQgZGVjbGFyZSBGTk9YX0FHRV9LRVkgYW5kIFZFUkRBQ0NJT19UT0tFTiB1bmRlclxuLy8gb24ud29ya2Zsb3dfY2FsbC5zZWNyZXRzIChzZWUgV2lsbEJvb3N0ZXIvcmV1c2FibGUtd29ya2Zsb3dzKS4gUGFzc2luZyBlaXRoZXIgc2VjcmV0IHRvIGFueVxuLy8gb3RoZXIgY2FsbGVlIGlzIGEgR2l0SHViIGVycm9yLlxuY29uc3QgaW5zdGFsbENhcGFibGVSZXVzYWJsZVdvcmtmbG93cyA9IG5ldyBTZXQoWydkZXBsb3knLCAncmVsZWFzZScsICdydW4tc2NyaXB0JywgJ3Rlc3QnXSk7XG5jb25zdCByZXVzYWJsZVdvcmtmbG93UGVybWlzc2lvbnM6IFJlY29yZDxzdHJpbmcsIFJlY29yZDxzdHJpbmcsIHN0cmluZz4+ID0ge1xuICAvLyBza2lwLWR1cGxpY2F0ZS1hY3Rpb25zIHJlYWRzIHdvcmtmbG93IHJ1bnM7IGNhbmNlbF9vdGhlcnMgaXMgZmFsc2UsIHNvIHJlYWQgaXMgZW5vdWdoLlxuICAndGVzdC1ydXN0JzogeyBhY3Rpb25zOiAncmVhZCcsIGNvbnRlbnRzOiAncmVhZCcgfSxcbiAgJ3NlbWFudGljLXByJzogeyAncHVsbC1yZXF1ZXN0cyc6ICdyZWFkJywgc3RhdHVzZXM6ICd3cml0ZScgfSxcbiAgJ2Nsb3NlLWNvbW1lbnQnOiB7ICdwdWxsLXJlcXVlc3RzJzogJ3dyaXRlJyB9LFxufTtcblxuZnVuY3Rpb24gbm9ybWFsaXplSm9iKGNvbmZpZzogUGFja2FnZUNvbmZpZywgam9iOiBKb2IsIGtpbmQ6IEtub3duS2luZCk6IHZvaWQge1xuICBqb2Iud2l0aCA/Pz0ge307XG4gIC8vIGBzZWNyZXRzOiBpbmhlcml0YCAocGFyc2VkIGJ5IGpzLXlhbWwgYXMgYSBwbGFpbiBzdHJpbmcpIGFscmVhZHkgZm9yd2FyZHMgZXZlcnkgY2FsbGVyIHNlY3JldFxuICAvLyBpbmNsdWRpbmcgdGhlIG9uZXMgaW5qZWN0ZWQgYmVsb3csIHNvIHByZXNlcnZlIGl0IHVudG91Y2hlZCDigJQgcHJvcGVydHkgYXNzaWdubWVudHMgb24gdGhlXG4gIC8vIHN0cmluZyB3b3VsZCB0aHJvdy4gQ2F2ZWF0OiBgaW5oZXJpdGAgZm9yd2FyZHMgc2VjcmV0cyB1bmRlciB0aGVpciBleGlzdGluZyBOQU1FUywgc28gaXQgY2FuXG4gIC8vIG5ldmVyIGZlZWQgUFVCTElDX0ZOT1hfQUdFX0tFWSBpbnRvIHRoZSBjYWxsZWUncyBkZWNsYXJlZCBGTk9YX0FHRV9LRVk7IGEgaGFuZC13cml0dGVuXG4gIC8vIGluaGVyaXQgY2FsbGVyIGluIGEgUFVCTElDIGZub3ggcmVwb3NpdG9yeSBtdXN0IGJlIGNvbnZlcnRlZCB0byBhbiBleHBsaWNpdCBtYXBwaW5nIG1hbnVhbGx5XG4gIC8vICh3YmZ5IG5ldmVyIGdlbmVyYXRlcyB0aGUgaW5oZXJpdCBmb3JtLCBhbmQgaGFuZC13cml0dGVuIGRldmlhdGlvbnMgYXJlIGZpeGVkIGluIHRoZSB0YXJnZXRcbiAgLy8gcmVwb3NpdG9yeSBieSBwb2xpY3kpLlxuICBjb25zdCBzZWNyZXRzID0gam9iLnNlY3JldHMgPT09ICdpbmhlcml0JyA/IHVuZGVmaW5lZCA6IChqb2Iuc2VjcmV0cyA9IGpvYi5zZWNyZXRzID8/IHt9KTtcblxuICBpZiAoc2VjcmV0cyAmJiAoa2luZCA9PT0gJ3Rlc3QnIHx8IGtpbmQgPT09ICdyZWxlYXNlJykpIHtcbiAgICBzZWNyZXRzLkdIX1RPS0VOID0gJyR7eyBzZWNyZXRzLkdJVEhVQl9UT0tFTiB9fSc7XG4gIH1cblxuICAvLyBmbm94LnRvbWwgY2FycmllcyBhZ2UtZW5jcnlwdGVkIGFwcCBzZWNyZXRzOyBDSSBkZWNyeXB0cyB0aGVtIHdpdGggdGhlIEZOT1hfQUdFX0tFWSAob3IsIGZvclxuICAvLyBwdWJsaWMgcmVwb3NpdG9yaWVzLCBQVUJMSUNfRk5PWF9BR0VfS0VZKSBvcmdhbml6YXRpb24gc2VjcmV0LlxuICAvLyBLZXkgdGhlIGluamVjdGlvbiBvbiB0aGUgKmNhbGxlZCogcmV1c2FibGUgd29ya2Zsb3csIG5vdCB0aGUgY2FsbGVyJ3MgZmlsZW5hbWU6IGNhbGxlcnMgbWF5IGhhdmVcbiAgLy8gYXJiaXRyYXJ5IG5hbWVzIChlLmcuIHNjaGVkdWxlZCBydW4tc2NyaXB0IGNhbGxlcnMpLCBhbmQgR2l0SHViIHJlamVjdHMgcGFzc2luZyBhIHNlY3JldCB0aGF0IHRoZVxuICAvLyBjYWxsZWUgZG9lcyBub3QgZGVjbGFyZS5cbiAgLy8gT25seSBhbiBAbWFpbiBjYWxsZWUgaXMga25vd24gdG8gZm9sbG93IHRoZSBjdXJyZW50IHNlY3JldCBjb250cmFjdDogYSB3b3JrZmxvdyBwaW5uZWQgdG8gYW5cbiAgLy8gb2xkZXIgdGFnIG9yIFNIQSBtYXkgc3RpbGwgZGVjbGFyZSBOUE1fVE9LRU4gKGFuZCBub3QgVkVSREFDQ0lPX1RPS0VOKSwgYW5kIEdpdEh1YiByZWplY3RzIGFcbiAgLy8gY2FsbGVyIHdob3NlIHNlY3JldHMgZG8gbm90IG1hdGNoIHRoZSBzZWxlY3RlZCByZXZpc2lvbidzIGRlY2xhcmF0aW9ucywgc28gcGlubmVkIGNhbGxlcnMga2VlcFxuICAvLyB0aGVpciBzZWNyZXRzIHVudG91Y2hlZC5cbiAgY29uc3Qgb3JnV29ya2Zsb3dDYWxsID0gcGFyc2VPcmdSZXVzYWJsZVdvcmtmbG93Q2FsbChqb2IudXNlcyk7XG4gIGNvbnN0IGNhbGxlZFJldXNhYmxlV29ya2Zsb3cgPSBvcmdXb3JrZmxvd0NhbGw/LnJlZiA9PT0gJ21haW4nID8gb3JnV29ya2Zsb3dDYWxsLndvcmtmbG93TmFtZSA6IHVuZGVmaW5lZDtcbiAgY29uc3QgcmVxdWlyZWRQZXJtaXNzaW9ucyA9IGNhbGxlZFJldXNhYmxlV29ya2Zsb3cgPyByZXVzYWJsZVdvcmtmbG93UGVybWlzc2lvbnNbY2FsbGVkUmV1c2FibGVXb3JrZmxvd10gOiB1bmRlZmluZWQ7XG4gIGlmIChyZXF1aXJlZFBlcm1pc3Npb25zKSBqb2IucGVybWlzc2lvbnMgPSB7IC4uLnJlcXVpcmVkUGVybWlzc2lvbnMgfTtcbiAgaWYgKHNlY3JldHMgJiYgY2FsbGVkUmV1c2FibGVXb3JrZmxvdyAmJiBpbnN0YWxsQ2FwYWJsZVJldXNhYmxlV29ya2Zsb3dzLmhhcyhjYWxsZWRSZXVzYWJsZVdvcmtmbG93KSkge1xuICAgIC8vIFRoZSBjYWxsZWUgcm91dGVzIHB1YmxpYyAoZGVmYXVsdC1yZWdpc3RyeSkgaW5zdGFsbHMgdGhyb3VnaCB0aGUgVGFrdW1pIEd1YXJkXG4gICAgLy8gbWFsaWNpb3VzLXBhY2thZ2UtYmxvY2tpbmcgcHJveHkgd2hlbiB0aGlzIHRva2VuIHJlc29sdmVzOyBhbiB1bnNldCBvcmdhbml6YXRpb24gc2VjcmV0XG4gICAgLy8gZXhwYW5kcyB0byAnJyBhbmQgdGhlIGNhbGxlZSB0cmVhdHMgdGhhdCBhcyBcImZlYXR1cmUgb2ZmXCIsIHNvIHBhc3NpbmcgaXQgaXMgYWx3YXlzIHNhZmUuXG4gICAgc2VjcmV0cy5UQUtVTUlfR1VBUkRfVE9LRU4gPSAnJHt7IHNlY3JldHMuVEFLVU1JX0dVQVJEX1RPS0VOIH19JztcbiAgICAvLyBUaGUgY2FsbGVlIGdlbmVyYXRlcyB0aGUgd29ya3NwYWNlIC5ucG1yYyBmb3IgQHdpbGxib29zdGVyLXByaXZhdGUvKiBmcm9tIFZFUkRBQ0NJT19UT0tFTlxuICAgIC8vIGJlZm9yZSBpbnN0YWxsaW5nIGRlcGVuZGVuY2llcy4gT25seSByZXBvc2l0b3JpZXMgdGhhdCBhY3R1YWxseSByZXNvbHZlIHByaXZhdGUgcGFja2FnZXNcbiAgICAvLyAob3IgcHVibGlzaCB0byBWZXJkYWNjaW8pIGdldCB0aGUgcGFzcy10aHJvdWdoOiBldmVyeXdoZXJlIGVsc2UgdGhlIGNyZWRlbnRpYWwgd291bGQgZmxvd1xuICAgIC8vIGludG8gQ0kgcnVucyB0aGF0IG5ldmVyIHVzZSBpdCwgc28gdGhlIGxpbmUgaXMgcmVtb3ZlZCBpbnN0ZWFkLiBUaGUgR2l0SHViIHNlY3JldCBpdHNlbGYgaXNcbiAgICAvLyBhbHdheXMgcmVnaXN0ZXJlZCBtYW51YWxseSBhbmQgc3RheXMgcmVnaXN0ZXJlZCBlaXRoZXIgd2F5LlxuICAgIGlmIChyZXBvUmVzb2x2ZXNQcml2YXRlUGFja2FnZXMoY29uZmlnKSkge1xuICAgICAgc2VjcmV0cy5WRVJEQUNDSU9fVE9LRU4gPSAnJHt7IHNlY3JldHMuVkVSREFDQ0lPX1RPS0VOIH19JztcbiAgICB9IGVsc2Uge1xuICAgICAgZGVsZXRlIHNlY3JldHMuVkVSREFDQ0lPX1RPS0VOO1xuICAgIH1cbiAgICBpZiAoZnMuZXhpc3RzU3luYyhwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICdmbm94LnRvbWwnKSkpIHtcbiAgICAgIC8vIFB1YmxpYyByZXBvc2l0b3JpZXMgY29tbWl0IHdvcmxkLXJlYWRhYmxlIGNpcGhlcnRleHRzLCBzbyB0aGV5IGRlY3J5cHQgd2l0aCBhIGRlZGljYXRlZFxuICAgICAgLy8gQ0kgaWRlbnRpdHkgKHRoZSBQVUJMSUNfRk5PWF9BR0VfS0VZIG9yZ2FuaXphdGlvbiBzZWNyZXQpIGluc3RlYWQgb2YgdGhlIG9yZy1pbnRlcm5hbFxuICAgICAgLy8gb25lOyB0aGUgY2FsbGVlIHN0aWxsIHJlY2VpdmVzIGl0IHVuZGVyIGl0cyBkZWNsYXJlZCBGTk9YX0FHRV9LRVkgbmFtZS4gV2hlbiBubyBDSVxuICAgICAgLy8gaWRlbnRpdHkgcmVzb2x2ZXMgKHNlZSBmbm94QWdlS2V5TWFwcGluZyksIGxlYXZlIGFueSBleGlzdGluZyBtYXBwaW5nIHVudG91Y2hlZCBhbmQgYWRkXG4gICAgICAvLyBub25lOiBjcmVhdGluZyBvciByZXdyaXRpbmcgb25lIG9uIGluY29tcGxldGUgaW5mb3JtYXRpb24gd291bGQgbWFwIGEgcG9zc2libHktcHVibGljXG4gICAgICAvLyByZXBvc2l0b3J5IHRvIHRoZSB3cm9uZyBpZGVudGl0eSwgYW5kIGEgZm5veCByZWNpcGllbnQgc3luYyBmYWlsdXJlIGRvZXMgbm90IHN0b3AgdGhpc1xuICAgICAgLy8gZ2VuZXJhdG9yIGZyb20gd3JpdGluZyBmaWxlcyDigJQgdGhlIGZhaWxlZCBydW4ncyByZXJ1biBmaWxscyB0aGUgbWFwcGluZyBpbi5cbiAgICAgIGNvbnN0IG1hcHBpbmcgPSBmbm94QWdlS2V5TWFwcGluZyhjb25maWcpO1xuICAgICAgaWYgKG1hcHBpbmcpIHtcbiAgICAgICAgc2VjcmV0cy5GTk9YX0FHRV9LRVkgPSBtYXBwaW5nO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICBpZiAoa2luZCA9PT0gJ3Rlc3QtcnVzdCcpIHtcbiAgICBjb25zdCBbcnVzdERpclBhdGhdID0gY29uZmlnLmNhcmdvVG9tbERpclBhdGhzO1xuICAgIGlmIChydXN0RGlyUGF0aCAmJiBydXN0RGlyUGF0aCAhPT0gJy4nKSB7XG4gICAgICBqb2Iud2l0aC53b3JraW5nX2RpcmVjdG9yeSA9IHJ1c3REaXJQYXRoO1xuICAgIH0gZWxzZSB7XG4gICAgICBkZWxldGUgam9iLndpdGgud29ya2luZ19kaXJlY3Rvcnk7XG4gICAgfVxuICB9XG5cbiAgLy8gUmVjb25zdHJ1Y3QgZnJvbSB0aGUgcGFyc2VkIGNhbGwgc28gYSBkaWZmZXJlbnRseSBjYXNlZCBvd25lciAoR2l0SHViIGlzIGNhc2UtaW5zZW5zaXRpdmVcbiAgLy8gdGhlcmUpIGlzIGFsc28gbm9ybWFsaXplZCB0byB0aGUgcmVwb3NpdG9yeSdzIG93biBvcmdhbml6YXRpb24gLyBtaXJyb3IuXG4gIGlmIChvcmdXb3JrZmxvd0NhbGwgJiYgY29uZmlnLnJlcG9zaXRvcnk/LnN0YXJ0c1dpdGgoJ2dpdGh1YjpXaWxsQm9vc3Rlci8nKSkge1xuICAgIGpvYi51c2VzID0gYFdpbGxCb29zdGVyL3JldXNhYmxlLXdvcmtmbG93cy8uZ2l0aHViL3dvcmtmbG93cy8ke29yZ1dvcmtmbG93Q2FsbC53b3JrZmxvd05hbWV9LiR7b3JnV29ya2Zsb3dDYWxsLmV4dGVuc2lvbn1AJHtvcmdXb3JrZmxvd0NhbGwucmVmfWA7XG4gIH0gZWxzZSBpZiAob3JnV29ya2Zsb3dDYWxsICYmIGNvbmZpZy5yZXBvc2l0b3J5Py5zdGFydHNXaXRoKCdnaXRodWI6V2lsbEJvb3N0ZXJMYWIvJykpIHtcbiAgICBqb2IudXNlcyA9IGBXaWxsQm9vc3RlckxhYi9yZXVzYWJsZS13b3JrZmxvd3MvLmdpdGh1Yi93b3JrZmxvd3MvJHtvcmdXb3JrZmxvd0NhbGwud29ya2Zsb3dOYW1lfS4ke29yZ1dvcmtmbG93Q2FsbC5leHRlbnNpb259QCR7b3JnV29ya2Zsb3dDYWxsLnJlZn1gO1xuICB9XG5cbiAgaWYgKGNvbmZpZy5kb2VzQ29udGFpbkRvY2tlcmZpbGUgJiYgIWpvYi53aXRoLmNpX2xhYmVsICYmIGtpbmQuc3RhcnRzV2l0aCgndGVzdCcpKSB7XG4gICAgam9iLndpdGguY2lfbGFiZWwgPSAnbGFyZ2UnO1xuICB9XG4gIGNvbnN0IGFjY2VwdHNSdW5uZXJJbnB1dCA9IFsndGVzdCcsICd0ZXN0LXJ1c3QnLCAnZGVwbG95JywgJ3JlbGVhc2UnLCAncnVuLXNjcmlwdCddLmluY2x1ZGVzKFxuICAgIG9yZ1dvcmtmbG93Q2FsbD8ud29ya2Zsb3dOYW1lID8/ICcnXG4gICk7XG4gIGlmIChjb25maWcuaXNSZXBvVmlzaWJpbGl0eUtub3duKSB7XG4gICAgaWYgKGNvbmZpZy5pc1B1YmxpY1JlcG8gJiYgYWNjZXB0c1J1bm5lcklucHV0KSB7XG4gICAgICBqb2Iud2l0aC5naXRodWJfaG9zdGVkX3J1bm5lciA9IHRydWU7XG4gICAgfSBlbHNlIHtcbiAgICAgIGRlbGV0ZSBqb2Iud2l0aC5naXRodWJfaG9zdGVkX3J1bm5lcjtcbiAgICB9XG4gICAgaWYgKCFjb25maWcuaXNQdWJsaWNSZXBvICYmIGpvYi53aXRoLnJ1bnNfb24gIT09IHVuZGVmaW5lZCkge1xuICAgICAgY29uc3QgbGFiZWxzID0gelxuICAgICAgICAuc3RyaW5nKClcbiAgICAgICAgLnRyYW5zZm9ybSgodmFsdWUsIGN0eCkgPT4ge1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICByZXR1cm4gSlNPTi5wYXJzZSh2YWx1ZSkgYXMgdW5rbm93bjtcbiAgICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICAgIGN0eC5hZGRJc3N1ZSh7IGNvZGU6ICdjdXN0b20nLCBtZXNzYWdlOiAnRXhwZWN0ZWQgSlNPTiBydW5uZXIgbGFiZWxzJyB9KTtcbiAgICAgICAgICAgIHJldHVybiB6Lk5FVkVSO1xuICAgICAgICAgIH1cbiAgICAgICAgfSlcbiAgICAgICAgLnBpcGUoei5hcnJheSh6LnN0cmluZygpKSlcbiAgICAgICAgLnNhZmVQYXJzZShqb2Iud2l0aC5ydW5zX29uKTtcbiAgICAgIGlmIChsYWJlbHMuc3VjY2VzcyAmJiBsYWJlbHMuZGF0YS5pbmNsdWRlcygnc2VsZi1ob3N0ZWQnKSkge1xuICAgICAgICBqb2Iud2l0aC5ydW5zX29uID0gSlNPTi5zdHJpbmdpZnkobGFiZWxzLmRhdGEpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc29sZS53YXJuKGBSZW1vdmVkIHJ1bnNfb24gZnJvbSAke2pvYi51c2VzfTogcHJpdmF0ZSByZXBvc2l0b3JpZXMgcmVxdWlyZSBhIHNlbGYtaG9zdGVkIGxhYmVsIGFycmF5LmApO1xuICAgICAgICBkZWxldGUgam9iLndpdGgucnVuc19vbjtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBpZiAoT2JqZWN0LmtleXMoam9iLndpdGgpLmxlbmd0aCA+IDApIHtcbiAgICBzb3J0S2V5cyhqb2Iud2l0aCk7XG4gIH0gZWxzZSB7XG4gICAgZGVsZXRlIGpvYi53aXRoO1xuICB9XG4gIGlmIChzZWNyZXRzKSB7XG4gICAgaWYgKE9iamVjdC5rZXlzKHNlY3JldHMpLmxlbmd0aCA+IDApIHtcbiAgICAgIGNvbnN0IG5ld1NlY3JldHMgPSBzb3J0S2V5cyhzZWNyZXRzKTtcbiAgICAgIGRlbGV0ZSBqb2Iuc2VjcmV0cztcbiAgICAgIGpvYi5zZWNyZXRzID0gbmV3U2VjcmV0cztcbiAgICB9IGVsc2Uge1xuICAgICAgZGVsZXRlIGpvYi5zZWNyZXRzO1xuICAgIH1cbiAgfVxufVxuXG4vKipcbiAqIFRoZSBzZWNyZXQgZXhwcmVzc2lvbiB0aGUgY2FsbGVyIG1hcHMgaW50byB0aGUgY2FsbGVlJ3MgZGVjbGFyZWQgRk5PWF9BR0VfS0VZLCBvciB1bmRlZmluZWRcbiAqIHdoZW4gdGhlIHJlcG9zaXRvcnkgc3RhdGUgZG9lcyBub3QgaWRlbnRpZnkgYSB1c2FibGUgQ0kgaWRlbnRpdHkg4oCUIGFuIHVua25vd24gdmlzaWJpbGl0eSwgYVxuICogcmVwb3NpdG9yeSBubyBDSSBzY29wZSBjb3ZlcnMgKGRlcml2aW5nIGZyb20gdGhlIHNhbWUgcHJpbmNpcGFsIHJvc3RlciBhcyB0aGUgcmVjaXBpZW50IHN5bmNcbiAqIGtlZXBzIHRoZSB0d28gZnJvbSBldmVyIGRpc2FncmVlaW5nKSwgb3IgYSBmYWlsZWQgZm5veCByZWNpcGllbnQgc3luYywgd2hvc2UgY2lwaGVydGV4dHMgbWF5XG4gKiBzdGlsbCB0YXJnZXQgdGhlIHByZXZpb3VzIGlkZW50aXR5LiBUaGUgY2FsbGVyIG11c3QgdGhlbiBwcmVzZXJ2ZSBhbnkgZXhpc3RpbmcgbWFwcGluZy5cbiAqL1xuZnVuY3Rpb24gZm5veEFnZUtleU1hcHBpbmcoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgaWYgKCFjb25maWcuaXNSZXBvVmlzaWJpbGl0eUtub3duIHx8IGhhc0Zub3hTeW5jRmFpbGVkKCkpIHJldHVybiB1bmRlZmluZWQ7XG4gIGNvbnN0IHNlY3JldE5hbWUgPSByZXNvbHZlRm5veENpQWdlS2V5U2VjcmV0TmFtZShjb25maWcpO1xuICByZXR1cm4gc2VjcmV0TmFtZSAmJiBgXFwke3sgc2VjcmV0cy4ke3NlY3JldE5hbWV9IH19YDtcbn1cblxuYXN5bmMgZnVuY3Rpb24gd3JpdGVZYW1sKG5ld1NldHRpbmdzOiBXb3JrZmxvdywgZmlsZVBhdGg6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAvLyBBIHBlcm1pc3Npb25zIG9iamVjdCBlbXB0aWVkIGJ5IHRoZSBwZXIta2luZCBkZWxldGlvbnMgKGUuZy4gYW4gZXhpc3RpbmcgdGVzdC1ydXN0IGNhbGxlclxuICAvLyB3aG9zZSBvbmx5IGVudHJ5IHdhcyBgYWN0aW9uc2ApIG11c3QgYmUgZHJvcHBlZCBlbnRpcmVseTogYHBlcm1pc3Npb25zOiB7fWAgc3RyaXBzIEVWRVJZXG4gIC8vIHRva2VuIHBlcm1pc3Npb24gZnJvbSB0aGUgd29ya2Zsb3csIHVubGlrZSB0aGUgYWJzZW50IGtleSB3aGljaCBrZWVwcyB0aGUgZGVmYXVsdHMuXG4gIGlmIChuZXdTZXR0aW5ncy5wZXJtaXNzaW9ucyAmJiBPYmplY3Qua2V5cyhuZXdTZXR0aW5ncy5wZXJtaXNzaW9ucykubGVuZ3RoID09PSAwKSB7XG4gICAgZGVsZXRlIG5ld1NldHRpbmdzLnBlcm1pc3Npb25zO1xuICB9XG4gIGNvbnN0IHlhbWxUZXh0ID0geWFtbC5kdW1wKG5ld1NldHRpbmdzLCB7IGxpbmVXaWR0aDogLTEgfSk7XG4gIGF3YWl0IGZzVXRpbC53cml0ZUZpbGVDb25maW5lZChmaWxlUGF0aCwgeWFtbFRleHQpO1xufVxuIiwiaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHsgZ2xvYklnbm9yZSB9IGZyb20gJ0B3aWxsYm9vc3Rlci9zaGFyZWQtbGliLW5vZGUvc3JjJztcbmltcG9ydCBmZyBmcm9tICdmYXN0LWdsb2InO1xuXG5pbXBvcnQgeyBpc1JldXNhYmxlV29ya2Zsb3dzUmVwbyB9IGZyb20gJy4uL2dlbmVyYXRvcnMvd29ya2Zsb3cuanMnO1xuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB7IG9wdGlvbnMgfSBmcm9tICcuLi9vcHRpb25zLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZnNVdGlsIH0gZnJvbSAnLi4vdXRpbHMvZnNVdGlsLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuaW1wb3J0IHsgZ2V0V29ya3NwYWNlRGlyUGF0dGVybnMgfSBmcm9tICcuLi91dGlscy93b3Jrc3BhY2VVdGlsLmpzJztcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGZpeFR5cG9zKHBhY2thZ2VDb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdmaXhUeXBvcycsIGFzeW5jICgpID0+IHtcbiAgICBpZiAoaXNSZXVzYWJsZVdvcmtmbG93c1JlcG8ocGFja2FnZUNvbmZpZy5yZXBvc2l0b3J5KSkgcmV0dXJuO1xuXG4gICAgY29uc3QgZGlyUGF0aCA9IHBhY2thZ2VDb25maWcuZGlyUGF0aDtcbiAgICBjb25zdCBkb2NGaWxlcyA9IGF3YWl0IGZnLmdsb2IoJyoqLyoubWQnLCB7IGRvdDogdHJ1ZSwgY3dkOiBkaXJQYXRoLCBpZ25vcmU6IGdsb2JJZ25vcmUgfSk7XG4gICAgaWYgKG9wdGlvbnMuaXNWZXJib3NlKSB7XG4gICAgICBjb25zb2xlLmluZm8oYEZvdW5kICR7ZG9jRmlsZXMubGVuZ3RofSBtYXJrZG93biBmaWxlcyBpbiAke2RpclBhdGh9YCk7XG4gICAgfVxuICAgIGZvciAoY29uc3QgbWRGaWxlIG9mIGRvY0ZpbGVzKSB7XG4gICAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGguam9pbihkaXJQYXRoLCBtZEZpbGUpO1xuICAgICAgdm9pZCBwcm9taXNlUG9vbC5ydW4oYXN5bmMgKCkgPT4ge1xuICAgICAgICBjb25zdCBjb250ZW50ID0gYXdhaXQgZnNVdGlsLnJlYWRGaWxlSWZFeGlzdHMoZmlsZVBhdGgpO1xuICAgICAgICBpZiAoY29udGVudCA9PT0gdW5kZWZpbmVkKSByZXR1cm47XG4gICAgICAgIGxldCBuZXdDb250ZW50ID0gZml4VHlwb3NJblRleHQoY29udGVudCk7XG4gICAgICAgIG5ld0NvbnRlbnQgPSByZXBsYWNlV2l0aENvbmZpZyhuZXdDb250ZW50LCBwYWNrYWdlQ29uZmlnLCAnZG9jJyk7XG4gICAgICAgIGlmIChjb250ZW50ICE9PSBuZXdDb250ZW50KSB7XG4gICAgICAgICAgYXdhaXQgZnNVdGlsLmdlbmVyYXRlRmlsZShmaWxlUGF0aCwgbmV3Q29udGVudCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cblxuICAgIC8vIGZpeFR5cG9zIHJ1bnMgb25jZSBvbiB0aGUgcm9vdCBjb25maWcsIHNvIHRoaXMgZ2xvYiBzZXQgbXVzdCBjb3ZlciBldmVyeSBkZWNsYXJlZCB3b3Jrc3BhY2VcbiAgICAvLyBsYXlvdXQgKGUuZy4gYXBwcy8qKSwgbm90IGp1c3QgdGhlIGNvbnZlbnRpb25hbCBwYWNrYWdlcy8qIGRpcmVjdG9yeSDigJQgd2hpbGUgaG9ub3JpbmdcbiAgICAvLyBkZWNsYXJlZCBuZWdhdGlvbnMgKGUuZy4gYCFhcHBzL2V4Y2x1ZGVkYCksIHdob3NlIHNvdXJjZXMgYXJlIG5vdCBwYXJ0IG9mIHRoZSBtb25vcmVwby5cbiAgICBjb25zdCB3b3Jrc3BhY2VEaXJQYXR0ZXJucyA9IGdldFdvcmtzcGFjZURpclBhdHRlcm5zKHBhY2thZ2VDb25maWcpO1xuICAgIGNvbnN0IHRzRmlsZXMgPSBhd2FpdCBmZy5nbG9iKFxuICAgICAgW1xuICAgICAgICAne2FwcCxzcmMsdGVzdCxzY3JpcHRzfS8qKi8qLntjanMsbWpzLGpzLGpzeCxjdHMsbXRzLHRzLHRzeH0nLFxuICAgICAgICAncGFja2FnZXMvKiove2FwcCxzcmMsdGVzdCxzY3JpcHRzfS8qKi8qLntjanMsbWpzLGpzLGpzeCxjdHMsbXRzLHRzLHRzeH0nLFxuICAgICAgICAuLi53b3Jrc3BhY2VEaXJQYXR0ZXJucy5pbmNsdWRlcy5tYXAoXG4gICAgICAgICAgKGRpclBhdHRlcm4pID0+IGAke2RpclBhdHRlcm59LyoqL3thcHAsc3JjLHRlc3Qsc2NyaXB0c30vKiovKi57Y2pzLG1qcyxqcyxqc3gsY3RzLG10cyx0cyx0c3h9YFxuICAgICAgICApLFxuICAgICAgXSxcbiAgICAgIHtcbiAgICAgICAgZG90OiB0cnVlLFxuICAgICAgICBjd2Q6IGRpclBhdGgsXG4gICAgICAgIGlnbm9yZTogWy4uLmdsb2JJZ25vcmUsIC4uLndvcmtzcGFjZURpclBhdHRlcm5zLmV4Y2x1ZGVzLm1hcCgoZGlyUGF0dGVybikgPT4gYCR7ZGlyUGF0dGVybn0vKipgKV0sXG4gICAgICB9XG4gICAgKTtcbiAgICBpZiAob3B0aW9ucy5pc1ZlcmJvc2UpIHtcbiAgICAgIGNvbnNvbGUuaW5mbyhgRm91bmQgJHt0c0ZpbGVzLmxlbmd0aH0gVHlwZVNjcmlwdCBmaWxlcyBpbiAke2RpclBhdGh9YCk7XG4gICAgfVxuICAgIGZvciAoY29uc3QgdHNGaWxlIG9mIHRzRmlsZXMpIHtcbiAgICAgIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5qb2luKGRpclBhdGgsIHRzRmlsZSk7XG4gICAgICB2b2lkIHByb21pc2VQb29sLnJ1bihhc3luYyAoKSA9PiB7XG4gICAgICAgIGNvbnN0IG9sZENvbnRlbnQgPSBhd2FpdCBmc1V0aWwucmVhZEZpbGVJZkV4aXN0cyhmaWxlUGF0aCk7XG4gICAgICAgIGlmIChvbGRDb250ZW50ID09PSB1bmRlZmluZWQpIHJldHVybjtcbiAgICAgICAgbGV0IG5ld0NvbnRlbnQgPSBmaXhUeXBvc0luQ29kZShvbGRDb250ZW50KTtcbiAgICAgICAgbmV3Q29udGVudCA9IHJlcGxhY2VXaXRoQ29uZmlnKG5ld0NvbnRlbnQsIHBhY2thZ2VDb25maWcsICd0cycpO1xuXG4gICAgICAgIGlmIChvbGRDb250ZW50ICE9PSBuZXdDb250ZW50KSB7XG4gICAgICAgICAgYXdhaXQgZnNVdGlsLmdlbmVyYXRlRmlsZShmaWxlUGF0aCwgbmV3Q29udGVudCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGNvbnN0IHRleHRCYXNlZEZpbGVzID0gYXdhaXQgZmcuZ2xvYignKiovKi57Y3N2LGh0bSxodG1sLHRzdix4bWwseWFtbCx5bWx9Jywge1xuICAgICAgZG90OiB0cnVlLFxuICAgICAgY3dkOiBkaXJQYXRoLFxuICAgICAgaWdub3JlOiBnbG9iSWdub3JlLFxuICAgIH0pO1xuICAgIGlmIChvcHRpb25zLmlzVmVyYm9zZSkge1xuICAgICAgY29uc29sZS5pbmZvKGBGb3VuZCAke3RleHRCYXNlZEZpbGVzLmxlbmd0aH0gdGV4dC1iYXNlZCBmaWxlcyBpbiAke2RpclBhdGh9YCk7XG4gICAgfVxuICAgIGZvciAoY29uc3QgZmlsZSBvZiB0ZXh0QmFzZWRGaWxlcykge1xuICAgICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLmpvaW4oZGlyUGF0aCwgZmlsZSk7XG4gICAgICB2b2lkIHByb21pc2VQb29sLnJ1bihhc3luYyAoKSA9PiB7XG4gICAgICAgIGNvbnN0IG9sZENvbnRlbnQgPSBhd2FpdCBmc1V0aWwucmVhZEZpbGVJZkV4aXN0cyhmaWxlUGF0aCk7XG4gICAgICAgIGlmIChvbGRDb250ZW50ID09PSB1bmRlZmluZWQpIHJldHVybjtcbiAgICAgICAgbGV0IG5ld0NvbnRlbnQgPSBmaXhUeXBvc0luVGV4dChvbGRDb250ZW50KTtcbiAgICAgICAgbmV3Q29udGVudCA9IHJlcGxhY2VXaXRoQ29uZmlnKG5ld0NvbnRlbnQsIHBhY2thZ2VDb25maWcsICd0ZXh0Jyk7XG5cbiAgICAgICAgaWYgKG9sZENvbnRlbnQgIT09IG5ld0NvbnRlbnQpIHtcbiAgICAgICAgICBhd2FpdCBmc1V0aWwuZ2VuZXJhdGVGaWxlKGZpbGVQYXRoLCBuZXdDb250ZW50KTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgYXdhaXQgcHJvbWlzZVBvb2wucHJvbWlzZUFsbCgpO1xuICB9KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGZpeFR5cG9zSW5UZXh0KGNvbnRlbnQ6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiBjb250ZW50XG4gICAgLnJlcGxhY2VBbGwoL1xcYmNcXC5mXFwuKD89XFxzfCQpL2csICdjZi4nKVxuICAgIC5yZXBsYWNlQWxsKC9cXGJlZ1xcLig/PVxcc3wkKS9nLCAnZS5nLicpXG4gICAgLnJlcGxhY2VBbGwoL1xcYmllXFwuKD89XFxzKS9nLCAnaS5lLicpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZml4VHlwb3NJbkNvZGUoY29udGVudDogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIChcbiAgICBjb250ZW50XG4gICAgICAucmVwbGFjZUFsbCgvXFwvXFwqW1xcc1xcU10qP1xcKlxcLy9nLCAoY29tbWVudCkgPT4gZml4VHlwb3NJblRleHQoY29tbWVudCkpXG4gICAgICAvLyBUaGUgd29yZCBib3VuZGFyeSBhbmQgdHJhaWxpbmctd2hpdGVzcGFjZSBndWFyZCBrZWVwIHdvcmRzIG1lcmVseSBlbmRpbmcgaW4gdGhlXG4gICAgICAvLyBhYmJyZXZpYXRpb24gbGV0dGVycyAoZS5nLiBcImNvb2tpZS5cIiwgXCJsZWcuXCIpIGludGFjdC5cbiAgICAgIC5yZXBsYWNlQWxsKC8oXnxcXHMpXFwvXFwvKC4qPylcXGJjXFwuZlxcLig/PVxcc3wkKS9nLCAnJDEvLyQyY2YuJylcbiAgICAgIC5yZXBsYWNlQWxsKC8oXnxcXHMpXFwvXFwvKC4qPylcXGJlZ1xcLig/PVxcc3wkKS9nLCAnJDEvLyQyZS5nLicpXG4gICAgICAucmVwbGFjZUFsbCgvKF58XFxzKVxcL1xcLyguKj8pXFxiaWVcXC4oPz1cXHN8JCkvZywgJyQxLy8kMmkuZS4nKVxuICApO1xufVxuXG5mdW5jdGlvbiByZXBsYWNlV2l0aENvbmZpZyhuZXdDb250ZW50OiBzdHJpbmcsIHBhY2thZ2VDb25maWc6IFBhY2thZ2VDb25maWcsIHByb3BOYW1lOiAnZG9jJyB8ICd0cycgfCAndGV4dCcpOiBzdHJpbmcge1xuICBmb3IgKGNvbnN0IFtiZWZvcmUsIGFmdGVyXSBvZiBPYmplY3QuZW50cmllcyhwYWNrYWdlQ29uZmlnLndiZnlKc29uPy50eXBvcz8uYWxsID8/IHt9KSkge1xuICAgIG5ld0NvbnRlbnQgPSBuZXdDb250ZW50LnJlcGxhY2VBbGwoYmVmb3JlLCBhZnRlcik7XG4gIH1cbiAgZm9yIChjb25zdCBbYmVmb3JlLCBhZnRlcl0gb2YgT2JqZWN0LmVudHJpZXMocGFja2FnZUNvbmZpZy53YmZ5SnNvbj8udHlwb3M/Lltwcm9wTmFtZV0gPz8ge30pKSB7XG4gICAgbmV3Q29udGVudCA9IG5ld0NvbnRlbnQucmVwbGFjZUFsbChiZWZvcmUsIGFmdGVyKTtcbiAgfVxuICByZXR1cm4gbmV3Q29udGVudDtcbn1cbiIsImltcG9ydCBjaGlsZFByb2Nlc3MgZnJvbSAnbm9kZTpjaGlsZF9wcm9jZXNzJztcblxuaW1wb3J0IHsgT2N0b2tpdCB9IGZyb20gJ0BvY3Rva2l0L2NvcmUnO1xuXG5jbGFzcyBHaXRIdWJVdGlsIHtcbiAgZ2V0T3JnQW5kTmFtZSh1cmxPckZ1bGxOYW1lOiBzdHJpbmcpOiBbc3RyaW5nLCBzdHJpbmddIHtcbiAgICBjb25zdCB1cmxXaXRob3V0UHJvdG9jb2wgPSB1cmxPckZ1bGxOYW1lLnNwbGl0KCc6JykuYXQoLTEpO1xuICAgIGNvbnN0IG5hbWVzID0gdXJsV2l0aG91dFByb3RvY29sPy5zcGxpdCgnLycpO1xuICAgIGNvbnN0IG9yZyA9IG5hbWVzPy5hdCgtMikgPz8gJyc7XG4gICAgLy8gVGhlIGRvdCBtdXN0IGJlIGVzY2FwZWQ6IGFuIHVuZXNjYXBlZCBgLmAgbWF0Y2hlcyBBTlkgY2hhcmFjdGVyLCBzbyBgbGVnaXRgIGxvc3QgaXRzIGBsYCBhbmQgYGVgLlxuICAgIGNvbnN0IG5hbWUgPSBuYW1lcz8uYXQoLTEpPy5yZXBsYWNlKC9cXC5naXQkL3UsICcnKSA/PyAnJztcbiAgICByZXR1cm4gW29yZywgbmFtZV07XG4gIH1cbn1cbmV4cG9ydCBjb25zdCBnaXRIdWJVdGlsID0gbmV3IEdpdEh1YlV0aWwoKTtcblxuZXhwb3J0IGZ1bmN0aW9uIGlzR2l0SHViUGVybWlzc2lvbk9yVmlzaWJpbGl0eUVycm9yKGVycm9yOiB1bmtub3duKTogYm9vbGVhbiB7XG4gIGlmICghZXJyb3IgfHwgdHlwZW9mIGVycm9yICE9PSAnb2JqZWN0JykgcmV0dXJuIGZhbHNlO1xuICBjb25zdCBzdGF0dXMgPSAoZXJyb3IgYXMgeyBzdGF0dXM/OiBudW1iZXIgfSkuc3RhdHVzO1xuICByZXR1cm4gc3RhdHVzID09PSA0MDEgfHwgc3RhdHVzID09PSA0MDMgfHwgc3RhdHVzID09PSA0MDQ7XG59XG5cbmNvbnN0IG9jdG9raXRDYWNoZSA9IG5ldyBNYXA8c3RyaW5nLCBPY3Rva2l0PigpO1xuXG5leHBvcnQgZnVuY3Rpb24gZ2V0T2N0b2tpdChvd25lcj86IHN0cmluZyk6IE9jdG9raXQge1xuICAvLyBHaXRIdWIgb3duZXIgbmFtZXMgYXJlIGNhc2UtaW5zZW5zaXRpdmUsIHNvIGNyZWRlbnRpYWwgc2VsZWN0aW9uIChhbmQgdGhlIGNhY2hlIGtleSkgbXVzdFxuICAvLyBub3QgZGVwZW5kIG9uIGhvdyBhIHJlbW90ZSBVUkwgaGFwcGVucyB0byBzcGVsbCB0aGUgb3JnYW5pemF0aW9uLlxuICBjb25zdCBrZXkgPSBvd25lcj8udG9Mb3dlckNhc2UoKSA/PyAnJztcbiAgY29uc3QgY2FjaGVkID0gb2N0b2tpdENhY2hlLmdldChrZXkpO1xuICBpZiAoY2FjaGVkKSByZXR1cm4gY2FjaGVkO1xuXG4gIGNvbnN0IG9jdG9raXQgPSBuZXcgT2N0b2tpdCh7XG4gICAgYXV0aDogZ2V0R2l0SHViVG9rZW4ob3duZXIpIHx8IHVuZGVmaW5lZCxcbiAgfSk7XG4gIG9jdG9raXRDYWNoZS5zZXQoa2V5LCBvY3Rva2l0KTtcbiAgcmV0dXJuIG9jdG9raXQ7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBoYXNHaXRIdWJUb2tlbihvd25lcjogc3RyaW5nKTogYm9vbGVhbiB7XG4gIHJldHVybiAhIWdldEdpdEh1YlRva2VuKG93bmVyKTtcbn1cblxuZnVuY3Rpb24gZ2V0R2l0SHViVG9rZW4ob3duZXI/OiBzdHJpbmcpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAvLyBDYXNlLWluc2Vuc2l0aXZlIG9uIHB1cnBvc2U6IGEgbm9uY2Fub25pY2FsbHkgY2FzZWQgcmVtb3RlIChlLmcuIGdpdGh1Yi5jb20vd2lsbGJvb3N0ZXJsYWIv4oCmKVxuICAvLyBtdXN0IHN0aWxsIHNlbGVjdCB0aGUgb3JnYW5pemF0aW9uJ3Mgb3duIFBBVCDigJQgZmFsbGluZyB0aHJvdWdoIHRvIHRoZSBnZW5lcmljIGJyYW5jaCB3b3VsZFxuICAvLyBwcmVmZXIgdGhlIE9USEVSIG9yZ2FuaXphdGlvbidzIFBBVCwgd2hpY2ggY2Fubm90IHJlYWQgdGhpcyBvcmdhbml6YXRpb24ncyBwcml2YXRlXG4gIC8vIHJlcG9zaXRvcmllcy5cbiAgY29uc3Qgbm9ybWFsaXplZE93bmVyID0gb3duZXI/LnRvTG93ZXJDYXNlKCk7XG4gIGlmIChub3JtYWxpemVkT3duZXIgPT09ICd3aWxsYm9vc3RlcicpIHtcbiAgICByZXR1cm4gcHJvY2Vzcy5lbnYuR0hfQk9UX1BBVF9GT1JfV0lMTEJPT1NURVIgfHwgZ2V0R2l0SHViQ2xpVG9rZW4oKTtcbiAgfVxuICBpZiAobm9ybWFsaXplZE93bmVyID09PSAnd2lsbGJvb3N0ZXJsYWInKSB7XG4gICAgcmV0dXJuIHByb2Nlc3MuZW52LkdIX0JPVF9QQVRfRk9SX1dJTExCT09TVEVSTEFCIHx8IGdldEdpdEh1YkNsaVRva2VuKCk7XG4gIH1cbiAgcmV0dXJuIChcbiAgICBwcm9jZXNzLmVudi5HSF9CT1RfUEFUX0ZPUl9XSUxMQk9PU1RFUiB8fFxuICAgIHByb2Nlc3MuZW52LkdIX0JPVF9QQVRfRk9SX1dJTExCT09TVEVSTEFCIHx8XG4gICAgcHJvY2Vzcy5lbnYuR0hfVE9LRU4gfHxcbiAgICBwcm9jZXNzLmVudi5HSVRIVUJfVE9LRU4gfHxcbiAgICBnZXRHaXRIdWJDbGlUb2tlbigpXG4gICk7XG59XG5cbmxldCBnaXRIdWJDbGlUb2tlbjogc3RyaW5nIHwgdW5kZWZpbmVkO1xuXG5mdW5jdGlvbiBnZXRHaXRIdWJDbGlUb2tlbigpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBpZiAoZ2l0SHViQ2xpVG9rZW4gIT09IHVuZGVmaW5lZCkgcmV0dXJuIGdpdEh1YkNsaVRva2VuIHx8IHVuZGVmaW5lZDtcblxuICB0cnkge1xuICAgIC8vIFNvbWUgbG9jYWwgcnVucyByZWx5IG9uIEdpdEh1YiBDTEkgYXV0aGVudGljYXRpb24gaW5zdGVhZCBvZiBleHBvcnRlZCBlbnYgdG9rZW5zLlxuICAgIGdpdEh1YkNsaVRva2VuID1cbiAgICAgIGNoaWxkUHJvY2Vzc1xuICAgICAgICAuZXhlY0ZpbGVTeW5jKCdnaCcsIFsnYXV0aCcsICd0b2tlbiddLCB7XG4gICAgICAgICAgZW5jb2Rpbmc6ICd1dGY4JyxcbiAgICAgICAgICBzdGRpbzogWydpZ25vcmUnLCAncGlwZScsICdpZ25vcmUnXSxcbiAgICAgICAgfSlcbiAgICAgICAgLnRyaW0oKSB8fCAnJztcbiAgfSBjYXRjaCB7XG4gICAgZ2l0SHViQ2xpVG9rZW4gPSAnJztcbiAgfVxuICByZXR1cm4gZ2l0SHViQ2xpVG9rZW4gfHwgdW5kZWZpbmVkO1xufVxuIiwiaW1wb3J0IHR5cGUgeyBQYXJzZUVycm9yIH0gZnJvbSAnanNvbmMtcGFyc2VyJztcbmltcG9ydCB7IGFwcGx5RWRpdHMsIGNyZWF0ZVNjYW5uZXIsIGZpbmROb2RlQXRMb2NhdGlvbiwgbW9kaWZ5LCBwYXJzZSBhcyBwYXJzZUpzb25jLCBwYXJzZVRyZWUgfSBmcm9tICdqc29uYy1wYXJzZXInO1xuXG4vLyBqc29uYy1wYXJzZXIgZGVjbGFyZXMgU3ludGF4S2luZC9TY2FuRXJyb3IgYXMgYW1iaWVudCBjb25zdCBlbnVtcywgd2hpY2ggY2Fubm90IGJlIGltcG9ydGVkXG4vLyB1bmRlciB2ZXJiYXRpbU1vZHVsZVN5bnRheDsgbWlycm9yIHRoZSBuZWVkZWQgbWVtYmVyIHZhbHVlcyBsb2NhbGx5LlxuY29uc3Qgc3ludGF4S2luZCA9IHsgbGluZUNvbW1lbnRUcml2aWE6IDEyLCBibG9ja0NvbW1lbnRUcml2aWE6IDEzLCBsaW5lQnJlYWtUcml2aWE6IDE0LCB0cml2aWE6IDE1LCBlb2Y6IDE3IH07XG5jb25zdCBzY2FuRXJyb3JOb25lID0gMDtcblxuZXhwb3J0IGNvbnN0IGpzb25jVXRpbCA9IHtcbiAgLyoqXG4gICAqIFRlbGxzIHdoZXRoZXIgdGhlIGNvbnRlbnQgaG9sZHMgbm8gY29uZmlndXJhdGlvbiBhdCBhbGwg4oCUIG9ubHkgd2hpdGVzcGFjZSwgY29tcGxldGUgY29tbWVudHMsXG4gICAqIGFuZC9vciBhIEJPTS4gdHNjIHRyZWF0cyBzdWNoIGEgdHNjb25maWcuanNvbiBhcyBhbiBlbXB0eSBjb25maWcsIHNvIGdlbmVyYXRvcnMgc2hvdWxkIHRyZWF0XG4gICAqIGl0IGxpa2UgYSBtaXNzaW5nIGZpbGUgKGFuZCBnZW5lcmF0ZSBkZWZhdWx0cykgaW5zdGVhZCBvZiByZWZ1c2luZyB0byBtYW5hZ2UgaXQuIExleGljYWxseVxuICAgKiBicm9rZW4gdHJpdmlhIChlLmcuIGFuIHVudGVybWluYXRlZCBibG9jayBjb21tZW50KSBpcyBOT1QgdHJpdmlhLW9ubHk6IHRoZSBmaWxlIG11c3QgYmUgbGVmdFxuICAgKiB1bnRvdWNoZWQgcmF0aGVyIHRoYW4gb3ZlcndyaXR0ZW4gd2l0aCBkZWZhdWx0cy5cbiAgICovXG4gIGlzVHJpdmlhT25seShjb250ZW50OiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICBjb25zdCBzY2FubmVyID0gY3JlYXRlU2Nhbm5lcihjb250ZW50LnJlcGxhY2UoL15cXHVGRUZGLywgJycpKTtcbiAgICBmb3IgKGxldCBraW5kOiBudW1iZXIgPSBzY2FubmVyLnNjYW4oKTsga2luZCAhPT0gc3ludGF4S2luZC5lb2Y7IGtpbmQgPSBzY2FubmVyLnNjYW4oKSkge1xuICAgICAgaWYgKFxuICAgICAgICAoc2Nhbm5lci5nZXRUb2tlbkVycm9yKCkgYXMgbnVtYmVyKSAhPT0gc2NhbkVycm9yTm9uZSB8fFxuICAgICAgICAoa2luZCAhPT0gc3ludGF4S2luZC5saW5lQ29tbWVudFRyaXZpYSAmJlxuICAgICAgICAgIGtpbmQgIT09IHN5bnRheEtpbmQuYmxvY2tDb21tZW50VHJpdmlhICYmXG4gICAgICAgICAga2luZCAhPT0gc3ludGF4S2luZC50cml2aWEgJiZcbiAgICAgICAgICBraW5kICE9PSBzeW50YXhLaW5kLmxpbmVCcmVha1RyaXZpYSlcbiAgICAgICkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xuICB9LFxuICAvKipcbiAgICogUGFyc2VzIGEgSlNPTkMgKEpTT04gd2l0aCBjb21tZW50cykgb2JqZWN0IGZyb20gY29uZmlnIGZpbGVzIHN1Y2ggYXMgdHNjb25maWcuanNvbixcbiAgICogcHlyaWdodGNvbmZpZy5qc29uLCByZW5vdmF0ZS5qc29uLCAudnNjb2RlL3NldHRpbmdzLmpzb24sIGFuZCB3cmFuZ2xlci5qc29uYy5cbiAgICpcbiAgICoganNvbmMtcGFyc2VyIGlzIGZhdWx0IHRvbGVyYW50IGFuZCByZXR1cm5zIGEgcGFydGlhbCBvYmplY3QgZm9yIG1hbGZvcm1lZCBpbnB1dCwgd2hpY2ggbXVzdFxuICAgKiBub3QgYmUgdHJlYXRlZCBhcyB0aGUgZmlsZSdzIGNvbmZpZ3VyYXRpb247IHJlamVjdCBhbnkgcGFyc2UgZXJyb3IgaW5zdGVhZC4gQSBsZWFkaW5nIEJPTSBpc1xuICAgKiBzdHJpcHBlZCBiZWNhdXNlIFR5cGVTY3JpcHQgYWNjZXB0cyBCT00nZCBjb25maWcgZmlsZXMgd2hpbGUganNvbmMtcGFyc2VyIHJlcG9ydHMgdGhlIEJPTSBhc1xuICAgKiBhIHBhcnNlIGVycm9yLiBDYWxsZXJzIHdob3NlIHJlYWRlciByZWplY3RzIHRyYWlsaW5nIGNvbW1hcyB0dXJuIGBhbGxvd1RyYWlsaW5nQ29tbWFgXG4gICAqIG9mZiBzbyBzdWNoIGEgZmlsZSBpcyByZXBvcnRlZCBhcyBtYWxmb3JtZWQgaGVyZSB0b28uXG4gICAqL1xuICBwYXJzZU9iamVjdElnbm9yaW5nRXJyb3I8VCBleHRlbmRzIG9iamVjdD4oY29udGVudDogc3RyaW5nLCBhbGxvd1RyYWlsaW5nQ29tbWEgPSB0cnVlKTogVCB8IHVuZGVmaW5lZCB7XG4gICAgY29uc3QgcGFyc2VFcnJvcnM6IFBhcnNlRXJyb3JbXSA9IFtdO1xuICAgIGNvbnN0IHZhbHVlID0gcGFyc2VKc29uYyhjb250ZW50LnJlcGxhY2UoL15cXHVGRUZGLywgJycpLCBwYXJzZUVycm9ycywgeyBhbGxvd1RyYWlsaW5nQ29tbWEgfSkgYXMgVCB8IHVuZGVmaW5lZDtcbiAgICByZXR1cm4gcGFyc2VFcnJvcnMubGVuZ3RoID09PSAwICYmICEhdmFsdWUgJiYgdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJiAhQXJyYXkuaXNBcnJheSh2YWx1ZSlcbiAgICAgID8gdmFsdWVcbiAgICAgIDogdW5kZWZpbmVkO1xuICB9LFxuICAvKiogVGVsbHMgd2hldGhlciB0aGUgY29udGVudCBjYXJyaWVzIGF0IGxlYXN0IG9uZSBjb21tZW50LCBpLmUuIGNvbnRlbnQgSlNPTi5zdHJpbmdpZnkgd291bGQgZHJvcC4gKi9cbiAgY29udGFpbnNDb21tZW50KGNvbnRlbnQ6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IHNjYW5uZXIgPSBjcmVhdGVTY2FubmVyKGNvbnRlbnQucmVwbGFjZSgvXlxcdUZFRkYvLCAnJykpO1xuICAgIGZvciAobGV0IGtpbmQ6IG51bWJlciA9IHNjYW5uZXIuc2NhbigpOyBraW5kICE9PSBzeW50YXhLaW5kLmVvZjsga2luZCA9IHNjYW5uZXIuc2NhbigpKSB7XG4gICAgICAvLyBBIGxleGljYWwgZXJyb3IgbWVhbnMgdGhlIHJlbWFpbmluZyB0b2tlbnMgYXJlIHVucmVsaWFibGU7IHJlcG9ydCBubyBjb21tZW50IHJhdGhlciB0aGFuXG4gICAgICAvLyBndWVzc2luZy4gQSBjYWxsZXIgdGhhdCBvbmx5IHdhcm5zIGFib3V0IGRyb3BwZWQgY29tbWVudHMgbG9zZXMgbm90aGluZywgYW5kIG9uZSB0aGF0XG4gICAgICAvLyByZWZ1c2VzIGEgY29tbWVudGVkIGZpbGUgZm9yIGEgc3RyaWN0LUpTT04gcmVhZGVyIHN0aWxsIHJlamVjdHMgc3VjaCBjb250ZW50IHdoZW4gaXRcbiAgICAgIC8vIHBhcnNlcyBpdC5cbiAgICAgIGlmICgoc2Nhbm5lci5nZXRUb2tlbkVycm9yKCkgYXMgbnVtYmVyKSAhPT0gc2NhbkVycm9yTm9uZSkgcmV0dXJuIGZhbHNlO1xuICAgICAgaWYgKGtpbmQgPT09IHN5bnRheEtpbmQubGluZUNvbW1lbnRUcml2aWEgfHwga2luZCA9PT0gc3ludGF4S2luZC5ibG9ja0NvbW1lbnRUcml2aWEpIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG4gIH0sXG4gIC8qKlxuICAgKiBTZXJpYWxpemVzIGBzZXR0aW5nc2AgaW50byBgb2xkQ29udGVudGAsIGVkaXRpbmcgb25seSB0aGUgdG9wLWxldmVsIHByb3BlcnRpZXMgd2hvc2UgdmFsdWVzXG4gICAqIGNoYW5nZWQgc28gdGhlIGNvbW1lbnRzIGFuZCBmb3JtYXR0aW5nIG9mIGFuIGV4aXN0aW5nIGZpbGUgc3Vydml2ZS4gQ2FsbGVycyBuZXZlciBkcm9wXG4gICAqIHByb3BlcnRpZXMgKGdlbmVyYXRlZCBzZXR0aW5ncyBhcmUgbWVyZ2VkIE9OIFRPUCBvZiB0aGUgZXhpc3Rpbmcgb25lcyksIHNvIHJlbW92YWxzIGFyZSBub3RcbiAgICogaGFuZGxlZDogYSBwcm9wZXJ0eSBtaXNzaW5nIGZyb20gYHNldHRpbmdzYCBpcyBsZWZ0IHVudG91Y2hlZCByYXRoZXIgdGhhbiBkZWxldGVkLlxuICAgKlxuICAgKiBUcml2aWEtb25seSBjb250ZW50IGtlZXBzIGl0cyBjb21tZW50cyBhcyBhIGhlYWRlciBhYm92ZSB0aGUgZ2VuZXJhdGVkIG9iamVjdCwgcmF0aGVyIHRoYW5cbiAgICogYmVpbmcgcmVwbGFjZWQgb3V0cmlnaHQgb3IgcnVuIHRocm91Z2ggbW9kaWZ5KCkgKHdoaWNoIHdvdWxkIG1vdmUgdGhlIG9iamVjdCBpbiBmcm9udCBvZiB0aGVtKS5cbiAgICovXG4gIHN0cmluZ2lmeVByZXNlcnZpbmdUcml2aWEoXG4gICAgb2xkQ29udGVudDogc3RyaW5nIHwgdW5kZWZpbmVkLFxuICAgIHNldHRpbmdzOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPlxuICApOiB7IGNvbnRlbnQ6IHN0cmluZzsga2V5c0xvc2luZ0NvbW1lbnRzOiBzdHJpbmdbXSB9IHtcbiAgICBpZiAob2xkQ29udGVudCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4geyBjb250ZW50OiBKU09OLnN0cmluZ2lmeShzZXR0aW5ncywgdW5kZWZpbmVkLCAyKSwga2V5c0xvc2luZ0NvbW1lbnRzOiBbXSB9O1xuICAgIH1cblxuICAgIGNvbnN0IG9sZFNldHRpbmdzID0ganNvbmNVdGlsLnBhcnNlT2JqZWN0SWdub3JpbmdFcnJvcjxSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj4ob2xkQ29udGVudCk7XG4gICAgLy8gRHJvcCBhIGxlYWRpbmcgQk9NOiBtb2RpZnkoKSBpbnNlcnRzIHRoZSBnZW5lcmF0ZWQgb2JqZWN0IEJFRk9SRSBhbnkgbGVhZGluZyB0cml2aWEsIHdoaWNoXG4gICAgLy8gd291bGQgbGVhdmUgdGhlIEJPTSBzdHJhbmRlZCBtaWQtZmlsZSB3aGVyZSBpdCBpcyBhIHN5bnRheCBlcnJvciByYXRoZXIgdGhhbiBhbiBpZ25vcmVkIG1hcmsuXG4gICAgbGV0IGNvbnRlbnQgPSBvbGRDb250ZW50LnJlcGxhY2UoL15cXHVGRUZGLywgJycpO1xuICAgIGlmIChqc29uY1V0aWwuaXNUcml2aWFPbmx5KGNvbnRlbnQpKSB7XG4gICAgICBjb25zdCBoZWFkZXIgPSBjb250ZW50LnRyaW0oKTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGNvbnRlbnQ6IGAke2hlYWRlciA/IGhlYWRlciArICdcXG4nIDogJyd9JHtKU09OLnN0cmluZ2lmeShzZXR0aW5ncywgdW5kZWZpbmVkLCAyKX1gLFxuICAgICAgICBrZXlzTG9zaW5nQ29tbWVudHM6IFtdLFxuICAgICAgfTtcbiAgICB9XG4gICAgY29uc3QgbW9kaWZ5T3B0aW9ucyA9IHsgZm9ybWF0dGluZ09wdGlvbnM6IGRldGVjdEZvcm1hdHRpbmdPcHRpb25zKGNvbnRlbnQpIH07XG4gICAgY29uc3Qga2V5c0xvc2luZ0NvbW1lbnRzOiBzdHJpbmdbXSA9IFtdO1xuICAgIGNvbnN0IG5ld0VudHJpZXM6IFtzdHJpbmcsIHVua25vd25dW10gPSBbXTtcbiAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhzZXR0aW5ncykpIHtcbiAgICAgIGNvbnN0IG9sZFZhbHVlID0gb2xkU2V0dGluZ3M/LltrZXldO1xuICAgICAgLy8gQ29tcGFyZSBzZXJpYWxpemVkIGZvcm1zIHNvIGRlZXAtZXF1YWwgdmFsdWVzIChlLmcuIGEgcmUtbWVyZ2VkIGBleHRlbmRzYCBhcnJheSkgZG8gbm90XG4gICAgICAvLyByZXdyaXRlIHRoZSBwcm9wZXJ0eSBhbmQgcmVmbG93IGl0cyBmb3JtYXR0aW5nLlxuICAgICAgaWYgKEpTT04uc3RyaW5naWZ5KG9sZFZhbHVlKSA9PT0gSlNPTi5zdHJpbmdpZnkodmFsdWUpKSBjb250aW51ZTtcbiAgICAgIGlmIChvbGRWYWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIG5ld0VudHJpZXMucHVzaChba2V5LCB2YWx1ZV0pO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIC8vIFJlcGxhY2luZyBhIHdob2xlIGFycmF5IHdvdWxkIGRpc2NhcmQgdGhlIGNvbW1lbnRzIGJldHdlZW4gaXRzIGVsZW1lbnRzLCBzbyBncm93IGl0IHdpdGhcbiAgICAgIC8vIHBlci1lbGVtZW50IGluc2VydGlvbnMgd2hlbmV2ZXIgdGhlIG5ldyB2YWx1ZSBvbmx5IGFkZHMgdG8gaXQuXG4gICAgICBjb25zdCBpbnNlcnRpb25zID0gQXJyYXkuaXNBcnJheShvbGRWYWx1ZSkgJiYgQXJyYXkuaXNBcnJheSh2YWx1ZSkgPyBmaW5kSW5zZXJ0aW9ucyhvbGRWYWx1ZSwgdmFsdWUpIDogdW5kZWZpbmVkO1xuICAgICAgZm9yIChjb25zdCBpbnNlcnRpb24gb2YgaW5zZXJ0aW9ucyA/PyBbXSkge1xuICAgICAgICBjb250ZW50ID0gYXBwbHlFZGl0cyhcbiAgICAgICAgICBjb250ZW50LFxuICAgICAgICAgIG1vZGlmeShjb250ZW50LCBba2V5LCBpbnNlcnRpb24uaW5kZXhdLCBpbnNlcnRpb24udmFsdWUsIHsgLi4ubW9kaWZ5T3B0aW9ucywgaXNBcnJheUluc2VydGlvbjogdHJ1ZSB9KVxuICAgICAgICApO1xuICAgICAgICBjb250ZW50ID0gcmVzdG9yZVRyYWlsaW5nQ29tbWVudChjb250ZW50LCBrZXksIGluc2VydGlvbi5pbmRleCk7XG4gICAgICB9XG4gICAgICBpZiAoaW5zZXJ0aW9ucykgY29udGludWU7XG4gICAgICAvLyBSZXdyaXRpbmcgdGhlIHdob2xlIHZhbHVlIGlzIHRoZSBvbmx5IG9wdGlvbiBsZWZ0ICh0aGUgbmV3IG9uZSBkcm9wcyBvciByZW9yZGVycyBlbGVtZW50cyksXG4gICAgICAvLyBhbmQgaXQgdGFrZXMgYW55IGNvbW1lbnQgbmVzdGVkIGluc2lkZSBpdCBhbG9uZy4gUmVwb3J0IHRoYXQgcmF0aGVyIHRoYW4gbG9zaW5nIGl0IHF1aWV0bHkuXG4gICAgICBjb25zdCByZXBsYWNlZFRleHQgPSB2YWx1ZVRleHRPZihjb250ZW50LCBrZXkpO1xuICAgICAgaWYgKHJlcGxhY2VkVGV4dCAhPT0gdW5kZWZpbmVkICYmIGpzb25jVXRpbC5jb250YWluc0NvbW1lbnQocmVwbGFjZWRUZXh0KSkga2V5c0xvc2luZ0NvbW1lbnRzLnB1c2goa2V5KTtcbiAgICAgIGNvbnRlbnQgPSBhcHBseUVkaXRzKGNvbnRlbnQsIG1vZGlmeShjb250ZW50LCBba2V5XSwgdmFsdWUsIG1vZGlmeU9wdGlvbnMpKTtcbiAgICB9XG4gICAgLy8gUHJlcGVuZCByYXRoZXIgdGhhbiBhcHBlbmQgdGhlIHByb3BlcnRpZXMgdGhhdCBhcmUgbmV3OiBhcHBlbmRpbmcgZGV0YWNoZXMgYSB0cmFpbGluZ1xuICAgIC8vIHNhbWUtbGluZSBjb21tZW50IGZyb20gdGhlIGxhc3QgcHJvcGVydHksIGxlYXZpbmcgaXQgdG8gZGVzY3JpYmUgdGhlIGdlbmVyYXRlZCB2YWx1ZVxuICAgIC8vIGluc3RlYWQuIEluc2VydGluZyBpbiByZXZlcnNlIGtlZXBzIHRoZSBvcmRlciB0aGUgc2V0dGluZ3MgZGVjbGFyZSB0aGVtIGluLlxuICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIG5ld0VudHJpZXMudG9SZXZlcnNlZCgpKSB7XG4gICAgICBjb250ZW50ID0gYXBwbHlFZGl0cyhjb250ZW50LCBtb2RpZnkoY29udGVudCwgW2tleV0sIHZhbHVlLCB7IC4uLm1vZGlmeU9wdGlvbnMsIGdldEluc2VydGlvbkluZGV4OiAoKSA9PiAwIH0pKTtcbiAgICB9XG4gICAgcmV0dXJuIHsgY29udGVudCwga2V5c0xvc2luZ0NvbW1lbnRzIH07XG4gIH0sXG59O1xuXG4vKiogUmV0dXJucyB0aGUgc291cmNlIHRleHQgb2YgYSB0b3AtbGV2ZWwgcHJvcGVydHkncyB2YWx1ZSwgY29tbWVudHMgYW5kIGFsbC4gKi9cbmZ1bmN0aW9uIHZhbHVlVGV4dE9mKGNvbnRlbnQ6IHN0cmluZywga2V5OiBzdHJpbmcpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBjb25zdCByb290ID0gcGFyc2VUcmVlKGNvbnRlbnQpO1xuICBjb25zdCBub2RlID0gcm9vdCAmJiBmaW5kTm9kZUF0TG9jYXRpb24ocm9vdCwgW2tleV0pO1xuICByZXR1cm4gbm9kZSAmJiBjb250ZW50LnNsaWNlKG5vZGUub2Zmc2V0LCBub2RlLm9mZnNldCArIG5vZGUubGVuZ3RoKTtcbn1cblxuLy8gVGhlIHdob2xlIHNhbWUtbGluZSBjb21tZW50IHNlcXVlbmNlLCBub3QganVzdCB0aGUgZmlyc3Qgb25lOiBhIGxpbmUgY29tbWVudCBlbmRzIGl0IChpdCBydW5zIHRvXG4vLyB0aGUgbmV3bGluZSksIGJ1dCBhbnkgbnVtYmVyIG9mIGJsb2NrIGNvbW1lbnRzIGNhbiBwcmVjZWRlIGl0LCBhbmQgbW92aW5nIG9ubHkgdGhlIGZpcnN0IHdvdWxkXG4vLyBsZWF2ZSB0aGUgcmVzdCBkZXNjcmliaW5nIHRoZSB3cm9uZyBlbGVtZW50LlxuY29uc3QgdHJhaWxpbmdDb21tZW50UGF0dGVybiA9IC9eKD86W15cXFNcXG5dKlxcL1xcKltcXFNcXHNdKj9cXCpcXC8pKig/OlteXFxTXFxuXSpcXC9cXC9bXlxcbl0qKT8vdTtcblxuLyoqXG4gKiBSZWF0dGFjaGVzIGEgc2FtZS1saW5lIGNvbW1lbnQgdG8gdGhlIGVsZW1lbnQgaXQgZGVzY3JpYmVzLiBJbnNlcnRpbmcgaW50byBhbiBhcnJheSBwbGFjZXMgdGhlXG4gKiBuZXcgZWxlbWVudCBCRUZPUkUgdGhlIHRyaXZpYSB0aGF0IGZvbGxvd3MgaXRzIHByZWRlY2Vzc29yLCBzbyBhcHBlbmRpbmcgYWZ0ZXJcbiAqIGB7IC4uLiB9IC8vIHdoeSB0aGlzIHJ1bGUgZXhpc3RzYCBsZWF2ZXMgdGhhdCBjb21tZW50IGV4cGxhaW5pbmcgdGhlIGdlbmVyYXRlZCBlbGVtZW50IGluc3RlYWQuXG4gKiBBIGZyZXNobHkgc2VyaWFsaXplZCBlbGVtZW50IG5ldmVyIGNhcnJpZXMgYSBjb21tZW50IG9mIGl0cyBvd24sIHNvIGFueXRoaW5nIHRyYWlsaW5nIHRoZVxuICogaW5zZXJ0aW9uIGJlbG9uZ2VkIHRvIHRoZSBlbGVtZW50IGJlZm9yZSBpdC5cbiAqL1xuZnVuY3Rpb24gcmVzdG9yZVRyYWlsaW5nQ29tbWVudChjb250ZW50OiBzdHJpbmcsIGtleTogc3RyaW5nLCBpbnNlcnRlZEluZGV4OiBudW1iZXIpOiBzdHJpbmcge1xuICBpZiAoaW5zZXJ0ZWRJbmRleCA9PT0gMCkgcmV0dXJuIGNvbnRlbnQ7XG4gIGNvbnN0IHJvb3QgPSBwYXJzZVRyZWUoY29udGVudCk7XG4gIGNvbnN0IGVsZW1lbnRzID0gKHJvb3QgJiYgZmluZE5vZGVBdExvY2F0aW9uKHJvb3QsIFtrZXldKSk/LmNoaWxkcmVuO1xuICBjb25zdCBpbnNlcnRlZCA9IGVsZW1lbnRzPy5baW5zZXJ0ZWRJbmRleF07XG4gIGNvbnN0IHByZXZpb3VzID0gZWxlbWVudHM/LltpbnNlcnRlZEluZGV4IC0gMV07XG4gIGlmICghaW5zZXJ0ZWQgfHwgIXByZXZpb3VzKSByZXR1cm4gY29udGVudDtcbiAgY29uc3QgaW5zZXJ0ZWRFbmQgPSBpbnNlcnRlZC5vZmZzZXQgKyBpbnNlcnRlZC5sZW5ndGg7XG4gIGNvbnN0IGNvbW1lbnQgPSB0cmFpbGluZ0NvbW1lbnRQYXR0ZXJuLmV4ZWMoY29udGVudC5zbGljZShpbnNlcnRlZEVuZCkpPy5bMF07XG4gIGlmICghY29tbWVudCkgcmV0dXJuIGNvbnRlbnQ7XG4gIC8vIExhbmQgdGhlIGNvbW1lbnQgYWZ0ZXIgdGhlIHNlcGFyYXRpbmcgY29tbWEgc28gdGhlIGVsZW1lbnQga2VlcHMgaXRzIG93biBsaW5lIGludGFjdC5cbiAgY29uc3QgcHJldmlvdXNFbmQgPSBwcmV2aW91cy5vZmZzZXQgKyBwcmV2aW91cy5sZW5ndGg7XG4gIGNvbnN0IHJlc3RvcmVPZmZzZXQgPSBwcmV2aW91c0VuZCArICgvXlxccyosL3UuZXhlYyhjb250ZW50LnNsaWNlKHByZXZpb3VzRW5kKSk/LlswXS5sZW5ndGggPz8gMCk7XG4gIHJldHVybiAoXG4gICAgY29udGVudC5zbGljZSgwLCByZXN0b3JlT2Zmc2V0KSArXG4gICAgY29tbWVudCArXG4gICAgY29udGVudC5zbGljZShyZXN0b3JlT2Zmc2V0LCBpbnNlcnRlZEVuZCkgK1xuICAgIGNvbnRlbnQuc2xpY2UoaW5zZXJ0ZWRFbmQgKyBjb21tZW50Lmxlbmd0aClcbiAgKTtcbn1cblxuLyoqXG4gKiBNaXJyb3JzIHRoZSBpbmRlbnRhdGlvbiB0aGUgZmlsZSBhbHJlYWR5IHVzZXMsIHNvIGEgc2VtYW50aWMgY2hhbmdlIGRvZXMgbm90IHJlaW5kZW50IHVucmVsYXRlZFxuICogbGluZXMuIFRoZSBmaXJzdCBwcm9wZXJ0eSBpcyBtZWFzdXJlZCByYXRoZXIgdGhhbiB0aGUgZmlyc3QgaW5kZW50ZWQgbGluZSwgYmVjYXVzZSBhIGRlY29yYXRlZFxuICogYmxvY2sgY29tbWVudCAoYCAqIC4uLmApIHdvdWxkIG90aGVyd2lzZSBwYXNzIGZvciB0aGUgZmlsZSdzIGluZGVudGF0aW9uLiBGYWxscyBiYWNrIHRvIHRoZSB0d29cbiAqIHNwYWNlcyBldmVyeSBnZW5lcmF0ZWQgY29uZmlnIHVzZXMuXG4gKi9cbmZ1bmN0aW9uIGRldGVjdEZvcm1hdHRpbmdPcHRpb25zKGNvbnRlbnQ6IHN0cmluZyk6IHsgaW5zZXJ0U3BhY2VzOiBib29sZWFuOyB0YWJTaXplOiBudW1iZXIgfSB7XG4gIGNvbnN0IGZpcnN0UHJvcGVydHkgPSBwYXJzZVRyZWUoY29udGVudCk/LmNoaWxkcmVuPy5bMF07XG4gIGNvbnN0IGluZGVudGF0aW9uID1cbiAgICBmaXJzdFByb3BlcnR5ICYmIGNvbnRlbnQuc2xpY2UoY29udGVudC5sYXN0SW5kZXhPZignXFxuJywgZmlyc3RQcm9wZXJ0eS5vZmZzZXQpICsgMSwgZmlyc3RQcm9wZXJ0eS5vZmZzZXQpO1xuICBpZiAoIWluZGVudGF0aW9uIHx8ICEvXltcXHQgXSskL3UudGVzdChpbmRlbnRhdGlvbikpIHJldHVybiB7IGluc2VydFNwYWNlczogdHJ1ZSwgdGFiU2l6ZTogMiB9O1xuICBpZiAoaW5kZW50YXRpb24uc3RhcnRzV2l0aCgnXFx0JykpIHJldHVybiB7IGluc2VydFNwYWNlczogZmFsc2UsIHRhYlNpemU6IDEgfTtcbiAgcmV0dXJuIHsgaW5zZXJ0U3BhY2VzOiB0cnVlLCB0YWJTaXplOiBpbmRlbnRhdGlvbi5sZW5ndGggfTtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIHRoZSBlbGVtZW50cyB0byBpbnNlcnQgaW50byBgb2xkVmFsdWVgIHRvIHR1cm4gaXQgaW50byBgbmV3VmFsdWVgLCBvciB1bmRlZmluZWQgd2hlblxuICogdGhhdCBpcyBpbXBvc3NpYmxlIGJlY2F1c2UgYG5ld1ZhbHVlYCBkcm9wcyBvciByZW9yZGVycyBhbiBleGlzdGluZyBlbGVtZW50ICh0aGUgY2FsbGVyIG11c3RcbiAqIHRoZW4gcmVwbGFjZSB0aGUgYXJyYXkgd2hvbGVzYWxlKS4gSW5kaWNlcyBhZGRyZXNzIHRoZSBhcnJheSBhcyBpdCBncm93cywgc28gYXBwbHlpbmcgdGhlXG4gKiBpbnNlcnRpb25zIGxlZnQgdG8gcmlnaHQgeWllbGRzIGBuZXdWYWx1ZWAuXG4gKi9cbmZ1bmN0aW9uIGZpbmRJbnNlcnRpb25zKG9sZFZhbHVlOiB1bmtub3duW10sIG5ld1ZhbHVlOiB1bmtub3duW10pOiB7IGluZGV4OiBudW1iZXI7IHZhbHVlOiB1bmtub3duIH1bXSB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IGluc2VydGlvbnM6IHsgaW5kZXg6IG51bWJlcjsgdmFsdWU6IHVua25vd24gfVtdID0gW107XG4gIGxldCBvbGRJbmRleCA9IDA7XG4gIGZvciAoY29uc3QgW25ld0luZGV4LCBlbGVtZW50XSBvZiBuZXdWYWx1ZS5lbnRyaWVzKCkpIHtcbiAgICBpZiAob2xkSW5kZXggPCBvbGRWYWx1ZS5sZW5ndGggJiYgSlNPTi5zdHJpbmdpZnkob2xkVmFsdWVbb2xkSW5kZXhdKSA9PT0gSlNPTi5zdHJpbmdpZnkoZWxlbWVudCkpIHtcbiAgICAgIG9sZEluZGV4Kys7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgaW5zZXJ0aW9ucy5wdXNoKHsgaW5kZXg6IG5ld0luZGV4LCB2YWx1ZTogZWxlbWVudCB9KTtcbiAgfVxuICByZXR1cm4gb2xkSW5kZXggPT09IG9sZFZhbHVlLmxlbmd0aCA/IGluc2VydGlvbnMgOiB1bmRlZmluZWQ7XG59XG4iLCJpbXBvcnQgdHlwZSB7IFBhY2thZ2VKc29uIH0gZnJvbSAndHlwZS1mZXN0JztcblxuLyoqXG4gKiBSZWNvZ25pemVzIHRoZSBtYW5hZ2VkIGB3YiBnZW4tY29kZWAgc2VnbWVudCwgYSBvbmUtbGV2ZWwgcGFja2FnZS1zY3JpcHQgd3JhcHBlciBhcm91bmQgaXQsIGFuZFxuICogY3VzdG9tIHNlZ21lbnRzIHRoYXQgd2JmeSBsZWF2ZXMgYWxvbmUuXG4gKi9cbnR5cGUgU2NyaXB0U2VnbWVudEtpbmQgPSAnY3VzdG9tJyB8ICdnZW5Db2RlJyB8ICdnZW5Db2RlV3JhcHBlcic7XG5cbmNvbnN0IGdlbkNvZGVTZWdtZW50UGF0dGVybiA9IC9eYnVuXFxzK3diXFxzK2dlbi1jb2RlJC91O1xuXG4vLyBBIHJ1bm5lciBkZWxlZ2F0aW5nIHRvIG9uZSBvZiB0aGlzIHBhY2thZ2UncyBvd24gc2NyaXB0cywgZS5nLiBgYnVuIHJ1biBnZW4tdHlwZXNgLlxuY29uc3Qgc2NyaXB0UnVubmVyUGF0dGVybiA9IC9eYnVuXFxzK3J1blxccysoXFxTKykkL3U7XG5cbi8vIEFueXRoaW5nIHdiZnkncyBgJiZgIHNwbGl0IGNhbm5vdCBtb2RlbCAocGlwZXMsIHNlcXVlbmNpbmcsIHJlZGlyZWN0aW9ucywgcXVvdGluZywgc3Vic3RpdHV0aW9ucywgZGlyZWN0b3J5XG4vLyBjaGFuZ2VzKS4gU2NyaXB0cyBjb250YWluaW5nIGl0IGFyZSBsZWZ0IHVudG91Y2hlZCBpbnN0ZWFkIG9mIGJlaW5nIHJld3JpdHRlbiBmcm9tIGEgd3JvbmcgcGFyc2UuXG5jb25zdCB1bnN1cHBvcnRlZFNoZWxsU3ludGF4UGF0dGVybiA9IC9bXFxuO3w8PmAkJ1wiKCldfFxcYmNkXFxzL3U7XG5cbi8qKlxuICogU3BsaXRzIGEgc2NyaXB0IGludG8gYCYmYC1zZXBhcmF0ZWQgc2VnbWVudHMsIG9yIHJldHVybnMgdW5kZWZpbmVkIHdoZW4gdGhlIHNjcmlwdCB1c2VzIHNoZWxsIHN5bnRheCB3YmZ5XG4gKiBkZWxpYmVyYXRlbHkgZG9lcyBub3QgbW9kZWwuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzcGxpdFNjcmlwdFNlZ21lbnRzKHNjcmlwdDogc3RyaW5nKTogc3RyaW5nW10gfCB1bmRlZmluZWQge1xuICBpZiAodW5zdXBwb3J0ZWRTaGVsbFN5bnRheFBhdHRlcm4udGVzdChzY3JpcHQpKSByZXR1cm47XG4gIHJldHVybiBzY3JpcHRcbiAgICAuc3BsaXQoJyYmJylcbiAgICAubWFwKChzZWdtZW50KSA9PiBzZWdtZW50LnRyaW0oKSlcbiAgICAuZmlsdGVyKEJvb2xlYW4pO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY2xhc3NpZnlTY3JpcHRTZWdtZW50KFxuICBzZWdtZW50OiBzdHJpbmcsXG4gIHNjcmlwdHM6IFBhY2thZ2VKc29uLlNjcmlwdHMsXG4gIGZvbGxvd3NXcmFwcGVyID0gdHJ1ZVxuKTogU2NyaXB0U2VnbWVudEtpbmQge1xuICBjb25zdCBub3JtYWxpemVkID0gc2VnbWVudC50cmltKCkucmVwbGFjZUFsbCgvXFxzKy9ndSwgJyAnKTtcbiAgaWYgKGdlbkNvZGVTZWdtZW50UGF0dGVybi50ZXN0KG5vcm1hbGl6ZWQpKSByZXR1cm4gJ2dlbkNvZGUnO1xuICAvLyBBIG9uZS1sZXZlbCB3cmFwcGVyIGxvb2t1cCBjb3ZlcnMgYFwicG9zdGluc3RhbGxcIjogXCJidW4gcnVuIGdlbi10eXBlc1wiYCwgdGhlIHNoYXBlIHRoZXNlIHJlcG9zaXRvcmllcyB1c2U7XG4gIC8vIGRlZXBlciBjaGFpbnMgc3RheSBjdXN0b20gc28gd2JmeSBjYW5ub3QgbG9vcCBvbiBhIHNlbGYtcmVmZXJlbnRpYWwgc2NyaXB0LlxuICBjb25zdCBzY3JpcHROYW1lID0gZm9sbG93c1dyYXBwZXIgPyBzY3JpcHRSdW5uZXJQYXR0ZXJuLmV4ZWMobm9ybWFsaXplZCk/LlsxXSA6IHVuZGVmaW5lZDtcbiAgY29uc3QgdGFyZ2V0ID0gc2NyaXB0TmFtZSA9PT0gdW5kZWZpbmVkID8gdW5kZWZpbmVkIDogc2NyaXB0c1tzY3JpcHROYW1lXTtcbiAgaWYgKCF0YXJnZXQpIHJldHVybiAnY3VzdG9tJztcbiAgY29uc3Qgc2VnbWVudHMgPSBzcGxpdFNjcmlwdFNlZ21lbnRzKHRhcmdldCk7XG4gIC8vIEEgd3JhcHBlciBhcm91bmQgYSBDVVNUT01JWkVEIGdlbi1jb2RlIChgYnVuIHdiIGdlbi1jb2RlICYmIGJ1biBydW4gYnVpbGQtYXNzZXRzYCkgc3RpbGwgcGVyZm9ybXMgdGhlIG1hbmFnZWRcbiAgLy8gZ2VuZXJhdGlvbiwgc28gaXQgY291bnRzIGFzIGdlbi1jb2RlOyB0cmVhdGluZyBpdCBhcyBjdXN0b20gd291bGQgYXBwZW5kIGEgc2Vjb25kIGB3YiBnZW4tY29kZWAgYW5kIHJ1biBldmVyeVxuICAvLyBnZW5lcmF0b3IgdHdpY2UgcGVyIGluc3RhbGwuXG4gIGlmIChzZWdtZW50cz8ubGVuZ3RoICE9PSAxKSB7XG4gICAgLy8gQSB3cmFwcGVyIGFyb3VuZCBhIENVU1RPTUlaRUQgZ2VuLWNvZGUgKGBidW4gd2IgZ2VuLWNvZGUgJiYgYnVuIHJ1biBidWlsZC1hc3NldHNgKSBhbHJlYWR5IHBlcmZvcm1zIHRoZVxuICAgIC8vIG1hbmFnZWQgZ2VuZXJhdGlvbiBBTkQgdGhlIHByb2plY3QncyBvd24gc3RlcHMsIHNvIGl0IGlzIHRoZSBpbnN0YWxsLXRpbWUgZW50cnkgcG9pbnQ6IGl0IG11c3QgYmUga2VwdCBhc1xuICAgIC8vIHdyaXR0ZW4uIFJlcGxhY2luZyBpdCB3aXRoIGEgYmFyZSBgd2IgZ2VuLWNvZGVgIHdvdWxkIGRyb3AgdGhvc2Ugc3RlcHM7IGFwcGVuZGluZyBvbmUgd291bGQgcnVuIGV2ZXJ5XG4gICAgLy8gZ2VuZXJhdG9yIHR3aWNlLlxuICAgIHJldHVybiBzZWdtZW50cz8uc29tZSgoaW5uZXIpID0+IGdlbkNvZGVTZWdtZW50UGF0dGVybi50ZXN0KGlubmVyLnRyaW0oKS5yZXBsYWNlQWxsKC9cXHMrL2d1LCAnICcpKSlcbiAgICAgID8gJ2dlbkNvZGVXcmFwcGVyJ1xuICAgICAgOiAnY3VzdG9tJztcbiAgfVxuICByZXR1cm4gY2xhc3NpZnlTY3JpcHRTZWdtZW50KHNlZ21lbnRzWzBdID8/ICcnLCBzY3JpcHRzLCBmYWxzZSk7XG59XG4iLCJpbXBvcnQgdHlwZSB7IFNwYXduU3luY09wdGlvbnMgfSBmcm9tICdub2RlOmNoaWxkX3Byb2Nlc3MnO1xuaW1wb3J0IGNoaWxkX3Byb2Nlc3MgZnJvbSAnbm9kZTpjaGlsZF9wcm9jZXNzJztcblxuZXhwb3J0IGZ1bmN0aW9uIHNwYXduU3luYyhjb21tYW5kOiBzdHJpbmcsIGFyZ3M6IHN0cmluZ1tdLCBjd2Q6IHN0cmluZywgcmV0cnkgPSAwKTogdm9pZCB7XG4gIHNwYXduU3luY0FuZFJldHVyblN0YXR1cyhjb21tYW5kLCBhcmdzLCBjd2QsIHJldHJ5KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHNwYXduU3luY0FuZFJldHVyblN0YXR1cyhjb21tYW5kOiBzdHJpbmcsIGFyZ3M6IHN0cmluZ1tdLCBjd2Q6IHN0cmluZywgcmV0cnkgPSAwKTogbnVtYmVyIHtcbiAgZG8ge1xuICAgIGNvbnN0IFtuZXdDbWQsIG5ld0FyZ3MsIG9wdGlvbnNdID0gZ2V0U3Bhd25TeW5jQXJncyhjb21tYW5kLCBhcmdzLCBjd2QpO1xuICAgIGNvbnNvbGUubG9nKGAkICR7bmV3Q21kfSAke25ld0FyZ3Muam9pbignICcpfSBhdCAke2N3ZH1gKTtcbiAgICBjb25zdCByZXQgPSBjaGlsZF9wcm9jZXNzLnNwYXduU3luYyhuZXdDbWQsIG5ld0FyZ3MsIG9wdGlvbnMpO1xuICAgIGNvbnN0IHN0YXR1cyA9IHJldC5zdGF0dXMgPz8gMTtcbiAgICBpZiAoc3RhdHVzID09PSAwKSBicmVhaztcbiAgICBpZiAocmV0cnkgPD0gMCkgcmV0dXJuIHN0YXR1cztcbiAgfSB3aGlsZSAoLS1yZXRyeSA+PSAwKTtcbiAgcmV0dXJuIDA7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBzcGF3blN5bmNBbmRSZXR1cm5TdGRvdXQoY29tbWFuZDogc3RyaW5nLCBhcmdzOiBzdHJpbmdbXSwgY3dkOiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gc3Bhd25TeW5jQW5kUmV0dXJuU3Rkb3V0SW50ZXJuYWwoY29tbWFuZCwgYXJncywgY3dkKVsxXTtcbn1cblxuZnVuY3Rpb24gc3Bhd25TeW5jQW5kUmV0dXJuU3Rkb3V0SW50ZXJuYWwoY29tbWFuZDogc3RyaW5nLCBhcmdzOiBzdHJpbmdbXSwgY3dkOiBzdHJpbmcpOiBbbnVtYmVyLCBzdHJpbmddIHtcbiAgY29uc3QgW25ld0NtZCwgbmV3QXJncywgb3B0aW9uc10gPSBnZXRTcGF3blN5bmNBcmdzKGNvbW1hbmQsIGFyZ3MsIGN3ZCk7XG4gIG9wdGlvbnMuc3RkaW8gPSAncGlwZSc7XG4gIGNvbnN0IHByb2MgPSBjaGlsZF9wcm9jZXNzLnNwYXduU3luYyhuZXdDbWQsIG5ld0FyZ3MsIG9wdGlvbnMpO1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVubmVjZXNzYXJ5LWNvbmRpdGlvbiAtLSBzcGF3blN5bmMgcmV0dXJucyBudWxsIHN0ZGVyciBvbiBFTk9FTlQuXG4gIGNvbnN0IHN0ZGVyciA9IHByb2Muc3RkZXJyID8/ICcnO1xuICBjb25zdCBlcnJvciA9IHR5cGVvZiBzdGRlcnIgPT09ICdzdHJpbmcnID8gc3RkZXJyLnRyaW0oKSA6IHN0ZGVyci50b1N0cmluZygpLnRyaW0oKTtcbiAgaWYgKHByb2MuZXJyb3IpIHtcbiAgICBjb25zb2xlLmVycm9yKGAke25ld0NtZH0gWyR7bmV3QXJncy5tYXAoKHMpID0+IGBcIiR7c31cImApLmpvaW4oJywgJyl9XSBmYWlsZWQgd2l0aDogJHtwcm9jLmVycm9yLm1lc3NhZ2V9YCk7XG4gIH0gZWxzZSBpZiAoZXJyb3IpIHtcbiAgICBjb25zb2xlLmVycm9yKFxuICAgICAgYCR7bmV3Q21kfSBbJHtuZXdBcmdzLm1hcCgocykgPT4gYFwiJHtzfVwiYCkuam9pbignLCAnKX1dIG91dHB1dHMgdGhlIGZvbGxvd2luZyBjb250ZW50IHRvIHN0ZGVycjpcXG4ke2Vycm9yfWBcbiAgICApO1xuICB9XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW5uZWNlc3NhcnktY29uZGl0aW9uIC0tIHNwYXduU3luYyByZXR1cm5zIG51bGwgc3Rkb3V0IG9uIEVOT0VOVC5cbiAgY29uc3Qgc3Rkb3V0ID0gcHJvYy5zdGRvdXQgPz8gJyc7XG4gIGNvbnN0IHN0ZG91dFRleHQgPSB0eXBlb2Ygc3Rkb3V0ID09PSAnc3RyaW5nJyA/IHN0ZG91dCA6IHN0ZG91dC50b1N0cmluZygpO1xuICByZXR1cm4gW3Byb2Muc3RhdHVzID8/IDEsIHN0ZG91dFRleHQudHJpbSgpXTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldFNwYXduU3luY0FyZ3MoY29tbWFuZDogc3RyaW5nLCBhcmdzOiBzdHJpbmdbXSwgY3dkOiBzdHJpbmcpOiBbc3RyaW5nLCBzdHJpbmdbXSwgU3Bhd25TeW5jT3B0aW9uc10ge1xuICBjb25zdCBlbnYgPSB7IC4uLnByb2Nlc3MuZW52IH07XG4gIGlmIChlbnYuUEFUSCAmJiBlbnYuQkVSUllfQklOX0ZPTERFUikge1xuICAgIGVudi5QQVRIID0gZW52LlBBVEguc3BsaXQoJzonKVxuICAgICAgLmZpbHRlcigocCkgPT4gcCAhPT0gZW52LkJFUlJZX0JJTl9GT0xERVIpXG4gICAgICAuam9pbignOicpO1xuICB9XG5cbiAgcmV0dXJuIFtcbiAgICBjb21tYW5kLFxuICAgIGFyZ3MsXG4gICAge1xuICAgICAgY3dkLFxuICAgICAgZW52LFxuICAgICAgZW5jb2Rpbmc6ICd1dGY4JyxcbiAgICAgIHNoZWxsOiBmYWxzZSxcbiAgICAgIHN0ZGlvOiAnaW5oZXJpdCcsXG4gICAgfSxcbiAgXTtcbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBmc3AgZnJvbSAnbm9kZTpmcy9wcm9taXNlcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgeyBlc2NhcGVSZWdFeHAgfSBmcm9tICdAd2lsbGJvb3N0ZXIvc2hhcmVkLWxpYi9zcmMnO1xuaW1wb3J0IHsgZ2xvYklnbm9yZSB9IGZyb20gJ0B3aWxsYm9vc3Rlci9zaGFyZWQtbGliLW5vZGUvc3JjJztcbmltcG9ydCBmZyBmcm9tICdmYXN0LWdsb2InO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlSnNvbiB9IGZyb20gJ3R5cGUtZmVzdCc7XG5pbXBvcnQgeyB6IH0gZnJvbSAnem9kJztcblxuaW1wb3J0IHsgZ2V0T2N0b2tpdCwgZ2l0SHViVXRpbCB9IGZyb20gJy4vdXRpbHMvZ2l0aHViVXRpbC5qcyc7XG5pbXBvcnQgeyBqc29uY1V0aWwgfSBmcm9tICcuL3V0aWxzL2pzb25jVXRpbC5qcyc7XG5pbXBvcnQgeyBjbGFzc2lmeVNjcmlwdFNlZ21lbnQsIHNwbGl0U2NyaXB0U2VnbWVudHMgfSBmcm9tICcuL3V0aWxzL21hbmFnZWRTY3JpcHRTZWdtZW50LmpzJztcbmltcG9ydCB7IHNwYXduU3luY0FuZFJldHVyblN0ZG91dCB9IGZyb20gJy4vdXRpbHMvc3Bhd25VdGlsLmpzJztcbmltcG9ydCB7IGdldFdvcmtzcGFjZVBhY2thZ2VKc29uUGF0aHMsIGdldFdvcmtzcGFjZVN1YkRpclBhdGhzIH0gZnJvbSAnLi91dGlscy93b3Jrc3BhY2VVdGlsLmpzJztcblxuZXhwb3J0IGludGVyZmFjZSBQYWNrYWdlQ29uZmlnIHtcbiAgZGlyUGF0aDogc3RyaW5nO1xuICBkb2NrZXJmaWxlOiBzdHJpbmc7XG4gIGlzUm9vdDogYm9vbGVhbjtcbiAgaXNQdWJsaWNSZXBvOiBib29sZWFuO1xuICAvLyBXaGV0aGVyIGlzUHVibGljUmVwbyBjb21lcyBmcm9tIGFuIGFjdHVhbCBHaXRIdWIgQVBJIHJlc3BvbnNlOiBhIGZhaWxlZCBsb29rdXAgKG9mZmxpbmUsXG4gIC8vIHJhdGUtbGltaXRlZCwgYmFkIGNyZWRlbnRpYWwpIGNvbGxhcHNlcyB0byBpc1B1YmxpY1JlcG89ZmFsc2UsIHdoaWNoIHZpc2liaWxpdHktc2Vuc2l0aXZlXG4gIC8vIGdlbmVyYXRvcnMgbXVzdCBub3QgbWlzdGFrZSBmb3IgYSBjb25maXJtZWQgcHJpdmF0ZSByZXBvc2l0b3J5LlxuICBpc1JlcG9WaXNpYmlsaXR5S25vd246IGJvb2xlYW47XG4gIGlzUmVmZXJyZWRCeU90aGVyUmVwbzogYm9vbGVhbjtcbiAgcmVwb3NpdG9yeT86IHN0cmluZztcbiAgcmVwb0F1dGhvcj86IHN0cmluZztcbiAgcmVwb05hbWU/OiBzdHJpbmc7XG4gIGlzV2lsbEJvb3N0ZXJSZXBvOiBib29sZWFuO1xuICBpc0Nsb3VkZmxhcmU6IGJvb2xlYW47XG4gIGRvZXNDb250YWluV3JhbmdsZXJDb25maWc6IGJvb2xlYW47XG4gIGlzUmFpbHdheTogYm9vbGVhbjtcbiAgaXNFc21QYWNrYWdlOiBib29sZWFuO1xuICBpc1dpbGxCb29zdGVyQ29uZmlnczogYm9vbGVhbjtcbiAgLyoqIERpcmVjdG9yaWVzIGNvbnRhaW5pbmcgQ2FyZ28udG9tbCAocmVsYXRpdmUgdG8gZGlyUGF0aCwgcm9vdC1tb3N0IGZpcnN0KS4gRW1wdHkgaWYgdGhlIHJlcG8gaGFzIG5vIFJ1c3QgY29kZS4gKi9cbiAgY2FyZ29Ub21sRGlyUGF0aHM6IHN0cmluZ1tdO1xuICBkb2VzQ29udGFpblN1YlBhY2thZ2VKc29uczogYm9vbGVhbjtcbiAgZG9lc0NvbnRhaW5Eb2NrZXJmaWxlOiBib29sZWFuO1xuICBkb2VzQ29udGFpbkdlbWZpbGU6IGJvb2xlYW47XG4gIGRvZXNDb250YWluR29Nb2Q6IGJvb2xlYW47XG4gIGRvZXNDb250YWluUGFja2FnZUpzb246IGJvb2xlYW47XG4gIGRvZXNDb250YWluUG9ldHJ5TG9jazogYm9vbGVhbjtcbiAgZG9lc0NvbnRhaW5VdkxvY2s6IGJvb2xlYW47XG4gIC8qKiBXaGV0aGVyIGEgUHl0aG9uIGxvY2tmaWxlIChwb2V0cnkubG9jayAvIHV2LmxvY2spIGV4aXN0cyBhbnl3aGVyZSBpbiB0aGUgZGlyZWN0b3J5IHRyZWUuICovXG4gIGRvZXNDb250YWluUHl0aG9uTG9ja0FueXdoZXJlOiBib29sZWFuO1xuICBkb2VzQ29udGFpblBvbVhtbDogYm9vbGVhbjtcbiAgLyoqIFdoZXRoZXIgYSBNYXZlbiBwb20ueG1sIGV4aXN0cyBhbnl3aGVyZSBpbiB0aGUgZGlyZWN0b3J5IHRyZWUuICovXG4gIGRvZXNDb250YWluUG9tWG1sQW55d2hlcmU6IGJvb2xlYW47XG4gIGRvZXNDb250YWluUHVic3BlY1lhbWw6IGJvb2xlYW47XG4gIC8qKiBXaGV0aGVyIGEgU2xpZGV2IGRlY2sgKGAqLnNsaWRldi5tZGApIGV4aXN0cyBhbnl3aGVyZSBpbiB0aGUgZGlyZWN0b3J5IHRyZWUuICovXG4gIGRvZXNDb250YWluU2xpZGV2TWQ6IGJvb2xlYW47XG4gIGRvZXNDb250YWluVGF1cmlDb25maWc6IGJvb2xlYW47XG4gIGRvZXNDb250YWluVGF1cmlDb25maWdJblBhY2thZ2VzOiBib29sZWFuO1xuICBkb2VzQ29udGFpblRlbXBsYXRlWWFtbDogYm9vbGVhbjtcbiAgZG9lc0NvbnRhaW5Wc2NvZGVTZXR0aW5nc0pzb246IGJvb2xlYW47XG4gIGRvZXNDb250YWluSmF2YVNjcmlwdDogYm9vbGVhbjtcbiAgZG9lc0NvbnRhaW5UeXBlU2NyaXB0OiBib29sZWFuO1xuICBkb2VzQ29udGFpbkpzeE9yVHN4OiBib29sZWFuO1xuICBkb2VzQ29udGFpbkphdmE6IGJvb2xlYW47XG4gIGRvZXNDb250YWluSmF2YVNjcmlwdEluUGFja2FnZXM6IGJvb2xlYW47XG4gIGRvZXNDb250YWluVHlwZVNjcmlwdEluUGFja2FnZXM6IGJvb2xlYW47XG4gIGRvZXNDb250YWluSnN4T3JUc3hJblBhY2thZ2VzOiBib29sZWFuO1xuICBkb2VzQ29udGFpbkphdmFJblBhY2thZ2VzOiBib29sZWFuO1xuXG4gIGRlcGVuZGluZzoge1xuICAgIGJsaXR6OiBib29sZWFuO1xuICAgIGZpcmViYXNlOiBib29sZWFuO1xuICAgIGdlbkkxOG5UczogYm9vbGVhbjtcbiAgICBsaXRlc3RyZWFtOiBib29sZWFuO1xuICAgIG5leHQ6IGJvb2xlYW47XG4gICAgcGxheXdyaWdodFRlc3Q6IGJvb2xlYW47XG4gICAgcGxheXdyaWdodFJ1bnRpbWU6IGJvb2xlYW47XG4gICAgcHJpc21hOiBib29sZWFuO1xuICAgIHB5cmlnaHQ6IGJvb2xlYW47XG4gICAgcmVhY3Q6IGJvb2xlYW47XG4gICAgcmVhY3ROYXRpdmU6IGJvb2xlYW47XG4gICAgc2VtYW50aWNSZWxlYXNlOiBib29sZWFuO1xuICAgIHNsaWRldjogYm9vbGVhbjtcbiAgICBzdG9yeWJvb2s6IGJvb2xlYW47XG4gICAgdGF1cmk6IGJvb2xlYW47XG4gICAgdmluZXh0OiBib29sZWFuO1xuICAgIHZpdGU6IGJvb2xlYW47XG4gICAgd2I6IGJvb2xlYW47XG4gICAgY2hha3JhOiBib29sZWFuO1xuICAgIGRyaXp6bGU6IGJvb2xlYW47XG4gIH07XG4gIHJlbGVhc2U6IHtcbiAgICBicmFuY2hlczogc3RyaW5nW107XG4gICAgZ2l0aHViOiBib29sZWFuO1xuICAgIG5wbTogYm9vbGVhbjtcbiAgICAvKipcbiAgICAgKiBBbiBleHBsaWNpdCBgQHNlbWFudGljLXJlbGVhc2UvbnBtYCBwbHVnaW4gZW50cnkgcHVibGlzaGVzIHRoZSByb290IG1hbmlmZXN0IGl0c2VsZlxuICAgICAqIChubyBwa2dSb290IHJlZGlyZWN0aW9uIGFuZCBucG1QdWJsaXNoIG5vdCBkaXNhYmxlZCkuXG4gICAgICovXG4gICAgbnBtUHVibGlzaGVzUm9vdDogYm9vbGVhbjtcbiAgfTtcbiAgbWlzZVRhc2tzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+O1xuICBwYWNrYWdlSnNvbj86IFBhY2thZ2VKc29uO1xuICB3YmZ5SnNvbj86IFdiZnlKc29uO1xufVxuXG50eXBlIFdiZnlKc29uID0gei5pbmZlcjx0eXBlb2Ygd2JmeUpzb25TY2hlbWE+O1xuXG5jb25zdCB3YmZ5SnNvblNjaGVtYSA9IHoub2JqZWN0KHtcbiAgdHlwb3M6IHpcbiAgICAub2JqZWN0KHtcbiAgICAgIGFsbDogei5yZWNvcmQoei5zdHJpbmcoKSwgei5zdHJpbmcoKSkub3B0aW9uYWwoKSxcbiAgICAgIGRvYzogei5yZWNvcmQoei5zdHJpbmcoKSwgei5zdHJpbmcoKSkub3B0aW9uYWwoKSxcbiAgICAgIHRzOiB6LnJlY29yZCh6LnN0cmluZygpLCB6LnN0cmluZygpKS5vcHRpb25hbCgpLFxuICAgICAgdGV4dDogei5yZWNvcmQoei5zdHJpbmcoKSwgei5zdHJpbmcoKSkub3B0aW9uYWwoKSxcbiAgICB9KVxuICAgIC5vcHRpb25hbCgpLFxufSk7XG5cbi8qKlxuICogVGhlIHNlbWFudGljLXJlbGVhc2UgY29uZmlnIGZpbGVzIHdiZnkgZXhwZWN0cywgaW4gY29zbWljb25maWcncyByZXNvbHV0aW9uIG9yZGVyICh0aGUgbGVhZGluZ1xuICogcGFja2FnZS5qc29uIGVudHJ5IGlzIGNoZWNrZWQgYnkgdGhlIGNhbGxlcikuIHdiZnkgZ2VuZXJhdGVzIC5yZWxlYXNlcmMuanNvbjsgdGhlIG90aGVyIHNwZWxsaW5nc1xuICogYXJlIGxpc3RlZCBvbmx5IHRvIGRldGVjdCBhIGhhbmQtd3JpdHRlbiBjb25maWcsIHdob3NlIGZvcm1hdCBKU09OLnBhcnNlIGNhbm5vdCByZWFkIGFuZCB3aG9zZVxuICogcGx1Z2luIGxpc3QgaXMgdGhlcmVmb3JlIHN0YXRpY2FsbHkgdW5pbnNwZWN0YWJsZS5cbiAqL1xuY29uc3Qgc2VtYW50aWNSZWxlYXNlQ29uZmlnU2VhcmNoUGxhY2VzOiB7IGZpbGVOYW1lOiBzdHJpbmc7IGpzb25QYXJzZWFibGU6IGJvb2xlYW4gfVtdID0gW1xuICB7IGZpbGVOYW1lOiAnLnJlbGVhc2VyYycsIGpzb25QYXJzZWFibGU6IHRydWUgfSxcbiAgeyBmaWxlTmFtZTogJy5yZWxlYXNlcmMuanNvbicsIGpzb25QYXJzZWFibGU6IHRydWUgfSxcbiAgeyBmaWxlTmFtZTogJy5yZWxlYXNlcmMueWFtbCcsIGpzb25QYXJzZWFibGU6IGZhbHNlIH0sXG4gIHsgZmlsZU5hbWU6ICcucmVsZWFzZXJjLnltbCcsIGpzb25QYXJzZWFibGU6IGZhbHNlIH0sXG4gIHsgZmlsZU5hbWU6ICcucmVsZWFzZXJjLmpzJywganNvblBhcnNlYWJsZTogZmFsc2UgfSxcbiAgeyBmaWxlTmFtZTogJ3JlbGVhc2UuY29uZmlnLmpzJywganNvblBhcnNlYWJsZTogZmFsc2UgfSxcbl07XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZXRQYWNrYWdlQ29uZmlnKFxuICBkaXJQYXRoOiBzdHJpbmcsXG4gIG9wdGlvbnM/OiB7IGlzUm9vdD86IGJvb2xlYW4gfVxuKTogUHJvbWlzZTxQYWNrYWdlQ29uZmlnIHwgdW5kZWZpbmVkPiB7XG4gIGNvbnN0IHBhY2thZ2VKc29uUGF0aCA9IHBhdGgucmVzb2x2ZShkaXJQYXRoLCAncGFja2FnZS5qc29uJyk7XG4gIHRyeSB7XG4gICAgY29uc3QgZG9lc0NvbnRhaW5QYWNrYWdlSnNvbiA9IGZzLmV4aXN0c1N5bmMocGFja2FnZUpzb25QYXRoKTtcbiAgICBsZXQgZGVwZW5kZW5jaWVzOiBQYWNrYWdlSnNvblsnZGVwZW5kZW5jaWVzJ10gPSB7fTtcbiAgICBsZXQgZGV2RGVwZW5kZW5jaWVzOiBQYWNrYWdlSnNvblsnZGV2RGVwZW5kZW5jaWVzJ10gPSB7fTtcbiAgICBsZXQgcGFja2FnZUpzb246IFBhY2thZ2VKc29uID0ge307XG4gICAgbGV0IGVzbVBhY2thZ2UgPSBmYWxzZTtcbiAgICBpZiAoZG9lc0NvbnRhaW5QYWNrYWdlSnNvbikge1xuICAgICAgY29uc3QgcGFja2FnZUpzb25UZXh0ID0gZnMucmVhZEZpbGVTeW5jKHBhY2thZ2VKc29uUGF0aCwgJ3V0ZjgnKTtcbiAgICAgIHBhY2thZ2VKc29uID0gSlNPTi5wYXJzZShwYWNrYWdlSnNvblRleHQpIGFzIFBhY2thZ2VKc29uO1xuICAgICAgZGVwZW5kZW5jaWVzID0gcGFja2FnZUpzb24uZGVwZW5kZW5jaWVzID8/IHt9O1xuICAgICAgZGV2RGVwZW5kZW5jaWVzID0gcGFja2FnZUpzb24uZGV2RGVwZW5kZW5jaWVzID8/IHt9O1xuICAgICAgZXNtUGFja2FnZSA9IHBhY2thZ2VKc29uLnR5cGUgPT09ICdtb2R1bGUnO1xuICAgIH1cblxuICAgIGxldCByZWxlYXNlQnJhbmNoZXM6IHN0cmluZ1tdID0gW107XG4gICAgbGV0IHJlbGVhc2VQbHVnaW5zOiBzdHJpbmdbXSA9IFtdO1xuICAgIGxldCByZWxlYXNlUGx1Z2luc0FyZUV4cGxpY2l0ID0gZmFsc2U7XG4gICAgbGV0IHJlbGVhc2VOcG1QbHVnaW5QdWJsaXNoZXNSb290ID0gZmFsc2U7XG4gICAgLy8gVGhlIEZJUlNUIGV4aXN0aW5nIHNlYXJjaCBwbGFjZSB3aW5zIChjb3NtaWNvbmZpZyBzaG9ydC1jaXJjdWl0cyksIHNvIGEgSlMvWUFNTC9UUyBjb25maWdcbiAgICAvLyBvciBhbiBgZXh0ZW5kc2AgcHJlc2V0IG1ha2VzIHRoZSBlZmZlY3RpdmUgcGx1Z2luIGxpc3Qgc3RhdGljYWxseSB1bmluc3BlY3RhYmxlIChtaXJyb3JzXG4gICAgLy8gcmVhZEV4cGxpY2l0U2VtYW50aWNSZWxlYXNlUGx1Z2lucyBpbiB3YidzIHJlbGVhc2UudHMpLiBUcmVhdGluZyBpdCBhcyB1bmtub3duIGtlZXBzXG4gICAgLy8gYHJlbGVhc2UubnBtYCBjb25zZXJ2YXRpdmVseSB0cnVlLCBzbyBhcHBseVBhY2thZ2VKc29uQ29udmVudGlvbnMgbmV2ZXIgZm9yY2VzXG4gICAgLy8gYHByaXZhdGU6IHRydWVgIG9uIGEgbW9ub3JlcG8gdGhhdCBhY3R1YWxseSBwdWJsaXNoZXMgdG8gbnBtLlxuICAgIGxldCByZWxlYXNlUGx1Z2luc0FyZVVua25vd24gPSBmYWxzZTtcbiAgICB0cnkge1xuICAgICAgdHlwZSBSZWxlYXNlQ29uZmlnID1cbiAgICAgICAgfCB7XG4gICAgICAgICAgICBicmFuY2hlcz86IHVua25vd247XG4gICAgICAgICAgICBwbHVnaW5zPzogKHN0cmluZyB8IFtzdHJpbmcsIFJlY29yZDxzdHJpbmcsIHVua25vd24+XSlbXTtcbiAgICAgICAgICAgIGV4dGVuZHM/OiB1bmtub3duO1xuICAgICAgICAgIH1cbiAgICAgICAgfCB1bmRlZmluZWQ7XG4gICAgICAvLyBjb3NtaWNvbmZpZyBzZWFyY2hlcyBwYWNrYWdlLmpzb24ncyBgcmVsZWFzZWAga2V5IEJFRk9SRSBhbnkgcmMvY29uZmlnIGZpbGVcbiAgICAgIC8vIChzZW1hbnRpYy1yZWxlYXNlIDI1IGRlbGVnYXRlcyB0byBjb3NtaWNvbmZpZyA5J3MgZGVmYXVsdCBzZWFyY2hQbGFjZXMpLlxuICAgICAgbGV0IHJlbGVhc2VDb25maWcgPSAocGFja2FnZUpzb24gYXMgeyByZWxlYXNlPzogUmVsZWFzZUNvbmZpZyB9KS5yZWxlYXNlO1xuICAgICAgaWYgKHJlbGVhc2VDb25maWcgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICBmb3IgKGNvbnN0IHsgZmlsZU5hbWUsIGpzb25QYXJzZWFibGUgfSBvZiBzZW1hbnRpY1JlbGVhc2VDb25maWdTZWFyY2hQbGFjZXMpIHtcbiAgICAgICAgICBjb25zdCByZWxlYXNlcmNQYXRoID0gcGF0aC5yZXNvbHZlKGRpclBhdGgsIGZpbGVOYW1lKTtcbiAgICAgICAgICBpZiAoIWZzLmV4aXN0c1N5bmMocmVsZWFzZXJjUGF0aCkpIGNvbnRpbnVlO1xuICAgICAgICAgIGlmICghanNvblBhcnNlYWJsZSkge1xuICAgICAgICAgICAgcmVsZWFzZVBsdWdpbnNBcmVVbmtub3duID0gdHJ1ZTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgICAvLyBgLnJlbGVhc2VyY2AgYW5kIGAuY29uZmlnL3JlbGVhc2VyY2AgbWF5IGFsc28gaG9sZCBZQU1MOyBhIEpTT04ucGFyc2UgZmFpbHVyZSBsYW5kc1xuICAgICAgICAgIC8vIGluIHRoZSBjYXRjaCBiZWxvdyBhbmQgbWFya3MgdGhlIHBsdWdpbiBsaXN0IHVua25vd24gaW5zdGVhZCBvZiBzaWxlbnRseSByZXBvcnRpbmdcbiAgICAgICAgICAvLyBcIm5vIHBsdWdpbnNcIi5cbiAgICAgICAgICByZWxlYXNlQ29uZmlnID0gSlNPTi5wYXJzZShhd2FpdCBmc3AucmVhZEZpbGUocmVsZWFzZXJjUGF0aCwgJ3V0ZjgnKSkgYXMgUmVsZWFzZUNvbmZpZztcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgLy8gc2VtYW50aWMtcmVsZWFzZSBhY2NlcHRzIGEgc2NhbGFyIGJyYW5jaCBvciBicmFuY2ggb2JqZWN0cyAoeyBuYW1lLCBwcmVyZWxlYXNlLCAuLi4gfSk7XG4gICAgICAvLyBub3JtYWxpemUgdG8gcGxhaW4gYnJhbmNoIG5hbWVzIGZvciBjb25zdW1lcnMgc3VjaCBhcyB0aGUgd29ya2Zsb3cgZ2VuZXJhdG9yLlxuICAgICAgY29uc3QgcmF3QnJhbmNoZXMgPSByZWxlYXNlQ29uZmlnPy5icmFuY2hlcztcbiAgICAgIHJlbGVhc2VCcmFuY2hlcyA9IChBcnJheS5pc0FycmF5KHJhd0JyYW5jaGVzKSA/IHJhd0JyYW5jaGVzIDogcmF3QnJhbmNoZXMgPT09IHVuZGVmaW5lZCA/IFtdIDogW3Jhd0JyYW5jaGVzXSlcbiAgICAgICAgLm1hcCgoYnJhbmNoOiB1bmtub3duKSA9PlxuICAgICAgICAgIHR5cGVvZiBicmFuY2ggPT09ICdzdHJpbmcnID8gYnJhbmNoIDogKGJyYW5jaCBhcyB7IG5hbWU/OiB1bmtub3duIH0gfCB1bmRlZmluZWQpPy5uYW1lXG4gICAgICAgIClcbiAgICAgICAgLmZpbHRlcigoYnJhbmNoTmFtZSk6IGJyYW5jaE5hbWUgaXMgc3RyaW5nID0+IHR5cGVvZiBicmFuY2hOYW1lID09PSAnc3RyaW5nJyk7XG4gICAgICBpZiAoQXJyYXkuaXNBcnJheShyZWxlYXNlQ29uZmlnPy5wbHVnaW5zKSkge1xuICAgICAgICByZWxlYXNlUGx1Z2luc0FyZUV4cGxpY2l0ID0gdHJ1ZTtcbiAgICAgICAgZm9yIChjb25zdCBwbHVnaW5FbnRyeSBvZiByZWxlYXNlQ29uZmlnLnBsdWdpbnMpIHtcbiAgICAgICAgICBjb25zdCBbcGx1Z2luTmFtZSwgcGx1Z2luT3B0aW9uc10gPSBBcnJheS5pc0FycmF5KHBsdWdpbkVudHJ5KSA/IHBsdWdpbkVudHJ5IDogW3BsdWdpbkVudHJ5LCB1bmRlZmluZWRdO1xuICAgICAgICAgIGlmICh0eXBlb2YgcGx1Z2luTmFtZSAhPT0gJ3N0cmluZycpIGNvbnRpbnVlO1xuICAgICAgICAgIHJlbGVhc2VQbHVnaW5zLnB1c2gocGx1Z2luTmFtZSk7XG4gICAgICAgICAgaWYgKHBsdWdpbk5hbWUgIT09ICdAc2VtYW50aWMtcmVsZWFzZS9ucG0nKSBjb250aW51ZTtcbiAgICAgICAgICAvLyBXaXRoIHBrZ1Jvb3QgdGhlIHBsdWdpbiBwdWJsaXNoZXMgYW5vdGhlciBtYW5pZmVzdCAoaXQgcmVzb2x2ZXMgcGtnUm9vdCBhZ2FpbnN0IHRoZVxuICAgICAgICAgIC8vIHJlcG8gcm9vdCwgc28gYC5gIGFuZCBgLi9gIGJvdGggbWVhbiB0aGUgcm9vdCBpdHNlbGYpLCBhbmQgbnBtUHVibGlzaDogZmFsc2VcbiAgICAgICAgICAvLyBkaXNhYmxlcyBwdWJsaXNoaW5nIGVudGlyZWx5OyBvbmx5IHRoZSByZW1haW5pbmcgc2hhcGUgcHJvdmVzIHRoZSBST09UIGlzIHB1Ymxpc2hlZC5cbiAgICAgICAgICBjb25zdCBwa2dSb290ID0gcGx1Z2luT3B0aW9ucz8ucGtnUm9vdDtcbiAgICAgICAgICBjb25zdCBwdWJsaXNoZXNSb290ID1cbiAgICAgICAgICAgIHBsdWdpbk9wdGlvbnM/Lm5wbVB1Ymxpc2ggIT09IGZhbHNlICYmXG4gICAgICAgICAgICAocGtnUm9vdCA9PT0gdW5kZWZpbmVkIHx8XG4gICAgICAgICAgICAgICh0eXBlb2YgcGtnUm9vdCA9PT0gJ3N0cmluZycgJiYgcGF0aC5yZXNvbHZlKGRpclBhdGgsIHBrZ1Jvb3QpID09PSBwYXRoLnJlc29sdmUoZGlyUGF0aCkpKTtcbiAgICAgICAgICByZWxlYXNlTnBtUGx1Z2luUHVibGlzaGVzUm9vdCB8fD0gcHVibGlzaGVzUm9vdDtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChyZWxlYXNlQ29uZmlnICYmIHJlbGVhc2VDb25maWcuZXh0ZW5kcyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHJlbGVhc2VQbHVnaW5zQXJlVW5rbm93biA9IHRydWU7XG4gICAgICB9XG4gICAgfSBjYXRjaCB7XG4gICAgICByZWxlYXNlUGx1Z2luc0FyZVVua25vd24gPSB0cnVlO1xuICAgIH1cbiAgICAvLyBXaXRob3V0IGFuIGV4cGxpY2l0IHBsdWdpbiBsaXN0LCBzZW1hbnRpYy1yZWxlYXNlJ3MgZGVmYXVsdCBsaXN0IGFwcGxpZXMsIHdoaWNoIGluY2x1ZGVzXG4gICAgLy8gQHNlbWFudGljLXJlbGVhc2UvbnBtIGFuZCBAc2VtYW50aWMtcmVsZWFzZS9naXRodWIgKG1pcnJvcnMgcmVsZWFzZVB1Ymxpc2hlc1RvTnBtIGluIHdiJ3NcbiAgICAvLyByZWxlYXNlLnRzKS5cbiAgICBjb25zdCB1c2VzU2VtYW50aWNSZWxlYXNlID0gISEoXG4gICAgICBkZXZEZXBlbmRlbmNpZXNbJ3NlbWFudGljLXJlbGVhc2UnXSB8fFxuICAgICAgcmVsZWFzZUJyYW5jaGVzLmxlbmd0aCA+IDAgfHxcbiAgICAgIHJlbGVhc2VQbHVnaW5zLmxlbmd0aCA+IDAgfHxcbiAgICAgIHJlbGVhc2VQbHVnaW5zQXJlVW5rbm93blxuICAgICk7XG5cbiAgICAvLyBUaGUgY2FsbGVyIG1heSBjbGFzc2lmeSBleHBsaWNpdGx5IChpbmRleC50cyBwYXNzZXMgZmFsc2UgZm9yIGV2ZXJ5IGRpc2NvdmVyZWQgd29ya3NwYWNlLFxuICAgIC8vIGluY2x1ZGluZyBub24tcGFja2FnZXMvKiBsYXlvdXRzIHN1Y2ggYXMgYXBwcy8qKTsgdGhlIGhldXJpc3RpYyBjbGFzc2lmaWVzIHRoZSBDTEkgZW50cnlcbiAgICAvLyBwYXRoIGl0c2VsZiwgc28gYHdiZnkgPHJlcG8+L3BhY2thZ2VzLzxhcHA+YCBhbmQgYHdiZnkgPHJlcG8+L2FwcHMvPGFwcD5gIGtlZXAgdGhlaXIgY2hpbGRcbiAgICAvLyBjbGFzc2lmaWNhdGlvbi5cbiAgICBjb25zdCBpc1Jvb3QgPSBvcHRpb25zPy5pc1Jvb3QgPz8gIWlzV29ya3NwYWNlT2ZFbmNsb3NpbmdSb290KGRpclBhdGgpO1xuXG4gICAgbGV0IHJlcG9JbmZvOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB8IHVuZGVmaW5lZDtcbiAgICAvLyBGZXRjaCB2aXNpYmlsaXR5IGZvciB0aGUgQ0xJIGVudHJ5IGV2ZW4gd2hlbiBpdCBpcyBhIHdvcmtzcGFjZSBjaGlsZCAoYHdiZnlcbiAgICAvLyA8cmVwbz4vcGFja2FnZXMvPGFwcD5gKTogZ2VuZXJhdG9ycyByZWFkIGlzUHVibGljUmVwbyBmcm9tIHRoZWlyIHJvb3RDb25maWcgcGFyYW1ldGVyLFxuICAgIC8vIHdoaWNoIElTIHRoZSBjaGlsZCBjb25maWcgaW4gdGhhdCBpbnZvY2F0aW9uLCBzbyBhIHN0dWIgYGZhbHNlYCB0aGVyZSB3b3VsZCBkcm9wIHRoZVxuICAgIC8vIHB1YmxpYy1yZXBvIHB1Ymxpc2hDb25maWcgaGFuZGxpbmcuIERpc2NvdmVyZWQgY2hpbGRyZW4gKG9wdGlvbnMuaXNSb290ID09PSBmYWxzZSkgc3RpbGxcbiAgICAvLyBza2lwIHRoZSBmZXRjaCDigJQgdGhleSBpbmhlcml0IHRoZSBlbmNsb3Npbmcgcm9vdCdzIHZpc2liaWxpdHkgdmlhIHJvb3RDb25maWcgaW5zdGVhZC5cbiAgICBpZiAob3B0aW9ucz8uaXNSb290ICE9PSBmYWxzZSkge1xuICAgICAgcmVwb0luZm8gPSBhd2FpdCBmZXRjaFJlcG9JbmZvKGRpclBhdGgsIHBhY2thZ2VKc29uKTtcbiAgICB9XG5cbiAgICBsZXQgZG9ja2VyZmlsZSA9ICcnO1xuICAgIHRyeSB7XG4gICAgICBkb2NrZXJmaWxlID0gYXdhaXQgZnNwLnJlYWRGaWxlKHBhdGgucmVzb2x2ZShkaXJQYXRoLCAnRG9ja2VyZmlsZScpLCAndXRmOCcpO1xuICAgIH0gY2F0Y2gge1xuICAgICAgLy8gZG8gbm90aGluZ1xuICAgIH1cblxuICAgIGNvbnN0IHdiZnlKc29uUGF0aCA9IHBhdGgucmVzb2x2ZShkaXJQYXRoLCAnd2JmeS5qc29uJyk7XG4gICAgbGV0IHdiZnlKc29uOiBXYmZ5SnNvbiB8IHVuZGVmaW5lZDtcbiAgICB0cnkge1xuICAgICAgY29uc3Qgd2JmeUpzb25UZXh0ID0gYXdhaXQgZnNwLnJlYWRGaWxlKHdiZnlKc29uUGF0aCwgJ3V0ZjgnKTtcbiAgICAgIHdiZnlKc29uID0gd2JmeUpzb25TY2hlbWEucGFyc2UoSlNPTi5wYXJzZSh3YmZ5SnNvblRleHQpKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIGRvIG5vdGhpbmdcbiAgICB9XG5cbiAgICBjb25zdCByZXBvRnVsbE5hbWUgPSB0eXBlb2YgcmVwb0luZm8/LmZ1bGxfbmFtZSA9PT0gJ3N0cmluZycgPyByZXBvSW5mby5mdWxsX25hbWUgOiB1bmRlZmluZWQ7XG4gICAgbGV0IHJlcG9BdXRob3I6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgICBsZXQgcmVwb05hbWU6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgICBpZiAocmVwb0Z1bGxOYW1lKSB7XG4gICAgICBjb25zdCByZXBvUGFydHMgPSByZXBvRnVsbE5hbWUuc3BsaXQoJy8nKTtcbiAgICAgIGlmIChyZXBvUGFydHMubGVuZ3RoID49IDIpIHtcbiAgICAgICAgcmVwb0F1dGhvciA9IHJlcG9QYXJ0c1swXTtcbiAgICAgICAgcmVwb05hbWUgPSByZXBvUGFydHNbMV07XG4gICAgICB9XG4gICAgfVxuICAgIC8vIE9ubHkgdGhlIHJvb3QgZmV0Y2hlcyByZXBvIGluZm8sIGFuZCB0aGF0IGZldGNoIG5lZWRzIG5ldHdvcmsgYW5kIGEgdG9rZW4sIHNvIGlkZW50aXR5LWRlcml2ZWRcbiAgICAvLyBmbGFncyBiZWxvdyB3b3VsZCBvdGhlcndpc2UgYmUgZmFsc2UgZm9yIGV2ZXJ5IHdvcmtzcGFjZSBwYWNrYWdlIGFuZCBmb3IgZXZlcnkgb2ZmbGluZSBvclxuICAgIC8vIHJhdGUtbGltaXRlZCBydW4uIFRoZSBnaXQgcmVtb3RlIGFuc3dlcnMgdGhlIHNhbWUgcXVlc3Rpb24gbG9jYWxseSwgZm9yIGV2ZXJ5IHBhY2thZ2UuXG4gICAgaWYgKCFyZXBvQXV0aG9yIHx8ICFyZXBvTmFtZSkge1xuICAgICAgW3JlcG9BdXRob3IsIHJlcG9OYW1lXSA9IGF3YWl0IHJlc29sdmVMb2NhbFJlcG9JZGVudGl0eShkaXJQYXRoLCBwYWNrYWdlSnNvbik7XG4gICAgfVxuICAgIC8vIEJ1aWx0IGZyb20gdGhlIFJFU09MVkVEIGlkZW50aXR5IHNvIHdvcmtzcGFjZSBwYWNrYWdlcyBhbmQgb2ZmbGluZSBydW5zIGFsc28gZ2V0IGl0OyBjb25zdW1lcnMgZGVyaXZlXG4gICAgLy8gdGhlIG93bmVyIGZyb20gdGhpcyBmaWVsZCAoZS5nLiB0byBzZXQgYGF1dGhvcmApLlxuICAgIGNvbnN0IHJlcG9zaXRvcnkgPSByZXBvQXV0aG9yICYmIHJlcG9OYW1lID8gYGdpdGh1Yjoke3JlcG9BdXRob3J9LyR7cmVwb05hbWV9YCA6IHVuZGVmaW5lZDtcbiAgICAvLyBUYXVyaSBvZmZpY2lhbGx5IHN1cHBvcnRzIEpTT04sIEpTT041LCBhbmQgVE9NTCBjb25maWd1cmF0aW9uIGZvcm1hdHMuXG4gICAgY29uc3QgZG9lc0NvbnRhaW5UYXVyaUNvbmZpZyA9IFsndGF1cmkuY29uZi5qc29uJywgJ3RhdXJpLmNvbmYuanNvbjUnLCAnVGF1cmkudG9tbCddLnNvbWUoKGZpbGVOYW1lKSA9PlxuICAgICAgZnMuZXhpc3RzU3luYyhwYXRoLnJlc29sdmUoZGlyUGF0aCwgJ3NyYy10YXVyaScsIGZpbGVOYW1lKSlcbiAgICApO1xuICAgIC8vIFJvb3QtbGV2ZWwgXCJJblBhY2thZ2VzXCIgc2lnbmFscyBtdXN0IHNlZSBldmVyeSBkZWNsYXJlZCB3b3Jrc3BhY2UgbGF5b3V0IChlLmcuIGFwcHMvKiksIG5vdFxuICAgIC8vIGp1c3QgdGhlIGNvbnZlbnRpb25hbCBwYWNrYWdlcy8qIGRpcmVjdG9yeSwgc28gc2NhbiBlYWNoIGRpc2NvdmVyZWQgd29ya3NwYWNlIGRpcmVjdG9yeS5cbiAgICBjb25zdCB3b3Jrc3BhY2VTdWJEaXJQYXRocyA9IGdldFdvcmtzcGFjZVN1YkRpclBhdGhzKHtcbiAgICAgIGRpclBhdGgsXG4gICAgICBwYWNrYWdlSnNvbixcbiAgICAgIGRvZXNDb250YWluU3ViUGFja2FnZUpzb25zOiBjb250YWluc0FueSgncGFja2FnZXMvKi9wYWNrYWdlLmpzb24nLCBkaXJQYXRoKSxcbiAgICB9KTtcbiAgICBjb25zdCBjb250YWluc0FueUluV29ya3NwYWNlcyA9IChwYXR0ZXJuOiBzdHJpbmcpOiBib29sZWFuID0+XG4gICAgICB3b3Jrc3BhY2VTdWJEaXJQYXRocy5zb21lKCh3b3Jrc3BhY2VTdWJEaXJQYXRoKSA9PiBjb250YWluc0FueShwYXR0ZXJuLCB3b3Jrc3BhY2VTdWJEaXJQYXRoKSk7XG4gICAgY29uc3QgZG9lc0NvbnRhaW5XcmFuZ2xlckNvbmZpZyA9IGRldGVjdFdyYW5nbGVyQ29uZmlnKGRpclBhdGgpO1xuICAgIGNvbnN0IHdvcmtmbG93Q29udGVudHMgPSByZWFkV29ya2Zsb3dGaWxlQ29udGVudHMoZGlyUGF0aCk7XG4gICAgY29uc3QgaW1wb3J0c1BsYXl3cmlnaHRBdFJ1bnRpbWUgPSBkZXRlY3RQbGF5d3JpZ2h0UnVudGltZUltcG9ydChkaXJQYXRoKTtcbiAgICBjb25zdCBjb25maWc6IFBhY2thZ2VDb25maWcgPSB7XG4gICAgICBkaXJQYXRoLFxuICAgICAgZG9ja2VyZmlsZSxcbiAgICAgIGlzUm9vdCxcbiAgICAgIGlzUHVibGljUmVwbzogcmVwb0luZm8/LnByaXZhdGUgPT09IGZhbHNlLFxuICAgICAgaXNSZXBvVmlzaWJpbGl0eUtub3duOiB0eXBlb2YgcmVwb0luZm8/LnByaXZhdGUgPT09ICdib29sZWFuJyxcbiAgICAgIGlzUmVmZXJyZWRCeU90aGVyUmVwbzogISFwYWNrYWdlSnNvbi5maWxlcyxcbiAgICAgIHJlcG9zaXRvcnksXG4gICAgICByZXBvQXV0aG9yLFxuICAgICAgcmVwb05hbWUsXG4gICAgICBpc1dpbGxCb29zdGVyUmVwbzogQm9vbGVhbihcbiAgICAgICAgcmVwb3NpdG9yeT8uc3RhcnRzV2l0aCgnZ2l0aHViOldpbGxCb29zdGVyLycpIHx8IHJlcG9zaXRvcnk/LnN0YXJ0c1dpdGgoJ2dpdGh1YjpXaWxsQm9vc3RlckxhYi8nKVxuICAgICAgKSxcbiAgICAgIGlzQ2xvdWRmbGFyZTogZGV0ZWN0Q2xvdWRmbGFyZShwYWNrYWdlSnNvbiwgZG9lc0NvbnRhaW5XcmFuZ2xlckNvbmZpZywgd29ya2Zsb3dDb250ZW50cyksXG4gICAgICBkb2VzQ29udGFpbldyYW5nbGVyQ29uZmlnLFxuICAgICAgaXNSYWlsd2F5OiBkZXRlY3RSYWlsd2F5KGRpclBhdGgsIHBhY2thZ2VKc29uLCB3b3JrZmxvd0NvbnRlbnRzKSxcbiAgICAgIGlzRXNtUGFja2FnZTogZXNtUGFja2FnZSxcbiAgICAgIGlzV2lsbEJvb3N0ZXJDb25maWdzOiBkZXRlY3RJc1dpbGxCb29zdGVyQ29uZmlncyhkaXJQYXRoLCBwYWNrYWdlSnNvblBhdGgsIHJlcG9OYW1lKSxcbiAgICAgIGNhcmdvVG9tbERpclBhdGhzOiBmaW5kQ2FyZ29Ub21sRGlyUGF0aHMoZGlyUGF0aCksXG4gICAgICAvLyBBbHNvIGhvbm9yIGRlY2xhcmVkIHdvcmtzcGFjZSBwYXR0ZXJucyBiZXlvbmQgcGFja2FnZXMvKiAoZS5nLiBhcHBzLyopOiB0cmVhdGluZyBhblxuICAgICAgLy8gYXBwcy8qLW9ubHkgbW9ub3JlcG8gYXMgYSBwbGFpbiBwYWNrYWdlIHdvdWxkIGRlbGV0ZSBpdHMgYHdvcmtzcGFjZXNgIGRlY2xhcmF0aW9uIGluXG4gICAgICAvLyBnZW5lcmF0ZVBhY2thZ2VKc29uIGFuZCBza2lwIG1vbm9yZXBvLW9ubHkgY29udmVudGlvbnMgc3VjaCBhcyByb290IGBwcml2YXRlOiB0cnVlYC5cbiAgICAgIGRvZXNDb250YWluU3ViUGFja2FnZUpzb25zOiBjb250YWluc0FueSgncGFja2FnZXMvKiovcGFja2FnZS5qc29uJywgZGlyUGF0aCkgfHwgd29ya3NwYWNlU3ViRGlyUGF0aHMubGVuZ3RoID4gMCxcbiAgICAgIGRvZXNDb250YWluRG9ja2VyZmlsZTogISFkb2NrZXJmaWxlIHx8IGZzLmV4aXN0c1N5bmMocGF0aC5yZXNvbHZlKGRpclBhdGgsICdkb2NrZXItY29tcG9zZS55bWwnKSksXG4gICAgICBkb2VzQ29udGFpbkdlbWZpbGU6IGZzLmV4aXN0c1N5bmMocGF0aC5yZXNvbHZlKGRpclBhdGgsICdHZW1maWxlJykpLFxuICAgICAgZG9lc0NvbnRhaW5Hb01vZDogZnMuZXhpc3RzU3luYyhwYXRoLnJlc29sdmUoZGlyUGF0aCwgJ2dvLm1vZCcpKSxcbiAgICAgIGRvZXNDb250YWluUGFja2FnZUpzb24sXG4gICAgICBkb2VzQ29udGFpblBvZXRyeUxvY2s6IGZzLmV4aXN0c1N5bmMocGF0aC5yZXNvbHZlKGRpclBhdGgsICdwb2V0cnkubG9jaycpKSxcbiAgICAgIGRvZXNDb250YWluVXZMb2NrOiBmcy5leGlzdHNTeW5jKHBhdGgucmVzb2x2ZShkaXJQYXRoLCAndXYubG9jaycpKSxcbiAgICAgIC8vIFJlY3Vyc2l2ZSBsaWtlIGRvZXNDb250YWluSmF2YTogbXVsdGktbGFuZ3VhZ2UgcmVwb3NpdG9yaWVzIGtlZXAgbGFuZ3VhZ2UgZGlyZWN0b3JpZXNcbiAgICAgIC8vIChlLmcuIFB5dGhvbiB0b29saW5nIG9yIE1hdmVuIG1vZHVsZXMpIG91dHNpZGUgdGhlIHJvb3QgYW5kIG91dHNpZGUgZGVjbGFyZWQgd29ya3NwYWNlcy5cbiAgICAgIGRvZXNDb250YWluUHl0aG9uTG9ja0FueXdoZXJlOiBjb250YWluc0FueSgnKiove3BvZXRyeS5sb2NrLHV2LmxvY2t9JywgZGlyUGF0aCksXG4gICAgICBkb2VzQ29udGFpblBvbVhtbDogZnMuZXhpc3RzU3luYyhwYXRoLnJlc29sdmUoZGlyUGF0aCwgJ3BvbS54bWwnKSksXG4gICAgICBkb2VzQ29udGFpblBvbVhtbEFueXdoZXJlOiBjb250YWluc0FueSgnKiovcG9tLnhtbCcsIGRpclBhdGgpLFxuICAgICAgZG9lc0NvbnRhaW5QdWJzcGVjWWFtbDogZnMuZXhpc3RzU3luYyhwYXRoLnJlc29sdmUoZGlyUGF0aCwgJ3B1YnNwZWMueWFtbCcpKSxcbiAgICAgIGRvZXNDb250YWluU2xpZGV2TWQ6IGNvbnRhaW5zQW55KCcqKi8qLnNsaWRldi5tZCcsIGRpclBhdGgpLFxuICAgICAgZG9lc0NvbnRhaW5UYXVyaUNvbmZpZyxcbiAgICAgIGRvZXNDb250YWluVGF1cmlDb25maWdJblBhY2thZ2VzOiBjb250YWluc0FueUluV29ya3NwYWNlcyhcbiAgICAgICAgJ3NyYy10YXVyaS97dGF1cmkuY29uZi5qc29uLHRhdXJpLmNvbmYuanNvbjUsVGF1cmkudG9tbH0nXG4gICAgICApLFxuICAgICAgZG9lc0NvbnRhaW5UZW1wbGF0ZVlhbWw6IGZzLmV4aXN0c1N5bmMocGF0aC5yZXNvbHZlKGRpclBhdGgsICd0ZW1wbGF0ZS55YW1sJykpLFxuICAgICAgZG9lc0NvbnRhaW5Wc2NvZGVTZXR0aW5nc0pzb246IGZzLmV4aXN0c1N5bmMocGF0aC5yZXNvbHZlKGRpclBhdGgsICcudnNjb2RlJywgJ3NldHRpbmdzLmpzb24nKSksXG4gICAgICBkb2VzQ29udGFpbkphdmFTY3JpcHQ6IGNvbnRhaW5zQW55KCd7YXBwLHNyYyx0ZXN0LHNjcmlwdHN9LyoqLyoue2NqcyxtanMsanMsanN4fScsIGRpclBhdGgpLFxuICAgICAgZG9lc0NvbnRhaW5UeXBlU2NyaXB0OiBjb250YWluc0FueSgne2FwcCxzcmMsdGVzdCxzY3JpcHRzfS8qKi8qLntjdHMsbXRzLHRzLHRzeH0nLCBkaXJQYXRoKSxcbiAgICAgIGRvZXNDb250YWluSnN4T3JUc3g6IGNvbnRhaW5zQW55KCd7YXBwLHNyYyx0ZXN0fS8qKi8qLnt0LGp9c3gnLCBkaXJQYXRoKSxcbiAgICAgIGRvZXNDb250YWluSmF2YTogY29udGFpbnNBbnkoJyoqLyouamF2YScsIGRpclBhdGgpLFxuICAgICAgZG9lc0NvbnRhaW5KYXZhU2NyaXB0SW5QYWNrYWdlczogY29udGFpbnNBbnlJbldvcmtzcGFjZXMoJ3thcHAsc3JjLHRlc3Qsc2NyaXB0c30vKiovKi57Y2pzLG1qcyxqcyxqc3h9JyksXG4gICAgICBkb2VzQ29udGFpblR5cGVTY3JpcHRJblBhY2thZ2VzOiBjb250YWluc0FueUluV29ya3NwYWNlcygne2FwcCxzcmMsdGVzdCxzY3JpcHRzfS8qKi8qLntjdHMsbXRzLHRzLHRzeH0nKSxcbiAgICAgIGRvZXNDb250YWluSnN4T3JUc3hJblBhY2thZ2VzOiBjb250YWluc0FueUluV29ya3NwYWNlcygne2FwcCxzcmMsdGVzdH0vKiovKi57dCxqfXN4JyksXG4gICAgICBkb2VzQ29udGFpbkphdmFJblBhY2thZ2VzOiBjb250YWluc0FueUluV29ya3NwYWNlcygnKiovKi5qYXZhJyksXG4gICAgICBkZXBlbmRpbmc6IHtcbiAgICAgICAgYmxpdHo6ICEhZGVwZW5kZW5jaWVzLmJsaXR6LFxuICAgICAgICBjaGFrcmE6ICEhZGV2RGVwZW5kZW5jaWVzWydAY2hha3JhLXVpL2NsaSddLFxuICAgICAgICBkcml6emxlOiAhIWRlcGVuZGVuY2llc1snZHJpenpsZS1vcm0nXSB8fCAhIWRldkRlcGVuZGVuY2llc1snZHJpenpsZS1raXQnXSxcbiAgICAgICAgZmlyZWJhc2U6ICEhZGV2RGVwZW5kZW5jaWVzWydmaXJlYmFzZS10b29scyddLFxuICAgICAgICBnZW5JMThuVHM6ICEhZGVwZW5kZW5jaWVzWydnZW4taTE4bi10cyddIHx8ICEhZGV2RGVwZW5kZW5jaWVzWydnZW4taTE4bi10cyddLFxuICAgICAgICBsaXRlc3RyZWFtOiBkb2NrZXJmaWxlLmluY2x1ZGVzKCdpbnN0YWxsLWxpdGVzdHJlYW0uc2gnKSxcbiAgICAgICAgcmVhY3Q6ICEhZGVwZW5kZW5jaWVzLnJlYWN0LFxuICAgICAgICBuZXh0OiAhIWRlcGVuZGVuY2llcy5uZXh0LFxuICAgICAgICBwbGF5d3JpZ2h0VGVzdDpcbiAgICAgICAgICAhIWRlcGVuZGVuY2llc1snQHBsYXl3cmlnaHQvdGVzdCddIHx8ICEhZGV2RGVwZW5kZW5jaWVzWydAcGxheXdyaWdodC90ZXN0J10gfHwgISFkZXZEZXBlbmRlbmNpZXMucGxheXdyaWdodCxcbiAgICAgICAgcGxheXdyaWdodFJ1bnRpbWU6IGltcG9ydHNQbGF5d3JpZ2h0QXRSdW50aW1lLFxuICAgICAgICBwcmlzbWE6ICEhZGVwZW5kZW5jaWVzWydAcHJpc21hL2NsaWVudCddIHx8ICEhZGV2RGVwZW5kZW5jaWVzLnByaXNtYSxcbiAgICAgICAgcHlyaWdodDogISFkZXZEZXBlbmRlbmNpZXMucHlyaWdodCxcbiAgICAgICAgcmVhY3ROYXRpdmU6ICEhZGVwZW5kZW5jaWVzWydyZWFjdC1uYXRpdmUnXSxcbiAgICAgICAgc2VtYW50aWNSZWxlYXNlOiB1c2VzU2VtYW50aWNSZWxlYXNlLFxuICAgICAgICBzbGlkZXY6ICEhZGVwZW5kZW5jaWVzWydAc2xpZGV2L2NsaSddIHx8ICEhZGV2RGVwZW5kZW5jaWVzWydAc2xpZGV2L2NsaSddLFxuICAgICAgICBzdG9yeWJvb2s6ICEhZGV2RGVwZW5kZW5jaWVzWydAc3Rvcnlib29rL3JlYWN0J10sXG4gICAgICAgIHRhdXJpOlxuICAgICAgICAgICEhZGVwZW5kZW5jaWVzWydAdGF1cmktYXBwcy9hcGknXSB8fFxuICAgICAgICAgICEhZGV2RGVwZW5kZW5jaWVzWydAdGF1cmktYXBwcy9hcGknXSB8fFxuICAgICAgICAgICEhZGVwZW5kZW5jaWVzWydAdGF1cmktYXBwcy9jbGknXSB8fFxuICAgICAgICAgICEhZGV2RGVwZW5kZW5jaWVzWydAdGF1cmktYXBwcy9jbGknXSB8fFxuICAgICAgICAgIGRvZXNDb250YWluVGF1cmlDb25maWcsXG4gICAgICAgIHZpbmV4dDogISFkZXBlbmRlbmNpZXMudmluZXh0IHx8ICEhZGV2RGVwZW5kZW5jaWVzLnZpbmV4dCxcbiAgICAgICAgdml0ZTogISFkZXBlbmRlbmNpZXMudml0ZSB8fCAhIWRldkRlcGVuZGVuY2llcy52aXRlLFxuICAgICAgICB3YjogISFkZXBlbmRlbmNpZXNbJ0B3aWxsYm9vc3Rlci93YiddIHx8ICEhZGV2RGVwZW5kZW5jaWVzWydAd2lsbGJvb3N0ZXIvd2InXSxcbiAgICAgIH0sXG4gICAgICByZWxlYXNlOiB7XG4gICAgICAgIGJyYW5jaGVzOiByZWxlYXNlQnJhbmNoZXMsXG4gICAgICAgIGdpdGh1YjogcmVsZWFzZVBsdWdpbnNBcmVFeHBsaWNpdFxuICAgICAgICAgID8gcmVsZWFzZVBsdWdpbnMuaW5jbHVkZXMoJ0BzZW1hbnRpYy1yZWxlYXNlL2dpdGh1YicpIHx8IHJlbGVhc2VQbHVnaW5zQXJlVW5rbm93blxuICAgICAgICAgIDogdXNlc1NlbWFudGljUmVsZWFzZSxcbiAgICAgICAgbnBtOiByZWxlYXNlUGx1Z2luc0FyZUV4cGxpY2l0XG4gICAgICAgICAgPyByZWxlYXNlUGx1Z2lucy5pbmNsdWRlcygnQHNlbWFudGljLXJlbGVhc2UvbnBtJykgfHwgcmVsZWFzZVBsdWdpbnNBcmVVbmtub3duXG4gICAgICAgICAgOiB1c2VzU2VtYW50aWNSZWxlYXNlLFxuICAgICAgICBucG1QdWJsaXNoZXNSb290OiByZWxlYXNlTnBtUGx1Z2luUHVibGlzaGVzUm9vdCxcbiAgICAgIH0sXG4gICAgICBtaXNlVGFza3M6IGF3YWl0IHJlYWRNaXNlVGFza3MoZGlyUGF0aCksXG4gICAgICBwYWNrYWdlSnNvbixcbiAgICAgIHdiZnlKc29uLFxuICAgIH07XG4gICAgaWYgKFxuICAgICAgY29uZmlnLmRvZXNDb250YWluR2VtZmlsZSB8fFxuICAgICAgY29uZmlnLmRvZXNDb250YWluR29Nb2QgfHxcbiAgICAgIGNvbmZpZy5kb2VzQ29udGFpblBhY2thZ2VKc29uIHx8XG4gICAgICBjb25maWcuZG9lc0NvbnRhaW5Qb2V0cnlMb2NrIHx8XG4gICAgICBjb25maWcuZG9lc0NvbnRhaW5VdkxvY2sgfHxcbiAgICAgIGNvbmZpZy5kb2VzQ29udGFpblBvbVhtbCB8fFxuICAgICAgY29uZmlnLmRvZXNDb250YWluUHVic3BlY1lhbWwgfHxcbiAgICAgIGNvbmZpZy5kb2VzQ29udGFpblRhdXJpQ29uZmlnIHx8XG4gICAgICBjb25maWcuZG9lc0NvbnRhaW5UZW1wbGF0ZVlhbWwgfHxcbiAgICAgIC8vIEEgcmVwb3NpdG9yeSBjYW4gbGVnaXRpbWF0ZWx5IGNvbnRhaW4gb25seSBkb2N1bWVudGF0aW9uLiBJdHMgR2l0IG1ldGFkYXRhIGlzIGVub3VnaCB0b1xuICAgICAgLy8gZXN0YWJsaXNoIHRoYXQgdGhlIENMSSB0YXJnZXQgaXMgYSBwcm9qZWN0IHJvb3Q7IHJlcXVpcmluZyBhIGxhbmd1YWdlIG1hbmlmZXN0IGhlcmUgd291bGRcbiAgICAgIC8vIG1ha2Ugd2JmeSB1bmFibGUgdG8gY3JlYXRlIHRoZSBwYWNrYWdlLmpzb24gdGhhdCBpdCBtYW5hZ2VzIGZvciBzdWNoIHJlcG9zaXRvcmllcy4gQm90aFxuICAgICAgLy8gb3JkaW5hcnkgY2hlY2tvdXRzIChgLmdpdGAgZGlyZWN0b3J5KSBhbmQgd29ya3RyZWVzIChgLmdpdGAgZmlsZSkgc2F0aXNmeSB0aGlzIGNoZWNrLlxuICAgICAgKGNvbmZpZy5pc1Jvb3QgJiYgZnMuZXhpc3RzU3luYyhwYXRoLnJlc29sdmUoZGlyUGF0aCwgJy5naXQnKSkpXG4gICAgKSB7XG4gICAgICByZXR1cm4gY29uZmlnO1xuICAgIH1cbiAgfSBjYXRjaCB7XG4gICAgLy8gZG8gbm90aGluZ1xuICB9XG59XG5cbi8qKlxuICogVGVsbHMgd2hldGhlciB3YmZ5IG1hbmFnZXMgd29ya2VyLWNvbmZpZ3VyYXRpb24uZC50cyBmb3IgdGhlIHBhY2thZ2UuIFRoZSBmaWxlIGlzIGdpdGlnbm9yZWQgYW5kIHVudHJhY2tlZFxuICogYmVjYXVzZSB0aGUgYHdiIGdlbi1jb2RlYCBwb3N0aW5zdGFsbCByZWdlbmVyYXRlcyBpdCBvbiBldmVyeSBpbnN0YWxsLCBzbyB0aGUgcGFja2FnZSBoYXMgdG8gb3duIGEgd3JhbmdsZXJcbiAqIGNvbmZpZyAoYHdyYW5nbGVyIHR5cGVzYCBleGl0cyBub24temVybyB3aXRob3V0IG9uZSksIHRvIGRlcGVuZCBvbiB3cmFuZ2xlciAoYSBwYWNrYWdlIGRlcGxveWluZyB2aWEgYVxuICogQ0kgYWN0aW9uIGNhbm5vdCByZXNvbHZlIHRoZSBjb21tYW5kKSwgYW5kIHRvIGNvbnN1bWUgdGhlIGdlbmVyYXRlZCBmaWxlLlxuICpcbiAqIElOVkFSSUFOVCDigJQgdGhpcyBkZWNpc2lvbiBtdXN0IGNvbnZlcmdlIGFjcm9zcyBtYWNoaW5lcyBob2xkaW5nIHRoZSBzYW1lIGNvbW1pdC4gSXQgbXVzdCBORVZFUiBjb25zdWx0XG4gKiBnaXRpZ25vcmVkIGZpbGVzIChgLmRldi52YXJzKmAsIGAuZW52KmAsIC4uLiksIHdoaWNoIGB3YiBzdGFydGAgYW5kIGB3YiBkZXBsb3lgIGNyZWF0ZSByb3V0aW5lbHkgYW5kIHdoaWNoXG4gKiB0aGVyZWZvcmUgc3RheSB1bnRyYWNrZWQgb24gZGV2IG1hY2hpbmVzIGZvcmV2ZXI6IGEgZm9ybWVyIGNoZWNrIHRoYXQgdHJlYXRlZCB0aGVtIGFzIGlycmVwcm9kdWNpYmxlIGlucHV0c1xuICogbWFkZSB3YmZ5IHJ1bnMgb24gZGV2IG1hY2hpbmVzIHJlLXRyYWNrIHRoZSB+MTVrLWxpbmUgZ2VuZXJhdGVkIGZpbGUgdGhhdCBydW5zIGZyb20gY2xlYW4gY2hlY2tvdXRzIGhhZFxuICogdW50cmFja2VkLCBvc2NpbGxhdGluZyBldGVybmFsbHkgKGUuZy4gYWktZ2FtZS1idWlsZGVyICM2ODQg4oaSICM3NDYpLiBSZWFkaW5nIGNvbW1pdHRhYmxlIHJlcG9zaXRvcnkgZmlsZXNcbiAqIGZyb20gdGhlIHdvcmtpbmcgdHJlZSAodGhlIHdyYW5nbGVyIGNvbmZpZywgcGFja2FnZS5qc29uLCB0c2NvbmZpZyDigJQgYXMgZXZlcnkgd2JmeSBnZW5lcmF0b3IgZG9lcykgaXMgZmluZTpcbiAqIGFueSBkaXZlcmdlbmNlIHRoZXJlIGlzIHRyYW5zaWVudCBhbmQgZGlzYXBwZWFycyBvbmNlIHRoZSBmaWxlIGlzIGNvbW1pdHRlZCBvciByZW1vdmVkLlxuICogVGhlIGhhemFyZCB0aGF0IGNoZWNrIGd1YXJkZWQgYWdhaW5zdCBubyBsb25nZXIgZXhpc3RzOiBgd2IgZ2VuLWNvZGVgIHJ1bnMgYHdyYW5nbGVyIHR5cGVzIC0tZW52LWZpbGVgIHdpdGhcbiAqIGEga2V5IHN0dWIgZGVyaXZlZCBzb2xlbHkgZnJvbSB0aGUgY29tbWl0dGVkIGZub3gudG9tbCAoc2VlIHdiJ3Mgd3JpdGVXb3JrZXJUeXBlc0VudlN0dWIpLCBzbyBsb2NhbCBkb3RlbnZcbiAqIGZpbGVzIG5ldmVyIGluZmx1ZW5jZSB0aGUgZ2VuZXJhdGVkIGBFbnZgLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2VuZXJhdGVzV29ya2VyVHlwZXMoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogYm9vbGVhbiB7XG4gIGNvbnN0IHBhY2thZ2VKc29uID0gY29uZmlnLnBhY2thZ2VKc29uO1xuICByZXR1cm4gY29uZmlnLmRvZXNDb250YWluV3JhbmdsZXJDb25maWcgJiYgaGFzV3JhbmdsZXJEZXBlbmRlbmN5KHBhY2thZ2VKc29uKSAmJiBjb25zdW1lc0dlbmVyYXRlZFdvcmtlclR5cGVzKGNvbmZpZyk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRXb3JrZXJUeXBlc1NjcmlwdEVycm9yKGNvbmZpZzogUGljazxQYWNrYWdlQ29uZmlnLCAncGFja2FnZUpzb24nPik6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IHNjcmlwdHMgPSBjb25maWcucGFja2FnZUpzb24/LnNjcmlwdHMgPz8ge307XG4gIGZvciAoY29uc3QgW25hbWUsIHNjcmlwdF0gb2YgT2JqZWN0LmVudHJpZXMoc2NyaXB0cykpIHtcbiAgICBpZiAoc2NyaXB0ID09PSB1bmRlZmluZWQpIGNvbnRpbnVlO1xuICAgIGNvbnN0IHNlZ21lbnRzID0gc3BsaXRTY3JpcHRTZWdtZW50cyhzY3JpcHQpO1xuICAgIGNvbnN0IGhhc05vbkNhbm9uaWNhbFdiR2VuQ29kZSA9IHNlZ21lbnRzPy5zb21lKChzZWdtZW50KSA9PiB7XG4gICAgICBjb25zdCBub3JtYWxpemVkID0gc2VnbWVudC50cmltKCkucmVwbGFjZUFsbCgvXFxzKy9ndSwgJyAnKTtcbiAgICAgIHJldHVybiAoXG4gICAgICAgIC9eKD86KD86YnVufGJ1bngpKD86IC0tYnVuKT8oPzogcnVuKT8gKT93YiBnZW4tY29kZSQvdS50ZXN0KG5vcm1hbGl6ZWQpICYmXG4gICAgICAgIGNsYXNzaWZ5U2NyaXB0U2VnbWVudChzZWdtZW50LCBzY3JpcHRzLCB0cnVlKSA9PT0gJ2N1c3RvbSdcbiAgICAgICk7XG4gICAgfSk7XG4gICAgaWYgKGhhc05vbkNhbm9uaWNhbFdiR2VuQ29kZSkgcmV0dXJuIGAke25hbWV9IG11c3QgdXNlIHRoZSBjYW5vbmljYWwgYnVuIHdiIGdlbi1jb2RlIGNvbW1hbmRgO1xuICB9XG4gIC8vIE9ubHkgYGJ1biBydW4gPHNjcmlwdD5gIGlzIHJlY29nbml6ZWQgYXMgYSB3cmFwcGVyOyBhbm90aGVyIHJ1bm5lciBzcGVsbGluZyB3b3VsZCBnZXQgYSBtYW5hZ2VkXG4gIC8vIGdlbmVyYXRpb24gYXBwZW5kZWQgbmV4dCB0byBpdCBhbmQgcnVuIGV2ZXJ5IGdlbmVyYXRvciB0d2ljZSBwZXIgaW5zdGFsbC4gV2l0aG91dCBhIGdlbi1jb2RlXG4gIC8vIHBpcGVsaW5lIG5vdGhpbmcgaXMgYXBwZW5kZWQsIHNvIHRoZSBzcGVsbGluZyBpcyBpcnJlbGV2YW50IHRoZXJlLlxuICBmb3IgKGNvbnN0IHNlZ21lbnQgb2Ygc3BsaXRTY3JpcHRTZWdtZW50cyhzY3JpcHRzLnBvc3RpbnN0YWxsID8/ICcnKSA/PyBbXSkge1xuICAgIGNvbnN0IHNjcmlwdE5hbWUgPSAvXig/OmJ1bnxidW54KSg/OlxccystLWJ1bik/KD86XFxzK3J1bik/XFxzKyhcXFMrKSQvdS5leGVjKHNlZ21lbnQpPy5bMV07XG4gICAgY29uc3QgdGFyZ2V0ID0gc2NyaXB0TmFtZSA9PT0gdW5kZWZpbmVkID8gdW5kZWZpbmVkIDogc2NyaXB0c1tzY3JpcHROYW1lXTtcbiAgICBpZiAoXG4gICAgICB0YXJnZXQgIT09IHVuZGVmaW5lZCAmJlxuICAgICAgc2VnbWVudCAhPT0gYGJ1biBydW4gJHtzY3JpcHROYW1lfWAgJiZcbiAgICAgIChzY3JpcHRzWydnZW4tY29kZSddICE9PSB1bmRlZmluZWQgfHwgdGFyZ2V0LmluY2x1ZGVzKCd3YiBnZW4tY29kZScpKVxuICAgICkge1xuICAgICAgcmV0dXJuIGBwb3N0aW5zdGFsbCBtdXN0IGludm9rZSB0aGUgJHtzY3JpcHROYW1lfSBzY3JpcHQgYXMgYnVuIHJ1biAke3NjcmlwdE5hbWV9YDtcbiAgICB9XG4gIH1cbiAgaWYgKFxuICAgIC8oPzpefCYmKVxccyooPzpucG18bnB4fHBucG18eWFybilcXHMrKD86cnVuKD86LXNjcmlwdCk/XFxzKyk/KD86Z2VuLWNvZGV8d2JcXHMrZ2VuLWNvZGUpXFxzKig/OiYmfCQpL3UudGVzdChcbiAgICAgIHNjcmlwdHMucG9zdGluc3RhbGwgPz8gJydcbiAgICApXG4gICkge1xuICAgIHJldHVybiAncG9zdGluc3RhbGwgbXVzdCB1c2UgYnVuIHdiIGdlbi1jb2RlIGluc3RlYWQgb2YgYSBub24tQnVuIGdlbi1jb2RlIHJ1bm5lcic7XG4gIH1cbiAgZm9yIChjb25zdCBbbmFtZSwgc2NyaXB0XSBvZiBPYmplY3QuZW50cmllcyhzY3JpcHRzKSkge1xuICAgIGlmIChzY3JpcHQgPT09IHVuZGVmaW5lZCkgY29udGludWU7XG4gICAgaWYgKHdyYW5nbGVyVHlwZXNUZXh0UGF0dGVybi50ZXN0KHNjcmlwdCkpIHJldHVybiBgJHtuYW1lfSBtdXN0IHVzZSBidW4gd2IgZ2VuLWNvZGUgaW5zdGVhZCBvZiB3cmFuZ2xlciB0eXBlc2A7XG4gIH1cbn1cblxuZnVuY3Rpb24gaGFzV3JhbmdsZXJEZXBlbmRlbmN5KHBhY2thZ2VKc29uOiBQYWNrYWdlSnNvbiB8IHVuZGVmaW5lZCk6IGJvb2xlYW4ge1xuICByZXR1cm4gW1xuICAgIHBhY2thZ2VKc29uPy5kZXBlbmRlbmNpZXMsXG4gICAgcGFja2FnZUpzb24/LmRldkRlcGVuZGVuY2llcyxcbiAgICBwYWNrYWdlSnNvbj8ub3B0aW9uYWxEZXBlbmRlbmNpZXMsXG4gICAgcGFja2FnZUpzb24/LnBlZXJEZXBlbmRlbmNpZXMsXG4gIF0uc29tZSgoZGVwZW5kZW5jaWVzKSA9PiBkZXBlbmRlbmNpZXM/LndyYW5nbGVyICE9PSB1bmRlZmluZWQpO1xufVxuXG5jb25zdCBzaGVsbFdvcmRQYXR0ZXJuID0gU3RyaW5nLnJhd2AoPzpcIig/OlxcXFwufFteXCJcXFxcXSkqXCJ8Jyg/OlxcXFwufFteJ1xcXFxdKSonfCg/OlxcXFwufFteXFxzXCInXFxcXF0pKylgO1xuY29uc3Qgd3JhbmdsZXJPcHRpb25QYXR0ZXJuID0gU3RyaW5nLnJhd2BcXHMrLS0/W0EtWmEtel1bXFx3LV0qKD86PSR7c2hlbGxXb3JkUGF0dGVybn18XFxzKyg/IS18dHlwZXNcXGIpJHtzaGVsbFdvcmRQYXR0ZXJufSk/YDtcbmNvbnN0IHdyYW5nbGVyVHlwZXNUZXh0UGF0dGVybiA9IG5ldyBSZWdFeHAoXG4gIFN0cmluZy5yYXdgW1wiJ10/XFxid3JhbmdsZXIoPzpAW15cXHNcIiddKyk/XFxiW1wiJ10/KD86JHt3cmFuZ2xlck9wdGlvblBhdHRlcm59KSpcXHMrdHlwZXNcXGJgLFxuICAndSdcbik7XG5cbi8qKlxuICogQSBwYWNrYWdlIHdob3NlIFR5cGVTY3JpcHQgcHJvamVjdCBjYW5ub3QgaW5jbHVkZSB3b3JrZXItY29uZmlndXJhdGlvbi5kLnRzIChlLmcuIG9uZSBvbiBhIGhhbmQtbWFpbnRhaW5lZFxuICogbWluaW1hbCBgRW52YCB3aXRoIGB0eXBlczogW1wiYnVuXCJdYCwgdGhlIHN0YW5kYXJkIGVzY2FwZSB3aGVuIHRoZSBhbWJpZW50IHdyYW5nbGVyIGdsb2JhbHMgY29uZmxpY3Qgd2l0aCB0aGVcbiAqIGBAdHlwZXMvYnVuYCBnbG9iYWxzIGl0cyB0ZXN0cyBuZWVkKSBnYWlucyBub3RoaW5nIGZyb20gcmVnZW5lcmF0aW5nIHRoZSB+NTAwS0IgZmlsZSBvbiBldmVyeSBpbnN0YWxsLCBzbyB3YmZ5XG4gKiBsZWF2ZXMgc3VjaCBwYWNrYWdlcyB1bm1hbmFnZWQgaW5zdGVhZCBvZiByZS1hZGRpbmcgdGhlIGdlbmVyYXRpb24gc3RlcC4gQ29uc3VtcHRpb24gaXMgZGV0ZWN0ZWQgdHdvIHdheXM6XG4gKiBhIHRleHR1YWwgYHdvcmtlci1jb25maWd1cmF0aW9uYCByZWZlcmVuY2UgaW4gYW55IHRyYWNrZWQgZmlsZSBvZiB0aGUgcGFja2FnZSAoY292ZXJzIGltcG9ydHMsIHRyaXBsZS1zbGFzaFxuICogcmVmZXJlbmNlcywgYW5kIGV4cGxpY2l0IHRzY29uZmlnIGVudHJpZXMpLCBvciBhIGBmaWxlc2AvYGluY2x1ZGVgL2BleGNsdWRlYCBzZXQgdGhhdCBjYW4gbWF0Y2ggdGhlIGZpbGUg4oCUXG4gKiByZXNvbHZlZCB0aHJvdWdoIHJlbGF0aXZlIGBleHRlbmRzYCBjaGFpbnMgd2l0aCBlYWNoIHBhdHRlcm4ga2VwdCByZWxhdGl2ZSB0byB0aGUgY29uZmlnIHRoYXQgZGVjbGFyZWQgaXQsXG4gKiBtYXRjaGluZyB0c2MuIFdoZW5ldmVyIHRoZSBlZmZlY3RpdmUgc2V0IGNhbm5vdCBiZSBkZXRlcm1pbmVkIChtaXNzaW5nIG9yIHVucGFyc2VhYmxlIHRzY29uZmlnLCBwYWNrYWdlLW5hbWVcbiAqIGBleHRlbmRzYCBwcmVzZXRzLCBvciBUeXBlU2NyaXB0J3MgZGVmYXVsdCBgKipgIGluY2x1c2lvbiksIHRoZSBjdXJyZW50IG1hbmFnZWQgYmVoYXZpb3IgaXMga2VwdC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNvbnN1bWVzR2VuZXJhdGVkV29ya2VyVHlwZXMoY29uZmlnOiBQaWNrPFBhY2thZ2VDb25maWcsICdkaXJQYXRoJz4pOiBib29sZWFuIHtcbiAgLy8gYGdpdCBncmVwYCBzZWFyY2hlcyB0cmFja2VkIGZpbGVzIG9ubHksIHNvIHRoZSBnaXRpZ25vcmVkIGdlbmVyYXRlZCBmaWxlIGl0c2VsZiBuZXZlciBtYXRjaGVzLlxuICAvLyB3YmZ5J3Mgb3duIG1hbmFnZWQgYXJ0aWZhY3RzIGFyZSBleGNsdWRlZDogdGhlIGAuZ2l0aWdub3JlYCBydWxlIChgL3dvcmtlci1jb25maWd1cmF0aW9uLmQudHNgKVxuICAvLyB3YmZ5IGNvbW1pdHRlZCB3aGlsZSBpdCBtYW5hZ2VkIHRoZSBwYWNrYWdlIG11c3Qgbm90IGNvdW50IGFzIGNvbnN1bXB0aW9uLCBvciBhIG9uY2UtbWFuYWdlZFxuICAvLyBwYWNrYWdlIGNvdWxkIG5ldmVyIG9wdCBvdXQuXG4gIGNvbnN0IGdyZXBSZXN1bHQgPSBzcGF3blN5bmNBbmRSZXR1cm5TdGRvdXQoXG4gICAgJ2dpdCcsXG4gICAgLy8gdHNjb25maWcgZmlsZXMgYXJlIGNsYXNzaWZpZWQgYnkgdGhlIHJlc29sdmVkIGZpbGVzL2luY2x1ZGUvZXhjbHVkZSBsb2dpYyBiZWxvdyDigJQgYSB0ZXh0dWFsXG4gICAgLy8gaGl0IHRoZXJlIChlLmcuIGFuIGBleGNsdWRlYCBlbnRyeSkgbXVzdCBub3QgY291bnQgYXMgY29uc3VtcHRpb24uXG4gICAgW1xuICAgICAgJ2dyZXAnLFxuICAgICAgJy1sJyxcbiAgICAgICd3b3JrZXItY29uZmlndXJhdGlvbicsXG4gICAgICAnLS0nLFxuICAgICAgJy4nLFxuICAgICAgJzooZXhjbHVkZSkuZ2l0aWdub3JlJyxcbiAgICAgICc6KGV4Y2x1ZGUpLmdpdGF0dHJpYnV0ZXMnLFxuICAgICAgU3RyaW5nLnJhd2A6KGdsb2IsZXhjbHVkZSkqKi90c2NvbmZpZyouanNvbmAsXG4gICAgXSxcbiAgICBjb25maWcuZGlyUGF0aFxuICApO1xuICBpZiAoZ3JlcFJlc3VsdC50cmltKCkpIHJldHVybiB0cnVlO1xuXG4gIGNvbnN0IHdvcmtlclR5cGVzUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJ3dvcmtlci1jb25maWd1cmF0aW9uLmQudHMnKTtcbiAgY29uc3QgZmlsZVNldCA9IHJlc29sdmVUc2NvbmZpZ0ZpbGVTZXQocGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAndHNjb25maWcuanNvbicpLCBjb25maWcuZGlyUGF0aCwgNSk7XG4gIGlmICghZmlsZVNldCkgcmV0dXJuIHRydWU7XG4gIGNvbnN0IG1hdGNoZXMgPSAocGF0dGVyblNldDogVHNjb25maWdQYXR0ZXJuU2V0IHwgdW5kZWZpbmVkKTogYm9vbGVhbiA9PiB7XG4gICAgaWYgKCFwYXR0ZXJuU2V0IHx8ICFBcnJheS5pc0FycmF5KHBhdHRlcm5TZXQucGF0dGVybnMpKSByZXR1cm4gZmFsc2U7XG4gICAgY29uc3QgcmVsYXRpdmVQYXRoID0gcGF0aC5yZWxhdGl2ZShwYXR0ZXJuU2V0LmJhc2VEaXJQYXRoLCB3b3JrZXJUeXBlc1BhdGgpLnJlcGxhY2VBbGwoJ1xcXFwnLCAnLycpO1xuICAgIHJldHVybiBwYXR0ZXJuU2V0LnBhdHRlcm5zLnNvbWUoKHBhdHRlcm4pID0+IHtcbiAgICAgIGlmICh0eXBlb2YgcGF0dGVybiAhPT0gJ3N0cmluZycpIHJldHVybiBmYWxzZTtcbiAgICAgIC8vIGAke2NvbmZpZ0Rpcn1gLXByZWZpeGVkIHBhdHRlcm5zIHdlcmUgZXhwYW5kZWQgdG8gYWJzb2x1dGUgcGF0aHMgYXQgcmVzb2x2ZSB0aW1lLlxuICAgICAgaWYgKHBhdGguaXNBYnNvbHV0ZShwYXR0ZXJuKSkge1xuICAgICAgICByZXR1cm4gdHNjb25maWdQYXR0ZXJuQ291bGRNYXRjaFBhdGgocGF0dGVybiwgd29ya2VyVHlwZXNQYXRoLCBwYXR0ZXJuU2V0LmV4cGFuZHNEaXJlY3Rvcmllcyk7XG4gICAgICB9XG4gICAgICBpZiAocmVsYXRpdmVQYXRoLnN0YXJ0c1dpdGgoJy4uJykpIHJldHVybiBmYWxzZTtcbiAgICAgIHJldHVybiB0c2NvbmZpZ1BhdHRlcm5Db3VsZE1hdGNoUGF0aChwYXR0ZXJuLCByZWxhdGl2ZVBhdGgsIHBhdHRlcm5TZXQuZXhwYW5kc0RpcmVjdG9yaWVzKTtcbiAgICB9KTtcbiAgfTtcbiAgLy8gYGZpbGVzYCBlbnRyaWVzIGFyZSBhbHdheXMgcGFydCBvZiB0aGUgcHJvZ3JhbSwgZXZlbiB3aGVuIGBleGNsdWRlYCBtYXRjaGVzIHRoZW0uXG4gIGlmIChtYXRjaGVzKGZpbGVTZXQuZmlsZXMpKSByZXR1cm4gdHJ1ZTtcbiAgaWYgKG1hdGNoZXMoZmlsZVNldC5leGNsdWRlKSkgcmV0dXJuIGZhbHNlO1xuICAvLyBOZWl0aGVyIGluY2x1ZGUgbm9yIGZpbGVzIGRlY2xhcmVkOiBUeXBlU2NyaXB0J3MgZGVmYXVsdCBgKipgIGluY2x1c2lvbiBjb3ZlcnMgdGhlIGZpbGUuXG4gIGlmICghZmlsZVNldC5pbmNsdWRlICYmICFmaWxlU2V0LmZpbGVzKSByZXR1cm4gdHJ1ZTtcbiAgcmV0dXJuIG1hdGNoZXMoZmlsZVNldC5pbmNsdWRlKTtcbn1cblxuaW50ZXJmYWNlIFRzY29uZmlnUGF0dGVyblNldCB7XG4gIC8qKiBEaXJlY3Rvcnkgb2YgdGhlIGNvbmZpZyB0aGF0IGRlY2xhcmVkIHRoZSBwYXR0ZXJuczsgdHNjIHJlc29sdmVzIHRoZW0gcmVsYXRpdmUgdG8gaXQuICovXG4gIGJhc2VEaXJQYXRoOiBzdHJpbmc7XG4gIC8qKiBpbmNsdWRlL2V4Y2x1ZGUgdHJlYXQgYW4gZXh0ZW5zaW9ubGVzcyBub24tZ2xvYiBwYXR0ZXJuIGFzIGEgZGlyZWN0b3J5IHN1YnRyZWU7IGBmaWxlc2AgZG9lcyBub3QuICovXG4gIGV4cGFuZHNEaXJlY3RvcmllczogYm9vbGVhbjtcbiAgcGF0dGVybnM6IHVua25vd247XG59XG5cbmludGVyZmFjZSBUc2NvbmZpZ0ZpbGVTZXQge1xuICBleGNsdWRlPzogVHNjb25maWdQYXR0ZXJuU2V0O1xuICBmaWxlcz86IFRzY29uZmlnUGF0dGVyblNldDtcbiAgaW5jbHVkZT86IFRzY29uZmlnUGF0dGVyblNldDtcbn1cblxuLyoqIFJlc29sdmVzIGZpbGVzL2luY2x1ZGUvZXhjbHVkZSB0aHJvdWdoIHJlbGF0aXZlIGBleHRlbmRzYCBjaGFpbnM7IHVuZGVmaW5lZCB3aGVuIHVucmVhZGFibGUuICovXG5mdW5jdGlvbiByZXNvbHZlVHNjb25maWdGaWxlU2V0KFxuICBmaWxlUGF0aDogc3RyaW5nLFxuICBjb25zdW1lckRpclBhdGg6IHN0cmluZyxcbiAgcmVtYWluaW5nRGVwdGg6IG51bWJlclxuKTogVHNjb25maWdGaWxlU2V0IHwgdW5kZWZpbmVkIHtcbiAgaWYgKHJlbWFpbmluZ0RlcHRoIDw9IDApIHJldHVybiB1bmRlZmluZWQ7XG4gIGxldCBjb250ZW50OiBzdHJpbmc7XG4gIHRyeSB7XG4gICAgY29udGVudCA9IGZzLnJlYWRGaWxlU3luYyhmaWxlUGF0aCwgJ3V0ZjgnKTtcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuICBjb25zdCB0c2NvbmZpZyA9IGpzb25jVXRpbC5wYXJzZU9iamVjdElnbm9yaW5nRXJyb3I8e1xuICAgIGV4Y2x1ZGU/OiB1bmtub3duO1xuICAgIGV4dGVuZHM/OiB1bmtub3duO1xuICAgIGZpbGVzPzogdW5rbm93bjtcbiAgICBpbmNsdWRlPzogdW5rbm93bjtcbiAgfT4oY29udGVudCk7XG4gIGlmICghdHNjb25maWcpIHJldHVybiB1bmRlZmluZWQ7XG4gIGNvbnN0IGRpclBhdGggPSBwYXRoLmRpcm5hbWUoZmlsZVBhdGgpO1xuICAvLyBgJHtjb25maWdEaXJ9YCByZXNvbHZlcyB0byB0aGUgZGlyZWN0b3J5IG9mIHRoZSBST09UIChjb25zdW1pbmcpIGNvbmZpZywgd2hlcmV2ZXIgaXQgYXBwZWFycy5cbiAgY29uc3QgdG9QYXR0ZXJuU2V0ID0gKHBhdHRlcm5zOiB1bmtub3duLCBleHBhbmRzRGlyZWN0b3JpZXM6IGJvb2xlYW4pOiBUc2NvbmZpZ1BhdHRlcm5TZXQgfCB1bmRlZmluZWQgPT5cbiAgICBBcnJheS5pc0FycmF5KHBhdHRlcm5zKVxuICAgICAgPyB7XG4gICAgICAgICAgYmFzZURpclBhdGg6IGRpclBhdGgsXG4gICAgICAgICAgZXhwYW5kc0RpcmVjdG9yaWVzLFxuICAgICAgICAgIHBhdHRlcm5zOiBwYXR0ZXJucy5tYXAoKHBhdHRlcm4pID0+XG4gICAgICAgICAgICB0eXBlb2YgcGF0dGVybiA9PT0gJ3N0cmluZycgJiYgcGF0dGVybi5zdGFydHNXaXRoKCcke2NvbmZpZ0Rpcn0nKVxuICAgICAgICAgICAgICA/IHBhdGguam9pbihjb25zdW1lckRpclBhdGgsIHBhdHRlcm4uc2xpY2UoJyR7Y29uZmlnRGlyfScubGVuZ3RoKSlcbiAgICAgICAgICAgICAgOiBwYXR0ZXJuXG4gICAgICAgICAgKSxcbiAgICAgICAgfVxuICAgICAgOiB1bmRlZmluZWQ7XG4gIGNvbnN0IGZpbGVTZXQ6IFRzY29uZmlnRmlsZVNldCA9IHtcbiAgICBleGNsdWRlOiB0b1BhdHRlcm5TZXQodHNjb25maWcuZXhjbHVkZSwgdHJ1ZSksXG4gICAgZmlsZXM6IHRvUGF0dGVyblNldCh0c2NvbmZpZy5maWxlcywgZmFsc2UpLFxuICAgIGluY2x1ZGU6IHRvUGF0dGVyblNldCh0c2NvbmZpZy5pbmNsdWRlLCB0cnVlKSxcbiAgfTtcbiAgY29uc3QgcGFyZW50cyA9XG4gICAgdHlwZW9mIHRzY29uZmlnLmV4dGVuZHMgPT09ICdzdHJpbmcnID8gW3RzY29uZmlnLmV4dGVuZHNdIDogQXJyYXkuaXNBcnJheSh0c2NvbmZpZy5leHRlbmRzKSA/IHRzY29uZmlnLmV4dGVuZHMgOiBbXTtcbiAgLy8gV2l0aCBhbiBgZXh0ZW5kc2AgYXJyYXksIGxhdGVyIGVudHJpZXMgb3ZlcnJpZGUgZWFybGllciBvbmVzLCBhbmQgdGhlIGNoaWxkIG92ZXJyaWRlcyBhbGwg4oCUXG4gIC8vIHNvIGZpbGwgZWFjaCBzdGlsbC1taXNzaW5nIGtleSBmcm9tIHRoZSBsYXN0IHBhcmVudCB0aGF0IGRlZmluZXMgaXQuXG4gIGZvciAoY29uc3QgcGFyZW50IG9mIHBhcmVudHMudG9SZXZlcnNlZCgpKSB7XG4gICAgaWYgKGZpbGVTZXQuZXhjbHVkZSAmJiBmaWxlU2V0LmZpbGVzICYmIGZpbGVTZXQuaW5jbHVkZSkgYnJlYWs7XG4gICAgLy8gUGFja2FnZS1uYW1lIGV4dGVuZHMgKGUuZy4gYEB0c2NvbmZpZy9idW5gKSBhcmUgY29tcGlsZXJPcHRpb25zIHByZXNldHMgd2l0aG91dCBmaWxlIHNldHMuXG4gICAgaWYgKHR5cGVvZiBwYXJlbnQgIT09ICdzdHJpbmcnIHx8ICFwYXJlbnQuc3RhcnRzV2l0aCgnLicpKSBjb250aW51ZTtcbiAgICBsZXQgcGFyZW50UGF0aCA9IHBhdGgucmVzb2x2ZShkaXJQYXRoLCBwYXJlbnQpO1xuICAgIGlmICghZnMuZXhpc3RzU3luYyhwYXJlbnRQYXRoKSAmJiBmcy5leGlzdHNTeW5jKGAke3BhcmVudFBhdGh9Lmpzb25gKSkgcGFyZW50UGF0aCArPSAnLmpzb24nO1xuICAgIGNvbnN0IHBhcmVudEZpbGVTZXQgPSByZXNvbHZlVHNjb25maWdGaWxlU2V0KHBhcmVudFBhdGgsIGNvbnN1bWVyRGlyUGF0aCwgcmVtYWluaW5nRGVwdGggLSAxKTtcbiAgICBpZiAoIXBhcmVudEZpbGVTZXQpIGNvbnRpbnVlO1xuICAgIGZpbGVTZXQuZXhjbHVkZSA/Pz0gcGFyZW50RmlsZVNldC5leGNsdWRlO1xuICAgIGZpbGVTZXQuZmlsZXMgPz89IHBhcmVudEZpbGVTZXQuZmlsZXM7XG4gICAgZmlsZVNldC5pbmNsdWRlID8/PSBwYXJlbnRGaWxlU2V0LmluY2x1ZGU7XG4gIH1cbiAgcmV0dXJuIGZpbGVTZXQ7XG59XG5cbmZ1bmN0aW9uIHRzY29uZmlnUGF0dGVybkNvdWxkTWF0Y2hQYXRoKHBhdHRlcm46IHN0cmluZywgdGFyZ2V0UGF0aDogc3RyaW5nLCBleHBhbmRzRGlyZWN0b3JpZXM6IGJvb2xlYW4pOiBib29sZWFuIHtcbiAgY29uc3Qgbm9ybWFsaXplZCA9IHBhdHRlcm4ucmVwbGFjZSgvXlxcLlxcLy91LCAnJyk7XG4gIC8vIEEgYmFyZSBgLmAgaW5jbHVkZSBjb3ZlcnMgZXZlcnl0aGluZyB1bmRlciB0aGUgY29uZmlnJ3MgZGlyZWN0b3J5LlxuICBpZiAobm9ybWFsaXplZCA9PT0gJycgfHwgbm9ybWFsaXplZCA9PT0gJy4nKSByZXR1cm4gdHJ1ZTtcbiAgLy8gQWJzb2x1dGUgcGF0dGVybnMgKGV4cGFuZGVkIGAke2NvbmZpZ0Rpcn1gKSBhcmUgbWF0Y2hlZCBhZ2FpbnN0IHRoZSBhYnNvbHV0ZSB0YXJnZXQ7IGRyb3AgdGhlXG4gIC8vIGxlYWRpbmcgc2xhc2hlcyBmcm9tIGJvdGggc28gdGhlIHNlZ21lbnQtYnVpbHQgcmVnZXggYW5jaG9ycyBpZGVudGljYWxseS5cbiAgdGFyZ2V0UGF0aCA9IHRhcmdldFBhdGgucmVwbGFjZSgvXlxcLysvdSwgJycpO1xuICBjb25zdCBzZWdtZW50cyA9IG5vcm1hbGl6ZWQuc3BsaXQoJy8nKS5maWx0ZXIoKHNlZ21lbnQpID0+IHNlZ21lbnQgIT09ICcnKTtcbiAgY29uc3QgcmVnZXhTb3VyY2UgPSBzZWdtZW50c1xuICAgIC5tYXAoKHNlZ21lbnQsIGluZGV4KSA9PiB7XG4gICAgICBjb25zdCBpc0xhc3QgPSBpbmRleCA9PT0gc2VnbWVudHMubGVuZ3RoIC0gMTtcbiAgICAgIGlmIChzZWdtZW50ID09PSAnKionKSByZXR1cm4gaXNMYXN0ID8gJy4qJyA6IFN0cmluZy5yYXdgKD86W14vXSsvKSpgO1xuICAgICAgY29uc3Qgc2VnbWVudFNvdXJjZSA9IHNlZ21lbnRcbiAgICAgICAgLnJlcGxhY2VBbGwoL1suK14ke30oKXxbXFxdXFxcXF0vZ3UsIFN0cmluZy5yYXdgXFwkJmApXG4gICAgICAgIC5yZXBsYWNlQWxsKCcqJywgU3RyaW5nLnJhd2BbXi9dKmApXG4gICAgICAgIC5yZXBsYWNlQWxsKCc/JywgU3RyaW5nLnJhd2BbXi9dYCk7XG4gICAgICByZXR1cm4gaXNMYXN0ID8gc2VnbWVudFNvdXJjZSA6IGAke3NlZ21lbnRTb3VyY2V9L2A7XG4gICAgfSlcbiAgICAuam9pbignJyk7XG4gIC8vIHRzYyB0cmVhdHMgYW4gZXh0ZW5zaW9ubGVzcyBub24tZ2xvYiBpbmNsdWRlL2V4Y2x1ZGUgZW50cnkgYXMgYSBkaXJlY3Rvcnkgd2hvc2Ugc3VidHJlZSBpcyBpbmNsdWRlZC5cbiAgY29uc3QgbGFzdFNlZ21lbnQgPSBzZWdtZW50cy5hdCgtMSkgPz8gJyc7XG4gIGNvbnN0IGRpcmVjdG9yeVN1ZmZpeCA9XG4gICAgZXhwYW5kc0RpcmVjdG9yaWVzICYmICEvWyo/XS91LnRlc3QobGFzdFNlZ21lbnQpICYmICFsYXN0U2VnbWVudC5pbmNsdWRlcygnLicpID8gU3RyaW5nLnJhd2AoPzovLiopP2AgOiAnJztcbiAgcmV0dXJuIG5ldyBSZWdFeHAoYF4ke3JlZ2V4U291cmNlfSR7ZGlyZWN0b3J5U3VmZml4fSRgLCAndScpLnRlc3QodGFyZ2V0UGF0aCk7XG59XG5cbi8qKlxuICogVGVsbHMgd2hldGhlciB0aGUgZGlyZWN0b3J5IG93bnMgYSBXb3JrZXIsIHVubGlrZSB0aGUgaXNDbG91ZGZsYXJlIGhldXJpc3RpYywgd2hpY2ggYWxzbyBtYXRjaGVzIGEgcGFja2FnZSB0aGF0XG4gKiBtZXJlbHkgbWVudGlvbnMgd3JhbmdsZXIgaW4gYSBzY3JpcHQgb3Igd29ya2Zsb3cgKGUuZy4gdGhlIHJvb3Qgb2YgYSBtb25vcmVwbyB3aG9zZSBXb3JrZXIgbGl2ZXMgaW4gYSBzdWItcGFja2FnZSkuXG4gKi9cbmZ1bmN0aW9uIGRldGVjdFdyYW5nbGVyQ29uZmlnKGRpclBhdGg6IHN0cmluZyk6IGJvb2xlYW4ge1xuICByZXR1cm4gWyd3cmFuZ2xlci5qc29uYycsICd3cmFuZ2xlci5qc29uJywgJ3dyYW5nbGVyLnRvbWwnXS5zb21lKChmaWxlTmFtZSkgPT5cbiAgICBmcy5leGlzdHNTeW5jKHBhdGgucmVzb2x2ZShkaXJQYXRoLCBmaWxlTmFtZSkpXG4gICk7XG59XG5cbi8qKlxuICogRGV0ZWN0cyB3aGV0aGVyIGRpclBhdGggYmVsb25ncyB0byB0aGUgd2lsbGJvb3N0ZXItY29uZmlncyByZXBvc2l0b3J5LiBQcmVmZXJzIHRoZSBhdXRob3JpdGF0aXZlXG4gKiBHaXRIdWIgcmVwbyBuYW1lLCB3aGljaCBpcyBpbW11bmUgdG8gdGhlIGxvY2FsIGRpcmVjdG9yeSBsYXlvdXQuIFRoYXQgbmFtZSBpcyBmZXRjaGVkIG9ubHkgZm9yIHRoZVxuICogcm9vdCwgc28gc3ViLXBhY2thZ2VzIChhbmQgb2ZmbGluZSByb290cykgd2FsayB1cCB0byB0aGUgbmVhcmVzdCBnaXQgcm9vdCBhbmQgbWF0Y2ggaXRzIGRpcmVjdG9yeVxuICogbmFtZTogYSBzaWJsaW5nIHJlcG8gY2xvbmVkIHVuZGVyIGEgcGFyZW50IGRpcmVjdG9yeSBuYW1lZCB3aWxsYm9vc3Rlci1jb25maWdzIHN0b3BzIGF0IGl0cyBvd25cbiAqIGAuZ2l0YCwgc28gaXQgaXMgbm90IG1pc2NsYXNzaWZpZWQuIFRoZSBwYXRoIHNlZ21lbnQgcmVtYWlucyBhIGxhc3QgcmVzb3J0IHdoZW4gbm8gZ2l0IHJvb3QgZXhpc3RzLlxuICovXG5mdW5jdGlvbiBkZXRlY3RJc1dpbGxCb29zdGVyQ29uZmlncyhkaXJQYXRoOiBzdHJpbmcsIHBhY2thZ2VKc29uUGF0aDogc3RyaW5nLCByZXBvTmFtZTogc3RyaW5nIHwgdW5kZWZpbmVkKTogYm9vbGVhbiB7XG4gIGlmIChyZXBvTmFtZSkgcmV0dXJuIHJlcG9OYW1lLnRvTG93ZXJDYXNlKCkgPT09ICd3aWxsYm9vc3Rlci1jb25maWdzJztcbiAgbGV0IGN1cnJlbnQgPSBwYXRoLnJlc29sdmUoZGlyUGF0aCk7XG4gIHdoaWxlIChjdXJyZW50ICE9PSBwYXRoLmRpcm5hbWUoY3VycmVudCkpIHtcbiAgICBpZiAoZnMuZXhpc3RzU3luYyhwYXRoLmpvaW4oY3VycmVudCwgJy5naXQnKSkpIHtcbiAgICAgIHJldHVybiBwYXRoLmJhc2VuYW1lKGN1cnJlbnQpLnRvTG93ZXJDYXNlKCkgPT09ICd3aWxsYm9vc3Rlci1jb25maWdzJztcbiAgICB9XG4gICAgY3VycmVudCA9IHBhdGguZGlybmFtZShjdXJyZW50KTtcbiAgfVxuICByZXR1cm4gcGFja2FnZUpzb25QYXRoLnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMoJy93aWxsYm9vc3Rlci1jb25maWdzLycpO1xufVxuXG5mdW5jdGlvbiBkZXRlY3RDbG91ZGZsYXJlKFxuICBwYWNrYWdlSnNvbjogUGFja2FnZUpzb24sXG4gIGRvZXNDb250YWluV3JhbmdsZXJDb25maWc6IGJvb2xlYW4sXG4gIHdvcmtmbG93Q29udGVudHM6IHN0cmluZ1tdXG4pOiBib29sZWFuIHtcbiAgY29uc3Qgc2NyaXB0cyA9IHBhY2thZ2VKc29uLnNjcmlwdHM7XG4gIGlmIChzY3JpcHRzICYmIE9iamVjdC52YWx1ZXMoc2NyaXB0cykuc29tZSgoc2NyaXB0KSA9PiB0eXBlb2Ygc2NyaXB0ID09PSAnc3RyaW5nJyAmJiBzY3JpcHQuaW5jbHVkZXMoJ3dyYW5nbGVyJykpKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBpZiAoZG9lc0NvbnRhaW5XcmFuZ2xlckNvbmZpZykge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgcmV0dXJuIHdvcmtmbG93Q29udGVudHMuc29tZSgoY29udGVudCkgPT4gL2Nsb3VkZmxhcmV8d3JhbmdsZXIvaXUudGVzdChjb250ZW50KSk7XG59XG5cbmZ1bmN0aW9uIGRldGVjdFJhaWx3YXkoZGlyUGF0aDogc3RyaW5nLCBwYWNrYWdlSnNvbjogUGFja2FnZUpzb24sIHdvcmtmbG93Q29udGVudHM6IHN0cmluZ1tdKTogYm9vbGVhbiB7XG4gIGNvbnN0IHNjcmlwdHMgPSBwYWNrYWdlSnNvbi5zY3JpcHRzO1xuICBpZiAoc2NyaXB0cyAmJiBPYmplY3QudmFsdWVzKHNjcmlwdHMpLnNvbWUoKHNjcmlwdCkgPT4gdHlwZW9mIHNjcmlwdCA9PT0gJ3N0cmluZycgJiYgc2NyaXB0LmluY2x1ZGVzKCdyYWlsd2F5JykpKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBpZiAoXG4gICAgZnMuZXhpc3RzU3luYyhwYXRoLnJlc29sdmUoZGlyUGF0aCwgJy5yYWlsd2F5aWdub3JlJykpIHx8XG4gICAgZnMuZXhpc3RzU3luYyhwYXRoLnJlc29sdmUoZGlyUGF0aCwgJ3JhaWx3YXkuanNvbicpKSB8fFxuICAgIGZzLmV4aXN0c1N5bmMocGF0aC5yZXNvbHZlKGRpclBhdGgsICdyYWlsd2F5LnRvbWwnKSlcbiAgKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICByZXR1cm4gd29ya2Zsb3dDb250ZW50cy5zb21lKChjb250ZW50KSA9PiAvcmFpbHdheS9pdS50ZXN0KGNvbnRlbnQpKTtcbn1cblxuLyoqIENvbnRlbnRzIG9mIHRoZSByZWFkYWJsZSAuZ2l0aHViL3dvcmtmbG93cyBZQU1MIGZpbGVzLCByZWFkIG9uY2UgZm9yIGV2ZXJ5IGRldGVjdG9yIG5lZWRpbmcgdGhlbS4gKi9cbmZ1bmN0aW9uIHJlYWRXb3JrZmxvd0ZpbGVDb250ZW50cyhkaXJQYXRoOiBzdHJpbmcpOiBzdHJpbmdbXSB7XG4gIGNvbnN0IHdvcmtmbG93c1BhdGggPSBwYXRoLnJlc29sdmUoZGlyUGF0aCwgJy5naXRodWInLCAnd29ya2Zsb3dzJyk7XG4gIHRyeSB7XG4gICAgcmV0dXJuIGZzXG4gICAgICAucmVhZGRpclN5bmMod29ya2Zsb3dzUGF0aClcbiAgICAgIC5maWx0ZXIoKGZpbGVOYW1lKSA9PiAvXFwueWE/bWwkL2l1LnRlc3QoZmlsZU5hbWUpKVxuICAgICAgLmZsYXRNYXAoKGZpbGVOYW1lKSA9PiB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgcmV0dXJuIFtmcy5yZWFkRmlsZVN5bmMocGF0aC5qb2luKHdvcmtmbG93c1BhdGgsIGZpbGVOYW1lKSwgJ3V0ZjgnKV07XG4gICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgIHJldHVybiBbXTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiBbXTtcbiAgfVxufVxuXG5hc3luYyBmdW5jdGlvbiByZWFkTWlzZVRhc2tzKGRpclBhdGg6IHN0cmluZyk6IFByb21pc2U8UmVjb3JkPHN0cmluZywgc3RyaW5nPj4ge1xuICBjb25zdCB0YXNrczogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHt9O1xuICBmb3IgKGNvbnN0IGZpbGVOYW1lIG9mIFsnbWlzZS50b21sJywgJy5taXNlLnRvbWwnXSkge1xuICAgIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKGRpclBhdGgsIGZpbGVOYW1lKTtcbiAgICB0cnkge1xuICAgICAgY29uc3Qgc2V0dGluZ3MgPSBCdW4uVE9NTC5wYXJzZShhd2FpdCBmc3AucmVhZEZpbGUoZmlsZVBhdGgsICd1dGY4JykpIGFzIHsgdGFza3M/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB9O1xuICAgICAgZm9yIChjb25zdCBbbmFtZSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKHNldHRpbmdzLnRhc2tzID8/IHt9KSkge1xuICAgICAgICB0YXNrc1tuYW1lXSA9IHJlYWRNaXNlVGFza0NvbW1hbmQodmFsdWUpO1xuICAgICAgfVxuICAgIH0gY2F0Y2gge1xuICAgICAgLy8gTWlzc2luZyBvciB0ZW1wb3JhcmlseSBpbnZhbGlkIG1pc2UgZmlsZXMgc2hvdWxkIG5vdCBibG9jayBvdGhlciB3YmZ5IGdlbmVyYXRvcnMuXG4gICAgfVxuICB9XG4gIHJldHVybiB0YXNrcztcbn1cblxuZnVuY3Rpb24gcmVhZE1pc2VUYXNrQ29tbWFuZCh2YWx1ZTogdW5rbm93bik6IHN0cmluZyB7XG4gIGlmICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnKSByZXR1cm4gdmFsdWU7XG4gIC8vIFByZXNlcnZlIGFycmF5LWZvcm0gbWlzZSBjb21tYW5kcyBzbyByZWN1cnNpb24gY2hlY2tzIGNhbiBzdGlsbCBzZWUgcGFja2FnZSBzY3JpcHQgY2FsbHMuXG4gIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkgcmV0dXJuIHZhbHVlLmZpbHRlcigoY29tbWFuZCk6IGNvbW1hbmQgaXMgc3RyaW5nID0+IHR5cGVvZiBjb21tYW5kID09PSAnc3RyaW5nJykuam9pbignXFxuJyk7XG4gIGlmICh2YWx1ZSAmJiB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnKSByZXR1cm4gcmVhZE1pc2VUYXNrQ29tbWFuZCgodmFsdWUgYXMgeyBydW4/OiB1bmtub3duIH0pLnJ1bik7XG4gIHJldHVybiAnJztcbn1cblxuLyoqXG4gKiBXaGV0aGVyIGRpclBhdGggaXMgYSBjaGlsZCB3b3Jrc3BhY2Ugb2YgYW4gZW5jbG9zaW5nIG1vbm9yZXBvIHJvb3Q6IGVpdGhlciB0aGUgY29udmVudGlvbmFsXG4gKiBgPHJvb3Q+L3BhY2thZ2VzLzxuYW1lPmAgbGF5b3V0LCBvciBhIGRpcmVjdG9yeSBtYXRjaGluZyBhIHdvcmtzcGFjZSBwYXR0ZXJuIGRlY2xhcmVkIGJ5IGFuXG4gKiBhbmNlc3RvciBwYWNrYWdlLmpzb24gKHBhdHRlcm5zIG1heSBiZSBhcmJpdHJhcmlseSBkZWVwLCBlLmcuIGBleGFtcGxlcy8qKmApLiBUaGUgd2FsayBzdG9wc1xuICogYXQgdGhlIGZpcnN0IGdpdCByZXBvc2l0b3J5IGJvdW5kYXJ5IHNvIGFuIHVucmVsYXRlZCBlbmNsb3NpbmcgcmVwb3NpdG9yeSdzIHdvcmtzcGFjZXMgY2FuXG4gKiBuZXZlciByZWNsYXNzaWZ5IGFuIGluZGVwZW5kZW50IHJlcG9zaXRvcnkgYXMgYSBjaGlsZC5cbiAqL1xuZnVuY3Rpb24gaXNXb3Jrc3BhY2VPZkVuY2xvc2luZ1Jvb3QoZGlyUGF0aDogc3RyaW5nKTogYm9vbGVhbiB7XG4gIGNvbnN0IHJlc29sdmVkRGlyUGF0aCA9IHBhdGgucmVzb2x2ZShkaXJQYXRoKTtcbiAgLy8gQSBkaXJlY3Rvcnkgd2l0aCBpdHMgb3duIC5naXQgaXMgYSByZXBvc2l0b3J5IGluIGl0cyBvd24gcmlnaHQsIG5ldmVyIGEgY2hpbGQgd29ya3NwYWNlIOKAlFxuICAvLyBjaGVja2VkIEZJUlNUIHNvIGFuIGluZGVwZW5kZW50IHJlcG9zaXRvcnkgdW5kZXIgc29tZSBgcGFja2FnZXMvYCBkaXJlY3Rvcnkgc3RheXMgYSByb290LlxuICBpZiAoZnMuZXhpc3RzU3luYyhwYXRoLnJlc29sdmUocmVzb2x2ZWREaXJQYXRoLCAnLmdpdCcpKSkgcmV0dXJuIGZhbHNlO1xuICBpZiAoXG4gICAgcGF0aC5iYXNlbmFtZShwYXRoLnJlc29sdmUocmVzb2x2ZWREaXJQYXRoLCAnLi4nKSkgPT09ICdwYWNrYWdlcycgJiZcbiAgICBmcy5leGlzdHNTeW5jKHBhdGgucmVzb2x2ZShyZXNvbHZlZERpclBhdGgsICcuLicsICcuLicsICdwYWNrYWdlLmpzb24nKSlcbiAgKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgZm9yIChcbiAgICBsZXQgY2FuZGlkYXRlUm9vdERpclBhdGggPSBwYXRoLmRpcm5hbWUocmVzb2x2ZWREaXJQYXRoKTtcbiAgICA7XG4gICAgY2FuZGlkYXRlUm9vdERpclBhdGggPSBwYXRoLmRpcm5hbWUoY2FuZGlkYXRlUm9vdERpclBhdGgpXG4gICkge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCByb290UGFja2FnZUpzb24gPSBKU09OLnBhcnNlKFxuICAgICAgICBmcy5yZWFkRmlsZVN5bmMocGF0aC5yZXNvbHZlKGNhbmRpZGF0ZVJvb3REaXJQYXRoLCAncGFja2FnZS5qc29uJyksICd1dGY4JylcbiAgICAgICkgYXMgUGFja2FnZUpzb247XG4gICAgICBjb25zdCByZWxhdGl2ZURpclBhdGggPSBwYXRoLnJlbGF0aXZlKGNhbmRpZGF0ZVJvb3REaXJQYXRoLCByZXNvbHZlZERpclBhdGgpLnJlcGxhY2VBbGwoJ1xcXFwnLCAnLycpO1xuICAgICAgY29uc3Qgd29ya3NwYWNlRGlyUGF0aHMgPSBnZXRXb3Jrc3BhY2VQYWNrYWdlSnNvblBhdGhzKHtcbiAgICAgICAgZGlyUGF0aDogY2FuZGlkYXRlUm9vdERpclBhdGgsXG4gICAgICAgIHBhY2thZ2VKc29uOiByb290UGFja2FnZUpzb24sXG4gICAgICAgIGRvZXNDb250YWluU3ViUGFja2FnZUpzb25zOiBmYWxzZSxcbiAgICAgIH0pLm1hcCgocGFja2FnZUpzb25QYXRoKSA9PiBwYXRoLnBvc2l4LmRpcm5hbWUocGFja2FnZUpzb25QYXRoKSk7XG4gICAgICBpZiAod29ya3NwYWNlRGlyUGF0aHMuaW5jbHVkZXMocmVsYXRpdmVEaXJQYXRoKSkgcmV0dXJuIHRydWU7XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBObyBvciB1bnBhcnNhYmxlIG1hbmlmZXN0IGF0IHRoaXMgYW5jZXN0b3I6IGtlZXAgd2Fsa2luZy5cbiAgICB9XG4gICAgY29uc3QgaXNSZXBvQm91bmRhcnkgPSBmcy5leGlzdHNTeW5jKHBhdGgucmVzb2x2ZShjYW5kaWRhdGVSb290RGlyUGF0aCwgJy5naXQnKSk7XG4gICAgY29uc3QgaXNGaWxlc3lzdGVtUm9vdCA9IGNhbmRpZGF0ZVJvb3REaXJQYXRoID09PSBwYXRoLmRpcm5hbWUoY2FuZGlkYXRlUm9vdERpclBhdGgpO1xuICAgIGlmIChpc1JlcG9Cb3VuZGFyeSB8fCBpc0ZpbGVzeXN0ZW1Sb290KSByZXR1cm4gZmFsc2U7XG4gIH1cbn1cblxuZnVuY3Rpb24gY29udGFpbnNBbnkocGF0dGVybjogc3RyaW5nLCBkaXJQYXRoOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgcmV0dXJuIGZnLmdsb2JTeW5jKHBhdHRlcm4sIHsgZG90OiB0cnVlLCBjd2Q6IGRpclBhdGgsIGlnbm9yZTogZ2xvYklnbm9yZSB9KS5sZW5ndGggPiAwO1xufVxuXG5mdW5jdGlvbiBmaW5kQ2FyZ29Ub21sRGlyUGF0aHMoZGlyUGF0aDogc3RyaW5nKTogc3RyaW5nW10ge1xuICByZXR1cm4gZmdcbiAgICAuZ2xvYlN5bmMoJyoqL0NhcmdvLnRvbWwnLCB7IGRvdDogdHJ1ZSwgY3dkOiBkaXJQYXRoLCBpZ25vcmU6IGdsb2JJZ25vcmUgfSlcbiAgICAubWFwKChmaWxlUGF0aCkgPT4gcGF0aC5kaXJuYW1lKGZpbGVQYXRoKSlcbiAgICAudG9Tb3J0ZWQoKGEsIGIpID0+IGEuc3BsaXQoJy8nKS5sZW5ndGggLSBiLnNwbGl0KCcvJykubGVuZ3RoIHx8IGEubG9jYWxlQ29tcGFyZShiKSk7XG59XG5cbmZ1bmN0aW9uIGRldGVjdFBsYXl3cmlnaHRSdW50aW1lSW1wb3J0KGRpclBhdGg6IHN0cmluZyk6IGJvb2xlYW4ge1xuICBjb25zdCBmaWxlcyA9IGZnLmdsb2JTeW5jKCd7YXBwLHNyY30vKiovKi57Y2pzLGN0cyxqcyxqc3gsbWpzLG10cyx0cyx0c3h9Jywge1xuICAgIGRvdDogdHJ1ZSxcbiAgICBjd2Q6IGRpclBhdGgsXG4gICAgaWdub3JlOiBbLi4uZ2xvYklnbm9yZSwgJyoqL19fdGVzdHNfXy8qKicsICcqKi8qLnNwZWMuKicsICcqKi8qLnRlc3QuKicsICcqKi9wbGF5d3JpZ2h0LmNvbmZpZy4qJ10sXG4gIH0pO1xuICBjb25zdCBwbGF5d3JpZ2h0SW1wb3J0UGF0dGVybiA9IGJ1aWxkUnVudGltZUltcG9ydFJlZ0V4cCgncGxheXdyaWdodCcpO1xuICBmb3IgKGNvbnN0IGZpbGUgb2YgZmlsZXMpIHtcbiAgICBjb25zdCBjb250ZW50ID0gZnMucmVhZEZpbGVTeW5jKHBhdGgucmVzb2x2ZShkaXJQYXRoLCBmaWxlKSwgJ3V0ZjgnKTtcbiAgICBpZiAocGxheXdyaWdodEltcG9ydFBhdHRlcm4udGVzdChjb250ZW50KSkgcmV0dXJuIHRydWU7XG4gIH1cbiAgcmV0dXJuIGZhbHNlO1xufVxuXG5mdW5jdGlvbiBidWlsZFJ1bnRpbWVJbXBvcnRSZWdFeHAocGFja2FnZU5hbWU6IHN0cmluZyk6IFJlZ0V4cCB7XG4gIC8vIE1hdGNoIHRoZSBiYXJlIHNwZWNpZmllciBvciBhbnkgc3VicGF0aCBvZiBpdCAoYHBrZ2AgLyBgcGtnL3N1YmApLCBidXQgbmV2ZXIgYSBkaWZmZXJlbnQgcGFja2FnZVxuICAvLyB0aGF0IG1lcmVseSBzaGFyZXMgdGhlIHByZWZpeCAoYHBrZy1vdGhlcmApLCBzaW5jZSB0aGUgY2hhciBhZnRlciB0aGUgbmFtZSBtdXN0IGJlIGAvYCBvciBhIHF1b3RlLlxuICBjb25zdCBzcGVjaWZpZXIgPSBTdHJpbmcucmF3YFsnXCJdJHtlc2NhcGVSZWdFeHAocGFja2FnZU5hbWUpfSg/Oi9bXidcIl0qKT9bJ1wiXWA7XG4gIHJldHVybiBuZXcgUmVnRXhwKFxuICAgIFN0cmluZy5yYXdgXFxiZnJvbVxccyske3NwZWNpZmllcn18XFxiaW1wb3J0XFxzKlxcKFxccyoke3NwZWNpZmllcn1cXHMqXFwpfFxcYnJlcXVpcmVcXHMqXFwoXFxzKiR7c3BlY2lmaWVyfVxccypcXClgLFxuICAgICd1J1xuICApO1xufVxuXG5hc3luYyBmdW5jdGlvbiBmZXRjaFJlcG9JbmZvKGRpclBhdGg6IHN0cmluZywgcGFja2FnZUpzb246IFBhY2thZ2VKc29uKTogUHJvbWlzZTxSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB8IHVuZGVmaW5lZD4ge1xuICBjb25zdCByZW1vdGVVcmwgPSBnZXRPcmlnaW5SZW1vdGVVcmwoZGlyUGF0aCk7XG4gIGlmIChyZW1vdGVVcmwpIHtcbiAgICBjb25zdCBqc29uID0gYXdhaXQgcmVxdWVzdFJlcG9JbmZvKHJlbW90ZVVybCk7XG4gICAgaWYgKGpzb24pIHJldHVybiBqc29uO1xuICB9XG5cbiAgY29uc3QgdXJsID0gdHlwZW9mIHBhY2thZ2VKc29uLnJlcG9zaXRvcnkgPT09ICdzdHJpbmcnID8gcGFja2FnZUpzb24ucmVwb3NpdG9yeSA6IHBhY2thZ2VKc29uLnJlcG9zaXRvcnk/LnVybDtcbiAgaWYgKHVybCkge1xuICAgIGNvbnN0IGpzb24gPSBhd2FpdCByZXF1ZXN0UmVwb0luZm8odXJsKTtcbiAgICBpZiAoanNvbiAmJiBqc29uLm1lc3NhZ2UgIT09ICdOb3QgRm91bmQnKSByZXR1cm4ganNvbjtcbiAgfVxufVxuXG5hc3luYyBmdW5jdGlvbiByZXF1ZXN0UmVwb0luZm8odXJsT3JGdWxsTmFtZTogc3RyaW5nKTogUHJvbWlzZTxSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB8IHVuZGVmaW5lZD4ge1xuICBjb25zdCBbb3JnLCBuYW1lXSA9IGdpdEh1YlV0aWwuZ2V0T3JnQW5kTmFtZSh1cmxPckZ1bGxOYW1lKTtcbiAgaWYgKCFvcmcgfHwgIW5hbWUpIHJldHVybjtcblxuICB0cnkge1xuICAgIC8vIE1ldGFkYXRhIHBlcm1pc3Npb24uIFRoZSBvd25lciBNVVNUIGJlIHBhc3NlZDogZ2V0T2N0b2tpdCgpIHdpdGhvdXQgaXQgcHJlZmVycyB0aGVcbiAgICAvLyBXaWxsQm9vc3RlciBQQVQsIHdoaWNoIGNhbm5vdCByZWFkIHByaXZhdGUgV2lsbEJvb3N0ZXJMYWIgcmVwb3NpdG9yaWVzLCBjb2xsYXBzaW5nIHRoZWlyXG4gICAgLy8gdmlzaWJpbGl0eSB0byB1bmtub3duIChhbmQgZS5nLiBza2lwcGluZyB0aGUgd2JmeSBjYWxsZXIgZ2VuZXJhdGlvbiBpbmRlZmluaXRlbHkpLlxuICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZ2V0T2N0b2tpdChvcmcpLnJlcXVlc3QoJ0dFVCAvcmVwb3Mve293bmVyfS97cmVwb30nLCB7XG4gICAgICBvd25lcjogb3JnLFxuICAgICAgcmVwbzogbmFtZSxcbiAgICB9KTtcbiAgICByZXR1cm4gcmVzcG9uc2UuZGF0YTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBjb25zdCByZWRpcmVjdGVkRnVsbE5hbWUgPSBnZXRSZWRpcmVjdGVkUmVwb0Z1bGxOYW1lKGVycm9yKTtcbiAgICBpZiAocmVkaXJlY3RlZEZ1bGxOYW1lKSB7XG4gICAgICAvLyBSZS1mZXRjaCB1bmRlciB0aGUgcmVkaXJlY3RlZCBpZGVudGl0eSBzbyBhIHJlbmFtZWQgcmVwb3NpdG9yeSBzdGlsbCBnZXRzIGNvbXBsZXRlXG4gICAgICAvLyBtZXRhZGF0YSAodmlzaWJpbGl0eSBpbmNsdWRlZCkgaW5zdGVhZCBvZiBhIGJhcmUgZnVsbF9uYW1lIHRoYXQgd291bGQgbGVhdmVcbiAgICAgIC8vIGlzUmVwb1Zpc2liaWxpdHlLbm93biBmYWxzZSBvbiBldmVyeSBzdWJzZXF1ZW50IHJ1biB3aXRoIHRoZSBzdGFsZSByZW1vdGUgVVJMLlxuICAgICAgY29uc3QgW3JlZGlyZWN0ZWRPcmcsIHJlZGlyZWN0ZWROYW1lXSA9IHJlZGlyZWN0ZWRGdWxsTmFtZS5zcGxpdCgnLycpO1xuICAgICAgaWYgKHJlZGlyZWN0ZWRPcmcgJiYgcmVkaXJlY3RlZE5hbWUpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGdldE9jdG9raXQocmVkaXJlY3RlZE9yZykucmVxdWVzdCgnR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfScsIHtcbiAgICAgICAgICAgIG93bmVyOiByZWRpcmVjdGVkT3JnLFxuICAgICAgICAgICAgcmVwbzogcmVkaXJlY3RlZE5hbWUsXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgcmV0dXJuIHJlc3BvbnNlLmRhdGE7XG4gICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgIC8vIEZhbGwgYmFjayB0byB0aGUgYmFyZSBpZGVudGl0eSBiZWxvdzogdGhlIHJlcG9zaXRvcnkgaXMgc3RpbGwgY2Fub25pY2FsaXplZCwgb25seVxuICAgICAgICAgIC8vIGl0cyB2aXNpYmlsaXR5IHN0YXlzIHVua25vd24uXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiB7IGZ1bGxfbmFtZTogcmVkaXJlY3RlZEZ1bGxOYW1lIH07XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGdldFJlZGlyZWN0ZWRSZXBvRnVsbE5hbWUoZXJyb3I6IHVua25vd24pOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBpZiAoIWVycm9yIHx8IHR5cGVvZiBlcnJvciAhPT0gJ29iamVjdCcpIHJldHVybjtcblxuICBjb25zdCByZXNwb25zZSA9XG4gICAgJ3Jlc3BvbnNlJyBpbiBlcnJvclxuICAgICAgPyAoZXJyb3IgYXMgeyByZXNwb25zZT86IHsgc3RhdHVzPzogbnVtYmVyOyBoZWFkZXJzPzogUmVjb3JkPHN0cmluZywgc3RyaW5nIHwgdW5kZWZpbmVkPiB9IH0pLnJlc3BvbnNlXG4gICAgICA6IHVuZGVmaW5lZDtcbiAgY29uc3Qgc3RhdHVzID0gcmVzcG9uc2U/LnN0YXR1cyA/PyAoZXJyb3IgYXMgeyBzdGF0dXM/OiBudW1iZXIgfSkuc3RhdHVzO1xuICBpZiAoc3RhdHVzICE9PSAzMDEgJiYgc3RhdHVzICE9PSAzMDIpIHJldHVybjtcblxuICBjb25zdCBsb2NhdGlvbiA9IHJlc3BvbnNlPy5oZWFkZXJzPy5sb2NhdGlvbjtcbiAgaWYgKHR5cGVvZiBsb2NhdGlvbiAhPT0gJ3N0cmluZycpIHJldHVybjtcblxuICBjb25zdCBbb3JnLCBuYW1lXSA9IGdpdEh1YlV0aWwuZ2V0T3JnQW5kTmFtZShsb2NhdGlvbik7XG4gIGlmICghb3JnIHx8ICFuYW1lKSByZXR1cm47XG5cbiAgcmV0dXJuIGAke29yZ30vJHtuYW1lfWA7XG59XG5cbi8qKlxuICogUmVzb2x2ZXMgYDxvcmc+LzxuYW1lPmAgZnJvbSB0aGUgZ2l0IHJlbW90ZSAoZmFsbGluZyBiYWNrIHRvIHBhY2thZ2UuanNvbidzIGByZXBvc2l0b3J5YCkgd2l0aG91dFxuICogY2FsbGluZyB0aGUgR2l0SHViIEFQSS4gSXQgd29ya3MgZm9yIGV2ZXJ5IHdvcmtzcGFjZSBwYWNrYWdlLCBub3QganVzdCB0aGUgcm9vdCDigJQgb25seSB0aGUgcm9vdFxuICogZmV0Y2hlcyByZXBvIGluZm8g4oCUIGFuZCBpdCBrZWVwcyB3b3JraW5nIG9mZmxpbmUgb3IgcmF0ZS1saW1pdGVkLCB3aGVyZSBhbiB1bmRlZmluZWQgaWRlbnRpdHlcbiAqIHdvdWxkIHNpbGVudGx5IHJlY2xhc3NpZnkgdGhlIHJlcG9zaXRvcnkgKGUuZy4gbWFraW5nIHdiZnkgd3JpdGUgd2lsbGJvb3N0ZXItY29uZmlncycgUmVub3ZhdGVcbiAqIHByZXNldCBpbnRvIHRoZSBwcmVzZXQgaXRzZWxmIGFnYWluKS5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gcmVzb2x2ZUxvY2FsUmVwb0lkZW50aXR5KFxuICBkaXJQYXRoOiBzdHJpbmcsXG4gIHBhY2thZ2VKc29uOiBQYWNrYWdlSnNvblxuKTogUHJvbWlzZTxbc3RyaW5nIHwgdW5kZWZpbmVkLCBzdHJpbmcgfCB1bmRlZmluZWRdPiB7XG4gIGNvbnN0IHJlbW90ZVVybCA9IGdldE9yaWdpblJlbW90ZVVybChkaXJQYXRoKTtcbiAgaWYgKHJlbW90ZVVybCkge1xuICAgIGNvbnN0IGlkZW50aXR5ID0gcmVhZEdpdEh1YklkZW50aXR5KHJlbW90ZVVybCk7XG4gICAgaWYgKGlkZW50aXR5KSByZXR1cm4gaWRlbnRpdHk7XG4gIH1cbiAgY29uc3QgdXJsID0gdHlwZW9mIHBhY2thZ2VKc29uLnJlcG9zaXRvcnkgPT09ICdzdHJpbmcnID8gcGFja2FnZUpzb24ucmVwb3NpdG9yeSA6IHBhY2thZ2VKc29uLnJlcG9zaXRvcnk/LnVybDtcbiAgaWYgKHVybCkge1xuICAgIGNvbnN0IGlkZW50aXR5ID0gcmVhZEdpdEh1YklkZW50aXR5KHVybCk7XG4gICAgaWYgKGlkZW50aXR5KSByZXR1cm4gaWRlbnRpdHk7XG4gIH1cbiAgcmV0dXJuIFt1bmRlZmluZWQsIHVuZGVmaW5lZF07XG59XG5cbmZ1bmN0aW9uIGdldE9yaWdpblJlbW90ZVVybChkaXJQYXRoOiBzdHJpbmcpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICByZXR1cm4gc3Bhd25TeW5jQW5kUmV0dXJuU3Rkb3V0KCdnaXQnLCBbJ2NvbmZpZycsICctLWdldCcsICdyZW1vdGUub3JpZ2luLnVybCddLCBkaXJQYXRoKSB8fCB1bmRlZmluZWQ7XG59XG5cbi8qKlxuICogYGdpdEh1YlV0aWwuZ2V0T3JnQW5kTmFtZWAgaXMgaG9zdC1hZ25vc3RpYywgc28gaXQgaGFwcGlseSB0dXJucyBhIEdpdExhYiBVUkwgaW50byBhbiBgPG9yZz4vPHJlcG8+YCBwYWlyLlxuICogRXZlcnl0aGluZyBkb3duc3RyZWFtIHRyZWF0cyB0aGUgcmVzdWx0aW5nIGlkZW50aXR5IGFzIEdpdEh1YiAodGhlIGBnaXRodWI6YCByZXBvc2l0b3J5IGZpZWxkIGlzIHJld3JpdHRlblxuICogaW50byBwYWNrYWdlLmpzb24pLCBzbyB0aGUgaG9zdCBtdXN0IGJlIHZlcmlmaWVkIGZpcnN0OyBhIG5vbi1HaXRIdWIgcmVtb3RlIHlpZWxkcyBubyBpZGVudGl0eSwgYXMgYmVmb3JlLlxuICovXG5mdW5jdGlvbiByZWFkR2l0SHViSWRlbnRpdHkodXJsOiBzdHJpbmcpOiBbc3RyaW5nLCBzdHJpbmddIHwgdW5kZWZpbmVkIHtcbiAgaWYgKCF0YXJnZXRzR2l0SHViKHVybCkpIHJldHVybiB1bmRlZmluZWQ7XG4gIGNvbnN0IFtvcmcsIG5hbWVdID0gZ2l0SHViVXRpbC5nZXRPcmdBbmROYW1lKHVybCk7XG4gIHJldHVybiBvcmcgJiYgbmFtZSA/IFtjYW5vbmljYWxpemVPd25lcihvcmcpLCBuYW1lXSA6IHVuZGVmaW5lZDtcbn1cblxuLyoqXG4gKiBXaGV0aGVyIHRoZSBVUkwncyBIT1NUIGlzIGdpdGh1Yi5jb20uIFBhcnNlZCByYXRoZXIgdGhhbiBzdWJzdHJpbmctbWF0Y2hlZDogYSBwYXRoIHN1Y2ggYXNcbiAqIGBodHRwczovL2dpdGxhYi5jb20vZ2l0aHViLmNvbS9vd25lci9yZXBvLmdpdGAgd291bGQgb3RoZXJ3aXNlIGJlIHRha2VuIGZvciBHaXRIdWIsIGFuZCBhbiB1cHBlcmNhc2VcbiAqIGBHSVRIVUIuQ09NYCB3b3VsZCBiZSByZWplY3RlZC4gYGdpdGh1Yjpvd25lci9yZXBvYCBpcyBucG0ncyBzaG9ydGhhbmQgYW5kIG5hbWVzIG5vIGhvc3QsIHNvIGl0IGlzXG4gKiByZWNvZ25pemVkIHNlcGFyYXRlbHk7IG5vcm1hbGl6ZVJlcG9zaXRvcnlVcmxGb3JQYWNrYWdlSnNvbiBhY2NlcHRzIHRoZSBzYW1lIHNob3J0aGFuZC5cbiAqL1xuZnVuY3Rpb24gdGFyZ2V0c0dpdEh1Yih1cmw6IHN0cmluZyk6IGJvb2xlYW4ge1xuICBpZiAoL15naXRodWI6L2l1LnRlc3QodXJsKSkgcmV0dXJuIHRydWU7XG4gIC8vIHNjcC1zdHlsZSByZW1vdGVzIChgZ2l0QGdpdGh1Yi5jb206b3duZXIvcmVwby5naXRgKSBhcmUgbm90IHZhbGlkIFVSTHMuXG4gIGNvbnN0IHNjcEhvc3QgPSAvXlteL0BdKkAoW146L10rKTovdS5leGVjKHVybCk/LlsxXTtcbiAgaWYgKHNjcEhvc3QpIHJldHVybiBzY3BIb3N0LnRvTG93ZXJDYXNlKCkgPT09ICdnaXRodWIuY29tJztcbiAgdHJ5IHtcbiAgICByZXR1cm4gbmV3IFVSTCh1cmwucmVwbGFjZSgvXmdpdFxcKy91LCAnJykpLmhvc3RuYW1lLnRvTG93ZXJDYXNlKCkgPT09ICdnaXRodWIuY29tJztcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG59XG5cbi8qKlxuICogR2l0SHViIG93bmVyIG5hbWVzIGFyZSBjYXNlLWluc2Vuc2l0aXZlLCBhbmQgYSByZW1vdGUgb3IgbWFuaWZlc3QgVVJMIG1heSBzcGVsbCB0aGVtIGFueSB3YXksIGJ1dCB0aGUgQVBJJ3NcbiAqIGBmdWxsX25hbWVgIGFsd2F5cyByZXR1cm5lZCB0aGUgY2Fub25pY2FsIHNwZWxsaW5nIOKAlCB3aGljaCB0aGUgbWFueSBleGFjdCBgPT09ICdXaWxsQm9vc3RlcidgIHBvbGljeSBjaGVja3NcbiAqIChvcmdhbml6YXRpb24gd29ya2Zsb3dzLCBhdXRob3IgbWV0YWRhdGEsIHRoZSBXaWxsQm9vc3RlckxhYiBwcmUtcHVzaCBndWFyZCkgZGVwZW5kIG9uLiBDYW5vbmljYWxpemUgaGVyZSBzb1xuICogdGhlIGxvY2FsIGZhbGxiYWNrIHlpZWxkcyB0aGUgc2FtZSBpZGVudGl0eSB0aGUgQVBJIGRpZCwgaW5zdGVhZCBvZiBzaWxlbnRseSBza2lwcGluZyB0aG9zZSBwb2xpY2llcy5cbiAqL1xuZnVuY3Rpb24gY2Fub25pY2FsaXplT3duZXIob3duZXI6IHN0cmluZyk6IHN0cmluZyB7XG4gIGNvbnN0IGNhbm9uaWNhbE93bmVycyA9IFsnV2lsbEJvb3N0ZXInLCAnV2lsbEJvb3N0ZXJMYWInXTtcbiAgcmV0dXJuIGNhbm9uaWNhbE93bmVycy5maW5kKChjYW5kaWRhdGUpID0+IGNhbmRpZGF0ZS50b0xvd2VyQ2FzZSgpID09PSBvd25lci50b0xvd2VyQ2FzZSgpKSA/PyBvd25lcjtcbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB7IElTU1VFX1RFTVBMQVRFX1JVTEVTLCBQVUxMX1JFUVVFU1RfQk9EWV9SVUxFUywgVEVTVF9XUklUSU5HX1JVTEVTIH0gZnJvbSAnQHdpbGxib29zdGVyL3NoYXJlZC1saWIvc3JjJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZnNVdGlsIH0gZnJvbSAnLi4vdXRpbHMvZnNVdGlsLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuaW1wb3J0IHsgZ2VuZXJhdGVzV29ya2VyVHlwZXMgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGhhc0Nsb3VkZmxhcmVEZXBsb3lXb3JrZmxvdywgaW52b2tlc1diRGVwbG95IH0gZnJvbSAnLi93b3JrZmxvdy5qcyc7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZW5lcmF0ZUFnZW50SW5zdHJ1Y3Rpb25zKHJvb3RDb25maWc6IFBhY2thZ2VDb25maWcsIGFsbENvbmZpZ3M6IFBhY2thZ2VDb25maWdbXSk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2dlbmVyYXRlQWdlbnRJbnN0cnVjdGlvbnMnLCBhc3luYyAoKSA9PiB7XG4gICAgaWYgKCFyb290Q29uZmlnLmlzUm9vdCkgcmV0dXJuO1xuXG4gICAgY29uc3QgZXh0cmFDb250ZW50ID0gYXdhaXQgcmVhZEFnZW50c0V4dHJhQ29udGVudChyb290Q29uZmlnLmRpclBhdGgpO1xuXG4gICAgZm9yIChjb25zdCBbZmlsZU5hbWUsIHRvb2xOYW1lXSBvZiBbXG4gICAgICBbJ0FHRU5UUy5tZCcsICdDb2RleCBDTEknXSxcbiAgICAgIFsnQ0xBVURFLm1kJywgJ0NsYXVkZSBDb2RlJ10sXG4gICAgICBbJ0dFTUlOSS5tZCcsICdHZW1pbmkgQ0xJJ10sXG4gICAgXSBhcyBjb25zdCkge1xuICAgICAgY29uc3QgY29udGVudCA9IGdlbmVyYXRlQWdlbnRJbnN0cnVjdGlvbihyb290Q29uZmlnLCBhbGxDb25maWdzLCB0b29sTmFtZSwgZXh0cmFDb250ZW50KTtcbiAgICAgIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKHJvb3RDb25maWcuZGlyUGF0aCwgZmlsZU5hbWUpO1xuICAgICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzVXRpbC5nZW5lcmF0ZUZpbGUoZmlsZVBhdGgsIGNvbnRlbnQpKTtcbiAgICB9XG5cbiAgICBjb25zdCBjdXJzb3JSdWxlc1BhdGggPSBwYXRoLnJlc29sdmUocm9vdENvbmZpZy5kaXJQYXRoLCAnLmN1cnNvci9ydWxlcy9nZW5lcmFsLm1kYycpO1xuICAgIGNvbnN0IGN1cnNvclJ1bGVzQ29udGVudCA9IGdlbmVyYXRlQ3Vyc29yR2VuZXJhbE1kY0NvbnRlbnQocm9vdENvbmZpZywgYWxsQ29uZmlncywgZXh0cmFDb250ZW50KTtcbiAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnNVdGlsLmdlbmVyYXRlRmlsZShjdXJzb3JSdWxlc1BhdGgsIGN1cnNvclJ1bGVzQ29udGVudCkpO1xuICB9KTtcbn1cblxuY29uc3QgYWdlbnRzRXh0cmFDb250ZW50Q2FjaGUgPSBuZXcgTWFwPHN0cmluZywgc3RyaW5nIHwgdW5kZWZpbmVkPigpO1xuXG4vKipcbiAqIFJlYWRzIHRoZSByb290J3MgdXNlci1hdXRob3JlZCBBR0VOVFNfRVhUUkEubWQgb25jZSBwZXIgcHJvY2Vzczogd2JmeSBuZXZlciByZXdyaXRlcyB0aGUgZmlsZSxcbiAqIGFuZCBib3RoIHRoZSBhZ2VudC1pbnN0cnVjdGlvbiBhbmQgR2VtaW5pIGdlbmVyYXRvcnMgbmVlZCBpdHMgY29udGVudC4gQ2FjaGluZyB0aGUgcmVzb2x2ZWRcbiAqIHZhbHVlIChub3QgdGhlIFByb21pc2UpIGlzIHJhY2UtZnJlZSBiZWNhdXNlIHRoZSB0d28gY2FsbGVycyBydW4gc2VxdWVudGlhbGx5IGluIGluZGV4LnRzLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcmVhZEFnZW50c0V4dHJhQ29udGVudChyb290RGlyUGF0aDogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmcgfCB1bmRlZmluZWQ+IHtcbiAgY29uc3QgYWdlbnRzRXh0cmFQYXRoID0gcGF0aC5yZXNvbHZlKHJvb3REaXJQYXRoLCAnQUdFTlRTX0VYVFJBLm1kJyk7XG4gIGlmICghYWdlbnRzRXh0cmFDb250ZW50Q2FjaGUuaGFzKGFnZW50c0V4dHJhUGF0aCkpIHtcbiAgICBhZ2VudHNFeHRyYUNvbnRlbnRDYWNoZS5zZXQoYWdlbnRzRXh0cmFQYXRoLCBhd2FpdCBmc1V0aWwucmVhZEZpbGVJZkV4aXN0cyhhZ2VudHNFeHRyYVBhdGgpKTtcbiAgfVxuICByZXR1cm4gYWdlbnRzRXh0cmFDb250ZW50Q2FjaGUuZ2V0KGFnZW50c0V4dHJhUGF0aCk7XG59XG5cbmZ1bmN0aW9uIGdlbmVyYXRlQ3Vyc29yR2VuZXJhbE1kY0NvbnRlbnQoXG4gIGNvbmZpZzogUGFja2FnZUNvbmZpZyxcbiAgYWxsQ29uZmlnczogUGFja2FnZUNvbmZpZ1tdLFxuICBleHRyYUNvbnRlbnQ/OiBzdHJpbmdcbik6IHN0cmluZyB7XG4gIGNvbnN0IGZyb250bWF0dGVyID0gYC0tLVxcbmRlc2NyaXB0aW9uOiBHZW5lcmFsIENvZGluZyBSdWxlc1xcbmdsb2JzOlxcbmFsd2F5c0FwcGx5OiB0cnVlXFxuLS0tYDtcbiAgY29uc3QgYm9keSA9IGdlbmVyYXRlQWdlbnRJbnN0cnVjdGlvbihjb25maWcsIGFsbENvbmZpZ3MsICdDdXJzb3InLCBleHRyYUNvbnRlbnQpO1xuICByZXR1cm4gYCR7ZnJvbnRtYXR0ZXJ9XFxuXFxuJHtib2R5fWA7XG59XG5cbmZ1bmN0aW9uIGdlbmVyYXRlQWdlbnRJbnN0cnVjdGlvbihcbiAgcm9vdENvbmZpZzogUGFja2FnZUNvbmZpZyxcbiAgYWxsQ29uZmlnczogUGFja2FnZUNvbmZpZ1tdLFxuICB0b29sTmFtZTogc3RyaW5nLFxuICBleHRyYUNvbnRlbnQ/OiBzdHJpbmdcbik6IHN0cmluZyB7XG4gIGNvbnN0IHBhY2thZ2VNYW5hZ2VyID0gJ2J1bic7XG4gIGNvbnN0IGRlc2NyaXB0aW9uID0gcm9vdENvbmZpZy5wYWNrYWdlSnNvbj8uZGVzY3JpcHRpb247XG4gIGNvbnN0IGZub3hJbnN0cnVjdGlvbiA9IGZzLmV4aXN0c1N5bmMocGF0aC5yZXNvbHZlKHJvb3RDb25maWcuZGlyUGF0aCwgJ2Zub3gudG9tbCcpKVxuICAgID8gYFxcbi0gRW52aXJvbm1lbnQgdmFyaWFibGVzIGFuZCBzZWNyZXRzIGxpdmUgaW4gXFxgZm5veC50b21sXFxgIChtaXNlICsgZm5veCk7IG5ldmVyIGNyZWF0ZSBcXGAuZW52XFxgLCBcXGAuZW52LipcXGAsIG9yIFxcYC5kZXYudmFyc1xcYCBmaWxlcy4gUnVuIGNvbW1hbmRzIHRocm91Z2ggXFxgJHtwYWNrYWdlTWFuYWdlcn0gd2IgLi4uXFxgIG9yIFxcYGZub3ggcnVuIC1QIDxwcm9maWxlPiAtLSA8Y29tbWFuZD5cXGAuIFByb2ZpbGUgc2VjcmV0cyBsb2FkIG9ubHkgd2hlbiBhIHByb2ZpbGUgaXMgc2VsZWN0ZWQ6IG1vZGUtYXdhcmUgd2IgY29tbWFuZHMgKGUuZy4gXFxgd2Igc3RhcnRcXGAsIFxcYHdiIHRlc3RcXGApIGFuZCBcXGB3YiBkb3RlbnZcXGAgc2VsZWN0IGl0IHRoZW1zZWx2ZXMgKFxcYHdiIGRvdGVudlxcYCB1c2VzIFxcYFdCX0VOVlxcYCwgZWxzZSBcXGBGTk9YX1BST0ZJTEVcXGAsIGVsc2UgXFxgTk9ERV9FTlZcXGAsIGVsc2UgdGhlIGRldmVsb3BtZW50IHByb2ZpbGU7IFxcYFdCX0VOVlxcYCBhY2NlcHRzIG9ubHkgXFxgZGV2ZWxvcG1lbnRcXGAvXFxgdGVzdFxcYC9cXGBzdGFnaW5nXFxgL1xcYHByb2R1Y3Rpb25cXGAsIHNvIHVzZSBcXGBGTk9YX1BST0ZJTEVcXGAgZm9yIGFueSBvdGhlciBwcm9maWxlKSwgd2hpbGUgYmFyZSBcXGBmbm94IHJ1blxcYCBuZWVkcyBhbiBleHBsaWNpdCBcXGAtUCA8cHJvZmlsZT5cXGAuYFxuICAgIDogJyc7XG4gIC8vIG1pc2Ugb3ducyB0aGUgcGlubmVkIHRvb2wgdmVyc2lvbnMsIHNvIGEgdmVyc2lvbiBtaXNtYXRjaCBpcyBmaXhlZCBieSBlZGl0aW5nIG1pc2UudG9tbCDigJQgbm90XG4gIC8vIGJ5IGluc3RhbGxpbmcgYSBkaWZmZXJlbnQgdmVyc2lvbiBnbG9iYWxseSwgd2hpY2ggdGhlIG5leHQgYG1pc2UgaW5zdGFsbGAgc2lsZW50bHkgb3ZlcnJpZGVzLlxuICBjb25zdCBtaXNlSW5zdHJ1Y3Rpb24gPSBmcy5leGlzdHNTeW5jKHBhdGgucmVzb2x2ZShyb290Q29uZmlnLmRpclBhdGgsICdtaXNlLnRvbWwnKSlcbiAgICA/ICdcXG4tIFRvb2wgdmVyc2lvbnMgKGUuZy4sIG5vZGUpIGFyZSBwaW5uZWQgaW4gYG1pc2UudG9tbGA7IHJ1biBgbWlzZSBpbnN0YWxsYCBhZnRlciBjaGFuZ2luZyBpdCBhbmQgbmV2ZXIgaW5zdGFsbCB0aG9zZSB0b29scyBnbG9iYWxseSBpbnN0ZWFkLidcbiAgICA6ICcnO1xuICAvLyBJc29sYXRlZCBpbnN0YWxscyBhcmUgdGhlIG9yZyBzdGFuZGFyZCAod2JmeSBnZW5lcmF0ZXMgbm8gb3RoZXIgbGlua2VyKSBhbmQgdGhlIG1vc3RcbiAgLy8gYWdlbnQtaG9zdGlsZSBwYXJ0IG9mIHRoZSBzdGFjazogYSBwYWNrYWdlIHRoYXQgaXMgb25seSByZWFjaGFibGUgYmVjYXVzZSBhIGRlcGVuZGVuY3kgaG9pc3RlZFxuICAvLyBpdCBubyBsb25nZXIgcmVzb2x2ZXMsIGFuZCB0aGUgcmVmbGV4IGZpeCAoc3dpdGNoaW5nIHRoZSBsaW5rZXIgYmFjaykgc2lsZW50bHkgcmVpbnRyb2R1Y2VzXG4gIC8vIHRoZSBwaGFudG9tIGRlcGVuZGVuY2llcyB0aGUgbGF5b3V0IGV4aXN0cyB0byBjYXRjaC5cbiAgY29uc3QgaXNvbGF0ZWRJbnN0YWxsSW5zdHJ1Y3Rpb24gPSBgXFxuLSBcXGBidW5maWcudG9tbFxcYCB1c2VzIEJ1bidzIGlzb2xhdGVkIGxpbmtlciwgc28gb25seSBkZWNsYXJlZCBkZXBlbmRlbmNpZXMgcmVzb2x2ZS4gSWYgYW4gaW1wb3J0IGZhaWxzIHRvIHJlc29sdmUsIGRlY2xhcmUgdGhhdCBwYWNrYWdlIGluIHRoZSBcXGBwYWNrYWdlLmpzb25cXGAgdGhhdCBpbXBvcnRzIGl0OyBuZXZlciBzd2l0Y2ggXFxgbGlua2VyXFxgIHRvIFxcYGhvaXN0ZWRcXGAgb3IgYWRkIHRvIFxcYHB1YmxpY0hvaXN0UGF0dGVyblxcYCB0byB3b3JrIGFyb3VuZCBpdC5gO1xuICAvLyBFdmVyeSBjbGF1c2Ugc3RhdGVzIG9ubHkgYSB2ZXJpZmllZCBmYWN0LCByZXVzaW5nIHRoZSB3b3JrZmxvdyBnZW5lcmF0b3IncyBvd24gZGV0ZWN0b3JzOiB0aGVcbiAgLy8gd3JhbmdsZXItY29uZmlnIGNsYXVzZSBuZWVkcyBhbiBhY3R1YWwgY29uZmlnIGZpbGUgKGlzQ2xvdWRmbGFyZSBhbHNvIG1hdGNoZXMgYSBtZXJlIHdyYW5nbGVyXG4gIC8vIG1lbnRpb24gaW4gYSBzY3JpcHQgb3Igd29ya2Zsb3cpLCB0aGUgd29ya2Zsb3cgY2xhdXNlIG5lZWRzIGEgbGl2ZSByZXVzYWJsZS1kZXBsb3kgY2FsbGVyXG4gIC8vIChZQU1MLXBhcnNlZCBqb2JzLioudXNlcywgbm90IGEgcmF3LXRleHQvY29tbWVudCBtYXRjaCksIGFuZCB0aGUgYHdiIGRlcGxveWAgY2xhdXNlIG5lZWRzIGFcbiAgLy8gZGVwbG95IHNjcmlwdCB3aG9zZSBjb21tYW5kIHRva2VuIGlzIGB3YiDigKYgZGVwbG95YC5cbiAgY29uc3Qgb3duc1dyYW5nbGVyQ29uZmlnID0gYWxsQ29uZmlncy5zb21lKChjb25maWcpID0+IGNvbmZpZy5kb2VzQ29udGFpbldyYW5nbGVyQ29uZmlnKTtcbiAgLy8gT25seSBjbGFpbSB0aGUgZmlsZSBpcyBnZW5lcmF0ZWQgd2hlcmUgaXQgYWN0dWFsbHkgaXM6IGEgcGFja2FnZSB0aGF0IGhhbmQtbWFpbnRhaW5zIGl0cyBgRW52YCAoZS5nLiB1bmRlclxuICAvLyBgdHlwZXM6IFtcImJ1blwiXWApIGlzIGRlbGliZXJhdGVseSBsZWZ0IHVubWFuYWdlZCwgYW5kIHRlbGxpbmcgYW4gYWdlbnQgdG8gcnVuIGB3YiBnZW4tY29kZWAgdGhlcmUgd291bGQgc2VuZFxuICAvLyBpdCBhZnRlciBhIGZpbGUgdGhhdCBuZXZlciBhcHBlYXJzIOKAlCBhbmQgYXdheSBmcm9tIHRoZSBgRW52YCBpdCBzaG91bGQgYmUgZWRpdGluZy5cbiAgY29uc3Qgb3duc0dlbmVyYXRlZFdvcmtlclR5cGVzID0gYWxsQ29uZmlncy5zb21lKChjb25maWcpID0+IGdlbmVyYXRlc1dvcmtlclR5cGVzKGNvbmZpZykpO1xuICBjb25zdCBoYXNEZXBsb3lXb3JrZmxvdyA9IGhhc0Nsb3VkZmxhcmVEZXBsb3lXb3JrZmxvdyhwYXRoLnJlc29sdmUocm9vdENvbmZpZy5kaXJQYXRoLCAnLmdpdGh1Yi93b3JrZmxvd3MnKSk7XG4gIGNvbnN0IHVzZXNXYkRlcGxveSA9IGFsbENvbmZpZ3Muc29tZSgoY29uZmlnKSA9PiB7XG4gICAgY29uc3QgZGVwbG95U2NyaXB0ID0gY29uZmlnLnBhY2thZ2VKc29uPy5zY3JpcHRzPy5bJ2RlcGxveSddO1xuICAgIHJldHVybiAoXG4gICAgICB0eXBlb2YgZGVwbG95U2NyaXB0ID09PSAnc3RyaW5nJyAmJlxuICAgICAgaW52b2tlc1diRGVwbG95KGRlcGxveVNjcmlwdCwgbmV3IFNldChPYmplY3Qua2V5cyhjb25maWcucGFja2FnZUpzb24/LnNjcmlwdHMgPz8ge30pKSlcbiAgICApO1xuICB9KTtcbiAgLy8gSW5kZXBlbmRlbnQgZmFjdHMgc3RheSBzZXBhcmF0ZSBzZW50ZW5jZXM6IHRoZSB3b3JrZmxvdydzIG93biBkZXBsb3kgbWVjaGFuaXNtIGlzIG5vdFxuICAvLyBpbnNwZWN0ZWQsIHNvIHRoZSB3Yi1kZXBsb3kgY2xhdXNlIG11c3Qgbm90IGNsYWltIHRoZSB3b3JrZmxvdyBpbnZva2VzIGl0LlxuICBjb25zdCBjbG91ZGZsYXJlSW5zdHJ1Y3Rpb24gPSBvd25zV3JhbmdsZXJDb25maWdcbiAgICA/IGBcXG4tIFRoaXMgcHJvamVjdCBydW5zIG9uIENsb3VkZmxhcmUgV29ya2VyczogdGhlIHdyYW5nbGVyIGNvbmZpZ3VyYXRpb24gZmlsZSBob2xkcyB0aGUgV29ya2VyJ3MgY29uZmlndXJhdGlvbiwgaW5jbHVkaW5nIGJpbmRpbmdzIGFuZCBwZXItZW52aXJvbm1lbnQgb3ZlcnJpZGVzLiR7aGFzRGVwbG95V29ya2Zsb3cgPyAnIFRoZSBkZXBsb3kgd29ya2Zsb3dzIHVuZGVyIGAuZ2l0aHViL3dvcmtmbG93c2AgcGVyZm9ybSBkZXBsb3ltZW50cy4nIDogJyd9JHt1c2VzV2JEZXBsb3kgPyAnIFRoZSBgZGVwbG95YCBwYWNrYWdlIHNjcmlwdCBydW5zIGB3YiBkZXBsb3lgLicgOiAnJ30ke293bnNHZW5lcmF0ZWRXb3JrZXJUeXBlcyA/IGBcXG4tIFxcYHdvcmtlci1jb25maWd1cmF0aW9uLmQudHNcXGAgaXMgZ2l0aWdub3JlZCBhbmQgZ2VuZXJhdGVkIGJ5IFxcYCR7cGFja2FnZU1hbmFnZXJ9IHdiIGdlbi1jb2RlXFxgOyBhZnRlciBjaGFuZ2luZyBiaW5kaW5ncyBvciB2YXJzIGluIHRoZSB3cmFuZ2xlciBjb25maWd1cmF0aW9uLCByZS1ydW4gaXQgaW5zdGVhZCBvZiBlZGl0aW5nIHRoZSBmaWxlIGJ5IGhhbmQuYCA6ICcnfWBcbiAgICA6ICcnO1xuICAvLyBXaWxsQm9vc3RlciBSYWlsd2F5IHByb2plY3QgaWRlbnRpZmllcnMgYXJlIG1hbmFnZWQgaW4gZGVwbG95IHdvcmtmbG93IHNldHRpbmdzLlxuICBjb25zdCByYWlsd2F5SW5zdHJ1Y3Rpb24gPSByb290Q29uZmlnLmlzUmFpbHdheVxuICAgID8gJ1xcbi0gUmFpbHdheSBwcm9qZWN0IGluZm9ybWF0aW9uIGlzIGluIHRoZSBkZXBsb3kgd29ya2Zsb3dzIHVuZGVyIGAuZ2l0aHViL3dvcmtmbG93c2AuJ1xuICAgIDogJyc7XG4gIGNvbnN0IHBsYXl3cmlnaHRUZXN0U2VydmVySW5zdHJ1Y3Rpb24gPSBoYXNQbGF5d3JpZ2h0VGVzdFNlcnZlcihhbGxDb25maWdzKVxuICAgID8gYFxcbi0gVXNlIFxcYCR7cGFja2FnZU1hbmFnZXJ9IHdiIHN0YXJ0IC0tbW9kZSB0ZXN0XFxgIHRvIGxhdW5jaCBhIHdlYiBzZXJ2ZXIgZm9yIGRlYnVnZ2luZyBvciB0ZXN0aW5nLmBcbiAgICA6ICcnO1xuICBjb25zdCBjb0F1dGhvckluc3RydWN0aW9uID0gcm9vdENvbmZpZy5pc1dpbGxCb29zdGVyUmVwb1xuICAgID8gYFxcbiAgLSBFbmQgeW91ciBjb21taXQgbWVzc2FnZSB3aXRoIGEgYmxhbmsgbGluZSBmb2xsb3dlZCBieSBcXGBDby1hdXRob3JlZC1ieTogV2lsbEJvb3N0ZXIgKCR7dG9vbE5hbWV9KSA8YWdlbnRAd2lsbGJvb3N0ZXIuY29tPlxcYCwgdGhlIG9ubHkgQUkgYXR0cmlidXRpb24gdG8gYWRkLmBcbiAgICA6ICcnO1xuICAvLyBLZXllZCBvbiB0aGUgcmVwb3NpdG9yeSBjbGFzc2lmaWNhdGlvbiByYXRoZXIgdGhhbiBvbiB0aGUgdGVtcGxhdGUgZmlsZXMnIHByZXNlbmNlOiB0aGUgc2FtZVxuICAvLyBydW4gd3JpdGVzIHRoZSB0ZW1wbGF0ZXMgZm9yIFdpbGxCb29zdGVyIC8gV2lsbEJvb3N0ZXJMYWIgcmVwb3NpdG9yaWVzIGJlZm9yZSB0aGlzIGdlbmVyYXRvclxuICAvLyBydW5zLCBhbmQgaGFuZC1hZGRlZCB0ZW1wbGF0ZXMgZWxzZXdoZXJlIGJlbG9uZyB0byBBR0VOVFNfRVhUUkEubWQuXG4gIGNvbnN0IHByVGVtcGxhdGVJbnN0cnVjdGlvbiA9IHJvb3RDb25maWcuaXNXaWxsQm9vc3RlclJlcG9cbiAgICA/IGBcXG4ke1BVTExfUkVRVUVTVF9CT0RZX1JVTEVTLnJlcGxhY2VBbGwoL14vZ20sICcgICcpfWBcbiAgICA6ICcnO1xuICAvLyBHYXRlZCBsaWtlIHByVGVtcGxhdGVJbnN0cnVjdGlvbjogdGhlIHNlY3Rpb24gaXQgbmFtZXMgZXhpc3RzIG9ubHkgd2hlcmUgdGhlIHRlbXBsYXRlIGlzIGdlbmVyYXRlZC5cbiAgY29uc3QgcmVxdWlyZW1lbnRzRXhlbXB0aW9uID0gcm9vdENvbmZpZy5pc1dpbGxCb29zdGVyUmVwb1xuICAgID8gXCIsIGFuZCBzbyBpcyB0aGUgUFIgYm9keSdzIFJlcXVpcmVtZW50cyBzZWN0aW9uLCB3aGljaCByZWNvcmRzIHdoYXQgd2FzIGFza2VkIGZvciByYXRoZXIgdGhhbiB3aGF0IHRoZSBjb2RlIGNvbnRhaW5zXCJcbiAgICA6ICcnO1xuICBjb25zdCBpc3N1ZVRlbXBsYXRlSW5zdHJ1Y3Rpb24gPSByb290Q29uZmlnLmlzV2lsbEJvb3N0ZXJSZXBvXG4gICAgPyBgXFxuLSBXaGVuIGNyZWF0aW5nIGFuIGlzc3VlOlxcbiR7SVNTVUVfVEVNUExBVEVfUlVMRVMucmVwbGFjZUFsbCgvXi9nbSwgJyAgJyl9YFxuICAgIDogJyc7XG4gIGNvbnN0IHJ1bm5lckluc3RydWN0aW9uID0gcm9vdENvbmZpZy5pc1dpbGxCb29zdGVyUmVwb1xuICAgID8gJ1xcbi0gUHJpdmF0ZSByZXBvc2l0b3JpZXMgdXNlIHNlbGYtaG9zdGVkIENJIHJ1bm5lcnMuIEtlZXAgT1Mvc2l6ZSBjb25zdHJhaW50cyBpbiBhbiBleHBsaWNpdCBzZWxmLWhvc3RlZCBsYWJlbCBhcnJheTsgZml4IG1pc3NpbmcgcnVubmVyIGNhcGFiaWxpdGllcyBpbnN0ZWFkIG9mIHN3aXRjaGluZyB0byBHaXRIdWItaG9zdGVkIHJ1bm5lcnMuIFRoZSBzb2xlIGFwcHJvdmVkIGV4Y2VwdGlvbiBpcyB0aGUgV2luZG93cyBkZXNrdG9wIGJ1aWxkIGluIFdpbGxCb29zdGVyL2NoZWVybGluZ3MuJ1xuICAgIDogJyc7XG4gIGNvbnN0IHByb2plY3ROYW1lID0gcm9vdENvbmZpZy5wYWNrYWdlSnNvbj8ubmFtZSB8fCBwYXRoLmJhc2VuYW1lKHBhdGgucmVzb2x2ZShyb290Q29uZmlnLmRpclBhdGgpKTtcbiAgY29uc3QgYmFzZUNvbnRlbnQgPSBgXG4jIyBQcm9qZWN0IEluZm9ybWF0aW9uXG5cbi0gTmFtZTogXFxgJHtwcm9qZWN0TmFtZX1cXGAke2Rlc2NyaXB0aW9uID8gYFxcbi0gRGVzY3JpcHRpb246ICR7ZGVzY3JpcHRpb259YCA6ICcnfVxuLSBQYWNrYWdlIE1hbmFnZXI6ICR7cGFja2FnZU1hbmFnZXJ9XG5cbiMjIEdlbmVyYWwgSW5zdHJ1Y3Rpb25zXG5cbi0gSWYgb24gXFxgbWFpblxcYCwgY3JlYXRlIGEgbmV3IGJyYW5jaDsgb3RoZXJ3aXNlIHdvcmsgb24gdGhlIGN1cnJlbnQgYnJhbmNoLlxuLSBSdW4gXFxgZ2l0XFxgIGNvbW1hbmRzIG9uZSBhdCBhIHRpbWUgdG8gYXZvaWQgXFxgaW5kZXgubG9ja1xcYCBjb25mbGljdHMuXG4ke1RFU1RfV1JJVElOR19SVUxFU31cbi0gV2hlbiBmaXhpbmcgaXNzdWVzIChpbmNsdWRpbmcgdGVzdCBmYWlsdXJlcyksIGludmVzdGlnYXRlIHRoZSByb290IGNhdXNlIGZpcnN0IChlLmcuLCB2aWEgZGVidWcgbG9ncyBvciBzY3JlZW5zaG90cykgYW5kIGZpeCBpdCBpbnN0ZWFkIG9mIGFwcGx5aW5nIHdvcmthcm91bmRzLlxuLSBBZnRlciBtYWtpbmcgY2hhbmdlcywgcnVuIFxcYCR7cGFja2FnZU1hbmFnZXJ9IHJ1biB2ZXJpZnlcXGAgKHR5cGUgY2hlY2tpbmcgYW5kIGxpbnRpbmc7IHVwIHRvIDEwIG1pbnV0ZXMpLCBvciBcXGAke3BhY2thZ2VNYW5hZ2VyfSBydW4gdmVyaWZ5LWZ1bGxcXGAgKGFsbCB0ZXN0czsgdXAgdG8gMSBob3VyKSBpZiB5b3UgY2hhbmdlZCBydW50aW1lIGJlaGF2aW9yIG9yIHRlc3RzLiBGaXggZXJyb3JzIGFuZCByZS1ydW4gdW50aWwgaXQgcGFzc2VzLlxuICAtIFdhaXQgZm9yIGl0IHRvIGZpbmlzaCB3aXRob3V0IHJlc3RhcnRpbmcgaXQ6IHByZWZlciBjb21wbGV0aW9uIG5vdGlmaWNhdGlvbnMsIG90aGVyd2lzZSB0aGUgbG9uZ2VzdCBwZXJtaXR0ZWQgd2FpdDsgbm8gb3V0cHV0IGRvZXMgbm90IG1lYW4gaXQgaGFzIHN0b3BwZWQuIElmIHRoZSBkaXNwbGF5ZWQgZXhjZXJwdCBpcyBpbnN1ZmZpY2llbnQsIHJlYWQgdGhlIGluZGljYXRlZCBsb2cgZmlsZSBiZWZvcmUgcmVydW5uaW5nLiBJZiB0aGUgZW52aXJvbm1lbnQga2lsbHMgbG9uZy1ydW5uaW5nIGNvbW1hbmRzLCBydW4gdGhlbSBkZXRhY2hlZCB3aXRoIGEgc2F2ZWQgbG9nIGFuZCBleGl0IHN0YXR1cy5cbi0gT25jZSB2ZXJpZmllZCwgY29tbWl0IGFuZCBwdXNoIHRvIHRoZSBjdXJyZW50IChub24tbWFpbikgYnJhbmNoLCBhbmQgY3JlYXRlIGEgUFIgdmlhIFxcYGdoXFxgIGlmIG5vbmUgZXhpc3RzIGZvciB0aGUgYnJhbmNoLlxuICAtIEZvbGxvdyB0aGUgQ29udmVudGlvbmFsIENvbW1pdHMgZm9ybWF0IChlLmcuLCBcXGBmZWF0OlxcYCwgXFxgZml4OlxcYCkuJHtjb0F1dGhvckluc3RydWN0aW9ufVxuICAtIEFsd2F5cyBjcmVhdGUgbmV3IGNvbW1pdHM7IGF2b2lkIFxcYC0tYW1lbmRcXGAuJHtwclRlbXBsYXRlSW5zdHJ1Y3Rpb259JHtpc3N1ZVRlbXBsYXRlSW5zdHJ1Y3Rpb259XG4tIEluIGFueSBleHBsYW5hdG9yeSB0ZXh0IChjb21taXQgbWVzc2FnZXMsIFBSIGRlc2NyaXB0aW9ucywgZG9jdW1lbnRhdGlvbiwgY29kZSBjb21tZW50cywgZXRjLiksIGRlc2NyaWJlIG9ubHkgdGhlIGN1cnJlbnQgaW1wbGVtZW50YXRpb246IGRyb3AgYW55IHN0YXRlbWVudCBuYW1pbmcgYW4gaWRlbnRpZmllciwgZmVhdHVyZSwgb3IgY29uY2VwdCB5b3UgY2Fubm90IGNvbmZpcm0gZXhpc3RzIGluIHRoZSBmaW5hbCBkaWZmIG9yIHRoZSBjdXJyZW50IGNvZGViYXNlIChlLmcuLCBvbmUgYWRkZWQgYW5kIGxhdGVyIHJlbW92ZWQgb3IgcmVuYW1lZCBhbG9uZyB0aGUgd2F5KS4gV2hlbmV2ZXIgZG9jdW1lbnRhdGlvbiBvciBjb21tZW50cyBubyBsb25nZXIgbWF0Y2ggdGhlIGN1cnJlbnQgaW1wbGVtZW50YXRpb24gKHJlbW92ZWQgb3B0aW9ucywgZGVwcmVjYXRlZCB1c2FnZSwgb3V0ZGF0ZWQgYmVoYXZpb3IpLCBkZWxldGUgb3IgcmV3cml0ZSB0aGVtLCBldmVuIGluIGZpbGVzIHlvdSBhcmUgbm90IG90aGVyd2lzZSBjaGFuZ2luZy4gTWVudGlvbiBhIHBhc3Qgc3RhdGUgb25seSB3aGVyZSBpdCBpcyBuZWVkZWQgdG8gdW5kZXJzdGFuZCB3aHkgdGhlIGN1cnJlbnQgZGVzaWduIGlzIGFzIGl0IGlzLCBvciB3aGVuIGV4cGxpY2l0bHkgYXNrZWQ7IGZpbGVzIHRoYXQgcmVjb3JkIGhpc3RvcnkgYnkgZGVzaWduIChlLmcuLCBhIGNoYW5nZWxvZykgYXJlIGV4ZW1wdCR7cmVxdWlyZW1lbnRzRXhlbXB0aW9ufS5cbi0gVXNlIGhlcmVkb2MgZm9yIG11bHRpLWxpbmUgY29tbWFuZCBpbnB1dCAoZS5nLiwgXFxgZ2l0IGNvbW1pdCAtRiAtXFxgLCBcXGBnaCBwciBjcmVhdGUgLS1ib2R5LWZpbGUgLVxcYCwgXFxgZ2ggaXNzdWUgY3JlYXRlIC0tYm9keS1maWxlIC1cXGApLlxuLSBQdXQgdGVtcG9yYXJ5IGZpbGVzIGluIFxcYC50bXBcXGA7IHVzZSBcXGAvdG1wXFxgIG9ubHkgZm9yIGZpbGVzIHRoYXQgbXVzdCBsaXZlIG91dHNpZGUgdGhlIHJlcG8uXG4tIFxcYEFHRU5UUy5tZFxcYCwgXFxgQ0xBVURFLm1kXFxgLCBcXGBHRU1JTkkubWRcXGAsIFxcYC5jdXJzb3IvcnVsZXMvZ2VuZXJhbC5tZGNcXGAsIGFuZCBcXGAuZ2VtaW5pL3N0eWxlZ3VpZGUubWRcXGAgYXJlIGdlbmVyYXRlZCBmcm9tIFxcYEFHRU5UU19FWFRSQS5tZFxcYCBhbmQgb3ZlcndyaXR0ZW4gb24gZXZlcnkgXFxgd2JmeVxcYCBydW47IHRvIGNoYW5nZSBhZ2VudCBpbnN0cnVjdGlvbnMsIGVkaXQgb25seSBcXGBBR0VOVFNfRVhUUkEubWRcXGAuJHttaXNlSW5zdHJ1Y3Rpb259JHtpc29sYXRlZEluc3RhbGxJbnN0cnVjdGlvbn0ke2Zub3hJbnN0cnVjdGlvbn0ke2Nsb3VkZmxhcmVJbnN0cnVjdGlvbn0ke3JhaWx3YXlJbnN0cnVjdGlvbn0ke3BsYXl3cmlnaHRUZXN0U2VydmVySW5zdHJ1Y3Rpb259JHtydW5uZXJJbnN0cnVjdGlvbn1cblxuJHtnZW5lcmF0ZUFnZW50Q29kaW5nU3R5bGUocm9vdENvbmZpZywgYWxsQ29uZmlncyl9XG5gXG4gICAgLnJlcGxhY2VBbGwoL1xcLlxcblxcbistL2csICcuXFxuLScpXG4gICAgLnJlcGxhY2VBbGwoL1xcbnszLH0vZywgJ1xcblxcbicpXG4gICAgLnRyaW0oKTtcblxuICBjb25zdCBoYXNOZXdTZWN0aW9uID0gZXh0cmFDb250ZW50Py50cmltKCkuc3RhcnRzV2l0aCgnIycpO1xuICBjb25zdCBub3JtYWxpemVkRXh0cmFDb250ZW50ID0gZXh0cmFDb250ZW50XG4gICAgPyBoYXNOZXdTZWN0aW9uXG4gICAgICA/ICdcXG5cXG4nICsgZXh0cmFDb250ZW50LnRyaW0oKVxuICAgICAgOiAnXFxuJyArIGV4dHJhQ29udGVudFxuICAgIDogJyc7XG4gIHJldHVybiBiYXNlQ29udGVudCArIG5vcm1hbGl6ZWRFeHRyYUNvbnRlbnQ7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZW5lcmF0ZUFnZW50Q29kaW5nU3R5bGUocm9vdENvbmZpZzogUGFja2FnZUNvbmZpZywgYWxsQ29uZmlnczogUGFja2FnZUNvbmZpZ1tdKTogc3RyaW5nIHtcbiAgLy8gVGF1cmkgZGVza3RvcCBhcHBzIHNoaXAgV2luZG93cyBidWlsZHMsIGFuZCB0aGUgYm91bmRhcnkgYmV0d2VlbiBhcHAgY29kZSBhbmQgc2hhcmVkIGNvZGUgaXNcbiAgLy8gdG9vIGZ1enp5IHRvIHNjb3BlIHRoZSBtYWNPUy9MaW51eC1vbmx5IHJ1bGUgcGVyIHBhY2thZ2UsIHNvIHN1Y2ggcmVwb3NpdG9yaWVzIHRhcmdldCBhbGxcbiAgLy8gdGhyZWUgT1NlcyBpbnN0ZWFkLlxuICBjb25zdCBoYXNEZXNrdG9wQXBwID0gYWxsQ29uZmlncy5zb21lKChjKSA9PiBjLmRlcGVuZGluZy50YXVyaSB8fCBjLmRvZXNDb250YWluVGF1cmlDb25maWdJblBhY2thZ2VzKTtcbiAgLy8gQSBwdWJsaWMgcmVwb3NpdG9yeSB3aXRoIG5vIGBAd2lsbGJvb3N0ZXIvYCBwYWNrYWdlIGlzIE9TUyBmb3IgdGhlIGdlbmVyYWwgcHVibGljLCB3aG9zZSB1c2Vyc1xuICAvLyBtYXkgcnVuIFdpbmRvd3MsIHNvIG5vIE9TIHJlc3RyaWN0aW9uIGFwcGxpZXMgdGhlcmUuIEFuIHVua25vd24gdmlzaWJpbGl0eSBjb2xsYXBzZXMgdG9cbiAgLy8gaXNQdWJsaWNSZXBvPWZhbHNlIGFuZCB0aGVyZWZvcmUga2VlcHMgdGhlIHJlc3RyaWN0aXZlIGRlZmF1bHQuXG4gIGNvbnN0IGlzR2VuZXJhbFB1YmxpY09zcyA9XG4gICAgcm9vdENvbmZpZy5pc1B1YmxpY1JlcG8gJiYgYWxsQ29uZmlncy5ldmVyeSgoYykgPT4gIWMucGFja2FnZUpzb24/Lm5hbWU/LnN0YXJ0c1dpdGgoJ0B3aWxsYm9vc3Rlci8nKSk7XG4gIC8vIE9ubHkgcHVibGljIHJlcG9zaXRvcmllcyBwdWJsaXNoIHBhY2thZ2VzIHRvIHRoZSBwdWJsaWMgbnBtIHJlZ2lzdHJ5LCB3aG9zZSB1c2VycyByZWFkIHRoZVxuICAvLyBKU0RvYyB3aXRob3V0IHRoZSBzb3VyY2U7IHByaXZhdGUgcmVwb3NpdG9yaWVzIGFyZSByZWFkIG9ubHkgYnkgYWdlbnRzIHRoYXQgaGF2ZSB0aGUgc291cmNlLlxuICBjb25zdCBucG1BcGlFeGNlcHRpb24gPSByb290Q29uZmlnLmlzUHVibGljUmVwb1xuICAgID8gJyBFeGNlcHRpb246IHRoZSBleHBvcnRlZCBBUEkgb2YgYSBwYWNrYWdlIHB1Ymxpc2hlZCB0byBucG0gbWF5IGNhcnJ5IEpTRG9jIGRlc2NyaWJpbmcgd2hhdCBpdCBkb2VzIGFuZCBob3cgdG8gY2FsbCBpdCwgYmVjYXVzZSBpdHMgdXNlcnMgcmVhZCBpdCB3aXRob3V0IHRoZSBzb3VyY2UuJ1xuICAgIDogJyc7XG4gIGNvbnN0IGNvbW1lbnRJbnN0cnVjdGlvbiA9IGAtIENvbW1lbnRzIGFuZCBKU0RvYzogZXZlcnkgcmVhZGVyIGhhcyB0aGUgc291cmNlLCBzbyBuZXZlciByZXN0YXRlIHdoYXQgdGhlIGNvZGUsIGl0cyBuYW1lcywgb3IgaXRzIHR5cGVzIGFscmVhZHkgc2F5IChlLmcuLCBcXGBAcGFyYW0gbmFtZSBUaGUgbmFtZVxcYCwgXFxgQHJldHVybnMgdGhlIHJlc3VsdFxcYCwgYSBuYXJyYXRpb24gb2YgdGhlIGNvbnRyb2wgZmxvdykuIFdyaXRlIG9uZSBvbmx5IHdoZW4gYSBwbGF1c2libGUgZWRpdCAoc2ltcGxpZnlpbmcsIGRlbGV0aW5nLCByZW9yZGVyaW5nLCByZXBsYWNpbmcpIHdvdWxkIGJyZWFrIHNvbWV0aGluZyB3aXRob3V0IHRoYXQga25vd2xlZGdlIGFuZCBubyB0eXBlIGNoZWNrLCBsaW50IHJ1bGUsIG9yIGV4aXN0aW5nIHRlc3Qgd291bGQgY2F0Y2ggdGhlIGJyZWFrYWdlOyBmaXJzdCB0cnkgdG8gZW5jb2RlIHRoZSBrbm93bGVkZ2UgaW4gY29kZSAoYSBuYW1lIHN1Y2ggYXMgXFxgdGltZW91dE1zXFxgLCBhIHR5cGUsIGFuIFxcYGFzc2VydFxcYCwgYSB0ZXN0KSBhbmQgY29tbWVudCBvbmx5IHdoYXQgY2Fubm90IGJlIGVuY29kZWQ6IGEgZGVsaWJlcmF0ZWx5IG9kZC1sb29raW5nIHdvcmthcm91bmQsIGEgZGVwZW5kZW5jeSBvbiBhIGZhY3Qgb3V0c2lkZSB0aGUgcmVwb3NpdG9yeSAoYW4gZXh0ZXJuYWwgQVBJJ3MgYmVoYXZpb3IsIGFuIGFncmVlbWVudCB3aXRoIGFub3RoZXIgc3lzdGVtKSwgb3IgYSByZWplY3RlZCBhbHRlcm5hdGl2ZSBhbmQgd2h5LiBQdXQgaXQgaW4gSlNEb2Mgd2hlbiBpdCBpcyBhIGNvbnRyYWN0IG9mIHRoZSBkZWNsYXJlZCBzeW1ib2wsIHNvIGNhbGxlcnMgc2VlIGl0LCBhbmQgaW4gYW4gaW5saW5lIGNvbW1lbnQgd2hlbiBpdCBjb25jZXJucyBzcGVjaWZpYyBsaW5lcy4gRGVsZXRlIGNvbW1lbnRzIHRoYXQgZmFpbCB0aGlzIHRlc3QgaW4gZmlsZXMgeW91IHRvdWNoLiR7bnBtQXBpRXhjZXB0aW9ufWA7XG4gIGNvbnN0IG9zQ29tcGF0aWJpbGl0eUluc3RydWN0aW9uID0gaXNHZW5lcmFsUHVibGljT3NzXG4gICAgPyAnJ1xuICAgIDogaGFzRGVza3RvcEFwcFxuICAgICAgPyAnLSBFbnN1cmUgY29tcGF0aWJpbGl0eSB3aXRoIFdpbmRvd3MsIG1hY09TLCBhbmQgTGludXguJ1xuICAgICAgOiAnLSBFbnN1cmUgY29tcGF0aWJpbGl0eSBvbmx5IHdpdGggbWFjT1MgYW5kIExpbnV4OyBkbyBub3QgaW5jbHVkZSBXaW5kb3dzLXNwZWNpZmljIGNvZGUuJztcbiAgLy8gQ2xvdWRmbGFyZSBXb3JrZXJzIGV4ZWN1dGUgYWNyb3NzIG1hbnkgZXBoZW1lcmFsIGlzb2xhdGVzIGFuZCB0d28gcmVxdWVzdHMgYXJlIG5vdCBndWFyYW50ZWVkXG4gIC8vIHRvIGhpdCB0aGUgc2FtZSBpbnN0YW5jZSwgc28gdGhlIHNpbmdsZS1pbnN0YW5jZSBzaW1wbGlmaWNhdGlvbiBzaWxlbnRseSBsb3NlcyBzdGF0ZSB0aGVyZSDigJRcbiAgLy8gYnV0IFdvcmtlcnMgZGVsaWJlcmF0ZWx5IHJldXNlIGV4ZWN1dGlvbiBjb250ZXh0cywgc28gYmVzdC1lZmZvcnQgaXNvbGF0ZS1sb2NhbCBjYWNoZXMgc3RheVxuICAvLyBsZWdpdGltYXRlIChodHRwczovL2RldmVsb3BlcnMuY2xvdWRmbGFyZS5jb20vd29ya2Vycy9yZWZlcmVuY2UvaG93LXdvcmtlcnMtd29ya3MvKS4gVGhlXG4gIC8vIHNpZ25hbHMgYXJlIGNvcnJlbGF0ZWQgUEVSIFBBQ0tBR0U6IGEgbW9ub3JlcG8gY2FuIGhvc3QgYSBzaW5nbGUtaW5zdGFuY2Ugc2VydmVyIGFwcCBuZXh0IHRvXG4gIC8vIGFuIHVucmVsYXRlZCBXb3JrZXIsIGFuZCBuZWl0aGVyIG1heSBvdmVycmlkZSB0aGUgb3RoZXIncyBydWxlLiBkb2VzQ29udGFpbldyYW5nbGVyQ29uZmlnIGlzXG4gIC8vIHRoZSBhY2N1cmF0ZSBXb3JrZXJzIHNpZ25hbCAoaXNDbG91ZGZsYXJlIGFsc28gbWF0Y2hlcyBhIG1lcmUgd3JhbmdsZXIgbWVudGlvbiBpbiBhIHNjcmlwdCBvclxuICAvLyB3b3JrZmxvdykuXG4gIGNvbnN0IGhhc1dvcmtlcnNBcHAgPSBhbGxDb25maWdzLnNvbWUoKGMpID0+IGMuZG9lc0NvbnRhaW5XcmFuZ2xlckNvbmZpZyk7XG4gIGNvbnN0IGhhc1NpbmdsZUluc3RhbmNlU2VydmVyQXBwID0gYWxsQ29uZmlncy5zb21lKFxuICAgIChjKSA9PiAoYy5kZXBlbmRpbmcubmV4dCB8fCBjLmRlcGVuZGluZy52aW5leHQpICYmICFjLmRvZXNDb250YWluV3JhbmdsZXJDb25maWdcbiAgKTtcbiAgY29uc3Qgd29ya2Vyc0luc3RydWN0aW9uID1cbiAgICAnLSBDbG91ZGZsYXJlIFdvcmtlcnMgcnVuIGFjcm9zcyBtYW55IGVwaGVtZXJhbCBpc29sYXRlcywgc28gdHdvIHJlcXVlc3RzIG1heSBoaXQgZGlmZmVyZW50IGluc3RhbmNlczogbmV2ZXIgbGV0IGNvcnJlY3RuZXNzIGRlcGVuZCBvbiBtb2R1bGUtbGV2ZWwgbXV0YWJsZSBzdGF0ZTsgcGVyc2lzdCBhdXRob3JpdGF0aXZlIHNoYXJlZCBzdGF0ZSBpbiBiaW5kaW5ncyAoRDEsIEtWLCBSMiwgRHVyYWJsZSBPYmplY3RzKS4gQmVzdC1lZmZvcnQgaXNvbGF0ZS1sb2NhbCBjYWNoZXMgb2Ygbm9uLXJlcXVlc3Qtc2NvcGVkIGRhdGEgYXJlIGZpbmUuJztcbiAgY29uc3Qgc2VydmVySW5zdGFuY2VJbnN0cnVjdGlvbiA9IGhhc1dvcmtlcnNBcHBcbiAgICA/IGhhc1NpbmdsZUluc3RhbmNlU2VydmVyQXBwXG4gICAgICA/IGAke3dvcmtlcnNJbnN0cnVjdGlvbn0gVGhpcyBhcHBsaWVzIHRvIGFsbCBjb2RlIHJ1bm5pbmcgb24gQ2xvdWRmbGFyZSBXb3JrZXJzICh0aGUgd3JhbmdsZXItY29uZmlndXJlZCBwYWNrYWdlcyBhbmQgYW55IHdvcmtzcGFjZSBwYWNrYWdlIHRoZXkgaW1wb3J0KTsgYXNzdW1lIGEgc2luZ2xlIHNlcnZlciBpbnN0YW5jZSBmb3IgdGhlIG90aGVyIHNlcnZlciBhcHBzLmBcbiAgICAgIDogd29ya2Vyc0luc3RydWN0aW9uXG4gICAgOiBoYXNTaW5nbGVJbnN0YW5jZVNlcnZlckFwcFxuICAgICAgPyAnLSBBc3N1bWUgYSBzaW5nbGUgc2VydmVyIGluc3RhbmNlLidcbiAgICAgIDogJyc7XG4gIC8vIEtlZXAgdG9wLWRvd24gb3JkZXJpbmcgZ3VpZGFuY2UgZnVuY3Rpb24tb25seSBiZWNhdXNlIGNsYXNzZXMgYXJlIG5vdCBob2lzdGVkIGFuZCBjYW4gZmFpbCB3aGVuIGluaGVyaXRhbmNlIG9yIHRvcC1sZXZlbCBpbnN0YW50aWF0aW9uIGRlcGVuZHMgb24gZGVjbGFyYXRpb24gb3JkZXIuXG4gIHJldHVybiBgXG4jIyBDb2RpbmcgU3R5bGVcblxuLSBVc2UgY2FtZWxDYXNlIGZpbGUgbmFtZXMgZm9yIEphdmFTY3JpcHQvVHlwZVNjcmlwdCAoUGFzY2FsQ2FzZSBmb3IgUmVhY3QgY29tcG9uZW50cykuXG4tIFNpbXBsaWZ5IGNvZGUgYXMgbXVjaCBhcyBwb3NzaWJsZSB0byBlbGltaW5hdGUgcmVkdW5kYW5jeS5cbi0gRGVzaWduIG1vZHVsZXMgYW5kIGRpcmVjdG9yaWVzIHdpdGggaGlnaCBjb2hlc2lvbiBhbmQgbG93IGNvdXBsaW5nOyBzcGxpdCBsYXJnZSBtb2R1bGVzIHdoZW4gbmVlZGVkLlxuLSBQbGFjZSBjYWxsaW5nIGZ1bmN0aW9ucyBhYm92ZSB0aGUgZnVuY3Rpb25zIHRoZXkgY2FsbCAodG9wLWRvd24gb3JkZXIpOyBwbGFjZSB2YXJpYWJsZSBhbmQgdHlwZSBkZWNsYXJhdGlvbnMgYWJvdmUgdGhlaXIgdXNhZ2UuXG4ke2NvbW1lbnRJbnN0cnVjdGlvbn1cbi0gTmV2ZXIgZXhwbGFpbiBob3cgV2lsbEJvb3N0ZXIncyBpbi1ob3VzZSB0b29scyAoZS5nLiwgXFxgd2JcXGAsIFxcYHdiZnlcXGApIHdvcmsgaW4gY29kZSBjb21tZW50cyBvciBkb2N1bWVudHMgb3V0c2lkZSB0aGUgdG9vbCdzIG93biBwYWNrYWdlLCBleGNlcHQgaW4gaW5zdHJ1Y3Rpb25zIGZvciBBSSBhZ2VudHMgKGUuZy4sIGRvIG5vdCBub3RlIHRoYXQgXFxgUE9SVFxcYCBpcyB1bnNldCBiZWNhdXNlIFxcYHdiXFxgIHBpY2tzIGEgZnJlZSBwb3J0KS5cbi0gSWYgbGludCBlcnJvcnMgb3Igd2FybmluZ3MgY2Fubm90IGJlIGZpeGVkLCB1c2UgaWdub3JlIGNvbW1lbnRzIHdpdGggcmVhc29ucyAoZS5nLiwgXFxgLy8gb3hsaW50LWRpc2FibGUtbmV4dC1saW5lIDxydWxlPiAtLSA8cmVhc29uPlxcYCkuXG4tIFByZWZlciBcXGB1bmRlZmluZWRcXGAgb3ZlciBcXGBudWxsXFxgIHVubGVzcyByZXF1aXJlZCBieSBBUElzIG9yIGxpYnJhcmllcy5cbi0gVmFsaWRhdGUgSmF2YVNjcmlwdCBvYmplY3RzIChlLmcuLCBwYXJzZWQgSlNPTiwgQVBJIHJlc3BvbnNlcykgd2l0aCBcXGB6b2RcXGAgd2hlbmV2ZXIgcG9zc2libGUgaW5zdGVhZCBvZiBoYW5kLXdyaXR0ZW4gY2hlY2tzIG9yIHR5cGUgYXNzZXJ0aW9ucy5cbi0gQnVpbGQgcHJvbXB0cyBhcyBhIHNpbmdsZSB0ZW1wbGF0ZSBsaXRlcmFsIGluc3RlYWQgb2YgXFxgam9pbigpXFxgIG9uIGEgcHJlLWNvbXB1dGFibGUgYXJyYXkgb2Ygc3RyaW5ncy5cbi0gQXNzdW1lIGFsbCBlbnZpcm9ubWVudCB2YXJpYWJsZXMgYXJlIGRlZmluZWQ7IGlmIHZhbGlkYXRpb24gaXMgbmVlZGVkLCBcXGBhc3NlcnRcXGAgdGhlbSBhdCBzdGFydHVwIHRvIGZhaWwgZmFzdC5cbi0gQXNzdW1lIGxvY2FsIHRvb2xzIHN1Y2ggYXMgXFxgZ2l0XFxgLCBcXGBnaFxcYCwgYW5kIFxcYGdocVxcYCBhcmUgaW5zdGFsbGVkIGFuZCBhdXRoZW50aWNhdGVkLlxuJHtvc0NvbXBhdGliaWxpdHlJbnN0cnVjdGlvbn1cbiR7XG4gIGFsbENvbmZpZ3Muc29tZSgoYykgPT4gYy5kZXBlbmRpbmcuZ2VuSTE4blRzKVxuICAgID8gYC0gUmVnaXN0ZXIgc3RyaW5nIGxpdGVyYWxzIGZvciBSZWFjdCBjb21wb25lbnRzIGluIHRoZSBcXGBpMThuXFxgIHJlc291cmNlIGZpbGVzIChlLmcuLCBcXGBpMThuL2phLUpQLmpzb25cXGApIGFuZCByZWZlcmVuY2UgdGhlbSB2aWEgdGhlIFxcYGkxOG5cXGAgdXRpbGl0eSAoZS5nLiwgXFxgaTE4bi5wYWdlcy5ob21lLnRpdGxlKClcXGAgZm9yIFxcYHsgXCJwYWdlc1wiOiB7IFwiaG9tZVwiOiB7IFwidGl0bGVcIjogXCJNeSBBcHBcIiB9IH0gfVxcYCkuYFxuICAgIDogJydcbn1cblxuJHtcbiAgYWxsQ29uZmlncy5zb21lKChjKSA9PiBjLmRlcGVuZGluZy5yZWFjdCB8fCBjLmRlcGVuZGluZy5uZXh0IHx8IGMuZGVwZW5kaW5nLnZpbmV4dClcbiAgICA/IGAtIFByZWZlciBsYW1iZGEgb3ZlciBcXGBmdW5jdGlvblxcYCBmb3IgUmVhY3QgY29tcG9uZW50cywgZS5nLiwgXFxgY29uc3QgQnV0dG9uOiBSZWFjdC5GQyA9ICgpID0+IHtcXGAuXG4tIFByZWZlciBcXGB1c2VJbW1lclxcYCBvdmVyIFxcYHVzZVN0YXRlXFxgIGZvciBhcnJheXMgYW5kIG9iamVjdHMuXG4tIFVzZSBcXGBhdXRvRm9jdXNcXGAgd2hlcmUgaXQgcmVkdWNlcyB1c2VyIGVmZm9ydC5gXG4gICAgOiAnJ1xufVxuJHtcbiAgLy8gdmluZXh0IGlzIHRoZSBvcmcncyBjdXJyZW50IHdlYi1hcHAgZnJhbWV3b3JrIGFuZCBlbmFibGVzIHRoZSBSZWFjdCBDb21waWxlciBqdXN0IGFzIE5leHQuanNcbiAgLy8gZG9lcywgc28gaXQgbXVzdCBub3QgbWlzcyB0aGlzIHJ1bGUuXG4gIGFsbENvbmZpZ3Muc29tZSgoYykgPT4gYy5kZXBlbmRpbmcubmV4dCB8fCBjLmRlcGVuZGluZy52aW5leHQpXG4gICAgPyBgXG4tIFRoaXMgcHJvamVjdCB1c2VzIHRoZSBSZWFjdCBDb21waWxlciwgc28gXFxgdXNlQ2FsbGJhY2tcXGAgYW5kIFxcYHVzZU1lbW9cXGAgYXJlIHVubmVjZXNzYXJ5IGZvciBwZXJmb3JtYW5jZS5cbmBcbiAgICA6ICcnXG59XG4ke3NlcnZlckluc3RhbmNlSW5zdHJ1Y3Rpb259XG5gXG4gICAgLnJlcGxhY2VBbGwoL1xcLlxcblxcbistL2csICcuXFxuLScpXG4gICAgLnJlcGxhY2VBbGwoL1xcbnszLH0vZywgJ1xcblxcbicpXG4gICAgLnRyaW0oKTtcbn1cblxuZnVuY3Rpb24gaGFzUGxheXdyaWdodFRlc3RTZXJ2ZXIoY29uZmlnczogUGFja2FnZUNvbmZpZ1tdKTogYm9vbGVhbiB7XG4gIHJldHVybiBjb25maWdzLnNvbWUoKGNvbmZpZykgPT4gY29uZmlnLmRlcGVuZGluZy5wbGF5d3JpZ2h0VGVzdCk7XG59XG4iLCIiLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgcmVsZWFzZUFnZUdhdGUgZnJvbSAnLi4vLi4vY29uZmlncy9yZWxlYXNlQWdlR2F0ZS5qc29uJyB3aXRoIHsgdHlwZTogJ2pzb24nIH07XG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBmc1V0aWwgfSBmcm9tICcuLi91dGlscy9mc1V0aWwuanMnO1xuaW1wb3J0IHsgcHJvbWlzZVBvb2wgfSBmcm9tICcuLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5cbmludGVyZmFjZSBCdW5maWdUb21sIHtcbiAgaW5zdGFsbD86IHtcbiAgICBleGFjdD86IGJvb2xlYW47XG4gICAgZ2xvYmFsU3RvcmU/OiBib29sZWFuO1xuICAgIGxpbmtlcj86IHN0cmluZztcbiAgfTtcbn1cblxuLy8gY29uZmlncy9yZWxlYXNlQWdlR2F0ZS5qc29uIGlzIHRoZSBvcmdhbml6YXRpb24ncyBzaW5nbGUgc291cmNlIG9mIHRydXRoIGZvciB0aGUgcG9saWN5OiB0aGVcbi8vIG1hY2hpbmVzJyBnbG9iYWwgY29uZmlncyBnZXQgaXQgdGhyb3VnaCBjb25maWdzL2FwcGx5UmVsZWFzZUFnZUdhdGUuc2ggKHJ1biBieSB3YmZ5IGl0c2VsZiwgYnlcbi8vIHJldXNhYmxlLXdvcmtmbG93cyBvbiBDSSwgYW5kIGJ5IHNlbGYtaG9zdC11dGlscyBvbiB0aGUgcnVubmVycyksIGFuZCByZXBvc2l0b3JpZXMgZ2V0IGl0IGhlcmUuXG4vLyBPbmx5IG91ciBvd24gcGFja2FnZXMgYXJlIGV4ZW1wdDogd2UgY29udHJvbCB3aG8gcHVibGlzaGVzIHRoZW0sIHNvIGEgY29tcHJvbWlzZWQgcmVsZWFzZSBjYW5ub3Rcbi8vIHJlYWNoIHVzIHRocm91Z2ggYW4gdXBzdHJlYW0gbWFpbnRhaW5lcidzIHN0b2xlbiBjcmVkZW50aWFscy4gVGhhdCBjb3ZlcnMgZXZlcnlcbi8vIEB3aWxsYm9vc3Rlci1wcml2YXRlIHBhY2thZ2UgKHRoZSBzY29wZSByZXNvbHZlcyBvbmx5IGZyb20gb3VyIG93biByZWdpc3RyeSksIGJ1dCBidW4sIG5wbSwgYW5kXG4vLyBZYXJuIG1hdGNoIGV4Y2x1ZGUgZW50cmllcyBieSBleGFjdCBuYW1lIOKAlCBubyBAc2NvcGUvKiBwYXR0ZXJucyDigJQgc28gZWFjaCBuZXcgcGFja2FnZSBpbiB0aGVcbi8vIHNjb3BlIG11c3QgYmUgYWRkZWQgdG8gY29uZmlncy9yZWxlYXNlQWdlR2F0ZS5qc29uIHdoZW4gaXQgaXMgZmlyc3QgcHVibGlzaGVkLiBUaGlyZC1wYXJ0eVxuLy8gcGFja2FnZXMg4oCUIGluY2x1ZGluZ1xuLy8gdG9vbGluZyB3YmZ5IHBpbnMgaXRzZWxmIOKAlCBzdGF5IGFnZS1nYXRlZDsgZ2V0TGF0ZXN0QWdlR2F0ZWREZXBlbmRlbmN5VmVyc2lvbiBpbiBwYWNrYWdlSnNvbi50c1xuLy8gcGlucyB0aGUgbmV3ZXN0IHJlbGVhc2Ugb2xkIGVub3VnaCB0byBwYXNzIHRoZSBnYXRlLCBzbyBwaW5uaW5nIGtlZXBzIHdvcmtpbmcgd2l0aG91dCBhbiBleGVtcHRpb24uXG5leHBvcnQgY29uc3QgYnVuTWluaW11bVJlbGVhc2VBZ2VTZWNvbmRzID0gcmVsZWFzZUFnZUdhdGUuZGF5cyAqIDI0ICogNjAgKiA2MDtcbmV4cG9ydCBjb25zdCBidW5NaW5pbXVtUmVsZWFzZUFnZUV4Y2x1ZGVzID0gcmVsZWFzZUFnZUdhdGUuZXhjbHVkZXM7XG5cbmV4cG9ydCBmdW5jdGlvbiByZWFkQnVuR2xvYmFsU3RvcmUocm9vdERpclBhdGg6IHN0cmluZyk6IGJvb2xlYW4gfCB1bmRlZmluZWQge1xuICBjb25zdCBmaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShyb290RGlyUGF0aCwgJ2J1bmZpZy50b21sJyk7XG4gIGlmICghZnMuZXhpc3RzU3luYyhmaWxlUGF0aCkpIHJldHVybiB1bmRlZmluZWQ7XG4gIHJldHVybiBwYXJzZUJ1bmZpZ1RvbWwoZnMucmVhZEZpbGVTeW5jKGZpbGVQYXRoLCAndXRmOCcpKT8uaW5zdGFsbD8uZ2xvYmFsU3RvcmU7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiByZXNvbHZlQnVuR2xvYmFsU3RvcmUoXG4gIGNvbmZpZ3M6IFBhY2thZ2VDb25maWdbXSxcbiAgcHJldmlvdXNHbG9iYWxTdG9yZTogYm9vbGVhbiB8IHVuZGVmaW5lZCxcbiAgc2tpcERlcHM6IGJvb2xlYW5cbik6IGJvb2xlYW4ge1xuICBjb25zdCBkZWZhdWx0VXNlR2xvYmFsU3RvcmUgPSBzaG91bGRVc2VCdW5HbG9iYWxTdG9yZShjb25maWdzKTtcbiAgcmV0dXJuIHNraXBEZXBzID8gKHByZXZpb3VzR2xvYmFsU3RvcmUgPz8gZGVmYXVsdFVzZUdsb2JhbFN0b3JlKSA6IGRlZmF1bHRVc2VHbG9iYWxTdG9yZTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHNob3VsZFVzZUJ1bkdsb2JhbFN0b3JlKGNvbmZpZ3M6IFBhY2thZ2VDb25maWdbXSk6IGJvb2xlYW4ge1xuICAvLyBCbGl0eiBidWlsZHMgb24gTmV4dC5qcyBidXQgbmVlZCBub3QgZGVjbGFyZSBpdCBkaXJlY3RseSwgYW5kIGl0cyBjb2RlZ2VuIGFsc28gcGF0Y2hlcyBOZXh0XG4gIC8vIGluc2lkZSBub2RlX21vZHVsZXMuIEJvdGggZnJhbWV3b3JrcyB0aGVyZWZvcmUgcmVxdWlyZSBwcm9qZWN0LWxvY2FsIGlzb2xhdGVkIGluc3RhbGxzLlxuICAvLyBTbGlkZXYgbG9hZHMgb3B0aW9uYWwgVnVlIGNvbXBpbGVyIHBlZXJzIHRocm91Z2ggbG9jYWwtcGtnLiBUaGUgZ2xvYmFsIHN0b3JlIHJlYWxwYXRoc1xuICAvLyBsb2NhbC1wa2cgb3V0c2lkZSB0aGUgcHJvamVjdCwgc28gTm9kZSBjYW5ub3QgcmVzb2x2ZSBhIGNvbXBpbGVyIGRlY2xhcmVkIGJ5IHRoZSBwcm9qZWN0LlxuICByZXR1cm4gIWNvbmZpZ3Muc29tZSgoY29uZmlnKSA9PiBjb25maWcuZGVwZW5kaW5nLm5leHQgfHwgY29uZmlnLmRlcGVuZGluZy5ibGl0eiB8fCBjb25maWcuZGVwZW5kaW5nLnNsaWRldik7XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZW5lcmF0ZUJ1bmZpZ1RvbWwoY29uZmlnOiBQYWNrYWdlQ29uZmlnLCB1c2VHbG9iYWxTdG9yZTogYm9vbGVhbik6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2dlbmVyYXRlQnVuZmlnVG9tbCcsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJ2J1bmZpZy50b21sJyk7XG4gICAgY29uc3QgZXhpc3RpbmdDb250ZW50ID0gZnMuZXhpc3RzU3luYyhmaWxlUGF0aCkgPyBmcy5yZWFkRmlsZVN5bmMoZmlsZVBhdGgsICd1dGY4JykgOiB1bmRlZmluZWQ7XG4gICAgY29uc3QgY29udGVudCA9IG5ld0NvbnRlbnQoZXhpc3RpbmdDb250ZW50LCB1c2VHbG9iYWxTdG9yZSk7XG4gICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzVXRpbC5nZW5lcmF0ZUZpbGUoZmlsZVBhdGgsIGNvbnRlbnQpKTtcbiAgfSk7XG59XG5cbmNvbnN0IG5ld0NvbnRlbnQgPSAoZXhpc3RpbmdDb250ZW50OiBzdHJpbmcgfCB1bmRlZmluZWQsIHVzZUdsb2JhbFN0b3JlOiBib29sZWFuKTogc3RyaW5nID0+IHtcbiAgY29uc3QgYnVuZmlnVG9tbCA9IHBhcnNlQnVuZmlnVG9tbChleGlzdGluZ0NvbnRlbnQpO1xuICAvLyBtaW5pbXVtUmVsZWFzZUFnZSBhbmQgbWluaW11bVJlbGVhc2VBZ2VFeGNsdWRlcyBhcmUgb3JnIHBvbGljeSwgbmV2ZXIgcmVwb3NpdG9yeSBwb2xpY3k6IGJvdGhcbiAgLy8gYXJlIHJld3JpdHRlbiB0byBjb25maWdzL3JlbGVhc2VBZ2VHYXRlLmpzb24ncyB2YWx1ZXMgb24gZXZlcnkgcnVuLCBzbyBhIGhhbmQtZWRpdGVkICh3ZWFrZW5lZClcbiAgLy8gZ2F0ZSBjYW5ub3Qgc3Vydml2ZSByZWdlbmVyYXRpb24uIERyb3BwaW5nIHJlcG9zaXRvcnktc3BlY2lmaWMgZXhjbHVkZSBlbnRyaWVzIGlzIGZhaWwtc2FmZSDigJQgYW5cbiAgLy8gdW5jb3ZlcmVkIHBhY2thZ2UgYmVjb21lcyBhZ2UtZ2F0ZWQgYW5kIHN1cmZhY2VzIGF0IGluc3RhbGwgdGltZSBpbnN0ZWFkIG9mIHdlYWtlbmluZyB0aGUgZ2F0ZS5cbiAgLy8gVHVyYm9wYWNrIHJlamVjdHMgZ2xvYmFsLXN0b3JlIHN5bWxpbmtzIGJlY2F1c2UgdGhleSByZXNvbHZlIG91dHNpZGUgaXRzIGZpbGVzeXN0ZW0gcm9vdC5cbiAgLy8gS2VlcGluZyBOZXh0LmpzIGluc3RhbGxzIHByb2plY3QtbG9jYWwgYXZvaWRzIHdpZGVuaW5nIHRoYXQgcm9vdCB0byAkSE9NRSAob3IgYC9gIGluIERvY2tlciksXG4gIC8vIHdoaWNoIHdvdWxkIGV4cGFuZCBkZXZlbG9wbWVudCBmaWxlc3lzdGVtIHdhdGNoaW5nIGFuZCBieXBhc3MgdGhlIGJvdW5kYXJ5J3MgY2FjaGUgYmVuZWZpdHMuXG4gIGNvbnN0IGdsb2JhbFN0b3JlTGluZSA9IHVzZUdsb2JhbFN0b3JlID8gJ2dsb2JhbFN0b3JlID0gdHJ1ZScgOiAnZ2xvYmFsU3RvcmUgPSBmYWxzZSc7XG4gIC8vIE5vIGBbcnVuXSBidW4gPSB0cnVlYDogaXRzIG5vZGUtPmJ1biBQQVRIIHNoaW0gbGVha3MgaW50byBldmVyeSBjaGlsZCBwcm9jZXNzIGFuZCBicmVha3NcbiAgLy8gdG9vbHMgcmVxdWlyaW5nIHJlYWwgTm9kZS5qcyAoUGxheXdyaWdodCwgd3JhbmdsZXIsIHZpbmV4dCk7IGFueSBleGlzdGluZyBzZXR0aW5nIGlzIGRyb3BwZWQuXG4gIC8vIHB1YmxpY0hvaXN0UGF0dGVybiDigJQgdHN4OiBidWlsZC10cyB1bmRlciBOb2RlLmpzIHNwYXducyBgbm9kZSAtLWltcG9ydCB0c3hgLCB3aGljaCByZXNvbHZlc1xuICAvLyB0c3ggZnJvbSB0aGUgY29uc3VtZXIgcGFja2FnZSdzIGRpcmVjdG9yeSwgbm90IGZyb20gYnVpbGQtdHMncyBvd24gZGVwZW5kZW5jaWVzLlxuICAvLyB1bmRpY2ktdHlwZXM6IGJ1bi10eXBlcyByZWZlcmVuY2VzIGl0IHdpdGhvdXQgZGVjbGFyaW5nIGl0IGFzIGEgZGVwZW5kZW5jeSAob3Zlbi1zaC9idW4jMjI4MDUpO1xuICAvLyBnZW5lcmF0ZWQgdHNjb25maWdzIGFsc28gbWFwIHVuZGljaS10eXBlcyB0byB0aGUgaG9pc3RlZCBjb3B5IChzZWUgdHNjb25maWcudHMpIGJlY2F1c2UgdGhlXG4gIC8vIGdsb2JhbCBzdG9yZSByZWFscGF0aHMgYnVuLXR5cGVzIG91dHNpZGUgdGhlIHJlcG9zaXRvcnkuXG4gIHJldHVybiBgZW52ID0gZmFsc2VcbnRlbGVtZXRyeSA9IGZhbHNlXG5cbiR7ZXh0cmFjdFJhd1Rlc3RTZWN0aW9ucyhleGlzdGluZ0NvbnRlbnQpfVtpbnN0YWxsXVxuZXhhY3QgPSAke2J1bmZpZ1RvbWw/Lmluc3RhbGw/LmV4YWN0ID09PSBmYWxzZSA/ICdmYWxzZScgOiAndHJ1ZSd9XG4ke2dsb2JhbFN0b3JlTGluZX1cbmxpbmtlciA9IFwiaXNvbGF0ZWRcIlxucHVibGljSG9pc3RQYXR0ZXJuID0gW1widHN4XCIsIFwidW5kaWNpLXR5cGVzXCJdXG5taW5pbXVtUmVsZWFzZUFnZSA9ICR7YnVuTWluaW11bVJlbGVhc2VBZ2VTZWNvbmRzfVxubWluaW11bVJlbGVhc2VBZ2VFeGNsdWRlcyA9IFtcbiR7YnVuTWluaW11bVJlbGVhc2VBZ2VFeGNsdWRlcy5tYXAoKHBhY2thZ2VOYW1lKSA9PiBgICAgIFwiJHtwYWNrYWdlTmFtZX1cIixgKS5qb2luKCdcXG4nKX1cbl1cbmA7XG59O1xuXG4vKipcbiAqIFByZXNlcnZlIHRoZSBwcm9qZWN0J3MgYFt0ZXN0XWAgc2VjdGlvbnMgKGUuZy4gcHJlbG9hZCBzY3JpcHRzIHN3YXBwaW5nIGEgQ2xvdWRmbGFyZSBEMSBjbGllbnRcbiAqIGZvciBhIGxvY2FsIFNRTGl0ZSBvbmUpIHZlcmJhdGltLCBjb21tZW50cyBpbmNsdWRlZDsgd2JmeSBtYW5hZ2VzIG9ubHkgdGhlIG90aGVyIHNlY3Rpb25zLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZXh0cmFjdFJhd1Rlc3RTZWN0aW9ucyhjb250ZW50OiBzdHJpbmcgfCB1bmRlZmluZWQpOiBzdHJpbmcge1xuICBpZiAoIWNvbnRlbnQpIHJldHVybiAnJztcblxuICBjb25zdCBwcmVzZXJ2ZWRMaW5lczogc3RyaW5nW10gPSBbXTtcbiAgbGV0IGluVGVzdFNlY3Rpb24gPSBmYWxzZTtcbiAgZm9yIChjb25zdCBsaW5lIG9mIGNvbnRlbnQuc3BsaXQoJ1xcbicpKSB7XG4gICAgY29uc3Qgc2VjdGlvbk1hdGNoID0gL15cXHMqXFxbKFteXFxdXSspXFxdLy5leGVjKGxpbmUpO1xuICAgIGlmIChzZWN0aW9uTWF0Y2gpIHtcbiAgICAgIGluVGVzdFNlY3Rpb24gPSBzZWN0aW9uTWF0Y2hbMV0gPT09ICd0ZXN0JyB8fCAoc2VjdGlvbk1hdGNoWzFdIGFzIHN0cmluZykuc3RhcnRzV2l0aCgndGVzdC4nKTtcbiAgICB9XG4gICAgaWYgKGluVGVzdFNlY3Rpb24gJiYgbGluZS50cmltKCkpIHtcbiAgICAgIHByZXNlcnZlZExpbmVzLnB1c2gobGluZSk7XG4gICAgfVxuICB9XG4gIHJldHVybiBwcmVzZXJ2ZWRMaW5lcy5sZW5ndGggPiAwID8gYCR7cHJlc2VydmVkTGluZXMuam9pbignXFxuJyl9XFxuXFxuYCA6ICcnO1xufVxuXG5mdW5jdGlvbiBwYXJzZUJ1bmZpZ1RvbWwoY29udGVudDogc3RyaW5nIHwgdW5kZWZpbmVkKTogQnVuZmlnVG9tbCB8IHVuZGVmaW5lZCB7XG4gIGlmICghY29udGVudCkge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cbiAgdHJ5IHtcbiAgICByZXR1cm4gQnVuLlRPTUwucGFyc2UoY29udGVudCkgYXMgQnVuZmlnVG9tbDtcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuXG5jb25zdCB1c2VyQ29udGVudEhlYWRlciA9ICcjIFByb2plY3Qtc3BlY2lmaWMgc2V0dGluZ3MnO1xuY29uc3QgdXNlckNvbnRlbnRIZWFkZXJSZWdleCA9IC8jIFByb2plY3Qtc3BlY2lmaWMgc2V0dGluZ3NbXlxcbl0qXFxuL2dtO1xuY29uc3Qgc2VwYXJhdG9yID0gJyMgR2VuZXJhdGVkIGJ5IHdiZnknO1xuY29uc3Qgc2VwYXJhdG9yUHJlZml4ID0gJyMgR2VuZXJhdGVkIGJ5ICc7XG5jb25zdCBkZWZhdWx0SGVhZFVzZXJDb250ZW50ID0gYCR7dXNlckNvbnRlbnRIZWFkZXJ9IChoZWFkKVxuXG5cbiR7c2VwYXJhdG9yfVxuYDtcbmNvbnN0IGRlZmF1bHRUYWlsVXNlckNvbnRlbnQgPSBgXG4ke3VzZXJDb250ZW50SGVhZGVyfSAodGFpbClcbmA7XG5cbmV4cG9ydCBjb25zdCBpZ25vcmVGaWxlVXRpbCA9IHtcbiAgc2VwYXJhdG9yLFxuICBzZXBhcmF0b3JQcmVmaXgsXG4gIGRlZmF1bHRIZWFkVXNlckNvbnRlbnQsXG4gIGRlZmF1bHRUYWlsVXNlckNvbnRlbnQsXG4gIGFzeW5jIHJlYWRHaXRpZ25vcmVXaXRob3V0U2VwYXJhdG9ycyhmaWxlUGF0aDogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmcgfCB1bmRlZmluZWQ+IHtcbiAgICB0cnkge1xuICAgICAgbGV0IGNvbnRlbnQgPSBhd2FpdCBmcy5wcm9taXNlcy5yZWFkRmlsZShmaWxlUGF0aCwgJ3V0ZjgnKTtcbiAgICAgIGNvbnN0IGxhc3RIZWFkZXJJbmRleCA9IGdldEluZGV4T2ZUYWlsVXNlckNvbnRlbnRIZWFkZXIoY29udGVudCk7XG4gICAgICBpZiAobGFzdEhlYWRlckluZGV4ID4gMCkge1xuICAgICAgICBjb250ZW50ID0gY29udGVudC5zbGljZSgwLCBsYXN0SGVhZGVySW5kZXggLSAxKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiAoXG4gICAgICAgIGNvbnRlbnRcbiAgICAgICAgICAucmVwbGFjZUFsbCh1c2VyQ29udGVudEhlYWRlclJlZ2V4LCAnJylcbiAgICAgICAgICAucmVwbGFjZUFsbCgvIyBHZW5lcmF0ZWQgYnkgW15cXG5dKlxcbi9nbSwgJycpXG4gICAgICAgICAgLnJlcGxhY2VBbGwoL1xccj9cXG5cXHI/XFxuKFxccj9cXG4pKy9nbSwgJ1xcblxcbicpXG4gICAgICAgICAgLnRyaW0oKSArICdcXG4nXG4gICAgICApO1xuICAgIH0gY2F0Y2gge1xuICAgICAgLy8gZG8gbm90aGluZ1xuICAgIH1cbiAgfSxcbiAgZ2V0SGVhZFVzZXJDb250ZW50KGNvbnRlbnQ6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgY29uc3QgaW5kZXggPSBjb250ZW50LmluZGV4T2YodGhpcy5zZXBhcmF0b3JQcmVmaXgpO1xuICAgIGlmIChpbmRleCAhPT0gLTEpIHtcbiAgICAgIHJldHVybiBjb250ZW50XG4gICAgICAgIC5zbGljZSgwLCBjb250ZW50LmluZGV4T2YoJ1xcbicsIGluZGV4KSArIDEpXG4gICAgICAgIC5yZXBsYWNlQWxsKHVzZXJDb250ZW50SGVhZGVyUmVnZXgsIGAke3VzZXJDb250ZW50SGVhZGVyfSAoaGVhZClcXG5gKTtcbiAgICB9XG4gICAgcmV0dXJuIGRlZmF1bHRIZWFkVXNlckNvbnRlbnQ7XG4gIH0sXG4gIGdldFRhaWxVc2VyQ29udGVudChjb250ZW50OiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGNvbnN0IGxhc3RIZWFkZXJJbmRleCA9IGdldEluZGV4T2ZUYWlsVXNlckNvbnRlbnRIZWFkZXIoY29udGVudCk7XG4gICAgaWYgKGxhc3RIZWFkZXJJbmRleCA+IDApIHtcbiAgICAgIHJldHVybiBjb250ZW50LnNsaWNlKGxhc3RIZWFkZXJJbmRleCAtIDEpO1xuICAgIH1cbiAgICByZXR1cm4gZGVmYXVsdFRhaWxVc2VyQ29udGVudDtcbiAgfSxcbiAgYXN5bmMgaXNCZXJyeVplcm9JbnN0YWxsRW5hYmxlZChmaWxlUGF0aDogc3RyaW5nKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGNvbnRlbnQgPSBhd2FpdCBmcy5wcm9taXNlcy5yZWFkRmlsZShmaWxlUGF0aCwgJ3V0ZjgnKTtcbiAgICAgIHJldHVybiBjb250ZW50LmluY2x1ZGVzKCdcXG4hLnlhcm4vY2FjaGUnKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH0sXG59O1xuXG5mdW5jdGlvbiBnZXRJbmRleE9mVGFpbFVzZXJDb250ZW50SGVhZGVyKGNvbnRlbnQ6IHN0cmluZyk6IG51bWJlciB7XG4gIGNvbnN0IGluZGV4ID0gY29udGVudC5pbmRleE9mKHVzZXJDb250ZW50SGVhZGVyKTtcbiAgY29uc3QgbGFzdEluZGV4ID0gY29udGVudC5sYXN0SW5kZXhPZih1c2VyQ29udGVudEhlYWRlcik7XG4gIHJldHVybiBsYXN0SW5kZXggPiBpbmRleCA/IGxhc3RJbmRleCA6IC0xO1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZnNVdGlsIH0gZnJvbSAnLi4vdXRpbHMvZnNVdGlsLmpzJztcbmltcG9ydCB7IGlnbm9yZUZpbGVVdGlsIH0gZnJvbSAnLi4vdXRpbHMvaWdub3JlRmlsZVV0aWwuanMnO1xuaW1wb3J0IHsgcHJvbWlzZVBvb2wgfSBmcm9tICcuLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5cbi8vIEV4ZXJjb2RlIGRlcGxveXMgR2l0LWJhc2VkIHByaXZhdGUgcGFja2FnZXMgZnJvbSBub2RlX21vZHVsZXMsIGJ1dCB0aGUgRG9ja2VyIGNvbnRleHQgc2hvdWxkIHN0YXkgbmFycm93LlxuY29uc3QgaW5jbHVkZWROb2RlTW9kdWxlc1BhdHRlcm5zID0gWydAd2lsbGJvb3N0ZXInXTtcblxuY29uc3QgY29tbW9uQ29udGVudCA9IGBcbi5lbnYqXG4qKi8uRFNfU3RvcmVcbioqLy5jYWNoZVxuKiovLmNsYXVkZVxuKiovLmN1cnNvclxuKiovLmVkaXRvcmNvbmZpZ1xuKiovLmVzbGludGNhY2hlXG4qKi8uZ2VtaW5pXG4qKi8uZ2l0XG4qKi8uZ2l0YXR0cmlidXRlc1xuKiovLmdpdGh1YlxuKiovLmdpdGlnbm9yZVxuKiovLmlkZWFcbioqLy5sZWZ0aG9va1xuKiovLm15cHlfY2FjaGVcbioqLy5uZXh0L2NhY2hlXG4qKi8ubnBtXG4qKi8ucGFyY2VsLWNhY2hlXG4qKi8ucG5wbS1zdG9yZVxuKiovLnB5dGVzdF9jYWNoZVxuKiovLnJhaWx3YXlpZ25vcmVcbioqLy5yZWxlYXNlcmMuanNvblxuKiovLnJ1ZmZfY2FjaGVcbioqLy50bXBcbioqLy50bXAtKi8qKlxuKiovLnR1cmJvXG4qKi8udG94XG4qKi8udnNjb2RlXG4qKi8ueWFybi9jYWNoZVxuKiovKi5zcWxpdGUzKlxuKiovLnlhcm4vaW5zdGFsbC1zdGF0ZS5nelxuKiovLnZlbnZcbioqL19fcHljYWNoZV9fXG4qKi8qLmxvZ1xuKiovKi5weWNcbioqLyoudHNidWlsZGluZm9cbioqL2NvdmVyYWdlXG4qKi9ub2RlX21vZHVsZXMvKipcbiR7aW5jbHVkZWROb2RlTW9kdWxlc1BhdHRlcm5zXG4gIC5tYXAoXG4gICAgKHBhdHRlcm4pID0+IGAhKiovbm9kZV9tb2R1bGVzLyR7cGF0dGVybn1cbiEqKi9ub2RlX21vZHVsZXMvJHtwYXR0ZXJufS8qKmBcbiAgKVxuICAuam9pbignXFxuJyl9XG4qKi9ub2RlX21vZHVsZXMvLmNhY2hlXG4qKi9wbGF5d3JpZ2h0LXJlcG9ydFxuKiovc3Rvcnlib29rLXN0YXRpY1xuKiovdGFyZ2V0XG4qKi90ZXN0LXJlc3VsdHNcbmA7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZW5lcmF0ZURvY2tlcmlnbm9yZShjb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdnZW5lcmF0ZURvY2tlcmlnbm9yZScsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJy5kb2NrZXJpZ25vcmUnKTtcbiAgICBpZiAoY29uZmlnLmRvZXNDb250YWluRG9ja2VyZmlsZSkge1xuICAgICAgY29uc3QgY29udGVudCA9IChhd2FpdCBmc1V0aWwucmVhZEZpbGVJZkV4aXN0cyhmaWxlUGF0aCkpID8/ICcnO1xuICAgICAgY29uc3QgaGVhZFVzZXJDb250ZW50ID0gaWdub3JlRmlsZVV0aWwuZ2V0SGVhZFVzZXJDb250ZW50KGNvbnRlbnQpO1xuICAgICAgY29uc3QgdGFpbFVzZXJDb250ZW50ID0gaWdub3JlRmlsZVV0aWwuZ2V0VGFpbFVzZXJDb250ZW50KGNvbnRlbnQpO1xuXG4gICAgICBjb25zdCBuZXdDb250ZW50ID0gaGVhZFVzZXJDb250ZW50ICsgY29tbW9uQ29udGVudCArIHRhaWxVc2VyQ29udGVudDtcbiAgICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiBmc1V0aWwuZ2VuZXJhdGVGaWxlKGZpbGVQYXRoLCBuZXdDb250ZW50KSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGF3YWl0IGZzLnByb21pc2VzLnJtKGZpbGVQYXRoLCB7IGZvcmNlOiB0cnVlIH0pO1xuICAgIH1cbiAgfSk7XG59XG4iLCJleHBvcnQgY29uc3QgZXh0ZW5zaW9ucyA9IHtcbiAgY29kZVdpdGgySW5kZW50U2l6ZTogW1xuICAgICdjanMnLFxuICAgICdtanMnLFxuICAgICdqcycsXG4gICAgJ2pzeCcsXG4gICAgJ2N0cycsXG4gICAgJ210cycsXG4gICAgJ3RzJyxcbiAgICAndHN4JyxcbiAgICAnanNvbicsXG4gICAgJ2pzb241JyxcbiAgICAnanNvbmMnLFxuICAgICdjcHAnLFxuICAgICdkYXJ0JyxcbiAgICAnaHRtJyxcbiAgICAnaHRtbCcsXG4gICAgJ3B1JyxcbiAgICAncHVtbCcsXG4gICAgJ3JiJyxcbiAgICAndnVlJyxcbiAgICAneG1sJyxcbiAgICAneWFtbCcsXG4gICAgJ3ltbCcsXG4gICAgJ3NoJyxcbiAgXS50b1NvcnRlZCgpLFxuICBjb2RlV2l0aDRJbmRlbnRTaXplOiBbJ2dvJywgJ2dyYWRsZScsICdqYXZhJywgJ3B5J10udG9Tb3J0ZWQoKSxcbiAgbWFya2Rvd25MaWtlOiBbJ21kJ10udG9Tb3J0ZWQoKSxcbiAgb3hsaW50OiBbJ2FzdHJvJywgJ2NqcycsICdjdHMnLCAnanMnLCAnanN4JywgJ21qcycsICdtdHMnLCAnc3ZlbHRlJywgJ3RzJywgJ3RzeCcsICd2dWUnXS50b1NvcnRlZCgpLFxuICBveGZtdDogW1xuICAgICdhc3RybycsXG4gICAgJ2NqcycsXG4gICAgJ2NzcycsXG4gICAgJ2N0cycsXG4gICAgJ2dxbCcsXG4gICAgJ2dyYXBocWwnLFxuICAgICdoYnMnLFxuICAgICdodG0nLFxuICAgICdodG1sJyxcbiAgICAnanMnLFxuICAgICdqc29uJyxcbiAgICAnanNvbjUnLFxuICAgICdqc29uYycsXG4gICAgJ2pzeCcsXG4gICAgJ2xlc3MnLFxuICAgICdtZCcsXG4gICAgJ21keCcsXG4gICAgJ21qcycsXG4gICAgJ210cycsXG4gICAgJ3Njc3MnLFxuICAgICdzdmVsdGUnLFxuICAgICd0b21sJyxcbiAgICAndHMnLFxuICAgICd0c3gnLFxuICAgICd2dWUnLFxuICAgICd5YW1sJyxcbiAgICAneW1sJyxcbiAgXS50b1NvcnRlZCgpLFxuICBwcmV0dGllck9ubHk6IFsnamF2YSddLnRvU29ydGVkKCksXG59O1xuIiwiaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZXh0ZW5zaW9ucyB9IGZyb20gJy4uL3V0aWxzL2V4dGVuc2lvbnMuanMnO1xuaW1wb3J0IHsgZnNVdGlsIH0gZnJvbSAnLi4vdXRpbHMvZnNVdGlsLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuXG5jb25zdCBuZXdDb250ZW50ID0gYHJvb3QgPSB0cnVlXG5cblsqXVxuY2hhcnNldCA9IHV0Zi04XG5lbmRfb2ZfbGluZSA9IGxmXG5pbnNlcnRfZmluYWxfbmV3bGluZSA9IHRydWVcbnRyaW1fdHJhaWxpbmdfd2hpdGVzcGFjZSA9IHRydWVcblxuJHtnZW5lcmF0ZUV4dGVuc2lvbnMoZXh0ZW5zaW9ucy5jb2RlV2l0aDJJbmRlbnRTaXplKX1cbmluZGVudF9zaXplID0gMlxuaW5kZW50X3N0eWxlID0gc3BhY2VcblxuJHtnZW5lcmF0ZUV4dGVuc2lvbnMoZXh0ZW5zaW9ucy5jb2RlV2l0aDRJbmRlbnRTaXplKX1cbmluZGVudF9zaXplID0gNFxuaW5kZW50X3N0eWxlID0gc3BhY2VcblxuJHtnZW5lcmF0ZUV4dGVuc2lvbnMoZXh0ZW5zaW9ucy5tYXJrZG93bkxpa2UpfVxubWF4X2xpbmVfbGVuZ3RoID0gb2ZmXG50cmltX3RyYWlsaW5nX3doaXRlc3BhY2UgPSBmYWxzZVxuXG5be01ha2VmaWxlLCoubWt9XVxuaW5kZW50X3N0eWxlID0gdGFiXG5gO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVFZGl0b3Jjb25maWcoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZ2VuZXJhdGVFZGl0b3Jjb25maWcnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICcuZWRpdG9yY29uZmlnJyk7XG4gICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzVXRpbC5nZW5lcmF0ZUZpbGUoZmlsZVBhdGgsIG5ld0NvbnRlbnQpKTtcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIGdlbmVyYXRlRXh0ZW5zaW9ucyhleHRlbnNpb25zOiBzdHJpbmdbXSk6IHN0cmluZyB7XG4gIHJldHVybiBleHRlbnNpb25zLmxlbmd0aCA+IDEgPyBgWyoueyR7ZXh0ZW5zaW9ucy5qb2luKCcsJyl9fV1gIDogYFsqLiR7ZXh0ZW5zaW9uc1swXX1dYDtcbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCBtZXJnZSBmcm9tICdkZWVwbWVyZ2UnO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBmc1V0aWwgfSBmcm9tICcuLi91dGlscy9mc1V0aWwuanMnO1xuaW1wb3J0IHsgb3ZlcndyaXRlTWVyZ2UgfSBmcm9tICcuLi91dGlscy9tZXJnZVV0aWwuanMnO1xuaW1wb3J0IHsgcHJvbWlzZVBvb2wgfSBmcm9tICcuLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5cbmltcG9ydCB7IGdlbmVyYXRlQWdlbnRDb2RpbmdTdHlsZSwgcmVhZEFnZW50c0V4dHJhQ29udGVudCB9IGZyb20gJy4vYWdlbnRzLmpzJztcblxuY29uc3QgZGVmYXVsdENvbmZpZyA9IHtcbiAgaGF2ZV9mdW46IHRydWUsXG4gIGNvZGVfcmV2aWV3OiB7XG4gICAgZGlzYWJsZTogZmFsc2UsXG4gICAgY29tbWVudF9zZXZlcml0eV90aHJlc2hvbGQ6ICdNRURJVU0nLFxuICAgIG1heF9yZXZpZXdfY29tbWVudHM6IC0xLFxuICAgIHB1bGxfcmVxdWVzdF9vcGVuZWQ6IHtcbiAgICAgIGhlbHA6IGZhbHNlLFxuICAgICAgc3VtbWFyeTogdHJ1ZSxcbiAgICAgIGNvZGVfcmV2aWV3OiB0cnVlLFxuICAgIH0sXG4gIH0sXG4gIGlnbm9yZV9wYXR0ZXJuczogWycqKi9fX2dlbmVyYXRlZF9fJ10sXG59O1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVHZW1pbmlDb25maWcoY29uZmlnOiBQYWNrYWdlQ29uZmlnLCBhbGxDb25maWdzOiBQYWNrYWdlQ29uZmlnW10pOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdnZW5lcmF0ZUdlbWluaUNvbmZpZycsIGFzeW5jICgpID0+IHtcbiAgICBpZiAoIWNvbmZpZy5pc1Jvb3QpIHJldHVybjtcblxuICAgIGNvbnN0IGRpclBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICcuZ2VtaW5pJyk7XG4gICAgY29uc3QgY29uZmlnRmlsZVBhdGggPSBwYXRoLnJlc29sdmUoZGlyUGF0aCwgJ2NvbmZpZy55YW1sJyk7XG4gICAgY29uc3Qgbm9uQ2Fub25pY2FsQ29uZmlnRmlsZVBhdGggPSBwYXRoLnJlc29sdmUoZGlyUGF0aCwgJ2NvbmZpZy55bWwnKTtcbiAgICBjb25zdCBzdHlsZWd1aWRlRmlsZVBhdGggPSBwYXRoLnJlc29sdmUoZGlyUGF0aCwgJ3N0eWxlZ3VpZGUubWQnKTtcblxuICAgIGNvbnN0IGhhc05vbkNhbm9uaWNhbENvbmZpZyA9ICEhKGF3YWl0IGZzLnByb21pc2VzLmxzdGF0KG5vbkNhbm9uaWNhbENvbmZpZ0ZpbGVQYXRoKS5jYXRjaCgoKSA9PiB7fSkpO1xuICAgIGlmIChoYXNOb25DYW5vbmljYWxDb25maWcpIHtcbiAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgYFNraXBwZWQgZ2VuZXJhdGluZyAke2NvbmZpZ0ZpbGVQYXRofSBiZWNhdXNlICR7bm9uQ2Fub25pY2FsQ29uZmlnRmlsZVBhdGh9IGlzIG5vdCBhIHN1cHBvcnRlZCBHZW1pbmkgY29uZmlnIGxvY2F0aW9uLiBSZW5hbWUgaXQgbWFudWFsbHkuYFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBsZXQgbmV3Q29uZmlnOiBvYmplY3QgPSBzdHJ1Y3R1cmVkQ2xvbmUoZGVmYXVsdENvbmZpZyk7XG4gICAgY29uc3Qgb2xkQ29udGVudCA9IGhhc05vbkNhbm9uaWNhbENvbmZpZyA/IHVuZGVmaW5lZCA6IGF3YWl0IGZzVXRpbC5yZWFkRmlsZUNvbmZpbmVkSWZFeGlzdHMoY29uZmlnRmlsZVBhdGgpO1xuICAgIGlmIChvbGRDb250ZW50ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IG9sZENvbmZpZyA9IEJ1bi5ZQU1MLnBhcnNlKG9sZENvbnRlbnQpO1xuICAgICAgICAvLyBNZXJnZSBvbmx5IGEgbWFwcGluZzogZW1wdHksIGNvbW1lbnQtb25seSwgb3Igc2NhbGFyIFlBTUwgd291bGQgZWl0aGVyIHRocm93IGluXG4gICAgICAgIC8vIG1lcmdlLmFsbCBvciBwb2xsdXRlIHRoZSBjb25maWcgd2l0aCBpbmRleCBrZXlzLlxuICAgICAgICBpZiAob2xkQ29uZmlnICYmIHR5cGVvZiBvbGRDb25maWcgPT09ICdvYmplY3QnICYmICFBcnJheS5pc0FycmF5KG9sZENvbmZpZykpIHtcbiAgICAgICAgICBuZXdDb25maWcgPSBtZXJnZS5hbGwoW25ld0NvbmZpZywgb2xkQ29uZmlnLCBuZXdDb25maWddLCB7IGFycmF5TWVyZ2U6IG92ZXJ3cml0ZU1lcmdlIH0pO1xuICAgICAgICB9XG4gICAgICB9IGNhdGNoIHtcbiAgICAgICAgLy8gZG8gbm90aGluZyAtIGZpbGUgY2FuJ3QgYmUgcGFyc2VkXG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgeWFtbENvbnRlbnQgPSBCdW4uWUFNTC5zdHJpbmdpZnkobmV3Q29uZmlnLCB1bmRlZmluZWQsIDIpO1xuXG4gICAgY29uc3QgZXh0cmFDb250ZW50ID0gYXdhaXQgcmVhZEFnZW50c0V4dHJhQ29udGVudChjb25maWcuZGlyUGF0aCk7XG4gICAgY29uc3QgY29kaW5nUnVsZUV4dHJhQ29udGVudCA9IGV4dHJhQ29udGVudD8udHJpbVN0YXJ0KCkuc3RhcnRzV2l0aCgnIycpID8gdW5kZWZpbmVkIDogZXh0cmFDb250ZW50O1xuICAgIGNvbnN0IHJldmlld0xhbmd1YWdlSW5zdHJ1Y3Rpb24gPSBjb25maWcuaXNQdWJsaWNSZXBvXG4gICAgICA/ICdSZXZpZXcgaW4gRW5nbGlzaCBiYXNlZCBvbiB0aGUgZm9sbG93aW5nIGNvZGluZyBzdGFuZGFyZHMuJ1xuICAgICAgOiAn5Lul5LiL44Gu44Kz44O844OH44Kj44Oz44Kw6KaP57SE44KS6LiP44G+44GI44Gm44CB5pel5pys6Kqe44Gn44Os44OT44Ol44O844GX44Gm44GP44Gg44GV44GE44CCJztcbiAgICBjb25zdCBzdHlsZWd1aWRlQ29udGVudCA9IGAke3Jldmlld0xhbmd1YWdlSW5zdHJ1Y3Rpb259XFxuXFxuJHtnZW5lcmF0ZUFnZW50Q29kaW5nU3R5bGUoY29uZmlnLCBhbGxDb25maWdzKX0ke1xuICAgICAgY29kaW5nUnVsZUV4dHJhQ29udGVudCA/IGBcXG4ke2NvZGluZ1J1bGVFeHRyYUNvbnRlbnQudHJpbUVuZCgpfWAgOiAnJ1xuICAgIH1gO1xuXG4gICAgY29uc3QgcHJvbWlzZXMgPSBbXG4gICAgICAuLi4oaGFzTm9uQ2Fub25pY2FsQ29uZmlnID8gW10gOiBbcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzVXRpbC5nZW5lcmF0ZUZpbGUoY29uZmlnRmlsZVBhdGgsIHlhbWxDb250ZW50KSldKSxcbiAgICAgIHByb21pc2VQb29sLnJ1bigoKSA9PiBmc1V0aWwuZ2VuZXJhdGVGaWxlKHN0eWxlZ3VpZGVGaWxlUGF0aCwgc3R5bGVndWlkZUNvbnRlbnQpKSxcbiAgICBdO1xuICAgIGF3YWl0IFByb21pc2UuYWxsKHByb21pc2VzKTtcbiAgfSk7XG59XG4iLCJpbXBvcnQgY2hpbGRfcHJvY2VzcyBmcm9tICdub2RlOmNoaWxkX3Byb2Nlc3MnO1xuaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZXh0ZW5zaW9ucyB9IGZyb20gJy4uL3V0aWxzL2V4dGVuc2lvbnMuanMnO1xuaW1wb3J0IHsgZnNVdGlsIH0gZnJvbSAnLi4vdXRpbHMvZnNVdGlsLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuXG5jb25zdCBnaXRPdXRwdXRNYXhCdWZmZXIgPSA2NCAqIDEwMjQgKiAxMDI0O1xuXG4vLyBjZi4gaHR0cHM6Ly9idW4uc2gvZ3VpZGVzL2luc3RhbGwvZ2l0LWRpZmYtYnVuLWxvY2tmaWxlXG4vLyBgLmdpdGlnbm9yZSAtdGV4dGAga2VlcHMgdGhlIG1hY09TIHRlbXBsYXRlJ3MgYEljb25cXHJcXHJgIHJ1bGUgaW50YWN0OiBgdGV4dD1hdXRvYCBub3JtYWxpemF0aW9uXG4vLyBzdHJpcHMgb25lIENSIHBlciBjaGVja2luLCBkZWdyYWRpbmcgdGhlIHJ1bGUgdW50aWwgaXQgbWF0Y2hlcyBub3RoaW5nLlxuY29uc3QgbmV3Q29udGVudCA9IGAqIHRleHQ9YXV0b1xuXG4uZ2l0aWdub3JlIC10ZXh0XG5cbioubG9ja2IgYmluYXJ5IGRpZmY9bG9ja2JcbioudmNwcm9qIHRleHQgZW9sPWNybGZcblxuJHtbLi4uZXh0ZW5zaW9ucy5jb2RlV2l0aDJJbmRlbnRTaXplLCAuLi5leHRlbnNpb25zLmNvZGVXaXRoNEluZGVudFNpemUsIC4uLmV4dGVuc2lvbnMubWFya2Rvd25MaWtlXVxuICAubWFwKChleHQpID0+IGAqLiR7ZXh0fSB0ZXh0IGVvbD1sZmApXG4gIC5qb2luKCdcXG4nKX1cblxuZGlzdC8qKiBsaW5ndWlzdC1nZW5lcmF0ZWQ9dHJ1ZVxuYDtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlR2l0YXR0cmlidXRlcyhjb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdnZW5lcmF0ZUdpdGF0dHJpYnV0ZXMnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICcuZ2l0YXR0cmlidXRlcycpO1xuICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiBmc1V0aWwuZ2VuZXJhdGVGaWxlKGZpbGVQYXRoLCBuZXdDb250ZW50KSk7XG4gIH0pO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcmVub3JtYWxpemVUcmFja2VkVGV4dEZpbGVzKGRpclBhdGg6IHN0cmluZyk6IHZvaWQge1xuICBsZXQgb3V0cHV0OiBzdHJpbmc7XG4gIHRyeSB7XG4gICAgb3V0cHV0ID0gY2hpbGRfcHJvY2Vzcy5leGVjRmlsZVN5bmMoJ2dpdCcsIFsnbHMtZmlsZXMnLCAnLS1lb2wnLCAnLXonXSwge1xuICAgICAgY3dkOiBkaXJQYXRoLFxuICAgICAgZW5jb2Rpbmc6ICd1dGY4JyxcbiAgICAgIG1heEJ1ZmZlcjogZ2l0T3V0cHV0TWF4QnVmZmVyLFxuICAgICAgc3RkaW86IFsnaWdub3JlJywgJ3BpcGUnLCAncGlwZSddLFxuICAgIH0pO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGNvbnNvbGUud2FybihgU2tpcHBlZCB0cmFja2VkIGxpbmUtZW5kaW5nIHJlbm9ybWFsaXphdGlvbjogJHsoZXJyb3IgYXMgRXJyb3IpLm1lc3NhZ2V9YCk7XG4gICAgcmV0dXJuO1xuICB9XG4gIGxldCByZW5vcm1hbGl6ZWRDb3VudCA9IDA7XG4gIGZvciAoY29uc3QgcmVjb3JkIG9mIG91dHB1dC5zcGxpdCgnXFwwJykpIHtcbiAgICBjb25zdCBzZXBhcmF0b3JJbmRleCA9IHJlY29yZC5pbmRleE9mKCdcXHQnKTtcbiAgICBpZiAoc2VwYXJhdG9ySW5kZXggPT09IC0xKSBjb250aW51ZTtcblxuICAgIGNvbnN0IGF0dHJpYnV0ZXMgPSByZWNvcmQuc2xpY2UoMCwgc2VwYXJhdG9ySW5kZXgpO1xuICAgIGlmICghL15pXFwvKD86Y3JsZnxtaXhlZClcXHMvdS50ZXN0KGF0dHJpYnV0ZXMpIHx8ICEvYXR0clxcLy4qXFxiZW9sPSg/OmxmfGNybGYpKD86XFxzfCQpL3UudGVzdChhdHRyaWJ1dGVzKSkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgY29uc3QgcmVsYXRpdmVQYXRoID0gcmVjb3JkLnNsaWNlKHNlcGFyYXRvckluZGV4ICsgMSk7XG4gICAgY29uc3QgdHJhY2tlZEZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKGRpclBhdGgsIHJlbGF0aXZlUGF0aCk7XG4gICAgY29uc3Qgc3RhdHMgPSBmcy5sc3RhdFN5bmModHJhY2tlZEZpbGVQYXRoLCB7IHRocm93SWZOb0VudHJ5OiBmYWxzZSB9KTtcbiAgICBpZiAoIXN0YXRzPy5pc0ZpbGUoKSkgY29udGludWU7XG5cbiAgICAvLyBHaXQncyBzdGF0IGNhY2hlIGNhbiBoaWRlIHByZS1leGlzdGluZyBDUkxGIGJsb2JzIGFmdGVyIHdiZnkgaW50cm9kdWNlcyB0ZXh0IGF0dHJpYnV0ZXMuXG4gICAgLy8gTm9ybWFsaXplIGJ5dGVzIGluIHRoZSB3b3JrdHJlZSBzbyB0aGUgY2FsbGVyJ3Mgbm9ybWFsIGBnaXQgYWRkIC1BYCByZWNvcmRzIHRoZSBjYW5vbmljYWxcbiAgICAvLyBibG9iOyB0aGlzIGFsc28gcHJldmVudHMgUHJldHRpZXIncyBtZXRhZGF0YSBjYWNoZSBmcm9tIHNraXBwaW5nIHRoZSBuZXdseSBjaGFuZ2VkIGZpbGUuXG4gICAgY29uc3QgY29udGVudCA9IGZzLnJlYWRGaWxlU3luYyh0cmFja2VkRmlsZVBhdGgpO1xuICAgIGZzLndyaXRlRmlsZVN5bmModHJhY2tlZEZpbGVQYXRoLCBCdWZmZXIuZnJvbShjb250ZW50LnRvU3RyaW5nKCdiaW5hcnknKS5yZXBsYWNlQWxsKCdcXHJcXG4nLCAnXFxuJyksICdiaW5hcnknKSk7XG4gICAgcmVub3JtYWxpemVkQ291bnQrKztcbiAgfVxuICBpZiAocmVub3JtYWxpemVkQ291bnQgPiAwKSB7XG4gICAgY29uc29sZS5pbmZvKGBSZW5vcm1hbGl6ZWQgbGluZSBlbmRpbmdzIGluICR7cmVub3JtYWxpemVkQ291bnR9IHRyYWNrZWQgZmlsZShzKS5gKTtcbiAgfVxufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IG9zIGZyb20gJ25vZGU6b3MnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB7IG9wdGlvbnMgfSBmcm9tICcuLi9vcHRpb25zLmpzJztcbmltcG9ydCB7IGNvbnN1bWVzR2VuZXJhdGVkV29ya2VyVHlwZXMsIGdlbmVyYXRlc1dvcmtlclR5cGVzLCB0eXBlIFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGZzVXRpbCB9IGZyb20gJy4uL3V0aWxzL2ZzVXRpbC5qcyc7XG5pbXBvcnQgeyBpZ25vcmVGaWxlVXRpbCB9IGZyb20gJy4uL3V0aWxzL2lnbm9yZUZpbGVVdGlsLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuXG4vLyBEbyBub3QgcmVtb3ZlIGB3aW5kb3dzYDogZ2VuZXJhdGVkIC5naXRpZ25vcmUgZmlsZXMgbXVzdCBrZWVwIGlnbm9yaW5nIFdpbmRvd3MtY3JlYXRlZCBsb2NhbCBhcnRpZmFjdHMuXG5jb25zdCBkZWZhdWx0TmFtZXMgPSBbJ3dpbmRvd3MnLCAnbWFjb3MnLCAnbGludXgnLCAnamV0YnJhaW5zJywgJ3Zpc3VhbHN0dWRpb2NvZGUnLCAnZW1hY3MnLCAndmltJywgJ3lhcm4nXTtcblxuY29uc3QgY29tbW9uQ29udGVudCA9IGBcbl9fZ2VuZXJhdGVkX18vXG4hLmtlZXBcbi5haWRlcipcbi5hbnRpZ3Jhdml0eWNsaS9cbi5jbGF1ZGUvKi5sb2NhbC4qXG4uY2xhdWRlL3NjaGVkdWxlZF90YXNrcy5sb2NrXG4uZGV2Y29udGFpbmVyL1xuLmRvY2tlci5lbnZcbi5lbnYqXG4uaWRlYS9BdWdtZW50V2Vidmlld1N0YXRlU3RvcmUueG1sXG4uaWRlYS9jb3BpbG90Lipcbi5pZGVhL2NvcGlsb3QvY2hhdFNlc3Npb25zL1xuLnBsYXl3cmlnaHQtY2xpL1xuLnBsYXl3cmlnaHQtbWNwL1xuLnNlcmVuYS9cbi50bXAvXG4udG1wLSovXG4udG9rZW5zYXZlL1xuLndiL1xuQHdpbGxib29zdGVyL1xuQHdpbGxib29zdGVyLXByaXZhdGUvXG4qL21vdW50LyouaGFzaFxuQ0xBVURFLmxvY2FsLm1kXG5kaXN0L1xuZHJpenpsZS9tb3VudC9cbnRlbXAvXG50bXAvXG5gO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVHaXRpZ25vcmUoY29uZmlnOiBQYWNrYWdlQ29uZmlnLCByb290Q29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZ2VuZXJhdGVHaXRpZ25vcmUnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICcuZ2l0aWdub3JlJyk7XG4gICAgY29uc3QgY29udGVudCA9IChhd2FpdCBmc1V0aWwucmVhZEZpbGVJZkV4aXN0cyhmaWxlUGF0aCkpID8/ICcnO1xuICAgIGxldCBoZWFkVXNlckNvbnRlbnQgPSBpZ25vcmVGaWxlVXRpbC5nZXRIZWFkVXNlckNvbnRlbnQoY29udGVudCkgKyBjb21tb25Db250ZW50O1xuICAgIGNvbnN0IHRhaWxVc2VyQ29udGVudCA9IGlnbm9yZUZpbGVVdGlsLmdldFRhaWxVc2VyQ29udGVudChjb250ZW50KTtcblxuICAgIGNvbnN0IG5hbWVzID0gWy4uLmRlZmF1bHROYW1lc107XG4gICAgaWYgKGNvbmZpZy5kb2VzQ29udGFpbkdlbWZpbGUpIHtcbiAgICAgIG5hbWVzLnB1c2goJ3J1YnknKTtcbiAgICB9XG4gICAgaWYgKGNvbmZpZy5kb2VzQ29udGFpbkdvTW9kKSB7XG4gICAgICBuYW1lcy5wdXNoKCdnbycpO1xuICAgICAgaGVhZFVzZXJDb250ZW50ICs9IGAke3BhdGguYmFzZW5hbWUoY29uZmlnLmRpclBhdGgpfVxuYDtcbiAgICB9XG4gICAgLy8gRXZlcnkgYWNjZXB0ZWQgcmVwb3NpdG9yeSByb290IHJlY2VpdmVzIGEgbWFuYWdlZCBwYWNrYWdlLmpzb24gbGF0ZXIgaW4gdGhlIHNhbWUgcnVuLCBzbyBpdHNcbiAgICAvLyBkZXBlbmRlbmN5IHRyZWUgbXVzdCBiZSBpZ25vcmVkIGV2ZW4gd2hlbiB0aGUgbWFuaWZlc3QgZGlkIG5vdCBleGlzdCBhdCBjb25maWctZGV0ZWN0aW9uIHRpbWUuXG4gICAgaWYgKGNvbmZpZy5kb2VzQ29udGFpblBhY2thZ2VKc29uIHx8IGNvbmZpZy5pc1Jvb3QpIHtcbiAgICAgIG5hbWVzLnB1c2goJ25vZGUnKTtcbiAgICB9XG4gICAgLy8gUmVjdXJzaXZlIGRldGVjdGlvbiAobm90IGp1c3QgYSByb290IHBvbS54bWwpOiBhIG11bHRpLWxhbmd1YWdlIHJlcG9zaXRvcnkga2VlcHMgaXRzIE1hdmVuXG4gICAgLy8gbW9kdWxlcyBpbiBzdWJkaXJlY3RvcmllcywgYW5kIGRyb3BwaW5nIHRoZSBtYXZlbiB0ZW1wbGF0ZSB3b3VsZCBsZXQgdGFyZ2V0LyBnZXQgdHJhY2tlZC5cbiAgICBpZiAoY29uZmlnLmRvZXNDb250YWluUG9tWG1sQW55d2hlcmUpIHtcbiAgICAgIG5hbWVzLnB1c2goJ21hdmVuJyk7XG4gICAgICBoZWFkVXNlckNvbnRlbnQgKz0gYC5pZGVhL2dvb2dsZS1qYXZhLWZvcm1hdC54bWxcbmA7XG4gICAgfVxuICAgIGlmIChjb25maWcuZG9lc0NvbnRhaW5QdWJzcGVjWWFtbCkge1xuICAgICAgbmFtZXMucHVzaCgnZmx1dHRlcicsICdBbmRyb2lkU3R1ZGlvJywgJ3J1YnknKTtcbiAgICAgIGhlYWRVc2VyQ29udGVudCArPSBgLmZsdXR0ZXItcGx1Z2lucy1kZXBlbmRlbmNpZXNcbmFuZHJvaWQva2V5LnByb3BlcnRpZXNcbmlvcy8uYnVuZGxlXG4uaWRlYS9ydW5Db25maWd1cmF0aW9ucy54bWxcbmA7XG4gICAgfVxuICAgIGlmIChjb25maWcuZG9lc0NvbnRhaW5UZW1wbGF0ZVlhbWwpIHtcbiAgICAgIGhlYWRVc2VyQ29udGVudCArPSBgLmF3cy1zYW0vXG5wYWNrYWdlZC55YW1sXG5gO1xuICAgIH1cbiAgICAvLyBCZWNhdXNlIC52ZW52IHNob3VsZCBiZSBpZ25vcmVkIG9uIHJvb3QgZGlyZWN0b3J5LiBSZWN1cnNpdmUgZGV0ZWN0aW9uIChub3QganVzdCBhIHJvb3RcbiAgICAvLyBsb2NrZmlsZSk6IGEgbXVsdGktbGFuZ3VhZ2UgcmVwb3NpdG9yeSBrZWVwcyBQeXRob24gZGlyZWN0b3JpZXMgaW4gc3ViZGlyZWN0b3JpZXMsIGFuZFxuICAgIC8vIGRyb3BwaW5nIHRoZSBweXRob24gdGVtcGxhdGUgd291bGQgbGV0IF9fcHljYWNoZV9fLyBhbmQgLnZlbnYvIGdldCB0cmFja2VkLlxuICAgIGlmIChjb25maWcuZG9lc0NvbnRhaW5QeXRob25Mb2NrQW55d2hlcmUpIHtcbiAgICAgIG5hbWVzLnB1c2goJ3B5dGhvbicpO1xuICAgICAgaGVhZFVzZXJDb250ZW50ICs9IGAudmVudi9cbmA7XG4gICAgfVxuXG4gICAgaWYgKGNvbmZpZy5kZXBlbmRpbmcuYmxpdHopIHtcbiAgICAgIGhlYWRVc2VyQ29udGVudCArPSBgLmJsaXR6L1xuLmJsaXR6KipcbmA7XG4gICAgfVxuICAgIGlmIChjb25maWcuZGVwZW5kaW5nLm5leHQpIHtcbiAgICAgIG5hbWVzLnB1c2goJ25leHRqcycpO1xuICAgIH1cbiAgICBpZiAocm9vdENvbmZpZy5kZXBlbmRpbmcuZmlyZWJhc2UgfHwgY29uZmlnLmRlcGVuZGluZy5maXJlYmFzZSkge1xuICAgICAgbmFtZXMucHVzaCgnZmlyZWJhc2UnKTtcbiAgICB9XG4gICAgaWYgKGNvbmZpZy5kZXBlbmRpbmcucHJpc21hIHx8IGNvbmZpZy5kZXBlbmRpbmcuZHJpenpsZSkge1xuICAgICAgaGVhZFVzZXJDb250ZW50ICs9IGAqLnNxbGl0ZTMqXG5gO1xuICAgIH1cbiAgICBpZiAoY29uZmlnLmRlcGVuZGluZy5wbGF5d3JpZ2h0VGVzdCkge1xuICAgICAgaGVhZFVzZXJDb250ZW50ICs9IGBwbGF5d3JpZ2h0LXJlcG9ydC9cbnRlc3QtcmVzdWx0cy9cbmA7XG4gICAgfVxuICAgIGlmIChyb290Q29uZmlnLmRlcGVuZGluZy5yZWFjdE5hdGl2ZSB8fCBjb25maWcuZGVwZW5kaW5nLnJlYWN0TmF0aXZlKSB7XG4gICAgICBuYW1lcy5wdXNoKCdyZWFjdG5hdGl2ZScpO1xuICAgICAgaGVhZFVzZXJDb250ZW50ICs9IGBnb29nbGUtc2VydmljZXMuanNvblxuYW5kcm9pZC9hcHAvc3JjL21haW4vYXNzZXRzL1xuYDtcbiAgICB9XG4gICAgaWYgKGNvbmZpZy5kZXBlbmRpbmcuc3Rvcnlib29rKSB7XG4gICAgICBuYW1lcy5wdXNoKCdzdG9yeWJvb2tqcycpO1xuICAgIH1cbiAgICBpZiAoY29uZmlnLmRlcGVuZGluZy50YXVyaSkge1xuICAgICAgbmFtZXMucHVzaCgncnVzdCcpO1xuICAgIH1cbiAgICBpZiAoY29uZmlnLmRvZXNDb250YWluVGF1cmlDb25maWcpIHtcbiAgICAgIC8vICFDYXJnby5sb2NrIG92ZXJyaWRlcyBhbnkgcHJlLWV4aXN0aW5nIHVuYW5jaG9yZWQgQ2FyZ28ubG9jayBydWxlIGZyb20gYVxuICAgICAgLy8gcGFyZW50IC5naXRpZ25vcmUsIHNvIHRoZSBhcHBsaWNhdGlvbiBsb2NrZmlsZSBzdGF5cyBjb21taXR0YWJsZS5cbiAgICAgIGhlYWRVc2VyQ29udGVudCArPSBgIUNhcmdvLmxvY2tcbnNyYy10YXVyaS9nZW4vc2NoZW1hcy9cbmA7XG4gICAgfVxuICAgIGlmIChjb25maWcuZGVwZW5kaW5nLmxpdGVzdHJlYW0pIHtcbiAgICAgIGhlYWRVc2VyQ29udGVudCArPSBgZ2NwLXNhLWtleS5qc29uXG5gO1xuICAgIH1cbiAgICBpZiAoY29uZmlnLmlzQ2xvdWRmbGFyZSB8fCByb290Q29uZmlnLmlzQ2xvdWRmbGFyZSkge1xuICAgICAgLy8gLmRldi52YXJzKiBob2xkIGxvY2FsIHNlY3JldHMgZm9yIHdyYW5nbGVyIGRldiBhbmQgbXVzdCBuZXZlciBiZSBjb21taXR0ZWQuXG4gICAgICAvLyAuZW52LmNsb3VkZmxhcmUgY2FycmllcyBDTE9VREZMQVJFX0FQSV9UT0tFTjogQ0kgd3JpdGVzIGl0IGZyb20gYSBzZWNyZXQsIGFuZCBhIGxvY2FsXG4gICAgICAvLyBgd2IgZGVwbG95YCBuZWVkcyBhIHJlYWwgdG9rZW4gaW4gaXQsIHNvIGNvbW1pdHRpbmcgaXQgd291bGQgbGVhayBhY2NvdW50IGNyZWRlbnRpYWxzLlxuICAgICAgLy8gSXQgaXMgbGlzdGVkIGV4cGxpY2l0bHkgc28gdGhlIENsb3VkZmxhcmUtc3BlY2lmaWMgY3JlZGVudGlhbCBwb2xpY3kgcmVtYWlucyB2aXNpYmxlLlxuICAgICAgaGVhZFVzZXJDb250ZW50ICs9IGAuZGV2LnZhcnMqXG4uZW52LmNsb3VkZmxhcmVcbi53cmFuZ2xlci9cbmA7XG4gICAgfVxuICAgIC8vIElnbm9yZWQgb25seSB3aGVyZSBwb3N0aW5zdGFsbCByZWdlbmVyYXRlcyBpdCwgc28gd2JmeSBuZXZlciBpZ25vcmVzIGEgZmlsZSB0aGF0IG5vdGhpbmcgcmVjcmVhdGVzLiBUaGlzIGtlZXBzXG4gICAgLy8gaXRzIHRob3VzYW5kcyBvZiBsaW5lcyBvdXQgb2YgZXZlcnkgd3JhbmdsZXIgYnVtcCdzIGRpZmYuIEFuY2hvcmVkIHdpdGggYSBsZWFkaW5nIHNsYXNoIGJlY2F1c2UgYHdyYW5nbGVyIHR5cGVzYFxuICAgIC8vIGFuZCB0aGUgb3B0LW91dCBkZWxldGlvbiBiZWxvdyBvbmx5IGV2ZXIgdG91Y2ggdGhpcyBwYWNrYWdlJ3Mgb3duIGZpbGUsIG5vdCBhIG5lc3RlZCBvbmUgYXQgYW55IGRlcHRoLlxuICAgIGlmIChnZW5lcmF0ZXNXb3JrZXJUeXBlcyhjb25maWcpKSB7XG4gICAgICBoZWFkVXNlckNvbnRlbnQgKz0gYC93b3JrZXItY29uZmlndXJhdGlvbi5kLnRzXG5gO1xuICAgIH0gZWxzZSBpZiAoY29uZmlnLmRvZXNDb250YWluV3JhbmdsZXJDb25maWcgJiYgIWNvbnN1bWVzR2VuZXJhdGVkV29ya2VyVHlwZXMoY29uZmlnKSkge1xuICAgICAgLy8gT24gYSBnZW51aW5lIHdvcmtlci10eXBlcyBvcHQtb3V0IChub3RoaW5nIGNvbnN1bWVzIHRoZSBnZW5lcmF0ZWQgZmlsZTsgZ2VuZXJhdGVzV29ya2VyVHlwZXNcbiAgICAgIC8vIGFsb25lIGlzIGZhbHNlIGZvciB1bnJlbGF0ZWQgcmVhc29ucyBzdWNoIGFzIGEgbWlzc2luZyBsb2NhbCB3cmFuZ2xlciBkZXBlbmRlbmN5LCB3aGVyZSB0aGVcbiAgICAgIC8vIGZpbGUgbWF5IHN0aWxsIGJlIGNvbnN1bWVkKSB0aGUgaWdub3JlIHJ1bGVcbiAgICAgIC8vIGFib3ZlIGRpc2FwcGVhcnMsIHNvIGFuIGFscmVhZHktZ2VuZXJhdGVkIGZpbGUgd291bGQgc3VyZmFjZSBhcyB1bnRyYWNrZWQgbm9pc2Ugb24gZXZlcnlcbiAgICAgIC8vIGNoZWNrb3V0IOKAlCBkZWxldGUgaXQuIE5vIHJlcG9zaXRvcnkgdHJhY2tzIHRoZSBmaWxlIChkb2NzL2V4cGVjdGVkLXJlcG9zaXRvcnktcnVsZXMubWQpLFxuICAgICAgLy8gc28gYW4gZXhpc3RpbmcgY29weSBpcyBhbHdheXMgYSBkaXNwb3NhYmxlIGdlbmVyYXRlZCBvbmUuXG4gICAgICBjb25zdCB3b3JrZXJUeXBlc1BhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICd3b3JrZXItY29uZmlndXJhdGlvbi5kLnRzJyk7XG4gICAgICBpZiAoZnMuZXhpc3RzU3luYyh3b3JrZXJUeXBlc1BhdGgpKSB7XG4gICAgICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiBmcy5wcm9taXNlcy5ybSh3b3JrZXJUeXBlc1BhdGgsIHsgZm9yY2U6IHRydWUgfSkpO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAocm9vdENvbmZpZy5kZXBlbmRpbmcudmluZXh0IHx8IGNvbmZpZy5kZXBlbmRpbmcudmluZXh0KSB7XG4gICAgICBoZWFkVXNlckNvbnRlbnQgKz0gYC52aW5leHQvXG5gO1xuICAgIH1cblxuICAgIGxldCBnZW5lcmF0ZWQgPSAnJztcbiAgICBmb3IgKGNvbnN0IG5hbWUgb2YgbmFtZXMpIHtcbiAgICAgIGxldCBjb250ZW50ID0gKGF3YWl0IHJlYWRDYWNoZShuYW1lKSkgPz8gJyc7XG4gICAgICBpZiAoIWNvbnRlbnQpIHtcbiAgICAgICAgY29uc3QgdXJsID0gYGh0dHBzOi8vd3d3LnRvcHRhbC5jb20vZGV2ZWxvcGVycy9naXRpZ25vcmUvYXBpLyR7bmFtZX1gO1xuICAgICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoKHVybCk7XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlVGV4dCA9IGF3YWl0IHJlc3BvbnNlLnRleHQoKTtcbiAgICAgICAgaWYgKCFyZXNwb25zZS5vayB8fCByZXNwb25zZVRleHQuaW5jbHVkZXMoJ0F0dGVudGlvbiBSZXF1aXJlZCEnKSB8fCByZXNwb25zZVRleHQuaW5jbHVkZXMoJzx0aXRsZT4nKSkge1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoYEZhaWxlZCB0byBmZXRjaCAke3VybH1gKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY29udGVudCA9IHJlc3BvbnNlVGV4dC50cmltKCk7XG4gICAgICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiB3cml0ZUNhY2hlKG5hbWUsIGNvbnRlbnQpKTtcbiAgICAgICAgaWYgKG9wdGlvbnMuaXNWZXJib3NlKSB7XG4gICAgICAgICAgY29uc29sZS5pbmZvKGBGZXRjaGVkICR7dXJsfWApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAoZ2VuZXJhdGVkKSBnZW5lcmF0ZWQgKz0gJ1xcbic7XG4gICAgICBnZW5lcmF0ZWQgKz0gY29udGVudCArICdcXG4nO1xuICAgIH1cbiAgICBpZiAoIShhd2FpdCBpZ25vcmVGaWxlVXRpbC5pc0JlcnJ5WmVyb0luc3RhbGxFbmFibGVkKGZpbGVQYXRoKSkpIHtcbiAgICAgIGdlbmVyYXRlZCA9IGdlbmVyYXRlZC5yZXBsYWNlKCchLnlhcm4vY2FjaGUnLCAnIyAhLnlhcm4vY2FjaGUnKS5yZXBsYWNlKCcjIC5wbnAuKicsICcucG5wLionKTtcbiAgICB9XG4gICAgaWYgKGNvbmZpZy5kb2VzQ29udGFpblBvbVhtbEFueXdoZXJlIHx8IGNvbmZpZy5kb2VzQ29udGFpblB1YnNwZWNZYW1sKSB7XG4gICAgICBnZW5lcmF0ZWQgPSBnZW5lcmF0ZWRcbiAgICAgICAgLnJlcGxhY2VBbGwoL14jIC5pZGVhXFwvYXJ0aWZhY3RzJC9nbSwgJy5pZGVhL2FydGlmYWN0cycpXG4gICAgICAgIC5yZXBsYWNlQWxsKC9eIyAuaWRlYVxcL2NvbXBpbGVyLnhtbCQvZ20sICcuaWRlYS9jb21waWxlci54bWwnKVxuICAgICAgICAucmVwbGFjZUFsbCgvXiMgLmlkZWFcXC9qYXJSZXBvc2l0b3JpZXMueG1sJC9nbSwgJy5pZGVhL2phclJlcG9zaXRvcmllcy54bWwnKVxuICAgICAgICAucmVwbGFjZUFsbCgvXiMgLmlkZWFcXC9tb2R1bGVzLnhtbCQvZ20sICcuaWRlYS9tb2R1bGVzLnhtbCcpXG4gICAgICAgIC5yZXBsYWNlQWxsKC9eIyAuaWRlYVxcLyouaW1sJC9nbSwgJy5pZGVhLyouaW1sJylcbiAgICAgICAgLnJlcGxhY2VBbGwoL14jIC5pZGVhXFwvbW9kdWxlcyQvZ20sICcuaWRlYS9tb2R1bGVzJylcbiAgICAgICAgLnJlcGxhY2VBbGwoL14jICouaW1sJC9nbSwgJyouaW1sJylcbiAgICAgICAgLnJlcGxhY2VBbGwoL14jICouaXByJC9nbSwgJyouaXByJyk7XG4gICAgICBpZiAoY29uZmlnLmRvZXNDb250YWluUHVic3BlY1lhbWwpIHtcbiAgICAgICAgZ2VuZXJhdGVkID0gZ2VuZXJhdGVkLnJlcGxhY2VBbGwoL14uaWRlYVxcL21vZHVsZXMueG1sJC9nbSwgJyMgLmlkZWEvbW9kdWxlcy54bWwnKTtcbiAgICAgIH1cbiAgICB9XG4gICAgZ2VuZXJhdGVkID0gZ2VuZXJhdGVkLnJlcGxhY2VBbGwoL14uaWRlYVxcLz8kL2dtLCAnIyAuaWRlYScpO1xuICAgIGlmIChjb25maWcuZGVwZW5kaW5nLnRhdXJpKSB7XG4gICAgICAvLyBUaGUgcnVzdCB0ZW1wbGF0ZSdzIHVuYW5jaG9yZWQgZGVidWcvIHdvdWxkIGFsc28gaGlkZSBmcm9udGVuZCBzb3VyY2VcbiAgICAgIC8vIGRpcmVjdG9yaWVzIHN1Y2ggYXMgc3JjL2RlYnVnLzsgY2FyZ28gb3V0cHV0IGlzIGFscmVhZHkgY292ZXJlZCBieSB0YXJnZXQvLlxuICAgICAgZ2VuZXJhdGVkID0gZ2VuZXJhdGVkLnJlcGxhY2VBbGwoL15kZWJ1Z1xcLyQvZ20sICcjIGRlYnVnLycpO1xuICAgIH1cbiAgICBpZiAoY29uZmlnLmRvZXNDb250YWluVGF1cmlDb25maWcgfHwgY29uZmlnLmRvZXNDb250YWluVGF1cmlDb25maWdJblBhY2thZ2VzKSB7XG4gICAgICAvLyBUaGUgcnVzdCB0ZW1wbGF0ZSBpZ25vcmVzIENhcmdvLmxvY2ssIGJ1dCBhIHNyYy10YXVyaSBjb25maWd1cmF0aW9uIG1hcmtzIGFuXG4gICAgICAvLyBhcHBsaWNhdGlvbiwgd2hvc2UgQ2FyZ28ubG9jayBtdXN0IGJlIGNvbW1pdHRlZCBmb3IgcmVwcm9kdWNpYmxlIGJ1aWxkcy4gVGhlXG4gICAgICAvLyBydWxlIGlzIGFsc28gZGlzYWJsZWQgd2hlbiBhIHN1YiBwYWNrYWdlIGNvbnRhaW5zIGEgVGF1cmkgYXBwbGljYXRpb24sIGJlY2F1c2VcbiAgICAgIC8vIGFuIHVuYW5jaG9yZWQgQ2FyZ28ubG9jayBydWxlIGluIGEgcGFyZW50IC5naXRpZ25vcmUgd291bGQgaGlkZSB0aGUgbmVzdGVkXG4gICAgICAvLyBhcHBsaWNhdGlvbidzIGxvY2tmaWxlLiBUYXVyaSBwbHVnaW4gbGlicmFyaWVzIChkZXRlY3RlZCBvbmx5IHZpYVxuICAgICAgLy8gQHRhdXJpLWFwcHMvKiBkZXBlbmRlbmNpZXMpIGtlZXAgdGhlIHRlbXBsYXRlJ3MgcG9saWN5IG9mIGlnbm9yaW5nIENhcmdvLmxvY2suXG4gICAgICBnZW5lcmF0ZWQgPSBnZW5lcmF0ZWQucmVwbGFjZUFsbCgvXkNhcmdvXFwubG9jayQvZ20sICcjIENhcmdvLmxvY2snKTtcbiAgICB9XG4gICAgaWYgKHJvb3RDb25maWcuZGVwZW5kaW5nLnJlYWN0TmF0aXZlIHx8IGNvbmZpZy5kZXBlbmRpbmcucmVhY3ROYXRpdmUgfHwgY29uZmlnLmRvZXNDb250YWluUHVic3BlY1lhbWwpIHtcbiAgICAgIGdlbmVyYXRlZCA9IGdlbmVyYXRlZC5yZXBsYWNlQWxsKC9eKC5pZGVhXFwvLispJC9nbSwgJyQxXFxuYW5kcm9pZC8kMScpO1xuICAgIH1cbiAgICBjb25zdCBuZXdDb250ZW50ID0gaGVhZFVzZXJDb250ZW50ICsgJ1xcbicgKyBnZW5lcmF0ZWQgKyB0YWlsVXNlckNvbnRlbnQ7XG4gICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzVXRpbC5nZW5lcmF0ZUZpbGUoZmlsZVBhdGgsIG5ld0NvbnRlbnQpKTtcbiAgfSk7XG59XG5cbmNvbnN0IGRpclBhdGggPSBwYXRoLmpvaW4ob3MuaG9tZWRpcigpLCAnLmNhY2hlJywgJ3diZnknLCAnZ2l0aWdub3JlJyk7XG5cbmFzeW5jIGZ1bmN0aW9uIHdyaXRlQ2FjaGUobmFtZTogc3RyaW5nLCBjb250ZW50OiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgYXdhaXQgZnMucHJvbWlzZXMubWtkaXIoZGlyUGF0aCwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gIGF3YWl0IGZzLnByb21pc2VzLndyaXRlRmlsZShwYXRoLmpvaW4oZGlyUGF0aCwgbmFtZSksIGNvbnRlbnQpO1xufVxuXG5hc3luYyBmdW5jdGlvbiByZWFkQ2FjaGUobmFtZTogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmcgfCB1bmRlZmluZWQ+IHtcbiAgdHJ5IHtcbiAgICBjb25zdCBzdGF0ID0gYXdhaXQgZnMucHJvbWlzZXMuc3RhdChwYXRoLmpvaW4oZGlyUGF0aCwgbmFtZSkpO1xuICAgIGlmIChEYXRlLm5vdygpIC0gc3RhdC5tdGltZU1zID4gNiAqIDYwICogNjAgKiAxMDAwKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHJldHVybiBhd2FpdCBmcy5wcm9taXNlcy5yZWFkRmlsZShwYXRoLmpvaW4oZGlyUGF0aCwgbmFtZSksICd1dGY4Jyk7XG4gIH0gY2F0Y2gge1xuICAgIC8vIGRvIG5vdGhpbmdcbiAgfVxufVxuIiwiaW1wb3J0IGNoaWxkX3Byb2Nlc3MgZnJvbSAnbm9kZTpjaGlsZF9wcm9jZXNzJztcbmltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5pbXBvcnQgeyBmaWxlVVJMVG9QYXRoIH0gZnJvbSAnbm9kZTp1cmwnO1xuXG4vKipcbiAqIFRoZSB2ZXJzaW9uIHdiZnkncyBvd24gcGFja2FnZS5qc29uIGNhcnJpZXMgaW4gdGhlIHJlcG9zaXRvcnkuIGBAc2VtYW50aWMtcmVsZWFzZS9ucG1gIHJld3JpdGVzXG4gKiBpdCBpbiB0aGUgcHVibGlzaGVkIHRhcmJhbGwgb25seSAoaXQgaXMgbmV2ZXIgY29tbWl0dGVkIGJhY2spLCBzbyBhIHdiZnkgcnVuIHN0YXJ0ZWQgZnJvbSBhIGdpdFxuICogY2hlY2tvdXQgcmVwb3J0cyB0aGlzIHBsYWNlaG9sZGVyIGluc3RlYWQgb2YgYSByZWFsIHZlcnNpb24uXG4gKi9cbmNvbnN0IHVucmVsZWFzZWRWZXJzaW9uUHJlZml4ID0gJzAuMC4wLSc7XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRXYmZ5VmVyc2lvbigpOiBzdHJpbmcge1xuICByZXR1cm4gcmVhZFdiZnlQYWNrYWdlSnNvbigpLnZlcnNpb247XG59XG5cbi8qKiB3YmZ5J3MgbG9jYXRpb24gaW5zaWRlIGl0cyBvd24gcmVwb3NpdG9yeSwgcmVsYXRpdmUgdG8gdGhlIHJlcG9zaXRvcnkgcm9vdC4gKi9cbmNvbnN0IHdiZnlEaXJQYXRoSW5SZXBvID0gcGF0aC5qb2luKCdwYWNrYWdlcycsICd3YmZ5Jyk7XG5cbi8qKlxuICogSWRlbnRpZmllcyB0aGUgd2JmeSBidWlsZCB0aGF0IHByb2R1Y2VkIHRoZSBnZW5lcmF0ZWQgZmlsZXM6IHRoZSByZWxlYXNlZCB2ZXJzaW9uLCBvclxuICogYDxzaG9ydCBjb21taXQgaGFzaD5bLWRpcnR5XS1sb2NhbGAgd2hlbiB3YmZ5IHJ1bnMgZnJvbSBpdHMgb3duIGdpdCBjaGVja291dC4gVW5kZWZpbmVkIHdoZW5cbiAqIG5laXRoZXIgaXMgYXZhaWxhYmxlIChlLmcuIGFuIHVucmVsZWFzZWQgYnVpbGQgZXh0cmFjdGVkIGZyb20gYSBzb3VyY2UgYXJjaGl2ZSkuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRXYmZ5VmVyc2lvbkxhYmVsKCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIC8vIE5laXRoZXIgdGhlIGluc3RhbGxlZCBwYWNrYWdlLmpzb24gbm9yIHRoZSBnaXQgc3RhdGUgb2Ygd2JmeSdzIG93biBjaGVja291dCBjYW4gY2hhbmdlXG4gIC8vIG1pZC1ydW4sIGFuZCBjb21wdXRpbmcgdGhlIGxhYmVsIHNwYXducyBzZXZlcmFsIGdpdCBzdWJwcm9jZXNzZXMsIHNvIGl0IGlzIGNvbXB1dGVkIG9uY2UuXG4gIGlmICghaGFzQ29tcHV0ZWRWZXJzaW9uTGFiZWwpIHtcbiAgICBjYWNoZWRWZXJzaW9uTGFiZWwgPSBjb21wdXRlV2JmeVZlcnNpb25MYWJlbCgpO1xuICAgIGhhc0NvbXB1dGVkVmVyc2lvbkxhYmVsID0gdHJ1ZTtcbiAgfVxuICByZXR1cm4gY2FjaGVkVmVyc2lvbkxhYmVsO1xufVxuXG5sZXQgaGFzQ29tcHV0ZWRWZXJzaW9uTGFiZWwgPSBmYWxzZTtcbmxldCBjYWNoZWRWZXJzaW9uTGFiZWw6IHN0cmluZyB8IHVuZGVmaW5lZDtcblxuZnVuY3Rpb24gY29tcHV0ZVdiZnlWZXJzaW9uTGFiZWwoKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgeyBuYW1lLCB2ZXJzaW9uLCBkaXJQYXRoIH0gPSByZWFkV2JmeVBhY2thZ2VKc29uKCk7XG4gIGlmICghdmVyc2lvbi5zdGFydHNXaXRoKHVucmVsZWFzZWRWZXJzaW9uUHJlZml4KSkgcmV0dXJuIHZlcnNpb247XG5cbiAgLy8gZ2l0IHJlc29sdmVzIHRoZSBORUFSRVNUIGVuY2xvc2luZyByZXBvc2l0b3J5LCB3aGljaCBmb3IgYW4gdW5yZWxlYXNlZCBidWlsZCBwbGFjZWQgdW5kZXIgYVxuICAvLyB0YXJnZXQgcmVwb3NpdG9yeSAobm9kZV9tb2R1bGVzLCBvciBhIHZlbmRvcmVkL2V4dHJhY3RlZCBzb3VyY2UgdHJlZSkgaXMgdGhhdCByZXBvc2l0b3J5IOKAlCBpdHNcbiAgLy8gY29tbWl0IHNheXMgbm90aGluZyBhYm91dCB0aGUgd2JmeSBidWlsZCB0aGF0IHJhbi4gT25seSB3YmZ5J3Mgb3duIGxvY2F0aW9uIGluc2lkZSBpdHMgb3duXG4gIC8vIHJlcG9zaXRvcnkgaWRlbnRpZmllcyBhIGdlbnVpbmUgY2hlY2tvdXQsIHNvIGFueXRoaW5nIGVsc2UgZmFsbHMgYmFjayB0byB0aGUgdmVyc2lvbi1sZXNzIGxhYmVsLlxuICBjb25zdCBnaXRSb290RGlyUGF0aCA9IHJ1bkdpdChbJ3Jldi1wYXJzZScsICctLXNob3ctdG9wbGV2ZWwnXSwgZGlyUGF0aCk7XG4gIGlmIChcbiAgICAhZ2l0Um9vdERpclBhdGggfHxcbiAgICBwYXRoLnJlbGF0aXZlKGdpdFJvb3REaXJQYXRoLCBkaXJQYXRoKSAhPT0gd2JmeURpclBhdGhJblJlcG8gfHxcbiAgICAhaXNXYmZ5UmVwb3NpdG9yeShnaXRSb290RGlyUGF0aClcbiAgKSB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuICBjb25zdCBjb21taXRIYXNoID0gcnVuR2l0KFsncmV2LXBhcnNlJywgJy0tc2hvcnQ9OCcsICdIRUFEJ10sIGRpclBhdGgpO1xuICBpZiAoIWNvbW1pdEhhc2gpIHJldHVybiB1bmRlZmluZWQ7XG4gIC8vIFRoZSBjb21taXQgYWxvbmUgd291bGQgbWlzaWRlbnRpZnkgYSBidWlsZCBtYWRlIGZyb20gYW4gZWRpdGVkIGNoZWNrb3V0LCBzbyB1bmNvbW1pdHRlZCBjaGFuZ2VzXG4gIC8vIGFyZSByZXBvcnRlZCB0b28g4oCUIGJ1dCBvbmx5IHVuZGVyIHBhY2thZ2VzLyovc3JjLCBwYWNrYWdlcy8qL2JpbiBhbmQgcGFja2FnZXMvKi9jb25maWdzLCB0aGVcbiAgLy8gc291cmNlLCBlbnRyeS1wb2ludCB3cmFwcGVyIGFuZCBwb2xpY3kgZmlsZXMgd2JmeSBhbmQgaXRzIHdvcmtzcGFjZSBkZXBlbmRlbmNpZXMgYWN0dWFsbHkgcnVuXG4gIC8vIGZyb20uIEV2ZXJ5dGhpbmcgd2JmeSBHRU5FUkFURVMgd2hlbiBpdCB0YXJnZXRzIGl0cyBvd24gcmVwb3NpdG9yeSBsaXZlcyBvdXRzaWRlIHRob3NlICh0aGVcbiAgLy8gcm9vdCBSRUFETUUgdGhpcyBsYWJlbCBnb2VzIGludG8sIGFuZCBlYWNoIHBhY2thZ2UncyAuZ2l0aWdub3JlLCBwYWNrYWdlLmpzb24sIHRzY29uZmlnLCDigKYpLCBzb1xuICAvLyBhIGZpcnN0IHJ1biBjYW5ub3QgbWFrZSB0aGUgbmV4dCBvbmUgcmVsYWJlbCB0aGUgYmFkZ2UgYC1kaXJ0eS1sb2NhbGAgYnkgaXRzZWxmLlxuICAvLyBNYW5pZmVzdHMgc3RheSBvdXQgb24gcHVycG9zZSwgZXZlbiB0aG91Z2ggYW4gZWRpdGVkIGBleHBvcnRzYCBtYXAgY2FuIHJlZGlyZWN0IHdoaWNoIGNvZGVcbiAgLy8gbG9hZHM6IHdiZnkgR0VORVJBVEVTIHBhY2thZ2UuanNvbiwgc28gaW5jbHVkaW5nIGl0IHdvdWxkIG1ha2UgZXZlcnkgcnVuIHJlcG9ydCBpdHNlbGYgZGlydHkuXG4gIC8vIFRoZSBsYWJlbCBpcyBiZXN0LWVmZm9ydCBidWlsZCBwcm92ZW5hbmNlLCBub3QgYSByZXByb2R1Y2libGUtYnVpbGQgYXR0ZXN0YXRpb24uXG4gIGNvbnN0IGlzRGlydHkgPSBnZXRHaXREaXJ0eVN0YXRlKGdpdFJvb3REaXJQYXRoKTtcbiAgaWYgKGlzRGlydHkgPT09IHVuZGVmaW5lZCkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgaWYgKGlzRGlydHkpIHJldHVybiBgJHtjb21taXRIYXNofS1kaXJ0eS1sb2NhbGA7XG4gIC8vIEFuIHVubW9kaWZpZWQgY2hlY2tvdXQgc2l0dGluZyBvbiBhIHJlbGVhc2UgdGFnIHJ1bnMgZXhhY3RseSB0aGUgY29kZSB0aGF0IHdhcyBwdWJsaXNoZWQgdW5kZXJcbiAgLy8gdGhhdCB2ZXJzaW9uLCBzbyBpdCBpcyBsYWJlbGVkIHdpdGggdGhlIHZlcnNpb24gaW5zdGVhZCBvZiB0aGUgY29tbWl0IHRoYXQgb25seSB3YmZ5IGRldmVsb3BlcnNcbiAgLy8gY291bGQgcmVzb2x2ZSBiYWNrIHRvIG9uZS5cbiAgcmV0dXJuIGZpbmRSZWxlYXNlZFZlcnNpb25BdEhlYWQobmFtZSwgZGlyUGF0aCkgPz8gYCR7Y29tbWl0SGFzaH0tbG9jYWxgO1xufVxuXG4vKiogYEBzZW1hbnRpYy1yZWxlYXNlL25wbWAgdGFncyBlYWNoIHJlbGVhc2UgYDxwYWNrYWdlIG5hbWU+QDx2ZXJzaW9uPmAuICovXG5mdW5jdGlvbiBmaW5kUmVsZWFzZWRWZXJzaW9uQXRIZWFkKHBhY2thZ2VOYW1lOiBzdHJpbmcsIGN3ZDogc3RyaW5nKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgdGFnUHJlZml4ID0gYCR7cGFja2FnZU5hbWV9QGA7XG4gIC8vIEEgY29tbWl0IGNhcnJpZXMgYXQgbW9zdCBvbmUgcmVsZWFzZSB0YWcgcGVyIHBhY2thZ2UsIHNvIHRoZSBmaXJzdCBtYXRjaCBpcyB0aGUgb25seSBtYXRjaC5cbiAgcmV0dXJuIHJ1bkdpdChbJ3RhZycsICctLXBvaW50cy1hdCcsICdIRUFEJ10sIGN3ZClcbiAgICA/LnNwbGl0KCdcXG4nKVxuICAgIC5maW5kKCh0YWcpID0+IHRhZy5zdGFydHNXaXRoKHRhZ1ByZWZpeCkpXG4gICAgPy5zbGljZSh0YWdQcmVmaXgubGVuZ3RoKTtcbn1cblxuZnVuY3Rpb24gaXNXYmZ5UmVwb3NpdG9yeShnaXRSb290RGlyUGF0aDogc3RyaW5nKTogYm9vbGVhbiB7XG4gIC8vIEV2ZXJ5IHJlbW90ZSBjb3VudHMsIG5vdCBqdXN0IGBvcmlnaW5gOiBhIGZvcmsgY2hlY2tvdXQgY2FycmllcyB0aGUgY2Fub25pY2FsIHJlcG9zaXRvcnkgYXNcbiAgLy8gYHVwc3RyZWFtYCwgYW5kIGl0IGlzIHN0aWxsIGEgZ2VudWluZSB3YmZ5IGNoZWNrb3V0IHdob3NlIGNvbW1pdCBpZGVudGlmaWVzIHRoZSBidWlsZC5cbiAgY29uc3QgcmVtb3RlVXJscyA9IHJ1bkdpdChbJ3JlbW90ZScsICctdiddLCBnaXRSb290RGlyUGF0aCk7XG4gIHJldHVybiAhIXJlbW90ZVVybHM/LnNwbGl0KCdcXG4nKS5zb21lKChsaW5lKSA9PiBpc0Nhbm9uaWNhbFJlbW90ZVVybChsaW5lLnNwbGl0KC9bIFxcdF0rL3UpWzFdID8/ICcnKSk7XG59XG5cbmNvbnN0IGNhbm9uaWNhbFJlcG9zaXRvcnlQYXRoID0gL15cXC8/V2lsbEJvb3N0ZXJcXC9zaGFyZWQoPzpcXC5naXQpPyQvaXU7XG5cbi8qKlxuICogV2hldGhlciB0aGUgcmVtb3RlIFVSTCBwb2ludHMgYXQgd2JmeSdzIG93biByZXBvc2l0b3J5LiBUaGUgaG9zdCBpcyBjb21wYXJlZCBhZnRlciBQQVJTSU5HIHJhdGhlclxuICogdGhhbiBtYXRjaGVkIGluc2lkZSB0aGUgc3RyaW5nOiBhbnkgcGF0dGVybiBsb29zZSBlbm91Z2ggdG8gYWNjZXB0IGV2ZXJ5IFVSTCBmb3JtIGdpdCBzdXBwb3J0c1xuICogYWxzbyBhY2NlcHRlZCBhIGxvb2thbGlrZSB0aGF0IG1lcmVseSBjb250YWlucyB0aGUgaG9zdCwgc3VjaCBhc1xuICogYGh0dHBzOi8vZXZpbC5leGFtcGxlLy9naXRodWIuY29tL1dpbGxCb29zdGVyL3NoYXJlZC5naXRgLCBsZXR0aW5nIGFuIHVucmVsYXRlZCBjaGVja291dCBjbGFpbSB0b1xuICogYmUgYSBnZW51aW5lIHdiZnkgYnVpbGQuXG4gKi9cbmZ1bmN0aW9uIGlzQ2Fub25pY2FsUmVtb3RlVXJsKHVybDogc3RyaW5nKTogYm9vbGVhbiB7XG4gIC8vIHNjcC1zdHlsZSAoYGdpdEBnaXRodWIuY29tOldpbGxCb29zdGVyL3NoYXJlZC5naXRgKSBpcyBub3QgYSBVUkwsIHNvIGl0IGlzIG1hdGNoZWQgc2VwYXJhdGVseS5cbiAgLy8gVGhlIGxvb2thaGVhZCBrZWVwcyBhIHNjaGVtZSdzIGA6Ly9gIGZyb20gYmVpbmcgcmVhZCBhcyB0aGUgYGhvc3Q6cGF0aGAgc2VwYXJhdG9yLlxuICBjb25zdCBzY3BNYXRjaCA9IC9eKD86W15AL10rQCk/KFteLzpdKyk6KD8hXFwvKSguKikkL3UuZXhlYyh1cmwpO1xuICBpZiAoc2NwTWF0Y2gpIHtcbiAgICByZXR1cm4gc2NwTWF0Y2hbMV0hLnRvTG93ZXJDYXNlKCkgPT09ICdnaXRodWIuY29tJyAmJiBjYW5vbmljYWxSZXBvc2l0b3J5UGF0aC50ZXN0KHNjcE1hdGNoWzJdISk7XG4gIH1cbiAgdHJ5IHtcbiAgICBjb25zdCB7IGhvc3RuYW1lLCBwYXRobmFtZSB9ID0gbmV3IFVSTCh1cmwpO1xuICAgIHJldHVybiBob3N0bmFtZS50b0xvd2VyQ2FzZSgpID09PSAnZ2l0aHViLmNvbScgJiYgY2Fub25pY2FsUmVwb3NpdG9yeVBhdGgudGVzdChwYXRobmFtZSk7XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxufVxuXG5mdW5jdGlvbiBnZXRHaXREaXJ0eVN0YXRlKGdpdFJvb3REaXJQYXRoOiBzdHJpbmcpOiBib29sZWFuIHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgcHJvYyA9IGNoaWxkX3Byb2Nlc3Muc3Bhd25TeW5jKFxuICAgICdnaXQnLFxuICAgIFtcbiAgICAgICdzdGF0dXMnLFxuICAgICAgJy0tcG9yY2VsYWluJyxcbiAgICAgICctLXVudHJhY2tlZC1maWxlcz1hbGwnLFxuICAgICAgJy0tJyxcbiAgICAgIGA6KGdsb2IpJHtwYXRoLmRpcm5hbWUod2JmeURpclBhdGhJblJlcG8pfS8qL3NyYy8qKmAsXG4gICAgICBgOihnbG9iKSR7cGF0aC5kaXJuYW1lKHdiZnlEaXJQYXRoSW5SZXBvKX0vKi9iaW4vKipgLFxuICAgICAgYDooZ2xvYikke3BhdGguZGlybmFtZSh3YmZ5RGlyUGF0aEluUmVwbyl9LyovY29uZmlncy8qKmAsXG4gICAgXSxcbiAgICB7IGN3ZDogZ2l0Um9vdERpclBhdGgsIGVuY29kaW5nOiAndXRmOCcsIHN0ZGlvOiAncGlwZScgfVxuICApO1xuICByZXR1cm4gcHJvYy5zdGF0dXMgPT09IDAgPyAhIXByb2Muc3Rkb3V0LnRyaW0oKSA6IHVuZGVmaW5lZDtcbn1cblxuZnVuY3Rpb24gcnVuR2l0KGFyZ3M6IHN0cmluZ1tdLCBjd2Q6IHN0cmluZyk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IHByb2MgPSBjaGlsZF9wcm9jZXNzLnNwYXduU3luYygnZ2l0JywgYXJncywgeyBjd2QsIGVuY29kaW5nOiAndXRmOCcsIHN0ZGlvOiAncGlwZScgfSk7XG4gIHJldHVybiBwcm9jLnN0YXR1cyA9PT0gMCA/IHByb2Muc3Rkb3V0LnRyaW0oKSB8fCB1bmRlZmluZWQgOiB1bmRlZmluZWQ7XG59XG5cbmxldCBjYWNoZWRXYmZ5UGFja2FnZUpzb246IHsgbmFtZTogc3RyaW5nOyB2ZXJzaW9uOiBzdHJpbmc7IGRpclBhdGg6IHN0cmluZyB9IHwgdW5kZWZpbmVkO1xuXG4vKiogUmV0dXJucyB3YmZ5J3Mgb3duIHBhY2thZ2UgZGlyZWN0b3J5LCB3aGljaCBhbHNvIGhvbGRzIGl0cyBjb25maWdzIChlLmcuIHJlbGVhc2VBZ2VHYXRlLmpzb24pLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFdiZnlEaXJQYXRoKCk6IHN0cmluZyB7XG4gIHJldHVybiByZWFkV2JmeVBhY2thZ2VKc29uKCkuZGlyUGF0aDtcbn1cblxuZnVuY3Rpb24gcmVhZFdiZnlQYWNrYWdlSnNvbigpOiB7IG5hbWU6IHN0cmluZzsgdmVyc2lvbjogc3RyaW5nOyBkaXJQYXRoOiBzdHJpbmcgfSB7XG4gIGlmIChjYWNoZWRXYmZ5UGFja2FnZUpzb24pIHJldHVybiBjYWNoZWRXYmZ5UGFja2FnZUpzb247XG4gIC8vIGZpbGVVUkxUb1BhdGgsIG5vdCBVUkwucGF0aG5hbWU6IHRoZSBsYXR0ZXIga2VlcHMgcGVyY2VudC1lbmNvZGluZywgc28gYW4gaW5zdGFsbGF0aW9uIHBhdGhcbiAgLy8gY29udGFpbmluZyBlLmcuIGEgc3BhY2Ugd291bGQgcmVzb2x2ZSB0byBhIG5vbmV4aXN0ZW50IGRpcmVjdG9yeSBhbmQgdGhlIHNlYXJjaCB3b3VsZCB3YWxrIHVwXG4gIC8vIHRvIGFuIHVucmVsYXRlZCBwYWNrYWdlLlxuICBsZXQgZGlyUGF0aCA9IHBhdGguZGlybmFtZShmaWxlVVJMVG9QYXRoKGltcG9ydC5tZXRhLnVybCkpO1xuICB3aGlsZSAoIWZzLmV4aXN0c1N5bmMocGF0aC5qb2luKGRpclBhdGgsICdwYWNrYWdlLmpzb24nKSkpIHtcbiAgICBjb25zdCBwYXJlbnREaXJQYXRoID0gcGF0aC5kaXJuYW1lKGRpclBhdGgpO1xuICAgIC8vIHBhdGguZGlybmFtZSgnLycpID09PSAnLycsIHNvIHRoZSBzZWFyY2ggbXVzdCBzdG9wIGV4cGxpY2l0bHkgYXQgdGhlIGZpbGVzeXN0ZW0gcm9vdC5cbiAgICBpZiAocGFyZW50RGlyUGF0aCA9PT0gZGlyUGF0aCkgdGhyb3cgbmV3IEVycm9yKFwid2JmeSdzIG93biBwYWNrYWdlLmpzb24gaXMgbWlzc2luZy5cIik7XG4gICAgZGlyUGF0aCA9IHBhcmVudERpclBhdGg7XG4gIH1cbiAgY29uc3QgcGFja2FnZUpzb24gPSBKU09OLnBhcnNlKGZzLnJlYWRGaWxlU3luYyhwYXRoLmpvaW4oZGlyUGF0aCwgJ3BhY2thZ2UuanNvbicpLCAndXRmOCcpKSBhcyB7XG4gICAgbmFtZTogc3RyaW5nO1xuICAgIHZlcnNpb246IHN0cmluZztcbiAgfTtcbiAgY2FjaGVkV2JmeVBhY2thZ2VKc29uID0geyBuYW1lOiBwYWNrYWdlSnNvbi5uYW1lLCB2ZXJzaW9uOiBwYWNrYWdlSnNvbi52ZXJzaW9uLCBkaXJQYXRoIH07XG4gIHJldHVybiBjYWNoZWRXYmZ5UGFja2FnZUpzb247XG59XG4iLCJpbXBvcnQgeyBzcGF3blN5bmMgfSBmcm9tICdub2RlOmNoaWxkX3Byb2Nlc3MnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHsgZ2V0V2JmeURpclBhdGggfSBmcm9tICcuLi91dGlscy92ZXJzaW9uLmpzJztcblxuLyoqXG4gKiBBcHBsaWVzIHRoZSBvcmdhbml6YXRpb24ncyBtaW5pbXVtLXJlbGVhc2UtYWdlIHBvbGljeSB0byB0aGUgZGV2ZWxvcGVyIG1hY2hpbmUncyBHTE9CQUxcbiAqIHBhY2thZ2UtbWFuYWdlciBjb25maWdzLiBSZXBvc2l0b3J5IGNvbmZpZ3MgZ3VhcmQgb25seSB3YmZpZWQgcmVwb3NpdG9yaWVzOyBhIGJyYW5kLW5ldyBsb2NhbFxuICogcHJvamVjdCBoYXMgbm8gYnVuZmlnLnRvbWwgeWV0LCBzbyB0aGUgZ2xvYmFsIGZpbGVzIGFyZSB0aGUgb25seSBnYXRlIGJldHdlZW4gYGJ1biBjcmVhdGVgIC9cbiAqIGBucG0gaW5pdGAgYW5kIGEgZnJlc2hseSBjb21wcm9taXNlZCByZWxlYXNlLiBUaGUgc2FtZSBzY3JpcHQgcnVucyBvbiBDSSBhbmQgb24gdGhlIHNlbGYtaG9zdGVkXG4gKiBydW5uZXJzLCBzbyBldmVyeSBtYWNoaW5lIGVuZHMgdXAgd2l0aCBieXRlLWlkZW50aWNhbCBzZXR0aW5ncy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGVuc3VyZUdsb2JhbFJlbGVhc2VBZ2VHYXRlcygpOiBib29sZWFuIHtcbiAgY29uc3QgeyBzdGF0dXMgfSA9IHNwYXduU3luYygnYmFzaCcsIFtwYXRoLmpvaW4oZ2V0V2JmeURpclBhdGgoKSwgJ2NvbmZpZ3MnLCAnYXBwbHlSZWxlYXNlQWdlR2F0ZS5zaCcpXSwge1xuICAgIHN0ZGlvOiAnaW5oZXJpdCcsXG4gIH0pO1xuICBpZiAoc3RhdHVzID09PSAwKSByZXR1cm4gdHJ1ZTtcblxuICBjb25zb2xlLndhcm4oJ0ZhaWxlZCB0byBhcHBseSB0aGUgbWluaW11bS1yZWxlYXNlLWFnZSBwb2xpY3kgdG8gdGhlIGdsb2JhbCBwYWNrYWdlLW1hbmFnZXIgY29uZmlncy4nKTtcbiAgcmV0dXJuIGZhbHNlO1xufVxuIiwiaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5cbmV4cG9ydCBmdW5jdGlvbiBkb2VzQ29udGFpbkpzT3JUcyhjb25maWc6IFBhY2thZ2VDb25maWcpOiBib29sZWFuIHtcbiAgcmV0dXJuIChcbiAgICBjb25maWcuZG9lc0NvbnRhaW5KYXZhU2NyaXB0IHx8XG4gICAgY29uZmlnLmRvZXNDb250YWluSmF2YVNjcmlwdEluUGFja2FnZXMgfHxcbiAgICBjb25maWcuZG9lc0NvbnRhaW5UeXBlU2NyaXB0IHx8XG4gICAgY29uZmlnLmRvZXNDb250YWluVHlwZVNjcmlwdEluUGFja2FnZXNcbiAgKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGRvZXNDb250YWluSmF2YShjb25maWc6IFBhY2thZ2VDb25maWcpOiBib29sZWFuIHtcbiAgcmV0dXJuIGNvbmZpZy5kb2VzQ29udGFpbkphdmEgfHwgY29uZmlnLmRvZXNDb250YWluSmF2YUluUGFja2FnZXM7XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBleHRlbnNpb25zIH0gZnJvbSAnLi4vdXRpbHMvZXh0ZW5zaW9ucy5qcyc7XG5pbXBvcnQgeyBmc1V0aWwgfSBmcm9tICcuLi91dGlscy9mc1V0aWwuanMnO1xuaW1wb3J0IHsgZG9lc0NvbnRhaW5KYXZhLCBkb2VzQ29udGFpbkpzT3JUcyB9IGZyb20gJy4uL3V0aWxzL3BhY2thZ2VDYXBhYmlsaXRpZXMuanMnO1xuaW1wb3J0IHsgcHJvbWlzZVBvb2wgfSBmcm9tICcuLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5cbi8vIEtlZXAgcGFja2FnZS1tYW5hZ2VyIHNoaW1zIGluIHRoZSBGaWxlIFdhdGNoZXIgcHJvZ3JhbSBmaWVsZCBzbyBub2RlIGRvZXMgbm90XG4vLyBwYXJzZSB3cmFwcGVyIHNjcmlwdHMgcGFzc2VkIHRocm91Z2ggYXJndW1lbnRzLlxuY29uc3Qgb3hmbXRQcm9ncmFtID0gJyRQcm9qZWN0RmlsZURpciQvbm9kZV9tb2R1bGVzLy5iaW4vb3hmbXQnO1xuY29uc3QgcHJldHRpZXJQcm9ncmFtID0gJyRQcm9qZWN0RmlsZURpciQvbm9kZV9tb2R1bGVzLy5iaW4vcHJldHRpZXInO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVJZGVhU2V0dGluZ3MoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZ2VuZXJhdGVJZGVhU2V0dGluZ3MnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgZGlyUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJy5pZGVhJyk7XG4gICAgaWYgKGZzLmV4aXN0c1N5bmMoZGlyUGF0aCkpIHtcbiAgICAgIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKGRpclBhdGgsICd3YXRjaGVyVGFza3MueG1sJyk7XG4gICAgICBhd2FpdCAoZG9lc0NvbnRhaW5Kc09yVHMoY29uZmlnKSB8fCBkb2VzQ29udGFpbkphdmEoY29uZmlnKVxuICAgICAgICA/IHByb21pc2VQb29sLnJ1bigoKSA9PiBmc1V0aWwuZ2VuZXJhdGVGaWxlKGZpbGVQYXRoLCBnZXRXYXRjaGVyVGFza3NDb250ZW50KGNvbmZpZykpKVxuICAgICAgICA6IHByb21pc2VQb29sLnJ1bigoKSA9PiBmcy5wcm9taXNlcy5ybShmaWxlUGF0aCwgeyBmb3JjZTogdHJ1ZSB9KSkpO1xuICAgIH1cbiAgfSk7XG59XG5cbmZ1bmN0aW9uIGdldFdhdGNoZXJUYXNrc0NvbnRlbnQoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogc3RyaW5nIHtcbiAgY29uc3QgdGFza09wdGlvbnMgPSBbXG4gICAge1xuICAgICAgYXJnczogJy0td3JpdGUgLS1uby1lcnJvci1vbi11bm1hdGNoZWQtcGF0dGVybiAhKiovcGFja2FnZS5qc29uJyxcbiAgICAgIGNvbmRpdGlvbjogZG9lc0NvbnRhaW5Kc09yVHMoY29uZmlnKSxcbiAgICAgIGV4dGVuc2lvbnM6IGV4dGVuc2lvbnMub3hmbXQsXG4gICAgICBuYW1lOiAnT3hmbXQnLFxuICAgICAgcHJvZ3JhbTogb3hmbXRQcm9ncmFtLFxuICAgIH0sXG4gICAge1xuICAgICAgYXJnczogJy0tY2FjaGUgLS13cml0ZScsXG4gICAgICBjb25kaXRpb246IGRvZXNDb250YWluSmF2YShjb25maWcpLFxuICAgICAgZXh0ZW5zaW9uczogZXh0ZW5zaW9ucy5wcmV0dGllck9ubHksXG4gICAgICBuYW1lOiAnUHJldHRpZXInLFxuICAgICAgcHJvZ3JhbTogcHJldHRpZXJQcm9ncmFtLFxuICAgIH0sXG4gIF1cbiAgICAuZmlsdGVyKCh0YXNrKSA9PiB0YXNrLmNvbmRpdGlvbilcbiAgICAuZmxhdE1hcCgodGFzaykgPT4gdGFzay5leHRlbnNpb25zLm1hcCgoZXh0KSA9PiBjcmVhdGVUYXNrT3B0aW9ucyh0YXNrLnByb2dyYW0sIHRhc2suYXJncywgdGFzay5uYW1lLCBleHQpKSk7XG5cbiAgcmV0dXJuIGA8P3htbCB2ZXJzaW9uPVwiMS4wXCIgZW5jb2Rpbmc9XCJVVEYtOFwiPz5cbjxwcm9qZWN0IHZlcnNpb249XCI0XCI+XG4gIDxjb21wb25lbnQgbmFtZT1cIlByb2plY3RUYXNrc09wdGlvbnNcIj5cbiAgICAke3Rhc2tPcHRpb25zLmpvaW4oJycpfVxuICA8L2NvbXBvbmVudD5cbjwvcHJvamVjdD5cbmA7XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZVRhc2tPcHRpb25zKHJ1bm5lcjogc3RyaW5nLCBhcmdzOiBzdHJpbmcsIG5hbWU6IHN0cmluZywgZXh0ZW5zaW9uOiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gYCAgICA8VGFza09wdGlvbnMgaXNFbmFibGVkPVwidHJ1ZVwiPlxuICAgICAgPG9wdGlvbiBuYW1lPVwiYXJndW1lbnRzXCIgdmFsdWU9XCIke2FyZ3N9ICRGaWxlUGF0aFJlbGF0aXZlVG9Qcm9qZWN0Um9vdCRcIiAvPlxuICAgICAgPG9wdGlvbiBuYW1lPVwiY2hlY2tTeW50YXhFcnJvcnNcIiB2YWx1ZT1cImZhbHNlXCIgLz5cbiAgICAgIDxvcHRpb24gbmFtZT1cImRlc2NyaXB0aW9uXCIgLz5cbiAgICAgIDxvcHRpb24gbmFtZT1cImV4aXRDb2RlQmVoYXZpb3JcIiB2YWx1ZT1cIkVSUk9SXCIgLz5cbiAgICAgIDxvcHRpb24gbmFtZT1cImZpbGVFeHRlbnNpb25cIiB2YWx1ZT1cIiR7ZXh0ZW5zaW9ufVwiIC8+XG4gICAgICA8b3B0aW9uIG5hbWU9XCJpbW1lZGlhdGVTeW5jXCIgdmFsdWU9XCJmYWxzZVwiIC8+XG4gICAgICA8b3B0aW9uIG5hbWU9XCJuYW1lXCIgdmFsdWU9XCIke25hbWV9ICguJHtleHRlbnNpb259KVwiIC8+XG4gICAgICA8b3B0aW9uIG5hbWU9XCJvdXRwdXRcIiB2YWx1ZT1cIiRGaWxlUGF0aFJlbGF0aXZlVG9Qcm9qZWN0Um9vdCRcIiAvPlxuICAgICAgPG9wdGlvbiBuYW1lPVwib3V0cHV0RmlsdGVyc1wiPlxuICAgICAgICA8YXJyYXkgLz5cbiAgICAgIDwvb3B0aW9uPlxuICAgICAgPG9wdGlvbiBuYW1lPVwib3V0cHV0RnJvbVN0ZG91dFwiIHZhbHVlPVwiZmFsc2VcIiAvPlxuICAgICAgPG9wdGlvbiBuYW1lPVwicHJvZ3JhbVwiIHZhbHVlPVwiJHtydW5uZXJ9XCIgLz5cbiAgICAgIDxvcHRpb24gbmFtZT1cInJ1bk9uRXh0ZXJuYWxDaGFuZ2VzXCIgdmFsdWU9XCJmYWxzZVwiIC8+XG4gICAgICA8b3B0aW9uIG5hbWU9XCJzY29wZU5hbWVcIiB2YWx1ZT1cIlByb2plY3QgRmlsZXNcIiAvPlxuICAgICAgPG9wdGlvbiBuYW1lPVwidHJhY2tPbmx5Um9vdFwiIHZhbHVlPVwiZmFsc2VcIiAvPlxuICAgICAgPG9wdGlvbiBuYW1lPVwid29ya2luZ0RpclwiIHZhbHVlPVwiJFByb2plY3RGaWxlRGlyJFwiIC8+XG4gICAgICA8ZW52cyAvPlxuICAgIDwvVGFza09wdGlvbnM+XG5gO1xufVxuIiwiaW1wb3J0IHR5cGUgeyBQYWNrYWdlSnNvbiB9IGZyb20gJ3R5cGUtZmVzdCc7XG5cbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuXG5leHBvcnQgZnVuY3Rpb24gZ2V0R2VuSTE4blRzQ29tbWFuZChcbiAgY29uZmlnOiBQaWNrPFBhY2thZ2VDb25maWcsICdkZXBlbmRpbmcnPixcbiAgc2NyaXB0czogUGFja2FnZUpzb24uU2NyaXB0cyB8IHVuZGVmaW5lZFxuKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgaWYgKCFjb25maWcuZGVwZW5kaW5nLmdlbkkxOG5UcyB8fCAhc2NyaXB0cz8uWydnZW4taTE4bi10cyddKSByZXR1cm4gdW5kZWZpbmVkO1xuICByZXR1cm4gJ2J1biBydW4gZ2VuLWkxOG4tdHMgPiAvZGV2L251bGwnO1xufVxuIiwiY29uc3QgaGFzID0gKG9iamVjdCwga2V5KSA9PiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqZWN0LCBrZXkpXG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHNvcnRPYmplY3RCeUtleU5hbWVMaXN0KG9iamVjdCwgc29ydFdpdGgpIHtcbiAgbGV0IGtleXMsIHNvcnRGbiwga2V5XG5cbiAgaWYgKHR5cGVvZiBzb3J0V2l0aCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIHNvcnRGbiA9IHNvcnRXaXRoXG4gIH0gZWxzZSB7XG4gICAga2V5cyA9IHNvcnRXaXRoXG4gIH1cblxuICBjb25zdCB0b3RhbCA9IHt9XG4gIGNvbnN0IG9iamVjdEtleXMgPSBbLi4uKGtleXMgPz8gW10pLCAuLi5PYmplY3Qua2V5cyhvYmplY3QpLnNvcnQoc29ydEZuKV1cblxuICBmb3IgKGtleSBvZiBvYmplY3RLZXlzKSB7XG4gICAgaWYgKGhhcyhvYmplY3QsIGtleSkpIHtcbiAgICAgIHRvdGFsW2tleV0gPSBvYmplY3Rba2V5XVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiB0b3RhbFxufVxuIiwiLy8gRGV0ZWN0IGVpdGhlciBzcGFjZXMgb3IgdGFicyBidXQgbm90IGJvdGggdG8gcHJvcGVybHkgaGFuZGxlIHRhYnMgZm9yIGluZGVudGF0aW9uIGFuZCBzcGFjZXMgZm9yIGFsaWdubWVudFxuY29uc3QgSU5ERU5UX1JFR0VYID0gL14oPzooICkrfFxcdCspLztcblxuY29uc3QgSU5ERU5UX1RZUEVfU1BBQ0UgPSAnc3BhY2UnO1xuY29uc3QgSU5ERU5UX1RZUEVfVEFCID0gJ3RhYic7XG5cbi8vIEhlbHBlciBmdW5jdGlvbiB0byBjaGVjayBpZiB3ZSBzaG91bGQgaWdub3JlIHNpbmdsZSBzcGFjZSBwYXR0ZXJuc1xuZnVuY3Rpb24gc2hvdWxkSWdub3JlU2luZ2xlU3BhY2UoaWdub3JlU2luZ2xlU3BhY2VzLCBpbmRlbnRUeXBlLCB2YWx1ZSkge1xuXHRyZXR1cm4gaWdub3JlU2luZ2xlU3BhY2VzICYmIGluZGVudFR5cGUgPT09IElOREVOVF9UWVBFX1NQQUNFICYmIHZhbHVlID09PSAxO1xufVxuXG4vKipcbk1ha2UgYSBNYXAgdGhhdCBjb3VudHMgaG93IG1hbnkgaW5kZW50cy91bmluZGVudHMgaGF2ZSBvY2N1cnJlZCBmb3IgYSBnaXZlbiBzaXplIGFuZCBob3cgbWFueSBsaW5lcyBmb2xsb3cgYSBnaXZlbiBpbmRlbnRhdGlvbi5cblxuVGhlIGtleSBpcyBhIGNvbmNhdGVuYXRpb24gb2YgdGhlIGluZGVudGF0aW9uIHR5cGUgKHMgPSBzcGFjZSBhbmQgdCA9IHRhYikgYW5kIHRoZSBzaXplIG9mIHRoZSBpbmRlbnRzL3VuaW5kZW50cy5cblxuYGBgXG5pbmRlbnRzID0ge1xuXHR0MzogWzEsIDBdLFxuXHR0NDogWzEsIDVdLFxuXHRzNTogWzEsIDBdLFxuXHRzMTI6IFsxLCAwXSxcbn1cbmBgYFxuKi9cbmZ1bmN0aW9uIG1ha2VJbmRlbnRzTWFwKHN0cmluZywgaWdub3JlU2luZ2xlU3BhY2VzKSB7XG5cdGNvbnN0IGluZGVudHMgPSBuZXcgTWFwKCk7XG5cblx0Ly8gUmVtZW1iZXIgdGhlIHNpemUgb2YgcHJldmlvdXMgbGluZSdzIGluZGVudGF0aW9uXG5cdGxldCBwcmV2aW91c1NpemUgPSAwO1xuXHRsZXQgcHJldmlvdXNJbmRlbnRUeXBlO1xuXG5cdC8vIEluZGVudHMga2V5IChpZGVudCB0eXBlICsgc2l6ZSBvZiB0aGUgaW5kZW50cy91bmluZGVudHMpXG5cdGxldCBrZXk7XG5cblx0Zm9yIChjb25zdCBsaW5lIG9mIHN0cmluZy5zcGxpdCgvXFxuL2cpKSB7XG5cdFx0aWYgKCFsaW5lKSB7XG5cdFx0XHQvLyBJZ25vcmUgZW1wdHkgbGluZXNcblx0XHRcdGNvbnRpbnVlO1xuXHRcdH1cblxuXHRcdGNvbnN0IG1hdGNoZXMgPSBsaW5lLm1hdGNoKElOREVOVF9SRUdFWCk7XG5cblx0XHRpZiAobWF0Y2hlcyA9PT0gbnVsbCkge1xuXHRcdFx0cHJldmlvdXNTaXplID0gMDtcblx0XHRcdHByZXZpb3VzSW5kZW50VHlwZSA9ICcnO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRjb25zdCBpbmRlbnQgPSBtYXRjaGVzWzBdLmxlbmd0aDtcblx0XHRcdGNvbnN0IGluZGVudFR5cGUgPSBtYXRjaGVzWzFdID8gSU5ERU5UX1RZUEVfU1BBQ0UgOiBJTkRFTlRfVFlQRV9UQUI7XG5cblx0XHRcdC8vIElnbm9yZSBzaW5nbGUgc3BhY2UgdW5sZXNzIGl0J3MgdGhlIG9ubHkgaW5kZW50IGRldGVjdGVkIHRvIHByZXZlbnQgY29tbW9uIGZhbHNlIHBvc2l0aXZlc1xuXHRcdFx0aWYgKHNob3VsZElnbm9yZVNpbmdsZVNwYWNlKGlnbm9yZVNpbmdsZVNwYWNlcywgaW5kZW50VHlwZSwgaW5kZW50KSkge1xuXHRcdFx0XHRjb250aW51ZTtcblx0XHRcdH1cblxuXHRcdFx0aWYgKGluZGVudFR5cGUgIT09IHByZXZpb3VzSW5kZW50VHlwZSkge1xuXHRcdFx0XHRwcmV2aW91c1NpemUgPSAwO1xuXHRcdFx0fVxuXG5cdFx0XHRwcmV2aW91c0luZGVudFR5cGUgPSBpbmRlbnRUeXBlO1xuXG5cdFx0XHRsZXQgdXNlID0gMTtcblx0XHRcdGxldCB3ZWlnaHQgPSAwO1xuXG5cdFx0XHRjb25zdCBpbmRlbnREaWZmZXJlbmNlID0gaW5kZW50IC0gcHJldmlvdXNTaXplO1xuXHRcdFx0cHJldmlvdXNTaXplID0gaW5kZW50O1xuXG5cdFx0XHQvLyBQcmV2aW91cyBsaW5lIGhhdmUgc2FtZSBpbmRlbnQ/XG5cdFx0XHRpZiAoaW5kZW50RGlmZmVyZW5jZSA9PT0gMCkge1xuXHRcdFx0XHQvLyBOb3QgYSBuZXcgXCJ1c2VcIiBvZiB0aGUgY3VycmVudCBpbmRlbnQ6XG5cdFx0XHRcdHVzZSA9IDA7XG5cdFx0XHRcdC8vIEJ1dCBkbyBhZGQgYSBiaXQgdG8gaXQgZm9yIGJyZWFraW5nIHRpZXM6XG5cdFx0XHRcdHdlaWdodCA9IDE7XG5cdFx0XHRcdC8vIFdlIHVzZSB0aGUga2V5IGZyb20gcHJldmlvdXMgbG9vcFxuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0Y29uc3QgYWJzb2x1dGVJbmRlbnREaWZmZXJlbmNlID0gTWF0aC5hYnMoaW5kZW50RGlmZmVyZW5jZSk7XG5cblx0XHRcdFx0Ly8gSWdub3JlIHNpbmdsZSBzcGFjZSBjaGFuZ2VzIHdoZW4gaWdub3JlU2luZ2xlU3BhY2VzIGlzIHRydWVcblx0XHRcdFx0Ly8gVGhpcyBwcmV2ZW50cyBjb21tb24gZmFsc2UgcG9zaXRpdmVzIGZyb20gdGhpbmdzIGxpa2UgYWxpZ25lZCBjb21tZW50c1xuXHRcdFx0XHRpZiAoc2hvdWxkSWdub3JlU2luZ2xlU3BhY2UoaWdub3JlU2luZ2xlU3BhY2VzLCBpbmRlbnRUeXBlLCBhYnNvbHV0ZUluZGVudERpZmZlcmVuY2UpKSB7XG5cdFx0XHRcdFx0Y29udGludWU7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRrZXkgPSBlbmNvZGVJbmRlbnRzS2V5KGluZGVudFR5cGUsIGFic29sdXRlSW5kZW50RGlmZmVyZW5jZSk7XG5cdFx0XHR9XG5cblx0XHRcdC8vIFVwZGF0ZSB0aGUgc3RhdHNcblx0XHRcdGNvbnN0IGVudHJ5ID0gaW5kZW50cy5nZXQoa2V5KTtcblx0XHRcdGluZGVudHMuc2V0KGtleSwgZW50cnkgPT09IHVuZGVmaW5lZCA/IFsxLCAwXSA6IFtlbnRyeVswXSArIHVzZSwgZW50cnlbMV0gKyB3ZWlnaHRdKTtcblx0XHR9XG5cdH1cblxuXHRyZXR1cm4gaW5kZW50cztcbn1cblxuLy8gRW5jb2RlIHRoZSBpbmRlbnQgdHlwZSBhbmQgYW1vdW50IGFzIGEgc3RyaW5nIChlLmcuICdzNCcpIGZvciB1c2UgYXMgYSBjb21wb3VuZCBrZXkgaW4gdGhlIGluZGVudHMgTWFwLlxuZnVuY3Rpb24gZW5jb2RlSW5kZW50c0tleShpbmRlbnRUeXBlLCBpbmRlbnRBbW91bnQpIHtcblx0Y29uc3QgdHlwZUNoYXJhY3RlciA9IGluZGVudFR5cGUgPT09IElOREVOVF9UWVBFX1NQQUNFID8gJ3MnIDogJ3QnO1xuXHRyZXR1cm4gdHlwZUNoYXJhY3RlciArIFN0cmluZyhpbmRlbnRBbW91bnQpO1xufVxuXG4vLyBFeHRyYWN0IHRoZSBpbmRlbnQgdHlwZSBhbmQgYW1vdW50IGZyb20gYSBrZXkgb2YgdGhlIGluZGVudHMgTWFwLlxuZnVuY3Rpb24gZGVjb2RlSW5kZW50c0tleShpbmRlbnRzS2V5KSB7XG5cdGNvbnN0IGtleUhhc1R5cGVTcGFjZSA9IGluZGVudHNLZXlbMF0gPT09ICdzJztcblx0Y29uc3QgdHlwZSA9IGtleUhhc1R5cGVTcGFjZSA/IElOREVOVF9UWVBFX1NQQUNFIDogSU5ERU5UX1RZUEVfVEFCO1xuXG5cdGNvbnN0IGFtb3VudCA9IE51bWJlcihpbmRlbnRzS2V5LnNsaWNlKDEpKTtcblxuXHRyZXR1cm4ge3R5cGUsIGFtb3VudH07XG59XG5cbi8vIFJldHVybiB0aGUga2V5IChlLmcuICdzNCcpIGZyb20gdGhlIGluZGVudHMgTWFwIHRoYXQgcmVwcmVzZW50cyB0aGUgbW9zdCBjb21tb24gaW5kZW50LFxuLy8gb3IgcmV0dXJuIHVuZGVmaW5lZCBpZiB0aGVyZSBhcmUgbm8gaW5kZW50cy5cbmZ1bmN0aW9uIGdldE1vc3RVc2VkS2V5KGluZGVudHMpIHtcblx0bGV0IHJlc3VsdDtcblx0bGV0IG1heFVzZWQgPSAwO1xuXHRsZXQgbWF4V2VpZ2h0ID0gMDtcblxuXHRmb3IgKGNvbnN0IFtrZXksIFt1c2VkQ291bnQsIHdlaWdodF1dIG9mIGluZGVudHMpIHtcblx0XHRpZiAodXNlZENvdW50ID4gbWF4VXNlZCB8fCAodXNlZENvdW50ID09PSBtYXhVc2VkICYmIHdlaWdodCA+IG1heFdlaWdodCkpIHtcblx0XHRcdG1heFVzZWQgPSB1c2VkQ291bnQ7XG5cdFx0XHRtYXhXZWlnaHQgPSB3ZWlnaHQ7XG5cdFx0XHRyZXN1bHQgPSBrZXk7XG5cdFx0fVxuXHR9XG5cblx0cmV0dXJuIHJlc3VsdDtcbn1cblxuZnVuY3Rpb24gbWFrZUluZGVudFN0cmluZyh0eXBlLCBhbW91bnQpIHtcblx0Y29uc3QgaW5kZW50Q2hhcmFjdGVyID0gdHlwZSA9PT0gSU5ERU5UX1RZUEVfU1BBQ0UgPyAnICcgOiAnXFx0Jztcblx0cmV0dXJuIGluZGVudENoYXJhY3Rlci5yZXBlYXQoYW1vdW50KTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gZGV0ZWN0SW5kZW50KHN0cmluZykge1xuXHRpZiAodHlwZW9mIHN0cmluZyAhPT0gJ3N0cmluZycpIHtcblx0XHR0aHJvdyBuZXcgVHlwZUVycm9yKCdFeHBlY3RlZCBhIHN0cmluZycpO1xuXHR9XG5cblx0Ly8gSWRlbnRpZnkgaW5kZW50cyB3aGlsZSBza2lwcGluZyBzaW5nbGUgc3BhY2UgaW5kZW50cyB0byBhdm9pZCBjb21tb24gZWRnZSBjYXNlcyAoZS5nLiBjb2RlIGNvbW1lbnRzKVxuXHQvLyBJZiBubyBpbmRlbnRzIGFyZSBpZGVudGlmaWVkLCBydW4gYWdhaW4gYW5kIGluY2x1ZGUgYWxsIGluZGVudHMgZm9yIGNvbXByZWhlbnNpdmUgZGV0ZWN0aW9uXG5cdGxldCBpbmRlbnRzID0gbWFrZUluZGVudHNNYXAoc3RyaW5nLCB0cnVlKTtcblx0aWYgKGluZGVudHMuc2l6ZSA9PT0gMCkge1xuXHRcdGluZGVudHMgPSBtYWtlSW5kZW50c01hcChzdHJpbmcsIGZhbHNlKTtcblx0fVxuXG5cdGNvbnN0IGtleU9mTW9zdFVzZWRJbmRlbnQgPSBnZXRNb3N0VXNlZEtleShpbmRlbnRzKTtcblxuXHRsZXQgdHlwZTtcblx0bGV0IGFtb3VudCA9IDA7XG5cdGxldCBpbmRlbnQgPSAnJztcblxuXHRpZiAoa2V5T2ZNb3N0VXNlZEluZGVudCAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0KHt0eXBlLCBhbW91bnR9ID0gZGVjb2RlSW5kZW50c0tleShrZXlPZk1vc3RVc2VkSW5kZW50KSk7XG5cdFx0aW5kZW50ID0gbWFrZUluZGVudFN0cmluZyh0eXBlLCBhbW91bnQpO1xuXHR9XG5cblx0cmV0dXJuIHtcblx0XHRhbW91bnQsXG5cdFx0dHlwZSxcblx0XHRpbmRlbnQsXG5cdH07XG59XG4iLCJleHBvcnQgZnVuY3Rpb24gZGV0ZWN0TmV3bGluZShzdHJpbmcpIHtcblx0aWYgKHR5cGVvZiBzdHJpbmcgIT09ICdzdHJpbmcnKSB7XG5cdFx0dGhyb3cgbmV3IFR5cGVFcnJvcignRXhwZWN0ZWQgYSBzdHJpbmcnKTtcblx0fVxuXG5cdGNvbnN0IG5ld2xpbmVzID0gc3RyaW5nLm1hdGNoKC8oPzpcXHI/XFxuKS9nKSB8fCBbXTtcblxuXHRpZiAobmV3bGluZXMubGVuZ3RoID09PSAwKSB7XG5cdFx0cmV0dXJuO1xuXHR9XG5cblx0Y29uc3QgY3JsZiA9IG5ld2xpbmVzLmZpbHRlcihuZXdsaW5lID0+IG5ld2xpbmUgPT09ICdcXHJcXG4nKS5sZW5ndGg7XG5cdGNvbnN0IGxmID0gbmV3bGluZXMubGVuZ3RoIC0gY3JsZjtcblxuXHRyZXR1cm4gY3JsZiA+IGxmID8gJ1xcclxcbicgOiAnXFxuJztcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGRldGVjdE5ld2xpbmVHcmFjZWZ1bChzdHJpbmcpIHtcblx0cmV0dXJuICh0eXBlb2Ygc3RyaW5nID09PSAnc3RyaW5nJyAmJiBkZXRlY3ROZXdsaW5lKHN0cmluZykpIHx8ICdcXG4nO1xufVxuIiwiIiwiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gaXNQbGFpbk9iamVjdCh2YWx1ZSkge1xuXHRpZiAodHlwZW9mIHZhbHVlICE9PSAnb2JqZWN0JyB8fCB2YWx1ZSA9PT0gbnVsbCkge1xuXHRcdHJldHVybiBmYWxzZTtcblx0fVxuXG5cdGNvbnN0IHByb3RvdHlwZSA9IE9iamVjdC5nZXRQcm90b3R5cGVPZih2YWx1ZSk7XG5cdHJldHVybiAocHJvdG90eXBlID09PSBudWxsIHx8IHByb3RvdHlwZSA9PT0gT2JqZWN0LnByb3RvdHlwZSB8fCBPYmplY3QuZ2V0UHJvdG90eXBlT2YocHJvdG90eXBlKSA9PT0gbnVsbCkgJiYgIShTeW1ib2wudG9TdHJpbmdUYWcgaW4gdmFsdWUpICYmICEoU3ltYm9sLml0ZXJhdG9yIGluIHZhbHVlKTtcbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJ1xuaW1wb3J0IHNvcnRPYmplY3RLZXlzIGZyb20gJ3NvcnQtb2JqZWN0LWtleXMnXG5pbXBvcnQgZGV0ZWN0SW5kZW50IGZyb20gJ2RldGVjdC1pbmRlbnQnXG5pbXBvcnQgeyBkZXRlY3ROZXdsaW5lR3JhY2VmdWwgYXMgZGV0ZWN0TmV3bGluZSB9IGZyb20gJ2RldGVjdC1uZXdsaW5lJ1xuaW1wb3J0IGdpdEhvb2tzIGZyb20gJ2dpdC1ob29rcy1saXN0J1xuaW1wb3J0IGlzUGxhaW5PYmplY3QgZnJvbSAnaXMtcGxhaW4tb2JqJ1xuaW1wb3J0IHNlbXZlckNvbXBhcmUgZnJvbSAnc2VtdmVyL2Z1bmN0aW9ucy9jb21wYXJlLmpzJ1xuaW1wb3J0IHNlbXZlck1pblZlcnNpb24gZnJvbSAnc2VtdmVyL3Jhbmdlcy9taW4tdmVyc2lvbi5qcydcblxuY29uc3QgcGlwZSA9XG4gIChmbnMpID0+XG4gICh4LCAuLi5hcmdzKSA9PlxuICAgIGZucy5yZWR1Y2UoKHJlc3VsdCwgZm4pID0+IGZuKHJlc3VsdCwgLi4uYXJncyksIHgpXG5jb25zdCBvbkFycmF5ID0gKGZuKSA9PiAoeCkgPT4gKEFycmF5LmlzQXJyYXkoeCkgPyBmbih4KSA6IHgpXG5jb25zdCBvblN0cmluZ0FycmF5ID0gKGZuKSA9PiAoeCkgPT5cbiAgQXJyYXkuaXNBcnJheSh4KSAmJiB4LmV2ZXJ5KChpdGVtKSA9PiB0eXBlb2YgaXRlbSA9PT0gJ3N0cmluZycpID8gZm4oeCkgOiB4XG5jb25zdCB1bmlxID0gb25TdHJpbmdBcnJheSgoeHMpID0+IFsuLi5uZXcgU2V0KHhzKV0pXG5jb25zdCBzb3J0QXJyYXkgPSBvblN0cmluZ0FycmF5KChhcnJheSkgPT4gYXJyYXkudG9Tb3J0ZWQoKSlcbmNvbnN0IHVuaXFBbmRTb3J0QXJyYXkgPSBwaXBlKFt1bmlxLCBzb3J0QXJyYXldKVxuY29uc3Qgb25PYmplY3QgPVxuICAoZm4pID0+XG4gICh4LCAuLi5hcmdzKSA9PlxuICAgIGlzUGxhaW5PYmplY3QoeCkgPyBmbih4LCAuLi5hcmdzKSA6IHhcbmNvbnN0IHNvcnRPYmplY3RCeSA9IChjb21wYXJhdG9yLCBkZWVwKSA9PiB7XG4gIGNvbnN0IG92ZXIgPSBvbk9iamVjdCgob2JqZWN0KSA9PiB7XG4gICAgaWYgKGRlZXApIHtcbiAgICAgIG9iamVjdCA9IE9iamVjdC5mcm9tRW50cmllcyhcbiAgICAgICAgT2JqZWN0LmVudHJpZXMob2JqZWN0KS5tYXAoKFtrZXksIHZhbHVlXSkgPT4gW2tleSwgb3Zlcih2YWx1ZSldKSxcbiAgICAgIClcbiAgICB9XG5cbiAgICByZXR1cm4gc29ydE9iamVjdEtleXMob2JqZWN0LCBjb21wYXJhdG9yKVxuICB9KVxuXG4gIHJldHVybiBvdmVyXG59XG5jb25zdCBzb3J0T2JqZWN0ID0gc29ydE9iamVjdEJ5KClcbmNvbnN0IHNvcnRVUkxPYmplY3QgPSBzb3J0T2JqZWN0QnkoWyd0eXBlJywgJ3VybCddKVxuY29uc3Qgc29ydFBlb3BsZU9iamVjdCA9IHNvcnRPYmplY3RCeShbJ25hbWUnLCAnZW1haWwnLCAndXJsJ10pXG5jb25zdCBzb3J0RGlyZWN0b3JpZXMgPSBzb3J0T2JqZWN0QnkoW1xuICAnbGliJyxcbiAgJ2JpbicsXG4gICdtYW4nLFxuICAnZG9jJyxcbiAgJ2V4YW1wbGUnLFxuICAndGVzdCcsXG5dKVxuY29uc3Qgb3ZlclByb3BlcnR5ID0gKHByb3BlcnR5LCBvdmVyKSA9PlxuICBvbk9iamVjdCgob2JqZWN0LCAuLi5hcmdzKSA9PlxuICAgIE9iamVjdC5oYXNPd24ob2JqZWN0LCBwcm9wZXJ0eSlcbiAgICAgID8geyAuLi5vYmplY3QsIFtwcm9wZXJ0eV06IG92ZXIob2JqZWN0W3Byb3BlcnR5XSwgLi4uYXJncykgfVxuICAgICAgOiBvYmplY3QsXG4gIClcbmNvbnN0IHNvcnRHaXRIb29rcyA9IHNvcnRPYmplY3RCeShnaXRIb29rcylcblxuY29uc3QgcGFyc2VOYW1lQW5kVmVyc2lvblJhbmdlID0gKHNwZWNpZmllcikgPT4ge1xuICAvLyBJZ25vcmUgYW55dGhpbmcgYWZ0ZXIgPiAmIHJlbHkgb24gZmFsbGJhY2sgYWxwaGFudW1lcmljIHNvcnRpbmcgZm9yIHRoYXRcbiAgY29uc3QgW25hbWVBbmRWZXJzaW9uXSA9IHNwZWNpZmllci5zcGxpdCgnPicpXG4gIGNvbnN0IGF0TWF0Y2hlcyA9IFsuLi5uYW1lQW5kVmVyc2lvbi5tYXRjaEFsbCgnQCcpXVxuICBpZiAoXG4gICAgIWF0TWF0Y2hlcy5sZW5ndGggfHxcbiAgICAoYXRNYXRjaGVzLmxlbmd0aCA9PT0gMSAmJiBhdE1hdGNoZXNbMF0uaW5kZXggPT09IDApXG4gICkge1xuICAgIHJldHVybiB7IG5hbWU6IHNwZWNpZmllciB9XG4gIH1cbiAgY29uc3Qgc3BsaXRJbmRleCA9IGF0TWF0Y2hlcy5wb3AoKS5pbmRleFxuICByZXR1cm4ge1xuICAgIG5hbWU6IG5hbWVBbmRWZXJzaW9uLnN1YnN0cmluZygwLCBzcGxpdEluZGV4KSxcbiAgICByYW5nZTogbmFtZUFuZFZlcnNpb24uc3Vic3RyaW5nKHNwbGl0SW5kZXggKyAxKSxcbiAgfVxufVxuXG5jb25zdCBzb3J0T2JqZWN0QnlTZW12ZXIgPSBzb3J0T2JqZWN0QnkoKGEsIGIpID0+IHtcbiAgY29uc3QgeyBuYW1lOiBhTmFtZSwgcmFuZ2U6IGFSYW5nZSB9ID0gcGFyc2VOYW1lQW5kVmVyc2lvblJhbmdlKGEpXG4gIGNvbnN0IHsgbmFtZTogYk5hbWUsIHJhbmdlOiBiUmFuZ2UgfSA9IHBhcnNlTmFtZUFuZFZlcnNpb25SYW5nZShiKVxuXG4gIGlmIChhTmFtZSAhPT0gYk5hbWUpIHtcbiAgICByZXR1cm4gYU5hbWUubG9jYWxlQ29tcGFyZShiTmFtZSwgJ2VuJylcbiAgfVxuICBpZiAoIWFSYW5nZSkge1xuICAgIHJldHVybiAtMVxuICB9XG4gIGlmICghYlJhbmdlKSB7XG4gICAgcmV0dXJuIDFcbiAgfVxuICByZXR1cm4gc2VtdmVyQ29tcGFyZShzZW12ZXJNaW5WZXJzaW9uKGFSYW5nZSksIHNlbXZlck1pblZlcnNpb24oYlJhbmdlKSlcbn0pXG5cbmNvbnN0IGdldFBhY2thZ2VOYW1lID0gKGlkZW50KSA9PiB7XG4gIGNvbnN0IGluZGV4ID0gaWRlbnQuaW5kZXhPZignQCcsIGlkZW50LnN0YXJ0c1dpdGgoJ0AnKSA/IDEgOiAwKVxuICAvLyBUaGlzIHNob3VsZCBub3QgaGFwcGVuLCB1bmxlc3MgdXNlciBtYW51YWxseSBlZGl0IHRoZSBwYWNrYWdlLmpzb24gZmlsZVxuICByZXR1cm4gaW5kZXggPT09IC0xID8gaWRlbnQgOiBpZGVudC5zbGljZSgwLCBpbmRleClcbn1cblxuY29uc3Qgc29ydE9iamVjdEJ5SWRlbnQgPSAoYSwgYikgPT4ge1xuICBjb25zdCBwYWNrYWdlTmFtZUEgPSBnZXRQYWNrYWdlTmFtZShhKVxuICBjb25zdCBwYWNrYWdlTmFtZUIgPSBnZXRQYWNrYWdlTmFtZShiKVxuXG4gIGlmIChwYWNrYWdlTmFtZUEgPCBwYWNrYWdlTmFtZUIpIHJldHVybiAtMVxuICBpZiAocGFja2FnZU5hbWVBID4gcGFja2FnZU5hbWVCKSByZXR1cm4gMVxuICByZXR1cm4gMFxufVxuXG4vLyBDYWNoZSBieSBgcHJvY2Vzcy5jd2QoKWAgaW5zdGVhZCBvZiBhIHZhcmlhYmxlIHRvIGFsbG93IHVzZXIgY2FsbCBgcHJvY2Vzcy5jaGRpcigpYFxuY29uc3QgY2FjaGUgPSBuZXcgTWFwKClcbmNvbnN0IGhhc1lhcm5PclBucG1GaWxlcyA9ICgpID0+IHtcbiAgY29uc3QgY3dkID0gcHJvY2Vzcy5jd2QoKVxuICBpZiAoIWNhY2hlLmhhcyhjd2QpKSB7XG4gICAgY2FjaGUuc2V0KFxuICAgICAgY3dkLFxuICAgICAgZnMuZXhpc3RzU3luYygneWFybi5sb2NrJykgfHxcbiAgICAgICAgZnMuZXhpc3RzU3luYygnLnlhcm4vJykgfHxcbiAgICAgICAgZnMuZXhpc3RzU3luYygnLnlhcm5yYy55bWwnKSB8fFxuICAgICAgICBmcy5leGlzdHNTeW5jKCdwbnBtLWxvY2sueWFtbCcpIHx8XG4gICAgICAgIGZzLmV4aXN0c1N5bmMoJ3BucG0td29ya3NwYWNlLnlhbWwnKSxcbiAgICApXG4gIH1cbiAgcmV0dXJuIGNhY2hlLmdldChjd2QpXG59XG5cbi8qKlxuICogRGV0ZWN0cyB0aGUgcGFja2FnZSBtYW5hZ2VyIGZyb20gcGFja2FnZS5qc29uIGFuZCBsb2NrIGZpbGVzXG4gKiBAcGFyYW0ge29iamVjdH0gcGFja2FnZUpzb24gLSBUaGUgcGFyc2VkIHBhY2thZ2UuanNvbiBvYmplY3RcbiAqIEByZXR1cm5zIHtib29sZWFufSAtIFRoZSBkZXRlY3RlZCBwYWNrYWdlIG1hbmFnZXIuIERlZmF1bHQgdG8gbnBtIGlmIG5vdCBkZXRlY3RlZC5cbiAqL1xuZnVuY3Rpb24gc2hvdWxkU29ydERlcGVuZGVuY2llc0xpa2VOcG0ocGFja2FnZUpzb24pIHtcbiAgLy8gaHR0cHM6Ly9naXRodWIuY29tL25vZGVqcy9jb3JlcGFja1xuICBpZiAodHlwZW9mIHBhY2thZ2VKc29uLnBhY2thZ2VNYW5hZ2VyID09PSAnc3RyaW5nJykge1xuICAgIHJldHVybiBwYWNrYWdlSnNvbi5wYWNrYWdlTWFuYWdlci5zdGFydHNXaXRoKCducG1AJylcbiAgfVxuXG4gIGlmIChwYWNrYWdlSnNvbi5kZXZFbmdpbmVzPy5wYWNrYWdlTWFuYWdlcj8ubmFtZSkge1xuICAgIHJldHVybiBwYWNrYWdlSnNvbi5kZXZFbmdpbmVzLnBhY2thZ2VNYW5hZ2VyLm5hbWUgPT09ICducG0nXG4gIH1cblxuICBpZiAocGFja2FnZUpzb24ucG5wbSkge1xuICAgIHJldHVybiBmYWxzZVxuICB9XG5cbiAgLy8gT3B0aW1pc2F0aW9uOiBDaGVjayBpZiBucG0gaXMgZXhwbGljaXQgYmVmb3JlIHJlYWRpbmcgRlMuXG4gIGlmIChwYWNrYWdlSnNvbi5lbmdpbmVzPy5ucG0pIHtcbiAgICByZXR1cm4gdHJ1ZVxuICB9XG5cbiAgaWYgKGhhc1lhcm5PclBucG1GaWxlcygpKSB7XG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cblxuICByZXR1cm4gdHJ1ZVxufVxuXG4vKipcbiAqIFNvcnQgZGVwZW5kZW5jaWVzIGFscGhhYmV0aWNhbGx5LCBkZXRlY3RpbmcgcGFja2FnZSBtYW5hZ2VyIHRvIHVzZSB0aGVcbiAqIGFwcHJvcHJpYXRlIGNvbXBhcmlzb24uIG5wbSB1c2VzIGxvY2FsZS1hd2FyZSBjb21wYXJpc29uLCB5YXJuIGFuZCBwbnBtIHVzZVxuICogc2ltcGxlIHN0cmluZyBjb21wYXJpc29uXG4gKi9cbmNvbnN0IHNvcnREZXBlbmRlbmNpZXMgPSBvbk9iamVjdCgoZGVwZW5kZW5jaWVzLCBwYWNrYWdlSnNvbikgPT4ge1xuICAvLyBBdm9pZCBmaWxlIGFjY2Vzc1xuICBpZiAoT2JqZWN0LmtleXMoZGVwZW5kZW5jaWVzKS5sZW5ndGggPCAyKSB7XG4gICAgcmV0dXJuIGRlcGVuZGVuY2llc1xuICB9XG5cbiAgLy8gc29ydCBkZXBzIGxpa2UgdGhlIG5wbSBDTEkgZG9lcyAodmlhIHRoZSBwYWNrYWdlIEBucG1jbGkvcGFja2FnZS1qc29uKVxuICAvLyBodHRwczovL2dpdGh1Yi5jb20vbnBtL3BhY2thZ2UtanNvbi9ibG9iL2I2NDY1ZjQ0YzcyN2Q2NTEzZGI2ODk4YzdjYmU0MWRkMzU1Y2ViZTgvbGliL3VwZGF0ZS1kZXBlbmRlbmNpZXMuanMjTDgtTDIxXG4gIGlmIChzaG91bGRTb3J0RGVwZW5kZW5jaWVzTGlrZU5wbShwYWNrYWdlSnNvbikpIHtcbiAgICByZXR1cm4gc29ydE9iamVjdEtleXMoZGVwZW5kZW5jaWVzLCAoYSwgYikgPT4gYS5sb2NhbGVDb21wYXJlKGIsICdlbicpKVxuICB9XG5cbiAgcmV0dXJuIHNvcnRPYmplY3RLZXlzKGRlcGVuZGVuY2llcylcbn0pXG5cbi8qKlxuICogXCJ3b3Jrc3BhY2VzXCIgY2FuIGJlIGFuIGFycmF5IChucG0gb3IgeWFybiBjbGFzc2ljKSBvciBhbiBvYmplY3QgKHBucG0vYnVuKS5cbiAqIEluIHRoZSBjYXNlIG9mIGFuIGFycmF5LCB3ZSBkbyBub3Qgd2FudCB0byBhbHBoYWJldGljYWxseSBzb3J0IGl0IGluIGNhc2VcbiAqIHNjcmlwdHMgbmVlZCB0byBydW4gaW4gYSBzcGVjaWZpYyBvcmRlci5cbiAqXG4gKiBAc2VlIGh0dHBzOi8vZG9jcy5ucG1qcy5jb20vY2xpL3Y3L3VzaW5nLW5wbS93b3Jrc3BhY2VzP3Y9dHJ1ZSNydW5uaW5nLWNvbW1hbmRzLWluLXRoZS1jb250ZXh0LW9mLXdvcmtzcGFjZXNcbiAqL1xuY29uc3Qgc29ydFdvcmtzcGFjZXMgPSBwaXBlKFtcbiAgc29ydE9iamVjdEJ5KFsncGFja2FnZXMnLCAnY2F0YWxvZyddKSxcbiAgb3ZlclByb3BlcnR5KCdwYWNrYWdlcycsIHVuaXFBbmRTb3J0QXJyYXkpLFxuICBvdmVyUHJvcGVydHkoJ2NhdGFsb2cnLCBzb3J0RGVwZW5kZW5jaWVzKSxcbl0pXG5cbi8vIGh0dHBzOi8vZ2l0aHViLmNvbS9lc2xpbnQvZXNsaW50L2Jsb2IvYWNjMGU0NzU3MmE5MzkwMjkyYjRlMzEzYjRhNGJmMzYwZDIzNjM1OC9jb25mL2NvbmZpZy1zY2hlbWEuanNcbmNvbnN0IGVzbGludEJhc2VDb25maWdQcm9wZXJ0aWVzID0gW1xuICAvLyBgZmlsZXNgIGFuZCBgZXhjbHVkZWRGaWxlc2AgYXJlIG9ubHkgb24gYG92ZXJyaWRlc1tdYFxuICAvLyBmb3IgZWFzaWVyIHNvcnQgYG92ZXJyaWRlc1tdYCxcbiAgLy8gYWRkIHRoZW0gdG8gaGVyZSwgc28gd2UgZG9uJ3QgbmVlZCBzb3J0IGBvdmVycmlkZXNbXWAgdHdpY2VcbiAgJ2ZpbGVzJyxcbiAgJ2V4Y2x1ZGVkRmlsZXMnLFxuICAvLyBiYXNlQ29uZmlnXG4gICdlbnYnLFxuICAncGFyc2VyJyxcbiAgJ3BhcnNlck9wdGlvbnMnLFxuICAnc2V0dGluZ3MnLFxuICAncGx1Z2lucycsXG4gICdleHRlbmRzJyxcbiAgJ3J1bGVzJyxcbiAgJ292ZXJyaWRlcycsXG4gICdnbG9iYWxzJyxcbiAgJ3Byb2Nlc3NvcicsXG4gICdub0lubGluZUNvbmZpZycsXG4gICdyZXBvcnRVbnVzZWREaXNhYmxlRGlyZWN0aXZlcycsXG5dXG5jb25zdCBzb3J0RXNsaW50Q29uZmlnID0gcGlwZShbXG4gIHNvcnRPYmplY3RCeShlc2xpbnRCYXNlQ29uZmlnUHJvcGVydGllcyksXG4gIG92ZXJQcm9wZXJ0eSgnZW52Jywgc29ydE9iamVjdCksXG4gIG92ZXJQcm9wZXJ0eSgnZ2xvYmFscycsIHNvcnRPYmplY3QpLFxuICBvdmVyUHJvcGVydHkoXG4gICAgJ292ZXJyaWRlcycsXG4gICAgb25BcnJheSgob3ZlcnJpZGVzKSA9PiBvdmVycmlkZXMubWFwKHNvcnRFc2xpbnRDb25maWcpKSxcbiAgKSxcbiAgb3ZlclByb3BlcnR5KCdwYXJzZXJPcHRpb25zJywgc29ydE9iamVjdCksXG4gIG92ZXJQcm9wZXJ0eShcbiAgICAncnVsZXMnLFxuICAgIHNvcnRPYmplY3RCeShcbiAgICAgIChydWxlMSwgcnVsZTIpID0+XG4gICAgICAgIHJ1bGUxLnNwbGl0KCcvJykubGVuZ3RoIC0gcnVsZTIuc3BsaXQoJy8nKS5sZW5ndGggfHxcbiAgICAgICAgcnVsZTEubG9jYWxlQ29tcGFyZShydWxlMiksXG4gICAgKSxcbiAgKSxcbiAgb3ZlclByb3BlcnR5KCdzZXR0aW5ncycsIHNvcnRPYmplY3QpLFxuXSlcbmNvbnN0IHNvcnRWU0NvZGVCYWRnZU9iamVjdCA9IHNvcnRPYmplY3RCeShbJ2Rlc2NyaXB0aW9uJywgJ3VybCcsICdocmVmJ10pXG5cbmNvbnN0IHNvcnRQcmV0dGllckNvbmZpZyA9IHBpcGUoW1xuICAvLyBzb3J0IGtleXMgYWxwaGFiZXRpY2FsbHksIGJ1dCBwdXQgYG92ZXJyaWRlc2AgYXQgYm90dG9tXG4gIG9uT2JqZWN0KChjb25maWcpID0+XG4gICAgc29ydE9iamVjdEtleXMoY29uZmlnLCBbXG4gICAgICAuLi5PYmplY3Qua2V5cyhjb25maWcpXG4gICAgICAgIC5maWx0ZXIoKGtleSkgPT4ga2V5ICE9PSAnb3ZlcnJpZGVzJylcbiAgICAgICAgLnNvcnQoKSxcbiAgICAgICdvdmVycmlkZXMnLFxuICAgIF0pLFxuICApLFxuICAvLyBpZiBgY29uZmlnLm92ZXJyaWRlc2AgZXhpc3RzXG4gIG92ZXJQcm9wZXJ0eShcbiAgICAnb3ZlcnJpZGVzJyxcbiAgICAvLyBhbmQgYGNvbmZpZy5vdmVycmlkZXNgIGlzIGFuIGFycmF5XG4gICAgb25BcnJheSgob3ZlcnJpZGVzKSA9PlxuICAgICAgb3ZlcnJpZGVzLm1hcChcbiAgICAgICAgcGlwZShbXG4gICAgICAgICAgLy8gc29ydCBgY29uZmlnLm92ZXJyaWRlc1tdYCBhbHBoYWJldGljYWxseVxuICAgICAgICAgIHNvcnRPYmplY3QsXG4gICAgICAgICAgLy8gc29ydCBgY29uZmlnLm92ZXJyaWRlc1tdLm9wdGlvbnNgIGFscGhhYmV0aWNhbGx5XG4gICAgICAgICAgb3ZlclByb3BlcnR5KCdvcHRpb25zJywgc29ydE9iamVjdCksXG4gICAgICAgIF0pLFxuICAgICAgKSxcbiAgICApLFxuICApLFxuXSlcblxuY29uc3Qgc29ydFZvbHRhID0gc29ydE9iamVjdEJ5KFsnbm9kZScsICducG0nLCAneWFybiddKVxuXG4vLyBodHRwczovL2dpdGh1Yi5jb20vZ29vZ2xlL3dpcmVpdFxuY29uc3Qgd2lyZWl0U2NyaXB0UHJvcGVydGllcyA9IFsnY29tbWFuZCcsICdkZXBlbmRlbmNpZXMnLCAnZmlsZXMnLCAnb3V0cHV0J11cbmNvbnN0IHNvcnRXaXJlaXRTY3JpcHQgPSBwaXBlKFtcbiAgc29ydE9iamVjdEJ5KHdpcmVpdFNjcmlwdFByb3BlcnRpZXMpLFxuICBvdmVyUHJvcGVydHkoXG4gICAgJ2RlcGVuZGVuY2llcycsXG4gICAgb25BcnJheSgoZGVwcykgPT4gZGVwcy5tYXAoc29ydE9iamVjdEJ5KFsnc2NyaXB0JywgJ2Nhc2NhZGUnXSkpKSxcbiAgKSxcbiAgb3ZlclByb3BlcnR5KFxuICAgICdlbnYnLFxuICAgIG9uT2JqZWN0KChlbnYpID0+XG4gICAgICBzb3J0T2JqZWN0S2V5cyhcbiAgICAgICAgT2JqZWN0LmZyb21FbnRyaWVzKFxuICAgICAgICAgIE9iamVjdC5lbnRyaWVzKGVudikubWFwKChba2V5LCB2YWx1ZV0pID0+IFtcbiAgICAgICAgICAgIGtleSxcbiAgICAgICAgICAgIHNvcnRPYmplY3RCeShbJ2V4dGVybmFsJywgJ2RlZmF1bHQnXSkodmFsdWUpLFxuICAgICAgICAgIF0pLFxuICAgICAgICApLFxuICAgICAgKSxcbiAgICApLFxuICApLFxuICBvdmVyUHJvcGVydHkoXG4gICAgJ3NlcnZpY2UnLFxuICAgIHBpcGUoW3NvcnRPYmplY3RCeShbJ3JlYWR5V2hlbiddKSwgb3ZlclByb3BlcnR5KCdyZWFkeVdoZW4nLCBzb3J0T2JqZWN0KV0pLFxuICApLFxuXSlcbmNvbnN0IHNvcnRXaXJlaXQgPSBvbk9iamVjdCgod2lyZWl0KSA9PlxuICBzb3J0T2JqZWN0S2V5cyhcbiAgICBPYmplY3QuZnJvbUVudHJpZXMoXG4gICAgICBPYmplY3QuZW50cmllcyh3aXJlaXQpLm1hcCgoW25hbWUsIGNvbmZpZ10pID0+IFtcbiAgICAgICAgbmFtZSxcbiAgICAgICAgc29ydFdpcmVpdFNjcmlwdChjb25maWcpLFxuICAgICAgXSksXG4gICAgKSxcbiAgKSxcbilcbmNvbnN0IHNvcnREZXZFbmdpbmVzID0gb3ZlclByb3BlcnR5KFxuICAncGFja2FnZU1hbmFnZXInLFxuICBzb3J0T2JqZWN0QnkoWyduYW1lJywgJ3ZlcnNpb24nLCAnb25GYWlsJ10pLFxuKVxuXG5jb25zdCBwbnBtQmFzZUNvbmZpZ1Byb3BlcnRpZXMgPSBbXG4gICdwZWVyRGVwZW5kZW5jeVJ1bGVzJyxcbiAgJ25ldmVyQnVpbHREZXBlbmRlbmNpZXMnLFxuICAnb25seUJ1aWx0RGVwZW5kZW5jaWVzJyxcbiAgJ29ubHlCdWlsdERlcGVuZGVuY2llc0ZpbGUnLFxuICAnYWxsb3dlZERlcHJlY2F0ZWRWZXJzaW9ucycsXG4gICdhbGxvd05vbkFwcGxpZWRQYXRjaGVzJyxcbiAgJ3VwZGF0ZUNvbmZpZycsXG4gICdhdWRpdENvbmZpZycsXG4gICdyZXF1aXJlZFNjcmlwdHMnLFxuICAnc3VwcG9ydGVkQXJjaGl0ZWN0dXJlcycsXG4gICdvdmVycmlkZXMnLFxuICAncGF0Y2hlZERlcGVuZGVuY2llcycsXG4gICdwYWNrYWdlRXh0ZW5zaW9ucycsXG5dXG5cbmNvbnN0IHNvcnRQbnBtQ29uZmlnID0gcGlwZShbXG4gIHNvcnRPYmplY3RCeShwbnBtQmFzZUNvbmZpZ1Byb3BlcnRpZXMsIHRydWUpLFxuICBvdmVyUHJvcGVydHkoJ292ZXJyaWRlcycsIHNvcnRPYmplY3RCeVNlbXZlciksXG5dKVxuXG4vLyBTZWUgaHR0cHM6Ly9kb2NzLm5wbWpzLmNvbS9taXNjL3NjcmlwdHNcbmNvbnN0IGRlZmF1bHROcG1TY3JpcHRzID0gbmV3IFNldChbXG4gICdpbnN0YWxsJyxcbiAgJ3BhY2snLFxuICAncHJlcGFyZScsXG4gICdwdWJsaXNoJyxcbiAgJ3Jlc3RhcnQnLFxuICAnc2hyaW5rd3JhcCcsXG4gICdzdGFydCcsXG4gICdzdG9wJyxcbiAgJ3Rlc3QnLFxuICAndW5pbnN0YWxsJyxcbiAgJ3ZlcnNpb24nLFxuXSlcblxuY29uc3QgaGFzRGV2RGVwZW5kZW5jeSA9IChkZXBlbmRlbmN5LCBwYWNrYWdlSnNvbikgPT4ge1xuICByZXR1cm4gKFxuICAgIE9iamVjdC5oYXNPd24ocGFja2FnZUpzb24sICdkZXZEZXBlbmRlbmNpZXMnKSAmJlxuICAgIE9iamVjdC5oYXNPd24ocGFja2FnZUpzb24uZGV2RGVwZW5kZW5jaWVzLCBkZXBlbmRlbmN5KVxuICApXG59XG5cbmNvbnN0IHJ1blNSZWdFeHAgPVxuICAvKD88PV58W1xccyY7PD58KF0pKD86cnVuLXN8bnBtLXJ1bi1hbGwyPyAuKig/Oi0tc2VxdWVudGlhbHwtLXNlcmlhbHwtcykpKD89JHxbXFxzJjs8PnwpXSkvXG5cbmNvbnN0IGlzU2VxdWVudGlhbFNjcmlwdCA9IChjb21tYW5kKSA9PlxuICBjb21tYW5kLmluY2x1ZGVzKCcqJykgJiYgcnVuU1JlZ0V4cC50ZXN0KGNvbW1hbmQpXG5cbmNvbnN0IGhhc1NlcXVlbnRpYWxTY3JpcHQgPSAocGFja2FnZUpzb24pID0+IHtcbiAgaWYgKFxuICAgICFoYXNEZXZEZXBlbmRlbmN5KCducG0tcnVuLWFsbCcsIHBhY2thZ2VKc29uKSAmJlxuICAgICFoYXNEZXZEZXBlbmRlbmN5KCducG0tcnVuLWFsbDInLCBwYWNrYWdlSnNvbilcbiAgKSB7XG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cbiAgY29uc3Qgc2NyaXB0cyA9IFsnc2NyaXB0cycsICdiZXR0ZXJTY3JpcHRzJ10uZmxhdE1hcCgoZmllbGQpID0+XG4gICAgcGFja2FnZUpzb25bZmllbGRdID8gT2JqZWN0LnZhbHVlcyhwYWNrYWdlSnNvbltmaWVsZF0pIDogW10sXG4gIClcbiAgcmV0dXJuIHNjcmlwdHMuc29tZSgoc2NyaXB0KSA9PiBpc1NlcXVlbnRpYWxTY3JpcHQoc2NyaXB0KSlcbn1cblxuZnVuY3Rpb24gc29ydFNjcmlwdE5hbWVzKGtleXMsIHByZWZpeCA9ICcnKSB7XG4gIGNvbnN0IGdyb3VwTWFwID0gbmV3IE1hcCgpXG4gIGZvciAoY29uc3Qga2V5IG9mIGtleXMpIHtcbiAgICBjb25zdCByZXN0ID0gcHJlZml4ID8ga2V5LnNsaWNlKHByZWZpeC5sZW5ndGggKyAxKSA6IGtleVxuICAgIGNvbnN0IGlkeCA9IHJlc3QuaW5kZXhPZignOicpXG4gICAgaWYgKGlkeCA+IDApIHtcbiAgICAgIGNvbnN0IGJhc2UgPSBrZXkuc2xpY2UoMCwgKHByZWZpeCA/IHByZWZpeC5sZW5ndGggKyAxIDogMCkgKyBpZHgpXG4gICAgICBpZiAoIWdyb3VwTWFwLmhhcyhiYXNlKSkgZ3JvdXBNYXAuc2V0KGJhc2UsIFtdKVxuICAgICAgZ3JvdXBNYXAuZ2V0KGJhc2UpLnB1c2goa2V5KVxuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoIWdyb3VwTWFwLmhhcyhrZXkpKSBncm91cE1hcC5zZXQoa2V5LCBbXSlcbiAgICAgIGdyb3VwTWFwLmdldChrZXkpLnB1c2goa2V5KVxuICAgIH1cbiAgfVxuICByZXR1cm4gQXJyYXkuZnJvbShncm91cE1hcC5rZXlzKCkpXG4gICAgLnNvcnQoKVxuICAgIC5mbGF0TWFwKChncm91cEtleSkgPT4ge1xuICAgICAgY29uc3QgY2hpbGRyZW4gPSBncm91cE1hcC5nZXQoZ3JvdXBLZXkpXG4gICAgICBpZiAoXG4gICAgICAgIGNoaWxkcmVuLmxlbmd0aCA+IDEgJiZcbiAgICAgICAgY2hpbGRyZW4uc29tZSgoaykgPT4gayAhPT0gZ3JvdXBLZXkgJiYgay5zdGFydHNXaXRoKGdyb3VwS2V5ICsgJzonKSlcbiAgICAgICkge1xuICAgICAgICBjb25zdCBkaXJlY3QgPSBjaGlsZHJlblxuICAgICAgICAgIC5maWx0ZXIoKGspID0+IGsgPT09IGdyb3VwS2V5IHx8ICFrLnN0YXJ0c1dpdGgoZ3JvdXBLZXkgKyAnOicpKVxuICAgICAgICAgIC5zb3J0KClcbiAgICAgICAgY29uc3QgbmVzdGVkID0gY2hpbGRyZW4uZmlsdGVyKChrKSA9PiBrLnN0YXJ0c1dpdGgoZ3JvdXBLZXkgKyAnOicpKVxuICAgICAgICByZXR1cm4gWy4uLmRpcmVjdCwgLi4uc29ydFNjcmlwdE5hbWVzKG5lc3RlZCwgZ3JvdXBLZXkpXVxuICAgICAgfVxuICAgICAgcmV0dXJuIGNoaWxkcmVuLnNvcnQoKVxuICAgIH0pXG59XG5cbmNvbnN0IHNvcnRTY3JpcHRzID0gb25PYmplY3QoKHNjcmlwdHMsIHBhY2thZ2VKc29uKSA9PiB7XG4gIGxldCBuYW1lcyA9IE9iamVjdC5rZXlzKHNjcmlwdHMpXG4gIGNvbnN0IHByZWZpeGFibGUgPSBuZXcgU2V0KClcblxuICBuYW1lcyA9IG5hbWVzLm1hcCgobmFtZSkgPT4ge1xuICAgIGNvbnN0IG9taXR0ZWQgPSBuYW1lLnJlcGxhY2UoL14oPzpwcmV8cG9zdCkvLCAnJylcbiAgICBpZiAoZGVmYXVsdE5wbVNjcmlwdHMuaGFzKG9taXR0ZWQpIHx8IG5hbWVzLmluY2x1ZGVzKG9taXR0ZWQpKSB7XG4gICAgICBwcmVmaXhhYmxlLmFkZChvbWl0dGVkKVxuICAgICAgcmV0dXJuIG9taXR0ZWRcbiAgICB9XG4gICAgcmV0dXJuIG5hbWVcbiAgfSlcblxuICBpZiAoIWhhc1NlcXVlbnRpYWxTY3JpcHQocGFja2FnZUpzb24pKSB7XG4gICAgbmFtZXMgPSBzb3J0U2NyaXB0TmFtZXMobmFtZXMpXG4gIH1cbiAgbmFtZXMgPSBuYW1lcy5mbGF0TWFwKChrZXkpID0+XG4gICAgcHJlZml4YWJsZS5oYXMoa2V5KSA/IFtgcHJlJHtrZXl9YCwga2V5LCBgcG9zdCR7a2V5fWBdIDogW2tleV0sXG4gIClcbiAgcmV0dXJuIHNvcnRPYmplY3RLZXlzKHNjcmlwdHMsIG5hbWVzKVxufSlcblxuLypcbi0gTW92ZSBgZGVmYXVsdGAgY29uZGl0aW9uIHRvIGJvdHRvbVxuKi9cbmNvbnN0IHNvcnRDb25kaXRpb25zID0gKGNvbmRpdGlvbnMpID0+IHtcbiAgY29uc3QgeyBkZWZhdWx0Q29uZGl0aW9ucyA9IFtdLCByZXN0Q29uZGl0aW9ucyA9IFtdIH0gPSBPYmplY3QuZ3JvdXBCeShcbiAgICBjb25kaXRpb25zLFxuICAgIChjb25kaXRpb24pID0+IHtcbiAgICAgIGlmIChjb25kaXRpb24gPT09ICdkZWZhdWx0Jykge1xuICAgICAgICByZXR1cm4gJ2RlZmF1bHRDb25kaXRpb25zJ1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gJ3Jlc3RDb25kaXRpb25zJ1xuICAgIH0sXG4gIClcblxuICByZXR1cm4gWy4uLnJlc3RDb25kaXRpb25zLCAuLi5kZWZhdWx0Q29uZGl0aW9uc11cbn1cblxuY29uc3Qgc29ydEV4cG9ydHMgPSBvbk9iamVjdCgoZXhwb3J0cykgPT4ge1xuICBjb25zdCB7IHBhdGhzID0gW10sIGNvbmRpdGlvbnMgPSBbXSB9ID0gT2JqZWN0Lmdyb3VwQnkoXG4gICAgT2JqZWN0LmtleXMoZXhwb3J0cyksXG4gICAgKGtleSkgPT4gKGtleS5zdGFydHNXaXRoKCcuJykgPyAncGF0aHMnIDogJ2NvbmRpdGlvbnMnKSxcbiAgKVxuXG4gIHJldHVybiBPYmplY3QuZnJvbUVudHJpZXMoXG4gICAgWy4uLnBhdGhzLCAuLi5zb3J0Q29uZGl0aW9ucyhjb25kaXRpb25zKV0ubWFwKChrZXkpID0+IFtcbiAgICAgIGtleSxcbiAgICAgIHNvcnRFeHBvcnRzKGV4cG9ydHNba2V5XSksXG4gICAgXSksXG4gIClcbn0pXG5cbi8vIGZpZWxkcyBtYXJrZWQgYHZzY29kZWAgYXJlIGZvciBgVmlzdWFsIFN0dWRpbyBDb2RlIGV4dGVuc2lvbiBtYW5pZmVzdGAgb25seVxuLy8gaHR0cHM6Ly9jb2RlLnZpc3VhbHN0dWRpby5jb20vYXBpL3JlZmVyZW5jZXMvZXh0ZW5zaW9uLW1hbmlmZXN0XG4vLyBTdXBwb3J0ZWQgZmllbGRzOlxuLy8gcHVibGlzaGVyLCBkaXNwbGF5TmFtZSwgY2F0ZWdvcmllcywgZ2FsbGVyeUJhbm5lciwgcHJldmlldywgY29udHJpYnV0ZXMsXG4vLyBhY3RpdmF0aW9uRXZlbnRzLCBiYWRnZXMsIG1hcmtkb3duLCBxbmEsIGV4dGVuc2lvblBhY2ssXG4vLyBleHRlbnNpb25EZXBlbmRlbmNpZXMsIGljb25cblxuLy8gZmllbGQua2V5e3N0cmluZ306IGZpZWxkIG5hbWVcbi8vIGZpZWxkLm92ZXJ7ZnVuY3Rpb259OiBzb3J0IGZpZWxkIHN1YktleVxuY29uc3QgZmllbGRzID0gW1xuICB7IGtleTogJyRzY2hlbWEnIH0sXG4gIHsga2V5OiAnbmFtZScgfSxcbiAgLyogdnNjb2RlICovIHsga2V5OiAnZGlzcGxheU5hbWUnIH0sXG4gIHsga2V5OiAndmVyc2lvbicgfSxcbiAgLyogeWFybiAqLyB7IGtleTogJ3N0YWJsZVZlcnNpb24nIH0sXG4gIHsga2V5OiAncHJpdmF0ZScgfSxcbiAgeyBrZXk6ICdkZXNjcmlwdGlvbicgfSxcbiAgLyogdnNjb2RlICovIHsga2V5OiAnY2F0ZWdvcmllcycsIG92ZXI6IHVuaXEgfSxcbiAgeyBrZXk6ICdrZXl3b3JkcycsIG92ZXI6IHVuaXEgfSxcbiAgeyBrZXk6ICdob21lcGFnZScgfSxcbiAgeyBrZXk6ICdidWdzJywgb3Zlcjogc29ydE9iamVjdEJ5KFsndXJsJywgJ2VtYWlsJ10pIH0sXG4gIHsga2V5OiAncmVwb3NpdG9yeScsIG92ZXI6IHNvcnRVUkxPYmplY3QgfSxcbiAgeyBrZXk6ICdmdW5kaW5nJywgb3Zlcjogc29ydFVSTE9iamVjdCB9LFxuICB7IGtleTogJ2xpY2Vuc2UnLCBvdmVyOiBzb3J0VVJMT2JqZWN0IH0sXG4gIC8qIHZzY29kZSAqLyB7IGtleTogJ3FuYScgfSxcbiAgeyBrZXk6ICdhdXRob3InLCBvdmVyOiBzb3J0UGVvcGxlT2JqZWN0IH0sXG4gIHtcbiAgICBrZXk6ICdtYWludGFpbmVycycsXG4gICAgb3Zlcjogb25BcnJheSgobWFpbnRhaW5lcnMpID0+IG1haW50YWluZXJzLm1hcChzb3J0UGVvcGxlT2JqZWN0KSksXG4gIH0sXG4gIHtcbiAgICBrZXk6ICdjb250cmlidXRvcnMnLFxuICAgIG92ZXI6IG9uQXJyYXkoKGNvbnRyaWJ1dG9ycykgPT4gY29udHJpYnV0b3JzLm1hcChzb3J0UGVvcGxlT2JqZWN0KSksXG4gIH0sXG4gIC8qIHZzY29kZSAqLyB7IGtleTogJ3B1Ymxpc2hlcicgfSxcbiAgeyBrZXk6ICdzaWRlRWZmZWN0cycgfSxcbiAgeyBrZXk6ICd0eXBlJyB9LFxuICB7IGtleTogJ2ltcG9ydHMnIH0sXG4gIHsga2V5OiAnZXhwb3J0cycsIG92ZXI6IHNvcnRFeHBvcnRzIH0sXG4gIHsga2V5OiAnbWFpbicgfSxcbiAgeyBrZXk6ICdzdmVsdGUnIH0sXG4gIHsga2V5OiAndW1kOm1haW4nIH0sXG4gIHsga2V5OiAnanNkZWxpdnInIH0sXG4gIHsga2V5OiAndW5wa2cnIH0sXG4gIHsga2V5OiAnbW9kdWxlJyB9LFxuICB7IGtleTogJ3NvdXJjZScgfSxcbiAgeyBrZXk6ICdqc25leHQ6bWFpbicgfSxcbiAgeyBrZXk6ICdicm93c2VyJyB9LFxuICB7IGtleTogJ3JlYWN0LW5hdGl2ZScgfSxcbiAgeyBrZXk6ICd0eXBlcycgfSxcbiAgeyBrZXk6ICd0eXBlc1ZlcnNpb25zJyB9LFxuICB7IGtleTogJ3R5cGluZ3MnIH0sXG4gIHsga2V5OiAnc3R5bGUnIH0sXG4gIHsga2V5OiAnZXhhbXBsZScgfSxcbiAgeyBrZXk6ICdleGFtcGxlc3R5bGUnIH0sXG4gIHsga2V5OiAnYXNzZXRzJyB9LFxuICB7IGtleTogJ2JpbicsIG92ZXI6IHNvcnRPYmplY3QgfSxcbiAgeyBrZXk6ICdtYW4nIH0sXG4gIHsga2V5OiAnZGlyZWN0b3JpZXMnLCBvdmVyOiBzb3J0RGlyZWN0b3JpZXMgfSxcbiAgeyBrZXk6ICdmaWxlcycsIG92ZXI6IHVuaXEgfSxcbiAgeyBrZXk6ICd3b3Jrc3BhY2VzJywgb3Zlcjogc29ydFdvcmtzcGFjZXMgfSxcbiAgLy8gbm9kZS1wcmUtZ3lwIGh0dHBzOi8vd3d3Lm5wbWpzLmNvbS9wYWNrYWdlL25vZGUtcHJlLWd5cCMxLWFkZC1uZXctZW50cmllcy10by15b3VyLXBhY2thZ2Vqc29uXG4gIHtcbiAgICBrZXk6ICdiaW5hcnknLFxuICAgIG92ZXI6IHNvcnRPYmplY3RCeShbXG4gICAgICAnbW9kdWxlX25hbWUnLFxuICAgICAgJ21vZHVsZV9wYXRoJyxcbiAgICAgICdyZW1vdGVfcGF0aCcsXG4gICAgICAncGFja2FnZV9uYW1lJyxcbiAgICAgICdob3N0JyxcbiAgICBdKSxcbiAgfSxcbiAgeyBrZXk6ICdzY3JpcHRzJywgb3Zlcjogc29ydFNjcmlwdHMgfSxcbiAgeyBrZXk6ICdiZXR0ZXJTY3JpcHRzJywgb3Zlcjogc29ydFNjcmlwdHMgfSxcbiAgeyBrZXk6ICd3aXJlaXQnLCBvdmVyOiBzb3J0V2lyZWl0IH0sXG4gIC8qIHZzY29kZSAqLyB7IGtleTogJ2wxMG4nIH0sXG4gIC8qIHZzY29kZSAqLyB7IGtleTogJ2NvbnRyaWJ1dGVzJywgb3Zlcjogc29ydE9iamVjdCB9LFxuICAvKiB2c2NvZGUgKi8geyBrZXk6ICdhY3RpdmF0aW9uRXZlbnRzJywgb3ZlcjogdW5pcSB9LFxuICB7IGtleTogJ2h1c2t5Jywgb3Zlcjogb3ZlclByb3BlcnR5KCdob29rcycsIHNvcnRHaXRIb29rcykgfSxcbiAgeyBrZXk6ICdzaW1wbGUtZ2l0LWhvb2tzJywgb3Zlcjogc29ydEdpdEhvb2tzIH0sXG4gIHsga2V5OiAncHJlLWNvbW1pdCcgfSxcbiAgeyBrZXk6ICdjb21taXRsaW50Jywgb3Zlcjogc29ydE9iamVjdCB9LFxuICB7IGtleTogJ2xpbnQtc3RhZ2VkJyB9LFxuICB7IGtleTogJ25hbm8tc3RhZ2VkJyB9LFxuICB7IGtleTogJ2NvbmZpZycsIG92ZXI6IHNvcnRPYmplY3QgfSxcbiAgeyBrZXk6ICdub2RlbW9uQ29uZmlnJywgb3Zlcjogc29ydE9iamVjdCB9LFxuICB7IGtleTogJ2Jyb3dzZXJpZnknLCBvdmVyOiBzb3J0T2JqZWN0IH0sXG4gIHsga2V5OiAnYmFiZWwnLCBvdmVyOiBzb3J0T2JqZWN0IH0sXG4gIHsga2V5OiAnYnJvd3NlcnNsaXN0JyB9LFxuICB7IGtleTogJ3hvJywgb3Zlcjogc29ydE9iamVjdCB9LFxuICB7IGtleTogJ3ByZXR0aWVyJywgb3Zlcjogc29ydFByZXR0aWVyQ29uZmlnIH0sXG4gIHsga2V5OiAnZXNsaW50Q29uZmlnJywgb3Zlcjogc29ydEVzbGludENvbmZpZyB9LFxuICB7IGtleTogJ2VzbGludElnbm9yZScgfSxcbiAgeyBrZXk6ICducG1wa2dqc29ubGludCcsIG92ZXI6IHNvcnRPYmplY3QgfSxcbiAgeyBrZXk6ICducG1QYWNrYWdlSnNvbkxpbnRDb25maWcnLCBvdmVyOiBzb3J0T2JqZWN0IH0sXG4gIHsga2V5OiAnbnBtcGFja2FnZWpzb25saW50Jywgb3Zlcjogc29ydE9iamVjdCB9LFxuICB7IGtleTogJ3JlbGVhc2UnLCBvdmVyOiBzb3J0T2JqZWN0IH0sXG4gIHsga2V5OiAncmVtYXJrQ29uZmlnJywgb3Zlcjogc29ydE9iamVjdCB9LFxuICB7IGtleTogJ3N0eWxlbGludCcgfSxcbiAgeyBrZXk6ICdhdmEnLCBvdmVyOiBzb3J0T2JqZWN0IH0sXG4gIHsga2V5OiAnamVzdCcsIG92ZXI6IHNvcnRPYmplY3QgfSxcbiAgeyBrZXk6ICdqZXN0LWp1bml0Jywgb3Zlcjogc29ydE9iamVjdCB9LFxuICB7IGtleTogJ2plc3Qtc3RhcmUnLCBvdmVyOiBzb3J0T2JqZWN0IH0sXG4gIHsga2V5OiAnbW9jaGEnLCBvdmVyOiBzb3J0T2JqZWN0IH0sXG4gIHsga2V5OiAnbnljJywgb3Zlcjogc29ydE9iamVjdCB9LFxuICB7IGtleTogJ2M4Jywgb3Zlcjogc29ydE9iamVjdCB9LFxuICB7IGtleTogJ3RhcCcsIG92ZXI6IHNvcnRPYmplY3QgfSxcbiAgeyBrZXk6ICdvY2xpZicsIG92ZXI6IHNvcnRPYmplY3RCeSh1bmRlZmluZWQsIHRydWUpIH0sXG4gIHsga2V5OiAncmVzb2x1dGlvbnMnLCBvdmVyOiBzb3J0T2JqZWN0IH0sXG4gIHsga2V5OiAnb3ZlcnJpZGVzJywgb3Zlcjogc29ydERlcGVuZGVuY2llcyB9LFxuICB7IGtleTogJ2RlcGVuZGVuY2llcycsIG92ZXI6IHNvcnREZXBlbmRlbmNpZXMgfSxcbiAgeyBrZXk6ICdkZXZEZXBlbmRlbmNpZXMnLCBvdmVyOiBzb3J0RGVwZW5kZW5jaWVzIH0sXG4gIHsga2V5OiAnZGVwZW5kZW5jaWVzTWV0YScsIG92ZXI6IHNvcnRPYmplY3RCeShzb3J0T2JqZWN0QnlJZGVudCwgdHJ1ZSkgfSxcbiAgeyBrZXk6ICdwZWVyRGVwZW5kZW5jaWVzJywgb3Zlcjogc29ydERlcGVuZGVuY2llcyB9LFxuICAvLyBUT0RPOiBvbmx5IHNvcnQgZGVwdGggPSAyXG4gIHsga2V5OiAncGVlckRlcGVuZGVuY2llc01ldGEnLCBvdmVyOiBzb3J0T2JqZWN0QnkodW5kZWZpbmVkLCB0cnVlKSB9LFxuICB7IGtleTogJ29wdGlvbmFsRGVwZW5kZW5jaWVzJywgb3Zlcjogc29ydERlcGVuZGVuY2llcyB9LFxuICB7IGtleTogJ2J1bmRsZWREZXBlbmRlbmNpZXMnLCBvdmVyOiB1bmlxQW5kU29ydEFycmF5IH0sXG4gIHsga2V5OiAnYnVuZGxlRGVwZW5kZW5jaWVzJywgb3ZlcjogdW5pcUFuZFNvcnRBcnJheSB9LFxuICAvKiB2c2NvZGUgKi8geyBrZXk6ICdleHRlbnNpb25QYWNrJywgb3ZlcjogdW5pcUFuZFNvcnRBcnJheSB9LFxuICAvKiB2c2NvZGUgKi8geyBrZXk6ICdleHRlbnNpb25EZXBlbmRlbmNpZXMnLCBvdmVyOiB1bmlxQW5kU29ydEFycmF5IH0sXG4gIHsga2V5OiAnZmxhdCcgfSxcbiAgeyBrZXk6ICdwYWNrYWdlTWFuYWdlcicgfSxcbiAgeyBrZXk6ICdlbmdpbmVzJywgb3Zlcjogc29ydE9iamVjdCB9LFxuICB7IGtleTogJ2VuZ2luZVN0cmljdCcsIG92ZXI6IHNvcnRPYmplY3QgfSxcbiAgeyBrZXk6ICdkZXZFbmdpbmVzJywgb3Zlcjogc29ydERldkVuZ2luZXMgfSxcbiAgeyBrZXk6ICd2b2x0YScsIG92ZXI6IHNvcnRWb2x0YSB9LFxuICB7IGtleTogJ2xhbmd1YWdlTmFtZScgfSxcbiAgeyBrZXk6ICdvcycgfSxcbiAgeyBrZXk6ICdjcHUnIH0sXG4gIHsga2V5OiAncHJlZmVyR2xvYmFsJywgb3Zlcjogc29ydE9iamVjdCB9LFxuICB7IGtleTogJ3B1Ymxpc2hDb25maWcnLCBvdmVyOiBzb3J0T2JqZWN0IH0sXG4gIC8qIHZzY29kZSAqLyB7IGtleTogJ2ljb24nIH0sXG4gIC8qIHZzY29kZSAqLyB7XG4gICAga2V5OiAnYmFkZ2VzJyxcbiAgICBvdmVyOiBvbkFycmF5KChiYWRnZSkgPT4gYmFkZ2UubWFwKHNvcnRWU0NvZGVCYWRnZU9iamVjdCkpLFxuICB9LFxuICAvKiB2c2NvZGUgKi8geyBrZXk6ICdnYWxsZXJ5QmFubmVyJywgb3Zlcjogc29ydE9iamVjdCB9LFxuICAvKiB2c2NvZGUgKi8geyBrZXk6ICdwcmV2aWV3JyB9LFxuICAvKiB2c2NvZGUgKi8geyBrZXk6ICdtYXJrZG93bicgfSxcbiAgeyBrZXk6ICdwbnBtJywgb3Zlcjogc29ydFBucG1Db25maWcgfSxcbl1cblxuY29uc3QgZGVmYXVsdFNvcnRPcmRlciA9IGZpZWxkcy5tYXAoKHsga2V5IH0pID0+IGtleSlcbmNvbnN0IG92ZXJGaWVsZHMgPSBwaXBlKFxuICBmaWVsZHNcbiAgICAubWFwKCh7IGtleSwgb3ZlciB9KSA9PiAob3ZlciA/IG92ZXJQcm9wZXJ0eShrZXksIG92ZXIpIDogdW5kZWZpbmVkKSlcbiAgICAuZmlsdGVyKEJvb2xlYW4pLFxuKVxuXG5mdW5jdGlvbiBlZGl0U3RyaW5nSlNPTihqc29uLCBvdmVyKSB7XG4gIGlmICh0eXBlb2YganNvbiA9PT0gJ3N0cmluZycpIHtcbiAgICBjb25zdCB7IGluZGVudCwgdHlwZSB9ID0gZGV0ZWN0SW5kZW50KGpzb24pXG4gICAgY29uc3QgZW5kQ2hhcmFjdGVycyA9IGpzb24uc2xpY2UoLTEpID09PSAnXFxuJyA/ICdcXG4nIDogJydcbiAgICBjb25zdCBuZXdsaW5lID0gZGV0ZWN0TmV3bGluZShqc29uKVxuICAgIGpzb24gPSBKU09OLnBhcnNlKGpzb24pXG5cbiAgICBsZXQgcmVzdWx0ID1cbiAgICAgIEpTT04uc3RyaW5naWZ5KG92ZXIoanNvbiksIG51bGwsIHR5cGUgPT09ICd0YWInID8gJ1xcdCcgOiBpbmRlbnQpICtcbiAgICAgIGVuZENoYXJhY3RlcnNcbiAgICBpZiAobmV3bGluZSA9PT0gJ1xcclxcbicpIHtcbiAgICAgIHJlc3VsdCA9IHJlc3VsdC5yZXBsYWNlKC9cXG4vZywgbmV3bGluZSlcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdFxuICB9XG5cbiAgcmV0dXJuIG92ZXIoanNvbilcbn1cblxuZnVuY3Rpb24gc29ydFBhY2thZ2VKc29uKGpzb25Jc2gsIG9wdGlvbnMgPSB7fSkge1xuICByZXR1cm4gZWRpdFN0cmluZ0pTT04oXG4gICAganNvbklzaCxcbiAgICBvbk9iamVjdCgoanNvbikgPT4ge1xuICAgICAgbGV0IHNvcnRPcmRlciA9IG9wdGlvbnMuc29ydE9yZGVyIHx8IGRlZmF1bHRTb3J0T3JkZXJcblxuICAgICAgaWYgKEFycmF5LmlzQXJyYXkoc29ydE9yZGVyKSkge1xuICAgICAgICBjb25zdCBrZXlzID0gT2JqZWN0LmtleXMoanNvbilcbiAgICAgICAgY29uc3QgeyBwcml2YXRlS2V5cyA9IFtdLCBwdWJsaWNLZXlzID0gW10gfSA9IE9iamVjdC5ncm91cEJ5KFxuICAgICAgICAgIGtleXMsXG4gICAgICAgICAgKGtleSkgPT4gKGtleVswXSA9PT0gJ18nID8gJ3ByaXZhdGVLZXlzJyA6ICdwdWJsaWNLZXlzJyksXG4gICAgICAgIClcbiAgICAgICAgc29ydE9yZGVyID0gW1xuICAgICAgICAgIC4uLnNvcnRPcmRlcixcbiAgICAgICAgICAuLi5kZWZhdWx0U29ydE9yZGVyLFxuICAgICAgICAgIC4uLnB1YmxpY0tleXMuc29ydCgpLFxuICAgICAgICAgIC4uLnByaXZhdGVLZXlzLnNvcnQoKSxcbiAgICAgICAgXVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gb3ZlckZpZWxkcyhzb3J0T2JqZWN0S2V5cyhqc29uLCBzb3J0T3JkZXIpLCBqc29uKVxuICAgIH0pLFxuICApXG59XG5cbmV4cG9ydCBkZWZhdWx0IHNvcnRQYWNrYWdlSnNvblxuZXhwb3J0IHsgc29ydFBhY2thZ2VKc29uLCBkZWZhdWx0U29ydE9yZGVyIGFzIHNvcnRPcmRlciB9XG4iLCJpbXBvcnQgeyBzcGF3blN5bmNBbmRSZXR1cm5TdGRvdXQgfSBmcm9tICcuLi91dGlscy9zcGF3blV0aWwuanMnO1xuXG5leHBvcnQgZnVuY3Rpb24gZ2V0TGF0ZXN0Q29tbWl0SGFzaChvcmdhbml6YXRpb246IHN0cmluZywgcmVwbzogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgdHJ5IHtcbiAgICBjb25zdCByZXBvVXJsID0gYGdpdEBnaXRodWIuY29tOiR7b3JnYW5pemF0aW9ufS8ke3JlcG99LmdpdGA7XG4gICAgY29uc3Qgb3V0cHV0ID0gc3Bhd25TeW5jQW5kUmV0dXJuU3Rkb3V0KCdnaXQnLCBbJ2xzLXJlbW90ZScsIHJlcG9VcmwsICdIRUFEJ10sIHByb2Nlc3MuY3dkKCkpO1xuICAgIGNvbnN0IGNvbW1pdEhhc2ggPSBvdXRwdXQuc3BsaXQoL1xccysvKVswXTtcbiAgICBpZiAoIWNvbW1pdEhhc2gpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgTm8gY29tbWl0cyBmb3VuZCBmb3IgJHtvcmdhbml6YXRpb259LyR7cmVwb31gKTtcbiAgICB9XG4gICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShjb21taXRIYXNoKTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IEVycm9yKGBGYWlsZWQgdG8gZmV0Y2ggY29tbWl0cyBmb3IgJHtvcmdhbml6YXRpb259LyR7cmVwb306ICR7U3RyaW5nKGVycm9yKX1gKSk7XG4gIH1cbn1cbiIsImltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuXG5leHBvcnQgY29uc3QgbWFuYWdlZFRzY29uZmlnQmFzZURlcGVuZGVuY2llcyA9IFtcbiAgJ0B0c2NvbmZpZy9idW4nLFxuICAnQHRzY29uZmlnL25vZGUtbHRzJyxcbiAgJ0B0c2NvbmZpZy9ub2RlLXRzJyxcbiAgJ0B0c2NvbmZpZy9yZWFjdC1uYXRpdmUnLFxuXTtcblxuZXhwb3J0IGZ1bmN0aW9uIGdldFRzY29uZmlnRXh0ZW5kcyhjb25maWc6IFBhY2thZ2VDb25maWcpOiBzdHJpbmcgfCBzdHJpbmdbXSB7XG4gIC8vIFJlYWN0IE5hdGl2ZSBuZWVkcyBNZXRyby1jb21wYXRpYmxlIHNldHRpbmdzIChqc3g6IHJlYWN0LW5hdGl2ZSwgbm9kZSByZXNvbHV0aW9uKSwgd2hpY2hcbiAgLy8gQHRzY29uZmlnL2J1biB3b3VsZCBvdmVycmlkZSBldmVuIHRob3VnaCB0aGUgcmVwbyB1c2VzIEJ1biBhcyBpdHMgcGFja2FnZSBtYW5hZ2VyLlxuICBpZiAoY29uZmlnLmRlcGVuZGluZy5yZWFjdE5hdGl2ZSkge1xuICAgIHJldHVybiAnQHRzY29uZmlnL3JlYWN0LW5hdGl2ZS90c2NvbmZpZy5qc29uJztcbiAgfVxuICByZXR1cm4gJ0B0c2NvbmZpZy9idW4vdHNjb25maWcuanNvbic7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRUc2NvbmZpZ0Jhc2VEZXBlbmRlbmNpZXMoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogc3RyaW5nW10ge1xuICBpZiAoY29uZmlnLmRlcGVuZGluZy5ibGl0eiB8fCBjb25maWcuZGVwZW5kaW5nLm5leHQpIHtcbiAgICByZXR1cm4gW107XG4gIH1cbiAgaWYgKGNvbmZpZy5kZXBlbmRpbmcucmVhY3ROYXRpdmUpIHtcbiAgICByZXR1cm4gWydAdHNjb25maWcvcmVhY3QtbmF0aXZlJ107XG4gIH1cbiAgcmV0dXJuIFsnQHRzY29uZmlnL2J1biddO1xufVxuIiwiaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5cbi8qKlxuICogUmV0dXJucyB0aGUgbW9kdWxlIHNwZWNpZmllciBhIGdlbmVyYXRlZCBjb25maWcgZmlsZSBzaG91bGQgdXNlIHRvIGxvYWQgYVxuICogd2lsbGJvb3N0ZXItY29uZmlncyBjb25maWcgcGFja2FnZSBzdWNoIGFzIGBAd2lsbGJvb3N0ZXIvb3hsaW50LWNvbmZpZ2AuXG4gKlxuICogT3V0c2lkZSB3aWxsYm9vc3Rlci1jb25maWdzIHRoaXMgaXMgc2ltcGx5IHRoZSBwdWJsaXNoZWQgcGFja2FnZSBuYW1lLiBJbnNpZGVcbiAqIHdpbGxib29zdGVyLWNvbmZpZ3MgdGhlIHBhY2thZ2UgbXVzdCBub3QgYmUgZGVjbGFyZWQgYXMgYSBkZXBlbmRlbmN5OiB0aGVcbiAqIGNvbmZpZyBwYWNrYWdlcyBpbXBvcnQgb25lIGFub3RoZXIgKGUuZy4gb3hmbXQtY29uZmlnJ3Mgb3hsaW50LmNvbmZpZy50c1xuICogaW1wb3J0cyBveGxpbnQtY29uZmlnIGFuZCB2aWNlIHZlcnNhKSwgc28gYSBkZWNsYXJlZCBlZGdlIHdvdWxkIGZvcm0gYVxuICogZGVwZW5kZW5jeSBjeWNsZSB0aGF0IG11bHRpLXNlbWFudGljLXJlbGVhc2UgY2Fubm90IHRvcG9sb2dpY2FsbHkgc29ydC4gU2luY2VcbiAqIHRoZSBlZGdlIGlzIGFic2VudCwgaXNvbGF0ZWQgaW5zdGFsbHMgY2Fubm90IHJlc29sdmUgdGhlIGJhcmUgcGFja2FnZSBuYW1lLCBzb1xuICogaW1wb3J0IHRoZSBjb21taXR0ZWQgYGNvbmZpZy5tanNgIGJ1aWxkIG91dHB1dCB0aHJvdWdoIGEgcmVsYXRpdmUgcGF0aCBpbnN0ZWFkLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVzb2x2ZVdpbGxib29zdGVyQ29uZmlnTW9kdWxlKGNvbmZpZzogUGFja2FnZUNvbmZpZywgY29uZmlnUGFja2FnZU5hbWU6IHN0cmluZyk6IHN0cmluZyB7XG4gIGlmICghY29uZmlnLmlzV2lsbEJvb3N0ZXJDb25maWdzKSByZXR1cm4gY29uZmlnUGFja2FnZU5hbWU7XG5cbiAgLy8gZS5nLiAnQHdpbGxib29zdGVyL294bGludC1jb25maWcnIC0+ICdveGxpbnQtY29uZmlnJywgd2hpY2ggaXMgaXRzIGRpcmVjdG9yeSB1bmRlciBgcGFja2FnZXMvYC5cbiAgY29uc3QgY29uZmlnUGFja2FnZURpciA9IGNvbmZpZ1BhY2thZ2VOYW1lLnNwbGl0KCcvJykucG9wKCkgPz8gJyc7XG4gIC8vIERlcml2ZSB0aGUgd2lsbGJvb3N0ZXItY29uZmlncyByb290IGZyb20gdGhlIHBhY2thZ2UgYmVpbmcgZ2VuZXJhdGVkLCBub3QgZnJvbSB0aGUgQ0xJIGVudHJ5XG4gIC8vIHBhdGg6IGB3YmZ5IDxyZXBvPi9wYWNrYWdlcy88cGtnPmAgaXMgYSBzdXBwb3J0ZWQgaW52b2NhdGlvbiB3aG9zZSBlbnRyeSBjb25maWcgaXMgdGhlIGNoaWxkXG4gIC8vIHBhY2thZ2UgcmF0aGVyIHRoYW4gdGhlIHJlcG8gcm9vdCwgc28gcmVseWluZyBvbiB0aGUgZW50cnkgd291bGQgZW1pdCBhIG5lc3RlZCwgdW5yZXNvbHZhYmxlXG4gIC8vIHBhdGggZm9yIGEgZGlyZWN0bHkgdGFyZ2V0ZWQgY29uZmlnIHBhY2thZ2UuIEV2ZXJ5IHdpbGxib29zdGVyLWNvbmZpZ3MgcGFja2FnZSBpcyBlaXRoZXIgdGhlXG4gIC8vIHJvb3Qgb3IgYSBkaXJlY3QgY2hpbGQgdW5kZXIgYHBhY2thZ2VzL2AsIHNvIHRoZSByb290IGlzIHRoZSBwYWNrYWdlIGRpciBpdHNlbGYgb3IgaXRzIGdyYW5kcGFyZW50LlxuICBjb25zdCByZXBvUm9vdERpclBhdGggPSBjb25maWcuaXNSb290ID8gY29uZmlnLmRpclBhdGggOiBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICcuLicsICcuLicpO1xuICBjb25zdCBsb2NhbEVudHJ5ID0gcGF0aC5yZXNvbHZlKHJlcG9Sb290RGlyUGF0aCwgJ3BhY2thZ2VzJywgY29uZmlnUGFja2FnZURpciwgJ2NvbmZpZy5tanMnKTtcbiAgY29uc3QgcmVsYXRpdmVQYXRoID0gcGF0aC5yZWxhdGl2ZShjb25maWcuZGlyUGF0aCwgbG9jYWxFbnRyeSk7XG4gIHJldHVybiByZWxhdGl2ZVBhdGguc3RhcnRzV2l0aCgnLicpID8gcmVsYXRpdmVQYXRoIDogYC4vJHtyZWxhdGl2ZVBhdGh9YDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzUHVibGlzaGVkV2lsbGJvb3N0ZXJDb25maWdzUGFja2FnZShjb25maWc6IFBhY2thZ2VDb25maWcpOiBib29sZWFuIHtcbiAgcmV0dXJuIChcbiAgICBjb25maWcuaXNXaWxsQm9vc3RlckNvbmZpZ3MgJiZcbiAgICAhY29uZmlnLmlzUm9vdCAmJlxuICAgIGNvbmZpZy5wYWNrYWdlSnNvbj8ucHJpdmF0ZSAhPT0gdHJ1ZSAmJlxuICAgIEFycmF5LmlzQXJyYXkoY29uZmlnLnBhY2thZ2VKc29uPy5maWxlcykgJiZcbiAgICBjb25maWcucGFja2FnZUpzb24uZmlsZXMubGVuZ3RoID4gMFxuICApO1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHsgZXNjYXBlUmVnRXhwLCBxdW90ZUZvclNoZWxsIH0gZnJvbSAnQHdpbGxib29zdGVyL3NoYXJlZC1saWIvc3JjJztcbmltcG9ydCB7IGdsb2JJZ25vcmUgfSBmcm9tICdAd2lsbGJvb3N0ZXIvc2hhcmVkLWxpYi1ub2RlL3NyYyc7XG5pbXBvcnQgbWVyZ2UgZnJvbSAnZGVlcG1lcmdlJztcbmltcG9ydCBmZyBmcm9tICdmYXN0LWdsb2InO1xuaW1wb3J0IHNlbXZlciBmcm9tICdzZW12ZXInO1xuaW1wb3J0IHsgc29ydFBhY2thZ2VKc29uIH0gZnJvbSAnc29ydC1wYWNrYWdlLWpzb24nO1xuaW1wb3J0ICogYXMgYXN0IGZyb20gJ3R5cGVzY3JpcHQvdW5zdGFibGUvYXN0JztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUpzb24sIFNldFJlcXVpcmVkIH0gZnJvbSAndHlwZS1mZXN0JztcblxuaW1wb3J0IHsgZ2V0TGF0ZXN0Q29tbWl0SGFzaCB9IGZyb20gJy4uL2dpdGh1Yi9jb21taXQuanMnO1xuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB7IGdlbmVyYXRlc1dvcmtlclR5cGVzLCBnZXRXb3JrZXJUeXBlc1NjcmlwdEVycm9yLCB0eXBlIFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGNsYXNzaWZ5U2NyaXB0U2VnbWVudCwgc3BsaXRTY3JpcHRTZWdtZW50cyB9IGZyb20gJy4uL3V0aWxzL21hbmFnZWRTY3JpcHRTZWdtZW50LmpzJztcbmltcG9ydCB7IGZzVXRpbCB9IGZyb20gJy4uL3V0aWxzL2ZzVXRpbC5qcyc7XG5pbXBvcnQgeyBnaXRIdWJVdGlsIH0gZnJvbSAnLi4vdXRpbHMvZ2l0aHViVXRpbC5qcyc7XG5pbXBvcnQgeyBjb21iaW5lTWVyZ2UgfSBmcm9tICcuLi91dGlscy9tZXJnZVV0aWwuanMnO1xuaW1wb3J0IHsgZG9lc0NvbnRhaW5KYXZhLCBkb2VzQ29udGFpbkpzT3JUcyB9IGZyb20gJy4uL3V0aWxzL3BhY2thZ2VDYXBhYmlsaXRpZXMuanMnO1xuaW1wb3J0IHsgcHJvbWlzZVBvb2wgfSBmcm9tICcuLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5pbXBvcnQgeyBzcGF3blN5bmMsIHNwYXduU3luY0FuZFJldHVyblN0ZG91dCB9IGZyb20gJy4uL3V0aWxzL3NwYXduVXRpbC5qcyc7XG5pbXBvcnQgeyBnZXRUc2NvbmZpZ0Jhc2VEZXBlbmRlbmNpZXMsIG1hbmFnZWRUc2NvbmZpZ0Jhc2VEZXBlbmRlbmNpZXMgfSBmcm9tICcuLi91dGlscy90c2NvbmZpZ0Jhc2UuanMnO1xuaW1wb3J0IHsgcGFyc2VTb3VyY2VGaWxlIH0gZnJvbSAnLi4vdXRpbHMvdHlwZXNjcmlwdEFwaS5qcyc7XG5pbXBvcnQgeyBpc1B1Ymxpc2hlZFdpbGxib29zdGVyQ29uZmlnc1BhY2thZ2UgfSBmcm9tICcuLi91dGlscy93aWxsYm9vc3RlckNvbmZpZ3NVdGlsLmpzJztcbmltcG9ydCB7XG4gIGdldERlY2xhcmVkV29ya3NwYWNlUGF0dGVybnMsXG4gIGdldFdvcmtzcGFjZVBhY2thZ2VKc29uUGF0aHMsXG4gIGhhc0RlY2xhcmVkUGFja2FnZXNTdGFyUGF0dGVybixcbiAgaGFzSW1wbGljaXRXb3Jrc3BhY2VCYXNlbGluZSxcbn0gZnJvbSAnLi4vdXRpbHMvd29ya3NwYWNlVXRpbC5qcyc7XG5pbXBvcnQgeyBidW5NaW5pbXVtUmVsZWFzZUFnZUV4Y2x1ZGVzLCBidW5NaW5pbXVtUmVsZWFzZUFnZVNlY29uZHMgfSBmcm9tICcuL2J1bmZpZy5qcyc7XG5cbmNvbnN0IG94bGludERlcHMgPSBbJ0B3aWxsYm9vc3Rlci9veGZtdC1jb25maWcnLCAnQHdpbGxib29zdGVyL294bGludC1jb25maWcnLCAnb3hmbXQnLCAnb3hsaW50JywgJ294bGludC10c2dvbGludCddO1xuY29uc3QgdHlwZXNjcmlwdERlcGVuZGVuY3kgPSAndHlwZXNjcmlwdCc7XG4vLyBUeXBlU2NyaXB0IDcncyBgdHlwZXNjcmlwdGAgcGFja2FnZSBpcyB0aGUgdHNnbyBuYXRpdmUgY29tcGlsZXIgYW5kIGV4cG9zZXMgbm9cbi8vIHByb2dyYW1tYXRpYyBBUEkuIE5leHQuanMncyBidWlsZC10aW1lIGB2ZXJpZnlUeXBlU2NyaXB0U2V0dXBgIG5lZWRzIHRoYXQgQVBJLCBzb1xuLy8gYG5leHQgYnVpbGRgIGZhaWxzIChcInRyeWluZyB0byB1c2UgVHlwZVNjcmlwdCBidXQgZG8gbm90IGhhdmUgdGhlIHJlcXVpcmVkIHBhY2thZ2UocylcIilcbi8vIHdpdGggb25seSBgdHlwZXNjcmlwdGAgdjcgaW5zdGFsbGVkLiBOZXh0LmpzIHJlc29sdmVzIHRoZSB0c2dvIGJpbmFyeSB0aHJvdWdoIHRoZVxuLy8gc2VwYXJhdGUgYEB0eXBlc2NyaXB0L25hdGl2ZS1wcmV2aWV3YCBwYWNrYWdlLCBzbyBOZXh0LmpzLWZhbWlseSByZXBvcyBtdXN0IGluc3RhbGxcbi8vIGJvdGg7IG90aGVyIHJlcG9zIG9ubHkgbmVlZCBgdHlwZXNjcmlwdGAgZm9yIGB0c2NgIHR5cGVjaGVja3MuXG5jb25zdCB0eXBlc2NyaXB0R29EZXBlbmRlbmN5ID0gJ0B0eXBlc2NyaXB0L25hdGl2ZS1wcmV2aWV3JztcbmNvbnN0IHdiRGVwZW5kZW5jeSA9ICdAd2lsbGJvb3N0ZXIvd2InO1xuY29uc3QgYnVpbGRUc0RlcGVuZGVuY3kgPSAnYnVpbGQtdHMnO1xuY29uc3QgbGVmdGhvb2tEZXBlbmRlbmN5ID0gJ2xlZnRob29rJztcbmNvbnN0IG1hbmFnZWREZXBlbmRlbmN5TmFtZXMgPSBuZXcgU2V0KFtcbiAgd2JEZXBlbmRlbmN5LFxuICBidWlsZFRzRGVwZW5kZW5jeSxcbiAgbGVmdGhvb2tEZXBlbmRlbmN5LFxuICB0eXBlc2NyaXB0RGVwZW5kZW5jeSxcbiAgdHlwZXNjcmlwdEdvRGVwZW5kZW5jeSxcbiAgJ3NvcnQtcGFja2FnZS1qc29uJyxcbiAgLy8gTWl4ZWQgQHR5cGVzL2J1biB2ZXJzaW9ucyBhY3Jvc3MgYSBtb25vcmVwbyBsb2FkIHR3byBidW4tdHlwZXMgY29waWVzLCB3aGljaFxuICAvLyBicmVha3MgZ2xvYmFsIGludGVyZmFjZSBtZXJnaW5nIChlLmcuIFJlc3BvbnNlL0hlYWRlcnMpIGR1cmluZyB0eXBlIGNoZWNraW5nLlxuICAnQHR5cGVzL2J1bicsXG4gIC4uLm94bGludERlcHMsXG5dKTtcbmNvbnN0IGxhdGVzdERlcGVuZGVuY3lWZXJzaW9uQ2FjaGUgPSBuZXcgTWFwPHN0cmluZywgc3RyaW5nPigpO1xuY29uc3QgcGFja2FnZUFnZUdhdGVNcyA9IGJ1bk1pbmltdW1SZWxlYXNlQWdlU2Vjb25kcyAqIDEwMDA7XG5jb25zdCBucG1QYWNrYWdlVGltZXNDYWNoZSA9IG5ldyBNYXA8c3RyaW5nLCBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+PigpO1xuY29uc3QgZGVwZW5kZW5jeVNlY3Rpb25LZXlzID0gWydkZXBlbmRlbmNpZXMnLCAnZGV2RGVwZW5kZW5jaWVzJywgJ29wdGlvbmFsRGVwZW5kZW5jaWVzJywgJ3BlZXJEZXBlbmRlbmNpZXMnXSBhcyBjb25zdDtcblxudHlwZSBXcml0YWJsZVBhY2thZ2VKc29uID0gU2V0UmVxdWlyZWQ8XG4gIFBhY2thZ2VKc29uLFxuICAnc2NyaXB0cycgfCAnZGVwZW5kZW5jaWVzJyB8ICdkZXZEZXBlbmRlbmNpZXMnIHwgJ3BlZXJEZXBlbmRlbmNpZXMnXG4+O1xuXG5pbnRlcmZhY2UgRGVwZW5kZW5jeVVwZGF0ZXMge1xuICBkZXBlbmRlbmNpZXM6IHN0cmluZ1tdO1xuICBkZXZEZXBlbmRlbmNpZXM6IHN0cmluZ1tdO1xuICBweXRob25EZXZEZXBlbmRlbmNpZXM6IHN0cmluZ1tdO1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVQYWNrYWdlSnNvbihcbiAgY29uZmlnOiBQYWNrYWdlQ29uZmlnLFxuICByb290Q29uZmlnOiBQYWNrYWdlQ29uZmlnLFxuICBza2lwQWRkaW5nRGVwczogYm9vbGVhblxuKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZ2VuZXJhdGVQYWNrYWdlSnNvbicsIGFzeW5jICgpID0+IHtcbiAgICBhd2FpdCBjb3JlKGNvbmZpZywgcm9vdENvbmZpZywgc2tpcEFkZGluZ0RlcHMpO1xuICB9KTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gY29yZShjb25maWc6IFBhY2thZ2VDb25maWcsIHJvb3RDb25maWc6IFBhY2thZ2VDb25maWcsIHNraXBBZGRpbmdEZXBzOiBib29sZWFuKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IHdvcmtlclR5cGVzU2NyaXB0RXJyb3IgPSBnZXRXb3JrZXJUeXBlc1NjcmlwdEVycm9yKGNvbmZpZyk7XG4gIGlmICh3b3JrZXJUeXBlc1NjcmlwdEVycm9yKSB0aHJvdyBuZXcgRXJyb3Iod29ya2VyVHlwZXNTY3JpcHRFcnJvcik7XG4gIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAncGFja2FnZS5qc29uJyk7XG4gIGNvbnN0IGpzb25PYmogPSBhd2FpdCByZWFkUGFja2FnZUpzb24oZmlsZVBhdGgpO1xuICB1cGRhdGVTY3JpcHRzKGNvbmZpZywganNvbk9iaik7XG4gIGF3YWl0IGVuc3VyZVRydXN0ZWREZXBlbmRlbmNpZXMoY29uZmlnLCBqc29uT2JqKTtcbiAgbW92ZU1hbmFnZWRUb29sRGVwZW5kZW5jaWVzVG9EZXZEZXBlbmRlbmNpZXMoanNvbk9iaik7XG4gIHBydW5lQ2FwYWJpbGl0eURlcGVuZGVudENvbXBpbGVyRGVwZW5kZW5jaWVzKGNvbmZpZywganNvbk9iaik7XG4gIGNvbnN0IGRlcGVuZGVuY3lVcGRhdGVzID0gYXdhaXQgYXBwbHlQYWNrYWdlSnNvbkNvbnZlbnRpb25zKGNvbmZpZywgcm9vdENvbmZpZywganNvbk9iaik7XG4gIGF3YWl0IG5vcm1hbGl6ZVBhY2thZ2VNZXRhZGF0YShjb25maWcsIHJvb3RDb25maWcsIGpzb25PYmosIGRlcGVuZGVuY3lVcGRhdGVzKTtcbiAgLy8gT24gYSBmaXJzdCBydW4gdGhlcmUgaXMgbm8gbWFuaWZlc3QgZm9yIGBidW4gYWRkYCB0byB1cGRhdGUgcmVsaWFibHkuIFdyaXRlIHRoZSByZXNvbHZlZFxuICAvLyBkZXBlbmRlbmN5IHZlcnNpb25zIGludG8gdGhlIG5ldyBtYW5pZmVzdCBkaXJlY3RseTsgdGhlIGZpbmFsIHJlcG9zaXRvcnktd2lkZSBgYnVuIGluc3RhbGxgXG4gIC8vIHRoZW4gaW5zdGFsbHMgdGhlbSBhbmQgcmVtYWlucyB0aGUgYXV0aG9yaXRhdGl2ZSBmYWlsdXJlIGNoZWNrLlxuICBhZGREZXBlbmRlbmN5VmVyc2lvbnNUb1BhY2thZ2VKc29uKFxuICAgIGNvbmZpZyxcbiAgICByb290Q29uZmlnLFxuICAgIGpzb25PYmosXG4gICAgZGVwZW5kZW5jeVVwZGF0ZXMsXG4gICAgc2tpcEFkZGluZ0RlcHMgfHwgIWNvbmZpZy5kb2VzQ29udGFpblBhY2thZ2VKc29uXG4gICk7XG4gIGF3YWl0IHVwZGF0ZVByaXZhdGVQYWNrYWdlcyhqc29uT2JqKTtcbiAgcmVtb3ZlRW1wdHlEZXBlbmRlbmN5U2VjdGlvbnMoanNvbk9iaik7XG5cbiAgZGVsZXRlIGpzb25PYmoucGFja2FnZU1hbmFnZXI7XG4gIC8vIFlhcm4gcmVhZHMgcGFja2FnZS5qc29uIGZyb20gZGlzayBiZWZvcmUgZGVjaWRpbmcgd2hldGhlciBgeWFybiBhZGQgLURgXG4gIC8vIGNvbmZsaWN0cyB3aXRoIGFuIGV4aXN0aW5nIHJlZ3VsYXIgZGVwZW5kZW5jeSwgc28gdGhpcyB3cml0ZSBtdXN0IGZpbmlzaFxuICAvLyBiZWZvcmUgaW5zdGFsbGluZyB0aGUgbWFuYWdlZCBkZXBlbmRlbmN5IHVwZGF0ZXMgYmVsb3cuIEtlZXAgdGhpcyBnZW5lcmF0ZWRcbiAgLy8gZmlsZSBzb3J0ZWQgZXZlbiB3aGVuIHdlIGxhdGVyIHJ1biB0aGUgdGFyZ2V0IHJlcG9zaXRvcnkncyBmb3JtYXR0ZXIgc28gYVxuICAvLyBtaWQtcnVuIGludGVycnVwdGlvbiBuZXZlciBsZWF2ZXMgcGFja2FnZS5qc29uIGluIGEgcGFydGlhbGx5IG1hbmFnZWQgb3JkZXIuXG4gIC8vIEEgcmVmdXNlZCB3cml0ZSAoZS5nLiBhIHN5bWxpbmtlZCBwYWNrYWdlLmpzb24pIG11c3QgYWxzbyBhYm9ydCB0aGUgZGVwZW5kZW5jeSBpbnN0YWxsYXRpb25cbiAgLy8gYmVsb3c6IGBidW4gYWRkYCBmb2xsb3dzIHRoZSBzeW1saW5rIGFuZCB3b3VsZCBtb2RpZnkgdGhlIGZpbGUgb3V0c2lkZSB0aGUgcmVwb3NpdG9yeS5cbiAgaWYgKCEoYXdhaXQgZnNVdGlsLmdlbmVyYXRlRmlsZShmaWxlUGF0aCwgc2VyaWFsaXplUGFja2FnZUpzb24oanNvbk9iaikpKSkgcmV0dXJuO1xuXG4gIGlmICghc2tpcEFkZGluZ0RlcHMpIHtcbiAgICBpbnN0YWxsRGVwZW5kZW5jeVVwZGF0ZXMoY29uZmlnLCByb290Q29uZmlnLCBqc29uT2JqLCBkZXBlbmRlbmN5VXBkYXRlcyk7XG4gICAgLy8gQSBuZXdseSBjcmVhdGVkIG1hbmlmZXN0IGlzIGFscmVhZHkgc29ydGVkIGJ5IHdiZnkncyBidW5kbGVkIHNlcmlhbGl6ZXI7IHRoZSB0YXJnZXQgZm9ybWF0dGVyXG4gICAgLy8gaXMgYXZhaWxhYmxlIHdpdGhvdXQgYW4gZXh0cmEgZmV0Y2ggb25seSB3aGVuIHRoaXMgcnVuIHN0YXJ0ZWQgd2l0aCBwYWNrYWdlLmpzb24uXG4gICAgaWYgKGNvbmZpZy5kb2VzQ29udGFpblBhY2thZ2VKc29uKSB7XG4gICAgICBmb3JtYXRQYWNrYWdlSnNvbldpdGhQcm9qZWN0Rm9ybWF0dGVyKGNvbmZpZywgZmlsZVBhdGgpO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBzZXJpYWxpemVQYWNrYWdlSnNvbihqc29uT2JqOiBXcml0YWJsZVBhY2thZ2VKc29uKTogc3RyaW5nIHtcbiAgLy8gZnNVdGlsLmdlbmVyYXRlRmlsZSgpIG5vcm1hbGl6ZXMgdGhlIHRyYWlsaW5nIG5ld2xpbmUsIHNvIGtlZXAgdGhlIHNlcmlhbGl6ZXJcbiAgLy8gZm9jdXNlZCBvbiB0aGUgSlNPTiBwYXlsb2FkIGl0c2VsZi5cbiAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KHNvcnRQYWNrYWdlSnNvbihqc29uT2JqKSwgdW5kZWZpbmVkLCAyKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gcmVhZFBhY2thZ2VKc29uKGZpbGVQYXRoOiBzdHJpbmcpOiBQcm9taXNlPFdyaXRhYmxlUGFja2FnZUpzb24+IHtcbiAgbGV0IGpzb25PYmo6IFBhY2thZ2VKc29uID0ge307XG4gIHRyeSB7XG4gICAgY29uc3QganNvblRleHQgPSBhd2FpdCBmcy5wcm9taXNlcy5yZWFkRmlsZShmaWxlUGF0aCwgJ3V0ZjgnKTtcbiAgICBqc29uT2JqID0gSlNPTi5wYXJzZShqc29uVGV4dCkgYXMgUGFja2FnZUpzb247XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgLy8gRG9jdW1lbnRhdGlvbi1vbmx5IHJlcG9zaXRvcmllcyBoYXZlIG5vIG1hbmlmZXN0IG9uIHRoZWlyIGZpcnN0IHdiZnkgcnVuLiBTdGFydGluZyBmcm9tIGFuXG4gICAgLy8gZW1wdHkgb2JqZWN0IGxldHMgdGhlIG5vcm1hbCBnZW5lcmF0b3IgZXN0YWJsaXNoIHRoZSBzYW1lIG1hbmFnZWQgYmFzZWxpbmUgYXMgZXZlcnkgb3RoZXJcbiAgICAvLyByZXBvc2l0b3J5OyBtYWxmb3JtZWQgb3IgdW5yZWFkYWJsZSBleGlzdGluZyBtYW5pZmVzdHMgbXVzdCBzdGlsbCBmYWlsIGxvdWRseS5cbiAgICBpZiAoKGVycm9yIGFzIE5vZGVKUy5FcnJub0V4Y2VwdGlvbikuY29kZSAhPT0gJ0VOT0VOVCcpIHRocm93IGVycm9yO1xuICB9XG4gIGpzb25PYmouc2NyaXB0cyA9IGpzb25PYmouc2NyaXB0cyA/PyB7fTtcbiAganNvbk9iai5kZXBlbmRlbmNpZXMgPSBqc29uT2JqLmRlcGVuZGVuY2llcyA/PyB7fTtcbiAganNvbk9iai5kZXZEZXBlbmRlbmNpZXMgPSBqc29uT2JqLmRldkRlcGVuZGVuY2llcyA/PyB7fTtcbiAganNvbk9iai5wZWVyRGVwZW5kZW5jaWVzID0ganNvbk9iai5wZWVyRGVwZW5kZW5jaWVzID8/IHt9O1xuICByZXR1cm4ganNvbk9iaiBhcyBXcml0YWJsZVBhY2thZ2VKc29uO1xufVxuXG5mdW5jdGlvbiBwcnVuZUNhcGFiaWxpdHlEZXBlbmRlbnRDb21waWxlckRlcGVuZGVuY2llcyhjb25maWc6IFBhY2thZ2VDb25maWcsIGpzb25PYmo6IFdyaXRhYmxlUGFja2FnZUpzb24pOiB2b2lkIHtcbiAgLy8gUnVuIGJlZm9yZSBhcHBseVBhY2thZ2VKc29uQ29udmVudGlvbnMsIHdoaWNoIHJlLWFkZHMgdHNnbyBvbmx5IGZvciBjdXJyZW50IE5leHQuanMtZmFtaWx5IHJlcG9zaXRvcmllcy5cbiAgZGVsZXRlIGpzb25PYmouZGVwZW5kZW5jaWVzW3R5cGVzY3JpcHRHb0RlcGVuZGVuY3ldO1xuICBkZWxldGUganNvbk9iai5kZXZEZXBlbmRlbmNpZXNbdHlwZXNjcmlwdEdvRGVwZW5kZW5jeV07XG4gIGlmICghY29uZmlnLmRvZXNDb250YWluVHlwZVNjcmlwdCAmJiAhY29uZmlnLmRvZXNDb250YWluVHlwZVNjcmlwdEluUGFja2FnZXMpIHtcbiAgICBkZWxldGUganNvbk9iai5kZXBlbmRlbmNpZXNbdHlwZXNjcmlwdERlcGVuZGVuY3ldO1xuICAgIGRlbGV0ZSBqc29uT2JqLmRldkRlcGVuZGVuY2llc1t0eXBlc2NyaXB0RGVwZW5kZW5jeV07XG4gIH1cbn1cblxuZnVuY3Rpb24gdXBkYXRlU2NyaXB0cyhjb25maWc6IFBhY2thZ2VDb25maWcsIGpzb25PYmo6IFdyaXRhYmxlUGFja2FnZUpzb24pOiB2b2lkIHtcbiAganNvbk9iai5zY3JpcHRzID0geyAuLi5qc29uT2JqLnNjcmlwdHMsIC4uLmdlbmVyYXRlU2NyaXB0cyhjb25maWcsIGpzb25PYmouc2NyaXB0cykgfTtcbn1cblxuLyoqXG4gKiBLZWVwcyB0aGUgcHJvamVjdCdzIG93biBzZWdtZW50cyBpbiBvcmRlciwgcmVwbGFjaW5nIHRoZSBmaXJzdCBtYW5hZ2VkIGdlbi1jb2RlIHNwZWxsaW5nIHdpdGhcbiAqIGBidW4gd2IgZ2VuLWNvZGVgIGFuZCBkcm9wcGluZyBsYXRlciBkdXBsaWNhdGVzLiBBcHBlbmRzIGdlbmVyYXRpb24gb25seSB3aGVuIHRoZSBzY3JpcHRcbiAqIGNvbnRhaW5lZCBub25lLCBzbyBub3RoaW5nIGlzIHJlb3JkZXJlZC5cbiAqL1xuZnVuY3Rpb24gcmVidWlsZFBvc3RpbnN0YWxsU2VnbWVudHMoc2VnbWVudHM6IHN0cmluZ1tdLCBzY3JpcHRzOiBQYWNrYWdlSnNvbi5TY3JpcHRzKTogc3RyaW5nW10ge1xuICBjb25zdCBraW5kcyA9IHNlZ21lbnRzLm1hcCgoc2VnbWVudCkgPT4gY2xhc3NpZnlTY3JpcHRTZWdtZW50KHNlZ21lbnQsIHNjcmlwdHMsIHRydWUpKTtcbiAgLy8gQSB3cmFwcGVyIGFyb3VuZCBhIGN1c3RvbWl6ZWQgZ2VuLWNvZGUgYWxyZWFkeSBnZW5lcmF0ZXM7IGFkZGluZyBhbm90aGVyIGludm9jYXRpb24gd291bGQgcnVuIGV2ZXJ5XG4gIC8vIGdlbmVyYXRvciB0d2ljZS5cbiAgbGV0IGdlbmVyYXRpb25QbGFjZWQgPSBraW5kcy5pbmNsdWRlcygnZ2VuQ29kZVdyYXBwZXInKTtcbiAgY29uc3QgcmVzdWx0OiBzdHJpbmdbXSA9IFtdO1xuICBmb3IgKGNvbnN0IFtpbmRleCwgc2VnbWVudF0gb2Ygc2VnbWVudHMuZW50cmllcygpKSB7XG4gICAgY29uc3Qga2luZCA9IGtpbmRzW2luZGV4XTtcbiAgICBpZiAoa2luZCA9PT0gJ2N1c3RvbScgfHwga2luZCA9PT0gJ2dlbkNvZGVXcmFwcGVyJykge1xuICAgICAgcmVzdWx0LnB1c2goc2VnbWVudCk7XG4gICAgfSBlbHNlIGlmICghZ2VuZXJhdGlvblBsYWNlZCkge1xuICAgICAgcmVzdWx0LnB1c2goJ2J1biB3YiBnZW4tY29kZScpO1xuICAgICAgZ2VuZXJhdGlvblBsYWNlZCA9IHRydWU7XG4gICAgfVxuICB9XG4gIGlmICghZ2VuZXJhdGlvblBsYWNlZCkgcmVzdWx0LnB1c2goJ2J1biB3YiBnZW4tY29kZScpO1xuICByZXR1cm4gcmVzdWx0O1xufVxuXG4vKipcbiAqIE5vcm1hbGl6ZXMgbWFuYWdlZCBnZW4tY29kZSBzZWdtZW50cyB3aGlsZSBrZWVwaW5nIHRoZSBmaXJzdCBzZWdtZW50J3MgcG9zaXRpb24gc28gYSBjdXN0b21cbiAqIHN0ZXAgdGhhdCBjb25zdW1lcyBnZW5lcmF0ZWQgb3V0cHV0IHN0aWxsIHJ1bnMgYWZ0ZXIgaXQuIFJldHVybnMgd2l0aG91dCBjaGFuZ2luZyBhblxuICogdW5wYXJzZWFibGUgc2NyaXB0LlxuICovXG5mdW5jdGlvbiB1cGRhdGVQb3N0aW5zdGFsbFNjcmlwdChzY3JpcHRzOiBQYWNrYWdlSnNvbi5TY3JpcHRzLCBtYW5hZ2VzV29ya2VyVHlwZXM6IGJvb2xlYW4pOiB2b2lkIHtcbiAgLy8gYGJ1biB3YiBnZW4tY29kZWAgcmVnZW5lcmF0ZXMgd29ya2VyLWNvbmZpZ3VyYXRpb24uZC50cyBpdHNlbGYsIHNvIGEgcGFja2FnZSB3aXRoIGFcbiAgLy8gY29kZS1nZW5lcmF0aW9uIG9yIHdvcmtlci10eXBlcyBwaXBlbGluZSBnZXRzIG9uZSBtYW5hZ2VkIGdlbmVyYXRpb24gc2VnbWVudC5cbiAgaWYgKHNjcmlwdHNbJ2dlbi1jb2RlJ10gfHwgbWFuYWdlc1dvcmtlclR5cGVzKSB7XG4gICAgLy8gUHJvamVjdC1vd25lZCBzdGVwcyBhcmUgbmV2ZXIgZHJvcHBlZCwgYW5kIHRoZWlyIFBPU0lUSU9OIHJlbGF0aXZlIHRvIGdlbmVyYXRpb24gaXMgcHJlc2VydmVkOiBhIHN0ZXBcbiAgICAvLyBiZWZvcmUgaXQgbWF5IHByb2R1Y2UgYHdyYW5nbGVyIHR5cGVzYCcgaW5wdXRzIChhIHdyYW5nbGVyIGNvbmZpZywgYC5kZXYudmFyc2ApLCB3aGlsZSBvbmUgYWZ0ZXIgaXQgbWF5XG4gICAgLy8gY29uc3VtZSB0aGUgZ2VuZXJhdGVkIHR5cGVzLiBTbyB0aGUgbWFuYWdlZCBnZW5lcmF0aW9uIHJlcGxhY2VzIHRoZSBmaXJzdCBtYW5hZ2VkIHNlZ21lbnQgaW4gcGxhY2UsIGFuZCBpc1xuICAgIC8vIGFwcGVuZGVkIG9ubHkgd2hlbiB0aGUgc2NyaXB0IGhhZCBub25lLiBBIHdyYXBwZXIgYXJvdW5kIGEgY3VzdG9taXplZCBnZW4tY29kZSBhbHJlYWR5IHBlcmZvcm1zIHRoZVxuICAgIC8vIGdlbmVyYXRpb24gcGx1cyB0aGUgcHJvamVjdCdzIG93biBzdGVwcywgc28gaXQgc3VwcHJlc3NlcyB0aGUgcmVwbGFjZW1lbnQgZW50aXJlbHkuXG4gICAgY29uc3Qgc2VnbWVudHMgPSBzY3JpcHRzLnBvc3RpbnN0YWxsID09PSB1bmRlZmluZWQgPyBbXSA6IHNwbGl0U2NyaXB0U2VnbWVudHMoc2NyaXB0cy5wb3N0aW5zdGFsbCk7XG4gICAgY29uc3Qga2VwdFNlZ21lbnRzID0gc2VnbWVudHMgJiYgcmVidWlsZFBvc3RpbnN0YWxsU2VnbWVudHMoc2VnbWVudHMsIHNjcmlwdHMpO1xuICAgIGlmIChrZXB0U2VnbWVudHMpIHtcbiAgICAgIHNjcmlwdHMucG9zdGluc3RhbGwgPSBrZXB0U2VnbWVudHMuam9pbignICYmICcpO1xuICAgIH1cbiAgICAvLyBBbnkgb3RoZXIgdW5wYXJzZWFibGUgcG9zdGluc3RhbGwgaXMgbGVmdCB0byBhIGh1bWFuIHJhdGhlciB0aGFuIHJld3JpdHRlbiBmcm9tIGEgd3JvbmcgcGFyc2UuXG4gIH1cbn1cblxuYXN5bmMgZnVuY3Rpb24gYXBwbHlQYWNrYWdlSnNvbkNvbnZlbnRpb25zKFxuICBjb25maWc6IFBhY2thZ2VDb25maWcsXG4gIHJvb3RDb25maWc6IFBhY2thZ2VDb25maWcsXG4gIGpzb25PYmo6IFdyaXRhYmxlUGFja2FnZUpzb25cbik6IFByb21pc2U8RGVwZW5kZW5jeVVwZGF0ZXM+IHtcbiAgY29uc3QgZGVwZW5kZW5jaWVzOiBzdHJpbmdbXSA9IFtdO1xuICBjb25zdCBkZXZEZXBlbmRlbmNpZXMgPSBbJ3NvcnQtcGFja2FnZS1qc29uJ107XG4gIGNvbnN0IHB5dGhvbkRldkRlcGVuZGVuY2llczogc3RyaW5nW10gPSBbXTtcbiAgY29uc3QgaGFzSmF2YSA9IGRvZXNDb250YWluSmF2YShjb25maWcpO1xuXG4gIGlmIChcbiAgICBoYXNKYXZhICYmXG4gICAgIWZzLmV4aXN0c1N5bmMocGF0aC5qb2luKHJvb3RDb25maWcuZGlyUGF0aCwgJy5wcmV0dGllcnJjLmpzb24nKSkgJiZcbiAgICAhZnMuZXhpc3RzU3luYyhwYXRoLmpvaW4oY29uZmlnLmRpclBhdGgsICcucHJldHRpZXJyYy5qc29uJykpXG4gICkge1xuICAgIGpzb25PYmoucHJldHRpZXIgPSAnQHdpbGxib29zdGVyL3ByZXR0aWVyLWNvbmZpZyc7XG4gICAgZGV2RGVwZW5kZW5jaWVzLnB1c2goJ3ByZXR0aWVyLXBsdWdpbi1qYXZhJywgJ0B3aWxsYm9vc3Rlci9wcmV0dGllci1jb25maWcnKTtcbiAgfVxuICBpZiAoaGFzSmF2YSkge1xuICAgIGRldkRlcGVuZGVuY2llcy5wdXNoKCdwcmV0dGllcicpO1xuICB9XG5cbiAgaWYgKGNvbmZpZy5pc1Jvb3QpIHtcbiAgICAvLyBMZWZ0aG9vayBnZW5lcmF0aW9uIGlzIGJlc3QtZWZmb3J0IGFuZCAubGVmdGhvb2sgaXMgYWJzZW50IGZyb20gRG9ja2VyIGJ1aWxkIGNvbnRleHRzLCBzbyBhXG4gICAgLy8gbWlzc2luZyBub3JtYWxpemVyIGlzIHZhbGlkLiBPbmNlIHByZXNlbnQsIGl0cyBmYWlsdXJlIG11c3QgYWJvcnQgaW5zdGFsbCByYXRoZXIgdGhhbiBsZWF2ZSBhXG4gICAgLy8gR3VhcmQtcGlubmVkIGxvY2tmaWxlIGJlaGluZDsga2VlcCB0aGF0IGZhaWwtZmFzdCBncm91cGluZyBleHBsaWNpdCBiZWZvcmUgYW55IHdvcmtzcGFjZSBidWlsZC5cbiAgICBqc29uT2JqLnNjcmlwdHMucHJlcGFyZSA9XG4gICAgICAnKGJ1biBsZWZ0aG9vayBpbnN0YWxsIHx8IHRydWUpICYmICh0ZXN0ICEgLWYgLmxlZnRob29rL25vcm1hbGl6ZS1idW4tbG9ja2ZpbGUuc2ggfHwgYmFzaCAubGVmdGhvb2svbm9ybWFsaXplLWJ1bi1sb2NrZmlsZS5zaCknO1xuICAgIC8vIFdoZW4gQHdpbGxib29zdGVyL3diIGlzIGEgd29ya3NwYWNlIG9mIHRoaXMgcmVwb3NpdG9yeSwgdGhlIGdlbmVyYXRlZCBgYnVuIHdiIOKApmAgc2NyaXB0cyBydW5cbiAgICAvLyBpdHMgZ2l0aWdub3JlZCBkaXN0IGJ1aWxkIChiaW4vaW5kZXguanMgaW1wb3J0cyAuLi9kaXN0L2luZGV4LmpzKSwgc28gYSBmcmVzaCBjaGVja291dCBtdXN0XG4gICAgLy8gYnVpbGQgaXQgZHVyaW5nIGluc3RhbGw7IHJlZ2lzdHJ5IGluc3RhbGxzIHNoaXAgYSBwcmVidWlsdCBkaXN0IGFuZCBuZWVkIG5vIGV4dHJhIHN0ZXAuXG4gICAgY29uc3Qgd2JXb3Jrc3BhY2VEaXIgPSBnZXRXb3Jrc3BhY2VQYWNrYWdlRGlycyhyb290Q29uZmlnKS5nZXQod2JEZXBlbmRlbmN5KTtcbiAgICBpZiAod2JXb3Jrc3BhY2VEaXIpIHtcbiAgICAgIC8vIFF1b3RlZCB1bmxlc3MgdGhlIG5hbWUgY2FycmllcyBubyBzaGVsbCBtZWFuaW5nLCBzbyB0aGF0IGAkKOKApilgIG9yIGEgdmFyaWFibGUgYSBob3N0aWxlXG4gICAgICAvLyBkaXJlY3RvcnkgbmFtZSBjb3VsZCBzbXVnZ2xlIGludG8gdGhlIGdlbmVyYXRlZCBzY3JpcHQgbmV2ZXIgcmVhY2hlcyB0aGUgc2hlbGwgdW5xdW90ZWQuXG4gICAgICBqc29uT2JqLnNjcmlwdHMucHJlcGFyZSArPSBgICYmIGJ1biBydW4gLS1jd2QgJHtxdW90ZUZvclNoZWxsKHdiV29ya3NwYWNlRGlyKX0gYnVpbGRgO1xuICAgIH1cbiAgICBkZXZEZXBlbmRlbmNpZXMucHVzaChsZWZ0aG9va0RlcGVuZGVuY3kpO1xuXG4gICAgaWYgKGNvbmZpZy5kZXBlbmRpbmcuc2VtYW50aWNSZWxlYXNlKSB7XG4gICAgICBpZiAoZG9lc1JlbGVhc2VTY3JpcHRJbnN0YWxsU2VtYW50aWNSZWxlYXNlKGpzb25PYmouc2NyaXB0cy5yZWxlYXNlKSkge1xuICAgICAgICBkZWxldGUganNvbk9iai5kZXZEZXBlbmRlbmNpZXNbJ3NlbWFudGljLXJlbGVhc2UnXTtcbiAgICAgIH0gZWxzZSBpZiAoXG4gICAgICAgICFqc29uT2JqLmRldkRlcGVuZGVuY2llc1snc2VtYW50aWMtcmVsZWFzZSddICYmXG4gICAgICAgICFqc29uT2JqLmRldkRlcGVuZGVuY2llc1snbXVsdGktc2VtYW50aWMtcmVsZWFzZSddICYmXG4gICAgICAgICFqc29uT2JqLmRldkRlcGVuZGVuY2llc1snQHFpd2kvbXVsdGktc2VtYW50aWMtcmVsZWFzZSddXG4gICAgICApIHtcbiAgICAgICAgZGV2RGVwZW5kZW5jaWVzLnB1c2goJ3NlbWFudGljLXJlbGVhc2UnKTtcbiAgICAgIH1cbiAgICAgIGpzb25PYmoudmVyc2lvbiA9ICcwLjAuMC1zZW1hbnRpY2FsbHktcmVsZWFzZWQnO1xuICAgIH1cblxuICAgIGlmIChjb25maWcuZGVwZW5kaW5nLnBsYXl3cmlnaHRUZXN0KSB7XG4gICAgICAvLyBTaW5jZSBhcnRpbGxlcnkgcmVxdWlyZXMgYSBzcGVjaWZpYyB2ZXJzaW9uIG9mIEBwbGF5d3JpZ2h0L3Rlc3RcbiAgICAgIGNvbnN0IGhhc0FydGlsbGVyeSA9IGpzb25PYmouZGVwZW5kZW5jaWVzLmFydGlsbGVyeSB8fCBqc29uT2JqLmRldkRlcGVuZGVuY2llcy5hcnRpbGxlcnk7XG4gICAgICAvLyBTaW5jZSBsbG0tdG9vbGJveCByZXF1aXJlcyBAcGxheXdyaWdodC90ZXN0IGluIGRlcGVuZGVuY2llc1xuICAgICAgaWYgKCFoYXNBcnRpbGxlcnkgJiYgIWpzb25PYmouZGVwZW5kZW5jaWVzWydAcGxheXdyaWdodC90ZXN0J10pIHtcbiAgICAgICAgZGV2RGVwZW5kZW5jaWVzLnB1c2goJ0BwbGF5d3JpZ2h0L3Rlc3QnKTtcbiAgICAgIH1cbiAgICAgIGlmIChjb25maWcuZGVwZW5kaW5nLnBsYXl3cmlnaHRSdW50aW1lKSB7XG4gICAgICAgIC8vIFJ1bnRpbWUgaW1wb3J0cyBuZWVkIHRoZSBzdGFuZGFsb25lIHBhY2thZ2UgYWZ0ZXIgRG9ja2VyIHBydW5pbmcgcmVtb3ZlcyBkZXZEZXBlbmRlbmNpZXMuXG4gICAgICAgIGpzb25PYmouZGVwZW5kZW5jaWVzLnBsYXl3cmlnaHQgPz89XG4gICAgICAgICAganNvbk9iai5kZXZEZXBlbmRlbmNpZXMucGxheXdyaWdodCA/P1xuICAgICAgICAgIGpzb25PYmouZGVwZW5kZW5jaWVzWydAcGxheXdyaWdodC90ZXN0J10gPz9cbiAgICAgICAgICBqc29uT2JqLmRldkRlcGVuZGVuY2llc1snQHBsYXl3cmlnaHQvdGVzdCddO1xuICAgICAgICBkZXBlbmRlbmNpZXMucHVzaCgncGxheXdyaWdodCcpO1xuICAgICAgICBkZWxldGUganNvbk9iai5kZXZEZXBlbmRlbmNpZXMucGxheXdyaWdodDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGRlbGV0ZSBqc29uT2JqLmRlcGVuZGVuY2llcy5wbGF5d3JpZ2h0O1xuICAgICAgICBkZWxldGUganNvbk9iai5kZXZEZXBlbmRlbmNpZXMucGxheXdyaWdodDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoY29uZmlnLmRvZXNDb250YWluU3ViUGFja2FnZUpzb25zKSB7XG4gICAgICAvLyBXZSBkb24ndCBhbGxvdyBub24tYXJyYXkgd29ya3NwYWNlcyBpbiBtb25vcmVwby4gWWFybiB2MSdzIG9iamVjdCBmb3JtIGtlZXBzIGl0c1xuICAgICAgLy8gZGVjbGFyZWQgcGF0dGVybnMgKHdvcmtzcGFjZXMucGFja2FnZXMpOyBvbmx5IGV4dHJhcyBzdWNoIGFzIG5vaG9pc3QgYXJlIGRyb3BwZWQuXG4gICAgICAvLyBGb3JjZSBgcGFja2FnZXMvKmAgb25seSB3aGVuIGl0IGFjdHVhbGx5IG1hdGNoZXMgYSB3b3Jrc3BhY2UgbWFuaWZlc3Q6IGFuIGFwcHMvKi1vbmx5XG4gICAgICAvLyBtb25vcmVwbyBtdXN0IG5vdCBnZXQgYSBuZXZlci1tYXRjaGluZyBwYXR0ZXJuIGFwcGVuZGVkIHRvIGl0cyBkZWNsYXJhdGlvbi4gQVxuICAgICAgLy8gYmFzZWxpbmUtc2VlZGluZyBkZWNsYXJhdGlvbiBuZWVkcyBubyBmb3JjZWQgcGF0dGVybiBhdCBhbGwg4oCUIHRoZSBzZWVkZWQgYmFzZWxpbmVcbiAgICAgIC8vIChgKi8qYCBvciBgKipgKSBhbHJlYWR5IGNvdmVycyBwYWNrYWdlcy8qLiBUaGUgZm9yY2VkIHBhdHRlcm4gaXMgUFJFUEVOREVEOiBCdW5cbiAgICAgIC8vIGV2YWx1YXRlcyB3b3Jrc3BhY2UgcGF0dGVybnMgc2VxdWVudGlhbGx5LCBzbyBhIHBvc2l0aXZlIHBhdHRlcm4gcGxhY2VkIGFmdGVyIGEgdXNlclxuICAgICAgLy8gbmVnYXRpb24gd291bGQgcmUtaW5jbHVkZSB0aGUgbmVnYXRlZCBwYWNrYWdlcy4gQSBkZWNsYXJhdGlvbiB0aGF0IGFscmVhZHkgY292ZXJzXG4gICAgICAvLyBwYWNrYWdlcy8qIHVuZGVyIG5vcm1hbGl6YXRpb24gKGUuZy4gYC4vcGFja2FnZXMvKmApIGlzIGtlcHQgdmVyYmF0aW06IGZvcmNpbmcgYSB0ZXh0dWFsXG4gICAgICAvLyBgcGFja2FnZXMvKmAgbmV4dCB0byBpdCB3b3VsZCBwZXJzaXN0IGEgZHVwbGljYXRlIGVxdWl2YWxlbnQgcGF0dGVybi5cbiAgICAgIGNvbnN0IGZvcmNlZFBhdHRlcm5zID1cbiAgICAgICAgIWhhc0ltcGxpY2l0V29ya3NwYWNlQmFzZWxpbmUoanNvbk9iai53b3Jrc3BhY2VzKSAmJlxuICAgICAgICAhaGFzRGVjbGFyZWRQYWNrYWdlc1N0YXJQYXR0ZXJuKGpzb25PYmoud29ya3NwYWNlcykgJiZcbiAgICAgICAgZmcuZ2xvYlN5bmMoJ3BhY2thZ2VzLyovcGFja2FnZS5qc29uJywgeyBjd2Q6IGNvbmZpZy5kaXJQYXRoLCBpZ25vcmU6IFsnKiovbm9kZV9tb2R1bGVzLyoqJ10gfSkubGVuZ3RoID4gMFxuICAgICAgICAgID8gWydwYWNrYWdlcy8qJ11cbiAgICAgICAgICA6IFtdO1xuICAgICAganNvbk9iai53b3Jrc3BhY2VzID0gbWVyZ2UuYWxsKFtmb3JjZWRQYXR0ZXJucywgZ2V0RGVjbGFyZWRXb3Jrc3BhY2VQYXR0ZXJucyhqc29uT2JqLndvcmtzcGFjZXMpXSwge1xuICAgICAgICBhcnJheU1lcmdlOiBjb21iaW5lTWVyZ2UsXG4gICAgICB9KTtcbiAgICAgIC8vIEJvdGggaW5wdXRzIGNhbiBiZSBlbXB0eSAoZS5nLiBwYWNrYWdlcy9wYWNrYWdlLmpzb24gd2l0aG91dCBhbnkgcGFja2FnZXMvKi9wYWNrYWdlLmpzb25cbiAgICAgIC8vIGFuZCBubyBkZWNsYXJlZCB3b3Jrc3BhY2VzKTsgZG8gbm90IHBlcnNpc3QgYSBtZWFuaW5nbGVzcyBgd29ya3NwYWNlczogW11gLlxuICAgICAgaWYgKEFycmF5LmlzQXJyYXkoanNvbk9iai53b3Jrc3BhY2VzKSAmJiBqc29uT2JqLndvcmtzcGFjZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIGRlbGV0ZSBqc29uT2JqLndvcmtzcGFjZXM7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChBcnJheS5pc0FycmF5KGpzb25PYmoud29ya3NwYWNlcykpIHtcbiAgICAgIGpzb25PYmoud29ya3NwYWNlcyA9IGpzb25PYmoud29ya3NwYWNlcy5maWx0ZXIoXG4gICAgICAgICh3b3Jrc3BhY2UpID0+XG4gICAgICAgICAgZmcuZ2xvYlN5bmMod29ya3NwYWNlLCB7XG4gICAgICAgICAgICBkb3Q6IHRydWUsXG4gICAgICAgICAgICBjd2Q6IGNvbmZpZy5kaXJQYXRoLFxuICAgICAgICAgICAgaWdub3JlOiBnbG9iSWdub3JlLFxuICAgICAgICAgIH0pLmxlbmd0aCA+IDBcbiAgICAgICk7XG4gICAgICBpZiAoanNvbk9iai53b3Jrc3BhY2VzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICBkZWxldGUganNvbk9iai53b3Jrc3BhY2VzO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8vIGZpeGVycy9uZXh0Q29uZmlnLnRzIGVuYWJsZXMgYHJlYWN0Q29tcGlsZXI6IHRydWVgIGZvciBldmVyeSBOZXh0LmpzIHByb2plY3QsIGFuZCBOZXh0LmpzXG4gIC8vIHJlc29sdmVzIGBiYWJlbC1wbHVnaW4tcmVhY3QtY29tcGlsZXJgIGF0IGJ1aWxkIHRpbWUgd2hlbiBSZWFjdCBDb21waWxlciBpcyBvbi4gQWRkIGl0IGhlcmUgc29cbiAgLy8gdGhlIG1hbmFnZWQgbmV4dC5jb25maWcgbmV2ZXIgYnJlYWtzIGBuZXh0IGJ1aWxkYCB3aXRoIGFuIHVucmVzb2x2ZWQtcGFja2FnZSBlcnJvci5cbiAgaWYgKGNvbmZpZy5kZXBlbmRpbmcubmV4dCkge1xuICAgIGRldkRlcGVuZGVuY2llcy5wdXNoKCdiYWJlbC1wbHVnaW4tcmVhY3QtY29tcGlsZXInKTtcbiAgfVxuXG4gIC8vIGB3YiB2ZXJpZnkgLS1mdWxsYCBhdWRpdHMgZXZlcnkgYCouc2xpZGV2Lm1kYCBkZWNrIHdpdGggc2xpZGV2LWNoZWNrLCBzbyB0aGUgY2hlY2tlciBoYXMgdG8gYmVcbiAgLy8gaW5zdGFsbGVkIHdoZXJldmVyIGEgZGVjayBsaXZlcy5cbiAgaWYgKGNvbmZpZy5kb2VzQ29udGFpblNsaWRldk1kKSB7XG4gICAgZGV2RGVwZW5kZW5jaWVzLnB1c2goJ3NsaWRldi1jaGVjaycpO1xuICB9XG5cbiAgaWYgKCFpc1diUGFja2FnZShqc29uT2JqKSkge1xuICAgIC8vIEEgYHdvcmtzcGFjZTpgIHNwZWNpZmllciBkZXBlbmRzIG9uIHRoZSB3YiBkZXZlbG9wZWQgaW4gdGhpcyByZXBvc2l0b3J5IChlLmcuXG4gICAgLy8gV2lsbEJvb3N0ZXIvc2hhcmVkIGl0c2VsZik7IGluc3RhbGxpbmcgdGhlIGxhdGVzdCByZWdpc3RyeSByZWxlYXNlIG92ZXIgaXQgd291bGQgc2lsZW50bHlcbiAgICAvLyByZXBsYWNlIHRoZSBsb2NhbCBidWlsZCB3aXRoIGEgcHVibGlzaGVkIG9uZSwgc28gbGVhdmUgc3VjaCBhIGRlY2xhcmF0aW9uIHVudG91Y2hlZC5cbiAgICBjb25zdCB3YlNwZWNpZmllciA9IGpzb25PYmouZGVwZW5kZW5jaWVzW3diRGVwZW5kZW5jeV0gPz8ganNvbk9iai5kZXZEZXBlbmRlbmNpZXNbd2JEZXBlbmRlbmN5XTtcbiAgICBpZiAoIXdiU3BlY2lmaWVyPy5zdGFydHNXaXRoKCd3b3Jrc3BhY2U6JykpIHtcbiAgICAgIGlmIChzaG91bGRLZWVwV2JBc1J1bnRpbWVEZXBlbmRlbmN5KGpzb25PYmopKSB7XG4gICAgICAgIGRlcGVuZGVuY2llcy5wdXNoKHdiRGVwZW5kZW5jeSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBkZXZEZXBlbmRlbmNpZXMucHVzaCh3YkRlcGVuZGVuY3kpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICAvLyBidWlsZC10cyBvd25zIFR5cGVTY3JpcHQgZXhlY3V0aW9uIGFuZCBkZWNsYXJhdGlvbiBlbWl0LiB3YmZ5IG11c3QgYWx3YXlzXG4gIC8vIGtlZXAgZXhpc3RpbmcgYnVpbGQtdHMgdXNlcnMgY3VycmVudCBiZWNhdXNlIG9sZGVyIHJlbGVhc2VzIGNhbiBlbWl0IC5kLnRzXG4gIC8vIGZpbGVzIGF0IHBhdGhzIHRoYXQgbm8gbG9uZ2VyIG1hdGNoIHBhY2thZ2UgZXhwb3J0cy5cbiAgaWYgKFxuICAgIGpzb25PYmouZGVwZW5kZW5jaWVzW2J1aWxkVHNEZXBlbmRlbmN5XSB8fFxuICAgIGpzb25PYmouZGV2RGVwZW5kZW5jaWVzW2J1aWxkVHNEZXBlbmRlbmN5XSB8fFxuICAgIE9iamVjdC52YWx1ZXMoanNvbk9iai5zY3JpcHRzKS5zb21lKChzY3JpcHQpID0+IHNjcmlwdD8uaW5jbHVkZXMoYnVpbGRUc0RlcGVuZGVuY3kpKVxuICApIHtcbiAgICBpZiAoc2hvdWxkS2VlcEJ1aWxkVHNBc1J1bnRpbWVEZXBlbmRlbmN5KGpzb25PYmopKSB7XG4gICAgICBkZXBlbmRlbmNpZXMucHVzaChidWlsZFRzRGVwZW5kZW5jeSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGRldkRlcGVuZGVuY2llcy5wdXNoKGJ1aWxkVHNEZXBlbmRlbmN5KTtcbiAgICB9XG4gIH1cbiAgaWYgKGRvZXNDb250YWluSnNPclRzKGNvbmZpZykpIHtcbiAgICBkZXZEZXBlbmRlbmNpZXMucHVzaCguLi5veGxpbnREZXBzKTtcbiAgfVxuXG4gIGNvbnN0IHRzY29uZmlnQmFzZURlcGVuZGVuY2llcyA9IGRvZXNDb250YWluSnNPclRzKGNvbmZpZykgPyBnZXRUc2NvbmZpZ0Jhc2VEZXBlbmRlbmNpZXMoY29uZmlnKSA6IFtdO1xuICBhd2FpdCByZW1vdmVVbnVzZWRUc2NvbmZpZ0Jhc2VEZXBlbmRlbmNpZXMoY29uZmlnLCBqc29uT2JqLCB0c2NvbmZpZ0Jhc2VEZXBlbmRlbmNpZXMpO1xuICBkZXZEZXBlbmRlbmNpZXMucHVzaCguLi50c2NvbmZpZ0Jhc2VEZXBlbmRlbmNpZXMpO1xuXG4gIGlmIChjb25maWcuZG9lc0NvbnRhaW5UeXBlU2NyaXB0IHx8IGNvbmZpZy5kb2VzQ29udGFpblR5cGVTY3JpcHRJblBhY2thZ2VzKSB7XG4gICAgLy8gVHlwZVNjcmlwdCA3IHNoaXBzIHRoZSBuYXRpdmUgY29tcGlsZXIgYXMgdGhlIGB0eXBlc2NyaXB0YCBwYWNrYWdlLCBzbyBpdCBpc1xuICAgIC8vIG5vdyB0aGUgbWFuYWdlZCBjb21waWxlciBmb3IgZXZlcnkgVHlwZVNjcmlwdCByZXBvICh0eXBlY2hlY2tpbmcgcnVucyBgdHNjYCkuXG4gICAgZGV2RGVwZW5kZW5jaWVzLnB1c2godHlwZXNjcmlwdERlcGVuZGVuY3kpO1xuICAgIC8vIE5leHQuanMncyBgbmV4dCBidWlsZGAgaW5zcGVjdHMgYEB0eXBlc2NyaXB0L25hdGl2ZS1wcmV2aWV3YCAodHNnbykgdG8gcnVuIGl0cyB0eXBlXG4gICAgLy8gY2hlY2s7IHRoZSBgdHlwZXNjcmlwdGAgdjcgcGFja2FnZSBhbG9uZSBsYWNrcyB0aGUgQVBJIG5leHQgbmVlZHMsIHNvIGtlZXAgYm90aFxuICAgIC8vIGluc3RhbGxlZCBmb3IgTmV4dC5qcy1mYW1pbHkgcmVwb3MuIFNlZSB0aGUgdHlwZXNjcmlwdEdvRGVwZW5kZW5jeSBjb21tZW50IGFib3ZlLlxuICAgIGlmIChjb25maWcuZGVwZW5kaW5nLm5leHQgfHwgY29uZmlnLmRlcGVuZGluZy5ibGl0eiB8fCBjb25maWcuZGVwZW5kaW5nLnZpbmV4dCkge1xuICAgICAgZGV2RGVwZW5kZW5jaWVzLnB1c2godHlwZXNjcmlwdEdvRGVwZW5kZW5jeSk7XG4gICAgfVxuICAgIC8vIFJlYWN0IE5hdGl2ZSByZWxpZXMgb24gQHRzY29uZmlnL3JlYWN0LW5hdGl2ZSdzIGFtYmllbnQgdHlwZXMgaW5zdGVhZCBvZiBAdHlwZXMvYnVuLlxuICAgIGlmICghY29uZmlnLmRlcGVuZGluZy5yZWFjdE5hdGl2ZSkge1xuICAgICAgZGV2RGVwZW5kZW5jaWVzLnB1c2goJ0B0eXBlcy9idW4nKTtcbiAgICB9XG4gICAgaWYgKFxuICAgICAganNvbk9iai5kZXBlbmRlbmNpZXMuamVzdCB8fFxuICAgICAganNvbk9iai5kZXZEZXBlbmRlbmNpZXMuamVzdCB8fFxuICAgICAganNvbk9iai5kZXBlbmRlbmNpZXNbJ0BqZXN0L2dsb2JhbHMnXSB8fFxuICAgICAganNvbk9iai5kZXZEZXBlbmRlbmNpZXNbJ0BqZXN0L2dsb2JhbHMnXSB8fFxuICAgICAganNvbk9iai5kZXBlbmRlbmNpZXNbJ3RzLWplc3QnXSB8fFxuICAgICAganNvbk9iai5kZXZEZXBlbmRlbmNpZXNbJ3RzLWplc3QnXVxuICAgICkge1xuICAgICAgZGV2RGVwZW5kZW5jaWVzLnB1c2goJ0B0eXBlcy9qZXN0Jyk7XG4gICAgfVxuICB9XG5cbiAgaWYgKGNvbmZpZy5pc1dpbGxCb29zdGVyQ29uZmlncykge1xuICAgIHJldHVybiB7XG4gICAgICBkZXBlbmRlbmNpZXM6IGRlcGVuZGVuY2llcy5maWx0ZXIoKGRlcCkgPT4gIWRlcC5pbmNsdWRlcygnQHdpbGxib29zdGVyLycpKSxcbiAgICAgIGRldkRlcGVuZGVuY2llczogZGV2RGVwZW5kZW5jaWVzLmZpbHRlcigoZGVwKSA9PiAhZGVwLmluY2x1ZGVzKCdAd2lsbGJvb3N0ZXIvJykpLFxuICAgICAgcHl0aG9uRGV2RGVwZW5kZW5jaWVzLFxuICAgIH07XG4gIH1cblxuICByZXR1cm4geyBkZXBlbmRlbmNpZXMsIGRldkRlcGVuZGVuY2llcywgcHl0aG9uRGV2RGVwZW5kZW5jaWVzIH07XG59XG5cbmZ1bmN0aW9uIGRvZXNSZWxlYXNlU2NyaXB0SW5zdGFsbFNlbWFudGljUmVsZWFzZShzY3JpcHQ6IHVua25vd24pOiBib29sZWFuIHtcbiAgaWYgKHR5cGVvZiBzY3JpcHQgIT09ICdzdHJpbmcnKSByZXR1cm4gZmFsc2U7XG4gIHJldHVybiAvXFxiKD86YnVueHxucHh8cG5wbVxccytkbHh8eWFyblxccytkbHgpXFxzK3NlbWFudGljLXJlbGVhc2UoPzpAXFxTKyk/XFxiL3UudGVzdChzY3JpcHQpO1xufVxuXG5mdW5jdGlvbiBtb3ZlTWFuYWdlZFRvb2xEZXBlbmRlbmNpZXNUb0RldkRlcGVuZGVuY2llcyhqc29uT2JqOiBXcml0YWJsZVBhY2thZ2VKc29uKTogdm9pZCB7XG4gIGZvciAoY29uc3QgW2RlcGVuZGVuY3ksIGtlZXBBc1J1bnRpbWVdIG9mIFtcbiAgICBbd2JEZXBlbmRlbmN5LCBzaG91bGRLZWVwV2JBc1J1bnRpbWVEZXBlbmRlbmN5KGpzb25PYmopXSxcbiAgICBbYnVpbGRUc0RlcGVuZGVuY3ksIHNob3VsZEtlZXBCdWlsZFRzQXNSdW50aW1lRGVwZW5kZW5jeShqc29uT2JqKV0sXG4gIF0gYXMgY29uc3QpIHtcbiAgICBpZiAoa2VlcEFzUnVudGltZSkge1xuICAgICAgY29uc3QgZGV2VmVyc2lvbiA9IGpzb25PYmouZGV2RGVwZW5kZW5jaWVzW2RlcGVuZGVuY3ldO1xuICAgICAgaWYgKCFkZXZWZXJzaW9uKSBjb250aW51ZTtcbiAgICAgIGNvbnN0IHJ1bnRpbWVWZXJzaW9uID0ganNvbk9iai5kZXBlbmRlbmNpZXNbZGVwZW5kZW5jeV07XG4gICAgICBpZiAoIXJ1bnRpbWVWZXJzaW9uIHx8IGlzTmV3ZXJQYWNrYWdlVmVyc2lvbihkZXZWZXJzaW9uLCBydW50aW1lVmVyc2lvbikpIHtcbiAgICAgICAganNvbk9iai5kZXBlbmRlbmNpZXNbZGVwZW5kZW5jeV0gPSBkZXZWZXJzaW9uO1xuICAgICAgfVxuICAgICAgZGVsZXRlIGpzb25PYmouZGV2RGVwZW5kZW5jaWVzW2RlcGVuZGVuY3ldO1xuICAgIH0gZWxzZSBpZiAoanNvbk9iai5kZXBlbmRlbmNpZXNbZGVwZW5kZW5jeV0pIHtcbiAgICAgIGpzb25PYmouZGV2RGVwZW5kZW5jaWVzW2RlcGVuZGVuY3ldID8/PSBqc29uT2JqLmRlcGVuZGVuY2llc1tkZXBlbmRlbmN5XTtcbiAgICAgIGRlbGV0ZSBqc29uT2JqLmRlcGVuZGVuY2llc1tkZXBlbmRlbmN5XTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gc2hvdWxkS2VlcFdiQXNSdW50aW1lRGVwZW5kZW5jeShqc29uT2JqOiBQYWNrYWdlSnNvbik6IGJvb2xlYW4ge1xuICAvLyBQcm9kdWN0aW9uIGltYWdlcyBydW4gbWlncmF0aW9ucyBhZnRlciBkZXZEZXBlbmRlbmNpZXMgYXJlIHBydW5lZCwganVzdCBhcyBwYWNrYWdlIG1hbmFnZXJzXG4gIC8vIHJ1biBwb3N0aW5zdGFsbCBkdXJpbmcgcHJvZHVjdGlvbiBpbnN0YWxscywgc28gYm90aCBlbnRyeSBwb2ludHMgbXVzdCByZXRhaW4gdGhlIHdiIGJpbmFyeS5cbiAgLy8gS2VlcCB0aGUgd29yZCBtYXRjaCBjb25zZXJ2YXRpdmU6IHN1cHBvcnRlZCBjdXN0b20gd3JhcHBlcnMgY2FuIHB1dCB3YiBpbnNpZGUgc2hlbGwgbG9vcHMgdGhhdFxuICAvLyB0aGUgY29tbWFuZC1wb3NpdGlvbiBwYXJzZXIgY2Fubm90IGNsYXNzaWZ5LCB3aGlsZSBhIGZhbHNlIHBvc2l0aXZlIG9ubHkgcmV0YWlucyB0aGUgQ0xJLlxuICByZXR1cm4gW2pzb25PYmouc2NyaXB0cz8ucG9zdGluc3RhbGwsIGpzb25PYmouc2NyaXB0cz8uWydkYi1taWdyYXRlJ11dLnNvbWUoXG4gICAgKHNjcmlwdCkgPT4gdHlwZW9mIHNjcmlwdCA9PT0gJ3N0cmluZycgJiYgL1xcYndiXFxiL3UudGVzdChzY3JpcHQpXG4gICk7XG59XG5cbmZ1bmN0aW9uIHNob3VsZEtlZXBCdWlsZFRzQXNSdW50aW1lRGVwZW5kZW5jeShqc29uT2JqOiBQYWNrYWdlSnNvbik6IGJvb2xlYW4ge1xuICBjb25zdCBwcmlzbWEgPSBqc29uT2JqLnByaXNtYSBhcyB7IHNlZWQ/OiB1bmtub3duIH0gfCB1bmRlZmluZWQ7XG4gIHJldHVybiBkb2VzU2VlZENvbW1hbmRVc2VCdWlsZFRzKHByaXNtYT8uc2VlZCkgfHwgZG9lc1NlZWRDb21tYW5kVXNlQnVpbGRUcyhqc29uT2JqLnNjcmlwdHM/LnNlZWQpO1xufVxuXG5mdW5jdGlvbiBkb2VzU2VlZENvbW1hbmRVc2VCdWlsZFRzKHNlZWRDb21tYW5kOiB1bmtub3duKTogYm9vbGVhbiB7XG4gIC8vIFByb2R1Y3Rpb24gRG9ja2VyIGltYWdlcyBydW4gc2VlZCBzY3JpcHRzIGFmdGVyIGRldkRlcGVuZGVuY2llcyBhcmUgcHJ1bmVkLFxuICAvLyBzbyBUeXBlU2NyaXB0IHNlZWQgcnVubmVycyBtdXN0IHJlbWFpbiBhdmFpbGFibGUgYXQgcnVudGltZS5cbiAgcmV0dXJuIHR5cGVvZiBzZWVkQ29tbWFuZCA9PT0gJ3N0cmluZycgJiYgLyg/PCFbXFx3LV0pYnVpbGQtdHMoPyFbXFx3LV0pL3UudGVzdChzZWVkQ29tbWFuZCk7XG59XG5cbmNvbnN0IGRlcGVuZGVuY3lEZWNsYXJhdGlvblNlY3Rpb25zID0gW1xuICAnZGVwZW5kZW5jaWVzJyxcbiAgJ2RldkRlcGVuZGVuY2llcycsXG4gICdvcHRpb25hbERlcGVuZGVuY2llcycsXG4gICdwZWVyRGVwZW5kZW5jaWVzJyxcbl0gYXMgY29uc3Q7XG5cbi8qKlxuICogRm9yY2VzIHN0b3JlLWluY29tcGF0aWJsZSBwYWNrYWdlcyB0byBzdGF5IHByb2plY3QtbG9jYWwgd2hlbiB0aGUgZ2VuZXJhdGVkIGJ1bmZpZy50b21sIGVuYWJsZXNcbiAqIEJ1bidzIGdsb2JhbCBzdG9yZTogYGNoYWtyYSB0eXBlZ2VuYCAocnVuIGJ5IGB3YiBnZW4tY29kZWApXG4gKiB3cml0ZXMgZ2VuZXJhdGVkIHR5cGVzIGludG8gdGhlIGluc3RhbGxlZCBAY2hha3JhLXVpL3JlYWN0IHBhY2thZ2UsIHdoaWNoIHdvdWxkIG90aGVyd2lzZVxuICogbXV0YXRlIHRoZSBtYWNoaW5lLXdpZGUgc3RvcmUgc2hhcmVkIGFjcm9zcyByZXBvc2l0b3JpZXMsIGFuZCBkcml6emxlLWtpdCByZXF1aXJlcyBkcml6emxlLW9ybVxuICogd2l0aG91dCBkZWNsYXJpbmcgaXQsIHdoaWNoIHRoZSBzdG9yZSByZWFscGF0aCBwbGFjZXMgYmV5b25kIGEgcGxhaW4gbm9kZV9tb2R1bGVzIHdhbGstdXAuXG4gKiBMaXN0aW5nIHRoZW0gaW4gYHRydXN0ZWREZXBlbmRlbmNpZXNgIG1ha2VzIEJ1biBtYXRlcmlhbGl6ZSBhIHBlci1wcm9qZWN0IGNvcHkgdW5kZXJcbiAqIGBub2RlX21vZHVsZXMvLmJ1bi9gLCB3aG9zZSBzaWJsaW5nIGBub2RlX21vZHVsZXMvLmJ1bi9ub2RlX21vZHVsZXMvYCBsaW5rcyBldmVyeSBpbnN0YWxsZWRcbiAqIHBhY2thZ2UgYW5kIHRoZXJlZm9yZSByZXNvbHZlcyB0aGUgdW5kZWNsYXJlZCByZXF1aXJlcy5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gZW5zdXJlVHJ1c3RlZERlcGVuZGVuY2llcyhjb25maWc6IFBhY2thZ2VDb25maWcsIGpzb25PYmo6IFdyaXRhYmxlUGFja2FnZUpzb24pOiBQcm9taXNlPHZvaWQ+IHtcbiAgLy8gQnVuIGNvbnN1bHRzIHRydXN0ZWREZXBlbmRlbmNpZXMgaW4gdGhlIHdvcmtzcGFjZSByb290J3MgcGFja2FnZS5qc29uIG9ubHksIHNvIHRoZSBsaXN0IGlzXG4gIC8vIG1hbmFnZWQgdGhlcmUgYW5kIG11c3QgY292ZXIgZGVwZW5kZW5jaWVzIGRlY2xhcmVkIGFueXdoZXJlIGluIHRoZSByZXBvc2l0b3J5LlxuICBpZiAoIWNvbmZpZy5pc1Jvb3QpIHJldHVybjtcbiAgY29uc3QgYnVuSnNvbk9iaiA9IGpzb25PYmogYXMgV3JpdGFibGVQYWNrYWdlSnNvbiAmIHsgdHJ1c3RlZERlcGVuZGVuY2llcz86IHN0cmluZ1tdIH07XG4gIC8vIEJ1biBpbnN0YWxscyBvcHRpb25hbCBhbmQgcGVlciBkZXBlbmRlbmNpZXMgYnkgZGVmYXVsdCwgc28gYWxsIGRlY2xhcmF0aW9uIHNlY3Rpb25zIGNvdW50LlxuICAvLyBFdmVyeSBkZWNsYXJlZCByYW5nZSBpcyBrZXB0IHBlciBwYWNrYWdlOiBhIHJvb3QgZGVjbGFyYXRpb24gbXVzdCBub3QgbWFzayBhIHdvcmtzcGFjZSBvbmVcbiAgLy8gKGUuZy4gcm9vdCBAY2hha3JhLXVpL2NsaSB2MiBhbG9uZ3NpZGUgYSB3b3Jrc3BhY2Ugb24gdjMpLlxuICBjb25zdCBkZWNsYXJlZERlcGVuZGVuY2llcyA9IG5ldyBNYXA8c3RyaW5nLCBzdHJpbmdbXT4oKTtcbiAgY29uc3QgYWRkRGVjbGFyZWREZXBlbmRlbmNpZXMgPSAocGFja2FnZUpzb246IFBhY2thZ2VKc29uKTogdm9pZCA9PiB7XG4gICAgZm9yIChjb25zdCBzZWN0aW9uIG9mIGRlcGVuZGVuY3lEZWNsYXJhdGlvblNlY3Rpb25zKSB7XG4gICAgICBmb3IgKGNvbnN0IFtkZXBlbmRlbmN5TmFtZSwgdmVyc2lvblJhbmdlXSBvZiBPYmplY3QuZW50cmllcyhwYWNrYWdlSnNvbltzZWN0aW9uXSA/PyB7fSkpIHtcbiAgICAgICAgaWYgKHR5cGVvZiB2ZXJzaW9uUmFuZ2UgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgY29uc3QgdmVyc2lvblJhbmdlcyA9IGRlY2xhcmVkRGVwZW5kZW5jaWVzLmdldChkZXBlbmRlbmN5TmFtZSk7XG4gICAgICAgICAgaWYgKHZlcnNpb25SYW5nZXMpIHtcbiAgICAgICAgICAgIHZlcnNpb25SYW5nZXMucHVzaCh2ZXJzaW9uUmFuZ2UpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBkZWNsYXJlZERlcGVuZGVuY2llcy5zZXQoZGVwZW5kZW5jeU5hbWUsIFt2ZXJzaW9uUmFuZ2VdKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH07XG4gIGFkZERlY2xhcmVkRGVwZW5kZW5jaWVzKGpzb25PYmopO1xuICBmb3IgKGNvbnN0IHBhY2thZ2VKc29uUGF0aCBvZiBnZXRXb3Jrc3BhY2VQYWNrYWdlSnNvblBhdGhzKGNvbmZpZykpIHtcbiAgICB0cnkge1xuICAgICAgYWRkRGVjbGFyZWREZXBlbmRlbmNpZXMoXG4gICAgICAgIEpTT04ucGFyc2UoYXdhaXQgZnMucHJvbWlzZXMucmVhZEZpbGUocGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCBwYWNrYWdlSnNvblBhdGgpLCAndXRmOCcpKSBhcyBQYWNrYWdlSnNvblxuICAgICAgKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIGlnbm9yZSB1bnJlYWRhYmxlIHdvcmtzcGFjZSBwYWNrYWdlLmpzb25cbiAgICB9XG4gIH1cbiAgLy8gT25seSBAY2hha3JhLXVpL2NsaSB2MydzIGBjaGFrcmEgdHlwZWdlbmAgd3JpdGVzIGludG8gdGhlIGluc3RhbGxlZCBAY2hha3JhLXVpL3JlYWN0O1xuICAvLyB2MidzIGBjaGFrcmEtY2xpIHRva2Vuc2Agd3JpdGVzIGludG8gQGNoYWtyYS11aS9zdHlsZWQtc3lzdGVtIGluc3RlYWQsIHNvIHRydXN0aW5nXG4gIC8vIEBjaGFrcmEtdWkvcmVhY3QgdGhlcmUgd291bGQgZm9yY2UgYSB1c2VsZXNzIHByb2plY3QtbG9jYWwgY29weSB3aXRob3V0IGZpeGluZyBnZW4tY29kZS5cbiAgLy8gTWlycm9yIHdiIGdlbi1jb2RlJ3MgY2xhc3NpZmljYXRpb246IG9ubHkgYSByYW5nZSB3aG9zZSBsZWFkaW5nIG1ham9yIHBhcnNlcyB0byAyIHNlbGVjdHMgdGhlXG4gIC8vIHYyIGNvbW1hbmQsIHNvIGRpZ2l0bGVzcyBzcGVjcyBsaWtlIGBsYXRlc3RgIG9yIGNhdGFsb2cgcmVmZXJlbmNlcyBjb3VudCBhcyB2My5cbiAgY29uc3QgaGFzQ2hha3JhQ2xpVjMgPSAoZGVjbGFyZWREZXBlbmRlbmNpZXMuZ2V0KCdAY2hha3JhLXVpL2NsaScpID8/IFtdKS5zb21lKFxuICAgICh2ZXJzaW9uUmFuZ2UpID0+IC9cXGQrL3UuZXhlYyh2ZXJzaW9uUmFuZ2UpPy5bMF0gIT09ICcyJ1xuICApO1xuICBjb25zdCByZXF1aXJlZFdiZnlQYWNrYWdlcyA9IFtcbiAgICAuLi4oaGFzQ2hha3JhQ2xpVjMgJiYgZGVjbGFyZWREZXBlbmRlbmNpZXMuaGFzKCdAY2hha3JhLXVpL3JlYWN0JykgPyBbJ0BjaGFrcmEtdWkvcmVhY3QnXSA6IFtdKSxcbiAgICAuLi4oZGVjbGFyZWREZXBlbmRlbmNpZXMuaGFzKCdkcml6emxlLWtpdCcpID8gWydkcml6emxlLWtpdCddIDogW10pLFxuICAgIC8vIFRoZXNlIGdpdC1kZXBlbmRlbmN5IGJ1aWxkcyBpbXBvcnQgcGFja2FnZXMgdGhleSBkbyBub3QgZGVjbGFyZSAoZS5nLiB6b2QpLCB3aGljaCB0aGVcbiAgICAvLyBnbG9iYWwtc3RvcmUgbGF5b3V0IHBsYWNlcyBiZXlvbmQgdGhlaXIgd2Fsay11cDsgYSBwcm9qZWN0LWxvY2FsIGNvcHkgdW5kZXJcbiAgICAvLyBub2RlX21vZHVsZXMvLmJ1biByZXNvbHZlcyB0aGVtIChvYnNlcnZlZCBpbiBXaWxsQm9vc3Rlci9wcm9tcHQtc3R1ZHkpLlxuICAgIC4uLihkZWNsYXJlZERlcGVuZGVuY2llcy5oYXMoJ0B3aWxsYm9vc3Rlci9qdWRnZScpID8gWydAd2lsbGJvb3N0ZXIvanVkZ2UnXSA6IFtdKSxcbiAgICAuLi4oZGVjbGFyZWREZXBlbmRlbmNpZXMuaGFzKCdAd2lsbGJvb3N0ZXIvbGxtLXByb3h5JykgPyBbJ0B3aWxsYm9vc3Rlci9sbG0tcHJveHknXSA6IFtdKSxcbiAgICAvLyBibGl0eiBhbmQgQGJsaXR6anMvYXV0aCByZXF1aXJlIHJlYWN0IChhbmQgb3RoZXIgcGVlcnMpIHdpdGhvdXQgZGVjbGFyaW5nIHRoZW0sIHJlbHlpbmcgb25cbiAgICAvLyBob2lzdGluZywgd2hpY2ggdGhlIGdsb2JhbC1zdG9yZSBsYXlvdXQgcGxhY2VzIGJleW9uZCB0aGVpciB3YWxrLXVwIChvYnNlcnZlZCBpblxuICAgIC8vIFdpbGxCb29zdGVyL3N1cnZleS1zeXN0ZW06IGBuZXh0IGJ1aWxkYCBwYWdlLWRhdGEgY29sbGVjdGlvbiBkaWVzIHdpdGggXCJDYW5ub3QgZmluZCBtb2R1bGVcbiAgICAvLyAncmVhY3QnXCIgZnJvbSBAYmxpdHpqcy9hdXRoKS4gQGJsaXR6anMvcnBjIGlzIE5PVCBsaXN0ZWQgYmVjYXVzZSBpdCBwcm9wZXJseSBkZWNsYXJlcyBpdHNcbiAgICAvLyByZWFjdC9AdGFuc3RhY2sgcGVlcnMsIHNvIEJ1biBsaW5rcyB0aGVtIGludG8gaXRzIHN0b3JlIGVudHJ5LiBAYmxpdHpqcy9uZXh0IGlzXG4gICAgLy8gZGVsaWJlcmF0ZWx5IE5PVCBsaXN0ZWQgZWl0aGVyOiB0cnVzdGluZyBpdCB3b3VsZCBydW4gaXRzIHBvc3RpbnN0YWxsIChgYmxpdHogY29kZWdlbmApLFxuICAgIC8vIHdoaWNoIHBhdGNoZXMgdGhlIGluc3RhbGxlZCBuZXh0IHBhY2thZ2UgaW4gcGxhY2Ug4oCUIHJlcG9zaXRvcmllcyBwYXRjaCBvdXQgdGhhdCBwb3N0aW5zdGFsbFxuICAgIC8vIHdpdGggYGJ1biBwYXRjaGAgaW5zdGVhZCwgd2hpY2ggYWxzbyBrZWVwcyB0aGUgcGFja2FnZSBwcm9qZWN0LWxvY2FsLlxuICAgIC4uLihkZWNsYXJlZERlcGVuZGVuY2llcy5oYXMoJ2JsaXR6JykgPyBbJ2JsaXR6J10gOiBbXSksXG4gICAgLi4uKGRlY2xhcmVkRGVwZW5kZW5jaWVzLmhhcygnQGJsaXR6anMvYXV0aCcpID8gWydAYmxpdHpqcy9hdXRoJ10gOiBbXSksXG4gICAgLy8gQnVuIGRvZXMgbm90IGxpbmsgQGhvb2tmb3JtL3Jlc29sdmVycycgT1BUSU9OQUwgdmFsaWRhdG9yIHBlZXJzIChlLmcuIHpvZCkgaW50byBpdHNcbiAgICAvLyBnbG9iYWwtc3RvcmUgZW50cnkgZXZlbiB3aGVuIHRoZSBwcm9qZWN0IGluc3RhbGxzIHRoZW0sIHNvIGl0cyBzZXJ2ZXItc2lkZVxuICAgIC8vIGBpbXBvcnQgJ3pvZCdgIGZhaWxzIGZyb20gdGhlIHN0b3JlIChvYnNlcnZlZCBpbiBXaWxsQm9vc3Rlci9zdXJ2ZXktc3lzdGVtKS5cbiAgICAuLi4oZGVjbGFyZWREZXBlbmRlbmNpZXMuaGFzKCdAaG9va2Zvcm0vcmVzb2x2ZXJzJykgPyBbJ0Bob29rZm9ybS9yZXNvbHZlcnMnXSA6IFtdKSxcbiAgICAvLyBAem9vbS9ydG1zIGluc3RhbGxzIGl0cyBuYXRpdmUgcnRtcy5ub2RlIGJpbmRpbmcgaW4gYSBsaWZlY3ljbGUgc2NyaXB0LiBXaXRob3V0IGV4cGxpY2l0XG4gICAgLy8gdHJ1c3QsIEJ1biBza2lwcyB0aGF0IHNjcmlwdCBhbmQgdGhlIHBhY2thZ2UgZmFpbHMgYXMgc29vbiBhcyB0aGUgWm9vbSBib3QgaW1wb3J0cyBpdFxuICAgIC8vIChvYnNlcnZlZCBpbiBXaWxsQm9vc3Rlci9zbWFydHNlLXpvb20tYm90KS5cbiAgICAuLi4oZGVjbGFyZWREZXBlbmRlbmNpZXMuaGFzKCdAem9vbS9ydG1zJykgPyBbJ0B6b29tL3J0bXMnXSA6IFtdKSxcbiAgXTtcblxuICAvLyB3YmZ5IGZ1bGx5IG93bnMgdGhpcyBmaWVsZDogYSBwYWNrYWdlIHdob3NlIGxpZmVjeWNsZSBzY3JpcHRzIG11c3QgcnVuIGdldHMgYWRkZWQgdG8gd2JmeVxuICAvLyBpdHNlbGYgaW5zdGVhZCBvZiB0byBpbmRpdmlkdWFsIHJlcG9zaXRvcmllcywgc28gdW5tYW5hZ2VkIGVudHJpZXMgYXJlIGFsd2F5cyByZW1vdmVkIOKAlFxuICAvLyBpbmNsdWRpbmcgYW4gZXhwbGljaXRseSBlbXB0eSBkZW55LWFsbCBsaXN0LCB3aG9zZSBkZWxldGlvbiBkZWxpYmVyYXRlbHkgcmVzdG9yZXMgQnVuJ3NcbiAgLy8gZGVmYXVsdCBhbGxvdy1saXN0ICh0aGUgb3duZXJzaGlwIHBvbGljeSBjaG9zZW4gaW4gIzk3NSkuXG4gIGNvbnN0IGV4aXN0aW5nVHJ1c3RlZCA9IGJ1bkpzb25PYmoudHJ1c3RlZERlcGVuZGVuY2llcztcbiAgaWYgKHJlcXVpcmVkV2JmeVBhY2thZ2VzLmxlbmd0aCA9PT0gMCkge1xuICAgIGlmIChleGlzdGluZ1RydXN0ZWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgLy8gRGVsZXRpbmcgdGhlIGZpZWxkIHJlc3RvcmVzIEJ1bidzIGZ1bGwgZGVmYXVsdCBhbGxvdy1saXN0LCBzbyBvbmx5IGVudHJpZXMgb3V0c2lkZSB0aGF0XG4gICAgICAvLyBsaXN0IGFjdHVhbGx5IGxvc2UgdGhlaXIgbGlmZWN5Y2xlIHNjcmlwdHMuXG4gICAgICB3YXJuQWJvdXRSZW1vdmVkVHJ1c3RlZERlcGVuZGVuY2llcyhjb25maWcsIGV4aXN0aW5nVHJ1c3RlZCwgbmV3IFNldCgpKTtcbiAgICAgIGRlbGV0ZSBidW5Kc29uT2JqLnRydXN0ZWREZXBlbmRlbmNpZXM7XG4gICAgfVxuICAgIHJldHVybjtcbiAgfVxuXG4gIC8vIEFuIGV4cGxpY2l0IHRydXN0ZWREZXBlbmRlbmNpZXMgbGlzdCBSRVBMQUNFUyBCdW4ncyBkZWZhdWx0IGFsbG93LWxpc3QgaW5zdGVhZCBvZiBleHRlbmRpbmdcbiAgLy8gaXQsIGFuZCBCdW4gcHJpbnRzIG5vIHdhcm5pbmcgZm9yIHRoZSBwb3N0aW5zdGFsbHMgaXQgY29uc2VxdWVudGx5IHNraXBzIChlLmcuIEByYWlsd2F5L2NsaVxuICAvLyBkb3dubG9hZHMgaXRzIGJpbmFyeSBpbiBwb3N0aW5zdGFsbCBhbmQgZXhpdHMgMSB3aXRob3V0IG9uZSkuIEluY2x1ZGUgdGhlIEVOVElSRSBkZWZhdWx0IGxpc3Q6XG4gIC8vIGVudHJpZXMgZm9yIHBhY2thZ2VzIHRoYXQgYXJlIG5vdCBpbnN0YWxsZWQgYXJlIGluZXJ0LCBhbmQgdGhpcyBpcyB0aGUgb25seSByZXByZXNlbnRhdGlvblxuICAvLyB0aGF0IHN0YXlzIGNvcnJlY3QgZm9yIHRyYW5zaXRpdmUgZGVwZW5kZW5jaWVzIHRoZSBmaW5hbCBgYnVuIGluc3RhbGxgIHJlc29sdmVzIGFmdGVyIHRoaXNcbiAgLy8gcnVucyDigJQgYW4gaW50ZXJzZWN0aW9uIHdpdGggYSBtaXNzaW5nIG9yIHN0YWxlIGxvY2tmaWxlIHdvdWxkIHNpbGVudGx5IGRyb3AgdGhlbS5cbiAgY29uc3QgZGVmYXVsdFRydXN0ZWREZXBlbmRlbmNpZXMgPSBnZXREZWZhdWx0VHJ1c3RlZERlcGVuZGVuY2llcyhjb25maWcpO1xuICAvLyBsZWZ0aG9vayBpcyBhcHBlbmRlZCBleHBsaWNpdGx5IHNvIHRoZSBkZWZhdWx0LWxpc3QgbG9va3VwIGZhaWxpbmcgY2Fubm90IGRyb3AgaXQ6IGl0IGlzXG4gIC8vIHJlcXVpcmVkIGluIGV2ZXJ5IG1hbmFnZWQgcmVwb3NpdG9yeS5cbiAgY29uc3QgbmV3VHJ1c3RlZFBhY2thZ2VzID0gbmV3IFNldChbXG4gICAgLi4ucmVxdWlyZWRXYmZ5UGFja2FnZXMsXG4gICAgbGVmdGhvb2tEZXBlbmRlbmN5LFxuICAgIC4uLihkZWZhdWx0VHJ1c3RlZERlcGVuZGVuY2llcyA/PyBbXSksXG4gIF0pO1xuICB3YXJuQWJvdXRSZW1vdmVkVHJ1c3RlZERlcGVuZGVuY2llcyhjb25maWcsIGV4aXN0aW5nVHJ1c3RlZCA/PyBbXSwgbmV3VHJ1c3RlZFBhY2thZ2VzKTtcbiAgYnVuSnNvbk9iai50cnVzdGVkRGVwZW5kZW5jaWVzID0gWy4uLm5ld1RydXN0ZWRQYWNrYWdlc10udG9Tb3J0ZWQoKTtcbn1cblxuLy8gVGhlIHBhY2thZ2VzIHdiZnkgaXRzZWxmIG1heSB3cml0ZSBpbnRvIHRydXN0ZWREZXBlbmRlbmNpZXM7IHRoZWlyIHJlbW92YWwgaXMgbWFuYWdlZCBjbGVhbnVwLFxuLy8gbmV2ZXIgYSBsb3NzIG9mIHVzZXIgcG9saWN5LlxuY29uc3Qgd2JmeU1hbmFnZWRUcnVzdGVkRGVwZW5kZW5jaWVzID0gbmV3IFNldChbXG4gICdAYmxpdHpqcy9hdXRoJyxcbiAgJ0BjaGFrcmEtdWkvcmVhY3QnLFxuICAnQGhvb2tmb3JtL3Jlc29sdmVycycsXG4gICdAd2lsbGJvb3N0ZXIvanVkZ2UnLFxuICAnQHdpbGxib29zdGVyL2xsbS1wcm94eScsXG4gICdAem9vbS9ydG1zJyxcbiAgJ2JsaXR6JyxcbiAgJ2RyaXp6bGUta2l0JyxcbiAgbGVmdGhvb2tEZXBlbmRlbmN5LFxuXSk7XG5cbmZ1bmN0aW9uIHdhcm5BYm91dFJlbW92ZWRUcnVzdGVkRGVwZW5kZW5jaWVzKFxuICBjb25maWc6IFBhY2thZ2VDb25maWcsXG4gIGV4aXN0aW5nVHJ1c3RlZDogcmVhZG9ubHkgc3RyaW5nW10sXG4gIGtlcHRQYWNrYWdlczogUmVhZG9ubHlTZXQ8c3RyaW5nPlxuKTogdm9pZCB7XG4gIC8vIEEgZGVmYXVsdC10cnVzdGVkIGVudHJ5IG5ldmVyIGxvc2VzIGFueXRoaW5nIGJ5IHJlbW92YWw6IHdoaWxlIHRoZSBwYWNrYWdlIGlzIGluc3RhbGxlZCB0aGVcbiAgLy8ga2VwdCBsaXN0IChvciwgd2hlbiB0aGUgZmllbGQgaXMgZGVsZXRlZCwgQnVuJ3Mgb3duIGRlZmF1bHQgbGlzdCkgc3RpbGwgdHJ1c3RzIGl0LlxuICBjb25zdCBkZWZhdWx0VHJ1c3RlZERlcGVuZGVuY2llcyA9IGdldERlZmF1bHRUcnVzdGVkRGVwZW5kZW5jaWVzKGNvbmZpZyk7XG4gIGNvbnN0IHJlbW92ZWRQYWNrYWdlcyA9IGV4aXN0aW5nVHJ1c3RlZC5maWx0ZXIoXG4gICAgKHBrZykgPT4gIWtlcHRQYWNrYWdlcy5oYXMocGtnKSAmJiAhd2JmeU1hbmFnZWRUcnVzdGVkRGVwZW5kZW5jaWVzLmhhcyhwa2cpICYmICFkZWZhdWx0VHJ1c3RlZERlcGVuZGVuY2llcz8uaGFzKHBrZylcbiAgKTtcbiAgaWYgKHJlbW92ZWRQYWNrYWdlcy5sZW5ndGggPiAwKSB7XG4gICAgY29uc29sZS53YXJuKFxuICAgICAgYFJlbW92aW5nIHVubWFuYWdlZCB0cnVzdGVkRGVwZW5kZW5jaWVzIGVudHJpZXM6ICR7cmVtb3ZlZFBhY2thZ2VzLmpvaW4oJywgJyl9LiB3YmZ5IG93bnMgdGhpcyBmaWVsZDsgaWYgdGhlaXIgbGlmZWN5Y2xlIHNjcmlwdHMgYXJlIHJlcXVpcmVkLCBhZGQgdGhlIHBhY2thZ2VzIHRvIHdiZnkgaXRzZWxmLmBcbiAgICApO1xuICB9XG59XG5cbmxldCBjYWNoZWREZWZhdWx0VHJ1c3RlZERlcGVuZGVuY2llczogU2V0PHN0cmluZz4gfCB1bmRlZmluZWQ7XG5cbi8qKiBGZXRjaGVzIEJ1bidzIGRlZmF1bHQgdHJ1c3RlZC1kZXBlbmRlbmN5IGFsbG93LWxpc3QgZnJvbSB0aGUgQnVuIHZlcnNpb24gaW5zdGFsbGluZyB0aGUgcmVwb3NpdG9yeS4gKi9cbmZ1bmN0aW9uIGdldERlZmF1bHRUcnVzdGVkRGVwZW5kZW5jaWVzKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFNldDxzdHJpbmc+IHwgdW5kZWZpbmVkIHtcbiAgaWYgKCFjYWNoZWREZWZhdWx0VHJ1c3RlZERlcGVuZGVuY2llcykge1xuICAgIC8vIEJ1biBjb2xvcml6ZXMgdGhlIGxpc3QgbWFya2VycyB3aGVuIEZPUkNFX0NPTE9SIGlzIHNldCAoZS5nLiBieSB0ZXN0IHJ1bm5lcnMgb24gQ0kpLCBzb1xuICAgIC8vIEFOU0kgZXNjYXBlIHNlcXVlbmNlcyBtdXN0IGJlIHN0cmlwcGVkIGJlZm9yZSBwYXJzaW5nLlxuICAgIGNvbnN0IHN0ZG91dCA9IHNwYXduU3luY0FuZFJldHVyblN0ZG91dCgnYnVuJywgWydwbScsICdkZWZhdWx0LXRydXN0ZWQnXSwgY29uZmlnLmRpclBhdGgpLnJlcGxhY2VBbGwoXG4gICAgICAvLyBveGxpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tY29udHJvbC1yZWdleCAtLSBtYXRjaGluZyBBTlNJIGVzY2FwZSBzZXF1ZW5jZXMgcmVxdWlyZXMgdGhlIEVTQyBjb250cm9sIGNoYXJhY3RlclxuICAgICAgL1xcdTAwMUJcXFtbMC05O10qbS9ndSxcbiAgICAgICcnXG4gICAgKTtcbiAgICBjb25zdCBwYXJzZWREZXBlbmRlbmNpZXMgPSBuZXcgU2V0KFsuLi5zdGRvdXQubWF0Y2hBbGwoL15cXHMqLVxccysoXFxTKykkL2dtdSldLm1hcCgobWF0Y2gpID0+IG1hdGNoWzFdIGFzIHN0cmluZykpO1xuICAgIGlmIChwYXJzZWREZXBlbmRlbmNpZXMuc2l6ZSA9PT0gMCkge1xuICAgICAgLy8gRG8gbm90IGNhY2hlIHRoZSBmYWlsdXJlOiBhIHRhcmdldC1sb2NhbCBwcm9ibGVtIChlLmcuIGFuIHVucmVhZGFibGUgcGFja2FnZS5qc29uKSBtdXN0XG4gICAgICAvLyBub3QgZGVueSB0aGUgZGVmYXVsdCBsaXN0IHRvIGV2ZXJ5IGxhdGVyIHRhcmdldCBvZiBhIG11bHRpLXBhdGggcnVuLlxuICAgICAgY29uc29sZS53YXJuKCdGYWlsZWQgdG8gcmVhZCB0aGUgZGVmYXVsdCBhbGxvdy1saXN0IHZpYSBgYnVuIHBtIGRlZmF1bHQtdHJ1c3RlZGAuJyk7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cbiAgICBjYWNoZWREZWZhdWx0VHJ1c3RlZERlcGVuZGVuY2llcyA9IHBhcnNlZERlcGVuZGVuY2llcztcbiAgfVxuICByZXR1cm4gY2FjaGVkRGVmYXVsdFRydXN0ZWREZXBlbmRlbmNpZXM7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIG5vcm1hbGl6ZVBhY2thZ2VNZXRhZGF0YShcbiAgY29uZmlnOiBQYWNrYWdlQ29uZmlnLFxuICByb290Q29uZmlnOiBQYWNrYWdlQ29uZmlnLFxuICBqc29uT2JqOiBXcml0YWJsZVBhY2thZ2VKc29uLFxuICBkZXBlbmRlbmN5VXBkYXRlczogRGVwZW5kZW5jeVVwZGF0ZXNcbik6IFByb21pc2U8dm9pZD4ge1xuICBpZiAoIWpzb25PYmoubmFtZSkge1xuICAgIGpzb25PYmoubmFtZSA9IHBhdGguYmFzZW5hbWUoY29uZmlnLmRpclBhdGgpO1xuICB9XG5cbiAgLy8gRXhwbGljaXQgcm9vdCBwdWJsaXNoaW5nIGludGVudCB0YWtlcyBwcmVjZWRlbmNlIG92ZXIgd2JmeSdzIHByaXZhdGUgbW9ub3JlcG8tcm9vdCBkZWZhdWx0LlxuICBpZiAoY29uZmlnLmRvZXNDb250YWluU3ViUGFja2FnZUpzb25zICYmIChjb25maWcucmVsZWFzZS5ucG1QdWJsaXNoZXNSb290IHx8IGpzb25PYmoucHVibGlzaENvbmZpZykpIHtcbiAgICBkZWxldGUganNvbk9iai5wcml2YXRlO1xuICB9IGVsc2UgaWYgKGNvbmZpZy5kb2VzQ29udGFpblN1YlBhY2thZ2VKc29ucyAmJiAhY29uZmlnLnJlbGVhc2UubnBtICYmICFqc29uT2JqLnB1Ymxpc2hDb25maWcpIHtcbiAgICBqc29uT2JqLnByaXZhdGUgPSB0cnVlO1xuICB9XG4gIGlmICghanNvbk9iai5saWNlbnNlKSB7XG4gICAganNvbk9iai5saWNlbnNlID0gJ1VOTElDRU5TRUQnO1xuICB9XG4gIGlmICghanNvbk9iai5wcml2YXRlICYmIGpzb25PYmoubGljZW5zZSAhPT0gJ1VOTElDRU5TRUQnICYmIHJvb3RDb25maWcuaXNQdWJsaWNSZXBvKSB7XG4gICAganNvbk9iai5wdWJsaXNoQ29uZmlnID8/PSB7fTtcbiAgICBqc29uT2JqLnB1Ymxpc2hDb25maWcuYWNjZXNzID8/PSAncHVibGljJztcbiAgICAvLyBXaXRob3V0IGFuIGV4cGxpY2l0IHJlZ2lzdHJ5LCBucG0gcmVzb2x2ZXMgdGhlIHB1Ymxpc2ggdGFyZ2V0IGZyb20gdGhlIHdvcmtzcGFjZSAubnBtcmMsXG4gICAgLy8gd2hvc2UgZGVmYXVsdCByZWdpc3RyeSBvbiBDSSBtYXkgYmUgdGhlIFRha3VtaSBHdWFyZCBpbnN0YWxsIHByb3h5IOKAlCB3aGljaCByZWplY3RzXG4gICAgLy8gYG5wbSBwdWJsaXNoYCB3aXRoIDQwNSAoc2hhcmVkIzEwNzIpLiBgPz89YCBrZWVwcyBhIGRlbGliZXJhdGVseSBkaWZmZXJlbnQgcmVnaXN0cnkuXG4gICAganNvbk9iai5wdWJsaXNoQ29uZmlnLnJlZ2lzdHJ5ID8/PSAnaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvJztcbiAgfVxuICBjb25zdCBvd25lciA9IGNvbmZpZy5yZXBvQXV0aG9yO1xuICBpZiAob3duZXIgPT09ICdXaWxsQm9vc3RlcicgfHwgb3duZXIgPT09ICdXaWxsQm9vc3RlckxhYicpIHtcbiAgICBqc29uT2JqLmF1dGhvciA9ICdXaWxsQm9vc3RlciBJbmMuJztcbiAgfVxuICBhd2FpdCBub3JtYWxpemVQdWJsaXNoZWRDb25maWdQYWNrYWdlTWV0YWRhdGEoY29uZmlnLCBqc29uT2JqKTtcbiAgaWYgKCFjb25maWcuaXNSb290ICYmIGpzb25PYmoucHJpdmF0ZSAmJiAhanNvbk9iai5tYWluKSB7XG4gICAgLy8gTWFrZSBWU0NvZGUgcG9zc2libGUgdG8gcmVmYWN0b3IgY29kZSBhY3Jvc3Mgc3VicGFja2FnZXMuXG4gICAganNvbk9iai5tYWluID0gJy4vc3JjJztcbiAgfVxuXG4gIGlmICghY29uZmlnLmRvZXNDb250YWluU3ViUGFja2FnZUpzb25zKSB7XG4gICAgaWYgKGNvbmZpZy5kb2VzQ29udGFpblB1YnNwZWNZYW1sKSB7XG4gICAgICBqc29uT2JqLnNjcmlwdHMubGludCA9ICdmbHV0dGVyIGFuYWx5emUnO1xuICAgICAganNvbk9iai5zY3JpcHRzWydsaW50LWZpeCddID0gJ2J1biBydW4gbGludCc7XG4gICAgICBjb25zdCBkaXJzID0gWydsaWInLCAndGVzdCcsICd0ZXN0X2RyaXZlciddLmZpbHRlcigoZGlyKSA9PiBmcy5leGlzdHNTeW5jKHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgZGlyKSkpO1xuICAgICAgaWYgKGRpcnMubGVuZ3RoID4gMCkge1xuICAgICAgICBqc29uT2JqLnNjcmlwdHNbJ2Zvcm1hdC1jb2RlJ10gPSBgZGFydCBmb3JtYXQgJChmaW5kICR7ZGlycy5qb2luKFxuICAgICAgICAgICcgJ1xuICAgICAgICApfSAtbmFtZSBnZW5lcmF0ZWQgLXBydW5lIC1vIC1uYW1lICcqLmZyZWV6ZWQuZGFydCcgLXBydW5lIC1vIC1uYW1lICcqLmcuZGFydCcgLXBydW5lIC1vIC1uYW1lICcqLmRhcnQnIC1wcmludClgO1xuICAgICAgICBqc29uT2JqLnNjcmlwdHMuZm9ybWF0ID0gYXBwZW5kRm9ybWF0Q29kZUNvbW1hbmQoanNvbk9iai5zY3JpcHRzLmZvcm1hdCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgcHl0aG9uUGFja2FnZU1hbmFnZXIgPSBnZXRQeXRob25QYWNrYWdlTWFuYWdlcihjb25maWcpO1xuICAgIGlmIChweXRob25QYWNrYWdlTWFuYWdlcikge1xuICAgICAgY29uc3Qgc2NyaXB0UnVubmVyID0gJ2J1biBydW4nO1xuICAgICAganNvbk9iai5zY3JpcHRzWydjb21tb24vY2ktc2V0dXAnXSA9IGAke3NjcmlwdFJ1bm5lcn0gc2V0dXAtJHtweXRob25QYWNrYWdlTWFuYWdlcn1gO1xuICAgICAgZGVsZXRlIGpzb25PYmouc2NyaXB0c1tgc2V0dXAtJHtweXRob25QYWNrYWdlTWFuYWdlciA9PT0gJ3BvZXRyeScgPyAndXYnIDogJ3BvZXRyeSd9YF07XG4gICAgICBqc29uT2JqLnNjcmlwdHNbYHNldHVwLSR7cHl0aG9uUGFja2FnZU1hbmFnZXJ9YF0gPSBnZXRQeXRob25TZXR1cENvbW1hbmQocHl0aG9uUGFja2FnZU1hbmFnZXIpO1xuICAgICAgY29uc3QgcHl0aG9uRmlsZXMgPSBhd2FpdCBmZy5nbG9iKCcqKi8qLnB5Jywge1xuICAgICAgICBjd2Q6IGNvbmZpZy5kaXJQYXRoLFxuICAgICAgICBkb3Q6IHRydWUsXG4gICAgICAgIGlnbm9yZTogZ2xvYklnbm9yZSxcbiAgICAgIH0pO1xuICAgICAgY29uc3QgZGlyTmFtZVNldCA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICAgICAgZm9yIChjb25zdCBweXRob25GaWxlIG9mIHB5dGhvbkZpbGVzKSB7XG4gICAgICAgIGNvbnN0IFtmaXJzdCwgc2Vjb25kXSA9IHB5dGhvbkZpbGUuc3BsaXQoJy8nKTtcbiAgICAgICAgaWYgKGZpcnN0ICYmIHNlY29uZCkge1xuICAgICAgICAgIGRpck5hbWVTZXQuYWRkKGZpcnN0KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKGRpck5hbWVTZXQuc2l6ZSA+IDApIHtcbiAgICAgICAgY29uc3QgZGlyTmFtZXNTdHIgPSBbLi4uZGlyTmFtZVNldF0uam9pbignICcpO1xuICAgICAgICBjb25zdCBweXRob25SdW5uZXIgPSBgJHtweXRob25QYWNrYWdlTWFuYWdlcn0gcnVuYDtcbiAgICAgICAganNvbk9iai5zY3JpcHRzWydmb3JtYXQtY29kZSddID1cbiAgICAgICAgICBgJHtweXRob25SdW5uZXJ9IGlzb3J0IC0tcHJvZmlsZSBibGFjayAke2Rpck5hbWVzU3RyfSAmJiAke3B5dGhvblJ1bm5lcn0gYmxhY2sgJHtkaXJOYW1lc1N0cn1gO1xuICAgICAgICBpZiAoanNvbk9iai5zY3JpcHRzLmxpbnQpIHtcbiAgICAgICAgICBqc29uT2JqLnNjcmlwdHMubGludCA9IGAke3B5dGhvblJ1bm5lcn0gZmxha2U4ICR7ZGlyTmFtZXNTdHJ9ICYmICR7anNvbk9iai5zY3JpcHRzLmxpbnR9YDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBqc29uT2JqLnNjcmlwdHMubGludCA9IGAke3B5dGhvblJ1bm5lcn0gZmxha2U4ICR7ZGlyTmFtZXNTdHJ9YDtcbiAgICAgICAgICBqc29uT2JqLnNjcmlwdHNbJ2xpbnQtZml4J10gPSBgJHtzY3JpcHRSdW5uZXJ9IGxpbnRgO1xuICAgICAgICB9XG4gICAgICAgIGpzb25PYmouc2NyaXB0cy5mb3JtYXQgPSBhcHBlbmRGb3JtYXRDb2RlQ29tbWFuZChqc29uT2JqLnNjcmlwdHMuZm9ybWF0KTtcbiAgICAgICAgZGVwZW5kZW5jeVVwZGF0ZXMucHl0aG9uRGV2RGVwZW5kZW5jaWVzLnB1c2goJ2JsYWNrJywgJ2lzb3J0JywgJ2ZsYWtlOCcpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGlmIChjb25maWcucmVwb3NpdG9yeSB8fCBqc29uT2JqLnJlcG9zaXRvcnkpIHtcbiAgICBqc29uT2JqLnJlcG9zaXRvcnkgPSBmb3JtYXRSZXBvc2l0b3J5Rm9yUGFja2FnZUpzb24oY29uZmlnLnJlcG9zaXRvcnkgPz8ganNvbk9iai5yZXBvc2l0b3J5LCBqc29uT2JqLnJlcG9zaXRvcnkpO1xuICB9XG5cbiAgY29uc3QgZ2VuQ29kZVNjcmlwdCA9IGpzb25PYmouc2NyaXB0c1snZ2VuLWNvZGUnXTtcbiAgaWYgKHNob3VsZEdlbmVyYXRlV2JHZW5Db2RlU2NyaXB0KGNvbmZpZykpIHtcbiAgICAvLyBQcmVzZXJ2ZSBwcm9qZWN0LXNwZWNpZmljIHN0ZXBzIGEgcmVwbyBhcHBlbmRlZCB0byB0aGUgbWFuYWdlZCBgYnVuIHdiIGdlbi1jb2RlYCAoZS5nLiBidWlsZGluZyBleHRyYSBkZXBsb3lcbiAgICAvLyBhc3NldHMpIGluc3RlYWQgb2YgZGlzY2FyZGluZyB0aGVtOyBvbmx5IHRoZSBtYW5hZ2VkIGdlbi1jb2RlIHNlZ21lbnQgaXMgd2JmeSdzIHRvXG4gICAgLy8gcmVnZW5lcmF0ZS4gQW4gdW5wYXJzZWFibGUgc2NyaXB0IGlzIGxlZnQgYWxvbmUgcmF0aGVyIHRoYW4gcmV3cml0dGVuIGZyb20gYSB3cm9uZyBwYXJzZS5cbiAgICBjb25zdCBzZWdtZW50cyA9IGdlbkNvZGVTY3JpcHQgPT09IHVuZGVmaW5lZCA/IFtdIDogc3BsaXRTY3JpcHRTZWdtZW50cyhnZW5Db2RlU2NyaXB0KTtcbiAgICBjb25zdCBjdXN0b21TZWdtZW50cyA9IHNlZ21lbnRzPy5maWx0ZXIoXG4gICAgICAoc2VnbWVudCkgPT4gY2xhc3NpZnlTY3JpcHRTZWdtZW50KHNlZ21lbnQsIGpzb25PYmouc2NyaXB0cywgdHJ1ZSkgPT09ICdjdXN0b20nXG4gICAgKTtcbiAgICBpZiAoY3VzdG9tU2VnbWVudHMpIHtcbiAgICAgIGpzb25PYmouc2NyaXB0c1snZ2VuLWNvZGUnXSA9IFsnYnVuIHdiIGdlbi1jb2RlJywgLi4uY3VzdG9tU2VnbWVudHNdLmpvaW4oJyAmJiAnKTtcbiAgICB9XG4gIH1cbiAgdXBkYXRlUG9zdGluc3RhbGxTY3JpcHQoanNvbk9iai5zY3JpcHRzLCBnZW5lcmF0ZXNXb3JrZXJUeXBlcyhjb25maWcpKTtcbn1cblxuZnVuY3Rpb24gc2hvdWxkR2VuZXJhdGVXYkdlbkNvZGVTY3JpcHQoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogYm9vbGVhbiB7XG4gIHJldHVybiBjb25maWcuZGVwZW5kaW5nLmJsaXR6IHx8IGNvbmZpZy5kZXBlbmRpbmcuY2hha3JhIHx8IGNvbmZpZy5kZXBlbmRpbmcuZ2VuSTE4blRzIHx8IGNvbmZpZy5kZXBlbmRpbmcucHJpc21hO1xufVxuXG5mdW5jdGlvbiBhcHBlbmRGb3JtYXRDb2RlQ29tbWFuZChmb3JtYXRTY3JpcHQ6IHN0cmluZyB8IHVuZGVmaW5lZCk6IHN0cmluZyB7XG4gIHJldHVybiBmb3JtYXRTY3JpcHQgPyBgJHtmb3JtYXRTY3JpcHR9ICYmIGJ1biBydW4gZm9ybWF0LWNvZGVgIDogJ2J1biBydW4gZm9ybWF0LWNvZGUnO1xufVxuXG5hc3luYyBmdW5jdGlvbiBub3JtYWxpemVQdWJsaXNoZWRDb25maWdQYWNrYWdlTWV0YWRhdGEoXG4gIGNvbmZpZzogUGFja2FnZUNvbmZpZyxcbiAganNvbk9iajogV3JpdGFibGVQYWNrYWdlSnNvblxuKTogUHJvbWlzZTx2b2lkPiB7XG4gIGlmICghaXNQdWJsaXNoZWRXaWxsYm9vc3RlckNvbmZpZ3NQYWNrYWdlKGNvbmZpZykpIHJldHVybjtcblxuICBjb25zdCBjb25maWdNanNQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnY29uZmlnLm1qcycpO1xuICBpZiAoIWZzLmV4aXN0c1N5bmMoY29uZmlnTWpzUGF0aCkpIHJldHVybjtcblxuICBqc29uT2JqLnR5cGUgPSAnbW9kdWxlJztcblxuICBjb25zdCBjb25maWdEdHNQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnY29uZmlnLmQudHMnKTtcbiAgaWYgKCFmcy5leGlzdHNTeW5jKGNvbmZpZ0R0c1BhdGgpKSByZXR1cm47XG5cbiAganNvbk9iai5maWxlcyA9IFsuLi5uZXcgU2V0KFsuLi4oanNvbk9iai5maWxlcyA/PyBbXSksICdjb25maWcuZC5tdHMnXSldO1xuICAvLyBOb2RlTmV4dCByZXNvbHZlcyBhIHJlbGF0aXZlIGAuL2NvbmZpZy5tanNgIGltcG9ydCB0byBgY29uZmlnLmQubXRzYCwgbm90XG4gIC8vIHRoZSBwYWNrYWdlLWxldmVsIGB0eXBlc2AgZmllbGQuIEtlZXAgdGhlIHB1Ymxpc2hlZCBjb25maWcgaW1wb3J0YWJsZSBmcm9tXG4gIC8vIHBhY2thZ2UtbG9jYWwgVHlwZVNjcmlwdCBsaW50ZXIgc2V0dGluZ3MuXG4gIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiBmc1V0aWwuZ2VuZXJhdGVGaWxlKHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJ2NvbmZpZy5kLm10cycpLCBjb25maWdEbXRzQ29udGVudCkpO1xufVxuXG5jb25zdCBjb25maWdEbXRzQ29udGVudCA9IGBleHBvcnQgeyBkZWZhdWx0IH0gZnJvbSAnLi9jb25maWcuanMnO1xuYDtcblxuZnVuY3Rpb24gYWRkRGVwZW5kZW5jeVZlcnNpb25zVG9QYWNrYWdlSnNvbihcbiAgY29uZmlnOiBQYWNrYWdlQ29uZmlnLFxuICByb290Q29uZmlnOiBQYWNrYWdlQ29uZmlnLFxuICBqc29uT2JqOiBXcml0YWJsZVBhY2thZ2VKc29uLFxuICBkZXBlbmRlbmN5VXBkYXRlczogRGVwZW5kZW5jeVVwZGF0ZXMsXG4gIHNraXBBZGRpbmdEZXBzOiBib29sZWFuXG4pOiB2b2lkIHtcbiAgY29uc3QgcGFja2FnZUpzb25EZXBlbmRlbmNpZXMgPSBqc29uT2JqLmRlcGVuZGVuY2llcztcbiAgY29uc3QgcGFja2FnZUpzb25EZXZEZXBlbmRlbmNpZXMgPSBqc29uT2JqLmRldkRlcGVuZGVuY2llcztcbiAgZGVwZW5kZW5jeVVwZGF0ZXMuZGVwZW5kZW5jaWVzID0gYWRkUGFja2FnZUpzb25EZXBlbmRlbmNpZXMoXG4gICAgY29uZmlnLFxuICAgIHJvb3RDb25maWcsXG4gICAganNvbk9iaixcbiAgICBwYWNrYWdlSnNvbkRlcGVuZGVuY2llcyxcbiAgICBbLi4uZGVwZW5kZW5jeVVwZGF0ZXMuZGVwZW5kZW5jaWVzLCAuLi5nZXRFeGlzdGluZ01hbmFnZWREZXBlbmRlbmNpZXMocGFja2FnZUpzb25EZXBlbmRlbmNpZXMsIGpzb25PYmopXSxcbiAgICBza2lwQWRkaW5nRGVwc1xuICApO1xuICBkZXBlbmRlbmN5VXBkYXRlcy5kZXZEZXBlbmRlbmNpZXMgPSBkZXBlbmRlbmN5VXBkYXRlcy5kZXZEZXBlbmRlbmNpZXMuZmlsdGVyKChkZXApID0+ICFwYWNrYWdlSnNvbkRlcGVuZGVuY2llc1tkZXBdKTtcbiAgZGVwZW5kZW5jeVVwZGF0ZXMuZGV2RGVwZW5kZW5jaWVzID0gYWRkUGFja2FnZUpzb25EZXBlbmRlbmNpZXMoXG4gICAgY29uZmlnLFxuICAgIHJvb3RDb25maWcsXG4gICAganNvbk9iaixcbiAgICBwYWNrYWdlSnNvbkRldkRlcGVuZGVuY2llcyxcbiAgICBbLi4uZGVwZW5kZW5jeVVwZGF0ZXMuZGV2RGVwZW5kZW5jaWVzLCAuLi5nZXRFeGlzdGluZ01hbmFnZWREZXBlbmRlbmNpZXMocGFja2FnZUpzb25EZXZEZXBlbmRlbmNpZXMsIGpzb25PYmopXSxcbiAgICBza2lwQWRkaW5nRGVwc1xuICApO1xufVxuXG5mdW5jdGlvbiBnZXRFeGlzdGluZ01hbmFnZWREZXBlbmRlbmNpZXMoXG4gIHBhY2thZ2VKc29uRGVwZW5kZW5jaWVzOiBQYXJ0aWFsPFJlY29yZDxzdHJpbmcsIHN0cmluZz4+LFxuICBqc29uT2JqOiBQYWNrYWdlSnNvblxuKTogc3RyaW5nW10ge1xuICByZXR1cm4gT2JqZWN0LmtleXMocGFja2FnZUpzb25EZXBlbmRlbmNpZXMpLmZpbHRlcihcbiAgICAoZGVwZW5kZW5jeSkgPT5cbiAgICAgIG1hbmFnZWREZXBlbmRlbmN5TmFtZXMuaGFzKGRlcGVuZGVuY3kpICYmXG4gICAgICAvLyBBIHB1YmxpYyBwYWNrYWdlJ3MgYHdvcmtzcGFjZTpgIHNwZWNpZmllciBtdXN0IG5ldmVyIGJlIHJlLW1hbmFnZWQgdmlhIGEgcmVnaXN0cnkgaW5zdGFsbFxuICAgICAgLy8gKHByaXZhdGUgb25lcyBhcmUgbm9ybWFsaXplZCB0byBgd29ya3NwYWNlOipgIGxhdGVyKS4gVGhpcyBhbHNvIGNvdmVycyBydW5uaW5nIHdiZnkgb24gYVxuICAgICAgLy8gbW9ub3JlcG8gU1VCRElSRUNUT1JZLCB3aGVyZSB0aGUgcGFyZW50J3Mgd29ya3NwYWNlcyBhcmUgaW52aXNpYmxlIGFuZCB0aGUgd29ya3NwYWNlLW1hcFxuICAgICAgLy8gZ3VhcmQgaW4gYWRkUGFja2FnZUpzb25EZXBlbmRlbmNpZXMgY2Fubm90IHByb3RlY3QgdGhlIHNwZWNpZmllci5cbiAgICAgIChqc29uT2JqLnByaXZhdGUgfHwgIXBhY2thZ2VKc29uRGVwZW5kZW5jaWVzW2RlcGVuZGVuY3ldPy5zdGFydHNXaXRoKCd3b3Jrc3BhY2U6JykpXG4gICk7XG59XG5cbmZ1bmN0aW9uIHJlbW92ZUVtcHR5RGVwZW5kZW5jeVNlY3Rpb25zKGpzb25PYmo6IFBhY2thZ2VKc29uKTogdm9pZCB7XG4gIGZvciAoY29uc3Qga2V5IG9mIGRlcGVuZGVuY3lTZWN0aW9uS2V5cykge1xuICAgIGNvbnN0IHNlY3Rpb24gPSBqc29uT2JqW2tleV07XG4gICAgaWYgKHNlY3Rpb24gJiYgT2JqZWN0LmtleXMoc2VjdGlvbikubGVuZ3RoID09PSAwKSB7XG4gICAgICBSZWZsZWN0LmRlbGV0ZVByb3BlcnR5KGpzb25PYmosIGtleSk7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGluc3RhbGxEZXBlbmRlbmN5VXBkYXRlcyhcbiAgY29uZmlnOiBQYWNrYWdlQ29uZmlnLFxuICByb290Q29uZmlnOiBQYWNrYWdlQ29uZmlnLFxuICBqc29uT2JqOiBQYWNrYWdlSnNvbixcbiAgZGVwZW5kZW5jeVVwZGF0ZXM6IERlcGVuZGVuY3lVcGRhdGVzXG4pOiB2b2lkIHtcbiAgaWYgKGNvbmZpZy5kb2VzQ29udGFpblBhY2thZ2VKc29uKSB7XG4gICAgY29uc3QgZGVwZW5kZW5jaWVzID0gZGVwZW5kZW5jeVVwZGF0ZXMuZGVwZW5kZW5jaWVzLmZpbHRlcigoZGVwKSA9PiAhanNvbk9iai5kZXZEZXBlbmRlbmNpZXM/LltkZXBdKTtcbiAgICBpbnN0YWxsTnBtRGVwZW5kZW5jaWVzKGNvbmZpZywgcm9vdENvbmZpZywgZGVwZW5kZW5jaWVzLCBmYWxzZSk7XG5cbiAgICBjb25zdCBkZXZEZXBlbmRlbmNpZXMgPSBkZXBlbmRlbmN5VXBkYXRlcy5kZXZEZXBlbmRlbmNpZXMuZmlsdGVyKChkZXApID0+ICFqc29uT2JqLmRlcGVuZGVuY2llcz8uW2RlcF0pO1xuICAgIGluc3RhbGxOcG1EZXBlbmRlbmNpZXMoY29uZmlnLCByb290Q29uZmlnLCBkZXZEZXBlbmRlbmNpZXMsIHRydWUpO1xuICB9XG5cbiAgY29uc3QgcHl0aG9uUGFja2FnZU1hbmFnZXIgPSBnZXRQeXRob25QYWNrYWdlTWFuYWdlcihjb25maWcpO1xuICBpZiAocHl0aG9uUGFja2FnZU1hbmFnZXIgJiYgZGVwZW5kZW5jeVVwZGF0ZXMucHl0aG9uRGV2RGVwZW5kZW5jaWVzLmxlbmd0aCA+IDApIHtcbiAgICBjb25zdCBkZXBlbmRlbmNpZXMgPSBbLi4ubmV3IFNldChkZXBlbmRlbmN5VXBkYXRlcy5weXRob25EZXZEZXBlbmRlbmNpZXMpXTtcbiAgICBpZiAocHl0aG9uUGFja2FnZU1hbmFnZXIgPT09ICdwb2V0cnknKSB7XG4gICAgICBzcGF3blN5bmMoJ3BvZXRyeScsIFsnYWRkJywgJy0tZ3JvdXAnLCAnZGV2JywgLi4uZGVwZW5kZW5jaWVzXSwgY29uZmlnLmRpclBhdGgpO1xuICAgIH0gZWxzZSB7XG4gICAgICBzcGF3blN5bmMoJ3V2JywgWydhZGQnLCAnLS1kZXYnLCAuLi5kZXBlbmRlbmNpZXNdLCBjb25maWcuZGlyUGF0aCk7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGdldFB5dGhvblBhY2thZ2VNYW5hZ2VyKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6ICdwb2V0cnknIHwgJ3V2JyB8IHVuZGVmaW5lZCB7XG4gIGlmIChjb25maWcuZG9lc0NvbnRhaW5VdkxvY2spIHJldHVybiAndXYnO1xuICBpZiAoY29uZmlnLmRvZXNDb250YWluUG9ldHJ5TG9jaykgcmV0dXJuICdwb2V0cnknO1xufVxuXG5mdW5jdGlvbiBnZXRQeXRob25TZXR1cENvbW1hbmQocGFja2FnZU1hbmFnZXI6ICdwb2V0cnknIHwgJ3V2Jyk6IHN0cmluZyB7XG4gIGlmIChwYWNrYWdlTWFuYWdlciA9PT0gJ3V2JykgcmV0dXJuICd1diBzeW5jIC0tZnJvemVuJztcbiAgLy8gYG1pc2Ugd2hpY2ggcHl0aG9uYCB5aWVsZHMgdGhlIHNpbmdsZSBhY3RpdmUgaW50ZXJwcmV0ZXIgcGF0aDsgYG1pc2UgY3VycmVudCBweXRob25gIGNhblxuICAvLyBwcmludCBtdWx0aXBsZSBzcGFjZS1zZXBhcmF0ZWQgdmVyc2lvbnMgKG1pc2Ugc3VwcG9ydHMgbXVsdGktdmVyc2lvbiBwaW5zKSwgd2hpY2ggd291bGQgcGFzc1xuICAvLyBleHRyYSBwb3NpdGlvbmFsIGFyZ3VtZW50cyB0byBgcG9ldHJ5IGVudiB1c2VgLiBXaGVuIG1pc2UgaXMgbWlzc2luZyBvciBweXRob24gaXNcbiAgLy8gdW5jb25maWd1cmVkLCBza2lwIGBwb2V0cnkgZW52IHVzZWAgYW5kIGZhbGwgYmFjayB0byBwb2V0cnkncyBkZWZhdWx0IGludGVycHJldGVyIGluc3RlYWQgb2ZcbiAgLy8gYWJvcnRpbmcgdGhlIGNoYWluLlxuICAvLyBUaGUgYHx8IHRydWVgIGNvdmVycyBvbmx5IHRoZSBtaXNlIHJlc29sdXRpb246IGEgbWlzc2luZy91bmNvbmZpZ3VyZWQgbWlzZSBmYWxscyBiYWNrIHRvXG4gIC8vIHBvZXRyeSdzIGRlZmF1bHQgaW50ZXJwcmV0ZXIsIHdoaWxlIGEgZmFpbGluZyBgcG9ldHJ5IGVudiB1c2VgIHN0aWxsIGFib3J0cyB0aGUgY2hhaW4uXG4gIHJldHVybiAncG9ldHJ5IGNvbmZpZyB2aXJ0dWFsZW52cy5pbi1wcm9qZWN0IHRydWUgJiYgeyBweXRob25fcGF0aD1cIiQobWlzZSB3aGljaCBweXRob24gMj4vZGV2L251bGwpXCIgfHwgdHJ1ZTsgfSAmJiB7IFsgLXogXCIkcHl0aG9uX3BhdGhcIiBdIHx8IHBvZXRyeSBlbnYgdXNlIFwiJHB5dGhvbl9wYXRoXCI7IH0gJiYgcG9ldHJ5IHJ1biBwaXAgaW5zdGFsbCAtLXVwZ3JhZGUgcGlwICYmIHBvZXRyeSBpbnN0YWxsJztcbn1cblxuZnVuY3Rpb24gaW5zdGFsbE5wbURlcGVuZGVuY2llcyhcbiAgY29uZmlnOiBQYWNrYWdlQ29uZmlnLFxuICByb290Q29uZmlnOiBQYWNrYWdlQ29uZmlnLFxuICBkZXBlbmRlbmNpZXM6IHN0cmluZ1tdLFxuICBkZXY6IGJvb2xlYW5cbik6IHZvaWQge1xuICBpZiAoZGVwZW5kZW5jaWVzLmxlbmd0aCA9PT0gMCkgcmV0dXJuO1xuXG4gIGNvbnN0IGRlcGVuZGVuY3lTcGVjaWZpZXJzID0gW1xuICAgIC4uLm5ldyBTZXQoZGVwZW5kZW5jaWVzLm1hcCgoZGVwZW5kZW5jeSkgPT4gZ2V0SW5zdGFsbERlcGVuZGVuY3lTcGVjaWZpZXIoY29uZmlnLCByb290Q29uZmlnLCBkZXBlbmRlbmN5KSkpLFxuICBdO1xuICBzcGF3blN5bmMoJ2J1bicsIFsnYWRkJywgLi4uKGRldiA/IFsnLUQnXSA6IFtdKSwgJy0tZXhhY3QnLCAuLi5kZXBlbmRlbmN5U3BlY2lmaWVyc10sIGNvbmZpZy5kaXJQYXRoKTtcbn1cblxuZnVuY3Rpb24gYWRkUGFja2FnZUpzb25EZXBlbmRlbmNpZXMoXG4gIGNvbmZpZzogUGFja2FnZUNvbmZpZyxcbiAgcm9vdENvbmZpZzogUGFja2FnZUNvbmZpZyxcbiAganNvbk9iajogV3JpdGFibGVQYWNrYWdlSnNvbixcbiAgcGFja2FnZUpzb25EZXBlbmRlbmNpZXM6IFBhcnRpYWw8UmVjb3JkPHN0cmluZywgc3RyaW5nPj4sXG4gIGRlcGVuZGVuY2llczogc3RyaW5nW10sXG4gIHNraXBBZGRpbmdEZXBzOiBib29sZWFuXG4pOiBzdHJpbmdbXSB7XG4gIGNvbnN0IGRlcGVuZGVuY2llc1RvSW5zdGFsbDogc3RyaW5nW10gPSBbXTtcbiAgZm9yIChjb25zdCBkZXBlbmRlbmN5IG9mIG5ldyBTZXQoZGVwZW5kZW5jaWVzKSkge1xuICAgIC8vIEEgcHJpdmF0ZSBwYWNrYWdlIHdob3NlIG1vbm9yZXBvIGNvbnRhaW5zIHRoaXMgZGVwZW5kZW5jeSBhcyBhIHdvcmtzcGFjZSBtdXN0IHJlZmVyZW5jZSBpdFxuICAgIC8vIHZpYSB0aGUgd29ya3NwYWNlIHByb3RvY29sOiBwaW5uaW5nIGEgcmVnaXN0cnkgdmVyc2lvbiBtYWtlcyBCdW4gc2hhZG93IHRoZSBzYW1lLW5hbWVcbiAgICAvLyB3b3Jrc3BhY2UgYW5kIHNraXAgaW5zdGFsbGluZyB0aGUgd29ya3NwYWNlJ3Mgb3duIGRlcGVuZGVuY2llcy4gKFB1Ymxpc2hlZCBwYWNrYWdlcyBpbnN0ZWFkXG4gICAgLy8gcGluIGEgY29uY3JldGUgdmVyc2lvbiBiZWNhdXNlIGBucG0gcHVibGlzaGAgcmVqZWN0cyBgd29ya3NwYWNlOipgIHNwZWNpZmllcnMg4oCUIGJ1dCBhblxuICAgIC8vIEVYSVNUSU5HIGB3b3Jrc3BhY2U6YCBkZWNsYXJhdGlvbiBpcyBhbHdheXMga2VwdDogb3ZlcndyaXRpbmcgaXQgd2l0aCBhIHJlZ2lzdHJ5IHJlbGVhc2VcbiAgICAvLyB3b3VsZCBzaWxlbnRseSBicmVhayB0aGUgbG9jYWwgd29ya3NwYWNlIGxpbmsuKVxuXG4gICAgLy8gQSBkZWNsYXJlZCBgd29ya3NwYWNlOmAgc3BlY2lmaWVyIGFsd2F5cyB3aW5zLCB3aGV0aGVyIG9yIG5vdCB0aGUgd29ya3NwYWNlIG1hcCBzZWVzIHRoZVxuICAgIC8vIHBhY2thZ2U6IHJ1bm5pbmcgd2JmeSBvbiBhIG1vbm9yZXBvIFNVQkRJUkVDVE9SWSBoaWRlcyB0aGUgcGFyZW50J3Mgd29ya3NwYWNlcywgc28gdGhlIG1hcFxuICAgIC8vIGFsb25lIGNhbm5vdCBiZSB0cnVzdGVkIHRvIGRldGVjdCBhIGxvY2FsIHdvcmtzcGFjZSBsaW5rLlxuICAgIGlmIChwYWNrYWdlSnNvbkRlcGVuZGVuY2llc1tkZXBlbmRlbmN5XT8uc3RhcnRzV2l0aCgnd29ya3NwYWNlOicpKSB7XG4gICAgICBpZiAoanNvbk9iai5wcml2YXRlKSB7XG4gICAgICAgIHBhY2thZ2VKc29uRGVwZW5kZW5jaWVzW2RlcGVuZGVuY3ldID0gJ3dvcmtzcGFjZToqJztcbiAgICAgIH1cbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBpZiAoanNvbk9iai5wcml2YXRlICYmIGdldFdvcmtzcGFjZVBhY2thZ2VEaXJzKHJvb3RDb25maWcpLmhhcyhkZXBlbmRlbmN5KSkge1xuICAgICAgY29uc3QgZXhpc3RpbmdTcGVjaWZpZXIgPSBwYWNrYWdlSnNvbkRlcGVuZGVuY2llc1tkZXBlbmRlbmN5XTtcbiAgICAgIGlmICghZXhpc3RpbmdTcGVjaWZpZXIgfHwgZXhpc3RpbmdTcGVjaWZpZXIuc3RhcnRzV2l0aCgnd29ya3NwYWNlOicpKSB7XG4gICAgICAgIHBhY2thZ2VKc29uRGVwZW5kZW5jaWVzW2RlcGVuZGVuY3ldID0gJ3dvcmtzcGFjZToqJztcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICAvLyBBbiBleGlzdGluZyBDT05DUkVURSBwaW4gb24gYSB3b3Jrc3BhY2UgcGFja2FnZSBpcyBhIGRlbGliZXJhdGUgY2hvaWNlIGFuZCBtdXN0IG5vdCBiZVxuICAgICAgLy8gY29udmVydGVkIHRvIHRoZSB3b3Jrc3BhY2UgcHJvdG9jb2wuIE5vdGUgdGhlIHRyYWRlLW9mZiBlaXRoZXIgd2F5OiBucG0gKHdoaWNoXG4gICAgICAvLyBzZW1hbnRpYy1yZWxlYXNlJ3MgbnBtIHBsdWdpbiBzaGVsbHMgb3V0IHRvKSBjYW5ub3QgcGFyc2UgYHdvcmtzcGFjZTpgIHNwZWNpZmllcnMsIHdoaWxlXG4gICAgICAvLyBhIHJlZ2lzdHJ5IHBpbiBtYWtlcyBhIGNvbGQgYnVuIGluc3RhbGwgc2hhZG93IHRoZSB3b3Jrc3BhY2UgYW5kIHNraXAgaXRzIGRlcGVuZGVuY2llcyDigJRcbiAgICAgIC8vIFdpbGxCb29zdGVyL3NoYXJlZCBrZWVwcyBgd29ya3NwYWNlOipgIGFuZCBzdHJpcHMgdGhlIHByb3RvY29sIG9uIHRoZSBDSSBjaGVja291dCByaWdodFxuICAgICAgLy8gYmVmb3JlIHJlbGVhc2luZyAoc2NyaXB0cy9zdHJpcFdvcmtzcGFjZVByb3RvY29sLm1qcykuIEZhbGwgdGhyb3VnaCBzbyBhIGNvbmNyZXRlIHBpblxuICAgICAgLy8ga2VlcHMgYmVpbmcgYnVtcGVkIGxpa2UgYW55IG1hbmFnZWQgZGVwZW5kZW5jeS5cbiAgICB9XG4gICAgY29uc3Qgc2hvdWxkVXBkYXRlRXhpc3RpbmdEZXBlbmRlbmN5ID0gc2hvdWxkVXBkYXRlRXhpc3RpbmdNYW5hZ2VkRGVwZW5kZW5jeShcbiAgICAgIGNvbmZpZyxcbiAgICAgIHJvb3RDb25maWcsXG4gICAgICBkZXBlbmRlbmN5LFxuICAgICAgcGFja2FnZUpzb25EZXBlbmRlbmNpZXNbZGVwZW5kZW5jeV1cbiAgICApO1xuICAgIGlmIChzaG91bGRVcGRhdGVFeGlzdGluZ0RlcGVuZGVuY3kpIHtcbiAgICAgIGNvbnN0IG1hbmFnZWRWZXJzaW9uID0gZ2V0TWFuYWdlZERlcGVuZGVuY3lWZXJzaW9uKGNvbmZpZywgcm9vdENvbmZpZywgZGVwZW5kZW5jeSk7XG4gICAgICBpZiAoc2hvdWxkRG93bmdyYWRlQWdlR2F0ZWRNYW5hZ2VkRGVwZW5kZW5jeShkZXBlbmRlbmN5LCBwYWNrYWdlSnNvbkRlcGVuZGVuY2llc1tkZXBlbmRlbmN5XSwgbWFuYWdlZFZlcnNpb24pKSB7XG4gICAgICAgIC8vIGBidW4gYWRkIGRlcGVuZGVuY3lgIHByZXNlcnZlcyBhbiBleGlzdGluZyBleGFjdCBwaW4sIHNvIHdyaXRlIHRoZSBhZ2UtY2xlYXJlZCB2ZXJzaW9uXG4gICAgICAgIC8vIGRpcmVjdGx5LiBUaGUgZmluYWwgcmVwb3NpdG9yeS13aWRlIGluc3RhbGwgcmVmcmVzaGVzIHRoZSBsb2NrZmlsZSBhZnRlciBldmVyeSBwYWNrYWdlXG4gICAgICAgIC8vIG1hbmlmZXN0IGhhcyBjb252ZXJnZWQgb24gdGhlIGdlbmVyYXRlZCByZWxlYXNlLWFnZSBwb2xpY3kuXG4gICAgICAgIHBhY2thZ2VKc29uRGVwZW5kZW5jaWVzW2RlcGVuZGVuY3ldID0gbWFuYWdlZFZlcnNpb247XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgZGVwZW5kZW5jaWVzVG9JbnN0YWxsLnB1c2goZGVwZW5kZW5jeSk7XG4gICAgICBpZiAoIXNraXBBZGRpbmdEZXBzKSBjb250aW51ZTtcbiAgICB9XG4gICAgaWYgKFxuICAgICAgcGFja2FnZUpzb25EZXBlbmRlbmNpZXNbZGVwZW5kZW5jeV0gJiZcbiAgICAgICFzaG91bGRVcGRhdGVFeGlzdGluZ0RlcGVuZGVuY3kgJiZcbiAgICAgIHBhY2thZ2VKc29uRGVwZW5kZW5jaWVzW2RlcGVuZGVuY3ldICE9PSAnKidcbiAgICApXG4gICAgICBjb250aW51ZTtcbiAgICBjb25zdCBsYXRlc3RWZXJzaW9uID0gZ2V0TWFuYWdlZERlcGVuZGVuY3lWZXJzaW9uKGNvbmZpZywgcm9vdENvbmZpZywgZGVwZW5kZW5jeSk7XG4gICAgaWYgKGxhdGVzdFZlcnNpb24gPT09ICcqJyAmJiBwYWNrYWdlSnNvbkRlcGVuZGVuY2llc1tkZXBlbmRlbmN5XSkgY29udGludWU7XG4gICAgcGFja2FnZUpzb25EZXBlbmRlbmNpZXNbZGVwZW5kZW5jeV0gPSBsYXRlc3RWZXJzaW9uO1xuICB9XG4gIHJldHVybiBkZXBlbmRlbmNpZXNUb0luc3RhbGw7XG59XG5cbmZ1bmN0aW9uIGZvcm1hdFBhY2thZ2VKc29uV2l0aFByb2plY3RGb3JtYXR0ZXIoY29uZmlnOiBQYWNrYWdlQ29uZmlnLCBmaWxlUGF0aDogc3RyaW5nKTogdm9pZCB7XG4gIGNvbnN0IHJlbGF0aXZlRmlsZVBhdGggPSBwYXRoLnJlbGF0aXZlKGNvbmZpZy5kaXJQYXRoLCBmaWxlUGF0aCk7XG4gIGlmICghcmVsYXRpdmVGaWxlUGF0aCkgcmV0dXJuO1xuXG4gIC8vIFJldXNlIHRoZSB0YXJnZXQgcmVwb3NpdG9yeSdzIG93biBmb3JtYXR0ZXIgYWZ0ZXIgZGVwZW5kZW5jeSBpbnN0YWxsYXRpb24gc29cbiAgLy8gcGFja2FnZS5qc29uIG1hdGNoZXMgd2hhdGV2ZXIgaXRzIGN1cnJlbnQgc29ydC1wYWNrYWdlLWpzb24gdmVyc2lvbiBleHBlY3RzLlxuICAvLyBUaGlzIGF2b2lkcyBmb2xsb3ctdXAgYXV0b2ZpeCBjb21taXRzIGNhdXNlZCBvbmx5IGJ5IGZvcm1hdHRlciB2ZXJzaW9uIGRyaWZ0XG4gIC8vIGJldHdlZW4gd2JmeSBhbmQgdGhlIHByb2plY3QgYmVpbmcgdXBkYXRlZC5cbiAgc3Bhd25TeW5jKCdidW54JywgWydzb3J0LXBhY2thZ2UtanNvbicsIHJlbGF0aXZlRmlsZVBhdGhdLCBjb25maWcuZGlyUGF0aCk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHJlbW92ZVVudXNlZFRzY29uZmlnQmFzZURlcGVuZGVuY2llcyhcbiAgY29uZmlnOiBQYWNrYWdlQ29uZmlnLFxuICBqc29uT2JqOiBXcml0YWJsZVBhY2thZ2VKc29uLFxuICB1c2VkRGVwZW5kZW5jaWVzOiBzdHJpbmdbXVxuKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IHVzZWREZXBlbmRlbmN5U2V0ID0gbmV3IFNldCh1c2VkRGVwZW5kZW5jaWVzKTtcbiAgY29uc3QgZXhpc3RpbmdUc2NvbmZpZ0Jhc2VEZXBlbmRlbmNpZXMgPSBhd2FpdCBnZXRFeGlzdGluZ1RzY29uZmlnQmFzZURlcGVuZGVuY2llcyhjb25maWcpO1xuICBmb3IgKGNvbnN0IGRlcGVuZGVuY3kgb2YgbWFuYWdlZFRzY29uZmlnQmFzZURlcGVuZGVuY2llcykge1xuICAgIGlmICh1c2VkRGVwZW5kZW5jeVNldC5oYXMoZGVwZW5kZW5jeSkgfHwgZXhpc3RpbmdUc2NvbmZpZ0Jhc2VEZXBlbmRlbmNpZXMuaGFzKGRlcGVuZGVuY3kpKSBjb250aW51ZTtcbiAgICAvLyB3YmZ5IG93bnMgdGhlc2UgYmFzZS1jb25maWcgcGFja2FnZXMuIFJlbW92ZSBzdGFsZSB2YXJpYW50cyB3aGVuIHJlcG9cbiAgICAvLyBjYXBhYmlsaXRpZXMgY2hhbmdlLCBzdWNoIGFzIE5leHQuanMgdGFraW5nIG93bmVyc2hpcCBvZiB0c2NvbmZpZy5qc29uLlxuICAgIGZvciAoY29uc3Qgc2VjdGlvbiBvZiBnZXREZXBlbmRlbmN5U2VjdGlvbnMoanNvbk9iaikpIHtcbiAgICAgIFJlZmxlY3QuZGVsZXRlUHJvcGVydHkoc2VjdGlvbiwgZGVwZW5kZW5jeSk7XG4gICAgfVxuICB9XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGdldEV4aXN0aW5nVHNjb25maWdCYXNlRGVwZW5kZW5jaWVzKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8U2V0PHN0cmluZz4+IHtcbiAgY29uc3QgZXhpc3RpbmdUc2NvbmZpZ0Jhc2VEZXBlbmRlbmNpZXMgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgY29uc3QgZmlsZVBhdGhzID0gYXdhaXQgZmcuZ2xvYignKiovdHNjb25maWcqLmpzb24nLCB7XG4gICAgY3dkOiBjb25maWcuZGlyUGF0aCxcbiAgICBkb3Q6IHRydWUsXG4gICAgaWdub3JlOiBnbG9iSWdub3JlLFxuICB9KTtcblxuICBmb3IgKGNvbnN0IGZpbGVQYXRoIG9mIGZpbGVQYXRocykge1xuICAgIGNvbnN0IGFic29sdXRlRmlsZVBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsIGZpbGVQYXRoKTtcbiAgICAvLyBUeXBlU2NyaXB0IDcncyBuYXRpdmUgY29tcGlsZXIgZHJvcHBlZCB0aGUgaW4tcHJvY2VzcyBgcGFyc2VDb25maWdGaWxlVGV4dFRvSnNvbmBcbiAgICAvLyBoZWxwZXIsIHNvIHBhcnNlIHRoZSB0c2NvbmZpZyBpbnRvIGFuIEFTVCBhbmQgcmVhZCBpdHMgdG9wLWxldmVsIGBleHRlbmRzYCBkaXJlY3RseS5cbiAgICBjb25zdCBzb3VyY2UgPSBhd2FpdCBwYXJzZVNvdXJjZUZpbGUoYWJzb2x1dGVGaWxlUGF0aCk7XG4gICAgaWYgKCFzb3VyY2UpIHtcbiAgICAgIGNvbnNvbGUud2FybihgUHJlc2VydmUgbWFuYWdlZCBAdHNjb25maWcgZGVwZW5kZW5jaWVzIGJlY2F1c2UgJHthYnNvbHV0ZUZpbGVQYXRofSBjb3VsZCBub3QgYmUgcGFyc2VkLmApO1xuICAgICAgcmV0dXJuIG5ldyBTZXQobWFuYWdlZFRzY29uZmlnQmFzZURlcGVuZGVuY2llcyk7XG4gICAgfVxuICAgIGZvciAoY29uc3QgdmFsdWUgb2YgcmVhZFRzY29uZmlnRXh0ZW5kcyhzb3VyY2UpKSB7XG4gICAgICBmb3IgKGNvbnN0IGRlcGVuZGVuY3kgb2YgbWFuYWdlZFRzY29uZmlnQmFzZURlcGVuZGVuY2llcykge1xuICAgICAgICBpZiAodmFsdWUgPT09IGRlcGVuZGVuY3kgfHwgdmFsdWUuc3RhcnRzV2l0aChgJHtkZXBlbmRlbmN5fS9gKSkge1xuICAgICAgICAgIGV4aXN0aW5nVHNjb25maWdCYXNlRGVwZW5kZW5jaWVzLmFkZChkZXBlbmRlbmN5KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBleGlzdGluZ1RzY29uZmlnQmFzZURlcGVuZGVuY2llcztcbn1cblxuLyoqIFJlYWRzIHRoZSB0b3AtbGV2ZWwgYGV4dGVuZHNgIGVudHJpZXMgKGEgc3RyaW5nIG9yIGFycmF5IG9mIHN0cmluZ3MpIGZyb20gYSBwYXJzZWQgdHNjb25maWcuICovXG5mdW5jdGlvbiByZWFkVHNjb25maWdFeHRlbmRzKHNvdXJjZTogYXN0LlNvdXJjZUZpbGUpOiBzdHJpbmdbXSB7XG4gIGNvbnN0IHZhbHVlczogc3RyaW5nW10gPSBbXTtcbiAgZm9yIChjb25zdCBwcm9wZXJ0eSBvZiBnZXRUc2NvbmZpZ1Jvb3RQcm9wZXJ0aWVzKHNvdXJjZSkpIHtcbiAgICBpZiAoYXN0LmlzUHJvcGVydHlBc3NpZ25tZW50KHByb3BlcnR5KSAmJiBhc3QuaXNTdHJpbmdMaXRlcmFsKHByb3BlcnR5Lm5hbWUpICYmIHByb3BlcnR5Lm5hbWUudGV4dCA9PT0gJ2V4dGVuZHMnKSB7XG4gICAgICBjb2xsZWN0U3RyaW5nTGl0ZXJhbFZhbHVlcyhwcm9wZXJ0eS5pbml0aWFsaXplciwgdmFsdWVzKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHZhbHVlcztcbn1cblxuZnVuY3Rpb24gZ2V0VHNjb25maWdSb290UHJvcGVydGllcyhzb3VyY2U6IGFzdC5Tb3VyY2VGaWxlKTogcmVhZG9ubHkgYXN0Lk9iamVjdExpdGVyYWxFbGVtZW50TGlrZVtdIHtcbiAgZm9yIChjb25zdCBzdGF0ZW1lbnQgb2Ygc291cmNlLnN0YXRlbWVudHMpIHtcbiAgICBpZiAoYXN0LmlzRXhwcmVzc2lvblN0YXRlbWVudChzdGF0ZW1lbnQpICYmIGFzdC5pc09iamVjdExpdGVyYWxFeHByZXNzaW9uKHN0YXRlbWVudC5leHByZXNzaW9uKSkge1xuICAgICAgcmV0dXJuIHN0YXRlbWVudC5leHByZXNzaW9uLnByb3BlcnRpZXM7XG4gICAgfVxuICB9XG4gIHJldHVybiBbXTtcbn1cblxuZnVuY3Rpb24gY29sbGVjdFN0cmluZ0xpdGVyYWxWYWx1ZXMobm9kZTogYXN0LkV4cHJlc3Npb24sIHZhbHVlczogc3RyaW5nW10pOiB2b2lkIHtcbiAgaWYgKGFzdC5pc1N0cmluZ0xpdGVyYWwobm9kZSkpIHtcbiAgICB2YWx1ZXMucHVzaChub2RlLnRleHQpO1xuICB9IGVsc2UgaWYgKGFzdC5pc0FycmF5TGl0ZXJhbEV4cHJlc3Npb24obm9kZSkpIHtcbiAgICBmb3IgKGNvbnN0IGVsZW1lbnQgb2Ygbm9kZS5lbGVtZW50cykge1xuICAgICAgY29sbGVjdFN0cmluZ0xpdGVyYWxWYWx1ZXMoZWxlbWVudCwgdmFsdWVzKTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gZ2V0RGVwZW5kZW5jeVNlY3Rpb25zKGpzb25PYmo6IFBhY2thZ2VKc29uKTogUGFydGlhbDxSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+PltdIHtcbiAgcmV0dXJuIGRlcGVuZGVuY3lTZWN0aW9uS2V5c1xuICAgIC5tYXAoKGtleSkgPT4ganNvbk9ialtrZXldKVxuICAgIC5maWx0ZXIoKHNlY3Rpb24pOiBzZWN0aW9uIGlzIFBhcnRpYWw8UmVjb3JkPHN0cmluZywgc3RyaW5nPj4gPT4gISFzZWN0aW9uKTtcbn1cblxuZnVuY3Rpb24gZ2V0TGF0ZXN0RGVwZW5kZW5jeVZlcnNpb24oZGVwZW5kZW5jeTogc3RyaW5nKTogc3RyaW5nIHtcbiAgY29uc3QgY2FjaGVkVmVyc2lvbiA9IGxhdGVzdERlcGVuZGVuY3lWZXJzaW9uQ2FjaGUuZ2V0KGRlcGVuZGVuY3kpO1xuICBpZiAoY2FjaGVkVmVyc2lvbikgcmV0dXJuIGNhY2hlZFZlcnNpb247XG5cbiAgY29uc3QgdmVyc2lvbiA9IGdldERlcGVuZGVuY3lWZXJzaW9uRnJvbU5wbShkZXBlbmRlbmN5KTtcbiAgbGF0ZXN0RGVwZW5kZW5jeVZlcnNpb25DYWNoZS5zZXQoZGVwZW5kZW5jeSwgdmVyc2lvbik7XG4gIHJldHVybiB2ZXJzaW9uO1xufVxuXG5mdW5jdGlvbiBnZXREZXBlbmRlbmN5VmVyc2lvbkZyb21OcG0oZGVwZW5kZW5jeTogc3RyaW5nKTogc3RyaW5nIHtcbiAgaWYgKCFzaG91bGRBcHBseVBhY2thZ2VBZ2VHYXRlKGRlcGVuZGVuY3kpKSB7XG4gICAgcmV0dXJuIGdldFJhd0RlcGVuZGVuY3lWZXJzaW9uRnJvbU5wbShkZXBlbmRlbmN5KTtcbiAgfVxuXG4gIHJldHVybiBnZXRMYXRlc3RBZ2VHYXRlZERlcGVuZGVuY3lWZXJzaW9uKGRlcGVuZGVuY3kpO1xufVxuXG5mdW5jdGlvbiBnZXRMYXRlc3RBZ2VHYXRlZERlcGVuZGVuY3lWZXJzaW9uKGRlcGVuZGVuY3k6IHN0cmluZyk6IHN0cmluZyB7XG4gIGNvbnN0IHRpbWVzID0gZ2V0TnBtUGFja2FnZVRpbWVzKGRlcGVuZGVuY3kpO1xuICBjb25zdCBsYXRlc3RWZXJzaW9uID0gZ2V0UmF3RGVwZW5kZW5jeVZlcnNpb25Gcm9tTnBtKGRlcGVuZGVuY3kpO1xuICBpZiAobGF0ZXN0VmVyc2lvbiAhPT0gJyonICYmIGlzUHVibGlzaGVkQmVmb3JlQWdlR2F0ZSh0aW1lc1tsYXRlc3RWZXJzaW9uXSkpIHtcbiAgICByZXR1cm4gbGF0ZXN0VmVyc2lvbjtcbiAgfVxuXG4gIHJldHVybiBnZXRBZ2VHYXRlZFZlcnNpb25zRGVzY2VuZGluZyh0aW1lcylbMF0gPz8gJyonO1xufVxuXG4vKiogRXZlcnkgc3RhYmxlIHJlbGVhc2UgaW4gYHRpbWVzYCB0aGF0IGFscmVhZHkgY2xlYXJlZCB0aGUgYWdlIGdhdGUsIG5ld2VzdCBmaXJzdC4gKi9cbmZ1bmN0aW9uIGdldEFnZUdhdGVkVmVyc2lvbnNEZXNjZW5kaW5nKHRpbWVzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+KTogc3RyaW5nW10ge1xuICBjb25zdCBub3cgPSBEYXRlLm5vdygpO1xuICByZXR1cm4gT2JqZWN0LmVudHJpZXModGltZXMpXG4gICAgLmZpbHRlcigoW3ZlcnNpb25dKSA9PiBzZW12ZXIudmFsaWQodmVyc2lvbikpXG4gICAgLmZpbHRlcigoW3ZlcnNpb25dKSA9PiAoc2VtdmVyLnByZXJlbGVhc2UodmVyc2lvbik/Lmxlbmd0aCA/PyAwKSA9PT0gMClcbiAgICAuZmlsdGVyKChbLCBwdWJsaXNoZWRBdF0pID0+IE51bWJlci5pc0Zpbml0ZShEYXRlLnBhcnNlKHB1Ymxpc2hlZEF0KSkpXG4gICAgLmZpbHRlcigoWywgcHVibGlzaGVkQXRdKSA9PiBub3cgLSBEYXRlLnBhcnNlKHB1Ymxpc2hlZEF0KSA+PSBwYWNrYWdlQWdlR2F0ZU1zKVxuICAgIC50b1NvcnRlZCgoW3ZlcnNpb25BXSwgW3ZlcnNpb25CXSkgPT4gc2VtdmVyLnJjb21wYXJlKHZlcnNpb25BLCB2ZXJzaW9uQikpXG4gICAgLm1hcCgoW3ZlcnNpb25dKSA9PiB2ZXJzaW9uKTtcbn1cblxuZnVuY3Rpb24gaXNQdWJsaXNoZWRCZWZvcmVBZ2VHYXRlKHB1Ymxpc2hlZEF0OiBzdHJpbmcgfCB1bmRlZmluZWQpOiBib29sZWFuIHtcbiAgaWYgKCFwdWJsaXNoZWRBdCkgcmV0dXJuIGZhbHNlO1xuICBjb25zdCBwdWJsaXNoZWRUaW1lID0gRGF0ZS5wYXJzZShwdWJsaXNoZWRBdCk7XG4gIHJldHVybiBOdW1iZXIuaXNGaW5pdGUocHVibGlzaGVkVGltZSkgJiYgRGF0ZS5ub3coKSAtIHB1Ymxpc2hlZFRpbWUgPj0gcGFja2FnZUFnZUdhdGVNcztcbn1cblxuZnVuY3Rpb24gZ2V0TnBtUGFja2FnZVRpbWVzKGRlcGVuZGVuY3k6IHN0cmluZyk6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4ge1xuICBjb25zdCBwYWNrYWdlTmFtZSA9IGRlcGVuZGVuY3kucmVwbGFjZSgvQFteQC9dKyQvdSwgJycpO1xuICBjb25zdCBjYWNoZWRUaW1lcyA9IG5wbVBhY2thZ2VUaW1lc0NhY2hlLmdldChwYWNrYWdlTmFtZSk7XG4gIGlmIChjYWNoZWRUaW1lcykgcmV0dXJuIGNhY2hlZFRpbWVzO1xuXG4gIGNvbnN0IHN0ZG91dCA9IHNwYXduU3luY0FuZFJldHVyblN0ZG91dChcbiAgICAnbnBtJyxcbiAgICBbJ3Nob3cnLCBwYWNrYWdlTmFtZSwgJ3RpbWUnLCAnLS1qc29uJywgJy0td29ya3NwYWNlcz1mYWxzZSddLFxuICAgIHByb2Nlc3MuY3dkKClcbiAgKTtcbiAgaWYgKCFzdGRvdXQpIHJldHVybiB7fTtcblxuICB0cnkge1xuICAgIGNvbnN0IHBhcnNlZCA9IEpTT04ucGFyc2Uoc3Rkb3V0KSBhcyBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+IHwgW1JlY29yZDxzdHJpbmcsIHN0cmluZz5dO1xuICAgIGNvbnN0IHRpbWVzID0gQXJyYXkuaXNBcnJheShwYXJzZWQpID8gcGFyc2VkWzBdIDogcGFyc2VkO1xuICAgIGlmICghdGltZXMpIHJldHVybiB7fTtcbiAgICBucG1QYWNrYWdlVGltZXNDYWNoZS5zZXQocGFja2FnZU5hbWUsIHRpbWVzKTtcbiAgICByZXR1cm4gdGltZXM7XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiB7fTtcbiAgfVxufVxuXG5mdW5jdGlvbiBzaG91bGRBcHBseVBhY2thZ2VBZ2VHYXRlKGRlcGVuZGVuY3k6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAvLyBLZWVwIG1hbmFnZWQgZmlyc3QtcGFydHkgcGFja2FnZXMgYWxpZ25lZCB3aXRoIEJ1bidzIGV4cGxpY2l0IGV4ZW1wdGlvbnMuIHdiZnkncyBnZW5lcmF0ZWRcbiAgLy8gY29uZmlndXJhdGlvbiBjYW4gcmVseSBvbiB0aGUgY3VycmVudCB3YiBjb250cmFjdCwgc28gaW5kZXBlbmRlbnRseSBzb2FraW5nIG9yIGRvd25ncmFkaW5nIHdiXG4gIC8vIHdvdWxkIHBhaXIgbmV3IGdlbmVyYXRlZCBmaWxlcyB3aXRoIGFuIGluY29tcGF0aWJsZSBvbGQgQ0xJLiBUaG9zZSBwYWNrYWdlcyBhcmUgcmVsZWFzZWQgYW5kXG4gIC8vIGZpeGVkIGF0IHRoZWlyIHNvdXJjZSBpbnN0ZWFkOyBvbmx5IHBhY2thZ2VzIEJ1biBpdHNlbGYgZ2F0ZXMgbWF5IGJlIHNlbGVjdGVkIGZyb20gb2xkZXIgdGFncy5cbiAgcmV0dXJuICFidW5NaW5pbXVtUmVsZWFzZUFnZUV4Y2x1ZGVzLnNvbWUoKHBhdHRlcm4pID0+IGRvZXNQYWNrYWdlUGF0dGVybk1hdGNoKHBhdHRlcm4sIGRlcGVuZGVuY3kpKTtcbn1cblxuZnVuY3Rpb24gZG9lc1BhY2thZ2VQYXR0ZXJuTWF0Y2gocGF0dGVybjogc3RyaW5nLCBkZXBlbmRlbmN5OiBzdHJpbmcpOiBib29sZWFuIHtcbiAgaWYgKHBhdHRlcm4gPT09IGRlcGVuZGVuY3kpIHJldHVybiB0cnVlO1xuICBpZiAoIXBhdHRlcm4uaW5jbHVkZXMoJyonKSkgcmV0dXJuIGZhbHNlO1xuXG4gIGNvbnN0IGVzY2FwZWRQYXR0ZXJuID0gcGF0dGVybi5yZXBsYWNlQWxsKC9bLis/XiR7fSgpfFtcXF1cXFxcXS9ndSwgU3RyaW5nLnJhd2BcXCQmYCkucmVwbGFjZUFsbCgnKicsICcuKicpO1xuICByZXR1cm4gbmV3IFJlZ0V4cChgXiR7ZXNjYXBlZFBhdHRlcm59JGAsICd1JykudGVzdChkZXBlbmRlbmN5KTtcbn1cblxuZnVuY3Rpb24gZ2V0UmF3RGVwZW5kZW5jeVZlcnNpb25Gcm9tTnBtKGRlcGVuZGVuY3k6IHN0cmluZyk6IHN0cmluZyB7XG4gIC8vIE5vIGNhY2hlIGhlcmU6IHRoZSBvbmx5IGNhbGxlciBjaGFpbiBnb2VzIHRocm91Z2ggZ2V0TGF0ZXN0RGVwZW5kZW5jeVZlcnNpb24sIHdoaWNoIGFscmVhZHlcbiAgLy8gbWVtb2l6ZXMgcGVyIGRlcGVuZGVuY3ksIHNvIHRoaXMgY2FuIHJ1biBhdCBtb3N0IG9uY2UgcGVyIGRlcGVuZGVuY3kuXG4gIHJldHVybiBzcGF3blN5bmNBbmRSZXR1cm5TdGRvdXQoJ25wbScsIFsnc2hvdycsIGRlcGVuZGVuY3ksICd2ZXJzaW9uJywgJy0td29ya3NwYWNlcz1mYWxzZSddLCBwcm9jZXNzLmN3ZCgpKSB8fCAnKic7XG59XG5cbmZ1bmN0aW9uIGdldEluc3RhbGxEZXBlbmRlbmN5U3BlY2lmaWVyKGNvbmZpZzogUGFja2FnZUNvbmZpZywgcm9vdENvbmZpZzogUGFja2FnZUNvbmZpZywgZGVwZW5kZW5jeTogc3RyaW5nKTogc3RyaW5nIHtcbiAgLy8gVHlwZVNjcmlwdCBpcyB2ZXJzaW9uLWNhcHBlZCBpbiBCbGl0eiByZXBvc2l0b3JpZXMsIHNvIGl0cyBpbnN0YWxsIHNwZWNpZmllciBtdXN0IGNhcnJ5IHRoZVxuICAvLyBtYW5hZ2VkIHZlcnNpb24g4oCUIGEgYmFyZSBgYnVuIGFkZGAgd291bGQgaW5zdGFsbCB0aGUgaW5jb21wYXRpYmxlIGxhdGVzdC5cbiAgaWYgKGRlcGVuZGVuY3kgPT09IHR5cGVzY3JpcHREZXBlbmRlbmN5ICYmIGlzQmxpdHpSZXBvc2l0b3J5KGNvbmZpZywgcm9vdENvbmZpZykpIHtcbiAgICByZXR1cm4gYCR7ZGVwZW5kZW5jeX1AJHtnZXRNYW5hZ2VkRGVwZW5kZW5jeVZlcnNpb24oY29uZmlnLCByb290Q29uZmlnLCBkZXBlbmRlbmN5KX1gO1xuICB9XG4gIHJldHVybiBkZXBlbmRlbmN5O1xufVxuXG4vKiogV2hldGhlciB0aGUgcmVwb3NpdG9yeSBjb250YWlucyBhIEJsaXR6IGFwcCAodGhlIGN1cnJlbnQgcGFja2FnZSBvciB0aGUgd29ya3NwYWNlIHJvb3QpLiAqL1xuZnVuY3Rpb24gaXNCbGl0elJlcG9zaXRvcnkoY29uZmlnOiBQYWNrYWdlQ29uZmlnLCByb290Q29uZmlnOiBQYWNrYWdlQ29uZmlnKTogYm9vbGVhbiB7XG4gIHJldHVybiBjb25maWcuZGVwZW5kaW5nLmJsaXR6IHx8IHJvb3RDb25maWcuZGVwZW5kaW5nLmJsaXR6O1xufVxuXG5jb25zdCB3b3Jrc3BhY2VQYWNrYWdlRGlyc0NhY2hlID0gbmV3IE1hcDxzdHJpbmcsIE1hcDxzdHJpbmcsIHN0cmluZz4+KCk7XG5cbi8qKiBNYXAgZnJvbSBlYWNoIHdvcmtzcGFjZSBwYWNrYWdlJ3MgbmFtZSB0byBpdHMgZGlyZWN0b3J5IChyZWxhdGl2ZSB0byB0aGUgbW9ub3JlcG8gcm9vdCkuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0V29ya3NwYWNlUGFja2FnZURpcnMocm9vdENvbmZpZzogUGFja2FnZUNvbmZpZyk6IE1hcDxzdHJpbmcsIHN0cmluZz4ge1xuICBjb25zdCBjYWNoZWQgPSB3b3Jrc3BhY2VQYWNrYWdlRGlyc0NhY2hlLmdldChyb290Q29uZmlnLmRpclBhdGgpO1xuICBpZiAoY2FjaGVkKSByZXR1cm4gY2FjaGVkO1xuXG4gIGNvbnN0IHdvcmtzcGFjZURpcnNCeU5hbWUgPSBuZXcgTWFwPHN0cmluZywgc3RyaW5nPigpO1xuICBmb3IgKGNvbnN0IHBhY2thZ2VKc29uUGF0aCBvZiBnZXRXb3Jrc3BhY2VQYWNrYWdlSnNvblBhdGhzKHJvb3RDb25maWcpKSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHdvcmtzcGFjZVBhY2thZ2VKc29uID0gSlNPTi5wYXJzZShcbiAgICAgICAgZnMucmVhZEZpbGVTeW5jKHBhdGgucmVzb2x2ZShyb290Q29uZmlnLmRpclBhdGgsIHBhY2thZ2VKc29uUGF0aCksICd1dGY4JylcbiAgICAgICkgYXMgUGFja2FnZUpzb247XG4gICAgICBpZiAod29ya3NwYWNlUGFja2FnZUpzb24ubmFtZSkge1xuICAgICAgICB3b3Jrc3BhY2VEaXJzQnlOYW1lLnNldCh3b3Jrc3BhY2VQYWNrYWdlSnNvbi5uYW1lLCBwYXRoLnBvc2l4LmRpcm5hbWUocGFja2FnZUpzb25QYXRoKSk7XG4gICAgICB9XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBpZ25vcmUgdW5wYXJzYWJsZSB3b3Jrc3BhY2UgcGFja2FnZS5qc29uXG4gICAgfVxuICB9XG4gIHdvcmtzcGFjZVBhY2thZ2VEaXJzQ2FjaGUuc2V0KHJvb3RDb25maWcuZGlyUGF0aCwgd29ya3NwYWNlRGlyc0J5TmFtZSk7XG4gIHJldHVybiB3b3Jrc3BhY2VEaXJzQnlOYW1lO1xufVxuXG5mdW5jdGlvbiBzaG91bGRVcGRhdGVFeGlzdGluZ01hbmFnZWREZXBlbmRlbmN5KFxuICBjb25maWc6IFBhY2thZ2VDb25maWcsXG4gIHJvb3RDb25maWc6IFBhY2thZ2VDb25maWcsXG4gIGRlcGVuZGVuY3k6IHN0cmluZyxcbiAgY3VycmVudFZlcnNpb246IHN0cmluZyB8IHVuZGVmaW5lZFxuKTogYm9vbGVhbiB7XG4gIGlmICghY3VycmVudFZlcnNpb24pIHJldHVybiB0cnVlO1xuICBpZiAoY3VycmVudFZlcnNpb24gPT09ICcqJykgcmV0dXJuIHRydWU7XG4gIGlmIChpc1dvcmtzcGFjZVByb3RvY29sUmFuZ2UoY3VycmVudFZlcnNpb24pKSByZXR1cm4gdHJ1ZTtcbiAgaWYgKCFtYW5hZ2VkRGVwZW5kZW5jeU5hbWVzLmhhcyhkZXBlbmRlbmN5KSkgcmV0dXJuIGZhbHNlO1xuICBjb25zdCBtYW5hZ2VkVmVyc2lvbiA9IGdldE1hbmFnZWREZXBlbmRlbmN5VmVyc2lvbihjb25maWcsIHJvb3RDb25maWcsIGRlcGVuZGVuY3kpO1xuICBjb25zdCBjdXJyZW50VmFsaWRWZXJzaW9uID0gc2VtdmVyLnZhbGlkKGN1cnJlbnRWZXJzaW9uKTtcbiAgLy8gQSBUeXBlU2NyaXB0IDcgcGluIGluIGEgQmxpdHogcmVwb3NpdG9yeSBpcyBsaWtld2lzZSBpbmNvbXBhdGlibGUgKGBuZXh0IGJ1aWxkYCBmYWlscyBvblxuICAvLyB0aGUgTmV4dC5qcyAxNSB0aGF0IEJsaXR6IHBpbnMg4oCUIHNlZSBnZXRNYW5hZ2VkRGVwZW5kZW5jeVZlcnNpb24pLCBzbyByZXdyaXRlIGl0IHRvIHRoZVxuICAvLyBjYXBwZWQgcmVsZWFzZSBpbnN0ZWFkIG9mIHByZXNlcnZpbmcgaXQgdmlhIHRoZSBuby1kb3duZ3JhZGUgcnVsZSBiZWxvdy4gVGhlIHBpbiBtYXkgYmUgYVxuICAvLyBSQU5HRSAoZS5nLiBgXjcuMC4wYCksIHdoaWNoIHNlbXZlci52YWxpZCByZWplY3RzIOKAlCBqdWRnZSB0aGUgbWFqb3IgZnJvbSB0aGUgcmFuZ2UgbWluaW11bS5cbiAgY29uc3QgY3VycmVudFR5cGVzY3JpcHRWZXJzaW9uID1cbiAgICBjdXJyZW50VmFsaWRWZXJzaW9uID8/IChzZW12ZXIudmFsaWRSYW5nZShjdXJyZW50VmVyc2lvbikgPyBzZW12ZXIubWluVmVyc2lvbihjdXJyZW50VmVyc2lvbik/LnZlcnNpb24gOiB1bmRlZmluZWQpO1xuICBpZiAoXG4gICAgZGVwZW5kZW5jeSA9PT0gdHlwZXNjcmlwdERlcGVuZGVuY3kgJiZcbiAgICBpc0JsaXR6UmVwb3NpdG9yeShjb25maWcsIHJvb3RDb25maWcpICYmXG4gICAgY3VycmVudFR5cGVzY3JpcHRWZXJzaW9uICYmXG4gICAgc2VtdmVyLm1ham9yKGN1cnJlbnRUeXBlc2NyaXB0VmVyc2lvbikgPj0gNyAmJlxuICAgIHNlbXZlci52YWxpZChtYW5hZ2VkVmVyc2lvbikgJiZcbiAgICBpc05ld2VyUGFja2FnZVZlcnNpb24oY3VycmVudFZlcnNpb24sIG1hbmFnZWRWZXJzaW9uKVxuICApIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICAvLyBUaGUgZ2VuZXJhdGVkIGJ1bmZpZyBhcHBsaWVzIHRoZSBvcmdhbml6YXRpb24gYWdlIGdhdGUgZXZlbiB0byBleGFjdCBwaW5zLiBJZiBhIG1hbmFnZWRcbiAgLy8gdGhpcmQtcGFydHkgdG9vbCBpcyBuZXdlciB0aGFuIHRoZSBuZXdlc3QgcmVsZWFzZSB0aGF0IGNsZWFyZWQgdGhhdCBnYXRlLCBwcmVzZXJ2aW5nIHRoZSBwaW5cbiAgLy8gcHJvZHVjZXMgYSBwYWNrYWdlLmpzb24gdGhhdCBhIGZyZXNoIGluc3RhbGwgd2l0aG91dCB0aGUgb2xkIGxvY2tmaWxlIGNhbm5vdCByZXNvbHZlIChub3RhYmx5XG4gIC8vIG9wdGltaXplZCBEb2NrZXIgYnVpbGRzKS4gS2VlcCB0aGUgbm8tZG93bmdyYWRlIHBvbGljeSBvbmx5IHdoZW4gdGhlIGRlcGVuZGVuY3kgaXMgZXhlbXB0IGZyb21cbiAgLy8gdGhlIGdhdGU7IGFnZS1nYXRlZCBtYW5hZ2VkIHRvb2xzIG11c3QgY29udmVyZ2Ugb24gdGhlIHZlcnNpb24gdGhlIGdlbmVyYXRlZCBidW5maWcgYWNjZXB0cy5cbiAgaWYgKHNob3VsZERvd25ncmFkZUFnZUdhdGVkTWFuYWdlZERlcGVuZGVuY3koZGVwZW5kZW5jeSwgY3VycmVudFZlcnNpb24sIG1hbmFnZWRWZXJzaW9uKSkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIC8vIHdiZnkgb3ducyB0aGVzZSB0b29sIGRlcGVuZGVuY2llcywgYnV0IGFwcGx5aW5nIHdiZnkgc2hvdWxkIG5vdCBkb3duZ3JhZGUgYVxuICAvLyByZXBvc2l0b3J5IHRoYXQgYWxyZWFkeSBwaW5zIGEgbmV3ZXIgcmV2aWV3ZWQgcmVsZWFzZSB3aGVuIHRoZSBvcmcgcG9saWN5IGV4ZW1wdHMgaXQuXG4gIHJldHVybiBpc05ld2VyUGFja2FnZVZlcnNpb24obWFuYWdlZFZlcnNpb24sIGN1cnJlbnRWZXJzaW9uKTtcbn1cblxuZnVuY3Rpb24gc2hvdWxkRG93bmdyYWRlQWdlR2F0ZWRNYW5hZ2VkRGVwZW5kZW5jeShcbiAgZGVwZW5kZW5jeTogc3RyaW5nLFxuICBjdXJyZW50VmVyc2lvbjogc3RyaW5nIHwgdW5kZWZpbmVkLFxuICBtYW5hZ2VkVmVyc2lvbjogc3RyaW5nXG4pOiBjdXJyZW50VmVyc2lvbiBpcyBzdHJpbmcge1xuICBpZiAoIWN1cnJlbnRWZXJzaW9uKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIGNvbnN0IHZhbGlkQ3VycmVudFZlcnNpb24gPSBzZW12ZXIudmFsaWQoY3VycmVudFZlcnNpb24pO1xuICBjb25zdCB2YWxpZE1hbmFnZWRWZXJzaW9uID0gc2VtdmVyLnZhbGlkKG1hbmFnZWRWZXJzaW9uKTtcbiAgcmV0dXJuIChcbiAgICBzaG91bGRBcHBseVBhY2thZ2VBZ2VHYXRlKGRlcGVuZGVuY3kpICYmXG4gICAgdmFsaWRDdXJyZW50VmVyc2lvbiAhPT0gbnVsbCAmJlxuICAgIHZhbGlkTWFuYWdlZFZlcnNpb24gIT09IG51bGwgJiZcbiAgICBzZW12ZXIuZ3QodmFsaWRDdXJyZW50VmVyc2lvbiwgdmFsaWRNYW5hZ2VkVmVyc2lvbilcbiAgKTtcbn1cblxuLy8gVGhlIG5ld2VzdCBUeXBlU2NyaXB0IDYgcmVsZWFzZSBhdCB0aGUgdGltZSB0aGUgQmxpdHogY2FwIHNoaXBwZWQ7IHVzZWQgb25seSB3aGVuIHRoZSByZWdpc3RyeVxuLy8gbG9va3VwIGZvciB0aGUgYWN0dWFsIG5ld2VzdCBwcmUtdjcgcmVsZWFzZSBmYWlscyAoc2VlIGdldE1hbmFnZWREZXBlbmRlbmN5VmVyc2lvbikuXG5jb25zdCBsYXN0S25vd25QcmVWN1R5cGVzY3JpcHRWZXJzaW9uID0gJzYuMC4zJztcblxuZnVuY3Rpb24gZ2V0TWFuYWdlZERlcGVuZGVuY3lWZXJzaW9uKGNvbmZpZzogUGFja2FnZUNvbmZpZywgcm9vdENvbmZpZzogUGFja2FnZUNvbmZpZywgZGVwZW5kZW5jeTogc3RyaW5nKTogc3RyaW5nIHtcbiAgY29uc3QgbGF0ZXN0VmVyc2lvbiA9IGdldExhdGVzdERlcGVuZGVuY3lWZXJzaW9uKGRlcGVuZGVuY3kpO1xuICBpZiAoZGVwZW5kZW5jeSA9PT0gdHlwZXNjcmlwdERlcGVuZGVuY3kgJiYgaXNCbGl0elJlcG9zaXRvcnkoY29uZmlnLCByb290Q29uZmlnKSkge1xuICAgIC8vIEJsaXR6IHBpbnMgTmV4dC5qcyAxNSwgd2hvc2UgYnVpbGQtdGltZSBgdmVyaWZ5VHlwZVNjcmlwdFNldHVwYCByZXF1aXJlcyB0aGUgY2xhc3NpY1xuICAgIC8vIGB0eXBlc2NyaXB0YCBjb21waWxlciBBUEk7IHRoZSBUeXBlU2NyaXB0IDcgYHR5cGVzY3JpcHRgIHBhY2thZ2UgaXMgdGhlIHRzZ28gYmluYXJ5XG4gICAgLy8gd2l0aG91dCB0aGF0IEFQSSwgc28gYG5leHQgYnVpbGRgIGFib3J0cyB3aXRoIFwiRmFpbGVkIHRvIGluc3RhbGwgcmVxdWlyZWQgVHlwZVNjcmlwdFxuICAgIC8vIGRlcGVuZGVuY2llc1wiIChvYnNlcnZlZCBpbiBXaWxsQm9vc3Rlci9zdXJ2ZXktc3lzdGVtKS4gQ2FwIGB0eXBlc2NyaXB0YCBiZWxvdyA3IHVudGlsXG4gICAgLy8gQmxpdHogc3VwcG9ydHMgYSBOZXh0LmpzIHJlbGVhc2UgdGhhdCB1bmRlcnN0YW5kcyB0c2dvLiBBIGZhaWxlZCByZWdpc3RyeSBsb29rdXAgbXVzdFxuICAgIC8vIHJlc29sdmUgdG8gYSBrbm93bi1jb21wYXRpYmxlIHJlbGVhc2Ug4oCUIGZhbGxpbmcgYmFjayB0byBsYXRlc3RWZXJzaW9uIHdvdWxkIHJlaW5zdGFsbCB0aGVcbiAgICAvLyBpbmNvbXBhdGlibGUgVHlwZVNjcmlwdCA3LlxuICAgIGNvbnN0IHZhbGlkTGF0ZXN0VmVyc2lvbiA9IHNlbXZlci52YWxpZChsYXRlc3RWZXJzaW9uKTtcbiAgICBpZiAodmFsaWRMYXRlc3RWZXJzaW9uICYmIHNlbXZlci5tYWpvcih2YWxpZExhdGVzdFZlcnNpb24pIDwgNykgcmV0dXJuIGxhdGVzdFZlcnNpb247XG4gICAgLy8gVGhlIGNhcHBlZCBsb29rdXAgbXVzdCByZXNwZWN0IHRoZSBhZ2UgZ2F0ZSB0b286IHRoaXMgdmVyc2lvbiBpcyB3cml0dGVuIGFzIGFuIGV4YWN0IHBpbixcbiAgICAvLyBhbmQgQnVuIHJlZnVzZXMgdG8gcmVzb2x2ZSBvbmUgcHVibGlzaGVkIGluc2lkZSB0aGUgbWluaW11bS1yZWxlYXNlLWFnZSB3aW5kb3cuIFRoZXJlIGlzIG5vXG4gICAgLy8gdW5nYXRlZCBmYWxsYmFjayDigJQgd2l0aG91dCBwdWJsaWNhdGlvbiBtZXRhZGF0YSB0aGUgYWdlIG9mIGEgcmFuZ2UgcmVzdWx0IGlzIHVua25vd24sIHNvIGFcbiAgICAvLyBwYXJ0aWFsIHJlZ2lzdHJ5IGZhaWx1cmUgd291bGQgb3RoZXJ3aXNlIHdyaXRlIGEgdmVyc2lvbiBCdW4gdGhlbiByZWZ1c2VzIHRvIGluc3RhbGwuXG4gICAgcmV0dXJuIGdldExhdGVzdEFnZUdhdGVkVmVyc2lvbkJlbG93KHR5cGVzY3JpcHREZXBlbmRlbmN5LCAnNy4wLjAnKSA/PyBsYXN0S25vd25QcmVWN1R5cGVzY3JpcHRWZXJzaW9uO1xuICB9XG4gIHJldHVybiBsYXRlc3RWZXJzaW9uO1xufVxuXG4vKipcbiAqIFRoZSBoaWdoZXN0IHJlbGVhc2Ugb2YgYHBhY2thZ2VOYW1lYCBiZWxvdyBgZXhjbHVzaXZlVXBwZXJCb3VuZGAgdGhhdCBhbHJlYWR5IGNsZWFyZWQgdGhlIGFnZVxuICogZ2F0ZSwgb3IgdW5kZWZpbmVkIHdoZW4gdGhlIHJlZ2lzdHJ5IGxvb2t1cCBmYWlscyBvciBubyBzdWNoIHJlbGVhc2UgZXhpc3RzIHlldC5cbiAqL1xuZnVuY3Rpb24gZ2V0TGF0ZXN0QWdlR2F0ZWRWZXJzaW9uQmVsb3cocGFja2FnZU5hbWU6IHN0cmluZywgZXhjbHVzaXZlVXBwZXJCb3VuZDogc3RyaW5nKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgcmV0dXJuIGdldEFnZUdhdGVkVmVyc2lvbnNEZXNjZW5kaW5nKGdldE5wbVBhY2thZ2VUaW1lcyhwYWNrYWdlTmFtZSkpLmZpbmQoKHZlcnNpb24pID0+XG4gICAgc2VtdmVyLmx0KHZlcnNpb24sIGV4Y2x1c2l2ZVVwcGVyQm91bmQpXG4gICk7XG59XG5cbmZ1bmN0aW9uIGlzTmV3ZXJQYWNrYWdlVmVyc2lvbihjYW5kaWRhdGVWZXJzaW9uOiBzdHJpbmcsIGN1cnJlbnRWZXJzaW9uOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgY29uc3QgdmFsaWRMYXRlc3RWZXJzaW9uID0gc2VtdmVyLnZhbGlkKGNhbmRpZGF0ZVZlcnNpb24pO1xuICBjb25zdCB2YWxpZEN1cnJlbnRWZXJzaW9uID0gc2VtdmVyLnZhbGlkKGN1cnJlbnRWZXJzaW9uKTtcbiAgcmV0dXJuICF2YWxpZExhdGVzdFZlcnNpb24gfHwgIXZhbGlkQ3VycmVudFZlcnNpb24gfHwgc2VtdmVyLmd0KHZhbGlkTGF0ZXN0VmVyc2lvbiwgdmFsaWRDdXJyZW50VmVyc2lvbik7XG59XG5cbmZ1bmN0aW9uIGlzV29ya3NwYWNlUHJvdG9jb2xSYW5nZSh2ZXJzaW9uOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgcmV0dXJuIHZlcnNpb24uc3RhcnRzV2l0aCgnd29ya3NwYWNlOicpO1xufVxuXG5mdW5jdGlvbiBmb3JtYXRSZXBvc2l0b3J5Rm9yUGFja2FnZUpzb24oXG4gIHJlcG9zaXRvcnk6IFBhY2thZ2VKc29uWydyZXBvc2l0b3J5J10sXG4gIGV4aXN0aW5nUmVwb3NpdG9yeT86IFBhY2thZ2VKc29uWydyZXBvc2l0b3J5J11cbik6IFBhY2thZ2VKc29uWydyZXBvc2l0b3J5J10ge1xuICBjb25zdCBub3JtYWxpemVkUmVwb3NpdG9yeSA9IG5vcm1hbGl6ZVJlcG9zaXRvcnlVcmxGb3JQYWNrYWdlSnNvbihyZXBvc2l0b3J5KTtcbiAgaWYgKG5vcm1hbGl6ZWRSZXBvc2l0b3J5KSB7XG4gICAgcmV0dXJuIGJ1aWxkTm9ybWFsaXplZFJlcG9zaXRvcnlGb3JQYWNrYWdlSnNvbihub3JtYWxpemVkUmVwb3NpdG9yeSwgcmVwb3NpdG9yeSwgZXhpc3RpbmdSZXBvc2l0b3J5KTtcbiAgfVxuXG4gIGNvbnN0IG5vcm1hbGl6ZWRFeGlzdGluZ1JlcG9zaXRvcnkgPSBub3JtYWxpemVSZXBvc2l0b3J5VXJsRm9yUGFja2FnZUpzb24oZXhpc3RpbmdSZXBvc2l0b3J5KTtcbiAgaWYgKG5vcm1hbGl6ZWRFeGlzdGluZ1JlcG9zaXRvcnkpIHtcbiAgICByZXR1cm4gYnVpbGROb3JtYWxpemVkUmVwb3NpdG9yeUZvclBhY2thZ2VKc29uKG5vcm1hbGl6ZWRFeGlzdGluZ1JlcG9zaXRvcnksIGV4aXN0aW5nUmVwb3NpdG9yeSk7XG4gIH1cblxuICByZXR1cm4gcmVwb3NpdG9yeTtcbn1cblxuZnVuY3Rpb24gbm9ybWFsaXplUmVwb3NpdG9yeVVybEZvclBhY2thZ2VKc29uKHJlcG9zaXRvcnk6IFBhY2thZ2VKc29uWydyZXBvc2l0b3J5J10pOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBpZiAodHlwZW9mIHJlcG9zaXRvcnkgPT09ICdzdHJpbmcnKSB7XG4gICAgaWYgKCFyZXBvc2l0b3J5LnN0YXJ0c1dpdGgoJ2dpdGh1YjonKSkgcmV0dXJuO1xuXG4gICAgY29uc3QgW293bmVyLCByZXBvXSA9IGdpdEh1YlV0aWwuZ2V0T3JnQW5kTmFtZShyZXBvc2l0b3J5KTtcbiAgICBpZiAoIW93bmVyIHx8ICFyZXBvKSByZXR1cm47XG4gICAgcmV0dXJuIGBnaXQraHR0cHM6Ly9naXRodWIuY29tLyR7b3duZXJ9LyR7cmVwb30uZ2l0YDtcbiAgfVxuXG4gIGNvbnN0IHJlcG9zaXRvcnlVcmwgPSByZXBvc2l0b3J5Py51cmw7XG4gIGlmICh0eXBlb2YgcmVwb3NpdG9yeVVybCAhPT0gJ3N0cmluZycpIHJldHVybjtcblxuICBjb25zdCBtYXRjaGVkID0gL14oPzpnaXRcXCspP2h0dHBzOlxcL1xcL2dpdGh1YlxcLmNvbVxcLyhbXi9dKylcXC8oW14vXSs/KSg/OlxcLmdpdCk/JC91LmV4ZWMocmVwb3NpdG9yeVVybCk7XG4gIGlmICghbWF0Y2hlZCkgcmV0dXJuO1xuXG4gIGNvbnN0IFssIG93bmVyLCByZXBvXSA9IG1hdGNoZWQ7XG4gIHJldHVybiBgZ2l0K2h0dHBzOi8vZ2l0aHViLmNvbS8ke293bmVyfS8ke3JlcG99LmdpdGA7XG59XG5cbmZ1bmN0aW9uIGJ1aWxkTm9ybWFsaXplZFJlcG9zaXRvcnlGb3JQYWNrYWdlSnNvbihcbiAgbm9ybWFsaXplZFVybDogc3RyaW5nLFxuICByZXBvc2l0b3J5OiBQYWNrYWdlSnNvblsncmVwb3NpdG9yeSddLFxuICBleGlzdGluZ1JlcG9zaXRvcnk/OiBQYWNrYWdlSnNvblsncmVwb3NpdG9yeSddXG4pOiBQYWNrYWdlSnNvblsncmVwb3NpdG9yeSddIHtcbiAgY29uc3QgcmVwb3NpdG9yeU9iaiA9XG4gICAgdHlwZW9mIHJlcG9zaXRvcnkgPT09ICdvYmplY3QnXG4gICAgICA/IHJlcG9zaXRvcnlcbiAgICAgIDogdHlwZW9mIGV4aXN0aW5nUmVwb3NpdG9yeSA9PT0gJ29iamVjdCdcbiAgICAgICAgPyBleGlzdGluZ1JlcG9zaXRvcnlcbiAgICAgICAgOiB1bmRlZmluZWQ7XG5cbiAgcmV0dXJuIHtcbiAgICAuLi5yZXBvc2l0b3J5T2JqLFxuICAgIHR5cGU6ICdnaXQnLFxuICAgIHVybDogbm9ybWFsaXplZFVybCxcbiAgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdlbmVyYXRlU2NyaXB0cyhjb25maWc6IFBhY2thZ2VDb25maWcsIG9sZFNjcmlwdHM6IFBhY2thZ2VKc29uLlNjcmlwdHMpOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+IHtcbiAgY29uc3QgaGFzVHlwZWNoZWNrID0gY29uZmlnLmRvZXNDb250YWluVHlwZVNjcmlwdCB8fCBjb25maWcuZG9lc0NvbnRhaW5UeXBlU2NyaXB0SW5QYWNrYWdlcztcbiAgY29uc3Qgc2NyaXB0czogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHtcbiAgICAvLyBObyBgLS1idW5gOiBpdHMgbm9kZS0+YnVuIFBBVEggc2hpbSBsZWFrcyBpbnRvIGV2ZXJ5IGNoaWxkIHByb2Nlc3MgYW5kIGJyZWFrcyB0b29sc1xuICAgIC8vIHJlcXVpcmluZyByZWFsIE5vZGUuanMgKFBsYXl3cmlnaHQsIHdyYW5nbGVyLCB2aW5leHQpLlxuICAgIGNsZWFudXA6ICdidW4gd2IgbGludCAtLWZpeCAtLWZvcm1hdCcsXG4gICAgZm9ybWF0OiBgYnVuIHdiIGxpbnQgLS1mb3JtYXRgLFxuICAgIGxpbnQ6IGBidW4gd2IgbGludGAsXG4gICAgJ2xpbnQtZml4JzogJ2J1biB3YiBsaW50IC0tZml4JyxcbiAgICB0ZXN0OiAnYnVuIHdiIHRlc3QnLFxuICAgIHR5cGVjaGVjazogJ2J1biB3YiB0eXBlY2hlY2snLFxuICAgIHZlcmlmeTogJ2J1biB3YiB2ZXJpZnknLFxuICAgICd2ZXJpZnktZnVsbCc6ICdidW4gd2IgdmVyaWZ5IC0tZnVsbCcsXG4gIH07XG4gIGlmIChjb25maWcuaXNSb290KSB7XG4gICAgYXBwbHlUZXN0T25DaVNjcmlwdChzY3JpcHRzLCBvbGRTY3JpcHRzKTtcbiAgfVxuICBhcHBseVRlc3RTY3JpcHQoY29uZmlnLCBzY3JpcHRzLCBvbGRTY3JpcHRzKTtcbiAga2VlcEdlbmVyYXRlZFNjcmlwdFdyYXBwZXJzKHNjcmlwdHMsIG9sZFNjcmlwdHMsIFsndGVzdCcsICd2ZXJpZnktZnVsbCddKTtcbiAgYXBwbHlEYXRhYmFzZVNjcmlwdHMoY29uZmlnLCBzY3JpcHRzLCBvbGRTY3JpcHRzLCBgYnVuICR7Z2V0V2JEYXRhYmFzZUNvbW1hbmQoY29uZmlnKX1gKTtcbiAgYXBwbHlNaXNlVGFza1NjcmlwdHMoY29uZmlnLCBzY3JpcHRzLCBvbGRTY3JpcHRzLCBbJ2J1aWxkJywgJ2RldicsICdzdGFydCcsICd0ZXN0JywgJ3R5cGVjaGVjayddKTtcbiAgaWYgKCFoYXNUeXBlY2hlY2spIHtcbiAgICBkZWxldGUgc2NyaXB0cy50eXBlY2hlY2s7XG4gIH0gZWxzZSBpZiAoY29uZmlnLmRlcGVuZGluZy5weXJpZ2h0KSB7XG4gICAgc2NyaXB0cy50eXBlY2hlY2sgKz0gJyAmJiBweXJpZ2h0JztcbiAgfVxuICByZXR1cm4gc2NyaXB0cztcbn1cblxuLy8gQ0kgd29ya2Zsb3dzIChib3RoIHRoZSByZXVzYWJsZSB0ZXN0IHdvcmtmbG93IGFuZCB0aGUgc2VsZi1jb250YWluZWQgdmFyaWFudCBmb3Igbm9uLVdpbGxCb29zdGVyXG4vLyByZXBvc2l0b3JpZXMpIHByZWZlciBgdGVzdC9jaWAgb3ZlciBgdGVzdGAsIHNvIHN0YW5kYXJkaXplIGl0IG9uIGB3YiB0ZXN0LW9uLWNpYCBhdCB0aGUgcm9vdCDigJRcbi8vIGB3YiB0ZXN0LW9uLWNpYCBhbHJlYWR5IGl0ZXJhdGVzIHdvcmtzcGFjZSBwYWNrYWdlcyBpdHNlbGYuXG5mdW5jdGlvbiBhcHBseVRlc3RPbkNpU2NyaXB0KHNjcmlwdHM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4sIG9sZFNjcmlwdHM6IFBhY2thZ2VKc29uLlNjcmlwdHMpOiB2b2lkIHtcbiAgY29uc3Qgb2xkU2NyaXB0ID0gb2xkU2NyaXB0c1sndGVzdC9jaSddO1xuICAvLyBTb21lIHJlcG9zaXRvcmllcyB3cmFwIENJIHRlc3RzIHdpdGggZXh0cmEgc3RlcHMgKGUuZy4gc2VsZWN0aW5nIHNwZWMgZmlsZXMgb3IgcnVubmluZyByYXdcbiAgLy8gUGxheXdyaWdodCkgdGhhdCB3YiBjYW5ub3QgaW5mZXIgZ2VuZXJpY2FsbHk7IHN1Y2ggd3JhcHBlcnMgYXJlIHByZXNlcnZlZC5cbiAgc2NyaXB0c1sndGVzdC9jaSddID0gb2xkU2NyaXB0ICYmICFpc0dlbmVyYXRlZFRlc3RPbkNpU2NyaXB0KG9sZFNjcmlwdCkgPyBvbGRTY3JpcHQgOiAnYnVuIHdiIHRlc3Qtb24tY2knO1xufVxuXG4vKiogV2hldGhlciBhIHNjcmlwdCBib2R5IGlzIG9uZSBvZiB0aGUgZ2VuZXJhdGVkIGB3YiB0ZXN0LW9uLWNpYCBpbnZvY2F0aW9ucy4gKi9cbmZ1bmN0aW9uIGlzR2VuZXJhdGVkVGVzdE9uQ2lTY3JpcHQoc2NyaXB0OiBzdHJpbmcpOiBib29sZWFuIHtcbiAgcmV0dXJuIHNjcmlwdC50cmltKCkgPT09ICdidW4gd2IgdGVzdC1vbi1jaSc7XG59XG5cbi8qKlxuICogYHdiIHRlc3RgIHJ1bnMgSmF2YVNjcmlwdC9UeXBlU2NyaXB0IHRlc3QgcnVubmVycyBvbmx5LCBzbyByZXBsYWNpbmcgdGhlIGB0ZXN0YCBzY3JpcHQgb2YgYVxuICogcGFja2FnZSB3cml0dGVuIGluIGFub3RoZXIgbGFuZ3VhZ2UgKGUuZy4gYSBNYXZlbiBvciBhbiBSU3BlYyBwYWNrYWdlIGluIGEgcG9seWdsb3QgbW9ub3JlcG8pXG4gKiBzaWxlbnRseSBkcm9wcyBpdHMgd2hvbGUgc3VpdGU6IHRoZSBnZW5lcmF0ZWQgc2NyaXB0IHRoZW4gc3VjY2VlZHMgd2l0aG91dCBydW5uaW5nIGFueXRoaW5nLlxuICogU3VjaCBhIHBhY2thZ2Uga2VlcHMgaXRzIG93biBgdGVzdGAgc2NyaXB0OyBKUy9UUyBwYWNrYWdlcyBhcmUgc3RhbmRhcmRpemVkIGFzIHVzdWFsLlxuICovXG5mdW5jdGlvbiBhcHBseVRlc3RTY3JpcHQoXG4gIGNvbmZpZzogUGFja2FnZUNvbmZpZyxcbiAgc2NyaXB0czogUmVjb3JkPHN0cmluZywgc3RyaW5nPixcbiAgb2xkU2NyaXB0czogUGFja2FnZUpzb24uU2NyaXB0c1xuKTogdm9pZCB7XG4gIGNvbnN0IG9sZFNjcmlwdCA9IG9sZFNjcmlwdHMudGVzdD8udHJpbSgpO1xuICBpZiAoIW9sZFNjcmlwdCB8fCBkb2VzQ29udGFpbkpzT3JUcyhjb25maWcpIHx8IGlzR2VuZXJhdGVkVGVzdFNjcmlwdChvbGRTY3JpcHQpKSByZXR1cm47XG4gIHNjcmlwdHMudGVzdCA9IG9sZFNjcmlwdDtcbn1cblxuLyoqIFdoZXRoZXIgYSBzY3JpcHQgYm9keSBpcyBvbmUgb2YgdGhlIEtOT1dOIGdlbmVyYXRlZCBgd2IgdGVzdGAgaW52b2NhdGlvbnMuICovXG5mdW5jdGlvbiBpc0dlbmVyYXRlZFRlc3RTY3JpcHQoc2NyaXB0OiBzdHJpbmcpOiBib29sZWFuIHtcbiAgcmV0dXJuIHNjcmlwdC50cmltKCkgPT09ICdidW4gd2IgdGVzdCc7XG59XG5cbi8qKlxuICogS2VlcHMgYSBzY3JpcHQgdGhhdCBDSEFJTlMgZXh0cmEgY29tbWFuZHMgb250byB0aGUgZ2VuZXJhdGVkIG9uZSAoZS5nLiBhIHBvbHlnbG90IG1vbm9yZXBvXG4gKiBhcHBlbmRpbmcgaXRzIE1hdmVuIGFuZCBSU3BlYyBzdWl0ZXMgdG8gYHdiIHRlc3RgLCB3aGljaCBydW5zIEphdmFTY3JpcHQvVHlwZVNjcmlwdCBydW5uZXJzXG4gKiBvbmx5KS4gU3VjaCBhIHdyYXBwZXIgc3RpbGwgcnVucyB0aGUgZ2VuZXJhdGVkIGNvbW1hbmQsIHNvIHJlcGxhY2luZyBpdCB3b3VsZCBzaWxlbnRseSBkcm9wIHRoZVxuICogcmVwb3NpdG9yeSdzIG93biBzdGVwcyDigJQgdGhlIHNhbWUgcmVhc29uaW5nIGFzIGBhcHBseVRlc3RPbkNpU2NyaXB0YC4gQW4gdW5yZWNvZ25pemVkIGNoYWluZWRcbiAqIHNjcmlwdCBpcyBrZXB0IHdob2xlc2FsZSByYXRoZXIgdGhhbiBsb3NpbmcgaXRzIHByb2plY3Qtb3duZWQgY29tbWFuZHMuXG4gKi9cbmZ1bmN0aW9uIGtlZXBHZW5lcmF0ZWRTY3JpcHRXcmFwcGVycyhcbiAgc2NyaXB0czogUmVjb3JkPHN0cmluZywgc3RyaW5nPixcbiAgb2xkU2NyaXB0czogUGFja2FnZUpzb24uU2NyaXB0cyxcbiAgc2NyaXB0TmFtZXM6IHN0cmluZ1tdXG4pOiB2b2lkIHtcbiAgZm9yIChjb25zdCBzY3JpcHROYW1lIG9mIHNjcmlwdE5hbWVzKSB7XG4gICAgY29uc3Qgb2xkU2NyaXB0ID0gb2xkU2NyaXB0c1tzY3JpcHROYW1lXT8udHJpbSgpO1xuICAgIGNvbnN0IGdlbmVyYXRlZFNjcmlwdCA9IHNjcmlwdHNbc2NyaXB0TmFtZV07XG4gICAgaWYgKCFvbGRTY3JpcHQgfHwgIWdlbmVyYXRlZFNjcmlwdCB8fCBvbGRTY3JpcHQgPT09IGdlbmVyYXRlZFNjcmlwdCkgY29udGludWU7XG4gICAgY29uc3QgaGVhZFJlZ0V4cCA9IG5ldyBSZWdFeHAoXG4gICAgICBgXiR7ZXNjYXBlUmVnRXhwKGdlbmVyYXRlZFNjcmlwdCkucmVwbGFjZUFsbCgnICcsIFN0cmluZy5yYXdgWyBcXHRdK2ApfSg/PVsgXFxcXHRdKig/OiYmfFxcXFx8XFxcXHx8O3xcXFxcbikpYCxcbiAgICAgICd1J1xuICAgICk7XG4gICAgLy8gQSBuZXdsaW5lIHNlcGFyYXRlcyBzaGVsbCBjb21tYW5kcyBqdXN0IGxpa2UgJiYsIHx8IGFuZCA7LlxuICAgIGlmIChoZWFkUmVnRXhwLnRlc3Qob2xkU2NyaXB0KSkge1xuICAgICAgLy8gQSBmdW5jdGlvbiByZXBsYWNlbWVudCBrZWVwcyBgJGAtc2hhcGVkIGNoYXJhY3RlcnMgaW4gdGhlIGdlbmVyYXRlZCBjb21tYW5kIGxpdGVyYWwuXG4gICAgICBzY3JpcHRzW3NjcmlwdE5hbWVdID0gb2xkU2NyaXB0LnJlcGxhY2UoaGVhZFJlZ0V4cCwgKCkgPT4gZ2VuZXJhdGVkU2NyaXB0KTtcbiAgICB9IGVsc2UgaWYgKC8oPzomJnxcXHxcXHx8O3xcXG4pL3UudGVzdChvbGRTY3JpcHQpKSB7XG4gICAgICBzY3JpcHRzW3NjcmlwdE5hbWVdID0gb2xkU2NyaXB0O1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBhcHBseURhdGFiYXNlU2NyaXB0cyhcbiAgY29uZmlnOiBQYWNrYWdlQ29uZmlnLFxuICBzY3JpcHRzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+LFxuICBvbGRTY3JpcHRzOiBQYWNrYWdlSnNvbi5TY3JpcHRzLFxuICB3YkRiQ29tbWFuZDogc3RyaW5nXG4pOiB2b2lkIHtcbiAgaWYgKCFjb25maWcuZGVwZW5kaW5nLnByaXNtYSAmJiAhY29uZmlnLmRlcGVuZGluZy5kcml6emxlKSByZXR1cm47XG5cbiAgYXBwbHlEYXRhYmFzZVNjcmlwdChzY3JpcHRzLCBvbGRTY3JpcHRzLCAnZGItY3JlYXRlLW1pZ3JhdGlvbicsIGAke3diRGJDb21tYW5kfSBtaWdyYXRlLWRldmAsICdtaWdyYXRlLWRldicpO1xuICBhcHBseURhdGFiYXNlU2NyaXB0KFxuICAgIHNjcmlwdHMsXG4gICAgb2xkU2NyaXB0cyxcbiAgICAnZGItbWlncmF0ZScsXG4gICAgYCR7d2JEYkNvbW1hbmR9IG1pZ3JhdGUgLS1jaGVjay1pZGVtcG90ZW5jeWAsXG4gICAgJ21pZ3JhdGUgLS1jaGVjay1pZGVtcG90ZW5jeSdcbiAgKTtcbiAgYXBwbHlEYXRhYmFzZVNjcmlwdChzY3JpcHRzLCBvbGRTY3JpcHRzLCAnZGItdmlldycsIGAke3diRGJDb21tYW5kfSBzdHVkaW9gLCAnc3R1ZGlvJyk7XG59XG5cbmZ1bmN0aW9uIGFwcGx5RGF0YWJhc2VTY3JpcHQoXG4gIHNjcmlwdHM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4sXG4gIG9sZFNjcmlwdHM6IFBhY2thZ2VKc29uLlNjcmlwdHMsXG4gIG5hbWU6IHN0cmluZyxcbiAgZ2VuZXJhdGVkU2NyaXB0OiBzdHJpbmcsXG4gIGdlbmVyYXRlZEFyZ3VtZW50czogc3RyaW5nXG4pOiB2b2lkIHtcbiAgY29uc3Qgb2xkU2NyaXB0ID0gb2xkU2NyaXB0c1tuYW1lXTtcbiAgLy8gU29tZSByZXBvc2l0b3JpZXMgd3JhcCBtaWdyYXRpb24gY29tbWFuZHMgdG8gcHJlcGFyZSBTUUxpdGUgZGlyZWN0b3JpZXMsXG4gIC8vIGZhbiBvdXQgb3ZlciB0ZW5hbnRzLCBvciBwZXJmb3JtIGNsZWFudXAgdGhhdCB3YiBjYW5ub3QgaW5mZXIgZ2VuZXJpY2FsbHkuXG4gIGNvbnN0IGdlbmVyYXRlZEJvZGllcyA9IFtgYnVuIHdiIGRiICR7Z2VuZXJhdGVkQXJndW1lbnRzfWAsIGBidW4gd2IgcHJpc21hICR7Z2VuZXJhdGVkQXJndW1lbnRzfWBdO1xuICBzY3JpcHRzW25hbWVdID0gb2xkU2NyaXB0ICYmICFnZW5lcmF0ZWRCb2RpZXMuaW5jbHVkZXMob2xkU2NyaXB0LnRyaW0oKSkgPyBvbGRTY3JpcHQgOiBnZW5lcmF0ZWRTY3JpcHQ7XG59XG5cbmZ1bmN0aW9uIGdldFdiRGF0YWJhc2VDb21tYW5kKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6ICd3YiBkYicgfCAnd2IgcHJpc21hJyB7XG4gIGlmIChjb25maWcuZGVwZW5kaW5nLnByaXNtYSkgcmV0dXJuICd3YiBwcmlzbWEnO1xuICByZXR1cm4gJ3diIGRiJztcbn1cblxuZnVuY3Rpb24gaXNXYlBhY2thZ2UocGFja2FnZUpzb246IFBhY2thZ2VKc29uIHwgdW5kZWZpbmVkKTogYm9vbGVhbiB7XG4gIHJldHVybiBwYWNrYWdlSnNvbj8ubmFtZSA9PT0gd2JEZXBlbmRlbmN5O1xufVxuXG5mdW5jdGlvbiBhcHBseU1pc2VUYXNrU2NyaXB0cyhcbiAgY29uZmlnOiBQYWNrYWdlQ29uZmlnLFxuICBzY3JpcHRzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+LFxuICBvbGRTY3JpcHRzOiBQYWNrYWdlSnNvbi5TY3JpcHRzLFxuICBuYW1lczogc3RyaW5nW11cbik6IHZvaWQge1xuICBmb3IgKGNvbnN0IG5hbWUgb2YgbmFtZXMpIHtcbiAgICBpZiAoIWhhc01pc2VUYXNrKGNvbmZpZywgbmFtZSkpIGNvbnRpbnVlO1xuICAgIGlmIChkb2VzTWlzZVRhc2tDYWxsUGFja2FnZVNjcmlwdChjb25maWcsIG5hbWUpKSBjb250aW51ZTtcbiAgICAvLyBQcmVzZXJ2ZSBhIGxlYWRpbmcgYEtFWT1WQUxVRSBgIGVudiBwcmVmaXggKGUuZy4gYE1JU0VfRU5WPXRlc3RgKSBvbiBhbiBleGlzdGluZyBtaXNlIGJyaWRnZS5cbiAgICAvLyBTdWNoIGEgcHJlZml4IGlzIHJlcXVpcmVkIGZvciBtaXNlIGNvbmZpZyBlbnZpcm9ubWVudHMgKG1pc2UuPE1JU0VfRU5WPi50b21sKSwgd2hpY2ggYXJlXG4gICAgLy8gc2VsZWN0ZWQgZnJvbSBNSVNFX0VOViAqYmVmb3JlKiBtaXNlIHN0YXJ0cyBhbmQgY2Fubm90IGJlIHN3aXRjaGVkIGZyb20gaW5zaWRlIGEgdGFzazsgZHJvcHBpbmdcbiAgICAvLyBpdCB3b3VsZCBzaWxlbnRseSBydW4gdGhlIHRhc2sgaW4gdGhlIGRlZmF1bHQgZW52aXJvbm1lbnQuXG4gICAgY29uc3QgZW52UHJlZml4ID0gZXh0cmFjdE1pc2VCcmlkZ2VFbnZQcmVmaXgob2xkU2NyaXB0c1tuYW1lXSwgbmFtZSk7XG4gICAgaWYgKGVudlByZWZpeCA9PT0gdW5kZWZpbmVkICYmIG9sZFNjcmlwdHNbbmFtZV0gJiYgIShuYW1lIGluIHNjcmlwdHMpKSBjb250aW51ZTtcbiAgICBzY3JpcHRzW25hbWVdID0gYCR7ZW52UHJlZml4ID8/ICcnfW1pc2UgcnVuICR7bmFtZX1gO1xuICB9XG59XG5cbi8qKlxuICogUmV0dXJucyB0aGUgbGVhZGluZyBgS0VZPVZBTFVFIGAgZW52LXZhciBwcmVmaXggb2YgYW4gZXhpc3RpbmcgYG1pc2UgcnVuIDxuYW1lPmAgYnJpZGdlIHNjcmlwdFxuICogKHBvc3NpYmx5IGFuIGVtcHR5IHN0cmluZyB3aGVuIHRoZSBicmlkZ2UgaGFzIG5vIHByZWZpeCksIG9yIGB1bmRlZmluZWRgIHdoZW4gdGhlIHNjcmlwdCBpcyBub3QgYVxuICogbWlzZSBicmlkZ2UgZm9yIHRoZSBnaXZlbiB0YXNrLlxuICovXG5mdW5jdGlvbiBleHRyYWN0TWlzZUJyaWRnZUVudlByZWZpeChzY3JpcHQ6IHVua25vd24sIG5hbWU6IHN0cmluZyk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGlmICh0eXBlb2Ygc2NyaXB0ICE9PSAnc3RyaW5nJykgcmV0dXJuIHVuZGVmaW5lZDtcbiAgLy8gRWFjaCBhc3NpZ25tZW50IHZhbHVlIG1heSBiZSBkb3VibGUtcXVvdGVkLCBzaW5nbGUtcXVvdGVkLCBvciBhbiB1bnF1b3RlZCBydW4gb2Ygbm9uLXdoaXRlc3BhY2UsXG4gIC8vIHNvIHByZWZpeGVzIGxpa2UgYE1JU0VfRU5WPVwiYSBiXCJgICh3aG9zZSB2YWx1ZSBjb250YWlucyBzcGFjZXMpIGFyZSBtYXRjaGVkIGluc3RlYWQgb2YgZHJvcHBlZC5cbiAgY29uc3QgbWF0Y2ggPSBuZXcgUmVnRXhwKFN0cmluZy5yYXdgXigoPzpcXHcrPSg/OlwiW15cIl0qXCJ8J1teJ10qJ3xcXFMrKVxccyspKiltaXNlIHJ1biAke2VzY2FwZVJlZ0V4cChuYW1lKX0kYCwgJ3UnKS5leGVjKFxuICAgIHNjcmlwdC50cmltKClcbiAgKTtcbiAgcmV0dXJuIG1hdGNoPy5bMV07XG59XG5cbmZ1bmN0aW9uIGhhc01pc2VUYXNrKGNvbmZpZzogUGFja2FnZUNvbmZpZywgbmFtZTogc3RyaW5nKTogYm9vbGVhbiB7XG4gIHJldHVybiBPYmplY3QuaGFzT3duKGNvbmZpZy5taXNlVGFza3MsIG5hbWUpO1xufVxuXG5mdW5jdGlvbiBkb2VzTWlzZVRhc2tDYWxsUGFja2FnZVNjcmlwdChjb25maWc6IFBhY2thZ2VDb25maWcsIG5hbWU6IHN0cmluZyk6IGJvb2xlYW4ge1xuICBjb25zdCB0YXNrID0gY29uZmlnLm1pc2VUYXNrc1tuYW1lXTtcbiAgaWYgKCF0YXNrKSByZXR1cm4gZmFsc2U7XG4gIGNvbnN0IHBhY2thZ2VNYW5hZ2VycyA9IFsnYnVuJywgJ3lhcm4nLCAnbnBtJywgJ3BucG0nXTtcbiAgcmV0dXJuIHBhY2thZ2VNYW5hZ2Vycy5zb21lKChwYWNrYWdlTWFuYWdlcikgPT5cbiAgICBuZXcgUmVnRXhwKFN0cmluZy5yYXdgXFxiJHtwYWNrYWdlTWFuYWdlcn1cXHMrKD86cnVuXFxzKyk/JHtlc2NhcGVSZWdFeHAobmFtZSl9KD8hW2EtekEtWjAtOV9cXC06Ll0pYCwgJ3UnKS50ZXN0KHRhc2spXG4gICk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHVwZGF0ZVByaXZhdGVQYWNrYWdlcyhqc29uT2JqOiBXcml0YWJsZVBhY2thZ2VKc29uKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IHBhY2thZ2VOYW1lcyA9IG5ldyBTZXQoWy4uLk9iamVjdC5rZXlzKGpzb25PYmouZGVwZW5kZW5jaWVzKSwgLi4uT2JqZWN0LmtleXMoanNvbk9iai5kZXZEZXBlbmRlbmNpZXMpXSk7XG4gIGNvbnN0IHByaXZhdGVQYWNrYWdlczoge1xuICAgIHBhY2thZ2VOYW1lOiBzdHJpbmc7XG4gICAgb3JnOiBzdHJpbmc7XG4gICAgcmVwbzogc3RyaW5nO1xuICAgIHRhcmdldDogJ2RlcGVuZGVuY2llcycgfCAnZGV2RGVwZW5kZW5jaWVzJztcbiAgfVtdID0gW1xuICAgIHsgcGFja2FnZU5hbWU6ICdAd2lsbGJvb3N0ZXIvY29kZS1hbmFseXplcicsIG9yZzogJ1dpbGxCb29zdGVyJywgcmVwbzogJ2NvZGUtYW5hbHl6ZXInLCB0YXJnZXQ6ICdkZXZEZXBlbmRlbmNpZXMnIH0sXG4gICAgeyBwYWNrYWdlTmFtZTogJ0B3aWxsYm9vc3Rlci9qdWRnZScsIG9yZzogJ1dpbGxCb29zdGVyTGFiJywgcmVwbzogJ2p1ZGdlJywgdGFyZ2V0OiAnZGVwZW5kZW5jaWVzJyB9LFxuICAgIHsgcGFja2FnZU5hbWU6ICdAd2lsbGJvb3N0ZXIvbGxtLXByb3h5Jywgb3JnOiAnV2lsbEJvb3N0ZXJMYWInLCByZXBvOiAnbGxtLXByb3h5JywgdGFyZ2V0OiAnZGVwZW5kZW5jaWVzJyB9LFxuICBdO1xuXG4gIGF3YWl0IFByb21pc2UuYWxsKFxuICAgIHByaXZhdGVQYWNrYWdlcy5tYXAoYXN5bmMgKHsgb3JnLCBwYWNrYWdlTmFtZSwgcmVwbywgdGFyZ2V0IH0pID0+IHtcbiAgICAgIGlmICghcGFja2FnZU5hbWVzLmhhcyhwYWNrYWdlTmFtZSkgfHwgaXNXb3Jrc3BhY2VQYWNrYWdlKGpzb25PYmosIHBhY2thZ2VOYW1lKSkgcmV0dXJuO1xuXG4gICAgICBjb25zdCBleGlzdGluZ1NwZWNpZmllciA9IGpzb25PYmouZGVwZW5kZW5jaWVzW3BhY2thZ2VOYW1lXSA/PyBqc29uT2JqLmRldkRlcGVuZGVuY2llc1twYWNrYWdlTmFtZV07XG4gICAgICBjb25zdCBvdGhlclRhcmdldCA9IHRhcmdldCA9PT0gJ2RlcGVuZGVuY2llcycgPyAnZGV2RGVwZW5kZW5jaWVzJyA6ICdkZXBlbmRlbmNpZXMnO1xuICAgICAgLy8gVGhlIGxpbnQgcnVsZSBkaXNhbGxvd3MgYGRlbGV0ZWAgd2l0aCBjb21wdXRlZCBwYWNrYWdlIG5hbWVzOyBSZWZsZWN0IGhhcyB0aGUgc2FtZSBkZWxldGlvbiBzZW1hbnRpY3MgaGVyZS5cbiAgICAgIFJlZmxlY3QuZGVsZXRlUHJvcGVydHkoanNvbk9ialtvdGhlclRhcmdldF0sIHBhY2thZ2VOYW1lKTtcbiAgICAgIGpzb25PYmpbdGFyZ2V0XVtwYWNrYWdlTmFtZV0gPSBpc1Bpbm5lZFByaXZhdGVQYWNrYWdlU3BlY2lmaWVyKGV4aXN0aW5nU3BlY2lmaWVyLCBvcmcsIHJlcG8pXG4gICAgICAgID8gZXhpc3RpbmdTcGVjaWZpZXJcbiAgICAgICAgOiBhd2FpdCBnZXRMYXRlc3RQcml2YXRlUGFja2FnZVNwZWNpZmllcihvcmcsIHJlcG8pO1xuICAgIH0pXG4gICk7XG59XG5cbi8qKlxuICogV2hldGhlciB0aGUgZXhpc3Rpbmcgc3BlY2lmaWVyIGFscmVhZHkgcGlucyBhIGdpdCByZWYgb2YgdGhlIGV4cGVjdGVkIHByaXZhdGUgcmVwb3NpdG9yeS5cbiAqIHdiZnkgbXVzdCBub3QgYnVtcCBzdWNoIHBpbnM6IGEgcnVuIGludGVuZGVkIGFzIGNvbmZpZ3VyYXRpb24vcGFja2FnZS1tYW5hZ2VyIG1haW50ZW5hbmNlXG4gKiB3b3VsZCBvdGhlcndpc2UgY2hhbmdlIHRoZSBkZXBlbmRlbmN5J3MgdmVyc2lvbiBhcyBhIHNpZGUgZWZmZWN0ICh1cGRhdGluZyBwaW5zIGlzIFJlbm92YXRlJ3NcbiAqIGpvYiksIHBvc3NpYmx5IHRvIGEgY29tbWl0IHdob3NlIHByZWJ1aWx0IGFydGlmYWN0cyBhcmUgbWlzc2luZy5cbiAqL1xuZnVuY3Rpb24gaXNQaW5uZWRQcml2YXRlUGFja2FnZVNwZWNpZmllcihcbiAgc3BlY2lmaWVyOiBzdHJpbmcgfCB1bmRlZmluZWQsXG4gIG9yZzogc3RyaW5nLFxuICByZXBvOiBzdHJpbmdcbik6IHNwZWNpZmllciBpcyBzdHJpbmcge1xuICBpZiAoIXNwZWNpZmllcikgcmV0dXJuIGZhbHNlO1xuICByZXR1cm4gbmV3IFJlZ0V4cChTdHJpbmcucmF3YCg/Ol58WzovXSkke29yZ30vJHtyZXBvfSg/OlxcLmdpdCk/I1xcUyskYCwgJ3UnKS50ZXN0KHNwZWNpZmllcik7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGdldExhdGVzdFByaXZhdGVQYWNrYWdlU3BlY2lmaWVyKG9yZzogc3RyaW5nLCByZXBvOiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZz4ge1xuICBjb25zdCBjb21taXRIYXNoID0gYXdhaXQgZ2V0TGF0ZXN0Q29tbWl0SGFzaChvcmcsIHJlcG8pO1xuICByZXR1cm4gYGdpdEBnaXRodWIuY29tOiR7b3JnfS8ke3JlcG99LmdpdCMke2NvbW1pdEhhc2h9YDtcbn1cblxuZnVuY3Rpb24gaXNXb3Jrc3BhY2VQYWNrYWdlKGpzb25PYmo6IFBhY2thZ2VKc29uLCBwYWNrYWdlTmFtZTogc3RyaW5nKTogYm9vbGVhbiB7XG4gIHJldHVybiAoanNvbk9iai5kZXZEZXBlbmRlbmNpZXM/LltwYWNrYWdlTmFtZV0gfHwganNvbk9iai5kZXBlbmRlbmNpZXM/LltwYWNrYWdlTmFtZV0gfHwgJycpLmluY2x1ZGVzKCd3b3Jrc3BhY2UnKTtcbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB7IHF1b3RlRm9yU2hlbGwgfSBmcm9tICdAd2lsbGJvb3N0ZXIvc2hhcmVkLWxpYi9zcmMnO1xuaW1wb3J0ICogYXMgeWFtbCBmcm9tICdqcy15YW1sJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB7IGZzVXRpbCB9IGZyb20gJy4uL3V0aWxzL2ZzVXRpbC5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGV4dGVuc2lvbnMgfSBmcm9tICcuLi91dGlscy9leHRlbnNpb25zLmpzJztcbmltcG9ydCB7IGdldEdlbkkxOG5Uc0NvbW1hbmQgfSBmcm9tICcuLi91dGlscy9nZW5JMThuVHMuanMnO1xuaW1wb3J0IHsgZG9lc0NvbnRhaW5KYXZhLCBkb2VzQ29udGFpbkpzT3JUcyB9IGZyb20gJy4uL3V0aWxzL3BhY2thZ2VDYXBhYmlsaXRpZXMuanMnO1xuXG5pbXBvcnQgeyBnZW5lcmF0ZVNjcmlwdHMgfSBmcm9tICcuL3BhY2thZ2VKc29uLmpzJztcblxuaW50ZXJmYWNlIExlZnRob29rU2V0dGluZ3Mge1xuICBnbG9iX21hdGNoZXI6ICdkb3VibGVzdGFyJztcbiAgJ3Bvc3QtbWVyZ2UnOiB7XG4gICAgam9iczogTGVmdGhvb2tKb2JbXTtcbiAgfTtcbiAgJ3ByZS1jb21taXQnOiB7XG4gICAgam9iczogTGVmdGhvb2tKb2JbXTtcbiAgfTtcbiAgJ3ByZS1wdXNoJzoge1xuICAgIGpvYnM6IExlZnRob29rSm9iW107XG4gIH07XG59XG5cbmludGVyZmFjZSBMZWZ0aG9va0pvYiB7XG4gIG5hbWU6IHN0cmluZztcbiAgZ2xvYj86IHN0cmluZztcbiAgcnVuPzogc3RyaW5nO1xuICBzY3JpcHQ/OiBzdHJpbmc7XG4gIHJ1bm5lcj86ICdiYXNoJztcbiAgc3RhZ2VfZml4ZWQ/OiB0cnVlO1xufVxuXG5jb25zdCBiYXNlU2V0dGluZ3M6IE9taXQ8TGVmdGhvb2tTZXR0aW5ncywgJ3ByZS1jb21taXQnPiA9IHtcbiAgZ2xvYl9tYXRjaGVyOiAnZG91Ymxlc3RhcicsXG4gICdwb3N0LW1lcmdlJzoge1xuICAgIGpvYnM6IFtcbiAgICAgIHtcbiAgICAgICAgbmFtZTogJ3ByZXBhcmUnLFxuICAgICAgICBzY3JpcHQ6ICdwcmVwYXJlLnNoJyxcbiAgICAgICAgcnVubmVyOiAnYmFzaCcsXG4gICAgICB9LFxuICAgIF0sXG4gIH0sXG4gICdwcmUtcHVzaCc6IHtcbiAgICBqb2JzOiBbXG4gICAgICB7XG4gICAgICAgIG5hbWU6ICdjaGVjaycsXG4gICAgICAgIHNjcmlwdDogJ2NoZWNrLnNoJyxcbiAgICAgICAgcnVubmVyOiAnYmFzaCcsXG4gICAgICB9LFxuICAgIF0sXG4gIH0sXG59O1xuXG4vLyBMZWZ0aG9vayBleHBhbmRzIHtzdGFnZWRfZmlsZXN9IGFzIHNoZWxsLWVzY2FwZWQgYXJncywgc28gdGhlIHVucXVvdGVkIGxvb3BzIGJlbG93IGtlZXAgcGF0aHNcbi8vIHdpdGggc3BhY2VzIGludGFjdC5cbmNvbnN0IHByZUNvbW1pdFNldHRpbmdzOiBMZWZ0aG9va1NldHRpbmdzWydwcmUtY29tbWl0J10gPSB7XG4gIGpvYnM6IFtcbiAgICB7XG4gICAgICBuYW1lOiAnY2xlYW51cCcsXG4gICAgICBnbG9iOiAnJyxcbiAgICAgIHJ1bjogJycsXG4gICAgICBzdGFnZV9maXhlZDogdHJ1ZSxcbiAgICB9LFxuICAgIHtcbiAgICAgIG5hbWU6ICdjaGVjay1taWdyYXRpb25zJyxcbiAgICAgIGdsb2I6ICcqKi9taWdyYXRpb24uc3FsJyxcbiAgICAgIHJ1bjogYFxuZmFpbGVkPTBcbmZvciBmaWxlIGluIHtzdGFnZWRfZmlsZXN9OyBkb1xuICBpZiBncmVwIC1xICdXYXJuaW5nczonIFwiJGZpbGVcIjsgdGhlblxuICAgIGVjaG8gXCJNaWdyYXRpb24gU1FMIGZpbGUgKCRmaWxlKSBjb250YWlucyB3YXJuaW5ncyEgUGxlYXNlIHNvbHZlIHRoZSB3YXJuaW5ncyBhbmQgY29tbWl0IGFnYWluLlwiXG4gICAgZmFpbGVkPTFcbiAgZmlcbmRvbmVcbmV4aXQgXCIkZmFpbGVkXCJcbmAudHJpbSgpLFxuICAgIH0sXG4gICAge1xuICAgICAgLy8gYnVuIHJlY29yZHMgYW4gYWJzb2x1dGUgYHJlc29sdmVkYCBVUkwgZm9yIGFuIGFscmVhZHktbG9ja2VkIHBhY2thZ2Ugd2hlbmV2ZXIgdGhlXG4gICAgICAvLyBjb25maWd1cmVkIHJlZ2lzdHJ5IGRvZXMgbm90IHNlcnZlIHRoZSB0YXJiYWxsIGhvc3QgaW4gdGhlIHBhY2thZ2UgbWV0YWRhdGEg4oCUIHdoaWNoIGlzXG4gICAgICAvLyBleGFjdGx5IHdoYXQgdGhlIFRha3VtaSBHdWFyZCBwcm94eSBkb2VzLiBTbyBhbiBpbnN0YWxsIHJ1biB3aXRoIEd1YXJkIGFzIHRoZSBkZWZhdWx0XG4gICAgICAvLyByZWdpc3RyeSAoQ0ksIG9yIGEgZGV2ZWxvcGVyIHdobyBwdXQgaXQgaW4gfi8ubnBtcmMpIGJha2VzIG5wbS5mbGF0dC50ZWNoIFVSTHMgaW50b1xuICAgICAgLy8gYnVuLmxvY2ssIGFuZCBjb21taXR0aW5nIHRoZW0gcGlucyBhIFNIQVJFRCBsb2NrZmlsZSB0byBvbmUgZW52aXJvbm1lbnQncyBtaXJyb3I6IGV2ZXJ5XG4gICAgICAvLyBsYXRlciBpbnN0YWxsIGRvd25sb2FkcyB0aHJvdWdoIHRoZSBwcm94eSwgYW5kIGEgY29sZC1jYWNoZSBpbnN0YWxsIGZhaWxzIG91dHJpZ2h0IHdpdGhcbiAgICAgIC8vIDQwMSBmb3IgYW55b25lIHdob3NlIG5wbXJjIGNhcnJpZXMgYSByZWdpc3RyeS5ucG1qcy5vcmcgdG9rZW4sIGJlY2F1c2UgYnVuIHNlbmRzIHRoZVxuICAgICAgLy8gZGVmYXVsdCByZWdpc3RyeSdzIGNyZWRlbnRpYWxzIHRvIHdoYXRldmVyIGhvc3QgdGhlIGxvY2tmaWxlIG5hbWVzLiBHdWFyZCBjb3ZlcmFnZSBkb2VzXG4gICAgICAvLyBub3QgZGVwZW5kIG9uIHRoZXNlIFVSTHMg4oCUIHdpdGggYW4gZW1wdHkgYHJlc29sdmVkYCwgYnVuIGRlcml2ZXMgdGhlIGRvd25sb2FkIFVSTCBmcm9tXG4gICAgICAvLyB0aGUgY29uZmlndXJlZCByZWdpc3RyeSDigJQgc28gc3RyaXAgdGhlbS4gT25seSB0aGUgR3VhcmQgaG9zdCBpcyBzdHJpcHBlZDogYSBzY29wZWRcbiAgICAgIC8vIHJlZ2lzdHJ5IHN1Y2ggYXMgVmVyZGFjY2lvIGxlZ2l0aW1hdGVseSByZWNvcmRzIGl0cyBvd24gVVJMIGZvciBwcml2YXRlIHBhY2thZ2VzLlxuICAgICAgbmFtZTogJ25vcm1hbGl6ZS1idW4tbG9ja2ZpbGUnLFxuICAgICAgZ2xvYjogJ2J1bi5sb2NrJyxcbiAgICAgIHJ1bjogJ2Jhc2ggLmxlZnRob29rL25vcm1hbGl6ZS1idW4tbG9ja2ZpbGUuc2gge3N0YWdlZF9maWxlc30nLFxuICAgICAgc3RhZ2VfZml4ZWQ6IHRydWUsXG4gICAgfSxcbiAgICB7XG4gICAgICAvLyBPbmx5IHdpbGxib29zdGVyLWNvbmZpZ3MgZ2V0cyB0aGlzIGpvYjogZXZlcnkgb3RoZXIgcmVwb3NpdG9yeSdzIHJlbm92YXRlLmpzb25jIG1lcmVseVxuICAgICAgLy8gZXh0ZW5kcyB0aGUgc2hhcmVkIHByZXNldCwgYW5kIHRoZSB2YWxpZGF0b3IgZG9lcyBub3QgcmVzb2x2ZSByZW1vdGUgcHJlc2V0cywgc28gcnVubmluZyBpdFxuICAgICAgLy8gdGhlcmUgd291bGQgdmFsaWRhdGUgdHdvIGxpbmVzIGFuZCBjYXRjaCBub3RoaW5nLiBgLS1uby1nbG9iYWxgIHZhbGlkYXRlcyB0aGUgcHJlc2V0IGFzIGFcbiAgICAgIC8vIHJlcG8gY29uZmlnIGluc3RlYWQgb2YgYSBzZWxmLWhvc3RlZCBnbG9iYWwgY29uZmlnLCBhbmQgYEBsYXRlc3RgIGtlZXBzIG5wbSBmcm9tIHNpbGVudGx5XG4gICAgICAvLyBpbnN0YWxsaW5nIGFuIGFuY2llbnQgUmVub3ZhdGUgdGhhdCBjYW5ub3QgZXZlbiBwYXJzZSBKU09OQyB3aGVuIHRoZSBsb2NhbCBOb2RlIGxhZ3MgYmVoaW5kLlxuICAgICAgLy8gU3RhZ2luZyBhIGRlbGV0aW9uIG9mIHJlbm92YXRlLmpzb25jIGxlYXZlcyBubyBmaWxlIGZvciBpbnNwZWN0aW9uLCBzbyBMZWZ0aG9vayBza2lwcyB0aGlzXG4gICAgICAvLyBqb2IgaW5zdGVhZCBvZiBydW5uaW5nIHRoZSB2YWxpZGF0b3Igb24gYSBtaXNzaW5nIHBhdGgg4oCUIGRlbGliZXJhdGVseSwgYmVjYXVzZSBkZWxldGluZyB0aGVcbiAgICAgIC8vIHNoYXJlZCBwcmVzZXQgaXMgbm90IGFuIG9wZXJhdGlvbiB0aGlzIGhvb2sgbmVlZHMgdG8gZ3VhcmQuXG4gICAgICBuYW1lOiAndmFsaWRhdGUtcmVub3ZhdGUtY29uZmlnJyxcbiAgICAgIGdsb2I6ICdyZW5vdmF0ZS5qc29uYycsXG4gICAgICBydW46ICducHggLS15ZXMgLS1wYWNrYWdlIHJlbm92YXRlQGxhdGVzdCAtLSByZW5vdmF0ZS1jb25maWctdmFsaWRhdG9yIC0tc3RyaWN0IC0tbm8tZ2xvYmFsIHtzdGFnZWRfZmlsZXN9JyxcbiAgICB9LFxuICBdLFxufTtcblxuY29uc3Qgc2NyaXB0cyA9IHtcbiAgLy8gcHJlcGFyZSBjYWxscyB0aGlzIHdpdGhvdXQgYXJndW1lbnRzIGFmdGVyIEJ1biBzYXZlcyB0aGUgcm9vdCBsb2NrZmlsZTsgTGVmdGhvb2sgcGFzc2VzIGl0c1xuICAvLyBzdGFnZWQgcGF0aC4gVGhlIHVucHJlZGljdGFibGUgc2libGluZyBmaWxlIG1ha2VzIHJlcGxhY2VtZW50IGF0b21pYywgYGNwIC1wYCBwcmVzZXJ2ZXMgaXRzXG4gIC8vIG1vZGUsIGFuZCB0aGUgYW5jaG9yZWQgcGF0dGVybiBjYW5ub3QgZXJhc2UgYSBkaXJlY3QgdGFyYmFsbCBkZXBlbmRlbmN5IFVSTC5cbiAgbm9ybWFsaXplQnVuTG9ja2ZpbGU6IGBcbiMhL2Jpbi9iYXNoXG5zZXQgLWVcblxuaWYgW1sgXCIkI1wiIC1lcSAwIF1dOyB0aGVuXG4gIHNldCAtLSBidW4ubG9ja1xuZmlcblxubm9ybWFsaXplZD1cIlwiXG50cmFwICdbWyAteiBcIiRub3JtYWxpemVkXCIgXV0gfHwgcm0gLWYgXCIkbm9ybWFsaXplZFwiJyBFWElUXG5mb3IgZmlsZSBpbiBcIiRAXCI7IGRvXG4gIFtbIC1mIFwiJGZpbGVcIiBdXSB8fCBjb250aW51ZVxuICBub3JtYWxpemVkPVwiJChta3RlbXAgXCIkZmlsZS53YmZ5LW5vcm1hbGl6aW5nLlhYWFhYWFwiKVwiXG4gIGNwIC1wIFwiJGZpbGVcIiBcIiRub3JtYWxpemVkXCJcbiAgc2VkIC1FICdzIyhcIiwgKVwiaHR0cHM6Ly9ucG1cXFxcLmZsYXR0XFxcXC50ZWNoL1teXCJdKlwiI1xcXFwxXCJcIiNnJyBcIiRmaWxlXCIgPiBcIiRub3JtYWxpemVkXCJcbiAgaWYgISBjbXAgLXMgXCIkZmlsZVwiIFwiJG5vcm1hbGl6ZWRcIjsgdGhlblxuICAgIG12IFwiJG5vcm1hbGl6ZWRcIiBcIiRmaWxlXCJcbiAgICBlY2hvIFwiUmVtb3ZlZCBUYWt1bWkgR3VhcmQgcHJveHkgVVJMcyBmcm9tICRmaWxlIHNvIHRoZSBsb2NrZmlsZSBzdGF5cyByZWdpc3RyeS1hZ25vc3RpYy5cIlxuICBmaVxuICBybSAtZiBcIiRub3JtYWxpemVkXCJcbiAgbm9ybWFsaXplZD1cIlwiXG5kb25lXG5gLnRyaW0oKSxcbiAgcG9zdE1lcmdlOiBgXG4jIS9iaW4vYmFzaFxuXG5jaGFuZ2VkX2ZpbGVzPVwiJChnaXQgZGlmZi10cmVlIC1yIC0tbmFtZS1vbmx5IC0tbm8tY29tbWl0LWlkIE9SSUdfSEVBRCBIRUFEKVwiXG5cbnJ1bl9pZl9jaGFuZ2VkKCkge1xuICBpZiBlY2hvIFwiJGNoYW5nZWRfZmlsZXNcIiB8IGdyZXAgLS1xdWlldCAtRSBcIiQxXCI7IHRoZW5cbiAgICBldmFsIFwiJDJcIlxuICBmaVxufVxuYC50cmltKCksXG59O1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVMZWZ0aG9vayhjb25maWc6IFBhY2thZ2VDb25maWcsIGFsbENvbmZpZ3M6IFBhY2thZ2VDb25maWdbXSA9IFtjb25maWddKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZ2VuZXJhdGVMZWZ0aG9vaycsIGFzeW5jICgpID0+IHtcbiAgICBhd2FpdCBjb3JlKGNvbmZpZywgYWxsQ29uZmlncyk7XG4gIH0pO1xufVxuXG5hc3luYyBmdW5jdGlvbiBjb3JlKGNvbmZpZzogUGFja2FnZUNvbmZpZywgYWxsQ29uZmlnczogUGFja2FnZUNvbmZpZ1tdKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IGRpclBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICcubGVmdGhvb2snKTtcbiAgY29uc3QgeyBsaW50IH0gPSBnZW5lcmF0ZVNjcmlwdHMoY29uZmlnLCB7fSk7XG4gIGNvbnN0IHNldHRpbmdzOiBQYXJ0aWFsPExlZnRob29rU2V0dGluZ3M+ID0ge1xuICAgIC4uLmJhc2VTZXR0aW5ncyxcbiAgICAncHJlLWNvbW1pdCc6IHtcbiAgICAgIGpvYnM6IGdldFByZUNvbW1pdEpvYnMoY29uZmlnKSxcbiAgICB9LFxuICB9O1xuICBpZiAoIWxpbnQpIHtcbiAgICBkZWxldGUgc2V0dGluZ3NbJ3ByZS1wdXNoJ107XG4gIH1cbiAgYXdhaXQgUHJvbWlzZS5hbGwoW1xuICAgIGZzVXRpbC53cml0ZUZpbGVDb25maW5lZChwYXRoLmpvaW4oY29uZmlnLmRpclBhdGgsICdsZWZ0aG9vay55bWwnKSwgeWFtbC5kdW1wKHNldHRpbmdzLCB7IGxpbmVXaWR0aDogLTEgfSkpLFxuICAgIGZzLnByb21pc2VzLnJtKGRpclBhdGgsIHsgZm9yY2U6IHRydWUsIHJlY3Vyc2l2ZTogdHJ1ZSB9KSxcbiAgXSk7XG5cbiAgaWYgKGxpbnQpIHtcbiAgICBjb25zdCBwcmVQdXNoID0gZ2V0UHJlUHVzaFNjcmlwdChjb25maWcpO1xuICAgIGZzLm1rZGlyU3luYyhwYXRoLmpvaW4oZGlyUGF0aCwgJ3ByZS1wdXNoJyksIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICAgIGF3YWl0IGZzLnByb21pc2VzLndyaXRlRmlsZShwYXRoLmpvaW4oZGlyUGF0aCwgJ3ByZS1wdXNoJywgJ2NoZWNrLnNoJyksIHByZVB1c2ggKyAnXFxuJywge1xuICAgICAgbW9kZTogMG83NTUsXG4gICAgfSk7XG4gIH1cbiAgY29uc3QgcG9zdE1lcmdlQ29tbWFuZCA9IGAke3NjcmlwdHMucG9zdE1lcmdlfVxcblxcbiR7Z2VuZXJhdGVQb3N0TWVyZ2VDb21tYW5kcyhjb25maWcsIGFsbENvbmZpZ3MpLmpvaW4oJ1xcbicpfVxcbmA7XG4gIGZzLm1rZGlyU3luYyhkaXJQYXRoLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgYXdhaXQgZnMucHJvbWlzZXMud3JpdGVGaWxlKHBhdGgucmVzb2x2ZShkaXJQYXRoLCAnbm9ybWFsaXplLWJ1bi1sb2NrZmlsZS5zaCcpLCBzY3JpcHRzLm5vcm1hbGl6ZUJ1bkxvY2tmaWxlICsgJ1xcbicsIHtcbiAgICBtb2RlOiAwbzc1NSxcbiAgfSk7XG4gIGZzLm1rZGlyU3luYyhwYXRoLmpvaW4oZGlyUGF0aCwgJ3Bvc3QtbWVyZ2UnKSwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gIGF3YWl0IGZzLnByb21pc2VzLndyaXRlRmlsZShwYXRoLnJlc29sdmUoZGlyUGF0aCwgJ3Bvc3QtbWVyZ2UnLCAncHJlcGFyZS5zaCcpLCBwb3N0TWVyZ2VDb21tYW5kLCB7XG4gICAgbW9kZTogMG83NTUsXG4gIH0pO1xufVxuXG5mdW5jdGlvbiBnZXRQcmVQdXNoU2NyaXB0KGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IHN0cmluZyB7XG4gIC8vIEJ1biByZXBvcyByZWNlaXZlIHdiIGFzIHBhcnQgb2Ygd2JmeSdzIG1hbmFnZWQgdG9vbGNoYWluLCBzbyBnZW5lcmF0ZSB0aGVcbiAgLy8gZmluYWwgaG9vayBjb21tYW5kIG9uIHRoZSBmaXJzdCBydW4gaW5zdGVhZCBvZiBjaGFuZ2luZyBpdCBvbiB0aGUgc2Vjb25kLlxuICBjb25zdCBxdWlldExpbnRDb21tYW5kID0gJ2J1biB3YiBsaW50IC0tcXVpZXQnO1xuICAvLyBObyBzZXBhcmF0ZSB0eXBlY2hlY2sgc3RlcCBuZWVkZWQg4oCUIHRoZSBsaW50IGNvbW1hbmQgYWxyZWFkeSBpbmNsdWRlcyB0eXBlY2hlY2tpbmcuXG4gIGlmIChjb25maWcucmVwb3NpdG9yeT8uc3RhcnRzV2l0aCgnZ2l0aHViOldpbGxCb29zdGVyTGFiLycpKSB7XG4gICAgcmV0dXJuIGBcbiMhL2Jpbi9iYXNoXG5cbmlmIFsgJChnaXQgYnJhbmNoIC0tc2hvdy1jdXJyZW50KSA9IFwibWFpblwiIF0gJiYgWyAkKGdpdCBjb25maWcgdXNlci5lbWFpbCkgIT0gXCJleGthenV1QGdtYWlsLmNvbVwiIF07IHRoZW5cbiAgZWNobyBcIioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlwiXG4gIGVjaG8gXCIqKiogRG9uJ3QgcHVzaCBtYWluIGJyYW5jaCBkaXJlY3RseS4gVXNlIFBSISAqKipcIlxuICBlY2hvIFwiKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXCJcbiAgZXhpdCAxXG5maVxuXG4ke3F1aWV0TGludENvbW1hbmR9XG5gLnRyaW0oKTtcbiAgfVxuICByZXR1cm4gcXVpZXRMaW50Q29tbWFuZDtcbn1cblxuZnVuY3Rpb24gZ2V0UHJlQ29tbWl0Sm9icyhjb25maWc6IFBhY2thZ2VDb25maWcpOiBMZWZ0aG9va0pvYltdIHtcbiAgcmV0dXJuIHByZUNvbW1pdFNldHRpbmdzLmpvYnNcbiAgICAuZmlsdGVyKChqb2IpID0+IGpvYi5uYW1lICE9PSAndmFsaWRhdGUtcmVub3ZhdGUtY29uZmlnJyB8fCBjb25maWcuaXNXaWxsQm9vc3RlckNvbmZpZ3MpXG4gICAgLm1hcCgoam9iKSA9PlxuICAgICAgam9iLm5hbWUgPT09ICdjbGVhbnVwJ1xuICAgICAgICA/IHtcbiAgICAgICAgICAgIC4uLmpvYixcbiAgICAgICAgICAgIGdsb2I6IGdldENsZWFudXBHbG9icyhjb25maWcpLFxuICAgICAgICAgICAgcnVuOiBnZXRDbGVhbnVwQ29tbWFuZChjb25maWcpLFxuICAgICAgICAgIH1cbiAgICAgICAgOiBqb2JcbiAgICApO1xufVxuXG5mdW5jdGlvbiBnZXRDbGVhbnVwR2xvYnMoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogc3RyaW5nIHtcbiAgLy8gTGV0IGB3YiBsaW50IC0tZm9ybWF0YCBkZWNpZGUgd2hldGhlciBQcmV0dGllciBpcyBhdmFpbGFibGU7IHRoZSBob29rXG4gIC8vIHN0aWxsIG5lZWRzIHRvIHRyaWdnZXIgd2hlbiBhZGRpbmcgdGhlIGZpcnN0IHByZXR0aWVyLW9ubHkgZmlsZS5cbiAgY29uc3Qgc3VwcG9ydGVkRXh0ZW5zaW9ucyA9IFsuLi5leHRlbnNpb25zLnByZXR0aWVyT25seV07XG4gIGlmIChkb2VzQ29udGFpbkpzT3JUcyhjb25maWcpKSB7XG4gICAgc3VwcG9ydGVkRXh0ZW5zaW9ucy5wdXNoKC4uLmV4dGVuc2lvbnMub3hmbXQsIC4uLmV4dGVuc2lvbnMub3hsaW50KTtcbiAgfVxuICBpZiAoY29uZmlnLmRvZXNDb250YWluUG9ldHJ5TG9jayB8fCBjb25maWcuZG9lc0NvbnRhaW5VdkxvY2spIHtcbiAgICBzdXBwb3J0ZWRFeHRlbnNpb25zLnB1c2goJ3B5Jyk7XG4gIH1cbiAgaWYgKGNvbmZpZy5kb2VzQ29udGFpblB1YnNwZWNZYW1sKSB7XG4gICAgc3VwcG9ydGVkRXh0ZW5zaW9ucy5wdXNoKCdkYXJ0Jyk7XG4gIH1cbiAgY29uc3QgZmlsdGVyZWRFeHRlbnNpb25zID0gWy4uLm5ldyBTZXQoc3VwcG9ydGVkRXh0ZW5zaW9ucyldLnRvU29ydGVkKCk7XG4gIHJldHVybiBgKiovKi57JHtmaWx0ZXJlZEV4dGVuc2lvbnMuam9pbignLCcpfX1gO1xufVxuXG5mdW5jdGlvbiBnZXRDbGVhbnVwQ29tbWFuZChjb25maWc6IFBhY2thZ2VDb25maWcpOiBzdHJpbmcge1xuICBpZiAoaGFzTG9jYWxXYldvcmtzcGFjZShjb25maWcpKSB7XG4gICAgcmV0dXJuIFN0cmluZy5yYXdgXG5idW4gcnVuIC0tY3dkIHBhY2thZ2VzL3diIHN0YXJ0IC0td29ya2luZy1kaXIgXCIkKGdpdCByZXYtcGFyc2UgLS1zaG93LXRvcGxldmVsKVwiIGxpbnQgLS1maXggLS1mb3JtYXQgLS0ge3N0YWdlZF9maWxlc31cbmAudHJpbSgpO1xuICB9XG4gIC8vIFB5dGhvbi1vbmx5IEJ1biByZXBvcyBpbnN0YWxsIHdiIGZvciBzaGFyZWQgc2NyaXB0cyBidXQgbm90IE94bGludCwgc29cbiAgLy8gc3RhZ2VkLWZpbGUgaG9va3MgbXVzdCB1c2UgdGhlIGxhbmd1YWdlLXNwZWNpZmljIGZvcm1hdHRlciBwYXRoIGJlbG93LlxuICBjb25zdCBjYW5Vc2VXYkZvclN0YWdlZEZpbGVzID0gZG9lc0NvbnRhaW5Kc09yVHMoY29uZmlnKSB8fCBkb2VzQ29udGFpbkphdmEoY29uZmlnKTtcbiAgaWYgKGNhblVzZVdiRm9yU3RhZ2VkRmlsZXMpIHtcbiAgICByZXR1cm4gYFxuYnVuIHdiIGxpbnQgLS1maXggLS1mb3JtYXQgLS0ge3N0YWdlZF9maWxlc31cbmAudHJpbSgpO1xuICB9XG5cbiAgcmV0dXJuIFN0cmluZy5yYXdgXG5wYWNrYWdlX2pzb25fZmlsZXM9XCIkKHByaW50ZiAnJXNcXG4nIHtzdGFnZWRfZmlsZXN9IHwgZ3JlcCAtRSAnKF58LylwYWNrYWdlXFwuanNvbiQnIHx8IHRydWUpXCJcbiR7aGFzUHl0aG9uUGFja2FnZU1hbmFnZXIoY29uZmlnKSA/IFN0cmluZy5yYXdgcHl0aG9uX2ZpbGVzPVwiJChwcmludGYgJyVzXFxuJyB7c3RhZ2VkX2ZpbGVzfSB8IGdyZXAgLUUgJ1xcLnB5JCcgfHwgdHJ1ZSlcImAgOiAnJ31cbiR7Y29uZmlnLmRvZXNDb250YWluUHVic3BlY1lhbWwgPyBTdHJpbmcucmF3YGRhcnRfZmlsZXM9XCIkKHByaW50ZiAnJXNcXG4nIHtzdGFnZWRfZmlsZXN9IHwgZ3JlcCAtRSAnXFwuZGFydCQnIHwgZ3JlcCAtdiAnZ2VuZXJhdGVkJyB8IGdyZXAgLXYgJ1xcLmZyZWV6ZWRcXC5kYXJ0JCcgfCBncmVwIC12ICdcXC5nXFwuZGFydCQnIHx8IHRydWUpXCJgIDogJyd9XG5cbmlmIFsgLW4gXCIkcGFja2FnZV9qc29uX2ZpbGVzXCIgXTsgdGhlblxuICBidW4gc29ydC1wYWNrYWdlLWpzb24gJHBhY2thZ2VfanNvbl9maWxlc1xuZmlcbiR7XG4gIGhhc1B5dGhvblBhY2thZ2VNYW5hZ2VyKGNvbmZpZylcbiAgICA/IGBpZiBbIC1uIFwiJHB5dGhvbl9maWxlc1wiIF07IHRoZW5cbiAgJHtnZXRQeXRob25SdW5uZXIoY29uZmlnKX0gaXNvcnQgLS1wcm9maWxlIGJsYWNrIC0tZmlsdGVyLWZpbGVzICRweXRob25fZmlsZXNcbiAgJHtnZXRQeXRob25SdW5uZXIoY29uZmlnKX0gYmxhY2sgJHB5dGhvbl9maWxlc1xuICAke2dldFB5dGhvblJ1bm5lcihjb25maWcpfSBmbGFrZTggJHB5dGhvbl9maWxlc1xuZmlgXG4gICAgOiAnJ1xufVxuJHtcbiAgY29uZmlnLmRvZXNDb250YWluUHVic3BlY1lhbWxcbiAgICA/IGBpZiBbIC1uIFwiJGRhcnRfZmlsZXNcIiBdOyB0aGVuXG4gIGRhcnQgZm9ybWF0ICRkYXJ0X2ZpbGVzXG5maWBcbiAgICA6ICcnXG59XG5gLnRyaW0oKTtcbn1cblxuZnVuY3Rpb24gaGFzTG9jYWxXYldvcmtzcGFjZShjb25maWc6IFBhY2thZ2VDb25maWcpOiBib29sZWFuIHtcbiAgaWYgKCFjb25maWcuaXNSb290KSByZXR1cm4gZmFsc2U7XG5cbiAgY29uc3QgbG9jYWxXYlBhY2thZ2VKc29uUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJ3BhY2thZ2VzJywgJ3diJywgJ3BhY2thZ2UuanNvbicpO1xuICBpZiAoIWZzLmV4aXN0c1N5bmMobG9jYWxXYlBhY2thZ2VKc29uUGF0aCkpIHJldHVybiBmYWxzZTtcblxuICB0cnkge1xuICAgIGNvbnN0IHBhY2thZ2VKc29uID0gSlNPTi5wYXJzZShmcy5yZWFkRmlsZVN5bmMobG9jYWxXYlBhY2thZ2VKc29uUGF0aCwgJ3V0ZjgnKSkgYXMgeyBuYW1lPzogc3RyaW5nIH07XG4gICAgcmV0dXJuIHBhY2thZ2VKc29uLm5hbWUgPT09ICdAd2lsbGJvb3N0ZXIvd2InO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn1cblxuZnVuY3Rpb24gZ2VuZXJhdGVQb3N0TWVyZ2VDb21tYW5kcyhjb25maWc6IFBhY2thZ2VDb25maWcsIGFsbENvbmZpZ3M6IFBhY2thZ2VDb25maWdbXSk6IHN0cmluZ1tdIHtcbiAgY29uc3QgcG9zdE1lcmdlQ29tbWFuZHM6IHN0cmluZ1tdID0gW107XG4gIGNvbnN0IHRvb2xzQ2hhbmdlZFBhdHRlcm4gPSBTdHJpbmcucmF3YChtaXNlXFwudG9tbHxcXC5taXNlXFwudG9tbClgO1xuICBwb3N0TWVyZ2VDb21tYW5kcy5wdXNoKFN0cmluZy5yYXdgcnVuX2lmX2NoYW5nZWQgXCIke3Rvb2xzQ2hhbmdlZFBhdHRlcm59XCIgXCJtaXNlIGluc3RhbGxcImApO1xuICBjb25zdCBpbnN0YWxsQ29tbWFuZCA9ICdidW4gaW5zdGFsbCc7XG4gIC8vIERvIE5PVCBhZGQgYC52aW5leHRgIGhlcmU6IGl0IGhvbGRzIG9ubHkgdmluZXh0J3MgY29udGVudC1oYXNoZWQgZm9udCBjYWNoZSBhbmQgdGhlIGRldlxuICAvLyBzZXJ2ZXIncyBsb2NrIGZpbGUgKGRlbGV0aW5nIHRoZSBsb2NrIGRpc2FibGVzIHRoZSBkdXBsaWNhdGUtZGV2LXNlcnZlciBndWFyZCBmb3IgYSBydW5uaW5nXG4gIC8vIHNlcnZlcikuIHZpbmV4dCdzIGJ1aWxkIG91dHB1dCBnb2VzIHRvIGBkaXN0L2AsIGFuZCBWaXRlJ3MgZGVwZW5kZW5jeSBjYWNoZSBpcyBoYW5kbGVkIGJ5XG4gIC8vIHRoZSBzZXBhcmF0ZSBpbnN0YWxsLWxheW91dCBob29rIGJlbG93LlxuICAvLyBTY2FuIGV2ZXJ5IHdvcmtzcGFjZSBjb25maWcgKG5vdCBqdXN0IHRoZSByb290KTogaW4gYSBtb25vcmVwbyB0aGUgYXBwIHVzdWFsbHkgbGl2ZXMgaW5cbiAgLy8gcGFja2FnZXMvPGFwcD4gb3IgYXBwcy88YXBwPiwgYW5kIHRoZSBjYWNoZSBkaXJlY3RvcmllcyBhcmUgd29ya3NwYWNlLXJlbGF0aXZlLlxuICBjb25zdCBuZXh0Q2FjaGVEaXJQYXRocyA9IGNvbGxlY3RXb3Jrc3BhY2VSZWxhdGl2ZURpclBhdGhzKFxuICAgIGNvbmZpZyxcbiAgICBhbGxDb25maWdzLFxuICAgICh3b3Jrc3BhY2VDb25maWcpID0+IHdvcmtzcGFjZUNvbmZpZy5kZXBlbmRpbmcuYmxpdHogfHwgd29ya3NwYWNlQ29uZmlnLmRlcGVuZGluZy5uZXh0LFxuICAgICcubmV4dCdcbiAgKTtcbiAgY29uc3Qgcm1OZXh0RGlyZWN0b3JpZXMgPVxuICAgIG5leHRDYWNoZURpclBhdGhzLmxlbmd0aCA+IDAgPyBgICYmIHJtIC1SZiAtLSAke25leHRDYWNoZURpclBhdGhzLm1hcChxdW90ZUZvckV2YWx1YXRlZFNoZWxsKS5qb2luKCcgJyl9YCA6ICcnO1xuICAvLyBCdW4gZG9lcyBub3QgcmVsaW5rIGFuIGV4aXN0aW5nIGlzb2xhdGVkIHRyZWUgd2hlbiBnbG9iYWxTdG9yZS9saW5rZXIgc2V0dGluZ3MgY2hhbmdlLiBJbnNwZWN0XG4gIC8vIHRob3NlIGtleXMgcmF0aGVyIHRoYW4gZXZlcnkgYnVuZmlnIGNoYW5nZTogbWluaW11bVJlbGVhc2VBZ2UgdXBkYXRlcyBtdXN0IG5vdCBkZXN0cm95IGFcbiAgLy8gY29udHJpYnV0b3IncyB3b3JraW5nIGluc3RhbGwgYmVmb3JlIGEgcG90ZW50aWFsbHkgbmV0d29yay1kZXBlbmRlbnQgcmVwbGFjZW1lbnQgc3VjY2VlZHMuXG4gIGNvbnN0IG5vZGVNb2R1bGVzRGlyUGF0aHMgPSBjb2xsZWN0V29ya3NwYWNlUmVsYXRpdmVEaXJQYXRocyhjb25maWcsIGFsbENvbmZpZ3MsICgpID0+IHRydWUsICdub2RlX21vZHVsZXMnKTtcbiAgcG9zdE1lcmdlQ29tbWFuZHMucHVzaChcbiAgICBTdHJpbmcucmF3YGlmIGdpdCBkaWZmIC0tbm8tY29sb3IgLVUwIE9SSUdfSEVBRCBIRUFEIC0tICcqYnVuZmlnLnRvbWwnIHwgZ3JlcCAtLXF1aWV0IC1FICdeWystXSAqKGdsb2JhbFN0b3JlfGxpbmtlcnxwdWJsaWNIb2lzdFBhdHRlcm4pJzsgdGhlbiBybSAtUmYgLS0gJHtub2RlTW9kdWxlc0RpclBhdGhzLm1hcChxdW90ZUZvclNoZWxsKS5qb2luKCcgJyl9OyBmaWBcbiAgKTtcbiAgLy8gYnVuLmxvY2stb25seSBtZXJnZXMgKFJlbm92YXRlIGxvY2tmaWxlIG1haW50ZW5hbmNlKSwgYnVuZmlnLnRvbWwgLyAubnBtcmMgY2hhbmdlcyAobGlua2VyLFxuICAvLyByZWdpc3RyeSwgaG9pc3RpbmcpLCBhbmQgcGF0Y2ggZWRpdHMgYWxsIGNoYW5nZSB0aGUgaW5zdGFsbGVkIHRyZWUgd2l0aG91dCB0b3VjaGluZyBwYWNrYWdlLmpzb24uXG4gIHBvc3RNZXJnZUNvbW1hbmRzLnB1c2goXG4gICAgU3RyaW5nLnJhd2BydW5faWZfY2hhbmdlZCBcIihwYWNrYWdlXFwuanNvbnxidW5cXC5sb2NrfGJ1bmZpZ1xcLnRvbWx8XFwubnBtcmN8cGF0Y2hlcy8pXCIgXCIke2luc3RhbGxDb21tYW5kfSR7cm1OZXh0RGlyZWN0b3JpZXN9XCJgXG4gICk7XG4gIC8vIFZpdGUncyBkZXBlbmRlbmN5IGNhY2hlIGluIG5vZGVfbW9kdWxlcy8udml0ZSBzZWxmLWludmFsaWRhdGVzIG9uIGxvY2tmaWxlIC8gcGF0Y2hlcyAvXG4gIC8vIGNvbmZpZyAvIE5PREVfRU5WIGNoYW5nZXMgKHNlZSBWaXRlJ3MgZGVwIHByZS1idW5kbGluZyBkb2NzKSwgc28gdGhlIHJlc2lkdWFsIHN0YWxlIGNhc2UgaXNcbiAgLy8gaW5zdGFsbC1sYXlvdXQgY2hhbmdlcyAoYnVuZmlnLnRvbWwgbGlua2VyLCAubnBtcmMpOiB0aGV5IGNoYW5nZSB0aGUgaW5zdGFsbGVkIHRyZWUgd2l0aG91dFxuICAvLyB0b3VjaGluZyB0aGUgbG9ja2ZpbGUsIGFuZCB0aGV5IGFyZSBhYnNlbnQgZnJvbSBWaXRlJ3MgY2FjaGUga2V5LlxuICBjb25zdCBybVZpdGVDYWNoZURpcmVjdG9yaWVzID0gY29sbGVjdFdvcmtzcGFjZVJlbGF0aXZlRGlyUGF0aHMoXG4gICAgY29uZmlnLFxuICAgIGFsbENvbmZpZ3MsXG4gICAgKHdvcmtzcGFjZUNvbmZpZykgPT4gd29ya3NwYWNlQ29uZmlnLmRlcGVuZGluZy52aW5leHQgfHwgd29ya3NwYWNlQ29uZmlnLmRlcGVuZGluZy52aXRlLFxuICAgICdub2RlX21vZHVsZXMvLnZpdGUnXG4gICk7XG4gIGlmIChybVZpdGVDYWNoZURpcmVjdG9yaWVzLmxlbmd0aCA+IDApIHtcbiAgICBwb3N0TWVyZ2VDb21tYW5kcy5wdXNoKFxuICAgICAgU3RyaW5nLnJhd2BydW5faWZfY2hhbmdlZCBcIihidW5maWdcXC50b21sfFxcLm5wbXJjKVwiIFwicm0gLVJmIC0tICR7cm1WaXRlQ2FjaGVEaXJlY3Rvcmllcy5tYXAocXVvdGVGb3JFdmFsdWF0ZWRTaGVsbCkuam9pbignICcpfVwiYFxuICAgICk7XG4gIH1cbiAgaWYgKGNvbmZpZy5kb2VzQ29udGFpblBvZXRyeUxvY2spIHtcbiAgICBwb3N0TWVyZ2VDb21tYW5kcy5wdXNoKFN0cmluZy5yYXdgcnVuX2lmX2NoYW5nZWQgXCJwb2V0cnlcXC5sb2NrXCIgXCJwb2V0cnkgaW5zdGFsbFwiYCk7XG4gIH1cbiAgaWYgKGNvbmZpZy5kb2VzQ29udGFpblV2TG9jaykge1xuICAgIHBvc3RNZXJnZUNvbW1hbmRzLnB1c2goU3RyaW5nLnJhd2BydW5faWZfY2hhbmdlZCBcInV2XFwubG9ja1wiIFwidXYgc3luYyAtLWZyb3plblwiYCk7XG4gIH1cbiAgLy8gQmxpdHogcmVwb3NpdG9yaWVzIGRlbGliZXJhdGVseSBnZXQgdGhlIHNhbWUgd2ItZHJpdmVuIHByaXNtYSBjb21tYW5kcyBhcyBldmVyeW9uZSBlbHNlOlxuICAvLyB0aGUgYmxpdHogQ0xJJ3MgY29kZWdlbiBwYXRjaGVzIHRoZSBpbnN0YWxsZWQgbmV4dCBwYWNrYWdlIGluIHBsYWNlLCB3aGljaCBtdXN0IG5ldmVyIHJ1blxuICAvLyB1bmRlciBCdW4ncyBzaGFyZWQgZ2xvYmFsIHN0b3JlLiBZYXJuLWVyYSBCbGl0eiByZXBvcyBnZXQgdGhlaXIgcm91dGUgbWFuaWZlc3QgZnJvbVxuICAvLyBgd2IgZ2VuLWNvZGVgJ3MgYGJsaXR6IGNvZGVnZW5gIHN0ZXAsIGFuZCBjdXJyZW50IHdiIHJvdXRlcyBvbmx5IGB3YiBwcmlzbWEgc2VlZGAgdGhyb3VnaFxuICAvLyB0aGUgYmxpdHogQ0xJLCBvbmx5IGZvciBub24tQnVuIHJlcG9zIChzZWUgcGFja2FnZXMvd2Ivc3JjL3NjcmlwdHMvcHJpc21hU2NyaXB0cy50cyk7IHRoZVxuICAvLyBwb3N0LW1lcmdlIGhvb2tzIHN0YXkgd2ItZHJpdmVuIGJlY2F1c2UgYHByaXNtYSBkZXBsb3lgL2BnZW5lcmF0ZWAgbmVlZCBubyBibGl0eiBsb2FkZXIuXG4gIGlmIChjb25maWcuZGVwZW5kaW5nLnByaXNtYSkge1xuICAgIHBvc3RNZXJnZUNvbW1hbmRzLnB1c2goXG4gICAgICBTdHJpbmcucmF3YHJ1bl9pZl9jaGFuZ2VkIFwiLipcXC5wcmlzbWFcIiBcImJ1biB3YiBwcmlzbWEgZGVwbG95XCJgLFxuICAgICAgU3RyaW5nLnJhd2BydW5faWZfY2hhbmdlZCBcIi4qXFwucHJpc21hXCIgXCJidW4gd2IgcHJpc21hIGdlbmVyYXRlXCJgXG4gICAgKTtcbiAgfVxuICBjb25zdCBnZW5JMThuVHNDb21tYW5kID0gZ2V0R2VuSTE4blRzQ29tbWFuZChjb25maWcsIGNvbmZpZy5wYWNrYWdlSnNvbj8uc2NyaXB0cyk7XG4gIGlmIChnZW5JMThuVHNDb21tYW5kKSB7XG4gICAgLy8gZ2VuLWkxOG4tdHMgb3V0cHV0cyBhcmUgY29tbW9ubHkgaWdub3JlZCwgc28gcG9zdC1tZXJnZSByZWdlbmVyYXRlcyB0aGVtIGFmdGVyIHB1bGxlZCByZXNvdXJjZSBjaGFuZ2VzLlxuICAgIHBvc3RNZXJnZUNvbW1hbmRzLnB1c2goU3RyaW5nLnJhd2BydW5faWZfY2hhbmdlZCBcIihefC8paTE4bi8uKlxcLmpzb24kXCIgXCIke2dlbkkxOG5Uc0NvbW1hbmR9XCJgKTtcbiAgfVxuICByZXR1cm4gcG9zdE1lcmdlQ29tbWFuZHM7XG59XG5cbi8vIFRoZSBnZW5lcmF0ZWQgY29tbWFuZCBwYXNzZXMgdGhyb3VnaCBUV08gc2hlbGwgcGFyc2luZyBzdGFnZXM6IHRoZSBwcmVwYXJlLnNoIGxpbmUgcGFyc2VzIGl0IGFzXG4vLyBhIGRvdWJsZS1xdW90ZWQgYXJndW1lbnQgKHByb2Nlc3NpbmcgXFwsIGAsICQgYW5kIFwiIGltbWVkaWF0ZWx5KSwgYW5kIHJ1bl9pZl9jaGFuZ2VkIHRoZW4gZXZhbCdzXG4vLyBpdCAod29yZC1zcGxpdHRpbmcgYW5kIGdsb2JiaW5nKS4gQW4gdW5xdW90ZWQgcGF0aCBjb250YWluaW5nIHNwYWNlcyAoZS5nLiBgYXBwcy9teSBhcHAvLm5leHRgKVxuLy8gd291bGQgd29yZC1zcGxpdCBpbnRvIHVucmVsYXRlZCBybSB0YXJnZXRzLCBhbmQgYCRgL2JhY2t0aWNrIHdvdWxkIGV4cGFuZCBhdCB0aGUgZmlyc3Qgc3RhZ2UuXG4vLyBTbzogcXVvdGUgZm9yIHRoZSBldmFsIHN0YWdlIOKAlCBgcXVvdGVGb3JTaGVsbGAgbGVhdmVzIG9ubHkgd29yZHMgdGhhdCBjYXJyeSBubyBzaGVsbCBtZWFuaW5nXG4vLyB1bnF1b3RlZCDigJQgdGhlbiBiYWNrc2xhc2gtZXNjYXBlIHRoZSBkb3VibGUtcXVvdGUtY29udGV4dCBzcGVjaWFscy5cbmZ1bmN0aW9uIHF1b3RlRm9yRXZhbHVhdGVkU2hlbGwoZmlsZVBhdGg6IHN0cmluZyk6IHN0cmluZyB7XG4gIGNvbnN0IGV2YWxRdW90ZWQgPSBxdW90ZUZvclNoZWxsKGZpbGVQYXRoKTtcbiAgcmV0dXJuIGV2YWxRdW90ZWQucmVwbGFjZUFsbCgvW1xcXFxgJFwiXS9ndSwgU3RyaW5nLnJhd2BcXCQmYCk7XG59XG5cbi8qKlxuICogVGhlIHdvcmtzcGFjZS1yZWxhdGl2ZSBkaXJlY3RvcmllcyAocm9vdCBmaXJzdCwgZGVkdXBsaWNhdGVkLCBgPHN1YkRpck5hbWU+YCBhcHBlbmRlZCkgb2YgZXZlcnlcbiAqIHdvcmtzcGFjZSB3aG9zZSBjb25maWcgbWF0Y2hlcyB0aGUgcHJlZGljYXRlLiBUaGUgaG9vayBzY3JpcHQgcnVucyBhdCB0aGUgcmVwb3NpdG9yeSByb290LCBzb1xuICogcGF0aHMgYXJlIHJlbGF0aXZlIHRvIHRoZSByb290IGNvbmZpZydzIGRpcmVjdG9yeS5cbiAqL1xuZnVuY3Rpb24gY29sbGVjdFdvcmtzcGFjZVJlbGF0aXZlRGlyUGF0aHMoXG4gIHJvb3RDb25maWc6IFBhY2thZ2VDb25maWcsXG4gIGFsbENvbmZpZ3M6IFBhY2thZ2VDb25maWdbXSxcbiAgcHJlZGljYXRlOiAoY29uZmlnOiBQYWNrYWdlQ29uZmlnKSA9PiBib29sZWFuLFxuICBzdWJEaXJOYW1lOiBzdHJpbmdcbik6IHN0cmluZ1tdIHtcbiAgcmV0dXJuIFtcbiAgICAuLi5uZXcgU2V0KFxuICAgICAgYWxsQ29uZmlnc1xuICAgICAgICAuZmlsdGVyKChjb25maWcpID0+IHByZWRpY2F0ZShjb25maWcpKVxuICAgICAgICAubWFwKChjb25maWcpID0+IHtcbiAgICAgICAgICBjb25zdCByZWxhdGl2ZURpclBhdGggPSBwYXRoLnJlbGF0aXZlKHJvb3RDb25maWcuZGlyUGF0aCwgY29uZmlnLmRpclBhdGgpLnJlcGxhY2VBbGwoJ1xcXFwnLCAnLycpO1xuICAgICAgICAgIHJldHVybiByZWxhdGl2ZURpclBhdGggPyBwYXRoLnBvc2l4LmpvaW4ocmVsYXRpdmVEaXJQYXRoLCBzdWJEaXJOYW1lKSA6IHN1YkRpck5hbWU7XG4gICAgICAgIH0pXG4gICAgKSxcbiAgXS50b1NvcnRlZCgpO1xufVxuXG5mdW5jdGlvbiBoYXNQeXRob25QYWNrYWdlTWFuYWdlcihjb25maWc6IFBhY2thZ2VDb25maWcpOiBib29sZWFuIHtcbiAgcmV0dXJuIGNvbmZpZy5kb2VzQ29udGFpblBvZXRyeUxvY2sgfHwgY29uZmlnLmRvZXNDb250YWluVXZMb2NrO1xufVxuXG5mdW5jdGlvbiBnZXRQeXRob25SdW5uZXIoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogJ3BvZXRyeSBydW4nIHwgJ3V2IHJ1bicge1xuICByZXR1cm4gY29uZmlnLmRvZXNDb250YWluVXZMb2NrID8gJ3V2IHJ1bicgOiAncG9ldHJ5IHJ1bic7XG59XG4iLCJleHBvcnQgZnVuY3Rpb24gbm9ybWFsaXplQ29uZmlnQ29udGVudChjb250ZW50OiBzdHJpbmcgfCB1bmRlZmluZWQpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICByZXR1cm4gY29udGVudD8udHJpbSgpO1xufVxuIiwiaW1wb3J0IHsgZXNjYXBlUmVnRXhwIH0gZnJvbSAnQHdpbGxib29zdGVyL3NoYXJlZC1saWIvc3JjJztcbmV4cG9ydCB0eXBlIENvbmZpZ0Jsb2NrTmFtZSA9ICdiYXNlJyB8ICdleHBvcnQnO1xuXG5pbnRlcmZhY2UgTWFuYWdlZENvbmZpZ0Jsb2Nrc09wdGlvbnMge1xuICBibG9ja05hbWVzOiByZWFkb25seSBDb25maWdCbG9ja05hbWVbXTtcbiAgbWFya2VyUHJlZml4OiBzdHJpbmc7XG4gIHRvb2xOYW1lOiBzdHJpbmc7XG59XG5cbmludGVyZmFjZSBHZXRDb25maWdDb250ZW50T3B0aW9ucyB7XG4gIGRlc2lyZWRDb250ZW50OiBzdHJpbmc7XG4gIGV4aXN0aW5nQ29udGVudDogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICBmaWxlUGF0aDogc3RyaW5nO1xufVxuXG5leHBvcnQgY2xhc3MgTWFuYWdlZENvbmZpZ0Jsb2NrcyB7XG4gIHByaXZhdGUgcmVhZG9ubHkgYmxvY2tOYW1lczogcmVhZG9ubHkgQ29uZmlnQmxvY2tOYW1lW107XG5cbiAgcHJpdmF0ZSByZWFkb25seSBtYXJrZXJQcmVmaXg6IHN0cmluZztcblxuICBwcml2YXRlIHJlYWRvbmx5IHRvb2xOYW1lOiBzdHJpbmc7XG5cbiAgY29uc3RydWN0b3Iob3B0aW9uczogTWFuYWdlZENvbmZpZ0Jsb2Nrc09wdGlvbnMpIHtcbiAgICB0aGlzLmJsb2NrTmFtZXMgPSBvcHRpb25zLmJsb2NrTmFtZXM7XG4gICAgdGhpcy5tYXJrZXJQcmVmaXggPSBvcHRpb25zLm1hcmtlclByZWZpeDtcbiAgICB0aGlzLnRvb2xOYW1lID0gb3B0aW9ucy50b29sTmFtZTtcbiAgfVxuXG4gIGdldENvbmZpZ0NvbnRlbnQob3B0aW9uczogR2V0Q29uZmlnQ29udGVudE9wdGlvbnMpOiBzdHJpbmcge1xuICAgIGlmICghb3B0aW9ucy5leGlzdGluZ0NvbnRlbnQpIHJldHVybiBvcHRpb25zLmRlc2lyZWRDb250ZW50O1xuICAgIGlmICh0aGlzLmhhc01hbmFnZWRCbG9ja3Mob3B0aW9ucy5leGlzdGluZ0NvbnRlbnQpKSB7XG4gICAgICByZXR1cm4gdGhpcy5yZXBsYWNlTWFuYWdlZEJsb2NrcyhvcHRpb25zLmV4aXN0aW5nQ29udGVudCwgb3B0aW9ucy5kZXNpcmVkQ29udGVudCwgb3B0aW9ucy5maWxlUGF0aCk7XG4gICAgfVxuICAgIHJldHVybiBvcHRpb25zLmRlc2lyZWRDb250ZW50O1xuICB9XG5cbiAgZ2V0QmxvY2soYmxvY2tOYW1lOiBDb25maWdCbG9ja05hbWUsIGNvbnRlbnQ6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGAke3RoaXMuZ2V0U3RhcnRNYXJrZXIoYmxvY2tOYW1lKX1cbiR7Y29udGVudH1cbiR7dGhpcy5nZXRFbmRNYXJrZXIoYmxvY2tOYW1lKX1gO1xuICB9XG5cbiAgaGFzTWFuYWdlZEJsb2Nrcyhjb250ZW50OiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5ibG9ja05hbWVzLnNvbWUoKGJsb2NrTmFtZSkgPT4gY29udGVudC5pbmNsdWRlcyh0aGlzLmdldFN0YXJ0TWFya2VyKGJsb2NrTmFtZSkpKTtcbiAgfVxuXG4gIHByaXZhdGUgcmVwbGFjZU1hbmFnZWRCbG9ja3MoZXhpc3RpbmdDb250ZW50OiBzdHJpbmcsIGRlc2lyZWRDb250ZW50OiBzdHJpbmcsIGZpbGVQYXRoOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGxldCBjb250ZW50ID0gZXhpc3RpbmdDb250ZW50O1xuICAgIGZvciAoY29uc3QgYmxvY2tOYW1lIG9mIHRoaXMuYmxvY2tOYW1lcykge1xuICAgICAgY29uc3QgcmVwbGFjZW1lbnQgPSB0aGlzLmV4dHJhY3RNYW5hZ2VkQmxvY2soZGVzaXJlZENvbnRlbnQsIGJsb2NrTmFtZSk7XG4gICAgICBpZiAoIXJlcGxhY2VtZW50KSBjb250aW51ZTtcblxuICAgICAgY29uc3QgbmV4dENvbnRlbnQgPSB0aGlzLnJlcGxhY2VNYW5hZ2VkQmxvY2soY29udGVudCwgYmxvY2tOYW1lLCByZXBsYWNlbWVudCk7XG4gICAgICBpZiAoIW5leHRDb250ZW50KSB7XG4gICAgICAgIGNvbnNvbGUud2FybihgU2tpcHBlZCB1cGRhdGluZyBpbmNvbXBsZXRlICR7YmxvY2tOYW1lfSBibG9jayBpbiAke3RoaXMudG9vbE5hbWV9IGNvbmZpZzogJHtmaWxlUGF0aH1gKTtcbiAgICAgICAgcmV0dXJuIGV4aXN0aW5nQ29udGVudDtcbiAgICAgIH1cbiAgICAgIGNvbnRlbnQgPSBuZXh0Q29udGVudDtcbiAgICB9XG4gICAgcmV0dXJuIGNvbnRlbnQ7XG4gIH1cblxuICBwcml2YXRlIGV4dHJhY3RNYW5hZ2VkQmxvY2soY29udGVudDogc3RyaW5nLCBibG9ja05hbWU6IENvbmZpZ0Jsb2NrTmFtZSk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0TWFuYWdlZEJsb2NrUmVnRXhwKGJsb2NrTmFtZSkuZXhlYyhjb250ZW50KT8uWzBdO1xuICB9XG5cbiAgcHJpdmF0ZSByZXBsYWNlTWFuYWdlZEJsb2NrKGNvbnRlbnQ6IHN0cmluZywgYmxvY2tOYW1lOiBDb25maWdCbG9ja05hbWUsIHJlcGxhY2VtZW50OiBzdHJpbmcpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIGNvbnN0IHBhdHRlcm4gPSB0aGlzLmdldE1hbmFnZWRCbG9ja1JlZ0V4cChibG9ja05hbWUpO1xuICAgIGlmICghcGF0dGVybi50ZXN0KGNvbnRlbnQpKSByZXR1cm4gdW5kZWZpbmVkO1xuICAgIHJldHVybiBjb250ZW50LnJlcGxhY2UocGF0dGVybiwgcmVwbGFjZW1lbnQpO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRNYW5hZ2VkQmxvY2tSZWdFeHAoYmxvY2tOYW1lOiBDb25maWdCbG9ja05hbWUpOiBSZWdFeHAge1xuICAgIHJldHVybiBuZXcgUmVnRXhwKFxuICAgICAgYCR7ZXNjYXBlUmVnRXhwKHRoaXMuZ2V0U3RhcnRNYXJrZXIoYmxvY2tOYW1lKSl9W1xcXFxzXFxcXFNdKj8ke2VzY2FwZVJlZ0V4cCh0aGlzLmdldEVuZE1hcmtlcihibG9ja05hbWUpKX1gXG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0U3RhcnRNYXJrZXIoYmxvY2tOYW1lOiBDb25maWdCbG9ja05hbWUpOiBzdHJpbmcge1xuICAgIHJldHVybiBgLy8gd2JmeTpzdGFydCAke3RoaXMubWFya2VyUHJlZml4fS0ke2Jsb2NrTmFtZX1gO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRFbmRNYXJrZXIoYmxvY2tOYW1lOiBDb25maWdCbG9ja05hbWUpOiBzdHJpbmcge1xuICAgIHJldHVybiBgLy8gd2JmeTplbmQgJHt0aGlzLm1hcmtlclByZWZpeH0tJHtibG9ja05hbWV9YDtcbiAgfVxufVxuIiwiaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZnNVdGlsIH0gZnJvbSAnLi4vdXRpbHMvZnNVdGlsLmpzJztcbmltcG9ydCB7IHJlc29sdmVXaWxsYm9vc3RlckNvbmZpZ01vZHVsZSB9IGZyb20gJy4uL3V0aWxzL3dpbGxib29zdGVyQ29uZmlnc1V0aWwuanMnO1xuXG5pbXBvcnQgeyBub3JtYWxpemVDb25maWdDb250ZW50IH0gZnJvbSAnLi9jb25maWdDb250ZW50LmpzJztcbmltcG9ydCB7IE1hbmFnZWRDb25maWdCbG9ja3MgfSBmcm9tICcuL21hbmFnZWRDb25maWdCbG9jay5qcyc7XG5cbmNvbnN0IG1hbmFnZWRDb25maWdCbG9ja3MgPSBuZXcgTWFuYWdlZENvbmZpZ0Jsb2Nrcyh7XG4gIGJsb2NrTmFtZXM6IFsnYmFzZScsICdleHBvcnQnXSxcbiAgbWFya2VyUHJlZml4OiAnb3hmbXQnLFxuICB0b29sTmFtZTogJ294Zm10Jyxcbn0pO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVPeGZtdENvbmZpZyhjb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdnZW5lcmF0ZU94Zm10Q29uZmlnJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnb3hmbXQuY29uZmlnLnRzJyk7XG4gICAgY29uc3QgZXhpc3RpbmdDb250ZW50ID0gYXdhaXQgZnNVdGlsLnJlYWRGaWxlSWZFeGlzdHMoZmlsZVBhdGgpO1xuICAgIGNvbnN0IGRlc2lyZWRDb250ZW50ID0gbWFuYWdlZENvbmZpZ0Jsb2Nrcy5nZXRDb25maWdDb250ZW50KHtcbiAgICAgIGRlc2lyZWRDb250ZW50OiBnZXRDb25maWdDb250ZW50KGNvbmZpZyksXG4gICAgICBleGlzdGluZ0NvbnRlbnQsXG4gICAgICBmaWxlUGF0aCxcbiAgICB9KTtcbiAgICBpZiAobm9ybWFsaXplQ29uZmlnQ29udGVudChleGlzdGluZ0NvbnRlbnQpICE9PSBub3JtYWxpemVDb25maWdDb250ZW50KGRlc2lyZWRDb250ZW50KSkge1xuICAgICAgYXdhaXQgZnNVdGlsLmdlbmVyYXRlRmlsZShmaWxlUGF0aCwgZGVzaXJlZENvbnRlbnQpO1xuICAgIH1cbiAgfSk7XG59XG5cbmZ1bmN0aW9uIGdldENvbmZpZ0NvbnRlbnQoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogc3RyaW5nIHtcbiAgY29uc3Qgb3hmbXRCYXNlQ29uZmlnTW9kdWxlID0gcmVzb2x2ZVdpbGxib29zdGVyQ29uZmlnTW9kdWxlKGNvbmZpZywgJ0B3aWxsYm9vc3Rlci9veGZtdC1jb25maWcnKTtcblxuICAvLyBDb21tb25KUyBwYWNrYWdlcyBuZWVkIHJlcXVpcmUvbW9kdWxlLmV4cG9ydHMgaGVyZTogb3hmbXQgY29uZmlnIGZpbGVzIGFyZVxuICAvLyBvbmx5IGF1dG8tZGlzY292ZXJlZCBhcyAudHMsIGFuZCB0aGUgc2hhcmVkIGNvbmZpZyBwYWNrYWdlIGlzIEVTTS1vbmx5LlxuICAvLyBObyAvLy8gPHJlZmVyZW5jZSB0eXBlcz4gbGluZTogdGhlIHdiZnktZ2VuZXJhdGVkIHRzY29uZmlnIGFscmVhZHkgY292ZXJzICouY29uZmlnLnRzIHdpdGhcbiAgLy8gdHlwZXMgW1wiYnVuXCJdLCB3aGljaCB0eXBlcyByZXF1aXJlL21vZHVsZS5leHBvcnRzLCB3aGlsZSBhIFwibm9kZVwiIHJlZmVyZW5jZSBicmVha3MgdW5kZXJcbiAgLy8gQnVuJ3MgaXNvbGF0ZWQgbGlua2VyIHdoZXJlIHRoZSB1bmRlY2xhcmVkIEB0eXBlcy9ub2RlIGlzIHVucmVzb2x2YWJsZSAoVFMyNjg4KS5cbiAgaWYgKCFjb25maWcuaXNFc21QYWNrYWdlKSB7XG4gICAgcmV0dXJuIGAke21hbmFnZWRDb25maWdCbG9ja3MuZ2V0QmxvY2soXG4gICAgICAnYmFzZScsXG4gICAgICBgaW1wb3J0IHR5cGUgeyBPeGZtdENvbmZpZyB9IGZyb20gJ294Zm10JztcblxuLy8gb3hsaW50LWRpc2FibGUgdW5pY29ybi9wcmVmZXItbW9kdWxlIC0tIE94Zm10IGNvbmZpZyBmaWxlcyBhcmUgb25seSBhdXRvLWRpc2NvdmVyZWQgYXMgLnRzLCBhbmQgQ29tbW9uSlMgYXZvaWRzIEVTTSBwYWNrYWdlIGxvYWRpbmcgaXNzdWVzLlxuY29uc3Qgb3hmbXRDb25maWcgPSByZXF1aXJlKCcke294Zm10QmFzZUNvbmZpZ01vZHVsZX0nKTtcblxuY29uc3Qgb3hmbXRSZXNvbHZlZENvbmZpZzogT3hmbXRDb25maWcgPSBveGZtdENvbmZpZy5kZWZhdWx0ID8/IG94Zm10Q29uZmlnO2BcbiAgICApfVxuXG4ke21hbmFnZWRDb25maWdCbG9ja3MuZ2V0QmxvY2soJ2V4cG9ydCcsICdtb2R1bGUuZXhwb3J0cyA9IG94Zm10UmVzb2x2ZWRDb25maWc7Jyl9XG5gO1xuICB9XG5cbiAgcmV0dXJuIGAke21hbmFnZWRDb25maWdCbG9ja3MuZ2V0QmxvY2soXG4gICAgJ2Jhc2UnLFxuICAgIGBpbXBvcnQgdHlwZSB7IE94Zm10Q29uZmlnIH0gZnJvbSAnb3hmbXQnO1xuXG5pbXBvcnQgY29uZmlnIGZyb20gJyR7b3hmbXRCYXNlQ29uZmlnTW9kdWxlfSc7XG5cbmNvbnN0IG94Zm10UmVzb2x2ZWRDb25maWc6IE94Zm10Q29uZmlnID0gY29uZmlnO2BcbiAgKX1cblxuJHttYW5hZ2VkQ29uZmlnQmxvY2tzLmdldEJsb2NrKCdleHBvcnQnLCAnZXhwb3J0IGRlZmF1bHQgb3hmbXRSZXNvbHZlZENvbmZpZzsnKX1cbmA7XG59XG4iLCJpbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBmc1V0aWwgfSBmcm9tICcuLi91dGlscy9mc1V0aWwuanMnO1xuaW1wb3J0IHtcbiAgaXNQdWJsaXNoZWRXaWxsYm9vc3RlckNvbmZpZ3NQYWNrYWdlLFxuICByZXNvbHZlV2lsbGJvb3N0ZXJDb25maWdNb2R1bGUsXG59IGZyb20gJy4uL3V0aWxzL3dpbGxib29zdGVyQ29uZmlnc1V0aWwuanMnO1xuXG5pbXBvcnQgeyBub3JtYWxpemVDb25maWdDb250ZW50IH0gZnJvbSAnLi9jb25maWdDb250ZW50LmpzJztcbmltcG9ydCB7IE1hbmFnZWRDb25maWdCbG9ja3MgfSBmcm9tICcuL21hbmFnZWRDb25maWdCbG9jay5qcyc7XG5cbmNvbnN0IG1hbmFnZWRDb25maWdCbG9ja3MgPSBuZXcgTWFuYWdlZENvbmZpZ0Jsb2Nrcyh7XG4gIGJsb2NrTmFtZXM6IFsnYmFzZScsICdleHBvcnQnXSxcbiAgbWFya2VyUHJlZml4OiAnb3hsaW50JyxcbiAgdG9vbE5hbWU6ICdveGxpbnQnLFxufSk7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZW5lcmF0ZU94bGludENvbmZpZyhjb25maWc6IFBhY2thZ2VDb25maWcsIF9yb290Q29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZ2VuZXJhdGVPeGxpbnRDb25maWcnLCBhc3luYyAoKSA9PiB7XG4gICAgLy8gd2lsbGJvb3N0ZXItY29uZmlncyBwdWJsaXNoZXMgY29uZmlnIGZpbGVzIGFzIHByb2R1Y3QgY29kZSwgc28gZ2VuZXJhdGlvblxuICAgIC8vIG11c3Qgbm90IHJlcGxhY2UgcGFja2FnZS1wcm92aWRlZCBsaW50ZXIgc2V0dGluZ3MuIEdlbmVyYXRlZCBmaWxlcyB3aXRoXG4gICAgLy8gbWFuYWdlZCBibG9ja3MgYXJlIHN0aWxsIHNhZmUgdG8gdXBkYXRlLlxuICAgIGNvbnN0IHNob3VsZFByZXNlcnZlUHVibGlzaGVkTGludGVyQ29uZmlnID0gaXNQdWJsaXNoZWRXaWxsYm9vc3RlckNvbmZpZ3NQYWNrYWdlKGNvbmZpZyk7XG4gICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICdveGxpbnQuY29uZmlnLnRzJyk7XG4gICAgY29uc3QgZXhpc3RpbmdDb250ZW50ID0gYXdhaXQgZnNVdGlsLnJlYWRGaWxlSWZFeGlzdHMoZmlsZVBhdGgpO1xuICAgIGNvbnN0IHNob3VsZFByZXNlcnZlRXhpc3RpbmdDb250ZW50ID1cbiAgICAgIHNob3VsZFByZXNlcnZlUHVibGlzaGVkTGludGVyQ29uZmlnICYmIGV4aXN0aW5nQ29udGVudCAmJiAhbWFuYWdlZENvbmZpZ0Jsb2Nrcy5oYXNNYW5hZ2VkQmxvY2tzKGV4aXN0aW5nQ29udGVudCk7XG4gICAgY29uc3QgZGVzaXJlZENvbnRlbnQgPSBzaG91bGRQcmVzZXJ2ZUV4aXN0aW5nQ29udGVudFxuICAgICAgPyBleGlzdGluZ0NvbnRlbnRcbiAgICAgIDogbWFuYWdlZENvbmZpZ0Jsb2Nrcy5nZXRDb25maWdDb250ZW50KHtcbiAgICAgICAgICBkZXNpcmVkQ29udGVudDogZ2V0Q29uZmlnQ29udGVudChjb25maWcpLFxuICAgICAgICAgIGV4aXN0aW5nQ29udGVudCxcbiAgICAgICAgICBmaWxlUGF0aCxcbiAgICAgICAgfSk7XG5cbiAgICBpZiAobm9ybWFsaXplQ29uZmlnQ29udGVudChleGlzdGluZ0NvbnRlbnQpICE9PSBub3JtYWxpemVDb25maWdDb250ZW50KGRlc2lyZWRDb250ZW50KSkge1xuICAgICAgYXdhaXQgZnNVdGlsLmdlbmVyYXRlRmlsZShmaWxlUGF0aCwgZGVzaXJlZENvbnRlbnQpO1xuICAgIH1cbiAgfSk7XG59XG5cbmZ1bmN0aW9uIGdldENvbmZpZ0NvbnRlbnQoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogc3RyaW5nIHtcbiAgY29uc3QgaXNSb290Q29uZmlnID0gY29uZmlnLmlzUm9vdDtcbiAgY29uc3Qgb3hsaW50QmFzZUNvbmZpZ01vZHVsZSA9IHJlc29sdmVXaWxsYm9vc3RlckNvbmZpZ01vZHVsZShjb25maWcsICdAd2lsbGJvb3N0ZXIvb3hsaW50LWNvbmZpZycpO1xuXG4gIC8vIERvIG5vdCBjb2xsYXBzZSB0aGlzIHRvIGEgc3RhdGljIGltcG9ydCBmb3IgZXZlcnkgcGFja2FnZS4gQ29tbW9uSlMgcGFja2FnZXNcbiAgLy8gdHlwZS1jaGVjayBhdXRvLWRpc2NvdmVyZWQgb3hsaW50LmNvbmZpZy50cyBhcyBDb21tb25KUywgc28gaW1wb3J0aW5nIHRoZSBFU01cbiAgLy8gQHdpbGxib29zdGVyL294bGludC1jb25maWcgcGFja2FnZSB0cmlnZ2VycyBUUzE0NzkuIEtlZXAgdGhpcyBpbiBzeW5jIHdpdGhcbiAgLy8gbGl0ZXJhY3ktdGVzdCdzIGdlbmVyYXRlZCBjb25maWcgcGF0dGVybi5cbiAgLy8gTm8gLy8vIDxyZWZlcmVuY2UgdHlwZXM+IGxpbmU6IHRoZSB3YmZ5LWdlbmVyYXRlZCB0c2NvbmZpZyBhbHJlYWR5IGNvdmVycyAqLmNvbmZpZy50cyB3aXRoXG4gIC8vIHR5cGVzIFtcImJ1blwiXSwgd2hpY2ggdHlwZXMgcmVxdWlyZS9tb2R1bGUuZXhwb3J0cywgd2hpbGUgYSBcIm5vZGVcIiByZWZlcmVuY2UgYnJlYWtzIHVuZGVyXG4gIC8vIEJ1bidzIGlzb2xhdGVkIGxpbmtlciB3aGVyZSB0aGUgdW5kZWNsYXJlZCBAdHlwZXMvbm9kZSBpcyB1bnJlc29sdmFibGUgKFRTMjY4OCkuXG4gIGlmICghY29uZmlnLmlzRXNtUGFja2FnZSkge1xuICAgIHJldHVybiBgJHttYW5hZ2VkQ29uZmlnQmxvY2tzLmdldEJsb2NrKFxuICAgICAgJ2Jhc2UnLFxuICAgICAgYGltcG9ydCB0eXBlIHsgT3hsaW50Q29uZmlnIH0gZnJvbSAnb3hsaW50JztcblxuLy8gb3hsaW50LWRpc2FibGUgdW5pY29ybi9wcmVmZXItbW9kdWxlIC0tIE94bGludCBvbmx5IGF1dG8tZGlzY292ZXJzIC50cyBjb25maWcgZmlsZXMsIGFuZCBDb21tb25KUyBhdm9pZHMgRVNNIHBhY2thZ2UgbG9hZGluZyBpc3N1ZXMuXG5jb25zdCBveGxpbnRCYXNlQ29uZmlnID0gcmVxdWlyZSgnJHtveGxpbnRCYXNlQ29uZmlnTW9kdWxlfScpO1xuXG4ke2dldFJlc29sdmVkQ29uZmlnQ29udGVudCgnb3hsaW50QmFzZUNvbmZpZy5kZWZhdWx0ID8/IG94bGludEJhc2VDb25maWcnLCBpc1Jvb3RDb25maWcpfWBcbiAgICApfVxuXG4ke21hbmFnZWRDb25maWdCbG9ja3MuZ2V0QmxvY2soJ2V4cG9ydCcsICdtb2R1bGUuZXhwb3J0cyA9IG94bGludFJlc29sdmVkQ29uZmlnOycpfVxuYDtcbiAgfVxuXG4gIHJldHVybiBgJHttYW5hZ2VkQ29uZmlnQmxvY2tzLmdldEJsb2NrKFxuICAgICdiYXNlJyxcbiAgICBgaW1wb3J0IHR5cGUgeyBPeGxpbnRDb25maWcgfSBmcm9tICdveGxpbnQnO1xuXG5pbXBvcnQgb3hsaW50QmFzZUNvbmZpZyBmcm9tICcke294bGludEJhc2VDb25maWdNb2R1bGV9JztcblxuJHtnZXRSZXNvbHZlZENvbmZpZ0NvbnRlbnQoJ294bGludEJhc2VDb25maWcnLCBpc1Jvb3RDb25maWcpfWBcbiAgKX1cblxuJHttYW5hZ2VkQ29uZmlnQmxvY2tzLmdldEJsb2NrKCdleHBvcnQnLCAnZXhwb3J0IGRlZmF1bHQgb3hsaW50UmVzb2x2ZWRDb25maWc7Jyl9XG5gO1xufVxuXG4vLyBzdHJ1Y3R1cmVkQ2xvbmUga2VlcHMgYSBwYWNrYWdlLWxvY2FsIGNvcHkgc28gcmVwb3NpdG9yaWVzIGNhbiBhZGQgc2V0dGluZ3Mgb3V0c2lkZSBtYW5hZ2VkXG4vLyBibG9ja3Mgd2l0aG91dCBtdXRhdGluZyB0aGUgc2hhcmVkIGltcG9ydGVkIGNvbmZpZyBvYmplY3QuIFRoZSByb290IGNvbmZpZyBmb3JjZXMgdGhlIHR5cGUtYXdhcmVcbi8vIG9wdGlvbnMgb24gaW5zaWRlIHRoZSBtYW5hZ2VkIGJsb2NrIHNvIG5vIGN1c3RvbWl6YXRpb24gY2FuIHNpbGVudGx5IGRpc2FibGUgdHlwZSBjaGVja2luZzsgZXZlcnlcbi8vIG90aGVyIGNvbmZpZyBkZWxldGVzIHRoZW0gYmVjYXVzZSBPeGxpbnQgcmVqZWN0cyB0aG9zZSByb290LW9ubHkgb3B0aW9ucyBlbHNld2hlcmUgKHR5cGUgY2hlY2tpbmdcbi8vIHN1cnZpdmVzOiB0aGUgbGludCBjb21tYW5kcyBwYXNzIC0tdHlwZS1hd2FyZSBhbmQgLS10eXBlLWNoZWNrIGV4cGxpY2l0bHkpLlxuZnVuY3Rpb24gZ2V0UmVzb2x2ZWRDb25maWdDb250ZW50KGJhc2VDb25maWdOYW1lOiBzdHJpbmcsIGlzUm9vdENvbmZpZzogYm9vbGVhbik6IHN0cmluZyB7XG4gIGlmIChpc1Jvb3RDb25maWcpIHtcbiAgICByZXR1cm4gYGNvbnN0IG94bGludFJlc29sdmVkQ29uZmlnOiBPeGxpbnRDb25maWcgPSBzdHJ1Y3R1cmVkQ2xvbmUoJHtiYXNlQ29uZmlnTmFtZX0pO1xub3hsaW50UmVzb2x2ZWRDb25maWcub3B0aW9ucyA9IHsgLi4ub3hsaW50UmVzb2x2ZWRDb25maWcub3B0aW9ucywgdHlwZUF3YXJlOiB0cnVlLCB0eXBlQ2hlY2s6IHRydWUgfTtgO1xuICB9XG5cbiAgcmV0dXJuIGBjb25zdCBveGxpbnRSZXNvbHZlZENvbmZpZzogT3hsaW50Q29uZmlnID0gc3RydWN0dXJlZENsb25lKCR7YmFzZUNvbmZpZ05hbWV9KTtcbmRlbGV0ZSBveGxpbnRSZXNvbHZlZENvbmZpZy5vcHRpb25zO2A7XG59XG4iLCJpbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBmc1V0aWwgfSBmcm9tICcuLi91dGlscy9mc1V0aWwuanMnO1xuaW1wb3J0IHsgaWdub3JlRmlsZVV0aWwgfSBmcm9tICcuLi91dGlscy9pZ25vcmVGaWxlVXRpbC5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcblxuY29uc3QgY29tbW9uQ29udGVudCA9IGBcbjNyZC1wYXJ0eS9cbmFuZHJvaWQvXG5pb3MvXG5uby1mb3JtYXQvXG50ZXN0LWZpeHR1cmVzL1xudGVzdC9maXh0dXJlcy9cbiouZC50c1xuKi5taW4uanNcbi55YXJuL1xuLnBucC5qc1xuYDtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlUHJldHRpZXJpZ25vcmUoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZ2VuZXJhdGVQcmV0dGllcmlnbm9yZScsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJy5wcmV0dGllcmlnbm9yZScpO1xuICAgIGNvbnN0IGNvbnRlbnQgPSAoYXdhaXQgZnNVdGlsLnJlYWRGaWxlSWZFeGlzdHMoZmlsZVBhdGgpKSA/PyAnJztcbiAgICBjb25zdCBoZWFkVXNlckNvbnRlbnQgPSBpZ25vcmVGaWxlVXRpbC5nZXRIZWFkVXNlckNvbnRlbnQoY29udGVudCk7XG4gICAgY29uc3QgdGFpbFVzZXJDb250ZW50ID0gaWdub3JlRmlsZVV0aWwuZ2V0VGFpbFVzZXJDb250ZW50KGNvbnRlbnQpO1xuXG4gICAgY29uc3QgZ2l0aWdub3JlRmlsZVBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICcuZ2l0aWdub3JlJyk7XG4gICAgY29uc3QgZ2l0aWdub3JlQ29udGVudCA9IChhd2FpdCBpZ25vcmVGaWxlVXRpbC5yZWFkR2l0aWdub3JlV2l0aG91dFNlcGFyYXRvcnMoZ2l0aWdub3JlRmlsZVBhdGgpKSB8fCAnJztcblxuICAgIGxldCBhZGRpdGlvbmFsQ29udGVudCA9ICcnO1xuICAgIGlmIChjb25maWcuZG9lc0NvbnRhaW5QdWJzcGVjWWFtbCkge1xuICAgICAgYWRkaXRpb25hbENvbnRlbnQgPSBgXG5hbmRyb2lkL2FwcC9cbmlvcy9SdW5uZXIvQXNzZXRzLnhjYXNzZXRzL1xucHVic3BlYy55YW1sXG5gO1xuICAgIH1cblxuICAgIGNvbnN0IG5ld0NvbnRlbnQgPSBoZWFkVXNlckNvbnRlbnQgKyBjb21tb25Db250ZW50ICsgYWRkaXRpb25hbENvbnRlbnQgKyBnaXRpZ25vcmVDb250ZW50ICsgdGFpbFVzZXJDb250ZW50O1xuICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiBmc1V0aWwuZ2VuZXJhdGVGaWxlKGZpbGVQYXRoLCBuZXdDb250ZW50KSk7XG4gIH0pO1xufVxuIiwiaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IG1lcmdlIGZyb20gJ2RlZXBtZXJnZSc7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGZzVXRpbCB9IGZyb20gJy4uL3V0aWxzL2ZzVXRpbC5qcyc7XG5pbXBvcnQgeyBqc29uY1V0aWwgfSBmcm9tICcuLi91dGlscy9qc29uY1V0aWwuanMnO1xuaW1wb3J0IHsgb3ZlcndyaXRlTWVyZ2UgfSBmcm9tICcuLi91dGlscy9tZXJnZVV0aWwuanMnO1xuaW1wb3J0IHsgc29ydEtleXMgfSBmcm9tICcuLi91dGlscy9vYmplY3RVdGlsLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuXG5jb25zdCBqc29uT2JqID0ge1xuICB2ZW52UGF0aDogJy4nLFxuICB2ZW52OiAnLnZlbnYnLFxufTtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlUHlyaWdodENvbmZpZ0pzb24oY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZ2VuZXJhdGVQeXJpZ2h0Q29uZmlnSnNvbicsIGFzeW5jICgpID0+IHtcbiAgICBsZXQgbmV3U2V0dGluZ3M6IG9iamVjdCA9IHN0cnVjdHVyZWRDbG9uZShqc29uT2JqKTtcbiAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJ3B5cmlnaHRjb25maWcuanNvbicpO1xuICAgIGNvbnN0IG9sZENvbnRlbnQgPSBhd2FpdCBmc1V0aWwucmVhZEZpbGVJZkV4aXN0cyhmaWxlUGF0aCk7XG4gICAgbGV0IG9yaWdpbmFsU2V0dGluZ3NKc29uOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gICAgaWYgKG9sZENvbnRlbnQgIT09IHVuZGVmaW5lZCAmJiAhanNvbmNVdGlsLmlzVHJpdmlhT25seShvbGRDb250ZW50KSkge1xuICAgICAgLy8gcHlyaWdodGNvbmZpZy5qc29uIGFsbG93cyBKU09OQzsgYW4gZXhpc3RpbmcgZmlsZSB3YmZ5IGNhbm5vdCBwYXJzZSBtdXN0IGJlIGxlZnRcbiAgICAgIC8vIHVudG91Y2hlZCBpbnN0ZWFkIG9mIGJlaW5nIG92ZXJ3cml0dGVuIHdpdGggdGhlIGJhcmUgdGVtcGxhdGUuXG4gICAgICBjb25zdCBvbGRTZXR0aW5ncyA9IGpzb25jVXRpbC5wYXJzZU9iamVjdElnbm9yaW5nRXJyb3I8b2JqZWN0PihvbGRDb250ZW50KTtcbiAgICAgIGlmICghb2xkU2V0dGluZ3MpIHtcbiAgICAgICAgY29uc29sZS53YXJuKGBTa2lwcGVkIGdlbmVyYXRpbmcgJHtmaWxlUGF0aH0gYmVjYXVzZSB0aGUgZXhpc3RpbmcgY29udGVudCBpcyBub3QgcGFyc2FibGUgYXMgSlNPTkMuYCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIG9yaWdpbmFsU2V0dGluZ3NKc29uID0gSlNPTi5zdHJpbmdpZnkoc29ydEtleXMoc3RydWN0dXJlZENsb25lKG9sZFNldHRpbmdzKSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPikpO1xuICAgICAgbmV3U2V0dGluZ3MgPSBtZXJnZS5hbGwoW25ld1NldHRpbmdzLCBvbGRTZXR0aW5ncywgbmV3U2V0dGluZ3NdLCB7IGFycmF5TWVyZ2U6IG92ZXJ3cml0ZU1lcmdlIH0pO1xuICAgIH1cbiAgICAvLyBTa2lwIHRoZSB3cml0ZSB3aGVuIG5vdGhpbmcgY2hhbmdlcyBzZW1hbnRpY2FsbHksIHNvIEpTT05DIGNvbW1lbnRzIGFuZCBmb3JtYXR0aW5nIGluIGFuXG4gICAgLy8gYWxyZWFkeS1jbGVhbiBweXJpZ2h0Y29uZmlnLmpzb24gc3Vydml2ZSB3YmZ5IHJ1bnMuXG4gICAgaWYgKG9yaWdpbmFsU2V0dGluZ3NKc29uID09PSBKU09OLnN0cmluZ2lmeShzb3J0S2V5cyhzdHJ1Y3R1cmVkQ2xvbmUobmV3U2V0dGluZ3MpIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KSkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgbmV3Q29udGVudCA9IEpTT04uc3RyaW5naWZ5KG5ld1NldHRpbmdzLCB1bmRlZmluZWQsIDIpO1xuICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiBmc1V0aWwuZ2VuZXJhdGVGaWxlKGZpbGVQYXRoLCBuZXdDb250ZW50KSk7XG4gIH0pO1xufVxuIiwiaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHsgY29uc3VtZXNEb2NrZXJFbnYgfSBmcm9tICdAd2lsbGJvb3N0ZXIvc2hhcmVkLWxpYi1ub2RlL3NyYyc7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGZzVXRpbCB9IGZyb20gJy4uL3V0aWxzL2ZzVXRpbC5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcblxuY29uc3QgbWFuYWdlZFNjcmlwdHNCbG9jayA9IGBzY3JpcHRzLyoqXG4hc2NyaXB0cy9cbiFzY3JpcHRzLyouc2hgO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZml4UmFpbHdheWlnbm9yZShjb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdmaXhSYWlsd2F5aWdub3JlJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnLnJhaWx3YXlpZ25vcmUnKTtcbiAgICBjb25zdCBjb250ZW50ID0gYXdhaXQgZnNVdGlsLnJlYWRGaWxlSWZFeGlzdHMoZmlsZVBhdGgpO1xuICAgIGNvbnN0IHVzZXNEb2NrZXJFbnYgPSBjb25zdW1lc0RvY2tlckVudihjb25maWcuZG9ja2VyZmlsZSk7XG4gICAgaWYgKCFjb250ZW50KSB7XG4gICAgICBpZiAoY29uZmlnLmlzUmFpbHdheSAmJiB1c2VzRG9ja2VyRW52KSB7XG4gICAgICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiBmc1V0aWwuZ2VuZXJhdGVGaWxlKGZpbGVQYXRoLCAnIS5kb2NrZXIuZW52XFxuJykpO1xuICAgICAgfVxuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGxldCBuZXdDb250ZW50ID0gY29udGVudC5yZXBsYWNlKC9ec2NyaXB0c1xcLyQvbSwgbWFuYWdlZFNjcmlwdHNCbG9jayk7XG4gICAgLy8gYHJhaWx3YXkgdXBgIHN0cmlwcyBnaXRpZ25vcmVkIGZpbGVzIGZyb20gdGhlIHVwbG9hZGVkIGJ1aWxkIGNvbnRleHQsIHNvIHRoZSBnZW5lcmF0ZWRcbiAgICAvLyBub24tc2VjcmV0IC5kb2NrZXIuZW52IChgd2IgZ2VuLWRvY2tlci1lbnZgIG91dHB1dCkgbmVlZHMgYW4gZXhwbGljaXQgdW4taWdub3JlIHRvIHJlYWNoXG4gICAgLy8gdGhlIHJlbW90ZSBEb2NrZXIgYnVpbGQuIEFwcGVuZGVkLCBub3QgcHJlcGVuZGVkOiBpZ25vcmUgZmlsZXMgYXJlIGxhc3QtbWF0Y2gtd2lucywgc28gYVxuICAgIC8vIGhhbmQtd3JpdHRlbiBwYXR0ZXJuIHN1Y2ggYXMgYCouZW52YCBlYXJsaWVyIGluIHRoZSBmaWxlIG11c3Qgbm90IHNpbGVudGx5IHJlLWV4Y2x1ZGUgaXQuXG4gICAgaWYgKHVzZXNEb2NrZXJFbnYgJiYgIS9eIVxcLmRvY2tlclxcLmVudiQvbS50ZXN0KG5ld0NvbnRlbnQpKSB7XG4gICAgICBuZXdDb250ZW50ID0gYCR7bmV3Q29udGVudC5yZXBsYWNlKC9cXG4/JC8sICdcXG4nKX0hLmRvY2tlci5lbnZcXG5gO1xuICAgIH0gZWxzZSBpZiAoY29uZmlnLmRvY2tlcmZpbGUgJiYgIXVzZXNEb2NrZXJFbnYpIHtcbiAgICAgIG5ld0NvbnRlbnQgPSBuZXdDb250ZW50LnJlcGxhY2UoL14hXFwuZG9ja2VyXFwuZW52XFxuPy9tLCAnJyk7XG4gICAgfVxuICAgIGlmIChuZXdDb250ZW50ID09PSBjb250ZW50KSByZXR1cm47XG5cbiAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT5cbiAgICAgIG5ld0NvbnRlbnQgPyBmc1V0aWwuZ2VuZXJhdGVGaWxlKGZpbGVQYXRoLCBuZXdDb250ZW50KSA6IGZzVXRpbC5yZW1vdmVDb25maW5lZChmaWxlUGF0aClcbiAgICApO1xuICB9KTtcbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB0eXBlIHsgSW1hZ2UsIExpbmssIFBhcmFncmFwaCwgUGhyYXNpbmdDb250ZW50LCBSb290Q29udGVudCB9IGZyb20gJ21kYXN0JztcbmltcG9ydCB7IGZyb21NYXJrZG93biB9IGZyb20gJ21kYXN0LXV0aWwtZnJvbS1tYXJrZG93bic7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGpvYnNBbGxDYWxsUmV1c2FibGVXb3JrZmxvdyB9IGZyb20gJy4vd29ya2Zsb3cuanMnO1xuaW1wb3J0IHsgZnNVdGlsIH0gZnJvbSAnLi4vdXRpbHMvZnNVdGlsLmpzJztcbmltcG9ydCB7IGdldE9jdG9raXQgfSBmcm9tICcuLi91dGlscy9naXRodWJVdGlsLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuaW1wb3J0IHsgZ2V0V2JmeVZlcnNpb25MYWJlbCB9IGZyb20gJy4uL3V0aWxzL3ZlcnNpb24uanMnO1xuXG5jb25zdCBzZW1hbnRpY1JlbGVhc2VCYWRnZSA9XG4gICdbIVtzZW1hbnRpYy1yZWxlYXNlXShodHRwczovL2ltZy5zaGllbGRzLmlvL2JhZGdlLyUyMCUyMCVGMCU5RiU5MyVBNiVGMCU5RiU5QSU4MC1zZW1hbnRpYy0tcmVsZWFzZS1lMTAwNzkuc3ZnKV0oaHR0cHM6Ly9naXRodWIuY29tL3NlbWFudGljLXJlbGVhc2Uvc2VtYW50aWMtcmVsZWFzZSknO1xuXG5jb25zdCB3YmZ5QmFkZ2VVcmxQcmVmaXggPSAnaHR0cHM6Ly9pbWcuc2hpZWxkcy5pby9iYWRnZS93YmZ5LSc7XG5jb25zdCB3YmZ5QmFkZ2VVcmxTdWZmaXggPSAnLTFlOTBmZi5zdmcnO1xuY29uc3Qgd2JmeUJhZGdlTGluayA9ICdodHRwczovL2dpdGh1Yi5jb20vV2lsbEJvb3N0ZXIvc2hhcmVkL3RyZWUvbWFpbi9wYWNrYWdlcy93YmZ5JztcblxuY29uc3QgbnBtUGFja2FnZVVybFByZWZpeCA9ICdodHRwczovL3d3dy5ucG1qcy5jb20vcGFja2FnZS8nO1xuY29uc3QgbnBtTGljZW5zZUJhZGdlUGF0dGVybiA9IC9eXFxbIVxcW1teXFxdXSpcXF1cXChodHRwczpcXC9cXC9pbWdcXC5zaGllbGRzXFwuaW9cXC9ucG1cXC9sXFwvW14pXFxzXStcXClcXF1cXChbXilcXHNdK1xcKSQvdTtcblxuY29uc3QgbWFuYWdlZEJhZGdlUGF0dGVybnMgPSBbXG4gIC9eXFxbIVxcW3diZnlcXF1cXChodHRwczpcXC9cXC9pbWdcXC5zaGllbGRzXFwuaW9cXC9iYWRnZVxcL3diZnktW14pXFxzXSstMWU5MGZmXFwuc3ZnXFwpXFxdXFwoaHR0cHM6XFwvXFwvZ2l0aHViXFwuY29tXFwvV2lsbEJvb3N0ZXJcXC9zaGFyZWRcXC90cmVlXFwvbWFpblxcL3BhY2thZ2VzXFwvd2JmeVxcKSQvdSxcbiAgL15cXFshXFxbW15cXF1dKlxcXVxcKChodHRwczpcXC9cXC9naXRodWJcXC5jb21cXC9bXilcXHNdK1xcL2FjdGlvbnNcXC93b3JrZmxvd3NcXC9bXilcXHNdKylcXC9iYWRnZVxcLnN2Z1xcKVxcXVxcKFxcMVxcKSQvdSxcbiAgL15cXFshXFxbW15cXF1dKlxcXVxcKFteKVxcc10rXFwpXFxdXFwoaHR0cHM/OlxcL1xcLyg/Ond3d1xcLik/bnBtanNcXC5jb21cXC9wYWNrYWdlXFwvW14pXFxzXSpcXCkkL3UsXG4gIG5wbUxpY2Vuc2VCYWRnZVBhdHRlcm4sXG5dO1xuXG5mdW5jdGlvbiBidWlsZFdiZnlCYWRnZShsYWJlbDogc3RyaW5nKTogc3RyaW5nIHtcbiAgLy8gSHlwaGVucyBhcmUgZXNjYXBlZCBhcyBgLS1gIHBlciBzaGllbGRzLmlvJ3MgYmFkZ2UgcGF0aCBzeW50YXgsIHNvIGB2MS4yLjMtcmMuMWAgc3RheXMgaW50YWN0LlxuICByZXR1cm4gYFshW3diZnldKCR7d2JmeUJhZGdlVXJsUHJlZml4fSR7bGFiZWwucmVwbGFjZUFsbCgnLScsICctLScpfSR7d2JmeUJhZGdlVXJsU3VmZml4fSldKCR7d2JmeUJhZGdlTGlua30pYDtcbn1cblxuLyoqIFRoZSB2ZXJzaW9uIGxhYmVsIHRoZSB3YmZ5IGJhZGdlIGluIHRoZSByZXBvc2l0b3J5J3MgUkVBRE1FIHJlY29yZHMsIGkuZS4gdGhlIGJ1aWxkIHRoYXQgd2JmaWVkIGl0LiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJlYWRBcHBsaWVkV2JmeVZlcnNpb25MYWJlbChkaXJQYXRoOiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZyB8IHVuZGVmaW5lZD4ge1xuICAvLyBDb25maW5lZCwgYW5kIHRvbGVyYW50IG9mIGFueSByZWFkIGZhaWx1cmU6IGEgUkVBRE1FIHRoYXQgcmVzb2x2ZXMgb3V0c2lkZSB0aGUgcmVwb3NpdG9yeSAoYVxuICAvLyBjb21taXR0ZWQgc3ltbGluaykgb3IgY2Fubm90IGJlIHJlYWQgYXQgYWxsIHNheXMgbm90aGluZyBhYm91dCB3aGljaCBidWlsZCBjb25maWd1cmVkIFRISVNcbiAgLy8gcmVwb3NpdG9yeSwgYW5kIHRoZSBhbnN3ZXIgb25seSBldmVyIHN1cHByZXNzZXMgd29yayDigJQgc28gYW55dGhpbmcgYnV0IGEgcmVhZGFibGUgaW4tcmVwb3NpdG9yeVxuICAvLyBSRUFETUUgbWVhbnMgXCJub3Qga25vd24gdG8gYmUgYXBwbGllZFwiIGFuZCB0aGUgcnVuIHByb2NlZWRzLlxuICBjb25zdCByZWFkbWUgPSBhd2FpdCBmc1V0aWwucmVhZEZpbGVDb25maW5lZElmRXhpc3RzKHBhdGgucmVzb2x2ZShkaXJQYXRoLCAnUkVBRE1FLm1kJykpLmNhdGNoKCgpID0+IHt9KTtcbiAgaWYgKHJlYWRtZSA9PT0gdW5kZWZpbmVkKSByZXR1cm4gdW5kZWZpbmVkO1xuXG4gIC8vIFRoZSBSRUFETUUgaXMgcGFyc2VkIHJhdGhlciB0aGFuIHNjYW5uZWQsIGZvciB0aGUgc2FtZSByZWFzb24gd3JpdGVCYWRnZUJsb2NrIHBhcnNlcyBpdCwgYW5kXG4gIC8vIG9ubHkgdGhlIHNoYXBlIHdyaXRlQmFkZ2VCbG9jayBpdHNlbGYgd3JpdGVzIGNvdW50cyBhcyBhbiBhcHBsaWVkIGJhZGdlOiBhIHRvcC1sZXZlbCBwYXJhZ3JhcGhcbiAgLy8gb2YgYmFkZ2VzLiBBIGJhZGdlIGFueXdoZXJlIGVsc2UgaXMgY29udGVudCB0aGF0IG1lcmVseSBtZW50aW9ucyBvbmUg4oCUIGEgZmVuY2VkIGV4YW1wbGUgKHdiZnknc1xuICAvLyBvd24gZG9jdW1lbnRhdGlvbiBoYXMgdGhvc2UpLCBhIGJsb2NrIHF1b3RlLCBhIGxpc3QgaXRlbSDigJQgYW5kIHJlYWRpbmcgaXQgYXMgYXBwbGllZCB3b3VsZCBza2lwXG4gIC8vIGV2ZXJ5IGZpeGVyIGZvciB0aGUgcmVwb3NpdG9yeS5cbiAgZm9yIChjb25zdCBub2RlIG9mIGZyb21NYXJrZG93bihyZWFkbWUpLmNoaWxkcmVuKSB7XG4gICAgaWYgKCFpc0JhZGdlQmxvY2tOb2RlKG5vZGUpKSBjb250aW51ZTtcbiAgICBmb3IgKGNvbnN0IGJhZGdlIG9mIG5vZGUuY2hpbGRyZW4pIHtcbiAgICAgIGlmICghaXNCYWRnZU5vZGUoYmFkZ2UpKSBjb250aW51ZTtcbiAgICAgIGNvbnN0IHsgdXJsIH0gPSBiYWRnZS5jaGlsZHJlblswXTtcbiAgICAgIGlmICh1cmwuc3RhcnRzV2l0aCh3YmZ5QmFkZ2VVcmxQcmVmaXgpICYmIHVybC5lbmRzV2l0aCh3YmZ5QmFkZ2VVcmxTdWZmaXgpKSB7XG4gICAgICAgIHJldHVybiB1cmwuc2xpY2Uod2JmeUJhZGdlVXJsUHJlZml4Lmxlbmd0aCwgLXdiZnlCYWRnZVVybFN1ZmZpeC5sZW5ndGgpLnJlcGxhY2VBbGwoJy0tJywgJy0nKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcmV0dXJuIHVuZGVmaW5lZDtcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlUmVhZG1lKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2dlbmVyYXRlUmVhZG1lJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnUkVBRE1FLm1kJyk7XG4gICAgLy8gVGhlIHdiZnkgYmFkZ2UgbWFya3MgYSByZXBvc2l0b3J5IGFzIHdiZmllZCwgc28gYSByZXBvc2l0b3J5IHdpdGhvdXQgYSBSRUFETUUgc3RpbGwgZ2V0cyBvbmUuXG4gICAgLy8gcmVhZEZpbGVJZkV4aXN0cyBmYWxscyBiYWNrIE9OTFkgb24gRU5PRU5UOiBhIFJFQURNRSB0aGF0IGV4aXN0cyBidXQgY2Fubm90IGJlIHJlYWQgKGUuZy5cbiAgICAvLyBwZXJtaXNzaW9ucywgRU1GSUxFKSBtdXN0IGFib3J0IHRoZSBnZW5lcmF0b3IgaW5zdGVhZCBvZiBiZWluZyBvdmVyd3JpdHRlbiB3aXRoIHRoZSBzdHViLlxuICAgIGxldCBuZXdDb250ZW50ID1cbiAgICAgIChhd2FpdCBmc1V0aWwucmVhZEZpbGVJZkV4aXN0cyhmaWxlUGF0aCkpID8/XG4gICAgICBgIyAke2NvbmZpZy5wYWNrYWdlSnNvbj8ubmFtZSA/PyBwYXRoLmJhc2VuYW1lKHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCkpfVxcbmA7XG5cbiAgICAvLyBPcmRlcmVkIGJ5IHdoYXQgYSByZWFkZXIgY2FyZXMgYWJvdXQgbW9zdDogdGhlIG5wbSBiYWRnZSBuYW1lcyB0aGUgcGFja2FnZSBhIHJlYWRlciBpbnN0YWxscyxcbiAgICAvLyB0aGVuIHRoZSB3b3JrZmxvdyBiYWRnZXMgcmVwb3J0IHdoZXRoZXIgdGhlIGNvZGUgaXMgY3VycmVudGx5IGhlYWx0aHksIHRoZW4gaG93IGl0IGlzXG4gICAgLy8gcmVsZWFzZWQsIGFuZCBsYXN0IHRoZSB3YmZ5IGJ1aWxkIHRoYXQgY29uZmlndXJlZCBpdC5cbiAgICBjb25zdCBiYWRnZXM6IHN0cmluZ1tdID0gW107XG4gICAgY29uc3QgcGFja2FnZU5hbWUgPSBhd2FpdCBnZXRQdWJsaXNoZWROcG1QYWNrYWdlTmFtZShjb25maWcpO1xuICAgIGlmIChwYWNrYWdlTmFtZSkge1xuICAgICAgYmFkZ2VzLnB1c2goYnVpbGROcG1CYWRnZShwYWNrYWdlTmFtZSkpO1xuICAgICAgY29uc3QgbGljZW5zZSA9IGNvbmZpZy5wYWNrYWdlSnNvbj8ubGljZW5zZTtcbiAgICAgIGlmIChsaWNlbnNlICYmIGxpY2Vuc2UgIT09ICdVTkxJQ0VOU0VEJykge1xuICAgICAgICBiYWRnZXMucHVzaChidWlsZExpY2Vuc2VCYWRnZShwYWNrYWdlTmFtZSkpO1xuICAgICAgfVxuICAgIH1cbiAgICBiYWRnZXMucHVzaCguLi4oYXdhaXQgYnVpbGRXb3JrZmxvd0JhZGdlcyhjb25maWcpKSk7XG4gICAgaWYgKGZzLmV4aXN0c1N5bmMocGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnLnJlbGVhc2VyYy5qc29uJykpKSBiYWRnZXMucHVzaChzZW1hbnRpY1JlbGVhc2VCYWRnZSk7XG4gICAgYmFkZ2VzLnB1c2goYnVpbGRXYmZ5QmFkZ2UoZ2V0V2JmeVZlcnNpb25MYWJlbCgpID8/ICdhcHBsaWVkJykpO1xuXG4gICAgLy8gVGhlIGJsb2NrIGlzIHdyaXR0ZW4gaW4gb25lIHBhc3MgZnJvbSB0aGUgYmFkZ2VzIHdiZnkgbWFuYWdlcyByaWdodCBub3cuIEEgYmFkZ2UgdGhhdCBpcyBub1xuICAgIC8vIGxvbmdlciB3YW50ZWQg4oCUIGEgc3VwZXJzZWRlZCB2ZXJzaW9uLCBvciBvbmUgd2hvc2Ugd29ya2Zsb3cgaXMgZ29uZSDigJQgc2ltcGx5IGlzIG5vdCBpbiB0aGVcbiAgICAvLyBsaXN0LCBzbyBub3RoaW5nIGhhcyB0byByZW1vdmUgaXQuXG4gICAgbmV3Q29udGVudCA9IHdyaXRlQmFkZ2VCbG9jayhuZXdDb250ZW50LCBiYWRnZXMpO1xuXG4gICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzVXRpbC5nZW5lcmF0ZUZpbGUoZmlsZVBhdGgsIG5ld0NvbnRlbnQsIGdldExpbmVFbmRpbmcobmV3Q29udGVudCkpKTtcbiAgfSk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGdldFB1Ymxpc2hlZE5wbVBhY2thZ2VOYW1lKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8c3RyaW5nIHwgdW5kZWZpbmVkPiB7XG4gIGNvbnN0IHBhY2thZ2VKc29uID0gY29uZmlnLnBhY2thZ2VKc29uO1xuICAvLyBBIG1vbm9yZXBvIGhhcyBubyBzaW5nbGUgbnBtIHZlcnNpb24gcmVwcmVzZW50aW5nIHRoZSB3aG9sZSByZXBvc2l0b3J5LlxuICBpZiAoY29uZmlnLmRvZXNDb250YWluU3ViUGFja2FnZUpzb25zIHx8ICFjb25maWcucmVsZWFzZS5ucG0gfHwgIXBhY2thZ2VKc29uPy5uYW1lIHx8IHBhY2thZ2VKc29uLnByaXZhdGUpIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG4gIHJldHVybiAoYXdhaXQgaXNNaXNzaW5nRnJvbU5wbVJlZ2lzdHJ5KHBhY2thZ2VKc29uLm5hbWUpKSA/IHVuZGVmaW5lZCA6IHBhY2thZ2VKc29uLm5hbWU7XG59XG5cbi8qKlxuICogV2hldGhlciB0aGUgcmVnaXN0cnkgYW5zd2VycyB0aGF0IGl0IGhhcyBubyBzdWNoIHBhY2thZ2Ug4oCUIHRoZSBPTkxZIGFuc3dlciB0aGF0IHJlbW92ZXMgYSBiYWRnZS5cbiAqIEEgY2hlY2sgdGhhdCBjYW5ub3QgcnVuIChvZmZsaW5lLCBhbiBvdXRhZ2UsIGEgdGltZW91dCkgc2F5cyBub3RoaW5nIGFib3V0IHRoZSBwYWNrYWdlLCBhbmRcbiAqIHRyZWF0aW5nIGl0IGFzIGFic2VudCB3b3VsZCBzdHJpcCB0aGUgYmFkZ2Ugb3V0IG9mIGV2ZXJ5IHB1Ymxpc2hlZCByZXBvc2l0b3J5IHdiZnkgdG91Y2hlc1xuICogZHVyaW5nIHRoZSBvdXRhZ2UgYW5kIHB1dCBpdCBiYWNrIGFmdGVyd2FyZHMuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGlzTWlzc2luZ0Zyb21OcG1SZWdpc3RyeShwYWNrYWdlTmFtZTogc3RyaW5nKTogUHJvbWlzZTxib29sZWFuPiB7XG4gIHRyeSB7XG4gICAgLy8gVGhlIHNjb3BlIHNlcGFyYXRvciBtdXN0IHN1cnZpdmUgYXMgYSBwYXRoIHNlZ21lbnQsIHNvIHRoZSBuYW1lIGlzIGVuY29kZWQgcGllY2V3aXNlLlxuICAgIGNvbnN0IGVuY29kZWROYW1lID0gcGFja2FnZU5hbWUuc3BsaXQoJy8nKS5tYXAoZW5jb2RlVVJJQ29tcG9uZW50KS5qb2luKCcvJyk7XG4gICAgLy8gQSBiYWRnZSBpcyBkZWNvcmF0aW9uOiBhIHN0YWxsZWQgcmVnaXN0cnkgY29ubmVjdGlvbiBtdXN0IG5vdCBob2xkIHRoZSB3aG9sZSBydW4gZm9yIGhvd2V2ZXJcbiAgICAvLyBsb25nIHRoZSBuZXR3b3JraW5nIHN0YWNrIHdvdWxkIHdhaXQuIFRoZSBidWRnZXQgaXMgZ2VuZXJvdXMgYmVjYXVzZSBhIHRpbWVvdXQgYW5zd2Vyc1xuICAgIC8vIFwidW5rbm93blwiLCB3aGljaCBrZWVwcyB0aGUgYmFkZ2Ug4oCUIGFuZCBvbiBhIHJlcG9zaXRvcnkgdGhhdCBpcyBub3Qgb24gbnBtIHRoYXQgbWVhbnMgd3JpdGluZ1xuICAgIC8vIG9uZSBpdCBzaG91bGQgbm90IGhhdmU7IGEgd2JmeSBydW4gYWxyZWFkeSBzcGVuZHMgbWludXRlcyBvbiBpbnN0YWxscywgc28gd2FpdGluZyBhIGxpdHRsZVxuICAgIC8vIGxvbmdlciBmb3IgYSByZWFsIGFuc3dlciBjb3N0cyBsZXNzIHRoYW4gYWN0aW5nIG9uIGEgbWlzc2luZyBvbmUuXG4gICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaChgaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvJHtlbmNvZGVkTmFtZX1gLCB7XG4gICAgICBtZXRob2Q6ICdIRUFEJyxcbiAgICAgIHNpZ25hbDogQWJvcnRTaWduYWwudGltZW91dCgxMF8wMDApLFxuICAgIH0pO1xuICAgIHJldHVybiByZXNwb25zZS5zdGF0dXMgPT09IDQwNDtcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG59XG5cbmZ1bmN0aW9uIGJ1aWxkTnBtQmFkZ2UocGFja2FnZU5hbWU6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiBgWyFbbnBtIHZlcnNpb25dKGh0dHBzOi8vaW1nLnNoaWVsZHMuaW8vbnBtL3YvJHtwYWNrYWdlTmFtZX0uc3ZnKV0oJHtucG1QYWNrYWdlVXJsUHJlZml4fSR7cGFja2FnZU5hbWV9KWA7XG59XG5cbmZ1bmN0aW9uIGJ1aWxkTGljZW5zZUJhZGdlKHBhY2thZ2VOYW1lOiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gYFshW2xpY2Vuc2VdKGh0dHBzOi8vaW1nLnNoaWVsZHMuaW8vbnBtL2wvJHtwYWNrYWdlTmFtZX0uc3ZnKV0oJHtucG1QYWNrYWdlVXJsUHJlZml4fSR7cGFja2FnZU5hbWV9KWA7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGJ1aWxkV29ya2Zsb3dCYWRnZXMoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTxzdHJpbmdbXT4ge1xuICBjb25zdCByZXBvc2l0b3J5ID0gY29uZmlnLnJlcG9zaXRvcnk/LnNsaWNlKGNvbmZpZy5yZXBvc2l0b3J5LmluZGV4T2YoJzonKSArIDEpO1xuICBjb25zdCB3b3JrZmxvd3NQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnLmdpdGh1YicsICd3b3JrZmxvd3MnKTtcbiAgaWYgKCFyZXBvc2l0b3J5IHx8ICFmcy5leGlzdHNTeW5jKHdvcmtmbG93c1BhdGgpKSByZXR1cm4gW107XG5cbiAgLy8gV29ya2Zsb3cgYW5kIFJFQURNRSBnZW5lcmF0aW9uIHJ1biBjb25jdXJyZW50bHkuIERvIG5vdCByZXRhaW4gYSBzdGFsZSBSdXN0IGJhZGdlIHdoaWxlIHRoZVxuICAvLyB3b3JrZmxvdyBnZW5lcmF0b3IgcmVtb3ZlcyBhIGNhbGxlciBjcmVhdGVkIGZyb20gYSBmb3JtZXJseSBtaXNkZXRlY3RlZCBsb2NhbCBjYWNoZSDigJQgYnV0XG4gIC8vIG1pcnJvciBpdHMgb3duZXJzaGlwIGNoZWNrOiBhIGN1c3RvbSBzYW1lLW5hbWVkIHdvcmtmbG93IHN1cnZpdmVzLCBzbyBpdHMgYmFkZ2UgbXVzdCB0b28uXG4gIC8vIERlY2lkZWQgc3luY2hyb25vdXNseSBiZWZvcmUgdGhlIGxvb3AncyBmaXJzdCBhd2FpdDogdGhlIGdlbmVyYXRvcidzIGRlbGV0ZSBjYW4gb25seSBsYW5kIGF0XG4gIC8vIGFuIGF3YWl0IHBvaW50LCBhbmQgYSBwb3N0LWRlbGV0ZSByZWFkIHdvdWxkIG1pc3JlcG9ydCB0aGUgd2JmeS1vd25lZCBjYWxsZXIgYXMgY3VzdG9tLlxuICAvLyBObyBleGlzdHNTeW5jIHByZS1jaGVjazogdGhlIGhlbHBlciBhbHJlYWR5IHRyZWF0cyBhIG1pc3NpbmcgZmlsZSBhcyBub3Qgb3duZWQsIGFuZCB0aGlzIHJ1bnNcbiAgLy8gb25jZSBwZXIgcmVwb3NpdG9yeSwgc28gdGhlIGV4Y2VwdGlvbmFsIEVOT0VOVCByZWFkIGNvc3RzIG5vdGhpbmcgd29ydGggYSByZWR1bmRhbnQgc3RhdC5cbiAgY29uc3QgZHJvcHNUZXN0UnVzdEJhZGdlID1cbiAgICBjb25maWcuY2FyZ29Ub21sRGlyUGF0aHMubGVuZ3RoID09PSAwICYmIGpvYnNBbGxDYWxsUmV1c2FibGVXb3JrZmxvdyh3b3JrZmxvd3NQYXRoLCAndGVzdC1ydXN0LnltbCcsICd0ZXN0LXJ1c3QnKTtcblxuICBjb25zdCBiYWRnZXM6IHN0cmluZ1tdID0gW107XG4gIGZvciAoY29uc3QgZmlsZU5hbWUgb2YgZnMucmVhZGRpclN5bmMod29ya2Zsb3dzUGF0aCkpIHtcbiAgICBpZiAoIWZpbGVOYW1lLnN0YXJ0c1dpdGgoJ3Rlc3QnKSAmJiAhZmlsZU5hbWUuc3RhcnRzV2l0aCgnZGVwbG95JykpIGNvbnRpbnVlO1xuICAgIGlmIChmaWxlTmFtZSA9PT0gJ3Rlc3QtcnVzdC55bWwnICYmIGRyb3BzVGVzdFJ1c3RCYWRnZSkgY29udGludWU7XG4gICAgLy8gR2l0SHViJ3MgYmFkZ2UgZW5kcG9pbnQgcmV0dXJucyA0MDQgdW50aWwgdGhlIHdvcmtmbG93IGhhcyBhdCBsZWFzdCBvbmUgcnVuLCBzbyBhIGJhZGdlIGZvciBhXG4gICAgLy8gZGlzcGF0Y2gtb25seSBkZXBsb3kgd29ya2Zsb3cgdGhhdCBoYXMgbmV2ZXIgcnVuIHJlbmRlcnMgYXMgYSBicm9rZW4gaW1hZ2UuIFRlc3Qgd29ya2Zsb3dzIHJ1blxuICAgIC8vIG9uIGV2ZXJ5IFBSLCBzbyBvbmx5IGRlcGxveSBiYWRnZXMgbmVlZCB0aGUgZ3VhcmQuXG4gICAgaWYgKGZpbGVOYW1lLnN0YXJ0c1dpdGgoJ2RlcGxveScpICYmICEoYXdhaXQgaGFzQW55V29ya2Zsb3dSdW4ocmVwb3NpdG9yeSwgZmlsZU5hbWUsIGNvbmZpZy5pc1B1YmxpY1JlcG8pKSkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGNvbnN0IGJhZGdlTmFtZSA9IChmaWxlTmFtZVswXSA/PyAnJykudG9VcHBlckNhc2UoKSArIGZpbGVOYW1lLnNsaWNlKDEsIGZpbGVOYW1lLmluZGV4T2YoJy4nKSkucmVwbGFjZSgnLScsICcgJyk7XG4gICAgY29uc3Qgd29ya2Zsb3dVcmwgPSBgaHR0cHM6Ly9naXRodWIuY29tLyR7cmVwb3NpdG9yeX0vYWN0aW9ucy93b3JrZmxvd3MvJHtlbmNvZGVVcmxQYXRoKGZpbGVOYW1lKX1gO1xuICAgIGJhZGdlcy5wdXNoKGBbIVske2JhZGdlTmFtZX1dKCR7d29ya2Zsb3dVcmx9L2JhZGdlLnN2ZyldKCR7d29ya2Zsb3dVcmx9KWApO1xuICB9XG4gIHJldHVybiBiYWRnZXM7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGhhc0FueVdvcmtmbG93UnVuKFxuICByZXBvc2l0b3J5OiBzdHJpbmcsXG4gIHdvcmtmbG93RmlsZU5hbWU6IHN0cmluZyxcbiAgaXNQdWJsaWNSZXBvOiBib29sZWFuXG4pOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgY29uc3QgW293bmVyLCByZXBvXSA9IHJlcG9zaXRvcnkuc3BsaXQoJy8nKTtcbiAgaWYgKCFvd25lciB8fCAhcmVwbykgcmV0dXJuIHRydWU7XG4gIHRyeSB7XG4gICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBnZXRPY3Rva2l0KG93bmVyKS5yZXF1ZXN0KCdHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2FjdGlvbnMvd29ya2Zsb3dzL3t3b3JrZmxvd19pZH0vcnVucycsIHtcbiAgICAgIG93bmVyLFxuICAgICAgcmVwbyxcbiAgICAgIHdvcmtmbG93X2lkOiB3b3JrZmxvd0ZpbGVOYW1lLFxuICAgICAgcGVyX3BhZ2U6IDEsXG4gICAgfSk7XG4gICAgcmV0dXJuIHJlc3BvbnNlLmRhdGEudG90YWxfY291bnQgPiAwO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIC8vIEZvciBhIFBVQkxJQyByZXBvc2l0b3J5IHRoZSBydW5zIGVuZHBvaW50IG5lZWRzIG5vIGF1dGhvcml6YXRpb24sIHNvIDQwNCByZWxpYWJseSBtZWFucyB0aGVcbiAgICAvLyB3b3JrZmxvdyBpcyBhYnNlbnQgZnJvbSB0aGUgcmVtb3RlIChlLmcuIGFkZGVkIGxvY2FsbHksIG5ldmVyIHB1c2hlZCkg4oCUIGxpa2UgemVybyBydW5zLCBpdHNcbiAgICAvLyBiYWRnZSB3b3VsZCByZW5kZXIgYnJva2VuLiBGb3IgYSBQUklWQVRFIHJlcG9zaXRvcnkgR2l0SHViIGFsc28gYW5zd2VycyA0MDQgd2hlbiB0aGUgdG9rZW5cbiAgICAvLyBpcyBtaXNzaW5nIG9yIHVuZGVyLXNjb3BlZCwgc28gNDA0IGlzIGFtYmlndW91cyB0aGVyZSBhbmQgdGhlIGJhZGdlIGlzIGtlcHQuXG4gICAgaWYgKChlcnJvciBhcyB7IHN0YXR1cz86IG51bWJlciB9KS5zdGF0dXMgPT09IDQwNCAmJiBpc1B1YmxpY1JlcG8pIHJldHVybiBmYWxzZTtcbiAgICAvLyBLZWVwIHRoZSBwcmUtZ3VhcmQgYmVoYXZpb3IgKGluc2VydCB0aGUgYmFkZ2UpIHdoZW4gdGhlIGNoZWNrIGl0c2VsZiBjYW5ub3QgcnVuLlxuICAgIHJldHVybiB0cnVlO1xuICB9XG59XG5cbi8qKlxuICogUmVwbGFjZXMgdGhlIGJhZGdlIGJsb2NrcyBkaXJlY3RseSB1bmRlciB0aGUgdGl0bGUgd2l0aCBgbWFuYWdlZEJhZGdlc2AsIGtlZXBpbmcgYW55IGJhZGdlIHRoZXJlXG4gKiB0aGF0IHdiZnkgZG9lcyBub3QgbWFuYWdlLCBhbmQgcmVhc3NlbWJsZXMgdGhlIFJFQURNRSBhcm91bmQgdGhlbSB3aXRoIGV4YWN0bHkgb25lIGJsYW5rIGxpbmUgb25cbiAqIGVhY2ggc2lkZS5cbiAqXG4gKiBCb3RoIHRoZSB0aXRsZSBhbmQgdGhlIGJsb2NrIGFyZSBsb2NhdGVkIGluIGEgQ29tbW9uTWFyayBzeW50YXggdHJlZSByYXRoZXIgdGhhbiBieSBzY2FubmluZ1xuICogbGluZXM6IG9ubHkgYSByZWFsIHBhcnNlciBrbm93cyB3aGV0aGVyIGEgbGluZSB0aGF0IGxvb2tzIGxpa2UgYSBiYWRnZSBpcyBhIGJhZGdlIChhIHBhcmFncmFwaCBvZlxuICogbGlua2VkIGltYWdlcykgb3IgY29udGVudCB0aGF0IG1lcmVseSByZWFkcyBsaWtlIG9uZSAoYW4gaW5kZW50ZWQgY29kZSBibG9jaywgYSBibG9jayBxdW90ZSwgYVxuICogZmVuY2VkIGV4YW1wbGUsIGEgbXVsdGlsaW5lIGNvZGUgc3BhbiwgYW4gSFRNTCBibG9jaykuIEV2ZXJ5dGhpbmcgb3V0c2lkZSB0aGUgYmxvY2sgaXMgY29waWVkIGJhY2tcbiAqIHZlcmJhdGltIGZyb20gdGhlIG9yaWdpbmFsIHRleHQgdGhyb3VnaCB0aGUgcGFyc2VyJ3MgcG9zaXRpb25hbCBvZmZzZXRzLCBzbyBubyByZWZvcm1hdHRpbmcgb2YgdGhlXG4gKiB1c2VyJ3MgY29udGVudCBpcyBwb3NzaWJsZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHdyaXRlQmFkZ2VCbG9jayhyZWFkbWU6IHN0cmluZywgbWFuYWdlZEJhZGdlczogc3RyaW5nW10pOiBzdHJpbmcge1xuICBjb25zdCBsaW5lRW5kaW5nID0gZ2V0TGluZUVuZGluZyhyZWFkbWUpO1xuICAvLyBBIEJPTSBpcyBub3QgTWFya2Rvd246IGxlZnQgaW4gdGhlIHRleHQgaXQgaGlkZXMgdGhlIGAjYCBvZiB0aGUgdGl0bGUgZnJvbSB0aGUgcGFyc2VyLCBhbmRcbiAgLy8gcHJlcGVuZGluZyB0aGUgYmxvY2sgYWhlYWQgb2YgaXQgd291bGQgc3RyaXAgdGhlIG1hcmtlciBmcm9tIHRoZSBmaWxlJ3MgZmlyc3QgYnl0ZS5cbiAgY29uc3QgYnl0ZU9yZGVyTWFyayA9IHJlYWRtZS5zdGFydHNXaXRoKCfvu78nKSA/ICfvu78nIDogJyc7XG4gIC8vIEZyb250IG1hdHRlciBpcyBkZWxpbWl0ZWQgYnkgdGhlIHNhbWUgYC0tLWAgYSBTZXRleHQgaGVhZGluZyBhbmQgYSB0aGVtYXRpYyBicmVhayB1c2UsIHNvIGl0IGlzXG4gIC8vIGRldGFjaGVkIGJlZm9yZSBwYXJzaW5nIGluc3RlYWQgb2YgYmVpbmcgdG9sZCBhcGFydCBhZnRlcndhcmRzOyBpdCBhbHNvIGhhcyB0byBzdGF5IGZpcnN0IGluIHRoZVxuICAvLyBmaWxlLCB3aGljaCBtYWtlcyBpdCBhIHByZWZpeCBpbiBleGFjdGx5IHRoZSBzYW1lIHdheSB0aGUgQk9NIGlzLlxuICBjb25zdCB3aXRob3V0TWFyayA9IHJlYWRtZS5zbGljZShieXRlT3JkZXJNYXJrLmxlbmd0aCk7XG4gIGNvbnN0IGZyb250TWF0dGVyID0gd2l0aG91dE1hcmsuc3RhcnRzV2l0aCgnLS0tJylcbiAgICA/ICgvXi0tLVsgXFx0XSpcXHI/XFxuW1xcc1xcU10qP14tLS1bIFxcdF0qKD86XFxyP1xcbnwkKS9tdS5leGVjKHdpdGhvdXRNYXJrKT8uWzBdID8/ICcnKVxuICAgIDogJyc7XG4gIGNvbnN0IHByZWZpeCA9IGAke2J5dGVPcmRlck1hcmt9JHtmcm9udE1hdHRlcn1gO1xuICAvLyBUaGUgZmluYWwgbmV3bGluZSBpcyBzZXQgYXNpZGUgcmF0aGVyIHRoYW4gcGFyc2VkIGFzIHRyYWlsaW5nIGJsYW5rIHNwYWNlLCB3aGljaCB0aGUgYmxhbmstbGluZVxuICAvLyB0cmltbWluZyBiZWxvdyB3b3VsZCBvdGhlcndpc2Ugc3dhbGxvdy5cbiAgY29uc3QgZW5kc1dpdGhOZXdsaW5lID0gL1xccj9cXG4kL3UudGVzdChyZWFkbWUpO1xuICBjb25zdCBjb250ZW50ID0gd2l0aG91dE1hcmsuc2xpY2UoZnJvbnRNYXR0ZXIubGVuZ3RoKS5yZXBsYWNlKC9cXHI/XFxuJC91LCAnJyk7XG5cbiAgY29uc3Qgbm9kZXMgPSBmcm9tTWFya2Rvd24oY29udGVudCkuY2hpbGRyZW47XG4gIC8vIEEgbGVhZGluZyBiYWRnZSBibG9jayBpcyB0aGUgdXNlcidzIG93biBsYXlvdXQ6IGl0IHN0YXlzIGFib3ZlIHRoZSB0aXRsZSwgYW5kIHdiZnkncyBibG9jayBnb2VzIGJlbG93LlxuICBjb25zdCBrZWVwc0xlYWRpbmdCbG9jayA9ICEhbm9kZXNbMF0gJiYgaXNCYWRnZUJsb2NrTm9kZShub2Rlc1swXSkgJiYgaXNUaXRsZU5vZGUobm9kZXNbMV0pO1xuICBjb25zdCB0aXRsZUluZGV4ID0ga2VlcHNMZWFkaW5nQmxvY2sgPyAxIDogaXNUaXRsZU5vZGUobm9kZXNbMF0pID8gMCA6IC0xO1xuICAvLyBXaXRob3V0IGEgcmVjb2duaXphYmxlIHRpdGxlIHRoZSBibG9jayBzaXRzIGF0IHRoZSB2ZXJ5IHRvcCwgYWJvdmUgZXZlcnl0aGluZy5cbiAgY29uc3QgaGVhZFN0YXJ0Tm9kZSA9IGtlZXBzTGVhZGluZ0Jsb2NrID8gbm9kZXNbMF0hIDogbm9kZXNbdGl0bGVJbmRleF07XG4gIGNvbnN0IGhlYWQgPVxuICAgIHRpdGxlSW5kZXggPT09IC0xXG4gICAgICA/ICcnXG4gICAgICA6IGNvbnRlbnQuc2xpY2Uoc3RhcnRPZmZzZXRXaXRoSW5kZW50KGNvbnRlbnQsIGhlYWRTdGFydE5vZGUhKSwgbm9kZXNbdGl0bGVJbmRleF0hLnBvc2l0aW9uIS5lbmQub2Zmc2V0KTtcblxuICBjb25zdCBiYWRnZUJsb2NrTm9kZXM6IFBhcmFncmFwaFtdID0gW107XG4gIGZvciAobGV0IG5vZGVJbmRleCA9IHRpdGxlSW5kZXggKyAxOyA7IG5vZGVJbmRleCsrKSB7XG4gICAgY29uc3Qgbm9kZSA9IG5vZGVzW25vZGVJbmRleF07XG4gICAgaWYgKCFpc0JhZGdlQmxvY2tOb2RlKG5vZGUpKSBicmVhaztcbiAgICBiYWRnZUJsb2NrTm9kZXMucHVzaChub2RlKTtcbiAgICAvLyBXaXRob3V0IGEgdGl0bGUsIG1lcmdpbmcgbGVhZGluZyBibG9ja3MgY291bGQgY2hhbmdlIHdoaWNoIG5vZGUgaXMgcmVjb2duaXplZCBhcyB0aGUgdGl0bGUgb24gdGhlIG5leHQgcnVuLlxuICAgIGlmICh0aXRsZUluZGV4ID09PSAtMSkgYnJlYWs7XG4gIH1cbiAgY29uc3QgZXhpc3RpbmcgPSBiYWRnZUJsb2NrTm9kZXMuZmxhdE1hcCgobm9kZSkgPT4gcmVhZEJhZGdlcyhub2RlLCBjb250ZW50KSk7XG4gIGNvbnN0IGJvZHlOb2RlID0gbm9kZXNbdGl0bGVJbmRleCArIDEgKyBiYWRnZUJsb2NrTm9kZXMubGVuZ3RoXTtcbiAgY29uc3QgYm9keSA9IGJvZHlOb2RlID8gY29udGVudC5zbGljZShzdGFydE9mZnNldFdpdGhJbmRlbnQoY29udGVudCwgYm9keU5vZGUpKSA6ICcnO1xuXG4gIC8vIFN1cGVyc2VkaW5nIGEgbWFuYWdlZCBiYWRnZSBpcyBqdXN0IGRyb3BwaW5nIHRoZSBvbGQgb25lOiBhIHZlcnNpb24sIHdvcmtmbG93LCBucG0sIG9yIGxpY2Vuc2VcbiAgLy8gY2hhbmdlIGxlYXZlcyBubyBzdGFsZSBjb3B5LCB3aGlsZSBhbnkgb3RoZXIgYmFkZ2UgaW4gdGhlIG1hbmFnZWQgcmVnaW9uIGlzIGtlcHQuXG4gIGNvbnN0IGJhZGdlcyA9IFsuLi5tYW5hZ2VkQmFkZ2VzLCAuLi5leGlzdGluZy5maWx0ZXIoKGJhZGdlKSA9PiAhaXNNYW5hZ2VkQmFkZ2UoYmFkZ2UpKV07XG4gIC8vIENvbnRlbnQgaXMgc2xpY2VkIGZyb20gaXRzIG5vZGUncyBzdGFydCBvZmZzZXQsIHNvIHdoYXRldmVyIGJsYW5rIHNwYWNlIGZvbGxvd2VkIHRoZSBmcm9udFxuICAvLyBtYXR0ZXIgaXMgZ29uZTsgZXhhY3RseSBvbmUgYmxhbmsgbGluZSBpcyByZXN0b3JlZCBoZXJlLiBBIGNsb3NpbmcgZGVsaW1pdGVyIHRoYXQgZW5kZWQgYXQgRU9GXG4gIC8vIGNhcnJpZXMgbm8gbmV3bGluZSBvZiBpdHMgb3duIGFuZCBuZWVkcyBib3RoLCBvciBgLS0tYCB3b3VsZCBmdXNlIHdpdGggdGhlIGZpcnN0IGJhZGdlIGFuZFxuICAvLyBkZXN0cm95IHRoZW0gYm90aC4gQSBCT00gbmVlZHMgbm8gc2VwYXJhdG9yOiBpdCBpcyBhIGJ5dGUgbWFya2VyLCBub3QgYSBsaW5lLlxuICBjb25zdCBzZXBhcmF0b3IgPSBmcm9udE1hdHRlciA/ICgvXFxyP1xcbiQvdS50ZXN0KGZyb250TWF0dGVyKSA/IGxpbmVFbmRpbmcgOiBgJHtsaW5lRW5kaW5nfSR7bGluZUVuZGluZ31gKSA6ICcnO1xuICBjb25zdCByZXN1bHQgPVxuICAgIHByZWZpeCArIHNlcGFyYXRvciArIFtoZWFkLCBiYWRnZXMuam9pbihsaW5lRW5kaW5nKSwgYm9keV0uZmlsdGVyKEJvb2xlYW4pLmpvaW4oYCR7bGluZUVuZGluZ30ke2xpbmVFbmRpbmd9YCk7XG4gIHJldHVybiBlbmRzV2l0aE5ld2xpbmUgPyBgJHtyZXN1bHR9JHtsaW5lRW5kaW5nfWAgOiByZXN1bHQ7XG59XG5cbi8qKlxuICogQSBub2RlJ3Mgc3RhcnQgb2Zmc2V0LCBleHRlbmRlZCBiYWNrIG92ZXIgdGhlIGxlYWRpbmcgd2hpdGVzcGFjZSBvbiBpdHMgb3duIGxpbmUuIENvbW1vbk1hcmtcbiAqIGFsbG93cyBvbmUgdG8gdGhyZWUgc3BhY2VzIG9mIGluZGVudGF0aW9uIGJlZm9yZSBhIGJsb2NrLCBhbmQgbWRhc3QgcmVwb3J0cyB0aGUgb2Zmc2V0IEFGVEVSXG4gKiB0aGVtIOKAlCBzbyBzbGljaW5nIGZyb20gaXQgc2lsZW50bHkgcmVpbmRlbnRzIGNvbnRlbnQgdGhpcyBnZW5lcmF0b3IgcHJvbWlzZXMgdG8gY29weSB2ZXJiYXRpbS5cbiAqL1xuZnVuY3Rpb24gc3RhcnRPZmZzZXRXaXRoSW5kZW50KGNvbnRlbnQ6IHN0cmluZywgbm9kZTogUm9vdENvbnRlbnQpOiBudW1iZXIge1xuICBjb25zdCBzdGFydCA9IG5vZGUucG9zaXRpb24hLnN0YXJ0Lm9mZnNldCE7XG4gIGNvbnN0IGxpbmVTdGFydCA9IGNvbnRlbnQubGFzdEluZGV4T2YoJ1xcbicsIHN0YXJ0IC0gMSkgKyAxO1xuICByZXR1cm4gL15bIFxcdF0qJC91LnRlc3QoY29udGVudC5zbGljZShsaW5lU3RhcnQsIHN0YXJ0KSkgPyBsaW5lU3RhcnQgOiBzdGFydDtcbn1cblxuLyoqXG4gKiBXaGV0aGVyIHRoZSBub2RlIG9wZW5zIHRoZSBSRUFETUUgd2l0aCBhIHRpdGxlLiBPbmx5IHRoZSBGSVJTVCBwaWVjZSBvZiBjb250ZW50IGNhbiBiZSBvbmU6IGFcbiAqIHRpdGxlIGlzIHdoYXQgYSBSRUFETUUgb3BlbnMgd2l0aCwgYW5kIGFuY2hvcmluZyB0aGUgYmFkZ2VzIHRvIGEgaGVhZGluZyBmdXJ0aGVyIGRvd24gd291bGQgYnVyeVxuICogdGhlbSBiZWxvdyBjb250ZW50IHRoZSBhdXRob3IgcHV0IGZpcnN0LlxuICovXG5mdW5jdGlvbiBpc1RpdGxlTm9kZShub2RlOiBSb290Q29udGVudCB8IHVuZGVmaW5lZCk6IGJvb2xlYW4ge1xuICBpZiAoIW5vZGUpIHJldHVybiBmYWxzZTtcbiAgaWYgKG5vZGUudHlwZSA9PT0gJ2hlYWRpbmcnKSByZXR1cm4gdHJ1ZTtcbiAgLy8gTWFueSBSRUFETUVzIGNlbnRlciB0aGVpciB0aXRsZSBpbiBIVE1MIChgPGgxPmAsIG9yIGEgYDxkaXY+YC9gPHA+YCB3cmFwcGluZyBvbmUpLCB3aGljaCB0aGVcbiAgLy8gcGFyc2VyIHJlcG9ydHMgYXMgb25lIG9wYXF1ZSBIVE1MIGJsb2NrOyB0aGUgYmFkZ2VzIGdvIGFmdGVyIHRoZSB3aG9sZSBibG9jay5cbiAgcmV0dXJuIG5vZGUudHlwZSA9PT0gJ2h0bWwnICYmIGNvbnRhaW5zUmVuZGVyZWRIMShub2RlLnZhbHVlKTtcbn1cblxuLyoqXG4gKiBXaGV0aGVyIHRoZSBIVE1MIGJsb2NrIHVuYW1iaWd1b3VzbHkgUkVOREVSUyBhbiBgPGgxPmAg4oCUIHRoZSBjZW50ZXJlZC10aXRsZSBsYXlvdXQgbWFueSBSRUFETUVzXG4gKiB1c2UgKGA8aDE+YCwgb3IgYSBgPGRpdj5gL2A8cD5gIHdyYXBwaW5nIG9uZSkuXG4gKlxuICogRGVsaWJlcmF0ZWx5IE5PVCBhIGdlbmVyYWwgSFRNTCBwYXJzZXIuIERlY2lkaW5nIHRoaXMgZXhhY3RseSByZXF1aXJlcyB0aGUgcmVhbCB0b2tlbml6ZXInc1xuICogc3RhdGVzIOKAlCByYXcgdGV4dCwgUkNEQVRBLCBzY3JpcHQgZGF0YSwgYXR0cmlidXRlIHZhbHVlcywgdGVtcGxhdGUgY29udGVudHMsIGRlY2xhcmF0aW9ucyDigJQgYW5kXG4gKiBhcHByb3hpbWF0aW5nIHRoZW0gd2l0aCByZWdleGVzIGlzIHRoZSBzYW1lIGxvc2luZyBnYW1lIHRoZSBNYXJrZG93biBzY2FubmluZyB0aGlzIG1vZHVsZVxuICogcmVwbGFjZWQgd2FzIHBsYXlpbmcuIFNvIHRoZSBydWxlIGlzOiB0b2tlbml6ZSBvbmx5IHRoZSBzaW1wbGUgY2FzZSwgYW5kIHRyZWF0IGFueXRoaW5nIGNhcnJ5aW5nXG4gKiBhIGNvbnN0cnVjdCB3aG9zZSBwYXJzaW5nIGRlcGVuZHMgb24gdGhvc2Ugc3RhdGVzIGFzIE5PVCBhIHRpdGxlLiBCZWluZyB3cm9uZyB0aGF0IHdheSBwdXRzIHRoZVxuICogYmFkZ2VzIGF0IHRoZSB0b3Agb2YgdGhlIGZpbGUsIHdoaWNoIGlzIG1lcmVseSB1bmhlbHBmdWw7IGJlaW5nIHdyb25nIHRoZSBvdGhlciB3YXkgcmV3cml0ZXMgdGhlXG4gKiB1c2VyJ3MgUkVBRE1FIGFyb3VuZCB0aGUgd3JvbmcgYW5jaG9yLlxuICovXG5mdW5jdGlvbiBjb250YWluc1JlbmRlcmVkSDEoaHRtbDogc3RyaW5nKTogYm9vbGVhbiB7XG4gIC8vIENvbW1lbnRzIGNhbm5vdCBuZXN0IGFuZCBlbmQgdW5hbWJpZ3VvdXNseSwgc28gdGhleSBhcmUgc2ltcGx5IHJlbW92ZWQgcmF0aGVyIHRoYW4gZGlzcXVhbGlmeWluZy5cbiAgY29uc3Qgd2l0aG91dENvbW1lbnRzID0gaHRtbC5yZXBsYWNlQWxsKC88IS0tW1xcc1xcU10qPyg/Oi0tPnwkKS9ndSwgJycpO1xuICAvLyBDREFUQSwgcHJvY2Vzc2luZyBpbnN0cnVjdGlvbnMsIGRlY2xhcmF0aW9ucywgZWxlbWVudHMgd2hvc2UgY29udGVudCBpcyByYXcgdGV4dCAvIFJDREFUQSAvXG4gIC8vIHNjcmlwdCBkYXRhLCBhbmQgYDx0ZW1wbGF0ZT5gICh3aG9zZSBjb250ZW50cyBhcmUgaW5lcnQpLiBBIHF1b3RlZCBhdHRyaWJ1dGUgY29udGFpbmluZyBgPGBcbiAgLy8gbWFrZXMgZXZlbiBsb2NhdGluZyB0aGVzZSB1bnJlbGlhYmxlLCBzbyBpdCBkaXNxdWFsaWZpZXMgdGhlIGJsb2NrIHRvby5cbiAgY29uc3QgYW1iaWd1b3VzQ29uc3RydWN0UGF0dGVybiA9XG4gICAgLzwhXFxbQ0RBVEFcXFt8PFxcP3w8IVthLXpBLVpdfDxcXC8/KD86c2NyaXB0fHN0eWxlfHRleHRhcmVhfHRpdGxlfGlmcmFtZXxub2ZyYW1lc3xub2VtYmVkfHhtcHx0ZW1wbGF0ZSlcXGJ8XCJbXlwiXSo8W15cIl0qXCJ8J1teJ10qPFteJ10qJy9pdTtcbiAgaWYgKGFtYmlndW91c0NvbnN0cnVjdFBhdHRlcm4udGVzdCh3aXRob3V0Q29tbWVudHMpKSByZXR1cm4gZmFsc2U7XG4gIC8vIFF1b3RpbmcgaXMgc2lnbmlmaWNhbnQgb25seSBpbnNpZGUgYSBzdGFydCB0YWcsIHNvIGFuIGF0dHJpYnV0ZSB2YWx1ZSBpcyBjb25zdW1lZCB3aXRoIGl0cyBvd25cbiAgLy8gdGFnIHdoaWxlIHF1b3RhdGlvbiBtYXJrcyBpbiBvcmRpbmFyeSB0ZXh0IHN0YXkgdGV4dDogYDxkaXYgdGl0bGU9XCImbHQ7aDEmZ3Q7XCI+YCBkb2VzIG5vdCBjb3VudCxcbiAgLy8gYFwiPGgxPlByb2plY3Q8L2gxPlwiYCBkb2VzLlxuICBjb25zdCBzdGFydFRhZ1BhdHRlcm4gPSAvPChbYS16QS1aXVteXFxzLz5dKikoPzpcIlteXCJdKlwifCdbXiddKid8W14+XCInXSkqPi9ndTtcbiAgZm9yIChjb25zdCBtYXRjaCBvZiB3aXRob3V0Q29tbWVudHMubWF0Y2hBbGwoc3RhcnRUYWdQYXR0ZXJuKSkge1xuICAgIGlmIChtYXRjaFsxXT8udG9Mb3dlckNhc2UoKSA9PT0gJ2gxJykgcmV0dXJuIHRydWU7XG4gIH1cbiAgcmV0dXJuIGZhbHNlO1xufVxuXG4vKiogV2hldGhlciB0aGUgbm9kZSBpcyBhIHBhcmFncmFwaCBvZiBiYWRnZXMgYW5kIG5vdGhpbmcgZWxzZSDigJQgdGhlIG9ubHkgY29udGVudCB3YmZ5IHB1dHMgaW4gdGhlIGJsb2NrLiAqL1xuZnVuY3Rpb24gaXNCYWRnZUJsb2NrTm9kZShub2RlOiBSb290Q29udGVudCB8IHVuZGVmaW5lZCk6IG5vZGUgaXMgUGFyYWdyYXBoIHtcbiAgcmV0dXJuIChcbiAgICAhIW5vZGUgJiZcbiAgICBub2RlLnR5cGUgPT09ICdwYXJhZ3JhcGgnICYmXG4gICAgbm9kZS5jaGlsZHJlbi5zb21lKChjaGlsZCkgPT4gaXNCYWRnZU5vZGUoY2hpbGQpKSAmJlxuICAgIG5vZGUuY2hpbGRyZW4uZXZlcnkoXG4gICAgICAoY2hpbGQpID0+IGlzQmFkZ2VOb2RlKGNoaWxkKSB8fCBjaGlsZC50eXBlID09PSAnYnJlYWsnIHx8IChjaGlsZC50eXBlID09PSAndGV4dCcgJiYgIWNoaWxkLnZhbHVlLnRyaW0oKSlcbiAgICApXG4gICk7XG59XG5cbi8qKiBBIGJhZGdlIGlzIG9uZSBgWyFbYWx0XShpbWFnZSldKGxpbmspYCwgdGhlIG9ubHkgc2hhcGUgd2JmeSBldmVyIHdyaXRlcy4gKi9cbmZ1bmN0aW9uIGlzQmFkZ2VOb2RlKG5vZGU6IFJvb3RDb250ZW50IHwgUGhyYXNpbmdDb250ZW50KTogbm9kZSBpcyBMaW5rICYgeyBjaGlsZHJlbjogW0ltYWdlXSB9IHtcbiAgcmV0dXJuIG5vZGUudHlwZSA9PT0gJ2xpbmsnICYmIG5vZGUuY2hpbGRyZW4ubGVuZ3RoID09PSAxICYmIG5vZGUuY2hpbGRyZW5bMF0/LnR5cGUgPT09ICdpbWFnZSc7XG59XG5cbi8qKlxuICogVGhlIGJhZGdlcyBpbiB0aGUgYmxvY2ssIGFzIHRoZSBleGFjdCBzb3VyY2UgdGV4dCB0aGF0IHByb2R1Y2VkIHRoZW06IGEgYmFkZ2Ugd2JmeSBkb2VzIG5vdCBtYW5hZ2VcbiAqIGlzIHdyaXR0ZW4gYmFjayBieXRlIGZvciBieXRlIGluc3RlYWQgb2YgYmVpbmcgcmUtc2VyaWFsaXplZCBmcm9tIHRoZSB0cmVlLlxuICovXG5mdW5jdGlvbiByZWFkQmFkZ2VzKG5vZGU6IFBhcmFncmFwaCwgY29udGVudDogc3RyaW5nKTogc3RyaW5nW10ge1xuICByZXR1cm4gbm9kZS5jaGlsZHJlblxuICAgIC5maWx0ZXIoKGNoaWxkKSA9PiBpc0JhZGdlTm9kZShjaGlsZCkpXG4gICAgLm1hcCgoY2hpbGQpID0+IGNvbnRlbnQuc2xpY2UoY2hpbGQucG9zaXRpb24hLnN0YXJ0Lm9mZnNldCwgY2hpbGQucG9zaXRpb24hLmVuZC5vZmZzZXQpKTtcbn1cblxuLyoqXG4gKiBQZXJjZW50LWVuY29kZXMgdGhlIGNoYXJhY3RlcnMgdGhhdCB3b3VsZCBlbmQgYSBNYXJrZG93biBkZXN0aW5hdGlvbiBlYXJseS4gQSB3b3JrZmxvdyBmaWxlIG1heSBiZVxuICogbmFtZWQgYW55dGhpbmcgd2l0aCBhIGAueW1sYCBleHRlbnNpb24sIGFuZCBvbmUgY29udGFpbmluZyBgKGAgb3IgYClgIHByb2R1Y2VkIGEgYmFkZ2UgdGhhdCB3YmZ5J3NcbiAqIG93biBiYWRnZSBwYXR0ZXJuIGNvdWxkIG5vdCByZWFkIGJhY2sg4oCUIHNvIHRoZSBsaW5lIGxlZnQgdGhlIGJsb2NrIGFuZCB0aGUgYmFkZ2Ugd2FzIGR1cGxpY2F0ZWQuXG4gKi9cbmZ1bmN0aW9uIGVuY29kZVVybFBhdGgodmFsdWU6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiB2YWx1ZS5yZXBsYWNlQWxsKC9bKClcXHNdL2d1LCAoY2hhcmFjdGVyKSA9PiBgJSR7Y2hhcmFjdGVyLmNvZGVQb2ludEF0KDApIS50b1N0cmluZygxNikudG9VcHBlckNhc2UoKX1gKTtcbn1cblxuLyoqIFdoZXRoZXIgdGhlIGJhZGdlIGlzIG9uZSB3YmZ5IHdyaXRlcyBpdHNlbGYsIGFuZCBzbyBtYXkgYmUgcmVwbGFjZWQgYnkgdGhlIGN1cnJlbnQgYmxvY2suICovXG5mdW5jdGlvbiBpc01hbmFnZWRCYWRnZShiYWRnZTogc3RyaW5nKTogYm9vbGVhbiB7XG4gIHJldHVybiBiYWRnZSA9PT0gc2VtYW50aWNSZWxlYXNlQmFkZ2UgfHwgbWFuYWdlZEJhZGdlUGF0dGVybnMuc29tZSgocGF0dGVybikgPT4gcGF0dGVybi50ZXN0KGJhZGdlKSk7XG59XG5cbmZ1bmN0aW9uIGdldExpbmVFbmRpbmcoY29udGVudDogc3RyaW5nKTogJ1xcbicgfCAnXFxyXFxuJyB7XG4gIHJldHVybiBjb250ZW50LmluY2x1ZGVzKCdcXHJcXG4nKSA/ICdcXHJcXG4nIDogJ1xcbic7XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgbWVyZ2UgZnJvbSAnZGVlcG1lcmdlJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZnNVdGlsIH0gZnJvbSAnLi4vdXRpbHMvZnNVdGlsLmpzJztcbmltcG9ydCB7IG92ZXJ3cml0ZU1lcmdlIH0gZnJvbSAnLi4vdXRpbHMvbWVyZ2VVdGlsLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVSZWxlYXNlcmMocm9vdENvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2dlbmVyYXRlUmVsZWFzZXJjJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKHJvb3RDb25maWcuZGlyUGF0aCwgJy5yZWxlYXNlcmMuanNvbicpO1xuICAgIGlmICghZnMuZXhpc3RzU3luYyhmaWxlUGF0aCkpIHJldHVybjtcblxuICAgIGNvbnN0IHNldHRpbmdzID0gSlNPTi5wYXJzZShhd2FpdCBmcy5wcm9taXNlcy5yZWFkRmlsZShmaWxlUGF0aCwgJ3V0ZjgnKSkgYXMge1xuICAgICAgcGx1Z2lucz86IChzdHJpbmcgfCBbc3RyaW5nLCB1bmtub3duXSlbXTtcbiAgICAgIGV4dGVuZHM/OiB1bmtub3duO1xuICAgIH07XG4gICAgY29uc3QgcGx1Z2lucyA9IHNldHRpbmdzLnBsdWdpbnMgPz8gW107XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwbHVnaW5zLmxlbmd0aDsgaSsrKSB7XG4gICAgICBjb25zdCBwbHVnaW5FbnRyeSA9IHBsdWdpbnNbaV07XG4gICAgICBjb25zdCBpc0FycmF5ID0gQXJyYXkuaXNBcnJheShwbHVnaW5FbnRyeSk7XG4gICAgICBjb25zdCBwbHVnaW4gPSBpc0FycmF5ID8gcGx1Z2luRW50cnlbMF0gOiBwbHVnaW5FbnRyeTtcbiAgICAgIGNvbnN0IG9sZENvbmZpZyA9IChpc0FycmF5ICYmIHBsdWdpbkVudHJ5WzFdKSB8fCB7fTtcbiAgICAgIGlmIChwbHVnaW4gPT09ICdAc2VtYW50aWMtcmVsZWFzZS9jb21taXQtYW5hbHl6ZXInKSB7XG4gICAgICAgIHBsdWdpbnNbaV0gPSBbXG4gICAgICAgICAgJ0BzZW1hbnRpYy1yZWxlYXNlL2NvbW1pdC1hbmFseXplcicsXG4gICAgICAgICAgbWVyZ2UuYWxsKFxuICAgICAgICAgICAgW1xuICAgICAgICAgICAgICBvbGRDb25maWcsXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBwcmVzZXQ6ICdjb252ZW50aW9uYWxjb21taXRzJyxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICB7IGFycmF5TWVyZ2U6IG92ZXJ3cml0ZU1lcmdlIH1cbiAgICAgICAgICApLFxuICAgICAgICBdO1xuICAgICAgfSBlbHNlIGlmIChwbHVnaW4gPT09ICdAc2VtYW50aWMtcmVsZWFzZS9naXRodWInKSB7XG4gICAgICAgIHBsdWdpbnNbaV0gPSBbXG4gICAgICAgICAgJ0BzZW1hbnRpYy1yZWxlYXNlL2dpdGh1YicsXG4gICAgICAgICAgbWVyZ2UuYWxsKFxuICAgICAgICAgICAgW1xuICAgICAgICAgICAgICBvbGRDb25maWcsXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAvLyBjZi4gaHR0cHM6Ly9naXRodWIuY29tL3NlbWFudGljLXJlbGVhc2Uvc2VtYW50aWMtcmVsZWFzZS9pc3N1ZXMvMjIwNCNpc3N1ZWNvbW1lbnQtMTUwODQxNzcwNFxuICAgICAgICAgICAgICAgIHN1Y2Nlc3NDb21tZW50Q29uZGl0aW9uOiBmYWxzZSxcbiAgICAgICAgICAgICAgICBmYWlsQ29tbWVudENvbmRpdGlvbjogZmFsc2UsXG4gICAgICAgICAgICAgICAgbGFiZWxzOiBbJ3I6IHNlbWFudGljLXJlbGVhc2UnXSxcbiAgICAgICAgICAgICAgICByZWxlYXNlZExhYmVsczogWydyZWxlYXNlZCA6Ym9va21hcms6J10sXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgeyBhcnJheU1lcmdlOiBvdmVyd3JpdGVNZXJnZSB9XG4gICAgICAgICAgKSxcbiAgICAgICAgXTtcbiAgICAgIH1cbiAgICB9XG4gICAgY29uc3QgbmV3Q29udGVudCA9IEpTT04uc3RyaW5naWZ5KHNldHRpbmdzLCB1bmRlZmluZWQsIDIpO1xuICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiBmc1V0aWwuZ2VuZXJhdGVGaWxlKGZpbGVQYXRoLCBuZXdDb250ZW50KSk7XG4gIH0pO1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IG1lcmdlIGZyb20gJ2RlZXBtZXJnZSc7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGZzVXRpbCB9IGZyb20gJy4uL3V0aWxzL2ZzVXRpbC5qcyc7XG5pbXBvcnQgeyBqc29uY1V0aWwgfSBmcm9tICcuLi91dGlscy9qc29uY1V0aWwuanMnO1xuaW1wb3J0IHsgb3ZlcndyaXRlTWVyZ2UgfSBmcm9tICcuLi91dGlscy9tZXJnZVV0aWwuanMnO1xuXG5jb25zdCBzaGFyZWRQcmVzZXQgPSAnZ2l0aHViPldpbGxCb29zdGVyL3dpbGxib29zdGVyLWNvbmZpZ3M6cmVub3ZhdGUuanNvbmMnO1xuY29uc3QgZ2VuZXJhdGVkU2V0dGluZ3MgPSB7XG4gICRzY2hlbWE6ICdodHRwczovL2RvY3MucmVub3ZhdGVib3QuY29tL3Jlbm92YXRlLXNjaGVtYS5qc29uJyxcbiAgZXh0ZW5kczogW3NoYXJlZFByZXNldF0sXG59O1xuXG50eXBlIFNldHRpbmdzID0gUGFydGlhbDx0eXBlb2YgZ2VuZXJhdGVkU2V0dGluZ3M+ICYge1xuICBwYWNrYWdlUnVsZXM/OiB7IG1hdGNoUGFja2FnZU5hbWVzOiBzdHJpbmdbXTsgZW5hYmxlZD86IGJvb2xlYW4gfVtdO1xufTtcblxuY29uc3QgbWFuYWdlZEZpbGVOYW1lID0gJ3Jlbm92YXRlLmpzb25jJztcblxuLy8gd2JmeSBzdXBwb3J0cyBvbmUgY2Fub25pY2FsIFJlbm92YXRlIGxvY2F0aW9uLiBOb24tY2Fub25pY2FsIGNvbmZpZ3MgYXJlIGZpeGVkIGluIHRoZSB0YXJnZXRcbi8vIHJlcG9zaXRvcnkgaW5zdGVhZCBvZiBiZWluZyBwYXJzZWQsIG1lcmdlZCwgb3IgZGVsZXRlZCBoZXJlLlxuY29uc3Qgbm9uQ2Fub25pY2FsQ29uZmlnUGF0aHMgPSBbXG4gICdyZW5vdmF0ZS5qc29uJyxcbiAgJ3Jlbm92YXRlLmpzb241JyxcbiAgJy5naXRodWIvcmVub3ZhdGUuanNvbicsXG4gICcuZ2l0aHViL3Jlbm92YXRlLmpzb25jJyxcbiAgJy5naXRodWIvcmVub3ZhdGUuanNvbjUnLFxuICAnLnJlbm92YXRlcmMnLFxuICAnLnJlbm92YXRlcmMuanNvbicsXG4gICcucmVub3ZhdGVyYy5qc29uNScsXG5dO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVSZW5vdmF0ZUpzb25jKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2dlbmVyYXRlUmVub3ZhdGVKc29uYycsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgbWFuYWdlZEZpbGVOYW1lKTtcbiAgICBjb25zdCBtYW5hZ2VkRmlsZVN0YXRzID0gYXdhaXQgZnMucHJvbWlzZXMubHN0YXQoZmlsZVBhdGgpLmNhdGNoKCgpID0+IHt9KTtcbiAgICBpZiAobWFuYWdlZEZpbGVTdGF0cz8uaXNTeW1ib2xpY0xpbmsoKSkge1xuICAgICAgY29uc29sZS53YXJuKGBTa2lwcGVkIGdlbmVyYXRpbmcgJHtmaWxlUGF0aH0gYmVjYXVzZSBpdCBpcyBhIHN5bWJvbGljIGxpbmsuYCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3Qgbm9uQ2Fub25pY2FsQ29uZmlnQ2FuZGlkYXRlcyA9IGF3YWl0IFByb21pc2UuYWxsKFxuICAgICAgbm9uQ2Fub25pY2FsQ29uZmlnUGF0aHMubWFwKGFzeW5jIChyZWxhdGl2ZVBhdGgpID0+IHtcbiAgICAgICAgY29uc3QgY2FuZGlkYXRlID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCByZWxhdGl2ZVBhdGgpO1xuICAgICAgICByZXR1cm4gKGF3YWl0IGZzLnByb21pc2VzLmxzdGF0KGNhbmRpZGF0ZSkuY2F0Y2goKCkgPT4ge30pKSA/IGNhbmRpZGF0ZSA6IHVuZGVmaW5lZDtcbiAgICAgIH0pXG4gICAgKTtcbiAgICBjb25zdCBub25DYW5vbmljYWxDb25maWdQYXRoID0gbm9uQ2Fub25pY2FsQ29uZmlnQ2FuZGlkYXRlcy5maW5kKChjYW5kaWRhdGUpID0+IGNhbmRpZGF0ZSAhPT0gdW5kZWZpbmVkKTtcbiAgICBpZiAobm9uQ2Fub25pY2FsQ29uZmlnUGF0aCB8fCBjb25maWcucGFja2FnZUpzb24/LnJlbm92YXRlKSB7XG4gICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgIGBTa2lwcGVkIGdlbmVyYXRpbmcgJHtmaWxlUGF0aH0gYmVjYXVzZSB0aGUgcmVwb3NpdG9yeSBoYXMgYSBub24tY2Fub25pY2FsIFJlbm92YXRlIGNvbmZpZyR7XG4gICAgICAgICAgbm9uQ2Fub25pY2FsQ29uZmlnUGF0aCA/IGAgYXQgJHtub25DYW5vbmljYWxDb25maWdQYXRofWAgOiAnIGluIHBhY2thZ2UuanNvbidcbiAgICAgICAgfS5gXG4gICAgICApO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IG9sZENvbnRlbnQgPSBhd2FpdCBmc1V0aWwucmVhZEZpbGVJZkV4aXN0cyhmaWxlUGF0aCk7XG4gICAgbGV0IG9sZFNldHRpbmdzOiBTZXR0aW5ncyB8IHVuZGVmaW5lZDtcbiAgICBpZiAob2xkQ29udGVudCAhPT0gdW5kZWZpbmVkICYmICFqc29uY1V0aWwuaXNUcml2aWFPbmx5KG9sZENvbnRlbnQpKSB7XG4gICAgICBvbGRTZXR0aW5ncyA9IGpzb25jVXRpbC5wYXJzZU9iamVjdElnbm9yaW5nRXJyb3I8U2V0dGluZ3M+KG9sZENvbnRlbnQpO1xuICAgICAgaWYgKCFvbGRTZXR0aW5ncykge1xuICAgICAgICBjb25zb2xlLndhcm4oYFNraXBwZWQgZ2VuZXJhdGluZyAke2ZpbGVQYXRofSBiZWNhdXNlIHRoZSBleGlzdGluZyBjb250ZW50IGlzIG5vdCBwYXJzYWJsZSBhcyBKU09OQy5gKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChvbGRTZXR0aW5ncz8uZXh0ZW5kcyAhPT0gdW5kZWZpbmVkICYmICFBcnJheS5pc0FycmF5KG9sZFNldHRpbmdzLmV4dGVuZHMpKSB7XG4gICAgICBjb25zb2xlLndhcm4oYFNraXBwZWQgZ2VuZXJhdGluZyAke2ZpbGVQYXRofSBiZWNhdXNlIFwiZXh0ZW5kc1wiIGlzIG5vdCBhbiBhcnJheS5gKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgcmVtb3ZlZFByZXNldCA9IG9sZFNldHRpbmdzPy5leHRlbmRzPy5maW5kKFxuICAgICAgKHByZXNldCkgPT4gcHJlc2V0LnN0YXJ0c1dpdGgoJ2dpdGh1Yj5XaWxsQm9vc3Rlci93aWxsYm9vc3Rlci1jb25maWdzOicpICYmIHByZXNldCAhPT0gc2hhcmVkUHJlc2V0XG4gICAgKTtcbiAgICBpZiAocmVtb3ZlZFByZXNldCkge1xuICAgICAgY29uc29sZS53YXJuKGBTa2lwcGVkIGdlbmVyYXRpbmcgJHtmaWxlUGF0aH0gYmVjYXVzZSBcIiR7cmVtb3ZlZFByZXNldH1cIiBubyBsb25nZXIgZXhpc3RzOyByZW1vdmUgaXQgbWFudWFsbHkuYCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgbmV3U2V0dGluZ3MgPSBidWlsZFNldHRpbmdzKGNvbmZpZywgb2xkU2V0dGluZ3MpO1xuICAgIGNvbnN0IHsgY29udGVudCwga2V5c0xvc2luZ0NvbW1lbnRzIH0gPSBqc29uY1V0aWwuc3RyaW5naWZ5UHJlc2VydmluZ1RyaXZpYShcbiAgICAgIG9sZENvbnRlbnQsXG4gICAgICBuZXdTZXR0aW5ncyBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPlxuICAgICk7XG4gICAgaWYgKG9sZENvbnRlbnQgIT09IHVuZGVmaW5lZCAmJiBub3JtYWxpemUoY29udGVudCkgPT09IG5vcm1hbGl6ZShvbGRDb250ZW50KSkgcmV0dXJuO1xuICAgIGlmICghKGF3YWl0IGZzVXRpbC5nZW5lcmF0ZUZpbGUoZmlsZVBhdGgsIGNvbnRlbnQpKSkgcmV0dXJuO1xuXG4gICAgZm9yIChjb25zdCBrZXkgb2Yga2V5c0xvc2luZ0NvbW1lbnRzKSB7XG4gICAgICBjb25zb2xlLndhcm4oYENvbW1lbnRzIGluc2lkZSBcIiR7a2V5fVwiIHdlcmUgZHJvcHBlZCB3aGlsZSByZXdyaXRpbmcgaXQgaW4gJHtmaWxlUGF0aH0uYCk7XG4gICAgfVxuICB9KTtcbn1cblxuZnVuY3Rpb24gYnVpbGRTZXR0aW5ncyhjb25maWc6IFBhY2thZ2VDb25maWcsIG9sZFNldHRpbmdzOiBTZXR0aW5ncyB8IHVuZGVmaW5lZCk6IFNldHRpbmdzIHtcbiAgY29uc3Qgc2V0dGluZ3MgPSBvbGRTZXR0aW5nc1xuICAgID8gKG1lcmdlLmFsbChbZ2VuZXJhdGVkU2V0dGluZ3MsIG9sZFNldHRpbmdzLCBnZW5lcmF0ZWRTZXR0aW5nc10sIHtcbiAgICAgICAgYXJyYXlNZXJnZTogb3ZlcndyaXRlTWVyZ2UsXG4gICAgICB9KSBhcyBTZXR0aW5ncylcbiAgICA6IHN0cnVjdHVyZWRDbG9uZShnZW5lcmF0ZWRTZXR0aW5ncyk7XG4gIGNvbnN0IGV4aXN0aW5nRXh0ZW5kcyA9IG9sZFNldHRpbmdzPy5leHRlbmRzID8/IFtdO1xuICBzZXR0aW5ncy5leHRlbmRzID0gY29uZmlnLmlzV2lsbEJvb3N0ZXJDb25maWdzXG4gICAgPyBleGlzdGluZ0V4dGVuZHMuZmlsdGVyKChwcmVzZXQpID0+IHByZXNldCAhPT0gc2hhcmVkUHJlc2V0KVxuICAgIDogZXhpc3RpbmdFeHRlbmRzLmluY2x1ZGVzKHNoYXJlZFByZXNldClcbiAgICAgID8gZXhpc3RpbmdFeHRlbmRzXG4gICAgICA6IFtzaGFyZWRQcmVzZXQsIC4uLmV4aXN0aW5nRXh0ZW5kc107XG4gIHJldHVybiBzZXR0aW5ncztcbn1cblxuZnVuY3Rpb24gbm9ybWFsaXplKGNvbnRlbnQ6IHN0cmluZyk6IHN0cmluZyB7XG4gIGNvbnN0IHRyaW1tZWRDb250ZW50ID0gY29udGVudC50cmltKCk7XG4gIHJldHVybiB0cmltbWVkQ29udGVudCA/IHRyaW1tZWRDb250ZW50ICsgJ1xcbicgOiAnJztcbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCBtZXJnZSBmcm9tICdkZWVwbWVyZ2UnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlSnNvbiwgVHNDb25maWdKc29uIH0gZnJvbSAndHlwZS1mZXN0JztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZnNVdGlsIH0gZnJvbSAnLi4vdXRpbHMvZnNVdGlsLmpzJztcbmltcG9ydCB7IGpzb25jVXRpbCB9IGZyb20gJy4uL3V0aWxzL2pzb25jVXRpbC5qcyc7XG5pbXBvcnQgeyBjb21iaW5lTWVyZ2UgfSBmcm9tICcuLi91dGlscy9tZXJnZVV0aWwuanMnO1xuaW1wb3J0IHsgc29ydEtleXMgfSBmcm9tICcuLi91dGlscy9vYmplY3RVdGlsLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuaW1wb3J0IHsgZ2V0VHNjb25maWdFeHRlbmRzIH0gZnJvbSAnLi4vdXRpbHMvdHNjb25maWdCYXNlLmpzJztcbmltcG9ydCB7XG4gIGdldE1lYW5pbmdmdWxEZWNsYXJlZFdvcmtzcGFjZVBhdHRlcm5zLFxuICBnZXRXb3Jrc3BhY2VEaXJQYXR0ZXJucyxcbiAgZ2V0V29ya3NwYWNlU3ViRGlyUGF0aHMsXG59IGZyb20gJy4uL3V0aWxzL3dvcmtzcGFjZVV0aWwuanMnO1xuXG5jb25zdCBzdWJKc29uT2JqID0ge1xuICBjb21waWxlck9wdGlvbnM6IHtcbiAgICBhbHdheXNTdHJpY3Q6IHRydWUsXG4gICAgbm9VbmNoZWNrZWRJbmRleGVkQWNjZXNzOiB0cnVlLCAvLyBmb3IgQHR5cGVzY3JpcHQtZXNsaW50L3ByZWZlci1udWxsaXNoLWNvYWxlc2NpbmdcbiAgICBhbGxvd1N5bnRoZXRpY0RlZmF1bHRJbXBvcnRzOiB0cnVlLCAvLyBhbGxvdyBgaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0J2BcbiAgICBlc01vZHVsZUludGVyb3A6IHRydWUsIC8vIGFsbG93IGRlZmF1bHQgaW1wb3J0IGZyb20gQ29tbW9uSlMvQU1EL1VNRCBtb2R1bGVzXG4gICAgcmVzb2x2ZUpzb25Nb2R1bGU6IHRydWUsIC8vIGFsbG93IHRvIGltcG9ydCBKU09OIGZpbGVzXG4gICAgaW1wb3J0SGVscGVyczogZmFsc2UsXG4gICAgbm9FbWl0OiB0cnVlLFxuICB9LFxuICBleGNsdWRlOiBbJ3Rlc3QvZml4dHVyZXMnXSxcbiAgLy8gd2JmeSBnZW5lcmF0ZXMgcm9vdC1sZXZlbCB0b29sIGNvbmZpZ3Mgc3VjaCBhcyBwbGF5d3JpZ2h0LmNvbmZpZy50cywgYW5kXG4gIC8vIHR5cGUtYXdhcmUgbGludGluZyBuZWVkcyB0aG9zZSBmaWxlcyBpbiB0aGUgcHJvamVjdCB0byBzZWUgTm9kZS9CdW4gZ2xvYmFscy5cbiAgLy8gYGFwcC8qKmAgaXMgZGVsaWJlcmF0ZWx5IGFic2VudCBldmVuIHRob3VnaCB0aGUgZG9lc0NvbnRhaW4qU2NyaXB0IHNpZ25hbHMgc2NhbiBpdDogYXBwXG4gIC8vIGRpcmVjdG9yaWVzIGJlbG9uZyB0byBmcmFtZXdvcmsgcGFja2FnZXMgKE5leHQuanMvQmxpdHopLCB3aGljaCBvd24gdGhlaXIgdHNjb25maWdcbiAgLy8gKGdlbmVyYXRlVHNjb25maWcgc2tpcHMgdGhlbSksIGFuZCBjaGVja2luZyBmcmFtZXdvcmsgc291cmNlcyB1bmRlciB0aGlzIHByb2plY3QncyBjb21waWxlclxuICAvLyBvcHRpb25zIHdvdWxkIHByb2R1Y2UgZmFsc2UgZXJyb3JzLlxuICBpbmNsdWRlOiBbJyouY29uZmlnLnRzJywgJ3NjcmlwdHMvKiovKicsICdzcmMvKiovKicsICd0ZXN0LyoqLyonXSxcbn07XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZW5lcmF0ZVRzY29uZmlnKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2dlbmVyYXRlVHNjb25maWcnLCBhc3luYyAoKSA9PiB7XG4gICAgLy8gdmluZXh0IGlzIHRoZSBvcmcncyBOZXh0LmpzLWVxdWl2YWxlbnQgZnJhbWV3b3JrIGFuZCBvd25zIGl0cyB0c2NvbmZpZyBqdXN0IGxpa2UgTmV4dC9CbGl0eixcbiAgICAvLyBzbyBpdCBtdXN0IHNraXAgdGhlIHN0YW5kYXJkIGdlbmVyYXRpb24gdGhhdCB3b3VsZCBvdmVyd3JpdGUgdGhlIGZyYW1ld29yaydzIG93biBzZXR0aW5ncy5cbiAgICBpZiAoY29uZmlnLmRlcGVuZGluZy5ibGl0eiB8fCBjb25maWcuZGVwZW5kaW5nLm5leHQgfHwgY29uZmlnLmRlcGVuZGluZy52aW5leHQpIHtcbiAgICAgIGF3YWl0IG5vcm1hbGl6ZUZyYW1ld29ya1RzY29uZmlnKGNvbmZpZyk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgbGV0IG5ld1NldHRpbmdzID0gKGNvbmZpZy5pc1Jvb3QgPyBidWlsZFJvb3RKc29uT2JqKGNvbmZpZykgOiBzdHJ1Y3R1cmVkQ2xvbmUoc3ViSnNvbk9iaikpIGFzIFRzQ29uZmlnSnNvbjtcbiAgICBjb25zdCBnZW5lcmF0ZWRUeXBlcyA9IGdldEdlbmVyYXRlZFR5cGVzKGNvbmZpZyk7XG4gICAgbmV3U2V0dGluZ3MuZXh0ZW5kcyA9IGdldFRzY29uZmlnRXh0ZW5kcyhjb25maWcpO1xuICAgIG5ld1NldHRpbmdzLmNvbXBpbGVyT3B0aW9ucyA/Pz0ge307XG4gICAgbmV3U2V0dGluZ3MuY29tcGlsZXJPcHRpb25zLnJvb3REaXIgPSBnZXRSb290RGlyKGNvbmZpZyk7XG4gICAgaWYgKGdlbmVyYXRlZFR5cGVzLmxlbmd0aCA+IDApIHtcbiAgICAgIG5ld1NldHRpbmdzLmNvbXBpbGVyT3B0aW9ucyA9IHsgLi4ubmV3U2V0dGluZ3MuY29tcGlsZXJPcHRpb25zLCB0eXBlczogZ2VuZXJhdGVkVHlwZXMgfTtcbiAgICB9XG4gICAgaWYgKCFjb25maWcuZG9lc0NvbnRhaW5Kc3hPclRzeCAmJiAhY29uZmlnLmRvZXNDb250YWluSnN4T3JUc3hJblBhY2thZ2VzKSB7XG4gICAgICBkZWxldGUgbmV3U2V0dGluZ3MuY29tcGlsZXJPcHRpb25zPy5qc3g7XG4gICAgfVxuICAgIGlmIChjb25maWcuZGVwZW5kaW5nLnByaXNtYSkge1xuICAgICAgLy8gUHJpc21hIHNlZWRzIGFuZCBtaWdyYXRpb24gaGVscGVyIHNjcmlwdHMgb2Z0ZW4gbGl2ZSBvdXRzaWRlIHNyYywgYnV0XG4gICAgICAvLyB0eXBlLWF3YXJlIGxpbnRpbmcgc3RpbGwgbmVlZHMgdGhlbSBjb3ZlcmVkIGJ5IHRoZSBwcm9qZWN0IGNvbmZpZy5cbiAgICAgIGFkZEluY2x1ZGVQYXRoKG5ld1NldHRpbmdzLCAncHJpc21hLyoqLyonKTtcbiAgICB9XG5cbiAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJ3RzY29uZmlnLmpzb24nKTtcbiAgICBjb25zdCBleGlzdGluZ0NvbnRlbnQgPSBhd2FpdCBmc1V0aWwucmVhZEZpbGVJZkV4aXN0cyhmaWxlUGF0aCk7XG4gICAgbGV0IG9yaWdpbmFsU2V0dGluZ3NKc29uOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gICAgLy8gQSBmaWxlIHdpdGggbm8gY29uZmlndXJhdGlvbiAoZW1wdHkgb3IgY29tbWVudC1vbmx5KSBpcyB0cmVhdGVkIGxpa2UgYSBtaXNzaW5nIG9uZSwgYXMgdHNjIGRvZXMuXG4gICAgaWYgKGV4aXN0aW5nQ29udGVudCAhPT0gdW5kZWZpbmVkICYmICFqc29uY1V0aWwuaXNUcml2aWFPbmx5KGV4aXN0aW5nQ29udGVudCkpIHtcbiAgICAgIGNvbnN0IG9sZFNldHRpbmdzID0ganNvbmNVdGlsLnBhcnNlT2JqZWN0SWdub3JpbmdFcnJvcjxUc0NvbmZpZ0pzb24+KGV4aXN0aW5nQ29udGVudCk7XG4gICAgICAvLyBBbiBleGlzdGluZyB0c2NvbmZpZy5qc29uIHdiZnkgY2Fubm90IHBhcnNlIG11c3QgYmUgbGVmdCB1bnRvdWNoZWQ6IHdyaXRpbmcgdGhlXG4gICAgICAvLyBnZW5lcmF0ZWQgc2V0dGluZ3Mgd2l0aG91dCBtZXJnaW5nIHdvdWxkIHNpbGVudGx5IGRpc2NhcmQgdGhlIHByb2plY3QncyBjb25maWd1cmF0aW9uLlxuICAgICAgaWYgKCFvbGRTZXR0aW5ncykge1xuICAgICAgICBjb25zb2xlLndhcm4oYFNraXBwZWQgZ2VuZXJhdGluZyAke2ZpbGVQYXRofSBiZWNhdXNlIHRoZSBleGlzdGluZyBjb250ZW50IGlzIG5vdCBwYXJzYWJsZSBhcyBKU09OQy5gKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgb3JpZ2luYWxTZXR0aW5nc0pzb24gPSBKU09OLnN0cmluZ2lmeShzb3J0S2V5cyhzdHJ1Y3R1cmVkQ2xvbmUob2xkU2V0dGluZ3MpKSk7XG4gICAgICBjb25zdCBleGlzdGluZ1R5cGVzID0gbm9ybWFsaXplU3RyaW5nQXJyYXkob2xkU2V0dGluZ3MuY29tcGlsZXJPcHRpb25zPy50eXBlcyk7XG4gICAgICBjb25zdCBleGlzdGluZ0VtaXRNZXRhZGF0YSA9IHBpY2tFeGlzdGluZ0VtaXRNZXRhZGF0YShvbGRTZXR0aW5ncy5jb21waWxlck9wdGlvbnMpO1xuICAgICAgbmV3U2V0dGluZ3MuZXh0ZW5kcyA9IG1lcmdlVHNjb25maWdFeHRlbmRzKG5ld1NldHRpbmdzLmV4dGVuZHMsIG9sZFNldHRpbmdzLmV4dGVuZHMpO1xuICAgICAgZGVsZXRlIG9sZFNldHRpbmdzLmV4dGVuZHM7XG4gICAgICBkZWxldGUgb2xkU2V0dGluZ3MuY29tcGlsZXJPcHRpb25zPy5qc3g7XG4gICAgICBpZiAoY29uZmlnLmlzUm9vdCkge1xuICAgICAgICByZW1vdmVTdGFsZU1hbmFnZWRXb3Jrc3BhY2VFbnRyaWVzKGNvbmZpZywgb2xkU2V0dGluZ3MsIG5ld1NldHRpbmdzKTtcbiAgICAgIH1cbiAgICAgIG5ld1NldHRpbmdzID0gbWVyZ2UuYWxsKFtuZXdTZXR0aW5ncywgb2xkU2V0dGluZ3MsIG5ld1NldHRpbmdzXSwgeyBhcnJheU1lcmdlOiBjb21iaW5lTWVyZ2UgfSk7XG4gICAgICBuZXdTZXR0aW5ncy5pbmNsdWRlID0gbmV3U2V0dGluZ3MuaW5jbHVkZT8uZmlsdGVyKFxuICAgICAgICAoZGlyUGF0aDogc3RyaW5nKSA9PlxuICAgICAgICAgICFkaXJQYXRoLmluY2x1ZGVzKCdAdHlwZXMnKSAmJiAhZGlyUGF0aC5pbmNsdWRlcygnX190ZXN0c19fLycpICYmICFkaXJQYXRoLmluY2x1ZGVzKCd0ZXN0cy8nKVxuICAgICAgKTtcbiAgICAgIG5ld1NldHRpbmdzLmNvbXBpbGVyT3B0aW9ucyA/Pz0ge307XG4gICAgICAvLyB3YmZ5LWdlbmVyYXRlZCB0c2NvbmZpZy5qc29uIGlzIGEgbGludC90eXBlY2hlY2sgcHJvamVjdCwgbm90IHRoZSBlbWl0XG4gICAgICAvLyBjb250cmFjdC4gSXQgbXVzdCBrZWVwIHJvb3REaXIgYnJvYWQgZW5vdWdoIGZvciByb290IGNvbmZpZyBmaWxlcyxcbiAgICAgIC8vIHNjcmlwdHMsIHNyYywgYW5kIHRlc3RzLiBidWlsZC10cyBvd25zIGVtaXQgYW5kIGNyZWF0ZXMgYSB0ZW1wb3JhcnlcbiAgICAgIC8vIHNyYy1vbmx5IHRzY29uZmlnIHdpdGggbm9FbWl0PWZhbHNlLCBlbWl0RGVjbGFyYXRpb25Pbmx5PXRydWUsXG4gICAgICAvLyByb290RGlyPVwic3JjXCIsIGFuZCBpbmNsdWRlPVtcInNyYy8qKi8qXCJdLCBzbyBwcmVzZXJ2aW5nIG5vRW1pdD1mYWxzZSBvclxuICAgICAgLy8gcm9vdERpcj1cInNyY1wiIGhlcmUgd291bGQgb25seSBicmVhayBub24tc3JjIHR5cGUtYXdhcmUgbGludCBjb3ZlcmFnZS5cbiAgICAgIG5ld1NldHRpbmdzLmNvbXBpbGVyT3B0aW9ucyA9IHsgLi4ubmV3U2V0dGluZ3MuY29tcGlsZXJPcHRpb25zLCAuLi5leGlzdGluZ0VtaXRNZXRhZGF0YSB9O1xuXG4gICAgICBjb25zdCBtZXJnZWRUeXBlcyA9IFsuLi5uZXcgU2V0KFsuLi5maWx0ZXJFeGlzdGluZ1R5cGVzKGV4aXN0aW5nVHlwZXMsIGdlbmVyYXRlZFR5cGVzKSwgLi4uZ2VuZXJhdGVkVHlwZXNdKV07XG4gICAgICBpZiAobWVyZ2VkVHlwZXMubGVuZ3RoID4gMCkge1xuICAgICAgICBuZXdTZXR0aW5ncy5jb21waWxlck9wdGlvbnMudHlwZXMgPSBtZXJnZWRUeXBlcztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGRlbGV0ZSBuZXdTZXR0aW5ncy5jb21waWxlck9wdGlvbnMudHlwZXM7XG4gICAgICB9XG4gICAgICBpZiAoc2hvdWxkRGVsZXRlVHlwZVJvb3RzKGdlbmVyYXRlZFR5cGVzKSkge1xuICAgICAgICBkZWxldGUgbmV3U2V0dGluZ3MuY29tcGlsZXJPcHRpb25zLnR5cGVSb290cztcbiAgICAgIH1cbiAgICB9XG4gICAgYWRkVW5kaWNpVHlwZXNQYXRoTWFwcGluZyhuZXdTZXR0aW5ncywgY29uZmlnKTtcbiAgICBzb3J0S2V5cyhuZXdTZXR0aW5ncyk7XG4gICAgbmV3U2V0dGluZ3MuaW5jbHVkZT8uc29ydCgpO1xuICAgIC8vIERvbid0IHVzZSBvbGQgZGVjb3JhdG9yXG4gICAgZGVsZXRlIG5ld1NldHRpbmdzLmNvbXBpbGVyT3B0aW9ucz8uZXhwZXJpbWVudGFsRGVjb3JhdG9ycztcbiAgICAvLyBQYWNrYWdlIGltcG9ydHMgc2hvdWxkIHJlc29sdmUgdGhyb3VnaCBwYWNrYWdlIGV4cG9ydHMgaW5zdGVhZCBvZiBiYXNlVXJsLlxuICAgIC8vIHBhdGhzIGlzIGludGVudGlvbmFsbHkgcHJlc2VydmVkIHNvIHJlcG8tbG9jYWwgdG9vbGluZyBjYW4ga2VlcCBleHBsaWNpdFxuICAgIC8vIGFsaWFzZXMgd2l0aG91dCByZWx5aW5nIG9uIGJhc2VVcmwncyBicm9hZCBmYWxsYmFjayByZXNvbHV0aW9uLlxuICAgIGRlbGV0ZSBuZXdTZXR0aW5ncy5jb21waWxlck9wdGlvbnM/LmJhc2VVcmw7XG4gICAgaWYgKGNvbmZpZy5kZXBlbmRpbmcucmVhY3ROYXRpdmUpIHtcbiAgICAgIGRlbGV0ZSBuZXdTZXR0aW5ncy5jb21waWxlck9wdGlvbnM/LnZlcmJhdGltTW9kdWxlU3ludGF4O1xuICAgIH1cbiAgICAvLyBTa2lwIHRoZSB3cml0ZSB3aGVuIG5vdGhpbmcgY2hhbmdlcyBzZW1hbnRpY2FsbHksIHNvIEpTT05DIGNvbW1lbnRzIGFuZCBmb3JtYXR0aW5nIGluIGFuXG4gICAgLy8gYWxyZWFkeS11cC10by1kYXRlIHRzY29uZmlnLmpzb24gc3Vydml2ZSB3YmZ5IHJ1bnMuXG4gICAgaWYgKG9yaWdpbmFsU2V0dGluZ3NKc29uID09PSBKU09OLnN0cmluZ2lmeShuZXdTZXR0aW5ncykpIHJldHVybjtcbiAgICBjb25zdCBuZXdDb250ZW50ID0gSlNPTi5zdHJpbmdpZnkobmV3U2V0dGluZ3MsIHVuZGVmaW5lZCwgMik7XG4gICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzVXRpbC5nZW5lcmF0ZUZpbGUoZmlsZVBhdGgsIG5ld0NvbnRlbnQpKTtcbiAgfSk7XG59XG5cbi8qKlxuICogVGhlIG1vbm9yZXBvLXJvb3QgdHNjb25maWcsIHdob3NlIGluY2x1ZGUvZXhjbHVkZSBjb3ZlciBldmVyeSBERUNMQVJFRCB3b3Jrc3BhY2UgbGF5b3V0IChlLmcuXG4gKiBgYXBwcy8qYCBhbG9uZ3NpZGUgYHBhY2thZ2VzLypgKSBzbyB0eXBlLWF3YXJlIGxpbnRpbmcgcnVuIGZyb20gdGhlIHJvb3Qgc2VlcyBhbGwgd29ya3NwYWNlXG4gKiBzb3VyY2VzLCBub3QganVzdCB0aGUgY29udmVudGlvbmFsIHBhY2thZ2VzLyogZGlyZWN0b3J5LlxuICovXG5mdW5jdGlvbiBidWlsZFJvb3RKc29uT2JqKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFRzQ29uZmlnSnNvbiB7XG4gIGNvbnN0IHdvcmtzcGFjZVBhdHRlcm5zID0gY29uZmlnLmRvZXNDb250YWluU3ViUGFja2FnZUpzb25zXG4gICAgPyBnZXRXb3Jrc3BhY2VEaXJQYXR0ZXJucyhjb25maWcpXG4gICAgOiB7IGV4Y2x1ZGVzOiBbXSwgaW5jbHVkZXM6IFtdIH07XG4gIGNvbnN0IHNldHRpbmdzID0gc3RydWN0dXJlZENsb25lKHN1Ykpzb25PYmopIGFzIFRzQ29uZmlnSnNvbjtcbiAgc2V0dGluZ3MuZXhjbHVkZSA9IFtcbiAgICAuLi5uZXcgU2V0KFtcbiAgICAgIC4uLndvcmtzcGFjZVBhdHRlcm5zLmluY2x1ZGVzLm1hcCgod29ya3NwYWNlUGF0dGVybikgPT4gYCR7d29ya3NwYWNlUGF0dGVybn0vdGVzdC9maXh0dXJlc2ApLFxuICAgICAgLy8gTmVnYXRpdmUgd29ya3NwYWNlIHBhdHRlcm5zIChlLmcuIGAhcGFja2FnZXMvZXhjbHVkZWRgKSBvcHQgd29ya3NwYWNlIHN1YnRyZWVzIG91dCBvZiB0aGVcbiAgICAgIC8vIG1vbm9yZXBvLCBzbyB0aGVpciBzb3VyY2VzIG11c3Qgbm90IGVudGVyIHRoZSByb290IHR5cGUtY2hlY2sgcHJvamVjdCBlaXRoZXIuIEEgbmVnYXRpb25cbiAgICAgIC8vIHdob3NlIGRpcmVjdG9yeSBpcyBhbiBhbmNlc3RvciBvZiBhIHdvcmtzcGFjZSB5aWVsZHMgcGFja2FnZS1vd25lZCBzdWJwYXRoIGVudHJpZXNcbiAgICAgIC8vIGluc3RlYWQgb2YgdGhlIHdob2xlIHN1YnRyZWUgKHNlZSBnZXRXb3Jrc3BhY2VEaXJQYXR0ZXJucykuXG4gICAgICAuLi53b3Jrc3BhY2VQYXR0ZXJucy5leGNsdWRlcyxcbiAgICAgIC8vIFRoZSBtYW5hZ2VkIGluY2x1ZGVzIGFib3ZlIGRlbGliZXJhdGVseSBvbWl0IGZyYW1ld29yayBgYXBwLyoqYCBkaXJlY3RvcmllcyAoc2VlXG4gICAgICAvLyBzdWJKc29uT2JqLmluY2x1ZGUncyBjb21tZW50KSwgYnV0IGEgcmVwby1hdXRob3JlZCBicm9hZCBpbmNsdWRlIHN1Y2ggYXMgYGUyZS8qKlxcLypgXG4gICAgICAvLyBjYW4gc3RpbGwgZHJhZyBhIGZyYW1ld29yayB3b3Jrc3BhY2UncyBhcHAgc291cmNlcyBpbnRvIHRoZSByb290IHByb2plY3QsIHdoZXJlIHRoZXlcbiAgICAgIC8vIGZhaWwgdW5kZXIgdGhlIHJvb3QgY29tcGlsZXIgb3B0aW9ucyDigJQgdGhlaXIgYmFyZSBgbmV4dC8qYCBpbXBvcnRzIHJlc29sdmUgb25seSB0aHJvdWdoXG4gICAgICAvLyB0aGUgZnJhbWV3b3JrIHdvcmtzcGFjZSdzIG93biB0c2NvbmZpZyBgcGF0aHNgLiBFeGNsdWRlIHRob3NlIGFwcCBkaXJlY3RvcmllcyBzbyB0aGVcbiAgICAgIC8vIHJvb3QgcHJvamVjdCBuZXZlciB0eXBlLWNoZWNrcyB0aGVtLCBubyBtYXR0ZXIgaG93IGJyb2FkIHRoZSByZXBvJ3MgaW5jbHVkZSBnbG9icyBhcmUuXG4gICAgICAuLi5nZXRGcmFtZXdvcmtXb3Jrc3BhY2VBcHBFeGNsdWRlcyhjb25maWcpLFxuICAgICAgLi4uKHNldHRpbmdzLmV4Y2x1ZGUgPz8gW10pLFxuICAgIF0pLFxuICBdLnRvU29ydGVkKCk7XG4gIHNldHRpbmdzLmluY2x1ZGUgPSBbXG4gICAgLi4uKHNldHRpbmdzLmluY2x1ZGUgPz8gW10pLFxuICAgIC4uLndvcmtzcGFjZVBhdHRlcm5zLmluY2x1ZGVzLmZsYXRNYXAoKHdvcmtzcGFjZVBhdHRlcm4pID0+IFtcbiAgICAgIGAke3dvcmtzcGFjZVBhdHRlcm59LyouY29uZmlnLnRzYCxcbiAgICAgIGAke3dvcmtzcGFjZVBhdHRlcm59L3NjcmlwdHMvKiovKmAsXG4gICAgICBgJHt3b3Jrc3BhY2VQYXR0ZXJufS9zcmMvKiovKmAsXG4gICAgICBgJHt3b3Jrc3BhY2VQYXR0ZXJufS90ZXN0LyoqLypgLFxuICAgIF0pLFxuICBdO1xuICByZXR1cm4gc2V0dGluZ3M7XG59XG5cbi8vIEZyYW1ld29yayBwYWNrYWdlcyBvd24gdGhlaXIgdHNjb25maWcgKGdlbmVyYXRlVHNjb25maWcgc2tpcHMgdGhlbSkgYW5kIHNoaW0gYmFyZSBpbXBvcnRzIHN1Y2ggYXNcbi8vIGBuZXh0L25hdmlnYXRpb25gIHRocm91Z2ggcGFja2FnZS1sb2NhbCBgcGF0aHNgOyB2aW5leHQgaXMgdGhlIG9yZydzIE5leHQuanMtZXF1aXZhbGVudCBmcmFtZXdvcmtcbi8vIGFuZCBiZWhhdmVzIHRoZSBzYW1lLiBUaGVpciBhcHAgc291cmNlcyB0aGVyZWZvcmUgb25seSB0eXBlLWNoZWNrIHVuZGVyIHRoZWlyIG93biBjb25maWcuXG5jb25zdCBmcmFtZXdvcmtEZXBlbmRlbmN5TmFtZXMgPSBbJ2JsaXR6JywgJ25leHQnLCAndmluZXh0J107XG5cbi8vIEEgZnJhbWV3b3JrIGFwcCBsaXZlcyBpbiBgYXBwL2Agb3IsIHVuZGVyIHRoZSBzcmMtZGlyZWN0b3J5IGxheW91dCwgYHNyYy9hcHAvYC4gVGhlIHJvb3QgcHJvamVjdFxuLy8gaW5jbHVkZXMgYDx3b3Jrc3BhY2U+L3NyYy8qKi8qYCwgc28gYHNyYy9hcHBgIGxlYWtzIGluIGp1c3QgYXMgYSByZXBvLXdpZGUgZ2xvYiBjYW4gcHVsbCBpbiBgYXBwYC5cbmNvbnN0IGZyYW1ld29ya0FwcERpck5hbWVzID0gWydhcHAnLCAnc3JjL2FwcCddO1xuXG4vKiogUm9vdCBgZXhjbHVkZWAgZW50cmllcyAocG9zaXgsIHJlbGF0aXZlIHRvIHRoZSByb290KSBmb3IgZXZlcnkgZnJhbWV3b3JrIHdvcmtzcGFjZSdzIGFwcCBkaXJlY3RvcnkuICovXG5mdW5jdGlvbiBnZXRGcmFtZXdvcmtXb3Jrc3BhY2VBcHBFeGNsdWRlcyhjb25maWc6IFBhY2thZ2VDb25maWcpOiBzdHJpbmdbXSB7XG4gIGlmICghY29uZmlnLmRvZXNDb250YWluU3ViUGFja2FnZUpzb25zKSByZXR1cm4gW107XG4gIGNvbnN0IGV4Y2x1ZGVzOiBzdHJpbmdbXSA9IFtdO1xuICBmb3IgKGNvbnN0IHdvcmtzcGFjZURpclBhdGggb2YgZ2V0V29ya3NwYWNlU3ViRGlyUGF0aHMoY29uZmlnKSkge1xuICAgIGlmICghZGVwZW5kc09uRnJhbWV3b3JrKHBhdGgucmVzb2x2ZSh3b3Jrc3BhY2VEaXJQYXRoLCAncGFja2FnZS5qc29uJykpKSBjb250aW51ZTtcbiAgICBmb3IgKGNvbnN0IGFwcERpck5hbWUgb2YgZnJhbWV3b3JrQXBwRGlyTmFtZXMpIHtcbiAgICAgIGNvbnN0IGFwcERpclBhdGggPSBwYXRoLnJlc29sdmUod29ya3NwYWNlRGlyUGF0aCwgYXBwRGlyTmFtZSk7XG4gICAgICBpZiAoZnMuZXhpc3RzU3luYyhhcHBEaXJQYXRoKSkgZXhjbHVkZXMucHVzaChwYXRoLnJlbGF0aXZlKGNvbmZpZy5kaXJQYXRoLCBhcHBEaXJQYXRoKS5yZXBsYWNlQWxsKCdcXFxcJywgJy8nKSk7XG4gICAgfVxuICB9XG4gIHJldHVybiBleGNsdWRlcztcbn1cblxuZnVuY3Rpb24gZGVwZW5kc09uRnJhbWV3b3JrKG1hbmlmZXN0UGF0aDogc3RyaW5nKTogYm9vbGVhbiB7XG4gIGxldCBtYW5pZmVzdDogUGFja2FnZUpzb24gfCBudWxsO1xuICB0cnkge1xuICAgIG1hbmlmZXN0ID0gSlNPTi5wYXJzZShmcy5yZWFkRmlsZVN5bmMobWFuaWZlc3RQYXRoLCAndXRmOCcpKSBhcyBQYWNrYWdlSnNvbiB8IG51bGw7XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICAvLyBBIG1hbmlmZXN0IHRoYXQgcGFyc2VzIHRvIGEgbm9uLW9iamVjdCAoZS5nLiBhIGZpbGUgbGl0ZXJhbGx5IGNvbnRhaW5pbmcgYG51bGxgKSBkZWNsYXJlcyBub1xuICAvLyBkZXBlbmRlbmNpZXM7IGd1YXJkIHRoZSBwcm9wZXJ0eSBhY2Nlc3MsIHdoaWNoIHdvdWxkIG90aGVyd2lzZSB0aHJvdyBvdXRzaWRlIHRoZSB0cnkgYWJvdmUuXG4gIGlmICghbWFuaWZlc3QgfHwgdHlwZW9mIG1hbmlmZXN0ICE9PSAnb2JqZWN0JykgcmV0dXJuIGZhbHNlO1xuICBjb25zdCBkZXBlbmRlbmNpZXMgPSB7IC4uLm1hbmlmZXN0LmRlcGVuZGVuY2llcywgLi4ubWFuaWZlc3QuZGV2RGVwZW5kZW5jaWVzIH07XG4gIHJldHVybiBmcmFtZXdvcmtEZXBlbmRlbmN5TmFtZXMuc29tZSgoZGVwZW5kZW5jeU5hbWUpID0+IGRlcGVuZGVuY2llc1tkZXBlbmRlbmN5TmFtZV0pO1xufVxuXG5jb25zdCBtYW5hZ2VkV29ya3NwYWNlSW5jbHVkZVN1ZmZpeGVzID0gWycqLmNvbmZpZy50cycsICdzY3JpcHRzLyoqLyonLCAnc3JjLyoqLyonLCAndGVzdC8qKi8qJ107XG5cbi8qKlxuICogUm9vdCBpbmNsdWRlL2V4Y2x1ZGUgZW50cmllcyB3YmZ5IGdlbmVyYXRlZCBmb3IgYW4gZWFybGllciB3b3Jrc3BhY2UgbGF5b3V0IChlLmcuIGBwYWNrYWdlcy8qYFxuICogZ2xvYnMgaW4gYSByZXBvIHRoYXQgbm93IGRlY2xhcmVzIG9ubHkgYGFwcHMvKmApIG11c3Qgbm90IHN1cnZpdmUgdGhlIG1lcmdlIHdpdGggdGhlIGV4aXN0aW5nXG4gKiB0c2NvbmZpZywgb3IgdGhlIG9ic29sZXRlIGRpcmVjdG9yaWVzIHdvdWxkIGtlZXAgZW50ZXJpbmcgcm9vdCB0eXBlIGNoZWNraW5nIGZvcmV2ZXIuIEEgcHJlZml4XG4gKiBjb3VudHMgYXMgd2JmeS1tYW5hZ2VkIG9ubHkgd2hlbiB0aGUgQ09NUExFVEUgZ2VuZXJhdGVkIGluY2x1ZGUgc2V0IGZvciBpdCBpcyBwcmVzZW50IGFuZCBub1xuICogbG9uZ2VyIGdlbmVyYXRlZCDigJQgYSB1c2VyLWF1dGhvcmVkIGVudHJ5IHN1Y2ggYXMgYSBsb25lIGB0b29scy8qXFwvc3JjLyoqXFwvKmAgbmV2ZXIgcXVhbGlmaWVzLlxuICovXG5mdW5jdGlvbiByZW1vdmVTdGFsZU1hbmFnZWRXb3Jrc3BhY2VFbnRyaWVzKFxuICBjb25maWc6IFBhY2thZ2VDb25maWcsXG4gIG9sZFNldHRpbmdzOiBUc0NvbmZpZ0pzb24sXG4gIG5ld1NldHRpbmdzOiBUc0NvbmZpZ0pzb25cbik6IHZvaWQge1xuICBjb25zdCBzdGFsZVByZWZpeGVzID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gIGlmIChBcnJheS5pc0FycmF5KG9sZFNldHRpbmdzLmluY2x1ZGUpKSB7XG4gICAgY29uc3Qgb2xkSW5jbHVkZSA9IG9sZFNldHRpbmdzLmluY2x1ZGUuZmlsdGVyKChlbnRyeSk6IGVudHJ5IGlzIHN0cmluZyA9PiB0eXBlb2YgZW50cnkgPT09ICdzdHJpbmcnKTtcbiAgICBjb25zdCBnZW5lcmF0ZWRJbmNsdWRlID0gbmV3IFNldChuZXdTZXR0aW5ncy5pbmNsdWRlKTtcbiAgICBmb3IgKGNvbnN0IGVudHJ5IG9mIG9sZEluY2x1ZGUpIHtcbiAgICAgIGNvbnN0IHdvcmtzcGFjZVByZWZpeCA9IGdldE1hbmFnZWRXb3Jrc3BhY2VQcmVmaXgoZW50cnkpO1xuICAgICAgaWYgKHdvcmtzcGFjZVByZWZpeCA9PT0gdW5kZWZpbmVkIHx8IHN0YWxlUHJlZml4ZXMuaGFzKHdvcmtzcGFjZVByZWZpeCkpIGNvbnRpbnVlO1xuICAgICAgY29uc3QgaXNDb21wbGV0ZSA9IG1hbmFnZWRXb3Jrc3BhY2VJbmNsdWRlU3VmZml4ZXMuZXZlcnkoKHN1ZmZpeCkgPT5cbiAgICAgICAgb2xkSW5jbHVkZS5pbmNsdWRlcyhgJHt3b3Jrc3BhY2VQcmVmaXh9LyR7c3VmZml4fWApXG4gICAgICApO1xuICAgICAgY29uc3QgaXNTdGlsbEdlbmVyYXRlZCA9IG1hbmFnZWRXb3Jrc3BhY2VJbmNsdWRlU3VmZml4ZXMuc29tZSgoc3VmZml4KSA9PlxuICAgICAgICBnZW5lcmF0ZWRJbmNsdWRlLmhhcyhgJHt3b3Jrc3BhY2VQcmVmaXh9LyR7c3VmZml4fWApXG4gICAgICApO1xuICAgICAgaWYgKGlzQ29tcGxldGUgJiYgIWlzU3RpbGxHZW5lcmF0ZWQpIHN0YWxlUHJlZml4ZXMuYWRkKHdvcmtzcGFjZVByZWZpeCk7XG4gICAgfVxuICAgIGlmIChzdGFsZVByZWZpeGVzLnNpemUgPiAwKSB7XG4gICAgICBvbGRTZXR0aW5ncy5pbmNsdWRlID0gb2xkU2V0dGluZ3MuaW5jbHVkZS5maWx0ZXIoKGVudHJ5KSA9PiB7XG4gICAgICAgIGNvbnN0IHdvcmtzcGFjZVByZWZpeCA9IHR5cGVvZiBlbnRyeSA9PT0gJ3N0cmluZycgPyBnZXRNYW5hZ2VkV29ya3NwYWNlUHJlZml4KGVudHJ5KSA6IHVuZGVmaW5lZDtcbiAgICAgICAgcmV0dXJuIHdvcmtzcGFjZVByZWZpeCA9PT0gdW5kZWZpbmVkIHx8ICFzdGFsZVByZWZpeGVzLmhhcyh3b3Jrc3BhY2VQcmVmaXgpO1xuICAgICAgfSk7XG4gICAgfVxuICB9XG4gIGlmICghQXJyYXkuaXNBcnJheShvbGRTZXR0aW5ncy5leGNsdWRlKSkgcmV0dXJuO1xuICBjb25zdCBnZW5lcmF0ZWRFeGNsdWRlID0gbmV3IFNldChuZXdTZXR0aW5ncy5leGNsdWRlKTtcbiAgY29uc3Qgd29ya3NwYWNlRGlyUGF0aHMgPSBjb25maWcuZG9lc0NvbnRhaW5TdWJQYWNrYWdlSnNvbnNcbiAgICA/IGdldFdvcmtzcGFjZVN1YkRpclBhdGhzKGNvbmZpZykubWFwKCh3b3Jrc3BhY2VEaXJQYXRoKSA9PlxuICAgICAgICBwYXRoLnJlbGF0aXZlKHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCksIHdvcmtzcGFjZURpclBhdGgpLnJlcGxhY2VBbGwoJ1xcXFwnLCAnLycpXG4gICAgICApXG4gICAgOiBbXTtcbiAgb2xkU2V0dGluZ3MuZXhjbHVkZSA9IG9sZFNldHRpbmdzLmV4Y2x1ZGUuZmlsdGVyKChlbnRyeSkgPT4ge1xuICAgIGlmICh0eXBlb2YgZW50cnkgIT09ICdzdHJpbmcnIHx8IGdlbmVyYXRlZEV4Y2x1ZGUuaGFzKGVudHJ5KSkgcmV0dXJuIHRydWU7XG4gICAgaWYgKGVudHJ5LmVuZHNXaXRoKCcvdGVzdC9maXh0dXJlcycpKSB7XG4gICAgICByZXR1cm4gIXN0YWxlUHJlZml4ZXMuaGFzKGVudHJ5LnNsaWNlKDAsIC0nL3Rlc3QvZml4dHVyZXMnLmxlbmd0aCkpO1xuICAgIH1cbiAgICAvLyBBIGZyYW1ld29yayBhcHAgZXhjbHVkZSAoYDx3b3Jrc3BhY2U+L2FwcGAsIGA8d29ya3NwYWNlPi9zcmMvYXBwYCkgZm9yIGEgc3RpbGwtZGVjbGFyZWRcbiAgICAvLyB3b3Jrc3BhY2UgaXMgcHJ1bmVkIGJ5IGNvdmVyc1dvcmtzcGFjZURpciBiZWxvdyB3aGVuIG5vIGxvbmdlciBnZW5lcmF0ZWQ7IHRoaXMgY2F0Y2hlcyB0aGVcbiAgICAvLyByZW1haW5pbmcgY2FzZSwgd2hlcmUgdGhlIHdvcmtzcGFjZSBpdHNlbGYgd2FzIHJlbW92ZWQgYW5kIGl0cyBwcmVmaXggaXMgdGhlcmVmb3JlIHN0YWxlLlxuICAgIC8vIChBIHdyb25nIHN1ZmZpeCBzdHJpcCB5aWVsZHMgYSBwcmVmaXggYWJzZW50IGZyb20gc3RhbGVQcmVmaXhlcywgc28gdGVzdGluZyBldmVyeSBuYW1lIGlzIHNhZmUuKVxuICAgIGlmIChcbiAgICAgIGZyYW1ld29ya0FwcERpck5hbWVzLnNvbWUoXG4gICAgICAgIChhcHBEaXJOYW1lKSA9PiBlbnRyeS5lbmRzV2l0aChgLyR7YXBwRGlyTmFtZX1gKSAmJiBzdGFsZVByZWZpeGVzLmhhcyhlbnRyeS5zbGljZSgwLCAtKGFwcERpck5hbWUubGVuZ3RoICsgMSkpKVxuICAgICAgKVxuICAgICkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICByZXR1cm4gIWNvdmVyc1dvcmtzcGFjZURpcihlbnRyeSwgd29ya3NwYWNlRGlyUGF0aHMpO1xuICB9KTtcbn1cblxuLy8gV2hldGhlciBhbiBleGNsdWRlIGVudHJ5IGlzIGEgd29ya3NwYWNlIG5lZ2F0aW9uIChgIWFwcHMvZXhjbHVkZWRgKSB3aG9zZSBuZWdhdGlvbiBpcyBnb25lOiB0aGVcbi8vIGRpcmVjdG9yeSBpcyBhIHdvcmtzcGFjZSBhZ2FpbiBhbmQgbXVzdCByZS1lbnRlciB0aGUgcm9vdCBwcm9qZWN0LiB3YmZ5IHdyaXRlcyBzdWNoIGEgbmVnYXRpb24gYXNcbi8vIGEgZGlyZWN0b3J5IHBhdGgsIGFzIGEgZGlyZWN0b3J5IFBBVFRFUk4gd2hlbiBpdCBleGNsdWRlcyBleGFjdGx5IHdoYXQgaXQgbWF0Y2hlcyAoYGFwcHMvKmJgKSwgb3Jcbi8vIGFzIGFuIGFuY2VzdG9yJ3MgcGFja2FnZS1vd25lZCBzdWJwYXRocyAoYGFwcHMveC9zcmNgKSDigJQgc28gdGhlIGVudHJ5IG1heSBjb3ZlciBhIGRpc2NvdmVyZWRcbi8vIHdvcmtzcGFjZSBkaXJlY3Rvcnkgb3Igc2l0IHVuZGVyIG9uZS4gQSBnbG9ic3RhciBzZWdtZW50IG1hcmtzIGEgaHlnaWVuZSBnbG9iIChub2RlX21vZHVsZXMsIGUyZVxuLy8gYW5kIGZyaWVuZHMpLCB3aGljaCBpcyBuZXZlciBuZWdhdGlvbi1kZXJpdmVkIGFuZCBtdXN0IHN1cnZpdmUuXG5mdW5jdGlvbiBjb3ZlcnNXb3Jrc3BhY2VEaXIoZW50cnk6IHN0cmluZywgd29ya3NwYWNlRGlyUGF0aHM6IHJlYWRvbmx5IHN0cmluZ1tdKTogYm9vbGVhbiB7XG4gIGlmIChlbnRyeS5zcGxpdCgnLycpLmluY2x1ZGVzKCcqKicpKSByZXR1cm4gZmFsc2U7XG4gIGNvbnN0IHJlZ2V4U291cmNlID0gZW50cnlcbiAgICAuc3BsaXQoJy8nKVxuICAgIC5tYXAoKHNlZ21lbnQpID0+XG4gICAgICBzZWdtZW50XG4gICAgICAgIC5yZXBsYWNlQWxsKC9bLiteJHt9KCl8W1xcXVxcXFxdL2d1LCBTdHJpbmcucmF3YFxcJCZgKVxuICAgICAgICAucmVwbGFjZUFsbCgnKicsICdbXi9dKicpXG4gICAgICAgIC5yZXBsYWNlQWxsKCc/JywgJ1teL10nKVxuICAgIClcbiAgICAuam9pbignLycpO1xuICBjb25zdCBlbnRyeVBhdHRlcm4gPSBuZXcgUmVnRXhwKGBeJHtyZWdleFNvdXJjZX0oPzovLiopPyRgLCAndScpO1xuICByZXR1cm4gd29ya3NwYWNlRGlyUGF0aHMuc29tZShcbiAgICAod29ya3NwYWNlRGlyUGF0aCkgPT4gZW50cnlQYXR0ZXJuLnRlc3Qod29ya3NwYWNlRGlyUGF0aCkgfHwgZW50cnkuc3RhcnRzV2l0aChgJHt3b3Jrc3BhY2VEaXJQYXRofS9gKVxuICApO1xufVxuXG5mdW5jdGlvbiBnZXRNYW5hZ2VkV29ya3NwYWNlUHJlZml4KGVudHJ5OiBzdHJpbmcpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBjb25zdCBtYXRjaGVkU3VmZml4ID0gbWFuYWdlZFdvcmtzcGFjZUluY2x1ZGVTdWZmaXhlcy5maW5kKChzdWZmaXgpID0+IGVudHJ5LmVuZHNXaXRoKGAvJHtzdWZmaXh9YCkpO1xuICBpZiAoIW1hdGNoZWRTdWZmaXgpIHJldHVybiB1bmRlZmluZWQ7XG4gIGNvbnN0IHdvcmtzcGFjZVByZWZpeCA9IGVudHJ5LnNsaWNlKDAsIC0obWF0Y2hlZFN1ZmZpeC5sZW5ndGggKyAxKSk7XG4gIHJldHVybiB3b3Jrc3BhY2VQcmVmaXggPT09ICcnID8gdW5kZWZpbmVkIDogd29ya3NwYWNlUHJlZml4O1xufVxuXG5hc3luYyBmdW5jdGlvbiBub3JtYWxpemVGcmFtZXdvcmtUc2NvbmZpZyhjb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgLy8gTmV4dC9CbGl0eiBvd24gdGhlaXIgdHNjb25maWcgc2hhcGUsIGJ1dCBUeXBlU2NyaXB0IDYgbm8gbG9uZ2VyIGFjY2VwdHNcbiAgLy8gbm9kZTEwIHJlc29sdmVyIHNwZWxsaW5ncyB0aGF0IG9sZGVyIHByb2plY3RzIGNvbW1vbmx5IGluaGVyaXRlZC5cbiAgY29uc3QgZmlsZVBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICd0c2NvbmZpZy5qc29uJyk7XG4gIGNvbnN0IGV4aXN0aW5nQ29udGVudCA9IGF3YWl0IGZzVXRpbC5yZWFkRmlsZUlmRXhpc3RzKGZpbGVQYXRoKTtcbiAgaWYgKGV4aXN0aW5nQ29udGVudCA9PT0gdW5kZWZpbmVkIHx8IGpzb25jVXRpbC5pc1RyaXZpYU9ubHkoZXhpc3RpbmdDb250ZW50KSkgcmV0dXJuO1xuICBjb25zdCBzZXR0aW5ncyA9IGpzb25jVXRpbC5wYXJzZU9iamVjdElnbm9yaW5nRXJyb3I8VHNDb25maWdKc29uPihleGlzdGluZ0NvbnRlbnQpO1xuICBpZiAoIXNldHRpbmdzKSB7XG4gICAgY29uc29sZS53YXJuKGBTa2lwcGVkIGNsZWFuaW5nIHVwICR7ZmlsZVBhdGh9IGJlY2F1c2UgdGhlIGV4aXN0aW5nIGNvbnRlbnQgaXMgbm90IHBhcnNhYmxlIGFzIEpTT05DLmApO1xuICAgIHJldHVybjtcbiAgfVxuICBjb25zdCBvcmlnaW5hbFNldHRpbmdzSnNvbiA9IEpTT04uc3RyaW5naWZ5KHNldHRpbmdzKTtcbiAgbm9ybWFsaXplTmV4dFRzY29uZmlnTW9kdWxlU2V0dGluZ3Moc2V0dGluZ3MpO1xuICBub3JtYWxpemVOZXh0VHNjb25maWdQYXRoQWxpYXNlcyhzZXR0aW5ncy5jb21waWxlck9wdGlvbnMpO1xuICBhZGRTY3JpcHRzSW5jbHVkZUZvckZyYW1ld29ya1Byb2plY3Qoc2V0dGluZ3MpO1xuICBhZGRVbmRpY2lUeXBlc1BhdGhNYXBwaW5nKHNldHRpbmdzLCBjb25maWcpO1xuICAvLyBTa2lwIHRoZSB3cml0ZSB3aGVuIG5vdGhpbmcgY2hhbmdlcyBzZW1hbnRpY2FsbHksIHNvIEpTT05DIGNvbW1lbnRzIGFuZCBmb3JtYXR0aW5nIGluIGFuXG4gIC8vIGFscmVhZHktY2xlYW4gdHNjb25maWcuanNvbiBzdXJ2aXZlIHdiZnkgcnVucy5cbiAgaWYgKEpTT04uc3RyaW5naWZ5KHNldHRpbmdzKSA9PT0gb3JpZ2luYWxTZXR0aW5nc0pzb24pIHJldHVybjtcbiAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzVXRpbC5nZW5lcmF0ZUZpbGUoZmlsZVBhdGgsIEpTT04uc3RyaW5naWZ5KHNldHRpbmdzLCB1bmRlZmluZWQsIDIpKSk7XG59XG5cbi8qKlxuICogYnVuLXR5cGVzIHJlZmVyZW5jZXMgdW5kaWNpLXR5cGVzIHdpdGhvdXQgZGVjbGFyaW5nIGl0IGFzIGEgZGVwZW5kZW5jeSAob3Zlbi1zaC9idW4jMjI4MDUpLCBzb1xuICogQnVuJ3MgaXNvbGF0ZWQgbGlua2VyIChlc3BlY2lhbGx5IHdpdGggdGhlIGdsb2JhbCBzdG9yZSBvdXRzaWRlIHRoZSByZXBvc2l0b3J5KSBjYW5ub3QgcmVzb2x2ZVxuICogaXQgZnJvbSBidW4tdHlwZXMnIGxvY2F0aW9uLCB3aGljaCBzaWxlbnRseSBkZWdyYWRlcyBnbG9iYWwgZmV0Y2ggdHlwZXMgc3VjaCBhcyBSZXNwb25zZS4gTWFwIGl0XG4gKiB0byB0aGUgY29weSB0aGF0IGJ1bmZpZy50b21sJ3MgcHVibGljSG9pc3RQYXR0ZXJuIHBsYWNlcyBpbiB0aGUgcm9vdCBub2RlX21vZHVsZXMuXG4gKi9cbmZ1bmN0aW9uIGFkZFVuZGljaVR5cGVzUGF0aE1hcHBpbmcoc2V0dGluZ3M6IFRzQ29uZmlnSnNvbiwgY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogdm9pZCB7XG4gIC8vIE1hcCB1bmRpY2ktdHlwZXMgb25seSB3aGVuIGJ1bi10eXBlcyBhY3R1YWxseSBsb2FkczogYW4gZXhwbGljaXQgYHR5cGVzYCBsaXN0IGxvYWRzIGl0IGlmZiBpdFxuICAvLyBjb250YWlucyBcImJ1blwiIChldmVuIG9uIFJlYWN0IE5hdGl2ZSwgd2hvc2UgcHJvamVjdHMgbWF5IG9wdCBpbiBieSBoYW5kKTsgd2l0aCBgdHlwZXNgXG4gIC8vIG9taXR0ZWQsIFR5cGVTY3JpcHQncyBhdXRvbWF0aWMgQHR5cGVzIGluY2x1c2lvbiBsb2FkcyBpdCBiZWNhdXNlIHdiZnkgaW5zdGFsbHMgQHR5cGVzL2J1blxuICAvLyBmb3IgZXZlcnkgVHlwZVNjcmlwdCBwcm9qZWN0IGV4Y2VwdCBSZWFjdCBOYXRpdmUsIHdoaWNoIHVzZXMgQHRzY29uZmlnL3JlYWN0LW5hdGl2ZSBpbnN0ZWFkLlxuICBjb25zdCB0eXBlcyA9IHNldHRpbmdzLmNvbXBpbGVyT3B0aW9ucz8udHlwZXM7XG4gIGlmICh0eXBlcyA/ICF0eXBlcy5pbmNsdWRlcygnYnVuJykgOiBjb25maWcuZGVwZW5kaW5nLnJlYWN0TmF0aXZlKSByZXR1cm47XG4gIGNvbnN0IGNvcnJlY3RNYXBwaW5nID0gYCR7Z2V0Um9vdERpcihjb25maWcpfS9ub2RlX21vZHVsZXMvdW5kaWNpLXR5cGVzL2luZGV4LmQudHNgO1xuICBjb25zdCBleGlzdGluZ01hcHBpbmcgPSBzZXR0aW5ncy5jb21waWxlck9wdGlvbnM/LnBhdGhzPy5bJ3VuZGljaS10eXBlcyddO1xuICBpZiAoZXhpc3RpbmdNYXBwaW5nKSB7XG4gICAgLy8gUmV3cml0ZSB0aGUgZ2VuZXJhdGVkIG1hcHBpbmcgd2hlbiBhIHdvcmtzcGFjZSBtb3ZlcyB0byBhIGRpZmZlcmVudCByb290IGRlcHRoLiBBbnkgb3RoZXJcbiAgICAvLyB2YWx1ZSBpcyBhIGRlbGliZXJhdGUgcmVwby1sb2NhbCBtYXBwaW5nIChlLmcuIHBhdGNoZWQgdHlwZXMpIGFuZCBtdXN0IGJlIGtlcHQuXG4gICAgaWYgKFxuICAgICAgZXhpc3RpbmdNYXBwaW5nLmxlbmd0aCA9PT0gMSAmJlxuICAgICAgdHlwZW9mIGV4aXN0aW5nTWFwcGluZ1swXSA9PT0gJ3N0cmluZycgJiZcbiAgICAgIC8oPzpefFxcLylub2RlX21vZHVsZXNcXC91bmRpY2ktdHlwZXNcXC9pbmRleFxcLmRcXC50cyQvdS50ZXN0KGV4aXN0aW5nTWFwcGluZ1swXSlcbiAgICApIHtcbiAgICAgIHNldHRpbmdzLmNvbXBpbGVyT3B0aW9ucyEucGF0aHMhWyd1bmRpY2ktdHlwZXMnXSA9IFtjb3JyZWN0TWFwcGluZ107XG4gICAgfVxuICAgIHJldHVybjtcbiAgfVxuXG4gIHNldHRpbmdzLmNvbXBpbGVyT3B0aW9ucyA/Pz0ge307XG4gIHNldHRpbmdzLmNvbXBpbGVyT3B0aW9ucy5wYXRocyA9IHtcbiAgICAuLi5zZXR0aW5ncy5jb21waWxlck9wdGlvbnMucGF0aHMsXG4gICAgJ3VuZGljaS10eXBlcyc6IFtjb3JyZWN0TWFwcGluZ10sXG4gIH07XG59XG5cbmZ1bmN0aW9uIGFkZFNjcmlwdHNJbmNsdWRlRm9yRnJhbWV3b3JrUHJvamVjdChzZXR0aW5nczogVHNDb25maWdKc29uKTogdm9pZCB7XG4gIC8vIE9taXR0aW5nIGluY2x1ZGUgbGV0cyBmcmFtZXdvcmsgdHNjb25maWdzIGtlZXAgVHlwZVNjcmlwdCdzIGRlZmF1bHRcbiAgLy8gXCJhbGwgVFMvVFNYIGZpbGVzXCIgYmVoYXZpb3IsIHdoaWNoIGFscmVhZHkgY292ZXJzIHNjcmlwdHMuXG4gIGlmICghc2V0dGluZ3MuaW5jbHVkZSkgcmV0dXJuO1xuICBpZiAoc2V0dGluZ3MuaW5jbHVkZS5pbmNsdWRlcygnc2NyaXB0cy8qKi8qJykpIHJldHVybjtcblxuICBzZXR0aW5ncy5pbmNsdWRlLnB1c2goJ3NjcmlwdHMvKiovKicpO1xuICBzZXR0aW5ncy5pbmNsdWRlLnNvcnQoKTtcbn1cblxuZnVuY3Rpb24gbm9ybWFsaXplTmV4dFRzY29uZmlnTW9kdWxlU2V0dGluZ3Moc2V0dGluZ3M6IFRzQ29uZmlnSnNvbik6IHZvaWQge1xuICBjb25zdCBjb21waWxlck9wdGlvbnMgPSBzZXR0aW5ncy5jb21waWxlck9wdGlvbnM7XG4gIGlmICghY29tcGlsZXJPcHRpb25zKSByZXR1cm47XG4gIGNvbnN0IG1vZHVsZVJlc29sdXRpb24gPSBsb3dlckNhc2VTZXR0aW5nKGNvbXBpbGVyT3B0aW9ucy5tb2R1bGVSZXNvbHV0aW9uKTtcbiAgaWYgKG1vZHVsZVJlc29sdXRpb24gPT09ICdub2RlJyB8fCBtb2R1bGVSZXNvbHV0aW9uID09PSAnbm9kZTEwJyB8fCBtb2R1bGVSZXNvbHV0aW9uID09PSB1bmRlZmluZWQpIHtcbiAgICBpZiAoc2V0dGluZ3MuZXh0ZW5kcykge1xuICAgICAgLy8gQW4gZXh0ZW5kZWQgY29uZmlnIG1heSBhbHJlYWR5IHN1cHBseSBhIHZhbGlkIG1vZHVsZS9yZXNvbHZlciBwYWlyLCBzbyBvbmx5XG4gICAgICAvLyByZW1vdmUgdGhlIHJlbW92ZWQtaW4tVFM2IG5vZGUxMCBzcGVsbGluZ3MgaW5zdGVhZCBvZiBmb3JjaW5nIGJ1bmRsZXIgb24gaXQuXG4gICAgICBkZWxldGUgY29tcGlsZXJPcHRpb25zLm1vZHVsZVJlc29sdXRpb247XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIE5leHQuanMgd3JpdGVzIFwibm9kZVwiIGR1cmluZyBidWlsZCB3aGVuIHRoaXMgb3B0aW9uIGlzIG1pc3NpbmcsIGJ1dFxuICAgICAgLy8gdHNnb2xpbnQgdHJlYXRzIHRoYXQgc3BlbGxpbmcgYXMgdGhlIHJlbW92ZWQgbm9kZTEwIHJlc29sdmVyLlxuICAgICAgY29tcGlsZXJPcHRpb25zLm1vZHVsZVJlc29sdXRpb24gPSAnYnVuZGxlcic7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIG5vcm1hbGl6ZU5leHRUc2NvbmZpZ1BhdGhBbGlhc2VzKGNvbXBpbGVyT3B0aW9uczogVHNDb25maWdKc29uLkNvbXBpbGVyT3B0aW9ucyB8IHVuZGVmaW5lZCk6IHZvaWQge1xuICBpZiAoIWNvbXBpbGVyT3B0aW9ucykgcmV0dXJuO1xuXG4gIC8vIHRzZ29saW50IGZvbGxvd3MgVHlwZVNjcmlwdCA2IHZhbGlkYXRpb24sIHdoZXJlIGJhc2VVcmwgaXMgcmVtb3ZlZCBhbmRcbiAgLy8gcGF0aCB0YXJnZXRzIG11c3QgYmUgZXhwbGljaXRseSByZWxhdGl2ZS4gTmV4dC5qcyBzdGlsbCBhY2NlcHRzIHRoZSBhbGlhc1xuICAvLyBzaGFwZSBhZnRlciBlYWNoIHRhcmdldCBpcyB3cml0dGVuIHdpdGggYSBsZWFkaW5nIC4vLlxuICBkZWxldGUgY29tcGlsZXJPcHRpb25zLmJhc2VVcmw7XG4gIGlmICghY29tcGlsZXJPcHRpb25zLnBhdGhzKSByZXR1cm47XG5cbiAgZm9yIChjb25zdCBbYWxpYXMsIHRhcmdldHNdIG9mIE9iamVjdC5lbnRyaWVzKGNvbXBpbGVyT3B0aW9ucy5wYXRocykpIHtcbiAgICBjb21waWxlck9wdGlvbnMucGF0aHNbYWxpYXNdID0gbm9ybWFsaXplUGF0aEFsaWFzVGFyZ2V0cyh0YXJnZXRzKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBub3JtYWxpemVQYXRoQWxpYXNUYXJnZXRzKHRhcmdldHM6IHN0cmluZ1tdKTogc3RyaW5nW10ge1xuICByZXR1cm4gdGFyZ2V0cy5tYXAoKHRhcmdldCkgPT4ge1xuICAgIGlmICh0YXJnZXQuc3RhcnRzV2l0aCgnLi8nKSB8fCB0YXJnZXQuc3RhcnRzV2l0aCgnLi4vJykgfHwgcGF0aC5pc0Fic29sdXRlKHRhcmdldCkpIHJldHVybiB0YXJnZXQ7XG4gICAgcmV0dXJuIGAuLyR7dGFyZ2V0fWA7XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBnZXRSb290RGlyKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IHN0cmluZyB7XG4gIGlmIChjb25maWcuaXNSb290KSByZXR1cm4gJy4nO1xuICAvLyBUaGUgdW5kaWNpLXR5cGVzIHBhdGggbWFwcGluZyBtdXN0IHJlYWNoIHRoZSBtb25vcmVwbyByb290J3Mgbm9kZV9tb2R1bGVzIChidW5maWcudG9tbCdzXG4gIC8vIHB1YmxpY0hvaXN0UGF0dGVybiBob2lzdHMgdGhlIHBhY2thZ2UgdGhlcmUpLCBhbmQgd29ya3NwYWNlIHBhdHRlcm5zIG1heSBiZSBhcmJpdHJhcmlseSBkZWVwXG4gIC8vIChlLmcuIGBleGFtcGxlcy8qKmApLCBzbyBhIGZpeGVkIHR3by1sZXZlbCBwcm9iZSBpcyBub3QgZW5vdWdoLiBQcmVmZXIgdGhlIG5lYXJlc3QgYW5jZXN0b3JcbiAgLy8gbWFuaWZlc3QgdGhhdCBkZWNsYXJlcyB3b3Jrc3BhY2VzICh0aGUgbW9ub3JlcG8gcm9vdCk7IG90aGVyd2lzZSBmYWxsIGJhY2sgdG8gdGhlIG5lYXJlc3RcbiAgLy8gYW5jZXN0b3IgbWFuaWZlc3QuIFN0b3AgYXQgdGhlIGZpcnN0IGdpdCByZXBvc2l0b3J5IGJvdW5kYXJ5IHNvIGFuIHVucmVsYXRlZCBlbmNsb3NpbmdcbiAgLy8gcmVwb3NpdG9yeSdzIG1hbmlmZXN0IGNhbiBuZXZlciBiZSBjaG9zZW4uXG4gIGNvbnN0IGRpclBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgpO1xuICBsZXQgcm9vdERpclBhdGg6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgZm9yIChsZXQgYW5jZXN0b3JEaXJQYXRoID0gcGF0aC5kaXJuYW1lKGRpclBhdGgpOyA7IGFuY2VzdG9yRGlyUGF0aCA9IHBhdGguZGlybmFtZShhbmNlc3RvckRpclBhdGgpKSB7XG4gICAgY29uc3QgbWFuaWZlc3RQYXRoID0gcGF0aC5yZXNvbHZlKGFuY2VzdG9yRGlyUGF0aCwgJ3BhY2thZ2UuanNvbicpO1xuICAgIGlmIChmcy5leGlzdHNTeW5jKG1hbmlmZXN0UGF0aCkpIHtcbiAgICAgIHJvb3REaXJQYXRoID8/PSBhbmNlc3RvckRpclBhdGg7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBtYW5pZmVzdCA9IEpTT04ucGFyc2UoZnMucmVhZEZpbGVTeW5jKG1hbmlmZXN0UGF0aCwgJ3V0ZjgnKSkgYXMgUGFja2FnZUpzb247XG4gICAgICAgIC8vIEJ1biBuby1vcCBwYXR0ZXJucyAoZS5nLiBgd29ya3NwYWNlczogW1wiXCJdYCkgZG8gbm90IG1ha2UgYSBtYW5pZmVzdCBhIHdvcmtzcGFjZSByb290LlxuICAgICAgICBpZiAoZ2V0TWVhbmluZ2Z1bERlY2xhcmVkV29ya3NwYWNlUGF0dGVybnMobWFuaWZlc3Qud29ya3NwYWNlcykubGVuZ3RoID4gMCkge1xuICAgICAgICAgIHJvb3REaXJQYXRoID0gYW5jZXN0b3JEaXJQYXRoO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9IGNhdGNoIHtcbiAgICAgICAgLy8gQW4gdW5wYXJzYWJsZSBtYW5pZmVzdCBzdGlsbCBtYXJrcyBhIHByb2plY3QgZGlyZWN0b3J5OyBrZWVwIGNsaW1iaW5nIGZvciBhIHdvcmtzcGFjZSByb290LlxuICAgICAgfVxuICAgIH1cbiAgICBjb25zdCBpc1JlcG9Cb3VuZGFyeSA9IGZzLmV4aXN0c1N5bmMocGF0aC5yZXNvbHZlKGFuY2VzdG9yRGlyUGF0aCwgJy5naXQnKSk7XG4gICAgY29uc3QgaXNGaWxlc3lzdGVtUm9vdCA9IGFuY2VzdG9yRGlyUGF0aCA9PT0gcGF0aC5kaXJuYW1lKGFuY2VzdG9yRGlyUGF0aCk7XG4gICAgaWYgKGlzUmVwb0JvdW5kYXJ5IHx8IGlzRmlsZXN5c3RlbVJvb3QpIGJyZWFrO1xuICB9XG4gIGlmICghcm9vdERpclBhdGgpIHJldHVybiAnLic7XG4gIHJldHVybiBwYXRoLnJlbGF0aXZlKGRpclBhdGgsIHJvb3REaXJQYXRoKS5yZXBsYWNlQWxsKCdcXFxcJywgJy8nKSB8fCAnLic7XG59XG5cbmZ1bmN0aW9uIG1lcmdlVHNjb25maWdFeHRlbmRzKFxuICBnZW5lcmF0ZWRFeHRlbmRzOiBUc0NvbmZpZ0pzb25bJ2V4dGVuZHMnXSxcbiAgZXhpc3RpbmdFeHRlbmRzOiBUc0NvbmZpZ0pzb25bJ2V4dGVuZHMnXVxuKTogVHNDb25maWdKc29uWydleHRlbmRzJ10ge1xuICBjb25zdCBtZXJnZWRFeHRlbmRzID0gWy4uLm5vcm1hbGl6ZUV4dGVuZHMoZ2VuZXJhdGVkRXh0ZW5kcyksIC4uLm5vcm1hbGl6ZUV4dGVuZHMoZXhpc3RpbmdFeHRlbmRzKV07XG4gIGNvbnN0IHVuaXF1ZUV4dGVuZHMgPSBbLi4ubmV3IFNldChtZXJnZWRFeHRlbmRzKV07XG4gIGlmICh1bmlxdWVFeHRlbmRzLmxlbmd0aCA9PT0gMCkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgaWYgKHVuaXF1ZUV4dGVuZHMubGVuZ3RoID09PSAxKSByZXR1cm4gdW5pcXVlRXh0ZW5kc1swXTtcbiAgcmV0dXJuIHVuaXF1ZUV4dGVuZHM7XG59XG5cbmZ1bmN0aW9uIGFkZEluY2x1ZGVQYXRoKHNldHRpbmdzOiBUc0NvbmZpZ0pzb24sIGRpclBhdGg6IHN0cmluZyk6IHZvaWQge1xuICBzZXR0aW5ncy5pbmNsdWRlID8/PSBbXTtcbiAgaWYgKCFzZXR0aW5ncy5pbmNsdWRlLmluY2x1ZGVzKGRpclBhdGgpKSB7XG4gICAgc2V0dGluZ3MuaW5jbHVkZS5wdXNoKGRpclBhdGgpO1xuICB9XG59XG5cbmZ1bmN0aW9uIG5vcm1hbGl6ZUV4dGVuZHModmFsdWU6IFRzQ29uZmlnSnNvblsnZXh0ZW5kcyddKTogc3RyaW5nW10ge1xuICBpZiAoIXZhbHVlKSByZXR1cm4gW107XG4gIHJldHVybiBBcnJheS5pc0FycmF5KHZhbHVlKSA/IHZhbHVlIDogW3ZhbHVlXTtcbn1cblxuZnVuY3Rpb24gbm9ybWFsaXplU3RyaW5nQXJyYXkodmFsdWU6IHVua25vd24pOiBzdHJpbmdbXSB7XG4gIGlmICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnKSByZXR1cm4gW3ZhbHVlXTtcbiAgaWYgKCFBcnJheS5pc0FycmF5KHZhbHVlKSkgcmV0dXJuIFtdO1xuICByZXR1cm4gdmFsdWUuZmlsdGVyKChpdGVtKTogaXRlbSBpcyBzdHJpbmcgPT4gdHlwZW9mIGl0ZW0gPT09ICdzdHJpbmcnKTtcbn1cblxuZnVuY3Rpb24gc2hvdWxkRGVsZXRlVHlwZVJvb3RzKHR5cGVOYW1lczogc3RyaW5nW10pOiBib29sZWFuIHtcbiAgLy8gT25seSBnZW5lcmF0ZWQgcGFja2FnZS1vd25lZCB0ZXN0IHR5cGVzIHNob3VsZCB0cmlnZ2VyIHRoaXMuIFVzZXItZGVmaW5lZCBzbGFzaC1iYXNlZFxuICAvLyBlbnRyaWVzIG1heSBpbnRlbnRpb25hbGx5IHJlbHkgb24gY3VzdG9tIHR5cGVSb290cyBhbmQgc2hvdWxkIGJlIHByZXNlcnZlZCBhcy1pcy5cbiAgcmV0dXJuIHR5cGVOYW1lcy5zb21lKCh0eXBlTmFtZSkgPT4gdHlwZU5hbWUgPT09ICdjeXByZXNzJyB8fCB0eXBlTmFtZS5pbmNsdWRlcygnLycpKTtcbn1cblxuZnVuY3Rpb24gZmlsdGVyRXhpc3RpbmdUeXBlcyhleGlzdGluZ1R5cGVzOiBzdHJpbmdbXSwgZ2VuZXJhdGVkVHlwZXM6IHN0cmluZ1tdKTogc3RyaW5nW10ge1xuICBjb25zdCBnZW5lcmF0ZWRUeXBlU2V0ID0gbmV3IFNldChnZW5lcmF0ZWRUeXBlcyk7XG4gIHJldHVybiBleGlzdGluZ1R5cGVzLmZpbHRlcigodHlwZU5hbWUpID0+IHtcbiAgICAvLyB3YmZ5IG93bnMgdGhlc2UgcGFja2FnZS1wcm92aWRlZCB0ZXN0IGdsb2JhbHMuIERyb3Agc3RhbGUgZW50cmllcyB3aGVuIHRoZVxuICAgIC8vIGNvcnJlc3BvbmRpbmcgZGVwZW5kZW5jeSBpcyBubyBsb25nZXIgcHJlc2VudCBzbyBUeXBlU2NyaXB0IHdvbid0IHJlcXVpcmVcbiAgICAvLyBtaXNzaW5nIHBhY2thZ2VzIHN1Y2ggYXMgdml0ZXN0LlxuICAgIGlmIChpc0dlbmVyYXRlZFRlc3RHbG9iYWxUeXBlKHR5cGVOYW1lKSAmJiAhZ2VuZXJhdGVkVHlwZVNldC5oYXModHlwZU5hbWUpKSByZXR1cm4gZmFsc2U7XG4gICAgcmV0dXJuIHRydWU7XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBpc0dlbmVyYXRlZFRlc3RHbG9iYWxUeXBlKHR5cGVOYW1lOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgcmV0dXJuIHR5cGVOYW1lID09PSAnY3lwcmVzcycgfHwgdHlwZU5hbWUgPT09ICdqZXN0JyB8fCB0eXBlTmFtZSA9PT0gJ21vY2hhJyB8fCB0eXBlTmFtZSA9PT0gJ3ZpdGVzdC9nbG9iYWxzJztcbn1cblxuZnVuY3Rpb24gbG93ZXJDYXNlU2V0dGluZyh2YWx1ZTogdW5rbm93bik6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIHJldHVybiB0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnID8gdmFsdWUudG9Mb3dlckNhc2UoKSA6IHVuZGVmaW5lZDtcbn1cblxuZnVuY3Rpb24gcGlja0V4aXN0aW5nRW1pdE1ldGFkYXRhKFxuICBjb21waWxlck9wdGlvbnM6IFRzQ29uZmlnSnNvblsnY29tcGlsZXJPcHRpb25zJ11cbik6IFBpY2s8Tm9uTnVsbGFibGU8VHNDb25maWdKc29uWydjb21waWxlck9wdGlvbnMnXT4sICdkZWNsYXJhdGlvbicgfCAnZGVjbGFyYXRpb25NYXAnIHwgJ3NvdXJjZU1hcCc+IHtcbiAgY29uc3QgZW1pdE9wdGlvbnMgPSB7fSBhcyBQaWNrPFxuICAgIE5vbk51bGxhYmxlPFRzQ29uZmlnSnNvblsnY29tcGlsZXJPcHRpb25zJ10+LFxuICAgICdkZWNsYXJhdGlvbicgfCAnZGVjbGFyYXRpb25NYXAnIHwgJ3NvdXJjZU1hcCdcbiAgPjtcbiAgZm9yIChjb25zdCBrZXkgb2YgWydkZWNsYXJhdGlvbicsICdkZWNsYXJhdGlvbk1hcCcsICdzb3VyY2VNYXAnXSBhcyBjb25zdCkge1xuICAgIGNvbnN0IHZhbHVlID0gY29tcGlsZXJPcHRpb25zPy5ba2V5XTtcbiAgICBpZiAodmFsdWUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgZW1pdE9wdGlvbnNba2V5XSA9IHZhbHVlIGFzIG5ldmVyO1xuICAgIH1cbiAgfVxuICByZXR1cm4gZW1pdE9wdGlvbnM7XG59XG5cbmZ1bmN0aW9uIGdldEdlbmVyYXRlZFR5cGVzKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IHN0cmluZ1tdIHtcbiAgY29uc3QgdHlwZU5hbWVzID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gIGNvbnN0IGRlcGVuZGVuY2llcyA9IHtcbiAgICAuLi5jb25maWcucGFja2FnZUpzb24/LmRlcGVuZGVuY2llcyxcbiAgICAuLi5jb25maWcucGFja2FnZUpzb24/LmRldkRlcGVuZGVuY2llcyxcbiAgfTtcblxuICAvLyBSZWFjdCBOYXRpdmUgZ2V0cyBpdHMgYW1iaWVudCB0eXBlcyBmcm9tIEB0c2NvbmZpZy9yZWFjdC1uYXRpdmUgKHJlYWN0LW5hdGl2ZSwgamVzdCkuXG4gIGlmICghY29uZmlnLmRlcGVuZGluZy5yZWFjdE5hdGl2ZSkge1xuICAgIHR5cGVOYW1lcy5hZGQoJ2J1bicpO1xuICB9XG4gIGlmIChcbiAgICBkZXBlbmRlbmNpZXMuamVzdCB8fFxuICAgIGRlcGVuZGVuY2llc1snQGplc3QvZ2xvYmFscyddIHx8XG4gICAgZGVwZW5kZW5jaWVzWydqZXN0LWVudmlyb25tZW50LWpzZG9tJ10gfHxcbiAgICBkZXBlbmRlbmNpZXNbJ3RzLWplc3QnXVxuICApIHtcbiAgICB0eXBlTmFtZXMuYWRkKCdqZXN0Jyk7XG4gIH1cbiAgaWYgKGRlcGVuZGVuY2llcy52aXRlc3QpIHtcbiAgICB0eXBlTmFtZXMuYWRkKCd2aXRlc3QvZ2xvYmFscycpO1xuICB9XG4gIGlmIChkZXBlbmRlbmNpZXMubW9jaGEpIHtcbiAgICB0eXBlTmFtZXMuYWRkKCdtb2NoYScpO1xuICB9XG4gIGlmIChkZXBlbmRlbmNpZXMuY3lwcmVzcykge1xuICAgIHR5cGVOYW1lcy5hZGQoJ2N5cHJlc3MnKTtcbiAgfVxuXG4gIHJldHVybiBbLi4udHlwZU5hbWVzXTtcbn1cbiIsImltcG9ydCBvcyBmcm9tICdub2RlOm9zJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCBtZXJnZSBmcm9tICdkZWVwbWVyZ2UnO1xuXG5pbXBvcnQgeyBmc1V0aWwgfSBmcm9tICcuLi91dGlscy9mc1V0aWwuanMnO1xuaW1wb3J0IHsganNvbmNVdGlsIH0gZnJvbSAnLi4vdXRpbHMvanNvbmNVdGlsLmpzJztcblxuLyoqXG4gKiBUaGUgdXNlci1sZXZlbCBpbnN0cnVjdGlvbiBmaWxlIG9mIGVhY2ggc3VwcG9ydGVkIGFnZW50LCByZWxhdGl2ZSB0byB0aGUgaG9tZSBkaXJlY3RvcnkuIFRoZXNlXG4gKiBhcHBseSB0byBldmVyeSByZXBvc2l0b3J5IHRoZSBhZ2VudCB3b3JrcyBpbiwgc28gdGhleSBob2xkIG9ubHkgdGhlIGNvbnZlbnRpb25zIHRoYXQgYXJlIHRydWUgb25cbiAqIGV2ZXJ5IFdpbGxCb29zdGVyIGRldmVsb3BlciBtYWNoaW5lIHJhdGhlciB0aGFuIGluIGEgcGFydGljdWxhciByZXBvc2l0b3J5LlxuICovXG5jb25zdCB1c2VyQWdlbnRJbnN0cnVjdGlvbkZpbGVQYXRocyA9IFsnLmNvZGV4L0FHRU5UUy5tZCcsICcuY2xhdWRlL0NMQVVERS5tZCcsICcuZ2VtaW5pL0dFTUlOSS5tZCddIGFzIGNvbnN0O1xuXG4vLyBUaGlzIGNvbnRlbnQgaXMgbG9hZGVkIGludG8gZXZlcnkgYWdlbnQgc2Vzc2lvbiwgc28gaXQgaXMga2VwdCBhcyBzaG9ydCBhcyBpdCBjYW4gYmUgd2hpbGVcbi8vIHN0YXlpbmcgdW5hbWJpZ3VvdXM6IGUuZy4sIHRoZSBleGNsdWRlZCBvcmdhbml6YXRpb25zIGFyZSB3cml0dGVuIGFzIHNoZWxsIGJyYWNlIGV4cGFuc2lvbiwgd2hpY2hcbi8vIHRoZSBhZ2VudHMgcmVhZCBhcyBhIHBhdGggY29uZGl0aW9uIHdpdGhvdXQgYW55IHJ1bnRpbWUgbWF0Y2hpbmcuXG5jb25zdCB1c2VyQWdlbnRJbnN0cnVjdGlvbkNvbnRlbnQgPSBgLSBSZXBvcyBsaXZlIHVuZGVyIFxcYH4vZ2hxL2dpdGh1Yi5jb21cXGA7IGFsd2F5cyBjbG9uZSB3aXRoIFxcYGdocSBnZXQgLXBcXGAsIG5ldmVyIFxcYGdpdCBjbG9uZVxcYC5cbi0gTExNL0FJIGFnZW50IHJlc3BvbnNlcyBtYXkgdGFrZSAx4oCTMiBob3Vyczsgd2FpdCBwYXRpZW50bHksIGRvbid0IGFzc3VtZSBmYWlsdXJlLlxuLSBObyBBSSBhdHRyaWJ1dGlvbiAoZS5nLiwgXFxgQ28tQXV0aG9yZWQtQnlcXGAgdHJhaWxlcnMsIFwiR2VuZXJhdGVkIHdpdGggLi4uXCIgZm9vdGVycykgaW4gY29tbWl0cywgaXNzdWVzLCBvciBQUnMgdW5sZXNzIGV4cGxpY2l0bHkgcmVxdWVzdGVkLiBUaGlzIGhpZGVzIG5vdGhpbmc6IGlmIGFza2VkIHdoaWNoIEFJIGFnZW50IGRpZCB0aGUgd29yaywgYW5zd2VyIHRydXRoZnVsbHkuXG4tIE91dHNpZGUgXFxgfi9naHEvZ2l0aHViLmNvbS97V2lsbEJvb3N0ZXIsV2lsbEJvb3N0ZXJMYWJ9L1xcYCwgZm9sbG93IHRoZSByZXBvc2l0b3J5J3MgY29udHJpYnV0aW9uIGd1aWRlIChlLmcuLCBDT05UUklCVVRJTkcubWQsIFxcYC5naXRodWIvXFxgKSBhbmQgaXNzdWUvUFIgdGVtcGxhdGVzLCBtYXRjaCBpdHMgY29tbWl0IGFuZCBjb2RlIGNvbnZlbnRpb25zLCBhbmQgaG9ub3IgaXRzIHJ1bGVzIG9uIEFJLWFzc2lzdGVkIGNvbnRyaWJ1dGlvbnMuIFdyaXRlIGl0cyBpc3N1ZXMgYW5kIFBScyB3aXRoIG9ubHkgd2hhdCBhIHJldmlld2VyIHVuZmFtaWxpYXIgd2l0aCB0aGUgd29yayBuZWVkcyB0byB1bmRlcnN0YW5kIGFuZCBhc3Nlc3MgaXQsIGFzIGNvbmNpc2VseSBhcyB0aGF0IGNvbnRleHQgYWxsb3dzLlxuYDtcblxuLyoqXG4gKiBUaGUgdXNlci1sZXZlbCBzZXR0aW5ncyBtZXJnZWQgaW50byBlYWNoIGFnZW50J3MgSlNPTiBzZXR0aW5ncyBmaWxlLCByZWxhdGl2ZSB0byB0aGUgaG9tZVxuICogZGlyZWN0b3J5LlxuICpcbiAqIEV2ZXJ5IGFnZW50IHRoYXQgY2FycmllcyBmYWN0cyBmcm9tIG9uZSBzZXNzaW9uIGludG8gdGhlIG5leHQgaXMgdHVybmVkIG9mZiBoZXJlIGJlY2F1c2Ugc3VjaFxuICogbWVtb3J5IG1ha2VzIGEgc2Vzc2lvbiBkZXBlbmQgb24gaW52aXNpYmxlIG1hY2hpbmUtbG9jYWwgc3RhdGU6IGl0cyBiZWhhdmlvciBzdG9wcyBiZWluZ1xuICogcmVwcm9kdWNpYmxlIGFjcm9zcyBkZXZlbG9wZXJzIGFuZCBDSSwgYW5kIGEgc3RhbGUgb3Igd3JvbmcgbWVtb3J5IHNpbGVudGx5IG92ZXJyaWRlcyB0aGVcbiAqIGluc3RydWN0aW9uIGZpbGVzIGFib3ZlLiBDb2RleCBuZWVkcyBubyBlbnRyeSBiZWNhdXNlIGl0cyBtZW1vcmllcyBhcmUgb3B0LWluXG4gKiAoYFtmZWF0dXJlc10gbWVtb3JpZXMgPSB0cnVlYCBpbiBgfi8uY29kZXgvY29uZmlnLnRvbWxgKSwgc28gbGVhdmluZyB0aGF0IGZsYWcgdW5zZXQgaXMgZW5vdWdoLlxuICovXG5jb25zdCBhZ2VudFNldHRpbmdzID0gW1xuICB7XG4gICAgcmVsYXRpdmVQYXRoOiAnLmNsYXVkZS9zZXR0aW5ncy5qc29uJyxcbiAgICBhY2NlcHRzQ29tbWVudHM6IGZhbHNlLFxuICAgIC8qKlxuICAgICAqIENsYXVkZSBDb2RlIGluamVjdHMgaXRzIG93biBhdHRyaWJ1dGlvbiBkaXJlY3RpdmUgKGEgYENvLUF1dGhvcmVkLUJ5YCB0cmFpbGVyLCBhIFwiR2VuZXJhdGVkXG4gICAgICogd2l0aFwiIGZvb3RlciwgYW5kIGEgc2Vzc2lvbiBsaW5rKSBpbnRvIHRoZSB0b29sIGRlc2NyaXB0aW9ucyBhbmQgbWlkLXNlc3Npb24gcmVtaW5kZXJzLCBhbmRcbiAgICAgKiB0aGF0IGRpcmVjdGl2ZSBkZWNsYXJlcyBpdHNlbGYgdG8gcmVwbGFjZSBlYXJsaWVyIGd1aWRhbmNlLCBzbyB0aGUgaW5zdHJ1Y3Rpb24gZmlsZSBhbG9uZVxuICAgICAqIGNhbm5vdCBzdXBwcmVzcyBpdC4gT25seSB0aGlzIHNldHRpbmcgcmVtb3ZlcyB0aGUgZGlyZWN0aXZlIGF0IGl0cyBzb3VyY2UuIEF1dG8gbWVtb3J5IGlzIG9uXG4gICAgICogYnkgZGVmYXVsdCwgc28gaXQgbXVzdCBiZSB0dXJuZWQgb2ZmIGV4cGxpY2l0bHkuXG4gICAgICovXG4gICAgc2V0dGluZ3M6IHtcbiAgICAgIGF0dHJpYnV0aW9uOiB7XG4gICAgICAgIGNvbW1pdDogJycsXG4gICAgICAgIHByOiAnJyxcbiAgICAgICAgc2Vzc2lvblVybDogZmFsc2UsXG4gICAgICB9LFxuICAgICAgYXV0b01lbW9yeUVuYWJsZWQ6IGZhbHNlLFxuICAgIH0sXG4gIH0sXG4gIHtcbiAgICByZWxhdGl2ZVBhdGg6ICcuZ2VtaW5pL3NldHRpbmdzLmpzb24nLFxuICAgIC8vIEdlbWluaSBDTEkgc3RyaXBzIGNvbW1lbnRzIGJlZm9yZSBwYXJzaW5nIGl0cyBzZXR0aW5ncyBmaWxlLCB1bmxpa2UgQ2xhdWRlIENvZGUsIHdoaWNoXG4gICAgLy8gcmVqZWN0cyBhIGNvbW1lbnRlZCBmaWxlIGFzIG1hbGZvcm1lZC5cbiAgICBhY2NlcHRzQ29tbWVudHM6IHRydWUsXG4gICAgc2V0dGluZ3M6IHtcbiAgICAgIGV4cGVyaW1lbnRhbDoge1xuICAgICAgICBhdXRvTWVtb3J5OiBmYWxzZSxcbiAgICAgIH0sXG4gICAgfSxcbiAgfSxcbl0gYXMgY29uc3Q7XG5cbi8qKlxuICogT3ZlcndyaXRlcyB0aGUgdXNlci1sZXZlbCBpbnN0cnVjdGlvbiBmaWxlcyBvZiBldmVyeSBzdXBwb3J0ZWQgYWdlbnQgd2l0aCB0aGUgZml4ZWQgY29udGVudCBhbmRcbiAqIG1lcmdlcyB0aGUgZml4ZWQgc2V0dGluZ3MgaW50byBlYWNoIGFnZW50J3MgdXNlciBzZXR0aW5ncy4gUmV0dXJucyBmYWxzZSB3aGVuIGFueSBmaWxlIHdhc1xuICogc2tpcHBlZCAoZS5nLiBhIHN5bWxpbmtlZCBvciB1bnBhcnNhYmxlIGZpbGUpLCBzbyB0aGUgY29tbWFuZCBjYW4gZmFpbCBsb3VkbHkuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZW5lcmF0ZVVzZXJBZ2VudENvbmZpZ3MoKTogUHJvbWlzZTxib29sZWFuPiB7XG4gIGxldCBoYXNXcml0dGVuQWxsID0gdHJ1ZTtcbiAgZm9yIChjb25zdCByZWxhdGl2ZVBhdGggb2YgdXNlckFnZW50SW5zdHJ1Y3Rpb25GaWxlUGF0aHMpIHtcbiAgICBjb25zdCBoYXNXcml0dGVuID0gYXdhaXQgZnNVdGlsLmdlbmVyYXRlRmlsZShwYXRoLmpvaW4ob3MuaG9tZWRpcigpLCByZWxhdGl2ZVBhdGgpLCB1c2VyQWdlbnRJbnN0cnVjdGlvbkNvbnRlbnQpO1xuICAgIGhhc1dyaXR0ZW5BbGwgJiY9IGhhc1dyaXR0ZW47XG4gIH1cbiAgZm9yIChjb25zdCB7IGFjY2VwdHNDb21tZW50cywgcmVsYXRpdmVQYXRoLCBzZXR0aW5ncyB9IG9mIGFnZW50U2V0dGluZ3MpIHtcbiAgICAvLyBBd2FpdGVkIHNlcGFyYXRlbHk6IGAmJj1gIHdvdWxkIHNraXAgdGhlIG1lcmdlIG9uY2UgYW4gZWFybGllciBmaWxlIHdhcyBza2lwcGVkLlxuICAgIGNvbnN0IGhhc01lcmdlZCA9IGF3YWl0IG1lcmdlQWdlbnRTZXR0aW5ncyhyZWxhdGl2ZVBhdGgsIHNldHRpbmdzLCBhY2NlcHRzQ29tbWVudHMpO1xuICAgIGhhc1dyaXR0ZW5BbGwgJiY9IGhhc01lcmdlZDtcbiAgfVxuICByZXR1cm4gaGFzV3JpdHRlbkFsbDtcbn1cblxuYXN5bmMgZnVuY3Rpb24gbWVyZ2VBZ2VudFNldHRpbmdzKFxuICByZWxhdGl2ZVBhdGg6IHN0cmluZyxcbiAgbmV3U2V0dGluZ3M6IG9iamVjdCxcbiAgYWNjZXB0c0NvbW1lbnRzOiBib29sZWFuXG4pOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgY29uc3QgZmlsZVBhdGggPSBwYXRoLmpvaW4ob3MuaG9tZWRpcigpLCByZWxhdGl2ZVBhdGgpO1xuICBjb25zdCBleGlzdGluZ0NvbnRlbnQgPSBhd2FpdCBmc1V0aWwucmVhZEZpbGVJZkV4aXN0cyhmaWxlUGF0aCk7XG4gIGxldCBleGlzdGluZ1NldHRpbmdzOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9IHt9O1xuICBpZiAoZXhpc3RpbmdDb250ZW50ICE9PSB1bmRlZmluZWQpIHtcbiAgICAvLyBBbiBhZ2VudCBpZ25vcmVzIGl0cyB3aG9sZSBzZXR0aW5ncyBmaWxlIHdoZW4gdGhlIGZpbGUgYnJlYWtzIHRoZSBncmFtbWFyIHRoZSBhZ2VudCByZWFkcyBpdFxuICAgIC8vIHdpdGgsIHNvIHdiZnkgbGVhdmVzIHN1Y2ggYSBmaWxlIHRvIHRoZSBkZXZlbG9wZXIgdG8gcmVwYWlyIHJhdGhlciB0aGFuIHJld3JpdGluZyBpdCBpbnRvIGFcbiAgICAvLyBmaWxlIHRoZSBhZ2VudCBzdGlsbCBpZ25vcmVzOiBjb21tZW50cyBhcmUgdG9sZXJhdGVkIG9ubHkgd2hlcmUgdGhlIGFnZW50IHN0cmlwcyB0aGVtLCBhbmRcbiAgICAvLyB0cmFpbGluZyBjb21tYXMgbm93aGVyZSwgc2luY2UgYm90aCBhZ2VudHMgcGFyc2Ugd2l0aCBKU09OLnBhcnNlIGluIHRoZSBlbmQuIENvbW1lbnQtb25seVxuICAgIC8vIGNvbnRlbnQgaXMgY2hlY2tlZCB0b28sIGJlY2F1c2UgaXQgaXMga2VwdCBhcyBhIGhlYWRlciBhYm92ZSB0aGUgZ2VuZXJhdGVkIG9iamVjdC5cbiAgICBpZiAoIWFjY2VwdHNDb21tZW50cyAmJiBqc29uY1V0aWwuY29udGFpbnNDb21tZW50KGV4aXN0aW5nQ29udGVudCkpIHtcbiAgICAgIGNvbnNvbGUud2FybihgU2tpcHBlZCB1cGRhdGluZyAke2ZpbGVQYXRofSBiZWNhdXNlIHRoaXMgYWdlbnQgcmVhZHMgaXQgYXMgc3RyaWN0IEpTT04sIGNvbW1lbnRzIGFuZCBhbGwuYCk7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGlmICghanNvbmNVdGlsLmlzVHJpdmlhT25seShleGlzdGluZ0NvbnRlbnQpKSB7XG4gICAgICBjb25zdCBwYXJzZWRTZXR0aW5ncyA9IGpzb25jVXRpbC5wYXJzZU9iamVjdElnbm9yaW5nRXJyb3I8UmVjb3JkPHN0cmluZywgdW5rbm93bj4+KGV4aXN0aW5nQ29udGVudCwgZmFsc2UpO1xuICAgICAgaWYgKCFwYXJzZWRTZXR0aW5ncykge1xuICAgICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgICAgYFNraXBwZWQgdXBkYXRpbmcgJHtmaWxlUGF0aH0gYmVjYXVzZSB0aGUgZXhpc3RpbmcgY29udGVudCBpcyBub3QgYSBzdHJpY3QgSlNPTiBvYmplY3QgKGEgdHJhaWxpbmcgY29tbWEsIGZvciBleGFtcGxlLCBpcyBub3QgYWxsb3dlZCkuYFxuICAgICAgICApO1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgICBleGlzdGluZ1NldHRpbmdzID0gcGFyc2VkU2V0dGluZ3M7XG4gICAgfVxuICB9XG4gIGNvbnN0IHNldHRpbmdzID0gbWVyZ2UoZXhpc3RpbmdTZXR0aW5ncywgbmV3U2V0dGluZ3MpO1xuICAvLyBPbmx5IHRoZSBwcm9wZXJ0aWVzIHdob3NlIHZhbHVlIGNoYW5nZXMgYXJlIHJld3JpdHRlbiwgc28gdGhlIGZpbGUga2VlcHMgaXRzIG93biBmb3JtYXR0aW5nXG4gIC8vIGFuZCwgd2hlcmUgdGhlIGFnZW50IGFsbG93cyB0aGVtLCBpdHMgY29tbWVudHMuXG4gIGNvbnN0IHsgY29udGVudCwga2V5c0xvc2luZ0NvbW1lbnRzIH0gPSBqc29uY1V0aWwuc3RyaW5naWZ5UHJlc2VydmluZ1RyaXZpYShleGlzdGluZ0NvbnRlbnQsIHNldHRpbmdzKTtcbiAgaWYgKCEoYXdhaXQgZnNVdGlsLmdlbmVyYXRlRmlsZShmaWxlUGF0aCwgY29udGVudCkpKSByZXR1cm4gZmFsc2U7XG5cbiAgZm9yIChjb25zdCBrZXkgb2Yga2V5c0xvc2luZ0NvbW1lbnRzKSB7XG4gICAgY29uc29sZS53YXJuKGBDb21tZW50cyBpbnNpZGUgXCIke2tleX1cIiB3ZXJlIGRyb3BwZWQgd2hpbGUgcmV3cml0aW5nIGl0IGluICR7ZmlsZVBhdGh9LmApO1xuICB9XG4gIHJldHVybiB0cnVlO1xufVxuIiwiaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IG1lcmdlIGZyb20gJ2RlZXBtZXJnZSc7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGZzVXRpbCB9IGZyb20gJy4uL3V0aWxzL2ZzVXRpbC5qcyc7XG5pbXBvcnQgeyBqc29uY1V0aWwgfSBmcm9tICcuLi91dGlscy9qc29uY1V0aWwuanMnO1xuaW1wb3J0IHsgc29ydEtleXMgfSBmcm9tICcuLi91dGlscy9vYmplY3RVdGlsLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuXG5jb25zdCBleGNsdWRlRmlsZVBhdHRlcm5zID0gW1xuICAnKiovLmdpdC9vYmplY3RzLyoqJyxcbiAgJyoqLy5naXQvc3VidHJlZS1jYWNoZS8qKicsXG4gICcqKi9ub2RlX21vZHVsZXMvKionLFxuICAnKiovdG1wLyoqJyxcbiAgJyoqL3RlbXAvKionLFxuICAnKiovZGlzdC8qKicsXG5dO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVWc2NvZGVTZXR0aW5ncyhjb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdnZW5lcmF0ZVZzY29kZVNldHRpbmdzJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnLnZzY29kZScsICdzZXR0aW5ncy5qc29uJyk7XG4gICAgY29uc3QgZXhpc3RpbmdDb250ZW50ID0gYXdhaXQgZnNVdGlsLnJlYWRGaWxlSWZFeGlzdHMoZmlsZVBhdGgpO1xuICAgIGlmIChleGlzdGluZ0NvbnRlbnQgPT09IHVuZGVmaW5lZCB8fCBqc29uY1V0aWwuaXNUcml2aWFPbmx5KGV4aXN0aW5nQ29udGVudCkpIHJldHVybjtcbiAgICAvLyAudnNjb2RlL3NldHRpbmdzLmpzb24gaXMgSlNPTkMgYnkgZGVmaW5pdGlvbjsgSlNPTi5wYXJzZSB3b3VsZCBtYWtlIHdiZnkgc2lsZW50bHkgc2tpcFxuICAgIC8vIGNvbW1lbnRlZCBmaWxlcy5cbiAgICBjb25zdCBwYXJzZWRTZXR0aW5ncyA9IGpzb25jVXRpbC5wYXJzZU9iamVjdElnbm9yaW5nRXJyb3I8b2JqZWN0PihleGlzdGluZ0NvbnRlbnQpO1xuICAgIGlmICghcGFyc2VkU2V0dGluZ3MpIHtcbiAgICAgIGNvbnNvbGUud2FybihgU2tpcHBlZCB1cGRhdGluZyAke2ZpbGVQYXRofSBiZWNhdXNlIHRoZSBleGlzdGluZyBjb250ZW50IGlzIG5vdCBwYXJzYWJsZSBhcyBKU09OQy5gKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3Qgb3JpZ2luYWxTZXR0aW5nc0pzb24gPSBKU09OLnN0cmluZ2lmeShzb3J0S2V5cyhzdHJ1Y3R1cmVkQ2xvbmUocGFyc2VkU2V0dGluZ3MpIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KSk7XG4gICAgbGV0IHNldHRpbmdzID0gcGFyc2VkU2V0dGluZ3M7XG4gICAgZm9yIChjb25zdCBleGNsdWRlRmlsZVBhdHRlcm4gb2YgZXhjbHVkZUZpbGVQYXR0ZXJucykge1xuICAgICAgc2V0dGluZ3MgPSBtZXJnZS5hbGwoW3NldHRpbmdzLCBleGNsdWRlU2V0dGluZyhleGNsdWRlRmlsZVBhdHRlcm4pXSk7XG4gICAgfVxuICAgIGlmIChjb25maWcuZG9lc0NvbnRhaW5Qb2V0cnlMb2NrIHx8IGNvbmZpZy5kb2VzQ29udGFpblV2TG9jaykge1xuICAgICAgc2V0dGluZ3MgPSBtZXJnZS5hbGwoW3NldHRpbmdzLCBleGNsdWRlU2V0dGluZygnKiovLnZlbnYvKionKV0pO1xuICAgIH1cbiAgICBpZiAoY29uZmlnLmRlcGVuZGluZy5uZXh0KSB7XG4gICAgICBzZXR0aW5ncyA9IG1lcmdlLmFsbChbc2V0dGluZ3MsIGV4Y2x1ZGVTZXR0aW5nKCcqKi8ubmV4dC8qKicpXSk7XG4gICAgfVxuICAgIHNvcnRLZXlzKHNldHRpbmdzIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KTtcbiAgICAvLyBTa2lwIHRoZSB3cml0ZSB3aGVuIG5vdGhpbmcgY2hhbmdlcyBzZW1hbnRpY2FsbHksIHNvIEpTT05DIGNvbW1lbnRzIGFuZCBmb3JtYXR0aW5nIGluIGFuXG4gICAgLy8gYWxyZWFkeS1jbGVhbiBzZXR0aW5ncy5qc29uIHN1cnZpdmUgd2JmeSBydW5zLlxuICAgIGlmIChKU09OLnN0cmluZ2lmeShzZXR0aW5ncykgPT09IG9yaWdpbmFsU2V0dGluZ3NKc29uKSByZXR1cm47XG4gICAgY29uc3QgbmV3Q29udGVudCA9IEpTT04uc3RyaW5naWZ5KHNldHRpbmdzLCB1bmRlZmluZWQsIDIpO1xuICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiBmc1V0aWwuZ2VuZXJhdGVGaWxlKGZpbGVQYXRoLCBuZXdDb250ZW50KSk7XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBleGNsdWRlU2V0dGluZyhleGNsdWRlRmlsZVBhdHRlcm46IHN0cmluZyk6IG9iamVjdCB7XG4gIHJldHVybiB7XG4gICAgJ2ZpbGVzLndhdGNoZXJFeGNsdWRlJzoge1xuICAgICAgW2V4Y2x1ZGVGaWxlUGF0dGVybl06IHRydWUsXG4gICAgfSxcbiAgfTtcbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGZzVXRpbCB9IGZyb20gJy4uL3V0aWxzL2ZzVXRpbC5qcyc7XG5cbmludGVyZmFjZSBGbm94VG9tbFN1YnRyZWUge1xuICBzZWNyZXRzPzogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gIHByb2ZpbGVzPzogUmVjb3JkPHN0cmluZywgeyBzZWNyZXRzPzogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gfSB8IHVuZGVmaW5lZD47XG59XG5cbi8vIFRoZSBmb3VyIHN0YW5kYXJkIFdCX0VOViBtb2Rlczsgc3RhZ2luZyBpcyBvcHRpb25hbCBhbmQgb25seSBjb21wbGV0ZWQgd2hlbiB0aGUgcmVwb3NpdG9yeVxuLy8gYWxyZWFkeSBkZWNsYXJlcyB0aGUgc3RhZ2luZyBwcm9maWxlLlxuY29uc3Qgd2JFbnZNb2RlcyA9IFsnZGV2ZWxvcG1lbnQnLCAndGVzdCcsICdzdGFnaW5nJywgJ3Byb2R1Y3Rpb24nXSBhcyBjb25zdDtcbnR5cGUgV2JFbnZNb2RlID0gKHR5cGVvZiB3YkVudk1vZGVzKVtudW1iZXJdO1xuXG4vKipcbiAqIEVuc3VyZXMgYSBmbm94IHJlcG9zaXRvcnkgZGVmaW5lcyBXQl9FTlYgZm9yIGV2ZXJ5IHN0YW5kYXJkIG1vZGUgKGFuZCBORVhUX1BVQkxJQ19XQl9FTlYgd2hlblxuICogYW55IHdvcmtzcGFjZSBkZXBlbmRzIG9uIE5leHQuanMgb3IgdmluZXh0KSBpbiBmbm94LnRvbWwgcHJvZmlsZXMuIEV4aXN0aW5nIGRlZmluaXRpb25zIGFyZVxuICogYWx3YXlzIGxlZnQgdW50b3VjaGVkLiBOb24tZm5veCByZXBvc2l0b3JpZXMgYXJlIHNraXBwZWQ6IC5lbnYgZmlsZXMgYXJlIG5vIGxvbmdlciBtYW5hZ2VkLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZW5zdXJlV2JFbnZEZWZpbml0aW9ucyhyb290Q29uZmlnOiBQYWNrYWdlQ29uZmlnLCBhbGxDb25maWdzOiBQYWNrYWdlQ29uZmlnW10pOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdlbnN1cmVXYkVudkRlZmluaXRpb25zJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IG5lZWRzTmV4dFB1YmxpYyA9IGFsbENvbmZpZ3Muc29tZSgoY29uZmlnKSA9PiByZXF1aXJlc05leHRQdWJsaWNXYkVudihjb25maWcpKTtcbiAgICBjb25zdCBmbm94VG9tbFBhdGggPSBwYXRoLnJlc29sdmUocm9vdENvbmZpZy5kaXJQYXRoLCAnZm5veC50b21sJyk7XG4gICAgLy8gbHN0YXQsIG5vdCBleGlzdHNTeW5jOiBleGlzdHNTeW5jIGlzIGZhbHNlIGZvciBhIERBTkdMSU5HIGZub3gudG9tbCBzeW1saW5rOyBhbnkgZm5veC50b21sXG4gICAgLy8gZGlyZWN0b3J5IGVudHJ5IG1hcmtzIGEgZm5veCByZXBvc2l0b3J5LCBhbmQgYSByZWZ1c2VkL2RhbmdsaW5nIG9uZSBhYm9ydHMgaW5zdGVhZCBvZlxuICAgIC8vIGJlaW5nIHRyZWF0ZWQgYXMgYSBub24tZm5veCByZXBvc2l0b3J5IHdoaWxlIHRoZSBmbm94IHN5bmNocm9uaXphdGlvbiBpcyBmYWlsaW5nLlxuICAgIGlmICghKGF3YWl0IGZzLnByb21pc2VzLmxzdGF0KGZub3hUb21sUGF0aCkuY2F0Y2goKCkgPT4ge30pKSkgcmV0dXJuO1xuICAgIGNvbnN0IGNvbnRlbnQgPSBhd2FpdCBmc1V0aWwucmVhZEZpbGVDb25maW5lZElmRXhpc3RzKGZub3hUb21sUGF0aCk7XG4gICAgaWYgKGNvbnRlbnQgPT09IHVuZGVmaW5lZCkgcmV0dXJuO1xuICAgIGNvbnN0IHVwZGF0ZWRDb250ZW50ID0gaW5zZXJ0V2JFbnZJbnRvRm5veFRvbWwoY29udGVudCwgbmVlZHNOZXh0UHVibGljKTtcbiAgICBpZiAodXBkYXRlZENvbnRlbnQgIT09IHVuZGVmaW5lZCAmJiB1cGRhdGVkQ29udGVudCAhPT0gY29udGVudCkge1xuICAgICAgYXdhaXQgZnNVdGlsLmdlbmVyYXRlRmlsZShmbm94VG9tbFBhdGgsIHVwZGF0ZWRDb250ZW50KTtcbiAgICB9XG4gIH0pO1xufVxuXG4vKipcbiAqIE1pcnJvcnMgd2IncyByZXF1aXJlc05leHRQdWJsaWNXYkVudiBjb250cmFjdCAocGFja2FnZXMvd2Ivc3JjL3Byb2plY3QudHMpOiB0aGUgZnJhbWV3b3JrIG1heVxuICogYmUgZGVjbGFyZWQgaW4gQU5ZIG9mIHRoZSBmb3VyIGRlcGVuZGVuY3kgc2VjdGlvbnMgKGUuZy4gYG5leHRgIGFzIGEgZGV2RGVwZW5kZW5jeSBpbiBhIHNoYXJlZFxuICogY29tcG9uZW50IGxpYnJhcnkpLCB3aGlsZSB3YmZ5J3MgYGRlcGVuZGluZy5uZXh0YCBsb29rcyBvbmx5IGF0IHJlZ3VsYXIgZGVwZW5kZW5jaWVzLlxuICovXG5mdW5jdGlvbiByZXF1aXJlc05leHRQdWJsaWNXYkVudihjb25maWc6IFBhY2thZ2VDb25maWcpOiBib29sZWFuIHtcbiAgcmV0dXJuIFsnZGVwZW5kZW5jaWVzJywgJ2RldkRlcGVuZGVuY2llcycsICdvcHRpb25hbERlcGVuZGVuY2llcycsICdwZWVyRGVwZW5kZW5jaWVzJ10uc29tZSgoc2VjdGlvbikgPT4ge1xuICAgIGNvbnN0IGRlcGVuZGVuY2llcyA9IGNvbmZpZy5wYWNrYWdlSnNvbj8uW3NlY3Rpb24gYXMgJ2RlcGVuZGVuY2llcyddO1xuICAgIHJldHVybiAhIWRlcGVuZGVuY2llcz8uWyduZXh0J10gfHwgISFkZXBlbmRlbmNpZXM/LlsndmluZXh0J107XG4gIH0pO1xufVxuXG4vKipcbiAqIEluc2VydHMgbWlzc2luZyBXQl9FTlYgKGFuZCBvcHRpb25hbGx5IE5FWFRfUFVCTElDX1dCX0VOVikgZW50cmllcyBpbnRvIGEgZm5veC50b21sOiB0aGUgYmFzZVxuICogYFtzZWNyZXRzXWAgdGFibGUgY2FycmllcyB0aGUgZGV2ZWxvcG1lbnQgZGVmYXVsdHMgYW5kIGBbcHJvZmlsZXMuPG1vZGU+LnNlY3JldHNdYCBvdmVybGF5c1xuICogZWFjaCBvdGhlciBtb2RlLCBtYXRjaGluZyB0aGUgb3JnLXN0YW5kYXJkIGxheW91dC4gRm9ybWF0dGluZyBhbmQgY29tbWVudHMgYXJlIHByZXNlcnZlZDsgb25seVxuICogbWlzc2luZyBsaW5lcyBhcmUgaW5zZXJ0ZWQgb3IgbWlzc2luZyBzZWN0aW9ucyBhcHBlbmRlZC4gUmV0dXJucyB1bmRlZmluZWQgd2hlbiB0aGUgY29udGVudFxuICogY2Fubm90IGJlIHNhZmVseSBlZGl0ZWQgKHVucGFyc2FibGUgYmVmb3JlIG9yIGFmdGVyIHRoZSBlZGl0KS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGluc2VydFdiRW52SW50b0Zub3hUb21sKGNvbnRlbnQ6IHN0cmluZywgbmVlZHNOZXh0UHVibGljOiBib29sZWFuKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgbGV0IHNldHRpbmdzOiBGbm94VG9tbFN1YnRyZWU7XG4gIHRyeSB7XG4gICAgc2V0dGluZ3MgPSBCdW4uVE9NTC5wYXJzZShjb250ZW50KSBhcyBGbm94VG9tbFN1YnRyZWU7XG4gIH0gY2F0Y2gge1xuICAgIGNvbnNvbGUud2FybignU2tpcHBlZCBpbnNlcnRpbmcgV0JfRU5WIGludG8gZm5veC50b21sIGJlY2F1c2UgaXQgaXMgbm90IHBhcnNhYmxlIGFzIFRPTUwuJyk7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuXG4gIGNvbnN0IGtleU5hbWVzID0gbmVlZHNOZXh0UHVibGljID8gWydXQl9FTlYnLCAnTkVYVF9QVUJMSUNfV0JfRU5WJ10gOiBbJ1dCX0VOViddO1xuICBsZXQgdXBkYXRlZENvbnRlbnQgPSBjb250ZW50O1xuICBmb3IgKGNvbnN0IG1vZGUgb2Ygd2JFbnZNb2Rlcykge1xuICAgIC8vIFRoZSBzdGFnaW5nIG1vZGUgaXMgb3B0aW9uYWw6IGNvbXBsZXRlIGl0IG9ubHkgd2hlbiB0aGUgcmVwb3NpdG9yeSBhbHJlYWR5IGRlY2xhcmVzIHRoZSBwcm9maWxlLlxuICAgIGlmIChtb2RlID09PSAnc3RhZ2luZycgJiYgIXNldHRpbmdzLnByb2ZpbGVzPy5zdGFnaW5nKSBjb250aW51ZTtcbiAgICBjb25zdCBkZWZpbmVkS2V5cyA9IG1vZGUgPT09ICdkZXZlbG9wbWVudCcgPyBzZXR0aW5ncy5zZWNyZXRzIDogc2V0dGluZ3MucHJvZmlsZXM/Llttb2RlXT8uc2VjcmV0cztcbiAgICBmb3IgKGNvbnN0IGtleU5hbWUgb2Yga2V5TmFtZXMpIHtcbiAgICAgIGNvbnN0IGRlZmluZWQgPSBkZWZpbmVkS2V5cz8uW2tleU5hbWVdO1xuICAgICAgY29uc3QgZGVmaW5lZFZhbHVlID1cbiAgICAgICAgdHlwZW9mIGRlZmluZWQgPT09ICdzdHJpbmcnID8gZGVmaW5lZCA6IChkZWZpbmVkIGFzIHsgZGVmYXVsdD86IHVua25vd24gfSB8IHVuZGVmaW5lZCk/LmRlZmF1bHQ7XG4gICAgICB3YXJuT25VbmV4cGVjdGVkV2JFbnZWYWx1ZShrZXlOYW1lLCBkZWZpbmVkVmFsdWUsIG1vZGUpO1xuICAgIH1cbiAgICBjb25zdCBtaXNzaW5nTGluZXMgPSBrZXlOYW1lc1xuICAgICAgLmZpbHRlcigoa2V5TmFtZSkgPT4gZGVmaW5lZEtleXM/LltrZXlOYW1lXSA9PT0gdW5kZWZpbmVkKVxuICAgICAgLm1hcCgoa2V5TmFtZSkgPT4gYCR7a2V5TmFtZX0gPSB7IGRlZmF1bHQgPSBcIiR7bW9kZX1cIiB9YCk7XG4gICAgaWYgKG1pc3NpbmdMaW5lcy5sZW5ndGggPT09IDApIGNvbnRpbnVlO1xuICAgIHVwZGF0ZWRDb250ZW50ID0gaW5zZXJ0SW50b0Zub3hTZWN0aW9uKFxuICAgICAgdXBkYXRlZENvbnRlbnQsXG4gICAgICBtb2RlID09PSAnZGV2ZWxvcG1lbnQnID8gJ3NlY3JldHMnIDogYHByb2ZpbGVzLiR7bW9kZX0uc2VjcmV0c2AsXG4gICAgICBtaXNzaW5nTGluZXNcbiAgICApO1xuICB9XG4gIGlmICh1cGRhdGVkQ29udGVudCA9PT0gY29udGVudCkgcmV0dXJuIGNvbnRlbnQ7XG5cbiAgLy8gUmUtcGFyc2UgYmVmb3JlIHJldHVybmluZzogYW4gdW51c3VhbCBsYXlvdXQgKGUuZy4gZG90dGVkIGtleXMgd2l0aG91dCBhIHRhYmxlIGhlYWRlcikgY291bGRcbiAgLy8gbWFrZSB0aGUgdGV4dHVhbCBlZGl0IHByb2R1Y2UgYSBkdXBsaWNhdGUgdGFibGU7IGZhaWwgc2FmZWx5IGluc3RlYWQgb2YgY29ycnVwdGluZyB0aGUgZmlsZS5cbiAgdHJ5IHtcbiAgICBjb25zdCB1cGRhdGVkU2V0dGluZ3MgPSBCdW4uVE9NTC5wYXJzZSh1cGRhdGVkQ29udGVudCkgYXMgRm5veFRvbWxTdWJ0cmVlO1xuICAgIGZvciAoY29uc3QgbW9kZSBvZiB3YkVudk1vZGVzKSB7XG4gICAgICBpZiAobW9kZSA9PT0gJ3N0YWdpbmcnICYmICFzZXR0aW5ncy5wcm9maWxlcz8uc3RhZ2luZykgY29udGludWU7XG4gICAgICBjb25zdCBkZWZpbmVkS2V5cyA9IG1vZGUgPT09ICdkZXZlbG9wbWVudCcgPyB1cGRhdGVkU2V0dGluZ3Muc2VjcmV0cyA6IHVwZGF0ZWRTZXR0aW5ncy5wcm9maWxlcz8uW21vZGVdPy5zZWNyZXRzO1xuICAgICAgaWYgKGtleU5hbWVzLnNvbWUoKGtleU5hbWUpID0+IGRlZmluZWRLZXlzPy5ba2V5TmFtZV0gPT09IHVuZGVmaW5lZCkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGB0aGUgaW5zZXJ0ZWQgJHttb2RlfSBlbnRyaWVzIGRpZCBub3QgdGFrZSBlZmZlY3RgKTtcbiAgICAgIH1cbiAgICB9XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgY29uc29sZS53YXJuKGBTa2lwcGVkIGluc2VydGluZyBXQl9FTlYgaW50byBmbm94LnRvbWwgYmVjYXVzZSAkeyhlcnJvciBhcyBFcnJvcikubWVzc2FnZX0uYCk7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuICByZXR1cm4gdXBkYXRlZENvbnRlbnQ7XG59XG5cbi8qKlxuICogV2FybnMgd2hlbiBhbiBleGlzdGluZyBXQl9FTlYtZmFtaWx5IGRlZmluaXRpb24gbmFtZXMgYSBkaWZmZXJlbnQgbW9kZSB0aGFuIHRoZSBvbmUgaXQgaXNcbiAqIGRlZmluZWQgZm9yIChhIHR5cG8gbGlrZSBgcHJvZGN1dGlvbmAgb3IgYHByb2R1Y3Rpb24xYCwgb3IgYSBjb3B5LXBhc3RlZCB3cm9uZyBtb2RlKTogd2JcbiAqIHJlamVjdHMgbm9uLXN0YW5kYXJkIHZhbHVlcyBhdCBydW50aW1lLCBzbyBzdXJmYWNpbmcgdGhlIG1pc21hdGNoIGR1cmluZyB3YmZ5IGlzIHRoZSBlYXJsaWVzdFxuICogcG9zc2libGUgc2lnbmFsLiBUaGUgcGFzc2VkIHZhbHVlIGlzIGFsd2F5cyBwbGFpbnRleHQgKGEgZm5veCBgZGVmYXVsdGAgZmllbGQpIOKAlCBlbmNyeXB0ZWRcbiAqIGZub3ggZW50cmllcyBhcmUgYHsgcHJvdmlkZXIsIHZhbHVlIH1gIG9iamVjdHMgd2hvc2UgYGRlZmF1bHRgIGlzIGFic2VudC5cbiAqL1xuZnVuY3Rpb24gd2Fybk9uVW5leHBlY3RlZFdiRW52VmFsdWUoa2V5TmFtZTogc3RyaW5nLCB2YWx1ZTogdW5rbm93biwgbW9kZTogV2JFbnZNb2RlKTogdm9pZCB7XG4gIC8vIEFuIEVNUFRZIHZhbHVlIGNvdW50cyBhcyB1bnNldCAod2Igc3VwcGxpZXMgdGhlIGZhbGxiYWNrIG1vZGUpLCBub3QgYXMgYSBtaXNtYXRjaGluZyBtb2RlLlxuICBpZiAodHlwZW9mIHZhbHVlICE9PSAnc3RyaW5nJyB8fCB2YWx1ZSA9PT0gJycgfHwgdmFsdWUgPT09IG1vZGUpIHJldHVybjtcbiAgLy8gQSBkeW5hbWljIHZhbHVlIChlLmcuIGBORVhUX1BVQkxJQ19XQl9FTlY9JHtXQl9FTlZ9YCkgbWF5IGxlZ2l0aW1hdGVseSByZXNvbHZlIHRvIHRoZSBtb2RlXG4gIC8vIHRocm91Z2ggZXhwYW5zaW9uLCB3aGljaCB0aGlzIHN0YXRpYyBjaGVjayBjYW5ub3QgZXZhbHVhdGUg4oCUIHNraXAgaW5zdGVhZCBvZiBtaXNmaXJpbmcuXG4gIC8vIGZub3ggZXhwYW5kcyBvbmx5IGAkey4uLn1gIChhIGJhcmUgYCRVTlNFVGAgc3RheXMgbGl0ZXJhbCkuXG4gIGlmICh2YWx1ZS5pbmNsdWRlcygnJHsnKSkgcmV0dXJuO1xuICBpZiAoa2V5TmFtZSA9PT0gJ05FWFRfUFVCTElDX1dCX0VOVicpIHtcbiAgICBjb25zb2xlLndhcm4oXG4gICAgICBgJHtrZXlOYW1lfSBpbiBmbm94LnRvbWwgaXMgXCIke3ZhbHVlfVwiIGJ1dCBzaG91bGQgYmUgXCIke21vZGV9XCIgZm9yIHRoZSAke21vZGV9IG1vZGU7IHdiIG92ZXJyaWRlcyBpdCB3aXRoIFdCX0VOViwgYnV0IGEgZGlyZWN0IGZyYW1ld29yayBidWlsZCB3b3VsZCBpbmxpbmUgdGhpcyB2YWx1ZS5gXG4gICAgKTtcbiAgICByZXR1cm47XG4gIH1cbiAgY29uc29sZS53YXJuKFxuICAgIGAke2tleU5hbWV9IGluIGZub3gudG9tbCBpcyBcIiR7dmFsdWV9XCIgYnV0IHNob3VsZCBiZSBcIiR7bW9kZX1cIiBmb3IgdGhlICR7bW9kZX0gbW9kZTsgd2IgcmVqZWN0cyB2YWx1ZXMgb3V0c2lkZSBkZXZlbG9wbWVudC90ZXN0L3N0YWdpbmcvcHJvZHVjdGlvbi5gXG4gICk7XG59XG5cbi8qKlxuICogSW5zZXJ0cyBsaW5lcyBhdCB0aGUgdG9wIG9mIGEgVE9NTCBzZWN0aW9uLCByaWdodCBhZnRlciBpdHMgYFtoZWFkZXJdYCBsaW5lIHNvIHByb2ZpbGUtc3BlY2lmaWNcbiAqIGVudHJpZXMgc3RheSBncm91cGVkIHdpdGggdGhlaXIgaGVhZGVyOyB0aGUgc2VjdGlvbiBpcyBhcHBlbmRlZCBhdCB0aGUgZW5kIHdoZW4gaXQgaXMgYWJzZW50LlxuICovXG5mdW5jdGlvbiBpbnNlcnRJbnRvRm5veFNlY3Rpb24oY29udGVudDogc3RyaW5nLCBzZWN0aW9uTmFtZTogc3RyaW5nLCBpbnNlcnRlZExpbmVzOiBzdHJpbmdbXSk6IHN0cmluZyB7XG4gIC8vIHdiZnkgd3JpdGVzIHRoZSBoZWFkZXIgd2l0aG91dCB3aGl0ZXNwYWNlIGFyb3VuZCB0aGUgZG90dGVkLWtleSBjb21wb25lbnRzLlxuICBjb25zdCBoZWFkZXJQYXR0ZXJuID0gbmV3IFJlZ0V4cChTdHJpbmcucmF3YF5cXHMqXFxbJHtzZWN0aW9uTmFtZS5yZXBsYWNlQWxsKCcuJywgU3RyaW5nLnJhd2BcXC5gKX1cXF1cXHMqKD86Iy4qKT8kYCwgJ3UnKTtcbiAgY29uc3QgbGluZXMgPSBjb250ZW50LnNwbGl0KCdcXG4nKTtcbiAgY29uc3QgaGVhZGVySW5kZXggPSBsaW5lcy5maW5kSW5kZXgoKGxpbmUpID0+IGhlYWRlclBhdHRlcm4udGVzdChsaW5lKSk7XG4gIGlmIChoZWFkZXJJbmRleCA9PT0gLTEpIHtcbiAgICByZXR1cm4gYCR7Y29udGVudC50cmltRW5kKCl9XFxuXFxuWyR7c2VjdGlvbk5hbWV9XVxcbiR7aW5zZXJ0ZWRMaW5lcy5qb2luKCdcXG4nKX1cXG5gO1xuICB9XG4gIHJldHVybiBbLi4ubGluZXMuc2xpY2UoMCwgaGVhZGVySW5kZXggKyAxKSwgLi4uaW5zZXJ0ZWRMaW5lcywgLi4ubGluZXMuc2xpY2UoaGVhZGVySW5kZXggKyAxKV0uam9pbignXFxuJyk7XG59XG4iLCIvLyBHaXRIdWIgQWN0aW9ucyB2YWx1ZWxlc3MgZXZlbnRzIHN1Y2ggYXMgYHB1bGxfcmVxdWVzdDpgIHJlcXVpcmUgWUFNTCBudWxsIHZhbHVlcy5cbi8qIGVzbGludC1kaXNhYmxlIHVuaWNvcm4vbm8tbnVsbCAqL1xuXG5pbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgKiBhcyB5YW1sIGZyb20gJ2pzLXlhbWwnO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBmc1V0aWwgfSBmcm9tICcuLi91dGlscy9mc1V0aWwuanMnO1xuaW1wb3J0IHsgcHJvbWlzZVBvb2wgfSBmcm9tICcuLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5cbi8qKlxuICogUmVwb3NpdG9yaWVzIG91dHNpZGUgV2lsbEJvb3N0ZXIgLyBXaWxsQm9vc3RlckxhYiBjYW5ub3QgY2FsbCB0aGUgb3JnYW5pemF0aW9uJ3MgcmV1c2FibGVcbiAqIHdvcmtmbG93czogdGhvc2Ugd29ya2Zsb3dzIGRlcGVuZCBvbiBvcmdhbml6YXRpb24gc2VjcmV0cyAoVkVSREFDQ0lPX1RPS0VOLCBEaXNjb3JkIHdlYmhvb2tzKVxuICogYW5kIHNlbGYtaG9zdGVkIHJ1bm5lcnMgdGhhdCBvdGhlciBvd25lcnMgZG8gbm90IGhhdmUuIFRoaXMgZ2VuZXJhdG9yIGluc3RlYWQgZW1pdHNcbiAqIHNlbGYtY29udGFpbmVkIHdvcmtmbG93cyBidWlsdCBvbmx5IGZyb20gd2hhdCBhbnkgcmVwb3NpdG9yeSBvd25lciBjYW4gcHJvdmlkZTogdGhlIHJlcG9zaXRvcnlcbiAqIGNvbnRlbnRzIChtaXNlLnRvbWwsIHBhY2thZ2UuanNvbiBzY3JpcHRzKSBhbmQgdGhlIHNpbmdsZSBgRk5PWF9BR0VfS0VZYCByZXBvc2l0b3J5IHNlY3JldCB3aGVuXG4gKiB0aGUgcmVwb3NpdG9yeSB1c2VzIGZub3guIEdlbmVyYXRpb24gaXMga2V5ZWQgb24gcmVwb3NpdG9yeSBzdGF0ZSwgbmV2ZXIgb24gdGhlIG93bmVyJ3NcbiAqIGlkZW50aXR5LCBzbyBpdCB3b3JrcyBmb3IgYXJiaXRyYXJ5IHBlcnNvbmFsIHJlcG9zaXRvcmllcy5cbiAqL1xuXG4vKiogRmlyc3QgbGluZSBvZiBldmVyeSBnZW5lcmF0ZWQgZmlsZTsgZmlsZXMgd2l0aG91dCBpdCBhcmUgaGFuZC13cml0dGVuIGFuZCBuZXZlciB0b3VjaGVkLiAqL1xuZXhwb3J0IGNvbnN0IHNlbGZDb250YWluZWRXb3JrZmxvd01hcmtlciA9ICcjIEdlbmVyYXRlZCBieSB3YmZ5Lic7XG5cbi8vIFNhbWUgcGlucyBhcyB0aGUgcmV1c2FibGUgd29ya2Zsb3dzIC8gdGhlaXIgY29uc3VtZXJzOyBSZW5vdmF0ZSB1cGRhdGVzIHRoZW0gaW4gdGhlIHRhcmdldCByZXBvc2l0b3J5LlxuY29uc3QgY2hlY2tvdXRBY3Rpb24gPSAnYWN0aW9ucy9jaGVja291dEB2Ny4wLjEnO1xuY29uc3QgbWlzZUFjdGlvbiA9ICdqZHgvbWlzZS1hY3Rpb25AdjQuMi4zJztcbmNvbnN0IGNhY2hlQWN0aW9uID0gJ2FjdGlvbnMvY2FjaGVAdjYuMS4wJztcbmNvbnN0IHVwbG9hZEFydGlmYWN0QWN0aW9uID0gJ2FjdGlvbnMvdXBsb2FkLWFydGlmYWN0QHY3LjAuMSc7XG4vLyB2Ni4xLjE7IHRoZSBzYW1lIHBpbiBhcyB0aGUgcmV1c2FibGUgc2VtYW50aWMtcHIgd29ya2Zsb3cuXG5jb25zdCBzZW1hbnRpY1B1bGxSZXF1ZXN0QWN0aW9uID0gJ2FtYW5ubi9hY3Rpb24tc2VtYW50aWMtcHVsbC1yZXF1ZXN0QDQ1YjllZDdjZjI0MDg3YTJmNzc4NWJmNTViZTk3Mzk0YmE4N2UxYzInO1xuLy8gdjMuMC4zOyBkZXBsb3lzIGFyZSBuZXR3b3JrLWhlYXZ5IGFuZCBiZW5lZml0IGZyb20gcmV0cmllcyB3aXRoIGEgbG9uZyB0aW1lb3V0LlxuY29uc3QgcmV0cnlBY3Rpb24gPSAnbmljay1maWVsZHMvcmV0cnlAZGQ1NmYxY2E4Y2E5OTFlMjM4NWMxOGFiNmRkMzZlYTdmOWZkYjU1Zic7XG5cbi8qKlxuICogSm9iLWxldmVsIGVudiB0aGF0IHR1cm5zIHRoZSBUYWt1bWkgR3VhcmQgaW5zdGFsbCBwYXRoIG9uLCBtaXJyb3JpbmcgdGhlIHJldXNhYmxlIHdvcmtmbG93cy5cbiAqXG4gKiBgc2VjcmV0c2AgaXMgdW5hdmFpbGFibGUgaW4gYSBzdGVwLWxldmVsIGBpZjpgLCBzbyB0aGUgcHJlc2VuY2Ugb2YgdGhlIHRva2VuIGlzIGV4cG9zZWQgYXMgYVxuICogbm9uLXNlY3JldCBzaWduYWw7IGFuIHVuc2V0IHNlY3JldCBleHBhbmRzIHRvIGBmYWxzZWAgYW5kIGxlYXZlcyBldmVyeSBHdWFyZCBzdGVwIHNraXBwZWQsIHdoaWNoXG4gKiBpcyB3aGF0IGtlZXBzIHRoZSBnZW5lcmF0ZWQgd29ya2Zsb3dzIHJ1bm5hYmxlIGluIGEgcmVwb3NpdG9yeSB0aGF0IG5ldmVyIHJlZ2lzdGVycyB0aGUgc2VjcmV0LlxuICogVEFLVU1JX0dVQVJEX1RPS0VOIGl0c2VsZiBpcyBkZWZpbmVkLWJ1dC1FTVBUWSBqb2Itd2lkZSBzbyB0aGUgYCR7VEFLVU1JX0dVQVJEX1RPS0VOfWAgcmVmZXJlbmNlXG4gKiBpbiB0aGUgZ2VuZXJhdGVkIC5ucG1yYyBzdGlsbCBleHBhbmRzICh0byAnJykgaW4gdGhlIHN0ZXBzIHRoYXQgZGVsaWJlcmF0ZWx5IHJ1biB3aXRob3V0IHRoZVxuICogdG9rZW47IGEgcmVmZXJlbmNlIHRvIGFuIHVuZGVmaW5lZCB2YXJpYWJsZSBpcyB3aGF0IGJyZWFrcyBhbiBpbnN0YWxsLCBhbiBlbXB0eSBvbmUgaXMgZmluZS5cbiAqL1xuY29uc3QgZ3VhcmRKb2JFbnY6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7XG4gIEhBU19UQUtVTUlfR1VBUkRfVE9LRU46ICcke3sgISFzZWNyZXRzLlRBS1VNSV9HVUFSRF9UT0tFTiB9fScsXG4gIFRBS1VNSV9HVUFSRF9UT0tFTjogJycsXG59O1xuXG5pbnRlcmZhY2UgU3RlcCB7XG4gIG5hbWU/OiBzdHJpbmc7XG4gIGlkPzogc3RyaW5nO1xuICBpZj86IHN0cmluZztcbiAgdXNlcz86IHN0cmluZztcbiAgcnVuPzogc3RyaW5nO1xuICAnd29ya2luZy1kaXJlY3RvcnknPzogc3RyaW5nO1xuICB3aXRoPzogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gIGVudj86IFJlY29yZDxzdHJpbmcsIHN0cmluZz47XG59XG5cbmludGVyZmFjZSBXb3JrZmxvdyB7XG4gIG5hbWU6IHN0cmluZztcbiAgb246IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICBjb25jdXJyZW5jeT86IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICBwZXJtaXNzaW9ucz86IFJlY29yZDxzdHJpbmcsIHN0cmluZz47XG4gIGpvYnM6IFJlY29yZDxcbiAgICBzdHJpbmcsXG4gICAgeyAncnVucy1vbic6IHN0cmluZzsgcGVybWlzc2lvbnM/OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+OyBlbnY/OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+OyBzdGVwczogU3RlcFtdIH1cbiAgPjtcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlU2VsZkNvbnRhaW5lZFdvcmtmbG93cyhcbiAgcm9vdENvbmZpZzogUGFja2FnZUNvbmZpZyxcbiAgYWxsUGFja2FnZUNvbmZpZ3M6IFBhY2thZ2VDb25maWdbXSA9IFtyb290Q29uZmlnXVxuKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZ2VuZXJhdGVTZWxmQ29udGFpbmVkV29ya2Zsb3dzJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IHdvcmtmbG93c1BhdGggPSBwYXRoLnJlc29sdmUocm9vdENvbmZpZy5kaXJQYXRoLCAnLmdpdGh1YicsICd3b3JrZmxvd3MnKTtcbiAgICBpZiAoIShhd2FpdCBmc1V0aWwuaXNDb25maW5lZFdyaXRhYmxlUGF0aCh3b3JrZmxvd3NQYXRoKSkpIHtcbiAgICAgIGNvbnNvbGUud2FybihgU2tpcHBlZCBnZW5lcmF0aW5nIHdvcmtmbG93cyBiZWNhdXNlICR7d29ya2Zsb3dzUGF0aH0gcmVzb2x2ZXMgb3V0c2lkZSB0aGUgcmVwb3NpdG9yeS5gKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgYXdhaXQgZnMucHJvbWlzZXMubWtkaXIod29ya2Zsb3dzUGF0aCwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG5cbiAgICBjb25zdCB1c2VzRm5veCA9IGZzLmV4aXN0c1N5bmMocGF0aC5yZXNvbHZlKHJvb3RDb25maWcuZGlyUGF0aCwgJ2Zub3gudG9tbCcpKTtcbiAgICBjb25zdCB3b3JrZmxvd0J5RmlsZU5hbWU6IFJlY29yZDxzdHJpbmcsIFdvcmtmbG93PiA9IHtcbiAgICAgICd0ZXN0LnltbCc6IGJ1aWxkVGVzdFdvcmtmbG93KHJvb3RDb25maWcsIGFsbFBhY2thZ2VDb25maWdzLCB1c2VzRm5veCksXG4gICAgICAnc2VtYW50aWMtcHIueW1sJzogYnVpbGRTZW1hbnRpY1ByV29ya2Zsb3coKSxcbiAgICB9O1xuICAgIC8vIERlcGxveSB3b3JrZmxvd3MgYXJlIGdlbmVyYXRlZCBwZXIgZGVwbG95IHNjcmlwdCB0aGUgcmVwb3NpdG9yeSBkZWNsYXJlcywgc28gYSByZXBvc2l0b3J5XG4gICAgLy8gd2l0aG91dCBhIHN0YWdpbmcgZW52aXJvbm1lbnQgc2ltcGx5IGdldHMgbm8gc3RhZ2luZyB3b3JrZmxvdy4gT25seSBzY3JpcHRzIHRoYXQgaW52b2tlXG4gICAgLy8gYHdiIGRlcGxveWAgcXVhbGlmeTogYSBiZXNwb2tlIGRlcGxveSBzY3JpcHQgbWF5IG5vdCBiZSBzYWZlIHRvIHRyaWdnZXIgYXV0b21hdGljYWxseVxuICAgIC8vIChkZXBsb3ktc3RhZ2luZyBydW5zIG9uIGV2ZXJ5IHB1c2ggdG8gdGhlIGRlZmF1bHQgYnJhbmNoKS5cbiAgICBjb25zdCBzY3JpcHRzID0gcm9vdENvbmZpZy5wYWNrYWdlSnNvbj8uc2NyaXB0cyA/PyB7fTtcbiAgICBjb25zdCBoYXNQcm9kdWN0aW9uRGVwbG95V29ya2Zsb3cgPSBpc1diRGVwbG95U2NyaXB0KHNjcmlwdHNbJ2RlcGxveSddKTtcbiAgICBpZiAoaGFzUHJvZHVjdGlvbkRlcGxveVdvcmtmbG93KSB7XG4gICAgICB3b3JrZmxvd0J5RmlsZU5hbWVbJ2RlcGxveS1wcm9kdWN0aW9uLnltbCddID0gYnVpbGREZXBsb3lXb3JrZmxvdygncHJvZHVjdGlvbicsICdkZXBsb3knLCB1c2VzRm5veCk7XG4gICAgfVxuICAgIGlmIChpc1diRGVwbG95U2NyaXB0KHNjcmlwdHNbJ2RlcGxveTpzdGFnaW5nJ10pKSB7XG4gICAgICB3b3JrZmxvd0J5RmlsZU5hbWVbJ2RlcGxveS1zdGFnaW5nLnltbCddID0gYnVpbGREZXBsb3lXb3JrZmxvdygnc3RhZ2luZycsICdkZXBsb3k6c3RhZ2luZycsIHVzZXNGbm94KTtcbiAgICB9XG4gICAgaWYgKHJvb3RDb25maWcuZGVwZW5kaW5nLnNlbWFudGljUmVsZWFzZSAmJiByb290Q29uZmlnLnJlbGVhc2UuYnJhbmNoZXMubGVuZ3RoID4gMCkge1xuICAgICAgd29ya2Zsb3dCeUZpbGVOYW1lWydyZWxlYXNlLnltbCddID0gYnVpbGRSZWxlYXNlV29ya2Zsb3cocm9vdENvbmZpZywgaGFzUHJvZHVjdGlvbkRlcGxveVdvcmtmbG93LCB1c2VzRm5veCk7XG4gICAgfVxuICAgIGZvciAoY29uc3QgW2ZpbGVOYW1lLCB3b3JrZmxvd10gb2YgT2JqZWN0LmVudHJpZXMod29ya2Zsb3dCeUZpbGVOYW1lKSkge1xuICAgICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IHdyaXRlU2VsZkNvbnRhaW5lZFdvcmtmbG93KHBhdGguam9pbih3b3JrZmxvd3NQYXRoLCBmaWxlTmFtZSksIHdvcmtmbG93KSk7XG4gICAgfVxuICB9KTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gd3JpdGVTZWxmQ29udGFpbmVkV29ya2Zsb3coZmlsZVBhdGg6IHN0cmluZywgd29ya2Zsb3c6IFdvcmtmbG93KTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IG9sZENvbnRlbnQgPSBhd2FpdCBmc1V0aWwucmVhZEZpbGVJZkV4aXN0cyhmaWxlUGF0aCk7XG4gIC8vIFVubGlrZSBXaWxsQm9vc3Rlci1vcmdhbml6YXRpb24gcmVwb3NpdG9yaWVzLCB3YmZ5IGRvZXMgbm90IG93biBhcmJpdHJhcnkgcmVwb3NpdG9yaWVzJyBDSTpcbiAgLy8gb25seSBmaWxlcyBpdCBnZW5lcmF0ZWQgKGlkZW50aWZpZWQgYnkgdGhlIG1hcmtlcikgYXJlIHJlZ2VuZXJhdGVkLCBhbmQgaGFuZC13cml0dGVuXG4gIC8vIHdvcmtmbG93cyBhcmUgbmV2ZXIgdG91Y2hlZC4gT3duZXJzIG9wdCBvdXQgcGVybWFuZW50bHkgYnkgcmVtb3ZpbmcgdGhlIG1hcmtlciBsaW5lLlxuICAvLyBBbiBlbXB0eSBvciB3aGl0ZXNwYWNlLW9ubHkgZmlsZSBjYXJyaWVzIG5vIGhhbmQtd3JpdHRlbiBjb250ZW50LCBzbyBpdCBpcyB0cmVhdGVkIGFzIGFic2VudC5cbiAgaWYgKG9sZENvbnRlbnQgIT09IHVuZGVmaW5lZCAmJiBvbGRDb250ZW50LnRyaW0oKSAhPT0gJycgJiYgIW9sZENvbnRlbnQuc3RhcnRzV2l0aChzZWxmQ29udGFpbmVkV29ya2Zsb3dNYXJrZXIpKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgY29uc3QgaGVhZGVyID0gYCR7c2VsZkNvbnRhaW5lZFdvcmtmbG93TWFya2VyfSBSZW1vdmUgdGhpcyBsaW5lIHRvIHN0b3Agd2JmeSBmcm9tIG92ZXJ3cml0aW5nIHRoaXMgZmlsZS5cXG5gO1xuICBjb25zdCB5YW1sVGV4dCA9IHlhbWwuZHVtcCh3b3JrZmxvdywgeyBsaW5lV2lkdGg6IC0xIH0pO1xuICBhd2FpdCBmc1V0aWwud3JpdGVGaWxlQ29uZmluZWQoZmlsZVBhdGgsIGhlYWRlciArIHlhbWxUZXh0KTtcbn1cblxuZnVuY3Rpb24gd29ya2luZ0RpcihkaXJQYXRoOiBzdHJpbmcpOiBQaWNrPFN0ZXAsICd3b3JraW5nLWRpcmVjdG9yeSc+IHtcbiAgcmV0dXJuIGRpclBhdGggPyB7ICd3b3JraW5nLWRpcmVjdG9yeSc6IGRpclBhdGggfSA6IHt9O1xufVxuXG5mdW5jdGlvbiBpc1diRGVwbG95U2NyaXB0KHNjcmlwdDogdW5rbm93bik6IGJvb2xlYW4ge1xuICByZXR1cm4gdHlwZW9mIHNjcmlwdCA9PT0gJ3N0cmluZycgJiYgL1xcYndiIGRlcGxveVxcYi91LnRlc3Qoc2NyaXB0KTtcbn1cblxuZnVuY3Rpb24gYnVpbGRUZXN0V29ya2Zsb3coY29uZmlnOiBQYWNrYWdlQ29uZmlnLCBhbGxQYWNrYWdlQ29uZmlnczogUGFja2FnZUNvbmZpZ1tdLCB1c2VzRm5veDogYm9vbGVhbik6IFdvcmtmbG93IHtcbiAgLy8gUGxheXdyaWdodCBtYXkgYmUgZGVjbGFyZWQgb25seSBpbiB3b3Jrc3BhY2UgcGFja2FnZXM7IGB3YiB0ZXN0LW9uLWNpYCBydW5zIGV2ZXJ5IGRlY2xhcmluZ1xuICAvLyBwYWNrYWdlJ3MgZTJlIHRlc3RzLCBzbyB0aGUgd29ya2Zsb3cgbXVzdCBpbnN0YWxsIGJyb3dzZXJzIGZvciBlYWNoIG9mIHRoZW0gKHRoZWlyIHZlcnNpb25zXG4gIC8vIG1heSBkaWZmZXIsIGFuZCBlYWNoIGxpYnJhcnkgdmVyc2lvbiByZXF1aXJlcyBpdHMgbWF0Y2hpbmcgYnJvd3NlciBiaW5hcmllcykuIEJ1bidzIGlzb2xhdGVkXG4gIC8vIGxpbmtlciByZXNvbHZlcyB0aGUgcGxheXdyaWdodCBiaW5hcnkgb25seSBmcm9tIHRoZSBkZWNsYXJpbmcgcGFja2FnZSwgaGVuY2UgdGhlXG4gIC8vIHdvcmtpbmctZGlyZWN0b3J5IG9uIGV2ZXJ5IHN0ZXAuIFRoZSBicm93c2VycyBsYW5kIGluIH4vLmNhY2hlL21zLXBsYXl3cmlnaHQsIHNoYXJlZCBhY3Jvc3NcbiAgLy8gd29ya3NwYWNlcywgc28gc2FtZS12ZXJzaW9uIGluc3RhbGxzIG5hdHVyYWxseSBkZWR1cGxpY2F0ZS5cbiAgY29uc3QgcGxheXdyaWdodERpclBhdGhzID0gWy4uLmFsbFBhY2thZ2VDb25maWdzXVxuICAgIC50b1NvcnRlZCgoYSwgYikgPT4gYS5kaXJQYXRoLmxvY2FsZUNvbXBhcmUoYi5kaXJQYXRoKSlcbiAgICAuZmlsdGVyKChwYWNrYWdlQ29uZmlnKSA9PiBwYWNrYWdlQ29uZmlnLmRlcGVuZGluZy5wbGF5d3JpZ2h0VGVzdClcbiAgICAubWFwKChwYWNrYWdlQ29uZmlnKSA9PiBwYXRoLnJlbGF0aXZlKGNvbmZpZy5kaXJQYXRoLCBwYWNrYWdlQ29uZmlnLmRpclBhdGgpKTtcbiAgY29uc3QgaGFzVHlwZWNoZWNrID0gY29uZmlnLmRvZXNDb250YWluVHlwZVNjcmlwdCB8fCBjb25maWcuZG9lc0NvbnRhaW5UeXBlU2NyaXB0SW5QYWNrYWdlcztcbiAgLy8gU3RlcC1zY29wZWQgbGlrZSB0aGUgcmV1c2FibGUgdGVzdCB3b3JrZmxvdzogZGVwZW5kZW5jeSBsaWZlY3ljbGUgc2NyaXB0cyBydW4gYnkgYGJ1biBpbnN0YWxsYFxuICAvLyBtdXN0IG5vdCBiZSBhYmxlIHRvIHJlYWQgdGhlIGxvbmctbGl2ZWQgYWdlIGlkZW50aXR5LlxuICBjb25zdCBmbm94RW52OiBQaWNrPFN0ZXAsICdlbnYnPiA9IHVzZXNGbm94ID8geyBlbnY6IHsgRk5PWF9BR0VfS0VZOiAnJHt7IHNlY3JldHMuRk5PWF9BR0VfS0VZIH19JyB9IH0gOiB7fTtcblxuICBjb25zdCBzdGVwczogU3RlcFtdID0gW1xuICAgIHsgdXNlczogY2hlY2tvdXRBY3Rpb24gfSxcbiAgICB7IHVzZXM6IG1pc2VBY3Rpb24gfSxcbiAgICAuLi5idWlsZEluc3RhbGxTdGVwcyh0cnVlKSxcbiAgICAuLi4ocGxheXdyaWdodERpclBhdGhzLmxlbmd0aCA+IDBcbiAgICAgID8gKFtcbiAgICAgICAgICAuLi5wbGF5d3JpZ2h0RGlyUGF0aHMubWFwKChkaXJQYXRoLCBpbmRleCk6IFN0ZXAgPT4gKHtcbiAgICAgICAgICAgIG5hbWU6IGBHZXQgUGxheXdyaWdodCB2ZXJzaW9uJHtkaXJQYXRoID8gYCAoJHtkaXJQYXRofSlgIDogJyd9YCxcbiAgICAgICAgICAgIC8vIFRoZSBJTlNUQUxMRUQgdmVyc2lvbiwgbm90IHRoZSBwYWNrYWdlLmpzb24gc3BlY2lmaWVyOiBhIHJhbmdlIGxpa2UgYF4xLjQ1LjBgXG4gICAgICAgICAgICAvLyBzdGF5cyB1bmNoYW5nZWQgYWNyb3NzIGxvY2tmaWxlIHVwZGF0ZXMsIHNvIGtleWluZyB0aGUgY2FjaGUgb24gaXQgd291bGQgcmVzdG9yZVxuICAgICAgICAgICAgLy8gc3RhbGUgYnJvd3NlcnMgdGhhdCBubyBsb25nZXIgbWF0Y2ggdGhlIGxpYnJhcnkuIFJ1bnMgYWZ0ZXIgYGJ1biBpbnN0YWxsYCwgc28gdGhlXG4gICAgICAgICAgICAvLyBwYWNrYWdlIGlzIHJlc29sdmFibGUgZnJvbSB0aGUgZGVjbGFyaW5nIHBhY2thZ2UncyBkaXJlY3RvcnkuXG4gICAgICAgICAgICBpZDogYHBsYXl3cmlnaHQtdmVyc2lvbi0ke2luZGV4fWAsXG4gICAgICAgICAgICBydW46ICdlY2hvIFwidmVyc2lvbj0kKGJ1biAtZSBcInRyeSB7IGNvbnNvbGUubG9nKHJlcXVpcmUoXFwnQHBsYXl3cmlnaHQvdGVzdC9wYWNrYWdlLmpzb25cXCcpLnZlcnNpb24pIH0gY2F0Y2gge31cIilcIiA+PiBcIiRHSVRIVUJfT1VUUFVUXCInLFxuICAgICAgICAgICAgLi4ud29ya2luZ0RpcihkaXJQYXRoKSxcbiAgICAgICAgICB9KSksXG4gICAgICAgICAge1xuICAgICAgICAgICAgbmFtZTogJ0NhY2hlIFBsYXl3cmlnaHQgYnJvd3NlcnMnLFxuICAgICAgICAgICAgaWQ6ICdwbGF5d3JpZ2h0LWNhY2hlJyxcbiAgICAgICAgICAgIHVzZXM6IGNhY2hlQWN0aW9uLFxuICAgICAgICAgICAgd2l0aDoge1xuICAgICAgICAgICAgICBwYXRoOiAnfi8uY2FjaGUvbXMtcGxheXdyaWdodCcsXG4gICAgICAgICAgICAgIGtleTogYHBsYXl3cmlnaHQtXFwke3sgcnVubmVyLm9zIH19LSR7cGxheXdyaWdodERpclBhdGhzXG4gICAgICAgICAgICAgICAgLm1hcCgoXywgaW5kZXgpID0+IGBcXCR7eyBzdGVwcy5wbGF5d3JpZ2h0LXZlcnNpb24tJHtpbmRleH0ub3V0cHV0cy52ZXJzaW9uIH19YClcbiAgICAgICAgICAgICAgICAuam9pbignLScpfWAsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH0sXG4gICAgICAgICAgLi4ucGxheXdyaWdodERpclBhdGhzLm1hcCgoZGlyUGF0aCk6IFN0ZXAgPT4gKHtcbiAgICAgICAgICAgIGlmOiBcInN0ZXBzLnBsYXl3cmlnaHQtY2FjaGUub3V0cHV0cy5jYWNoZS1oaXQgIT0gJ3RydWUnXCIsXG4gICAgICAgICAgICBydW46ICdidW4gcGxheXdyaWdodCBpbnN0YWxsIC0td2l0aC1kZXBzJyxcbiAgICAgICAgICAgIC4uLndvcmtpbmdEaXIoZGlyUGF0aCksXG4gICAgICAgICAgfSkpLFxuICAgICAgICAgIC4uLnBsYXl3cmlnaHREaXJQYXRocy5tYXAoKGRpclBhdGgpOiBTdGVwID0+ICh7XG4gICAgICAgICAgICAvLyBUaGUgY2FjaGVkIGJyb3dzZXJzIHN0aWxsIG5lZWQgdGhlaXIgc3lzdGVtIGRlcGVuZGVuY2llcyBvbiBhIGZyZXNoIHJ1bm5lci5cbiAgICAgICAgICAgIGlmOiBcInN0ZXBzLnBsYXl3cmlnaHQtY2FjaGUub3V0cHV0cy5jYWNoZS1oaXQgPT0gJ3RydWUnXCIsXG4gICAgICAgICAgICBydW46ICdidW4gcGxheXdyaWdodCBpbnN0YWxsLWRlcHMnLFxuICAgICAgICAgICAgLi4ud29ya2luZ0RpcihkaXJQYXRoKSxcbiAgICAgICAgICB9KSksXG4gICAgICAgIF0gc2F0aXNmaWVzIFN0ZXBbXSlcbiAgICAgIDogW10pLFxuICAgIC4uLihoYXNUeXBlY2hlY2sgPyBbeyBydW46ICdidW4gcnVuIHR5cGVjaGVjaycsIC4uLmZub3hFbnYgfV0gOiBbXSksXG4gICAgeyBydW46ICdidW4gcnVuIGxpbnQnLCAuLi5mbm94RW52IH0sXG4gICAge1xuICAgICAgbmFtZTogJ1Rlc3QnLFxuICAgICAgaWQ6ICd0ZXN0JyxcbiAgICAgIHJ1bjogYGlmIFtbIFwiJFVQTE9BRF9URVNUX0xPR1wiICE9IFwidHJ1ZVwiIF1dOyB0aGVuXG4gIGV4ZWMgYnVuIHJ1biB0ZXN0L2NpXG5maVxubG9nX2Rpcj0kKG1rdGVtcCAtZCBcIiRSVU5ORVJfVEVNUC90ZXN0LW91dHB1dC5YWFhYWFhcIilcbmVjaG8gXCJsb2dfcGF0aD0kbG9nX2Rpci90ZXN0LmxvZ1wiID4+IFwiJEdJVEhVQl9PVVRQVVRcIlxuIyBLZWVwIGRyYWluaW5nIHRlc3Qgb3V0cHV0IHdoZW4gdGhlIGxvZyByZWFjaGVzIGEgZmlsZS1zaXplIGxpbWl0Llxuc2V0ICtlXG5idW4gcnVuIHRlc3QvY2kgMj4mMSB8ICh0cmFwICcnIFhGU1o7IHRlZSBcIiRsb2dfZGlyL3Rlc3QubG9nXCIpXG50ZXN0X3N0YXR1cz0oXCJcXCR7UElQRVNUQVRVU1tAXX1cIilcbmlmICgoIHRlc3Rfc3RhdHVzWzBdICE9IDAgKSk7IHRoZW4gZXhpdCBcIlxcJHt0ZXN0X3N0YXR1c1swXX1cIjsgZmlcbmV4aXQgXCJcXCR7dGVzdF9zdGF0dXNbMV19XCJgLFxuICAgICAgZW52OiB7IC4uLmZub3hFbnYuZW52LCBVUExPQURfVEVTVF9MT0c6ICcke3sgdmFycy5VUExPQURfVEVTVF9MT0cgfX0nIH0sXG4gICAgfSxcbiAgICB7XG4gICAgICBuYW1lOiAnVXBsb2FkIHRlc3QgbG9nJyxcbiAgICAgIGlmOiBcIiR7eyBhbHdheXMoKSAmJiB2YXJzLlVQTE9BRF9URVNUX0xPRyA9PSAndHJ1ZScgJiYgc3RlcHMudGVzdC5vdXRwdXRzLmxvZ19wYXRoICE9ICcnIH19XCIsXG4gICAgICB1c2VzOiB1cGxvYWRBcnRpZmFjdEFjdGlvbixcbiAgICAgIHdpdGg6IHtcbiAgICAgICAgbmFtZTogJ3Rlc3Qtb3V0cHV0LSR7eyBydW5uZXIub3MgfX0tJHt7IGpvYi5jaGVja19ydW5faWQgfX0tJHt7IGdpdGh1Yi5ydW5fYXR0ZW1wdCB9fScsXG4gICAgICAgIHBhdGg6ICcke3sgc3RlcHMudGVzdC5vdXRwdXRzLmxvZ19wYXRoIH19JyxcbiAgICAgICAgJ3JldGVudGlvbi1kYXlzJzogMTQsXG4gICAgICAgICdpZi1uby1maWxlcy1mb3VuZCc6ICdlcnJvcicsXG4gICAgICB9LFxuICAgIH0sXG4gICAgLi4uKHBsYXl3cmlnaHREaXJQYXRocy5sZW5ndGggPiAwXG4gICAgICA/IFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICBuYW1lOiAnVXBsb2FkIHRlc3QgcmVzdWx0cycsXG4gICAgICAgICAgICBpZjogJyR7eyBhbHdheXMoKSB9fScsXG4gICAgICAgICAgICB1c2VzOiB1cGxvYWRBcnRpZmFjdEFjdGlvbixcbiAgICAgICAgICAgIHdpdGg6IHtcbiAgICAgICAgICAgICAgbmFtZTogJ3Rlc3QtcmVzdWx0cycsXG4gICAgICAgICAgICAgIC8vIEV2ZXJ5IGRlY2xhcmluZyBwYWNrYWdlIHdyaXRlcyBpdHMgb3duIHRlc3QtcmVzdWx0cyBkaXJlY3Rvcnk7IGEgbmV3bGluZS1zZXBhcmF0ZWRcbiAgICAgICAgICAgICAgLy8gbGlzdCB1cGxvYWRzIHRoZW0gYWxsLlxuICAgICAgICAgICAgICBwYXRoOiBwbGF5d3JpZ2h0RGlyUGF0aHNcbiAgICAgICAgICAgICAgICAubWFwKChkaXJQYXRoKSA9PiAoZGlyUGF0aCA/IHBhdGgucG9zaXguam9pbihkaXJQYXRoLCAndGVzdC1yZXN1bHRzJykgOiAndGVzdC1yZXN1bHRzJykpXG4gICAgICAgICAgICAgICAgLmpvaW4oJ1xcbicpLFxuICAgICAgICAgICAgICAnaWYtbm8tZmlsZXMtZm91bmQnOiAnaWdub3JlJyxcbiAgICAgICAgICAgICAgJ3JldGVudGlvbi1kYXlzJzogMTQsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH0sXG4gICAgICAgIF1cbiAgICAgIDogW10pLFxuICBdO1xuXG4gIHJldHVybiB7XG4gICAgbmFtZTogJ1Rlc3QnLFxuICAgIG9uOiB7XG4gICAgICBwdWxsX3JlcXVlc3Q6IG51bGwsXG4gICAgICBwdXNoOiB7IGJyYW5jaGVzOiBbJ21haW4nXSB9LFxuICAgIH0sXG4gICAgY29uY3VycmVuY3k6IHtcbiAgICAgIGdyb3VwOiAnJHt7IGdpdGh1Yi53b3JrZmxvdyB9fS0ke3sgZ2l0aHViLnJlZiB9fScsXG4gICAgICAnY2FuY2VsLWluLXByb2dyZXNzJzogdHJ1ZSxcbiAgICB9LFxuICAgIHBlcm1pc3Npb25zOiB7IGNvbnRlbnRzOiAncmVhZCcgfSxcbiAgICBqb2JzOiB7XG4gICAgICB0ZXN0OiB7XG4gICAgICAgICdydW5zLW9uJzogJ3VidW50dS1sYXRlc3QnLFxuICAgICAgICBlbnY6IHsgRk9SQ0VfQ09MT1I6ICczJywgV0JfRU5WOiAndGVzdCcsIC4uLmd1YXJkSm9iRW52IH0sXG4gICAgICAgIHN0ZXBzLFxuICAgICAgfSxcbiAgICB9LFxuICB9O1xufVxuXG5mdW5jdGlvbiBidWlsZERlcGxveVdvcmtmbG93KGVudmlyb25tZW50OiAnc3RhZ2luZycgfCAncHJvZHVjdGlvbicsIHNjcmlwdE5hbWU6IHN0cmluZywgdXNlc0Zub3g6IGJvb2xlYW4pOiBXb3JrZmxvdyB7XG4gIHJldHVybiB7XG4gICAgbmFtZTogYERlcGxveSBhcHAgb24gJHtlbnZpcm9ubWVudH1gLFxuICAgIG9uOiB7XG4gICAgICB3b3JrZmxvd19kaXNwYXRjaDogbnVsbCxcbiAgICAgIC8vIFByb2R1Y3Rpb24gZGVwbG95cyBmb2xsb3cgcHVibGlzaGVkIHJlbGVhc2VzIChzZWUgdGhlIHJlbGVhc2Ugd29ya2Zsb3cncyB0cmlnZ2VyIHN0ZXApO1xuICAgICAgLy8gc3RhZ2luZyBjb252ZXJnZXMgb24gZXZlcnkgZGVmYXVsdC1icmFuY2ggcHVzaC5cbiAgICAgIC4uLihlbnZpcm9ubWVudCA9PT0gJ3Byb2R1Y3Rpb24nXG4gICAgICAgID8geyByZWxlYXNlOiB7IHR5cGVzOiBbJ3B1Ymxpc2hlZCddIH0gfVxuICAgICAgICA6IHsgcHVzaDogeyBicmFuY2hlczogWydtYWluJ10sICdwYXRocy1pZ25vcmUnOiBbJyoqLm1kJywgJyoqL2RvY3MvKionXSB9IH0pLFxuICAgIH0sXG4gICAgY29uY3VycmVuY3k6IHtcbiAgICAgIGdyb3VwOiAnJHt7IGdpdGh1Yi53b3JrZmxvdyB9fScsXG4gICAgICAnY2FuY2VsLWluLXByb2dyZXNzJzogZmFsc2UsXG4gICAgfSxcbiAgICBwZXJtaXNzaW9uczogeyBjb250ZW50czogJ3JlYWQnIH0sXG4gICAgam9iczoge1xuICAgICAgZGVwbG95OiB7XG4gICAgICAgICdydW5zLW9uJzogJ3VidW50dS1sYXRlc3QnLFxuICAgICAgICBlbnY6IHsgV0JfRU5WOiBlbnZpcm9ubWVudCwgLi4uZ3VhcmRKb2JFbnYgfSxcbiAgICAgICAgc3RlcHM6IFtcbiAgICAgICAgICAvLyBmZXRjaC1kZXB0aCAwIHNvIGBnaXQgZGVzY3JpYmVgIHNlZXMgdGhlIHRhZ3MgV0JfVkVSU0lPTiBpcyBkZXJpdmVkIGZyb20uXG4gICAgICAgICAgeyB1c2VzOiBjaGVja291dEFjdGlvbiwgd2l0aDogeyAnZmV0Y2gtZGVwdGgnOiAwIH0gfSxcbiAgICAgICAgICB7IHVzZXM6IG1pc2VBY3Rpb24gfSxcbiAgICAgICAgICB7XG4gICAgICAgICAgICBuYW1lOiAnU2V0IFdCX1ZFUlNJT04nLFxuICAgICAgICAgICAgcnVuOiAnc2V0IC1ldW8gcGlwZWZhaWxcXG5XQl9WRVJTSU9OPSQoZ2l0IGRlc2NyaWJlIC0tYWx3YXlzIC0tdGFncylcXG5lY2hvIFwiV0JfVkVSU0lPTj0kV0JfVkVSU0lPTlwiID4+IFwiJEdJVEhVQl9FTlZcIicsXG4gICAgICAgICAgfSxcbiAgICAgICAgICAuLi5idWlsZEluc3RhbGxTdGVwcyhmYWxzZSksXG4gICAgICAgICAge1xuICAgICAgICAgICAgbmFtZTogJ0RlcGxveScsXG4gICAgICAgICAgICB1c2VzOiByZXRyeUFjdGlvbixcbiAgICAgICAgICAgIHdpdGg6IHtcbiAgICAgICAgICAgICAgdGltZW91dF9taW51dGVzOiA2MCxcbiAgICAgICAgICAgICAgbWF4X2F0dGVtcHRzOiA1LFxuICAgICAgICAgICAgICBjb21tYW5kOiBgYnVuIHJ1biAke3NjcmlwdE5hbWV9YCxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAvLyBTdGVwLXNjb3BlZCBsaWtlIHRoZSB0ZXN0IHdvcmtmbG93OiBkZXBlbmRlbmN5IGxpZmVjeWNsZSBzY3JpcHRzIHJ1biBieVxuICAgICAgICAgICAgLy8gYGJ1biBpbnN0YWxsYCBtdXN0IG5vdCBiZSBhYmxlIHRvIHJlYWQgdGhlIGxvbmctbGl2ZWQgYWdlIGlkZW50aXR5LlxuICAgICAgICAgICAgLi4uKHVzZXNGbm94ID8geyBlbnY6IHsgRk5PWF9BR0VfS0VZOiAnJHt7IHNlY3JldHMuRk5PWF9BR0VfS0VZIH19JyB9IH0gOiB7fSksXG4gICAgICAgICAgfSxcbiAgICAgICAgXSxcbiAgICAgIH0sXG4gICAgfSxcbiAgfTtcbn1cblxuZnVuY3Rpb24gYnVpbGRSZWxlYXNlV29ya2Zsb3coXG4gIGNvbmZpZzogUGFja2FnZUNvbmZpZyxcbiAgaGFzUHJvZHVjdGlvbkRlcGxveVdvcmtmbG93OiBib29sZWFuLFxuICB1c2VzRm5veDogYm9vbGVhblxuKTogV29ya2Zsb3cge1xuICBjb25zdCBmbm94RW52OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0gdXNlc0Zub3ggPyB7IEZOT1hfQUdFX0tFWTogJyR7eyBzZWNyZXRzLkZOT1hfQUdFX0tFWSB9fScgfSA6IHt9O1xuICByZXR1cm4ge1xuICAgIG5hbWU6ICdSZWxlYXNlJyxcbiAgICBvbjoge1xuICAgICAgcHVzaDogeyBicmFuY2hlczogWy4uLmNvbmZpZy5yZWxlYXNlLmJyYW5jaGVzXSB9LFxuICAgIH0sXG4gICAgY29uY3VycmVuY3k6IHtcbiAgICAgIGdyb3VwOiAnJHt7IGdpdGh1Yi53b3JrZmxvdyB9fScsXG4gICAgICAnY2FuY2VsLWluLXByb2dyZXNzJzogZmFsc2UsXG4gICAgfSxcbiAgICBwZXJtaXNzaW9uczoge1xuICAgICAgLy8gZm9yIHNlbWFudGljLXJlbGVhc2VcbiAgICAgIGNvbnRlbnRzOiAnd3JpdGUnLFxuICAgICAgLy8gZm9yIGRpc3BhdGNoaW5nIHRoZSBwcm9kdWN0aW9uIGRlcGxveSB3b3JrZmxvdyBhZnRlciBhIHJlbGVhc2VcbiAgICAgIC4uLihoYXNQcm9kdWN0aW9uRGVwbG95V29ya2Zsb3cgPyB7IGFjdGlvbnM6ICd3cml0ZScgfSA6IHt9KSxcbiAgICB9LFxuICAgIGpvYnM6IHtcbiAgICAgIHJlbGVhc2U6IHtcbiAgICAgICAgJ3J1bnMtb24nOiAndWJ1bnR1LWxhdGVzdCcsXG4gICAgICAgIC8vIFJlbGVhc2VzIGJ1aWxkIHByb2R1Y3Rpb24gYXJ0aWZhY3RzLCBoZW5jZSB0aGUgZW52aXJvbm1lbnQg4oCUIHRoZSBzYW1lIGRlZmF1bHQgYXMgdGhlXG4gICAgICAgIC8vIHJldXNhYmxlIHJlbGVhc2Ugd29ya2Zsb3cuIHdiJ3MgQ0kgZ3VhcmQgYWxzbyByZXF1aXJlcyBhbiBleHBvcnRlZCBXQl9FTlYsIHNvIHdpdGhvdXRcbiAgICAgICAgLy8gaXQgYSBgcG9zdGluc3RhbGxgIHRoYXQgY2FsbHMgd2IgKGUuZy4gYHdiIGdlbi1jb2RlYCkgZXhpdHMgMSBiZWZvcmUgc2VtYW50aWMtcmVsZWFzZVxuICAgICAgICAvLyBydW5zLlxuICAgICAgICBlbnY6IHsgV0JfRU5WOiAncHJvZHVjdGlvbicsIC4uLmd1YXJkSm9iRW52IH0sXG4gICAgICAgIHN0ZXBzOiBbXG4gICAgICAgICAgLy8gZmV0Y2gtZGVwdGggMDogc2VtYW50aWMtcmVsZWFzZSByZWFkcyB0aGUgZnVsbCBoaXN0b3J5IHRvIGNvbXB1dGUgdGhlIG5leHQgdmVyc2lvbi5cbiAgICAgICAgICB7IHVzZXM6IGNoZWNrb3V0QWN0aW9uLCB3aXRoOiB7ICdmZXRjaC1kZXB0aCc6IDAgfSB9LFxuICAgICAgICAgIHsgdXNlczogbWlzZUFjdGlvbiB9LFxuICAgICAgICAgIC4uLmJ1aWxkSW5zdGFsbFN0ZXBzKGZhbHNlKSxcbiAgICAgICAgICAuLi4oaGFzUHJvZHVjdGlvbkRlcGxveVdvcmtmbG93XG4gICAgICAgICAgICA/IFtcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICBuYW1lOiAnR2V0IGN1cnJlbnQgbGF0ZXN0IHRhZycsXG4gICAgICAgICAgICAgICAgICBpZDogJ3ByZS1yZWxlYXNlLXRhZycsXG4gICAgICAgICAgICAgICAgICBydW46ICdzZXQgLWV1byBwaXBlZmFpbFxcbmVjaG8gXCJ0YWc9JChnaXQgZGVzY3JpYmUgLS10YWdzIC0tYWJicmV2PTAgMj4vZGV2L251bGwgfHwgZWNobyBcXCdcXCcpXCIgPj4gXCIkR0lUSFVCX09VVFBVVFwiJyxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICBdXG4gICAgICAgICAgICA6IFtdKSxcbiAgICAgICAgICB7XG4gICAgICAgICAgICBuYW1lOiAnUmVsZWFzZScsXG4gICAgICAgICAgICAvLyBzZW1hbnRpYy1yZWxlYXNlIGNoZWNrcyBOb2RlLmpzIHJ1bnRpbWUgcmVxdWlyZW1lbnRzOyBgYnVuIDxiaW4+YCByZXNwZWN0cyBpdHNcbiAgICAgICAgICAgIC8vIGAjIS91c3IvYmluL2VudiBub2RlYCBzaGViYW5nLCBzbyBpdCBzdGlsbCBydW5zIHVuZGVyIHJlYWwgTm9kZS5cbiAgICAgICAgICAgIHJ1bjogJ2J1biBzZW1hbnRpYy1yZWxlYXNlJyxcbiAgICAgICAgICAgIGVudjoge1xuICAgICAgICAgICAgICBHSVRIVUJfVE9LRU46ICcke3sgc2VjcmV0cy5HSVRIVUJfVE9LRU4gfX0nLFxuICAgICAgICAgICAgICBMRUZUSE9PSzogJzAnLFxuICAgICAgICAgICAgICAuLi5mbm94RW52LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9LFxuICAgICAgICAgIC4uLihoYXNQcm9kdWN0aW9uRGVwbG95V29ya2Zsb3dcbiAgICAgICAgICAgID8gKFtcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICBuYW1lOiAnQ2hlY2sgZm9yIG5ldyByZWxlYXNlIHRhZycsXG4gICAgICAgICAgICAgICAgICBpZDogJ3Bvc3QtcmVsZWFzZS10YWcnLFxuICAgICAgICAgICAgICAgICAgcnVuOiAnc2V0IC1ldW8gcGlwZWZhaWxcXG5naXQgZmV0Y2ggLS10YWdzIC0tZm9yY2VcXG5ORVdfVEFHPSQoZ2l0IGRlc2NyaWJlIC0tdGFncyAtLWFiYnJldj0wIDI+L2Rldi9udWxsIHx8IGVjaG8gXFwnXFwnKVxcbmVjaG8gXCJ0YWc9JE5FV19UQUdcIiA+PiBcIiRHSVRIVUJfT1VUUFVUXCJcXG5pZiBbWyAtbiBcIiRORVdfVEFHXCIgJiYgXCIkTkVXX1RBR1wiICE9IFwiJHt7IHN0ZXBzLnByZS1yZWxlYXNlLXRhZy5vdXRwdXRzLnRhZyB9fVwiIF1dOyB0aGVuXFxuICBlY2hvIFwiY3JlYXRlZD10cnVlXCIgPj4gXCIkR0lUSFVCX09VVFBVVFwiXFxuZmknLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgaWY6IFwic3RlcHMucG9zdC1yZWxlYXNlLXRhZy5vdXRwdXRzLmNyZWF0ZWQgPT0gJ3RydWUnXCIsXG4gICAgICAgICAgICAgICAgICBuYW1lOiAnVHJpZ2dlciBwcm9kdWN0aW9uIGRlcGxveScsXG4gICAgICAgICAgICAgICAgICAvLyBBIEdJVEhVQl9UT0tFTi1jcmVhdGVkIHJlbGVhc2UgZG9lcyBub3QgZmlyZSB0aGUgZGVwbG95IHdvcmtmbG93J3NcbiAgICAgICAgICAgICAgICAgIC8vIHJlbGVhc2UtcHVibGlzaGVkIHRyaWdnZXIsIHNvIGRpc3BhdGNoIGl0IGV4cGxpY2l0bHkgb24gdGhlIG5ldyB0YWcuXG4gICAgICAgICAgICAgICAgICBydW46ICdnaCB3b3JrZmxvdyBydW4gZGVwbG95LXByb2R1Y3Rpb24ueW1sIC0tcmVmIFwiJHt7IHN0ZXBzLnBvc3QtcmVsZWFzZS10YWcub3V0cHV0cy50YWcgfX1cIicsXG4gICAgICAgICAgICAgICAgICBlbnY6IHsgR0hfVE9LRU46ICcke3sgc2VjcmV0cy5HSVRIVUJfVE9LRU4gfX0nIH0sXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgXSBzYXRpc2ZpZXMgU3RlcFtdKVxuICAgICAgICAgICAgOiBbXSksXG4gICAgICAgIF0sXG4gICAgICB9LFxuICAgIH0sXG4gIH07XG59XG5cbi8qKlxuICogVGhlIGluc3RhbGwgc2VxdWVuY2UgZXZlcnkgZ2VuZXJhdGVkIHdvcmtmbG93IHNoYXJlczogYGJ1biBpbnN0YWxsIC0tZnJvemVuLWxvY2tmaWxlYCwgaGFyZGVuZWQgaW50byB0aGVcbiAqIHJldXNhYmxlIHdvcmtmbG93cycgdGhyZWUtc3RlcCBkYW5jZSB3aGVuIHRoZSByZXBvc2l0b3J5IHJlZ2lzdGVycyBhIFRBS1VNSV9HVUFSRF9UT0tFTiBzZWNyZXQuXG4gKlxuICogVGFrdW1pIEd1YXJkIChodHRwczovL2ZsYXR0LnRlY2gvdGFrdW1pL2ZlYXR1cmVzL2d1YXJkKSBpcyBhIHJlZ2lzdHJ5IHByb3h5IHRoYXQgYmxvY2tzXG4gKiBrbm93bi1tYWxpY2lvdXMgcGFja2FnZXMuIFJvdXRpbmcgdGhlIERFRkFVTFQgcmVnaXN0cnkgdGhyb3VnaCBpdCBpcyB3aGF0IHByb3RlY3RzIHRoZSBpbnN0YWxsLFxuICogYW5kIHRoZSB0b2tlbiBhdXRoZW50aWNhdGVzIHRoYXQgcHJveHkg4oCUIHNvIHRoZSB0b2tlbiBoYXMgdG8gYmUgcHJlc2VudCB3aGlsZSBkZXBlbmRlbmNpZXMgYXJlXG4gKiByZXNvbHZlZCwgd2hpY2ggaXMgZXhhY3RseSB3aGVuIGEgY29tcHJvbWlzZWQgZGVwZW5kZW5jeSdzIGxpZmVjeWNsZSBzY3JpcHQgd291bGQgcnVuLiBIZW5jZSB0aGVcbiAqIHNwbGl0OiByZXNvbHZlIGFuZCBkb3dubG9hZCB3aXRoIGAtLWlnbm9yZS1zY3JpcHRzYCBhbmQgdGhlIHRva2VuLCB0aGVuIHJlcGxheSB0aGUgc2tpcHBlZFxuICogbGlmZWN5Y2xlIHNjcmlwdHMgaW4gYSBzZWNvbmQgaW5zdGFsbCB0aGF0IGhhcyBubyB0b2tlbiAoZXZlcnkgcGFja2FnZSBpcyBhbHJlYWR5IGNhY2hlZCwgYW5kXG4gKiBHdWFyZCBzZXJ2ZXMgYW5vbnltb3VzbHkgYW55d2F5KS4gT25seSBidW4gaXMgZ2VuZXJhdGVkIGhlcmUsIGFuZCBidW4gcmVhZHMgLm5wbXJjLCBzbyBub1xuICogcGFja2FnZS1tYW5hZ2VyIGJyYW5jaGluZyBpcyBuZWVkZWQuXG4gKlxuICogVGhlIHNoZWxsIGRldGFpbHMgZGVsaWJlcmF0ZWx5IG1pcnJvciByZXVzYWJsZS13b3JrZmxvd3MnIHByb2R1Y3Rpb24tcHJvdmVuIGluc3RhbGwgc3RlcHM6IGJhcmVcbiAqIGAkUlVOTkVSX1RFTVBgIChzZXQgYnkgdGhlIHJ1bm5lciBhcHBsaWNhdGlvbiBvbiBldmVyeSBydW5uZXIsIGFuZCBgc2V0IC11YCBmYWlscyBsb3VkbHkgaWYgbm90KSxcbiAqIGBbWyAtZSAubnBtcmMgXV1gLCBhbmQgdGhlIHNlY29uZCBgcm0gLXJmIG5vZGVfbW9kdWxlc2AgaW4gdGhlIGZhbGxiYWNrIChhbiBpbnRlcnJ1cHRlZCBsaWZlY3ljbGVcbiAqIHJ1biBtYXkgbGVhdmUgbm9kZV9tb2R1bGVzIGluY29uc2lzdGVudCwgc28gdGhlIHJldHJ5IHN0YXJ0cyBjbGVhbiByYXRoZXIgdGhhbiB0cnVzdGluZyBhIHJlcGFpcikuXG4gKlxuICogYHRvbGVyYXRlTGlmZWN5Y2xlU2NyaXB0RmFpbHVyZWAgZGVjaWRlcyB3aGF0IGEgZmFpbGluZyBsaWZlY3ljbGUtc2NyaXB0IHJlcGxheSBkb2VzLiBFdmVyeVxuICogcmVwbGF5IHJ1bnMgdG9rZW5sZXNzIGFuZCB3aXRob3V0IEZOT1hfQUdFX0tFWSAodGhlIGtleSBpcyBzY29wZWQgdG8gdGhlIGxhdGVyIERlcGxveS9SZWxlYXNlXG4gKiBzdGVwKSwgc28gYSBwb3N0aW5zdGFsbCB0aGF0IG5lZWRzIGRlY3J5cHRlZCBzZWNyZXRzIGlzIHVuc3VwcG9ydGVkIGluIGFsbCBvZiB0aGVtIGJ5IGRlc2lnbi5cbiAqIFRoZSB0ZXN0IHdvcmtmbG93IHRvbGVyYXRlcyB0aGUgZmFpbHVyZSBiZWNhdXNlIHR5cGVjaGVjay9saW50L3Rlc3QgZmFpbCBsb3VkbHkgb24gYSBkZWdyYWRlZFxuICogdHJlZSBhbnl3YXkuIERlcGxveSBhbmQgcmVsZWFzZSB3b3JrZmxvd3MgbXVzdCBub3Q6IGEgYDo6d2FybmluZzo6YCBkb2VzIG5vdCBmYWlsIHRoZSBqb2IsIHNvXG4gKiB0aGUgZmFsbGJhY2sgd291bGQgc2hpcCBhIHRyZWUgd2hvc2UgbGlmZWN5Y2xlIHNjcmlwdHMgKGUuZy4gYSBgcG9zdGluc3RhbGw6IHdiIGdlbi1jb2RlYClcbiAqIG5ldmVyIHJhbiwgc2lsZW50bHkgZGVwbG95aW5nIGRlZ3JhZGVkIG91dHB1dCAoIzExMjcpLlxuICovXG5mdW5jdGlvbiBidWlsZEluc3RhbGxTdGVwcyh0b2xlcmF0ZUxpZmVjeWNsZVNjcmlwdEZhaWx1cmU6IGJvb2xlYW4pOiBTdGVwW10ge1xuICByZXR1cm4gW1xuICAgIHtcbiAgICAgIGlmOiBcIiR7eyBlbnYuSEFTX1RBS1VNSV9HVUFSRF9UT0tFTiA9PSAndHJ1ZScgfX1cIixcbiAgICAgIG5hbWU6ICdHZW5lcmF0ZSAubnBtcmMgZm9yIFRha3VtaSBHdWFyZCcsXG4gICAgICAvLyBUaGUgdG9rZW4gaXMgd3JpdHRlbiBhcyBhIGxpdGVyYWwgYCR7VEFLVU1JX0dVQVJEX1RPS0VOfWAgcmVmZXJlbmNlIHRoYXQgYnVuIGV4cGFuZHMgYXRcbiAgICAgIC8vIGluc3RhbGwgdGltZSwgc28gdGhlIHNlY3JldCBpdHNlbGYgbmV2ZXIgbGFuZHMgaW4gYSBmaWxlLiBUaGUgbWFuYWdlZCBsaW5lcyBhcmUgc3RyaXBwZWRcbiAgICAgIC8vIGZyb20gYW4gZXhpc3RpbmcgLm5wbXJjIGZpcnN0OiBhIHJlcG9zaXRvcnkgb3V0c2lkZSB0aGUgb3JnYW5pemF0aW9ucyBtYXkgbGVnaXRpbWF0ZWx5XG4gICAgICAvLyBjb21taXQgb25lIChzY29wZSBtYXBwaW5ncyBmb3IgYW5vdGhlciByZWdpc3RyeSksIGFuZCBkcm9wcGluZyBvbmx5IHRoZXNlIHR3byBsaW5lcyBrZWVwc1xuICAgICAgLy8gdGhlIHJlc3Qgb2YgaXQgaW4gZWZmZWN0LiBSZXBsYWNpbmcgdGhlIGZpbGUgd2l0aCBgbXZgIHJhdGhlciB0aGFuIGFwcGVuZGluZyBpbiBwbGFjZSBzdG9wc1xuICAgICAgLy8gYSBjb21taXR0ZWQgc3ltbGluayBmcm9tIHJlZGlyZWN0aW5nIHRoZSB3cml0ZSBpbnRvLCBzYXksIGEgcGVyc2lzdGVudCBob21lIG5wbXJjLlxuICAgICAgcnVuOiBgc2V0IC1ldW8gcGlwZWZhaWxcbk5QTVJDPVwiJChta3RlbXAgXCIkUlVOTkVSX1RFTVAvbnBtcmMuWFhYWFhYXCIpXCJcbmlmIFtbIC1lIC5ucG1yYyBdXTsgdGhlblxuICBncmVwIC12RSAnXnJlZ2lzdHJ5PXxeLy9ucG1cXFxcLmZsYXR0XFxcXC50ZWNoLzpfYXV0aFRva2VuJyAubnBtcmMgPiBcIiROUE1SQ1wiIHx8IHRydWVcbmZpXG5lY2hvICdyZWdpc3RyeT1odHRwczovL25wbS5mbGF0dC50ZWNoLycgPj4gXCIkTlBNUkNcIlxuZWNobyAnLy9ucG0uZmxhdHQudGVjaC86X2F1dGhUb2tlbj1cXCR7VEFLVU1JX0dVQVJEX1RPS0VOfScgPj4gXCIkTlBNUkNcIlxucm0gLWYgLm5wbXJjXG5tdiBcIiROUE1SQ1wiIC5ucG1yY2AsXG4gICAgfSxcbiAgICB7XG4gICAgICBuYW1lOiAnSW5zdGFsbCBkZXBlbmRlbmNpZXMnLFxuICAgICAgLy8gLS1mcm96ZW4tbG9ja2ZpbGU6IGEgcGxhaW4gYGJ1biBpbnN0YWxsYCBzaWxlbnRseSByZXBhaXJzIGEgYnVuLmxvY2sgdGhhdCBpcyBzdGFsZSBhZ2FpbnN0XG4gICAgICAvLyBwYWNrYWdlLmpzb24sIHNvIENJIHdvdWxkIHJ1biBkZXBlbmRlbmN5IHJlc29sdXRpb25zIHRoYXQgd2VyZSBuZXZlciByZXZpZXdlZCAoIzExMjYpLlxuICAgICAgLy8gV2l0aCBOTyBidW4ubG9jayBhdCBhbGwsIC0tZnJvemVuLWxvY2tmaWxlIHNpbGVudGx5IGluc3RhbGxzIGZyZXNoLCB1bnBpbm5lZCByZXNvbHV0aW9uc1xuICAgICAgLy8gKEJ1biAxLjMuMTQgZXhpdHMgMCBhbmQgd3JpdGVzIG5vIGxvY2tmaWxlKSwgc28gYSBtaXNzaW5nIGxvY2tmaWxlIG11c3QgZmFpbCBleHBsaWNpdGx5LlxuICAgICAgcnVuOiBgc2V0IC1ldW8gcGlwZWZhaWxcbmlmIFtbICEgLWUgYnVuLmxvY2sgXV07IHRoZW5cbiAgZWNobyBcIjo6ZXJyb3I6OmJ1bi5sb2NrIGlzIG1pc3Npbmc7IGNvbW1pdCBpdCBzbyBDSSBpbnN0YWxscyBzdGF5IHJlcHJvZHVjaWJsZVwiXG4gIGV4aXQgMVxuZmlcbmlmIFtbIFwiJEhBU19UQUtVTUlfR1VBUkRfVE9LRU5cIiA9PSBcInRydWVcIiBdXTsgdGhlblxuICBidW4gaW5zdGFsbCAtLWZyb3plbi1sb2NrZmlsZSAtLWlnbm9yZS1zY3JpcHRzXG5lbHNlXG4gIGJ1biBpbnN0YWxsIC0tZnJvemVuLWxvY2tmaWxlXG5maWAsXG4gICAgICAvLyBTdGVwLXNjb3BlZDogYSBqb2ItbGV2ZWwgdG9rZW4gd291bGQgYmUgcmVhZGFibGUgYnkgZXZlcnkgZGVwZW5kZW5jeSBsaWZlY3ljbGUgc2NyaXB0IHRoZVxuICAgICAgLy8gdG9rZW5sZXNzIHJlcGxheSBiZWxvdyBydW5zLlxuICAgICAgZW52OiB7IFRBS1VNSV9HVUFSRF9UT0tFTjogJyR7eyBzZWNyZXRzLlRBS1VNSV9HVUFSRF9UT0tFTiB9fScgfSxcbiAgICB9LFxuICAgIHtcbiAgICAgIGlmOiBcIiR7eyBlbnYuSEFTX1RBS1VNSV9HVUFSRF9UT0tFTiA9PSAndHJ1ZScgfX1cIixcbiAgICAgIG5hbWU6ICdSdW4gZGVwZW5kZW5jeSBsaWZlY3ljbGUgc2NyaXB0cyB3aXRob3V0IHJlZ2lzdHJ5IGNyZWRlbnRpYWxzJyxcbiAgICAgIC8vIEEgcmVwZWF0ZWQgYGJ1biBpbnN0YWxsYCBpcyBhIG5vLW9wIHRoYXQgcmVwbGF5cyBub3RoaW5nLCBzbyBub2RlX21vZHVsZXMgaGFzIHRvIGdvIGZpcnN0LlxuICAgICAgcnVuOiBgc2V0IC1ldW8gcGlwZWZhaWxcbnJtIC1yZiBub2RlX21vZHVsZXNcbmJ1biBpbnN0YWxsIC0tZnJvemVuLWxvY2tmaWxlJHtcbiAgICAgICAgdG9sZXJhdGVMaWZlY3ljbGVTY3JpcHRGYWlsdXJlXG4gICAgICAgICAgPyBgIHx8IHtcbiAgZWNobyBcIjo6d2FybmluZzo6TGlmZWN5Y2xlIHNjcmlwdHMgZmFpbGVkOyBjb21wbGV0aW5nIHRoZSBpbnN0YWxsIHdpdGhvdXQgdGhlbVwiXG4gIHJtIC1yZiBub2RlX21vZHVsZXNcbiAgYnVuIGluc3RhbGwgLS1mcm96ZW4tbG9ja2ZpbGUgLS1pZ25vcmUtc2NyaXB0c1xufWBcbiAgICAgICAgICA6ICcnXG4gICAgICB9YCxcbiAgICB9LFxuICAgIHtcbiAgICAgIGlmOiBcIiR7eyBlbnYuSEFTX1RBS1VNSV9HVUFSRF9UT0tFTiA9PSAndHJ1ZScgfX1cIixcbiAgICAgIG5hbWU6ICdSZW1vdmUgdGhlIGdlbmVyYXRlZCAubnBtcmMnLFxuICAgICAgLy8gTm90aGluZyBhZnRlciB0aGUgaW5zdGFsbCBuZWVkcyB0aGUgcHJveHksIGFuZCBsZWF2aW5nIGl0IGluIHBsYWNlIHdvdWxkIGJyZWFrIHRoZSBvbmVcbiAgICAgIC8vIHRoaW5nIEd1YXJkIHJlZnVzZXMgdG8gc2VydmU6IGl0IGFuc3dlcnMgYG5wbSBwdWJsaXNoYCB3aXRoIDQwNSwgc28gYSByZWxlYXNlIHdvcmtmbG93XG4gICAgICAvLyB3aG9zZSBwYWNrYWdlIGxhY2tzIGFuIGV4cGxpY2l0IHB1Ymxpc2hDb25maWcucmVnaXN0cnkgd291bGQgZmFpbCB0byBwdWJsaXNoLlxuICAgICAgcnVuOiBgc2V0IC1ldW8gcGlwZWZhaWxcbmlmIGdpdCBscy1maWxlcyAtLWVycm9yLXVubWF0Y2ggLS0gLm5wbXJjID4gL2Rldi9udWxsIDI+JjE7IHRoZW5cbiAgZ2l0IGNoZWNrb3V0IC0tIC5ucG1yY1xuZWxzZVxuICBybSAtZiAubnBtcmNcbmZpYCxcbiAgICB9LFxuICBdO1xufVxuXG5mdW5jdGlvbiBidWlsZFNlbWFudGljUHJXb3JrZmxvdygpOiBXb3JrZmxvdyB7XG4gIHJldHVybiB7XG4gICAgbmFtZTogJ0xpbnQgUFIgdGl0bGUnLFxuICAgIG9uOiB7XG4gICAgICBwdWxsX3JlcXVlc3RfdGFyZ2V0OiB7IHR5cGVzOiBbJ29wZW5lZCcsICdlZGl0ZWQnLCAnc3luY2hyb25pemUnXSB9LFxuICAgIH0sXG4gICAgam9iczoge1xuICAgICAgJ3NlbWFudGljLXByJzoge1xuICAgICAgICAncnVucy1vbic6ICd1YnVudHUtbGF0ZXN0JyxcbiAgICAgICAgLy8gVGhlIGFjdGlvbiByZWFkcyB0aGUgcHVsbCByZXF1ZXN0LCBhbmQgaXRzIGB3aXBgIHN1cHBvcnQgcG9zdHMgYSBjb21taXQgc3RhdHVzOyBuZWl0aGVyXG4gICAgICAgIC8vIHBlcm1pc3Npb24gaXMgZ3JhbnRlZCB3aGVuIHRoZSByZXBvc2l0b3J5IHJlc3RyaWN0cyBkZWZhdWx0IHdvcmtmbG93IHBlcm1pc3Npb25zLlxuICAgICAgICBwZXJtaXNzaW9uczogeyAncHVsbC1yZXF1ZXN0cyc6ICdyZWFkJywgc3RhdHVzZXM6ICd3cml0ZScgfSxcbiAgICAgICAgc3RlcHM6IFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICB1c2VzOiBzZW1hbnRpY1B1bGxSZXF1ZXN0QWN0aW9uLFxuICAgICAgICAgICAgd2l0aDogeyB3aXA6IHRydWUgfSxcbiAgICAgICAgICAgIGVudjogeyBHSVRIVUJfVE9LRU46ICcke3sgc2VjcmV0cy5HSVRIVUJfVE9LRU4gfX0nIH0sXG4gICAgICAgICAgfSxcbiAgICAgICAgXSxcbiAgICAgIH0sXG4gICAgfSxcbiAgfTtcbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCBzZW12ZXIgZnJvbSAnc2VtdmVyJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZnNVdGlsIH0gZnJvbSAnLi4vdXRpbHMvZnNVdGlsLmpzJztcbmltcG9ydCB7IHNwYXduU3luY0FuZFJldHVyblN0ZG91dCB9IGZyb20gJy4uL3V0aWxzL3NwYXduVXRpbC5qcyc7XG5cbmludGVyZmFjZSBNaXNlVG9tbCB7XG4gIHRvb2xzPzogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gIFtrZXk6IHN0cmluZ106IHVua25vd247XG59XG5cbi8vIFRoZSBvbGRlc3QgQnVuIHJ1bnRpbWUgd2JmeSBzdXBwb3J0cy5cbmV4cG9ydCBjb25zdCBtaW5pbXVtQnVuVmVyc2lvbiA9ICcxLjQuMCc7XG5cbi8qKlxuICogUGlucyBOb2RlLmpzIGFuZCB0aGUgbGF0ZXN0IEJ1biBhbmQgKHdoZW4gZm5veC50b21sIGV4aXN0cykgZm5veCB2ZXJzaW9ucyB3aGlsZSBwcmVzZXJ2aW5nXG4gKiB1bnJlbGF0ZWQgbWlzZSBzZXR0aW5ncy5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlTWlzZVRvbWwoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZ2VuZXJhdGVNaXNlVG9tbCcsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBtaXNlVG9tbFBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICdtaXNlLnRvbWwnKTtcbiAgICAvLyBBIHBhcnNlIGZhaWx1cmUgbXVzdCBhYm9ydCBpbnN0ZWFkIG9mIGZhbGxpbmcgYmFjayB0byB7fTogcmVnZW5lcmF0aW5nIGZyb20gYW4gZW1wdHkgb2JqZWN0XG4gICAgLy8gd291bGQgc2lsZW50bHkgcmVwbGFjZSB0aGUgdXNlcidzIGV4aXN0aW5nIChhbGJlaXQgYnJva2VuKSBtaXNlLnRvbWwuXG4gICAgY29uc3Qgc2V0dGluZ3MgPSBwYXJzZU1pc2VUb21sKG1pc2VUb21sUGF0aCk7XG4gICAgY29uc3QgdG9vbHMgPSB7IC4uLnNldHRpbmdzLnRvb2xzIH07XG5cbiAgICAvLyBFbnN1cmUgTm9kZS5qcyBpcyBhbHdheXMgcGlubmVkOiBnZW5lcmF0ZWQgaG9va3MgYW5kIENJIHJ1biBgbWlzZSBpbnN0YWxsYCwgYW5kIGFuIHVucGlubmVkXG4gICAgLy8gTm9kZSB3b3VsZCBjb21lIGZyb20gd2hhdGV2ZXIgaGFwcGVucyB0byBiZSBvbiBQQVRILlxuICAgIC8vIExpZnQtdGhlbi1waW46IHRoZSBsaWZ0IG9ubHkgdG91Y2hlcyBleGFjdCBwaW5zIGFuZCB0aGUgcGluIG9ubHkgdG91Y2hlcyBzZWxlY3RvcnMsIHNvXG4gICAgLy8gb3JkZXJpbmcgdGhlIGxpZnQgZmlyc3QgYXZvaWRzIHJlc29sdmluZyBgbWlzZSBsYXRlc3Qgbm9kZUBsdHNgIHR3aWNlIGZvciB1bnBpbm5lZCByZXBvcy5cbiAgICB0b29scy5ub2RlID0gcGluQ29uY3JldGVUb29sVmVyc2lvbihcbiAgICAgICdub2RlJyxcbiAgICAgIGxpZnRPdXRkYXRlZFRvb2xWZXJzaW9uV2l0aGluTWFqb3IoJ25vZGVAbHRzJywgdG9vbHMubm9kZSwgY29uZmlnLmRpclBhdGgpLFxuICAgICAgY29uZmlnLmRpclBhdGhcbiAgICApO1xuICAgIHRvb2xzLmJ1biA9IHBpbkxhdGVzdFRvb2xWZXJzaW9uKCdidW4nLCB0b29scy5idW4sIGNvbmZpZy5kaXJQYXRoKTtcbiAgICBpZiAoZnMuZXhpc3RzU3luYyhwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICdmbm94LnRvbWwnKSkpIHtcbiAgICAgIHRvb2xzLmZub3ggPSBwaW5MYXRlc3RUb29sVmVyc2lvbignZm5veCcsIHRvb2xzLmZub3gsIGNvbmZpZy5kaXJQYXRoKTtcbiAgICB9XG4gICAgc2V0dGluZ3MudG9vbHMgPSB0b29scztcblxuICAgIC8vIEB0cy1leHBlY3QtZXJyb3IgLS0gQnVuIDEuNCBwcm92aWRlcyBUT01MLnN0cmluZ2lmeSBiZWZvcmUgdGhlIGFnZS1nYXRlZCBAdHlwZXMvYnVuIHZlcnNpb24gZGVjbGFyZXMgaXQuXG4gICAgYXdhaXQgZnNVdGlsLmdlbmVyYXRlRmlsZShtaXNlVG9tbFBhdGgsIEJ1bi5UT01MLnN0cmluZ2lmeShzZXR0aW5ncykpO1xuICB9KTtcbn1cblxuLyoqIFVwZGF0ZXMgdG8gdGhlIGxhdGVzdCByZWxlYXNlIGFjcm9zcyBtYWpvciB2ZXJzaW9ucyB3aXRob3V0IGRvd25ncmFkaW5nIGV4aXN0aW5nIGV4YWN0IHBpbnMuICovXG5mdW5jdGlvbiBwaW5MYXRlc3RUb29sVmVyc2lvbih0b29sOiBzdHJpbmcsIHZlcnNpb246IHVua25vd24sIGN3ZDogc3RyaW5nKTogdW5rbm93biB7XG4gIC8vIFJlc29sdmUgaW5kZXBlbmRlbnRseSBvZiB0aGUgdGFyZ2V0J3MgdHJ1c3Qgc3RhdGUgYW5kIHRvb2wgYWxpYXNlcy5cbiAgY29uc3QgcmVzb2x2ZWRWZXJzaW9uID0gc3Bhd25TeW5jQW5kUmV0dXJuU3Rkb3V0KCdtaXNlJywgWyctLW5vLWNvbmZpZycsICdsYXRlc3QnLCB0b29sXSwgY3dkKTtcbiAgaWYgKCFzZW12ZXIudmFsaWQocmVzb2x2ZWRWZXJzaW9uKSkgcmV0dXJuIHZlcnNpb24gPz8gJ2xhdGVzdCc7XG4gIC8vIEEgY2FjaGVkIHJlbGVhc2UgbGlzdGluZyBjYW4gbGFnIGJlaGluZCBhbm90aGVyIG1hY2hpbmUgdGhhdCBhbHJlYWR5IHVwZGF0ZWQgdGhlIHBpbi5cbiAgcmV0dXJuIHR5cGVvZiB2ZXJzaW9uID09PSAnc3RyaW5nJyAmJiBzZW12ZXIudmFsaWQodmVyc2lvbikgJiYgc2VtdmVyLmd0KHZlcnNpb24sIHJlc29sdmVkVmVyc2lvbilcbiAgICA/IHZlcnNpb25cbiAgICA6IHJlc29sdmVkVmVyc2lvbjtcbn1cblxuLyoqXG4gKiBMaWZ0cyBhbiBleGFjdCB0b29sIHBpbiBiZWxvdyB0aGUgbGF0ZXN0IHJlc29sdmFibGUgdmVyc2lvbiDigJQgd2l0aGluIHRoZSBTQU1FIG1ham9yIOKAlCB0byB0aGF0XG4gKiB2ZXJzaW9uIChOb2RlLmpzIHJlc29sdmVzIGFnYWluc3QgdGhlIGxhdGVzdCBMVFMpOiB0aGUgcmVwb3NpdG9yeS1zdHJ1Y3R1cmUgc3RhbmRhcmQgdHJhY2tzIHRoZVxuICogY3VycmVudCB0b29sY2hhaW4gYWNyb3NzIHJlcG9zaXRvcmllcyBhbmQgUmVub3ZhdGUgZG9lcyBub3QgbWFuYWdlIG1pc2UudG9tbCBwaW5zLCBzb1xuICogcGF0Y2gvbWlub3IgZHJpZnQgKGUuZy4gbm9kZSAyNC4xNi4wIHZzIDI0LjE4LjApIG5ldmVyIHNlbGYtaGVhbHMuIEEgcGluXG4gKiBvbiBhbiBvbGRlciBtYWpvciBpcyBhIGRlbGliZXJhdGUgY29tcGF0aWJpbGl0eSBjaG9pY2UgYW5kIGlzIGtlcHQsIGFzIGFyZSBub24tZXhhY3QgYW5kXG4gKiBub24tc3RyaW5nIGZvcm1zLiBXaGVuIG1pc2UgY2Fubm90IHJlc29sdmUgdGhlIHNlbGVjdG9yIChlLmcuIG9mZmxpbmUpLCB0aGUgcGluIGlzIGtlcHQuXG4gKi9cbmZ1bmN0aW9uIGxpZnRPdXRkYXRlZFRvb2xWZXJzaW9uV2l0aGluTWFqb3Ioc2VsZWN0b3I6IHN0cmluZywgdmVyc2lvbjogdW5rbm93biwgY3dkOiBzdHJpbmcpOiB1bmtub3duIHtcbiAgaWYgKHR5cGVvZiB2ZXJzaW9uICE9PSAnc3RyaW5nJyB8fCAhc2VtdmVyLnZhbGlkKHZlcnNpb24pKSByZXR1cm4gdmVyc2lvbjtcbiAgY29uc3QgbGF0ZXN0VmVyc2lvbiA9IHNwYXduU3luY0FuZFJldHVyblN0ZG91dCgnbWlzZScsIFsnbGF0ZXN0Jywgc2VsZWN0b3JdLCBjd2QpO1xuICByZXR1cm4gc2VtdmVyLnZhbGlkKGxhdGVzdFZlcnNpb24pICYmXG4gICAgc2VtdmVyLm1ham9yKGxhdGVzdFZlcnNpb24pID09PSBzZW12ZXIubWFqb3IodmVyc2lvbikgJiZcbiAgICBzZW12ZXIubHQodmVyc2lvbiwgbGF0ZXN0VmVyc2lvbilcbiAgICA/IGxhdGVzdFZlcnNpb25cbiAgICA6IHZlcnNpb247XG59XG5cbi8qKlxuICogUmVwbGFjZXMgYW4gdW5waW5uZWQgc2VsZWN0b3IgKGBsYXRlc3RgLCBhIHJhbmdlIHN1Y2ggYXMgXCIyNFwiLCBhbiBhbGlhcywgb3IgYSBtaXNzaW5nIGVudHJ5KVxuICogd2l0aCB0aGUgbmV3ZXN0IGNvbmNyZXRlIHZlcnNpb24gbWlzZSByZXNvbHZlcyBmb3IgaXQsIGJlY2F1c2UgdGhlIHJlcG9zaXRvcnktc3RydWN0dXJlXG4gKiBzdGFuZGFyZCByZXF1aXJlcyBjb25jcmV0ZSBwaW5zOiBDSSBpbnN0YWxscyB3aGF0ZXZlciBhbiB1bnBpbm5lZCBzZWxlY3RvciByZXNvbHZlcyB0byBhdCBydW5cbiAqIHRpbWUsIHNvIGJ1aWxkcyBkcmlmdCBhY3Jvc3MgcnVucy4gRXhhY3QgdmVyc2lvbnMgYXJlIGtlcHQgYXMtaXMsIGFuZCBub24tc3RyaW5nIGZvcm1zIChtaXNlJ3NcbiAqIGFycmF5IGFuZCBgeyB2ZXJzaW9uID0gXCLigKZcIiB9YCBmb3JtcykgYXJlIHVzZXItbWFuYWdlZCBhbmQgbGVmdCB1bnRvdWNoZWQuIFdoZW4gbWlzZSBpc1xuICogdW5hdmFpbGFibGUgb3IgY2Fubm90IHJlc29sdmUgdGhlIHNlbGVjdG9yIChlLmcuIG9mZmxpbmUpLCB0aGUgb3JpZ2luYWwgc2VsZWN0b3IgaXMga2VwdCDigJRcbiAqIGFuIHVucGlubmVkIHRvb2wgaXMgYmV0dGVyIHRoYW4gYSBicm9rZW4gY29uZmlndXJhdGlvbi5cbiAqL1xuZnVuY3Rpb24gcGluQ29uY3JldGVUb29sVmVyc2lvbih0b29sOiBzdHJpbmcsIHZlcnNpb246IHVua25vd24sIGN3ZDogc3RyaW5nKTogdW5rbm93biB7XG4gIGlmICh2ZXJzaW9uICE9PSB1bmRlZmluZWQgJiYgKHR5cGVvZiB2ZXJzaW9uICE9PSAnc3RyaW5nJyB8fCBzZW12ZXIudmFsaWQodmVyc2lvbikpKSByZXR1cm4gdmVyc2lvbjtcbiAgLy8gTm9ybWFsaXplIHNlbGVjdG9yIGZvcm1zIGBtaXNlIGxhdGVzdGAgY2Fubm90IHJlc29sdmUgZXZlbiB0aG91Z2ggbWlzZSBjb25maWd1cmF0aW9uIGFjY2VwdHNcbiAgLy8gdGhlbTogYHByZWZpeDoyNGAgaXMgcmVqZWN0ZWQgb3V0cmlnaHQgd2hpbGUgYDI0YCByZXNvbHZlcywgYW5kIGBsdHMvKmAgeWllbGRzIGVtcHR5IG91dHB1dFxuICAvLyB3aGlsZSBgbHRzYCByZXNvbHZlcy4gTW9kaWZpZXIgc2VsZWN0b3JzIHN1Y2ggYXMgYHN1Yi0yOmx0c2Agc3RheSB1bnJlc29sdmFibGUgYW5kIGZhbGwgYmFja1xuICAvLyB0byB0aGUgb3JpZ2luYWwgc2VsZWN0b3IgYmVsb3cuXG4gIGNvbnN0IHJhbmdlID0gdHlwZW9mIHZlcnNpb24gPT09ICdzdHJpbmcnID8gdmVyc2lvbi5yZXBsYWNlKC9ecHJlZml4Oi91LCAnJykucmVwbGFjZSgvXFwvXFwqJC91LCAnJykgOiB1bmRlZmluZWQ7XG4gIC8vIFdpdGggbm8gbWVhbmluZ2Z1bCBzZWxlY3RvciwgTm9kZS5qcyBwaW5zIHRvIHRoZSBsYXRlc3QgTFRTIChtYXRjaGluZyB0aGUgcmV1c2FibGUgd29ya2Zsb3dzJ1xuICAvLyBgbHRzLypgIGZhbGxiYWNrKSByYXRoZXIgdGhhbiB0aGUgbmV3ZXN0IHJlbGVhc2UuXG4gIGNvbnN0IGRlZmF1bHRTZWxlY3RvciA9IHRvb2wgPT09ICdub2RlJyA/ICdub2RlQGx0cycgOiB0b29sO1xuICBjb25zdCBzZWxlY3RvciA9IHJhbmdlICYmIHJhbmdlICE9PSAnbGF0ZXN0JyA/IGAke3Rvb2x9QCR7cmFuZ2V9YCA6IGRlZmF1bHRTZWxlY3RvcjtcbiAgY29uc3QgcmVzb2x2ZWRWZXJzaW9uID0gc3Bhd25TeW5jQW5kUmV0dXJuU3Rkb3V0KCdtaXNlJywgWydsYXRlc3QnLCBzZWxlY3Rvcl0sIGN3ZCk7XG4gIHJldHVybiBzZW12ZXIudmFsaWQocmVzb2x2ZWRWZXJzaW9uKSA/IHJlc29sdmVkVmVyc2lvbiA6ICh2ZXJzaW9uID8/ICdsYXRlc3QnKTtcbn1cblxuZnVuY3Rpb24gcGFyc2VNaXNlVG9tbChtaXNlVG9tbFBhdGg6IHN0cmluZyk6IE1pc2VUb21sIHtcbiAgbGV0IGNvbnRlbnQ6IHN0cmluZztcbiAgdHJ5IHtcbiAgICBjb250ZW50ID0gZnMucmVhZEZpbGVTeW5jKG1pc2VUb21sUGF0aCwgJ3V0ZjgnKTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAvLyBPbmx5IGEgcmVwb3NpdG9yeSB3aXRob3V0IG1pc2UudG9tbCBzdGFydHMgZnJvbSBhbiBlbXB0eSBjb25maWd1cmF0aW9uOyBhbiB1bnJlYWRhYmxlIGZpbGVcbiAgICAvLyAoZS5nLiBwZXJtaXNzaW9ucykgbXVzdCBhYm9ydCBpbnN0ZWFkIG9mIGJlaW5nIG92ZXJ3cml0dGVuIHdpdGggZ2VuZXJhdGVkIHNldHRpbmdzLlxuICAgIGlmICgoZXJyb3IgYXMgTm9kZUpTLkVycm5vRXhjZXB0aW9uKS5jb2RlID09PSAnRU5PRU5UJykgcmV0dXJuIHt9O1xuICAgIHRocm93IGVycm9yO1xuICB9XG4gIHJldHVybiBCdW4uVE9NTC5wYXJzZShjb250ZW50KSBhcyBNaXNlVG9tbDtcbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZnNVdGlsIH0gZnJvbSAnLi4vdXRpbHMvZnNVdGlsLmpzJztcbmltcG9ydCB7IHByaXZhdGVSZWdpc3RyeVNjb3BlTWFwcGluZywgcmVwb1Jlc29sdmVzUHJpdmF0ZVBhY2thZ2VzIH0gZnJvbSAnLi4vdXRpbHMvcHJpdmF0ZVBhY2thZ2VzLmpzJztcblxuLyoqXG4gKiBCdW4gcmVhZHMgcmVnaXN0cnkgc2NvcGUgbWFwcGluZ3MgZnJvbSBhIHBoeXNpY2FsIHJlcG9zaXRvcnkgLm5wbXJjIGR1cmluZyBSZW5vdmF0ZSBhcnRpZmFjdFxuICogdXBkYXRlczsgUmVub3ZhdGUncyBucG1yYyBzZXR0aW5nIGlzIHVzZWQgb25seSBieSBpdHMgZGF0YXNvdXJjZSBsYXllci4gS2VlcCB0aGUgbm9uLXNlY3JldFxuICogbWFwcGluZyBpbiByZXBvc2l0b3JpZXMgdGhhdCByZXNvbHZlIHByaXZhdGUgcGFja2FnZXMsIHdoaWxlIGF1dGhlbnRpY2F0aW9uIHJlbWFpbnMgaW4gdGhlXG4gKiBkZXZlbG9wZXIncyB+Ly5ucG1yYyBsb2NhbGx5IGFuZCBpbiB0ZW1wb3JhcnkgQ0kgb3IgTWVuZCBjb25maWd1cmF0aW9uLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVSZXBvc2l0b3J5TnBtcmMoY29uZmlnczogUGFja2FnZUNvbmZpZ1tdKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IHJlcG9BdXRob3IgPSBjb25maWdzWzBdPy5yZXBvQXV0aG9yO1xuICBpZiAocmVwb0F1dGhvciAhPT0gJ1dpbGxCb29zdGVyJyAmJiByZXBvQXV0aG9yICE9PSAnV2lsbEJvb3N0ZXJMYWInKSByZXR1cm47XG5cbiAgY29uc3QgbnBtcmNQYXRocyA9IG5ldyBTZXQoY29uZmlncy5tYXAoKGNvbmZpZykgPT4gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnLm5wbXJjJykpKTtcbiAgY29uc3Qgcm9vdENvbmZpZyA9IGNvbmZpZ3MuZmluZCgoY29uZmlnKSA9PiBjb25maWcuaXNSb290KTtcbiAgaWYgKHJvb3RDb25maWcgJiYgcmVwb1Jlc29sdmVzUHJpdmF0ZVBhY2thZ2VzKHJvb3RDb25maWcpKSB7XG4gICAgY29uc3Qgcm9vdE5wbXJjUGF0aCA9IHBhdGgucmVzb2x2ZShyb290Q29uZmlnLmRpclBhdGgsICcubnBtcmMnKTtcbiAgICBhd2FpdCBmc1V0aWwuZ2VuZXJhdGVGaWxlKHJvb3ROcG1yY1BhdGgsIHByaXZhdGVSZWdpc3RyeVNjb3BlTWFwcGluZyk7XG4gICAgbnBtcmNQYXRocy5kZWxldGUocm9vdE5wbXJjUGF0aCk7XG4gIH1cblxuICBmb3IgKGNvbnN0IG5wbXJjUGF0aCBvZiBucG1yY1BhdGhzKSBhd2FpdCByZW1vdmVOcG1yYyhucG1yY1BhdGgpO1xufVxuXG5hc3luYyBmdW5jdGlvbiByZW1vdmVOcG1yYyhucG1yY1BhdGg6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICBpZiAoIShhd2FpdCBmcy5wcm9taXNlcy5sc3RhdChucG1yY1BhdGgpLmNhdGNoKCgpID0+IHt9KSkpIHJldHVybjtcbiAgaWYgKGF3YWl0IGZzVXRpbC5yZW1vdmVDb25maW5lZChucG1yY1BhdGgpKSB7XG4gICAgY29uc29sZS5pbmZvKGBSZW1vdmVkIG5vbi1jYW5vbmljYWwgcmVwb3NpdG9yeSBucG1yYyAke25wbXJjUGF0aH0uYCk7XG4gIH1cbn1cbiIsImltcG9ydCB0eXBlIHsgT2N0b2tpdCB9IGZyb20gJ0BvY3Rva2l0L2NvcmUnO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBnZXRPY3Rva2l0LCBoYXNHaXRIdWJUb2tlbiB9IGZyb20gJy4uL3V0aWxzL2dpdGh1YlV0aWwuanMnO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gc2V0dXBMYWJlbHMoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignc2V0dXBMYWJlbHMnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgeyByZXBvQXV0aG9yOiBvd25lciwgcmVwb05hbWU6IHJlcG8gfSA9IGNvbmZpZztcbiAgICBpZiAoIW93bmVyIHx8ICFyZXBvKSByZXR1cm47XG4gICAgaWYgKG93bmVyICE9PSAnV2lsbEJvb3N0ZXInICYmIG93bmVyICE9PSAnV2lsbEJvb3N0ZXJMYWInKSByZXR1cm47XG4gICAgaWYgKCFoYXNHaXRIdWJUb2tlbihvd25lcikpIHJldHVybjtcblxuICAgIGNvbnN0IG9jdG9raXQgPSBnZXRPY3Rva2l0KG93bmVyKTtcblxuICAgIHRyeSB7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAnZDE6IHgtZWFzeSA6aGVkZ2Vob2c6JywgJ0VERTlGRScpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ2QyOiBlYXN5IDpyYWJiaXQyOicsICdEREQ2RkUnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdkMzogbWVkaXVtIDpveDonLCAnQzRCNUZEJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAnZDQ6IGhhcmQgOnNxdWlkOicsICdBNzhCRkEnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdkNTogeC1oYXJkIDp3aGFsZTI6JywgJzhCNUNGNicpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ3AxOiBjcml0aWNhbCA6ZmlyZTo6ZmlyZTo6ZmlyZTonLCAnRUY0NDQ0Jyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAncDI6IHVyZ2VudCA6ZmlyZTo6ZmlyZTonLCAnRjg3MTcxJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAncDM6IGltcG9ydGFudCA6ZmlyZTonLCAnRkNBNUE1Jyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAncDQ6IG5pY2UgdG8gaGF2ZSA6ZHJvcGxldDonLCAnRkVDQUNBJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAncjogYmxpdHonLCAnNTMwMGJjJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAncjogZmlyZWJhc2UnLCAnZmZjYTI4Jyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAncjogcHJpc21hJywgJzBjMzQ0YicpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ3I6IHJlYWN0JywgJzYxZGFmYicpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ3I6IHNlbWFudGljLXJlbGVhc2UnLCAnNDk0OTQ5Jyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAncmVhZHkgOnJvY2tldDonLCAnMjJDNTVFJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAncmV2aWV3IHJlcXVlc3RlZCA6bWFnOicsICdGQkNBMDQnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdyZWxlYXNlZCA6Ym9va21hcms6JywgJzYzNjZGMScpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ3M6IDAuNWggOmNsb2NrMTIzMDonLCAnRjNGNEY2Jyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAnczogMWggOmNsb2NrMTonLCAnRTVFN0VCJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAnczogMmggOmNsb2NrMjonLCAnRDFENURCJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAnczogM2ggOmNsb2NrMzonLCAnOUNBM0FGJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAnczogNWggOmNsb2NrNTonLCAnNkI3MjgwJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAnczogOGggOmNsb2NrODonLCAnNEI1NTYzJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAnczogMTNoIDpjbG9jazE6JywgJzM3NDE1MScpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ3Q6IGJ1aWxkIDpoYW1tZXI6JywgJ0JGREJGRScpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ3Q6IGNob3JlIDpicm9vbTonLCAnQkZEQkZFJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAndDogY2kgOmNvbnN0cnVjdGlvbl93b3JrZXI6JywgJ0JGREJGRScpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ3Q6IGRvY3MgOm1lbW86JywgJ0JGREJGRScpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ3Q6IGZlYXQgOnNwYXJrbGVzOicsICdCRkRCRkUnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICd0OiBmaXggOmJ1ZzonLCAnQkZEQkZFJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAndDogcGVyZiA6emFwOicsICdCRkRCRkUnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICd0OiByZWZhY3RvciA6cmVjeWNsZTonLCAnQkZEQkZFJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAndDogc3R5bGUgOmxpcHN0aWNrOicsICdCRkRCRkUnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICd0OiB0ZXN0IDp0ZXN0X3R1YmU6JywgJ0JGREJGRScpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ3Byb2plY3QnLCAnMjQyOTJGJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAnZm9jdXNlZCA6ZGFydDonLCAnMjJDNTVFJyk7XG5cbiAgICAgIGF3YWl0IGRlbGV0ZUxhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAnYnVnJyk7XG4gICAgICBhd2FpdCBkZWxldGVMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ2RvY3VtZW50YXRpb24nKTtcbiAgICAgIGF3YWl0IGRlbGV0ZUxhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAnZHVwbGljYXRlJyk7XG4gICAgICBhd2FpdCBkZWxldGVMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ2VuaGFuY2VtZW50Jyk7XG4gICAgICBhd2FpdCBkZWxldGVMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ2dvb2QgZmlyc3QgaXNzdWUnKTtcbiAgICAgIGF3YWl0IGRlbGV0ZUxhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAnaGVscCB3YW50ZWQnKTtcbiAgICAgIGF3YWl0IGRlbGV0ZUxhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAnaW52YWxpZCcpO1xuICAgICAgYXdhaXQgZGVsZXRlTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdxdWVzdGlvbicpO1xuICAgICAgYXdhaXQgZGVsZXRlTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICd3b250Zml4Jyk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNvbnNvbGUud2FybignU2tpcCBzZXR1cExhYmVscyBkdWUgdG86JywgKGVycm9yIGFzIEVycm9yIHwgdW5kZWZpbmVkKT8uc3RhY2sgPz8gZXJyb3IpO1xuICAgIH1cbiAgfSk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHNldHVwTGFiZWwob2N0b2tpdDogT2N0b2tpdCwgb3duZXI6IHN0cmluZywgcmVwbzogc3RyaW5nLCBuYW1lOiBzdHJpbmcsIGNvbG9yOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgdHJ5IHtcbiAgICBhd2FpdCBvY3Rva2l0LnJlcXVlc3QoJ1BPU1QgL3JlcG9zL3tvd25lcn0ve3JlcG99L2xhYmVscycsIHtcbiAgICAgIG93bmVyLFxuICAgICAgcmVwbyxcbiAgICAgIG5hbWUsXG4gICAgICBjb2xvcixcbiAgICB9KTtcbiAgfSBjYXRjaCB7XG4gICAgYXdhaXQgb2N0b2tpdC5yZXF1ZXN0KCdQQVRDSCAvcmVwb3Mve293bmVyfS97cmVwb30vbGFiZWxzL3tuYW1lfScsIHtcbiAgICAgIG93bmVyLFxuICAgICAgcmVwbyxcbiAgICAgIG5hbWUsXG4gICAgICBjb2xvcixcbiAgICB9KTtcbiAgfVxufVxuXG5hc3luYyBmdW5jdGlvbiBkZWxldGVMYWJlbChvY3Rva2l0OiBPY3Rva2l0LCBvd25lcjogc3RyaW5nLCByZXBvOiBzdHJpbmcsIG5hbWU6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICB0cnkge1xuICAgIGF3YWl0IG9jdG9raXQucmVxdWVzdCgnREVMRVRFIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9sYWJlbHMve25hbWV9Jywge1xuICAgICAgb3duZXIsXG4gICAgICByZXBvLFxuICAgICAgbmFtZSxcbiAgICB9KTtcbiAgfSBjYXRjaCB7XG4gICAgLy8gZG8gbm90aGluZ1xuICB9XG59XG4iLCJpbXBvcnQgdHlwZSB7IE9jdG9raXQgfSBmcm9tICdAb2N0b2tpdC9jb3JlJztcbmltcG9ydCB7IHdpdGhSZXRyeSB9IGZyb20gJ0B3aWxsYm9vc3Rlci9zaGFyZWQtbGliL3NyYyc7XG5cbmltcG9ydCB7IGlzUmV1c2FibGVXb3JrZmxvd3NSZXBvIH0gZnJvbSAnLi4vZ2VuZXJhdG9ycy93b3JrZmxvdy5qcyc7XG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBnZXRPY3Rva2l0LCBoYXNHaXRIdWJUb2tlbiwgaXNHaXRIdWJQZXJtaXNzaW9uT3JWaXNpYmlsaXR5RXJyb3IgfSBmcm9tICcuLi91dGlscy9naXRodWJVdGlsLmpzJztcblxuaW50ZXJmYWNlIFJlcG9zaXRvcnlSdWxlc2V0UGF5bG9hZCB7XG4gIG5hbWU6IHN0cmluZztcbiAgdGFyZ2V0OiAnYnJhbmNoJztcbiAgZW5mb3JjZW1lbnQ6ICdhY3RpdmUnO1xuICBjb25kaXRpb25zOiB7XG4gICAgcmVmX25hbWU6IHtcbiAgICAgIGluY2x1ZGU6IHN0cmluZ1tdO1xuICAgICAgZXhjbHVkZTogc3RyaW5nW107XG4gICAgfTtcbiAgfTtcbiAgcnVsZXM6IChcbiAgICB8IHtcbiAgICAgICAgdHlwZTogJ2RlbGV0aW9uJyB8ICdub25fZmFzdF9mb3J3YXJkJztcbiAgICAgIH1cbiAgICB8IHtcbiAgICAgICAgdHlwZTogJ3JlcXVpcmVkX3N0YXR1c19jaGVja3MnO1xuICAgICAgICBwYXJhbWV0ZXJzOiB7XG4gICAgICAgICAgc3RyaWN0X3JlcXVpcmVkX3N0YXR1c19jaGVja3NfcG9saWN5OiBib29sZWFuO1xuICAgICAgICAgIGRvX25vdF9lbmZvcmNlX29uX2NyZWF0ZTogYm9vbGVhbjtcbiAgICAgICAgICByZXF1aXJlZF9zdGF0dXNfY2hlY2tzOiB7XG4gICAgICAgICAgICBjb250ZXh0OiBzdHJpbmc7XG4gICAgICAgICAgICBpbnRlZ3JhdGlvbl9pZDogbnVtYmVyO1xuICAgICAgICAgIH1bXTtcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICB8IHtcbiAgICAgICAgdHlwZTogJ3B1bGxfcmVxdWVzdCc7XG4gICAgICAgIHBhcmFtZXRlcnM6IHtcbiAgICAgICAgICByZXF1aXJlZF9hcHByb3ZpbmdfcmV2aWV3X2NvdW50OiBudW1iZXI7XG4gICAgICAgICAgZGlzbWlzc19zdGFsZV9yZXZpZXdzX29uX3B1c2g6IGJvb2xlYW47XG4gICAgICAgICAgcmVxdWlyZWRfcmV2aWV3ZXJzOiBbXTtcbiAgICAgICAgICByZXF1aXJlX2NvZGVfb3duZXJfcmV2aWV3OiBib29sZWFuO1xuICAgICAgICAgIHJlcXVpcmVfbGFzdF9wdXNoX2FwcHJvdmFsOiBib29sZWFuO1xuICAgICAgICAgIHJlcXVpcmVkX3Jldmlld190aHJlYWRfcmVzb2x1dGlvbjogYm9vbGVhbjtcbiAgICAgICAgICBhbGxvd2VkX21lcmdlX21ldGhvZHM6IFsnc3F1YXNoJ107XG4gICAgICAgIH07XG4gICAgICB9XG4gIClbXTtcbiAgYnlwYXNzX2FjdG9yczoge1xuICAgIGFjdG9yX2lkOiBudW1iZXI7XG4gICAgYWN0b3JfdHlwZTogJ1RlYW0nO1xuICAgIGJ5cGFzc19tb2RlOiAncHVsbF9yZXF1ZXN0JztcbiAgfVtdO1xufVxuXG5pbnRlcmZhY2UgUmVwb3NpdG9yeVJ1bGVzZXRTdW1tYXJ5IHtcbiAgaWQ/OiBudW1iZXI7XG4gIG5hbWU/OiBzdHJpbmc7XG4gIHNvdXJjZV90eXBlPzogc3RyaW5nO1xufVxuXG5jb25zdCBHSVRIVUJfQVBJX1ZFUlNJT05fSEVBREVSID0ge1xuICAnWC1HaXRIdWItQXBpLVZlcnNpb24nOiAnMjAyMi0xMS0yOCcsXG59IGFzIGNvbnN0O1xuXG5jb25zdCBHSVRIVUJfQUNUSU9OU19JTlRFR1JBVElPTl9JRCA9IDE1XzM2ODtcblxuY29uc3QgUFJPVEVDVF9NQUlOX1JVTEVTRVQ6IFJlcG9zaXRvcnlSdWxlc2V0UGF5bG9hZCA9IHtcbiAgbmFtZTogJ1Byb3RlY3QgbWFpbicsXG4gIHRhcmdldDogJ2JyYW5jaCcsXG4gIGVuZm9yY2VtZW50OiAnYWN0aXZlJyxcbiAgY29uZGl0aW9uczoge1xuICAgIHJlZl9uYW1lOiB7XG4gICAgICBleGNsdWRlOiBbXSxcbiAgICAgIGluY2x1ZGU6IFsnfkRFRkFVTFRfQlJBTkNIJ10sXG4gICAgfSxcbiAgfSxcbiAgcnVsZXM6IFtcbiAgICB7XG4gICAgICB0eXBlOiAnZGVsZXRpb24nLFxuICAgIH0sXG4gICAge1xuICAgICAgdHlwZTogJ3JlcXVpcmVkX3N0YXR1c19jaGVja3MnLFxuICAgICAgcGFyYW1ldGVyczoge1xuICAgICAgICBzdHJpY3RfcmVxdWlyZWRfc3RhdHVzX2NoZWNrc19wb2xpY3k6IGZhbHNlLFxuICAgICAgICBkb19ub3RfZW5mb3JjZV9vbl9jcmVhdGU6IHRydWUsXG4gICAgICAgIHJlcXVpcmVkX3N0YXR1c19jaGVja3M6IFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICBjb250ZXh0OiAndGVzdCAvIHRlc3QnLFxuICAgICAgICAgICAgaW50ZWdyYXRpb25faWQ6IEdJVEhVQl9BQ1RJT05TX0lOVEVHUkFUSU9OX0lELFxuICAgICAgICAgIH0sXG4gICAgICAgICAge1xuICAgICAgICAgICAgY29udGV4dDogJ3NlbWFudGljLXByIC8gc2VtYW50aWMtcHInLFxuICAgICAgICAgICAgaW50ZWdyYXRpb25faWQ6IEdJVEhVQl9BQ1RJT05TX0lOVEVHUkFUSU9OX0lELFxuICAgICAgICAgIH0sXG4gICAgICAgIF0sXG4gICAgICB9LFxuICAgIH0sXG4gICAge1xuICAgICAgdHlwZTogJ25vbl9mYXN0X2ZvcndhcmQnLFxuICAgIH0sXG4gICAge1xuICAgICAgdHlwZTogJ3B1bGxfcmVxdWVzdCcsXG4gICAgICBwYXJhbWV0ZXJzOiB7XG4gICAgICAgIHJlcXVpcmVkX2FwcHJvdmluZ19yZXZpZXdfY291bnQ6IDAsXG4gICAgICAgIGRpc21pc3Nfc3RhbGVfcmV2aWV3c19vbl9wdXNoOiBmYWxzZSxcbiAgICAgICAgcmVxdWlyZWRfcmV2aWV3ZXJzOiBbXSxcbiAgICAgICAgcmVxdWlyZV9jb2RlX293bmVyX3JldmlldzogZmFsc2UsXG4gICAgICAgIHJlcXVpcmVfbGFzdF9wdXNoX2FwcHJvdmFsOiBmYWxzZSxcbiAgICAgICAgcmVxdWlyZWRfcmV2aWV3X3RocmVhZF9yZXNvbHV0aW9uOiBmYWxzZSxcbiAgICAgICAgYWxsb3dlZF9tZXJnZV9tZXRob2RzOiBbJ3NxdWFzaCddLFxuICAgICAgfSxcbiAgICB9LFxuICBdLFxuICBieXBhc3NfYWN0b3JzOiBbXG4gICAge1xuICAgICAgYWN0b3JfaWQ6IDE3Xzc3N180OTUsXG4gICAgICBhY3Rvcl90eXBlOiAnVGVhbScsXG4gICAgICBieXBhc3NfbW9kZTogJ3B1bGxfcmVxdWVzdCcsXG4gICAgfSxcbiAgXSxcbn07XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBzZXR1cFJlcG9zaXRvcnlSdWxlc2V0cyhjb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdzZXR1cFJlcG9zaXRvcnlSdWxlc2V0cycsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCB7IHJlcG9BdXRob3I6IG93bmVyLCByZXBvTmFtZTogcmVwbyB9ID0gY29uZmlnO1xuICAgIGlmICghb3duZXIgfHwgIXJlcG8pIHJldHVybjtcbiAgICBpZiAob3duZXIgIT09ICdXaWxsQm9vc3RlcicpIHJldHVybjtcbiAgICAvLyBUaGUgcmV1c2FibGUtd29ya2Zsb3dzIHJlcG8gaG9zdHMgd29ya2Zsb3dfY2FsbCBkZWZpbml0aW9ucywgc28gdGhlXG4gICAgLy8gUHJvdGVjdCBtYWluIHJ1bGVzZXQgd291bGQgcmVxdWlyZSB0ZXN0L3NlbWFudGljLXByIGNoZWNrcyB0aGF0IG5ldmVyIHJ1biB0aGVyZS5cbiAgICBpZiAoaXNSZXVzYWJsZVdvcmtmbG93c1JlcG8oY29uZmlnLnJlcG9zaXRvcnkpKSByZXR1cm47XG4gICAgaWYgKCFoYXNHaXRIdWJUb2tlbihvd25lcikpIHJldHVybjtcblxuICAgIGNvbnN0IG9jdG9raXQgPSBnZXRPY3Rva2l0KG93bmVyKTtcblxuICAgIHRyeSB7XG4gICAgICBhd2FpdCB1cHNlcnRQcm90ZWN0TWFpblJ1bGVzZXQob2N0b2tpdCwgb3duZXIsIHJlcG8sIGJ1aWxkUHJvdGVjdE1haW5SdWxlc2V0KGNvbmZpZykpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBpZiAoIWlzR2l0SHViUGVybWlzc2lvbk9yVmlzaWJpbGl0eUVycm9yKGVycm9yKSkgdGhyb3cgZXJyb3I7XG5cbiAgICAgIC8vIFJlcG9zaXRvcnkgcnVsZXNldHMgcmVxdWlyZSBhZG1pbmlzdHJhdGlvbiBwZXJtaXNzaW9uLCB3aGljaCBsb2NhbCBydW5zXG4gICAgICAvLyBtYXkgbm90IGhhdmUgZXZlbiB3aGVuIGZpbGUtZ2VuZXJhdGlvbiBhbmQgcHVzaGVzIGFyZSBhbGxvd2VkLlxuICAgICAgY29uc29sZS53YXJuKCdTa2lwIHNldHVwUmVwb3NpdG9yeVJ1bGVzZXRzIGR1ZSB0bzonLCAoZXJyb3IgYXMgRXJyb3IgfCB1bmRlZmluZWQpPy5zdGFjayA/PyBlcnJvcik7XG4gICAgfVxuICB9KTtcbn1cblxuZnVuY3Rpb24gYnVpbGRQcm90ZWN0TWFpblJ1bGVzZXQoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUmVwb3NpdG9yeVJ1bGVzZXRQYXlsb2FkIHtcbiAgY29uc3QgcnVsZXNldCA9IHN0cnVjdHVyZWRDbG9uZShQUk9URUNUX01BSU5fUlVMRVNFVCk7XG4gIGlmIChjb25maWcuY2FyZ29Ub21sRGlyUGF0aHMubGVuZ3RoID4gMCkge1xuICAgIGZvciAoY29uc3QgcnVsZSBvZiBydWxlc2V0LnJ1bGVzKSB7XG4gICAgICBpZiAocnVsZS50eXBlICE9PSAncmVxdWlyZWRfc3RhdHVzX2NoZWNrcycpIGNvbnRpbnVlO1xuICAgICAgLy8gVGhlIGNvbnRleHQgaXMgYDxjYWxsZXIgam9iIGlkPiAvIDxyZXVzYWJsZSBqb2IgaWQ+YCBvZiB0aGUgd2JmeS1nZW5lcmF0ZWQgdGVzdC1ydXN0LnltbC5cbiAgICAgIHJ1bGUucGFyYW1ldGVycy5yZXF1aXJlZF9zdGF0dXNfY2hlY2tzLnB1c2goe1xuICAgICAgICBjb250ZXh0OiAndGVzdC1ydXN0IC8gdGVzdC1ydXN0JyxcbiAgICAgICAgaW50ZWdyYXRpb25faWQ6IEdJVEhVQl9BQ1RJT05TX0lOVEVHUkFUSU9OX0lELFxuICAgICAgfSk7XG4gICAgfVxuICB9XG4gIHJldHVybiBydWxlc2V0O1xufVxuXG5hc3luYyBmdW5jdGlvbiB1cHNlcnRQcm90ZWN0TWFpblJ1bGVzZXQoXG4gIG9jdG9raXQ6IE9jdG9raXQsXG4gIG93bmVyOiBzdHJpbmcsXG4gIHJlcG86IHN0cmluZyxcbiAgcnVsZXNldDogUmVwb3NpdG9yeVJ1bGVzZXRQYXlsb2FkXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgZXhpc3RpbmdSdWxlc2V0ID0gYXdhaXQgZmluZFJlcG9zaXRvcnlSdWxlc2V0KG9jdG9raXQsIG93bmVyLCByZXBvLCBydWxlc2V0Lm5hbWUpO1xuICBjb25zdCBleGlzdGluZ1J1bGVzZXRJZCA9IGV4aXN0aW5nUnVsZXNldD8uaWQ7XG5cbiAgYXdhaXQgd2l0aFJldHJ5KFxuICAgIGFzeW5jICgpID0+IHtcbiAgICAgIGlmIChleGlzdGluZ1J1bGVzZXRJZCkge1xuICAgICAgICBhd2FpdCBvY3Rva2l0LnJlcXVlc3QoJ1BVVCAvcmVwb3Mve293bmVyfS97cmVwb30vcnVsZXNldHMve3J1bGVzZXRfaWR9Jywge1xuICAgICAgICAgIG93bmVyLFxuICAgICAgICAgIHJlcG8sXG4gICAgICAgICAgcnVsZXNldF9pZDogZXhpc3RpbmdSdWxlc2V0SWQsXG4gICAgICAgICAgLi4ucnVsZXNldCxcbiAgICAgICAgICBoZWFkZXJzOiBHSVRIVUJfQVBJX1ZFUlNJT05fSEVBREVSLFxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBhd2FpdCBvY3Rva2l0LnJlcXVlc3QoJ1BPU1QgL3JlcG9zL3tvd25lcn0ve3JlcG99L3J1bGVzZXRzJywge1xuICAgICAgICBvd25lcixcbiAgICAgICAgcmVwbyxcbiAgICAgICAgLi4ucnVsZXNldCxcbiAgICAgICAgaGVhZGVyczogR0lUSFVCX0FQSV9WRVJTSU9OX0hFQURFUixcbiAgICAgIH0pO1xuICAgIH0sXG4gICAge1xuICAgICAgc2hvdWxkUmV0cnk6IChlcnJvcikgPT4gIWlzR2l0SHViUGVybWlzc2lvbk9yVmlzaWJpbGl0eUVycm9yKGVycm9yKSxcbiAgICB9XG4gICk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGZpbmRSZXBvc2l0b3J5UnVsZXNldChcbiAgb2N0b2tpdDogT2N0b2tpdCxcbiAgb3duZXI6IHN0cmluZyxcbiAgcmVwbzogc3RyaW5nLFxuICBydWxlc2V0TmFtZTogc3RyaW5nXG4pOiBQcm9taXNlPFJlcG9zaXRvcnlSdWxlc2V0U3VtbWFyeSB8IHVuZGVmaW5lZD4ge1xuICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHdpdGhSZXRyeShcbiAgICAoKSA9PlxuICAgICAgb2N0b2tpdC5yZXF1ZXN0KCdHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L3J1bGVzZXRzJywge1xuICAgICAgICBvd25lcixcbiAgICAgICAgcmVwbyxcbiAgICAgICAgaW5jbHVkZXNfcGFyZW50czogZmFsc2UsXG4gICAgICAgIHRhcmdldHM6ICdicmFuY2gnLFxuICAgICAgICBoZWFkZXJzOiBHSVRIVUJfQVBJX1ZFUlNJT05fSEVBREVSLFxuICAgICAgfSksXG4gICAge1xuICAgICAgc2hvdWxkUmV0cnk6IChlcnJvcikgPT4gIWlzR2l0SHViUGVybWlzc2lvbk9yVmlzaWJpbGl0eUVycm9yKGVycm9yKSxcbiAgICB9XG4gICk7XG4gIGNvbnN0IHJ1bGVzZXRzID0gcmVzcG9uc2UuZGF0YTtcbiAgaWYgKCFBcnJheS5pc0FycmF5KHJ1bGVzZXRzKSkgcmV0dXJuO1xuICByZXR1cm4gcnVsZXNldHMuZmluZCgocnVsZXNldCkgPT4gcnVsZXNldC5uYW1lID09PSBydWxlc2V0TmFtZSAmJiBydWxlc2V0LnNvdXJjZV90eXBlID09PSAnUmVwb3NpdG9yeScpO1xufVxuIiwiaW1wb3J0IHsgd2l0aFJldHJ5IH0gZnJvbSAnQHdpbGxib29zdGVyL3NoYXJlZC1saWIvc3JjJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZ2V0T2N0b2tpdCwgaGFzR2l0SHViVG9rZW4sIGlzR2l0SHViUGVybWlzc2lvbk9yVmlzaWJpbGl0eUVycm9yIH0gZnJvbSAnLi4vdXRpbHMvZ2l0aHViVXRpbC5qcyc7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBzZXR1cEdpdEh1YlNldHRpbmdzKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ3NldHVwR2l0SHViU2V0dGluZ3MnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgeyByZXBvQXV0aG9yOiBvd25lciwgcmVwb05hbWU6IHJlcG8gfSA9IGNvbmZpZztcbiAgICBpZiAoIW93bmVyIHx8ICFyZXBvKSByZXR1cm47XG4gICAgaWYgKG93bmVyICE9PSAnV2lsbEJvb3N0ZXInICYmIG93bmVyICE9PSAnV2lsbEJvb3N0ZXJMYWInKSByZXR1cm47XG4gICAgaWYgKCFoYXNHaXRIdWJUb2tlbihvd25lcikpIHJldHVybjtcblxuICAgIGNvbnN0IG9jdG9raXQgPSBnZXRPY3Rva2l0KG93bmVyKTtcblxuICAgIHRyeSB7XG4gICAgICAvLyBSZXBvc2l0b3J5IHNldHRpbmdzIG5lZWQgYWRtaW5pc3RyYXRpb24gcGVybWlzc2lvbiwgdW5saWtlIGZpbGUgZ2VuZXJhdGlvbi5cbiAgICAgIGF3YWl0IHdpdGhSZXRyeShcbiAgICAgICAgKCkgPT5cbiAgICAgICAgICBvY3Rva2l0LnJlcXVlc3QoJ1BBVENIIC9yZXBvcy97b3duZXJ9L3tyZXBvfScsIHtcbiAgICAgICAgICAgIG93bmVyLFxuICAgICAgICAgICAgcmVwbyxcbiAgICAgICAgICAgIGFsbG93X2F1dG9fbWVyZ2U6IHRydWUsXG4gICAgICAgICAgICBhbGxvd19tZXJnZV9jb21taXQ6IGZhbHNlLFxuICAgICAgICAgICAgYWxsb3dfc3F1YXNoX21lcmdlOiB0cnVlLFxuICAgICAgICAgICAgYWxsb3dfcmViYXNlX21lcmdlOiBmYWxzZSxcbiAgICAgICAgICAgIGFsbG93X3VwZGF0ZV9icmFuY2g6IHRydWUsXG4gICAgICAgICAgICBkZWxldGVfYnJhbmNoX29uX21lcmdlOiB0cnVlLFxuICAgICAgICAgICAgaGFzX3dpa2k6IGZhbHNlLFxuICAgICAgICAgICAgaGFzX3Byb2plY3RzOiBmYWxzZSxcbiAgICAgICAgICAgIHNxdWFzaF9tZXJnZV9jb21taXRfdGl0bGU6ICdQUl9USVRMRScsXG4gICAgICAgICAgICBzcXVhc2hfbWVyZ2VfY29tbWl0X21lc3NhZ2U6ICdCTEFOSycsXG4gICAgICAgICAgICBoZWFkZXJzOiB7XG4gICAgICAgICAgICAgICdYLUdpdEh1Yi1BcGktVmVyc2lvbic6ICcyMDIyLTExLTI4JyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAuLi4oY29uZmlnLnJlcG9zaXRvcnk/LnN0YXJ0c1dpdGgoJ2dpdGh1YjpXaWxsQm9vc3Rlci8nKSA/IHsgYWxsb3dfYXV0b19tZXJnZTogdHJ1ZSB9IDoge30pLFxuICAgICAgICAgIH0pLFxuICAgICAgICB7XG4gICAgICAgICAgc2hvdWxkUmV0cnk6IChlcnJvcikgPT4gIWlzR2l0SHViUGVybWlzc2lvbk9yVmlzaWJpbGl0eUVycm9yKGVycm9yKSxcbiAgICAgICAgfVxuICAgICAgKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgaWYgKCFpc0dpdEh1YlBlcm1pc3Npb25PclZpc2liaWxpdHlFcnJvcihlcnJvcikpIHRocm93IGVycm9yO1xuXG4gICAgICAvLyBMb2NhbCB3YmZ5IHJ1bnMgb2Z0ZW4gaGF2ZSBwdXNoIHBlcm1pc3Npb24gd2l0aG91dCBhZG1pbiBwZXJtaXNzaW9uLlxuICAgICAgY29uc29sZS53YXJuKCdTa2lwIHNldHVwR2l0SHViU2V0dGluZ3MgZHVlIHRvOicsIChlcnJvciBhcyBFcnJvciB8IHVuZGVmaW5lZCk/LnN0YWNrID8/IGVycm9yKTtcbiAgICB9XG5cbiAgICB0cnkge1xuICAgICAgYXdhaXQgd2l0aFJldHJ5KCgpID0+IGRpc2FibGVEaXNjdXNzaW9ucyhvY3Rva2l0LCBvd25lciwgcmVwbyksIHtcbiAgICAgICAgc2hvdWxkUmV0cnk6IChlcnJvcikgPT4gIWlzR2l0SHViU2V0dGluZ3NFcnJvcihlcnJvciksXG4gICAgICB9KTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgaWYgKCFpc0dpdEh1YlNldHRpbmdzRXJyb3IoZXJyb3IpKSB0aHJvdyBlcnJvcjtcbiAgICAgIGNvbnNvbGUud2FybignU2tpcCBkaXNhYmxpbmcgR2l0SHViIERpc2N1c3Npb25zIGR1ZSB0bzonLCAoZXJyb3IgYXMgRXJyb3IgfCB1bmRlZmluZWQpPy5zdGFjayA/PyBlcnJvcik7XG4gICAgfVxuICB9KTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gZGlzYWJsZURpc2N1c3Npb25zKG9jdG9raXQ6IFJldHVyblR5cGU8dHlwZW9mIGdldE9jdG9raXQ+LCBvd25lcjogc3RyaW5nLCByZXBvOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgcmVwb3NpdG9yeVJlc3BvbnNlID0gYXdhaXQgb2N0b2tpdC5ncmFwaHFsPHsgcmVwb3NpdG9yeT86IHsgaWQ/OiBzdHJpbmcgfSB9PihcbiAgICBgcXVlcnkoJG93bmVyOiBTdHJpbmchLCAkcmVwbzogU3RyaW5nISkge1xuICAgICAgcmVwb3NpdG9yeShvd25lcjogJG93bmVyLCBuYW1lOiAkcmVwbykgeyBpZCB9XG4gICAgfWAsXG4gICAgeyBvd25lciwgcmVwbyB9XG4gICk7XG4gIGNvbnN0IHJlcG9zaXRvcnlJZCA9IHJlcG9zaXRvcnlSZXNwb25zZS5yZXBvc2l0b3J5Py5pZDtcbiAgaWYgKCFyZXBvc2l0b3J5SWQpIHJldHVybjtcbiAgYXdhaXQgb2N0b2tpdC5ncmFwaHFsKFxuICAgIGBtdXRhdGlvbigkaW5wdXQ6IFVwZGF0ZVJlcG9zaXRvcnlJbnB1dCEpIHtcbiAgICAgIHVwZGF0ZVJlcG9zaXRvcnkoaW5wdXQ6ICRpbnB1dCkgeyByZXBvc2l0b3J5IHsgaWQgfSB9XG4gICAgfWAsXG4gICAgeyBpbnB1dDogeyByZXBvc2l0b3J5SWQsIGhhc0Rpc2N1c3Npb25zRW5hYmxlZDogZmFsc2UgfSB9XG4gICk7XG59XG5cbmZ1bmN0aW9uIGlzR2l0SHViU2V0dGluZ3NFcnJvcihlcnJvcjogdW5rbm93bik6IGJvb2xlYW4ge1xuICBpZiAoaXNHaXRIdWJQZXJtaXNzaW9uT3JWaXNpYmlsaXR5RXJyb3IoZXJyb3IpKSByZXR1cm4gdHJ1ZTtcbiAgaWYgKCFlcnJvciB8fCB0eXBlb2YgZXJyb3IgIT09ICdvYmplY3QnIHx8ICEoJ2Vycm9ycycgaW4gZXJyb3IpIHx8ICFBcnJheS5pc0FycmF5KGVycm9yLmVycm9ycykpIHJldHVybiBmYWxzZTtcbiAgcmV0dXJuIGVycm9yLmVycm9ycy5zb21lKFxuICAgIChncmFwaHFsRXJyb3I6IHVua25vd24pID0+XG4gICAgICAhIWdyYXBocWxFcnJvciAmJlxuICAgICAgdHlwZW9mIGdyYXBocWxFcnJvciA9PT0gJ29iamVjdCcgJiZcbiAgICAgICd0eXBlJyBpbiBncmFwaHFsRXJyb3IgJiZcbiAgICAgIFsnRk9SQklEREVOJywgJ0lOU1VGRklDSUVOVF9TQ09QRVMnLCAnTk9UX0ZPVU5EJ10uaW5jbHVkZXMoZ3JhcGhxbEVycm9yLnR5cGUgYXMgc3RyaW5nKVxuICApO1xufVxuIiwiaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuLy8gVGhlIGAvc3JjYCBlbnRyeSAoYSBkZWNsYXJlZCBleHBvcnQpIGxldHMgdGhpcyB3b3Jrc3BhY2UgY29uc3VtZXIgdXNlIHRoZSBzb3VyY2VzIHdpdGhvdXRcbi8vIGJ1aWxkaW5nIHNoYXJlZC1saWIgZmlyc3QsIGFzIGV2ZXJ5IG90aGVyIGltcG9ydCBvZiBpdCBpbiB0aGlzIHBhY2thZ2UgZG9lcy5cbmltcG9ydCB7XG4gIEJVR19JU1NVRV9TRUNUSU9OUyxcbiAgQ0hBTkdFX0lTU1VFX1NFQ1RJT05TLFxuICBQVUxMX1JFUVVFU1RfU0VDVElPTlMsXG4gIHJlbmRlclNlY3Rpb25UZW1wbGF0ZSxcbn0gZnJvbSAnQHdpbGxib29zdGVyL3NoYXJlZC1saWIvc3JjJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZnNVdGlsIH0gZnJvbSAnLi4vdXRpbHMvZnNVdGlsLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuXG5jb25zdCB0ZW1wbGF0ZXMgPSB7XG4gICdwdWxsX3JlcXVlc3RfdGVtcGxhdGUubWQnOiBgXG5DbG9zZSAjPElzc3VlTnVtYmVyPlxuXG48IS0tIFdyaXRlIGZvciBhIHJldmlld2VyIHdobyBoYXMgbm90IGZvbGxvd2VkIHRoZSB3b3JrLiBTY2FsZSBlYWNoIHNlY3Rpb24gdG8gdGhlIGNoYW5nZTogYSBzZW50ZW5jZSBmb3IgYSBzbWFsbCBjaGFuZ2UsIG51bWJlcmVkIHN1YnNlY3Rpb25zIGZvciBhIGxhcmdlIG9uZS4gRGVsZXRlIHRoaXMgY29tbWVudCBhbmQgdGhlIHBsYWNlaG9sZGVyIGNvbW1lbnRzIGJlbG93LiAtLT5cblxuJHtyZW5kZXJTZWN0aW9uVGVtcGxhdGUoUFVMTF9SRVFVRVNUX1NFQ1RJT05TKX1cbmAudHJpbSgpLFxuICAnSVNTVUVfVEVNUExBVEUvYnVnLm1kJzogYFxuLS0tXG5uYW1lOiBCdWcgLyBQcm9ibGVtXG5hYm91dDogU29tZXRoaW5nIGJlaGF2ZXMgd3JvbmdseVxudGl0bGU6ICdmaXg6ICdcbmxhYmVsczogJ3Q6IGZpeCA6YnVnOidcbi0tLVxuXG48IS0tIEtlZXAgUHJvYmxlbSBhbmQgUHJvcG9zYWw7IGRlbGV0ZSBFdmlkZW5jZSBvciBJbXBhY3Qgd2hlbiB0aGV5IGFkZCBub3RoaW5nLiBEZWxldGUgdGhlc2UgY29tbWVudHMuIC0tPlxuXG4ke3JlbmRlclNlY3Rpb25UZW1wbGF0ZShCVUdfSVNTVUVfU0VDVElPTlMpfVxuYC50cmltKCksXG4gICdJU1NVRV9URU1QTEFURS9jaGFuZ2UubWQnOiBgXG4tLS1cbm5hbWU6IENoYW5nZSAvIEZlYXR1cmVcbmFib3V0OiBQcm9wb3NlIGEgY2hhbmdlIHRoYXQgYSB0aGlyZCBwYXJ0eSBjb3VsZCBpbXBsZW1lbnQgd2l0aG91dCBhc2tpbmcgYSBxdWVzdGlvblxudGl0bGU6ICdmZWF0OiAnXG5sYWJlbHM6ICd0OiBmZWF0IDpzcGFya2xlczonXG4tLS1cblxuPCEtLSBLZWVwIHRoZSBmaXJzdCB0aHJlZSBzZWN0aW9ucyBmb3IgYW55IGNoYW5nZSBhbmQgYWRkIHRoZSBvdGhlcnMgYXMgdGhlIGNoYW5nZSBncm93czsgYSBsYXJnZSBjaGFuZ2UgZmlsbHMgYWxsIG9mIHRoZW0gKHNwZWMtYm9vc3RlciByZXZpZXdzIGFnYWluc3QgdGhpcyBsaXN0KS4gRGVsZXRlIHRoZXNlIGNvbW1lbnRzLiAtLT5cblxuJHtyZW5kZXJTZWN0aW9uVGVtcGxhdGUoQ0hBTkdFX0lTU1VFX1NFQ1RJT05TKX1cbmAudHJpbSgpLFxuICAnSVNTVUVfVEVNUExBVEUvY29uZmlnLnltbCc6ICdibGFua19pc3N1ZXNfZW5hYmxlZDogdHJ1ZScsXG59O1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVHaXRIdWJUZW1wbGF0ZXMoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZ2VuZXJhdGVHaXRIdWJUZW1wbGF0ZXMnLCBhc3luYyAoKSA9PiB7XG4gICAgLy8gVGVtcGxhdGVzIGFyZSByZXBvc2l0b3J5LWxldmVsIGZpbGVzLCBzbyBhIGRpcmVjdCB3b3Jrc3BhY2UtY2hpbGQgaW52b2NhdGlvbiBtdXN0IG5vdCBjcmVhdGUgdGhlbS5cbiAgICBpZiAoIWNvbmZpZy5pc1dpbGxCb29zdGVyUmVwbyB8fCAhY29uZmlnLmlzUm9vdCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGZvciAoY29uc3QgW2ZpbGVOYW1lLCBjb250ZW50XSBvZiBPYmplY3QuZW50cmllcyh0ZW1wbGF0ZXMpKSB7XG4gICAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJy5naXRodWInLCBmaWxlTmFtZSk7XG4gICAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnNVdGlsLmdlbmVyYXRlRmlsZShmaWxlUGF0aCwgY29udGVudCkpO1xuICAgIH1cbiAgfSk7XG59XG4iLCJpbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcblxuY29uc3QgZGVwZW5kZW5jeVNlY3Rpb25LZXlzID0gWydkZXBlbmRlbmNpZXMnLCAnZGV2RGVwZW5kZW5jaWVzJywgJ29wdGlvbmFsRGVwZW5kZW5jaWVzJywgJ3BlZXJEZXBlbmRlbmNpZXMnXSBhcyBjb25zdDtcbmNvbnN0IGFsbG93ZWRHaXRIdWJPcmdhbml6YXRpb25QYXR0ZXJuID0gU3RyaW5nLnJhd2AoPzpXaWxsQm9vc3RlcnxXaWxsQm9vc3RlckxhYilgO1xuY29uc3QgYWxsb3dlZEdpdERlcGVuZGVuY3lQYXR0ZXJucyA9IFtcbiAgbmV3IFJlZ0V4cChgXiR7YWxsb3dlZEdpdEh1Yk9yZ2FuaXphdGlvblBhdHRlcm59L1teI1xcXFxzXSsoPzojXFxcXFMrKT8kYCwgJ3UnKSxcbiAgbmV3IFJlZ0V4cChgXmdpdGh1Yjoke2FsbG93ZWRHaXRIdWJPcmdhbml6YXRpb25QYXR0ZXJufS9bXiNcXFxcc10rKD86I1xcXFxTKyk/JGAsICd1JyksXG4gIG5ldyBSZWdFeHAoXG4gICAgYF4oPzpnaXRcXFxcKyk/aHR0cHM6Ly9naXRodWJcXFxcLmNvbS8ke2FsbG93ZWRHaXRIdWJPcmdhbml6YXRpb25QYXR0ZXJufS9bXiNcXFxcc10rKD86XFxcXC5naXQpPyg/OiNcXFxcUyspPyRgLFxuICAgICd1J1xuICApLFxuICBuZXcgUmVnRXhwKFxuICAgIGBeKD86Z2l0XFxcXCspP3NzaDovL2dpdEBnaXRodWJcXFxcLmNvbVs6L10ke2FsbG93ZWRHaXRIdWJPcmdhbml6YXRpb25QYXR0ZXJufS9bXiNcXFxcc10rKD86XFxcXC5naXQpPyg/OiNcXFxcUyspPyRgLFxuICAgICd1J1xuICApLFxuICBuZXcgUmVnRXhwKGBeKD86Z2l0XFxcXCspP2dpdEBnaXRodWJcXFxcLmNvbToke2FsbG93ZWRHaXRIdWJPcmdhbml6YXRpb25QYXR0ZXJufS9bXiNcXFxcc10rKD86XFxcXC5naXQpPyg/OiNcXFxcUyspPyRgLCAndScpLFxuXTtcblxuaW50ZXJmYWNlIERpc2FsbG93ZWREZXBlbmRlbmN5U291cmNlIHtcbiAgZGVwZW5kZW5jeU5hbWU6IHN0cmluZztcbiAgZGlyUGF0aDogc3RyaW5nO1xuICBzZWN0aW9uTmFtZTogKHR5cGVvZiBkZXBlbmRlbmN5U2VjdGlvbktleXMpW251bWJlcl07XG4gIHNwZWNpZmllcjogc3RyaW5nO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gYXNzZXJ0U2FmZURlcGVuZGVuY3lTb3VyY2VzKGNvbmZpZ3M6IFBhY2thZ2VDb25maWdbXSk6IHZvaWQge1xuICBjb25zdCBkaXNhbGxvd2VkU291cmNlcyA9IGNvbmZpZ3MuZmxhdE1hcChnZXREaXNhbGxvd2VkRGVwZW5kZW5jeVNvdXJjZXMpO1xuICBpZiAoZGlzYWxsb3dlZFNvdXJjZXMubGVuZ3RoID09PSAwKSByZXR1cm47XG5cbiAgY29uc3QgZGV0YWlscyA9IGRpc2FsbG93ZWRTb3VyY2VzXG4gICAgLm1hcChcbiAgICAgICh7IGRlcGVuZGVuY3lOYW1lLCBkaXJQYXRoLCBzZWN0aW9uTmFtZSwgc3BlY2lmaWVyIH0pID0+XG4gICAgICAgIGAtICR7cGF0aC5qb2luKGRpclBhdGgsICdwYWNrYWdlLmpzb24nKX06ICR7c2VjdGlvbk5hbWV9LiR7ZGVwZW5kZW5jeU5hbWV9IHVzZXMgJHtzcGVjaWZpZXJ9YFxuICAgIClcbiAgICAuam9pbignXFxuJyk7XG5cbiAgdGhyb3cgbmV3IEVycm9yKFxuICAgIGBEaXNhbGxvd2VkIEdpdCBkZXBlbmRlbmN5IHNvdXJjZXMgZm91bmQuXFxuT25seSBXaWxsQm9vc3RlciBhbmQgV2lsbEJvb3N0ZXJMYWIgR2l0SHViIGRlcGVuZGVuY2llcyBhcmUgYWxsb3dlZC5cXG4ke2RldGFpbHN9YFxuICApO1xufVxuXG5mdW5jdGlvbiBnZXREaXNhbGxvd2VkRGVwZW5kZW5jeVNvdXJjZXMoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogRGlzYWxsb3dlZERlcGVuZGVuY3lTb3VyY2VbXSB7XG4gIGNvbnN0IHBhY2thZ2VKc29uID0gY29uZmlnLnBhY2thZ2VKc29uO1xuICBpZiAoIXBhY2thZ2VKc29uKSByZXR1cm4gW107XG5cbiAgY29uc3QgZGlzYWxsb3dlZFNvdXJjZXM6IERpc2FsbG93ZWREZXBlbmRlbmN5U291cmNlW10gPSBbXTtcbiAgZm9yIChjb25zdCBzZWN0aW9uTmFtZSBvZiBkZXBlbmRlbmN5U2VjdGlvbktleXMpIHtcbiAgICBjb25zdCBzZWN0aW9uID0gcGFja2FnZUpzb25bc2VjdGlvbk5hbWVdO1xuICAgIGlmICghc2VjdGlvbikgY29udGludWU7XG5cbiAgICBmb3IgKGNvbnN0IFtkZXBlbmRlbmN5TmFtZSwgc3BlY2lmaWVyXSBvZiBPYmplY3QuZW50cmllcyhzZWN0aW9uKSkge1xuICAgICAgaWYgKCFzcGVjaWZpZXIpIGNvbnRpbnVlO1xuICAgICAgaWYgKCFpc0dpdERlcGVuZGVuY3lTcGVjaWZpZXIoc3BlY2lmaWVyKSkgY29udGludWU7XG4gICAgICBpZiAoaXNBbGxvd2VkR2l0RGVwZW5kZW5jeVNwZWNpZmllcihzcGVjaWZpZXIpKSBjb250aW51ZTtcblxuICAgICAgZGlzYWxsb3dlZFNvdXJjZXMucHVzaCh7XG4gICAgICAgIGRlcGVuZGVuY3lOYW1lLFxuICAgICAgICBkaXJQYXRoOiBjb25maWcuZGlyUGF0aCxcbiAgICAgICAgc2VjdGlvbk5hbWUsXG4gICAgICAgIHNwZWNpZmllcixcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuICByZXR1cm4gZGlzYWxsb3dlZFNvdXJjZXM7XG59XG5cbmZ1bmN0aW9uIGlzR2l0RGVwZW5kZW5jeVNwZWNpZmllcihzcGVjaWZpZXI6IHN0cmluZyk6IGJvb2xlYW4ge1xuICByZXR1cm4gKFxuICAgIGlzR2l0SHViU2hvcnRoYW5kU3BlY2lmaWVyKHNwZWNpZmllcikgfHxcbiAgICAvXig/OmJpdGJ1Y2tldHxnaXN0fGdpdGh1YnxnaXRsYWIpOi91LnRlc3Qoc3BlY2lmaWVyKSB8fFxuICAgIC9eaHR0cHM/OlxcL1xcLyg/OmJpdGJ1Y2tldFxcLm9yZ3xnaXRodWJcXC5jb218Z2l0bGFiXFwuY29tKVxcLy91LnRlc3Qoc3BlY2lmaWVyKSB8fFxuICAgIC9eKD86aHR0cHM/fHNzaCk6XFwvXFwvXFxTK1xcLmdpdCg/OiNcXFMrKT8kL3UudGVzdChzcGVjaWZpZXIpIHx8XG4gICAgL15bXkBcXHNdK0BbXjpcXHNdKzpcXFMrKD86I1xcUyspPyQvdS50ZXN0KHNwZWNpZmllcikgfHxcbiAgICBzcGVjaWZpZXIuc3RhcnRzV2l0aCgnZ2l0OicpIHx8XG4gICAgc3BlY2lmaWVyLnN0YXJ0c1dpdGgoJ2dpdCsnKSB8fFxuICAgIHNwZWNpZmllci5zdGFydHNXaXRoKCdzc2g6Ly9naXRAJylcbiAgKTtcbn1cblxuZnVuY3Rpb24gaXNHaXRIdWJTaG9ydGhhbmRTcGVjaWZpZXIoc3BlY2lmaWVyOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgcmV0dXJuIC9eW2EtekEtWjAtOV1bXFx3Li1dKlxcL1tcXHcuLV0rKD86I1xcUyspPyQvdS50ZXN0KHNwZWNpZmllcik7XG59XG5cbmZ1bmN0aW9uIGlzQWxsb3dlZEdpdERlcGVuZGVuY3lTcGVjaWZpZXIoc3BlY2lmaWVyOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgcmV0dXJuIGFsbG93ZWRHaXREZXBlbmRlbmN5UGF0dGVybnMuc29tZSgocGF0dGVybikgPT4gcGF0dGVybi50ZXN0KHNwZWNpZmllcikpO1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHsgaWdub3JlRXJyb3IsIGlnbm9yZUVycm9yQXN5bmMgfSBmcm9tICdAd2lsbGJvb3N0ZXIvc2hhcmVkLWxpYi9zcmMnO1xuaW1wb3J0IHsgbm9ybWFsaXplQnVuTG9ja2ZpbGUgfSBmcm9tICdAd2lsbGJvb3N0ZXIvc2hhcmVkLWxpYi1ub2RlL3NyYyc7XG5pbXBvcnQgeWFyZ3MgZnJvbSAneWFyZ3MnO1xuXG5pbXBvcnQgeyBmaXhOZXh0Q29uZmlnSnNvbiB9IGZyb20gJy4vZml4ZXJzL25leHRDb25maWcuanMnO1xuaW1wb3J0IHsgZml4Q2hha3JhVG9hc3RlciB9IGZyb20gJy4vZml4ZXJzL2NoYWtyYVRvYXN0ZXIuanMnO1xuaW1wb3J0IHsgZml4UGxheXdyaWdodENvbmZpZyB9IGZyb20gJy4vZml4ZXJzL3BsYXl3cmlnaHRDb25maWcuanMnO1xuaW1wb3J0IHsgZml4VHlwb3MgfSBmcm9tICcuL2ZpeGVycy90eXBvcy5qcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZUFnZW50SW5zdHJ1Y3Rpb25zIH0gZnJvbSAnLi9nZW5lcmF0b3JzL2FnZW50cy5qcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZUJ1bmZpZ1RvbWwsIHJlYWRCdW5HbG9iYWxTdG9yZSwgcmVzb2x2ZUJ1bkdsb2JhbFN0b3JlIH0gZnJvbSAnLi9nZW5lcmF0b3JzL2J1bmZpZy5qcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZURvY2tlcmlnbm9yZSB9IGZyb20gJy4vZ2VuZXJhdG9ycy9kb2NrZXJpZ25vcmUuanMnO1xuaW1wb3J0IHsgZ2VuZXJhdGVFZGl0b3Jjb25maWcgfSBmcm9tICcuL2dlbmVyYXRvcnMvZWRpdG9yY29uZmlnLmpzJztcbmltcG9ydCB7IGdlbmVyYXRlRm5veFRvbWwgfSBmcm9tICcuL2dlbmVyYXRvcnMvZm5veFRvbWwuanMnO1xuaW1wb3J0IHsgZ2VuZXJhdGVHZW1pbmlDb25maWcgfSBmcm9tICcuL2dlbmVyYXRvcnMvZ2VtaW5pQ29uZmlnLmpzJztcbmltcG9ydCB7IGdlbmVyYXRlR2l0YXR0cmlidXRlcywgcmVub3JtYWxpemVUcmFja2VkVGV4dEZpbGVzIH0gZnJvbSAnLi9nZW5lcmF0b3JzL2dpdGF0dHJpYnV0ZXMuanMnO1xuaW1wb3J0IHsgZ2VuZXJhdGVHaXRpZ25vcmUgfSBmcm9tICcuL2dlbmVyYXRvcnMvZ2l0aWdub3JlLmpzJztcbmltcG9ydCB7IGVuc3VyZUdsb2JhbFJlbGVhc2VBZ2VHYXRlcyB9IGZyb20gJy4vZ2VuZXJhdG9ycy9nbG9iYWxSZWxlYXNlQWdlR2F0ZS5qcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZUlkZWFTZXR0aW5ncyB9IGZyb20gJy4vZ2VuZXJhdG9ycy9pZGVhLmpzJztcbmltcG9ydCB7IGdlbmVyYXRlTGVmdGhvb2sgfSBmcm9tICcuL2dlbmVyYXRvcnMvbGVmdGhvb2suanMnO1xuaW1wb3J0IHsgZ2VuZXJhdGVQYWNrYWdlSnNvbiwgZ2V0V29ya3NwYWNlUGFja2FnZURpcnMgfSBmcm9tICcuL2dlbmVyYXRvcnMvcGFja2FnZUpzb24uanMnO1xuaW1wb3J0IHsgZ2VuZXJhdGVPeGZtdENvbmZpZyB9IGZyb20gJy4vZ2VuZXJhdG9ycy9veGZtdENvbmZpZy5qcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZU94bGludENvbmZpZyB9IGZyb20gJy4vZ2VuZXJhdG9ycy9veGxpbnRDb25maWcuanMnO1xuaW1wb3J0IHsgZ2VuZXJhdGVQcmV0dGllcmlnbm9yZSB9IGZyb20gJy4vZ2VuZXJhdG9ycy9wcmV0dGllcmlnbm9yZS5qcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZVB5cmlnaHRDb25maWdKc29uIH0gZnJvbSAnLi9nZW5lcmF0b3JzL3B5cmlnaHRDb25maWcuanMnO1xuaW1wb3J0IHsgZml4UmFpbHdheWlnbm9yZSB9IGZyb20gJy4vZ2VuZXJhdG9ycy9yYWlsd2F5aWdub3JlLmpzJztcbmltcG9ydCB7IGdlbmVyYXRlUmVhZG1lLCByZWFkQXBwbGllZFdiZnlWZXJzaW9uTGFiZWwgfSBmcm9tICcuL2dlbmVyYXRvcnMvcmVhZG1lLmpzJztcbmltcG9ydCB7IGdlbmVyYXRlUmVsZWFzZXJjIH0gZnJvbSAnLi9nZW5lcmF0b3JzL3JlbGVhc2VyYy5qcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZVJlbm92YXRlSnNvbmMgfSBmcm9tICcuL2dlbmVyYXRvcnMvcmVub3ZhdGVKc29uYy5qcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZVRzY29uZmlnIH0gZnJvbSAnLi9nZW5lcmF0b3JzL3RzY29uZmlnLmpzJztcbmltcG9ydCB7IGdlbmVyYXRlVXNlckFnZW50Q29uZmlncyB9IGZyb20gJy4vZ2VuZXJhdG9ycy91c2VyQWdlbnRDb25maWdzLmpzJztcbmltcG9ydCB7IGdlbmVyYXRlVnNjb2RlU2V0dGluZ3MgfSBmcm9tICcuL2dlbmVyYXRvcnMvdnNjb2RlU2V0dGluZ3MuanMnO1xuaW1wb3J0IHsgZW5zdXJlV2JFbnZEZWZpbml0aW9ucyB9IGZyb20gJy4vZ2VuZXJhdG9ycy93YkVudi5qcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZVNlbGZDb250YWluZWRXb3JrZmxvd3MgfSBmcm9tICcuL2dlbmVyYXRvcnMvc2VsZkNvbnRhaW5lZFdvcmtmbG93LmpzJztcbmltcG9ydCB7IGdlbmVyYXRlV29ya2Zsb3dzLCBpc1JldXNhYmxlV29ya2Zsb3dzUmVwbyB9IGZyb20gJy4vZ2VuZXJhdG9ycy93b3JrZmxvdy5qcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZU1pc2VUb21sLCBtaW5pbXVtQnVuVmVyc2lvbiB9IGZyb20gJy4vZ2VuZXJhdG9ycy9taXNlVG9tbC5qcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZVJlcG9zaXRvcnlOcG1yYyB9IGZyb20gJy4vZ2VuZXJhdG9ycy9ucG1yYy5qcyc7XG5pbXBvcnQgeyBzZXR1cExhYmVscyB9IGZyb20gJy4vZ2l0aHViL2xhYmVsLmpzJztcbmltcG9ydCB7IHNldHVwUmVwb3NpdG9yeVJ1bGVzZXRzIH0gZnJvbSAnLi9naXRodWIvcnVsZXNldC5qcyc7XG5pbXBvcnQgeyBzZXR1cEdpdEh1YlNldHRpbmdzIH0gZnJvbSAnLi9naXRodWIvc2V0dGluZ3MuanMnO1xuaW1wb3J0IHsgZ2VuZXJhdGVHaXRIdWJUZW1wbGF0ZXMgfSBmcm9tICcuL2dpdGh1Yi90ZW1wbGF0ZS5qcyc7XG5pbXBvcnQgeyBvcHRpb25zIH0gZnJvbSAnLi9vcHRpb25zLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBnZXRQYWNrYWdlQ29uZmlnLCBnZXRXb3JrZXJUeXBlc1NjcmlwdEVycm9yIH0gZnJvbSAnLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGFzc2VydFNhZmVEZXBlbmRlbmN5U291cmNlcyB9IGZyb20gJy4vdXRpbHMvZGVwZW5kZW5jeVNvdXJjZVBvbGljeS5qcyc7XG5pbXBvcnQgeyBmc1V0aWwgfSBmcm9tICcuL3V0aWxzL2ZzVXRpbC5qcyc7XG5pbXBvcnQgeyBkb2VzQ29udGFpbkphdmEsIGRvZXNDb250YWluSnNPclRzIH0gZnJvbSAnLi91dGlscy9wYWNrYWdlQ2FwYWJpbGl0aWVzLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5pbXBvcnQgeyBzcGF3blN5bmMsIHNwYXduU3luY0FuZFJldHVyblN0YXR1cywgc3Bhd25TeW5jQW5kUmV0dXJuU3Rkb3V0IH0gZnJvbSAnLi91dGlscy9zcGF3blV0aWwuanMnO1xuaW1wb3J0IHsgZGlzcG9zZVR5cGVTY3JpcHRBcGkgfSBmcm9tICcuL3V0aWxzL3R5cGVzY3JpcHRBcGkuanMnO1xuaW1wb3J0IHsgZ2V0V2JmeVZlcnNpb24sIGdldFdiZnlWZXJzaW9uTGFiZWwgfSBmcm9tICcuL3V0aWxzL3ZlcnNpb24uanMnO1xuaW1wb3J0IHsgZ2V0V29ya3NwYWNlU3ViRGlyUGF0aHMgfSBmcm9tICcuL3V0aWxzL3dvcmtzcGFjZVV0aWwuanMnO1xuXG4vKipcbiAqIEFwcGxpZXMgb25seSB0aGUgZ2xvYmFsIHJlbGVhc2UtYWdlIGdhdGUsIHdpdGhvdXQgdG91Y2hpbmcgYW55IHJlcG9zaXRvcnkuIFNwZWxsZWQgb3V0IGluIGZ1bGxcbiAqIHJhdGhlciB0aGFuIHNob3J0ZW5lZCAoZS5nLiBgZ2F0ZWApIGJlY2F1c2UgdGhlIGRlZmF1bHQgY29tbWFuZCB0YWtlcyBwb3NpdGlvbmFsIHBhdGhzOiBhIHNob3J0XG4gKiBuYW1lIHdvdWxkIHN3YWxsb3cgYSBkaXJlY3RvcnkgdGhhdCBoYXBwZW5zIHRvIHNoYXJlIGl0LlxuICovXG5jb25zdCBhcHBseVJlbGVhc2VBZ2VHYXRlQ29tbWFuZCA9ICdhcHBseS1yZWxlYXNlLWFnZS1nYXRlJztcbi8qKiBTYW1lIG5hbWluZyByYXRpb25hbGUgYXMgYXBwbHlSZWxlYXNlQWdlR2F0ZUNvbW1hbmQuICovXG5jb25zdCBnZW5lcmF0ZVVzZXJBZ2VudENvbmZpZ3NDb21tYW5kID0gJ2dlbmVyYXRlLXVzZXItYWdlbnQtY29uZmlncyc7XG5cbmFzeW5jIGZ1bmN0aW9uIG1haW4oKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IGFyZ3YgPSBhd2FpdCB5YXJncyhwcm9jZXNzLmFyZ3Yuc2xpY2UoMikpXG4gICAgLmNvbW1hbmQoXG4gICAgICBhcHBseVJlbGVhc2VBZ2VHYXRlQ29tbWFuZCxcbiAgICAgIFwiQXBwbHkgb25seSB0aGUgb3JnYW5pemF0aW9uJ3MgbWluaW11bS1yZWxlYXNlLWFnZSBwb2xpY3kgdG8gdGhpcyBtYWNoaW5lJ3MgZ2xvYmFsIHBhY2thZ2UtbWFuYWdlciBjb25maWdzXCJcbiAgICApXG4gICAgLmNvbW1hbmQoXG4gICAgICBnZW5lcmF0ZVVzZXJBZ2VudENvbmZpZ3NDb21tYW5kLFxuICAgICAgXCJPdmVyd3JpdGUgdGhpcyB1c2VyJ3MgYWdlbnQgaW5zdHJ1Y3Rpb24gZmlsZXMgKH4vLmNvZGV4L0FHRU5UUy5tZCwgfi8uY2xhdWRlL0NMQVVERS5tZCwgfi8uZ2VtaW5pL0dFTUlOSS5tZCkgd2l0aCB0aGUgb3JnYW5pemF0aW9uJ3MgZml4ZWQgY29udGVudCBhbmQgbWVyZ2UgdGhlIG9yZ2FuaXphdGlvbidzIHNldHRpbmdzIGludG8gfi8uY2xhdWRlL3NldHRpbmdzLmpzb24gYW5kIH4vLmdlbWluaS9zZXR0aW5ncy5qc29uXCJcbiAgICApXG4gICAgLmNvbW1hbmQoJyQwIFtwYXRocy4uXScsICdNYWtlIGEgZ2l2ZW4gcHJvamVjdCBmb2xsb3cgdGhlIFdpbGxCb29zdGVyIHN0YW5kYXJkJywgKHlhcmdzKSA9PiB7XG4gICAgICB5YXJncy5wb3NpdGlvbmFsKCdwYXRocycsIHtcbiAgICAgICAgZGVzY3JpYmU6ICdwcm9qZWN0IHBhdGhzIHRvIGJlIHdiZmllZCcsXG4gICAgICAgIGFycmF5OiB0cnVlLFxuICAgICAgICB0eXBlOiAnc3RyaW5nJyxcbiAgICAgICAgZGVmYXVsdDogWycuJ10sXG4gICAgICB9KTtcbiAgICB9KVxuICAgIC5vcHRpb25zKHtcbiAgICAgIGZvcmNlOiB7XG4gICAgICAgIGRlc2NyaXB0aW9uOiAnQXBwbHkgd2JmeSBldmVuIHdoZW4gdGhlIHJlcG9zaXRvcnkgYWxyZWFkeSByZWNvcmRzIHRoaXMgd2JmeSB2ZXJzaW9uJyxcbiAgICAgICAgdHlwZTogJ2Jvb2xlYW4nLFxuICAgICAgICBkZWZhdWx0OiBmYWxzZSxcbiAgICAgICAgYWxpYXM6ICdmJyxcbiAgICAgIH0sXG4gICAgICBza2lwRGVwczoge1xuICAgICAgICBkZXNjcmlwdGlvbjpcbiAgICAgICAgICAnU2tpcCBhZGRpbmcgbWFuYWdlZCBkZXBlbmRlbmNpZXMgYW5kIHRoZSBsaW5rZXIgcHJvYmUgKHRoZSBmaW5hbCBgYnVuIGluc3RhbGxgIHJlZnJlc2hpbmcgdGhlIGxvY2tmaWxlIHN0aWxsIHJ1bnMpJyxcbiAgICAgICAgdHlwZTogJ2Jvb2xlYW4nLFxuICAgICAgICBkZWZhdWx0OiBmYWxzZSxcbiAgICAgICAgYWxpYXM6ICdkJyxcbiAgICAgIH0sXG4gICAgICB2ZXJib3NlOiB7XG4gICAgICAgIGRlc2NyaXB0aW9uOiAnV2hldGhlciBvciBub3QgdG8gZW5hYmxlIHZlcmJvc2UgbW9kZScsXG4gICAgICAgIHR5cGU6ICdib29sZWFuJyxcbiAgICAgICAgZGVmYXVsdDogZmFsc2UsXG4gICAgICAgIGFsaWFzOiAndicsXG4gICAgICB9LFxuICAgIH0pXG4gICAgLnZlcnNpb24oZ2V0V2JmeVZlcnNpb24oKSlcbiAgICAuc3RyaWN0KCkuYXJndjtcbiAgb3B0aW9ucy5pc1ZlcmJvc2UgPSBhcmd2LnZlcmJvc2U7XG5cbiAgLy8gRGVsaWJlcmF0ZWx5IGJlZm9yZSB0aGUgQnVuIGNoZWNrIGluIHdpbGxib29zdGVyaWZ5UGF0aHMoKTogdGhlIGdhdGUgbXVzdCBiZSBhcHBsaWFibGUgb24gYVxuICAvLyBtYWNoaW5lIHdob3NlIEJ1biBpcyBvdXRkYXRlZCwgd2hpY2ggaXMgZXhhY3RseSBhIG1hY2hpbmUgdGhhdCBzdGlsbCBuZWVkcyBnYXRpbmcuXG4gIGlmIChhcmd2Ll9bMF0gPT09IGFwcGx5UmVsZWFzZUFnZUdhdGVDb21tYW5kKSB7XG4gICAgaWYgKCFlbnN1cmVHbG9iYWxSZWxlYXNlQWdlR2F0ZXMoKSkgcHJvY2Vzcy5leGl0Q29kZSA9IDE7XG4gICAgcmV0dXJuO1xuICB9XG4gIGlmIChhcmd2Ll9bMF0gPT09IGdlbmVyYXRlVXNlckFnZW50Q29uZmlnc0NvbW1hbmQpIHtcbiAgICBpZiAoIShhd2FpdCBnZW5lcmF0ZVVzZXJBZ2VudENvbmZpZ3MoKSkpIHByb2Nlc3MuZXhpdENvZGUgPSAxO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGxldCBoYXNJbnZhbGlkUGFja2FnZUNvbmZpZyA9IGZhbHNlO1xuICB0cnkge1xuICAgIGhhc0ludmFsaWRQYWNrYWdlQ29uZmlnID0gYXdhaXQgd2lsbGJvb3N0ZXJpZnlQYXRocyhhcmd2LnBhdGhzIGFzIHN0cmluZ1tdLCBhcmd2LnNraXBEZXBzLCBhcmd2LmZvcmNlKTtcbiAgfSBmaW5hbGx5IHtcbiAgICAvLyBUaGUgVHlwZVNjcmlwdCBjb21waWxlciBzZXJ2ZXIgc3Bhd25lZCBmb3IgQVNUIHBhcnNpbmcga2VlcHMgYW4gb3BlbiBJUENcbiAgICAvLyBjaGFubmVsIHRoYXQgd291bGQgb3RoZXJ3aXNlIHByZXZlbnQgdGhlIE5vZGUuanMgcHJvY2VzcyBmcm9tIGV4aXRpbmcuXG4gICAgYXdhaXQgZGlzcG9zZVR5cGVTY3JpcHRBcGkoKTtcbiAgfVxuICBpZiAoaGFzSW52YWxpZFBhY2thZ2VDb25maWcpIHtcbiAgICBwcm9jZXNzLmV4aXRDb2RlID0gMTtcbiAgfVxufVxuXG5hc3luYyBmdW5jdGlvbiB3aWxsYm9vc3RlcmlmeVBhdGhzKHBhdGhzOiBzdHJpbmdbXSwgc2tpcERlcHM6IGJvb2xlYW4sIGZvcmNlOiBib29sZWFuKTogUHJvbWlzZTxib29sZWFuPiB7XG4gIC8vIEJlZm9yZSBhbnl0aGluZyBlbHNlIOKAlCBldmVuIHRoZSBCdW4gY2hlY2sgYmVsb3c6IHRoZSBkZXZlbG9wZXIgbWFjaGluZSdzIGdsb2JhbFxuICAvLyBwYWNrYWdlLW1hbmFnZXIgY29uZmlncyBtdXN0IHJlY2VpdmUgdGhlIG9yZydzIG1pbmltdW0tcmVsZWFzZS1hZ2UgcG9saWN5IG9uIEVWRVJZIHJ1bixcbiAgLy8gYmVjYXVzZSB0aGV5IGFyZSB3aGF0IGd1YXJkcyBicmFuZC1uZXcgbG9jYWwgcHJvamVjdHMgdGhhdCBoYXZlIG5vIHdiZnktZ2VuZXJhdGVkIHJlcG9zaXRvcnlcbiAgLy8gY29uZmlnIHlldCwgYW5kIHRoYXQgcHJvdGVjdGlvbiBtdXN0IHdvcmsgYmVmb3JlIHRoZSBzdXBwb3J0ZWQtdmVyc2lvbiBjaGVjay5cbiAgZW5zdXJlR2xvYmFsUmVsZWFzZUFnZUdhdGVzKCk7XG5cbiAgLy8gd2JmeSBtYW5hZ2VzIHJlcG9zaXRvcmllcyB0aHJvdWdoIEJ1biArIG1pc2UgYW5kIHVzZXMgQnVuIDEuNCBydW50aW1lIEFQSXMuIFRoZSB2ZXJzaW9uIGZsb29yXG4gIC8vIGFsc28gZW5zdXJlcyB0aGUgZ2VuZXJhdGVkIGJ1bmZpZy50b21sIG9wdGlvbnMgcHJvZHVjZSB0aGUgaW5zdGFsbCBsYXlvdXQgd2JmeSB2YWxpZGF0ZXMuIEl0XG4gIC8vIHN0YXlzIHVuY29uZGl0aW9uYWwgZXZlbiB0aG91Z2ggdGhlIGFscmVhZHktYXBwbGllZCBjaGVjayBiZWxvdyBjYW4gbWFrZSBhIHJ1biBhIG5vLW9wOiBhblxuICAvLyBvdXRkYXRlZCBCdW4gaXMgYSBicm9rZW4gZW52aXJvbm1lbnQgd2JmeSBtdXN0IHJlcG9ydCwgYW5kIGhpZGluZyBpdCB3aGVuZXZlciBldmVyeSBwYXRoXG4gIC8vIGhhcHBlbnMgdG8gYmUgc2tpcHBlZCB3b3VsZCBzdXJmYWNlIGl0IG9ubHkgbGF0ZXIuXG4gIGNvbnN0IGJ1blZlcnNpb24gPSBCdW4udmVyc2lvbjtcbiAgaWYgKEJ1bi5zZW12ZXIub3JkZXIoYnVuVmVyc2lvbiwgbWluaW11bUJ1blZlcnNpb24pIDwgMCkge1xuICAgIGNvbnNvbGUuZXJyb3IoYHdiZnkgcmVxdWlyZXMgQnVuID49ICR7bWluaW11bUJ1blZlcnNpb259IChmb3VuZCAke2J1blZlcnNpb259KS4gVXBncmFkZSBCdW4gYW5kIHJlLXJ1bi5gKTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIC8vIEEgYC1kaXJ0eS1sb2NhbGAgbGFiZWwgaWRlbnRpZmllcyBhbiBlZGl0ZWQgY2hlY2tvdXQsIHdob3NlIG5leHQgYnVpbGQgcHJvZHVjZXMgZGlmZmVyZW50IGZpbGVzXG4gIC8vIHVuZGVyIHRoZSBzYW1lIGxhYmVsLCBzbyBzdWNoIGEgcnVuIGlzIG5ldmVyIHRyZWF0ZWQgYXMgYWxyZWFkeSBhcHBsaWVkLlxuICBjb25zdCB2ZXJzaW9uTGFiZWwgPSBnZXRXYmZ5VmVyc2lvbkxhYmVsKCk7XG4gIGNvbnN0IHNraXBwYWJsZVZlcnNpb25MYWJlbCA9XG4gICAgIWZvcmNlICYmIHZlcnNpb25MYWJlbCAmJiAhdmVyc2lvbkxhYmVsLmVuZHNXaXRoKCctZGlydHktbG9jYWwnKSA/IHZlcnNpb25MYWJlbCA6IHVuZGVmaW5lZDtcblxuICBsZXQgaGFzSW52YWxpZFBhY2thZ2VDb25maWcgPSBmYWxzZTtcbiAgZm9yIChjb25zdCBpbnB1dERpclBhdGggb2YgcGF0aHMpIHtcbiAgICAvLyBOb3JtYWxpemUgb25jZSBhdCB0aGUgQ0xJIGJvdW5kYXJ5LiBHZW5lcmF0b3JzIHVzZSBkaXJQYXRoIGZvciBjd2QgYW5kIGJhc2VuYW1lIGRlY2lzaW9ucztcbiAgICAvLyBsZWF2aW5nIHRoZSBzdXBwb3J0ZWQgZGVmYXVsdCBgLmAgdW5yZXNvbHZlZCB3b3VsZCBnZW5lcmF0ZSBhbiBpbnZhbGlkIHBhY2thZ2UgbmFtZSBvZiBgLmAuXG4gICAgY29uc3Qgcm9vdERpclBhdGggPSBwYXRoLnJlc29sdmUoaW5wdXREaXJQYXRoKTtcbiAgICAvLyBDb25maW5lIGV2ZXJ5IGdlbmVyYXRlZCBmaWxlIHRvIHRoaXMgcmVwb3NpdG9yeSAoc2VlIGZzVXRpbC5nZW5lcmF0ZUZpbGUpLiBTZXQgQkVGT1JFIGFueVxuICAgIC8vIGZpeGVyIHdyaXRlcywgYW5kIHJlc2V0IG9uIGV2ZXJ5IGl0ZXJhdGlvbiBzbyBhIG11bHRpLXBhdGggcnVuIG5ldmVyIGtlZXBzIHRoZSBwcmV2aW91cyByb290LlxuICAgIGZzVXRpbC5zZXRSb290RGlyUGF0aChmcy5leGlzdHNTeW5jKHJvb3REaXJQYXRoKSA/IHJvb3REaXJQYXRoIDogdW5kZWZpbmVkKTtcblxuICAgIC8vIFRoZSBiYWRnZSByZWNvcmRzIHRoZSBidWlsZCB0aGF0IGdlbmVyYXRlZCB0aGUgcmVwb3NpdG9yeSdzIGNvbmZpZ3VyYXRpb24sIHNvIHRoZSBzYW1lIGJ1aWxkXG4gICAgLy8gd291bGQgb25seSByZXdyaXRlIHdoYXQgaXMgYWxyZWFkeSB0aGVyZS4gU2tpcHBpbmcgaXMgYSBkZWxpYmVyYXRlIHRyYWRlOiB0aGUgcGFydHMgb2YgYSBydW5cbiAgICAvLyB0aGF0IGRlcGVuZCBvbiBzdGF0ZSBPVVRTSURFIHRoZSByZXBvc2l0b3J5IChHaXRIdWIgc2V0dGluZ3MsIGRlcGVuZGVuY3kgdXBkYXRlcywgdGhlIGZldGNoZWRcbiAgICAvLyAuZ2l0aWdub3JlKSBkbyBnZXQgc2tpcHBlZCB0b28sIHdoaWNoIGlzIHdoYXQgLS1mb3JjZSBpcyBmb3IuXG4gICAgaWYgKHNraXBwYWJsZVZlcnNpb25MYWJlbCAmJiAoYXdhaXQgcmVhZEFwcGxpZWRXYmZ5VmVyc2lvbkxhYmVsKHJvb3REaXJQYXRoKSkgPT09IHNraXBwYWJsZVZlcnNpb25MYWJlbCkge1xuICAgICAgY29uc29sZS5pbmZvKGBTa2lwICR7cm9vdERpclBhdGh9OiB3YmZ5ICR7c2tpcHBhYmxlVmVyc2lvbkxhYmVsfSBpcyBhbHJlYWR5IGFwcGxpZWQuIFBhc3MgLS1mb3JjZSB0byByZS1hcHBseS5gKTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBjb25zdCBwYWNrYWdlc0RpclBhdGggPSBwYXRoLmpvaW4ocm9vdERpclBhdGgsICdwYWNrYWdlcycpO1xuICAgIGNvbnN0IGRpcmVudHMgPSAoYXdhaXQgaWdub3JlRXJyb3JBc3luYygoKSA9PiBmcy5wcm9taXNlcy5yZWFkZGlyKHBhY2thZ2VzRGlyUGF0aCwgeyB3aXRoRmlsZVR5cGVzOiB0cnVlIH0pKSkgPz8gW107XG4gICAgY29uc3QgcGFja2FnZXNTdWJEaXJQYXRocyA9IGRpcmVudHNcbiAgICAgIC5maWx0ZXIoKGQpID0+IGQuaXNEaXJlY3RvcnkoKSlcbiAgICAgIC5tYXAoKGQpID0+IHBhdGgucmVzb2x2ZShwYWNrYWdlc0RpclBhdGgsIGQubmFtZSkpO1xuICAgIC8vIEFsc28gY292ZXIgd29ya3NwYWNlcyBkZWNsYXJlZCBvdXRzaWRlIHBhY2thZ2VzLyogKGUuZy4gYXBwcy8qKTogdGhleSByZWNlaXZlIHRoZSBzYW1lXG4gICAgLy8gbWFuYWdlZCBjb25maWdzICh0c2NvbmZpZy5qc29uLCBwYWNrYWdlLmpzb24gY29udmVudGlvbnMsIOKApikgYXMgcGFja2FnZXMvKiBjaGlsZHJlbi5cbiAgICBjb25zdCByb290UGFja2FnZUpzb24gPVxuICAgICAgaWdub3JlRXJyb3IoXG4gICAgICAgICgpID0+XG4gICAgICAgICAgSlNPTi5wYXJzZShmcy5yZWFkRmlsZVN5bmMocGF0aC5yZXNvbHZlKHJvb3REaXJQYXRoLCAncGFja2FnZS5qc29uJyksICd1dGY4JykpIGFzIFBhY2thZ2VDb25maWdbJ3BhY2thZ2VKc29uJ11cbiAgICAgICkgPz8ge307XG4gICAgY29uc3Qgd29ya3NwYWNlU3ViRGlyUGF0aHMgPSBnZXRXb3Jrc3BhY2VTdWJEaXJQYXRocyh7XG4gICAgICBkaXJQYXRoOiByb290RGlyUGF0aCxcbiAgICAgIHBhY2thZ2VKc29uOiByb290UGFja2FnZUpzb24sXG4gICAgICBkb2VzQ29udGFpblN1YlBhY2thZ2VKc29uczogcGFja2FnZXNTdWJEaXJQYXRocy5zb21lKChzdWJEaXJQYXRoKSA9PlxuICAgICAgICBmcy5leGlzdHNTeW5jKHBhdGgucmVzb2x2ZShzdWJEaXJQYXRoLCAncGFja2FnZS5qc29uJykpXG4gICAgICApLFxuICAgIH0pO1xuICAgIGNvbnN0IHN1YkRpclBhdGhzID0gWy4uLm5ldyBTZXQoWy4uLnBhY2thZ2VzU3ViRGlyUGF0aHMsIC4uLndvcmtzcGFjZVN1YkRpclBhdGhzXSldLmZpbHRlcihcbiAgICAgIChzdWJEaXJQYXRoKSA9PiBzdWJEaXJQYXRoICE9PSBwYXRoLnJlc29sdmUocm9vdERpclBhdGgpXG4gICAgKTtcblxuICAgIC8vIFJlZnVzZWQgd3JpdGVzIG9uIGNvcmUgbWFuYWdlZCBmaWxlcyB3b3VsZCBsZWF2ZSB0aGUgcmVwb3NpdG9yeSBwYXJ0aWFsbHkgdXBkYXRlZCwgc28gc2tpcFxuICAgIC8vIGl0IEJFRk9SRSBhbnkgbXV0YXRpb24gd2hlbiBvbmUgb2YgdGhlbSBpcyBhIHN5bWxpbmsgb3IgcmVzb2x2ZXMgb3V0c2lkZSB0aGUgcmVwb3NpdG9yeS5cbiAgICBjb25zdCBtYW5hZ2VkRmlsZVBhdGhzID0gW1xuICAgICAgLi4uWycuZ2l0YXR0cmlidXRlcycsICdidW5maWcudG9tbCcsICdsZWZ0aG9vay55bWwnLCAncGFja2FnZS5qc29uJywgJ3RzY29uZmlnLmpzb24nXS5tYXAoKG5hbWUpID0+XG4gICAgICAgIHBhdGgucmVzb2x2ZShyb290RGlyUGF0aCwgbmFtZSlcbiAgICAgICksXG4gICAgICAuLi5zdWJEaXJQYXRocy5mbGF0TWFwKChzdWJEaXJQYXRoKSA9PlxuICAgICAgICBbJ3BhY2thZ2UuanNvbicsICd0c2NvbmZpZy5qc29uJ10ubWFwKChuYW1lKSA9PiBwYXRoLnJlc29sdmUoc3ViRGlyUGF0aCwgbmFtZSkpXG4gICAgICApLFxuICAgIF07XG4gICAgY29uc3Qgd3JpdGFibGVSZXN1bHRzID0gYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgICBtYW5hZ2VkRmlsZVBhdGhzLm1hcCgoZmlsZVBhdGgpID0+IGZzVXRpbC5pc0NvbmZpbmVkV3JpdGFibGVQYXRoKGZpbGVQYXRoKSlcbiAgICApO1xuICAgIGlmICh3cml0YWJsZVJlc3VsdHMuaW5jbHVkZXMoZmFsc2UpKSB7XG4gICAgICBjb25zb2xlLmVycm9yKGBTa2lwICR7cm9vdERpclBhdGh9OiBhIG1hbmFnZWQgY29uZmlnIGZpbGUgaXMgYSBzeW1saW5rIG9yIHJlc29sdmVzIG91dHNpZGUgdGhlIHJlcG9zaXRvcnkuYCk7XG4gICAgICBoYXNJbnZhbGlkUGFja2FnZUNvbmZpZyA9IHRydWU7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICBjb25zdCBwcmVmbGlnaHRFcnJvcnMgPSBbcm9vdERpclBhdGgsIC4uLnN1YkRpclBhdGhzXS5mbGF0TWFwKChkaXJQYXRoKSA9PiB7XG4gICAgICBjb25zdCBwYWNrYWdlSnNvblBhdGggPSBwYXRoLnJlc29sdmUoZGlyUGF0aCwgJ3BhY2thZ2UuanNvbicpO1xuICAgICAgaWYgKCFmcy5leGlzdHNTeW5jKHBhY2thZ2VKc29uUGF0aCkpIHJldHVybiBbXTtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHBhY2thZ2VKc29uID0gSlNPTi5wYXJzZShmcy5yZWFkRmlsZVN5bmMocGFja2FnZUpzb25QYXRoLCAndXRmOCcpKSBhcyBQYWNrYWdlQ29uZmlnWydwYWNrYWdlSnNvbiddO1xuICAgICAgICBjb25zdCBlcnJvciA9IGdldFdvcmtlclR5cGVzU2NyaXB0RXJyb3IoeyBwYWNrYWdlSnNvbiB9KTtcbiAgICAgICAgcmV0dXJuIGVycm9yID8gW2Ake2RpclBhdGh9OiAke2Vycm9yfWBdIDogW107XG4gICAgICB9IGNhdGNoIHtcbiAgICAgICAgcmV0dXJuIFtgJHtwYWNrYWdlSnNvblBhdGh9IGlzIGludmFsaWRgXTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICBpZiAocHJlZmxpZ2h0RXJyb3JzLmxlbmd0aCA+IDApIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoYFNraXAgJHtyb290RGlyUGF0aH06XFxuJHtwcmVmbGlnaHRFcnJvcnMuam9pbignXFxuJyl9YCk7XG4gICAgICBoYXNJbnZhbGlkUGFja2FnZUNvbmZpZyA9IHRydWU7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICAvLyBMZXQgZ2V0UGFja2FnZUNvbmZpZyBkZXJpdmUgaXNSb290IGZvciB0aGUgZW50cnkgcGF0aDogYHdiZnkgPHJlcG8+L3BhY2thZ2VzLzxhcHA+YCBpcyBhXG4gICAgLy8gc3VwcG9ydGVkIGludm9jYXRpb24gd2hvc2UgdGFyZ2V0IG11c3Qga2VlcCBpdHMgY2hpbGQgY2xhc3NpZmljYXRpb24sIHNvIGZvcmNpbmdcbiAgICAvLyBgaXNSb290OiB0cnVlYCBoZXJlIHdvdWxkIGFwcGx5IHJvb3Qtb25seSBwcm9jZXNzaW5nIChsZWZ0aG9vayBpbnN0YWxsLCByb290IHRzY29uZmlnLFxuICAgIC8vIEFHRU5UUy5tZCwg4oCmKSB0byBhIHN1YnBhY2thZ2UuXG4gICAgY29uc3Qgcm9vdENvbmZpZyA9IGF3YWl0IGdldFBhY2thZ2VDb25maWcocm9vdERpclBhdGgpO1xuICAgIGlmIChvcHRpb25zLmlzVmVyYm9zZSkge1xuICAgICAgY29uc29sZS5sb2coJ3Jvb3RDb25maWc6Jywgcm9vdENvbmZpZyk7XG4gICAgfVxuICAgIGlmICghcm9vdENvbmZpZykge1xuICAgICAgY29uc29sZS5lcnJvcihgdGhlcmUgaXMgbm8gdmFsaWQgcGFja2FnZS5qc29uIGluICR7cm9vdERpclBhdGh9YCk7XG4gICAgICBoYXNJbnZhbGlkUGFja2FnZUNvbmZpZyA9IHRydWU7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgLy8gRXZlcnkgZGlzY292ZXJlZCB3b3Jrc3BhY2UgKGluY2x1ZGluZyBub24tcGFja2FnZXMvKiBsYXlvdXRzIHN1Y2ggYXMgYXBwcy8qKSBpcyBhIGNoaWxkXG4gICAgLy8gcGFja2FnZTsgdGhlIHBhY2thZ2VzLyogaGV1cmlzdGljIGluc2lkZSBnZXRQYWNrYWdlQ29uZmlnIHdvdWxkIG1pc2NsYXNzaWZ5IGFwcHMvKiBhcyByb290cy5cbiAgICBjb25zdCBudWxsYWJsZVN1YlBhY2thZ2VDb25maWdzID0gYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgICBzdWJEaXJQYXRocy5tYXAoKHN1YkRpclBhdGgpID0+IGdldFBhY2thZ2VDb25maWcoc3ViRGlyUGF0aCwgeyBpc1Jvb3Q6IGZhbHNlIH0pKVxuICAgICk7XG4gICAgY29uc3QgaW52YWxpZFN1YlBhY2thZ2VEaXJQYXRoID0gc3ViRGlyUGF0aHMuZmluZChcbiAgICAgIChzdWJEaXJQYXRoLCBpbmRleCkgPT4gIW51bGxhYmxlU3ViUGFja2FnZUNvbmZpZ3NbaW5kZXhdICYmIGZzLmV4aXN0c1N5bmMocGF0aC5qb2luKHN1YkRpclBhdGgsICdwYWNrYWdlLmpzb24nKSlcbiAgICApO1xuICAgIGlmIChpbnZhbGlkU3ViUGFja2FnZURpclBhdGgpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoYFNraXAgJHtyb290RGlyUGF0aH06ICR7aW52YWxpZFN1YlBhY2thZ2VEaXJQYXRofS9wYWNrYWdlLmpzb24gaXMgaW52YWxpZC5gKTtcbiAgICAgIGhhc0ludmFsaWRQYWNrYWdlQ29uZmlnID0gdHJ1ZTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBjb25zdCBzdWJQYWNrYWdlQ29uZmlncyA9IG51bGxhYmxlU3ViUGFja2FnZUNvbmZpZ3MuZmlsdGVyKChjb25maWcpID0+ICEhY29uZmlnKTtcbiAgICBjb25zdCBhbGxQYWNrYWdlQ29uZmlncyA9IFtyb290Q29uZmlnLCAuLi5zdWJQYWNrYWdlQ29uZmlnc107XG4gICAgLy8gVGhlIG1hbmFnZWQgaWdub3JlIHJ1bGUgaXMgdW5hbmNob3JlZCwgc28gYSBuZXN0ZWQgY29weSAoZS5nLiB3b3JrZXJzL2FwaS8uZW52LmNsb3VkZmxhcmUpIGlzXG4gICAgLy8gYXMgbXVjaCBhIGxlYWsgYXMgYSByb290IG9uZTsgdGhlIHdpbGRjYXJkIHBhdGhzcGVjIGNvdmVycyBldmVyeSBkZXB0aCBpbiBvbmUgcXVlcnkuXG4gICAgY29uc3QgdHJhY2tlZENsb3VkZmxhcmVFbnZQYXRocyA9IGFsbFBhY2thZ2VDb25maWdzLnNvbWUoKGNvbmZpZykgPT4gY29uZmlnLmlzQ2xvdWRmbGFyZSlcbiAgICAgID8gc3Bhd25TeW5jQW5kUmV0dXJuU3Rkb3V0KFxuICAgICAgICAgICdnaXQnLFxuICAgICAgICAgIFsnLWMnLCAnY29yZS5xdW90ZVBhdGg9ZmFsc2UnLCAnbHMtZmlsZXMnLCAnLS0nLCAnLmVudi5jbG91ZGZsYXJlJywgJyovLmVudi5jbG91ZGZsYXJlJ10sXG4gICAgICAgICAgcm9vdENvbmZpZy5kaXJQYXRoXG4gICAgICAgIClcbiAgICAgICAgICAuc3BsaXQoJ1xcbicpXG4gICAgICAgICAgLmZpbHRlcihCb29sZWFuKVxuICAgICAgICAgIC5tYXAoKGZpbGVQYXRoKSA9PiBwYXRoLnJlc29sdmUocm9vdENvbmZpZy5kaXJQYXRoLCBmaWxlUGF0aCkpXG4gICAgICA6IFtdO1xuICAgIGlmICh0cmFja2VkQ2xvdWRmbGFyZUVudlBhdGhzLmxlbmd0aCA+IDApIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICAgIGBTRUNVUklUWSBFUlJPUjogQ2xvdWRmbGFyZSBjcmVkZW50aWFscyBtdXN0IGJlIHVudHJhY2tlZC4gUmVtb3ZlICR7dHJhY2tlZENsb3VkZmxhcmVFbnZQYXRocy5qb2luKFxuICAgICAgICAgICcsICdcbiAgICAgICAgKX0gZnJvbSBHaXQsIHB1cmdlIHRoZSB0b2tlbiBmcm9tIGhpc3RvcnksIGFuZCByb3RhdGUgQ0xPVURGTEFSRV9BUElfVE9LRU4gYmVmb3JlIHJlcnVubmluZyB3YmZ5LmBcbiAgICAgICk7XG4gICAgICBoYXNJbnZhbGlkUGFja2FnZUNvbmZpZyA9IHRydWU7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgY29uc3QgYWJicmV2aWF0aW9uUHJvbWlzZSA9IGZpeFR5cG9zKHJvb3RDb25maWcpO1xuXG4gICAgYXdhaXQgZ2VuZXJhdGVSZXBvc2l0b3J5TnBtcmMoYWxsUGFja2FnZUNvbmZpZ3MpO1xuXG4gICAgaWYgKG9wdGlvbnMuaXNWZXJib3NlKSB7XG4gICAgICBmb3IgKGNvbnN0IGNvbmZpZyBvZiBhbGxQYWNrYWdlQ29uZmlncykge1xuICAgICAgICBjb25zb2xlLmluZm8oY29uZmlnKTtcbiAgICAgIH1cbiAgICB9XG4gICAgYXNzZXJ0U2FmZURlcGVuZGVuY3lTb3VyY2VzKGFsbFBhY2thZ2VDb25maWdzKTtcbiAgICAvLyBNYW5hZ2VkIHJlcG9zaXRvcmllcyB1c2UgQnVuIHdpdGggbWlzZSAoYW5kIG9wdGlvbmFsbHkgZm5veCkuXG4gICAgY29uc3QgcHJldmlvdXNCdW5HbG9iYWxTdG9yZSA9IHJlYWRCdW5HbG9iYWxTdG9yZShyb290RGlyUGF0aCk7XG4gICAgLy8gUm9vdC1sZXZlbCBpbnN0YWxsIGxheW91dCBtdXN0IGNvdmVyIHdvcmtzcGFjZSBhcHBzIHRvbzogTmV4dC5qcyBjb21tb25seSBsaXZlcyB1bmRlclxuICAgIC8vIHBhY2thZ2VzLyogb3IgYXBwcy8qIHdoaWxlIGJ1bmZpZy50b21sIGV4aXN0cyBvbmx5IGF0IHRoZSByZXBvc2l0b3J5IHJvb3QuXG4gICAgY29uc3QgdXNlR2xvYmFsU3RvcmUgPSByZXNvbHZlQnVuR2xvYmFsU3RvcmUoYWxsUGFja2FnZUNvbmZpZ3MsIHByZXZpb3VzQnVuR2xvYmFsU3RvcmUsIHNraXBEZXBzKTtcbiAgICBhd2FpdCBnZW5lcmF0ZUJ1bmZpZ1RvbWwocm9vdENvbmZpZywgdXNlR2xvYmFsU3RvcmUpO1xuICAgIGF3YWl0IGdlbmVyYXRlTWlzZVRvbWwocm9vdENvbmZpZyk7XG4gICAgYXdhaXQgZ2VuZXJhdGVGbm94VG9tbChyb290Q29uZmlnKTtcbiAgICAvLyBSdW4gYWZ0ZXIgZ2VuZXJhdGVGbm94VG9tbCBzbyBpdHMgdHJhbnNhY3Rpb25hbCByZWNpcGllbnQgc3luYyBjYW5ub3QgcmVzdG9yZSBhIHNuYXBzaG90XG4gICAgLy8gb3ZlciBkZWZpbml0aW9ucyBpbnNlcnRlZCBoZXJlLlxuICAgIGF3YWl0IGVuc3VyZVdiRW52RGVmaW5pdGlvbnMocm9vdENvbmZpZywgYWxsUGFja2FnZUNvbmZpZ3MpO1xuICAgIC8vIHByb21pc2VQb29sLnJ1biByZXNvbHZlcyB3aGVuIGEgdGFzayBTVEFSVFMsIHNvIHRoZSBnZW5lcmF0ZWQgYnVuZmlnLnRvbWwgaXMgbm90XG4gICAgLy8gZ3VhcmFudGVlZCB0byBiZSBvbiBkaXNrIHlldDsgdGhlIHByb2JlIGJlbG93IG11c3Qgbm90IHZhbGlkYXRlIGEgc3RhbGUgY29uZmlndXJhdGlvbi5cbiAgICBhd2FpdCBwcm9taXNlUG9vbC5wcm9taXNlQWxsKCk7XG5cbiAgICAvLyBUaGUgbGF5b3V0IG11c3QgYmUgdmVyaWZpZWQgaW5zdGFsbGFibGUgQkVGT1JFIGFueSBgYnVuIGFkZGAgbXV0YXRlcyBwYWNrYWdlLmpzb24gZmlsZXM6XG4gICAgLy8gcGVyLXBhY2thZ2UgaW5zdGFsbHMgdG9sZXJhdGUgZmFpbHVyZXMgKHNwYXduU3luYyBkaXNjYXJkcyB0aGVpciBzdGF0dXMpLCBzbyBhIGxheW91dCB0aGF0XG4gICAgLy8gY2Fubm90IGluc3RhbGwgd291bGQgc2lsZW50bHkgZHJvcCBldmVyeSBtYW5hZ2VkIGRlcGVuZGVuY3kgdXBkYXRlIGZvciB0aGUgcmVzdCBvZiB0aGUgcnVuLlxuICAgIC8vIEEgZG9jcy1vbmx5IHJlcG9zaXRvcnkgaGFzIG5vIG1hbmlmZXN0IHRvIHByb2JlIG9uIGl0cyBmaXJzdCBydW47IGdlbmVyYXRlUGFja2FnZUpzb24gYmVsb3dcbiAgICAvLyBjcmVhdGVzIGl0IGJlZm9yZSB0aGUgYXV0aG9yaXRhdGl2ZSByZWZyZXNoQnVuTG9jayBjaGVjay5cbiAgICBpZiAoXG4gICAgICAhc2tpcERlcHMgJiZcbiAgICAgIHJvb3RDb25maWcuZG9lc0NvbnRhaW5QYWNrYWdlSnNvbiAmJlxuICAgICAgIXByb2JlSXNvbGF0ZWRCdW5JbnN0YWxsKHJvb3REaXJQYXRoLCByb290Q29uZmlnLCBwcmV2aW91c0J1bkdsb2JhbFN0b3JlLCB1c2VHbG9iYWxTdG9yZSlcbiAgICApIHtcbiAgICAgIC8vIHJlZnJlc2hCdW5Mb2NrIGJlbG93IGlzIHRoZSBhdXRob3JpdHkgb24gd2hldGhlciB0aGUgZmluYWwgaW5zdGFsbCBmYWlsZWQuXG4gICAgICBjb25zb2xlLndhcm4oYGJ1biBpbnN0YWxsIGN1cnJlbnRseSBmYWlscyBpbiAke3Jvb3REaXJQYXRofSB1bmRlciB0aGUgaXNvbGF0ZWQgbGlua2VyLmApO1xuICAgIH1cblxuICAgIGNvbnN0IHNob3VsZFJ1bldvcmtmbG93cyA9XG4gICAgICAhaXNSZXVzYWJsZVdvcmtmbG93c1JlcG8ocm9vdENvbmZpZy5yZXBvc2l0b3J5KSAmJlxuICAgICAgKHJvb3RDb25maWcucmVwb3NpdG9yeT8uc3RhcnRzV2l0aCgnZ2l0aHViOldpbGxCb29zdGVyLycpIHx8XG4gICAgICAgIHJvb3RDb25maWcucmVwb3NpdG9yeT8uc3RhcnRzV2l0aCgnZ2l0aHViOldpbGxCb29zdGVyTGFiLycpKTtcbiAgICAvLyBPdGhlciBvd25lcnMgY2Fubm90IGNhbGwgdGhlIG9yZ2FuaXphdGlvbidzIHJldXNhYmxlIHdvcmtmbG93cyAodGhlaXIgc2VjcmV0cyBhbmQgcnVubmVyc1xuICAgIC8vIGRvIG5vdCBleGlzdCB0aGVyZSksIHNvIGFueSBvdGhlciBHaXRIdWItaG9zdGVkIE5vZGUuanMgcmVwb3NpdG9yeSBnZXRzIHNlbGYtY29udGFpbmVkXG4gICAgLy8gd29ya2Zsb3dzIGluc3RlYWQg4oCUIGtleWVkIG9uIHJlcG9zaXRvcnkgc3RhdGUsIG5ldmVyIG9uIHRoZSBvd25lcidzIGlkZW50aXR5LlxuICAgIC8vIHJvb3RDb25maWcuaXNSb290OiBhIGRpcmVjdCB3b3Jrc3BhY2UtY2hpbGQgaW52b2NhdGlvbiAoYHdiZnkgPHJlcG8+L3BhY2thZ2VzLzxhcHA+YCkga2VlcHNcbiAgICAvLyBpc1Jvb3QgZmFsc2UsIGFuZCBHaXRIdWIgaWdub3JlcyB3b3JrZmxvdyBmaWxlcyBuZXN0ZWQgdW5kZXIgYSBwYWNrYWdlIGRpcmVjdG9yeS5cbiAgICBjb25zdCBzaG91bGRSdW5TZWxmQ29udGFpbmVkV29ya2Zsb3dzID1cbiAgICAgICFzaG91bGRSdW5Xb3JrZmxvd3MgJiZcbiAgICAgICFpc1JldXNhYmxlV29ya2Zsb3dzUmVwbyhyb290Q29uZmlnLnJlcG9zaXRvcnkpICYmXG4gICAgICAhIXJvb3RDb25maWcucmVwb3NpdG9yeT8uc3RhcnRzV2l0aCgnZ2l0aHViOicpICYmXG4gICAgICByb290Q29uZmlnLmlzUm9vdDtcbiAgICBhd2FpdCBQcm9taXNlLmFsbChbXG4gICAgICBhYmJyZXZpYXRpb25Qcm9taXNlLnRoZW4oKCkgPT4gZ2VuZXJhdGVSZWFkbWUocm9vdENvbmZpZykpLFxuICAgICAgZ2VuZXJhdGVEb2NrZXJpZ25vcmUocm9vdENvbmZpZyksXG4gICAgICBnZW5lcmF0ZUVkaXRvcmNvbmZpZyhyb290Q29uZmlnKSxcbiAgICAgIGdlbmVyYXRlR2VtaW5pQ29uZmlnKHJvb3RDb25maWcsIGFsbFBhY2thZ2VDb25maWdzKSxcbiAgICAgIGdlbmVyYXRlR2l0YXR0cmlidXRlcyhyb290Q29uZmlnKSxcbiAgICAgIGdlbmVyYXRlR2l0SHViVGVtcGxhdGVzKHJvb3RDb25maWcpLFxuICAgICAgZ2VuZXJhdGVJZGVhU2V0dGluZ3Mocm9vdENvbmZpZyksXG4gICAgICBmaXhSYWlsd2F5aWdub3JlKHJvb3RDb25maWcpLFxuICAgICAgZ2VuZXJhdGVSZW5vdmF0ZUpzb25jKHJvb3RDb25maWcpLFxuICAgICAgZ2VuZXJhdGVSZWxlYXNlcmMocm9vdENvbmZpZyksXG4gICAgICAuLi4oc2hvdWxkUnVuV29ya2Zsb3dzID8gW2dlbmVyYXRlV29ya2Zsb3dzKHJvb3RDb25maWcpXSA6IFtdKSxcbiAgICAgIC4uLihzaG91bGRSdW5TZWxmQ29udGFpbmVkV29ya2Zsb3dzID8gW2dlbmVyYXRlU2VsZkNvbnRhaW5lZFdvcmtmbG93cyhyb290Q29uZmlnLCBhbGxQYWNrYWdlQ29uZmlncyldIDogW10pLFxuICAgICAgc2V0dXBMYWJlbHMocm9vdENvbmZpZyksXG4gICAgICBzZXR1cFJlcG9zaXRvcnlSdWxlc2V0cyhyb290Q29uZmlnKSxcbiAgICAgIHNldHVwR2l0SHViU2V0dGluZ3Mocm9vdENvbmZpZyksXG4gICAgICAvLyBHaXQgaG9va3MgYXJlIHJlcG9zaXRvcnktbGV2ZWwgc3RhdGU6IGEgZGlyZWN0IHdvcmtzcGFjZS1jaGlsZCBpbnZvY2F0aW9uIG11c3Qgbm90IHdyaXRlIGFcbiAgICAgIC8vIGNoaWxkIGxlZnRob29rLnltbCBvciByZXBsYWNlIHRoZSBlbmNsb3NpbmcgcmVwb3NpdG9yeSdzIGhvb2sgaW5zdGFsbGF0aW9uLlxuICAgICAgLi4uKHJvb3RDb25maWcuaXNSb290ID8gW2dlbmVyYXRlTGVmdGhvb2socm9vdENvbmZpZywgYWxsUGFja2FnZUNvbmZpZ3MpXSA6IFtdKSxcbiAgICBdKTtcbiAgICBhd2FpdCBwcm9taXNlUG9vbC5wcm9taXNlQWxsKCk7XG4gICAgLy8gQWZ0ZXIgdGhlIHdvcmtmbG93IGdlbmVyYXRvciAoYW5kIGl0cyBwb29sZWQgd3JpdGVzKSBzbyB0aGUgaW5zdHJ1Y3Rpb24gZmlsZXMgZGVzY3JpYmUgdGhlXG4gICAgLy8gZmluYWxpemVkIHdvcmtmbG93IGZpbGVzIGluc3RlYWQgb2YgbGFnZ2luZyBvbmUgcnVuIGJlaGluZC5cbiAgICBhd2FpdCBnZW5lcmF0ZUFnZW50SW5zdHJ1Y3Rpb25zKHJvb3RDb25maWcsIGFsbFBhY2thZ2VDb25maWdzKTtcbiAgICBhd2FpdCBwcm9taXNlUG9vbC5wcm9taXNlQWxsKCk7XG5cbiAgICBjb25zdCBwcm9taXNlczogUHJvbWlzZTx2b2lkPltdID0gW107XG4gICAgZm9yIChjb25zdCBjb25maWcgb2YgYWxsUGFja2FnZUNvbmZpZ3MpIHtcbiAgICAgIGlmIChjb25maWcuZGVwZW5kaW5nLnBsYXl3cmlnaHRUZXN0KSB7XG4gICAgICAgIHByb21pc2VzLnB1c2goZml4UGxheXdyaWdodENvbmZpZyhjb25maWcpKTtcbiAgICAgIH1cbiAgICAgIGlmIChjb25maWcuZGVwZW5kaW5nLm5leHQpIHtcbiAgICAgICAgcHJvbWlzZXMucHVzaChmaXhOZXh0Q29uZmlnSnNvbihjb25maWcpKTtcbiAgICAgIH1cbiAgICAgIGlmIChjb25maWcuZGVwZW5kaW5nLmNoYWtyYSkge1xuICAgICAgICBwcm9taXNlcy5wdXNoKGZpeENoYWtyYVRvYXN0ZXIoY29uZmlnKSk7XG4gICAgICB9XG4gICAgICBhd2FpdCBnZW5lcmF0ZUdpdGlnbm9yZShjb25maWcsIHJvb3RDb25maWcpO1xuICAgICAgYXdhaXQgcHJvbWlzZVBvb2wucHJvbWlzZUFsbCgpO1xuICAgICAgaWYgKCFjb25maWcuaXNSb290ICYmICFjb25maWcuZG9lc0NvbnRhaW5QYWNrYWdlSnNvbikge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGlmIChkb2VzQ29udGFpbkphdmEoY29uZmlnKSkgYXdhaXQgZ2VuZXJhdGVQcmV0dGllcmlnbm9yZShjb25maWcpO1xuICAgICAgYXdhaXQgZ2VuZXJhdGVQYWNrYWdlSnNvbihjb25maWcsIHJvb3RDb25maWcsIHNraXBEZXBzKTtcblxuICAgICAgaWYgKGNvbmZpZy5kb2VzQ29udGFpblZzY29kZVNldHRpbmdzSnNvbikge1xuICAgICAgICBwcm9taXNlcy5wdXNoKGdlbmVyYXRlVnNjb2RlU2V0dGluZ3MoY29uZmlnKSk7XG4gICAgICB9XG4gICAgICBpZiAoY29uZmlnLmRvZXNDb250YWluVHlwZVNjcmlwdCB8fCBjb25maWcuZG9lc0NvbnRhaW5UeXBlU2NyaXB0SW5QYWNrYWdlcykge1xuICAgICAgICBwcm9taXNlcy5wdXNoKGdlbmVyYXRlVHNjb25maWcoY29uZmlnKSk7XG4gICAgICB9XG4gICAgICBpZiAoZG9lc0NvbnRhaW5Kc09yVHMoY29uZmlnKSkge1xuICAgICAgICBwcm9taXNlcy5wdXNoKGdlbmVyYXRlT3hmbXRDb25maWcoY29uZmlnKSk7XG4gICAgICAgIHByb21pc2VzLnB1c2goZ2VuZXJhdGVPeGxpbnRDb25maWcoY29uZmlnLCByb290Q29uZmlnKSk7XG4gICAgICB9IGVsc2UgaWYgKCFjb25maWcuaXNSb290ICYmIGNvbmZpZy5kb2VzQ29udGFpblBhY2thZ2VKc29uICYmIGRvZXNDb250YWluSnNPclRzKHJvb3RDb25maWcpKSB7XG4gICAgICAgIC8vIE1vbm9yZXBvIHZlcmlmaWNhdGlvbiBjYW4gaW52b2tlIG94bGludCBmcm9tIGV2ZXJ5IHdvcmtzcGFjZS4gR2l2ZVxuICAgICAgICAvLyBub24tY29kZSBwYWNrYWdlcyBhIGxvY2FsIGNvbmZpZyBzbyBveGxpbnQgZG9lcyBub3QgY2xpbWIgdG8gdGhlXG4gICAgICAgIC8vIHJvb3QgY29uZmlnIGFuZCByZWplY3Qgcm9vdC1vbmx5IHR5cGUtYXdhcmUgb3B0aW9ucyBmcm9tIGEgcGFja2FnZSBjd2QuXG4gICAgICAgIHByb21pc2VzLnB1c2goZ2VuZXJhdGVPeGxpbnRDb25maWcoY29uZmlnLCByb290Q29uZmlnKSk7XG4gICAgICB9XG4gICAgICBpZiAoY29uZmlnLmRlcGVuZGluZy5weXJpZ2h0KSB7XG4gICAgICAgIHByb21pc2VzLnB1c2goZ2VuZXJhdGVQeXJpZ2h0Q29uZmlnSnNvbihjb25maWcpKTtcbiAgICAgIH1cbiAgICB9XG4gICAgYXdhaXQgUHJvbWlzZS5hbGwocHJvbWlzZXMpO1xuICAgIGF3YWl0IHByb21pc2VQb29sLnByb21pc2VBbGwoKTtcbiAgICAvLyBSdW4gYWZ0ZXIgZXZlcnkgcG9vbGVkIGdlbmVyYXRvciB3cml0ZSBzbyBub3JtYWxpemF0aW9uIGNhbm5vdCBvdmVyd3JpdGUgYSBjb25jdXJyZW50XG4gICAgLy8gdXBkYXRlLCBhbmQgYmVmb3JlIGNsZWFudXAgc28gZm9ybWF0dGVyIG1ldGFkYXRhIGNhY2hlcyBvYnNlcnZlIHRoZSBjaGFuZ2VkIGZpbGVzLlxuICAgIHJlbm9ybWFsaXplVHJhY2tlZFRleHRGaWxlcyhyb290RGlyUGF0aCk7XG4gICAgLy8gUmVmcmVzaCBsb2NrIGZpbGVzXG4gICAgdHJ5IHtcbiAgICAgIHJlZnJlc2hCdW5Mb2NrKHJvb3REaXJQYXRoKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgLy8gQSBmYWlsZWQgaW5zdGFsbCBtdXN0IGZhaWwgdGhlIENMSTogZXhpdGluZyAwIHdpdGggYSBzdGFsZSBvciBtaXNzaW5nIEJ1biBsb2NrZmlsZSB3b3VsZFxuICAgICAgLy8gaGlkZSBhIGJyb2tlbiBtYW5hZ2VkIGNvbmZpZ3VyYXRpb24uXG4gICAgICBjb25zb2xlLmVycm9yKCdGYWlsZWQgdG8gcmVmcmVzaCB0aGUgQnVuIGxvY2tmaWxlOicsIChlcnJvciBhcyBFcnJvciB8IHVuZGVmaW5lZCk/Lm1lc3NhZ2UgPz8gZXJyb3IpO1xuICAgICAgaGFzSW52YWxpZFBhY2thZ2VDb25maWcgPSB0cnVlO1xuICAgIH1cbiAgICB0cnkge1xuICAgICAgLy8gQnVuIHdyaXRlcyBidW4ubG9jayBiZWZvcmUgbGlmZWN5Y2xlIHNjcmlwdHMsIHNvIGEgZmFpbGVkIGluc3RhbGwgY2FuIHN0aWxsIGxlYXZlIEd1YXJkXG4gICAgICAvLyBVUkxzIGJlaGluZC4gTm9ybWFsaXplIGJvdGggc3VjY2VzcyBhbmQgZmFpbHVyZSBvdXRwdXQgd2l0aG91dCByZXBsYWNpbmcgdGhlIGluc3RhbGwgZXJyb3IuXG4gICAgICBjb25zdCBub3JtYWxpemVkTG9ja2ZpbGVQYXRoID0gbm9ybWFsaXplQnVuTG9ja2ZpbGUocm9vdERpclBhdGgpO1xuICAgICAgaWYgKG5vcm1hbGl6ZWRMb2NrZmlsZVBhdGgpIHtcbiAgICAgICAgY29uc29sZS5pbmZvKGBSZW1vdmVkIFRha3VtaSBHdWFyZCBwcm94eSBVUkxzIGZyb20gJHtub3JtYWxpemVkTG9ja2ZpbGVQYXRofSB0byBrZWVwIGl0IHJlZ2lzdHJ5LWFnbm9zdGljLmApO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBjb25zb2xlLmVycm9yKCdGYWlsZWQgdG8gbm9ybWFsaXplIHRoZSBCdW4gbG9ja2ZpbGU6JywgKGVycm9yIGFzIEVycm9yIHwgdW5kZWZpbmVkKT8ubWVzc2FnZSA/PyBlcnJvcik7XG4gICAgICBoYXNJbnZhbGlkUGFja2FnZUNvbmZpZyA9IHRydWU7XG4gICAgfVxuICAgIHNwYXduU3luYygnYnVuJywgWydjbGVhbnVwJ10sIHJvb3REaXJQYXRoKTtcbiAgfVxuICByZXR1cm4gaGFzSW52YWxpZFBhY2thZ2VDb25maWc7XG59XG5cbi8qKlxuICogUHJvYmVzIGBidW4gaW5zdGFsbGAgdW5kZXIgdGhlIGlzb2xhdGVkIGxpbmtlci4gQW4gaW5jb21wYXRpYmlsaXR5IG11c3QgYmUgZml4ZWQgaW4gdGhlXG4gKiByZXBvc2l0b3J5IG9yIGluIHdiZnkncyBtYW5hZ2VkIGxpc3RzLCBuZXZlciBieSBzd2l0Y2hpbmcgdGhlIGxpbmtlci4gUmV0dXJucyBmYWxzZSB3aGVuIHRoZVxuICogaW5zdGFsbCBmYWlscy5cbiAqL1xuZnVuY3Rpb24gcHJvYmVJc29sYXRlZEJ1bkluc3RhbGwoXG4gIHJvb3REaXJQYXRoOiBzdHJpbmcsXG4gIHJvb3RDb25maWc6IFBhY2thZ2VDb25maWcsXG4gIHByZXZpb3VzR2xvYmFsU3RvcmU6IGJvb2xlYW4gfCB1bmRlZmluZWQsXG4gIHVzZUdsb2JhbFN0b3JlOiBib29sZWFuXG4pOiBib29sZWFuIHtcbiAgLy8gQSBsYXlvdXQgc3dpdGNoIG11c3QgcHJvYmUgZnJvbSBhIGNsZWFuIHRyZWUgYmVjYXVzZSBCdW4gZG9lcyBub3QgcmVtb3ZlIHRoZSBwcmV2aW91cyBsYXlvdXQncyBsZWZ0b3ZlcnMuXG4gIGlmIChwcmV2aW91c0dsb2JhbFN0b3JlICE9PSB1c2VHbG9iYWxTdG9yZSkge1xuICAgIHJlbW92ZU5vZGVNb2R1bGVzKHJvb3REaXJQYXRoLCByb290Q29uZmlnKTtcbiAgfVxuICAvLyBSZXRyeSBvbmNlIHNvIGEgdHJhbnNpZW50IGZhaWx1cmUgKHJlZ2lzdHJ5IGhpY2N1cCwgZmxha3kgbGlmZWN5Y2xlIHNjcmlwdCkgZG9lcyBub3RcbiAgLy8gbWFzcXVlcmFkZSBhcyBhIGxheW91dCBpbmNvbXBhdGliaWxpdHkuXG4gIGlmIChzcGF3blN5bmNBbmRSZXR1cm5TdGF0dXMoJ2J1bicsIFsnaW5zdGFsbCddLCByb290RGlyUGF0aCwgMSkgPT09IDApIHJldHVybiB0cnVlO1xuXG4gIC8vIENsZWFuIHVwIHRoZSBmYWlsZWQgYXR0ZW1wdCBzbyBsYXRlciBpbnN0YWxscyBkbyBub3QgcnVuIG9uIGEgcG9sbHV0ZWQgdHJlZS5cbiAgcmVtb3ZlTm9kZU1vZHVsZXMocm9vdERpclBhdGgsIHJvb3RDb25maWcpO1xuICByZXR1cm4gZmFsc2U7XG59XG5cbmZ1bmN0aW9uIHJlbW92ZU5vZGVNb2R1bGVzKHJvb3REaXJQYXRoOiBzdHJpbmcsIHJvb3RDb25maWc6IFBhY2thZ2VDb25maWcpOiB2b2lkIHtcbiAgLy8gQ292ZXIgZXZlcnkgZGVjbGFyZWQgd29ya3NwYWNlOiBsZWZ0b3ZlcnMgY2FuIGtlZXAgcGhhbnRvbSBkZXBlbmRlbmNpZXMgcmVzb2x2YWJsZS5cbiAgY29uc3Qgbm9kZU1vZHVsZXNQYXRocyA9IFtcbiAgICBwYXRoLnJlc29sdmUocm9vdERpclBhdGgsICdub2RlX21vZHVsZXMnKSxcbiAgICAuLi5bLi4uZ2V0V29ya3NwYWNlUGFja2FnZURpcnMocm9vdENvbmZpZykudmFsdWVzKCldLm1hcCgod29ya3NwYWNlRGlyKSA9PlxuICAgICAgcGF0aC5yZXNvbHZlKHJvb3REaXJQYXRoLCB3b3Jrc3BhY2VEaXIsICdub2RlX21vZHVsZXMnKVxuICAgICksXG4gIF07XG4gIC8vIE5ldmVyIGRlbGV0ZSB0aHJvdWdoIGEgd29ya3NwYWNlIHN5bWxpbmsgdGhhdCBlc2NhcGVzIHRoaXMgcmVwb3NpdG9yeS5cbiAgY29uc3QgcmVhbFJvb3REaXJQYXRoID0gZnMucmVhbHBhdGhTeW5jKHJvb3REaXJQYXRoKTtcbiAgZm9yIChjb25zdCBub2RlTW9kdWxlc1BhdGggb2Ygbm9kZU1vZHVsZXNQYXRocykge1xuICAgIGNvbnN0IHJlYWxQYXJlbnREaXJQYXRoID0gaWdub3JlRXJyb3IoKCkgPT4gZnMucmVhbHBhdGhTeW5jKHBhdGguZGlybmFtZShub2RlTW9kdWxlc1BhdGgpKSk7XG4gICAgaWYgKFxuICAgICAgIXJlYWxQYXJlbnREaXJQYXRoIHx8XG4gICAgICAocmVhbFBhcmVudERpclBhdGggIT09IHJlYWxSb290RGlyUGF0aCAmJiAhcmVhbFBhcmVudERpclBhdGguc3RhcnRzV2l0aChyZWFsUm9vdERpclBhdGggKyBwYXRoLnNlcCkpXG4gICAgKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgZnMucm1TeW5jKG5vZGVNb2R1bGVzUGF0aCwgeyByZWN1cnNpdmU6IHRydWUsIGZvcmNlOiB0cnVlIH0pO1xuICB9XG59XG5cbmZ1bmN0aW9uIHJlZnJlc2hCdW5Mb2NrKHJvb3REaXJQYXRoOiBzdHJpbmcpOiB2b2lkIHtcbiAgLy8gd2JmeSBzaG91bGQgdXBkYXRlIG9ubHkgdGhlIHBhY2thZ2VzIGl0IGV4cGxpY2l0bHkgbWFuYWdlcyB0aHJvdWdoIGJ1biBhZGQuXG4gIC8vIFJ1bm5pbmcgYnVuIHVwZGF0ZSBoZXJlIHJlZnJlc2hlcyB1bnJlbGF0ZWQgYXBwbGljYXRpb24gZGVwZW5kZW5jaWVzIGFuZFxuICAvLyBjYW4gY2hhbmdlIHByb2R1Y3QgYmVoYXZpb3IsIHNvIGtlZXAgdGhlIGV4aXN0aW5nIGxvY2sgYW5kIHJlY29uY2lsZSBpdC5cbiAgY29uc3Qgc3RhdHVzID0gc3Bhd25TeW5jQW5kUmV0dXJuU3RhdHVzKCdidW4nLCBbJ2luc3RhbGwnXSwgcm9vdERpclBhdGgsIDEpO1xuICBpZiAoc3RhdHVzID09PSAwKSByZXR1cm47XG4gIHRocm93IG5ldyBFcnJvcihgRmFpbGVkIHRvIHJlZnJlc2ggQnVuIGxvY2tmaWxlOiBidW4gaW5zdGFsbCBleGl0ZWQgd2l0aCBzdGF0dXMgJHtzdGF0dXN9YCk7XG59XG5cbmF3YWl0IG1haW4oKTtcbiJdLCJ4X2dvb2dsZV9pZ25vcmVMaXN0IjpbNDUsNDYsNDcsNDgsNDksNTBdLCJtYXBwaW5ncyI6Iit5QkFXQSxNQUFhLEdBQW9ELENBQy9ELENBQ0UsUUFBUyxNQUNULFlBQWEsc0dBQ2YsRUFDQSxDQUNFLFFBQVMsZUFDVCxZQUNFLDZjQUNKLEVBQ0EsQ0FDRSxRQUFTLG1CQUNULFlBQ0UsNEdBQ0osRUFDQSxDQUNFLFFBQVMsb0JBQ1QsWUFDRSx5S0FDSixFQUNBLENBQ0UsUUFBUyxVQUNULFlBQWEsK0RBQ2YsRUFDQSxDQUNFLFFBQVMsUUFDVCxZQUFhLHNHQUNmLENBQ0YsRUFvQ2EsRUFBaUQsQ0FDNUQsQ0FBRSxRQUFTLFVBQVcsWUFBYSw4Q0FBK0MsRUFDbEYsQ0FBRSxRQUFTLFdBQVksWUFBYSw2Q0FBOEMsRUFDbEYsQ0FBRSxRQUFTLFNBQVUsWUFBYSx3Q0FBeUMsRUFDM0UsQ0FBRSxRQUFTLFdBQVksWUFBYSx1REFBd0QsQ0FDOUYsRUFRYSxHQUFvRCxDQUMvRCxDQUNFLFFBQVMsc0JBQ1QsWUFBYSx3RUFDZixFQUNBLENBQ0UsUUFBUyxXQUNULFlBQ0Usa05BQ0osRUFDQSxDQUNFLFFBQVMsc0JBQ1QsWUFDRSx3R0FDSixFQUNBLENBQ0UsUUFBUyxzQkFDVCxZQUFhLG1HQUNmLEVBQ0EsQ0FDRSxRQUFTLHFCQUNULFlBQ0UsME9BQ0osRUFDQSxDQUNFLFFBQVMsOEJBQ1QsWUFBYSxtR0FDZixFQUNBLENBQ0UsUUFBUyxlQUNULFlBQWEsZ0ZBQ2YsRUFDQSxDQUNFLFFBQVMsaUJBQ1QsWUFBYSx3RkFDZixDQUNGLEVBUUEsU0FBZ0IsR0FBc0IsRUFBOEMsQ0FDbEYsT0FBTyxFQUNKLElBQ0UsR0FDQyxNQUFNLEVBQVEsUUFBUSxXQUFXLEVBQVEsWUFBWSxPQUFPLENBQUMsQ0FBQyxDQUFDLFlB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
515
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJuYW1lcyI6WyJmcyIsImZzIiwicGFyc2VKc29uYyIsImZzcCIsInJlbGVhc2VBZ2VHYXRlLmRheXMiLCJyZWxlYXNlQWdlR2F0ZS5leGNsdWRlcyIsIm5ld0NvbnRlbnQiLCJjb21tb25Db250ZW50IiwibmV3Q29udGVudCIsImNoaWxkX3Byb2Nlc3MiLCJjb21tb25Db250ZW50IiwiY2hpbGRfcHJvY2VzcyIsInNvcnRPYmplY3RLZXlzIiwiZ2l0SG9va3MiLCJkZXRlY3ROZXdsaW5lIiwiZGVwZW5kZW5jeVNlY3Rpb25LZXlzIiwiY29yZSIsIm1hbmFnZWRDb25maWdCbG9ja3MiLCJnZXRDb25maWdDb250ZW50Il0sInNvdXJjZXMiOlsiLi4vLi4vc2hhcmVkLWxpYi9zcmMvZ2l0aHViVGVtcGxhdGVzLnRzIiwiLi4vLi4vc2hhcmVkLWxpYi9zcmMvc2xlZXAudHMiLCIuLi8uLi9zaGFyZWQtbGliL3NyYy9lcnJvci50cyIsIi4uLy4uL3NoYXJlZC1saWIvc3JjL3RleHQudHMiLCIuLi8uLi9zaGFyZWQtbGliL3NyYy90ZXN0aW5nUnVsZXMudHMiLCIuLi8uLi9zaGFyZWQtbGliLW5vZGUvc3JjL2J1bldvcmtzcGFjZXMudHMiLCIuLi8uLi9zaGFyZWQtbGliLW5vZGUvc3JjL2J1bkxvY2tmaWxlLnRzIiwiLi4vLi4vc2hhcmVkLWxpYi1ub2RlL3NyYy9kb2NrZXJmaWxlLnRzIiwiLi4vLi4vc2hhcmVkLWxpYi1ub2RlL3NyYy9nbG9iLnRzIiwiLi4vc3JjL29wdGlvbnMudHMiLCIuLi9zcmMvbG9nZ2VyLnRzIiwiLi4vc3JjL3V0aWxzL2ZzVXRpbC50cyIsIi4uL3NyYy91dGlscy9wcm9taXNlUG9vbC50cyIsIi4uL3NyYy91dGlscy90eXBlc2NyaXB0QXBpLnRzIiwiLi4vc3JjL2ZpeGVycy9uZXh0Q29uZmlnLnRzIiwiLi4vc3JjL2ZpeGVycy9jaGFrcmFUb2FzdGVyLnRzIiwiLi4vc3JjL2ZpeGVycy9wbGF5d3JpZ2h0Q29uZmlnLnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvZm5veFRvbWwudHMiLCIuLi9zcmMvdXRpbHMvbWVyZ2VVdGlsLnRzIiwiLi4vc3JjL3V0aWxzL29iamVjdFV0aWwudHMiLCIuLi9zcmMvdXRpbHMvd29ya3NwYWNlVXRpbC50cyIsIi4uL3NyYy91dGlscy9wcml2YXRlUGFja2FnZXMudHMiLCIuLi9zcmMvZ2VuZXJhdG9ycy93b3JrZmxvd1J1bm5lclBvbGljeS50cyIsIi4uL3NyYy9nZW5lcmF0b3JzL3dvcmtmbG93LnRzIiwiLi4vc3JjL2ZpeGVycy90eXBvcy50cyIsIi4uL3NyYy91dGlscy9naXRodWJVdGlsLnRzIiwiLi4vc3JjL3V0aWxzL2pzb25jVXRpbC50cyIsIi4uL3NyYy91dGlscy9tYW5hZ2VkU2NyaXB0U2VnbWVudC50cyIsIi4uL3NyYy91dGlscy9zcGF3blV0aWwudHMiLCIuLi9zcmMvcGFja2FnZUNvbmZpZy50cyIsIi4uL3NyYy9nZW5lcmF0b3JzL2FnZW50cy50cyIsIi4uL2NvbmZpZ3MvcmVsZWFzZUFnZUdhdGUuanNvbiIsIi4uL3NyYy9nZW5lcmF0b3JzL2J1bmZpZy50cyIsIi4uL3NyYy91dGlscy9pZ25vcmVGaWxlVXRpbC50cyIsIi4uL3NyYy9nZW5lcmF0b3JzL2RvY2tlcmlnbm9yZS50cyIsIi4uL3NyYy91dGlscy9leHRlbnNpb25zLnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvZWRpdG9yY29uZmlnLnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvZ2VtaW5pQ29uZmlnLnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvZ2l0YXR0cmlidXRlcy50cyIsIi4uL3NyYy9nZW5lcmF0b3JzL2dpdGlnbm9yZS50cyIsIi4uL3NyYy91dGlscy92ZXJzaW9uLnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvZ2xvYmFsUmVsZWFzZUFnZUdhdGUudHMiLCIuLi9zcmMvdXRpbHMvcGFja2FnZUNhcGFiaWxpdGllcy50cyIsIi4uL3NyYy9nZW5lcmF0b3JzL2lkZWEudHMiLCIuLi9zcmMvdXRpbHMvZ2VuSTE4blRzLnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLmJ1bi9pbnN0YWxsL2NhY2hlL2xpbmtzL3NvcnQtb2JqZWN0LWtleXNAMi4xLjAtMThkZjJmODM3ZTZlYzI5YS9ub2RlX21vZHVsZXMvc29ydC1vYmplY3Qta2V5cy9pbmRleC5qcyIsIi4uLy4uLy4uLy4uLy4uLy4uLy5idW4vaW5zdGFsbC9jYWNoZS9saW5rcy9kZXRlY3QtaW5kZW50QDcuMC4yLTZiNzVkYzBmNTY1MzNiZDkvbm9kZV9tb2R1bGVzL2RldGVjdC1pbmRlbnQvaW5kZXguanMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uYnVuL2luc3RhbGwvY2FjaGUvbGlua3MvZGV0ZWN0LW5ld2xpbmVANC4wLjEtNWRhOWRmNjUxMjVlZTc5NS9ub2RlX21vZHVsZXMvZGV0ZWN0LW5ld2xpbmUvaW5kZXguanMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uYnVuL2luc3RhbGwvY2FjaGUvbGlua3MvZ2l0LWhvb2tzLWxpc3RANC4yLjEtNmNhMmIyNjlkOTE2MzMyZS9ub2RlX21vZHVsZXMvZ2l0LWhvb2tzLWxpc3QvaW5kZXguanNvbiIsIi4uLy4uLy4uLy4uLy4uLy4uLy5idW4vaW5zdGFsbC9jYWNoZS9saW5rcy9pcy1wbGFpbi1vYmpANC4xLjAtNDdmZGRkNzcwNjQ4ZTU3Ny9ub2RlX21vZHVsZXMvaXMtcGxhaW4tb2JqL2luZGV4LmpzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLmJ1bi9pbnN0YWxsL2NhY2hlL2xpbmtzL3NvcnQtcGFja2FnZS1qc29uQDQuMC4wLTYzNTFiOTJmODI2MTU2ZjQvbm9kZV9tb2R1bGVzL3NvcnQtcGFja2FnZS1qc29uL2luZGV4LmpzIiwiLi4vc3JjL2dpdGh1Yi9jb21taXQudHMiLCIuLi9zcmMvdXRpbHMvdHNjb25maWdCYXNlLnRzIiwiLi4vc3JjL3V0aWxzL3dpbGxib29zdGVyQ29uZmlnc1V0aWwudHMiLCIuLi9zcmMvZ2VuZXJhdG9ycy9wYWNrYWdlSnNvbi50cyIsIi4uL3NyYy9nZW5lcmF0b3JzL2xlZnRob29rLnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvY29uZmlnQ29udGVudC50cyIsIi4uL3NyYy9nZW5lcmF0b3JzL21hbmFnZWRDb25maWdCbG9jay50cyIsIi4uL3NyYy9nZW5lcmF0b3JzL294Zm10Q29uZmlnLnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvb3hsaW50Q29uZmlnLnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvcHJldHRpZXJpZ25vcmUudHMiLCIuLi9zcmMvZ2VuZXJhdG9ycy9weXJpZ2h0Q29uZmlnLnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvcmFpbHdheWlnbm9yZS50cyIsIi4uL3NyYy9nZW5lcmF0b3JzL3JlYWRtZS50cyIsIi4uL3NyYy9nZW5lcmF0b3JzL3JlbGVhc2VyYy50cyIsIi4uL3NyYy9nZW5lcmF0b3JzL3Jlbm92YXRlSnNvbmMudHMiLCIuLi9zcmMvZ2VuZXJhdG9ycy90c2NvbmZpZy50cyIsIi4uL3NyYy9nZW5lcmF0b3JzL3VzZXJBZ2VudENvbmZpZ3MudHMiLCIuLi9zcmMvZ2VuZXJhdG9ycy92c2NvZGVTZXR0aW5ncy50cyIsIi4uL3NyYy9nZW5lcmF0b3JzL3diRW52LnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvc2VsZkNvbnRhaW5lZFdvcmtmbG93LnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvbWlzZVRvbWwudHMiLCIuLi9zcmMvZ2VuZXJhdG9ycy9ucG1yYy50cyIsIi4uL3NyYy9naXRodWIvbGFiZWwudHMiLCIuLi9zcmMvZ2l0aHViL3J1bGVzZXQudHMiLCIuLi9zcmMvZ2l0aHViL3NldHRpbmdzLnRzIiwiLi4vc3JjL2dpdGh1Yi90ZW1wbGF0ZS50cyIsIi4uL3NyYy91dGlscy9kZXBlbmRlbmN5U291cmNlUG9saWN5LnRzIiwiLi4vc3JjL2luZGV4LnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQSBzZWN0aW9uIG9mIGEgUFIgb3IgaXNzdWUgYm9keTogaXRzIGhlYWRpbmcgYW5kIHdoYXQgdGhlIHNlY3Rpb24gbXVzdCBzdGF0ZS4gYHJlcXVpcmVtZW50YFxuICogc3RhcnRzIGxvd2VyY2FzZSBhbmQgZW5kcyB3aXRob3V0IHB1bmN0dWF0aW9uLCBzbyB0aGF0IGl0IHJlYWRzIGJvdGggYXMgYSBwbGFjZWhvbGRlciBzZW50ZW5jZVxuICogKGNhcGl0YWxpemVkLCB3aXRoIGEgcGVyaW9kIGFwcGVuZGVkKSBhbmQgYXMgYSBjaGVja2xpc3QgY2xhdXNlIGFmdGVyIHRoZSBoZWFkaW5nLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFRlbXBsYXRlU2VjdGlvbiB7XG4gIHJlYWRvbmx5IGhlYWRpbmc6IHN0cmluZztcbiAgcmVhZG9ubHkgcmVxdWlyZW1lbnQ6IHN0cmluZztcbn1cblxuLyoqIFNlY3Rpb25zIG9mIGEgcHVsbCByZXF1ZXN0IGJvZHksIGluIHRoZSBvcmRlciB0aGV5IGFwcGVhciBpbiB0aGUgUFIgdGVtcGxhdGUuICovXG5leHBvcnQgY29uc3QgUFVMTF9SRVFVRVNUX1NFQ1RJT05TOiByZWFkb25seSBUZW1wbGF0ZVNlY3Rpb25bXSA9IFtcbiAge1xuICAgIGhlYWRpbmc6ICdXaHknLFxuICAgIHJlcXVpcmVtZW50OiAndGhlIHByb2JsZW0sIHdpdGggdGhlIG51bWJlcnMgb3Igb2JzZXJ2YXRpb25zIGJlaGluZCBpdCwgYW5kIHdoeSB0aGlzIGFwcHJvYWNoIG92ZXIgdGhlIGFsdGVybmF0aXZlcycsXG4gIH0sXG4gIHtcbiAgICBoZWFkaW5nOiAnUmVxdWlyZW1lbnRzJyxcbiAgICByZXF1aXJlbWVudDpcbiAgICAgIFwidGhlIHJlcXVpcmVtZW50cyB0aGUgY2hhbmdlIG11c3Qgc2F0aXNmeSBhbmQgdGhlIGd1YXJhbnRlZXMgaXQgbXVzdCBrZWVwLCBvbmUgcGVyIGxpbmUsIGVhY2ggbWFya2VkIGByZXF1aXJlZGAgKGFza2VkIGZvciBieSB0aGUgcmVxdWVzdGVyLCBvciBhbiBleGlzdGluZyBjb250cmFjdCBjYWxsZXJzIGRlcGVuZCBvbikgb3IgYGNob3NlbmAgKHRoZSBpbXBsZW1lbnRlcidzIG93biBkZWNpc2lvbiwgd2hpY2ggYSBzaW1wbGVyIGRlc2lnbiBtYXkgcmVwbGFjZSk7IGNvcHkgdGhlIHJlcXVlc3RlcidzIGluc3RydWN0aW9ucyBoZXJlIGFzIGdpdmVuLCB3aGV0aGVyIHRoZXkgY2FtZSBmcm9tIGFuIGlzc3VlIG9yIGEgY29udmVyc2F0aW9uLCBhbmQga2VlcCB0aGUgbGlzdCB3aGVuIHRoZSBib2R5IGlzIGxhdGVyIHJld3JpdHRlbiB1bmxlc3MgdGhlIHJlcXVlc3RlcidzIGluc3RydWN0aW9ucyBjaGFuZ2VkXCIsXG4gIH0sXG4gIHtcbiAgICBoZWFkaW5nOiAnQ3VzdG9tZXIgU3VtbWFyeScsXG4gICAgcmVxdWlyZW1lbnQ6XG4gICAgICAnYmVoYXZpb3IsIHdvcmtmbG93LCBvciB1c2VyLXZpc2libGUgY2hhbmdlcywgd3JpdHRlbiBmb3IgcmVhZGVycyB3aG8ga25vdyBub3RoaW5nIGFib3V0IHRoZSBpbXBsZW1lbnRhdGlvbicsXG4gIH0sXG4gIHtcbiAgICBoZWFkaW5nOiAnVGVjaG5pY2FsIFN1bW1hcnknLFxuICAgIHJlcXVpcmVtZW50OlxuICAgICAgJ2RlY2lzaW9ucyBhbmQgdGhlaXIgcmVhc29ucywgZGF0YSBmbG93LCB3aGVyZSB0byBsb29rICh0aGUgZmlsZXMgdGhhdCBtYXR0ZXIgbW9zdCksIGFuZCB3aGF0IHRvIGNoZWNrIGhhcmRlc3Q6IHRoZSBwYXJ0cyB3aG9zZSBjb3JyZWN0bmVzcyBpcyBhcmd1ZWQgcmF0aGVyIHRoYW4gcHJvdmVuJyxcbiAgfSxcbiAge1xuICAgIGhlYWRpbmc6ICdUZXN0aW5nJyxcbiAgICByZXF1aXJlbWVudDogJ2NvbW1hbmRzIHJ1biwgdGVzdHMgYWRkZWQsIGFuZCB3aGF0IHdhcyBOT1QgZXhlcmNpc2VkIGFuZCB3aHknLFxuICB9LFxuICB7XG4gICAgaGVhZGluZzogJ05vdGVzJyxcbiAgICByZXF1aXJlbWVudDogJ2tub3duIGxpbWl0YXRpb25zLCBjb21wYXRpYmlsaXR5IGFuZCBtaWdyYXRpb24sIGZvbGxvdy11cCB3b3JrOyBkZWxldGUgdGhpcyBzZWN0aW9uIGlmIHRoZXJlIGlzIG5vbmUnLFxuICB9LFxuXTtcblxuLyoqXG4gKiBIb3cgYSB0b29sIHRoYXQgd3JpdGVzIG9yIHJld3JpdGVzIGEgUFIgYm9keSBkZXJpdmVzIGl0IGZyb20gdGhlIHJlcG9zaXRvcnkncyBQUiB0ZW1wbGF0ZSwgYXNcbiAqIG1hcmtkb3duIGJ1bGxldHMgZm9yIGFuIGFnZW50J3MgaW5zdHJ1Y3Rpb25zLiBTdGF0ZWQgb25jZSBoZXJlIGFuZCByZW5kZXJlZCBieSBldmVyeSB3cml0ZXIgKHRoZVxuICogZ2VuZXJhdGVkIGFnZW50IGluc3RydWN0aW9ucywgdGhlIFBSLWRyYWZ0aW5nIHNraWxscykgc28gdGhlIHdyaXRlcnMgY2Fubm90IGRyaWZ0IGFwYXJ0OyB0aGVcbiAqIHRlbXBsYXRlLWxlc3MgYnJhbmNoIGxldHMgdGhlIHNhbWUgdGV4dCBzZXJ2ZSByZXBvc2l0b3JpZXMgb3V0c2lkZSB0aGUgb3JnYW5pemF0aW9uLlxuICovXG5jb25zdCBQVUxMX1JFUVVFU1RfVEVNUExBVEVfUlVMRVMgPSBgLSBCYXNlIHRoZSBQUiBib2R5IG9uIFxcYC5naXRodWIvcHVsbF9yZXF1ZXN0X3RlbXBsYXRlLm1kXFxgIHdoZW4gY3JlYXRpbmcgb3IgdXBkYXRpbmcgYSBQUiwgZXZlbiB3aGVuIGEgc2tpbGwgb3Igd29ya2Zsb3cgc3VwcGxpZXMgaXRzIG93biBza2VsZXRvbjoga2VlcCB0aGUgdGVtcGxhdGUncyBoZWFkaW5ncyBpbiBvcmRlciwgZmlsbCBlYWNoIHNlY3Rpb24gd2l0aCB3aGF0IGl0cyBwbGFjZWhvbGRlciBjb21tZW50IGFza3MgZm9yIGF0IGEgbGVuZ3RoIGZpdHRpbmcgdGhlIGNoYW5nZSAoYSBzZW50ZW5jZSBmb3IgYSBzbWFsbCBjaGFuZ2UsIG51bWJlcmVkIHN1YnNlY3Rpb25zIGZvciBhIGxhcmdlIG9uZSksIGFuZCBkZWxldGUgdGhlIHBsYWNlaG9sZGVyIGNvbW1lbnRzIGFuZCBhbiBlbXB0eSBOb3RlcyBzZWN0aW9uLiBXaXRob3V0IGEgdGVtcGxhdGUsIHVzZSBubyBmaXhlZCBoZWFkaW5nczogc3RhdGUgdGhlIHNjb3BlLCB0aGUgbW90aXZhdGlvbiwgYW5kIHRoZSB2ZXJpZmljYXRpb24gY29uY2lzZWx5LlxuLSBTdGFydCB0aGUgYm9keSB3aXRoIFxcYENsb3NlICM8bj5cXGAgb25seSB3aGVuIHRoZSBQUiByZXNvbHZlcyBhbiBleGlzdGluZyBpc3N1ZS5gO1xuXG4vKipcbiAqIEhvdyBhIHRvb2wgdGhhdCB3cml0ZXMgb3IgcmV3cml0ZXMgYSBQUiBib2R5IGZpbGxzIHRoZSBSZXF1aXJlbWVudHMgc2VjdGlvbiBvZlxuICogYFBVTExfUkVRVUVTVF9TRUNUSU9OU2AsIGFzIG1hcmtkb3duIGJ1bGxldHMgZm9yIGFuIGFnZW50J3MgaW5zdHJ1Y3Rpb25zLiBTa2lsbHMgdGhhdCBkcmFmdCBQUlxuICogYm9kaWVzIHJlbmRlciB0aGlzIHRleHQgaW5zdGVhZCBvZiByZXN0YXRpbmcgaXQsIHNvIHRoZSB3cml0ZXJzIGFuZCB0aGUgcmV2aWV3ZXJzIHRoYXQgcmVhZCB0aGVcbiAqIHNlY3Rpb24gYXMgdGhlIGJvdW5kYXJ5IGEgZml4IG11c3Qga2VlcCBuZXZlciBkaXNhZ3JlZSBvbiB3aGF0IGEgbGluZSBtZWFucy5cbiAqL1xuZXhwb3J0IGNvbnN0IFBVTExfUkVRVUVTVF9SRVFVSVJFTUVOVFNfUlVMRVMgPSBgLSBSZXF1aXJlbWVudHMgc2VjdGlvbjogb25lIGxpbmUgcGVyIHJlcXVpcmVtZW50LCB0YWtlbiBmcm9tIHRoZSByZXF1ZXN0ZXIncyBpbnN0cnVjdGlvbnMgYXMgdGhleSB3ZXJlIGdpdmVuICh0aGUgaXNzdWUsIHRoZSBjb252ZXJzYXRpb24gdGhhdCBhc2tlZCBmb3IgdGhlIGNoYW5nZSksIGVhY2ggbWFya2VkIFxcYHJlcXVpcmVkXFxgIChhc2tlZCBmb3IsIG9yIGFuIGV4aXN0aW5nIGNvbnRyYWN0IGNhbGxlcnMgZGVwZW5kIG9uKSBvciBcXGBjaG9zZW5cXGAgKHlvdXIgb3duIGRlY2lzaW9uLCB3aGljaCBhIHNpbXBsZXIgZGVzaWduIG1heSByZXBsYWNlKS4gTmV2ZXIgaW5mZXIgYSByZXF1aXJlbWVudCBmcm9tIHRoZSBkaWZmOiB3aGVuIG5vIGlzc3VlLCBQUiBtZXNzYWdlLCBvciBjb252ZXJzYXRpb24gc3RhdGVzIHRoZSByZXF1ZXN0LCB3cml0ZSBcXGByZXF1aXJlZDogbm90IHJlY29yZGVkIOKAlCBhc2sgdGhlIHJlcXVlc3RlclxcYCBhcyB0aGUgb25seSByZXF1ZXN0LWRlcml2ZWQgbGluZSAoYSBcXGByZXF1aXJlZFxcYCBsaW5lIGZvciBhbiBleGlzdGluZyBjb250cmFjdCBjYWxsZXJzIGRlcGVuZCBvbiBtYXkgc3RpbGwgYmUgbGlzdGVkKSBhbmQgc2F5IHNvIGluIE5vdGVzLlxuLSBSZWNvcmQgcnVsZTogYW4gZXhpc3RpbmcgUmVxdWlyZW1lbnRzIHNlY3Rpb24gaXMgYSByZWNvcmQsIG5vdCBhIGRlc2NyaXB0aW9uIG9mIHRoZSBkaWZmLiBLZWVwIGl0cyBcXGByZXF1aXJlZFxcYCBsaW5lcyBhcyB0aGV5IGFyZSwgcmV3cml0aW5nIHRoZW0gb25seSB3aGVuIHRoZSByZXF1ZXN0ZXIncyBpbnN0cnVjdGlvbnMgY2hhbmdlZCAodGhlbiBmcm9tIHRoZSB1cGRhdGVkIGluc3RydWN0aW9ucywgZHJvcHBpbmcgYSBsaW5lIG9ubHkgd2hlbiB0aGUgcmVxdWVzdGVyIHJlbW92ZWQgaXQ7IHdpdGggbm8gaW5zdHJ1Y3Rpb25zIGF2YWlsYWJsZSwga2VlcCB0aGVtIHVuY2hhbmdlZCk7IGFkZCBhIFxcYGNob3NlblxcYCBsaW5lIGZvciBhIG5ldyBkZWNpc2lvbiwgYW5kIHJlcGxhY2Ugb3IgcmVtb3ZlIG9uZSB3aGVuIHRoZSBkZWNpc2lvbiBpdCByZWNvcmRzIGNoYW5nZWQuIEEgc2VjdGlvbiB0aGF0IG1lcmVseSBkZXNjcmliZXMgdGhlIGltcGxlbWVudGF0aW9uLCBvciBob2xkcyBvbmx5IHRoZSB0ZW1wbGF0ZSdzIHBsYWNlaG9sZGVyIG9yIGEgXFxgcmVxdWlyZWQ6IG5vdCByZWNvcmRlZFxcYCBsaW5lLCBpcyBub3QgYSByZWNvcmQ6IHdyaXRlIGl0IGFmcmVzaCBieSB0aGUgcnVsZSBhYm92ZS5cbi0gUGxhY2UgdGhlIHNlY3Rpb24gd2hlcmUgdGhlIHRlbXBsYXRlIHB1dHMgaXQ7IHdoZW4gdGhlIHRlbXBsYXRlIGhhcyBubyBzdWNoIGhlYWRpbmcsIHJpZ2h0IGFmdGVyIHRoZSBpc3N1ZS1jbG9zaW5nIGxpbmUsIG9yIGF0IHRoZSB0b3Agb2YgdGhlIGJvZHkgd2hlbiB0aGVyZSBpcyBub25lLlxuLSBOZXZlciBkcm9wIG9yIHdlYWtlbiBhIFxcYHJlcXVpcmVkXFxgIGxpbmUgdG8gZml0IHdoYXQgd2FzIGltcGxlbWVudGVkOiB3aGVuIG9uZSBjYW5ub3QgaG9sZCBpbiB0aGUgZGlmZiwga2VlcCBpdCBhbmQgc2F5IHNvIGluIE5vdGVzLmA7XG5cbi8qKiBUaGUgY29tcGxldGUgcnVsZXMgZm9yIHdyaXRpbmcgYSBQUiBib2R5OiB0aGUgdGVtcGxhdGUgcnVsZXMgZm9sbG93ZWQgYnkgdGhlIFJlcXVpcmVtZW50cyBydWxlcy4gKi9cbmV4cG9ydCBjb25zdCBQVUxMX1JFUVVFU1RfQk9EWV9SVUxFUyA9IGAke1BVTExfUkVRVUVTVF9URU1QTEFURV9SVUxFU31cXG4ke1BVTExfUkVRVUVTVF9SRVFVSVJFTUVOVFNfUlVMRVN9YDtcblxuLyoqXG4gKiBIb3cgYSB0b29sIHRoYXQgY3JlYXRlcyBhbiBpc3N1ZSBkZXJpdmVzIGl0IGZyb20gdGhlIHJlcG9zaXRvcnkncyBpc3N1ZSB0ZW1wbGF0ZXMsIGFzIG1hcmtkb3duXG4gKiBidWxsZXRzIGZvciBhbiBhZ2VudCdzIGluc3RydWN0aW9uczsgc2hhcmVkIGJ5IHRoZSBzYW1lIHdyaXRlcnMgYXMgYFBVTExfUkVRVUVTVF9CT0RZX1JVTEVTYC5cbiAqIEd1aWRhbmNlIHRoZSB0ZW1wbGF0ZXMgc3RhdGUgaW4gdGhlaXIgb3duIHBsYWNlaG9sZGVyIGNvbW1lbnRzICh3aGljaCBzZWN0aW9ucyB0byBrZWVwLCBkZWxldGluZ1xuICogdGhlIGNvbW1lbnRzKSBpcyBkZWxpYmVyYXRlbHkgbm90IHJlcGVhdGVkIGhlcmUsIHNpbmNlIHRoZSB3cml0ZXIgcmVhZHMgdGhlIHRlbXBsYXRlIGFueXdheS5cbiAqL1xuZXhwb3J0IGNvbnN0IElTU1VFX1RFTVBMQVRFX1JVTEVTID0gYC0gRm9sbG93IHRoZSBjbG9zZXN0IHRlbXBsYXRlIHVuZGVyIFxcYC5naXRodWIvSVNTVUVfVEVNUExBVEUvXFxgOiBcXGBidWcubWRcXGAgZm9yIHdyb25nIGJlaGF2aW9yLCBcXGBjaGFuZ2UubWRcXGAgZm9yIGFueXRoaW5nIHRvIGJ1aWxkIG9yIGFsdGVyOyBhIHF1ZXN0aW9uIG9yIG5vdGUgZml0dGluZyBuZWl0aGVyLCBvciBhIHJlcG9zaXRvcnkgd2l0aG91dCB0ZW1wbGF0ZXMsIG5lZWRzIG5vIHRlbXBsYXRlLlxuLSBUaXRsZTogYSBDb252ZW50aW9uYWwgQ29tbWl0cyBwcmVmaXggZm9yIHRoZSB0eXBlIHRoYXQgZml0cyB0aGUgY2hhbmdlIChcXGBmZWF0OlxcYCwgXFxgZml4OlxcYCwgXFxgcmVmYWN0b3I6XFxgLCBcXGBkb2NzOlxcYCwgXFxgY2hvcmU6XFxgLCAuLi4pOyB3aGVuIGl0IGRpZmZlcnMgZnJvbSB0aGUgdGVtcGxhdGUncyBcXGB0aXRsZVxcYCBwcmVmaXgsIHJlcGxhY2UgdGhlIHRlbXBsYXRlJ3MgdHlwZSBsYWJlbCAoXFxgdDogLi4uXFxgKSB3aXRoIHRoZSBvbmUgbWF0Y2hpbmcgdGhlIHR5cGUuXG4tIFRoZSBZQU1MIGZyb250IG1hdHRlciBiZXR3ZWVuIHRoZSBcXGAtLS1cXGAgbGluZXMgaXMgbWV0YWRhdGEsIG5vdCBib2R5IHRleHQ6IHBhc3MgaXRzIFxcYGxhYmVsc1xcYCB2aWEgXFxgLS1sYWJlbFxcYCBhbmQgc3VibWl0IG9ubHkgdGhlIGNvbnRlbnQgYmVsb3cgdGhlIGNsb3NpbmcgXFxgLS0tXFxgIGFzIHRoZSBib2R5LmA7XG5cbi8qKiBTZWN0aW9ucyBvZiBhIGJ1ZyByZXBvcnQsIGluIHRoZSBvcmRlciB0aGV5IGFwcGVhciBpbiB0aGUgaXNzdWUgdGVtcGxhdGUuICovXG5leHBvcnQgY29uc3QgQlVHX0lTU1VFX1NFQ1RJT05TOiByZWFkb25seSBUZW1wbGF0ZVNlY3Rpb25bXSA9IFtcbiAgeyBoZWFkaW5nOiAnUHJvYmxlbScsIHJlcXVpcmVtZW50OiAnd2hhdCBoYXBwZW5zLCBhbmQgd2hhdCBzaG91bGQgaGFwcGVuIGluc3RlYWQnIH0sXG4gIHsgaGVhZGluZzogJ0V2aWRlbmNlJywgcmVxdWlyZW1lbnQ6ICdyZXByb2R1Y3Rpb24gc3RlcHMsIGxvZ3MsIHJ1biBJRHMsIG9yIGxpbmtzJyB9LFxuICB7IGhlYWRpbmc6ICdJbXBhY3QnLCByZXF1aXJlbWVudDogJ3dobyBvciB3aGF0IGlzIGFmZmVjdGVkLCBhbmQgaG93IGJhZGx5JyB9LFxuICB7IGhlYWRpbmc6ICdQcm9wb3NhbCcsIHJlcXVpcmVtZW50OiAndGhlIGZpeCB5b3UgaGF2ZSBpbiBtaW5kLCBhbmQgdGhlIHJvb3QgY2F1c2UgaWYga25vd24nIH0sXG5dO1xuXG4vKipcbiAqIFNlY3Rpb25zIGEgY2hhbmdlIHNwZWNpZmljYXRpb24gbXVzdCBzZXR0bGUgYmVmb3JlIGEgdGhpcmQgcGFydHkgY2FuIGltcGxlbWVudCBpdCwgZGVmaW5lZFxuICogb25jZSBzbyB0aGF0IHRoZSBpc3N1ZSB0ZW1wbGF0ZSBhbmQgYW55IHRvb2wgdGhhdCBkcmFmdHMgb3IgcmV2aWV3cyBzcGVjaWZpY2F0aW9ucyBhZ2FpbnN0XG4gKiB0aGVzZSBzZWN0aW9ucyBjYW5ub3QgZHJpZnQgYXBhcnQ7IGNoZWNrbGlzdCBjb25zdW1lcnMgcmVuZGVyIGl0IHdpdGggYHJlbmRlclNlY3Rpb25DaGVja2xpc3RgLlxuICogVGhlIGZpcnN0IHRocmVlIHNlY3Rpb25zIHN1ZmZpY2UgZm9yIGEgc21hbGwgY2hhbmdlLCBzbyB0aGV5IGNvbWUgZmlyc3QuXG4gKi9cbmV4cG9ydCBjb25zdCBDSEFOR0VfSVNTVUVfU0VDVElPTlM6IHJlYWRvbmx5IFRlbXBsYXRlU2VjdGlvbltdID0gW1xuICB7XG4gICAgaGVhZGluZzogJ0JhY2tncm91bmQgYW5kIGdvYWwnLFxuICAgIHJlcXVpcmVtZW50OiAndGhlIHByb2JsZW0gYmVpbmcgc29sdmVkLCBmb3Igd2hvbSwgYW5kIHdoYXQgb3V0Y29tZSBjb3VudHMgYXMgc3VjY2VzcycsXG4gIH0sXG4gIHtcbiAgICBoZWFkaW5nOiAnQmVoYXZpb3InLFxuICAgIHJlcXVpcmVtZW50OlxuICAgICAgJ2V2ZXJ5IHVzZXItIG9yIGNhbGxlci1vYnNlcnZhYmxlIGJlaGF2aW9yLCBpbmNsdWRpbmcgaW5wdXRzLCBvdXRwdXRzLCBlcnJvciBjYXNlcywgZWRnZSBjYXNlcywgYW5kIGludGVyYWN0aW9ucyB3aXRoIGV4aXN0aW5nIGJlaGF2aW9yLCBzdGF0ZWQgcHJlY2lzZWx5IGVub3VnaCB0aGF0IHR3byBpbXBsZW1lbnRlcnMgd291bGQgYnVpbGQgdGhlIHNhbWUgdGhpbmcnLFxuICB9LFxuICB7XG4gICAgaGVhZGluZzogJ0FjY2VwdGFuY2UgY3JpdGVyaWEnLFxuICAgIHJlcXVpcmVtZW50OlxuICAgICAgJ2NoZWNrYWJsZSBjb25kaXRpb25zIChHaXZlbi9XaGVuL1RoZW4gb3IgYW4gZXF1aXZhbGVudCkgdGhhdCBkZWNpZGUgd2hldGhlciB0aGUgaW1wbGVtZW50YXRpb24gaXMgZG9uZScsXG4gIH0sXG4gIHtcbiAgICBoZWFkaW5nOiAnU2NvcGUgYW5kIG5vbi1nb2FscycsXG4gICAgcmVxdWlyZW1lbnQ6ICd3aGF0IHRoZSBjaGFuZ2UgY292ZXJzIGFuZCB3aGF0IGl0IGRlbGliZXJhdGVseSBsZWF2ZXMgb3V0LCBzbyBhbiBpbXBsZW1lbnRlciBrbm93cyB3aGVyZSB0byBzdG9wJyxcbiAgfSxcbiAge1xuICAgIGhlYWRpbmc6ICdEZXNpZ24gY29uc3RyYWludHMnLFxuICAgIHJlcXVpcmVtZW50OlxuICAgICAgJ3RoZSBkYXRhLCBBUEksIHNjaGVtYSwgVUksIGFuZCBjb25maWd1cmF0aW9uIGNoYW5nZXMsIG5hbWluZywgYW5kIHRoZSBleGlzdGluZyBjb2RlIG9yIGNvbnZlbnRpb25zIHRoZSBpbXBsZW1lbnRhdGlvbiBtdXN0IGZpdCDigJQgYXMgZmFyIGFzIHRoZSB3cml0ZXIgaW50ZW5kcyB0byBjb25zdHJhaW4gdGhlbSwgd2l0aCBldmVyeXRoaW5nIGVsc2UgZXhwbGljaXRseSBsZWZ0IHRvIHRoZSBpbXBsZW1lbnRlcicsXG4gIH0sXG4gIHtcbiAgICBoZWFkaW5nOiAnQ29tcGF0aWJpbGl0eSBhbmQgbWlncmF0aW9uJyxcbiAgICByZXF1aXJlbWVudDogJ3doYXQgZXhpc3RpbmcgZGF0YSwgdXNlcnMsIGNhbGxlcnMsIG9yIGNvbmZpZ3VyYXRpb25zIGFyZSBhZmZlY3RlZCBhbmQgaG93IHRoZSB0cmFuc2l0aW9uIGhhcHBlbnMnLFxuICB9LFxuICB7XG4gICAgaGVhZGluZzogJ1ZlcmlmaWNhdGlvbicsXG4gICAgcmVxdWlyZW1lbnQ6ICdob3cgdGhlIGNoYW5nZSBpcyB0ZXN0ZWQgb3IgZGVtb25zdHJhdGVkLCBpbmNsdWRpbmcgd2hhdCBuZWVkcyBubyB0ZXN0IGFuZCB3aHknLFxuICB9LFxuICB7XG4gICAgaGVhZGluZzogJ09wZW4gcXVlc3Rpb25zJyxcbiAgICByZXF1aXJlbWVudDogJ3VuZGVjaWRlZCBwb2ludHMsIGVhY2ggd2l0aCBpdHMgb3B0aW9uczsgZW1wdHkgb25jZSB0aGUgc3BlY2lmaWNhdGlvbiBpcyBpbXBsZW1lbnRhYmxlJyxcbiAgfSxcbl07XG5cbi8qKiBSZW5kZXJzIHNlY3Rpb25zIGFzIG1hcmtkb3duIGJ1bGxldHMgKGAtICoqSGVhZGluZyoqOiByZXF1aXJlbWVudGApLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlbmRlclNlY3Rpb25DaGVja2xpc3Qoc2VjdGlvbnM6IHJlYWRvbmx5IFRlbXBsYXRlU2VjdGlvbltdKTogc3RyaW5nIHtcbiAgcmV0dXJuIHNlY3Rpb25zLm1hcCgoc2VjdGlvbikgPT4gYC0gKioke3NlY3Rpb24uaGVhZGluZ30qKjogJHtzZWN0aW9uLnJlcXVpcmVtZW50fWApLmpvaW4oJ1xcbicpO1xufVxuXG4vKiogUmVuZGVycyBzZWN0aW9ucyBhcyBtYXJrZG93biBoZWFkaW5ncywgZWFjaCBmb2xsb3dlZCBieSBpdHMgcmVxdWlyZW1lbnQgYXMgYSBwbGFjZWhvbGRlciBjb21tZW50LiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlbmRlclNlY3Rpb25UZW1wbGF0ZShzZWN0aW9uczogcmVhZG9ubHkgVGVtcGxhdGVTZWN0aW9uW10pOiBzdHJpbmcge1xuICByZXR1cm4gc2VjdGlvbnNcbiAgICAubWFwKFxuICAgICAgKHNlY3Rpb24pID0+XG4gICAgICAgIGAjIyAke3NlY3Rpb24uaGVhZGluZ31cXG5cXG48IS0tICR7c2VjdGlvbi5yZXF1aXJlbWVudC5jaGFyQXQoMCkudG9VcHBlckNhc2UoKX0ke3NlY3Rpb24ucmVxdWlyZW1lbnQuc2xpY2UoMSl9LiAtLT5gXG4gICAgKVxuICAgIC5qb2luKCdcXG5cXG4nKTtcbn1cbiIsImV4cG9ydCBhc3luYyBmdW5jdGlvbiBzbGVlcChtaWxsaXNlY29uZHM6IG51bWJlcik6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHNldFRpbWVvdXQocmVzb2x2ZSwgbWlsbGlzZWNvbmRzKSk7XG59XG4iLCJpbXBvcnQgeyBzbGVlcCB9IGZyb20gJy4vc2xlZXAuanMnO1xuXG4vKipcbiAqIENvbnZlcnQgYW4gb2JqZWN0IHRvIGFuIGVycm9yLlxuICogQHBhcmFtIG9iaiBUaGUgb2JqZWN0IHRvIGNvbnZlcnQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBlcnJvcmlmeShvYmo6IHVua25vd24pOiBFcnJvciB7XG4gIGlmIChvYmogaW5zdGFuY2VvZiBFcnJvcikgcmV0dXJuIG9iajtcbiAgaWYgKHR5cGVvZiBvYmogPT09ICdzdHJpbmcnKSByZXR1cm4gbmV3IEVycm9yKG9iaik7XG4gIC8vIGBKU09OLnN0cmluZ2lmeWAgYW5zd2VycyBgdW5kZWZpbmVkYCBmb3IgYHVuZGVmaW5lZGAsIGEgc3ltYm9sIGFuZCBhIGZ1bmN0aW9uLCBhbmQgdGhyb3dzXG4gIC8vIG9uIGEgYmlnaW50IG9yIGEgY3ljbGU7IGBuZXcgRXJyb3IodW5kZWZpbmVkKWAgaGFzIGFuIGVtcHR5IG1lc3NhZ2UsIHdoaWNoIHdvdWxkIGRyb3AgdGhlXG4gIC8vIG9ubHkgZGlhZ25vc3RpYyBhIGNhbGxlciBoYXMgYWJvdXQgc3VjaCBhIHRocm93biB2YWx1ZS4gTmVpdGhlciByZXByZXNlbnRhdGlvbiBtYXkgdGhyb3dcbiAgLy8gb3V0IG9mIGhlcmU6IHRoaXMgcnVucyBpbiBhIGNhdGNoIGJsb2NrLCB3aGVyZSBpdCB3b3VsZCByZXBsYWNlIHRoZSBlcnJvciBpdCBjb252ZXJ0cy5cbiAgcmV0dXJuIG5ldyBFcnJvcihpZ25vcmVFcnJvcigoKSA9PiBKU09OLnN0cmluZ2lmeShvYmopKSA/PyBpZ25vcmVFcnJvcigoKSA9PiBTdHJpbmcob2JqKSkpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaWdub3JlRXJyb3I8VD4oZm46ICgpID0+IFQpOiBUIHwgdW5kZWZpbmVkIHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gZm4oKTtcbiAgfSBjYXRjaCB7XG4gICAgLy8gZG8gbm90aGluZ1xuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpZ25vcmVFbm9lbnQ8VD4oZm46ICgpID0+IFQpOiBUIHwgdW5kZWZpbmVkIHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gZm4oKTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBpZiAodHlwZW9mIGVycm9yID09PSAnb2JqZWN0JyAmJiBlcnJvciAmJiAnY29kZScgaW4gZXJyb3IgJiYgZXJyb3IuY29kZSA9PT0gJ0VOT0VOVCcpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhyb3cgZXJyb3I7XG4gIH1cbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGlnbm9yZUVycm9yQXN5bmM8VD4oZm46ICgpID0+IFByb21pc2U8VD4pOiBQcm9taXNlPFQgfCB1bmRlZmluZWQ+IHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gYXdhaXQgZm4oKTtcbiAgfSBjYXRjaCB7XG4gICAgLy8gZG8gbm90aGluZ1xuICB9XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBpZ25vcmVFbm9lbnRBc3luYzxUPihmbjogKCkgPT4gUHJvbWlzZTxUPik6IFByb21pc2U8VCB8IHVuZGVmaW5lZD4ge1xuICB0cnkge1xuICAgIHJldHVybiBhd2FpdCBmbigpO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGlmICh0eXBlb2YgZXJyb3IgPT09ICdvYmplY3QnICYmIGVycm9yICYmICdjb2RlJyBpbiBlcnJvciAmJiBlcnJvci5jb2RlID09PSAnRU5PRU5UJykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aHJvdyBlcnJvcjtcbiAgfVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIFJldHJ5T3B0aW9ucyB7XG4gIGJlZm9yZVJldHJ5PzogKGVycm9yOiB1bmtub3duKSA9PiBQcm9taXNlPHZvaWQ+O1xuICBoYW5kbGVFcnJvcj86IChlcnJvcjogdW5rbm93bikgPT4gUHJvbWlzZTx2b2lkPjtcbiAgLyoqXG4gICAqIFRoZSBtYXhpbXVtIG51bWJlciBvZiB0b3RhbCBhdHRlbXB0cywgaW5jbHVkaW5nIHRoZSBpbml0aWFsIGF0dGVtcHQuXG4gICAqIEZvciBleGFtcGxlLCBgcmV0cnlDb3VudDogM2AgcnVucyB0aGUgZnVuY3Rpb24gYXQgbW9zdCAzIHRpbWVzOiAxIGluaXRpYWwgYXR0ZW1wdCBhbmQgdXAgdG8gMiByZXRyaWVzLlxuICAgKi9cbiAgcmV0cnlDb3VudD86IG51bWJlcjtcbiAgcmV0cnlMb2dnZXI/OiAobWVzc2FnZTogc3RyaW5nKSA9PiB2b2lkO1xuICBzaG91bGRSZXRyeT86IChlcnJvcjogdW5rbm93bikgPT4gYm9vbGVhbjtcbiAgc2xlZXBNaWxsaXNlY29uZHM/OiBudW1iZXI7XG4gIHVwZGF0ZVNsZWVwTWlsbGlzZWNvbmRzPzogKHNsZWVwTWlsbGlzZWNvbmRzOiBudW1iZXIpID0+IG51bWJlcjtcbn1cblxuLyoqXG4gKiBSZXRyeSB0aGUgZ2l2ZW4gZnVuY3Rpb24uXG4gKiBAcGFyYW0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gcmV0cnkuXG4gKiBAcGFyYW0gYmVmb3JlUmV0cnkgVGhlIGZ1bmN0aW9uIHRvIGNhbGwgaW1tZWRpYXRlbHkgYmVmb3JlIHJldHJ5aW5nLlxuICogQHBhcmFtIGhhbmRsZUVycm9yIFRoZSBmdW5jdGlvbiB0byBjYWxsIHdoZW4gYW4gZXJyb3Igb2NjdXJzLlxuICogQHBhcmFtIHJldHJ5Q291bnQgVGhlIG1heGltdW0gbnVtYmVyIG9mIHRvdGFsIGF0dGVtcHRzLCBpbmNsdWRpbmcgdGhlIGluaXRpYWwgYXR0ZW1wdC5cbiAqIEBwYXJhbSByZXRyeUxvZ2dlciBUaGUgZnVuY3Rpb24gdG8gbG9nIHJldHJ5aW5nLlxuICogQHBhcmFtIHNsZWVwTWlsbGlzZWNvbmRzIFRoZSBudW1iZXIgb2YgbWlsbGlzZWNvbmRzIHRvIHNsZWVwIGJlZm9yZSByZXRyeWluZy5cbiAqIEBwYXJhbSB1cGRhdGVTbGVlcE1pbGxpc2Vjb25kcyBUaGUgZnVuY3Rpb24gdG8gdXBkYXRlIHNsZWVwIG1pbGxpc2Vjb25kcyBhZnRlciBlYWNoIHJldHJ5LlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gd2l0aFJldHJ5PFQ+KFxuICBmdW5jOiAoZmFpbGVkQ291bnQ6IG51bWJlcikgPT4gVCB8IFByb21pc2U8VD4sXG4gIHtcbiAgICBiZWZvcmVSZXRyeSxcbiAgICBoYW5kbGVFcnJvcixcbiAgICByZXRyeUNvdW50ID0gMyxcbiAgICByZXRyeUxvZ2dlcixcbiAgICBzaG91bGRSZXRyeSxcbiAgICBzbGVlcE1pbGxpc2Vjb25kcyA9IDAsXG4gICAgdXBkYXRlU2xlZXBNaWxsaXNlY29uZHMsXG4gIH06IFJldHJ5T3B0aW9ucyA9IHt9XG4pOiBQcm9taXNlPFQ+IHtcbiAgbGV0IGZhaWxlZENvdW50ID0gMDtcbiAgZm9yICg7Oykge1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gYXdhaXQgZnVuYyhmYWlsZWRDb3VudCk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGF3YWl0IGhhbmRsZUVycm9yPy4oZXJyb3IpO1xuICAgICAgZmFpbGVkQ291bnQrKztcbiAgICAgIGlmIChmYWlsZWRDb3VudCA+PSByZXRyeUNvdW50KSB7XG4gICAgICAgIHRocm93IGVycm9yO1xuICAgICAgfVxuICAgICAgaWYgKHNob3VsZFJldHJ5ICYmICFzaG91bGRSZXRyeShlcnJvcikpIHtcbiAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICB9XG4gICAgICBpZiAoc2xlZXBNaWxsaXNlY29uZHMgPiAwKSB7XG4gICAgICAgIGF3YWl0IHNsZWVwKHNsZWVwTWlsbGlzZWNvbmRzKTtcbiAgICAgIH1cbiAgICAgIGlmICh1cGRhdGVTbGVlcE1pbGxpc2Vjb25kcykge1xuICAgICAgICBzbGVlcE1pbGxpc2Vjb25kcyA9IHVwZGF0ZVNsZWVwTWlsbGlzZWNvbmRzKHNsZWVwTWlsbGlzZWNvbmRzKTtcbiAgICAgIH1cbiAgICAgIHJldHJ5TG9nZ2VyPy4oYFJldHJ5IGR1ZSB0bzogJHtlcnJvcn1cbiR7ZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/ICctLS1cXG4nICsgKGVycm9yLnN0YWNrID8/ICcnKSA6ICcnfWApO1xuICAgICAgYXdhaXQgYmVmb3JlUmV0cnk/LihlcnJvcik7XG4gICAgfVxuICB9XG59XG4iLCIvKiogRXNjYXBlcyBldmVyeSBSZWdFeHAgbWV0YWNoYXJhY3RlciBzbyB0aGUgdGV4dCBtYXRjaGVzIGl0c2VsZiBsaXRlcmFsbHkuICovXG5leHBvcnQgZnVuY3Rpb24gZXNjYXBlUmVnRXhwKHRleHQ6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiB0ZXh0LnJlcGxhY2VBbGwoL1skKCkqKy4/W1xcXFxcXF1ee3x9XS9ndSwgU3RyaW5nLnJhd2BcXCQmYCk7XG59XG5cbi8qKiBBIFBPU0lYIHNoZWxsIHdvcmQ6IHNhZmUgY2hhcmFjdGVycyBwYXNzIHRocm91Z2gsIGFueXRoaW5nIGVsc2UgaXMgc2luZ2xlLXF1b3RlZC4gKi9cbmV4cG9ydCBmdW5jdGlvbiBxdW90ZUZvclNoZWxsKHZhbHVlOiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gL15bXFx3Li8tXSskL3UudGVzdCh2YWx1ZSkgPyB2YWx1ZSA6IGAnJHt2YWx1ZS5yZXBsYWNlQWxsKFwiJ1wiLCBTdHJpbmcucmF3YCdcXCcnYCl9J2A7XG59XG4iLCIvKipcbiAqIFdoZW4gdG8gd3JpdGUgYSB0ZXN0IGFuZCB3aGF0IGEgdGVzdCBtYXkgYXNzZXJ0LCBhcyBtYXJrZG93biBidWxsZXRzIGZvciBhbiBhZ2VudCdzIGluc3RydWN0aW9ucy5cbiAqIFN0YXRlZCBvbmNlIGhlcmUgYW5kIHJlbmRlcmVkIGJ5IHRoZSBnZW5lcmF0ZWQgYWdlbnQgaW5zdHJ1Y3Rpb25zIGFuZCB0aGUgdGVzdGluZyBza2lsbCBzbyB0aGVcbiAqIHR3byBjYW5ub3QgZHJpZnQgYXBhcnQuXG4gKi9cbmV4cG9ydCBjb25zdCBURVNUX1dSSVRJTkdfUlVMRVMgPSBgLSBXcml0ZSBhIHRlc3Qgb25seSB3aGVuIGV4cGxpY2l0bHkgcmVxdWVzdGVkLCBvciB3aGVuIGEgYmVoYXZpb3IgaXMgbGlrZWx5IHRvIHJlZ3Jlc3MgYW5kIG5vIGV4aXN0aW5nIGF1dG9tYXRpYyBjaGVjayAodHlwZSBjaGVja2luZywgbGludGluZywgYW4gZXhpc3RpbmcgdGVzdCBvciBDSSBjaGVjaykgd291bGQgY2F0Y2ggdGhlIGJyZWFrYWdlLiBOZXZlciBhZGQgYSB0ZXN0IHRoYXQgbWVyZWx5IHJlc3RhdGVzIGEgbWFwcGluZyBmcm9tIGNvbmRpdGlvbnMgdG8gY29uc3RhbnQgb3V0cHV0cyAoaXQgZmFpbHMgb25seSBvbiBpbnRlbnRpb25hbCBlZGl0cykgb3IgdGhhdCBvbmx5IGNvbmZpcm1zIGFuIGV4dGVybmFsIGZhY3QgKGEgbGlicmFyeSdzIGJlaGF2aW9yLCB3aGV0aGVyIGEgdmVyc2lvbiBmaXhlcyBhbiBpc3N1ZSk7IHZlcmlmeSB0aG9zZSBvbmNlIG1hbnVhbGx5LlxuLSBUZXN0IGV4dGVybmFsbHkgb2JzZXJ2YWJsZSBiZWhhdmlvciAoZS5nLiwgZW1pdHRlZCBmaWxlcywgQ0xJIG91dHB1dCwgcmVuZGVyZWQgcmVzdWx0cykgYXQgdGhlIHN5c3RlbSBib3VuZGFyeSwgbm90IGltcGxlbWVudGF0aW9uIGRldGFpbHM6IGRvIG5vdCBtaXJyb3IgcHJvZHVjdGlvbiBsb2dpYywgYXNzZXJ0IHRoYXQgYSBicmFuY2ggaXMgdGFrZW4sIG9yIGZlZWQgaGFuZC1hc3NlbWJsZWQgaW50ZXJuYWwgb2JqZWN0cyB0byBpbnRlcm5hbCBmdW5jdGlvbnMuXG4tIFByZWZlciBhY3R1YWwgQVBJIGNhbGxzIG92ZXIgbW9ja3MsIHVubGVzcyBhY3R1YWwgY2FsbHMgYXJlIGltcHJhY3RpY2FsLCBoYXZlIHVuaW50ZW5kZWQgc2lkZSBlZmZlY3RzLCBvciBtb2NrcyBhcmUgZXhwbGljaXRseSByZXF1ZXN0ZWQuXG4tIEVuc3VyZSB0ZXN0cyBhcmUgaWRlbXBvdGVudCBhbmQgaW5kZXBlbmRlbnQgKGUuZy4sIHJlc2V0IHBlcnNpc3RlbnQgZGF0YSkgc28gdGhleSBjYW4gcnVuIHJlcGVhdGVkbHkgb3IgaW4gcGFyYWxsZWwuXG4tIEF2b2lkIGZpeGVkIHdhaXRzIGluIEUyRSB0ZXN0czsgd2FpdCBmb3IgY29uZGl0aW9ucyBpbnN0ZWFkLmA7XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgZmcgZnJvbSAnZmFzdC1nbG9iJztcblxuLyoqIFRoZSBgd29ya3NwYWNlc2AgZmllbGQgb2YgYSByb290IHBhY2thZ2UuanNvbjogdGhlIGFycmF5IGZvcm0gb3IgWWFybiB2MSdzIG9iamVjdCBmb3JtLiAqL1xuZXhwb3J0IHR5cGUgV29ya3NwYWNlc0RlY2xhcmF0aW9uID0gc3RyaW5nW10gfCB7IHBhY2thZ2VzPzogc3RyaW5nW10gfSB8IHVuZGVmaW5lZDtcblxuLyoqXG4gKiBFdmVyeSB3b3Jrc3BhY2UgcGFja2FnZS5qc29uIHBhdGggKHJlbGF0aXZlIHRvIHRoZSBtb25vcmVwbyByb290LCBzb3J0ZWQpIHRoYXQgQnVuIHdvdWxkIGxpbmtcbiAqIGZvciB0aGUgZ2l2ZW4gcm9vdCBwYWNrYWdlLmpzb24gYHdvcmtzcGFjZXNgIGRlY2xhcmF0aW9uLiBDYW5vbmljYWxpemVzIHRoZSBkZWNsYXJlZCBwYXR0ZXJuc1xuICogKHNlZSBnZXRNZWFuaW5nZnVsRGVjbGFyZWRXb3Jrc3BhY2VQYXR0ZXJucyksIGRyb3BzIHBhdHRlcm5zIGVzY2FwaW5nIHRoZSByZXBvc2l0b3J5IChzZWVcbiAqIGlzSW5SZXBvc2l0b3J5V29ya3NwYWNlUGF0dGVybiksIGFuZCByZXNvbHZlcyB0aGUgcmVzdCB3aXRoIEJ1bidzIHNlcXVlbnRpYWwgc2VtYW50aWNzIChzZWVcbiAqIHJlc29sdmVXb3Jrc3BhY2VQYWNrYWdlSnNvblBhdGhzKS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlc29sdmVCdW5Xb3Jrc3BhY2VQYWNrYWdlSnNvblBhdGhzKHdvcmtzcGFjZXM6IFdvcmtzcGFjZXNEZWNsYXJhdGlvbiwgcm9vdERpclBhdGg6IHN0cmluZyk6IHN0cmluZ1tdIHtcbiAgcmV0dXJuIHJlc29sdmVXb3Jrc3BhY2VQYWNrYWdlSnNvblBhdGhzKFxuICAgIGdldE1lYW5pbmdmdWxEZWNsYXJlZFdvcmtzcGFjZVBhdHRlcm5zKHdvcmtzcGFjZXMpLmZpbHRlcigod29ya3NwYWNlUGF0dGVybikgPT5cbiAgICAgIGlzSW5SZXBvc2l0b3J5V29ya3NwYWNlUGF0dGVybih3b3Jrc3BhY2VQYXR0ZXJuKVxuICAgICksXG4gICAgcm9vdERpclBhdGhcbiAgKTtcbn1cblxuLyoqXG4gKiBSZXNvbHZlcyB3b3Jrc3BhY2UgcGF0dGVybnMgdG8gcGFja2FnZS5qc29uIHBhdGhzIG1pbWlja2luZyBCdW4ncyBTRVFVRU5USUFMIGV2YWx1YXRpb24sXG4gKiBkZXJpdmVkIGVtcGlyaWNhbGx5IHdpdGggQnVuIDEuMy4xNCAoZml4dHVyZSByZXBvcyBvYnNlcnZlZCB2aWEgYGJ1biBpbnN0YWxsIC0tbG9ja2ZpbGUtb25seWA7XG4gKiBXaWxsQm9vc3Rlci9zaGFyZWQjMTAwNCAvIFdpbGxCb29zdGVyL3NoYXJlZCMxMDA1KTpcbiAqIDEuIFBhdHRlcm5zIGFyZSBldmFsdWF0ZWQgaW4gZGVjbGFyYXRpb24gb3JkZXIgaW50byBhbiBhY2N1bXVsYXRpbmcgc2V0OiBhIHBvc2l0aXZlIGdsb2JcbiAqICAgIHBhdHRlcm4gYWRkcyBldmVyeSBwYWNrYWdlLmpzb24gaXQgbWF0Y2hlczsgYSBuZWdhdGlvbiBkZWxldGVzIGl0cyBtYXRjaGVzIGZyb20gdGhlIHNldFxuICogICAgYWNjdW11bGF0ZWQgU08gRkFSLCBzbyBhIGxhdGVyIHBvc2l0aXZlIHJlLWFkZHMgdGhlbSAoYFtcIiFhcHBzL2V4Y2x1ZGVkXCIsIFwiYXBwcy8qXCJdYCBsaW5rc1xuICogICAgYXBwcy9leGNsdWRlZCwgd2hpbGUgYFtcImFwcHMvKlwiLCBcIiFhcHBzL2V4Y2x1ZGVkXCJdYCBkb2VzIG5vdCkuXG4gKiAyLiBBIG5lZ2F0aW9uIHdob3NlIG5vcm1hbGl6ZWQgYm9keSBoYXMgRVhBQ1RMWSB0d28gc2VnbWVudHMsIHdob3NlIGxhc3Qgc2VnbWVudCBpcyBhIHN0YXItcnVuXG4gKiAgICAoYCpgLCBgKipgLCBgKioqYCwg4oCmKSwgYW5kIHdob3NlIGZpcnN0IHNlZ21lbnQgaXMgTk9UIGl0c2VsZiBhIHN0YXItcnVuIGZpcnN0IHNlZWRzIHRoZVxuICogICAgaW1wbGljaXQgYmFzZWxpbmUgaW50byB0aGUgc2V0LCB0aGVuIGRlbGV0ZXMgaXRzIG93biBtYXRjaGVzOiBhIGAqKmAgbGFzdCBzZWdtZW50IHNlZWRzXG4gKiAgICBgKipgIChwYWNrYWdlcyBhdCBhbnkgZGVwdGgpLCBhbnkgb3RoZXIgc3Rhci1ydW4gc2VlZHMgYCpcXC8qYCAoZGVwdGggMiBvbmx5KS4gU2VlZGluZ1xuICogICAgaGFwcGVucyBldmVuIGFsb25nc2lkZSBwb3NpdGl2ZSBwYXR0ZXJucyAoYFtcImFwcHMvKlwiLCBcIiFvdGhlci8qXCJdYCBsaW5rcyBldmVyeSBkZXB0aC0yXG4gKiAgICBwYWNrYWdlIG91dHNpZGUgb3RoZXIvKS4gTm8gb3RoZXIgbmVnYXRpb24gc2hhcGUgc2VlZHM6IGAhKmAsIGAhKipgLCBgISpcXC8qYCwgYCEqXFwvKipgLFxuICogICAgYCEqKlxcLypgLCBgIWEvYi8qYCwgYCFhL2IvKipgLCBgIWRpcmAsIGFuZCBgIWRpci8qeGAgZWFjaCBsaW5rIG5vdGhpbmcgb24gdGhlaXIgb3duLlxuICogICAgYD9gLCBicmFjZSwgYW5kIGNoYXJhY3Rlci1jbGFzcyBsYXN0IHNlZ21lbnRzIGJlaGF2ZSBFUlJBVElDQUxMWSAoYFtcIiFvdGhlci8/XCJdYCBsaW5rc1xuICogICAgcGFja2FnZXMvYSB5ZXQgbm90IHRoZSBlcXVhbGx5IGJhc2VsaW5lLXNoYXBlZCBvdGhlci95eSwgYFtcIiFvdGhlci8/P1wiXWAgbGlua3Mgbm90aGluZywgYW5kXG4gKiAgICBgW1wiIT8vP1wiXWAgbGlua3MgdGhlIHZlcnkgb3RoZXIveCBpdCBtYXRjaGVzKSwgc28gbm8gY29uc2lzdGVudCBydWxlIGNhbiBtb2RlbCB0aGVtOyB0aGV5XG4gKiAgICBhcmUgZGVsaWJlcmF0ZWx5IHRyZWF0ZWQgYXMgbm90IHNlZWRpbmcg4oCUIHNlZSBoYXNJbXBsaWNpdFdvcmtzcGFjZUJhc2VsaW5lIGFuZCAjMTAwNS5cbiAqIDMuIEEgbm9uLWdsb2IgcG9zaXRpdmUgcGF0dGVybiBQSU5TIGl0cyBkaXJlY3Rvcnk6IGl0IHN0YXlzIGEgd29ya3NwYWNlIHJlZ2FyZGxlc3Mgb2Ygd2hlcmUgYVxuICogICAgbWF0Y2hpbmcgbmVnYXRpb24gYXBwZWFycyAoYFtcIm90aGVyL3hcIiwgXCIhb3RoZXIveFwiXWAgYW5kIGBbXCIhb3RoZXIveFwiLCBcIm90aGVyL3hcIl1gIGJvdGhcbiAqICAgIGxpbmsgb3RoZXIveCkuXG4gKiA0LiBgKipgIG1hdGNoZXMgemVybyBvciBtb3JlIHBhdGggc2VnbWVudHMgKGBbXCJhcHBzLyoqXCJdYCBsaW5rcyB0aGUgcGFja2FnZSBhdCBhcHBzIGl0c2VsZiwgYW5kXG4gKiAgICBgIWFwcHMvKipgIGRlbGV0ZXMgaXQpLCBtYXRjaGluZyBmYXN0LWdsb2IncyBmaWxlLWdsb2Igc2VtYW50aWNzLlxuICogRG8gbm90IGFwcGx5IGdsb2JJZ25vcmUgaGVyZTogd29ya3NwYWNlIG1lbWJlcnNoaXAgaXMgZGVmaW5lZCBzb2xlbHkgYnkgdGhlIGRlY2xhcmVkIHBhdHRlcm5zLFxuICogYW5kIHNvdXJjZS1zY2FubmluZyBpZ25vcmVzIHN1Y2ggYXMgYGJ1aWxkYCBvciBgZGlzdGAgd291bGQgaGlkZSBsZWdpdGltYXRlbHkgbmFtZWQgd29ya3NwYWNlXG4gKiBkaXJlY3Rvcmllcy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlc29sdmVXb3Jrc3BhY2VQYWNrYWdlSnNvblBhdGhzKHdvcmtzcGFjZVBhdHRlcm5zOiBzdHJpbmdbXSwgcm9vdERpclBhdGg6IHN0cmluZyk6IHN0cmluZ1tdIHtcbiAgLy8gZm9sbG93U3ltYm9saWNMaW5rczogZmFsc2Ugc3RvcHMgR0xPQiB0cmF2ZXJzYWwgdGhyb3VnaCBzeW1saW5rcywgYnV0IGEgbm9uLWdsb2IgcGF0dGVyblxuICAvLyBuYW1pbmcgYSBzeW1saW5rZWQgZGlyZWN0b3J5IChlLmcuIGBsaW5rZWRgIHdpdGggYGxpbmtlZCAtPiAuLi9vdGhlci1yZXBvYCkgc3RpbGwgbWF0Y2hlcyDigJRcbiAgLy8gZmFzdC1nbG9iIHJlc29sdmVzIHN0YXRpYyBwYXR0ZXJucyB3aXRoIGRpcmVjdCBmcyBjaGVja3MsIGFuZCBCdW4gZG9lcyBsaW5rIHN1Y2ggYSB3b3Jrc3BhY2UuXG4gIC8vIERlbGliZXJhdGVseSBkaXZlcmdlIGZyb20gQnVuIHRoZXJlOiBjb25zdW1lcnMgc3VjaCBhcyBub2RlX21vZHVsZXMgY2xlYW51cCBhbmQgbWFuaWZlc3RcbiAgLy8gcmV3cml0aW5nIHdvdWxkIG90aGVyd2lzZSBkZWxldGUgYW5kIHJld3JpdGUgZmlsZXMgaW4gQU5PVEhFUiByZXBvc2l0b3J5IHRocm91Z2ggdGhlIHN5bWxpbmssXG4gIC8vIHNvIGtlZXAgb25seSBtYW5pZmVzdHMgd2hvc2UgcmVhbCBwYXRoIHN0YXlzIGluc2lkZSB0aGUgcmVwb3NpdG9yeSdzIHJlYWwgcm9vdC4gU2Nhbm5pbmcgZWFjaFxuICAvLyBwYXR0ZXJuIHNlcGFyYXRlbHkgKG5vIGNyb3NzLXBhdHRlcm4gY2FjaGluZykgaXMgZGVsaWJlcmF0ZTogZGVjbGFyYXRpb25zIGhvbGQgYSBoYW5kZnVsIG9mXG4gIC8vIHBhdHRlcm5zLCBzbyBhIGNhY2hlIHdvdWxkIGNvbXBsaWNhdGUgdGhpcyBzaGFyZWQgY29kZSB3aXRob3V0IG1lYXN1cmFibGUgZ2Fpbi5cbiAgY29uc3QgZ2xvYk1hbmlmZXN0UGF0aHMgPSAocGF0dGVybjogc3RyaW5nKTogc3RyaW5nW10gPT4ge1xuICAgIC8vIEJ1biBsaW5rcyBkb3QtZGlyZWN0b3J5IHBhY2thZ2VzIG9ubHkgdGhyb3VnaCBmdWxseSBzdGF0aWMgcGF0dGVybnM6IHdpdGggQnVuIDEuMy4xNCxcbiAgICAvLyBgLmhpZGRlbi94YCBwaW5zIHRoZSBwYWNrYWdlIHdoaWxlIGAuaGlkZGVuLypgLCBgLiovKmAsIGFuZCBgKipgIGFsbCBsaW5rIG5vdGhpbmcgdW5kZXJcbiAgICAvLyAuaGlkZGVuIOKAlCBldmVuIHdoZW4gdGhlIGRvdHRlZCBzZWdtZW50IGl0c2VsZiBpcyBsaXRlcmFsIOKAlCBzbyBhbnkgZHluYW1pYyBwYXR0ZXJuIG11c3RcbiAgICAvLyBkcm9wIG1hdGNoZXMgY29udGFpbmluZyBhIGRvdC1sZWQgc2VnbWVudCAoZmFzdC1nbG9iJ3MgYGRvdDogZmFsc2VgIG9ubHkgY292ZXJzIHNlZ21lbnRzXG4gICAgLy8gYSB3aWxkY2FyZCBtYXRjaGVzKS5cbiAgICBjb25zdCBleGNsdWRlc0RvdFNlZ21lbnRzID0gZmcuaXNEeW5hbWljUGF0dGVybihwYXR0ZXJuKTtcbiAgICBjb25zdCBnbG9iT3B0aW9ucyA9IHsgY3dkOiByb290RGlyUGF0aCwgZm9sbG93U3ltYm9saWNMaW5rczogZmFsc2UsIGlnbm9yZTogWycqKi9ub2RlX21vZHVsZXMvKionXSB9O1xuICAgIC8vIGZhc3QtZ2xvYiAzLjMuMyByZXR1cm5zIG5vIG1hdGNoZXMgZm9yIGZpbGUgZ2xvYnMgd2l0aCBhIGxvbmUtYD9gIHNlZ21lbnQgKGUuZy5cbiAgICAvLyBgcGFja2FnZXMvPy9wYWNrYWdlLmpzb25gKSwgYWx0aG91Z2ggbWljcm9tYXRjaCBtYXRjaGVzIHRoZW0gYW5kIEJ1biAxLjMuMTQgbGlua3Mgc3VjaFxuICAgIC8vIHdvcmtzcGFjZXM7IGZvciBgP2AtY2FycnlpbmcgcGF0dGVybnMgb25seSAoYSBkaXJlY3RvcnkgZ2xvYiBmb3IgZS5nLiBgKipgIHdvdWxkIHNjYW4gZXZlcnlcbiAgICAvLyBkaXJlY3RvcnkgaW4gdGhlIHJlcG9zaXRvcnkpLCBnbG9iYmluZyB0aGUgZGlyZWN0b3JpZXMgKHdoZXJlIGA/YCB3b3JrcykgYW5kIGNoZWNraW5nIHRoZWlyXG4gICAgLy8gbWFuaWZlc3RzIGNvbXBsZW1lbnRzIHRoZSBtYW5pZmVzdCBnbG9iLCB3aGljaCBzdGF5cyBuZWNlc3NhcnkgZm9yIGAqKmAncyB6ZXJvLXNlZ21lbnRcbiAgICAvLyBtYXRjaGVzIOKAlCBgZGlyLyoqYCBkb2VzIG5vdCByZXR1cm4gZGlyIGl0c2VsZiBhcyBhIGRpcmVjdG9yeS5cbiAgICBjb25zdCBtYW5pZmVzdFBhdGhzID0gbmV3IFNldChmZy5nbG9iU3luYyhwYXRoLnBvc2l4LmpvaW4ocGF0dGVybiwgJ3BhY2thZ2UuanNvbicpLCBnbG9iT3B0aW9ucykpO1xuICAgIGlmIChwYXR0ZXJuLmluY2x1ZGVzKCc/JykpIHtcbiAgICAgIGZvciAoY29uc3QgZGlyUGF0aCBvZiBmZy5nbG9iU3luYyhwYXR0ZXJuLCB7IC4uLmdsb2JPcHRpb25zLCBvbmx5RGlyZWN0b3JpZXM6IHRydWUgfSkpIHtcbiAgICAgICAgY29uc3QgcGFja2FnZUpzb25QYXRoID0gcGF0aC5wb3NpeC5qb2luKGRpclBhdGgsICdwYWNrYWdlLmpzb24nKTtcbiAgICAgICAgaWYgKGZzLmV4aXN0c1N5bmMocGF0aC5qb2luKHJvb3REaXJQYXRoLCBwYWNrYWdlSnNvblBhdGgpKSkgbWFuaWZlc3RQYXRocy5hZGQocGFja2FnZUpzb25QYXRoKTtcbiAgICAgIH1cbiAgICB9XG4gICAgLy8gQSB6ZXJvLXNlZ21lbnQgYCoqYCBtYXRjaCByZWFjaGVzIHRoZSByb290J3Mgb3duIG1hbmlmZXN0LCBidXQgQnVuIG5ldmVyIHRyZWF0cyB0aGVcbiAgICAvLyBtb25vcmVwbyByb290IGFzIGl0cyBvd24gd29ya3NwYWNlLlxuICAgIHJldHVybiBbLi4ubWFuaWZlc3RQYXRoc10uZmlsdGVyKFxuICAgICAgKHBhY2thZ2VKc29uUGF0aCkgPT5cbiAgICAgICAgcGFja2FnZUpzb25QYXRoICE9PSAncGFja2FnZS5qc29uJyAmJlxuICAgICAgICAoIWV4Y2x1ZGVzRG90U2VnbWVudHMgfHwgIXBhY2thZ2VKc29uUGF0aC5zcGxpdCgnLycpLnNvbWUoKHNlZ21lbnQpID0+IHNlZ21lbnQuc3RhcnRzV2l0aCgnLicpKSkgJiZcbiAgICAgICAgaXNJbnNpZGVSZWFsUm9vdChwYWNrYWdlSnNvblBhdGgpXG4gICAgKTtcbiAgfTtcbiAgbGV0IHJlYWxSb290RGlyUGF0aDogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICBjb25zdCBpc0luc2lkZVJlYWxSb290ID0gKHBhY2thZ2VKc29uUGF0aDogc3RyaW5nKTogYm9vbGVhbiA9PiB7XG4gICAgdHJ5IHtcbiAgICAgIHJlYWxSb290RGlyUGF0aCA/Pz0gZnMucmVhbHBhdGhTeW5jKHJvb3REaXJQYXRoKTtcbiAgICAgIGNvbnN0IHJlbGF0aXZlUGF0aCA9IHBhdGgucmVsYXRpdmUocmVhbFJvb3REaXJQYXRoLCBmcy5yZWFscGF0aFN5bmMocGF0aC5qb2luKHJvb3REaXJQYXRoLCBwYWNrYWdlSnNvblBhdGgpKSk7XG4gICAgICAvLyBDb21wYXJlIHdob2xlIHNlZ21lbnRzLCBub3QgYSBgLi5gIHByZWZpeDogYSBkaXJlY3RvcnkgbGl0ZXJhbGx5IG5hbWVkIGUuZy4gYC4ucGtnYCBpc1xuICAgICAgLy8gaW5zaWRlIHRoZSByb290LCB3aGlsZSBhIHBsYWluIHN0YXJ0c1dpdGgoJy4uJykgd291bGQgbWlzcmVhZCBpdCBhcyBwYXJlbnQgdHJhdmVyc2FsLlxuICAgICAgcmV0dXJuIHJlbGF0aXZlUGF0aCAhPT0gJy4uJyAmJiAhcmVsYXRpdmVQYXRoLnN0YXJ0c1dpdGgoJy4uLycpICYmICFwYXRoLmlzQWJzb2x1dGUocmVsYXRpdmVQYXRoKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIEEgbWFuaWZlc3QgdGhhdCB2YW5pc2hlZCBiZXR3ZWVuIHRoZSBnbG9iIGFuZCB0aGUgcmVhbHBhdGggY2FsbCBpcyBub3QgYSB3b3Jrc3BhY2UuXG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9O1xuICBjb25zdCBhY2N1bXVsYXRlZFBhdGhzID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gIGNvbnN0IHBpbm5lZFBhdGhzID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gIGZvciAoY29uc3Qgd29ya3NwYWNlUGF0dGVybiBvZiB3b3Jrc3BhY2VQYXR0ZXJucykge1xuICAgIGNvbnN0IGlzTmVnYXRpdmUgPSB3b3Jrc3BhY2VQYXR0ZXJuLnN0YXJ0c1dpdGgoJyEnKTtcbiAgICBjb25zdCBwYXR0ZXJuQm9keSA9IG5vcm1hbGl6ZVdvcmtzcGFjZVBhdHRlcm5Cb2R5KGlzTmVnYXRpdmUgPyB3b3Jrc3BhY2VQYXR0ZXJuLnNsaWNlKDEpIDogd29ya3NwYWNlUGF0dGVybik7XG4gICAgaWYgKGlzTmVnYXRpdmUpIHtcbiAgICAgIGNvbnN0IGJhc2VsaW5lR2xvYiA9IGdldFNlZWRlZEJhc2VsaW5lR2xvYihwYXR0ZXJuQm9keSk7XG4gICAgICBpZiAoYmFzZWxpbmVHbG9iICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgZm9yIChjb25zdCBwYWNrYWdlSnNvblBhdGggb2YgZ2xvYk1hbmlmZXN0UGF0aHMoYmFzZWxpbmVHbG9iKSkgYWNjdW11bGF0ZWRQYXRocy5hZGQocGFja2FnZUpzb25QYXRoKTtcbiAgICAgIH1cbiAgICAgIGZvciAoY29uc3QgcGFja2FnZUpzb25QYXRoIG9mIGdsb2JNYW5pZmVzdFBhdGhzKHBhdHRlcm5Cb2R5KSkgYWNjdW11bGF0ZWRQYXRocy5kZWxldGUocGFja2FnZUpzb25QYXRoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgdGFyZ2V0UGF0aHMgPSBmZy5pc0R5bmFtaWNQYXR0ZXJuKHBhdHRlcm5Cb2R5KSA/IGFjY3VtdWxhdGVkUGF0aHMgOiBwaW5uZWRQYXRocztcbiAgICAgIGZvciAoY29uc3QgcGFja2FnZUpzb25QYXRoIG9mIGdsb2JNYW5pZmVzdFBhdGhzKHBhdHRlcm5Cb2R5KSkge1xuICAgICAgICB0YXJnZXRQYXRocy5hZGQocGFja2FnZUpzb25QYXRoKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcmV0dXJuIFsuLi5uZXcgU2V0KFsuLi5hY2N1bXVsYXRlZFBhdGhzLCAuLi5waW5uZWRQYXRoc10pXS50b1NvcnRlZCgpO1xufVxuXG4vKipcbiAqIFdoZXRoZXIgdGhlIGRlY2xhcmF0aW9uIHNlZWRzIEJ1bidzIGltcGxpY2l0IHdvcmtzcGFjZSBiYXNlbGluZTogaXQgY29udGFpbnMgYXQgbGVhc3Qgb25lXG4gKiBuZWdhdGlvbiBvZiB0aGUgc2VlZGluZyBzaGFwZSAoc2VlIHJlc29sdmVXb3Jrc3BhY2VQYWNrYWdlSnNvblBhdGhzIHJ1bGUgMikuIE1lYXN1cmVkIHdpdGggQnVuXG4gKiAxLjMuMTQsIHNlZWRpbmcgaXMgcGVyLW5lZ2F0aW9uIGFuZCBoYXBwZW5zIGV2ZW4gYWxvbmdzaWRlIHBvc2l0aXZlIHBhdHRlcm5zOyBjb25jcmV0ZSBvclxuICogbWl4ZWQtbGl0ZXJhbCBsYXN0IHNlZ21lbnRzIChgIWFwcHMvZXhjbHVkZWRgLCBgIWFwcHMvKmRgKSBuZXZlciBzZWVkLCBhbmQgYD9gLCBicmFjZSwgYW5kXG4gKiBjaGFyYWN0ZXItY2xhc3MgbGFzdCBzZWdtZW50cyBiZWhhdmVkIGluY29uc2lzdGVudGx5IGFjcm9zcyBmaXh0dXJlcyAoc29tZXRpbWVzIGRyb3BwaW5nIGV2ZW5cbiAqIHVucmVsYXRlZCBzaWJsaW5nIHdvcmtzcGFjZXMpLCBzbyB0aGV5IGFyZSBjb25zZXJ2YXRpdmVseSB0cmVhdGVkIGFzIG5vdCBzZWVkaW5nOyBzZWVcbiAqIFdpbGxCb29zdGVyL3NoYXJlZCMxMDA1LlxuICovXG5leHBvcnQgZnVuY3Rpb24gaGFzSW1wbGljaXRXb3Jrc3BhY2VCYXNlbGluZSh3b3Jrc3BhY2VzOiBXb3Jrc3BhY2VzRGVjbGFyYXRpb24pOiBib29sZWFuIHtcbiAgcmV0dXJuIGdldE1lYW5pbmdmdWxEZWNsYXJlZFdvcmtzcGFjZVBhdHRlcm5zKHdvcmtzcGFjZXMpLnNvbWUoXG4gICAgKHdvcmtzcGFjZVBhdHRlcm4pID0+XG4gICAgICB3b3Jrc3BhY2VQYXR0ZXJuLnN0YXJ0c1dpdGgoJyEnKSAmJlxuICAgICAgZ2V0U2VlZGVkQmFzZWxpbmVHbG9iKG5vcm1hbGl6ZVdvcmtzcGFjZVBhdHRlcm5Cb2R5KHdvcmtzcGFjZVBhdHRlcm4uc2xpY2UoMSkpKSAhPT0gdW5kZWZpbmVkXG4gICk7XG59XG5cbi8qKlxuICogRGVjbGFyZWQgd29ya3NwYWNlIHBhdHRlcm5zIHdpdGhvdXQgQnVuJ3Mgbm8tb3Agb25lcyAoYFwiXCJgLCBhIGxvbmUgYFwiIVwiYCwgYW5kIGBcIi5cImApLCB3aGljaCBCdW5cbiAqIGlnbm9yZXMgZW50aXJlbHkg4oCUIGEgbG9uZSBgXCIhXCJgIG11c3Qgbm90IGFjdGl2YXRlIHRoZSBuZWdhdGl2ZS1vbmx5IGltcGxpY2l0IGJhc2VsaW5lLCBhbmQgYFwiXCJgXG4gKiBtdXN0IG5vdCBtYWtlIHRoZSByZXBvc2l0b3J5IHJvb3QgaXRzZWxmIGEgZGlzY292ZXJlZCB3b3Jrc3BhY2UuIERlY2xhcmF0aW9uIG9yZGVyIGFuZFxuICogZHVwbGljYXRlcyBhcmUgcHJlc2VydmVkIOKAlCBCdW4gZXZhbHVhdGVzIHRoZSBwYXR0ZXJucyBzZXF1ZW50aWFsbHksIHNvIHBvc2l0aW9uIG1hdHRlcnMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRNZWFuaW5nZnVsRGVjbGFyZWRXb3Jrc3BhY2VQYXR0ZXJucyh3b3Jrc3BhY2VzOiBXb3Jrc3BhY2VzRGVjbGFyYXRpb24pOiBzdHJpbmdbXSB7XG4gIHJldHVybiBnZXREZWNsYXJlZFdvcmtzcGFjZVBhdHRlcm5zKHdvcmtzcGFjZXMpXG4gICAgLm1hcCgod29ya3NwYWNlUGF0dGVybikgPT4ge1xuICAgICAgLy8gQnVuIGFwcGxpZXMgbGVhZGluZy1iYW5nIFBBUklUWSAodmVyaWZpZWQgd2l0aCBCdW4gMS4zLjE0KTogYCEhcGAgaXMgdGhlIHBvc2l0aXZlIGBwYFxuICAgICAgLy8gYW5kIGAhISFwYCB0aGUgbmVnYXRpb24gYCFwYCwgc28gY2Fub25pY2FsaXplIHRvIGF0IG1vc3Qgb25lIGJhbmcuXG4gICAgICBjb25zdCBiYW5nQ291bnQgPSAvXiEqL3UuZXhlYyh3b3Jrc3BhY2VQYXR0ZXJuKSFbMF0ubGVuZ3RoO1xuICAgICAgY29uc3QgcGF0dGVybkJvZHkgPSB3b3Jrc3BhY2VQYXR0ZXJuLnNsaWNlKGJhbmdDb3VudCk7XG4gICAgICByZXR1cm4gYmFuZ0NvdW50ICUgMiA9PT0gMSA/IGAhJHtwYXR0ZXJuQm9keX1gIDogcGF0dGVybkJvZHk7XG4gICAgfSlcbiAgICAuZmlsdGVyKCh3b3Jrc3BhY2VQYXR0ZXJuKSA9PiB7XG4gICAgICBjb25zdCBwYXR0ZXJuQm9keSA9IHdvcmtzcGFjZVBhdHRlcm4uc3RhcnRzV2l0aCgnIScpID8gd29ya3NwYWNlUGF0dGVybi5zbGljZSgxKSA6IHdvcmtzcGFjZVBhdHRlcm47XG4gICAgICAvLyBOb3JtYWxpemUgc28gc3BlbGxpbmdzIGxpa2UgYC4vYCwgYC4vLmAsIGFuZCBgIS4vYCBhcmUgcmVjb2duaXplZCBhcyB0aGUgc2FtZSBuby1vcHNcbiAgICAgIC8vIChwYXRoLnBvc2l4Lm5vcm1hbGl6ZSgnJykgPT09ICcuJywgc28gdGhlIGVtcHR5IHBhdHRlcm4gaXMgY292ZXJlZCB0b28pLlxuICAgICAgcmV0dXJuIG5vcm1hbGl6ZVdvcmtzcGFjZVBhdHRlcm5Cb2R5KHBhdHRlcm5Cb2R5KSAhPT0gJy4nO1xuICAgIH0pO1xufVxuXG4vKipcbiAqIENvbGxhcHNlcyBgLy9gLCByZXNvbHZlcyBgLi9gLCBhbmQgc3RyaXBzIHRyYWlsaW5nIHNsYXNoZXMsIG1pcnJvcmluZyBCdW4ncyBwYXRoIGhhbmRsaW5nLlxuICogQSBwdXJlIHN0YXItcnVuIHNlZ21lbnQgb2YgdGhyZWUgb3IgbW9yZSBzdGFycyBiZWhhdmVzIGxpa2UgYCpgIHVuZGVyIEJ1biAoYCFvdGhlci8qKipgXG4gKiBtYXRjaGVzIG90aGVyL3gpIGJ1dCBub3QgdW5kZXIgZmFzdC1nbG9iLCBzbyBjYW5vbmljYWxpemUgaXQgdG8gYCpgLlxuICovXG5leHBvcnQgZnVuY3Rpb24gbm9ybWFsaXplV29ya3NwYWNlUGF0dGVybkJvZHkocGF0dGVybkJvZHk6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiBwYXRoLnBvc2l4XG4gICAgLm5vcm1hbGl6ZShwYXR0ZXJuQm9keSlcbiAgICAucmVwbGFjZSgvXFwvKyQvdSwgJycpXG4gICAgLnNwbGl0KCcvJylcbiAgICAubWFwKChzZWdtZW50KSA9PiAoL15cXCp7Myx9JC91LnRlc3Qoc2VnbWVudCkgPyAnKicgOiBzZWdtZW50KSlcbiAgICAuam9pbignLycpO1xufVxuXG4vKiogVGhlIGltcGxpY2l0IGJhc2VsaW5lIGdsb2IgYSBuZWdhdGlvbiBzZWVkcyB1bmRlciBCdW4ncyBydWxlIDIgYWJvdmUsIG9yIHVuZGVmaW5lZCBpZiBub25lLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFNlZWRlZEJhc2VsaW5lR2xvYihuZWdhdGlvbkJvZHk6IHN0cmluZyk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IHNlZ21lbnRzID0gbmVnYXRpb25Cb2R5LnNwbGl0KCcvJyk7XG4gIGlmIChzZWdtZW50cy5sZW5ndGggIT09IDIpIHJldHVybiB1bmRlZmluZWQ7XG4gIGNvbnN0IFtmaXJzdFNlZ21lbnQsIGxhc3RTZWdtZW50XSA9IHNlZ21lbnRzIGFzIFtzdHJpbmcsIHN0cmluZ107XG4gIGlmICghL15cXCorJC91LnRlc3QobGFzdFNlZ21lbnQpIHx8IC9eXFwqKyQvdS50ZXN0KGZpcnN0U2VnbWVudCkpIHJldHVybiB1bmRlZmluZWQ7XG4gIHJldHVybiBsYXN0U2VnbWVudCA9PT0gJyoqJyA/ICcqKicgOiAnKi8qJztcbn1cblxuLyoqIFdvcmtzcGFjZSBwYXR0ZXJucyBmcm9tIGVpdGhlciB0aGUgYXJyYXkgZm9ybSBvciBZYXJuIHYxJ3MgYHsgcGFja2FnZXM6IFvigKZdIH1gIG9iamVjdCBmb3JtLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldERlY2xhcmVkV29ya3NwYWNlUGF0dGVybnMod29ya3NwYWNlczogV29ya3NwYWNlc0RlY2xhcmF0aW9uKTogc3RyaW5nW10ge1xuICBpZiAoQXJyYXkuaXNBcnJheSh3b3Jrc3BhY2VzKSkgcmV0dXJuIHdvcmtzcGFjZXM7XG4gIHJldHVybiBBcnJheS5pc0FycmF5KHdvcmtzcGFjZXM/LnBhY2thZ2VzKSA/IHdvcmtzcGFjZXMucGFja2FnZXMgOiBbXTtcbn1cblxuLyoqXG4gKiBXaGV0aGVyIGEgZGVjbGFyZWQgd29ya3NwYWNlIHBhdHRlcm4gKG5lZ2F0aXZlIG9uZXMgaW5jbHVkZWQpIHN0YXlzIGluc2lkZSB0aGUgcmVwb3NpdG9yeTpcbiAqIGFic29sdXRlIG9yIGAuLmAtdHJhdmVyc2luZyBwYXR0ZXJucyB3b3VsZCBtYWtlIGNvbnN1bWVycyBzdWNoIGFzIG5vZGVfbW9kdWxlcyBjbGVhbnVwIG9wZXJhdGVcbiAqIG9uIGFub3RoZXIgcmVwb3NpdG9yeSdzIGZpbGVzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNJblJlcG9zaXRvcnlXb3Jrc3BhY2VQYXR0ZXJuKHdvcmtzcGFjZVBhdHRlcm46IHN0cmluZyk6IGJvb2xlYW4ge1xuICBjb25zdCBwYXR0ZXJuQm9keSA9IHdvcmtzcGFjZVBhdHRlcm4uc3RhcnRzV2l0aCgnIScpID8gd29ya3NwYWNlUGF0dGVybi5zbGljZSgxKSA6IHdvcmtzcGFjZVBhdHRlcm47XG4gIHJldHVybiAhcGF0aC5wb3NpeC5pc0Fic29sdXRlKHBhdHRlcm5Cb2R5KSAmJiAhcGF0dGVybkJvZHkuc3BsaXQoJy8nKS5pbmNsdWRlcygnLi4nKTtcbn1cbiIsImltcG9ydCBjcnlwdG8gZnJvbSAnbm9kZTpjcnlwdG8nO1xuaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuLyoqXG4gKiBBbmNob3JlZCB0byBgXCIsIGAgc28gb25seSBhIHJlZ2lzdHJ5IGVudHJ5J3MgYHJlc29sdmVkYCBzbG90IGlzIGNsZWFyZWQuIEEgZGlyZWN0IHRhcmJhbGxcbiAqIGRlcGVuZGVuY3kgY2FycmllcyBpdHMgVVJMIGluIHRoZSB3b3Jrc3BhY2UgZGVzY3JpcHRvciBhbmQgdHVwbGUgaWRlbnRpZmllciBpbnN0ZWFkLCBhbmQgdGhvc2VcbiAqIFVSTHMgbXVzdCByZW1haW4gaW50YWN0LlxuICovXG5jb25zdCBndWFyZFJlc29sdmVkVXJsUGF0dGVybiA9IC8oXCIsIClcImh0dHBzOlxcL1xcL25wbVxcLmZsYXR0XFwudGVjaFxcL1teXCJdKlwiL2c7XG5cbi8qKlxuICogUmVtb3ZlIFRha3VtaSBHdWFyZCBwcm94eSBVUkxzIGZyb20gdGhlIG5lYXJlc3QgZW5jbG9zaW5nIGJ1bi5sb2NrLlxuICpcbiAqIEJ1biB3cml0ZXMgdGhlIHdvcmtzcGFjZSByb290J3MgbG9ja2ZpbGUgZXZlbiB3aGVuIGFuIGluc3RhbGwgcnVucyBmcm9tIGEgY2hpbGQgcGFja2FnZS4gSW4gYVxuICogR2l0IGNoZWNrb3V0IHRoZSBzZWFyY2ggY2xpbWJzIHRvIHRoYXQgcm9vdDsgd2l0aG91dCBhIGNoZWNrb3V0IGJvdW5kYXJ5IGl0IGluc3BlY3RzIG9ubHkgdGhlXG4gKiBzdGFydGluZyBkaXJlY3Rvcnkgc28gaXQgY2Fubm90IHJld3JpdGUgYW4gdW5yZWxhdGVkIGFuY2VzdG9yJ3MgbG9ja2ZpbGUuIFRoZSBwcm94eSBpc1xuICogaW5zdGFsbC10aW1lIHBvbGljeSByYXRoZXIgdGhhbiByZXBvc2l0b3J5IHN0YXRlOiBhbiBlbXB0eSByZXNvbHZlZCBzbG90IHN0aWxsIG1ha2VzIEJ1biB1c2UgdGhlXG4gKiBjb25maWd1cmVkIGRlZmF1bHQgcmVnaXN0cnkuXG4gKlxuICogQHJldHVybnMgVGhlIG5vcm1hbGl6ZWQgbG9ja2ZpbGUgcGF0aCwgb3IgdW5kZWZpbmVkIHdoZW4gbm8gY2hhbmdlIHdhcyBuZWVkZWQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBub3JtYWxpemVCdW5Mb2NrZmlsZShzdGFydERpclBhdGg6IHN0cmluZyk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IGxvY2tmaWxlUGF0aCA9IGZpbmRCdW5Mb2NrZmlsZVBhdGgoc3RhcnREaXJQYXRoKTtcbiAgaWYgKCFsb2NrZmlsZVBhdGgpIHJldHVybjtcblxuICBjb25zdCBjb250ZW50ID0gZnMucmVhZEZpbGVTeW5jKGxvY2tmaWxlUGF0aCwgJ3V0ZjgnKTtcbiAgY29uc3Qgbm9ybWFsaXplZENvbnRlbnQgPSBjb250ZW50LnJlcGxhY2VBbGwoZ3VhcmRSZXNvbHZlZFVybFBhdHRlcm4sICckMVwiXCInKTtcbiAgaWYgKG5vcm1hbGl6ZWRDb250ZW50ID09PSBjb250ZW50KSByZXR1cm47XG5cbiAgLy8gQSBzaWJsaW5nIHRlbXAgZmlsZSBtYWtlcyB0aGUgcmVwbGFjZW1lbnQgYW4gYXRvbWljIHNhbWUtZGlyZWN0b3J5IHJlbmFtZSwgc28gYW4gaW50ZXJydXB0ZWRcbiAgLy8gd3JpdGUgY2Fubm90IGxlYXZlIGEgdHJ1bmNhdGVkIGJ1bi5sb2NrIGJlaGluZC5cbiAgY29uc3QgdGVtcG9yYXJ5UGF0aCA9IGAke2xvY2tmaWxlUGF0aH0ubm9ybWFsaXppbmcuJHtwcm9jZXNzLnBpZH0uJHtjcnlwdG8ucmFuZG9tVVVJRCgpfWA7XG4gIHRyeSB7XG4gICAgLy8gc3RhdCdzIG1vZGUgaW5jbHVkZXMgZmlsZS10eXBlIGJpdHMsIHdoaWNoIGNobW9kIGlzIG5vdCBzcGVjaWZpZWQgdG8gYWNjZXB0LlxuICAgIGNvbnN0IG1vZGUgPSBmcy5zdGF0U3luYyhsb2NrZmlsZVBhdGgpLm1vZGUgJiAwbzc3NztcbiAgICBmcy53cml0ZUZpbGVTeW5jKHRlbXBvcmFyeVBhdGgsIG5vcm1hbGl6ZWRDb250ZW50LCB7IG1vZGUgfSk7XG4gICAgLy8gd3JpdGVGaWxlU3luYydzIG1vZGUgaXMgbWFza2VkIGJ5IHRoZSBwcm9jZXNzIHVtYXNrOyBjaG1vZCByZXN0b3JlcyB0aGUgZXhhY3Qgb3JpZ2luYWwgYml0cy5cbiAgICBmcy5jaG1vZFN5bmModGVtcG9yYXJ5UGF0aCwgbW9kZSk7XG4gICAgZnMucmVuYW1lU3luYyh0ZW1wb3JhcnlQYXRoLCBsb2NrZmlsZVBhdGgpO1xuICB9IGZpbmFsbHkge1xuICAgIGZzLnJtU3luYyh0ZW1wb3JhcnlQYXRoLCB7IGZvcmNlOiB0cnVlIH0pO1xuICB9XG4gIHJldHVybiBsb2NrZmlsZVBhdGg7XG59XG5cbmZ1bmN0aW9uIGZpbmRCdW5Mb2NrZmlsZVBhdGgoc3RhcnREaXJQYXRoOiBzdHJpbmcpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBjb25zdCByZXNvbHZlZFN0YXJ0RGlyUGF0aCA9IHBhdGgucmVzb2x2ZShzdGFydERpclBhdGgpO1xuICBjb25zdCByZXBvc2l0b3J5Um9vdERpclBhdGggPSBmaW5kUmVwb3NpdG9yeVJvb3REaXJQYXRoKHJlc29sdmVkU3RhcnREaXJQYXRoKTtcbiAgaWYgKCFyZXBvc2l0b3J5Um9vdERpclBhdGgpIHtcbiAgICBjb25zdCBsb2NrZmlsZVBhdGggPSBwYXRoLmpvaW4ocmVzb2x2ZWRTdGFydERpclBhdGgsICdidW4ubG9jaycpO1xuICAgIHJldHVybiBmcy5leGlzdHNTeW5jKGxvY2tmaWxlUGF0aCkgPyBsb2NrZmlsZVBhdGggOiB1bmRlZmluZWQ7XG4gIH1cblxuICBsZXQgZGlyUGF0aCA9IHJlc29sdmVkU3RhcnREaXJQYXRoO1xuICB3aGlsZSAodHJ1ZSkge1xuICAgIGNvbnN0IGxvY2tmaWxlUGF0aCA9IHBhdGguam9pbihkaXJQYXRoLCAnYnVuLmxvY2snKTtcbiAgICBpZiAoZnMuZXhpc3RzU3luYyhsb2NrZmlsZVBhdGgpKSByZXR1cm4gbG9ja2ZpbGVQYXRoO1xuICAgIGlmIChkaXJQYXRoID09PSByZXBvc2l0b3J5Um9vdERpclBhdGgpIHJldHVybjtcblxuICAgIGRpclBhdGggPSBwYXRoLmRpcm5hbWUoZGlyUGF0aCk7XG4gIH1cbn1cblxuZnVuY3Rpb24gZmluZFJlcG9zaXRvcnlSb290RGlyUGF0aChzdGFydERpclBhdGg6IHN0cmluZyk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGxldCBkaXJQYXRoID0gc3RhcnREaXJQYXRoO1xuICB3aGlsZSAodHJ1ZSkge1xuICAgIGlmIChmcy5leGlzdHNTeW5jKHBhdGguam9pbihkaXJQYXRoLCAnLmdpdCcpKSkgcmV0dXJuIGRpclBhdGg7XG5cbiAgICBjb25zdCBwYXJlbnREaXJQYXRoID0gcGF0aC5kaXJuYW1lKGRpclBhdGgpO1xuICAgIGlmIChwYXJlbnREaXJQYXRoID09PSBkaXJQYXRoKSByZXR1cm47XG4gICAgZGlyUGF0aCA9IHBhcmVudERpclBhdGg7XG4gIH1cbn1cbiIsIi8qKiBXaGV0aGVyIGEgRG9ja2VyZmlsZSBjb25zdW1lcyB3YidzIGdlbmVyYXRlZCBub24tc2VjcmV0IGVudmlyb25tZW50IGRpcmVjdGx5IG9yIHRocm91Z2ggaXRzIGhlbHBlci4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjb25zdW1lc0RvY2tlckVudihkb2NrZXJmaWxlVGV4dDogc3RyaW5nKTogYm9vbGVhbiB7XG4gIHJldHVybiBkb2NrZXJmaWxlVGV4dFxuICAgIC5zcGxpdCgnXFxuJylcbiAgICAuc29tZSgobGluZSkgPT4gIS9eXFxzKiMvdS50ZXN0KGxpbmUpICYmIChsaW5lLmluY2x1ZGVzKCcuZG9ja2VyLmVudicpIHx8IGxpbmUuaW5jbHVkZXMoJ2FwcGx5LWRvY2tlci1lbnYuc2gnKSkpO1xufVxuIiwiZXhwb3J0IGNvbnN0IGdsb2JJZ25vcmUgPSBbXG4gICcqKi9ub2RlX21vZHVsZXMvKionLFxuICAnKiovLmFudGlncmF2aXR5Y2xpLyoqJyxcbiAgLy8gR2l0J3Mgb2JqZWN0IHN0b3JlIGhvbGRzIGNvcGllcyBvZiB0cmFja2VkIGZpbGVzIChhbmQgYGRvdDogdHJ1ZWAgbWFrZXMgdGhlbSB2aXNpYmxlKSwgc29cbiAgLy8gc2Nhbm5pbmcgaXQgd291bGQgYm90aCBzbG93IGV2ZXJ5IGdsb2IgZG93biBhbmQgbGV0IHN0YWxlIGJsb2JzIGluZmx1ZW5jZSBkZXRlY3Rpb24uXG4gICcqKi8uZ2l0LyoqJyxcbiAgLy8gVGhlIG9yZy1zdGFuZGFyZCB0ZW1wb3JhcnkgZGlyZWN0b3J5OyBzdGFsZSBjb3BpZXMgdW5kZXIgaXQgKGUuZy4gcmV2aWV3IHNjcmF0Y2ggZGlycykgbXVzdFxuICAvLyBub3QgaW5mbHVlbmNlIGxhbmd1YWdlIGRldGVjdGlvbi5cbiAgJyoqLy50bXAvKionLFxuICAnKiovLnRtcC0qLyoqJyxcbiAgLy8gTG9jYWwgY2FjaGVzIGNhbiBjb250YWluIGNvbXBsZXRlIHRoaXJkLXBhcnR5IHNvdXJjZSBjaGVja291dHMuIFRyZWF0aW5nIHRob3NlIGFzIHJlcG9zaXRvcnlcbiAgLy8gY29kZSBnZW5lcmF0ZXMgd29ya2Zsb3dzIGZvciBwYXRocyB0aGF0IGFyZSBnaXRpZ25vcmVkIGFuZCBhYnNlbnQgZnJvbSBmcmVzaCBDSSBjaGVja291dHMuXG4gICcqKi8uY2FjaGUvKionLFxuICAnKiovLnZlbnYvKionLFxuICAnKiovdGVzdC1maXh0dXJlcy8qKicsXG4gICcqKi90ZXN0L2ZpeHR1cmVzLyoqJyxcbiAgJyoqL2Rpc3QvKionLFxuICAnKiovYnVpbGQvKionLFxuICAnKiovdGFyZ2V0LyoqJyxcbiAgJyoqL3RlbXAvKionLFxuICAnKiovdG1wLyoqJyxcbl07XG4iLCJjbGFzcyBPcHRpb25zIHtcbiAgaXNWZXJib3NlID0gZmFsc2U7XG59XG5cbmV4cG9ydCBjb25zdCBvcHRpb25zID0gbmV3IE9wdGlvbnMoKTtcbiIsImltcG9ydCB7IG9wdGlvbnMgfSBmcm9tICcuL29wdGlvbnMuanMnO1xuXG5jbGFzcyBMb2dnZXIge1xuICBhc3luYyBmdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKG5hbWU6IHN0cmluZywgZnVuYzogKCkgPT4gUHJvbWlzZTx2b2lkPik6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmIChvcHRpb25zLmlzVmVyYm9zZSkge1xuICAgICAgY29uc29sZS5pbmZvKGAtLS0tLS0tLS0gJHtuYW1lfSBzdGFydCAtLS0tLS0tLS1gKTtcbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IGZ1bmMoKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgY29uc29sZS5pbmZvKGBFcnJvciBvY2N1cnJlZCBpbiAke25hbWV9OiAke2Vycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5zdGFjayA6IFN0cmluZyhlcnJvcil9fWApO1xuICAgIH1cbiAgICBpZiAob3B0aW9ucy5pc1ZlcmJvc2UpIHtcbiAgICAgIGNvbnNvbGUuaW5mbyhgLS0tLS0tLS0tLSAke25hbWV9IGVuZCAtLS0tLS0tLS0tYCk7XG4gICAgfVxuICB9XG59XG5cbmV4cG9ydCBjb25zdCBsb2dnZXIgPSBuZXcgTG9nZ2VyKCk7XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5sZXQgcmVhbFJvb3REaXJQYXRoOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG5cbmV4cG9ydCBjb25zdCBmc1V0aWwgPSB7XG4gIC8qKiBDb25maW5lcyBnZW5lcmF0ZUZpbGUgd3JpdGVzIHRvIHRoZSByZXBvc2l0b3J5IHJvb3RlZCBhdCByb290RGlyUGF0aCAodW5kZWZpbmVkIGRpc2FibGVzIGl0KS4gKi9cbiAgc2V0Um9vdERpclBhdGgocm9vdERpclBhdGg6IHN0cmluZyB8IHVuZGVmaW5lZCk6IHZvaWQge1xuICAgIHJlYWxSb290RGlyUGF0aCA9IHJvb3REaXJQYXRoID09PSB1bmRlZmluZWQgPyB1bmRlZmluZWQgOiBmcy5yZWFscGF0aFN5bmMocm9vdERpclBhdGgpO1xuICB9LFxuICAvKipcbiAgICogUmV0dXJucyB1bmRlZmluZWQgb25seSB3aGVuIHRoZSBmaWxlIGRvZXMgbm90IGV4aXN0LiBPdGhlciBmYWlsdXJlcyAoZS5nLiBwZXJtaXNzaW9ucykgYXJlXG4gICAqIHJldGhyb3duIHNvIGNhbGxlcnMgcmVnZW5lcmF0aW5nIGNvbmZpZyBmaWxlcyBuZXZlciBvdmVyd3JpdGUgY29udGVudCB0aGV5IGNvdWxkIG5vdCByZWFkLlxuICAgKi9cbiAgYXN5bmMgcmVhZEZpbGVJZkV4aXN0cyhmaWxlUGF0aDogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmcgfCB1bmRlZmluZWQ+IHtcbiAgICB0cnkge1xuICAgICAgcmV0dXJuIGF3YWl0IGZzLnByb21pc2VzLnJlYWRGaWxlKGZpbGVQYXRoLCAndXRmOCcpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBpZiAoKGVycm9yIGFzIE5vZGVKUy5FcnJub0V4Y2VwdGlvbikuY29kZSA9PT0gJ0VOT0VOVCcpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICB0aHJvdyBlcnJvcjtcbiAgICB9XG4gIH0sXG4gIC8qKiBUZWxscyB3aGV0aGVyIGEgd3JpdGUgdG8gZmlsZVBhdGggd291bGQgcGFzcyB0aGUgc3ltbGluay9yZXBvc2l0b3J5LWNvbnRhaW5tZW50IGd1YXJkcy4gKi9cbiAgYXN5bmMgaXNDb25maW5lZFdyaXRhYmxlUGF0aChmaWxlUGF0aDogc3RyaW5nKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgcmV0dXJuIGF3YWl0IGlzQ29uZmluZWRXcml0YWJsZVBhdGgoZmlsZVBhdGgpO1xuICB9LFxuICAvKipcbiAgICogUmVhZHMgYSBzb3VyY2UgZmlsZSwgcmV0dXJuaW5nIHVuZGVmaW5lZCB3aGVuIHRoZSBmaWxlIGRvZXMgbm90IGV4aXN0IE9SIHdoZW4gaXRcbiAgICogcmVzb2x2ZXMgb3V0c2lkZSB0aGUgcmVwb3NpdG9yeSDigJQgYSBjb21taXR0ZWQgc3ltbGluayBwb2ludGluZyBvdXRzaWRlIHRoZSByZXBvc2l0b3J5IG11c3RcbiAgICogbm90IGdldCBpdHMgdGFyZ2V0J3MgY29udGVudCBjb3BpZWQgaW50byBhIHRyYWNrZWQgZmlsZS4gQSBzeW1saW5rIHdob3NlIHJlc29sdmVkIHRhcmdldFxuICAgKiBzdGF5cyBpbnNpZGUgdGhlIHJlcG9zaXRvcnkgaXMgbGVnaXRpbWF0ZSAoZS5nLiBgLm5vZGUtdmVyc2lvbiAtPiAubnZtcmNgKSBhbmQgaXMgcmVhZC5cbiAgICovXG4gIGFzeW5jIHJlYWRGaWxlQ29uZmluZWRJZkV4aXN0cyhmaWxlUGF0aDogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmcgfCB1bmRlZmluZWQ+IHtcbiAgICBjb25zdCBzdGF0cyA9IGF3YWl0IGZzLnByb21pc2VzLmxzdGF0KGZpbGVQYXRoKS5jYXRjaCgoKSA9PiB7fSk7XG4gICAgaWYgKCFzdGF0cykgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICBpZiAoc3RhdHMuaXNTeW1ib2xpY0xpbmsoKSkge1xuICAgICAgbGV0IHJlYWxGaWxlUGF0aDogc3RyaW5nO1xuICAgICAgdHJ5IHtcbiAgICAgICAgcmVhbEZpbGVQYXRoID0gYXdhaXQgZnMucHJvbWlzZXMucmVhbHBhdGgoZmlsZVBhdGgpO1xuICAgICAgfSBjYXRjaCB7XG4gICAgICAgIGNvbnNvbGUud2FybihgU2tpcHBlZCByZWFkaW5nICR7ZmlsZVBhdGh9IGJlY2F1c2UgaXQgaXMgYSBkYW5nbGluZyBzeW1ib2xpYyBsaW5rLmApO1xuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgfVxuICAgICAgaWYgKFxuICAgICAgICByZWFsUm9vdERpclBhdGggIT09IHVuZGVmaW5lZCAmJlxuICAgICAgICByZWFsRmlsZVBhdGggIT09IHJlYWxSb290RGlyUGF0aCAmJlxuICAgICAgICAhcmVhbEZpbGVQYXRoLnN0YXJ0c1dpdGgocmVhbFJvb3REaXJQYXRoICsgcGF0aC5zZXApXG4gICAgICApIHtcbiAgICAgICAgY29uc29sZS53YXJuKGBTa2lwcGVkIHJlYWRpbmcgJHtmaWxlUGF0aH0gYmVjYXVzZSBpdCByZXNvbHZlcyBvdXRzaWRlIHRoZSByZXBvc2l0b3J5LmApO1xuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGF3YWl0IGZzVXRpbC5yZWFkRmlsZUlmRXhpc3RzKGZpbGVQYXRoKTtcbiAgICB9XG4gICAgaWYgKCEoYXdhaXQgaGFzQ29uZmluZWRQYXJlbnQoZmlsZVBhdGgpKSkge1xuICAgICAgY29uc29sZS53YXJuKGBTa2lwcGVkIHJlYWRpbmcgJHtmaWxlUGF0aH0gYmVjYXVzZSBpdCByZXNvbHZlcyBvdXRzaWRlIHRoZSByZXBvc2l0b3J5LmApO1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG4gICAgcmV0dXJuIGF3YWl0IGZzVXRpbC5yZWFkRmlsZUlmRXhpc3RzKGZpbGVQYXRoKTtcbiAgfSxcbiAgLyoqXG4gICAqIFJlbW92ZXMgZmlsZVBhdGggKGZvcmNlLCBvcHRpb25hbGx5IHJlY3Vyc2l2ZSkgb25seSB3aGVuIGl0cyBQQVJFTlQgZGlyZWN0b3J5IHJlc29sdmVzIGluc2lkZVxuICAgKiB0aGUgcmVwb3NpdG9yeSwgc28gYSBzeW1saW5rZWQgZGlyZWN0b3J5IChlLmcuIGEgY29tbWl0dGVkIC5naXRodWIvd29ya2Zsb3dzIGxpbmspIGNhbiBuZXZlclxuICAgKiBtYWtlIGNsZWFudXAgZGVsZXRlIGZpbGVzIG91dHNpZGUgdGhlIHJlcG9zaXRvcnkuIFJlbW92aW5nIGEgc3ltbGluayBlbnRyeSBpdHNlbGYgaXMgYWxsb3dlZDpcbiAgICogdGhhdCBkZWxldGVzIG9ubHkgdGhlIGxpbmssIG5ldmVyIGl0cyB0YXJnZXQuIFJldHVybnMgd2hldGhlciB0aGUgcmVtb3ZhbCB3YXMgcGVyZm9ybWVkLlxuICAgKi9cbiAgYXN5bmMgcmVtb3ZlQ29uZmluZWQoZmlsZVBhdGg6IHN0cmluZywgb3B0aW9ucz86IHsgcmVjdXJzaXZlPzogYm9vbGVhbiB9KTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgaWYgKCEoYXdhaXQgaGFzQ29uZmluZWRQYXJlbnQoZmlsZVBhdGgpKSkge1xuICAgICAgY29uc29sZS53YXJuKGBTa2lwcGVkIHJlbW92aW5nICR7ZmlsZVBhdGh9IGJlY2F1c2UgaXQgcmVzb2x2ZXMgb3V0c2lkZSB0aGUgcmVwb3NpdG9yeS5gKTtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgYXdhaXQgZnMucHJvbWlzZXMucm0oZmlsZVBhdGgsIHsgZm9yY2U6IHRydWUsIHJlY3Vyc2l2ZTogb3B0aW9ucz8ucmVjdXJzaXZlID8/IGZhbHNlIH0pO1xuICAgIHJldHVybiB0cnVlO1xuICB9LFxuICAvKiogV3JpdGVzIGNvbnRlbnQgdmVyYmF0aW0sIGFwcGx5aW5nIHRoZSBzYW1lIHN5bWxpbmsvcmVwb3NpdG9yeS1jb250YWlubWVudCBndWFyZHMgYXMgZ2VuZXJhdGVGaWxlLiAqL1xuICBhc3luYyB3cml0ZUZpbGVDb25maW5lZChmaWxlUGF0aDogc3RyaW5nLCBjb250ZW50OiBzdHJpbmcpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICBpZiAoIShhd2FpdCBpc0NvbmZpbmVkV3JpdGFibGVQYXRoKGZpbGVQYXRoKSkpIHJldHVybiBmYWxzZTtcbiAgICBhd2FpdCBmcy5wcm9taXNlcy53cml0ZUZpbGUoZmlsZVBhdGgsIGNvbnRlbnQpO1xuICAgIHJldHVybiB0cnVlO1xuICB9LFxuICAvKiogUmV0dXJucyB3aGV0aGVyIHRoZSBmaWxlIHdhcyBhY3R1YWxseSBnZW5lcmF0ZWQgKGZhbHNlIHdoZW4gdGhlIGNvbmZpbmVtZW50IGd1YXJkcyBza2lwIGl0KS4gKi9cbiAgYXN5bmMgZ2VuZXJhdGVGaWxlKGZpbGVQYXRoOiBzdHJpbmcsIGNvbnRlbnQ6IHN0cmluZywgbGluZUVuZGluZzogJ1xcbicgfCAnXFxyXFxuJyA9ICdcXG4nKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgaWYgKCEoYXdhaXQgaXNDb25maW5lZFdyaXRhYmxlUGF0aChmaWxlUGF0aCkpKSByZXR1cm4gZmFsc2U7XG4gICAgYXdhaXQgZnMucHJvbWlzZXMubWtkaXIocGF0aC5kaXJuYW1lKGZpbGVQYXRoKSwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gICAgLy8gYHRyaW1gIHRyZWF0cyBhIEJPTSBhcyB3aGl0ZXNwYWNlLCBzbyBpdCBpcyByZWF0dGFjaGVkIGF0IHBvc2l0aW9uIDA6IGRyb3BwaW5nIGl0IHdvdWxkXG4gICAgLy8gcmV3cml0ZSB0aGUgZW5jb2RpbmcgbWFya2VyIG9mIGEgZmlsZSB0aGUgZ2VuZXJhdG9yIHdhcyBvbmx5IGFza2VkIHRvIHVwZGF0ZS5cbiAgICBjb25zdCBieXRlT3JkZXJNYXJrID0gY29udGVudC5zdGFydHNXaXRoKCfvu78nKSA/ICfvu78nIDogJyc7XG4gICAgbGV0IG5vcm1hbGl6ZWRDb250ZW50ID0gY29udGVudC50cmltKCk7XG4gICAgaWYgKG5vcm1hbGl6ZWRDb250ZW50KSB7XG4gICAgICBub3JtYWxpemVkQ29udGVudCA9IGAke2J5dGVPcmRlck1hcmt9JHtub3JtYWxpemVkQ29udGVudH0ke2xpbmVFbmRpbmd9YDtcbiAgICB9XG4gICAgYXdhaXQgZnMucHJvbWlzZXMud3JpdGVGaWxlKGZpbGVQYXRoLCBub3JtYWxpemVkQ29udGVudCk7XG4gICAgY29uc29sZS5sb2coYEdlbmVyYXRlZC9VcGRhdGVkICR7ZmlsZVBhdGh9YCk7XG4gICAgcmV0dXJuIHRydWU7XG4gIH0sXG59O1xuXG5hc3luYyBmdW5jdGlvbiBpc0NvbmZpbmVkV3JpdGFibGVQYXRoKGZpbGVQYXRoOiBzdHJpbmcpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgLy8gTmV2ZXIgd3JpdGUgdGhyb3VnaCBhIHN5bWxpbms6IGEgKHBvc3NpYmx5IGRhbmdsaW5nKSBsaW5rIGNvbW1pdHRlZCBpbiB0aGUgdGFyZ2V0IHJlcG9zaXRvcnlcbiAgLy8gY291bGQgcmVkaXJlY3QgdGhlIHdyaXRlIG91dHNpZGUgaXQuXG4gIGNvbnN0IHN0YXRzID0gYXdhaXQgZnMucHJvbWlzZXMubHN0YXQoZmlsZVBhdGgpLmNhdGNoKCgpID0+IHt9KTtcbiAgaWYgKHN0YXRzPy5pc1N5bWJvbGljTGluaygpKSB7XG4gICAgY29uc29sZS53YXJuKGBTa2lwcGVkIHdyaXRpbmcgJHtmaWxlUGF0aH0gYmVjYXVzZSBpdCBpcyBhIHN5bWJvbGljIGxpbmsuYCk7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIGlmICghKGF3YWl0IGhhc0NvbmZpbmVkUGFyZW50KGZpbGVQYXRoKSkpIHtcbiAgICBjb25zb2xlLndhcm4oYFNraXBwZWQgd3JpdGluZyAke2ZpbGVQYXRofSBiZWNhdXNlIGl0IHJlc29sdmVzIG91dHNpZGUgdGhlIHJlcG9zaXRvcnkuYCk7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIHJldHVybiB0cnVlO1xufVxuXG4vLyBBIHN5bWxpbmtlZCBwYXJlbnQgZGlyZWN0b3J5IHdvdWxkIHJlZGlyZWN0IHJlYWRzLCB3cml0ZXMsIGFuZCByZW1vdmFscyBvdXRzaWRlIHRoZSByZXBvc2l0b3J5LFxuLy8gc28gcmVxdWlyZSB0aGUgY2xvc2VzdCBleGlzdGluZyBhbmNlc3RvciB0byByZXNvbHZlIGluc2lkZSB0aGUgcm9vdCBzZXQgYnkgdGhlIENMSSBlbnRyeSBwb2ludC5cbmFzeW5jIGZ1bmN0aW9uIGhhc0NvbmZpbmVkUGFyZW50KGZpbGVQYXRoOiBzdHJpbmcpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgaWYgKHJlYWxSb290RGlyUGF0aCA9PT0gdW5kZWZpbmVkKSByZXR1cm4gdHJ1ZTtcbiAgbGV0IGFuY2VzdG9yUGF0aCA9IHBhdGguZGlybmFtZShmaWxlUGF0aCk7XG4gIHdoaWxlICghZnMuZXhpc3RzU3luYyhhbmNlc3RvclBhdGgpKSB7XG4gICAgYW5jZXN0b3JQYXRoID0gcGF0aC5kaXJuYW1lKGFuY2VzdG9yUGF0aCk7XG4gIH1cbiAgY29uc3QgcmVhbEFuY2VzdG9yUGF0aCA9IGF3YWl0IGZzLnByb21pc2VzLnJlYWxwYXRoKGFuY2VzdG9yUGF0aCk7XG4gIHJldHVybiByZWFsQW5jZXN0b3JQYXRoID09PSByZWFsUm9vdERpclBhdGggfHwgcmVhbEFuY2VzdG9yUGF0aC5zdGFydHNXaXRoKHJlYWxSb290RGlyUGF0aCArIHBhdGguc2VwKTtcbn1cbiIsImltcG9ydCB7IFByb21pc2VQb29sIH0gZnJvbSAnbWluaW1hbC1wcm9taXNlLXBvb2wnO1xuXG5leHBvcnQgY29uc3QgcHJvbWlzZVBvb2wgPSBuZXcgUHJvbWlzZVBvb2woKTtcbiIsImltcG9ydCB7IEFQSSB9IGZyb20gJ3R5cGVzY3JpcHQvdW5zdGFibGUvYXN5bmMnO1xuaW1wb3J0IHR5cGUgeyBTb3VyY2VGaWxlIH0gZnJvbSAndHlwZXNjcmlwdC91bnN0YWJsZS9hc3QnO1xuXG4vLyBUeXBlU2NyaXB0IDcgc2hpcHMgdGhlIG5hdGl2ZSAoR28pIGNvbXBpbGVyIGFzIHRoZSBgdHlwZXNjcmlwdGAgcGFja2FnZSBhbmQgbm9cbi8vIGxvbmdlciBleHBvc2VzIGFuIGluLXByb2Nlc3MgcGFyc2VyIHN1Y2ggYXMgYHRzLmNyZWF0ZVNvdXJjZUZpbGVgLiBQYXJzaW5nIG5vd1xuLy8gaGFwcGVucyBpbiBhIHNwYXduZWQgY29tcGlsZXIgc2VydmVyIHJlYWNoZWQgdGhyb3VnaCB0aGUgYXN5bmNocm9ub3VzIEFQSSwgc28gd2Vcbi8vIGtlZXAgYSBzaW5nbGUgbGF6aWx5LWNyZWF0ZWQgaW5zdGFuY2UgYW5kIHJldXNlIGl0IGFjcm9zcyBldmVyeSBmaXhlciB0byBhdm9pZFxuLy8gcGF5aW5nIHRoZSBwcm9jZXNzLXNwYXduIGNvc3QgcGVyIGZpbGUuXG5sZXQgYXBpOiBBUEkgfCB1bmRlZmluZWQ7XG5sZXQgY29ubmVjdGVkOiBQcm9taXNlPHVua25vd24+IHwgdW5kZWZpbmVkO1xuXG4vKipcbiAqIFBhcnNlcyBhIHNvdXJjZSBmaWxlIGludG8gYSBUeXBlU2NyaXB0IEFTVCB1c2luZyB0aGUgYnVuZGxlZCBuYXRpdmUgY29tcGlsZXIuXG4gKiBSZXR1cm5zIGB1bmRlZmluZWRgIHdoZW4gdGhlIGNvbXBpbGVyIGNhbm5vdCBsb2FkIHRoZSBmaWxlIChlLmcuIGl0IGlzIG1pc3NpbmdcbiAqIG9yIHVucGFyc2FibGUpIHNvIGNhbGxlcnMgY2FuIGZhbGwgYmFjayB0byBjb25zZXJ2YXRpdmUgYmVoYXZpb3IuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBwYXJzZVNvdXJjZUZpbGUoZmlsZVBhdGg6IHN0cmluZyk6IFByb21pc2U8U291cmNlRmlsZSB8IHVuZGVmaW5lZD4ge1xuICB0cnkge1xuICAgIGNvbnN0IGFwaSA9IGF3YWl0IGdldEFwaSgpO1xuICAgIGNvbnN0IHNuYXBzaG90ID0gYXdhaXQgYXBpLnVwZGF0ZVNuYXBzaG90KHsgb3BlbkZpbGVzOiBbZmlsZVBhdGhdIH0pO1xuICAgIGNvbnN0IHByb2plY3QgPSBhd2FpdCBzbmFwc2hvdC5nZXREZWZhdWx0UHJvamVjdEZvckZpbGUoZmlsZVBhdGgpO1xuICAgIHJldHVybiBhd2FpdCBwcm9qZWN0Py5wcm9ncmFtLmdldFNvdXJjZUZpbGUoZmlsZVBhdGgpO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG59XG5cbi8qKlxuICogU2h1dHMgZG93biB0aGUgc3Bhd25lZCBjb21waWxlciBzZXJ2ZXIuIFRoZSBzZXJ2ZXIga2VlcHMgYW4gb3BlbiBJUEMgY2hhbm5lbFxuICogdGhhdCB3b3VsZCBvdGhlcndpc2Uga2VlcCB0aGUgcnVudGltZSBldmVudCBsb29wIGFsaXZlLCBzbyB3YmZ5IG11c3QgY2FsbCB0aGlzXG4gKiBvbmNlIGl0cyBydW4gZmluaXNoZXMgZm9yIHRoZSBwcm9jZXNzIHRvIGV4aXQuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBkaXNwb3NlVHlwZVNjcmlwdEFwaSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgYXdhaXQgYXBpPy5jbG9zZSgpO1xuICBhcGkgPSB1bmRlZmluZWQ7XG4gIGNvbm5lY3RlZCA9IHVuZGVmaW5lZDtcbn1cblxuYXN5bmMgZnVuY3Rpb24gZ2V0QXBpKCk6IFByb21pc2U8QVBJPiB7XG4gIGFwaSA/Pz0gbmV3IEFQSSh7IGN3ZDogcHJvY2Vzcy5jd2QoKSB9KTtcbiAgLy8gVGhlIGNsaWVudCBtYXJrcyBpdHNlbGYgY29ubmVjdGVkIG9ubHkgb25jZSBpdHMgZmlyc3Qgc3Bhd24gY29tcGxldGVzLCBzbyBjb25jdXJyZW50XG4gIC8vIGZpcnN0IHJlcXVlc3RzICh0aGUgZml4ZXJzIHJ1biBpbiBwYXJhbGxlbCkgd291bGQgZWFjaCBzcGF3biBhIGNvbXBpbGVyIHNlcnZlcjsgdGhlXG4gIC8vIGV4dHJhIHNlcnZlcnMgYXJlIG5ldmVyIGNsb3NlZCBhbmQga2VlcCB0aGUgcHJvY2VzcyBhbGl2ZSBhZnRlciBgZGlzcG9zZVR5cGVTY3JpcHRBcGlgLlxuICAvLyBUaGUgZmlyc3QgcmVxdWVzdCBpcyB0aGVyZWZvcmUgYXdhaXRlZCBvbmNlIGJlZm9yZSBhbnkgb3RoZXIgaXMgc2VudDsgYSBmYWlsZWQgb25lIGlzXG4gIC8vIGZvcmdvdHRlbiBzbyB0aGF0IHRoZSBuZXh0IHJlcXVlc3QgY29ubmVjdHMgYWdhaW4gaW5zdGVhZCBvZiBmYWlsaW5nIGZvciB0aGUgd2hvbGUgcnVuLlxuICBjb25uZWN0ZWQgPz89IGFwaS51cGRhdGVTbmFwc2hvdCgpLmNhdGNoKChlcnJvcjogdW5rbm93bikgPT4ge1xuICAgIGNvbm5lY3RlZCA9IHVuZGVmaW5lZDtcbiAgICB0aHJvdyBlcnJvcjtcbiAgfSk7XG4gIGF3YWl0IGNvbm5lY3RlZDtcbiAgcmV0dXJuIGFwaTtcbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCAqIGFzIGFzdCBmcm9tICd0eXBlc2NyaXB0L3Vuc3RhYmxlL2FzdCc7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGZzVXRpbCB9IGZyb20gJy4uL3V0aWxzL2ZzVXRpbC5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcbmltcG9ydCB7IHBhcnNlU291cmNlRmlsZSB9IGZyb20gJy4uL3V0aWxzL3R5cGVzY3JpcHRBcGkuanMnO1xuXG4vLyBTZXR0aW5ncyBldmVyeSBXaWxsQm9vc3RlciBOZXh0LmpzIHByb2plY3Qgc2hvdWxkIGNhcnJ5LiBgbmFtZWAgaXMgdGhlIHRvcC1sZXZlbFxuLy8gcHJvcGVydHkga2V5IHVzZWQgdG8gZGV0ZWN0IHdoZXRoZXIgdGhlIHNldHRpbmcgYWxyZWFkeSBleGlzdHM7IGB0ZXh0YCBpcyBpbnNlcnRlZFxuLy8gdmVyYmF0aW0gKGEgd2hvbGUgYGtleTogdmFsdWVgIHBhaXIpIHdoZW4gdGhlIGtleSBpcyBtaXNzaW5nLlxuY29uc3QgbWFuYWdlZFByb3BlcnRpZXM6IHJlYWRvbmx5IHsgbmFtZTogc3RyaW5nOyB0ZXh0OiBzdHJpbmcgfVtdID0gW1xuICB7IG5hbWU6ICdyZWFjdENvbXBpbGVyJywgdGV4dDogJ3JlYWN0Q29tcGlsZXI6IHRydWUnIH0sXG4gIHsgbmFtZTogJ3JlYWN0U3RyaWN0TW9kZScsIHRleHQ6ICdyZWFjdFN0cmljdE1vZGU6IHRydWUnIH0sXG4gIHsgbmFtZTogJ3R5cGVzY3JpcHQnLCB0ZXh0OiAndHlwZXNjcmlwdDogeyBpZ25vcmVCdWlsZEVycm9yczogdHJ1ZSB9JyB9LFxuXTtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGZpeE5leHRDb25maWdKc29uKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2ZpeE5leHRDb25maWdKc29uJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IGZpbGVQYXRoID0gWyd0cycsICdtdHMnLCAnY3RzJywgJ2pzJywgJ21qcycsICdjanMnXVxuICAgICAgLm1hcCgoZXh0KSA9PiBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsIGBuZXh0LmNvbmZpZy4ke2V4dH1gKSlcbiAgICAgIC5maW5kKChwKSA9PiBmcy5leGlzdHNTeW5jKHApKTtcbiAgICBpZiAoIWZpbGVQYXRoKSByZXR1cm47XG5cbiAgICBjb25zdCBleHRyYWN0ZWQgPSBhd2FpdCBnZXROZXh0Q29uZmlnT2JqZWN0TGl0ZXJhbChmaWxlUGF0aCk7XG4gICAgaWYgKCFleHRyYWN0ZWQpIHJldHVybjtcbiAgICBjb25zdCB7IHNvdXJjZSwgb2JqZWN0TGl0ZXJhbCB9ID0gZXh0cmFjdGVkO1xuXG4gICAgLy8gYHByb3BlcnRpZXNgIGluY2x1ZGVzIHNwcmVhZCBhc3NpZ25tZW50cyAoYC4uLnJlc3RgKSB0aGF0IGNhcnJ5IG5vIG5hbWUsIHNvIGd1YXJkIGJlZm9yZSByZWFkaW5nIGl0LlxuICAgIGNvbnN0IGV4aXN0aW5nUHJvcGVydGllcyA9IG5ldyBTZXQoXG4gICAgICBvYmplY3RMaXRlcmFsLnByb3BlcnRpZXMubWFwKChwcm9wZXJ0eSkgPT5cbiAgICAgICAgJ25hbWUnIGluIHByb3BlcnR5ICYmIHByb3BlcnR5Lm5hbWUgPyBnZXRQcm9wZXJ0eUtleShwcm9wZXJ0eS5uYW1lLCBzb3VyY2UpIDogdW5kZWZpbmVkXG4gICAgICApXG4gICAgKTtcbiAgICBjb25zdCBwcm9wZXJ0eVRleHRzID0gbWFuYWdlZFByb3BlcnRpZXNcbiAgICAgIC5maWx0ZXIoKHByb3BlcnR5KSA9PiAhZXhpc3RpbmdQcm9wZXJ0aWVzLmhhcyhwcm9wZXJ0eS5uYW1lKSlcbiAgICAgIC5tYXAoKHByb3BlcnR5KSA9PiBwcm9wZXJ0eS50ZXh0KTtcbiAgICBpZiAocHJvcGVydHlUZXh0cy5sZW5ndGggPT09IDApIHJldHVybjtcblxuICAgIGNvbnN0IG9sZENvbnRlbnQgPSBzb3VyY2UudGV4dDtcbiAgICBjb25zdCBpbnNlcnRpb25Qb2ludCA9IG9iamVjdExpdGVyYWwuZ2V0RW5kKCkgLSAxO1xuICAgIC8vIFRoZSBuYXRpdmUgVFMgQVNUIGRvZXMgbm90IHJlbGlhYmx5IGV4cG9zZSBgcHJvcGVydGllcy5oYXNUcmFpbGluZ0NvbW1hYCwgc28gc2NhbiB0aGUgc291cmNlXG4gICAgLy8gYmV0d2VlbiB0aGUgbGFzdCBwcm9wZXJ0eSBhbmQgdGhlIGNsb3NpbmcgYnJhY2UuIFN0cmlwIGNvbW1lbnRzIGZpcnN0IHNvIGEgY29tbWEgaW5zaWRlIGFcbiAgICAvLyB0cmFpbGluZyBjb21tZW50IChlLmcuIGBmb286IDEgLy8gYSwgYmApIGlzIG5vdCBtaXN0YWtlbiBmb3IgYSByZWFsIHRyYWlsaW5nIGNvbW1hLlxuICAgIGNvbnN0IGxhc3RQcm9wZXJ0eSA9IG9iamVjdExpdGVyYWwucHJvcGVydGllcy5hdCgtMSk7XG4gICAgY29uc3QgaGFzVHJhaWxpbmdDb21tYSA9IGxhc3RQcm9wZXJ0eVxuICAgICAgPyBzdHJpcENvbW1lbnRzKG9sZENvbnRlbnQuc2xpY2UobGFzdFByb3BlcnR5LmdldEVuZCgpLCBpbnNlcnRpb25Qb2ludCkpLmluY2x1ZGVzKCcsJylcbiAgICAgIDogZmFsc2U7XG4gICAgY29uc3QgcHJlZml4ID0gb2JqZWN0TGl0ZXJhbC5wcm9wZXJ0aWVzLmxlbmd0aCA+IDAgJiYgIWhhc1RyYWlsaW5nQ29tbWEgPyAnLCAnIDogJyc7XG4gICAgY29uc3QgbmV3Q29udGVudCA9IGAke29sZENvbnRlbnQuc2xpY2UoMCwgaW5zZXJ0aW9uUG9pbnQpfSR7cHJlZml4fSR7cHJvcGVydHlUZXh0cy5qb2luKCcsICcpfSR7b2xkQ29udGVudC5zbGljZShcbiAgICAgIGluc2VydGlvblBvaW50XG4gICAgKX1gO1xuICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiBmc1V0aWwuZ2VuZXJhdGVGaWxlKGZpbGVQYXRoLCBuZXdDb250ZW50KSk7XG4gIH0pO1xufVxuXG5hc3luYyBmdW5jdGlvbiBnZXROZXh0Q29uZmlnT2JqZWN0TGl0ZXJhbChcbiAgZmlsZVBhdGg6IHN0cmluZ1xuKTogUHJvbWlzZTx7IHNvdXJjZTogYXN0LlNvdXJjZUZpbGU7IG9iamVjdExpdGVyYWw6IGFzdC5PYmplY3RMaXRlcmFsRXhwcmVzc2lvbiB9IHwgdW5kZWZpbmVkPiB7XG4gIGNvbnN0IHNvdXJjZSA9IGF3YWl0IHBhcnNlU291cmNlRmlsZShmaWxlUGF0aCk7XG4gIGlmICghc291cmNlKSByZXR1cm4gdW5kZWZpbmVkO1xuXG4gIC8vIFRoZSBXaWxsQm9vc3RlciBzdGFuZGFyZCBkZWNsYXJlcyB0aGUgY29uZmlnIGFzIGBjb25zdCBuZXh0Q29uZmlnOiBOZXh0Q29uZmlnID0geyAuLi4gfWAgYW5kXG4gIC8vIGV4cG9ydHMgaXQgKHBvc3NpYmx5IHdyYXBwZWQsIGUuZy4gYHdpdGhTZW50cnlDb25maWcoLi4uKWApLCBzbyB0aGUgb2JqZWN0IGxpdGVyYWwgaXMgcmFyZWx5XG4gIC8vIHRoZSBkaXJlY3Qgb3BlcmFuZCBvZiBgZXhwb3J0IGRlZmF1bHRgL2Btb2R1bGUuZXhwb3J0c2AuIENvbGxlY3QgZXZlcnkgY2FuZGlkYXRlIGFuZCBwaWNrIHRoZVxuICAvLyBtb3N0IGF1dGhvcml0YXRpdmUgb25lIGJlbG93LlxuICBsZXQgZGlyZWN0T2JqZWN0TGl0ZXJhbDogYXN0Lk9iamVjdExpdGVyYWxFeHByZXNzaW9uIHwgdW5kZWZpbmVkO1xuICBsZXQgZXhwb3J0ZWRJZGVudGlmaWVyOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gIGNvbnN0IHZhcmlhYmxlT2JqZWN0TGl0ZXJhbHMgPSBuZXcgTWFwPHN0cmluZywgYXN0Lk9iamVjdExpdGVyYWxFeHByZXNzaW9uPigpO1xuICBjb25zdCB0eXBlZENvbmZpZ09iamVjdExpdGVyYWxzOiBhc3QuT2JqZWN0TGl0ZXJhbEV4cHJlc3Npb25bXSA9IFtdO1xuXG4gIGNvbnN0IHZpc2l0ID0gKG5vZGU6IGFzdC5Ob2RlKTogdm9pZCA9PiB7XG4gICAgaWYgKGFzdC5pc0V4cG9ydEFzc2lnbm1lbnQobm9kZSkpIHtcbiAgICAgIGNvbnN0IG9iamVjdExpdGVyYWwgPSB1bndyYXBPYmplY3RMaXRlcmFsKG5vZGUuZXhwcmVzc2lvbik7XG4gICAgICBpZiAob2JqZWN0TGl0ZXJhbCkge1xuICAgICAgICBkaXJlY3RPYmplY3RMaXRlcmFsID8/PSBvYmplY3RMaXRlcmFsO1xuICAgICAgfSBlbHNlIGlmIChhc3QuaXNJZGVudGlmaWVyKG5vZGUuZXhwcmVzc2lvbikpIHtcbiAgICAgICAgZXhwb3J0ZWRJZGVudGlmaWVyID8/PSBub2RlLmV4cHJlc3Npb24uZ2V0VGV4dChzb3VyY2UpO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoXG4gICAgICBhc3QuaXNCaW5hcnlFeHByZXNzaW9uKG5vZGUpICYmXG4gICAgICBub2RlLm9wZXJhdG9yVG9rZW4ua2luZCA9PT0gYXN0LlN5bnRheEtpbmQuRXF1YWxzVG9rZW4gJiZcbiAgICAgIG5vZGUubGVmdC5nZXRUZXh0KHNvdXJjZSkgPT09ICdtb2R1bGUuZXhwb3J0cydcbiAgICApIHtcbiAgICAgIGNvbnN0IG9iamVjdExpdGVyYWwgPSB1bndyYXBPYmplY3RMaXRlcmFsKG5vZGUucmlnaHQpO1xuICAgICAgaWYgKG9iamVjdExpdGVyYWwpIHtcbiAgICAgICAgZGlyZWN0T2JqZWN0TGl0ZXJhbCA/Pz0gb2JqZWN0TGl0ZXJhbDtcbiAgICAgIH0gZWxzZSBpZiAoYXN0LmlzSWRlbnRpZmllcihub2RlLnJpZ2h0KSkge1xuICAgICAgICBleHBvcnRlZElkZW50aWZpZXIgPz89IG5vZGUucmlnaHQuZ2V0VGV4dChzb3VyY2UpO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoYXN0LmlzVmFyaWFibGVEZWNsYXJhdGlvbihub2RlKSAmJiBub2RlLmluaXRpYWxpemVyKSB7XG4gICAgICBjb25zdCBvYmplY3RMaXRlcmFsID0gdW53cmFwT2JqZWN0TGl0ZXJhbChub2RlLmluaXRpYWxpemVyKTtcbiAgICAgIGlmIChvYmplY3RMaXRlcmFsICYmIGFzdC5pc0lkZW50aWZpZXIobm9kZS5uYW1lKSkge1xuICAgICAgICB2YXJpYWJsZU9iamVjdExpdGVyYWxzLnNldChub2RlLm5hbWUuZ2V0VGV4dChzb3VyY2UpLCBvYmplY3RMaXRlcmFsKTtcbiAgICAgICAgLy8gVGhlIGA6IE5leHRDb25maWdgIGFubm90YXRpb24gd2JmeSB3cml0ZXMgbWFya3MgdGhlIGNhbm9uaWNhbCBjb25maWcgb2JqZWN0IChhY2NlcHRpbmdcbiAgICAgICAgLy8gcXVhbGlmaWVkIG5hbWVzIHN1Y2ggYXMgYGltcG9ydCgnbmV4dCcpLk5leHRDb25maWdgKS5cbiAgICAgICAgY29uc3QgYW5ub3RhdGlvblR5cGUgPSBub2RlLnR5cGU/LmdldFRleHQoc291cmNlKTtcbiAgICAgICAgaWYgKGFubm90YXRpb25UeXBlICE9PSB1bmRlZmluZWQgJiYgaXNOZXh0Q29uZmlnVHlwZShhbm5vdGF0aW9uVHlwZSkpIHtcbiAgICAgICAgICB0eXBlZENvbmZpZ09iamVjdExpdGVyYWxzLnB1c2gob2JqZWN0TGl0ZXJhbCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgbm9kZS5mb3JFYWNoQ2hpbGQodmlzaXQpO1xuICB9O1xuICBzb3VyY2UuZm9yRWFjaENoaWxkKHZpc2l0KTtcblxuICBjb25zdCBvYmplY3RMaXRlcmFsID1cbiAgICB0eXBlZENvbmZpZ09iamVjdExpdGVyYWxzWzBdID8/XG4gICAgZGlyZWN0T2JqZWN0TGl0ZXJhbCA/P1xuICAgIChleHBvcnRlZElkZW50aWZpZXIgPyB2YXJpYWJsZU9iamVjdExpdGVyYWxzLmdldChleHBvcnRlZElkZW50aWZpZXIpIDogdW5kZWZpbmVkKSA/P1xuICAgIHZhcmlhYmxlT2JqZWN0TGl0ZXJhbHMuZ2V0KCduZXh0Q29uZmlnJyk7XG4gIHJldHVybiBvYmplY3RMaXRlcmFsID8geyBzb3VyY2UsIG9iamVjdExpdGVyYWwgfSA6IHVuZGVmaW5lZDtcbn1cblxuZnVuY3Rpb24gdW53cmFwT2JqZWN0TGl0ZXJhbChub2RlOiBhc3QuRXhwcmVzc2lvbik6IGFzdC5PYmplY3RMaXRlcmFsRXhwcmVzc2lvbiB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IGN1cnJlbnQgPSB1bndyYXBQYXJlbnRoZXNlcyhub2RlKTtcbiAgcmV0dXJuIGFzdC5pc09iamVjdExpdGVyYWxFeHByZXNzaW9uKGN1cnJlbnQpID8gY3VycmVudCA6IHVuZGVmaW5lZDtcbn1cblxuZnVuY3Rpb24gdW53cmFwUGFyZW50aGVzZXMobm9kZTogYXN0LkV4cHJlc3Npb24pOiBhc3QuRXhwcmVzc2lvbiB7XG4gIGxldCBjdXJyZW50ID0gbm9kZTtcbiAgd2hpbGUgKGFzdC5pc1BhcmVudGhlc2l6ZWRFeHByZXNzaW9uKGN1cnJlbnQpKSB7XG4gICAgY3VycmVudCA9IGN1cnJlbnQuZXhwcmVzc2lvbjtcbiAgfVxuICByZXR1cm4gY3VycmVudDtcbn1cblxuLy8gTWF0Y2ggYm90aCB0aGUgYmFyZSBgTmV4dENvbmZpZ2AgYW5kIHF1YWxpZmllZCBmb3JtcyBsaWtlIGBpbXBvcnQoJ25leHQnKS5OZXh0Q29uZmlnYC5cbmZ1bmN0aW9uIGlzTmV4dENvbmZpZ1R5cGUodHlwZVRleHQ6IHN0cmluZyk6IGJvb2xlYW4ge1xuICByZXR1cm4gdHlwZVRleHQgPT09ICdOZXh0Q29uZmlnJyB8fCB0eXBlVGV4dC5lbmRzV2l0aCgnLk5leHRDb25maWcnKTtcbn1cblxuLy8gUmV0dXJuIGEgcHJvcGVydHkga2V5IHdpdGhvdXQgc3Vycm91bmRpbmcgcXVvdGVzLCBzbyBgJ3JlYWN0Q29tcGlsZXInYCBtYXRjaGVzIGByZWFjdENvbXBpbGVyYC5cbi8vIElkZW50aWZpZXIsIHN0cmluZy1saXRlcmFsIGFuZCBudW1lcmljLWxpdGVyYWwgbmFtZXMgYWxsIGV4cG9zZSB0aGUgdW5xdW90ZWQgdmFsdWUgdmlhIGAudGV4dGAuXG5mdW5jdGlvbiBnZXRQcm9wZXJ0eUtleShuYW1lOiBhc3QuUHJvcGVydHlOYW1lLCBzb3VyY2U6IGFzdC5Tb3VyY2VGaWxlKTogc3RyaW5nIHtcbiAgcmV0dXJuICd0ZXh0JyBpbiBuYW1lICYmIHR5cGVvZiBuYW1lLnRleHQgPT09ICdzdHJpbmcnID8gbmFtZS50ZXh0IDogbmFtZS5nZXRUZXh0KHNvdXJjZSk7XG59XG5cbmZ1bmN0aW9uIHN0cmlwQ29tbWVudHModGV4dDogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIHRleHQucmVwbGFjZUFsbCgvXFwvXFwvW15cXG5dKnxcXC9cXCpbXFxzXFxTXSo/XFwqXFwvL2csICcnKTtcbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzL3Byb21pc2VzJztcblxuaW1wb3J0IGZnIGZyb20gJ2Zhc3QtZ2xvYic7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGZzVXRpbCB9IGZyb20gJy4uL3V0aWxzL2ZzVXRpbC5qcyc7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBmaXhDaGFrcmFUb2FzdGVyKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2ZpeENoYWtyYVRvYXN0ZXInLCBhc3luYyAoKSA9PiB7XG4gICAgaWYgKCFjb25maWcuZGVwZW5kaW5nLmNoYWtyYSkgcmV0dXJuO1xuXG4gICAgY29uc3QgZmlsZVBhdGhzID0gYXdhaXQgZmcuZ2xvYignKiovdG9hc3Rlci57dHMsdHN4fScsIHtcbiAgICAgIGFic29sdXRlOiB0cnVlLFxuICAgICAgY3dkOiBjb25maWcuZGlyUGF0aCxcbiAgICAgIGlnbm9yZTogWycqKi8uKi8qKicsICcqKi9ub2RlX21vZHVsZXMvKionXSxcbiAgICB9KTtcbiAgICBmb3IgKGNvbnN0IGZpbGVQYXRoIG9mIGZpbGVQYXRocykge1xuICAgICAgY29uc3QgY29udGVudCA9IGF3YWl0IGZzLnJlYWRGaWxlKGZpbGVQYXRoLCAndXRmOCcpO1xuICAgICAgaWYgKFxuICAgICAgICBjb250ZW50LmluY2x1ZGVzKCdDcmVhdGVUb2FzdGVyUmV0dXJuJykgfHxcbiAgICAgICAgIWNvbnRlbnQuaW5jbHVkZXMoXCJmcm9tICdAY2hha3JhLXVpL3JlYWN0J1wiKSB8fFxuICAgICAgICAhY29udGVudC5pbmNsdWRlcygnZXhwb3J0IGNvbnN0IHRvYXN0ZXIgPSBjcmVhdGVUb2FzdGVyKCcpXG4gICAgICApIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBjb25zdCB1cGRhdGVkQ29udGVudCA9IGNvbnRlbnRcbiAgICAgICAgLnJlcGxhY2UoXG4gICAgICAgICAgL15pbXBvcnQgLiogZnJvbSAnQGNoYWtyYS11aVxcL3JlYWN0JzskL211LFxuICAgICAgICAgIFwiJCZcXG5pbXBvcnQgdHlwZSB7IENyZWF0ZVRvYXN0ZXJSZXR1cm4gfSBmcm9tICdAY2hha3JhLXVpL3JlYWN0JztcIlxuICAgICAgICApXG4gICAgICAgIC5yZXBsYWNlKCdleHBvcnQgY29uc3QgdG9hc3RlciA9IGNyZWF0ZVRvYXN0ZXIoJywgJ2V4cG9ydCBjb25zdCB0b2FzdGVyOiBDcmVhdGVUb2FzdGVyUmV0dXJuID0gY3JlYXRlVG9hc3RlcignKTtcbiAgICAgIGlmICh1cGRhdGVkQ29udGVudCAhPT0gY29udGVudCkgYXdhaXQgZnNVdGlsLmdlbmVyYXRlRmlsZShmaWxlUGF0aCwgdXBkYXRlZENvbnRlbnQpO1xuICAgIH1cbiAgfSk7XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgKiBhcyBhc3QgZnJvbSAndHlwZXNjcmlwdC91bnN0YWJsZS9hc3QnO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBmc1V0aWwgfSBmcm9tICcuLi91dGlscy9mc1V0aWwuanMnO1xuaW1wb3J0IHsgcHJvbWlzZVBvb2wgfSBmcm9tICcuLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5pbXBvcnQgeyBwYXJzZVNvdXJjZUZpbGUgfSBmcm9tICcuLi91dGlscy90eXBlc2NyaXB0QXBpLmpzJztcblxudHlwZSBQYXJzZWRWYWx1ZSA9XG4gIHwgeyBraW5kOiAnYXJyYXknOyB2YWx1ZTogUGFyc2VkVmFsdWVbXSB9XG4gIHwgeyBraW5kOiAnbGl0ZXJhbCc7IHZhbHVlOiBzdHJpbmcgfVxuICB8IHsga2luZDogJ29iamVjdCc7IHZhbHVlOiBQYXJzZWRPYmplY3QgfTtcbnR5cGUgT2JqZWN0TWVtYmVyID0geyBraW5kOiAnZXh0cmEnOyBpbmRleDogbnVtYmVyIH0gfCB7IGtpbmQ6ICdwcm9wZXJ0eSc7IGtleTogc3RyaW5nIH07XG5pbnRlcmZhY2UgUGFyc2VkT2JqZWN0IHtcbiAgZXh0cmFNZW1iZXJzOiBzdHJpbmdbXTtcbiAgbWVtYmVyT3JkZXI6IE9iamVjdE1lbWJlcltdO1xuICBwcm9wZXJ0aWVzOiBSZWNvcmQ8c3RyaW5nLCBQYXJzZWRWYWx1ZT47XG59XG5pbnRlcmZhY2UgRXh0cmFjdGVkT2JqZWN0TGl0ZXJhbCB7XG4gIHNvdXJjZTogYXN0LlNvdXJjZUZpbGU7XG4gIG5vZGU6IGFzdC5PYmplY3RMaXRlcmFsRXhwcmVzc2lvbjtcbn1cbmNvbnN0IGxpdGVyYWwgPSAodmFsdWU6IHN0cmluZyk6IFBhcnNlZFZhbHVlID0+ICh7IGtpbmQ6ICdsaXRlcmFsJywgdmFsdWUgfSk7XG5jb25zdCBhc0FycmF5ID0gKHZhbHVlOiBQYXJzZWRWYWx1ZVtdKTogUGFyc2VkVmFsdWUgPT4gKHsga2luZDogJ2FycmF5JywgdmFsdWUgfSk7XG5jb25zdCBhc09iamVjdCA9IChwcm9wZXJ0aWVzOiBSZWNvcmQ8c3RyaW5nLCBQYXJzZWRWYWx1ZT4sIGV4dHJhTWVtYmVyczogc3RyaW5nW10gPSBbXSk6IFBhcnNlZFZhbHVlID0+ICh7XG4gIGtpbmQ6ICdvYmplY3QnLFxuICB2YWx1ZTogdG9QYXJzZWRPYmplY3QocHJvcGVydGllcywgZXh0cmFNZW1iZXJzKSxcbn0pO1xuXG5mdW5jdGlvbiBjcmVhdGVEZWZhdWx0Q29uZmlnKGNvbmZpZzogUGFja2FnZUNvbmZpZywgc2hvdWxkVXNlQXBwU2VydmVyRGVmYXVsdHM6IGJvb2xlYW4pOiBQYXJzZWRPYmplY3Qge1xuICBjb25zdCB1c2UgPSB0b1BhcnNlZE9iamVjdCh7XG4gICAgdHJhY2U6IGxpdGVyYWwoXCJwcm9jZXNzLmVudi5DSSA/ICdvbi1maXJzdC1yZXRyeScgOiAncmV0YWluLW9uLWZhaWx1cmUnXCIpLFxuICAgIHNjcmVlbnNob3Q6IGxpdGVyYWwoXCJwcm9jZXNzLmVudi5DSSA/ICdvbmx5LW9uLWZhaWx1cmUnIDogJ29uJ1wiKSxcbiAgICB2aWRlbzogbGl0ZXJhbChcInByb2Nlc3MuZW52LkNJID8gJ29uLWZpcnN0LXJldHJ5JyA6ICdyZXRhaW4tb24tZmFpbHVyZSdcIiksXG4gIH0pO1xuXG4gIGlmIChzaG91bGRVc2VBcHBTZXJ2ZXJEZWZhdWx0cykge1xuICAgIHVzZS5wcm9wZXJ0aWVzLmJhc2VVUkwgPSBsaXRlcmFsKCdwcm9jZXNzLmVudi5ORVhUX1BVQkxJQ19CQVNFX1VSTCcpO1xuICAgIHVzZS5tZW1iZXJPcmRlci51bnNoaWZ0KHsga2luZDogJ3Byb3BlcnR5Jywga2V5OiAnYmFzZVVSTCcgfSk7XG4gIH1cblxuICByZXR1cm4gdG9QYXJzZWRPYmplY3Qoe1xuICAgIGZvcmJpZE9ubHk6IGxpdGVyYWwoJyEhcHJvY2Vzcy5lbnYuQ0knKSxcbiAgICByZXRyaWVzOiBsaXRlcmFsKCdwcm9jZXNzLmVudi5QV0RFQlVHID8gMCA6IHByb2Nlc3MuZW52LkNJID8gNSA6IDEnKSxcbiAgICB1c2U6IHsga2luZDogJ29iamVjdCcsIHZhbHVlOiB1c2UgfSxcbiAgICAuLi4oc2hvdWxkVXNlQXBwU2VydmVyRGVmYXVsdHNcbiAgICAgID8ge1xuICAgICAgICAgIHdlYlNlcnZlcjogYXNPYmplY3Qoe1xuICAgICAgICAgICAgY29tbWFuZDogbGl0ZXJhbChnZXRXYlN0YXJ0VGVzdENvbW1hbmQoKSksXG4gICAgICAgICAgICB1cmw6IGxpdGVyYWwoJ3Byb2Nlc3MuZW52Lk5FWFRfUFVCTElDX0JBU0VfVVJMJyksXG4gICAgICAgICAgICByZXVzZUV4aXN0aW5nU2VydmVyOiBsaXRlcmFsKCchIXByb2Nlc3MuZW52LkNJJyksXG4gICAgICAgICAgICB0aW1lb3V0OiBsaXRlcmFsKCczMDBfMDAwJyksXG4gICAgICAgICAgICBzdGRvdXQ6IGxpdGVyYWwoXCIncGlwZSdcIiksXG4gICAgICAgICAgICBzdGRlcnI6IGxpdGVyYWwoXCIncGlwZSdcIiksXG4gICAgICAgICAgICBlbnY6IGxpdGVyYWwoYHtcbiAgLi4ucHJvY2Vzcy5lbnYsXG4gIFBSSVNNQV9VU0VSX0NPTlNFTlRfRk9SX0RBTkdFUk9VU19BSV9BQ1RJT046ICd0cnVlJyxcbn1gKSxcbiAgICAgICAgICAgIGdyYWNlZnVsU2h1dGRvd246IGxpdGVyYWwoYHtcbiAgc2lnbmFsOiAnU0lHVEVSTScsXG4gIHRpbWVvdXQ6IDUwMCxcbn1gKSxcbiAgICAgICAgICB9KSxcbiAgICAgICAgfVxuICAgICAgOiB7fSksXG4gIH0pO1xufVxuXG5mdW5jdGlvbiB0b1BhcnNlZE9iamVjdChwcm9wZXJ0aWVzOiBSZWNvcmQ8c3RyaW5nLCBQYXJzZWRWYWx1ZT4sIGV4dHJhTWVtYmVyczogc3RyaW5nW10gPSBbXSk6IFBhcnNlZE9iamVjdCB7XG4gIHJldHVybiB7XG4gICAgZXh0cmFNZW1iZXJzLFxuICAgIG1lbWJlck9yZGVyOiBbXG4gICAgICAuLi5PYmplY3Qua2V5cyhwcm9wZXJ0aWVzKS5tYXAoKGtleSk6IE9iamVjdE1lbWJlciA9PiAoeyBraW5kOiAncHJvcGVydHknLCBrZXkgfSkpLFxuICAgICAgLi4uZXh0cmFNZW1iZXJzLm1hcCgoXywgaW5kZXgpOiBPYmplY3RNZW1iZXIgPT4gKHsga2luZDogJ2V4dHJhJywgaW5kZXggfSkpLFxuICAgIF0sXG4gICAgcHJvcGVydGllcyxcbiAgfTtcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGZpeFBsYXl3cmlnaHRDb25maWcoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCBgcGxheXdyaWdodC5jb25maWcudHNgKTtcbiAgaWYgKCFmcy5leGlzdHNTeW5jKGZpbGVQYXRoKSkgcmV0dXJuO1xuXG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZml4UGxheXdyaWdodENvbmZpZycsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBleHRyYWN0ZWRPYmplY3RMaXRlcmFsID0gYXdhaXQgZXh0cmFjdERlZmluZUNvbmZpZ09iamVjdExpdGVyYWwoZmlsZVBhdGgpO1xuICAgIGlmICghZXh0cmFjdGVkT2JqZWN0TGl0ZXJhbCkgcmV0dXJuO1xuXG4gICAgY29uc3QgcGFyc2VkID0gcGFyc2VPYmplY3RMaXRlcmFsRXhwcmVzc2lvbihleHRyYWN0ZWRPYmplY3RMaXRlcmFsLm5vZGUsIGV4dHJhY3RlZE9iamVjdExpdGVyYWwuc291cmNlKTtcbiAgICBpZiAoIXBhcnNlZCkgcmV0dXJuO1xuXG4gICAgLy8gd2IgZGVyaXZlcyBORVhUX1BVQkxJQ19CQVNFX1VSTCBmcm9tIHRoZSByZXNvbHZlZCBwb3J0IGZvciBOZXh0LmpzL3ZpbmV4dCBhcHBzICh2aW5leHRcbiAgICAvLyBhcHBzIGFsc28gZGVwZW5kIG9uIG5leHQsIHNvIGBkZXBlbmRpbmcubmV4dGAgY292ZXJzIGJvdGgpLCBzbyB0aG9zZSBuZWVkIG5vIGRlY2xhcmVkXG4gICAgLy8gdmFyaWFibGU7IG90aGVyIHBhY2thZ2VzIHN0aWxsIHJlcXVpcmUgYSBkZWNsYXJhdGlvbi5cbiAgICBjb25zdCBzaG91bGRVc2VBcHBTZXJ2ZXJEZWZhdWx0cyA9XG4gICAgICBzaG91bGRNYW5hZ2VBcHBTZXJ2ZXJEZWZhdWx0cyhjb25maWcsIHBhcnNlZCkgJiZcbiAgICAgIChjb25maWcuZGVwZW5kaW5nLm5leHQgfHwgKGF3YWl0IGRvZXNEZWZpbmVOZXh0UHVibGljQmFzZVVybChjb25maWcuZGlyUGF0aCkpKTtcbiAgICBjb25zdCBkZWZhdWx0Q29uZmlnID0gY3JlYXRlRGVmYXVsdENvbmZpZyhjb25maWcsIHNob3VsZFVzZUFwcFNlcnZlckRlZmF1bHRzKTtcbiAgICBjb25zdCBtZXJnZWQgPSBtZXJnZVBhcnNlZE9iamVjdHMoZGVmYXVsdENvbmZpZywgcGFyc2VkKTtcbiAgICBhcHBseU1hbmFnZWRVc2VEZWZhdWx0cyhtZXJnZWQsIGRlZmF1bHRDb25maWcpO1xuICAgIHNldFdlYlNlcnZlckNvbW1hbmQobWVyZ2VkKTtcblxuICAgIGNvbnN0IG5ld09iamVjdExpdGVyYWwgPSBzdHJpbmdpZnlWYWx1ZSh7IGtpbmQ6ICdvYmplY3QnLCB2YWx1ZTogbWVyZ2VkIH0sIDApO1xuICAgIGNvbnN0IG9sZENvbnRlbnQgPSBleHRyYWN0ZWRPYmplY3RMaXRlcmFsLnNvdXJjZS50ZXh0O1xuICAgIGNvbnN0IHN0YXJ0ID0gZXh0cmFjdGVkT2JqZWN0TGl0ZXJhbC5ub2RlLmdldFN0YXJ0KGV4dHJhY3RlZE9iamVjdExpdGVyYWwuc291cmNlKTtcbiAgICBjb25zdCBlbmQgPSBleHRyYWN0ZWRPYmplY3RMaXRlcmFsLm5vZGUuZ2V0RW5kKCk7XG4gICAgY29uc3QgbmV3Q29udGVudCA9IGAke29sZENvbnRlbnQuc2xpY2UoMCwgc3RhcnQpfSR7bmV3T2JqZWN0TGl0ZXJhbH0ke29sZENvbnRlbnQuc2xpY2UoZW5kKX1gO1xuXG4gICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzVXRpbC5nZW5lcmF0ZUZpbGUoZmlsZVBhdGgsIG5ld0NvbnRlbnQpKTtcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIG1lcmdlUGFyc2VkT2JqZWN0cyhiYXNlOiBQYXJzZWRPYmplY3QsIG92ZXJyaWRlOiBQYXJzZWRPYmplY3QpOiBQYXJzZWRPYmplY3Qge1xuICBjb25zdCBvdmVycmlkZVByb3BlcnR5S2V5cyA9IG5ldyBTZXQoT2JqZWN0LmtleXMob3ZlcnJpZGUucHJvcGVydGllcykpO1xuICBjb25zdCBleHRyYU1lbWJlcnMgPSBbLi4uYmFzZS5leHRyYU1lbWJlcnMsIC4uLm92ZXJyaWRlLmV4dHJhTWVtYmVyc107XG4gIC8vIEtlZXAgZGVmYXVsdC1vbmx5IG1lbWJlcnMgYmVmb3JlIHBhcnNlZCBtZW1iZXJzIHNvIHNwcmVhZHMgYW5kIGV4cGxpY2l0IGxvY2FsIHByb3BlcnRpZXMgcmV0YWluIHByZWNlZGVuY2UuXG4gIGNvbnN0IG1lbWJlck9yZGVyID0gW1xuICAgIC4uLmJhc2UubWVtYmVyT3JkZXIuZmlsdGVyKChtZW1iZXIpID0+IG1lbWJlci5raW5kICE9PSAncHJvcGVydHknIHx8ICFvdmVycmlkZVByb3BlcnR5S2V5cy5oYXMobWVtYmVyLmtleSkpLFxuICAgIC4uLm92ZXJyaWRlLm1lbWJlck9yZGVyLm1hcCgobWVtYmVyKTogT2JqZWN0TWVtYmVyID0+IHtcbiAgICAgIGlmIChtZW1iZXIua2luZCA9PT0gJ3Byb3BlcnR5JykgcmV0dXJuIG1lbWJlcjtcbiAgICAgIHJldHVybiB7IGtpbmQ6ICdleHRyYScsIGluZGV4OiBiYXNlLmV4dHJhTWVtYmVycy5sZW5ndGggKyBtZW1iZXIuaW5kZXggfTtcbiAgICB9KSxcbiAgXTtcbiAgY29uc3QgcHJvcGVydGllcyA9IHsgLi4uYmFzZS5wcm9wZXJ0aWVzIH07XG4gIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKG92ZXJyaWRlLnByb3BlcnRpZXMpKSB7XG4gICAgcHJvcGVydGllc1trZXldID0gbWVyZ2VQYXJzZWRWYWx1ZShwcm9wZXJ0aWVzW2tleV0sIHZhbHVlKTtcbiAgfVxuICByZXR1cm4geyBleHRyYU1lbWJlcnMsIG1lbWJlck9yZGVyLCBwcm9wZXJ0aWVzIH07XG59XG5cbmZ1bmN0aW9uIG1lcmdlUGFyc2VkVmFsdWUoYmFzZTogUGFyc2VkVmFsdWUgfCB1bmRlZmluZWQsIG92ZXJyaWRlOiBQYXJzZWRWYWx1ZSk6IFBhcnNlZFZhbHVlIHtcbiAgaWYgKGJhc2U/LmtpbmQgPT09ICdvYmplY3QnICYmIG92ZXJyaWRlLmtpbmQgPT09ICdvYmplY3QnKSB7XG4gICAgcmV0dXJuIHsga2luZDogJ29iamVjdCcsIHZhbHVlOiBtZXJnZVBhcnNlZE9iamVjdHMoYmFzZS52YWx1ZSwgb3ZlcnJpZGUudmFsdWUpIH07XG4gIH1cbiAgcmV0dXJuIG92ZXJyaWRlO1xufVxuXG5mdW5jdGlvbiBhcHBseU1hbmFnZWRVc2VEZWZhdWx0cyhjb25maWc6IFBhcnNlZE9iamVjdCwgZGVmYXVsdENvbmZpZzogUGFyc2VkT2JqZWN0KTogdm9pZCB7XG4gIGNvbnN0IHVzZSA9IGNvbmZpZy5wcm9wZXJ0aWVzLnVzZTtcbiAgY29uc3QgZGVmYXVsdFVzZSA9IGRlZmF1bHRDb25maWcucHJvcGVydGllcy51c2U7XG4gIGlmICh1c2U/LmtpbmQgIT09ICdvYmplY3QnIHx8IGRlZmF1bHRVc2U/LmtpbmQgIT09ICdvYmplY3QnKSByZXR1cm47XG5cbiAgZm9yIChjb25zdCBrZXkgb2YgWyd0cmFjZScsICdzY3JlZW5zaG90JywgJ3ZpZGVvJ10pIHtcbiAgICBjb25zdCBkZWZhdWx0VmFsdWUgPSBkZWZhdWx0VXNlLnZhbHVlLnByb3BlcnRpZXNba2V5XTtcbiAgICBpZiAoZGVmYXVsdFZhbHVlKSB7XG4gICAgICB1c2UudmFsdWUucHJvcGVydGllc1trZXldID0gZGVmYXVsdFZhbHVlO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBzaG91bGRNYW5hZ2VBcHBTZXJ2ZXJEZWZhdWx0cyhjb25maWc6IFBhY2thZ2VDb25maWcsIHBhcnNlZDogUGFyc2VkT2JqZWN0KTogYm9vbGVhbiB7XG4gIHJldHVybiAoXG4gICAgY29uZmlnLmRlcGVuZGluZy5uZXh0IHx8XG4gICAgcGFyc2VkLnByb3BlcnRpZXMud2ViU2VydmVyICE9PSB1bmRlZmluZWQgfHxcbiAgICBkb2VzT2JqZWN0SGF2ZUJhc2VVcmwocGFyc2VkLnByb3BlcnRpZXMudXNlKSB8fFxuICAgIGRvZXNWYWx1ZUNvbnRhaW5MaXRlcmFsKHsga2luZDogJ29iamVjdCcsIHZhbHVlOiBwYXJzZWQgfSwgJ05FWFRfUFVCTElDX0JBU0VfVVJMJylcbiAgKTtcbn1cblxuZnVuY3Rpb24gZG9lc09iamVjdEhhdmVCYXNlVXJsKHZhbHVlOiBQYXJzZWRWYWx1ZSB8IHVuZGVmaW5lZCk6IGJvb2xlYW4ge1xuICByZXR1cm4gdmFsdWU/LmtpbmQgPT09ICdvYmplY3QnICYmIHZhbHVlLnZhbHVlLnByb3BlcnRpZXMuYmFzZVVSTCAhPT0gdW5kZWZpbmVkO1xufVxuXG5mdW5jdGlvbiBkb2VzVmFsdWVDb250YWluTGl0ZXJhbCh2YWx1ZTogUGFyc2VkVmFsdWUsIGxpdGVyYWxUZXh0OiBzdHJpbmcpOiBib29sZWFuIHtcbiAgaWYgKHZhbHVlLmtpbmQgPT09ICdsaXRlcmFsJykgcmV0dXJuIHZhbHVlLnZhbHVlLmluY2x1ZGVzKGxpdGVyYWxUZXh0KTtcbiAgaWYgKHZhbHVlLmtpbmQgPT09ICdhcnJheScpIHJldHVybiB2YWx1ZS52YWx1ZS5zb21lKChjaGlsZCkgPT4gZG9lc1ZhbHVlQ29udGFpbkxpdGVyYWwoY2hpbGQsIGxpdGVyYWxUZXh0KSk7XG4gIHJldHVybiAoXG4gICAgdmFsdWUudmFsdWUuZXh0cmFNZW1iZXJzLnNvbWUoKG1lbWJlcikgPT4gbWVtYmVyLmluY2x1ZGVzKGxpdGVyYWxUZXh0KSkgfHxcbiAgICBPYmplY3QudmFsdWVzKHZhbHVlLnZhbHVlLnByb3BlcnRpZXMpLnNvbWUoKGNoaWxkKSA9PiBkb2VzVmFsdWVDb250YWluTGl0ZXJhbChjaGlsZCwgbGl0ZXJhbFRleHQpKVxuICApO1xufVxuXG5hc3luYyBmdW5jdGlvbiBkb2VzRGVmaW5lTmV4dFB1YmxpY0Jhc2VVcmwoZGlyUGF0aDogc3RyaW5nKTogUHJvbWlzZTxib29sZWFuPiB7XG4gIGZvciAoY29uc3QgZW52RmlsZVBhdGggb2YgZ2V0RW52RmlsZVBhdGhzKGRpclBhdGgpKSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGNvbnRlbnQgPSBhd2FpdCBmcy5wcm9taXNlcy5yZWFkRmlsZShlbnZGaWxlUGF0aCwgJ3V0ZjgnKTtcbiAgICAgIGlmICgvTkVYVF9QVUJMSUNfQkFTRV9VUkxcXHMqPS9tLnRlc3QoY29udGVudCkpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBNaXNzaW5nIGVudiBmaWxlcyBhcmUgZXhwZWN0ZWQgaW4gc29tZSByZXBvcy5cbiAgICB9XG4gIH1cblxuICAvLyBTb21lIFBsYXl3cmlnaHQgY29uZmlncyBvbmx5IGRlZmluZSBicm93c2VyIHByb2plY3RzIG9yIGZpeHR1cmVzIGFuZCBkbyBub3RcbiAgLy8gc3RhcnQgYSB3ZWIgYXBwLiBBdm9pZCBmb3JjaW5nIGFuIGFwcC1zZXJ2ZXIgVVJMIGludG8gdGhvc2UgcGFja2FnZXMuXG4gIHJldHVybiBmYWxzZTtcbn1cblxuZnVuY3Rpb24gZ2V0RW52RmlsZVBhdGhzKGRpclBhdGg6IHN0cmluZyk6IHN0cmluZ1tdIHtcbiAgY29uc3QgZW52RmlsZU5hbWVzID0gWydmbm94LnRvbWwnLCAnbWlzZS50b21sJywgJ21pc2UudGVzdC50b21sJ107XG4gIGNvbnN0IGVudkZpbGVQYXRoczogc3RyaW5nW10gPSBbXTtcblxuICBmb3IgKGxldCBjdXJyZW50RGlyUGF0aCA9IHBhdGgucmVzb2x2ZShkaXJQYXRoKTsgOyBjdXJyZW50RGlyUGF0aCA9IHBhdGguZGlybmFtZShjdXJyZW50RGlyUGF0aCkpIHtcbiAgICBlbnZGaWxlUGF0aHMucHVzaCguLi5lbnZGaWxlTmFtZXMubWFwKChmaWxlTmFtZSkgPT4gcGF0aC5yZXNvbHZlKGN1cnJlbnREaXJQYXRoLCBmaWxlTmFtZSkpKTtcblxuICAgIC8vIFBsYXl3cmlnaHQgY29uZmlncyBvZnRlbiBsaXZlIGluIHBhY2thZ2VzLyogd2hpbGUgc2hhcmVkIGVudiBmaWxlcyBsaXZlIGF0IHRoZVxuICAgIC8vIHJlcG9zaXRvcnkgcm9vdCwgc28gd2FsayB1cHdhcmQgdW50aWwgdGhlIHRhcmdldCByZXBvIGJvdW5kYXJ5LlxuICAgIGlmIChmcy5leGlzdHNTeW5jKHBhdGgucmVzb2x2ZShjdXJyZW50RGlyUGF0aCwgJy5naXQnKSkpIGJyZWFrO1xuXG4gICAgY29uc3QgcGFyZW50RGlyUGF0aCA9IHBhdGguZGlybmFtZShjdXJyZW50RGlyUGF0aCk7XG4gICAgaWYgKHBhcmVudERpclBhdGggPT09IGN1cnJlbnREaXJQYXRoKSBicmVhaztcbiAgfVxuXG4gIHJldHVybiBlbnZGaWxlUGF0aHM7XG59XG5cbmZ1bmN0aW9uIHNldFdlYlNlcnZlckNvbW1hbmQob2JqZWN0OiBQYXJzZWRPYmplY3QpOiB2b2lkIHtcbiAgY29uc3Qgd2ViU2VydmVyID0gb2JqZWN0LnByb3BlcnRpZXMud2ViU2VydmVyO1xuICBpZiAod2ViU2VydmVyPy5raW5kICE9PSAnb2JqZWN0JykgcmV0dXJuO1xuXG4gIGNvbnN0IGNvbW1hbmQgPSB3ZWJTZXJ2ZXIudmFsdWUucHJvcGVydGllcy5jb21tYW5kO1xuICAvLyBMaWJyYXJpZXMgY2FuIHVzZSBQbGF5d3JpZ2h0J3Mgd2ViU2VydmVyIHRvIGJ1aWxkIGFuZCBsYXVuY2ggYSBmaXh0dXJlIGV2ZW4gdGhvdWdoIGB3YiBzdGFydGBcbiAgLy8gaW50ZW50aW9uYWxseSBoYXMgbm8gdGVzdCBzZXJ2ZXIgZm9yIHRoZSBsaWJyYXJ5IGl0c2VsZi4gUHJlc2VydmUgdGhvc2UgY3VzdG9tIGxpZmVjeWNsZVxuICAvLyBjb21tYW5kczsgb25seSBhZGQgdGhlIGNvbW1hbmQgd2hlbiB3YmZ5IGFscmVhZHkgb3ducyBpdC5cbiAgaWYgKGNvbW1hbmQgJiYgIWlzR2VuZXJhdGVkV2JTdGFydFRlc3RDb21tYW5kKGNvbW1hbmQpKSByZXR1cm47XG5cbiAgLy8gUGxheXdyaWdodCByZXF1aXJlcyBgY29tbWFuZGAgd2hlbmV2ZXIgYHdlYlNlcnZlcmAgZXhpc3RzOyBhbiBleHRlcm5hbGx5IG1hbmFnZWQgc2VydmVyIHNob3VsZFxuICAvLyBvbWl0IGB3ZWJTZXJ2ZXJgIGluc3RlYWQuIEtlZXAgZmlsbGluZyB0aGlzIHJlcXVpcmVkIGZpZWxkIHdoZW4gYSBwYXJ0aWFsIG1hbmFnZWQgYmxvY2sgbGFja3MgaXQuXG4gIHdlYlNlcnZlci52YWx1ZS5wcm9wZXJ0aWVzLmNvbW1hbmQgPSBsaXRlcmFsKGdldFdiU3RhcnRUZXN0Q29tbWFuZCgpKTtcbn1cblxuZnVuY3Rpb24gaXNHZW5lcmF0ZWRXYlN0YXJ0VGVzdENvbW1hbmQoY29tbWFuZDogUGFyc2VkVmFsdWUpOiBib29sZWFuIHtcbiAgaWYgKGNvbW1hbmQua2luZCAhPT0gJ2xpdGVyYWwnKSByZXR1cm4gZmFsc2U7XG4gIHJldHVybiBjb21tYW5kLnZhbHVlLnRyaW0oKSA9PT0gZ2V0V2JTdGFydFRlc3RDb21tYW5kKCk7XG59XG5cbmZ1bmN0aW9uIGdldFdiU3RhcnRUZXN0Q29tbWFuZCgpOiBzdHJpbmcge1xuICByZXR1cm4gYCdidW4gd2Igc3RhcnQgLS1tb2RlIHRlc3QnYDtcbn1cblxuYXN5bmMgZnVuY3Rpb24gZXh0cmFjdERlZmluZUNvbmZpZ09iamVjdExpdGVyYWwoZmlsZVBhdGg6IHN0cmluZyk6IFByb21pc2U8RXh0cmFjdGVkT2JqZWN0TGl0ZXJhbCB8IHVuZGVmaW5lZD4ge1xuICBjb25zdCBzb3VyY2UgPSBhd2FpdCBwYXJzZVNvdXJjZUZpbGUoZmlsZVBhdGgpO1xuICBpZiAoIXNvdXJjZSkgcmV0dXJuIHVuZGVmaW5lZDtcblxuICAvLyBUeXBlU2NyaXB0IGFscmVhZHkgdW5kZXJzdGFuZHMgbmVzdGVkIG9iamVjdCBsaXRlcmFscyBhbmQgdGVtcGxhdGUgc3RyaW5ncywgc28gdXNlXG4gIC8vIGl0cyBBU1QgcmFuZ2VzIGluc3RlYWQgb2YgYSByZWdleCB0aGF0IGNhbiBzdG9wIGF0IHRoZSBmaXJzdCBpbm5lciBjbG9zaW5nIGJyYWNlLlxuICBsZXQgZm91bmQ6IGFzdC5PYmplY3RMaXRlcmFsRXhwcmVzc2lvbiB8IHVuZGVmaW5lZDtcbiAgY29uc3QgdmlzaXQgPSAobm9kZTogYXN0Lk5vZGUpOiB2b2lkID0+IHtcbiAgICBpZiAoZm91bmQpIHJldHVybjtcbiAgICBpZiAoYXN0LmlzQ2FsbEV4cHJlc3Npb24obm9kZSkgJiYgbm9kZS5leHByZXNzaW9uLmdldFRleHQoc291cmNlKSA9PT0gJ2RlZmluZUNvbmZpZycpIHtcbiAgICAgIGNvbnN0IGZpcnN0QXJndW1lbnQgPSBub2RlLmFyZ3VtZW50c1swXTtcbiAgICAgIGlmIChmaXJzdEFyZ3VtZW50ICYmIGFzdC5pc09iamVjdExpdGVyYWxFeHByZXNzaW9uKGZpcnN0QXJndW1lbnQpKSB7XG4gICAgICAgIGZvdW5kID0gZmlyc3RBcmd1bWVudDtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgIH1cbiAgICBub2RlLmZvckVhY2hDaGlsZCh2aXNpdCk7XG4gIH07XG4gIHNvdXJjZS5mb3JFYWNoQ2hpbGQodmlzaXQpO1xuXG4gIHJldHVybiBmb3VuZCA/IHsgc291cmNlLCBub2RlOiBmb3VuZCB9IDogdW5kZWZpbmVkO1xufVxuXG5mdW5jdGlvbiBwYXJzZUV4cHJlc3Npb24oZXhwcmVzc2lvbjogYXN0LkV4cHJlc3Npb24sIHNvdXJjZTogYXN0LlNvdXJjZUZpbGUpOiBQYXJzZWRWYWx1ZSB8IHVuZGVmaW5lZCB7XG4gIGlmIChhc3QuaXNPYmplY3RMaXRlcmFsRXhwcmVzc2lvbihleHByZXNzaW9uKSkge1xuICAgIGNvbnN0IHBhcnNlZE9iamVjdCA9IHBhcnNlT2JqZWN0TGl0ZXJhbEV4cHJlc3Npb24oZXhwcmVzc2lvbiwgc291cmNlKTtcbiAgICByZXR1cm4gcGFyc2VkT2JqZWN0ID8geyBraW5kOiAnb2JqZWN0JywgdmFsdWU6IHBhcnNlZE9iamVjdCB9IDogbGl0ZXJhbChleHByZXNzaW9uLmdldFRleHQoc291cmNlKSk7XG4gIH1cbiAgaWYgKGFzdC5pc0FycmF5TGl0ZXJhbEV4cHJlc3Npb24oZXhwcmVzc2lvbikpIHtcbiAgICBjb25zdCBlbGVtZW50cyA9IGV4cHJlc3Npb24uZWxlbWVudHMubWFwKChlbGVtZW50KSA9PiBwYXJzZUV4cHJlc3Npb24oZWxlbWVudCwgc291cmNlKSk7XG4gICAgaWYgKGVsZW1lbnRzLnNvbWUoKGVsZW1lbnQpOiBlbGVtZW50IGlzIHVuZGVmaW5lZCA9PiBlbGVtZW50ID09PSB1bmRlZmluZWQpKSB7XG4gICAgICByZXR1cm4gbGl0ZXJhbChleHByZXNzaW9uLmdldFRleHQoc291cmNlKSk7XG4gICAgfVxuICAgIHJldHVybiBhc0FycmF5KGVsZW1lbnRzIGFzIFBhcnNlZFZhbHVlW10pO1xuICB9XG4gIHJldHVybiBsaXRlcmFsKGV4cHJlc3Npb24uZ2V0VGV4dChzb3VyY2UpKTtcbn1cblxuZnVuY3Rpb24gcGFyc2VPYmplY3RMaXRlcmFsRXhwcmVzc2lvbihcbiAgb2JqZWN0TGl0ZXJhbDogYXN0Lk9iamVjdExpdGVyYWxFeHByZXNzaW9uLFxuICBzb3VyY2U6IGFzdC5Tb3VyY2VGaWxlXG4pOiBQYXJzZWRPYmplY3QgfCB1bmRlZmluZWQge1xuICBjb25zdCBwYXJzZWQ6IFBhcnNlZE9iamVjdCA9IHsgZXh0cmFNZW1iZXJzOiBbXSwgbWVtYmVyT3JkZXI6IFtdLCBwcm9wZXJ0aWVzOiB7fSB9O1xuICBmb3IgKGNvbnN0IHByb3BlcnR5IG9mIG9iamVjdExpdGVyYWwucHJvcGVydGllcykge1xuICAgIGlmIChhc3QuaXNTaG9ydGhhbmRQcm9wZXJ0eUFzc2lnbm1lbnQocHJvcGVydHkpKSB7XG4gICAgICBjb25zdCBrZXkgPSBwcm9wZXJ0eS5uYW1lLmdldFRleHQoc291cmNlKTtcbiAgICAgIHBhcnNlZC5wcm9wZXJ0aWVzW2tleV0gPSBsaXRlcmFsKGtleSk7XG4gICAgICBwYXJzZWQubWVtYmVyT3JkZXIucHVzaCh7IGtpbmQ6ICdwcm9wZXJ0eScsIGtleSB9KTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBpZiAoXG4gICAgICAhYXN0LmlzUHJvcGVydHlBc3NpZ25tZW50KHByb3BlcnR5KSB8fFxuICAgICAgKCFhc3QuaXNJZGVudGlmaWVyKHByb3BlcnR5Lm5hbWUpICYmICFhc3QuaXNTdHJpbmdMaXRlcmFsKHByb3BlcnR5Lm5hbWUpKVxuICAgICkge1xuICAgICAgY29uc3QgaW5kZXggPSBwYXJzZWQuZXh0cmFNZW1iZXJzLnB1c2gocHJvcGVydHkuZ2V0VGV4dChzb3VyY2UpKSAtIDE7XG4gICAgICBwYXJzZWQubWVtYmVyT3JkZXIucHVzaCh7IGtpbmQ6ICdleHRyYScsIGluZGV4IH0pO1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGNvbnN0IHZhbHVlID0gcGFyc2VFeHByZXNzaW9uKHByb3BlcnR5LmluaXRpYWxpemVyLCBzb3VyY2UpO1xuICAgIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkKSByZXR1cm47XG4gICAgY29uc3Qga2V5ID0gcHJvcGVydHkubmFtZS5nZXRUZXh0KHNvdXJjZSk7XG4gICAgcGFyc2VkLnByb3BlcnRpZXNba2V5XSA9IHZhbHVlO1xuICAgIHBhcnNlZC5tZW1iZXJPcmRlci5wdXNoKHsga2luZDogJ3Byb3BlcnR5Jywga2V5IH0pO1xuICB9XG4gIHJldHVybiBwYXJzZWQ7XG59XG5cbmZ1bmN0aW9uIHN0cmluZ2lmeVZhbHVlKHZhbHVlOiBQYXJzZWRWYWx1ZSwgbGV2ZWw6IG51bWJlcik6IHN0cmluZyB7XG4gIGNvbnN0IGNsb3NpbmdJbmRlbnQgPSAnICAnLnJlcGVhdChsZXZlbCk7XG4gIGlmICh2YWx1ZS5raW5kID09PSAnYXJyYXknKSB7XG4gICAgaWYgKHZhbHVlLnZhbHVlLmxlbmd0aCA9PT0gMCkgcmV0dXJuICdbXSc7XG4gICAgY29uc3QgaW5kZW50ID0gJyAgJy5yZXBlYXQobGV2ZWwgKyAxKTtcbiAgICBjb25zdCBsaW5lcyA9IHZhbHVlLnZhbHVlLm1hcCgoaXRlbSkgPT4ge1xuICAgICAgY29uc3Qgc3RyaW5naWZpZWQgPSBzdHJpbmdpZnlWYWx1ZShpdGVtLCBsZXZlbCArIDEpLnNwbGl0KCdcXG4nKTtcbiAgICAgIHN0cmluZ2lmaWVkW3N0cmluZ2lmaWVkLmxlbmd0aCAtIDFdID0gYCR7c3RyaW5naWZpZWQuYXQoLTEpfSxgO1xuICAgICAgaWYgKGl0ZW0ua2luZCA9PT0gJ2xpdGVyYWwnKSB7XG4gICAgICAgIGZvciAobGV0IGluZGV4ID0gMTsgaW5kZXggPCBzdHJpbmdpZmllZC5sZW5ndGg7IGluZGV4ICs9IDEpIHtcbiAgICAgICAgICBzdHJpbmdpZmllZFtpbmRleF0gPSBgJHtpbmRlbnR9JHtzdHJpbmdpZmllZFtpbmRleF19YDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgc3RyaW5naWZpZWRbMF0gPSBgJHtpbmRlbnR9JHtzdHJpbmdpZmllZFswXX1gO1xuICAgICAgcmV0dXJuIHN0cmluZ2lmaWVkLmpvaW4oJ1xcbicpO1xuICAgIH0pO1xuICAgIHJldHVybiBgW1xcbiR7bGluZXMuam9pbignXFxuJyl9XFxuJHtjbG9zaW5nSW5kZW50fV1gO1xuICB9XG4gIGlmICh2YWx1ZS5raW5kID09PSAnbGl0ZXJhbCcpIHJldHVybiB2YWx1ZS52YWx1ZTtcblxuICBjb25zdCBpbmRlbnQgPSAnICAnLnJlcGVhdChsZXZlbCArIDEpO1xuICBjb25zdCBlbWl0dGVkUHJvcGVydGllcyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICBjb25zdCBsYXN0UHJvcGVydHlJbmRleEJ5S2V5ID0gZ2V0TGFzdFByb3BlcnR5SW5kZXhCeUtleSh2YWx1ZS52YWx1ZS5tZW1iZXJPcmRlcik7XG4gIGNvbnN0IGxpbmVzID0gdmFsdWUudmFsdWUubWVtYmVyT3JkZXIuZmxhdE1hcCgobWVtYmVyLCBpbmRleCkgPT4ge1xuICAgIGlmIChtZW1iZXIua2luZCA9PT0gJ2V4dHJhJykge1xuICAgICAgcmV0dXJuIFtzdHJpbmdpZnlPYmplY3RNZW1iZXIodmFsdWUudmFsdWUuZXh0cmFNZW1iZXJzW21lbWJlci5pbmRleF0gPz8gJycsIGluZGVudCldO1xuICAgIH1cblxuICAgIGlmIChsYXN0UHJvcGVydHlJbmRleEJ5S2V5LmdldChtZW1iZXIua2V5KSAhPT0gaW5kZXgpIHJldHVybiBbXTtcbiAgICBjb25zdCBpdGVtID0gdmFsdWUudmFsdWUucHJvcGVydGllc1ttZW1iZXIua2V5XTtcbiAgICBpZiAoIWl0ZW0gfHwgZW1pdHRlZFByb3BlcnRpZXMuaGFzKG1lbWJlci5rZXkpKSByZXR1cm4gW107XG4gICAgZW1pdHRlZFByb3BlcnRpZXMuYWRkKG1lbWJlci5rZXkpO1xuICAgIHJldHVybiBbc3RyaW5naWZ5T2JqZWN0UHJvcGVydHkobWVtYmVyLmtleSwgaXRlbSwgbGV2ZWwsIGluZGVudCldO1xuICB9KTtcbiAgbGluZXMucHVzaChcbiAgICAuLi5PYmplY3QuZW50cmllcyh2YWx1ZS52YWx1ZS5wcm9wZXJ0aWVzKVxuICAgICAgLmZpbHRlcigoW2tleV0pID0+ICFlbWl0dGVkUHJvcGVydGllcy5oYXMoa2V5KSlcbiAgICAgIC5tYXAoKFtrZXksIGl0ZW1dKSA9PiBzdHJpbmdpZnlPYmplY3RQcm9wZXJ0eShrZXksIGl0ZW0sIGxldmVsLCBpbmRlbnQpKVxuICApO1xuICBpZiAobGluZXMubGVuZ3RoID09PSAwKSByZXR1cm4gYHtcXG4ke2Nsb3NpbmdJbmRlbnR9fWA7XG4gIHJldHVybiBge1xcbiR7bGluZXMuam9pbignXFxuJyl9XFxuJHtjbG9zaW5nSW5kZW50fX1gO1xufVxuXG5mdW5jdGlvbiBnZXRMYXN0UHJvcGVydHlJbmRleEJ5S2V5KG1lbWJlck9yZGVyOiBPYmplY3RNZW1iZXJbXSk6IE1hcDxzdHJpbmcsIG51bWJlcj4ge1xuICBjb25zdCBsYXN0UHJvcGVydHlJbmRleEJ5S2V5ID0gbmV3IE1hcDxzdHJpbmcsIG51bWJlcj4oKTtcbiAgZm9yIChjb25zdCBbaW5kZXgsIG1lbWJlcl0gb2YgbWVtYmVyT3JkZXIuZW50cmllcygpKSB7XG4gICAgaWYgKG1lbWJlci5raW5kID09PSAncHJvcGVydHknKSB7XG4gICAgICBsYXN0UHJvcGVydHlJbmRleEJ5S2V5LnNldChtZW1iZXIua2V5LCBpbmRleCk7XG4gICAgfVxuICB9XG4gIHJldHVybiBsYXN0UHJvcGVydHlJbmRleEJ5S2V5O1xufVxuXG5mdW5jdGlvbiBzdHJpbmdpZnlPYmplY3RQcm9wZXJ0eShrZXk6IHN0cmluZywgaXRlbTogUGFyc2VkVmFsdWUsIGxldmVsOiBudW1iZXIsIGluZGVudDogc3RyaW5nKTogc3RyaW5nIHtcbiAgY29uc3Qgc3RyaW5naWZpZWQgPSBzdHJpbmdpZnlWYWx1ZShpdGVtLCBsZXZlbCArIDEpLnNwbGl0KCdcXG4nKTtcbiAgc3RyaW5naWZpZWRbc3RyaW5naWZpZWQubGVuZ3RoIC0gMV0gPSBgJHtzdHJpbmdpZmllZC5hdCgtMSl9LGA7XG4gIGlmIChpdGVtLmtpbmQgPT09ICdsaXRlcmFsJykge1xuICAgIGZvciAobGV0IGluZGV4ID0gMTsgaW5kZXggPCBzdHJpbmdpZmllZC5sZW5ndGg7IGluZGV4ICs9IDEpIHtcbiAgICAgIHN0cmluZ2lmaWVkW2luZGV4XSA9IGAke2luZGVudH0ke3N0cmluZ2lmaWVkW2luZGV4XX1gO1xuICAgIH1cbiAgfVxuICBzdHJpbmdpZmllZFswXSA9IGAke2luZGVudH0ke2tleX06ICR7c3RyaW5naWZpZWRbMF19YDtcbiAgcmV0dXJuIHN0cmluZ2lmaWVkLmpvaW4oJ1xcbicpO1xufVxuXG5mdW5jdGlvbiBzdHJpbmdpZnlPYmplY3RNZW1iZXIobWVtYmVyOiBzdHJpbmcsIGluZGVudDogc3RyaW5nKTogc3RyaW5nIHtcbiAgY29uc3Qgc3RyaW5naWZpZWQgPSBtZW1iZXIuc3BsaXQoJ1xcbicpO1xuICBzdHJpbmdpZmllZFtzdHJpbmdpZmllZC5sZW5ndGggLSAxXSA9IGAke3N0cmluZ2lmaWVkLmF0KC0xKX0sYDtcbiAgZm9yIChjb25zdCBbaW5kZXgsIGxpbmVdIG9mIHN0cmluZ2lmaWVkLmVudHJpZXMoKSkge1xuICAgIHN0cmluZ2lmaWVkW2luZGV4XSA9IGAke2luZGVudH0ke2xpbmV9YDtcbiAgfVxuICByZXR1cm4gc3RyaW5naWZpZWQuam9pbignXFxuJyk7XG59XG4iLCJpbXBvcnQgY2hpbGRfcHJvY2VzcyBmcm9tICdub2RlOmNoaWxkX3Byb2Nlc3MnO1xuaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IG9zIGZyb20gJ25vZGU6b3MnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZnNVdGlsIH0gZnJvbSAnLi4vdXRpbHMvZnNVdGlsLmpzJztcblxudHlwZSBXaWxsQm9vc3Rlck9yZ2FuaXphdGlvbiA9ICdXaWxsQm9vc3RlcicgfCAnV2lsbEJvb3N0ZXJMYWInO1xudHlwZSBSZXBvc2l0b3J5RnVsbE5hbWUgPSBgJHtXaWxsQm9vc3Rlck9yZ2FuaXphdGlvbn0vJHtzdHJpbmd9YDtcblxuZXhwb3J0IGludGVyZmFjZSBGbm94UmVwb3NpdG9yeVNjb3BlIHtcbiAgb3JnYW5pemF0aW9ucz86IHJlYWRvbmx5IFdpbGxCb29zdGVyT3JnYW5pemF0aW9uW107XG4gIHJlcG9zaXRvcmllcz86IHJlYWRvbmx5IFJlcG9zaXRvcnlGdWxsTmFtZVtdO1xuICAvLyBSZXN0cmljdHMgdGhlIHNjb3BlIHRvIHJlcG9zaXRvcmllcyBvZiB0aGUgZ2l2ZW4gdmlzaWJpbGl0eS4gUHVibGljIHJlcG9zaXRvcmllcyBwdWJsaXNoIHRoZWlyXG4gIC8vIGNpcGhlcnRleHRzIHRvIHRoZSB3b3JsZCwgc28gdGhleSBtdXN0IHVzZSBhIENJIGlkZW50aXR5IHNlcGFyYXRlIGZyb20gdGhlIG9yZy1pbnRlcm5hbCBvbmU6XG4gIC8vIGxlYWtpbmcgZWl0aGVyIENJIGtleSBtdXN0IG5vdCBleHBvc2UgdGhlIG90aGVyIHNpZGUncyBzZWNyZXRzLlxuICB2aXNpYmlsaXR5PzogJ3B1YmxpYycgfCAncHJpdmF0ZSc7XG59XG5cbmludGVyZmFjZSBGbm94QWdlUHJpbmNpcGFsIHtcbiAgbmFtZTogc3RyaW5nO1xuICBwdWJsaWNLZXlzOiByZWFkb25seSBzdHJpbmdbXTtcbiAgcmVwb3NpdG9yeVNjb3BlOiBGbm94UmVwb3NpdG9yeVNjb3BlO1xuICAvLyBNYXJrcyB0aGUgcHJpbmNpcGFsIGFzIGEgQ0kgaWRlbnRpdHkgYW5kIG5hbWVzIHRoZSBHaXRIdWIgc2VjcmV0IGhvbGRpbmcgaXRzIHByaXZhdGUga2V5LlxuICAvLyBFdmVyeSBmbm94LW1hbmFnZWQgcmVwb3NpdG9yeSBtdXN0IHJlc29sdmUgb25lIChnZW5lcmF0ZUZub3hUb21sIGZhaWxzIGNsb3NlZCBvdGhlcndpc2U6IGFcbiAgLy8gcm9zdGVyIHdpdGhvdXQgYSBDSSByZWNpcGllbnQgd291bGQgcmUtZW5jcnlwdCBzZWNyZXRzIHRoYXQgQ0kgY2FuIG5ldmVyIGRlY3J5cHQgYWdhaW4pLCBhbmRcbiAgLy8gdGhlIHdvcmtmbG93IGdlbmVyYXRvciBkZXJpdmVzIGl0cyBjYWxsZXIgbWFwcGluZ3MgZnJvbSB0aGUgc2FtZSByZXNvbHV0aW9uIHNvIHRoZSB0d28gY2FuXG4gIC8vIG5ldmVyIGRpc2FncmVlIG9uIHdoaWNoIENJIGlkZW50aXR5IGFwcGxpZXMuXG4gIGNpQWdlS2V5U2VjcmV0TmFtZT86ICdGTk9YX0FHRV9LRVknIHwgJ1BVQkxJQ19GTk9YX0FHRV9LRVknO1xufVxuXG5pbnRlcmZhY2UgRm5veEFnZVJlY2lwaWVudCB7XG4gIG5hbWU6IHN0cmluZztcbiAgcHVibGljS2V5OiBzdHJpbmc7XG59XG5cbi8vIFRoZSBhZ2UgcHJpbmNpcGFscyBhdXRob3JpemVkIHRvIGRlY3J5cHQgZWFjaCBmbm94LW1hbmFnZWQgcmVwb3NpdG9yeS4gVG8gZ3JhbnQgYWNjZXNzLCBhZGQgdGhlXG4vLyBwcmluY2lwYWwncyBwdWJsaWMga2V5cyBhbmQgcmVwb3NpdG9yeSBzY29wZSBoZXJlLiBPcmdhbml6YXRpb24gc2NvcGVzIGluY2x1ZGUgZXZlcnkgY3VycmVudCBhbmRcbi8vIGZ1dHVyZSByZXBvc2l0b3J5IGluIHRoYXQgb3JnYW5pemF0aW9uOyB1c2UgcmVwb3NpdG9yaWVzIGZvciBleGFjdCBvd25lci9yZXBvc2l0b3J5IGdyYW50cy4gVGhlXG4vLyBuZXh0IHdiZnkgcnVuIG9uIGVhY2ggbWF0Y2hpbmcgcmVwb3NpdG9yeSByZXdyaXRlcyBldmVyeSBtYW5hZ2VkIGZub3gudG9tbCBhbmQgcmUtZW5jcnlwdHMgaXRzXG4vLyBjb21taXR0ZWQgc2VjcmV0cyBmb3IgdGhlIHJlc3VsdGluZyByZWNpcGllbnQgc2V0LiBBIHNjb3BlJ3Mgb3B0aW9uYWwgdmlzaWJpbGl0eSBjb25zdHJhaW50XG4vLyBzZWxlY3RzIG9ubHkgcHVibGljIG9yIG9ubHkgcHJpdmF0ZSByZXBvc2l0b3JpZXMgKHVzZWQgdG8ga2VlcCB0aGUgb3JnLWludGVybmFsIGFuZCB0aGVcbi8vIHB1YmxpYy1yZXBvc2l0b3J5IENJIGlkZW50aXRpZXMgYXBhcnQpLiBSZW1vdmluZyBhIHNjb3BlIGNhbm5vdCByZXZva2UgY2lwaGVydGV4dFxuLy8gYWxyZWFkeSBhdmFpbGFibGUgZnJvbSBHaXQgaGlzdG9yeSwgc28gcm90YXRlIHRoZSBzZWNyZXQgdmFsdWVzIHRoYXQgcHJpbmNpcGFsIGNvdWxkIGRlY3J5cHQuXG4vLyBPbmx5IHB1YmxpYyBrZXlzIG1heSBhcHBlYXIgaGVyZTsgYSBDSSBpZGVudGl0eSdzIHByaXZhdGUga2V5IHN1cHBsaWVzIHRoZSBGTk9YX0FHRV9LRVkgKG9yLFxuLy8gZm9yIHB1YmxpYyByZXBvc2l0b3JpZXMsIFBVQkxJQ19GTk9YX0FHRV9LRVkpIG9yZ2FuaXphdGlvbiBzZWNyZXQuXG5leHBvcnQgY29uc3QgRk5PWF9BR0VfUFJJTkNJUEFMUyA9IFtcbiAge1xuICAgIG5hbWU6ICdleGthenV1JyxcbiAgICBwdWJsaWNLZXlzOiBbJ2FnZTFqMjM1NHhodm0zZnY5eTc3dDVnNnkzcThtZXhnazJtZjAwdGdya3pncDczdHlucnZ6NTVzOGF1YXl3J10sXG4gICAgcmVwb3NpdG9yeVNjb3BlOiB7IG9yZ2FuaXphdGlvbnM6IFsnV2lsbEJvb3N0ZXInLCAnV2lsbEJvb3N0ZXJMYWInXSB9LFxuICB9LFxuICB7XG4gICAgbmFtZTogJ3BvbmhhcnUnLFxuICAgIHB1YmxpY0tleXM6IFtcbiAgICAgICdhZ2UxOHJ1Z2xkZjlodGM2dW01ZXBscHgyN2s1M2VwNHpuMGxoendmZmdueHpocnEwYzd6Z3Z5cTN6Y2NkeScsXG4gICAgICAnYWdlMW56Mm45OWNyanI3bnA5eGpnbHdmZmZjM2R1ZDQ1ZGhld3F6cWZ6cHp0a2R3dTRoajc0Z3E2ZWw1MzMnLFxuICAgIF0sXG4gICAgcmVwb3NpdG9yeVNjb3BlOiB7IG9yZ2FuaXphdGlvbnM6IFsnV2lsbEJvb3N0ZXInLCAnV2lsbEJvb3N0ZXJMYWInXSB9LFxuICB9LFxuICB7XG4gICAgLy8gVGhlIG9yZy1pbnRlcm5hbCBDSSBpZGVudGl0eSAodGhlIEZOT1hfQUdFX0tFWSBvcmdhbml6YXRpb24gc2VjcmV0IC8gfi8uY29uZmlnL2Zub3gvYWdlLWNpLXdiLnR4dCkuXG4gICAgbmFtZTogJ2NpJyxcbiAgICBwdWJsaWNLZXlzOiBbJ2FnZTFhMmM2ZWY2YWhsNm1ta2hncXR4ZzBtZ3RkN3lzc3BudHE3cnh1c3YyNmVmeGhudWhsY2RzcjlkcGFrJ10sXG4gICAgcmVwb3NpdG9yeVNjb3BlOiB7IG9yZ2FuaXphdGlvbnM6IFsnV2lsbEJvb3N0ZXInLCAnV2lsbEJvb3N0ZXJMYWInXSwgdmlzaWJpbGl0eTogJ3ByaXZhdGUnIH0sXG4gICAgY2lBZ2VLZXlTZWNyZXROYW1lOiAnRk5PWF9BR0VfS0VZJyxcbiAgfSxcbiAge1xuICAgIC8vIFRoZSBDSSBpZGVudGl0eSBkZWRpY2F0ZWQgdG8gcHVibGljIHJlcG9zaXRvcmllcyAodGhlIFBVQkxJQ19GTk9YX0FHRV9LRVkgb3JnYW5pemF0aW9uXG4gICAgLy8gc2VjcmV0IC8gfi8uY29uZmlnL2Zub3gvYWdlLWNpLXdiLXB1YmxpYy50eHQpLiBTY29wZWQgdG8gV2lsbEJvb3N0ZXIgb25seSBiZWNhdXNlIHRoZVxuICAgIC8vIFBVQkxJQ19GTk9YX0FHRV9LRVkgc2VjcmV0IGlzIHJlZ2lzdGVyZWQgaW4gdGhhdCBvcmdhbml6YXRpb24gYWxvbmU7IGEgcHVibGljXG4gICAgLy8gV2lsbEJvb3N0ZXJMYWIgcmVwb3NpdG9yeSByZXNvbHZlcyBOTyBDSSBpZGVudGl0eSBhbmQgZ2VuZXJhdGVGbm94VG9tbCBmYWlscyBjbG9zZWQgb24gaXRcbiAgICAvLyAoV2lsbEJvb3N0ZXJMYWIgZG9lcyBvd24gcHVibGljIHJlcG9zaXRvcmllcywgZS5nLiBpdHMgcmV1c2FibGUtd29ya2Zsb3dzIHN5bmMgbWlycm9yLCBidXRcbiAgICAvLyBub25lIG9mIHRoZW0gdXNlIGZub3gg4oCUIHJlZ2lzdGVyIHRoZSBzZWNyZXQgdGhlcmUgYW5kIGV4dGVuZCB0aGlzIHNjb3BlIGlmIG9uZSBldmVyIGRvZXMpLlxuICAgIG5hbWU6ICdjaS1wdWJsaWMnLFxuICAgIHB1YmxpY0tleXM6IFsnYWdlMWZoZWE4NXhqd3A4OWx3cTNqY253ajMyc3doM3YyNHB3cGFycWg1bDdxa2d2YzRheDNwMHFsNmR1MzYnXSxcbiAgICByZXBvc2l0b3J5U2NvcGU6IHsgb3JnYW5pemF0aW9uczogWydXaWxsQm9vc3RlciddLCB2aXNpYmlsaXR5OiAncHVibGljJyB9LFxuICAgIGNpQWdlS2V5U2VjcmV0TmFtZTogJ1BVQkxJQ19GTk9YX0FHRV9LRVknLFxuICB9LFxuICB7XG4gICAgbmFtZTogJ3JlbWluJyxcbiAgICBwdWJsaWNLZXlzOiBbJ2FnZTFtdzRwejlkdWp5OWRtaGswcGFscWF3amtqN200azd6eDc4eXI5Zmp0NjNzYTVsM2U0M3VxNm53MDA0J10sXG4gICAgcmVwb3NpdG9yeVNjb3BlOiB7IG9yZ2FuaXphdGlvbnM6IFsnV2lsbEJvb3N0ZXInLCAnV2lsbEJvb3N0ZXJMYWInXSB9LFxuICB9LFxuICB7XG4gICAgbmFtZTogJ2FyaWVzJyxcbiAgICBwdWJsaWNLZXlzOiBbJ2FnZTFubjBlaHlhZW55cThrbW5xNDI5NGt6emd4djVkbmY2cGVwMmNka3JheHpmcWxrN3hnc3JxcW42bm45J10sXG4gICAgcmVwb3NpdG9yeVNjb3BlOiB7XG4gICAgICByZXBvc2l0b3JpZXM6IFtcbiAgICAgICAgJ1dpbGxCb29zdGVyL2FnZW50LWNoYWxsZW5nZXMnLFxuICAgICAgICAnV2lsbEJvb3N0ZXIvYWdlbnRpYy13b3JrZmxvd3MtZGFzaGJvYXJkJyxcbiAgICAgICAgJ1dpbGxCb29zdGVyL2NoZWVybGluZ3MnLFxuICAgICAgICAnV2lsbEJvb3N0ZXIvY2hvZnUtd2Fsa2luZycsXG4gICAgICAgICdXaWxsQm9vc3Rlci9wcm9tcHQtc3R1ZHknLFxuICAgICAgICAnV2lsbEJvb3N0ZXIvZXhlcmNvZGUnLFxuICAgICAgICAnV2lsbEJvb3N0ZXIvanVkZ2UnLFxuICAgICAgXSxcbiAgICB9LFxuICB9LFxuICB7XG4gICAgbmFtZTogJ3N1bmFnYScsXG4gICAgcHVibGljS2V5czogWydhZ2UxdWx4em42eTY4a3UzNGNweDVmeWE1Z2Y3cm5yd3owdWZsbnllNnV4dWhnMzRwMm5qaGdrcW1nNzNnNCddLFxuICAgIHJlcG9zaXRvcnlTY29wZToge1xuICAgICAgcmVwb3NpdG9yaWVzOiBbJ1dpbGxCb29zdGVyL2FpLW9jcicsICdXaWxsQm9vc3Rlci9leGVyY29kZScsICdXaWxsQm9vc3Rlci9qdWRnZSddLFxuICAgIH0sXG4gIH0sXG4gIHtcbiAgICBuYW1lOiAnYXlhbWUnLFxuICAgIHB1YmxpY0tleXM6IFsnYWdlMXZ4bTJnczAwM3J1d204cDZoM2h2N3hhc2p1MnM4azRteG1jMzR6bTZncmR3em5yczA5bnE2eHo1dnonXSxcbiAgICByZXBvc2l0b3J5U2NvcGU6IHtcbiAgICAgIHJlcG9zaXRvcmllczogWydXaWxsQm9vc3Rlci9haS1vY3InLCAnV2lsbEJvb3N0ZXIvY2hvZnUtd2Fsa2luZycsICdXaWxsQm9vc3Rlci9leGVyY29kZScsICdXaWxsQm9vc3Rlci9qdWRnZSddLFxuICAgIH0sXG4gIH0sXG5dIGFzIGNvbnN0IHNhdGlzZmllcyByZWFkb25seSBGbm94QWdlUHJpbmNpcGFsW107XG5cbmludGVyZmFjZSBGbm94VG9tbCB7XG4gIGltcG9ydD86IHVua25vd247XG4gIHByb3ZpZGVycz86IFJlY29yZDxzdHJpbmcsIFJlY29yZDxzdHJpbmcsIHVua25vd24+IHwgdW5kZWZpbmVkPjtcbiAgcHJvZmlsZXM/OiBSZWNvcmQ8c3RyaW5nLCBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB8IHVuZGVmaW5lZD47XG4gIFtrZXk6IHN0cmluZ106IHVua25vd247XG59XG5cbmxldCBmbm94U3luY0ZhaWxlZCA9IGZhbHNlO1xubGV0IG1pZ3JhdGlvbk1hcmtlclBhdGg6IHN0cmluZyB8IHVuZGVmaW5lZDtcbmxldCBtaWdyYXRpb25NYXJrZXJPd25lZCA9IGZhbHNlO1xuXG4vKiogV2hldGhlciBhbnkgZm5veCByZWNpcGllbnQgc3luY2hyb25pemF0aW9uIGZhaWxlZCBpbiB0aGUgY3VycmVudCByZXBvc2l0b3J5OyBzZXR1cFNlY3JldHMgbXVzdCBub3QgdXBsb2FkIHRoZW4uICovXG5leHBvcnQgZnVuY3Rpb24gaGFzRm5veFN5bmNGYWlsZWQoKTogYm9vbGVhbiB7XG4gIHJldHVybiBmbm94U3luY0ZhaWxlZDtcbn1cblxuLyoqXG4gKiBTeW5jaHJvbml6ZXMgdGhlIGFnZSByZWNpcGllbnRzIGluIGV2ZXJ5IGZub3gudG9tbCB3aXRoIHRoZSBwcmluY2lwYWxzIGF1dGhvcml6ZWQgZm9yIHRoaXNcbiAqIHJlcG9zaXRvcnkgYW5kIHJlLWVuY3J5cHRzIHRoZSBjb21taXR0ZWQgc2VjcmV0cyB3aGVuIHRoZSByZWNpcGllbnQgc2V0IGNoYW5nZWQuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZW5lcmF0ZUZub3hUb21sKHJvb3RDb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdnZW5lcmF0ZUZub3hUb21sJywgYXN5bmMgKCkgPT4ge1xuICAgIC8vIFRoZSBmYWlsdXJlIGZsYWcgaXMgcGVyIHJlcG9zaXRvcnk6IHdiZnkgY2FuIHByb2Nlc3MgbXVsdGlwbGUgd29ya2luZyBkaXJlY3RvcmllcyBpbiBvbmVcbiAgICAvLyBpbnZvY2F0aW9uLCBhbmQgYW4gZWFybGllciByZXBvc2l0b3J5J3MgZmFpbHVyZSBtdXN0IG5vdCB2ZXRvIGEgbGF0ZXIgcmVwb3NpdG9yeSdzIHVwbG9hZC5cbiAgICBmbm94U3luY0ZhaWxlZCA9IGZhbHNlO1xuICAgIC8vIEEgcmVwb3NpdG9yeSBvdXRzaWRlIFdpbGxCb29zdGVyL1dpbGxCb29zdGVyTGFiIG1hbmFnZXMgaXRzIG93biByZWNpcGllbnQgc2V0IChlLmcuIGFcbiAgICAvLyBwZXJzb25hbCByZXBvc2l0b3J5IHdpdGggaXRzIG93biBDSSBpZGVudGl0eSksIHNvIHJld3JpdGluZyBpdCB0byB0aGUgb3JnIHJvc3RlciB3b3VsZCBncmFudFxuICAgIC8vIG9yZyBtZW1iZXJzIGFjY2VzcyBhbmQgcmUtZW5jcnlwdCBzZWNyZXRzIGZvciBhIENJIGtleSB0aGF0IHJlcG9zaXRvcnkgZG9lcyBub3QgdXNlLlxuICAgIC8vIHNldHVwU2VjcmV0cyBuZXZlciB1cGxvYWRzIHNlY3JldHMgZm9yIHN1Y2ggcmVwb3NpdG9yaWVzIGVpdGhlciwgc28gc2tpcCBlbnRpcmVseS5cbiAgICBpZiAoIXJvb3RDb25maWcuaXNXaWxsQm9vc3RlclJlcG8pIHJldHVybjtcbiAgICBjb25zdCBhZ2VSZWNpcGllbnRzID0gZ2V0Rm5veEFnZVJlY2lwaWVudHMocm9vdENvbmZpZyk7XG4gICAgY29uc3Qgcm9vdERpclBhdGggPSBwYXRoLnJlc29sdmUocm9vdENvbmZpZy5kaXJQYXRoKTtcbiAgICBpZiAoIWZzLmV4aXN0c1N5bmMocGF0aC5yZXNvbHZlKHJvb3REaXJQYXRoLCAnZm5veC50b21sJykpKSB7XG4gICAgICAvLyBBIG5lc3RlZC1vbmx5IGZub3ggbGF5b3V0IGlzIHVuc3VwcG9ydGVkOiBzZXR1cFNlY3JldHMgd291bGQgdGFrZSB0aGUgZG90ZW52IHBhdGggYW5kXG4gICAgICAvLyBkZWxldGUgRk5PWF9BR0VfS0VZIGV2ZW4gdGhvdWdoIHRoZSBuZXN0ZWQgY29uZmlnJ3MgQ0kgc3RpbGwgbmVlZHMgaXQuXG4gICAgICB0cnkge1xuICAgICAgICAvLyBPbmx5IGFnZS11c2luZyBjb25maWdzIGNhcnJ5IHRoYXQgcmlzay4gV2l0aG91dCBhIHJvb3QgcHJvdmlkaW5nIHRoZSBhZ2UgcHJvdmlkZXIsIGFcbiAgICAgICAgLy8gc3RyYXkgY29uZmlnIHRoYXQgZGVjbGFyZXMgbm9uZSB1c2VzIG5vIGFnZSBlbmNyeXB0aW9uIGF0IGFsbCAoZS5nLiBhIHBsYWludGV4dCB0ZXN0XG4gICAgICAgIC8vIGZpeHR1cmUgb3IgZXhhbXBsZSBjb25maWcgYW55IHJlcG9zaXRvcnkgbWF5IGxlZ2l0aW1hdGVseSBjb21taXQpLCBzbyBpdCBuZWl0aGVyIG5lZWRzXG4gICAgICAgIC8vIHJlY2lwaWVudCBzeW5jaHJvbml6YXRpb24gbm9yIG93bnMgYW4gRk5PWF9BR0VfS0VZIGFuZCBtdXN0IG5vdCBibG9jayB0aGUgcnVuLlxuICAgICAgICBjb25zdCBzdHJheUZpbGVQYXRocyA9IGxpc3RGbm94TGlrZUZpbGVQYXRocyhyb290RGlyUGF0aCkuZmlsdGVyKChmaWxlUGF0aCkgPT5cbiAgICAgICAgICBkZWNsYXJlc0Zub3hBZ2VQcm92aWRlcihmaWxlUGF0aClcbiAgICAgICAgKTtcbiAgICAgICAgaWYgKHN0cmF5RmlsZVBhdGhzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICBmYWlsRm5veFN5bmMoXG4gICAgICAgICAgICBgRmFpbGVkIHRvIHN5bmNocm9uaXplIGZub3ggYWdlIHJlY2lwaWVudHMgYmVjYXVzZSBmbm94IGNvbmZpZ3MgZXhpc3Qgd2l0aG91dCBhIHJvb3QgZm5veC50b21sOiAke3N0cmF5RmlsZVBhdGhzLmpvaW4oJywgJyl9LiBBZGQgYSByb290IGZub3gudG9tbC5gXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgLy8gRmFpbCBjbG9zZWQ6IHdpdGhvdXQgZ2l0IGluZm9ybWF0aW9uIGEgbmVzdGVkLW9ubHkgZm5veCBsYXlvdXQgY2Fubm90IGJlIHJ1bGVkIG91dCwgYW5kXG4gICAgICAgIC8vIHNldHVwU2VjcmV0cyB3b3VsZCBvdGhlcndpc2UgdGFrZSB0aGUgZG90ZW52IHBhdGggYW5kIGRlbGV0ZSBGTk9YX0FHRV9LRVkuXG4gICAgICAgIGZhaWxGbm94U3luYyhcbiAgICAgICAgICBgRmFpbGVkIHRvIGNoZWNrIGZvciBuZXN0ZWQgZm5veCBjb25maWdzIGR1ZSB0bzogJHsoZXJyb3IgYXMgRXJyb3IgfCB1bmRlZmluZWQpPy5tZXNzYWdlID8/IGVycm9yfWBcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgLy8gQSBmYWlsZWQgdmlzaWJpbGl0eSBsb29rdXAgY29sbGFwc2VzIGlzUHVibGljUmVwbyB0byBmYWxzZSwgd2hpY2ggd291bGQgc2lsZW50bHkgcmUtZW5jcnlwdFxuICAgIC8vIGEgcHVibGljIHJlcG9zaXRvcnkncyB3b3JsZC1yZWFkYWJsZSBjaXBoZXJ0ZXh0cyB0byB0aGUgb3JnLWludGVybmFsIENJIGlkZW50aXR5IChhbmQgdmljZVxuICAgIC8vIHZlcnNhIGRyb3AgdGhlIHB1YmxpYyBvbmUpLiBGYWlsIGluc3RlYWQgb2YgZ3Vlc3Npbmcgd2hlbmV2ZXIgdmlzaWJpbGl0eSBjaGFuZ2VzIHRoZSByb3N0ZXIuXG4gICAgaWYgKCFyb290Q29uZmlnLmlzUmVwb1Zpc2liaWxpdHlLbm93biAmJiBkb2VzRm5veFJlY2lwaWVudFNldERlcGVuZE9uVmlzaWJpbGl0eShyb290Q29uZmlnKSkge1xuICAgICAgZmFpbEZub3hTeW5jKFxuICAgICAgICBgRmFpbGVkIHRvIHN5bmNocm9uaXplIGZub3ggYWdlIHJlY2lwaWVudHMgYmVjYXVzZSB0aGUgdmlzaWJpbGl0eSBvZiAke3Jvb3RDb25maWcucmVwb0F1dGhvcn0vJHtyb290Q29uZmlnLnJlcG9OYW1lfSBjb3VsZCBub3QgYmUgZGV0ZXJtaW5lZCAoR2l0SHViIGxvb2t1cCBmYWlsZWQpIGFuZCB0aGUgQ0kgcmVjaXBpZW50IGRlcGVuZHMgb24gaXQuIENoZWNrIG5ldHdvcmsgYW5kIGdoIGF1dGhlbnRpY2F0aW9uLCB0aGVuIHJlcnVuIHdiZnkuYFxuICAgICAgKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgLy8gQm90aCBDSSBpZGVudGl0aWVzIGFyZSB2aXNpYmlsaXR5LWNvbnN0cmFpbmVkLCBzbyBhIHJlcG9zaXRvcnkgY2FuIGZhbGwgdGhyb3VnaCBCT1RIIChlLmcuIGFcbiAgICAvLyBwdWJsaWMgV2lsbEJvb3N0ZXJMYWIgcmVwb3NpdG9yeSwgd2hvc2Ugb3JnYW5pemF0aW9uIGhhcyBubyBQVUJMSUNfRk5PWF9BR0VfS0VZIHNlY3JldCkuXG4gICAgLy8gUmUtZW5jcnlwdGluZyBmb3IgYSByb3N0ZXIgd2l0aG91dCBhIENJIGlkZW50aXR5IHdvdWxkIGxlYXZlIENJIHVuYWJsZSB0byBkZWNyeXB0IGFueXRoaW5nLFxuICAgIC8vIGZhaWxpbmcgb25seSBhdCBydW50aW1lIGluIEFjdGlvbnM7IGZhaWwgbG91ZGx5IGhlcmUgaW5zdGVhZC5cbiAgICBpZiAoIXJlc29sdmVGbm94Q2lBZ2VLZXlTZWNyZXROYW1lKHJvb3RDb25maWcpKSB7XG4gICAgICBmYWlsRm5veFN5bmMoXG4gICAgICAgIGBGYWlsZWQgdG8gc3luY2hyb25pemUgZm5veCBhZ2UgcmVjaXBpZW50cyBiZWNhdXNlIG5vIENJIGlkZW50aXR5IGlzIHNjb3BlZCB0byAke3Jvb3RDb25maWcucmVwb0F1dGhvcn0vJHtyb290Q29uZmlnLnJlcG9OYW1lfSAocHVibGljIHJlcG9zaXRvcmllcyBhcmUgc3VwcG9ydGVkIG9ubHkgaW4gdGhlIFdpbGxCb29zdGVyIG9yZ2FuaXphdGlvbikuIFByb3Zpc2lvbiB0aGUgbWF0Y2hpbmcgb3JnYW5pemF0aW9uIHNlY3JldCBhbmQgZXh0ZW5kIHRoZSBDSSBzY29wZXMgaW4gd2JmeSBmaXJzdC5gXG4gICAgICApO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICAvLyBUaGUgbWlncmF0aW9uIGlzIHRyYW5zYWN0aW9uYWwgb3ZlciBldmVyeSBtYW5hZ2VkIGZub3gudG9tbDogcmVydW5zIG11c3QgcmV0cnkgZnJvbSB0aGVcbiAgICAvLyBvcmlnaW5hbCBzdGF0ZSwgYW5kIGEgcGFydGlhbGx5IG1pZ3JhdGVkIHRyZWUgY291bGQgb3RoZXJ3aXNlIGJlY29tZSB1bmRlY3J5cHRhYmxlIGZvciB0aGVcbiAgICAvLyBpZGVudGl0eSBwZXJmb3JtaW5nIGEgbGF0ZXIgcmV0cnkgKGUuZy4gd2hlbiBhIHJlY2lwaWVudCBpcyBiZWluZyByZW1vdmVkKS5cbiAgICBjb25zdCBzbmFwc2hvdHMgPSBuZXcgTWFwPHN0cmluZywgc3RyaW5nPigpO1xuICAgIC8vIEEgZmFpbGVkIHN5bmNocm9uaXphdGlvbiBtdXN0IGZhaWwgdGhlIHdob2xlIHdiZnkgcnVuOiBleGl0aW5nIHplcm8gd2l0aCBzdGFsZSByZWNpcGllbnRzXG4gICAgLy8gd291bGQgbGVhdmUgc2VjcmV0cyB1bmRlY3J5cHRhYmxlIGZvciBuZXcgcmVjaXBpZW50cyB3aGlsZSBsb29raW5nIHN1Y2Nlc3NmdWwuXG4gICAgdHJ5IHtcbiAgICAgIC8vIEFueSBmbm94IGNvbmZpZyAoaW5jbHVkaW5nIGFsaWFzZXMgYW5kIGxvY2FsIG92ZXJyaWRlcykgaW4gYW4gYW5jZXN0b3IgZGlyZWN0b3J5IHdvdWxkXG4gICAgICAvLyBtZXJnZSBpbnRvIChhbmQgcG9zc2libHkgYmUgUkVXUklUVEVOIGJ5KSB0aGlzIHJlcG9zaXRvcnkncyBgZm5veCByZWVuY3J5cHRgIHRocm91Z2hcbiAgICAgIC8vIGhpZXJhcmNoaWNhbCBsb2FkaW5nLCB1c2luZyB0aGlzIHJlcG9zaXRvcnkncyByZWNpcGllbnQgc2V0IGZvciBmb3JlaWduIHNlY3JldHMuXG4gICAgICBmb3IgKGxldCBkaXJQYXRoID0gcGF0aC5kaXJuYW1lKHJvb3REaXJQYXRoKTsgOyBkaXJQYXRoID0gcGF0aC5kaXJuYW1lKGRpclBhdGgpKSB7XG4gICAgICAgIGNvbnN0IGFuY2VzdG9yRm5veEZpbGVOYW1lcyA9IGxpc3RGbm94TGlrZUZpbGVOYW1lcyhkaXJQYXRoKTtcbiAgICAgICAgaWYgKGFuY2VzdG9yRm5veEZpbGVOYW1lcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgZmFpbEZub3hTeW5jKFxuICAgICAgICAgICAgYEZhaWxlZCB0byBzeW5jaHJvbml6ZSBmbm94IGFnZSByZWNpcGllbnRzIGJlY2F1c2UgYW4gYW5jZXN0b3IgZGlyZWN0b3J5IGNvbnRhaW5zIGZub3ggY29uZmlncyB0aGF0IGZub3ggd291bGQgaGllcmFyY2hpY2FsbHkgbWVyZ2UgYW5kIHJld3JpdGU6ICR7YW5jZXN0b3JGbm94RmlsZU5hbWVzXG4gICAgICAgICAgICAgIC5tYXAoKG5hbWUpID0+IHBhdGguam9pbihkaXJQYXRoLCBuYW1lKSlcbiAgICAgICAgICAgICAgLmpvaW4oJywgJyl9LiBSZW1vdmUgdGhlbSBvciBtb3ZlIHRoZSByZXBvc2l0b3J5LmBcbiAgICAgICAgICApO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAocGF0aC5kaXJuYW1lKGRpclBhdGgpID09PSBkaXJQYXRoKSBicmVhaztcbiAgICAgIH1cbiAgICAgIC8vIGZub3ggYWxzbyBsb2FkcyBjb21taXR0ZWQgY29uZmlnIGFsaWFzZXMgdGhpcyBnZW5lcmF0b3IgY2Fubm90IGtlZXAgaW4gc3luYy5cbiAgICAgIGNvbnN0IGZub3hMaWtlRmlsZVBhdGhzID0gbGlzdEZub3hMaWtlRmlsZVBhdGhzKHJvb3REaXJQYXRoKTtcbiAgICAgIGNvbnN0IHVuc3VwcG9ydGVkRmlsZVBhdGhzID0gZm5veExpa2VGaWxlUGF0aHMuZmlsdGVyKChmaWxlUGF0aCkgPT4gcGF0aC5iYXNlbmFtZShmaWxlUGF0aCkgIT09ICdmbm94LnRvbWwnKTtcbiAgICAgIGlmICh1bnN1cHBvcnRlZEZpbGVQYXRocy5sZW5ndGggPiAwKSB7XG4gICAgICAgIGZhaWxGbm94U3luYyhcbiAgICAgICAgICBgRmFpbGVkIHRvIHN5bmNocm9uaXplIGZub3ggYWdlIHJlY2lwaWVudHMgYmVjYXVzZSBvbmx5IGZub3gudG9tbCBmaWxlcyBhcmUgc3VwcG9ydGVkOiAke3Vuc3VwcG9ydGVkRmlsZVBhdGhzLmpvaW4oJywgJyl9LiBNZXJnZSB0aGVtIGludG8gdGhlIGFkamFjZW50IGZub3gudG9tbC5gXG4gICAgICAgICk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGRpclBhdGhzID0gbGlzdEZub3hUb21sRGlyUGF0aHMoZm5veExpa2VGaWxlUGF0aHMpO1xuICAgICAgaWYgKCFkaXJQYXRocy5pbmNsdWRlcyhyb290RGlyUGF0aCkpIHtcbiAgICAgICAgZmFpbEZub3hTeW5jKFxuICAgICAgICAgIGBGYWlsZWQgdG8gc3luY2hyb25pemUgZm5veCBhZ2UgcmVjaXBpZW50cyBiZWNhdXNlICR7cGF0aC5yZXNvbHZlKHJvb3REaXJQYXRoLCAnZm5veC50b21sJyl9IGlzIGludmlzaWJsZSB0byBnaXQgKGdpdGlnbm9yZWQ/KS4gQ29tbWl0IGl0IG9yIHJlbW92ZSBpdC5gXG4gICAgICAgICk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIC8vIEdpdC1iYXNlZCBkaXNjb3ZlcnkgY2Fubm90IHNlZSBnaXRpZ25vcmVkIGZpbGVzLCBzbyBhbHNvIGluc3BlY3QgZXZlcnkgZGlyZWN0b3J5IGluIGVhY2hcbiAgICAgIC8vIG1hbmFnZWQgY29uZmlnJ3MgaGllcmFyY2h5IHRocm91Z2ggdGhlIGZpbGVzeXN0ZW06IGEgZ2l0aWdub3JlZCBhbGlhcyAoZS5nLiAuZm5veC50b21sKVxuICAgICAgLy8gb3IgYSBnaXRpZ25vcmVkIGZub3gudG9tbCBpbiBhbiBpbnRlcm1lZGlhdGUgZGlyZWN0b3J5IHdvdWxkIHN0aWxsIGJlIGxvYWRlZCBieSBmbm94IGFuZFxuICAgICAgLy8gY291bGQgb3ZlcnJpZGUgdGhlIHByb3ZpZGVyIHVzZWQgZm9yIG5lc3RlZCByZS1lbmNyeXB0aW9uLlxuICAgICAgY29uc3QgbWFuYWdlZERpclBhdGhzID0gbmV3IFNldChkaXJQYXRocyk7XG4gICAgICBmb3IgKGNvbnN0IGRpclBhdGggb2YgZGlyUGF0aHMpIHtcbiAgICAgICAgZm9yIChjb25zdCBoaWVyYXJjaHlEaXJQYXRoIG9mIGxpc3RBbmNlc3RvckRpclBhdGhzKGRpclBhdGgsIHJvb3REaXJQYXRoKSkge1xuICAgICAgICAgIGNvbnN0IHN0cmF5RmlsZU5hbWVzID0gbGlzdEZub3hMaWtlRmlsZU5hbWVzKGhpZXJhcmNoeURpclBhdGgpLmZpbHRlcihcbiAgICAgICAgICAgIChuYW1lKSA9PiBuYW1lICE9PSAnZm5veC5sb2NhbC50b21sJyAmJiAhKG5hbWUgPT09ICdmbm94LnRvbWwnICYmIG1hbmFnZWREaXJQYXRocy5oYXMoaGllcmFyY2h5RGlyUGF0aCkpXG4gICAgICAgICAgKTtcbiAgICAgICAgICBpZiAoc3RyYXlGaWxlTmFtZXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgZmFpbEZub3hTeW5jKFxuICAgICAgICAgICAgICBgRmFpbGVkIHRvIHN5bmNocm9uaXplIGZub3ggYWdlIHJlY2lwaWVudHMgYmVjYXVzZSBmbm94IHdvdWxkIGxvYWQgdW5tYW5hZ2VkIChnaXRpZ25vcmVkPykgY29uZmlnczogJHtzdHJheUZpbGVOYW1lc1xuICAgICAgICAgICAgICAgIC5tYXAoKG5hbWUpID0+IHBhdGguam9pbihoaWVyYXJjaHlEaXJQYXRoLCBuYW1lKSlcbiAgICAgICAgICAgICAgICAuam9pbignLCAnKX0uIENvbW1pdCB0aGVtIGFzIGZub3gudG9tbCBvciByZW1vdmUgdGhlbS5gXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cbiAgICAgICAgICAvLyBBIGZub3gubG9jYWwudG9tbCBhbnl3aGVyZSBpbiB0aGUgbWVyZ2VkIGhpZXJhcmNoeSAobm90IG9ubHkgbmV4dCB0byBhIG1hbmFnZWRcbiAgICAgICAgICAvLyBjb25maWcpIGNhbiBvdmVycmlkZSBwcm92aWRlcnMuXG4gICAgICAgICAgY29uc3QgbG9jYWxJc3N1ZSA9IGZpbmRGbm94TG9jYWxUb21sSXNzdWUoaGllcmFyY2h5RGlyUGF0aCk7XG4gICAgICAgICAgaWYgKGxvY2FsSXNzdWUpIHtcbiAgICAgICAgICAgIGZhaWxGbm94U3luYyhcbiAgICAgICAgICAgICAgYEZhaWxlZCB0byBzeW5jaHJvbml6ZSBmbm94IGFnZSByZWNpcGllbnRzIGJlY2F1c2UgJHtsb2NhbElzc3VlfS4gS2VlcCBvbmx5IG1hY2hpbmUtbG9jYWwgc2VjcmV0IG92ZXJyaWRlcyB0aGVyZS5gXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgLy8gVGhlIGluLW1lbW9yeSBzbmFwc2hvdHMgZG8gbm90IHN1cnZpdmUgYSBraWxsZWQgcHJvY2Vzcywgc28gYSBkdXJhYmxlIG1hcmtlciBpcyB3cml0dGVuXG4gICAgICAvLyBiZWZvcmUgdGhlIGZpcnN0IG11dGF0aW9uIGFuZCByZW1vdmVkIG9ubHkgd2hlbiB0aGUgdHJlZSBpcyBjb25zaXN0ZW50IGFnYWluLiBBIGxlZnRvdmVyXG4gICAgICAvLyBtYXJrZXIgbWVhbnMgYSBwcmV2aW91cyBydW4gd2FzIGtpbGxlZCBtaWQtbWlncmF0aW9uIChvciBjb3VsZCBub3QgcmVzdG9yZSk6IHNvbWVcbiAgICAgIC8vIGNpcGhlcnRleHRzIG1heSBub3QgbWF0Y2ggdGhlIHJlY2lwaWVudHMsIG9yIG1heSBldmVuIGJlIHVuZGVjcnlwdGFibGUgZm9yIHRoZSBleGVjdXRvcidzXG4gICAgICAvLyBpZGVudGl0eSB3aGVuIGEgcmVjaXBpZW50IHdhcyBiZWluZyByZW1vdmVkIOKAlCBzdGF0ZXMgdGhpcyBjb2RlIGNhbm5vdCByZXBhaXIgc2FmZWx5XG4gICAgICAvLyBiZWNhdXNlIHRoZSB3b3JraW5nIHRyZWUgbWF5IGhhdmUgY2hhbmdlZCBzaW5jZSAoYnJhbmNoIHN3aXRjaGVzLCBtYW51YWwgZWRpdHMpLiBUaGVcbiAgICAgIC8vIGZub3gudG9tbCBmaWxlcyBhcmUgZ2l0LXRyYWNrZWQsIHNvIHRoZSB1c2VyIHJlc3RvcmVzIHRoZW0gdmlhIGdpdCBhbmQgY2xlYXJzIHRoZSBtYXJrZXIuXG4gICAgICBtaWdyYXRpb25NYXJrZXJQYXRoID0gcGF0aC5yZXNvbHZlKHJvb3REaXJQYXRoLCAnLnRtcCcsICd3YmZ5LWZub3gtbWlncmF0aW9uLW1hcmtlcicpO1xuICAgICAgaWYgKGZzLmV4aXN0c1N5bmMobWlncmF0aW9uTWFya2VyUGF0aCkpIHtcbiAgICAgICAgZmFpbEZub3hTeW5jKFxuICAgICAgICAgIGBGYWlsZWQgdG8gc3luY2hyb25pemUgZm5veCBhZ2UgcmVjaXBpZW50cyBiZWNhdXNlIGEgcHJldmlvdXMgbWlncmF0aW9uIHdhcyBpbnRlcnJ1cHRlZC4gUmVzdG9yZSB0aGUgZm5veC50b21sIGZpbGVzIHZpYSBnaXQgKGUuZy4gXFxgZ2l0IHN0YXR1c1xcYCBhbmQgXFxgZ2l0IHJlc3RvcmUgLS0gJypmbm94Ki50b21sJ1xcYCBpZiB5b3UgaGF2ZSBubyBpbnRlbnRpb25hbCBsb2NhbCBjaGFuZ2VzKSwgdGhlbiBkZWxldGUgJHttaWdyYXRpb25NYXJrZXJQYXRofSBhbmQgcmVydW4gd2JmeS5gXG4gICAgICAgICk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgLy8gQSB0cmFja2VkIHN5bWxpbmsgbmFtZWQgZm5veC50b21sIChvciBhIHN5bWxpbmtlZCBwYXJlbnQgZGlyZWN0b3J5KSB3b3VsZCBtYWtlIHRoZVxuICAgICAgLy8gcmV3cml0ZSBhbmQgYGZub3ggcmVlbmNyeXB0YCByZWFkIGFuZCBNT0RJRlkgZmlsZXMgb3V0c2lkZSB0aGlzIHJlcG9zaXRvcnkuXG4gICAgICBjb25zdCByZWFsUm9vdERpclBhdGggPSBmcy5yZWFscGF0aFN5bmMocm9vdERpclBhdGgpO1xuICAgICAgZm9yIChjb25zdCBkaXJQYXRoIG9mIGRpclBhdGhzKSB7XG4gICAgICAgIGNvbnN0IGZub3hUb21sUGF0aCA9IHBhdGgucmVzb2x2ZShkaXJQYXRoLCAnZm5veC50b21sJyk7XG4gICAgICAgIGNvbnN0IHJlYWxQYXRoID0gZnMucmVhbHBhdGhTeW5jKGZub3hUb21sUGF0aCk7XG4gICAgICAgIGlmIChmcy5sc3RhdFN5bmMoZm5veFRvbWxQYXRoKS5pc1N5bWJvbGljTGluaygpIHx8ICFyZWFsUGF0aC5zdGFydHNXaXRoKHJlYWxSb290RGlyUGF0aCArIHBhdGguc2VwKSkge1xuICAgICAgICAgIGZhaWxGbm94U3luYyhcbiAgICAgICAgICAgIGBGYWlsZWQgdG8gc3luY2hyb25pemUgZm5veCBhZ2UgcmVjaXBpZW50cyBiZWNhdXNlICR7Zm5veFRvbWxQYXRofSBpcyBhIHN5bWxpbmsgb3IgcmVzb2x2ZXMgb3V0c2lkZSB0aGUgcmVwb3NpdG9yeSAoJHtyZWFsUGF0aH0pLiBSZXBsYWNlIGl0IHdpdGggYSByZWd1bGFyIGluLXJlcG9zaXRvcnkgZmlsZS5gXG4gICAgICAgICAgKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgc25hcHNob3RzLnNldChmbm94VG9tbFBhdGgsIGZzLnJlYWRGaWxlU3luYyhmbm94VG9tbFBhdGgsICd1dGY4JykpO1xuICAgICAgfVxuXG4gICAgICAvLyBTb3J0ZWQgb3JkZXIgcHJvY2Vzc2VzIGFuY2VzdG9ycyBiZWZvcmUgZGVzY2VuZGFudHMsIHNvIGNvbmZpZ3MgaW5oZXJpdGluZyBhbiB1cGRhdGVkXG4gICAgICAvLyBwcm92aWRlciByZS1lbmNyeXB0IGFnYWluc3QgdGhlIGFscmVhZHktdXBkYXRlZCByZWNpcGllbnRzLlxuICAgICAgY29uc3QgY2hhbmdlZERpclBhdGhzOiBzdHJpbmdbXSA9IFtdO1xuICAgICAgbGV0IGFueUZhaWxlZCA9IGZhbHNlO1xuICAgICAgZm9yIChjb25zdCBkaXJQYXRoIG9mIGRpclBhdGhzKSB7XG4gICAgICAgIGNvbnN0IGFuY2VzdG9yQ2hhbmdlZCA9IGNoYW5nZWREaXJQYXRocy5zb21lKChjaGFuZ2VkRGlyUGF0aCkgPT4gZGlyUGF0aC5zdGFydHNXaXRoKGNoYW5nZWREaXJQYXRoICsgcGF0aC5zZXApKTtcbiAgICAgICAgLy8gRXZlcnkgZGlyUGF0aCB3YXMgc25hcHNob3R0ZWQgYWJvdmUuIEEgbWlzc2luZyBzbmFwc2hvdCBtdXN0IGZhaWwgaGFyZDogZmFsbGluZyBiYWNrIHRvXG4gICAgICAgIC8vIGFuIGVtcHR5IHN0cmluZyB3b3VsZCBmbG93IGludG8gcmVwbGFjZUFnZVJlY2lwaWVudHMgYW5kIG92ZXJ3cml0ZSB0aGUgcmVhbCBmbm94LnRvbWxcbiAgICAgICAgLy8gd2l0aCBhIHJlY2lwaWVudHMtb25seSBmaWxlLCBkZXN0cm95aW5nIGV2ZXJ5IGNvbW1pdHRlZCBzZWNyZXQuXG4gICAgICAgIGNvbnN0IHNuYXBzaG90Q29udGVudCA9IHNuYXBzaG90cy5nZXQocGF0aC5yZXNvbHZlKGRpclBhdGgsICdmbm94LnRvbWwnKSk7XG4gICAgICAgIGlmIChzbmFwc2hvdENvbnRlbnQgPT09IHVuZGVmaW5lZCkgdGhyb3cgbmV3IEVycm9yKGBNaXNzaW5nIGZub3gudG9tbCBzbmFwc2hvdCBmb3IgJHtkaXJQYXRofS5gKTtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgc3luY2hyb25pemVGbm94QWdlUmVjaXBpZW50cyhcbiAgICAgICAgICBkaXJQYXRoLFxuICAgICAgICAgIHJvb3REaXJQYXRoLFxuICAgICAgICAgIGRpclBhdGggPT09IHJvb3REaXJQYXRoLFxuICAgICAgICAgIGFuY2VzdG9yQ2hhbmdlZCxcbiAgICAgICAgICBzbmFwc2hvdENvbnRlbnQsXG4gICAgICAgICAgYWdlUmVjaXBpZW50c1xuICAgICAgICApO1xuICAgICAgICBpZiAocmVzdWx0ID09PSAnY2hhbmdlZCcpIGNoYW5nZWREaXJQYXRocy5wdXNoKGRpclBhdGgpO1xuICAgICAgICBhbnlGYWlsZWQgfHw9IHJlc3VsdCA9PT0gJ2ZhaWxlZCc7XG4gICAgICB9XG4gICAgICBpZiAoYW55RmFpbGVkKSB7XG4gICAgICAgIC8vIEEgZmFpbGVkIHJlLWVuY3J5cHRpb24gbWF5IGhhdmUgcmV3cml0dGVuIHNvbWUgY2lwaGVydGV4dHMsIHNvIHJlc3RvcmUgdW5jb25kaXRpb25hbGx5LlxuICAgICAgICAvLyBUaGUgbWFya2VyIGlzIHJlbW92ZWQgb25seSB3aGVuIHJlc3RvcmF0aW9uIGZ1bGx5IHN1Y2NlZWRlZCBhbmQgdGhlIHRyZWUgaXMgY29uc2lzdGVudC5cbiAgICAgICAgLy8gUmVzdG9yZSBPTkxZIHdoZW4gdGhpcyBydW4gb3ducyB0aGUgbWFya2VyOiBldmVyeSBjb21taXR0ZWQtY29uZmlnIG11dGF0aW9uIGhhcHBlbnNcbiAgICAgICAgLy8gYWZ0ZXIgbWFya2VyIGFjcXVpc2l0aW9uLCBzbyBhIG5vbi1vd25lciAoZS5nLiBsb3NpbmcgYSByYWNlIGFnYWluc3QgYSBjb25jdXJyZW50IHdiZnkpXG4gICAgICAgIC8vIGhhcyBjaGFuZ2VkIG5vdGhpbmcgYW5kIG11c3Qgbm90IG92ZXJ3cml0ZSB0aGUgb3duZXIncyBpbi1wcm9ncmVzcyBtaWdyYXRpb24uXG4gICAgICAgIGlmIChtaWdyYXRpb25NYXJrZXJPd25lZCAmJiByZXN0b3JlU25hcHNob3RzKHNuYXBzaG90cykpIHJlbW92ZU93bmVkTWlncmF0aW9uTWFya2VyKCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZW1vdmVPd25lZE1pZ3JhdGlvbk1hcmtlcigpO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBpZiAobWlncmF0aW9uTWFya2VyT3duZWQgJiYgcmVzdG9yZVNuYXBzaG90cyhzbmFwc2hvdHMpKSB7XG4gICAgICAgIHJlbW92ZU93bmVkTWlncmF0aW9uTWFya2VyKCk7XG4gICAgICB9XG4gICAgICBmYWlsRm5veFN5bmMoYEZhaWxlZCB0byBzeW5jaHJvbml6ZSBmbm94IGFnZSByZWNpcGllbnRzIGR1ZSB0bzogJHsoZXJyb3IgYXMgRXJyb3IgfCB1bmRlZmluZWQpPy5zdGFjayA/PyBlcnJvcn1gKTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgbWlncmF0aW9uTWFya2VyUGF0aCA9IHVuZGVmaW5lZDtcbiAgICAgIG1pZ3JhdGlvbk1hcmtlck93bmVkID0gZmFsc2U7XG4gICAgfVxuICB9KTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gc3luY2hyb25pemVGbm94QWdlUmVjaXBpZW50cyhcbiAgZGlyUGF0aDogc3RyaW5nLFxuICByb290RGlyUGF0aDogc3RyaW5nLFxuICBpc1Jvb3Q6IGJvb2xlYW4sXG4gIGFuY2VzdG9yUmVjaXBpZW50c0NoYW5nZWQ6IGJvb2xlYW4sXG4gIG9yaWdpbmFsQ29udGVudDogc3RyaW5nLFxuICBhZ2VSZWNpcGllbnRzOiByZWFkb25seSBGbm94QWdlUmVjaXBpZW50W11cbik6IFByb21pc2U8J2NoYW5nZWQnIHwgJ3VuY2hhbmdlZCcgfCAnZmFpbGVkJz4ge1xuICBjb25zdCBmbm94VG9tbFBhdGggPSBwYXRoLnJlc29sdmUoZGlyUGF0aCwgJ2Zub3gudG9tbCcpO1xuXG4gIC8vIFJlY2lwaWVudCBzeW5jaHJvbml6YXRpb24gb25seSB1bmRlcnN0YW5kcyB0aGUgc3RhbmRhcmQgc2luZ2xlLWZpbGUgbGF5b3V0IHdpdGggb25lXG4gIC8vIHRvcC1sZXZlbCBhZ2UgcHJvdmlkZXIgbmFtZWQgYGFnZWAuIEdpdGlnbm9yZWQgY29uZmlnIGFsaWFzZXMgKGUuZy4gLmZub3gubG9jYWwudG9tbCkgdGhhdFxuICAvLyBnaXQtYmFzZWQgZGlzY292ZXJ5IGNhbm5vdCBzZWUsIGltcG9ydHMsIGRpZmZlcmVudGx5IG5hbWVkIGFnZSBwcm92aWRlcnMsIG9yIHByb3ZpZGVyXG4gIC8vIG92ZXJyaWRlcyB3b3VsZCBrZWVwIHVzaW5nIHJlY2lwaWVudCBzZXRzIHRoaXMgZ2VuZXJhdG9yIGRvZXMgbm90IHJld3JpdGUsIHNvIHRoZWlyIHNlY3JldHNcbiAgLy8gd291bGQgc2lsZW50bHkgc3RheSB1bmRlY3J5cHRhYmxlIGZvciBuZXcgcmVjaXBpZW50czsgZmFpbCBpbnN0ZWFkIG9mIHByb2NlZWRpbmcuIFRoZVxuICAvLyBnaXRpZ25vcmVkIGZub3gubG9jYWwudG9tbCBpcyBhIHN1cHBvcnRlZCBtYWNoaW5lLWxvY2FsIG92ZXJyaWRlLCBidXQgb25seSB3aGlsZSBpdCBsZWF2ZXNcbiAgLy8gcHJvdmlkZXJzIGFsb25lLlxuICBjb25zdCB1bnN1cHBvcnRlZEZpbGVOYW1lcyA9IGxpc3RGbm94TGlrZUZpbGVOYW1lcyhkaXJQYXRoKS5maWx0ZXIoXG4gICAgKG5hbWUpID0+IG5hbWUgIT09ICdmbm94LnRvbWwnICYmIG5hbWUgIT09ICdmbm94LmxvY2FsLnRvbWwnXG4gICk7XG4gIGlmICh1bnN1cHBvcnRlZEZpbGVOYW1lcy5sZW5ndGggPiAwKSB7XG4gICAgZmFpbEZub3hTeW5jKFxuICAgICAgYEZhaWxlZCB0byBzeW5jaHJvbml6ZSBmbm94IGFnZSByZWNpcGllbnRzIGluICR7ZGlyUGF0aH0gYmVjYXVzZSBvbmx5IGZub3gudG9tbCBhbmQgZm5veC5sb2NhbC50b21sIGFyZSBzdXBwb3J0ZWQ6ICR7dW5zdXBwb3J0ZWRGaWxlTmFtZXMuam9pbignLCAnKX0uIE1lcmdlIHRoZW0gaW50byBmbm94LnRvbWwuYFxuICAgICk7XG4gICAgcmV0dXJuICdmYWlsZWQnO1xuICB9XG4gIC8vIEEgc3RhbGUgYmFja3VwIGxlZnQgYnkgYW4gaW50ZXJydXB0ZWQgZWFybGllciBydW4gbXVzdCBiZSByZXN0b3JlZCBzbyB0aGUgdXNlcidzIGxvY2FsXG4gIC8vIG92ZXJyaWRlcyBhcmUgbmV2ZXIgc2lsZW50bHkgbG9zdCAodGhlIG1pZ3JhdGlvbiBtYXJrZXIgc2VwYXJhdGVseSBibG9ja3MgdGhpcyBydW4gd2hlbiB0aGVcbiAgLy8gaW50ZXJydXB0aW9uIGxlZnQgdGhlIG1pZ3JhdGlvbiBpdHNlbGYgaW5jb21wbGV0ZSkuXG4gIHJlY292ZXJTdGFsZUZub3hMb2NhbEJhY2t1cChyb290RGlyUGF0aCwgZGlyUGF0aCk7XG5cbiAgY29uc3QgbGF5b3V0SXNzdWUgPSBmaW5kRm5veExheW91dElzc3VlKG9yaWdpbmFsQ29udGVudCk7XG4gIGlmIChsYXlvdXRJc3N1ZSkge1xuICAgIGZhaWxGbm94U3luYyhgRmFpbGVkIHRvIHN5bmNocm9uaXplIGZub3ggYWdlIHJlY2lwaWVudHMgYmVjYXVzZSAke2Zub3hUb21sUGF0aH0gJHtsYXlvdXRJc3N1ZX0uYCk7XG4gICAgcmV0dXJuICdmYWlsZWQnO1xuICB9XG4gIGNvbnN0IHNldHRpbmdzID0gQnVuLlRPTUwucGFyc2Uob3JpZ2luYWxDb250ZW50KSBhcyBGbm94VG9tbDtcbiAgY29uc3QgcHJvZmlsZU5hbWVzID0gT2JqZWN0LmtleXMoc2V0dGluZ3MucHJvZmlsZXMgPz8ge30pO1xuICBjb25zdCBjdXJyZW50UmVjaXBpZW50cyA9IHJlYWRGbm94QWdlUmVjaXBpZW50cyhvcmlnaW5hbENvbnRlbnQpO1xuXG4gIC8vIEEgbmVzdGVkIGZub3gudG9tbCB3aXRob3V0IGl0cyBvd24gYWdlIHByb3ZpZGVyIGluaGVyaXRzIHRoZSBuZWFyZXN0IGFuY2VzdG9yJ3Mgb25lIHRocm91Z2hcbiAgLy8gZm5veCdzIGhpZXJhcmNoaWNhbCBsb2FkaW5nLCBzbyBvbmx5IHRoZSByb290IGNvbmZpZyBtdXN0IGRlY2xhcmUgdGhlIHByb3ZpZGVyIOKAlCBidXQgdGhlXG4gIC8vIG5lc3RlZCBjb25maWcncyBvd24gY2lwaGVydGV4dHMgc3RpbGwgbXVzdCBiZSByZS1lbmNyeXB0ZWQgd2hlbmV2ZXIgYW4gYW5jZXN0b3IncyByZWNpcGllbnRzXG4gIC8vIGNoYW5nZWQsIGFuZCB0aGF0IG9ubHkgaGFwcGVucyB3aGVuIGBmbm94IHJlZW5jcnlwdGAgcnVucyBmcm9tIHRoZSBuZXN0ZWQgZGlyZWN0b3J5LlxuICBpZiAoIWlzUm9vdCAmJiAhY3VycmVudFJlY2lwaWVudHMpIHtcbiAgICBpZiAoYW5jZXN0b3JSZWNpcGllbnRzQ2hhbmdlZCkge1xuICAgICAgd3JpdGVNaWdyYXRpb25NYXJrZXIoKTtcbiAgICAgIGlmICghcmVlbmNyeXB0Rm5veFNlY3JldHMoZGlyUGF0aCwgcm9vdERpclBhdGgsIHByb2ZpbGVOYW1lcykpIHtcbiAgICAgICAgZmFpbEZub3hTeW5jKFxuICAgICAgICAgIGBGYWlsZWQgdG8gcmUtZW5jcnlwdCBmbm94IHNlY3JldHMgaW4gJHtkaXJQYXRofSBmb3IgdGhlIHVwZGF0ZWQgcmVjaXBpZW50cy4gRml4IHRoZSBlcnJvciBhbmQgcmVydW4gd2JmeS5gXG4gICAgICAgICk7XG4gICAgICAgIHJldHVybiAnZmFpbGVkJztcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuICd1bmNoYW5nZWQnO1xuICB9XG5cbiAgaWYgKFxuICAgIGN1cnJlbnRSZWNpcGllbnRzICYmXG4gICAgY3VycmVudFJlY2lwaWVudHMuc2l6ZSA9PT0gYWdlUmVjaXBpZW50cy5sZW5ndGggJiZcbiAgICBhZ2VSZWNpcGllbnRzLmV2ZXJ5KChyZWNpcGllbnQpID0+IGN1cnJlbnRSZWNpcGllbnRzLmhhcyhyZWNpcGllbnQucHVibGljS2V5KSlcbiAgKSB7XG4gICAgcmV0dXJuICd1bmNoYW5nZWQnO1xuICB9XG5cbiAgLy8gUmV3cml0ZSBvbmx5IHRoZSByZWNpcGllbnRzIGFzc2lnbm1lbnQgc28gdXNlci1hdXRob3JlZCBjb21tZW50cyBhbmQgZm9ybWF0dGluZyBzdXJ2aXZlLlxuICAvLyBSZS1wYXJzZSBiZWZvcmUgd3JpdGluZzogYW4gdW51c3VhbCBsYXlvdXQgKGUuZy4gZG90dGVkIGtleXMpIGNvdWxkIG1ha2UgdGhlIHRleHR1YWwgZWRpdFxuICAvLyBwcm9kdWNlIGEgZHVwbGljYXRlIHRhYmxlIG9yIGxlYXZlIHRoZSBvbGQgcmVjaXBpZW50cyBpbiBlZmZlY3QuXG4gIGNvbnN0IHVwZGF0ZWRDb250ZW50ID0gcmVwbGFjZUFnZVJlY2lwaWVudHMob3JpZ2luYWxDb250ZW50LCBhZ2VSZWNpcGllbnRzKTtcbiAgY29uc3QgdXBkYXRlZFJlY2lwaWVudHMgPSBbLi4uKHJlYWRGbm94QWdlUmVjaXBpZW50cyh1cGRhdGVkQ29udGVudCkgPz8gW10pXTtcbiAgaWYgKFxuICAgIHVwZGF0ZWRSZWNpcGllbnRzLmxlbmd0aCAhPT0gYWdlUmVjaXBpZW50cy5sZW5ndGggfHxcbiAgICAhYWdlUmVjaXBpZW50cy5ldmVyeSgocmVjaXBpZW50KSA9PiB1cGRhdGVkUmVjaXBpZW50cy5pbmNsdWRlcyhyZWNpcGllbnQucHVibGljS2V5KSlcbiAgKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBSZXdyaXRpbmcgdGhlIGFnZSByZWNpcGllbnRzIGluICR7Zm5veFRvbWxQYXRofSBkaWQgbm90IHRha2UgZWZmZWN0OyB1cGRhdGUgdGhlbSBtYW51YWxseS5gKTtcbiAgfVxuICB3cml0ZU1pZ3JhdGlvbk1hcmtlcigpO1xuICBhd2FpdCBmc1V0aWwuZ2VuZXJhdGVGaWxlKGZub3hUb21sUGF0aCwgdXBkYXRlZENvbnRlbnQpO1xuXG4gIGlmICghcmVlbmNyeXB0Rm5veFNlY3JldHMoZGlyUGF0aCwgcm9vdERpclBhdGgsIHByb2ZpbGVOYW1lcykpIHtcbiAgICAvLyBSZXN0b3JlIHRoZSBvcmlnaW5hbCBjb25maWc6IGtlZXBpbmcgdGhlIG5ldyByZWNpcGllbnRzIHdpdGggb2xkIGNpcGhlcnRleHRzIHdvdWxkIG1ha2VcbiAgICAvLyB0aGlzIGdlbmVyYXRvciBza2lwIHJlLWVuY3J5cHRpb24gZm9yZXZlciBhbmQgbGV0IHNldHVwU2VjcmV0cyB1cGxvYWQgYSBDSSBrZXkgdGhhdFxuICAgIC8vIGNhbm5vdCBkZWNyeXB0IGFueXRoaW5nLiBUaGUgb2xkIGNpcGhlcnRleHRzIHJlbWFpbiB2YWxpZCBmb3IgdGhlIG9sZCByZWNpcGllbnRzLlxuICAgIGF3YWl0IGZzVXRpbC5nZW5lcmF0ZUZpbGUoZm5veFRvbWxQYXRoLCBvcmlnaW5hbENvbnRlbnQpO1xuICAgIGZhaWxGbm94U3luYyhcbiAgICAgIGBGYWlsZWQgdG8gcmUtZW5jcnlwdCBmbm94IHNlY3JldHMgaW4gJHtkaXJQYXRofSBmb3IgdGhlIHVwZGF0ZWQgcmVjaXBpZW50cy4gRml4IHRoZSBlcnJvciBhbmQgcmVydW4gd2JmeS5gXG4gICAgKTtcbiAgICByZXR1cm4gJ2ZhaWxlZCc7XG4gIH1cbiAgcmV0dXJuICdjaGFuZ2VkJztcbn1cblxuLyoqXG4gKiBSZXR1cm5zIGEgZGVzY3JpcHRpb24gb2YgYSBmbm94LnRvbWwgbGF5b3V0IHRoYXQgcmVjaXBpZW50IHN5bmNocm9uaXphdGlvbiBhbmQgdGhlIENJLWtleVxuICogdmVyaWZpY2F0aW9uIGNhbm5vdCBjb3Zlciwgb3IgdW5kZWZpbmVkIHdoZW4gdGhlIHN0YW5kYXJkIHNpbmdsZS1maWxlLCBzaW5nbGUtYWdlLXByb3ZpZGVyXG4gKiBsYXlvdXQgaXMgdXNlZC5cbiAqL1xuZnVuY3Rpb24gZmluZEZub3hMYXlvdXRJc3N1ZShmbm94VG9tbENvbnRlbnQ6IHN0cmluZyk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIHRyeSB7XG4gICAgY29uc3Qgc2V0dGluZ3MgPSBCdW4uVE9NTC5wYXJzZShmbm94VG9tbENvbnRlbnQpIGFzIEZub3hUb21sO1xuICAgIGlmIChzZXR0aW5ncy5pbXBvcnQgIT09IHVuZGVmaW5lZCkgcmV0dXJuICd1c2VzIHRoZSB1bnN1cHBvcnRlZCBgaW1wb3J0YCBzZXR0aW5nJztcbiAgICBjb25zdCBub25TdGFuZGFyZEFnZVByb3ZpZGVyTmFtZXMgPSBPYmplY3QuZW50cmllcyhzZXR0aW5ncy5wcm92aWRlcnMgPz8ge30pXG4gICAgICAuZmlsdGVyKChbbmFtZSwgcHJvdmlkZXJdKSA9PiAocHJvdmlkZXI/LnR5cGUgPT09ICdhZ2UnKSAhPT0gKG5hbWUgPT09ICdhZ2UnKSlcbiAgICAgIC5tYXAoKFtuYW1lXSkgPT4gbmFtZSk7XG4gICAgaWYgKG5vblN0YW5kYXJkQWdlUHJvdmlkZXJOYW1lcy5sZW5ndGggPiAwKSB7XG4gICAgICByZXR1cm4gYGRlY2xhcmVzIGFnZSBwcm92aWRlcnMgbm90IG5hbWVkIFxcYGFnZVxcYCAob3IgYW4gXFxgYWdlXFxgIHByb3ZpZGVyIG9mIGFub3RoZXIgdHlwZSk6ICR7bm9uU3RhbmRhcmRBZ2VQcm92aWRlck5hbWVzLmpvaW4oJywgJyl9YDtcbiAgICB9XG4gICAgY29uc3QgcHJvZmlsZXNXaXRoUHJvdmlkZXJzID0gT2JqZWN0LmVudHJpZXMoc2V0dGluZ3MucHJvZmlsZXMgPz8ge30pXG4gICAgICAuZmlsdGVyKChbLCBwcm9maWxlXSkgPT4gcHJvZmlsZT8ucHJvdmlkZXJzKVxuICAgICAgLm1hcCgoW25hbWVdKSA9PiBuYW1lKTtcbiAgICBpZiAocHJvZmlsZXNXaXRoUHJvdmlkZXJzLmxlbmd0aCA+IDApIHtcbiAgICAgIHJldHVybiBgZGVjbGFyZXMgdW5zdXBwb3J0ZWQgcHJvZmlsZS1zcGVjaWZpYyBwcm92aWRlcnM6ICR7cHJvZmlsZXNXaXRoUHJvdmlkZXJzLmpvaW4oJywgJyl9YDtcbiAgICB9XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuICdjYW5ub3QgYmUgcGFyc2VkIGFzIFRPTUwnO1xuICB9XG59XG5cbi8qKlxuICogUmVhZHMgdGhlIFtwcm92aWRlcnMuYWdlXS5yZWNpcGllbnRzIG9mIGEgZm5veC50b21sLCBvciB1bmRlZmluZWQgd2hlbiB0aGUgY29uZmlnIGRlY2xhcmVzIG5vXG4gKiBhZ2UgcHJvdmlkZXIgKG5lc3RlZCBjb25maWdzIHRoZW4gaW5oZXJpdCB0aGUgcm9vdCBvbmUpLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVhZEZub3hBZ2VSZWNpcGllbnRzKGZub3hUb21sQ29udGVudDogc3RyaW5nKTogU2V0PHN0cmluZz4gfCB1bmRlZmluZWQge1xuICB0cnkge1xuICAgIGNvbnN0IHNldHRpbmdzID0gQnVuLlRPTUwucGFyc2UoZm5veFRvbWxDb250ZW50KSBhcyBGbm94VG9tbDtcbiAgICBpZiAoIXNldHRpbmdzLnByb3ZpZGVycz8uYWdlKSByZXR1cm4gdW5kZWZpbmVkO1xuICAgIGNvbnN0IHJlY2lwaWVudHMgPSBzZXR0aW5ncy5wcm92aWRlcnMuYWdlLnJlY2lwaWVudHM7XG4gICAgcmV0dXJuIG5ldyBTZXQoQXJyYXkuaXNBcnJheShyZWNpcGllbnRzKSA/IHJlY2lwaWVudHMuZmlsdGVyKChyKTogciBpcyBzdHJpbmcgPT4gdHlwZW9mIHIgPT09ICdzdHJpbmcnKSA6IFtdKTtcbiAgfSBjYXRjaCB7XG4gICAgLy8gQW4gdW5wYXJzYWJsZSBmbm94LnRvbWwgeWllbGRzIG5vIHJlY2lwaWVudHMsIHNvIHRoZSBjYWxsZXIgcmVwb3J0cyBhbiBlcnJvci5cbiAgICByZXR1cm4gbmV3IFNldCgpO1xuICB9XG59XG5cbnR5cGUgRm5veFJlcG9zaXRvcnlJZGVudGl0eSA9IFBpY2s8UGFja2FnZUNvbmZpZywgJ3JlcG9BdXRob3InIHwgJ3JlcG9OYW1lJyB8ICdpc1B1YmxpY1JlcG8nIHwgJ2lzUmVwb1Zpc2liaWxpdHlLbm93bic+O1xuXG4vKipcbiAqIFRoZSBHaXRIdWIgc2VjcmV0IGhvbGRpbmcgdGhlIHByaXZhdGUga2V5IG9mIHRoZSBDSSBpZGVudGl0eSBzY29wZWQgdG8gdGhlIHJlcG9zaXRvcnksIG9yXG4gKiB1bmRlZmluZWQgd2hlbiBub25lIGlzIChhbiB1bmtub3duIHZpc2liaWxpdHksIG9yIGEgcmVwb3NpdG9yeSBubyBDSSBzY29wZSBjb3ZlcnMpLiBUaGUgc2luZ2xlXG4gKiBzb3VyY2Ugb2YgdHJ1dGggc2hhcmVkIGJ5IHRoZSByZWNpcGllbnQgc3luYyBhbmQgdGhlIHdvcmtmbG93IGdlbmVyYXRvcidzIGNhbGxlciBtYXBwaW5ncy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlc29sdmVGbm94Q2lBZ2VLZXlTZWNyZXROYW1lKFxuICBjb25maWc6IEZub3hSZXBvc2l0b3J5SWRlbnRpdHlcbik6ICdGTk9YX0FHRV9LRVknIHwgJ1BVQkxJQ19GTk9YX0FHRV9LRVknIHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgY2lQcmluY2lwYWw6IEZub3hBZ2VQcmluY2lwYWwgfCB1bmRlZmluZWQgPSBGTk9YX0FHRV9QUklOQ0lQQUxTLmZpbmQoXG4gICAgKHByaW5jaXBhbDogRm5veEFnZVByaW5jaXBhbCkgPT5cbiAgICAgIHByaW5jaXBhbC5jaUFnZUtleVNlY3JldE5hbWUgJiYgbWF0Y2hlc0Zub3hSZXBvc2l0b3J5U2NvcGUocHJpbmNpcGFsLnJlcG9zaXRvcnlTY29wZSwgY29uZmlnKVxuICApO1xuICByZXR1cm4gY2lQcmluY2lwYWw/LmNpQWdlS2V5U2VjcmV0TmFtZTtcbn1cblxuLyoqIFdoZXRoZXIgdGhlIHJlY2lwaWVudCBzZXQgZGlmZmVycyBiZXR3ZWVuIHRoZSBwdWJsaWMgYW5kIHByaXZhdGUgcmVhZGluZyBvZiB0aGUgcmVwb3NpdG9yeS4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkb2VzRm5veFJlY2lwaWVudFNldERlcGVuZE9uVmlzaWJpbGl0eShcbiAgcm9vdENvbmZpZzogUGljazxQYWNrYWdlQ29uZmlnLCAncmVwb0F1dGhvcicgfCAncmVwb05hbWUnPlxuKTogYm9vbGVhbiB7XG4gIGNvbnN0IHB1YmxpY0tleXNGb3IgPSAoaXNQdWJsaWNSZXBvOiBib29sZWFuKTogc3RyaW5nID0+XG4gICAgZ2V0Rm5veEFnZVJlY2lwaWVudHMoeyAuLi5yb290Q29uZmlnLCBpc1B1YmxpY1JlcG8sIGlzUmVwb1Zpc2liaWxpdHlLbm93bjogdHJ1ZSB9KVxuICAgICAgLm1hcCgoeyBwdWJsaWNLZXkgfSkgPT4gcHVibGljS2V5KVxuICAgICAgLmpvaW4oJ1xcbicpO1xuICByZXR1cm4gcHVibGljS2V5c0Zvcih0cnVlKSAhPT0gcHVibGljS2V5c0ZvcihmYWxzZSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRGbm94QWdlUmVjaXBpZW50cyhyb290Q29uZmlnOiBGbm94UmVwb3NpdG9yeUlkZW50aXR5KTogRm5veEFnZVJlY2lwaWVudFtdIHtcbiAgcmV0dXJuIEZOT1hfQUdFX1BSSU5DSVBBTFMuZmlsdGVyKChwcmluY2lwYWwpID0+XG4gICAgbWF0Y2hlc0Zub3hSZXBvc2l0b3J5U2NvcGUocHJpbmNpcGFsLnJlcG9zaXRvcnlTY29wZSwgcm9vdENvbmZpZylcbiAgKS5mbGF0TWFwKChwcmluY2lwYWwpID0+XG4gICAgcHJpbmNpcGFsLnB1YmxpY0tleXMubWFwKChwdWJsaWNLZXksIGluZGV4KSA9PiAoe1xuICAgICAgbmFtZTogcHJpbmNpcGFsLnB1YmxpY0tleXMubGVuZ3RoID09PSAxID8gcHJpbmNpcGFsLm5hbWUgOiBgJHtwcmluY2lwYWwubmFtZX0ke2luZGV4ICsgMX1gLFxuICAgICAgcHVibGljS2V5LFxuICAgIH0pKVxuICApO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gbWF0Y2hlc0Zub3hSZXBvc2l0b3J5U2NvcGUoc2NvcGU6IEZub3hSZXBvc2l0b3J5U2NvcGUsIHJlcG9zaXRvcnk6IEZub3hSZXBvc2l0b3J5SWRlbnRpdHkpOiBib29sZWFuIHtcbiAgY29uc3Qgb3duZXIgPSByZXBvc2l0b3J5LnJlcG9BdXRob3I/LnRvTG93ZXJDYXNlKCk7XG4gIGNvbnN0IG5hbWUgPSByZXBvc2l0b3J5LnJlcG9OYW1lPy50b0xvd2VyQ2FzZSgpO1xuICBpZiAoIW93bmVyIHx8ICFuYW1lKSByZXR1cm4gZmFsc2U7XG5cbiAgLy8gQW4gdW5rbm93biB2aXNpYmlsaXR5IChmYWlsZWQgR2l0SHViIGxvb2t1cCkgbWF0Y2hlcyBubyB2aXNpYmlsaXR5LWNvbnN0cmFpbmVkIHNjb3BlOiBjYWxsZXJzXG4gIC8vIHRoYXQgd291bGQgcmV3cml0ZSByZWNpcGllbnRzIGZhaWwgaW5zdGVhZCBvZiBlbmNyeXB0aW5nIHRvIHRoZSB3cm9uZyBDSSBpZGVudGl0eS5cbiAgaWYgKFxuICAgIHNjb3BlLnZpc2liaWxpdHkgJiZcbiAgICAoIXJlcG9zaXRvcnkuaXNSZXBvVmlzaWJpbGl0eUtub3duIHx8IChzY29wZS52aXNpYmlsaXR5ID09PSAncHVibGljJykgIT09IHJlcG9zaXRvcnkuaXNQdWJsaWNSZXBvKVxuICApIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICByZXR1cm4gKFxuICAgIChzY29wZS5vcmdhbml6YXRpb25zPy5zb21lKChvcmdhbml6YXRpb24pID0+IG9yZ2FuaXphdGlvbi50b0xvd2VyQ2FzZSgpID09PSBvd25lcikgPz8gZmFsc2UpIHx8XG4gICAgKHNjb3BlLnJlcG9zaXRvcmllcz8uc29tZSgoZnVsbE5hbWUpID0+IGZ1bGxOYW1lLnRvTG93ZXJDYXNlKCkgPT09IGAke293bmVyfS8ke25hbWV9YCkgPz8gZmFsc2UpXG4gICk7XG59XG5cbmZ1bmN0aW9uIHJlcGxhY2VBZ2VSZWNpcGllbnRzKGNvbnRlbnQ6IHN0cmluZywgYWdlUmVjaXBpZW50czogcmVhZG9ubHkgRm5veEFnZVJlY2lwaWVudFtdKTogc3RyaW5nIHtcbiAgLy8gVHJhaWxpbmcgbmFtZSBjb21tZW50cyBsZXQgaHVtYW5zIHRlbGwgd2hvc2Uga2V5IGVhY2ggcmVjaXBpZW50IGlzIHdpdGhvdXQgY29uc3VsdGluZyB3YmZ5LlxuICBjb25zdCByZWNpcGllbnRzVGV4dCA9IGByZWNpcGllbnRzID0gW1xcbiR7YWdlUmVjaXBpZW50c1xuICAgIC5tYXAoKHJlY2lwaWVudCkgPT4gYCAgXCIke3JlY2lwaWVudC5wdWJsaWNLZXl9XCIsICMgJHtyZWNpcGllbnQubmFtZX1gKVxuICAgIC5qb2luKCdcXG4nKX1cXG5dYDtcbiAgLy8gd2JmeSB3cml0ZXMgYSBbcHJvdmlkZXJzLmFnZV0gdGFibGUgKHBvc3NpYmx5IHdpdGggYSB0cmFpbGluZyBjb21tZW50KS4gU2NhbiBsaW5lLXdpc2Ugc28gdGhhdFxuICAvLyBhIGBbYCBpbnNpZGUgYSBjb21tZW50IG9yIGEgc3RyaW5nIG5ldmVyIHRlcm1pbmF0ZXMgdGhlIHRhYmxlIGVhcmx5OyB0aGUgdGFibGUgZW5kcyBhdCB0aGVcbiAgLy8gbmV4dCBsaW5lLXN0YXJ0IHRhYmxlIGhlYWRlci4gVGhlIGFzc2lnbm1lbnQgbWF0Y2ggaXMgbGluZS1hbmNob3JlZCBzbyBhIGNvbW1lbnRlZC1vdXRcbiAgLy8gYCMgcmVjaXBpZW50cyA9IFsuLi5dYCBpcyBuZXZlciBtaXN0YWtlbiBmb3IgdGhlIHJlYWwgb25lLCB3aGlsZSBtdWx0aWxpbmUgYXJyYXlzIHN0aWxsIG1hdGNoXG4gIC8vIGJlY2F1c2UgdGhlIG5lZ2F0ZWQgY2xhc3MgW15cXF1dICh1bmxpa2UgYC5gKSBzcGFucyBuZXdsaW5lcy4gQW55IG90aGVyIHNwZWxsaW5nIGZhbGxzIHRocm91Z2hcbiAgLy8gdG8gdGhlIGNhbGxlcidzIHJlLXBhcnNlIHZhbGlkYXRpb24sIHdoaWNoIGZhaWxzIHRoZSBydW4gc2FmZWx5IHdpdGggaW5zdHJ1Y3Rpb25zIGluc3RlYWQgb2ZcbiAgLy8gY29ycnVwdGluZyB0aGUgZmlsZS5cbiAgY29uc3QgbGluZXMgPSBjb250ZW50LnNwbGl0KCdcXG4nKTtcbiAgY29uc3QgaGVhZGVySW5kZXggPSBsaW5lcy5maW5kSW5kZXgoKGxpbmUpID0+IC9eXFxzKlxcW3Byb3ZpZGVyc1xcLmFnZVxcXVxccyooPzojLiopPyQvdS50ZXN0KGxpbmUpKTtcbiAgaWYgKGhlYWRlckluZGV4ICE9PSAtMSkge1xuICAgIGxldCBlbmRJbmRleCA9IGxpbmVzLmxlbmd0aDtcbiAgICBmb3IgKGxldCBpbmRleCA9IGhlYWRlckluZGV4ICsgMTsgaW5kZXggPCBsaW5lcy5sZW5ndGg7IGluZGV4KyspIHtcbiAgICAgIGlmICgvXlxccypcXFsvdS50ZXN0KGxpbmVzW2luZGV4XSA/PyAnJykpIHtcbiAgICAgICAgZW5kSW5kZXggPSBpbmRleDtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuICAgIGNvbnN0IHNlY3Rpb24gPSBsaW5lcy5zbGljZShoZWFkZXJJbmRleCwgZW5kSW5kZXgpLmpvaW4oJ1xcbicpO1xuICAgIGNvbnN0IHJlcGxhY2VkU2VjdGlvbiA9IHNlY3Rpb24ucmVwbGFjZSgvXlxccypyZWNpcGllbnRzXFxzKj1cXHMqXFxbW15cXF1dKlxcXS9tdSwgcmVjaXBpZW50c1RleHQpO1xuICAgIGNvbnN0IG5ld1NlY3Rpb24gPVxuICAgICAgcmVwbGFjZWRTZWN0aW9uID09PSBzZWN0aW9uXG4gICAgICAgID8gW2xpbmVzW2hlYWRlckluZGV4XSwgcmVjaXBpZW50c1RleHQsIC4uLmxpbmVzLnNsaWNlKGhlYWRlckluZGV4ICsgMSwgZW5kSW5kZXgpXS5qb2luKCdcXG4nKVxuICAgICAgICA6IHJlcGxhY2VkU2VjdGlvbjtcbiAgICByZXR1cm4gWy4uLmxpbmVzLnNsaWNlKDAsIGhlYWRlckluZGV4KSwgbmV3U2VjdGlvbiwgLi4ubGluZXMuc2xpY2UoZW5kSW5kZXgpXS5qb2luKCdcXG4nKTtcbiAgfVxuICByZXR1cm4gYCR7Y29udGVudC50cmltRW5kKCl9XFxuXFxuW3Byb3ZpZGVycy5hZ2VdXFxudHlwZSA9IFwiYWdlXCJcXG4ke3JlY2lwaWVudHNUZXh0fVxcbmA7XG59XG5cbi8vIFJlLWVuY3J5cHRzIHRoZSBiYXNlIHNlY3JldHMgYW5kIGVhY2ggcHJvZmlsZSdzIG93biBzZWNyZXRzICgtLW5vLWRlZmF1bHRzIGtlZXBzIHRoZSBtZXJnZWRcbi8vIGJhc2Ugc2VjcmV0cyBmcm9tIGJlaW5nIGR1cGxpY2F0ZWQgaW50byBwcm9maWxlIHRhYmxlcykgZm9yIHRoZSBjdXJyZW50IHJlY2lwaWVudCBzZXQuIFRoZVxuLy8gc3Bhd25lZCBmbm94IHJ1bnMgd2l0aCBhbiBpc29sYXRlZCBIT01FL1hER19DT05GSUdfSE9NRSBiZWNhdXNlIGZub3ggbWVyZ2VzIHRoZSB1c2VyLWdsb2JhbFxuLy8gfi8uY29uZmlnL2Zub3gvY29uZmlnLnRvbWwgaW50byBldmVyeSBwcm9qZWN0IGNvbmZpZyDigJQgYSBwbGFpbiByZWVuY3J5cHQgd291bGQgcmV3cml0ZSB0aGVcbi8vIHVzZXIncyBnbG9iYWwgc2VjcmV0cyB0b28uIERlY3J5cHRpb24gdGhlcmVmb3JlIG5lZWRzIHRoZSBwZXJzb25hbCBpZGVudGl0eSBwYXNzZWQgZXhwbGljaXRseVxuLy8gdmlhIEZOT1hfQUdFX0tFWTsgRk5PWF9QUk9GSUxFIGlzIHN0cmlwcGVkIHNvIGl0IGNhbm5vdCByZWRpcmVjdCB0aGUgYmFzZSAobm8gLVApIHJ1bi5cbmZ1bmN0aW9uIHJlZW5jcnlwdEZub3hTZWNyZXRzKGRpclBhdGg6IHN0cmluZywgcm9vdERpclBhdGg6IHN0cmluZywgcHJvZmlsZU5hbWVzOiBzdHJpbmdbXSk6IGJvb2xlYW4ge1xuICAvLyBUaGUgaWRlbnRpdHkgaXMgb3B0aW9uYWw6IGEgcGxhaW50ZXh0LW9ubHkgY29uZmlnIGhhcyBub3RoaW5nIHRvIGRlY3J5cHQgYW5kIGZub3ggc3VjY2VlZHNcbiAgLy8gd2l0aG91dCBvbmUsIHdoaWxlIGV4aXN0aW5nIGNpcGhlcnRleHRzIG1ha2UgZm5veCBmYWlsIGxvdWRseSBvbiBpdHMgb3duLlxuICBjb25zdCBpZGVudGl0eSA9IHJlYWRQZXJzb25hbEFnZVNlY3JldEtleSgpID8/IHByb2Nlc3MuZW52LkZOT1hfQUdFX0tFWTtcbiAgY29uc3QgZm5veENvbW1hbmQgPSByZXNvbHZlRm5veENvbW1hbmQoZGlyUGF0aCk7XG4gIGNvbnN0IGlzb2xhdGVkSG9tZURpclBhdGggPSBmcy5ta2R0ZW1wU3luYyhwYXRoLmpvaW4ob3MudG1wZGlyKCksICd3YmZ5LWZub3gtaG9tZS0nKSk7XG4gIHRyeSB7XG4gICAgLy8gSGlkZSB0aGUgbG9jYWwgb3ZlcnJpZGVzIG9mIEVWRVJZIGRpcmVjdG9yeSBmbm94IG1lcmdlcyBoaWVyYXJjaGljYWxseSAoZnJvbSB0aGUgY29tbWFuZFxuICAgIC8vIGRpcmVjdG9yeSB1cCB0byB0aGUgcmVwb3NpdG9yeSByb290KTogYW4gYW5jZXN0b3IncyBmbm94LmxvY2FsLnRvbWwgd291bGQgb3RoZXJ3aXNlIHNoYWRvd1xuICAgIC8vIGNvbW1pdHRlZCBzZWNyZXRzIG9yIGl0c2VsZiBnZXQgcmV3cml0dGVuIGJ5IHRoZSByZS1lbmNyeXB0aW9uLlxuICAgIHJldHVybiB3aXRoRm5veExvY2Fsc0hpZGRlbihyb290RGlyUGF0aCwgbGlzdEFuY2VzdG9yRGlyUGF0aHMoZGlyUGF0aCwgcm9vdERpclBhdGgpLCAoKSA9PiB7XG4gICAgICBjb25zdCBlbnYgPSB7XG4gICAgICAgIC4uLk9iamVjdC5mcm9tRW50cmllcyhPYmplY3QuZW50cmllcyhwcm9jZXNzLmVudikuZmlsdGVyKChba2V5XSkgPT4gIWtleS5zdGFydHNXaXRoKCdGTk9YXycpKSksXG4gICAgICAgIC4uLihpZGVudGl0eSA/IHsgRk5PWF9BR0VfS0VZOiBpZGVudGl0eSB9IDoge30pLFxuICAgICAgICBIT01FOiBpc29sYXRlZEhvbWVEaXJQYXRoLFxuICAgICAgICBYREdfQ09ORklHX0hPTUU6IGlzb2xhdGVkSG9tZURpclBhdGgsXG4gICAgICB9O1xuICAgICAgY29uc3QgcHJvZmlsZUFyZ3NMaXN0ID0gW1tdLCAuLi5wcm9maWxlTmFtZXMubWFwKChuYW1lKSA9PiBbJy0tbm8tZGVmYXVsdHMnLCBgLS1wcm9maWxlPSR7bmFtZX1gXSldO1xuICAgICAgZm9yIChjb25zdCBwcm9maWxlQXJncyBvZiBwcm9maWxlQXJnc0xpc3QpIHtcbiAgICAgICAgY29uc3QgYXJncyA9IFsncmVlbmNyeXB0JywgJy0tZm9yY2UnLCAnLS1uby1kYWVtb24nLCAnLS1wcm92aWRlcicsICdhZ2UnLCAuLi5wcm9maWxlQXJnc107XG4gICAgICAgIGNvbnNvbGUubG9nKGAkICR7Zm5veENvbW1hbmR9ICR7YXJncy5qb2luKCcgJyl9IGF0ICR7ZGlyUGF0aH1gKTtcbiAgICAgICAgY29uc3QgcHJvYyA9IGNoaWxkX3Byb2Nlc3Muc3Bhd25TeW5jKGZub3hDb21tYW5kLCBhcmdzLCB7XG4gICAgICAgICAgY3dkOiBkaXJQYXRoLFxuICAgICAgICAgIGVuY29kaW5nOiAndXRmOCcsXG4gICAgICAgICAgc3RkaW86ICdpbmhlcml0JyxcbiAgICAgICAgICBlbnYsXG4gICAgICAgIH0pO1xuICAgICAgICBpZiAoKHByb2Muc3RhdHVzID8/IDEpICE9PSAwKSByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9KTtcbiAgfSBmaW5hbGx5IHtcbiAgICBmcy5ybVN5bmMoaXNvbGF0ZWRIb21lRGlyUGF0aCwgeyByZWN1cnNpdmU6IHRydWUsIGZvcmNlOiB0cnVlIH0pO1xuICB9XG59XG5cbi8qKlxuICogUmVzb2x2ZXMgdGhlIGFjdHVhbCBmbm94IGJpbmFyeS4gYGZub3hgIG9uIFBBVEggaXMgb2Z0ZW4gYSBtaXNlIHNoaW0sIGFuZCBtaXNlIHJlZnVzZXMgdG8gcnVuXG4gKiBvbmNlIEhPTUUvWERHX0NPTkZJR19IT01FIHBvaW50IGF0IHRoZSBpc29sYXRlZCBkaXJlY3RvcnkgKGl0cyB0cnVzdCBzdGF0ZSBkaXNhcHBlYXJzKSwgc28gdGhlXG4gKiBpc29sYXRlZCBzcGF3bnMgbmVlZCB0aGUgc2hpbSByZXNvbHZlZCB0byB0aGUgcmVhbCBleGVjdXRhYmxlIGJlZm9yZWhhbmQuXG4gKi9cbmZ1bmN0aW9uIHJlc29sdmVGbm94Q29tbWFuZChkaXJQYXRoOiBzdHJpbmcpOiBzdHJpbmcge1xuICBjb25zdCBwcm9jID0gY2hpbGRfcHJvY2Vzcy5zcGF3blN5bmMoJ21pc2UnLCBbJ3doaWNoJywgJ2Zub3gnXSwgeyBjd2Q6IGRpclBhdGgsIGVuY29kaW5nOiAndXRmOCcsIHN0ZGlvOiAncGlwZScgfSk7XG4gIGNvbnN0IHJlc29sdmVkID0gcHJvYy5zdGF0dXMgPT09IDAgPyBwcm9jLnN0ZG91dC50cmltKCkgOiAnJztcbiAgcmV0dXJuIHJlc29sdmVkIHx8ICdmbm94Jztcbn1cblxuLy8gVGhlIHBlcnNvbmFsIGlkZW50aXR5IGZpbGUgaXMgbWFjaGluZS1nbG9iYWwsIHNvIGl0IGlzIHJlYWQgb25jZSBwZXIgcHJvY2Vzcy5cbmxldCBoYXNSZWFkUGVyc29uYWxBZ2VTZWNyZXRLZXkgPSBmYWxzZTtcbmxldCBjYWNoZWRQZXJzb25hbEFnZVNlY3JldEtleTogc3RyaW5nIHwgdW5kZWZpbmVkO1xuXG5mdW5jdGlvbiByZWFkUGVyc29uYWxBZ2VTZWNyZXRLZXkoKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgaWYgKGhhc1JlYWRQZXJzb25hbEFnZVNlY3JldEtleSkgcmV0dXJuIGNhY2hlZFBlcnNvbmFsQWdlU2VjcmV0S2V5O1xuICBoYXNSZWFkUGVyc29uYWxBZ2VTZWNyZXRLZXkgPSB0cnVlO1xuICB0cnkge1xuICAgIGNvbnN0IGNvbnRlbnQgPSBmcy5yZWFkRmlsZVN5bmMocGF0aC5qb2luKG9zLmhvbWVkaXIoKSwgJy5jb25maWcnLCAnZm5veCcsICdhZ2UudHh0JyksICd1dGY4Jyk7XG4gICAgY2FjaGVkUGVyc29uYWxBZ2VTZWNyZXRLZXkgPSBjb250ZW50XG4gICAgICAuc3BsaXQoJ1xcbicpXG4gICAgICAuZmluZCgobGluZSkgPT4gbGluZS50cmltKCkuc3RhcnRzV2l0aCgnQUdFLVNFQ1JFVC1LRVktJykpXG4gICAgICA/LnRyaW0oKTtcbiAgfSBjYXRjaCB7XG4gICAgY2FjaGVkUGVyc29uYWxBZ2VTZWNyZXRLZXkgPSB1bmRlZmluZWQ7XG4gIH1cbiAgcmV0dXJuIGNhY2hlZFBlcnNvbmFsQWdlU2VjcmV0S2V5O1xufVxuXG4vKipcbiAqIFJ1bnMgYSBmdW5jdGlvbiB3aGlsZSB0aGUgbWFjaGluZS1sb2NhbCBmbm94LmxvY2FsLnRvbWwgZmlsZXMgb2YgdGhlIGdpdmVuIGRpcmVjdG9yaWVzIGFyZVxuICogdGVtcG9yYXJpbHkgbW92ZWQgYXNpZGU6IGZub3ggbG9hZHMgdGhlbSBhdCBoaWdoZXIgcHJpb3JpdHkgdGhhbiB0aGUgY29tbWl0dGVkIGZub3gudG9tbCwgc28gYVxuICogbG9jYWwgb3ZlcnJpZGUgc2hhZG93aW5nIGEgY29tbWl0dGVkIHNlY3JldCB3b3VsZCBtYWtlIGBmbm94IHJlZW5jcnlwdGAgc2tpcCB0aGF0IHNlY3JldC5cbiAqL1xuZnVuY3Rpb24gd2l0aEZub3hMb2NhbHNIaWRkZW48VD4ocm9vdERpclBhdGg6IHN0cmluZywgZGlyUGF0aHM6IHN0cmluZ1tdLCBmdW5jOiAoKSA9PiBUKTogVCB7XG4gIGNvbnN0IGhpZGRlbkRpclBhdGhzOiBzdHJpbmdbXSA9IFtdO1xuICB0cnkge1xuICAgIGZvciAoY29uc3QgZGlyUGF0aCBvZiBkaXJQYXRocykge1xuICAgICAgcmVjb3ZlclN0YWxlRm5veExvY2FsQmFja3VwKHJvb3REaXJQYXRoLCBkaXJQYXRoKTtcbiAgICAgIGNvbnN0IGxvY2FsUGF0aCA9IHBhdGgucmVzb2x2ZShkaXJQYXRoLCAnZm5veC5sb2NhbC50b21sJyk7XG4gICAgICBpZiAoZnMuZXhpc3RzU3luYyhsb2NhbFBhdGgpKSB7XG4gICAgICAgIGNvbnN0IGJhY2t1cFBhdGggPSBmbm94TG9jYWxCYWNrdXBQYXRoKHJvb3REaXJQYXRoLCBkaXJQYXRoKTtcbiAgICAgICAgZW5zdXJlU2FmZUZub3hMb2NhbEJhY2t1cERpcihyb290RGlyUGF0aCwgYmFja3VwUGF0aCk7XG4gICAgICAgIGZzLnJlbmFtZVN5bmMobG9jYWxQYXRoLCBiYWNrdXBQYXRoKTtcbiAgICAgICAgaGlkZGVuRGlyUGF0aHMucHVzaChkaXJQYXRoKTtcbiAgICAgIH1cbiAgICB9XG4gICAgY29uc3QgcmVzdWx0ID0gZnVuYygpO1xuICAgIC8vIEEgcmVzdG9yYXRpb24gY29uZmxpY3QgdGhyb3dzIGhlcmUgYW5kIHRoZXJlYnkgaW52YWxpZGF0ZXMgdGhlIHNlZW1pbmdseSBzdWNjZXNzZnVsIHJlc3VsdDpcbiAgICAvLyBhIHJlY3JlYXRlZCBvdmVycmlkZSBtYXkgaGF2ZSBzaGFkb3dlZCBjb21taXR0ZWQgc2VjcmV0cyBkdXJpbmcgdGhlIGZub3ggcnVuLCBzbyB0aGUgb3V0ZXJcbiAgICAvLyB0cmFuc2FjdGlvbiBtdXN0IHJlc3RvcmUgZXZlcnkgY29tbWl0dGVkIGZub3gudG9tbCBpbnN0ZWFkIG9mIGNvbW1pdHRpbmcgdGhlIG1pZ3JhdGlvbi5cbiAgICByZXN0b3JlSGlkZGVuRm5veExvY2Fscyhyb290RGlyUGF0aCwgaGlkZGVuRGlyUGF0aHMpO1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgLy8gVGhlIG9yaWdpbmFsIGZhaWx1cmUgbXVzdCB3aW47IGEgcmVzdG9yYXRpb24gY29uZmxpY3Qgb24gdGhpcyBwYXRoIGlzIG9ubHkgcmVwb3J0ZWQgc28gaXRcbiAgICAvLyBjYW5ub3QgbWFzayB0aGUgcm9vdCBjYXVzZS5cbiAgICB0cnkge1xuICAgICAgcmVzdG9yZUhpZGRlbkZub3hMb2NhbHMocm9vdERpclBhdGgsIGhpZGRlbkRpclBhdGhzKTtcbiAgICB9IGNhdGNoIChyZXN0b3JlRXJyb3IpIHtcbiAgICAgIGZhaWxGbm94U3luYygocmVzdG9yZUVycm9yIGFzIEVycm9yIHwgdW5kZWZpbmVkKT8ubWVzc2FnZSA/PyBTdHJpbmcocmVzdG9yZUVycm9yKSk7XG4gICAgfVxuICAgIHRocm93IGVycm9yO1xuICB9XG59XG5cbi8vIE1vdmVzIHRoZSBoaWRkZW4gZm5veC5sb2NhbC50b21sIGZpbGVzIGJhY2ssIGNsZWFyaW5nIHRoZSBnaXZlbiBsaXN0IHNvIGEgc2Vjb25kIGNhbGwgaXMgYVxuLy8gbm8tb3AuIE5ldmVyIGNsb2JiZXJzIGEgZm5veC5sb2NhbC50b21sIHJlY3JlYXRlZCAoZS5nLiBieSBhbiBlZGl0b3IpIHdoaWxlIGZub3ggd2FzIHJ1bm5pbmc6XG4vLyB0aGUgYmFja3VwIGlzIGtlcHQgYW5kIHJlcG9ydGVkIGZvciBhIG1hbnVhbCBtZXJnZS5cbmZ1bmN0aW9uIHJlc3RvcmVIaWRkZW5Gbm94TG9jYWxzKHJvb3REaXJQYXRoOiBzdHJpbmcsIGhpZGRlbkRpclBhdGhzOiBzdHJpbmdbXSk6IHZvaWQge1xuICBjb25zdCBjb25mbGljdGluZ0xvY2FsUGF0aHM6IHN0cmluZ1tdID0gW107XG4gIGZvciAoY29uc3QgZGlyUGF0aCBvZiBoaWRkZW5EaXJQYXRocy5zcGxpY2UoMCkpIHtcbiAgICBjb25zdCBsb2NhbFBhdGggPSBwYXRoLnJlc29sdmUoZGlyUGF0aCwgJ2Zub3gubG9jYWwudG9tbCcpO1xuICAgIGlmIChmcy5leGlzdHNTeW5jKGxvY2FsUGF0aCkpIHtcbiAgICAgIGNvbmZsaWN0aW5nTG9jYWxQYXRocy5wdXNoKGxvY2FsUGF0aCk7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgZnMucmVuYW1lU3luYyhmbm94TG9jYWxCYWNrdXBQYXRoKHJvb3REaXJQYXRoLCBkaXJQYXRoKSwgbG9jYWxQYXRoKTtcbiAgfVxuICBpZiAoY29uZmxpY3RpbmdMb2NhbFBhdGhzLmxlbmd0aCA+IDApIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICBgVGhlIGZvbGxvd2luZyBmbm94LmxvY2FsLnRvbWwgZmlsZXMgd2VyZSByZWNyZWF0ZWQgd2hpbGUgZm5veCB3YXMgcnVubmluZyAob3JpZ2luYWwgZmlsZXMgYXJlIHByZXNlcnZlZCB1bmRlciAke3BhdGgucmVzb2x2ZShyb290RGlyUGF0aCwgJy50bXAnLCAnd2JmeS1mbm94LWxvY2FsLWJhY2t1cCcpfSDigJQgbWVyZ2UgdGhlbSBtYW51YWxseSk6ICR7Y29uZmxpY3RpbmdMb2NhbFBhdGhzLmpvaW4oJywgJyl9YFxuICAgICk7XG4gIH1cbn1cblxuLyoqXG4gKiBSZXN0b3JlcyBhIGZub3gubG9jYWwudG9tbCBiYWNrdXAgbGVmdCBieSBhbiBpbnRlcnJ1cHRlZCBlYXJsaWVyIHJ1biBzbyB0aGUgdXNlcidzIGxvY2FsXG4gKiBvdmVycmlkZXMgYXJlIG5ldmVyIHNpbGVudGx5IGxvc3QuXG4gKi9cbmZ1bmN0aW9uIHJlY292ZXJTdGFsZUZub3hMb2NhbEJhY2t1cChyb290RGlyUGF0aDogc3RyaW5nLCBkaXJQYXRoOiBzdHJpbmcpOiB2b2lkIHtcbiAgY29uc3QgbG9jYWxQYXRoID0gcGF0aC5yZXNvbHZlKGRpclBhdGgsICdmbm94LmxvY2FsLnRvbWwnKTtcbiAgY29uc3QgYmFja3VwUGF0aCA9IGZub3hMb2NhbEJhY2t1cFBhdGgocm9vdERpclBhdGgsIGRpclBhdGgpO1xuICBpZiAoIWZzLmV4aXN0c1N5bmMoYmFja3VwUGF0aCkpIHJldHVybjtcbiAgaWYgKGZzLmV4aXN0c1N5bmMobG9jYWxQYXRoKSkge1xuICAgIHRocm93IG5ldyBFcnJvcihgQm90aCAke2xvY2FsUGF0aH0gYW5kIGl0cyBiYWNrdXAgJHtiYWNrdXBQYXRofSBleGlzdDsgcmVzb2x2ZSB0aGUgbGVmdG92ZXIgYmFja3VwIG1hbnVhbGx5LmApO1xuICB9XG4gIGVuc3VyZVNhZmVGbm94TG9jYWxCYWNrdXBEaXIocm9vdERpclBhdGgsIGJhY2t1cFBhdGgpO1xuICBmcy5yZW5hbWVTeW5jKGJhY2t1cFBhdGgsIGxvY2FsUGF0aCk7XG59XG5cbi8vIENyZWF0ZXMgdGhlIGJhY2t1cCBkaXJlY3RvcnkgYW5kIHByb3ZlcyBubyBwYXRoIGNvbXBvbmVudCBiZWxvdyB0aGUgcmVwb3NpdG9yeSByb290IGlzIGFcbi8vIHN5bWxpbms6IGEgcmVwb3NpdG9yeS1jb250cm9sbGVkIHN5bWxpbmsgKGUuZy4gYSB0cmFja2VkIC50bXAvd2JmeS1mbm94LWxvY2FsLWJhY2t1cCBsaW5rKVxuLy8gY291bGQgb3RoZXJ3aXNlIG1vdmUgdGhlIHBsYWludGV4dCBsb2NhbCBzZWNyZXRzIG91dHNpZGUgdGhlIHJlcG9zaXRvcnksIG9yIHJlc29sdmUgdGhlIGJhY2t1cFxuLy8gYmFjayBvbnRvIHRoZSBzb3VyY2UgZmlsZSBhbmQgdHVybiB0aGUgaGlkZSByZW5hbWUgaW50byBhIG5vLW9wLlxuZnVuY3Rpb24gZW5zdXJlU2FmZUZub3hMb2NhbEJhY2t1cERpcihyb290RGlyUGF0aDogc3RyaW5nLCBiYWNrdXBQYXRoOiBzdHJpbmcpOiB2b2lkIHtcbiAgY29uc3QgYmFja3VwRGlyUGF0aCA9IHBhdGguZGlybmFtZShiYWNrdXBQYXRoKTtcbiAgZnMubWtkaXJTeW5jKGJhY2t1cERpclBhdGgsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICBjb25zdCBleHBlY3RlZFJlYWxQYXRoID0gcGF0aC5qb2luKGZzLnJlYWxwYXRoU3luYyhyb290RGlyUGF0aCksIHBhdGgucmVsYXRpdmUocm9vdERpclBhdGgsIGJhY2t1cERpclBhdGgpKTtcbiAgaWYgKGZzLnJlYWxwYXRoU3luYyhiYWNrdXBEaXJQYXRoKSAhPT0gZXhwZWN0ZWRSZWFsUGF0aCkge1xuICAgIHRocm93IG5ldyBFcnJvcihgJHtiYWNrdXBEaXJQYXRofSByZXNvbHZlcyB0aHJvdWdoIGEgc3ltbGluazsgcmVtb3ZlIHRoZSBzeW1saW5rZWQgY29tcG9uZW50LmApO1xuICB9XG59XG5cbi8vIFRoZSBiYWNrdXAgbGl2ZXMgdW5kZXIgdGhlIGdpdGlnbm9yZWQgLnRtcCBzbyBhIGhpZGRlbiBmbm94LmxvY2FsLnRvbWwgY2FuIG5ldmVyIGJlY29tZVxuLy8gc3RhZ2VhYmxlIChhIHNpYmxpbmcgcmVuYW1lIGxpa2UgZm5veC5sb2NhbC50b21sLndiZnktYmFrIHdvdWxkIG5vIGxvbmdlciBtYXRjaCB0aGUgZG9jdW1lbnRlZFxuLy8gYGZub3gubG9jYWwudG9tbGAgaWdub3JlIGVudHJ5IGFuZCBjb3VsZCBiZSBjb21taXR0ZWQgYnkgYGdpdCBhZGQgLUFgKS5cbmZ1bmN0aW9uIGZub3hMb2NhbEJhY2t1cFBhdGgocm9vdERpclBhdGg6IHN0cmluZywgZGlyUGF0aDogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIHBhdGgucmVzb2x2ZShcbiAgICByb290RGlyUGF0aCxcbiAgICAnLnRtcCcsXG4gICAgJ3diZnktZm5veC1sb2NhbC1iYWNrdXAnLFxuICAgIHBhdGgucmVsYXRpdmUocm9vdERpclBhdGgsIGRpclBhdGgpLFxuICAgICdmbm94LmxvY2FsLnRvbWwnXG4gICk7XG59XG5cbmZ1bmN0aW9uIHdyaXRlTWlncmF0aW9uTWFya2VyKCk6IHZvaWQge1xuICBpZiAoIW1pZ3JhdGlvbk1hcmtlclBhdGggfHwgbWlncmF0aW9uTWFya2VyT3duZWQpIHJldHVybjtcbiAgY29uc3QgdG1wRGlyUGF0aCA9IHBhdGguZGlybmFtZShtaWdyYXRpb25NYXJrZXJQYXRoKTtcbiAgZnMubWtkaXJTeW5jKHRtcERpclBhdGgsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICAvLyBSZWZ1c2UgdG8gd3JpdGUgdGhyb3VnaCBzeW1saW5rczogYSByZXBvc2l0b3J5LWNvbnRyb2xsZWQgLnRtcCBzeW1saW5rIGNvdWxkIG90aGVyd2lzZVxuICAvLyByZWRpcmVjdCB0aGUgbWFya2VyIHdyaXRlIG91dHNpZGUgdGhlIHJlcG9zaXRvcnkuIFRoZSBgd3hgIGZsYWcgbWFrZXMgdGhlIG9wZW4gaXRzZWxmIGZhaWxcbiAgLy8gb24gYW55IHByZS1leGlzdGluZyBwYXRoLCBpbmNsdWRpbmcgYSBkYW5nbGluZyBzeW1saW5rIOKAlCB3aGljaCBhbHNvIGFjcXVpcmVzIHRoZSBtYXJrZXJcbiAgLy8gYXRvbWljYWxseSwgc28gYSBjb25jdXJyZW50IHdiZnkgcnVuIGNhbm5vdCBzdGFydCBhIHNlY29uZCBtaWdyYXRpb24uXG4gIGlmIChmcy5sc3RhdFN5bmModG1wRGlyUGF0aCkuaXNTeW1ib2xpY0xpbmsoKSkge1xuICAgIHRocm93IG5ldyBFcnJvcihgJHt0bXBEaXJQYXRofSBpcyBhIHN5bWxpbms7IHJlcGxhY2UgaXQgd2l0aCBhIHJlZ3VsYXIgZGlyZWN0b3J5LmApO1xuICB9XG4gIHRyeSB7XG4gICAgZnMud3JpdGVGaWxlU3luYyhcbiAgICAgIG1pZ3JhdGlvbk1hcmtlclBhdGgsXG4gICAgICAnd2JmeSBmbm94IG1pZ3JhdGlvbiBpbiBwcm9ncmVzczsgYSBsZWZ0b3ZlciBtYXJrZXIgYmxvY2tzIG5ldyBtaWdyYXRpb25zXFxuJyxcbiAgICAgIHtcbiAgICAgICAgZmxhZzogJ3d4JyxcbiAgICAgIH1cbiAgICApO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIHRocm93IG5ldyBFcnJvcihgQW5vdGhlciB3YmZ5IHByb2Nlc3MgYXBwZWFycyB0byBiZSBtaWdyYXRpbmcgKCR7bWlncmF0aW9uTWFya2VyUGF0aH0gZXhpc3RzKTogJHtlcnJvcn1gKTtcbiAgfVxuICBtaWdyYXRpb25NYXJrZXJPd25lZCA9IHRydWU7XG59XG5cbi8vIE9ubHkgdGhlIHJ1biB0aGF0IGFjcXVpcmVkIHRoZSBtYXJrZXIgbWF5IHJlbW92ZSBpdDogZGVsZXRpbmcgYSBmb3JlaWduIG1hcmtlciB3b3VsZCBkaXNhYmxlXG4vLyBpbnRlcnJ1cHRlZC1taWdyYXRpb24gZGV0ZWN0aW9uIGZvciBhIGNvbmN1cnJlbnRseSBydW5uaW5nIHdiZnkuXG5mdW5jdGlvbiByZW1vdmVPd25lZE1pZ3JhdGlvbk1hcmtlcigpOiB2b2lkIHtcbiAgaWYgKCFtaWdyYXRpb25NYXJrZXJPd25lZCB8fCAhbWlncmF0aW9uTWFya2VyUGF0aCkgcmV0dXJuO1xuICBmcy5ybVN5bmMobWlncmF0aW9uTWFya2VyUGF0aCwgeyBmb3JjZTogdHJ1ZSB9KTtcbiAgbWlncmF0aW9uTWFya2VyT3duZWQgPSBmYWxzZTtcbn1cblxuZnVuY3Rpb24gcmVzdG9yZVNuYXBzaG90cyhzbmFwc2hvdHM6IE1hcDxzdHJpbmcsIHN0cmluZz4pOiBib29sZWFuIHtcbiAgbGV0IHN1Y2NlZWRlZCA9IHRydWU7XG4gIGZvciAoY29uc3QgW2ZpbGVQYXRoLCBjb250ZW50XSBvZiBzbmFwc2hvdHMpIHtcbiAgICB0cnkge1xuICAgICAgZnMud3JpdGVGaWxlU3luYyhmaWxlUGF0aCwgY29udGVudCk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGZhaWxGbm94U3luYyhgRmFpbGVkIHRvIHJlc3RvcmUgJHtmaWxlUGF0aH0gYWZ0ZXIgYSBmYWlsZWQgbWlncmF0aW9uOiAke2Vycm9yfWApO1xuICAgICAgc3VjY2VlZGVkID0gZmFsc2U7XG4gICAgfVxuICB9XG4gIHJldHVybiBzdWNjZWVkZWQ7XG59XG5cbmZ1bmN0aW9uIGZhaWxGbm94U3luYyhtZXNzYWdlOiBzdHJpbmcpOiB2b2lkIHtcbiAgY29uc29sZS5lcnJvcihtZXNzYWdlKTtcbiAgcHJvY2Vzcy5leGl0Q29kZSA9IDE7XG4gIGZub3hTeW5jRmFpbGVkID0gdHJ1ZTtcbn1cblxuLy8gUmV0dXJucyBhIGRlc2NyaXB0aW9uIG9mIGFuIHVuc3VwcG9ydGVkIGZub3gubG9jYWwudG9tbCBpbiB0aGUgZGlyZWN0b3J5LCBvciB1bmRlZmluZWQuIExvY2FsXG4vLyBvdmVycmlkZXMgbWF5IG9ubHkgaG9sZCBtYWNoaW5lLWxvY2FsIHNlY3JldCB2YWx1ZXM7IGltcG9ydHMgb3IgcHJvdmlkZXIgKHJlKWRlZmluaXRpb25zIHdvdWxkXG4vLyBzaWxlbnRseSBjaGFuZ2Ugd2hpY2ggcmVjaXBpZW50IHNldCBnb3Zlcm5zIHJlLWVuY3J5cHRpb24uXG5mdW5jdGlvbiBmaW5kRm5veExvY2FsVG9tbElzc3VlKGRpclBhdGg6IHN0cmluZyk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IGxvY2FsVG9tbFBhdGggPSBwYXRoLnJlc29sdmUoZGlyUGF0aCwgJ2Zub3gubG9jYWwudG9tbCcpO1xuICBpZiAoIWZzLmV4aXN0c1N5bmMobG9jYWxUb21sUGF0aCkpIHJldHVybiB1bmRlZmluZWQ7XG4gIGNvbnN0IGxvY2FsU2V0dGluZ3MgPSBCdW4uVE9NTC5wYXJzZShmcy5yZWFkRmlsZVN5bmMobG9jYWxUb21sUGF0aCwgJ3V0ZjgnKSkgYXMgRm5veFRvbWw7XG4gIGNvbnN0IGRlZmluZXNQcm92aWRlcnMgPVxuICAgIGxvY2FsU2V0dGluZ3MuaW1wb3J0ICE9PSB1bmRlZmluZWQgfHxcbiAgICBsb2NhbFNldHRpbmdzLnByb3ZpZGVycyAhPT0gdW5kZWZpbmVkIHx8XG4gICAgT2JqZWN0LnZhbHVlcyhsb2NhbFNldHRpbmdzLnByb2ZpbGVzID8/IHt9KS5zb21lKChwcm9maWxlKSA9PiBwcm9maWxlPy5wcm92aWRlcnMgIT09IHVuZGVmaW5lZCk7XG4gIHJldHVybiBkZWZpbmVzUHJvdmlkZXJzID8gYCR7bG9jYWxUb21sUGF0aH0gZGVmaW5lcyBpbXBvcnRzLCBwcm92aWRlcnMsIG9yIHByb2ZpbGUgcHJvdmlkZXJzYCA6IHVuZGVmaW5lZDtcbn1cblxuLyoqXG4gKiBMaXN0cyBldmVyeSBkaXJlY3RvcnkgY29udGFpbmluZyBhIGNvbW1pdHRlZCAob3IgY29tbWl0dGFibGUpIGZub3gudG9tbCBhbW9uZyB0aGUgZ2l2ZW5cbiAqIGdpdC1kaXNjb3ZlcmVkIGNvbmZpZyBwYXRocyAoc2VlIGxpc3RGbm94TGlrZUZpbGVQYXRoczogZ2l0LWJhc2VkIGRpc2NvdmVyeSBleGNsdWRlcyBnaXRpZ25vcmVkXG4gKiB0cmVlcyBzdWNoIGFzIG5vZGVfbW9kdWxlcyB3aXRob3V0IGV4Y2x1ZGluZyBsZWdpdGltYXRlIHBhY2thZ2VzIG5hbWVkIGxpa2UgYnVpbGQgb3V0cHV0cykuXG4gKi9cbmZ1bmN0aW9uIGxpc3RGbm94VG9tbERpclBhdGhzKGZub3hMaWtlRmlsZVBhdGhzOiBzdHJpbmdbXSk6IHN0cmluZ1tdIHtcbiAgcmV0dXJuIFtcbiAgICAuLi5uZXcgU2V0KFxuICAgICAgZm5veExpa2VGaWxlUGF0aHNcbiAgICAgICAgLmZpbHRlcigoZmlsZVBhdGgpID0+IHBhdGguYmFzZW5hbWUoZmlsZVBhdGgpID09PSAnZm5veC50b21sJylcbiAgICAgICAgLm1hcCgoZmlsZVBhdGgpID0+IHBhdGguZGlybmFtZShmaWxlUGF0aCkpXG4gICAgKSxcbiAgXS50b1NvcnRlZCgpO1xufVxuXG4vKipcbiAqIFdoZXRoZXIgYSBmbm94IGNvbmZpZyBkZWNsYXJlcyBpdHMgb3duIGBbcHJvdmlkZXJzLmFnZV1gLCBpLmUuIHBhcnRpY2lwYXRlcyBpbiBhZ2UgZW5jcnlwdGlvbi5cbiAqIEEgY29uZmlnIHdpdGhvdXQgb25lIGVpdGhlciBpbmhlcml0cyBhIG1hbmFnZWQgcm9vdCdzIHByb3ZpZGVyIChoYW5kbGVkIGJ5IHRoZSByb290LWV4aXN0cyBwYXRoKVxuICogb3IsIHdoZW4gbm8gcm9vdCBleGlzdHMsIHVzZXMgbm8gYWdlIGVuY3J5cHRpb24gYXQgYWxsIOKAlCBzbyBpdCBuZWVkcyBubyByZWNpcGllbnQgc3luY2hyb25pemF0aW9uXG4gKiBhbmQgb3ducyBubyBGTk9YX0FHRV9LRVkuXG4gKi9cbmZ1bmN0aW9uIGRlY2xhcmVzRm5veEFnZVByb3ZpZGVyKGZpbGVQYXRoOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgbGV0IGNvbnRlbnQ6IHN0cmluZztcbiAgdHJ5IHtcbiAgICBjb250ZW50ID0gZnMucmVhZEZpbGVTeW5jKGZpbGVQYXRoLCAndXRmOCcpO1xuICB9IGNhdGNoIHtcbiAgICAvLyBGYWlsIGNsb3NlZDogYW4gdW5yZWFkYWJsZSBjb25maWcgbWlnaHQgZGVjbGFyZSBhbiBhZ2UgcHJvdmlkZXIuXG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgdHJ5IHtcbiAgICByZXR1cm4gQm9vbGVhbigoQnVuLlRPTUwucGFyc2UoY29udGVudCkgYXMgRm5veFRvbWwpLnByb3ZpZGVycz8uYWdlKTtcbiAgfSBjYXRjaCB7XG4gICAgLy8gRmFpbCBjbG9zZWQ6IGFuIHVucGFyc2FibGUgY29uZmlnIG1pZ2h0IGRlY2xhcmUgYW4gYWdlIHByb3ZpZGVyLlxuICAgIHJldHVybiB0cnVlO1xuICB9XG59XG5cbi8qKlxuICogV2hldGhlciBhIGZub3ggY29uZmlnIHBhdGggbGllcyBpbnNpZGUgYSB0ZXN0LWZpeHR1cmUgdHJlZSAodGVzdC9maXh0dXJlcywgdGVzdC1maXh0dXJlcyxcbiAqIF9fdGVzdHNfXyk6IGZpeHR1cmUgY29uZmlncyBhcmUgdGVzdCBJTlBVVFMsIG5vdCByZXBvc2l0b3J5IGNvbmZpZ3VyYXRpb24uIGZub3ggbmV2ZXIgbG9hZHNcbiAqIHRoZW0gZm9yIHJlYWwgY29tbWFuZHMgKGhpZXJhcmNoaWNhbCBsb2FkaW5nIG9ubHkgd2Fsa3MgY3dkIGFuY2VzdG9ycyksIHJlY2lwaWVudFxuICogc3luY2hyb25pemF0aW9uIG11c3Qgbm90IHJld3JpdGUgb3IgcmUtZW5jcnlwdCB0aGVtIChzaGFyZWQtbGliLW5vZGUncyB1bmRlY3J5cHRhYmxlIGZpeHR1cmVcbiAqIGV4aXN0cyBwcmVjaXNlbHkgdG8gc3RheSB1bmRlY3J5cHRhYmxlKSwgYW5kIGEgZml4dHVyZSBtdXN0IG5vdCBmYWlsIHRoZSBzdHJheS1uZXN0ZWQtY29uZmlnXG4gKiBjaGVjayBpbiByZXBvc2l0b3JpZXMgd2l0aG91dCBhIHJvb3QgZm5veC50b21sLlxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNUZXN0Rml4dHVyZUZub3hQYXRoKGZpbGVQYXRoOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgLy8gYGZpeHR1cmVzYCBjb3VudHMgb25seSBkaXJlY3RseSB1bmRlciBhIHRlc3QgZGlyZWN0b3J5OiB3YmZ5IHN1cHBvcnRzIGFyYml0cmFyeSB3b3Jrc3BhY2VzLFxuICAvLyBzbyBhIGxlZ2l0aW1hdGUgYHBhY2thZ2VzL2ZpeHR1cmVzL2Agd29ya3NwYWNlIG11c3Qgc3RheSBtYW5hZ2VkIGFuZCB2ZXJpZmllZC5cbiAgY29uc3Qgc2VnbWVudHMgPSBmaWxlUGF0aC5zcGxpdCgnLycpO1xuICByZXR1cm4gc2VnbWVudHMuc29tZShcbiAgICAoc2VnbWVudCwgaW5kZXgpID0+XG4gICAgICBzZWdtZW50ID09PSAndGVzdC1maXh0dXJlcycgfHxcbiAgICAgIHNlZ21lbnQgPT09ICdfX3Rlc3RzX18nIHx8XG4gICAgICAoc2VnbWVudCA9PT0gJ2ZpeHR1cmVzJyAmJiAoc2VnbWVudHNbaW5kZXggLSAxXSA9PT0gJ3Rlc3QnIHx8IHNlZ21lbnRzW2luZGV4IC0gMV0gPT09ICd0ZXN0cycpKVxuICApO1xufVxuXG5mdW5jdGlvbiBsaXN0Rm5veExpa2VGaWxlUGF0aHMocm9vdERpclBhdGg6IHN0cmluZyk6IHN0cmluZ1tdIHtcbiAgLy8gLXogcHJpbnRzIE5VTC1kZWxpbWl0ZWQgdmVyYmF0aW0gcGF0aHM7IHdpdGhvdXQgaXQsIGNvcmUucXVvdGVQYXRoIEMtcXVvdGVzIG5vbi1BU0NJSSBwYXRoc1xuICAvLyAoZS5nLiBcIlxcMzQ2XFwyMjdcXDI0NS4uLlwiKSwgd2hpY2ggd291bGQgbWFrZSB0aGUgYmFzZW5hbWUgZmlsdGVyIHNpbGVudGx5IHNraXAgdGhvc2UgY29uZmlncy5cbiAgY29uc3QgcHJvYyA9IGNoaWxkX3Byb2Nlc3Muc3Bhd25TeW5jKFxuICAgICdnaXQnLFxuICAgIFsnbHMtZmlsZXMnLCAnLXonLCAnLS1jYWNoZWQnLCAnLS1vdGhlcnMnLCAnLS1leGNsdWRlLXN0YW5kYXJkJywgJy0tJywgJypmbm94Ki50b21sJ10sXG4gICAgeyBjd2Q6IHJvb3REaXJQYXRoLCBlbmNvZGluZzogJ3V0ZjgnLCBzdGRpbzogJ3BpcGUnIH1cbiAgKTtcbiAgLy8gRmFpbCBjbG9zZWQ6IHRyZWF0aW5nIGEgZ2l0IGZhaWx1cmUgYXMgXCJubyBmbm94IGNvbmZpZ3NcIiB3b3VsZCBza2lwIHN5bmNocm9uaXphdGlvbiBhbmQgbGV0XG4gIC8vIHNldHVwU2VjcmV0cyB1cGxvYWQgYSBrZXkgdGhhdCB3YXMgbmV2ZXIgdmVyaWZpZWQgYWdhaW5zdCB0aGUgcmVwb3NpdG9yeSdzIGNpcGhlcnRleHRzLlxuICBpZiAocHJvYy5zdGF0dXMgIT09IDApIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYGdpdCBscy1maWxlcyBmYWlsZWQgaW4gJHtyb290RGlyUGF0aH06ICR7KHByb2Muc3RkZXJyIHx8IHByb2MuZXJyb3I/Lm1lc3NhZ2UgfHwgJycpLnRyaW0oKX1gKTtcbiAgfVxuICByZXR1cm4gcHJvYy5zdGRvdXRcbiAgICAuc3BsaXQoJ1xcMCcpXG4gICAgLmZpbHRlcigobGluZSkgPT4gL15cXC4/Zm5veChcXC4uKyk/XFwudG9tbCQvdS50ZXN0KHBhdGguYmFzZW5hbWUobGluZSkpICYmICFpc1Rlc3RGaXh0dXJlRm5veFBhdGgobGluZSkpXG4gICAgLm1hcCgobGluZSkgPT4gcGF0aC5yZXNvbHZlKHJvb3REaXJQYXRoLCBsaW5lKSk7XG59XG5cbmZ1bmN0aW9uIGxpc3RGbm94TGlrZUZpbGVOYW1lcyhkaXJQYXRoOiBzdHJpbmcpOiBzdHJpbmdbXSB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIGZzXG4gICAgICAucmVhZGRpclN5bmMoZGlyUGF0aClcbiAgICAgIC5maWx0ZXIoKG5hbWUpID0+IC9eXFwuP2Zub3goXFwuLispP1xcLnRvbWwkL3UudGVzdChuYW1lKSlcbiAgICAgIC50b1NvcnRlZCgpO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGlmICgoZXJyb3IgYXMgeyBjb2RlPzogc3RyaW5nIH0gfCB1bmRlZmluZWQpPy5jb2RlID09PSAnRU5PRU5UJykgcmV0dXJuIFtdO1xuICAgIC8vIEZhaWwgY2xvc2VkOiBmbm94IGNhbiBzdGlsbCBsb2FkIGEgY29uZmlnIGZyb20gYSBkaXJlY3RvcnkgdGhpcyBwcm9jZXNzIGNhbm5vdCBlbnVtZXJhdGVcbiAgICAvLyAoZS5nLiBleGVjdXRlLW9ubHkgcGVybWlzc2lvbiksIHNvIGFuIGVudW1lcmF0aW9uIGZhaWx1cmUgbXVzdCBub3QgcmVhZCBhcyBcIm5vIGNvbmZpZ3NcIi5cbiAgICB0aHJvdyBuZXcgRXJyb3IoYENhbm5vdCBpbnNwZWN0ICR7ZGlyUGF0aH0gZm9yIGZub3ggY29uZmlnczogJHtlcnJvcn1gKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBsaXN0QW5jZXN0b3JEaXJQYXRocyhkaXJQYXRoOiBzdHJpbmcsIHJvb3REaXJQYXRoOiBzdHJpbmcpOiBzdHJpbmdbXSB7XG4gIGNvbnN0IGRpclBhdGhzID0gW2RpclBhdGhdO1xuICB3aGlsZSAoZGlyUGF0aHMuYXQoLTEpICE9PSByb290RGlyUGF0aCkge1xuICAgIGNvbnN0IHBhcmVudCA9IHBhdGguZGlybmFtZShkaXJQYXRocy5hdCgtMSkgPz8gJycpO1xuICAgIGlmIChwYXJlbnQgPT09IGRpclBhdGhzLmF0KC0xKSkgYnJlYWs7XG4gICAgZGlyUGF0aHMucHVzaChwYXJlbnQpO1xuICB9XG4gIHJldHVybiBkaXJQYXRocztcbn1cbiIsImltcG9ydCBtZXJnZSBmcm9tICdkZWVwbWVyZ2UnO1xuXG5leHBvcnQgZnVuY3Rpb24gb3ZlcndyaXRlTWVyZ2U8VD4oZGVzdGluYXRpb25BcnJheTogVFtdLCBzb3VyY2VBcnJheTogVFtdKTogVFtdIHtcbiAgcmV0dXJuIHNvdXJjZUFycmF5O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY29tYmluZU1lcmdlKHRhcmdldDogdW5rbm93bltdLCBzb3VyY2U6IHVua25vd25bXSwgb3B0aW9uczogbWVyZ2UuQXJyYXlNZXJnZU9wdGlvbnMpOiB1bmtub3duW10ge1xuICBjb25zdCBkZXN0aW5hdGlvbiA9IFsuLi50YXJnZXRdO1xuXG4gIGZvciAoY29uc3QgW2luZGV4LCBpdGVtXSBvZiBzb3VyY2UuZW50cmllcygpKSB7XG4gICAgaWYgKGRlc3RpbmF0aW9uW2luZGV4XSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBkZXN0aW5hdGlvbltpbmRleF0gPSBjbG9uZVVubGVzc090aGVyd2lzZVNwZWNpZmllZChpdGVtLCBvcHRpb25zKTtcbiAgICB9IGVsc2UgaWYgKGlzTWVyZ2VhYmxlT2JqZWN0KHRhcmdldFtpbmRleF0sIG9wdGlvbnMpICYmIGlzTWVyZ2VhYmxlT2JqZWN0KGl0ZW0sIG9wdGlvbnMpKSB7XG4gICAgICBkZXN0aW5hdGlvbltpbmRleF0gPSBtZXJnZSh0YXJnZXRbaW5kZXhdLCBpdGVtLCBvcHRpb25zKTtcbiAgICB9IGVsc2UgaWYgKCF0YXJnZXQuaW5jbHVkZXMoaXRlbSkpIHtcbiAgICAgIGRlc3RpbmF0aW9uLnB1c2goaXRlbSk7XG4gICAgfVxuICB9XG4gIHJldHVybiBkZXN0aW5hdGlvbjtcbn1cblxuZnVuY3Rpb24gY2xvbmVVbmxlc3NPdGhlcndpc2VTcGVjaWZpZWQodmFsdWU6IHVua25vd24sIG9wdGlvbnM6IG1lcmdlLkFycmF5TWVyZ2VPcHRpb25zKTogdW5rbm93biB7XG4gIHJldHVybiBpc01lcmdlYWJsZU9iamVjdCh2YWx1ZSwgb3B0aW9ucykgPyBvcHRpb25zLmNsb25lVW5sZXNzT3RoZXJ3aXNlU3BlY2lmaWVkKHZhbHVlLCBvcHRpb25zKSA6IHZhbHVlO1xufVxuXG5mdW5jdGlvbiBpc01lcmdlYWJsZU9iamVjdCh2YWx1ZTogdW5rbm93biwgb3B0aW9uczogbWVyZ2UuQXJyYXlNZXJnZU9wdGlvbnMpOiB2YWx1ZSBpcyBvYmplY3Qge1xuICByZXR1cm4gISF2YWx1ZSAmJiB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnICYmIG9wdGlvbnMuaXNNZXJnZWFibGVPYmplY3QodmFsdWUpO1xufVxuIiwiZXhwb3J0IGZ1bmN0aW9uIG1vdmVUb0JvdHRvbTxUT2JqIGV4dGVuZHMgUmVjb3JkPFRLZXksIHVua25vd24+LCBUS2V5IGV4dGVuZHMgc3RyaW5nIHwgbnVtYmVyIHwgc3ltYm9sPihcbiAgb2JqOiBUT2JqLFxuICBrZXk6IFRLZXlcbik6IFRPYmoge1xuICBjb25zdCB2YWx1ZSA9IG9ialtrZXldO1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWR5bmFtaWMtZGVsZXRlXG4gIGRlbGV0ZSBvYmpba2V5XTtcbiAgKG9iaiBhcyBSZWNvcmQ8VEtleSwgdW5rbm93bj4pW2tleV0gPSB2YWx1ZTtcbiAgcmV0dXJuIG9iajtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHNvcnRLZXlzPFQgZXh0ZW5kcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj4ob2JqOiBUKTogVCB7XG4gIGNvbnN0IGtleUFuZFZhbHVlcyA9IE9iamVjdC5lbnRyaWVzKG9iaikudG9Tb3J0ZWQoKFtrZXkxXSwgW2tleTJdKSA9PiBrZXkxLmxvY2FsZUNvbXBhcmUoa2V5MikpO1xuICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBrZXlBbmRWYWx1ZXMpIHtcbiAgICAvLyBwYWNrYWdlLmpzb24tc3R5bGUga2V5cyBhcmUgbm9uLWFycmF5LWluZGV4IGtleXMsIHNvIEpTT04uc3RyaW5naWZ5IHByZXNlcnZlcyB0aGlzIGluc2VydGlvbiBvcmRlci5cbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWR5bmFtaWMtZGVsZXRlXG4gICAgZGVsZXRlIG9ialtrZXldO1xuICAgIChvYmogYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pW2tleV0gPSB2YWx1ZTtcblxuICAgIGlmICh2YWx1ZSAmJiB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnICYmICFBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgICAgc29ydEtleXModmFsdWUgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pO1xuICAgIH1cbiAgfVxuICByZXR1cm4gb2JqO1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHtcbiAgZ2V0TWVhbmluZ2Z1bERlY2xhcmVkV29ya3NwYWNlUGF0dGVybnMsXG4gIGdldFNlZWRlZEJhc2VsaW5lR2xvYixcbiAgaGFzSW1wbGljaXRXb3Jrc3BhY2VCYXNlbGluZSxcbiAgaXNJblJlcG9zaXRvcnlXb3Jrc3BhY2VQYXR0ZXJuLFxuICBub3JtYWxpemVXb3Jrc3BhY2VQYXR0ZXJuQm9keSxcbiAgcmVzb2x2ZVdvcmtzcGFjZVBhY2thZ2VKc29uUGF0aHMsXG59IGZyb20gJ0B3aWxsYm9vc3Rlci9zaGFyZWQtbGliLW5vZGUvc3JjJztcbmltcG9ydCBmZyBmcm9tICdmYXN0LWdsb2InO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlSnNvbiB9IGZyb20gJ3R5cGUtZmVzdCc7XG5cbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuXG4vLyBUaGUgQnVuLWV4YWN0IHJlc29sdXRpb24gcHJpbWl0aXZlcyBsaXZlIGluIEB3aWxsYm9vc3Rlci9zaGFyZWQtbGliLW5vZGUgKHNyYy9idW5Xb3Jrc3BhY2VzLnRzKVxuLy8gc28gd2IncyByZWxlYXNlIGNvZGUgc2hhcmVzIHRoZW07IHJlLWV4cG9ydCB0aGUgb25lcyB3YmZ5IG1vZHVsZXMgYW5kIHRlc3RzIGNvbnN1bWUuXG5leHBvcnQge1xuICBnZXREZWNsYXJlZFdvcmtzcGFjZVBhdHRlcm5zLFxuICBnZXRNZWFuaW5nZnVsRGVjbGFyZWRXb3Jrc3BhY2VQYXR0ZXJucyxcbiAgaGFzSW1wbGljaXRXb3Jrc3BhY2VCYXNlbGluZSxcbn0gZnJvbSAnQHdpbGxib29zdGVyL3NoYXJlZC1saWItbm9kZS9zcmMnO1xuXG4vKiogVGhlIHN1YnNldCBvZiBQYWNrYWdlQ29uZmlnIHRoYXQgd29ya3NwYWNlIGRpc2NvdmVyeSBuZWVkcywgc28gaXQgY2FuIHJ1biBiZWZvcmUgY29uZmlncyBleGlzdC4gKi9cbmV4cG9ydCB0eXBlIFdvcmtzcGFjZVJvb3RMaWtlID0gUGljazxQYWNrYWdlQ29uZmlnLCAnZGlyUGF0aCcgfCAnZG9lc0NvbnRhaW5TdWJQYWNrYWdlSnNvbnMnIHwgJ3BhY2thZ2VKc29uJz47XG5cbi8qKlxuICogRXZlcnkgZGVjbGFyZWQgd29ya3NwYWNlIGRpcmVjdG9yeSAoYWJzb2x1dGUsIGRlZHVwbGljYXRlZCkgb2YgdGhlIG1vbm9yZXBvIHJvb3QsIGNvdmVyaW5nXG4gKiBub24tcGFja2FnZXMvKiBsYXlvdXRzIHN1Y2ggYXMgYXBwcy8qLiBVbmNhY2hlZCBiZWNhdXNlIGluZGV4LnRzIGNhbGxzIGl0IGJlZm9yZSB3YmZ5IG11dGF0ZXNcbiAqIHRoZSByb290IHBhY2thZ2UuanNvbiAoZ2V0V29ya3NwYWNlUGFja2FnZURpcnMgY2FjaGVzIHRoZSBwb3N0LW11dGF0aW9uIHN0YXRlKS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFdvcmtzcGFjZVN1YkRpclBhdGhzKHJvb3RMaWtlOiBXb3Jrc3BhY2VSb290TGlrZSk6IHN0cmluZ1tdIHtcbiAgcmV0dXJuIFtcbiAgICAuLi5uZXcgU2V0KFxuICAgICAgZ2V0V29ya3NwYWNlUGFja2FnZUpzb25QYXRocyhyb290TGlrZSkubWFwKChwYWNrYWdlSnNvblBhdGgpID0+XG4gICAgICAgIHBhdGgucmVzb2x2ZShyb290TGlrZS5kaXJQYXRoLCBwYXRoLnBvc2l4LmRpcm5hbWUocGFja2FnZUpzb25QYXRoKSlcbiAgICAgIClcbiAgICApLFxuICBdLnRvU29ydGVkKCk7XG59XG5cbi8qKlxuICogRXZlcnkgd29ya3NwYWNlIHBhY2thZ2UuanNvbiBwYXRoIChyZWxhdGl2ZSB0byB0aGUgbW9ub3JlcG8gcm9vdCwgc29ydGVkKSwgaW5jbHVkaW5nIG1hbmlmZXN0c1xuICogd2l0aG91dCBhIGBuYW1lYCBmaWVsZCDigJQgd2JmeSBuYW1lcyB0aG9zZSBsYXRlciwgc28gZGVwZW5kZW5jeSBzY2FucyBtdXN0IG5vdCBza2lwIHRoZW0uXG4gKiBSZXNvbHV0aW9uIG1pbWljcyBCdW4ncyBzZXF1ZW50aWFsIHBhdHRlcm4gZXZhbHVhdGlvbjsgc2VlIHJlc29sdmVXb3Jrc3BhY2VQYWNrYWdlSnNvblBhdGhzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0V29ya3NwYWNlUGFja2FnZUpzb25QYXRocyhyb290Q29uZmlnOiBXb3Jrc3BhY2VSb290TGlrZSk6IHN0cmluZ1tdIHtcbiAgcmV0dXJuIHJlc29sdmVXb3Jrc3BhY2VQYWNrYWdlSnNvblBhdGhzKGdldFNhbml0aXplZFdvcmtzcGFjZVBhdHRlcm5zKHJvb3RDb25maWcpLCByb290Q29uZmlnLmRpclBhdGgpO1xufVxuXG5pbnRlcmZhY2UgV29ya3NwYWNlRGlyUGF0dGVybnMge1xuICAvKiogRGlyZWN0b3J5IHN1YnRyZWVzIChvciBwYWNrYWdlLW93bmVkIHN1YnBhdGhzKSBtYXRjaGVkIGJ5IGVmZmVjdGl2ZSBuZWdhdGlvbnMsIGZvciB0c2NvbmZpZyBgZXhjbHVkZWAgZW50cmllcy4gKi9cbiAgZXhjbHVkZXM6IHN0cmluZ1tdO1xuICAvKiogUG9zaXRpdmUgZGlyZWN0b3J5IHBhdHRlcm5zIChvciBjb25jcmV0ZSBkaXJlY3RvcmllcyBmb3IgQnVuLW9ubHkgZ2xvYiBzeW50YXgpLiAqL1xuICBpbmNsdWRlczogc3RyaW5nW107XG59XG5cbi8qKlxuICogU29ydGVkIHdvcmtzcGFjZSBkaXJlY3RvcnkgcGF0dGVybnMgKHBvc2l4LCByZWxhdGl2ZSB0byB0aGUgbW9ub3JlcG8gcm9vdCkgZm9yIGdlbmVyYXRvcnMgdGhhdFxuICogbmVlZCBwYXR0ZXJuLXNoYXBlZCBnbG9icyBjb3ZlcmluZyBldmVyeSB3b3Jrc3BhY2UgbGF5b3V0IOKAlCBlLmcuIHRoZSByb290IHRzY29uZmlnJ3MgYGFwcHMvKmBcbiAqIGluY2x1ZGUgZW50cmllcyDigJQgaW5zdGVhZCBvZiBjb25jcmV0ZSBkaXJlY3Rvcmllcywgd2hpY2ggd291bGQgY2h1cm4gZ2VuZXJhdGVkIGZpbGVzIHdoZW5ldmVyIGFcbiAqIHdvcmtzcGFjZSBwYWNrYWdlIGlzIGFkZGVkIG9yIHJlbW92ZWQuIEV2ZXJ5IHJldHVybmVkIHBhdHRlcm4gaXMgdmFsaWQgdHNjb25maWcgZ2xvYiBzeW50YXguXG4gKiBBIHBhdHRlcm4gY2FuIG1hdGNoIGEgc2libGluZyBkaXJlY3Rvcnkgd2l0aG91dCBhIHBhY2thZ2UuanNvbiAobm90IGEgd29ya3NwYWNlIHRvIEJ1bik7IHRoYXRcbiAqIGlzIGRlbGliZXJhdGUsIG1pcnJvcmluZyB0aGUgbG9uZy1zdGFuZGluZyBgcGFja2FnZXMvKmAgZW50cmllcycgYmVoYXZpb3IgaW4gZmF2b3Igb2Ygc3RhYmxlXG4gKiBnZW5lcmF0ZWQgb3V0cHV0LiBOZWdhdGlvbnMgZm9sbG93IEJ1bidzIHNlcXVlbnRpYWwgc2VtYW50aWNzIChzZWVcbiAqIHJlc29sdmVXb3Jrc3BhY2VQYWNrYWdlSnNvblBhdGhzKTogYSBuZWdhdGlvbiBzdGF5cyBwYXR0ZXJuLXNoYXBlZCB3aGlsZSBpdCBleGNsdWRlcyBleGFjdGx5XG4gKiB3aGF0IGl0IG1hdGNoZXMsIGJ1dCBpcyBjb25jcmV0aXplZCBwZXIgbWF0Y2hlZCBkaXJlY3Rvcnkgd2hlbiBhIG1hdGNoZWQgZGlyZWN0b3J5IGVuZHMgdXAgYVxuICogd29ya3NwYWNlIGFueXdheSAocmUtaW5jbHVkZWQgYnkgYSBsYXRlciBwb3NpdGl2ZSwgYSBwaW5uZWQgY29uY3JldGUgcG9zaXRpdmUsIG9yIGEgc2VlZGVkXG4gKiBiYXNlbGluZTsgIzEwMDUpIG9yIGlzIGFuIGFuY2VzdG9yIG9mIGEgd29ya3NwYWNlIGRpcmVjdG9yeSwgd2hlcmUgQnVuIGV4Y2x1ZGVzIG9ubHkgdGhlXG4gKiBwYWNrYWdlIEFUIHRoYXQgZGlyZWN0b3J5LCBzbyBvbmx5IGl0cyBwYWNrYWdlLW93bmVkIHN1YnBhdGhzIGFyZSBleGNsdWRlZCAoIzEwMDQpLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0V29ya3NwYWNlRGlyUGF0dGVybnMocm9vdExpa2U6IFdvcmtzcGFjZVJvb3RMaWtlKTogV29ya3NwYWNlRGlyUGF0dGVybnMge1xuICAvLyBVbmxpa2UgZGlzY292ZXJ5LCBnZW5lcmF0ZWQgb3V0cHV0IG11c3Qgbm90IGNvbnRhaW4gYSBuZXZlci1tYXRjaGluZyBgcGFja2FnZXMvKmAgZmFsbGJhY2s6XG4gIC8vIGFuIGFwcHMvKi1vbmx5IG1vbm9yZXBvIHdvdWxkIGdldCBkZWFkIGdsb2JzIGNvbW1pdHRlZCBpbnRvIGl0cyByb290IHRzY29uZmlnLiBNaXJyb3JcbiAgLy8gYXBwbHlQYWNrYWdlSnNvbkNvbnZlbnRpb25zLCB3aGljaCBmb3JjZXMgYHBhY2thZ2VzLypgIG9ubHkgd2hlbiBhIG1hbmlmZXN0IGFjdHVhbGx5IG1hdGNoZXMuXG4gIGNvbnN0IGhhc1BhY2thZ2VzTGF5b3V0ID1cbiAgICByb290TGlrZS5kb2VzQ29udGFpblN1YlBhY2thZ2VKc29ucyAmJlxuICAgIC8vIE1pcnJvciBhcHBseVBhY2thZ2VKc29uQ29udmVudGlvbnMnIGJhc2VsaW5lIGdhdGUgdG9vOiB3aXRoIGFuIGltcGxpY2l0IGJhc2VsaW5lIHNlZWRlZCxcbiAgICAvLyBgcGFja2FnZXMvKmAgZW50cmllcyB3b3VsZCBiZSBkZWFkIGdsb2JzIHN1YnN1bWVkIGJ5IHRoZSBiYXNlbGluZS1kZXJpdmVkIG9uZXMuXG4gICAgIWhhc0ltcGxpY2l0V29ya3NwYWNlQmFzZWxpbmUocm9vdExpa2UucGFja2FnZUpzb24/LndvcmtzcGFjZXMpICYmXG4gICAgZmcuZ2xvYlN5bmMoJ3BhY2thZ2VzLyovcGFja2FnZS5qc29uJywge1xuICAgICAgY3dkOiByb290TGlrZS5kaXJQYXRoLFxuICAgICAgZm9sbG93U3ltYm9saWNMaW5rczogZmFsc2UsXG4gICAgICBpZ25vcmU6IFsnKiovbm9kZV9tb2R1bGVzLyoqJ10sXG4gICAgfSkubGVuZ3RoID4gMDtcbiAgY29uc3Qgd29ya3NwYWNlUGF0dGVybnMgPSBnZXRTYW5pdGl6ZWRXb3Jrc3BhY2VQYXR0ZXJucyh7XG4gICAgLi4ucm9vdExpa2UsXG4gICAgZG9lc0NvbnRhaW5TdWJQYWNrYWdlSnNvbnM6IGhhc1BhY2thZ2VzTGF5b3V0LFxuICB9KTtcbiAgY29uc3Qgd29ya3NwYWNlRGlyUGF0aHMgPSBuZXcgU2V0KFxuICAgIHJlc29sdmVXb3Jrc3BhY2VQYWNrYWdlSnNvblBhdGhzKHdvcmtzcGFjZVBhdHRlcm5zLCByb290TGlrZS5kaXJQYXRoKS5tYXAoKHBhY2thZ2VKc29uUGF0aCkgPT5cbiAgICAgIHBhdGgucG9zaXguZGlybmFtZShwYWNrYWdlSnNvblBhdGgpXG4gICAgKVxuICApO1xuICBjb25zdCBpbmNsdWRlcyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICBjb25zdCBuZWdhdGlvbkJvZGllczogc3RyaW5nW10gPSBbXTtcbiAgZm9yIChjb25zdCB3b3Jrc3BhY2VQYXR0ZXJuIG9mIHdvcmtzcGFjZVBhdHRlcm5zKSB7XG4gICAgY29uc3QgaXNOZWdhdGl2ZSA9IHdvcmtzcGFjZVBhdHRlcm4uc3RhcnRzV2l0aCgnIScpO1xuICAgIGNvbnN0IHBhdHRlcm5Cb2R5ID0gbm9ybWFsaXplV29ya3NwYWNlUGF0dGVybkJvZHkoaXNOZWdhdGl2ZSA/IHdvcmtzcGFjZVBhdHRlcm4uc2xpY2UoMSkgOiB3b3Jrc3BhY2VQYXR0ZXJuKTtcbiAgICBpZiAoaXNOZWdhdGl2ZSkge1xuICAgICAgLy8gQSBzZWVkaW5nIG5lZ2F0aW9uIG1ha2VzIEJ1biBsaW5rIGJhc2VsaW5lLW1hdGNoZWQgZGlyZWN0b3JpZXMsIHNvIHRoZSBiYXNlbGluZSBtdXN0XG4gICAgICAvLyBlbnRlciB0aGUgZ2VuZXJhdGVkIGluY2x1ZGUgcGF0dGVybnMgZXZlbiB3aGVuIGV2ZXJ5IGRlY2xhcmVkIHBhdHRlcm4gaXMgYSBuZWdhdGlvbi5cbiAgICAgIGNvbnN0IGJhc2VsaW5lR2xvYiA9IGdldFNlZWRlZEJhc2VsaW5lR2xvYihwYXR0ZXJuQm9keSk7XG4gICAgICBpZiAoYmFzZWxpbmVHbG9iICE9PSB1bmRlZmluZWQpIGluY2x1ZGVzLmFkZChiYXNlbGluZUdsb2IpO1xuICAgICAgbmVnYXRpb25Cb2RpZXMucHVzaChwYXR0ZXJuQm9keSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGZvciAoY29uc3QgZGlyUGF0dGVybiBvZiB0b1RzY29uZmlnQ29tcGF0aWJsZURpclBhdHRlcm5zKHBhdHRlcm5Cb2R5LCByb290TGlrZS5kaXJQYXRoKSkge1xuICAgICAgICBpbmNsdWRlcy5hZGQoZGlyUGF0dGVybik7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIGNvbnN0IGV4Y2x1ZGVzID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gIGZvciAoY29uc3QgbmVnYXRpb25Cb2R5IG9mIG5lZ2F0aW9uQm9kaWVzKSB7XG4gICAgZm9yIChjb25zdCBleGNsdWRlRW50cnkgb2YgdG9FeGNsdWRlRW50cmllcyhuZWdhdGlvbkJvZHksIHdvcmtzcGFjZURpclBhdGhzLCByb290TGlrZS5kaXJQYXRoKSkge1xuICAgICAgZXhjbHVkZXMuYWRkKGV4Y2x1ZGVFbnRyeSk7XG4gICAgfVxuICB9XG4gIHJldHVybiB7IGV4Y2x1ZGVzOiBbLi4uZXhjbHVkZXNdLnRvU29ydGVkKCksIGluY2x1ZGVzOiBbLi4uaW5jbHVkZXNdLnRvU29ydGVkKCkgfTtcbn1cblxuLyoqXG4gKiB0c2NvbmZpZyBleGNsdWRlIGVudHJpZXMgZm9yIG9uZSBuZWdhdGlvbi4gUGF0dGVybi1zaGFwZWQgd2hlbiB0aGUgbmVnYXRpb24gZXhjbHVkZXMgZXhhY3RseVxuICogd2hhdCBpdCBtYXRjaGVzIChzdGFibGUgb3V0cHV0KTsgcGVyLWRpcmVjdG9yeSBvdGhlcndpc2U6IGEgZGlyZWN0b3J5IHRoYXQgaXMgYSB3b3Jrc3BhY2VcbiAqIGRlc3BpdGUgdGhlIG5lZ2F0aW9uIGlzIG5vdCBleGNsdWRlZCBhdCBhbGwsIGFuZCBuZWl0aGVyIGlzIGEgUExBSU4gKHBhY2thZ2UuanNvbi1sZXNzKVxuICogZGVzY2VuZGFudCBvZiBhIHdvcmtzcGFjZSBkaXJlY3Rvcnkg4oCUIG5lZ2F0aW5nIGEgbm9uLXBhY2thZ2UgZGlyZWN0b3J5IGlzIGEgbm8tb3AgZm9yIEJ1bixcbiAqIGFuZCB0aGUgZW5jbG9zaW5nIHdvcmtzcGFjZSBzdGF5cyBhY3RpdmUgKGUuZy4gYFsnYXBwcy8qKicsICchYXBwcy8qKicsICdhcHBzL3dlYiddYFxuICogcmUtaW5jbHVkZXMgYXBwcy93ZWIsIHdob3NlIHNyYyBtdXN0IGtlZXAgdHlwZS1jaGVja2luZzsgYSB0c2NvbmZpZyBleGNsdWRlIHdvdWxkIG92ZXJyaWRlXG4gKiB0aGUgaW5jbHVkZSkuIEEgZGVzY2VuZGFudCB3aXRoIGl0cyBvd24gbWFuaWZlc3QgdGhhdCB0aGUgbmVnYXRpb24ga2VlcHMgb3V0IG9mIHRoZSB3b3Jrc3BhY2VcbiAqIHNldCBpcyBhbiBleGNsdWRlZCBuZXN0ZWQgcGFja2FnZSBhbmQgc3RheXMgZXhjbHVkZWQuIEEgZGlyZWN0b3J5IHRoYXQgaXMgYW5cbiAqIGFuY2VzdG9yIG9mIGEgd29ya3NwYWNlIGRpcmVjdG9yeSBnZXRzIG9ubHkgaXRzIHBhY2thZ2Utb3duZWQgc3VicGF0aHMgZXhjbHVkZWQsIGJlY2F1c2UgQnVuXG4gKiBleGNsdWRlcyBvbmx5IHRoZSBwYWNrYWdlIEFUIHRoYXQgZGlyZWN0b3J5IHdoaWxlIGtlZXBpbmcgZGVzY2VuZGFudCB3b3Jrc3BhY2VzICgjMTAwNCkuXG4gKi9cbmZ1bmN0aW9uIHRvRXhjbHVkZUVudHJpZXMobmVnYXRpb25Cb2R5OiBzdHJpbmcsIHdvcmtzcGFjZURpclBhdGhzOiBTZXQ8c3RyaW5nPiwgcm9vdERpclBhdGg6IHN0cmluZyk6IHN0cmluZ1tdIHtcbiAgY29uc3QgaXNXb3Jrc3BhY2VBbmNlc3RvciA9IChkaXJQYXRoOiBzdHJpbmcpOiBib29sZWFuID0+XG4gICAgWy4uLndvcmtzcGFjZURpclBhdGhzXS5zb21lKCh3b3Jrc3BhY2VEaXJQYXRoKSA9PiB3b3Jrc3BhY2VEaXJQYXRoLnN0YXJ0c1dpdGgoYCR7ZGlyUGF0aH0vYCkpO1xuICAvLyBPbmx5IFBMQUlOIGRpcmVjdG9yaWVzIChubyBwYWNrYWdlLmpzb24gb2YgdGhlaXIgb3duKSBhcmUgcHJvdGVjdGVkIGJ5IHRoZSBlbmNsb3NpbmdcbiAgLy8gd29ya3NwYWNlOiBhIG1hdGNoZWQgZGlyZWN0b3J5IHRoYXQgY2FycmllcyBpdHMgb3duIG1hbmlmZXN0IHlldCBpcyBhYnNlbnQgZnJvbSB0aGUgZmluYWxcbiAgLy8gd29ya3NwYWNlIHNldCBpcyBhbiBleGNsdWRlZCBuZXN0ZWQgcGFja2FnZSwgYW5kIGl0cyBleGNsdXNpb24gbXVzdCBzdXJ2aXZlLlxuICBjb25zdCBpc1Byb3RlY3RlZFdvcmtzcGFjZURlc2NlbmRhbnQgPSAoZGlyUGF0aDogc3RyaW5nKTogYm9vbGVhbiA9PlxuICAgIFsuLi53b3Jrc3BhY2VEaXJQYXRoc10uc29tZSgod29ya3NwYWNlRGlyUGF0aCkgPT4gZGlyUGF0aC5zdGFydHNXaXRoKGAke3dvcmtzcGFjZURpclBhdGh9L2ApKSAmJlxuICAgICFmcy5leGlzdHNTeW5jKHBhdGguam9pbihyb290RGlyUGF0aCwgZGlyUGF0aCwgJ3BhY2thZ2UuanNvbicpKTtcbiAgY29uc3QgbWF0Y2hlZERpclBhdGhzID0gZ2V0TWF0Y2hlZERpclBhdGhzKG5lZ2F0aW9uQm9keSwgcm9vdERpclBhdGgpO1xuICBpZiAoXG4gICAgIW1hdGNoZWREaXJQYXRocy5zb21lKFxuICAgICAgKGRpclBhdGgpID0+XG4gICAgICAgIHdvcmtzcGFjZURpclBhdGhzLmhhcyhkaXJQYXRoKSB8fCBpc1dvcmtzcGFjZUFuY2VzdG9yKGRpclBhdGgpIHx8IGlzUHJvdGVjdGVkV29ya3NwYWNlRGVzY2VuZGFudChkaXJQYXRoKVxuICAgIClcbiAgKSB7XG4gICAgcmV0dXJuIHRvVHNjb25maWdDb21wYXRpYmxlRGlyUGF0dGVybnMobmVnYXRpb25Cb2R5LCByb290RGlyUGF0aCk7XG4gIH1cbiAgcmV0dXJuIG1hdGNoZWREaXJQYXRocy5mbGF0TWFwKChkaXJQYXRoKSA9PiB7XG4gICAgLy8gVGhlIGRlc2NlbmRhbnQgY2hlY2sgcHJlY2VkZXMgdGhlIGFuY2VzdG9yIG9uZTogYSBkaXJlY3RvcnkgaW5zaWRlIG9uZSB3b3Jrc3BhY2UgYnV0IGFib3ZlXG4gICAgLy8gYSBuZXN0ZWQgb25lIChlLmcuIGFwcHMvd2ViL3BsdWdpbnMgYmV0d2VlbiB3b3Jrc3BhY2VzIGFwcHMvd2ViIGFuZCBhcHBzL3dlYi9wbHVnaW5zL3gpXG4gICAgLy8gc3RpbGwgYmVsb25ncyB0byB0aGUgZW5jbG9zaW5nIGFjdGl2ZSB3b3Jrc3BhY2UsIHNvIG5vdGhpbmcgb2YgaXQgbWF5IGJlIGV4Y2x1ZGVkLlxuICAgIGlmICh3b3Jrc3BhY2VEaXJQYXRocy5oYXMoZGlyUGF0aCkgfHwgaXNQcm90ZWN0ZWRXb3Jrc3BhY2VEZXNjZW5kYW50KGRpclBhdGgpKSByZXR1cm4gW107XG4gICAgaWYgKGlzV29ya3NwYWNlQW5jZXN0b3IoZGlyUGF0aCkpIHtcbiAgICAgIHJldHVybiBbYCR7ZGlyUGF0aH0vKi5jb25maWcudHNgLCBgJHtkaXJQYXRofS9zY3JpcHRzYCwgYCR7ZGlyUGF0aH0vc3JjYCwgYCR7ZGlyUGF0aH0vdGVzdGBdO1xuICAgIH1cbiAgICByZXR1cm4gW2RpclBhdGhdO1xuICB9KTtcbn1cblxuLyoqXG4gKiBEaXJlY3RvcmllcyBhIG5lZ2F0aW9uIG1hdGNoZXMuIFRoZSBtYW5pZmVzdC1iYXNlZCBnbG9iIGNvbXBsZW1lbnRzIG9ubHlEaXJlY3RvcmllcyBiZWNhdXNlXG4gKiBmYXN0LWdsb2IncyBgZGlyLyoqYCBkb2VzIG5vdCByZXR1cm4gYGRpcmAgaXRzZWxmIGFzIGEgZGlyZWN0b3J5LCB3aGlsZSBib3RoIEJ1biBhbmQgdGhlXG4gKiBtYW5pZmVzdCBnbG9iIHRyZWF0IGAqKmAgYXMgemVybyBvciBtb3JlIHNlZ21lbnRzIChgYXBwcy8qKmAgY292ZXJzIHRoZSBwYWNrYWdlIGF0IGFwcHMpLlxuICovXG5mdW5jdGlvbiBnZXRNYXRjaGVkRGlyUGF0aHMobmVnYXRpb25Cb2R5OiBzdHJpbmcsIHJvb3REaXJQYXRoOiBzdHJpbmcpOiBzdHJpbmdbXSB7XG4gIGNvbnN0IGdsb2JPcHRpb25zID0geyBjd2Q6IHJvb3REaXJQYXRoLCBmb2xsb3dTeW1ib2xpY0xpbmtzOiBmYWxzZSwgaWdub3JlOiBbJyoqL25vZGVfbW9kdWxlcy8qKiddIH07XG4gIHJldHVybiBbXG4gICAgLi4ubmV3IFNldChbXG4gICAgICAuLi5mZy5nbG9iU3luYyhuZWdhdGlvbkJvZHksIHsgLi4uZ2xvYk9wdGlvbnMsIG9ubHlEaXJlY3RvcmllczogdHJ1ZSB9KSxcbiAgICAgIC4uLmZnXG4gICAgICAgIC5nbG9iU3luYyhwYXRoLnBvc2l4LmpvaW4obmVnYXRpb25Cb2R5LCAncGFja2FnZS5qc29uJyksIGdsb2JPcHRpb25zKVxuICAgICAgICAubWFwKChwYWNrYWdlSnNvblBhdGgpID0+IHBhdGgucG9zaXguZGlybmFtZShwYWNrYWdlSnNvblBhdGgpKVxuICAgICAgICAvLyBBIHplcm8tc2VnbWVudCBgKipgIG1hdGNoIHJlYWNoZXMgdGhlIHJvb3QgaXRzZWxmLCB3aGljaCBpcyBuZXZlciBhIHdvcmtzcGFjZS5cbiAgICAgICAgLmZpbHRlcigoZGlyUGF0aCkgPT4gZGlyUGF0aCAhPT0gJy4nKSxcbiAgICBdKSxcbiAgXS50b1NvcnRlZCgpO1xufVxuXG4vKipcbiAqIHRzY29uZmlnIGluY2x1ZGUvZXhjbHVkZSBzdXBwb3J0IG9ubHkgdGhlIGAqYCwgYD9gLCBhbmQgYCoqYCB3aWxkY2FyZHMsIHdoaWxlIEJ1biB3b3Jrc3BhY2VzXG4gKiBhY2NlcHQgZnVsbCBnbG9iIHN5bnRheCAoYnJhY2UgZXhwYW5zaW9uLCBjaGFyYWN0ZXIgY2xhc3Nlcywg4oCmKSwgc28gZXhwYW5kIEJ1bi1vbmx5IHBhdHRlcm5zIHRvXG4gKiB0aGUgY29uY3JldGUgZGlyZWN0b3JpZXMgdGhleSBtYXRjaCB0byBrZWVwIHRoZSBnZW5lcmF0ZWQgZ2xvYnMgdmFsaWQgZm9yIFR5cGVTY3JpcHQuXG4gKi9cbmZ1bmN0aW9uIHRvVHNjb25maWdDb21wYXRpYmxlRGlyUGF0dGVybnMocGF0dGVybkJvZHk6IHN0cmluZywgcm9vdERpclBhdGg6IHN0cmluZyk6IHN0cmluZ1tdIHtcbiAgaWYgKCEvWygpW1xcXXt9XS91LnRlc3QocGF0dGVybkJvZHkpKSByZXR1cm4gW3BhdHRlcm5Cb2R5XTtcbiAgcmV0dXJuIGZnLmdsb2JTeW5jKHBhdHRlcm5Cb2R5LCB7XG4gICAgY3dkOiByb290RGlyUGF0aCxcbiAgICBmb2xsb3dTeW1ib2xpY0xpbmtzOiBmYWxzZSxcbiAgICBpZ25vcmU6IFsnKiovbm9kZV9tb2R1bGVzLyoqJ10sXG4gICAgb25seURpcmVjdG9yaWVzOiB0cnVlLFxuICB9KTtcbn1cblxuLyoqXG4gKiBEZWNsYXJlZCB3b3Jrc3BhY2UgcGF0dGVybnMgKG5lZ2F0aXZlIG9uZXMgaW5jbHVkZWQpIHRoYXQgc3RheSBpbnNpZGUgdGhlIHJlcG9zaXRvcnk6IGFic29sdXRlXG4gKiBvciBgLi5gLXRyYXZlcnNpbmcgcGF0dGVybnMgd291bGQgbWFrZSBjb25zdW1lcnMgc3VjaCBhcyByZW1vdmVOb2RlTW9kdWxlcyBvcGVyYXRlIG9uIGFub3RoZXJcbiAqIHJlcG9zaXRvcnkncyBmaWxlcy4gRGVjbGFyYXRpb24gb3JkZXIgYW5kIGR1cGxpY2F0ZXMgYXJlIHByZXNlcnZlZCDigJQgQnVuIGV2YWx1YXRlcyB0aGVcbiAqIHBhdHRlcm5zIHNlcXVlbnRpYWxseSwgc28gcG9zaXRpb24gbWF0dGVycy5cbiAqL1xuZnVuY3Rpb24gZ2V0U2FuaXRpemVkV29ya3NwYWNlUGF0dGVybnMocm9vdExpa2U6IFdvcmtzcGFjZVJvb3RMaWtlKTogc3RyaW5nW10ge1xuICBjb25zdCBkZWNsYXJlZFBhdHRlcm5zID0gZ2V0TWVhbmluZ2Z1bERlY2xhcmVkV29ya3NwYWNlUGF0dGVybnMocm9vdExpa2UucGFja2FnZUpzb24/LndvcmtzcGFjZXMpO1xuICAvLyBhcHBseVBhY2thZ2VKc29uQ29udmVudGlvbnMgZm9yY2VzIGBwYWNrYWdlcy8qYCBpbnRvIGEgbW9ub3JlcG8ncyB3b3Jrc3BhY2VzIHdoZW4gYVxuICAvLyBwYWNrYWdlcy8qL3BhY2thZ2UuanNvbiBhY3R1YWxseSBtYXRjaGVzLCBidXQgaXQgbWF5IG5vdCBoYXZlIHdyaXR0ZW4gdGhlIHJvb3QgcGFja2FnZS5qc29uXG4gIC8vIHlldCwgc28gbWlycm9yIHRoYXQgbm9ybWFsaXphdGlvbiBoZXJlIOKAlCBQUkVQRU5ERUQgbGlrZSB0aGVyZSwgYmVjYXVzZSBhIHBvc2l0aXZlIHBhdHRlcm5cbiAgLy8gcGxhY2VkIGFmdGVyIGEgdXNlciBuZWdhdGlvbiB3b3VsZCByZS1pbmNsdWRlIHRoZSBuZWdhdGVkIHBhY2thZ2VzIHVuZGVyIEJ1bidzIHNlcXVlbnRpYWxcbiAgLy8gZXZhbHVhdGlvbi4gRGlzY292ZXJ5IGNhbGxlcnMgcGFzcyB0aGUgZmFsbGJhY2sgdW5jb25kaXRpb25hbGx5IGZvciBtb25vcmVwb3Mg4oCUIGFcbiAgLy8gbmV2ZXItbWF0Y2hpbmcgcGF0dGVybiBjb250cmlidXRlcyBubyBwYXRocyB0aGVyZSDigJQgd2hpbGUgcGF0dGVybi1zaGFwZWQgY2FsbGVyc1xuICAvLyAoZ2V0V29ya3NwYWNlRGlyUGF0dGVybnMpIGdhdGUgaXQgb24gYW4gYWN0dWFsIG1hdGNoLlxuICBjb25zdCB3b3Jrc3BhY2VQYXR0ZXJucyA9XG4gICAgcm9vdExpa2UuZG9lc0NvbnRhaW5TdWJQYWNrYWdlSnNvbnMgJiYgIWhhc0RlY2xhcmVkUGFja2FnZXNTdGFyUGF0dGVybihyb290TGlrZS5wYWNrYWdlSnNvbj8ud29ya3NwYWNlcylcbiAgICAgID8gWydwYWNrYWdlcy8qJywgLi4uZGVjbGFyZWRQYXR0ZXJuc11cbiAgICAgIDogZGVjbGFyZWRQYXR0ZXJucztcbiAgcmV0dXJuIHdvcmtzcGFjZVBhdHRlcm5zLmZpbHRlcigod29ya3NwYWNlUGF0dGVybikgPT4gaXNJblJlcG9zaXRvcnlXb3Jrc3BhY2VQYXR0ZXJuKHdvcmtzcGFjZVBhdHRlcm4pKTtcbn1cblxuLyoqXG4gKiBXaGV0aGVyIGEgZGVjbGFyZWQgcG9zaXRpdmUgcGF0dGVybiBhbHJlYWR5IGNvdmVycyBgcGFja2FnZXMvKmAgdW5kZXIgcGF0aCBub3JtYWxpemF0aW9uXG4gKiAoZS5nLiBgLi9wYWNrYWdlcy8qYCBvciBhIHRyYWlsaW5nLXNsYXNoIHNwZWxsaW5nKTogZm9yY2luZyBhIHRleHR1YWwgYHBhY2thZ2VzLypgIG5leHQgdG9cbiAqIHN1Y2ggYSBzcGVsbGluZyB3b3VsZCBwZXJzaXN0IGR1cGxpY2F0ZSBlcXVpdmFsZW50IHBhdHRlcm5zIGFuZCByZS1zY2FuIHRoZSBzYW1lIGRpcmVjdG9yaWVzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gaGFzRGVjbGFyZWRQYWNrYWdlc1N0YXJQYXR0ZXJuKHdvcmtzcGFjZXM6IFBhY2thZ2VKc29uWyd3b3Jrc3BhY2VzJ10pOiBib29sZWFuIHtcbiAgcmV0dXJuIGdldE1lYW5pbmdmdWxEZWNsYXJlZFdvcmtzcGFjZVBhdHRlcm5zKHdvcmtzcGFjZXMpLnNvbWUoXG4gICAgKHdvcmtzcGFjZVBhdHRlcm4pID0+XG4gICAgICAhd29ya3NwYWNlUGF0dGVybi5zdGFydHNXaXRoKCchJykgJiZcbiAgICAgIC8vIEEgYC4uYC10cmF2ZXJzaW5nIG9yIGFic29sdXRlIHNwZWxsaW5nIChlLmcuIGB4Ly4uL3BhY2thZ2VzLypgKSBpcyBkaXNjYXJkZWQgYnlcbiAgICAgIC8vIGdldFNhbml0aXplZFdvcmtzcGFjZVBhdHRlcm5zLCBzbyBpdCBtdXN0IG5vdCBjb3VudCBhcyBjb3ZlcmluZyBwYWNrYWdlcy8qIOKAlCB0aGF0IHdvdWxkXG4gICAgICAvLyBzdXBwcmVzcyB0aGUgZmFsbGJhY2sgQU5EIGxvc2UgdGhlIHBhdHRlcm4sIGxlYXZpbmcgbm8gZGlzY292ZXJlZCB3b3Jrc3BhY2VzLlxuICAgICAgaXNJblJlcG9zaXRvcnlXb3Jrc3BhY2VQYXR0ZXJuKHdvcmtzcGFjZVBhdHRlcm4pICYmXG4gICAgICBub3JtYWxpemVXb3Jrc3BhY2VQYXR0ZXJuQm9keSh3b3Jrc3BhY2VQYXR0ZXJuKSA9PT0gJ3BhY2thZ2VzLyonXG4gICk7XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VKc29uIH0gZnJvbSAndHlwZS1mZXN0JztcblxuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5cbmltcG9ydCB7IGdldFdvcmtzcGFjZVBhY2thZ2VKc29uUGF0aHMgfSBmcm9tICcuL3dvcmtzcGFjZVV0aWwuanMnO1xuXG5jb25zdCBQUklWQVRFX1NDT1BFID0gJ0B3aWxsYm9vc3Rlci1wcml2YXRlLyc7XG5cbmNvbnN0IHByaXZhdGVSZWdpc3RyeUhvc3QgPSAndmVyZGFjY2lvLXByb2R1Y3Rpb24tZTM4OS51cC5yYWlsd2F5LmFwcCc7XG5leHBvcnQgY29uc3QgcHJpdmF0ZVJlZ2lzdHJ5U2NvcGVNYXBwaW5nID0gYEB3aWxsYm9vc3Rlci1wcml2YXRlOnJlZ2lzdHJ5PWh0dHBzOi8vJHtwcml2YXRlUmVnaXN0cnlIb3N0fS9gO1xuXG4vKipcbiAqIFdoZXRoZXIgdGhpcyByZXBvc2l0b3J5IGRlYWxzIHdpdGggYEB3aWxsYm9vc3Rlci1wcml2YXRlLypgIHBhY2thZ2VzIOKAlCBieSBjb252ZW50aW9uIHRoYXQgc2NvcGVcbiAqIGxpdmVzIGV4Y2x1c2l2ZWx5IG9uIHRoZSBwcml2YXRlIFZlcmRhY2NpbyByZWdpc3RyeSwgc28gZXhhY3RseSB0aGVzZSByZXBvc2l0b3JpZXMgbmVlZCB0aGVcbiAqIFZFUkRBQ0NJT19UT0tFTiBwYXNzLXRocm91Z2ggaW4gdGhlaXIgcmV1c2FibGUtd29ya2Zsb3cgY2FsbGVycy5cbiAqXG4gKiBBIHJlcG9zaXRvcnkgcXVhbGlmaWVzIHdoZW4gYW55IHdvcmtzcGFjZSBwYWNrYWdlLmpzb24gREVDTEFSRVMgYSBkZXBlbmRlbmN5IGluIHRoZSBzY29wZSAoYW55XG4gKiBkZXBlbmRlbmN5IGZpZWxkKSwgb3IgaXMgaXRzZWxmIE5BTUVEIGluIHRoZSBzY29wZSAoaXQgcHVibGlzaGVzIHRvIFZlcmRhY2NpbywgYW5kIHJlbGVhc2UueW1sXG4gKiBkZXJpdmVzIGl0cyBucG0gYXV0aCBmcm9tIHRoZSBzYW1lIHNlY3JldCkuIE5vdGhpbmcgZWxzZSBpcyBzY2FubmVkOiBsb2NrZmlsZXMgb25seSBtaXJyb3IgdGhlXG4gKiBkZWNsYXJlZCBkZXBlbmRlbmNpZXMsIGFuZCBidW5maWcudG9tbCdzIGBtaW5pbXVtUmVsZWFzZUFnZUV4Y2x1ZGVzYCBtZW50aW9ucyB0aGUgc2NvcGUgZXZlbiBpblxuICogcmVwb3NpdG9yaWVzIHRoYXQgZG8gbm90IGRlcGVuZCBvbiBpdC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlcG9SZXNvbHZlc1ByaXZhdGVQYWNrYWdlcyhcbiAgY29uZmlnOiBQaWNrPFBhY2thZ2VDb25maWcsICdkaXJQYXRoJyB8ICdkb2VzQ29udGFpblN1YlBhY2thZ2VKc29ucycgfCAncGFja2FnZUpzb24nPlxuKTogYm9vbGVhbiB7XG4gIGNvbnN0IG1hbmlmZXN0UmVsUGF0aHMgPSBuZXcgU2V0KFsncGFja2FnZS5qc29uJywgLi4uZ2V0V29ya3NwYWNlUGFja2FnZUpzb25QYXRocyhjb25maWcpXSk7XG4gIHJldHVybiBbLi4ubWFuaWZlc3RSZWxQYXRoc10uc29tZSgocmVsUGF0aCkgPT4ge1xuICAgIGNvbnN0IG1hbmlmZXN0ID0gcmVhZFBhY2thZ2VKc29uSWZFeGlzdHMocGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCByZWxQYXRoKSk7XG4gICAgaWYgKCFtYW5pZmVzdCkgcmV0dXJuIGZhbHNlO1xuICAgIGlmIChtYW5pZmVzdC5uYW1lPy5zdGFydHNXaXRoKFBSSVZBVEVfU0NPUEUpKSByZXR1cm4gdHJ1ZTtcbiAgICByZXR1cm4gW1xuICAgICAgbWFuaWZlc3QuZGVwZW5kZW5jaWVzLFxuICAgICAgbWFuaWZlc3QuZGV2RGVwZW5kZW5jaWVzLFxuICAgICAgbWFuaWZlc3QucGVlckRlcGVuZGVuY2llcyxcbiAgICAgIG1hbmlmZXN0Lm9wdGlvbmFsRGVwZW5kZW5jaWVzLFxuICAgIF0uc29tZSgoZGVwZW5kZW5jaWVzKSA9PiBPYmplY3Qua2V5cyhkZXBlbmRlbmNpZXMgPz8ge30pLnNvbWUoKG5hbWUpID0+IG5hbWUuc3RhcnRzV2l0aChQUklWQVRFX1NDT1BFKSkpO1xuICB9KTtcbn1cblxuZnVuY3Rpb24gcmVhZFBhY2thZ2VKc29uSWZFeGlzdHMoZmlsZVBhdGg6IHN0cmluZyk6IFBhY2thZ2VKc29uIHwgdW5kZWZpbmVkIHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gSlNPTi5wYXJzZShmcy5yZWFkRmlsZVN5bmMoZmlsZVBhdGgsICd1dGY4JykpIGFzIFBhY2thZ2VKc29uO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcy9wcm9taXNlcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgKiBhcyB5YW1sIGZyb20gJ2pzLXlhbWwnO1xuaW1wb3J0IHsgeiB9IGZyb20gJ3pvZCc7XG5cbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuXG5jb25zdCBydW5uZXJTY2hlbWEgPSB6LnVuaW9uKFt6LnN0cmluZygpLCB6LmFycmF5KHouc3RyaW5nKCkpXSk7XG5jb25zdCB3b3JrZmxvd1NjaGVtYSA9IHoub2JqZWN0KHtcbiAgam9iczogei5yZWNvcmQoXG4gICAgei5zdHJpbmcoKSxcbiAgICB6XG4gICAgICAub2JqZWN0KHtcbiAgICAgICAgJ3J1bnMtb24nOiBydW5uZXJTY2hlbWEub3B0aW9uYWwoKSxcbiAgICAgICAgc3RyYXRlZ3k6IHoub2JqZWN0KHsgbWF0cml4OiB6LnJlY29yZCh6LnN0cmluZygpLCB6LnVua25vd24oKSkgfSkub3B0aW9uYWwoKSxcbiAgICAgIH0pXG4gICAgICAubnVsbGFibGUoKVxuICApLFxufSk7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBhc3NlcnRQcml2YXRlV29ya2Zsb3dSdW5uZXJzKGNvbmZpZzogUGFja2FnZUNvbmZpZywgd29ya2Zsb3dzUGF0aDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gIGlmIChjb25maWcuaXNQdWJsaWNSZXBvIHx8ICFjb25maWcuaXNSZXBvVmlzaWJpbGl0eUtub3duKSByZXR1cm47XG4gIGNvbnN0IGVudHJpZXMgPSBhd2FpdCBmcy5yZWFkZGlyKHdvcmtmbG93c1BhdGgsIHsgd2l0aEZpbGVUeXBlczogdHJ1ZSB9KS5jYXRjaCgoZXJyb3I6IE5vZGVKUy5FcnJub0V4Y2VwdGlvbikgPT4ge1xuICAgIGlmIChlcnJvci5jb2RlID09PSAnRU5PRU5UJykgcmV0dXJuIFtdO1xuICAgIHRocm93IGVycm9yO1xuICB9KTtcbiAgZm9yIChjb25zdCB7IG5hbWU6IGZpbGVOYW1lIH0gb2YgZW50cmllcy5maWx0ZXIoKGVudHJ5KSA9PiBlbnRyeS5pc0ZpbGUoKSAmJiAvXFwueWE/bWwkL3UudGVzdChlbnRyeS5uYW1lKSkpIHtcbiAgICBjb25zdCB3b3JrZmxvdyA9IHdvcmtmbG93U2NoZW1hLnBhcnNlKHlhbWwubG9hZChhd2FpdCBmcy5yZWFkRmlsZShwYXRoLmpvaW4od29ya2Zsb3dzUGF0aCwgZmlsZU5hbWUpLCAndXRmOCcpKSk7XG4gICAgZm9yIChjb25zdCBbam9iTmFtZSwgam9iXSBvZiBPYmplY3QuZW50cmllcyh3b3JrZmxvdy5qb2JzKSkge1xuICAgICAgaWYgKCFqb2I/LlsncnVucy1vbiddKSBjb250aW51ZTtcbiAgICAgIGNvbnN0IHJ1bm5lciA9IGpvYlsncnVucy1vbiddO1xuICAgICAgaWYgKGlzU2VsZkhvc3RlZChydW5uZXIpKSBjb250aW51ZTtcbiAgICAgIGNvbnN0IG1hdGNoID0gdHlwZW9mIHJ1bm5lciA9PT0gJ3N0cmluZycgJiYgL15cXCRcXHtcXHtcXHMqbWF0cml4XFwuKFxcdyspXFxzKlxcfVxcfSQvdS5leGVjKHJ1bm5lcik7XG4gICAgICBjb25zdCBjYW5kaWRhdGVzOiB1bmtub3duW10gPSBbXTtcbiAgICAgIGlmIChtYXRjaCAmJiBqb2Iuc3RyYXRlZ3kpIHtcbiAgICAgICAgY29uc3Qga2V5ID0gbWF0Y2hbMV0hO1xuICAgICAgICBjb25zdCBtYXRyaXggPSBqb2Iuc3RyYXRlZ3kubWF0cml4O1xuICAgICAgICBjb25zdCB2YWx1ZXMgPSB6LmFycmF5KHoudW5rbm93bigpKS5zYWZlUGFyc2UobWF0cml4W2tleV0pO1xuICAgICAgICBpZiAodmFsdWVzLnN1Y2Nlc3MpIGNhbmRpZGF0ZXMucHVzaCguLi52YWx1ZXMuZGF0YSk7XG4gICAgICAgIGNvbnN0IGluY2x1ZGUgPSB6LmFycmF5KHoucmVjb3JkKHouc3RyaW5nKCksIHoudW5rbm93bigpKSkuc2FmZVBhcnNlKG1hdHJpeC5pbmNsdWRlKTtcbiAgICAgICAgaWYgKGluY2x1ZGUuc3VjY2VzcylcbiAgICAgICAgICBjYW5kaWRhdGVzLnB1c2goLi4uaW5jbHVkZS5kYXRhLm1hcCgocm93KSA9PiByb3dba2V5XSkuZmlsdGVyKCh2YWx1ZSkgPT4gdmFsdWUgIT09IHVuZGVmaW5lZCkpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY2FuZGlkYXRlcy5wdXNoKHJ1bm5lcik7XG4gICAgICB9XG4gICAgICBjb25zdCBhbGxvd2VkID1cbiAgICAgICAgY2FuZGlkYXRlcy5sZW5ndGggPiAwICYmXG4gICAgICAgIGNhbmRpZGF0ZXMuZXZlcnkoXG4gICAgICAgICAgKGNhbmRpZGF0ZSkgPT5cbiAgICAgICAgICAgIGlzU2VsZkhvc3RlZChjYW5kaWRhdGUpIHx8XG4gICAgICAgICAgICAoY29uZmlnLnJlcG9zaXRvcnk/LnRvTG93ZXJDYXNlKCkgPT09ICdnaXRodWI6d2lsbGJvb3N0ZXIvY2hlZXJsaW5ncycgJiZcbiAgICAgICAgICAgICAgZmlsZU5hbWUgPT09ICdidWlsZC1kZXNrdG9wLWFwcHMueW1sJyAmJlxuICAgICAgICAgICAgICBqb2JOYW1lID09PSAnYnVpbGQnICYmXG4gICAgICAgICAgICAgIGNhbmRpZGF0ZSA9PT0gJ3dpbmRvd3MtbGF0ZXN0JylcbiAgICAgICAgKTtcbiAgICAgIGlmICghYWxsb3dlZCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgYCR7ZmlsZU5hbWV9OiBqb2JzLiR7am9iTmFtZX0ucnVucy1vbiBtdXN0IHNlbGVjdCBzZWxmLWhvc3RlZCBydW5uZXJzIGluIGEgcHJpdmF0ZSByZXBvc2l0b3J5LiBGaXggdGhlIHdvcmtmbG93IGJlZm9yZSBydW5uaW5nIHdiZnkuYFxuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBpc1NlbGZIb3N0ZWQocnVubmVyOiB1bmtub3duKTogYm9vbGVhbiB7XG4gIGNvbnN0IGxhYmVscyA9IHJ1bm5lclNjaGVtYS5zYWZlUGFyc2UocnVubmVyKTtcbiAgaWYgKCFsYWJlbHMuc3VjY2VzcykgcmV0dXJuIGZhbHNlO1xuICBpZiAoQXJyYXkuaXNBcnJheShsYWJlbHMuZGF0YSkpIHJldHVybiBsYWJlbHMuZGF0YS5pbmNsdWRlcygnc2VsZi1ob3N0ZWQnKTtcbiAgcmV0dXJuIGxhYmVscy5kYXRhID09PSAnc2VsZi1ob3N0ZWQnO1xufVxuIiwiLy8gR2l0SHViIEFjdGlvbnMgdmFsdWVsZXNzIGV2ZW50cyBzdWNoIGFzIGBwdWxsX3JlcXVlc3Q6YCByZXF1aXJlIFlBTUwgbnVsbCB2YWx1ZXMuXG4vKiBlc2xpbnQtZGlzYWJsZSB1bmljb3JuL25vLW51bGwgKi9cblxuaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IG1lcmdlIGZyb20gJ2RlZXBtZXJnZSc7XG5pbXBvcnQgKiBhcyB5YW1sIGZyb20gJ2pzLXlhbWwnO1xuaW1wb3J0IHsgeiB9IGZyb20gJ3pvZCc7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgeyBoYXNGbm94U3luY0ZhaWxlZCwgcmVzb2x2ZUZub3hDaUFnZUtleVNlY3JldE5hbWUgfSBmcm9tICcuL2Zub3hUb21sLmpzJztcbmltcG9ydCB7IGZzVXRpbCB9IGZyb20gJy4uL3V0aWxzL2ZzVXRpbC5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGNvbWJpbmVNZXJnZSB9IGZyb20gJy4uL3V0aWxzL21lcmdlVXRpbC5qcyc7XG5pbXBvcnQgeyBtb3ZlVG9Cb3R0b20sIHNvcnRLZXlzIH0gZnJvbSAnLi4vdXRpbHMvb2JqZWN0VXRpbC5qcyc7XG5pbXBvcnQgeyByZXBvUmVzb2x2ZXNQcml2YXRlUGFja2FnZXMgfSBmcm9tICcuLi91dGlscy9wcml2YXRlUGFja2FnZXMuanMnO1xuaW1wb3J0IHsgcHJvbWlzZVBvb2wgfSBmcm9tICcuLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5pbXBvcnQgeyBhc3NlcnRQcml2YXRlV29ya2Zsb3dSdW5uZXJzIH0gZnJvbSAnLi93b3JrZmxvd1J1bm5lclBvbGljeS5qcyc7XG5cbmludGVyZmFjZSBXb3JrZmxvdyB7XG4gIG5hbWU/OiBzdHJpbmc7XG4gIG9uPzogT247XG4gIGNvbmN1cnJlbmN5PzogQ29uY3VycmVuY3k7XG4gIHBlcm1pc3Npb25zPzogUmVjb3JkPHN0cmluZywgc3RyaW5nPjtcbiAgam9iczogUmVjb3JkPHN0cmluZywgSm9iPjtcbn1cblxuaW50ZXJmYWNlIENvbmN1cnJlbmN5IHtcbiAgZ3JvdXA6IHN0cmluZztcbiAgJ2NhbmNlbC1pbi1wcm9ncmVzcyc6IGJvb2xlYW47XG4gIHF1ZXVlPzogJ3NpbmdsZScgfCAnbWF4Jztcbn1cblxuaW50ZXJmYWNlIE9uIHtcbiAgLy8gR2l0SHViIEFjdGlvbnMgdHJlYXRzIGBldmVudDogbnVsbGAgYXMgYSB2YWx1ZWxlc3MgZXZlbnQgbWFwcGluZywgZS5nLlxuICAvLyBgcHVsbF9yZXF1ZXN0OmAuIGB1bmRlZmluZWRgIHdvdWxkIG9taXQgdGhlIGV2ZW50IGVudGlyZWx5IHdoZW4gZHVtcGluZyBZQU1MLlxuICBpc3N1ZXM/OiBUeXBlcyB8IG51bGw7XG4gIHB1bGxfcmVxdWVzdD86IFB1bGxSZXF1ZXN0IHwgbnVsbDtcbiAgcHVsbF9yZXF1ZXN0X3RhcmdldD86IFR5cGVzIHwgbnVsbDtcbiAgcHVzaD86IFB1c2g7XG4gIHNjaGVkdWxlPzogU2NoZWR1bGVbXTtcbiAgd29ya2Zsb3dfZGlzcGF0Y2g/OiBudWxsO1xufVxuXG5pbnRlcmZhY2UgUHVsbFJlcXVlc3Qge1xuICAncGF0aHMtaWdub3JlJz86IHN0cmluZ1tdO1xuICB0eXBlcz86IHN0cmluZ1tdO1xufVxuXG5pbnRlcmZhY2UgUHVzaCB7XG4gIGJyYW5jaGVzOiBzdHJpbmdbXTtcbiAgJ3BhdGhzLWlnbm9yZSc/OiBzdHJpbmdbXTtcbn1cblxuaW50ZXJmYWNlIFNjaGVkdWxlIHtcbiAgY3Jvbjogc3RyaW5nO1xufVxuXG5pbnRlcmZhY2UgVHlwZXMge1xuICB0eXBlczogc3RyaW5nW107XG59XG5cbmludGVyZmFjZSBKb2Ige1xuICAncnVucy1vbic/OiBzdHJpbmc7XG4gIGVudj86IFJlY29yZDxzdHJpbmcsIHN0cmluZz47XG4gIHBlcm1pc3Npb25zPzogUmVjb3JkPHN0cmluZywgc3RyaW5nPjtcbiAgc3RlcHM/OiBTdGVwW107XG4gIHVzZXM/OiBzdHJpbmc7XG4gIGlmPzogc3RyaW5nO1xuICBzZWNyZXRzPzogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gfCAnaW5oZXJpdCc7XG4gIHdpdGg/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbn1cblxuaW50ZXJmYWNlIFN0ZXAge1xuICB1c2VzPzogc3RyaW5nO1xuICB3aXRoPzogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gIHJ1bj86IHN0cmluZztcbn1cblxuY29uc3Qgd29ya2Zsb3dzID0ge1xuICB0ZXN0OiB7XG4gICAgbmFtZTogJ1Rlc3QnLFxuICAgIG9uOiB7XG4gICAgICBwdWxsX3JlcXVlc3Q6IG51bGwsXG4gICAgICBwdXNoOiB7XG4gICAgICAgIGJyYW5jaGVzOiBbJ21haW4nXSxcbiAgICAgIH0sXG4gICAgICAvLyBMZXQgbWFpbnRhaW5lcnMgcmUtcnVuIHRoZSB0ZXN0cyBieSBoYW5kLlxuICAgICAgd29ya2Zsb3dfZGlzcGF0Y2g6IG51bGwsXG4gICAgfSxcbiAgICAvLyBjZi4gaHR0cHM6Ly9kb2NzLmdpdGh1Yi5jb20vZW4vYWN0aW9ucy91c2luZy1qb2JzL3VzaW5nLWNvbmN1cnJlbmN5I2V4YW1wbGUtb25seS1jYW5jZWwtaW4tcHJvZ3Jlc3Mtam9icy1vci1ydW5zLWZvci10aGUtY3VycmVudC13b3JrZmxvd1xuICAgIGNvbmN1cnJlbmN5OiB7XG4gICAgICBncm91cDogJyR7eyBnaXRodWIud29ya2Zsb3cgfX0tJHt7IGdpdGh1Yi5yZWYgfX0nLFxuICAgICAgJ2NhbmNlbC1pbi1wcm9ncmVzcyc6IHRydWUsXG4gICAgfSxcbiAgICAvLyBOb25lIG9mIHRoZXNlIG1heSBiZSBuYXJyb3dlZCBqdXN0IGJlY2F1c2UgdGhlIHJldXNhYmxlIHRlc3Qgd29ya2Zsb3cgbmV2ZXIgcHVzaGVzOlxuICAgIHBlcm1pc3Npb25zOiB7XG4gICAgICAvLyBmb3IgdGhlIHRlc3Qgam9iJ3Mgc2tpcC1kdXBsaWNhdGUtYWN0aW9ucyBjYWxsIHdpdGggY2FuY2VsX290aGVyczogdHJ1ZSAodGhlIHJldXNhYmxlXG4gICAgICAvLyB0ZXN0IHdvcmtmbG93IGRlY2xhcmVzIG5vIHBlcm1pc3Npb25zIG9mIGl0cyBvd24sIHNvIGl0cyBqb2JzIHJ1biBvbiB0aGlzIHRva2VuKVxuICAgICAgYWN0aW9uczogJ3dyaXRlJyxcbiAgICAgIC8vIGZvciBgc2VtYW50aWMtcmVsZWFzZSAtLWRyeS1ydW5gLCB3aGljaCBkb2VzIGEgYGdpdCBwdXNoIC0tZHJ5LXJ1bmAgdG8gdmVyaWZ5IHdyaXRlXG4gICAgICAvLyBhY2Nlc3MgYW5kIGFib3J0cyB3aXRoIEVHSVROT1BFUk1JU1NJT04gd2l0aG91dCBpdFxuICAgICAgY29udGVudHM6ICd3cml0ZScsXG4gICAgICAvLyBmb3IgcGtnLXByZWZsaWdodCBQUiBmaWxlIGxpc3RpbmdcbiAgICAgICdwdWxsLXJlcXVlc3RzJzogJ3JlYWQnLFxuICAgIH0sXG4gICAgam9iczoge1xuICAgICAgdGVzdDoge1xuICAgICAgICB1c2VzOiAnV2lsbEJvb3N0ZXIvcmV1c2FibGUtd29ya2Zsb3dzLy5naXRodWIvd29ya2Zsb3dzL3Rlc3QueW1sQG1haW4nLFxuICAgICAgfSxcbiAgICB9LFxuICB9LFxuICAndGVzdC1ydXN0Jzoge1xuICAgIG5hbWU6ICdUZXN0IFJ1c3QnLFxuICAgIG9uOiB7XG4gICAgICBwdWxsX3JlcXVlc3Q6IG51bGwsXG4gICAgICBwdXNoOiB7XG4gICAgICAgIGJyYW5jaGVzOiBbJ21haW4nXSxcbiAgICAgIH0sXG4gICAgfSxcbiAgICBjb25jdXJyZW5jeToge1xuICAgICAgZ3JvdXA6ICcke3sgZ2l0aHViLndvcmtmbG93IH19LSR7eyBnaXRodWIucmVmIH19JyxcbiAgICAgICdjYW5jZWwtaW4tcHJvZ3Jlc3MnOiB0cnVlLFxuICAgIH0sXG4gICAgam9iczoge1xuICAgICAgJ3Rlc3QtcnVzdCc6IHtcbiAgICAgICAgdXNlczogJ1dpbGxCb29zdGVyL3JldXNhYmxlLXdvcmtmbG93cy8uZ2l0aHViL3dvcmtmbG93cy90ZXN0LXJ1c3QueW1sQG1haW4nLFxuICAgICAgfSxcbiAgICB9LFxuICB9LFxuICByZWxlYXNlOiB7XG4gICAgbmFtZTogJ1JlbGVhc2UnLFxuICAgIG9uOiB7XG4gICAgICBwdXNoOiB7XG4gICAgICAgIGJyYW5jaGVzOiBbXSxcbiAgICAgIH0sXG4gICAgfSxcbiAgICAvLyBgcXVldWU6IG1heGAgaGVyZSB0b28gKCM5NzQpOiBHaXRIdWIncyBkZWZhdWx0IHF1ZXVlIChgc2luZ2xlYCkgY2FuY2VscyBhbiBhbHJlYWR5LVBFTkRJTkdcbiAgICAvLyBjYWxsZXIgcnVuIHdoZW4gYW5vdGhlciBvbmUgcXVldWVzIOKAlCBiZWZvcmUgaXRzIGpvYiAoYW5kIHRoZSByZXVzYWJsZSB3b3JrZmxvdydzIG93blxuICAgIC8vIGpvYi1sZXZlbCBgcXVldWU6IG1heGApIGV2ZXIgc3RhcnRzIOKAlCBzaWxlbnRseSBkcm9wcGluZyB0aGF0IHJlbGVhc2UgdHJpZ2dlci5cbiAgICAvLyBUaGUgY2FsbGVyLWxldmVsIGdyb3VwIG11c3QgTk9UIHJldXNlIHRoZSByZXVzYWJsZSB3b3JrZmxvdydzIGpvYi1sZXZlbCBncm91cCBuYW1lXG4gICAgLy8gKGByZWxlYXNlLSR7eyBnaXRodWIucmVwb3NpdG9yeSB9fWApOiB3b3JrZmxvdy1sZXZlbCBhbmQgam9iLWxldmVsIGdyb3VwcyBzaGFyZSBvbmVcbiAgICAvLyByZXBvc2l0b3J5LXdpZGUgbmFtZXNwYWNlLCBhbmQgaWRlbnRpY2FsIG5hbWVzIGRlYWRsb2NrIHRoZSBydW4gKFwiQ2FuY2VsaW5nIHNpbmNlIGFcbiAgICAvLyBkZWFkbG9jayBmb3IgY29uY3VycmVuY3kgZ3JvdXAgLi4uIHdhcyBkZXRlY3RlZCBiZXR3ZWVuICd0b3AgbGV2ZWwgd29ya2Zsb3cnIGFuZCAnPGpvYj4nXCIpLlxuICAgIGNvbmN1cnJlbmN5OiB7XG4gICAgICBncm91cDogJyR7eyBnaXRodWIud29ya2Zsb3cgfX0nLFxuICAgICAgJ2NhbmNlbC1pbi1wcm9ncmVzcyc6IGZhbHNlLFxuICAgICAgcXVldWU6ICdtYXgnLFxuICAgIH0sXG4gICAgcGVybWlzc2lvbnM6IHtcbiAgICAgIC8vIGh0dHBzOi8vZG9jcy5ucG1qcy5jb20vdHJ1c3RlZC1wdWJsaXNoZXJzI3N0ZXAtMi1jb25maWd1cmUteW91ci1jaWNkLXdvcmtmbG93XG4gICAgICAnaWQtdG9rZW4nOiAnd3JpdGUnLFxuICAgICAgLy8gZm9yIHNlbWFudGljLXJlbGVhc2VcbiAgICAgIGNvbnRlbnRzOiAnd3JpdGUnLFxuICAgIH0sXG4gICAgam9iczoge1xuICAgICAgcmVsZWFzZToge1xuICAgICAgICB1c2VzOiAnV2lsbEJvb3N0ZXIvcmV1c2FibGUtd29ya2Zsb3dzLy5naXRodWIvd29ya2Zsb3dzL3JlbGVhc2UueW1sQG1haW4nLFxuICAgICAgfSxcbiAgICB9LFxuICB9LFxuICAnc2VtYW50aWMtcHInOiB7XG4gICAgbmFtZTogJ0xpbnQgUFIgdGl0bGUnLFxuICAgIG9uOiB7XG4gICAgICBwdWxsX3JlcXVlc3RfdGFyZ2V0OiB7XG4gICAgICAgIHR5cGVzOiBbJ29wZW5lZCcsICdlZGl0ZWQnLCAnc3luY2hyb25pemUnXSxcbiAgICAgIH0sXG4gICAgfSxcbiAgICBqb2JzOiB7XG4gICAgICAnc2VtYW50aWMtcHInOiB7XG4gICAgICAgIHVzZXM6ICdXaWxsQm9vc3Rlci9yZXVzYWJsZS13b3JrZmxvd3MvLmdpdGh1Yi93b3JrZmxvd3Mvc2VtYW50aWMtcHIueW1sQG1haW4nLFxuICAgICAgfSxcbiAgICB9LFxuICB9LFxuICBzeW5jOiB7XG4gICAgbmFtZTogJ1N5bmMnLFxuICAgIG9uOiB7fSxcbiAgICBwZXJtaXNzaW9uczoge1xuICAgICAgLy8gZm9yIGNvbW1pdGluZyBjaGFuZ2VzXG4gICAgICBjb250ZW50czogJ3dyaXRlJyxcbiAgICB9LFxuICAgIGpvYnM6IHtcbiAgICAgIHN5bmM6IHsgdXNlczogJ1dpbGxCb29zdGVyL3JldXNhYmxlLXdvcmtmbG93cy8uZ2l0aHViL3dvcmtmbG93cy9zeW5jLnltbEBtYWluJyB9LFxuICAgIH0sXG4gIH0sXG4gICdjbG9zZS1jb21tZW50Jzoge1xuICAgIG5hbWU6ICdBZGQgY2xvc2UgY29tbWVudCcsXG4gICAgb246IHtcbiAgICAgIHB1bGxfcmVxdWVzdDoge1xuICAgICAgICB0eXBlczogWydvcGVuZWQnXSxcbiAgICAgIH0sXG4gICAgfSxcbiAgICBqb2JzOiB7XG4gICAgICAnY2xvc2UtY29tbWVudCc6IHtcbiAgICAgICAgdXNlczogJ1dpbGxCb29zdGVyL3JldXNhYmxlLXdvcmtmbG93cy8uZ2l0aHViL3dvcmtmbG93cy9jbG9zZS1jb21tZW50LnltbEBtYWluJyxcbiAgICAgIH0sXG4gICAgfSxcbiAgfSxcbn0gYXMgY29uc3Q7XG5cbnR5cGUgS25vd25LaW5kID0ga2V5b2YgdHlwZW9mIHdvcmtmbG93cyB8ICdkZXBsb3knO1xuXG4vKipcbiAqIFBhcnNlcyBhIGB1c2VzOmAgdmFsdWUgY2FsbGluZyBvbmUgb2YgV2lsbEJvb3N0ZXIncyBvd24gcmV1c2FibGUgd29ya2Zsb3dzIChvciB0aGVcbiAqIFdpbGxCb29zdGVyTGFiIHN5bmMgbWlycm9yKSBpbnRvIHRoZSB3b3JrZmxvdyBuYW1lICh3aXRob3V0IGV4dGVuc2lvbikgYW5kIGdpdCByZWYuIE9ubHkgdGhvc2VcbiAqIGZvbGxvdyB0aGUgY29udHJhY3Qgd2JmeSBlbmZvcmNlcyDigJQgY2FsbGVycyBvZiBhbm90aGVyIG9yZ2FuaXphdGlvbidzIHNhbWUtbmFtZWQgcmVwb3NpdG9yeSBhcmVcbiAqIGxlZnQgYWxvbmUuIEdpdEh1YiB0cmVhdHMgb3duZXIvcmVwb3NpdG9yeSBuYW1lcyBjYXNlLWluc2Vuc2l0aXZlbHksIHNvIHRoZSBjb21wYXJpc29uIGRvZXNcbiAqIHRvbywgd2hpbGUgdGhlIHdvcmtmbG93IHBhdGggYW5kIHJlZiBzdGF5IGNhc2Utc2Vuc2l0aXZlLlxuICovXG5mdW5jdGlvbiBwYXJzZU9yZ1JldXNhYmxlV29ya2Zsb3dDYWxsKFxuICB1c2VzOiBzdHJpbmcgfCB1bmRlZmluZWRcbik6IHsgd29ya2Zsb3dOYW1lOiBzdHJpbmc7IGV4dGVuc2lvbjogc3RyaW5nOyByZWY6IHN0cmluZyB9IHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgbWF0Y2ggPSAvXihbXi9dKylcXC8oW14vXSspXFwvXFwuZ2l0aHViXFwvd29ya2Zsb3dzXFwvKFteL0BdKz8pXFwuKHlhP21sKUAoLispJC91LmV4ZWModXNlcyA/PyAnJyk7XG4gIGlmICghbWF0Y2gpIHJldHVybiB1bmRlZmluZWQ7XG4gIGNvbnN0IG93bmVyID0gbWF0Y2hbMV0hLnRvTG93ZXJDYXNlKCk7XG4gIGlmICgob3duZXIgIT09ICd3aWxsYm9vc3RlcicgJiYgb3duZXIgIT09ICd3aWxsYm9vc3RlcmxhYicpIHx8IG1hdGNoWzJdIS50b0xvd2VyQ2FzZSgpICE9PSAncmV1c2FibGUtd29ya2Zsb3dzJykge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cbiAgcmV0dXJuIHsgd29ya2Zsb3dOYW1lOiBtYXRjaFszXSEsIGV4dGVuc2lvbjogbWF0Y2hbNF0hLCByZWY6IG1hdGNoWzVdISB9O1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVXb3JrZmxvd3Mocm9vdENvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICBpZiAoIXJvb3RDb25maWcuaXNSZXBvVmlzaWJpbGl0eUtub3duKSB7XG4gICAgY29uc29sZS53YXJuKCdTa2lwcGVkIHdvcmtmbG93IGdlbmVyYXRpb24gYmVjYXVzZSByZXBvc2l0b3J5IHZpc2liaWxpdHkgaXMgdW5rbm93bi4nKTtcbiAgICByZXR1cm47XG4gIH1cbiAgY29uc3Qgd29ya2Zsb3dzUGF0aCA9IHBhdGgucmVzb2x2ZShyb290Q29uZmlnLmRpclBhdGgsICcuZ2l0aHViJywgJ3dvcmtmbG93cycpO1xuICBpZiAoIWlzUmV1c2FibGVXb3JrZmxvd3NSZXBvKHJvb3RDb25maWcucmVwb3NpdG9yeSkgJiYgKGF3YWl0IGZzVXRpbC5pc0NvbmZpbmVkV3JpdGFibGVQYXRoKHdvcmtmbG93c1BhdGgpKSkge1xuICAgIGF3YWl0IGFzc2VydFByaXZhdGVXb3JrZmxvd1J1bm5lcnMocm9vdENvbmZpZywgd29ya2Zsb3dzUGF0aCk7XG4gIH1cbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdnZW5lcmF0ZVdvcmtmbG93JywgYXN5bmMgKCkgPT4ge1xuICAgIGlmIChpc1JldXNhYmxlV29ya2Zsb3dzUmVwbyhyb290Q29uZmlnLnJlcG9zaXRvcnkpKSB7XG4gICAgICAvLyBEb24ndCB0b3VjaCByZXVzYWJsZS13b3JrZmxvd3MgcmVwbyBiZWNhdXNlIGl0IGhvc3RzIHVwc3RyZWFtIHdvcmtmbG93IGRlZmluaXRpb25zLlxuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIFdpdGggLmdpdGh1YiBvciAuZ2l0aHViL3dvcmtmbG93cyBzeW1saW5rZWQgb3V0c2lkZSB0aGUgcmVwb3NpdG9yeSwgd3JpdGVZYW1sJ3MgZ3VhcmRzXG4gICAgLy8gYWxyZWFkeSByZWZ1c2UgdGhlIHdyaXRlcywgYnV0IHJlYWRkaXIvcm0gYmVsb3cgd291bGQgc3RpbGwgZW51bWVyYXRlIGFuZCBERUxFVEUgZmlsZXNcbiAgICAvLyBvdXRzaWRlIHRoZSByZXBvc2l0b3J5IOKAlCBzbyByZXF1aXJlIHRoZSBkaXJlY3RvcnkgdG8gcmVzb2x2ZSBpbnNpZGUgaXQgYmVmb3JlIGFueVxuICAgIC8vIHRyYXZlcnNhbCwgbWtkaXIsIG9yIGNsZWFudXAuXG4gICAgaWYgKCEoYXdhaXQgZnNVdGlsLmlzQ29uZmluZWRXcml0YWJsZVBhdGgod29ya2Zsb3dzUGF0aCkpKSB7XG4gICAgICBjb25zb2xlLndhcm4oYFNraXBwZWQgZ2VuZXJhdGluZyB3b3JrZmxvd3MgYmVjYXVzZSAke3dvcmtmbG93c1BhdGh9IHJlc29sdmVzIG91dHNpZGUgdGhlIHJlcG9zaXRvcnkuYCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGF3YWl0IGZzLnByb21pc2VzLm1rZGlyKHdvcmtmbG93c1BhdGgsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuXG4gICAgY29uc3QgZW50cmllcyA9IGF3YWl0IGZzLnByb21pc2VzLnJlYWRkaXIod29ya2Zsb3dzUGF0aCwgeyB3aXRoRmlsZVR5cGVzOiB0cnVlIH0pO1xuICAgIC8vIHdiZnkgd3JpdGVzIC55bWwgd29ya2Zsb3dzLCBzbyBlYWNoIGtpbmQgbWFwcyB0byBpdHMgLnltbCBmaWxlLlxuICAgIGNvbnN0IGZpbGVOYW1lc0J5S2luZCA9IG5ldyBNYXA8c3RyaW5nLCBzdHJpbmc+KCk7XG4gICAgZm9yIChjb25zdCBlbnRyeSBvZiBlbnRyaWVzKSB7XG4gICAgICBpZiAoIWVudHJ5LmlzRmlsZSgpIHx8ICFlbnRyeS5uYW1lLmVuZHNXaXRoKCcueW1sJykpIGNvbnRpbnVlO1xuICAgICAgZmlsZU5hbWVzQnlLaW5kLnNldChlbnRyeS5uYW1lLnNsaWNlKDAsIC0nLnltbCcubGVuZ3RoKSwgZW50cnkubmFtZSk7XG4gICAgfVxuICAgIGNvbnN0IG1hbmRhdG9yeUtpbmRzID0gWyd0ZXN0JywgJ3NlbWFudGljLXByJywgJ2Nsb3NlLWNvbW1lbnQnXTtcbiAgICBpZiAocm9vdENvbmZpZy5kZXBlbmRpbmcuc2VtYW50aWNSZWxlYXNlKSB7XG4gICAgICBtYW5kYXRvcnlLaW5kcy5wdXNoKCdyZWxlYXNlJyk7XG4gICAgfVxuICAgIGlmIChyb290Q29uZmlnLmNhcmdvVG9tbERpclBhdGhzLmxlbmd0aCA+IDApIHtcbiAgICAgIG1hbmRhdG9yeUtpbmRzLnB1c2goJ3Rlc3QtcnVzdCcpO1xuICAgIH1cbiAgICAvLyBBIHByZXZpb3VzIHJ1biBtYXkgaGF2ZSBtaXN0YWtlbiBhIGdpdGlnbm9yZWQgdGhpcmQtcGFydHkgY2hlY2tvdXQgZm9yIHJlcG9zaXRvcnkgUnVzdCBjb2RlLlxuICAgIC8vIFJlbW92ZSBvbmx5IHRoZSBnZW5lcmF0ZWQtc3R5bGUgY2FsbGVyOiBhIHNhbWUtbmFtZWQgY3VzdG9tIHdvcmtmbG93IHdpdGggYW55IG90aGVyIGpvYiBzdGF5cy5cbiAgICBpZiAocm9vdENvbmZpZy5jYXJnb1RvbWxEaXJQYXRocy5sZW5ndGggPT09IDApIHtcbiAgICAgIGNvbnN0IHRlc3RSdXN0RmlsZU5hbWUgPSBmaWxlTmFtZXNCeUtpbmQuZ2V0KCd0ZXN0LXJ1c3QnKTtcbiAgICAgIGlmICh0ZXN0UnVzdEZpbGVOYW1lICYmIGpvYnNBbGxDYWxsUmV1c2FibGVXb3JrZmxvdyh3b3JrZmxvd3NQYXRoLCB0ZXN0UnVzdEZpbGVOYW1lLCAndGVzdC1ydXN0JykpIHtcbiAgICAgICAgZmlsZU5hbWVzQnlLaW5kLmRlbGV0ZSgndGVzdC1ydXN0Jyk7XG4gICAgICAgIGF3YWl0IGZzVXRpbC5yZW1vdmVDb25maW5lZChwYXRoLmpvaW4od29ya2Zsb3dzUGF0aCwgdGVzdFJ1c3RGaWxlTmFtZSkpO1xuICAgICAgfVxuICAgIH1cbiAgICBmaWxlTmFtZXNCeUtpbmQuZGVsZXRlKCd3YmZ5Jyk7XG4gICAgZm9yIChjb25zdCBraW5kIG9mIG1hbmRhdG9yeUtpbmRzKSB7XG4gICAgICBpZiAoIWZpbGVOYW1lc0J5S2luZC5oYXMoa2luZCkpIHtcbiAgICAgICAgZmlsZU5hbWVzQnlLaW5kLnNldChraW5kLCBgJHtraW5kfS55bWxgKTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGZpbGVOYW1lc0J5S2luZC5oYXMoJ3N5bmMnKSkge1xuICAgICAgLy8gVGhlIHN5bmMgd29ya2Zsb3cncyBnZW5lcmF0aW9uIG93bnMgdGhlIGZvcmNlLXN5bmMgd29ya2Zsb3csIHNvIHByb2Nlc3NpbmcgaXQgYXMgYW5cbiAgICAgIC8vIGluZGVwZW5kZW50IGtpbmQgd291bGQgcmFjZSBjb25jdXJyZW50IHdyaXRlcyBvbiB0aGUgc2FtZSBwYXRoLlxuICAgICAgZmlsZU5hbWVzQnlLaW5kLmRlbGV0ZSgnc3luYy1mb3JjZScpO1xuICAgIH1cblxuICAgIGZvciAoY29uc3QgW2tpbmQsIGZpbGVOYW1lXSBvZiBmaWxlTmFtZXNCeUtpbmQpIHtcbiAgICAgIC8vIOWun+mam+OBr0tub3duS2luZOS7peWkluOBruWApOOCguS7o+WFpeOBleOCjOOCi+OBk+OBqOOBq+azqOaEj1xuICAgICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IHdyaXRlV29ya2Zsb3dZYW1sKHJvb3RDb25maWcsIHdvcmtmbG93c1BhdGgsIGtpbmQgYXMgS25vd25LaW5kLCBmaWxlTmFtZSkpO1xuICAgIH1cbiAgfSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc1JldXNhYmxlV29ya2Zsb3dzUmVwbyhyZXBvc2l0b3J5Pzogc3RyaW5nKTogYm9vbGVhbiB7XG4gIC8vIENhc2UtaW5zZW5zaXRpdmU6IEdpdEh1YiByZXBvc2l0b3J5IG5hbWVzIGFyZSwgYW5kIGEgcmVtb3RlIG1heSBzcGVsbCB0aGlzIG9uZSBhbnkgd2F5LiBHZXR0aW5nIGl0IHdyb25nXG4gIC8vIGxldHMgd2JmeSByZXdyaXRlIHRoZSByZXBvc2l0b3J5IHRoYXQgaG9zdHMgdGhlIHVwc3RyZWFtIHdvcmtmbG93IGRlZmluaXRpb25zLlxuICByZXR1cm4gcmVwb3NpdG9yeT8udG9Mb3dlckNhc2UoKS5lbmRzV2l0aCgnL3JldXNhYmxlLXdvcmtmbG93cycpID8/IGZhbHNlO1xufVxuXG4vKipcbiAqIFdoZXRoZXIgZXZlcnkgam9iIG9mIHRoZSB3b3JrZmxvdyBmaWxlIGNhbGxzIHRoZSBuYW1lZCBXaWxsQm9vc3RlciByZXVzYWJsZSB3b3JrZmxvdyAob3duZXJcbiAqIHJlc3RyaWN0ZWQgdmlhIHBhcnNlT3JnUmV1c2FibGVXb3JrZmxvd0NhbGwpLiBVc2VkIHRvIGRlY2lkZSB3aGV0aGVyIHdiZnkgb3ducyBhIGZpbGUgZW5vdWdoIHRvXG4gKiBkZWxldGUgaXQ6IHVucGFyc2FibGUgZmlsZXMgYW5kIGZpbGVzIHdpdGggYW55IG90aGVyIGpvYiByZXR1cm4gZmFsc2Ug4oCUIGRlbGV0aW5nIGEgd2hvbGVcbiAqIHdvcmtmbG93IG9uIGEgbG9vc2UgbWF0Y2ggd291bGQgYmUgdG9vIGFnZ3Jlc3NpdmUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBqb2JzQWxsQ2FsbFJldXNhYmxlV29ya2Zsb3cod29ya2Zsb3dzUGF0aDogc3RyaW5nLCBmaWxlTmFtZTogc3RyaW5nLCB3b3JrZmxvd05hbWU6IHN0cmluZyk6IGJvb2xlYW4ge1xuICBpZiAoIWZpbGVOYW1lLmVuZHNXaXRoKCcueW1sJykpIHJldHVybiBmYWxzZTtcbiAgbGV0IGNvbnRlbnQ6IHN0cmluZztcbiAgdHJ5IHtcbiAgICBjb250ZW50ID0gZnMucmVhZEZpbGVTeW5jKHBhdGguam9pbih3b3JrZmxvd3NQYXRoLCBmaWxlTmFtZSksICd1dGY4Jyk7XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBjb25zdCBpc1RhcmdldENhbGwgPSAodXNlczogdW5rbm93bik6IGJvb2xlYW4gPT5cbiAgICB0eXBlb2YgdXNlcyA9PT0gJ3N0cmluZycgJiYgcGFyc2VPcmdSZXVzYWJsZVdvcmtmbG93Q2FsbCh1c2VzKT8ud29ya2Zsb3dOYW1lID09PSB3b3JrZmxvd05hbWU7XG4gIHRyeSB7XG4gICAgY29uc3Qgd29ya2Zsb3cgPSB5YW1sLmxvYWQoY29udGVudCkgYXMgV29ya2Zsb3cgfCB1bmRlZmluZWQ7XG4gICAgaWYgKHdvcmtmbG93ICYmIHR5cGVvZiB3b3JrZmxvdyA9PT0gJ29iamVjdCcgJiYgd29ya2Zsb3cuam9icyAmJiB0eXBlb2Ygd29ya2Zsb3cuam9icyA9PT0gJ29iamVjdCcpIHtcbiAgICAgIGNvbnN0IGpvYnMgPSBPYmplY3QudmFsdWVzKHdvcmtmbG93LmpvYnMpO1xuICAgICAgcmV0dXJuIGpvYnMubGVuZ3RoID4gMCAmJiBqb2JzLmV2ZXJ5KChqb2IpID0+IGlzVGFyZ2V0Q2FsbChqb2I/LnVzZXMpKTtcbiAgICB9XG4gIH0gY2F0Y2gge1xuICAgIC8vIFVucGFyc2FibGUgY29udGVudCBpcyBub3QgcHJvdmFibHkgYSBjYWxsZXIgb2YgdGhlIG5hbWVkIHdvcmtmbG93LlxuICB9XG4gIHJldHVybiBmYWxzZTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gd3JpdGVXb3JrZmxvd1lhbWwoXG4gIGNvbmZpZzogUGFja2FnZUNvbmZpZyxcbiAgd29ya2Zsb3dzUGF0aDogc3RyaW5nLFxuICBraW5kOiBLbm93bktpbmQsXG4gIGZpbGVOYW1lID0gYCR7a2luZH0ueW1sYFxuKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5qb2luKHdvcmtmbG93c1BhdGgsIGZpbGVOYW1lKTtcbiAgY29uc3QgZGVwbG95UHJvZHVjdGlvbkZpbGVOYW1lID0gZnMuZXhpc3RzU3luYyhwYXRoLmpvaW4od29ya2Zsb3dzUGF0aCwgJ2RlcGxveS1wcm9kdWN0aW9uLnltbCcpKVxuICAgID8gJ2RlcGxveS1wcm9kdWN0aW9uLnltbCdcbiAgICA6IHVuZGVmaW5lZDtcblxuICAvLyBBIG5vbi1nZW5lcmF0ZWQgdGVzdC1ydXN0LnltbCBpbiBhIHJlcG8gd2l0aG91dCBSdXN0IGNvZGUgbWVyZWx5IHNoYXJlcyB0aGUgbmFtZTsgbGVhdmUgaXQgYWxvbmUuXG4gIGlmIChraW5kID09PSAndGVzdC1ydXN0JyAmJiBjb25maWcuY2FyZ29Ub21sRGlyUGF0aHMubGVuZ3RoID09PSAwKSByZXR1cm47XG5cbiAgbGV0IG5ld1NldHRpbmdzID0gc3RydWN0dXJlZENsb25lKGtpbmQgaW4gd29ya2Zsb3dzID8gd29ya2Zsb3dzW2tpbmQgYXMga2V5b2YgdHlwZW9mIHdvcmtmbG93c10gOiB7fSkgYXMgV29ya2Zsb3c7XG4gIGNvbnN0IG9sZENvbnRlbnQgPSBhd2FpdCBmc1V0aWwucmVhZEZpbGVJZkV4aXN0cyhmaWxlUGF0aCk7XG4gIGlmIChvbGRDb250ZW50ICE9PSB1bmRlZmluZWQpIHtcbiAgICBsZXQgb2xkU2V0dGluZ3M6IFdvcmtmbG93O1xuICAgIHRyeSB7XG4gICAgICBvbGRTZXR0aW5ncyA9IHlhbWwubG9hZChvbGRDb250ZW50KSBhcyBXb3JrZmxvdztcbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIEFuIGV4aXN0aW5nIHdvcmtmbG93IHdiZnkgY2Fubm90IHBhcnNlIG11c3QgYmUgbGVmdCB1bnRvdWNoZWQ6IHdyaXRpbmcgdGhlIHRlbXBsYXRlXG4gICAgICAvLyB3aXRob3V0IG1lcmdpbmcgd291bGQgc2lsZW50bHkgZGlzY2FyZCB0aGUgcmVwb3NpdG9yeSdzIHdvcmtmbG93LlxuICAgICAgY29uc29sZS53YXJuKGBTa2lwcGVkIGdlbmVyYXRpbmcgJHtmaWxlUGF0aH0gYmVjYXVzZSB0aGUgZXhpc3RpbmcgY29udGVudCBpcyBub3QgcGFyc2FibGUgYXMgWUFNTC5gKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgLy8geWFtbC5sb2FkIHJldHVybnMgdW5kZWZpbmVkIGZvciBlbXB0eS9jb21tZW50LW9ubHkgZmlsZXMgYW5kIG5vbi1vYmplY3RzIGZvciBzY2FsYXJcbiAgICAvLyBkb2N1bWVudHMgd2l0aG91dCB0aHJvd2luZzsgZGVlcG1lcmdlIHdvdWxkIGNyYXNoIG9uIHRoZW0uXG4gICAgaWYgKHR5cGVvZiBvbGRTZXR0aW5ncyAhPT0gJ29iamVjdCcgfHwgb2xkU2V0dGluZ3MgPT09IG51bGwgfHwgQXJyYXkuaXNBcnJheShvbGRTZXR0aW5ncykpIHtcbiAgICAgIGNvbnNvbGUud2FybihgU2tpcHBlZCBnZW5lcmF0aW5nICR7ZmlsZVBhdGh9IGJlY2F1c2UgdGhlIGV4aXN0aW5nIGNvbnRlbnQgaXMgbm90IGEgd29ya2Zsb3cuYCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIG5ld1NldHRpbmdzID0gbWVyZ2UuYWxsKFtuZXdTZXR0aW5ncywgb2xkU2V0dGluZ3MsIG5ld1NldHRpbmdzXSwgeyBhcnJheU1lcmdlOiBjb21iaW5lTWVyZ2UgfSkgYXMgV29ya2Zsb3c7XG4gIH1cblxuICBpZiAoISgnam9icycgaW4gbmV3U2V0dGluZ3MpKSByZXR1cm47XG5cbiAgaWYgKGtpbmQuc3RhcnRzV2l0aCgnZGVwbG95JykpIHtcbiAgICBuZXdTZXR0aW5ncyA9IHtcbiAgICAgIC4uLm5ld1NldHRpbmdzLFxuICAgICAgLy8gVW5saWtlIHRoZSByZWxlYXNlIGNhbGxlciwgdGhlIGRlZmF1bHQgcXVldWUgKGBzaW5nbGVgKSBpcyBpbnRlbnRpb25hbCBoZXJlOiBhIHBlbmRpbmdcbiAgICAgIC8vIGRlcGxveSB0aGF0IGlzIGNhbmNlbGxlZCBhbmQgcmVwbGFjZWQgYnkgYSBuZXdlciBvbmUgbG9zZXMgbm90aGluZyDigJQgdGhlIG5ld2VyIGRlcGxveVxuICAgICAgLy8gY29udmVyZ2VzIHRoZSBlbnZpcm9ubWVudCB0byB0aGUgbGF0ZXN0IHN0YXRlIGFueXdheS5cbiAgICAgIGNvbmN1cnJlbmN5OiB7XG4gICAgICAgIGdyb3VwOiAnJHt7IGdpdGh1Yi53b3JrZmxvdyB9fScsXG4gICAgICAgICdjYW5jZWwtaW4tcHJvZ3Jlc3MnOiBmYWxzZSxcbiAgICAgIH0sXG4gICAgfTtcbiAgICBtb3ZlVG9Cb3R0b20obmV3U2V0dGluZ3MsICdqb2JzJyk7XG4gICAgaWYgKG5ld1NldHRpbmdzLm9uPy5wdXNoKSB7XG4gICAgICBuZXdTZXR0aW5ncy5vbi5wdXNoWydwYXRocy1pZ25vcmUnXSA9IFtcbiAgICAgICAgLi4ubmV3IFNldChbJyoqLm1kJywgJyoqL2RvY3MvKionLCAuLi4obmV3U2V0dGluZ3Mub24ucHVzaFsncGF0aHMtaWdub3JlJ10gPz8gW10pXSksXG4gICAgICBdO1xuICAgIH1cbiAgfVxuXG4gIGlmIChraW5kID09PSAncmVsZWFzZScgJiYgbmV3U2V0dGluZ3Muam9icy5yZWxlYXNlICYmIGRlcGxveVByb2R1Y3Rpb25GaWxlTmFtZSkge1xuICAgIG5ld1NldHRpbmdzLnBlcm1pc3Npb25zID8/PSB7fTtcbiAgICBuZXdTZXR0aW5ncy5wZXJtaXNzaW9ucy5hY3Rpb25zID0gJ3dyaXRlJztcbiAgICBuZXdTZXR0aW5ncy5qb2JzLnJlbGVhc2Uud2l0aCA/Pz0ge307XG4gICAgbmV3U2V0dGluZ3Muam9icy5yZWxlYXNlLndpdGgudHJpZ2dlcl9kZXBsb3lfd29ya2Zsb3cgPSBkZXBsb3lQcm9kdWN0aW9uRmlsZU5hbWU7XG4gIH1cblxuICBsZXQgaXNSZXVzYWJsZVdvcmtmbG93ID0gZmFsc2U7XG4gIGZvciAoY29uc3Qgam9iIG9mIE9iamVjdC52YWx1ZXMobmV3U2V0dGluZ3Muam9icykpIHtcbiAgICAvLyBJZ25vcmUgZW1wdHkgam9icyAoYSBiYXJlIGBqb2JOYW1lOmAgcGFyc2VzIGFzIG51bGwpLCBub24tcmV1c2FibGUgd29ya2Zsb3dzLCBhbmQgb3RoZXJcbiAgICAvLyBvcmdhbml6YXRpb25zJyByZXVzYWJsZSB3b3JrZmxvd3M6IGEgc2FtZS1uYW1lZCBgcmV1c2FibGUtd29ya2Zsb3dzYCByZXBvc2l0b3J5IGVsc2V3aGVyZVxuICAgIC8vIGZvbGxvd3MgYSBkaWZmZXJlbnQgY29udHJhY3QsIGFuZCBub3JtYWxpemluZyBpdHMgY2FsbGVycyAoc2VjcmV0IGluamVjdGlvbi9yZW1vdmFsLFxuICAgIC8vIHBlcm1pc3Npb25zKSBjb3VsZCBicmVhayB0aGVtLlxuICAgIGlmICgham9iIHx8ICFwYXJzZU9yZ1JldXNhYmxlV29ya2Zsb3dDYWxsKGpvYi51c2VzKSkgY29udGludWU7XG5cbiAgICBub3JtYWxpemVKb2IoY29uZmlnLCBqb2IsIGtpbmQpO1xuICAgIGlzUmV1c2FibGVXb3JrZmxvdyA9IHRydWU7XG4gIH1cbiAgaWYgKCFpc1JldXNhYmxlV29ya2Zsb3cpIHJldHVybjtcblxuICAvLyBEZXBsb3kgY2FsbGVycyBuZWVkIG5vIHJlcG9zaXRvcnkgd3JpdGVzOiB0aGUgY2FsbGVkIHJldXNhYmxlIHdvcmtmbG93IGluaGVyaXRzIHRoZSBjYWxsZXInc1xuICAvLyB0b2tlbiBwZXJtaXNzaW9ucywgcmVwb3NpdG9yaWVzIGRlZmF1bHQgdGhlIHRva2VuIHRvIHdyaXRlLCBhbmQgdGhlIHJldXNhYmxlIGRlcGxveSB3b3JrZmxvd1xuICAvLyBhdCBtYWluIHBlcmZvcm1zIG5vIEdJVEhVQl9UT0tFTiB3cml0ZXMuIFRoZSByZWFkLW9ubHkgZGVmYXVsdCBpcyBpbmplY3RlZCBhdCB0aGUgSk9CIGxldmVsXG4gIC8vIChqb2IgcGVybWlzc2lvbnMgZG8gbm90IGFmZmVjdCBzaWJsaW5nIGpvYnMsIHNvIGlubGluZSBqb2JzIG9yIHBpbm5lZCBjYWxsZWVzIOKAlCB3aG9zZSB3cml0ZVxuICAvLyBuZWVkcyBhcmUgdW5hdWRpdGVkIOKAlCBrZWVwIHRoZWlycyksIGFuZCBvbmx5IHdoZW4gbmVpdGhlciB0aGUgd29ya2Zsb3cgbm9yIHRoZSBqb2IgZGVjbGFyZXNcbiAgLy8gaXRzIG93biBwZXJtaXNzaW9ucyAoT0lEQyBkZXBsb3lzIGFsd2F5cyBkbywgZm9yIGlkLXRva2VuKS4gcnVuLXNjcmlwdCBjYWxsZXJzIGFyZSBleGNsdWRlZFxuICAvLyBiZWNhdXNlIGFyYml0cmFyeSBwYWNrYWdlIHNjcmlwdHMgbWF5IHB1c2ggY29tbWl0cy5cbiAgaWYgKCFuZXdTZXR0aW5ncy5wZXJtaXNzaW9ucykge1xuICAgIGZvciAoY29uc3Qgam9iIG9mIE9iamVjdC52YWx1ZXMobmV3U2V0dGluZ3Muam9icykpIHtcbiAgICAgIGlmICgham9iKSBjb250aW51ZTtcbiAgICAgIGNvbnN0IGNhbGwgPSBwYXJzZU9yZ1JldXNhYmxlV29ya2Zsb3dDYWxsKGpvYi51c2VzKTtcbiAgICAgIGlmICgham9iLnBlcm1pc3Npb25zICYmIGNhbGw/LndvcmtmbG93TmFtZSA9PT0gJ2RlcGxveScgJiYgY2FsbC5yZWYgPT09ICdtYWluJykge1xuICAgICAgICBqb2IucGVybWlzc2lvbnMgPSB7IGNvbnRlbnRzOiAncmVhZCcgfTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBzd2l0Y2ggKGtpbmQpIHtcbiAgICBjYXNlICdyZWxlYXNlJzoge1xuICAgICAgaWYgKG5ld1NldHRpbmdzLm9uPy5zY2hlZHVsZSkge1xuICAgICAgICBkZWxldGUgbmV3U2V0dGluZ3Mub24ucHVzaDtcbiAgICAgIH0gZWxzZSBpZiAobmV3U2V0dGluZ3Mub24/LnB1c2ggJiYgY29uZmlnLnJlbGVhc2UuYnJhbmNoZXMubGVuZ3RoID4gMCkge1xuICAgICAgICBuZXdTZXR0aW5ncy5vbi5wdXNoLmJyYW5jaGVzID0gY29uZmlnLnJlbGVhc2UuYnJhbmNoZXM7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBhd2FpdCBmc1V0aWwucmVtb3ZlQ29uZmluZWQoZmlsZVBhdGgpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBpZiAoY29uZmlnLmlzUHVibGljUmVwbykge1xuICAgICAgICBuZXdTZXR0aW5ncy5wZXJtaXNzaW9ucyA/Pz0ge307XG4gICAgICAgIG5ld1NldHRpbmdzLnBlcm1pc3Npb25zWydpZC10b2tlbiddID0gJ3dyaXRlJztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGRlbGV0ZSBuZXdTZXR0aW5ncy5wZXJtaXNzaW9ucz8uWydpZC10b2tlbiddO1xuICAgICAgfVxuICAgICAgYnJlYWs7XG4gICAgfVxuICAgIGNhc2UgJ3Rlc3QnOlxuICAgIGNhc2UgJ3Rlc3QtcnVzdCc6IHtcbiAgICAgIC8vIERvbid0IHVzZSBgcGF0aHMtaWdub3JlYCBmb3IgdGVzdCBiZWNhdXNlIEdpdEh1YidzIEJyYW5jaCBQcm90ZWN0aW9uIGFuZCBSdWxlc2V0cyByZXF1aXJlIGpvYiBydW5uaW5nLlxuICAgICAgaWYgKG5ld1NldHRpbmdzLm9uPy5wdWxsX3JlcXVlc3QpIHtcbiAgICAgICAgZGVsZXRlIG5ld1NldHRpbmdzLm9uLnB1bGxfcmVxdWVzdFsncGF0aHMtaWdub3JlJ107XG4gICAgICB9XG4gICAgICBpZiAobmV3U2V0dGluZ3Mub24/LnB1c2gpIHtcbiAgICAgICAgZGVsZXRlIG5ld1NldHRpbmdzLm9uLnB1c2hbJ3BhdGhzLWlnbm9yZSddO1xuICAgICAgICBuZXdTZXR0aW5ncy5vbi5wdXNoLmJyYW5jaGVzID0gbmV3U2V0dGluZ3Mub24ucHVzaC5icmFuY2hlcy5maWx0ZXIoKGJyYW5jaCkgPT4gYnJhbmNoICE9PSAncmVub3ZhdGUvKionKTtcbiAgICAgIH1cbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuICBhd2FpdCB3cml0ZVlhbWwobmV3U2V0dGluZ3MsIGZpbGVQYXRoKTtcblxuICBpZiAoa2luZCA9PT0gJ3N5bmMnKSB7XG4gICAgaWYgKCFuZXdTZXR0aW5ncy5qb2JzLnN5bmM/LndpdGgpIHJldHVybjtcblxuICAgIC8vIEdlbmVyYXRlIHRoZSBmb3JjZS1zeW5jIHdvcmtmbG93IGJhc2VkIG9uIHRoZSBzeW5jIHdvcmtmbG93IGlmIGl0IGV4aXN0cy5cbiAgICBuZXdTZXR0aW5ncy5qb2JzWydzeW5jLWZvcmNlJ10gPSBuZXdTZXR0aW5ncy5qb2JzLnN5bmM7XG4gICAgY29uc3QgcGFyYW1zID0gbmV3U2V0dGluZ3Muam9icy5zeW5jLndpdGguc3luY19wYXJhbXNfd2l0aG91dF9kZXN0O1xuICAgIGlmICh0eXBlb2YgcGFyYW1zICE9PSAnc3RyaW5nJykgcmV0dXJuO1xuXG4gICAgbmV3U2V0dGluZ3Muam9icy5zeW5jLndpdGguc3luY19wYXJhbXNfd2l0aG91dF9kZXN0ID0gYC0tZm9yY2UgJHtwYXJhbXN9YDtcbiAgICBuZXdTZXR0aW5ncy5uYW1lID0gJ0ZvcmNlIHRvIFN5bmMnO1xuICAgIG5ld1NldHRpbmdzLm9uID0geyB3b3JrZmxvd19kaXNwYXRjaDogbnVsbCB9O1xuICAgIGRlbGV0ZSBuZXdTZXR0aW5ncy5qb2JzLnN5bmM7XG4gICAgYXdhaXQgd3JpdGVZYW1sKG5ld1NldHRpbmdzLCBwYXRoLmpvaW4od29ya2Zsb3dzUGF0aCwgJ3N5bmMtZm9yY2UueW1sJykpO1xuICB9XG59XG5cbi8vIHdiJ3MgZ2xvYmFsIG9wdGlvbnMgdGhhdCBjb25zdW1lIGEgZm9sbG93aW5nIHZhbHVlIHRva2VuIChmcm9tIHNoYXJlZE9wdGlvbnNCdWlsZGVyIHBsdXNcbi8vIHlhcmdzT3B0aW9uc0J1aWxkZXJGb3JFbnYpOyBldmVyeSBvdGhlciBgLWAtcHJlZml4ZWQgdG9rZW4gYmVmb3JlIHRoZSBzdWJjb21tYW5kIGlzIGEgYm9vbGVhbi5cbmNvbnN0IHdiR2xvYmFsVmFsdWVPcHRpb25zID0gbmV3IFNldChbJy0td29ya2luZy1kaXInLCAnLXcnLCAnLS1lbnYnLCAnLS1jYXNjYWRlLWVudiddKTtcblxuLy8gU3ViY29tbWFuZHMgdGhhdCBydW4gYSBCSU5BUlkgKHNvIHRoZSBmb2xsb3dpbmcgdG9rZW4gY2FuIGJlIHRoZSB3YiBleGVjdXRhYmxlKSwgcGVyIHJ1bm5lcjogYnVuXG4vLyByZXNlcnZlcyBvbmx5IGB4YCAoYGJ1biBkbHhgL2BidW4gZXhlY2AgcnVuIGEgcGFja2FnZSBzY3JpcHQgb2YgdGhhdCBuYW1lKSwgbnBtIGhhcyBgZXhlY2AvYHhgLFxuLy8gYW5kIHBucG0veWFybiAoQmVycnkpIGhhdmUgYGV4ZWNgL2BkbHhgLlxuY29uc3QgcnVubmVyRXhlY3V0b3JTdWJjb21tYW5kc0J5UnVubmVyOiBSZWNvcmQ8c3RyaW5nLCBTZXQ8c3RyaW5nPj4gPSB7XG4gIG5wbTogbmV3IFNldChbJ2V4ZWMnLCAneCddKSxcbiAgcG5wbTogbmV3IFNldChbJ2V4ZWMnLCAnZGx4J10pLFxuICB5YXJuOiBuZXcgU2V0KFsnZXhlYycsICdkbHgnXSksXG4gIGJ1bjogbmV3IFNldChbJ3gnXSksXG59O1xuXG4vLyBSdW5uZXIgb3B0aW9ucyB0aGF0IGNvbnN1bWUgdGhlIEZPTExPV0lORyB0b2tlbiBhcyB0aGVpciB2YWx1ZSwgc28gaXQgaXMgbm90IHRoZSB3YiBleGVjdXRhYmxlXG4vLyAoZS5nLiBgYnVuIC0tY3dkIGRpciB3YiBkZXBsb3lgLCBgbnB4IC1wIHBrZyB3YiBkZXBsb3lgKS4gQSBjb25zZXJ2YXRpdmUgc3VwZXJzZXQgYWNyb3NzXG4vLyBucG0vcG5wbS95YXJuL2J1biBhbmQgdGhlIG5weC9idW54IHBhY2thZ2UgZXhlY3V0b3JzLlxuY29uc3QgcnVubmVyVmFsdWVPcHRpb25zID0gbmV3IFNldChbXG4gICctLWN3ZCcsXG4gICctQycsXG4gICctLXByZWZpeCcsXG4gICctLWZpbHRlcicsXG4gICctRicsXG4gICctLXdvcmtzcGFjZScsXG4gICctdycsXG4gICctLWRpcicsXG4gICctcCcsXG4gICctLXBhY2thZ2UnLFxuICAnLWMnLFxuICAnLS1jYWxsJyxcbl0pO1xuXG4vKiogQWR2YW5jZSBwYXN0IGEgcnVubmVyJ3Mgb3B0aW9ucywgY29uc3VtaW5nIGEgc2VwYXJhdGUgdmFsdWUgdG9rZW4gd2hlcmUgb25lIGFwcGxpZXMuICovXG5mdW5jdGlvbiBza2lwUnVubmVyT3B0aW9ucyh0b2tlbnM6IHN0cmluZ1tdLCBzdGFydEluZGV4OiBudW1iZXIpOiBudW1iZXIge1xuICBsZXQgaW5kZXggPSBzdGFydEluZGV4O1xuICB3aGlsZSAoaW5kZXggPCB0b2tlbnMubGVuZ3RoICYmICh0b2tlbnNbaW5kZXhdID8/ICcnKS5zdGFydHNXaXRoKCctJykpIHtcbiAgICBjb25zdCBvcHRpb24gPSB0b2tlbnNbaW5kZXhdID8/ICcnO1xuICAgIGluZGV4Kys7XG4gICAgaWYgKCFvcHRpb24uaW5jbHVkZXMoJz0nKSAmJiBydW5uZXJWYWx1ZU9wdGlvbnMuaGFzKG9wdGlvbikgJiYgaW5kZXggPCB0b2tlbnMubGVuZ3RoKSBpbmRleCsrO1xuICB9XG4gIHJldHVybiBpbmRleDtcbn1cblxuLyoqXG4gKiBUb2tlbml6ZSBhIHNoZWxsIGNvbW1hbmQgbGluZSBpbnRvIGNvbW1hbmQgc2VnbWVudHMsIGVhY2ggYSBsaXN0IG9mIHRva2VucyB3aXRoIHF1b3RlcyByZW1vdmVkLlxuICogQSBuZXcgc2VnbWVudCBzdGFydHMgYXQgYW4gdW5xdW90ZWQgYCYmYC9gfHxgL2A7YC9gfGAvYCZgOyBhbiB1bnF1b3RlZCBgI2Agc3RhcnRzIGEgY29tbWVudCB0b1xuICogZW5kIG9mIGxpbmU7IGEgYmFja3NsYXNoIGVzY2FwZXMgdGhlIG5leHQgY2hhcmFjdGVyIChzbyBgXFw7YCBpcyBhIGxpdGVyYWwsIG5vdCBhIHNlcGFyYXRvcik7XG4gKiBncm91cGluZyBwYXJlbnRoZXNlcyBgKGAvYClgIGFyZSB0b2tlbiBzZXBhcmF0b3JzLCBzbyBgKHdiIGRlcGxveSlgIHRva2VuaXplcyBhcyBgd2IgZGVwbG95YC5cbiAqIFNlZ21lbnRzL3Rva2VucyBtb2RlbCBjb21tYW5kIHN0cnVjdHVyZSBwcmVjaXNlbHkgZW5vdWdoIHRoYXQgcXVvdGVkIG9wZXJhdG9ycywgZXNjYXBlZFxuICogb3BlcmF0b3JzLCBjb21tZW50cywgYW5kIHN1YnNoZWxsIGdyb3VwcyBuZWl0aGVyIGZhYnJpY2F0ZSBub3IgaGlkZSBhIGB3YiBkZXBsb3lgIGludm9jYXRpb24uXG4gKi9cbmZ1bmN0aW9uIHRva2VuaXplU2hlbGxDb21tYW5kKHNjcmlwdDogc3RyaW5nKTogeyBzZWdtZW50czogc3RyaW5nW11bXTsgc2F3SGVyZWRvYzogYm9vbGVhbiB9IHtcbiAgY29uc3Qgc2VnbWVudHM6IHN0cmluZ1tdW10gPSBbXTtcbiAgbGV0IHRva2Vuczogc3RyaW5nW10gPSBbXTtcbiAgbGV0IGN1cnJlbnQgPSAnJztcbiAgbGV0IGluVG9rZW4gPSBmYWxzZTtcbiAgbGV0IHF1b3RlOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gIC8vIFdoZXRoZXIgdGhlIHNjcmlwdCB1c2VzIGFueSBoZXJlZG9jLiBGYWl0aGZ1bGx5IGNsYXNzaWZ5aW5nIHdoaWNoIGJvZHkgbGluZXMgYXJlIGRhdGEgKHRoZVxuICAvLyBkZWxpbWl0ZXIgd29yZCBjYW4gYmUgcXVvdGVkL2JhY2tzbGFzaC1lc2NhcGVkLCBgPDwtYCBzdHJpcHMgbGVhZGluZyB0YWJzLCB0ZXJtaW5hdG9ycyBtYXRjaFxuICAvLyBleGFjdGx5KSBpcyBtb3JlIHRoYW4gdGhpcyBwYXJzZXIgbW9kZWxzLCBzbyBhIGhlcmVkb2MgYW55d2hlcmUgbWFrZXMgZGV0ZWN0aW9uIHJldHVybiBmYWxzZS5cbiAgbGV0IHNhd0hlcmVkb2MgPSBmYWxzZTtcbiAgLy8gSGVyZWRvYyBkZWxpbWl0ZXJzIHdob3NlIGJvZGllcyBiZWdpbiBhdCB0aGUgTkVYVCBuZXdsaW5lOiBgY2F0IDw8QSA8PEJgIHF1ZXVlcyBBIHRoZW4gQiwgYW5kXG4gIC8vIHRoZSBjb21tYW5kcyBBRlRFUiB0aGUgYDw8YCBoZWFkZXIgb24gdGhlIHNhbWUgbGluZSBzdGlsbCBleGVjdXRlLCBzbyB0aGUgaGVhZGVyIGlzIHJlY29yZGVkXG4gIC8vIGhlcmUgYW5kIHRoZSBib2RpZXMgYXJlIHNraXBwZWQgb25seSB3aGVuIHRoZSBsaW5lJ3MgbmV3bGluZSBpcyByZWFjaGVkLlxuICBsZXQgcGVuZGluZ0hlcmVkb2NEZWxpbWl0ZXJzOiBzdHJpbmdbXSA9IFtdO1xuICBjb25zdCBza2lwSGVyZWRvY0JvZGllcyA9IChmcm9tSW5kZXg6IG51bWJlcik6IG51bWJlciA9PiB7XG4gICAgbGV0IGN1cnNvciA9IGZyb21JbmRleDtcbiAgICBmb3IgKGNvbnN0IGRlbGltaXRlciBvZiBwZW5kaW5nSGVyZWRvY0RlbGltaXRlcnMpIHtcbiAgICAgIHdoaWxlIChjdXJzb3IgPCBzY3JpcHQubGVuZ3RoKSB7XG4gICAgICAgIGNvbnN0IGxpbmVTdGFydCA9IGN1cnNvciArIDE7XG4gICAgICAgIGxldCBsaW5lRW5kID0gbGluZVN0YXJ0O1xuICAgICAgICB3aGlsZSAobGluZUVuZCA8IHNjcmlwdC5sZW5ndGggJiYgc2NyaXB0W2xpbmVFbmRdICE9PSAnXFxuJykgbGluZUVuZCsrO1xuICAgICAgICBjdXJzb3IgPSBsaW5lRW5kO1xuICAgICAgICBpZiAoc2NyaXB0LnNsaWNlKGxpbmVTdGFydCwgbGluZUVuZCkudHJpbSgpID09PSBkZWxpbWl0ZXIpIGJyZWFrO1xuICAgICAgICBpZiAobGluZUVuZCA+PSBzY3JpcHQubGVuZ3RoKSBicmVhaztcbiAgICAgIH1cbiAgICB9XG4gICAgcGVuZGluZ0hlcmVkb2NEZWxpbWl0ZXJzID0gW107XG4gICAgcmV0dXJuIGN1cnNvcjtcbiAgfTtcbiAgY29uc3QgZW5kVG9rZW4gPSAoKTogdm9pZCA9PiB7XG4gICAgaWYgKGluVG9rZW4pIHRva2Vucy5wdXNoKGN1cnJlbnQpO1xuICAgIGN1cnJlbnQgPSAnJztcbiAgICBpblRva2VuID0gZmFsc2U7XG4gIH07XG4gIGNvbnN0IGVuZFNlZ21lbnQgPSAoKTogdm9pZCA9PiB7XG4gICAgZW5kVG9rZW4oKTtcbiAgICBzZWdtZW50cy5wdXNoKHRva2Vucyk7XG4gICAgdG9rZW5zID0gW107XG4gIH07XG4gIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCBzY3JpcHQubGVuZ3RoOyBpbmRleCsrKSB7XG4gICAgY29uc3QgY2hhcmFjdGVyID0gc2NyaXB0W2luZGV4XSA/PyAnJztcbiAgICBpZiAocXVvdGUpIHtcbiAgICAgIGlmIChjaGFyYWN0ZXIgPT09ICdcXFxcJyAmJiBxdW90ZSA9PT0gJ1wiJykge1xuICAgICAgICAvLyBJbnNpZGUgZG91YmxlIHF1b3RlcywgYmFja3NsYXNoLW5ld2xpbmUgaXMgc3RpbGwgYSBsaW5lIGNvbnRpbnVhdGlvbiAoYm90aCByZW1vdmVkKTtcbiAgICAgICAgLy8gYW55IG90aGVyIGVzY2FwZWQgY2hhcmFjdGVyIGNvbnRyaWJ1dGVzIGxpdGVyYWxseS5cbiAgICAgICAgaWYgKHNjcmlwdFtpbmRleCArIDFdID09PSAnXFxuJykgaW5kZXgrKztcbiAgICAgICAgZWxzZSBjdXJyZW50ICs9IHNjcmlwdFsrK2luZGV4XSA/PyAnJztcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBpZiAoY2hhcmFjdGVyID09PSBxdW90ZSkgcXVvdGUgPSB1bmRlZmluZWQ7XG4gICAgICBlbHNlIGN1cnJlbnQgKz0gY2hhcmFjdGVyO1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGlmIChjaGFyYWN0ZXIgPT09ICdcXFxcJykge1xuICAgICAgLy8gQmFja3NsYXNoLW5ld2xpbmUgaXMgYSBsaW5lIGNvbnRpbnVhdGlvbjogdGhlIHNoZWxsIHJlbW92ZXMgYm90aCwgam9pbmluZyB0aGUgbGluZXNcbiAgICAgIC8vIHdpdGhvdXQgaW50cm9kdWNpbmcgYSB0b2tlbiBib3VuZGFyeS4gQW55IG90aGVyIGVzY2FwZWQgY2hhcmFjdGVyIGlzIGEgbGl0ZXJhbC5cbiAgICAgIGlmIChzY3JpcHRbaW5kZXggKyAxXSA9PT0gJ1xcbicpIHtcbiAgICAgICAgaW5kZXgrKztcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBjdXJyZW50ICs9IHNjcmlwdFsrK2luZGV4XSA/PyAnJztcbiAgICAgIGluVG9rZW4gPSB0cnVlO1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGlmIChjaGFyYWN0ZXIgPT09IFwiJ1wiIHx8IGNoYXJhY3RlciA9PT0gJ1wiJykge1xuICAgICAgcXVvdGUgPSBjaGFyYWN0ZXI7XG4gICAgICBpblRva2VuID0gdHJ1ZTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICAvLyBBIGA8PGAvYDw8LWAgaGVyZWRvYyByZWRpcmVjdGlvbjogaXRzIGJvZHkgbGluZXMgKHVwIHRvIHRoZSBkZWxpbWl0ZXIgbGluZSkgYXJlIERBVEEsIG5vdFxuICAgIC8vIGNvbW1hbmRzLCBzbyBgY2F0IDw8J0VPRidcXG53YiBkZXBsb3lcXG5FT0ZgIG11c3Qgbm90IHJlYWQgYHdiIGRlcGxveWAgYXMgYW4gaW52b2NhdGlvbi4gU2luY2VcbiAgICAvLyB0aGUgY2FsbGVyIGRlY2xpbmVzIG9uIEFOWSBoZXJlZG9jLCBmbGFnIGl0IHRoZSBpbnN0YW50IGA8PGAgYXBwZWFycyDigJQgYmVmb3JlIHBhcnNpbmcgdGhlXG4gICAgLy8gZGVsaW1pdGVyIHdvcmQg4oCUIHNvIGFuIGV4b3RpYyBkZWxpbWl0ZXIgKGA8PCtgKSB0aGUgd29yZCBzY2FubmVyIGNhbm5vdCByZWFkIHN0aWxsIGRlY2xpbmVzLlxuICAgIGlmIChjaGFyYWN0ZXIgPT09ICc8JyAmJiBzY3JpcHRbaW5kZXggKyAxXSA9PT0gJzwnKSB7XG4gICAgICBzYXdIZXJlZG9jID0gdHJ1ZTtcbiAgICAgIGxldCBjdXJzb3IgPSBpbmRleCArIDI7XG4gICAgICBpZiAoc2NyaXB0W2N1cnNvcl0gPT09ICctJykgY3Vyc29yKys7XG4gICAgICB3aGlsZSAoL1sgXFx0XS91LnRlc3Qoc2NyaXB0W2N1cnNvcl0gPz8gJycpKSBjdXJzb3IrKztcbiAgICAgIGxldCBkZWxpbWl0ZXIgPSAnJztcbiAgICAgIC8vIFRoZSBkZWxpbWl0ZXIgd29yZCBtYXkgYmUgcXVvdGVkIChgPDwnRU9GJ2ApIG9yIGJhY2tzbGFzaC1lc2NhcGVkIChgPDxcXEVPRmApOyBlaXRoZXIgZm9ybVxuICAgICAgLy8ganVzdCBkaXNhYmxlcyBib2R5IGV4cGFuc2lvbiwgc28gY29sbGVjdCB0aGUgYmFyZSB3b3JkLiBNaXNzaW5nIHRoZSBlc2NhcGVkIGZvcm0gd291bGQgZHJvcFxuICAgICAgLy8gYHNhd0hlcmVkb2NgIGFuZCByZWFkIHRoZSBoZXJlZG9jIGJvZHkgYXMgY29tbWFuZHMuXG4gICAgICBsZXQgZGVsaW1pdGVyUXVvdGU6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgICAgIHdoaWxlIChjdXJzb3IgPCBzY3JpcHQubGVuZ3RoKSB7XG4gICAgICAgIGNvbnN0IGRlbGltaXRlckNoYXIgPSBzY3JpcHRbY3Vyc29yXSA/PyAnJztcbiAgICAgICAgaWYgKGRlbGltaXRlclF1b3RlKSB7XG4gICAgICAgICAgaWYgKGRlbGltaXRlckNoYXIgPT09IGRlbGltaXRlclF1b3RlKSBkZWxpbWl0ZXJRdW90ZSA9IHVuZGVmaW5lZDtcbiAgICAgICAgICBlbHNlIGRlbGltaXRlciArPSBkZWxpbWl0ZXJDaGFyO1xuICAgICAgICB9IGVsc2UgaWYgKGRlbGltaXRlckNoYXIgPT09ICdcXFxcJykge1xuICAgICAgICAgIC8vIEEgYmFja3NsYXNoIHF1b3RlcyB0aGUgbmV4dCBjaGFyYWN0ZXIgaW50byB0aGUgZGVsaW1pdGVyIHdvcmQgKGA8PFxcRU9GYCDihpIgYEVPRmApLlxuICAgICAgICAgIGN1cnNvcisrO1xuICAgICAgICAgIGRlbGltaXRlciArPSBzY3JpcHRbY3Vyc29yXSA/PyAnJztcbiAgICAgICAgfSBlbHNlIGlmIChkZWxpbWl0ZXJDaGFyID09PSBcIidcIiB8fCBkZWxpbWl0ZXJDaGFyID09PSAnXCInKSB7XG4gICAgICAgICAgZGVsaW1pdGVyUXVvdGUgPSBkZWxpbWl0ZXJDaGFyO1xuICAgICAgICB9IGVsc2UgaWYgKC9bXFx3Li1dL3UudGVzdChkZWxpbWl0ZXJDaGFyKSkge1xuICAgICAgICAgIGRlbGltaXRlciArPSBkZWxpbWl0ZXJDaGFyO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGN1cnNvcisrO1xuICAgICAgfVxuICAgICAgaWYgKGRlbGltaXRlcikge1xuICAgICAgICAvLyBUaGUgYDw8ZGVsaW1gIGhlYWRlciBpcyBhIHJlZGlyZWN0aW9uIChub3QgYSB0b2tlbik7IHJlY29yZCB0aGUgZGVsaW1pdGVyIGFuZCBrZWVwXG4gICAgICAgIC8vIHBhcnNpbmcgdGhlIHJlc3Qgb2YgdGhpcyBsaW5lIOKAlCBpdHMgYm9keSBpcyBza2lwcGVkIHdoZW4gdGhlIG5ld2xpbmUgaXMgcmVhY2hlZC5cbiAgICAgICAgZW5kVG9rZW4oKTtcbiAgICAgICAgcGVuZGluZ0hlcmVkb2NEZWxpbWl0ZXJzLnB1c2goZGVsaW1pdGVyKTtcbiAgICAgICAgaW5kZXggPSBjdXJzb3IgLSAxO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGNoYXJhY3RlciA9PT0gJyMnICYmICFpblRva2VuKSB7XG4gICAgICAvLyBDb21tZW50IHJ1bnMgdG8gZW5kIG9mIGxpbmU7IGVuZCB0aGUgY3VycmVudCBjb21tYW5kIHNlZ21lbnQgYW5kIGxldCB0aGUgbG9vcCByZXN1bWUgYXRcbiAgICAgIC8vIHRoZSBuZXdsaW5lIHNvIHRoZSBuZXh0IGxpbmUgaXMgcGFyc2VkIGFzIGl0cyBvd24gc2VnbWVudC5cbiAgICAgIGVuZFNlZ21lbnQoKTtcbiAgICAgIHdoaWxlIChpbmRleCArIDEgPCBzY3JpcHQubGVuZ3RoICYmIHNjcmlwdFtpbmRleCArIDFdICE9PSAnXFxuJykgaW5kZXgrKztcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBpZiAoY2hhcmFjdGVyID09PSAnJicgfHwgY2hhcmFjdGVyID09PSAnfCcgfHwgY2hhcmFjdGVyID09PSAnOycgfHwgY2hhcmFjdGVyID09PSAnXFxuJykge1xuICAgICAgZW5kU2VnbWVudCgpO1xuICAgICAgaWYgKChjaGFyYWN0ZXIgPT09ICcmJyB8fCBjaGFyYWN0ZXIgPT09ICd8JykgJiYgc2NyaXB0W2luZGV4ICsgMV0gPT09IGNoYXJhY3RlcikgaW5kZXgrKztcbiAgICAgIC8vIEEgbmV3bGluZSB0aGF0IGNsb3NlcyBhIGhlcmVkb2MgaGVhZGVyIGxpbmUgY29uc3VtZXMgdGhlIHF1ZXVlZCBib2RpZXMgYmVmb3JlIHRoZSBuZXh0XG4gICAgICAvLyBjb21tYW5kLlxuICAgICAgaWYgKGNoYXJhY3RlciA9PT0gJ1xcbicgJiYgcGVuZGluZ0hlcmVkb2NEZWxpbWl0ZXJzLmxlbmd0aCA+IDApIGluZGV4ID0gc2tpcEhlcmVkb2NCb2RpZXMoaW5kZXgpO1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGlmIChjaGFyYWN0ZXIgPT09ICcoJyB8fCBjaGFyYWN0ZXIgPT09ICcpJykge1xuICAgICAgZW5kVG9rZW4oKTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBpZiAoL1xccy91LnRlc3QoY2hhcmFjdGVyKSkge1xuICAgICAgZW5kVG9rZW4oKTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBjdXJyZW50ICs9IGNoYXJhY3RlcjtcbiAgICBpblRva2VuID0gdHJ1ZTtcbiAgfVxuICBlbmRTZWdtZW50KCk7XG4gIHJldHVybiB7IHNlZ21lbnRzLCBzYXdIZXJlZG9jIH07XG59XG5cbi8qKlxuICogV2hldGhlciBhIGRlcGxveSBzY3JpcHQgaW52b2tlcyBgd2Ig4oCmIGRlcGxveWAgYXQgY29tbWFuZCBwb3NpdGlvbi4gRW52IGFzc2lnbm1lbnRzLCBwYWNrYWdlXG4gKiBydW5uZXJzLCBhbmQgZ2xvYmFsIHlhcmdzIG9wdGlvbnMgKHdpdGggdGhlaXIgdmFsdWUgdG9rZW5zKSBtYXkgcHJlY2VkZSB0aGUgZGVwbG95IGNvbW1hbmQ7XG4gKiBzaGVsbCBxdW90aW5nLCBlc2NhcGluZywgY29tbWVudHMsIGFuZCBncm91cGluZyBhcmUgaG9ub3JlZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGludm9rZXNXYkRlcGxveShkZXBsb3lTY3JpcHQ6IHN0cmluZywgc2NyaXB0TmFtZXM6IFJlYWRvbmx5U2V0PHN0cmluZz4pOiBib29sZWFuIHtcbiAgY29uc3QgeyBzZWdtZW50cywgc2F3SGVyZWRvYyB9ID0gdG9rZW5pemVTaGVsbENvbW1hbmQoZGVwbG95U2NyaXB0KTtcbiAgLy8gQSBoZXJlZG9jIG1ha2VzIGJvZHktdnMtY29tbWFuZCBjbGFzc2lmaWNhdGlvbiB1bnJlbGlhYmxlIChzZWUgdG9rZW5pemVTaGVsbENvbW1hbmQpLlxuICBpZiAoc2F3SGVyZWRvYykgcmV0dXJuIGZhbHNlO1xuICBmb3IgKGNvbnN0IHRva2VucyBvZiBzZWdtZW50cykge1xuICAgIGxldCBpbmRleCA9IDA7XG4gICAgd2hpbGUgKGluZGV4IDwgdG9rZW5zLmxlbmd0aCAmJiAvXltBLVphLXpfXVtBLVphLXowLTlfXSo9L3UudGVzdCh0b2tlbnNbaW5kZXhdID8/ICcnKSkgaW5kZXgrKztcbiAgICAvLyBMZWFkaW5nIGxhdW5jaGVycyBydW4gdGhlIGZvbGxvd2luZyBjb21tYW5kOiBgZW52YCAod2l0aCBvcHRpb25zICsgS0VZPXZhbHVlIGFzc2lnbm1lbnRzKVxuICAgIC8vIGFuZCB0aGUgUE9TSVggYGNvbW1hbmRgIGJ1aWx0aW4gKHdpdGggaXRzIGAtcGAvYC12YC9gLVZgIG9wdGlvbnMpLiBDb21tYW5kLXBvc2l0aW9uIHNoZWxsXG4gICAgLy8gcmVzZXJ2ZWQgd29yZHMgYW5kIG90aGVyIGxhdW5jaGVycyAoYGlmYC9gdGhlbmAvYGZvcmAvYHRpbWVgL2BleGVjYC9gIWAvYnJhY2UgZ3JvdXBzLCDigKYpIGFyZVxuICAgIC8vIE5PVCBtb2RlbGVkOiB0aGV5IGxlYXZlIGEgbm9uLWB3YmAgZmlyc3QgdG9rZW4sIHNvIHRoZSBzZWdtZW50IHNpbXBseSBkb2VzIG5vdCBtYXRjaC4gVGhpcyBpc1xuICAgIC8vIGEgZGVsaWJlcmF0ZSBmYWxzZS1uZWdhdGl2ZSBmb3IgZ2VuZXJhdGVkIGd1aWRhbmNlLlxuICAgIGlmICh0b2tlbnNbaW5kZXhdID09PSAnZW52Jykge1xuICAgICAgaW5kZXgrKztcbiAgICAgIHdoaWxlIChpbmRleCA8IHRva2Vucy5sZW5ndGgpIHtcbiAgICAgICAgY29uc3QgdG9rZW4gPSB0b2tlbnNbaW5kZXhdID8/ICcnO1xuICAgICAgICBpZiAoL15bQS1aYS16X11bQS1aYS16MC05X10qPS91LnRlc3QodG9rZW4pKSBpbmRleCsrO1xuICAgICAgICAvLyBlbnYncyBkaXJlY3RvcnkgdmFsdWUgbWF5IGJlIHNlcGFyYXRlIG9yIGF0dGFjaGVkIChgLUNkaXJgLCBgLS1jaGRpcj1kaXJgKS4gSXQgY2hhbmdlc1xuICAgICAgICAvLyB3aGVyZSB3YiBydW5zIGJ1dCBub3Qgd2hldGhlciB0aGUgY29tbWFuZCBpbnZva2VzIHdiIGRlcGxveS5cbiAgICAgICAgZWxzZSBpZiAodG9rZW4gPT09ICctQycgfHwgdG9rZW4gPT09ICctLWNoZGlyJykgaW5kZXggKz0gMjtcbiAgICAgICAgZWxzZSBpZiAodG9rZW4uc3RhcnRzV2l0aCgnLUMnKSB8fCB0b2tlbi5zdGFydHNXaXRoKCctLWNoZGlyPScpKSBpbmRleCsrO1xuICAgICAgICBlbHNlIGlmICh0b2tlbiA9PT0gJy11JykgaW5kZXggKz0gMjtcbiAgICAgICAgZWxzZSBpZiAodG9rZW4uc3RhcnRzV2l0aCgnLScpKSBpbmRleCsrO1xuICAgICAgICBlbHNlIGJyZWFrO1xuICAgICAgfVxuICAgIH1cbiAgICAvLyBgY29tbWFuZCBDTURgIGV4ZWN1dGVzIENNRCwgYnV0IGBjb21tYW5kIC12YC9gLVYgQ01EYCBvbmx5IFFVRVJZIGl0cyBhdmFpbGFiaWxpdHkgd2l0aG91dFxuICAgIC8vIHJ1bm5pbmcgaXQsIHNvIGEgZGVwbG95IGJlaGluZCB0aGVtIGRvZXMgbm90IHJ1bi4gVGhlIGB2YC9gVmAgZmxhZyBtYXkgYmUgY2x1c3RlcmVkIHdpdGhcbiAgICAvLyBvdGhlciBvcHRpb24gbGV0dGVycyAoYGNvbW1hbmQgLXB2IHdiYCksIHNvIG1hdGNoIGFueSBvcHRpb24gbGV0dGVyIGNsdXN0ZXIgY29udGFpbmluZyBpdC5cbiAgICB3aGlsZSAodG9rZW5zW2luZGV4XSA9PT0gJ2NvbW1hbmQnKSB7XG4gICAgICBpbmRleCsrO1xuICAgICAgbGV0IHF1ZXJpZXNPbmx5ID0gZmFsc2U7XG4gICAgICB3aGlsZSAoaW5kZXggPCB0b2tlbnMubGVuZ3RoICYmICh0b2tlbnNbaW5kZXhdID8/ICcnKS5zdGFydHNXaXRoKCctJykpIHtcbiAgICAgICAgaWYgKC9eLVtBLVphLXpdKlt2Vl1bQS1aYS16XSokL3UudGVzdCh0b2tlbnNbaW5kZXhdID8/ICcnKSkgcXVlcmllc09ubHkgPSB0cnVlO1xuICAgICAgICBpbmRleCsrO1xuICAgICAgfVxuICAgICAgaWYgKHF1ZXJpZXNPbmx5KSB7XG4gICAgICAgIGluZGV4ID0gLTE7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoaW5kZXggPCAwKSBjb250aW51ZTtcbiAgICAvLyBSZXNvbHZlIGEgcnVubmVyIHByZWZpeCB0byB3aGV0aGVyIHRoZSBmb2xsb3dpbmcgdG9rZW4gaXMgYSBCSU5BUlkgKHRoZSB3YiBleGVjdXRhYmxlKSBvciBhXG4gICAgLy8gcGFja2FnZSBTQ1JJUFQgbmFtZS4gYGJ1bnhgL2BucHhgIGFuZCBgPHBtPiB4fGRseHxleGVjYCBydW4gYSBiaW5hcnk7IGA8cG0+IHJ1bnxydW4tc2NyaXB0YFxuICAgIC8vIChhbmQgYmFyZSBgbnBtIDxuYW1lPmAsIG9yIGFueSBydW5uZXIgZm9sbG93ZWQgYnkgYC0tYCkgcnVuIGEgcGFja2FnZSBzY3JpcHQg4oCUIHNvXG4gICAgLy8gYG5wbSBydW4gd2IgZGVwbG95YCBleGVjdXRlcyB0aGUgc2NyaXB0IG5hbWVkIGB3YmAsIG5vdCB0aGUgd2IgYmluYXJ5LCBhbmQgbXVzdCBiZSByZWplY3RlZC5cbiAgICBpZiAoWyducG0nLCAncG5wbScsICd5YXJuJywgJ2J1biddLmluY2x1ZGVzKHRva2Vuc1tpbmRleF0gPz8gJycpKSB7XG4gICAgICBjb25zdCBydW5uZXIgPSB0b2tlbnNbaW5kZXhdID8/ICcnO1xuICAgICAgaW5kZXggPSBza2lwUnVubmVyT3B0aW9ucyh0b2tlbnMsIGluZGV4ICsgMSk7XG4gICAgICBjb25zdCBzdWJjb21tYW5kID0gdG9rZW5zW2luZGV4XSA/PyAnJztcbiAgICAgIGlmIChbJ3J1bicsICdydW4tc2NyaXB0J10uaW5jbHVkZXMoc3ViY29tbWFuZCkpIGNvbnRpbnVlOyAvLyBydW5zIGEgcGFja2FnZSBzY3JpcHQsIG5vdCB3YlxuICAgICAgLy8gRXhlY3V0b3Igc3ViY29tbWFuZHMgYXJlIHJ1bm5lci1TUEVDSUZJQzogYnVuIHJlc2VydmVzIG9ubHkgYHhgIChgYnVuIGRseGAvYGJ1biBleGVjYCBydW4gYVxuICAgICAgLy8gcGFja2FnZSBzY3JpcHQgbmFtZWQgZGx4L2V4ZWMpLiBSZWFsIGJ1aWx0LWluIGV4ZWN1dG9ycyAoYGV4ZWNgL2B4YCwgYW5kIGBkbHhgIGZvciBwbnBtKVxuICAgICAgLy8gdGFrZSBwcmVjZWRlbmNlIG92ZXIgYSBzYW1lLW5hbWVkIHNjcmlwdCwgc28gdGhleSBhcmUgTk9UIHNoYWRvdy1jaGVja2VkLiBPbmx5IGB5YXJuIGRseGAgaXNcbiAgICAgIC8vIGFtYmlndW91cyDigJQgYSBCZXJyeSBidWlsdC1pbiBidXQgYSBwYWNrYWdlIFNDUklQVCBpbiBZYXJuIENsYXNzaWMg4oCUIHNvIGEgZGVjbGFyZWQgYGRseGBcbiAgICAgIC8vIHNjcmlwdCBtYWtlcyBgeWFybiBkbHhgIGRlY2xpbmUgKGZhbGwgdGhyb3VnaCB0byB0aGUgcGFja2FnZS1zY3JpcHQgY2hlY2tzKS5cbiAgICAgIGNvbnN0IGlzWWFybkRseFNoYWRvd2VkQnlTY3JpcHQgPSBydW5uZXIgPT09ICd5YXJuJyAmJiBzdWJjb21tYW5kID09PSAnZGx4JyAmJiBzY3JpcHROYW1lcy5oYXMoJ2RseCcpO1xuICAgICAgaWYgKHJ1bm5lckV4ZWN1dG9yU3ViY29tbWFuZHNCeVJ1bm5lcltydW5uZXJdPy5oYXMoc3ViY29tbWFuZCkgJiYgIWlzWWFybkRseFNoYWRvd2VkQnlTY3JpcHQpIHtcbiAgICAgICAgaW5kZXgrKzsgLy8gYmluYXJ5IHJ1bm5lciAocG5wbSBkbHgsIGJ1biB4LCBgbnBtIGV4ZWMgLS0gd2Ig4oCmYClcbiAgICAgICAgaWYgKHRva2Vuc1tpbmRleF0gPT09ICctLScpIGluZGV4Kys7IC8vIHRoZSBleGVjdXRvcidzIG9wdGlvbmFsIGAtLWAgYmVmb3JlIHRoZSBjb21tYW5kXG4gICAgICB9IGVsc2UgaWYgKHJ1bm5lciA9PT0gJ25wbScpIHtcbiAgICAgICAgY29udGludWU7IC8vIGJhcmUgYG5wbSB3YmAgbmV2ZXIgcnVucyBhIGJpbmFyeVxuICAgICAgfSBlbHNlIGlmICh0b2tlbnNbaW5kZXhdID09PSAnd2InICYmIHNjcmlwdE5hbWVzLmhhcygnd2InKSkge1xuICAgICAgICAvLyBCYXJlIGBidW4vcG5wbS95YXJuIHdiYCBydW5zIGEgcGFja2FnZSBTQ1JJUFQgbmFtZWQgYHdiYCB3aGVuIG9uZSBleGlzdHMgKHBhc3NpbmcgYGRlcGxveWBcbiAgICAgICAgLy8gYXMgaXRzIGFyZ3VtZW50KSwgbm90IHRoZSB3YiBiaW5hcnkuXG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoWydidW54JywgJ25weCddLmluY2x1ZGVzKHRva2Vuc1tpbmRleF0gPz8gJycpKSB7XG4gICAgICBpbmRleCA9IHNraXBSdW5uZXJPcHRpb25zKHRva2VucywgaW5kZXggKyAxKTtcbiAgICB9XG4gICAgaWYgKHRva2Vuc1tpbmRleF0gIT09ICd3YicpIGNvbnRpbnVlO1xuICAgIGNvbnN0IHdiQXJncyA9IHRva2Vucy5zbGljZShpbmRleCArIDEpO1xuICAgIC8vIFNraXAgZ2xvYmFsIG9wdGlvbnMgKGFuZCBhbnkgdmFsdWUgdG9rZW4gYSB2YWx1ZS1iZWFyaW5nIG9wdGlvbiBjb25zdW1lcykgc28gdGhlIEZJUlNUXG4gICAgLy8gY29tbWFuZCB0b2tlbiBkZWNpZGVzOiBgd2IgLS1jYXNjYWRlLWVudiBwcm9kdWN0aW9uIGRlcGxveWAgYW5kIGB3YiAtdyBwYWNrYWdlcy9hcGkgZGVwbG95YFxuICAgIC8vIG1hdGNoLCB3aGlsZSBzdWJjb21tYW5kcyBvd25pbmcgdGhlaXIgb3duIGBkZXBsb3lgIChgd2IgcHJpc21hIGRlcGxveWAsIGB3YiByZXRyeSBkZXBsb3lgKVxuICAgIC8vIGRvIG5vdC4gYC0tb3B0PXZhbHVlYCBjYXJyaWVzIGl0cyB2YWx1ZSBpbmxpbmUsIHNvIG9ubHkgdGhlIHNwYWNlLXNlcGFyYXRlZCBmb3JtIHNraXBzIG9uZS5cbiAgICBsZXQgY29tbWFuZEluZGV4ID0gMDtcbiAgICB3aGlsZSAoY29tbWFuZEluZGV4IDwgd2JBcmdzLmxlbmd0aCAmJiAod2JBcmdzW2NvbW1hbmRJbmRleF0gPz8gJycpLnN0YXJ0c1dpdGgoJy0nKSkge1xuICAgICAgY29uc3QgZmxhZyA9IHdiQXJnc1tjb21tYW5kSW5kZXhdID8/ICcnO1xuICAgICAgY29tbWFuZEluZGV4Kys7XG4gICAgICBpZiAod2JHbG9iYWxWYWx1ZU9wdGlvbnMuaGFzKGZsYWcpICYmIGNvbW1hbmRJbmRleCA8IHdiQXJncy5sZW5ndGgpIGNvbW1hbmRJbmRleCsrO1xuICAgIH1cbiAgICBpZiAod2JBcmdzW2NvbW1hbmRJbmRleF0gIT09ICdkZXBsb3knKSBjb250aW51ZTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICByZXR1cm4gZmFsc2U7XG59XG5cbi8qKlxuICogV2hldGhlciB0aGUgd29ya2Zsb3dzIGRpcmVjdG9yeSBob2xkcyBhIGxpdmUgY2FsbGVyIG9mIHRoZSByZXVzYWJsZSBDbG91ZGZsYXJlIGRlcGxveSB3b3JrZmxvdy5cbiAqIFlBTUwgaXMgcGFyc2VkIGFuZCBvbmx5IGBqb2JzLioudXNlc2AgdmFsdWVzIGFyZSBpbnNwZWN0ZWQgKGEgcmF3LXRleHQgc2VhcmNoIHdvdWxkIG1hdGNoXG4gKiBjb21tZW50cyBvciBgcnVuOmAgc3RyaW5ncyksIHdpdGggYSBgZGVwbG95KmAtZmlsZW5hbWUgc2hvcnRjdXQgYW5kIGEgY29uc2VydmF0aXZlIHJhdy10ZXh0XG4gKiBmYWxsYmFjayBmb3IgdW5wYXJzZWFibGUgZmlsZXMuIFVzZWQgYnkgdGhlIGFnZW50LWluc3RydWN0aW9uIGdlbmVyYXRvciBzbyBnZW5lcmF0ZWQgZ3VpZGFuY2VcbiAqIGRlc2NyaWJlcyBvbmx5IHdvcmtmbG93cyB0aGF0IGV4aXN0LlxuICovXG5leHBvcnQgZnVuY3Rpb24gaGFzQ2xvdWRmbGFyZURlcGxveVdvcmtmbG93KHdvcmtmbG93c0RpclBhdGg6IHN0cmluZyk6IGJvb2xlYW4ge1xuICBsZXQgZW50cmllczogZnMuRGlyZW50W107XG4gIHRyeSB7XG4gICAgZW50cmllcyA9IGZzLnJlYWRkaXJTeW5jKHdvcmtmbG93c0RpclBhdGgsIHsgd2l0aEZpbGVUeXBlczogdHJ1ZSB9KTtcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIC8vIENhc2UtaW5zZW5zaXRpdmUgb3duZXIvcmVwb3NpdG9yeSAoR2l0SHViIHRyZWF0cyB0aGVtIHNvKSwgY2FzZS1zZW5zaXRpdmUgcGF0aC9yZWYg4oCUIG1hdGNoaW5nXG4gIC8vIHBhcnNlT3JnUmV1c2FibGVXb3JrZmxvd0NhbGwsIHVzZWQgZm9yIHRoZSB1bnBhcnNlYWJsZS1ZQU1MIHJhdy10ZXh0IGZhbGxiYWNrIG9ubHkuXG4gIGNvbnN0IGRlcGxveUNhbGxQYXR0ZXJuID0gL1teL10rXFwvcmV1c2FibGUtd29ya2Zsb3dzXFwvXFwuZ2l0aHViXFwvd29ya2Zsb3dzXFwvZGVwbG95XFwueWE/bWxAL2l1O1xuICBjb25zdCBjYWxsc0RlcGxveVdvcmtmbG93ID0gKHVzZXM6IHN0cmluZyB8IHVuZGVmaW5lZCk6IGJvb2xlYW4gPT5cbiAgICBwYXJzZU9yZ1JldXNhYmxlV29ya2Zsb3dDYWxsKHVzZXMpPy53b3JrZmxvd05hbWUgPT09ICdkZXBsb3knO1xuICByZXR1cm4gZW50cmllcy5zb21lKChlbnRyeSkgPT4ge1xuICAgIGlmICghZW50cnkuaXNGaWxlKCkgfHwgIS9cXC55YT9tbCQvdS50ZXN0KGVudHJ5Lm5hbWUpKSByZXR1cm4gZmFsc2U7XG4gICAgaWYgKGVudHJ5Lm5hbWUuc3RhcnRzV2l0aCgnZGVwbG95JykpIHJldHVybiB0cnVlO1xuICAgIGxldCBjb250ZW50OiBzdHJpbmc7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnRlbnQgPSBmcy5yZWFkRmlsZVN5bmMocGF0aC5qb2luKHdvcmtmbG93c0RpclBhdGgsIGVudHJ5Lm5hbWUpLCAndXRmOCcpO1xuICAgIH0gY2F0Y2gge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICB0cnkge1xuICAgICAgY29uc3Qgd29ya2Zsb3cgPSB5YW1sLmxvYWQoY29udGVudCkgYXMgV29ya2Zsb3cgfCB1bmRlZmluZWQ7XG4gICAgICBpZiAod29ya2Zsb3cgJiYgdHlwZW9mIHdvcmtmbG93ID09PSAnb2JqZWN0JyAmJiB3b3JrZmxvdy5qb2JzICYmIHR5cGVvZiB3b3JrZmxvdy5qb2JzID09PSAnb2JqZWN0Jykge1xuICAgICAgICByZXR1cm4gT2JqZWN0LnZhbHVlcyh3b3JrZmxvdy5qb2JzKS5zb21lKChqb2IpID0+IGNhbGxzRGVwbG95V29ya2Zsb3coam9iPy51c2VzKSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfSBjYXRjaCB7XG4gICAgICByZXR1cm4gZGVwbG95Q2FsbFBhdHRlcm4udGVzdChjb250ZW50KTtcbiAgICB9XG4gIH0pO1xufVxuXG4vLyBUaGUgcmV1c2FibGUgd29ya2Zsb3dzIHRoYXQgZGVjbGFyZSBGTk9YX0FHRV9LRVkgYW5kIFZFUkRBQ0NJT19UT0tFTiB1bmRlclxuLy8gb24ud29ya2Zsb3dfY2FsbC5zZWNyZXRzIChzZWUgV2lsbEJvb3N0ZXIvcmV1c2FibGUtd29ya2Zsb3dzKS4gUGFzc2luZyBlaXRoZXIgc2VjcmV0IHRvIGFueVxuLy8gb3RoZXIgY2FsbGVlIGlzIGEgR2l0SHViIGVycm9yLlxuY29uc3QgaW5zdGFsbENhcGFibGVSZXVzYWJsZVdvcmtmbG93cyA9IG5ldyBTZXQoWydkZXBsb3knLCAncmVsZWFzZScsICdydW4tc2NyaXB0JywgJ3Rlc3QnXSk7XG5jb25zdCByZXVzYWJsZVdvcmtmbG93UGVybWlzc2lvbnM6IFJlY29yZDxzdHJpbmcsIFJlY29yZDxzdHJpbmcsIHN0cmluZz4+ID0ge1xuICAvLyBza2lwLWR1cGxpY2F0ZS1hY3Rpb25zIHJlYWRzIHdvcmtmbG93IHJ1bnM7IGNhbmNlbF9vdGhlcnMgaXMgZmFsc2UsIHNvIHJlYWQgaXMgZW5vdWdoLlxuICAndGVzdC1ydXN0JzogeyBhY3Rpb25zOiAncmVhZCcsIGNvbnRlbnRzOiAncmVhZCcgfSxcbiAgJ3NlbWFudGljLXByJzogeyAncHVsbC1yZXF1ZXN0cyc6ICdyZWFkJywgc3RhdHVzZXM6ICd3cml0ZScgfSxcbiAgJ2Nsb3NlLWNvbW1lbnQnOiB7ICdwdWxsLXJlcXVlc3RzJzogJ3dyaXRlJyB9LFxufTtcblxuZnVuY3Rpb24gbm9ybWFsaXplSm9iKGNvbmZpZzogUGFja2FnZUNvbmZpZywgam9iOiBKb2IsIGtpbmQ6IEtub3duS2luZCk6IHZvaWQge1xuICBqb2Iud2l0aCA/Pz0ge307XG4gIC8vIGBzZWNyZXRzOiBpbmhlcml0YCAocGFyc2VkIGJ5IGpzLXlhbWwgYXMgYSBwbGFpbiBzdHJpbmcpIGFscmVhZHkgZm9yd2FyZHMgZXZlcnkgY2FsbGVyIHNlY3JldFxuICAvLyBpbmNsdWRpbmcgdGhlIG9uZXMgaW5qZWN0ZWQgYmVsb3csIHNvIHByZXNlcnZlIGl0IHVudG91Y2hlZCDigJQgcHJvcGVydHkgYXNzaWdubWVudHMgb24gdGhlXG4gIC8vIHN0cmluZyB3b3VsZCB0aHJvdy4gQ2F2ZWF0OiBgaW5oZXJpdGAgZm9yd2FyZHMgc2VjcmV0cyB1bmRlciB0aGVpciBleGlzdGluZyBOQU1FUywgc28gaXQgY2FuXG4gIC8vIG5ldmVyIGZlZWQgUFVCTElDX0ZOT1hfQUdFX0tFWSBpbnRvIHRoZSBjYWxsZWUncyBkZWNsYXJlZCBGTk9YX0FHRV9LRVk7IGEgaGFuZC13cml0dGVuXG4gIC8vIGluaGVyaXQgY2FsbGVyIGluIGEgUFVCTElDIGZub3ggcmVwb3NpdG9yeSBtdXN0IGJlIGNvbnZlcnRlZCB0byBhbiBleHBsaWNpdCBtYXBwaW5nIG1hbnVhbGx5XG4gIC8vICh3YmZ5IG5ldmVyIGdlbmVyYXRlcyB0aGUgaW5oZXJpdCBmb3JtLCBhbmQgaGFuZC13cml0dGVuIGRldmlhdGlvbnMgYXJlIGZpeGVkIGluIHRoZSB0YXJnZXRcbiAgLy8gcmVwb3NpdG9yeSBieSBwb2xpY3kpLlxuICBjb25zdCBzZWNyZXRzID0gam9iLnNlY3JldHMgPT09ICdpbmhlcml0JyA/IHVuZGVmaW5lZCA6IChqb2Iuc2VjcmV0cyA9IGpvYi5zZWNyZXRzID8/IHt9KTtcblxuICBpZiAoc2VjcmV0cyAmJiAoa2luZCA9PT0gJ3Rlc3QnIHx8IGtpbmQgPT09ICdyZWxlYXNlJykpIHtcbiAgICBzZWNyZXRzLkdIX1RPS0VOID0gJyR7eyBzZWNyZXRzLkdJVEhVQl9UT0tFTiB9fSc7XG4gIH1cblxuICAvLyBmbm94LnRvbWwgY2FycmllcyBhZ2UtZW5jcnlwdGVkIGFwcCBzZWNyZXRzOyBDSSBkZWNyeXB0cyB0aGVtIHdpdGggdGhlIEZOT1hfQUdFX0tFWSAob3IsIGZvclxuICAvLyBwdWJsaWMgcmVwb3NpdG9yaWVzLCBQVUJMSUNfRk5PWF9BR0VfS0VZKSBvcmdhbml6YXRpb24gc2VjcmV0LlxuICAvLyBLZXkgdGhlIGluamVjdGlvbiBvbiB0aGUgKmNhbGxlZCogcmV1c2FibGUgd29ya2Zsb3csIG5vdCB0aGUgY2FsbGVyJ3MgZmlsZW5hbWU6IGNhbGxlcnMgbWF5IGhhdmVcbiAgLy8gYXJiaXRyYXJ5IG5hbWVzIChlLmcuIHNjaGVkdWxlZCBydW4tc2NyaXB0IGNhbGxlcnMpLCBhbmQgR2l0SHViIHJlamVjdHMgcGFzc2luZyBhIHNlY3JldCB0aGF0IHRoZVxuICAvLyBjYWxsZWUgZG9lcyBub3QgZGVjbGFyZS5cbiAgLy8gT25seSBhbiBAbWFpbiBjYWxsZWUgaXMga25vd24gdG8gZm9sbG93IHRoZSBjdXJyZW50IHNlY3JldCBjb250cmFjdDogYSB3b3JrZmxvdyBwaW5uZWQgdG8gYW5cbiAgLy8gb2xkZXIgdGFnIG9yIFNIQSBtYXkgc3RpbGwgZGVjbGFyZSBOUE1fVE9LRU4gKGFuZCBub3QgVkVSREFDQ0lPX1RPS0VOKSwgYW5kIEdpdEh1YiByZWplY3RzIGFcbiAgLy8gY2FsbGVyIHdob3NlIHNlY3JldHMgZG8gbm90IG1hdGNoIHRoZSBzZWxlY3RlZCByZXZpc2lvbidzIGRlY2xhcmF0aW9ucywgc28gcGlubmVkIGNhbGxlcnMga2VlcFxuICAvLyB0aGVpciBzZWNyZXRzIHVudG91Y2hlZC5cbiAgY29uc3Qgb3JnV29ya2Zsb3dDYWxsID0gcGFyc2VPcmdSZXVzYWJsZVdvcmtmbG93Q2FsbChqb2IudXNlcyk7XG4gIGNvbnN0IGNhbGxlZFJldXNhYmxlV29ya2Zsb3cgPSBvcmdXb3JrZmxvd0NhbGw/LnJlZiA9PT0gJ21haW4nID8gb3JnV29ya2Zsb3dDYWxsLndvcmtmbG93TmFtZSA6IHVuZGVmaW5lZDtcbiAgY29uc3QgcmVxdWlyZWRQZXJtaXNzaW9ucyA9IGNhbGxlZFJldXNhYmxlV29ya2Zsb3cgPyByZXVzYWJsZVdvcmtmbG93UGVybWlzc2lvbnNbY2FsbGVkUmV1c2FibGVXb3JrZmxvd10gOiB1bmRlZmluZWQ7XG4gIGlmIChyZXF1aXJlZFBlcm1pc3Npb25zKSBqb2IucGVybWlzc2lvbnMgPSB7IC4uLnJlcXVpcmVkUGVybWlzc2lvbnMgfTtcbiAgaWYgKHNlY3JldHMgJiYgY2FsbGVkUmV1c2FibGVXb3JrZmxvdyAmJiBpbnN0YWxsQ2FwYWJsZVJldXNhYmxlV29ya2Zsb3dzLmhhcyhjYWxsZWRSZXVzYWJsZVdvcmtmbG93KSkge1xuICAgIC8vIFRoZSBjYWxsZWUgcm91dGVzIHB1YmxpYyAoZGVmYXVsdC1yZWdpc3RyeSkgaW5zdGFsbHMgdGhyb3VnaCB0aGUgVGFrdW1pIEd1YXJkXG4gICAgLy8gbWFsaWNpb3VzLXBhY2thZ2UtYmxvY2tpbmcgcHJveHkgd2hlbiB0aGlzIHRva2VuIHJlc29sdmVzOyBhbiB1bnNldCBvcmdhbml6YXRpb24gc2VjcmV0XG4gICAgLy8gZXhwYW5kcyB0byAnJyBhbmQgdGhlIGNhbGxlZSB0cmVhdHMgdGhhdCBhcyBcImZlYXR1cmUgb2ZmXCIsIHNvIHBhc3NpbmcgaXQgaXMgYWx3YXlzIHNhZmUuXG4gICAgc2VjcmV0cy5UQUtVTUlfR1VBUkRfVE9LRU4gPSAnJHt7IHNlY3JldHMuVEFLVU1JX0dVQVJEX1RPS0VOIH19JztcbiAgICAvLyBUaGUgY2FsbGVlIGdlbmVyYXRlcyB0aGUgd29ya3NwYWNlIC5ucG1yYyBmb3IgQHdpbGxib29zdGVyLXByaXZhdGUvKiBmcm9tIFZFUkRBQ0NJT19UT0tFTlxuICAgIC8vIGJlZm9yZSBpbnN0YWxsaW5nIGRlcGVuZGVuY2llcy4gT25seSByZXBvc2l0b3JpZXMgdGhhdCBhY3R1YWxseSByZXNvbHZlIHByaXZhdGUgcGFja2FnZXNcbiAgICAvLyAob3IgcHVibGlzaCB0byBWZXJkYWNjaW8pIGdldCB0aGUgcGFzcy10aHJvdWdoOiBldmVyeXdoZXJlIGVsc2UgdGhlIGNyZWRlbnRpYWwgd291bGQgZmxvd1xuICAgIC8vIGludG8gQ0kgcnVucyB0aGF0IG5ldmVyIHVzZSBpdCwgc28gdGhlIGxpbmUgaXMgcmVtb3ZlZCBpbnN0ZWFkLiBUaGUgR2l0SHViIHNlY3JldCBpdHNlbGYgaXNcbiAgICAvLyBhbHdheXMgcmVnaXN0ZXJlZCBtYW51YWxseSBhbmQgc3RheXMgcmVnaXN0ZXJlZCBlaXRoZXIgd2F5LlxuICAgIGlmIChyZXBvUmVzb2x2ZXNQcml2YXRlUGFja2FnZXMoY29uZmlnKSkge1xuICAgICAgc2VjcmV0cy5WRVJEQUNDSU9fVE9LRU4gPSAnJHt7IHNlY3JldHMuVkVSREFDQ0lPX1RPS0VOIH19JztcbiAgICB9IGVsc2Uge1xuICAgICAgZGVsZXRlIHNlY3JldHMuVkVSREFDQ0lPX1RPS0VOO1xuICAgIH1cbiAgICBpZiAoZnMuZXhpc3RzU3luYyhwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICdmbm94LnRvbWwnKSkpIHtcbiAgICAgIC8vIFB1YmxpYyByZXBvc2l0b3JpZXMgY29tbWl0IHdvcmxkLXJlYWRhYmxlIGNpcGhlcnRleHRzLCBzbyB0aGV5IGRlY3J5cHQgd2l0aCBhIGRlZGljYXRlZFxuICAgICAgLy8gQ0kgaWRlbnRpdHkgKHRoZSBQVUJMSUNfRk5PWF9BR0VfS0VZIG9yZ2FuaXphdGlvbiBzZWNyZXQpIGluc3RlYWQgb2YgdGhlIG9yZy1pbnRlcm5hbFxuICAgICAgLy8gb25lOyB0aGUgY2FsbGVlIHN0aWxsIHJlY2VpdmVzIGl0IHVuZGVyIGl0cyBkZWNsYXJlZCBGTk9YX0FHRV9LRVkgbmFtZS4gV2hlbiBubyBDSVxuICAgICAgLy8gaWRlbnRpdHkgcmVzb2x2ZXMgKHNlZSBmbm94QWdlS2V5TWFwcGluZyksIGxlYXZlIGFueSBleGlzdGluZyBtYXBwaW5nIHVudG91Y2hlZCBhbmQgYWRkXG4gICAgICAvLyBub25lOiBjcmVhdGluZyBvciByZXdyaXRpbmcgb25lIG9uIGluY29tcGxldGUgaW5mb3JtYXRpb24gd291bGQgbWFwIGEgcG9zc2libHktcHVibGljXG4gICAgICAvLyByZXBvc2l0b3J5IHRvIHRoZSB3cm9uZyBpZGVudGl0eSwgYW5kIGEgZm5veCByZWNpcGllbnQgc3luYyBmYWlsdXJlIGRvZXMgbm90IHN0b3AgdGhpc1xuICAgICAgLy8gZ2VuZXJhdG9yIGZyb20gd3JpdGluZyBmaWxlcyDigJQgdGhlIGZhaWxlZCBydW4ncyByZXJ1biBmaWxscyB0aGUgbWFwcGluZyBpbi5cbiAgICAgIGNvbnN0IG1hcHBpbmcgPSBmbm94QWdlS2V5TWFwcGluZyhjb25maWcpO1xuICAgICAgaWYgKG1hcHBpbmcpIHtcbiAgICAgICAgc2VjcmV0cy5GTk9YX0FHRV9LRVkgPSBtYXBwaW5nO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICBpZiAoa2luZCA9PT0gJ3Rlc3QtcnVzdCcpIHtcbiAgICBjb25zdCBbcnVzdERpclBhdGhdID0gY29uZmlnLmNhcmdvVG9tbERpclBhdGhzO1xuICAgIGlmIChydXN0RGlyUGF0aCAmJiBydXN0RGlyUGF0aCAhPT0gJy4nKSB7XG4gICAgICBqb2Iud2l0aC53b3JraW5nX2RpcmVjdG9yeSA9IHJ1c3REaXJQYXRoO1xuICAgIH0gZWxzZSB7XG4gICAgICBkZWxldGUgam9iLndpdGgud29ya2luZ19kaXJlY3Rvcnk7XG4gICAgfVxuICB9XG5cbiAgLy8gUmVjb25zdHJ1Y3QgZnJvbSB0aGUgcGFyc2VkIGNhbGwgc28gYSBkaWZmZXJlbnRseSBjYXNlZCBvd25lciAoR2l0SHViIGlzIGNhc2UtaW5zZW5zaXRpdmVcbiAgLy8gdGhlcmUpIGlzIGFsc28gbm9ybWFsaXplZCB0byB0aGUgcmVwb3NpdG9yeSdzIG93biBvcmdhbml6YXRpb24gLyBtaXJyb3IuXG4gIGlmIChvcmdXb3JrZmxvd0NhbGwgJiYgY29uZmlnLnJlcG9zaXRvcnk/LnN0YXJ0c1dpdGgoJ2dpdGh1YjpXaWxsQm9vc3Rlci8nKSkge1xuICAgIGpvYi51c2VzID0gYFdpbGxCb29zdGVyL3JldXNhYmxlLXdvcmtmbG93cy8uZ2l0aHViL3dvcmtmbG93cy8ke29yZ1dvcmtmbG93Q2FsbC53b3JrZmxvd05hbWV9LiR7b3JnV29ya2Zsb3dDYWxsLmV4dGVuc2lvbn1AJHtvcmdXb3JrZmxvd0NhbGwucmVmfWA7XG4gIH0gZWxzZSBpZiAob3JnV29ya2Zsb3dDYWxsICYmIGNvbmZpZy5yZXBvc2l0b3J5Py5zdGFydHNXaXRoKCdnaXRodWI6V2lsbEJvb3N0ZXJMYWIvJykpIHtcbiAgICBqb2IudXNlcyA9IGBXaWxsQm9vc3RlckxhYi9yZXVzYWJsZS13b3JrZmxvd3MvLmdpdGh1Yi93b3JrZmxvd3MvJHtvcmdXb3JrZmxvd0NhbGwud29ya2Zsb3dOYW1lfS4ke29yZ1dvcmtmbG93Q2FsbC5leHRlbnNpb259QCR7b3JnV29ya2Zsb3dDYWxsLnJlZn1gO1xuICB9XG5cbiAgaWYgKGNvbmZpZy5kb2VzQ29udGFpbkRvY2tlcmZpbGUgJiYgIWpvYi53aXRoLmNpX2xhYmVsICYmIGtpbmQuc3RhcnRzV2l0aCgndGVzdCcpKSB7XG4gICAgam9iLndpdGguY2lfbGFiZWwgPSAnbGFyZ2UnO1xuICB9XG4gIGNvbnN0IGFjY2VwdHNSdW5uZXJJbnB1dCA9IFsndGVzdCcsICd0ZXN0LXJ1c3QnLCAnZGVwbG95JywgJ3JlbGVhc2UnLCAncnVuLXNjcmlwdCddLmluY2x1ZGVzKFxuICAgIG9yZ1dvcmtmbG93Q2FsbD8ud29ya2Zsb3dOYW1lID8/ICcnXG4gICk7XG4gIGlmIChjb25maWcuaXNSZXBvVmlzaWJpbGl0eUtub3duKSB7XG4gICAgaWYgKGNvbmZpZy5pc1B1YmxpY1JlcG8gJiYgYWNjZXB0c1J1bm5lcklucHV0KSB7XG4gICAgICBqb2Iud2l0aC5naXRodWJfaG9zdGVkX3J1bm5lciA9IHRydWU7XG4gICAgfSBlbHNlIHtcbiAgICAgIGRlbGV0ZSBqb2Iud2l0aC5naXRodWJfaG9zdGVkX3J1bm5lcjtcbiAgICB9XG4gICAgaWYgKCFjb25maWcuaXNQdWJsaWNSZXBvICYmIGpvYi53aXRoLnJ1bnNfb24gIT09IHVuZGVmaW5lZCkge1xuICAgICAgY29uc3QgbGFiZWxzID0gelxuICAgICAgICAuc3RyaW5nKClcbiAgICAgICAgLnRyYW5zZm9ybSgodmFsdWUsIGN0eCkgPT4ge1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICByZXR1cm4gSlNPTi5wYXJzZSh2YWx1ZSkgYXMgdW5rbm93bjtcbiAgICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICAgIGN0eC5hZGRJc3N1ZSh7IGNvZGU6ICdjdXN0b20nLCBtZXNzYWdlOiAnRXhwZWN0ZWQgSlNPTiBydW5uZXIgbGFiZWxzJyB9KTtcbiAgICAgICAgICAgIHJldHVybiB6Lk5FVkVSO1xuICAgICAgICAgIH1cbiAgICAgICAgfSlcbiAgICAgICAgLnBpcGUoei5hcnJheSh6LnN0cmluZygpKSlcbiAgICAgICAgLnNhZmVQYXJzZShqb2Iud2l0aC5ydW5zX29uKTtcbiAgICAgIGlmIChsYWJlbHMuc3VjY2VzcyAmJiBsYWJlbHMuZGF0YS5pbmNsdWRlcygnc2VsZi1ob3N0ZWQnKSkge1xuICAgICAgICBqb2Iud2l0aC5ydW5zX29uID0gSlNPTi5zdHJpbmdpZnkobGFiZWxzLmRhdGEpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc29sZS53YXJuKGBSZW1vdmVkIHJ1bnNfb24gZnJvbSAke2pvYi51c2VzfTogcHJpdmF0ZSByZXBvc2l0b3JpZXMgcmVxdWlyZSBhIHNlbGYtaG9zdGVkIGxhYmVsIGFycmF5LmApO1xuICAgICAgICBkZWxldGUgam9iLndpdGgucnVuc19vbjtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBpZiAoT2JqZWN0LmtleXMoam9iLndpdGgpLmxlbmd0aCA+IDApIHtcbiAgICBzb3J0S2V5cyhqb2Iud2l0aCk7XG4gIH0gZWxzZSB7XG4gICAgZGVsZXRlIGpvYi53aXRoO1xuICB9XG4gIGlmIChzZWNyZXRzKSB7XG4gICAgaWYgKE9iamVjdC5rZXlzKHNlY3JldHMpLmxlbmd0aCA+IDApIHtcbiAgICAgIGNvbnN0IG5ld1NlY3JldHMgPSBzb3J0S2V5cyhzZWNyZXRzKTtcbiAgICAgIGRlbGV0ZSBqb2Iuc2VjcmV0cztcbiAgICAgIGpvYi5zZWNyZXRzID0gbmV3U2VjcmV0cztcbiAgICB9IGVsc2Uge1xuICAgICAgZGVsZXRlIGpvYi5zZWNyZXRzO1xuICAgIH1cbiAgfVxufVxuXG4vKipcbiAqIFRoZSBzZWNyZXQgZXhwcmVzc2lvbiB0aGUgY2FsbGVyIG1hcHMgaW50byB0aGUgY2FsbGVlJ3MgZGVjbGFyZWQgRk5PWF9BR0VfS0VZLCBvciB1bmRlZmluZWRcbiAqIHdoZW4gdGhlIHJlcG9zaXRvcnkgc3RhdGUgZG9lcyBub3QgaWRlbnRpZnkgYSB1c2FibGUgQ0kgaWRlbnRpdHkg4oCUIGFuIHVua25vd24gdmlzaWJpbGl0eSwgYVxuICogcmVwb3NpdG9yeSBubyBDSSBzY29wZSBjb3ZlcnMgKGRlcml2aW5nIGZyb20gdGhlIHNhbWUgcHJpbmNpcGFsIHJvc3RlciBhcyB0aGUgcmVjaXBpZW50IHN5bmNcbiAqIGtlZXBzIHRoZSB0d28gZnJvbSBldmVyIGRpc2FncmVlaW5nKSwgb3IgYSBmYWlsZWQgZm5veCByZWNpcGllbnQgc3luYywgd2hvc2UgY2lwaGVydGV4dHMgbWF5XG4gKiBzdGlsbCB0YXJnZXQgdGhlIHByZXZpb3VzIGlkZW50aXR5LiBUaGUgY2FsbGVyIG11c3QgdGhlbiBwcmVzZXJ2ZSBhbnkgZXhpc3RpbmcgbWFwcGluZy5cbiAqL1xuZnVuY3Rpb24gZm5veEFnZUtleU1hcHBpbmcoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgaWYgKCFjb25maWcuaXNSZXBvVmlzaWJpbGl0eUtub3duIHx8IGhhc0Zub3hTeW5jRmFpbGVkKCkpIHJldHVybiB1bmRlZmluZWQ7XG4gIGNvbnN0IHNlY3JldE5hbWUgPSByZXNvbHZlRm5veENpQWdlS2V5U2VjcmV0TmFtZShjb25maWcpO1xuICByZXR1cm4gc2VjcmV0TmFtZSAmJiBgXFwke3sgc2VjcmV0cy4ke3NlY3JldE5hbWV9IH19YDtcbn1cblxuYXN5bmMgZnVuY3Rpb24gd3JpdGVZYW1sKG5ld1NldHRpbmdzOiBXb3JrZmxvdywgZmlsZVBhdGg6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAvLyBBIHBlcm1pc3Npb25zIG9iamVjdCBlbXB0aWVkIGJ5IHRoZSBwZXIta2luZCBkZWxldGlvbnMgKGUuZy4gYW4gZXhpc3RpbmcgdGVzdC1ydXN0IGNhbGxlclxuICAvLyB3aG9zZSBvbmx5IGVudHJ5IHdhcyBgYWN0aW9uc2ApIG11c3QgYmUgZHJvcHBlZCBlbnRpcmVseTogYHBlcm1pc3Npb25zOiB7fWAgc3RyaXBzIEVWRVJZXG4gIC8vIHRva2VuIHBlcm1pc3Npb24gZnJvbSB0aGUgd29ya2Zsb3csIHVubGlrZSB0aGUgYWJzZW50IGtleSB3aGljaCBrZWVwcyB0aGUgZGVmYXVsdHMuXG4gIGlmIChuZXdTZXR0aW5ncy5wZXJtaXNzaW9ucyAmJiBPYmplY3Qua2V5cyhuZXdTZXR0aW5ncy5wZXJtaXNzaW9ucykubGVuZ3RoID09PSAwKSB7XG4gICAgZGVsZXRlIG5ld1NldHRpbmdzLnBlcm1pc3Npb25zO1xuICB9XG4gIGNvbnN0IHlhbWxUZXh0ID0geWFtbC5kdW1wKG5ld1NldHRpbmdzLCB7IGxpbmVXaWR0aDogLTEgfSk7XG4gIGF3YWl0IGZzVXRpbC53cml0ZUZpbGVDb25maW5lZChmaWxlUGF0aCwgeWFtbFRleHQpO1xufVxuIiwiaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHsgZ2xvYklnbm9yZSB9IGZyb20gJ0B3aWxsYm9vc3Rlci9zaGFyZWQtbGliLW5vZGUvc3JjJztcbmltcG9ydCBmZyBmcm9tICdmYXN0LWdsb2InO1xuXG5pbXBvcnQgeyBpc1JldXNhYmxlV29ya2Zsb3dzUmVwbyB9IGZyb20gJy4uL2dlbmVyYXRvcnMvd29ya2Zsb3cuanMnO1xuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB7IG9wdGlvbnMgfSBmcm9tICcuLi9vcHRpb25zLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZnNVdGlsIH0gZnJvbSAnLi4vdXRpbHMvZnNVdGlsLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuaW1wb3J0IHsgZ2V0V29ya3NwYWNlRGlyUGF0dGVybnMgfSBmcm9tICcuLi91dGlscy93b3Jrc3BhY2VVdGlsLmpzJztcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGZpeFR5cG9zKHBhY2thZ2VDb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdmaXhUeXBvcycsIGFzeW5jICgpID0+IHtcbiAgICBpZiAoaXNSZXVzYWJsZVdvcmtmbG93c1JlcG8ocGFja2FnZUNvbmZpZy5yZXBvc2l0b3J5KSkgcmV0dXJuO1xuXG4gICAgY29uc3QgZGlyUGF0aCA9IHBhY2thZ2VDb25maWcuZGlyUGF0aDtcbiAgICBjb25zdCBkb2NGaWxlcyA9IGF3YWl0IGZnLmdsb2IoJyoqLyoubWQnLCB7IGRvdDogdHJ1ZSwgY3dkOiBkaXJQYXRoLCBpZ25vcmU6IGdsb2JJZ25vcmUgfSk7XG4gICAgaWYgKG9wdGlvbnMuaXNWZXJib3NlKSB7XG4gICAgICBjb25zb2xlLmluZm8oYEZvdW5kICR7ZG9jRmlsZXMubGVuZ3RofSBtYXJrZG93biBmaWxlcyBpbiAke2RpclBhdGh9YCk7XG4gICAgfVxuICAgIGZvciAoY29uc3QgbWRGaWxlIG9mIGRvY0ZpbGVzKSB7XG4gICAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGguam9pbihkaXJQYXRoLCBtZEZpbGUpO1xuICAgICAgdm9pZCBwcm9taXNlUG9vbC5ydW4oYXN5bmMgKCkgPT4ge1xuICAgICAgICBjb25zdCBjb250ZW50ID0gYXdhaXQgZnNVdGlsLnJlYWRGaWxlSWZFeGlzdHMoZmlsZVBhdGgpO1xuICAgICAgICBpZiAoY29udGVudCA9PT0gdW5kZWZpbmVkKSByZXR1cm47XG4gICAgICAgIGxldCBuZXdDb250ZW50ID0gZml4VHlwb3NJblRleHQoY29udGVudCk7XG4gICAgICAgIG5ld0NvbnRlbnQgPSByZXBsYWNlV2l0aENvbmZpZyhuZXdDb250ZW50LCBwYWNrYWdlQ29uZmlnLCAnZG9jJyk7XG4gICAgICAgIGlmIChjb250ZW50ICE9PSBuZXdDb250ZW50KSB7XG4gICAgICAgICAgYXdhaXQgZnNVdGlsLmdlbmVyYXRlRmlsZShmaWxlUGF0aCwgbmV3Q29udGVudCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cblxuICAgIC8vIGZpeFR5cG9zIHJ1bnMgb25jZSBvbiB0aGUgcm9vdCBjb25maWcsIHNvIHRoaXMgZ2xvYiBzZXQgbXVzdCBjb3ZlciBldmVyeSBkZWNsYXJlZCB3b3Jrc3BhY2VcbiAgICAvLyBsYXlvdXQgKGUuZy4gYXBwcy8qKSwgbm90IGp1c3QgdGhlIGNvbnZlbnRpb25hbCBwYWNrYWdlcy8qIGRpcmVjdG9yeSDigJQgd2hpbGUgaG9ub3JpbmdcbiAgICAvLyBkZWNsYXJlZCBuZWdhdGlvbnMgKGUuZy4gYCFhcHBzL2V4Y2x1ZGVkYCksIHdob3NlIHNvdXJjZXMgYXJlIG5vdCBwYXJ0IG9mIHRoZSBtb25vcmVwby5cbiAgICBjb25zdCB3b3Jrc3BhY2VEaXJQYXR0ZXJucyA9IGdldFdvcmtzcGFjZURpclBhdHRlcm5zKHBhY2thZ2VDb25maWcpO1xuICAgIGNvbnN0IHRzRmlsZXMgPSBhd2FpdCBmZy5nbG9iKFxuICAgICAgW1xuICAgICAgICAne2FwcCxzcmMsdGVzdCxzY3JpcHRzfS8qKi8qLntjanMsbWpzLGpzLGpzeCxjdHMsbXRzLHRzLHRzeH0nLFxuICAgICAgICAncGFja2FnZXMvKiove2FwcCxzcmMsdGVzdCxzY3JpcHRzfS8qKi8qLntjanMsbWpzLGpzLGpzeCxjdHMsbXRzLHRzLHRzeH0nLFxuICAgICAgICAuLi53b3Jrc3BhY2VEaXJQYXR0ZXJucy5pbmNsdWRlcy5tYXAoXG4gICAgICAgICAgKGRpclBhdHRlcm4pID0+IGAke2RpclBhdHRlcm59LyoqL3thcHAsc3JjLHRlc3Qsc2NyaXB0c30vKiovKi57Y2pzLG1qcyxqcyxqc3gsY3RzLG10cyx0cyx0c3h9YFxuICAgICAgICApLFxuICAgICAgXSxcbiAgICAgIHtcbiAgICAgICAgZG90OiB0cnVlLFxuICAgICAgICBjd2Q6IGRpclBhdGgsXG4gICAgICAgIGlnbm9yZTogWy4uLmdsb2JJZ25vcmUsIC4uLndvcmtzcGFjZURpclBhdHRlcm5zLmV4Y2x1ZGVzLm1hcCgoZGlyUGF0dGVybikgPT4gYCR7ZGlyUGF0dGVybn0vKipgKV0sXG4gICAgICB9XG4gICAgKTtcbiAgICBpZiAob3B0aW9ucy5pc1ZlcmJvc2UpIHtcbiAgICAgIGNvbnNvbGUuaW5mbyhgRm91bmQgJHt0c0ZpbGVzLmxlbmd0aH0gVHlwZVNjcmlwdCBmaWxlcyBpbiAke2RpclBhdGh9YCk7XG4gICAgfVxuICAgIGZvciAoY29uc3QgdHNGaWxlIG9mIHRzRmlsZXMpIHtcbiAgICAgIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5qb2luKGRpclBhdGgsIHRzRmlsZSk7XG4gICAgICB2b2lkIHByb21pc2VQb29sLnJ1bihhc3luYyAoKSA9PiB7XG4gICAgICAgIGNvbnN0IG9sZENvbnRlbnQgPSBhd2FpdCBmc1V0aWwucmVhZEZpbGVJZkV4aXN0cyhmaWxlUGF0aCk7XG4gICAgICAgIGlmIChvbGRDb250ZW50ID09PSB1bmRlZmluZWQpIHJldHVybjtcbiAgICAgICAgbGV0IG5ld0NvbnRlbnQgPSBmaXhUeXBvc0luQ29kZShvbGRDb250ZW50KTtcbiAgICAgICAgbmV3Q29udGVudCA9IHJlcGxhY2VXaXRoQ29uZmlnKG5ld0NvbnRlbnQsIHBhY2thZ2VDb25maWcsICd0cycpO1xuXG4gICAgICAgIGlmIChvbGRDb250ZW50ICE9PSBuZXdDb250ZW50KSB7XG4gICAgICAgICAgYXdhaXQgZnNVdGlsLmdlbmVyYXRlRmlsZShmaWxlUGF0aCwgbmV3Q29udGVudCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGNvbnN0IHRleHRCYXNlZEZpbGVzID0gYXdhaXQgZmcuZ2xvYignKiovKi57Y3N2LGh0bSxodG1sLHRzdix4bWwseWFtbCx5bWx9Jywge1xuICAgICAgZG90OiB0cnVlLFxuICAgICAgY3dkOiBkaXJQYXRoLFxuICAgICAgaWdub3JlOiBnbG9iSWdub3JlLFxuICAgIH0pO1xuICAgIGlmIChvcHRpb25zLmlzVmVyYm9zZSkge1xuICAgICAgY29uc29sZS5pbmZvKGBGb3VuZCAke3RleHRCYXNlZEZpbGVzLmxlbmd0aH0gdGV4dC1iYXNlZCBmaWxlcyBpbiAke2RpclBhdGh9YCk7XG4gICAgfVxuICAgIGZvciAoY29uc3QgZmlsZSBvZiB0ZXh0QmFzZWRGaWxlcykge1xuICAgICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLmpvaW4oZGlyUGF0aCwgZmlsZSk7XG4gICAgICB2b2lkIHByb21pc2VQb29sLnJ1bihhc3luYyAoKSA9PiB7XG4gICAgICAgIGNvbnN0IG9sZENvbnRlbnQgPSBhd2FpdCBmc1V0aWwucmVhZEZpbGVJZkV4aXN0cyhmaWxlUGF0aCk7XG4gICAgICAgIGlmIChvbGRDb250ZW50ID09PSB1bmRlZmluZWQpIHJldHVybjtcbiAgICAgICAgbGV0IG5ld0NvbnRlbnQgPSBmaXhUeXBvc0luVGV4dChvbGRDb250ZW50KTtcbiAgICAgICAgbmV3Q29udGVudCA9IHJlcGxhY2VXaXRoQ29uZmlnKG5ld0NvbnRlbnQsIHBhY2thZ2VDb25maWcsICd0ZXh0Jyk7XG5cbiAgICAgICAgaWYgKG9sZENvbnRlbnQgIT09IG5ld0NvbnRlbnQpIHtcbiAgICAgICAgICBhd2FpdCBmc1V0aWwuZ2VuZXJhdGVGaWxlKGZpbGVQYXRoLCBuZXdDb250ZW50KTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgYXdhaXQgcHJvbWlzZVBvb2wucHJvbWlzZUFsbCgpO1xuICB9KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGZpeFR5cG9zSW5UZXh0KGNvbnRlbnQ6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiBjb250ZW50XG4gICAgLnJlcGxhY2VBbGwoL1xcYmNcXC5mXFwuKD89XFxzfCQpL2csICdjZi4nKVxuICAgIC5yZXBsYWNlQWxsKC9cXGJlZ1xcLig/PVxcc3wkKS9nLCAnZS5nLicpXG4gICAgLnJlcGxhY2VBbGwoL1xcYmllXFwuKD89XFxzKS9nLCAnaS5lLicpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZml4VHlwb3NJbkNvZGUoY29udGVudDogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIChcbiAgICBjb250ZW50XG4gICAgICAucmVwbGFjZUFsbCgvXFwvXFwqW1xcc1xcU10qP1xcKlxcLy9nLCAoY29tbWVudCkgPT4gZml4VHlwb3NJblRleHQoY29tbWVudCkpXG4gICAgICAvLyBUaGUgd29yZCBib3VuZGFyeSBhbmQgdHJhaWxpbmctd2hpdGVzcGFjZSBndWFyZCBrZWVwIHdvcmRzIG1lcmVseSBlbmRpbmcgaW4gdGhlXG4gICAgICAvLyBhYmJyZXZpYXRpb24gbGV0dGVycyAoZS5nLiBcImNvb2tpZS5cIiwgXCJsZWcuXCIpIGludGFjdC5cbiAgICAgIC5yZXBsYWNlQWxsKC8oXnxcXHMpXFwvXFwvKC4qPylcXGJjXFwuZlxcLig/PVxcc3wkKS9nLCAnJDEvLyQyY2YuJylcbiAgICAgIC5yZXBsYWNlQWxsKC8oXnxcXHMpXFwvXFwvKC4qPylcXGJlZ1xcLig/PVxcc3wkKS9nLCAnJDEvLyQyZS5nLicpXG4gICAgICAucmVwbGFjZUFsbCgvKF58XFxzKVxcL1xcLyguKj8pXFxiaWVcXC4oPz1cXHN8JCkvZywgJyQxLy8kMmkuZS4nKVxuICApO1xufVxuXG5mdW5jdGlvbiByZXBsYWNlV2l0aENvbmZpZyhuZXdDb250ZW50OiBzdHJpbmcsIHBhY2thZ2VDb25maWc6IFBhY2thZ2VDb25maWcsIHByb3BOYW1lOiAnZG9jJyB8ICd0cycgfCAndGV4dCcpOiBzdHJpbmcge1xuICBmb3IgKGNvbnN0IFtiZWZvcmUsIGFmdGVyXSBvZiBPYmplY3QuZW50cmllcyhwYWNrYWdlQ29uZmlnLndiZnlKc29uPy50eXBvcz8uYWxsID8/IHt9KSkge1xuICAgIG5ld0NvbnRlbnQgPSBuZXdDb250ZW50LnJlcGxhY2VBbGwoYmVmb3JlLCBhZnRlcik7XG4gIH1cbiAgZm9yIChjb25zdCBbYmVmb3JlLCBhZnRlcl0gb2YgT2JqZWN0LmVudHJpZXMocGFja2FnZUNvbmZpZy53YmZ5SnNvbj8udHlwb3M/Lltwcm9wTmFtZV0gPz8ge30pKSB7XG4gICAgbmV3Q29udGVudCA9IG5ld0NvbnRlbnQucmVwbGFjZUFsbChiZWZvcmUsIGFmdGVyKTtcbiAgfVxuICByZXR1cm4gbmV3Q29udGVudDtcbn1cbiIsImltcG9ydCBjaGlsZFByb2Nlc3MgZnJvbSAnbm9kZTpjaGlsZF9wcm9jZXNzJztcblxuaW1wb3J0IHsgT2N0b2tpdCB9IGZyb20gJ0BvY3Rva2l0L2NvcmUnO1xuXG5jbGFzcyBHaXRIdWJVdGlsIHtcbiAgZ2V0T3JnQW5kTmFtZSh1cmxPckZ1bGxOYW1lOiBzdHJpbmcpOiBbc3RyaW5nLCBzdHJpbmddIHtcbiAgICBjb25zdCB1cmxXaXRob3V0UHJvdG9jb2wgPSB1cmxPckZ1bGxOYW1lLnNwbGl0KCc6JykuYXQoLTEpO1xuICAgIGNvbnN0IG5hbWVzID0gdXJsV2l0aG91dFByb3RvY29sPy5zcGxpdCgnLycpO1xuICAgIGNvbnN0IG9yZyA9IG5hbWVzPy5hdCgtMikgPz8gJyc7XG4gICAgLy8gVGhlIGRvdCBtdXN0IGJlIGVzY2FwZWQ6IGFuIHVuZXNjYXBlZCBgLmAgbWF0Y2hlcyBBTlkgY2hhcmFjdGVyLCBzbyBgbGVnaXRgIGxvc3QgaXRzIGBsYCBhbmQgYGVgLlxuICAgIGNvbnN0IG5hbWUgPSBuYW1lcz8uYXQoLTEpPy5yZXBsYWNlKC9cXC5naXQkL3UsICcnKSA/PyAnJztcbiAgICByZXR1cm4gW29yZywgbmFtZV07XG4gIH1cbn1cbmV4cG9ydCBjb25zdCBnaXRIdWJVdGlsID0gbmV3IEdpdEh1YlV0aWwoKTtcblxuZXhwb3J0IGZ1bmN0aW9uIGlzR2l0SHViUGVybWlzc2lvbk9yVmlzaWJpbGl0eUVycm9yKGVycm9yOiB1bmtub3duKTogYm9vbGVhbiB7XG4gIGlmICghZXJyb3IgfHwgdHlwZW9mIGVycm9yICE9PSAnb2JqZWN0JykgcmV0dXJuIGZhbHNlO1xuICBjb25zdCBzdGF0dXMgPSAoZXJyb3IgYXMgeyBzdGF0dXM/OiBudW1iZXIgfSkuc3RhdHVzO1xuICByZXR1cm4gc3RhdHVzID09PSA0MDEgfHwgc3RhdHVzID09PSA0MDMgfHwgc3RhdHVzID09PSA0MDQ7XG59XG5cbmNvbnN0IG9jdG9raXRDYWNoZSA9IG5ldyBNYXA8c3RyaW5nLCBPY3Rva2l0PigpO1xuXG5leHBvcnQgZnVuY3Rpb24gZ2V0T2N0b2tpdChvd25lcj86IHN0cmluZyk6IE9jdG9raXQge1xuICAvLyBHaXRIdWIgb3duZXIgbmFtZXMgYXJlIGNhc2UtaW5zZW5zaXRpdmUsIHNvIGNyZWRlbnRpYWwgc2VsZWN0aW9uIChhbmQgdGhlIGNhY2hlIGtleSkgbXVzdFxuICAvLyBub3QgZGVwZW5kIG9uIGhvdyBhIHJlbW90ZSBVUkwgaGFwcGVucyB0byBzcGVsbCB0aGUgb3JnYW5pemF0aW9uLlxuICBjb25zdCBrZXkgPSBvd25lcj8udG9Mb3dlckNhc2UoKSA/PyAnJztcbiAgY29uc3QgY2FjaGVkID0gb2N0b2tpdENhY2hlLmdldChrZXkpO1xuICBpZiAoY2FjaGVkKSByZXR1cm4gY2FjaGVkO1xuXG4gIGNvbnN0IG9jdG9raXQgPSBuZXcgT2N0b2tpdCh7XG4gICAgYXV0aDogZ2V0R2l0SHViVG9rZW4ob3duZXIpIHx8IHVuZGVmaW5lZCxcbiAgfSk7XG4gIG9jdG9raXRDYWNoZS5zZXQoa2V5LCBvY3Rva2l0KTtcbiAgcmV0dXJuIG9jdG9raXQ7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBoYXNHaXRIdWJUb2tlbihvd25lcjogc3RyaW5nKTogYm9vbGVhbiB7XG4gIHJldHVybiAhIWdldEdpdEh1YlRva2VuKG93bmVyKTtcbn1cblxuZnVuY3Rpb24gZ2V0R2l0SHViVG9rZW4ob3duZXI/OiBzdHJpbmcpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAvLyBDYXNlLWluc2Vuc2l0aXZlIG9uIHB1cnBvc2U6IGEgbm9uY2Fub25pY2FsbHkgY2FzZWQgcmVtb3RlIChlLmcuIGdpdGh1Yi5jb20vd2lsbGJvb3N0ZXJsYWIv4oCmKVxuICAvLyBtdXN0IHN0aWxsIHNlbGVjdCB0aGUgb3JnYW5pemF0aW9uJ3Mgb3duIFBBVCDigJQgZmFsbGluZyB0aHJvdWdoIHRvIHRoZSBnZW5lcmljIGJyYW5jaCB3b3VsZFxuICAvLyBwcmVmZXIgdGhlIE9USEVSIG9yZ2FuaXphdGlvbidzIFBBVCwgd2hpY2ggY2Fubm90IHJlYWQgdGhpcyBvcmdhbml6YXRpb24ncyBwcml2YXRlXG4gIC8vIHJlcG9zaXRvcmllcy5cbiAgY29uc3Qgbm9ybWFsaXplZE93bmVyID0gb3duZXI/LnRvTG93ZXJDYXNlKCk7XG4gIGlmIChub3JtYWxpemVkT3duZXIgPT09ICd3aWxsYm9vc3RlcicpIHtcbiAgICByZXR1cm4gcHJvY2Vzcy5lbnYuR0hfQk9UX1BBVF9GT1JfV0lMTEJPT1NURVIgfHwgZ2V0R2l0SHViQ2xpVG9rZW4oKTtcbiAgfVxuICBpZiAobm9ybWFsaXplZE93bmVyID09PSAnd2lsbGJvb3N0ZXJsYWInKSB7XG4gICAgcmV0dXJuIHByb2Nlc3MuZW52LkdIX0JPVF9QQVRfRk9SX1dJTExCT09TVEVSTEFCIHx8IGdldEdpdEh1YkNsaVRva2VuKCk7XG4gIH1cbiAgcmV0dXJuIChcbiAgICBwcm9jZXNzLmVudi5HSF9CT1RfUEFUX0ZPUl9XSUxMQk9PU1RFUiB8fFxuICAgIHByb2Nlc3MuZW52LkdIX0JPVF9QQVRfRk9SX1dJTExCT09TVEVSTEFCIHx8XG4gICAgcHJvY2Vzcy5lbnYuR0hfVE9LRU4gfHxcbiAgICBwcm9jZXNzLmVudi5HSVRIVUJfVE9LRU4gfHxcbiAgICBnZXRHaXRIdWJDbGlUb2tlbigpXG4gICk7XG59XG5cbmxldCBnaXRIdWJDbGlUb2tlbjogc3RyaW5nIHwgdW5kZWZpbmVkO1xuXG5mdW5jdGlvbiBnZXRHaXRIdWJDbGlUb2tlbigpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBpZiAoZ2l0SHViQ2xpVG9rZW4gIT09IHVuZGVmaW5lZCkgcmV0dXJuIGdpdEh1YkNsaVRva2VuIHx8IHVuZGVmaW5lZDtcblxuICB0cnkge1xuICAgIC8vIFNvbWUgbG9jYWwgcnVucyByZWx5IG9uIEdpdEh1YiBDTEkgYXV0aGVudGljYXRpb24gaW5zdGVhZCBvZiBleHBvcnRlZCBlbnYgdG9rZW5zLlxuICAgIGdpdEh1YkNsaVRva2VuID1cbiAgICAgIGNoaWxkUHJvY2Vzc1xuICAgICAgICAuZXhlY0ZpbGVTeW5jKCdnaCcsIFsnYXV0aCcsICd0b2tlbiddLCB7XG4gICAgICAgICAgZW5jb2Rpbmc6ICd1dGY4JyxcbiAgICAgICAgICBzdGRpbzogWydpZ25vcmUnLCAncGlwZScsICdpZ25vcmUnXSxcbiAgICAgICAgfSlcbiAgICAgICAgLnRyaW0oKSB8fCAnJztcbiAgfSBjYXRjaCB7XG4gICAgZ2l0SHViQ2xpVG9rZW4gPSAnJztcbiAgfVxuICByZXR1cm4gZ2l0SHViQ2xpVG9rZW4gfHwgdW5kZWZpbmVkO1xufVxuIiwiaW1wb3J0IHR5cGUgeyBQYXJzZUVycm9yIH0gZnJvbSAnanNvbmMtcGFyc2VyJztcbmltcG9ydCB7IGFwcGx5RWRpdHMsIGNyZWF0ZVNjYW5uZXIsIGZpbmROb2RlQXRMb2NhdGlvbiwgbW9kaWZ5LCBwYXJzZSBhcyBwYXJzZUpzb25jLCBwYXJzZVRyZWUgfSBmcm9tICdqc29uYy1wYXJzZXInO1xuXG4vLyBqc29uYy1wYXJzZXIgZGVjbGFyZXMgU3ludGF4S2luZC9TY2FuRXJyb3IgYXMgYW1iaWVudCBjb25zdCBlbnVtcywgd2hpY2ggY2Fubm90IGJlIGltcG9ydGVkXG4vLyB1bmRlciB2ZXJiYXRpbU1vZHVsZVN5bnRheDsgbWlycm9yIHRoZSBuZWVkZWQgbWVtYmVyIHZhbHVlcyBsb2NhbGx5LlxuY29uc3Qgc3ludGF4S2luZCA9IHsgbGluZUNvbW1lbnRUcml2aWE6IDEyLCBibG9ja0NvbW1lbnRUcml2aWE6IDEzLCBsaW5lQnJlYWtUcml2aWE6IDE0LCB0cml2aWE6IDE1LCBlb2Y6IDE3IH07XG5jb25zdCBzY2FuRXJyb3JOb25lID0gMDtcblxuZXhwb3J0IGNvbnN0IGpzb25jVXRpbCA9IHtcbiAgLyoqXG4gICAqIFRlbGxzIHdoZXRoZXIgdGhlIGNvbnRlbnQgaG9sZHMgbm8gY29uZmlndXJhdGlvbiBhdCBhbGwg4oCUIG9ubHkgd2hpdGVzcGFjZSwgY29tcGxldGUgY29tbWVudHMsXG4gICAqIGFuZC9vciBhIEJPTS4gdHNjIHRyZWF0cyBzdWNoIGEgdHNjb25maWcuanNvbiBhcyBhbiBlbXB0eSBjb25maWcsIHNvIGdlbmVyYXRvcnMgc2hvdWxkIHRyZWF0XG4gICAqIGl0IGxpa2UgYSBtaXNzaW5nIGZpbGUgKGFuZCBnZW5lcmF0ZSBkZWZhdWx0cykgaW5zdGVhZCBvZiByZWZ1c2luZyB0byBtYW5hZ2UgaXQuIExleGljYWxseVxuICAgKiBicm9rZW4gdHJpdmlhIChlLmcuIGFuIHVudGVybWluYXRlZCBibG9jayBjb21tZW50KSBpcyBOT1QgdHJpdmlhLW9ubHk6IHRoZSBmaWxlIG11c3QgYmUgbGVmdFxuICAgKiB1bnRvdWNoZWQgcmF0aGVyIHRoYW4gb3ZlcndyaXR0ZW4gd2l0aCBkZWZhdWx0cy5cbiAgICovXG4gIGlzVHJpdmlhT25seShjb250ZW50OiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICBjb25zdCBzY2FubmVyID0gY3JlYXRlU2Nhbm5lcihjb250ZW50LnJlcGxhY2UoL15cXHVGRUZGLywgJycpKTtcbiAgICBmb3IgKGxldCBraW5kOiBudW1iZXIgPSBzY2FubmVyLnNjYW4oKTsga2luZCAhPT0gc3ludGF4S2luZC5lb2Y7IGtpbmQgPSBzY2FubmVyLnNjYW4oKSkge1xuICAgICAgaWYgKFxuICAgICAgICAoc2Nhbm5lci5nZXRUb2tlbkVycm9yKCkgYXMgbnVtYmVyKSAhPT0gc2NhbkVycm9yTm9uZSB8fFxuICAgICAgICAoa2luZCAhPT0gc3ludGF4S2luZC5saW5lQ29tbWVudFRyaXZpYSAmJlxuICAgICAgICAgIGtpbmQgIT09IHN5bnRheEtpbmQuYmxvY2tDb21tZW50VHJpdmlhICYmXG4gICAgICAgICAga2luZCAhPT0gc3ludGF4S2luZC50cml2aWEgJiZcbiAgICAgICAgICBraW5kICE9PSBzeW50YXhLaW5kLmxpbmVCcmVha1RyaXZpYSlcbiAgICAgICkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xuICB9LFxuICAvKipcbiAgICogUGFyc2VzIGEgSlNPTkMgKEpTT04gd2l0aCBjb21tZW50cykgb2JqZWN0IGZyb20gY29uZmlnIGZpbGVzIHN1Y2ggYXMgdHNjb25maWcuanNvbixcbiAgICogcHlyaWdodGNvbmZpZy5qc29uLCByZW5vdmF0ZS5qc29uLCAudnNjb2RlL3NldHRpbmdzLmpzb24sIGFuZCB3cmFuZ2xlci5qc29uYy5cbiAgICpcbiAgICoganNvbmMtcGFyc2VyIGlzIGZhdWx0IHRvbGVyYW50IGFuZCByZXR1cm5zIGEgcGFydGlhbCBvYmplY3QgZm9yIG1hbGZvcm1lZCBpbnB1dCwgd2hpY2ggbXVzdFxuICAgKiBub3QgYmUgdHJlYXRlZCBhcyB0aGUgZmlsZSdzIGNvbmZpZ3VyYXRpb247IHJlamVjdCBhbnkgcGFyc2UgZXJyb3IgaW5zdGVhZC4gQSBsZWFkaW5nIEJPTSBpc1xuICAgKiBzdHJpcHBlZCBiZWNhdXNlIFR5cGVTY3JpcHQgYWNjZXB0cyBCT00nZCBjb25maWcgZmlsZXMgd2hpbGUganNvbmMtcGFyc2VyIHJlcG9ydHMgdGhlIEJPTSBhc1xuICAgKiBhIHBhcnNlIGVycm9yLiBDYWxsZXJzIHdob3NlIHJlYWRlciByZWplY3RzIHRyYWlsaW5nIGNvbW1hcyB0dXJuIGBhbGxvd1RyYWlsaW5nQ29tbWFgXG4gICAqIG9mZiBzbyBzdWNoIGEgZmlsZSBpcyByZXBvcnRlZCBhcyBtYWxmb3JtZWQgaGVyZSB0b28uXG4gICAqL1xuICBwYXJzZU9iamVjdElnbm9yaW5nRXJyb3I8VCBleHRlbmRzIG9iamVjdD4oY29udGVudDogc3RyaW5nLCBhbGxvd1RyYWlsaW5nQ29tbWEgPSB0cnVlKTogVCB8IHVuZGVmaW5lZCB7XG4gICAgY29uc3QgcGFyc2VFcnJvcnM6IFBhcnNlRXJyb3JbXSA9IFtdO1xuICAgIGNvbnN0IHZhbHVlID0gcGFyc2VKc29uYyhjb250ZW50LnJlcGxhY2UoL15cXHVGRUZGLywgJycpLCBwYXJzZUVycm9ycywgeyBhbGxvd1RyYWlsaW5nQ29tbWEgfSkgYXMgVCB8IHVuZGVmaW5lZDtcbiAgICByZXR1cm4gcGFyc2VFcnJvcnMubGVuZ3RoID09PSAwICYmICEhdmFsdWUgJiYgdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJiAhQXJyYXkuaXNBcnJheSh2YWx1ZSlcbiAgICAgID8gdmFsdWVcbiAgICAgIDogdW5kZWZpbmVkO1xuICB9LFxuICAvKiogVGVsbHMgd2hldGhlciB0aGUgY29udGVudCBjYXJyaWVzIGF0IGxlYXN0IG9uZSBjb21tZW50LCBpLmUuIGNvbnRlbnQgSlNPTi5zdHJpbmdpZnkgd291bGQgZHJvcC4gKi9cbiAgY29udGFpbnNDb21tZW50KGNvbnRlbnQ6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IHNjYW5uZXIgPSBjcmVhdGVTY2FubmVyKGNvbnRlbnQucmVwbGFjZSgvXlxcdUZFRkYvLCAnJykpO1xuICAgIGZvciAobGV0IGtpbmQ6IG51bWJlciA9IHNjYW5uZXIuc2NhbigpOyBraW5kICE9PSBzeW50YXhLaW5kLmVvZjsga2luZCA9IHNjYW5uZXIuc2NhbigpKSB7XG4gICAgICAvLyBBIGxleGljYWwgZXJyb3IgbWVhbnMgdGhlIHJlbWFpbmluZyB0b2tlbnMgYXJlIHVucmVsaWFibGU7IHJlcG9ydCBubyBjb21tZW50IHJhdGhlciB0aGFuXG4gICAgICAvLyBndWVzc2luZy4gQSBjYWxsZXIgdGhhdCBvbmx5IHdhcm5zIGFib3V0IGRyb3BwZWQgY29tbWVudHMgbG9zZXMgbm90aGluZywgYW5kIG9uZSB0aGF0XG4gICAgICAvLyByZWZ1c2VzIGEgY29tbWVudGVkIGZpbGUgZm9yIGEgc3RyaWN0LUpTT04gcmVhZGVyIHN0aWxsIHJlamVjdHMgc3VjaCBjb250ZW50IHdoZW4gaXRcbiAgICAgIC8vIHBhcnNlcyBpdC5cbiAgICAgIGlmICgoc2Nhbm5lci5nZXRUb2tlbkVycm9yKCkgYXMgbnVtYmVyKSAhPT0gc2NhbkVycm9yTm9uZSkgcmV0dXJuIGZhbHNlO1xuICAgICAgaWYgKGtpbmQgPT09IHN5bnRheEtpbmQubGluZUNvbW1lbnRUcml2aWEgfHwga2luZCA9PT0gc3ludGF4S2luZC5ibG9ja0NvbW1lbnRUcml2aWEpIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG4gIH0sXG4gIC8qKlxuICAgKiBTZXJpYWxpemVzIGBzZXR0aW5nc2AgaW50byBgb2xkQ29udGVudGAsIGVkaXRpbmcgb25seSB0aGUgdG9wLWxldmVsIHByb3BlcnRpZXMgd2hvc2UgdmFsdWVzXG4gICAqIGNoYW5nZWQgc28gdGhlIGNvbW1lbnRzIGFuZCBmb3JtYXR0aW5nIG9mIGFuIGV4aXN0aW5nIGZpbGUgc3Vydml2ZS4gQ2FsbGVycyBuZXZlciBkcm9wXG4gICAqIHByb3BlcnRpZXMgKGdlbmVyYXRlZCBzZXR0aW5ncyBhcmUgbWVyZ2VkIE9OIFRPUCBvZiB0aGUgZXhpc3Rpbmcgb25lcyksIHNvIHJlbW92YWxzIGFyZSBub3RcbiAgICogaGFuZGxlZDogYSBwcm9wZXJ0eSBtaXNzaW5nIGZyb20gYHNldHRpbmdzYCBpcyBsZWZ0IHVudG91Y2hlZCByYXRoZXIgdGhhbiBkZWxldGVkLlxuICAgKlxuICAgKiBUcml2aWEtb25seSBjb250ZW50IGtlZXBzIGl0cyBjb21tZW50cyBhcyBhIGhlYWRlciBhYm92ZSB0aGUgZ2VuZXJhdGVkIG9iamVjdCwgcmF0aGVyIHRoYW5cbiAgICogYmVpbmcgcmVwbGFjZWQgb3V0cmlnaHQgb3IgcnVuIHRocm91Z2ggbW9kaWZ5KCkgKHdoaWNoIHdvdWxkIG1vdmUgdGhlIG9iamVjdCBpbiBmcm9udCBvZiB0aGVtKS5cbiAgICovXG4gIHN0cmluZ2lmeVByZXNlcnZpbmdUcml2aWEoXG4gICAgb2xkQ29udGVudDogc3RyaW5nIHwgdW5kZWZpbmVkLFxuICAgIHNldHRpbmdzOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPlxuICApOiB7IGNvbnRlbnQ6IHN0cmluZzsga2V5c0xvc2luZ0NvbW1lbnRzOiBzdHJpbmdbXSB9IHtcbiAgICBpZiAob2xkQ29udGVudCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4geyBjb250ZW50OiBKU09OLnN0cmluZ2lmeShzZXR0aW5ncywgdW5kZWZpbmVkLCAyKSwga2V5c0xvc2luZ0NvbW1lbnRzOiBbXSB9O1xuICAgIH1cblxuICAgIGNvbnN0IG9sZFNldHRpbmdzID0ganNvbmNVdGlsLnBhcnNlT2JqZWN0SWdub3JpbmdFcnJvcjxSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj4ob2xkQ29udGVudCk7XG4gICAgLy8gRHJvcCBhIGxlYWRpbmcgQk9NOiBtb2RpZnkoKSBpbnNlcnRzIHRoZSBnZW5lcmF0ZWQgb2JqZWN0IEJFRk9SRSBhbnkgbGVhZGluZyB0cml2aWEsIHdoaWNoXG4gICAgLy8gd291bGQgbGVhdmUgdGhlIEJPTSBzdHJhbmRlZCBtaWQtZmlsZSB3aGVyZSBpdCBpcyBhIHN5bnRheCBlcnJvciByYXRoZXIgdGhhbiBhbiBpZ25vcmVkIG1hcmsuXG4gICAgbGV0IGNvbnRlbnQgPSBvbGRDb250ZW50LnJlcGxhY2UoL15cXHVGRUZGLywgJycpO1xuICAgIGlmIChqc29uY1V0aWwuaXNUcml2aWFPbmx5KGNvbnRlbnQpKSB7XG4gICAgICBjb25zdCBoZWFkZXIgPSBjb250ZW50LnRyaW0oKTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGNvbnRlbnQ6IGAke2hlYWRlciA/IGhlYWRlciArICdcXG4nIDogJyd9JHtKU09OLnN0cmluZ2lmeShzZXR0aW5ncywgdW5kZWZpbmVkLCAyKX1gLFxuICAgICAgICBrZXlzTG9zaW5nQ29tbWVudHM6IFtdLFxuICAgICAgfTtcbiAgICB9XG4gICAgY29uc3QgbW9kaWZ5T3B0aW9ucyA9IHsgZm9ybWF0dGluZ09wdGlvbnM6IGRldGVjdEZvcm1hdHRpbmdPcHRpb25zKGNvbnRlbnQpIH07XG4gICAgY29uc3Qga2V5c0xvc2luZ0NvbW1lbnRzOiBzdHJpbmdbXSA9IFtdO1xuICAgIGNvbnN0IG5ld0VudHJpZXM6IFtzdHJpbmcsIHVua25vd25dW10gPSBbXTtcbiAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhzZXR0aW5ncykpIHtcbiAgICAgIGNvbnN0IG9sZFZhbHVlID0gb2xkU2V0dGluZ3M/LltrZXldO1xuICAgICAgLy8gQ29tcGFyZSBzZXJpYWxpemVkIGZvcm1zIHNvIGRlZXAtZXF1YWwgdmFsdWVzIChlLmcuIGEgcmUtbWVyZ2VkIGBleHRlbmRzYCBhcnJheSkgZG8gbm90XG4gICAgICAvLyByZXdyaXRlIHRoZSBwcm9wZXJ0eSBhbmQgcmVmbG93IGl0cyBmb3JtYXR0aW5nLlxuICAgICAgaWYgKEpTT04uc3RyaW5naWZ5KG9sZFZhbHVlKSA9PT0gSlNPTi5zdHJpbmdpZnkodmFsdWUpKSBjb250aW51ZTtcbiAgICAgIGlmIChvbGRWYWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIG5ld0VudHJpZXMucHVzaChba2V5LCB2YWx1ZV0pO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIC8vIFJlcGxhY2luZyBhIHdob2xlIGFycmF5IHdvdWxkIGRpc2NhcmQgdGhlIGNvbW1lbnRzIGJldHdlZW4gaXRzIGVsZW1lbnRzLCBzbyBncm93IGl0IHdpdGhcbiAgICAgIC8vIHBlci1lbGVtZW50IGluc2VydGlvbnMgd2hlbmV2ZXIgdGhlIG5ldyB2YWx1ZSBvbmx5IGFkZHMgdG8gaXQuXG4gICAgICBjb25zdCBpbnNlcnRpb25zID0gQXJyYXkuaXNBcnJheShvbGRWYWx1ZSkgJiYgQXJyYXkuaXNBcnJheSh2YWx1ZSkgPyBmaW5kSW5zZXJ0aW9ucyhvbGRWYWx1ZSwgdmFsdWUpIDogdW5kZWZpbmVkO1xuICAgICAgZm9yIChjb25zdCBpbnNlcnRpb24gb2YgaW5zZXJ0aW9ucyA/PyBbXSkge1xuICAgICAgICBjb250ZW50ID0gYXBwbHlFZGl0cyhcbiAgICAgICAgICBjb250ZW50LFxuICAgICAgICAgIG1vZGlmeShjb250ZW50LCBba2V5LCBpbnNlcnRpb24uaW5kZXhdLCBpbnNlcnRpb24udmFsdWUsIHsgLi4ubW9kaWZ5T3B0aW9ucywgaXNBcnJheUluc2VydGlvbjogdHJ1ZSB9KVxuICAgICAgICApO1xuICAgICAgICBjb250ZW50ID0gcmVzdG9yZVRyYWlsaW5nQ29tbWVudChjb250ZW50LCBrZXksIGluc2VydGlvbi5pbmRleCk7XG4gICAgICB9XG4gICAgICBpZiAoaW5zZXJ0aW9ucykgY29udGludWU7XG4gICAgICAvLyBSZXdyaXRpbmcgdGhlIHdob2xlIHZhbHVlIGlzIHRoZSBvbmx5IG9wdGlvbiBsZWZ0ICh0aGUgbmV3IG9uZSBkcm9wcyBvciByZW9yZGVycyBlbGVtZW50cyksXG4gICAgICAvLyBhbmQgaXQgdGFrZXMgYW55IGNvbW1lbnQgbmVzdGVkIGluc2lkZSBpdCBhbG9uZy4gUmVwb3J0IHRoYXQgcmF0aGVyIHRoYW4gbG9zaW5nIGl0IHF1aWV0bHkuXG4gICAgICBjb25zdCByZXBsYWNlZFRleHQgPSB2YWx1ZVRleHRPZihjb250ZW50LCBrZXkpO1xuICAgICAgaWYgKHJlcGxhY2VkVGV4dCAhPT0gdW5kZWZpbmVkICYmIGpzb25jVXRpbC5jb250YWluc0NvbW1lbnQocmVwbGFjZWRUZXh0KSkga2V5c0xvc2luZ0NvbW1lbnRzLnB1c2goa2V5KTtcbiAgICAgIGNvbnRlbnQgPSBhcHBseUVkaXRzKGNvbnRlbnQsIG1vZGlmeShjb250ZW50LCBba2V5XSwgdmFsdWUsIG1vZGlmeU9wdGlvbnMpKTtcbiAgICB9XG4gICAgLy8gUHJlcGVuZCByYXRoZXIgdGhhbiBhcHBlbmQgdGhlIHByb3BlcnRpZXMgdGhhdCBhcmUgbmV3OiBhcHBlbmRpbmcgZGV0YWNoZXMgYSB0cmFpbGluZ1xuICAgIC8vIHNhbWUtbGluZSBjb21tZW50IGZyb20gdGhlIGxhc3QgcHJvcGVydHksIGxlYXZpbmcgaXQgdG8gZGVzY3JpYmUgdGhlIGdlbmVyYXRlZCB2YWx1ZVxuICAgIC8vIGluc3RlYWQuIEluc2VydGluZyBpbiByZXZlcnNlIGtlZXBzIHRoZSBvcmRlciB0aGUgc2V0dGluZ3MgZGVjbGFyZSB0aGVtIGluLlxuICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIG5ld0VudHJpZXMudG9SZXZlcnNlZCgpKSB7XG4gICAgICBjb250ZW50ID0gYXBwbHlFZGl0cyhjb250ZW50LCBtb2RpZnkoY29udGVudCwgW2tleV0sIHZhbHVlLCB7IC4uLm1vZGlmeU9wdGlvbnMsIGdldEluc2VydGlvbkluZGV4OiAoKSA9PiAwIH0pKTtcbiAgICB9XG4gICAgcmV0dXJuIHsgY29udGVudCwga2V5c0xvc2luZ0NvbW1lbnRzIH07XG4gIH0sXG59O1xuXG4vKiogUmV0dXJucyB0aGUgc291cmNlIHRleHQgb2YgYSB0b3AtbGV2ZWwgcHJvcGVydHkncyB2YWx1ZSwgY29tbWVudHMgYW5kIGFsbC4gKi9cbmZ1bmN0aW9uIHZhbHVlVGV4dE9mKGNvbnRlbnQ6IHN0cmluZywga2V5OiBzdHJpbmcpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBjb25zdCByb290ID0gcGFyc2VUcmVlKGNvbnRlbnQpO1xuICBjb25zdCBub2RlID0gcm9vdCAmJiBmaW5kTm9kZUF0TG9jYXRpb24ocm9vdCwgW2tleV0pO1xuICByZXR1cm4gbm9kZSAmJiBjb250ZW50LnNsaWNlKG5vZGUub2Zmc2V0LCBub2RlLm9mZnNldCArIG5vZGUubGVuZ3RoKTtcbn1cblxuLy8gVGhlIHdob2xlIHNhbWUtbGluZSBjb21tZW50IHNlcXVlbmNlLCBub3QganVzdCB0aGUgZmlyc3Qgb25lOiBhIGxpbmUgY29tbWVudCBlbmRzIGl0IChpdCBydW5zIHRvXG4vLyB0aGUgbmV3bGluZSksIGJ1dCBhbnkgbnVtYmVyIG9mIGJsb2NrIGNvbW1lbnRzIGNhbiBwcmVjZWRlIGl0LCBhbmQgbW92aW5nIG9ubHkgdGhlIGZpcnN0IHdvdWxkXG4vLyBsZWF2ZSB0aGUgcmVzdCBkZXNjcmliaW5nIHRoZSB3cm9uZyBlbGVtZW50LlxuY29uc3QgdHJhaWxpbmdDb21tZW50UGF0dGVybiA9IC9eKD86W15cXFNcXG5dKlxcL1xcKltcXFNcXHNdKj9cXCpcXC8pKig/OlteXFxTXFxuXSpcXC9cXC9bXlxcbl0qKT8vdTtcblxuLyoqXG4gKiBSZWF0dGFjaGVzIGEgc2FtZS1saW5lIGNvbW1lbnQgdG8gdGhlIGVsZW1lbnQgaXQgZGVzY3JpYmVzLiBJbnNlcnRpbmcgaW50byBhbiBhcnJheSBwbGFjZXMgdGhlXG4gKiBuZXcgZWxlbWVudCBCRUZPUkUgdGhlIHRyaXZpYSB0aGF0IGZvbGxvd3MgaXRzIHByZWRlY2Vzc29yLCBzbyBhcHBlbmRpbmcgYWZ0ZXJcbiAqIGB7IC4uLiB9IC8vIHdoeSB0aGlzIHJ1bGUgZXhpc3RzYCBsZWF2ZXMgdGhhdCBjb21tZW50IGV4cGxhaW5pbmcgdGhlIGdlbmVyYXRlZCBlbGVtZW50IGluc3RlYWQuXG4gKiBBIGZyZXNobHkgc2VyaWFsaXplZCBlbGVtZW50IG5ldmVyIGNhcnJpZXMgYSBjb21tZW50IG9mIGl0cyBvd24sIHNvIGFueXRoaW5nIHRyYWlsaW5nIHRoZVxuICogaW5zZXJ0aW9uIGJlbG9uZ2VkIHRvIHRoZSBlbGVtZW50IGJlZm9yZSBpdC5cbiAqL1xuZnVuY3Rpb24gcmVzdG9yZVRyYWlsaW5nQ29tbWVudChjb250ZW50OiBzdHJpbmcsIGtleTogc3RyaW5nLCBpbnNlcnRlZEluZGV4OiBudW1iZXIpOiBzdHJpbmcge1xuICBpZiAoaW5zZXJ0ZWRJbmRleCA9PT0gMCkgcmV0dXJuIGNvbnRlbnQ7XG4gIGNvbnN0IHJvb3QgPSBwYXJzZVRyZWUoY29udGVudCk7XG4gIGNvbnN0IGVsZW1lbnRzID0gKHJvb3QgJiYgZmluZE5vZGVBdExvY2F0aW9uKHJvb3QsIFtrZXldKSk/LmNoaWxkcmVuO1xuICBjb25zdCBpbnNlcnRlZCA9IGVsZW1lbnRzPy5baW5zZXJ0ZWRJbmRleF07XG4gIGNvbnN0IHByZXZpb3VzID0gZWxlbWVudHM/LltpbnNlcnRlZEluZGV4IC0gMV07XG4gIGlmICghaW5zZXJ0ZWQgfHwgIXByZXZpb3VzKSByZXR1cm4gY29udGVudDtcbiAgY29uc3QgaW5zZXJ0ZWRFbmQgPSBpbnNlcnRlZC5vZmZzZXQgKyBpbnNlcnRlZC5sZW5ndGg7XG4gIGNvbnN0IGNvbW1lbnQgPSB0cmFpbGluZ0NvbW1lbnRQYXR0ZXJuLmV4ZWMoY29udGVudC5zbGljZShpbnNlcnRlZEVuZCkpPy5bMF07XG4gIGlmICghY29tbWVudCkgcmV0dXJuIGNvbnRlbnQ7XG4gIC8vIExhbmQgdGhlIGNvbW1lbnQgYWZ0ZXIgdGhlIHNlcGFyYXRpbmcgY29tbWEgc28gdGhlIGVsZW1lbnQga2VlcHMgaXRzIG93biBsaW5lIGludGFjdC5cbiAgY29uc3QgcHJldmlvdXNFbmQgPSBwcmV2aW91cy5vZmZzZXQgKyBwcmV2aW91cy5sZW5ndGg7XG4gIGNvbnN0IHJlc3RvcmVPZmZzZXQgPSBwcmV2aW91c0VuZCArICgvXlxccyosL3UuZXhlYyhjb250ZW50LnNsaWNlKHByZXZpb3VzRW5kKSk/LlswXS5sZW5ndGggPz8gMCk7XG4gIHJldHVybiAoXG4gICAgY29udGVudC5zbGljZSgwLCByZXN0b3JlT2Zmc2V0KSArXG4gICAgY29tbWVudCArXG4gICAgY29udGVudC5zbGljZShyZXN0b3JlT2Zmc2V0LCBpbnNlcnRlZEVuZCkgK1xuICAgIGNvbnRlbnQuc2xpY2UoaW5zZXJ0ZWRFbmQgKyBjb21tZW50Lmxlbmd0aClcbiAgKTtcbn1cblxuLyoqXG4gKiBNaXJyb3JzIHRoZSBpbmRlbnRhdGlvbiB0aGUgZmlsZSBhbHJlYWR5IHVzZXMsIHNvIGEgc2VtYW50aWMgY2hhbmdlIGRvZXMgbm90IHJlaW5kZW50IHVucmVsYXRlZFxuICogbGluZXMuIFRoZSBmaXJzdCBwcm9wZXJ0eSBpcyBtZWFzdXJlZCByYXRoZXIgdGhhbiB0aGUgZmlyc3QgaW5kZW50ZWQgbGluZSwgYmVjYXVzZSBhIGRlY29yYXRlZFxuICogYmxvY2sgY29tbWVudCAoYCAqIC4uLmApIHdvdWxkIG90aGVyd2lzZSBwYXNzIGZvciB0aGUgZmlsZSdzIGluZGVudGF0aW9uLiBGYWxscyBiYWNrIHRvIHRoZSB0d29cbiAqIHNwYWNlcyBldmVyeSBnZW5lcmF0ZWQgY29uZmlnIHVzZXMuXG4gKi9cbmZ1bmN0aW9uIGRldGVjdEZvcm1hdHRpbmdPcHRpb25zKGNvbnRlbnQ6IHN0cmluZyk6IHsgaW5zZXJ0U3BhY2VzOiBib29sZWFuOyB0YWJTaXplOiBudW1iZXIgfSB7XG4gIGNvbnN0IGZpcnN0UHJvcGVydHkgPSBwYXJzZVRyZWUoY29udGVudCk/LmNoaWxkcmVuPy5bMF07XG4gIGNvbnN0IGluZGVudGF0aW9uID1cbiAgICBmaXJzdFByb3BlcnR5ICYmIGNvbnRlbnQuc2xpY2UoY29udGVudC5sYXN0SW5kZXhPZignXFxuJywgZmlyc3RQcm9wZXJ0eS5vZmZzZXQpICsgMSwgZmlyc3RQcm9wZXJ0eS5vZmZzZXQpO1xuICBpZiAoIWluZGVudGF0aW9uIHx8ICEvXltcXHQgXSskL3UudGVzdChpbmRlbnRhdGlvbikpIHJldHVybiB7IGluc2VydFNwYWNlczogdHJ1ZSwgdGFiU2l6ZTogMiB9O1xuICBpZiAoaW5kZW50YXRpb24uc3RhcnRzV2l0aCgnXFx0JykpIHJldHVybiB7IGluc2VydFNwYWNlczogZmFsc2UsIHRhYlNpemU6IDEgfTtcbiAgcmV0dXJuIHsgaW5zZXJ0U3BhY2VzOiB0cnVlLCB0YWJTaXplOiBpbmRlbnRhdGlvbi5sZW5ndGggfTtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIHRoZSBlbGVtZW50cyB0byBpbnNlcnQgaW50byBgb2xkVmFsdWVgIHRvIHR1cm4gaXQgaW50byBgbmV3VmFsdWVgLCBvciB1bmRlZmluZWQgd2hlblxuICogdGhhdCBpcyBpbXBvc3NpYmxlIGJlY2F1c2UgYG5ld1ZhbHVlYCBkcm9wcyBvciByZW9yZGVycyBhbiBleGlzdGluZyBlbGVtZW50ICh0aGUgY2FsbGVyIG11c3RcbiAqIHRoZW4gcmVwbGFjZSB0aGUgYXJyYXkgd2hvbGVzYWxlKS4gSW5kaWNlcyBhZGRyZXNzIHRoZSBhcnJheSBhcyBpdCBncm93cywgc28gYXBwbHlpbmcgdGhlXG4gKiBpbnNlcnRpb25zIGxlZnQgdG8gcmlnaHQgeWllbGRzIGBuZXdWYWx1ZWAuXG4gKi9cbmZ1bmN0aW9uIGZpbmRJbnNlcnRpb25zKG9sZFZhbHVlOiB1bmtub3duW10sIG5ld1ZhbHVlOiB1bmtub3duW10pOiB7IGluZGV4OiBudW1iZXI7IHZhbHVlOiB1bmtub3duIH1bXSB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IGluc2VydGlvbnM6IHsgaW5kZXg6IG51bWJlcjsgdmFsdWU6IHVua25vd24gfVtdID0gW107XG4gIGxldCBvbGRJbmRleCA9IDA7XG4gIGZvciAoY29uc3QgW25ld0luZGV4LCBlbGVtZW50XSBvZiBuZXdWYWx1ZS5lbnRyaWVzKCkpIHtcbiAgICBpZiAob2xkSW5kZXggPCBvbGRWYWx1ZS5sZW5ndGggJiYgSlNPTi5zdHJpbmdpZnkob2xkVmFsdWVbb2xkSW5kZXhdKSA9PT0gSlNPTi5zdHJpbmdpZnkoZWxlbWVudCkpIHtcbiAgICAgIG9sZEluZGV4Kys7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgaW5zZXJ0aW9ucy5wdXNoKHsgaW5kZXg6IG5ld0luZGV4LCB2YWx1ZTogZWxlbWVudCB9KTtcbiAgfVxuICByZXR1cm4gb2xkSW5kZXggPT09IG9sZFZhbHVlLmxlbmd0aCA/IGluc2VydGlvbnMgOiB1bmRlZmluZWQ7XG59XG4iLCJpbXBvcnQgdHlwZSB7IFBhY2thZ2VKc29uIH0gZnJvbSAndHlwZS1mZXN0JztcblxuLyoqXG4gKiBSZWNvZ25pemVzIHRoZSBtYW5hZ2VkIGB3YiBnZW4tY29kZWAgc2VnbWVudCwgYSBvbmUtbGV2ZWwgcGFja2FnZS1zY3JpcHQgd3JhcHBlciBhcm91bmQgaXQsIGFuZFxuICogY3VzdG9tIHNlZ21lbnRzIHRoYXQgd2JmeSBsZWF2ZXMgYWxvbmUuXG4gKi9cbnR5cGUgU2NyaXB0U2VnbWVudEtpbmQgPSAnY3VzdG9tJyB8ICdnZW5Db2RlJyB8ICdnZW5Db2RlV3JhcHBlcic7XG5cbmNvbnN0IGdlbkNvZGVTZWdtZW50UGF0dGVybiA9IC9eYnVuXFxzK3diXFxzK2dlbi1jb2RlJC91O1xuXG4vLyBBIHJ1bm5lciBkZWxlZ2F0aW5nIHRvIG9uZSBvZiB0aGlzIHBhY2thZ2UncyBvd24gc2NyaXB0cywgZS5nLiBgYnVuIHJ1biBnZW4tdHlwZXNgLlxuY29uc3Qgc2NyaXB0UnVubmVyUGF0dGVybiA9IC9eYnVuXFxzK3J1blxccysoXFxTKykkL3U7XG5cbi8vIEFueXRoaW5nIHdiZnkncyBgJiZgIHNwbGl0IGNhbm5vdCBtb2RlbCAocGlwZXMsIHNlcXVlbmNpbmcsIHJlZGlyZWN0aW9ucywgcXVvdGluZywgc3Vic3RpdHV0aW9ucywgZGlyZWN0b3J5XG4vLyBjaGFuZ2VzKS4gU2NyaXB0cyBjb250YWluaW5nIGl0IGFyZSBsZWZ0IHVudG91Y2hlZCBpbnN0ZWFkIG9mIGJlaW5nIHJld3JpdHRlbiBmcm9tIGEgd3JvbmcgcGFyc2UuXG5jb25zdCB1bnN1cHBvcnRlZFNoZWxsU3ludGF4UGF0dGVybiA9IC9bXFxuO3w8PmAkJ1wiKCldfFxcYmNkXFxzL3U7XG5cbi8qKlxuICogU3BsaXRzIGEgc2NyaXB0IGludG8gYCYmYC1zZXBhcmF0ZWQgc2VnbWVudHMsIG9yIHJldHVybnMgdW5kZWZpbmVkIHdoZW4gdGhlIHNjcmlwdCB1c2VzIHNoZWxsIHN5bnRheCB3YmZ5XG4gKiBkZWxpYmVyYXRlbHkgZG9lcyBub3QgbW9kZWwuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzcGxpdFNjcmlwdFNlZ21lbnRzKHNjcmlwdDogc3RyaW5nKTogc3RyaW5nW10gfCB1bmRlZmluZWQge1xuICBpZiAodW5zdXBwb3J0ZWRTaGVsbFN5bnRheFBhdHRlcm4udGVzdChzY3JpcHQpKSByZXR1cm47XG4gIHJldHVybiBzY3JpcHRcbiAgICAuc3BsaXQoJyYmJylcbiAgICAubWFwKChzZWdtZW50KSA9PiBzZWdtZW50LnRyaW0oKSlcbiAgICAuZmlsdGVyKEJvb2xlYW4pO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY2xhc3NpZnlTY3JpcHRTZWdtZW50KFxuICBzZWdtZW50OiBzdHJpbmcsXG4gIHNjcmlwdHM6IFBhY2thZ2VKc29uLlNjcmlwdHMsXG4gIGZvbGxvd3NXcmFwcGVyID0gdHJ1ZVxuKTogU2NyaXB0U2VnbWVudEtpbmQge1xuICBjb25zdCBub3JtYWxpemVkID0gc2VnbWVudC50cmltKCkucmVwbGFjZUFsbCgvXFxzKy9ndSwgJyAnKTtcbiAgaWYgKGdlbkNvZGVTZWdtZW50UGF0dGVybi50ZXN0KG5vcm1hbGl6ZWQpKSByZXR1cm4gJ2dlbkNvZGUnO1xuICAvLyBBIG9uZS1sZXZlbCB3cmFwcGVyIGxvb2t1cCBjb3ZlcnMgYFwicG9zdGluc3RhbGxcIjogXCJidW4gcnVuIGdlbi10eXBlc1wiYCwgdGhlIHNoYXBlIHRoZXNlIHJlcG9zaXRvcmllcyB1c2U7XG4gIC8vIGRlZXBlciBjaGFpbnMgc3RheSBjdXN0b20gc28gd2JmeSBjYW5ub3QgbG9vcCBvbiBhIHNlbGYtcmVmZXJlbnRpYWwgc2NyaXB0LlxuICBjb25zdCBzY3JpcHROYW1lID0gZm9sbG93c1dyYXBwZXIgPyBzY3JpcHRSdW5uZXJQYXR0ZXJuLmV4ZWMobm9ybWFsaXplZCk/LlsxXSA6IHVuZGVmaW5lZDtcbiAgY29uc3QgdGFyZ2V0ID0gc2NyaXB0TmFtZSA9PT0gdW5kZWZpbmVkID8gdW5kZWZpbmVkIDogc2NyaXB0c1tzY3JpcHROYW1lXTtcbiAgaWYgKCF0YXJnZXQpIHJldHVybiAnY3VzdG9tJztcbiAgY29uc3Qgc2VnbWVudHMgPSBzcGxpdFNjcmlwdFNlZ21lbnRzKHRhcmdldCk7XG4gIC8vIEEgd3JhcHBlciBhcm91bmQgYSBDVVNUT01JWkVEIGdlbi1jb2RlIChgYnVuIHdiIGdlbi1jb2RlICYmIGJ1biBydW4gYnVpbGQtYXNzZXRzYCkgc3RpbGwgcGVyZm9ybXMgdGhlIG1hbmFnZWRcbiAgLy8gZ2VuZXJhdGlvbiwgc28gaXQgY291bnRzIGFzIGdlbi1jb2RlOyB0cmVhdGluZyBpdCBhcyBjdXN0b20gd291bGQgYXBwZW5kIGEgc2Vjb25kIGB3YiBnZW4tY29kZWAgYW5kIHJ1biBldmVyeVxuICAvLyBnZW5lcmF0b3IgdHdpY2UgcGVyIGluc3RhbGwuXG4gIGlmIChzZWdtZW50cz8ubGVuZ3RoICE9PSAxKSB7XG4gICAgLy8gQSB3cmFwcGVyIGFyb3VuZCBhIENVU1RPTUlaRUQgZ2VuLWNvZGUgKGBidW4gd2IgZ2VuLWNvZGUgJiYgYnVuIHJ1biBidWlsZC1hc3NldHNgKSBhbHJlYWR5IHBlcmZvcm1zIHRoZVxuICAgIC8vIG1hbmFnZWQgZ2VuZXJhdGlvbiBBTkQgdGhlIHByb2plY3QncyBvd24gc3RlcHMsIHNvIGl0IGlzIHRoZSBpbnN0YWxsLXRpbWUgZW50cnkgcG9pbnQ6IGl0IG11c3QgYmUga2VwdCBhc1xuICAgIC8vIHdyaXR0ZW4uIFJlcGxhY2luZyBpdCB3aXRoIGEgYmFyZSBgd2IgZ2VuLWNvZGVgIHdvdWxkIGRyb3AgdGhvc2Ugc3RlcHM7IGFwcGVuZGluZyBvbmUgd291bGQgcnVuIGV2ZXJ5XG4gICAgLy8gZ2VuZXJhdG9yIHR3aWNlLlxuICAgIHJldHVybiBzZWdtZW50cz8uc29tZSgoaW5uZXIpID0+IGdlbkNvZGVTZWdtZW50UGF0dGVybi50ZXN0KGlubmVyLnRyaW0oKS5yZXBsYWNlQWxsKC9cXHMrL2d1LCAnICcpKSlcbiAgICAgID8gJ2dlbkNvZGVXcmFwcGVyJ1xuICAgICAgOiAnY3VzdG9tJztcbiAgfVxuICByZXR1cm4gY2xhc3NpZnlTY3JpcHRTZWdtZW50KHNlZ21lbnRzWzBdID8/ICcnLCBzY3JpcHRzLCBmYWxzZSk7XG59XG4iLCJpbXBvcnQgdHlwZSB7IFNwYXduU3luY09wdGlvbnMgfSBmcm9tICdub2RlOmNoaWxkX3Byb2Nlc3MnO1xuaW1wb3J0IGNoaWxkX3Byb2Nlc3MgZnJvbSAnbm9kZTpjaGlsZF9wcm9jZXNzJztcblxuZXhwb3J0IGZ1bmN0aW9uIHNwYXduU3luYyhjb21tYW5kOiBzdHJpbmcsIGFyZ3M6IHN0cmluZ1tdLCBjd2Q6IHN0cmluZywgcmV0cnkgPSAwKTogdm9pZCB7XG4gIHNwYXduU3luY0FuZFJldHVyblN0YXR1cyhjb21tYW5kLCBhcmdzLCBjd2QsIHJldHJ5KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHNwYXduU3luY0FuZFJldHVyblN0YXR1cyhjb21tYW5kOiBzdHJpbmcsIGFyZ3M6IHN0cmluZ1tdLCBjd2Q6IHN0cmluZywgcmV0cnkgPSAwKTogbnVtYmVyIHtcbiAgZG8ge1xuICAgIGNvbnN0IFtuZXdDbWQsIG5ld0FyZ3MsIG9wdGlvbnNdID0gZ2V0U3Bhd25TeW5jQXJncyhjb21tYW5kLCBhcmdzLCBjd2QpO1xuICAgIGNvbnNvbGUubG9nKGAkICR7bmV3Q21kfSAke25ld0FyZ3Muam9pbignICcpfSBhdCAke2N3ZH1gKTtcbiAgICBjb25zdCByZXQgPSBjaGlsZF9wcm9jZXNzLnNwYXduU3luYyhuZXdDbWQsIG5ld0FyZ3MsIG9wdGlvbnMpO1xuICAgIGNvbnN0IHN0YXR1cyA9IHJldC5zdGF0dXMgPz8gMTtcbiAgICBpZiAoc3RhdHVzID09PSAwKSBicmVhaztcbiAgICBpZiAocmV0cnkgPD0gMCkgcmV0dXJuIHN0YXR1cztcbiAgfSB3aGlsZSAoLS1yZXRyeSA+PSAwKTtcbiAgcmV0dXJuIDA7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBzcGF3blN5bmNBbmRSZXR1cm5TdGRvdXQoY29tbWFuZDogc3RyaW5nLCBhcmdzOiBzdHJpbmdbXSwgY3dkOiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gc3Bhd25TeW5jQW5kUmV0dXJuU3Rkb3V0SW50ZXJuYWwoY29tbWFuZCwgYXJncywgY3dkKVsxXTtcbn1cblxuZnVuY3Rpb24gc3Bhd25TeW5jQW5kUmV0dXJuU3Rkb3V0SW50ZXJuYWwoY29tbWFuZDogc3RyaW5nLCBhcmdzOiBzdHJpbmdbXSwgY3dkOiBzdHJpbmcpOiBbbnVtYmVyLCBzdHJpbmddIHtcbiAgY29uc3QgW25ld0NtZCwgbmV3QXJncywgb3B0aW9uc10gPSBnZXRTcGF3blN5bmNBcmdzKGNvbW1hbmQsIGFyZ3MsIGN3ZCk7XG4gIG9wdGlvbnMuc3RkaW8gPSAncGlwZSc7XG4gIGNvbnN0IHByb2MgPSBjaGlsZF9wcm9jZXNzLnNwYXduU3luYyhuZXdDbWQsIG5ld0FyZ3MsIG9wdGlvbnMpO1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVubmVjZXNzYXJ5LWNvbmRpdGlvbiAtLSBzcGF3blN5bmMgcmV0dXJucyBudWxsIHN0ZGVyciBvbiBFTk9FTlQuXG4gIGNvbnN0IHN0ZGVyciA9IHByb2Muc3RkZXJyID8/ICcnO1xuICBjb25zdCBlcnJvciA9IHR5cGVvZiBzdGRlcnIgPT09ICdzdHJpbmcnID8gc3RkZXJyLnRyaW0oKSA6IHN0ZGVyci50b1N0cmluZygpLnRyaW0oKTtcbiAgaWYgKHByb2MuZXJyb3IpIHtcbiAgICBjb25zb2xlLmVycm9yKGAke25ld0NtZH0gWyR7bmV3QXJncy5tYXAoKHMpID0+IGBcIiR7c31cImApLmpvaW4oJywgJyl9XSBmYWlsZWQgd2l0aDogJHtwcm9jLmVycm9yLm1lc3NhZ2V9YCk7XG4gIH0gZWxzZSBpZiAoZXJyb3IpIHtcbiAgICBjb25zb2xlLmVycm9yKFxuICAgICAgYCR7bmV3Q21kfSBbJHtuZXdBcmdzLm1hcCgocykgPT4gYFwiJHtzfVwiYCkuam9pbignLCAnKX1dIG91dHB1dHMgdGhlIGZvbGxvd2luZyBjb250ZW50IHRvIHN0ZGVycjpcXG4ke2Vycm9yfWBcbiAgICApO1xuICB9XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW5uZWNlc3NhcnktY29uZGl0aW9uIC0tIHNwYXduU3luYyByZXR1cm5zIG51bGwgc3Rkb3V0IG9uIEVOT0VOVC5cbiAgY29uc3Qgc3Rkb3V0ID0gcHJvYy5zdGRvdXQgPz8gJyc7XG4gIGNvbnN0IHN0ZG91dFRleHQgPSB0eXBlb2Ygc3Rkb3V0ID09PSAnc3RyaW5nJyA/IHN0ZG91dCA6IHN0ZG91dC50b1N0cmluZygpO1xuICByZXR1cm4gW3Byb2Muc3RhdHVzID8/IDEsIHN0ZG91dFRleHQudHJpbSgpXTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldFNwYXduU3luY0FyZ3MoY29tbWFuZDogc3RyaW5nLCBhcmdzOiBzdHJpbmdbXSwgY3dkOiBzdHJpbmcpOiBbc3RyaW5nLCBzdHJpbmdbXSwgU3Bhd25TeW5jT3B0aW9uc10ge1xuICBjb25zdCBlbnYgPSB7IC4uLnByb2Nlc3MuZW52IH07XG4gIGlmIChlbnYuUEFUSCAmJiBlbnYuQkVSUllfQklOX0ZPTERFUikge1xuICAgIGVudi5QQVRIID0gZW52LlBBVEguc3BsaXQoJzonKVxuICAgICAgLmZpbHRlcigocCkgPT4gcCAhPT0gZW52LkJFUlJZX0JJTl9GT0xERVIpXG4gICAgICAuam9pbignOicpO1xuICB9XG5cbiAgcmV0dXJuIFtcbiAgICBjb21tYW5kLFxuICAgIGFyZ3MsXG4gICAge1xuICAgICAgY3dkLFxuICAgICAgZW52LFxuICAgICAgZW5jb2Rpbmc6ICd1dGY4JyxcbiAgICAgIHNoZWxsOiBmYWxzZSxcbiAgICAgIHN0ZGlvOiAnaW5oZXJpdCcsXG4gICAgfSxcbiAgXTtcbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBmc3AgZnJvbSAnbm9kZTpmcy9wcm9taXNlcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgeyBlc2NhcGVSZWdFeHAgfSBmcm9tICdAd2lsbGJvb3N0ZXIvc2hhcmVkLWxpYi9zcmMnO1xuaW1wb3J0IHsgZ2xvYklnbm9yZSB9IGZyb20gJ0B3aWxsYm9vc3Rlci9zaGFyZWQtbGliLW5vZGUvc3JjJztcbmltcG9ydCBmZyBmcm9tICdmYXN0LWdsb2InO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlSnNvbiB9IGZyb20gJ3R5cGUtZmVzdCc7XG5pbXBvcnQgeyB6IH0gZnJvbSAnem9kJztcblxuaW1wb3J0IHsgZ2V0T2N0b2tpdCwgZ2l0SHViVXRpbCB9IGZyb20gJy4vdXRpbHMvZ2l0aHViVXRpbC5qcyc7XG5pbXBvcnQgeyBqc29uY1V0aWwgfSBmcm9tICcuL3V0aWxzL2pzb25jVXRpbC5qcyc7XG5pbXBvcnQgeyBjbGFzc2lmeVNjcmlwdFNlZ21lbnQsIHNwbGl0U2NyaXB0U2VnbWVudHMgfSBmcm9tICcuL3V0aWxzL21hbmFnZWRTY3JpcHRTZWdtZW50LmpzJztcbmltcG9ydCB7IHNwYXduU3luY0FuZFJldHVyblN0ZG91dCB9IGZyb20gJy4vdXRpbHMvc3Bhd25VdGlsLmpzJztcbmltcG9ydCB7IGdldFdvcmtzcGFjZVBhY2thZ2VKc29uUGF0aHMsIGdldFdvcmtzcGFjZVN1YkRpclBhdGhzIH0gZnJvbSAnLi91dGlscy93b3Jrc3BhY2VVdGlsLmpzJztcblxuZXhwb3J0IGludGVyZmFjZSBQYWNrYWdlQ29uZmlnIHtcbiAgZGlyUGF0aDogc3RyaW5nO1xuICBkb2NrZXJmaWxlOiBzdHJpbmc7XG4gIGlzUm9vdDogYm9vbGVhbjtcbiAgaXNQdWJsaWNSZXBvOiBib29sZWFuO1xuICAvLyBXaGV0aGVyIGlzUHVibGljUmVwbyBjb21lcyBmcm9tIGFuIGFjdHVhbCBHaXRIdWIgQVBJIHJlc3BvbnNlOiBhIGZhaWxlZCBsb29rdXAgKG9mZmxpbmUsXG4gIC8vIHJhdGUtbGltaXRlZCwgYmFkIGNyZWRlbnRpYWwpIGNvbGxhcHNlcyB0byBpc1B1YmxpY1JlcG89ZmFsc2UsIHdoaWNoIHZpc2liaWxpdHktc2Vuc2l0aXZlXG4gIC8vIGdlbmVyYXRvcnMgbXVzdCBub3QgbWlzdGFrZSBmb3IgYSBjb25maXJtZWQgcHJpdmF0ZSByZXBvc2l0b3J5LlxuICBpc1JlcG9WaXNpYmlsaXR5S25vd246IGJvb2xlYW47XG4gIGlzUmVmZXJyZWRCeU90aGVyUmVwbzogYm9vbGVhbjtcbiAgcmVwb3NpdG9yeT86IHN0cmluZztcbiAgcmVwb0F1dGhvcj86IHN0cmluZztcbiAgcmVwb05hbWU/OiBzdHJpbmc7XG4gIGlzV2lsbEJvb3N0ZXJSZXBvOiBib29sZWFuO1xuICBpc0Nsb3VkZmxhcmU6IGJvb2xlYW47XG4gIGRvZXNDb250YWluV3JhbmdsZXJDb25maWc6IGJvb2xlYW47XG4gIGlzUmFpbHdheTogYm9vbGVhbjtcbiAgaXNFc21QYWNrYWdlOiBib29sZWFuO1xuICBpc1dpbGxCb29zdGVyQ29uZmlnczogYm9vbGVhbjtcbiAgLyoqIERpcmVjdG9yaWVzIGNvbnRhaW5pbmcgQ2FyZ28udG9tbCAocmVsYXRpdmUgdG8gZGlyUGF0aCwgcm9vdC1tb3N0IGZpcnN0KS4gRW1wdHkgaWYgdGhlIHJlcG8gaGFzIG5vIFJ1c3QgY29kZS4gKi9cbiAgY2FyZ29Ub21sRGlyUGF0aHM6IHN0cmluZ1tdO1xuICBkb2VzQ29udGFpblN1YlBhY2thZ2VKc29uczogYm9vbGVhbjtcbiAgZG9lc0NvbnRhaW5Eb2NrZXJmaWxlOiBib29sZWFuO1xuICBkb2VzQ29udGFpbkdlbWZpbGU6IGJvb2xlYW47XG4gIGRvZXNDb250YWluR29Nb2Q6IGJvb2xlYW47XG4gIGRvZXNDb250YWluUGFja2FnZUpzb246IGJvb2xlYW47XG4gIGRvZXNDb250YWluUG9ldHJ5TG9jazogYm9vbGVhbjtcbiAgZG9lc0NvbnRhaW5VdkxvY2s6IGJvb2xlYW47XG4gIC8qKiBXaGV0aGVyIGEgUHl0aG9uIGxvY2tmaWxlIChwb2V0cnkubG9jayAvIHV2LmxvY2spIGV4aXN0cyBhbnl3aGVyZSBpbiB0aGUgZGlyZWN0b3J5IHRyZWUuICovXG4gIGRvZXNDb250YWluUHl0aG9uTG9ja0FueXdoZXJlOiBib29sZWFuO1xuICBkb2VzQ29udGFpblBvbVhtbDogYm9vbGVhbjtcbiAgLyoqIFdoZXRoZXIgYSBNYXZlbiBwb20ueG1sIGV4aXN0cyBhbnl3aGVyZSBpbiB0aGUgZGlyZWN0b3J5IHRyZWUuICovXG4gIGRvZXNDb250YWluUG9tWG1sQW55d2hlcmU6IGJvb2xlYW47XG4gIGRvZXNDb250YWluUHVic3BlY1lhbWw6IGJvb2xlYW47XG4gIC8qKiBXaGV0aGVyIGEgU2xpZGV2IGRlY2sgKGAqLnNsaWRldi5tZGApIGV4aXN0cyBhbnl3aGVyZSBpbiB0aGUgZGlyZWN0b3J5IHRyZWUuICovXG4gIGRvZXNDb250YWluU2xpZGV2TWQ6IGJvb2xlYW47XG4gIGRvZXNDb250YWluVGF1cmlDb25maWc6IGJvb2xlYW47XG4gIGRvZXNDb250YWluVGF1cmlDb25maWdJblBhY2thZ2VzOiBib29sZWFuO1xuICBkb2VzQ29udGFpblRlbXBsYXRlWWFtbDogYm9vbGVhbjtcbiAgZG9lc0NvbnRhaW5Wc2NvZGVTZXR0aW5nc0pzb246IGJvb2xlYW47XG4gIGRvZXNDb250YWluSmF2YVNjcmlwdDogYm9vbGVhbjtcbiAgZG9lc0NvbnRhaW5UeXBlU2NyaXB0OiBib29sZWFuO1xuICBkb2VzQ29udGFpbkpzeE9yVHN4OiBib29sZWFuO1xuICBkb2VzQ29udGFpbkphdmE6IGJvb2xlYW47XG4gIGRvZXNDb250YWluSmF2YVNjcmlwdEluUGFja2FnZXM6IGJvb2xlYW47XG4gIGRvZXNDb250YWluVHlwZVNjcmlwdEluUGFja2FnZXM6IGJvb2xlYW47XG4gIGRvZXNDb250YWluSnN4T3JUc3hJblBhY2thZ2VzOiBib29sZWFuO1xuICBkb2VzQ29udGFpbkphdmFJblBhY2thZ2VzOiBib29sZWFuO1xuXG4gIGRlcGVuZGluZzoge1xuICAgIGJsaXR6OiBib29sZWFuO1xuICAgIGZpcmViYXNlOiBib29sZWFuO1xuICAgIGdlbkkxOG5UczogYm9vbGVhbjtcbiAgICBsaXRlc3RyZWFtOiBib29sZWFuO1xuICAgIG5leHQ6IGJvb2xlYW47XG4gICAgcGxheXdyaWdodFRlc3Q6IGJvb2xlYW47XG4gICAgcGxheXdyaWdodFJ1bnRpbWU6IGJvb2xlYW47XG4gICAgcHJpc21hOiBib29sZWFuO1xuICAgIHB5cmlnaHQ6IGJvb2xlYW47XG4gICAgcmVhY3Q6IGJvb2xlYW47XG4gICAgcmVhY3ROYXRpdmU6IGJvb2xlYW47XG4gICAgc2VtYW50aWNSZWxlYXNlOiBib29sZWFuO1xuICAgIHNsaWRldjogYm9vbGVhbjtcbiAgICBzdG9yeWJvb2s6IGJvb2xlYW47XG4gICAgdGF1cmk6IGJvb2xlYW47XG4gICAgdmluZXh0OiBib29sZWFuO1xuICAgIHZpdGU6IGJvb2xlYW47XG4gICAgd2I6IGJvb2xlYW47XG4gICAgY2hha3JhOiBib29sZWFuO1xuICAgIGRyaXp6bGU6IGJvb2xlYW47XG4gIH07XG4gIHJlbGVhc2U6IHtcbiAgICBicmFuY2hlczogc3RyaW5nW107XG4gICAgZ2l0aHViOiBib29sZWFuO1xuICAgIG5wbTogYm9vbGVhbjtcbiAgICAvKipcbiAgICAgKiBBbiBleHBsaWNpdCBgQHNlbWFudGljLXJlbGVhc2UvbnBtYCBwbHVnaW4gZW50cnkgcHVibGlzaGVzIHRoZSByb290IG1hbmlmZXN0IGl0c2VsZlxuICAgICAqIChubyBwa2dSb290IHJlZGlyZWN0aW9uIGFuZCBucG1QdWJsaXNoIG5vdCBkaXNhYmxlZCkuXG4gICAgICovXG4gICAgbnBtUHVibGlzaGVzUm9vdDogYm9vbGVhbjtcbiAgfTtcbiAgbWlzZVRhc2tzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+O1xuICBwYWNrYWdlSnNvbj86IFBhY2thZ2VKc29uO1xuICB3YmZ5SnNvbj86IFdiZnlKc29uO1xufVxuXG50eXBlIFdiZnlKc29uID0gei5pbmZlcjx0eXBlb2Ygd2JmeUpzb25TY2hlbWE+O1xuXG5jb25zdCB3YmZ5SnNvblNjaGVtYSA9IHoub2JqZWN0KHtcbiAgdHlwb3M6IHpcbiAgICAub2JqZWN0KHtcbiAgICAgIGFsbDogei5yZWNvcmQoei5zdHJpbmcoKSwgei5zdHJpbmcoKSkub3B0aW9uYWwoKSxcbiAgICAgIGRvYzogei5yZWNvcmQoei5zdHJpbmcoKSwgei5zdHJpbmcoKSkub3B0aW9uYWwoKSxcbiAgICAgIHRzOiB6LnJlY29yZCh6LnN0cmluZygpLCB6LnN0cmluZygpKS5vcHRpb25hbCgpLFxuICAgICAgdGV4dDogei5yZWNvcmQoei5zdHJpbmcoKSwgei5zdHJpbmcoKSkub3B0aW9uYWwoKSxcbiAgICB9KVxuICAgIC5vcHRpb25hbCgpLFxufSk7XG5cbi8qKlxuICogVGhlIHNlbWFudGljLXJlbGVhc2UgY29uZmlnIGZpbGVzIHdiZnkgZXhwZWN0cywgaW4gY29zbWljb25maWcncyByZXNvbHV0aW9uIG9yZGVyICh0aGUgbGVhZGluZ1xuICogcGFja2FnZS5qc29uIGVudHJ5IGlzIGNoZWNrZWQgYnkgdGhlIGNhbGxlcikuIHdiZnkgZ2VuZXJhdGVzIC5yZWxlYXNlcmMuanNvbjsgdGhlIG90aGVyIHNwZWxsaW5nc1xuICogYXJlIGxpc3RlZCBvbmx5IHRvIGRldGVjdCBhIGhhbmQtd3JpdHRlbiBjb25maWcsIHdob3NlIGZvcm1hdCBKU09OLnBhcnNlIGNhbm5vdCByZWFkIGFuZCB3aG9zZVxuICogcGx1Z2luIGxpc3QgaXMgdGhlcmVmb3JlIHN0YXRpY2FsbHkgdW5pbnNwZWN0YWJsZS5cbiAqL1xuY29uc3Qgc2VtYW50aWNSZWxlYXNlQ29uZmlnU2VhcmNoUGxhY2VzOiB7IGZpbGVOYW1lOiBzdHJpbmc7IGpzb25QYXJzZWFibGU6IGJvb2xlYW4gfVtdID0gW1xuICB7IGZpbGVOYW1lOiAnLnJlbGVhc2VyYycsIGpzb25QYXJzZWFibGU6IHRydWUgfSxcbiAgeyBmaWxlTmFtZTogJy5yZWxlYXNlcmMuanNvbicsIGpzb25QYXJzZWFibGU6IHRydWUgfSxcbiAgeyBmaWxlTmFtZTogJy5yZWxlYXNlcmMueWFtbCcsIGpzb25QYXJzZWFibGU6IGZhbHNlIH0sXG4gIHsgZmlsZU5hbWU6ICcucmVsZWFzZXJjLnltbCcsIGpzb25QYXJzZWFibGU6IGZhbHNlIH0sXG4gIHsgZmlsZU5hbWU6ICcucmVsZWFzZXJjLmpzJywganNvblBhcnNlYWJsZTogZmFsc2UgfSxcbiAgeyBmaWxlTmFtZTogJ3JlbGVhc2UuY29uZmlnLmpzJywganNvblBhcnNlYWJsZTogZmFsc2UgfSxcbl07XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZXRQYWNrYWdlQ29uZmlnKFxuICBkaXJQYXRoOiBzdHJpbmcsXG4gIG9wdGlvbnM/OiB7IGlzUm9vdD86IGJvb2xlYW4gfVxuKTogUHJvbWlzZTxQYWNrYWdlQ29uZmlnIHwgdW5kZWZpbmVkPiB7XG4gIGNvbnN0IHBhY2thZ2VKc29uUGF0aCA9IHBhdGgucmVzb2x2ZShkaXJQYXRoLCAncGFja2FnZS5qc29uJyk7XG4gIHRyeSB7XG4gICAgY29uc3QgZG9lc0NvbnRhaW5QYWNrYWdlSnNvbiA9IGZzLmV4aXN0c1N5bmMocGFja2FnZUpzb25QYXRoKTtcbiAgICBsZXQgZGVwZW5kZW5jaWVzOiBQYWNrYWdlSnNvblsnZGVwZW5kZW5jaWVzJ10gPSB7fTtcbiAgICBsZXQgZGV2RGVwZW5kZW5jaWVzOiBQYWNrYWdlSnNvblsnZGV2RGVwZW5kZW5jaWVzJ10gPSB7fTtcbiAgICBsZXQgcGFja2FnZUpzb246IFBhY2thZ2VKc29uID0ge307XG4gICAgbGV0IGVzbVBhY2thZ2UgPSBmYWxzZTtcbiAgICBpZiAoZG9lc0NvbnRhaW5QYWNrYWdlSnNvbikge1xuICAgICAgY29uc3QgcGFja2FnZUpzb25UZXh0ID0gZnMucmVhZEZpbGVTeW5jKHBhY2thZ2VKc29uUGF0aCwgJ3V0ZjgnKTtcbiAgICAgIHBhY2thZ2VKc29uID0gSlNPTi5wYXJzZShwYWNrYWdlSnNvblRleHQpIGFzIFBhY2thZ2VKc29uO1xuICAgICAgZGVwZW5kZW5jaWVzID0gcGFja2FnZUpzb24uZGVwZW5kZW5jaWVzID8/IHt9O1xuICAgICAgZGV2RGVwZW5kZW5jaWVzID0gcGFja2FnZUpzb24uZGV2RGVwZW5kZW5jaWVzID8/IHt9O1xuICAgICAgZXNtUGFja2FnZSA9IHBhY2thZ2VKc29uLnR5cGUgPT09ICdtb2R1bGUnO1xuICAgIH1cblxuICAgIGxldCByZWxlYXNlQnJhbmNoZXM6IHN0cmluZ1tdID0gW107XG4gICAgbGV0IHJlbGVhc2VQbHVnaW5zOiBzdHJpbmdbXSA9IFtdO1xuICAgIGxldCByZWxlYXNlUGx1Z2luc0FyZUV4cGxpY2l0ID0gZmFsc2U7XG4gICAgbGV0IHJlbGVhc2VOcG1QbHVnaW5QdWJsaXNoZXNSb290ID0gZmFsc2U7XG4gICAgLy8gVGhlIEZJUlNUIGV4aXN0aW5nIHNlYXJjaCBwbGFjZSB3aW5zIChjb3NtaWNvbmZpZyBzaG9ydC1jaXJjdWl0cyksIHNvIGEgSlMvWUFNTC9UUyBjb25maWdcbiAgICAvLyBvciBhbiBgZXh0ZW5kc2AgcHJlc2V0IG1ha2VzIHRoZSBlZmZlY3RpdmUgcGx1Z2luIGxpc3Qgc3RhdGljYWxseSB1bmluc3BlY3RhYmxlIChtaXJyb3JzXG4gICAgLy8gcmVhZEV4cGxpY2l0U2VtYW50aWNSZWxlYXNlUGx1Z2lucyBpbiB3YidzIHJlbGVhc2UudHMpLiBUcmVhdGluZyBpdCBhcyB1bmtub3duIGtlZXBzXG4gICAgLy8gYHJlbGVhc2UubnBtYCBjb25zZXJ2YXRpdmVseSB0cnVlLCBzbyBhcHBseVBhY2thZ2VKc29uQ29udmVudGlvbnMgbmV2ZXIgZm9yY2VzXG4gICAgLy8gYHByaXZhdGU6IHRydWVgIG9uIGEgbW9ub3JlcG8gdGhhdCBhY3R1YWxseSBwdWJsaXNoZXMgdG8gbnBtLlxuICAgIGxldCByZWxlYXNlUGx1Z2luc0FyZVVua25vd24gPSBmYWxzZTtcbiAgICB0cnkge1xuICAgICAgdHlwZSBSZWxlYXNlQ29uZmlnID1cbiAgICAgICAgfCB7XG4gICAgICAgICAgICBicmFuY2hlcz86IHVua25vd247XG4gICAgICAgICAgICBwbHVnaW5zPzogKHN0cmluZyB8IFtzdHJpbmcsIFJlY29yZDxzdHJpbmcsIHVua25vd24+XSlbXTtcbiAgICAgICAgICAgIGV4dGVuZHM/OiB1bmtub3duO1xuICAgICAgICAgIH1cbiAgICAgICAgfCB1bmRlZmluZWQ7XG4gICAgICAvLyBjb3NtaWNvbmZpZyBzZWFyY2hlcyBwYWNrYWdlLmpzb24ncyBgcmVsZWFzZWAga2V5IEJFRk9SRSBhbnkgcmMvY29uZmlnIGZpbGVcbiAgICAgIC8vIChzZW1hbnRpYy1yZWxlYXNlIDI1IGRlbGVnYXRlcyB0byBjb3NtaWNvbmZpZyA5J3MgZGVmYXVsdCBzZWFyY2hQbGFjZXMpLlxuICAgICAgbGV0IHJlbGVhc2VDb25maWcgPSAocGFja2FnZUpzb24gYXMgeyByZWxlYXNlPzogUmVsZWFzZUNvbmZpZyB9KS5yZWxlYXNlO1xuICAgICAgaWYgKHJlbGVhc2VDb25maWcgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICBmb3IgKGNvbnN0IHsgZmlsZU5hbWUsIGpzb25QYXJzZWFibGUgfSBvZiBzZW1hbnRpY1JlbGVhc2VDb25maWdTZWFyY2hQbGFjZXMpIHtcbiAgICAgICAgICBjb25zdCByZWxlYXNlcmNQYXRoID0gcGF0aC5yZXNvbHZlKGRpclBhdGgsIGZpbGVOYW1lKTtcbiAgICAgICAgICBpZiAoIWZzLmV4aXN0c1N5bmMocmVsZWFzZXJjUGF0aCkpIGNvbnRpbnVlO1xuICAgICAgICAgIGlmICghanNvblBhcnNlYWJsZSkge1xuICAgICAgICAgICAgcmVsZWFzZVBsdWdpbnNBcmVVbmtub3duID0gdHJ1ZTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgICAvLyBgLnJlbGVhc2VyY2AgYW5kIGAuY29uZmlnL3JlbGVhc2VyY2AgbWF5IGFsc28gaG9sZCBZQU1MOyBhIEpTT04ucGFyc2UgZmFpbHVyZSBsYW5kc1xuICAgICAgICAgIC8vIGluIHRoZSBjYXRjaCBiZWxvdyBhbmQgbWFya3MgdGhlIHBsdWdpbiBsaXN0IHVua25vd24gaW5zdGVhZCBvZiBzaWxlbnRseSByZXBvcnRpbmdcbiAgICAgICAgICAvLyBcIm5vIHBsdWdpbnNcIi5cbiAgICAgICAgICByZWxlYXNlQ29uZmlnID0gSlNPTi5wYXJzZShhd2FpdCBmc3AucmVhZEZpbGUocmVsZWFzZXJjUGF0aCwgJ3V0ZjgnKSkgYXMgUmVsZWFzZUNvbmZpZztcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgLy8gc2VtYW50aWMtcmVsZWFzZSBhY2NlcHRzIGEgc2NhbGFyIGJyYW5jaCBvciBicmFuY2ggb2JqZWN0cyAoeyBuYW1lLCBwcmVyZWxlYXNlLCAuLi4gfSk7XG4gICAgICAvLyBub3JtYWxpemUgdG8gcGxhaW4gYnJhbmNoIG5hbWVzIGZvciBjb25zdW1lcnMgc3VjaCBhcyB0aGUgd29ya2Zsb3cgZ2VuZXJhdG9yLlxuICAgICAgY29uc3QgcmF3QnJhbmNoZXMgPSByZWxlYXNlQ29uZmlnPy5icmFuY2hlcztcbiAgICAgIHJlbGVhc2VCcmFuY2hlcyA9IChBcnJheS5pc0FycmF5KHJhd0JyYW5jaGVzKSA/IHJhd0JyYW5jaGVzIDogcmF3QnJhbmNoZXMgPT09IHVuZGVmaW5lZCA/IFtdIDogW3Jhd0JyYW5jaGVzXSlcbiAgICAgICAgLm1hcCgoYnJhbmNoOiB1bmtub3duKSA9PlxuICAgICAgICAgIHR5cGVvZiBicmFuY2ggPT09ICdzdHJpbmcnID8gYnJhbmNoIDogKGJyYW5jaCBhcyB7IG5hbWU/OiB1bmtub3duIH0gfCB1bmRlZmluZWQpPy5uYW1lXG4gICAgICAgIClcbiAgICAgICAgLmZpbHRlcigoYnJhbmNoTmFtZSk6IGJyYW5jaE5hbWUgaXMgc3RyaW5nID0+IHR5cGVvZiBicmFuY2hOYW1lID09PSAnc3RyaW5nJyk7XG4gICAgICBpZiAoQXJyYXkuaXNBcnJheShyZWxlYXNlQ29uZmlnPy5wbHVnaW5zKSkge1xuICAgICAgICByZWxlYXNlUGx1Z2luc0FyZUV4cGxpY2l0ID0gdHJ1ZTtcbiAgICAgICAgZm9yIChjb25zdCBwbHVnaW5FbnRyeSBvZiByZWxlYXNlQ29uZmlnLnBsdWdpbnMpIHtcbiAgICAgICAgICBjb25zdCBbcGx1Z2luTmFtZSwgcGx1Z2luT3B0aW9uc10gPSBBcnJheS5pc0FycmF5KHBsdWdpbkVudHJ5KSA/IHBsdWdpbkVudHJ5IDogW3BsdWdpbkVudHJ5LCB1bmRlZmluZWRdO1xuICAgICAgICAgIGlmICh0eXBlb2YgcGx1Z2luTmFtZSAhPT0gJ3N0cmluZycpIGNvbnRpbnVlO1xuICAgICAgICAgIHJlbGVhc2VQbHVnaW5zLnB1c2gocGx1Z2luTmFtZSk7XG4gICAgICAgICAgaWYgKHBsdWdpbk5hbWUgIT09ICdAc2VtYW50aWMtcmVsZWFzZS9ucG0nKSBjb250aW51ZTtcbiAgICAgICAgICAvLyBXaXRoIHBrZ1Jvb3QgdGhlIHBsdWdpbiBwdWJsaXNoZXMgYW5vdGhlciBtYW5pZmVzdCAoaXQgcmVzb2x2ZXMgcGtnUm9vdCBhZ2FpbnN0IHRoZVxuICAgICAgICAgIC8vIHJlcG8gcm9vdCwgc28gYC5gIGFuZCBgLi9gIGJvdGggbWVhbiB0aGUgcm9vdCBpdHNlbGYpLCBhbmQgbnBtUHVibGlzaDogZmFsc2VcbiAgICAgICAgICAvLyBkaXNhYmxlcyBwdWJsaXNoaW5nIGVudGlyZWx5OyBvbmx5IHRoZSByZW1haW5pbmcgc2hhcGUgcHJvdmVzIHRoZSBST09UIGlzIHB1Ymxpc2hlZC5cbiAgICAgICAgICBjb25zdCBwa2dSb290ID0gcGx1Z2luT3B0aW9ucz8ucGtnUm9vdDtcbiAgICAgICAgICBjb25zdCBwdWJsaXNoZXNSb290ID1cbiAgICAgICAgICAgIHBsdWdpbk9wdGlvbnM/Lm5wbVB1Ymxpc2ggIT09IGZhbHNlICYmXG4gICAgICAgICAgICAocGtnUm9vdCA9PT0gdW5kZWZpbmVkIHx8XG4gICAgICAgICAgICAgICh0eXBlb2YgcGtnUm9vdCA9PT0gJ3N0cmluZycgJiYgcGF0aC5yZXNvbHZlKGRpclBhdGgsIHBrZ1Jvb3QpID09PSBwYXRoLnJlc29sdmUoZGlyUGF0aCkpKTtcbiAgICAgICAgICByZWxlYXNlTnBtUGx1Z2luUHVibGlzaGVzUm9vdCB8fD0gcHVibGlzaGVzUm9vdDtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChyZWxlYXNlQ29uZmlnICYmIHJlbGVhc2VDb25maWcuZXh0ZW5kcyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHJlbGVhc2VQbHVnaW5zQXJlVW5rbm93biA9IHRydWU7XG4gICAgICB9XG4gICAgfSBjYXRjaCB7XG4gICAgICByZWxlYXNlUGx1Z2luc0FyZVVua25vd24gPSB0cnVlO1xuICAgIH1cbiAgICAvLyBXaXRob3V0IGFuIGV4cGxpY2l0IHBsdWdpbiBsaXN0LCBzZW1hbnRpYy1yZWxlYXNlJ3MgZGVmYXVsdCBsaXN0IGFwcGxpZXMsIHdoaWNoIGluY2x1ZGVzXG4gICAgLy8gQHNlbWFudGljLXJlbGVhc2UvbnBtIGFuZCBAc2VtYW50aWMtcmVsZWFzZS9naXRodWIgKG1pcnJvcnMgcmVsZWFzZVB1Ymxpc2hlc1RvTnBtIGluIHdiJ3NcbiAgICAvLyByZWxlYXNlLnRzKS5cbiAgICBjb25zdCB1c2VzU2VtYW50aWNSZWxlYXNlID0gISEoXG4gICAgICBkZXZEZXBlbmRlbmNpZXNbJ3NlbWFudGljLXJlbGVhc2UnXSB8fFxuICAgICAgcmVsZWFzZUJyYW5jaGVzLmxlbmd0aCA+IDAgfHxcbiAgICAgIHJlbGVhc2VQbHVnaW5zLmxlbmd0aCA+IDAgfHxcbiAgICAgIHJlbGVhc2VQbHVnaW5zQXJlVW5rbm93blxuICAgICk7XG5cbiAgICAvLyBUaGUgY2FsbGVyIG1heSBjbGFzc2lmeSBleHBsaWNpdGx5IChpbmRleC50cyBwYXNzZXMgZmFsc2UgZm9yIGV2ZXJ5IGRpc2NvdmVyZWQgd29ya3NwYWNlLFxuICAgIC8vIGluY2x1ZGluZyBub24tcGFja2FnZXMvKiBsYXlvdXRzIHN1Y2ggYXMgYXBwcy8qKTsgdGhlIGhldXJpc3RpYyBjbGFzc2lmaWVzIHRoZSBDTEkgZW50cnlcbiAgICAvLyBwYXRoIGl0c2VsZiwgc28gYHdiZnkgPHJlcG8+L3BhY2thZ2VzLzxhcHA+YCBhbmQgYHdiZnkgPHJlcG8+L2FwcHMvPGFwcD5gIGtlZXAgdGhlaXIgY2hpbGRcbiAgICAvLyBjbGFzc2lmaWNhdGlvbi5cbiAgICBjb25zdCBpc1Jvb3QgPSBvcHRpb25zPy5pc1Jvb3QgPz8gIWlzV29ya3NwYWNlT2ZFbmNsb3NpbmdSb290KGRpclBhdGgpO1xuXG4gICAgbGV0IHJlcG9JbmZvOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB8IHVuZGVmaW5lZDtcbiAgICAvLyBGZXRjaCB2aXNpYmlsaXR5IGZvciB0aGUgQ0xJIGVudHJ5IGV2ZW4gd2hlbiBpdCBpcyBhIHdvcmtzcGFjZSBjaGlsZCAoYHdiZnlcbiAgICAvLyA8cmVwbz4vcGFja2FnZXMvPGFwcD5gKTogZ2VuZXJhdG9ycyByZWFkIGlzUHVibGljUmVwbyBmcm9tIHRoZWlyIHJvb3RDb25maWcgcGFyYW1ldGVyLFxuICAgIC8vIHdoaWNoIElTIHRoZSBjaGlsZCBjb25maWcgaW4gdGhhdCBpbnZvY2F0aW9uLCBzbyBhIHN0dWIgYGZhbHNlYCB0aGVyZSB3b3VsZCBkcm9wIHRoZVxuICAgIC8vIHB1YmxpYy1yZXBvIHB1Ymxpc2hDb25maWcgaGFuZGxpbmcuIERpc2NvdmVyZWQgY2hpbGRyZW4gKG9wdGlvbnMuaXNSb290ID09PSBmYWxzZSkgc3RpbGxcbiAgICAvLyBza2lwIHRoZSBmZXRjaCDigJQgdGhleSBpbmhlcml0IHRoZSBlbmNsb3Npbmcgcm9vdCdzIHZpc2liaWxpdHkgdmlhIHJvb3RDb25maWcgaW5zdGVhZC5cbiAgICBpZiAob3B0aW9ucz8uaXNSb290ICE9PSBmYWxzZSkge1xuICAgICAgcmVwb0luZm8gPSBhd2FpdCBmZXRjaFJlcG9JbmZvKGRpclBhdGgsIHBhY2thZ2VKc29uKTtcbiAgICB9XG5cbiAgICBsZXQgZG9ja2VyZmlsZSA9ICcnO1xuICAgIHRyeSB7XG4gICAgICBkb2NrZXJmaWxlID0gYXdhaXQgZnNwLnJlYWRGaWxlKHBhdGgucmVzb2x2ZShkaXJQYXRoLCAnRG9ja2VyZmlsZScpLCAndXRmOCcpO1xuICAgIH0gY2F0Y2gge1xuICAgICAgLy8gZG8gbm90aGluZ1xuICAgIH1cblxuICAgIGNvbnN0IHdiZnlKc29uUGF0aCA9IHBhdGgucmVzb2x2ZShkaXJQYXRoLCAnd2JmeS5qc29uJyk7XG4gICAgbGV0IHdiZnlKc29uOiBXYmZ5SnNvbiB8IHVuZGVmaW5lZDtcbiAgICB0cnkge1xuICAgICAgY29uc3Qgd2JmeUpzb25UZXh0ID0gYXdhaXQgZnNwLnJlYWRGaWxlKHdiZnlKc29uUGF0aCwgJ3V0ZjgnKTtcbiAgICAgIHdiZnlKc29uID0gd2JmeUpzb25TY2hlbWEucGFyc2UoSlNPTi5wYXJzZSh3YmZ5SnNvblRleHQpKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIGRvIG5vdGhpbmdcbiAgICB9XG5cbiAgICBjb25zdCByZXBvRnVsbE5hbWUgPSB0eXBlb2YgcmVwb0luZm8/LmZ1bGxfbmFtZSA9PT0gJ3N0cmluZycgPyByZXBvSW5mby5mdWxsX25hbWUgOiB1bmRlZmluZWQ7XG4gICAgbGV0IHJlcG9BdXRob3I6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgICBsZXQgcmVwb05hbWU6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgICBpZiAocmVwb0Z1bGxOYW1lKSB7XG4gICAgICBjb25zdCByZXBvUGFydHMgPSByZXBvRnVsbE5hbWUuc3BsaXQoJy8nKTtcbiAgICAgIGlmIChyZXBvUGFydHMubGVuZ3RoID49IDIpIHtcbiAgICAgICAgcmVwb0F1dGhvciA9IHJlcG9QYXJ0c1swXTtcbiAgICAgICAgcmVwb05hbWUgPSByZXBvUGFydHNbMV07XG4gICAgICB9XG4gICAgfVxuICAgIC8vIE9ubHkgdGhlIHJvb3QgZmV0Y2hlcyByZXBvIGluZm8sIGFuZCB0aGF0IGZldGNoIG5lZWRzIG5ldHdvcmsgYW5kIGEgdG9rZW4sIHNvIGlkZW50aXR5LWRlcml2ZWRcbiAgICAvLyBmbGFncyBiZWxvdyB3b3VsZCBvdGhlcndpc2UgYmUgZmFsc2UgZm9yIGV2ZXJ5IHdvcmtzcGFjZSBwYWNrYWdlIGFuZCBmb3IgZXZlcnkgb2ZmbGluZSBvclxuICAgIC8vIHJhdGUtbGltaXRlZCBydW4uIFRoZSBnaXQgcmVtb3RlIGFuc3dlcnMgdGhlIHNhbWUgcXVlc3Rpb24gbG9jYWxseSwgZm9yIGV2ZXJ5IHBhY2thZ2UuXG4gICAgaWYgKCFyZXBvQXV0aG9yIHx8ICFyZXBvTmFtZSkge1xuICAgICAgW3JlcG9BdXRob3IsIHJlcG9OYW1lXSA9IGF3YWl0IHJlc29sdmVMb2NhbFJlcG9JZGVudGl0eShkaXJQYXRoLCBwYWNrYWdlSnNvbik7XG4gICAgfVxuICAgIC8vIEJ1aWx0IGZyb20gdGhlIFJFU09MVkVEIGlkZW50aXR5IHNvIHdvcmtzcGFjZSBwYWNrYWdlcyBhbmQgb2ZmbGluZSBydW5zIGFsc28gZ2V0IGl0OyBjb25zdW1lcnMgZGVyaXZlXG4gICAgLy8gdGhlIG93bmVyIGZyb20gdGhpcyBmaWVsZCAoZS5nLiB0byBzZXQgYGF1dGhvcmApLlxuICAgIGNvbnN0IHJlcG9zaXRvcnkgPSByZXBvQXV0aG9yICYmIHJlcG9OYW1lID8gYGdpdGh1Yjoke3JlcG9BdXRob3J9LyR7cmVwb05hbWV9YCA6IHVuZGVmaW5lZDtcbiAgICAvLyBUYXVyaSBvZmZpY2lhbGx5IHN1cHBvcnRzIEpTT04sIEpTT041LCBhbmQgVE9NTCBjb25maWd1cmF0aW9uIGZvcm1hdHMuXG4gICAgY29uc3QgZG9lc0NvbnRhaW5UYXVyaUNvbmZpZyA9IFsndGF1cmkuY29uZi5qc29uJywgJ3RhdXJpLmNvbmYuanNvbjUnLCAnVGF1cmkudG9tbCddLnNvbWUoKGZpbGVOYW1lKSA9PlxuICAgICAgZnMuZXhpc3RzU3luYyhwYXRoLnJlc29sdmUoZGlyUGF0aCwgJ3NyYy10YXVyaScsIGZpbGVOYW1lKSlcbiAgICApO1xuICAgIC8vIFJvb3QtbGV2ZWwgXCJJblBhY2thZ2VzXCIgc2lnbmFscyBtdXN0IHNlZSBldmVyeSBkZWNsYXJlZCB3b3Jrc3BhY2UgbGF5b3V0IChlLmcuIGFwcHMvKiksIG5vdFxuICAgIC8vIGp1c3QgdGhlIGNvbnZlbnRpb25hbCBwYWNrYWdlcy8qIGRpcmVjdG9yeSwgc28gc2NhbiBlYWNoIGRpc2NvdmVyZWQgd29ya3NwYWNlIGRpcmVjdG9yeS5cbiAgICBjb25zdCB3b3Jrc3BhY2VTdWJEaXJQYXRocyA9IGdldFdvcmtzcGFjZVN1YkRpclBhdGhzKHtcbiAgICAgIGRpclBhdGgsXG4gICAgICBwYWNrYWdlSnNvbixcbiAgICAgIGRvZXNDb250YWluU3ViUGFja2FnZUpzb25zOiBjb250YWluc0FueSgncGFja2FnZXMvKi9wYWNrYWdlLmpzb24nLCBkaXJQYXRoKSxcbiAgICB9KTtcbiAgICBjb25zdCBjb250YWluc0FueUluV29ya3NwYWNlcyA9IChwYXR0ZXJuOiBzdHJpbmcpOiBib29sZWFuID0+XG4gICAgICB3b3Jrc3BhY2VTdWJEaXJQYXRocy5zb21lKCh3b3Jrc3BhY2VTdWJEaXJQYXRoKSA9PiBjb250YWluc0FueShwYXR0ZXJuLCB3b3Jrc3BhY2VTdWJEaXJQYXRoKSk7XG4gICAgY29uc3QgZG9lc0NvbnRhaW5XcmFuZ2xlckNvbmZpZyA9IGRldGVjdFdyYW5nbGVyQ29uZmlnKGRpclBhdGgpO1xuICAgIGNvbnN0IHdvcmtmbG93Q29udGVudHMgPSByZWFkV29ya2Zsb3dGaWxlQ29udGVudHMoZGlyUGF0aCk7XG4gICAgY29uc3QgaW1wb3J0c1BsYXl3cmlnaHRBdFJ1bnRpbWUgPSBkZXRlY3RQbGF5d3JpZ2h0UnVudGltZUltcG9ydChkaXJQYXRoKTtcbiAgICBjb25zdCBjb25maWc6IFBhY2thZ2VDb25maWcgPSB7XG4gICAgICBkaXJQYXRoLFxuICAgICAgZG9ja2VyZmlsZSxcbiAgICAgIGlzUm9vdCxcbiAgICAgIGlzUHVibGljUmVwbzogcmVwb0luZm8/LnByaXZhdGUgPT09IGZhbHNlLFxuICAgICAgaXNSZXBvVmlzaWJpbGl0eUtub3duOiB0eXBlb2YgcmVwb0luZm8/LnByaXZhdGUgPT09ICdib29sZWFuJyxcbiAgICAgIGlzUmVmZXJyZWRCeU90aGVyUmVwbzogISFwYWNrYWdlSnNvbi5maWxlcyxcbiAgICAgIHJlcG9zaXRvcnksXG4gICAgICByZXBvQXV0aG9yLFxuICAgICAgcmVwb05hbWUsXG4gICAgICBpc1dpbGxCb29zdGVyUmVwbzogQm9vbGVhbihcbiAgICAgICAgcmVwb3NpdG9yeT8uc3RhcnRzV2l0aCgnZ2l0aHViOldpbGxCb29zdGVyLycpIHx8IHJlcG9zaXRvcnk/LnN0YXJ0c1dpdGgoJ2dpdGh1YjpXaWxsQm9vc3RlckxhYi8nKVxuICAgICAgKSxcbiAgICAgIGlzQ2xvdWRmbGFyZTogZGV0ZWN0Q2xvdWRmbGFyZShwYWNrYWdlSnNvbiwgZG9lc0NvbnRhaW5XcmFuZ2xlckNvbmZpZywgd29ya2Zsb3dDb250ZW50cyksXG4gICAgICBkb2VzQ29udGFpbldyYW5nbGVyQ29uZmlnLFxuICAgICAgaXNSYWlsd2F5OiBkZXRlY3RSYWlsd2F5KGRpclBhdGgsIHBhY2thZ2VKc29uLCB3b3JrZmxvd0NvbnRlbnRzKSxcbiAgICAgIGlzRXNtUGFja2FnZTogZXNtUGFja2FnZSxcbiAgICAgIGlzV2lsbEJvb3N0ZXJDb25maWdzOiBkZXRlY3RJc1dpbGxCb29zdGVyQ29uZmlncyhkaXJQYXRoLCBwYWNrYWdlSnNvblBhdGgsIHJlcG9OYW1lKSxcbiAgICAgIGNhcmdvVG9tbERpclBhdGhzOiBmaW5kQ2FyZ29Ub21sRGlyUGF0aHMoZGlyUGF0aCksXG4gICAgICAvLyBBbHNvIGhvbm9yIGRlY2xhcmVkIHdvcmtzcGFjZSBwYXR0ZXJucyBiZXlvbmQgcGFja2FnZXMvKiAoZS5nLiBhcHBzLyopOiB0cmVhdGluZyBhblxuICAgICAgLy8gYXBwcy8qLW9ubHkgbW9ub3JlcG8gYXMgYSBwbGFpbiBwYWNrYWdlIHdvdWxkIGRlbGV0ZSBpdHMgYHdvcmtzcGFjZXNgIGRlY2xhcmF0aW9uIGluXG4gICAgICAvLyBnZW5lcmF0ZVBhY2thZ2VKc29uIGFuZCBza2lwIG1vbm9yZXBvLW9ubHkgY29udmVudGlvbnMgc3VjaCBhcyByb290IGBwcml2YXRlOiB0cnVlYC5cbiAgICAgIGRvZXNDb250YWluU3ViUGFja2FnZUpzb25zOiBjb250YWluc0FueSgncGFja2FnZXMvKiovcGFja2FnZS5qc29uJywgZGlyUGF0aCkgfHwgd29ya3NwYWNlU3ViRGlyUGF0aHMubGVuZ3RoID4gMCxcbiAgICAgIGRvZXNDb250YWluRG9ja2VyZmlsZTogISFkb2NrZXJmaWxlIHx8IGZzLmV4aXN0c1N5bmMocGF0aC5yZXNvbHZlKGRpclBhdGgsICdkb2NrZXItY29tcG9zZS55bWwnKSksXG4gICAgICBkb2VzQ29udGFpbkdlbWZpbGU6IGZzLmV4aXN0c1N5bmMocGF0aC5yZXNvbHZlKGRpclBhdGgsICdHZW1maWxlJykpLFxuICAgICAgZG9lc0NvbnRhaW5Hb01vZDogZnMuZXhpc3RzU3luYyhwYXRoLnJlc29sdmUoZGlyUGF0aCwgJ2dvLm1vZCcpKSxcbiAgICAgIGRvZXNDb250YWluUGFja2FnZUpzb24sXG4gICAgICBkb2VzQ29udGFpblBvZXRyeUxvY2s6IGZzLmV4aXN0c1N5bmMocGF0aC5yZXNvbHZlKGRpclBhdGgsICdwb2V0cnkubG9jaycpKSxcbiAgICAgIGRvZXNDb250YWluVXZMb2NrOiBmcy5leGlzdHNTeW5jKHBhdGgucmVzb2x2ZShkaXJQYXRoLCAndXYubG9jaycpKSxcbiAgICAgIC8vIFJlY3Vyc2l2ZSBsaWtlIGRvZXNDb250YWluSmF2YTogbXVsdGktbGFuZ3VhZ2UgcmVwb3NpdG9yaWVzIGtlZXAgbGFuZ3VhZ2UgZGlyZWN0b3JpZXNcbiAgICAgIC8vIChlLmcuIFB5dGhvbiB0b29saW5nIG9yIE1hdmVuIG1vZHVsZXMpIG91dHNpZGUgdGhlIHJvb3QgYW5kIG91dHNpZGUgZGVjbGFyZWQgd29ya3NwYWNlcy5cbiAgICAgIGRvZXNDb250YWluUHl0aG9uTG9ja0FueXdoZXJlOiBjb250YWluc0FueSgnKiove3BvZXRyeS5sb2NrLHV2LmxvY2t9JywgZGlyUGF0aCksXG4gICAgICBkb2VzQ29udGFpblBvbVhtbDogZnMuZXhpc3RzU3luYyhwYXRoLnJlc29sdmUoZGlyUGF0aCwgJ3BvbS54bWwnKSksXG4gICAgICBkb2VzQ29udGFpblBvbVhtbEFueXdoZXJlOiBjb250YWluc0FueSgnKiovcG9tLnhtbCcsIGRpclBhdGgpLFxuICAgICAgZG9lc0NvbnRhaW5QdWJzcGVjWWFtbDogZnMuZXhpc3RzU3luYyhwYXRoLnJlc29sdmUoZGlyUGF0aCwgJ3B1YnNwZWMueWFtbCcpKSxcbiAgICAgIGRvZXNDb250YWluU2xpZGV2TWQ6IGNvbnRhaW5zQW55KCcqKi8qLnNsaWRldi5tZCcsIGRpclBhdGgpLFxuICAgICAgZG9lc0NvbnRhaW5UYXVyaUNvbmZpZyxcbiAgICAgIGRvZXNDb250YWluVGF1cmlDb25maWdJblBhY2thZ2VzOiBjb250YWluc0FueUluV29ya3NwYWNlcyhcbiAgICAgICAgJ3NyYy10YXVyaS97dGF1cmkuY29uZi5qc29uLHRhdXJpLmNvbmYuanNvbjUsVGF1cmkudG9tbH0nXG4gICAgICApLFxuICAgICAgZG9lc0NvbnRhaW5UZW1wbGF0ZVlhbWw6IGZzLmV4aXN0c1N5bmMocGF0aC5yZXNvbHZlKGRpclBhdGgsICd0ZW1wbGF0ZS55YW1sJykpLFxuICAgICAgZG9lc0NvbnRhaW5Wc2NvZGVTZXR0aW5nc0pzb246IGZzLmV4aXN0c1N5bmMocGF0aC5yZXNvbHZlKGRpclBhdGgsICcudnNjb2RlJywgJ3NldHRpbmdzLmpzb24nKSksXG4gICAgICBkb2VzQ29udGFpbkphdmFTY3JpcHQ6IGNvbnRhaW5zQW55KCd7YXBwLHNyYyx0ZXN0LHNjcmlwdHN9LyoqLyoue2NqcyxtanMsanMsanN4fScsIGRpclBhdGgpLFxuICAgICAgZG9lc0NvbnRhaW5UeXBlU2NyaXB0OiBjb250YWluc0FueSgne2FwcCxzcmMsdGVzdCxzY3JpcHRzfS8qKi8qLntjdHMsbXRzLHRzLHRzeH0nLCBkaXJQYXRoKSxcbiAgICAgIGRvZXNDb250YWluSnN4T3JUc3g6IGNvbnRhaW5zQW55KCd7YXBwLHNyYyx0ZXN0fS8qKi8qLnt0LGp9c3gnLCBkaXJQYXRoKSxcbiAgICAgIGRvZXNDb250YWluSmF2YTogY29udGFpbnNBbnkoJyoqLyouamF2YScsIGRpclBhdGgpLFxuICAgICAgZG9lc0NvbnRhaW5KYXZhU2NyaXB0SW5QYWNrYWdlczogY29udGFpbnNBbnlJbldvcmtzcGFjZXMoJ3thcHAsc3JjLHRlc3Qsc2NyaXB0c30vKiovKi57Y2pzLG1qcyxqcyxqc3h9JyksXG4gICAgICBkb2VzQ29udGFpblR5cGVTY3JpcHRJblBhY2thZ2VzOiBjb250YWluc0FueUluV29ya3NwYWNlcygne2FwcCxzcmMsdGVzdCxzY3JpcHRzfS8qKi8qLntjdHMsbXRzLHRzLHRzeH0nKSxcbiAgICAgIGRvZXNDb250YWluSnN4T3JUc3hJblBhY2thZ2VzOiBjb250YWluc0FueUluV29ya3NwYWNlcygne2FwcCxzcmMsdGVzdH0vKiovKi57dCxqfXN4JyksXG4gICAgICBkb2VzQ29udGFpbkphdmFJblBhY2thZ2VzOiBjb250YWluc0FueUluV29ya3NwYWNlcygnKiovKi5qYXZhJyksXG4gICAgICBkZXBlbmRpbmc6IHtcbiAgICAgICAgYmxpdHo6ICEhZGVwZW5kZW5jaWVzLmJsaXR6LFxuICAgICAgICBjaGFrcmE6ICEhZGV2RGVwZW5kZW5jaWVzWydAY2hha3JhLXVpL2NsaSddLFxuICAgICAgICBkcml6emxlOiAhIWRlcGVuZGVuY2llc1snZHJpenpsZS1vcm0nXSB8fCAhIWRldkRlcGVuZGVuY2llc1snZHJpenpsZS1raXQnXSxcbiAgICAgICAgZmlyZWJhc2U6ICEhZGV2RGVwZW5kZW5jaWVzWydmaXJlYmFzZS10b29scyddLFxuICAgICAgICBnZW5JMThuVHM6ICEhZGVwZW5kZW5jaWVzWydnZW4taTE4bi10cyddIHx8ICEhZGV2RGVwZW5kZW5jaWVzWydnZW4taTE4bi10cyddLFxuICAgICAgICBsaXRlc3RyZWFtOiBkb2NrZXJmaWxlLmluY2x1ZGVzKCdpbnN0YWxsLWxpdGVzdHJlYW0uc2gnKSxcbiAgICAgICAgcmVhY3Q6ICEhZGVwZW5kZW5jaWVzLnJlYWN0LFxuICAgICAgICBuZXh0OiAhIWRlcGVuZGVuY2llcy5uZXh0LFxuICAgICAgICBwbGF5d3JpZ2h0VGVzdDpcbiAgICAgICAgICAhIWRlcGVuZGVuY2llc1snQHBsYXl3cmlnaHQvdGVzdCddIHx8ICEhZGV2RGVwZW5kZW5jaWVzWydAcGxheXdyaWdodC90ZXN0J10gfHwgISFkZXZEZXBlbmRlbmNpZXMucGxheXdyaWdodCxcbiAgICAgICAgcGxheXdyaWdodFJ1bnRpbWU6IGltcG9ydHNQbGF5d3JpZ2h0QXRSdW50aW1lLFxuICAgICAgICBwcmlzbWE6ICEhZGVwZW5kZW5jaWVzWydAcHJpc21hL2NsaWVudCddIHx8ICEhZGV2RGVwZW5kZW5jaWVzLnByaXNtYSxcbiAgICAgICAgcHlyaWdodDogISFkZXZEZXBlbmRlbmNpZXMucHlyaWdodCxcbiAgICAgICAgcmVhY3ROYXRpdmU6ICEhZGVwZW5kZW5jaWVzWydyZWFjdC1uYXRpdmUnXSxcbiAgICAgICAgc2VtYW50aWNSZWxlYXNlOiB1c2VzU2VtYW50aWNSZWxlYXNlLFxuICAgICAgICBzbGlkZXY6ICEhZGVwZW5kZW5jaWVzWydAc2xpZGV2L2NsaSddIHx8ICEhZGV2RGVwZW5kZW5jaWVzWydAc2xpZGV2L2NsaSddLFxuICAgICAgICBzdG9yeWJvb2s6ICEhZGV2RGVwZW5kZW5jaWVzWydAc3Rvcnlib29rL3JlYWN0J10sXG4gICAgICAgIHRhdXJpOlxuICAgICAgICAgICEhZGVwZW5kZW5jaWVzWydAdGF1cmktYXBwcy9hcGknXSB8fFxuICAgICAgICAgICEhZGV2RGVwZW5kZW5jaWVzWydAdGF1cmktYXBwcy9hcGknXSB8fFxuICAgICAgICAgICEhZGVwZW5kZW5jaWVzWydAdGF1cmktYXBwcy9jbGknXSB8fFxuICAgICAgICAgICEhZGV2RGVwZW5kZW5jaWVzWydAdGF1cmktYXBwcy9jbGknXSB8fFxuICAgICAgICAgIGRvZXNDb250YWluVGF1cmlDb25maWcsXG4gICAgICAgIHZpbmV4dDogISFkZXBlbmRlbmNpZXMudmluZXh0IHx8ICEhZGV2RGVwZW5kZW5jaWVzLnZpbmV4dCxcbiAgICAgICAgdml0ZTogISFkZXBlbmRlbmNpZXMudml0ZSB8fCAhIWRldkRlcGVuZGVuY2llcy52aXRlLFxuICAgICAgICB3YjogISFkZXBlbmRlbmNpZXNbJ0B3aWxsYm9vc3Rlci93YiddIHx8ICEhZGV2RGVwZW5kZW5jaWVzWydAd2lsbGJvb3N0ZXIvd2InXSxcbiAgICAgIH0sXG4gICAgICByZWxlYXNlOiB7XG4gICAgICAgIGJyYW5jaGVzOiByZWxlYXNlQnJhbmNoZXMsXG4gICAgICAgIGdpdGh1YjogcmVsZWFzZVBsdWdpbnNBcmVFeHBsaWNpdFxuICAgICAgICAgID8gcmVsZWFzZVBsdWdpbnMuaW5jbHVkZXMoJ0BzZW1hbnRpYy1yZWxlYXNlL2dpdGh1YicpIHx8IHJlbGVhc2VQbHVnaW5zQXJlVW5rbm93blxuICAgICAgICAgIDogdXNlc1NlbWFudGljUmVsZWFzZSxcbiAgICAgICAgbnBtOiByZWxlYXNlUGx1Z2luc0FyZUV4cGxpY2l0XG4gICAgICAgICAgPyByZWxlYXNlUGx1Z2lucy5pbmNsdWRlcygnQHNlbWFudGljLXJlbGVhc2UvbnBtJykgfHwgcmVsZWFzZVBsdWdpbnNBcmVVbmtub3duXG4gICAgICAgICAgOiB1c2VzU2VtYW50aWNSZWxlYXNlLFxuICAgICAgICBucG1QdWJsaXNoZXNSb290OiByZWxlYXNlTnBtUGx1Z2luUHVibGlzaGVzUm9vdCxcbiAgICAgIH0sXG4gICAgICBtaXNlVGFza3M6IGF3YWl0IHJlYWRNaXNlVGFza3MoZGlyUGF0aCksXG4gICAgICBwYWNrYWdlSnNvbixcbiAgICAgIHdiZnlKc29uLFxuICAgIH07XG4gICAgaWYgKFxuICAgICAgY29uZmlnLmRvZXNDb250YWluR2VtZmlsZSB8fFxuICAgICAgY29uZmlnLmRvZXNDb250YWluR29Nb2QgfHxcbiAgICAgIGNvbmZpZy5kb2VzQ29udGFpblBhY2thZ2VKc29uIHx8XG4gICAgICBjb25maWcuZG9lc0NvbnRhaW5Qb2V0cnlMb2NrIHx8XG4gICAgICBjb25maWcuZG9lc0NvbnRhaW5VdkxvY2sgfHxcbiAgICAgIGNvbmZpZy5kb2VzQ29udGFpblBvbVhtbCB8fFxuICAgICAgY29uZmlnLmRvZXNDb250YWluUHVic3BlY1lhbWwgfHxcbiAgICAgIGNvbmZpZy5kb2VzQ29udGFpblRhdXJpQ29uZmlnIHx8XG4gICAgICBjb25maWcuZG9lc0NvbnRhaW5UZW1wbGF0ZVlhbWwgfHxcbiAgICAgIC8vIEEgcmVwb3NpdG9yeSBjYW4gbGVnaXRpbWF0ZWx5IGNvbnRhaW4gb25seSBkb2N1bWVudGF0aW9uLiBJdHMgR2l0IG1ldGFkYXRhIGlzIGVub3VnaCB0b1xuICAgICAgLy8gZXN0YWJsaXNoIHRoYXQgdGhlIENMSSB0YXJnZXQgaXMgYSBwcm9qZWN0IHJvb3Q7IHJlcXVpcmluZyBhIGxhbmd1YWdlIG1hbmlmZXN0IGhlcmUgd291bGRcbiAgICAgIC8vIG1ha2Ugd2JmeSB1bmFibGUgdG8gY3JlYXRlIHRoZSBwYWNrYWdlLmpzb24gdGhhdCBpdCBtYW5hZ2VzIGZvciBzdWNoIHJlcG9zaXRvcmllcy4gQm90aFxuICAgICAgLy8gb3JkaW5hcnkgY2hlY2tvdXRzIChgLmdpdGAgZGlyZWN0b3J5KSBhbmQgd29ya3RyZWVzIChgLmdpdGAgZmlsZSkgc2F0aXNmeSB0aGlzIGNoZWNrLlxuICAgICAgKGNvbmZpZy5pc1Jvb3QgJiYgZnMuZXhpc3RzU3luYyhwYXRoLnJlc29sdmUoZGlyUGF0aCwgJy5naXQnKSkpXG4gICAgKSB7XG4gICAgICByZXR1cm4gY29uZmlnO1xuICAgIH1cbiAgfSBjYXRjaCB7XG4gICAgLy8gZG8gbm90aGluZ1xuICB9XG59XG5cbi8qKlxuICogVGVsbHMgd2hldGhlciB3YmZ5IG1hbmFnZXMgd29ya2VyLWNvbmZpZ3VyYXRpb24uZC50cyBmb3IgdGhlIHBhY2thZ2UuIFRoZSBmaWxlIGlzIGdpdGlnbm9yZWQgYW5kIHVudHJhY2tlZFxuICogYmVjYXVzZSB0aGUgYHdiIGdlbi1jb2RlYCBwb3N0aW5zdGFsbCByZWdlbmVyYXRlcyBpdCBvbiBldmVyeSBpbnN0YWxsLCBzbyB0aGUgcGFja2FnZSBoYXMgdG8gb3duIGEgd3JhbmdsZXJcbiAqIGNvbmZpZyAoYHdyYW5nbGVyIHR5cGVzYCBleGl0cyBub24temVybyB3aXRob3V0IG9uZSksIHRvIGRlcGVuZCBvbiB3cmFuZ2xlciAoYSBwYWNrYWdlIGRlcGxveWluZyB2aWEgYVxuICogQ0kgYWN0aW9uIGNhbm5vdCByZXNvbHZlIHRoZSBjb21tYW5kKSwgYW5kIHRvIGNvbnN1bWUgdGhlIGdlbmVyYXRlZCBmaWxlLlxuICpcbiAqIElOVkFSSUFOVCDigJQgdGhpcyBkZWNpc2lvbiBtdXN0IGNvbnZlcmdlIGFjcm9zcyBtYWNoaW5lcyBob2xkaW5nIHRoZSBzYW1lIGNvbW1pdC4gSXQgbXVzdCBORVZFUiBjb25zdWx0XG4gKiBnaXRpZ25vcmVkIGZpbGVzIChgLmRldi52YXJzKmAsIGAuZW52KmAsIC4uLiksIHdoaWNoIGB3YiBzdGFydGAgYW5kIGB3YiBkZXBsb3lgIGNyZWF0ZSByb3V0aW5lbHkgYW5kIHdoaWNoXG4gKiB0aGVyZWZvcmUgc3RheSB1bnRyYWNrZWQgb24gZGV2IG1hY2hpbmVzIGZvcmV2ZXI6IGEgZm9ybWVyIGNoZWNrIHRoYXQgdHJlYXRlZCB0aGVtIGFzIGlycmVwcm9kdWNpYmxlIGlucHV0c1xuICogbWFkZSB3YmZ5IHJ1bnMgb24gZGV2IG1hY2hpbmVzIHJlLXRyYWNrIHRoZSB+MTVrLWxpbmUgZ2VuZXJhdGVkIGZpbGUgdGhhdCBydW5zIGZyb20gY2xlYW4gY2hlY2tvdXRzIGhhZFxuICogdW50cmFja2VkLCBvc2NpbGxhdGluZyBldGVybmFsbHkgKGUuZy4gYWktZ2FtZS1idWlsZGVyICM2ODQg4oaSICM3NDYpLiBSZWFkaW5nIGNvbW1pdHRhYmxlIHJlcG9zaXRvcnkgZmlsZXNcbiAqIGZyb20gdGhlIHdvcmtpbmcgdHJlZSAodGhlIHdyYW5nbGVyIGNvbmZpZywgcGFja2FnZS5qc29uLCB0c2NvbmZpZyDigJQgYXMgZXZlcnkgd2JmeSBnZW5lcmF0b3IgZG9lcykgaXMgZmluZTpcbiAqIGFueSBkaXZlcmdlbmNlIHRoZXJlIGlzIHRyYW5zaWVudCBhbmQgZGlzYXBwZWFycyBvbmNlIHRoZSBmaWxlIGlzIGNvbW1pdHRlZCBvciByZW1vdmVkLlxuICogVGhlIGhhemFyZCB0aGF0IGNoZWNrIGd1YXJkZWQgYWdhaW5zdCBubyBsb25nZXIgZXhpc3RzOiBgd2IgZ2VuLWNvZGVgIHJ1bnMgYHdyYW5nbGVyIHR5cGVzIC0tZW52LWZpbGVgIHdpdGhcbiAqIGEga2V5IHN0dWIgZGVyaXZlZCBzb2xlbHkgZnJvbSB0aGUgY29tbWl0dGVkIGZub3gudG9tbCAoc2VlIHdiJ3Mgd3JpdGVXb3JrZXJUeXBlc0VudlN0dWIpLCBzbyBsb2NhbCBkb3RlbnZcbiAqIGZpbGVzIG5ldmVyIGluZmx1ZW5jZSB0aGUgZ2VuZXJhdGVkIGBFbnZgLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2VuZXJhdGVzV29ya2VyVHlwZXMoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogYm9vbGVhbiB7XG4gIGNvbnN0IHBhY2thZ2VKc29uID0gY29uZmlnLnBhY2thZ2VKc29uO1xuICByZXR1cm4gY29uZmlnLmRvZXNDb250YWluV3JhbmdsZXJDb25maWcgJiYgaGFzV3JhbmdsZXJEZXBlbmRlbmN5KHBhY2thZ2VKc29uKSAmJiBjb25zdW1lc0dlbmVyYXRlZFdvcmtlclR5cGVzKGNvbmZpZyk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRXb3JrZXJUeXBlc1NjcmlwdEVycm9yKGNvbmZpZzogUGljazxQYWNrYWdlQ29uZmlnLCAncGFja2FnZUpzb24nPik6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IHNjcmlwdHMgPSBjb25maWcucGFja2FnZUpzb24/LnNjcmlwdHMgPz8ge307XG4gIGZvciAoY29uc3QgW25hbWUsIHNjcmlwdF0gb2YgT2JqZWN0LmVudHJpZXMoc2NyaXB0cykpIHtcbiAgICBpZiAoc2NyaXB0ID09PSB1bmRlZmluZWQpIGNvbnRpbnVlO1xuICAgIGNvbnN0IHNlZ21lbnRzID0gc3BsaXRTY3JpcHRTZWdtZW50cyhzY3JpcHQpO1xuICAgIGNvbnN0IGhhc05vbkNhbm9uaWNhbFdiR2VuQ29kZSA9IHNlZ21lbnRzPy5zb21lKChzZWdtZW50KSA9PiB7XG4gICAgICBjb25zdCBub3JtYWxpemVkID0gc2VnbWVudC50cmltKCkucmVwbGFjZUFsbCgvXFxzKy9ndSwgJyAnKTtcbiAgICAgIHJldHVybiAoXG4gICAgICAgIC9eKD86KD86YnVufGJ1bngpKD86IC0tYnVuKT8oPzogcnVuKT8gKT93YiBnZW4tY29kZSQvdS50ZXN0KG5vcm1hbGl6ZWQpICYmXG4gICAgICAgIGNsYXNzaWZ5U2NyaXB0U2VnbWVudChzZWdtZW50LCBzY3JpcHRzLCB0cnVlKSA9PT0gJ2N1c3RvbSdcbiAgICAgICk7XG4gICAgfSk7XG4gICAgaWYgKGhhc05vbkNhbm9uaWNhbFdiR2VuQ29kZSkgcmV0dXJuIGAke25hbWV9IG11c3QgdXNlIHRoZSBjYW5vbmljYWwgYnVuIHdiIGdlbi1jb2RlIGNvbW1hbmRgO1xuICB9XG4gIC8vIE9ubHkgYGJ1biBydW4gPHNjcmlwdD5gIGlzIHJlY29nbml6ZWQgYXMgYSB3cmFwcGVyOyBhbm90aGVyIHJ1bm5lciBzcGVsbGluZyB3b3VsZCBnZXQgYSBtYW5hZ2VkXG4gIC8vIGdlbmVyYXRpb24gYXBwZW5kZWQgbmV4dCB0byBpdCBhbmQgcnVuIGV2ZXJ5IGdlbmVyYXRvciB0d2ljZSBwZXIgaW5zdGFsbC4gV2l0aG91dCBhIGdlbi1jb2RlXG4gIC8vIHBpcGVsaW5lIG5vdGhpbmcgaXMgYXBwZW5kZWQsIHNvIHRoZSBzcGVsbGluZyBpcyBpcnJlbGV2YW50IHRoZXJlLlxuICBmb3IgKGNvbnN0IHNlZ21lbnQgb2Ygc3BsaXRTY3JpcHRTZWdtZW50cyhzY3JpcHRzLnBvc3RpbnN0YWxsID8/ICcnKSA/PyBbXSkge1xuICAgIGNvbnN0IHNjcmlwdE5hbWUgPSAvXig/OmJ1bnxidW54KSg/OlxccystLWJ1bik/KD86XFxzK3J1bik/XFxzKyhcXFMrKSQvdS5leGVjKHNlZ21lbnQpPy5bMV07XG4gICAgY29uc3QgdGFyZ2V0ID0gc2NyaXB0TmFtZSA9PT0gdW5kZWZpbmVkID8gdW5kZWZpbmVkIDogc2NyaXB0c1tzY3JpcHROYW1lXTtcbiAgICBpZiAoXG4gICAgICB0YXJnZXQgIT09IHVuZGVmaW5lZCAmJlxuICAgICAgc2VnbWVudCAhPT0gYGJ1biBydW4gJHtzY3JpcHROYW1lfWAgJiZcbiAgICAgIChzY3JpcHRzWydnZW4tY29kZSddICE9PSB1bmRlZmluZWQgfHwgdGFyZ2V0LmluY2x1ZGVzKCd3YiBnZW4tY29kZScpKVxuICAgICkge1xuICAgICAgcmV0dXJuIGBwb3N0aW5zdGFsbCBtdXN0IGludm9rZSB0aGUgJHtzY3JpcHROYW1lfSBzY3JpcHQgYXMgYnVuIHJ1biAke3NjcmlwdE5hbWV9YDtcbiAgICB9XG4gIH1cbiAgaWYgKFxuICAgIC8oPzpefCYmKVxccyooPzpucG18bnB4fHBucG18eWFybilcXHMrKD86cnVuKD86LXNjcmlwdCk/XFxzKyk/KD86Z2VuLWNvZGV8d2JcXHMrZ2VuLWNvZGUpXFxzKig/OiYmfCQpL3UudGVzdChcbiAgICAgIHNjcmlwdHMucG9zdGluc3RhbGwgPz8gJydcbiAgICApXG4gICkge1xuICAgIHJldHVybiAncG9zdGluc3RhbGwgbXVzdCB1c2UgYnVuIHdiIGdlbi1jb2RlIGluc3RlYWQgb2YgYSBub24tQnVuIGdlbi1jb2RlIHJ1bm5lcic7XG4gIH1cbiAgZm9yIChjb25zdCBbbmFtZSwgc2NyaXB0XSBvZiBPYmplY3QuZW50cmllcyhzY3JpcHRzKSkge1xuICAgIGlmIChzY3JpcHQgPT09IHVuZGVmaW5lZCkgY29udGludWU7XG4gICAgaWYgKHdyYW5nbGVyVHlwZXNUZXh0UGF0dGVybi50ZXN0KHNjcmlwdCkpIHJldHVybiBgJHtuYW1lfSBtdXN0IHVzZSBidW4gd2IgZ2VuLWNvZGUgaW5zdGVhZCBvZiB3cmFuZ2xlciB0eXBlc2A7XG4gIH1cbn1cblxuZnVuY3Rpb24gaGFzV3JhbmdsZXJEZXBlbmRlbmN5KHBhY2thZ2VKc29uOiBQYWNrYWdlSnNvbiB8IHVuZGVmaW5lZCk6IGJvb2xlYW4ge1xuICByZXR1cm4gW1xuICAgIHBhY2thZ2VKc29uPy5kZXBlbmRlbmNpZXMsXG4gICAgcGFja2FnZUpzb24/LmRldkRlcGVuZGVuY2llcyxcbiAgICBwYWNrYWdlSnNvbj8ub3B0aW9uYWxEZXBlbmRlbmNpZXMsXG4gICAgcGFja2FnZUpzb24/LnBlZXJEZXBlbmRlbmNpZXMsXG4gIF0uc29tZSgoZGVwZW5kZW5jaWVzKSA9PiBkZXBlbmRlbmNpZXM/LndyYW5nbGVyICE9PSB1bmRlZmluZWQpO1xufVxuXG5jb25zdCBzaGVsbFdvcmRQYXR0ZXJuID0gU3RyaW5nLnJhd2AoPzpcIig/OlxcXFwufFteXCJcXFxcXSkqXCJ8Jyg/OlxcXFwufFteJ1xcXFxdKSonfCg/OlxcXFwufFteXFxzXCInXFxcXF0pKylgO1xuY29uc3Qgd3JhbmdsZXJPcHRpb25QYXR0ZXJuID0gU3RyaW5nLnJhd2BcXHMrLS0/W0EtWmEtel1bXFx3LV0qKD86PSR7c2hlbGxXb3JkUGF0dGVybn18XFxzKyg/IS18dHlwZXNcXGIpJHtzaGVsbFdvcmRQYXR0ZXJufSk/YDtcbmNvbnN0IHdyYW5nbGVyVHlwZXNUZXh0UGF0dGVybiA9IG5ldyBSZWdFeHAoXG4gIFN0cmluZy5yYXdgW1wiJ10/XFxid3JhbmdsZXIoPzpAW15cXHNcIiddKyk/XFxiW1wiJ10/KD86JHt3cmFuZ2xlck9wdGlvblBhdHRlcm59KSpcXHMrdHlwZXNcXGJgLFxuICAndSdcbik7XG5cbi8qKlxuICogQSBwYWNrYWdlIHdob3NlIFR5cGVTY3JpcHQgcHJvamVjdCBjYW5ub3QgaW5jbHVkZSB3b3JrZXItY29uZmlndXJhdGlvbi5kLnRzIChlLmcuIG9uZSBvbiBhIGhhbmQtbWFpbnRhaW5lZFxuICogbWluaW1hbCBgRW52YCB3aXRoIGB0eXBlczogW1wiYnVuXCJdYCwgdGhlIHN0YW5kYXJkIGVzY2FwZSB3aGVuIHRoZSBhbWJpZW50IHdyYW5nbGVyIGdsb2JhbHMgY29uZmxpY3Qgd2l0aCB0aGVcbiAqIGBAdHlwZXMvYnVuYCBnbG9iYWxzIGl0cyB0ZXN0cyBuZWVkKSBnYWlucyBub3RoaW5nIGZyb20gcmVnZW5lcmF0aW5nIHRoZSB+NTAwS0IgZmlsZSBvbiBldmVyeSBpbnN0YWxsLCBzbyB3YmZ5XG4gKiBsZWF2ZXMgc3VjaCBwYWNrYWdlcyB1bm1hbmFnZWQgaW5zdGVhZCBvZiByZS1hZGRpbmcgdGhlIGdlbmVyYXRpb24gc3RlcC4gQ29uc3VtcHRpb24gaXMgZGV0ZWN0ZWQgdHdvIHdheXM6XG4gKiBhIHRleHR1YWwgYHdvcmtlci1jb25maWd1cmF0aW9uYCByZWZlcmVuY2UgaW4gYW55IHRyYWNrZWQgZmlsZSBvZiB0aGUgcGFja2FnZSAoY292ZXJzIGltcG9ydHMsIHRyaXBsZS1zbGFzaFxuICogcmVmZXJlbmNlcywgYW5kIGV4cGxpY2l0IHRzY29uZmlnIGVudHJpZXMpLCBvciBhIGBmaWxlc2AvYGluY2x1ZGVgL2BleGNsdWRlYCBzZXQgdGhhdCBjYW4gbWF0Y2ggdGhlIGZpbGUg4oCUXG4gKiByZXNvbHZlZCB0aHJvdWdoIHJlbGF0aXZlIGBleHRlbmRzYCBjaGFpbnMgd2l0aCBlYWNoIHBhdHRlcm4ga2VwdCByZWxhdGl2ZSB0byB0aGUgY29uZmlnIHRoYXQgZGVjbGFyZWQgaXQsXG4gKiBtYXRjaGluZyB0c2MuIFdoZW5ldmVyIHRoZSBlZmZlY3RpdmUgc2V0IGNhbm5vdCBiZSBkZXRlcm1pbmVkIChtaXNzaW5nIG9yIHVucGFyc2VhYmxlIHRzY29uZmlnLCBwYWNrYWdlLW5hbWVcbiAqIGBleHRlbmRzYCBwcmVzZXRzLCBvciBUeXBlU2NyaXB0J3MgZGVmYXVsdCBgKipgIGluY2x1c2lvbiksIHRoZSBjdXJyZW50IG1hbmFnZWQgYmVoYXZpb3IgaXMga2VwdC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNvbnN1bWVzR2VuZXJhdGVkV29ya2VyVHlwZXMoY29uZmlnOiBQaWNrPFBhY2thZ2VDb25maWcsICdkaXJQYXRoJz4pOiBib29sZWFuIHtcbiAgLy8gYGdpdCBncmVwYCBzZWFyY2hlcyB0cmFja2VkIGZpbGVzIG9ubHksIHNvIHRoZSBnaXRpZ25vcmVkIGdlbmVyYXRlZCBmaWxlIGl0c2VsZiBuZXZlciBtYXRjaGVzLlxuICAvLyB3YmZ5J3Mgb3duIG1hbmFnZWQgYXJ0aWZhY3RzIGFyZSBleGNsdWRlZDogdGhlIGAuZ2l0aWdub3JlYCBydWxlIChgL3dvcmtlci1jb25maWd1cmF0aW9uLmQudHNgKVxuICAvLyB3YmZ5IGNvbW1pdHRlZCB3aGlsZSBpdCBtYW5hZ2VkIHRoZSBwYWNrYWdlIG11c3Qgbm90IGNvdW50IGFzIGNvbnN1bXB0aW9uLCBvciBhIG9uY2UtbWFuYWdlZFxuICAvLyBwYWNrYWdlIGNvdWxkIG5ldmVyIG9wdCBvdXQuXG4gIGNvbnN0IGdyZXBSZXN1bHQgPSBzcGF3blN5bmNBbmRSZXR1cm5TdGRvdXQoXG4gICAgJ2dpdCcsXG4gICAgLy8gdHNjb25maWcgZmlsZXMgYXJlIGNsYXNzaWZpZWQgYnkgdGhlIHJlc29sdmVkIGZpbGVzL2luY2x1ZGUvZXhjbHVkZSBsb2dpYyBiZWxvdyDigJQgYSB0ZXh0dWFsXG4gICAgLy8gaGl0IHRoZXJlIChlLmcuIGFuIGBleGNsdWRlYCBlbnRyeSkgbXVzdCBub3QgY291bnQgYXMgY29uc3VtcHRpb24uXG4gICAgW1xuICAgICAgJ2dyZXAnLFxuICAgICAgJy1sJyxcbiAgICAgICd3b3JrZXItY29uZmlndXJhdGlvbicsXG4gICAgICAnLS0nLFxuICAgICAgJy4nLFxuICAgICAgJzooZXhjbHVkZSkuZ2l0aWdub3JlJyxcbiAgICAgICc6KGV4Y2x1ZGUpLmdpdGF0dHJpYnV0ZXMnLFxuICAgICAgU3RyaW5nLnJhd2A6KGdsb2IsZXhjbHVkZSkqKi90c2NvbmZpZyouanNvbmAsXG4gICAgXSxcbiAgICBjb25maWcuZGlyUGF0aFxuICApO1xuICBpZiAoZ3JlcFJlc3VsdC50cmltKCkpIHJldHVybiB0cnVlO1xuXG4gIGNvbnN0IHdvcmtlclR5cGVzUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJ3dvcmtlci1jb25maWd1cmF0aW9uLmQudHMnKTtcbiAgY29uc3QgZmlsZVNldCA9IHJlc29sdmVUc2NvbmZpZ0ZpbGVTZXQocGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAndHNjb25maWcuanNvbicpLCBjb25maWcuZGlyUGF0aCwgNSk7XG4gIGlmICghZmlsZVNldCkgcmV0dXJuIHRydWU7XG4gIGNvbnN0IG1hdGNoZXMgPSAocGF0dGVyblNldDogVHNjb25maWdQYXR0ZXJuU2V0IHwgdW5kZWZpbmVkKTogYm9vbGVhbiA9PiB7XG4gICAgaWYgKCFwYXR0ZXJuU2V0IHx8ICFBcnJheS5pc0FycmF5KHBhdHRlcm5TZXQucGF0dGVybnMpKSByZXR1cm4gZmFsc2U7XG4gICAgY29uc3QgcmVsYXRpdmVQYXRoID0gcGF0aC5yZWxhdGl2ZShwYXR0ZXJuU2V0LmJhc2VEaXJQYXRoLCB3b3JrZXJUeXBlc1BhdGgpLnJlcGxhY2VBbGwoJ1xcXFwnLCAnLycpO1xuICAgIHJldHVybiBwYXR0ZXJuU2V0LnBhdHRlcm5zLnNvbWUoKHBhdHRlcm4pID0+IHtcbiAgICAgIGlmICh0eXBlb2YgcGF0dGVybiAhPT0gJ3N0cmluZycpIHJldHVybiBmYWxzZTtcbiAgICAgIC8vIGAke2NvbmZpZ0Rpcn1gLXByZWZpeGVkIHBhdHRlcm5zIHdlcmUgZXhwYW5kZWQgdG8gYWJzb2x1dGUgcGF0aHMgYXQgcmVzb2x2ZSB0aW1lLlxuICAgICAgaWYgKHBhdGguaXNBYnNvbHV0ZShwYXR0ZXJuKSkge1xuICAgICAgICByZXR1cm4gdHNjb25maWdQYXR0ZXJuQ291bGRNYXRjaFBhdGgocGF0dGVybiwgd29ya2VyVHlwZXNQYXRoLCBwYXR0ZXJuU2V0LmV4cGFuZHNEaXJlY3Rvcmllcyk7XG4gICAgICB9XG4gICAgICBpZiAocmVsYXRpdmVQYXRoLnN0YXJ0c1dpdGgoJy4uJykpIHJldHVybiBmYWxzZTtcbiAgICAgIHJldHVybiB0c2NvbmZpZ1BhdHRlcm5Db3VsZE1hdGNoUGF0aChwYXR0ZXJuLCByZWxhdGl2ZVBhdGgsIHBhdHRlcm5TZXQuZXhwYW5kc0RpcmVjdG9yaWVzKTtcbiAgICB9KTtcbiAgfTtcbiAgLy8gYGZpbGVzYCBlbnRyaWVzIGFyZSBhbHdheXMgcGFydCBvZiB0aGUgcHJvZ3JhbSwgZXZlbiB3aGVuIGBleGNsdWRlYCBtYXRjaGVzIHRoZW0uXG4gIGlmIChtYXRjaGVzKGZpbGVTZXQuZmlsZXMpKSByZXR1cm4gdHJ1ZTtcbiAgaWYgKG1hdGNoZXMoZmlsZVNldC5leGNsdWRlKSkgcmV0dXJuIGZhbHNlO1xuICAvLyBOZWl0aGVyIGluY2x1ZGUgbm9yIGZpbGVzIGRlY2xhcmVkOiBUeXBlU2NyaXB0J3MgZGVmYXVsdCBgKipgIGluY2x1c2lvbiBjb3ZlcnMgdGhlIGZpbGUuXG4gIGlmICghZmlsZVNldC5pbmNsdWRlICYmICFmaWxlU2V0LmZpbGVzKSByZXR1cm4gdHJ1ZTtcbiAgcmV0dXJuIG1hdGNoZXMoZmlsZVNldC5pbmNsdWRlKTtcbn1cblxuaW50ZXJmYWNlIFRzY29uZmlnUGF0dGVyblNldCB7XG4gIC8qKiBEaXJlY3Rvcnkgb2YgdGhlIGNvbmZpZyB0aGF0IGRlY2xhcmVkIHRoZSBwYXR0ZXJuczsgdHNjIHJlc29sdmVzIHRoZW0gcmVsYXRpdmUgdG8gaXQuICovXG4gIGJhc2VEaXJQYXRoOiBzdHJpbmc7XG4gIC8qKiBpbmNsdWRlL2V4Y2x1ZGUgdHJlYXQgYW4gZXh0ZW5zaW9ubGVzcyBub24tZ2xvYiBwYXR0ZXJuIGFzIGEgZGlyZWN0b3J5IHN1YnRyZWU7IGBmaWxlc2AgZG9lcyBub3QuICovXG4gIGV4cGFuZHNEaXJlY3RvcmllczogYm9vbGVhbjtcbiAgcGF0dGVybnM6IHVua25vd247XG59XG5cbmludGVyZmFjZSBUc2NvbmZpZ0ZpbGVTZXQge1xuICBleGNsdWRlPzogVHNjb25maWdQYXR0ZXJuU2V0O1xuICBmaWxlcz86IFRzY29uZmlnUGF0dGVyblNldDtcbiAgaW5jbHVkZT86IFRzY29uZmlnUGF0dGVyblNldDtcbn1cblxuLyoqIFJlc29sdmVzIGZpbGVzL2luY2x1ZGUvZXhjbHVkZSB0aHJvdWdoIHJlbGF0aXZlIGBleHRlbmRzYCBjaGFpbnM7IHVuZGVmaW5lZCB3aGVuIHVucmVhZGFibGUuICovXG5mdW5jdGlvbiByZXNvbHZlVHNjb25maWdGaWxlU2V0KFxuICBmaWxlUGF0aDogc3RyaW5nLFxuICBjb25zdW1lckRpclBhdGg6IHN0cmluZyxcbiAgcmVtYWluaW5nRGVwdGg6IG51bWJlclxuKTogVHNjb25maWdGaWxlU2V0IHwgdW5kZWZpbmVkIHtcbiAgaWYgKHJlbWFpbmluZ0RlcHRoIDw9IDApIHJldHVybiB1bmRlZmluZWQ7XG4gIGxldCBjb250ZW50OiBzdHJpbmc7XG4gIHRyeSB7XG4gICAgY29udGVudCA9IGZzLnJlYWRGaWxlU3luYyhmaWxlUGF0aCwgJ3V0ZjgnKTtcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuICBjb25zdCB0c2NvbmZpZyA9IGpzb25jVXRpbC5wYXJzZU9iamVjdElnbm9yaW5nRXJyb3I8e1xuICAgIGV4Y2x1ZGU/OiB1bmtub3duO1xuICAgIGV4dGVuZHM/OiB1bmtub3duO1xuICAgIGZpbGVzPzogdW5rbm93bjtcbiAgICBpbmNsdWRlPzogdW5rbm93bjtcbiAgfT4oY29udGVudCk7XG4gIGlmICghdHNjb25maWcpIHJldHVybiB1bmRlZmluZWQ7XG4gIGNvbnN0IGRpclBhdGggPSBwYXRoLmRpcm5hbWUoZmlsZVBhdGgpO1xuICAvLyBgJHtjb25maWdEaXJ9YCByZXNvbHZlcyB0byB0aGUgZGlyZWN0b3J5IG9mIHRoZSBST09UIChjb25zdW1pbmcpIGNvbmZpZywgd2hlcmV2ZXIgaXQgYXBwZWFycy5cbiAgY29uc3QgdG9QYXR0ZXJuU2V0ID0gKHBhdHRlcm5zOiB1bmtub3duLCBleHBhbmRzRGlyZWN0b3JpZXM6IGJvb2xlYW4pOiBUc2NvbmZpZ1BhdHRlcm5TZXQgfCB1bmRlZmluZWQgPT5cbiAgICBBcnJheS5pc0FycmF5KHBhdHRlcm5zKVxuICAgICAgPyB7XG4gICAgICAgICAgYmFzZURpclBhdGg6IGRpclBhdGgsXG4gICAgICAgICAgZXhwYW5kc0RpcmVjdG9yaWVzLFxuICAgICAgICAgIHBhdHRlcm5zOiBwYXR0ZXJucy5tYXAoKHBhdHRlcm4pID0+XG4gICAgICAgICAgICB0eXBlb2YgcGF0dGVybiA9PT0gJ3N0cmluZycgJiYgcGF0dGVybi5zdGFydHNXaXRoKCcke2NvbmZpZ0Rpcn0nKVxuICAgICAgICAgICAgICA/IHBhdGguam9pbihjb25zdW1lckRpclBhdGgsIHBhdHRlcm4uc2xpY2UoJyR7Y29uZmlnRGlyfScubGVuZ3RoKSlcbiAgICAgICAgICAgICAgOiBwYXR0ZXJuXG4gICAgICAgICAgKSxcbiAgICAgICAgfVxuICAgICAgOiB1bmRlZmluZWQ7XG4gIGNvbnN0IGZpbGVTZXQ6IFRzY29uZmlnRmlsZVNldCA9IHtcbiAgICBleGNsdWRlOiB0b1BhdHRlcm5TZXQodHNjb25maWcuZXhjbHVkZSwgdHJ1ZSksXG4gICAgZmlsZXM6IHRvUGF0dGVyblNldCh0c2NvbmZpZy5maWxlcywgZmFsc2UpLFxuICAgIGluY2x1ZGU6IHRvUGF0dGVyblNldCh0c2NvbmZpZy5pbmNsdWRlLCB0cnVlKSxcbiAgfTtcbiAgY29uc3QgcGFyZW50cyA9XG4gICAgdHlwZW9mIHRzY29uZmlnLmV4dGVuZHMgPT09ICdzdHJpbmcnID8gW3RzY29uZmlnLmV4dGVuZHNdIDogQXJyYXkuaXNBcnJheSh0c2NvbmZpZy5leHRlbmRzKSA/IHRzY29uZmlnLmV4dGVuZHMgOiBbXTtcbiAgLy8gV2l0aCBhbiBgZXh0ZW5kc2AgYXJyYXksIGxhdGVyIGVudHJpZXMgb3ZlcnJpZGUgZWFybGllciBvbmVzLCBhbmQgdGhlIGNoaWxkIG92ZXJyaWRlcyBhbGwg4oCUXG4gIC8vIHNvIGZpbGwgZWFjaCBzdGlsbC1taXNzaW5nIGtleSBmcm9tIHRoZSBsYXN0IHBhcmVudCB0aGF0IGRlZmluZXMgaXQuXG4gIGZvciAoY29uc3QgcGFyZW50IG9mIHBhcmVudHMudG9SZXZlcnNlZCgpKSB7XG4gICAgaWYgKGZpbGVTZXQuZXhjbHVkZSAmJiBmaWxlU2V0LmZpbGVzICYmIGZpbGVTZXQuaW5jbHVkZSkgYnJlYWs7XG4gICAgLy8gUGFja2FnZS1uYW1lIGV4dGVuZHMgKGUuZy4gYEB0c2NvbmZpZy9idW5gKSBhcmUgY29tcGlsZXJPcHRpb25zIHByZXNldHMgd2l0aG91dCBmaWxlIHNldHMuXG4gICAgaWYgKHR5cGVvZiBwYXJlbnQgIT09ICdzdHJpbmcnIHx8ICFwYXJlbnQuc3RhcnRzV2l0aCgnLicpKSBjb250aW51ZTtcbiAgICBsZXQgcGFyZW50UGF0aCA9IHBhdGgucmVzb2x2ZShkaXJQYXRoLCBwYXJlbnQpO1xuICAgIGlmICghZnMuZXhpc3RzU3luYyhwYXJlbnRQYXRoKSAmJiBmcy5leGlzdHNTeW5jKGAke3BhcmVudFBhdGh9Lmpzb25gKSkgcGFyZW50UGF0aCArPSAnLmpzb24nO1xuICAgIGNvbnN0IHBhcmVudEZpbGVTZXQgPSByZXNvbHZlVHNjb25maWdGaWxlU2V0KHBhcmVudFBhdGgsIGNvbnN1bWVyRGlyUGF0aCwgcmVtYWluaW5nRGVwdGggLSAxKTtcbiAgICBpZiAoIXBhcmVudEZpbGVTZXQpIGNvbnRpbnVlO1xuICAgIGZpbGVTZXQuZXhjbHVkZSA/Pz0gcGFyZW50RmlsZVNldC5leGNsdWRlO1xuICAgIGZpbGVTZXQuZmlsZXMgPz89IHBhcmVudEZpbGVTZXQuZmlsZXM7XG4gICAgZmlsZVNldC5pbmNsdWRlID8/PSBwYXJlbnRGaWxlU2V0LmluY2x1ZGU7XG4gIH1cbiAgcmV0dXJuIGZpbGVTZXQ7XG59XG5cbmZ1bmN0aW9uIHRzY29uZmlnUGF0dGVybkNvdWxkTWF0Y2hQYXRoKHBhdHRlcm46IHN0cmluZywgdGFyZ2V0UGF0aDogc3RyaW5nLCBleHBhbmRzRGlyZWN0b3JpZXM6IGJvb2xlYW4pOiBib29sZWFuIHtcbiAgY29uc3Qgbm9ybWFsaXplZCA9IHBhdHRlcm4ucmVwbGFjZSgvXlxcLlxcLy91LCAnJyk7XG4gIC8vIEEgYmFyZSBgLmAgaW5jbHVkZSBjb3ZlcnMgZXZlcnl0aGluZyB1bmRlciB0aGUgY29uZmlnJ3MgZGlyZWN0b3J5LlxuICBpZiAobm9ybWFsaXplZCA9PT0gJycgfHwgbm9ybWFsaXplZCA9PT0gJy4nKSByZXR1cm4gdHJ1ZTtcbiAgLy8gQWJzb2x1dGUgcGF0dGVybnMgKGV4cGFuZGVkIGAke2NvbmZpZ0Rpcn1gKSBhcmUgbWF0Y2hlZCBhZ2FpbnN0IHRoZSBhYnNvbHV0ZSB0YXJnZXQ7IGRyb3AgdGhlXG4gIC8vIGxlYWRpbmcgc2xhc2hlcyBmcm9tIGJvdGggc28gdGhlIHNlZ21lbnQtYnVpbHQgcmVnZXggYW5jaG9ycyBpZGVudGljYWxseS5cbiAgdGFyZ2V0UGF0aCA9IHRhcmdldFBhdGgucmVwbGFjZSgvXlxcLysvdSwgJycpO1xuICBjb25zdCBzZWdtZW50cyA9IG5vcm1hbGl6ZWQuc3BsaXQoJy8nKS5maWx0ZXIoKHNlZ21lbnQpID0+IHNlZ21lbnQgIT09ICcnKTtcbiAgY29uc3QgcmVnZXhTb3VyY2UgPSBzZWdtZW50c1xuICAgIC5tYXAoKHNlZ21lbnQsIGluZGV4KSA9PiB7XG4gICAgICBjb25zdCBpc0xhc3QgPSBpbmRleCA9PT0gc2VnbWVudHMubGVuZ3RoIC0gMTtcbiAgICAgIGlmIChzZWdtZW50ID09PSAnKionKSByZXR1cm4gaXNMYXN0ID8gJy4qJyA6IFN0cmluZy5yYXdgKD86W14vXSsvKSpgO1xuICAgICAgY29uc3Qgc2VnbWVudFNvdXJjZSA9IHNlZ21lbnRcbiAgICAgICAgLnJlcGxhY2VBbGwoL1suK14ke30oKXxbXFxdXFxcXF0vZ3UsIFN0cmluZy5yYXdgXFwkJmApXG4gICAgICAgIC5yZXBsYWNlQWxsKCcqJywgU3RyaW5nLnJhd2BbXi9dKmApXG4gICAgICAgIC5yZXBsYWNlQWxsKCc/JywgU3RyaW5nLnJhd2BbXi9dYCk7XG4gICAgICByZXR1cm4gaXNMYXN0ID8gc2VnbWVudFNvdXJjZSA6IGAke3NlZ21lbnRTb3VyY2V9L2A7XG4gICAgfSlcbiAgICAuam9pbignJyk7XG4gIC8vIHRzYyB0cmVhdHMgYW4gZXh0ZW5zaW9ubGVzcyBub24tZ2xvYiBpbmNsdWRlL2V4Y2x1ZGUgZW50cnkgYXMgYSBkaXJlY3Rvcnkgd2hvc2Ugc3VidHJlZSBpcyBpbmNsdWRlZC5cbiAgY29uc3QgbGFzdFNlZ21lbnQgPSBzZWdtZW50cy5hdCgtMSkgPz8gJyc7XG4gIGNvbnN0IGRpcmVjdG9yeVN1ZmZpeCA9XG4gICAgZXhwYW5kc0RpcmVjdG9yaWVzICYmICEvWyo/XS91LnRlc3QobGFzdFNlZ21lbnQpICYmICFsYXN0U2VnbWVudC5pbmNsdWRlcygnLicpID8gU3RyaW5nLnJhd2AoPzovLiopP2AgOiAnJztcbiAgcmV0dXJuIG5ldyBSZWdFeHAoYF4ke3JlZ2V4U291cmNlfSR7ZGlyZWN0b3J5U3VmZml4fSRgLCAndScpLnRlc3QodGFyZ2V0UGF0aCk7XG59XG5cbi8qKlxuICogVGVsbHMgd2hldGhlciB0aGUgZGlyZWN0b3J5IG93bnMgYSBXb3JrZXIsIHVubGlrZSB0aGUgaXNDbG91ZGZsYXJlIGhldXJpc3RpYywgd2hpY2ggYWxzbyBtYXRjaGVzIGEgcGFja2FnZSB0aGF0XG4gKiBtZXJlbHkgbWVudGlvbnMgd3JhbmdsZXIgaW4gYSBzY3JpcHQgb3Igd29ya2Zsb3cgKGUuZy4gdGhlIHJvb3Qgb2YgYSBtb25vcmVwbyB3aG9zZSBXb3JrZXIgbGl2ZXMgaW4gYSBzdWItcGFja2FnZSkuXG4gKi9cbmZ1bmN0aW9uIGRldGVjdFdyYW5nbGVyQ29uZmlnKGRpclBhdGg6IHN0cmluZyk6IGJvb2xlYW4ge1xuICByZXR1cm4gWyd3cmFuZ2xlci5qc29uYycsICd3cmFuZ2xlci5qc29uJywgJ3dyYW5nbGVyLnRvbWwnXS5zb21lKChmaWxlTmFtZSkgPT5cbiAgICBmcy5leGlzdHNTeW5jKHBhdGgucmVzb2x2ZShkaXJQYXRoLCBmaWxlTmFtZSkpXG4gICk7XG59XG5cbi8qKlxuICogRGV0ZWN0cyB3aGV0aGVyIGRpclBhdGggYmVsb25ncyB0byB0aGUgd2lsbGJvb3N0ZXItY29uZmlncyByZXBvc2l0b3J5LiBQcmVmZXJzIHRoZSBhdXRob3JpdGF0aXZlXG4gKiBHaXRIdWIgcmVwbyBuYW1lLCB3aGljaCBpcyBpbW11bmUgdG8gdGhlIGxvY2FsIGRpcmVjdG9yeSBsYXlvdXQuIFRoYXQgbmFtZSBpcyBmZXRjaGVkIG9ubHkgZm9yIHRoZVxuICogcm9vdCwgc28gc3ViLXBhY2thZ2VzIChhbmQgb2ZmbGluZSByb290cykgd2FsayB1cCB0byB0aGUgbmVhcmVzdCBnaXQgcm9vdCBhbmQgbWF0Y2ggaXRzIGRpcmVjdG9yeVxuICogbmFtZTogYSBzaWJsaW5nIHJlcG8gY2xvbmVkIHVuZGVyIGEgcGFyZW50IGRpcmVjdG9yeSBuYW1lZCB3aWxsYm9vc3Rlci1jb25maWdzIHN0b3BzIGF0IGl0cyBvd25cbiAqIGAuZ2l0YCwgc28gaXQgaXMgbm90IG1pc2NsYXNzaWZpZWQuIFRoZSBwYXRoIHNlZ21lbnQgcmVtYWlucyBhIGxhc3QgcmVzb3J0IHdoZW4gbm8gZ2l0IHJvb3QgZXhpc3RzLlxuICovXG5mdW5jdGlvbiBkZXRlY3RJc1dpbGxCb29zdGVyQ29uZmlncyhkaXJQYXRoOiBzdHJpbmcsIHBhY2thZ2VKc29uUGF0aDogc3RyaW5nLCByZXBvTmFtZTogc3RyaW5nIHwgdW5kZWZpbmVkKTogYm9vbGVhbiB7XG4gIGlmIChyZXBvTmFtZSkgcmV0dXJuIHJlcG9OYW1lLnRvTG93ZXJDYXNlKCkgPT09ICd3aWxsYm9vc3Rlci1jb25maWdzJztcbiAgbGV0IGN1cnJlbnQgPSBwYXRoLnJlc29sdmUoZGlyUGF0aCk7XG4gIHdoaWxlIChjdXJyZW50ICE9PSBwYXRoLmRpcm5hbWUoY3VycmVudCkpIHtcbiAgICBpZiAoZnMuZXhpc3RzU3luYyhwYXRoLmpvaW4oY3VycmVudCwgJy5naXQnKSkpIHtcbiAgICAgIHJldHVybiBwYXRoLmJhc2VuYW1lKGN1cnJlbnQpLnRvTG93ZXJDYXNlKCkgPT09ICd3aWxsYm9vc3Rlci1jb25maWdzJztcbiAgICB9XG4gICAgY3VycmVudCA9IHBhdGguZGlybmFtZShjdXJyZW50KTtcbiAgfVxuICByZXR1cm4gcGFja2FnZUpzb25QYXRoLnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMoJy93aWxsYm9vc3Rlci1jb25maWdzLycpO1xufVxuXG5mdW5jdGlvbiBkZXRlY3RDbG91ZGZsYXJlKFxuICBwYWNrYWdlSnNvbjogUGFja2FnZUpzb24sXG4gIGRvZXNDb250YWluV3JhbmdsZXJDb25maWc6IGJvb2xlYW4sXG4gIHdvcmtmbG93Q29udGVudHM6IHN0cmluZ1tdXG4pOiBib29sZWFuIHtcbiAgY29uc3Qgc2NyaXB0cyA9IHBhY2thZ2VKc29uLnNjcmlwdHM7XG4gIGlmIChzY3JpcHRzICYmIE9iamVjdC52YWx1ZXMoc2NyaXB0cykuc29tZSgoc2NyaXB0KSA9PiB0eXBlb2Ygc2NyaXB0ID09PSAnc3RyaW5nJyAmJiBzY3JpcHQuaW5jbHVkZXMoJ3dyYW5nbGVyJykpKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBpZiAoZG9lc0NvbnRhaW5XcmFuZ2xlckNvbmZpZykge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgcmV0dXJuIHdvcmtmbG93Q29udGVudHMuc29tZSgoY29udGVudCkgPT4gL2Nsb3VkZmxhcmV8d3JhbmdsZXIvaXUudGVzdChjb250ZW50KSk7XG59XG5cbmZ1bmN0aW9uIGRldGVjdFJhaWx3YXkoZGlyUGF0aDogc3RyaW5nLCBwYWNrYWdlSnNvbjogUGFja2FnZUpzb24sIHdvcmtmbG93Q29udGVudHM6IHN0cmluZ1tdKTogYm9vbGVhbiB7XG4gIGNvbnN0IHNjcmlwdHMgPSBwYWNrYWdlSnNvbi5zY3JpcHRzO1xuICBpZiAoc2NyaXB0cyAmJiBPYmplY3QudmFsdWVzKHNjcmlwdHMpLnNvbWUoKHNjcmlwdCkgPT4gdHlwZW9mIHNjcmlwdCA9PT0gJ3N0cmluZycgJiYgc2NyaXB0LmluY2x1ZGVzKCdyYWlsd2F5JykpKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBpZiAoXG4gICAgZnMuZXhpc3RzU3luYyhwYXRoLnJlc29sdmUoZGlyUGF0aCwgJy5yYWlsd2F5aWdub3JlJykpIHx8XG4gICAgZnMuZXhpc3RzU3luYyhwYXRoLnJlc29sdmUoZGlyUGF0aCwgJ3JhaWx3YXkuanNvbicpKSB8fFxuICAgIGZzLmV4aXN0c1N5bmMocGF0aC5yZXNvbHZlKGRpclBhdGgsICdyYWlsd2F5LnRvbWwnKSlcbiAgKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICByZXR1cm4gd29ya2Zsb3dDb250ZW50cy5zb21lKChjb250ZW50KSA9PiAvcmFpbHdheS9pdS50ZXN0KGNvbnRlbnQpKTtcbn1cblxuLyoqIENvbnRlbnRzIG9mIHRoZSByZWFkYWJsZSAuZ2l0aHViL3dvcmtmbG93cyBZQU1MIGZpbGVzLCByZWFkIG9uY2UgZm9yIGV2ZXJ5IGRldGVjdG9yIG5lZWRpbmcgdGhlbS4gKi9cbmZ1bmN0aW9uIHJlYWRXb3JrZmxvd0ZpbGVDb250ZW50cyhkaXJQYXRoOiBzdHJpbmcpOiBzdHJpbmdbXSB7XG4gIGNvbnN0IHdvcmtmbG93c1BhdGggPSBwYXRoLnJlc29sdmUoZGlyUGF0aCwgJy5naXRodWInLCAnd29ya2Zsb3dzJyk7XG4gIHRyeSB7XG4gICAgcmV0dXJuIGZzXG4gICAgICAucmVhZGRpclN5bmMod29ya2Zsb3dzUGF0aClcbiAgICAgIC5maWx0ZXIoKGZpbGVOYW1lKSA9PiAvXFwueWE/bWwkL2l1LnRlc3QoZmlsZU5hbWUpKVxuICAgICAgLmZsYXRNYXAoKGZpbGVOYW1lKSA9PiB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgcmV0dXJuIFtmcy5yZWFkRmlsZVN5bmMocGF0aC5qb2luKHdvcmtmbG93c1BhdGgsIGZpbGVOYW1lKSwgJ3V0ZjgnKV07XG4gICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgIHJldHVybiBbXTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiBbXTtcbiAgfVxufVxuXG5hc3luYyBmdW5jdGlvbiByZWFkTWlzZVRhc2tzKGRpclBhdGg6IHN0cmluZyk6IFByb21pc2U8UmVjb3JkPHN0cmluZywgc3RyaW5nPj4ge1xuICBjb25zdCB0YXNrczogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHt9O1xuICBmb3IgKGNvbnN0IGZpbGVOYW1lIG9mIFsnbWlzZS50b21sJywgJy5taXNlLnRvbWwnXSkge1xuICAgIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKGRpclBhdGgsIGZpbGVOYW1lKTtcbiAgICB0cnkge1xuICAgICAgY29uc3Qgc2V0dGluZ3MgPSBCdW4uVE9NTC5wYXJzZShhd2FpdCBmc3AucmVhZEZpbGUoZmlsZVBhdGgsICd1dGY4JykpIGFzIHsgdGFza3M/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB9O1xuICAgICAgZm9yIChjb25zdCBbbmFtZSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKHNldHRpbmdzLnRhc2tzID8/IHt9KSkge1xuICAgICAgICB0YXNrc1tuYW1lXSA9IHJlYWRNaXNlVGFza0NvbW1hbmQodmFsdWUpO1xuICAgICAgfVxuICAgIH0gY2F0Y2gge1xuICAgICAgLy8gTWlzc2luZyBvciB0ZW1wb3JhcmlseSBpbnZhbGlkIG1pc2UgZmlsZXMgc2hvdWxkIG5vdCBibG9jayBvdGhlciB3YmZ5IGdlbmVyYXRvcnMuXG4gICAgfVxuICB9XG4gIHJldHVybiB0YXNrcztcbn1cblxuZnVuY3Rpb24gcmVhZE1pc2VUYXNrQ29tbWFuZCh2YWx1ZTogdW5rbm93bik6IHN0cmluZyB7XG4gIGlmICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnKSByZXR1cm4gdmFsdWU7XG4gIC8vIFByZXNlcnZlIGFycmF5LWZvcm0gbWlzZSBjb21tYW5kcyBzbyByZWN1cnNpb24gY2hlY2tzIGNhbiBzdGlsbCBzZWUgcGFja2FnZSBzY3JpcHQgY2FsbHMuXG4gIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkgcmV0dXJuIHZhbHVlLmZpbHRlcigoY29tbWFuZCk6IGNvbW1hbmQgaXMgc3RyaW5nID0+IHR5cGVvZiBjb21tYW5kID09PSAnc3RyaW5nJykuam9pbignXFxuJyk7XG4gIGlmICh2YWx1ZSAmJiB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnKSByZXR1cm4gcmVhZE1pc2VUYXNrQ29tbWFuZCgodmFsdWUgYXMgeyBydW4/OiB1bmtub3duIH0pLnJ1bik7XG4gIHJldHVybiAnJztcbn1cblxuLyoqXG4gKiBXaGV0aGVyIGRpclBhdGggaXMgYSBjaGlsZCB3b3Jrc3BhY2Ugb2YgYW4gZW5jbG9zaW5nIG1vbm9yZXBvIHJvb3Q6IGVpdGhlciB0aGUgY29udmVudGlvbmFsXG4gKiBgPHJvb3Q+L3BhY2thZ2VzLzxuYW1lPmAgbGF5b3V0LCBvciBhIGRpcmVjdG9yeSBtYXRjaGluZyBhIHdvcmtzcGFjZSBwYXR0ZXJuIGRlY2xhcmVkIGJ5IGFuXG4gKiBhbmNlc3RvciBwYWNrYWdlLmpzb24gKHBhdHRlcm5zIG1heSBiZSBhcmJpdHJhcmlseSBkZWVwLCBlLmcuIGBleGFtcGxlcy8qKmApLiBUaGUgd2FsayBzdG9wc1xuICogYXQgdGhlIGZpcnN0IGdpdCByZXBvc2l0b3J5IGJvdW5kYXJ5IHNvIGFuIHVucmVsYXRlZCBlbmNsb3NpbmcgcmVwb3NpdG9yeSdzIHdvcmtzcGFjZXMgY2FuXG4gKiBuZXZlciByZWNsYXNzaWZ5IGFuIGluZGVwZW5kZW50IHJlcG9zaXRvcnkgYXMgYSBjaGlsZC5cbiAqL1xuZnVuY3Rpb24gaXNXb3Jrc3BhY2VPZkVuY2xvc2luZ1Jvb3QoZGlyUGF0aDogc3RyaW5nKTogYm9vbGVhbiB7XG4gIGNvbnN0IHJlc29sdmVkRGlyUGF0aCA9IHBhdGgucmVzb2x2ZShkaXJQYXRoKTtcbiAgLy8gQSBkaXJlY3Rvcnkgd2l0aCBpdHMgb3duIC5naXQgaXMgYSByZXBvc2l0b3J5IGluIGl0cyBvd24gcmlnaHQsIG5ldmVyIGEgY2hpbGQgd29ya3NwYWNlIOKAlFxuICAvLyBjaGVja2VkIEZJUlNUIHNvIGFuIGluZGVwZW5kZW50IHJlcG9zaXRvcnkgdW5kZXIgc29tZSBgcGFja2FnZXMvYCBkaXJlY3Rvcnkgc3RheXMgYSByb290LlxuICBpZiAoZnMuZXhpc3RzU3luYyhwYXRoLnJlc29sdmUocmVzb2x2ZWREaXJQYXRoLCAnLmdpdCcpKSkgcmV0dXJuIGZhbHNlO1xuICBpZiAoXG4gICAgcGF0aC5iYXNlbmFtZShwYXRoLnJlc29sdmUocmVzb2x2ZWREaXJQYXRoLCAnLi4nKSkgPT09ICdwYWNrYWdlcycgJiZcbiAgICBmcy5leGlzdHNTeW5jKHBhdGgucmVzb2x2ZShyZXNvbHZlZERpclBhdGgsICcuLicsICcuLicsICdwYWNrYWdlLmpzb24nKSlcbiAgKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgZm9yIChcbiAgICBsZXQgY2FuZGlkYXRlUm9vdERpclBhdGggPSBwYXRoLmRpcm5hbWUocmVzb2x2ZWREaXJQYXRoKTtcbiAgICA7XG4gICAgY2FuZGlkYXRlUm9vdERpclBhdGggPSBwYXRoLmRpcm5hbWUoY2FuZGlkYXRlUm9vdERpclBhdGgpXG4gICkge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCByb290UGFja2FnZUpzb24gPSBKU09OLnBhcnNlKFxuICAgICAgICBmcy5yZWFkRmlsZVN5bmMocGF0aC5yZXNvbHZlKGNhbmRpZGF0ZVJvb3REaXJQYXRoLCAncGFja2FnZS5qc29uJyksICd1dGY4JylcbiAgICAgICkgYXMgUGFja2FnZUpzb247XG4gICAgICBjb25zdCByZWxhdGl2ZURpclBhdGggPSBwYXRoLnJlbGF0aXZlKGNhbmRpZGF0ZVJvb3REaXJQYXRoLCByZXNvbHZlZERpclBhdGgpLnJlcGxhY2VBbGwoJ1xcXFwnLCAnLycpO1xuICAgICAgY29uc3Qgd29ya3NwYWNlRGlyUGF0aHMgPSBnZXRXb3Jrc3BhY2VQYWNrYWdlSnNvblBhdGhzKHtcbiAgICAgICAgZGlyUGF0aDogY2FuZGlkYXRlUm9vdERpclBhdGgsXG4gICAgICAgIHBhY2thZ2VKc29uOiByb290UGFja2FnZUpzb24sXG4gICAgICAgIGRvZXNDb250YWluU3ViUGFja2FnZUpzb25zOiBmYWxzZSxcbiAgICAgIH0pLm1hcCgocGFja2FnZUpzb25QYXRoKSA9PiBwYXRoLnBvc2l4LmRpcm5hbWUocGFja2FnZUpzb25QYXRoKSk7XG4gICAgICBpZiAod29ya3NwYWNlRGlyUGF0aHMuaW5jbHVkZXMocmVsYXRpdmVEaXJQYXRoKSkgcmV0dXJuIHRydWU7XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBObyBvciB1bnBhcnNhYmxlIG1hbmlmZXN0IGF0IHRoaXMgYW5jZXN0b3I6IGtlZXAgd2Fsa2luZy5cbiAgICB9XG4gICAgY29uc3QgaXNSZXBvQm91bmRhcnkgPSBmcy5leGlzdHNTeW5jKHBhdGgucmVzb2x2ZShjYW5kaWRhdGVSb290RGlyUGF0aCwgJy5naXQnKSk7XG4gICAgY29uc3QgaXNGaWxlc3lzdGVtUm9vdCA9IGNhbmRpZGF0ZVJvb3REaXJQYXRoID09PSBwYXRoLmRpcm5hbWUoY2FuZGlkYXRlUm9vdERpclBhdGgpO1xuICAgIGlmIChpc1JlcG9Cb3VuZGFyeSB8fCBpc0ZpbGVzeXN0ZW1Sb290KSByZXR1cm4gZmFsc2U7XG4gIH1cbn1cblxuZnVuY3Rpb24gY29udGFpbnNBbnkocGF0dGVybjogc3RyaW5nLCBkaXJQYXRoOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgcmV0dXJuIGZnLmdsb2JTeW5jKHBhdHRlcm4sIHsgZG90OiB0cnVlLCBjd2Q6IGRpclBhdGgsIGlnbm9yZTogZ2xvYklnbm9yZSB9KS5sZW5ndGggPiAwO1xufVxuXG5mdW5jdGlvbiBmaW5kQ2FyZ29Ub21sRGlyUGF0aHMoZGlyUGF0aDogc3RyaW5nKTogc3RyaW5nW10ge1xuICByZXR1cm4gZmdcbiAgICAuZ2xvYlN5bmMoJyoqL0NhcmdvLnRvbWwnLCB7IGRvdDogdHJ1ZSwgY3dkOiBkaXJQYXRoLCBpZ25vcmU6IGdsb2JJZ25vcmUgfSlcbiAgICAubWFwKChmaWxlUGF0aCkgPT4gcGF0aC5kaXJuYW1lKGZpbGVQYXRoKSlcbiAgICAudG9Tb3J0ZWQoKGEsIGIpID0+IGEuc3BsaXQoJy8nKS5sZW5ndGggLSBiLnNwbGl0KCcvJykubGVuZ3RoIHx8IGEubG9jYWxlQ29tcGFyZShiKSk7XG59XG5cbmZ1bmN0aW9uIGRldGVjdFBsYXl3cmlnaHRSdW50aW1lSW1wb3J0KGRpclBhdGg6IHN0cmluZyk6IGJvb2xlYW4ge1xuICBjb25zdCBmaWxlcyA9IGZnLmdsb2JTeW5jKCd7YXBwLHNyY30vKiovKi57Y2pzLGN0cyxqcyxqc3gsbWpzLG10cyx0cyx0c3h9Jywge1xuICAgIGRvdDogdHJ1ZSxcbiAgICBjd2Q6IGRpclBhdGgsXG4gICAgaWdub3JlOiBbLi4uZ2xvYklnbm9yZSwgJyoqL19fdGVzdHNfXy8qKicsICcqKi8qLnNwZWMuKicsICcqKi8qLnRlc3QuKicsICcqKi9wbGF5d3JpZ2h0LmNvbmZpZy4qJ10sXG4gIH0pO1xuICBjb25zdCBwbGF5d3JpZ2h0SW1wb3J0UGF0dGVybiA9IGJ1aWxkUnVudGltZUltcG9ydFJlZ0V4cCgncGxheXdyaWdodCcpO1xuICBmb3IgKGNvbnN0IGZpbGUgb2YgZmlsZXMpIHtcbiAgICBjb25zdCBjb250ZW50ID0gZnMucmVhZEZpbGVTeW5jKHBhdGgucmVzb2x2ZShkaXJQYXRoLCBmaWxlKSwgJ3V0ZjgnKTtcbiAgICBpZiAocGxheXdyaWdodEltcG9ydFBhdHRlcm4udGVzdChjb250ZW50KSkgcmV0dXJuIHRydWU7XG4gIH1cbiAgcmV0dXJuIGZhbHNlO1xufVxuXG5mdW5jdGlvbiBidWlsZFJ1bnRpbWVJbXBvcnRSZWdFeHAocGFja2FnZU5hbWU6IHN0cmluZyk6IFJlZ0V4cCB7XG4gIC8vIE1hdGNoIHRoZSBiYXJlIHNwZWNpZmllciBvciBhbnkgc3VicGF0aCBvZiBpdCAoYHBrZ2AgLyBgcGtnL3N1YmApLCBidXQgbmV2ZXIgYSBkaWZmZXJlbnQgcGFja2FnZVxuICAvLyB0aGF0IG1lcmVseSBzaGFyZXMgdGhlIHByZWZpeCAoYHBrZy1vdGhlcmApLCBzaW5jZSB0aGUgY2hhciBhZnRlciB0aGUgbmFtZSBtdXN0IGJlIGAvYCBvciBhIHF1b3RlLlxuICBjb25zdCBzcGVjaWZpZXIgPSBTdHJpbmcucmF3YFsnXCJdJHtlc2NhcGVSZWdFeHAocGFja2FnZU5hbWUpfSg/Oi9bXidcIl0qKT9bJ1wiXWA7XG4gIHJldHVybiBuZXcgUmVnRXhwKFxuICAgIFN0cmluZy5yYXdgXFxiZnJvbVxccyske3NwZWNpZmllcn18XFxiaW1wb3J0XFxzKlxcKFxccyoke3NwZWNpZmllcn1cXHMqXFwpfFxcYnJlcXVpcmVcXHMqXFwoXFxzKiR7c3BlY2lmaWVyfVxccypcXClgLFxuICAgICd1J1xuICApO1xufVxuXG5hc3luYyBmdW5jdGlvbiBmZXRjaFJlcG9JbmZvKGRpclBhdGg6IHN0cmluZywgcGFja2FnZUpzb246IFBhY2thZ2VKc29uKTogUHJvbWlzZTxSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB8IHVuZGVmaW5lZD4ge1xuICBjb25zdCByZW1vdGVVcmwgPSBnZXRPcmlnaW5SZW1vdGVVcmwoZGlyUGF0aCk7XG4gIGlmIChyZW1vdGVVcmwpIHtcbiAgICBjb25zdCBqc29uID0gYXdhaXQgcmVxdWVzdFJlcG9JbmZvKHJlbW90ZVVybCk7XG4gICAgaWYgKGpzb24pIHJldHVybiBqc29uO1xuICB9XG5cbiAgY29uc3QgdXJsID0gdHlwZW9mIHBhY2thZ2VKc29uLnJlcG9zaXRvcnkgPT09ICdzdHJpbmcnID8gcGFja2FnZUpzb24ucmVwb3NpdG9yeSA6IHBhY2thZ2VKc29uLnJlcG9zaXRvcnk/LnVybDtcbiAgaWYgKHVybCkge1xuICAgIGNvbnN0IGpzb24gPSBhd2FpdCByZXF1ZXN0UmVwb0luZm8odXJsKTtcbiAgICBpZiAoanNvbiAmJiBqc29uLm1lc3NhZ2UgIT09ICdOb3QgRm91bmQnKSByZXR1cm4ganNvbjtcbiAgfVxufVxuXG5hc3luYyBmdW5jdGlvbiByZXF1ZXN0UmVwb0luZm8odXJsT3JGdWxsTmFtZTogc3RyaW5nKTogUHJvbWlzZTxSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB8IHVuZGVmaW5lZD4ge1xuICBjb25zdCBbb3JnLCBuYW1lXSA9IGdpdEh1YlV0aWwuZ2V0T3JnQW5kTmFtZSh1cmxPckZ1bGxOYW1lKTtcbiAgaWYgKCFvcmcgfHwgIW5hbWUpIHJldHVybjtcblxuICB0cnkge1xuICAgIC8vIE1ldGFkYXRhIHBlcm1pc3Npb24uIFRoZSBvd25lciBNVVNUIGJlIHBhc3NlZDogZ2V0T2N0b2tpdCgpIHdpdGhvdXQgaXQgcHJlZmVycyB0aGVcbiAgICAvLyBXaWxsQm9vc3RlciBQQVQsIHdoaWNoIGNhbm5vdCByZWFkIHByaXZhdGUgV2lsbEJvb3N0ZXJMYWIgcmVwb3NpdG9yaWVzLCBjb2xsYXBzaW5nIHRoZWlyXG4gICAgLy8gdmlzaWJpbGl0eSB0byB1bmtub3duIChhbmQgZS5nLiBza2lwcGluZyB0aGUgd2JmeSBjYWxsZXIgZ2VuZXJhdGlvbiBpbmRlZmluaXRlbHkpLlxuICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZ2V0T2N0b2tpdChvcmcpLnJlcXVlc3QoJ0dFVCAvcmVwb3Mve293bmVyfS97cmVwb30nLCB7XG4gICAgICBvd25lcjogb3JnLFxuICAgICAgcmVwbzogbmFtZSxcbiAgICB9KTtcbiAgICByZXR1cm4gcmVzcG9uc2UuZGF0YTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBjb25zdCByZWRpcmVjdGVkRnVsbE5hbWUgPSBnZXRSZWRpcmVjdGVkUmVwb0Z1bGxOYW1lKGVycm9yKTtcbiAgICBpZiAocmVkaXJlY3RlZEZ1bGxOYW1lKSB7XG4gICAgICAvLyBSZS1mZXRjaCB1bmRlciB0aGUgcmVkaXJlY3RlZCBpZGVudGl0eSBzbyBhIHJlbmFtZWQgcmVwb3NpdG9yeSBzdGlsbCBnZXRzIGNvbXBsZXRlXG4gICAgICAvLyBtZXRhZGF0YSAodmlzaWJpbGl0eSBpbmNsdWRlZCkgaW5zdGVhZCBvZiBhIGJhcmUgZnVsbF9uYW1lIHRoYXQgd291bGQgbGVhdmVcbiAgICAgIC8vIGlzUmVwb1Zpc2liaWxpdHlLbm93biBmYWxzZSBvbiBldmVyeSBzdWJzZXF1ZW50IHJ1biB3aXRoIHRoZSBzdGFsZSByZW1vdGUgVVJMLlxuICAgICAgY29uc3QgW3JlZGlyZWN0ZWRPcmcsIHJlZGlyZWN0ZWROYW1lXSA9IHJlZGlyZWN0ZWRGdWxsTmFtZS5zcGxpdCgnLycpO1xuICAgICAgaWYgKHJlZGlyZWN0ZWRPcmcgJiYgcmVkaXJlY3RlZE5hbWUpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGdldE9jdG9raXQocmVkaXJlY3RlZE9yZykucmVxdWVzdCgnR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfScsIHtcbiAgICAgICAgICAgIG93bmVyOiByZWRpcmVjdGVkT3JnLFxuICAgICAgICAgICAgcmVwbzogcmVkaXJlY3RlZE5hbWUsXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgcmV0dXJuIHJlc3BvbnNlLmRhdGE7XG4gICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgIC8vIEZhbGwgYmFjayB0byB0aGUgYmFyZSBpZGVudGl0eSBiZWxvdzogdGhlIHJlcG9zaXRvcnkgaXMgc3RpbGwgY2Fub25pY2FsaXplZCwgb25seVxuICAgICAgICAgIC8vIGl0cyB2aXNpYmlsaXR5IHN0YXlzIHVua25vd24uXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiB7IGZ1bGxfbmFtZTogcmVkaXJlY3RlZEZ1bGxOYW1lIH07XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGdldFJlZGlyZWN0ZWRSZXBvRnVsbE5hbWUoZXJyb3I6IHVua25vd24pOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBpZiAoIWVycm9yIHx8IHR5cGVvZiBlcnJvciAhPT0gJ29iamVjdCcpIHJldHVybjtcblxuICBjb25zdCByZXNwb25zZSA9XG4gICAgJ3Jlc3BvbnNlJyBpbiBlcnJvclxuICAgICAgPyAoZXJyb3IgYXMgeyByZXNwb25zZT86IHsgc3RhdHVzPzogbnVtYmVyOyBoZWFkZXJzPzogUmVjb3JkPHN0cmluZywgc3RyaW5nIHwgdW5kZWZpbmVkPiB9IH0pLnJlc3BvbnNlXG4gICAgICA6IHVuZGVmaW5lZDtcbiAgY29uc3Qgc3RhdHVzID0gcmVzcG9uc2U/LnN0YXR1cyA/PyAoZXJyb3IgYXMgeyBzdGF0dXM/OiBudW1iZXIgfSkuc3RhdHVzO1xuICBpZiAoc3RhdHVzICE9PSAzMDEgJiYgc3RhdHVzICE9PSAzMDIpIHJldHVybjtcblxuICBjb25zdCBsb2NhdGlvbiA9IHJlc3BvbnNlPy5oZWFkZXJzPy5sb2NhdGlvbjtcbiAgaWYgKHR5cGVvZiBsb2NhdGlvbiAhPT0gJ3N0cmluZycpIHJldHVybjtcblxuICBjb25zdCBbb3JnLCBuYW1lXSA9IGdpdEh1YlV0aWwuZ2V0T3JnQW5kTmFtZShsb2NhdGlvbik7XG4gIGlmICghb3JnIHx8ICFuYW1lKSByZXR1cm47XG5cbiAgcmV0dXJuIGAke29yZ30vJHtuYW1lfWA7XG59XG5cbi8qKlxuICogUmVzb2x2ZXMgYDxvcmc+LzxuYW1lPmAgZnJvbSB0aGUgZ2l0IHJlbW90ZSAoZmFsbGluZyBiYWNrIHRvIHBhY2thZ2UuanNvbidzIGByZXBvc2l0b3J5YCkgd2l0aG91dFxuICogY2FsbGluZyB0aGUgR2l0SHViIEFQSS4gSXQgd29ya3MgZm9yIGV2ZXJ5IHdvcmtzcGFjZSBwYWNrYWdlLCBub3QganVzdCB0aGUgcm9vdCDigJQgb25seSB0aGUgcm9vdFxuICogZmV0Y2hlcyByZXBvIGluZm8g4oCUIGFuZCBpdCBrZWVwcyB3b3JraW5nIG9mZmxpbmUgb3IgcmF0ZS1saW1pdGVkLCB3aGVyZSBhbiB1bmRlZmluZWQgaWRlbnRpdHlcbiAqIHdvdWxkIHNpbGVudGx5IHJlY2xhc3NpZnkgdGhlIHJlcG9zaXRvcnkgKGUuZy4gbWFraW5nIHdiZnkgd3JpdGUgd2lsbGJvb3N0ZXItY29uZmlncycgUmVub3ZhdGVcbiAqIHByZXNldCBpbnRvIHRoZSBwcmVzZXQgaXRzZWxmIGFnYWluKS5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gcmVzb2x2ZUxvY2FsUmVwb0lkZW50aXR5KFxuICBkaXJQYXRoOiBzdHJpbmcsXG4gIHBhY2thZ2VKc29uOiBQYWNrYWdlSnNvblxuKTogUHJvbWlzZTxbc3RyaW5nIHwgdW5kZWZpbmVkLCBzdHJpbmcgfCB1bmRlZmluZWRdPiB7XG4gIGNvbnN0IHJlbW90ZVVybCA9IGdldE9yaWdpblJlbW90ZVVybChkaXJQYXRoKTtcbiAgaWYgKHJlbW90ZVVybCkge1xuICAgIGNvbnN0IGlkZW50aXR5ID0gcmVhZEdpdEh1YklkZW50aXR5KHJlbW90ZVVybCk7XG4gICAgaWYgKGlkZW50aXR5KSByZXR1cm4gaWRlbnRpdHk7XG4gIH1cbiAgY29uc3QgdXJsID0gdHlwZW9mIHBhY2thZ2VKc29uLnJlcG9zaXRvcnkgPT09ICdzdHJpbmcnID8gcGFja2FnZUpzb24ucmVwb3NpdG9yeSA6IHBhY2thZ2VKc29uLnJlcG9zaXRvcnk/LnVybDtcbiAgaWYgKHVybCkge1xuICAgIGNvbnN0IGlkZW50aXR5ID0gcmVhZEdpdEh1YklkZW50aXR5KHVybCk7XG4gICAgaWYgKGlkZW50aXR5KSByZXR1cm4gaWRlbnRpdHk7XG4gIH1cbiAgcmV0dXJuIFt1bmRlZmluZWQsIHVuZGVmaW5lZF07XG59XG5cbmZ1bmN0aW9uIGdldE9yaWdpblJlbW90ZVVybChkaXJQYXRoOiBzdHJpbmcpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICByZXR1cm4gc3Bhd25TeW5jQW5kUmV0dXJuU3Rkb3V0KCdnaXQnLCBbJ2NvbmZpZycsICctLWdldCcsICdyZW1vdGUub3JpZ2luLnVybCddLCBkaXJQYXRoKSB8fCB1bmRlZmluZWQ7XG59XG5cbi8qKlxuICogYGdpdEh1YlV0aWwuZ2V0T3JnQW5kTmFtZWAgaXMgaG9zdC1hZ25vc3RpYywgc28gaXQgaGFwcGlseSB0dXJucyBhIEdpdExhYiBVUkwgaW50byBhbiBgPG9yZz4vPHJlcG8+YCBwYWlyLlxuICogRXZlcnl0aGluZyBkb3duc3RyZWFtIHRyZWF0cyB0aGUgcmVzdWx0aW5nIGlkZW50aXR5IGFzIEdpdEh1YiAodGhlIGBnaXRodWI6YCByZXBvc2l0b3J5IGZpZWxkIGlzIHJld3JpdHRlblxuICogaW50byBwYWNrYWdlLmpzb24pLCBzbyB0aGUgaG9zdCBtdXN0IGJlIHZlcmlmaWVkIGZpcnN0OyBhIG5vbi1HaXRIdWIgcmVtb3RlIHlpZWxkcyBubyBpZGVudGl0eSwgYXMgYmVmb3JlLlxuICovXG5mdW5jdGlvbiByZWFkR2l0SHViSWRlbnRpdHkodXJsOiBzdHJpbmcpOiBbc3RyaW5nLCBzdHJpbmddIHwgdW5kZWZpbmVkIHtcbiAgaWYgKCF0YXJnZXRzR2l0SHViKHVybCkpIHJldHVybiB1bmRlZmluZWQ7XG4gIGNvbnN0IFtvcmcsIG5hbWVdID0gZ2l0SHViVXRpbC5nZXRPcmdBbmROYW1lKHVybCk7XG4gIHJldHVybiBvcmcgJiYgbmFtZSA/IFtjYW5vbmljYWxpemVPd25lcihvcmcpLCBuYW1lXSA6IHVuZGVmaW5lZDtcbn1cblxuLyoqXG4gKiBXaGV0aGVyIHRoZSBVUkwncyBIT1NUIGlzIGdpdGh1Yi5jb20uIFBhcnNlZCByYXRoZXIgdGhhbiBzdWJzdHJpbmctbWF0Y2hlZDogYSBwYXRoIHN1Y2ggYXNcbiAqIGBodHRwczovL2dpdGxhYi5jb20vZ2l0aHViLmNvbS9vd25lci9yZXBvLmdpdGAgd291bGQgb3RoZXJ3aXNlIGJlIHRha2VuIGZvciBHaXRIdWIsIGFuZCBhbiB1cHBlcmNhc2VcbiAqIGBHSVRIVUIuQ09NYCB3b3VsZCBiZSByZWplY3RlZC4gYGdpdGh1Yjpvd25lci9yZXBvYCBpcyBucG0ncyBzaG9ydGhhbmQgYW5kIG5hbWVzIG5vIGhvc3QsIHNvIGl0IGlzXG4gKiByZWNvZ25pemVkIHNlcGFyYXRlbHk7IG5vcm1hbGl6ZVJlcG9zaXRvcnlVcmxGb3JQYWNrYWdlSnNvbiBhY2NlcHRzIHRoZSBzYW1lIHNob3J0aGFuZC5cbiAqL1xuZnVuY3Rpb24gdGFyZ2V0c0dpdEh1Yih1cmw6IHN0cmluZyk6IGJvb2xlYW4ge1xuICBpZiAoL15naXRodWI6L2l1LnRlc3QodXJsKSkgcmV0dXJuIHRydWU7XG4gIC8vIHNjcC1zdHlsZSByZW1vdGVzIChgZ2l0QGdpdGh1Yi5jb206b3duZXIvcmVwby5naXRgKSBhcmUgbm90IHZhbGlkIFVSTHMuXG4gIGNvbnN0IHNjcEhvc3QgPSAvXlteL0BdKkAoW146L10rKTovdS5leGVjKHVybCk/LlsxXTtcbiAgaWYgKHNjcEhvc3QpIHJldHVybiBzY3BIb3N0LnRvTG93ZXJDYXNlKCkgPT09ICdnaXRodWIuY29tJztcbiAgdHJ5IHtcbiAgICByZXR1cm4gbmV3IFVSTCh1cmwucmVwbGFjZSgvXmdpdFxcKy91LCAnJykpLmhvc3RuYW1lLnRvTG93ZXJDYXNlKCkgPT09ICdnaXRodWIuY29tJztcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG59XG5cbi8qKlxuICogR2l0SHViIG93bmVyIG5hbWVzIGFyZSBjYXNlLWluc2Vuc2l0aXZlLCBhbmQgYSByZW1vdGUgb3IgbWFuaWZlc3QgVVJMIG1heSBzcGVsbCB0aGVtIGFueSB3YXksIGJ1dCB0aGUgQVBJJ3NcbiAqIGBmdWxsX25hbWVgIGFsd2F5cyByZXR1cm5lZCB0aGUgY2Fub25pY2FsIHNwZWxsaW5nIOKAlCB3aGljaCB0aGUgbWFueSBleGFjdCBgPT09ICdXaWxsQm9vc3RlcidgIHBvbGljeSBjaGVja3NcbiAqIChvcmdhbml6YXRpb24gd29ya2Zsb3dzLCBhdXRob3IgbWV0YWRhdGEsIHRoZSBXaWxsQm9vc3RlckxhYiBwcmUtcHVzaCBndWFyZCkgZGVwZW5kIG9uLiBDYW5vbmljYWxpemUgaGVyZSBzb1xuICogdGhlIGxvY2FsIGZhbGxiYWNrIHlpZWxkcyB0aGUgc2FtZSBpZGVudGl0eSB0aGUgQVBJIGRpZCwgaW5zdGVhZCBvZiBzaWxlbnRseSBza2lwcGluZyB0aG9zZSBwb2xpY2llcy5cbiAqL1xuZnVuY3Rpb24gY2Fub25pY2FsaXplT3duZXIob3duZXI6IHN0cmluZyk6IHN0cmluZyB7XG4gIGNvbnN0IGNhbm9uaWNhbE93bmVycyA9IFsnV2lsbEJvb3N0ZXInLCAnV2lsbEJvb3N0ZXJMYWInXTtcbiAgcmV0dXJuIGNhbm9uaWNhbE93bmVycy5maW5kKChjYW5kaWRhdGUpID0+IGNhbmRpZGF0ZS50b0xvd2VyQ2FzZSgpID09PSBvd25lci50b0xvd2VyQ2FzZSgpKSA/PyBvd25lcjtcbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB7IElTU1VFX1RFTVBMQVRFX1JVTEVTLCBQVUxMX1JFUVVFU1RfQk9EWV9SVUxFUywgVEVTVF9XUklUSU5HX1JVTEVTIH0gZnJvbSAnQHdpbGxib29zdGVyL3NoYXJlZC1saWIvc3JjJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZnNVdGlsIH0gZnJvbSAnLi4vdXRpbHMvZnNVdGlsLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuaW1wb3J0IHsgZ2VuZXJhdGVzV29ya2VyVHlwZXMgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGhhc0Nsb3VkZmxhcmVEZXBsb3lXb3JrZmxvdywgaW52b2tlc1diRGVwbG95IH0gZnJvbSAnLi93b3JrZmxvdy5qcyc7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZW5lcmF0ZUFnZW50SW5zdHJ1Y3Rpb25zKHJvb3RDb25maWc6IFBhY2thZ2VDb25maWcsIGFsbENvbmZpZ3M6IFBhY2thZ2VDb25maWdbXSk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2dlbmVyYXRlQWdlbnRJbnN0cnVjdGlvbnMnLCBhc3luYyAoKSA9PiB7XG4gICAgaWYgKCFyb290Q29uZmlnLmlzUm9vdCkgcmV0dXJuO1xuXG4gICAgY29uc3QgZXh0cmFDb250ZW50ID0gYXdhaXQgcmVhZEFnZW50c0V4dHJhQ29udGVudChyb290Q29uZmlnLmRpclBhdGgpO1xuXG4gICAgZm9yIChjb25zdCBbZmlsZU5hbWUsIHRvb2xOYW1lXSBvZiBbXG4gICAgICBbJ0FHRU5UUy5tZCcsICdDb2RleCBDTEknXSxcbiAgICAgIFsnQ0xBVURFLm1kJywgJ0NsYXVkZSBDb2RlJ10sXG4gICAgICBbJ0dFTUlOSS5tZCcsICdHZW1pbmkgQ0xJJ10sXG4gICAgXSBhcyBjb25zdCkge1xuICAgICAgY29uc3QgY29udGVudCA9IGdlbmVyYXRlQWdlbnRJbnN0cnVjdGlvbihyb290Q29uZmlnLCBhbGxDb25maWdzLCB0b29sTmFtZSwgZXh0cmFDb250ZW50KTtcbiAgICAgIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKHJvb3RDb25maWcuZGlyUGF0aCwgZmlsZU5hbWUpO1xuICAgICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzVXRpbC5nZW5lcmF0ZUZpbGUoZmlsZVBhdGgsIGNvbnRlbnQpKTtcbiAgICB9XG5cbiAgICBjb25zdCBjdXJzb3JSdWxlc1BhdGggPSBwYXRoLnJlc29sdmUocm9vdENvbmZpZy5kaXJQYXRoLCAnLmN1cnNvci9ydWxlcy9nZW5lcmFsLm1kYycpO1xuICAgIGNvbnN0IGN1cnNvclJ1bGVzQ29udGVudCA9IGdlbmVyYXRlQ3Vyc29yR2VuZXJhbE1kY0NvbnRlbnQocm9vdENvbmZpZywgYWxsQ29uZmlncywgZXh0cmFDb250ZW50KTtcbiAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnNVdGlsLmdlbmVyYXRlRmlsZShjdXJzb3JSdWxlc1BhdGgsIGN1cnNvclJ1bGVzQ29udGVudCkpO1xuICB9KTtcbn1cblxuY29uc3QgYWdlbnRzRXh0cmFDb250ZW50Q2FjaGUgPSBuZXcgTWFwPHN0cmluZywgc3RyaW5nIHwgdW5kZWZpbmVkPigpO1xuXG4vKipcbiAqIFJlYWRzIHRoZSByb290J3MgdXNlci1hdXRob3JlZCBBR0VOVFNfRVhUUkEubWQgb25jZSBwZXIgcHJvY2Vzczogd2JmeSBuZXZlciByZXdyaXRlcyB0aGUgZmlsZSxcbiAqIGFuZCBib3RoIHRoZSBhZ2VudC1pbnN0cnVjdGlvbiBhbmQgR2VtaW5pIGdlbmVyYXRvcnMgbmVlZCBpdHMgY29udGVudC4gQ2FjaGluZyB0aGUgcmVzb2x2ZWRcbiAqIHZhbHVlIChub3QgdGhlIFByb21pc2UpIGlzIHJhY2UtZnJlZSBiZWNhdXNlIHRoZSB0d28gY2FsbGVycyBydW4gc2VxdWVudGlhbGx5IGluIGluZGV4LnRzLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcmVhZEFnZW50c0V4dHJhQ29udGVudChyb290RGlyUGF0aDogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmcgfCB1bmRlZmluZWQ+IHtcbiAgY29uc3QgYWdlbnRzRXh0cmFQYXRoID0gcGF0aC5yZXNvbHZlKHJvb3REaXJQYXRoLCAnQUdFTlRTX0VYVFJBLm1kJyk7XG4gIGlmICghYWdlbnRzRXh0cmFDb250ZW50Q2FjaGUuaGFzKGFnZW50c0V4dHJhUGF0aCkpIHtcbiAgICBhZ2VudHNFeHRyYUNvbnRlbnRDYWNoZS5zZXQoYWdlbnRzRXh0cmFQYXRoLCBhd2FpdCBmc1V0aWwucmVhZEZpbGVJZkV4aXN0cyhhZ2VudHNFeHRyYVBhdGgpKTtcbiAgfVxuICByZXR1cm4gYWdlbnRzRXh0cmFDb250ZW50Q2FjaGUuZ2V0KGFnZW50c0V4dHJhUGF0aCk7XG59XG5cbmZ1bmN0aW9uIGdlbmVyYXRlQ3Vyc29yR2VuZXJhbE1kY0NvbnRlbnQoXG4gIGNvbmZpZzogUGFja2FnZUNvbmZpZyxcbiAgYWxsQ29uZmlnczogUGFja2FnZUNvbmZpZ1tdLFxuICBleHRyYUNvbnRlbnQ/OiBzdHJpbmdcbik6IHN0cmluZyB7XG4gIGNvbnN0IGZyb250bWF0dGVyID0gYC0tLVxcbmRlc2NyaXB0aW9uOiBHZW5lcmFsIENvZGluZyBSdWxlc1xcbmdsb2JzOlxcbmFsd2F5c0FwcGx5OiB0cnVlXFxuLS0tYDtcbiAgY29uc3QgYm9keSA9IGdlbmVyYXRlQWdlbnRJbnN0cnVjdGlvbihjb25maWcsIGFsbENvbmZpZ3MsICdDdXJzb3InLCBleHRyYUNvbnRlbnQpO1xuICByZXR1cm4gYCR7ZnJvbnRtYXR0ZXJ9XFxuXFxuJHtib2R5fWA7XG59XG5cbmZ1bmN0aW9uIGdlbmVyYXRlQWdlbnRJbnN0cnVjdGlvbihcbiAgcm9vdENvbmZpZzogUGFja2FnZUNvbmZpZyxcbiAgYWxsQ29uZmlnczogUGFja2FnZUNvbmZpZ1tdLFxuICB0b29sTmFtZTogc3RyaW5nLFxuICBleHRyYUNvbnRlbnQ/OiBzdHJpbmdcbik6IHN0cmluZyB7XG4gIGNvbnN0IHBhY2thZ2VNYW5hZ2VyID0gJ2J1bic7XG4gIGNvbnN0IGRlc2NyaXB0aW9uID0gcm9vdENvbmZpZy5wYWNrYWdlSnNvbj8uZGVzY3JpcHRpb247XG4gIGNvbnN0IGZub3hJbnN0cnVjdGlvbiA9IGZzLmV4aXN0c1N5bmMocGF0aC5yZXNvbHZlKHJvb3RDb25maWcuZGlyUGF0aCwgJ2Zub3gudG9tbCcpKVxuICAgID8gYFxcbi0gRW52aXJvbm1lbnQgdmFyaWFibGVzIGFuZCBzZWNyZXRzIGxpdmUgaW4gXFxgZm5veC50b21sXFxgIChtaXNlICsgZm5veCk7IG5ldmVyIGNyZWF0ZSBcXGAuZW52XFxgLCBcXGAuZW52LipcXGAsIG9yIFxcYC5kZXYudmFyc1xcYCBmaWxlcy4gUnVuIGNvbW1hbmRzIHRocm91Z2ggXFxgJHtwYWNrYWdlTWFuYWdlcn0gd2IgLi4uXFxgIG9yIFxcYGZub3ggcnVuIC1QIDxwcm9maWxlPiAtLSA8Y29tbWFuZD5cXGAuIFByb2ZpbGUgc2VjcmV0cyBsb2FkIG9ubHkgd2hlbiBhIHByb2ZpbGUgaXMgc2VsZWN0ZWQ6IG1vZGUtYXdhcmUgd2IgY29tbWFuZHMgKGUuZy4gXFxgd2Igc3RhcnRcXGAsIFxcYHdiIHRlc3RcXGApIGFuZCBcXGB3YiBkb3RlbnZcXGAgc2VsZWN0IGl0IHRoZW1zZWx2ZXMgKFxcYHdiIGRvdGVudlxcYCB1c2VzIFxcYFdCX0VOVlxcYCwgZWxzZSBcXGBGTk9YX1BST0ZJTEVcXGAsIGVsc2UgXFxgTk9ERV9FTlZcXGAsIGVsc2UgdGhlIGRldmVsb3BtZW50IHByb2ZpbGU7IFxcYFdCX0VOVlxcYCBhY2NlcHRzIG9ubHkgXFxgZGV2ZWxvcG1lbnRcXGAvXFxgdGVzdFxcYC9cXGBzdGFnaW5nXFxgL1xcYHByb2R1Y3Rpb25cXGAsIHNvIHVzZSBcXGBGTk9YX1BST0ZJTEVcXGAgZm9yIGFueSBvdGhlciBwcm9maWxlKSwgd2hpbGUgYmFyZSBcXGBmbm94IHJ1blxcYCBuZWVkcyBhbiBleHBsaWNpdCBcXGAtUCA8cHJvZmlsZT5cXGAuYFxuICAgIDogJyc7XG4gIC8vIG1pc2Ugb3ducyB0aGUgcGlubmVkIHRvb2wgdmVyc2lvbnMsIHNvIGEgdmVyc2lvbiBtaXNtYXRjaCBpcyBmaXhlZCBieSBlZGl0aW5nIG1pc2UudG9tbCDigJQgbm90XG4gIC8vIGJ5IGluc3RhbGxpbmcgYSBkaWZmZXJlbnQgdmVyc2lvbiBnbG9iYWxseSwgd2hpY2ggdGhlIG5leHQgYG1pc2UgaW5zdGFsbGAgc2lsZW50bHkgb3ZlcnJpZGVzLlxuICBjb25zdCBtaXNlSW5zdHJ1Y3Rpb24gPSBmcy5leGlzdHNTeW5jKHBhdGgucmVzb2x2ZShyb290Q29uZmlnLmRpclBhdGgsICdtaXNlLnRvbWwnKSlcbiAgICA/ICdcXG4tIFRvb2wgdmVyc2lvbnMgKGUuZy4sIG5vZGUpIGFyZSBwaW5uZWQgaW4gYG1pc2UudG9tbGA7IHJ1biBgbWlzZSBpbnN0YWxsYCBhZnRlciBjaGFuZ2luZyBpdCBhbmQgbmV2ZXIgaW5zdGFsbCB0aG9zZSB0b29scyBnbG9iYWxseSBpbnN0ZWFkLidcbiAgICA6ICcnO1xuICAvLyBJc29sYXRlZCBpbnN0YWxscyBhcmUgdGhlIG9yZyBzdGFuZGFyZCAod2JmeSBnZW5lcmF0ZXMgbm8gb3RoZXIgbGlua2VyKSBhbmQgdGhlIG1vc3RcbiAgLy8gYWdlbnQtaG9zdGlsZSBwYXJ0IG9mIHRoZSBzdGFjazogYSBwYWNrYWdlIHRoYXQgaXMgb25seSByZWFjaGFibGUgYmVjYXVzZSBhIGRlcGVuZGVuY3kgaG9pc3RlZFxuICAvLyBpdCBubyBsb25nZXIgcmVzb2x2ZXMsIGFuZCB0aGUgcmVmbGV4IGZpeCAoc3dpdGNoaW5nIHRoZSBsaW5rZXIgYmFjaykgc2lsZW50bHkgcmVpbnRyb2R1Y2VzXG4gIC8vIHRoZSBwaGFudG9tIGRlcGVuZGVuY2llcyB0aGUgbGF5b3V0IGV4aXN0cyB0byBjYXRjaC5cbiAgY29uc3QgaXNvbGF0ZWRJbnN0YWxsSW5zdHJ1Y3Rpb24gPSBgXFxuLSBcXGBidW5maWcudG9tbFxcYCB1c2VzIEJ1bidzIGlzb2xhdGVkIGxpbmtlciwgc28gb25seSBkZWNsYXJlZCBkZXBlbmRlbmNpZXMgcmVzb2x2ZS4gSWYgYW4gaW1wb3J0IGZhaWxzIHRvIHJlc29sdmUsIGRlY2xhcmUgdGhhdCBwYWNrYWdlIGluIHRoZSBcXGBwYWNrYWdlLmpzb25cXGAgdGhhdCBpbXBvcnRzIGl0OyBuZXZlciBzd2l0Y2ggXFxgbGlua2VyXFxgIHRvIFxcYGhvaXN0ZWRcXGAgb3IgYWRkIHRvIFxcYHB1YmxpY0hvaXN0UGF0dGVyblxcYCB0byB3b3JrIGFyb3VuZCBpdC5gO1xuICAvLyBFdmVyeSBjbGF1c2Ugc3RhdGVzIG9ubHkgYSB2ZXJpZmllZCBmYWN0LCByZXVzaW5nIHRoZSB3b3JrZmxvdyBnZW5lcmF0b3IncyBvd24gZGV0ZWN0b3JzOiB0aGVcbiAgLy8gd3JhbmdsZXItY29uZmlnIGNsYXVzZSBuZWVkcyBhbiBhY3R1YWwgY29uZmlnIGZpbGUgKGlzQ2xvdWRmbGFyZSBhbHNvIG1hdGNoZXMgYSBtZXJlIHdyYW5nbGVyXG4gIC8vIG1lbnRpb24gaW4gYSBzY3JpcHQgb3Igd29ya2Zsb3cpLCB0aGUgd29ya2Zsb3cgY2xhdXNlIG5lZWRzIGEgbGl2ZSByZXVzYWJsZS1kZXBsb3kgY2FsbGVyXG4gIC8vIChZQU1MLXBhcnNlZCBqb2JzLioudXNlcywgbm90IGEgcmF3LXRleHQvY29tbWVudCBtYXRjaCksIGFuZCB0aGUgYHdiIGRlcGxveWAgY2xhdXNlIG5lZWRzIGFcbiAgLy8gZGVwbG95IHNjcmlwdCB3aG9zZSBjb21tYW5kIHRva2VuIGlzIGB3YiDigKYgZGVwbG95YC5cbiAgY29uc3Qgb3duc1dyYW5nbGVyQ29uZmlnID0gYWxsQ29uZmlncy5zb21lKChjb25maWcpID0+IGNvbmZpZy5kb2VzQ29udGFpbldyYW5nbGVyQ29uZmlnKTtcbiAgLy8gT25seSBjbGFpbSB0aGUgZmlsZSBpcyBnZW5lcmF0ZWQgd2hlcmUgaXQgYWN0dWFsbHkgaXM6IGEgcGFja2FnZSB0aGF0IGhhbmQtbWFpbnRhaW5zIGl0cyBgRW52YCAoZS5nLiB1bmRlclxuICAvLyBgdHlwZXM6IFtcImJ1blwiXWApIGlzIGRlbGliZXJhdGVseSBsZWZ0IHVubWFuYWdlZCwgYW5kIHRlbGxpbmcgYW4gYWdlbnQgdG8gcnVuIGB3YiBnZW4tY29kZWAgdGhlcmUgd291bGQgc2VuZFxuICAvLyBpdCBhZnRlciBhIGZpbGUgdGhhdCBuZXZlciBhcHBlYXJzIOKAlCBhbmQgYXdheSBmcm9tIHRoZSBgRW52YCBpdCBzaG91bGQgYmUgZWRpdGluZy5cbiAgY29uc3Qgb3duc0dlbmVyYXRlZFdvcmtlclR5cGVzID0gYWxsQ29uZmlncy5zb21lKChjb25maWcpID0+IGdlbmVyYXRlc1dvcmtlclR5cGVzKGNvbmZpZykpO1xuICBjb25zdCBoYXNEZXBsb3lXb3JrZmxvdyA9IGhhc0Nsb3VkZmxhcmVEZXBsb3lXb3JrZmxvdyhwYXRoLnJlc29sdmUocm9vdENvbmZpZy5kaXJQYXRoLCAnLmdpdGh1Yi93b3JrZmxvd3MnKSk7XG4gIGNvbnN0IHVzZXNXYkRlcGxveSA9IGFsbENvbmZpZ3Muc29tZSgoY29uZmlnKSA9PiB7XG4gICAgY29uc3QgZGVwbG95U2NyaXB0ID0gY29uZmlnLnBhY2thZ2VKc29uPy5zY3JpcHRzPy5bJ2RlcGxveSddO1xuICAgIHJldHVybiAoXG4gICAgICB0eXBlb2YgZGVwbG95U2NyaXB0ID09PSAnc3RyaW5nJyAmJlxuICAgICAgaW52b2tlc1diRGVwbG95KGRlcGxveVNjcmlwdCwgbmV3IFNldChPYmplY3Qua2V5cyhjb25maWcucGFja2FnZUpzb24/LnNjcmlwdHMgPz8ge30pKSlcbiAgICApO1xuICB9KTtcbiAgLy8gSW5kZXBlbmRlbnQgZmFjdHMgc3RheSBzZXBhcmF0ZSBzZW50ZW5jZXM6IHRoZSB3b3JrZmxvdydzIG93biBkZXBsb3kgbWVjaGFuaXNtIGlzIG5vdFxuICAvLyBpbnNwZWN0ZWQsIHNvIHRoZSB3Yi1kZXBsb3kgY2xhdXNlIG11c3Qgbm90IGNsYWltIHRoZSB3b3JrZmxvdyBpbnZva2VzIGl0LlxuICBjb25zdCBjbG91ZGZsYXJlSW5zdHJ1Y3Rpb24gPSBvd25zV3JhbmdsZXJDb25maWdcbiAgICA/IGBcXG4tIFRoaXMgcHJvamVjdCBydW5zIG9uIENsb3VkZmxhcmUgV29ya2VyczogdGhlIHdyYW5nbGVyIGNvbmZpZ3VyYXRpb24gZmlsZSBob2xkcyB0aGUgV29ya2VyJ3MgY29uZmlndXJhdGlvbiwgaW5jbHVkaW5nIGJpbmRpbmdzIGFuZCBwZXItZW52aXJvbm1lbnQgb3ZlcnJpZGVzLiR7aGFzRGVwbG95V29ya2Zsb3cgPyAnIFRoZSBkZXBsb3kgd29ya2Zsb3dzIHVuZGVyIGAuZ2l0aHViL3dvcmtmbG93c2AgcGVyZm9ybSBkZXBsb3ltZW50cy4nIDogJyd9JHt1c2VzV2JEZXBsb3kgPyAnIFRoZSBgZGVwbG95YCBwYWNrYWdlIHNjcmlwdCBydW5zIGB3YiBkZXBsb3lgLicgOiAnJ30ke293bnNHZW5lcmF0ZWRXb3JrZXJUeXBlcyA/IGBcXG4tIFxcYHdvcmtlci1jb25maWd1cmF0aW9uLmQudHNcXGAgaXMgZ2l0aWdub3JlZCBhbmQgZ2VuZXJhdGVkIGJ5IFxcYCR7cGFja2FnZU1hbmFnZXJ9IHdiIGdlbi1jb2RlXFxgOyBhZnRlciBjaGFuZ2luZyBiaW5kaW5ncyBvciB2YXJzIGluIHRoZSB3cmFuZ2xlciBjb25maWd1cmF0aW9uLCByZS1ydW4gaXQgaW5zdGVhZCBvZiBlZGl0aW5nIHRoZSBmaWxlIGJ5IGhhbmQuYCA6ICcnfWBcbiAgICA6ICcnO1xuICAvLyBXaWxsQm9vc3RlciBSYWlsd2F5IHByb2plY3QgaWRlbnRpZmllcnMgYXJlIG1hbmFnZWQgaW4gZGVwbG95IHdvcmtmbG93IHNldHRpbmdzLlxuICBjb25zdCByYWlsd2F5SW5zdHJ1Y3Rpb24gPSByb290Q29uZmlnLmlzUmFpbHdheVxuICAgID8gJ1xcbi0gUmFpbHdheSBwcm9qZWN0IGluZm9ybWF0aW9uIGlzIGluIHRoZSBkZXBsb3kgd29ya2Zsb3dzIHVuZGVyIGAuZ2l0aHViL3dvcmtmbG93c2AuJ1xuICAgIDogJyc7XG4gIGNvbnN0IHBsYXl3cmlnaHRUZXN0U2VydmVySW5zdHJ1Y3Rpb24gPSBoYXNQbGF5d3JpZ2h0VGVzdFNlcnZlcihhbGxDb25maWdzKVxuICAgID8gYFxcbi0gVXNlIFxcYCR7cGFja2FnZU1hbmFnZXJ9IHdiIHN0YXJ0IC0tbW9kZSB0ZXN0XFxgIHRvIGxhdW5jaCBhIHdlYiBzZXJ2ZXIgZm9yIGRlYnVnZ2luZyBvciB0ZXN0aW5nLmBcbiAgICA6ICcnO1xuICBjb25zdCBjb0F1dGhvckluc3RydWN0aW9uID0gcm9vdENvbmZpZy5pc1dpbGxCb29zdGVyUmVwb1xuICAgID8gYFxcbiAgLSBFbmQgeW91ciBjb21taXQgbWVzc2FnZSB3aXRoIGEgYmxhbmsgbGluZSBmb2xsb3dlZCBieSBcXGBDby1hdXRob3JlZC1ieTogV2lsbEJvb3N0ZXIgKCR7dG9vbE5hbWV9KSA8YWdlbnRAd2lsbGJvb3N0ZXIuY29tPlxcYCwgdGhlIG9ubHkgQUkgYXR0cmlidXRpb24gdG8gYWRkLmBcbiAgICA6ICcnO1xuICAvLyBLZXllZCBvbiB0aGUgcmVwb3NpdG9yeSBjbGFzc2lmaWNhdGlvbiByYXRoZXIgdGhhbiBvbiB0aGUgdGVtcGxhdGUgZmlsZXMnIHByZXNlbmNlOiB0aGUgc2FtZVxuICAvLyBydW4gd3JpdGVzIHRoZSB0ZW1wbGF0ZXMgZm9yIFdpbGxCb29zdGVyIC8gV2lsbEJvb3N0ZXJMYWIgcmVwb3NpdG9yaWVzIGJlZm9yZSB0aGlzIGdlbmVyYXRvclxuICAvLyBydW5zLCBhbmQgaGFuZC1hZGRlZCB0ZW1wbGF0ZXMgZWxzZXdoZXJlIGJlbG9uZyB0byBBR0VOVFNfRVhUUkEubWQuXG4gIGNvbnN0IHByVGVtcGxhdGVJbnN0cnVjdGlvbiA9IHJvb3RDb25maWcuaXNXaWxsQm9vc3RlclJlcG9cbiAgICA/IGBcXG4ke1BVTExfUkVRVUVTVF9CT0RZX1JVTEVTLnJlcGxhY2VBbGwoL14vZ20sICcgICcpfWBcbiAgICA6ICcnO1xuICAvLyBHYXRlZCBsaWtlIHByVGVtcGxhdGVJbnN0cnVjdGlvbjogdGhlIHNlY3Rpb24gaXQgbmFtZXMgZXhpc3RzIG9ubHkgd2hlcmUgdGhlIHRlbXBsYXRlIGlzIGdlbmVyYXRlZC5cbiAgY29uc3QgcmVxdWlyZW1lbnRzRXhlbXB0aW9uID0gcm9vdENvbmZpZy5pc1dpbGxCb29zdGVyUmVwb1xuICAgID8gXCIsIGFuZCBzbyBpcyB0aGUgUFIgYm9keSdzIFJlcXVpcmVtZW50cyBzZWN0aW9uLCB3aGljaCByZWNvcmRzIHdoYXQgd2FzIGFza2VkIGZvciByYXRoZXIgdGhhbiB3aGF0IHRoZSBjb2RlIGNvbnRhaW5zXCJcbiAgICA6ICcnO1xuICBjb25zdCBpc3N1ZVRlbXBsYXRlSW5zdHJ1Y3Rpb24gPSByb290Q29uZmlnLmlzV2lsbEJvb3N0ZXJSZXBvXG4gICAgPyBgXFxuLSBXaGVuIGNyZWF0aW5nIGFuIGlzc3VlOlxcbiR7SVNTVUVfVEVNUExBVEVfUlVMRVMucmVwbGFjZUFsbCgvXi9nbSwgJyAgJyl9YFxuICAgIDogJyc7XG4gIGNvbnN0IHJ1bm5lckluc3RydWN0aW9uID0gcm9vdENvbmZpZy5pc1dpbGxCb29zdGVyUmVwb1xuICAgID8gJ1xcbi0gUHJpdmF0ZSByZXBvc2l0b3JpZXMgdXNlIHNlbGYtaG9zdGVkIENJIHJ1bm5lcnMuIEtlZXAgT1Mvc2l6ZSBjb25zdHJhaW50cyBpbiBhbiBleHBsaWNpdCBzZWxmLWhvc3RlZCBsYWJlbCBhcnJheTsgZml4IG1pc3NpbmcgcnVubmVyIGNhcGFiaWxpdGllcyBpbnN0ZWFkIG9mIHN3aXRjaGluZyB0byBHaXRIdWItaG9zdGVkIHJ1bm5lcnMuIFRoZSBzb2xlIGFwcHJvdmVkIGV4Y2VwdGlvbiBpcyB0aGUgV2luZG93cyBkZXNrdG9wIGJ1aWxkIGluIFdpbGxCb29zdGVyL2NoZWVybGluZ3MuJ1xuICAgIDogJyc7XG4gIGNvbnN0IHByb2plY3ROYW1lID0gcm9vdENvbmZpZy5wYWNrYWdlSnNvbj8ubmFtZSB8fCBwYXRoLmJhc2VuYW1lKHBhdGgucmVzb2x2ZShyb290Q29uZmlnLmRpclBhdGgpKTtcbiAgY29uc3QgYmFzZUNvbnRlbnQgPSBgXG4jIyBQcm9qZWN0IEluZm9ybWF0aW9uXG5cbi0gTmFtZTogXFxgJHtwcm9qZWN0TmFtZX1cXGAke2Rlc2NyaXB0aW9uID8gYFxcbi0gRGVzY3JpcHRpb246ICR7ZGVzY3JpcHRpb259YCA6ICcnfVxuLSBQYWNrYWdlIE1hbmFnZXI6ICR7cGFja2FnZU1hbmFnZXJ9XG5cbiMjIEdlbmVyYWwgSW5zdHJ1Y3Rpb25zXG5cbi0gSWYgb24gXFxgbWFpblxcYCwgY3JlYXRlIGEgbmV3IGJyYW5jaDsgb3RoZXJ3aXNlIHdvcmsgb24gdGhlIGN1cnJlbnQgYnJhbmNoLlxuLSBSdW4gXFxgZ2l0XFxgIGNvbW1hbmRzIG9uZSBhdCBhIHRpbWUgdG8gYXZvaWQgXFxgaW5kZXgubG9ja1xcYCBjb25mbGljdHMuXG4ke1RFU1RfV1JJVElOR19SVUxFU31cbi0gV2hlbiBmaXhpbmcgaXNzdWVzIChpbmNsdWRpbmcgdGVzdCBmYWlsdXJlcyksIGludmVzdGlnYXRlIHRoZSByb290IGNhdXNlIGZpcnN0IChlLmcuLCB2aWEgZGVidWcgbG9ncyBvciBzY3JlZW5zaG90cykgYW5kIGZpeCBpdCBpbnN0ZWFkIG9mIGFwcGx5aW5nIHdvcmthcm91bmRzLlxuLSBBZnRlciBtYWtpbmcgY2hhbmdlcywgcnVuIFxcYCR7cGFja2FnZU1hbmFnZXJ9IHJ1biB2ZXJpZnlcXGAgKHR5cGUgY2hlY2tpbmcgYW5kIGxpbnRpbmc7IHVwIHRvIDEwIG1pbnV0ZXMpLCBvciBcXGAke3BhY2thZ2VNYW5hZ2VyfSBydW4gdmVyaWZ5LWZ1bGxcXGAgKGFsbCB0ZXN0czsgdXAgdG8gMSBob3VyKSBpZiB5b3UgY2hhbmdlZCBydW50aW1lIGJlaGF2aW9yIG9yIHRlc3RzLiBGaXggZXJyb3JzIGFuZCByZS1ydW4gdW50aWwgaXQgcGFzc2VzLlxuICAtIFdhaXQgZm9yIGl0IHRvIGZpbmlzaCB3aXRob3V0IHJlc3RhcnRpbmcgaXQ6IHByZWZlciBjb21wbGV0aW9uIG5vdGlmaWNhdGlvbnMsIG90aGVyd2lzZSB0aGUgbG9uZ2VzdCBwZXJtaXR0ZWQgd2FpdDsgbm8gb3V0cHV0IGRvZXMgbm90IG1lYW4gaXQgaGFzIHN0b3BwZWQuIElmIHRoZSBkaXNwbGF5ZWQgZXhjZXJwdCBpcyBpbnN1ZmZpY2llbnQsIHJlYWQgdGhlIGluZGljYXRlZCBsb2cgZmlsZSBiZWZvcmUgcmVydW5uaW5nLiBJZiB0aGUgZW52aXJvbm1lbnQga2lsbHMgbG9uZy1ydW5uaW5nIGNvbW1hbmRzLCBydW4gdGhlbSBkZXRhY2hlZCB3aXRoIGEgc2F2ZWQgbG9nIGFuZCBleGl0IHN0YXR1cy5cbi0gT25jZSB2ZXJpZmllZCwgY29tbWl0IGFuZCBwdXNoIHRvIHRoZSBjdXJyZW50IChub24tbWFpbikgYnJhbmNoLCBhbmQgY3JlYXRlIGEgUFIgdmlhIFxcYGdoXFxgIGlmIG5vbmUgZXhpc3RzIGZvciB0aGUgYnJhbmNoLlxuICAtIEZvbGxvdyB0aGUgQ29udmVudGlvbmFsIENvbW1pdHMgZm9ybWF0IChlLmcuLCBcXGBmZWF0OlxcYCwgXFxgZml4OlxcYCkuJHtjb0F1dGhvckluc3RydWN0aW9ufVxuICAtIEFsd2F5cyBjcmVhdGUgbmV3IGNvbW1pdHM7IGF2b2lkIFxcYC0tYW1lbmRcXGAuJHtwclRlbXBsYXRlSW5zdHJ1Y3Rpb259JHtpc3N1ZVRlbXBsYXRlSW5zdHJ1Y3Rpb259XG4tIEluIGFueSBleHBsYW5hdG9yeSB0ZXh0IChjb21taXQgbWVzc2FnZXMsIFBSIGRlc2NyaXB0aW9ucywgZG9jdW1lbnRhdGlvbiwgY29kZSBjb21tZW50cywgZXRjLiksIGRlc2NyaWJlIG9ubHkgdGhlIGN1cnJlbnQgaW1wbGVtZW50YXRpb246IGRyb3AgYW55IHN0YXRlbWVudCBuYW1pbmcgYW4gaWRlbnRpZmllciwgZmVhdHVyZSwgb3IgY29uY2VwdCB5b3UgY2Fubm90IGNvbmZpcm0gZXhpc3RzIGluIHRoZSBmaW5hbCBkaWZmIG9yIHRoZSBjdXJyZW50IGNvZGViYXNlIChlLmcuLCBvbmUgYWRkZWQgYW5kIGxhdGVyIHJlbW92ZWQgb3IgcmVuYW1lZCBhbG9uZyB0aGUgd2F5KS4gV2hlbmV2ZXIgZG9jdW1lbnRhdGlvbiBvciBjb21tZW50cyBubyBsb25nZXIgbWF0Y2ggdGhlIGN1cnJlbnQgaW1wbGVtZW50YXRpb24gKHJlbW92ZWQgb3B0aW9ucywgZGVwcmVjYXRlZCB1c2FnZSwgb3V0ZGF0ZWQgYmVoYXZpb3IpLCBkZWxldGUgb3IgcmV3cml0ZSB0aGVtLCBldmVuIGluIGZpbGVzIHlvdSBhcmUgbm90IG90aGVyd2lzZSBjaGFuZ2luZy4gTWVudGlvbiBhIHBhc3Qgc3RhdGUgb25seSB3aGVyZSBpdCBpcyBuZWVkZWQgdG8gdW5kZXJzdGFuZCB3aHkgdGhlIGN1cnJlbnQgZGVzaWduIGlzIGFzIGl0IGlzLCBvciB3aGVuIGV4cGxpY2l0bHkgYXNrZWQ7IGZpbGVzIHRoYXQgcmVjb3JkIGhpc3RvcnkgYnkgZGVzaWduIChlLmcuLCBhIGNoYW5nZWxvZykgYXJlIGV4ZW1wdCR7cmVxdWlyZW1lbnRzRXhlbXB0aW9ufS5cbi0gVXNlIGhlcmVkb2MgZm9yIG11bHRpLWxpbmUgY29tbWFuZCBpbnB1dCAoZS5nLiwgXFxgZ2l0IGNvbW1pdCAtRiAtXFxgLCBcXGBnaCBwciBjcmVhdGUgLS1ib2R5LWZpbGUgLVxcYCwgXFxgZ2ggaXNzdWUgY3JlYXRlIC0tYm9keS1maWxlIC1cXGApLlxuLSBQdXQgdGVtcG9yYXJ5IGZpbGVzIGluIFxcYC50bXBcXGA7IHVzZSBcXGAvdG1wXFxgIG9ubHkgZm9yIGZpbGVzIHRoYXQgbXVzdCBsaXZlIG91dHNpZGUgdGhlIHJlcG8uXG4tIFxcYEFHRU5UUy5tZFxcYCwgXFxgQ0xBVURFLm1kXFxgLCBcXGBHRU1JTkkubWRcXGAsIFxcYC5jdXJzb3IvcnVsZXMvZ2VuZXJhbC5tZGNcXGAsIGFuZCBcXGAuZ2VtaW5pL3N0eWxlZ3VpZGUubWRcXGAgYXJlIGdlbmVyYXRlZCBmcm9tIFxcYEFHRU5UU19FWFRSQS5tZFxcYCBhbmQgb3ZlcndyaXR0ZW4gb24gZXZlcnkgXFxgd2JmeVxcYCBydW47IHRvIGNoYW5nZSBhZ2VudCBpbnN0cnVjdGlvbnMsIGVkaXQgb25seSBcXGBBR0VOVFNfRVhUUkEubWRcXGAuJHttaXNlSW5zdHJ1Y3Rpb259JHtpc29sYXRlZEluc3RhbGxJbnN0cnVjdGlvbn0ke2Zub3hJbnN0cnVjdGlvbn0ke2Nsb3VkZmxhcmVJbnN0cnVjdGlvbn0ke3JhaWx3YXlJbnN0cnVjdGlvbn0ke3BsYXl3cmlnaHRUZXN0U2VydmVySW5zdHJ1Y3Rpb259JHtydW5uZXJJbnN0cnVjdGlvbn1cblxuJHtnZW5lcmF0ZUFnZW50Q29kaW5nU3R5bGUocm9vdENvbmZpZywgYWxsQ29uZmlncyl9XG5gXG4gICAgLnJlcGxhY2VBbGwoL1xcLlxcblxcbistL2csICcuXFxuLScpXG4gICAgLnJlcGxhY2VBbGwoL1xcbnszLH0vZywgJ1xcblxcbicpXG4gICAgLnRyaW0oKTtcblxuICBjb25zdCBoYXNOZXdTZWN0aW9uID0gZXh0cmFDb250ZW50Py50cmltKCkuc3RhcnRzV2l0aCgnIycpO1xuICBjb25zdCBub3JtYWxpemVkRXh0cmFDb250ZW50ID0gZXh0cmFDb250ZW50XG4gICAgPyBoYXNOZXdTZWN0aW9uXG4gICAgICA/ICdcXG5cXG4nICsgZXh0cmFDb250ZW50LnRyaW0oKVxuICAgICAgOiAnXFxuJyArIGV4dHJhQ29udGVudFxuICAgIDogJyc7XG4gIHJldHVybiBiYXNlQ29udGVudCArIG5vcm1hbGl6ZWRFeHRyYUNvbnRlbnQ7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZW5lcmF0ZUFnZW50Q29kaW5nU3R5bGUocm9vdENvbmZpZzogUGFja2FnZUNvbmZpZywgYWxsQ29uZmlnczogUGFja2FnZUNvbmZpZ1tdKTogc3RyaW5nIHtcbiAgLy8gVGF1cmkgZGVza3RvcCBhcHBzIHNoaXAgV2luZG93cyBidWlsZHMsIGFuZCB0aGUgYm91bmRhcnkgYmV0d2VlbiBhcHAgY29kZSBhbmQgc2hhcmVkIGNvZGUgaXNcbiAgLy8gdG9vIGZ1enp5IHRvIHNjb3BlIHRoZSBtYWNPUy9MaW51eC1vbmx5IHJ1bGUgcGVyIHBhY2thZ2UsIHNvIHN1Y2ggcmVwb3NpdG9yaWVzIHRhcmdldCBhbGxcbiAgLy8gdGhyZWUgT1NlcyBpbnN0ZWFkLlxuICBjb25zdCBoYXNEZXNrdG9wQXBwID0gYWxsQ29uZmlncy5zb21lKChjKSA9PiBjLmRlcGVuZGluZy50YXVyaSB8fCBjLmRvZXNDb250YWluVGF1cmlDb25maWdJblBhY2thZ2VzKTtcbiAgLy8gQSBwdWJsaWMgcmVwb3NpdG9yeSB3aXRoIG5vIGBAd2lsbGJvb3N0ZXIvYCBwYWNrYWdlIGlzIE9TUyBmb3IgdGhlIGdlbmVyYWwgcHVibGljLCB3aG9zZSB1c2Vyc1xuICAvLyBtYXkgcnVuIFdpbmRvd3MsIHNvIG5vIE9TIHJlc3RyaWN0aW9uIGFwcGxpZXMgdGhlcmUuIEFuIHVua25vd24gdmlzaWJpbGl0eSBjb2xsYXBzZXMgdG9cbiAgLy8gaXNQdWJsaWNSZXBvPWZhbHNlIGFuZCB0aGVyZWZvcmUga2VlcHMgdGhlIHJlc3RyaWN0aXZlIGRlZmF1bHQuXG4gIGNvbnN0IGlzR2VuZXJhbFB1YmxpY09zcyA9XG4gICAgcm9vdENvbmZpZy5pc1B1YmxpY1JlcG8gJiYgYWxsQ29uZmlncy5ldmVyeSgoYykgPT4gIWMucGFja2FnZUpzb24/Lm5hbWU/LnN0YXJ0c1dpdGgoJ0B3aWxsYm9vc3Rlci8nKSk7XG4gIC8vIE9ubHkgcHVibGljIHJlcG9zaXRvcmllcyBwdWJsaXNoIHBhY2thZ2VzIHRvIHRoZSBwdWJsaWMgbnBtIHJlZ2lzdHJ5LCB3aG9zZSB1c2VycyByZWFkIHRoZVxuICAvLyBKU0RvYyB3aXRob3V0IHRoZSBzb3VyY2U7IHByaXZhdGUgcmVwb3NpdG9yaWVzIGFyZSByZWFkIG9ubHkgYnkgYWdlbnRzIHRoYXQgaGF2ZSB0aGUgc291cmNlLlxuICBjb25zdCBucG1BcGlFeGNlcHRpb24gPSByb290Q29uZmlnLmlzUHVibGljUmVwb1xuICAgID8gJyBFeGNlcHRpb246IHRoZSBleHBvcnRlZCBBUEkgb2YgYSBwYWNrYWdlIHB1Ymxpc2hlZCB0byBucG0gbWF5IGNhcnJ5IEpTRG9jIGRlc2NyaWJpbmcgd2hhdCBpdCBkb2VzIGFuZCBob3cgdG8gY2FsbCBpdCwgYmVjYXVzZSBpdHMgdXNlcnMgcmVhZCBpdCB3aXRob3V0IHRoZSBzb3VyY2UuJ1xuICAgIDogJyc7XG4gIGNvbnN0IGNvbW1lbnRJbnN0cnVjdGlvbiA9IGAtIENvbW1lbnRzIGFuZCBKU0RvYzogZXZlcnkgcmVhZGVyIGhhcyB0aGUgc291cmNlLCBzbyBuZXZlciByZXN0YXRlIHdoYXQgdGhlIGNvZGUsIGl0cyBuYW1lcywgb3IgaXRzIHR5cGVzIGFscmVhZHkgc2F5IChlLmcuLCBcXGBAcGFyYW0gbmFtZSBUaGUgbmFtZVxcYCwgXFxgQHJldHVybnMgdGhlIHJlc3VsdFxcYCwgYSBuYXJyYXRpb24gb2YgdGhlIGNvbnRyb2wgZmxvdykuIFdyaXRlIG9uZSBvbmx5IHdoZW4gYSBwbGF1c2libGUgZWRpdCAoc2ltcGxpZnlpbmcsIGRlbGV0aW5nLCByZW9yZGVyaW5nLCByZXBsYWNpbmcpIHdvdWxkIGJyZWFrIHNvbWV0aGluZyB3aXRob3V0IHRoYXQga25vd2xlZGdlIGFuZCBubyB0eXBlIGNoZWNrLCBsaW50IHJ1bGUsIG9yIGV4aXN0aW5nIHRlc3Qgd291bGQgY2F0Y2ggdGhlIGJyZWFrYWdlOyBmaXJzdCB0cnkgdG8gZW5jb2RlIHRoZSBrbm93bGVkZ2UgaW4gY29kZSAoYSBuYW1lIHN1Y2ggYXMgXFxgdGltZW91dE1zXFxgLCBhIHR5cGUsIGFuIFxcYGFzc2VydFxcYCwgYSB0ZXN0KSBhbmQgY29tbWVudCBvbmx5IHdoYXQgY2Fubm90IGJlIGVuY29kZWQ6IGEgZGVsaWJlcmF0ZWx5IG9kZC1sb29raW5nIHdvcmthcm91bmQsIGEgZGVwZW5kZW5jeSBvbiBhIGZhY3Qgb3V0c2lkZSB0aGUgcmVwb3NpdG9yeSAoYW4gZXh0ZXJuYWwgQVBJJ3MgYmVoYXZpb3IsIGFuIGFncmVlbWVudCB3aXRoIGFub3RoZXIgc3lzdGVtKSwgb3IgYSByZWplY3RlZCBhbHRlcm5hdGl2ZSBhbmQgd2h5LiBQdXQgaXQgaW4gSlNEb2Mgd2hlbiBpdCBpcyBhIGNvbnRyYWN0IG9mIHRoZSBkZWNsYXJlZCBzeW1ib2wsIHNvIGNhbGxlcnMgc2VlIGl0LCBhbmQgaW4gYW4gaW5saW5lIGNvbW1lbnQgd2hlbiBpdCBjb25jZXJucyBzcGVjaWZpYyBsaW5lcy4gRGVsZXRlIGNvbW1lbnRzIHRoYXQgZmFpbCB0aGlzIHRlc3QgaW4gZmlsZXMgeW91IHRvdWNoLiR7bnBtQXBpRXhjZXB0aW9ufWA7XG4gIGNvbnN0IG9zQ29tcGF0aWJpbGl0eUluc3RydWN0aW9uID0gaXNHZW5lcmFsUHVibGljT3NzXG4gICAgPyAnJ1xuICAgIDogaGFzRGVza3RvcEFwcFxuICAgICAgPyAnLSBFbnN1cmUgY29tcGF0aWJpbGl0eSB3aXRoIFdpbmRvd3MsIG1hY09TLCBhbmQgTGludXguJ1xuICAgICAgOiAnLSBFbnN1cmUgY29tcGF0aWJpbGl0eSBvbmx5IHdpdGggbWFjT1MgYW5kIExpbnV4OyBkbyBub3QgaW5jbHVkZSBXaW5kb3dzLXNwZWNpZmljIGNvZGUuJztcbiAgLy8gQ2xvdWRmbGFyZSBXb3JrZXJzIGV4ZWN1dGUgYWNyb3NzIG1hbnkgZXBoZW1lcmFsIGlzb2xhdGVzIGFuZCB0d28gcmVxdWVzdHMgYXJlIG5vdCBndWFyYW50ZWVkXG4gIC8vIHRvIGhpdCB0aGUgc2FtZSBpbnN0YW5jZSwgc28gdGhlIHNpbmdsZS1pbnN0YW5jZSBzaW1wbGlmaWNhdGlvbiBzaWxlbnRseSBsb3NlcyBzdGF0ZSB0aGVyZSDigJRcbiAgLy8gYnV0IFdvcmtlcnMgZGVsaWJlcmF0ZWx5IHJldXNlIGV4ZWN1dGlvbiBjb250ZXh0cywgc28gYmVzdC1lZmZvcnQgaXNvbGF0ZS1sb2NhbCBjYWNoZXMgc3RheVxuICAvLyBsZWdpdGltYXRlIChodHRwczovL2RldmVsb3BlcnMuY2xvdWRmbGFyZS5jb20vd29ya2Vycy9yZWZlcmVuY2UvaG93LXdvcmtlcnMtd29ya3MvKS4gVGhlXG4gIC8vIHNpZ25hbHMgYXJlIGNvcnJlbGF0ZWQgUEVSIFBBQ0tBR0U6IGEgbW9ub3JlcG8gY2FuIGhvc3QgYSBzaW5nbGUtaW5zdGFuY2Ugc2VydmVyIGFwcCBuZXh0IHRvXG4gIC8vIGFuIHVucmVsYXRlZCBXb3JrZXIsIGFuZCBuZWl0aGVyIG1heSBvdmVycmlkZSB0aGUgb3RoZXIncyBydWxlLiBkb2VzQ29udGFpbldyYW5nbGVyQ29uZmlnIGlzXG4gIC8vIHRoZSBhY2N1cmF0ZSBXb3JrZXJzIHNpZ25hbCAoaXNDbG91ZGZsYXJlIGFsc28gbWF0Y2hlcyBhIG1lcmUgd3JhbmdsZXIgbWVudGlvbiBpbiBhIHNjcmlwdCBvclxuICAvLyB3b3JrZmxvdykuXG4gIGNvbnN0IGhhc1dvcmtlcnNBcHAgPSBhbGxDb25maWdzLnNvbWUoKGMpID0+IGMuZG9lc0NvbnRhaW5XcmFuZ2xlckNvbmZpZyk7XG4gIGNvbnN0IGhhc1NpbmdsZUluc3RhbmNlU2VydmVyQXBwID0gYWxsQ29uZmlncy5zb21lKFxuICAgIChjKSA9PiAoYy5kZXBlbmRpbmcubmV4dCB8fCBjLmRlcGVuZGluZy52aW5leHQpICYmICFjLmRvZXNDb250YWluV3JhbmdsZXJDb25maWdcbiAgKTtcbiAgY29uc3Qgd29ya2Vyc0luc3RydWN0aW9uID1cbiAgICAnLSBDbG91ZGZsYXJlIFdvcmtlcnMgcnVuIGFjcm9zcyBtYW55IGVwaGVtZXJhbCBpc29sYXRlcywgc28gdHdvIHJlcXVlc3RzIG1heSBoaXQgZGlmZmVyZW50IGluc3RhbmNlczogbmV2ZXIgbGV0IGNvcnJlY3RuZXNzIGRlcGVuZCBvbiBtb2R1bGUtbGV2ZWwgbXV0YWJsZSBzdGF0ZTsgcGVyc2lzdCBhdXRob3JpdGF0aXZlIHNoYXJlZCBzdGF0ZSBpbiBiaW5kaW5ncyAoRDEsIEtWLCBSMiwgRHVyYWJsZSBPYmplY3RzKS4gQmVzdC1lZmZvcnQgaXNvbGF0ZS1sb2NhbCBjYWNoZXMgb2Ygbm9uLXJlcXVlc3Qtc2NvcGVkIGRhdGEgYXJlIGZpbmUuJztcbiAgY29uc3Qgc2VydmVySW5zdGFuY2VJbnN0cnVjdGlvbiA9IGhhc1dvcmtlcnNBcHBcbiAgICA/IGhhc1NpbmdsZUluc3RhbmNlU2VydmVyQXBwXG4gICAgICA/IGAke3dvcmtlcnNJbnN0cnVjdGlvbn0gVGhpcyBhcHBsaWVzIHRvIGFsbCBjb2RlIHJ1bm5pbmcgb24gQ2xvdWRmbGFyZSBXb3JrZXJzICh0aGUgd3JhbmdsZXItY29uZmlndXJlZCBwYWNrYWdlcyBhbmQgYW55IHdvcmtzcGFjZSBwYWNrYWdlIHRoZXkgaW1wb3J0KTsgYXNzdW1lIGEgc2luZ2xlIHNlcnZlciBpbnN0YW5jZSBmb3IgdGhlIG90aGVyIHNlcnZlciBhcHBzLmBcbiAgICAgIDogd29ya2Vyc0luc3RydWN0aW9uXG4gICAgOiBoYXNTaW5nbGVJbnN0YW5jZVNlcnZlckFwcFxuICAgICAgPyAnLSBBc3N1bWUgYSBzaW5nbGUgc2VydmVyIGluc3RhbmNlLidcbiAgICAgIDogJyc7XG4gIC8vIEtlZXAgdG9wLWRvd24gb3JkZXJpbmcgZ3VpZGFuY2UgZnVuY3Rpb24tb25seSBiZWNhdXNlIGNsYXNzZXMgYXJlIG5vdCBob2lzdGVkIGFuZCBjYW4gZmFpbCB3aGVuIGluaGVyaXRhbmNlIG9yIHRvcC1sZXZlbCBpbnN0YW50aWF0aW9uIGRlcGVuZHMgb24gZGVjbGFyYXRpb24gb3JkZXIuXG4gIHJldHVybiBgXG4jIyBDb2RpbmcgU3R5bGVcblxuLSBVc2UgY2FtZWxDYXNlIGZpbGUgbmFtZXMgZm9yIEphdmFTY3JpcHQvVHlwZVNjcmlwdCAoUGFzY2FsQ2FzZSBmb3IgUmVhY3QgY29tcG9uZW50cykuXG4tIFNpbXBsaWZ5IGNvZGUgYXMgbXVjaCBhcyBwb3NzaWJsZSB0byBlbGltaW5hdGUgcmVkdW5kYW5jeS5cbi0gRGVzaWduIG1vZHVsZXMgYW5kIGRpcmVjdG9yaWVzIHdpdGggaGlnaCBjb2hlc2lvbiBhbmQgbG93IGNvdXBsaW5nOyBzcGxpdCBsYXJnZSBtb2R1bGVzIHdoZW4gbmVlZGVkLlxuLSBQbGFjZSBjYWxsaW5nIGZ1bmN0aW9ucyBhYm92ZSB0aGUgZnVuY3Rpb25zIHRoZXkgY2FsbCAodG9wLWRvd24gb3JkZXIpOyBwbGFjZSB2YXJpYWJsZSBhbmQgdHlwZSBkZWNsYXJhdGlvbnMgYWJvdmUgdGhlaXIgdXNhZ2UuXG4ke2NvbW1lbnRJbnN0cnVjdGlvbn1cbi0gTmV2ZXIgZXhwbGFpbiBob3cgV2lsbEJvb3N0ZXIncyBpbi1ob3VzZSB0b29scyAoZS5nLiwgXFxgd2JcXGAsIFxcYHdiZnlcXGApIHdvcmsgaW4gY29kZSBjb21tZW50cyBvciBkb2N1bWVudHMgb3V0c2lkZSB0aGUgdG9vbCdzIG93biBwYWNrYWdlLCBleGNlcHQgaW4gaW5zdHJ1Y3Rpb25zIGZvciBBSSBhZ2VudHMgKGUuZy4sIGRvIG5vdCBub3RlIHRoYXQgXFxgUE9SVFxcYCBpcyB1bnNldCBiZWNhdXNlIFxcYHdiXFxgIHBpY2tzIGEgZnJlZSBwb3J0KS5cbi0gSWYgbGludCBlcnJvcnMgb3Igd2FybmluZ3MgY2Fubm90IGJlIGZpeGVkLCB1c2UgaWdub3JlIGNvbW1lbnRzIHdpdGggcmVhc29ucyAoZS5nLiwgXFxgLy8gb3hsaW50LWRpc2FibGUtbmV4dC1saW5lIDxydWxlPiAtLSA8cmVhc29uPlxcYCkuXG4tIFByZWZlciBcXGB1bmRlZmluZWRcXGAgb3ZlciBcXGBudWxsXFxgIHVubGVzcyByZXF1aXJlZCBieSBBUElzIG9yIGxpYnJhcmllcy5cbi0gVmFsaWRhdGUgSmF2YVNjcmlwdCBvYmplY3RzIChlLmcuLCBwYXJzZWQgSlNPTiwgQVBJIHJlc3BvbnNlcykgd2l0aCBcXGB6b2RcXGAgd2hlbmV2ZXIgcG9zc2libGUgaW5zdGVhZCBvZiBoYW5kLXdyaXR0ZW4gY2hlY2tzIG9yIHR5cGUgYXNzZXJ0aW9ucy5cbi0gQnVpbGQgcHJvbXB0cyBhcyBhIHNpbmdsZSB0ZW1wbGF0ZSBsaXRlcmFsIGluc3RlYWQgb2YgXFxgam9pbigpXFxgIG9uIGEgcHJlLWNvbXB1dGFibGUgYXJyYXkgb2Ygc3RyaW5ncy5cbi0gQXNzdW1lIGFsbCBlbnZpcm9ubWVudCB2YXJpYWJsZXMgYXJlIGRlZmluZWQ7IGlmIHZhbGlkYXRpb24gaXMgbmVlZGVkLCBcXGBhc3NlcnRcXGAgdGhlbSBhdCBzdGFydHVwIHRvIGZhaWwgZmFzdC5cbi0gQXNzdW1lIGxvY2FsIHRvb2xzIHN1Y2ggYXMgXFxgZ2l0XFxgLCBcXGBnaFxcYCwgYW5kIFxcYGdocVxcYCBhcmUgaW5zdGFsbGVkIGFuZCBhdXRoZW50aWNhdGVkLlxuJHtvc0NvbXBhdGliaWxpdHlJbnN0cnVjdGlvbn1cbiR7XG4gIGFsbENvbmZpZ3Muc29tZSgoYykgPT4gYy5kZXBlbmRpbmcuZ2VuSTE4blRzKVxuICAgID8gYC0gUmVnaXN0ZXIgc3RyaW5nIGxpdGVyYWxzIGZvciBSZWFjdCBjb21wb25lbnRzIGluIHRoZSBcXGBpMThuXFxgIHJlc291cmNlIGZpbGVzIChlLmcuLCBcXGBpMThuL2phLUpQLmpzb25cXGApIGFuZCByZWZlcmVuY2UgdGhlbSB2aWEgdGhlIFxcYGkxOG5cXGAgdXRpbGl0eSAoZS5nLiwgXFxgaTE4bi5wYWdlcy5ob21lLnRpdGxlKClcXGAgZm9yIFxcYHsgXCJwYWdlc1wiOiB7IFwiaG9tZVwiOiB7IFwidGl0bGVcIjogXCJNeSBBcHBcIiB9IH0gfVxcYCkuYFxuICAgIDogJydcbn1cblxuJHtcbiAgYWxsQ29uZmlncy5zb21lKChjKSA9PiBjLmRlcGVuZGluZy5yZWFjdCB8fCBjLmRlcGVuZGluZy5uZXh0IHx8IGMuZGVwZW5kaW5nLnZpbmV4dClcbiAgICA/IGAtIFByZWZlciBsYW1iZGEgb3ZlciBcXGBmdW5jdGlvblxcYCBmb3IgUmVhY3QgY29tcG9uZW50cywgZS5nLiwgXFxgY29uc3QgQnV0dG9uOiBSZWFjdC5GQyA9ICgpID0+IHtcXGAuXG4tIFByZWZlciBcXGB1c2VJbW1lclxcYCBvdmVyIFxcYHVzZVN0YXRlXFxgIGZvciBhcnJheXMgYW5kIG9iamVjdHMuXG4tIFVzZSBcXGBhdXRvRm9jdXNcXGAgd2hlcmUgaXQgcmVkdWNlcyB1c2VyIGVmZm9ydC5gXG4gICAgOiAnJ1xufVxuJHtcbiAgLy8gdmluZXh0IGlzIHRoZSBvcmcncyBjdXJyZW50IHdlYi1hcHAgZnJhbWV3b3JrIGFuZCBlbmFibGVzIHRoZSBSZWFjdCBDb21waWxlciBqdXN0IGFzIE5leHQuanNcbiAgLy8gZG9lcywgc28gaXQgbXVzdCBub3QgbWlzcyB0aGlzIHJ1bGUuXG4gIGFsbENvbmZpZ3Muc29tZSgoYykgPT4gYy5kZXBlbmRpbmcubmV4dCB8fCBjLmRlcGVuZGluZy52aW5leHQpXG4gICAgPyBgXG4tIFRoaXMgcHJvamVjdCB1c2VzIHRoZSBSZWFjdCBDb21waWxlciwgc28gXFxgdXNlQ2FsbGJhY2tcXGAgYW5kIFxcYHVzZU1lbW9cXGAgYXJlIHVubmVjZXNzYXJ5IGZvciBwZXJmb3JtYW5jZS5cbmBcbiAgICA6ICcnXG59XG4ke3NlcnZlckluc3RhbmNlSW5zdHJ1Y3Rpb259XG5gXG4gICAgLnJlcGxhY2VBbGwoL1xcLlxcblxcbistL2csICcuXFxuLScpXG4gICAgLnJlcGxhY2VBbGwoL1xcbnszLH0vZywgJ1xcblxcbicpXG4gICAgLnRyaW0oKTtcbn1cblxuZnVuY3Rpb24gaGFzUGxheXdyaWdodFRlc3RTZXJ2ZXIoY29uZmlnczogUGFja2FnZUNvbmZpZ1tdKTogYm9vbGVhbiB7XG4gIHJldHVybiBjb25maWdzLnNvbWUoKGNvbmZpZykgPT4gY29uZmlnLmRlcGVuZGluZy5wbGF5d3JpZ2h0VGVzdCk7XG59XG4iLCIiLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgcmVsZWFzZUFnZUdhdGUgZnJvbSAnLi4vLi4vY29uZmlncy9yZWxlYXNlQWdlR2F0ZS5qc29uJyB3aXRoIHsgdHlwZTogJ2pzb24nIH07XG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBmc1V0aWwgfSBmcm9tICcuLi91dGlscy9mc1V0aWwuanMnO1xuaW1wb3J0IHsgcHJvbWlzZVBvb2wgfSBmcm9tICcuLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5cbmludGVyZmFjZSBCdW5maWdUb21sIHtcbiAgaW5zdGFsbD86IHtcbiAgICBleGFjdD86IGJvb2xlYW47XG4gICAgZ2xvYmFsU3RvcmU/OiBib29sZWFuO1xuICAgIGxpbmtlcj86IHN0cmluZztcbiAgfTtcbn1cblxuLy8gY29uZmlncy9yZWxlYXNlQWdlR2F0ZS5qc29uIGlzIHRoZSBvcmdhbml6YXRpb24ncyBzaW5nbGUgc291cmNlIG9mIHRydXRoIGZvciB0aGUgcG9saWN5OiB0aGVcbi8vIG1hY2hpbmVzJyBnbG9iYWwgY29uZmlncyBnZXQgaXQgdGhyb3VnaCBjb25maWdzL2FwcGx5UmVsZWFzZUFnZUdhdGUuc2ggKHJ1biBieSB3YmZ5IGl0c2VsZiwgYnlcbi8vIHJldXNhYmxlLXdvcmtmbG93cyBvbiBDSSwgYW5kIGJ5IHNlbGYtaG9zdC11dGlscyBvbiB0aGUgcnVubmVycyksIGFuZCByZXBvc2l0b3JpZXMgZ2V0IGl0IGhlcmUuXG4vLyBPbmx5IG91ciBvd24gcGFja2FnZXMgYXJlIGV4ZW1wdDogd2UgY29udHJvbCB3aG8gcHVibGlzaGVzIHRoZW0sIHNvIGEgY29tcHJvbWlzZWQgcmVsZWFzZSBjYW5ub3Rcbi8vIHJlYWNoIHVzIHRocm91Z2ggYW4gdXBzdHJlYW0gbWFpbnRhaW5lcidzIHN0b2xlbiBjcmVkZW50aWFscy4gVGhhdCBjb3ZlcnMgZXZlcnlcbi8vIEB3aWxsYm9vc3Rlci1wcml2YXRlIHBhY2thZ2UgKHRoZSBzY29wZSByZXNvbHZlcyBvbmx5IGZyb20gb3VyIG93biByZWdpc3RyeSksIGJ1dCBidW4sIG5wbSwgYW5kXG4vLyBZYXJuIG1hdGNoIGV4Y2x1ZGUgZW50cmllcyBieSBleGFjdCBuYW1lIOKAlCBubyBAc2NvcGUvKiBwYXR0ZXJucyDigJQgc28gZWFjaCBuZXcgcGFja2FnZSBpbiB0aGVcbi8vIHNjb3BlIG11c3QgYmUgYWRkZWQgdG8gY29uZmlncy9yZWxlYXNlQWdlR2F0ZS5qc29uIHdoZW4gaXQgaXMgZmlyc3QgcHVibGlzaGVkLiBUaGlyZC1wYXJ0eVxuLy8gcGFja2FnZXMg4oCUIGluY2x1ZGluZ1xuLy8gdG9vbGluZyB3YmZ5IHBpbnMgaXRzZWxmIOKAlCBzdGF5IGFnZS1nYXRlZDsgZ2V0TGF0ZXN0QWdlR2F0ZWREZXBlbmRlbmN5VmVyc2lvbiBpbiBwYWNrYWdlSnNvbi50c1xuLy8gcGlucyB0aGUgbmV3ZXN0IHJlbGVhc2Ugb2xkIGVub3VnaCB0byBwYXNzIHRoZSBnYXRlLCBzbyBwaW5uaW5nIGtlZXBzIHdvcmtpbmcgd2l0aG91dCBhbiBleGVtcHRpb24uXG5leHBvcnQgY29uc3QgYnVuTWluaW11bVJlbGVhc2VBZ2VTZWNvbmRzID0gcmVsZWFzZUFnZUdhdGUuZGF5cyAqIDI0ICogNjAgKiA2MDtcbmV4cG9ydCBjb25zdCBidW5NaW5pbXVtUmVsZWFzZUFnZUV4Y2x1ZGVzID0gcmVsZWFzZUFnZUdhdGUuZXhjbHVkZXM7XG5cbmV4cG9ydCBmdW5jdGlvbiByZWFkQnVuR2xvYmFsU3RvcmUocm9vdERpclBhdGg6IHN0cmluZyk6IGJvb2xlYW4gfCB1bmRlZmluZWQge1xuICBjb25zdCBmaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShyb290RGlyUGF0aCwgJ2J1bmZpZy50b21sJyk7XG4gIGlmICghZnMuZXhpc3RzU3luYyhmaWxlUGF0aCkpIHJldHVybiB1bmRlZmluZWQ7XG4gIHJldHVybiBwYXJzZUJ1bmZpZ1RvbWwoZnMucmVhZEZpbGVTeW5jKGZpbGVQYXRoLCAndXRmOCcpKT8uaW5zdGFsbD8uZ2xvYmFsU3RvcmU7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiByZXNvbHZlQnVuR2xvYmFsU3RvcmUoXG4gIGNvbmZpZ3M6IFBhY2thZ2VDb25maWdbXSxcbiAgcHJldmlvdXNHbG9iYWxTdG9yZTogYm9vbGVhbiB8IHVuZGVmaW5lZCxcbiAgc2tpcERlcHM6IGJvb2xlYW5cbik6IGJvb2xlYW4ge1xuICBjb25zdCBkZWZhdWx0VXNlR2xvYmFsU3RvcmUgPSBzaG91bGRVc2VCdW5HbG9iYWxTdG9yZShjb25maWdzKTtcbiAgcmV0dXJuIHNraXBEZXBzID8gKHByZXZpb3VzR2xvYmFsU3RvcmUgPz8gZGVmYXVsdFVzZUdsb2JhbFN0b3JlKSA6IGRlZmF1bHRVc2VHbG9iYWxTdG9yZTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHNob3VsZFVzZUJ1bkdsb2JhbFN0b3JlKGNvbmZpZ3M6IFBhY2thZ2VDb25maWdbXSk6IGJvb2xlYW4ge1xuICAvLyBCbGl0eiBidWlsZHMgb24gTmV4dC5qcyBidXQgbmVlZCBub3QgZGVjbGFyZSBpdCBkaXJlY3RseSwgYW5kIGl0cyBjb2RlZ2VuIGFsc28gcGF0Y2hlcyBOZXh0XG4gIC8vIGluc2lkZSBub2RlX21vZHVsZXMuIEJvdGggZnJhbWV3b3JrcyB0aGVyZWZvcmUgcmVxdWlyZSBwcm9qZWN0LWxvY2FsIGlzb2xhdGVkIGluc3RhbGxzLlxuICAvLyBTbGlkZXYgbG9hZHMgb3B0aW9uYWwgVnVlIGNvbXBpbGVyIHBlZXJzIHRocm91Z2ggbG9jYWwtcGtnLiBUaGUgZ2xvYmFsIHN0b3JlIHJlYWxwYXRoc1xuICAvLyBsb2NhbC1wa2cgb3V0c2lkZSB0aGUgcHJvamVjdCwgc28gTm9kZSBjYW5ub3QgcmVzb2x2ZSBhIGNvbXBpbGVyIGRlY2xhcmVkIGJ5IHRoZSBwcm9qZWN0LlxuICByZXR1cm4gIWNvbmZpZ3Muc29tZSgoY29uZmlnKSA9PiBjb25maWcuZGVwZW5kaW5nLm5leHQgfHwgY29uZmlnLmRlcGVuZGluZy5ibGl0eiB8fCBjb25maWcuZGVwZW5kaW5nLnNsaWRldik7XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZW5lcmF0ZUJ1bmZpZ1RvbWwoY29uZmlnOiBQYWNrYWdlQ29uZmlnLCB1c2VHbG9iYWxTdG9yZTogYm9vbGVhbik6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2dlbmVyYXRlQnVuZmlnVG9tbCcsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJ2J1bmZpZy50b21sJyk7XG4gICAgY29uc3QgZXhpc3RpbmdDb250ZW50ID0gZnMuZXhpc3RzU3luYyhmaWxlUGF0aCkgPyBmcy5yZWFkRmlsZVN5bmMoZmlsZVBhdGgsICd1dGY4JykgOiB1bmRlZmluZWQ7XG4gICAgY29uc3QgY29udGVudCA9IG5ld0NvbnRlbnQoZXhpc3RpbmdDb250ZW50LCB1c2VHbG9iYWxTdG9yZSk7XG4gICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzVXRpbC5nZW5lcmF0ZUZpbGUoZmlsZVBhdGgsIGNvbnRlbnQpKTtcbiAgfSk7XG59XG5cbmNvbnN0IG5ld0NvbnRlbnQgPSAoZXhpc3RpbmdDb250ZW50OiBzdHJpbmcgfCB1bmRlZmluZWQsIHVzZUdsb2JhbFN0b3JlOiBib29sZWFuKTogc3RyaW5nID0+IHtcbiAgY29uc3QgYnVuZmlnVG9tbCA9IHBhcnNlQnVuZmlnVG9tbChleGlzdGluZ0NvbnRlbnQpO1xuICAvLyBtaW5pbXVtUmVsZWFzZUFnZSBhbmQgbWluaW11bVJlbGVhc2VBZ2VFeGNsdWRlcyBhcmUgb3JnIHBvbGljeSwgbmV2ZXIgcmVwb3NpdG9yeSBwb2xpY3k6IGJvdGhcbiAgLy8gYXJlIHJld3JpdHRlbiB0byBjb25maWdzL3JlbGVhc2VBZ2VHYXRlLmpzb24ncyB2YWx1ZXMgb24gZXZlcnkgcnVuLCBzbyBhIGhhbmQtZWRpdGVkICh3ZWFrZW5lZClcbiAgLy8gZ2F0ZSBjYW5ub3Qgc3Vydml2ZSByZWdlbmVyYXRpb24uIERyb3BwaW5nIHJlcG9zaXRvcnktc3BlY2lmaWMgZXhjbHVkZSBlbnRyaWVzIGlzIGZhaWwtc2FmZSDigJQgYW5cbiAgLy8gdW5jb3ZlcmVkIHBhY2thZ2UgYmVjb21lcyBhZ2UtZ2F0ZWQgYW5kIHN1cmZhY2VzIGF0IGluc3RhbGwgdGltZSBpbnN0ZWFkIG9mIHdlYWtlbmluZyB0aGUgZ2F0ZS5cbiAgLy8gVHVyYm9wYWNrIHJlamVjdHMgZ2xvYmFsLXN0b3JlIHN5bWxpbmtzIGJlY2F1c2UgdGhleSByZXNvbHZlIG91dHNpZGUgaXRzIGZpbGVzeXN0ZW0gcm9vdC5cbiAgLy8gS2VlcGluZyBOZXh0LmpzIGluc3RhbGxzIHByb2plY3QtbG9jYWwgYXZvaWRzIHdpZGVuaW5nIHRoYXQgcm9vdCB0byAkSE9NRSAob3IgYC9gIGluIERvY2tlciksXG4gIC8vIHdoaWNoIHdvdWxkIGV4cGFuZCBkZXZlbG9wbWVudCBmaWxlc3lzdGVtIHdhdGNoaW5nIGFuZCBieXBhc3MgdGhlIGJvdW5kYXJ5J3MgY2FjaGUgYmVuZWZpdHMuXG4gIGNvbnN0IGdsb2JhbFN0b3JlTGluZSA9IHVzZUdsb2JhbFN0b3JlID8gJ2dsb2JhbFN0b3JlID0gdHJ1ZScgOiAnZ2xvYmFsU3RvcmUgPSBmYWxzZSc7XG4gIC8vIE5vIGBbcnVuXSBidW4gPSB0cnVlYDogaXRzIG5vZGUtPmJ1biBQQVRIIHNoaW0gbGVha3MgaW50byBldmVyeSBjaGlsZCBwcm9jZXNzIGFuZCBicmVha3NcbiAgLy8gdG9vbHMgcmVxdWlyaW5nIHJlYWwgTm9kZS5qcyAoUGxheXdyaWdodCwgd3JhbmdsZXIsIHZpbmV4dCk7IGFueSBleGlzdGluZyBzZXR0aW5nIGlzIGRyb3BwZWQuXG4gIC8vIHB1YmxpY0hvaXN0UGF0dGVybiDigJQgdHN4OiBidWlsZC10cyB1bmRlciBOb2RlLmpzIHNwYXducyBgbm9kZSAtLWltcG9ydCB0c3hgLCB3aGljaCByZXNvbHZlc1xuICAvLyB0c3ggZnJvbSB0aGUgY29uc3VtZXIgcGFja2FnZSdzIGRpcmVjdG9yeSwgbm90IGZyb20gYnVpbGQtdHMncyBvd24gZGVwZW5kZW5jaWVzLlxuICAvLyB1bmRpY2ktdHlwZXM6IGJ1bi10eXBlcyByZWZlcmVuY2VzIGl0IHdpdGhvdXQgZGVjbGFyaW5nIGl0IGFzIGEgZGVwZW5kZW5jeSAob3Zlbi1zaC9idW4jMjI4MDUpO1xuICAvLyBnZW5lcmF0ZWQgdHNjb25maWdzIGFsc28gbWFwIHVuZGljaS10eXBlcyB0byB0aGUgaG9pc3RlZCBjb3B5IChzZWUgdHNjb25maWcudHMpIGJlY2F1c2UgdGhlXG4gIC8vIGdsb2JhbCBzdG9yZSByZWFscGF0aHMgYnVuLXR5cGVzIG91dHNpZGUgdGhlIHJlcG9zaXRvcnkuXG4gIHJldHVybiBgZW52ID0gZmFsc2VcbnRlbGVtZXRyeSA9IGZhbHNlXG5cbiR7ZXh0cmFjdFJhd1Rlc3RTZWN0aW9ucyhleGlzdGluZ0NvbnRlbnQpfVtpbnN0YWxsXVxuZXhhY3QgPSAke2J1bmZpZ1RvbWw/Lmluc3RhbGw/LmV4YWN0ID09PSBmYWxzZSA/ICdmYWxzZScgOiAndHJ1ZSd9XG4ke2dsb2JhbFN0b3JlTGluZX1cbmxpbmtlciA9IFwiaXNvbGF0ZWRcIlxucHVibGljSG9pc3RQYXR0ZXJuID0gW1widHN4XCIsIFwidW5kaWNpLXR5cGVzXCJdXG5taW5pbXVtUmVsZWFzZUFnZSA9ICR7YnVuTWluaW11bVJlbGVhc2VBZ2VTZWNvbmRzfVxubWluaW11bVJlbGVhc2VBZ2VFeGNsdWRlcyA9IFtcbiR7YnVuTWluaW11bVJlbGVhc2VBZ2VFeGNsdWRlcy5tYXAoKHBhY2thZ2VOYW1lKSA9PiBgICAgIFwiJHtwYWNrYWdlTmFtZX1cIixgKS5qb2luKCdcXG4nKX1cbl1cbmA7XG59O1xuXG4vKipcbiAqIFByZXNlcnZlIHRoZSBwcm9qZWN0J3MgYFt0ZXN0XWAgc2VjdGlvbnMgKGUuZy4gcHJlbG9hZCBzY3JpcHRzIHN3YXBwaW5nIGEgQ2xvdWRmbGFyZSBEMSBjbGllbnRcbiAqIGZvciBhIGxvY2FsIFNRTGl0ZSBvbmUpIHZlcmJhdGltLCBjb21tZW50cyBpbmNsdWRlZDsgd2JmeSBtYW5hZ2VzIG9ubHkgdGhlIG90aGVyIHNlY3Rpb25zLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZXh0cmFjdFJhd1Rlc3RTZWN0aW9ucyhjb250ZW50OiBzdHJpbmcgfCB1bmRlZmluZWQpOiBzdHJpbmcge1xuICBpZiAoIWNvbnRlbnQpIHJldHVybiAnJztcblxuICBjb25zdCBwcmVzZXJ2ZWRMaW5lczogc3RyaW5nW10gPSBbXTtcbiAgbGV0IGluVGVzdFNlY3Rpb24gPSBmYWxzZTtcbiAgZm9yIChjb25zdCBsaW5lIG9mIGNvbnRlbnQuc3BsaXQoJ1xcbicpKSB7XG4gICAgY29uc3Qgc2VjdGlvbk1hdGNoID0gL15cXHMqXFxbKFteXFxdXSspXFxdLy5leGVjKGxpbmUpO1xuICAgIGlmIChzZWN0aW9uTWF0Y2gpIHtcbiAgICAgIGluVGVzdFNlY3Rpb24gPSBzZWN0aW9uTWF0Y2hbMV0gPT09ICd0ZXN0JyB8fCAoc2VjdGlvbk1hdGNoWzFdIGFzIHN0cmluZykuc3RhcnRzV2l0aCgndGVzdC4nKTtcbiAgICB9XG4gICAgaWYgKGluVGVzdFNlY3Rpb24gJiYgbGluZS50cmltKCkpIHtcbiAgICAgIHByZXNlcnZlZExpbmVzLnB1c2gobGluZSk7XG4gICAgfVxuICB9XG4gIHJldHVybiBwcmVzZXJ2ZWRMaW5lcy5sZW5ndGggPiAwID8gYCR7cHJlc2VydmVkTGluZXMuam9pbignXFxuJyl9XFxuXFxuYCA6ICcnO1xufVxuXG5mdW5jdGlvbiBwYXJzZUJ1bmZpZ1RvbWwoY29udGVudDogc3RyaW5nIHwgdW5kZWZpbmVkKTogQnVuZmlnVG9tbCB8IHVuZGVmaW5lZCB7XG4gIGlmICghY29udGVudCkge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cbiAgdHJ5IHtcbiAgICByZXR1cm4gQnVuLlRPTUwucGFyc2UoY29udGVudCkgYXMgQnVuZmlnVG9tbDtcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuXG5jb25zdCB1c2VyQ29udGVudEhlYWRlciA9ICcjIFByb2plY3Qtc3BlY2lmaWMgc2V0dGluZ3MnO1xuY29uc3QgdXNlckNvbnRlbnRIZWFkZXJSZWdleCA9IC8jIFByb2plY3Qtc3BlY2lmaWMgc2V0dGluZ3NbXlxcbl0qXFxuL2dtO1xuY29uc3Qgc2VwYXJhdG9yID0gJyMgR2VuZXJhdGVkIGJ5IHdiZnknO1xuY29uc3Qgc2VwYXJhdG9yUHJlZml4ID0gJyMgR2VuZXJhdGVkIGJ5ICc7XG5jb25zdCBkZWZhdWx0SGVhZFVzZXJDb250ZW50ID0gYCR7dXNlckNvbnRlbnRIZWFkZXJ9IChoZWFkKVxuXG5cbiR7c2VwYXJhdG9yfVxuYDtcbmNvbnN0IGRlZmF1bHRUYWlsVXNlckNvbnRlbnQgPSBgXG4ke3VzZXJDb250ZW50SGVhZGVyfSAodGFpbClcbmA7XG5cbmV4cG9ydCBjb25zdCBpZ25vcmVGaWxlVXRpbCA9IHtcbiAgc2VwYXJhdG9yLFxuICBzZXBhcmF0b3JQcmVmaXgsXG4gIGRlZmF1bHRIZWFkVXNlckNvbnRlbnQsXG4gIGRlZmF1bHRUYWlsVXNlckNvbnRlbnQsXG4gIGFzeW5jIHJlYWRHaXRpZ25vcmVXaXRob3V0U2VwYXJhdG9ycyhmaWxlUGF0aDogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmcgfCB1bmRlZmluZWQ+IHtcbiAgICB0cnkge1xuICAgICAgbGV0IGNvbnRlbnQgPSBhd2FpdCBmcy5wcm9taXNlcy5yZWFkRmlsZShmaWxlUGF0aCwgJ3V0ZjgnKTtcbiAgICAgIGNvbnN0IGxhc3RIZWFkZXJJbmRleCA9IGdldEluZGV4T2ZUYWlsVXNlckNvbnRlbnRIZWFkZXIoY29udGVudCk7XG4gICAgICBpZiAobGFzdEhlYWRlckluZGV4ID4gMCkge1xuICAgICAgICBjb250ZW50ID0gY29udGVudC5zbGljZSgwLCBsYXN0SGVhZGVySW5kZXggLSAxKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiAoXG4gICAgICAgIGNvbnRlbnRcbiAgICAgICAgICAucmVwbGFjZUFsbCh1c2VyQ29udGVudEhlYWRlclJlZ2V4LCAnJylcbiAgICAgICAgICAucmVwbGFjZUFsbCgvIyBHZW5lcmF0ZWQgYnkgW15cXG5dKlxcbi9nbSwgJycpXG4gICAgICAgICAgLnJlcGxhY2VBbGwoL1xccj9cXG5cXHI/XFxuKFxccj9cXG4pKy9nbSwgJ1xcblxcbicpXG4gICAgICAgICAgLnRyaW0oKSArICdcXG4nXG4gICAgICApO1xuICAgIH0gY2F0Y2gge1xuICAgICAgLy8gZG8gbm90aGluZ1xuICAgIH1cbiAgfSxcbiAgZ2V0SGVhZFVzZXJDb250ZW50KGNvbnRlbnQ6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgY29uc3QgaW5kZXggPSBjb250ZW50LmluZGV4T2YodGhpcy5zZXBhcmF0b3JQcmVmaXgpO1xuICAgIGlmIChpbmRleCAhPT0gLTEpIHtcbiAgICAgIHJldHVybiBjb250ZW50XG4gICAgICAgIC5zbGljZSgwLCBjb250ZW50LmluZGV4T2YoJ1xcbicsIGluZGV4KSArIDEpXG4gICAgICAgIC5yZXBsYWNlQWxsKHVzZXJDb250ZW50SGVhZGVyUmVnZXgsIGAke3VzZXJDb250ZW50SGVhZGVyfSAoaGVhZClcXG5gKTtcbiAgICB9XG4gICAgcmV0dXJuIGRlZmF1bHRIZWFkVXNlckNvbnRlbnQ7XG4gIH0sXG4gIGdldFRhaWxVc2VyQ29udGVudChjb250ZW50OiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGNvbnN0IGxhc3RIZWFkZXJJbmRleCA9IGdldEluZGV4T2ZUYWlsVXNlckNvbnRlbnRIZWFkZXIoY29udGVudCk7XG4gICAgaWYgKGxhc3RIZWFkZXJJbmRleCA+IDApIHtcbiAgICAgIHJldHVybiBjb250ZW50LnNsaWNlKGxhc3RIZWFkZXJJbmRleCAtIDEpO1xuICAgIH1cbiAgICByZXR1cm4gZGVmYXVsdFRhaWxVc2VyQ29udGVudDtcbiAgfSxcbiAgYXN5bmMgaXNCZXJyeVplcm9JbnN0YWxsRW5hYmxlZChmaWxlUGF0aDogc3RyaW5nKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGNvbnRlbnQgPSBhd2FpdCBmcy5wcm9taXNlcy5yZWFkRmlsZShmaWxlUGF0aCwgJ3V0ZjgnKTtcbiAgICAgIHJldHVybiBjb250ZW50LmluY2x1ZGVzKCdcXG4hLnlhcm4vY2FjaGUnKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH0sXG59O1xuXG5mdW5jdGlvbiBnZXRJbmRleE9mVGFpbFVzZXJDb250ZW50SGVhZGVyKGNvbnRlbnQ6IHN0cmluZyk6IG51bWJlciB7XG4gIGNvbnN0IGluZGV4ID0gY29udGVudC5pbmRleE9mKHVzZXJDb250ZW50SGVhZGVyKTtcbiAgY29uc3QgbGFzdEluZGV4ID0gY29udGVudC5sYXN0SW5kZXhPZih1c2VyQ29udGVudEhlYWRlcik7XG4gIHJldHVybiBsYXN0SW5kZXggPiBpbmRleCA/IGxhc3RJbmRleCA6IC0xO1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZnNVdGlsIH0gZnJvbSAnLi4vdXRpbHMvZnNVdGlsLmpzJztcbmltcG9ydCB7IGlnbm9yZUZpbGVVdGlsIH0gZnJvbSAnLi4vdXRpbHMvaWdub3JlRmlsZVV0aWwuanMnO1xuaW1wb3J0IHsgcHJvbWlzZVBvb2wgfSBmcm9tICcuLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5cbi8vIEV4ZXJjb2RlIGRlcGxveXMgR2l0LWJhc2VkIHByaXZhdGUgcGFja2FnZXMgZnJvbSBub2RlX21vZHVsZXMsIGJ1dCB0aGUgRG9ja2VyIGNvbnRleHQgc2hvdWxkIHN0YXkgbmFycm93LlxuY29uc3QgaW5jbHVkZWROb2RlTW9kdWxlc1BhdHRlcm5zID0gWydAd2lsbGJvb3N0ZXInXTtcblxuY29uc3QgY29tbW9uQ29udGVudCA9IGBcbi5lbnYqXG4qKi8uRFNfU3RvcmVcbioqLy5jYWNoZVxuKiovLmNsYXVkZVxuKiovLmN1cnNvclxuKiovLmVkaXRvcmNvbmZpZ1xuKiovLmVzbGludGNhY2hlXG4qKi8uZ2VtaW5pXG4qKi8uZ2l0XG4qKi8uZ2l0YXR0cmlidXRlc1xuKiovLmdpdGh1YlxuKiovLmdpdGlnbm9yZVxuKiovLmlkZWFcbioqLy5sZWZ0aG9va1xuKiovLm15cHlfY2FjaGVcbioqLy5uZXh0L2NhY2hlXG4qKi8ubnBtXG4qKi8ucGFyY2VsLWNhY2hlXG4qKi8ucG5wbS1zdG9yZVxuKiovLnB5dGVzdF9jYWNoZVxuKiovLnJhaWx3YXlpZ25vcmVcbioqLy5yZWxlYXNlcmMuanNvblxuKiovLnJ1ZmZfY2FjaGVcbioqLy50bXBcbioqLy50bXAtKi8qKlxuKiovLnR1cmJvXG4qKi8udG94XG4qKi8udnNjb2RlXG4qKi8ueWFybi9jYWNoZVxuKiovKi5zcWxpdGUzKlxuKiovLnlhcm4vaW5zdGFsbC1zdGF0ZS5nelxuKiovLnZlbnZcbioqL19fcHljYWNoZV9fXG4qKi8qLmxvZ1xuKiovKi5weWNcbioqLyoudHNidWlsZGluZm9cbioqL2NvdmVyYWdlXG4qKi9ub2RlX21vZHVsZXMvKipcbiR7aW5jbHVkZWROb2RlTW9kdWxlc1BhdHRlcm5zXG4gIC5tYXAoXG4gICAgKHBhdHRlcm4pID0+IGAhKiovbm9kZV9tb2R1bGVzLyR7cGF0dGVybn1cbiEqKi9ub2RlX21vZHVsZXMvJHtwYXR0ZXJufS8qKmBcbiAgKVxuICAuam9pbignXFxuJyl9XG4qKi9ub2RlX21vZHVsZXMvLmNhY2hlXG4qKi9wbGF5d3JpZ2h0LXJlcG9ydFxuKiovc3Rvcnlib29rLXN0YXRpY1xuKiovdGFyZ2V0XG4qKi90ZXN0LXJlc3VsdHNcbmA7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZW5lcmF0ZURvY2tlcmlnbm9yZShjb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdnZW5lcmF0ZURvY2tlcmlnbm9yZScsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJy5kb2NrZXJpZ25vcmUnKTtcbiAgICBpZiAoY29uZmlnLmRvZXNDb250YWluRG9ja2VyZmlsZSkge1xuICAgICAgY29uc3QgY29udGVudCA9IChhd2FpdCBmc1V0aWwucmVhZEZpbGVJZkV4aXN0cyhmaWxlUGF0aCkpID8/ICcnO1xuICAgICAgY29uc3QgaGVhZFVzZXJDb250ZW50ID0gaWdub3JlRmlsZVV0aWwuZ2V0SGVhZFVzZXJDb250ZW50KGNvbnRlbnQpO1xuICAgICAgY29uc3QgdGFpbFVzZXJDb250ZW50ID0gaWdub3JlRmlsZVV0aWwuZ2V0VGFpbFVzZXJDb250ZW50KGNvbnRlbnQpO1xuXG4gICAgICBjb25zdCBuZXdDb250ZW50ID0gaGVhZFVzZXJDb250ZW50ICsgY29tbW9uQ29udGVudCArIHRhaWxVc2VyQ29udGVudDtcbiAgICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiBmc1V0aWwuZ2VuZXJhdGVGaWxlKGZpbGVQYXRoLCBuZXdDb250ZW50KSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGF3YWl0IGZzLnByb21pc2VzLnJtKGZpbGVQYXRoLCB7IGZvcmNlOiB0cnVlIH0pO1xuICAgIH1cbiAgfSk7XG59XG4iLCJleHBvcnQgY29uc3QgZXh0ZW5zaW9ucyA9IHtcbiAgY29kZVdpdGgySW5kZW50U2l6ZTogW1xuICAgICdjanMnLFxuICAgICdtanMnLFxuICAgICdqcycsXG4gICAgJ2pzeCcsXG4gICAgJ2N0cycsXG4gICAgJ210cycsXG4gICAgJ3RzJyxcbiAgICAndHN4JyxcbiAgICAnanNvbicsXG4gICAgJ2pzb241JyxcbiAgICAnanNvbmMnLFxuICAgICdjcHAnLFxuICAgICdkYXJ0JyxcbiAgICAnaHRtJyxcbiAgICAnaHRtbCcsXG4gICAgJ3B1JyxcbiAgICAncHVtbCcsXG4gICAgJ3JiJyxcbiAgICAndnVlJyxcbiAgICAneG1sJyxcbiAgICAneWFtbCcsXG4gICAgJ3ltbCcsXG4gICAgJ3NoJyxcbiAgXS50b1NvcnRlZCgpLFxuICBjb2RlV2l0aDRJbmRlbnRTaXplOiBbJ2dvJywgJ2dyYWRsZScsICdqYXZhJywgJ3B5J10udG9Tb3J0ZWQoKSxcbiAgbWFya2Rvd25MaWtlOiBbJ21kJ10udG9Tb3J0ZWQoKSxcbiAgb3hsaW50OiBbJ2FzdHJvJywgJ2NqcycsICdjdHMnLCAnanMnLCAnanN4JywgJ21qcycsICdtdHMnLCAnc3ZlbHRlJywgJ3RzJywgJ3RzeCcsICd2dWUnXS50b1NvcnRlZCgpLFxuICBveGZtdDogW1xuICAgICdhc3RybycsXG4gICAgJ2NqcycsXG4gICAgJ2NzcycsXG4gICAgJ2N0cycsXG4gICAgJ2dxbCcsXG4gICAgJ2dyYXBocWwnLFxuICAgICdoYnMnLFxuICAgICdodG0nLFxuICAgICdodG1sJyxcbiAgICAnanMnLFxuICAgICdqc29uJyxcbiAgICAnanNvbjUnLFxuICAgICdqc29uYycsXG4gICAgJ2pzeCcsXG4gICAgJ2xlc3MnLFxuICAgICdtZCcsXG4gICAgJ21keCcsXG4gICAgJ21qcycsXG4gICAgJ210cycsXG4gICAgJ3Njc3MnLFxuICAgICdzdmVsdGUnLFxuICAgICd0b21sJyxcbiAgICAndHMnLFxuICAgICd0c3gnLFxuICAgICd2dWUnLFxuICAgICd5YW1sJyxcbiAgICAneW1sJyxcbiAgXS50b1NvcnRlZCgpLFxuICBwcmV0dGllck9ubHk6IFsnamF2YSddLnRvU29ydGVkKCksXG59O1xuIiwiaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZXh0ZW5zaW9ucyB9IGZyb20gJy4uL3V0aWxzL2V4dGVuc2lvbnMuanMnO1xuaW1wb3J0IHsgZnNVdGlsIH0gZnJvbSAnLi4vdXRpbHMvZnNVdGlsLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuXG5jb25zdCBuZXdDb250ZW50ID0gYHJvb3QgPSB0cnVlXG5cblsqXVxuY2hhcnNldCA9IHV0Zi04XG5lbmRfb2ZfbGluZSA9IGxmXG5pbnNlcnRfZmluYWxfbmV3bGluZSA9IHRydWVcbnRyaW1fdHJhaWxpbmdfd2hpdGVzcGFjZSA9IHRydWVcblxuJHtnZW5lcmF0ZUV4dGVuc2lvbnMoZXh0ZW5zaW9ucy5jb2RlV2l0aDJJbmRlbnRTaXplKX1cbmluZGVudF9zaXplID0gMlxuaW5kZW50X3N0eWxlID0gc3BhY2VcblxuJHtnZW5lcmF0ZUV4dGVuc2lvbnMoZXh0ZW5zaW9ucy5jb2RlV2l0aDRJbmRlbnRTaXplKX1cbmluZGVudF9zaXplID0gNFxuaW5kZW50X3N0eWxlID0gc3BhY2VcblxuJHtnZW5lcmF0ZUV4dGVuc2lvbnMoZXh0ZW5zaW9ucy5tYXJrZG93bkxpa2UpfVxubWF4X2xpbmVfbGVuZ3RoID0gb2ZmXG50cmltX3RyYWlsaW5nX3doaXRlc3BhY2UgPSBmYWxzZVxuXG5be01ha2VmaWxlLCoubWt9XVxuaW5kZW50X3N0eWxlID0gdGFiXG5gO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVFZGl0b3Jjb25maWcoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZ2VuZXJhdGVFZGl0b3Jjb25maWcnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICcuZWRpdG9yY29uZmlnJyk7XG4gICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzVXRpbC5nZW5lcmF0ZUZpbGUoZmlsZVBhdGgsIG5ld0NvbnRlbnQpKTtcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIGdlbmVyYXRlRXh0ZW5zaW9ucyhleHRlbnNpb25zOiBzdHJpbmdbXSk6IHN0cmluZyB7XG4gIHJldHVybiBleHRlbnNpb25zLmxlbmd0aCA+IDEgPyBgWyoueyR7ZXh0ZW5zaW9ucy5qb2luKCcsJyl9fV1gIDogYFsqLiR7ZXh0ZW5zaW9uc1swXX1dYDtcbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCBtZXJnZSBmcm9tICdkZWVwbWVyZ2UnO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBmc1V0aWwgfSBmcm9tICcuLi91dGlscy9mc1V0aWwuanMnO1xuaW1wb3J0IHsgb3ZlcndyaXRlTWVyZ2UgfSBmcm9tICcuLi91dGlscy9tZXJnZVV0aWwuanMnO1xuaW1wb3J0IHsgcHJvbWlzZVBvb2wgfSBmcm9tICcuLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5cbmltcG9ydCB7IGdlbmVyYXRlQWdlbnRDb2RpbmdTdHlsZSwgcmVhZEFnZW50c0V4dHJhQ29udGVudCB9IGZyb20gJy4vYWdlbnRzLmpzJztcblxuY29uc3QgZGVmYXVsdENvbmZpZyA9IHtcbiAgaGF2ZV9mdW46IHRydWUsXG4gIGNvZGVfcmV2aWV3OiB7XG4gICAgZGlzYWJsZTogZmFsc2UsXG4gICAgY29tbWVudF9zZXZlcml0eV90aHJlc2hvbGQ6ICdNRURJVU0nLFxuICAgIG1heF9yZXZpZXdfY29tbWVudHM6IC0xLFxuICAgIHB1bGxfcmVxdWVzdF9vcGVuZWQ6IHtcbiAgICAgIGhlbHA6IGZhbHNlLFxuICAgICAgc3VtbWFyeTogdHJ1ZSxcbiAgICAgIGNvZGVfcmV2aWV3OiB0cnVlLFxuICAgIH0sXG4gIH0sXG4gIGlnbm9yZV9wYXR0ZXJuczogWycqKi9fX2dlbmVyYXRlZF9fJ10sXG59O1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVHZW1pbmlDb25maWcoY29uZmlnOiBQYWNrYWdlQ29uZmlnLCBhbGxDb25maWdzOiBQYWNrYWdlQ29uZmlnW10pOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdnZW5lcmF0ZUdlbWluaUNvbmZpZycsIGFzeW5jICgpID0+IHtcbiAgICBpZiAoIWNvbmZpZy5pc1Jvb3QpIHJldHVybjtcblxuICAgIGNvbnN0IGRpclBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICcuZ2VtaW5pJyk7XG4gICAgY29uc3QgY29uZmlnRmlsZVBhdGggPSBwYXRoLnJlc29sdmUoZGlyUGF0aCwgJ2NvbmZpZy55YW1sJyk7XG4gICAgY29uc3Qgbm9uQ2Fub25pY2FsQ29uZmlnRmlsZVBhdGggPSBwYXRoLnJlc29sdmUoZGlyUGF0aCwgJ2NvbmZpZy55bWwnKTtcbiAgICBjb25zdCBzdHlsZWd1aWRlRmlsZVBhdGggPSBwYXRoLnJlc29sdmUoZGlyUGF0aCwgJ3N0eWxlZ3VpZGUubWQnKTtcblxuICAgIGNvbnN0IGhhc05vbkNhbm9uaWNhbENvbmZpZyA9ICEhKGF3YWl0IGZzLnByb21pc2VzLmxzdGF0KG5vbkNhbm9uaWNhbENvbmZpZ0ZpbGVQYXRoKS5jYXRjaCgoKSA9PiB7fSkpO1xuICAgIGlmIChoYXNOb25DYW5vbmljYWxDb25maWcpIHtcbiAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgYFNraXBwZWQgZ2VuZXJhdGluZyAke2NvbmZpZ0ZpbGVQYXRofSBiZWNhdXNlICR7bm9uQ2Fub25pY2FsQ29uZmlnRmlsZVBhdGh9IGlzIG5vdCBhIHN1cHBvcnRlZCBHZW1pbmkgY29uZmlnIGxvY2F0aW9uLiBSZW5hbWUgaXQgbWFudWFsbHkuYFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBsZXQgbmV3Q29uZmlnOiBvYmplY3QgPSBzdHJ1Y3R1cmVkQ2xvbmUoZGVmYXVsdENvbmZpZyk7XG4gICAgY29uc3Qgb2xkQ29udGVudCA9IGhhc05vbkNhbm9uaWNhbENvbmZpZyA/IHVuZGVmaW5lZCA6IGF3YWl0IGZzVXRpbC5yZWFkRmlsZUNvbmZpbmVkSWZFeGlzdHMoY29uZmlnRmlsZVBhdGgpO1xuICAgIGlmIChvbGRDb250ZW50ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IG9sZENvbmZpZyA9IEJ1bi5ZQU1MLnBhcnNlKG9sZENvbnRlbnQpO1xuICAgICAgICAvLyBNZXJnZSBvbmx5IGEgbWFwcGluZzogZW1wdHksIGNvbW1lbnQtb25seSwgb3Igc2NhbGFyIFlBTUwgd291bGQgZWl0aGVyIHRocm93IGluXG4gICAgICAgIC8vIG1lcmdlLmFsbCBvciBwb2xsdXRlIHRoZSBjb25maWcgd2l0aCBpbmRleCBrZXlzLlxuICAgICAgICBpZiAob2xkQ29uZmlnICYmIHR5cGVvZiBvbGRDb25maWcgPT09ICdvYmplY3QnICYmICFBcnJheS5pc0FycmF5KG9sZENvbmZpZykpIHtcbiAgICAgICAgICBuZXdDb25maWcgPSBtZXJnZS5hbGwoW25ld0NvbmZpZywgb2xkQ29uZmlnLCBuZXdDb25maWddLCB7IGFycmF5TWVyZ2U6IG92ZXJ3cml0ZU1lcmdlIH0pO1xuICAgICAgICB9XG4gICAgICB9IGNhdGNoIHtcbiAgICAgICAgLy8gZG8gbm90aGluZyAtIGZpbGUgY2FuJ3QgYmUgcGFyc2VkXG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgeWFtbENvbnRlbnQgPSBCdW4uWUFNTC5zdHJpbmdpZnkobmV3Q29uZmlnLCB1bmRlZmluZWQsIDIpO1xuXG4gICAgY29uc3QgZXh0cmFDb250ZW50ID0gYXdhaXQgcmVhZEFnZW50c0V4dHJhQ29udGVudChjb25maWcuZGlyUGF0aCk7XG4gICAgY29uc3QgY29kaW5nUnVsZUV4dHJhQ29udGVudCA9IGV4dHJhQ29udGVudD8udHJpbVN0YXJ0KCkuc3RhcnRzV2l0aCgnIycpID8gdW5kZWZpbmVkIDogZXh0cmFDb250ZW50O1xuICAgIGNvbnN0IHJldmlld0xhbmd1YWdlSW5zdHJ1Y3Rpb24gPSBjb25maWcuaXNQdWJsaWNSZXBvXG4gICAgICA/ICdSZXZpZXcgaW4gRW5nbGlzaCBiYXNlZCBvbiB0aGUgZm9sbG93aW5nIGNvZGluZyBzdGFuZGFyZHMuJ1xuICAgICAgOiAn5Lul5LiL44Gu44Kz44O844OH44Kj44Oz44Kw6KaP57SE44KS6LiP44G+44GI44Gm44CB5pel5pys6Kqe44Gn44Os44OT44Ol44O844GX44Gm44GP44Gg44GV44GE44CCJztcbiAgICBjb25zdCBzdHlsZWd1aWRlQ29udGVudCA9IGAke3Jldmlld0xhbmd1YWdlSW5zdHJ1Y3Rpb259XFxuXFxuJHtnZW5lcmF0ZUFnZW50Q29kaW5nU3R5bGUoY29uZmlnLCBhbGxDb25maWdzKX0ke1xuICAgICAgY29kaW5nUnVsZUV4dHJhQ29udGVudCA/IGBcXG4ke2NvZGluZ1J1bGVFeHRyYUNvbnRlbnQudHJpbUVuZCgpfWAgOiAnJ1xuICAgIH1gO1xuXG4gICAgY29uc3QgcHJvbWlzZXMgPSBbXG4gICAgICAuLi4oaGFzTm9uQ2Fub25pY2FsQ29uZmlnID8gW10gOiBbcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzVXRpbC5nZW5lcmF0ZUZpbGUoY29uZmlnRmlsZVBhdGgsIHlhbWxDb250ZW50KSldKSxcbiAgICAgIHByb21pc2VQb29sLnJ1bigoKSA9PiBmc1V0aWwuZ2VuZXJhdGVGaWxlKHN0eWxlZ3VpZGVGaWxlUGF0aCwgc3R5bGVndWlkZUNvbnRlbnQpKSxcbiAgICBdO1xuICAgIGF3YWl0IFByb21pc2UuYWxsKHByb21pc2VzKTtcbiAgfSk7XG59XG4iLCJpbXBvcnQgY2hpbGRfcHJvY2VzcyBmcm9tICdub2RlOmNoaWxkX3Byb2Nlc3MnO1xuaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZXh0ZW5zaW9ucyB9IGZyb20gJy4uL3V0aWxzL2V4dGVuc2lvbnMuanMnO1xuaW1wb3J0IHsgZnNVdGlsIH0gZnJvbSAnLi4vdXRpbHMvZnNVdGlsLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuXG5jb25zdCBnaXRPdXRwdXRNYXhCdWZmZXIgPSA2NCAqIDEwMjQgKiAxMDI0O1xuXG4vLyBjZi4gaHR0cHM6Ly9idW4uc2gvZ3VpZGVzL2luc3RhbGwvZ2l0LWRpZmYtYnVuLWxvY2tmaWxlXG4vLyBgLmdpdGlnbm9yZSAtdGV4dGAga2VlcHMgdGhlIG1hY09TIHRlbXBsYXRlJ3MgYEljb25cXHJcXHJgIHJ1bGUgaW50YWN0OiBgdGV4dD1hdXRvYCBub3JtYWxpemF0aW9uXG4vLyBzdHJpcHMgb25lIENSIHBlciBjaGVja2luLCBkZWdyYWRpbmcgdGhlIHJ1bGUgdW50aWwgaXQgbWF0Y2hlcyBub3RoaW5nLlxuY29uc3QgbmV3Q29udGVudCA9IGAqIHRleHQ9YXV0b1xuXG4uZ2l0aWdub3JlIC10ZXh0XG5cbioubG9ja2IgYmluYXJ5IGRpZmY9bG9ja2JcbioudmNwcm9qIHRleHQgZW9sPWNybGZcblxuJHtbLi4uZXh0ZW5zaW9ucy5jb2RlV2l0aDJJbmRlbnRTaXplLCAuLi5leHRlbnNpb25zLmNvZGVXaXRoNEluZGVudFNpemUsIC4uLmV4dGVuc2lvbnMubWFya2Rvd25MaWtlXVxuICAubWFwKChleHQpID0+IGAqLiR7ZXh0fSB0ZXh0IGVvbD1sZmApXG4gIC5qb2luKCdcXG4nKX1cblxuZGlzdC8qKiBsaW5ndWlzdC1nZW5lcmF0ZWQ9dHJ1ZVxuYDtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlR2l0YXR0cmlidXRlcyhjb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdnZW5lcmF0ZUdpdGF0dHJpYnV0ZXMnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICcuZ2l0YXR0cmlidXRlcycpO1xuICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiBmc1V0aWwuZ2VuZXJhdGVGaWxlKGZpbGVQYXRoLCBuZXdDb250ZW50KSk7XG4gIH0pO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcmVub3JtYWxpemVUcmFja2VkVGV4dEZpbGVzKGRpclBhdGg6IHN0cmluZyk6IHZvaWQge1xuICBsZXQgb3V0cHV0OiBzdHJpbmc7XG4gIHRyeSB7XG4gICAgb3V0cHV0ID0gY2hpbGRfcHJvY2Vzcy5leGVjRmlsZVN5bmMoJ2dpdCcsIFsnbHMtZmlsZXMnLCAnLS1lb2wnLCAnLXonXSwge1xuICAgICAgY3dkOiBkaXJQYXRoLFxuICAgICAgZW5jb2Rpbmc6ICd1dGY4JyxcbiAgICAgIG1heEJ1ZmZlcjogZ2l0T3V0cHV0TWF4QnVmZmVyLFxuICAgICAgc3RkaW86IFsnaWdub3JlJywgJ3BpcGUnLCAncGlwZSddLFxuICAgIH0pO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGNvbnNvbGUud2FybihgU2tpcHBlZCB0cmFja2VkIGxpbmUtZW5kaW5nIHJlbm9ybWFsaXphdGlvbjogJHsoZXJyb3IgYXMgRXJyb3IpLm1lc3NhZ2V9YCk7XG4gICAgcmV0dXJuO1xuICB9XG4gIGxldCByZW5vcm1hbGl6ZWRDb3VudCA9IDA7XG4gIGZvciAoY29uc3QgcmVjb3JkIG9mIG91dHB1dC5zcGxpdCgnXFwwJykpIHtcbiAgICBjb25zdCBzZXBhcmF0b3JJbmRleCA9IHJlY29yZC5pbmRleE9mKCdcXHQnKTtcbiAgICBpZiAoc2VwYXJhdG9ySW5kZXggPT09IC0xKSBjb250aW51ZTtcblxuICAgIGNvbnN0IGF0dHJpYnV0ZXMgPSByZWNvcmQuc2xpY2UoMCwgc2VwYXJhdG9ySW5kZXgpO1xuICAgIGlmICghL15pXFwvKD86Y3JsZnxtaXhlZClcXHMvdS50ZXN0KGF0dHJpYnV0ZXMpIHx8ICEvYXR0clxcLy4qXFxiZW9sPSg/OmxmfGNybGYpKD86XFxzfCQpL3UudGVzdChhdHRyaWJ1dGVzKSkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgY29uc3QgcmVsYXRpdmVQYXRoID0gcmVjb3JkLnNsaWNlKHNlcGFyYXRvckluZGV4ICsgMSk7XG4gICAgY29uc3QgdHJhY2tlZEZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKGRpclBhdGgsIHJlbGF0aXZlUGF0aCk7XG4gICAgY29uc3Qgc3RhdHMgPSBmcy5sc3RhdFN5bmModHJhY2tlZEZpbGVQYXRoLCB7IHRocm93SWZOb0VudHJ5OiBmYWxzZSB9KTtcbiAgICBpZiAoIXN0YXRzPy5pc0ZpbGUoKSkgY29udGludWU7XG5cbiAgICAvLyBHaXQncyBzdGF0IGNhY2hlIGNhbiBoaWRlIHByZS1leGlzdGluZyBDUkxGIGJsb2JzIGFmdGVyIHdiZnkgaW50cm9kdWNlcyB0ZXh0IGF0dHJpYnV0ZXMuXG4gICAgLy8gTm9ybWFsaXplIGJ5dGVzIGluIHRoZSB3b3JrdHJlZSBzbyB0aGUgY2FsbGVyJ3Mgbm9ybWFsIGBnaXQgYWRkIC1BYCByZWNvcmRzIHRoZSBjYW5vbmljYWxcbiAgICAvLyBibG9iOyB0aGlzIGFsc28gcHJldmVudHMgUHJldHRpZXIncyBtZXRhZGF0YSBjYWNoZSBmcm9tIHNraXBwaW5nIHRoZSBuZXdseSBjaGFuZ2VkIGZpbGUuXG4gICAgY29uc3QgY29udGVudCA9IGZzLnJlYWRGaWxlU3luYyh0cmFja2VkRmlsZVBhdGgpO1xuICAgIGZzLndyaXRlRmlsZVN5bmModHJhY2tlZEZpbGVQYXRoLCBCdWZmZXIuZnJvbShjb250ZW50LnRvU3RyaW5nKCdiaW5hcnknKS5yZXBsYWNlQWxsKCdcXHJcXG4nLCAnXFxuJyksICdiaW5hcnknKSk7XG4gICAgcmVub3JtYWxpemVkQ291bnQrKztcbiAgfVxuICBpZiAocmVub3JtYWxpemVkQ291bnQgPiAwKSB7XG4gICAgY29uc29sZS5pbmZvKGBSZW5vcm1hbGl6ZWQgbGluZSBlbmRpbmdzIGluICR7cmVub3JtYWxpemVkQ291bnR9IHRyYWNrZWQgZmlsZShzKS5gKTtcbiAgfVxufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IG9zIGZyb20gJ25vZGU6b3MnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB7IG9wdGlvbnMgfSBmcm9tICcuLi9vcHRpb25zLmpzJztcbmltcG9ydCB7IGNvbnN1bWVzR2VuZXJhdGVkV29ya2VyVHlwZXMsIGdlbmVyYXRlc1dvcmtlclR5cGVzLCB0eXBlIFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGZzVXRpbCB9IGZyb20gJy4uL3V0aWxzL2ZzVXRpbC5qcyc7XG5pbXBvcnQgeyBpZ25vcmVGaWxlVXRpbCB9IGZyb20gJy4uL3V0aWxzL2lnbm9yZUZpbGVVdGlsLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuXG4vLyBEbyBub3QgcmVtb3ZlIGB3aW5kb3dzYDogZ2VuZXJhdGVkIC5naXRpZ25vcmUgZmlsZXMgbXVzdCBrZWVwIGlnbm9yaW5nIFdpbmRvd3MtY3JlYXRlZCBsb2NhbCBhcnRpZmFjdHMuXG5jb25zdCBkZWZhdWx0TmFtZXMgPSBbJ3dpbmRvd3MnLCAnbWFjb3MnLCAnbGludXgnLCAnamV0YnJhaW5zJywgJ3Zpc3VhbHN0dWRpb2NvZGUnLCAnZW1hY3MnLCAndmltJywgJ3lhcm4nXTtcblxuY29uc3QgY29tbW9uQ29udGVudCA9IGBcbl9fZ2VuZXJhdGVkX18vXG4hLmtlZXBcbi5haWRlcipcbi5hbnRpZ3Jhdml0eWNsaS9cbi5jbGF1ZGUvKi5sb2NhbC4qXG4uY2xhdWRlL3NjaGVkdWxlZF90YXNrcy5sb2NrXG4uZGV2Y29udGFpbmVyL1xuLmRvY2tlci5lbnZcbi5lbnYqXG4uaWRlYS9BdWdtZW50V2Vidmlld1N0YXRlU3RvcmUueG1sXG4uaWRlYS9jb3BpbG90Lipcbi5pZGVhL2NvcGlsb3QvY2hhdFNlc3Npb25zL1xuLnBsYXl3cmlnaHQtY2xpL1xuLnBsYXl3cmlnaHQtbWNwL1xuLnNlcmVuYS9cbi50bXAvXG4udG1wLSovXG4udG9rZW5zYXZlL1xuLndiL1xuQHdpbGxib29zdGVyL1xuQHdpbGxib29zdGVyLXByaXZhdGUvXG4qL21vdW50LyouaGFzaFxuQ0xBVURFLmxvY2FsLm1kXG5kaXN0L1xuZHJpenpsZS9tb3VudC9cbnRlbXAvXG50bXAvXG5gO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVHaXRpZ25vcmUoY29uZmlnOiBQYWNrYWdlQ29uZmlnLCByb290Q29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZ2VuZXJhdGVHaXRpZ25vcmUnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICcuZ2l0aWdub3JlJyk7XG4gICAgY29uc3QgY29udGVudCA9IChhd2FpdCBmc1V0aWwucmVhZEZpbGVJZkV4aXN0cyhmaWxlUGF0aCkpID8/ICcnO1xuICAgIGxldCBoZWFkVXNlckNvbnRlbnQgPSBpZ25vcmVGaWxlVXRpbC5nZXRIZWFkVXNlckNvbnRlbnQoY29udGVudCkgKyBjb21tb25Db250ZW50O1xuICAgIGNvbnN0IHRhaWxVc2VyQ29udGVudCA9IGlnbm9yZUZpbGVVdGlsLmdldFRhaWxVc2VyQ29udGVudChjb250ZW50KTtcblxuICAgIGNvbnN0IG5hbWVzID0gWy4uLmRlZmF1bHROYW1lc107XG4gICAgaWYgKGNvbmZpZy5kb2VzQ29udGFpbkdlbWZpbGUpIHtcbiAgICAgIG5hbWVzLnB1c2goJ3J1YnknKTtcbiAgICB9XG4gICAgaWYgKGNvbmZpZy5kb2VzQ29udGFpbkdvTW9kKSB7XG4gICAgICBuYW1lcy5wdXNoKCdnbycpO1xuICAgICAgaGVhZFVzZXJDb250ZW50ICs9IGAke3BhdGguYmFzZW5hbWUoY29uZmlnLmRpclBhdGgpfVxuYDtcbiAgICB9XG4gICAgLy8gRXZlcnkgYWNjZXB0ZWQgcmVwb3NpdG9yeSByb290IHJlY2VpdmVzIGEgbWFuYWdlZCBwYWNrYWdlLmpzb24gbGF0ZXIgaW4gdGhlIHNhbWUgcnVuLCBzbyBpdHNcbiAgICAvLyBkZXBlbmRlbmN5IHRyZWUgbXVzdCBiZSBpZ25vcmVkIGV2ZW4gd2hlbiB0aGUgbWFuaWZlc3QgZGlkIG5vdCBleGlzdCBhdCBjb25maWctZGV0ZWN0aW9uIHRpbWUuXG4gICAgaWYgKGNvbmZpZy5kb2VzQ29udGFpblBhY2thZ2VKc29uIHx8IGNvbmZpZy5pc1Jvb3QpIHtcbiAgICAgIG5hbWVzLnB1c2goJ25vZGUnKTtcbiAgICB9XG4gICAgLy8gUmVjdXJzaXZlIGRldGVjdGlvbiAobm90IGp1c3QgYSByb290IHBvbS54bWwpOiBhIG11bHRpLWxhbmd1YWdlIHJlcG9zaXRvcnkga2VlcHMgaXRzIE1hdmVuXG4gICAgLy8gbW9kdWxlcyBpbiBzdWJkaXJlY3RvcmllcywgYW5kIGRyb3BwaW5nIHRoZSBtYXZlbiB0ZW1wbGF0ZSB3b3VsZCBsZXQgdGFyZ2V0LyBnZXQgdHJhY2tlZC5cbiAgICBpZiAoY29uZmlnLmRvZXNDb250YWluUG9tWG1sQW55d2hlcmUpIHtcbiAgICAgIG5hbWVzLnB1c2goJ21hdmVuJyk7XG4gICAgICBoZWFkVXNlckNvbnRlbnQgKz0gYC5pZGVhL2dvb2dsZS1qYXZhLWZvcm1hdC54bWxcbmA7XG4gICAgfVxuICAgIGlmIChjb25maWcuZG9lc0NvbnRhaW5QdWJzcGVjWWFtbCkge1xuICAgICAgbmFtZXMucHVzaCgnZmx1dHRlcicsICdBbmRyb2lkU3R1ZGlvJywgJ3J1YnknKTtcbiAgICAgIGhlYWRVc2VyQ29udGVudCArPSBgLmZsdXR0ZXItcGx1Z2lucy1kZXBlbmRlbmNpZXNcbmFuZHJvaWQva2V5LnByb3BlcnRpZXNcbmlvcy8uYnVuZGxlXG4uaWRlYS9ydW5Db25maWd1cmF0aW9ucy54bWxcbmA7XG4gICAgfVxuICAgIGlmIChjb25maWcuZG9lc0NvbnRhaW5UZW1wbGF0ZVlhbWwpIHtcbiAgICAgIGhlYWRVc2VyQ29udGVudCArPSBgLmF3cy1zYW0vXG5wYWNrYWdlZC55YW1sXG5gO1xuICAgIH1cbiAgICAvLyBCZWNhdXNlIC52ZW52IHNob3VsZCBiZSBpZ25vcmVkIG9uIHJvb3QgZGlyZWN0b3J5LiBSZWN1cnNpdmUgZGV0ZWN0aW9uIChub3QganVzdCBhIHJvb3RcbiAgICAvLyBsb2NrZmlsZSk6IGEgbXVsdGktbGFuZ3VhZ2UgcmVwb3NpdG9yeSBrZWVwcyBQeXRob24gZGlyZWN0b3JpZXMgaW4gc3ViZGlyZWN0b3JpZXMsIGFuZFxuICAgIC8vIGRyb3BwaW5nIHRoZSBweXRob24gdGVtcGxhdGUgd291bGQgbGV0IF9fcHljYWNoZV9fLyBhbmQgLnZlbnYvIGdldCB0cmFja2VkLlxuICAgIGlmIChjb25maWcuZG9lc0NvbnRhaW5QeXRob25Mb2NrQW55d2hlcmUpIHtcbiAgICAgIG5hbWVzLnB1c2goJ3B5dGhvbicpO1xuICAgICAgaGVhZFVzZXJDb250ZW50ICs9IGAudmVudi9cbmA7XG4gICAgfVxuXG4gICAgaWYgKGNvbmZpZy5kZXBlbmRpbmcuYmxpdHopIHtcbiAgICAgIGhlYWRVc2VyQ29udGVudCArPSBgLmJsaXR6L1xuLmJsaXR6KipcbmA7XG4gICAgfVxuICAgIGlmIChjb25maWcuZGVwZW5kaW5nLm5leHQpIHtcbiAgICAgIG5hbWVzLnB1c2goJ25leHRqcycpO1xuICAgIH1cbiAgICBpZiAocm9vdENvbmZpZy5kZXBlbmRpbmcuZmlyZWJhc2UgfHwgY29uZmlnLmRlcGVuZGluZy5maXJlYmFzZSkge1xuICAgICAgbmFtZXMucHVzaCgnZmlyZWJhc2UnKTtcbiAgICB9XG4gICAgaWYgKGNvbmZpZy5kZXBlbmRpbmcucHJpc21hIHx8IGNvbmZpZy5kZXBlbmRpbmcuZHJpenpsZSkge1xuICAgICAgaGVhZFVzZXJDb250ZW50ICs9IGAqLnNxbGl0ZTMqXG5gO1xuICAgIH1cbiAgICBpZiAoY29uZmlnLmRlcGVuZGluZy5wbGF5d3JpZ2h0VGVzdCkge1xuICAgICAgaGVhZFVzZXJDb250ZW50ICs9IGBwbGF5d3JpZ2h0LXJlcG9ydC9cbnRlc3QtcmVzdWx0cy9cbmA7XG4gICAgfVxuICAgIGlmIChyb290Q29uZmlnLmRlcGVuZGluZy5yZWFjdE5hdGl2ZSB8fCBjb25maWcuZGVwZW5kaW5nLnJlYWN0TmF0aXZlKSB7XG4gICAgICBuYW1lcy5wdXNoKCdyZWFjdG5hdGl2ZScpO1xuICAgICAgaGVhZFVzZXJDb250ZW50ICs9IGBnb29nbGUtc2VydmljZXMuanNvblxuYW5kcm9pZC9hcHAvc3JjL21haW4vYXNzZXRzL1xuYDtcbiAgICB9XG4gICAgaWYgKGNvbmZpZy5kZXBlbmRpbmcuc3Rvcnlib29rKSB7XG4gICAgICBuYW1lcy5wdXNoKCdzdG9yeWJvb2tqcycpO1xuICAgIH1cbiAgICBpZiAoY29uZmlnLmRlcGVuZGluZy50YXVyaSkge1xuICAgICAgbmFtZXMucHVzaCgncnVzdCcpO1xuICAgIH1cbiAgICBpZiAoY29uZmlnLmRvZXNDb250YWluVGF1cmlDb25maWcpIHtcbiAgICAgIC8vICFDYXJnby5sb2NrIG92ZXJyaWRlcyBhbnkgcHJlLWV4aXN0aW5nIHVuYW5jaG9yZWQgQ2FyZ28ubG9jayBydWxlIGZyb20gYVxuICAgICAgLy8gcGFyZW50IC5naXRpZ25vcmUsIHNvIHRoZSBhcHBsaWNhdGlvbiBsb2NrZmlsZSBzdGF5cyBjb21taXR0YWJsZS5cbiAgICAgIGhlYWRVc2VyQ29udGVudCArPSBgIUNhcmdvLmxvY2tcbnNyYy10YXVyaS9nZW4vc2NoZW1hcy9cbmA7XG4gICAgfVxuICAgIGlmIChjb25maWcuZGVwZW5kaW5nLmxpdGVzdHJlYW0pIHtcbiAgICAgIGhlYWRVc2VyQ29udGVudCArPSBgZ2NwLXNhLWtleS5qc29uXG5gO1xuICAgIH1cbiAgICBpZiAoY29uZmlnLmlzQ2xvdWRmbGFyZSB8fCByb290Q29uZmlnLmlzQ2xvdWRmbGFyZSkge1xuICAgICAgLy8gLmRldi52YXJzKiBob2xkIGxvY2FsIHNlY3JldHMgZm9yIHdyYW5nbGVyIGRldiBhbmQgbXVzdCBuZXZlciBiZSBjb21taXR0ZWQuXG4gICAgICAvLyAuZW52LmNsb3VkZmxhcmUgY2FycmllcyBDTE9VREZMQVJFX0FQSV9UT0tFTjogQ0kgd3JpdGVzIGl0IGZyb20gYSBzZWNyZXQsIGFuZCBhIGxvY2FsXG4gICAgICAvLyBgd2IgZGVwbG95YCBuZWVkcyBhIHJlYWwgdG9rZW4gaW4gaXQsIHNvIGNvbW1pdHRpbmcgaXQgd291bGQgbGVhayBhY2NvdW50IGNyZWRlbnRpYWxzLlxuICAgICAgLy8gSXQgaXMgbGlzdGVkIGV4cGxpY2l0bHkgc28gdGhlIENsb3VkZmxhcmUtc3BlY2lmaWMgY3JlZGVudGlhbCBwb2xpY3kgcmVtYWlucyB2aXNpYmxlLlxuICAgICAgaGVhZFVzZXJDb250ZW50ICs9IGAuZGV2LnZhcnMqXG4uZW52LmNsb3VkZmxhcmVcbi53cmFuZ2xlci9cbmA7XG4gICAgfVxuICAgIC8vIElnbm9yZWQgb25seSB3aGVyZSBwb3N0aW5zdGFsbCByZWdlbmVyYXRlcyBpdCwgc28gd2JmeSBuZXZlciBpZ25vcmVzIGEgZmlsZSB0aGF0IG5vdGhpbmcgcmVjcmVhdGVzLiBUaGlzIGtlZXBzXG4gICAgLy8gaXRzIHRob3VzYW5kcyBvZiBsaW5lcyBvdXQgb2YgZXZlcnkgd3JhbmdsZXIgYnVtcCdzIGRpZmYuIEFuY2hvcmVkIHdpdGggYSBsZWFkaW5nIHNsYXNoIGJlY2F1c2UgYHdyYW5nbGVyIHR5cGVzYFxuICAgIC8vIGFuZCB0aGUgb3B0LW91dCBkZWxldGlvbiBiZWxvdyBvbmx5IGV2ZXIgdG91Y2ggdGhpcyBwYWNrYWdlJ3Mgb3duIGZpbGUsIG5vdCBhIG5lc3RlZCBvbmUgYXQgYW55IGRlcHRoLlxuICAgIGlmIChnZW5lcmF0ZXNXb3JrZXJUeXBlcyhjb25maWcpKSB7XG4gICAgICBoZWFkVXNlckNvbnRlbnQgKz0gYC93b3JrZXItY29uZmlndXJhdGlvbi5kLnRzXG5gO1xuICAgIH0gZWxzZSBpZiAoY29uZmlnLmRvZXNDb250YWluV3JhbmdsZXJDb25maWcgJiYgIWNvbnN1bWVzR2VuZXJhdGVkV29ya2VyVHlwZXMoY29uZmlnKSkge1xuICAgICAgLy8gT24gYSBnZW51aW5lIHdvcmtlci10eXBlcyBvcHQtb3V0IChub3RoaW5nIGNvbnN1bWVzIHRoZSBnZW5lcmF0ZWQgZmlsZTsgZ2VuZXJhdGVzV29ya2VyVHlwZXNcbiAgICAgIC8vIGFsb25lIGlzIGZhbHNlIGZvciB1bnJlbGF0ZWQgcmVhc29ucyBzdWNoIGFzIGEgbWlzc2luZyBsb2NhbCB3cmFuZ2xlciBkZXBlbmRlbmN5LCB3aGVyZSB0aGVcbiAgICAgIC8vIGZpbGUgbWF5IHN0aWxsIGJlIGNvbnN1bWVkKSB0aGUgaWdub3JlIHJ1bGVcbiAgICAgIC8vIGFib3ZlIGRpc2FwcGVhcnMsIHNvIGFuIGFscmVhZHktZ2VuZXJhdGVkIGZpbGUgd291bGQgc3VyZmFjZSBhcyB1bnRyYWNrZWQgbm9pc2Ugb24gZXZlcnlcbiAgICAgIC8vIGNoZWNrb3V0IOKAlCBkZWxldGUgaXQuIE5vIHJlcG9zaXRvcnkgdHJhY2tzIHRoZSBmaWxlIChkb2NzL2V4cGVjdGVkLXJlcG9zaXRvcnktcnVsZXMubWQpLFxuICAgICAgLy8gc28gYW4gZXhpc3RpbmcgY29weSBpcyBhbHdheXMgYSBkaXNwb3NhYmxlIGdlbmVyYXRlZCBvbmUuXG4gICAgICBjb25zdCB3b3JrZXJUeXBlc1BhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICd3b3JrZXItY29uZmlndXJhdGlvbi5kLnRzJyk7XG4gICAgICBpZiAoZnMuZXhpc3RzU3luYyh3b3JrZXJUeXBlc1BhdGgpKSB7XG4gICAgICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiBmcy5wcm9taXNlcy5ybSh3b3JrZXJUeXBlc1BhdGgsIHsgZm9yY2U6IHRydWUgfSkpO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAocm9vdENvbmZpZy5kZXBlbmRpbmcudmluZXh0IHx8IGNvbmZpZy5kZXBlbmRpbmcudmluZXh0KSB7XG4gICAgICBoZWFkVXNlckNvbnRlbnQgKz0gYC52aW5leHQvXG5gO1xuICAgIH1cblxuICAgIGxldCBnZW5lcmF0ZWQgPSAnJztcbiAgICBmb3IgKGNvbnN0IG5hbWUgb2YgbmFtZXMpIHtcbiAgICAgIGxldCBjb250ZW50ID0gKGF3YWl0IHJlYWRDYWNoZShuYW1lKSkgPz8gJyc7XG4gICAgICBpZiAoIWNvbnRlbnQpIHtcbiAgICAgICAgY29uc3QgdXJsID0gYGh0dHBzOi8vd3d3LnRvcHRhbC5jb20vZGV2ZWxvcGVycy9naXRpZ25vcmUvYXBpLyR7bmFtZX1gO1xuICAgICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoKHVybCk7XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlVGV4dCA9IGF3YWl0IHJlc3BvbnNlLnRleHQoKTtcbiAgICAgICAgaWYgKCFyZXNwb25zZS5vayB8fCByZXNwb25zZVRleHQuaW5jbHVkZXMoJ0F0dGVudGlvbiBSZXF1aXJlZCEnKSB8fCByZXNwb25zZVRleHQuaW5jbHVkZXMoJzx0aXRsZT4nKSkge1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoYEZhaWxlZCB0byBmZXRjaCAke3VybH1gKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY29udGVudCA9IHJlc3BvbnNlVGV4dC50cmltKCk7XG4gICAgICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiB3cml0ZUNhY2hlKG5hbWUsIGNvbnRlbnQpKTtcbiAgICAgICAgaWYgKG9wdGlvbnMuaXNWZXJib3NlKSB7XG4gICAgICAgICAgY29uc29sZS5pbmZvKGBGZXRjaGVkICR7dXJsfWApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAoZ2VuZXJhdGVkKSBnZW5lcmF0ZWQgKz0gJ1xcbic7XG4gICAgICBnZW5lcmF0ZWQgKz0gY29udGVudCArICdcXG4nO1xuICAgIH1cbiAgICBpZiAoIShhd2FpdCBpZ25vcmVGaWxlVXRpbC5pc0JlcnJ5WmVyb0luc3RhbGxFbmFibGVkKGZpbGVQYXRoKSkpIHtcbiAgICAgIGdlbmVyYXRlZCA9IGdlbmVyYXRlZC5yZXBsYWNlKCchLnlhcm4vY2FjaGUnLCAnIyAhLnlhcm4vY2FjaGUnKS5yZXBsYWNlKCcjIC5wbnAuKicsICcucG5wLionKTtcbiAgICB9XG4gICAgaWYgKGNvbmZpZy5kb2VzQ29udGFpblBvbVhtbEFueXdoZXJlIHx8IGNvbmZpZy5kb2VzQ29udGFpblB1YnNwZWNZYW1sKSB7XG4gICAgICBnZW5lcmF0ZWQgPSBnZW5lcmF0ZWRcbiAgICAgICAgLnJlcGxhY2VBbGwoL14jIC5pZGVhXFwvYXJ0aWZhY3RzJC9nbSwgJy5pZGVhL2FydGlmYWN0cycpXG4gICAgICAgIC5yZXBsYWNlQWxsKC9eIyAuaWRlYVxcL2NvbXBpbGVyLnhtbCQvZ20sICcuaWRlYS9jb21waWxlci54bWwnKVxuICAgICAgICAucmVwbGFjZUFsbCgvXiMgLmlkZWFcXC9qYXJSZXBvc2l0b3JpZXMueG1sJC9nbSwgJy5pZGVhL2phclJlcG9zaXRvcmllcy54bWwnKVxuICAgICAgICAucmVwbGFjZUFsbCgvXiMgLmlkZWFcXC9tb2R1bGVzLnhtbCQvZ20sICcuaWRlYS9tb2R1bGVzLnhtbCcpXG4gICAgICAgIC5yZXBsYWNlQWxsKC9eIyAuaWRlYVxcLyouaW1sJC9nbSwgJy5pZGVhLyouaW1sJylcbiAgICAgICAgLnJlcGxhY2VBbGwoL14jIC5pZGVhXFwvbW9kdWxlcyQvZ20sICcuaWRlYS9tb2R1bGVzJylcbiAgICAgICAgLnJlcGxhY2VBbGwoL14jICouaW1sJC9nbSwgJyouaW1sJylcbiAgICAgICAgLnJlcGxhY2VBbGwoL14jICouaXByJC9nbSwgJyouaXByJyk7XG4gICAgICBpZiAoY29uZmlnLmRvZXNDb250YWluUHVic3BlY1lhbWwpIHtcbiAgICAgICAgZ2VuZXJhdGVkID0gZ2VuZXJhdGVkLnJlcGxhY2VBbGwoL14uaWRlYVxcL21vZHVsZXMueG1sJC9nbSwgJyMgLmlkZWEvbW9kdWxlcy54bWwnKTtcbiAgICAgIH1cbiAgICB9XG4gICAgZ2VuZXJhdGVkID0gZ2VuZXJhdGVkLnJlcGxhY2VBbGwoL14uaWRlYVxcLz8kL2dtLCAnIyAuaWRlYScpO1xuICAgIGlmIChjb25maWcuZGVwZW5kaW5nLnRhdXJpKSB7XG4gICAgICAvLyBUaGUgcnVzdCB0ZW1wbGF0ZSdzIHVuYW5jaG9yZWQgZGVidWcvIHdvdWxkIGFsc28gaGlkZSBmcm9udGVuZCBzb3VyY2VcbiAgICAgIC8vIGRpcmVjdG9yaWVzIHN1Y2ggYXMgc3JjL2RlYnVnLzsgY2FyZ28gb3V0cHV0IGlzIGFscmVhZHkgY292ZXJlZCBieSB0YXJnZXQvLlxuICAgICAgZ2VuZXJhdGVkID0gZ2VuZXJhdGVkLnJlcGxhY2VBbGwoL15kZWJ1Z1xcLyQvZ20sICcjIGRlYnVnLycpO1xuICAgIH1cbiAgICBpZiAoY29uZmlnLmRvZXNDb250YWluVGF1cmlDb25maWcgfHwgY29uZmlnLmRvZXNDb250YWluVGF1cmlDb25maWdJblBhY2thZ2VzKSB7XG4gICAgICAvLyBUaGUgcnVzdCB0ZW1wbGF0ZSBpZ25vcmVzIENhcmdvLmxvY2ssIGJ1dCBhIHNyYy10YXVyaSBjb25maWd1cmF0aW9uIG1hcmtzIGFuXG4gICAgICAvLyBhcHBsaWNhdGlvbiwgd2hvc2UgQ2FyZ28ubG9jayBtdXN0IGJlIGNvbW1pdHRlZCBmb3IgcmVwcm9kdWNpYmxlIGJ1aWxkcy4gVGhlXG4gICAgICAvLyBydWxlIGlzIGFsc28gZGlzYWJsZWQgd2hlbiBhIHN1YiBwYWNrYWdlIGNvbnRhaW5zIGEgVGF1cmkgYXBwbGljYXRpb24sIGJlY2F1c2VcbiAgICAgIC8vIGFuIHVuYW5jaG9yZWQgQ2FyZ28ubG9jayBydWxlIGluIGEgcGFyZW50IC5naXRpZ25vcmUgd291bGQgaGlkZSB0aGUgbmVzdGVkXG4gICAgICAvLyBhcHBsaWNhdGlvbidzIGxvY2tmaWxlLiBUYXVyaSBwbHVnaW4gbGlicmFyaWVzIChkZXRlY3RlZCBvbmx5IHZpYVxuICAgICAgLy8gQHRhdXJpLWFwcHMvKiBkZXBlbmRlbmNpZXMpIGtlZXAgdGhlIHRlbXBsYXRlJ3MgcG9saWN5IG9mIGlnbm9yaW5nIENhcmdvLmxvY2suXG4gICAgICBnZW5lcmF0ZWQgPSBnZW5lcmF0ZWQucmVwbGFjZUFsbCgvXkNhcmdvXFwubG9jayQvZ20sICcjIENhcmdvLmxvY2snKTtcbiAgICB9XG4gICAgaWYgKHJvb3RDb25maWcuZGVwZW5kaW5nLnJlYWN0TmF0aXZlIHx8IGNvbmZpZy5kZXBlbmRpbmcucmVhY3ROYXRpdmUgfHwgY29uZmlnLmRvZXNDb250YWluUHVic3BlY1lhbWwpIHtcbiAgICAgIGdlbmVyYXRlZCA9IGdlbmVyYXRlZC5yZXBsYWNlQWxsKC9eKC5pZGVhXFwvLispJC9nbSwgJyQxXFxuYW5kcm9pZC8kMScpO1xuICAgIH1cbiAgICBjb25zdCBuZXdDb250ZW50ID0gaGVhZFVzZXJDb250ZW50ICsgJ1xcbicgKyBnZW5lcmF0ZWQgKyB0YWlsVXNlckNvbnRlbnQ7XG4gICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzVXRpbC5nZW5lcmF0ZUZpbGUoZmlsZVBhdGgsIG5ld0NvbnRlbnQpKTtcbiAgfSk7XG59XG5cbmNvbnN0IGRpclBhdGggPSBwYXRoLmpvaW4ob3MuaG9tZWRpcigpLCAnLmNhY2hlJywgJ3diZnknLCAnZ2l0aWdub3JlJyk7XG5cbmFzeW5jIGZ1bmN0aW9uIHdyaXRlQ2FjaGUobmFtZTogc3RyaW5nLCBjb250ZW50OiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgYXdhaXQgZnMucHJvbWlzZXMubWtkaXIoZGlyUGF0aCwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gIGF3YWl0IGZzLnByb21pc2VzLndyaXRlRmlsZShwYXRoLmpvaW4oZGlyUGF0aCwgbmFtZSksIGNvbnRlbnQpO1xufVxuXG5hc3luYyBmdW5jdGlvbiByZWFkQ2FjaGUobmFtZTogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmcgfCB1bmRlZmluZWQ+IHtcbiAgdHJ5IHtcbiAgICBjb25zdCBzdGF0ID0gYXdhaXQgZnMucHJvbWlzZXMuc3RhdChwYXRoLmpvaW4oZGlyUGF0aCwgbmFtZSkpO1xuICAgIGlmIChEYXRlLm5vdygpIC0gc3RhdC5tdGltZU1zID4gNiAqIDYwICogNjAgKiAxMDAwKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHJldHVybiBhd2FpdCBmcy5wcm9taXNlcy5yZWFkRmlsZShwYXRoLmpvaW4oZGlyUGF0aCwgbmFtZSksICd1dGY4Jyk7XG4gIH0gY2F0Y2gge1xuICAgIC8vIGRvIG5vdGhpbmdcbiAgfVxufVxuIiwiaW1wb3J0IGNoaWxkX3Byb2Nlc3MgZnJvbSAnbm9kZTpjaGlsZF9wcm9jZXNzJztcbmltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5pbXBvcnQgeyBmaWxlVVJMVG9QYXRoIH0gZnJvbSAnbm9kZTp1cmwnO1xuXG4vKipcbiAqIFRoZSB2ZXJzaW9uIHdiZnkncyBvd24gcGFja2FnZS5qc29uIGNhcnJpZXMgaW4gdGhlIHJlcG9zaXRvcnkuIGBAc2VtYW50aWMtcmVsZWFzZS9ucG1gIHJld3JpdGVzXG4gKiBpdCBpbiB0aGUgcHVibGlzaGVkIHRhcmJhbGwgb25seSAoaXQgaXMgbmV2ZXIgY29tbWl0dGVkIGJhY2spLCBzbyBhIHdiZnkgcnVuIHN0YXJ0ZWQgZnJvbSBhIGdpdFxuICogY2hlY2tvdXQgcmVwb3J0cyB0aGlzIHBsYWNlaG9sZGVyIGluc3RlYWQgb2YgYSByZWFsIHZlcnNpb24uXG4gKi9cbmNvbnN0IHVucmVsZWFzZWRWZXJzaW9uUHJlZml4ID0gJzAuMC4wLSc7XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRXYmZ5VmVyc2lvbigpOiBzdHJpbmcge1xuICByZXR1cm4gcmVhZFdiZnlQYWNrYWdlSnNvbigpLnZlcnNpb247XG59XG5cbi8qKiB3YmZ5J3MgbG9jYXRpb24gaW5zaWRlIGl0cyBvd24gcmVwb3NpdG9yeSwgcmVsYXRpdmUgdG8gdGhlIHJlcG9zaXRvcnkgcm9vdC4gKi9cbmNvbnN0IHdiZnlEaXJQYXRoSW5SZXBvID0gcGF0aC5qb2luKCdwYWNrYWdlcycsICd3YmZ5Jyk7XG5cbi8qKlxuICogSWRlbnRpZmllcyB0aGUgd2JmeSBidWlsZCB0aGF0IHByb2R1Y2VkIHRoZSBnZW5lcmF0ZWQgZmlsZXM6IHRoZSByZWxlYXNlZCB2ZXJzaW9uLCBvclxuICogYDxzaG9ydCBjb21taXQgaGFzaD5bLWRpcnR5XS1sb2NhbGAgd2hlbiB3YmZ5IHJ1bnMgZnJvbSBpdHMgb3duIGdpdCBjaGVja291dC4gVW5kZWZpbmVkIHdoZW5cbiAqIG5laXRoZXIgaXMgYXZhaWxhYmxlIChlLmcuIGFuIHVucmVsZWFzZWQgYnVpbGQgZXh0cmFjdGVkIGZyb20gYSBzb3VyY2UgYXJjaGl2ZSkuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRXYmZ5VmVyc2lvbkxhYmVsKCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIC8vIE5laXRoZXIgdGhlIGluc3RhbGxlZCBwYWNrYWdlLmpzb24gbm9yIHRoZSBnaXQgc3RhdGUgb2Ygd2JmeSdzIG93biBjaGVja291dCBjYW4gY2hhbmdlXG4gIC8vIG1pZC1ydW4sIGFuZCBjb21wdXRpbmcgdGhlIGxhYmVsIHNwYXducyBzZXZlcmFsIGdpdCBzdWJwcm9jZXNzZXMsIHNvIGl0IGlzIGNvbXB1dGVkIG9uY2UuXG4gIGlmICghaGFzQ29tcHV0ZWRWZXJzaW9uTGFiZWwpIHtcbiAgICBjYWNoZWRWZXJzaW9uTGFiZWwgPSBjb21wdXRlV2JmeVZlcnNpb25MYWJlbCgpO1xuICAgIGhhc0NvbXB1dGVkVmVyc2lvbkxhYmVsID0gdHJ1ZTtcbiAgfVxuICByZXR1cm4gY2FjaGVkVmVyc2lvbkxhYmVsO1xufVxuXG5sZXQgaGFzQ29tcHV0ZWRWZXJzaW9uTGFiZWwgPSBmYWxzZTtcbmxldCBjYWNoZWRWZXJzaW9uTGFiZWw6IHN0cmluZyB8IHVuZGVmaW5lZDtcblxuZnVuY3Rpb24gY29tcHV0ZVdiZnlWZXJzaW9uTGFiZWwoKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgeyBuYW1lLCB2ZXJzaW9uLCBkaXJQYXRoIH0gPSByZWFkV2JmeVBhY2thZ2VKc29uKCk7XG4gIGlmICghdmVyc2lvbi5zdGFydHNXaXRoKHVucmVsZWFzZWRWZXJzaW9uUHJlZml4KSkgcmV0dXJuIHZlcnNpb247XG5cbiAgLy8gZ2l0IHJlc29sdmVzIHRoZSBORUFSRVNUIGVuY2xvc2luZyByZXBvc2l0b3J5LCB3aGljaCBmb3IgYW4gdW5yZWxlYXNlZCBidWlsZCBwbGFjZWQgdW5kZXIgYVxuICAvLyB0YXJnZXQgcmVwb3NpdG9yeSAobm9kZV9tb2R1bGVzLCBvciBhIHZlbmRvcmVkL2V4dHJhY3RlZCBzb3VyY2UgdHJlZSkgaXMgdGhhdCByZXBvc2l0b3J5IOKAlCBpdHNcbiAgLy8gY29tbWl0IHNheXMgbm90aGluZyBhYm91dCB0aGUgd2JmeSBidWlsZCB0aGF0IHJhbi4gT25seSB3YmZ5J3Mgb3duIGxvY2F0aW9uIGluc2lkZSBpdHMgb3duXG4gIC8vIHJlcG9zaXRvcnkgaWRlbnRpZmllcyBhIGdlbnVpbmUgY2hlY2tvdXQsIHNvIGFueXRoaW5nIGVsc2UgZmFsbHMgYmFjayB0byB0aGUgdmVyc2lvbi1sZXNzIGxhYmVsLlxuICBjb25zdCBnaXRSb290RGlyUGF0aCA9IHJ1bkdpdChbJ3Jldi1wYXJzZScsICctLXNob3ctdG9wbGV2ZWwnXSwgZGlyUGF0aCk7XG4gIGlmIChcbiAgICAhZ2l0Um9vdERpclBhdGggfHxcbiAgICBwYXRoLnJlbGF0aXZlKGdpdFJvb3REaXJQYXRoLCBkaXJQYXRoKSAhPT0gd2JmeURpclBhdGhJblJlcG8gfHxcbiAgICAhaXNXYmZ5UmVwb3NpdG9yeShnaXRSb290RGlyUGF0aClcbiAgKSB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuICBjb25zdCBjb21taXRIYXNoID0gcnVuR2l0KFsncmV2LXBhcnNlJywgJy0tc2hvcnQ9OCcsICdIRUFEJ10sIGRpclBhdGgpO1xuICBpZiAoIWNvbW1pdEhhc2gpIHJldHVybiB1bmRlZmluZWQ7XG4gIC8vIFRoZSBjb21taXQgYWxvbmUgd291bGQgbWlzaWRlbnRpZnkgYSBidWlsZCBtYWRlIGZyb20gYW4gZWRpdGVkIGNoZWNrb3V0LCBzbyB1bmNvbW1pdHRlZCBjaGFuZ2VzXG4gIC8vIGFyZSByZXBvcnRlZCB0b28g4oCUIGJ1dCBvbmx5IHVuZGVyIHBhY2thZ2VzLyovc3JjLCBwYWNrYWdlcy8qL2JpbiBhbmQgcGFja2FnZXMvKi9jb25maWdzLCB0aGVcbiAgLy8gc291cmNlLCBlbnRyeS1wb2ludCB3cmFwcGVyIGFuZCBwb2xpY3kgZmlsZXMgd2JmeSBhbmQgaXRzIHdvcmtzcGFjZSBkZXBlbmRlbmNpZXMgYWN0dWFsbHkgcnVuXG4gIC8vIGZyb20uIEV2ZXJ5dGhpbmcgd2JmeSBHRU5FUkFURVMgd2hlbiBpdCB0YXJnZXRzIGl0cyBvd24gcmVwb3NpdG9yeSBsaXZlcyBvdXRzaWRlIHRob3NlICh0aGVcbiAgLy8gcm9vdCBSRUFETUUgdGhpcyBsYWJlbCBnb2VzIGludG8sIGFuZCBlYWNoIHBhY2thZ2UncyAuZ2l0aWdub3JlLCBwYWNrYWdlLmpzb24sIHRzY29uZmlnLCDigKYpLCBzb1xuICAvLyBhIGZpcnN0IHJ1biBjYW5ub3QgbWFrZSB0aGUgbmV4dCBvbmUgcmVsYWJlbCB0aGUgYmFkZ2UgYC1kaXJ0eS1sb2NhbGAgYnkgaXRzZWxmLlxuICAvLyBNYW5pZmVzdHMgc3RheSBvdXQgb24gcHVycG9zZSwgZXZlbiB0aG91Z2ggYW4gZWRpdGVkIGBleHBvcnRzYCBtYXAgY2FuIHJlZGlyZWN0IHdoaWNoIGNvZGVcbiAgLy8gbG9hZHM6IHdiZnkgR0VORVJBVEVTIHBhY2thZ2UuanNvbiwgc28gaW5jbHVkaW5nIGl0IHdvdWxkIG1ha2UgZXZlcnkgcnVuIHJlcG9ydCBpdHNlbGYgZGlydHkuXG4gIC8vIFRoZSBsYWJlbCBpcyBiZXN0LWVmZm9ydCBidWlsZCBwcm92ZW5hbmNlLCBub3QgYSByZXByb2R1Y2libGUtYnVpbGQgYXR0ZXN0YXRpb24uXG4gIGNvbnN0IGlzRGlydHkgPSBnZXRHaXREaXJ0eVN0YXRlKGdpdFJvb3REaXJQYXRoKTtcbiAgaWYgKGlzRGlydHkgPT09IHVuZGVmaW5lZCkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgaWYgKGlzRGlydHkpIHJldHVybiBgJHtjb21taXRIYXNofS1kaXJ0eS1sb2NhbGA7XG4gIC8vIEFuIHVubW9kaWZpZWQgY2hlY2tvdXQgc2l0dGluZyBvbiBhIHJlbGVhc2UgdGFnIHJ1bnMgZXhhY3RseSB0aGUgY29kZSB0aGF0IHdhcyBwdWJsaXNoZWQgdW5kZXJcbiAgLy8gdGhhdCB2ZXJzaW9uLCBzbyBpdCBpcyBsYWJlbGVkIHdpdGggdGhlIHZlcnNpb24gaW5zdGVhZCBvZiB0aGUgY29tbWl0IHRoYXQgb25seSB3YmZ5IGRldmVsb3BlcnNcbiAgLy8gY291bGQgcmVzb2x2ZSBiYWNrIHRvIG9uZS5cbiAgcmV0dXJuIGZpbmRSZWxlYXNlZFZlcnNpb25BdEhlYWQobmFtZSwgZGlyUGF0aCkgPz8gYCR7Y29tbWl0SGFzaH0tbG9jYWxgO1xufVxuXG4vKiogYEBzZW1hbnRpYy1yZWxlYXNlL25wbWAgdGFncyBlYWNoIHJlbGVhc2UgYDxwYWNrYWdlIG5hbWU+QDx2ZXJzaW9uPmAuICovXG5mdW5jdGlvbiBmaW5kUmVsZWFzZWRWZXJzaW9uQXRIZWFkKHBhY2thZ2VOYW1lOiBzdHJpbmcsIGN3ZDogc3RyaW5nKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgdGFnUHJlZml4ID0gYCR7cGFja2FnZU5hbWV9QGA7XG4gIC8vIEEgY29tbWl0IGNhcnJpZXMgYXQgbW9zdCBvbmUgcmVsZWFzZSB0YWcgcGVyIHBhY2thZ2UsIHNvIHRoZSBmaXJzdCBtYXRjaCBpcyB0aGUgb25seSBtYXRjaC5cbiAgcmV0dXJuIHJ1bkdpdChbJ3RhZycsICctLXBvaW50cy1hdCcsICdIRUFEJ10sIGN3ZClcbiAgICA/LnNwbGl0KCdcXG4nKVxuICAgIC5maW5kKCh0YWcpID0+IHRhZy5zdGFydHNXaXRoKHRhZ1ByZWZpeCkpXG4gICAgPy5zbGljZSh0YWdQcmVmaXgubGVuZ3RoKTtcbn1cblxuZnVuY3Rpb24gaXNXYmZ5UmVwb3NpdG9yeShnaXRSb290RGlyUGF0aDogc3RyaW5nKTogYm9vbGVhbiB7XG4gIC8vIEV2ZXJ5IHJlbW90ZSBjb3VudHMsIG5vdCBqdXN0IGBvcmlnaW5gOiBhIGZvcmsgY2hlY2tvdXQgY2FycmllcyB0aGUgY2Fub25pY2FsIHJlcG9zaXRvcnkgYXNcbiAgLy8gYHVwc3RyZWFtYCwgYW5kIGl0IGlzIHN0aWxsIGEgZ2VudWluZSB3YmZ5IGNoZWNrb3V0IHdob3NlIGNvbW1pdCBpZGVudGlmaWVzIHRoZSBidWlsZC5cbiAgY29uc3QgcmVtb3RlVXJscyA9IHJ1bkdpdChbJ3JlbW90ZScsICctdiddLCBnaXRSb290RGlyUGF0aCk7XG4gIHJldHVybiAhIXJlbW90ZVVybHM/LnNwbGl0KCdcXG4nKS5zb21lKChsaW5lKSA9PiBpc0Nhbm9uaWNhbFJlbW90ZVVybChsaW5lLnNwbGl0KC9bIFxcdF0rL3UpWzFdID8/ICcnKSk7XG59XG5cbmNvbnN0IGNhbm9uaWNhbFJlcG9zaXRvcnlQYXRoID0gL15cXC8/V2lsbEJvb3N0ZXJcXC9zaGFyZWQoPzpcXC5naXQpPyQvaXU7XG5cbi8qKlxuICogV2hldGhlciB0aGUgcmVtb3RlIFVSTCBwb2ludHMgYXQgd2JmeSdzIG93biByZXBvc2l0b3J5LiBUaGUgaG9zdCBpcyBjb21wYXJlZCBhZnRlciBQQVJTSU5HIHJhdGhlclxuICogdGhhbiBtYXRjaGVkIGluc2lkZSB0aGUgc3RyaW5nOiBhbnkgcGF0dGVybiBsb29zZSBlbm91Z2ggdG8gYWNjZXB0IGV2ZXJ5IFVSTCBmb3JtIGdpdCBzdXBwb3J0c1xuICogYWxzbyBhY2NlcHRlZCBhIGxvb2thbGlrZSB0aGF0IG1lcmVseSBjb250YWlucyB0aGUgaG9zdCwgc3VjaCBhc1xuICogYGh0dHBzOi8vZXZpbC5leGFtcGxlLy9naXRodWIuY29tL1dpbGxCb29zdGVyL3NoYXJlZC5naXRgLCBsZXR0aW5nIGFuIHVucmVsYXRlZCBjaGVja291dCBjbGFpbSB0b1xuICogYmUgYSBnZW51aW5lIHdiZnkgYnVpbGQuXG4gKi9cbmZ1bmN0aW9uIGlzQ2Fub25pY2FsUmVtb3RlVXJsKHVybDogc3RyaW5nKTogYm9vbGVhbiB7XG4gIC8vIHNjcC1zdHlsZSAoYGdpdEBnaXRodWIuY29tOldpbGxCb29zdGVyL3NoYXJlZC5naXRgKSBpcyBub3QgYSBVUkwsIHNvIGl0IGlzIG1hdGNoZWQgc2VwYXJhdGVseS5cbiAgLy8gVGhlIGxvb2thaGVhZCBrZWVwcyBhIHNjaGVtZSdzIGA6Ly9gIGZyb20gYmVpbmcgcmVhZCBhcyB0aGUgYGhvc3Q6cGF0aGAgc2VwYXJhdG9yLlxuICBjb25zdCBzY3BNYXRjaCA9IC9eKD86W15AL10rQCk/KFteLzpdKyk6KD8hXFwvKSguKikkL3UuZXhlYyh1cmwpO1xuICBpZiAoc2NwTWF0Y2gpIHtcbiAgICByZXR1cm4gc2NwTWF0Y2hbMV0hLnRvTG93ZXJDYXNlKCkgPT09ICdnaXRodWIuY29tJyAmJiBjYW5vbmljYWxSZXBvc2l0b3J5UGF0aC50ZXN0KHNjcE1hdGNoWzJdISk7XG4gIH1cbiAgdHJ5IHtcbiAgICBjb25zdCB7IGhvc3RuYW1lLCBwYXRobmFtZSB9ID0gbmV3IFVSTCh1cmwpO1xuICAgIHJldHVybiBob3N0bmFtZS50b0xvd2VyQ2FzZSgpID09PSAnZ2l0aHViLmNvbScgJiYgY2Fub25pY2FsUmVwb3NpdG9yeVBhdGgudGVzdChwYXRobmFtZSk7XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxufVxuXG5mdW5jdGlvbiBnZXRHaXREaXJ0eVN0YXRlKGdpdFJvb3REaXJQYXRoOiBzdHJpbmcpOiBib29sZWFuIHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgcHJvYyA9IGNoaWxkX3Byb2Nlc3Muc3Bhd25TeW5jKFxuICAgICdnaXQnLFxuICAgIFtcbiAgICAgICdzdGF0dXMnLFxuICAgICAgJy0tcG9yY2VsYWluJyxcbiAgICAgICctLXVudHJhY2tlZC1maWxlcz1hbGwnLFxuICAgICAgJy0tJyxcbiAgICAgIGA6KGdsb2IpJHtwYXRoLmRpcm5hbWUod2JmeURpclBhdGhJblJlcG8pfS8qL3NyYy8qKmAsXG4gICAgICBgOihnbG9iKSR7cGF0aC5kaXJuYW1lKHdiZnlEaXJQYXRoSW5SZXBvKX0vKi9iaW4vKipgLFxuICAgICAgYDooZ2xvYikke3BhdGguZGlybmFtZSh3YmZ5RGlyUGF0aEluUmVwbyl9LyovY29uZmlncy8qKmAsXG4gICAgXSxcbiAgICB7IGN3ZDogZ2l0Um9vdERpclBhdGgsIGVuY29kaW5nOiAndXRmOCcsIHN0ZGlvOiAncGlwZScgfVxuICApO1xuICByZXR1cm4gcHJvYy5zdGF0dXMgPT09IDAgPyAhIXByb2Muc3Rkb3V0LnRyaW0oKSA6IHVuZGVmaW5lZDtcbn1cblxuZnVuY3Rpb24gcnVuR2l0KGFyZ3M6IHN0cmluZ1tdLCBjd2Q6IHN0cmluZyk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IHByb2MgPSBjaGlsZF9wcm9jZXNzLnNwYXduU3luYygnZ2l0JywgYXJncywgeyBjd2QsIGVuY29kaW5nOiAndXRmOCcsIHN0ZGlvOiAncGlwZScgfSk7XG4gIHJldHVybiBwcm9jLnN0YXR1cyA9PT0gMCA/IHByb2Muc3Rkb3V0LnRyaW0oKSB8fCB1bmRlZmluZWQgOiB1bmRlZmluZWQ7XG59XG5cbmxldCBjYWNoZWRXYmZ5UGFja2FnZUpzb246IHsgbmFtZTogc3RyaW5nOyB2ZXJzaW9uOiBzdHJpbmc7IGRpclBhdGg6IHN0cmluZyB9IHwgdW5kZWZpbmVkO1xuXG4vKiogUmV0dXJucyB3YmZ5J3Mgb3duIHBhY2thZ2UgZGlyZWN0b3J5LCB3aGljaCBhbHNvIGhvbGRzIGl0cyBjb25maWdzIChlLmcuIHJlbGVhc2VBZ2VHYXRlLmpzb24pLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFdiZnlEaXJQYXRoKCk6IHN0cmluZyB7XG4gIHJldHVybiByZWFkV2JmeVBhY2thZ2VKc29uKCkuZGlyUGF0aDtcbn1cblxuZnVuY3Rpb24gcmVhZFdiZnlQYWNrYWdlSnNvbigpOiB7IG5hbWU6IHN0cmluZzsgdmVyc2lvbjogc3RyaW5nOyBkaXJQYXRoOiBzdHJpbmcgfSB7XG4gIGlmIChjYWNoZWRXYmZ5UGFja2FnZUpzb24pIHJldHVybiBjYWNoZWRXYmZ5UGFja2FnZUpzb247XG4gIC8vIGZpbGVVUkxUb1BhdGgsIG5vdCBVUkwucGF0aG5hbWU6IHRoZSBsYXR0ZXIga2VlcHMgcGVyY2VudC1lbmNvZGluZywgc28gYW4gaW5zdGFsbGF0aW9uIHBhdGhcbiAgLy8gY29udGFpbmluZyBlLmcuIGEgc3BhY2Ugd291bGQgcmVzb2x2ZSB0byBhIG5vbmV4aXN0ZW50IGRpcmVjdG9yeSBhbmQgdGhlIHNlYXJjaCB3b3VsZCB3YWxrIHVwXG4gIC8vIHRvIGFuIHVucmVsYXRlZCBwYWNrYWdlLlxuICBsZXQgZGlyUGF0aCA9IHBhdGguZGlybmFtZShmaWxlVVJMVG9QYXRoKGltcG9ydC5tZXRhLnVybCkpO1xuICB3aGlsZSAoIWZzLmV4aXN0c1N5bmMocGF0aC5qb2luKGRpclBhdGgsICdwYWNrYWdlLmpzb24nKSkpIHtcbiAgICBjb25zdCBwYXJlbnREaXJQYXRoID0gcGF0aC5kaXJuYW1lKGRpclBhdGgpO1xuICAgIC8vIHBhdGguZGlybmFtZSgnLycpID09PSAnLycsIHNvIHRoZSBzZWFyY2ggbXVzdCBzdG9wIGV4cGxpY2l0bHkgYXQgdGhlIGZpbGVzeXN0ZW0gcm9vdC5cbiAgICBpZiAocGFyZW50RGlyUGF0aCA9PT0gZGlyUGF0aCkgdGhyb3cgbmV3IEVycm9yKFwid2JmeSdzIG93biBwYWNrYWdlLmpzb24gaXMgbWlzc2luZy5cIik7XG4gICAgZGlyUGF0aCA9IHBhcmVudERpclBhdGg7XG4gIH1cbiAgY29uc3QgcGFja2FnZUpzb24gPSBKU09OLnBhcnNlKGZzLnJlYWRGaWxlU3luYyhwYXRoLmpvaW4oZGlyUGF0aCwgJ3BhY2thZ2UuanNvbicpLCAndXRmOCcpKSBhcyB7XG4gICAgbmFtZTogc3RyaW5nO1xuICAgIHZlcnNpb246IHN0cmluZztcbiAgfTtcbiAgY2FjaGVkV2JmeVBhY2thZ2VKc29uID0geyBuYW1lOiBwYWNrYWdlSnNvbi5uYW1lLCB2ZXJzaW9uOiBwYWNrYWdlSnNvbi52ZXJzaW9uLCBkaXJQYXRoIH07XG4gIHJldHVybiBjYWNoZWRXYmZ5UGFja2FnZUpzb247XG59XG4iLCJpbXBvcnQgeyBzcGF3blN5bmMgfSBmcm9tICdub2RlOmNoaWxkX3Byb2Nlc3MnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHsgZ2V0V2JmeURpclBhdGggfSBmcm9tICcuLi91dGlscy92ZXJzaW9uLmpzJztcblxuLyoqXG4gKiBBcHBsaWVzIHRoZSBvcmdhbml6YXRpb24ncyBtaW5pbXVtLXJlbGVhc2UtYWdlIHBvbGljeSB0byB0aGUgZGV2ZWxvcGVyIG1hY2hpbmUncyBHTE9CQUxcbiAqIHBhY2thZ2UtbWFuYWdlciBjb25maWdzLiBSZXBvc2l0b3J5IGNvbmZpZ3MgZ3VhcmQgb25seSB3YmZpZWQgcmVwb3NpdG9yaWVzOyBhIGJyYW5kLW5ldyBsb2NhbFxuICogcHJvamVjdCBoYXMgbm8gYnVuZmlnLnRvbWwgeWV0LCBzbyB0aGUgZ2xvYmFsIGZpbGVzIGFyZSB0aGUgb25seSBnYXRlIGJldHdlZW4gYGJ1biBjcmVhdGVgIC9cbiAqIGBucG0gaW5pdGAgYW5kIGEgZnJlc2hseSBjb21wcm9taXNlZCByZWxlYXNlLiBUaGUgc2FtZSBzY3JpcHQgcnVucyBvbiBDSSBhbmQgb24gdGhlIHNlbGYtaG9zdGVkXG4gKiBydW5uZXJzLCBzbyBldmVyeSBtYWNoaW5lIGVuZHMgdXAgd2l0aCBieXRlLWlkZW50aWNhbCBzZXR0aW5ncy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGVuc3VyZUdsb2JhbFJlbGVhc2VBZ2VHYXRlcygpOiBib29sZWFuIHtcbiAgY29uc3QgeyBzdGF0dXMgfSA9IHNwYXduU3luYygnYmFzaCcsIFtwYXRoLmpvaW4oZ2V0V2JmeURpclBhdGgoKSwgJ2NvbmZpZ3MnLCAnYXBwbHlSZWxlYXNlQWdlR2F0ZS5zaCcpXSwge1xuICAgIHN0ZGlvOiAnaW5oZXJpdCcsXG4gIH0pO1xuICBpZiAoc3RhdHVzID09PSAwKSByZXR1cm4gdHJ1ZTtcblxuICBjb25zb2xlLndhcm4oJ0ZhaWxlZCB0byBhcHBseSB0aGUgbWluaW11bS1yZWxlYXNlLWFnZSBwb2xpY3kgdG8gdGhlIGdsb2JhbCBwYWNrYWdlLW1hbmFnZXIgY29uZmlncy4nKTtcbiAgcmV0dXJuIGZhbHNlO1xufVxuIiwiaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5cbmV4cG9ydCBmdW5jdGlvbiBkb2VzQ29udGFpbkpzT3JUcyhjb25maWc6IFBhY2thZ2VDb25maWcpOiBib29sZWFuIHtcbiAgcmV0dXJuIChcbiAgICBjb25maWcuZG9lc0NvbnRhaW5KYXZhU2NyaXB0IHx8XG4gICAgY29uZmlnLmRvZXNDb250YWluSmF2YVNjcmlwdEluUGFja2FnZXMgfHxcbiAgICBjb25maWcuZG9lc0NvbnRhaW5UeXBlU2NyaXB0IHx8XG4gICAgY29uZmlnLmRvZXNDb250YWluVHlwZVNjcmlwdEluUGFja2FnZXNcbiAgKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGRvZXNDb250YWluSmF2YShjb25maWc6IFBhY2thZ2VDb25maWcpOiBib29sZWFuIHtcbiAgcmV0dXJuIGNvbmZpZy5kb2VzQ29udGFpbkphdmEgfHwgY29uZmlnLmRvZXNDb250YWluSmF2YUluUGFja2FnZXM7XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBleHRlbnNpb25zIH0gZnJvbSAnLi4vdXRpbHMvZXh0ZW5zaW9ucy5qcyc7XG5pbXBvcnQgeyBmc1V0aWwgfSBmcm9tICcuLi91dGlscy9mc1V0aWwuanMnO1xuaW1wb3J0IHsgZG9lc0NvbnRhaW5KYXZhLCBkb2VzQ29udGFpbkpzT3JUcyB9IGZyb20gJy4uL3V0aWxzL3BhY2thZ2VDYXBhYmlsaXRpZXMuanMnO1xuaW1wb3J0IHsgcHJvbWlzZVBvb2wgfSBmcm9tICcuLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5cbi8vIEtlZXAgcGFja2FnZS1tYW5hZ2VyIHNoaW1zIGluIHRoZSBGaWxlIFdhdGNoZXIgcHJvZ3JhbSBmaWVsZCBzbyBub2RlIGRvZXMgbm90XG4vLyBwYXJzZSB3cmFwcGVyIHNjcmlwdHMgcGFzc2VkIHRocm91Z2ggYXJndW1lbnRzLlxuY29uc3Qgb3hmbXRQcm9ncmFtID0gJyRQcm9qZWN0RmlsZURpciQvbm9kZV9tb2R1bGVzLy5iaW4vb3hmbXQnO1xuY29uc3QgcHJldHRpZXJQcm9ncmFtID0gJyRQcm9qZWN0RmlsZURpciQvbm9kZV9tb2R1bGVzLy5iaW4vcHJldHRpZXInO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVJZGVhU2V0dGluZ3MoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZ2VuZXJhdGVJZGVhU2V0dGluZ3MnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgZGlyUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJy5pZGVhJyk7XG4gICAgaWYgKGZzLmV4aXN0c1N5bmMoZGlyUGF0aCkpIHtcbiAgICAgIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKGRpclBhdGgsICd3YXRjaGVyVGFza3MueG1sJyk7XG4gICAgICBhd2FpdCAoZG9lc0NvbnRhaW5Kc09yVHMoY29uZmlnKSB8fCBkb2VzQ29udGFpbkphdmEoY29uZmlnKVxuICAgICAgICA/IHByb21pc2VQb29sLnJ1bigoKSA9PiBmc1V0aWwuZ2VuZXJhdGVGaWxlKGZpbGVQYXRoLCBnZXRXYXRjaGVyVGFza3NDb250ZW50KGNvbmZpZykpKVxuICAgICAgICA6IHByb21pc2VQb29sLnJ1bigoKSA9PiBmcy5wcm9taXNlcy5ybShmaWxlUGF0aCwgeyBmb3JjZTogdHJ1ZSB9KSkpO1xuICAgIH1cbiAgfSk7XG59XG5cbmZ1bmN0aW9uIGdldFdhdGNoZXJUYXNrc0NvbnRlbnQoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogc3RyaW5nIHtcbiAgY29uc3QgdGFza09wdGlvbnMgPSBbXG4gICAge1xuICAgICAgYXJnczogJy0td3JpdGUgLS1uby1lcnJvci1vbi11bm1hdGNoZWQtcGF0dGVybiAhKiovcGFja2FnZS5qc29uJyxcbiAgICAgIGNvbmRpdGlvbjogZG9lc0NvbnRhaW5Kc09yVHMoY29uZmlnKSxcbiAgICAgIGV4dGVuc2lvbnM6IGV4dGVuc2lvbnMub3hmbXQsXG4gICAgICBuYW1lOiAnT3hmbXQnLFxuICAgICAgcHJvZ3JhbTogb3hmbXRQcm9ncmFtLFxuICAgIH0sXG4gICAge1xuICAgICAgYXJnczogJy0tY2FjaGUgLS13cml0ZScsXG4gICAgICBjb25kaXRpb246IGRvZXNDb250YWluSmF2YShjb25maWcpLFxuICAgICAgZXh0ZW5zaW9uczogZXh0ZW5zaW9ucy5wcmV0dGllck9ubHksXG4gICAgICBuYW1lOiAnUHJldHRpZXInLFxuICAgICAgcHJvZ3JhbTogcHJldHRpZXJQcm9ncmFtLFxuICAgIH0sXG4gIF1cbiAgICAuZmlsdGVyKCh0YXNrKSA9PiB0YXNrLmNvbmRpdGlvbilcbiAgICAuZmxhdE1hcCgodGFzaykgPT4gdGFzay5leHRlbnNpb25zLm1hcCgoZXh0KSA9PiBjcmVhdGVUYXNrT3B0aW9ucyh0YXNrLnByb2dyYW0sIHRhc2suYXJncywgdGFzay5uYW1lLCBleHQpKSk7XG5cbiAgcmV0dXJuIGA8P3htbCB2ZXJzaW9uPVwiMS4wXCIgZW5jb2Rpbmc9XCJVVEYtOFwiPz5cbjxwcm9qZWN0IHZlcnNpb249XCI0XCI+XG4gIDxjb21wb25lbnQgbmFtZT1cIlByb2plY3RUYXNrc09wdGlvbnNcIj5cbiAgICAke3Rhc2tPcHRpb25zLmpvaW4oJycpfVxuICA8L2NvbXBvbmVudD5cbjwvcHJvamVjdD5cbmA7XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZVRhc2tPcHRpb25zKHJ1bm5lcjogc3RyaW5nLCBhcmdzOiBzdHJpbmcsIG5hbWU6IHN0cmluZywgZXh0ZW5zaW9uOiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gYCAgICA8VGFza09wdGlvbnMgaXNFbmFibGVkPVwidHJ1ZVwiPlxuICAgICAgPG9wdGlvbiBuYW1lPVwiYXJndW1lbnRzXCIgdmFsdWU9XCIke2FyZ3N9ICRGaWxlUGF0aFJlbGF0aXZlVG9Qcm9qZWN0Um9vdCRcIiAvPlxuICAgICAgPG9wdGlvbiBuYW1lPVwiY2hlY2tTeW50YXhFcnJvcnNcIiB2YWx1ZT1cImZhbHNlXCIgLz5cbiAgICAgIDxvcHRpb24gbmFtZT1cImRlc2NyaXB0aW9uXCIgLz5cbiAgICAgIDxvcHRpb24gbmFtZT1cImV4aXRDb2RlQmVoYXZpb3JcIiB2YWx1ZT1cIkVSUk9SXCIgLz5cbiAgICAgIDxvcHRpb24gbmFtZT1cImZpbGVFeHRlbnNpb25cIiB2YWx1ZT1cIiR7ZXh0ZW5zaW9ufVwiIC8+XG4gICAgICA8b3B0aW9uIG5hbWU9XCJpbW1lZGlhdGVTeW5jXCIgdmFsdWU9XCJmYWxzZVwiIC8+XG4gICAgICA8b3B0aW9uIG5hbWU9XCJuYW1lXCIgdmFsdWU9XCIke25hbWV9ICguJHtleHRlbnNpb259KVwiIC8+XG4gICAgICA8b3B0aW9uIG5hbWU9XCJvdXRwdXRcIiB2YWx1ZT1cIiRGaWxlUGF0aFJlbGF0aXZlVG9Qcm9qZWN0Um9vdCRcIiAvPlxuICAgICAgPG9wdGlvbiBuYW1lPVwib3V0cHV0RmlsdGVyc1wiPlxuICAgICAgICA8YXJyYXkgLz5cbiAgICAgIDwvb3B0aW9uPlxuICAgICAgPG9wdGlvbiBuYW1lPVwib3V0cHV0RnJvbVN0ZG91dFwiIHZhbHVlPVwiZmFsc2VcIiAvPlxuICAgICAgPG9wdGlvbiBuYW1lPVwicHJvZ3JhbVwiIHZhbHVlPVwiJHtydW5uZXJ9XCIgLz5cbiAgICAgIDxvcHRpb24gbmFtZT1cInJ1bk9uRXh0ZXJuYWxDaGFuZ2VzXCIgdmFsdWU9XCJmYWxzZVwiIC8+XG4gICAgICA8b3B0aW9uIG5hbWU9XCJzY29wZU5hbWVcIiB2YWx1ZT1cIlByb2plY3QgRmlsZXNcIiAvPlxuICAgICAgPG9wdGlvbiBuYW1lPVwidHJhY2tPbmx5Um9vdFwiIHZhbHVlPVwiZmFsc2VcIiAvPlxuICAgICAgPG9wdGlvbiBuYW1lPVwid29ya2luZ0RpclwiIHZhbHVlPVwiJFByb2plY3RGaWxlRGlyJFwiIC8+XG4gICAgICA8ZW52cyAvPlxuICAgIDwvVGFza09wdGlvbnM+XG5gO1xufVxuIiwiaW1wb3J0IHR5cGUgeyBQYWNrYWdlSnNvbiB9IGZyb20gJ3R5cGUtZmVzdCc7XG5cbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuXG5leHBvcnQgZnVuY3Rpb24gZ2V0R2VuSTE4blRzQ29tbWFuZChcbiAgY29uZmlnOiBQaWNrPFBhY2thZ2VDb25maWcsICdkZXBlbmRpbmcnPixcbiAgc2NyaXB0czogUGFja2FnZUpzb24uU2NyaXB0cyB8IHVuZGVmaW5lZFxuKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgaWYgKCFjb25maWcuZGVwZW5kaW5nLmdlbkkxOG5UcyB8fCAhc2NyaXB0cz8uWydnZW4taTE4bi10cyddKSByZXR1cm4gdW5kZWZpbmVkO1xuICByZXR1cm4gJ2J1biBydW4gZ2VuLWkxOG4tdHMgPiAvZGV2L251bGwnO1xufVxuIiwiY29uc3QgaGFzID0gKG9iamVjdCwga2V5KSA9PiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqZWN0LCBrZXkpXG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHNvcnRPYmplY3RCeUtleU5hbWVMaXN0KG9iamVjdCwgc29ydFdpdGgpIHtcbiAgbGV0IGtleXMsIHNvcnRGbiwga2V5XG5cbiAgaWYgKHR5cGVvZiBzb3J0V2l0aCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIHNvcnRGbiA9IHNvcnRXaXRoXG4gIH0gZWxzZSB7XG4gICAga2V5cyA9IHNvcnRXaXRoXG4gIH1cblxuICBjb25zdCB0b3RhbCA9IHt9XG4gIGNvbnN0IG9iamVjdEtleXMgPSBbLi4uKGtleXMgPz8gW10pLCAuLi5PYmplY3Qua2V5cyhvYmplY3QpLnNvcnQoc29ydEZuKV1cblxuICBmb3IgKGtleSBvZiBvYmplY3RLZXlzKSB7XG4gICAgaWYgKGhhcyhvYmplY3QsIGtleSkpIHtcbiAgICAgIHRvdGFsW2tleV0gPSBvYmplY3Rba2V5XVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiB0b3RhbFxufVxuIiwiLy8gRGV0ZWN0IGVpdGhlciBzcGFjZXMgb3IgdGFicyBidXQgbm90IGJvdGggdG8gcHJvcGVybHkgaGFuZGxlIHRhYnMgZm9yIGluZGVudGF0aW9uIGFuZCBzcGFjZXMgZm9yIGFsaWdubWVudFxuY29uc3QgSU5ERU5UX1JFR0VYID0gL14oPzooICkrfFxcdCspLztcblxuY29uc3QgSU5ERU5UX1RZUEVfU1BBQ0UgPSAnc3BhY2UnO1xuY29uc3QgSU5ERU5UX1RZUEVfVEFCID0gJ3RhYic7XG5cbi8vIEhlbHBlciBmdW5jdGlvbiB0byBjaGVjayBpZiB3ZSBzaG91bGQgaWdub3JlIHNpbmdsZSBzcGFjZSBwYXR0ZXJuc1xuZnVuY3Rpb24gc2hvdWxkSWdub3JlU2luZ2xlU3BhY2UoaWdub3JlU2luZ2xlU3BhY2VzLCBpbmRlbnRUeXBlLCB2YWx1ZSkge1xuXHRyZXR1cm4gaWdub3JlU2luZ2xlU3BhY2VzICYmIGluZGVudFR5cGUgPT09IElOREVOVF9UWVBFX1NQQUNFICYmIHZhbHVlID09PSAxO1xufVxuXG4vKipcbk1ha2UgYSBNYXAgdGhhdCBjb3VudHMgaG93IG1hbnkgaW5kZW50cy91bmluZGVudHMgaGF2ZSBvY2N1cnJlZCBmb3IgYSBnaXZlbiBzaXplIGFuZCBob3cgbWFueSBsaW5lcyBmb2xsb3cgYSBnaXZlbiBpbmRlbnRhdGlvbi5cblxuVGhlIGtleSBpcyBhIGNvbmNhdGVuYXRpb24gb2YgdGhlIGluZGVudGF0aW9uIHR5cGUgKHMgPSBzcGFjZSBhbmQgdCA9IHRhYikgYW5kIHRoZSBzaXplIG9mIHRoZSBpbmRlbnRzL3VuaW5kZW50cy5cblxuYGBgXG5pbmRlbnRzID0ge1xuXHR0MzogWzEsIDBdLFxuXHR0NDogWzEsIDVdLFxuXHRzNTogWzEsIDBdLFxuXHRzMTI6IFsxLCAwXSxcbn1cbmBgYFxuKi9cbmZ1bmN0aW9uIG1ha2VJbmRlbnRzTWFwKHN0cmluZywgaWdub3JlU2luZ2xlU3BhY2VzKSB7XG5cdGNvbnN0IGluZGVudHMgPSBuZXcgTWFwKCk7XG5cblx0Ly8gUmVtZW1iZXIgdGhlIHNpemUgb2YgcHJldmlvdXMgbGluZSdzIGluZGVudGF0aW9uXG5cdGxldCBwcmV2aW91c1NpemUgPSAwO1xuXHRsZXQgcHJldmlvdXNJbmRlbnRUeXBlO1xuXG5cdC8vIEluZGVudHMga2V5IChpZGVudCB0eXBlICsgc2l6ZSBvZiB0aGUgaW5kZW50cy91bmluZGVudHMpXG5cdGxldCBrZXk7XG5cblx0Zm9yIChjb25zdCBsaW5lIG9mIHN0cmluZy5zcGxpdCgvXFxuL2cpKSB7XG5cdFx0aWYgKCFsaW5lKSB7XG5cdFx0XHQvLyBJZ25vcmUgZW1wdHkgbGluZXNcblx0XHRcdGNvbnRpbnVlO1xuXHRcdH1cblxuXHRcdGNvbnN0IG1hdGNoZXMgPSBsaW5lLm1hdGNoKElOREVOVF9SRUdFWCk7XG5cblx0XHRpZiAobWF0Y2hlcyA9PT0gbnVsbCkge1xuXHRcdFx0cHJldmlvdXNTaXplID0gMDtcblx0XHRcdHByZXZpb3VzSW5kZW50VHlwZSA9ICcnO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRjb25zdCBpbmRlbnQgPSBtYXRjaGVzWzBdLmxlbmd0aDtcblx0XHRcdGNvbnN0IGluZGVudFR5cGUgPSBtYXRjaGVzWzFdID8gSU5ERU5UX1RZUEVfU1BBQ0UgOiBJTkRFTlRfVFlQRV9UQUI7XG5cblx0XHRcdC8vIElnbm9yZSBzaW5nbGUgc3BhY2UgdW5sZXNzIGl0J3MgdGhlIG9ubHkgaW5kZW50IGRldGVjdGVkIHRvIHByZXZlbnQgY29tbW9uIGZhbHNlIHBvc2l0aXZlc1xuXHRcdFx0aWYgKHNob3VsZElnbm9yZVNpbmdsZVNwYWNlKGlnbm9yZVNpbmdsZVNwYWNlcywgaW5kZW50VHlwZSwgaW5kZW50KSkge1xuXHRcdFx0XHRjb250aW51ZTtcblx0XHRcdH1cblxuXHRcdFx0aWYgKGluZGVudFR5cGUgIT09IHByZXZpb3VzSW5kZW50VHlwZSkge1xuXHRcdFx0XHRwcmV2aW91c1NpemUgPSAwO1xuXHRcdFx0fVxuXG5cdFx0XHRwcmV2aW91c0luZGVudFR5cGUgPSBpbmRlbnRUeXBlO1xuXG5cdFx0XHRsZXQgdXNlID0gMTtcblx0XHRcdGxldCB3ZWlnaHQgPSAwO1xuXG5cdFx0XHRjb25zdCBpbmRlbnREaWZmZXJlbmNlID0gaW5kZW50IC0gcHJldmlvdXNTaXplO1xuXHRcdFx0cHJldmlvdXNTaXplID0gaW5kZW50O1xuXG5cdFx0XHQvLyBQcmV2aW91cyBsaW5lIGhhdmUgc2FtZSBpbmRlbnQ/XG5cdFx0XHRpZiAoaW5kZW50RGlmZmVyZW5jZSA9PT0gMCkge1xuXHRcdFx0XHQvLyBOb3QgYSBuZXcgXCJ1c2VcIiBvZiB0aGUgY3VycmVudCBpbmRlbnQ6XG5cdFx0XHRcdHVzZSA9IDA7XG5cdFx0XHRcdC8vIEJ1dCBkbyBhZGQgYSBiaXQgdG8gaXQgZm9yIGJyZWFraW5nIHRpZXM6XG5cdFx0XHRcdHdlaWdodCA9IDE7XG5cdFx0XHRcdC8vIFdlIHVzZSB0aGUga2V5IGZyb20gcHJldmlvdXMgbG9vcFxuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0Y29uc3QgYWJzb2x1dGVJbmRlbnREaWZmZXJlbmNlID0gTWF0aC5hYnMoaW5kZW50RGlmZmVyZW5jZSk7XG5cblx0XHRcdFx0Ly8gSWdub3JlIHNpbmdsZSBzcGFjZSBjaGFuZ2VzIHdoZW4gaWdub3JlU2luZ2xlU3BhY2VzIGlzIHRydWVcblx0XHRcdFx0Ly8gVGhpcyBwcmV2ZW50cyBjb21tb24gZmFsc2UgcG9zaXRpdmVzIGZyb20gdGhpbmdzIGxpa2UgYWxpZ25lZCBjb21tZW50c1xuXHRcdFx0XHRpZiAoc2hvdWxkSWdub3JlU2luZ2xlU3BhY2UoaWdub3JlU2luZ2xlU3BhY2VzLCBpbmRlbnRUeXBlLCBhYnNvbHV0ZUluZGVudERpZmZlcmVuY2UpKSB7XG5cdFx0XHRcdFx0Y29udGludWU7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRrZXkgPSBlbmNvZGVJbmRlbnRzS2V5KGluZGVudFR5cGUsIGFic29sdXRlSW5kZW50RGlmZmVyZW5jZSk7XG5cdFx0XHR9XG5cblx0XHRcdC8vIFVwZGF0ZSB0aGUgc3RhdHNcblx0XHRcdGNvbnN0IGVudHJ5ID0gaW5kZW50cy5nZXQoa2V5KTtcblx0XHRcdGluZGVudHMuc2V0KGtleSwgZW50cnkgPT09IHVuZGVmaW5lZCA/IFsxLCAwXSA6IFtlbnRyeVswXSArIHVzZSwgZW50cnlbMV0gKyB3ZWlnaHRdKTtcblx0XHR9XG5cdH1cblxuXHRyZXR1cm4gaW5kZW50cztcbn1cblxuLy8gRW5jb2RlIHRoZSBpbmRlbnQgdHlwZSBhbmQgYW1vdW50IGFzIGEgc3RyaW5nIChlLmcuICdzNCcpIGZvciB1c2UgYXMgYSBjb21wb3VuZCBrZXkgaW4gdGhlIGluZGVudHMgTWFwLlxuZnVuY3Rpb24gZW5jb2RlSW5kZW50c0tleShpbmRlbnRUeXBlLCBpbmRlbnRBbW91bnQpIHtcblx0Y29uc3QgdHlwZUNoYXJhY3RlciA9IGluZGVudFR5cGUgPT09IElOREVOVF9UWVBFX1NQQUNFID8gJ3MnIDogJ3QnO1xuXHRyZXR1cm4gdHlwZUNoYXJhY3RlciArIFN0cmluZyhpbmRlbnRBbW91bnQpO1xufVxuXG4vLyBFeHRyYWN0IHRoZSBpbmRlbnQgdHlwZSBhbmQgYW1vdW50IGZyb20gYSBrZXkgb2YgdGhlIGluZGVudHMgTWFwLlxuZnVuY3Rpb24gZGVjb2RlSW5kZW50c0tleShpbmRlbnRzS2V5KSB7XG5cdGNvbnN0IGtleUhhc1R5cGVTcGFjZSA9IGluZGVudHNLZXlbMF0gPT09ICdzJztcblx0Y29uc3QgdHlwZSA9IGtleUhhc1R5cGVTcGFjZSA/IElOREVOVF9UWVBFX1NQQUNFIDogSU5ERU5UX1RZUEVfVEFCO1xuXG5cdGNvbnN0IGFtb3VudCA9IE51bWJlcihpbmRlbnRzS2V5LnNsaWNlKDEpKTtcblxuXHRyZXR1cm4ge3R5cGUsIGFtb3VudH07XG59XG5cbi8vIFJldHVybiB0aGUga2V5IChlLmcuICdzNCcpIGZyb20gdGhlIGluZGVudHMgTWFwIHRoYXQgcmVwcmVzZW50cyB0aGUgbW9zdCBjb21tb24gaW5kZW50LFxuLy8gb3IgcmV0dXJuIHVuZGVmaW5lZCBpZiB0aGVyZSBhcmUgbm8gaW5kZW50cy5cbmZ1bmN0aW9uIGdldE1vc3RVc2VkS2V5KGluZGVudHMpIHtcblx0bGV0IHJlc3VsdDtcblx0bGV0IG1heFVzZWQgPSAwO1xuXHRsZXQgbWF4V2VpZ2h0ID0gMDtcblxuXHRmb3IgKGNvbnN0IFtrZXksIFt1c2VkQ291bnQsIHdlaWdodF1dIG9mIGluZGVudHMpIHtcblx0XHRpZiAodXNlZENvdW50ID4gbWF4VXNlZCB8fCAodXNlZENvdW50ID09PSBtYXhVc2VkICYmIHdlaWdodCA+IG1heFdlaWdodCkpIHtcblx0XHRcdG1heFVzZWQgPSB1c2VkQ291bnQ7XG5cdFx0XHRtYXhXZWlnaHQgPSB3ZWlnaHQ7XG5cdFx0XHRyZXN1bHQgPSBrZXk7XG5cdFx0fVxuXHR9XG5cblx0cmV0dXJuIHJlc3VsdDtcbn1cblxuZnVuY3Rpb24gbWFrZUluZGVudFN0cmluZyh0eXBlLCBhbW91bnQpIHtcblx0Y29uc3QgaW5kZW50Q2hhcmFjdGVyID0gdHlwZSA9PT0gSU5ERU5UX1RZUEVfU1BBQ0UgPyAnICcgOiAnXFx0Jztcblx0cmV0dXJuIGluZGVudENoYXJhY3Rlci5yZXBlYXQoYW1vdW50KTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gZGV0ZWN0SW5kZW50KHN0cmluZykge1xuXHRpZiAodHlwZW9mIHN0cmluZyAhPT0gJ3N0cmluZycpIHtcblx0XHR0aHJvdyBuZXcgVHlwZUVycm9yKCdFeHBlY3RlZCBhIHN0cmluZycpO1xuXHR9XG5cblx0Ly8gSWRlbnRpZnkgaW5kZW50cyB3aGlsZSBza2lwcGluZyBzaW5nbGUgc3BhY2UgaW5kZW50cyB0byBhdm9pZCBjb21tb24gZWRnZSBjYXNlcyAoZS5nLiBjb2RlIGNvbW1lbnRzKVxuXHQvLyBJZiBubyBpbmRlbnRzIGFyZSBpZGVudGlmaWVkLCBydW4gYWdhaW4gYW5kIGluY2x1ZGUgYWxsIGluZGVudHMgZm9yIGNvbXByZWhlbnNpdmUgZGV0ZWN0aW9uXG5cdGxldCBpbmRlbnRzID0gbWFrZUluZGVudHNNYXAoc3RyaW5nLCB0cnVlKTtcblx0aWYgKGluZGVudHMuc2l6ZSA9PT0gMCkge1xuXHRcdGluZGVudHMgPSBtYWtlSW5kZW50c01hcChzdHJpbmcsIGZhbHNlKTtcblx0fVxuXG5cdGNvbnN0IGtleU9mTW9zdFVzZWRJbmRlbnQgPSBnZXRNb3N0VXNlZEtleShpbmRlbnRzKTtcblxuXHRsZXQgdHlwZTtcblx0bGV0IGFtb3VudCA9IDA7XG5cdGxldCBpbmRlbnQgPSAnJztcblxuXHRpZiAoa2V5T2ZNb3N0VXNlZEluZGVudCAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0KHt0eXBlLCBhbW91bnR9ID0gZGVjb2RlSW5kZW50c0tleShrZXlPZk1vc3RVc2VkSW5kZW50KSk7XG5cdFx0aW5kZW50ID0gbWFrZUluZGVudFN0cmluZyh0eXBlLCBhbW91bnQpO1xuXHR9XG5cblx0cmV0dXJuIHtcblx0XHRhbW91bnQsXG5cdFx0dHlwZSxcblx0XHRpbmRlbnQsXG5cdH07XG59XG4iLCJleHBvcnQgZnVuY3Rpb24gZGV0ZWN0TmV3bGluZShzdHJpbmcpIHtcblx0aWYgKHR5cGVvZiBzdHJpbmcgIT09ICdzdHJpbmcnKSB7XG5cdFx0dGhyb3cgbmV3IFR5cGVFcnJvcignRXhwZWN0ZWQgYSBzdHJpbmcnKTtcblx0fVxuXG5cdGNvbnN0IG5ld2xpbmVzID0gc3RyaW5nLm1hdGNoKC8oPzpcXHI/XFxuKS9nKSB8fCBbXTtcblxuXHRpZiAobmV3bGluZXMubGVuZ3RoID09PSAwKSB7XG5cdFx0cmV0dXJuO1xuXHR9XG5cblx0Y29uc3QgY3JsZiA9IG5ld2xpbmVzLmZpbHRlcihuZXdsaW5lID0+IG5ld2xpbmUgPT09ICdcXHJcXG4nKS5sZW5ndGg7XG5cdGNvbnN0IGxmID0gbmV3bGluZXMubGVuZ3RoIC0gY3JsZjtcblxuXHRyZXR1cm4gY3JsZiA+IGxmID8gJ1xcclxcbicgOiAnXFxuJztcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGRldGVjdE5ld2xpbmVHcmFjZWZ1bChzdHJpbmcpIHtcblx0cmV0dXJuICh0eXBlb2Ygc3RyaW5nID09PSAnc3RyaW5nJyAmJiBkZXRlY3ROZXdsaW5lKHN0cmluZykpIHx8ICdcXG4nO1xufVxuIiwiIiwiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gaXNQbGFpbk9iamVjdCh2YWx1ZSkge1xuXHRpZiAodHlwZW9mIHZhbHVlICE9PSAnb2JqZWN0JyB8fCB2YWx1ZSA9PT0gbnVsbCkge1xuXHRcdHJldHVybiBmYWxzZTtcblx0fVxuXG5cdGNvbnN0IHByb3RvdHlwZSA9IE9iamVjdC5nZXRQcm90b3R5cGVPZih2YWx1ZSk7XG5cdHJldHVybiAocHJvdG90eXBlID09PSBudWxsIHx8IHByb3RvdHlwZSA9PT0gT2JqZWN0LnByb3RvdHlwZSB8fCBPYmplY3QuZ2V0UHJvdG90eXBlT2YocHJvdG90eXBlKSA9PT0gbnVsbCkgJiYgIShTeW1ib2wudG9TdHJpbmdUYWcgaW4gdmFsdWUpICYmICEoU3ltYm9sLml0ZXJhdG9yIGluIHZhbHVlKTtcbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJ1xuaW1wb3J0IHNvcnRPYmplY3RLZXlzIGZyb20gJ3NvcnQtb2JqZWN0LWtleXMnXG5pbXBvcnQgZGV0ZWN0SW5kZW50IGZyb20gJ2RldGVjdC1pbmRlbnQnXG5pbXBvcnQgeyBkZXRlY3ROZXdsaW5lR3JhY2VmdWwgYXMgZGV0ZWN0TmV3bGluZSB9IGZyb20gJ2RldGVjdC1uZXdsaW5lJ1xuaW1wb3J0IGdpdEhvb2tzIGZyb20gJ2dpdC1ob29rcy1saXN0J1xuaW1wb3J0IGlzUGxhaW5PYmplY3QgZnJvbSAnaXMtcGxhaW4tb2JqJ1xuaW1wb3J0IHNlbXZlckNvbXBhcmUgZnJvbSAnc2VtdmVyL2Z1bmN0aW9ucy9jb21wYXJlLmpzJ1xuaW1wb3J0IHNlbXZlck1pblZlcnNpb24gZnJvbSAnc2VtdmVyL3Jhbmdlcy9taW4tdmVyc2lvbi5qcydcblxuY29uc3QgcGlwZSA9XG4gIChmbnMpID0+XG4gICh4LCAuLi5hcmdzKSA9PlxuICAgIGZucy5yZWR1Y2UoKHJlc3VsdCwgZm4pID0+IGZuKHJlc3VsdCwgLi4uYXJncyksIHgpXG5jb25zdCBvbkFycmF5ID0gKGZuKSA9PiAoeCkgPT4gKEFycmF5LmlzQXJyYXkoeCkgPyBmbih4KSA6IHgpXG5jb25zdCBvblN0cmluZ0FycmF5ID0gKGZuKSA9PiAoeCkgPT5cbiAgQXJyYXkuaXNBcnJheSh4KSAmJiB4LmV2ZXJ5KChpdGVtKSA9PiB0eXBlb2YgaXRlbSA9PT0gJ3N0cmluZycpID8gZm4oeCkgOiB4XG5jb25zdCB1bmlxID0gb25TdHJpbmdBcnJheSgoeHMpID0+IFsuLi5uZXcgU2V0KHhzKV0pXG5jb25zdCBzb3J0QXJyYXkgPSBvblN0cmluZ0FycmF5KChhcnJheSkgPT4gYXJyYXkudG9Tb3J0ZWQoKSlcbmNvbnN0IHVuaXFBbmRTb3J0QXJyYXkgPSBwaXBlKFt1bmlxLCBzb3J0QXJyYXldKVxuY29uc3Qgb25PYmplY3QgPVxuICAoZm4pID0+XG4gICh4LCAuLi5hcmdzKSA9PlxuICAgIGlzUGxhaW5PYmplY3QoeCkgPyBmbih4LCAuLi5hcmdzKSA6IHhcbmNvbnN0IHNvcnRPYmplY3RCeSA9IChjb21wYXJhdG9yLCBkZWVwKSA9PiB7XG4gIGNvbnN0IG92ZXIgPSBvbk9iamVjdCgob2JqZWN0KSA9PiB7XG4gICAgaWYgKGRlZXApIHtcbiAgICAgIG9iamVjdCA9IE9iamVjdC5mcm9tRW50cmllcyhcbiAgICAgICAgT2JqZWN0LmVudHJpZXMob2JqZWN0KS5tYXAoKFtrZXksIHZhbHVlXSkgPT4gW2tleSwgb3Zlcih2YWx1ZSldKSxcbiAgICAgIClcbiAgICB9XG5cbiAgICByZXR1cm4gc29ydE9iamVjdEtleXMob2JqZWN0LCBjb21wYXJhdG9yKVxuICB9KVxuXG4gIHJldHVybiBvdmVyXG59XG5jb25zdCBzb3J0T2JqZWN0ID0gc29ydE9iamVjdEJ5KClcbmNvbnN0IHNvcnRVUkxPYmplY3QgPSBzb3J0T2JqZWN0QnkoWyd0eXBlJywgJ3VybCddKVxuY29uc3Qgc29ydFBlb3BsZU9iamVjdCA9IHNvcnRPYmplY3RCeShbJ25hbWUnLCAnZW1haWwnLCAndXJsJ10pXG5jb25zdCBzb3J0RGlyZWN0b3JpZXMgPSBzb3J0T2JqZWN0QnkoW1xuICAnbGliJyxcbiAgJ2JpbicsXG4gICdtYW4nLFxuICAnZG9jJyxcbiAgJ2V4YW1wbGUnLFxuICAndGVzdCcsXG5dKVxuY29uc3Qgb3ZlclByb3BlcnR5ID0gKHByb3BlcnR5LCBvdmVyKSA9PlxuICBvbk9iamVjdCgob2JqZWN0LCAuLi5hcmdzKSA9PlxuICAgIE9iamVjdC5oYXNPd24ob2JqZWN0LCBwcm9wZXJ0eSlcbiAgICAgID8geyAuLi5vYmplY3QsIFtwcm9wZXJ0eV06IG92ZXIob2JqZWN0W3Byb3BlcnR5XSwgLi4uYXJncykgfVxuICAgICAgOiBvYmplY3QsXG4gIClcbmNvbnN0IHNvcnRHaXRIb29rcyA9IHNvcnRPYmplY3RCeShnaXRIb29rcylcblxuY29uc3QgcGFyc2VOYW1lQW5kVmVyc2lvblJhbmdlID0gKHNwZWNpZmllcikgPT4ge1xuICAvLyBJZ25vcmUgYW55dGhpbmcgYWZ0ZXIgPiAmIHJlbHkgb24gZmFsbGJhY2sgYWxwaGFudW1lcmljIHNvcnRpbmcgZm9yIHRoYXRcbiAgY29uc3QgW25hbWVBbmRWZXJzaW9uXSA9IHNwZWNpZmllci5zcGxpdCgnPicpXG4gIGNvbnN0IGF0TWF0Y2hlcyA9IFsuLi5uYW1lQW5kVmVyc2lvbi5tYXRjaEFsbCgnQCcpXVxuICBpZiAoXG4gICAgIWF0TWF0Y2hlcy5sZW5ndGggfHxcbiAgICAoYXRNYXRjaGVzLmxlbmd0aCA9PT0gMSAmJiBhdE1hdGNoZXNbMF0uaW5kZXggPT09IDApXG4gICkge1xuICAgIHJldHVybiB7IG5hbWU6IHNwZWNpZmllciB9XG4gIH1cbiAgY29uc3Qgc3BsaXRJbmRleCA9IGF0TWF0Y2hlcy5wb3AoKS5pbmRleFxuICByZXR1cm4ge1xuICAgIG5hbWU6IG5hbWVBbmRWZXJzaW9uLnN1YnN0cmluZygwLCBzcGxpdEluZGV4KSxcbiAgICByYW5nZTogbmFtZUFuZFZlcnNpb24uc3Vic3RyaW5nKHNwbGl0SW5kZXggKyAxKSxcbiAgfVxufVxuXG5jb25zdCBzb3J0T2JqZWN0QnlTZW12ZXIgPSBzb3J0T2JqZWN0QnkoKGEsIGIpID0+IHtcbiAgY29uc3QgeyBuYW1lOiBhTmFtZSwgcmFuZ2U6IGFSYW5nZSB9ID0gcGFyc2VOYW1lQW5kVmVyc2lvblJhbmdlKGEpXG4gIGNvbnN0IHsgbmFtZTogYk5hbWUsIHJhbmdlOiBiUmFuZ2UgfSA9IHBhcnNlTmFtZUFuZFZlcnNpb25SYW5nZShiKVxuXG4gIGlmIChhTmFtZSAhPT0gYk5hbWUpIHtcbiAgICByZXR1cm4gYU5hbWUubG9jYWxlQ29tcGFyZShiTmFtZSwgJ2VuJylcbiAgfVxuICBpZiAoIWFSYW5nZSkge1xuICAgIHJldHVybiAtMVxuICB9XG4gIGlmICghYlJhbmdlKSB7XG4gICAgcmV0dXJuIDFcbiAgfVxuICByZXR1cm4gc2VtdmVyQ29tcGFyZShzZW12ZXJNaW5WZXJzaW9uKGFSYW5nZSksIHNlbXZlck1pblZlcnNpb24oYlJhbmdlKSlcbn0pXG5cbmNvbnN0IGdldFBhY2thZ2VOYW1lID0gKGlkZW50KSA9PiB7XG4gIGNvbnN0IGluZGV4ID0gaWRlbnQuaW5kZXhPZignQCcsIGlkZW50LnN0YXJ0c1dpdGgoJ0AnKSA/IDEgOiAwKVxuICAvLyBUaGlzIHNob3VsZCBub3QgaGFwcGVuLCB1bmxlc3MgdXNlciBtYW51YWxseSBlZGl0IHRoZSBwYWNrYWdlLmpzb24gZmlsZVxuICByZXR1cm4gaW5kZXggPT09IC0xID8gaWRlbnQgOiBpZGVudC5zbGljZSgwLCBpbmRleClcbn1cblxuY29uc3Qgc29ydE9iamVjdEJ5SWRlbnQgPSAoYSwgYikgPT4ge1xuICBjb25zdCBwYWNrYWdlTmFtZUEgPSBnZXRQYWNrYWdlTmFtZShhKVxuICBjb25zdCBwYWNrYWdlTmFtZUIgPSBnZXRQYWNrYWdlTmFtZShiKVxuXG4gIGlmIChwYWNrYWdlTmFtZUEgPCBwYWNrYWdlTmFtZUIpIHJldHVybiAtMVxuICBpZiAocGFja2FnZU5hbWVBID4gcGFja2FnZU5hbWVCKSByZXR1cm4gMVxuICByZXR1cm4gMFxufVxuXG4vLyBDYWNoZSBieSBgcHJvY2Vzcy5jd2QoKWAgaW5zdGVhZCBvZiBhIHZhcmlhYmxlIHRvIGFsbG93IHVzZXIgY2FsbCBgcHJvY2Vzcy5jaGRpcigpYFxuY29uc3QgY2FjaGUgPSBuZXcgTWFwKClcbmNvbnN0IGhhc1lhcm5PclBucG1GaWxlcyA9ICgpID0+IHtcbiAgY29uc3QgY3dkID0gcHJvY2Vzcy5jd2QoKVxuICBpZiAoIWNhY2hlLmhhcyhjd2QpKSB7XG4gICAgY2FjaGUuc2V0KFxuICAgICAgY3dkLFxuICAgICAgZnMuZXhpc3RzU3luYygneWFybi5sb2NrJykgfHxcbiAgICAgICAgZnMuZXhpc3RzU3luYygnLnlhcm4vJykgfHxcbiAgICAgICAgZnMuZXhpc3RzU3luYygnLnlhcm5yYy55bWwnKSB8fFxuICAgICAgICBmcy5leGlzdHNTeW5jKCdwbnBtLWxvY2sueWFtbCcpIHx8XG4gICAgICAgIGZzLmV4aXN0c1N5bmMoJ3BucG0td29ya3NwYWNlLnlhbWwnKSxcbiAgICApXG4gIH1cbiAgcmV0dXJuIGNhY2hlLmdldChjd2QpXG59XG5cbi8qKlxuICogRGV0ZWN0cyB0aGUgcGFja2FnZSBtYW5hZ2VyIGZyb20gcGFja2FnZS5qc29uIGFuZCBsb2NrIGZpbGVzXG4gKiBAcGFyYW0ge29iamVjdH0gcGFja2FnZUpzb24gLSBUaGUgcGFyc2VkIHBhY2thZ2UuanNvbiBvYmplY3RcbiAqIEByZXR1cm5zIHtib29sZWFufSAtIFRoZSBkZXRlY3RlZCBwYWNrYWdlIG1hbmFnZXIuIERlZmF1bHQgdG8gbnBtIGlmIG5vdCBkZXRlY3RlZC5cbiAqL1xuZnVuY3Rpb24gc2hvdWxkU29ydERlcGVuZGVuY2llc0xpa2VOcG0ocGFja2FnZUpzb24pIHtcbiAgLy8gaHR0cHM6Ly9naXRodWIuY29tL25vZGVqcy9jb3JlcGFja1xuICBpZiAodHlwZW9mIHBhY2thZ2VKc29uLnBhY2thZ2VNYW5hZ2VyID09PSAnc3RyaW5nJykge1xuICAgIHJldHVybiBwYWNrYWdlSnNvbi5wYWNrYWdlTWFuYWdlci5zdGFydHNXaXRoKCducG1AJylcbiAgfVxuXG4gIGlmIChwYWNrYWdlSnNvbi5kZXZFbmdpbmVzPy5wYWNrYWdlTWFuYWdlcj8ubmFtZSkge1xuICAgIHJldHVybiBwYWNrYWdlSnNvbi5kZXZFbmdpbmVzLnBhY2thZ2VNYW5hZ2VyLm5hbWUgPT09ICducG0nXG4gIH1cblxuICBpZiAocGFja2FnZUpzb24ucG5wbSkge1xuICAgIHJldHVybiBmYWxzZVxuICB9XG5cbiAgLy8gT3B0aW1pc2F0aW9uOiBDaGVjayBpZiBucG0gaXMgZXhwbGljaXQgYmVmb3JlIHJlYWRpbmcgRlMuXG4gIGlmIChwYWNrYWdlSnNvbi5lbmdpbmVzPy5ucG0pIHtcbiAgICByZXR1cm4gdHJ1ZVxuICB9XG5cbiAgaWYgKGhhc1lhcm5PclBucG1GaWxlcygpKSB7XG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cblxuICByZXR1cm4gdHJ1ZVxufVxuXG4vKipcbiAqIFNvcnQgZGVwZW5kZW5jaWVzIGFscGhhYmV0aWNhbGx5LCBkZXRlY3RpbmcgcGFja2FnZSBtYW5hZ2VyIHRvIHVzZSB0aGVcbiAqIGFwcHJvcHJpYXRlIGNvbXBhcmlzb24uIG5wbSB1c2VzIGxvY2FsZS1hd2FyZSBjb21wYXJpc29uLCB5YXJuIGFuZCBwbnBtIHVzZVxuICogc2ltcGxlIHN0cmluZyBjb21wYXJpc29uXG4gKi9cbmNvbnN0IHNvcnREZXBlbmRlbmNpZXMgPSBvbk9iamVjdCgoZGVwZW5kZW5jaWVzLCBwYWNrYWdlSnNvbikgPT4ge1xuICAvLyBBdm9pZCBmaWxlIGFjY2Vzc1xuICBpZiAoT2JqZWN0LmtleXMoZGVwZW5kZW5jaWVzKS5sZW5ndGggPCAyKSB7XG4gICAgcmV0dXJuIGRlcGVuZGVuY2llc1xuICB9XG5cbiAgLy8gc29ydCBkZXBzIGxpa2UgdGhlIG5wbSBDTEkgZG9lcyAodmlhIHRoZSBwYWNrYWdlIEBucG1jbGkvcGFja2FnZS1qc29uKVxuICAvLyBodHRwczovL2dpdGh1Yi5jb20vbnBtL3BhY2thZ2UtanNvbi9ibG9iL2I2NDY1ZjQ0YzcyN2Q2NTEzZGI2ODk4YzdjYmU0MWRkMzU1Y2ViZTgvbGliL3VwZGF0ZS1kZXBlbmRlbmNpZXMuanMjTDgtTDIxXG4gIGlmIChzaG91bGRTb3J0RGVwZW5kZW5jaWVzTGlrZU5wbShwYWNrYWdlSnNvbikpIHtcbiAgICByZXR1cm4gc29ydE9iamVjdEtleXMoZGVwZW5kZW5jaWVzLCAoYSwgYikgPT4gYS5sb2NhbGVDb21wYXJlKGIsICdlbicpKVxuICB9XG5cbiAgcmV0dXJuIHNvcnRPYmplY3RLZXlzKGRlcGVuZGVuY2llcylcbn0pXG5cbi8qKlxuICogXCJ3b3Jrc3BhY2VzXCIgY2FuIGJlIGFuIGFycmF5IChucG0gb3IgeWFybiBjbGFzc2ljKSBvciBhbiBvYmplY3QgKHBucG0vYnVuKS5cbiAqIEluIHRoZSBjYXNlIG9mIGFuIGFycmF5LCB3ZSBkbyBub3Qgd2FudCB0byBhbHBoYWJldGljYWxseSBzb3J0IGl0IGluIGNhc2VcbiAqIHNjcmlwdHMgbmVlZCB0byBydW4gaW4gYSBzcGVjaWZpYyBvcmRlci5cbiAqXG4gKiBAc2VlIGh0dHBzOi8vZG9jcy5ucG1qcy5jb20vY2xpL3Y3L3VzaW5nLW5wbS93b3Jrc3BhY2VzP3Y9dHJ1ZSNydW5uaW5nLWNvbW1hbmRzLWluLXRoZS1jb250ZXh0LW9mLXdvcmtzcGFjZXNcbiAqL1xuY29uc3Qgc29ydFdvcmtzcGFjZXMgPSBwaXBlKFtcbiAgc29ydE9iamVjdEJ5KFsncGFja2FnZXMnLCAnY2F0YWxvZyddKSxcbiAgb3ZlclByb3BlcnR5KCdwYWNrYWdlcycsIHVuaXFBbmRTb3J0QXJyYXkpLFxuICBvdmVyUHJvcGVydHkoJ2NhdGFsb2cnLCBzb3J0RGVwZW5kZW5jaWVzKSxcbl0pXG5cbi8vIGh0dHBzOi8vZ2l0aHViLmNvbS9lc2xpbnQvZXNsaW50L2Jsb2IvYWNjMGU0NzU3MmE5MzkwMjkyYjRlMzEzYjRhNGJmMzYwZDIzNjM1OC9jb25mL2NvbmZpZy1zY2hlbWEuanNcbmNvbnN0IGVzbGludEJhc2VDb25maWdQcm9wZXJ0aWVzID0gW1xuICAvLyBgZmlsZXNgIGFuZCBgZXhjbHVkZWRGaWxlc2AgYXJlIG9ubHkgb24gYG92ZXJyaWRlc1tdYFxuICAvLyBmb3IgZWFzaWVyIHNvcnQgYG92ZXJyaWRlc1tdYCxcbiAgLy8gYWRkIHRoZW0gdG8gaGVyZSwgc28gd2UgZG9uJ3QgbmVlZCBzb3J0IGBvdmVycmlkZXNbXWAgdHdpY2VcbiAgJ2ZpbGVzJyxcbiAgJ2V4Y2x1ZGVkRmlsZXMnLFxuICAvLyBiYXNlQ29uZmlnXG4gICdlbnYnLFxuICAncGFyc2VyJyxcbiAgJ3BhcnNlck9wdGlvbnMnLFxuICAnc2V0dGluZ3MnLFxuICAncGx1Z2lucycsXG4gICdleHRlbmRzJyxcbiAgJ3J1bGVzJyxcbiAgJ292ZXJyaWRlcycsXG4gICdnbG9iYWxzJyxcbiAgJ3Byb2Nlc3NvcicsXG4gICdub0lubGluZUNvbmZpZycsXG4gICdyZXBvcnRVbnVzZWREaXNhYmxlRGlyZWN0aXZlcycsXG5dXG5jb25zdCBzb3J0RXNsaW50Q29uZmlnID0gcGlwZShbXG4gIHNvcnRPYmplY3RCeShlc2xpbnRCYXNlQ29uZmlnUHJvcGVydGllcyksXG4gIG92ZXJQcm9wZXJ0eSgnZW52Jywgc29ydE9iamVjdCksXG4gIG92ZXJQcm9wZXJ0eSgnZ2xvYmFscycsIHNvcnRPYmplY3QpLFxuICBvdmVyUHJvcGVydHkoXG4gICAgJ292ZXJyaWRlcycsXG4gICAgb25BcnJheSgob3ZlcnJpZGVzKSA9PiBvdmVycmlkZXMubWFwKHNvcnRFc2xpbnRDb25maWcpKSxcbiAgKSxcbiAgb3ZlclByb3BlcnR5KCdwYXJzZXJPcHRpb25zJywgc29ydE9iamVjdCksXG4gIG92ZXJQcm9wZXJ0eShcbiAgICAncnVsZXMnLFxuICAgIHNvcnRPYmplY3RCeShcbiAgICAgIChydWxlMSwgcnVsZTIpID0+XG4gICAgICAgIHJ1bGUxLnNwbGl0KCcvJykubGVuZ3RoIC0gcnVsZTIuc3BsaXQoJy8nKS5sZW5ndGggfHxcbiAgICAgICAgcnVsZTEubG9jYWxlQ29tcGFyZShydWxlMiksXG4gICAgKSxcbiAgKSxcbiAgb3ZlclByb3BlcnR5KCdzZXR0aW5ncycsIHNvcnRPYmplY3QpLFxuXSlcbmNvbnN0IHNvcnRWU0NvZGVCYWRnZU9iamVjdCA9IHNvcnRPYmplY3RCeShbJ2Rlc2NyaXB0aW9uJywgJ3VybCcsICdocmVmJ10pXG5cbmNvbnN0IHNvcnRQcmV0dGllckNvbmZpZyA9IHBpcGUoW1xuICAvLyBzb3J0IGtleXMgYWxwaGFiZXRpY2FsbHksIGJ1dCBwdXQgYG92ZXJyaWRlc2AgYXQgYm90dG9tXG4gIG9uT2JqZWN0KChjb25maWcpID0+XG4gICAgc29ydE9iamVjdEtleXMoY29uZmlnLCBbXG4gICAgICAuLi5PYmplY3Qua2V5cyhjb25maWcpXG4gICAgICAgIC5maWx0ZXIoKGtleSkgPT4ga2V5ICE9PSAnb3ZlcnJpZGVzJylcbiAgICAgICAgLnNvcnQoKSxcbiAgICAgICdvdmVycmlkZXMnLFxuICAgIF0pLFxuICApLFxuICAvLyBpZiBgY29uZmlnLm92ZXJyaWRlc2AgZXhpc3RzXG4gIG92ZXJQcm9wZXJ0eShcbiAgICAnb3ZlcnJpZGVzJyxcbiAgICAvLyBhbmQgYGNvbmZpZy5vdmVycmlkZXNgIGlzIGFuIGFycmF5XG4gICAgb25BcnJheSgob3ZlcnJpZGVzKSA9PlxuICAgICAgb3ZlcnJpZGVzLm1hcChcbiAgICAgICAgcGlwZShbXG4gICAgICAgICAgLy8gc29ydCBgY29uZmlnLm92ZXJyaWRlc1tdYCBhbHBoYWJldGljYWxseVxuICAgICAgICAgIHNvcnRPYmplY3QsXG4gICAgICAgICAgLy8gc29ydCBgY29uZmlnLm92ZXJyaWRlc1tdLm9wdGlvbnNgIGFscGhhYmV0aWNhbGx5XG4gICAgICAgICAgb3ZlclByb3BlcnR5KCdvcHRpb25zJywgc29ydE9iamVjdCksXG4gICAgICAgIF0pLFxuICAgICAgKSxcbiAgICApLFxuICApLFxuXSlcblxuY29uc3Qgc29ydFZvbHRhID0gc29ydE9iamVjdEJ5KFsnbm9kZScsICducG0nLCAneWFybiddKVxuXG4vLyBodHRwczovL2dpdGh1Yi5jb20vZ29vZ2xlL3dpcmVpdFxuY29uc3Qgd2lyZWl0U2NyaXB0UHJvcGVydGllcyA9IFsnY29tbWFuZCcsICdkZXBlbmRlbmNpZXMnLCAnZmlsZXMnLCAnb3V0cHV0J11cbmNvbnN0IHNvcnRXaXJlaXRTY3JpcHQgPSBwaXBlKFtcbiAgc29ydE9iamVjdEJ5KHdpcmVpdFNjcmlwdFByb3BlcnRpZXMpLFxuICBvdmVyUHJvcGVydHkoXG4gICAgJ2RlcGVuZGVuY2llcycsXG4gICAgb25BcnJheSgoZGVwcykgPT4gZGVwcy5tYXAoc29ydE9iamVjdEJ5KFsnc2NyaXB0JywgJ2Nhc2NhZGUnXSkpKSxcbiAgKSxcbiAgb3ZlclByb3BlcnR5KFxuICAgICdlbnYnLFxuICAgIG9uT2JqZWN0KChlbnYpID0+XG4gICAgICBzb3J0T2JqZWN0S2V5cyhcbiAgICAgICAgT2JqZWN0LmZyb21FbnRyaWVzKFxuICAgICAgICAgIE9iamVjdC5lbnRyaWVzKGVudikubWFwKChba2V5LCB2YWx1ZV0pID0+IFtcbiAgICAgICAgICAgIGtleSxcbiAgICAgICAgICAgIHNvcnRPYmplY3RCeShbJ2V4dGVybmFsJywgJ2RlZmF1bHQnXSkodmFsdWUpLFxuICAgICAgICAgIF0pLFxuICAgICAgICApLFxuICAgICAgKSxcbiAgICApLFxuICApLFxuICBvdmVyUHJvcGVydHkoXG4gICAgJ3NlcnZpY2UnLFxuICAgIHBpcGUoW3NvcnRPYmplY3RCeShbJ3JlYWR5V2hlbiddKSwgb3ZlclByb3BlcnR5KCdyZWFkeVdoZW4nLCBzb3J0T2JqZWN0KV0pLFxuICApLFxuXSlcbmNvbnN0IHNvcnRXaXJlaXQgPSBvbk9iamVjdCgod2lyZWl0KSA9PlxuICBzb3J0T2JqZWN0S2V5cyhcbiAgICBPYmplY3QuZnJvbUVudHJpZXMoXG4gICAgICBPYmplY3QuZW50cmllcyh3aXJlaXQpLm1hcCgoW25hbWUsIGNvbmZpZ10pID0+IFtcbiAgICAgICAgbmFtZSxcbiAgICAgICAgc29ydFdpcmVpdFNjcmlwdChjb25maWcpLFxuICAgICAgXSksXG4gICAgKSxcbiAgKSxcbilcbmNvbnN0IHNvcnREZXZFbmdpbmVzID0gb3ZlclByb3BlcnR5KFxuICAncGFja2FnZU1hbmFnZXInLFxuICBzb3J0T2JqZWN0QnkoWyduYW1lJywgJ3ZlcnNpb24nLCAnb25GYWlsJ10pLFxuKVxuXG5jb25zdCBwbnBtQmFzZUNvbmZpZ1Byb3BlcnRpZXMgPSBbXG4gICdwZWVyRGVwZW5kZW5jeVJ1bGVzJyxcbiAgJ25ldmVyQnVpbHREZXBlbmRlbmNpZXMnLFxuICAnb25seUJ1aWx0RGVwZW5kZW5jaWVzJyxcbiAgJ29ubHlCdWlsdERlcGVuZGVuY2llc0ZpbGUnLFxuICAnYWxsb3dlZERlcHJlY2F0ZWRWZXJzaW9ucycsXG4gICdhbGxvd05vbkFwcGxpZWRQYXRjaGVzJyxcbiAgJ3VwZGF0ZUNvbmZpZycsXG4gICdhdWRpdENvbmZpZycsXG4gICdyZXF1aXJlZFNjcmlwdHMnLFxuICAnc3VwcG9ydGVkQXJjaGl0ZWN0dXJlcycsXG4gICdvdmVycmlkZXMnLFxuICAncGF0Y2hlZERlcGVuZGVuY2llcycsXG4gICdwYWNrYWdlRXh0ZW5zaW9ucycsXG5dXG5cbmNvbnN0IHNvcnRQbnBtQ29uZmlnID0gcGlwZShbXG4gIHNvcnRPYmplY3RCeShwbnBtQmFzZUNvbmZpZ1Byb3BlcnRpZXMsIHRydWUpLFxuICBvdmVyUHJvcGVydHkoJ292ZXJyaWRlcycsIHNvcnRPYmplY3RCeVNlbXZlciksXG5dKVxuXG4vLyBTZWUgaHR0cHM6Ly9kb2NzLm5wbWpzLmNvbS9taXNjL3NjcmlwdHNcbmNvbnN0IGRlZmF1bHROcG1TY3JpcHRzID0gbmV3IFNldChbXG4gICdpbnN0YWxsJyxcbiAgJ3BhY2snLFxuICAncHJlcGFyZScsXG4gICdwdWJsaXNoJyxcbiAgJ3Jlc3RhcnQnLFxuICAnc2hyaW5rd3JhcCcsXG4gICdzdGFydCcsXG4gICdzdG9wJyxcbiAgJ3Rlc3QnLFxuICAndW5pbnN0YWxsJyxcbiAgJ3ZlcnNpb24nLFxuXSlcblxuY29uc3QgaGFzRGV2RGVwZW5kZW5jeSA9IChkZXBlbmRlbmN5LCBwYWNrYWdlSnNvbikgPT4ge1xuICByZXR1cm4gKFxuICAgIE9iamVjdC5oYXNPd24ocGFja2FnZUpzb24sICdkZXZEZXBlbmRlbmNpZXMnKSAmJlxuICAgIE9iamVjdC5oYXNPd24ocGFja2FnZUpzb24uZGV2RGVwZW5kZW5jaWVzLCBkZXBlbmRlbmN5KVxuICApXG59XG5cbmNvbnN0IHJ1blNSZWdFeHAgPVxuICAvKD88PV58W1xccyY7PD58KF0pKD86cnVuLXN8bnBtLXJ1bi1hbGwyPyAuKig/Oi0tc2VxdWVudGlhbHwtLXNlcmlhbHwtcykpKD89JHxbXFxzJjs8PnwpXSkvXG5cbmNvbnN0IGlzU2VxdWVudGlhbFNjcmlwdCA9IChjb21tYW5kKSA9PlxuICBjb21tYW5kLmluY2x1ZGVzKCcqJykgJiYgcnVuU1JlZ0V4cC50ZXN0KGNvbW1hbmQpXG5cbmNvbnN0IGhhc1NlcXVlbnRpYWxTY3JpcHQgPSAocGFja2FnZUpzb24pID0+IHtcbiAgaWYgKFxuICAgICFoYXNEZXZEZXBlbmRlbmN5KCducG0tcnVuLWFsbCcsIHBhY2thZ2VKc29uKSAmJlxuICAgICFoYXNEZXZEZXBlbmRlbmN5KCducG0tcnVuLWFsbDInLCBwYWNrYWdlSnNvbilcbiAgKSB7XG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cbiAgY29uc3Qgc2NyaXB0cyA9IFsnc2NyaXB0cycsICdiZXR0ZXJTY3JpcHRzJ10uZmxhdE1hcCgoZmllbGQpID0+XG4gICAgcGFja2FnZUpzb25bZmllbGRdID8gT2JqZWN0LnZhbHVlcyhwYWNrYWdlSnNvbltmaWVsZF0pIDogW10sXG4gIClcbiAgcmV0dXJuIHNjcmlwdHMuc29tZSgoc2NyaXB0KSA9PiBpc1NlcXVlbnRpYWxTY3JpcHQoc2NyaXB0KSlcbn1cblxuZnVuY3Rpb24gc29ydFNjcmlwdE5hbWVzKGtleXMsIHByZWZpeCA9ICcnKSB7XG4gIGNvbnN0IGdyb3VwTWFwID0gbmV3IE1hcCgpXG4gIGZvciAoY29uc3Qga2V5IG9mIGtleXMpIHtcbiAgICBjb25zdCByZXN0ID0gcHJlZml4ID8ga2V5LnNsaWNlKHByZWZpeC5sZW5ndGggKyAxKSA6IGtleVxuICAgIGNvbnN0IGlkeCA9IHJlc3QuaW5kZXhPZignOicpXG4gICAgaWYgKGlkeCA+IDApIHtcbiAgICAgIGNvbnN0IGJhc2UgPSBrZXkuc2xpY2UoMCwgKHByZWZpeCA/IHByZWZpeC5sZW5ndGggKyAxIDogMCkgKyBpZHgpXG4gICAgICBpZiAoIWdyb3VwTWFwLmhhcyhiYXNlKSkgZ3JvdXBNYXAuc2V0KGJhc2UsIFtdKVxuICAgICAgZ3JvdXBNYXAuZ2V0KGJhc2UpLnB1c2goa2V5KVxuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoIWdyb3VwTWFwLmhhcyhrZXkpKSBncm91cE1hcC5zZXQoa2V5LCBbXSlcbiAgICAgIGdyb3VwTWFwLmdldChrZXkpLnB1c2goa2V5KVxuICAgIH1cbiAgfVxuICByZXR1cm4gQXJyYXkuZnJvbShncm91cE1hcC5rZXlzKCkpXG4gICAgLnNvcnQoKVxuICAgIC5mbGF0TWFwKChncm91cEtleSkgPT4ge1xuICAgICAgY29uc3QgY2hpbGRyZW4gPSBncm91cE1hcC5nZXQoZ3JvdXBLZXkpXG4gICAgICBpZiAoXG4gICAgICAgIGNoaWxkcmVuLmxlbmd0aCA+IDEgJiZcbiAgICAgICAgY2hpbGRyZW4uc29tZSgoaykgPT4gayAhPT0gZ3JvdXBLZXkgJiYgay5zdGFydHNXaXRoKGdyb3VwS2V5ICsgJzonKSlcbiAgICAgICkge1xuICAgICAgICBjb25zdCBkaXJlY3QgPSBjaGlsZHJlblxuICAgICAgICAgIC5maWx0ZXIoKGspID0+IGsgPT09IGdyb3VwS2V5IHx8ICFrLnN0YXJ0c1dpdGgoZ3JvdXBLZXkgKyAnOicpKVxuICAgICAgICAgIC5zb3J0KClcbiAgICAgICAgY29uc3QgbmVzdGVkID0gY2hpbGRyZW4uZmlsdGVyKChrKSA9PiBrLnN0YXJ0c1dpdGgoZ3JvdXBLZXkgKyAnOicpKVxuICAgICAgICByZXR1cm4gWy4uLmRpcmVjdCwgLi4uc29ydFNjcmlwdE5hbWVzKG5lc3RlZCwgZ3JvdXBLZXkpXVxuICAgICAgfVxuICAgICAgcmV0dXJuIGNoaWxkcmVuLnNvcnQoKVxuICAgIH0pXG59XG5cbmNvbnN0IHNvcnRTY3JpcHRzID0gb25PYmplY3QoKHNjcmlwdHMsIHBhY2thZ2VKc29uKSA9PiB7XG4gIGxldCBuYW1lcyA9IE9iamVjdC5rZXlzKHNjcmlwdHMpXG4gIGNvbnN0IHByZWZpeGFibGUgPSBuZXcgU2V0KClcblxuICBuYW1lcyA9IG5hbWVzLm1hcCgobmFtZSkgPT4ge1xuICAgIGNvbnN0IG9taXR0ZWQgPSBuYW1lLnJlcGxhY2UoL14oPzpwcmV8cG9zdCkvLCAnJylcbiAgICBpZiAoZGVmYXVsdE5wbVNjcmlwdHMuaGFzKG9taXR0ZWQpIHx8IG5hbWVzLmluY2x1ZGVzKG9taXR0ZWQpKSB7XG4gICAgICBwcmVmaXhhYmxlLmFkZChvbWl0dGVkKVxuICAgICAgcmV0dXJuIG9taXR0ZWRcbiAgICB9XG4gICAgcmV0dXJuIG5hbWVcbiAgfSlcblxuICBpZiAoIWhhc1NlcXVlbnRpYWxTY3JpcHQocGFja2FnZUpzb24pKSB7XG4gICAgbmFtZXMgPSBzb3J0U2NyaXB0TmFtZXMobmFtZXMpXG4gIH1cbiAgbmFtZXMgPSBuYW1lcy5mbGF0TWFwKChrZXkpID0+XG4gICAgcHJlZml4YWJsZS5oYXMoa2V5KSA/IFtgcHJlJHtrZXl9YCwga2V5LCBgcG9zdCR7a2V5fWBdIDogW2tleV0sXG4gIClcbiAgcmV0dXJuIHNvcnRPYmplY3RLZXlzKHNjcmlwdHMsIG5hbWVzKVxufSlcblxuLypcbi0gTW92ZSBgZGVmYXVsdGAgY29uZGl0aW9uIHRvIGJvdHRvbVxuKi9cbmNvbnN0IHNvcnRDb25kaXRpb25zID0gKGNvbmRpdGlvbnMpID0+IHtcbiAgY29uc3QgeyBkZWZhdWx0Q29uZGl0aW9ucyA9IFtdLCByZXN0Q29uZGl0aW9ucyA9IFtdIH0gPSBPYmplY3QuZ3JvdXBCeShcbiAgICBjb25kaXRpb25zLFxuICAgIChjb25kaXRpb24pID0+IHtcbiAgICAgIGlmIChjb25kaXRpb24gPT09ICdkZWZhdWx0Jykge1xuICAgICAgICByZXR1cm4gJ2RlZmF1bHRDb25kaXRpb25zJ1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gJ3Jlc3RDb25kaXRpb25zJ1xuICAgIH0sXG4gIClcblxuICByZXR1cm4gWy4uLnJlc3RDb25kaXRpb25zLCAuLi5kZWZhdWx0Q29uZGl0aW9uc11cbn1cblxuY29uc3Qgc29ydEV4cG9ydHMgPSBvbk9iamVjdCgoZXhwb3J0cykgPT4ge1xuICBjb25zdCB7IHBhdGhzID0gW10sIGNvbmRpdGlvbnMgPSBbXSB9ID0gT2JqZWN0Lmdyb3VwQnkoXG4gICAgT2JqZWN0LmtleXMoZXhwb3J0cyksXG4gICAgKGtleSkgPT4gKGtleS5zdGFydHNXaXRoKCcuJykgPyAncGF0aHMnIDogJ2NvbmRpdGlvbnMnKSxcbiAgKVxuXG4gIHJldHVybiBPYmplY3QuZnJvbUVudHJpZXMoXG4gICAgWy4uLnBhdGhzLCAuLi5zb3J0Q29uZGl0aW9ucyhjb25kaXRpb25zKV0ubWFwKChrZXkpID0+IFtcbiAgICAgIGtleSxcbiAgICAgIHNvcnRFeHBvcnRzKGV4cG9ydHNba2V5XSksXG4gICAgXSksXG4gIClcbn0pXG5cbi8vIGZpZWxkcyBtYXJrZWQgYHZzY29kZWAgYXJlIGZvciBgVmlzdWFsIFN0dWRpbyBDb2RlIGV4dGVuc2lvbiBtYW5pZmVzdGAgb25seVxuLy8gaHR0cHM6Ly9jb2RlLnZpc3VhbHN0dWRpby5jb20vYXBpL3JlZmVyZW5jZXMvZXh0ZW5zaW9uLW1hbmlmZXN0XG4vLyBTdXBwb3J0ZWQgZmllbGRzOlxuLy8gcHVibGlzaGVyLCBkaXNwbGF5TmFtZSwgY2F0ZWdvcmllcywgZ2FsbGVyeUJhbm5lciwgcHJldmlldywgY29udHJpYnV0ZXMsXG4vLyBhY3RpdmF0aW9uRXZlbnRzLCBiYWRnZXMsIG1hcmtkb3duLCBxbmEsIGV4dGVuc2lvblBhY2ssXG4vLyBleHRlbnNpb25EZXBlbmRlbmNpZXMsIGljb25cblxuLy8gZmllbGQua2V5e3N0cmluZ306IGZpZWxkIG5hbWVcbi8vIGZpZWxkLm92ZXJ7ZnVuY3Rpb259OiBzb3J0IGZpZWxkIHN1YktleVxuY29uc3QgZmllbGRzID0gW1xuICB7IGtleTogJyRzY2hlbWEnIH0sXG4gIHsga2V5OiAnbmFtZScgfSxcbiAgLyogdnNjb2RlICovIHsga2V5OiAnZGlzcGxheU5hbWUnIH0sXG4gIHsga2V5OiAndmVyc2lvbicgfSxcbiAgLyogeWFybiAqLyB7IGtleTogJ3N0YWJsZVZlcnNpb24nIH0sXG4gIHsga2V5OiAncHJpdmF0ZScgfSxcbiAgeyBrZXk6ICdkZXNjcmlwdGlvbicgfSxcbiAgLyogdnNjb2RlICovIHsga2V5OiAnY2F0ZWdvcmllcycsIG92ZXI6IHVuaXEgfSxcbiAgeyBrZXk6ICdrZXl3b3JkcycsIG92ZXI6IHVuaXEgfSxcbiAgeyBrZXk6ICdob21lcGFnZScgfSxcbiAgeyBrZXk6ICdidWdzJywgb3Zlcjogc29ydE9iamVjdEJ5KFsndXJsJywgJ2VtYWlsJ10pIH0sXG4gIHsga2V5OiAncmVwb3NpdG9yeScsIG92ZXI6IHNvcnRVUkxPYmplY3QgfSxcbiAgeyBrZXk6ICdmdW5kaW5nJywgb3Zlcjogc29ydFVSTE9iamVjdCB9LFxuICB7IGtleTogJ2xpY2Vuc2UnLCBvdmVyOiBzb3J0VVJMT2JqZWN0IH0sXG4gIC8qIHZzY29kZSAqLyB7IGtleTogJ3FuYScgfSxcbiAgeyBrZXk6ICdhdXRob3InLCBvdmVyOiBzb3J0UGVvcGxlT2JqZWN0IH0sXG4gIHtcbiAgICBrZXk6ICdtYWludGFpbmVycycsXG4gICAgb3Zlcjogb25BcnJheSgobWFpbnRhaW5lcnMpID0+IG1haW50YWluZXJzLm1hcChzb3J0UGVvcGxlT2JqZWN0KSksXG4gIH0sXG4gIHtcbiAgICBrZXk6ICdjb250cmlidXRvcnMnLFxuICAgIG92ZXI6IG9uQXJyYXkoKGNvbnRyaWJ1dG9ycykgPT4gY29udHJpYnV0b3JzLm1hcChzb3J0UGVvcGxlT2JqZWN0KSksXG4gIH0sXG4gIC8qIHZzY29kZSAqLyB7IGtleTogJ3B1Ymxpc2hlcicgfSxcbiAgeyBrZXk6ICdzaWRlRWZmZWN0cycgfSxcbiAgeyBrZXk6ICd0eXBlJyB9LFxuICB7IGtleTogJ2ltcG9ydHMnIH0sXG4gIHsga2V5OiAnZXhwb3J0cycsIG92ZXI6IHNvcnRFeHBvcnRzIH0sXG4gIHsga2V5OiAnbWFpbicgfSxcbiAgeyBrZXk6ICdzdmVsdGUnIH0sXG4gIHsga2V5OiAndW1kOm1haW4nIH0sXG4gIHsga2V5OiAnanNkZWxpdnInIH0sXG4gIHsga2V5OiAndW5wa2cnIH0sXG4gIHsga2V5OiAnbW9kdWxlJyB9LFxuICB7IGtleTogJ3NvdXJjZScgfSxcbiAgeyBrZXk6ICdqc25leHQ6bWFpbicgfSxcbiAgeyBrZXk6ICdicm93c2VyJyB9LFxuICB7IGtleTogJ3JlYWN0LW5hdGl2ZScgfSxcbiAgeyBrZXk6ICd0eXBlcycgfSxcbiAgeyBrZXk6ICd0eXBlc1ZlcnNpb25zJyB9LFxuICB7IGtleTogJ3R5cGluZ3MnIH0sXG4gIHsga2V5OiAnc3R5bGUnIH0sXG4gIHsga2V5OiAnZXhhbXBsZScgfSxcbiAgeyBrZXk6ICdleGFtcGxlc3R5bGUnIH0sXG4gIHsga2V5OiAnYXNzZXRzJyB9LFxuICB7IGtleTogJ2JpbicsIG92ZXI6IHNvcnRPYmplY3QgfSxcbiAgeyBrZXk6ICdtYW4nIH0sXG4gIHsga2V5OiAnZGlyZWN0b3JpZXMnLCBvdmVyOiBzb3J0RGlyZWN0b3JpZXMgfSxcbiAgeyBrZXk6ICdmaWxlcycsIG92ZXI6IHVuaXEgfSxcbiAgeyBrZXk6ICd3b3Jrc3BhY2VzJywgb3Zlcjogc29ydFdvcmtzcGFjZXMgfSxcbiAgLy8gbm9kZS1wcmUtZ3lwIGh0dHBzOi8vd3d3Lm5wbWpzLmNvbS9wYWNrYWdlL25vZGUtcHJlLWd5cCMxLWFkZC1uZXctZW50cmllcy10by15b3VyLXBhY2thZ2Vqc29uXG4gIHtcbiAgICBrZXk6ICdiaW5hcnknLFxuICAgIG92ZXI6IHNvcnRPYmplY3RCeShbXG4gICAgICAnbW9kdWxlX25hbWUnLFxuICAgICAgJ21vZHVsZV9wYXRoJyxcbiAgICAgICdyZW1vdGVfcGF0aCcsXG4gICAgICAncGFja2FnZV9uYW1lJyxcbiAgICAgICdob3N0JyxcbiAgICBdKSxcbiAgfSxcbiAgeyBrZXk6ICdzY3JpcHRzJywgb3Zlcjogc29ydFNjcmlwdHMgfSxcbiAgeyBrZXk6ICdiZXR0ZXJTY3JpcHRzJywgb3Zlcjogc29ydFNjcmlwdHMgfSxcbiAgeyBrZXk6ICd3aXJlaXQnLCBvdmVyOiBzb3J0V2lyZWl0IH0sXG4gIC8qIHZzY29kZSAqLyB7IGtleTogJ2wxMG4nIH0sXG4gIC8qIHZzY29kZSAqLyB7IGtleTogJ2NvbnRyaWJ1dGVzJywgb3Zlcjogc29ydE9iamVjdCB9LFxuICAvKiB2c2NvZGUgKi8geyBrZXk6ICdhY3RpdmF0aW9uRXZlbnRzJywgb3ZlcjogdW5pcSB9LFxuICB7IGtleTogJ2h1c2t5Jywgb3Zlcjogb3ZlclByb3BlcnR5KCdob29rcycsIHNvcnRHaXRIb29rcykgfSxcbiAgeyBrZXk6ICdzaW1wbGUtZ2l0LWhvb2tzJywgb3Zlcjogc29ydEdpdEhvb2tzIH0sXG4gIHsga2V5OiAncHJlLWNvbW1pdCcgfSxcbiAgeyBrZXk6ICdjb21taXRsaW50Jywgb3Zlcjogc29ydE9iamVjdCB9LFxuICB7IGtleTogJ2xpbnQtc3RhZ2VkJyB9LFxuICB7IGtleTogJ25hbm8tc3RhZ2VkJyB9LFxuICB7IGtleTogJ2NvbmZpZycsIG92ZXI6IHNvcnRPYmplY3QgfSxcbiAgeyBrZXk6ICdub2RlbW9uQ29uZmlnJywgb3Zlcjogc29ydE9iamVjdCB9LFxuICB7IGtleTogJ2Jyb3dzZXJpZnknLCBvdmVyOiBzb3J0T2JqZWN0IH0sXG4gIHsga2V5OiAnYmFiZWwnLCBvdmVyOiBzb3J0T2JqZWN0IH0sXG4gIHsga2V5OiAnYnJvd3NlcnNsaXN0JyB9LFxuICB7IGtleTogJ3hvJywgb3Zlcjogc29ydE9iamVjdCB9LFxuICB7IGtleTogJ3ByZXR0aWVyJywgb3Zlcjogc29ydFByZXR0aWVyQ29uZmlnIH0sXG4gIHsga2V5OiAnZXNsaW50Q29uZmlnJywgb3Zlcjogc29ydEVzbGludENvbmZpZyB9LFxuICB7IGtleTogJ2VzbGludElnbm9yZScgfSxcbiAgeyBrZXk6ICducG1wa2dqc29ubGludCcsIG92ZXI6IHNvcnRPYmplY3QgfSxcbiAgeyBrZXk6ICducG1QYWNrYWdlSnNvbkxpbnRDb25maWcnLCBvdmVyOiBzb3J0T2JqZWN0IH0sXG4gIHsga2V5OiAnbnBtcGFja2FnZWpzb25saW50Jywgb3Zlcjogc29ydE9iamVjdCB9LFxuICB7IGtleTogJ3JlbGVhc2UnLCBvdmVyOiBzb3J0T2JqZWN0IH0sXG4gIHsga2V5OiAncmVtYXJrQ29uZmlnJywgb3Zlcjogc29ydE9iamVjdCB9LFxuICB7IGtleTogJ3N0eWxlbGludCcgfSxcbiAgeyBrZXk6ICdhdmEnLCBvdmVyOiBzb3J0T2JqZWN0IH0sXG4gIHsga2V5OiAnamVzdCcsIG92ZXI6IHNvcnRPYmplY3QgfSxcbiAgeyBrZXk6ICdqZXN0LWp1bml0Jywgb3Zlcjogc29ydE9iamVjdCB9LFxuICB7IGtleTogJ2plc3Qtc3RhcmUnLCBvdmVyOiBzb3J0T2JqZWN0IH0sXG4gIHsga2V5OiAnbW9jaGEnLCBvdmVyOiBzb3J0T2JqZWN0IH0sXG4gIHsga2V5OiAnbnljJywgb3Zlcjogc29ydE9iamVjdCB9LFxuICB7IGtleTogJ2M4Jywgb3Zlcjogc29ydE9iamVjdCB9LFxuICB7IGtleTogJ3RhcCcsIG92ZXI6IHNvcnRPYmplY3QgfSxcbiAgeyBrZXk6ICdvY2xpZicsIG92ZXI6IHNvcnRPYmplY3RCeSh1bmRlZmluZWQsIHRydWUpIH0sXG4gIHsga2V5OiAncmVzb2x1dGlvbnMnLCBvdmVyOiBzb3J0T2JqZWN0IH0sXG4gIHsga2V5OiAnb3ZlcnJpZGVzJywgb3Zlcjogc29ydERlcGVuZGVuY2llcyB9LFxuICB7IGtleTogJ2RlcGVuZGVuY2llcycsIG92ZXI6IHNvcnREZXBlbmRlbmNpZXMgfSxcbiAgeyBrZXk6ICdkZXZEZXBlbmRlbmNpZXMnLCBvdmVyOiBzb3J0RGVwZW5kZW5jaWVzIH0sXG4gIHsga2V5OiAnZGVwZW5kZW5jaWVzTWV0YScsIG92ZXI6IHNvcnRPYmplY3RCeShzb3J0T2JqZWN0QnlJZGVudCwgdHJ1ZSkgfSxcbiAgeyBrZXk6ICdwZWVyRGVwZW5kZW5jaWVzJywgb3Zlcjogc29ydERlcGVuZGVuY2llcyB9LFxuICAvLyBUT0RPOiBvbmx5IHNvcnQgZGVwdGggPSAyXG4gIHsga2V5OiAncGVlckRlcGVuZGVuY2llc01ldGEnLCBvdmVyOiBzb3J0T2JqZWN0QnkodW5kZWZpbmVkLCB0cnVlKSB9LFxuICB7IGtleTogJ29wdGlvbmFsRGVwZW5kZW5jaWVzJywgb3Zlcjogc29ydERlcGVuZGVuY2llcyB9LFxuICB7IGtleTogJ2J1bmRsZWREZXBlbmRlbmNpZXMnLCBvdmVyOiB1bmlxQW5kU29ydEFycmF5IH0sXG4gIHsga2V5OiAnYnVuZGxlRGVwZW5kZW5jaWVzJywgb3ZlcjogdW5pcUFuZFNvcnRBcnJheSB9LFxuICAvKiB2c2NvZGUgKi8geyBrZXk6ICdleHRlbnNpb25QYWNrJywgb3ZlcjogdW5pcUFuZFNvcnRBcnJheSB9LFxuICAvKiB2c2NvZGUgKi8geyBrZXk6ICdleHRlbnNpb25EZXBlbmRlbmNpZXMnLCBvdmVyOiB1bmlxQW5kU29ydEFycmF5IH0sXG4gIHsga2V5OiAnZmxhdCcgfSxcbiAgeyBrZXk6ICdwYWNrYWdlTWFuYWdlcicgfSxcbiAgeyBrZXk6ICdlbmdpbmVzJywgb3Zlcjogc29ydE9iamVjdCB9LFxuICB7IGtleTogJ2VuZ2luZVN0cmljdCcsIG92ZXI6IHNvcnRPYmplY3QgfSxcbiAgeyBrZXk6ICdkZXZFbmdpbmVzJywgb3Zlcjogc29ydERldkVuZ2luZXMgfSxcbiAgeyBrZXk6ICd2b2x0YScsIG92ZXI6IHNvcnRWb2x0YSB9LFxuICB7IGtleTogJ2xhbmd1YWdlTmFtZScgfSxcbiAgeyBrZXk6ICdvcycgfSxcbiAgeyBrZXk6ICdjcHUnIH0sXG4gIHsga2V5OiAncHJlZmVyR2xvYmFsJywgb3Zlcjogc29ydE9iamVjdCB9LFxuICB7IGtleTogJ3B1Ymxpc2hDb25maWcnLCBvdmVyOiBzb3J0T2JqZWN0IH0sXG4gIC8qIHZzY29kZSAqLyB7IGtleTogJ2ljb24nIH0sXG4gIC8qIHZzY29kZSAqLyB7XG4gICAga2V5OiAnYmFkZ2VzJyxcbiAgICBvdmVyOiBvbkFycmF5KChiYWRnZSkgPT4gYmFkZ2UubWFwKHNvcnRWU0NvZGVCYWRnZU9iamVjdCkpLFxuICB9LFxuICAvKiB2c2NvZGUgKi8geyBrZXk6ICdnYWxsZXJ5QmFubmVyJywgb3Zlcjogc29ydE9iamVjdCB9LFxuICAvKiB2c2NvZGUgKi8geyBrZXk6ICdwcmV2aWV3JyB9LFxuICAvKiB2c2NvZGUgKi8geyBrZXk6ICdtYXJrZG93bicgfSxcbiAgeyBrZXk6ICdwbnBtJywgb3Zlcjogc29ydFBucG1Db25maWcgfSxcbl1cblxuY29uc3QgZGVmYXVsdFNvcnRPcmRlciA9IGZpZWxkcy5tYXAoKHsga2V5IH0pID0+IGtleSlcbmNvbnN0IG92ZXJGaWVsZHMgPSBwaXBlKFxuICBmaWVsZHNcbiAgICAubWFwKCh7IGtleSwgb3ZlciB9KSA9PiAob3ZlciA/IG92ZXJQcm9wZXJ0eShrZXksIG92ZXIpIDogdW5kZWZpbmVkKSlcbiAgICAuZmlsdGVyKEJvb2xlYW4pLFxuKVxuXG5mdW5jdGlvbiBlZGl0U3RyaW5nSlNPTihqc29uLCBvdmVyKSB7XG4gIGlmICh0eXBlb2YganNvbiA9PT0gJ3N0cmluZycpIHtcbiAgICBjb25zdCB7IGluZGVudCwgdHlwZSB9ID0gZGV0ZWN0SW5kZW50KGpzb24pXG4gICAgY29uc3QgZW5kQ2hhcmFjdGVycyA9IGpzb24uc2xpY2UoLTEpID09PSAnXFxuJyA/ICdcXG4nIDogJydcbiAgICBjb25zdCBuZXdsaW5lID0gZGV0ZWN0TmV3bGluZShqc29uKVxuICAgIGpzb24gPSBKU09OLnBhcnNlKGpzb24pXG5cbiAgICBsZXQgcmVzdWx0ID1cbiAgICAgIEpTT04uc3RyaW5naWZ5KG92ZXIoanNvbiksIG51bGwsIHR5cGUgPT09ICd0YWInID8gJ1xcdCcgOiBpbmRlbnQpICtcbiAgICAgIGVuZENoYXJhY3RlcnNcbiAgICBpZiAobmV3bGluZSA9PT0gJ1xcclxcbicpIHtcbiAgICAgIHJlc3VsdCA9IHJlc3VsdC5yZXBsYWNlKC9cXG4vZywgbmV3bGluZSlcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdFxuICB9XG5cbiAgcmV0dXJuIG92ZXIoanNvbilcbn1cblxuZnVuY3Rpb24gc29ydFBhY2thZ2VKc29uKGpzb25Jc2gsIG9wdGlvbnMgPSB7fSkge1xuICByZXR1cm4gZWRpdFN0cmluZ0pTT04oXG4gICAganNvbklzaCxcbiAgICBvbk9iamVjdCgoanNvbikgPT4ge1xuICAgICAgbGV0IHNvcnRPcmRlciA9IG9wdGlvbnMuc29ydE9yZGVyIHx8IGRlZmF1bHRTb3J0T3JkZXJcblxuICAgICAgaWYgKEFycmF5LmlzQXJyYXkoc29ydE9yZGVyKSkge1xuICAgICAgICBjb25zdCBrZXlzID0gT2JqZWN0LmtleXMoanNvbilcbiAgICAgICAgY29uc3QgeyBwcml2YXRlS2V5cyA9IFtdLCBwdWJsaWNLZXlzID0gW10gfSA9IE9iamVjdC5ncm91cEJ5KFxuICAgICAgICAgIGtleXMsXG4gICAgICAgICAgKGtleSkgPT4gKGtleVswXSA9PT0gJ18nID8gJ3ByaXZhdGVLZXlzJyA6ICdwdWJsaWNLZXlzJyksXG4gICAgICAgIClcbiAgICAgICAgc29ydE9yZGVyID0gW1xuICAgICAgICAgIC4uLnNvcnRPcmRlcixcbiAgICAgICAgICAuLi5kZWZhdWx0U29ydE9yZGVyLFxuICAgICAgICAgIC4uLnB1YmxpY0tleXMuc29ydCgpLFxuICAgICAgICAgIC4uLnByaXZhdGVLZXlzLnNvcnQoKSxcbiAgICAgICAgXVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gb3ZlckZpZWxkcyhzb3J0T2JqZWN0S2V5cyhqc29uLCBzb3J0T3JkZXIpLCBqc29uKVxuICAgIH0pLFxuICApXG59XG5cbmV4cG9ydCBkZWZhdWx0IHNvcnRQYWNrYWdlSnNvblxuZXhwb3J0IHsgc29ydFBhY2thZ2VKc29uLCBkZWZhdWx0U29ydE9yZGVyIGFzIHNvcnRPcmRlciB9XG4iLCJpbXBvcnQgeyBzcGF3blN5bmNBbmRSZXR1cm5TdGRvdXQgfSBmcm9tICcuLi91dGlscy9zcGF3blV0aWwuanMnO1xuXG5leHBvcnQgZnVuY3Rpb24gZ2V0TGF0ZXN0Q29tbWl0SGFzaChvcmdhbml6YXRpb246IHN0cmluZywgcmVwbzogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgdHJ5IHtcbiAgICBjb25zdCByZXBvVXJsID0gYGdpdEBnaXRodWIuY29tOiR7b3JnYW5pemF0aW9ufS8ke3JlcG99LmdpdGA7XG4gICAgY29uc3Qgb3V0cHV0ID0gc3Bhd25TeW5jQW5kUmV0dXJuU3Rkb3V0KCdnaXQnLCBbJ2xzLXJlbW90ZScsIHJlcG9VcmwsICdIRUFEJ10sIHByb2Nlc3MuY3dkKCkpO1xuICAgIGNvbnN0IGNvbW1pdEhhc2ggPSBvdXRwdXQuc3BsaXQoL1xccysvKVswXTtcbiAgICBpZiAoIWNvbW1pdEhhc2gpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgTm8gY29tbWl0cyBmb3VuZCBmb3IgJHtvcmdhbml6YXRpb259LyR7cmVwb31gKTtcbiAgICB9XG4gICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShjb21taXRIYXNoKTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IEVycm9yKGBGYWlsZWQgdG8gZmV0Y2ggY29tbWl0cyBmb3IgJHtvcmdhbml6YXRpb259LyR7cmVwb306ICR7U3RyaW5nKGVycm9yKX1gKSk7XG4gIH1cbn1cbiIsImltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuXG5leHBvcnQgY29uc3QgbWFuYWdlZFRzY29uZmlnQmFzZURlcGVuZGVuY2llcyA9IFtcbiAgJ0B0c2NvbmZpZy9idW4nLFxuICAnQHRzY29uZmlnL25vZGUtbHRzJyxcbiAgJ0B0c2NvbmZpZy9ub2RlLXRzJyxcbiAgJ0B0c2NvbmZpZy9yZWFjdC1uYXRpdmUnLFxuXTtcblxuZXhwb3J0IGZ1bmN0aW9uIGdldFRzY29uZmlnRXh0ZW5kcyhjb25maWc6IFBhY2thZ2VDb25maWcpOiBzdHJpbmcgfCBzdHJpbmdbXSB7XG4gIC8vIFJlYWN0IE5hdGl2ZSBuZWVkcyBNZXRyby1jb21wYXRpYmxlIHNldHRpbmdzIChqc3g6IHJlYWN0LW5hdGl2ZSwgbm9kZSByZXNvbHV0aW9uKSwgd2hpY2hcbiAgLy8gQHRzY29uZmlnL2J1biB3b3VsZCBvdmVycmlkZSBldmVuIHRob3VnaCB0aGUgcmVwbyB1c2VzIEJ1biBhcyBpdHMgcGFja2FnZSBtYW5hZ2VyLlxuICBpZiAoY29uZmlnLmRlcGVuZGluZy5yZWFjdE5hdGl2ZSkge1xuICAgIHJldHVybiAnQHRzY29uZmlnL3JlYWN0LW5hdGl2ZS90c2NvbmZpZy5qc29uJztcbiAgfVxuICByZXR1cm4gJ0B0c2NvbmZpZy9idW4vdHNjb25maWcuanNvbic7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRUc2NvbmZpZ0Jhc2VEZXBlbmRlbmNpZXMoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogc3RyaW5nW10ge1xuICBpZiAoY29uZmlnLmRlcGVuZGluZy5ibGl0eiB8fCBjb25maWcuZGVwZW5kaW5nLm5leHQpIHtcbiAgICByZXR1cm4gW107XG4gIH1cbiAgaWYgKGNvbmZpZy5kZXBlbmRpbmcucmVhY3ROYXRpdmUpIHtcbiAgICByZXR1cm4gWydAdHNjb25maWcvcmVhY3QtbmF0aXZlJ107XG4gIH1cbiAgcmV0dXJuIFsnQHRzY29uZmlnL2J1biddO1xufVxuIiwiaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5cbi8qKlxuICogUmV0dXJucyB0aGUgbW9kdWxlIHNwZWNpZmllciBhIGdlbmVyYXRlZCBjb25maWcgZmlsZSBzaG91bGQgdXNlIHRvIGxvYWQgYVxuICogd2lsbGJvb3N0ZXItY29uZmlncyBjb25maWcgcGFja2FnZSBzdWNoIGFzIGBAd2lsbGJvb3N0ZXIvb3hsaW50LWNvbmZpZ2AuXG4gKlxuICogT3V0c2lkZSB3aWxsYm9vc3Rlci1jb25maWdzIHRoaXMgaXMgc2ltcGx5IHRoZSBwdWJsaXNoZWQgcGFja2FnZSBuYW1lLiBJbnNpZGVcbiAqIHdpbGxib29zdGVyLWNvbmZpZ3MgdGhlIHBhY2thZ2UgbXVzdCBub3QgYmUgZGVjbGFyZWQgYXMgYSBkZXBlbmRlbmN5OiB0aGVcbiAqIGNvbmZpZyBwYWNrYWdlcyBpbXBvcnQgb25lIGFub3RoZXIgKGUuZy4gb3hmbXQtY29uZmlnJ3Mgb3hsaW50LmNvbmZpZy50c1xuICogaW1wb3J0cyBveGxpbnQtY29uZmlnIGFuZCB2aWNlIHZlcnNhKSwgc28gYSBkZWNsYXJlZCBlZGdlIHdvdWxkIGZvcm0gYVxuICogZGVwZW5kZW5jeSBjeWNsZSB0aGF0IG11bHRpLXNlbWFudGljLXJlbGVhc2UgY2Fubm90IHRvcG9sb2dpY2FsbHkgc29ydC4gU2luY2VcbiAqIHRoZSBlZGdlIGlzIGFic2VudCwgaXNvbGF0ZWQgaW5zdGFsbHMgY2Fubm90IHJlc29sdmUgdGhlIGJhcmUgcGFja2FnZSBuYW1lLCBzb1xuICogaW1wb3J0IHRoZSBjb21taXR0ZWQgYGNvbmZpZy5tanNgIGJ1aWxkIG91dHB1dCB0aHJvdWdoIGEgcmVsYXRpdmUgcGF0aCBpbnN0ZWFkLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVzb2x2ZVdpbGxib29zdGVyQ29uZmlnTW9kdWxlKGNvbmZpZzogUGFja2FnZUNvbmZpZywgY29uZmlnUGFja2FnZU5hbWU6IHN0cmluZyk6IHN0cmluZyB7XG4gIGlmICghY29uZmlnLmlzV2lsbEJvb3N0ZXJDb25maWdzKSByZXR1cm4gY29uZmlnUGFja2FnZU5hbWU7XG5cbiAgLy8gZS5nLiAnQHdpbGxib29zdGVyL294bGludC1jb25maWcnIC0+ICdveGxpbnQtY29uZmlnJywgd2hpY2ggaXMgaXRzIGRpcmVjdG9yeSB1bmRlciBgcGFja2FnZXMvYC5cbiAgY29uc3QgY29uZmlnUGFja2FnZURpciA9IGNvbmZpZ1BhY2thZ2VOYW1lLnNwbGl0KCcvJykucG9wKCkgPz8gJyc7XG4gIC8vIERlcml2ZSB0aGUgd2lsbGJvb3N0ZXItY29uZmlncyByb290IGZyb20gdGhlIHBhY2thZ2UgYmVpbmcgZ2VuZXJhdGVkLCBub3QgZnJvbSB0aGUgQ0xJIGVudHJ5XG4gIC8vIHBhdGg6IGB3YmZ5IDxyZXBvPi9wYWNrYWdlcy88cGtnPmAgaXMgYSBzdXBwb3J0ZWQgaW52b2NhdGlvbiB3aG9zZSBlbnRyeSBjb25maWcgaXMgdGhlIGNoaWxkXG4gIC8vIHBhY2thZ2UgcmF0aGVyIHRoYW4gdGhlIHJlcG8gcm9vdCwgc28gcmVseWluZyBvbiB0aGUgZW50cnkgd291bGQgZW1pdCBhIG5lc3RlZCwgdW5yZXNvbHZhYmxlXG4gIC8vIHBhdGggZm9yIGEgZGlyZWN0bHkgdGFyZ2V0ZWQgY29uZmlnIHBhY2thZ2UuIEV2ZXJ5IHdpbGxib29zdGVyLWNvbmZpZ3MgcGFja2FnZSBpcyBlaXRoZXIgdGhlXG4gIC8vIHJvb3Qgb3IgYSBkaXJlY3QgY2hpbGQgdW5kZXIgYHBhY2thZ2VzL2AsIHNvIHRoZSByb290IGlzIHRoZSBwYWNrYWdlIGRpciBpdHNlbGYgb3IgaXRzIGdyYW5kcGFyZW50LlxuICBjb25zdCByZXBvUm9vdERpclBhdGggPSBjb25maWcuaXNSb290ID8gY29uZmlnLmRpclBhdGggOiBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICcuLicsICcuLicpO1xuICBjb25zdCBsb2NhbEVudHJ5ID0gcGF0aC5yZXNvbHZlKHJlcG9Sb290RGlyUGF0aCwgJ3BhY2thZ2VzJywgY29uZmlnUGFja2FnZURpciwgJ2NvbmZpZy5tanMnKTtcbiAgY29uc3QgcmVsYXRpdmVQYXRoID0gcGF0aC5yZWxhdGl2ZShjb25maWcuZGlyUGF0aCwgbG9jYWxFbnRyeSk7XG4gIHJldHVybiByZWxhdGl2ZVBhdGguc3RhcnRzV2l0aCgnLicpID8gcmVsYXRpdmVQYXRoIDogYC4vJHtyZWxhdGl2ZVBhdGh9YDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzUHVibGlzaGVkV2lsbGJvb3N0ZXJDb25maWdzUGFja2FnZShjb25maWc6IFBhY2thZ2VDb25maWcpOiBib29sZWFuIHtcbiAgcmV0dXJuIChcbiAgICBjb25maWcuaXNXaWxsQm9vc3RlckNvbmZpZ3MgJiZcbiAgICAhY29uZmlnLmlzUm9vdCAmJlxuICAgIGNvbmZpZy5wYWNrYWdlSnNvbj8ucHJpdmF0ZSAhPT0gdHJ1ZSAmJlxuICAgIEFycmF5LmlzQXJyYXkoY29uZmlnLnBhY2thZ2VKc29uPy5maWxlcykgJiZcbiAgICBjb25maWcucGFja2FnZUpzb24uZmlsZXMubGVuZ3RoID4gMFxuICApO1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHsgZXNjYXBlUmVnRXhwLCBxdW90ZUZvclNoZWxsIH0gZnJvbSAnQHdpbGxib29zdGVyL3NoYXJlZC1saWIvc3JjJztcbmltcG9ydCB7IGdsb2JJZ25vcmUgfSBmcm9tICdAd2lsbGJvb3N0ZXIvc2hhcmVkLWxpYi1ub2RlL3NyYyc7XG5pbXBvcnQgbWVyZ2UgZnJvbSAnZGVlcG1lcmdlJztcbmltcG9ydCBmZyBmcm9tICdmYXN0LWdsb2InO1xuaW1wb3J0IHNlbXZlciBmcm9tICdzZW12ZXInO1xuaW1wb3J0IHsgc29ydFBhY2thZ2VKc29uIH0gZnJvbSAnc29ydC1wYWNrYWdlLWpzb24nO1xuaW1wb3J0ICogYXMgYXN0IGZyb20gJ3R5cGVzY3JpcHQvdW5zdGFibGUvYXN0JztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUpzb24sIFNldFJlcXVpcmVkIH0gZnJvbSAndHlwZS1mZXN0JztcblxuaW1wb3J0IHsgZ2V0TGF0ZXN0Q29tbWl0SGFzaCB9IGZyb20gJy4uL2dpdGh1Yi9jb21taXQuanMnO1xuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB7IGdlbmVyYXRlc1dvcmtlclR5cGVzLCBnZXRXb3JrZXJUeXBlc1NjcmlwdEVycm9yLCB0eXBlIFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGNsYXNzaWZ5U2NyaXB0U2VnbWVudCwgc3BsaXRTY3JpcHRTZWdtZW50cyB9IGZyb20gJy4uL3V0aWxzL21hbmFnZWRTY3JpcHRTZWdtZW50LmpzJztcbmltcG9ydCB7IGZzVXRpbCB9IGZyb20gJy4uL3V0aWxzL2ZzVXRpbC5qcyc7XG5pbXBvcnQgeyBnaXRIdWJVdGlsIH0gZnJvbSAnLi4vdXRpbHMvZ2l0aHViVXRpbC5qcyc7XG5pbXBvcnQgeyBjb21iaW5lTWVyZ2UgfSBmcm9tICcuLi91dGlscy9tZXJnZVV0aWwuanMnO1xuaW1wb3J0IHsgZG9lc0NvbnRhaW5KYXZhLCBkb2VzQ29udGFpbkpzT3JUcyB9IGZyb20gJy4uL3V0aWxzL3BhY2thZ2VDYXBhYmlsaXRpZXMuanMnO1xuaW1wb3J0IHsgcHJvbWlzZVBvb2wgfSBmcm9tICcuLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5pbXBvcnQgeyBzcGF3blN5bmMsIHNwYXduU3luY0FuZFJldHVyblN0ZG91dCB9IGZyb20gJy4uL3V0aWxzL3NwYXduVXRpbC5qcyc7XG5pbXBvcnQgeyBnZXRUc2NvbmZpZ0Jhc2VEZXBlbmRlbmNpZXMsIG1hbmFnZWRUc2NvbmZpZ0Jhc2VEZXBlbmRlbmNpZXMgfSBmcm9tICcuLi91dGlscy90c2NvbmZpZ0Jhc2UuanMnO1xuaW1wb3J0IHsgcGFyc2VTb3VyY2VGaWxlIH0gZnJvbSAnLi4vdXRpbHMvdHlwZXNjcmlwdEFwaS5qcyc7XG5pbXBvcnQgeyBpc1B1Ymxpc2hlZFdpbGxib29zdGVyQ29uZmlnc1BhY2thZ2UgfSBmcm9tICcuLi91dGlscy93aWxsYm9vc3RlckNvbmZpZ3NVdGlsLmpzJztcbmltcG9ydCB7XG4gIGdldERlY2xhcmVkV29ya3NwYWNlUGF0dGVybnMsXG4gIGdldFdvcmtzcGFjZVBhY2thZ2VKc29uUGF0aHMsXG4gIGhhc0RlY2xhcmVkUGFja2FnZXNTdGFyUGF0dGVybixcbiAgaGFzSW1wbGljaXRXb3Jrc3BhY2VCYXNlbGluZSxcbn0gZnJvbSAnLi4vdXRpbHMvd29ya3NwYWNlVXRpbC5qcyc7XG5pbXBvcnQgeyBidW5NaW5pbXVtUmVsZWFzZUFnZUV4Y2x1ZGVzLCBidW5NaW5pbXVtUmVsZWFzZUFnZVNlY29uZHMgfSBmcm9tICcuL2J1bmZpZy5qcyc7XG5cbmNvbnN0IG94bGludERlcHMgPSBbJ0B3aWxsYm9vc3Rlci9veGZtdC1jb25maWcnLCAnQHdpbGxib29zdGVyL294bGludC1jb25maWcnLCAnb3hmbXQnLCAnb3hsaW50JywgJ294bGludC10c2dvbGludCddO1xuY29uc3QgdHlwZXNjcmlwdERlcGVuZGVuY3kgPSAndHlwZXNjcmlwdCc7XG4vLyBUeXBlU2NyaXB0IDcncyBgdHlwZXNjcmlwdGAgcGFja2FnZSBpcyB0aGUgdHNnbyBuYXRpdmUgY29tcGlsZXIgYW5kIGV4cG9zZXMgbm9cbi8vIHByb2dyYW1tYXRpYyBBUEkuIE5leHQuanMncyBidWlsZC10aW1lIGB2ZXJpZnlUeXBlU2NyaXB0U2V0dXBgIG5lZWRzIHRoYXQgQVBJLCBzb1xuLy8gYG5leHQgYnVpbGRgIGZhaWxzIChcInRyeWluZyB0byB1c2UgVHlwZVNjcmlwdCBidXQgZG8gbm90IGhhdmUgdGhlIHJlcXVpcmVkIHBhY2thZ2UocylcIilcbi8vIHdpdGggb25seSBgdHlwZXNjcmlwdGAgdjcgaW5zdGFsbGVkLiBOZXh0LmpzIHJlc29sdmVzIHRoZSB0c2dvIGJpbmFyeSB0aHJvdWdoIHRoZVxuLy8gc2VwYXJhdGUgYEB0eXBlc2NyaXB0L25hdGl2ZS1wcmV2aWV3YCBwYWNrYWdlLCBzbyBOZXh0LmpzLWZhbWlseSByZXBvcyBtdXN0IGluc3RhbGxcbi8vIGJvdGg7IG90aGVyIHJlcG9zIG9ubHkgbmVlZCBgdHlwZXNjcmlwdGAgZm9yIGB0c2NgIHR5cGVjaGVja3MuXG5jb25zdCB0eXBlc2NyaXB0R29EZXBlbmRlbmN5ID0gJ0B0eXBlc2NyaXB0L25hdGl2ZS1wcmV2aWV3JztcbmNvbnN0IHdiRGVwZW5kZW5jeSA9ICdAd2lsbGJvb3N0ZXIvd2InO1xuY29uc3QgYnVpbGRUc0RlcGVuZGVuY3kgPSAnYnVpbGQtdHMnO1xuY29uc3QgbGVmdGhvb2tEZXBlbmRlbmN5ID0gJ2xlZnRob29rJztcbmNvbnN0IG1hbmFnZWREZXBlbmRlbmN5TmFtZXMgPSBuZXcgU2V0KFtcbiAgd2JEZXBlbmRlbmN5LFxuICBidWlsZFRzRGVwZW5kZW5jeSxcbiAgbGVmdGhvb2tEZXBlbmRlbmN5LFxuICB0eXBlc2NyaXB0RGVwZW5kZW5jeSxcbiAgdHlwZXNjcmlwdEdvRGVwZW5kZW5jeSxcbiAgJ3NvcnQtcGFja2FnZS1qc29uJyxcbiAgLy8gTWl4ZWQgQHR5cGVzL2J1biB2ZXJzaW9ucyBhY3Jvc3MgYSBtb25vcmVwbyBsb2FkIHR3byBidW4tdHlwZXMgY29waWVzLCB3aGljaFxuICAvLyBicmVha3MgZ2xvYmFsIGludGVyZmFjZSBtZXJnaW5nIChlLmcuIFJlc3BvbnNlL0hlYWRlcnMpIGR1cmluZyB0eXBlIGNoZWNraW5nLlxuICAnQHR5cGVzL2J1bicsXG4gIC4uLm94bGludERlcHMsXG5dKTtcbmNvbnN0IGxhdGVzdERlcGVuZGVuY3lWZXJzaW9uQ2FjaGUgPSBuZXcgTWFwPHN0cmluZywgc3RyaW5nPigpO1xuY29uc3QgcGFja2FnZUFnZUdhdGVNcyA9IGJ1bk1pbmltdW1SZWxlYXNlQWdlU2Vjb25kcyAqIDEwMDA7XG5jb25zdCBucG1QYWNrYWdlVGltZXNDYWNoZSA9IG5ldyBNYXA8c3RyaW5nLCBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+PigpO1xuY29uc3QgZGVwZW5kZW5jeVNlY3Rpb25LZXlzID0gWydkZXBlbmRlbmNpZXMnLCAnZGV2RGVwZW5kZW5jaWVzJywgJ29wdGlvbmFsRGVwZW5kZW5jaWVzJywgJ3BlZXJEZXBlbmRlbmNpZXMnXSBhcyBjb25zdDtcblxudHlwZSBXcml0YWJsZVBhY2thZ2VKc29uID0gU2V0UmVxdWlyZWQ8XG4gIFBhY2thZ2VKc29uLFxuICAnc2NyaXB0cycgfCAnZGVwZW5kZW5jaWVzJyB8ICdkZXZEZXBlbmRlbmNpZXMnIHwgJ3BlZXJEZXBlbmRlbmNpZXMnXG4+O1xuXG5pbnRlcmZhY2UgRGVwZW5kZW5jeVVwZGF0ZXMge1xuICBkZXBlbmRlbmNpZXM6IHN0cmluZ1tdO1xuICBkZXZEZXBlbmRlbmNpZXM6IHN0cmluZ1tdO1xuICBweXRob25EZXZEZXBlbmRlbmNpZXM6IHN0cmluZ1tdO1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVQYWNrYWdlSnNvbihcbiAgY29uZmlnOiBQYWNrYWdlQ29uZmlnLFxuICByb290Q29uZmlnOiBQYWNrYWdlQ29uZmlnLFxuICBza2lwQWRkaW5nRGVwczogYm9vbGVhblxuKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZ2VuZXJhdGVQYWNrYWdlSnNvbicsIGFzeW5jICgpID0+IHtcbiAgICBhd2FpdCBjb3JlKGNvbmZpZywgcm9vdENvbmZpZywgc2tpcEFkZGluZ0RlcHMpO1xuICB9KTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gY29yZShjb25maWc6IFBhY2thZ2VDb25maWcsIHJvb3RDb25maWc6IFBhY2thZ2VDb25maWcsIHNraXBBZGRpbmdEZXBzOiBib29sZWFuKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IHdvcmtlclR5cGVzU2NyaXB0RXJyb3IgPSBnZXRXb3JrZXJUeXBlc1NjcmlwdEVycm9yKGNvbmZpZyk7XG4gIGlmICh3b3JrZXJUeXBlc1NjcmlwdEVycm9yKSB0aHJvdyBuZXcgRXJyb3Iod29ya2VyVHlwZXNTY3JpcHRFcnJvcik7XG4gIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAncGFja2FnZS5qc29uJyk7XG4gIGNvbnN0IGpzb25PYmogPSBhd2FpdCByZWFkUGFja2FnZUpzb24oZmlsZVBhdGgpO1xuICB1cGRhdGVTY3JpcHRzKGNvbmZpZywganNvbk9iaik7XG4gIGF3YWl0IGVuc3VyZVRydXN0ZWREZXBlbmRlbmNpZXMoY29uZmlnLCBqc29uT2JqKTtcbiAgbW92ZU1hbmFnZWRUb29sRGVwZW5kZW5jaWVzVG9EZXZEZXBlbmRlbmNpZXMoanNvbk9iaik7XG4gIHBydW5lQ2FwYWJpbGl0eURlcGVuZGVudENvbXBpbGVyRGVwZW5kZW5jaWVzKGNvbmZpZywganNvbk9iaik7XG4gIGNvbnN0IGRlcGVuZGVuY3lVcGRhdGVzID0gYXdhaXQgYXBwbHlQYWNrYWdlSnNvbkNvbnZlbnRpb25zKGNvbmZpZywgcm9vdENvbmZpZywganNvbk9iaik7XG4gIGF3YWl0IG5vcm1hbGl6ZVBhY2thZ2VNZXRhZGF0YShjb25maWcsIHJvb3RDb25maWcsIGpzb25PYmosIGRlcGVuZGVuY3lVcGRhdGVzKTtcbiAgLy8gT24gYSBmaXJzdCBydW4gdGhlcmUgaXMgbm8gbWFuaWZlc3QgZm9yIGBidW4gYWRkYCB0byB1cGRhdGUgcmVsaWFibHkuIFdyaXRlIHRoZSByZXNvbHZlZFxuICAvLyBkZXBlbmRlbmN5IHZlcnNpb25zIGludG8gdGhlIG5ldyBtYW5pZmVzdCBkaXJlY3RseTsgdGhlIGZpbmFsIHJlcG9zaXRvcnktd2lkZSBgYnVuIGluc3RhbGxgXG4gIC8vIHRoZW4gaW5zdGFsbHMgdGhlbSBhbmQgcmVtYWlucyB0aGUgYXV0aG9yaXRhdGl2ZSBmYWlsdXJlIGNoZWNrLlxuICBhZGREZXBlbmRlbmN5VmVyc2lvbnNUb1BhY2thZ2VKc29uKFxuICAgIGNvbmZpZyxcbiAgICByb290Q29uZmlnLFxuICAgIGpzb25PYmosXG4gICAgZGVwZW5kZW5jeVVwZGF0ZXMsXG4gICAgc2tpcEFkZGluZ0RlcHMgfHwgIWNvbmZpZy5kb2VzQ29udGFpblBhY2thZ2VKc29uXG4gICk7XG4gIGF3YWl0IHVwZGF0ZVByaXZhdGVQYWNrYWdlcyhqc29uT2JqKTtcbiAgcmVtb3ZlRW1wdHlEZXBlbmRlbmN5U2VjdGlvbnMoanNvbk9iaik7XG5cbiAgZGVsZXRlIGpzb25PYmoucGFja2FnZU1hbmFnZXI7XG4gIC8vIFlhcm4gcmVhZHMgcGFja2FnZS5qc29uIGZyb20gZGlzayBiZWZvcmUgZGVjaWRpbmcgd2hldGhlciBgeWFybiBhZGQgLURgXG4gIC8vIGNvbmZsaWN0cyB3aXRoIGFuIGV4aXN0aW5nIHJlZ3VsYXIgZGVwZW5kZW5jeSwgc28gdGhpcyB3cml0ZSBtdXN0IGZpbmlzaFxuICAvLyBiZWZvcmUgaW5zdGFsbGluZyB0aGUgbWFuYWdlZCBkZXBlbmRlbmN5IHVwZGF0ZXMgYmVsb3cuIEtlZXAgdGhpcyBnZW5lcmF0ZWRcbiAgLy8gZmlsZSBzb3J0ZWQgZXZlbiB3aGVuIHdlIGxhdGVyIHJ1biB0aGUgdGFyZ2V0IHJlcG9zaXRvcnkncyBmb3JtYXR0ZXIgc28gYVxuICAvLyBtaWQtcnVuIGludGVycnVwdGlvbiBuZXZlciBsZWF2ZXMgcGFja2FnZS5qc29uIGluIGEgcGFydGlhbGx5IG1hbmFnZWQgb3JkZXIuXG4gIC8vIEEgcmVmdXNlZCB3cml0ZSAoZS5nLiBhIHN5bWxpbmtlZCBwYWNrYWdlLmpzb24pIG11c3QgYWxzbyBhYm9ydCB0aGUgZGVwZW5kZW5jeSBpbnN0YWxsYXRpb25cbiAgLy8gYmVsb3c6IGBidW4gYWRkYCBmb2xsb3dzIHRoZSBzeW1saW5rIGFuZCB3b3VsZCBtb2RpZnkgdGhlIGZpbGUgb3V0c2lkZSB0aGUgcmVwb3NpdG9yeS5cbiAgaWYgKCEoYXdhaXQgZnNVdGlsLmdlbmVyYXRlRmlsZShmaWxlUGF0aCwgc2VyaWFsaXplUGFja2FnZUpzb24oanNvbk9iaikpKSkgcmV0dXJuO1xuXG4gIGlmICghc2tpcEFkZGluZ0RlcHMpIHtcbiAgICBpbnN0YWxsRGVwZW5kZW5jeVVwZGF0ZXMoY29uZmlnLCByb290Q29uZmlnLCBqc29uT2JqLCBkZXBlbmRlbmN5VXBkYXRlcyk7XG4gICAgLy8gQSBuZXdseSBjcmVhdGVkIG1hbmlmZXN0IGlzIGFscmVhZHkgc29ydGVkIGJ5IHdiZnkncyBidW5kbGVkIHNlcmlhbGl6ZXI7IHRoZSB0YXJnZXQgZm9ybWF0dGVyXG4gICAgLy8gaXMgYXZhaWxhYmxlIHdpdGhvdXQgYW4gZXh0cmEgZmV0Y2ggb25seSB3aGVuIHRoaXMgcnVuIHN0YXJ0ZWQgd2l0aCBwYWNrYWdlLmpzb24uXG4gICAgaWYgKGNvbmZpZy5kb2VzQ29udGFpblBhY2thZ2VKc29uKSB7XG4gICAgICBmb3JtYXRQYWNrYWdlSnNvbldpdGhQcm9qZWN0Rm9ybWF0dGVyKGNvbmZpZywgZmlsZVBhdGgpO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBzZXJpYWxpemVQYWNrYWdlSnNvbihqc29uT2JqOiBXcml0YWJsZVBhY2thZ2VKc29uKTogc3RyaW5nIHtcbiAgLy8gZnNVdGlsLmdlbmVyYXRlRmlsZSgpIG5vcm1hbGl6ZXMgdGhlIHRyYWlsaW5nIG5ld2xpbmUsIHNvIGtlZXAgdGhlIHNlcmlhbGl6ZXJcbiAgLy8gZm9jdXNlZCBvbiB0aGUgSlNPTiBwYXlsb2FkIGl0c2VsZi5cbiAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KHNvcnRQYWNrYWdlSnNvbihqc29uT2JqKSwgdW5kZWZpbmVkLCAyKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gcmVhZFBhY2thZ2VKc29uKGZpbGVQYXRoOiBzdHJpbmcpOiBQcm9taXNlPFdyaXRhYmxlUGFja2FnZUpzb24+IHtcbiAgbGV0IGpzb25PYmo6IFBhY2thZ2VKc29uID0ge307XG4gIHRyeSB7XG4gICAgY29uc3QganNvblRleHQgPSBhd2FpdCBmcy5wcm9taXNlcy5yZWFkRmlsZShmaWxlUGF0aCwgJ3V0ZjgnKTtcbiAgICBqc29uT2JqID0gSlNPTi5wYXJzZShqc29uVGV4dCkgYXMgUGFja2FnZUpzb247XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgLy8gRG9jdW1lbnRhdGlvbi1vbmx5IHJlcG9zaXRvcmllcyBoYXZlIG5vIG1hbmlmZXN0IG9uIHRoZWlyIGZpcnN0IHdiZnkgcnVuLiBTdGFydGluZyBmcm9tIGFuXG4gICAgLy8gZW1wdHkgb2JqZWN0IGxldHMgdGhlIG5vcm1hbCBnZW5lcmF0b3IgZXN0YWJsaXNoIHRoZSBzYW1lIG1hbmFnZWQgYmFzZWxpbmUgYXMgZXZlcnkgb3RoZXJcbiAgICAvLyByZXBvc2l0b3J5OyBtYWxmb3JtZWQgb3IgdW5yZWFkYWJsZSBleGlzdGluZyBtYW5pZmVzdHMgbXVzdCBzdGlsbCBmYWlsIGxvdWRseS5cbiAgICBpZiAoKGVycm9yIGFzIE5vZGVKUy5FcnJub0V4Y2VwdGlvbikuY29kZSAhPT0gJ0VOT0VOVCcpIHRocm93IGVycm9yO1xuICB9XG4gIGpzb25PYmouc2NyaXB0cyA9IGpzb25PYmouc2NyaXB0cyA/PyB7fTtcbiAganNvbk9iai5kZXBlbmRlbmNpZXMgPSBqc29uT2JqLmRlcGVuZGVuY2llcyA/PyB7fTtcbiAganNvbk9iai5kZXZEZXBlbmRlbmNpZXMgPSBqc29uT2JqLmRldkRlcGVuZGVuY2llcyA/PyB7fTtcbiAganNvbk9iai5wZWVyRGVwZW5kZW5jaWVzID0ganNvbk9iai5wZWVyRGVwZW5kZW5jaWVzID8/IHt9O1xuICByZXR1cm4ganNvbk9iaiBhcyBXcml0YWJsZVBhY2thZ2VKc29uO1xufVxuXG5mdW5jdGlvbiBwcnVuZUNhcGFiaWxpdHlEZXBlbmRlbnRDb21waWxlckRlcGVuZGVuY2llcyhjb25maWc6IFBhY2thZ2VDb25maWcsIGpzb25PYmo6IFdyaXRhYmxlUGFja2FnZUpzb24pOiB2b2lkIHtcbiAgLy8gUnVuIGJlZm9yZSBhcHBseVBhY2thZ2VKc29uQ29udmVudGlvbnMsIHdoaWNoIHJlLWFkZHMgdHNnbyBvbmx5IGZvciBjdXJyZW50IE5leHQuanMtZmFtaWx5IHJlcG9zaXRvcmllcy5cbiAgZGVsZXRlIGpzb25PYmouZGVwZW5kZW5jaWVzW3R5cGVzY3JpcHRHb0RlcGVuZGVuY3ldO1xuICBkZWxldGUganNvbk9iai5kZXZEZXBlbmRlbmNpZXNbdHlwZXNjcmlwdEdvRGVwZW5kZW5jeV07XG4gIGlmICghY29uZmlnLmRvZXNDb250YWluVHlwZVNjcmlwdCAmJiAhY29uZmlnLmRvZXNDb250YWluVHlwZVNjcmlwdEluUGFja2FnZXMpIHtcbiAgICBkZWxldGUganNvbk9iai5kZXBlbmRlbmNpZXNbdHlwZXNjcmlwdERlcGVuZGVuY3ldO1xuICAgIGRlbGV0ZSBqc29uT2JqLmRldkRlcGVuZGVuY2llc1t0eXBlc2NyaXB0RGVwZW5kZW5jeV07XG4gIH1cbn1cblxuZnVuY3Rpb24gdXBkYXRlU2NyaXB0cyhjb25maWc6IFBhY2thZ2VDb25maWcsIGpzb25PYmo6IFdyaXRhYmxlUGFja2FnZUpzb24pOiB2b2lkIHtcbiAganNvbk9iai5zY3JpcHRzID0geyAuLi5qc29uT2JqLnNjcmlwdHMsIC4uLmdlbmVyYXRlU2NyaXB0cyhjb25maWcsIGpzb25PYmouc2NyaXB0cykgfTtcbn1cblxuLyoqXG4gKiBLZWVwcyB0aGUgcHJvamVjdCdzIG93biBzZWdtZW50cyBpbiBvcmRlciwgcmVwbGFjaW5nIHRoZSBmaXJzdCBtYW5hZ2VkIGdlbi1jb2RlIHNwZWxsaW5nIHdpdGhcbiAqIGBidW4gd2IgZ2VuLWNvZGVgIGFuZCBkcm9wcGluZyBsYXRlciBkdXBsaWNhdGVzLiBBcHBlbmRzIGdlbmVyYXRpb24gb25seSB3aGVuIHRoZSBzY3JpcHRcbiAqIGNvbnRhaW5lZCBub25lLCBzbyBub3RoaW5nIGlzIHJlb3JkZXJlZC5cbiAqL1xuZnVuY3Rpb24gcmVidWlsZFBvc3RpbnN0YWxsU2VnbWVudHMoc2VnbWVudHM6IHN0cmluZ1tdLCBzY3JpcHRzOiBQYWNrYWdlSnNvbi5TY3JpcHRzKTogc3RyaW5nW10ge1xuICBjb25zdCBraW5kcyA9IHNlZ21lbnRzLm1hcCgoc2VnbWVudCkgPT4gY2xhc3NpZnlTY3JpcHRTZWdtZW50KHNlZ21lbnQsIHNjcmlwdHMsIHRydWUpKTtcbiAgLy8gQSB3cmFwcGVyIGFyb3VuZCBhIGN1c3RvbWl6ZWQgZ2VuLWNvZGUgYWxyZWFkeSBnZW5lcmF0ZXM7IGFkZGluZyBhbm90aGVyIGludm9jYXRpb24gd291bGQgcnVuIGV2ZXJ5XG4gIC8vIGdlbmVyYXRvciB0d2ljZS5cbiAgbGV0IGdlbmVyYXRpb25QbGFjZWQgPSBraW5kcy5pbmNsdWRlcygnZ2VuQ29kZVdyYXBwZXInKTtcbiAgY29uc3QgcmVzdWx0OiBzdHJpbmdbXSA9IFtdO1xuICBmb3IgKGNvbnN0IFtpbmRleCwgc2VnbWVudF0gb2Ygc2VnbWVudHMuZW50cmllcygpKSB7XG4gICAgY29uc3Qga2luZCA9IGtpbmRzW2luZGV4XTtcbiAgICBpZiAoa2luZCA9PT0gJ2N1c3RvbScgfHwga2luZCA9PT0gJ2dlbkNvZGVXcmFwcGVyJykge1xuICAgICAgcmVzdWx0LnB1c2goc2VnbWVudCk7XG4gICAgfSBlbHNlIGlmICghZ2VuZXJhdGlvblBsYWNlZCkge1xuICAgICAgcmVzdWx0LnB1c2goJ2J1biB3YiBnZW4tY29kZScpO1xuICAgICAgZ2VuZXJhdGlvblBsYWNlZCA9IHRydWU7XG4gICAgfVxuICB9XG4gIGlmICghZ2VuZXJhdGlvblBsYWNlZCkgcmVzdWx0LnB1c2goJ2J1biB3YiBnZW4tY29kZScpO1xuICByZXR1cm4gcmVzdWx0O1xufVxuXG4vKipcbiAqIE5vcm1hbGl6ZXMgbWFuYWdlZCBnZW4tY29kZSBzZWdtZW50cyB3aGlsZSBrZWVwaW5nIHRoZSBmaXJzdCBzZWdtZW50J3MgcG9zaXRpb24gc28gYSBjdXN0b21cbiAqIHN0ZXAgdGhhdCBjb25zdW1lcyBnZW5lcmF0ZWQgb3V0cHV0IHN0aWxsIHJ1bnMgYWZ0ZXIgaXQuIFJldHVybnMgd2l0aG91dCBjaGFuZ2luZyBhblxuICogdW5wYXJzZWFibGUgc2NyaXB0LlxuICovXG5mdW5jdGlvbiB1cGRhdGVQb3N0aW5zdGFsbFNjcmlwdChzY3JpcHRzOiBQYWNrYWdlSnNvbi5TY3JpcHRzLCBtYW5hZ2VzV29ya2VyVHlwZXM6IGJvb2xlYW4pOiB2b2lkIHtcbiAgLy8gYGJ1biB3YiBnZW4tY29kZWAgcmVnZW5lcmF0ZXMgd29ya2VyLWNvbmZpZ3VyYXRpb24uZC50cyBpdHNlbGYsIHNvIGEgcGFja2FnZSB3aXRoIGFcbiAgLy8gY29kZS1nZW5lcmF0aW9uIG9yIHdvcmtlci10eXBlcyBwaXBlbGluZSBnZXRzIG9uZSBtYW5hZ2VkIGdlbmVyYXRpb24gc2VnbWVudC5cbiAgaWYgKHNjcmlwdHNbJ2dlbi1jb2RlJ10gfHwgbWFuYWdlc1dvcmtlclR5cGVzKSB7XG4gICAgLy8gUHJvamVjdC1vd25lZCBzdGVwcyBhcmUgbmV2ZXIgZHJvcHBlZCwgYW5kIHRoZWlyIFBPU0lUSU9OIHJlbGF0aXZlIHRvIGdlbmVyYXRpb24gaXMgcHJlc2VydmVkOiBhIHN0ZXBcbiAgICAvLyBiZWZvcmUgaXQgbWF5IHByb2R1Y2UgYHdyYW5nbGVyIHR5cGVzYCcgaW5wdXRzIChhIHdyYW5nbGVyIGNvbmZpZywgYC5kZXYudmFyc2ApLCB3aGlsZSBvbmUgYWZ0ZXIgaXQgbWF5XG4gICAgLy8gY29uc3VtZSB0aGUgZ2VuZXJhdGVkIHR5cGVzLiBTbyB0aGUgbWFuYWdlZCBnZW5lcmF0aW9uIHJlcGxhY2VzIHRoZSBmaXJzdCBtYW5hZ2VkIHNlZ21lbnQgaW4gcGxhY2UsIGFuZCBpc1xuICAgIC8vIGFwcGVuZGVkIG9ubHkgd2hlbiB0aGUgc2NyaXB0IGhhZCBub25lLiBBIHdyYXBwZXIgYXJvdW5kIGEgY3VzdG9taXplZCBnZW4tY29kZSBhbHJlYWR5IHBlcmZvcm1zIHRoZVxuICAgIC8vIGdlbmVyYXRpb24gcGx1cyB0aGUgcHJvamVjdCdzIG93biBzdGVwcywgc28gaXQgc3VwcHJlc3NlcyB0aGUgcmVwbGFjZW1lbnQgZW50aXJlbHkuXG4gICAgY29uc3Qgc2VnbWVudHMgPSBzY3JpcHRzLnBvc3RpbnN0YWxsID09PSB1bmRlZmluZWQgPyBbXSA6IHNwbGl0U2NyaXB0U2VnbWVudHMoc2NyaXB0cy5wb3N0aW5zdGFsbCk7XG4gICAgY29uc3Qga2VwdFNlZ21lbnRzID0gc2VnbWVudHMgJiYgcmVidWlsZFBvc3RpbnN0YWxsU2VnbWVudHMoc2VnbWVudHMsIHNjcmlwdHMpO1xuICAgIGlmIChrZXB0U2VnbWVudHMpIHtcbiAgICAgIHNjcmlwdHMucG9zdGluc3RhbGwgPSBrZXB0U2VnbWVudHMuam9pbignICYmICcpO1xuICAgIH1cbiAgICAvLyBBbnkgb3RoZXIgdW5wYXJzZWFibGUgcG9zdGluc3RhbGwgaXMgbGVmdCB0byBhIGh1bWFuIHJhdGhlciB0aGFuIHJld3JpdHRlbiBmcm9tIGEgd3JvbmcgcGFyc2UuXG4gIH1cbn1cblxuYXN5bmMgZnVuY3Rpb24gYXBwbHlQYWNrYWdlSnNvbkNvbnZlbnRpb25zKFxuICBjb25maWc6IFBhY2thZ2VDb25maWcsXG4gIHJvb3RDb25maWc6IFBhY2thZ2VDb25maWcsXG4gIGpzb25PYmo6IFdyaXRhYmxlUGFja2FnZUpzb25cbik6IFByb21pc2U8RGVwZW5kZW5jeVVwZGF0ZXM+IHtcbiAgY29uc3QgZGVwZW5kZW5jaWVzOiBzdHJpbmdbXSA9IFtdO1xuICBjb25zdCBkZXZEZXBlbmRlbmNpZXMgPSBbJ3NvcnQtcGFja2FnZS1qc29uJ107XG4gIGNvbnN0IHB5dGhvbkRldkRlcGVuZGVuY2llczogc3RyaW5nW10gPSBbXTtcbiAgY29uc3QgaGFzSmF2YSA9IGRvZXNDb250YWluSmF2YShjb25maWcpO1xuXG4gIGlmIChcbiAgICBoYXNKYXZhICYmXG4gICAgIWZzLmV4aXN0c1N5bmMocGF0aC5qb2luKHJvb3RDb25maWcuZGlyUGF0aCwgJy5wcmV0dGllcnJjLmpzb24nKSkgJiZcbiAgICAhZnMuZXhpc3RzU3luYyhwYXRoLmpvaW4oY29uZmlnLmRpclBhdGgsICcucHJldHRpZXJyYy5qc29uJykpXG4gICkge1xuICAgIGpzb25PYmoucHJldHRpZXIgPSAnQHdpbGxib29zdGVyL3ByZXR0aWVyLWNvbmZpZyc7XG4gICAgZGV2RGVwZW5kZW5jaWVzLnB1c2goJ3ByZXR0aWVyLXBsdWdpbi1qYXZhJywgJ0B3aWxsYm9vc3Rlci9wcmV0dGllci1jb25maWcnKTtcbiAgfVxuICBpZiAoaGFzSmF2YSkge1xuICAgIGRldkRlcGVuZGVuY2llcy5wdXNoKCdwcmV0dGllcicpO1xuICB9XG5cbiAgaWYgKGNvbmZpZy5pc1Jvb3QpIHtcbiAgICAvLyBMZWZ0aG9vayBnZW5lcmF0aW9uIGlzIGJlc3QtZWZmb3J0IGFuZCAubGVmdGhvb2sgaXMgYWJzZW50IGZyb20gRG9ja2VyIGJ1aWxkIGNvbnRleHRzLCBzbyBhXG4gICAgLy8gbWlzc2luZyBub3JtYWxpemVyIGlzIHZhbGlkLiBPbmNlIHByZXNlbnQsIGl0cyBmYWlsdXJlIG11c3QgYWJvcnQgaW5zdGFsbCByYXRoZXIgdGhhbiBsZWF2ZSBhXG4gICAgLy8gR3VhcmQtcGlubmVkIGxvY2tmaWxlIGJlaGluZDsga2VlcCB0aGF0IGZhaWwtZmFzdCBncm91cGluZyBleHBsaWNpdCBiZWZvcmUgYW55IHdvcmtzcGFjZSBidWlsZC5cbiAgICBqc29uT2JqLnNjcmlwdHMucHJlcGFyZSA9XG4gICAgICAnKGJ1biBsZWZ0aG9vayBpbnN0YWxsIHx8IHRydWUpICYmICh0ZXN0ICEgLWYgLmxlZnRob29rL25vcm1hbGl6ZS1idW4tbG9ja2ZpbGUuc2ggfHwgYmFzaCAubGVmdGhvb2svbm9ybWFsaXplLWJ1bi1sb2NrZmlsZS5zaCknO1xuICAgIC8vIFdoZW4gQHdpbGxib29zdGVyL3diIGlzIGEgd29ya3NwYWNlIG9mIHRoaXMgcmVwb3NpdG9yeSwgdGhlIGdlbmVyYXRlZCBgYnVuIHdiIOKApmAgc2NyaXB0cyBydW5cbiAgICAvLyBpdHMgZ2l0aWdub3JlZCBkaXN0IGJ1aWxkIChiaW4vaW5kZXguanMgaW1wb3J0cyAuLi9kaXN0L2luZGV4LmpzKSwgc28gYSBmcmVzaCBjaGVja291dCBtdXN0XG4gICAgLy8gYnVpbGQgaXQgZHVyaW5nIGluc3RhbGw7IHJlZ2lzdHJ5IGluc3RhbGxzIHNoaXAgYSBwcmVidWlsdCBkaXN0IGFuZCBuZWVkIG5vIGV4dHJhIHN0ZXAuXG4gICAgY29uc3Qgd2JXb3Jrc3BhY2VEaXIgPSBnZXRXb3Jrc3BhY2VQYWNrYWdlRGlycyhyb290Q29uZmlnKS5nZXQod2JEZXBlbmRlbmN5KTtcbiAgICBpZiAod2JXb3Jrc3BhY2VEaXIpIHtcbiAgICAgIC8vIFF1b3RlZCB1bmxlc3MgdGhlIG5hbWUgY2FycmllcyBubyBzaGVsbCBtZWFuaW5nLCBzbyB0aGF0IGAkKOKApilgIG9yIGEgdmFyaWFibGUgYSBob3N0aWxlXG4gICAgICAvLyBkaXJlY3RvcnkgbmFtZSBjb3VsZCBzbXVnZ2xlIGludG8gdGhlIGdlbmVyYXRlZCBzY3JpcHQgbmV2ZXIgcmVhY2hlcyB0aGUgc2hlbGwgdW5xdW90ZWQuXG4gICAgICBqc29uT2JqLnNjcmlwdHMucHJlcGFyZSArPSBgICYmIGJ1biBydW4gLS1jd2QgJHtxdW90ZUZvclNoZWxsKHdiV29ya3NwYWNlRGlyKX0gYnVpbGRgO1xuICAgIH1cbiAgICBkZXZEZXBlbmRlbmNpZXMucHVzaChsZWZ0aG9va0RlcGVuZGVuY3kpO1xuXG4gICAgaWYgKGNvbmZpZy5kZXBlbmRpbmcuc2VtYW50aWNSZWxlYXNlKSB7XG4gICAgICBpZiAoZG9lc1JlbGVhc2VTY3JpcHRJbnN0YWxsU2VtYW50aWNSZWxlYXNlKGpzb25PYmouc2NyaXB0cy5yZWxlYXNlKSkge1xuICAgICAgICBkZWxldGUganNvbk9iai5kZXZEZXBlbmRlbmNpZXNbJ3NlbWFudGljLXJlbGVhc2UnXTtcbiAgICAgIH0gZWxzZSBpZiAoXG4gICAgICAgICFqc29uT2JqLmRldkRlcGVuZGVuY2llc1snc2VtYW50aWMtcmVsZWFzZSddICYmXG4gICAgICAgICFqc29uT2JqLmRldkRlcGVuZGVuY2llc1snbXVsdGktc2VtYW50aWMtcmVsZWFzZSddICYmXG4gICAgICAgICFqc29uT2JqLmRldkRlcGVuZGVuY2llc1snQHFpd2kvbXVsdGktc2VtYW50aWMtcmVsZWFzZSddXG4gICAgICApIHtcbiAgICAgICAgZGV2RGVwZW5kZW5jaWVzLnB1c2goJ3NlbWFudGljLXJlbGVhc2UnKTtcbiAgICAgIH1cbiAgICAgIGpzb25PYmoudmVyc2lvbiA9ICcwLjAuMC1zZW1hbnRpY2FsbHktcmVsZWFzZWQnO1xuICAgIH1cblxuICAgIGlmIChjb25maWcuZGVwZW5kaW5nLnBsYXl3cmlnaHRUZXN0KSB7XG4gICAgICAvLyBTaW5jZSBhcnRpbGxlcnkgcmVxdWlyZXMgYSBzcGVjaWZpYyB2ZXJzaW9uIG9mIEBwbGF5d3JpZ2h0L3Rlc3RcbiAgICAgIGNvbnN0IGhhc0FydGlsbGVyeSA9IGpzb25PYmouZGVwZW5kZW5jaWVzLmFydGlsbGVyeSB8fCBqc29uT2JqLmRldkRlcGVuZGVuY2llcy5hcnRpbGxlcnk7XG4gICAgICAvLyBTaW5jZSBsbG0tdG9vbGJveCByZXF1aXJlcyBAcGxheXdyaWdodC90ZXN0IGluIGRlcGVuZGVuY2llc1xuICAgICAgaWYgKCFoYXNBcnRpbGxlcnkgJiYgIWpzb25PYmouZGVwZW5kZW5jaWVzWydAcGxheXdyaWdodC90ZXN0J10pIHtcbiAgICAgICAgZGV2RGVwZW5kZW5jaWVzLnB1c2goJ0BwbGF5d3JpZ2h0L3Rlc3QnKTtcbiAgICAgIH1cbiAgICAgIGlmIChjb25maWcuZGVwZW5kaW5nLnBsYXl3cmlnaHRSdW50aW1lKSB7XG4gICAgICAgIC8vIFJ1bnRpbWUgaW1wb3J0cyBuZWVkIHRoZSBzdGFuZGFsb25lIHBhY2thZ2UgYWZ0ZXIgRG9ja2VyIHBydW5pbmcgcmVtb3ZlcyBkZXZEZXBlbmRlbmNpZXMuXG4gICAgICAgIGpzb25PYmouZGVwZW5kZW5jaWVzLnBsYXl3cmlnaHQgPz89XG4gICAgICAgICAganNvbk9iai5kZXZEZXBlbmRlbmNpZXMucGxheXdyaWdodCA/P1xuICAgICAgICAgIGpzb25PYmouZGVwZW5kZW5jaWVzWydAcGxheXdyaWdodC90ZXN0J10gPz9cbiAgICAgICAgICBqc29uT2JqLmRldkRlcGVuZGVuY2llc1snQHBsYXl3cmlnaHQvdGVzdCddO1xuICAgICAgICBkZXBlbmRlbmNpZXMucHVzaCgncGxheXdyaWdodCcpO1xuICAgICAgICBkZWxldGUganNvbk9iai5kZXZEZXBlbmRlbmNpZXMucGxheXdyaWdodDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGRlbGV0ZSBqc29uT2JqLmRlcGVuZGVuY2llcy5wbGF5d3JpZ2h0O1xuICAgICAgICBkZWxldGUganNvbk9iai5kZXZEZXBlbmRlbmNpZXMucGxheXdyaWdodDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoY29uZmlnLmRvZXNDb250YWluU3ViUGFja2FnZUpzb25zKSB7XG4gICAgICAvLyBXZSBkb24ndCBhbGxvdyBub24tYXJyYXkgd29ya3NwYWNlcyBpbiBtb25vcmVwby4gWWFybiB2MSdzIG9iamVjdCBmb3JtIGtlZXBzIGl0c1xuICAgICAgLy8gZGVjbGFyZWQgcGF0dGVybnMgKHdvcmtzcGFjZXMucGFja2FnZXMpOyBvbmx5IGV4dHJhcyBzdWNoIGFzIG5vaG9pc3QgYXJlIGRyb3BwZWQuXG4gICAgICAvLyBGb3JjZSBgcGFja2FnZXMvKmAgb25seSB3aGVuIGl0IGFjdHVhbGx5IG1hdGNoZXMgYSB3b3Jrc3BhY2UgbWFuaWZlc3Q6IGFuIGFwcHMvKi1vbmx5XG4gICAgICAvLyBtb25vcmVwbyBtdXN0IG5vdCBnZXQgYSBuZXZlci1tYXRjaGluZyBwYXR0ZXJuIGFwcGVuZGVkIHRvIGl0cyBkZWNsYXJhdGlvbi4gQVxuICAgICAgLy8gYmFzZWxpbmUtc2VlZGluZyBkZWNsYXJhdGlvbiBuZWVkcyBubyBmb3JjZWQgcGF0dGVybiBhdCBhbGwg4oCUIHRoZSBzZWVkZWQgYmFzZWxpbmVcbiAgICAgIC8vIChgKi8qYCBvciBgKipgKSBhbHJlYWR5IGNvdmVycyBwYWNrYWdlcy8qLiBUaGUgZm9yY2VkIHBhdHRlcm4gaXMgUFJFUEVOREVEOiBCdW5cbiAgICAgIC8vIGV2YWx1YXRlcyB3b3Jrc3BhY2UgcGF0dGVybnMgc2VxdWVudGlhbGx5LCBzbyBhIHBvc2l0aXZlIHBhdHRlcm4gcGxhY2VkIGFmdGVyIGEgdXNlclxuICAgICAgLy8gbmVnYXRpb24gd291bGQgcmUtaW5jbHVkZSB0aGUgbmVnYXRlZCBwYWNrYWdlcy4gQSBkZWNsYXJhdGlvbiB0aGF0IGFscmVhZHkgY292ZXJzXG4gICAgICAvLyBwYWNrYWdlcy8qIHVuZGVyIG5vcm1hbGl6YXRpb24gKGUuZy4gYC4vcGFja2FnZXMvKmApIGlzIGtlcHQgdmVyYmF0aW06IGZvcmNpbmcgYSB0ZXh0dWFsXG4gICAgICAvLyBgcGFja2FnZXMvKmAgbmV4dCB0byBpdCB3b3VsZCBwZXJzaXN0IGEgZHVwbGljYXRlIGVxdWl2YWxlbnQgcGF0dGVybi5cbiAgICAgIGNvbnN0IGZvcmNlZFBhdHRlcm5zID1cbiAgICAgICAgIWhhc0ltcGxpY2l0V29ya3NwYWNlQmFzZWxpbmUoanNvbk9iai53b3Jrc3BhY2VzKSAmJlxuICAgICAgICAhaGFzRGVjbGFyZWRQYWNrYWdlc1N0YXJQYXR0ZXJuKGpzb25PYmoud29ya3NwYWNlcykgJiZcbiAgICAgICAgZmcuZ2xvYlN5bmMoJ3BhY2thZ2VzLyovcGFja2FnZS5qc29uJywgeyBjd2Q6IGNvbmZpZy5kaXJQYXRoLCBpZ25vcmU6IFsnKiovbm9kZV9tb2R1bGVzLyoqJ10gfSkubGVuZ3RoID4gMFxuICAgICAgICAgID8gWydwYWNrYWdlcy8qJ11cbiAgICAgICAgICA6IFtdO1xuICAgICAganNvbk9iai53b3Jrc3BhY2VzID0gbWVyZ2UuYWxsKFtmb3JjZWRQYXR0ZXJucywgZ2V0RGVjbGFyZWRXb3Jrc3BhY2VQYXR0ZXJucyhqc29uT2JqLndvcmtzcGFjZXMpXSwge1xuICAgICAgICBhcnJheU1lcmdlOiBjb21iaW5lTWVyZ2UsXG4gICAgICB9KTtcbiAgICAgIC8vIEJvdGggaW5wdXRzIGNhbiBiZSBlbXB0eSAoZS5nLiBwYWNrYWdlcy9wYWNrYWdlLmpzb24gd2l0aG91dCBhbnkgcGFja2FnZXMvKi9wYWNrYWdlLmpzb25cbiAgICAgIC8vIGFuZCBubyBkZWNsYXJlZCB3b3Jrc3BhY2VzKTsgZG8gbm90IHBlcnNpc3QgYSBtZWFuaW5nbGVzcyBgd29ya3NwYWNlczogW11gLlxuICAgICAgaWYgKEFycmF5LmlzQXJyYXkoanNvbk9iai53b3Jrc3BhY2VzKSAmJiBqc29uT2JqLndvcmtzcGFjZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIGRlbGV0ZSBqc29uT2JqLndvcmtzcGFjZXM7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChBcnJheS5pc0FycmF5KGpzb25PYmoud29ya3NwYWNlcykpIHtcbiAgICAgIGpzb25PYmoud29ya3NwYWNlcyA9IGpzb25PYmoud29ya3NwYWNlcy5maWx0ZXIoXG4gICAgICAgICh3b3Jrc3BhY2UpID0+XG4gICAgICAgICAgZmcuZ2xvYlN5bmMod29ya3NwYWNlLCB7XG4gICAgICAgICAgICBkb3Q6IHRydWUsXG4gICAgICAgICAgICBjd2Q6IGNvbmZpZy5kaXJQYXRoLFxuICAgICAgICAgICAgaWdub3JlOiBnbG9iSWdub3JlLFxuICAgICAgICAgIH0pLmxlbmd0aCA+IDBcbiAgICAgICk7XG4gICAgICBpZiAoanNvbk9iai53b3Jrc3BhY2VzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICBkZWxldGUganNvbk9iai53b3Jrc3BhY2VzO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8vIGZpeGVycy9uZXh0Q29uZmlnLnRzIGVuYWJsZXMgYHJlYWN0Q29tcGlsZXI6IHRydWVgIGZvciBldmVyeSBOZXh0LmpzIHByb2plY3QsIGFuZCBOZXh0LmpzXG4gIC8vIHJlc29sdmVzIGBiYWJlbC1wbHVnaW4tcmVhY3QtY29tcGlsZXJgIGF0IGJ1aWxkIHRpbWUgd2hlbiBSZWFjdCBDb21waWxlciBpcyBvbi4gQWRkIGl0IGhlcmUgc29cbiAgLy8gdGhlIG1hbmFnZWQgbmV4dC5jb25maWcgbmV2ZXIgYnJlYWtzIGBuZXh0IGJ1aWxkYCB3aXRoIGFuIHVucmVzb2x2ZWQtcGFja2FnZSBlcnJvci5cbiAgaWYgKGNvbmZpZy5kZXBlbmRpbmcubmV4dCkge1xuICAgIGRldkRlcGVuZGVuY2llcy5wdXNoKCdiYWJlbC1wbHVnaW4tcmVhY3QtY29tcGlsZXInKTtcbiAgfVxuXG4gIC8vIGB3YiB2ZXJpZnkgLS1mdWxsYCBhdWRpdHMgZXZlcnkgYCouc2xpZGV2Lm1kYCBkZWNrIHdpdGggc2xpZGV2LWNoZWNrLCBzbyB0aGUgY2hlY2tlciBoYXMgdG8gYmVcbiAgLy8gaW5zdGFsbGVkIHdoZXJldmVyIGEgZGVjayBsaXZlcy5cbiAgaWYgKGNvbmZpZy5kb2VzQ29udGFpblNsaWRldk1kKSB7XG4gICAgZGV2RGVwZW5kZW5jaWVzLnB1c2goJ3NsaWRldi1jaGVjaycpO1xuICB9XG5cbiAgaWYgKCFpc1diUGFja2FnZShqc29uT2JqKSkge1xuICAgIC8vIEEgYHdvcmtzcGFjZTpgIHNwZWNpZmllciBkZXBlbmRzIG9uIHRoZSB3YiBkZXZlbG9wZWQgaW4gdGhpcyByZXBvc2l0b3J5IChlLmcuXG4gICAgLy8gV2lsbEJvb3N0ZXIvc2hhcmVkIGl0c2VsZik7IGluc3RhbGxpbmcgdGhlIGxhdGVzdCByZWdpc3RyeSByZWxlYXNlIG92ZXIgaXQgd291bGQgc2lsZW50bHlcbiAgICAvLyByZXBsYWNlIHRoZSBsb2NhbCBidWlsZCB3aXRoIGEgcHVibGlzaGVkIG9uZSwgc28gbGVhdmUgc3VjaCBhIGRlY2xhcmF0aW9uIHVudG91Y2hlZC5cbiAgICBjb25zdCB3YlNwZWNpZmllciA9IGpzb25PYmouZGVwZW5kZW5jaWVzW3diRGVwZW5kZW5jeV0gPz8ganNvbk9iai5kZXZEZXBlbmRlbmNpZXNbd2JEZXBlbmRlbmN5XTtcbiAgICBpZiAoIXdiU3BlY2lmaWVyPy5zdGFydHNXaXRoKCd3b3Jrc3BhY2U6JykpIHtcbiAgICAgIGlmIChzaG91bGRLZWVwV2JBc1J1bnRpbWVEZXBlbmRlbmN5KGpzb25PYmopKSB7XG4gICAgICAgIGRlcGVuZGVuY2llcy5wdXNoKHdiRGVwZW5kZW5jeSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBkZXZEZXBlbmRlbmNpZXMucHVzaCh3YkRlcGVuZGVuY3kpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICAvLyBidWlsZC10cyBvd25zIFR5cGVTY3JpcHQgZXhlY3V0aW9uIGFuZCBkZWNsYXJhdGlvbiBlbWl0LiB3YmZ5IG11c3QgYWx3YXlzXG4gIC8vIGtlZXAgZXhpc3RpbmcgYnVpbGQtdHMgdXNlcnMgY3VycmVudCBiZWNhdXNlIG9sZGVyIHJlbGVhc2VzIGNhbiBlbWl0IC5kLnRzXG4gIC8vIGZpbGVzIGF0IHBhdGhzIHRoYXQgbm8gbG9uZ2VyIG1hdGNoIHBhY2thZ2UgZXhwb3J0cy5cbiAgaWYgKFxuICAgIGpzb25PYmouZGVwZW5kZW5jaWVzW2J1aWxkVHNEZXBlbmRlbmN5XSB8fFxuICAgIGpzb25PYmouZGV2RGVwZW5kZW5jaWVzW2J1aWxkVHNEZXBlbmRlbmN5XSB8fFxuICAgIE9iamVjdC52YWx1ZXMoanNvbk9iai5zY3JpcHRzKS5zb21lKChzY3JpcHQpID0+IHNjcmlwdD8uaW5jbHVkZXMoYnVpbGRUc0RlcGVuZGVuY3kpKVxuICApIHtcbiAgICBpZiAoc2hvdWxkS2VlcEJ1aWxkVHNBc1J1bnRpbWVEZXBlbmRlbmN5KGpzb25PYmopKSB7XG4gICAgICBkZXBlbmRlbmNpZXMucHVzaChidWlsZFRzRGVwZW5kZW5jeSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGRldkRlcGVuZGVuY2llcy5wdXNoKGJ1aWxkVHNEZXBlbmRlbmN5KTtcbiAgICB9XG4gIH1cbiAgaWYgKGRvZXNDb250YWluSnNPclRzKGNvbmZpZykpIHtcbiAgICBkZXZEZXBlbmRlbmNpZXMucHVzaCguLi5veGxpbnREZXBzKTtcbiAgfVxuXG4gIGNvbnN0IHRzY29uZmlnQmFzZURlcGVuZGVuY2llcyA9IGRvZXNDb250YWluSnNPclRzKGNvbmZpZykgPyBnZXRUc2NvbmZpZ0Jhc2VEZXBlbmRlbmNpZXMoY29uZmlnKSA6IFtdO1xuICBhd2FpdCByZW1vdmVVbnVzZWRUc2NvbmZpZ0Jhc2VEZXBlbmRlbmNpZXMoY29uZmlnLCBqc29uT2JqLCB0c2NvbmZpZ0Jhc2VEZXBlbmRlbmNpZXMpO1xuICBkZXZEZXBlbmRlbmNpZXMucHVzaCguLi50c2NvbmZpZ0Jhc2VEZXBlbmRlbmNpZXMpO1xuXG4gIGlmIChjb25maWcuZG9lc0NvbnRhaW5UeXBlU2NyaXB0IHx8IGNvbmZpZy5kb2VzQ29udGFpblR5cGVTY3JpcHRJblBhY2thZ2VzKSB7XG4gICAgLy8gVHlwZVNjcmlwdCA3IHNoaXBzIHRoZSBuYXRpdmUgY29tcGlsZXIgYXMgdGhlIGB0eXBlc2NyaXB0YCBwYWNrYWdlLCBzbyBpdCBpc1xuICAgIC8vIG5vdyB0aGUgbWFuYWdlZCBjb21waWxlciBmb3IgZXZlcnkgVHlwZVNjcmlwdCByZXBvICh0eXBlY2hlY2tpbmcgcnVucyBgdHNjYCkuXG4gICAgZGV2RGVwZW5kZW5jaWVzLnB1c2godHlwZXNjcmlwdERlcGVuZGVuY3kpO1xuICAgIC8vIE5leHQuanMncyBgbmV4dCBidWlsZGAgaW5zcGVjdHMgYEB0eXBlc2NyaXB0L25hdGl2ZS1wcmV2aWV3YCAodHNnbykgdG8gcnVuIGl0cyB0eXBlXG4gICAgLy8gY2hlY2s7IHRoZSBgdHlwZXNjcmlwdGAgdjcgcGFja2FnZSBhbG9uZSBsYWNrcyB0aGUgQVBJIG5leHQgbmVlZHMsIHNvIGtlZXAgYm90aFxuICAgIC8vIGluc3RhbGxlZCBmb3IgTmV4dC5qcy1mYW1pbHkgcmVwb3MuIFNlZSB0aGUgdHlwZXNjcmlwdEdvRGVwZW5kZW5jeSBjb21tZW50IGFib3ZlLlxuICAgIGlmIChjb25maWcuZGVwZW5kaW5nLm5leHQgfHwgY29uZmlnLmRlcGVuZGluZy5ibGl0eiB8fCBjb25maWcuZGVwZW5kaW5nLnZpbmV4dCkge1xuICAgICAgZGV2RGVwZW5kZW5jaWVzLnB1c2godHlwZXNjcmlwdEdvRGVwZW5kZW5jeSk7XG4gICAgfVxuICAgIC8vIFJlYWN0IE5hdGl2ZSByZWxpZXMgb24gQHRzY29uZmlnL3JlYWN0LW5hdGl2ZSdzIGFtYmllbnQgdHlwZXMgaW5zdGVhZCBvZiBAdHlwZXMvYnVuLlxuICAgIGlmICghY29uZmlnLmRlcGVuZGluZy5yZWFjdE5hdGl2ZSkge1xuICAgICAgZGV2RGVwZW5kZW5jaWVzLnB1c2goJ0B0eXBlcy9idW4nKTtcbiAgICB9XG4gICAgaWYgKFxuICAgICAganNvbk9iai5kZXBlbmRlbmNpZXMuamVzdCB8fFxuICAgICAganNvbk9iai5kZXZEZXBlbmRlbmNpZXMuamVzdCB8fFxuICAgICAganNvbk9iai5kZXBlbmRlbmNpZXNbJ0BqZXN0L2dsb2JhbHMnXSB8fFxuICAgICAganNvbk9iai5kZXZEZXBlbmRlbmNpZXNbJ0BqZXN0L2dsb2JhbHMnXSB8fFxuICAgICAganNvbk9iai5kZXBlbmRlbmNpZXNbJ3RzLWplc3QnXSB8fFxuICAgICAganNvbk9iai5kZXZEZXBlbmRlbmNpZXNbJ3RzLWplc3QnXVxuICAgICkge1xuICAgICAgZGV2RGVwZW5kZW5jaWVzLnB1c2goJ0B0eXBlcy9qZXN0Jyk7XG4gICAgfVxuICB9XG5cbiAgaWYgKGNvbmZpZy5pc1dpbGxCb29zdGVyQ29uZmlncykge1xuICAgIHJldHVybiB7XG4gICAgICBkZXBlbmRlbmNpZXM6IGRlcGVuZGVuY2llcy5maWx0ZXIoKGRlcCkgPT4gIWRlcC5pbmNsdWRlcygnQHdpbGxib29zdGVyLycpKSxcbiAgICAgIGRldkRlcGVuZGVuY2llczogZGV2RGVwZW5kZW5jaWVzLmZpbHRlcigoZGVwKSA9PiAhZGVwLmluY2x1ZGVzKCdAd2lsbGJvb3N0ZXIvJykpLFxuICAgICAgcHl0aG9uRGV2RGVwZW5kZW5jaWVzLFxuICAgIH07XG4gIH1cblxuICByZXR1cm4geyBkZXBlbmRlbmNpZXMsIGRldkRlcGVuZGVuY2llcywgcHl0aG9uRGV2RGVwZW5kZW5jaWVzIH07XG59XG5cbmZ1bmN0aW9uIGRvZXNSZWxlYXNlU2NyaXB0SW5zdGFsbFNlbWFudGljUmVsZWFzZShzY3JpcHQ6IHVua25vd24pOiBib29sZWFuIHtcbiAgaWYgKHR5cGVvZiBzY3JpcHQgIT09ICdzdHJpbmcnKSByZXR1cm4gZmFsc2U7XG4gIHJldHVybiAvXFxiKD86YnVueHxucHh8cG5wbVxccytkbHh8eWFyblxccytkbHgpXFxzK3NlbWFudGljLXJlbGVhc2UoPzpAXFxTKyk/XFxiL3UudGVzdChzY3JpcHQpO1xufVxuXG5mdW5jdGlvbiBtb3ZlTWFuYWdlZFRvb2xEZXBlbmRlbmNpZXNUb0RldkRlcGVuZGVuY2llcyhqc29uT2JqOiBXcml0YWJsZVBhY2thZ2VKc29uKTogdm9pZCB7XG4gIGZvciAoY29uc3QgW2RlcGVuZGVuY3ksIGtlZXBBc1J1bnRpbWVdIG9mIFtcbiAgICBbd2JEZXBlbmRlbmN5LCBzaG91bGRLZWVwV2JBc1J1bnRpbWVEZXBlbmRlbmN5KGpzb25PYmopXSxcbiAgICBbYnVpbGRUc0RlcGVuZGVuY3ksIHNob3VsZEtlZXBCdWlsZFRzQXNSdW50aW1lRGVwZW5kZW5jeShqc29uT2JqKV0sXG4gIF0gYXMgY29uc3QpIHtcbiAgICBpZiAoa2VlcEFzUnVudGltZSkge1xuICAgICAgY29uc3QgZGV2VmVyc2lvbiA9IGpzb25PYmouZGV2RGVwZW5kZW5jaWVzW2RlcGVuZGVuY3ldO1xuICAgICAgaWYgKCFkZXZWZXJzaW9uKSBjb250aW51ZTtcbiAgICAgIGNvbnN0IHJ1bnRpbWVWZXJzaW9uID0ganNvbk9iai5kZXBlbmRlbmNpZXNbZGVwZW5kZW5jeV07XG4gICAgICBpZiAoIXJ1bnRpbWVWZXJzaW9uIHx8IGlzTmV3ZXJQYWNrYWdlVmVyc2lvbihkZXZWZXJzaW9uLCBydW50aW1lVmVyc2lvbikpIHtcbiAgICAgICAganNvbk9iai5kZXBlbmRlbmNpZXNbZGVwZW5kZW5jeV0gPSBkZXZWZXJzaW9uO1xuICAgICAgfVxuICAgICAgZGVsZXRlIGpzb25PYmouZGV2RGVwZW5kZW5jaWVzW2RlcGVuZGVuY3ldO1xuICAgIH0gZWxzZSBpZiAoanNvbk9iai5kZXBlbmRlbmNpZXNbZGVwZW5kZW5jeV0pIHtcbiAgICAgIGpzb25PYmouZGV2RGVwZW5kZW5jaWVzW2RlcGVuZGVuY3ldID8/PSBqc29uT2JqLmRlcGVuZGVuY2llc1tkZXBlbmRlbmN5XTtcbiAgICAgIGRlbGV0ZSBqc29uT2JqLmRlcGVuZGVuY2llc1tkZXBlbmRlbmN5XTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gc2hvdWxkS2VlcFdiQXNSdW50aW1lRGVwZW5kZW5jeShqc29uT2JqOiBQYWNrYWdlSnNvbik6IGJvb2xlYW4ge1xuICAvLyBQcm9kdWN0aW9uIGltYWdlcyBydW4gbWlncmF0aW9ucyBhZnRlciBkZXZEZXBlbmRlbmNpZXMgYXJlIHBydW5lZCwganVzdCBhcyBwYWNrYWdlIG1hbmFnZXJzXG4gIC8vIHJ1biBwb3N0aW5zdGFsbCBkdXJpbmcgcHJvZHVjdGlvbiBpbnN0YWxscywgc28gYm90aCBlbnRyeSBwb2ludHMgbXVzdCByZXRhaW4gdGhlIHdiIGJpbmFyeS5cbiAgLy8gS2VlcCB0aGUgd29yZCBtYXRjaCBjb25zZXJ2YXRpdmU6IHN1cHBvcnRlZCBjdXN0b20gd3JhcHBlcnMgY2FuIHB1dCB3YiBpbnNpZGUgc2hlbGwgbG9vcHMgdGhhdFxuICAvLyB0aGUgY29tbWFuZC1wb3NpdGlvbiBwYXJzZXIgY2Fubm90IGNsYXNzaWZ5LCB3aGlsZSBhIGZhbHNlIHBvc2l0aXZlIG9ubHkgcmV0YWlucyB0aGUgQ0xJLlxuICByZXR1cm4gW2pzb25PYmouc2NyaXB0cz8ucG9zdGluc3RhbGwsIGpzb25PYmouc2NyaXB0cz8uWydkYi1taWdyYXRlJ11dLnNvbWUoXG4gICAgKHNjcmlwdCkgPT4gdHlwZW9mIHNjcmlwdCA9PT0gJ3N0cmluZycgJiYgL1xcYndiXFxiL3UudGVzdChzY3JpcHQpXG4gICk7XG59XG5cbmZ1bmN0aW9uIHNob3VsZEtlZXBCdWlsZFRzQXNSdW50aW1lRGVwZW5kZW5jeShqc29uT2JqOiBQYWNrYWdlSnNvbik6IGJvb2xlYW4ge1xuICBjb25zdCBwcmlzbWEgPSBqc29uT2JqLnByaXNtYSBhcyB7IHNlZWQ/OiB1bmtub3duIH0gfCB1bmRlZmluZWQ7XG4gIHJldHVybiBkb2VzU2VlZENvbW1hbmRVc2VCdWlsZFRzKHByaXNtYT8uc2VlZCkgfHwgZG9lc1NlZWRDb21tYW5kVXNlQnVpbGRUcyhqc29uT2JqLnNjcmlwdHM/LnNlZWQpO1xufVxuXG5mdW5jdGlvbiBkb2VzU2VlZENvbW1hbmRVc2VCdWlsZFRzKHNlZWRDb21tYW5kOiB1bmtub3duKTogYm9vbGVhbiB7XG4gIC8vIFByb2R1Y3Rpb24gRG9ja2VyIGltYWdlcyBydW4gc2VlZCBzY3JpcHRzIGFmdGVyIGRldkRlcGVuZGVuY2llcyBhcmUgcHJ1bmVkLFxuICAvLyBzbyBUeXBlU2NyaXB0IHNlZWQgcnVubmVycyBtdXN0IHJlbWFpbiBhdmFpbGFibGUgYXQgcnVudGltZS5cbiAgcmV0dXJuIHR5cGVvZiBzZWVkQ29tbWFuZCA9PT0gJ3N0cmluZycgJiYgLyg/PCFbXFx3LV0pYnVpbGQtdHMoPyFbXFx3LV0pL3UudGVzdChzZWVkQ29tbWFuZCk7XG59XG5cbmNvbnN0IGRlcGVuZGVuY3lEZWNsYXJhdGlvblNlY3Rpb25zID0gW1xuICAnZGVwZW5kZW5jaWVzJyxcbiAgJ2RldkRlcGVuZGVuY2llcycsXG4gICdvcHRpb25hbERlcGVuZGVuY2llcycsXG4gICdwZWVyRGVwZW5kZW5jaWVzJyxcbl0gYXMgY29uc3Q7XG5cbi8qKlxuICogRm9yY2VzIHN0b3JlLWluY29tcGF0aWJsZSBwYWNrYWdlcyB0byBzdGF5IHByb2plY3QtbG9jYWwgd2hlbiB0aGUgZ2VuZXJhdGVkIGJ1bmZpZy50b21sIGVuYWJsZXNcbiAqIEJ1bidzIGdsb2JhbCBzdG9yZTogYGNoYWtyYSB0eXBlZ2VuYCAocnVuIGJ5IGB3YiBnZW4tY29kZWApXG4gKiB3cml0ZXMgZ2VuZXJhdGVkIHR5cGVzIGludG8gdGhlIGluc3RhbGxlZCBAY2hha3JhLXVpL3JlYWN0IHBhY2thZ2UsIHdoaWNoIHdvdWxkIG90aGVyd2lzZVxuICogbXV0YXRlIHRoZSBtYWNoaW5lLXdpZGUgc3RvcmUgc2hhcmVkIGFjcm9zcyByZXBvc2l0b3JpZXMsIGFuZCBkcml6emxlLWtpdCByZXF1aXJlcyBkcml6emxlLW9ybVxuICogd2l0aG91dCBkZWNsYXJpbmcgaXQsIHdoaWNoIHRoZSBzdG9yZSByZWFscGF0aCBwbGFjZXMgYmV5b25kIGEgcGxhaW4gbm9kZV9tb2R1bGVzIHdhbGstdXAuXG4gKiBMaXN0aW5nIHRoZW0gaW4gYHRydXN0ZWREZXBlbmRlbmNpZXNgIG1ha2VzIEJ1biBtYXRlcmlhbGl6ZSBhIHBlci1wcm9qZWN0IGNvcHkgdW5kZXJcbiAqIGBub2RlX21vZHVsZXMvLmJ1bi9gLCB3aG9zZSBzaWJsaW5nIGBub2RlX21vZHVsZXMvLmJ1bi9ub2RlX21vZHVsZXMvYCBsaW5rcyBldmVyeSBpbnN0YWxsZWRcbiAqIHBhY2thZ2UgYW5kIHRoZXJlZm9yZSByZXNvbHZlcyB0aGUgdW5kZWNsYXJlZCByZXF1aXJlcy5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gZW5zdXJlVHJ1c3RlZERlcGVuZGVuY2llcyhjb25maWc6IFBhY2thZ2VDb25maWcsIGpzb25PYmo6IFdyaXRhYmxlUGFja2FnZUpzb24pOiBQcm9taXNlPHZvaWQ+IHtcbiAgLy8gQnVuIGNvbnN1bHRzIHRydXN0ZWREZXBlbmRlbmNpZXMgaW4gdGhlIHdvcmtzcGFjZSByb290J3MgcGFja2FnZS5qc29uIG9ubHksIHNvIHRoZSBsaXN0IGlzXG4gIC8vIG1hbmFnZWQgdGhlcmUgYW5kIG11c3QgY292ZXIgZGVwZW5kZW5jaWVzIGRlY2xhcmVkIGFueXdoZXJlIGluIHRoZSByZXBvc2l0b3J5LlxuICBpZiAoIWNvbmZpZy5pc1Jvb3QpIHJldHVybjtcbiAgY29uc3QgYnVuSnNvbk9iaiA9IGpzb25PYmogYXMgV3JpdGFibGVQYWNrYWdlSnNvbiAmIHsgdHJ1c3RlZERlcGVuZGVuY2llcz86IHN0cmluZ1tdIH07XG4gIC8vIEJ1biBpbnN0YWxscyBvcHRpb25hbCBhbmQgcGVlciBkZXBlbmRlbmNpZXMgYnkgZGVmYXVsdCwgc28gYWxsIGRlY2xhcmF0aW9uIHNlY3Rpb25zIGNvdW50LlxuICAvLyBFdmVyeSBkZWNsYXJlZCByYW5nZSBpcyBrZXB0IHBlciBwYWNrYWdlOiBhIHJvb3QgZGVjbGFyYXRpb24gbXVzdCBub3QgbWFzayBhIHdvcmtzcGFjZSBvbmVcbiAgLy8gKGUuZy4gcm9vdCBAY2hha3JhLXVpL2NsaSB2MiBhbG9uZ3NpZGUgYSB3b3Jrc3BhY2Ugb24gdjMpLlxuICBjb25zdCBkZWNsYXJlZERlcGVuZGVuY2llcyA9IG5ldyBNYXA8c3RyaW5nLCBzdHJpbmdbXT4oKTtcbiAgY29uc3QgYWRkRGVjbGFyZWREZXBlbmRlbmNpZXMgPSAocGFja2FnZUpzb246IFBhY2thZ2VKc29uKTogdm9pZCA9PiB7XG4gICAgZm9yIChjb25zdCBzZWN0aW9uIG9mIGRlcGVuZGVuY3lEZWNsYXJhdGlvblNlY3Rpb25zKSB7XG4gICAgICBmb3IgKGNvbnN0IFtkZXBlbmRlbmN5TmFtZSwgdmVyc2lvblJhbmdlXSBvZiBPYmplY3QuZW50cmllcyhwYWNrYWdlSnNvbltzZWN0aW9uXSA/PyB7fSkpIHtcbiAgICAgICAgaWYgKHR5cGVvZiB2ZXJzaW9uUmFuZ2UgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgY29uc3QgdmVyc2lvblJhbmdlcyA9IGRlY2xhcmVkRGVwZW5kZW5jaWVzLmdldChkZXBlbmRlbmN5TmFtZSk7XG4gICAgICAgICAgaWYgKHZlcnNpb25SYW5nZXMpIHtcbiAgICAgICAgICAgIHZlcnNpb25SYW5nZXMucHVzaCh2ZXJzaW9uUmFuZ2UpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBkZWNsYXJlZERlcGVuZGVuY2llcy5zZXQoZGVwZW5kZW5jeU5hbWUsIFt2ZXJzaW9uUmFuZ2VdKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH07XG4gIGFkZERlY2xhcmVkRGVwZW5kZW5jaWVzKGpzb25PYmopO1xuICBmb3IgKGNvbnN0IHBhY2thZ2VKc29uUGF0aCBvZiBnZXRXb3Jrc3BhY2VQYWNrYWdlSnNvblBhdGhzKGNvbmZpZykpIHtcbiAgICB0cnkge1xuICAgICAgYWRkRGVjbGFyZWREZXBlbmRlbmNpZXMoXG4gICAgICAgIEpTT04ucGFyc2UoYXdhaXQgZnMucHJvbWlzZXMucmVhZEZpbGUocGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCBwYWNrYWdlSnNvblBhdGgpLCAndXRmOCcpKSBhcyBQYWNrYWdlSnNvblxuICAgICAgKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIGlnbm9yZSB1bnJlYWRhYmxlIHdvcmtzcGFjZSBwYWNrYWdlLmpzb25cbiAgICB9XG4gIH1cbiAgLy8gT25seSBAY2hha3JhLXVpL2NsaSB2MydzIGBjaGFrcmEgdHlwZWdlbmAgd3JpdGVzIGludG8gdGhlIGluc3RhbGxlZCBAY2hha3JhLXVpL3JlYWN0O1xuICAvLyB2MidzIGBjaGFrcmEtY2xpIHRva2Vuc2Agd3JpdGVzIGludG8gQGNoYWtyYS11aS9zdHlsZWQtc3lzdGVtIGluc3RlYWQsIHNvIHRydXN0aW5nXG4gIC8vIEBjaGFrcmEtdWkvcmVhY3QgdGhlcmUgd291bGQgZm9yY2UgYSB1c2VsZXNzIHByb2plY3QtbG9jYWwgY29weSB3aXRob3V0IGZpeGluZyBnZW4tY29kZS5cbiAgLy8gTWlycm9yIHdiIGdlbi1jb2RlJ3MgY2xhc3NpZmljYXRpb246IG9ubHkgYSByYW5nZSB3aG9zZSBsZWFkaW5nIG1ham9yIHBhcnNlcyB0byAyIHNlbGVjdHMgdGhlXG4gIC8vIHYyIGNvbW1hbmQsIHNvIGRpZ2l0bGVzcyBzcGVjcyBsaWtlIGBsYXRlc3RgIG9yIGNhdGFsb2cgcmVmZXJlbmNlcyBjb3VudCBhcyB2My5cbiAgY29uc3QgaGFzQ2hha3JhQ2xpVjMgPSAoZGVjbGFyZWREZXBlbmRlbmNpZXMuZ2V0KCdAY2hha3JhLXVpL2NsaScpID8/IFtdKS5zb21lKFxuICAgICh2ZXJzaW9uUmFuZ2UpID0+IC9cXGQrL3UuZXhlYyh2ZXJzaW9uUmFuZ2UpPy5bMF0gIT09ICcyJ1xuICApO1xuICBjb25zdCByZXF1aXJlZFdiZnlQYWNrYWdlcyA9IFtcbiAgICAuLi4oaGFzQ2hha3JhQ2xpVjMgJiYgZGVjbGFyZWREZXBlbmRlbmNpZXMuaGFzKCdAY2hha3JhLXVpL3JlYWN0JykgPyBbJ0BjaGFrcmEtdWkvcmVhY3QnXSA6IFtdKSxcbiAgICAuLi4oZGVjbGFyZWREZXBlbmRlbmNpZXMuaGFzKCdkcml6emxlLWtpdCcpID8gWydkcml6emxlLWtpdCddIDogW10pLFxuICAgIC8vIFRoZXNlIGdpdC1kZXBlbmRlbmN5IGJ1aWxkcyBpbXBvcnQgcGFja2FnZXMgdGhleSBkbyBub3QgZGVjbGFyZSAoZS5nLiB6b2QpLCB3aGljaCB0aGVcbiAgICAvLyBnbG9iYWwtc3RvcmUgbGF5b3V0IHBsYWNlcyBiZXlvbmQgdGhlaXIgd2Fsay11cDsgYSBwcm9qZWN0LWxvY2FsIGNvcHkgdW5kZXJcbiAgICAvLyBub2RlX21vZHVsZXMvLmJ1biByZXNvbHZlcyB0aGVtIChvYnNlcnZlZCBpbiBXaWxsQm9vc3Rlci9wcm9tcHQtc3R1ZHkpLlxuICAgIC4uLihkZWNsYXJlZERlcGVuZGVuY2llcy5oYXMoJ0B3aWxsYm9vc3Rlci9qdWRnZScpID8gWydAd2lsbGJvb3N0ZXIvanVkZ2UnXSA6IFtdKSxcbiAgICAuLi4oZGVjbGFyZWREZXBlbmRlbmNpZXMuaGFzKCdAd2lsbGJvb3N0ZXIvbGxtLXByb3h5JykgPyBbJ0B3aWxsYm9vc3Rlci9sbG0tcHJveHknXSA6IFtdKSxcbiAgICAvLyBibGl0eiBhbmQgQGJsaXR6anMvYXV0aCByZXF1aXJlIHJlYWN0IChhbmQgb3RoZXIgcGVlcnMpIHdpdGhvdXQgZGVjbGFyaW5nIHRoZW0sIHJlbHlpbmcgb25cbiAgICAvLyBob2lzdGluZywgd2hpY2ggdGhlIGdsb2JhbC1zdG9yZSBsYXlvdXQgcGxhY2VzIGJleW9uZCB0aGVpciB3YWxrLXVwIChvYnNlcnZlZCBpblxuICAgIC8vIFdpbGxCb29zdGVyL3N1cnZleS1zeXN0ZW06IGBuZXh0IGJ1aWxkYCBwYWdlLWRhdGEgY29sbGVjdGlvbiBkaWVzIHdpdGggXCJDYW5ub3QgZmluZCBtb2R1bGVcbiAgICAvLyAncmVhY3QnXCIgZnJvbSBAYmxpdHpqcy9hdXRoKS4gQGJsaXR6anMvcnBjIGlzIE5PVCBsaXN0ZWQgYmVjYXVzZSBpdCBwcm9wZXJseSBkZWNsYXJlcyBpdHNcbiAgICAvLyByZWFjdC9AdGFuc3RhY2sgcGVlcnMsIHNvIEJ1biBsaW5rcyB0aGVtIGludG8gaXRzIHN0b3JlIGVudHJ5LiBAYmxpdHpqcy9uZXh0IGlzXG4gICAgLy8gZGVsaWJlcmF0ZWx5IE5PVCBsaXN0ZWQgZWl0aGVyOiB0cnVzdGluZyBpdCB3b3VsZCBydW4gaXRzIHBvc3RpbnN0YWxsIChgYmxpdHogY29kZWdlbmApLFxuICAgIC8vIHdoaWNoIHBhdGNoZXMgdGhlIGluc3RhbGxlZCBuZXh0IHBhY2thZ2UgaW4gcGxhY2Ug4oCUIHJlcG9zaXRvcmllcyBwYXRjaCBvdXQgdGhhdCBwb3N0aW5zdGFsbFxuICAgIC8vIHdpdGggYGJ1biBwYXRjaGAgaW5zdGVhZCwgd2hpY2ggYWxzbyBrZWVwcyB0aGUgcGFja2FnZSBwcm9qZWN0LWxvY2FsLlxuICAgIC4uLihkZWNsYXJlZERlcGVuZGVuY2llcy5oYXMoJ2JsaXR6JykgPyBbJ2JsaXR6J10gOiBbXSksXG4gICAgLi4uKGRlY2xhcmVkRGVwZW5kZW5jaWVzLmhhcygnQGJsaXR6anMvYXV0aCcpID8gWydAYmxpdHpqcy9hdXRoJ10gOiBbXSksXG4gICAgLy8gQnVuIGRvZXMgbm90IGxpbmsgQGhvb2tmb3JtL3Jlc29sdmVycycgT1BUSU9OQUwgdmFsaWRhdG9yIHBlZXJzIChlLmcuIHpvZCkgaW50byBpdHNcbiAgICAvLyBnbG9iYWwtc3RvcmUgZW50cnkgZXZlbiB3aGVuIHRoZSBwcm9qZWN0IGluc3RhbGxzIHRoZW0sIHNvIGl0cyBzZXJ2ZXItc2lkZVxuICAgIC8vIGBpbXBvcnQgJ3pvZCdgIGZhaWxzIGZyb20gdGhlIHN0b3JlIChvYnNlcnZlZCBpbiBXaWxsQm9vc3Rlci9zdXJ2ZXktc3lzdGVtKS5cbiAgICAuLi4oZGVjbGFyZWREZXBlbmRlbmNpZXMuaGFzKCdAaG9va2Zvcm0vcmVzb2x2ZXJzJykgPyBbJ0Bob29rZm9ybS9yZXNvbHZlcnMnXSA6IFtdKSxcbiAgICAvLyBAem9vbS9ydG1zIGluc3RhbGxzIGl0cyBuYXRpdmUgcnRtcy5ub2RlIGJpbmRpbmcgaW4gYSBsaWZlY3ljbGUgc2NyaXB0LiBXaXRob3V0IGV4cGxpY2l0XG4gICAgLy8gdHJ1c3QsIEJ1biBza2lwcyB0aGF0IHNjcmlwdCBhbmQgdGhlIHBhY2thZ2UgZmFpbHMgYXMgc29vbiBhcyB0aGUgWm9vbSBib3QgaW1wb3J0cyBpdFxuICAgIC8vIChvYnNlcnZlZCBpbiBXaWxsQm9vc3Rlci9zbWFydHNlLXpvb20tYm90KS5cbiAgICAuLi4oZGVjbGFyZWREZXBlbmRlbmNpZXMuaGFzKCdAem9vbS9ydG1zJykgPyBbJ0B6b29tL3J0bXMnXSA6IFtdKSxcbiAgXTtcblxuICAvLyB3YmZ5IGZ1bGx5IG93bnMgdGhpcyBmaWVsZDogYSBwYWNrYWdlIHdob3NlIGxpZmVjeWNsZSBzY3JpcHRzIG11c3QgcnVuIGdldHMgYWRkZWQgdG8gd2JmeVxuICAvLyBpdHNlbGYgaW5zdGVhZCBvZiB0byBpbmRpdmlkdWFsIHJlcG9zaXRvcmllcywgc28gdW5tYW5hZ2VkIGVudHJpZXMgYXJlIGFsd2F5cyByZW1vdmVkIOKAlFxuICAvLyBpbmNsdWRpbmcgYW4gZXhwbGljaXRseSBlbXB0eSBkZW55LWFsbCBsaXN0LCB3aG9zZSBkZWxldGlvbiBkZWxpYmVyYXRlbHkgcmVzdG9yZXMgQnVuJ3NcbiAgLy8gZGVmYXVsdCBhbGxvdy1saXN0ICh0aGUgb3duZXJzaGlwIHBvbGljeSBjaG9zZW4gaW4gIzk3NSkuXG4gIGNvbnN0IGV4aXN0aW5nVHJ1c3RlZCA9IGJ1bkpzb25PYmoudHJ1c3RlZERlcGVuZGVuY2llcztcbiAgaWYgKHJlcXVpcmVkV2JmeVBhY2thZ2VzLmxlbmd0aCA9PT0gMCkge1xuICAgIGlmIChleGlzdGluZ1RydXN0ZWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgLy8gRGVsZXRpbmcgdGhlIGZpZWxkIHJlc3RvcmVzIEJ1bidzIGZ1bGwgZGVmYXVsdCBhbGxvdy1saXN0LCBzbyBvbmx5IGVudHJpZXMgb3V0c2lkZSB0aGF0XG4gICAgICAvLyBsaXN0IGFjdHVhbGx5IGxvc2UgdGhlaXIgbGlmZWN5Y2xlIHNjcmlwdHMuXG4gICAgICB3YXJuQWJvdXRSZW1vdmVkVHJ1c3RlZERlcGVuZGVuY2llcyhjb25maWcsIGV4aXN0aW5nVHJ1c3RlZCwgbmV3IFNldCgpKTtcbiAgICAgIGRlbGV0ZSBidW5Kc29uT2JqLnRydXN0ZWREZXBlbmRlbmNpZXM7XG4gICAgfVxuICAgIHJldHVybjtcbiAgfVxuXG4gIC8vIEFuIGV4cGxpY2l0IHRydXN0ZWREZXBlbmRlbmNpZXMgbGlzdCBSRVBMQUNFUyBCdW4ncyBkZWZhdWx0IGFsbG93LWxpc3QgaW5zdGVhZCBvZiBleHRlbmRpbmdcbiAgLy8gaXQsIGFuZCBCdW4gcHJpbnRzIG5vIHdhcm5pbmcgZm9yIHRoZSBwb3N0aW5zdGFsbHMgaXQgY29uc2VxdWVudGx5IHNraXBzIChlLmcuIEByYWlsd2F5L2NsaVxuICAvLyBkb3dubG9hZHMgaXRzIGJpbmFyeSBpbiBwb3N0aW5zdGFsbCBhbmQgZXhpdHMgMSB3aXRob3V0IG9uZSkuIEluY2x1ZGUgdGhlIEVOVElSRSBkZWZhdWx0IGxpc3Q6XG4gIC8vIGVudHJpZXMgZm9yIHBhY2thZ2VzIHRoYXQgYXJlIG5vdCBpbnN0YWxsZWQgYXJlIGluZXJ0LCBhbmQgdGhpcyBpcyB0aGUgb25seSByZXByZXNlbnRhdGlvblxuICAvLyB0aGF0IHN0YXlzIGNvcnJlY3QgZm9yIHRyYW5zaXRpdmUgZGVwZW5kZW5jaWVzIHRoZSBmaW5hbCBgYnVuIGluc3RhbGxgIHJlc29sdmVzIGFmdGVyIHRoaXNcbiAgLy8gcnVucyDigJQgYW4gaW50ZXJzZWN0aW9uIHdpdGggYSBtaXNzaW5nIG9yIHN0YWxlIGxvY2tmaWxlIHdvdWxkIHNpbGVudGx5IGRyb3AgdGhlbS5cbiAgY29uc3QgZGVmYXVsdFRydXN0ZWREZXBlbmRlbmNpZXMgPSBnZXREZWZhdWx0VHJ1c3RlZERlcGVuZGVuY2llcyhjb25maWcpO1xuICAvLyBsZWZ0aG9vayBpcyBhcHBlbmRlZCBleHBsaWNpdGx5IHNvIHRoZSBkZWZhdWx0LWxpc3QgbG9va3VwIGZhaWxpbmcgY2Fubm90IGRyb3AgaXQ6IGl0IGlzXG4gIC8vIHJlcXVpcmVkIGluIGV2ZXJ5IG1hbmFnZWQgcmVwb3NpdG9yeS5cbiAgY29uc3QgbmV3VHJ1c3RlZFBhY2thZ2VzID0gbmV3IFNldChbXG4gICAgLi4ucmVxdWlyZWRXYmZ5UGFja2FnZXMsXG4gICAgbGVmdGhvb2tEZXBlbmRlbmN5LFxuICAgIC4uLihkZWZhdWx0VHJ1c3RlZERlcGVuZGVuY2llcyA/PyBbXSksXG4gIF0pO1xuICB3YXJuQWJvdXRSZW1vdmVkVHJ1c3RlZERlcGVuZGVuY2llcyhjb25maWcsIGV4aXN0aW5nVHJ1c3RlZCA/PyBbXSwgbmV3VHJ1c3RlZFBhY2thZ2VzKTtcbiAgYnVuSnNvbk9iai50cnVzdGVkRGVwZW5kZW5jaWVzID0gWy4uLm5ld1RydXN0ZWRQYWNrYWdlc10udG9Tb3J0ZWQoKTtcbn1cblxuLy8gVGhlIHBhY2thZ2VzIHdiZnkgaXRzZWxmIG1heSB3cml0ZSBpbnRvIHRydXN0ZWREZXBlbmRlbmNpZXM7IHRoZWlyIHJlbW92YWwgaXMgbWFuYWdlZCBjbGVhbnVwLFxuLy8gbmV2ZXIgYSBsb3NzIG9mIHVzZXIgcG9saWN5LlxuY29uc3Qgd2JmeU1hbmFnZWRUcnVzdGVkRGVwZW5kZW5jaWVzID0gbmV3IFNldChbXG4gICdAYmxpdHpqcy9hdXRoJyxcbiAgJ0BjaGFrcmEtdWkvcmVhY3QnLFxuICAnQGhvb2tmb3JtL3Jlc29sdmVycycsXG4gICdAd2lsbGJvb3N0ZXIvanVkZ2UnLFxuICAnQHdpbGxib29zdGVyL2xsbS1wcm94eScsXG4gICdAem9vbS9ydG1zJyxcbiAgJ2JsaXR6JyxcbiAgJ2RyaXp6bGUta2l0JyxcbiAgbGVmdGhvb2tEZXBlbmRlbmN5LFxuXSk7XG5cbmZ1bmN0aW9uIHdhcm5BYm91dFJlbW92ZWRUcnVzdGVkRGVwZW5kZW5jaWVzKFxuICBjb25maWc6IFBhY2thZ2VDb25maWcsXG4gIGV4aXN0aW5nVHJ1c3RlZDogcmVhZG9ubHkgc3RyaW5nW10sXG4gIGtlcHRQYWNrYWdlczogUmVhZG9ubHlTZXQ8c3RyaW5nPlxuKTogdm9pZCB7XG4gIC8vIEEgZGVmYXVsdC10cnVzdGVkIGVudHJ5IG5ldmVyIGxvc2VzIGFueXRoaW5nIGJ5IHJlbW92YWw6IHdoaWxlIHRoZSBwYWNrYWdlIGlzIGluc3RhbGxlZCB0aGVcbiAgLy8ga2VwdCBsaXN0IChvciwgd2hlbiB0aGUgZmllbGQgaXMgZGVsZXRlZCwgQnVuJ3Mgb3duIGRlZmF1bHQgbGlzdCkgc3RpbGwgdHJ1c3RzIGl0LlxuICBjb25zdCBkZWZhdWx0VHJ1c3RlZERlcGVuZGVuY2llcyA9IGdldERlZmF1bHRUcnVzdGVkRGVwZW5kZW5jaWVzKGNvbmZpZyk7XG4gIGNvbnN0IHJlbW92ZWRQYWNrYWdlcyA9IGV4aXN0aW5nVHJ1c3RlZC5maWx0ZXIoXG4gICAgKHBrZykgPT4gIWtlcHRQYWNrYWdlcy5oYXMocGtnKSAmJiAhd2JmeU1hbmFnZWRUcnVzdGVkRGVwZW5kZW5jaWVzLmhhcyhwa2cpICYmICFkZWZhdWx0VHJ1c3RlZERlcGVuZGVuY2llcz8uaGFzKHBrZylcbiAgKTtcbiAgaWYgKHJlbW92ZWRQYWNrYWdlcy5sZW5ndGggPiAwKSB7XG4gICAgY29uc29sZS53YXJuKFxuICAgICAgYFJlbW92aW5nIHVubWFuYWdlZCB0cnVzdGVkRGVwZW5kZW5jaWVzIGVudHJpZXM6ICR7cmVtb3ZlZFBhY2thZ2VzLmpvaW4oJywgJyl9LiB3YmZ5IG93bnMgdGhpcyBmaWVsZDsgaWYgdGhlaXIgbGlmZWN5Y2xlIHNjcmlwdHMgYXJlIHJlcXVpcmVkLCBhZGQgdGhlIHBhY2thZ2VzIHRvIHdiZnkgaXRzZWxmLmBcbiAgICApO1xuICB9XG59XG5cbmxldCBjYWNoZWREZWZhdWx0VHJ1c3RlZERlcGVuZGVuY2llczogU2V0PHN0cmluZz4gfCB1bmRlZmluZWQ7XG5cbi8qKiBGZXRjaGVzIEJ1bidzIGRlZmF1bHQgdHJ1c3RlZC1kZXBlbmRlbmN5IGFsbG93LWxpc3QgZnJvbSB0aGUgQnVuIHZlcnNpb24gaW5zdGFsbGluZyB0aGUgcmVwb3NpdG9yeS4gKi9cbmZ1bmN0aW9uIGdldERlZmF1bHRUcnVzdGVkRGVwZW5kZW5jaWVzKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFNldDxzdHJpbmc+IHwgdW5kZWZpbmVkIHtcbiAgaWYgKCFjYWNoZWREZWZhdWx0VHJ1c3RlZERlcGVuZGVuY2llcykge1xuICAgIC8vIEJ1biBjb2xvcml6ZXMgdGhlIGxpc3QgbWFya2VycyB3aGVuIEZPUkNFX0NPTE9SIGlzIHNldCAoZS5nLiBieSB0ZXN0IHJ1bm5lcnMgb24gQ0kpLCBzb1xuICAgIC8vIEFOU0kgZXNjYXBlIHNlcXVlbmNlcyBtdXN0IGJlIHN0cmlwcGVkIGJlZm9yZSBwYXJzaW5nLlxuICAgIGNvbnN0IHN0ZG91dCA9IHNwYXduU3luY0FuZFJldHVyblN0ZG91dCgnYnVuJywgWydwbScsICdkZWZhdWx0LXRydXN0ZWQnXSwgY29uZmlnLmRpclBhdGgpLnJlcGxhY2VBbGwoXG4gICAgICAvLyBveGxpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tY29udHJvbC1yZWdleCAtLSBtYXRjaGluZyBBTlNJIGVzY2FwZSBzZXF1ZW5jZXMgcmVxdWlyZXMgdGhlIEVTQyBjb250cm9sIGNoYXJhY3RlclxuICAgICAgL1xcdTAwMUJcXFtbMC05O10qbS9ndSxcbiAgICAgICcnXG4gICAgKTtcbiAgICBjb25zdCBwYXJzZWREZXBlbmRlbmNpZXMgPSBuZXcgU2V0KFsuLi5zdGRvdXQubWF0Y2hBbGwoL15cXHMqLVxccysoXFxTKykkL2dtdSldLm1hcCgobWF0Y2gpID0+IG1hdGNoWzFdIGFzIHN0cmluZykpO1xuICAgIGlmIChwYXJzZWREZXBlbmRlbmNpZXMuc2l6ZSA9PT0gMCkge1xuICAgICAgLy8gRG8gbm90IGNhY2hlIHRoZSBmYWlsdXJlOiBhIHRhcmdldC1sb2NhbCBwcm9ibGVtIChlLmcuIGFuIHVucmVhZGFibGUgcGFja2FnZS5qc29uKSBtdXN0XG4gICAgICAvLyBub3QgZGVueSB0aGUgZGVmYXVsdCBsaXN0IHRvIGV2ZXJ5IGxhdGVyIHRhcmdldCBvZiBhIG11bHRpLXBhdGggcnVuLlxuICAgICAgY29uc29sZS53YXJuKCdGYWlsZWQgdG8gcmVhZCB0aGUgZGVmYXVsdCBhbGxvdy1saXN0IHZpYSBgYnVuIHBtIGRlZmF1bHQtdHJ1c3RlZGAuJyk7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cbiAgICBjYWNoZWREZWZhdWx0VHJ1c3RlZERlcGVuZGVuY2llcyA9IHBhcnNlZERlcGVuZGVuY2llcztcbiAgfVxuICByZXR1cm4gY2FjaGVkRGVmYXVsdFRydXN0ZWREZXBlbmRlbmNpZXM7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIG5vcm1hbGl6ZVBhY2thZ2VNZXRhZGF0YShcbiAgY29uZmlnOiBQYWNrYWdlQ29uZmlnLFxuICByb290Q29uZmlnOiBQYWNrYWdlQ29uZmlnLFxuICBqc29uT2JqOiBXcml0YWJsZVBhY2thZ2VKc29uLFxuICBkZXBlbmRlbmN5VXBkYXRlczogRGVwZW5kZW5jeVVwZGF0ZXNcbik6IFByb21pc2U8dm9pZD4ge1xuICBpZiAoIWpzb25PYmoubmFtZSkge1xuICAgIGpzb25PYmoubmFtZSA9IHBhdGguYmFzZW5hbWUoY29uZmlnLmRpclBhdGgpO1xuICB9XG5cbiAgLy8gRXhwbGljaXQgcm9vdCBwdWJsaXNoaW5nIGludGVudCB0YWtlcyBwcmVjZWRlbmNlIG92ZXIgd2JmeSdzIHByaXZhdGUgbW9ub3JlcG8tcm9vdCBkZWZhdWx0LlxuICBpZiAoY29uZmlnLmRvZXNDb250YWluU3ViUGFja2FnZUpzb25zICYmIChjb25maWcucmVsZWFzZS5ucG1QdWJsaXNoZXNSb290IHx8IGpzb25PYmoucHVibGlzaENvbmZpZykpIHtcbiAgICBkZWxldGUganNvbk9iai5wcml2YXRlO1xuICB9IGVsc2UgaWYgKGNvbmZpZy5kb2VzQ29udGFpblN1YlBhY2thZ2VKc29ucyAmJiAhY29uZmlnLnJlbGVhc2UubnBtICYmICFqc29uT2JqLnB1Ymxpc2hDb25maWcpIHtcbiAgICBqc29uT2JqLnByaXZhdGUgPSB0cnVlO1xuICB9XG4gIGlmICghanNvbk9iai5saWNlbnNlKSB7XG4gICAganNvbk9iai5saWNlbnNlID0gJ1VOTElDRU5TRUQnO1xuICB9XG4gIGlmICghanNvbk9iai5wcml2YXRlICYmIGpzb25PYmoubGljZW5zZSAhPT0gJ1VOTElDRU5TRUQnICYmIHJvb3RDb25maWcuaXNQdWJsaWNSZXBvKSB7XG4gICAganNvbk9iai5wdWJsaXNoQ29uZmlnID8/PSB7fTtcbiAgICBqc29uT2JqLnB1Ymxpc2hDb25maWcuYWNjZXNzID8/PSAncHVibGljJztcbiAgICAvLyBXaXRob3V0IGFuIGV4cGxpY2l0IHJlZ2lzdHJ5LCBucG0gcmVzb2x2ZXMgdGhlIHB1Ymxpc2ggdGFyZ2V0IGZyb20gdGhlIHdvcmtzcGFjZSAubnBtcmMsXG4gICAgLy8gd2hvc2UgZGVmYXVsdCByZWdpc3RyeSBvbiBDSSBtYXkgYmUgdGhlIFRha3VtaSBHdWFyZCBpbnN0YWxsIHByb3h5IOKAlCB3aGljaCByZWplY3RzXG4gICAgLy8gYG5wbSBwdWJsaXNoYCB3aXRoIDQwNSAoc2hhcmVkIzEwNzIpLiBgPz89YCBrZWVwcyBhIGRlbGliZXJhdGVseSBkaWZmZXJlbnQgcmVnaXN0cnkuXG4gICAganNvbk9iai5wdWJsaXNoQ29uZmlnLnJlZ2lzdHJ5ID8/PSAnaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvJztcbiAgfVxuICBjb25zdCBvd25lciA9IGNvbmZpZy5yZXBvQXV0aG9yO1xuICBpZiAob3duZXIgPT09ICdXaWxsQm9vc3RlcicgfHwgb3duZXIgPT09ICdXaWxsQm9vc3RlckxhYicpIHtcbiAgICBqc29uT2JqLmF1dGhvciA9ICdXaWxsQm9vc3RlciBJbmMuJztcbiAgfVxuICBhd2FpdCBub3JtYWxpemVQdWJsaXNoZWRDb25maWdQYWNrYWdlTWV0YWRhdGEoY29uZmlnLCBqc29uT2JqKTtcbiAgaWYgKCFjb25maWcuaXNSb290ICYmIGpzb25PYmoucHJpdmF0ZSAmJiAhanNvbk9iai5tYWluKSB7XG4gICAgLy8gTWFrZSBWU0NvZGUgcG9zc2libGUgdG8gcmVmYWN0b3IgY29kZSBhY3Jvc3Mgc3VicGFja2FnZXMuXG4gICAganNvbk9iai5tYWluID0gJy4vc3JjJztcbiAgfVxuXG4gIGlmICghY29uZmlnLmRvZXNDb250YWluU3ViUGFja2FnZUpzb25zKSB7XG4gICAgaWYgKGNvbmZpZy5kb2VzQ29udGFpblB1YnNwZWNZYW1sKSB7XG4gICAgICBqc29uT2JqLnNjcmlwdHMubGludCA9ICdmbHV0dGVyIGFuYWx5emUnO1xuICAgICAganNvbk9iai5zY3JpcHRzWydsaW50LWZpeCddID0gJ2J1biBydW4gbGludCc7XG4gICAgICBjb25zdCBkaXJzID0gWydsaWInLCAndGVzdCcsICd0ZXN0X2RyaXZlciddLmZpbHRlcigoZGlyKSA9PiBmcy5leGlzdHNTeW5jKHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgZGlyKSkpO1xuICAgICAgaWYgKGRpcnMubGVuZ3RoID4gMCkge1xuICAgICAgICBqc29uT2JqLnNjcmlwdHNbJ2Zvcm1hdC1jb2RlJ10gPSBgZGFydCBmb3JtYXQgJChmaW5kICR7ZGlycy5qb2luKFxuICAgICAgICAgICcgJ1xuICAgICAgICApfSAtbmFtZSBnZW5lcmF0ZWQgLXBydW5lIC1vIC1uYW1lICcqLmZyZWV6ZWQuZGFydCcgLXBydW5lIC1vIC1uYW1lICcqLmcuZGFydCcgLXBydW5lIC1vIC1uYW1lICcqLmRhcnQnIC1wcmludClgO1xuICAgICAgICBqc29uT2JqLnNjcmlwdHMuZm9ybWF0ID0gYXBwZW5kRm9ybWF0Q29kZUNvbW1hbmQoanNvbk9iai5zY3JpcHRzLmZvcm1hdCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgcHl0aG9uUGFja2FnZU1hbmFnZXIgPSBnZXRQeXRob25QYWNrYWdlTWFuYWdlcihjb25maWcpO1xuICAgIGlmIChweXRob25QYWNrYWdlTWFuYWdlcikge1xuICAgICAgY29uc3Qgc2NyaXB0UnVubmVyID0gJ2J1biBydW4nO1xuICAgICAganNvbk9iai5zY3JpcHRzWydjb21tb24vY2ktc2V0dXAnXSA9IGAke3NjcmlwdFJ1bm5lcn0gc2V0dXAtJHtweXRob25QYWNrYWdlTWFuYWdlcn1gO1xuICAgICAgZGVsZXRlIGpzb25PYmouc2NyaXB0c1tgc2V0dXAtJHtweXRob25QYWNrYWdlTWFuYWdlciA9PT0gJ3BvZXRyeScgPyAndXYnIDogJ3BvZXRyeSd9YF07XG4gICAgICBqc29uT2JqLnNjcmlwdHNbYHNldHVwLSR7cHl0aG9uUGFja2FnZU1hbmFnZXJ9YF0gPSBnZXRQeXRob25TZXR1cENvbW1hbmQocHl0aG9uUGFja2FnZU1hbmFnZXIpO1xuICAgICAgY29uc3QgcHl0aG9uRmlsZXMgPSBhd2FpdCBmZy5nbG9iKCcqKi8qLnB5Jywge1xuICAgICAgICBjd2Q6IGNvbmZpZy5kaXJQYXRoLFxuICAgICAgICBkb3Q6IHRydWUsXG4gICAgICAgIGlnbm9yZTogZ2xvYklnbm9yZSxcbiAgICAgIH0pO1xuICAgICAgY29uc3QgZGlyTmFtZVNldCA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICAgICAgZm9yIChjb25zdCBweXRob25GaWxlIG9mIHB5dGhvbkZpbGVzKSB7XG4gICAgICAgIGNvbnN0IFtmaXJzdCwgc2Vjb25kXSA9IHB5dGhvbkZpbGUuc3BsaXQoJy8nKTtcbiAgICAgICAgaWYgKGZpcnN0ICYmIHNlY29uZCkge1xuICAgICAgICAgIGRpck5hbWVTZXQuYWRkKGZpcnN0KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKGRpck5hbWVTZXQuc2l6ZSA+IDApIHtcbiAgICAgICAgY29uc3QgZGlyTmFtZXNTdHIgPSBbLi4uZGlyTmFtZVNldF0uam9pbignICcpO1xuICAgICAgICBjb25zdCBweXRob25SdW5uZXIgPSBgJHtweXRob25QYWNrYWdlTWFuYWdlcn0gcnVuYDtcbiAgICAgICAganNvbk9iai5zY3JpcHRzWydmb3JtYXQtY29kZSddID1cbiAgICAgICAgICBgJHtweXRob25SdW5uZXJ9IGlzb3J0IC0tcHJvZmlsZSBibGFjayAke2Rpck5hbWVzU3RyfSAmJiAke3B5dGhvblJ1bm5lcn0gYmxhY2sgJHtkaXJOYW1lc1N0cn1gO1xuICAgICAgICBpZiAoanNvbk9iai5zY3JpcHRzLmxpbnQpIHtcbiAgICAgICAgICBqc29uT2JqLnNjcmlwdHMubGludCA9IGAke3B5dGhvblJ1bm5lcn0gZmxha2U4ICR7ZGlyTmFtZXNTdHJ9ICYmICR7anNvbk9iai5zY3JpcHRzLmxpbnR9YDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBqc29uT2JqLnNjcmlwdHMubGludCA9IGAke3B5dGhvblJ1bm5lcn0gZmxha2U4ICR7ZGlyTmFtZXNTdHJ9YDtcbiAgICAgICAgICBqc29uT2JqLnNjcmlwdHNbJ2xpbnQtZml4J10gPSBgJHtzY3JpcHRSdW5uZXJ9IGxpbnRgO1xuICAgICAgICB9XG4gICAgICAgIGpzb25PYmouc2NyaXB0cy5mb3JtYXQgPSBhcHBlbmRGb3JtYXRDb2RlQ29tbWFuZChqc29uT2JqLnNjcmlwdHMuZm9ybWF0KTtcbiAgICAgICAgZGVwZW5kZW5jeVVwZGF0ZXMucHl0aG9uRGV2RGVwZW5kZW5jaWVzLnB1c2goJ2JsYWNrJywgJ2lzb3J0JywgJ2ZsYWtlOCcpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGlmIChjb25maWcucmVwb3NpdG9yeSB8fCBqc29uT2JqLnJlcG9zaXRvcnkpIHtcbiAgICBqc29uT2JqLnJlcG9zaXRvcnkgPSBmb3JtYXRSZXBvc2l0b3J5Rm9yUGFja2FnZUpzb24oY29uZmlnLnJlcG9zaXRvcnkgPz8ganNvbk9iai5yZXBvc2l0b3J5LCBqc29uT2JqLnJlcG9zaXRvcnkpO1xuICB9XG5cbiAgY29uc3QgZ2VuQ29kZVNjcmlwdCA9IGpzb25PYmouc2NyaXB0c1snZ2VuLWNvZGUnXTtcbiAgaWYgKHNob3VsZEdlbmVyYXRlV2JHZW5Db2RlU2NyaXB0KGNvbmZpZykpIHtcbiAgICAvLyBQcmVzZXJ2ZSBwcm9qZWN0LXNwZWNpZmljIHN0ZXBzIGEgcmVwbyBhcHBlbmRlZCB0byB0aGUgbWFuYWdlZCBgYnVuIHdiIGdlbi1jb2RlYCAoZS5nLiBidWlsZGluZyBleHRyYSBkZXBsb3lcbiAgICAvLyBhc3NldHMpIGluc3RlYWQgb2YgZGlzY2FyZGluZyB0aGVtOyBvbmx5IHRoZSBtYW5hZ2VkIGdlbi1jb2RlIHNlZ21lbnQgaXMgd2JmeSdzIHRvXG4gICAgLy8gcmVnZW5lcmF0ZS4gQW4gdW5wYXJzZWFibGUgc2NyaXB0IGlzIGxlZnQgYWxvbmUgcmF0aGVyIHRoYW4gcmV3cml0dGVuIGZyb20gYSB3cm9uZyBwYXJzZS5cbiAgICBjb25zdCBzZWdtZW50cyA9IGdlbkNvZGVTY3JpcHQgPT09IHVuZGVmaW5lZCA/IFtdIDogc3BsaXRTY3JpcHRTZWdtZW50cyhnZW5Db2RlU2NyaXB0KTtcbiAgICBjb25zdCBjdXN0b21TZWdtZW50cyA9IHNlZ21lbnRzPy5maWx0ZXIoXG4gICAgICAoc2VnbWVudCkgPT4gY2xhc3NpZnlTY3JpcHRTZWdtZW50KHNlZ21lbnQsIGpzb25PYmouc2NyaXB0cywgdHJ1ZSkgPT09ICdjdXN0b20nXG4gICAgKTtcbiAgICBpZiAoY3VzdG9tU2VnbWVudHMpIHtcbiAgICAgIGpzb25PYmouc2NyaXB0c1snZ2VuLWNvZGUnXSA9IFsnYnVuIHdiIGdlbi1jb2RlJywgLi4uY3VzdG9tU2VnbWVudHNdLmpvaW4oJyAmJiAnKTtcbiAgICB9XG4gIH1cbiAgdXBkYXRlUG9zdGluc3RhbGxTY3JpcHQoanNvbk9iai5zY3JpcHRzLCBnZW5lcmF0ZXNXb3JrZXJUeXBlcyhjb25maWcpKTtcbn1cblxuZnVuY3Rpb24gc2hvdWxkR2VuZXJhdGVXYkdlbkNvZGVTY3JpcHQoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogYm9vbGVhbiB7XG4gIHJldHVybiBjb25maWcuZGVwZW5kaW5nLmJsaXR6IHx8IGNvbmZpZy5kZXBlbmRpbmcuY2hha3JhIHx8IGNvbmZpZy5kZXBlbmRpbmcuZ2VuSTE4blRzIHx8IGNvbmZpZy5kZXBlbmRpbmcucHJpc21hO1xufVxuXG5mdW5jdGlvbiBhcHBlbmRGb3JtYXRDb2RlQ29tbWFuZChmb3JtYXRTY3JpcHQ6IHN0cmluZyB8IHVuZGVmaW5lZCk6IHN0cmluZyB7XG4gIHJldHVybiBmb3JtYXRTY3JpcHQgPyBgJHtmb3JtYXRTY3JpcHR9ICYmIGJ1biBydW4gZm9ybWF0LWNvZGVgIDogJ2J1biBydW4gZm9ybWF0LWNvZGUnO1xufVxuXG5hc3luYyBmdW5jdGlvbiBub3JtYWxpemVQdWJsaXNoZWRDb25maWdQYWNrYWdlTWV0YWRhdGEoXG4gIGNvbmZpZzogUGFja2FnZUNvbmZpZyxcbiAganNvbk9iajogV3JpdGFibGVQYWNrYWdlSnNvblxuKTogUHJvbWlzZTx2b2lkPiB7XG4gIGlmICghaXNQdWJsaXNoZWRXaWxsYm9vc3RlckNvbmZpZ3NQYWNrYWdlKGNvbmZpZykpIHJldHVybjtcblxuICBjb25zdCBjb25maWdNanNQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnY29uZmlnLm1qcycpO1xuICBpZiAoIWZzLmV4aXN0c1N5bmMoY29uZmlnTWpzUGF0aCkpIHJldHVybjtcblxuICBqc29uT2JqLnR5cGUgPSAnbW9kdWxlJztcblxuICBjb25zdCBjb25maWdEdHNQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnY29uZmlnLmQudHMnKTtcbiAgaWYgKCFmcy5leGlzdHNTeW5jKGNvbmZpZ0R0c1BhdGgpKSByZXR1cm47XG5cbiAganNvbk9iai5maWxlcyA9IFsuLi5uZXcgU2V0KFsuLi4oanNvbk9iai5maWxlcyA/PyBbXSksICdjb25maWcuZC5tdHMnXSldO1xuICAvLyBOb2RlTmV4dCByZXNvbHZlcyBhIHJlbGF0aXZlIGAuL2NvbmZpZy5tanNgIGltcG9ydCB0byBgY29uZmlnLmQubXRzYCwgbm90XG4gIC8vIHRoZSBwYWNrYWdlLWxldmVsIGB0eXBlc2AgZmllbGQuIEtlZXAgdGhlIHB1Ymxpc2hlZCBjb25maWcgaW1wb3J0YWJsZSBmcm9tXG4gIC8vIHBhY2thZ2UtbG9jYWwgVHlwZVNjcmlwdCBsaW50ZXIgc2V0dGluZ3MuXG4gIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiBmc1V0aWwuZ2VuZXJhdGVGaWxlKHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJ2NvbmZpZy5kLm10cycpLCBjb25maWdEbXRzQ29udGVudCkpO1xufVxuXG5jb25zdCBjb25maWdEbXRzQ29udGVudCA9IGBleHBvcnQgeyBkZWZhdWx0IH0gZnJvbSAnLi9jb25maWcuanMnO1xuYDtcblxuZnVuY3Rpb24gYWRkRGVwZW5kZW5jeVZlcnNpb25zVG9QYWNrYWdlSnNvbihcbiAgY29uZmlnOiBQYWNrYWdlQ29uZmlnLFxuICByb290Q29uZmlnOiBQYWNrYWdlQ29uZmlnLFxuICBqc29uT2JqOiBXcml0YWJsZVBhY2thZ2VKc29uLFxuICBkZXBlbmRlbmN5VXBkYXRlczogRGVwZW5kZW5jeVVwZGF0ZXMsXG4gIHNraXBBZGRpbmdEZXBzOiBib29sZWFuXG4pOiB2b2lkIHtcbiAgY29uc3QgcGFja2FnZUpzb25EZXBlbmRlbmNpZXMgPSBqc29uT2JqLmRlcGVuZGVuY2llcztcbiAgY29uc3QgcGFja2FnZUpzb25EZXZEZXBlbmRlbmNpZXMgPSBqc29uT2JqLmRldkRlcGVuZGVuY2llcztcbiAgZGVwZW5kZW5jeVVwZGF0ZXMuZGVwZW5kZW5jaWVzID0gYWRkUGFja2FnZUpzb25EZXBlbmRlbmNpZXMoXG4gICAgY29uZmlnLFxuICAgIHJvb3RDb25maWcsXG4gICAganNvbk9iaixcbiAgICBwYWNrYWdlSnNvbkRlcGVuZGVuY2llcyxcbiAgICBbLi4uZGVwZW5kZW5jeVVwZGF0ZXMuZGVwZW5kZW5jaWVzLCAuLi5nZXRFeGlzdGluZ01hbmFnZWREZXBlbmRlbmNpZXMocGFja2FnZUpzb25EZXBlbmRlbmNpZXMsIGpzb25PYmopXSxcbiAgICBza2lwQWRkaW5nRGVwc1xuICApO1xuICBkZXBlbmRlbmN5VXBkYXRlcy5kZXZEZXBlbmRlbmNpZXMgPSBkZXBlbmRlbmN5VXBkYXRlcy5kZXZEZXBlbmRlbmNpZXMuZmlsdGVyKChkZXApID0+ICFwYWNrYWdlSnNvbkRlcGVuZGVuY2llc1tkZXBdKTtcbiAgZGVwZW5kZW5jeVVwZGF0ZXMuZGV2RGVwZW5kZW5jaWVzID0gYWRkUGFja2FnZUpzb25EZXBlbmRlbmNpZXMoXG4gICAgY29uZmlnLFxuICAgIHJvb3RDb25maWcsXG4gICAganNvbk9iaixcbiAgICBwYWNrYWdlSnNvbkRldkRlcGVuZGVuY2llcyxcbiAgICBbLi4uZGVwZW5kZW5jeVVwZGF0ZXMuZGV2RGVwZW5kZW5jaWVzLCAuLi5nZXRFeGlzdGluZ01hbmFnZWREZXBlbmRlbmNpZXMocGFja2FnZUpzb25EZXZEZXBlbmRlbmNpZXMsIGpzb25PYmopXSxcbiAgICBza2lwQWRkaW5nRGVwc1xuICApO1xufVxuXG5mdW5jdGlvbiBnZXRFeGlzdGluZ01hbmFnZWREZXBlbmRlbmNpZXMoXG4gIHBhY2thZ2VKc29uRGVwZW5kZW5jaWVzOiBQYXJ0aWFsPFJlY29yZDxzdHJpbmcsIHN0cmluZz4+LFxuICBqc29uT2JqOiBQYWNrYWdlSnNvblxuKTogc3RyaW5nW10ge1xuICByZXR1cm4gT2JqZWN0LmtleXMocGFja2FnZUpzb25EZXBlbmRlbmNpZXMpLmZpbHRlcihcbiAgICAoZGVwZW5kZW5jeSkgPT5cbiAgICAgIG1hbmFnZWREZXBlbmRlbmN5TmFtZXMuaGFzKGRlcGVuZGVuY3kpICYmXG4gICAgICAvLyBBIHB1YmxpYyBwYWNrYWdlJ3MgYHdvcmtzcGFjZTpgIHNwZWNpZmllciBtdXN0IG5ldmVyIGJlIHJlLW1hbmFnZWQgdmlhIGEgcmVnaXN0cnkgaW5zdGFsbFxuICAgICAgLy8gKHByaXZhdGUgb25lcyBhcmUgbm9ybWFsaXplZCB0byBgd29ya3NwYWNlOipgIGxhdGVyKS4gVGhpcyBhbHNvIGNvdmVycyBydW5uaW5nIHdiZnkgb24gYVxuICAgICAgLy8gbW9ub3JlcG8gU1VCRElSRUNUT1JZLCB3aGVyZSB0aGUgcGFyZW50J3Mgd29ya3NwYWNlcyBhcmUgaW52aXNpYmxlIGFuZCB0aGUgd29ya3NwYWNlLW1hcFxuICAgICAgLy8gZ3VhcmQgaW4gYWRkUGFja2FnZUpzb25EZXBlbmRlbmNpZXMgY2Fubm90IHByb3RlY3QgdGhlIHNwZWNpZmllci5cbiAgICAgIChqc29uT2JqLnByaXZhdGUgfHwgIXBhY2thZ2VKc29uRGVwZW5kZW5jaWVzW2RlcGVuZGVuY3ldPy5zdGFydHNXaXRoKCd3b3Jrc3BhY2U6JykpXG4gICk7XG59XG5cbmZ1bmN0aW9uIHJlbW92ZUVtcHR5RGVwZW5kZW5jeVNlY3Rpb25zKGpzb25PYmo6IFBhY2thZ2VKc29uKTogdm9pZCB7XG4gIGZvciAoY29uc3Qga2V5IG9mIGRlcGVuZGVuY3lTZWN0aW9uS2V5cykge1xuICAgIGNvbnN0IHNlY3Rpb24gPSBqc29uT2JqW2tleV07XG4gICAgaWYgKHNlY3Rpb24gJiYgT2JqZWN0LmtleXMoc2VjdGlvbikubGVuZ3RoID09PSAwKSB7XG4gICAgICBSZWZsZWN0LmRlbGV0ZVByb3BlcnR5KGpzb25PYmosIGtleSk7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGluc3RhbGxEZXBlbmRlbmN5VXBkYXRlcyhcbiAgY29uZmlnOiBQYWNrYWdlQ29uZmlnLFxuICByb290Q29uZmlnOiBQYWNrYWdlQ29uZmlnLFxuICBqc29uT2JqOiBQYWNrYWdlSnNvbixcbiAgZGVwZW5kZW5jeVVwZGF0ZXM6IERlcGVuZGVuY3lVcGRhdGVzXG4pOiB2b2lkIHtcbiAgaWYgKGNvbmZpZy5kb2VzQ29udGFpblBhY2thZ2VKc29uKSB7XG4gICAgY29uc3QgZGVwZW5kZW5jaWVzID0gZGVwZW5kZW5jeVVwZGF0ZXMuZGVwZW5kZW5jaWVzLmZpbHRlcigoZGVwKSA9PiAhanNvbk9iai5kZXZEZXBlbmRlbmNpZXM/LltkZXBdKTtcbiAgICBpbnN0YWxsTnBtRGVwZW5kZW5jaWVzKGNvbmZpZywgcm9vdENvbmZpZywgZGVwZW5kZW5jaWVzLCBmYWxzZSk7XG5cbiAgICBjb25zdCBkZXZEZXBlbmRlbmNpZXMgPSBkZXBlbmRlbmN5VXBkYXRlcy5kZXZEZXBlbmRlbmNpZXMuZmlsdGVyKChkZXApID0+ICFqc29uT2JqLmRlcGVuZGVuY2llcz8uW2RlcF0pO1xuICAgIGluc3RhbGxOcG1EZXBlbmRlbmNpZXMoY29uZmlnLCByb290Q29uZmlnLCBkZXZEZXBlbmRlbmNpZXMsIHRydWUpO1xuICB9XG5cbiAgY29uc3QgcHl0aG9uUGFja2FnZU1hbmFnZXIgPSBnZXRQeXRob25QYWNrYWdlTWFuYWdlcihjb25maWcpO1xuICBpZiAocHl0aG9uUGFja2FnZU1hbmFnZXIgJiYgZGVwZW5kZW5jeVVwZGF0ZXMucHl0aG9uRGV2RGVwZW5kZW5jaWVzLmxlbmd0aCA+IDApIHtcbiAgICBjb25zdCBkZXBlbmRlbmNpZXMgPSBbLi4ubmV3IFNldChkZXBlbmRlbmN5VXBkYXRlcy5weXRob25EZXZEZXBlbmRlbmNpZXMpXTtcbiAgICBpZiAocHl0aG9uUGFja2FnZU1hbmFnZXIgPT09ICdwb2V0cnknKSB7XG4gICAgICBzcGF3blN5bmMoJ3BvZXRyeScsIFsnYWRkJywgJy0tZ3JvdXAnLCAnZGV2JywgLi4uZGVwZW5kZW5jaWVzXSwgY29uZmlnLmRpclBhdGgpO1xuICAgIH0gZWxzZSB7XG4gICAgICBzcGF3blN5bmMoJ3V2JywgWydhZGQnLCAnLS1kZXYnLCAuLi5kZXBlbmRlbmNpZXNdLCBjb25maWcuZGlyUGF0aCk7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGdldFB5dGhvblBhY2thZ2VNYW5hZ2VyKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6ICdwb2V0cnknIHwgJ3V2JyB8IHVuZGVmaW5lZCB7XG4gIGlmIChjb25maWcuZG9lc0NvbnRhaW5VdkxvY2spIHJldHVybiAndXYnO1xuICBpZiAoY29uZmlnLmRvZXNDb250YWluUG9ldHJ5TG9jaykgcmV0dXJuICdwb2V0cnknO1xufVxuXG5mdW5jdGlvbiBnZXRQeXRob25TZXR1cENvbW1hbmQocGFja2FnZU1hbmFnZXI6ICdwb2V0cnknIHwgJ3V2Jyk6IHN0cmluZyB7XG4gIGlmIChwYWNrYWdlTWFuYWdlciA9PT0gJ3V2JykgcmV0dXJuICd1diBzeW5jIC0tZnJvemVuJztcbiAgLy8gYG1pc2Ugd2hpY2ggcHl0aG9uYCB5aWVsZHMgdGhlIHNpbmdsZSBhY3RpdmUgaW50ZXJwcmV0ZXIgcGF0aDsgYG1pc2UgY3VycmVudCBweXRob25gIGNhblxuICAvLyBwcmludCBtdWx0aXBsZSBzcGFjZS1zZXBhcmF0ZWQgdmVyc2lvbnMgKG1pc2Ugc3VwcG9ydHMgbXVsdGktdmVyc2lvbiBwaW5zKSwgd2hpY2ggd291bGQgcGFzc1xuICAvLyBleHRyYSBwb3NpdGlvbmFsIGFyZ3VtZW50cyB0byBgcG9ldHJ5IGVudiB1c2VgLiBXaGVuIG1pc2UgaXMgbWlzc2luZyBvciBweXRob24gaXNcbiAgLy8gdW5jb25maWd1cmVkLCBza2lwIGBwb2V0cnkgZW52IHVzZWAgYW5kIGZhbGwgYmFjayB0byBwb2V0cnkncyBkZWZhdWx0IGludGVycHJldGVyIGluc3RlYWQgb2ZcbiAgLy8gYWJvcnRpbmcgdGhlIGNoYWluLlxuICAvLyBUaGUgYHx8IHRydWVgIGNvdmVycyBvbmx5IHRoZSBtaXNlIHJlc29sdXRpb246IGEgbWlzc2luZy91bmNvbmZpZ3VyZWQgbWlzZSBmYWxscyBiYWNrIHRvXG4gIC8vIHBvZXRyeSdzIGRlZmF1bHQgaW50ZXJwcmV0ZXIsIHdoaWxlIGEgZmFpbGluZyBgcG9ldHJ5IGVudiB1c2VgIHN0aWxsIGFib3J0cyB0aGUgY2hhaW4uXG4gIHJldHVybiAncG9ldHJ5IGNvbmZpZyB2aXJ0dWFsZW52cy5pbi1wcm9qZWN0IHRydWUgJiYgeyBweXRob25fcGF0aD1cIiQobWlzZSB3aGljaCBweXRob24gMj4vZGV2L251bGwpXCIgfHwgdHJ1ZTsgfSAmJiB7IFsgLXogXCIkcHl0aG9uX3BhdGhcIiBdIHx8IHBvZXRyeSBlbnYgdXNlIFwiJHB5dGhvbl9wYXRoXCI7IH0gJiYgcG9ldHJ5IHJ1biBwaXAgaW5zdGFsbCAtLXVwZ3JhZGUgcGlwICYmIHBvZXRyeSBpbnN0YWxsJztcbn1cblxuZnVuY3Rpb24gaW5zdGFsbE5wbURlcGVuZGVuY2llcyhcbiAgY29uZmlnOiBQYWNrYWdlQ29uZmlnLFxuICByb290Q29uZmlnOiBQYWNrYWdlQ29uZmlnLFxuICBkZXBlbmRlbmNpZXM6IHN0cmluZ1tdLFxuICBkZXY6IGJvb2xlYW5cbik6IHZvaWQge1xuICBpZiAoZGVwZW5kZW5jaWVzLmxlbmd0aCA9PT0gMCkgcmV0dXJuO1xuXG4gIGNvbnN0IGRlcGVuZGVuY3lTcGVjaWZpZXJzID0gW1xuICAgIC4uLm5ldyBTZXQoZGVwZW5kZW5jaWVzLm1hcCgoZGVwZW5kZW5jeSkgPT4gZ2V0SW5zdGFsbERlcGVuZGVuY3lTcGVjaWZpZXIoY29uZmlnLCByb290Q29uZmlnLCBkZXBlbmRlbmN5KSkpLFxuICBdO1xuICBzcGF3blN5bmMoJ2J1bicsIFsnYWRkJywgLi4uKGRldiA/IFsnLUQnXSA6IFtdKSwgJy0tZXhhY3QnLCAuLi5kZXBlbmRlbmN5U3BlY2lmaWVyc10sIGNvbmZpZy5kaXJQYXRoKTtcbn1cblxuZnVuY3Rpb24gYWRkUGFja2FnZUpzb25EZXBlbmRlbmNpZXMoXG4gIGNvbmZpZzogUGFja2FnZUNvbmZpZyxcbiAgcm9vdENvbmZpZzogUGFja2FnZUNvbmZpZyxcbiAganNvbk9iajogV3JpdGFibGVQYWNrYWdlSnNvbixcbiAgcGFja2FnZUpzb25EZXBlbmRlbmNpZXM6IFBhcnRpYWw8UmVjb3JkPHN0cmluZywgc3RyaW5nPj4sXG4gIGRlcGVuZGVuY2llczogc3RyaW5nW10sXG4gIHNraXBBZGRpbmdEZXBzOiBib29sZWFuXG4pOiBzdHJpbmdbXSB7XG4gIGNvbnN0IGRlcGVuZGVuY2llc1RvSW5zdGFsbDogc3RyaW5nW10gPSBbXTtcbiAgZm9yIChjb25zdCBkZXBlbmRlbmN5IG9mIG5ldyBTZXQoZGVwZW5kZW5jaWVzKSkge1xuICAgIC8vIEEgcHJpdmF0ZSBwYWNrYWdlIHdob3NlIG1vbm9yZXBvIGNvbnRhaW5zIHRoaXMgZGVwZW5kZW5jeSBhcyBhIHdvcmtzcGFjZSBtdXN0IHJlZmVyZW5jZSBpdFxuICAgIC8vIHZpYSB0aGUgd29ya3NwYWNlIHByb3RvY29sOiBwaW5uaW5nIGEgcmVnaXN0cnkgdmVyc2lvbiBtYWtlcyBCdW4gc2hhZG93IHRoZSBzYW1lLW5hbWVcbiAgICAvLyB3b3Jrc3BhY2UgYW5kIHNraXAgaW5zdGFsbGluZyB0aGUgd29ya3NwYWNlJ3Mgb3duIGRlcGVuZGVuY2llcy4gKFB1Ymxpc2hlZCBwYWNrYWdlcyBpbnN0ZWFkXG4gICAgLy8gcGluIGEgY29uY3JldGUgdmVyc2lvbiBiZWNhdXNlIGBucG0gcHVibGlzaGAgcmVqZWN0cyBgd29ya3NwYWNlOipgIHNwZWNpZmllcnMg4oCUIGJ1dCBhblxuICAgIC8vIEVYSVNUSU5HIGB3b3Jrc3BhY2U6YCBkZWNsYXJhdGlvbiBpcyBhbHdheXMga2VwdDogb3ZlcndyaXRpbmcgaXQgd2l0aCBhIHJlZ2lzdHJ5IHJlbGVhc2VcbiAgICAvLyB3b3VsZCBzaWxlbnRseSBicmVhayB0aGUgbG9jYWwgd29ya3NwYWNlIGxpbmsuKVxuXG4gICAgLy8gQSBkZWNsYXJlZCBgd29ya3NwYWNlOmAgc3BlY2lmaWVyIGFsd2F5cyB3aW5zLCB3aGV0aGVyIG9yIG5vdCB0aGUgd29ya3NwYWNlIG1hcCBzZWVzIHRoZVxuICAgIC8vIHBhY2thZ2U6IHJ1bm5pbmcgd2JmeSBvbiBhIG1vbm9yZXBvIFNVQkRJUkVDVE9SWSBoaWRlcyB0aGUgcGFyZW50J3Mgd29ya3NwYWNlcywgc28gdGhlIG1hcFxuICAgIC8vIGFsb25lIGNhbm5vdCBiZSB0cnVzdGVkIHRvIGRldGVjdCBhIGxvY2FsIHdvcmtzcGFjZSBsaW5rLlxuICAgIGlmIChwYWNrYWdlSnNvbkRlcGVuZGVuY2llc1tkZXBlbmRlbmN5XT8uc3RhcnRzV2l0aCgnd29ya3NwYWNlOicpKSB7XG4gICAgICBpZiAoanNvbk9iai5wcml2YXRlKSB7XG4gICAgICAgIHBhY2thZ2VKc29uRGVwZW5kZW5jaWVzW2RlcGVuZGVuY3ldID0gJ3dvcmtzcGFjZToqJztcbiAgICAgIH1cbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBpZiAoanNvbk9iai5wcml2YXRlICYmIGdldFdvcmtzcGFjZVBhY2thZ2VEaXJzKHJvb3RDb25maWcpLmhhcyhkZXBlbmRlbmN5KSkge1xuICAgICAgY29uc3QgZXhpc3RpbmdTcGVjaWZpZXIgPSBwYWNrYWdlSnNvbkRlcGVuZGVuY2llc1tkZXBlbmRlbmN5XTtcbiAgICAgIGlmICghZXhpc3RpbmdTcGVjaWZpZXIgfHwgZXhpc3RpbmdTcGVjaWZpZXIuc3RhcnRzV2l0aCgnd29ya3NwYWNlOicpKSB7XG4gICAgICAgIHBhY2thZ2VKc29uRGVwZW5kZW5jaWVzW2RlcGVuZGVuY3ldID0gJ3dvcmtzcGFjZToqJztcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICAvLyBBbiBleGlzdGluZyBDT05DUkVURSBwaW4gb24gYSB3b3Jrc3BhY2UgcGFja2FnZSBpcyBhIGRlbGliZXJhdGUgY2hvaWNlIGFuZCBtdXN0IG5vdCBiZVxuICAgICAgLy8gY29udmVydGVkIHRvIHRoZSB3b3Jrc3BhY2UgcHJvdG9jb2wuIE5vdGUgdGhlIHRyYWRlLW9mZiBlaXRoZXIgd2F5OiBucG0gKHdoaWNoXG4gICAgICAvLyBzZW1hbnRpYy1yZWxlYXNlJ3MgbnBtIHBsdWdpbiBzaGVsbHMgb3V0IHRvKSBjYW5ub3QgcGFyc2UgYHdvcmtzcGFjZTpgIHNwZWNpZmllcnMsIHdoaWxlXG4gICAgICAvLyBhIHJlZ2lzdHJ5IHBpbiBtYWtlcyBhIGNvbGQgYnVuIGluc3RhbGwgc2hhZG93IHRoZSB3b3Jrc3BhY2UgYW5kIHNraXAgaXRzIGRlcGVuZGVuY2llcyDigJRcbiAgICAgIC8vIFdpbGxCb29zdGVyL3NoYXJlZCBrZWVwcyBgd29ya3NwYWNlOipgIGFuZCBzdHJpcHMgdGhlIHByb3RvY29sIG9uIHRoZSBDSSBjaGVja291dCByaWdodFxuICAgICAgLy8gYmVmb3JlIHJlbGVhc2luZyAoc2NyaXB0cy9zdHJpcFdvcmtzcGFjZVByb3RvY29sLm1qcykuIEZhbGwgdGhyb3VnaCBzbyBhIGNvbmNyZXRlIHBpblxuICAgICAgLy8ga2VlcHMgYmVpbmcgYnVtcGVkIGxpa2UgYW55IG1hbmFnZWQgZGVwZW5kZW5jeS5cbiAgICB9XG4gICAgY29uc3Qgc2hvdWxkVXBkYXRlRXhpc3RpbmdEZXBlbmRlbmN5ID0gc2hvdWxkVXBkYXRlRXhpc3RpbmdNYW5hZ2VkRGVwZW5kZW5jeShcbiAgICAgIGNvbmZpZyxcbiAgICAgIHJvb3RDb25maWcsXG4gICAgICBkZXBlbmRlbmN5LFxuICAgICAgcGFja2FnZUpzb25EZXBlbmRlbmNpZXNbZGVwZW5kZW5jeV1cbiAgICApO1xuICAgIGlmIChzaG91bGRVcGRhdGVFeGlzdGluZ0RlcGVuZGVuY3kpIHtcbiAgICAgIGNvbnN0IG1hbmFnZWRWZXJzaW9uID0gZ2V0TWFuYWdlZERlcGVuZGVuY3lWZXJzaW9uKGNvbmZpZywgcm9vdENvbmZpZywgZGVwZW5kZW5jeSk7XG4gICAgICBpZiAoc2hvdWxkRG93bmdyYWRlQWdlR2F0ZWRNYW5hZ2VkRGVwZW5kZW5jeShkZXBlbmRlbmN5LCBwYWNrYWdlSnNvbkRlcGVuZGVuY2llc1tkZXBlbmRlbmN5XSwgbWFuYWdlZFZlcnNpb24pKSB7XG4gICAgICAgIC8vIGBidW4gYWRkIGRlcGVuZGVuY3lgIHByZXNlcnZlcyBhbiBleGlzdGluZyBleGFjdCBwaW4sIHNvIHdyaXRlIHRoZSBhZ2UtY2xlYXJlZCB2ZXJzaW9uXG4gICAgICAgIC8vIGRpcmVjdGx5LiBUaGUgZmluYWwgcmVwb3NpdG9yeS13aWRlIGluc3RhbGwgcmVmcmVzaGVzIHRoZSBsb2NrZmlsZSBhZnRlciBldmVyeSBwYWNrYWdlXG4gICAgICAgIC8vIG1hbmlmZXN0IGhhcyBjb252ZXJnZWQgb24gdGhlIGdlbmVyYXRlZCByZWxlYXNlLWFnZSBwb2xpY3kuXG4gICAgICAgIHBhY2thZ2VKc29uRGVwZW5kZW5jaWVzW2RlcGVuZGVuY3ldID0gbWFuYWdlZFZlcnNpb247XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgZGVwZW5kZW5jaWVzVG9JbnN0YWxsLnB1c2goZGVwZW5kZW5jeSk7XG4gICAgICBpZiAoIXNraXBBZGRpbmdEZXBzKSBjb250aW51ZTtcbiAgICB9XG4gICAgaWYgKFxuICAgICAgcGFja2FnZUpzb25EZXBlbmRlbmNpZXNbZGVwZW5kZW5jeV0gJiZcbiAgICAgICFzaG91bGRVcGRhdGVFeGlzdGluZ0RlcGVuZGVuY3kgJiZcbiAgICAgIHBhY2thZ2VKc29uRGVwZW5kZW5jaWVzW2RlcGVuZGVuY3ldICE9PSAnKidcbiAgICApXG4gICAgICBjb250aW51ZTtcbiAgICBjb25zdCBsYXRlc3RWZXJzaW9uID0gZ2V0TWFuYWdlZERlcGVuZGVuY3lWZXJzaW9uKGNvbmZpZywgcm9vdENvbmZpZywgZGVwZW5kZW5jeSk7XG4gICAgaWYgKGxhdGVzdFZlcnNpb24gPT09ICcqJyAmJiBwYWNrYWdlSnNvbkRlcGVuZGVuY2llc1tkZXBlbmRlbmN5XSkgY29udGludWU7XG4gICAgcGFja2FnZUpzb25EZXBlbmRlbmNpZXNbZGVwZW5kZW5jeV0gPSBsYXRlc3RWZXJzaW9uO1xuICB9XG4gIHJldHVybiBkZXBlbmRlbmNpZXNUb0luc3RhbGw7XG59XG5cbmZ1bmN0aW9uIGZvcm1hdFBhY2thZ2VKc29uV2l0aFByb2plY3RGb3JtYXR0ZXIoY29uZmlnOiBQYWNrYWdlQ29uZmlnLCBmaWxlUGF0aDogc3RyaW5nKTogdm9pZCB7XG4gIGNvbnN0IHJlbGF0aXZlRmlsZVBhdGggPSBwYXRoLnJlbGF0aXZlKGNvbmZpZy5kaXJQYXRoLCBmaWxlUGF0aCk7XG4gIGlmICghcmVsYXRpdmVGaWxlUGF0aCkgcmV0dXJuO1xuXG4gIC8vIFJldXNlIHRoZSB0YXJnZXQgcmVwb3NpdG9yeSdzIG93biBmb3JtYXR0ZXIgYWZ0ZXIgZGVwZW5kZW5jeSBpbnN0YWxsYXRpb24gc29cbiAgLy8gcGFja2FnZS5qc29uIG1hdGNoZXMgd2hhdGV2ZXIgaXRzIGN1cnJlbnQgc29ydC1wYWNrYWdlLWpzb24gdmVyc2lvbiBleHBlY3RzLlxuICAvLyBUaGlzIGF2b2lkcyBmb2xsb3ctdXAgYXV0b2ZpeCBjb21taXRzIGNhdXNlZCBvbmx5IGJ5IGZvcm1hdHRlciB2ZXJzaW9uIGRyaWZ0XG4gIC8vIGJldHdlZW4gd2JmeSBhbmQgdGhlIHByb2plY3QgYmVpbmcgdXBkYXRlZC5cbiAgc3Bhd25TeW5jKCdidW54JywgWydzb3J0LXBhY2thZ2UtanNvbicsIHJlbGF0aXZlRmlsZVBhdGhdLCBjb25maWcuZGlyUGF0aCk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHJlbW92ZVVudXNlZFRzY29uZmlnQmFzZURlcGVuZGVuY2llcyhcbiAgY29uZmlnOiBQYWNrYWdlQ29uZmlnLFxuICBqc29uT2JqOiBXcml0YWJsZVBhY2thZ2VKc29uLFxuICB1c2VkRGVwZW5kZW5jaWVzOiBzdHJpbmdbXVxuKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IHVzZWREZXBlbmRlbmN5U2V0ID0gbmV3IFNldCh1c2VkRGVwZW5kZW5jaWVzKTtcbiAgY29uc3QgZXhpc3RpbmdUc2NvbmZpZ0Jhc2VEZXBlbmRlbmNpZXMgPSBhd2FpdCBnZXRFeGlzdGluZ1RzY29uZmlnQmFzZURlcGVuZGVuY2llcyhjb25maWcpO1xuICBmb3IgKGNvbnN0IGRlcGVuZGVuY3kgb2YgbWFuYWdlZFRzY29uZmlnQmFzZURlcGVuZGVuY2llcykge1xuICAgIGlmICh1c2VkRGVwZW5kZW5jeVNldC5oYXMoZGVwZW5kZW5jeSkgfHwgZXhpc3RpbmdUc2NvbmZpZ0Jhc2VEZXBlbmRlbmNpZXMuaGFzKGRlcGVuZGVuY3kpKSBjb250aW51ZTtcbiAgICAvLyB3YmZ5IG93bnMgdGhlc2UgYmFzZS1jb25maWcgcGFja2FnZXMuIFJlbW92ZSBzdGFsZSB2YXJpYW50cyB3aGVuIHJlcG9cbiAgICAvLyBjYXBhYmlsaXRpZXMgY2hhbmdlLCBzdWNoIGFzIE5leHQuanMgdGFraW5nIG93bmVyc2hpcCBvZiB0c2NvbmZpZy5qc29uLlxuICAgIGZvciAoY29uc3Qgc2VjdGlvbiBvZiBnZXREZXBlbmRlbmN5U2VjdGlvbnMoanNvbk9iaikpIHtcbiAgICAgIFJlZmxlY3QuZGVsZXRlUHJvcGVydHkoc2VjdGlvbiwgZGVwZW5kZW5jeSk7XG4gICAgfVxuICB9XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGdldEV4aXN0aW5nVHNjb25maWdCYXNlRGVwZW5kZW5jaWVzKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8U2V0PHN0cmluZz4+IHtcbiAgY29uc3QgZXhpc3RpbmdUc2NvbmZpZ0Jhc2VEZXBlbmRlbmNpZXMgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgY29uc3QgZmlsZVBhdGhzID0gYXdhaXQgZmcuZ2xvYignKiovdHNjb25maWcqLmpzb24nLCB7XG4gICAgY3dkOiBjb25maWcuZGlyUGF0aCxcbiAgICBkb3Q6IHRydWUsXG4gICAgaWdub3JlOiBnbG9iSWdub3JlLFxuICB9KTtcblxuICBmb3IgKGNvbnN0IGZpbGVQYXRoIG9mIGZpbGVQYXRocykge1xuICAgIGNvbnN0IGFic29sdXRlRmlsZVBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsIGZpbGVQYXRoKTtcbiAgICAvLyBUeXBlU2NyaXB0IDcncyBuYXRpdmUgY29tcGlsZXIgZHJvcHBlZCB0aGUgaW4tcHJvY2VzcyBgcGFyc2VDb25maWdGaWxlVGV4dFRvSnNvbmBcbiAgICAvLyBoZWxwZXIsIHNvIHBhcnNlIHRoZSB0c2NvbmZpZyBpbnRvIGFuIEFTVCBhbmQgcmVhZCBpdHMgdG9wLWxldmVsIGBleHRlbmRzYCBkaXJlY3RseS5cbiAgICBjb25zdCBzb3VyY2UgPSBhd2FpdCBwYXJzZVNvdXJjZUZpbGUoYWJzb2x1dGVGaWxlUGF0aCk7XG4gICAgaWYgKCFzb3VyY2UpIHtcbiAgICAgIGNvbnNvbGUud2FybihgUHJlc2VydmUgbWFuYWdlZCBAdHNjb25maWcgZGVwZW5kZW5jaWVzIGJlY2F1c2UgJHthYnNvbHV0ZUZpbGVQYXRofSBjb3VsZCBub3QgYmUgcGFyc2VkLmApO1xuICAgICAgcmV0dXJuIG5ldyBTZXQobWFuYWdlZFRzY29uZmlnQmFzZURlcGVuZGVuY2llcyk7XG4gICAgfVxuICAgIGZvciAoY29uc3QgdmFsdWUgb2YgcmVhZFRzY29uZmlnRXh0ZW5kcyhzb3VyY2UpKSB7XG4gICAgICBmb3IgKGNvbnN0IGRlcGVuZGVuY3kgb2YgbWFuYWdlZFRzY29uZmlnQmFzZURlcGVuZGVuY2llcykge1xuICAgICAgICBpZiAodmFsdWUgPT09IGRlcGVuZGVuY3kgfHwgdmFsdWUuc3RhcnRzV2l0aChgJHtkZXBlbmRlbmN5fS9gKSkge1xuICAgICAgICAgIGV4aXN0aW5nVHNjb25maWdCYXNlRGVwZW5kZW5jaWVzLmFkZChkZXBlbmRlbmN5KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBleGlzdGluZ1RzY29uZmlnQmFzZURlcGVuZGVuY2llcztcbn1cblxuLyoqIFJlYWRzIHRoZSB0b3AtbGV2ZWwgYGV4dGVuZHNgIGVudHJpZXMgKGEgc3RyaW5nIG9yIGFycmF5IG9mIHN0cmluZ3MpIGZyb20gYSBwYXJzZWQgdHNjb25maWcuICovXG5mdW5jdGlvbiByZWFkVHNjb25maWdFeHRlbmRzKHNvdXJjZTogYXN0LlNvdXJjZUZpbGUpOiBzdHJpbmdbXSB7XG4gIGNvbnN0IHZhbHVlczogc3RyaW5nW10gPSBbXTtcbiAgZm9yIChjb25zdCBwcm9wZXJ0eSBvZiBnZXRUc2NvbmZpZ1Jvb3RQcm9wZXJ0aWVzKHNvdXJjZSkpIHtcbiAgICBpZiAoYXN0LmlzUHJvcGVydHlBc3NpZ25tZW50KHByb3BlcnR5KSAmJiBhc3QuaXNTdHJpbmdMaXRlcmFsKHByb3BlcnR5Lm5hbWUpICYmIHByb3BlcnR5Lm5hbWUudGV4dCA9PT0gJ2V4dGVuZHMnKSB7XG4gICAgICBjb2xsZWN0U3RyaW5nTGl0ZXJhbFZhbHVlcyhwcm9wZXJ0eS5pbml0aWFsaXplciwgdmFsdWVzKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHZhbHVlcztcbn1cblxuZnVuY3Rpb24gZ2V0VHNjb25maWdSb290UHJvcGVydGllcyhzb3VyY2U6IGFzdC5Tb3VyY2VGaWxlKTogcmVhZG9ubHkgYXN0Lk9iamVjdExpdGVyYWxFbGVtZW50TGlrZVtdIHtcbiAgZm9yIChjb25zdCBzdGF0ZW1lbnQgb2Ygc291cmNlLnN0YXRlbWVudHMpIHtcbiAgICBpZiAoYXN0LmlzRXhwcmVzc2lvblN0YXRlbWVudChzdGF0ZW1lbnQpICYmIGFzdC5pc09iamVjdExpdGVyYWxFeHByZXNzaW9uKHN0YXRlbWVudC5leHByZXNzaW9uKSkge1xuICAgICAgcmV0dXJuIHN0YXRlbWVudC5leHByZXNzaW9uLnByb3BlcnRpZXM7XG4gICAgfVxuICB9XG4gIHJldHVybiBbXTtcbn1cblxuZnVuY3Rpb24gY29sbGVjdFN0cmluZ0xpdGVyYWxWYWx1ZXMobm9kZTogYXN0LkV4cHJlc3Npb24sIHZhbHVlczogc3RyaW5nW10pOiB2b2lkIHtcbiAgaWYgKGFzdC5pc1N0cmluZ0xpdGVyYWwobm9kZSkpIHtcbiAgICB2YWx1ZXMucHVzaChub2RlLnRleHQpO1xuICB9IGVsc2UgaWYgKGFzdC5pc0FycmF5TGl0ZXJhbEV4cHJlc3Npb24obm9kZSkpIHtcbiAgICBmb3IgKGNvbnN0IGVsZW1lbnQgb2Ygbm9kZS5lbGVtZW50cykge1xuICAgICAgY29sbGVjdFN0cmluZ0xpdGVyYWxWYWx1ZXMoZWxlbWVudCwgdmFsdWVzKTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gZ2V0RGVwZW5kZW5jeVNlY3Rpb25zKGpzb25PYmo6IFBhY2thZ2VKc29uKTogUGFydGlhbDxSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+PltdIHtcbiAgcmV0dXJuIGRlcGVuZGVuY3lTZWN0aW9uS2V5c1xuICAgIC5tYXAoKGtleSkgPT4ganNvbk9ialtrZXldKVxuICAgIC5maWx0ZXIoKHNlY3Rpb24pOiBzZWN0aW9uIGlzIFBhcnRpYWw8UmVjb3JkPHN0cmluZywgc3RyaW5nPj4gPT4gISFzZWN0aW9uKTtcbn1cblxuZnVuY3Rpb24gZ2V0TGF0ZXN0RGVwZW5kZW5jeVZlcnNpb24oZGVwZW5kZW5jeTogc3RyaW5nKTogc3RyaW5nIHtcbiAgY29uc3QgY2FjaGVkVmVyc2lvbiA9IGxhdGVzdERlcGVuZGVuY3lWZXJzaW9uQ2FjaGUuZ2V0KGRlcGVuZGVuY3kpO1xuICBpZiAoY2FjaGVkVmVyc2lvbikgcmV0dXJuIGNhY2hlZFZlcnNpb247XG5cbiAgY29uc3QgdmVyc2lvbiA9IGdldERlcGVuZGVuY3lWZXJzaW9uRnJvbU5wbShkZXBlbmRlbmN5KTtcbiAgbGF0ZXN0RGVwZW5kZW5jeVZlcnNpb25DYWNoZS5zZXQoZGVwZW5kZW5jeSwgdmVyc2lvbik7XG4gIHJldHVybiB2ZXJzaW9uO1xufVxuXG5mdW5jdGlvbiBnZXREZXBlbmRlbmN5VmVyc2lvbkZyb21OcG0oZGVwZW5kZW5jeTogc3RyaW5nKTogc3RyaW5nIHtcbiAgaWYgKCFzaG91bGRBcHBseVBhY2thZ2VBZ2VHYXRlKGRlcGVuZGVuY3kpKSB7XG4gICAgcmV0dXJuIGdldFJhd0RlcGVuZGVuY3lWZXJzaW9uRnJvbU5wbShkZXBlbmRlbmN5KTtcbiAgfVxuXG4gIHJldHVybiBnZXRMYXRlc3RBZ2VHYXRlZERlcGVuZGVuY3lWZXJzaW9uKGRlcGVuZGVuY3kpO1xufVxuXG5mdW5jdGlvbiBnZXRMYXRlc3RBZ2VHYXRlZERlcGVuZGVuY3lWZXJzaW9uKGRlcGVuZGVuY3k6IHN0cmluZyk6IHN0cmluZyB7XG4gIGNvbnN0IHRpbWVzID0gZ2V0TnBtUGFja2FnZVRpbWVzKGRlcGVuZGVuY3kpO1xuICBjb25zdCBsYXRlc3RWZXJzaW9uID0gZ2V0UmF3RGVwZW5kZW5jeVZlcnNpb25Gcm9tTnBtKGRlcGVuZGVuY3kpO1xuICBpZiAobGF0ZXN0VmVyc2lvbiAhPT0gJyonICYmIGlzUHVibGlzaGVkQmVmb3JlQWdlR2F0ZSh0aW1lc1tsYXRlc3RWZXJzaW9uXSkpIHtcbiAgICByZXR1cm4gbGF0ZXN0VmVyc2lvbjtcbiAgfVxuXG4gIHJldHVybiBnZXRBZ2VHYXRlZFZlcnNpb25zRGVzY2VuZGluZyh0aW1lcylbMF0gPz8gJyonO1xufVxuXG4vKiogRXZlcnkgc3RhYmxlIHJlbGVhc2UgaW4gYHRpbWVzYCB0aGF0IGFscmVhZHkgY2xlYXJlZCB0aGUgYWdlIGdhdGUsIG5ld2VzdCBmaXJzdC4gKi9cbmZ1bmN0aW9uIGdldEFnZUdhdGVkVmVyc2lvbnNEZXNjZW5kaW5nKHRpbWVzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+KTogc3RyaW5nW10ge1xuICBjb25zdCBub3cgPSBEYXRlLm5vdygpO1xuICByZXR1cm4gT2JqZWN0LmVudHJpZXModGltZXMpXG4gICAgLmZpbHRlcigoW3ZlcnNpb25dKSA9PiBzZW12ZXIudmFsaWQodmVyc2lvbikpXG4gICAgLmZpbHRlcigoW3ZlcnNpb25dKSA9PiAoc2VtdmVyLnByZXJlbGVhc2UodmVyc2lvbik/Lmxlbmd0aCA/PyAwKSA9PT0gMClcbiAgICAuZmlsdGVyKChbLCBwdWJsaXNoZWRBdF0pID0+IE51bWJlci5pc0Zpbml0ZShEYXRlLnBhcnNlKHB1Ymxpc2hlZEF0KSkpXG4gICAgLmZpbHRlcigoWywgcHVibGlzaGVkQXRdKSA9PiBub3cgLSBEYXRlLnBhcnNlKHB1Ymxpc2hlZEF0KSA+PSBwYWNrYWdlQWdlR2F0ZU1zKVxuICAgIC50b1NvcnRlZCgoW3ZlcnNpb25BXSwgW3ZlcnNpb25CXSkgPT4gc2VtdmVyLnJjb21wYXJlKHZlcnNpb25BLCB2ZXJzaW9uQikpXG4gICAgLm1hcCgoW3ZlcnNpb25dKSA9PiB2ZXJzaW9uKTtcbn1cblxuZnVuY3Rpb24gaXNQdWJsaXNoZWRCZWZvcmVBZ2VHYXRlKHB1Ymxpc2hlZEF0OiBzdHJpbmcgfCB1bmRlZmluZWQpOiBib29sZWFuIHtcbiAgaWYgKCFwdWJsaXNoZWRBdCkgcmV0dXJuIGZhbHNlO1xuICBjb25zdCBwdWJsaXNoZWRUaW1lID0gRGF0ZS5wYXJzZShwdWJsaXNoZWRBdCk7XG4gIHJldHVybiBOdW1iZXIuaXNGaW5pdGUocHVibGlzaGVkVGltZSkgJiYgRGF0ZS5ub3coKSAtIHB1Ymxpc2hlZFRpbWUgPj0gcGFja2FnZUFnZUdhdGVNcztcbn1cblxuZnVuY3Rpb24gZ2V0TnBtUGFja2FnZVRpbWVzKGRlcGVuZGVuY3k6IHN0cmluZyk6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4ge1xuICBjb25zdCBwYWNrYWdlTmFtZSA9IGRlcGVuZGVuY3kucmVwbGFjZSgvQFteQC9dKyQvdSwgJycpO1xuICBjb25zdCBjYWNoZWRUaW1lcyA9IG5wbVBhY2thZ2VUaW1lc0NhY2hlLmdldChwYWNrYWdlTmFtZSk7XG4gIGlmIChjYWNoZWRUaW1lcykgcmV0dXJuIGNhY2hlZFRpbWVzO1xuXG4gIGNvbnN0IHN0ZG91dCA9IHNwYXduU3luY0FuZFJldHVyblN0ZG91dChcbiAgICAnbnBtJyxcbiAgICBbJ3Nob3cnLCBwYWNrYWdlTmFtZSwgJ3RpbWUnLCAnLS1qc29uJywgJy0td29ya3NwYWNlcz1mYWxzZSddLFxuICAgIHByb2Nlc3MuY3dkKClcbiAgKTtcbiAgaWYgKCFzdGRvdXQpIHJldHVybiB7fTtcblxuICB0cnkge1xuICAgIGNvbnN0IHBhcnNlZCA9IEpTT04ucGFyc2Uoc3Rkb3V0KSBhcyBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+IHwgW1JlY29yZDxzdHJpbmcsIHN0cmluZz5dO1xuICAgIGNvbnN0IHRpbWVzID0gQXJyYXkuaXNBcnJheShwYXJzZWQpID8gcGFyc2VkWzBdIDogcGFyc2VkO1xuICAgIGlmICghdGltZXMpIHJldHVybiB7fTtcbiAgICBucG1QYWNrYWdlVGltZXNDYWNoZS5zZXQocGFja2FnZU5hbWUsIHRpbWVzKTtcbiAgICByZXR1cm4gdGltZXM7XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiB7fTtcbiAgfVxufVxuXG5mdW5jdGlvbiBzaG91bGRBcHBseVBhY2thZ2VBZ2VHYXRlKGRlcGVuZGVuY3k6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAvLyBLZWVwIG1hbmFnZWQgZmlyc3QtcGFydHkgcGFja2FnZXMgYWxpZ25lZCB3aXRoIEJ1bidzIGV4cGxpY2l0IGV4ZW1wdGlvbnMuIHdiZnkncyBnZW5lcmF0ZWRcbiAgLy8gY29uZmlndXJhdGlvbiBjYW4gcmVseSBvbiB0aGUgY3VycmVudCB3YiBjb250cmFjdCwgc28gaW5kZXBlbmRlbnRseSBzb2FraW5nIG9yIGRvd25ncmFkaW5nIHdiXG4gIC8vIHdvdWxkIHBhaXIgbmV3IGdlbmVyYXRlZCBmaWxlcyB3aXRoIGFuIGluY29tcGF0aWJsZSBvbGQgQ0xJLiBUaG9zZSBwYWNrYWdlcyBhcmUgcmVsZWFzZWQgYW5kXG4gIC8vIGZpeGVkIGF0IHRoZWlyIHNvdXJjZSBpbnN0ZWFkOyBvbmx5IHBhY2thZ2VzIEJ1biBpdHNlbGYgZ2F0ZXMgbWF5IGJlIHNlbGVjdGVkIGZyb20gb2xkZXIgdGFncy5cbiAgcmV0dXJuICFidW5NaW5pbXVtUmVsZWFzZUFnZUV4Y2x1ZGVzLnNvbWUoKHBhdHRlcm4pID0+IGRvZXNQYWNrYWdlUGF0dGVybk1hdGNoKHBhdHRlcm4sIGRlcGVuZGVuY3kpKTtcbn1cblxuZnVuY3Rpb24gZG9lc1BhY2thZ2VQYXR0ZXJuTWF0Y2gocGF0dGVybjogc3RyaW5nLCBkZXBlbmRlbmN5OiBzdHJpbmcpOiBib29sZWFuIHtcbiAgaWYgKHBhdHRlcm4gPT09IGRlcGVuZGVuY3kpIHJldHVybiB0cnVlO1xuICBpZiAoIXBhdHRlcm4uaW5jbHVkZXMoJyonKSkgcmV0dXJuIGZhbHNlO1xuXG4gIGNvbnN0IGVzY2FwZWRQYXR0ZXJuID0gcGF0dGVybi5yZXBsYWNlQWxsKC9bLis/XiR7fSgpfFtcXF1cXFxcXS9ndSwgU3RyaW5nLnJhd2BcXCQmYCkucmVwbGFjZUFsbCgnKicsICcuKicpO1xuICByZXR1cm4gbmV3IFJlZ0V4cChgXiR7ZXNjYXBlZFBhdHRlcm59JGAsICd1JykudGVzdChkZXBlbmRlbmN5KTtcbn1cblxuZnVuY3Rpb24gZ2V0UmF3RGVwZW5kZW5jeVZlcnNpb25Gcm9tTnBtKGRlcGVuZGVuY3k6IHN0cmluZyk6IHN0cmluZyB7XG4gIC8vIE5vIGNhY2hlIGhlcmU6IHRoZSBvbmx5IGNhbGxlciBjaGFpbiBnb2VzIHRocm91Z2ggZ2V0TGF0ZXN0RGVwZW5kZW5jeVZlcnNpb24sIHdoaWNoIGFscmVhZHlcbiAgLy8gbWVtb2l6ZXMgcGVyIGRlcGVuZGVuY3ksIHNvIHRoaXMgY2FuIHJ1biBhdCBtb3N0IG9uY2UgcGVyIGRlcGVuZGVuY3kuXG4gIHJldHVybiBzcGF3blN5bmNBbmRSZXR1cm5TdGRvdXQoJ25wbScsIFsnc2hvdycsIGRlcGVuZGVuY3ksICd2ZXJzaW9uJywgJy0td29ya3NwYWNlcz1mYWxzZSddLCBwcm9jZXNzLmN3ZCgpKSB8fCAnKic7XG59XG5cbmZ1bmN0aW9uIGdldEluc3RhbGxEZXBlbmRlbmN5U3BlY2lmaWVyKGNvbmZpZzogUGFja2FnZUNvbmZpZywgcm9vdENvbmZpZzogUGFja2FnZUNvbmZpZywgZGVwZW5kZW5jeTogc3RyaW5nKTogc3RyaW5nIHtcbiAgLy8gVHlwZVNjcmlwdCBpcyB2ZXJzaW9uLWNhcHBlZCBpbiBCbGl0eiByZXBvc2l0b3JpZXMsIHNvIGl0cyBpbnN0YWxsIHNwZWNpZmllciBtdXN0IGNhcnJ5IHRoZVxuICAvLyBtYW5hZ2VkIHZlcnNpb24g4oCUIGEgYmFyZSBgYnVuIGFkZGAgd291bGQgaW5zdGFsbCB0aGUgaW5jb21wYXRpYmxlIGxhdGVzdC5cbiAgaWYgKGRlcGVuZGVuY3kgPT09IHR5cGVzY3JpcHREZXBlbmRlbmN5ICYmIGlzQmxpdHpSZXBvc2l0b3J5KGNvbmZpZywgcm9vdENvbmZpZykpIHtcbiAgICByZXR1cm4gYCR7ZGVwZW5kZW5jeX1AJHtnZXRNYW5hZ2VkRGVwZW5kZW5jeVZlcnNpb24oY29uZmlnLCByb290Q29uZmlnLCBkZXBlbmRlbmN5KX1gO1xuICB9XG4gIHJldHVybiBkZXBlbmRlbmN5O1xufVxuXG4vKiogV2hldGhlciB0aGUgcmVwb3NpdG9yeSBjb250YWlucyBhIEJsaXR6IGFwcCAodGhlIGN1cnJlbnQgcGFja2FnZSBvciB0aGUgd29ya3NwYWNlIHJvb3QpLiAqL1xuZnVuY3Rpb24gaXNCbGl0elJlcG9zaXRvcnkoY29uZmlnOiBQYWNrYWdlQ29uZmlnLCByb290Q29uZmlnOiBQYWNrYWdlQ29uZmlnKTogYm9vbGVhbiB7XG4gIHJldHVybiBjb25maWcuZGVwZW5kaW5nLmJsaXR6IHx8IHJvb3RDb25maWcuZGVwZW5kaW5nLmJsaXR6O1xufVxuXG5jb25zdCB3b3Jrc3BhY2VQYWNrYWdlRGlyc0NhY2hlID0gbmV3IE1hcDxzdHJpbmcsIE1hcDxzdHJpbmcsIHN0cmluZz4+KCk7XG5cbi8qKiBNYXAgZnJvbSBlYWNoIHdvcmtzcGFjZSBwYWNrYWdlJ3MgbmFtZSB0byBpdHMgZGlyZWN0b3J5IChyZWxhdGl2ZSB0byB0aGUgbW9ub3JlcG8gcm9vdCkuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0V29ya3NwYWNlUGFja2FnZURpcnMocm9vdENvbmZpZzogUGFja2FnZUNvbmZpZyk6IE1hcDxzdHJpbmcsIHN0cmluZz4ge1xuICBjb25zdCBjYWNoZWQgPSB3b3Jrc3BhY2VQYWNrYWdlRGlyc0NhY2hlLmdldChyb290Q29uZmlnLmRpclBhdGgpO1xuICBpZiAoY2FjaGVkKSByZXR1cm4gY2FjaGVkO1xuXG4gIGNvbnN0IHdvcmtzcGFjZURpcnNCeU5hbWUgPSBuZXcgTWFwPHN0cmluZywgc3RyaW5nPigpO1xuICBmb3IgKGNvbnN0IHBhY2thZ2VKc29uUGF0aCBvZiBnZXRXb3Jrc3BhY2VQYWNrYWdlSnNvblBhdGhzKHJvb3RDb25maWcpKSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHdvcmtzcGFjZVBhY2thZ2VKc29uID0gSlNPTi5wYXJzZShcbiAgICAgICAgZnMucmVhZEZpbGVTeW5jKHBhdGgucmVzb2x2ZShyb290Q29uZmlnLmRpclBhdGgsIHBhY2thZ2VKc29uUGF0aCksICd1dGY4JylcbiAgICAgICkgYXMgUGFja2FnZUpzb247XG4gICAgICBpZiAod29ya3NwYWNlUGFja2FnZUpzb24ubmFtZSkge1xuICAgICAgICB3b3Jrc3BhY2VEaXJzQnlOYW1lLnNldCh3b3Jrc3BhY2VQYWNrYWdlSnNvbi5uYW1lLCBwYXRoLnBvc2l4LmRpcm5hbWUocGFja2FnZUpzb25QYXRoKSk7XG4gICAgICB9XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBpZ25vcmUgdW5wYXJzYWJsZSB3b3Jrc3BhY2UgcGFja2FnZS5qc29uXG4gICAgfVxuICB9XG4gIHdvcmtzcGFjZVBhY2thZ2VEaXJzQ2FjaGUuc2V0KHJvb3RDb25maWcuZGlyUGF0aCwgd29ya3NwYWNlRGlyc0J5TmFtZSk7XG4gIHJldHVybiB3b3Jrc3BhY2VEaXJzQnlOYW1lO1xufVxuXG5mdW5jdGlvbiBzaG91bGRVcGRhdGVFeGlzdGluZ01hbmFnZWREZXBlbmRlbmN5KFxuICBjb25maWc6IFBhY2thZ2VDb25maWcsXG4gIHJvb3RDb25maWc6IFBhY2thZ2VDb25maWcsXG4gIGRlcGVuZGVuY3k6IHN0cmluZyxcbiAgY3VycmVudFZlcnNpb246IHN0cmluZyB8IHVuZGVmaW5lZFxuKTogYm9vbGVhbiB7XG4gIGlmICghY3VycmVudFZlcnNpb24pIHJldHVybiB0cnVlO1xuICBpZiAoY3VycmVudFZlcnNpb24gPT09ICcqJykgcmV0dXJuIHRydWU7XG4gIGlmIChpc1dvcmtzcGFjZVByb3RvY29sUmFuZ2UoY3VycmVudFZlcnNpb24pKSByZXR1cm4gdHJ1ZTtcbiAgaWYgKCFtYW5hZ2VkRGVwZW5kZW5jeU5hbWVzLmhhcyhkZXBlbmRlbmN5KSkgcmV0dXJuIGZhbHNlO1xuICBjb25zdCBtYW5hZ2VkVmVyc2lvbiA9IGdldE1hbmFnZWREZXBlbmRlbmN5VmVyc2lvbihjb25maWcsIHJvb3RDb25maWcsIGRlcGVuZGVuY3kpO1xuICBjb25zdCBjdXJyZW50VmFsaWRWZXJzaW9uID0gc2VtdmVyLnZhbGlkKGN1cnJlbnRWZXJzaW9uKTtcbiAgLy8gQSBUeXBlU2NyaXB0IDcgcGluIGluIGEgQmxpdHogcmVwb3NpdG9yeSBpcyBsaWtld2lzZSBpbmNvbXBhdGlibGUgKGBuZXh0IGJ1aWxkYCBmYWlscyBvblxuICAvLyB0aGUgTmV4dC5qcyAxNSB0aGF0IEJsaXR6IHBpbnMg4oCUIHNlZSBnZXRNYW5hZ2VkRGVwZW5kZW5jeVZlcnNpb24pLCBzbyByZXdyaXRlIGl0IHRvIHRoZVxuICAvLyBjYXBwZWQgcmVsZWFzZSBpbnN0ZWFkIG9mIHByZXNlcnZpbmcgaXQgdmlhIHRoZSBuby1kb3duZ3JhZGUgcnVsZSBiZWxvdy4gVGhlIHBpbiBtYXkgYmUgYVxuICAvLyBSQU5HRSAoZS5nLiBgXjcuMC4wYCksIHdoaWNoIHNlbXZlci52YWxpZCByZWplY3RzIOKAlCBqdWRnZSB0aGUgbWFqb3IgZnJvbSB0aGUgcmFuZ2UgbWluaW11bS5cbiAgY29uc3QgY3VycmVudFR5cGVzY3JpcHRWZXJzaW9uID1cbiAgICBjdXJyZW50VmFsaWRWZXJzaW9uID8/IChzZW12ZXIudmFsaWRSYW5nZShjdXJyZW50VmVyc2lvbikgPyBzZW12ZXIubWluVmVyc2lvbihjdXJyZW50VmVyc2lvbik/LnZlcnNpb24gOiB1bmRlZmluZWQpO1xuICBpZiAoXG4gICAgZGVwZW5kZW5jeSA9PT0gdHlwZXNjcmlwdERlcGVuZGVuY3kgJiZcbiAgICBpc0JsaXR6UmVwb3NpdG9yeShjb25maWcsIHJvb3RDb25maWcpICYmXG4gICAgY3VycmVudFR5cGVzY3JpcHRWZXJzaW9uICYmXG4gICAgc2VtdmVyLm1ham9yKGN1cnJlbnRUeXBlc2NyaXB0VmVyc2lvbikgPj0gNyAmJlxuICAgIHNlbXZlci52YWxpZChtYW5hZ2VkVmVyc2lvbikgJiZcbiAgICBpc05ld2VyUGFja2FnZVZlcnNpb24oY3VycmVudFZlcnNpb24sIG1hbmFnZWRWZXJzaW9uKVxuICApIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICAvLyBUaGUgZ2VuZXJhdGVkIGJ1bmZpZyBhcHBsaWVzIHRoZSBvcmdhbml6YXRpb24gYWdlIGdhdGUgZXZlbiB0byBleGFjdCBwaW5zLiBJZiBhIG1hbmFnZWRcbiAgLy8gdGhpcmQtcGFydHkgdG9vbCBpcyBuZXdlciB0aGFuIHRoZSBuZXdlc3QgcmVsZWFzZSB0aGF0IGNsZWFyZWQgdGhhdCBnYXRlLCBwcmVzZXJ2aW5nIHRoZSBwaW5cbiAgLy8gcHJvZHVjZXMgYSBwYWNrYWdlLmpzb24gdGhhdCBhIGZyZXNoIGluc3RhbGwgd2l0aG91dCB0aGUgb2xkIGxvY2tmaWxlIGNhbm5vdCByZXNvbHZlIChub3RhYmx5XG4gIC8vIG9wdGltaXplZCBEb2NrZXIgYnVpbGRzKS4gS2VlcCB0aGUgbm8tZG93bmdyYWRlIHBvbGljeSBvbmx5IHdoZW4gdGhlIGRlcGVuZGVuY3kgaXMgZXhlbXB0IGZyb21cbiAgLy8gdGhlIGdhdGU7IGFnZS1nYXRlZCBtYW5hZ2VkIHRvb2xzIG11c3QgY29udmVyZ2Ugb24gdGhlIHZlcnNpb24gdGhlIGdlbmVyYXRlZCBidW5maWcgYWNjZXB0cy5cbiAgaWYgKHNob3VsZERvd25ncmFkZUFnZUdhdGVkTWFuYWdlZERlcGVuZGVuY3koZGVwZW5kZW5jeSwgY3VycmVudFZlcnNpb24sIG1hbmFnZWRWZXJzaW9uKSkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIC8vIHdiZnkgb3ducyB0aGVzZSB0b29sIGRlcGVuZGVuY2llcywgYnV0IGFwcGx5aW5nIHdiZnkgc2hvdWxkIG5vdCBkb3duZ3JhZGUgYVxuICAvLyByZXBvc2l0b3J5IHRoYXQgYWxyZWFkeSBwaW5zIGEgbmV3ZXIgcmV2aWV3ZWQgcmVsZWFzZSB3aGVuIHRoZSBvcmcgcG9saWN5IGV4ZW1wdHMgaXQuXG4gIHJldHVybiBpc05ld2VyUGFja2FnZVZlcnNpb24obWFuYWdlZFZlcnNpb24sIGN1cnJlbnRWZXJzaW9uKTtcbn1cblxuZnVuY3Rpb24gc2hvdWxkRG93bmdyYWRlQWdlR2F0ZWRNYW5hZ2VkRGVwZW5kZW5jeShcbiAgZGVwZW5kZW5jeTogc3RyaW5nLFxuICBjdXJyZW50VmVyc2lvbjogc3RyaW5nIHwgdW5kZWZpbmVkLFxuICBtYW5hZ2VkVmVyc2lvbjogc3RyaW5nXG4pOiBjdXJyZW50VmVyc2lvbiBpcyBzdHJpbmcge1xuICBpZiAoIWN1cnJlbnRWZXJzaW9uKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIGNvbnN0IHZhbGlkQ3VycmVudFZlcnNpb24gPSBzZW12ZXIudmFsaWQoY3VycmVudFZlcnNpb24pO1xuICBjb25zdCB2YWxpZE1hbmFnZWRWZXJzaW9uID0gc2VtdmVyLnZhbGlkKG1hbmFnZWRWZXJzaW9uKTtcbiAgcmV0dXJuIChcbiAgICBzaG91bGRBcHBseVBhY2thZ2VBZ2VHYXRlKGRlcGVuZGVuY3kpICYmXG4gICAgdmFsaWRDdXJyZW50VmVyc2lvbiAhPT0gbnVsbCAmJlxuICAgIHZhbGlkTWFuYWdlZFZlcnNpb24gIT09IG51bGwgJiZcbiAgICBzZW12ZXIuZ3QodmFsaWRDdXJyZW50VmVyc2lvbiwgdmFsaWRNYW5hZ2VkVmVyc2lvbilcbiAgKTtcbn1cblxuLy8gVGhlIG5ld2VzdCBUeXBlU2NyaXB0IDYgcmVsZWFzZSBhdCB0aGUgdGltZSB0aGUgQmxpdHogY2FwIHNoaXBwZWQ7IHVzZWQgb25seSB3aGVuIHRoZSByZWdpc3RyeVxuLy8gbG9va3VwIGZvciB0aGUgYWN0dWFsIG5ld2VzdCBwcmUtdjcgcmVsZWFzZSBmYWlscyAoc2VlIGdldE1hbmFnZWREZXBlbmRlbmN5VmVyc2lvbikuXG5jb25zdCBsYXN0S25vd25QcmVWN1R5cGVzY3JpcHRWZXJzaW9uID0gJzYuMC4zJztcblxuZnVuY3Rpb24gZ2V0TWFuYWdlZERlcGVuZGVuY3lWZXJzaW9uKGNvbmZpZzogUGFja2FnZUNvbmZpZywgcm9vdENvbmZpZzogUGFja2FnZUNvbmZpZywgZGVwZW5kZW5jeTogc3RyaW5nKTogc3RyaW5nIHtcbiAgY29uc3QgbGF0ZXN0VmVyc2lvbiA9IGdldExhdGVzdERlcGVuZGVuY3lWZXJzaW9uKGRlcGVuZGVuY3kpO1xuICBpZiAoZGVwZW5kZW5jeSA9PT0gdHlwZXNjcmlwdERlcGVuZGVuY3kgJiYgaXNCbGl0elJlcG9zaXRvcnkoY29uZmlnLCByb290Q29uZmlnKSkge1xuICAgIC8vIEJsaXR6IHBpbnMgTmV4dC5qcyAxNSwgd2hvc2UgYnVpbGQtdGltZSBgdmVyaWZ5VHlwZVNjcmlwdFNldHVwYCByZXF1aXJlcyB0aGUgY2xhc3NpY1xuICAgIC8vIGB0eXBlc2NyaXB0YCBjb21waWxlciBBUEk7IHRoZSBUeXBlU2NyaXB0IDcgYHR5cGVzY3JpcHRgIHBhY2thZ2UgaXMgdGhlIHRzZ28gYmluYXJ5XG4gICAgLy8gd2l0aG91dCB0aGF0IEFQSSwgc28gYG5leHQgYnVpbGRgIGFib3J0cyB3aXRoIFwiRmFpbGVkIHRvIGluc3RhbGwgcmVxdWlyZWQgVHlwZVNjcmlwdFxuICAgIC8vIGRlcGVuZGVuY2llc1wiIChvYnNlcnZlZCBpbiBXaWxsQm9vc3Rlci9zdXJ2ZXktc3lzdGVtKS4gQ2FwIGB0eXBlc2NyaXB0YCBiZWxvdyA3IHVudGlsXG4gICAgLy8gQmxpdHogc3VwcG9ydHMgYSBOZXh0LmpzIHJlbGVhc2UgdGhhdCB1bmRlcnN0YW5kcyB0c2dvLiBBIGZhaWxlZCByZWdpc3RyeSBsb29rdXAgbXVzdFxuICAgIC8vIHJlc29sdmUgdG8gYSBrbm93bi1jb21wYXRpYmxlIHJlbGVhc2Ug4oCUIGZhbGxpbmcgYmFjayB0byBsYXRlc3RWZXJzaW9uIHdvdWxkIHJlaW5zdGFsbCB0aGVcbiAgICAvLyBpbmNvbXBhdGlibGUgVHlwZVNjcmlwdCA3LlxuICAgIGNvbnN0IHZhbGlkTGF0ZXN0VmVyc2lvbiA9IHNlbXZlci52YWxpZChsYXRlc3RWZXJzaW9uKTtcbiAgICBpZiAodmFsaWRMYXRlc3RWZXJzaW9uICYmIHNlbXZlci5tYWpvcih2YWxpZExhdGVzdFZlcnNpb24pIDwgNykgcmV0dXJuIGxhdGVzdFZlcnNpb247XG4gICAgLy8gVGhlIGNhcHBlZCBsb29rdXAgbXVzdCByZXNwZWN0IHRoZSBhZ2UgZ2F0ZSB0b286IHRoaXMgdmVyc2lvbiBpcyB3cml0dGVuIGFzIGFuIGV4YWN0IHBpbixcbiAgICAvLyBhbmQgQnVuIHJlZnVzZXMgdG8gcmVzb2x2ZSBvbmUgcHVibGlzaGVkIGluc2lkZSB0aGUgbWluaW11bS1yZWxlYXNlLWFnZSB3aW5kb3cuIFRoZXJlIGlzIG5vXG4gICAgLy8gdW5nYXRlZCBmYWxsYmFjayDigJQgd2l0aG91dCBwdWJsaWNhdGlvbiBtZXRhZGF0YSB0aGUgYWdlIG9mIGEgcmFuZ2UgcmVzdWx0IGlzIHVua25vd24sIHNvIGFcbiAgICAvLyBwYXJ0aWFsIHJlZ2lzdHJ5IGZhaWx1cmUgd291bGQgb3RoZXJ3aXNlIHdyaXRlIGEgdmVyc2lvbiBCdW4gdGhlbiByZWZ1c2VzIHRvIGluc3RhbGwuXG4gICAgcmV0dXJuIGdldExhdGVzdEFnZUdhdGVkVmVyc2lvbkJlbG93KHR5cGVzY3JpcHREZXBlbmRlbmN5LCAnNy4wLjAnKSA/PyBsYXN0S25vd25QcmVWN1R5cGVzY3JpcHRWZXJzaW9uO1xuICB9XG4gIHJldHVybiBsYXRlc3RWZXJzaW9uO1xufVxuXG4vKipcbiAqIFRoZSBoaWdoZXN0IHJlbGVhc2Ugb2YgYHBhY2thZ2VOYW1lYCBiZWxvdyBgZXhjbHVzaXZlVXBwZXJCb3VuZGAgdGhhdCBhbHJlYWR5IGNsZWFyZWQgdGhlIGFnZVxuICogZ2F0ZSwgb3IgdW5kZWZpbmVkIHdoZW4gdGhlIHJlZ2lzdHJ5IGxvb2t1cCBmYWlscyBvciBubyBzdWNoIHJlbGVhc2UgZXhpc3RzIHlldC5cbiAqL1xuZnVuY3Rpb24gZ2V0TGF0ZXN0QWdlR2F0ZWRWZXJzaW9uQmVsb3cocGFja2FnZU5hbWU6IHN0cmluZywgZXhjbHVzaXZlVXBwZXJCb3VuZDogc3RyaW5nKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgcmV0dXJuIGdldEFnZUdhdGVkVmVyc2lvbnNEZXNjZW5kaW5nKGdldE5wbVBhY2thZ2VUaW1lcyhwYWNrYWdlTmFtZSkpLmZpbmQoKHZlcnNpb24pID0+XG4gICAgc2VtdmVyLmx0KHZlcnNpb24sIGV4Y2x1c2l2ZVVwcGVyQm91bmQpXG4gICk7XG59XG5cbmZ1bmN0aW9uIGlzTmV3ZXJQYWNrYWdlVmVyc2lvbihjYW5kaWRhdGVWZXJzaW9uOiBzdHJpbmcsIGN1cnJlbnRWZXJzaW9uOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgY29uc3QgdmFsaWRMYXRlc3RWZXJzaW9uID0gc2VtdmVyLnZhbGlkKGNhbmRpZGF0ZVZlcnNpb24pO1xuICBjb25zdCB2YWxpZEN1cnJlbnRWZXJzaW9uID0gc2VtdmVyLnZhbGlkKGN1cnJlbnRWZXJzaW9uKTtcbiAgcmV0dXJuICF2YWxpZExhdGVzdFZlcnNpb24gfHwgIXZhbGlkQ3VycmVudFZlcnNpb24gfHwgc2VtdmVyLmd0KHZhbGlkTGF0ZXN0VmVyc2lvbiwgdmFsaWRDdXJyZW50VmVyc2lvbik7XG59XG5cbmZ1bmN0aW9uIGlzV29ya3NwYWNlUHJvdG9jb2xSYW5nZSh2ZXJzaW9uOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgcmV0dXJuIHZlcnNpb24uc3RhcnRzV2l0aCgnd29ya3NwYWNlOicpO1xufVxuXG5mdW5jdGlvbiBmb3JtYXRSZXBvc2l0b3J5Rm9yUGFja2FnZUpzb24oXG4gIHJlcG9zaXRvcnk6IFBhY2thZ2VKc29uWydyZXBvc2l0b3J5J10sXG4gIGV4aXN0aW5nUmVwb3NpdG9yeT86IFBhY2thZ2VKc29uWydyZXBvc2l0b3J5J11cbik6IFBhY2thZ2VKc29uWydyZXBvc2l0b3J5J10ge1xuICBjb25zdCBub3JtYWxpemVkUmVwb3NpdG9yeSA9IG5vcm1hbGl6ZVJlcG9zaXRvcnlVcmxGb3JQYWNrYWdlSnNvbihyZXBvc2l0b3J5KTtcbiAgaWYgKG5vcm1hbGl6ZWRSZXBvc2l0b3J5KSB7XG4gICAgcmV0dXJuIGJ1aWxkTm9ybWFsaXplZFJlcG9zaXRvcnlGb3JQYWNrYWdlSnNvbihub3JtYWxpemVkUmVwb3NpdG9yeSwgcmVwb3NpdG9yeSwgZXhpc3RpbmdSZXBvc2l0b3J5KTtcbiAgfVxuXG4gIGNvbnN0IG5vcm1hbGl6ZWRFeGlzdGluZ1JlcG9zaXRvcnkgPSBub3JtYWxpemVSZXBvc2l0b3J5VXJsRm9yUGFja2FnZUpzb24oZXhpc3RpbmdSZXBvc2l0b3J5KTtcbiAgaWYgKG5vcm1hbGl6ZWRFeGlzdGluZ1JlcG9zaXRvcnkpIHtcbiAgICByZXR1cm4gYnVpbGROb3JtYWxpemVkUmVwb3NpdG9yeUZvclBhY2thZ2VKc29uKG5vcm1hbGl6ZWRFeGlzdGluZ1JlcG9zaXRvcnksIGV4aXN0aW5nUmVwb3NpdG9yeSk7XG4gIH1cblxuICByZXR1cm4gcmVwb3NpdG9yeTtcbn1cblxuZnVuY3Rpb24gbm9ybWFsaXplUmVwb3NpdG9yeVVybEZvclBhY2thZ2VKc29uKHJlcG9zaXRvcnk6IFBhY2thZ2VKc29uWydyZXBvc2l0b3J5J10pOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBpZiAodHlwZW9mIHJlcG9zaXRvcnkgPT09ICdzdHJpbmcnKSB7XG4gICAgaWYgKCFyZXBvc2l0b3J5LnN0YXJ0c1dpdGgoJ2dpdGh1YjonKSkgcmV0dXJuO1xuXG4gICAgY29uc3QgW293bmVyLCByZXBvXSA9IGdpdEh1YlV0aWwuZ2V0T3JnQW5kTmFtZShyZXBvc2l0b3J5KTtcbiAgICBpZiAoIW93bmVyIHx8ICFyZXBvKSByZXR1cm47XG4gICAgcmV0dXJuIGBnaXQraHR0cHM6Ly9naXRodWIuY29tLyR7b3duZXJ9LyR7cmVwb30uZ2l0YDtcbiAgfVxuXG4gIGNvbnN0IHJlcG9zaXRvcnlVcmwgPSByZXBvc2l0b3J5Py51cmw7XG4gIGlmICh0eXBlb2YgcmVwb3NpdG9yeVVybCAhPT0gJ3N0cmluZycpIHJldHVybjtcblxuICBjb25zdCBtYXRjaGVkID0gL14oPzpnaXRcXCspP2h0dHBzOlxcL1xcL2dpdGh1YlxcLmNvbVxcLyhbXi9dKylcXC8oW14vXSs/KSg/OlxcLmdpdCk/JC91LmV4ZWMocmVwb3NpdG9yeVVybCk7XG4gIGlmICghbWF0Y2hlZCkgcmV0dXJuO1xuXG4gIGNvbnN0IFssIG93bmVyLCByZXBvXSA9IG1hdGNoZWQ7XG4gIHJldHVybiBgZ2l0K2h0dHBzOi8vZ2l0aHViLmNvbS8ke293bmVyfS8ke3JlcG99LmdpdGA7XG59XG5cbmZ1bmN0aW9uIGJ1aWxkTm9ybWFsaXplZFJlcG9zaXRvcnlGb3JQYWNrYWdlSnNvbihcbiAgbm9ybWFsaXplZFVybDogc3RyaW5nLFxuICByZXBvc2l0b3J5OiBQYWNrYWdlSnNvblsncmVwb3NpdG9yeSddLFxuICBleGlzdGluZ1JlcG9zaXRvcnk/OiBQYWNrYWdlSnNvblsncmVwb3NpdG9yeSddXG4pOiBQYWNrYWdlSnNvblsncmVwb3NpdG9yeSddIHtcbiAgY29uc3QgcmVwb3NpdG9yeU9iaiA9XG4gICAgdHlwZW9mIHJlcG9zaXRvcnkgPT09ICdvYmplY3QnXG4gICAgICA/IHJlcG9zaXRvcnlcbiAgICAgIDogdHlwZW9mIGV4aXN0aW5nUmVwb3NpdG9yeSA9PT0gJ29iamVjdCdcbiAgICAgICAgPyBleGlzdGluZ1JlcG9zaXRvcnlcbiAgICAgICAgOiB1bmRlZmluZWQ7XG5cbiAgcmV0dXJuIHtcbiAgICAuLi5yZXBvc2l0b3J5T2JqLFxuICAgIHR5cGU6ICdnaXQnLFxuICAgIHVybDogbm9ybWFsaXplZFVybCxcbiAgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdlbmVyYXRlU2NyaXB0cyhjb25maWc6IFBhY2thZ2VDb25maWcsIG9sZFNjcmlwdHM6IFBhY2thZ2VKc29uLlNjcmlwdHMpOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+IHtcbiAgY29uc3QgaGFzVHlwZWNoZWNrID0gY29uZmlnLmRvZXNDb250YWluVHlwZVNjcmlwdCB8fCBjb25maWcuZG9lc0NvbnRhaW5UeXBlU2NyaXB0SW5QYWNrYWdlcztcbiAgY29uc3Qgc2NyaXB0czogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHtcbiAgICAvLyBObyBgLS1idW5gOiBpdHMgbm9kZS0+YnVuIFBBVEggc2hpbSBsZWFrcyBpbnRvIGV2ZXJ5IGNoaWxkIHByb2Nlc3MgYW5kIGJyZWFrcyB0b29sc1xuICAgIC8vIHJlcXVpcmluZyByZWFsIE5vZGUuanMgKFBsYXl3cmlnaHQsIHdyYW5nbGVyLCB2aW5leHQpLlxuICAgIGNsZWFudXA6ICdidW4gd2IgbGludCAtLWZpeCAtLWZvcm1hdCcsXG4gICAgZm9ybWF0OiBgYnVuIHdiIGxpbnQgLS1mb3JtYXRgLFxuICAgIGxpbnQ6IGBidW4gd2IgbGludGAsXG4gICAgJ2xpbnQtZml4JzogJ2J1biB3YiBsaW50IC0tZml4JyxcbiAgICB0ZXN0OiAnYnVuIHdiIHRlc3QnLFxuICAgIHR5cGVjaGVjazogJ2J1biB3YiB0eXBlY2hlY2snLFxuICAgIHZlcmlmeTogJ2J1biB3YiB2ZXJpZnknLFxuICAgICd2ZXJpZnktZnVsbCc6ICdidW4gd2IgdmVyaWZ5IC0tZnVsbCcsXG4gIH07XG4gIGlmIChjb25maWcuaXNSb290KSB7XG4gICAgYXBwbHlUZXN0T25DaVNjcmlwdChzY3JpcHRzLCBvbGRTY3JpcHRzKTtcbiAgfVxuICBhcHBseVRlc3RTY3JpcHQoY29uZmlnLCBzY3JpcHRzLCBvbGRTY3JpcHRzKTtcbiAga2VlcEdlbmVyYXRlZFNjcmlwdFdyYXBwZXJzKHNjcmlwdHMsIG9sZFNjcmlwdHMsIFsndGVzdCcsICd2ZXJpZnktZnVsbCddKTtcbiAgYXBwbHlEYXRhYmFzZVNjcmlwdHMoY29uZmlnLCBzY3JpcHRzLCBvbGRTY3JpcHRzLCBgYnVuICR7Z2V0V2JEYXRhYmFzZUNvbW1hbmQoY29uZmlnKX1gKTtcbiAgYXBwbHlNaXNlVGFza1NjcmlwdHMoY29uZmlnLCBzY3JpcHRzLCBvbGRTY3JpcHRzLCBbJ2J1aWxkJywgJ2RldicsICdzdGFydCcsICd0ZXN0JywgJ3R5cGVjaGVjayddKTtcbiAgaWYgKCFoYXNUeXBlY2hlY2spIHtcbiAgICBkZWxldGUgc2NyaXB0cy50eXBlY2hlY2s7XG4gIH0gZWxzZSBpZiAoY29uZmlnLmRlcGVuZGluZy5weXJpZ2h0KSB7XG4gICAgc2NyaXB0cy50eXBlY2hlY2sgKz0gJyAmJiBweXJpZ2h0JztcbiAgfVxuICByZXR1cm4gc2NyaXB0cztcbn1cblxuLy8gQ0kgd29ya2Zsb3dzIChib3RoIHRoZSByZXVzYWJsZSB0ZXN0IHdvcmtmbG93IGFuZCB0aGUgc2VsZi1jb250YWluZWQgdmFyaWFudCBmb3Igbm9uLVdpbGxCb29zdGVyXG4vLyByZXBvc2l0b3JpZXMpIHByZWZlciBgdGVzdC9jaWAgb3ZlciBgdGVzdGAsIHNvIHN0YW5kYXJkaXplIGl0IG9uIGB3YiB0ZXN0LW9uLWNpYCBhdCB0aGUgcm9vdCDigJRcbi8vIGB3YiB0ZXN0LW9uLWNpYCBhbHJlYWR5IGl0ZXJhdGVzIHdvcmtzcGFjZSBwYWNrYWdlcyBpdHNlbGYuXG5mdW5jdGlvbiBhcHBseVRlc3RPbkNpU2NyaXB0KHNjcmlwdHM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4sIG9sZFNjcmlwdHM6IFBhY2thZ2VKc29uLlNjcmlwdHMpOiB2b2lkIHtcbiAgY29uc3Qgb2xkU2NyaXB0ID0gb2xkU2NyaXB0c1sndGVzdC9jaSddO1xuICAvLyBTb21lIHJlcG9zaXRvcmllcyB3cmFwIENJIHRlc3RzIHdpdGggZXh0cmEgc3RlcHMgKGUuZy4gc2VsZWN0aW5nIHNwZWMgZmlsZXMgb3IgcnVubmluZyByYXdcbiAgLy8gUGxheXdyaWdodCkgdGhhdCB3YiBjYW5ub3QgaW5mZXIgZ2VuZXJpY2FsbHk7IHN1Y2ggd3JhcHBlcnMgYXJlIHByZXNlcnZlZC5cbiAgc2NyaXB0c1sndGVzdC9jaSddID0gb2xkU2NyaXB0ICYmICFpc0dlbmVyYXRlZFRlc3RPbkNpU2NyaXB0KG9sZFNjcmlwdCkgPyBvbGRTY3JpcHQgOiAnYnVuIHdiIHRlc3Qtb24tY2knO1xufVxuXG4vKiogV2hldGhlciBhIHNjcmlwdCBib2R5IGlzIG9uZSBvZiB0aGUgZ2VuZXJhdGVkIGB3YiB0ZXN0LW9uLWNpYCBpbnZvY2F0aW9ucy4gKi9cbmZ1bmN0aW9uIGlzR2VuZXJhdGVkVGVzdE9uQ2lTY3JpcHQoc2NyaXB0OiBzdHJpbmcpOiBib29sZWFuIHtcbiAgcmV0dXJuIHNjcmlwdC50cmltKCkgPT09ICdidW4gd2IgdGVzdC1vbi1jaSc7XG59XG5cbi8qKlxuICogYHdiIHRlc3RgIHJ1bnMgSmF2YVNjcmlwdC9UeXBlU2NyaXB0IHRlc3QgcnVubmVycyBvbmx5LCBzbyByZXBsYWNpbmcgdGhlIGB0ZXN0YCBzY3JpcHQgb2YgYVxuICogcGFja2FnZSB3cml0dGVuIGluIGFub3RoZXIgbGFuZ3VhZ2UgKGUuZy4gYSBNYXZlbiBvciBhbiBSU3BlYyBwYWNrYWdlIGluIGEgcG9seWdsb3QgbW9ub3JlcG8pXG4gKiBzaWxlbnRseSBkcm9wcyBpdHMgd2hvbGUgc3VpdGU6IHRoZSBnZW5lcmF0ZWQgc2NyaXB0IHRoZW4gc3VjY2VlZHMgd2l0aG91dCBydW5uaW5nIGFueXRoaW5nLlxuICogU3VjaCBhIHBhY2thZ2Uga2VlcHMgaXRzIG93biBgdGVzdGAgc2NyaXB0OyBKUy9UUyBwYWNrYWdlcyBhcmUgc3RhbmRhcmRpemVkIGFzIHVzdWFsLlxuICovXG5mdW5jdGlvbiBhcHBseVRlc3RTY3JpcHQoXG4gIGNvbmZpZzogUGFja2FnZUNvbmZpZyxcbiAgc2NyaXB0czogUmVjb3JkPHN0cmluZywgc3RyaW5nPixcbiAgb2xkU2NyaXB0czogUGFja2FnZUpzb24uU2NyaXB0c1xuKTogdm9pZCB7XG4gIGNvbnN0IG9sZFNjcmlwdCA9IG9sZFNjcmlwdHMudGVzdD8udHJpbSgpO1xuICBpZiAoIW9sZFNjcmlwdCB8fCBkb2VzQ29udGFpbkpzT3JUcyhjb25maWcpIHx8IGlzR2VuZXJhdGVkVGVzdFNjcmlwdChvbGRTY3JpcHQpKSByZXR1cm47XG4gIHNjcmlwdHMudGVzdCA9IG9sZFNjcmlwdDtcbn1cblxuLyoqIFdoZXRoZXIgYSBzY3JpcHQgYm9keSBpcyBvbmUgb2YgdGhlIEtOT1dOIGdlbmVyYXRlZCBgd2IgdGVzdGAgaW52b2NhdGlvbnMuICovXG5mdW5jdGlvbiBpc0dlbmVyYXRlZFRlc3RTY3JpcHQoc2NyaXB0OiBzdHJpbmcpOiBib29sZWFuIHtcbiAgcmV0dXJuIHNjcmlwdC50cmltKCkgPT09ICdidW4gd2IgdGVzdCc7XG59XG5cbi8qKlxuICogS2VlcHMgYSBzY3JpcHQgdGhhdCBDSEFJTlMgZXh0cmEgY29tbWFuZHMgb250byB0aGUgZ2VuZXJhdGVkIG9uZSAoZS5nLiBhIHBvbHlnbG90IG1vbm9yZXBvXG4gKiBhcHBlbmRpbmcgaXRzIE1hdmVuIGFuZCBSU3BlYyBzdWl0ZXMgdG8gYHdiIHRlc3RgLCB3aGljaCBydW5zIEphdmFTY3JpcHQvVHlwZVNjcmlwdCBydW5uZXJzXG4gKiBvbmx5KS4gU3VjaCBhIHdyYXBwZXIgc3RpbGwgcnVucyB0aGUgZ2VuZXJhdGVkIGNvbW1hbmQsIHNvIHJlcGxhY2luZyBpdCB3b3VsZCBzaWxlbnRseSBkcm9wIHRoZVxuICogcmVwb3NpdG9yeSdzIG93biBzdGVwcyDigJQgdGhlIHNhbWUgcmVhc29uaW5nIGFzIGBhcHBseVRlc3RPbkNpU2NyaXB0YC4gQW4gdW5yZWNvZ25pemVkIGNoYWluZWRcbiAqIHNjcmlwdCBpcyBrZXB0IHdob2xlc2FsZSByYXRoZXIgdGhhbiBsb3NpbmcgaXRzIHByb2plY3Qtb3duZWQgY29tbWFuZHMuXG4gKi9cbmZ1bmN0aW9uIGtlZXBHZW5lcmF0ZWRTY3JpcHRXcmFwcGVycyhcbiAgc2NyaXB0czogUmVjb3JkPHN0cmluZywgc3RyaW5nPixcbiAgb2xkU2NyaXB0czogUGFja2FnZUpzb24uU2NyaXB0cyxcbiAgc2NyaXB0TmFtZXM6IHN0cmluZ1tdXG4pOiB2b2lkIHtcbiAgZm9yIChjb25zdCBzY3JpcHROYW1lIG9mIHNjcmlwdE5hbWVzKSB7XG4gICAgY29uc3Qgb2xkU2NyaXB0ID0gb2xkU2NyaXB0c1tzY3JpcHROYW1lXT8udHJpbSgpO1xuICAgIGNvbnN0IGdlbmVyYXRlZFNjcmlwdCA9IHNjcmlwdHNbc2NyaXB0TmFtZV07XG4gICAgaWYgKCFvbGRTY3JpcHQgfHwgIWdlbmVyYXRlZFNjcmlwdCB8fCBvbGRTY3JpcHQgPT09IGdlbmVyYXRlZFNjcmlwdCkgY29udGludWU7XG4gICAgY29uc3QgaGVhZFJlZ0V4cCA9IG5ldyBSZWdFeHAoXG4gICAgICBgXiR7ZXNjYXBlUmVnRXhwKGdlbmVyYXRlZFNjcmlwdCkucmVwbGFjZUFsbCgnICcsIFN0cmluZy5yYXdgWyBcXHRdK2ApfSg/PVsgXFxcXHRdKig/OiYmfFxcXFx8XFxcXHx8O3xcXFxcbikpYCxcbiAgICAgICd1J1xuICAgICk7XG4gICAgLy8gQSBuZXdsaW5lIHNlcGFyYXRlcyBzaGVsbCBjb21tYW5kcyBqdXN0IGxpa2UgJiYsIHx8IGFuZCA7LlxuICAgIGlmIChoZWFkUmVnRXhwLnRlc3Qob2xkU2NyaXB0KSkge1xuICAgICAgLy8gQSBmdW5jdGlvbiByZXBsYWNlbWVudCBrZWVwcyBgJGAtc2hhcGVkIGNoYXJhY3RlcnMgaW4gdGhlIGdlbmVyYXRlZCBjb21tYW5kIGxpdGVyYWwuXG4gICAgICBzY3JpcHRzW3NjcmlwdE5hbWVdID0gb2xkU2NyaXB0LnJlcGxhY2UoaGVhZFJlZ0V4cCwgKCkgPT4gZ2VuZXJhdGVkU2NyaXB0KTtcbiAgICB9IGVsc2UgaWYgKC8oPzomJnxcXHxcXHx8O3xcXG4pL3UudGVzdChvbGRTY3JpcHQpKSB7XG4gICAgICBzY3JpcHRzW3NjcmlwdE5hbWVdID0gb2xkU2NyaXB0O1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBhcHBseURhdGFiYXNlU2NyaXB0cyhcbiAgY29uZmlnOiBQYWNrYWdlQ29uZmlnLFxuICBzY3JpcHRzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+LFxuICBvbGRTY3JpcHRzOiBQYWNrYWdlSnNvbi5TY3JpcHRzLFxuICB3YkRiQ29tbWFuZDogc3RyaW5nXG4pOiB2b2lkIHtcbiAgaWYgKCFjb25maWcuZGVwZW5kaW5nLnByaXNtYSAmJiAhY29uZmlnLmRlcGVuZGluZy5kcml6emxlKSByZXR1cm47XG5cbiAgYXBwbHlEYXRhYmFzZVNjcmlwdChzY3JpcHRzLCBvbGRTY3JpcHRzLCAnZGItY3JlYXRlLW1pZ3JhdGlvbicsIGAke3diRGJDb21tYW5kfSBtaWdyYXRlLWRldmAsICdtaWdyYXRlLWRldicpO1xuICBhcHBseURhdGFiYXNlU2NyaXB0KFxuICAgIHNjcmlwdHMsXG4gICAgb2xkU2NyaXB0cyxcbiAgICAnZGItbWlncmF0ZScsXG4gICAgYCR7d2JEYkNvbW1hbmR9IG1pZ3JhdGUgLS1jaGVjay1pZGVtcG90ZW5jeWAsXG4gICAgJ21pZ3JhdGUgLS1jaGVjay1pZGVtcG90ZW5jeSdcbiAgKTtcbiAgYXBwbHlEYXRhYmFzZVNjcmlwdChzY3JpcHRzLCBvbGRTY3JpcHRzLCAnZGItdmlldycsIGAke3diRGJDb21tYW5kfSBzdHVkaW9gLCAnc3R1ZGlvJyk7XG59XG5cbmZ1bmN0aW9uIGFwcGx5RGF0YWJhc2VTY3JpcHQoXG4gIHNjcmlwdHM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4sXG4gIG9sZFNjcmlwdHM6IFBhY2thZ2VKc29uLlNjcmlwdHMsXG4gIG5hbWU6IHN0cmluZyxcbiAgZ2VuZXJhdGVkU2NyaXB0OiBzdHJpbmcsXG4gIGdlbmVyYXRlZEFyZ3VtZW50czogc3RyaW5nXG4pOiB2b2lkIHtcbiAgY29uc3Qgb2xkU2NyaXB0ID0gb2xkU2NyaXB0c1tuYW1lXTtcbiAgLy8gU29tZSByZXBvc2l0b3JpZXMgd3JhcCBtaWdyYXRpb24gY29tbWFuZHMgdG8gcHJlcGFyZSBTUUxpdGUgZGlyZWN0b3JpZXMsXG4gIC8vIGZhbiBvdXQgb3ZlciB0ZW5hbnRzLCBvciBwZXJmb3JtIGNsZWFudXAgdGhhdCB3YiBjYW5ub3QgaW5mZXIgZ2VuZXJpY2FsbHkuXG4gIGNvbnN0IGdlbmVyYXRlZEJvZGllcyA9IFtgYnVuIHdiIGRiICR7Z2VuZXJhdGVkQXJndW1lbnRzfWAsIGBidW4gd2IgcHJpc21hICR7Z2VuZXJhdGVkQXJndW1lbnRzfWBdO1xuICBzY3JpcHRzW25hbWVdID0gb2xkU2NyaXB0ICYmICFnZW5lcmF0ZWRCb2RpZXMuaW5jbHVkZXMob2xkU2NyaXB0LnRyaW0oKSkgPyBvbGRTY3JpcHQgOiBnZW5lcmF0ZWRTY3JpcHQ7XG59XG5cbmZ1bmN0aW9uIGdldFdiRGF0YWJhc2VDb21tYW5kKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6ICd3YiBkYicgfCAnd2IgcHJpc21hJyB7XG4gIGlmIChjb25maWcuZGVwZW5kaW5nLnByaXNtYSkgcmV0dXJuICd3YiBwcmlzbWEnO1xuICByZXR1cm4gJ3diIGRiJztcbn1cblxuZnVuY3Rpb24gaXNXYlBhY2thZ2UocGFja2FnZUpzb246IFBhY2thZ2VKc29uIHwgdW5kZWZpbmVkKTogYm9vbGVhbiB7XG4gIHJldHVybiBwYWNrYWdlSnNvbj8ubmFtZSA9PT0gd2JEZXBlbmRlbmN5O1xufVxuXG5mdW5jdGlvbiBhcHBseU1pc2VUYXNrU2NyaXB0cyhcbiAgY29uZmlnOiBQYWNrYWdlQ29uZmlnLFxuICBzY3JpcHRzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+LFxuICBvbGRTY3JpcHRzOiBQYWNrYWdlSnNvbi5TY3JpcHRzLFxuICBuYW1lczogc3RyaW5nW11cbik6IHZvaWQge1xuICBmb3IgKGNvbnN0IG5hbWUgb2YgbmFtZXMpIHtcbiAgICBpZiAoIWhhc01pc2VUYXNrKGNvbmZpZywgbmFtZSkpIGNvbnRpbnVlO1xuICAgIGlmIChkb2VzTWlzZVRhc2tDYWxsUGFja2FnZVNjcmlwdChjb25maWcsIG5hbWUpKSBjb250aW51ZTtcbiAgICAvLyBQcmVzZXJ2ZSBhIGxlYWRpbmcgYEtFWT1WQUxVRSBgIGVudiBwcmVmaXggKGUuZy4gYE1JU0VfRU5WPXRlc3RgKSBvbiBhbiBleGlzdGluZyBtaXNlIGJyaWRnZS5cbiAgICAvLyBTdWNoIGEgcHJlZml4IGlzIHJlcXVpcmVkIGZvciBtaXNlIGNvbmZpZyBlbnZpcm9ubWVudHMgKG1pc2UuPE1JU0VfRU5WPi50b21sKSwgd2hpY2ggYXJlXG4gICAgLy8gc2VsZWN0ZWQgZnJvbSBNSVNFX0VOViAqYmVmb3JlKiBtaXNlIHN0YXJ0cyBhbmQgY2Fubm90IGJlIHN3aXRjaGVkIGZyb20gaW5zaWRlIGEgdGFzazsgZHJvcHBpbmdcbiAgICAvLyBpdCB3b3VsZCBzaWxlbnRseSBydW4gdGhlIHRhc2sgaW4gdGhlIGRlZmF1bHQgZW52aXJvbm1lbnQuXG4gICAgY29uc3QgZW52UHJlZml4ID0gZXh0cmFjdE1pc2VCcmlkZ2VFbnZQcmVmaXgob2xkU2NyaXB0c1tuYW1lXSwgbmFtZSk7XG4gICAgaWYgKGVudlByZWZpeCA9PT0gdW5kZWZpbmVkICYmIG9sZFNjcmlwdHNbbmFtZV0gJiYgIShuYW1lIGluIHNjcmlwdHMpKSBjb250aW51ZTtcbiAgICBzY3JpcHRzW25hbWVdID0gYCR7ZW52UHJlZml4ID8/ICcnfW1pc2UgcnVuICR7bmFtZX1gO1xuICB9XG59XG5cbi8qKlxuICogUmV0dXJucyB0aGUgbGVhZGluZyBgS0VZPVZBTFVFIGAgZW52LXZhciBwcmVmaXggb2YgYW4gZXhpc3RpbmcgYG1pc2UgcnVuIDxuYW1lPmAgYnJpZGdlIHNjcmlwdFxuICogKHBvc3NpYmx5IGFuIGVtcHR5IHN0cmluZyB3aGVuIHRoZSBicmlkZ2UgaGFzIG5vIHByZWZpeCksIG9yIGB1bmRlZmluZWRgIHdoZW4gdGhlIHNjcmlwdCBpcyBub3QgYVxuICogbWlzZSBicmlkZ2UgZm9yIHRoZSBnaXZlbiB0YXNrLlxuICovXG5mdW5jdGlvbiBleHRyYWN0TWlzZUJyaWRnZUVudlByZWZpeChzY3JpcHQ6IHVua25vd24sIG5hbWU6IHN0cmluZyk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGlmICh0eXBlb2Ygc2NyaXB0ICE9PSAnc3RyaW5nJykgcmV0dXJuIHVuZGVmaW5lZDtcbiAgLy8gRWFjaCBhc3NpZ25tZW50IHZhbHVlIG1heSBiZSBkb3VibGUtcXVvdGVkLCBzaW5nbGUtcXVvdGVkLCBvciBhbiB1bnF1b3RlZCBydW4gb2Ygbm9uLXdoaXRlc3BhY2UsXG4gIC8vIHNvIHByZWZpeGVzIGxpa2UgYE1JU0VfRU5WPVwiYSBiXCJgICh3aG9zZSB2YWx1ZSBjb250YWlucyBzcGFjZXMpIGFyZSBtYXRjaGVkIGluc3RlYWQgb2YgZHJvcHBlZC5cbiAgY29uc3QgbWF0Y2ggPSBuZXcgUmVnRXhwKFN0cmluZy5yYXdgXigoPzpcXHcrPSg/OlwiW15cIl0qXCJ8J1teJ10qJ3xcXFMrKVxccyspKiltaXNlIHJ1biAke2VzY2FwZVJlZ0V4cChuYW1lKX0kYCwgJ3UnKS5leGVjKFxuICAgIHNjcmlwdC50cmltKClcbiAgKTtcbiAgcmV0dXJuIG1hdGNoPy5bMV07XG59XG5cbmZ1bmN0aW9uIGhhc01pc2VUYXNrKGNvbmZpZzogUGFja2FnZUNvbmZpZywgbmFtZTogc3RyaW5nKTogYm9vbGVhbiB7XG4gIHJldHVybiBPYmplY3QuaGFzT3duKGNvbmZpZy5taXNlVGFza3MsIG5hbWUpO1xufVxuXG5mdW5jdGlvbiBkb2VzTWlzZVRhc2tDYWxsUGFja2FnZVNjcmlwdChjb25maWc6IFBhY2thZ2VDb25maWcsIG5hbWU6IHN0cmluZyk6IGJvb2xlYW4ge1xuICBjb25zdCB0YXNrID0gY29uZmlnLm1pc2VUYXNrc1tuYW1lXTtcbiAgaWYgKCF0YXNrKSByZXR1cm4gZmFsc2U7XG4gIGNvbnN0IHBhY2thZ2VNYW5hZ2VycyA9IFsnYnVuJywgJ3lhcm4nLCAnbnBtJywgJ3BucG0nXTtcbiAgcmV0dXJuIHBhY2thZ2VNYW5hZ2Vycy5zb21lKChwYWNrYWdlTWFuYWdlcikgPT5cbiAgICBuZXcgUmVnRXhwKFN0cmluZy5yYXdgXFxiJHtwYWNrYWdlTWFuYWdlcn1cXHMrKD86cnVuXFxzKyk/JHtlc2NhcGVSZWdFeHAobmFtZSl9KD8hW2EtekEtWjAtOV9cXC06Ll0pYCwgJ3UnKS50ZXN0KHRhc2spXG4gICk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHVwZGF0ZVByaXZhdGVQYWNrYWdlcyhqc29uT2JqOiBXcml0YWJsZVBhY2thZ2VKc29uKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IHBhY2thZ2VOYW1lcyA9IG5ldyBTZXQoWy4uLk9iamVjdC5rZXlzKGpzb25PYmouZGVwZW5kZW5jaWVzKSwgLi4uT2JqZWN0LmtleXMoanNvbk9iai5kZXZEZXBlbmRlbmNpZXMpXSk7XG4gIGNvbnN0IHByaXZhdGVQYWNrYWdlczoge1xuICAgIHBhY2thZ2VOYW1lOiBzdHJpbmc7XG4gICAgb3JnOiBzdHJpbmc7XG4gICAgcmVwbzogc3RyaW5nO1xuICAgIHRhcmdldDogJ2RlcGVuZGVuY2llcycgfCAnZGV2RGVwZW5kZW5jaWVzJztcbiAgfVtdID0gW1xuICAgIHsgcGFja2FnZU5hbWU6ICdAd2lsbGJvb3N0ZXIvY29kZS1hbmFseXplcicsIG9yZzogJ1dpbGxCb29zdGVyJywgcmVwbzogJ2NvZGUtYW5hbHl6ZXInLCB0YXJnZXQ6ICdkZXZEZXBlbmRlbmNpZXMnIH0sXG4gICAgeyBwYWNrYWdlTmFtZTogJ0B3aWxsYm9vc3Rlci9qdWRnZScsIG9yZzogJ1dpbGxCb29zdGVyTGFiJywgcmVwbzogJ2p1ZGdlJywgdGFyZ2V0OiAnZGVwZW5kZW5jaWVzJyB9LFxuICAgIHsgcGFja2FnZU5hbWU6ICdAd2lsbGJvb3N0ZXIvbGxtLXByb3h5Jywgb3JnOiAnV2lsbEJvb3N0ZXJMYWInLCByZXBvOiAnbGxtLXByb3h5JywgdGFyZ2V0OiAnZGVwZW5kZW5jaWVzJyB9LFxuICBdO1xuXG4gIGF3YWl0IFByb21pc2UuYWxsKFxuICAgIHByaXZhdGVQYWNrYWdlcy5tYXAoYXN5bmMgKHsgb3JnLCBwYWNrYWdlTmFtZSwgcmVwbywgdGFyZ2V0IH0pID0+IHtcbiAgICAgIGlmICghcGFja2FnZU5hbWVzLmhhcyhwYWNrYWdlTmFtZSkgfHwgaXNXb3Jrc3BhY2VQYWNrYWdlKGpzb25PYmosIHBhY2thZ2VOYW1lKSkgcmV0dXJuO1xuXG4gICAgICBjb25zdCBleGlzdGluZ1NwZWNpZmllciA9IGpzb25PYmouZGVwZW5kZW5jaWVzW3BhY2thZ2VOYW1lXSA/PyBqc29uT2JqLmRldkRlcGVuZGVuY2llc1twYWNrYWdlTmFtZV07XG4gICAgICBjb25zdCBvdGhlclRhcmdldCA9IHRhcmdldCA9PT0gJ2RlcGVuZGVuY2llcycgPyAnZGV2RGVwZW5kZW5jaWVzJyA6ICdkZXBlbmRlbmNpZXMnO1xuICAgICAgLy8gVGhlIGxpbnQgcnVsZSBkaXNhbGxvd3MgYGRlbGV0ZWAgd2l0aCBjb21wdXRlZCBwYWNrYWdlIG5hbWVzOyBSZWZsZWN0IGhhcyB0aGUgc2FtZSBkZWxldGlvbiBzZW1hbnRpY3MgaGVyZS5cbiAgICAgIFJlZmxlY3QuZGVsZXRlUHJvcGVydHkoanNvbk9ialtvdGhlclRhcmdldF0sIHBhY2thZ2VOYW1lKTtcbiAgICAgIGpzb25PYmpbdGFyZ2V0XVtwYWNrYWdlTmFtZV0gPSBpc1Bpbm5lZFByaXZhdGVQYWNrYWdlU3BlY2lmaWVyKGV4aXN0aW5nU3BlY2lmaWVyLCBvcmcsIHJlcG8pXG4gICAgICAgID8gZXhpc3RpbmdTcGVjaWZpZXJcbiAgICAgICAgOiBhd2FpdCBnZXRMYXRlc3RQcml2YXRlUGFja2FnZVNwZWNpZmllcihvcmcsIHJlcG8pO1xuICAgIH0pXG4gICk7XG59XG5cbi8qKlxuICogV2hldGhlciB0aGUgZXhpc3Rpbmcgc3BlY2lmaWVyIGFscmVhZHkgcGlucyBhIGdpdCByZWYgb2YgdGhlIGV4cGVjdGVkIHByaXZhdGUgcmVwb3NpdG9yeS5cbiAqIHdiZnkgbXVzdCBub3QgYnVtcCBzdWNoIHBpbnM6IGEgcnVuIGludGVuZGVkIGFzIGNvbmZpZ3VyYXRpb24vcGFja2FnZS1tYW5hZ2VyIG1haW50ZW5hbmNlXG4gKiB3b3VsZCBvdGhlcndpc2UgY2hhbmdlIHRoZSBkZXBlbmRlbmN5J3MgdmVyc2lvbiBhcyBhIHNpZGUgZWZmZWN0ICh1cGRhdGluZyBwaW5zIGlzIFJlbm92YXRlJ3NcbiAqIGpvYiksIHBvc3NpYmx5IHRvIGEgY29tbWl0IHdob3NlIHByZWJ1aWx0IGFydGlmYWN0cyBhcmUgbWlzc2luZy5cbiAqL1xuZnVuY3Rpb24gaXNQaW5uZWRQcml2YXRlUGFja2FnZVNwZWNpZmllcihcbiAgc3BlY2lmaWVyOiBzdHJpbmcgfCB1bmRlZmluZWQsXG4gIG9yZzogc3RyaW5nLFxuICByZXBvOiBzdHJpbmdcbik6IHNwZWNpZmllciBpcyBzdHJpbmcge1xuICBpZiAoIXNwZWNpZmllcikgcmV0dXJuIGZhbHNlO1xuICByZXR1cm4gbmV3IFJlZ0V4cChTdHJpbmcucmF3YCg/Ol58WzovXSkke29yZ30vJHtyZXBvfSg/OlxcLmdpdCk/I1xcUyskYCwgJ3UnKS50ZXN0KHNwZWNpZmllcik7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGdldExhdGVzdFByaXZhdGVQYWNrYWdlU3BlY2lmaWVyKG9yZzogc3RyaW5nLCByZXBvOiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZz4ge1xuICBjb25zdCBjb21taXRIYXNoID0gYXdhaXQgZ2V0TGF0ZXN0Q29tbWl0SGFzaChvcmcsIHJlcG8pO1xuICByZXR1cm4gYGdpdEBnaXRodWIuY29tOiR7b3JnfS8ke3JlcG99LmdpdCMke2NvbW1pdEhhc2h9YDtcbn1cblxuZnVuY3Rpb24gaXNXb3Jrc3BhY2VQYWNrYWdlKGpzb25PYmo6IFBhY2thZ2VKc29uLCBwYWNrYWdlTmFtZTogc3RyaW5nKTogYm9vbGVhbiB7XG4gIHJldHVybiAoanNvbk9iai5kZXZEZXBlbmRlbmNpZXM/LltwYWNrYWdlTmFtZV0gfHwganNvbk9iai5kZXBlbmRlbmNpZXM/LltwYWNrYWdlTmFtZV0gfHwgJycpLmluY2x1ZGVzKCd3b3Jrc3BhY2UnKTtcbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB7IHF1b3RlRm9yU2hlbGwgfSBmcm9tICdAd2lsbGJvb3N0ZXIvc2hhcmVkLWxpYi9zcmMnO1xuaW1wb3J0ICogYXMgeWFtbCBmcm9tICdqcy15YW1sJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB7IGZzVXRpbCB9IGZyb20gJy4uL3V0aWxzL2ZzVXRpbC5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGV4dGVuc2lvbnMgfSBmcm9tICcuLi91dGlscy9leHRlbnNpb25zLmpzJztcbmltcG9ydCB7IGdldEdlbkkxOG5Uc0NvbW1hbmQgfSBmcm9tICcuLi91dGlscy9nZW5JMThuVHMuanMnO1xuaW1wb3J0IHsgZG9lc0NvbnRhaW5KYXZhLCBkb2VzQ29udGFpbkpzT3JUcyB9IGZyb20gJy4uL3V0aWxzL3BhY2thZ2VDYXBhYmlsaXRpZXMuanMnO1xuXG5pbXBvcnQgeyBnZW5lcmF0ZVNjcmlwdHMgfSBmcm9tICcuL3BhY2thZ2VKc29uLmpzJztcblxuaW50ZXJmYWNlIExlZnRob29rU2V0dGluZ3Mge1xuICBnbG9iX21hdGNoZXI6ICdkb3VibGVzdGFyJztcbiAgJ3Bvc3QtbWVyZ2UnOiB7XG4gICAgam9iczogTGVmdGhvb2tKb2JbXTtcbiAgfTtcbiAgJ3ByZS1jb21taXQnOiB7XG4gICAgam9iczogTGVmdGhvb2tKb2JbXTtcbiAgfTtcbiAgJ3ByZS1wdXNoJzoge1xuICAgIGpvYnM6IExlZnRob29rSm9iW107XG4gIH07XG59XG5cbmludGVyZmFjZSBMZWZ0aG9va0pvYiB7XG4gIG5hbWU6IHN0cmluZztcbiAgZ2xvYj86IHN0cmluZztcbiAgcnVuPzogc3RyaW5nO1xuICBzY3JpcHQ/OiBzdHJpbmc7XG4gIHJ1bm5lcj86ICdiYXNoJztcbiAgc3RhZ2VfZml4ZWQ/OiB0cnVlO1xufVxuXG5jb25zdCBiYXNlU2V0dGluZ3M6IE9taXQ8TGVmdGhvb2tTZXR0aW5ncywgJ3ByZS1jb21taXQnPiA9IHtcbiAgZ2xvYl9tYXRjaGVyOiAnZG91Ymxlc3RhcicsXG4gICdwb3N0LW1lcmdlJzoge1xuICAgIGpvYnM6IFtcbiAgICAgIHtcbiAgICAgICAgbmFtZTogJ3ByZXBhcmUnLFxuICAgICAgICBzY3JpcHQ6ICdwcmVwYXJlLnNoJyxcbiAgICAgICAgcnVubmVyOiAnYmFzaCcsXG4gICAgICB9LFxuICAgIF0sXG4gIH0sXG4gICdwcmUtcHVzaCc6IHtcbiAgICBqb2JzOiBbXG4gICAgICB7XG4gICAgICAgIG5hbWU6ICdjaGVjaycsXG4gICAgICAgIHNjcmlwdDogJ2NoZWNrLnNoJyxcbiAgICAgICAgcnVubmVyOiAnYmFzaCcsXG4gICAgICB9LFxuICAgIF0sXG4gIH0sXG59O1xuXG4vLyBMZWZ0aG9vayBleHBhbmRzIHtzdGFnZWRfZmlsZXN9IGFzIHNoZWxsLWVzY2FwZWQgYXJncywgc28gdGhlIHVucXVvdGVkIGxvb3BzIGJlbG93IGtlZXAgcGF0aHNcbi8vIHdpdGggc3BhY2VzIGludGFjdC5cbmNvbnN0IHByZUNvbW1pdFNldHRpbmdzOiBMZWZ0aG9va1NldHRpbmdzWydwcmUtY29tbWl0J10gPSB7XG4gIGpvYnM6IFtcbiAgICB7XG4gICAgICBuYW1lOiAnY2xlYW51cCcsXG4gICAgICBnbG9iOiAnJyxcbiAgICAgIHJ1bjogJycsXG4gICAgICBzdGFnZV9maXhlZDogdHJ1ZSxcbiAgICB9LFxuICAgIHtcbiAgICAgIG5hbWU6ICdjaGVjay1taWdyYXRpb25zJyxcbiAgICAgIGdsb2I6ICcqKi9taWdyYXRpb24uc3FsJyxcbiAgICAgIHJ1bjogYFxuZmFpbGVkPTBcbmZvciBmaWxlIGluIHtzdGFnZWRfZmlsZXN9OyBkb1xuICBpZiBncmVwIC1xICdXYXJuaW5nczonIFwiJGZpbGVcIjsgdGhlblxuICAgIGVjaG8gXCJNaWdyYXRpb24gU1FMIGZpbGUgKCRmaWxlKSBjb250YWlucyB3YXJuaW5ncyEgUGxlYXNlIHNvbHZlIHRoZSB3YXJuaW5ncyBhbmQgY29tbWl0IGFnYWluLlwiXG4gICAgZmFpbGVkPTFcbiAgZmlcbmRvbmVcbmV4aXQgXCIkZmFpbGVkXCJcbmAudHJpbSgpLFxuICAgIH0sXG4gICAge1xuICAgICAgLy8gYnVuIHJlY29yZHMgYW4gYWJzb2x1dGUgYHJlc29sdmVkYCBVUkwgZm9yIGFuIGFscmVhZHktbG9ja2VkIHBhY2thZ2Ugd2hlbmV2ZXIgdGhlXG4gICAgICAvLyBjb25maWd1cmVkIHJlZ2lzdHJ5IGRvZXMgbm90IHNlcnZlIHRoZSB0YXJiYWxsIGhvc3QgaW4gdGhlIHBhY2thZ2UgbWV0YWRhdGEg4oCUIHdoaWNoIGlzXG4gICAgICAvLyBleGFjdGx5IHdoYXQgdGhlIFRha3VtaSBHdWFyZCBwcm94eSBkb2VzLiBTbyBhbiBpbnN0YWxsIHJ1biB3aXRoIEd1YXJkIGFzIHRoZSBkZWZhdWx0XG4gICAgICAvLyByZWdpc3RyeSAoQ0ksIG9yIGEgZGV2ZWxvcGVyIHdobyBwdXQgaXQgaW4gfi8ubnBtcmMpIGJha2VzIG5wbS5mbGF0dC50ZWNoIFVSTHMgaW50b1xuICAgICAgLy8gYnVuLmxvY2ssIGFuZCBjb21taXR0aW5nIHRoZW0gcGlucyBhIFNIQVJFRCBsb2NrZmlsZSB0byBvbmUgZW52aXJvbm1lbnQncyBtaXJyb3I6IGV2ZXJ5XG4gICAgICAvLyBsYXRlciBpbnN0YWxsIGRvd25sb2FkcyB0aHJvdWdoIHRoZSBwcm94eSwgYW5kIGEgY29sZC1jYWNoZSBpbnN0YWxsIGZhaWxzIG91dHJpZ2h0IHdpdGhcbiAgICAgIC8vIDQwMSBmb3IgYW55b25lIHdob3NlIG5wbXJjIGNhcnJpZXMgYSByZWdpc3RyeS5ucG1qcy5vcmcgdG9rZW4sIGJlY2F1c2UgYnVuIHNlbmRzIHRoZVxuICAgICAgLy8gZGVmYXVsdCByZWdpc3RyeSdzIGNyZWRlbnRpYWxzIHRvIHdoYXRldmVyIGhvc3QgdGhlIGxvY2tmaWxlIG5hbWVzLiBHdWFyZCBjb3ZlcmFnZSBkb2VzXG4gICAgICAvLyBub3QgZGVwZW5kIG9uIHRoZXNlIFVSTHMg4oCUIHdpdGggYW4gZW1wdHkgYHJlc29sdmVkYCwgYnVuIGRlcml2ZXMgdGhlIGRvd25sb2FkIFVSTCBmcm9tXG4gICAgICAvLyB0aGUgY29uZmlndXJlZCByZWdpc3RyeSDigJQgc28gc3RyaXAgdGhlbS4gT25seSB0aGUgR3VhcmQgaG9zdCBpcyBzdHJpcHBlZDogYSBzY29wZWRcbiAgICAgIC8vIHJlZ2lzdHJ5IHN1Y2ggYXMgVmVyZGFjY2lvIGxlZ2l0aW1hdGVseSByZWNvcmRzIGl0cyBvd24gVVJMIGZvciBwcml2YXRlIHBhY2thZ2VzLlxuICAgICAgbmFtZTogJ25vcm1hbGl6ZS1idW4tbG9ja2ZpbGUnLFxuICAgICAgZ2xvYjogJ2J1bi5sb2NrJyxcbiAgICAgIHJ1bjogJ2Jhc2ggLmxlZnRob29rL25vcm1hbGl6ZS1idW4tbG9ja2ZpbGUuc2gge3N0YWdlZF9maWxlc30nLFxuICAgICAgc3RhZ2VfZml4ZWQ6IHRydWUsXG4gICAgfSxcbiAgICB7XG4gICAgICAvLyBPbmx5IHdpbGxib29zdGVyLWNvbmZpZ3MgZ2V0cyB0aGlzIGpvYjogZXZlcnkgb3RoZXIgcmVwb3NpdG9yeSdzIHJlbm92YXRlLmpzb25jIG1lcmVseVxuICAgICAgLy8gZXh0ZW5kcyB0aGUgc2hhcmVkIHByZXNldCwgYW5kIHRoZSB2YWxpZGF0b3IgZG9lcyBub3QgcmVzb2x2ZSByZW1vdGUgcHJlc2V0cywgc28gcnVubmluZyBpdFxuICAgICAgLy8gdGhlcmUgd291bGQgdmFsaWRhdGUgdHdvIGxpbmVzIGFuZCBjYXRjaCBub3RoaW5nLiBgLS1uby1nbG9iYWxgIHZhbGlkYXRlcyB0aGUgcHJlc2V0IGFzIGFcbiAgICAgIC8vIHJlcG8gY29uZmlnIGluc3RlYWQgb2YgYSBzZWxmLWhvc3RlZCBnbG9iYWwgY29uZmlnLCBhbmQgYEBsYXRlc3RgIGtlZXBzIG5wbSBmcm9tIHNpbGVudGx5XG4gICAgICAvLyBpbnN0YWxsaW5nIGFuIGFuY2llbnQgUmVub3ZhdGUgdGhhdCBjYW5ub3QgZXZlbiBwYXJzZSBKU09OQyB3aGVuIHRoZSBsb2NhbCBOb2RlIGxhZ3MgYmVoaW5kLlxuICAgICAgLy8gU3RhZ2luZyBhIGRlbGV0aW9uIG9mIHJlbm92YXRlLmpzb25jIGxlYXZlcyBubyBmaWxlIGZvciBpbnNwZWN0aW9uLCBzbyBMZWZ0aG9vayBza2lwcyB0aGlzXG4gICAgICAvLyBqb2IgaW5zdGVhZCBvZiBydW5uaW5nIHRoZSB2YWxpZGF0b3Igb24gYSBtaXNzaW5nIHBhdGgg4oCUIGRlbGliZXJhdGVseSwgYmVjYXVzZSBkZWxldGluZyB0aGVcbiAgICAgIC8vIHNoYXJlZCBwcmVzZXQgaXMgbm90IGFuIG9wZXJhdGlvbiB0aGlzIGhvb2sgbmVlZHMgdG8gZ3VhcmQuXG4gICAgICBuYW1lOiAndmFsaWRhdGUtcmVub3ZhdGUtY29uZmlnJyxcbiAgICAgIGdsb2I6ICdyZW5vdmF0ZS5qc29uYycsXG4gICAgICBydW46ICducHggLS15ZXMgLS1wYWNrYWdlIHJlbm92YXRlQGxhdGVzdCAtLSByZW5vdmF0ZS1jb25maWctdmFsaWRhdG9yIC0tc3RyaWN0IC0tbm8tZ2xvYmFsIHtzdGFnZWRfZmlsZXN9JyxcbiAgICB9LFxuICBdLFxufTtcblxuY29uc3Qgc2NyaXB0cyA9IHtcbiAgLy8gcHJlcGFyZSBjYWxscyB0aGlzIHdpdGhvdXQgYXJndW1lbnRzIGFmdGVyIEJ1biBzYXZlcyB0aGUgcm9vdCBsb2NrZmlsZTsgTGVmdGhvb2sgcGFzc2VzIGl0c1xuICAvLyBzdGFnZWQgcGF0aC4gVGhlIHVucHJlZGljdGFibGUgc2libGluZyBmaWxlIG1ha2VzIHJlcGxhY2VtZW50IGF0b21pYywgYGNwIC1wYCBwcmVzZXJ2ZXMgaXRzXG4gIC8vIG1vZGUsIGFuZCB0aGUgYW5jaG9yZWQgcGF0dGVybiBjYW5ub3QgZXJhc2UgYSBkaXJlY3QgdGFyYmFsbCBkZXBlbmRlbmN5IFVSTC5cbiAgbm9ybWFsaXplQnVuTG9ja2ZpbGU6IGBcbiMhL2Jpbi9iYXNoXG5zZXQgLWVcblxuaWYgW1sgXCIkI1wiIC1lcSAwIF1dOyB0aGVuXG4gIHNldCAtLSBidW4ubG9ja1xuZmlcblxubm9ybWFsaXplZD1cIlwiXG50cmFwICdbWyAteiBcIiRub3JtYWxpemVkXCIgXV0gfHwgcm0gLWYgXCIkbm9ybWFsaXplZFwiJyBFWElUXG5mb3IgZmlsZSBpbiBcIiRAXCI7IGRvXG4gIFtbIC1mIFwiJGZpbGVcIiBdXSB8fCBjb250aW51ZVxuICBub3JtYWxpemVkPVwiJChta3RlbXAgXCIkZmlsZS53YmZ5LW5vcm1hbGl6aW5nLlhYWFhYWFwiKVwiXG4gIGNwIC1wIFwiJGZpbGVcIiBcIiRub3JtYWxpemVkXCJcbiAgc2VkIC1FICdzIyhcIiwgKVwiaHR0cHM6Ly9ucG1cXFxcLmZsYXR0XFxcXC50ZWNoL1teXCJdKlwiI1xcXFwxXCJcIiNnJyBcIiRmaWxlXCIgPiBcIiRub3JtYWxpemVkXCJcbiAgaWYgISBjbXAgLXMgXCIkZmlsZVwiIFwiJG5vcm1hbGl6ZWRcIjsgdGhlblxuICAgIG12IFwiJG5vcm1hbGl6ZWRcIiBcIiRmaWxlXCJcbiAgICBlY2hvIFwiUmVtb3ZlZCBUYWt1bWkgR3VhcmQgcHJveHkgVVJMcyBmcm9tICRmaWxlIHNvIHRoZSBsb2NrZmlsZSBzdGF5cyByZWdpc3RyeS1hZ25vc3RpYy5cIlxuICBmaVxuICBybSAtZiBcIiRub3JtYWxpemVkXCJcbiAgbm9ybWFsaXplZD1cIlwiXG5kb25lXG5gLnRyaW0oKSxcbiAgcG9zdE1lcmdlOiBgXG4jIS9iaW4vYmFzaFxuXG5jaGFuZ2VkX2ZpbGVzPVwiJChnaXQgZGlmZi10cmVlIC1yIC0tbmFtZS1vbmx5IC0tbm8tY29tbWl0LWlkIE9SSUdfSEVBRCBIRUFEKVwiXG5cbnJ1bl9pZl9jaGFuZ2VkKCkge1xuICBpZiBlY2hvIFwiJGNoYW5nZWRfZmlsZXNcIiB8IGdyZXAgLS1xdWlldCAtRSBcIiQxXCI7IHRoZW5cbiAgICBldmFsIFwiJDJcIlxuICBmaVxufVxuYC50cmltKCksXG59O1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVMZWZ0aG9vayhjb25maWc6IFBhY2thZ2VDb25maWcsIGFsbENvbmZpZ3M6IFBhY2thZ2VDb25maWdbXSA9IFtjb25maWddKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZ2VuZXJhdGVMZWZ0aG9vaycsIGFzeW5jICgpID0+IHtcbiAgICBhd2FpdCBjb3JlKGNvbmZpZywgYWxsQ29uZmlncyk7XG4gIH0pO1xufVxuXG5hc3luYyBmdW5jdGlvbiBjb3JlKGNvbmZpZzogUGFja2FnZUNvbmZpZywgYWxsQ29uZmlnczogUGFja2FnZUNvbmZpZ1tdKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IGRpclBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICcubGVmdGhvb2snKTtcbiAgY29uc3QgeyBsaW50IH0gPSBnZW5lcmF0ZVNjcmlwdHMoY29uZmlnLCB7fSk7XG4gIGNvbnN0IHNldHRpbmdzOiBQYXJ0aWFsPExlZnRob29rU2V0dGluZ3M+ID0ge1xuICAgIC4uLmJhc2VTZXR0aW5ncyxcbiAgICAncHJlLWNvbW1pdCc6IHtcbiAgICAgIGpvYnM6IGdldFByZUNvbW1pdEpvYnMoY29uZmlnKSxcbiAgICB9LFxuICB9O1xuICBpZiAoIWxpbnQpIHtcbiAgICBkZWxldGUgc2V0dGluZ3NbJ3ByZS1wdXNoJ107XG4gIH1cbiAgYXdhaXQgUHJvbWlzZS5hbGwoW1xuICAgIGZzVXRpbC53cml0ZUZpbGVDb25maW5lZChwYXRoLmpvaW4oY29uZmlnLmRpclBhdGgsICdsZWZ0aG9vay55bWwnKSwgeWFtbC5kdW1wKHNldHRpbmdzLCB7IGxpbmVXaWR0aDogLTEgfSkpLFxuICAgIGZzLnByb21pc2VzLnJtKGRpclBhdGgsIHsgZm9yY2U6IHRydWUsIHJlY3Vyc2l2ZTogdHJ1ZSB9KSxcbiAgXSk7XG5cbiAgaWYgKGxpbnQpIHtcbiAgICBjb25zdCBwcmVQdXNoID0gZ2V0UHJlUHVzaFNjcmlwdChjb25maWcpO1xuICAgIGZzLm1rZGlyU3luYyhwYXRoLmpvaW4oZGlyUGF0aCwgJ3ByZS1wdXNoJyksIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICAgIGF3YWl0IGZzLnByb21pc2VzLndyaXRlRmlsZShwYXRoLmpvaW4oZGlyUGF0aCwgJ3ByZS1wdXNoJywgJ2NoZWNrLnNoJyksIHByZVB1c2ggKyAnXFxuJywge1xuICAgICAgbW9kZTogMG83NTUsXG4gICAgfSk7XG4gIH1cbiAgY29uc3QgcG9zdE1lcmdlQ29tbWFuZCA9IGAke3NjcmlwdHMucG9zdE1lcmdlfVxcblxcbiR7Z2VuZXJhdGVQb3N0TWVyZ2VDb21tYW5kcyhjb25maWcsIGFsbENvbmZpZ3MpLmpvaW4oJ1xcbicpfVxcbmA7XG4gIGZzLm1rZGlyU3luYyhkaXJQYXRoLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgYXdhaXQgZnMucHJvbWlzZXMud3JpdGVGaWxlKHBhdGgucmVzb2x2ZShkaXJQYXRoLCAnbm9ybWFsaXplLWJ1bi1sb2NrZmlsZS5zaCcpLCBzY3JpcHRzLm5vcm1hbGl6ZUJ1bkxvY2tmaWxlICsgJ1xcbicsIHtcbiAgICBtb2RlOiAwbzc1NSxcbiAgfSk7XG4gIGZzLm1rZGlyU3luYyhwYXRoLmpvaW4oZGlyUGF0aCwgJ3Bvc3QtbWVyZ2UnKSwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gIGF3YWl0IGZzLnByb21pc2VzLndyaXRlRmlsZShwYXRoLnJlc29sdmUoZGlyUGF0aCwgJ3Bvc3QtbWVyZ2UnLCAncHJlcGFyZS5zaCcpLCBwb3N0TWVyZ2VDb21tYW5kLCB7XG4gICAgbW9kZTogMG83NTUsXG4gIH0pO1xufVxuXG5mdW5jdGlvbiBnZXRQcmVQdXNoU2NyaXB0KGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IHN0cmluZyB7XG4gIC8vIEJ1biByZXBvcyByZWNlaXZlIHdiIGFzIHBhcnQgb2Ygd2JmeSdzIG1hbmFnZWQgdG9vbGNoYWluLCBzbyBnZW5lcmF0ZSB0aGVcbiAgLy8gZmluYWwgaG9vayBjb21tYW5kIG9uIHRoZSBmaXJzdCBydW4gaW5zdGVhZCBvZiBjaGFuZ2luZyBpdCBvbiB0aGUgc2Vjb25kLlxuICBjb25zdCBxdWlldExpbnRDb21tYW5kID0gJ2J1biB3YiBsaW50IC0tcXVpZXQnO1xuICAvLyBObyBzZXBhcmF0ZSB0eXBlY2hlY2sgc3RlcCBuZWVkZWQg4oCUIHRoZSBsaW50IGNvbW1hbmQgYWxyZWFkeSBpbmNsdWRlcyB0eXBlY2hlY2tpbmcuXG4gIGlmIChjb25maWcucmVwb3NpdG9yeT8uc3RhcnRzV2l0aCgnZ2l0aHViOldpbGxCb29zdGVyTGFiLycpKSB7XG4gICAgcmV0dXJuIGBcbiMhL2Jpbi9iYXNoXG5cbmlmIFsgJChnaXQgYnJhbmNoIC0tc2hvdy1jdXJyZW50KSA9IFwibWFpblwiIF0gJiYgWyAkKGdpdCBjb25maWcgdXNlci5lbWFpbCkgIT0gXCJleGthenV1QGdtYWlsLmNvbVwiIF07IHRoZW5cbiAgZWNobyBcIioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlwiXG4gIGVjaG8gXCIqKiogRG9uJ3QgcHVzaCBtYWluIGJyYW5jaCBkaXJlY3RseS4gVXNlIFBSISAqKipcIlxuICBlY2hvIFwiKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXCJcbiAgZXhpdCAxXG5maVxuXG4ke3F1aWV0TGludENvbW1hbmR9XG5gLnRyaW0oKTtcbiAgfVxuICByZXR1cm4gcXVpZXRMaW50Q29tbWFuZDtcbn1cblxuZnVuY3Rpb24gZ2V0UHJlQ29tbWl0Sm9icyhjb25maWc6IFBhY2thZ2VDb25maWcpOiBMZWZ0aG9va0pvYltdIHtcbiAgcmV0dXJuIHByZUNvbW1pdFNldHRpbmdzLmpvYnNcbiAgICAuZmlsdGVyKChqb2IpID0+IGpvYi5uYW1lICE9PSAndmFsaWRhdGUtcmVub3ZhdGUtY29uZmlnJyB8fCBjb25maWcuaXNXaWxsQm9vc3RlckNvbmZpZ3MpXG4gICAgLm1hcCgoam9iKSA9PlxuICAgICAgam9iLm5hbWUgPT09ICdjbGVhbnVwJ1xuICAgICAgICA/IHtcbiAgICAgICAgICAgIC4uLmpvYixcbiAgICAgICAgICAgIGdsb2I6IGdldENsZWFudXBHbG9icyhjb25maWcpLFxuICAgICAgICAgICAgcnVuOiBnZXRDbGVhbnVwQ29tbWFuZChjb25maWcpLFxuICAgICAgICAgIH1cbiAgICAgICAgOiBqb2JcbiAgICApO1xufVxuXG5mdW5jdGlvbiBnZXRDbGVhbnVwR2xvYnMoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogc3RyaW5nIHtcbiAgLy8gTGV0IGB3YiBsaW50IC0tZm9ybWF0YCBkZWNpZGUgd2hldGhlciBQcmV0dGllciBpcyBhdmFpbGFibGU7IHRoZSBob29rXG4gIC8vIHN0aWxsIG5lZWRzIHRvIHRyaWdnZXIgd2hlbiBhZGRpbmcgdGhlIGZpcnN0IHByZXR0aWVyLW9ubHkgZmlsZS5cbiAgY29uc3Qgc3VwcG9ydGVkRXh0ZW5zaW9ucyA9IFsuLi5leHRlbnNpb25zLnByZXR0aWVyT25seV07XG4gIGlmIChkb2VzQ29udGFpbkpzT3JUcyhjb25maWcpKSB7XG4gICAgc3VwcG9ydGVkRXh0ZW5zaW9ucy5wdXNoKC4uLmV4dGVuc2lvbnMub3hmbXQsIC4uLmV4dGVuc2lvbnMub3hsaW50KTtcbiAgfVxuICBpZiAoY29uZmlnLmRvZXNDb250YWluUG9ldHJ5TG9jayB8fCBjb25maWcuZG9lc0NvbnRhaW5VdkxvY2spIHtcbiAgICBzdXBwb3J0ZWRFeHRlbnNpb25zLnB1c2goJ3B5Jyk7XG4gIH1cbiAgaWYgKGNvbmZpZy5kb2VzQ29udGFpblB1YnNwZWNZYW1sKSB7XG4gICAgc3VwcG9ydGVkRXh0ZW5zaW9ucy5wdXNoKCdkYXJ0Jyk7XG4gIH1cbiAgY29uc3QgZmlsdGVyZWRFeHRlbnNpb25zID0gWy4uLm5ldyBTZXQoc3VwcG9ydGVkRXh0ZW5zaW9ucyldLnRvU29ydGVkKCk7XG4gIHJldHVybiBgKiovKi57JHtmaWx0ZXJlZEV4dGVuc2lvbnMuam9pbignLCcpfX1gO1xufVxuXG5mdW5jdGlvbiBnZXRDbGVhbnVwQ29tbWFuZChjb25maWc6IFBhY2thZ2VDb25maWcpOiBzdHJpbmcge1xuICBpZiAoaGFzTG9jYWxXYldvcmtzcGFjZShjb25maWcpKSB7XG4gICAgcmV0dXJuIFN0cmluZy5yYXdgXG5idW4gcnVuIC0tY3dkIHBhY2thZ2VzL3diIHN0YXJ0IC0td29ya2luZy1kaXIgXCIkKGdpdCByZXYtcGFyc2UgLS1zaG93LXRvcGxldmVsKVwiIGxpbnQgLS1maXggLS1mb3JtYXQgLS0ge3N0YWdlZF9maWxlc31cbmAudHJpbSgpO1xuICB9XG4gIC8vIFB5dGhvbi1vbmx5IEJ1biByZXBvcyBpbnN0YWxsIHdiIGZvciBzaGFyZWQgc2NyaXB0cyBidXQgbm90IE94bGludCwgc29cbiAgLy8gc3RhZ2VkLWZpbGUgaG9va3MgbXVzdCB1c2UgdGhlIGxhbmd1YWdlLXNwZWNpZmljIGZvcm1hdHRlciBwYXRoIGJlbG93LlxuICBjb25zdCBjYW5Vc2VXYkZvclN0YWdlZEZpbGVzID0gZG9lc0NvbnRhaW5Kc09yVHMoY29uZmlnKSB8fCBkb2VzQ29udGFpbkphdmEoY29uZmlnKTtcbiAgaWYgKGNhblVzZVdiRm9yU3RhZ2VkRmlsZXMpIHtcbiAgICByZXR1cm4gYFxuYnVuIHdiIGxpbnQgLS1maXggLS1mb3JtYXQgLS0ge3N0YWdlZF9maWxlc31cbmAudHJpbSgpO1xuICB9XG5cbiAgcmV0dXJuIFN0cmluZy5yYXdgXG5wYWNrYWdlX2pzb25fZmlsZXM9XCIkKHByaW50ZiAnJXNcXG4nIHtzdGFnZWRfZmlsZXN9IHwgZ3JlcCAtRSAnKF58LylwYWNrYWdlXFwuanNvbiQnIHx8IHRydWUpXCJcbiR7aGFzUHl0aG9uUGFja2FnZU1hbmFnZXIoY29uZmlnKSA/IFN0cmluZy5yYXdgcHl0aG9uX2ZpbGVzPVwiJChwcmludGYgJyVzXFxuJyB7c3RhZ2VkX2ZpbGVzfSB8IGdyZXAgLUUgJ1xcLnB5JCcgfHwgdHJ1ZSlcImAgOiAnJ31cbiR7Y29uZmlnLmRvZXNDb250YWluUHVic3BlY1lhbWwgPyBTdHJpbmcucmF3YGRhcnRfZmlsZXM9XCIkKHByaW50ZiAnJXNcXG4nIHtzdGFnZWRfZmlsZXN9IHwgZ3JlcCAtRSAnXFwuZGFydCQnIHwgZ3JlcCAtdiAnZ2VuZXJhdGVkJyB8IGdyZXAgLXYgJ1xcLmZyZWV6ZWRcXC5kYXJ0JCcgfCBncmVwIC12ICdcXC5nXFwuZGFydCQnIHx8IHRydWUpXCJgIDogJyd9XG5cbmlmIFsgLW4gXCIkcGFja2FnZV9qc29uX2ZpbGVzXCIgXTsgdGhlblxuICBidW4gc29ydC1wYWNrYWdlLWpzb24gJHBhY2thZ2VfanNvbl9maWxlc1xuZmlcbiR7XG4gIGhhc1B5dGhvblBhY2thZ2VNYW5hZ2VyKGNvbmZpZylcbiAgICA/IGBpZiBbIC1uIFwiJHB5dGhvbl9maWxlc1wiIF07IHRoZW5cbiAgJHtnZXRQeXRob25SdW5uZXIoY29uZmlnKX0gaXNvcnQgLS1wcm9maWxlIGJsYWNrIC0tZmlsdGVyLWZpbGVzICRweXRob25fZmlsZXNcbiAgJHtnZXRQeXRob25SdW5uZXIoY29uZmlnKX0gYmxhY2sgJHB5dGhvbl9maWxlc1xuICAke2dldFB5dGhvblJ1bm5lcihjb25maWcpfSBmbGFrZTggJHB5dGhvbl9maWxlc1xuZmlgXG4gICAgOiAnJ1xufVxuJHtcbiAgY29uZmlnLmRvZXNDb250YWluUHVic3BlY1lhbWxcbiAgICA/IGBpZiBbIC1uIFwiJGRhcnRfZmlsZXNcIiBdOyB0aGVuXG4gIGRhcnQgZm9ybWF0ICRkYXJ0X2ZpbGVzXG5maWBcbiAgICA6ICcnXG59XG5gLnRyaW0oKTtcbn1cblxuZnVuY3Rpb24gaGFzTG9jYWxXYldvcmtzcGFjZShjb25maWc6IFBhY2thZ2VDb25maWcpOiBib29sZWFuIHtcbiAgaWYgKCFjb25maWcuaXNSb290KSByZXR1cm4gZmFsc2U7XG5cbiAgY29uc3QgbG9jYWxXYlBhY2thZ2VKc29uUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJ3BhY2thZ2VzJywgJ3diJywgJ3BhY2thZ2UuanNvbicpO1xuICBpZiAoIWZzLmV4aXN0c1N5bmMobG9jYWxXYlBhY2thZ2VKc29uUGF0aCkpIHJldHVybiBmYWxzZTtcblxuICB0cnkge1xuICAgIGNvbnN0IHBhY2thZ2VKc29uID0gSlNPTi5wYXJzZShmcy5yZWFkRmlsZVN5bmMobG9jYWxXYlBhY2thZ2VKc29uUGF0aCwgJ3V0ZjgnKSkgYXMgeyBuYW1lPzogc3RyaW5nIH07XG4gICAgcmV0dXJuIHBhY2thZ2VKc29uLm5hbWUgPT09ICdAd2lsbGJvb3N0ZXIvd2InO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn1cblxuZnVuY3Rpb24gZ2VuZXJhdGVQb3N0TWVyZ2VDb21tYW5kcyhjb25maWc6IFBhY2thZ2VDb25maWcsIGFsbENvbmZpZ3M6IFBhY2thZ2VDb25maWdbXSk6IHN0cmluZ1tdIHtcbiAgY29uc3QgcG9zdE1lcmdlQ29tbWFuZHM6IHN0cmluZ1tdID0gW107XG4gIGNvbnN0IHRvb2xzQ2hhbmdlZFBhdHRlcm4gPSBTdHJpbmcucmF3YChtaXNlXFwudG9tbHxcXC5taXNlXFwudG9tbClgO1xuICBwb3N0TWVyZ2VDb21tYW5kcy5wdXNoKFN0cmluZy5yYXdgcnVuX2lmX2NoYW5nZWQgXCIke3Rvb2xzQ2hhbmdlZFBhdHRlcm59XCIgXCJtaXNlIGluc3RhbGxcImApO1xuICAvLyBgbWlzZSBhY3RpdmF0ZWAgdXBkYXRlcyBQQVRIIG9ubHkgd2hlbiB0aGUgcHJvbXB0IGlzIGRyYXduLCBzbyB0aGUgaG9vayBpbmhlcml0cyB0aGUgdG9vbFxuICAvLyB2ZXJzaW9ucyBwaW5uZWQgYmVmb3JlIHRoZSBtZXJnZTsgcmVmcmVzaCBQQVRIIHNvIGEgcHVsbGVkIEJ1biBwaW4gaW5zdGFsbHMgd2l0aCB0aGF0IEJ1bi5cbiAgcG9zdE1lcmdlQ29tbWFuZHMucHVzaCgnZXZhbCBcIiQobWlzZSBlbnYgLXMgYmFzaClcIicpO1xuICBjb25zdCBpbnN0YWxsQ29tbWFuZCA9ICdidW4gaW5zdGFsbCc7XG4gIC8vIERvIE5PVCBhZGQgYC52aW5leHRgIGhlcmU6IGl0IGhvbGRzIG9ubHkgdmluZXh0J3MgY29udGVudC1oYXNoZWQgZm9udCBjYWNoZSBhbmQgdGhlIGRldlxuICAvLyBzZXJ2ZXIncyBsb2NrIGZpbGUgKGRlbGV0aW5nIHRoZSBsb2NrIGRpc2FibGVzIHRoZSBkdXBsaWNhdGUtZGV2LXNlcnZlciBndWFyZCBmb3IgYSBydW5uaW5nXG4gIC8vIHNlcnZlcikuIHZpbmV4dCdzIGJ1aWxkIG91dHB1dCBnb2VzIHRvIGBkaXN0L2AsIGFuZCBWaXRlJ3MgZGVwZW5kZW5jeSBjYWNoZSBpcyBoYW5kbGVkIGJ5XG4gIC8vIHRoZSBzZXBhcmF0ZSBpbnN0YWxsLWxheW91dCBob29rIGJlbG93LlxuICAvLyBTY2FuIGV2ZXJ5IHdvcmtzcGFjZSBjb25maWcgKG5vdCBqdXN0IHRoZSByb290KTogaW4gYSBtb25vcmVwbyB0aGUgYXBwIHVzdWFsbHkgbGl2ZXMgaW5cbiAgLy8gcGFja2FnZXMvPGFwcD4gb3IgYXBwcy88YXBwPiwgYW5kIHRoZSBjYWNoZSBkaXJlY3RvcmllcyBhcmUgd29ya3NwYWNlLXJlbGF0aXZlLlxuICBjb25zdCBuZXh0Q2FjaGVEaXJQYXRocyA9IGNvbGxlY3RXb3Jrc3BhY2VSZWxhdGl2ZURpclBhdGhzKFxuICAgIGNvbmZpZyxcbiAgICBhbGxDb25maWdzLFxuICAgICh3b3Jrc3BhY2VDb25maWcpID0+IHdvcmtzcGFjZUNvbmZpZy5kZXBlbmRpbmcuYmxpdHogfHwgd29ya3NwYWNlQ29uZmlnLmRlcGVuZGluZy5uZXh0LFxuICAgICcubmV4dCdcbiAgKTtcbiAgY29uc3Qgcm1OZXh0RGlyZWN0b3JpZXMgPVxuICAgIG5leHRDYWNoZURpclBhdGhzLmxlbmd0aCA+IDAgPyBgICYmIHJtIC1SZiAtLSAke25leHRDYWNoZURpclBhdGhzLm1hcChxdW90ZUZvckV2YWx1YXRlZFNoZWxsKS5qb2luKCcgJyl9YCA6ICcnO1xuICAvLyBCdW4gZG9lcyBub3QgcmVsaW5rIGFuIGV4aXN0aW5nIGlzb2xhdGVkIHRyZWUgd2hlbiBnbG9iYWxTdG9yZS9saW5rZXIgc2V0dGluZ3MgY2hhbmdlLiBJbnNwZWN0XG4gIC8vIHRob3NlIGtleXMgcmF0aGVyIHRoYW4gZXZlcnkgYnVuZmlnIGNoYW5nZTogbWluaW11bVJlbGVhc2VBZ2UgdXBkYXRlcyBtdXN0IG5vdCBkZXN0cm95IGFcbiAgLy8gY29udHJpYnV0b3IncyB3b3JraW5nIGluc3RhbGwgYmVmb3JlIGEgcG90ZW50aWFsbHkgbmV0d29yay1kZXBlbmRlbnQgcmVwbGFjZW1lbnQgc3VjY2VlZHMuXG4gIGNvbnN0IG5vZGVNb2R1bGVzRGlyUGF0aHMgPSBjb2xsZWN0V29ya3NwYWNlUmVsYXRpdmVEaXJQYXRocyhjb25maWcsIGFsbENvbmZpZ3MsICgpID0+IHRydWUsICdub2RlX21vZHVsZXMnKTtcbiAgcG9zdE1lcmdlQ29tbWFuZHMucHVzaChcbiAgICBTdHJpbmcucmF3YGlmIGdpdCBkaWZmIC0tbm8tY29sb3IgLVUwIE9SSUdfSEVBRCBIRUFEIC0tICcqYnVuZmlnLnRvbWwnIHwgZ3JlcCAtLXF1aWV0IC1FICdeWystXSAqKGdsb2JhbFN0b3JlfGxpbmtlcnxwdWJsaWNIb2lzdFBhdHRlcm4pJzsgdGhlbiBybSAtUmYgLS0gJHtub2RlTW9kdWxlc0RpclBhdGhzLm1hcChxdW90ZUZvclNoZWxsKS5qb2luKCcgJyl9OyBmaWBcbiAgKTtcbiAgLy8gYnVuLmxvY2stb25seSBtZXJnZXMgKFJlbm92YXRlIGxvY2tmaWxlIG1haW50ZW5hbmNlKSwgYnVuZmlnLnRvbWwgLyAubnBtcmMgY2hhbmdlcyAobGlua2VyLFxuICAvLyByZWdpc3RyeSwgaG9pc3RpbmcpLCBhbmQgcGF0Y2ggZWRpdHMgYWxsIGNoYW5nZSB0aGUgaW5zdGFsbGVkIHRyZWUgd2l0aG91dCB0b3VjaGluZyBwYWNrYWdlLmpzb24uXG4gIHBvc3RNZXJnZUNvbW1hbmRzLnB1c2goXG4gICAgU3RyaW5nLnJhd2BydW5faWZfY2hhbmdlZCBcIihwYWNrYWdlXFwuanNvbnxidW5cXC5sb2NrfGJ1bmZpZ1xcLnRvbWx8XFwubnBtcmN8cGF0Y2hlcy8pXCIgXCIke2luc3RhbGxDb21tYW5kfSR7cm1OZXh0RGlyZWN0b3JpZXN9XCJgXG4gICk7XG4gIC8vIFZpdGUncyBkZXBlbmRlbmN5IGNhY2hlIGluIG5vZGVfbW9kdWxlcy8udml0ZSBzZWxmLWludmFsaWRhdGVzIG9uIGxvY2tmaWxlIC8gcGF0Y2hlcyAvXG4gIC8vIGNvbmZpZyAvIE5PREVfRU5WIGNoYW5nZXMgKHNlZSBWaXRlJ3MgZGVwIHByZS1idW5kbGluZyBkb2NzKSwgc28gdGhlIHJlc2lkdWFsIHN0YWxlIGNhc2UgaXNcbiAgLy8gaW5zdGFsbC1sYXlvdXQgY2hhbmdlcyAoYnVuZmlnLnRvbWwgbGlua2VyLCAubnBtcmMpOiB0aGV5IGNoYW5nZSB0aGUgaW5zdGFsbGVkIHRyZWUgd2l0aG91dFxuICAvLyB0b3VjaGluZyB0aGUgbG9ja2ZpbGUsIGFuZCB0aGV5IGFyZSBhYnNlbnQgZnJvbSBWaXRlJ3MgY2FjaGUga2V5LlxuICBjb25zdCBybVZpdGVDYWNoZURpcmVjdG9yaWVzID0gY29sbGVjdFdvcmtzcGFjZVJlbGF0aXZlRGlyUGF0aHMoXG4gICAgY29uZmlnLFxuICAgIGFsbENvbmZpZ3MsXG4gICAgKHdvcmtzcGFjZUNvbmZpZykgPT4gd29ya3NwYWNlQ29uZmlnLmRlcGVuZGluZy52aW5leHQgfHwgd29ya3NwYWNlQ29uZmlnLmRlcGVuZGluZy52aXRlLFxuICAgICdub2RlX21vZHVsZXMvLnZpdGUnXG4gICk7XG4gIGlmIChybVZpdGVDYWNoZURpcmVjdG9yaWVzLmxlbmd0aCA+IDApIHtcbiAgICBwb3N0TWVyZ2VDb21tYW5kcy5wdXNoKFxuICAgICAgU3RyaW5nLnJhd2BydW5faWZfY2hhbmdlZCBcIihidW5maWdcXC50b21sfFxcLm5wbXJjKVwiIFwicm0gLVJmIC0tICR7cm1WaXRlQ2FjaGVEaXJlY3Rvcmllcy5tYXAocXVvdGVGb3JFdmFsdWF0ZWRTaGVsbCkuam9pbignICcpfVwiYFxuICAgICk7XG4gIH1cbiAgaWYgKGNvbmZpZy5kb2VzQ29udGFpblBvZXRyeUxvY2spIHtcbiAgICBwb3N0TWVyZ2VDb21tYW5kcy5wdXNoKFN0cmluZy5yYXdgcnVuX2lmX2NoYW5nZWQgXCJwb2V0cnlcXC5sb2NrXCIgXCJwb2V0cnkgaW5zdGFsbFwiYCk7XG4gIH1cbiAgaWYgKGNvbmZpZy5kb2VzQ29udGFpblV2TG9jaykge1xuICAgIHBvc3RNZXJnZUNvbW1hbmRzLnB1c2goU3RyaW5nLnJhd2BydW5faWZfY2hhbmdlZCBcInV2XFwubG9ja1wiIFwidXYgc3luYyAtLWZyb3plblwiYCk7XG4gIH1cbiAgLy8gQmxpdHogcmVwb3NpdG9yaWVzIGRlbGliZXJhdGVseSBnZXQgdGhlIHNhbWUgd2ItZHJpdmVuIHByaXNtYSBjb21tYW5kcyBhcyBldmVyeW9uZSBlbHNlOlxuICAvLyB0aGUgYmxpdHogQ0xJJ3MgY29kZWdlbiBwYXRjaGVzIHRoZSBpbnN0YWxsZWQgbmV4dCBwYWNrYWdlIGluIHBsYWNlLCB3aGljaCBtdXN0IG5ldmVyIHJ1blxuICAvLyB1bmRlciBCdW4ncyBzaGFyZWQgZ2xvYmFsIHN0b3JlLiBZYXJuLWVyYSBCbGl0eiByZXBvcyBnZXQgdGhlaXIgcm91dGUgbWFuaWZlc3QgZnJvbVxuICAvLyBgd2IgZ2VuLWNvZGVgJ3MgYGJsaXR6IGNvZGVnZW5gIHN0ZXAsIGFuZCBjdXJyZW50IHdiIHJvdXRlcyBvbmx5IGB3YiBwcmlzbWEgc2VlZGAgdGhyb3VnaFxuICAvLyB0aGUgYmxpdHogQ0xJLCBvbmx5IGZvciBub24tQnVuIHJlcG9zIChzZWUgcGFja2FnZXMvd2Ivc3JjL3NjcmlwdHMvcHJpc21hU2NyaXB0cy50cyk7IHRoZVxuICAvLyBwb3N0LW1lcmdlIGhvb2tzIHN0YXkgd2ItZHJpdmVuIGJlY2F1c2UgYHByaXNtYSBkZXBsb3lgL2BnZW5lcmF0ZWAgbmVlZCBubyBibGl0eiBsb2FkZXIuXG4gIGlmIChjb25maWcuZGVwZW5kaW5nLnByaXNtYSkge1xuICAgIHBvc3RNZXJnZUNvbW1hbmRzLnB1c2goXG4gICAgICBTdHJpbmcucmF3YHJ1bl9pZl9jaGFuZ2VkIFwiLipcXC5wcmlzbWFcIiBcImJ1biB3YiBwcmlzbWEgZGVwbG95XCJgLFxuICAgICAgU3RyaW5nLnJhd2BydW5faWZfY2hhbmdlZCBcIi4qXFwucHJpc21hXCIgXCJidW4gd2IgcHJpc21hIGdlbmVyYXRlXCJgXG4gICAgKTtcbiAgfVxuICBjb25zdCBnZW5JMThuVHNDb21tYW5kID0gZ2V0R2VuSTE4blRzQ29tbWFuZChjb25maWcsIGNvbmZpZy5wYWNrYWdlSnNvbj8uc2NyaXB0cyk7XG4gIGlmIChnZW5JMThuVHNDb21tYW5kKSB7XG4gICAgLy8gZ2VuLWkxOG4tdHMgb3V0cHV0cyBhcmUgY29tbW9ubHkgaWdub3JlZCwgc28gcG9zdC1tZXJnZSByZWdlbmVyYXRlcyB0aGVtIGFmdGVyIHB1bGxlZCByZXNvdXJjZSBjaGFuZ2VzLlxuICAgIHBvc3RNZXJnZUNvbW1hbmRzLnB1c2goU3RyaW5nLnJhd2BydW5faWZfY2hhbmdlZCBcIihefC8paTE4bi8uKlxcLmpzb24kXCIgXCIke2dlbkkxOG5Uc0NvbW1hbmR9XCJgKTtcbiAgfVxuICByZXR1cm4gcG9zdE1lcmdlQ29tbWFuZHM7XG59XG5cbi8vIFRoZSBnZW5lcmF0ZWQgY29tbWFuZCBwYXNzZXMgdGhyb3VnaCBUV08gc2hlbGwgcGFyc2luZyBzdGFnZXM6IHRoZSBwcmVwYXJlLnNoIGxpbmUgcGFyc2VzIGl0IGFzXG4vLyBhIGRvdWJsZS1xdW90ZWQgYXJndW1lbnQgKHByb2Nlc3NpbmcgXFwsIGAsICQgYW5kIFwiIGltbWVkaWF0ZWx5KSwgYW5kIHJ1bl9pZl9jaGFuZ2VkIHRoZW4gZXZhbCdzXG4vLyBpdCAod29yZC1zcGxpdHRpbmcgYW5kIGdsb2JiaW5nKS4gQW4gdW5xdW90ZWQgcGF0aCBjb250YWluaW5nIHNwYWNlcyAoZS5nLiBgYXBwcy9teSBhcHAvLm5leHRgKVxuLy8gd291bGQgd29yZC1zcGxpdCBpbnRvIHVucmVsYXRlZCBybSB0YXJnZXRzLCBhbmQgYCRgL2JhY2t0aWNrIHdvdWxkIGV4cGFuZCBhdCB0aGUgZmlyc3Qgc3RhZ2UuXG4vLyBTbzogcXVvdGUgZm9yIHRoZSBldmFsIHN0YWdlIOKAlCBgcXVvdGVGb3JTaGVsbGAgbGVhdmVzIG9ubHkgd29yZHMgdGhhdCBjYXJyeSBubyBzaGVsbCBtZWFuaW5nXG4vLyB1bnF1b3RlZCDigJQgdGhlbiBiYWNrc2xhc2gtZXNjYXBlIHRoZSBkb3VibGUtcXVvdGUtY29udGV4dCBzcGVjaWFscy5cbmZ1bmN0aW9uIHF1b3RlRm9yRXZhbHVhdGVkU2hlbGwoZmlsZVBhdGg6IHN0cmluZyk6IHN0cmluZyB7XG4gIGNvbnN0IGV2YWxRdW90ZWQgPSBxdW90ZUZvclNoZWxsKGZpbGVQYXRoKTtcbiAgcmV0dXJuIGV2YWxRdW90ZWQucmVwbGFjZUFsbCgvW1xcXFxgJFwiXS9ndSwgU3RyaW5nLnJhd2BcXCQmYCk7XG59XG5cbi8qKlxuICogVGhlIHdvcmtzcGFjZS1yZWxhdGl2ZSBkaXJlY3RvcmllcyAocm9vdCBmaXJzdCwgZGVkdXBsaWNhdGVkLCBgPHN1YkRpck5hbWU+YCBhcHBlbmRlZCkgb2YgZXZlcnlcbiAqIHdvcmtzcGFjZSB3aG9zZSBjb25maWcgbWF0Y2hlcyB0aGUgcHJlZGljYXRlLiBUaGUgaG9vayBzY3JpcHQgcnVucyBhdCB0aGUgcmVwb3NpdG9yeSByb290LCBzb1xuICogcGF0aHMgYXJlIHJlbGF0aXZlIHRvIHRoZSByb290IGNvbmZpZydzIGRpcmVjdG9yeS5cbiAqL1xuZnVuY3Rpb24gY29sbGVjdFdvcmtzcGFjZVJlbGF0aXZlRGlyUGF0aHMoXG4gIHJvb3RDb25maWc6IFBhY2thZ2VDb25maWcsXG4gIGFsbENvbmZpZ3M6IFBhY2thZ2VDb25maWdbXSxcbiAgcHJlZGljYXRlOiAoY29uZmlnOiBQYWNrYWdlQ29uZmlnKSA9PiBib29sZWFuLFxuICBzdWJEaXJOYW1lOiBzdHJpbmdcbik6IHN0cmluZ1tdIHtcbiAgcmV0dXJuIFtcbiAgICAuLi5uZXcgU2V0KFxuICAgICAgYWxsQ29uZmlnc1xuICAgICAgICAuZmlsdGVyKChjb25maWcpID0+IHByZWRpY2F0ZShjb25maWcpKVxuICAgICAgICAubWFwKChjb25maWcpID0+IHtcbiAgICAgICAgICBjb25zdCByZWxhdGl2ZURpclBhdGggPSBwYXRoLnJlbGF0aXZlKHJvb3RDb25maWcuZGlyUGF0aCwgY29uZmlnLmRpclBhdGgpLnJlcGxhY2VBbGwoJ1xcXFwnLCAnLycpO1xuICAgICAgICAgIHJldHVybiByZWxhdGl2ZURpclBhdGggPyBwYXRoLnBvc2l4LmpvaW4ocmVsYXRpdmVEaXJQYXRoLCBzdWJEaXJOYW1lKSA6IHN1YkRpck5hbWU7XG4gICAgICAgIH0pXG4gICAgKSxcbiAgXS50b1NvcnRlZCgpO1xufVxuXG5mdW5jdGlvbiBoYXNQeXRob25QYWNrYWdlTWFuYWdlcihjb25maWc6IFBhY2thZ2VDb25maWcpOiBib29sZWFuIHtcbiAgcmV0dXJuIGNvbmZpZy5kb2VzQ29udGFpblBvZXRyeUxvY2sgfHwgY29uZmlnLmRvZXNDb250YWluVXZMb2NrO1xufVxuXG5mdW5jdGlvbiBnZXRQeXRob25SdW5uZXIoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogJ3BvZXRyeSBydW4nIHwgJ3V2IHJ1bicge1xuICByZXR1cm4gY29uZmlnLmRvZXNDb250YWluVXZMb2NrID8gJ3V2IHJ1bicgOiAncG9ldHJ5IHJ1bic7XG59XG4iLCJleHBvcnQgZnVuY3Rpb24gbm9ybWFsaXplQ29uZmlnQ29udGVudChjb250ZW50OiBzdHJpbmcgfCB1bmRlZmluZWQpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICByZXR1cm4gY29udGVudD8udHJpbSgpO1xufVxuIiwiaW1wb3J0IHsgZXNjYXBlUmVnRXhwIH0gZnJvbSAnQHdpbGxib29zdGVyL3NoYXJlZC1saWIvc3JjJztcbmV4cG9ydCB0eXBlIENvbmZpZ0Jsb2NrTmFtZSA9ICdiYXNlJyB8ICdleHBvcnQnO1xuXG5pbnRlcmZhY2UgTWFuYWdlZENvbmZpZ0Jsb2Nrc09wdGlvbnMge1xuICBibG9ja05hbWVzOiByZWFkb25seSBDb25maWdCbG9ja05hbWVbXTtcbiAgbWFya2VyUHJlZml4OiBzdHJpbmc7XG4gIHRvb2xOYW1lOiBzdHJpbmc7XG59XG5cbmludGVyZmFjZSBHZXRDb25maWdDb250ZW50T3B0aW9ucyB7XG4gIGRlc2lyZWRDb250ZW50OiBzdHJpbmc7XG4gIGV4aXN0aW5nQ29udGVudDogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICBmaWxlUGF0aDogc3RyaW5nO1xufVxuXG5leHBvcnQgY2xhc3MgTWFuYWdlZENvbmZpZ0Jsb2NrcyB7XG4gIHByaXZhdGUgcmVhZG9ubHkgYmxvY2tOYW1lczogcmVhZG9ubHkgQ29uZmlnQmxvY2tOYW1lW107XG5cbiAgcHJpdmF0ZSByZWFkb25seSBtYXJrZXJQcmVmaXg6IHN0cmluZztcblxuICBwcml2YXRlIHJlYWRvbmx5IHRvb2xOYW1lOiBzdHJpbmc7XG5cbiAgY29uc3RydWN0b3Iob3B0aW9uczogTWFuYWdlZENvbmZpZ0Jsb2Nrc09wdGlvbnMpIHtcbiAgICB0aGlzLmJsb2NrTmFtZXMgPSBvcHRpb25zLmJsb2NrTmFtZXM7XG4gICAgdGhpcy5tYXJrZXJQcmVmaXggPSBvcHRpb25zLm1hcmtlclByZWZpeDtcbiAgICB0aGlzLnRvb2xOYW1lID0gb3B0aW9ucy50b29sTmFtZTtcbiAgfVxuXG4gIGdldENvbmZpZ0NvbnRlbnQob3B0aW9uczogR2V0Q29uZmlnQ29udGVudE9wdGlvbnMpOiBzdHJpbmcge1xuICAgIGlmICghb3B0aW9ucy5leGlzdGluZ0NvbnRlbnQpIHJldHVybiBvcHRpb25zLmRlc2lyZWRDb250ZW50O1xuICAgIGlmICh0aGlzLmhhc01hbmFnZWRCbG9ja3Mob3B0aW9ucy5leGlzdGluZ0NvbnRlbnQpKSB7XG4gICAgICByZXR1cm4gdGhpcy5yZXBsYWNlTWFuYWdlZEJsb2NrcyhvcHRpb25zLmV4aXN0aW5nQ29udGVudCwgb3B0aW9ucy5kZXNpcmVkQ29udGVudCwgb3B0aW9ucy5maWxlUGF0aCk7XG4gICAgfVxuICAgIHJldHVybiBvcHRpb25zLmRlc2lyZWRDb250ZW50O1xuICB9XG5cbiAgZ2V0QmxvY2soYmxvY2tOYW1lOiBDb25maWdCbG9ja05hbWUsIGNvbnRlbnQ6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGAke3RoaXMuZ2V0U3RhcnRNYXJrZXIoYmxvY2tOYW1lKX1cbiR7Y29udGVudH1cbiR7dGhpcy5nZXRFbmRNYXJrZXIoYmxvY2tOYW1lKX1gO1xuICB9XG5cbiAgaGFzTWFuYWdlZEJsb2Nrcyhjb250ZW50OiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5ibG9ja05hbWVzLnNvbWUoKGJsb2NrTmFtZSkgPT4gY29udGVudC5pbmNsdWRlcyh0aGlzLmdldFN0YXJ0TWFya2VyKGJsb2NrTmFtZSkpKTtcbiAgfVxuXG4gIHByaXZhdGUgcmVwbGFjZU1hbmFnZWRCbG9ja3MoZXhpc3RpbmdDb250ZW50OiBzdHJpbmcsIGRlc2lyZWRDb250ZW50OiBzdHJpbmcsIGZpbGVQYXRoOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGxldCBjb250ZW50ID0gZXhpc3RpbmdDb250ZW50O1xuICAgIGZvciAoY29uc3QgYmxvY2tOYW1lIG9mIHRoaXMuYmxvY2tOYW1lcykge1xuICAgICAgY29uc3QgcmVwbGFjZW1lbnQgPSB0aGlzLmV4dHJhY3RNYW5hZ2VkQmxvY2soZGVzaXJlZENvbnRlbnQsIGJsb2NrTmFtZSk7XG4gICAgICBpZiAoIXJlcGxhY2VtZW50KSBjb250aW51ZTtcblxuICAgICAgY29uc3QgbmV4dENvbnRlbnQgPSB0aGlzLnJlcGxhY2VNYW5hZ2VkQmxvY2soY29udGVudCwgYmxvY2tOYW1lLCByZXBsYWNlbWVudCk7XG4gICAgICBpZiAoIW5leHRDb250ZW50KSB7XG4gICAgICAgIGNvbnNvbGUud2FybihgU2tpcHBlZCB1cGRhdGluZyBpbmNvbXBsZXRlICR7YmxvY2tOYW1lfSBibG9jayBpbiAke3RoaXMudG9vbE5hbWV9IGNvbmZpZzogJHtmaWxlUGF0aH1gKTtcbiAgICAgICAgcmV0dXJuIGV4aXN0aW5nQ29udGVudDtcbiAgICAgIH1cbiAgICAgIGNvbnRlbnQgPSBuZXh0Q29udGVudDtcbiAgICB9XG4gICAgcmV0dXJuIGNvbnRlbnQ7XG4gIH1cblxuICBwcml2YXRlIGV4dHJhY3RNYW5hZ2VkQmxvY2soY29udGVudDogc3RyaW5nLCBibG9ja05hbWU6IENvbmZpZ0Jsb2NrTmFtZSk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0TWFuYWdlZEJsb2NrUmVnRXhwKGJsb2NrTmFtZSkuZXhlYyhjb250ZW50KT8uWzBdO1xuICB9XG5cbiAgcHJpdmF0ZSByZXBsYWNlTWFuYWdlZEJsb2NrKGNvbnRlbnQ6IHN0cmluZywgYmxvY2tOYW1lOiBDb25maWdCbG9ja05hbWUsIHJlcGxhY2VtZW50OiBzdHJpbmcpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIGNvbnN0IHBhdHRlcm4gPSB0aGlzLmdldE1hbmFnZWRCbG9ja1JlZ0V4cChibG9ja05hbWUpO1xuICAgIGlmICghcGF0dGVybi50ZXN0KGNvbnRlbnQpKSByZXR1cm4gdW5kZWZpbmVkO1xuICAgIHJldHVybiBjb250ZW50LnJlcGxhY2UocGF0dGVybiwgcmVwbGFjZW1lbnQpO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRNYW5hZ2VkQmxvY2tSZWdFeHAoYmxvY2tOYW1lOiBDb25maWdCbG9ja05hbWUpOiBSZWdFeHAge1xuICAgIHJldHVybiBuZXcgUmVnRXhwKFxuICAgICAgYCR7ZXNjYXBlUmVnRXhwKHRoaXMuZ2V0U3RhcnRNYXJrZXIoYmxvY2tOYW1lKSl9W1xcXFxzXFxcXFNdKj8ke2VzY2FwZVJlZ0V4cCh0aGlzLmdldEVuZE1hcmtlcihibG9ja05hbWUpKX1gXG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0U3RhcnRNYXJrZXIoYmxvY2tOYW1lOiBDb25maWdCbG9ja05hbWUpOiBzdHJpbmcge1xuICAgIHJldHVybiBgLy8gd2JmeTpzdGFydCAke3RoaXMubWFya2VyUHJlZml4fS0ke2Jsb2NrTmFtZX1gO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRFbmRNYXJrZXIoYmxvY2tOYW1lOiBDb25maWdCbG9ja05hbWUpOiBzdHJpbmcge1xuICAgIHJldHVybiBgLy8gd2JmeTplbmQgJHt0aGlzLm1hcmtlclByZWZpeH0tJHtibG9ja05hbWV9YDtcbiAgfVxufVxuIiwiaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZnNVdGlsIH0gZnJvbSAnLi4vdXRpbHMvZnNVdGlsLmpzJztcbmltcG9ydCB7IHJlc29sdmVXaWxsYm9vc3RlckNvbmZpZ01vZHVsZSB9IGZyb20gJy4uL3V0aWxzL3dpbGxib29zdGVyQ29uZmlnc1V0aWwuanMnO1xuXG5pbXBvcnQgeyBub3JtYWxpemVDb25maWdDb250ZW50IH0gZnJvbSAnLi9jb25maWdDb250ZW50LmpzJztcbmltcG9ydCB7IE1hbmFnZWRDb25maWdCbG9ja3MgfSBmcm9tICcuL21hbmFnZWRDb25maWdCbG9jay5qcyc7XG5cbmNvbnN0IG1hbmFnZWRDb25maWdCbG9ja3MgPSBuZXcgTWFuYWdlZENvbmZpZ0Jsb2Nrcyh7XG4gIGJsb2NrTmFtZXM6IFsnYmFzZScsICdleHBvcnQnXSxcbiAgbWFya2VyUHJlZml4OiAnb3hmbXQnLFxuICB0b29sTmFtZTogJ294Zm10Jyxcbn0pO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVPeGZtdENvbmZpZyhjb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdnZW5lcmF0ZU94Zm10Q29uZmlnJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnb3hmbXQuY29uZmlnLnRzJyk7XG4gICAgY29uc3QgZXhpc3RpbmdDb250ZW50ID0gYXdhaXQgZnNVdGlsLnJlYWRGaWxlSWZFeGlzdHMoZmlsZVBhdGgpO1xuICAgIGNvbnN0IGRlc2lyZWRDb250ZW50ID0gbWFuYWdlZENvbmZpZ0Jsb2Nrcy5nZXRDb25maWdDb250ZW50KHtcbiAgICAgIGRlc2lyZWRDb250ZW50OiBnZXRDb25maWdDb250ZW50KGNvbmZpZyksXG4gICAgICBleGlzdGluZ0NvbnRlbnQsXG4gICAgICBmaWxlUGF0aCxcbiAgICB9KTtcbiAgICBpZiAobm9ybWFsaXplQ29uZmlnQ29udGVudChleGlzdGluZ0NvbnRlbnQpICE9PSBub3JtYWxpemVDb25maWdDb250ZW50KGRlc2lyZWRDb250ZW50KSkge1xuICAgICAgYXdhaXQgZnNVdGlsLmdlbmVyYXRlRmlsZShmaWxlUGF0aCwgZGVzaXJlZENvbnRlbnQpO1xuICAgIH1cbiAgfSk7XG59XG5cbmZ1bmN0aW9uIGdldENvbmZpZ0NvbnRlbnQoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogc3RyaW5nIHtcbiAgY29uc3Qgb3hmbXRCYXNlQ29uZmlnTW9kdWxlID0gcmVzb2x2ZVdpbGxib29zdGVyQ29uZmlnTW9kdWxlKGNvbmZpZywgJ0B3aWxsYm9vc3Rlci9veGZtdC1jb25maWcnKTtcblxuICAvLyBDb21tb25KUyBwYWNrYWdlcyBuZWVkIHJlcXVpcmUvbW9kdWxlLmV4cG9ydHMgaGVyZTogb3hmbXQgY29uZmlnIGZpbGVzIGFyZVxuICAvLyBvbmx5IGF1dG8tZGlzY292ZXJlZCBhcyAudHMsIGFuZCB0aGUgc2hhcmVkIGNvbmZpZyBwYWNrYWdlIGlzIEVTTS1vbmx5LlxuICAvLyBObyAvLy8gPHJlZmVyZW5jZSB0eXBlcz4gbGluZTogdGhlIHdiZnktZ2VuZXJhdGVkIHRzY29uZmlnIGFscmVhZHkgY292ZXJzICouY29uZmlnLnRzIHdpdGhcbiAgLy8gdHlwZXMgW1wiYnVuXCJdLCB3aGljaCB0eXBlcyByZXF1aXJlL21vZHVsZS5leHBvcnRzLCB3aGlsZSBhIFwibm9kZVwiIHJlZmVyZW5jZSBicmVha3MgdW5kZXJcbiAgLy8gQnVuJ3MgaXNvbGF0ZWQgbGlua2VyIHdoZXJlIHRoZSB1bmRlY2xhcmVkIEB0eXBlcy9ub2RlIGlzIHVucmVzb2x2YWJsZSAoVFMyNjg4KS5cbiAgaWYgKCFjb25maWcuaXNFc21QYWNrYWdlKSB7XG4gICAgcmV0dXJuIGAke21hbmFnZWRDb25maWdCbG9ja3MuZ2V0QmxvY2soXG4gICAgICAnYmFzZScsXG4gICAgICBgaW1wb3J0IHR5cGUgeyBPeGZtdENvbmZpZyB9IGZyb20gJ294Zm10JztcblxuLy8gb3hsaW50LWRpc2FibGUgdW5pY29ybi9wcmVmZXItbW9kdWxlIC0tIE94Zm10IGNvbmZpZyBmaWxlcyBhcmUgb25seSBhdXRvLWRpc2NvdmVyZWQgYXMgLnRzLCBhbmQgQ29tbW9uSlMgYXZvaWRzIEVTTSBwYWNrYWdlIGxvYWRpbmcgaXNzdWVzLlxuY29uc3Qgb3hmbXRDb25maWcgPSByZXF1aXJlKCcke294Zm10QmFzZUNvbmZpZ01vZHVsZX0nKTtcblxuY29uc3Qgb3hmbXRSZXNvbHZlZENvbmZpZzogT3hmbXRDb25maWcgPSBveGZtdENvbmZpZy5kZWZhdWx0ID8/IG94Zm10Q29uZmlnO2BcbiAgICApfVxuXG4ke21hbmFnZWRDb25maWdCbG9ja3MuZ2V0QmxvY2soJ2V4cG9ydCcsICdtb2R1bGUuZXhwb3J0cyA9IG94Zm10UmVzb2x2ZWRDb25maWc7Jyl9XG5gO1xuICB9XG5cbiAgcmV0dXJuIGAke21hbmFnZWRDb25maWdCbG9ja3MuZ2V0QmxvY2soXG4gICAgJ2Jhc2UnLFxuICAgIGBpbXBvcnQgdHlwZSB7IE94Zm10Q29uZmlnIH0gZnJvbSAnb3hmbXQnO1xuXG5pbXBvcnQgY29uZmlnIGZyb20gJyR7b3hmbXRCYXNlQ29uZmlnTW9kdWxlfSc7XG5cbmNvbnN0IG94Zm10UmVzb2x2ZWRDb25maWc6IE94Zm10Q29uZmlnID0gY29uZmlnO2BcbiAgKX1cblxuJHttYW5hZ2VkQ29uZmlnQmxvY2tzLmdldEJsb2NrKCdleHBvcnQnLCAnZXhwb3J0IGRlZmF1bHQgb3hmbXRSZXNvbHZlZENvbmZpZzsnKX1cbmA7XG59XG4iLCJpbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBmc1V0aWwgfSBmcm9tICcuLi91dGlscy9mc1V0aWwuanMnO1xuaW1wb3J0IHtcbiAgaXNQdWJsaXNoZWRXaWxsYm9vc3RlckNvbmZpZ3NQYWNrYWdlLFxuICByZXNvbHZlV2lsbGJvb3N0ZXJDb25maWdNb2R1bGUsXG59IGZyb20gJy4uL3V0aWxzL3dpbGxib29zdGVyQ29uZmlnc1V0aWwuanMnO1xuXG5pbXBvcnQgeyBub3JtYWxpemVDb25maWdDb250ZW50IH0gZnJvbSAnLi9jb25maWdDb250ZW50LmpzJztcbmltcG9ydCB7IE1hbmFnZWRDb25maWdCbG9ja3MgfSBmcm9tICcuL21hbmFnZWRDb25maWdCbG9jay5qcyc7XG5cbmNvbnN0IG1hbmFnZWRDb25maWdCbG9ja3MgPSBuZXcgTWFuYWdlZENvbmZpZ0Jsb2Nrcyh7XG4gIGJsb2NrTmFtZXM6IFsnYmFzZScsICdleHBvcnQnXSxcbiAgbWFya2VyUHJlZml4OiAnb3hsaW50JyxcbiAgdG9vbE5hbWU6ICdveGxpbnQnLFxufSk7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZW5lcmF0ZU94bGludENvbmZpZyhjb25maWc6IFBhY2thZ2VDb25maWcsIF9yb290Q29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZ2VuZXJhdGVPeGxpbnRDb25maWcnLCBhc3luYyAoKSA9PiB7XG4gICAgLy8gd2lsbGJvb3N0ZXItY29uZmlncyBwdWJsaXNoZXMgY29uZmlnIGZpbGVzIGFzIHByb2R1Y3QgY29kZSwgc28gZ2VuZXJhdGlvblxuICAgIC8vIG11c3Qgbm90IHJlcGxhY2UgcGFja2FnZS1wcm92aWRlZCBsaW50ZXIgc2V0dGluZ3MuIEdlbmVyYXRlZCBmaWxlcyB3aXRoXG4gICAgLy8gbWFuYWdlZCBibG9ja3MgYXJlIHN0aWxsIHNhZmUgdG8gdXBkYXRlLlxuICAgIGNvbnN0IHNob3VsZFByZXNlcnZlUHVibGlzaGVkTGludGVyQ29uZmlnID0gaXNQdWJsaXNoZWRXaWxsYm9vc3RlckNvbmZpZ3NQYWNrYWdlKGNvbmZpZyk7XG4gICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICdveGxpbnQuY29uZmlnLnRzJyk7XG4gICAgY29uc3QgZXhpc3RpbmdDb250ZW50ID0gYXdhaXQgZnNVdGlsLnJlYWRGaWxlSWZFeGlzdHMoZmlsZVBhdGgpO1xuICAgIGNvbnN0IHNob3VsZFByZXNlcnZlRXhpc3RpbmdDb250ZW50ID1cbiAgICAgIHNob3VsZFByZXNlcnZlUHVibGlzaGVkTGludGVyQ29uZmlnICYmIGV4aXN0aW5nQ29udGVudCAmJiAhbWFuYWdlZENvbmZpZ0Jsb2Nrcy5oYXNNYW5hZ2VkQmxvY2tzKGV4aXN0aW5nQ29udGVudCk7XG4gICAgY29uc3QgZGVzaXJlZENvbnRlbnQgPSBzaG91bGRQcmVzZXJ2ZUV4aXN0aW5nQ29udGVudFxuICAgICAgPyBleGlzdGluZ0NvbnRlbnRcbiAgICAgIDogbWFuYWdlZENvbmZpZ0Jsb2Nrcy5nZXRDb25maWdDb250ZW50KHtcbiAgICAgICAgICBkZXNpcmVkQ29udGVudDogZ2V0Q29uZmlnQ29udGVudChjb25maWcpLFxuICAgICAgICAgIGV4aXN0aW5nQ29udGVudCxcbiAgICAgICAgICBmaWxlUGF0aCxcbiAgICAgICAgfSk7XG5cbiAgICBpZiAobm9ybWFsaXplQ29uZmlnQ29udGVudChleGlzdGluZ0NvbnRlbnQpICE9PSBub3JtYWxpemVDb25maWdDb250ZW50KGRlc2lyZWRDb250ZW50KSkge1xuICAgICAgYXdhaXQgZnNVdGlsLmdlbmVyYXRlRmlsZShmaWxlUGF0aCwgZGVzaXJlZENvbnRlbnQpO1xuICAgIH1cbiAgfSk7XG59XG5cbmZ1bmN0aW9uIGdldENvbmZpZ0NvbnRlbnQoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogc3RyaW5nIHtcbiAgY29uc3QgaXNSb290Q29uZmlnID0gY29uZmlnLmlzUm9vdDtcbiAgY29uc3Qgb3hsaW50QmFzZUNvbmZpZ01vZHVsZSA9IHJlc29sdmVXaWxsYm9vc3RlckNvbmZpZ01vZHVsZShjb25maWcsICdAd2lsbGJvb3N0ZXIvb3hsaW50LWNvbmZpZycpO1xuXG4gIC8vIERvIG5vdCBjb2xsYXBzZSB0aGlzIHRvIGEgc3RhdGljIGltcG9ydCBmb3IgZXZlcnkgcGFja2FnZS4gQ29tbW9uSlMgcGFja2FnZXNcbiAgLy8gdHlwZS1jaGVjayBhdXRvLWRpc2NvdmVyZWQgb3hsaW50LmNvbmZpZy50cyBhcyBDb21tb25KUywgc28gaW1wb3J0aW5nIHRoZSBFU01cbiAgLy8gQHdpbGxib29zdGVyL294bGludC1jb25maWcgcGFja2FnZSB0cmlnZ2VycyBUUzE0NzkuIEtlZXAgdGhpcyBpbiBzeW5jIHdpdGhcbiAgLy8gbGl0ZXJhY3ktdGVzdCdzIGdlbmVyYXRlZCBjb25maWcgcGF0dGVybi5cbiAgLy8gTm8gLy8vIDxyZWZlcmVuY2UgdHlwZXM+IGxpbmU6IHRoZSB3YmZ5LWdlbmVyYXRlZCB0c2NvbmZpZyBhbHJlYWR5IGNvdmVycyAqLmNvbmZpZy50cyB3aXRoXG4gIC8vIHR5cGVzIFtcImJ1blwiXSwgd2hpY2ggdHlwZXMgcmVxdWlyZS9tb2R1bGUuZXhwb3J0cywgd2hpbGUgYSBcIm5vZGVcIiByZWZlcmVuY2UgYnJlYWtzIHVuZGVyXG4gIC8vIEJ1bidzIGlzb2xhdGVkIGxpbmtlciB3aGVyZSB0aGUgdW5kZWNsYXJlZCBAdHlwZXMvbm9kZSBpcyB1bnJlc29sdmFibGUgKFRTMjY4OCkuXG4gIGlmICghY29uZmlnLmlzRXNtUGFja2FnZSkge1xuICAgIHJldHVybiBgJHttYW5hZ2VkQ29uZmlnQmxvY2tzLmdldEJsb2NrKFxuICAgICAgJ2Jhc2UnLFxuICAgICAgYGltcG9ydCB0eXBlIHsgT3hsaW50Q29uZmlnIH0gZnJvbSAnb3hsaW50JztcblxuLy8gb3hsaW50LWRpc2FibGUgdW5pY29ybi9wcmVmZXItbW9kdWxlIC0tIE94bGludCBvbmx5IGF1dG8tZGlzY292ZXJzIC50cyBjb25maWcgZmlsZXMsIGFuZCBDb21tb25KUyBhdm9pZHMgRVNNIHBhY2thZ2UgbG9hZGluZyBpc3N1ZXMuXG5jb25zdCBveGxpbnRCYXNlQ29uZmlnID0gcmVxdWlyZSgnJHtveGxpbnRCYXNlQ29uZmlnTW9kdWxlfScpO1xuXG4ke2dldFJlc29sdmVkQ29uZmlnQ29udGVudCgnb3hsaW50QmFzZUNvbmZpZy5kZWZhdWx0ID8/IG94bGludEJhc2VDb25maWcnLCBpc1Jvb3RDb25maWcpfWBcbiAgICApfVxuXG4ke21hbmFnZWRDb25maWdCbG9ja3MuZ2V0QmxvY2soJ2V4cG9ydCcsICdtb2R1bGUuZXhwb3J0cyA9IG94bGludFJlc29sdmVkQ29uZmlnOycpfVxuYDtcbiAgfVxuXG4gIHJldHVybiBgJHttYW5hZ2VkQ29uZmlnQmxvY2tzLmdldEJsb2NrKFxuICAgICdiYXNlJyxcbiAgICBgaW1wb3J0IHR5cGUgeyBPeGxpbnRDb25maWcgfSBmcm9tICdveGxpbnQnO1xuXG5pbXBvcnQgb3hsaW50QmFzZUNvbmZpZyBmcm9tICcke294bGludEJhc2VDb25maWdNb2R1bGV9JztcblxuJHtnZXRSZXNvbHZlZENvbmZpZ0NvbnRlbnQoJ294bGludEJhc2VDb25maWcnLCBpc1Jvb3RDb25maWcpfWBcbiAgKX1cblxuJHttYW5hZ2VkQ29uZmlnQmxvY2tzLmdldEJsb2NrKCdleHBvcnQnLCAnZXhwb3J0IGRlZmF1bHQgb3hsaW50UmVzb2x2ZWRDb25maWc7Jyl9XG5gO1xufVxuXG4vLyBzdHJ1Y3R1cmVkQ2xvbmUga2VlcHMgYSBwYWNrYWdlLWxvY2FsIGNvcHkgc28gcmVwb3NpdG9yaWVzIGNhbiBhZGQgc2V0dGluZ3Mgb3V0c2lkZSBtYW5hZ2VkXG4vLyBibG9ja3Mgd2l0aG91dCBtdXRhdGluZyB0aGUgc2hhcmVkIGltcG9ydGVkIGNvbmZpZyBvYmplY3QuIFRoZSByb290IGNvbmZpZyBmb3JjZXMgdGhlIHR5cGUtYXdhcmVcbi8vIG9wdGlvbnMgb24gaW5zaWRlIHRoZSBtYW5hZ2VkIGJsb2NrIHNvIG5vIGN1c3RvbWl6YXRpb24gY2FuIHNpbGVudGx5IGRpc2FibGUgdHlwZSBjaGVja2luZzsgZXZlcnlcbi8vIG90aGVyIGNvbmZpZyBkZWxldGVzIHRoZW0gYmVjYXVzZSBPeGxpbnQgcmVqZWN0cyB0aG9zZSByb290LW9ubHkgb3B0aW9ucyBlbHNld2hlcmUgKHR5cGUgY2hlY2tpbmdcbi8vIHN1cnZpdmVzOiB0aGUgbGludCBjb21tYW5kcyBwYXNzIC0tdHlwZS1hd2FyZSBhbmQgLS10eXBlLWNoZWNrIGV4cGxpY2l0bHkpLlxuZnVuY3Rpb24gZ2V0UmVzb2x2ZWRDb25maWdDb250ZW50KGJhc2VDb25maWdOYW1lOiBzdHJpbmcsIGlzUm9vdENvbmZpZzogYm9vbGVhbik6IHN0cmluZyB7XG4gIGlmIChpc1Jvb3RDb25maWcpIHtcbiAgICByZXR1cm4gYGNvbnN0IG94bGludFJlc29sdmVkQ29uZmlnOiBPeGxpbnRDb25maWcgPSBzdHJ1Y3R1cmVkQ2xvbmUoJHtiYXNlQ29uZmlnTmFtZX0pO1xub3hsaW50UmVzb2x2ZWRDb25maWcub3B0aW9ucyA9IHsgLi4ub3hsaW50UmVzb2x2ZWRDb25maWcub3B0aW9ucywgdHlwZUF3YXJlOiB0cnVlLCB0eXBlQ2hlY2s6IHRydWUgfTtgO1xuICB9XG5cbiAgcmV0dXJuIGBjb25zdCBveGxpbnRSZXNvbHZlZENvbmZpZzogT3hsaW50Q29uZmlnID0gc3RydWN0dXJlZENsb25lKCR7YmFzZUNvbmZpZ05hbWV9KTtcbmRlbGV0ZSBveGxpbnRSZXNvbHZlZENvbmZpZy5vcHRpb25zO2A7XG59XG4iLCJpbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBmc1V0aWwgfSBmcm9tICcuLi91dGlscy9mc1V0aWwuanMnO1xuaW1wb3J0IHsgaWdub3JlRmlsZVV0aWwgfSBmcm9tICcuLi91dGlscy9pZ25vcmVGaWxlVXRpbC5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcblxuY29uc3QgY29tbW9uQ29udGVudCA9IGBcbjNyZC1wYXJ0eS9cbmFuZHJvaWQvXG5pb3MvXG5uby1mb3JtYXQvXG50ZXN0LWZpeHR1cmVzL1xudGVzdC9maXh0dXJlcy9cbiouZC50c1xuKi5taW4uanNcbi55YXJuL1xuLnBucC5qc1xuYDtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlUHJldHRpZXJpZ25vcmUoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZ2VuZXJhdGVQcmV0dGllcmlnbm9yZScsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJy5wcmV0dGllcmlnbm9yZScpO1xuICAgIGNvbnN0IGNvbnRlbnQgPSAoYXdhaXQgZnNVdGlsLnJlYWRGaWxlSWZFeGlzdHMoZmlsZVBhdGgpKSA/PyAnJztcbiAgICBjb25zdCBoZWFkVXNlckNvbnRlbnQgPSBpZ25vcmVGaWxlVXRpbC5nZXRIZWFkVXNlckNvbnRlbnQoY29udGVudCk7XG4gICAgY29uc3QgdGFpbFVzZXJDb250ZW50ID0gaWdub3JlRmlsZVV0aWwuZ2V0VGFpbFVzZXJDb250ZW50KGNvbnRlbnQpO1xuXG4gICAgY29uc3QgZ2l0aWdub3JlRmlsZVBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICcuZ2l0aWdub3JlJyk7XG4gICAgY29uc3QgZ2l0aWdub3JlQ29udGVudCA9IChhd2FpdCBpZ25vcmVGaWxlVXRpbC5yZWFkR2l0aWdub3JlV2l0aG91dFNlcGFyYXRvcnMoZ2l0aWdub3JlRmlsZVBhdGgpKSB8fCAnJztcblxuICAgIGxldCBhZGRpdGlvbmFsQ29udGVudCA9ICcnO1xuICAgIGlmIChjb25maWcuZG9lc0NvbnRhaW5QdWJzcGVjWWFtbCkge1xuICAgICAgYWRkaXRpb25hbENvbnRlbnQgPSBgXG5hbmRyb2lkL2FwcC9cbmlvcy9SdW5uZXIvQXNzZXRzLnhjYXNzZXRzL1xucHVic3BlYy55YW1sXG5gO1xuICAgIH1cblxuICAgIGNvbnN0IG5ld0NvbnRlbnQgPSBoZWFkVXNlckNvbnRlbnQgKyBjb21tb25Db250ZW50ICsgYWRkaXRpb25hbENvbnRlbnQgKyBnaXRpZ25vcmVDb250ZW50ICsgdGFpbFVzZXJDb250ZW50O1xuICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiBmc1V0aWwuZ2VuZXJhdGVGaWxlKGZpbGVQYXRoLCBuZXdDb250ZW50KSk7XG4gIH0pO1xufVxuIiwiaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IG1lcmdlIGZyb20gJ2RlZXBtZXJnZSc7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGZzVXRpbCB9IGZyb20gJy4uL3V0aWxzL2ZzVXRpbC5qcyc7XG5pbXBvcnQgeyBqc29uY1V0aWwgfSBmcm9tICcuLi91dGlscy9qc29uY1V0aWwuanMnO1xuaW1wb3J0IHsgb3ZlcndyaXRlTWVyZ2UgfSBmcm9tICcuLi91dGlscy9tZXJnZVV0aWwuanMnO1xuaW1wb3J0IHsgc29ydEtleXMgfSBmcm9tICcuLi91dGlscy9vYmplY3RVdGlsLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuXG5jb25zdCBqc29uT2JqID0ge1xuICB2ZW52UGF0aDogJy4nLFxuICB2ZW52OiAnLnZlbnYnLFxufTtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlUHlyaWdodENvbmZpZ0pzb24oY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZ2VuZXJhdGVQeXJpZ2h0Q29uZmlnSnNvbicsIGFzeW5jICgpID0+IHtcbiAgICBsZXQgbmV3U2V0dGluZ3M6IG9iamVjdCA9IHN0cnVjdHVyZWRDbG9uZShqc29uT2JqKTtcbiAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJ3B5cmlnaHRjb25maWcuanNvbicpO1xuICAgIGNvbnN0IG9sZENvbnRlbnQgPSBhd2FpdCBmc1V0aWwucmVhZEZpbGVJZkV4aXN0cyhmaWxlUGF0aCk7XG4gICAgbGV0IG9yaWdpbmFsU2V0dGluZ3NKc29uOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gICAgaWYgKG9sZENvbnRlbnQgIT09IHVuZGVmaW5lZCAmJiAhanNvbmNVdGlsLmlzVHJpdmlhT25seShvbGRDb250ZW50KSkge1xuICAgICAgLy8gcHlyaWdodGNvbmZpZy5qc29uIGFsbG93cyBKU09OQzsgYW4gZXhpc3RpbmcgZmlsZSB3YmZ5IGNhbm5vdCBwYXJzZSBtdXN0IGJlIGxlZnRcbiAgICAgIC8vIHVudG91Y2hlZCBpbnN0ZWFkIG9mIGJlaW5nIG92ZXJ3cml0dGVuIHdpdGggdGhlIGJhcmUgdGVtcGxhdGUuXG4gICAgICBjb25zdCBvbGRTZXR0aW5ncyA9IGpzb25jVXRpbC5wYXJzZU9iamVjdElnbm9yaW5nRXJyb3I8b2JqZWN0PihvbGRDb250ZW50KTtcbiAgICAgIGlmICghb2xkU2V0dGluZ3MpIHtcbiAgICAgICAgY29uc29sZS53YXJuKGBTa2lwcGVkIGdlbmVyYXRpbmcgJHtmaWxlUGF0aH0gYmVjYXVzZSB0aGUgZXhpc3RpbmcgY29udGVudCBpcyBub3QgcGFyc2FibGUgYXMgSlNPTkMuYCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIG9yaWdpbmFsU2V0dGluZ3NKc29uID0gSlNPTi5zdHJpbmdpZnkoc29ydEtleXMoc3RydWN0dXJlZENsb25lKG9sZFNldHRpbmdzKSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPikpO1xuICAgICAgbmV3U2V0dGluZ3MgPSBtZXJnZS5hbGwoW25ld1NldHRpbmdzLCBvbGRTZXR0aW5ncywgbmV3U2V0dGluZ3NdLCB7IGFycmF5TWVyZ2U6IG92ZXJ3cml0ZU1lcmdlIH0pO1xuICAgIH1cbiAgICAvLyBTa2lwIHRoZSB3cml0ZSB3aGVuIG5vdGhpbmcgY2hhbmdlcyBzZW1hbnRpY2FsbHksIHNvIEpTT05DIGNvbW1lbnRzIGFuZCBmb3JtYXR0aW5nIGluIGFuXG4gICAgLy8gYWxyZWFkeS1jbGVhbiBweXJpZ2h0Y29uZmlnLmpzb24gc3Vydml2ZSB3YmZ5IHJ1bnMuXG4gICAgaWYgKG9yaWdpbmFsU2V0dGluZ3NKc29uID09PSBKU09OLnN0cmluZ2lmeShzb3J0S2V5cyhzdHJ1Y3R1cmVkQ2xvbmUobmV3U2V0dGluZ3MpIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KSkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgbmV3Q29udGVudCA9IEpTT04uc3RyaW5naWZ5KG5ld1NldHRpbmdzLCB1bmRlZmluZWQsIDIpO1xuICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiBmc1V0aWwuZ2VuZXJhdGVGaWxlKGZpbGVQYXRoLCBuZXdDb250ZW50KSk7XG4gIH0pO1xufVxuIiwiaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHsgY29uc3VtZXNEb2NrZXJFbnYgfSBmcm9tICdAd2lsbGJvb3N0ZXIvc2hhcmVkLWxpYi1ub2RlL3NyYyc7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGZzVXRpbCB9IGZyb20gJy4uL3V0aWxzL2ZzVXRpbC5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcblxuY29uc3QgbWFuYWdlZFNjcmlwdHNCbG9jayA9IGBzY3JpcHRzLyoqXG4hc2NyaXB0cy9cbiFzY3JpcHRzLyouc2hgO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZml4UmFpbHdheWlnbm9yZShjb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdmaXhSYWlsd2F5aWdub3JlJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnLnJhaWx3YXlpZ25vcmUnKTtcbiAgICBjb25zdCBjb250ZW50ID0gYXdhaXQgZnNVdGlsLnJlYWRGaWxlSWZFeGlzdHMoZmlsZVBhdGgpO1xuICAgIGNvbnN0IHVzZXNEb2NrZXJFbnYgPSBjb25zdW1lc0RvY2tlckVudihjb25maWcuZG9ja2VyZmlsZSk7XG4gICAgaWYgKCFjb250ZW50KSB7XG4gICAgICBpZiAoY29uZmlnLmlzUmFpbHdheSAmJiB1c2VzRG9ja2VyRW52KSB7XG4gICAgICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiBmc1V0aWwuZ2VuZXJhdGVGaWxlKGZpbGVQYXRoLCAnIS5kb2NrZXIuZW52XFxuJykpO1xuICAgICAgfVxuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGxldCBuZXdDb250ZW50ID0gY29udGVudC5yZXBsYWNlKC9ec2NyaXB0c1xcLyQvbSwgbWFuYWdlZFNjcmlwdHNCbG9jayk7XG4gICAgLy8gYHJhaWx3YXkgdXBgIHN0cmlwcyBnaXRpZ25vcmVkIGZpbGVzIGZyb20gdGhlIHVwbG9hZGVkIGJ1aWxkIGNvbnRleHQsIHNvIHRoZSBnZW5lcmF0ZWRcbiAgICAvLyBub24tc2VjcmV0IC5kb2NrZXIuZW52IChgd2IgZ2VuLWRvY2tlci1lbnZgIG91dHB1dCkgbmVlZHMgYW4gZXhwbGljaXQgdW4taWdub3JlIHRvIHJlYWNoXG4gICAgLy8gdGhlIHJlbW90ZSBEb2NrZXIgYnVpbGQuIEFwcGVuZGVkLCBub3QgcHJlcGVuZGVkOiBpZ25vcmUgZmlsZXMgYXJlIGxhc3QtbWF0Y2gtd2lucywgc28gYVxuICAgIC8vIGhhbmQtd3JpdHRlbiBwYXR0ZXJuIHN1Y2ggYXMgYCouZW52YCBlYXJsaWVyIGluIHRoZSBmaWxlIG11c3Qgbm90IHNpbGVudGx5IHJlLWV4Y2x1ZGUgaXQuXG4gICAgaWYgKHVzZXNEb2NrZXJFbnYgJiYgIS9eIVxcLmRvY2tlclxcLmVudiQvbS50ZXN0KG5ld0NvbnRlbnQpKSB7XG4gICAgICBuZXdDb250ZW50ID0gYCR7bmV3Q29udGVudC5yZXBsYWNlKC9cXG4/JC8sICdcXG4nKX0hLmRvY2tlci5lbnZcXG5gO1xuICAgIH0gZWxzZSBpZiAoY29uZmlnLmRvY2tlcmZpbGUgJiYgIXVzZXNEb2NrZXJFbnYpIHtcbiAgICAgIG5ld0NvbnRlbnQgPSBuZXdDb250ZW50LnJlcGxhY2UoL14hXFwuZG9ja2VyXFwuZW52XFxuPy9tLCAnJyk7XG4gICAgfVxuICAgIGlmIChuZXdDb250ZW50ID09PSBjb250ZW50KSByZXR1cm47XG5cbiAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT5cbiAgICAgIG5ld0NvbnRlbnQgPyBmc1V0aWwuZ2VuZXJhdGVGaWxlKGZpbGVQYXRoLCBuZXdDb250ZW50KSA6IGZzVXRpbC5yZW1vdmVDb25maW5lZChmaWxlUGF0aClcbiAgICApO1xuICB9KTtcbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB0eXBlIHsgSW1hZ2UsIExpbmssIFBhcmFncmFwaCwgUGhyYXNpbmdDb250ZW50LCBSb290Q29udGVudCB9IGZyb20gJ21kYXN0JztcbmltcG9ydCB7IGZyb21NYXJrZG93biB9IGZyb20gJ21kYXN0LXV0aWwtZnJvbS1tYXJrZG93bic7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGpvYnNBbGxDYWxsUmV1c2FibGVXb3JrZmxvdyB9IGZyb20gJy4vd29ya2Zsb3cuanMnO1xuaW1wb3J0IHsgZnNVdGlsIH0gZnJvbSAnLi4vdXRpbHMvZnNVdGlsLmpzJztcbmltcG9ydCB7IGdldE9jdG9raXQgfSBmcm9tICcuLi91dGlscy9naXRodWJVdGlsLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuaW1wb3J0IHsgZ2V0V2JmeVZlcnNpb25MYWJlbCB9IGZyb20gJy4uL3V0aWxzL3ZlcnNpb24uanMnO1xuXG5jb25zdCBzZW1hbnRpY1JlbGVhc2VCYWRnZSA9XG4gICdbIVtzZW1hbnRpYy1yZWxlYXNlXShodHRwczovL2ltZy5zaGllbGRzLmlvL2JhZGdlLyUyMCUyMCVGMCU5RiU5MyVBNiVGMCU5RiU5QSU4MC1zZW1hbnRpYy0tcmVsZWFzZS1lMTAwNzkuc3ZnKV0oaHR0cHM6Ly9naXRodWIuY29tL3NlbWFudGljLXJlbGVhc2Uvc2VtYW50aWMtcmVsZWFzZSknO1xuXG5jb25zdCB3YmZ5QmFkZ2VVcmxQcmVmaXggPSAnaHR0cHM6Ly9pbWcuc2hpZWxkcy5pby9iYWRnZS93YmZ5LSc7XG5jb25zdCB3YmZ5QmFkZ2VVcmxTdWZmaXggPSAnLTFlOTBmZi5zdmcnO1xuY29uc3Qgd2JmeUJhZGdlTGluayA9ICdodHRwczovL2dpdGh1Yi5jb20vV2lsbEJvb3N0ZXIvc2hhcmVkL3RyZWUvbWFpbi9wYWNrYWdlcy93YmZ5JztcblxuY29uc3QgbnBtUGFja2FnZVVybFByZWZpeCA9ICdodHRwczovL3d3dy5ucG1qcy5jb20vcGFja2FnZS8nO1xuY29uc3QgbnBtTGljZW5zZUJhZGdlUGF0dGVybiA9IC9eXFxbIVxcW1teXFxdXSpcXF1cXChodHRwczpcXC9cXC9pbWdcXC5zaGllbGRzXFwuaW9cXC9ucG1cXC9sXFwvW14pXFxzXStcXClcXF1cXChbXilcXHNdK1xcKSQvdTtcblxuY29uc3QgbWFuYWdlZEJhZGdlUGF0dGVybnMgPSBbXG4gIC9eXFxbIVxcW3diZnlcXF1cXChodHRwczpcXC9cXC9pbWdcXC5zaGllbGRzXFwuaW9cXC9iYWRnZVxcL3diZnktW14pXFxzXSstMWU5MGZmXFwuc3ZnXFwpXFxdXFwoaHR0cHM6XFwvXFwvZ2l0aHViXFwuY29tXFwvV2lsbEJvb3N0ZXJcXC9zaGFyZWRcXC90cmVlXFwvbWFpblxcL3BhY2thZ2VzXFwvd2JmeVxcKSQvdSxcbiAgL15cXFshXFxbW15cXF1dKlxcXVxcKChodHRwczpcXC9cXC9naXRodWJcXC5jb21cXC9bXilcXHNdK1xcL2FjdGlvbnNcXC93b3JrZmxvd3NcXC9bXilcXHNdKylcXC9iYWRnZVxcLnN2Z1xcKVxcXVxcKFxcMVxcKSQvdSxcbiAgL15cXFshXFxbW15cXF1dKlxcXVxcKFteKVxcc10rXFwpXFxdXFwoaHR0cHM/OlxcL1xcLyg/Ond3d1xcLik/bnBtanNcXC5jb21cXC9wYWNrYWdlXFwvW14pXFxzXSpcXCkkL3UsXG4gIG5wbUxpY2Vuc2VCYWRnZVBhdHRlcm4sXG5dO1xuXG5mdW5jdGlvbiBidWlsZFdiZnlCYWRnZShsYWJlbDogc3RyaW5nKTogc3RyaW5nIHtcbiAgLy8gSHlwaGVucyBhcmUgZXNjYXBlZCBhcyBgLS1gIHBlciBzaGllbGRzLmlvJ3MgYmFkZ2UgcGF0aCBzeW50YXgsIHNvIGB2MS4yLjMtcmMuMWAgc3RheXMgaW50YWN0LlxuICByZXR1cm4gYFshW3diZnldKCR7d2JmeUJhZGdlVXJsUHJlZml4fSR7bGFiZWwucmVwbGFjZUFsbCgnLScsICctLScpfSR7d2JmeUJhZGdlVXJsU3VmZml4fSldKCR7d2JmeUJhZGdlTGlua30pYDtcbn1cblxuLyoqIFRoZSB2ZXJzaW9uIGxhYmVsIHRoZSB3YmZ5IGJhZGdlIGluIHRoZSByZXBvc2l0b3J5J3MgUkVBRE1FIHJlY29yZHMsIGkuZS4gdGhlIGJ1aWxkIHRoYXQgd2JmaWVkIGl0LiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJlYWRBcHBsaWVkV2JmeVZlcnNpb25MYWJlbChkaXJQYXRoOiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZyB8IHVuZGVmaW5lZD4ge1xuICAvLyBDb25maW5lZCwgYW5kIHRvbGVyYW50IG9mIGFueSByZWFkIGZhaWx1cmU6IGEgUkVBRE1FIHRoYXQgcmVzb2x2ZXMgb3V0c2lkZSB0aGUgcmVwb3NpdG9yeSAoYVxuICAvLyBjb21taXR0ZWQgc3ltbGluaykgb3IgY2Fubm90IGJlIHJlYWQgYXQgYWxsIHNheXMgbm90aGluZyBhYm91dCB3aGljaCBidWlsZCBjb25maWd1cmVkIFRISVNcbiAgLy8gcmVwb3NpdG9yeSwgYW5kIHRoZSBhbnN3ZXIgb25seSBldmVyIHN1cHByZXNzZXMgd29yayDigJQgc28gYW55dGhpbmcgYnV0IGEgcmVhZGFibGUgaW4tcmVwb3NpdG9yeVxuICAvLyBSRUFETUUgbWVhbnMgXCJub3Qga25vd24gdG8gYmUgYXBwbGllZFwiIGFuZCB0aGUgcnVuIHByb2NlZWRzLlxuICBjb25zdCByZWFkbWUgPSBhd2FpdCBmc1V0aWwucmVhZEZpbGVDb25maW5lZElmRXhpc3RzKHBhdGgucmVzb2x2ZShkaXJQYXRoLCAnUkVBRE1FLm1kJykpLmNhdGNoKCgpID0+IHt9KTtcbiAgaWYgKHJlYWRtZSA9PT0gdW5kZWZpbmVkKSByZXR1cm4gdW5kZWZpbmVkO1xuXG4gIC8vIFRoZSBSRUFETUUgaXMgcGFyc2VkIHJhdGhlciB0aGFuIHNjYW5uZWQsIGZvciB0aGUgc2FtZSByZWFzb24gd3JpdGVCYWRnZUJsb2NrIHBhcnNlcyBpdCwgYW5kXG4gIC8vIG9ubHkgdGhlIHNoYXBlIHdyaXRlQmFkZ2VCbG9jayBpdHNlbGYgd3JpdGVzIGNvdW50cyBhcyBhbiBhcHBsaWVkIGJhZGdlOiBhIHRvcC1sZXZlbCBwYXJhZ3JhcGhcbiAgLy8gb2YgYmFkZ2VzLiBBIGJhZGdlIGFueXdoZXJlIGVsc2UgaXMgY29udGVudCB0aGF0IG1lcmVseSBtZW50aW9ucyBvbmUg4oCUIGEgZmVuY2VkIGV4YW1wbGUgKHdiZnknc1xuICAvLyBvd24gZG9jdW1lbnRhdGlvbiBoYXMgdGhvc2UpLCBhIGJsb2NrIHF1b3RlLCBhIGxpc3QgaXRlbSDigJQgYW5kIHJlYWRpbmcgaXQgYXMgYXBwbGllZCB3b3VsZCBza2lwXG4gIC8vIGV2ZXJ5IGZpeGVyIGZvciB0aGUgcmVwb3NpdG9yeS5cbiAgZm9yIChjb25zdCBub2RlIG9mIGZyb21NYXJrZG93bihyZWFkbWUpLmNoaWxkcmVuKSB7XG4gICAgaWYgKCFpc0JhZGdlQmxvY2tOb2RlKG5vZGUpKSBjb250aW51ZTtcbiAgICBmb3IgKGNvbnN0IGJhZGdlIG9mIG5vZGUuY2hpbGRyZW4pIHtcbiAgICAgIGlmICghaXNCYWRnZU5vZGUoYmFkZ2UpKSBjb250aW51ZTtcbiAgICAgIGNvbnN0IHsgdXJsIH0gPSBiYWRnZS5jaGlsZHJlblswXTtcbiAgICAgIGlmICh1cmwuc3RhcnRzV2l0aCh3YmZ5QmFkZ2VVcmxQcmVmaXgpICYmIHVybC5lbmRzV2l0aCh3YmZ5QmFkZ2VVcmxTdWZmaXgpKSB7XG4gICAgICAgIHJldHVybiB1cmwuc2xpY2Uod2JmeUJhZGdlVXJsUHJlZml4Lmxlbmd0aCwgLXdiZnlCYWRnZVVybFN1ZmZpeC5sZW5ndGgpLnJlcGxhY2VBbGwoJy0tJywgJy0nKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcmV0dXJuIHVuZGVmaW5lZDtcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlUmVhZG1lKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2dlbmVyYXRlUmVhZG1lJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnUkVBRE1FLm1kJyk7XG4gICAgLy8gVGhlIHdiZnkgYmFkZ2UgbWFya3MgYSByZXBvc2l0b3J5IGFzIHdiZmllZCwgc28gYSByZXBvc2l0b3J5IHdpdGhvdXQgYSBSRUFETUUgc3RpbGwgZ2V0cyBvbmUuXG4gICAgLy8gcmVhZEZpbGVJZkV4aXN0cyBmYWxscyBiYWNrIE9OTFkgb24gRU5PRU5UOiBhIFJFQURNRSB0aGF0IGV4aXN0cyBidXQgY2Fubm90IGJlIHJlYWQgKGUuZy5cbiAgICAvLyBwZXJtaXNzaW9ucywgRU1GSUxFKSBtdXN0IGFib3J0IHRoZSBnZW5lcmF0b3IgaW5zdGVhZCBvZiBiZWluZyBvdmVyd3JpdHRlbiB3aXRoIHRoZSBzdHViLlxuICAgIGxldCBuZXdDb250ZW50ID1cbiAgICAgIChhd2FpdCBmc1V0aWwucmVhZEZpbGVJZkV4aXN0cyhmaWxlUGF0aCkpID8/XG4gICAgICBgIyAke2NvbmZpZy5wYWNrYWdlSnNvbj8ubmFtZSA/PyBwYXRoLmJhc2VuYW1lKHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCkpfVxcbmA7XG5cbiAgICAvLyBPcmRlcmVkIGJ5IHdoYXQgYSByZWFkZXIgY2FyZXMgYWJvdXQgbW9zdDogdGhlIG5wbSBiYWRnZSBuYW1lcyB0aGUgcGFja2FnZSBhIHJlYWRlciBpbnN0YWxscyxcbiAgICAvLyB0aGVuIHRoZSB3b3JrZmxvdyBiYWRnZXMgcmVwb3J0IHdoZXRoZXIgdGhlIGNvZGUgaXMgY3VycmVudGx5IGhlYWx0aHksIHRoZW4gaG93IGl0IGlzXG4gICAgLy8gcmVsZWFzZWQsIGFuZCBsYXN0IHRoZSB3YmZ5IGJ1aWxkIHRoYXQgY29uZmlndXJlZCBpdC5cbiAgICBjb25zdCBiYWRnZXM6IHN0cmluZ1tdID0gW107XG4gICAgY29uc3QgcGFja2FnZU5hbWUgPSBhd2FpdCBnZXRQdWJsaXNoZWROcG1QYWNrYWdlTmFtZShjb25maWcpO1xuICAgIGlmIChwYWNrYWdlTmFtZSkge1xuICAgICAgYmFkZ2VzLnB1c2goYnVpbGROcG1CYWRnZShwYWNrYWdlTmFtZSkpO1xuICAgICAgY29uc3QgbGljZW5zZSA9IGNvbmZpZy5wYWNrYWdlSnNvbj8ubGljZW5zZTtcbiAgICAgIGlmIChsaWNlbnNlICYmIGxpY2Vuc2UgIT09ICdVTkxJQ0VOU0VEJykge1xuICAgICAgICBiYWRnZXMucHVzaChidWlsZExpY2Vuc2VCYWRnZShwYWNrYWdlTmFtZSkpO1xuICAgICAgfVxuICAgIH1cbiAgICBiYWRnZXMucHVzaCguLi4oYXdhaXQgYnVpbGRXb3JrZmxvd0JhZGdlcyhjb25maWcpKSk7XG4gICAgaWYgKGZzLmV4aXN0c1N5bmMocGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnLnJlbGVhc2VyYy5qc29uJykpKSBiYWRnZXMucHVzaChzZW1hbnRpY1JlbGVhc2VCYWRnZSk7XG4gICAgYmFkZ2VzLnB1c2goYnVpbGRXYmZ5QmFkZ2UoZ2V0V2JmeVZlcnNpb25MYWJlbCgpID8/ICdhcHBsaWVkJykpO1xuXG4gICAgLy8gVGhlIGJsb2NrIGlzIHdyaXR0ZW4gaW4gb25lIHBhc3MgZnJvbSB0aGUgYmFkZ2VzIHdiZnkgbWFuYWdlcyByaWdodCBub3cuIEEgYmFkZ2UgdGhhdCBpcyBub1xuICAgIC8vIGxvbmdlciB3YW50ZWQg4oCUIGEgc3VwZXJzZWRlZCB2ZXJzaW9uLCBvciBvbmUgd2hvc2Ugd29ya2Zsb3cgaXMgZ29uZSDigJQgc2ltcGx5IGlzIG5vdCBpbiB0aGVcbiAgICAvLyBsaXN0LCBzbyBub3RoaW5nIGhhcyB0byByZW1vdmUgaXQuXG4gICAgbmV3Q29udGVudCA9IHdyaXRlQmFkZ2VCbG9jayhuZXdDb250ZW50LCBiYWRnZXMpO1xuXG4gICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzVXRpbC5nZW5lcmF0ZUZpbGUoZmlsZVBhdGgsIG5ld0NvbnRlbnQsIGdldExpbmVFbmRpbmcobmV3Q29udGVudCkpKTtcbiAgfSk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGdldFB1Ymxpc2hlZE5wbVBhY2thZ2VOYW1lKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8c3RyaW5nIHwgdW5kZWZpbmVkPiB7XG4gIGNvbnN0IHBhY2thZ2VKc29uID0gY29uZmlnLnBhY2thZ2VKc29uO1xuICAvLyBBIG1vbm9yZXBvIGhhcyBubyBzaW5nbGUgbnBtIHZlcnNpb24gcmVwcmVzZW50aW5nIHRoZSB3aG9sZSByZXBvc2l0b3J5LlxuICBpZiAoY29uZmlnLmRvZXNDb250YWluU3ViUGFja2FnZUpzb25zIHx8ICFjb25maWcucmVsZWFzZS5ucG0gfHwgIXBhY2thZ2VKc29uPy5uYW1lIHx8IHBhY2thZ2VKc29uLnByaXZhdGUpIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG4gIHJldHVybiAoYXdhaXQgaXNNaXNzaW5nRnJvbU5wbVJlZ2lzdHJ5KHBhY2thZ2VKc29uLm5hbWUpKSA/IHVuZGVmaW5lZCA6IHBhY2thZ2VKc29uLm5hbWU7XG59XG5cbi8qKlxuICogV2hldGhlciB0aGUgcmVnaXN0cnkgYW5zd2VycyB0aGF0IGl0IGhhcyBubyBzdWNoIHBhY2thZ2Ug4oCUIHRoZSBPTkxZIGFuc3dlciB0aGF0IHJlbW92ZXMgYSBiYWRnZS5cbiAqIEEgY2hlY2sgdGhhdCBjYW5ub3QgcnVuIChvZmZsaW5lLCBhbiBvdXRhZ2UsIGEgdGltZW91dCkgc2F5cyBub3RoaW5nIGFib3V0IHRoZSBwYWNrYWdlLCBhbmRcbiAqIHRyZWF0aW5nIGl0IGFzIGFic2VudCB3b3VsZCBzdHJpcCB0aGUgYmFkZ2Ugb3V0IG9mIGV2ZXJ5IHB1Ymxpc2hlZCByZXBvc2l0b3J5IHdiZnkgdG91Y2hlc1xuICogZHVyaW5nIHRoZSBvdXRhZ2UgYW5kIHB1dCBpdCBiYWNrIGFmdGVyd2FyZHMuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGlzTWlzc2luZ0Zyb21OcG1SZWdpc3RyeShwYWNrYWdlTmFtZTogc3RyaW5nKTogUHJvbWlzZTxib29sZWFuPiB7XG4gIHRyeSB7XG4gICAgLy8gVGhlIHNjb3BlIHNlcGFyYXRvciBtdXN0IHN1cnZpdmUgYXMgYSBwYXRoIHNlZ21lbnQsIHNvIHRoZSBuYW1lIGlzIGVuY29kZWQgcGllY2V3aXNlLlxuICAgIGNvbnN0IGVuY29kZWROYW1lID0gcGFja2FnZU5hbWUuc3BsaXQoJy8nKS5tYXAoZW5jb2RlVVJJQ29tcG9uZW50KS5qb2luKCcvJyk7XG4gICAgLy8gQSBiYWRnZSBpcyBkZWNvcmF0aW9uOiBhIHN0YWxsZWQgcmVnaXN0cnkgY29ubmVjdGlvbiBtdXN0IG5vdCBob2xkIHRoZSB3aG9sZSBydW4gZm9yIGhvd2V2ZXJcbiAgICAvLyBsb25nIHRoZSBuZXR3b3JraW5nIHN0YWNrIHdvdWxkIHdhaXQuIFRoZSBidWRnZXQgaXMgZ2VuZXJvdXMgYmVjYXVzZSBhIHRpbWVvdXQgYW5zd2Vyc1xuICAgIC8vIFwidW5rbm93blwiLCB3aGljaCBrZWVwcyB0aGUgYmFkZ2Ug4oCUIGFuZCBvbiBhIHJlcG9zaXRvcnkgdGhhdCBpcyBub3Qgb24gbnBtIHRoYXQgbWVhbnMgd3JpdGluZ1xuICAgIC8vIG9uZSBpdCBzaG91bGQgbm90IGhhdmU7IGEgd2JmeSBydW4gYWxyZWFkeSBzcGVuZHMgbWludXRlcyBvbiBpbnN0YWxscywgc28gd2FpdGluZyBhIGxpdHRsZVxuICAgIC8vIGxvbmdlciBmb3IgYSByZWFsIGFuc3dlciBjb3N0cyBsZXNzIHRoYW4gYWN0aW5nIG9uIGEgbWlzc2luZyBvbmUuXG4gICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaChgaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvJHtlbmNvZGVkTmFtZX1gLCB7XG4gICAgICBtZXRob2Q6ICdIRUFEJyxcbiAgICAgIHNpZ25hbDogQWJvcnRTaWduYWwudGltZW91dCgxMF8wMDApLFxuICAgIH0pO1xuICAgIHJldHVybiByZXNwb25zZS5zdGF0dXMgPT09IDQwNDtcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG59XG5cbmZ1bmN0aW9uIGJ1aWxkTnBtQmFkZ2UocGFja2FnZU5hbWU6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiBgWyFbbnBtIHZlcnNpb25dKGh0dHBzOi8vaW1nLnNoaWVsZHMuaW8vbnBtL3YvJHtwYWNrYWdlTmFtZX0uc3ZnKV0oJHtucG1QYWNrYWdlVXJsUHJlZml4fSR7cGFja2FnZU5hbWV9KWA7XG59XG5cbmZ1bmN0aW9uIGJ1aWxkTGljZW5zZUJhZGdlKHBhY2thZ2VOYW1lOiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gYFshW2xpY2Vuc2VdKGh0dHBzOi8vaW1nLnNoaWVsZHMuaW8vbnBtL2wvJHtwYWNrYWdlTmFtZX0uc3ZnKV0oJHtucG1QYWNrYWdlVXJsUHJlZml4fSR7cGFja2FnZU5hbWV9KWA7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGJ1aWxkV29ya2Zsb3dCYWRnZXMoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTxzdHJpbmdbXT4ge1xuICBjb25zdCByZXBvc2l0b3J5ID0gY29uZmlnLnJlcG9zaXRvcnk/LnNsaWNlKGNvbmZpZy5yZXBvc2l0b3J5LmluZGV4T2YoJzonKSArIDEpO1xuICBjb25zdCB3b3JrZmxvd3NQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnLmdpdGh1YicsICd3b3JrZmxvd3MnKTtcbiAgaWYgKCFyZXBvc2l0b3J5IHx8ICFmcy5leGlzdHNTeW5jKHdvcmtmbG93c1BhdGgpKSByZXR1cm4gW107XG5cbiAgLy8gV29ya2Zsb3cgYW5kIFJFQURNRSBnZW5lcmF0aW9uIHJ1biBjb25jdXJyZW50bHkuIERvIG5vdCByZXRhaW4gYSBzdGFsZSBSdXN0IGJhZGdlIHdoaWxlIHRoZVxuICAvLyB3b3JrZmxvdyBnZW5lcmF0b3IgcmVtb3ZlcyBhIGNhbGxlciBjcmVhdGVkIGZyb20gYSBmb3JtZXJseSBtaXNkZXRlY3RlZCBsb2NhbCBjYWNoZSDigJQgYnV0XG4gIC8vIG1pcnJvciBpdHMgb3duZXJzaGlwIGNoZWNrOiBhIGN1c3RvbSBzYW1lLW5hbWVkIHdvcmtmbG93IHN1cnZpdmVzLCBzbyBpdHMgYmFkZ2UgbXVzdCB0b28uXG4gIC8vIERlY2lkZWQgc3luY2hyb25vdXNseSBiZWZvcmUgdGhlIGxvb3AncyBmaXJzdCBhd2FpdDogdGhlIGdlbmVyYXRvcidzIGRlbGV0ZSBjYW4gb25seSBsYW5kIGF0XG4gIC8vIGFuIGF3YWl0IHBvaW50LCBhbmQgYSBwb3N0LWRlbGV0ZSByZWFkIHdvdWxkIG1pc3JlcG9ydCB0aGUgd2JmeS1vd25lZCBjYWxsZXIgYXMgY3VzdG9tLlxuICAvLyBObyBleGlzdHNTeW5jIHByZS1jaGVjazogdGhlIGhlbHBlciBhbHJlYWR5IHRyZWF0cyBhIG1pc3NpbmcgZmlsZSBhcyBub3Qgb3duZWQsIGFuZCB0aGlzIHJ1bnNcbiAgLy8gb25jZSBwZXIgcmVwb3NpdG9yeSwgc28gdGhlIGV4Y2VwdGlvbmFsIEVOT0VOVCByZWFkIGNvc3RzIG5vdGhpbmcgd29ydGggYSByZWR1bmRhbnQgc3RhdC5cbiAgY29uc3QgZHJvcHNUZXN0UnVzdEJhZGdlID1cbiAgICBjb25maWcuY2FyZ29Ub21sRGlyUGF0aHMubGVuZ3RoID09PSAwICYmIGpvYnNBbGxDYWxsUmV1c2FibGVXb3JrZmxvdyh3b3JrZmxvd3NQYXRoLCAndGVzdC1ydXN0LnltbCcsICd0ZXN0LXJ1c3QnKTtcblxuICBjb25zdCBiYWRnZXM6IHN0cmluZ1tdID0gW107XG4gIGZvciAoY29uc3QgZmlsZU5hbWUgb2YgZnMucmVhZGRpclN5bmMod29ya2Zsb3dzUGF0aCkpIHtcbiAgICBpZiAoIWZpbGVOYW1lLnN0YXJ0c1dpdGgoJ3Rlc3QnKSAmJiAhZmlsZU5hbWUuc3RhcnRzV2l0aCgnZGVwbG95JykpIGNvbnRpbnVlO1xuICAgIGlmIChmaWxlTmFtZSA9PT0gJ3Rlc3QtcnVzdC55bWwnICYmIGRyb3BzVGVzdFJ1c3RCYWRnZSkgY29udGludWU7XG4gICAgLy8gR2l0SHViJ3MgYmFkZ2UgZW5kcG9pbnQgcmV0dXJucyA0MDQgdW50aWwgdGhlIHdvcmtmbG93IGhhcyBhdCBsZWFzdCBvbmUgcnVuLCBzbyBhIGJhZGdlIGZvciBhXG4gICAgLy8gZGlzcGF0Y2gtb25seSBkZXBsb3kgd29ya2Zsb3cgdGhhdCBoYXMgbmV2ZXIgcnVuIHJlbmRlcnMgYXMgYSBicm9rZW4gaW1hZ2UuIFRlc3Qgd29ya2Zsb3dzIHJ1blxuICAgIC8vIG9uIGV2ZXJ5IFBSLCBzbyBvbmx5IGRlcGxveSBiYWRnZXMgbmVlZCB0aGUgZ3VhcmQuXG4gICAgaWYgKGZpbGVOYW1lLnN0YXJ0c1dpdGgoJ2RlcGxveScpICYmICEoYXdhaXQgaGFzQW55V29ya2Zsb3dSdW4ocmVwb3NpdG9yeSwgZmlsZU5hbWUsIGNvbmZpZy5pc1B1YmxpY1JlcG8pKSkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGNvbnN0IGJhZGdlTmFtZSA9IChmaWxlTmFtZVswXSA/PyAnJykudG9VcHBlckNhc2UoKSArIGZpbGVOYW1lLnNsaWNlKDEsIGZpbGVOYW1lLmluZGV4T2YoJy4nKSkucmVwbGFjZSgnLScsICcgJyk7XG4gICAgY29uc3Qgd29ya2Zsb3dVcmwgPSBgaHR0cHM6Ly9naXRodWIuY29tLyR7cmVwb3NpdG9yeX0vYWN0aW9ucy93b3JrZmxvd3MvJHtlbmNvZGVVcmxQYXRoKGZpbGVOYW1lKX1gO1xuICAgIGJhZGdlcy5wdXNoKGBbIVske2JhZGdlTmFtZX1dKCR7d29ya2Zsb3dVcmx9L2JhZGdlLnN2ZyldKCR7d29ya2Zsb3dVcmx9KWApO1xuICB9XG4gIHJldHVybiBiYWRnZXM7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGhhc0FueVdvcmtmbG93UnVuKFxuICByZXBvc2l0b3J5OiBzdHJpbmcsXG4gIHdvcmtmbG93RmlsZU5hbWU6IHN0cmluZyxcbiAgaXNQdWJsaWNSZXBvOiBib29sZWFuXG4pOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgY29uc3QgW293bmVyLCByZXBvXSA9IHJlcG9zaXRvcnkuc3BsaXQoJy8nKTtcbiAgaWYgKCFvd25lciB8fCAhcmVwbykgcmV0dXJuIHRydWU7XG4gIHRyeSB7XG4gICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBnZXRPY3Rva2l0KG93bmVyKS5yZXF1ZXN0KCdHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2FjdGlvbnMvd29ya2Zsb3dzL3t3b3JrZmxvd19pZH0vcnVucycsIHtcbiAgICAgIG93bmVyLFxuICAgICAgcmVwbyxcbiAgICAgIHdvcmtmbG93X2lkOiB3b3JrZmxvd0ZpbGVOYW1lLFxuICAgICAgcGVyX3BhZ2U6IDEsXG4gICAgfSk7XG4gICAgcmV0dXJuIHJlc3BvbnNlLmRhdGEudG90YWxfY291bnQgPiAwO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIC8vIEZvciBhIFBVQkxJQyByZXBvc2l0b3J5IHRoZSBydW5zIGVuZHBvaW50IG5lZWRzIG5vIGF1dGhvcml6YXRpb24sIHNvIDQwNCByZWxpYWJseSBtZWFucyB0aGVcbiAgICAvLyB3b3JrZmxvdyBpcyBhYnNlbnQgZnJvbSB0aGUgcmVtb3RlIChlLmcuIGFkZGVkIGxvY2FsbHksIG5ldmVyIHB1c2hlZCkg4oCUIGxpa2UgemVybyBydW5zLCBpdHNcbiAgICAvLyBiYWRnZSB3b3VsZCByZW5kZXIgYnJva2VuLiBGb3IgYSBQUklWQVRFIHJlcG9zaXRvcnkgR2l0SHViIGFsc28gYW5zd2VycyA0MDQgd2hlbiB0aGUgdG9rZW5cbiAgICAvLyBpcyBtaXNzaW5nIG9yIHVuZGVyLXNjb3BlZCwgc28gNDA0IGlzIGFtYmlndW91cyB0aGVyZSBhbmQgdGhlIGJhZGdlIGlzIGtlcHQuXG4gICAgaWYgKChlcnJvciBhcyB7IHN0YXR1cz86IG51bWJlciB9KS5zdGF0dXMgPT09IDQwNCAmJiBpc1B1YmxpY1JlcG8pIHJldHVybiBmYWxzZTtcbiAgICAvLyBLZWVwIHRoZSBwcmUtZ3VhcmQgYmVoYXZpb3IgKGluc2VydCB0aGUgYmFkZ2UpIHdoZW4gdGhlIGNoZWNrIGl0c2VsZiBjYW5ub3QgcnVuLlxuICAgIHJldHVybiB0cnVlO1xuICB9XG59XG5cbi8qKlxuICogUmVwbGFjZXMgdGhlIGJhZGdlIGJsb2NrcyBkaXJlY3RseSB1bmRlciB0aGUgdGl0bGUgd2l0aCBgbWFuYWdlZEJhZGdlc2AsIGtlZXBpbmcgYW55IGJhZGdlIHRoZXJlXG4gKiB0aGF0IHdiZnkgZG9lcyBub3QgbWFuYWdlLCBhbmQgcmVhc3NlbWJsZXMgdGhlIFJFQURNRSBhcm91bmQgdGhlbSB3aXRoIGV4YWN0bHkgb25lIGJsYW5rIGxpbmUgb25cbiAqIGVhY2ggc2lkZS5cbiAqXG4gKiBCb3RoIHRoZSB0aXRsZSBhbmQgdGhlIGJsb2NrIGFyZSBsb2NhdGVkIGluIGEgQ29tbW9uTWFyayBzeW50YXggdHJlZSByYXRoZXIgdGhhbiBieSBzY2FubmluZ1xuICogbGluZXM6IG9ubHkgYSByZWFsIHBhcnNlciBrbm93cyB3aGV0aGVyIGEgbGluZSB0aGF0IGxvb2tzIGxpa2UgYSBiYWRnZSBpcyBhIGJhZGdlIChhIHBhcmFncmFwaCBvZlxuICogbGlua2VkIGltYWdlcykgb3IgY29udGVudCB0aGF0IG1lcmVseSByZWFkcyBsaWtlIG9uZSAoYW4gaW5kZW50ZWQgY29kZSBibG9jaywgYSBibG9jayBxdW90ZSwgYVxuICogZmVuY2VkIGV4YW1wbGUsIGEgbXVsdGlsaW5lIGNvZGUgc3BhbiwgYW4gSFRNTCBibG9jaykuIEV2ZXJ5dGhpbmcgb3V0c2lkZSB0aGUgYmxvY2sgaXMgY29waWVkIGJhY2tcbiAqIHZlcmJhdGltIGZyb20gdGhlIG9yaWdpbmFsIHRleHQgdGhyb3VnaCB0aGUgcGFyc2VyJ3MgcG9zaXRpb25hbCBvZmZzZXRzLCBzbyBubyByZWZvcm1hdHRpbmcgb2YgdGhlXG4gKiB1c2VyJ3MgY29udGVudCBpcyBwb3NzaWJsZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHdyaXRlQmFkZ2VCbG9jayhyZWFkbWU6IHN0cmluZywgbWFuYWdlZEJhZGdlczogc3RyaW5nW10pOiBzdHJpbmcge1xuICBjb25zdCBsaW5lRW5kaW5nID0gZ2V0TGluZUVuZGluZyhyZWFkbWUpO1xuICAvLyBBIEJPTSBpcyBub3QgTWFya2Rvd246IGxlZnQgaW4gdGhlIHRleHQgaXQgaGlkZXMgdGhlIGAjYCBvZiB0aGUgdGl0bGUgZnJvbSB0aGUgcGFyc2VyLCBhbmRcbiAgLy8gcHJlcGVuZGluZyB0aGUgYmxvY2sgYWhlYWQgb2YgaXQgd291bGQgc3RyaXAgdGhlIG1hcmtlciBmcm9tIHRoZSBmaWxlJ3MgZmlyc3QgYnl0ZS5cbiAgY29uc3QgYnl0ZU9yZGVyTWFyayA9IHJlYWRtZS5zdGFydHNXaXRoKCfvu78nKSA/ICfvu78nIDogJyc7XG4gIC8vIEZyb250IG1hdHRlciBpcyBkZWxpbWl0ZWQgYnkgdGhlIHNhbWUgYC0tLWAgYSBTZXRleHQgaGVhZGluZyBhbmQgYSB0aGVtYXRpYyBicmVhayB1c2UsIHNvIGl0IGlzXG4gIC8vIGRldGFjaGVkIGJlZm9yZSBwYXJzaW5nIGluc3RlYWQgb2YgYmVpbmcgdG9sZCBhcGFydCBhZnRlcndhcmRzOyBpdCBhbHNvIGhhcyB0byBzdGF5IGZpcnN0IGluIHRoZVxuICAvLyBmaWxlLCB3aGljaCBtYWtlcyBpdCBhIHByZWZpeCBpbiBleGFjdGx5IHRoZSBzYW1lIHdheSB0aGUgQk9NIGlzLlxuICBjb25zdCB3aXRob3V0TWFyayA9IHJlYWRtZS5zbGljZShieXRlT3JkZXJNYXJrLmxlbmd0aCk7XG4gIGNvbnN0IGZyb250TWF0dGVyID0gd2l0aG91dE1hcmsuc3RhcnRzV2l0aCgnLS0tJylcbiAgICA/ICgvXi0tLVsgXFx0XSpcXHI/XFxuW1xcc1xcU10qP14tLS1bIFxcdF0qKD86XFxyP1xcbnwkKS9tdS5leGVjKHdpdGhvdXRNYXJrKT8uWzBdID8/ICcnKVxuICAgIDogJyc7XG4gIGNvbnN0IHByZWZpeCA9IGAke2J5dGVPcmRlck1hcmt9JHtmcm9udE1hdHRlcn1gO1xuICAvLyBUaGUgZmluYWwgbmV3bGluZSBpcyBzZXQgYXNpZGUgcmF0aGVyIHRoYW4gcGFyc2VkIGFzIHRyYWlsaW5nIGJsYW5rIHNwYWNlLCB3aGljaCB0aGUgYmxhbmstbGluZVxuICAvLyB0cmltbWluZyBiZWxvdyB3b3VsZCBvdGhlcndpc2Ugc3dhbGxvdy5cbiAgY29uc3QgZW5kc1dpdGhOZXdsaW5lID0gL1xccj9cXG4kL3UudGVzdChyZWFkbWUpO1xuICBjb25zdCBjb250ZW50ID0gd2l0aG91dE1hcmsuc2xpY2UoZnJvbnRNYXR0ZXIubGVuZ3RoKS5yZXBsYWNlKC9cXHI/XFxuJC91LCAnJyk7XG5cbiAgY29uc3Qgbm9kZXMgPSBmcm9tTWFya2Rvd24oY29udGVudCkuY2hpbGRyZW47XG4gIC8vIEEgbGVhZGluZyBiYWRnZSBibG9jayBpcyB0aGUgdXNlcidzIG93biBsYXlvdXQ6IGl0IHN0YXlzIGFib3ZlIHRoZSB0aXRsZSwgYW5kIHdiZnkncyBibG9jayBnb2VzIGJlbG93LlxuICBjb25zdCBrZWVwc0xlYWRpbmdCbG9jayA9ICEhbm9kZXNbMF0gJiYgaXNCYWRnZUJsb2NrTm9kZShub2Rlc1swXSkgJiYgaXNUaXRsZU5vZGUobm9kZXNbMV0pO1xuICBjb25zdCB0aXRsZUluZGV4ID0ga2VlcHNMZWFkaW5nQmxvY2sgPyAxIDogaXNUaXRsZU5vZGUobm9kZXNbMF0pID8gMCA6IC0xO1xuICAvLyBXaXRob3V0IGEgcmVjb2duaXphYmxlIHRpdGxlIHRoZSBibG9jayBzaXRzIGF0IHRoZSB2ZXJ5IHRvcCwgYWJvdmUgZXZlcnl0aGluZy5cbiAgY29uc3QgaGVhZFN0YXJ0Tm9kZSA9IGtlZXBzTGVhZGluZ0Jsb2NrID8gbm9kZXNbMF0hIDogbm9kZXNbdGl0bGVJbmRleF07XG4gIGNvbnN0IGhlYWQgPVxuICAgIHRpdGxlSW5kZXggPT09IC0xXG4gICAgICA/ICcnXG4gICAgICA6IGNvbnRlbnQuc2xpY2Uoc3RhcnRPZmZzZXRXaXRoSW5kZW50KGNvbnRlbnQsIGhlYWRTdGFydE5vZGUhKSwgbm9kZXNbdGl0bGVJbmRleF0hLnBvc2l0aW9uIS5lbmQub2Zmc2V0KTtcblxuICBjb25zdCBiYWRnZUJsb2NrTm9kZXM6IFBhcmFncmFwaFtdID0gW107XG4gIGZvciAobGV0IG5vZGVJbmRleCA9IHRpdGxlSW5kZXggKyAxOyA7IG5vZGVJbmRleCsrKSB7XG4gICAgY29uc3Qgbm9kZSA9IG5vZGVzW25vZGVJbmRleF07XG4gICAgaWYgKCFpc0JhZGdlQmxvY2tOb2RlKG5vZGUpKSBicmVhaztcbiAgICBiYWRnZUJsb2NrTm9kZXMucHVzaChub2RlKTtcbiAgICAvLyBXaXRob3V0IGEgdGl0bGUsIG1lcmdpbmcgbGVhZGluZyBibG9ja3MgY291bGQgY2hhbmdlIHdoaWNoIG5vZGUgaXMgcmVjb2duaXplZCBhcyB0aGUgdGl0bGUgb24gdGhlIG5leHQgcnVuLlxuICAgIGlmICh0aXRsZUluZGV4ID09PSAtMSkgYnJlYWs7XG4gIH1cbiAgY29uc3QgZXhpc3RpbmcgPSBiYWRnZUJsb2NrTm9kZXMuZmxhdE1hcCgobm9kZSkgPT4gcmVhZEJhZGdlcyhub2RlLCBjb250ZW50KSk7XG4gIGNvbnN0IGJvZHlOb2RlID0gbm9kZXNbdGl0bGVJbmRleCArIDEgKyBiYWRnZUJsb2NrTm9kZXMubGVuZ3RoXTtcbiAgY29uc3QgYm9keSA9IGJvZHlOb2RlID8gY29udGVudC5zbGljZShzdGFydE9mZnNldFdpdGhJbmRlbnQoY29udGVudCwgYm9keU5vZGUpKSA6ICcnO1xuXG4gIC8vIFN1cGVyc2VkaW5nIGEgbWFuYWdlZCBiYWRnZSBpcyBqdXN0IGRyb3BwaW5nIHRoZSBvbGQgb25lOiBhIHZlcnNpb24sIHdvcmtmbG93LCBucG0sIG9yIGxpY2Vuc2VcbiAgLy8gY2hhbmdlIGxlYXZlcyBubyBzdGFsZSBjb3B5LCB3aGlsZSBhbnkgb3RoZXIgYmFkZ2UgaW4gdGhlIG1hbmFnZWQgcmVnaW9uIGlzIGtlcHQuXG4gIGNvbnN0IGJhZGdlcyA9IFsuLi5tYW5hZ2VkQmFkZ2VzLCAuLi5leGlzdGluZy5maWx0ZXIoKGJhZGdlKSA9PiAhaXNNYW5hZ2VkQmFkZ2UoYmFkZ2UpKV07XG4gIC8vIENvbnRlbnQgaXMgc2xpY2VkIGZyb20gaXRzIG5vZGUncyBzdGFydCBvZmZzZXQsIHNvIHdoYXRldmVyIGJsYW5rIHNwYWNlIGZvbGxvd2VkIHRoZSBmcm9udFxuICAvLyBtYXR0ZXIgaXMgZ29uZTsgZXhhY3RseSBvbmUgYmxhbmsgbGluZSBpcyByZXN0b3JlZCBoZXJlLiBBIGNsb3NpbmcgZGVsaW1pdGVyIHRoYXQgZW5kZWQgYXQgRU9GXG4gIC8vIGNhcnJpZXMgbm8gbmV3bGluZSBvZiBpdHMgb3duIGFuZCBuZWVkcyBib3RoLCBvciBgLS0tYCB3b3VsZCBmdXNlIHdpdGggdGhlIGZpcnN0IGJhZGdlIGFuZFxuICAvLyBkZXN0cm95IHRoZW0gYm90aC4gQSBCT00gbmVlZHMgbm8gc2VwYXJhdG9yOiBpdCBpcyBhIGJ5dGUgbWFya2VyLCBub3QgYSBsaW5lLlxuICBjb25zdCBzZXBhcmF0b3IgPSBmcm9udE1hdHRlciA/ICgvXFxyP1xcbiQvdS50ZXN0KGZyb250TWF0dGVyKSA/IGxpbmVFbmRpbmcgOiBgJHtsaW5lRW5kaW5nfSR7bGluZUVuZGluZ31gKSA6ICcnO1xuICBjb25zdCByZXN1bHQgPVxuICAgIHByZWZpeCArIHNlcGFyYXRvciArIFtoZWFkLCBiYWRnZXMuam9pbihsaW5lRW5kaW5nKSwgYm9keV0uZmlsdGVyKEJvb2xlYW4pLmpvaW4oYCR7bGluZUVuZGluZ30ke2xpbmVFbmRpbmd9YCk7XG4gIHJldHVybiBlbmRzV2l0aE5ld2xpbmUgPyBgJHtyZXN1bHR9JHtsaW5lRW5kaW5nfWAgOiByZXN1bHQ7XG59XG5cbi8qKlxuICogQSBub2RlJ3Mgc3RhcnQgb2Zmc2V0LCBleHRlbmRlZCBiYWNrIG92ZXIgdGhlIGxlYWRpbmcgd2hpdGVzcGFjZSBvbiBpdHMgb3duIGxpbmUuIENvbW1vbk1hcmtcbiAqIGFsbG93cyBvbmUgdG8gdGhyZWUgc3BhY2VzIG9mIGluZGVudGF0aW9uIGJlZm9yZSBhIGJsb2NrLCBhbmQgbWRhc3QgcmVwb3J0cyB0aGUgb2Zmc2V0IEFGVEVSXG4gKiB0aGVtIOKAlCBzbyBzbGljaW5nIGZyb20gaXQgc2lsZW50bHkgcmVpbmRlbnRzIGNvbnRlbnQgdGhpcyBnZW5lcmF0b3IgcHJvbWlzZXMgdG8gY29weSB2ZXJiYXRpbS5cbiAqL1xuZnVuY3Rpb24gc3RhcnRPZmZzZXRXaXRoSW5kZW50KGNvbnRlbnQ6IHN0cmluZywgbm9kZTogUm9vdENvbnRlbnQpOiBudW1iZXIge1xuICBjb25zdCBzdGFydCA9IG5vZGUucG9zaXRpb24hLnN0YXJ0Lm9mZnNldCE7XG4gIGNvbnN0IGxpbmVTdGFydCA9IGNvbnRlbnQubGFzdEluZGV4T2YoJ1xcbicsIHN0YXJ0IC0gMSkgKyAxO1xuICByZXR1cm4gL15bIFxcdF0qJC91LnRlc3QoY29udGVudC5zbGljZShsaW5lU3RhcnQsIHN0YXJ0KSkgPyBsaW5lU3RhcnQgOiBzdGFydDtcbn1cblxuLyoqXG4gKiBXaGV0aGVyIHRoZSBub2RlIG9wZW5zIHRoZSBSRUFETUUgd2l0aCBhIHRpdGxlLiBPbmx5IHRoZSBGSVJTVCBwaWVjZSBvZiBjb250ZW50IGNhbiBiZSBvbmU6IGFcbiAqIHRpdGxlIGlzIHdoYXQgYSBSRUFETUUgb3BlbnMgd2l0aCwgYW5kIGFuY2hvcmluZyB0aGUgYmFkZ2VzIHRvIGEgaGVhZGluZyBmdXJ0aGVyIGRvd24gd291bGQgYnVyeVxuICogdGhlbSBiZWxvdyBjb250ZW50IHRoZSBhdXRob3IgcHV0IGZpcnN0LlxuICovXG5mdW5jdGlvbiBpc1RpdGxlTm9kZShub2RlOiBSb290Q29udGVudCB8IHVuZGVmaW5lZCk6IGJvb2xlYW4ge1xuICBpZiAoIW5vZGUpIHJldHVybiBmYWxzZTtcbiAgaWYgKG5vZGUudHlwZSA9PT0gJ2hlYWRpbmcnKSByZXR1cm4gdHJ1ZTtcbiAgLy8gTWFueSBSRUFETUVzIGNlbnRlciB0aGVpciB0aXRsZSBpbiBIVE1MIChgPGgxPmAsIG9yIGEgYDxkaXY+YC9gPHA+YCB3cmFwcGluZyBvbmUpLCB3aGljaCB0aGVcbiAgLy8gcGFyc2VyIHJlcG9ydHMgYXMgb25lIG9wYXF1ZSBIVE1MIGJsb2NrOyB0aGUgYmFkZ2VzIGdvIGFmdGVyIHRoZSB3aG9sZSBibG9jay5cbiAgcmV0dXJuIG5vZGUudHlwZSA9PT0gJ2h0bWwnICYmIGNvbnRhaW5zUmVuZGVyZWRIMShub2RlLnZhbHVlKTtcbn1cblxuLyoqXG4gKiBXaGV0aGVyIHRoZSBIVE1MIGJsb2NrIHVuYW1iaWd1b3VzbHkgUkVOREVSUyBhbiBgPGgxPmAg4oCUIHRoZSBjZW50ZXJlZC10aXRsZSBsYXlvdXQgbWFueSBSRUFETUVzXG4gKiB1c2UgKGA8aDE+YCwgb3IgYSBgPGRpdj5gL2A8cD5gIHdyYXBwaW5nIG9uZSkuXG4gKlxuICogRGVsaWJlcmF0ZWx5IE5PVCBhIGdlbmVyYWwgSFRNTCBwYXJzZXIuIERlY2lkaW5nIHRoaXMgZXhhY3RseSByZXF1aXJlcyB0aGUgcmVhbCB0b2tlbml6ZXInc1xuICogc3RhdGVzIOKAlCByYXcgdGV4dCwgUkNEQVRBLCBzY3JpcHQgZGF0YSwgYXR0cmlidXRlIHZhbHVlcywgdGVtcGxhdGUgY29udGVudHMsIGRlY2xhcmF0aW9ucyDigJQgYW5kXG4gKiBhcHByb3hpbWF0aW5nIHRoZW0gd2l0aCByZWdleGVzIGlzIHRoZSBzYW1lIGxvc2luZyBnYW1lIHRoZSBNYXJrZG93biBzY2FubmluZyB0aGlzIG1vZHVsZVxuICogcmVwbGFjZWQgd2FzIHBsYXlpbmcuIFNvIHRoZSBydWxlIGlzOiB0b2tlbml6ZSBvbmx5IHRoZSBzaW1wbGUgY2FzZSwgYW5kIHRyZWF0IGFueXRoaW5nIGNhcnJ5aW5nXG4gKiBhIGNvbnN0cnVjdCB3aG9zZSBwYXJzaW5nIGRlcGVuZHMgb24gdGhvc2Ugc3RhdGVzIGFzIE5PVCBhIHRpdGxlLiBCZWluZyB3cm9uZyB0aGF0IHdheSBwdXRzIHRoZVxuICogYmFkZ2VzIGF0IHRoZSB0b3Agb2YgdGhlIGZpbGUsIHdoaWNoIGlzIG1lcmVseSB1bmhlbHBmdWw7IGJlaW5nIHdyb25nIHRoZSBvdGhlciB3YXkgcmV3cml0ZXMgdGhlXG4gKiB1c2VyJ3MgUkVBRE1FIGFyb3VuZCB0aGUgd3JvbmcgYW5jaG9yLlxuICovXG5mdW5jdGlvbiBjb250YWluc1JlbmRlcmVkSDEoaHRtbDogc3RyaW5nKTogYm9vbGVhbiB7XG4gIC8vIENvbW1lbnRzIGNhbm5vdCBuZXN0IGFuZCBlbmQgdW5hbWJpZ3VvdXNseSwgc28gdGhleSBhcmUgc2ltcGx5IHJlbW92ZWQgcmF0aGVyIHRoYW4gZGlzcXVhbGlmeWluZy5cbiAgY29uc3Qgd2l0aG91dENvbW1lbnRzID0gaHRtbC5yZXBsYWNlQWxsKC88IS0tW1xcc1xcU10qPyg/Oi0tPnwkKS9ndSwgJycpO1xuICAvLyBDREFUQSwgcHJvY2Vzc2luZyBpbnN0cnVjdGlvbnMsIGRlY2xhcmF0aW9ucywgZWxlbWVudHMgd2hvc2UgY29udGVudCBpcyByYXcgdGV4dCAvIFJDREFUQSAvXG4gIC8vIHNjcmlwdCBkYXRhLCBhbmQgYDx0ZW1wbGF0ZT5gICh3aG9zZSBjb250ZW50cyBhcmUgaW5lcnQpLiBBIHF1b3RlZCBhdHRyaWJ1dGUgY29udGFpbmluZyBgPGBcbiAgLy8gbWFrZXMgZXZlbiBsb2NhdGluZyB0aGVzZSB1bnJlbGlhYmxlLCBzbyBpdCBkaXNxdWFsaWZpZXMgdGhlIGJsb2NrIHRvby5cbiAgY29uc3QgYW1iaWd1b3VzQ29uc3RydWN0UGF0dGVybiA9XG4gICAgLzwhXFxbQ0RBVEFcXFt8PFxcP3w8IVthLXpBLVpdfDxcXC8/KD86c2NyaXB0fHN0eWxlfHRleHRhcmVhfHRpdGxlfGlmcmFtZXxub2ZyYW1lc3xub2VtYmVkfHhtcHx0ZW1wbGF0ZSlcXGJ8XCJbXlwiXSo8W15cIl0qXCJ8J1teJ10qPFteJ10qJy9pdTtcbiAgaWYgKGFtYmlndW91c0NvbnN0cnVjdFBhdHRlcm4udGVzdCh3aXRob3V0Q29tbWVudHMpKSByZXR1cm4gZmFsc2U7XG4gIC8vIFF1b3RpbmcgaXMgc2lnbmlmaWNhbnQgb25seSBpbnNpZGUgYSBzdGFydCB0YWcsIHNvIGFuIGF0dHJpYnV0ZSB2YWx1ZSBpcyBjb25zdW1lZCB3aXRoIGl0cyBvd25cbiAgLy8gdGFnIHdoaWxlIHF1b3RhdGlvbiBtYXJrcyBpbiBvcmRpbmFyeSB0ZXh0IHN0YXkgdGV4dDogYDxkaXYgdGl0bGU9XCImbHQ7aDEmZ3Q7XCI+YCBkb2VzIG5vdCBjb3VudCxcbiAgLy8gYFwiPGgxPlByb2plY3Q8L2gxPlwiYCBkb2VzLlxuICBjb25zdCBzdGFydFRhZ1BhdHRlcm4gPSAvPChbYS16QS1aXVteXFxzLz5dKikoPzpcIlteXCJdKlwifCdbXiddKid8W14+XCInXSkqPi9ndTtcbiAgZm9yIChjb25zdCBtYXRjaCBvZiB3aXRob3V0Q29tbWVudHMubWF0Y2hBbGwoc3RhcnRUYWdQYXR0ZXJuKSkge1xuICAgIGlmIChtYXRjaFsxXT8udG9Mb3dlckNhc2UoKSA9PT0gJ2gxJykgcmV0dXJuIHRydWU7XG4gIH1cbiAgcmV0dXJuIGZhbHNlO1xufVxuXG4vKiogV2hldGhlciB0aGUgbm9kZSBpcyBhIHBhcmFncmFwaCBvZiBiYWRnZXMgYW5kIG5vdGhpbmcgZWxzZSDigJQgdGhlIG9ubHkgY29udGVudCB3YmZ5IHB1dHMgaW4gdGhlIGJsb2NrLiAqL1xuZnVuY3Rpb24gaXNCYWRnZUJsb2NrTm9kZShub2RlOiBSb290Q29udGVudCB8IHVuZGVmaW5lZCk6IG5vZGUgaXMgUGFyYWdyYXBoIHtcbiAgcmV0dXJuIChcbiAgICAhIW5vZGUgJiZcbiAgICBub2RlLnR5cGUgPT09ICdwYXJhZ3JhcGgnICYmXG4gICAgbm9kZS5jaGlsZHJlbi5zb21lKChjaGlsZCkgPT4gaXNCYWRnZU5vZGUoY2hpbGQpKSAmJlxuICAgIG5vZGUuY2hpbGRyZW4uZXZlcnkoXG4gICAgICAoY2hpbGQpID0+IGlzQmFkZ2VOb2RlKGNoaWxkKSB8fCBjaGlsZC50eXBlID09PSAnYnJlYWsnIHx8IChjaGlsZC50eXBlID09PSAndGV4dCcgJiYgIWNoaWxkLnZhbHVlLnRyaW0oKSlcbiAgICApXG4gICk7XG59XG5cbi8qKiBBIGJhZGdlIGlzIG9uZSBgWyFbYWx0XShpbWFnZSldKGxpbmspYCwgdGhlIG9ubHkgc2hhcGUgd2JmeSBldmVyIHdyaXRlcy4gKi9cbmZ1bmN0aW9uIGlzQmFkZ2VOb2RlKG5vZGU6IFJvb3RDb250ZW50IHwgUGhyYXNpbmdDb250ZW50KTogbm9kZSBpcyBMaW5rICYgeyBjaGlsZHJlbjogW0ltYWdlXSB9IHtcbiAgcmV0dXJuIG5vZGUudHlwZSA9PT0gJ2xpbmsnICYmIG5vZGUuY2hpbGRyZW4ubGVuZ3RoID09PSAxICYmIG5vZGUuY2hpbGRyZW5bMF0/LnR5cGUgPT09ICdpbWFnZSc7XG59XG5cbi8qKlxuICogVGhlIGJhZGdlcyBpbiB0aGUgYmxvY2ssIGFzIHRoZSBleGFjdCBzb3VyY2UgdGV4dCB0aGF0IHByb2R1Y2VkIHRoZW06IGEgYmFkZ2Ugd2JmeSBkb2VzIG5vdCBtYW5hZ2VcbiAqIGlzIHdyaXR0ZW4gYmFjayBieXRlIGZvciBieXRlIGluc3RlYWQgb2YgYmVpbmcgcmUtc2VyaWFsaXplZCBmcm9tIHRoZSB0cmVlLlxuICovXG5mdW5jdGlvbiByZWFkQmFkZ2VzKG5vZGU6IFBhcmFncmFwaCwgY29udGVudDogc3RyaW5nKTogc3RyaW5nW10ge1xuICByZXR1cm4gbm9kZS5jaGlsZHJlblxuICAgIC5maWx0ZXIoKGNoaWxkKSA9PiBpc0JhZGdlTm9kZShjaGlsZCkpXG4gICAgLm1hcCgoY2hpbGQpID0+IGNvbnRlbnQuc2xpY2UoY2hpbGQucG9zaXRpb24hLnN0YXJ0Lm9mZnNldCwgY2hpbGQucG9zaXRpb24hLmVuZC5vZmZzZXQpKTtcbn1cblxuLyoqXG4gKiBQZXJjZW50LWVuY29kZXMgdGhlIGNoYXJhY3RlcnMgdGhhdCB3b3VsZCBlbmQgYSBNYXJrZG93biBkZXN0aW5hdGlvbiBlYXJseS4gQSB3b3JrZmxvdyBmaWxlIG1heSBiZVxuICogbmFtZWQgYW55dGhpbmcgd2l0aCBhIGAueW1sYCBleHRlbnNpb24sIGFuZCBvbmUgY29udGFpbmluZyBgKGAgb3IgYClgIHByb2R1Y2VkIGEgYmFkZ2UgdGhhdCB3YmZ5J3NcbiAqIG93biBiYWRnZSBwYXR0ZXJuIGNvdWxkIG5vdCByZWFkIGJhY2sg4oCUIHNvIHRoZSBsaW5lIGxlZnQgdGhlIGJsb2NrIGFuZCB0aGUgYmFkZ2Ugd2FzIGR1cGxpY2F0ZWQuXG4gKi9cbmZ1bmN0aW9uIGVuY29kZVVybFBhdGgodmFsdWU6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiB2YWx1ZS5yZXBsYWNlQWxsKC9bKClcXHNdL2d1LCAoY2hhcmFjdGVyKSA9PiBgJSR7Y2hhcmFjdGVyLmNvZGVQb2ludEF0KDApIS50b1N0cmluZygxNikudG9VcHBlckNhc2UoKX1gKTtcbn1cblxuLyoqIFdoZXRoZXIgdGhlIGJhZGdlIGlzIG9uZSB3YmZ5IHdyaXRlcyBpdHNlbGYsIGFuZCBzbyBtYXkgYmUgcmVwbGFjZWQgYnkgdGhlIGN1cnJlbnQgYmxvY2suICovXG5mdW5jdGlvbiBpc01hbmFnZWRCYWRnZShiYWRnZTogc3RyaW5nKTogYm9vbGVhbiB7XG4gIHJldHVybiBiYWRnZSA9PT0gc2VtYW50aWNSZWxlYXNlQmFkZ2UgfHwgbWFuYWdlZEJhZGdlUGF0dGVybnMuc29tZSgocGF0dGVybikgPT4gcGF0dGVybi50ZXN0KGJhZGdlKSk7XG59XG5cbmZ1bmN0aW9uIGdldExpbmVFbmRpbmcoY29udGVudDogc3RyaW5nKTogJ1xcbicgfCAnXFxyXFxuJyB7XG4gIHJldHVybiBjb250ZW50LmluY2x1ZGVzKCdcXHJcXG4nKSA/ICdcXHJcXG4nIDogJ1xcbic7XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgbWVyZ2UgZnJvbSAnZGVlcG1lcmdlJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZnNVdGlsIH0gZnJvbSAnLi4vdXRpbHMvZnNVdGlsLmpzJztcbmltcG9ydCB7IG92ZXJ3cml0ZU1lcmdlIH0gZnJvbSAnLi4vdXRpbHMvbWVyZ2VVdGlsLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVSZWxlYXNlcmMocm9vdENvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2dlbmVyYXRlUmVsZWFzZXJjJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKHJvb3RDb25maWcuZGlyUGF0aCwgJy5yZWxlYXNlcmMuanNvbicpO1xuICAgIGlmICghZnMuZXhpc3RzU3luYyhmaWxlUGF0aCkpIHJldHVybjtcblxuICAgIGNvbnN0IHNldHRpbmdzID0gSlNPTi5wYXJzZShhd2FpdCBmcy5wcm9taXNlcy5yZWFkRmlsZShmaWxlUGF0aCwgJ3V0ZjgnKSkgYXMge1xuICAgICAgcGx1Z2lucz86IChzdHJpbmcgfCBbc3RyaW5nLCB1bmtub3duXSlbXTtcbiAgICAgIGV4dGVuZHM/OiB1bmtub3duO1xuICAgIH07XG4gICAgY29uc3QgcGx1Z2lucyA9IHNldHRpbmdzLnBsdWdpbnMgPz8gW107XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwbHVnaW5zLmxlbmd0aDsgaSsrKSB7XG4gICAgICBjb25zdCBwbHVnaW5FbnRyeSA9IHBsdWdpbnNbaV07XG4gICAgICBjb25zdCBpc0FycmF5ID0gQXJyYXkuaXNBcnJheShwbHVnaW5FbnRyeSk7XG4gICAgICBjb25zdCBwbHVnaW4gPSBpc0FycmF5ID8gcGx1Z2luRW50cnlbMF0gOiBwbHVnaW5FbnRyeTtcbiAgICAgIGNvbnN0IG9sZENvbmZpZyA9IChpc0FycmF5ICYmIHBsdWdpbkVudHJ5WzFdKSB8fCB7fTtcbiAgICAgIGlmIChwbHVnaW4gPT09ICdAc2VtYW50aWMtcmVsZWFzZS9jb21taXQtYW5hbHl6ZXInKSB7XG4gICAgICAgIHBsdWdpbnNbaV0gPSBbXG4gICAgICAgICAgJ0BzZW1hbnRpYy1yZWxlYXNlL2NvbW1pdC1hbmFseXplcicsXG4gICAgICAgICAgbWVyZ2UuYWxsKFxuICAgICAgICAgICAgW1xuICAgICAgICAgICAgICBvbGRDb25maWcsXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBwcmVzZXQ6ICdjb252ZW50aW9uYWxjb21taXRzJyxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICB7IGFycmF5TWVyZ2U6IG92ZXJ3cml0ZU1lcmdlIH1cbiAgICAgICAgICApLFxuICAgICAgICBdO1xuICAgICAgfSBlbHNlIGlmIChwbHVnaW4gPT09ICdAc2VtYW50aWMtcmVsZWFzZS9naXRodWInKSB7XG4gICAgICAgIHBsdWdpbnNbaV0gPSBbXG4gICAgICAgICAgJ0BzZW1hbnRpYy1yZWxlYXNlL2dpdGh1YicsXG4gICAgICAgICAgbWVyZ2UuYWxsKFxuICAgICAgICAgICAgW1xuICAgICAgICAgICAgICBvbGRDb25maWcsXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAvLyBjZi4gaHR0cHM6Ly9naXRodWIuY29tL3NlbWFudGljLXJlbGVhc2Uvc2VtYW50aWMtcmVsZWFzZS9pc3N1ZXMvMjIwNCNpc3N1ZWNvbW1lbnQtMTUwODQxNzcwNFxuICAgICAgICAgICAgICAgIHN1Y2Nlc3NDb21tZW50Q29uZGl0aW9uOiBmYWxzZSxcbiAgICAgICAgICAgICAgICBmYWlsQ29tbWVudENvbmRpdGlvbjogZmFsc2UsXG4gICAgICAgICAgICAgICAgbGFiZWxzOiBbJ3I6IHNlbWFudGljLXJlbGVhc2UnXSxcbiAgICAgICAgICAgICAgICByZWxlYXNlZExhYmVsczogWydyZWxlYXNlZCA6Ym9va21hcms6J10sXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgeyBhcnJheU1lcmdlOiBvdmVyd3JpdGVNZXJnZSB9XG4gICAgICAgICAgKSxcbiAgICAgICAgXTtcbiAgICAgIH1cbiAgICB9XG4gICAgY29uc3QgbmV3Q29udGVudCA9IEpTT04uc3RyaW5naWZ5KHNldHRpbmdzLCB1bmRlZmluZWQsIDIpO1xuICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiBmc1V0aWwuZ2VuZXJhdGVGaWxlKGZpbGVQYXRoLCBuZXdDb250ZW50KSk7XG4gIH0pO1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IG1lcmdlIGZyb20gJ2RlZXBtZXJnZSc7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGZzVXRpbCB9IGZyb20gJy4uL3V0aWxzL2ZzVXRpbC5qcyc7XG5pbXBvcnQgeyBqc29uY1V0aWwgfSBmcm9tICcuLi91dGlscy9qc29uY1V0aWwuanMnO1xuaW1wb3J0IHsgb3ZlcndyaXRlTWVyZ2UgfSBmcm9tICcuLi91dGlscy9tZXJnZVV0aWwuanMnO1xuXG5jb25zdCBzaGFyZWRQcmVzZXQgPSAnZ2l0aHViPldpbGxCb29zdGVyL3dpbGxib29zdGVyLWNvbmZpZ3M6cmVub3ZhdGUuanNvbmMnO1xuY29uc3QgZ2VuZXJhdGVkU2V0dGluZ3MgPSB7XG4gICRzY2hlbWE6ICdodHRwczovL2RvY3MucmVub3ZhdGVib3QuY29tL3Jlbm92YXRlLXNjaGVtYS5qc29uJyxcbiAgZXh0ZW5kczogW3NoYXJlZFByZXNldF0sXG59O1xuXG50eXBlIFNldHRpbmdzID0gUGFydGlhbDx0eXBlb2YgZ2VuZXJhdGVkU2V0dGluZ3M+ICYge1xuICBwYWNrYWdlUnVsZXM/OiB7IG1hdGNoUGFja2FnZU5hbWVzOiBzdHJpbmdbXTsgZW5hYmxlZD86IGJvb2xlYW4gfVtdO1xufTtcblxuY29uc3QgbWFuYWdlZEZpbGVOYW1lID0gJ3Jlbm92YXRlLmpzb25jJztcblxuLy8gd2JmeSBzdXBwb3J0cyBvbmUgY2Fub25pY2FsIFJlbm92YXRlIGxvY2F0aW9uLiBOb24tY2Fub25pY2FsIGNvbmZpZ3MgYXJlIGZpeGVkIGluIHRoZSB0YXJnZXRcbi8vIHJlcG9zaXRvcnkgaW5zdGVhZCBvZiBiZWluZyBwYXJzZWQsIG1lcmdlZCwgb3IgZGVsZXRlZCBoZXJlLlxuY29uc3Qgbm9uQ2Fub25pY2FsQ29uZmlnUGF0aHMgPSBbXG4gICdyZW5vdmF0ZS5qc29uJyxcbiAgJ3Jlbm92YXRlLmpzb241JyxcbiAgJy5naXRodWIvcmVub3ZhdGUuanNvbicsXG4gICcuZ2l0aHViL3Jlbm92YXRlLmpzb25jJyxcbiAgJy5naXRodWIvcmVub3ZhdGUuanNvbjUnLFxuICAnLnJlbm92YXRlcmMnLFxuICAnLnJlbm92YXRlcmMuanNvbicsXG4gICcucmVub3ZhdGVyYy5qc29uNScsXG5dO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVSZW5vdmF0ZUpzb25jKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2dlbmVyYXRlUmVub3ZhdGVKc29uYycsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgbWFuYWdlZEZpbGVOYW1lKTtcbiAgICBjb25zdCBtYW5hZ2VkRmlsZVN0YXRzID0gYXdhaXQgZnMucHJvbWlzZXMubHN0YXQoZmlsZVBhdGgpLmNhdGNoKCgpID0+IHt9KTtcbiAgICBpZiAobWFuYWdlZEZpbGVTdGF0cz8uaXNTeW1ib2xpY0xpbmsoKSkge1xuICAgICAgY29uc29sZS53YXJuKGBTa2lwcGVkIGdlbmVyYXRpbmcgJHtmaWxlUGF0aH0gYmVjYXVzZSBpdCBpcyBhIHN5bWJvbGljIGxpbmsuYCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3Qgbm9uQ2Fub25pY2FsQ29uZmlnQ2FuZGlkYXRlcyA9IGF3YWl0IFByb21pc2UuYWxsKFxuICAgICAgbm9uQ2Fub25pY2FsQ29uZmlnUGF0aHMubWFwKGFzeW5jIChyZWxhdGl2ZVBhdGgpID0+IHtcbiAgICAgICAgY29uc3QgY2FuZGlkYXRlID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCByZWxhdGl2ZVBhdGgpO1xuICAgICAgICByZXR1cm4gKGF3YWl0IGZzLnByb21pc2VzLmxzdGF0KGNhbmRpZGF0ZSkuY2F0Y2goKCkgPT4ge30pKSA/IGNhbmRpZGF0ZSA6IHVuZGVmaW5lZDtcbiAgICAgIH0pXG4gICAgKTtcbiAgICBjb25zdCBub25DYW5vbmljYWxDb25maWdQYXRoID0gbm9uQ2Fub25pY2FsQ29uZmlnQ2FuZGlkYXRlcy5maW5kKChjYW5kaWRhdGUpID0+IGNhbmRpZGF0ZSAhPT0gdW5kZWZpbmVkKTtcbiAgICBpZiAobm9uQ2Fub25pY2FsQ29uZmlnUGF0aCB8fCBjb25maWcucGFja2FnZUpzb24/LnJlbm92YXRlKSB7XG4gICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgIGBTa2lwcGVkIGdlbmVyYXRpbmcgJHtmaWxlUGF0aH0gYmVjYXVzZSB0aGUgcmVwb3NpdG9yeSBoYXMgYSBub24tY2Fub25pY2FsIFJlbm92YXRlIGNvbmZpZyR7XG4gICAgICAgICAgbm9uQ2Fub25pY2FsQ29uZmlnUGF0aCA/IGAgYXQgJHtub25DYW5vbmljYWxDb25maWdQYXRofWAgOiAnIGluIHBhY2thZ2UuanNvbidcbiAgICAgICAgfS5gXG4gICAgICApO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IG9sZENvbnRlbnQgPSBhd2FpdCBmc1V0aWwucmVhZEZpbGVJZkV4aXN0cyhmaWxlUGF0aCk7XG4gICAgbGV0IG9sZFNldHRpbmdzOiBTZXR0aW5ncyB8IHVuZGVmaW5lZDtcbiAgICBpZiAob2xkQ29udGVudCAhPT0gdW5kZWZpbmVkICYmICFqc29uY1V0aWwuaXNUcml2aWFPbmx5KG9sZENvbnRlbnQpKSB7XG4gICAgICBvbGRTZXR0aW5ncyA9IGpzb25jVXRpbC5wYXJzZU9iamVjdElnbm9yaW5nRXJyb3I8U2V0dGluZ3M+KG9sZENvbnRlbnQpO1xuICAgICAgaWYgKCFvbGRTZXR0aW5ncykge1xuICAgICAgICBjb25zb2xlLndhcm4oYFNraXBwZWQgZ2VuZXJhdGluZyAke2ZpbGVQYXRofSBiZWNhdXNlIHRoZSBleGlzdGluZyBjb250ZW50IGlzIG5vdCBwYXJzYWJsZSBhcyBKU09OQy5gKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChvbGRTZXR0aW5ncz8uZXh0ZW5kcyAhPT0gdW5kZWZpbmVkICYmICFBcnJheS5pc0FycmF5KG9sZFNldHRpbmdzLmV4dGVuZHMpKSB7XG4gICAgICBjb25zb2xlLndhcm4oYFNraXBwZWQgZ2VuZXJhdGluZyAke2ZpbGVQYXRofSBiZWNhdXNlIFwiZXh0ZW5kc1wiIGlzIG5vdCBhbiBhcnJheS5gKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgcmVtb3ZlZFByZXNldCA9IG9sZFNldHRpbmdzPy5leHRlbmRzPy5maW5kKFxuICAgICAgKHByZXNldCkgPT4gcHJlc2V0LnN0YXJ0c1dpdGgoJ2dpdGh1Yj5XaWxsQm9vc3Rlci93aWxsYm9vc3Rlci1jb25maWdzOicpICYmIHByZXNldCAhPT0gc2hhcmVkUHJlc2V0XG4gICAgKTtcbiAgICBpZiAocmVtb3ZlZFByZXNldCkge1xuICAgICAgY29uc29sZS53YXJuKGBTa2lwcGVkIGdlbmVyYXRpbmcgJHtmaWxlUGF0aH0gYmVjYXVzZSBcIiR7cmVtb3ZlZFByZXNldH1cIiBubyBsb25nZXIgZXhpc3RzOyByZW1vdmUgaXQgbWFudWFsbHkuYCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgbmV3U2V0dGluZ3MgPSBidWlsZFNldHRpbmdzKGNvbmZpZywgb2xkU2V0dGluZ3MpO1xuICAgIGNvbnN0IHsgY29udGVudCwga2V5c0xvc2luZ0NvbW1lbnRzIH0gPSBqc29uY1V0aWwuc3RyaW5naWZ5UHJlc2VydmluZ1RyaXZpYShcbiAgICAgIG9sZENvbnRlbnQsXG4gICAgICBuZXdTZXR0aW5ncyBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPlxuICAgICk7XG4gICAgaWYgKG9sZENvbnRlbnQgIT09IHVuZGVmaW5lZCAmJiBub3JtYWxpemUoY29udGVudCkgPT09IG5vcm1hbGl6ZShvbGRDb250ZW50KSkgcmV0dXJuO1xuICAgIGlmICghKGF3YWl0IGZzVXRpbC5nZW5lcmF0ZUZpbGUoZmlsZVBhdGgsIGNvbnRlbnQpKSkgcmV0dXJuO1xuXG4gICAgZm9yIChjb25zdCBrZXkgb2Yga2V5c0xvc2luZ0NvbW1lbnRzKSB7XG4gICAgICBjb25zb2xlLndhcm4oYENvbW1lbnRzIGluc2lkZSBcIiR7a2V5fVwiIHdlcmUgZHJvcHBlZCB3aGlsZSByZXdyaXRpbmcgaXQgaW4gJHtmaWxlUGF0aH0uYCk7XG4gICAgfVxuICB9KTtcbn1cblxuZnVuY3Rpb24gYnVpbGRTZXR0aW5ncyhjb25maWc6IFBhY2thZ2VDb25maWcsIG9sZFNldHRpbmdzOiBTZXR0aW5ncyB8IHVuZGVmaW5lZCk6IFNldHRpbmdzIHtcbiAgY29uc3Qgc2V0dGluZ3MgPSBvbGRTZXR0aW5nc1xuICAgID8gKG1lcmdlLmFsbChbZ2VuZXJhdGVkU2V0dGluZ3MsIG9sZFNldHRpbmdzLCBnZW5lcmF0ZWRTZXR0aW5nc10sIHtcbiAgICAgICAgYXJyYXlNZXJnZTogb3ZlcndyaXRlTWVyZ2UsXG4gICAgICB9KSBhcyBTZXR0aW5ncylcbiAgICA6IHN0cnVjdHVyZWRDbG9uZShnZW5lcmF0ZWRTZXR0aW5ncyk7XG4gIGNvbnN0IGV4aXN0aW5nRXh0ZW5kcyA9IG9sZFNldHRpbmdzPy5leHRlbmRzID8/IFtdO1xuICBzZXR0aW5ncy5leHRlbmRzID0gY29uZmlnLmlzV2lsbEJvb3N0ZXJDb25maWdzXG4gICAgPyBleGlzdGluZ0V4dGVuZHMuZmlsdGVyKChwcmVzZXQpID0+IHByZXNldCAhPT0gc2hhcmVkUHJlc2V0KVxuICAgIDogZXhpc3RpbmdFeHRlbmRzLmluY2x1ZGVzKHNoYXJlZFByZXNldClcbiAgICAgID8gZXhpc3RpbmdFeHRlbmRzXG4gICAgICA6IFtzaGFyZWRQcmVzZXQsIC4uLmV4aXN0aW5nRXh0ZW5kc107XG4gIHJldHVybiBzZXR0aW5ncztcbn1cblxuZnVuY3Rpb24gbm9ybWFsaXplKGNvbnRlbnQ6IHN0cmluZyk6IHN0cmluZyB7XG4gIGNvbnN0IHRyaW1tZWRDb250ZW50ID0gY29udGVudC50cmltKCk7XG4gIHJldHVybiB0cmltbWVkQ29udGVudCA/IHRyaW1tZWRDb250ZW50ICsgJ1xcbicgOiAnJztcbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCBtZXJnZSBmcm9tICdkZWVwbWVyZ2UnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlSnNvbiwgVHNDb25maWdKc29uIH0gZnJvbSAndHlwZS1mZXN0JztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZnNVdGlsIH0gZnJvbSAnLi4vdXRpbHMvZnNVdGlsLmpzJztcbmltcG9ydCB7IGpzb25jVXRpbCB9IGZyb20gJy4uL3V0aWxzL2pzb25jVXRpbC5qcyc7XG5pbXBvcnQgeyBjb21iaW5lTWVyZ2UgfSBmcm9tICcuLi91dGlscy9tZXJnZVV0aWwuanMnO1xuaW1wb3J0IHsgc29ydEtleXMgfSBmcm9tICcuLi91dGlscy9vYmplY3RVdGlsLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuaW1wb3J0IHsgZ2V0VHNjb25maWdFeHRlbmRzIH0gZnJvbSAnLi4vdXRpbHMvdHNjb25maWdCYXNlLmpzJztcbmltcG9ydCB7XG4gIGdldE1lYW5pbmdmdWxEZWNsYXJlZFdvcmtzcGFjZVBhdHRlcm5zLFxuICBnZXRXb3Jrc3BhY2VEaXJQYXR0ZXJucyxcbiAgZ2V0V29ya3NwYWNlU3ViRGlyUGF0aHMsXG59IGZyb20gJy4uL3V0aWxzL3dvcmtzcGFjZVV0aWwuanMnO1xuXG5jb25zdCBzdWJKc29uT2JqID0ge1xuICBjb21waWxlck9wdGlvbnM6IHtcbiAgICBhbHdheXNTdHJpY3Q6IHRydWUsXG4gICAgbm9VbmNoZWNrZWRJbmRleGVkQWNjZXNzOiB0cnVlLCAvLyBmb3IgQHR5cGVzY3JpcHQtZXNsaW50L3ByZWZlci1udWxsaXNoLWNvYWxlc2NpbmdcbiAgICBhbGxvd1N5bnRoZXRpY0RlZmF1bHRJbXBvcnRzOiB0cnVlLCAvLyBhbGxvdyBgaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0J2BcbiAgICBlc01vZHVsZUludGVyb3A6IHRydWUsIC8vIGFsbG93IGRlZmF1bHQgaW1wb3J0IGZyb20gQ29tbW9uSlMvQU1EL1VNRCBtb2R1bGVzXG4gICAgcmVzb2x2ZUpzb25Nb2R1bGU6IHRydWUsIC8vIGFsbG93IHRvIGltcG9ydCBKU09OIGZpbGVzXG4gICAgaW1wb3J0SGVscGVyczogZmFsc2UsXG4gICAgbm9FbWl0OiB0cnVlLFxuICB9LFxuICBleGNsdWRlOiBbJ3Rlc3QvZml4dHVyZXMnXSxcbiAgLy8gd2JmeSBnZW5lcmF0ZXMgcm9vdC1sZXZlbCB0b29sIGNvbmZpZ3Mgc3VjaCBhcyBwbGF5d3JpZ2h0LmNvbmZpZy50cywgYW5kXG4gIC8vIHR5cGUtYXdhcmUgbGludGluZyBuZWVkcyB0aG9zZSBmaWxlcyBpbiB0aGUgcHJvamVjdCB0byBzZWUgTm9kZS9CdW4gZ2xvYmFscy5cbiAgLy8gYGFwcC8qKmAgaXMgZGVsaWJlcmF0ZWx5IGFic2VudCBldmVuIHRob3VnaCB0aGUgZG9lc0NvbnRhaW4qU2NyaXB0IHNpZ25hbHMgc2NhbiBpdDogYXBwXG4gIC8vIGRpcmVjdG9yaWVzIGJlbG9uZyB0byBmcmFtZXdvcmsgcGFja2FnZXMgKE5leHQuanMvQmxpdHopLCB3aGljaCBvd24gdGhlaXIgdHNjb25maWdcbiAgLy8gKGdlbmVyYXRlVHNjb25maWcgc2tpcHMgdGhlbSksIGFuZCBjaGVja2luZyBmcmFtZXdvcmsgc291cmNlcyB1bmRlciB0aGlzIHByb2plY3QncyBjb21waWxlclxuICAvLyBvcHRpb25zIHdvdWxkIHByb2R1Y2UgZmFsc2UgZXJyb3JzLlxuICBpbmNsdWRlOiBbJyouY29uZmlnLnRzJywgJ3NjcmlwdHMvKiovKicsICdzcmMvKiovKicsICd0ZXN0LyoqLyonXSxcbn07XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZW5lcmF0ZVRzY29uZmlnKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2dlbmVyYXRlVHNjb25maWcnLCBhc3luYyAoKSA9PiB7XG4gICAgLy8gdmluZXh0IGlzIHRoZSBvcmcncyBOZXh0LmpzLWVxdWl2YWxlbnQgZnJhbWV3b3JrIGFuZCBvd25zIGl0cyB0c2NvbmZpZyBqdXN0IGxpa2UgTmV4dC9CbGl0eixcbiAgICAvLyBzbyBpdCBtdXN0IHNraXAgdGhlIHN0YW5kYXJkIGdlbmVyYXRpb24gdGhhdCB3b3VsZCBvdmVyd3JpdGUgdGhlIGZyYW1ld29yaydzIG93biBzZXR0aW5ncy5cbiAgICBpZiAoY29uZmlnLmRlcGVuZGluZy5ibGl0eiB8fCBjb25maWcuZGVwZW5kaW5nLm5leHQgfHwgY29uZmlnLmRlcGVuZGluZy52aW5leHQpIHtcbiAgICAgIGF3YWl0IG5vcm1hbGl6ZUZyYW1ld29ya1RzY29uZmlnKGNvbmZpZyk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgbGV0IG5ld1NldHRpbmdzID0gKGNvbmZpZy5pc1Jvb3QgPyBidWlsZFJvb3RKc29uT2JqKGNvbmZpZykgOiBzdHJ1Y3R1cmVkQ2xvbmUoc3ViSnNvbk9iaikpIGFzIFRzQ29uZmlnSnNvbjtcbiAgICBjb25zdCBnZW5lcmF0ZWRUeXBlcyA9IGdldEdlbmVyYXRlZFR5cGVzKGNvbmZpZyk7XG4gICAgbmV3U2V0dGluZ3MuZXh0ZW5kcyA9IGdldFRzY29uZmlnRXh0ZW5kcyhjb25maWcpO1xuICAgIG5ld1NldHRpbmdzLmNvbXBpbGVyT3B0aW9ucyA/Pz0ge307XG4gICAgbmV3U2V0dGluZ3MuY29tcGlsZXJPcHRpb25zLnJvb3REaXIgPSBnZXRSb290RGlyKGNvbmZpZyk7XG4gICAgaWYgKGdlbmVyYXRlZFR5cGVzLmxlbmd0aCA+IDApIHtcbiAgICAgIG5ld1NldHRpbmdzLmNvbXBpbGVyT3B0aW9ucyA9IHsgLi4ubmV3U2V0dGluZ3MuY29tcGlsZXJPcHRpb25zLCB0eXBlczogZ2VuZXJhdGVkVHlwZXMgfTtcbiAgICB9XG4gICAgaWYgKCFjb25maWcuZG9lc0NvbnRhaW5Kc3hPclRzeCAmJiAhY29uZmlnLmRvZXNDb250YWluSnN4T3JUc3hJblBhY2thZ2VzKSB7XG4gICAgICBkZWxldGUgbmV3U2V0dGluZ3MuY29tcGlsZXJPcHRpb25zPy5qc3g7XG4gICAgfVxuICAgIGlmIChjb25maWcuZGVwZW5kaW5nLnByaXNtYSkge1xuICAgICAgLy8gUHJpc21hIHNlZWRzIGFuZCBtaWdyYXRpb24gaGVscGVyIHNjcmlwdHMgb2Z0ZW4gbGl2ZSBvdXRzaWRlIHNyYywgYnV0XG4gICAgICAvLyB0eXBlLWF3YXJlIGxpbnRpbmcgc3RpbGwgbmVlZHMgdGhlbSBjb3ZlcmVkIGJ5IHRoZSBwcm9qZWN0IGNvbmZpZy5cbiAgICAgIGFkZEluY2x1ZGVQYXRoKG5ld1NldHRpbmdzLCAncHJpc21hLyoqLyonKTtcbiAgICB9XG5cbiAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJ3RzY29uZmlnLmpzb24nKTtcbiAgICBjb25zdCBleGlzdGluZ0NvbnRlbnQgPSBhd2FpdCBmc1V0aWwucmVhZEZpbGVJZkV4aXN0cyhmaWxlUGF0aCk7XG4gICAgbGV0IG9yaWdpbmFsU2V0dGluZ3NKc29uOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gICAgLy8gQSBmaWxlIHdpdGggbm8gY29uZmlndXJhdGlvbiAoZW1wdHkgb3IgY29tbWVudC1vbmx5KSBpcyB0cmVhdGVkIGxpa2UgYSBtaXNzaW5nIG9uZSwgYXMgdHNjIGRvZXMuXG4gICAgaWYgKGV4aXN0aW5nQ29udGVudCAhPT0gdW5kZWZpbmVkICYmICFqc29uY1V0aWwuaXNUcml2aWFPbmx5KGV4aXN0aW5nQ29udGVudCkpIHtcbiAgICAgIGNvbnN0IG9sZFNldHRpbmdzID0ganNvbmNVdGlsLnBhcnNlT2JqZWN0SWdub3JpbmdFcnJvcjxUc0NvbmZpZ0pzb24+KGV4aXN0aW5nQ29udGVudCk7XG4gICAgICAvLyBBbiBleGlzdGluZyB0c2NvbmZpZy5qc29uIHdiZnkgY2Fubm90IHBhcnNlIG11c3QgYmUgbGVmdCB1bnRvdWNoZWQ6IHdyaXRpbmcgdGhlXG4gICAgICAvLyBnZW5lcmF0ZWQgc2V0dGluZ3Mgd2l0aG91dCBtZXJnaW5nIHdvdWxkIHNpbGVudGx5IGRpc2NhcmQgdGhlIHByb2plY3QncyBjb25maWd1cmF0aW9uLlxuICAgICAgaWYgKCFvbGRTZXR0aW5ncykge1xuICAgICAgICBjb25zb2xlLndhcm4oYFNraXBwZWQgZ2VuZXJhdGluZyAke2ZpbGVQYXRofSBiZWNhdXNlIHRoZSBleGlzdGluZyBjb250ZW50IGlzIG5vdCBwYXJzYWJsZSBhcyBKU09OQy5gKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgb3JpZ2luYWxTZXR0aW5nc0pzb24gPSBKU09OLnN0cmluZ2lmeShzb3J0S2V5cyhzdHJ1Y3R1cmVkQ2xvbmUob2xkU2V0dGluZ3MpKSk7XG4gICAgICBjb25zdCBleGlzdGluZ1R5cGVzID0gbm9ybWFsaXplU3RyaW5nQXJyYXkob2xkU2V0dGluZ3MuY29tcGlsZXJPcHRpb25zPy50eXBlcyk7XG4gICAgICBjb25zdCBleGlzdGluZ0VtaXRNZXRhZGF0YSA9IHBpY2tFeGlzdGluZ0VtaXRNZXRhZGF0YShvbGRTZXR0aW5ncy5jb21waWxlck9wdGlvbnMpO1xuICAgICAgbmV3U2V0dGluZ3MuZXh0ZW5kcyA9IG1lcmdlVHNjb25maWdFeHRlbmRzKG5ld1NldHRpbmdzLmV4dGVuZHMsIG9sZFNldHRpbmdzLmV4dGVuZHMpO1xuICAgICAgZGVsZXRlIG9sZFNldHRpbmdzLmV4dGVuZHM7XG4gICAgICBkZWxldGUgb2xkU2V0dGluZ3MuY29tcGlsZXJPcHRpb25zPy5qc3g7XG4gICAgICBpZiAoY29uZmlnLmlzUm9vdCkge1xuICAgICAgICByZW1vdmVTdGFsZU1hbmFnZWRXb3Jrc3BhY2VFbnRyaWVzKGNvbmZpZywgb2xkU2V0dGluZ3MsIG5ld1NldHRpbmdzKTtcbiAgICAgIH1cbiAgICAgIG5ld1NldHRpbmdzID0gbWVyZ2UuYWxsKFtuZXdTZXR0aW5ncywgb2xkU2V0dGluZ3MsIG5ld1NldHRpbmdzXSwgeyBhcnJheU1lcmdlOiBjb21iaW5lTWVyZ2UgfSk7XG4gICAgICBuZXdTZXR0aW5ncy5pbmNsdWRlID0gbmV3U2V0dGluZ3MuaW5jbHVkZT8uZmlsdGVyKFxuICAgICAgICAoZGlyUGF0aDogc3RyaW5nKSA9PlxuICAgICAgICAgICFkaXJQYXRoLmluY2x1ZGVzKCdAdHlwZXMnKSAmJiAhZGlyUGF0aC5pbmNsdWRlcygnX190ZXN0c19fLycpICYmICFkaXJQYXRoLmluY2x1ZGVzKCd0ZXN0cy8nKVxuICAgICAgKTtcbiAgICAgIG5ld1NldHRpbmdzLmNvbXBpbGVyT3B0aW9ucyA/Pz0ge307XG4gICAgICAvLyB3YmZ5LWdlbmVyYXRlZCB0c2NvbmZpZy5qc29uIGlzIGEgbGludC90eXBlY2hlY2sgcHJvamVjdCwgbm90IHRoZSBlbWl0XG4gICAgICAvLyBjb250cmFjdC4gSXQgbXVzdCBrZWVwIHJvb3REaXIgYnJvYWQgZW5vdWdoIGZvciByb290IGNvbmZpZyBmaWxlcyxcbiAgICAgIC8vIHNjcmlwdHMsIHNyYywgYW5kIHRlc3RzLiBidWlsZC10cyBvd25zIGVtaXQgYW5kIGNyZWF0ZXMgYSB0ZW1wb3JhcnlcbiAgICAgIC8vIHNyYy1vbmx5IHRzY29uZmlnIHdpdGggbm9FbWl0PWZhbHNlLCBlbWl0RGVjbGFyYXRpb25Pbmx5PXRydWUsXG4gICAgICAvLyByb290RGlyPVwic3JjXCIsIGFuZCBpbmNsdWRlPVtcInNyYy8qKi8qXCJdLCBzbyBwcmVzZXJ2aW5nIG5vRW1pdD1mYWxzZSBvclxuICAgICAgLy8gcm9vdERpcj1cInNyY1wiIGhlcmUgd291bGQgb25seSBicmVhayBub24tc3JjIHR5cGUtYXdhcmUgbGludCBjb3ZlcmFnZS5cbiAgICAgIG5ld1NldHRpbmdzLmNvbXBpbGVyT3B0aW9ucyA9IHsgLi4ubmV3U2V0dGluZ3MuY29tcGlsZXJPcHRpb25zLCAuLi5leGlzdGluZ0VtaXRNZXRhZGF0YSB9O1xuXG4gICAgICBjb25zdCBtZXJnZWRUeXBlcyA9IFsuLi5uZXcgU2V0KFsuLi5maWx0ZXJFeGlzdGluZ1R5cGVzKGV4aXN0aW5nVHlwZXMsIGdlbmVyYXRlZFR5cGVzKSwgLi4uZ2VuZXJhdGVkVHlwZXNdKV07XG4gICAgICBpZiAobWVyZ2VkVHlwZXMubGVuZ3RoID4gMCkge1xuICAgICAgICBuZXdTZXR0aW5ncy5jb21waWxlck9wdGlvbnMudHlwZXMgPSBtZXJnZWRUeXBlcztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGRlbGV0ZSBuZXdTZXR0aW5ncy5jb21waWxlck9wdGlvbnMudHlwZXM7XG4gICAgICB9XG4gICAgICBpZiAoc2hvdWxkRGVsZXRlVHlwZVJvb3RzKGdlbmVyYXRlZFR5cGVzKSkge1xuICAgICAgICBkZWxldGUgbmV3U2V0dGluZ3MuY29tcGlsZXJPcHRpb25zLnR5cGVSb290cztcbiAgICAgIH1cbiAgICB9XG4gICAgYWRkVW5kaWNpVHlwZXNQYXRoTWFwcGluZyhuZXdTZXR0aW5ncywgY29uZmlnKTtcbiAgICBzb3J0S2V5cyhuZXdTZXR0aW5ncyk7XG4gICAgbmV3U2V0dGluZ3MuaW5jbHVkZT8uc29ydCgpO1xuICAgIC8vIERvbid0IHVzZSBvbGQgZGVjb3JhdG9yXG4gICAgZGVsZXRlIG5ld1NldHRpbmdzLmNvbXBpbGVyT3B0aW9ucz8uZXhwZXJpbWVudGFsRGVjb3JhdG9ycztcbiAgICAvLyBQYWNrYWdlIGltcG9ydHMgc2hvdWxkIHJlc29sdmUgdGhyb3VnaCBwYWNrYWdlIGV4cG9ydHMgaW5zdGVhZCBvZiBiYXNlVXJsLlxuICAgIC8vIHBhdGhzIGlzIGludGVudGlvbmFsbHkgcHJlc2VydmVkIHNvIHJlcG8tbG9jYWwgdG9vbGluZyBjYW4ga2VlcCBleHBsaWNpdFxuICAgIC8vIGFsaWFzZXMgd2l0aG91dCByZWx5aW5nIG9uIGJhc2VVcmwncyBicm9hZCBmYWxsYmFjayByZXNvbHV0aW9uLlxuICAgIGRlbGV0ZSBuZXdTZXR0aW5ncy5jb21waWxlck9wdGlvbnM/LmJhc2VVcmw7XG4gICAgaWYgKGNvbmZpZy5kZXBlbmRpbmcucmVhY3ROYXRpdmUpIHtcbiAgICAgIGRlbGV0ZSBuZXdTZXR0aW5ncy5jb21waWxlck9wdGlvbnM/LnZlcmJhdGltTW9kdWxlU3ludGF4O1xuICAgIH1cbiAgICAvLyBTa2lwIHRoZSB3cml0ZSB3aGVuIG5vdGhpbmcgY2hhbmdlcyBzZW1hbnRpY2FsbHksIHNvIEpTT05DIGNvbW1lbnRzIGFuZCBmb3JtYXR0aW5nIGluIGFuXG4gICAgLy8gYWxyZWFkeS11cC10by1kYXRlIHRzY29uZmlnLmpzb24gc3Vydml2ZSB3YmZ5IHJ1bnMuXG4gICAgaWYgKG9yaWdpbmFsU2V0dGluZ3NKc29uID09PSBKU09OLnN0cmluZ2lmeShuZXdTZXR0aW5ncykpIHJldHVybjtcbiAgICBjb25zdCBuZXdDb250ZW50ID0gSlNPTi5zdHJpbmdpZnkobmV3U2V0dGluZ3MsIHVuZGVmaW5lZCwgMik7XG4gICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzVXRpbC5nZW5lcmF0ZUZpbGUoZmlsZVBhdGgsIG5ld0NvbnRlbnQpKTtcbiAgfSk7XG59XG5cbi8qKlxuICogVGhlIG1vbm9yZXBvLXJvb3QgdHNjb25maWcsIHdob3NlIGluY2x1ZGUvZXhjbHVkZSBjb3ZlciBldmVyeSBERUNMQVJFRCB3b3Jrc3BhY2UgbGF5b3V0IChlLmcuXG4gKiBgYXBwcy8qYCBhbG9uZ3NpZGUgYHBhY2thZ2VzLypgKSBzbyB0eXBlLWF3YXJlIGxpbnRpbmcgcnVuIGZyb20gdGhlIHJvb3Qgc2VlcyBhbGwgd29ya3NwYWNlXG4gKiBzb3VyY2VzLCBub3QganVzdCB0aGUgY29udmVudGlvbmFsIHBhY2thZ2VzLyogZGlyZWN0b3J5LlxuICovXG5mdW5jdGlvbiBidWlsZFJvb3RKc29uT2JqKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFRzQ29uZmlnSnNvbiB7XG4gIGNvbnN0IHdvcmtzcGFjZVBhdHRlcm5zID0gY29uZmlnLmRvZXNDb250YWluU3ViUGFja2FnZUpzb25zXG4gICAgPyBnZXRXb3Jrc3BhY2VEaXJQYXR0ZXJucyhjb25maWcpXG4gICAgOiB7IGV4Y2x1ZGVzOiBbXSwgaW5jbHVkZXM6IFtdIH07XG4gIGNvbnN0IHNldHRpbmdzID0gc3RydWN0dXJlZENsb25lKHN1Ykpzb25PYmopIGFzIFRzQ29uZmlnSnNvbjtcbiAgc2V0dGluZ3MuZXhjbHVkZSA9IFtcbiAgICAuLi5uZXcgU2V0KFtcbiAgICAgIC4uLndvcmtzcGFjZVBhdHRlcm5zLmluY2x1ZGVzLm1hcCgod29ya3NwYWNlUGF0dGVybikgPT4gYCR7d29ya3NwYWNlUGF0dGVybn0vdGVzdC9maXh0dXJlc2ApLFxuICAgICAgLy8gTmVnYXRpdmUgd29ya3NwYWNlIHBhdHRlcm5zIChlLmcuIGAhcGFja2FnZXMvZXhjbHVkZWRgKSBvcHQgd29ya3NwYWNlIHN1YnRyZWVzIG91dCBvZiB0aGVcbiAgICAgIC8vIG1vbm9yZXBvLCBzbyB0aGVpciBzb3VyY2VzIG11c3Qgbm90IGVudGVyIHRoZSByb290IHR5cGUtY2hlY2sgcHJvamVjdCBlaXRoZXIuIEEgbmVnYXRpb25cbiAgICAgIC8vIHdob3NlIGRpcmVjdG9yeSBpcyBhbiBhbmNlc3RvciBvZiBhIHdvcmtzcGFjZSB5aWVsZHMgcGFja2FnZS1vd25lZCBzdWJwYXRoIGVudHJpZXNcbiAgICAgIC8vIGluc3RlYWQgb2YgdGhlIHdob2xlIHN1YnRyZWUgKHNlZSBnZXRXb3Jrc3BhY2VEaXJQYXR0ZXJucykuXG4gICAgICAuLi53b3Jrc3BhY2VQYXR0ZXJucy5leGNsdWRlcyxcbiAgICAgIC8vIFRoZSBtYW5hZ2VkIGluY2x1ZGVzIGFib3ZlIGRlbGliZXJhdGVseSBvbWl0IGZyYW1ld29yayBgYXBwLyoqYCBkaXJlY3RvcmllcyAoc2VlXG4gICAgICAvLyBzdWJKc29uT2JqLmluY2x1ZGUncyBjb21tZW50KSwgYnV0IGEgcmVwby1hdXRob3JlZCBicm9hZCBpbmNsdWRlIHN1Y2ggYXMgYGUyZS8qKlxcLypgXG4gICAgICAvLyBjYW4gc3RpbGwgZHJhZyBhIGZyYW1ld29yayB3b3Jrc3BhY2UncyBhcHAgc291cmNlcyBpbnRvIHRoZSByb290IHByb2plY3QsIHdoZXJlIHRoZXlcbiAgICAgIC8vIGZhaWwgdW5kZXIgdGhlIHJvb3QgY29tcGlsZXIgb3B0aW9ucyDigJQgdGhlaXIgYmFyZSBgbmV4dC8qYCBpbXBvcnRzIHJlc29sdmUgb25seSB0aHJvdWdoXG4gICAgICAvLyB0aGUgZnJhbWV3b3JrIHdvcmtzcGFjZSdzIG93biB0c2NvbmZpZyBgcGF0aHNgLiBFeGNsdWRlIHRob3NlIGFwcCBkaXJlY3RvcmllcyBzbyB0aGVcbiAgICAgIC8vIHJvb3QgcHJvamVjdCBuZXZlciB0eXBlLWNoZWNrcyB0aGVtLCBubyBtYXR0ZXIgaG93IGJyb2FkIHRoZSByZXBvJ3MgaW5jbHVkZSBnbG9icyBhcmUuXG4gICAgICAuLi5nZXRGcmFtZXdvcmtXb3Jrc3BhY2VBcHBFeGNsdWRlcyhjb25maWcpLFxuICAgICAgLi4uKHNldHRpbmdzLmV4Y2x1ZGUgPz8gW10pLFxuICAgIF0pLFxuICBdLnRvU29ydGVkKCk7XG4gIHNldHRpbmdzLmluY2x1ZGUgPSBbXG4gICAgLi4uKHNldHRpbmdzLmluY2x1ZGUgPz8gW10pLFxuICAgIC4uLndvcmtzcGFjZVBhdHRlcm5zLmluY2x1ZGVzLmZsYXRNYXAoKHdvcmtzcGFjZVBhdHRlcm4pID0+IFtcbiAgICAgIGAke3dvcmtzcGFjZVBhdHRlcm59LyouY29uZmlnLnRzYCxcbiAgICAgIGAke3dvcmtzcGFjZVBhdHRlcm59L3NjcmlwdHMvKiovKmAsXG4gICAgICBgJHt3b3Jrc3BhY2VQYXR0ZXJufS9zcmMvKiovKmAsXG4gICAgICBgJHt3b3Jrc3BhY2VQYXR0ZXJufS90ZXN0LyoqLypgLFxuICAgIF0pLFxuICBdO1xuICByZXR1cm4gc2V0dGluZ3M7XG59XG5cbi8vIEZyYW1ld29yayBwYWNrYWdlcyBvd24gdGhlaXIgdHNjb25maWcgKGdlbmVyYXRlVHNjb25maWcgc2tpcHMgdGhlbSkgYW5kIHNoaW0gYmFyZSBpbXBvcnRzIHN1Y2ggYXNcbi8vIGBuZXh0L25hdmlnYXRpb25gIHRocm91Z2ggcGFja2FnZS1sb2NhbCBgcGF0aHNgOyB2aW5leHQgaXMgdGhlIG9yZydzIE5leHQuanMtZXF1aXZhbGVudCBmcmFtZXdvcmtcbi8vIGFuZCBiZWhhdmVzIHRoZSBzYW1lLiBUaGVpciBhcHAgc291cmNlcyB0aGVyZWZvcmUgb25seSB0eXBlLWNoZWNrIHVuZGVyIHRoZWlyIG93biBjb25maWcuXG5jb25zdCBmcmFtZXdvcmtEZXBlbmRlbmN5TmFtZXMgPSBbJ2JsaXR6JywgJ25leHQnLCAndmluZXh0J107XG5cbi8vIEEgZnJhbWV3b3JrIGFwcCBsaXZlcyBpbiBgYXBwL2Agb3IsIHVuZGVyIHRoZSBzcmMtZGlyZWN0b3J5IGxheW91dCwgYHNyYy9hcHAvYC4gVGhlIHJvb3QgcHJvamVjdFxuLy8gaW5jbHVkZXMgYDx3b3Jrc3BhY2U+L3NyYy8qKi8qYCwgc28gYHNyYy9hcHBgIGxlYWtzIGluIGp1c3QgYXMgYSByZXBvLXdpZGUgZ2xvYiBjYW4gcHVsbCBpbiBgYXBwYC5cbmNvbnN0IGZyYW1ld29ya0FwcERpck5hbWVzID0gWydhcHAnLCAnc3JjL2FwcCddO1xuXG4vKiogUm9vdCBgZXhjbHVkZWAgZW50cmllcyAocG9zaXgsIHJlbGF0aXZlIHRvIHRoZSByb290KSBmb3IgZXZlcnkgZnJhbWV3b3JrIHdvcmtzcGFjZSdzIGFwcCBkaXJlY3RvcnkuICovXG5mdW5jdGlvbiBnZXRGcmFtZXdvcmtXb3Jrc3BhY2VBcHBFeGNsdWRlcyhjb25maWc6IFBhY2thZ2VDb25maWcpOiBzdHJpbmdbXSB7XG4gIGlmICghY29uZmlnLmRvZXNDb250YWluU3ViUGFja2FnZUpzb25zKSByZXR1cm4gW107XG4gIGNvbnN0IGV4Y2x1ZGVzOiBzdHJpbmdbXSA9IFtdO1xuICBmb3IgKGNvbnN0IHdvcmtzcGFjZURpclBhdGggb2YgZ2V0V29ya3NwYWNlU3ViRGlyUGF0aHMoY29uZmlnKSkge1xuICAgIGlmICghZGVwZW5kc09uRnJhbWV3b3JrKHBhdGgucmVzb2x2ZSh3b3Jrc3BhY2VEaXJQYXRoLCAncGFja2FnZS5qc29uJykpKSBjb250aW51ZTtcbiAgICBmb3IgKGNvbnN0IGFwcERpck5hbWUgb2YgZnJhbWV3b3JrQXBwRGlyTmFtZXMpIHtcbiAgICAgIGNvbnN0IGFwcERpclBhdGggPSBwYXRoLnJlc29sdmUod29ya3NwYWNlRGlyUGF0aCwgYXBwRGlyTmFtZSk7XG4gICAgICBpZiAoZnMuZXhpc3RzU3luYyhhcHBEaXJQYXRoKSkgZXhjbHVkZXMucHVzaChwYXRoLnJlbGF0aXZlKGNvbmZpZy5kaXJQYXRoLCBhcHBEaXJQYXRoKS5yZXBsYWNlQWxsKCdcXFxcJywgJy8nKSk7XG4gICAgfVxuICB9XG4gIHJldHVybiBleGNsdWRlcztcbn1cblxuZnVuY3Rpb24gZGVwZW5kc09uRnJhbWV3b3JrKG1hbmlmZXN0UGF0aDogc3RyaW5nKTogYm9vbGVhbiB7XG4gIGxldCBtYW5pZmVzdDogUGFja2FnZUpzb24gfCBudWxsO1xuICB0cnkge1xuICAgIG1hbmlmZXN0ID0gSlNPTi5wYXJzZShmcy5yZWFkRmlsZVN5bmMobWFuaWZlc3RQYXRoLCAndXRmOCcpKSBhcyBQYWNrYWdlSnNvbiB8IG51bGw7XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICAvLyBBIG1hbmlmZXN0IHRoYXQgcGFyc2VzIHRvIGEgbm9uLW9iamVjdCAoZS5nLiBhIGZpbGUgbGl0ZXJhbGx5IGNvbnRhaW5pbmcgYG51bGxgKSBkZWNsYXJlcyBub1xuICAvLyBkZXBlbmRlbmNpZXM7IGd1YXJkIHRoZSBwcm9wZXJ0eSBhY2Nlc3MsIHdoaWNoIHdvdWxkIG90aGVyd2lzZSB0aHJvdyBvdXRzaWRlIHRoZSB0cnkgYWJvdmUuXG4gIGlmICghbWFuaWZlc3QgfHwgdHlwZW9mIG1hbmlmZXN0ICE9PSAnb2JqZWN0JykgcmV0dXJuIGZhbHNlO1xuICBjb25zdCBkZXBlbmRlbmNpZXMgPSB7IC4uLm1hbmlmZXN0LmRlcGVuZGVuY2llcywgLi4ubWFuaWZlc3QuZGV2RGVwZW5kZW5jaWVzIH07XG4gIHJldHVybiBmcmFtZXdvcmtEZXBlbmRlbmN5TmFtZXMuc29tZSgoZGVwZW5kZW5jeU5hbWUpID0+IGRlcGVuZGVuY2llc1tkZXBlbmRlbmN5TmFtZV0pO1xufVxuXG5jb25zdCBtYW5hZ2VkV29ya3NwYWNlSW5jbHVkZVN1ZmZpeGVzID0gWycqLmNvbmZpZy50cycsICdzY3JpcHRzLyoqLyonLCAnc3JjLyoqLyonLCAndGVzdC8qKi8qJ107XG5cbi8qKlxuICogUm9vdCBpbmNsdWRlL2V4Y2x1ZGUgZW50cmllcyB3YmZ5IGdlbmVyYXRlZCBmb3IgYW4gZWFybGllciB3b3Jrc3BhY2UgbGF5b3V0IChlLmcuIGBwYWNrYWdlcy8qYFxuICogZ2xvYnMgaW4gYSByZXBvIHRoYXQgbm93IGRlY2xhcmVzIG9ubHkgYGFwcHMvKmApIG11c3Qgbm90IHN1cnZpdmUgdGhlIG1lcmdlIHdpdGggdGhlIGV4aXN0aW5nXG4gKiB0c2NvbmZpZywgb3IgdGhlIG9ic29sZXRlIGRpcmVjdG9yaWVzIHdvdWxkIGtlZXAgZW50ZXJpbmcgcm9vdCB0eXBlIGNoZWNraW5nIGZvcmV2ZXIuIEEgcHJlZml4XG4gKiBjb3VudHMgYXMgd2JmeS1tYW5hZ2VkIG9ubHkgd2hlbiB0aGUgQ09NUExFVEUgZ2VuZXJhdGVkIGluY2x1ZGUgc2V0IGZvciBpdCBpcyBwcmVzZW50IGFuZCBub1xuICogbG9uZ2VyIGdlbmVyYXRlZCDigJQgYSB1c2VyLWF1dGhvcmVkIGVudHJ5IHN1Y2ggYXMgYSBsb25lIGB0b29scy8qXFwvc3JjLyoqXFwvKmAgbmV2ZXIgcXVhbGlmaWVzLlxuICovXG5mdW5jdGlvbiByZW1vdmVTdGFsZU1hbmFnZWRXb3Jrc3BhY2VFbnRyaWVzKFxuICBjb25maWc6IFBhY2thZ2VDb25maWcsXG4gIG9sZFNldHRpbmdzOiBUc0NvbmZpZ0pzb24sXG4gIG5ld1NldHRpbmdzOiBUc0NvbmZpZ0pzb25cbik6IHZvaWQge1xuICBjb25zdCBzdGFsZVByZWZpeGVzID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gIGlmIChBcnJheS5pc0FycmF5KG9sZFNldHRpbmdzLmluY2x1ZGUpKSB7XG4gICAgY29uc3Qgb2xkSW5jbHVkZSA9IG9sZFNldHRpbmdzLmluY2x1ZGUuZmlsdGVyKChlbnRyeSk6IGVudHJ5IGlzIHN0cmluZyA9PiB0eXBlb2YgZW50cnkgPT09ICdzdHJpbmcnKTtcbiAgICBjb25zdCBnZW5lcmF0ZWRJbmNsdWRlID0gbmV3IFNldChuZXdTZXR0aW5ncy5pbmNsdWRlKTtcbiAgICBmb3IgKGNvbnN0IGVudHJ5IG9mIG9sZEluY2x1ZGUpIHtcbiAgICAgIGNvbnN0IHdvcmtzcGFjZVByZWZpeCA9IGdldE1hbmFnZWRXb3Jrc3BhY2VQcmVmaXgoZW50cnkpO1xuICAgICAgaWYgKHdvcmtzcGFjZVByZWZpeCA9PT0gdW5kZWZpbmVkIHx8IHN0YWxlUHJlZml4ZXMuaGFzKHdvcmtzcGFjZVByZWZpeCkpIGNvbnRpbnVlO1xuICAgICAgY29uc3QgaXNDb21wbGV0ZSA9IG1hbmFnZWRXb3Jrc3BhY2VJbmNsdWRlU3VmZml4ZXMuZXZlcnkoKHN1ZmZpeCkgPT5cbiAgICAgICAgb2xkSW5jbHVkZS5pbmNsdWRlcyhgJHt3b3Jrc3BhY2VQcmVmaXh9LyR7c3VmZml4fWApXG4gICAgICApO1xuICAgICAgY29uc3QgaXNTdGlsbEdlbmVyYXRlZCA9IG1hbmFnZWRXb3Jrc3BhY2VJbmNsdWRlU3VmZml4ZXMuc29tZSgoc3VmZml4KSA9PlxuICAgICAgICBnZW5lcmF0ZWRJbmNsdWRlLmhhcyhgJHt3b3Jrc3BhY2VQcmVmaXh9LyR7c3VmZml4fWApXG4gICAgICApO1xuICAgICAgaWYgKGlzQ29tcGxldGUgJiYgIWlzU3RpbGxHZW5lcmF0ZWQpIHN0YWxlUHJlZml4ZXMuYWRkKHdvcmtzcGFjZVByZWZpeCk7XG4gICAgfVxuICAgIGlmIChzdGFsZVByZWZpeGVzLnNpemUgPiAwKSB7XG4gICAgICBvbGRTZXR0aW5ncy5pbmNsdWRlID0gb2xkU2V0dGluZ3MuaW5jbHVkZS5maWx0ZXIoKGVudHJ5KSA9PiB7XG4gICAgICAgIGNvbnN0IHdvcmtzcGFjZVByZWZpeCA9IHR5cGVvZiBlbnRyeSA9PT0gJ3N0cmluZycgPyBnZXRNYW5hZ2VkV29ya3NwYWNlUHJlZml4KGVudHJ5KSA6IHVuZGVmaW5lZDtcbiAgICAgICAgcmV0dXJuIHdvcmtzcGFjZVByZWZpeCA9PT0gdW5kZWZpbmVkIHx8ICFzdGFsZVByZWZpeGVzLmhhcyh3b3Jrc3BhY2VQcmVmaXgpO1xuICAgICAgfSk7XG4gICAgfVxuICB9XG4gIGlmICghQXJyYXkuaXNBcnJheShvbGRTZXR0aW5ncy5leGNsdWRlKSkgcmV0dXJuO1xuICBjb25zdCBnZW5lcmF0ZWRFeGNsdWRlID0gbmV3IFNldChuZXdTZXR0aW5ncy5leGNsdWRlKTtcbiAgY29uc3Qgd29ya3NwYWNlRGlyUGF0aHMgPSBjb25maWcuZG9lc0NvbnRhaW5TdWJQYWNrYWdlSnNvbnNcbiAgICA/IGdldFdvcmtzcGFjZVN1YkRpclBhdGhzKGNvbmZpZykubWFwKCh3b3Jrc3BhY2VEaXJQYXRoKSA9PlxuICAgICAgICBwYXRoLnJlbGF0aXZlKHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCksIHdvcmtzcGFjZURpclBhdGgpLnJlcGxhY2VBbGwoJ1xcXFwnLCAnLycpXG4gICAgICApXG4gICAgOiBbXTtcbiAgb2xkU2V0dGluZ3MuZXhjbHVkZSA9IG9sZFNldHRpbmdzLmV4Y2x1ZGUuZmlsdGVyKChlbnRyeSkgPT4ge1xuICAgIGlmICh0eXBlb2YgZW50cnkgIT09ICdzdHJpbmcnIHx8IGdlbmVyYXRlZEV4Y2x1ZGUuaGFzKGVudHJ5KSkgcmV0dXJuIHRydWU7XG4gICAgaWYgKGVudHJ5LmVuZHNXaXRoKCcvdGVzdC9maXh0dXJlcycpKSB7XG4gICAgICByZXR1cm4gIXN0YWxlUHJlZml4ZXMuaGFzKGVudHJ5LnNsaWNlKDAsIC0nL3Rlc3QvZml4dHVyZXMnLmxlbmd0aCkpO1xuICAgIH1cbiAgICAvLyBBIGZyYW1ld29yayBhcHAgZXhjbHVkZSAoYDx3b3Jrc3BhY2U+L2FwcGAsIGA8d29ya3NwYWNlPi9zcmMvYXBwYCkgZm9yIGEgc3RpbGwtZGVjbGFyZWRcbiAgICAvLyB3b3Jrc3BhY2UgaXMgcHJ1bmVkIGJ5IGNvdmVyc1dvcmtzcGFjZURpciBiZWxvdyB3aGVuIG5vIGxvbmdlciBnZW5lcmF0ZWQ7IHRoaXMgY2F0Y2hlcyB0aGVcbiAgICAvLyByZW1haW5pbmcgY2FzZSwgd2hlcmUgdGhlIHdvcmtzcGFjZSBpdHNlbGYgd2FzIHJlbW92ZWQgYW5kIGl0cyBwcmVmaXggaXMgdGhlcmVmb3JlIHN0YWxlLlxuICAgIC8vIChBIHdyb25nIHN1ZmZpeCBzdHJpcCB5aWVsZHMgYSBwcmVmaXggYWJzZW50IGZyb20gc3RhbGVQcmVmaXhlcywgc28gdGVzdGluZyBldmVyeSBuYW1lIGlzIHNhZmUuKVxuICAgIGlmIChcbiAgICAgIGZyYW1ld29ya0FwcERpck5hbWVzLnNvbWUoXG4gICAgICAgIChhcHBEaXJOYW1lKSA9PiBlbnRyeS5lbmRzV2l0aChgLyR7YXBwRGlyTmFtZX1gKSAmJiBzdGFsZVByZWZpeGVzLmhhcyhlbnRyeS5zbGljZSgwLCAtKGFwcERpck5hbWUubGVuZ3RoICsgMSkpKVxuICAgICAgKVxuICAgICkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICByZXR1cm4gIWNvdmVyc1dvcmtzcGFjZURpcihlbnRyeSwgd29ya3NwYWNlRGlyUGF0aHMpO1xuICB9KTtcbn1cblxuLy8gV2hldGhlciBhbiBleGNsdWRlIGVudHJ5IGlzIGEgd29ya3NwYWNlIG5lZ2F0aW9uIChgIWFwcHMvZXhjbHVkZWRgKSB3aG9zZSBuZWdhdGlvbiBpcyBnb25lOiB0aGVcbi8vIGRpcmVjdG9yeSBpcyBhIHdvcmtzcGFjZSBhZ2FpbiBhbmQgbXVzdCByZS1lbnRlciB0aGUgcm9vdCBwcm9qZWN0LiB3YmZ5IHdyaXRlcyBzdWNoIGEgbmVnYXRpb24gYXNcbi8vIGEgZGlyZWN0b3J5IHBhdGgsIGFzIGEgZGlyZWN0b3J5IFBBVFRFUk4gd2hlbiBpdCBleGNsdWRlcyBleGFjdGx5IHdoYXQgaXQgbWF0Y2hlcyAoYGFwcHMvKmJgKSwgb3Jcbi8vIGFzIGFuIGFuY2VzdG9yJ3MgcGFja2FnZS1vd25lZCBzdWJwYXRocyAoYGFwcHMveC9zcmNgKSDigJQgc28gdGhlIGVudHJ5IG1heSBjb3ZlciBhIGRpc2NvdmVyZWRcbi8vIHdvcmtzcGFjZSBkaXJlY3Rvcnkgb3Igc2l0IHVuZGVyIG9uZS4gQSBnbG9ic3RhciBzZWdtZW50IG1hcmtzIGEgaHlnaWVuZSBnbG9iIChub2RlX21vZHVsZXMsIGUyZVxuLy8gYW5kIGZyaWVuZHMpLCB3aGljaCBpcyBuZXZlciBuZWdhdGlvbi1kZXJpdmVkIGFuZCBtdXN0IHN1cnZpdmUuXG5mdW5jdGlvbiBjb3ZlcnNXb3Jrc3BhY2VEaXIoZW50cnk6IHN0cmluZywgd29ya3NwYWNlRGlyUGF0aHM6IHJlYWRvbmx5IHN0cmluZ1tdKTogYm9vbGVhbiB7XG4gIGlmIChlbnRyeS5zcGxpdCgnLycpLmluY2x1ZGVzKCcqKicpKSByZXR1cm4gZmFsc2U7XG4gIGNvbnN0IHJlZ2V4U291cmNlID0gZW50cnlcbiAgICAuc3BsaXQoJy8nKVxuICAgIC5tYXAoKHNlZ21lbnQpID0+XG4gICAgICBzZWdtZW50XG4gICAgICAgIC5yZXBsYWNlQWxsKC9bLiteJHt9KCl8W1xcXVxcXFxdL2d1LCBTdHJpbmcucmF3YFxcJCZgKVxuICAgICAgICAucmVwbGFjZUFsbCgnKicsICdbXi9dKicpXG4gICAgICAgIC5yZXBsYWNlQWxsKCc/JywgJ1teL10nKVxuICAgIClcbiAgICAuam9pbignLycpO1xuICBjb25zdCBlbnRyeVBhdHRlcm4gPSBuZXcgUmVnRXhwKGBeJHtyZWdleFNvdXJjZX0oPzovLiopPyRgLCAndScpO1xuICByZXR1cm4gd29ya3NwYWNlRGlyUGF0aHMuc29tZShcbiAgICAod29ya3NwYWNlRGlyUGF0aCkgPT4gZW50cnlQYXR0ZXJuLnRlc3Qod29ya3NwYWNlRGlyUGF0aCkgfHwgZW50cnkuc3RhcnRzV2l0aChgJHt3b3Jrc3BhY2VEaXJQYXRofS9gKVxuICApO1xufVxuXG5mdW5jdGlvbiBnZXRNYW5hZ2VkV29ya3NwYWNlUHJlZml4KGVudHJ5OiBzdHJpbmcpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBjb25zdCBtYXRjaGVkU3VmZml4ID0gbWFuYWdlZFdvcmtzcGFjZUluY2x1ZGVTdWZmaXhlcy5maW5kKChzdWZmaXgpID0+IGVudHJ5LmVuZHNXaXRoKGAvJHtzdWZmaXh9YCkpO1xuICBpZiAoIW1hdGNoZWRTdWZmaXgpIHJldHVybiB1bmRlZmluZWQ7XG4gIGNvbnN0IHdvcmtzcGFjZVByZWZpeCA9IGVudHJ5LnNsaWNlKDAsIC0obWF0Y2hlZFN1ZmZpeC5sZW5ndGggKyAxKSk7XG4gIHJldHVybiB3b3Jrc3BhY2VQcmVmaXggPT09ICcnID8gdW5kZWZpbmVkIDogd29ya3NwYWNlUHJlZml4O1xufVxuXG5hc3luYyBmdW5jdGlvbiBub3JtYWxpemVGcmFtZXdvcmtUc2NvbmZpZyhjb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgLy8gTmV4dC9CbGl0eiBvd24gdGhlaXIgdHNjb25maWcgc2hhcGUsIGJ1dCBUeXBlU2NyaXB0IDYgbm8gbG9uZ2VyIGFjY2VwdHNcbiAgLy8gbm9kZTEwIHJlc29sdmVyIHNwZWxsaW5ncyB0aGF0IG9sZGVyIHByb2plY3RzIGNvbW1vbmx5IGluaGVyaXRlZC5cbiAgY29uc3QgZmlsZVBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICd0c2NvbmZpZy5qc29uJyk7XG4gIGNvbnN0IGV4aXN0aW5nQ29udGVudCA9IGF3YWl0IGZzVXRpbC5yZWFkRmlsZUlmRXhpc3RzKGZpbGVQYXRoKTtcbiAgaWYgKGV4aXN0aW5nQ29udGVudCA9PT0gdW5kZWZpbmVkIHx8IGpzb25jVXRpbC5pc1RyaXZpYU9ubHkoZXhpc3RpbmdDb250ZW50KSkgcmV0dXJuO1xuICBjb25zdCBzZXR0aW5ncyA9IGpzb25jVXRpbC5wYXJzZU9iamVjdElnbm9yaW5nRXJyb3I8VHNDb25maWdKc29uPihleGlzdGluZ0NvbnRlbnQpO1xuICBpZiAoIXNldHRpbmdzKSB7XG4gICAgY29uc29sZS53YXJuKGBTa2lwcGVkIGNsZWFuaW5nIHVwICR7ZmlsZVBhdGh9IGJlY2F1c2UgdGhlIGV4aXN0aW5nIGNvbnRlbnQgaXMgbm90IHBhcnNhYmxlIGFzIEpTT05DLmApO1xuICAgIHJldHVybjtcbiAgfVxuICBjb25zdCBvcmlnaW5hbFNldHRpbmdzSnNvbiA9IEpTT04uc3RyaW5naWZ5KHNldHRpbmdzKTtcbiAgbm9ybWFsaXplTmV4dFRzY29uZmlnTW9kdWxlU2V0dGluZ3Moc2V0dGluZ3MpO1xuICBub3JtYWxpemVOZXh0VHNjb25maWdQYXRoQWxpYXNlcyhzZXR0aW5ncy5jb21waWxlck9wdGlvbnMpO1xuICBhZGRTY3JpcHRzSW5jbHVkZUZvckZyYW1ld29ya1Byb2plY3Qoc2V0dGluZ3MpO1xuICBhZGRVbmRpY2lUeXBlc1BhdGhNYXBwaW5nKHNldHRpbmdzLCBjb25maWcpO1xuICAvLyBTa2lwIHRoZSB3cml0ZSB3aGVuIG5vdGhpbmcgY2hhbmdlcyBzZW1hbnRpY2FsbHksIHNvIEpTT05DIGNvbW1lbnRzIGFuZCBmb3JtYXR0aW5nIGluIGFuXG4gIC8vIGFscmVhZHktY2xlYW4gdHNjb25maWcuanNvbiBzdXJ2aXZlIHdiZnkgcnVucy5cbiAgaWYgKEpTT04uc3RyaW5naWZ5KHNldHRpbmdzKSA9PT0gb3JpZ2luYWxTZXR0aW5nc0pzb24pIHJldHVybjtcbiAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzVXRpbC5nZW5lcmF0ZUZpbGUoZmlsZVBhdGgsIEpTT04uc3RyaW5naWZ5KHNldHRpbmdzLCB1bmRlZmluZWQsIDIpKSk7XG59XG5cbi8qKlxuICogYnVuLXR5cGVzIHJlZmVyZW5jZXMgdW5kaWNpLXR5cGVzIHdpdGhvdXQgZGVjbGFyaW5nIGl0IGFzIGEgZGVwZW5kZW5jeSAob3Zlbi1zaC9idW4jMjI4MDUpLCBzb1xuICogQnVuJ3MgaXNvbGF0ZWQgbGlua2VyIChlc3BlY2lhbGx5IHdpdGggdGhlIGdsb2JhbCBzdG9yZSBvdXRzaWRlIHRoZSByZXBvc2l0b3J5KSBjYW5ub3QgcmVzb2x2ZVxuICogaXQgZnJvbSBidW4tdHlwZXMnIGxvY2F0aW9uLCB3aGljaCBzaWxlbnRseSBkZWdyYWRlcyBnbG9iYWwgZmV0Y2ggdHlwZXMgc3VjaCBhcyBSZXNwb25zZS4gTWFwIGl0XG4gKiB0byB0aGUgY29weSB0aGF0IGJ1bmZpZy50b21sJ3MgcHVibGljSG9pc3RQYXR0ZXJuIHBsYWNlcyBpbiB0aGUgcm9vdCBub2RlX21vZHVsZXMuXG4gKi9cbmZ1bmN0aW9uIGFkZFVuZGljaVR5cGVzUGF0aE1hcHBpbmcoc2V0dGluZ3M6IFRzQ29uZmlnSnNvbiwgY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogdm9pZCB7XG4gIC8vIE1hcCB1bmRpY2ktdHlwZXMgb25seSB3aGVuIGJ1bi10eXBlcyBhY3R1YWxseSBsb2FkczogYW4gZXhwbGljaXQgYHR5cGVzYCBsaXN0IGxvYWRzIGl0IGlmZiBpdFxuICAvLyBjb250YWlucyBcImJ1blwiIChldmVuIG9uIFJlYWN0IE5hdGl2ZSwgd2hvc2UgcHJvamVjdHMgbWF5IG9wdCBpbiBieSBoYW5kKTsgd2l0aCBgdHlwZXNgXG4gIC8vIG9taXR0ZWQsIFR5cGVTY3JpcHQncyBhdXRvbWF0aWMgQHR5cGVzIGluY2x1c2lvbiBsb2FkcyBpdCBiZWNhdXNlIHdiZnkgaW5zdGFsbHMgQHR5cGVzL2J1blxuICAvLyBmb3IgZXZlcnkgVHlwZVNjcmlwdCBwcm9qZWN0IGV4Y2VwdCBSZWFjdCBOYXRpdmUsIHdoaWNoIHVzZXMgQHRzY29uZmlnL3JlYWN0LW5hdGl2ZSBpbnN0ZWFkLlxuICBjb25zdCB0eXBlcyA9IHNldHRpbmdzLmNvbXBpbGVyT3B0aW9ucz8udHlwZXM7XG4gIGlmICh0eXBlcyA/ICF0eXBlcy5pbmNsdWRlcygnYnVuJykgOiBjb25maWcuZGVwZW5kaW5nLnJlYWN0TmF0aXZlKSByZXR1cm47XG4gIGNvbnN0IGNvcnJlY3RNYXBwaW5nID0gYCR7Z2V0Um9vdERpcihjb25maWcpfS9ub2RlX21vZHVsZXMvdW5kaWNpLXR5cGVzL2luZGV4LmQudHNgO1xuICBjb25zdCBleGlzdGluZ01hcHBpbmcgPSBzZXR0aW5ncy5jb21waWxlck9wdGlvbnM/LnBhdGhzPy5bJ3VuZGljaS10eXBlcyddO1xuICBpZiAoZXhpc3RpbmdNYXBwaW5nKSB7XG4gICAgLy8gUmV3cml0ZSB0aGUgZ2VuZXJhdGVkIG1hcHBpbmcgd2hlbiBhIHdvcmtzcGFjZSBtb3ZlcyB0byBhIGRpZmZlcmVudCByb290IGRlcHRoLiBBbnkgb3RoZXJcbiAgICAvLyB2YWx1ZSBpcyBhIGRlbGliZXJhdGUgcmVwby1sb2NhbCBtYXBwaW5nIChlLmcuIHBhdGNoZWQgdHlwZXMpIGFuZCBtdXN0IGJlIGtlcHQuXG4gICAgaWYgKFxuICAgICAgZXhpc3RpbmdNYXBwaW5nLmxlbmd0aCA9PT0gMSAmJlxuICAgICAgdHlwZW9mIGV4aXN0aW5nTWFwcGluZ1swXSA9PT0gJ3N0cmluZycgJiZcbiAgICAgIC8oPzpefFxcLylub2RlX21vZHVsZXNcXC91bmRpY2ktdHlwZXNcXC9pbmRleFxcLmRcXC50cyQvdS50ZXN0KGV4aXN0aW5nTWFwcGluZ1swXSlcbiAgICApIHtcbiAgICAgIHNldHRpbmdzLmNvbXBpbGVyT3B0aW9ucyEucGF0aHMhWyd1bmRpY2ktdHlwZXMnXSA9IFtjb3JyZWN0TWFwcGluZ107XG4gICAgfVxuICAgIHJldHVybjtcbiAgfVxuXG4gIHNldHRpbmdzLmNvbXBpbGVyT3B0aW9ucyA/Pz0ge307XG4gIHNldHRpbmdzLmNvbXBpbGVyT3B0aW9ucy5wYXRocyA9IHtcbiAgICAuLi5zZXR0aW5ncy5jb21waWxlck9wdGlvbnMucGF0aHMsXG4gICAgJ3VuZGljaS10eXBlcyc6IFtjb3JyZWN0TWFwcGluZ10sXG4gIH07XG59XG5cbmZ1bmN0aW9uIGFkZFNjcmlwdHNJbmNsdWRlRm9yRnJhbWV3b3JrUHJvamVjdChzZXR0aW5nczogVHNDb25maWdKc29uKTogdm9pZCB7XG4gIC8vIE9taXR0aW5nIGluY2x1ZGUgbGV0cyBmcmFtZXdvcmsgdHNjb25maWdzIGtlZXAgVHlwZVNjcmlwdCdzIGRlZmF1bHRcbiAgLy8gXCJhbGwgVFMvVFNYIGZpbGVzXCIgYmVoYXZpb3IsIHdoaWNoIGFscmVhZHkgY292ZXJzIHNjcmlwdHMuXG4gIGlmICghc2V0dGluZ3MuaW5jbHVkZSkgcmV0dXJuO1xuICBpZiAoc2V0dGluZ3MuaW5jbHVkZS5pbmNsdWRlcygnc2NyaXB0cy8qKi8qJykpIHJldHVybjtcblxuICBzZXR0aW5ncy5pbmNsdWRlLnB1c2goJ3NjcmlwdHMvKiovKicpO1xuICBzZXR0aW5ncy5pbmNsdWRlLnNvcnQoKTtcbn1cblxuZnVuY3Rpb24gbm9ybWFsaXplTmV4dFRzY29uZmlnTW9kdWxlU2V0dGluZ3Moc2V0dGluZ3M6IFRzQ29uZmlnSnNvbik6IHZvaWQge1xuICBjb25zdCBjb21waWxlck9wdGlvbnMgPSBzZXR0aW5ncy5jb21waWxlck9wdGlvbnM7XG4gIGlmICghY29tcGlsZXJPcHRpb25zKSByZXR1cm47XG4gIGNvbnN0IG1vZHVsZVJlc29sdXRpb24gPSBsb3dlckNhc2VTZXR0aW5nKGNvbXBpbGVyT3B0aW9ucy5tb2R1bGVSZXNvbHV0aW9uKTtcbiAgaWYgKG1vZHVsZVJlc29sdXRpb24gPT09ICdub2RlJyB8fCBtb2R1bGVSZXNvbHV0aW9uID09PSAnbm9kZTEwJyB8fCBtb2R1bGVSZXNvbHV0aW9uID09PSB1bmRlZmluZWQpIHtcbiAgICBpZiAoc2V0dGluZ3MuZXh0ZW5kcykge1xuICAgICAgLy8gQW4gZXh0ZW5kZWQgY29uZmlnIG1heSBhbHJlYWR5IHN1cHBseSBhIHZhbGlkIG1vZHVsZS9yZXNvbHZlciBwYWlyLCBzbyBvbmx5XG4gICAgICAvLyByZW1vdmUgdGhlIHJlbW92ZWQtaW4tVFM2IG5vZGUxMCBzcGVsbGluZ3MgaW5zdGVhZCBvZiBmb3JjaW5nIGJ1bmRsZXIgb24gaXQuXG4gICAgICBkZWxldGUgY29tcGlsZXJPcHRpb25zLm1vZHVsZVJlc29sdXRpb247XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIE5leHQuanMgd3JpdGVzIFwibm9kZVwiIGR1cmluZyBidWlsZCB3aGVuIHRoaXMgb3B0aW9uIGlzIG1pc3NpbmcsIGJ1dFxuICAgICAgLy8gdHNnb2xpbnQgdHJlYXRzIHRoYXQgc3BlbGxpbmcgYXMgdGhlIHJlbW92ZWQgbm9kZTEwIHJlc29sdmVyLlxuICAgICAgY29tcGlsZXJPcHRpb25zLm1vZHVsZVJlc29sdXRpb24gPSAnYnVuZGxlcic7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIG5vcm1hbGl6ZU5leHRUc2NvbmZpZ1BhdGhBbGlhc2VzKGNvbXBpbGVyT3B0aW9uczogVHNDb25maWdKc29uLkNvbXBpbGVyT3B0aW9ucyB8IHVuZGVmaW5lZCk6IHZvaWQge1xuICBpZiAoIWNvbXBpbGVyT3B0aW9ucykgcmV0dXJuO1xuXG4gIC8vIHRzZ29saW50IGZvbGxvd3MgVHlwZVNjcmlwdCA2IHZhbGlkYXRpb24sIHdoZXJlIGJhc2VVcmwgaXMgcmVtb3ZlZCBhbmRcbiAgLy8gcGF0aCB0YXJnZXRzIG11c3QgYmUgZXhwbGljaXRseSByZWxhdGl2ZS4gTmV4dC5qcyBzdGlsbCBhY2NlcHRzIHRoZSBhbGlhc1xuICAvLyBzaGFwZSBhZnRlciBlYWNoIHRhcmdldCBpcyB3cml0dGVuIHdpdGggYSBsZWFkaW5nIC4vLlxuICBkZWxldGUgY29tcGlsZXJPcHRpb25zLmJhc2VVcmw7XG4gIGlmICghY29tcGlsZXJPcHRpb25zLnBhdGhzKSByZXR1cm47XG5cbiAgZm9yIChjb25zdCBbYWxpYXMsIHRhcmdldHNdIG9mIE9iamVjdC5lbnRyaWVzKGNvbXBpbGVyT3B0aW9ucy5wYXRocykpIHtcbiAgICBjb21waWxlck9wdGlvbnMucGF0aHNbYWxpYXNdID0gbm9ybWFsaXplUGF0aEFsaWFzVGFyZ2V0cyh0YXJnZXRzKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBub3JtYWxpemVQYXRoQWxpYXNUYXJnZXRzKHRhcmdldHM6IHN0cmluZ1tdKTogc3RyaW5nW10ge1xuICByZXR1cm4gdGFyZ2V0cy5tYXAoKHRhcmdldCkgPT4ge1xuICAgIGlmICh0YXJnZXQuc3RhcnRzV2l0aCgnLi8nKSB8fCB0YXJnZXQuc3RhcnRzV2l0aCgnLi4vJykgfHwgcGF0aC5pc0Fic29sdXRlKHRhcmdldCkpIHJldHVybiB0YXJnZXQ7XG4gICAgcmV0dXJuIGAuLyR7dGFyZ2V0fWA7XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBnZXRSb290RGlyKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IHN0cmluZyB7XG4gIGlmIChjb25maWcuaXNSb290KSByZXR1cm4gJy4nO1xuICAvLyBUaGUgdW5kaWNpLXR5cGVzIHBhdGggbWFwcGluZyBtdXN0IHJlYWNoIHRoZSBtb25vcmVwbyByb290J3Mgbm9kZV9tb2R1bGVzIChidW5maWcudG9tbCdzXG4gIC8vIHB1YmxpY0hvaXN0UGF0dGVybiBob2lzdHMgdGhlIHBhY2thZ2UgdGhlcmUpLCBhbmQgd29ya3NwYWNlIHBhdHRlcm5zIG1heSBiZSBhcmJpdHJhcmlseSBkZWVwXG4gIC8vIChlLmcuIGBleGFtcGxlcy8qKmApLCBzbyBhIGZpeGVkIHR3by1sZXZlbCBwcm9iZSBpcyBub3QgZW5vdWdoLiBQcmVmZXIgdGhlIG5lYXJlc3QgYW5jZXN0b3JcbiAgLy8gbWFuaWZlc3QgdGhhdCBkZWNsYXJlcyB3b3Jrc3BhY2VzICh0aGUgbW9ub3JlcG8gcm9vdCk7IG90aGVyd2lzZSBmYWxsIGJhY2sgdG8gdGhlIG5lYXJlc3RcbiAgLy8gYW5jZXN0b3IgbWFuaWZlc3QuIFN0b3AgYXQgdGhlIGZpcnN0IGdpdCByZXBvc2l0b3J5IGJvdW5kYXJ5IHNvIGFuIHVucmVsYXRlZCBlbmNsb3NpbmdcbiAgLy8gcmVwb3NpdG9yeSdzIG1hbmlmZXN0IGNhbiBuZXZlciBiZSBjaG9zZW4uXG4gIGNvbnN0IGRpclBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgpO1xuICBsZXQgcm9vdERpclBhdGg6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgZm9yIChsZXQgYW5jZXN0b3JEaXJQYXRoID0gcGF0aC5kaXJuYW1lKGRpclBhdGgpOyA7IGFuY2VzdG9yRGlyUGF0aCA9IHBhdGguZGlybmFtZShhbmNlc3RvckRpclBhdGgpKSB7XG4gICAgY29uc3QgbWFuaWZlc3RQYXRoID0gcGF0aC5yZXNvbHZlKGFuY2VzdG9yRGlyUGF0aCwgJ3BhY2thZ2UuanNvbicpO1xuICAgIGlmIChmcy5leGlzdHNTeW5jKG1hbmlmZXN0UGF0aCkpIHtcbiAgICAgIHJvb3REaXJQYXRoID8/PSBhbmNlc3RvckRpclBhdGg7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBtYW5pZmVzdCA9IEpTT04ucGFyc2UoZnMucmVhZEZpbGVTeW5jKG1hbmlmZXN0UGF0aCwgJ3V0ZjgnKSkgYXMgUGFja2FnZUpzb247XG4gICAgICAgIC8vIEJ1biBuby1vcCBwYXR0ZXJucyAoZS5nLiBgd29ya3NwYWNlczogW1wiXCJdYCkgZG8gbm90IG1ha2UgYSBtYW5pZmVzdCBhIHdvcmtzcGFjZSByb290LlxuICAgICAgICBpZiAoZ2V0TWVhbmluZ2Z1bERlY2xhcmVkV29ya3NwYWNlUGF0dGVybnMobWFuaWZlc3Qud29ya3NwYWNlcykubGVuZ3RoID4gMCkge1xuICAgICAgICAgIHJvb3REaXJQYXRoID0gYW5jZXN0b3JEaXJQYXRoO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9IGNhdGNoIHtcbiAgICAgICAgLy8gQW4gdW5wYXJzYWJsZSBtYW5pZmVzdCBzdGlsbCBtYXJrcyBhIHByb2plY3QgZGlyZWN0b3J5OyBrZWVwIGNsaW1iaW5nIGZvciBhIHdvcmtzcGFjZSByb290LlxuICAgICAgfVxuICAgIH1cbiAgICBjb25zdCBpc1JlcG9Cb3VuZGFyeSA9IGZzLmV4aXN0c1N5bmMocGF0aC5yZXNvbHZlKGFuY2VzdG9yRGlyUGF0aCwgJy5naXQnKSk7XG4gICAgY29uc3QgaXNGaWxlc3lzdGVtUm9vdCA9IGFuY2VzdG9yRGlyUGF0aCA9PT0gcGF0aC5kaXJuYW1lKGFuY2VzdG9yRGlyUGF0aCk7XG4gICAgaWYgKGlzUmVwb0JvdW5kYXJ5IHx8IGlzRmlsZXN5c3RlbVJvb3QpIGJyZWFrO1xuICB9XG4gIGlmICghcm9vdERpclBhdGgpIHJldHVybiAnLic7XG4gIHJldHVybiBwYXRoLnJlbGF0aXZlKGRpclBhdGgsIHJvb3REaXJQYXRoKS5yZXBsYWNlQWxsKCdcXFxcJywgJy8nKSB8fCAnLic7XG59XG5cbmZ1bmN0aW9uIG1lcmdlVHNjb25maWdFeHRlbmRzKFxuICBnZW5lcmF0ZWRFeHRlbmRzOiBUc0NvbmZpZ0pzb25bJ2V4dGVuZHMnXSxcbiAgZXhpc3RpbmdFeHRlbmRzOiBUc0NvbmZpZ0pzb25bJ2V4dGVuZHMnXVxuKTogVHNDb25maWdKc29uWydleHRlbmRzJ10ge1xuICBjb25zdCBtZXJnZWRFeHRlbmRzID0gWy4uLm5vcm1hbGl6ZUV4dGVuZHMoZ2VuZXJhdGVkRXh0ZW5kcyksIC4uLm5vcm1hbGl6ZUV4dGVuZHMoZXhpc3RpbmdFeHRlbmRzKV07XG4gIGNvbnN0IHVuaXF1ZUV4dGVuZHMgPSBbLi4ubmV3IFNldChtZXJnZWRFeHRlbmRzKV07XG4gIGlmICh1bmlxdWVFeHRlbmRzLmxlbmd0aCA9PT0gMCkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgaWYgKHVuaXF1ZUV4dGVuZHMubGVuZ3RoID09PSAxKSByZXR1cm4gdW5pcXVlRXh0ZW5kc1swXTtcbiAgcmV0dXJuIHVuaXF1ZUV4dGVuZHM7XG59XG5cbmZ1bmN0aW9uIGFkZEluY2x1ZGVQYXRoKHNldHRpbmdzOiBUc0NvbmZpZ0pzb24sIGRpclBhdGg6IHN0cmluZyk6IHZvaWQge1xuICBzZXR0aW5ncy5pbmNsdWRlID8/PSBbXTtcbiAgaWYgKCFzZXR0aW5ncy5pbmNsdWRlLmluY2x1ZGVzKGRpclBhdGgpKSB7XG4gICAgc2V0dGluZ3MuaW5jbHVkZS5wdXNoKGRpclBhdGgpO1xuICB9XG59XG5cbmZ1bmN0aW9uIG5vcm1hbGl6ZUV4dGVuZHModmFsdWU6IFRzQ29uZmlnSnNvblsnZXh0ZW5kcyddKTogc3RyaW5nW10ge1xuICBpZiAoIXZhbHVlKSByZXR1cm4gW107XG4gIHJldHVybiBBcnJheS5pc0FycmF5KHZhbHVlKSA/IHZhbHVlIDogW3ZhbHVlXTtcbn1cblxuZnVuY3Rpb24gbm9ybWFsaXplU3RyaW5nQXJyYXkodmFsdWU6IHVua25vd24pOiBzdHJpbmdbXSB7XG4gIGlmICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnKSByZXR1cm4gW3ZhbHVlXTtcbiAgaWYgKCFBcnJheS5pc0FycmF5KHZhbHVlKSkgcmV0dXJuIFtdO1xuICByZXR1cm4gdmFsdWUuZmlsdGVyKChpdGVtKTogaXRlbSBpcyBzdHJpbmcgPT4gdHlwZW9mIGl0ZW0gPT09ICdzdHJpbmcnKTtcbn1cblxuZnVuY3Rpb24gc2hvdWxkRGVsZXRlVHlwZVJvb3RzKHR5cGVOYW1lczogc3RyaW5nW10pOiBib29sZWFuIHtcbiAgLy8gT25seSBnZW5lcmF0ZWQgcGFja2FnZS1vd25lZCB0ZXN0IHR5cGVzIHNob3VsZCB0cmlnZ2VyIHRoaXMuIFVzZXItZGVmaW5lZCBzbGFzaC1iYXNlZFxuICAvLyBlbnRyaWVzIG1heSBpbnRlbnRpb25hbGx5IHJlbHkgb24gY3VzdG9tIHR5cGVSb290cyBhbmQgc2hvdWxkIGJlIHByZXNlcnZlZCBhcy1pcy5cbiAgcmV0dXJuIHR5cGVOYW1lcy5zb21lKCh0eXBlTmFtZSkgPT4gdHlwZU5hbWUgPT09ICdjeXByZXNzJyB8fCB0eXBlTmFtZS5pbmNsdWRlcygnLycpKTtcbn1cblxuZnVuY3Rpb24gZmlsdGVyRXhpc3RpbmdUeXBlcyhleGlzdGluZ1R5cGVzOiBzdHJpbmdbXSwgZ2VuZXJhdGVkVHlwZXM6IHN0cmluZ1tdKTogc3RyaW5nW10ge1xuICBjb25zdCBnZW5lcmF0ZWRUeXBlU2V0ID0gbmV3IFNldChnZW5lcmF0ZWRUeXBlcyk7XG4gIHJldHVybiBleGlzdGluZ1R5cGVzLmZpbHRlcigodHlwZU5hbWUpID0+IHtcbiAgICAvLyB3YmZ5IG93bnMgdGhlc2UgcGFja2FnZS1wcm92aWRlZCB0ZXN0IGdsb2JhbHMuIERyb3Agc3RhbGUgZW50cmllcyB3aGVuIHRoZVxuICAgIC8vIGNvcnJlc3BvbmRpbmcgZGVwZW5kZW5jeSBpcyBubyBsb25nZXIgcHJlc2VudCBzbyBUeXBlU2NyaXB0IHdvbid0IHJlcXVpcmVcbiAgICAvLyBtaXNzaW5nIHBhY2thZ2VzIHN1Y2ggYXMgdml0ZXN0LlxuICAgIGlmIChpc0dlbmVyYXRlZFRlc3RHbG9iYWxUeXBlKHR5cGVOYW1lKSAmJiAhZ2VuZXJhdGVkVHlwZVNldC5oYXModHlwZU5hbWUpKSByZXR1cm4gZmFsc2U7XG4gICAgcmV0dXJuIHRydWU7XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBpc0dlbmVyYXRlZFRlc3RHbG9iYWxUeXBlKHR5cGVOYW1lOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgcmV0dXJuIHR5cGVOYW1lID09PSAnY3lwcmVzcycgfHwgdHlwZU5hbWUgPT09ICdqZXN0JyB8fCB0eXBlTmFtZSA9PT0gJ21vY2hhJyB8fCB0eXBlTmFtZSA9PT0gJ3ZpdGVzdC9nbG9iYWxzJztcbn1cblxuZnVuY3Rpb24gbG93ZXJDYXNlU2V0dGluZyh2YWx1ZTogdW5rbm93bik6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIHJldHVybiB0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnID8gdmFsdWUudG9Mb3dlckNhc2UoKSA6IHVuZGVmaW5lZDtcbn1cblxuZnVuY3Rpb24gcGlja0V4aXN0aW5nRW1pdE1ldGFkYXRhKFxuICBjb21waWxlck9wdGlvbnM6IFRzQ29uZmlnSnNvblsnY29tcGlsZXJPcHRpb25zJ11cbik6IFBpY2s8Tm9uTnVsbGFibGU8VHNDb25maWdKc29uWydjb21waWxlck9wdGlvbnMnXT4sICdkZWNsYXJhdGlvbicgfCAnZGVjbGFyYXRpb25NYXAnIHwgJ3NvdXJjZU1hcCc+IHtcbiAgY29uc3QgZW1pdE9wdGlvbnMgPSB7fSBhcyBQaWNrPFxuICAgIE5vbk51bGxhYmxlPFRzQ29uZmlnSnNvblsnY29tcGlsZXJPcHRpb25zJ10+LFxuICAgICdkZWNsYXJhdGlvbicgfCAnZGVjbGFyYXRpb25NYXAnIHwgJ3NvdXJjZU1hcCdcbiAgPjtcbiAgZm9yIChjb25zdCBrZXkgb2YgWydkZWNsYXJhdGlvbicsICdkZWNsYXJhdGlvbk1hcCcsICdzb3VyY2VNYXAnXSBhcyBjb25zdCkge1xuICAgIGNvbnN0IHZhbHVlID0gY29tcGlsZXJPcHRpb25zPy5ba2V5XTtcbiAgICBpZiAodmFsdWUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgZW1pdE9wdGlvbnNba2V5XSA9IHZhbHVlIGFzIG5ldmVyO1xuICAgIH1cbiAgfVxuICByZXR1cm4gZW1pdE9wdGlvbnM7XG59XG5cbmZ1bmN0aW9uIGdldEdlbmVyYXRlZFR5cGVzKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IHN0cmluZ1tdIHtcbiAgY29uc3QgdHlwZU5hbWVzID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gIGNvbnN0IGRlcGVuZGVuY2llcyA9IHtcbiAgICAuLi5jb25maWcucGFja2FnZUpzb24/LmRlcGVuZGVuY2llcyxcbiAgICAuLi5jb25maWcucGFja2FnZUpzb24/LmRldkRlcGVuZGVuY2llcyxcbiAgfTtcblxuICAvLyBSZWFjdCBOYXRpdmUgZ2V0cyBpdHMgYW1iaWVudCB0eXBlcyBmcm9tIEB0c2NvbmZpZy9yZWFjdC1uYXRpdmUgKHJlYWN0LW5hdGl2ZSwgamVzdCkuXG4gIGlmICghY29uZmlnLmRlcGVuZGluZy5yZWFjdE5hdGl2ZSkge1xuICAgIHR5cGVOYW1lcy5hZGQoJ2J1bicpO1xuICB9XG4gIGlmIChcbiAgICBkZXBlbmRlbmNpZXMuamVzdCB8fFxuICAgIGRlcGVuZGVuY2llc1snQGplc3QvZ2xvYmFscyddIHx8XG4gICAgZGVwZW5kZW5jaWVzWydqZXN0LWVudmlyb25tZW50LWpzZG9tJ10gfHxcbiAgICBkZXBlbmRlbmNpZXNbJ3RzLWplc3QnXVxuICApIHtcbiAgICB0eXBlTmFtZXMuYWRkKCdqZXN0Jyk7XG4gIH1cbiAgaWYgKGRlcGVuZGVuY2llcy52aXRlc3QpIHtcbiAgICB0eXBlTmFtZXMuYWRkKCd2aXRlc3QvZ2xvYmFscycpO1xuICB9XG4gIGlmIChkZXBlbmRlbmNpZXMubW9jaGEpIHtcbiAgICB0eXBlTmFtZXMuYWRkKCdtb2NoYScpO1xuICB9XG4gIGlmIChkZXBlbmRlbmNpZXMuY3lwcmVzcykge1xuICAgIHR5cGVOYW1lcy5hZGQoJ2N5cHJlc3MnKTtcbiAgfVxuXG4gIHJldHVybiBbLi4udHlwZU5hbWVzXTtcbn1cbiIsImltcG9ydCBvcyBmcm9tICdub2RlOm9zJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCBtZXJnZSBmcm9tICdkZWVwbWVyZ2UnO1xuXG5pbXBvcnQgeyBmc1V0aWwgfSBmcm9tICcuLi91dGlscy9mc1V0aWwuanMnO1xuaW1wb3J0IHsganNvbmNVdGlsIH0gZnJvbSAnLi4vdXRpbHMvanNvbmNVdGlsLmpzJztcblxuLyoqXG4gKiBUaGUgdXNlci1sZXZlbCBpbnN0cnVjdGlvbiBmaWxlIG9mIGVhY2ggc3VwcG9ydGVkIGFnZW50LCByZWxhdGl2ZSB0byB0aGUgaG9tZSBkaXJlY3RvcnkuIFRoZXNlXG4gKiBhcHBseSB0byBldmVyeSByZXBvc2l0b3J5IHRoZSBhZ2VudCB3b3JrcyBpbiwgc28gdGhleSBob2xkIG9ubHkgdGhlIGNvbnZlbnRpb25zIHRoYXQgYXJlIHRydWUgb25cbiAqIGV2ZXJ5IFdpbGxCb29zdGVyIGRldmVsb3BlciBtYWNoaW5lIHJhdGhlciB0aGFuIGluIGEgcGFydGljdWxhciByZXBvc2l0b3J5LlxuICovXG5jb25zdCB1c2VyQWdlbnRJbnN0cnVjdGlvbkZpbGVQYXRocyA9IFsnLmNvZGV4L0FHRU5UUy5tZCcsICcuY2xhdWRlL0NMQVVERS5tZCcsICcuZ2VtaW5pL0dFTUlOSS5tZCddIGFzIGNvbnN0O1xuXG4vLyBUaGlzIGNvbnRlbnQgaXMgbG9hZGVkIGludG8gZXZlcnkgYWdlbnQgc2Vzc2lvbiwgc28gaXQgaXMga2VwdCBhcyBzaG9ydCBhcyBpdCBjYW4gYmUgd2hpbGVcbi8vIHN0YXlpbmcgdW5hbWJpZ3VvdXM6IGUuZy4sIHRoZSBleGNsdWRlZCBvcmdhbml6YXRpb25zIGFyZSB3cml0dGVuIGFzIHNoZWxsIGJyYWNlIGV4cGFuc2lvbiwgd2hpY2hcbi8vIHRoZSBhZ2VudHMgcmVhZCBhcyBhIHBhdGggY29uZGl0aW9uIHdpdGhvdXQgYW55IHJ1bnRpbWUgbWF0Y2hpbmcuXG5jb25zdCB1c2VyQWdlbnRJbnN0cnVjdGlvbkNvbnRlbnQgPSBgLSBSZXBvcyBsaXZlIHVuZGVyIFxcYH4vZ2hxL2dpdGh1Yi5jb21cXGA7IGFsd2F5cyBjbG9uZSB3aXRoIFxcYGdocSBnZXQgLXBcXGAsIG5ldmVyIFxcYGdpdCBjbG9uZVxcYC5cbi0gTExNL0FJIGFnZW50IHJlc3BvbnNlcyBtYXkgdGFrZSAx4oCTMiBob3Vyczsgd2FpdCBwYXRpZW50bHksIGRvbid0IGFzc3VtZSBmYWlsdXJlLlxuLSBObyBBSSBhdHRyaWJ1dGlvbiAoZS5nLiwgXFxgQ28tQXV0aG9yZWQtQnlcXGAgdHJhaWxlcnMsIFwiR2VuZXJhdGVkIHdpdGggLi4uXCIgZm9vdGVycykgaW4gY29tbWl0cywgaXNzdWVzLCBvciBQUnMgdW5sZXNzIGV4cGxpY2l0bHkgcmVxdWVzdGVkLiBUaGlzIGhpZGVzIG5vdGhpbmc6IGlmIGFza2VkIHdoaWNoIEFJIGFnZW50IGRpZCB0aGUgd29yaywgYW5zd2VyIHRydXRoZnVsbHkuXG4tIE91dHNpZGUgXFxgfi9naHEvZ2l0aHViLmNvbS97V2lsbEJvb3N0ZXIsV2lsbEJvb3N0ZXJMYWJ9L1xcYCwgZm9sbG93IHRoZSByZXBvc2l0b3J5J3MgY29udHJpYnV0aW9uIGd1aWRlIChlLmcuLCBDT05UUklCVVRJTkcubWQsIFxcYC5naXRodWIvXFxgKSBhbmQgaXNzdWUvUFIgdGVtcGxhdGVzLCBtYXRjaCBpdHMgY29tbWl0IGFuZCBjb2RlIGNvbnZlbnRpb25zLCBhbmQgaG9ub3IgaXRzIHJ1bGVzIG9uIEFJLWFzc2lzdGVkIGNvbnRyaWJ1dGlvbnMuIFdyaXRlIGl0cyBpc3N1ZXMgYW5kIFBScyB3aXRoIG9ubHkgd2hhdCBhIHJldmlld2VyIHVuZmFtaWxpYXIgd2l0aCB0aGUgd29yayBuZWVkcyB0byB1bmRlcnN0YW5kIGFuZCBhc3Nlc3MgaXQsIGFzIGNvbmNpc2VseSBhcyB0aGF0IGNvbnRleHQgYWxsb3dzLlxuYDtcblxuLyoqXG4gKiBUaGUgdXNlci1sZXZlbCBzZXR0aW5ncyBtZXJnZWQgaW50byBlYWNoIGFnZW50J3MgSlNPTiBzZXR0aW5ncyBmaWxlLCByZWxhdGl2ZSB0byB0aGUgaG9tZVxuICogZGlyZWN0b3J5LlxuICpcbiAqIEV2ZXJ5IGFnZW50IHRoYXQgY2FycmllcyBmYWN0cyBmcm9tIG9uZSBzZXNzaW9uIGludG8gdGhlIG5leHQgaXMgdHVybmVkIG9mZiBoZXJlIGJlY2F1c2Ugc3VjaFxuICogbWVtb3J5IG1ha2VzIGEgc2Vzc2lvbiBkZXBlbmQgb24gaW52aXNpYmxlIG1hY2hpbmUtbG9jYWwgc3RhdGU6IGl0cyBiZWhhdmlvciBzdG9wcyBiZWluZ1xuICogcmVwcm9kdWNpYmxlIGFjcm9zcyBkZXZlbG9wZXJzIGFuZCBDSSwgYW5kIGEgc3RhbGUgb3Igd3JvbmcgbWVtb3J5IHNpbGVudGx5IG92ZXJyaWRlcyB0aGVcbiAqIGluc3RydWN0aW9uIGZpbGVzIGFib3ZlLiBDb2RleCBuZWVkcyBubyBlbnRyeSBiZWNhdXNlIGl0cyBtZW1vcmllcyBhcmUgb3B0LWluXG4gKiAoYFtmZWF0dXJlc10gbWVtb3JpZXMgPSB0cnVlYCBpbiBgfi8uY29kZXgvY29uZmlnLnRvbWxgKSwgc28gbGVhdmluZyB0aGF0IGZsYWcgdW5zZXQgaXMgZW5vdWdoLlxuICovXG5jb25zdCBhZ2VudFNldHRpbmdzID0gW1xuICB7XG4gICAgcmVsYXRpdmVQYXRoOiAnLmNsYXVkZS9zZXR0aW5ncy5qc29uJyxcbiAgICBhY2NlcHRzQ29tbWVudHM6IGZhbHNlLFxuICAgIC8qKlxuICAgICAqIENsYXVkZSBDb2RlIGluamVjdHMgaXRzIG93biBhdHRyaWJ1dGlvbiBkaXJlY3RpdmUgKGEgYENvLUF1dGhvcmVkLUJ5YCB0cmFpbGVyLCBhIFwiR2VuZXJhdGVkXG4gICAgICogd2l0aFwiIGZvb3RlciwgYW5kIGEgc2Vzc2lvbiBsaW5rKSBpbnRvIHRoZSB0b29sIGRlc2NyaXB0aW9ucyBhbmQgbWlkLXNlc3Npb24gcmVtaW5kZXJzLCBhbmRcbiAgICAgKiB0aGF0IGRpcmVjdGl2ZSBkZWNsYXJlcyBpdHNlbGYgdG8gcmVwbGFjZSBlYXJsaWVyIGd1aWRhbmNlLCBzbyB0aGUgaW5zdHJ1Y3Rpb24gZmlsZSBhbG9uZVxuICAgICAqIGNhbm5vdCBzdXBwcmVzcyBpdC4gT25seSB0aGlzIHNldHRpbmcgcmVtb3ZlcyB0aGUgZGlyZWN0aXZlIGF0IGl0cyBzb3VyY2UuIEF1dG8gbWVtb3J5IGlzIG9uXG4gICAgICogYnkgZGVmYXVsdCwgc28gaXQgbXVzdCBiZSB0dXJuZWQgb2ZmIGV4cGxpY2l0bHkuXG4gICAgICovXG4gICAgc2V0dGluZ3M6IHtcbiAgICAgIGF0dHJpYnV0aW9uOiB7XG4gICAgICAgIGNvbW1pdDogJycsXG4gICAgICAgIHByOiAnJyxcbiAgICAgICAgc2Vzc2lvblVybDogZmFsc2UsXG4gICAgICB9LFxuICAgICAgYXV0b01lbW9yeUVuYWJsZWQ6IGZhbHNlLFxuICAgIH0sXG4gIH0sXG4gIHtcbiAgICByZWxhdGl2ZVBhdGg6ICcuZ2VtaW5pL3NldHRpbmdzLmpzb24nLFxuICAgIC8vIEdlbWluaSBDTEkgc3RyaXBzIGNvbW1lbnRzIGJlZm9yZSBwYXJzaW5nIGl0cyBzZXR0aW5ncyBmaWxlLCB1bmxpa2UgQ2xhdWRlIENvZGUsIHdoaWNoXG4gICAgLy8gcmVqZWN0cyBhIGNvbW1lbnRlZCBmaWxlIGFzIG1hbGZvcm1lZC5cbiAgICBhY2NlcHRzQ29tbWVudHM6IHRydWUsXG4gICAgc2V0dGluZ3M6IHtcbiAgICAgIGV4cGVyaW1lbnRhbDoge1xuICAgICAgICBhdXRvTWVtb3J5OiBmYWxzZSxcbiAgICAgIH0sXG4gICAgfSxcbiAgfSxcbl0gYXMgY29uc3Q7XG5cbi8qKlxuICogT3ZlcndyaXRlcyB0aGUgdXNlci1sZXZlbCBpbnN0cnVjdGlvbiBmaWxlcyBvZiBldmVyeSBzdXBwb3J0ZWQgYWdlbnQgd2l0aCB0aGUgZml4ZWQgY29udGVudCBhbmRcbiAqIG1lcmdlcyB0aGUgZml4ZWQgc2V0dGluZ3MgaW50byBlYWNoIGFnZW50J3MgdXNlciBzZXR0aW5ncy4gUmV0dXJucyBmYWxzZSB3aGVuIGFueSBmaWxlIHdhc1xuICogc2tpcHBlZCAoZS5nLiBhIHN5bWxpbmtlZCBvciB1bnBhcnNhYmxlIGZpbGUpLCBzbyB0aGUgY29tbWFuZCBjYW4gZmFpbCBsb3VkbHkuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZW5lcmF0ZVVzZXJBZ2VudENvbmZpZ3MoKTogUHJvbWlzZTxib29sZWFuPiB7XG4gIGxldCBoYXNXcml0dGVuQWxsID0gdHJ1ZTtcbiAgZm9yIChjb25zdCByZWxhdGl2ZVBhdGggb2YgdXNlckFnZW50SW5zdHJ1Y3Rpb25GaWxlUGF0aHMpIHtcbiAgICBjb25zdCBoYXNXcml0dGVuID0gYXdhaXQgZnNVdGlsLmdlbmVyYXRlRmlsZShwYXRoLmpvaW4ob3MuaG9tZWRpcigpLCByZWxhdGl2ZVBhdGgpLCB1c2VyQWdlbnRJbnN0cnVjdGlvbkNvbnRlbnQpO1xuICAgIGhhc1dyaXR0ZW5BbGwgJiY9IGhhc1dyaXR0ZW47XG4gIH1cbiAgZm9yIChjb25zdCB7IGFjY2VwdHNDb21tZW50cywgcmVsYXRpdmVQYXRoLCBzZXR0aW5ncyB9IG9mIGFnZW50U2V0dGluZ3MpIHtcbiAgICAvLyBBd2FpdGVkIHNlcGFyYXRlbHk6IGAmJj1gIHdvdWxkIHNraXAgdGhlIG1lcmdlIG9uY2UgYW4gZWFybGllciBmaWxlIHdhcyBza2lwcGVkLlxuICAgIGNvbnN0IGhhc01lcmdlZCA9IGF3YWl0IG1lcmdlQWdlbnRTZXR0aW5ncyhyZWxhdGl2ZVBhdGgsIHNldHRpbmdzLCBhY2NlcHRzQ29tbWVudHMpO1xuICAgIGhhc1dyaXR0ZW5BbGwgJiY9IGhhc01lcmdlZDtcbiAgfVxuICByZXR1cm4gaGFzV3JpdHRlbkFsbDtcbn1cblxuYXN5bmMgZnVuY3Rpb24gbWVyZ2VBZ2VudFNldHRpbmdzKFxuICByZWxhdGl2ZVBhdGg6IHN0cmluZyxcbiAgbmV3U2V0dGluZ3M6IG9iamVjdCxcbiAgYWNjZXB0c0NvbW1lbnRzOiBib29sZWFuXG4pOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgY29uc3QgZmlsZVBhdGggPSBwYXRoLmpvaW4ob3MuaG9tZWRpcigpLCByZWxhdGl2ZVBhdGgpO1xuICBjb25zdCBleGlzdGluZ0NvbnRlbnQgPSBhd2FpdCBmc1V0aWwucmVhZEZpbGVJZkV4aXN0cyhmaWxlUGF0aCk7XG4gIGxldCBleGlzdGluZ1NldHRpbmdzOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9IHt9O1xuICBpZiAoZXhpc3RpbmdDb250ZW50ICE9PSB1bmRlZmluZWQpIHtcbiAgICAvLyBBbiBhZ2VudCBpZ25vcmVzIGl0cyB3aG9sZSBzZXR0aW5ncyBmaWxlIHdoZW4gdGhlIGZpbGUgYnJlYWtzIHRoZSBncmFtbWFyIHRoZSBhZ2VudCByZWFkcyBpdFxuICAgIC8vIHdpdGgsIHNvIHdiZnkgbGVhdmVzIHN1Y2ggYSBmaWxlIHRvIHRoZSBkZXZlbG9wZXIgdG8gcmVwYWlyIHJhdGhlciB0aGFuIHJld3JpdGluZyBpdCBpbnRvIGFcbiAgICAvLyBmaWxlIHRoZSBhZ2VudCBzdGlsbCBpZ25vcmVzOiBjb21tZW50cyBhcmUgdG9sZXJhdGVkIG9ubHkgd2hlcmUgdGhlIGFnZW50IHN0cmlwcyB0aGVtLCBhbmRcbiAgICAvLyB0cmFpbGluZyBjb21tYXMgbm93aGVyZSwgc2luY2UgYm90aCBhZ2VudHMgcGFyc2Ugd2l0aCBKU09OLnBhcnNlIGluIHRoZSBlbmQuIENvbW1lbnQtb25seVxuICAgIC8vIGNvbnRlbnQgaXMgY2hlY2tlZCB0b28sIGJlY2F1c2UgaXQgaXMga2VwdCBhcyBhIGhlYWRlciBhYm92ZSB0aGUgZ2VuZXJhdGVkIG9iamVjdC5cbiAgICBpZiAoIWFjY2VwdHNDb21tZW50cyAmJiBqc29uY1V0aWwuY29udGFpbnNDb21tZW50KGV4aXN0aW5nQ29udGVudCkpIHtcbiAgICAgIGNvbnNvbGUud2FybihgU2tpcHBlZCB1cGRhdGluZyAke2ZpbGVQYXRofSBiZWNhdXNlIHRoaXMgYWdlbnQgcmVhZHMgaXQgYXMgc3RyaWN0IEpTT04sIGNvbW1lbnRzIGFuZCBhbGwuYCk7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGlmICghanNvbmNVdGlsLmlzVHJpdmlhT25seShleGlzdGluZ0NvbnRlbnQpKSB7XG4gICAgICBjb25zdCBwYXJzZWRTZXR0aW5ncyA9IGpzb25jVXRpbC5wYXJzZU9iamVjdElnbm9yaW5nRXJyb3I8UmVjb3JkPHN0cmluZywgdW5rbm93bj4+KGV4aXN0aW5nQ29udGVudCwgZmFsc2UpO1xuICAgICAgaWYgKCFwYXJzZWRTZXR0aW5ncykge1xuICAgICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgICAgYFNraXBwZWQgdXBkYXRpbmcgJHtmaWxlUGF0aH0gYmVjYXVzZSB0aGUgZXhpc3RpbmcgY29udGVudCBpcyBub3QgYSBzdHJpY3QgSlNPTiBvYmplY3QgKGEgdHJhaWxpbmcgY29tbWEsIGZvciBleGFtcGxlLCBpcyBub3QgYWxsb3dlZCkuYFxuICAgICAgICApO1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgICBleGlzdGluZ1NldHRpbmdzID0gcGFyc2VkU2V0dGluZ3M7XG4gICAgfVxuICB9XG4gIGNvbnN0IHNldHRpbmdzID0gbWVyZ2UoZXhpc3RpbmdTZXR0aW5ncywgbmV3U2V0dGluZ3MpO1xuICAvLyBPbmx5IHRoZSBwcm9wZXJ0aWVzIHdob3NlIHZhbHVlIGNoYW5nZXMgYXJlIHJld3JpdHRlbiwgc28gdGhlIGZpbGUga2VlcHMgaXRzIG93biBmb3JtYXR0aW5nXG4gIC8vIGFuZCwgd2hlcmUgdGhlIGFnZW50IGFsbG93cyB0aGVtLCBpdHMgY29tbWVudHMuXG4gIGNvbnN0IHsgY29udGVudCwga2V5c0xvc2luZ0NvbW1lbnRzIH0gPSBqc29uY1V0aWwuc3RyaW5naWZ5UHJlc2VydmluZ1RyaXZpYShleGlzdGluZ0NvbnRlbnQsIHNldHRpbmdzKTtcbiAgaWYgKCEoYXdhaXQgZnNVdGlsLmdlbmVyYXRlRmlsZShmaWxlUGF0aCwgY29udGVudCkpKSByZXR1cm4gZmFsc2U7XG5cbiAgZm9yIChjb25zdCBrZXkgb2Yga2V5c0xvc2luZ0NvbW1lbnRzKSB7XG4gICAgY29uc29sZS53YXJuKGBDb21tZW50cyBpbnNpZGUgXCIke2tleX1cIiB3ZXJlIGRyb3BwZWQgd2hpbGUgcmV3cml0aW5nIGl0IGluICR7ZmlsZVBhdGh9LmApO1xuICB9XG4gIHJldHVybiB0cnVlO1xufVxuIiwiaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IG1lcmdlIGZyb20gJ2RlZXBtZXJnZSc7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGZzVXRpbCB9IGZyb20gJy4uL3V0aWxzL2ZzVXRpbC5qcyc7XG5pbXBvcnQgeyBqc29uY1V0aWwgfSBmcm9tICcuLi91dGlscy9qc29uY1V0aWwuanMnO1xuaW1wb3J0IHsgc29ydEtleXMgfSBmcm9tICcuLi91dGlscy9vYmplY3RVdGlsLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuXG5jb25zdCBleGNsdWRlRmlsZVBhdHRlcm5zID0gW1xuICAnKiovLmdpdC9vYmplY3RzLyoqJyxcbiAgJyoqLy5naXQvc3VidHJlZS1jYWNoZS8qKicsXG4gICcqKi9ub2RlX21vZHVsZXMvKionLFxuICAnKiovdG1wLyoqJyxcbiAgJyoqL3RlbXAvKionLFxuICAnKiovZGlzdC8qKicsXG5dO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVWc2NvZGVTZXR0aW5ncyhjb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdnZW5lcmF0ZVZzY29kZVNldHRpbmdzJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnLnZzY29kZScsICdzZXR0aW5ncy5qc29uJyk7XG4gICAgY29uc3QgZXhpc3RpbmdDb250ZW50ID0gYXdhaXQgZnNVdGlsLnJlYWRGaWxlSWZFeGlzdHMoZmlsZVBhdGgpO1xuICAgIGlmIChleGlzdGluZ0NvbnRlbnQgPT09IHVuZGVmaW5lZCB8fCBqc29uY1V0aWwuaXNUcml2aWFPbmx5KGV4aXN0aW5nQ29udGVudCkpIHJldHVybjtcbiAgICAvLyAudnNjb2RlL3NldHRpbmdzLmpzb24gaXMgSlNPTkMgYnkgZGVmaW5pdGlvbjsgSlNPTi5wYXJzZSB3b3VsZCBtYWtlIHdiZnkgc2lsZW50bHkgc2tpcFxuICAgIC8vIGNvbW1lbnRlZCBmaWxlcy5cbiAgICBjb25zdCBwYXJzZWRTZXR0aW5ncyA9IGpzb25jVXRpbC5wYXJzZU9iamVjdElnbm9yaW5nRXJyb3I8b2JqZWN0PihleGlzdGluZ0NvbnRlbnQpO1xuICAgIGlmICghcGFyc2VkU2V0dGluZ3MpIHtcbiAgICAgIGNvbnNvbGUud2FybihgU2tpcHBlZCB1cGRhdGluZyAke2ZpbGVQYXRofSBiZWNhdXNlIHRoZSBleGlzdGluZyBjb250ZW50IGlzIG5vdCBwYXJzYWJsZSBhcyBKU09OQy5gKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3Qgb3JpZ2luYWxTZXR0aW5nc0pzb24gPSBKU09OLnN0cmluZ2lmeShzb3J0S2V5cyhzdHJ1Y3R1cmVkQ2xvbmUocGFyc2VkU2V0dGluZ3MpIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KSk7XG4gICAgbGV0IHNldHRpbmdzID0gcGFyc2VkU2V0dGluZ3M7XG4gICAgZm9yIChjb25zdCBleGNsdWRlRmlsZVBhdHRlcm4gb2YgZXhjbHVkZUZpbGVQYXR0ZXJucykge1xuICAgICAgc2V0dGluZ3MgPSBtZXJnZS5hbGwoW3NldHRpbmdzLCBleGNsdWRlU2V0dGluZyhleGNsdWRlRmlsZVBhdHRlcm4pXSk7XG4gICAgfVxuICAgIGlmIChjb25maWcuZG9lc0NvbnRhaW5Qb2V0cnlMb2NrIHx8IGNvbmZpZy5kb2VzQ29udGFpblV2TG9jaykge1xuICAgICAgc2V0dGluZ3MgPSBtZXJnZS5hbGwoW3NldHRpbmdzLCBleGNsdWRlU2V0dGluZygnKiovLnZlbnYvKionKV0pO1xuICAgIH1cbiAgICBpZiAoY29uZmlnLmRlcGVuZGluZy5uZXh0KSB7XG4gICAgICBzZXR0aW5ncyA9IG1lcmdlLmFsbChbc2V0dGluZ3MsIGV4Y2x1ZGVTZXR0aW5nKCcqKi8ubmV4dC8qKicpXSk7XG4gICAgfVxuICAgIHNvcnRLZXlzKHNldHRpbmdzIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KTtcbiAgICAvLyBTa2lwIHRoZSB3cml0ZSB3aGVuIG5vdGhpbmcgY2hhbmdlcyBzZW1hbnRpY2FsbHksIHNvIEpTT05DIGNvbW1lbnRzIGFuZCBmb3JtYXR0aW5nIGluIGFuXG4gICAgLy8gYWxyZWFkeS1jbGVhbiBzZXR0aW5ncy5qc29uIHN1cnZpdmUgd2JmeSBydW5zLlxuICAgIGlmIChKU09OLnN0cmluZ2lmeShzZXR0aW5ncykgPT09IG9yaWdpbmFsU2V0dGluZ3NKc29uKSByZXR1cm47XG4gICAgY29uc3QgbmV3Q29udGVudCA9IEpTT04uc3RyaW5naWZ5KHNldHRpbmdzLCB1bmRlZmluZWQsIDIpO1xuICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiBmc1V0aWwuZ2VuZXJhdGVGaWxlKGZpbGVQYXRoLCBuZXdDb250ZW50KSk7XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBleGNsdWRlU2V0dGluZyhleGNsdWRlRmlsZVBhdHRlcm46IHN0cmluZyk6IG9iamVjdCB7XG4gIHJldHVybiB7XG4gICAgJ2ZpbGVzLndhdGNoZXJFeGNsdWRlJzoge1xuICAgICAgW2V4Y2x1ZGVGaWxlUGF0dGVybl06IHRydWUsXG4gICAgfSxcbiAgfTtcbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGZzVXRpbCB9IGZyb20gJy4uL3V0aWxzL2ZzVXRpbC5qcyc7XG5cbmludGVyZmFjZSBGbm94VG9tbFN1YnRyZWUge1xuICBzZWNyZXRzPzogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gIHByb2ZpbGVzPzogUmVjb3JkPHN0cmluZywgeyBzZWNyZXRzPzogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gfSB8IHVuZGVmaW5lZD47XG59XG5cbi8vIFRoZSBmb3VyIHN0YW5kYXJkIFdCX0VOViBtb2Rlczsgc3RhZ2luZyBpcyBvcHRpb25hbCBhbmQgb25seSBjb21wbGV0ZWQgd2hlbiB0aGUgcmVwb3NpdG9yeVxuLy8gYWxyZWFkeSBkZWNsYXJlcyB0aGUgc3RhZ2luZyBwcm9maWxlLlxuY29uc3Qgd2JFbnZNb2RlcyA9IFsnZGV2ZWxvcG1lbnQnLCAndGVzdCcsICdzdGFnaW5nJywgJ3Byb2R1Y3Rpb24nXSBhcyBjb25zdDtcbnR5cGUgV2JFbnZNb2RlID0gKHR5cGVvZiB3YkVudk1vZGVzKVtudW1iZXJdO1xuXG4vKipcbiAqIEVuc3VyZXMgYSBmbm94IHJlcG9zaXRvcnkgZGVmaW5lcyBXQl9FTlYgZm9yIGV2ZXJ5IHN0YW5kYXJkIG1vZGUgKGFuZCBORVhUX1BVQkxJQ19XQl9FTlYgd2hlblxuICogYW55IHdvcmtzcGFjZSBkZXBlbmRzIG9uIE5leHQuanMgb3IgdmluZXh0KSBpbiBmbm94LnRvbWwgcHJvZmlsZXMuIEV4aXN0aW5nIGRlZmluaXRpb25zIGFyZVxuICogYWx3YXlzIGxlZnQgdW50b3VjaGVkLiBOb24tZm5veCByZXBvc2l0b3JpZXMgYXJlIHNraXBwZWQ6IC5lbnYgZmlsZXMgYXJlIG5vIGxvbmdlciBtYW5hZ2VkLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZW5zdXJlV2JFbnZEZWZpbml0aW9ucyhyb290Q29uZmlnOiBQYWNrYWdlQ29uZmlnLCBhbGxDb25maWdzOiBQYWNrYWdlQ29uZmlnW10pOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdlbnN1cmVXYkVudkRlZmluaXRpb25zJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IG5lZWRzTmV4dFB1YmxpYyA9IGFsbENvbmZpZ3Muc29tZSgoY29uZmlnKSA9PiByZXF1aXJlc05leHRQdWJsaWNXYkVudihjb25maWcpKTtcbiAgICBjb25zdCBmbm94VG9tbFBhdGggPSBwYXRoLnJlc29sdmUocm9vdENvbmZpZy5kaXJQYXRoLCAnZm5veC50b21sJyk7XG4gICAgLy8gbHN0YXQsIG5vdCBleGlzdHNTeW5jOiBleGlzdHNTeW5jIGlzIGZhbHNlIGZvciBhIERBTkdMSU5HIGZub3gudG9tbCBzeW1saW5rOyBhbnkgZm5veC50b21sXG4gICAgLy8gZGlyZWN0b3J5IGVudHJ5IG1hcmtzIGEgZm5veCByZXBvc2l0b3J5LCBhbmQgYSByZWZ1c2VkL2RhbmdsaW5nIG9uZSBhYm9ydHMgaW5zdGVhZCBvZlxuICAgIC8vIGJlaW5nIHRyZWF0ZWQgYXMgYSBub24tZm5veCByZXBvc2l0b3J5IHdoaWxlIHRoZSBmbm94IHN5bmNocm9uaXphdGlvbiBpcyBmYWlsaW5nLlxuICAgIGlmICghKGF3YWl0IGZzLnByb21pc2VzLmxzdGF0KGZub3hUb21sUGF0aCkuY2F0Y2goKCkgPT4ge30pKSkgcmV0dXJuO1xuICAgIGNvbnN0IGNvbnRlbnQgPSBhd2FpdCBmc1V0aWwucmVhZEZpbGVDb25maW5lZElmRXhpc3RzKGZub3hUb21sUGF0aCk7XG4gICAgaWYgKGNvbnRlbnQgPT09IHVuZGVmaW5lZCkgcmV0dXJuO1xuICAgIGNvbnN0IHVwZGF0ZWRDb250ZW50ID0gaW5zZXJ0V2JFbnZJbnRvRm5veFRvbWwoY29udGVudCwgbmVlZHNOZXh0UHVibGljKTtcbiAgICBpZiAodXBkYXRlZENvbnRlbnQgIT09IHVuZGVmaW5lZCAmJiB1cGRhdGVkQ29udGVudCAhPT0gY29udGVudCkge1xuICAgICAgYXdhaXQgZnNVdGlsLmdlbmVyYXRlRmlsZShmbm94VG9tbFBhdGgsIHVwZGF0ZWRDb250ZW50KTtcbiAgICB9XG4gIH0pO1xufVxuXG4vKipcbiAqIE1pcnJvcnMgd2IncyByZXF1aXJlc05leHRQdWJsaWNXYkVudiBjb250cmFjdCAocGFja2FnZXMvd2Ivc3JjL3Byb2plY3QudHMpOiB0aGUgZnJhbWV3b3JrIG1heVxuICogYmUgZGVjbGFyZWQgaW4gQU5ZIG9mIHRoZSBmb3VyIGRlcGVuZGVuY3kgc2VjdGlvbnMgKGUuZy4gYG5leHRgIGFzIGEgZGV2RGVwZW5kZW5jeSBpbiBhIHNoYXJlZFxuICogY29tcG9uZW50IGxpYnJhcnkpLCB3aGlsZSB3YmZ5J3MgYGRlcGVuZGluZy5uZXh0YCBsb29rcyBvbmx5IGF0IHJlZ3VsYXIgZGVwZW5kZW5jaWVzLlxuICovXG5mdW5jdGlvbiByZXF1aXJlc05leHRQdWJsaWNXYkVudihjb25maWc6IFBhY2thZ2VDb25maWcpOiBib29sZWFuIHtcbiAgcmV0dXJuIFsnZGVwZW5kZW5jaWVzJywgJ2RldkRlcGVuZGVuY2llcycsICdvcHRpb25hbERlcGVuZGVuY2llcycsICdwZWVyRGVwZW5kZW5jaWVzJ10uc29tZSgoc2VjdGlvbikgPT4ge1xuICAgIGNvbnN0IGRlcGVuZGVuY2llcyA9IGNvbmZpZy5wYWNrYWdlSnNvbj8uW3NlY3Rpb24gYXMgJ2RlcGVuZGVuY2llcyddO1xuICAgIHJldHVybiAhIWRlcGVuZGVuY2llcz8uWyduZXh0J10gfHwgISFkZXBlbmRlbmNpZXM/LlsndmluZXh0J107XG4gIH0pO1xufVxuXG4vKipcbiAqIEluc2VydHMgbWlzc2luZyBXQl9FTlYgKGFuZCBvcHRpb25hbGx5IE5FWFRfUFVCTElDX1dCX0VOVikgZW50cmllcyBpbnRvIGEgZm5veC50b21sOiB0aGUgYmFzZVxuICogYFtzZWNyZXRzXWAgdGFibGUgY2FycmllcyB0aGUgZGV2ZWxvcG1lbnQgZGVmYXVsdHMgYW5kIGBbcHJvZmlsZXMuPG1vZGU+LnNlY3JldHNdYCBvdmVybGF5c1xuICogZWFjaCBvdGhlciBtb2RlLCBtYXRjaGluZyB0aGUgb3JnLXN0YW5kYXJkIGxheW91dC4gRm9ybWF0dGluZyBhbmQgY29tbWVudHMgYXJlIHByZXNlcnZlZDsgb25seVxuICogbWlzc2luZyBsaW5lcyBhcmUgaW5zZXJ0ZWQgb3IgbWlzc2luZyBzZWN0aW9ucyBhcHBlbmRlZC4gUmV0dXJucyB1bmRlZmluZWQgd2hlbiB0aGUgY29udGVudFxuICogY2Fubm90IGJlIHNhZmVseSBlZGl0ZWQgKHVucGFyc2FibGUgYmVmb3JlIG9yIGFmdGVyIHRoZSBlZGl0KS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGluc2VydFdiRW52SW50b0Zub3hUb21sKGNvbnRlbnQ6IHN0cmluZywgbmVlZHNOZXh0UHVibGljOiBib29sZWFuKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgbGV0IHNldHRpbmdzOiBGbm94VG9tbFN1YnRyZWU7XG4gIHRyeSB7XG4gICAgc2V0dGluZ3MgPSBCdW4uVE9NTC5wYXJzZShjb250ZW50KSBhcyBGbm94VG9tbFN1YnRyZWU7XG4gIH0gY2F0Y2gge1xuICAgIGNvbnNvbGUud2FybignU2tpcHBlZCBpbnNlcnRpbmcgV0JfRU5WIGludG8gZm5veC50b21sIGJlY2F1c2UgaXQgaXMgbm90IHBhcnNhYmxlIGFzIFRPTUwuJyk7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuXG4gIGNvbnN0IGtleU5hbWVzID0gbmVlZHNOZXh0UHVibGljID8gWydXQl9FTlYnLCAnTkVYVF9QVUJMSUNfV0JfRU5WJ10gOiBbJ1dCX0VOViddO1xuICBsZXQgdXBkYXRlZENvbnRlbnQgPSBjb250ZW50O1xuICBmb3IgKGNvbnN0IG1vZGUgb2Ygd2JFbnZNb2Rlcykge1xuICAgIC8vIFRoZSBzdGFnaW5nIG1vZGUgaXMgb3B0aW9uYWw6IGNvbXBsZXRlIGl0IG9ubHkgd2hlbiB0aGUgcmVwb3NpdG9yeSBhbHJlYWR5IGRlY2xhcmVzIHRoZSBwcm9maWxlLlxuICAgIGlmIChtb2RlID09PSAnc3RhZ2luZycgJiYgIXNldHRpbmdzLnByb2ZpbGVzPy5zdGFnaW5nKSBjb250aW51ZTtcbiAgICBjb25zdCBkZWZpbmVkS2V5cyA9IG1vZGUgPT09ICdkZXZlbG9wbWVudCcgPyBzZXR0aW5ncy5zZWNyZXRzIDogc2V0dGluZ3MucHJvZmlsZXM/Llttb2RlXT8uc2VjcmV0cztcbiAgICBmb3IgKGNvbnN0IGtleU5hbWUgb2Yga2V5TmFtZXMpIHtcbiAgICAgIGNvbnN0IGRlZmluZWQgPSBkZWZpbmVkS2V5cz8uW2tleU5hbWVdO1xuICAgICAgY29uc3QgZGVmaW5lZFZhbHVlID1cbiAgICAgICAgdHlwZW9mIGRlZmluZWQgPT09ICdzdHJpbmcnID8gZGVmaW5lZCA6IChkZWZpbmVkIGFzIHsgZGVmYXVsdD86IHVua25vd24gfSB8IHVuZGVmaW5lZCk/LmRlZmF1bHQ7XG4gICAgICB3YXJuT25VbmV4cGVjdGVkV2JFbnZWYWx1ZShrZXlOYW1lLCBkZWZpbmVkVmFsdWUsIG1vZGUpO1xuICAgIH1cbiAgICBjb25zdCBtaXNzaW5nTGluZXMgPSBrZXlOYW1lc1xuICAgICAgLmZpbHRlcigoa2V5TmFtZSkgPT4gZGVmaW5lZEtleXM/LltrZXlOYW1lXSA9PT0gdW5kZWZpbmVkKVxuICAgICAgLm1hcCgoa2V5TmFtZSkgPT4gYCR7a2V5TmFtZX0gPSB7IGRlZmF1bHQgPSBcIiR7bW9kZX1cIiB9YCk7XG4gICAgaWYgKG1pc3NpbmdMaW5lcy5sZW5ndGggPT09IDApIGNvbnRpbnVlO1xuICAgIHVwZGF0ZWRDb250ZW50ID0gaW5zZXJ0SW50b0Zub3hTZWN0aW9uKFxuICAgICAgdXBkYXRlZENvbnRlbnQsXG4gICAgICBtb2RlID09PSAnZGV2ZWxvcG1lbnQnID8gJ3NlY3JldHMnIDogYHByb2ZpbGVzLiR7bW9kZX0uc2VjcmV0c2AsXG4gICAgICBtaXNzaW5nTGluZXNcbiAgICApO1xuICB9XG4gIGlmICh1cGRhdGVkQ29udGVudCA9PT0gY29udGVudCkgcmV0dXJuIGNvbnRlbnQ7XG5cbiAgLy8gUmUtcGFyc2UgYmVmb3JlIHJldHVybmluZzogYW4gdW51c3VhbCBsYXlvdXQgKGUuZy4gZG90dGVkIGtleXMgd2l0aG91dCBhIHRhYmxlIGhlYWRlcikgY291bGRcbiAgLy8gbWFrZSB0aGUgdGV4dHVhbCBlZGl0IHByb2R1Y2UgYSBkdXBsaWNhdGUgdGFibGU7IGZhaWwgc2FmZWx5IGluc3RlYWQgb2YgY29ycnVwdGluZyB0aGUgZmlsZS5cbiAgdHJ5IHtcbiAgICBjb25zdCB1cGRhdGVkU2V0dGluZ3MgPSBCdW4uVE9NTC5wYXJzZSh1cGRhdGVkQ29udGVudCkgYXMgRm5veFRvbWxTdWJ0cmVlO1xuICAgIGZvciAoY29uc3QgbW9kZSBvZiB3YkVudk1vZGVzKSB7XG4gICAgICBpZiAobW9kZSA9PT0gJ3N0YWdpbmcnICYmICFzZXR0aW5ncy5wcm9maWxlcz8uc3RhZ2luZykgY29udGludWU7XG4gICAgICBjb25zdCBkZWZpbmVkS2V5cyA9IG1vZGUgPT09ICdkZXZlbG9wbWVudCcgPyB1cGRhdGVkU2V0dGluZ3Muc2VjcmV0cyA6IHVwZGF0ZWRTZXR0aW5ncy5wcm9maWxlcz8uW21vZGVdPy5zZWNyZXRzO1xuICAgICAgaWYgKGtleU5hbWVzLnNvbWUoKGtleU5hbWUpID0+IGRlZmluZWRLZXlzPy5ba2V5TmFtZV0gPT09IHVuZGVmaW5lZCkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGB0aGUgaW5zZXJ0ZWQgJHttb2RlfSBlbnRyaWVzIGRpZCBub3QgdGFrZSBlZmZlY3RgKTtcbiAgICAgIH1cbiAgICB9XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgY29uc29sZS53YXJuKGBTa2lwcGVkIGluc2VydGluZyBXQl9FTlYgaW50byBmbm94LnRvbWwgYmVjYXVzZSAkeyhlcnJvciBhcyBFcnJvcikubWVzc2FnZX0uYCk7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuICByZXR1cm4gdXBkYXRlZENvbnRlbnQ7XG59XG5cbi8qKlxuICogV2FybnMgd2hlbiBhbiBleGlzdGluZyBXQl9FTlYtZmFtaWx5IGRlZmluaXRpb24gbmFtZXMgYSBkaWZmZXJlbnQgbW9kZSB0aGFuIHRoZSBvbmUgaXQgaXNcbiAqIGRlZmluZWQgZm9yIChhIHR5cG8gbGlrZSBgcHJvZGN1dGlvbmAgb3IgYHByb2R1Y3Rpb24xYCwgb3IgYSBjb3B5LXBhc3RlZCB3cm9uZyBtb2RlKTogd2JcbiAqIHJlamVjdHMgbm9uLXN0YW5kYXJkIHZhbHVlcyBhdCBydW50aW1lLCBzbyBzdXJmYWNpbmcgdGhlIG1pc21hdGNoIGR1cmluZyB3YmZ5IGlzIHRoZSBlYXJsaWVzdFxuICogcG9zc2libGUgc2lnbmFsLiBUaGUgcGFzc2VkIHZhbHVlIGlzIGFsd2F5cyBwbGFpbnRleHQgKGEgZm5veCBgZGVmYXVsdGAgZmllbGQpIOKAlCBlbmNyeXB0ZWRcbiAqIGZub3ggZW50cmllcyBhcmUgYHsgcHJvdmlkZXIsIHZhbHVlIH1gIG9iamVjdHMgd2hvc2UgYGRlZmF1bHRgIGlzIGFic2VudC5cbiAqL1xuZnVuY3Rpb24gd2Fybk9uVW5leHBlY3RlZFdiRW52VmFsdWUoa2V5TmFtZTogc3RyaW5nLCB2YWx1ZTogdW5rbm93biwgbW9kZTogV2JFbnZNb2RlKTogdm9pZCB7XG4gIC8vIEFuIEVNUFRZIHZhbHVlIGNvdW50cyBhcyB1bnNldCAod2Igc3VwcGxpZXMgdGhlIGZhbGxiYWNrIG1vZGUpLCBub3QgYXMgYSBtaXNtYXRjaGluZyBtb2RlLlxuICBpZiAodHlwZW9mIHZhbHVlICE9PSAnc3RyaW5nJyB8fCB2YWx1ZSA9PT0gJycgfHwgdmFsdWUgPT09IG1vZGUpIHJldHVybjtcbiAgLy8gQSBkeW5hbWljIHZhbHVlIChlLmcuIGBORVhUX1BVQkxJQ19XQl9FTlY9JHtXQl9FTlZ9YCkgbWF5IGxlZ2l0aW1hdGVseSByZXNvbHZlIHRvIHRoZSBtb2RlXG4gIC8vIHRocm91Z2ggZXhwYW5zaW9uLCB3aGljaCB0aGlzIHN0YXRpYyBjaGVjayBjYW5ub3QgZXZhbHVhdGUg4oCUIHNraXAgaW5zdGVhZCBvZiBtaXNmaXJpbmcuXG4gIC8vIGZub3ggZXhwYW5kcyBvbmx5IGAkey4uLn1gIChhIGJhcmUgYCRVTlNFVGAgc3RheXMgbGl0ZXJhbCkuXG4gIGlmICh2YWx1ZS5pbmNsdWRlcygnJHsnKSkgcmV0dXJuO1xuICBpZiAoa2V5TmFtZSA9PT0gJ05FWFRfUFVCTElDX1dCX0VOVicpIHtcbiAgICBjb25zb2xlLndhcm4oXG4gICAgICBgJHtrZXlOYW1lfSBpbiBmbm94LnRvbWwgaXMgXCIke3ZhbHVlfVwiIGJ1dCBzaG91bGQgYmUgXCIke21vZGV9XCIgZm9yIHRoZSAke21vZGV9IG1vZGU7IHdiIG92ZXJyaWRlcyBpdCB3aXRoIFdCX0VOViwgYnV0IGEgZGlyZWN0IGZyYW1ld29yayBidWlsZCB3b3VsZCBpbmxpbmUgdGhpcyB2YWx1ZS5gXG4gICAgKTtcbiAgICByZXR1cm47XG4gIH1cbiAgY29uc29sZS53YXJuKFxuICAgIGAke2tleU5hbWV9IGluIGZub3gudG9tbCBpcyBcIiR7dmFsdWV9XCIgYnV0IHNob3VsZCBiZSBcIiR7bW9kZX1cIiBmb3IgdGhlICR7bW9kZX0gbW9kZTsgd2IgcmVqZWN0cyB2YWx1ZXMgb3V0c2lkZSBkZXZlbG9wbWVudC90ZXN0L3N0YWdpbmcvcHJvZHVjdGlvbi5gXG4gICk7XG59XG5cbi8qKlxuICogSW5zZXJ0cyBsaW5lcyBhdCB0aGUgdG9wIG9mIGEgVE9NTCBzZWN0aW9uLCByaWdodCBhZnRlciBpdHMgYFtoZWFkZXJdYCBsaW5lIHNvIHByb2ZpbGUtc3BlY2lmaWNcbiAqIGVudHJpZXMgc3RheSBncm91cGVkIHdpdGggdGhlaXIgaGVhZGVyOyB0aGUgc2VjdGlvbiBpcyBhcHBlbmRlZCBhdCB0aGUgZW5kIHdoZW4gaXQgaXMgYWJzZW50LlxuICovXG5mdW5jdGlvbiBpbnNlcnRJbnRvRm5veFNlY3Rpb24oY29udGVudDogc3RyaW5nLCBzZWN0aW9uTmFtZTogc3RyaW5nLCBpbnNlcnRlZExpbmVzOiBzdHJpbmdbXSk6IHN0cmluZyB7XG4gIC8vIHdiZnkgd3JpdGVzIHRoZSBoZWFkZXIgd2l0aG91dCB3aGl0ZXNwYWNlIGFyb3VuZCB0aGUgZG90dGVkLWtleSBjb21wb25lbnRzLlxuICBjb25zdCBoZWFkZXJQYXR0ZXJuID0gbmV3IFJlZ0V4cChTdHJpbmcucmF3YF5cXHMqXFxbJHtzZWN0aW9uTmFtZS5yZXBsYWNlQWxsKCcuJywgU3RyaW5nLnJhd2BcXC5gKX1cXF1cXHMqKD86Iy4qKT8kYCwgJ3UnKTtcbiAgY29uc3QgbGluZXMgPSBjb250ZW50LnNwbGl0KCdcXG4nKTtcbiAgY29uc3QgaGVhZGVySW5kZXggPSBsaW5lcy5maW5kSW5kZXgoKGxpbmUpID0+IGhlYWRlclBhdHRlcm4udGVzdChsaW5lKSk7XG4gIGlmIChoZWFkZXJJbmRleCA9PT0gLTEpIHtcbiAgICByZXR1cm4gYCR7Y29udGVudC50cmltRW5kKCl9XFxuXFxuWyR7c2VjdGlvbk5hbWV9XVxcbiR7aW5zZXJ0ZWRMaW5lcy5qb2luKCdcXG4nKX1cXG5gO1xuICB9XG4gIHJldHVybiBbLi4ubGluZXMuc2xpY2UoMCwgaGVhZGVySW5kZXggKyAxKSwgLi4uaW5zZXJ0ZWRMaW5lcywgLi4ubGluZXMuc2xpY2UoaGVhZGVySW5kZXggKyAxKV0uam9pbignXFxuJyk7XG59XG4iLCIvLyBHaXRIdWIgQWN0aW9ucyB2YWx1ZWxlc3MgZXZlbnRzIHN1Y2ggYXMgYHB1bGxfcmVxdWVzdDpgIHJlcXVpcmUgWUFNTCBudWxsIHZhbHVlcy5cbi8qIGVzbGludC1kaXNhYmxlIHVuaWNvcm4vbm8tbnVsbCAqL1xuXG5pbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgKiBhcyB5YW1sIGZyb20gJ2pzLXlhbWwnO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBmc1V0aWwgfSBmcm9tICcuLi91dGlscy9mc1V0aWwuanMnO1xuaW1wb3J0IHsgcHJvbWlzZVBvb2wgfSBmcm9tICcuLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5cbi8qKlxuICogUmVwb3NpdG9yaWVzIG91dHNpZGUgV2lsbEJvb3N0ZXIgLyBXaWxsQm9vc3RlckxhYiBjYW5ub3QgY2FsbCB0aGUgb3JnYW5pemF0aW9uJ3MgcmV1c2FibGVcbiAqIHdvcmtmbG93czogdGhvc2Ugd29ya2Zsb3dzIGRlcGVuZCBvbiBvcmdhbml6YXRpb24gc2VjcmV0cyAoVkVSREFDQ0lPX1RPS0VOLCBEaXNjb3JkIHdlYmhvb2tzKVxuICogYW5kIHNlbGYtaG9zdGVkIHJ1bm5lcnMgdGhhdCBvdGhlciBvd25lcnMgZG8gbm90IGhhdmUuIFRoaXMgZ2VuZXJhdG9yIGluc3RlYWQgZW1pdHNcbiAqIHNlbGYtY29udGFpbmVkIHdvcmtmbG93cyBidWlsdCBvbmx5IGZyb20gd2hhdCBhbnkgcmVwb3NpdG9yeSBvd25lciBjYW4gcHJvdmlkZTogdGhlIHJlcG9zaXRvcnlcbiAqIGNvbnRlbnRzIChtaXNlLnRvbWwsIHBhY2thZ2UuanNvbiBzY3JpcHRzKSBhbmQgdGhlIHNpbmdsZSBgRk5PWF9BR0VfS0VZYCByZXBvc2l0b3J5IHNlY3JldCB3aGVuXG4gKiB0aGUgcmVwb3NpdG9yeSB1c2VzIGZub3guIEdlbmVyYXRpb24gaXMga2V5ZWQgb24gcmVwb3NpdG9yeSBzdGF0ZSwgbmV2ZXIgb24gdGhlIG93bmVyJ3NcbiAqIGlkZW50aXR5LCBzbyBpdCB3b3JrcyBmb3IgYXJiaXRyYXJ5IHBlcnNvbmFsIHJlcG9zaXRvcmllcy5cbiAqL1xuXG4vKiogRmlyc3QgbGluZSBvZiBldmVyeSBnZW5lcmF0ZWQgZmlsZTsgZmlsZXMgd2l0aG91dCBpdCBhcmUgaGFuZC13cml0dGVuIGFuZCBuZXZlciB0b3VjaGVkLiAqL1xuZXhwb3J0IGNvbnN0IHNlbGZDb250YWluZWRXb3JrZmxvd01hcmtlciA9ICcjIEdlbmVyYXRlZCBieSB3YmZ5Lic7XG5cbi8vIFNhbWUgcGlucyBhcyB0aGUgcmV1c2FibGUgd29ya2Zsb3dzIC8gdGhlaXIgY29uc3VtZXJzOyBSZW5vdmF0ZSB1cGRhdGVzIHRoZW0gaW4gdGhlIHRhcmdldCByZXBvc2l0b3J5LlxuY29uc3QgY2hlY2tvdXRBY3Rpb24gPSAnYWN0aW9ucy9jaGVja291dEB2Ny4wLjEnO1xuY29uc3QgbWlzZUFjdGlvbiA9ICdqZHgvbWlzZS1hY3Rpb25AdjQuMi4zJztcbmNvbnN0IGNhY2hlQWN0aW9uID0gJ2FjdGlvbnMvY2FjaGVAdjYuMS4wJztcbmNvbnN0IHVwbG9hZEFydGlmYWN0QWN0aW9uID0gJ2FjdGlvbnMvdXBsb2FkLWFydGlmYWN0QHY3LjAuMSc7XG4vLyB2Ni4xLjE7IHRoZSBzYW1lIHBpbiBhcyB0aGUgcmV1c2FibGUgc2VtYW50aWMtcHIgd29ya2Zsb3cuXG5jb25zdCBzZW1hbnRpY1B1bGxSZXF1ZXN0QWN0aW9uID0gJ2FtYW5ubi9hY3Rpb24tc2VtYW50aWMtcHVsbC1yZXF1ZXN0QDQ1YjllZDdjZjI0MDg3YTJmNzc4NWJmNTViZTk3Mzk0YmE4N2UxYzInO1xuLy8gdjMuMC4zOyBkZXBsb3lzIGFyZSBuZXR3b3JrLWhlYXZ5IGFuZCBiZW5lZml0IGZyb20gcmV0cmllcyB3aXRoIGEgbG9uZyB0aW1lb3V0LlxuY29uc3QgcmV0cnlBY3Rpb24gPSAnbmljay1maWVsZHMvcmV0cnlAZGQ1NmYxY2E4Y2E5OTFlMjM4NWMxOGFiNmRkMzZlYTdmOWZkYjU1Zic7XG5cbi8qKlxuICogSm9iLWxldmVsIGVudiB0aGF0IHR1cm5zIHRoZSBUYWt1bWkgR3VhcmQgaW5zdGFsbCBwYXRoIG9uLCBtaXJyb3JpbmcgdGhlIHJldXNhYmxlIHdvcmtmbG93cy5cbiAqXG4gKiBgc2VjcmV0c2AgaXMgdW5hdmFpbGFibGUgaW4gYSBzdGVwLWxldmVsIGBpZjpgLCBzbyB0aGUgcHJlc2VuY2Ugb2YgdGhlIHRva2VuIGlzIGV4cG9zZWQgYXMgYVxuICogbm9uLXNlY3JldCBzaWduYWw7IGFuIHVuc2V0IHNlY3JldCBleHBhbmRzIHRvIGBmYWxzZWAgYW5kIGxlYXZlcyBldmVyeSBHdWFyZCBzdGVwIHNraXBwZWQsIHdoaWNoXG4gKiBpcyB3aGF0IGtlZXBzIHRoZSBnZW5lcmF0ZWQgd29ya2Zsb3dzIHJ1bm5hYmxlIGluIGEgcmVwb3NpdG9yeSB0aGF0IG5ldmVyIHJlZ2lzdGVycyB0aGUgc2VjcmV0LlxuICogVEFLVU1JX0dVQVJEX1RPS0VOIGl0c2VsZiBpcyBkZWZpbmVkLWJ1dC1FTVBUWSBqb2Itd2lkZSBzbyB0aGUgYCR7VEFLVU1JX0dVQVJEX1RPS0VOfWAgcmVmZXJlbmNlXG4gKiBpbiB0aGUgZ2VuZXJhdGVkIC5ucG1yYyBzdGlsbCBleHBhbmRzICh0byAnJykgaW4gdGhlIHN0ZXBzIHRoYXQgZGVsaWJlcmF0ZWx5IHJ1biB3aXRob3V0IHRoZVxuICogdG9rZW47IGEgcmVmZXJlbmNlIHRvIGFuIHVuZGVmaW5lZCB2YXJpYWJsZSBpcyB3aGF0IGJyZWFrcyBhbiBpbnN0YWxsLCBhbiBlbXB0eSBvbmUgaXMgZmluZS5cbiAqL1xuY29uc3QgZ3VhcmRKb2JFbnY6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7XG4gIEhBU19UQUtVTUlfR1VBUkRfVE9LRU46ICcke3sgISFzZWNyZXRzLlRBS1VNSV9HVUFSRF9UT0tFTiB9fScsXG4gIFRBS1VNSV9HVUFSRF9UT0tFTjogJycsXG59O1xuXG5pbnRlcmZhY2UgU3RlcCB7XG4gIG5hbWU/OiBzdHJpbmc7XG4gIGlkPzogc3RyaW5nO1xuICBpZj86IHN0cmluZztcbiAgdXNlcz86IHN0cmluZztcbiAgcnVuPzogc3RyaW5nO1xuICAnd29ya2luZy1kaXJlY3RvcnknPzogc3RyaW5nO1xuICB3aXRoPzogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gIGVudj86IFJlY29yZDxzdHJpbmcsIHN0cmluZz47XG59XG5cbmludGVyZmFjZSBXb3JrZmxvdyB7XG4gIG5hbWU6IHN0cmluZztcbiAgb246IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICBjb25jdXJyZW5jeT86IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICBwZXJtaXNzaW9ucz86IFJlY29yZDxzdHJpbmcsIHN0cmluZz47XG4gIGpvYnM6IFJlY29yZDxcbiAgICBzdHJpbmcsXG4gICAgeyAncnVucy1vbic6IHN0cmluZzsgcGVybWlzc2lvbnM/OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+OyBlbnY/OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+OyBzdGVwczogU3RlcFtdIH1cbiAgPjtcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlU2VsZkNvbnRhaW5lZFdvcmtmbG93cyhcbiAgcm9vdENvbmZpZzogUGFja2FnZUNvbmZpZyxcbiAgYWxsUGFja2FnZUNvbmZpZ3M6IFBhY2thZ2VDb25maWdbXSA9IFtyb290Q29uZmlnXVxuKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZ2VuZXJhdGVTZWxmQ29udGFpbmVkV29ya2Zsb3dzJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IHdvcmtmbG93c1BhdGggPSBwYXRoLnJlc29sdmUocm9vdENvbmZpZy5kaXJQYXRoLCAnLmdpdGh1YicsICd3b3JrZmxvd3MnKTtcbiAgICBpZiAoIShhd2FpdCBmc1V0aWwuaXNDb25maW5lZFdyaXRhYmxlUGF0aCh3b3JrZmxvd3NQYXRoKSkpIHtcbiAgICAgIGNvbnNvbGUud2FybihgU2tpcHBlZCBnZW5lcmF0aW5nIHdvcmtmbG93cyBiZWNhdXNlICR7d29ya2Zsb3dzUGF0aH0gcmVzb2x2ZXMgb3V0c2lkZSB0aGUgcmVwb3NpdG9yeS5gKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgYXdhaXQgZnMucHJvbWlzZXMubWtkaXIod29ya2Zsb3dzUGF0aCwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG5cbiAgICBjb25zdCB1c2VzRm5veCA9IGZzLmV4aXN0c1N5bmMocGF0aC5yZXNvbHZlKHJvb3RDb25maWcuZGlyUGF0aCwgJ2Zub3gudG9tbCcpKTtcbiAgICBjb25zdCB3b3JrZmxvd0J5RmlsZU5hbWU6IFJlY29yZDxzdHJpbmcsIFdvcmtmbG93PiA9IHtcbiAgICAgICd0ZXN0LnltbCc6IGJ1aWxkVGVzdFdvcmtmbG93KHJvb3RDb25maWcsIGFsbFBhY2thZ2VDb25maWdzLCB1c2VzRm5veCksXG4gICAgICAnc2VtYW50aWMtcHIueW1sJzogYnVpbGRTZW1hbnRpY1ByV29ya2Zsb3coKSxcbiAgICB9O1xuICAgIC8vIERlcGxveSB3b3JrZmxvd3MgYXJlIGdlbmVyYXRlZCBwZXIgZGVwbG95IHNjcmlwdCB0aGUgcmVwb3NpdG9yeSBkZWNsYXJlcywgc28gYSByZXBvc2l0b3J5XG4gICAgLy8gd2l0aG91dCBhIHN0YWdpbmcgZW52aXJvbm1lbnQgc2ltcGx5IGdldHMgbm8gc3RhZ2luZyB3b3JrZmxvdy4gT25seSBzY3JpcHRzIHRoYXQgaW52b2tlXG4gICAgLy8gYHdiIGRlcGxveWAgcXVhbGlmeTogYSBiZXNwb2tlIGRlcGxveSBzY3JpcHQgbWF5IG5vdCBiZSBzYWZlIHRvIHRyaWdnZXIgYXV0b21hdGljYWxseVxuICAgIC8vIChkZXBsb3ktc3RhZ2luZyBydW5zIG9uIGV2ZXJ5IHB1c2ggdG8gdGhlIGRlZmF1bHQgYnJhbmNoKS5cbiAgICBjb25zdCBzY3JpcHRzID0gcm9vdENvbmZpZy5wYWNrYWdlSnNvbj8uc2NyaXB0cyA/PyB7fTtcbiAgICBjb25zdCBoYXNQcm9kdWN0aW9uRGVwbG95V29ya2Zsb3cgPSBpc1diRGVwbG95U2NyaXB0KHNjcmlwdHNbJ2RlcGxveSddKTtcbiAgICBpZiAoaGFzUHJvZHVjdGlvbkRlcGxveVdvcmtmbG93KSB7XG4gICAgICB3b3JrZmxvd0J5RmlsZU5hbWVbJ2RlcGxveS1wcm9kdWN0aW9uLnltbCddID0gYnVpbGREZXBsb3lXb3JrZmxvdygncHJvZHVjdGlvbicsICdkZXBsb3knLCB1c2VzRm5veCk7XG4gICAgfVxuICAgIGlmIChpc1diRGVwbG95U2NyaXB0KHNjcmlwdHNbJ2RlcGxveTpzdGFnaW5nJ10pKSB7XG4gICAgICB3b3JrZmxvd0J5RmlsZU5hbWVbJ2RlcGxveS1zdGFnaW5nLnltbCddID0gYnVpbGREZXBsb3lXb3JrZmxvdygnc3RhZ2luZycsICdkZXBsb3k6c3RhZ2luZycsIHVzZXNGbm94KTtcbiAgICB9XG4gICAgaWYgKHJvb3RDb25maWcuZGVwZW5kaW5nLnNlbWFudGljUmVsZWFzZSAmJiByb290Q29uZmlnLnJlbGVhc2UuYnJhbmNoZXMubGVuZ3RoID4gMCkge1xuICAgICAgd29ya2Zsb3dCeUZpbGVOYW1lWydyZWxlYXNlLnltbCddID0gYnVpbGRSZWxlYXNlV29ya2Zsb3cocm9vdENvbmZpZywgaGFzUHJvZHVjdGlvbkRlcGxveVdvcmtmbG93LCB1c2VzRm5veCk7XG4gICAgfVxuICAgIGZvciAoY29uc3QgW2ZpbGVOYW1lLCB3b3JrZmxvd10gb2YgT2JqZWN0LmVudHJpZXMod29ya2Zsb3dCeUZpbGVOYW1lKSkge1xuICAgICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IHdyaXRlU2VsZkNvbnRhaW5lZFdvcmtmbG93KHBhdGguam9pbih3b3JrZmxvd3NQYXRoLCBmaWxlTmFtZSksIHdvcmtmbG93KSk7XG4gICAgfVxuICB9KTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gd3JpdGVTZWxmQ29udGFpbmVkV29ya2Zsb3coZmlsZVBhdGg6IHN0cmluZywgd29ya2Zsb3c6IFdvcmtmbG93KTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IG9sZENvbnRlbnQgPSBhd2FpdCBmc1V0aWwucmVhZEZpbGVJZkV4aXN0cyhmaWxlUGF0aCk7XG4gIC8vIFVubGlrZSBXaWxsQm9vc3Rlci1vcmdhbml6YXRpb24gcmVwb3NpdG9yaWVzLCB3YmZ5IGRvZXMgbm90IG93biBhcmJpdHJhcnkgcmVwb3NpdG9yaWVzJyBDSTpcbiAgLy8gb25seSBmaWxlcyBpdCBnZW5lcmF0ZWQgKGlkZW50aWZpZWQgYnkgdGhlIG1hcmtlcikgYXJlIHJlZ2VuZXJhdGVkLCBhbmQgaGFuZC13cml0dGVuXG4gIC8vIHdvcmtmbG93cyBhcmUgbmV2ZXIgdG91Y2hlZC4gT3duZXJzIG9wdCBvdXQgcGVybWFuZW50bHkgYnkgcmVtb3ZpbmcgdGhlIG1hcmtlciBsaW5lLlxuICAvLyBBbiBlbXB0eSBvciB3aGl0ZXNwYWNlLW9ubHkgZmlsZSBjYXJyaWVzIG5vIGhhbmQtd3JpdHRlbiBjb250ZW50LCBzbyBpdCBpcyB0cmVhdGVkIGFzIGFic2VudC5cbiAgaWYgKG9sZENvbnRlbnQgIT09IHVuZGVmaW5lZCAmJiBvbGRDb250ZW50LnRyaW0oKSAhPT0gJycgJiYgIW9sZENvbnRlbnQuc3RhcnRzV2l0aChzZWxmQ29udGFpbmVkV29ya2Zsb3dNYXJrZXIpKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgY29uc3QgaGVhZGVyID0gYCR7c2VsZkNvbnRhaW5lZFdvcmtmbG93TWFya2VyfSBSZW1vdmUgdGhpcyBsaW5lIHRvIHN0b3Agd2JmeSBmcm9tIG92ZXJ3cml0aW5nIHRoaXMgZmlsZS5cXG5gO1xuICBjb25zdCB5YW1sVGV4dCA9IHlhbWwuZHVtcCh3b3JrZmxvdywgeyBsaW5lV2lkdGg6IC0xIH0pO1xuICBhd2FpdCBmc1V0aWwud3JpdGVGaWxlQ29uZmluZWQoZmlsZVBhdGgsIGhlYWRlciArIHlhbWxUZXh0KTtcbn1cblxuZnVuY3Rpb24gd29ya2luZ0RpcihkaXJQYXRoOiBzdHJpbmcpOiBQaWNrPFN0ZXAsICd3b3JraW5nLWRpcmVjdG9yeSc+IHtcbiAgcmV0dXJuIGRpclBhdGggPyB7ICd3b3JraW5nLWRpcmVjdG9yeSc6IGRpclBhdGggfSA6IHt9O1xufVxuXG5mdW5jdGlvbiBpc1diRGVwbG95U2NyaXB0KHNjcmlwdDogdW5rbm93bik6IGJvb2xlYW4ge1xuICByZXR1cm4gdHlwZW9mIHNjcmlwdCA9PT0gJ3N0cmluZycgJiYgL1xcYndiIGRlcGxveVxcYi91LnRlc3Qoc2NyaXB0KTtcbn1cblxuZnVuY3Rpb24gYnVpbGRUZXN0V29ya2Zsb3coY29uZmlnOiBQYWNrYWdlQ29uZmlnLCBhbGxQYWNrYWdlQ29uZmlnczogUGFja2FnZUNvbmZpZ1tdLCB1c2VzRm5veDogYm9vbGVhbik6IFdvcmtmbG93IHtcbiAgLy8gUGxheXdyaWdodCBtYXkgYmUgZGVjbGFyZWQgb25seSBpbiB3b3Jrc3BhY2UgcGFja2FnZXM7IGB3YiB0ZXN0LW9uLWNpYCBydW5zIGV2ZXJ5IGRlY2xhcmluZ1xuICAvLyBwYWNrYWdlJ3MgZTJlIHRlc3RzLCBzbyB0aGUgd29ya2Zsb3cgbXVzdCBpbnN0YWxsIGJyb3dzZXJzIGZvciBlYWNoIG9mIHRoZW0gKHRoZWlyIHZlcnNpb25zXG4gIC8vIG1heSBkaWZmZXIsIGFuZCBlYWNoIGxpYnJhcnkgdmVyc2lvbiByZXF1aXJlcyBpdHMgbWF0Y2hpbmcgYnJvd3NlciBiaW5hcmllcykuIEJ1bidzIGlzb2xhdGVkXG4gIC8vIGxpbmtlciByZXNvbHZlcyB0aGUgcGxheXdyaWdodCBiaW5hcnkgb25seSBmcm9tIHRoZSBkZWNsYXJpbmcgcGFja2FnZSwgaGVuY2UgdGhlXG4gIC8vIHdvcmtpbmctZGlyZWN0b3J5IG9uIGV2ZXJ5IHN0ZXAuIFRoZSBicm93c2VycyBsYW5kIGluIH4vLmNhY2hlL21zLXBsYXl3cmlnaHQsIHNoYXJlZCBhY3Jvc3NcbiAgLy8gd29ya3NwYWNlcywgc28gc2FtZS12ZXJzaW9uIGluc3RhbGxzIG5hdHVyYWxseSBkZWR1cGxpY2F0ZS5cbiAgY29uc3QgcGxheXdyaWdodERpclBhdGhzID0gWy4uLmFsbFBhY2thZ2VDb25maWdzXVxuICAgIC50b1NvcnRlZCgoYSwgYikgPT4gYS5kaXJQYXRoLmxvY2FsZUNvbXBhcmUoYi5kaXJQYXRoKSlcbiAgICAuZmlsdGVyKChwYWNrYWdlQ29uZmlnKSA9PiBwYWNrYWdlQ29uZmlnLmRlcGVuZGluZy5wbGF5d3JpZ2h0VGVzdClcbiAgICAubWFwKChwYWNrYWdlQ29uZmlnKSA9PiBwYXRoLnJlbGF0aXZlKGNvbmZpZy5kaXJQYXRoLCBwYWNrYWdlQ29uZmlnLmRpclBhdGgpKTtcbiAgY29uc3QgaGFzVHlwZWNoZWNrID0gY29uZmlnLmRvZXNDb250YWluVHlwZVNjcmlwdCB8fCBjb25maWcuZG9lc0NvbnRhaW5UeXBlU2NyaXB0SW5QYWNrYWdlcztcbiAgLy8gU3RlcC1zY29wZWQgbGlrZSB0aGUgcmV1c2FibGUgdGVzdCB3b3JrZmxvdzogZGVwZW5kZW5jeSBsaWZlY3ljbGUgc2NyaXB0cyBydW4gYnkgYGJ1biBpbnN0YWxsYFxuICAvLyBtdXN0IG5vdCBiZSBhYmxlIHRvIHJlYWQgdGhlIGxvbmctbGl2ZWQgYWdlIGlkZW50aXR5LlxuICBjb25zdCBmbm94RW52OiBQaWNrPFN0ZXAsICdlbnYnPiA9IHVzZXNGbm94ID8geyBlbnY6IHsgRk5PWF9BR0VfS0VZOiAnJHt7IHNlY3JldHMuRk5PWF9BR0VfS0VZIH19JyB9IH0gOiB7fTtcblxuICBjb25zdCBzdGVwczogU3RlcFtdID0gW1xuICAgIHsgdXNlczogY2hlY2tvdXRBY3Rpb24gfSxcbiAgICB7IHVzZXM6IG1pc2VBY3Rpb24gfSxcbiAgICAuLi5idWlsZEluc3RhbGxTdGVwcyh0cnVlKSxcbiAgICAuLi4ocGxheXdyaWdodERpclBhdGhzLmxlbmd0aCA+IDBcbiAgICAgID8gKFtcbiAgICAgICAgICAuLi5wbGF5d3JpZ2h0RGlyUGF0aHMubWFwKChkaXJQYXRoLCBpbmRleCk6IFN0ZXAgPT4gKHtcbiAgICAgICAgICAgIG5hbWU6IGBHZXQgUGxheXdyaWdodCB2ZXJzaW9uJHtkaXJQYXRoID8gYCAoJHtkaXJQYXRofSlgIDogJyd9YCxcbiAgICAgICAgICAgIC8vIFRoZSBJTlNUQUxMRUQgdmVyc2lvbiwgbm90IHRoZSBwYWNrYWdlLmpzb24gc3BlY2lmaWVyOiBhIHJhbmdlIGxpa2UgYF4xLjQ1LjBgXG4gICAgICAgICAgICAvLyBzdGF5cyB1bmNoYW5nZWQgYWNyb3NzIGxvY2tmaWxlIHVwZGF0ZXMsIHNvIGtleWluZyB0aGUgY2FjaGUgb24gaXQgd291bGQgcmVzdG9yZVxuICAgICAgICAgICAgLy8gc3RhbGUgYnJvd3NlcnMgdGhhdCBubyBsb25nZXIgbWF0Y2ggdGhlIGxpYnJhcnkuIFJ1bnMgYWZ0ZXIgYGJ1biBpbnN0YWxsYCwgc28gdGhlXG4gICAgICAgICAgICAvLyBwYWNrYWdlIGlzIHJlc29sdmFibGUgZnJvbSB0aGUgZGVjbGFyaW5nIHBhY2thZ2UncyBkaXJlY3RvcnkuXG4gICAgICAgICAgICBpZDogYHBsYXl3cmlnaHQtdmVyc2lvbi0ke2luZGV4fWAsXG4gICAgICAgICAgICBydW46ICdlY2hvIFwidmVyc2lvbj0kKGJ1biAtZSBcInRyeSB7IGNvbnNvbGUubG9nKHJlcXVpcmUoXFwnQHBsYXl3cmlnaHQvdGVzdC9wYWNrYWdlLmpzb25cXCcpLnZlcnNpb24pIH0gY2F0Y2gge31cIilcIiA+PiBcIiRHSVRIVUJfT1VUUFVUXCInLFxuICAgICAgICAgICAgLi4ud29ya2luZ0RpcihkaXJQYXRoKSxcbiAgICAgICAgICB9KSksXG4gICAgICAgICAge1xuICAgICAgICAgICAgbmFtZTogJ0NhY2hlIFBsYXl3cmlnaHQgYnJvd3NlcnMnLFxuICAgICAgICAgICAgaWQ6ICdwbGF5d3JpZ2h0LWNhY2hlJyxcbiAgICAgICAgICAgIHVzZXM6IGNhY2hlQWN0aW9uLFxuICAgICAgICAgICAgd2l0aDoge1xuICAgICAgICAgICAgICBwYXRoOiAnfi8uY2FjaGUvbXMtcGxheXdyaWdodCcsXG4gICAgICAgICAgICAgIGtleTogYHBsYXl3cmlnaHQtXFwke3sgcnVubmVyLm9zIH19LSR7cGxheXdyaWdodERpclBhdGhzXG4gICAgICAgICAgICAgICAgLm1hcCgoXywgaW5kZXgpID0+IGBcXCR7eyBzdGVwcy5wbGF5d3JpZ2h0LXZlcnNpb24tJHtpbmRleH0ub3V0cHV0cy52ZXJzaW9uIH19YClcbiAgICAgICAgICAgICAgICAuam9pbignLScpfWAsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH0sXG4gICAgICAgICAgLi4ucGxheXdyaWdodERpclBhdGhzLm1hcCgoZGlyUGF0aCk6IFN0ZXAgPT4gKHtcbiAgICAgICAgICAgIGlmOiBcInN0ZXBzLnBsYXl3cmlnaHQtY2FjaGUub3V0cHV0cy5jYWNoZS1oaXQgIT0gJ3RydWUnXCIsXG4gICAgICAgICAgICBydW46ICdidW4gcGxheXdyaWdodCBpbnN0YWxsIC0td2l0aC1kZXBzJyxcbiAgICAgICAgICAgIC4uLndvcmtpbmdEaXIoZGlyUGF0aCksXG4gICAgICAgICAgfSkpLFxuICAgICAgICAgIC4uLnBsYXl3cmlnaHREaXJQYXRocy5tYXAoKGRpclBhdGgpOiBTdGVwID0+ICh7XG4gICAgICAgICAgICAvLyBUaGUgY2FjaGVkIGJyb3dzZXJzIHN0aWxsIG5lZWQgdGhlaXIgc3lzdGVtIGRlcGVuZGVuY2llcyBvbiBhIGZyZXNoIHJ1bm5lci5cbiAgICAgICAgICAgIGlmOiBcInN0ZXBzLnBsYXl3cmlnaHQtY2FjaGUub3V0cHV0cy5jYWNoZS1oaXQgPT0gJ3RydWUnXCIsXG4gICAgICAgICAgICBydW46ICdidW4gcGxheXdyaWdodCBpbnN0YWxsLWRlcHMnLFxuICAgICAgICAgICAgLi4ud29ya2luZ0RpcihkaXJQYXRoKSxcbiAgICAgICAgICB9KSksXG4gICAgICAgIF0gc2F0aXNmaWVzIFN0ZXBbXSlcbiAgICAgIDogW10pLFxuICAgIC4uLihoYXNUeXBlY2hlY2sgPyBbeyBydW46ICdidW4gcnVuIHR5cGVjaGVjaycsIC4uLmZub3hFbnYgfV0gOiBbXSksXG4gICAgeyBydW46ICdidW4gcnVuIGxpbnQnLCAuLi5mbm94RW52IH0sXG4gICAge1xuICAgICAgbmFtZTogJ1Rlc3QnLFxuICAgICAgaWQ6ICd0ZXN0JyxcbiAgICAgIHJ1bjogYGlmIFtbIFwiJFVQTE9BRF9URVNUX0xPR1wiICE9IFwidHJ1ZVwiIF1dOyB0aGVuXG4gIGV4ZWMgYnVuIHJ1biB0ZXN0L2NpXG5maVxubG9nX2Rpcj0kKG1rdGVtcCAtZCBcIiRSVU5ORVJfVEVNUC90ZXN0LW91dHB1dC5YWFhYWFhcIilcbmVjaG8gXCJsb2dfcGF0aD0kbG9nX2Rpci90ZXN0LmxvZ1wiID4+IFwiJEdJVEhVQl9PVVRQVVRcIlxuIyBLZWVwIGRyYWluaW5nIHRlc3Qgb3V0cHV0IHdoZW4gdGhlIGxvZyByZWFjaGVzIGEgZmlsZS1zaXplIGxpbWl0Llxuc2V0ICtlXG5idW4gcnVuIHRlc3QvY2kgMj4mMSB8ICh0cmFwICcnIFhGU1o7IHRlZSBcIiRsb2dfZGlyL3Rlc3QubG9nXCIpXG50ZXN0X3N0YXR1cz0oXCJcXCR7UElQRVNUQVRVU1tAXX1cIilcbmlmICgoIHRlc3Rfc3RhdHVzWzBdICE9IDAgKSk7IHRoZW4gZXhpdCBcIlxcJHt0ZXN0X3N0YXR1c1swXX1cIjsgZmlcbmV4aXQgXCJcXCR7dGVzdF9zdGF0dXNbMV19XCJgLFxuICAgICAgZW52OiB7IC4uLmZub3hFbnYuZW52LCBVUExPQURfVEVTVF9MT0c6ICcke3sgdmFycy5VUExPQURfVEVTVF9MT0cgfX0nIH0sXG4gICAgfSxcbiAgICB7XG4gICAgICBuYW1lOiAnVXBsb2FkIHRlc3QgbG9nJyxcbiAgICAgIGlmOiBcIiR7eyBhbHdheXMoKSAmJiB2YXJzLlVQTE9BRF9URVNUX0xPRyA9PSAndHJ1ZScgJiYgc3RlcHMudGVzdC5vdXRwdXRzLmxvZ19wYXRoICE9ICcnIH19XCIsXG4gICAgICB1c2VzOiB1cGxvYWRBcnRpZmFjdEFjdGlvbixcbiAgICAgIHdpdGg6IHtcbiAgICAgICAgbmFtZTogJ3Rlc3Qtb3V0cHV0LSR7eyBydW5uZXIub3MgfX0tJHt7IGpvYi5jaGVja19ydW5faWQgfX0tJHt7IGdpdGh1Yi5ydW5fYXR0ZW1wdCB9fScsXG4gICAgICAgIHBhdGg6ICcke3sgc3RlcHMudGVzdC5vdXRwdXRzLmxvZ19wYXRoIH19JyxcbiAgICAgICAgJ3JldGVudGlvbi1kYXlzJzogMTQsXG4gICAgICAgICdpZi1uby1maWxlcy1mb3VuZCc6ICdlcnJvcicsXG4gICAgICB9LFxuICAgIH0sXG4gICAgLi4uKHBsYXl3cmlnaHREaXJQYXRocy5sZW5ndGggPiAwXG4gICAgICA/IFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICBuYW1lOiAnVXBsb2FkIHRlc3QgcmVzdWx0cycsXG4gICAgICAgICAgICBpZjogJyR7eyBhbHdheXMoKSB9fScsXG4gICAgICAgICAgICB1c2VzOiB1cGxvYWRBcnRpZmFjdEFjdGlvbixcbiAgICAgICAgICAgIHdpdGg6IHtcbiAgICAgICAgICAgICAgbmFtZTogJ3Rlc3QtcmVzdWx0cycsXG4gICAgICAgICAgICAgIC8vIEV2ZXJ5IGRlY2xhcmluZyBwYWNrYWdlIHdyaXRlcyBpdHMgb3duIHRlc3QtcmVzdWx0cyBkaXJlY3Rvcnk7IGEgbmV3bGluZS1zZXBhcmF0ZWRcbiAgICAgICAgICAgICAgLy8gbGlzdCB1cGxvYWRzIHRoZW0gYWxsLlxuICAgICAgICAgICAgICBwYXRoOiBwbGF5d3JpZ2h0RGlyUGF0aHNcbiAgICAgICAgICAgICAgICAubWFwKChkaXJQYXRoKSA9PiAoZGlyUGF0aCA/IHBhdGgucG9zaXguam9pbihkaXJQYXRoLCAndGVzdC1yZXN1bHRzJykgOiAndGVzdC1yZXN1bHRzJykpXG4gICAgICAgICAgICAgICAgLmpvaW4oJ1xcbicpLFxuICAgICAgICAgICAgICAnaWYtbm8tZmlsZXMtZm91bmQnOiAnaWdub3JlJyxcbiAgICAgICAgICAgICAgJ3JldGVudGlvbi1kYXlzJzogMTQsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH0sXG4gICAgICAgIF1cbiAgICAgIDogW10pLFxuICBdO1xuXG4gIHJldHVybiB7XG4gICAgbmFtZTogJ1Rlc3QnLFxuICAgIG9uOiB7XG4gICAgICBwdWxsX3JlcXVlc3Q6IG51bGwsXG4gICAgICBwdXNoOiB7IGJyYW5jaGVzOiBbJ21haW4nXSB9LFxuICAgIH0sXG4gICAgY29uY3VycmVuY3k6IHtcbiAgICAgIGdyb3VwOiAnJHt7IGdpdGh1Yi53b3JrZmxvdyB9fS0ke3sgZ2l0aHViLnJlZiB9fScsXG4gICAgICAnY2FuY2VsLWluLXByb2dyZXNzJzogdHJ1ZSxcbiAgICB9LFxuICAgIHBlcm1pc3Npb25zOiB7IGNvbnRlbnRzOiAncmVhZCcgfSxcbiAgICBqb2JzOiB7XG4gICAgICB0ZXN0OiB7XG4gICAgICAgICdydW5zLW9uJzogJ3VidW50dS1sYXRlc3QnLFxuICAgICAgICBlbnY6IHsgRk9SQ0VfQ09MT1I6ICczJywgV0JfRU5WOiAndGVzdCcsIC4uLmd1YXJkSm9iRW52IH0sXG4gICAgICAgIHN0ZXBzLFxuICAgICAgfSxcbiAgICB9LFxuICB9O1xufVxuXG5mdW5jdGlvbiBidWlsZERlcGxveVdvcmtmbG93KGVudmlyb25tZW50OiAnc3RhZ2luZycgfCAncHJvZHVjdGlvbicsIHNjcmlwdE5hbWU6IHN0cmluZywgdXNlc0Zub3g6IGJvb2xlYW4pOiBXb3JrZmxvdyB7XG4gIHJldHVybiB7XG4gICAgbmFtZTogYERlcGxveSBhcHAgb24gJHtlbnZpcm9ubWVudH1gLFxuICAgIG9uOiB7XG4gICAgICB3b3JrZmxvd19kaXNwYXRjaDogbnVsbCxcbiAgICAgIC8vIFByb2R1Y3Rpb24gZGVwbG95cyBmb2xsb3cgcHVibGlzaGVkIHJlbGVhc2VzIChzZWUgdGhlIHJlbGVhc2Ugd29ya2Zsb3cncyB0cmlnZ2VyIHN0ZXApO1xuICAgICAgLy8gc3RhZ2luZyBjb252ZXJnZXMgb24gZXZlcnkgZGVmYXVsdC1icmFuY2ggcHVzaC5cbiAgICAgIC4uLihlbnZpcm9ubWVudCA9PT0gJ3Byb2R1Y3Rpb24nXG4gICAgICAgID8geyByZWxlYXNlOiB7IHR5cGVzOiBbJ3B1Ymxpc2hlZCddIH0gfVxuICAgICAgICA6IHsgcHVzaDogeyBicmFuY2hlczogWydtYWluJ10sICdwYXRocy1pZ25vcmUnOiBbJyoqLm1kJywgJyoqL2RvY3MvKionXSB9IH0pLFxuICAgIH0sXG4gICAgY29uY3VycmVuY3k6IHtcbiAgICAgIGdyb3VwOiAnJHt7IGdpdGh1Yi53b3JrZmxvdyB9fScsXG4gICAgICAnY2FuY2VsLWluLXByb2dyZXNzJzogZmFsc2UsXG4gICAgfSxcbiAgICBwZXJtaXNzaW9uczogeyBjb250ZW50czogJ3JlYWQnIH0sXG4gICAgam9iczoge1xuICAgICAgZGVwbG95OiB7XG4gICAgICAgICdydW5zLW9uJzogJ3VidW50dS1sYXRlc3QnLFxuICAgICAgICBlbnY6IHsgV0JfRU5WOiBlbnZpcm9ubWVudCwgLi4uZ3VhcmRKb2JFbnYgfSxcbiAgICAgICAgc3RlcHM6IFtcbiAgICAgICAgICAvLyBmZXRjaC1kZXB0aCAwIHNvIGBnaXQgZGVzY3JpYmVgIHNlZXMgdGhlIHRhZ3MgV0JfVkVSU0lPTiBpcyBkZXJpdmVkIGZyb20uXG4gICAgICAgICAgeyB1c2VzOiBjaGVja291dEFjdGlvbiwgd2l0aDogeyAnZmV0Y2gtZGVwdGgnOiAwIH0gfSxcbiAgICAgICAgICB7IHVzZXM6IG1pc2VBY3Rpb24gfSxcbiAgICAgICAgICB7XG4gICAgICAgICAgICBuYW1lOiAnU2V0IFdCX1ZFUlNJT04nLFxuICAgICAgICAgICAgcnVuOiAnc2V0IC1ldW8gcGlwZWZhaWxcXG5XQl9WRVJTSU9OPSQoZ2l0IGRlc2NyaWJlIC0tYWx3YXlzIC0tdGFncylcXG5lY2hvIFwiV0JfVkVSU0lPTj0kV0JfVkVSU0lPTlwiID4+IFwiJEdJVEhVQl9FTlZcIicsXG4gICAgICAgICAgfSxcbiAgICAgICAgICAuLi5idWlsZEluc3RhbGxTdGVwcyhmYWxzZSksXG4gICAgICAgICAge1xuICAgICAgICAgICAgbmFtZTogJ0RlcGxveScsXG4gICAgICAgICAgICB1c2VzOiByZXRyeUFjdGlvbixcbiAgICAgICAgICAgIHdpdGg6IHtcbiAgICAgICAgICAgICAgdGltZW91dF9taW51dGVzOiA2MCxcbiAgICAgICAgICAgICAgbWF4X2F0dGVtcHRzOiA1LFxuICAgICAgICAgICAgICBjb21tYW5kOiBgYnVuIHJ1biAke3NjcmlwdE5hbWV9YCxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAvLyBTdGVwLXNjb3BlZCBsaWtlIHRoZSB0ZXN0IHdvcmtmbG93OiBkZXBlbmRlbmN5IGxpZmVjeWNsZSBzY3JpcHRzIHJ1biBieVxuICAgICAgICAgICAgLy8gYGJ1biBpbnN0YWxsYCBtdXN0IG5vdCBiZSBhYmxlIHRvIHJlYWQgdGhlIGxvbmctbGl2ZWQgYWdlIGlkZW50aXR5LlxuICAgICAgICAgICAgLi4uKHVzZXNGbm94ID8geyBlbnY6IHsgRk5PWF9BR0VfS0VZOiAnJHt7IHNlY3JldHMuRk5PWF9BR0VfS0VZIH19JyB9IH0gOiB7fSksXG4gICAgICAgICAgfSxcbiAgICAgICAgXSxcbiAgICAgIH0sXG4gICAgfSxcbiAgfTtcbn1cblxuZnVuY3Rpb24gYnVpbGRSZWxlYXNlV29ya2Zsb3coXG4gIGNvbmZpZzogUGFja2FnZUNvbmZpZyxcbiAgaGFzUHJvZHVjdGlvbkRlcGxveVdvcmtmbG93OiBib29sZWFuLFxuICB1c2VzRm5veDogYm9vbGVhblxuKTogV29ya2Zsb3cge1xuICBjb25zdCBmbm94RW52OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0gdXNlc0Zub3ggPyB7IEZOT1hfQUdFX0tFWTogJyR7eyBzZWNyZXRzLkZOT1hfQUdFX0tFWSB9fScgfSA6IHt9O1xuICByZXR1cm4ge1xuICAgIG5hbWU6ICdSZWxlYXNlJyxcbiAgICBvbjoge1xuICAgICAgcHVzaDogeyBicmFuY2hlczogWy4uLmNvbmZpZy5yZWxlYXNlLmJyYW5jaGVzXSB9LFxuICAgIH0sXG4gICAgY29uY3VycmVuY3k6IHtcbiAgICAgIGdyb3VwOiAnJHt7IGdpdGh1Yi53b3JrZmxvdyB9fScsXG4gICAgICAnY2FuY2VsLWluLXByb2dyZXNzJzogZmFsc2UsXG4gICAgfSxcbiAgICBwZXJtaXNzaW9uczoge1xuICAgICAgLy8gZm9yIHNlbWFudGljLXJlbGVhc2VcbiAgICAgIGNvbnRlbnRzOiAnd3JpdGUnLFxuICAgICAgLy8gZm9yIGRpc3BhdGNoaW5nIHRoZSBwcm9kdWN0aW9uIGRlcGxveSB3b3JrZmxvdyBhZnRlciBhIHJlbGVhc2VcbiAgICAgIC4uLihoYXNQcm9kdWN0aW9uRGVwbG95V29ya2Zsb3cgPyB7IGFjdGlvbnM6ICd3cml0ZScgfSA6IHt9KSxcbiAgICB9LFxuICAgIGpvYnM6IHtcbiAgICAgIHJlbGVhc2U6IHtcbiAgICAgICAgJ3J1bnMtb24nOiAndWJ1bnR1LWxhdGVzdCcsXG4gICAgICAgIC8vIFJlbGVhc2VzIGJ1aWxkIHByb2R1Y3Rpb24gYXJ0aWZhY3RzLCBoZW5jZSB0aGUgZW52aXJvbm1lbnQg4oCUIHRoZSBzYW1lIGRlZmF1bHQgYXMgdGhlXG4gICAgICAgIC8vIHJldXNhYmxlIHJlbGVhc2Ugd29ya2Zsb3cuIHdiJ3MgQ0kgZ3VhcmQgYWxzbyByZXF1aXJlcyBhbiBleHBvcnRlZCBXQl9FTlYsIHNvIHdpdGhvdXRcbiAgICAgICAgLy8gaXQgYSBgcG9zdGluc3RhbGxgIHRoYXQgY2FsbHMgd2IgKGUuZy4gYHdiIGdlbi1jb2RlYCkgZXhpdHMgMSBiZWZvcmUgc2VtYW50aWMtcmVsZWFzZVxuICAgICAgICAvLyBydW5zLlxuICAgICAgICBlbnY6IHsgV0JfRU5WOiAncHJvZHVjdGlvbicsIC4uLmd1YXJkSm9iRW52IH0sXG4gICAgICAgIHN0ZXBzOiBbXG4gICAgICAgICAgLy8gZmV0Y2gtZGVwdGggMDogc2VtYW50aWMtcmVsZWFzZSByZWFkcyB0aGUgZnVsbCBoaXN0b3J5IHRvIGNvbXB1dGUgdGhlIG5leHQgdmVyc2lvbi5cbiAgICAgICAgICB7IHVzZXM6IGNoZWNrb3V0QWN0aW9uLCB3aXRoOiB7ICdmZXRjaC1kZXB0aCc6IDAgfSB9LFxuICAgICAgICAgIHsgdXNlczogbWlzZUFjdGlvbiB9LFxuICAgICAgICAgIC4uLmJ1aWxkSW5zdGFsbFN0ZXBzKGZhbHNlKSxcbiAgICAgICAgICAuLi4oaGFzUHJvZHVjdGlvbkRlcGxveVdvcmtmbG93XG4gICAgICAgICAgICA/IFtcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICBuYW1lOiAnR2V0IGN1cnJlbnQgbGF0ZXN0IHRhZycsXG4gICAgICAgICAgICAgICAgICBpZDogJ3ByZS1yZWxlYXNlLXRhZycsXG4gICAgICAgICAgICAgICAgICBydW46ICdzZXQgLWV1byBwaXBlZmFpbFxcbmVjaG8gXCJ0YWc9JChnaXQgZGVzY3JpYmUgLS10YWdzIC0tYWJicmV2PTAgMj4vZGV2L251bGwgfHwgZWNobyBcXCdcXCcpXCIgPj4gXCIkR0lUSFVCX09VVFBVVFwiJyxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICBdXG4gICAgICAgICAgICA6IFtdKSxcbiAgICAgICAgICB7XG4gICAgICAgICAgICBuYW1lOiAnUmVsZWFzZScsXG4gICAgICAgICAgICAvLyBzZW1hbnRpYy1yZWxlYXNlIGNoZWNrcyBOb2RlLmpzIHJ1bnRpbWUgcmVxdWlyZW1lbnRzOyBgYnVuIDxiaW4+YCByZXNwZWN0cyBpdHNcbiAgICAgICAgICAgIC8vIGAjIS91c3IvYmluL2VudiBub2RlYCBzaGViYW5nLCBzbyBpdCBzdGlsbCBydW5zIHVuZGVyIHJlYWwgTm9kZS5cbiAgICAgICAgICAgIHJ1bjogJ2J1biBzZW1hbnRpYy1yZWxlYXNlJyxcbiAgICAgICAgICAgIGVudjoge1xuICAgICAgICAgICAgICBHSVRIVUJfVE9LRU46ICcke3sgc2VjcmV0cy5HSVRIVUJfVE9LRU4gfX0nLFxuICAgICAgICAgICAgICBMRUZUSE9PSzogJzAnLFxuICAgICAgICAgICAgICAuLi5mbm94RW52LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9LFxuICAgICAgICAgIC4uLihoYXNQcm9kdWN0aW9uRGVwbG95V29ya2Zsb3dcbiAgICAgICAgICAgID8gKFtcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICBuYW1lOiAnQ2hlY2sgZm9yIG5ldyByZWxlYXNlIHRhZycsXG4gICAgICAgICAgICAgICAgICBpZDogJ3Bvc3QtcmVsZWFzZS10YWcnLFxuICAgICAgICAgICAgICAgICAgcnVuOiAnc2V0IC1ldW8gcGlwZWZhaWxcXG5naXQgZmV0Y2ggLS10YWdzIC0tZm9yY2VcXG5ORVdfVEFHPSQoZ2l0IGRlc2NyaWJlIC0tdGFncyAtLWFiYnJldj0wIDI+L2Rldi9udWxsIHx8IGVjaG8gXFwnXFwnKVxcbmVjaG8gXCJ0YWc9JE5FV19UQUdcIiA+PiBcIiRHSVRIVUJfT1VUUFVUXCJcXG5pZiBbWyAtbiBcIiRORVdfVEFHXCIgJiYgXCIkTkVXX1RBR1wiICE9IFwiJHt7IHN0ZXBzLnByZS1yZWxlYXNlLXRhZy5vdXRwdXRzLnRhZyB9fVwiIF1dOyB0aGVuXFxuICBlY2hvIFwiY3JlYXRlZD10cnVlXCIgPj4gXCIkR0lUSFVCX09VVFBVVFwiXFxuZmknLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgaWY6IFwic3RlcHMucG9zdC1yZWxlYXNlLXRhZy5vdXRwdXRzLmNyZWF0ZWQgPT0gJ3RydWUnXCIsXG4gICAgICAgICAgICAgICAgICBuYW1lOiAnVHJpZ2dlciBwcm9kdWN0aW9uIGRlcGxveScsXG4gICAgICAgICAgICAgICAgICAvLyBBIEdJVEhVQl9UT0tFTi1jcmVhdGVkIHJlbGVhc2UgZG9lcyBub3QgZmlyZSB0aGUgZGVwbG95IHdvcmtmbG93J3NcbiAgICAgICAgICAgICAgICAgIC8vIHJlbGVhc2UtcHVibGlzaGVkIHRyaWdnZXIsIHNvIGRpc3BhdGNoIGl0IGV4cGxpY2l0bHkgb24gdGhlIG5ldyB0YWcuXG4gICAgICAgICAgICAgICAgICBydW46ICdnaCB3b3JrZmxvdyBydW4gZGVwbG95LXByb2R1Y3Rpb24ueW1sIC0tcmVmIFwiJHt7IHN0ZXBzLnBvc3QtcmVsZWFzZS10YWcub3V0cHV0cy50YWcgfX1cIicsXG4gICAgICAgICAgICAgICAgICBlbnY6IHsgR0hfVE9LRU46ICcke3sgc2VjcmV0cy5HSVRIVUJfVE9LRU4gfX0nIH0sXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgXSBzYXRpc2ZpZXMgU3RlcFtdKVxuICAgICAgICAgICAgOiBbXSksXG4gICAgICAgIF0sXG4gICAgICB9LFxuICAgIH0sXG4gIH07XG59XG5cbi8qKlxuICogVGhlIGluc3RhbGwgc2VxdWVuY2UgZXZlcnkgZ2VuZXJhdGVkIHdvcmtmbG93IHNoYXJlczogYGJ1biBpbnN0YWxsIC0tZnJvemVuLWxvY2tmaWxlYCwgaGFyZGVuZWQgaW50byB0aGVcbiAqIHJldXNhYmxlIHdvcmtmbG93cycgdGhyZWUtc3RlcCBkYW5jZSB3aGVuIHRoZSByZXBvc2l0b3J5IHJlZ2lzdGVycyBhIFRBS1VNSV9HVUFSRF9UT0tFTiBzZWNyZXQuXG4gKlxuICogVGFrdW1pIEd1YXJkIChodHRwczovL2ZsYXR0LnRlY2gvdGFrdW1pL2ZlYXR1cmVzL2d1YXJkKSBpcyBhIHJlZ2lzdHJ5IHByb3h5IHRoYXQgYmxvY2tzXG4gKiBrbm93bi1tYWxpY2lvdXMgcGFja2FnZXMuIFJvdXRpbmcgdGhlIERFRkFVTFQgcmVnaXN0cnkgdGhyb3VnaCBpdCBpcyB3aGF0IHByb3RlY3RzIHRoZSBpbnN0YWxsLFxuICogYW5kIHRoZSB0b2tlbiBhdXRoZW50aWNhdGVzIHRoYXQgcHJveHkg4oCUIHNvIHRoZSB0b2tlbiBoYXMgdG8gYmUgcHJlc2VudCB3aGlsZSBkZXBlbmRlbmNpZXMgYXJlXG4gKiByZXNvbHZlZCwgd2hpY2ggaXMgZXhhY3RseSB3aGVuIGEgY29tcHJvbWlzZWQgZGVwZW5kZW5jeSdzIGxpZmVjeWNsZSBzY3JpcHQgd291bGQgcnVuLiBIZW5jZSB0aGVcbiAqIHNwbGl0OiByZXNvbHZlIGFuZCBkb3dubG9hZCB3aXRoIGAtLWlnbm9yZS1zY3JpcHRzYCBhbmQgdGhlIHRva2VuLCB0aGVuIHJlcGxheSB0aGUgc2tpcHBlZFxuICogbGlmZWN5Y2xlIHNjcmlwdHMgaW4gYSBzZWNvbmQgaW5zdGFsbCB0aGF0IGhhcyBubyB0b2tlbiAoZXZlcnkgcGFja2FnZSBpcyBhbHJlYWR5IGNhY2hlZCwgYW5kXG4gKiBHdWFyZCBzZXJ2ZXMgYW5vbnltb3VzbHkgYW55d2F5KS4gT25seSBidW4gaXMgZ2VuZXJhdGVkIGhlcmUsIGFuZCBidW4gcmVhZHMgLm5wbXJjLCBzbyBub1xuICogcGFja2FnZS1tYW5hZ2VyIGJyYW5jaGluZyBpcyBuZWVkZWQuXG4gKlxuICogVGhlIHNoZWxsIGRldGFpbHMgZGVsaWJlcmF0ZWx5IG1pcnJvciByZXVzYWJsZS13b3JrZmxvd3MnIHByb2R1Y3Rpb24tcHJvdmVuIGluc3RhbGwgc3RlcHM6IGJhcmVcbiAqIGAkUlVOTkVSX1RFTVBgIChzZXQgYnkgdGhlIHJ1bm5lciBhcHBsaWNhdGlvbiBvbiBldmVyeSBydW5uZXIsIGFuZCBgc2V0IC11YCBmYWlscyBsb3VkbHkgaWYgbm90KSxcbiAqIGBbWyAtZSAubnBtcmMgXV1gLCBhbmQgdGhlIHNlY29uZCBgcm0gLXJmIG5vZGVfbW9kdWxlc2AgaW4gdGhlIGZhbGxiYWNrIChhbiBpbnRlcnJ1cHRlZCBsaWZlY3ljbGVcbiAqIHJ1biBtYXkgbGVhdmUgbm9kZV9tb2R1bGVzIGluY29uc2lzdGVudCwgc28gdGhlIHJldHJ5IHN0YXJ0cyBjbGVhbiByYXRoZXIgdGhhbiB0cnVzdGluZyBhIHJlcGFpcikuXG4gKlxuICogYHRvbGVyYXRlTGlmZWN5Y2xlU2NyaXB0RmFpbHVyZWAgZGVjaWRlcyB3aGF0IGEgZmFpbGluZyBsaWZlY3ljbGUtc2NyaXB0IHJlcGxheSBkb2VzLiBFdmVyeVxuICogcmVwbGF5IHJ1bnMgdG9rZW5sZXNzIGFuZCB3aXRob3V0IEZOT1hfQUdFX0tFWSAodGhlIGtleSBpcyBzY29wZWQgdG8gdGhlIGxhdGVyIERlcGxveS9SZWxlYXNlXG4gKiBzdGVwKSwgc28gYSBwb3N0aW5zdGFsbCB0aGF0IG5lZWRzIGRlY3J5cHRlZCBzZWNyZXRzIGlzIHVuc3VwcG9ydGVkIGluIGFsbCBvZiB0aGVtIGJ5IGRlc2lnbi5cbiAqIFRoZSB0ZXN0IHdvcmtmbG93IHRvbGVyYXRlcyB0aGUgZmFpbHVyZSBiZWNhdXNlIHR5cGVjaGVjay9saW50L3Rlc3QgZmFpbCBsb3VkbHkgb24gYSBkZWdyYWRlZFxuICogdHJlZSBhbnl3YXkuIERlcGxveSBhbmQgcmVsZWFzZSB3b3JrZmxvd3MgbXVzdCBub3Q6IGEgYDo6d2FybmluZzo6YCBkb2VzIG5vdCBmYWlsIHRoZSBqb2IsIHNvXG4gKiB0aGUgZmFsbGJhY2sgd291bGQgc2hpcCBhIHRyZWUgd2hvc2UgbGlmZWN5Y2xlIHNjcmlwdHMgKGUuZy4gYSBgcG9zdGluc3RhbGw6IHdiIGdlbi1jb2RlYClcbiAqIG5ldmVyIHJhbiwgc2lsZW50bHkgZGVwbG95aW5nIGRlZ3JhZGVkIG91dHB1dCAoIzExMjcpLlxuICovXG5mdW5jdGlvbiBidWlsZEluc3RhbGxTdGVwcyh0b2xlcmF0ZUxpZmVjeWNsZVNjcmlwdEZhaWx1cmU6IGJvb2xlYW4pOiBTdGVwW10ge1xuICByZXR1cm4gW1xuICAgIHtcbiAgICAgIGlmOiBcIiR7eyBlbnYuSEFTX1RBS1VNSV9HVUFSRF9UT0tFTiA9PSAndHJ1ZScgfX1cIixcbiAgICAgIG5hbWU6ICdHZW5lcmF0ZSAubnBtcmMgZm9yIFRha3VtaSBHdWFyZCcsXG4gICAgICAvLyBUaGUgdG9rZW4gaXMgd3JpdHRlbiBhcyBhIGxpdGVyYWwgYCR7VEFLVU1JX0dVQVJEX1RPS0VOfWAgcmVmZXJlbmNlIHRoYXQgYnVuIGV4cGFuZHMgYXRcbiAgICAgIC8vIGluc3RhbGwgdGltZSwgc28gdGhlIHNlY3JldCBpdHNlbGYgbmV2ZXIgbGFuZHMgaW4gYSBmaWxlLiBUaGUgbWFuYWdlZCBsaW5lcyBhcmUgc3RyaXBwZWRcbiAgICAgIC8vIGZyb20gYW4gZXhpc3RpbmcgLm5wbXJjIGZpcnN0OiBhIHJlcG9zaXRvcnkgb3V0c2lkZSB0aGUgb3JnYW5pemF0aW9ucyBtYXkgbGVnaXRpbWF0ZWx5XG4gICAgICAvLyBjb21taXQgb25lIChzY29wZSBtYXBwaW5ncyBmb3IgYW5vdGhlciByZWdpc3RyeSksIGFuZCBkcm9wcGluZyBvbmx5IHRoZXNlIHR3byBsaW5lcyBrZWVwc1xuICAgICAgLy8gdGhlIHJlc3Qgb2YgaXQgaW4gZWZmZWN0LiBSZXBsYWNpbmcgdGhlIGZpbGUgd2l0aCBgbXZgIHJhdGhlciB0aGFuIGFwcGVuZGluZyBpbiBwbGFjZSBzdG9wc1xuICAgICAgLy8gYSBjb21taXR0ZWQgc3ltbGluayBmcm9tIHJlZGlyZWN0aW5nIHRoZSB3cml0ZSBpbnRvLCBzYXksIGEgcGVyc2lzdGVudCBob21lIG5wbXJjLlxuICAgICAgcnVuOiBgc2V0IC1ldW8gcGlwZWZhaWxcbk5QTVJDPVwiJChta3RlbXAgXCIkUlVOTkVSX1RFTVAvbnBtcmMuWFhYWFhYXCIpXCJcbmlmIFtbIC1lIC5ucG1yYyBdXTsgdGhlblxuICBncmVwIC12RSAnXnJlZ2lzdHJ5PXxeLy9ucG1cXFxcLmZsYXR0XFxcXC50ZWNoLzpfYXV0aFRva2VuJyAubnBtcmMgPiBcIiROUE1SQ1wiIHx8IHRydWVcbmZpXG5lY2hvICdyZWdpc3RyeT1odHRwczovL25wbS5mbGF0dC50ZWNoLycgPj4gXCIkTlBNUkNcIlxuZWNobyAnLy9ucG0uZmxhdHQudGVjaC86X2F1dGhUb2tlbj1cXCR7VEFLVU1JX0dVQVJEX1RPS0VOfScgPj4gXCIkTlBNUkNcIlxucm0gLWYgLm5wbXJjXG5tdiBcIiROUE1SQ1wiIC5ucG1yY2AsXG4gICAgfSxcbiAgICB7XG4gICAgICBuYW1lOiAnSW5zdGFsbCBkZXBlbmRlbmNpZXMnLFxuICAgICAgLy8gLS1mcm96ZW4tbG9ja2ZpbGU6IGEgcGxhaW4gYGJ1biBpbnN0YWxsYCBzaWxlbnRseSByZXBhaXJzIGEgYnVuLmxvY2sgdGhhdCBpcyBzdGFsZSBhZ2FpbnN0XG4gICAgICAvLyBwYWNrYWdlLmpzb24sIHNvIENJIHdvdWxkIHJ1biBkZXBlbmRlbmN5IHJlc29sdXRpb25zIHRoYXQgd2VyZSBuZXZlciByZXZpZXdlZCAoIzExMjYpLlxuICAgICAgLy8gV2l0aCBOTyBidW4ubG9jayBhdCBhbGwsIC0tZnJvemVuLWxvY2tmaWxlIHNpbGVudGx5IGluc3RhbGxzIGZyZXNoLCB1bnBpbm5lZCByZXNvbHV0aW9uc1xuICAgICAgLy8gKEJ1biAxLjMuMTQgZXhpdHMgMCBhbmQgd3JpdGVzIG5vIGxvY2tmaWxlKSwgc28gYSBtaXNzaW5nIGxvY2tmaWxlIG11c3QgZmFpbCBleHBsaWNpdGx5LlxuICAgICAgcnVuOiBgc2V0IC1ldW8gcGlwZWZhaWxcbmlmIFtbICEgLWUgYnVuLmxvY2sgXV07IHRoZW5cbiAgZWNobyBcIjo6ZXJyb3I6OmJ1bi5sb2NrIGlzIG1pc3Npbmc7IGNvbW1pdCBpdCBzbyBDSSBpbnN0YWxscyBzdGF5IHJlcHJvZHVjaWJsZVwiXG4gIGV4aXQgMVxuZmlcbmlmIFtbIFwiJEhBU19UQUtVTUlfR1VBUkRfVE9LRU5cIiA9PSBcInRydWVcIiBdXTsgdGhlblxuICBidW4gaW5zdGFsbCAtLWZyb3plbi1sb2NrZmlsZSAtLWlnbm9yZS1zY3JpcHRzXG5lbHNlXG4gIGJ1biBpbnN0YWxsIC0tZnJvemVuLWxvY2tmaWxlXG5maWAsXG4gICAgICAvLyBTdGVwLXNjb3BlZDogYSBqb2ItbGV2ZWwgdG9rZW4gd291bGQgYmUgcmVhZGFibGUgYnkgZXZlcnkgZGVwZW5kZW5jeSBsaWZlY3ljbGUgc2NyaXB0IHRoZVxuICAgICAgLy8gdG9rZW5sZXNzIHJlcGxheSBiZWxvdyBydW5zLlxuICAgICAgZW52OiB7IFRBS1VNSV9HVUFSRF9UT0tFTjogJyR7eyBzZWNyZXRzLlRBS1VNSV9HVUFSRF9UT0tFTiB9fScgfSxcbiAgICB9LFxuICAgIHtcbiAgICAgIGlmOiBcIiR7eyBlbnYuSEFTX1RBS1VNSV9HVUFSRF9UT0tFTiA9PSAndHJ1ZScgfX1cIixcbiAgICAgIG5hbWU6ICdSdW4gZGVwZW5kZW5jeSBsaWZlY3ljbGUgc2NyaXB0cyB3aXRob3V0IHJlZ2lzdHJ5IGNyZWRlbnRpYWxzJyxcbiAgICAgIC8vIEEgcmVwZWF0ZWQgYGJ1biBpbnN0YWxsYCBpcyBhIG5vLW9wIHRoYXQgcmVwbGF5cyBub3RoaW5nLCBzbyBub2RlX21vZHVsZXMgaGFzIHRvIGdvIGZpcnN0LlxuICAgICAgcnVuOiBgc2V0IC1ldW8gcGlwZWZhaWxcbnJtIC1yZiBub2RlX21vZHVsZXNcbmJ1biBpbnN0YWxsIC0tZnJvemVuLWxvY2tmaWxlJHtcbiAgICAgICAgdG9sZXJhdGVMaWZlY3ljbGVTY3JpcHRGYWlsdXJlXG4gICAgICAgICAgPyBgIHx8IHtcbiAgZWNobyBcIjo6d2FybmluZzo6TGlmZWN5Y2xlIHNjcmlwdHMgZmFpbGVkOyBjb21wbGV0aW5nIHRoZSBpbnN0YWxsIHdpdGhvdXQgdGhlbVwiXG4gIHJtIC1yZiBub2RlX21vZHVsZXNcbiAgYnVuIGluc3RhbGwgLS1mcm96ZW4tbG9ja2ZpbGUgLS1pZ25vcmUtc2NyaXB0c1xufWBcbiAgICAgICAgICA6ICcnXG4gICAgICB9YCxcbiAgICB9LFxuICAgIHtcbiAgICAgIGlmOiBcIiR7eyBlbnYuSEFTX1RBS1VNSV9HVUFSRF9UT0tFTiA9PSAndHJ1ZScgfX1cIixcbiAgICAgIG5hbWU6ICdSZW1vdmUgdGhlIGdlbmVyYXRlZCAubnBtcmMnLFxuICAgICAgLy8gTm90aGluZyBhZnRlciB0aGUgaW5zdGFsbCBuZWVkcyB0aGUgcHJveHksIGFuZCBsZWF2aW5nIGl0IGluIHBsYWNlIHdvdWxkIGJyZWFrIHRoZSBvbmVcbiAgICAgIC8vIHRoaW5nIEd1YXJkIHJlZnVzZXMgdG8gc2VydmU6IGl0IGFuc3dlcnMgYG5wbSBwdWJsaXNoYCB3aXRoIDQwNSwgc28gYSByZWxlYXNlIHdvcmtmbG93XG4gICAgICAvLyB3aG9zZSBwYWNrYWdlIGxhY2tzIGFuIGV4cGxpY2l0IHB1Ymxpc2hDb25maWcucmVnaXN0cnkgd291bGQgZmFpbCB0byBwdWJsaXNoLlxuICAgICAgcnVuOiBgc2V0IC1ldW8gcGlwZWZhaWxcbmlmIGdpdCBscy1maWxlcyAtLWVycm9yLXVubWF0Y2ggLS0gLm5wbXJjID4gL2Rldi9udWxsIDI+JjE7IHRoZW5cbiAgZ2l0IGNoZWNrb3V0IC0tIC5ucG1yY1xuZWxzZVxuICBybSAtZiAubnBtcmNcbmZpYCxcbiAgICB9LFxuICBdO1xufVxuXG5mdW5jdGlvbiBidWlsZFNlbWFudGljUHJXb3JrZmxvdygpOiBXb3JrZmxvdyB7XG4gIHJldHVybiB7XG4gICAgbmFtZTogJ0xpbnQgUFIgdGl0bGUnLFxuICAgIG9uOiB7XG4gICAgICBwdWxsX3JlcXVlc3RfdGFyZ2V0OiB7IHR5cGVzOiBbJ29wZW5lZCcsICdlZGl0ZWQnLCAnc3luY2hyb25pemUnXSB9LFxuICAgIH0sXG4gICAgam9iczoge1xuICAgICAgJ3NlbWFudGljLXByJzoge1xuICAgICAgICAncnVucy1vbic6ICd1YnVudHUtbGF0ZXN0JyxcbiAgICAgICAgLy8gVGhlIGFjdGlvbiByZWFkcyB0aGUgcHVsbCByZXF1ZXN0LCBhbmQgaXRzIGB3aXBgIHN1cHBvcnQgcG9zdHMgYSBjb21taXQgc3RhdHVzOyBuZWl0aGVyXG4gICAgICAgIC8vIHBlcm1pc3Npb24gaXMgZ3JhbnRlZCB3aGVuIHRoZSByZXBvc2l0b3J5IHJlc3RyaWN0cyBkZWZhdWx0IHdvcmtmbG93IHBlcm1pc3Npb25zLlxuICAgICAgICBwZXJtaXNzaW9uczogeyAncHVsbC1yZXF1ZXN0cyc6ICdyZWFkJywgc3RhdHVzZXM6ICd3cml0ZScgfSxcbiAgICAgICAgc3RlcHM6IFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICB1c2VzOiBzZW1hbnRpY1B1bGxSZXF1ZXN0QWN0aW9uLFxuICAgICAgICAgICAgd2l0aDogeyB3aXA6IHRydWUgfSxcbiAgICAgICAgICAgIGVudjogeyBHSVRIVUJfVE9LRU46ICcke3sgc2VjcmV0cy5HSVRIVUJfVE9LRU4gfX0nIH0sXG4gICAgICAgICAgfSxcbiAgICAgICAgXSxcbiAgICAgIH0sXG4gICAgfSxcbiAgfTtcbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCBzZW12ZXIgZnJvbSAnc2VtdmVyJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZnNVdGlsIH0gZnJvbSAnLi4vdXRpbHMvZnNVdGlsLmpzJztcbmltcG9ydCB7IHNwYXduU3luY0FuZFJldHVyblN0ZG91dCB9IGZyb20gJy4uL3V0aWxzL3NwYXduVXRpbC5qcyc7XG5cbmludGVyZmFjZSBNaXNlVG9tbCB7XG4gIHRvb2xzPzogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gIFtrZXk6IHN0cmluZ106IHVua25vd247XG59XG5cbi8vIFRoZSBvbGRlc3QgQnVuIHJ1bnRpbWUgd2JmeSBzdXBwb3J0cy5cbmV4cG9ydCBjb25zdCBtaW5pbXVtQnVuVmVyc2lvbiA9ICcxLjQuMCc7XG5cbi8qKlxuICogUGlucyBOb2RlLmpzIGFuZCB0aGUgbGF0ZXN0IEJ1biBhbmQgKHdoZW4gZm5veC50b21sIGV4aXN0cykgZm5veCB2ZXJzaW9ucyB3aGlsZSBwcmVzZXJ2aW5nXG4gKiB1bnJlbGF0ZWQgbWlzZSBzZXR0aW5ncy5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlTWlzZVRvbWwoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZ2VuZXJhdGVNaXNlVG9tbCcsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBtaXNlVG9tbFBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICdtaXNlLnRvbWwnKTtcbiAgICAvLyBBIHBhcnNlIGZhaWx1cmUgbXVzdCBhYm9ydCBpbnN0ZWFkIG9mIGZhbGxpbmcgYmFjayB0byB7fTogcmVnZW5lcmF0aW5nIGZyb20gYW4gZW1wdHkgb2JqZWN0XG4gICAgLy8gd291bGQgc2lsZW50bHkgcmVwbGFjZSB0aGUgdXNlcidzIGV4aXN0aW5nIChhbGJlaXQgYnJva2VuKSBtaXNlLnRvbWwuXG4gICAgY29uc3Qgc2V0dGluZ3MgPSBwYXJzZU1pc2VUb21sKG1pc2VUb21sUGF0aCk7XG4gICAgY29uc3QgdG9vbHMgPSB7IC4uLnNldHRpbmdzLnRvb2xzIH07XG5cbiAgICAvLyBFbnN1cmUgTm9kZS5qcyBpcyBhbHdheXMgcGlubmVkOiBnZW5lcmF0ZWQgaG9va3MgYW5kIENJIHJ1biBgbWlzZSBpbnN0YWxsYCwgYW5kIGFuIHVucGlubmVkXG4gICAgLy8gTm9kZSB3b3VsZCBjb21lIGZyb20gd2hhdGV2ZXIgaGFwcGVucyB0byBiZSBvbiBQQVRILlxuICAgIC8vIExpZnQtdGhlbi1waW46IHRoZSBsaWZ0IG9ubHkgdG91Y2hlcyBleGFjdCBwaW5zIGFuZCB0aGUgcGluIG9ubHkgdG91Y2hlcyBzZWxlY3RvcnMsIHNvXG4gICAgLy8gb3JkZXJpbmcgdGhlIGxpZnQgZmlyc3QgYXZvaWRzIHJlc29sdmluZyBgbWlzZSBsYXRlc3Qgbm9kZUBsdHNgIHR3aWNlIGZvciB1bnBpbm5lZCByZXBvcy5cbiAgICB0b29scy5ub2RlID0gcGluQ29uY3JldGVUb29sVmVyc2lvbihcbiAgICAgICdub2RlJyxcbiAgICAgIGxpZnRPdXRkYXRlZFRvb2xWZXJzaW9uV2l0aGluTWFqb3IoJ25vZGVAbHRzJywgdG9vbHMubm9kZSwgY29uZmlnLmRpclBhdGgpLFxuICAgICAgY29uZmlnLmRpclBhdGhcbiAgICApO1xuICAgIHRvb2xzLmJ1biA9IHBpbkxhdGVzdFRvb2xWZXJzaW9uKCdidW4nLCB0b29scy5idW4sIGNvbmZpZy5kaXJQYXRoKTtcbiAgICBpZiAoZnMuZXhpc3RzU3luYyhwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICdmbm94LnRvbWwnKSkpIHtcbiAgICAgIHRvb2xzLmZub3ggPSBwaW5MYXRlc3RUb29sVmVyc2lvbignZm5veCcsIHRvb2xzLmZub3gsIGNvbmZpZy5kaXJQYXRoKTtcbiAgICB9XG4gICAgc2V0dGluZ3MudG9vbHMgPSB0b29scztcblxuICAgIC8vIEB0cy1leHBlY3QtZXJyb3IgLS0gQnVuIDEuNCBwcm92aWRlcyBUT01MLnN0cmluZ2lmeSBiZWZvcmUgdGhlIGFnZS1nYXRlZCBAdHlwZXMvYnVuIHZlcnNpb24gZGVjbGFyZXMgaXQuXG4gICAgYXdhaXQgZnNVdGlsLmdlbmVyYXRlRmlsZShtaXNlVG9tbFBhdGgsIEJ1bi5UT01MLnN0cmluZ2lmeShzZXR0aW5ncykpO1xuICB9KTtcbn1cblxuLyoqIFVwZGF0ZXMgdG8gdGhlIGxhdGVzdCByZWxlYXNlIGFjcm9zcyBtYWpvciB2ZXJzaW9ucyB3aXRob3V0IGRvd25ncmFkaW5nIGV4aXN0aW5nIGV4YWN0IHBpbnMuICovXG5mdW5jdGlvbiBwaW5MYXRlc3RUb29sVmVyc2lvbih0b29sOiBzdHJpbmcsIHZlcnNpb246IHVua25vd24sIGN3ZDogc3RyaW5nKTogdW5rbm93biB7XG4gIC8vIFJlc29sdmUgaW5kZXBlbmRlbnRseSBvZiB0aGUgdGFyZ2V0J3MgdHJ1c3Qgc3RhdGUgYW5kIHRvb2wgYWxpYXNlcy5cbiAgY29uc3QgcmVzb2x2ZWRWZXJzaW9uID0gc3Bhd25TeW5jQW5kUmV0dXJuU3Rkb3V0KCdtaXNlJywgWyctLW5vLWNvbmZpZycsICdsYXRlc3QnLCB0b29sXSwgY3dkKTtcbiAgaWYgKCFzZW12ZXIudmFsaWQocmVzb2x2ZWRWZXJzaW9uKSkgcmV0dXJuIHZlcnNpb24gPz8gJ2xhdGVzdCc7XG4gIC8vIEEgY2FjaGVkIHJlbGVhc2UgbGlzdGluZyBjYW4gbGFnIGJlaGluZCBhbm90aGVyIG1hY2hpbmUgdGhhdCBhbHJlYWR5IHVwZGF0ZWQgdGhlIHBpbi5cbiAgcmV0dXJuIHR5cGVvZiB2ZXJzaW9uID09PSAnc3RyaW5nJyAmJiBzZW12ZXIudmFsaWQodmVyc2lvbikgJiYgc2VtdmVyLmd0KHZlcnNpb24sIHJlc29sdmVkVmVyc2lvbilcbiAgICA/IHZlcnNpb25cbiAgICA6IHJlc29sdmVkVmVyc2lvbjtcbn1cblxuLyoqXG4gKiBMaWZ0cyBhbiBleGFjdCB0b29sIHBpbiBiZWxvdyB0aGUgbGF0ZXN0IHJlc29sdmFibGUgdmVyc2lvbiDigJQgd2l0aGluIHRoZSBTQU1FIG1ham9yIOKAlCB0byB0aGF0XG4gKiB2ZXJzaW9uIChOb2RlLmpzIHJlc29sdmVzIGFnYWluc3QgdGhlIGxhdGVzdCBMVFMpOiB0aGUgcmVwb3NpdG9yeS1zdHJ1Y3R1cmUgc3RhbmRhcmQgdHJhY2tzIHRoZVxuICogY3VycmVudCB0b29sY2hhaW4gYWNyb3NzIHJlcG9zaXRvcmllcyBhbmQgUmVub3ZhdGUgZG9lcyBub3QgbWFuYWdlIG1pc2UudG9tbCBwaW5zLCBzb1xuICogcGF0Y2gvbWlub3IgZHJpZnQgKGUuZy4gbm9kZSAyNC4xNi4wIHZzIDI0LjE4LjApIG5ldmVyIHNlbGYtaGVhbHMuIEEgcGluXG4gKiBvbiBhbiBvbGRlciBtYWpvciBpcyBhIGRlbGliZXJhdGUgY29tcGF0aWJpbGl0eSBjaG9pY2UgYW5kIGlzIGtlcHQsIGFzIGFyZSBub24tZXhhY3QgYW5kXG4gKiBub24tc3RyaW5nIGZvcm1zLiBXaGVuIG1pc2UgY2Fubm90IHJlc29sdmUgdGhlIHNlbGVjdG9yIChlLmcuIG9mZmxpbmUpLCB0aGUgcGluIGlzIGtlcHQuXG4gKi9cbmZ1bmN0aW9uIGxpZnRPdXRkYXRlZFRvb2xWZXJzaW9uV2l0aGluTWFqb3Ioc2VsZWN0b3I6IHN0cmluZywgdmVyc2lvbjogdW5rbm93biwgY3dkOiBzdHJpbmcpOiB1bmtub3duIHtcbiAgaWYgKHR5cGVvZiB2ZXJzaW9uICE9PSAnc3RyaW5nJyB8fCAhc2VtdmVyLnZhbGlkKHZlcnNpb24pKSByZXR1cm4gdmVyc2lvbjtcbiAgY29uc3QgbGF0ZXN0VmVyc2lvbiA9IHNwYXduU3luY0FuZFJldHVyblN0ZG91dCgnbWlzZScsIFsnbGF0ZXN0Jywgc2VsZWN0b3JdLCBjd2QpO1xuICByZXR1cm4gc2VtdmVyLnZhbGlkKGxhdGVzdFZlcnNpb24pICYmXG4gICAgc2VtdmVyLm1ham9yKGxhdGVzdFZlcnNpb24pID09PSBzZW12ZXIubWFqb3IodmVyc2lvbikgJiZcbiAgICBzZW12ZXIubHQodmVyc2lvbiwgbGF0ZXN0VmVyc2lvbilcbiAgICA/IGxhdGVzdFZlcnNpb25cbiAgICA6IHZlcnNpb247XG59XG5cbi8qKlxuICogUmVwbGFjZXMgYW4gdW5waW5uZWQgc2VsZWN0b3IgKGBsYXRlc3RgLCBhIHJhbmdlIHN1Y2ggYXMgXCIyNFwiLCBhbiBhbGlhcywgb3IgYSBtaXNzaW5nIGVudHJ5KVxuICogd2l0aCB0aGUgbmV3ZXN0IGNvbmNyZXRlIHZlcnNpb24gbWlzZSByZXNvbHZlcyBmb3IgaXQsIGJlY2F1c2UgdGhlIHJlcG9zaXRvcnktc3RydWN0dXJlXG4gKiBzdGFuZGFyZCByZXF1aXJlcyBjb25jcmV0ZSBwaW5zOiBDSSBpbnN0YWxscyB3aGF0ZXZlciBhbiB1bnBpbm5lZCBzZWxlY3RvciByZXNvbHZlcyB0byBhdCBydW5cbiAqIHRpbWUsIHNvIGJ1aWxkcyBkcmlmdCBhY3Jvc3MgcnVucy4gRXhhY3QgdmVyc2lvbnMgYXJlIGtlcHQgYXMtaXMsIGFuZCBub24tc3RyaW5nIGZvcm1zIChtaXNlJ3NcbiAqIGFycmF5IGFuZCBgeyB2ZXJzaW9uID0gXCLigKZcIiB9YCBmb3JtcykgYXJlIHVzZXItbWFuYWdlZCBhbmQgbGVmdCB1bnRvdWNoZWQuIFdoZW4gbWlzZSBpc1xuICogdW5hdmFpbGFibGUgb3IgY2Fubm90IHJlc29sdmUgdGhlIHNlbGVjdG9yIChlLmcuIG9mZmxpbmUpLCB0aGUgb3JpZ2luYWwgc2VsZWN0b3IgaXMga2VwdCDigJRcbiAqIGFuIHVucGlubmVkIHRvb2wgaXMgYmV0dGVyIHRoYW4gYSBicm9rZW4gY29uZmlndXJhdGlvbi5cbiAqL1xuZnVuY3Rpb24gcGluQ29uY3JldGVUb29sVmVyc2lvbih0b29sOiBzdHJpbmcsIHZlcnNpb246IHVua25vd24sIGN3ZDogc3RyaW5nKTogdW5rbm93biB7XG4gIGlmICh2ZXJzaW9uICE9PSB1bmRlZmluZWQgJiYgKHR5cGVvZiB2ZXJzaW9uICE9PSAnc3RyaW5nJyB8fCBzZW12ZXIudmFsaWQodmVyc2lvbikpKSByZXR1cm4gdmVyc2lvbjtcbiAgLy8gTm9ybWFsaXplIHNlbGVjdG9yIGZvcm1zIGBtaXNlIGxhdGVzdGAgY2Fubm90IHJlc29sdmUgZXZlbiB0aG91Z2ggbWlzZSBjb25maWd1cmF0aW9uIGFjY2VwdHNcbiAgLy8gdGhlbTogYHByZWZpeDoyNGAgaXMgcmVqZWN0ZWQgb3V0cmlnaHQgd2hpbGUgYDI0YCByZXNvbHZlcywgYW5kIGBsdHMvKmAgeWllbGRzIGVtcHR5IG91dHB1dFxuICAvLyB3aGlsZSBgbHRzYCByZXNvbHZlcy4gTW9kaWZpZXIgc2VsZWN0b3JzIHN1Y2ggYXMgYHN1Yi0yOmx0c2Agc3RheSB1bnJlc29sdmFibGUgYW5kIGZhbGwgYmFja1xuICAvLyB0byB0aGUgb3JpZ2luYWwgc2VsZWN0b3IgYmVsb3cuXG4gIGNvbnN0IHJhbmdlID0gdHlwZW9mIHZlcnNpb24gPT09ICdzdHJpbmcnID8gdmVyc2lvbi5yZXBsYWNlKC9ecHJlZml4Oi91LCAnJykucmVwbGFjZSgvXFwvXFwqJC91LCAnJykgOiB1bmRlZmluZWQ7XG4gIC8vIFdpdGggbm8gbWVhbmluZ2Z1bCBzZWxlY3RvciwgTm9kZS5qcyBwaW5zIHRvIHRoZSBsYXRlc3QgTFRTIChtYXRjaGluZyB0aGUgcmV1c2FibGUgd29ya2Zsb3dzJ1xuICAvLyBgbHRzLypgIGZhbGxiYWNrKSByYXRoZXIgdGhhbiB0aGUgbmV3ZXN0IHJlbGVhc2UuXG4gIGNvbnN0IGRlZmF1bHRTZWxlY3RvciA9IHRvb2wgPT09ICdub2RlJyA/ICdub2RlQGx0cycgOiB0b29sO1xuICBjb25zdCBzZWxlY3RvciA9IHJhbmdlICYmIHJhbmdlICE9PSAnbGF0ZXN0JyA/IGAke3Rvb2x9QCR7cmFuZ2V9YCA6IGRlZmF1bHRTZWxlY3RvcjtcbiAgY29uc3QgcmVzb2x2ZWRWZXJzaW9uID0gc3Bhd25TeW5jQW5kUmV0dXJuU3Rkb3V0KCdtaXNlJywgWydsYXRlc3QnLCBzZWxlY3Rvcl0sIGN3ZCk7XG4gIHJldHVybiBzZW12ZXIudmFsaWQocmVzb2x2ZWRWZXJzaW9uKSA/IHJlc29sdmVkVmVyc2lvbiA6ICh2ZXJzaW9uID8/ICdsYXRlc3QnKTtcbn1cblxuZnVuY3Rpb24gcGFyc2VNaXNlVG9tbChtaXNlVG9tbFBhdGg6IHN0cmluZyk6IE1pc2VUb21sIHtcbiAgbGV0IGNvbnRlbnQ6IHN0cmluZztcbiAgdHJ5IHtcbiAgICBjb250ZW50ID0gZnMucmVhZEZpbGVTeW5jKG1pc2VUb21sUGF0aCwgJ3V0ZjgnKTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAvLyBPbmx5IGEgcmVwb3NpdG9yeSB3aXRob3V0IG1pc2UudG9tbCBzdGFydHMgZnJvbSBhbiBlbXB0eSBjb25maWd1cmF0aW9uOyBhbiB1bnJlYWRhYmxlIGZpbGVcbiAgICAvLyAoZS5nLiBwZXJtaXNzaW9ucykgbXVzdCBhYm9ydCBpbnN0ZWFkIG9mIGJlaW5nIG92ZXJ3cml0dGVuIHdpdGggZ2VuZXJhdGVkIHNldHRpbmdzLlxuICAgIGlmICgoZXJyb3IgYXMgTm9kZUpTLkVycm5vRXhjZXB0aW9uKS5jb2RlID09PSAnRU5PRU5UJykgcmV0dXJuIHt9O1xuICAgIHRocm93IGVycm9yO1xuICB9XG4gIHJldHVybiBCdW4uVE9NTC5wYXJzZShjb250ZW50KSBhcyBNaXNlVG9tbDtcbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZnNVdGlsIH0gZnJvbSAnLi4vdXRpbHMvZnNVdGlsLmpzJztcbmltcG9ydCB7IHByaXZhdGVSZWdpc3RyeVNjb3BlTWFwcGluZywgcmVwb1Jlc29sdmVzUHJpdmF0ZVBhY2thZ2VzIH0gZnJvbSAnLi4vdXRpbHMvcHJpdmF0ZVBhY2thZ2VzLmpzJztcblxuLyoqXG4gKiBCdW4gcmVhZHMgcmVnaXN0cnkgc2NvcGUgbWFwcGluZ3MgZnJvbSBhIHBoeXNpY2FsIHJlcG9zaXRvcnkgLm5wbXJjIGR1cmluZyBSZW5vdmF0ZSBhcnRpZmFjdFxuICogdXBkYXRlczsgUmVub3ZhdGUncyBucG1yYyBzZXR0aW5nIGlzIHVzZWQgb25seSBieSBpdHMgZGF0YXNvdXJjZSBsYXllci4gS2VlcCB0aGUgbm9uLXNlY3JldFxuICogbWFwcGluZyBpbiByZXBvc2l0b3JpZXMgdGhhdCByZXNvbHZlIHByaXZhdGUgcGFja2FnZXMsIHdoaWxlIGF1dGhlbnRpY2F0aW9uIHJlbWFpbnMgaW4gdGhlXG4gKiBkZXZlbG9wZXIncyB+Ly5ucG1yYyBsb2NhbGx5IGFuZCBpbiB0ZW1wb3JhcnkgQ0kgb3IgTWVuZCBjb25maWd1cmF0aW9uLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVSZXBvc2l0b3J5TnBtcmMoY29uZmlnczogUGFja2FnZUNvbmZpZ1tdKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IHJlcG9BdXRob3IgPSBjb25maWdzWzBdPy5yZXBvQXV0aG9yO1xuICBpZiAocmVwb0F1dGhvciAhPT0gJ1dpbGxCb29zdGVyJyAmJiByZXBvQXV0aG9yICE9PSAnV2lsbEJvb3N0ZXJMYWInKSByZXR1cm47XG5cbiAgY29uc3QgbnBtcmNQYXRocyA9IG5ldyBTZXQoY29uZmlncy5tYXAoKGNvbmZpZykgPT4gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnLm5wbXJjJykpKTtcbiAgY29uc3Qgcm9vdENvbmZpZyA9IGNvbmZpZ3MuZmluZCgoY29uZmlnKSA9PiBjb25maWcuaXNSb290KTtcbiAgaWYgKHJvb3RDb25maWcgJiYgcmVwb1Jlc29sdmVzUHJpdmF0ZVBhY2thZ2VzKHJvb3RDb25maWcpKSB7XG4gICAgY29uc3Qgcm9vdE5wbXJjUGF0aCA9IHBhdGgucmVzb2x2ZShyb290Q29uZmlnLmRpclBhdGgsICcubnBtcmMnKTtcbiAgICBhd2FpdCBmc1V0aWwuZ2VuZXJhdGVGaWxlKHJvb3ROcG1yY1BhdGgsIHByaXZhdGVSZWdpc3RyeVNjb3BlTWFwcGluZyk7XG4gICAgbnBtcmNQYXRocy5kZWxldGUocm9vdE5wbXJjUGF0aCk7XG4gIH1cblxuICBmb3IgKGNvbnN0IG5wbXJjUGF0aCBvZiBucG1yY1BhdGhzKSBhd2FpdCByZW1vdmVOcG1yYyhucG1yY1BhdGgpO1xufVxuXG5hc3luYyBmdW5jdGlvbiByZW1vdmVOcG1yYyhucG1yY1BhdGg6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICBpZiAoIShhd2FpdCBmcy5wcm9taXNlcy5sc3RhdChucG1yY1BhdGgpLmNhdGNoKCgpID0+IHt9KSkpIHJldHVybjtcbiAgaWYgKGF3YWl0IGZzVXRpbC5yZW1vdmVDb25maW5lZChucG1yY1BhdGgpKSB7XG4gICAgY29uc29sZS5pbmZvKGBSZW1vdmVkIG5vbi1jYW5vbmljYWwgcmVwb3NpdG9yeSBucG1yYyAke25wbXJjUGF0aH0uYCk7XG4gIH1cbn1cbiIsImltcG9ydCB0eXBlIHsgT2N0b2tpdCB9IGZyb20gJ0BvY3Rva2l0L2NvcmUnO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBnZXRPY3Rva2l0LCBoYXNHaXRIdWJUb2tlbiB9IGZyb20gJy4uL3V0aWxzL2dpdGh1YlV0aWwuanMnO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gc2V0dXBMYWJlbHMoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignc2V0dXBMYWJlbHMnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgeyByZXBvQXV0aG9yOiBvd25lciwgcmVwb05hbWU6IHJlcG8gfSA9IGNvbmZpZztcbiAgICBpZiAoIW93bmVyIHx8ICFyZXBvKSByZXR1cm47XG4gICAgaWYgKG93bmVyICE9PSAnV2lsbEJvb3N0ZXInICYmIG93bmVyICE9PSAnV2lsbEJvb3N0ZXJMYWInKSByZXR1cm47XG4gICAgaWYgKCFoYXNHaXRIdWJUb2tlbihvd25lcikpIHJldHVybjtcblxuICAgIGNvbnN0IG9jdG9raXQgPSBnZXRPY3Rva2l0KG93bmVyKTtcblxuICAgIHRyeSB7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAnZDE6IHgtZWFzeSA6aGVkZ2Vob2c6JywgJ0VERTlGRScpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ2QyOiBlYXN5IDpyYWJiaXQyOicsICdEREQ2RkUnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdkMzogbWVkaXVtIDpveDonLCAnQzRCNUZEJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAnZDQ6IGhhcmQgOnNxdWlkOicsICdBNzhCRkEnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdkNTogeC1oYXJkIDp3aGFsZTI6JywgJzhCNUNGNicpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ3AxOiBjcml0aWNhbCA6ZmlyZTo6ZmlyZTo6ZmlyZTonLCAnRUY0NDQ0Jyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAncDI6IHVyZ2VudCA6ZmlyZTo6ZmlyZTonLCAnRjg3MTcxJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAncDM6IGltcG9ydGFudCA6ZmlyZTonLCAnRkNBNUE1Jyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAncDQ6IG5pY2UgdG8gaGF2ZSA6ZHJvcGxldDonLCAnRkVDQUNBJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAncjogYmxpdHonLCAnNTMwMGJjJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAncjogZmlyZWJhc2UnLCAnZmZjYTI4Jyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAncjogcHJpc21hJywgJzBjMzQ0YicpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ3I6IHJlYWN0JywgJzYxZGFmYicpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ3I6IHNlbWFudGljLXJlbGVhc2UnLCAnNDk0OTQ5Jyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAncmVhZHkgOnJvY2tldDonLCAnMjJDNTVFJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAncmV2aWV3IHJlcXVlc3RlZCA6bWFnOicsICdGQkNBMDQnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdyZWxlYXNlZCA6Ym9va21hcms6JywgJzYzNjZGMScpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ3M6IDAuNWggOmNsb2NrMTIzMDonLCAnRjNGNEY2Jyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAnczogMWggOmNsb2NrMTonLCAnRTVFN0VCJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAnczogMmggOmNsb2NrMjonLCAnRDFENURCJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAnczogM2ggOmNsb2NrMzonLCAnOUNBM0FGJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAnczogNWggOmNsb2NrNTonLCAnNkI3MjgwJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAnczogOGggOmNsb2NrODonLCAnNEI1NTYzJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAnczogMTNoIDpjbG9jazE6JywgJzM3NDE1MScpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ3Q6IGJ1aWxkIDpoYW1tZXI6JywgJ0JGREJGRScpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ3Q6IGNob3JlIDpicm9vbTonLCAnQkZEQkZFJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAndDogY2kgOmNvbnN0cnVjdGlvbl93b3JrZXI6JywgJ0JGREJGRScpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ3Q6IGRvY3MgOm1lbW86JywgJ0JGREJGRScpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ3Q6IGZlYXQgOnNwYXJrbGVzOicsICdCRkRCRkUnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICd0OiBmaXggOmJ1ZzonLCAnQkZEQkZFJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAndDogcGVyZiA6emFwOicsICdCRkRCRkUnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICd0OiByZWZhY3RvciA6cmVjeWNsZTonLCAnQkZEQkZFJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAndDogc3R5bGUgOmxpcHN0aWNrOicsICdCRkRCRkUnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICd0OiB0ZXN0IDp0ZXN0X3R1YmU6JywgJ0JGREJGRScpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ3Byb2plY3QnLCAnMjQyOTJGJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAnZm9jdXNlZCA6ZGFydDonLCAnMjJDNTVFJyk7XG5cbiAgICAgIGF3YWl0IGRlbGV0ZUxhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAnYnVnJyk7XG4gICAgICBhd2FpdCBkZWxldGVMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ2RvY3VtZW50YXRpb24nKTtcbiAgICAgIGF3YWl0IGRlbGV0ZUxhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAnZHVwbGljYXRlJyk7XG4gICAgICBhd2FpdCBkZWxldGVMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ2VuaGFuY2VtZW50Jyk7XG4gICAgICBhd2FpdCBkZWxldGVMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ2dvb2QgZmlyc3QgaXNzdWUnKTtcbiAgICAgIGF3YWl0IGRlbGV0ZUxhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAnaGVscCB3YW50ZWQnKTtcbiAgICAgIGF3YWl0IGRlbGV0ZUxhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAnaW52YWxpZCcpO1xuICAgICAgYXdhaXQgZGVsZXRlTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdxdWVzdGlvbicpO1xuICAgICAgYXdhaXQgZGVsZXRlTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICd3b250Zml4Jyk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNvbnNvbGUud2FybignU2tpcCBzZXR1cExhYmVscyBkdWUgdG86JywgKGVycm9yIGFzIEVycm9yIHwgdW5kZWZpbmVkKT8uc3RhY2sgPz8gZXJyb3IpO1xuICAgIH1cbiAgfSk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHNldHVwTGFiZWwob2N0b2tpdDogT2N0b2tpdCwgb3duZXI6IHN0cmluZywgcmVwbzogc3RyaW5nLCBuYW1lOiBzdHJpbmcsIGNvbG9yOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgdHJ5IHtcbiAgICBhd2FpdCBvY3Rva2l0LnJlcXVlc3QoJ1BPU1QgL3JlcG9zL3tvd25lcn0ve3JlcG99L2xhYmVscycsIHtcbiAgICAgIG93bmVyLFxuICAgICAgcmVwbyxcbiAgICAgIG5hbWUsXG4gICAgICBjb2xvcixcbiAgICB9KTtcbiAgfSBjYXRjaCB7XG4gICAgYXdhaXQgb2N0b2tpdC5yZXF1ZXN0KCdQQVRDSCAvcmVwb3Mve293bmVyfS97cmVwb30vbGFiZWxzL3tuYW1lfScsIHtcbiAgICAgIG93bmVyLFxuICAgICAgcmVwbyxcbiAgICAgIG5hbWUsXG4gICAgICBjb2xvcixcbiAgICB9KTtcbiAgfVxufVxuXG5hc3luYyBmdW5jdGlvbiBkZWxldGVMYWJlbChvY3Rva2l0OiBPY3Rva2l0LCBvd25lcjogc3RyaW5nLCByZXBvOiBzdHJpbmcsIG5hbWU6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICB0cnkge1xuICAgIGF3YWl0IG9jdG9raXQucmVxdWVzdCgnREVMRVRFIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9sYWJlbHMve25hbWV9Jywge1xuICAgICAgb3duZXIsXG4gICAgICByZXBvLFxuICAgICAgbmFtZSxcbiAgICB9KTtcbiAgfSBjYXRjaCB7XG4gICAgLy8gZG8gbm90aGluZ1xuICB9XG59XG4iLCJpbXBvcnQgdHlwZSB7IE9jdG9raXQgfSBmcm9tICdAb2N0b2tpdC9jb3JlJztcbmltcG9ydCB7IHdpdGhSZXRyeSB9IGZyb20gJ0B3aWxsYm9vc3Rlci9zaGFyZWQtbGliL3NyYyc7XG5cbmltcG9ydCB7IGlzUmV1c2FibGVXb3JrZmxvd3NSZXBvIH0gZnJvbSAnLi4vZ2VuZXJhdG9ycy93b3JrZmxvdy5qcyc7XG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBnZXRPY3Rva2l0LCBoYXNHaXRIdWJUb2tlbiwgaXNHaXRIdWJQZXJtaXNzaW9uT3JWaXNpYmlsaXR5RXJyb3IgfSBmcm9tICcuLi91dGlscy9naXRodWJVdGlsLmpzJztcblxuaW50ZXJmYWNlIFJlcG9zaXRvcnlSdWxlc2V0UGF5bG9hZCB7XG4gIG5hbWU6IHN0cmluZztcbiAgdGFyZ2V0OiAnYnJhbmNoJztcbiAgZW5mb3JjZW1lbnQ6ICdhY3RpdmUnO1xuICBjb25kaXRpb25zOiB7XG4gICAgcmVmX25hbWU6IHtcbiAgICAgIGluY2x1ZGU6IHN0cmluZ1tdO1xuICAgICAgZXhjbHVkZTogc3RyaW5nW107XG4gICAgfTtcbiAgfTtcbiAgcnVsZXM6IChcbiAgICB8IHtcbiAgICAgICAgdHlwZTogJ2RlbGV0aW9uJyB8ICdub25fZmFzdF9mb3J3YXJkJztcbiAgICAgIH1cbiAgICB8IHtcbiAgICAgICAgdHlwZTogJ3JlcXVpcmVkX3N0YXR1c19jaGVja3MnO1xuICAgICAgICBwYXJhbWV0ZXJzOiB7XG4gICAgICAgICAgc3RyaWN0X3JlcXVpcmVkX3N0YXR1c19jaGVja3NfcG9saWN5OiBib29sZWFuO1xuICAgICAgICAgIGRvX25vdF9lbmZvcmNlX29uX2NyZWF0ZTogYm9vbGVhbjtcbiAgICAgICAgICByZXF1aXJlZF9zdGF0dXNfY2hlY2tzOiB7XG4gICAgICAgICAgICBjb250ZXh0OiBzdHJpbmc7XG4gICAgICAgICAgICBpbnRlZ3JhdGlvbl9pZDogbnVtYmVyO1xuICAgICAgICAgIH1bXTtcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICB8IHtcbiAgICAgICAgdHlwZTogJ3B1bGxfcmVxdWVzdCc7XG4gICAgICAgIHBhcmFtZXRlcnM6IHtcbiAgICAgICAgICByZXF1aXJlZF9hcHByb3ZpbmdfcmV2aWV3X2NvdW50OiBudW1iZXI7XG4gICAgICAgICAgZGlzbWlzc19zdGFsZV9yZXZpZXdzX29uX3B1c2g6IGJvb2xlYW47XG4gICAgICAgICAgcmVxdWlyZWRfcmV2aWV3ZXJzOiBbXTtcbiAgICAgICAgICByZXF1aXJlX2NvZGVfb3duZXJfcmV2aWV3OiBib29sZWFuO1xuICAgICAgICAgIHJlcXVpcmVfbGFzdF9wdXNoX2FwcHJvdmFsOiBib29sZWFuO1xuICAgICAgICAgIHJlcXVpcmVkX3Jldmlld190aHJlYWRfcmVzb2x1dGlvbjogYm9vbGVhbjtcbiAgICAgICAgICBhbGxvd2VkX21lcmdlX21ldGhvZHM6IFsnc3F1YXNoJ107XG4gICAgICAgIH07XG4gICAgICB9XG4gIClbXTtcbiAgYnlwYXNzX2FjdG9yczoge1xuICAgIGFjdG9yX2lkOiBudW1iZXI7XG4gICAgYWN0b3JfdHlwZTogJ1RlYW0nO1xuICAgIGJ5cGFzc19tb2RlOiAncHVsbF9yZXF1ZXN0JztcbiAgfVtdO1xufVxuXG5pbnRlcmZhY2UgUmVwb3NpdG9yeVJ1bGVzZXRTdW1tYXJ5IHtcbiAgaWQ/OiBudW1iZXI7XG4gIG5hbWU/OiBzdHJpbmc7XG4gIHNvdXJjZV90eXBlPzogc3RyaW5nO1xufVxuXG5jb25zdCBHSVRIVUJfQVBJX1ZFUlNJT05fSEVBREVSID0ge1xuICAnWC1HaXRIdWItQXBpLVZlcnNpb24nOiAnMjAyMi0xMS0yOCcsXG59IGFzIGNvbnN0O1xuXG5jb25zdCBHSVRIVUJfQUNUSU9OU19JTlRFR1JBVElPTl9JRCA9IDE1XzM2ODtcblxuY29uc3QgUFJPVEVDVF9NQUlOX1JVTEVTRVQ6IFJlcG9zaXRvcnlSdWxlc2V0UGF5bG9hZCA9IHtcbiAgbmFtZTogJ1Byb3RlY3QgbWFpbicsXG4gIHRhcmdldDogJ2JyYW5jaCcsXG4gIGVuZm9yY2VtZW50OiAnYWN0aXZlJyxcbiAgY29uZGl0aW9uczoge1xuICAgIHJlZl9uYW1lOiB7XG4gICAgICBleGNsdWRlOiBbXSxcbiAgICAgIGluY2x1ZGU6IFsnfkRFRkFVTFRfQlJBTkNIJ10sXG4gICAgfSxcbiAgfSxcbiAgcnVsZXM6IFtcbiAgICB7XG4gICAgICB0eXBlOiAnZGVsZXRpb24nLFxuICAgIH0sXG4gICAge1xuICAgICAgdHlwZTogJ3JlcXVpcmVkX3N0YXR1c19jaGVja3MnLFxuICAgICAgcGFyYW1ldGVyczoge1xuICAgICAgICBzdHJpY3RfcmVxdWlyZWRfc3RhdHVzX2NoZWNrc19wb2xpY3k6IGZhbHNlLFxuICAgICAgICBkb19ub3RfZW5mb3JjZV9vbl9jcmVhdGU6IHRydWUsXG4gICAgICAgIHJlcXVpcmVkX3N0YXR1c19jaGVja3M6IFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICBjb250ZXh0OiAndGVzdCAvIHRlc3QnLFxuICAgICAgICAgICAgaW50ZWdyYXRpb25faWQ6IEdJVEhVQl9BQ1RJT05TX0lOVEVHUkFUSU9OX0lELFxuICAgICAgICAgIH0sXG4gICAgICAgICAge1xuICAgICAgICAgICAgY29udGV4dDogJ3NlbWFudGljLXByIC8gc2VtYW50aWMtcHInLFxuICAgICAgICAgICAgaW50ZWdyYXRpb25faWQ6IEdJVEhVQl9BQ1RJT05TX0lOVEVHUkFUSU9OX0lELFxuICAgICAgICAgIH0sXG4gICAgICAgIF0sXG4gICAgICB9LFxuICAgIH0sXG4gICAge1xuICAgICAgdHlwZTogJ25vbl9mYXN0X2ZvcndhcmQnLFxuICAgIH0sXG4gICAge1xuICAgICAgdHlwZTogJ3B1bGxfcmVxdWVzdCcsXG4gICAgICBwYXJhbWV0ZXJzOiB7XG4gICAgICAgIHJlcXVpcmVkX2FwcHJvdmluZ19yZXZpZXdfY291bnQ6IDAsXG4gICAgICAgIGRpc21pc3Nfc3RhbGVfcmV2aWV3c19vbl9wdXNoOiBmYWxzZSxcbiAgICAgICAgcmVxdWlyZWRfcmV2aWV3ZXJzOiBbXSxcbiAgICAgICAgcmVxdWlyZV9jb2RlX293bmVyX3JldmlldzogZmFsc2UsXG4gICAgICAgIHJlcXVpcmVfbGFzdF9wdXNoX2FwcHJvdmFsOiBmYWxzZSxcbiAgICAgICAgcmVxdWlyZWRfcmV2aWV3X3RocmVhZF9yZXNvbHV0aW9uOiBmYWxzZSxcbiAgICAgICAgYWxsb3dlZF9tZXJnZV9tZXRob2RzOiBbJ3NxdWFzaCddLFxuICAgICAgfSxcbiAgICB9LFxuICBdLFxuICBieXBhc3NfYWN0b3JzOiBbXG4gICAge1xuICAgICAgYWN0b3JfaWQ6IDE3Xzc3N180OTUsXG4gICAgICBhY3Rvcl90eXBlOiAnVGVhbScsXG4gICAgICBieXBhc3NfbW9kZTogJ3B1bGxfcmVxdWVzdCcsXG4gICAgfSxcbiAgXSxcbn07XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBzZXR1cFJlcG9zaXRvcnlSdWxlc2V0cyhjb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdzZXR1cFJlcG9zaXRvcnlSdWxlc2V0cycsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCB7IHJlcG9BdXRob3I6IG93bmVyLCByZXBvTmFtZTogcmVwbyB9ID0gY29uZmlnO1xuICAgIGlmICghb3duZXIgfHwgIXJlcG8pIHJldHVybjtcbiAgICBpZiAob3duZXIgIT09ICdXaWxsQm9vc3RlcicpIHJldHVybjtcbiAgICAvLyBUaGUgcmV1c2FibGUtd29ya2Zsb3dzIHJlcG8gaG9zdHMgd29ya2Zsb3dfY2FsbCBkZWZpbml0aW9ucywgc28gdGhlXG4gICAgLy8gUHJvdGVjdCBtYWluIHJ1bGVzZXQgd291bGQgcmVxdWlyZSB0ZXN0L3NlbWFudGljLXByIGNoZWNrcyB0aGF0IG5ldmVyIHJ1biB0aGVyZS5cbiAgICBpZiAoaXNSZXVzYWJsZVdvcmtmbG93c1JlcG8oY29uZmlnLnJlcG9zaXRvcnkpKSByZXR1cm47XG4gICAgaWYgKCFoYXNHaXRIdWJUb2tlbihvd25lcikpIHJldHVybjtcblxuICAgIGNvbnN0IG9jdG9raXQgPSBnZXRPY3Rva2l0KG93bmVyKTtcblxuICAgIHRyeSB7XG4gICAgICBhd2FpdCB1cHNlcnRQcm90ZWN0TWFpblJ1bGVzZXQob2N0b2tpdCwgb3duZXIsIHJlcG8sIGJ1aWxkUHJvdGVjdE1haW5SdWxlc2V0KGNvbmZpZykpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBpZiAoIWlzR2l0SHViUGVybWlzc2lvbk9yVmlzaWJpbGl0eUVycm9yKGVycm9yKSkgdGhyb3cgZXJyb3I7XG5cbiAgICAgIC8vIFJlcG9zaXRvcnkgcnVsZXNldHMgcmVxdWlyZSBhZG1pbmlzdHJhdGlvbiBwZXJtaXNzaW9uLCB3aGljaCBsb2NhbCBydW5zXG4gICAgICAvLyBtYXkgbm90IGhhdmUgZXZlbiB3aGVuIGZpbGUtZ2VuZXJhdGlvbiBhbmQgcHVzaGVzIGFyZSBhbGxvd2VkLlxuICAgICAgY29uc29sZS53YXJuKCdTa2lwIHNldHVwUmVwb3NpdG9yeVJ1bGVzZXRzIGR1ZSB0bzonLCAoZXJyb3IgYXMgRXJyb3IgfCB1bmRlZmluZWQpPy5zdGFjayA/PyBlcnJvcik7XG4gICAgfVxuICB9KTtcbn1cblxuZnVuY3Rpb24gYnVpbGRQcm90ZWN0TWFpblJ1bGVzZXQoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUmVwb3NpdG9yeVJ1bGVzZXRQYXlsb2FkIHtcbiAgY29uc3QgcnVsZXNldCA9IHN0cnVjdHVyZWRDbG9uZShQUk9URUNUX01BSU5fUlVMRVNFVCk7XG4gIGlmIChjb25maWcuY2FyZ29Ub21sRGlyUGF0aHMubGVuZ3RoID4gMCkge1xuICAgIGZvciAoY29uc3QgcnVsZSBvZiBydWxlc2V0LnJ1bGVzKSB7XG4gICAgICBpZiAocnVsZS50eXBlICE9PSAncmVxdWlyZWRfc3RhdHVzX2NoZWNrcycpIGNvbnRpbnVlO1xuICAgICAgLy8gVGhlIGNvbnRleHQgaXMgYDxjYWxsZXIgam9iIGlkPiAvIDxyZXVzYWJsZSBqb2IgaWQ+YCBvZiB0aGUgd2JmeS1nZW5lcmF0ZWQgdGVzdC1ydXN0LnltbC5cbiAgICAgIHJ1bGUucGFyYW1ldGVycy5yZXF1aXJlZF9zdGF0dXNfY2hlY2tzLnB1c2goe1xuICAgICAgICBjb250ZXh0OiAndGVzdC1ydXN0IC8gdGVzdC1ydXN0JyxcbiAgICAgICAgaW50ZWdyYXRpb25faWQ6IEdJVEhVQl9BQ1RJT05TX0lOVEVHUkFUSU9OX0lELFxuICAgICAgfSk7XG4gICAgfVxuICB9XG4gIHJldHVybiBydWxlc2V0O1xufVxuXG5hc3luYyBmdW5jdGlvbiB1cHNlcnRQcm90ZWN0TWFpblJ1bGVzZXQoXG4gIG9jdG9raXQ6IE9jdG9raXQsXG4gIG93bmVyOiBzdHJpbmcsXG4gIHJlcG86IHN0cmluZyxcbiAgcnVsZXNldDogUmVwb3NpdG9yeVJ1bGVzZXRQYXlsb2FkXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgZXhpc3RpbmdSdWxlc2V0ID0gYXdhaXQgZmluZFJlcG9zaXRvcnlSdWxlc2V0KG9jdG9raXQsIG93bmVyLCByZXBvLCBydWxlc2V0Lm5hbWUpO1xuICBjb25zdCBleGlzdGluZ1J1bGVzZXRJZCA9IGV4aXN0aW5nUnVsZXNldD8uaWQ7XG5cbiAgYXdhaXQgd2l0aFJldHJ5KFxuICAgIGFzeW5jICgpID0+IHtcbiAgICAgIGlmIChleGlzdGluZ1J1bGVzZXRJZCkge1xuICAgICAgICBhd2FpdCBvY3Rva2l0LnJlcXVlc3QoJ1BVVCAvcmVwb3Mve293bmVyfS97cmVwb30vcnVsZXNldHMve3J1bGVzZXRfaWR9Jywge1xuICAgICAgICAgIG93bmVyLFxuICAgICAgICAgIHJlcG8sXG4gICAgICAgICAgcnVsZXNldF9pZDogZXhpc3RpbmdSdWxlc2V0SWQsXG4gICAgICAgICAgLi4ucnVsZXNldCxcbiAgICAgICAgICBoZWFkZXJzOiBHSVRIVUJfQVBJX1ZFUlNJT05fSEVBREVSLFxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBhd2FpdCBvY3Rva2l0LnJlcXVlc3QoJ1BPU1QgL3JlcG9zL3tvd25lcn0ve3JlcG99L3J1bGVzZXRzJywge1xuICAgICAgICBvd25lcixcbiAgICAgICAgcmVwbyxcbiAgICAgICAgLi4ucnVsZXNldCxcbiAgICAgICAgaGVhZGVyczogR0lUSFVCX0FQSV9WRVJTSU9OX0hFQURFUixcbiAgICAgIH0pO1xuICAgIH0sXG4gICAge1xuICAgICAgc2hvdWxkUmV0cnk6IChlcnJvcikgPT4gIWlzR2l0SHViUGVybWlzc2lvbk9yVmlzaWJpbGl0eUVycm9yKGVycm9yKSxcbiAgICB9XG4gICk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGZpbmRSZXBvc2l0b3J5UnVsZXNldChcbiAgb2N0b2tpdDogT2N0b2tpdCxcbiAgb3duZXI6IHN0cmluZyxcbiAgcmVwbzogc3RyaW5nLFxuICBydWxlc2V0TmFtZTogc3RyaW5nXG4pOiBQcm9taXNlPFJlcG9zaXRvcnlSdWxlc2V0U3VtbWFyeSB8IHVuZGVmaW5lZD4ge1xuICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHdpdGhSZXRyeShcbiAgICAoKSA9PlxuICAgICAgb2N0b2tpdC5yZXF1ZXN0KCdHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L3J1bGVzZXRzJywge1xuICAgICAgICBvd25lcixcbiAgICAgICAgcmVwbyxcbiAgICAgICAgaW5jbHVkZXNfcGFyZW50czogZmFsc2UsXG4gICAgICAgIHRhcmdldHM6ICdicmFuY2gnLFxuICAgICAgICBoZWFkZXJzOiBHSVRIVUJfQVBJX1ZFUlNJT05fSEVBREVSLFxuICAgICAgfSksXG4gICAge1xuICAgICAgc2hvdWxkUmV0cnk6IChlcnJvcikgPT4gIWlzR2l0SHViUGVybWlzc2lvbk9yVmlzaWJpbGl0eUVycm9yKGVycm9yKSxcbiAgICB9XG4gICk7XG4gIGNvbnN0IHJ1bGVzZXRzID0gcmVzcG9uc2UuZGF0YTtcbiAgaWYgKCFBcnJheS5pc0FycmF5KHJ1bGVzZXRzKSkgcmV0dXJuO1xuICByZXR1cm4gcnVsZXNldHMuZmluZCgocnVsZXNldCkgPT4gcnVsZXNldC5uYW1lID09PSBydWxlc2V0TmFtZSAmJiBydWxlc2V0LnNvdXJjZV90eXBlID09PSAnUmVwb3NpdG9yeScpO1xufVxuIiwiaW1wb3J0IHsgd2l0aFJldHJ5IH0gZnJvbSAnQHdpbGxib29zdGVyL3NoYXJlZC1saWIvc3JjJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZ2V0T2N0b2tpdCwgaGFzR2l0SHViVG9rZW4sIGlzR2l0SHViUGVybWlzc2lvbk9yVmlzaWJpbGl0eUVycm9yIH0gZnJvbSAnLi4vdXRpbHMvZ2l0aHViVXRpbC5qcyc7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBzZXR1cEdpdEh1YlNldHRpbmdzKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ3NldHVwR2l0SHViU2V0dGluZ3MnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgeyByZXBvQXV0aG9yOiBvd25lciwgcmVwb05hbWU6IHJlcG8gfSA9IGNvbmZpZztcbiAgICBpZiAoIW93bmVyIHx8ICFyZXBvKSByZXR1cm47XG4gICAgaWYgKG93bmVyICE9PSAnV2lsbEJvb3N0ZXInICYmIG93bmVyICE9PSAnV2lsbEJvb3N0ZXJMYWInKSByZXR1cm47XG4gICAgaWYgKCFoYXNHaXRIdWJUb2tlbihvd25lcikpIHJldHVybjtcblxuICAgIGNvbnN0IG9jdG9raXQgPSBnZXRPY3Rva2l0KG93bmVyKTtcblxuICAgIHRyeSB7XG4gICAgICAvLyBSZXBvc2l0b3J5IHNldHRpbmdzIG5lZWQgYWRtaW5pc3RyYXRpb24gcGVybWlzc2lvbiwgdW5saWtlIGZpbGUgZ2VuZXJhdGlvbi5cbiAgICAgIGF3YWl0IHdpdGhSZXRyeShcbiAgICAgICAgKCkgPT5cbiAgICAgICAgICBvY3Rva2l0LnJlcXVlc3QoJ1BBVENIIC9yZXBvcy97b3duZXJ9L3tyZXBvfScsIHtcbiAgICAgICAgICAgIG93bmVyLFxuICAgICAgICAgICAgcmVwbyxcbiAgICAgICAgICAgIGFsbG93X2F1dG9fbWVyZ2U6IHRydWUsXG4gICAgICAgICAgICBhbGxvd19tZXJnZV9jb21taXQ6IGZhbHNlLFxuICAgICAgICAgICAgYWxsb3dfc3F1YXNoX21lcmdlOiB0cnVlLFxuICAgICAgICAgICAgYWxsb3dfcmViYXNlX21lcmdlOiBmYWxzZSxcbiAgICAgICAgICAgIGFsbG93X3VwZGF0ZV9icmFuY2g6IHRydWUsXG4gICAgICAgICAgICBkZWxldGVfYnJhbmNoX29uX21lcmdlOiB0cnVlLFxuICAgICAgICAgICAgaGFzX3dpa2k6IGZhbHNlLFxuICAgICAgICAgICAgaGFzX3Byb2plY3RzOiBmYWxzZSxcbiAgICAgICAgICAgIHNxdWFzaF9tZXJnZV9jb21taXRfdGl0bGU6ICdQUl9USVRMRScsXG4gICAgICAgICAgICBzcXVhc2hfbWVyZ2VfY29tbWl0X21lc3NhZ2U6ICdCTEFOSycsXG4gICAgICAgICAgICBoZWFkZXJzOiB7XG4gICAgICAgICAgICAgICdYLUdpdEh1Yi1BcGktVmVyc2lvbic6ICcyMDIyLTExLTI4JyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAuLi4oY29uZmlnLnJlcG9zaXRvcnk/LnN0YXJ0c1dpdGgoJ2dpdGh1YjpXaWxsQm9vc3Rlci8nKSA/IHsgYWxsb3dfYXV0b19tZXJnZTogdHJ1ZSB9IDoge30pLFxuICAgICAgICAgIH0pLFxuICAgICAgICB7XG4gICAgICAgICAgc2hvdWxkUmV0cnk6IChlcnJvcikgPT4gIWlzR2l0SHViUGVybWlzc2lvbk9yVmlzaWJpbGl0eUVycm9yKGVycm9yKSxcbiAgICAgICAgfVxuICAgICAgKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgaWYgKCFpc0dpdEh1YlBlcm1pc3Npb25PclZpc2liaWxpdHlFcnJvcihlcnJvcikpIHRocm93IGVycm9yO1xuXG4gICAgICAvLyBMb2NhbCB3YmZ5IHJ1bnMgb2Z0ZW4gaGF2ZSBwdXNoIHBlcm1pc3Npb24gd2l0aG91dCBhZG1pbiBwZXJtaXNzaW9uLlxuICAgICAgY29uc29sZS53YXJuKCdTa2lwIHNldHVwR2l0SHViU2V0dGluZ3MgZHVlIHRvOicsIChlcnJvciBhcyBFcnJvciB8IHVuZGVmaW5lZCk/LnN0YWNrID8/IGVycm9yKTtcbiAgICB9XG5cbiAgICB0cnkge1xuICAgICAgYXdhaXQgd2l0aFJldHJ5KCgpID0+IGRpc2FibGVEaXNjdXNzaW9ucyhvY3Rva2l0LCBvd25lciwgcmVwbyksIHtcbiAgICAgICAgc2hvdWxkUmV0cnk6IChlcnJvcikgPT4gIWlzR2l0SHViU2V0dGluZ3NFcnJvcihlcnJvciksXG4gICAgICB9KTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgaWYgKCFpc0dpdEh1YlNldHRpbmdzRXJyb3IoZXJyb3IpKSB0aHJvdyBlcnJvcjtcbiAgICAgIGNvbnNvbGUud2FybignU2tpcCBkaXNhYmxpbmcgR2l0SHViIERpc2N1c3Npb25zIGR1ZSB0bzonLCAoZXJyb3IgYXMgRXJyb3IgfCB1bmRlZmluZWQpPy5zdGFjayA/PyBlcnJvcik7XG4gICAgfVxuICB9KTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gZGlzYWJsZURpc2N1c3Npb25zKG9jdG9raXQ6IFJldHVyblR5cGU8dHlwZW9mIGdldE9jdG9raXQ+LCBvd25lcjogc3RyaW5nLCByZXBvOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgcmVwb3NpdG9yeVJlc3BvbnNlID0gYXdhaXQgb2N0b2tpdC5ncmFwaHFsPHsgcmVwb3NpdG9yeT86IHsgaWQ/OiBzdHJpbmcgfSB9PihcbiAgICBgcXVlcnkoJG93bmVyOiBTdHJpbmchLCAkcmVwbzogU3RyaW5nISkge1xuICAgICAgcmVwb3NpdG9yeShvd25lcjogJG93bmVyLCBuYW1lOiAkcmVwbykgeyBpZCB9XG4gICAgfWAsXG4gICAgeyBvd25lciwgcmVwbyB9XG4gICk7XG4gIGNvbnN0IHJlcG9zaXRvcnlJZCA9IHJlcG9zaXRvcnlSZXNwb25zZS5yZXBvc2l0b3J5Py5pZDtcbiAgaWYgKCFyZXBvc2l0b3J5SWQpIHJldHVybjtcbiAgYXdhaXQgb2N0b2tpdC5ncmFwaHFsKFxuICAgIGBtdXRhdGlvbigkaW5wdXQ6IFVwZGF0ZVJlcG9zaXRvcnlJbnB1dCEpIHtcbiAgICAgIHVwZGF0ZVJlcG9zaXRvcnkoaW5wdXQ6ICRpbnB1dCkgeyByZXBvc2l0b3J5IHsgaWQgfSB9XG4gICAgfWAsXG4gICAgeyBpbnB1dDogeyByZXBvc2l0b3J5SWQsIGhhc0Rpc2N1c3Npb25zRW5hYmxlZDogZmFsc2UgfSB9XG4gICk7XG59XG5cbmZ1bmN0aW9uIGlzR2l0SHViU2V0dGluZ3NFcnJvcihlcnJvcjogdW5rbm93bik6IGJvb2xlYW4ge1xuICBpZiAoaXNHaXRIdWJQZXJtaXNzaW9uT3JWaXNpYmlsaXR5RXJyb3IoZXJyb3IpKSByZXR1cm4gdHJ1ZTtcbiAgaWYgKCFlcnJvciB8fCB0eXBlb2YgZXJyb3IgIT09ICdvYmplY3QnIHx8ICEoJ2Vycm9ycycgaW4gZXJyb3IpIHx8ICFBcnJheS5pc0FycmF5KGVycm9yLmVycm9ycykpIHJldHVybiBmYWxzZTtcbiAgcmV0dXJuIGVycm9yLmVycm9ycy5zb21lKFxuICAgIChncmFwaHFsRXJyb3I6IHVua25vd24pID0+XG4gICAgICAhIWdyYXBocWxFcnJvciAmJlxuICAgICAgdHlwZW9mIGdyYXBocWxFcnJvciA9PT0gJ29iamVjdCcgJiZcbiAgICAgICd0eXBlJyBpbiBncmFwaHFsRXJyb3IgJiZcbiAgICAgIFsnRk9SQklEREVOJywgJ0lOU1VGRklDSUVOVF9TQ09QRVMnLCAnTk9UX0ZPVU5EJ10uaW5jbHVkZXMoZ3JhcGhxbEVycm9yLnR5cGUgYXMgc3RyaW5nKVxuICApO1xufVxuIiwiaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuLy8gVGhlIGAvc3JjYCBlbnRyeSAoYSBkZWNsYXJlZCBleHBvcnQpIGxldHMgdGhpcyB3b3Jrc3BhY2UgY29uc3VtZXIgdXNlIHRoZSBzb3VyY2VzIHdpdGhvdXRcbi8vIGJ1aWxkaW5nIHNoYXJlZC1saWIgZmlyc3QsIGFzIGV2ZXJ5IG90aGVyIGltcG9ydCBvZiBpdCBpbiB0aGlzIHBhY2thZ2UgZG9lcy5cbmltcG9ydCB7XG4gIEJVR19JU1NVRV9TRUNUSU9OUyxcbiAgQ0hBTkdFX0lTU1VFX1NFQ1RJT05TLFxuICBQVUxMX1JFUVVFU1RfU0VDVElPTlMsXG4gIHJlbmRlclNlY3Rpb25UZW1wbGF0ZSxcbn0gZnJvbSAnQHdpbGxib29zdGVyL3NoYXJlZC1saWIvc3JjJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZnNVdGlsIH0gZnJvbSAnLi4vdXRpbHMvZnNVdGlsLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuXG5jb25zdCB0ZW1wbGF0ZXMgPSB7XG4gICdwdWxsX3JlcXVlc3RfdGVtcGxhdGUubWQnOiBgXG5DbG9zZSAjPElzc3VlTnVtYmVyPlxuXG48IS0tIFdyaXRlIGZvciBhIHJldmlld2VyIHdobyBoYXMgbm90IGZvbGxvd2VkIHRoZSB3b3JrLiBTY2FsZSBlYWNoIHNlY3Rpb24gdG8gdGhlIGNoYW5nZTogYSBzZW50ZW5jZSBmb3IgYSBzbWFsbCBjaGFuZ2UsIG51bWJlcmVkIHN1YnNlY3Rpb25zIGZvciBhIGxhcmdlIG9uZS4gRGVsZXRlIHRoaXMgY29tbWVudCBhbmQgdGhlIHBsYWNlaG9sZGVyIGNvbW1lbnRzIGJlbG93LiAtLT5cblxuJHtyZW5kZXJTZWN0aW9uVGVtcGxhdGUoUFVMTF9SRVFVRVNUX1NFQ1RJT05TKX1cbmAudHJpbSgpLFxuICAnSVNTVUVfVEVNUExBVEUvYnVnLm1kJzogYFxuLS0tXG5uYW1lOiBCdWcgLyBQcm9ibGVtXG5hYm91dDogU29tZXRoaW5nIGJlaGF2ZXMgd3JvbmdseVxudGl0bGU6ICdmaXg6ICdcbmxhYmVsczogJ3Q6IGZpeCA6YnVnOidcbi0tLVxuXG48IS0tIEtlZXAgUHJvYmxlbSBhbmQgUHJvcG9zYWw7IGRlbGV0ZSBFdmlkZW5jZSBvciBJbXBhY3Qgd2hlbiB0aGV5IGFkZCBub3RoaW5nLiBEZWxldGUgdGhlc2UgY29tbWVudHMuIC0tPlxuXG4ke3JlbmRlclNlY3Rpb25UZW1wbGF0ZShCVUdfSVNTVUVfU0VDVElPTlMpfVxuYC50cmltKCksXG4gICdJU1NVRV9URU1QTEFURS9jaGFuZ2UubWQnOiBgXG4tLS1cbm5hbWU6IENoYW5nZSAvIEZlYXR1cmVcbmFib3V0OiBQcm9wb3NlIGEgY2hhbmdlIHRoYXQgYSB0aGlyZCBwYXJ0eSBjb3VsZCBpbXBsZW1lbnQgd2l0aG91dCBhc2tpbmcgYSBxdWVzdGlvblxudGl0bGU6ICdmZWF0OiAnXG5sYWJlbHM6ICd0OiBmZWF0IDpzcGFya2xlczonXG4tLS1cblxuPCEtLSBLZWVwIHRoZSBmaXJzdCB0aHJlZSBzZWN0aW9ucyBmb3IgYW55IGNoYW5nZSBhbmQgYWRkIHRoZSBvdGhlcnMgYXMgdGhlIGNoYW5nZSBncm93czsgYSBsYXJnZSBjaGFuZ2UgZmlsbHMgYWxsIG9mIHRoZW0gKHNwZWMtYm9vc3RlciByZXZpZXdzIGFnYWluc3QgdGhpcyBsaXN0KS4gRGVsZXRlIHRoZXNlIGNvbW1lbnRzLiAtLT5cblxuJHtyZW5kZXJTZWN0aW9uVGVtcGxhdGUoQ0hBTkdFX0lTU1VFX1NFQ1RJT05TKX1cbmAudHJpbSgpLFxuICAnSVNTVUVfVEVNUExBVEUvY29uZmlnLnltbCc6ICdibGFua19pc3N1ZXNfZW5hYmxlZDogdHJ1ZScsXG59O1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVHaXRIdWJUZW1wbGF0ZXMoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZ2VuZXJhdGVHaXRIdWJUZW1wbGF0ZXMnLCBhc3luYyAoKSA9PiB7XG4gICAgLy8gVGVtcGxhdGVzIGFyZSByZXBvc2l0b3J5LWxldmVsIGZpbGVzLCBzbyBhIGRpcmVjdCB3b3Jrc3BhY2UtY2hpbGQgaW52b2NhdGlvbiBtdXN0IG5vdCBjcmVhdGUgdGhlbS5cbiAgICBpZiAoIWNvbmZpZy5pc1dpbGxCb29zdGVyUmVwbyB8fCAhY29uZmlnLmlzUm9vdCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGZvciAoY29uc3QgW2ZpbGVOYW1lLCBjb250ZW50XSBvZiBPYmplY3QuZW50cmllcyh0ZW1wbGF0ZXMpKSB7XG4gICAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJy5naXRodWInLCBmaWxlTmFtZSk7XG4gICAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnNVdGlsLmdlbmVyYXRlRmlsZShmaWxlUGF0aCwgY29udGVudCkpO1xuICAgIH1cbiAgfSk7XG59XG4iLCJpbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcblxuY29uc3QgZGVwZW5kZW5jeVNlY3Rpb25LZXlzID0gWydkZXBlbmRlbmNpZXMnLCAnZGV2RGVwZW5kZW5jaWVzJywgJ29wdGlvbmFsRGVwZW5kZW5jaWVzJywgJ3BlZXJEZXBlbmRlbmNpZXMnXSBhcyBjb25zdDtcbmNvbnN0IGFsbG93ZWRHaXRIdWJPcmdhbml6YXRpb25QYXR0ZXJuID0gU3RyaW5nLnJhd2AoPzpXaWxsQm9vc3RlcnxXaWxsQm9vc3RlckxhYilgO1xuY29uc3QgYWxsb3dlZEdpdERlcGVuZGVuY3lQYXR0ZXJucyA9IFtcbiAgbmV3IFJlZ0V4cChgXiR7YWxsb3dlZEdpdEh1Yk9yZ2FuaXphdGlvblBhdHRlcm59L1teI1xcXFxzXSsoPzojXFxcXFMrKT8kYCwgJ3UnKSxcbiAgbmV3IFJlZ0V4cChgXmdpdGh1Yjoke2FsbG93ZWRHaXRIdWJPcmdhbml6YXRpb25QYXR0ZXJufS9bXiNcXFxcc10rKD86I1xcXFxTKyk/JGAsICd1JyksXG4gIG5ldyBSZWdFeHAoXG4gICAgYF4oPzpnaXRcXFxcKyk/aHR0cHM6Ly9naXRodWJcXFxcLmNvbS8ke2FsbG93ZWRHaXRIdWJPcmdhbml6YXRpb25QYXR0ZXJufS9bXiNcXFxcc10rKD86XFxcXC5naXQpPyg/OiNcXFxcUyspPyRgLFxuICAgICd1J1xuICApLFxuICBuZXcgUmVnRXhwKFxuICAgIGBeKD86Z2l0XFxcXCspP3NzaDovL2dpdEBnaXRodWJcXFxcLmNvbVs6L10ke2FsbG93ZWRHaXRIdWJPcmdhbml6YXRpb25QYXR0ZXJufS9bXiNcXFxcc10rKD86XFxcXC5naXQpPyg/OiNcXFxcUyspPyRgLFxuICAgICd1J1xuICApLFxuICBuZXcgUmVnRXhwKGBeKD86Z2l0XFxcXCspP2dpdEBnaXRodWJcXFxcLmNvbToke2FsbG93ZWRHaXRIdWJPcmdhbml6YXRpb25QYXR0ZXJufS9bXiNcXFxcc10rKD86XFxcXC5naXQpPyg/OiNcXFxcUyspPyRgLCAndScpLFxuXTtcblxuaW50ZXJmYWNlIERpc2FsbG93ZWREZXBlbmRlbmN5U291cmNlIHtcbiAgZGVwZW5kZW5jeU5hbWU6IHN0cmluZztcbiAgZGlyUGF0aDogc3RyaW5nO1xuICBzZWN0aW9uTmFtZTogKHR5cGVvZiBkZXBlbmRlbmN5U2VjdGlvbktleXMpW251bWJlcl07XG4gIHNwZWNpZmllcjogc3RyaW5nO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gYXNzZXJ0U2FmZURlcGVuZGVuY3lTb3VyY2VzKGNvbmZpZ3M6IFBhY2thZ2VDb25maWdbXSk6IHZvaWQge1xuICBjb25zdCBkaXNhbGxvd2VkU291cmNlcyA9IGNvbmZpZ3MuZmxhdE1hcChnZXREaXNhbGxvd2VkRGVwZW5kZW5jeVNvdXJjZXMpO1xuICBpZiAoZGlzYWxsb3dlZFNvdXJjZXMubGVuZ3RoID09PSAwKSByZXR1cm47XG5cbiAgY29uc3QgZGV0YWlscyA9IGRpc2FsbG93ZWRTb3VyY2VzXG4gICAgLm1hcChcbiAgICAgICh7IGRlcGVuZGVuY3lOYW1lLCBkaXJQYXRoLCBzZWN0aW9uTmFtZSwgc3BlY2lmaWVyIH0pID0+XG4gICAgICAgIGAtICR7cGF0aC5qb2luKGRpclBhdGgsICdwYWNrYWdlLmpzb24nKX06ICR7c2VjdGlvbk5hbWV9LiR7ZGVwZW5kZW5jeU5hbWV9IHVzZXMgJHtzcGVjaWZpZXJ9YFxuICAgIClcbiAgICAuam9pbignXFxuJyk7XG5cbiAgdGhyb3cgbmV3IEVycm9yKFxuICAgIGBEaXNhbGxvd2VkIEdpdCBkZXBlbmRlbmN5IHNvdXJjZXMgZm91bmQuXFxuT25seSBXaWxsQm9vc3RlciBhbmQgV2lsbEJvb3N0ZXJMYWIgR2l0SHViIGRlcGVuZGVuY2llcyBhcmUgYWxsb3dlZC5cXG4ke2RldGFpbHN9YFxuICApO1xufVxuXG5mdW5jdGlvbiBnZXREaXNhbGxvd2VkRGVwZW5kZW5jeVNvdXJjZXMoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogRGlzYWxsb3dlZERlcGVuZGVuY3lTb3VyY2VbXSB7XG4gIGNvbnN0IHBhY2thZ2VKc29uID0gY29uZmlnLnBhY2thZ2VKc29uO1xuICBpZiAoIXBhY2thZ2VKc29uKSByZXR1cm4gW107XG5cbiAgY29uc3QgZGlzYWxsb3dlZFNvdXJjZXM6IERpc2FsbG93ZWREZXBlbmRlbmN5U291cmNlW10gPSBbXTtcbiAgZm9yIChjb25zdCBzZWN0aW9uTmFtZSBvZiBkZXBlbmRlbmN5U2VjdGlvbktleXMpIHtcbiAgICBjb25zdCBzZWN0aW9uID0gcGFja2FnZUpzb25bc2VjdGlvbk5hbWVdO1xuICAgIGlmICghc2VjdGlvbikgY29udGludWU7XG5cbiAgICBmb3IgKGNvbnN0IFtkZXBlbmRlbmN5TmFtZSwgc3BlY2lmaWVyXSBvZiBPYmplY3QuZW50cmllcyhzZWN0aW9uKSkge1xuICAgICAgaWYgKCFzcGVjaWZpZXIpIGNvbnRpbnVlO1xuICAgICAgaWYgKCFpc0dpdERlcGVuZGVuY3lTcGVjaWZpZXIoc3BlY2lmaWVyKSkgY29udGludWU7XG4gICAgICBpZiAoaXNBbGxvd2VkR2l0RGVwZW5kZW5jeVNwZWNpZmllcihzcGVjaWZpZXIpKSBjb250aW51ZTtcblxuICAgICAgZGlzYWxsb3dlZFNvdXJjZXMucHVzaCh7XG4gICAgICAgIGRlcGVuZGVuY3lOYW1lLFxuICAgICAgICBkaXJQYXRoOiBjb25maWcuZGlyUGF0aCxcbiAgICAgICAgc2VjdGlvbk5hbWUsXG4gICAgICAgIHNwZWNpZmllcixcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuICByZXR1cm4gZGlzYWxsb3dlZFNvdXJjZXM7XG59XG5cbmZ1bmN0aW9uIGlzR2l0RGVwZW5kZW5jeVNwZWNpZmllcihzcGVjaWZpZXI6IHN0cmluZyk6IGJvb2xlYW4ge1xuICByZXR1cm4gKFxuICAgIGlzR2l0SHViU2hvcnRoYW5kU3BlY2lmaWVyKHNwZWNpZmllcikgfHxcbiAgICAvXig/OmJpdGJ1Y2tldHxnaXN0fGdpdGh1YnxnaXRsYWIpOi91LnRlc3Qoc3BlY2lmaWVyKSB8fFxuICAgIC9eaHR0cHM/OlxcL1xcLyg/OmJpdGJ1Y2tldFxcLm9yZ3xnaXRodWJcXC5jb218Z2l0bGFiXFwuY29tKVxcLy91LnRlc3Qoc3BlY2lmaWVyKSB8fFxuICAgIC9eKD86aHR0cHM/fHNzaCk6XFwvXFwvXFxTK1xcLmdpdCg/OiNcXFMrKT8kL3UudGVzdChzcGVjaWZpZXIpIHx8XG4gICAgL15bXkBcXHNdK0BbXjpcXHNdKzpcXFMrKD86I1xcUyspPyQvdS50ZXN0KHNwZWNpZmllcikgfHxcbiAgICBzcGVjaWZpZXIuc3RhcnRzV2l0aCgnZ2l0OicpIHx8XG4gICAgc3BlY2lmaWVyLnN0YXJ0c1dpdGgoJ2dpdCsnKSB8fFxuICAgIHNwZWNpZmllci5zdGFydHNXaXRoKCdzc2g6Ly9naXRAJylcbiAgKTtcbn1cblxuZnVuY3Rpb24gaXNHaXRIdWJTaG9ydGhhbmRTcGVjaWZpZXIoc3BlY2lmaWVyOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgcmV0dXJuIC9eW2EtekEtWjAtOV1bXFx3Li1dKlxcL1tcXHcuLV0rKD86I1xcUyspPyQvdS50ZXN0KHNwZWNpZmllcik7XG59XG5cbmZ1bmN0aW9uIGlzQWxsb3dlZEdpdERlcGVuZGVuY3lTcGVjaWZpZXIoc3BlY2lmaWVyOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgcmV0dXJuIGFsbG93ZWRHaXREZXBlbmRlbmN5UGF0dGVybnMuc29tZSgocGF0dGVybikgPT4gcGF0dGVybi50ZXN0KHNwZWNpZmllcikpO1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHsgaWdub3JlRXJyb3IsIGlnbm9yZUVycm9yQXN5bmMgfSBmcm9tICdAd2lsbGJvb3N0ZXIvc2hhcmVkLWxpYi9zcmMnO1xuaW1wb3J0IHsgbm9ybWFsaXplQnVuTG9ja2ZpbGUgfSBmcm9tICdAd2lsbGJvb3N0ZXIvc2hhcmVkLWxpYi1ub2RlL3NyYyc7XG5pbXBvcnQgeWFyZ3MgZnJvbSAneWFyZ3MnO1xuXG5pbXBvcnQgeyBmaXhOZXh0Q29uZmlnSnNvbiB9IGZyb20gJy4vZml4ZXJzL25leHRDb25maWcuanMnO1xuaW1wb3J0IHsgZml4Q2hha3JhVG9hc3RlciB9IGZyb20gJy4vZml4ZXJzL2NoYWtyYVRvYXN0ZXIuanMnO1xuaW1wb3J0IHsgZml4UGxheXdyaWdodENvbmZpZyB9IGZyb20gJy4vZml4ZXJzL3BsYXl3cmlnaHRDb25maWcuanMnO1xuaW1wb3J0IHsgZml4VHlwb3MgfSBmcm9tICcuL2ZpeGVycy90eXBvcy5qcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZUFnZW50SW5zdHJ1Y3Rpb25zIH0gZnJvbSAnLi9nZW5lcmF0b3JzL2FnZW50cy5qcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZUJ1bmZpZ1RvbWwsIHJlYWRCdW5HbG9iYWxTdG9yZSwgcmVzb2x2ZUJ1bkdsb2JhbFN0b3JlIH0gZnJvbSAnLi9nZW5lcmF0b3JzL2J1bmZpZy5qcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZURvY2tlcmlnbm9yZSB9IGZyb20gJy4vZ2VuZXJhdG9ycy9kb2NrZXJpZ25vcmUuanMnO1xuaW1wb3J0IHsgZ2VuZXJhdGVFZGl0b3Jjb25maWcgfSBmcm9tICcuL2dlbmVyYXRvcnMvZWRpdG9yY29uZmlnLmpzJztcbmltcG9ydCB7IGdlbmVyYXRlRm5veFRvbWwgfSBmcm9tICcuL2dlbmVyYXRvcnMvZm5veFRvbWwuanMnO1xuaW1wb3J0IHsgZ2VuZXJhdGVHZW1pbmlDb25maWcgfSBmcm9tICcuL2dlbmVyYXRvcnMvZ2VtaW5pQ29uZmlnLmpzJztcbmltcG9ydCB7IGdlbmVyYXRlR2l0YXR0cmlidXRlcywgcmVub3JtYWxpemVUcmFja2VkVGV4dEZpbGVzIH0gZnJvbSAnLi9nZW5lcmF0b3JzL2dpdGF0dHJpYnV0ZXMuanMnO1xuaW1wb3J0IHsgZ2VuZXJhdGVHaXRpZ25vcmUgfSBmcm9tICcuL2dlbmVyYXRvcnMvZ2l0aWdub3JlLmpzJztcbmltcG9ydCB7IGVuc3VyZUdsb2JhbFJlbGVhc2VBZ2VHYXRlcyB9IGZyb20gJy4vZ2VuZXJhdG9ycy9nbG9iYWxSZWxlYXNlQWdlR2F0ZS5qcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZUlkZWFTZXR0aW5ncyB9IGZyb20gJy4vZ2VuZXJhdG9ycy9pZGVhLmpzJztcbmltcG9ydCB7IGdlbmVyYXRlTGVmdGhvb2sgfSBmcm9tICcuL2dlbmVyYXRvcnMvbGVmdGhvb2suanMnO1xuaW1wb3J0IHsgZ2VuZXJhdGVQYWNrYWdlSnNvbiwgZ2V0V29ya3NwYWNlUGFja2FnZURpcnMgfSBmcm9tICcuL2dlbmVyYXRvcnMvcGFja2FnZUpzb24uanMnO1xuaW1wb3J0IHsgZ2VuZXJhdGVPeGZtdENvbmZpZyB9IGZyb20gJy4vZ2VuZXJhdG9ycy9veGZtdENvbmZpZy5qcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZU94bGludENvbmZpZyB9IGZyb20gJy4vZ2VuZXJhdG9ycy9veGxpbnRDb25maWcuanMnO1xuaW1wb3J0IHsgZ2VuZXJhdGVQcmV0dGllcmlnbm9yZSB9IGZyb20gJy4vZ2VuZXJhdG9ycy9wcmV0dGllcmlnbm9yZS5qcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZVB5cmlnaHRDb25maWdKc29uIH0gZnJvbSAnLi9nZW5lcmF0b3JzL3B5cmlnaHRDb25maWcuanMnO1xuaW1wb3J0IHsgZml4UmFpbHdheWlnbm9yZSB9IGZyb20gJy4vZ2VuZXJhdG9ycy9yYWlsd2F5aWdub3JlLmpzJztcbmltcG9ydCB7IGdlbmVyYXRlUmVhZG1lLCByZWFkQXBwbGllZFdiZnlWZXJzaW9uTGFiZWwgfSBmcm9tICcuL2dlbmVyYXRvcnMvcmVhZG1lLmpzJztcbmltcG9ydCB7IGdlbmVyYXRlUmVsZWFzZXJjIH0gZnJvbSAnLi9nZW5lcmF0b3JzL3JlbGVhc2VyYy5qcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZVJlbm92YXRlSnNvbmMgfSBmcm9tICcuL2dlbmVyYXRvcnMvcmVub3ZhdGVKc29uYy5qcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZVRzY29uZmlnIH0gZnJvbSAnLi9nZW5lcmF0b3JzL3RzY29uZmlnLmpzJztcbmltcG9ydCB7IGdlbmVyYXRlVXNlckFnZW50Q29uZmlncyB9IGZyb20gJy4vZ2VuZXJhdG9ycy91c2VyQWdlbnRDb25maWdzLmpzJztcbmltcG9ydCB7IGdlbmVyYXRlVnNjb2RlU2V0dGluZ3MgfSBmcm9tICcuL2dlbmVyYXRvcnMvdnNjb2RlU2V0dGluZ3MuanMnO1xuaW1wb3J0IHsgZW5zdXJlV2JFbnZEZWZpbml0aW9ucyB9IGZyb20gJy4vZ2VuZXJhdG9ycy93YkVudi5qcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZVNlbGZDb250YWluZWRXb3JrZmxvd3MgfSBmcm9tICcuL2dlbmVyYXRvcnMvc2VsZkNvbnRhaW5lZFdvcmtmbG93LmpzJztcbmltcG9ydCB7IGdlbmVyYXRlV29ya2Zsb3dzLCBpc1JldXNhYmxlV29ya2Zsb3dzUmVwbyB9IGZyb20gJy4vZ2VuZXJhdG9ycy93b3JrZmxvdy5qcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZU1pc2VUb21sLCBtaW5pbXVtQnVuVmVyc2lvbiB9IGZyb20gJy4vZ2VuZXJhdG9ycy9taXNlVG9tbC5qcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZVJlcG9zaXRvcnlOcG1yYyB9IGZyb20gJy4vZ2VuZXJhdG9ycy9ucG1yYy5qcyc7XG5pbXBvcnQgeyBzZXR1cExhYmVscyB9IGZyb20gJy4vZ2l0aHViL2xhYmVsLmpzJztcbmltcG9ydCB7IHNldHVwUmVwb3NpdG9yeVJ1bGVzZXRzIH0gZnJvbSAnLi9naXRodWIvcnVsZXNldC5qcyc7XG5pbXBvcnQgeyBzZXR1cEdpdEh1YlNldHRpbmdzIH0gZnJvbSAnLi9naXRodWIvc2V0dGluZ3MuanMnO1xuaW1wb3J0IHsgZ2VuZXJhdGVHaXRIdWJUZW1wbGF0ZXMgfSBmcm9tICcuL2dpdGh1Yi90ZW1wbGF0ZS5qcyc7XG5pbXBvcnQgeyBvcHRpb25zIH0gZnJvbSAnLi9vcHRpb25zLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBnZXRQYWNrYWdlQ29uZmlnLCBnZXRXb3JrZXJUeXBlc1NjcmlwdEVycm9yIH0gZnJvbSAnLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGFzc2VydFNhZmVEZXBlbmRlbmN5U291cmNlcyB9IGZyb20gJy4vdXRpbHMvZGVwZW5kZW5jeVNvdXJjZVBvbGljeS5qcyc7XG5pbXBvcnQgeyBmc1V0aWwgfSBmcm9tICcuL3V0aWxzL2ZzVXRpbC5qcyc7XG5pbXBvcnQgeyBkb2VzQ29udGFpbkphdmEsIGRvZXNDb250YWluSnNPclRzIH0gZnJvbSAnLi91dGlscy9wYWNrYWdlQ2FwYWJpbGl0aWVzLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5pbXBvcnQgeyBzcGF3blN5bmMsIHNwYXduU3luY0FuZFJldHVyblN0YXR1cywgc3Bhd25TeW5jQW5kUmV0dXJuU3Rkb3V0IH0gZnJvbSAnLi91dGlscy9zcGF3blV0aWwuanMnO1xuaW1wb3J0IHsgZGlzcG9zZVR5cGVTY3JpcHRBcGkgfSBmcm9tICcuL3V0aWxzL3R5cGVzY3JpcHRBcGkuanMnO1xuaW1wb3J0IHsgZ2V0V2JmeVZlcnNpb24sIGdldFdiZnlWZXJzaW9uTGFiZWwgfSBmcm9tICcuL3V0aWxzL3ZlcnNpb24uanMnO1xuaW1wb3J0IHsgZ2V0V29ya3NwYWNlU3ViRGlyUGF0aHMgfSBmcm9tICcuL3V0aWxzL3dvcmtzcGFjZVV0aWwuanMnO1xuXG4vKipcbiAqIEFwcGxpZXMgb25seSB0aGUgZ2xvYmFsIHJlbGVhc2UtYWdlIGdhdGUsIHdpdGhvdXQgdG91Y2hpbmcgYW55IHJlcG9zaXRvcnkuIFNwZWxsZWQgb3V0IGluIGZ1bGxcbiAqIHJhdGhlciB0aGFuIHNob3J0ZW5lZCAoZS5nLiBgZ2F0ZWApIGJlY2F1c2UgdGhlIGRlZmF1bHQgY29tbWFuZCB0YWtlcyBwb3NpdGlvbmFsIHBhdGhzOiBhIHNob3J0XG4gKiBuYW1lIHdvdWxkIHN3YWxsb3cgYSBkaXJlY3RvcnkgdGhhdCBoYXBwZW5zIHRvIHNoYXJlIGl0LlxuICovXG5jb25zdCBhcHBseVJlbGVhc2VBZ2VHYXRlQ29tbWFuZCA9ICdhcHBseS1yZWxlYXNlLWFnZS1nYXRlJztcbi8qKiBTYW1lIG5hbWluZyByYXRpb25hbGUgYXMgYXBwbHlSZWxlYXNlQWdlR2F0ZUNvbW1hbmQuICovXG5jb25zdCBnZW5lcmF0ZVVzZXJBZ2VudENvbmZpZ3NDb21tYW5kID0gJ2dlbmVyYXRlLXVzZXItYWdlbnQtY29uZmlncyc7XG5cbmFzeW5jIGZ1bmN0aW9uIG1haW4oKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IGFyZ3YgPSBhd2FpdCB5YXJncyhwcm9jZXNzLmFyZ3Yuc2xpY2UoMikpXG4gICAgLmNvbW1hbmQoXG4gICAgICBhcHBseVJlbGVhc2VBZ2VHYXRlQ29tbWFuZCxcbiAgICAgIFwiQXBwbHkgb25seSB0aGUgb3JnYW5pemF0aW9uJ3MgbWluaW11bS1yZWxlYXNlLWFnZSBwb2xpY3kgdG8gdGhpcyBtYWNoaW5lJ3MgZ2xvYmFsIHBhY2thZ2UtbWFuYWdlciBjb25maWdzXCJcbiAgICApXG4gICAgLmNvbW1hbmQoXG4gICAgICBnZW5lcmF0ZVVzZXJBZ2VudENvbmZpZ3NDb21tYW5kLFxuICAgICAgXCJPdmVyd3JpdGUgdGhpcyB1c2VyJ3MgYWdlbnQgaW5zdHJ1Y3Rpb24gZmlsZXMgKH4vLmNvZGV4L0FHRU5UUy5tZCwgfi8uY2xhdWRlL0NMQVVERS5tZCwgfi8uZ2VtaW5pL0dFTUlOSS5tZCkgd2l0aCB0aGUgb3JnYW5pemF0aW9uJ3MgZml4ZWQgY29udGVudCBhbmQgbWVyZ2UgdGhlIG9yZ2FuaXphdGlvbidzIHNldHRpbmdzIGludG8gfi8uY2xhdWRlL3NldHRpbmdzLmpzb24gYW5kIH4vLmdlbWluaS9zZXR0aW5ncy5qc29uXCJcbiAgICApXG4gICAgLmNvbW1hbmQoJyQwIFtwYXRocy4uXScsICdNYWtlIGEgZ2l2ZW4gcHJvamVjdCBmb2xsb3cgdGhlIFdpbGxCb29zdGVyIHN0YW5kYXJkJywgKHlhcmdzKSA9PiB7XG4gICAgICB5YXJncy5wb3NpdGlvbmFsKCdwYXRocycsIHtcbiAgICAgICAgZGVzY3JpYmU6ICdwcm9qZWN0IHBhdGhzIHRvIGJlIHdiZmllZCcsXG4gICAgICAgIGFycmF5OiB0cnVlLFxuICAgICAgICB0eXBlOiAnc3RyaW5nJyxcbiAgICAgICAgZGVmYXVsdDogWycuJ10sXG4gICAgICB9KTtcbiAgICB9KVxuICAgIC5vcHRpb25zKHtcbiAgICAgIGZvcmNlOiB7XG4gICAgICAgIGRlc2NyaXB0aW9uOiAnQXBwbHkgd2JmeSBldmVuIHdoZW4gdGhlIHJlcG9zaXRvcnkgYWxyZWFkeSByZWNvcmRzIHRoaXMgd2JmeSB2ZXJzaW9uJyxcbiAgICAgICAgdHlwZTogJ2Jvb2xlYW4nLFxuICAgICAgICBkZWZhdWx0OiBmYWxzZSxcbiAgICAgICAgYWxpYXM6ICdmJyxcbiAgICAgIH0sXG4gICAgICBza2lwRGVwczoge1xuICAgICAgICBkZXNjcmlwdGlvbjpcbiAgICAgICAgICAnU2tpcCBhZGRpbmcgbWFuYWdlZCBkZXBlbmRlbmNpZXMgYW5kIHRoZSBsaW5rZXIgcHJvYmUgKHRoZSBmaW5hbCBgYnVuIGluc3RhbGxgIHJlZnJlc2hpbmcgdGhlIGxvY2tmaWxlIHN0aWxsIHJ1bnMpJyxcbiAgICAgICAgdHlwZTogJ2Jvb2xlYW4nLFxuICAgICAgICBkZWZhdWx0OiBmYWxzZSxcbiAgICAgICAgYWxpYXM6ICdkJyxcbiAgICAgIH0sXG4gICAgICB2ZXJib3NlOiB7XG4gICAgICAgIGRlc2NyaXB0aW9uOiAnV2hldGhlciBvciBub3QgdG8gZW5hYmxlIHZlcmJvc2UgbW9kZScsXG4gICAgICAgIHR5cGU6ICdib29sZWFuJyxcbiAgICAgICAgZGVmYXVsdDogZmFsc2UsXG4gICAgICAgIGFsaWFzOiAndicsXG4gICAgICB9LFxuICAgIH0pXG4gICAgLnZlcnNpb24oZ2V0V2JmeVZlcnNpb24oKSlcbiAgICAuc3RyaWN0KCkuYXJndjtcbiAgb3B0aW9ucy5pc1ZlcmJvc2UgPSBhcmd2LnZlcmJvc2U7XG5cbiAgLy8gRGVsaWJlcmF0ZWx5IGJlZm9yZSB0aGUgQnVuIGNoZWNrIGluIHdpbGxib29zdGVyaWZ5UGF0aHMoKTogdGhlIGdhdGUgbXVzdCBiZSBhcHBsaWFibGUgb24gYVxuICAvLyBtYWNoaW5lIHdob3NlIEJ1biBpcyBvdXRkYXRlZCwgd2hpY2ggaXMgZXhhY3RseSBhIG1hY2hpbmUgdGhhdCBzdGlsbCBuZWVkcyBnYXRpbmcuXG4gIGlmIChhcmd2Ll9bMF0gPT09IGFwcGx5UmVsZWFzZUFnZUdhdGVDb21tYW5kKSB7XG4gICAgaWYgKCFlbnN1cmVHbG9iYWxSZWxlYXNlQWdlR2F0ZXMoKSkgcHJvY2Vzcy5leGl0Q29kZSA9IDE7XG4gICAgcmV0dXJuO1xuICB9XG4gIGlmIChhcmd2Ll9bMF0gPT09IGdlbmVyYXRlVXNlckFnZW50Q29uZmlnc0NvbW1hbmQpIHtcbiAgICBpZiAoIShhd2FpdCBnZW5lcmF0ZVVzZXJBZ2VudENvbmZpZ3MoKSkpIHByb2Nlc3MuZXhpdENvZGUgPSAxO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGxldCBoYXNJbnZhbGlkUGFja2FnZUNvbmZpZyA9IGZhbHNlO1xuICB0cnkge1xuICAgIGhhc0ludmFsaWRQYWNrYWdlQ29uZmlnID0gYXdhaXQgd2lsbGJvb3N0ZXJpZnlQYXRocyhhcmd2LnBhdGhzIGFzIHN0cmluZ1tdLCBhcmd2LnNraXBEZXBzLCBhcmd2LmZvcmNlKTtcbiAgfSBmaW5hbGx5IHtcbiAgICAvLyBUaGUgVHlwZVNjcmlwdCBjb21waWxlciBzZXJ2ZXIgc3Bhd25lZCBmb3IgQVNUIHBhcnNpbmcga2VlcHMgYW4gb3BlbiBJUENcbiAgICAvLyBjaGFubmVsIHRoYXQgd291bGQgb3RoZXJ3aXNlIHByZXZlbnQgdGhlIE5vZGUuanMgcHJvY2VzcyBmcm9tIGV4aXRpbmcuXG4gICAgYXdhaXQgZGlzcG9zZVR5cGVTY3JpcHRBcGkoKTtcbiAgfVxuICBpZiAoaGFzSW52YWxpZFBhY2thZ2VDb25maWcpIHtcbiAgICBwcm9jZXNzLmV4aXRDb2RlID0gMTtcbiAgfVxufVxuXG5hc3luYyBmdW5jdGlvbiB3aWxsYm9vc3RlcmlmeVBhdGhzKHBhdGhzOiBzdHJpbmdbXSwgc2tpcERlcHM6IGJvb2xlYW4sIGZvcmNlOiBib29sZWFuKTogUHJvbWlzZTxib29sZWFuPiB7XG4gIC8vIEJlZm9yZSBhbnl0aGluZyBlbHNlIOKAlCBldmVuIHRoZSBCdW4gY2hlY2sgYmVsb3c6IHRoZSBkZXZlbG9wZXIgbWFjaGluZSdzIGdsb2JhbFxuICAvLyBwYWNrYWdlLW1hbmFnZXIgY29uZmlncyBtdXN0IHJlY2VpdmUgdGhlIG9yZydzIG1pbmltdW0tcmVsZWFzZS1hZ2UgcG9saWN5IG9uIEVWRVJZIHJ1bixcbiAgLy8gYmVjYXVzZSB0aGV5IGFyZSB3aGF0IGd1YXJkcyBicmFuZC1uZXcgbG9jYWwgcHJvamVjdHMgdGhhdCBoYXZlIG5vIHdiZnktZ2VuZXJhdGVkIHJlcG9zaXRvcnlcbiAgLy8gY29uZmlnIHlldCwgYW5kIHRoYXQgcHJvdGVjdGlvbiBtdXN0IHdvcmsgYmVmb3JlIHRoZSBzdXBwb3J0ZWQtdmVyc2lvbiBjaGVjay5cbiAgZW5zdXJlR2xvYmFsUmVsZWFzZUFnZUdhdGVzKCk7XG5cbiAgLy8gd2JmeSBtYW5hZ2VzIHJlcG9zaXRvcmllcyB0aHJvdWdoIEJ1biArIG1pc2UgYW5kIHVzZXMgQnVuIDEuNCBydW50aW1lIEFQSXMuIFRoZSB2ZXJzaW9uIGZsb29yXG4gIC8vIGFsc28gZW5zdXJlcyB0aGUgZ2VuZXJhdGVkIGJ1bmZpZy50b21sIG9wdGlvbnMgcHJvZHVjZSB0aGUgaW5zdGFsbCBsYXlvdXQgd2JmeSB2YWxpZGF0ZXMuIEl0XG4gIC8vIHN0YXlzIHVuY29uZGl0aW9uYWwgZXZlbiB0aG91Z2ggdGhlIGFscmVhZHktYXBwbGllZCBjaGVjayBiZWxvdyBjYW4gbWFrZSBhIHJ1biBhIG5vLW9wOiBhblxuICAvLyBvdXRkYXRlZCBCdW4gaXMgYSBicm9rZW4gZW52aXJvbm1lbnQgd2JmeSBtdXN0IHJlcG9ydCwgYW5kIGhpZGluZyBpdCB3aGVuZXZlciBldmVyeSBwYXRoXG4gIC8vIGhhcHBlbnMgdG8gYmUgc2tpcHBlZCB3b3VsZCBzdXJmYWNlIGl0IG9ubHkgbGF0ZXIuXG4gIGNvbnN0IGJ1blZlcnNpb24gPSBCdW4udmVyc2lvbjtcbiAgaWYgKEJ1bi5zZW12ZXIub3JkZXIoYnVuVmVyc2lvbiwgbWluaW11bUJ1blZlcnNpb24pIDwgMCkge1xuICAgIGNvbnNvbGUuZXJyb3IoYHdiZnkgcmVxdWlyZXMgQnVuID49ICR7bWluaW11bUJ1blZlcnNpb259IChmb3VuZCAke2J1blZlcnNpb259KS4gVXBncmFkZSBCdW4gYW5kIHJlLXJ1bi5gKTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIC8vIEEgYC1kaXJ0eS1sb2NhbGAgbGFiZWwgaWRlbnRpZmllcyBhbiBlZGl0ZWQgY2hlY2tvdXQsIHdob3NlIG5leHQgYnVpbGQgcHJvZHVjZXMgZGlmZmVyZW50IGZpbGVzXG4gIC8vIHVuZGVyIHRoZSBzYW1lIGxhYmVsLCBzbyBzdWNoIGEgcnVuIGlzIG5ldmVyIHRyZWF0ZWQgYXMgYWxyZWFkeSBhcHBsaWVkLlxuICBjb25zdCB2ZXJzaW9uTGFiZWwgPSBnZXRXYmZ5VmVyc2lvbkxhYmVsKCk7XG4gIGNvbnN0IHNraXBwYWJsZVZlcnNpb25MYWJlbCA9XG4gICAgIWZvcmNlICYmIHZlcnNpb25MYWJlbCAmJiAhdmVyc2lvbkxhYmVsLmVuZHNXaXRoKCctZGlydHktbG9jYWwnKSA/IHZlcnNpb25MYWJlbCA6IHVuZGVmaW5lZDtcblxuICBsZXQgaGFzSW52YWxpZFBhY2thZ2VDb25maWcgPSBmYWxzZTtcbiAgZm9yIChjb25zdCBpbnB1dERpclBhdGggb2YgcGF0aHMpIHtcbiAgICAvLyBOb3JtYWxpemUgb25jZSBhdCB0aGUgQ0xJIGJvdW5kYXJ5LiBHZW5lcmF0b3JzIHVzZSBkaXJQYXRoIGZvciBjd2QgYW5kIGJhc2VuYW1lIGRlY2lzaW9ucztcbiAgICAvLyBsZWF2aW5nIHRoZSBzdXBwb3J0ZWQgZGVmYXVsdCBgLmAgdW5yZXNvbHZlZCB3b3VsZCBnZW5lcmF0ZSBhbiBpbnZhbGlkIHBhY2thZ2UgbmFtZSBvZiBgLmAuXG4gICAgY29uc3Qgcm9vdERpclBhdGggPSBwYXRoLnJlc29sdmUoaW5wdXREaXJQYXRoKTtcbiAgICAvLyBDb25maW5lIGV2ZXJ5IGdlbmVyYXRlZCBmaWxlIHRvIHRoaXMgcmVwb3NpdG9yeSAoc2VlIGZzVXRpbC5nZW5lcmF0ZUZpbGUpLiBTZXQgQkVGT1JFIGFueVxuICAgIC8vIGZpeGVyIHdyaXRlcywgYW5kIHJlc2V0IG9uIGV2ZXJ5IGl0ZXJhdGlvbiBzbyBhIG11bHRpLXBhdGggcnVuIG5ldmVyIGtlZXBzIHRoZSBwcmV2aW91cyByb290LlxuICAgIGZzVXRpbC5zZXRSb290RGlyUGF0aChmcy5leGlzdHNTeW5jKHJvb3REaXJQYXRoKSA/IHJvb3REaXJQYXRoIDogdW5kZWZpbmVkKTtcblxuICAgIC8vIFRoZSBiYWRnZSByZWNvcmRzIHRoZSBidWlsZCB0aGF0IGdlbmVyYXRlZCB0aGUgcmVwb3NpdG9yeSdzIGNvbmZpZ3VyYXRpb24sIHNvIHRoZSBzYW1lIGJ1aWxkXG4gICAgLy8gd291bGQgb25seSByZXdyaXRlIHdoYXQgaXMgYWxyZWFkeSB0aGVyZS4gU2tpcHBpbmcgaXMgYSBkZWxpYmVyYXRlIHRyYWRlOiB0aGUgcGFydHMgb2YgYSBydW5cbiAgICAvLyB0aGF0IGRlcGVuZCBvbiBzdGF0ZSBPVVRTSURFIHRoZSByZXBvc2l0b3J5IChHaXRIdWIgc2V0dGluZ3MsIGRlcGVuZGVuY3kgdXBkYXRlcywgdGhlIGZldGNoZWRcbiAgICAvLyAuZ2l0aWdub3JlKSBkbyBnZXQgc2tpcHBlZCB0b28sIHdoaWNoIGlzIHdoYXQgLS1mb3JjZSBpcyBmb3IuXG4gICAgaWYgKHNraXBwYWJsZVZlcnNpb25MYWJlbCAmJiAoYXdhaXQgcmVhZEFwcGxpZWRXYmZ5VmVyc2lvbkxhYmVsKHJvb3REaXJQYXRoKSkgPT09IHNraXBwYWJsZVZlcnNpb25MYWJlbCkge1xuICAgICAgY29uc29sZS5pbmZvKGBTa2lwICR7cm9vdERpclBhdGh9OiB3YmZ5ICR7c2tpcHBhYmxlVmVyc2lvbkxhYmVsfSBpcyBhbHJlYWR5IGFwcGxpZWQuIFBhc3MgLS1mb3JjZSB0byByZS1hcHBseS5gKTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBjb25zdCBwYWNrYWdlc0RpclBhdGggPSBwYXRoLmpvaW4ocm9vdERpclBhdGgsICdwYWNrYWdlcycpO1xuICAgIGNvbnN0IGRpcmVudHMgPSAoYXdhaXQgaWdub3JlRXJyb3JBc3luYygoKSA9PiBmcy5wcm9taXNlcy5yZWFkZGlyKHBhY2thZ2VzRGlyUGF0aCwgeyB3aXRoRmlsZVR5cGVzOiB0cnVlIH0pKSkgPz8gW107XG4gICAgY29uc3QgcGFja2FnZXNTdWJEaXJQYXRocyA9IGRpcmVudHNcbiAgICAgIC5maWx0ZXIoKGQpID0+IGQuaXNEaXJlY3RvcnkoKSlcbiAgICAgIC5tYXAoKGQpID0+IHBhdGgucmVzb2x2ZShwYWNrYWdlc0RpclBhdGgsIGQubmFtZSkpO1xuICAgIC8vIEFsc28gY292ZXIgd29ya3NwYWNlcyBkZWNsYXJlZCBvdXRzaWRlIHBhY2thZ2VzLyogKGUuZy4gYXBwcy8qKTogdGhleSByZWNlaXZlIHRoZSBzYW1lXG4gICAgLy8gbWFuYWdlZCBjb25maWdzICh0c2NvbmZpZy5qc29uLCBwYWNrYWdlLmpzb24gY29udmVudGlvbnMsIOKApikgYXMgcGFja2FnZXMvKiBjaGlsZHJlbi5cbiAgICBjb25zdCByb290UGFja2FnZUpzb24gPVxuICAgICAgaWdub3JlRXJyb3IoXG4gICAgICAgICgpID0+XG4gICAgICAgICAgSlNPTi5wYXJzZShmcy5yZWFkRmlsZVN5bmMocGF0aC5yZXNvbHZlKHJvb3REaXJQYXRoLCAncGFja2FnZS5qc29uJyksICd1dGY4JykpIGFzIFBhY2thZ2VDb25maWdbJ3BhY2thZ2VKc29uJ11cbiAgICAgICkgPz8ge307XG4gICAgY29uc3Qgd29ya3NwYWNlU3ViRGlyUGF0aHMgPSBnZXRXb3Jrc3BhY2VTdWJEaXJQYXRocyh7XG4gICAgICBkaXJQYXRoOiByb290RGlyUGF0aCxcbiAgICAgIHBhY2thZ2VKc29uOiByb290UGFja2FnZUpzb24sXG4gICAgICBkb2VzQ29udGFpblN1YlBhY2thZ2VKc29uczogcGFja2FnZXNTdWJEaXJQYXRocy5zb21lKChzdWJEaXJQYXRoKSA9PlxuICAgICAgICBmcy5leGlzdHNTeW5jKHBhdGgucmVzb2x2ZShzdWJEaXJQYXRoLCAncGFja2FnZS5qc29uJykpXG4gICAgICApLFxuICAgIH0pO1xuICAgIGNvbnN0IHN1YkRpclBhdGhzID0gWy4uLm5ldyBTZXQoWy4uLnBhY2thZ2VzU3ViRGlyUGF0aHMsIC4uLndvcmtzcGFjZVN1YkRpclBhdGhzXSldLmZpbHRlcihcbiAgICAgIChzdWJEaXJQYXRoKSA9PiBzdWJEaXJQYXRoICE9PSBwYXRoLnJlc29sdmUocm9vdERpclBhdGgpXG4gICAgKTtcblxuICAgIC8vIFJlZnVzZWQgd3JpdGVzIG9uIGNvcmUgbWFuYWdlZCBmaWxlcyB3b3VsZCBsZWF2ZSB0aGUgcmVwb3NpdG9yeSBwYXJ0aWFsbHkgdXBkYXRlZCwgc28gc2tpcFxuICAgIC8vIGl0IEJFRk9SRSBhbnkgbXV0YXRpb24gd2hlbiBvbmUgb2YgdGhlbSBpcyBhIHN5bWxpbmsgb3IgcmVzb2x2ZXMgb3V0c2lkZSB0aGUgcmVwb3NpdG9yeS5cbiAgICBjb25zdCBtYW5hZ2VkRmlsZVBhdGhzID0gW1xuICAgICAgLi4uWycuZ2l0YXR0cmlidXRlcycsICdidW5maWcudG9tbCcsICdsZWZ0aG9vay55bWwnLCAncGFja2FnZS5qc29uJywgJ3RzY29uZmlnLmpzb24nXS5tYXAoKG5hbWUpID0+XG4gICAgICAgIHBhdGgucmVzb2x2ZShyb290RGlyUGF0aCwgbmFtZSlcbiAgICAgICksXG4gICAgICAuLi5zdWJEaXJQYXRocy5mbGF0TWFwKChzdWJEaXJQYXRoKSA9PlxuICAgICAgICBbJ3BhY2thZ2UuanNvbicsICd0c2NvbmZpZy5qc29uJ10ubWFwKChuYW1lKSA9PiBwYXRoLnJlc29sdmUoc3ViRGlyUGF0aCwgbmFtZSkpXG4gICAgICApLFxuICAgIF07XG4gICAgY29uc3Qgd3JpdGFibGVSZXN1bHRzID0gYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgICBtYW5hZ2VkRmlsZVBhdGhzLm1hcCgoZmlsZVBhdGgpID0+IGZzVXRpbC5pc0NvbmZpbmVkV3JpdGFibGVQYXRoKGZpbGVQYXRoKSlcbiAgICApO1xuICAgIGlmICh3cml0YWJsZVJlc3VsdHMuaW5jbHVkZXMoZmFsc2UpKSB7XG4gICAgICBjb25zb2xlLmVycm9yKGBTa2lwICR7cm9vdERpclBhdGh9OiBhIG1hbmFnZWQgY29uZmlnIGZpbGUgaXMgYSBzeW1saW5rIG9yIHJlc29sdmVzIG91dHNpZGUgdGhlIHJlcG9zaXRvcnkuYCk7XG4gICAgICBoYXNJbnZhbGlkUGFja2FnZUNvbmZpZyA9IHRydWU7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICBjb25zdCBwcmVmbGlnaHRFcnJvcnMgPSBbcm9vdERpclBhdGgsIC4uLnN1YkRpclBhdGhzXS5mbGF0TWFwKChkaXJQYXRoKSA9PiB7XG4gICAgICBjb25zdCBwYWNrYWdlSnNvblBhdGggPSBwYXRoLnJlc29sdmUoZGlyUGF0aCwgJ3BhY2thZ2UuanNvbicpO1xuICAgICAgaWYgKCFmcy5leGlzdHNTeW5jKHBhY2thZ2VKc29uUGF0aCkpIHJldHVybiBbXTtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHBhY2thZ2VKc29uID0gSlNPTi5wYXJzZShmcy5yZWFkRmlsZVN5bmMocGFja2FnZUpzb25QYXRoLCAndXRmOCcpKSBhcyBQYWNrYWdlQ29uZmlnWydwYWNrYWdlSnNvbiddO1xuICAgICAgICBjb25zdCBlcnJvciA9IGdldFdvcmtlclR5cGVzU2NyaXB0RXJyb3IoeyBwYWNrYWdlSnNvbiB9KTtcbiAgICAgICAgcmV0dXJuIGVycm9yID8gW2Ake2RpclBhdGh9OiAke2Vycm9yfWBdIDogW107XG4gICAgICB9IGNhdGNoIHtcbiAgICAgICAgcmV0dXJuIFtgJHtwYWNrYWdlSnNvblBhdGh9IGlzIGludmFsaWRgXTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICBpZiAocHJlZmxpZ2h0RXJyb3JzLmxlbmd0aCA+IDApIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoYFNraXAgJHtyb290RGlyUGF0aH06XFxuJHtwcmVmbGlnaHRFcnJvcnMuam9pbignXFxuJyl9YCk7XG4gICAgICBoYXNJbnZhbGlkUGFja2FnZUNvbmZpZyA9IHRydWU7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICAvLyBMZXQgZ2V0UGFja2FnZUNvbmZpZyBkZXJpdmUgaXNSb290IGZvciB0aGUgZW50cnkgcGF0aDogYHdiZnkgPHJlcG8+L3BhY2thZ2VzLzxhcHA+YCBpcyBhXG4gICAgLy8gc3VwcG9ydGVkIGludm9jYXRpb24gd2hvc2UgdGFyZ2V0IG11c3Qga2VlcCBpdHMgY2hpbGQgY2xhc3NpZmljYXRpb24sIHNvIGZvcmNpbmdcbiAgICAvLyBgaXNSb290OiB0cnVlYCBoZXJlIHdvdWxkIGFwcGx5IHJvb3Qtb25seSBwcm9jZXNzaW5nIChsZWZ0aG9vayBpbnN0YWxsLCByb290IHRzY29uZmlnLFxuICAgIC8vIEFHRU5UUy5tZCwg4oCmKSB0byBhIHN1YnBhY2thZ2UuXG4gICAgY29uc3Qgcm9vdENvbmZpZyA9IGF3YWl0IGdldFBhY2thZ2VDb25maWcocm9vdERpclBhdGgpO1xuICAgIGlmIChvcHRpb25zLmlzVmVyYm9zZSkge1xuICAgICAgY29uc29sZS5sb2coJ3Jvb3RDb25maWc6Jywgcm9vdENvbmZpZyk7XG4gICAgfVxuICAgIGlmICghcm9vdENvbmZpZykge1xuICAgICAgY29uc29sZS5lcnJvcihgdGhlcmUgaXMgbm8gdmFsaWQgcGFja2FnZS5qc29uIGluICR7cm9vdERpclBhdGh9YCk7XG4gICAgICBoYXNJbnZhbGlkUGFja2FnZUNvbmZpZyA9IHRydWU7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgLy8gRXZlcnkgZGlzY292ZXJlZCB3b3Jrc3BhY2UgKGluY2x1ZGluZyBub24tcGFja2FnZXMvKiBsYXlvdXRzIHN1Y2ggYXMgYXBwcy8qKSBpcyBhIGNoaWxkXG4gICAgLy8gcGFja2FnZTsgdGhlIHBhY2thZ2VzLyogaGV1cmlzdGljIGluc2lkZSBnZXRQYWNrYWdlQ29uZmlnIHdvdWxkIG1pc2NsYXNzaWZ5IGFwcHMvKiBhcyByb290cy5cbiAgICBjb25zdCBudWxsYWJsZVN1YlBhY2thZ2VDb25maWdzID0gYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgICBzdWJEaXJQYXRocy5tYXAoKHN1YkRpclBhdGgpID0+IGdldFBhY2thZ2VDb25maWcoc3ViRGlyUGF0aCwgeyBpc1Jvb3Q6IGZhbHNlIH0pKVxuICAgICk7XG4gICAgY29uc3QgaW52YWxpZFN1YlBhY2thZ2VEaXJQYXRoID0gc3ViRGlyUGF0aHMuZmluZChcbiAgICAgIChzdWJEaXJQYXRoLCBpbmRleCkgPT4gIW51bGxhYmxlU3ViUGFja2FnZUNvbmZpZ3NbaW5kZXhdICYmIGZzLmV4aXN0c1N5bmMocGF0aC5qb2luKHN1YkRpclBhdGgsICdwYWNrYWdlLmpzb24nKSlcbiAgICApO1xuICAgIGlmIChpbnZhbGlkU3ViUGFja2FnZURpclBhdGgpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoYFNraXAgJHtyb290RGlyUGF0aH06ICR7aW52YWxpZFN1YlBhY2thZ2VEaXJQYXRofS9wYWNrYWdlLmpzb24gaXMgaW52YWxpZC5gKTtcbiAgICAgIGhhc0ludmFsaWRQYWNrYWdlQ29uZmlnID0gdHJ1ZTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBjb25zdCBzdWJQYWNrYWdlQ29uZmlncyA9IG51bGxhYmxlU3ViUGFja2FnZUNvbmZpZ3MuZmlsdGVyKChjb25maWcpID0+ICEhY29uZmlnKTtcbiAgICBjb25zdCBhbGxQYWNrYWdlQ29uZmlncyA9IFtyb290Q29uZmlnLCAuLi5zdWJQYWNrYWdlQ29uZmlnc107XG4gICAgLy8gVGhlIG1hbmFnZWQgaWdub3JlIHJ1bGUgaXMgdW5hbmNob3JlZCwgc28gYSBuZXN0ZWQgY29weSAoZS5nLiB3b3JrZXJzL2FwaS8uZW52LmNsb3VkZmxhcmUpIGlzXG4gICAgLy8gYXMgbXVjaCBhIGxlYWsgYXMgYSByb290IG9uZTsgdGhlIHdpbGRjYXJkIHBhdGhzcGVjIGNvdmVycyBldmVyeSBkZXB0aCBpbiBvbmUgcXVlcnkuXG4gICAgY29uc3QgdHJhY2tlZENsb3VkZmxhcmVFbnZQYXRocyA9IGFsbFBhY2thZ2VDb25maWdzLnNvbWUoKGNvbmZpZykgPT4gY29uZmlnLmlzQ2xvdWRmbGFyZSlcbiAgICAgID8gc3Bhd25TeW5jQW5kUmV0dXJuU3Rkb3V0KFxuICAgICAgICAgICdnaXQnLFxuICAgICAgICAgIFsnLWMnLCAnY29yZS5xdW90ZVBhdGg9ZmFsc2UnLCAnbHMtZmlsZXMnLCAnLS0nLCAnLmVudi5jbG91ZGZsYXJlJywgJyovLmVudi5jbG91ZGZsYXJlJ10sXG4gICAgICAgICAgcm9vdENvbmZpZy5kaXJQYXRoXG4gICAgICAgIClcbiAgICAgICAgICAuc3BsaXQoJ1xcbicpXG4gICAgICAgICAgLmZpbHRlcihCb29sZWFuKVxuICAgICAgICAgIC5tYXAoKGZpbGVQYXRoKSA9PiBwYXRoLnJlc29sdmUocm9vdENvbmZpZy5kaXJQYXRoLCBmaWxlUGF0aCkpXG4gICAgICA6IFtdO1xuICAgIGlmICh0cmFja2VkQ2xvdWRmbGFyZUVudlBhdGhzLmxlbmd0aCA+IDApIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICAgIGBTRUNVUklUWSBFUlJPUjogQ2xvdWRmbGFyZSBjcmVkZW50aWFscyBtdXN0IGJlIHVudHJhY2tlZC4gUmVtb3ZlICR7dHJhY2tlZENsb3VkZmxhcmVFbnZQYXRocy5qb2luKFxuICAgICAgICAgICcsICdcbiAgICAgICAgKX0gZnJvbSBHaXQsIHB1cmdlIHRoZSB0b2tlbiBmcm9tIGhpc3RvcnksIGFuZCByb3RhdGUgQ0xPVURGTEFSRV9BUElfVE9LRU4gYmVmb3JlIHJlcnVubmluZyB3YmZ5LmBcbiAgICAgICk7XG4gICAgICBoYXNJbnZhbGlkUGFja2FnZUNvbmZpZyA9IHRydWU7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgY29uc3QgYWJicmV2aWF0aW9uUHJvbWlzZSA9IGZpeFR5cG9zKHJvb3RDb25maWcpO1xuXG4gICAgYXdhaXQgZ2VuZXJhdGVSZXBvc2l0b3J5TnBtcmMoYWxsUGFja2FnZUNvbmZpZ3MpO1xuXG4gICAgaWYgKG9wdGlvbnMuaXNWZXJib3NlKSB7XG4gICAgICBmb3IgKGNvbnN0IGNvbmZpZyBvZiBhbGxQYWNrYWdlQ29uZmlncykge1xuICAgICAgICBjb25zb2xlLmluZm8oY29uZmlnKTtcbiAgICAgIH1cbiAgICB9XG4gICAgYXNzZXJ0U2FmZURlcGVuZGVuY3lTb3VyY2VzKGFsbFBhY2thZ2VDb25maWdzKTtcbiAgICAvLyBNYW5hZ2VkIHJlcG9zaXRvcmllcyB1c2UgQnVuIHdpdGggbWlzZSAoYW5kIG9wdGlvbmFsbHkgZm5veCkuXG4gICAgY29uc3QgcHJldmlvdXNCdW5HbG9iYWxTdG9yZSA9IHJlYWRCdW5HbG9iYWxTdG9yZShyb290RGlyUGF0aCk7XG4gICAgLy8gUm9vdC1sZXZlbCBpbnN0YWxsIGxheW91dCBtdXN0IGNvdmVyIHdvcmtzcGFjZSBhcHBzIHRvbzogTmV4dC5qcyBjb21tb25seSBsaXZlcyB1bmRlclxuICAgIC8vIHBhY2thZ2VzLyogb3IgYXBwcy8qIHdoaWxlIGJ1bmZpZy50b21sIGV4aXN0cyBvbmx5IGF0IHRoZSByZXBvc2l0b3J5IHJvb3QuXG4gICAgY29uc3QgdXNlR2xvYmFsU3RvcmUgPSByZXNvbHZlQnVuR2xvYmFsU3RvcmUoYWxsUGFja2FnZUNvbmZpZ3MsIHByZXZpb3VzQnVuR2xvYmFsU3RvcmUsIHNraXBEZXBzKTtcbiAgICBhd2FpdCBnZW5lcmF0ZUJ1bmZpZ1RvbWwocm9vdENvbmZpZywgdXNlR2xvYmFsU3RvcmUpO1xuICAgIGF3YWl0IGdlbmVyYXRlTWlzZVRvbWwocm9vdENvbmZpZyk7XG4gICAgYXdhaXQgZ2VuZXJhdGVGbm94VG9tbChyb290Q29uZmlnKTtcbiAgICAvLyBSdW4gYWZ0ZXIgZ2VuZXJhdGVGbm94VG9tbCBzbyBpdHMgdHJhbnNhY3Rpb25hbCByZWNpcGllbnQgc3luYyBjYW5ub3QgcmVzdG9yZSBhIHNuYXBzaG90XG4gICAgLy8gb3ZlciBkZWZpbml0aW9ucyBpbnNlcnRlZCBoZXJlLlxuICAgIGF3YWl0IGVuc3VyZVdiRW52RGVmaW5pdGlvbnMocm9vdENvbmZpZywgYWxsUGFja2FnZUNvbmZpZ3MpO1xuICAgIC8vIHByb21pc2VQb29sLnJ1biByZXNvbHZlcyB3aGVuIGEgdGFzayBTVEFSVFMsIHNvIHRoZSBnZW5lcmF0ZWQgYnVuZmlnLnRvbWwgaXMgbm90XG4gICAgLy8gZ3VhcmFudGVlZCB0byBiZSBvbiBkaXNrIHlldDsgdGhlIHByb2JlIGJlbG93IG11c3Qgbm90IHZhbGlkYXRlIGEgc3RhbGUgY29uZmlndXJhdGlvbi5cbiAgICBhd2FpdCBwcm9taXNlUG9vbC5wcm9taXNlQWxsKCk7XG5cbiAgICAvLyBUaGUgbGF5b3V0IG11c3QgYmUgdmVyaWZpZWQgaW5zdGFsbGFibGUgQkVGT1JFIGFueSBgYnVuIGFkZGAgbXV0YXRlcyBwYWNrYWdlLmpzb24gZmlsZXM6XG4gICAgLy8gcGVyLXBhY2thZ2UgaW5zdGFsbHMgdG9sZXJhdGUgZmFpbHVyZXMgKHNwYXduU3luYyBkaXNjYXJkcyB0aGVpciBzdGF0dXMpLCBzbyBhIGxheW91dCB0aGF0XG4gICAgLy8gY2Fubm90IGluc3RhbGwgd291bGQgc2lsZW50bHkgZHJvcCBldmVyeSBtYW5hZ2VkIGRlcGVuZGVuY3kgdXBkYXRlIGZvciB0aGUgcmVzdCBvZiB0aGUgcnVuLlxuICAgIC8vIEEgZG9jcy1vbmx5IHJlcG9zaXRvcnkgaGFzIG5vIG1hbmlmZXN0IHRvIHByb2JlIG9uIGl0cyBmaXJzdCBydW47IGdlbmVyYXRlUGFja2FnZUpzb24gYmVsb3dcbiAgICAvLyBjcmVhdGVzIGl0IGJlZm9yZSB0aGUgYXV0aG9yaXRhdGl2ZSByZWZyZXNoQnVuTG9jayBjaGVjay5cbiAgICBpZiAoXG4gICAgICAhc2tpcERlcHMgJiZcbiAgICAgIHJvb3RDb25maWcuZG9lc0NvbnRhaW5QYWNrYWdlSnNvbiAmJlxuICAgICAgIXByb2JlSXNvbGF0ZWRCdW5JbnN0YWxsKHJvb3REaXJQYXRoLCByb290Q29uZmlnLCBwcmV2aW91c0J1bkdsb2JhbFN0b3JlLCB1c2VHbG9iYWxTdG9yZSlcbiAgICApIHtcbiAgICAgIC8vIHJlZnJlc2hCdW5Mb2NrIGJlbG93IGlzIHRoZSBhdXRob3JpdHkgb24gd2hldGhlciB0aGUgZmluYWwgaW5zdGFsbCBmYWlsZWQuXG4gICAgICBjb25zb2xlLndhcm4oYGJ1biBpbnN0YWxsIGN1cnJlbnRseSBmYWlscyBpbiAke3Jvb3REaXJQYXRofSB1bmRlciB0aGUgaXNvbGF0ZWQgbGlua2VyLmApO1xuICAgIH1cblxuICAgIGNvbnN0IHNob3VsZFJ1bldvcmtmbG93cyA9XG4gICAgICAhaXNSZXVzYWJsZVdvcmtmbG93c1JlcG8ocm9vdENvbmZpZy5yZXBvc2l0b3J5KSAmJlxuICAgICAgKHJvb3RDb25maWcucmVwb3NpdG9yeT8uc3RhcnRzV2l0aCgnZ2l0aHViOldpbGxCb29zdGVyLycpIHx8XG4gICAgICAgIHJvb3RDb25maWcucmVwb3NpdG9yeT8uc3RhcnRzV2l0aCgnZ2l0aHViOldpbGxCb29zdGVyTGFiLycpKTtcbiAgICAvLyBPdGhlciBvd25lcnMgY2Fubm90IGNhbGwgdGhlIG9yZ2FuaXphdGlvbidzIHJldXNhYmxlIHdvcmtmbG93cyAodGhlaXIgc2VjcmV0cyBhbmQgcnVubmVyc1xuICAgIC8vIGRvIG5vdCBleGlzdCB0aGVyZSksIHNvIGFueSBvdGhlciBHaXRIdWItaG9zdGVkIE5vZGUuanMgcmVwb3NpdG9yeSBnZXRzIHNlbGYtY29udGFpbmVkXG4gICAgLy8gd29ya2Zsb3dzIGluc3RlYWQg4oCUIGtleWVkIG9uIHJlcG9zaXRvcnkgc3RhdGUsIG5ldmVyIG9uIHRoZSBvd25lcidzIGlkZW50aXR5LlxuICAgIC8vIHJvb3RDb25maWcuaXNSb290OiBhIGRpcmVjdCB3b3Jrc3BhY2UtY2hpbGQgaW52b2NhdGlvbiAoYHdiZnkgPHJlcG8+L3BhY2thZ2VzLzxhcHA+YCkga2VlcHNcbiAgICAvLyBpc1Jvb3QgZmFsc2UsIGFuZCBHaXRIdWIgaWdub3JlcyB3b3JrZmxvdyBmaWxlcyBuZXN0ZWQgdW5kZXIgYSBwYWNrYWdlIGRpcmVjdG9yeS5cbiAgICBjb25zdCBzaG91bGRSdW5TZWxmQ29udGFpbmVkV29ya2Zsb3dzID1cbiAgICAgICFzaG91bGRSdW5Xb3JrZmxvd3MgJiZcbiAgICAgICFpc1JldXNhYmxlV29ya2Zsb3dzUmVwbyhyb290Q29uZmlnLnJlcG9zaXRvcnkpICYmXG4gICAgICAhIXJvb3RDb25maWcucmVwb3NpdG9yeT8uc3RhcnRzV2l0aCgnZ2l0aHViOicpICYmXG4gICAgICByb290Q29uZmlnLmlzUm9vdDtcbiAgICBhd2FpdCBQcm9taXNlLmFsbChbXG4gICAgICBhYmJyZXZpYXRpb25Qcm9taXNlLnRoZW4oKCkgPT4gZ2VuZXJhdGVSZWFkbWUocm9vdENvbmZpZykpLFxuICAgICAgZ2VuZXJhdGVEb2NrZXJpZ25vcmUocm9vdENvbmZpZyksXG4gICAgICBnZW5lcmF0ZUVkaXRvcmNvbmZpZyhyb290Q29uZmlnKSxcbiAgICAgIGdlbmVyYXRlR2VtaW5pQ29uZmlnKHJvb3RDb25maWcsIGFsbFBhY2thZ2VDb25maWdzKSxcbiAgICAgIGdlbmVyYXRlR2l0YXR0cmlidXRlcyhyb290Q29uZmlnKSxcbiAgICAgIGdlbmVyYXRlR2l0SHViVGVtcGxhdGVzKHJvb3RDb25maWcpLFxuICAgICAgZ2VuZXJhdGVJZGVhU2V0dGluZ3Mocm9vdENvbmZpZyksXG4gICAgICBmaXhSYWlsd2F5aWdub3JlKHJvb3RDb25maWcpLFxuICAgICAgZ2VuZXJhdGVSZW5vdmF0ZUpzb25jKHJvb3RDb25maWcpLFxuICAgICAgZ2VuZXJhdGVSZWxlYXNlcmMocm9vdENvbmZpZyksXG4gICAgICAuLi4oc2hvdWxkUnVuV29ya2Zsb3dzID8gW2dlbmVyYXRlV29ya2Zsb3dzKHJvb3RDb25maWcpXSA6IFtdKSxcbiAgICAgIC4uLihzaG91bGRSdW5TZWxmQ29udGFpbmVkV29ya2Zsb3dzID8gW2dlbmVyYXRlU2VsZkNvbnRhaW5lZFdvcmtmbG93cyhyb290Q29uZmlnLCBhbGxQYWNrYWdlQ29uZmlncyldIDogW10pLFxuICAgICAgc2V0dXBMYWJlbHMocm9vdENvbmZpZyksXG4gICAgICBzZXR1cFJlcG9zaXRvcnlSdWxlc2V0cyhyb290Q29uZmlnKSxcbiAgICAgIHNldHVwR2l0SHViU2V0dGluZ3Mocm9vdENvbmZpZyksXG4gICAgICAvLyBHaXQgaG9va3MgYXJlIHJlcG9zaXRvcnktbGV2ZWwgc3RhdGU6IGEgZGlyZWN0IHdvcmtzcGFjZS1jaGlsZCBpbnZvY2F0aW9uIG11c3Qgbm90IHdyaXRlIGFcbiAgICAgIC8vIGNoaWxkIGxlZnRob29rLnltbCBvciByZXBsYWNlIHRoZSBlbmNsb3NpbmcgcmVwb3NpdG9yeSdzIGhvb2sgaW5zdGFsbGF0aW9uLlxuICAgICAgLi4uKHJvb3RDb25maWcuaXNSb290ID8gW2dlbmVyYXRlTGVmdGhvb2socm9vdENvbmZpZywgYWxsUGFja2FnZUNvbmZpZ3MpXSA6IFtdKSxcbiAgICBdKTtcbiAgICBhd2FpdCBwcm9taXNlUG9vbC5wcm9taXNlQWxsKCk7XG4gICAgLy8gQWZ0ZXIgdGhlIHdvcmtmbG93IGdlbmVyYXRvciAoYW5kIGl0cyBwb29sZWQgd3JpdGVzKSBzbyB0aGUgaW5zdHJ1Y3Rpb24gZmlsZXMgZGVzY3JpYmUgdGhlXG4gICAgLy8gZmluYWxpemVkIHdvcmtmbG93IGZpbGVzIGluc3RlYWQgb2YgbGFnZ2luZyBvbmUgcnVuIGJlaGluZC5cbiAgICBhd2FpdCBnZW5lcmF0ZUFnZW50SW5zdHJ1Y3Rpb25zKHJvb3RDb25maWcsIGFsbFBhY2thZ2VDb25maWdzKTtcbiAgICBhd2FpdCBwcm9taXNlUG9vbC5wcm9taXNlQWxsKCk7XG5cbiAgICBjb25zdCBwcm9taXNlczogUHJvbWlzZTx2b2lkPltdID0gW107XG4gICAgZm9yIChjb25zdCBjb25maWcgb2YgYWxsUGFja2FnZUNvbmZpZ3MpIHtcbiAgICAgIGlmIChjb25maWcuZGVwZW5kaW5nLnBsYXl3cmlnaHRUZXN0KSB7XG4gICAgICAgIHByb21pc2VzLnB1c2goZml4UGxheXdyaWdodENvbmZpZyhjb25maWcpKTtcbiAgICAgIH1cbiAgICAgIGlmIChjb25maWcuZGVwZW5kaW5nLm5leHQpIHtcbiAgICAgICAgcHJvbWlzZXMucHVzaChmaXhOZXh0Q29uZmlnSnNvbihjb25maWcpKTtcbiAgICAgIH1cbiAgICAgIGlmIChjb25maWcuZGVwZW5kaW5nLmNoYWtyYSkge1xuICAgICAgICBwcm9taXNlcy5wdXNoKGZpeENoYWtyYVRvYXN0ZXIoY29uZmlnKSk7XG4gICAgICB9XG4gICAgICBhd2FpdCBnZW5lcmF0ZUdpdGlnbm9yZShjb25maWcsIHJvb3RDb25maWcpO1xuICAgICAgYXdhaXQgcHJvbWlzZVBvb2wucHJvbWlzZUFsbCgpO1xuICAgICAgaWYgKCFjb25maWcuaXNSb290ICYmICFjb25maWcuZG9lc0NvbnRhaW5QYWNrYWdlSnNvbikge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGlmIChkb2VzQ29udGFpbkphdmEoY29uZmlnKSkgYXdhaXQgZ2VuZXJhdGVQcmV0dGllcmlnbm9yZShjb25maWcpO1xuICAgICAgYXdhaXQgZ2VuZXJhdGVQYWNrYWdlSnNvbihjb25maWcsIHJvb3RDb25maWcsIHNraXBEZXBzKTtcblxuICAgICAgaWYgKGNvbmZpZy5kb2VzQ29udGFpblZzY29kZVNldHRpbmdzSnNvbikge1xuICAgICAgICBwcm9taXNlcy5wdXNoKGdlbmVyYXRlVnNjb2RlU2V0dGluZ3MoY29uZmlnKSk7XG4gICAgICB9XG4gICAgICBpZiAoY29uZmlnLmRvZXNDb250YWluVHlwZVNjcmlwdCB8fCBjb25maWcuZG9lc0NvbnRhaW5UeXBlU2NyaXB0SW5QYWNrYWdlcykge1xuICAgICAgICBwcm9taXNlcy5wdXNoKGdlbmVyYXRlVHNjb25maWcoY29uZmlnKSk7XG4gICAgICB9XG4gICAgICBpZiAoZG9lc0NvbnRhaW5Kc09yVHMoY29uZmlnKSkge1xuICAgICAgICBwcm9taXNlcy5wdXNoKGdlbmVyYXRlT3hmbXRDb25maWcoY29uZmlnKSk7XG4gICAgICAgIHByb21pc2VzLnB1c2goZ2VuZXJhdGVPeGxpbnRDb25maWcoY29uZmlnLCByb290Q29uZmlnKSk7XG4gICAgICB9IGVsc2UgaWYgKCFjb25maWcuaXNSb290ICYmIGNvbmZpZy5kb2VzQ29udGFpblBhY2thZ2VKc29uICYmIGRvZXNDb250YWluSnNPclRzKHJvb3RDb25maWcpKSB7XG4gICAgICAgIC8vIE1vbm9yZXBvIHZlcmlmaWNhdGlvbiBjYW4gaW52b2tlIG94bGludCBmcm9tIGV2ZXJ5IHdvcmtzcGFjZS4gR2l2ZVxuICAgICAgICAvLyBub24tY29kZSBwYWNrYWdlcyBhIGxvY2FsIGNvbmZpZyBzbyBveGxpbnQgZG9lcyBub3QgY2xpbWIgdG8gdGhlXG4gICAgICAgIC8vIHJvb3QgY29uZmlnIGFuZCByZWplY3Qgcm9vdC1vbmx5IHR5cGUtYXdhcmUgb3B0aW9ucyBmcm9tIGEgcGFja2FnZSBjd2QuXG4gICAgICAgIHByb21pc2VzLnB1c2goZ2VuZXJhdGVPeGxpbnRDb25maWcoY29uZmlnLCByb290Q29uZmlnKSk7XG4gICAgICB9XG4gICAgICBpZiAoY29uZmlnLmRlcGVuZGluZy5weXJpZ2h0KSB7XG4gICAgICAgIHByb21pc2VzLnB1c2goZ2VuZXJhdGVQeXJpZ2h0Q29uZmlnSnNvbihjb25maWcpKTtcbiAgICAgIH1cbiAgICB9XG4gICAgYXdhaXQgUHJvbWlzZS5hbGwocHJvbWlzZXMpO1xuICAgIGF3YWl0IHByb21pc2VQb29sLnByb21pc2VBbGwoKTtcbiAgICAvLyBSdW4gYWZ0ZXIgZXZlcnkgcG9vbGVkIGdlbmVyYXRvciB3cml0ZSBzbyBub3JtYWxpemF0aW9uIGNhbm5vdCBvdmVyd3JpdGUgYSBjb25jdXJyZW50XG4gICAgLy8gdXBkYXRlLCBhbmQgYmVmb3JlIGNsZWFudXAgc28gZm9ybWF0dGVyIG1ldGFkYXRhIGNhY2hlcyBvYnNlcnZlIHRoZSBjaGFuZ2VkIGZpbGVzLlxuICAgIHJlbm9ybWFsaXplVHJhY2tlZFRleHRGaWxlcyhyb290RGlyUGF0aCk7XG4gICAgLy8gUmVmcmVzaCBsb2NrIGZpbGVzXG4gICAgdHJ5IHtcbiAgICAgIHJlZnJlc2hCdW5Mb2NrKHJvb3REaXJQYXRoKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgLy8gQSBmYWlsZWQgaW5zdGFsbCBtdXN0IGZhaWwgdGhlIENMSTogZXhpdGluZyAwIHdpdGggYSBzdGFsZSBvciBtaXNzaW5nIEJ1biBsb2NrZmlsZSB3b3VsZFxuICAgICAgLy8gaGlkZSBhIGJyb2tlbiBtYW5hZ2VkIGNvbmZpZ3VyYXRpb24uXG4gICAgICBjb25zb2xlLmVycm9yKCdGYWlsZWQgdG8gcmVmcmVzaCB0aGUgQnVuIGxvY2tmaWxlOicsIChlcnJvciBhcyBFcnJvciB8IHVuZGVmaW5lZCk/Lm1lc3NhZ2UgPz8gZXJyb3IpO1xuICAgICAgaGFzSW52YWxpZFBhY2thZ2VDb25maWcgPSB0cnVlO1xuICAgIH1cbiAgICB0cnkge1xuICAgICAgLy8gQnVuIHdyaXRlcyBidW4ubG9jayBiZWZvcmUgbGlmZWN5Y2xlIHNjcmlwdHMsIHNvIGEgZmFpbGVkIGluc3RhbGwgY2FuIHN0aWxsIGxlYXZlIEd1YXJkXG4gICAgICAvLyBVUkxzIGJlaGluZC4gTm9ybWFsaXplIGJvdGggc3VjY2VzcyBhbmQgZmFpbHVyZSBvdXRwdXQgd2l0aG91dCByZXBsYWNpbmcgdGhlIGluc3RhbGwgZXJyb3IuXG4gICAgICBjb25zdCBub3JtYWxpemVkTG9ja2ZpbGVQYXRoID0gbm9ybWFsaXplQnVuTG9ja2ZpbGUocm9vdERpclBhdGgpO1xuICAgICAgaWYgKG5vcm1hbGl6ZWRMb2NrZmlsZVBhdGgpIHtcbiAgICAgICAgY29uc29sZS5pbmZvKGBSZW1vdmVkIFRha3VtaSBHdWFyZCBwcm94eSBVUkxzIGZyb20gJHtub3JtYWxpemVkTG9ja2ZpbGVQYXRofSB0byBrZWVwIGl0IHJlZ2lzdHJ5LWFnbm9zdGljLmApO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBjb25zb2xlLmVycm9yKCdGYWlsZWQgdG8gbm9ybWFsaXplIHRoZSBCdW4gbG9ja2ZpbGU6JywgKGVycm9yIGFzIEVycm9yIHwgdW5kZWZpbmVkKT8ubWVzc2FnZSA/PyBlcnJvcik7XG4gICAgICBoYXNJbnZhbGlkUGFja2FnZUNvbmZpZyA9IHRydWU7XG4gICAgfVxuICAgIHNwYXduU3luYygnYnVuJywgWydjbGVhbnVwJ10sIHJvb3REaXJQYXRoKTtcbiAgfVxuICByZXR1cm4gaGFzSW52YWxpZFBhY2thZ2VDb25maWc7XG59XG5cbi8qKlxuICogUHJvYmVzIGBidW4gaW5zdGFsbGAgdW5kZXIgdGhlIGlzb2xhdGVkIGxpbmtlci4gQW4gaW5jb21wYXRpYmlsaXR5IG11c3QgYmUgZml4ZWQgaW4gdGhlXG4gKiByZXBvc2l0b3J5IG9yIGluIHdiZnkncyBtYW5hZ2VkIGxpc3RzLCBuZXZlciBieSBzd2l0Y2hpbmcgdGhlIGxpbmtlci4gUmV0dXJucyBmYWxzZSB3aGVuIHRoZVxuICogaW5zdGFsbCBmYWlscy5cbiAqL1xuZnVuY3Rpb24gcHJvYmVJc29sYXRlZEJ1bkluc3RhbGwoXG4gIHJvb3REaXJQYXRoOiBzdHJpbmcsXG4gIHJvb3RDb25maWc6IFBhY2thZ2VDb25maWcsXG4gIHByZXZpb3VzR2xvYmFsU3RvcmU6IGJvb2xlYW4gfCB1bmRlZmluZWQsXG4gIHVzZUdsb2JhbFN0b3JlOiBib29sZWFuXG4pOiBib29sZWFuIHtcbiAgLy8gQSBsYXlvdXQgc3dpdGNoIG11c3QgcHJvYmUgZnJvbSBhIGNsZWFuIHRyZWUgYmVjYXVzZSBCdW4gZG9lcyBub3QgcmVtb3ZlIHRoZSBwcmV2aW91cyBsYXlvdXQncyBsZWZ0b3ZlcnMuXG4gIGlmIChwcmV2aW91c0dsb2JhbFN0b3JlICE9PSB1c2VHbG9iYWxTdG9yZSkge1xuICAgIHJlbW92ZU5vZGVNb2R1bGVzKHJvb3REaXJQYXRoLCByb290Q29uZmlnKTtcbiAgfVxuICAvLyBSZXRyeSBvbmNlIHNvIGEgdHJhbnNpZW50IGZhaWx1cmUgKHJlZ2lzdHJ5IGhpY2N1cCwgZmxha3kgbGlmZWN5Y2xlIHNjcmlwdCkgZG9lcyBub3RcbiAgLy8gbWFzcXVlcmFkZSBhcyBhIGxheW91dCBpbmNvbXBhdGliaWxpdHkuXG4gIGlmIChzcGF3blN5bmNBbmRSZXR1cm5TdGF0dXMoJ2J1bicsIFsnaW5zdGFsbCddLCByb290RGlyUGF0aCwgMSkgPT09IDApIHJldHVybiB0cnVlO1xuXG4gIC8vIENsZWFuIHVwIHRoZSBmYWlsZWQgYXR0ZW1wdCBzbyBsYXRlciBpbnN0YWxscyBkbyBub3QgcnVuIG9uIGEgcG9sbHV0ZWQgdHJlZS5cbiAgcmVtb3ZlTm9kZU1vZHVsZXMocm9vdERpclBhdGgsIHJvb3RDb25maWcpO1xuICByZXR1cm4gZmFsc2U7XG59XG5cbmZ1bmN0aW9uIHJlbW92ZU5vZGVNb2R1bGVzKHJvb3REaXJQYXRoOiBzdHJpbmcsIHJvb3RDb25maWc6IFBhY2thZ2VDb25maWcpOiB2b2lkIHtcbiAgLy8gQ292ZXIgZXZlcnkgZGVjbGFyZWQgd29ya3NwYWNlOiBsZWZ0b3ZlcnMgY2FuIGtlZXAgcGhhbnRvbSBkZXBlbmRlbmNpZXMgcmVzb2x2YWJsZS5cbiAgY29uc3Qgbm9kZU1vZHVsZXNQYXRocyA9IFtcbiAgICBwYXRoLnJlc29sdmUocm9vdERpclBhdGgsICdub2RlX21vZHVsZXMnKSxcbiAgICAuLi5bLi4uZ2V0V29ya3NwYWNlUGFja2FnZURpcnMocm9vdENvbmZpZykudmFsdWVzKCldLm1hcCgod29ya3NwYWNlRGlyKSA9PlxuICAgICAgcGF0aC5yZXNvbHZlKHJvb3REaXJQYXRoLCB3b3Jrc3BhY2VEaXIsICdub2RlX21vZHVsZXMnKVxuICAgICksXG4gIF07XG4gIC8vIE5ldmVyIGRlbGV0ZSB0aHJvdWdoIGEgd29ya3NwYWNlIHN5bWxpbmsgdGhhdCBlc2NhcGVzIHRoaXMgcmVwb3NpdG9yeS5cbiAgY29uc3QgcmVhbFJvb3REaXJQYXRoID0gZnMucmVhbHBhdGhTeW5jKHJvb3REaXJQYXRoKTtcbiAgZm9yIChjb25zdCBub2RlTW9kdWxlc1BhdGggb2Ygbm9kZU1vZHVsZXNQYXRocykge1xuICAgIGNvbnN0IHJlYWxQYXJlbnREaXJQYXRoID0gaWdub3JlRXJyb3IoKCkgPT4gZnMucmVhbHBhdGhTeW5jKHBhdGguZGlybmFtZShub2RlTW9kdWxlc1BhdGgpKSk7XG4gICAgaWYgKFxuICAgICAgIXJlYWxQYXJlbnREaXJQYXRoIHx8XG4gICAgICAocmVhbFBhcmVudERpclBhdGggIT09IHJlYWxSb290RGlyUGF0aCAmJiAhcmVhbFBhcmVudERpclBhdGguc3RhcnRzV2l0aChyZWFsUm9vdERpclBhdGggKyBwYXRoLnNlcCkpXG4gICAgKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgZnMucm1TeW5jKG5vZGVNb2R1bGVzUGF0aCwgeyByZWN1cnNpdmU6IHRydWUsIGZvcmNlOiB0cnVlIH0pO1xuICB9XG59XG5cbmZ1bmN0aW9uIHJlZnJlc2hCdW5Mb2NrKHJvb3REaXJQYXRoOiBzdHJpbmcpOiB2b2lkIHtcbiAgLy8gd2JmeSBzaG91bGQgdXBkYXRlIG9ubHkgdGhlIHBhY2thZ2VzIGl0IGV4cGxpY2l0bHkgbWFuYWdlcyB0aHJvdWdoIGJ1biBhZGQuXG4gIC8vIFJ1bm5pbmcgYnVuIHVwZGF0ZSBoZXJlIHJlZnJlc2hlcyB1bnJlbGF0ZWQgYXBwbGljYXRpb24gZGVwZW5kZW5jaWVzIGFuZFxuICAvLyBjYW4gY2hhbmdlIHByb2R1Y3QgYmVoYXZpb3IsIHNvIGtlZXAgdGhlIGV4aXN0aW5nIGxvY2sgYW5kIHJlY29uY2lsZSBpdC5cbiAgY29uc3Qgc3RhdHVzID0gc3Bhd25TeW5jQW5kUmV0dXJuU3RhdHVzKCdidW4nLCBbJ2luc3RhbGwnXSwgcm9vdERpclBhdGgsIDEpO1xuICBpZiAoc3RhdHVzID09PSAwKSByZXR1cm47XG4gIHRocm93IG5ldyBFcnJvcihgRmFpbGVkIHRvIHJlZnJlc2ggQnVuIGxvY2tmaWxlOiBidW4gaW5zdGFsbCBleGl0ZWQgd2l0aCBzdGF0dXMgJHtzdGF0dXN9YCk7XG59XG5cbmF3YWl0IG1haW4oKTtcbiJdLCJ4X2dvb2dsZV9pZ25vcmVMaXN0IjpbNDUsNDYsNDcsNDgsNDksNTBdLCJtYXBwaW5ncyI6Iit5QkFXQSxNQUFhLEdBQW9ELENBQy9ELENBQ0UsUUFBUyxNQUNULFlBQWEsc0dBQ2YsRUFDQSxDQUNFLFFBQVMsZUFDVCxZQUNFLDZjQUNKLEVBQ0EsQ0FDRSxRQUFTLG1CQUNULFlBQ0UsNEdBQ0osRUFDQSxDQUNFLFFBQVMsb0JBQ1QsWUFDRSx5S0FDSixFQUNBLENBQ0UsUUFBUyxVQUNULFlBQWEsK0RBQ2YsRUFDQSxDQUNFLFFBQVMsUUFDVCxZQUFhLHNHQUNmLENBQ0YsRUFvQ2EsRUFBaUQsQ0FDNUQsQ0FBRSxRQUFTLFVBQVcsWUFBYSw4Q0FBK0MsRUFDbEYsQ0FBRSxRQUFTLFdBQVksWUFBYSw2Q0FBOEMsRUFDbEYsQ0FBRSxRQUFTLFNBQVUsWUFBYSx3Q0FBeUMsRUFDM0UsQ0FBRSxRQUFTLFdBQVksWUFBYSx1REFBd0QsQ0FDOUYsRUFRYSxHQUFvRCxDQUMvRCxDQUNFLFFBQVMsc0JBQ1QsWUFBYSx3RUFDZixFQUNBLENBQ0UsUUFBUyxXQUNULFlBQ0Usa05BQ0osRUFDQSxDQUNFLFFBQVMsc0JBQ1QsWUFDRSx3R0FDSixFQUNBLENBQ0UsUUFB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