@willbooster/wbfy 20.10.1 → 20.10.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.js +2 -2
- package/package.json +2 -2
package/dist/index.js
CHANGED
|
@@ -59,7 +59,7 @@ alwaysApply: true
|
|
|
59
59
|
- Continue modifying tests and/or code until all tests pass.
|
|
60
60
|
- When fixing issues (including test failures), investigate the root cause first (e.g., via debug logs or screenshots) and fix it instead of applying workarounds.
|
|
61
61
|
- After making changes, run \`bun run verify\` (type checking and linting; up to 10 minutes), or \`bun run verify-full\` (all tests; up to 1 hour) if you changed runtime behavior or tests. Fix errors and re-run until it passes.
|
|
62
|
-
-
|
|
62
|
+
- Run verification normally and wait for completion without restarting it. Prefer completion notifications; otherwise use the longest permitted wait. No output does not mean the command has stopped. If the displayed excerpt is insufficient, read the indicated log file before rerunning verification. If the environment kills long-running commands, use detached execution with a saved log and exit status.
|
|
63
63
|
- Once verified, commit and push to the current (non-main) branch, and create a PR via \`gh\` if none exists for the branch.
|
|
64
64
|
- Follow the Conventional Commits format (e.g., \`feat:\`, \`fix:\`).${g}
|
|
65
65
|
- Always create new commits; avoid \`--amend\`.${_}${v}
|
|
@@ -499,4 +499,4 @@ ${se(oe)}
|
|
|
499
499
|
`);throw Error(`Disallowed Git dependency sources found.\nOnly WillBooster and WillBoosterLab GitHub dependencies are allowed.\n${r}`)}function Hl(e){let t=e.packageJson;if(!t)return[];let n=[];for(let r of Rl){let i=t[r];if(i)for(let[t,a]of Object.entries(i))a&&Ul(a)&&(Gl(a)||n.push({dependencyName:t,dirPath:e.dirPath,sectionName:r,specifier:a}))}return n}function Ul(e){return Wl(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 Wl(e){return/^[a-zA-Z0-9][\w.-]*\/[\w.-]+(?:#\S+)?$/u.test(e)}function Gl(e){return Bl.some(t=>t.test(e))}const Kl=`apply-release-age-gate`,ql=`generate-user-agent-configs`;async function Jl(){let e=await o(process.argv.slice(2)).command(Kl,`Apply only the organization's minimum-release-age policy to this machine's global package-manager configs`).command(ql,`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(ui()).strict().argv;if(T.isVerbose=e.verbose,e._[0]===Kl){Ti()||(process.exitCode=1);return}if(e._[0]===ql){await Xc()||(process.exitCode=1);return}let t=!1;try{t=await Yl(e.paths,e.skipDeps,e.force)}finally{await Oe()}t&&(process.exitCode=1)}async function Yl(n,r,i){Ti();let a=Bun.version;if(Bun.semver.order(a,`1.4.0`)<0)return console.error(`wbfy requires Bun >= ${yl} (found ${a}). Upgrade Bun and re-run.`),!0;let o=fi(),s=!i&&o&&!o.endsWith(`-dirty-local`)?o:void 0,c=!1;for(let i of n){let n=t.resolve(i);if(O.setRootDirPath(e.existsSync(n)?n:void 0),!xl(n)){console.error(`Skip ${n}: mise.toml must pin Bun to one exact version >= ${yl} or omit it. Update the pin and re-run.`),c=!0;continue}if(s&&await Xs(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 le(()=>e.promises.readdir(a,{withFileTypes:!0}))??[]).filter(e=>e.isDirectory()).map(e=>t.resolve(a,e.name)),l=Gt({dirPath:n,packageJson:C(()=>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=>O.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=Qn({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(`
|
|
500
500
|
`)}`),c=!0;continue}let p=await Xn(n);if(T.isVerbose,!p){console.error(`there is no valid package.json in ${n}`),c=!0;continue}let m=await Promise.all(u.map(e=>Xn(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)?L(`git`,[`-c`,`core.quotePath=false`,`ls-files`,`--`,`.env.cloudflare`,`*/.env.cloudflare`],p.dirPath).split(`
|
|
501
501
|
`).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=xn(p);if(await Tl(g),T.isVerbose)for(let e of g)console.info(e);Vl(g);let y=Ir(n),ee=Lr(g,y,r);await zr(p,ee),await bl(p),await dt(p),await nl(p,g),await k.promiseAll(),!r&&p.doesContainPackageJson&&!Xl(n,p,y,ee)&&console.warn(`bun install currently fails in ${n} under the isolated linker.`);let b=!on(p.repository)&&(p.repository?.startsWith(`github:WillBooster/`)||p.repository?.startsWith(`github:WillBoosterLab/`)),te=!b&&!on(p.repository)&&!!p.repository?.startsWith(`github:`)&&p.isRoot;await Promise.all([v.then(()=>Zs(p)),Xr(p),Qr(p),ti(p,g),ri(p),Ll(p),Di(p),Ws(p),_c(p),pc(p),...b?[an(p)]:[],...te?[ul(p,g)]:[],Dl(p),jl(p),Fl(p),...p.isRoot?[ys(p,g)]:[]]),await k.promiseAll(),await Tr(p,g),await k.promiseAll();let x=[];for(let e of g)e.depending.playwrightTest&&x.push(Ue(e)),e.depending.next&&x.push(je(e)),e.depending.chakra&&x.push(Re(e)),await oi(e,p),await k.promiseAll(),!(!e.isRoot&&!e.doesContainPackageJson)&&(Ei(e)&&await Vs(e),await Ua(e,p,r),e.doesContainVscodeSettingsJson&&x.push($c(e)),(e.doesContainTypeScript||e.doesContainTypeScriptInPackages)&&x.push(xc(e)),V(e)?(x.push(Fs(e)),x.push(Rs(e,p))):!e.isRoot&&e.doesContainPackageJson&&V(p)&&x.push(Rs(e,p)),e.depending.pyright&&x.push(Us(e)));await Promise.all(x),await k.promiseAll(),ii(n);try{Ql(n)}catch(e){console.error(`Failed to refresh the Bun lockfile:`,e?.message??e),c=!0}try{let e=ye(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}Un(`bun`,[`cleanup`],n)}return c}function Xl(e,t,n,r){return n!==r&&Zl(e,t),Wn(`bun`,[`install`],e,1)===0||(Zl(e,t),!1)}function Zl(n,r){let i=[t.resolve(n,`node_modules`),...[...Ho(r).values()].map(e=>t.resolve(n,e,`node_modules`))],a=e.realpathSync(n);for(let n of i){let r=C(()=>e.realpathSync(t.dirname(n)));!r||r!==a&&!r.startsWith(a+t.sep)||e.rmSync(n,{recursive:!0,force:!0})}}function Ql(e){let t=Wn(`bun`,[`install`],e,1);if(t!==0)throw Error(`Failed to refresh Bun lockfile: bun install exited with status ${t}`)}await Jl();
|
|
502
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJuYW1lcyI6WyJmcyIsInBhcnNlSnNvbmMiLCJmc3AiLCJyZWxlYXNlQWdlR2F0ZS5kYXlzIiwicmVsZWFzZUFnZUdhdGUuZXhjbHVkZXMiLCJuZXdDb250ZW50IiwiY29tbW9uQ29udGVudCIsIm5ld0NvbnRlbnQiLCJjaGlsZF9wcm9jZXNzIiwiY29tbW9uQ29udGVudCIsImNoaWxkX3Byb2Nlc3MiLCJzb3J0T2JqZWN0S2V5cyIsImdpdEhvb2tzIiwiZGV0ZWN0TmV3bGluZSIsImRlcGVuZGVuY3lTZWN0aW9uS2V5cyIsImNvcmUiLCJtYW5hZ2VkQ29uZmlnQmxvY2tzIiwiZ2V0Q29uZmlnQ29udGVudCJdLCJzb3VyY2VzIjpbIi4uLy4uL3NoYXJlZC1saWIvc3JjL2dpdGh1YlRlbXBsYXRlcy50cyIsIi4uLy4uL3NoYXJlZC1saWIvc3JjL3NsZWVwLnRzIiwiLi4vLi4vc2hhcmVkLWxpYi9zcmMvZXJyb3IudHMiLCIuLi8uLi9zaGFyZWQtbGliLW5vZGUvc3JjL2J1bldvcmtzcGFjZXMudHMiLCIuLi8uLi9zaGFyZWQtbGliLW5vZGUvc3JjL2J1bkxvY2tmaWxlLnRzIiwiLi4vLi4vc2hhcmVkLWxpYi1ub2RlL3NyYy9kb2NrZXJmaWxlLnRzIiwiLi4vLi4vc2hhcmVkLWxpYi1ub2RlL3NyYy9nbG9iLnRzIiwiLi4vc3JjL29wdGlvbnMudHMiLCIuLi9zcmMvbG9nZ2VyLnRzIiwiLi4vc3JjL3V0aWxzL2ZzVXRpbC50cyIsIi4uL3NyYy91dGlscy9wcm9taXNlUG9vbC50cyIsIi4uL3NyYy91dGlscy90eXBlc2NyaXB0QXBpLnRzIiwiLi4vc3JjL2ZpeGVycy9uZXh0Q29uZmlnLnRzIiwiLi4vc3JjL2ZpeGVycy9jaGFrcmFUb2FzdGVyLnRzIiwiLi4vc3JjL2ZpeGVycy9wbGF5d3JpZ2h0Q29uZmlnLnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvZm5veFRvbWwudHMiLCIuLi9zcmMvdXRpbHMvbWVyZ2VVdGlsLnRzIiwiLi4vc3JjL3V0aWxzL29iamVjdFV0aWwudHMiLCIuLi9zcmMvdXRpbHMvd29ya3NwYWNlVXRpbC50cyIsIi4uL3NyYy91dGlscy9wcml2YXRlUGFja2FnZXMudHMiLCIuLi9zcmMvZ2VuZXJhdG9ycy93b3JrZmxvdy50cyIsIi4uL3NyYy9maXhlcnMvdHlwb3MudHMiLCIuLi9zcmMvdXRpbHMvZ2l0aHViVXRpbC50cyIsIi4uL3NyYy91dGlscy9qc29uY1V0aWwudHMiLCIuLi9zcmMvdXRpbHMvbWFuYWdlZFNjcmlwdFNlZ21lbnQudHMiLCIuLi9zcmMvdXRpbHMvc3Bhd25VdGlsLnRzIiwiLi4vc3JjL3V0aWxzL3N0cmluZ1V0aWwudHMiLCIuLi9zcmMvcGFja2FnZUNvbmZpZy50cyIsIi4uL3NyYy9nZW5lcmF0b3JzL2FnZW50cy50cyIsIi4uL2NvbmZpZ3MvcmVsZWFzZUFnZUdhdGUuanNvbiIsIi4uL3NyYy9nZW5lcmF0b3JzL2J1bmZpZy50cyIsIi4uL3NyYy91dGlscy9pZ25vcmVGaWxlVXRpbC50cyIsIi4uL3NyYy9nZW5lcmF0b3JzL2RvY2tlcmlnbm9yZS50cyIsIi4uL3NyYy91dGlscy9leHRlbnNpb25zLnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvZWRpdG9yY29uZmlnLnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvZ2VtaW5pQ29uZmlnLnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvZ2l0YXR0cmlidXRlcy50cyIsIi4uL3NyYy9nZW5lcmF0b3JzL2dpdGlnbm9yZS50cyIsIi4uL3NyYy91dGlscy92ZXJzaW9uLnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvZ2xvYmFsUmVsZWFzZUFnZUdhdGUudHMiLCIuLi9zcmMvdXRpbHMvcGFja2FnZUNhcGFiaWxpdGllcy50cyIsIi4uL3NyYy9nZW5lcmF0b3JzL2lkZWEudHMiLCIuLi9zcmMvdXRpbHMvZ2VuSTE4blRzLnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLmJ1bi9pbnN0YWxsL2NhY2hlL2xpbmtzL3NvcnQtb2JqZWN0LWtleXNAMi4xLjAtMThkZjJmODM3ZTZlYzI5YS9ub2RlX21vZHVsZXMvc29ydC1vYmplY3Qta2V5cy9pbmRleC5qcyIsIi4uLy4uLy4uLy4uLy4uLy4uLy5idW4vaW5zdGFsbC9jYWNoZS9saW5rcy9kZXRlY3QtaW5kZW50QDcuMC4yLTZiNzVkYzBmNTY1MzNiZDkvbm9kZV9tb2R1bGVzL2RldGVjdC1pbmRlbnQvaW5kZXguanMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uYnVuL2luc3RhbGwvY2FjaGUvbGlua3MvZGV0ZWN0LW5ld2xpbmVANC4wLjEtNWRhOWRmNjUxMjVlZTc5NS9ub2RlX21vZHVsZXMvZGV0ZWN0LW5ld2xpbmUvaW5kZXguanMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uYnVuL2luc3RhbGwvY2FjaGUvbGlua3MvZ2l0LWhvb2tzLWxpc3RANC4yLjEtNmNhMmIyNjlkOTE2MzMyZS9ub2RlX21vZHVsZXMvZ2l0LWhvb2tzLWxpc3QvaW5kZXguanNvbiIsIi4uLy4uLy4uLy4uLy4uLy4uLy5idW4vaW5zdGFsbC9jYWNoZS9saW5rcy9pcy1wbGFpbi1vYmpANC4xLjAtNDdmZGRkNzcwNjQ4ZTU3Ny9ub2RlX21vZHVsZXMvaXMtcGxhaW4tb2JqL2luZGV4LmpzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLmJ1bi9pbnN0YWxsL2NhY2hlL2xpbmtzL3NvcnQtcGFja2FnZS1qc29uQDQuMC4wLTYzNTFiOTJmODI2MTU2ZjQvbm9kZV9tb2R1bGVzL3NvcnQtcGFja2FnZS1qc29uL2luZGV4LmpzIiwiLi4vc3JjL2dpdGh1Yi9jb21taXQudHMiLCIuLi9zcmMvdXRpbHMvdHNjb25maWdCYXNlLnRzIiwiLi4vc3JjL3V0aWxzL3dpbGxib29zdGVyQ29uZmlnc1V0aWwudHMiLCIuLi9zcmMvZ2VuZXJhdG9ycy9wYWNrYWdlSnNvbi50cyIsIi4uL3NyYy9nZW5lcmF0b3JzL2xlZnRob29rLnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvY29uZmlnQ29udGVudC50cyIsIi4uL3NyYy9nZW5lcmF0b3JzL21hbmFnZWRDb25maWdCbG9jay50cyIsIi4uL3NyYy9nZW5lcmF0b3JzL294Zm10Q29uZmlnLnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvb3hsaW50Q29uZmlnLnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvcHJldHRpZXJpZ25vcmUudHMiLCIuLi9zcmMvZ2VuZXJhdG9ycy9weXJpZ2h0Q29uZmlnLnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvcmFpbHdheWlnbm9yZS50cyIsIi4uL3NyYy9nZW5lcmF0b3JzL3JlYWRtZS50cyIsIi4uL3NyYy9nZW5lcmF0b3JzL3JlbGVhc2VyYy50cyIsIi4uL3NyYy9nZW5lcmF0b3JzL3Jlbm92YXRlSnNvbmMudHMiLCIuLi9zcmMvZ2VuZXJhdG9ycy90c2NvbmZpZy50cyIsIi4uL3NyYy9nZW5lcmF0b3JzL3VzZXJBZ2VudENvbmZpZ3MudHMiLCIuLi9zcmMvZ2VuZXJhdG9ycy92c2NvZGVTZXR0aW5ncy50cyIsIi4uL3NyYy9nZW5lcmF0b3JzL3diRW52LnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvc2VsZkNvbnRhaW5lZFdvcmtmbG93LnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvbWlzZVRvbWwudHMiLCIuLi9zcmMvZ2VuZXJhdG9ycy9ucG1yYy50cyIsIi4uL3NyYy9naXRodWIvbGFiZWwudHMiLCIuLi9zcmMvZ2l0aHViL3J1bGVzZXQudHMiLCIuLi9zcmMvZ2l0aHViL3NldHRpbmdzLnRzIiwiLi4vc3JjL2dpdGh1Yi90ZW1wbGF0ZS50cyIsIi4uL3NyYy91dGlscy9kZXBlbmRlbmN5U291cmNlUG9saWN5LnRzIiwiLi4vc3JjL2luZGV4LnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQSBzZWN0aW9uIG9mIGEgUFIgb3IgaXNzdWUgYm9keTogaXRzIGhlYWRpbmcgYW5kIHdoYXQgdGhlIHNlY3Rpb24gbXVzdCBzdGF0ZS4gYHJlcXVpcmVtZW50YFxuICogc3RhcnRzIGxvd2VyY2FzZSBhbmQgZW5kcyB3aXRob3V0IHB1bmN0dWF0aW9uLCBzbyB0aGF0IGl0IHJlYWRzIGJvdGggYXMgYSBwbGFjZWhvbGRlciBzZW50ZW5jZVxuICogKGNhcGl0YWxpemVkLCB3aXRoIGEgcGVyaW9kIGFwcGVuZGVkKSBhbmQgYXMgYSBjaGVja2xpc3QgY2xhdXNlIGFmdGVyIHRoZSBoZWFkaW5nLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFRlbXBsYXRlU2VjdGlvbiB7XG4gIHJlYWRvbmx5IGhlYWRpbmc6IHN0cmluZztcbiAgcmVhZG9ubHkgcmVxdWlyZW1lbnQ6IHN0cmluZztcbn1cblxuLyoqIFNlY3Rpb25zIG9mIGEgcHVsbCByZXF1ZXN0IGJvZHksIGluIHRoZSBvcmRlciB0aGV5IGFwcGVhciBpbiB0aGUgUFIgdGVtcGxhdGUuICovXG5leHBvcnQgY29uc3QgUFVMTF9SRVFVRVNUX1NFQ1RJT05TOiByZWFkb25seSBUZW1wbGF0ZVNlY3Rpb25bXSA9IFtcbiAge1xuICAgIGhlYWRpbmc6ICdXaHknLFxuICAgIHJlcXVpcmVtZW50OiAndGhlIHByb2JsZW0sIHdpdGggdGhlIG51bWJlcnMgb3Igb2JzZXJ2YXRpb25zIGJlaGluZCBpdCwgYW5kIHdoeSB0aGlzIGFwcHJvYWNoIG92ZXIgdGhlIGFsdGVybmF0aXZlcycsXG4gIH0sXG4gIHtcbiAgICBoZWFkaW5nOiAnQ3VzdG9tZXIgU3VtbWFyeScsXG4gICAgcmVxdWlyZW1lbnQ6XG4gICAgICAnYmVoYXZpb3IsIHdvcmtmbG93LCBvciB1c2VyLXZpc2libGUgY2hhbmdlcywgd3JpdHRlbiBmb3IgcmVhZGVycyB3aG8ga25vdyBub3RoaW5nIGFib3V0IHRoZSBpbXBsZW1lbnRhdGlvbicsXG4gIH0sXG4gIHtcbiAgICBoZWFkaW5nOiAnVGVjaG5pY2FsIFN1bW1hcnknLFxuICAgIHJlcXVpcmVtZW50OlxuICAgICAgJ2RlY2lzaW9ucyBhbmQgdGhlaXIgcmVhc29ucywgZGF0YSBmbG93LCB3aGVyZSB0byBsb29rICh0aGUgZmlsZXMgdGhhdCBtYXR0ZXIgbW9zdCksIGFuZCB3aGF0IHRvIGNoZWNrIGhhcmRlc3Q6IHRoZSBwYXJ0cyB3aG9zZSBjb3JyZWN0bmVzcyBpcyBhcmd1ZWQgcmF0aGVyIHRoYW4gcHJvdmVuJyxcbiAgfSxcbiAge1xuICAgIGhlYWRpbmc6ICdUZXN0aW5nJyxcbiAgICByZXF1aXJlbWVudDogJ2NvbW1hbmRzIHJ1biwgdGVzdHMgYWRkZWQsIGFuZCB3aGF0IHdhcyBOT1QgZXhlcmNpc2VkIGFuZCB3aHknLFxuICB9LFxuICB7XG4gICAgaGVhZGluZzogJ05vdGVzJyxcbiAgICByZXF1aXJlbWVudDogJ2tub3duIGxpbWl0YXRpb25zLCBjb21wYXRpYmlsaXR5IGFuZCBtaWdyYXRpb24sIGZvbGxvdy11cCB3b3JrOyBkZWxldGUgdGhpcyBzZWN0aW9uIGlmIHRoZXJlIGlzIG5vbmUnLFxuICB9LFxuXTtcblxuLyoqIFNlY3Rpb25zIG9mIGEgYnVnIHJlcG9ydCwgaW4gdGhlIG9yZGVyIHRoZXkgYXBwZWFyIGluIHRoZSBpc3N1ZSB0ZW1wbGF0ZS4gKi9cbmV4cG9ydCBjb25zdCBCVUdfSVNTVUVfU0VDVElPTlM6IHJlYWRvbmx5IFRlbXBsYXRlU2VjdGlvbltdID0gW1xuICB7IGhlYWRpbmc6ICdQcm9ibGVtJywgcmVxdWlyZW1lbnQ6ICd3aGF0IGhhcHBlbnMsIGFuZCB3aGF0IHNob3VsZCBoYXBwZW4gaW5zdGVhZCcgfSxcbiAgeyBoZWFkaW5nOiAnRXZpZGVuY2UnLCByZXF1aXJlbWVudDogJ3JlcHJvZHVjdGlvbiBzdGVwcywgbG9ncywgcnVuIElEcywgb3IgbGlua3MnIH0sXG4gIHsgaGVhZGluZzogJ0ltcGFjdCcsIHJlcXVpcmVtZW50OiAnd2hvIG9yIHdoYXQgaXMgYWZmZWN0ZWQsIGFuZCBob3cgYmFkbHknIH0sXG4gIHsgaGVhZGluZzogJ1Byb3Bvc2FsJywgcmVxdWlyZW1lbnQ6ICd0aGUgZml4IHlvdSBoYXZlIGluIG1pbmQsIGFuZCB0aGUgcm9vdCBjYXVzZSBpZiBrbm93bicgfSxcbl07XG5cbi8qKlxuICogU2VjdGlvbnMgYSBjaGFuZ2Ugc3BlY2lmaWNhdGlvbiBtdXN0IHNldHRsZSBiZWZvcmUgYSB0aGlyZCBwYXJ0eSBjYW4gaW1wbGVtZW50IGl0LCBkZWZpbmVkXG4gKiBvbmNlIHNvIHRoYXQgdGhlIGlzc3VlIHRlbXBsYXRlIGFuZCBhbnkgdG9vbCB0aGF0IGRyYWZ0cyBvciByZXZpZXdzIHNwZWNpZmljYXRpb25zIGFnYWluc3RcbiAqIHRoZXNlIHNlY3Rpb25zIGNhbm5vdCBkcmlmdCBhcGFydDsgY2hlY2tsaXN0IGNvbnN1bWVycyByZW5kZXIgaXQgd2l0aCBgcmVuZGVyU2VjdGlvbkNoZWNrbGlzdGAuXG4gKiBUaGUgZmlyc3QgdGhyZWUgc2VjdGlvbnMgc3VmZmljZSBmb3IgYSBzbWFsbCBjaGFuZ2UsIHNvIHRoZXkgY29tZSBmaXJzdC5cbiAqL1xuZXhwb3J0IGNvbnN0IENIQU5HRV9JU1NVRV9TRUNUSU9OUzogcmVhZG9ubHkgVGVtcGxhdGVTZWN0aW9uW10gPSBbXG4gIHtcbiAgICBoZWFkaW5nOiAnQmFja2dyb3VuZCBhbmQgZ29hbCcsXG4gICAgcmVxdWlyZW1lbnQ6ICd0aGUgcHJvYmxlbSBiZWluZyBzb2x2ZWQsIGZvciB3aG9tLCBhbmQgd2hhdCBvdXRjb21lIGNvdW50cyBhcyBzdWNjZXNzJyxcbiAgfSxcbiAge1xuICAgIGhlYWRpbmc6ICdCZWhhdmlvcicsXG4gICAgcmVxdWlyZW1lbnQ6XG4gICAgICAnZXZlcnkgdXNlci0gb3IgY2FsbGVyLW9ic2VydmFibGUgYmVoYXZpb3IsIGluY2x1ZGluZyBpbnB1dHMsIG91dHB1dHMsIGVycm9yIGNhc2VzLCBlZGdlIGNhc2VzLCBhbmQgaW50ZXJhY3Rpb25zIHdpdGggZXhpc3RpbmcgYmVoYXZpb3IsIHN0YXRlZCBwcmVjaXNlbHkgZW5vdWdoIHRoYXQgdHdvIGltcGxlbWVudGVycyB3b3VsZCBidWlsZCB0aGUgc2FtZSB0aGluZycsXG4gIH0sXG4gIHtcbiAgICBoZWFkaW5nOiAnQWNjZXB0YW5jZSBjcml0ZXJpYScsXG4gICAgcmVxdWlyZW1lbnQ6XG4gICAgICAnY2hlY2thYmxlIGNvbmRpdGlvbnMgKEdpdmVuL1doZW4vVGhlbiBvciBhbiBlcXVpdmFsZW50KSB0aGF0IGRlY2lkZSB3aGV0aGVyIHRoZSBpbXBsZW1lbnRhdGlvbiBpcyBkb25lJyxcbiAgfSxcbiAge1xuICAgIGhlYWRpbmc6ICdTY29wZSBhbmQgbm9uLWdvYWxzJyxcbiAgICByZXF1aXJlbWVudDogJ3doYXQgdGhlIGNoYW5nZSBjb3ZlcnMgYW5kIHdoYXQgaXQgZGVsaWJlcmF0ZWx5IGxlYXZlcyBvdXQsIHNvIGFuIGltcGxlbWVudGVyIGtub3dzIHdoZXJlIHRvIHN0b3AnLFxuICB9LFxuICB7XG4gICAgaGVhZGluZzogJ0Rlc2lnbiBjb25zdHJhaW50cycsXG4gICAgcmVxdWlyZW1lbnQ6XG4gICAgICAndGhlIGRhdGEsIEFQSSwgc2NoZW1hLCBVSSwgYW5kIGNvbmZpZ3VyYXRpb24gY2hhbmdlcywgbmFtaW5nLCBhbmQgdGhlIGV4aXN0aW5nIGNvZGUgb3IgY29udmVudGlvbnMgdGhlIGltcGxlbWVudGF0aW9uIG11c3QgZml0IOKAlCBhcyBmYXIgYXMgdGhlIHdyaXRlciBpbnRlbmRzIHRvIGNvbnN0cmFpbiB0aGVtLCB3aXRoIGV2ZXJ5dGhpbmcgZWxzZSBleHBsaWNpdGx5IGxlZnQgdG8gdGhlIGltcGxlbWVudGVyJyxcbiAgfSxcbiAge1xuICAgIGhlYWRpbmc6ICdDb21wYXRpYmlsaXR5IGFuZCBtaWdyYXRpb24nLFxuICAgIHJlcXVpcmVtZW50OiAnd2hhdCBleGlzdGluZyBkYXRhLCB1c2VycywgY2FsbGVycywgb3IgY29uZmlndXJhdGlvbnMgYXJlIGFmZmVjdGVkIGFuZCBob3cgdGhlIHRyYW5zaXRpb24gaGFwcGVucycsXG4gIH0sXG4gIHtcbiAgICBoZWFkaW5nOiAnVmVyaWZpY2F0aW9uJyxcbiAgICByZXF1aXJlbWVudDogJ2hvdyB0aGUgY2hhbmdlIGlzIHRlc3RlZCBvciBkZW1vbnN0cmF0ZWQsIGluY2x1ZGluZyB3aGF0IG5lZWRzIG5vIHRlc3QgYW5kIHdoeScsXG4gIH0sXG4gIHtcbiAgICBoZWFkaW5nOiAnT3BlbiBxdWVzdGlvbnMnLFxuICAgIHJlcXVpcmVtZW50OiAndW5kZWNpZGVkIHBvaW50cywgZWFjaCB3aXRoIGl0cyBvcHRpb25zOyBlbXB0eSBvbmNlIHRoZSBzcGVjaWZpY2F0aW9uIGlzIGltcGxlbWVudGFibGUnLFxuICB9LFxuXTtcblxuLyoqIFJlbmRlcnMgc2VjdGlvbnMgYXMgbWFya2Rvd24gYnVsbGV0cyAoYC0gKipIZWFkaW5nKio6IHJlcXVpcmVtZW50YCkuICovXG5leHBvcnQgZnVuY3Rpb24gcmVuZGVyU2VjdGlvbkNoZWNrbGlzdChzZWN0aW9uczogcmVhZG9ubHkgVGVtcGxhdGVTZWN0aW9uW10pOiBzdHJpbmcge1xuICByZXR1cm4gc2VjdGlvbnMubWFwKChzZWN0aW9uKSA9PiBgLSAqKiR7c2VjdGlvbi5oZWFkaW5nfSoqOiAke3NlY3Rpb24ucmVxdWlyZW1lbnR9YCkuam9pbignXFxuJyk7XG59XG5cbi8qKiBSZW5kZXJzIHNlY3Rpb25zIGFzIG1hcmtkb3duIGhlYWRpbmdzLCBlYWNoIGZvbGxvd2VkIGJ5IGl0cyByZXF1aXJlbWVudCBhcyBhIHBsYWNlaG9sZGVyIGNvbW1lbnQuICovXG5leHBvcnQgZnVuY3Rpb24gcmVuZGVyU2VjdGlvblRlbXBsYXRlKHNlY3Rpb25zOiByZWFkb25seSBUZW1wbGF0ZVNlY3Rpb25bXSk6IHN0cmluZyB7XG4gIHJldHVybiBzZWN0aW9uc1xuICAgIC5tYXAoXG4gICAgICAoc2VjdGlvbikgPT5cbiAgICAgICAgYCMjICR7c2VjdGlvbi5oZWFkaW5nfVxcblxcbjwhLS0gJHtzZWN0aW9uLnJlcXVpcmVtZW50LmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpfSR7c2VjdGlvbi5yZXF1aXJlbWVudC5zbGljZSgxKX0uIC0tPmBcbiAgICApXG4gICAgLmpvaW4oJ1xcblxcbicpO1xufVxuIiwiZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHNsZWVwKG1pbGxpc2Vjb25kczogbnVtYmVyKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4gc2V0VGltZW91dChyZXNvbHZlLCBtaWxsaXNlY29uZHMpKTtcbn1cbiIsImltcG9ydCB7IHNsZWVwIH0gZnJvbSAnLi9zbGVlcC5qcyc7XG5cbi8qKlxuICogQ29udmVydCBhbiBvYmplY3QgdG8gYW4gZXJyb3IuXG4gKiBAcGFyYW0gb2JqIFRoZSBvYmplY3QgdG8gY29udmVydC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGVycm9yaWZ5KG9iajogdW5rbm93bik6IEVycm9yIHtcbiAgaWYgKG9iaiBpbnN0YW5jZW9mIEVycm9yKSByZXR1cm4gb2JqO1xuICBpZiAodHlwZW9mIG9iaiA9PT0gJ3N0cmluZycpIHJldHVybiBuZXcgRXJyb3Iob2JqKTtcbiAgdHJ5IHtcbiAgICByZXR1cm4gbmV3IEVycm9yKEpTT04uc3RyaW5naWZ5KG9iaikpO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gbmV3IEVycm9yKFN0cmluZyhvYmopKTtcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gaWdub3JlRXJyb3I8VD4oZm46ICgpID0+IFQpOiBUIHwgdW5kZWZpbmVkIHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gZm4oKTtcbiAgfSBjYXRjaCB7XG4gICAgLy8gZG8gbm90aGluZ1xuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpZ25vcmVFbm9lbnQ8VD4oZm46ICgpID0+IFQpOiBUIHwgdW5kZWZpbmVkIHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gZm4oKTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBpZiAodHlwZW9mIGVycm9yID09PSAnb2JqZWN0JyAmJiBlcnJvciAmJiAnY29kZScgaW4gZXJyb3IgJiYgZXJyb3IuY29kZSA9PT0gJ0VOT0VOVCcpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhyb3cgZXJyb3I7XG4gIH1cbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGlnbm9yZUVycm9yQXN5bmM8VD4oZm46ICgpID0+IFByb21pc2U8VD4pOiBQcm9taXNlPFQgfCB1bmRlZmluZWQ+IHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gYXdhaXQgZm4oKTtcbiAgfSBjYXRjaCB7XG4gICAgLy8gZG8gbm90aGluZ1xuICB9XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBpZ25vcmVFbm9lbnRBc3luYzxUPihmbjogKCkgPT4gUHJvbWlzZTxUPik6IFByb21pc2U8VCB8IHVuZGVmaW5lZD4ge1xuICB0cnkge1xuICAgIHJldHVybiBhd2FpdCBmbigpO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGlmICh0eXBlb2YgZXJyb3IgPT09ICdvYmplY3QnICYmIGVycm9yICYmICdjb2RlJyBpbiBlcnJvciAmJiBlcnJvci5jb2RlID09PSAnRU5PRU5UJykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aHJvdyBlcnJvcjtcbiAgfVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIFJldHJ5T3B0aW9ucyB7XG4gIGJlZm9yZVJldHJ5PzogKGVycm9yOiB1bmtub3duKSA9PiBQcm9taXNlPHZvaWQ+O1xuICBoYW5kbGVFcnJvcj86IChlcnJvcjogdW5rbm93bikgPT4gUHJvbWlzZTx2b2lkPjtcbiAgLyoqXG4gICAqIFRoZSBtYXhpbXVtIG51bWJlciBvZiB0b3RhbCBhdHRlbXB0cywgaW5jbHVkaW5nIHRoZSBpbml0aWFsIGF0dGVtcHQuXG4gICAqIEZvciBleGFtcGxlLCBgcmV0cnlDb3VudDogM2AgcnVucyB0aGUgZnVuY3Rpb24gYXQgbW9zdCAzIHRpbWVzOiAxIGluaXRpYWwgYXR0ZW1wdCBhbmQgdXAgdG8gMiByZXRyaWVzLlxuICAgKi9cbiAgcmV0cnlDb3VudD86IG51bWJlcjtcbiAgcmV0cnlMb2dnZXI/OiAobWVzc2FnZTogc3RyaW5nKSA9PiB2b2lkO1xuICBzaG91bGRSZXRyeT86IChlcnJvcjogdW5rbm93bikgPT4gYm9vbGVhbjtcbiAgc2xlZXBNaWxsaXNlY29uZHM/OiBudW1iZXI7XG4gIHVwZGF0ZVNsZWVwTWlsbGlzZWNvbmRzPzogKHNsZWVwTWlsbGlzZWNvbmRzOiBudW1iZXIpID0+IG51bWJlcjtcbn1cblxuLyoqXG4gKiBSZXRyeSB0aGUgZ2l2ZW4gZnVuY3Rpb24uXG4gKiBAcGFyYW0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gcmV0cnkuXG4gKiBAcGFyYW0gYmVmb3JlUmV0cnkgVGhlIGZ1bmN0aW9uIHRvIGNhbGwgaW1tZWRpYXRlbHkgYmVmb3JlIHJldHJ5aW5nLlxuICogQHBhcmFtIGhhbmRsZUVycm9yIFRoZSBmdW5jdGlvbiB0byBjYWxsIHdoZW4gYW4gZXJyb3Igb2NjdXJzLlxuICogQHBhcmFtIHJldHJ5Q291bnQgVGhlIG1heGltdW0gbnVtYmVyIG9mIHRvdGFsIGF0dGVtcHRzLCBpbmNsdWRpbmcgdGhlIGluaXRpYWwgYXR0ZW1wdC5cbiAqIEBwYXJhbSByZXRyeUxvZ2dlciBUaGUgZnVuY3Rpb24gdG8gbG9nIHJldHJ5aW5nLlxuICogQHBhcmFtIHNsZWVwTWlsbGlzZWNvbmRzIFRoZSBudW1iZXIgb2YgbWlsbGlzZWNvbmRzIHRvIHNsZWVwIGJlZm9yZSByZXRyeWluZy5cbiAqIEBwYXJhbSB1cGRhdGVTbGVlcE1pbGxpc2Vjb25kcyBUaGUgZnVuY3Rpb24gdG8gdXBkYXRlIHNsZWVwIG1pbGxpc2Vjb25kcyBhZnRlciBlYWNoIHJldHJ5LlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gd2l0aFJldHJ5PFQ+KFxuICBmdW5jOiAoZmFpbGVkQ291bnQ6IG51bWJlcikgPT4gVCB8IFByb21pc2U8VD4sXG4gIHtcbiAgICBiZWZvcmVSZXRyeSxcbiAgICBoYW5kbGVFcnJvcixcbiAgICByZXRyeUNvdW50ID0gMyxcbiAgICByZXRyeUxvZ2dlcixcbiAgICBzaG91bGRSZXRyeSxcbiAgICBzbGVlcE1pbGxpc2Vjb25kcyA9IDAsXG4gICAgdXBkYXRlU2xlZXBNaWxsaXNlY29uZHMsXG4gIH06IFJldHJ5T3B0aW9ucyA9IHt9XG4pOiBQcm9taXNlPFQ+IHtcbiAgbGV0IGZhaWxlZENvdW50ID0gMDtcbiAgZm9yICg7Oykge1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gYXdhaXQgZnVuYyhmYWlsZWRDb3VudCk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGF3YWl0IGhhbmRsZUVycm9yPy4oZXJyb3IpO1xuICAgICAgZmFpbGVkQ291bnQrKztcbiAgICAgIGlmIChmYWlsZWRDb3VudCA+PSByZXRyeUNvdW50KSB7XG4gICAgICAgIHRocm93IGVycm9yO1xuICAgICAgfVxuICAgICAgaWYgKHNob3VsZFJldHJ5ICYmICFzaG91bGRSZXRyeShlcnJvcikpIHtcbiAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICB9XG4gICAgICBpZiAoc2xlZXBNaWxsaXNlY29uZHMgPiAwKSB7XG4gICAgICAgIGF3YWl0IHNsZWVwKHNsZWVwTWlsbGlzZWNvbmRzKTtcbiAgICAgIH1cbiAgICAgIGlmICh1cGRhdGVTbGVlcE1pbGxpc2Vjb25kcykge1xuICAgICAgICBzbGVlcE1pbGxpc2Vjb25kcyA9IHVwZGF0ZVNsZWVwTWlsbGlzZWNvbmRzKHNsZWVwTWlsbGlzZWNvbmRzKTtcbiAgICAgIH1cbiAgICAgIHJldHJ5TG9nZ2VyPy4oYFJldHJ5IGR1ZSB0bzogJHtlcnJvcn1cbiR7ZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/ICctLS1cXG4nICsgKGVycm9yLnN0YWNrID8/ICcnKSA6ICcnfWApO1xuICAgICAgYXdhaXQgYmVmb3JlUmV0cnk/LihlcnJvcik7XG4gICAgfVxuICB9XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgZmcgZnJvbSAnZmFzdC1nbG9iJztcblxuLyoqIFRoZSBgd29ya3NwYWNlc2AgZmllbGQgb2YgYSByb290IHBhY2thZ2UuanNvbjogdGhlIGFycmF5IGZvcm0gb3IgWWFybiB2MSdzIG9iamVjdCBmb3JtLiAqL1xuZXhwb3J0IHR5cGUgV29ya3NwYWNlc0RlY2xhcmF0aW9uID0gc3RyaW5nW10gfCB7IHBhY2thZ2VzPzogc3RyaW5nW10gfSB8IHVuZGVmaW5lZDtcblxuLyoqXG4gKiBFdmVyeSB3b3Jrc3BhY2UgcGFja2FnZS5qc29uIHBhdGggKHJlbGF0aXZlIHRvIHRoZSBtb25vcmVwbyByb290LCBzb3J0ZWQpIHRoYXQgQnVuIHdvdWxkIGxpbmtcbiAqIGZvciB0aGUgZ2l2ZW4gcm9vdCBwYWNrYWdlLmpzb24gYHdvcmtzcGFjZXNgIGRlY2xhcmF0aW9uLiBDYW5vbmljYWxpemVzIHRoZSBkZWNsYXJlZCBwYXR0ZXJuc1xuICogKHNlZSBnZXRNZWFuaW5nZnVsRGVjbGFyZWRXb3Jrc3BhY2VQYXR0ZXJucyksIGRyb3BzIHBhdHRlcm5zIGVzY2FwaW5nIHRoZSByZXBvc2l0b3J5IChzZWVcbiAqIGlzSW5SZXBvc2l0b3J5V29ya3NwYWNlUGF0dGVybiksIGFuZCByZXNvbHZlcyB0aGUgcmVzdCB3aXRoIEJ1bidzIHNlcXVlbnRpYWwgc2VtYW50aWNzIChzZWVcbiAqIHJlc29sdmVXb3Jrc3BhY2VQYWNrYWdlSnNvblBhdGhzKS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlc29sdmVCdW5Xb3Jrc3BhY2VQYWNrYWdlSnNvblBhdGhzKHdvcmtzcGFjZXM6IFdvcmtzcGFjZXNEZWNsYXJhdGlvbiwgcm9vdERpclBhdGg6IHN0cmluZyk6IHN0cmluZ1tdIHtcbiAgcmV0dXJuIHJlc29sdmVXb3Jrc3BhY2VQYWNrYWdlSnNvblBhdGhzKFxuICAgIGdldE1lYW5pbmdmdWxEZWNsYXJlZFdvcmtzcGFjZVBhdHRlcm5zKHdvcmtzcGFjZXMpLmZpbHRlcigod29ya3NwYWNlUGF0dGVybikgPT5cbiAgICAgIGlzSW5SZXBvc2l0b3J5V29ya3NwYWNlUGF0dGVybih3b3Jrc3BhY2VQYXR0ZXJuKVxuICAgICksXG4gICAgcm9vdERpclBhdGhcbiAgKTtcbn1cblxuLyoqXG4gKiBSZXNvbHZlcyB3b3Jrc3BhY2UgcGF0dGVybnMgdG8gcGFja2FnZS5qc29uIHBhdGhzIG1pbWlja2luZyBCdW4ncyBTRVFVRU5USUFMIGV2YWx1YXRpb24sXG4gKiBkZXJpdmVkIGVtcGlyaWNhbGx5IHdpdGggQnVuIDEuMy4xNCAoZml4dHVyZSByZXBvcyBvYnNlcnZlZCB2aWEgYGJ1biBpbnN0YWxsIC0tbG9ja2ZpbGUtb25seWA7XG4gKiBXaWxsQm9vc3Rlci9zaGFyZWQjMTAwNCAvIFdpbGxCb29zdGVyL3NoYXJlZCMxMDA1KTpcbiAqIDEuIFBhdHRlcm5zIGFyZSBldmFsdWF0ZWQgaW4gZGVjbGFyYXRpb24gb3JkZXIgaW50byBhbiBhY2N1bXVsYXRpbmcgc2V0OiBhIHBvc2l0aXZlIGdsb2JcbiAqICAgIHBhdHRlcm4gYWRkcyBldmVyeSBwYWNrYWdlLmpzb24gaXQgbWF0Y2hlczsgYSBuZWdhdGlvbiBkZWxldGVzIGl0cyBtYXRjaGVzIGZyb20gdGhlIHNldFxuICogICAgYWNjdW11bGF0ZWQgU08gRkFSLCBzbyBhIGxhdGVyIHBvc2l0aXZlIHJlLWFkZHMgdGhlbSAoYFtcIiFhcHBzL2V4Y2x1ZGVkXCIsIFwiYXBwcy8qXCJdYCBsaW5rc1xuICogICAgYXBwcy9leGNsdWRlZCwgd2hpbGUgYFtcImFwcHMvKlwiLCBcIiFhcHBzL2V4Y2x1ZGVkXCJdYCBkb2VzIG5vdCkuXG4gKiAyLiBBIG5lZ2F0aW9uIHdob3NlIG5vcm1hbGl6ZWQgYm9keSBoYXMgRVhBQ1RMWSB0d28gc2VnbWVudHMsIHdob3NlIGxhc3Qgc2VnbWVudCBpcyBhIHN0YXItcnVuXG4gKiAgICAoYCpgLCBgKipgLCBgKioqYCwg4oCmKSwgYW5kIHdob3NlIGZpcnN0IHNlZ21lbnQgaXMgTk9UIGl0c2VsZiBhIHN0YXItcnVuIGZpcnN0IHNlZWRzIHRoZVxuICogICAgaW1wbGljaXQgYmFzZWxpbmUgaW50byB0aGUgc2V0LCB0aGVuIGRlbGV0ZXMgaXRzIG93biBtYXRjaGVzOiBhIGAqKmAgbGFzdCBzZWdtZW50IHNlZWRzXG4gKiAgICBgKipgIChwYWNrYWdlcyBhdCBhbnkgZGVwdGgpLCBhbnkgb3RoZXIgc3Rhci1ydW4gc2VlZHMgYCpcXC8qYCAoZGVwdGggMiBvbmx5KS4gU2VlZGluZ1xuICogICAgaGFwcGVucyBldmVuIGFsb25nc2lkZSBwb3NpdGl2ZSBwYXR0ZXJucyAoYFtcImFwcHMvKlwiLCBcIiFvdGhlci8qXCJdYCBsaW5rcyBldmVyeSBkZXB0aC0yXG4gKiAgICBwYWNrYWdlIG91dHNpZGUgb3RoZXIvKS4gTm8gb3RoZXIgbmVnYXRpb24gc2hhcGUgc2VlZHM6IGAhKmAsIGAhKipgLCBgISpcXC8qYCwgYCEqXFwvKipgLFxuICogICAgYCEqKlxcLypgLCBgIWEvYi8qYCwgYCFhL2IvKipgLCBgIWRpcmAsIGFuZCBgIWRpci8qeGAgZWFjaCBsaW5rIG5vdGhpbmcgb24gdGhlaXIgb3duLlxuICogICAgYD9gLCBicmFjZSwgYW5kIGNoYXJhY3Rlci1jbGFzcyBsYXN0IHNlZ21lbnRzIGJlaGF2ZSBFUlJBVElDQUxMWSAoYFtcIiFvdGhlci8/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+IG5hbWUuc3RhcnRzV2l0aChQUklWQVRFX1NDT1BFKSkpO1xuICB9KTtcbn1cblxuZnVuY3Rpb24gcmVhZFBhY2thZ2VKc29uSWZFeGlzdHMoZmlsZVBhdGg6IHN0cmluZyk6IFBhY2thZ2VKc29uIHwgdW5kZWZpbmVkIHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gSlNPTi5wYXJzZShmcy5yZWFkRmlsZVN5bmMoZmlsZVBhdGgsICd1dGY4JykpIGFzIFBhY2thZ2VKc29uO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG59XG4iLCIvLyBHaXRIdWIgQWN0aW9ucyB2YWx1ZWxlc3MgZXZlbnRzIHN1Y2ggYXMgYHB1bGxfcmVxdWVzdDpgIHJlcXVpcmUgWUFNTCBudWxsIHZhbHVlcy5cbi8qIGVzbGludC1kaXNhYmxlIHVuaWNvcm4vbm8tbnVsbCAqL1xuXG5pbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgbWVyZ2UgZnJvbSAnZGVlcG1lcmdlJztcbmltcG9ydCAqIGFzIHlhbWwgZnJvbSAnanMteWFtbCc7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgeyBoYXNGbm94U3luY0ZhaWxlZCwgcmVzb2x2ZUZub3hDaUFnZUtleVNlY3JldE5hbWUgfSBmcm9tICcuL2Zub3hUb21sLmpzJztcbmltcG9ydCB7IGZzVXRpbCB9IGZyb20gJy4uL3V0aWxzL2ZzVXRpbC5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGNvbWJpbmVNZXJnZSB9IGZyb20gJy4uL3V0aWxzL21lcmdlVXRpbC5qcyc7XG5pbXBvcnQgeyBtb3ZlVG9Cb3R0b20sIHNvcnRLZXlzIH0gZnJvbSAnLi4vdXRpbHMvb2JqZWN0VXRpbC5qcyc7XG5pbXBvcnQgeyByZXBvUmVzb2x2ZXNQcml2YXRlUGFja2FnZXMgfSBmcm9tICcuLi91dGlscy9wcml2YXRlUGFja2FnZXMuanMnO1xuaW1wb3J0IHsgcHJvbWlzZVBvb2wgfSBmcm9tICcuLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5cbmludGVyZmFjZSBXb3JrZmxvdyB7XG4gIG5hbWU/OiBzdHJpbmc7XG4gIG9uPzogT247XG4gIGNvbmN1cnJlbmN5PzogQ29uY3VycmVuY3k7XG4gIHBlcm1pc3Npb25zPzogUmVjb3JkPHN0cmluZywgc3RyaW5nPjtcbiAgam9iczogUmVjb3JkPHN0cmluZywgSm9iPjtcbn1cblxuaW50ZXJmYWNlIENvbmN1cnJlbmN5IHtcbiAgZ3JvdXA6IHN0cmluZztcbiAgJ2NhbmNlbC1pbi1wcm9ncmVzcyc6IGJvb2xlYW47XG4gIHF1ZXVlPzogJ3NpbmdsZScgfCAnbWF4Jztcbn1cblxuaW50ZXJmYWNlIE9uIHtcbiAgLy8gR2l0SHViIEFjdGlvbnMgdHJlYXRzIGBldmVudDogbnVsbGAgYXMgYSB2YWx1ZWxlc3MgZXZlbnQgbWFwcGluZywgZS5nLlxuICAvLyBgcHVsbF9yZXF1ZXN0OmAuIGB1bmRlZmluZWRgIHdvdWxkIG9taXQgdGhlIGV2ZW50IGVudGlyZWx5IHdoZW4gZHVtcGluZyBZQU1MLlxuICBpc3N1ZXM/OiBUeXBlcyB8IG51bGw7XG4gIHB1bGxfcmVxdWVzdD86IFB1bGxSZXF1ZXN0IHwgbnVsbDtcbiAgcHVsbF9yZXF1ZXN0X3RhcmdldD86IFR5cGVzIHwgbnVsbDtcbiAgcHVzaD86IFB1c2g7XG4gIHNjaGVkdWxlPzogU2NoZWR1bGVbXTtcbiAgd29ya2Zsb3dfZGlzcGF0Y2g/OiBudWxsO1xufVxuXG5pbnRlcmZhY2UgUHVsbFJlcXVlc3Qge1xuICAncGF0aHMtaWdub3JlJz86IHN0cmluZ1tdO1xuICB0eXBlcz86IHN0cmluZ1tdO1xufVxuXG5pbnRlcmZhY2UgUHVzaCB7XG4gIGJyYW5jaGVzOiBzdHJpbmdbXTtcbiAgJ3BhdGhzLWlnbm9yZSc/OiBzdHJpbmdbXTtcbn1cblxuaW50ZXJmYWNlIFNjaGVkdWxlIHtcbiAgY3Jvbjogc3RyaW5nO1xufVxuXG5pbnRlcmZhY2UgVHlwZXMge1xuICB0eXBlczogc3RyaW5nW107XG59XG5cbmludGVyZmFjZSBKb2Ige1xuICAncnVucy1vbic/OiBzdHJpbmc7XG4gIGVudj86IFJlY29yZDxzdHJpbmcsIHN0cmluZz47XG4gIHBlcm1pc3Npb25zPzogUmVjb3JkPHN0cmluZywgc3RyaW5nPjtcbiAgc3RlcHM/OiBTdGVwW107XG4gIHVzZXM/OiBzdHJpbmc7XG4gIGlmPzogc3RyaW5nO1xuICBzZWNyZXRzPzogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gfCAnaW5oZXJpdCc7XG4gIHdpdGg/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbn1cblxuaW50ZXJmYWNlIFN0ZXAge1xuICB1c2VzPzogc3RyaW5nO1xuICB3aXRoPzogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gIHJ1bj86IHN0cmluZztcbn1cblxuY29uc3Qgd29ya2Zsb3dzID0ge1xuICB0ZXN0OiB7XG4gICAgbmFtZTogJ1Rlc3QnLFxuICAgIG9uOiB7XG4gICAgICBwdWxsX3JlcXVlc3Q6IG51bGwsXG4gICAgICBwdXNoOiB7XG4gICAgICAgIGJyYW5jaGVzOiBbJ21haW4nXSxcbiAgICAgIH0sXG4gICAgICAvLyBMZXQgbWFpbnRhaW5lcnMgcmUtcnVuIHRoZSB0ZXN0cyBieSBoYW5kLlxuICAgICAgd29ya2Zsb3dfZGlzcGF0Y2g6IG51bGwsXG4gICAgfSxcbiAgICAvLyBjZi4gaHR0cHM6Ly9kb2NzLmdpdGh1Yi5jb20vZW4vYWN0aW9ucy91c2luZy1qb2JzL3VzaW5nLWNvbmN1cnJlbmN5I2V4YW1wbGUtb25seS1jYW5jZWwtaW4tcHJvZ3Jlc3Mtam9icy1vci1ydW5zLWZvci10aGUtY3VycmVudC13b3JrZmxvd1xuICAgIGNvbmN1cnJlbmN5OiB7XG4gICAgICBncm91cDogJyR7eyBnaXRodWIud29ya2Zsb3cgfX0tJHt7IGdpdGh1Yi5yZWYgfX0nLFxuICAgICAgJ2NhbmNlbC1pbi1wcm9ncmVzcyc6IHRydWUsXG4gICAgfSxcbiAgICAvLyBOb25lIG9mIHRoZXNlIG1heSBiZSBuYXJyb3dlZCBqdXN0IGJlY2F1c2UgdGhlIHJldXNhYmxlIHRlc3Qgd29ya2Zsb3cgbmV2ZXIgcHVzaGVzOlxuICAgIHBlcm1pc3Npb25zOiB7XG4gICAgICAvLyBmb3IgdGhlIHRlc3Qgam9iJ3Mgc2tpcC1kdXBsaWNhdGUtYWN0aW9ucyBjYWxsIHdpdGggY2FuY2VsX290aGVyczogdHJ1ZSAodGhlIHJldXNhYmxlXG4gICAgICAvLyB0ZXN0IHdvcmtmbG93IGRlY2xhcmVzIG5vIHBlcm1pc3Npb25zIG9mIGl0cyBvd24sIHNvIGl0cyBqb2JzIHJ1biBvbiB0aGlzIHRva2VuKVxuICAgICAgYWN0aW9uczogJ3dyaXRlJyxcbiAgICAgIC8vIGZvciBgc2VtYW50aWMtcmVsZWFzZSAtLWRyeS1ydW5gLCB3aGljaCBkb2VzIGEgYGdpdCBwdXNoIC0tZHJ5LXJ1bmAgdG8gdmVyaWZ5IHdyaXRlXG4gICAgICAvLyBhY2Nlc3MgYW5kIGFib3J0cyB3aXRoIEVHSVROT1BFUk1JU1NJT04gd2l0aG91dCBpdFxuICAgICAgY29udGVudHM6ICd3cml0ZScsXG4gICAgICAvLyBmb3IgcGtnLXByZWZsaWdodCBQUiBmaWxlIGxpc3RpbmdcbiAgICAgICdwdWxsLXJlcXVlc3RzJzogJ3JlYWQnLFxuICAgIH0sXG4gICAgam9iczoge1xuICAgICAgdGVzdDoge1xuICAgICAgICB1c2VzOiAnV2lsbEJvb3N0ZXIvcmV1c2FibGUtd29ya2Zsb3dzLy5naXRodWIvd29ya2Zsb3dzL3Rlc3QueW1sQG1haW4nLFxuICAgICAgfSxcbiAgICB9LFxuICB9LFxuICAndGVzdC1ydXN0Jzoge1xuICAgIG5hbWU6ICdUZXN0IFJ1c3QnLFxuICAgIG9uOiB7XG4gICAgICBwdWxsX3JlcXVlc3Q6IG51bGwsXG4gICAgICBwdXNoOiB7XG4gICAgICAgIGJyYW5jaGVzOiBbJ21haW4nXSxcbiAgICAgIH0sXG4gICAgfSxcbiAgICBjb25jdXJyZW5jeToge1xuICAgICAgZ3JvdXA6ICcke3sgZ2l0aHViLndvcmtmbG93IH19LSR7eyBnaXRodWIucmVmIH19JyxcbiAgICAgICdjYW5jZWwtaW4tcHJvZ3Jlc3MnOiB0cnVlLFxuICAgIH0sXG4gICAgam9iczoge1xuICAgICAgJ3Rlc3QtcnVzdCc6IHtcbiAgICAgICAgdXNlczogJ1dpbGxCb29zdGVyL3JldXNhYmxlLXdvcmtmbG93cy8uZ2l0aHViL3dvcmtmbG93cy90ZXN0LXJ1c3QueW1sQG1haW4nLFxuICAgICAgfSxcbiAgICB9LFxuICB9LFxuICByZWxlYXNlOiB7XG4gICAgbmFtZTogJ1JlbGVhc2UnLFxuICAgIG9uOiB7XG4gICAgICBwdXNoOiB7XG4gICAgICAgIGJyYW5jaGVzOiBbXSxcbiAgICAgIH0sXG4gICAgfSxcbiAgICAvLyBgcXVldWU6IG1heGAgaGVyZSB0b28gKCM5NzQpOiBHaXRIdWIncyBkZWZhdWx0IHF1ZXVlIChgc2luZ2xlYCkgY2FuY2VscyBhbiBhbHJlYWR5LVBFTkRJTkdcbiAgICAvLyBjYWxsZXIgcnVuIHdoZW4gYW5vdGhlciBvbmUgcXVldWVzIOKAlCBiZWZvcmUgaXRzIGpvYiAoYW5kIHRoZSByZXVzYWJsZSB3b3JrZmxvdydzIG93blxuICAgIC8vIGpvYi1sZXZlbCBgcXVldWU6IG1heGApIGV2ZXIgc3RhcnRzIOKAlCBzaWxlbnRseSBkcm9wcGluZyB0aGF0IHJlbGVhc2UgdHJpZ2dlci5cbiAgICAvLyBUaGUgY2FsbGVyLWxldmVsIGdyb3VwIG11c3QgTk9UIHJldXNlIHRoZSByZXVzYWJsZSB3b3JrZmxvdydzIGpvYi1sZXZlbCBncm91cCBuYW1lXG4gICAgLy8gKGByZWxlYXNlLSR7eyBnaXRodWIucmVwb3NpdG9yeSB9fWApOiB3b3JrZmxvdy1sZXZlbCBhbmQgam9iLWxldmVsIGdyb3VwcyBzaGFyZSBvbmVcbiAgICAvLyByZXBvc2l0b3J5LXdpZGUgbmFtZXNwYWNlLCBhbmQgaWRlbnRpY2FsIG5hbWVzIGRlYWRsb2NrIHRoZSBydW4gKFwiQ2FuY2VsaW5nIHNpbmNlIGFcbiAgICAvLyBkZWFkbG9jayBmb3IgY29uY3VycmVuY3kgZ3JvdXAgLi4uIHdhcyBkZXRlY3RlZCBiZXR3ZWVuICd0b3AgbGV2ZWwgd29ya2Zsb3cnIGFuZCAnPGpvYj4nXCIpLlxuICAgIGNvbmN1cnJlbmN5OiB7XG4gICAgICBncm91cDogJyR7eyBnaXRodWIud29ya2Zsb3cgfX0nLFxuICAgICAgJ2NhbmNlbC1pbi1wcm9ncmVzcyc6IGZhbHNlLFxuICAgICAgcXVldWU6ICdtYXgnLFxuICAgIH0sXG4gICAgcGVybWlzc2lvbnM6IHtcbiAgICAgIC8vIGh0dHBzOi8vZG9jcy5ucG1qcy5jb20vdHJ1c3RlZC1wdWJsaXNoZXJzI3N0ZXAtMi1jb25maWd1cmUteW91ci1jaWNkLXdvcmtmbG93XG4gICAgICAnaWQtdG9rZW4nOiAnd3JpdGUnLFxuICAgICAgLy8gZm9yIHNlbWFudGljLXJlbGVhc2VcbiAgICAgIGNvbnRlbnRzOiAnd3JpdGUnLFxuICAgIH0sXG4gICAgam9iczoge1xuICAgICAgcmVsZWFzZToge1xuICAgICAgICB1c2VzOiAnV2lsbEJvb3N0ZXIvcmV1c2FibGUtd29ya2Zsb3dzLy5naXRodWIvd29ya2Zsb3dzL3JlbGVhc2UueW1sQG1haW4nLFxuICAgICAgfSxcbiAgICB9LFxuICB9LFxuICAnc2VtYW50aWMtcHInOiB7XG4gICAgbmFtZTogJ0xpbnQgUFIgdGl0bGUnLFxuICAgIG9uOiB7XG4gICAgICBwdWxsX3JlcXVlc3RfdGFyZ2V0OiB7XG4gICAgICAgIHR5cGVzOiBbJ29wZW5lZCcsICdlZGl0ZWQnLCAnc3luY2hyb25pemUnXSxcbiAgICAgIH0sXG4gICAgfSxcbiAgICBqb2JzOiB7XG4gICAgICAnc2VtYW50aWMtcHInOiB7XG4gICAgICAgIHVzZXM6ICdXaWxsQm9vc3Rlci9yZXVzYWJsZS13b3JrZmxvd3MvLmdpdGh1Yi93b3JrZmxvd3Mvc2VtYW50aWMtcHIueW1sQG1haW4nLFxuICAgICAgfSxcbiAgICB9LFxuICB9LFxuICBzeW5jOiB7XG4gICAgbmFtZTogJ1N5bmMnLFxuICAgIG9uOiB7fSxcbiAgICBwZXJtaXNzaW9uczoge1xuICAgICAgLy8gZm9yIGNvbW1pdGluZyBjaGFuZ2VzXG4gICAgICBjb250ZW50czogJ3dyaXRlJyxcbiAgICB9LFxuICAgIGpvYnM6IHtcbiAgICAgIHN5bmM6IHsgdXNlczogJ1dpbGxCb29zdGVyL3JldXNhYmxlLXdvcmtmbG93cy8uZ2l0aHViL3dvcmtmbG93cy9zeW5jLnltbEBtYWluJyB9LFxuICAgIH0sXG4gIH0sXG4gICdjbG9zZS1jb21tZW50Jzoge1xuICAgIG5hbWU6ICdBZGQgY2xvc2UgY29tbWVudCcsXG4gICAgb246IHtcbiAgICAgIHB1bGxfcmVxdWVzdDoge1xuICAgICAgICB0eXBlczogWydvcGVuZWQnXSxcbiAgICAgIH0sXG4gICAgfSxcbiAgICBqb2JzOiB7XG4gICAgICAnY2xvc2UtY29tbWVudCc6IHtcbiAgICAgICAgdXNlczogJ1dpbGxCb29zdGVyL3JldXNhYmxlLXdvcmtmbG93cy8uZ2l0aHViL3dvcmtmbG93cy9jbG9zZS1jb21tZW50LnltbEBtYWluJyxcbiAgICAgIH0sXG4gICAgfSxcbiAgfSxcbn0gYXMgY29uc3Q7XG5cbnR5cGUgS25vd25LaW5kID0ga2V5b2YgdHlwZW9mIHdvcmtmbG93cyB8ICdkZXBsb3knO1xuXG4vKipcbiAqIFBhcnNlcyBhIGB1c2VzOmAgdmFsdWUgY2FsbGluZyBvbmUgb2YgV2lsbEJvb3N0ZXIncyBvd24gcmV1c2FibGUgd29ya2Zsb3dzIChvciB0aGVcbiAqIFdpbGxCb29zdGVyTGFiIHN5bmMgbWlycm9yKSBpbnRvIHRoZSB3b3JrZmxvdyBuYW1lICh3aXRob3V0IGV4dGVuc2lvbikgYW5kIGdpdCByZWYuIE9ubHkgdGhvc2VcbiAqIGZvbGxvdyB0aGUgY29udHJhY3Qgd2JmeSBlbmZvcmNlcyDigJQgY2FsbGVycyBvZiBhbm90aGVyIG9yZ2FuaXphdGlvbidzIHNhbWUtbmFtZWQgcmVwb3NpdG9yeSBhcmVcbiAqIGxlZnQgYWxvbmUuIEdpdEh1YiB0cmVhdHMgb3duZXIvcmVwb3NpdG9yeSBuYW1lcyBjYXNlLWluc2Vuc2l0aXZlbHksIHNvIHRoZSBjb21wYXJpc29uIGRvZXNcbiAqIHRvbywgd2hpbGUgdGhlIHdvcmtmbG93IHBhdGggYW5kIHJlZiBzdGF5IGNhc2Utc2Vuc2l0aXZlLlxuICovXG5mdW5jdGlvbiBwYXJzZU9yZ1JldXNhYmxlV29ya2Zsb3dDYWxsKFxuICB1c2VzOiBzdHJpbmcgfCB1bmRlZmluZWRcbik6IHsgd29ya2Zsb3dOYW1lOiBzdHJpbmc7IGV4dGVuc2lvbjogc3RyaW5nOyByZWY6IHN0cmluZyB9IHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgbWF0Y2ggPSAvXihbXi9dKylcXC8oW14vXSspXFwvXFwuZ2l0aHViXFwvd29ya2Zsb3dzXFwvKFteL0BdKz8pXFwuKHlhP21sKUAoLispJC91LmV4ZWModXNlcyA/PyAnJyk7XG4gIGlmICghbWF0Y2gpIHJldHVybiB1bmRlZmluZWQ7XG4gIGNvbnN0IG93bmVyID0gbWF0Y2hbMV0hLnRvTG93ZXJDYXNlKCk7XG4gIGlmICgob3duZXIgIT09ICd3aWxsYm9vc3RlcicgJiYgb3duZXIgIT09ICd3aWxsYm9vc3RlcmxhYicpIHx8IG1hdGNoWzJdIS50b0xvd2VyQ2FzZSgpICE9PSAncmV1c2FibGUtd29ya2Zsb3dzJykge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cbiAgcmV0dXJuIHsgd29ya2Zsb3dOYW1lOiBtYXRjaFszXSEsIGV4dGVuc2lvbjogbWF0Y2hbNF0hLCByZWY6IG1hdGNoWzVdISB9O1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVXb3JrZmxvd3Mocm9vdENvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2dlbmVyYXRlV29ya2Zsb3cnLCBhc3luYyAoKSA9PiB7XG4gICAgaWYgKGlzUmV1c2FibGVXb3JrZmxvd3NSZXBvKHJvb3RDb25maWcucmVwb3NpdG9yeSkpIHtcbiAgICAgIC8vIERvbid0IHRvdWNoIHJldXNhYmxlLXdvcmtmbG93cyByZXBvIGJlY2F1c2UgaXQgaG9zdHMgdXBzdHJlYW0gd29ya2Zsb3cgZGVmaW5pdGlvbnMuXG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3Qgd29ya2Zsb3dzUGF0aCA9IHBhdGgucmVzb2x2ZShyb290Q29uZmlnLmRpclBhdGgsICcuZ2l0aHViJywgJ3dvcmtmbG93cycpO1xuICAgIC8vIFdpdGggLmdpdGh1YiBvciAuZ2l0aHViL3dvcmtmbG93cyBzeW1saW5rZWQgb3V0c2lkZSB0aGUgcmVwb3NpdG9yeSwgd3JpdGVZYW1sJ3MgZ3VhcmRzXG4gICAgLy8gYWxyZWFkeSByZWZ1c2UgdGhlIHdyaXRlcywgYnV0IHJlYWRkaXIvcm0gYmVsb3cgd291bGQgc3RpbGwgZW51bWVyYXRlIGFuZCBERUxFVEUgZmlsZXNcbiAgICAvLyBvdXRzaWRlIHRoZSByZXBvc2l0b3J5IOKAlCBzbyByZXF1aXJlIHRoZSBkaXJlY3RvcnkgdG8gcmVzb2x2ZSBpbnNpZGUgaXQgYmVmb3JlIGFueVxuICAgIC8vIHRyYXZlcnNhbCwgbWtkaXIsIG9yIGNsZWFudXAuXG4gICAgaWYgKCEoYXdhaXQgZnNVdGlsLmlzQ29uZmluZWRXcml0YWJsZVBhdGgod29ya2Zsb3dzUGF0aCkpKSB7XG4gICAgICBjb25zb2xlLndhcm4oYFNraXBwZWQgZ2VuZXJhdGluZyB3b3JrZmxvd3MgYmVjYXVzZSAke3dvcmtmbG93c1BhdGh9IHJlc29sdmVzIG91dHNpZGUgdGhlIHJlcG9zaXRvcnkuYCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGF3YWl0IGZzLnByb21pc2VzLm1rZGlyKHdvcmtmbG93c1BhdGgsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuXG4gICAgY29uc3QgZW50cmllcyA9IGF3YWl0IGZzLnByb21pc2VzLnJlYWRkaXIod29ya2Zsb3dzUGF0aCwgeyB3aXRoRmlsZVR5cGVzOiB0cnVlIH0pO1xuICAgIC8vIHdiZnkgd3JpdGVzIC55bWwgd29ya2Zsb3dzLCBzbyBlYWNoIGtpbmQgbWFwcyB0byBpdHMgLnltbCBmaWxlLlxuICAgIGNvbnN0IGZpbGVOYW1lc0J5S2luZCA9IG5ldyBNYXA8c3RyaW5nLCBzdHJpbmc+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/LnN0YXJ0c1dpdGgoJ2dpdGh1YjpXaWxsQm9vc3Rlci8nKSkge1xuICAgIGpvYi51c2VzID0gYFdpbGxCb29zdGVyL3JldXNhYmxlLXdvcmtmbG93cy8uZ2l0aHViL3dvcmtmbG93cy8ke29yZ1dvcmtmbG93Q2FsbC53b3JrZmxvd05hbWV9LiR7b3JnV29ya2Zsb3dDYWxsLmV4dGVuc2lvbn1AJHtvcmdXb3JrZmxvd0NhbGwucmVmfWA7XG4gIH0gZWxzZSBpZiAob3JnV29ya2Zsb3dDYWxsICYmIGNvbmZpZy5yZXBvc2l0b3J5Py5zdGFydHNXaXRoKCdnaXRodWI6V2lsbEJvb3N0ZXJMYWIvJykpIHtcbiAgICBqb2IudXNlcyA9IGBXaWxsQm9vc3RlckxhYi9yZXVzYWJsZS13b3JrZmxvd3MvLmdpdGh1Yi93b3JrZmxvd3MvJHtvcmdXb3JrZmxvd0NhbGwud29ya2Zsb3dOYW1lfS4ke29yZ1dvcmtmbG93Q2FsbC5leHRlbnNpb259QCR7b3JnV29ya2Zsb3dDYWxsLnJlZn1gO1xuICB9XG5cbiAgaWYgKGNvbmZpZy5kb2VzQ29udGFpbkRvY2tlcmZpbGUgJiYgIWpvYi53aXRoLmNpX2xhYmVsICYmIGtpbmQuc3RhcnRzV2l0aCgndGVzdCcpKSB7XG4gICAgam9iLndpdGguY2lfbGFiZWwgPSAnbGFyZ2UnO1xuICB9XG4gIC8vIEJlY2F1c2UgZ2l0aHViLmV2ZW50LnJlcG9zaXRvcnkucHJpdmF0ZSBpcyBhbHdheXMgdHJ1ZSBpZiBqb2IgaXMgc2NoZWR1bGVkXG4gIGlmIChraW5kID09PSAncmVsZWFzZScgfHwga2luZC5zdGFydHNXaXRoKCd0ZXN0JykgfHwga2luZC5zdGFydHNXaXRoKCdkZXBsb3knKSkge1xuICAgIGlmIChjb25maWcuaXNQdWJsaWNSZXBvKSB7XG4gICAgICBqb2Iud2l0aC5naXRodWJfaG9zdGVkX3J1bm5lciA9IHRydWU7XG4gICAgfVxuICAgIC8vIEFuIGV4aXN0aW5nIGdpdGh1Yl9ob3N0ZWRfcnVubmVyIG9uIGEgUFJJVkFURSByZXBvc2l0b3J5IGlzIHByZXNlcnZlZCBvbiBwdXJwb3NlOiB0aGUgaW5wdXRcbiAgICAvLyBleGlzdHMgcHJlY2lzZWx5IHNvIGEgcHJpdmF0ZSBjYWxsZXIgY2FuIG9wdCBpbnRvIEdpdEh1Yi1ob3N0ZWQgcnVubmVycywgYW5kIHdiZnkgbXVzdCBub3RcbiAgICAvLyByZXZlcnQgdGhhdCBtYW51YWwgY2hvaWNlIChvbmx5IHRoZSBvdGhlciBraW5kcyBiZWxvdyBuZXZlciB0YWtlIHRoZSBpbnB1dCkuXG4gIH0gZWxzZSB7XG4gICAgZGVsZXRlIGpvYi53aXRoLmdpdGh1Yl9ob3N0ZWRfcnVubmVyO1xuICB9XG5cbiAgaWYgKE9iamVjdC5rZXlzKGpvYi53aXRoKS5sZW5ndGggPiAwKSB7XG4gICAgc29ydEtleXMoam9iLndpdGgpO1xuICB9IGVsc2Uge1xuICAgIGRlbGV0ZSBqb2Iud2l0aDtcbiAgfVxuICBpZiAoc2VjcmV0cykge1xuICAgIGlmIChPYmplY3Qua2V5cyhzZWNyZXRzKS5sZW5ndGggPiAwKSB7XG4gICAgICBjb25zdCBuZXdTZWNyZXRzID0gc29ydEtleXMoc2VjcmV0cyk7XG4gICAgICBkZWxldGUgam9iLnNlY3JldHM7XG4gICAgICBqb2Iuc2VjcmV0cyA9IG5ld1NlY3JldHM7XG4gICAgfSBlbHNlIHtcbiAgICAgIGRlbGV0ZSBqb2Iuc2VjcmV0cztcbiAgICB9XG4gIH1cbn1cblxuLyoqXG4gKiBUaGUgc2VjcmV0IGV4cHJlc3Npb24gdGhlIGNhbGxlciBtYXBzIGludG8gdGhlIGNhbGxlZSdzIGRlY2xhcmVkIEZOT1hfQUdFX0tFWSwgb3IgdW5kZWZpbmVkXG4gKiB3aGVuIHRoZSByZXBvc2l0b3J5IHN0YXRlIGRvZXMgbm90IGlkZW50aWZ5IGEgdXNhYmxlIENJIGlkZW50aXR5IOKAlCBhbiB1bmtub3duIHZpc2liaWxpdHksIGFcbiAqIHJlcG9zaXRvcnkgbm8gQ0kgc2NvcGUgY292ZXJzIChkZXJpdmluZyBmcm9tIHRoZSBzYW1lIHByaW5jaXBhbCByb3N0ZXIgYXMgdGhlIHJlY2lwaWVudCBzeW5jXG4gKiBrZWVwcyB0aGUgdHdvIGZyb20gZXZlciBkaXNhZ3JlZWluZyksIG9yIGEgZmFpbGVkIGZub3ggcmVjaXBpZW50IHN5bmMsIHdob3NlIGNpcGhlcnRleHRzIG1heVxuICogc3RpbGwgdGFyZ2V0IHRoZSBwcmV2aW91cyBpZGVudGl0eS4gVGhlIGNhbGxlciBtdXN0IHRoZW4gcHJlc2VydmUgYW55IGV4aXN0aW5nIG1hcHBpbmcuXG4gKi9cbmZ1bmN0aW9uIGZub3hBZ2VLZXlNYXBwaW5nKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGlmICghY29uZmlnLmlzUmVwb1Zpc2liaWxpdHlLbm93biB8fCBoYXNGbm94U3luY0ZhaWxlZCgpKSByZXR1cm4gdW5kZWZpbmVkO1xuICBjb25zdCBzZWNyZXROYW1lID0gcmVzb2x2ZUZub3hDaUFnZUtleVNlY3JldE5hbWUoY29uZmlnKTtcbiAgcmV0dXJuIHNlY3JldE5hbWUgJiYgYFxcJHt7IHNlY3JldHMuJHtzZWNyZXROYW1lfSB9fWA7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHdyaXRlWWFtbChuZXdTZXR0aW5nczogV29ya2Zsb3csIGZpbGVQYXRoOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgLy8gQSBwZXJtaXNzaW9ucyBvYmplY3QgZW1wdGllZCBieSB0aGUgcGVyLWtpbmQgZGVsZXRpb25zIChlLmcuIGFuIGV4aXN0aW5nIHRlc3QtcnVzdCBjYWxsZXJcbiAgLy8gd2hvc2Ugb25seSBlbnRyeSB3YXMgYGFjdGlvbnNgKSBtdXN0IGJlIGRyb3BwZWQgZW50aXJlbHk6IGBwZXJtaXNzaW9uczoge31gIHN0cmlwcyBFVkVSWVxuICAvLyB0b2tlbiBwZXJtaXNzaW9uIGZyb20gdGhlIHdvcmtmbG93LCB1bmxpa2UgdGhlIGFic2VudCBrZXkgd2hpY2gga2VlcHMgdGhlIGRlZmF1bHRzLlxuICBpZiAobmV3U2V0dGluZ3MucGVybWlzc2lvbnMgJiYgT2JqZWN0LmtleXMobmV3U2V0dGluZ3MucGVybWlzc2lvbnMpLmxlbmd0aCA9PT0gMCkge1xuICAgIGRlbGV0ZSBuZXdTZXR0aW5ncy5wZXJtaXNzaW9ucztcbiAgfVxuICBjb25zdCB5YW1sVGV4dCA9IHlhbWwuZHVtcChuZXdTZXR0aW5ncywgeyBsaW5lV2lkdGg6IC0xIH0pO1xuICBhd2FpdCBmc1V0aWwud3JpdGVGaWxlQ29uZmluZWQoZmlsZVBhdGgsIHlhbWxUZXh0KTtcbn1cbiIsImltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB7IGdsb2JJZ25vcmUgfSBmcm9tICdAd2lsbGJvb3N0ZXIvc2hhcmVkLWxpYi1ub2RlL3NyYyc7XG5pbXBvcnQgZmcgZnJvbSAnZmFzdC1nbG9iJztcblxuaW1wb3J0IHsgaXNSZXVzYWJsZVdvcmtmbG93c1JlcG8gfSBmcm9tICcuLi9nZW5lcmF0b3JzL3dvcmtmbG93LmpzJztcbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgeyBvcHRpb25zIH0gZnJvbSAnLi4vb3B0aW9ucy5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGZzVXRpbCB9IGZyb20gJy4uL3V0aWxzL2ZzVXRpbC5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcbmltcG9ydCB7IGdldFdvcmtzcGFjZURpclBhdHRlcm5zIH0gZnJvbSAnLi4vdXRpbHMvd29ya3NwYWNlVXRpbC5qcyc7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBmaXhUeXBvcyhwYWNrYWdlQ29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZml4VHlwb3MnLCBhc3luYyAoKSA9PiB7XG4gICAgaWYgKGlzUmV1c2FibGVXb3JrZmxvd3NSZXBvKHBhY2thZ2VDb25maWcucmVwb3NpdG9yeSkpIHJldHVybjtcblxuICAgIGNvbnN0IGRpclBhdGggPSBwYWNrYWdlQ29uZmlnLmRpclBhdGg7XG4gICAgY29uc3QgZG9jRmlsZXMgPSBhd2FpdCBmZy5nbG9iKCcqKi8qLm1kJywgeyBkb3Q6IHRydWUsIGN3ZDogZGlyUGF0aCwgaWdub3JlOiBnbG9iSWdub3JlIH0pO1xuICAgIGlmIChvcHRpb25zLmlzVmVyYm9zZSkge1xuICAgICAgY29uc29sZS5pbmZvKGBGb3VuZCAke2RvY0ZpbGVzLmxlbmd0aH0gbWFya2Rvd24gZmlsZXMgaW4gJHtkaXJQYXRofWApO1xuICAgIH1cbiAgICBmb3IgKGNvbnN0IG1kRmlsZSBvZiBkb2NGaWxlcykge1xuICAgICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLmpvaW4oZGlyUGF0aCwgbWRGaWxlKTtcbiAgICAgIHZvaWQgcHJvbWlzZVBvb2wucnVuKGFzeW5jICgpID0+IHtcbiAgICAgICAgY29uc3QgY29udGVudCA9IGF3YWl0IGZzVXRpbC5yZWFkRmlsZUlmRXhpc3RzKGZpbGVQYXRoKTtcbiAgICAgICAgaWYgKGNvbnRlbnQgPT09IHVuZGVmaW5lZCkgcmV0dXJuO1xuICAgICAgICBsZXQgbmV3Q29udGVudCA9IGZpeFR5cG9zSW5UZXh0KGNvbnRlbnQpO1xuICAgICAgICBuZXdDb250ZW50ID0gcmVwbGFjZVdpdGhDb25maWcobmV3Q29udGVudCwgcGFja2FnZUNvbmZpZywgJ2RvYycpO1xuICAgICAgICBpZiAoY29udGVudCAhPT0gbmV3Q29udGVudCkge1xuICAgICAgICAgIGF3YWl0IGZzVXRpbC5nZW5lcmF0ZUZpbGUoZmlsZVBhdGgsIG5ld0NvbnRlbnQpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICAvLyBmaXhUeXBvcyBydW5zIG9uY2Ugb24gdGhlIHJvb3QgY29uZmlnLCBzbyB0aGlzIGdsb2Igc2V0IG11c3QgY292ZXIgZXZlcnkgZGVjbGFyZWQgd29ya3NwYWNlXG4gICAgLy8gbGF5b3V0IChlLmcuIGFwcHMvKiksIG5vdCBqdXN0IHRoZSBjb252ZW50aW9uYWwgcGFja2FnZXMvKiBkaXJlY3Rvcnkg4oCUIHdoaWxlIGhvbm9yaW5nXG4gICAgLy8gZGVjbGFyZWQgbmVnYXRpb25zIChlLmcuIGAhYXBwcy9leGNsdWRlZGApLCB3aG9zZSBzb3VyY2VzIGFyZSBub3QgcGFydCBvZiB0aGUgbW9ub3JlcG8uXG4gICAgY29uc3Qgd29ya3NwYWNlRGlyUGF0dGVybnMgPSBnZXRXb3Jrc3BhY2VEaXJQYXR0ZXJucyhwYWNrYWdlQ29uZmlnKTtcbiAgICBjb25zdCB0c0ZpbGVzID0gYXdhaXQgZmcuZ2xvYihcbiAgICAgIFtcbiAgICAgICAgJ3thcHAsc3JjLHRlc3Qsc2NyaXB0c30vKiovKi57Y2pzLG1qcyxqcyxqc3gsY3RzLG10cyx0cyx0c3h9JyxcbiAgICAgICAgJ3BhY2thZ2VzLyoqL3thcHAsc3JjLHRlc3Qsc2NyaXB0c30vKiovKi57Y2pzLG1qcyxqcyxqc3gsY3RzLG10cyx0cyx0c3h9JyxcbiAgICAgICAgLi4ud29ya3NwYWNlRGlyUGF0dGVybnMuaW5jbHVkZXMubWFwKFxuICAgICAgICAgIChkaXJQYXR0ZXJuKSA9PiBgJHtkaXJQYXR0ZXJufS8qKi97YXBwLHNyYyx0ZXN0LHNjcmlwdHN9LyoqLyoue2NqcyxtanMsanMsanN4LGN0cyxtdHMsdHMsdHN4fWBcbiAgICAgICAgKSxcbiAgICAgIF0sXG4gICAgICB7XG4gICAgICAgIGRvdDogdHJ1ZSxcbiAgICAgICAgY3dkOiBkaXJQYXRoLFxuICAgICAgICBpZ25vcmU6IFsuLi5nbG9iSWdub3JlLCAuLi53b3Jrc3BhY2VEaXJQYXR0ZXJucy5leGNsdWRlcy5tYXAoKGRpclBhdHRlcm4pID0+IGAke2RpclBhdHRlcm59LyoqYCldLFxuICAgICAgfVxuICAgICk7XG4gICAgaWYgKG9wdGlvbnMuaXNWZXJib3NlKSB7XG4gICAgICBjb25zb2xlLmluZm8oYEZvdW5kICR7dHNGaWxlcy5sZW5ndGh9IFR5cGVTY3JpcHQgZmlsZXMgaW4gJHtkaXJQYXRofWApO1xuICAgIH1cbiAgICBmb3IgKGNvbnN0IHRzRmlsZSBvZiB0c0ZpbGVzKSB7XG4gICAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGguam9pbihkaXJQYXRoLCB0c0ZpbGUpO1xuICAgICAgdm9pZCBwcm9taXNlUG9vbC5ydW4oYXN5bmMgKCkgPT4ge1xuICAgICAgICBjb25zdCBvbGRDb250ZW50ID0gYXdhaXQgZnNVdGlsLnJlYWRGaWxlSWZFeGlzdHMoZmlsZVBhdGgpO1xuICAgICAgICBpZiAob2xkQ29udGVudCA9PT0gdW5kZWZpbmVkKSByZXR1cm47XG4gICAgICAgIGxldCBuZXdDb250ZW50ID0gZml4VHlwb3NJbkNvZGUob2xkQ29udGVudCk7XG4gICAgICAgIG5ld0NvbnRlbnQgPSByZXBsYWNlV2l0aENvbmZpZyhuZXdDb250ZW50LCBwYWNrYWdlQ29uZmlnLCAndHMnKTtcblxuICAgICAgICBpZiAob2xkQ29udGVudCAhPT0gbmV3Q29udGVudCkge1xuICAgICAgICAgIGF3YWl0IGZzVXRpbC5nZW5lcmF0ZUZpbGUoZmlsZVBhdGgsIG5ld0NvbnRlbnQpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBjb25zdCB0ZXh0QmFzZWRGaWxlcyA9IGF3YWl0IGZnLmdsb2IoJyoqLyoue2NzdixodG0saHRtbCx0c3YseG1sLHlhbWwseW1sfScsIHtcbiAgICAgIGRvdDogdHJ1ZSxcbiAgICAgIGN3ZDogZGlyUGF0aCxcbiAgICAgIGlnbm9yZTogZ2xvYklnbm9yZSxcbiAgICB9KTtcbiAgICBpZiAob3B0aW9ucy5pc1ZlcmJvc2UpIHtcbiAgICAgIGNvbnNvbGUuaW5mbyhgRm91bmQgJHt0ZXh0QmFzZWRGaWxlcy5sZW5ndGh9IHRleHQtYmFzZWQgZmlsZXMgaW4gJHtkaXJQYXRofWApO1xuICAgIH1cbiAgICBmb3IgKGNvbnN0IGZpbGUgb2YgdGV4dEJhc2VkRmlsZXMpIHtcbiAgICAgIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5qb2luKGRpclBhdGgsIGZpbGUpO1xuICAgICAgdm9pZCBwcm9taXNlUG9vbC5ydW4oYXN5bmMgKCkgPT4ge1xuICAgICAgICBjb25zdCBvbGRDb250ZW50ID0gYXdhaXQgZnNVdGlsLnJlYWRGaWxlSWZFeGlzdHMoZmlsZVBhdGgpO1xuICAgICAgICBpZiAob2xkQ29udGVudCA9PT0gdW5kZWZpbmVkKSByZXR1cm47XG4gICAgICAgIGxldCBuZXdDb250ZW50ID0gZml4VHlwb3NJblRleHQob2xkQ29udGVudCk7XG4gICAgICAgIG5ld0NvbnRlbnQgPSByZXBsYWNlV2l0aENvbmZpZyhuZXdDb250ZW50LCBwYWNrYWdlQ29uZmlnLCAndGV4dCcpO1xuXG4gICAgICAgIGlmIChvbGRDb250ZW50ICE9PSBuZXdDb250ZW50KSB7XG4gICAgICAgICAgYXdhaXQgZnNVdGlsLmdlbmVyYXRlRmlsZShmaWxlUGF0aCwgbmV3Q29udGVudCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGF3YWl0IHByb21pc2VQb29sLnByb21pc2VBbGwoKTtcbiAgfSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBmaXhUeXBvc0luVGV4dChjb250ZW50OiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gY29udGVudFxuICAgIC5yZXBsYWNlQWxsKC9cXGJjXFwuZlxcLig/PVxcc3wkKS9nLCAnY2YuJylcbiAgICAucmVwbGFjZUFsbCgvXFxiZWdcXC4oPz1cXHN8JCkvZywgJ2UuZy4nKVxuICAgIC5yZXBsYWNlQWxsKC9cXGJpZVxcLig/PVxccykvZywgJ2kuZS4nKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGZpeFR5cG9zSW5Db2RlKGNvbnRlbnQ6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiAoXG4gICAgY29udGVudFxuICAgICAgLnJlcGxhY2VBbGwoL1xcL1xcKltcXHNcXFNdKj9cXCpcXC8vZywgKGNvbW1lbnQpID0+IGZpeFR5cG9zSW5UZXh0KGNvbW1lbnQpKVxuICAgICAgLy8gVGhlIHdvcmQgYm91bmRhcnkgYW5kIHRyYWlsaW5nLXdoaXRlc3BhY2UgZ3VhcmQga2VlcCB3b3JkcyBtZXJlbHkgZW5kaW5nIGluIHRoZVxuICAgICAgLy8gYWJicmV2aWF0aW9uIGxldHRlcnMgKGUuZy4gXCJjb29raWUuXCIsIFwibGVnLlwiKSBpbnRhY3QuXG4gICAgICAucmVwbGFjZUFsbCgvKF58XFxzKVxcL1xcLyguKj8pXFxiY1xcLmZcXC4oPz1cXHN8JCkvZywgJyQxLy8kMmNmLicpXG4gICAgICAucmVwbGFjZUFsbCgvKF58XFxzKVxcL1xcLyguKj8pXFxiZWdcXC4oPz1cXHN8JCkvZywgJyQxLy8kMmUuZy4nKVxuICAgICAgLnJlcGxhY2VBbGwoLyhefFxccylcXC9cXC8oLio/KVxcYmllXFwuKD89XFxzfCQpL2csICckMS8vJDJpLmUuJylcbiAgKTtcbn1cblxuZnVuY3Rpb24gcmVwbGFjZVdpdGhDb25maWcobmV3Q29udGVudDogc3RyaW5nLCBwYWNrYWdlQ29uZmlnOiBQYWNrYWdlQ29uZmlnLCBwcm9wTmFtZTogJ2RvYycgfCAndHMnIHwgJ3RleHQnKTogc3RyaW5nIHtcbiAgZm9yIChjb25zdCBbYmVmb3JlLCBhZnRlcl0gb2YgT2JqZWN0LmVudHJpZXMocGFja2FnZUNvbmZpZy53YmZ5SnNvbj8udHlwb3M/LmFsbCA/PyB7fSkpIHtcbiAgICBuZXdDb250ZW50ID0gbmV3Q29udGVudC5yZXBsYWNlQWxsKGJlZm9yZSwgYWZ0ZXIpO1xuICB9XG4gIGZvciAoY29uc3QgW2JlZm9yZSwgYWZ0ZXJdIG9mIE9iamVjdC5lbnRyaWVzKHBhY2thZ2VDb25maWcud2JmeUpzb24/LnR5cG9zPy5bcHJvcE5hbWVdID8/IHt9KSkge1xuICAgIG5ld0NvbnRlbnQgPSBuZXdDb250ZW50LnJlcGxhY2VBbGwoYmVmb3JlLCBhZnRlcik7XG4gIH1cbiAgcmV0dXJuIG5ld0NvbnRlbnQ7XG59XG4iLCJpbXBvcnQgY2hpbGRQcm9jZXNzIGZyb20gJ25vZGU6Y2hpbGRfcHJvY2Vzcyc7XG5cbmltcG9ydCB7IE9jdG9raXQgfSBmcm9tICdAb2N0b2tpdC9jb3JlJztcblxuY2xhc3MgR2l0SHViVXRpbCB7XG4gIGdldE9yZ0FuZE5hbWUodXJsT3JGdWxsTmFtZTogc3RyaW5nKTogW3N0cmluZywgc3RyaW5nXSB7XG4gICAgY29uc3QgdXJsV2l0aG91dFByb3RvY29sID0gdXJsT3JGdWxsTmFtZS5zcGxpdCgnOicpLmF0KC0xKTtcbiAgICBjb25zdCBuYW1lcyA9IHVybFdpdGhvdXRQcm90b2NvbD8uc3BsaXQoJy8nKTtcbiAgICBjb25zdCBvcmcgPSBuYW1lcz8uYXQoLTIpID8/ICcnO1xuICAgIC8vIFRoZSBkb3QgbXVzdCBiZSBlc2NhcGVkOiBhbiB1bmVzY2FwZWQgYC5gIG1hdGNoZXMgQU5ZIGNoYXJhY3Rlciwgc28gYGxlZ2l0YCBsb3N0IGl0cyBgbGAgYW5kIGBlYC5cbiAgICBjb25zdCBuYW1lID0gbmFtZXM/LmF0KC0xKT8ucmVwbGFjZSgvXFwuZ2l0JC91LCAnJykgPz8gJyc7XG4gICAgcmV0dXJuIFtvcmcsIG5hbWVdO1xuICB9XG59XG5leHBvcnQgY29uc3QgZ2l0SHViVXRpbCA9IG5ldyBHaXRIdWJVdGlsKCk7XG5cbmV4cG9ydCBmdW5jdGlvbiBpc0dpdEh1YlBlcm1pc3Npb25PclZpc2liaWxpdHlFcnJvcihlcnJvcjogdW5rbm93bik6IGJvb2xlYW4ge1xuICBpZiAoIWVycm9yIHx8IHR5cGVvZiBlcnJvciAhPT0gJ29iamVjdCcpIHJldHVybiBmYWxzZTtcbiAgY29uc3Qgc3RhdHVzID0gKGVycm9yIGFzIHsgc3RhdHVzPzogbnVtYmVyIH0pLnN0YXR1cztcbiAgcmV0dXJuIHN0YXR1cyA9PT0gNDAxIHx8IHN0YXR1cyA9PT0gNDAzIHx8IHN0YXR1cyA9PT0gNDA0O1xufVxuXG5jb25zdCBvY3Rva2l0Q2FjaGUgPSBuZXcgTWFwPHN0cmluZywgT2N0b2tpdD4oKTtcblxuZXhwb3J0IGZ1bmN0aW9uIGdldE9jdG9raXQob3duZXI/OiBzdHJpbmcpOiBPY3Rva2l0IHtcbiAgLy8gR2l0SHViIG93bmVyIG5hbWVzIGFyZSBjYXNlLWluc2Vuc2l0aXZlLCBzbyBjcmVkZW50aWFsIHNlbGVjdGlvbiAoYW5kIHRoZSBjYWNoZSBrZXkpIG11c3RcbiAgLy8gbm90IGRlcGVuZCBvbiBob3cgYSByZW1vdGUgVVJMIGhhcHBlbnMgdG8gc3BlbGwgdGhlIG9yZ2FuaXphdGlvbi5cbiAgY29uc3Qga2V5ID0gb3duZXI/LnRvTG93ZXJDYXNlKCkgPz8gJyc7XG4gIGNvbnN0IGNhY2hlZCA9IG9jdG9raXRDYWNoZS5nZXQoa2V5KTtcbiAgaWYgKGNhY2hlZCkgcmV0dXJuIGNhY2hlZDtcblxuICBjb25zdCBvY3Rva2l0ID0gbmV3IE9jdG9raXQoe1xuICAgIGF1dGg6IGdldEdpdEh1YlRva2VuKG93bmVyKSB8fCB1bmRlZmluZWQsXG4gIH0pO1xuICBvY3Rva2l0Q2FjaGUuc2V0KGtleSwgb2N0b2tpdCk7XG4gIHJldHVybiBvY3Rva2l0O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaGFzR2l0SHViVG9rZW4ob3duZXI6IHN0cmluZyk6IGJvb2xlYW4ge1xuICByZXR1cm4gISFnZXRHaXRIdWJUb2tlbihvd25lcik7XG59XG5cbmZ1bmN0aW9uIGdldEdpdEh1YlRva2VuKG93bmVyPzogc3RyaW5nKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgLy8gQ2FzZS1pbnNlbnNpdGl2ZSBvbiBwdXJwb3NlOiBhIG5vbmNhbm9uaWNhbGx5IGNhc2VkIHJlbW90ZSAoZS5nLiBnaXRodWIuY29tL3dpbGxib29zdGVybGFiL+KApilcbiAgLy8gbXVzdCBzdGlsbCBzZWxlY3QgdGhlIG9yZ2FuaXphdGlvbidzIG93biBQQVQg4oCUIGZhbGxpbmcgdGhyb3VnaCB0byB0aGUgZ2VuZXJpYyBicmFuY2ggd291bGRcbiAgLy8gcHJlZmVyIHRoZSBPVEhFUiBvcmdhbml6YXRpb24ncyBQQVQsIHdoaWNoIGNhbm5vdCByZWFkIHRoaXMgb3JnYW5pemF0aW9uJ3MgcHJpdmF0ZVxuICAvLyByZXBvc2l0b3JpZXMuXG4gIGNvbnN0IG5vcm1hbGl6ZWRPd25lciA9IG93bmVyPy50b0xvd2VyQ2FzZSgpO1xuICBpZiAobm9ybWFsaXplZE93bmVyID09PSAnd2lsbGJvb3N0ZXInKSB7XG4gICAgcmV0dXJuIHByb2Nlc3MuZW52LkdIX0JPVF9QQVRfRk9SX1dJTExCT09TVEVSIHx8IGdldEdpdEh1YkNsaVRva2VuKCk7XG4gIH1cbiAgaWYgKG5vcm1hbGl6ZWRPd25lciA9PT0gJ3dpbGxib29zdGVybGFiJykge1xuICAgIHJldHVybiBwcm9jZXNzLmVudi5HSF9CT1RfUEFUX0ZPUl9XSUxMQk9PU1RFUkxBQiB8fCBnZXRHaXRIdWJDbGlUb2tlbigpO1xuICB9XG4gIHJldHVybiAoXG4gICAgcHJvY2Vzcy5lbnYuR0hfQk9UX1BBVF9GT1JfV0lMTEJPT1NURVIgfHxcbiAgICBwcm9jZXNzLmVudi5HSF9CT1RfUEFUX0ZPUl9XSUxMQk9PU1RFUkxBQiB8fFxuICAgIHByb2Nlc3MuZW52LkdIX1RPS0VOIHx8XG4gICAgcHJvY2Vzcy5lbnYuR0lUSFVCX1RPS0VOIHx8XG4gICAgZ2V0R2l0SHViQ2xpVG9rZW4oKVxuICApO1xufVxuXG5sZXQgZ2l0SHViQ2xpVG9rZW46IHN0cmluZyB8IHVuZGVmaW5lZDtcblxuZnVuY3Rpb24gZ2V0R2l0SHViQ2xpVG9rZW4oKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgaWYgKGdpdEh1YkNsaVRva2VuICE9PSB1bmRlZmluZWQpIHJldHVybiBnaXRIdWJDbGlUb2tlbiB8fCB1bmRlZmluZWQ7XG5cbiAgdHJ5IHtcbiAgICAvLyBTb21lIGxvY2FsIHJ1bnMgcmVseSBvbiBHaXRIdWIgQ0xJIGF1dGhlbnRpY2F0aW9uIGluc3RlYWQgb2YgZXhwb3J0ZWQgZW52IHRva2Vucy5cbiAgICBnaXRIdWJDbGlUb2tlbiA9XG4gICAgICBjaGlsZFByb2Nlc3NcbiAgICAgICAgLmV4ZWNGaWxlU3luYygnZ2gnLCBbJ2F1dGgnLCAndG9rZW4nXSwge1xuICAgICAgICAgIGVuY29kaW5nOiAndXRmOCcsXG4gICAgICAgICAgc3RkaW86IFsnaWdub3JlJywgJ3BpcGUnLCAnaWdub3JlJ10sXG4gICAgICAgIH0pXG4gICAgICAgIC50cmltKCkgfHwgJyc7XG4gIH0gY2F0Y2gge1xuICAgIGdpdEh1YkNsaVRva2VuID0gJyc7XG4gIH1cbiAgcmV0dXJuIGdpdEh1YkNsaVRva2VuIHx8IHVuZGVmaW5lZDtcbn1cbiIsImltcG9ydCB0eXBlIHsgUGFyc2VFcnJvciB9IGZyb20gJ2pzb25jLXBhcnNlcic7XG5pbXBvcnQgeyBhcHBseUVkaXRzLCBjcmVhdGVTY2FubmVyLCBmaW5kTm9kZUF0TG9jYXRpb24sIG1vZGlmeSwgcGFyc2UgYXMgcGFyc2VKc29uYywgcGFyc2VUcmVlIH0gZnJvbSAnanNvbmMtcGFyc2VyJztcblxuLy8ganNvbmMtcGFyc2VyIGRlY2xhcmVzIFN5bnRheEtpbmQvU2NhbkVycm9yIGFzIGFtYmllbnQgY29uc3QgZW51bXMsIHdoaWNoIGNhbm5vdCBiZSBpbXBvcnRlZFxuLy8gdW5kZXIgdmVyYmF0aW1Nb2R1bGVTeW50YXg7IG1pcnJvciB0aGUgbmVlZGVkIG1lbWJlciB2YWx1ZXMgbG9jYWxseS5cbmNvbnN0IHN5bnRheEtpbmQgPSB7IGxpbmVDb21tZW50VHJpdmlhOiAxMiwgYmxvY2tDb21tZW50VHJpdmlhOiAxMywgbGluZUJyZWFrVHJpdmlhOiAxNCwgdHJpdmlhOiAxNSwgZW9mOiAxNyB9O1xuY29uc3Qgc2NhbkVycm9yTm9uZSA9IDA7XG5cbmV4cG9ydCBjb25zdCBqc29uY1V0aWwgPSB7XG4gIC8qKlxuICAgKiBUZWxscyB3aGV0aGVyIHRoZSBjb250ZW50IGhvbGRzIG5vIGNvbmZpZ3VyYXRpb24gYXQgYWxsIOKAlCBvbmx5IHdoaXRlc3BhY2UsIGNvbXBsZXRlIGNvbW1lbnRzLFxuICAgKiBhbmQvb3IgYSBCT00uIHRzYyB0cmVhdHMgc3VjaCBhIHRzY29uZmlnLmpzb24gYXMgYW4gZW1wdHkgY29uZmlnLCBzbyBnZW5lcmF0b3JzIHNob3VsZCB0cmVhdFxuICAgKiBpdCBsaWtlIGEgbWlzc2luZyBmaWxlIChhbmQgZ2VuZXJhdGUgZGVmYXVsdHMpIGluc3RlYWQgb2YgcmVmdXNpbmcgdG8gbWFuYWdlIGl0LiBMZXhpY2FsbHlcbiAgICogYnJva2VuIHRyaXZpYSAoZS5nLiBhbiB1bnRlcm1pbmF0ZWQgYmxvY2sgY29tbWVudCkgaXMgTk9UIHRyaXZpYS1vbmx5OiB0aGUgZmlsZSBtdXN0IGJlIGxlZnRcbiAgICogdW50b3VjaGVkIHJhdGhlciB0aGFuIG92ZXJ3cml0dGVuIHdpdGggZGVmYXVsdHMuXG4gICAqL1xuICBpc1RyaXZpYU9ubHkoY29udGVudDogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgY29uc3Qgc2Nhbm5lciA9IGNyZWF0ZVNjYW5uZXIoY29udGVudC5yZXBsYWNlKC9eXFx1RkVGRi8sICcnKSk7XG4gICAgZm9yIChsZXQga2luZDogbnVtYmVyID0gc2Nhbm5lci5zY2FuKCk7IGtpbmQgIT09IHN5bnRheEtpbmQuZW9mOyBraW5kID0gc2Nhbm5lci5zY2FuKCkpIHtcbiAgICAgIGlmIChcbiAgICAgICAgKHNjYW5uZXIuZ2V0VG9rZW5FcnJvcigpIGFzIG51bWJlcikgIT09IHNjYW5FcnJvck5vbmUgfHxcbiAgICAgICAgKGtpbmQgIT09IHN5bnRheEtpbmQubGluZUNvbW1lbnRUcml2aWEgJiZcbiAgICAgICAgICBraW5kICE9PSBzeW50YXhLaW5kLmJsb2NrQ29tbWVudFRyaXZpYSAmJlxuICAgICAgICAgIGtpbmQgIT09IHN5bnRheEtpbmQudHJpdmlhICYmXG4gICAgICAgICAga2luZCAhPT0gc3ludGF4S2luZC5saW5lQnJlYWtUcml2aWEpXG4gICAgICApIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfSxcbiAgLyoqXG4gICAqIFBhcnNlcyBhIEpTT05DIChKU09OIHdpdGggY29tbWVudHMpIG9iamVjdCBmcm9tIGNvbmZpZyBmaWxlcyBzdWNoIGFzIHRzY29uZmlnLmpzb24sXG4gICAqIHB5cmlnaHRjb25maWcuanNvbiwgcmVub3ZhdGUuanNvbiwgLnZzY29kZS9zZXR0aW5ncy5qc29uLCBhbmQgd3JhbmdsZXIuanNvbmMuXG4gICAqXG4gICAqIGpzb25jLXBhcnNlciBpcyBmYXVsdCB0b2xlcmFudCBhbmQgcmV0dXJucyBhIHBhcnRpYWwgb2JqZWN0IGZvciBtYWxmb3JtZWQgaW5wdXQsIHdoaWNoIG11c3RcbiAgICogbm90IGJlIHRyZWF0ZWQgYXMgdGhlIGZpbGUncyBjb25maWd1cmF0aW9uOyByZWplY3QgYW55IHBhcnNlIGVycm9yIGluc3RlYWQuIEEgbGVhZGluZyBCT00gaXNcbiAgICogc3RyaXBwZWQgYmVjYXVzZSBUeXBlU2NyaXB0IGFjY2VwdHMgQk9NJ2QgY29uZmlnIGZpbGVzIHdoaWxlIGpzb25jLXBhcnNlciByZXBvcnRzIHRoZSBCT00gYXNcbiAgICogYSBwYXJzZSBlcnJvci4gQ2FsbGVycyB3aG9zZSByZWFkZXIgcmVqZWN0cyB0cmFpbGluZyBjb21tYXMgdHVybiBgYWxsb3dUcmFpbGluZ0NvbW1hYFxuICAgKiBvZmYgc28gc3VjaCBhIGZpbGUgaXMgcmVwb3J0ZWQgYXMgbWFsZm9ybWVkIGhlcmUgdG9vLlxuICAgKi9cbiAgcGFyc2VPYmplY3RJZ25vcmluZ0Vycm9yPFQgZXh0ZW5kcyBvYmplY3Q+KGNvbnRlbnQ6IHN0cmluZywgYWxsb3dUcmFpbGluZ0NvbW1hID0gdHJ1ZSk6IFQgfCB1bmRlZmluZWQge1xuICAgIGNvbnN0IHBhcnNlRXJyb3JzOiBQYXJzZUVycm9yW10gPSBbXTtcbiAgICBjb25zdCB2YWx1ZSA9IHBhcnNlSnNvbmMoY29udGVudC5yZXBsYWNlKC9eXFx1RkVGRi8sICcnKSwgcGFyc2VFcnJvcnMsIHsgYWxsb3dUcmFpbGluZ0NvbW1hIH0pIGFzIFQgfCB1bmRlZmluZWQ7XG4gICAgcmV0dXJuIHBhcnNlRXJyb3JzLmxlbmd0aCA9PT0gMCAmJiAhIXZhbHVlICYmIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiYgIUFycmF5LmlzQXJyYXkodmFsdWUpXG4gICAgICA/IHZhbHVlXG4gICAgICA6IHVuZGVmaW5lZDtcbiAgfSxcbiAgLyoqIFRlbGxzIHdoZXRoZXIgdGhlIGNvbnRlbnQgY2FycmllcyBhdCBsZWFzdCBvbmUgY29tbWVudCwgaS5lLiBjb250ZW50IEpTT04uc3RyaW5naWZ5IHdvdWxkIGRyb3AuICovXG4gIGNvbnRhaW5zQ29tbWVudChjb250ZW50OiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICBjb25zdCBzY2FubmVyID0gY3JlYXRlU2Nhbm5lcihjb250ZW50LnJlcGxhY2UoL15cXHVGRUZGLywgJycpKTtcbiAgICBmb3IgKGxldCBraW5kOiBudW1iZXIgPSBzY2FubmVyLnNjYW4oKTsga2luZCAhPT0gc3ludGF4S2luZC5lb2Y7IGtpbmQgPSBzY2FubmVyLnNjYW4oKSkge1xuICAgICAgLy8gQSBsZXhpY2FsIGVycm9yIG1lYW5zIHRoZSByZW1haW5pbmcgdG9rZW5zIGFyZSB1bnJlbGlhYmxlOyByZXBvcnQgbm8gY29tbWVudCByYXRoZXIgdGhhblxuICAgICAgLy8gZ3Vlc3NpbmcuIEEgY2FsbGVyIHRoYXQgb25seSB3YXJucyBhYm91dCBkcm9wcGVkIGNvbW1lbnRzIGxvc2VzIG5vdGhpbmcsIGFuZCBvbmUgdGhhdFxuICAgICAgLy8gcmVmdXNlcyBhIGNvbW1lbnRlZCBmaWxlIGZvciBhIHN0cmljdC1KU09OIHJlYWRlciBzdGlsbCByZWplY3RzIHN1Y2ggY29udGVudCB3aGVuIGl0XG4gICAgICAvLyBwYXJzZXMgaXQuXG4gICAgICBpZiAoKHNjYW5uZXIuZ2V0VG9rZW5FcnJvcigpIGFzIG51bWJlcikgIT09IHNjYW5FcnJvck5vbmUpIHJldHVybiBmYWxzZTtcbiAgICAgIGlmIChraW5kID09PSBzeW50YXhLaW5kLmxpbmVDb21tZW50VHJpdmlhIHx8IGtpbmQgPT09IHN5bnRheEtpbmQuYmxvY2tDb21tZW50VHJpdmlhKSByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9LFxuICAvKipcbiAgICogU2VyaWFsaXplcyBgc2V0dGluZ3NgIGludG8gYG9sZENvbnRlbnRgLCBlZGl0aW5nIG9ubHkgdGhlIHRvcC1sZXZlbCBwcm9wZXJ0aWVzIHdob3NlIHZhbHVlc1xuICAgKiBjaGFuZ2VkIHNvIHRoZSBjb21tZW50cyBhbmQgZm9ybWF0dGluZyBvZiBhbiBleGlzdGluZyBmaWxlIHN1cnZpdmUuIENhbGxlcnMgbmV2ZXIgZHJvcFxuICAgKiBwcm9wZXJ0aWVzIChnZW5lcmF0ZWQgc2V0dGluZ3MgYXJlIG1lcmdlZCBPTiBUT1Agb2YgdGhlIGV4aXN0aW5nIG9uZXMpLCBzbyByZW1vdmFscyBhcmUgbm90XG4gICAqIGhhbmRsZWQ6IGEgcHJvcGVydHkgbWlzc2luZyBmcm9tIGBzZXR0aW5nc2AgaXMgbGVmdCB1bnRvdWNoZWQgcmF0aGVyIHRoYW4gZGVsZXRlZC5cbiAgICpcbiAgICogVHJpdmlhLW9ubHkgY29udGVudCBrZWVwcyBpdHMgY29tbWVudHMgYXMgYSBoZWFkZXIgYWJvdmUgdGhlIGdlbmVyYXRlZCBvYmplY3QsIHJhdGhlciB0aGFuXG4gICAqIGJlaW5nIHJlcGxhY2VkIG91dHJpZ2h0IG9yIHJ1biB0aHJvdWdoIG1vZGlmeSgpICh3aGljaCB3b3VsZCBtb3ZlIHRoZSBvYmplY3QgaW4gZnJvbnQgb2YgdGhlbSkuXG4gICAqL1xuICBzdHJpbmdpZnlQcmVzZXJ2aW5nVHJpdmlhKFxuICAgIG9sZENvbnRlbnQ6IHN0cmluZyB8IHVuZGVmaW5lZCxcbiAgICBzZXR0aW5nczogUmVjb3JkPHN0cmluZywgdW5rbm93bj5cbiAgKTogeyBjb250ZW50OiBzdHJpbmc7IGtleXNMb3NpbmdDb21tZW50czogc3RyaW5nW10gfSB7XG4gICAgaWYgKG9sZENvbnRlbnQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuIHsgY29udGVudDogSlNPTi5zdHJpbmdpZnkoc2V0dGluZ3MsIHVuZGVmaW5lZCwgMiksIGtleXNMb3NpbmdDb21tZW50czogW10gfTtcbiAgICB9XG5cbiAgICBjb25zdCBvbGRTZXR0aW5ncyA9IGpzb25jVXRpbC5wYXJzZU9iamVjdElnbm9yaW5nRXJyb3I8UmVjb3JkPHN0cmluZywgdW5rbm93bj4+KG9sZENvbnRlbnQpO1xuICAgIC8vIERyb3AgYSBsZWFkaW5nIEJPTTogbW9kaWZ5KCkgaW5zZXJ0cyB0aGUgZ2VuZXJhdGVkIG9iamVjdCBCRUZPUkUgYW55IGxlYWRpbmcgdHJpdmlhLCB3aGljaFxuICAgIC8vIHdvdWxkIGxlYXZlIHRoZSBCT00gc3RyYW5kZWQgbWlkLWZpbGUgd2hlcmUgaXQgaXMgYSBzeW50YXggZXJyb3IgcmF0aGVyIHRoYW4gYW4gaWdub3JlZCBtYXJrLlxuICAgIGxldCBjb250ZW50ID0gb2xkQ29udGVudC5yZXBsYWNlKC9eXFx1RkVGRi8sICcnKTtcbiAgICBpZiAoanNvbmNVdGlsLmlzVHJpdmlhT25seShjb250ZW50KSkge1xuICAgICAgY29uc3QgaGVhZGVyID0gY29udGVudC50cmltKCk7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBjb250ZW50OiBgJHtoZWFkZXIgPyBoZWFkZXIgKyAnXFxuJyA6ICcnfSR7SlNPTi5zdHJpbmdpZnkoc2V0dGluZ3MsIHVuZGVmaW5lZCwgMil9YCxcbiAgICAgICAga2V5c0xvc2luZ0NvbW1lbnRzOiBbXSxcbiAgICAgIH07XG4gICAgfVxuICAgIGNvbnN0IG1vZGlmeU9wdGlvbnMgPSB7IGZvcm1hdHRpbmdPcHRpb25zOiBkZXRlY3RGb3JtYXR0aW5nT3B0aW9ucyhjb250ZW50KSB9O1xuICAgIGNvbnN0IGtleXNMb3NpbmdDb21tZW50czogc3RyaW5nW10gPSBbXTtcbiAgICBjb25zdCBuZXdFbnRyaWVzOiBbc3RyaW5nLCB1bmtub3duXVtdID0gW107XG4gICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMoc2V0dGluZ3MpKSB7XG4gICAgICBjb25zdCBvbGRWYWx1ZSA9IG9sZFNldHRpbmdzPy5ba2V5XTtcbiAgICAgIC8vIENvbXBhcmUgc2VyaWFsaXplZCBmb3JtcyBzbyBkZWVwLWVxdWFsIHZhbHVlcyAoZS5nLiBhIHJlLW1lcmdlZCBgZXh0ZW5kc2AgYXJyYXkpIGRvIG5vdFxuICAgICAgLy8gcmV3cml0ZSB0aGUgcHJvcGVydHkgYW5kIHJlZmxvdyBpdHMgZm9ybWF0dGluZy5cbiAgICAgIGlmIChKU09OLnN0cmluZ2lmeShvbGRWYWx1ZSkgPT09IEpTT04uc3RyaW5naWZ5KHZhbHVlKSkgY29udGludWU7XG4gICAgICBpZiAob2xkVmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICBuZXdFbnRyaWVzLnB1c2goW2tleSwgdmFsdWVdKTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICAvLyBSZXBsYWNpbmcgYSB3aG9sZSBhcnJheSB3b3VsZCBkaXNjYXJkIHRoZSBjb21tZW50cyBiZXR3ZWVuIGl0cyBlbGVtZW50cywgc28gZ3JvdyBpdCB3aXRoXG4gICAgICAvLyBwZXItZWxlbWVudCBpbnNlcnRpb25zIHdoZW5ldmVyIHRoZSBuZXcgdmFsdWUgb25seSBhZGRzIHRvIGl0LlxuICAgICAgY29uc3QgaW5zZXJ0aW9ucyA9IEFycmF5LmlzQXJyYXkob2xkVmFsdWUpICYmIEFycmF5LmlzQXJyYXkodmFsdWUpID8gZmluZEluc2VydGlvbnMob2xkVmFsdWUsIHZhbHVlKSA6IHVuZGVmaW5lZDtcbiAgICAgIGZvciAoY29uc3QgaW5zZXJ0aW9uIG9mIGluc2VydGlvbnMgPz8gW10pIHtcbiAgICAgICAgY29udGVudCA9IGFwcGx5RWRpdHMoXG4gICAgICAgICAgY29udGVudCxcbiAgICAgICAgICBtb2RpZnkoY29udGVudCwgW2tleSwgaW5zZXJ0aW9uLmluZGV4XSwgaW5zZXJ0aW9uLnZhbHVlLCB7IC4uLm1vZGlmeU9wdGlvbnMsIGlzQXJyYXlJbnNlcnRpb246IHRydWUgfSlcbiAgICAgICAgKTtcbiAgICAgICAgY29udGVudCA9IHJlc3RvcmVUcmFpbGluZ0NvbW1lbnQoY29udGVudCwga2V5LCBpbnNlcnRpb24uaW5kZXgpO1xuICAgICAgfVxuICAgICAgaWYgKGluc2VydGlvbnMpIGNvbnRpbnVlO1xuICAgICAgLy8gUmV3cml0aW5nIHRoZSB3aG9sZSB2YWx1ZSBpcyB0aGUgb25seSBvcHRpb24gbGVmdCAodGhlIG5ldyBvbmUgZHJvcHMgb3IgcmVvcmRlcnMgZWxlbWVudHMpLFxuICAgICAgLy8gYW5kIGl0IHRha2VzIGFueSBjb21tZW50IG5lc3RlZCBpbnNpZGUgaXQgYWxvbmcuIFJlcG9ydCB0aGF0IHJhdGhlciB0aGFuIGxvc2luZyBpdCBxdWlldGx5LlxuICAgICAgY29uc3QgcmVwbGFjZWRUZXh0ID0gdmFsdWVUZXh0T2YoY29udGVudCwga2V5KTtcbiAgICAgIGlmIChyZXBsYWNlZFRleHQgIT09IHVuZGVmaW5lZCAmJiBqc29uY1V0aWwuY29udGFpbnNDb21tZW50KHJlcGxhY2VkVGV4dCkpIGtleXNMb3NpbmdDb21tZW50cy5wdXNoKGtleSk7XG4gICAgICBjb250ZW50ID0gYXBwbHlFZGl0cyhjb250ZW50LCBtb2RpZnkoY29udGVudCwgW2tleV0sIHZhbHVlLCBtb2RpZnlPcHRpb25zKSk7XG4gICAgfVxuICAgIC8vIFByZXBlbmQgcmF0aGVyIHRoYW4gYXBwZW5kIHRoZSBwcm9wZXJ0aWVzIHRoYXQgYXJlIG5ldzogYXBwZW5kaW5nIGRldGFjaGVzIGEgdHJhaWxpbmdcbiAgICAvLyBzYW1lLWxpbmUgY29tbWVudCBmcm9tIHRoZSBsYXN0IHByb3BlcnR5LCBsZWF2aW5nIGl0IHRvIGRlc2NyaWJlIHRoZSBnZW5lcmF0ZWQgdmFsdWVcbiAgICAvLyBpbnN0ZWFkLiBJbnNlcnRpbmcgaW4gcmV2ZXJzZSBrZWVwcyB0aGUgb3JkZXIgdGhlIHNldHRpbmdzIGRlY2xhcmUgdGhlbSBpbi5cbiAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBuZXdFbnRyaWVzLnRvUmV2ZXJzZWQoKSkge1xuICAgICAgY29udGVudCA9IGFwcGx5RWRpdHMoY29udGVudCwgbW9kaWZ5KGNvbnRlbnQsIFtrZXldLCB2YWx1ZSwgeyAuLi5tb2RpZnlPcHRpb25zLCBnZXRJbnNlcnRpb25JbmRleDogKCkgPT4gMCB9KSk7XG4gICAgfVxuICAgIHJldHVybiB7IGNvbnRlbnQsIGtleXNMb3NpbmdDb21tZW50cyB9O1xuICB9LFxufTtcblxuLyoqIFJldHVybnMgdGhlIHNvdXJjZSB0ZXh0IG9mIGEgdG9wLWxldmVsIHByb3BlcnR5J3MgdmFsdWUsIGNvbW1lbnRzIGFuZCBhbGwuICovXG5mdW5jdGlvbiB2YWx1ZVRleHRPZihjb250ZW50OiBzdHJpbmcsIGtleTogc3RyaW5nKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgY29uc3Qgcm9vdCA9IHBhcnNlVHJlZShjb250ZW50KTtcbiAgY29uc3Qgbm9kZSA9IHJvb3QgJiYgZmluZE5vZGVBdExvY2F0aW9uKHJvb3QsIFtrZXldKTtcbiAgcmV0dXJuIG5vZGUgJiYgY29udGVudC5zbGljZShub2RlLm9mZnNldCwgbm9kZS5vZmZzZXQgKyBub2RlLmxlbmd0aCk7XG59XG5cbi8vIFRoZSB3aG9sZSBzYW1lLWxpbmUgY29tbWVudCBzZXF1ZW5jZSwgbm90IGp1c3QgdGhlIGZpcnN0IG9uZTogYSBsaW5lIGNvbW1lbnQgZW5kcyBpdCAoaXQgcnVucyB0b1xuLy8gdGhlIG5ld2xpbmUpLCBidXQgYW55IG51bWJlciBvZiBibG9jayBjb21tZW50cyBjYW4gcHJlY2VkZSBpdCwgYW5kIG1vdmluZyBvbmx5IHRoZSBmaXJzdCB3b3VsZFxuLy8gbGVhdmUgdGhlIHJlc3QgZGVzY3JpYmluZyB0aGUgd3JvbmcgZWxlbWVudC5cbmNvbnN0IHRyYWlsaW5nQ29tbWVudFBhdHRlcm4gPSAvXig/OlteXFxTXFxuXSpcXC9cXCpbXFxTXFxzXSo/XFwqXFwvKSooPzpbXlxcU1xcbl0qXFwvXFwvW15cXG5dKik/L3U7XG5cbi8qKlxuICogUmVhdHRhY2hlcyBhIHNhbWUtbGluZSBjb21tZW50IHRvIHRoZSBlbGVtZW50IGl0IGRlc2NyaWJlcy4gSW5zZXJ0aW5nIGludG8gYW4gYXJyYXkgcGxhY2VzIHRoZVxuICogbmV3IGVsZW1lbnQgQkVGT1JFIHRoZSB0cml2aWEgdGhhdCBmb2xsb3dzIGl0cyBwcmVkZWNlc3Nvciwgc28gYXBwZW5kaW5nIGFmdGVyXG4gKiBgeyAuLi4gfSAvLyB3aHkgdGhpcyBydWxlIGV4aXN0c2AgbGVhdmVzIHRoYXQgY29tbWVudCBleHBsYWluaW5nIHRoZSBnZW5lcmF0ZWQgZWxlbWVudCBpbnN0ZWFkLlxuICogQSBmcmVzaGx5IHNlcmlhbGl6ZWQgZWxlbWVudCBuZXZlciBjYXJyaWVzIGEgY29tbWVudCBvZiBpdHMgb3duLCBzbyBhbnl0aGluZyB0cmFpbGluZyB0aGVcbiAqIGluc2VydGlvbiBiZWxvbmdlZCB0byB0aGUgZWxlbWVudCBiZWZvcmUgaXQuXG4gKi9cbmZ1bmN0aW9uIHJlc3RvcmVUcmFpbGluZ0NvbW1lbnQoY29udGVudDogc3RyaW5nLCBrZXk6IHN0cmluZywgaW5zZXJ0ZWRJbmRleDogbnVtYmVyKTogc3RyaW5nIHtcbiAgaWYgKGluc2VydGVkSW5kZXggPT09IDApIHJldHVybiBjb250ZW50O1xuICBjb25zdCByb290ID0gcGFyc2VUcmVlKGNvbnRlbnQpO1xuICBjb25zdCBlbGVtZW50cyA9IChyb290ICYmIGZpbmROb2RlQXRMb2NhdGlvbihyb290LCBba2V5XSkpPy5jaGlsZHJlbjtcbiAgY29uc3QgaW5zZXJ0ZWQgPSBlbGVtZW50cz8uW2luc2VydGVkSW5kZXhdO1xuICBjb25zdCBwcmV2aW91cyA9IGVsZW1lbnRzPy5baW5zZXJ0ZWRJbmRleCAtIDFdO1xuICBpZiAoIWluc2VydGVkIHx8ICFwcmV2aW91cykgcmV0dXJuIGNvbnRlbnQ7XG4gIGNvbnN0IGluc2VydGVkRW5kID0gaW5zZXJ0ZWQub2Zmc2V0ICsgaW5zZXJ0ZWQubGVuZ3RoO1xuICBjb25zdCBjb21tZW50ID0gdHJhaWxpbmdDb21tZW50UGF0dGVybi5leGVjKGNvbnRlbnQuc2xpY2UoaW5zZXJ0ZWRFbmQpKT8uWzBdO1xuICBpZiAoIWNvbW1lbnQpIHJldHVybiBjb250ZW50O1xuICAvLyBMYW5kIHRoZSBjb21tZW50IGFmdGVyIHRoZSBzZXBhcmF0aW5nIGNvbW1hIHNvIHRoZSBlbGVtZW50IGtlZXBzIGl0cyBvd24gbGluZSBpbnRhY3QuXG4gIGNvbnN0IHByZXZpb3VzRW5kID0gcHJldmlvdXMub2Zmc2V0ICsgcHJldmlvdXMubGVuZ3RoO1xuICBjb25zdCByZXN0b3JlT2Zmc2V0ID0gcHJldmlvdXNFbmQgKyAoL15cXHMqLC91LmV4ZWMoY29udGVudC5zbGljZShwcmV2aW91c0VuZCkpPy5bMF0ubGVuZ3RoID8/IDApO1xuICByZXR1cm4gKFxuICAgIGNvbnRlbnQuc2xpY2UoMCwgcmVzdG9yZU9mZnNldCkgK1xuICAgIGNvbW1lbnQgK1xuICAgIGNvbnRlbnQuc2xpY2UocmVzdG9yZU9mZnNldCwgaW5zZXJ0ZWRFbmQpICtcbiAgICBjb250ZW50LnNsaWNlKGluc2VydGVkRW5kICsgY29tbWVudC5sZW5ndGgpXG4gICk7XG59XG5cbi8qKlxuICogTWlycm9ycyB0aGUgaW5kZW50YXRpb24gdGhlIGZpbGUgYWxyZWFkeSB1c2VzLCBzbyBhIHNlbWFudGljIGNoYW5nZSBkb2VzIG5vdCByZWluZGVudCB1bnJlbGF0ZWRcbiAqIGxpbmVzLiBUaGUgZmlyc3QgcHJvcGVydHkgaXMgbWVhc3VyZWQgcmF0aGVyIHRoYW4gdGhlIGZpcnN0IGluZGVudGVkIGxpbmUsIGJlY2F1c2UgYSBkZWNvcmF0ZWRcbiAqIGJsb2NrIGNvbW1lbnQgKGAgKiAuLi5gKSB3b3VsZCBvdGhlcndpc2UgcGFzcyBmb3IgdGhlIGZpbGUncyBpbmRlbnRhdGlvbi4gRmFsbHMgYmFjayB0byB0aGUgdHdvXG4gKiBzcGFjZXMgZXZlcnkgZ2VuZXJhdGVkIGNvbmZpZyB1c2VzLlxuICovXG5mdW5jdGlvbiBkZXRlY3RGb3JtYXR0aW5nT3B0aW9ucyhjb250ZW50OiBzdHJpbmcpOiB7IGluc2VydFNwYWNlczogYm9vbGVhbjsgdGFiU2l6ZTogbnVtYmVyIH0ge1xuICBjb25zdCBmaXJzdFByb3BlcnR5ID0gcGFyc2VUcmVlKGNvbnRlbnQpPy5jaGlsZHJlbj8uWzBdO1xuICBjb25zdCBpbmRlbnRhdGlvbiA9XG4gICAgZmlyc3RQcm9wZXJ0eSAmJiBjb250ZW50LnNsaWNlKGNvbnRlbnQubGFzdEluZGV4T2YoJ1xcbicsIGZpcnN0UHJvcGVydHkub2Zmc2V0KSArIDEsIGZpcnN0UHJvcGVydHkub2Zmc2V0KTtcbiAgaWYgKCFpbmRlbnRhdGlvbiB8fCAhL15bXFx0IF0rJC91LnRlc3QoaW5kZW50YXRpb24pKSByZXR1cm4geyBpbnNlcnRTcGFjZXM6IHRydWUsIHRhYlNpemU6IDIgfTtcbiAgaWYgKGluZGVudGF0aW9uLnN0YXJ0c1dpdGgoJ1xcdCcpKSByZXR1cm4geyBpbnNlcnRTcGFjZXM6IGZhbHNlLCB0YWJTaXplOiAxIH07XG4gIHJldHVybiB7IGluc2VydFNwYWNlczogdHJ1ZSwgdGFiU2l6ZTogaW5kZW50YXRpb24ubGVuZ3RoIH07XG59XG5cbi8qKlxuICogUmV0dXJucyB0aGUgZWxlbWVudHMgdG8gaW5zZXJ0IGludG8gYG9sZFZhbHVlYCB0byB0dXJuIGl0IGludG8gYG5ld1ZhbHVlYCwgb3IgdW5kZWZpbmVkIHdoZW5cbiAqIHRoYXQgaXMgaW1wb3NzaWJsZSBiZWNhdXNlIGBuZXdWYWx1ZWAgZHJvcHMgb3IgcmVvcmRlcnMgYW4gZXhpc3RpbmcgZWxlbWVudCAodGhlIGNhbGxlciBtdXN0XG4gKiB0aGVuIHJlcGxhY2UgdGhlIGFycmF5IHdob2xlc2FsZSkuIEluZGljZXMgYWRkcmVzcyB0aGUgYXJyYXkgYXMgaXQgZ3Jvd3MsIHNvIGFwcGx5aW5nIHRoZVxuICogaW5zZXJ0aW9ucyBsZWZ0IHRvIHJpZ2h0IHlpZWxkcyBgbmV3VmFsdWVgLlxuICovXG5mdW5jdGlvbiBmaW5kSW5zZXJ0aW9ucyhvbGRWYWx1ZTogdW5rbm93bltdLCBuZXdWYWx1ZTogdW5rbm93bltdKTogeyBpbmRleDogbnVtYmVyOyB2YWx1ZTogdW5rbm93biB9W10gfCB1bmRlZmluZWQge1xuICBjb25zdCBpbnNlcnRpb25zOiB7IGluZGV4OiBudW1iZXI7IHZhbHVlOiB1bmtub3duIH1bXSA9IFtdO1xuICBsZXQgb2xkSW5kZXggPSAwO1xuICBmb3IgKGNvbnN0IFtuZXdJbmRleCwgZWxlbWVudF0gb2YgbmV3VmFsdWUuZW50cmllcygpKSB7XG4gICAgaWYgKG9sZEluZGV4IDwgb2xkVmFsdWUubGVuZ3RoICYmIEpTT04uc3RyaW5naWZ5KG9sZFZhbHVlW29sZEluZGV4XSkgPT09IEpTT04uc3RyaW5naWZ5KGVsZW1lbnQpKSB7XG4gICAgICBvbGRJbmRleCsrO1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGluc2VydGlvbnMucHVzaCh7IGluZGV4OiBuZXdJbmRleCwgdmFsdWU6IGVsZW1lbnQgfSk7XG4gIH1cbiAgcmV0dXJuIG9sZEluZGV4ID09PSBvbGRWYWx1ZS5sZW5ndGggPyBpbnNlcnRpb25zIDogdW5kZWZpbmVkO1xufVxuIiwiaW1wb3J0IHR5cGUgeyBQYWNrYWdlSnNvbiB9IGZyb20gJ3R5cGUtZmVzdCc7XG5cbi8qKlxuICogUmVjb2duaXplcyB0aGUgbWFuYWdlZCBgd2IgZ2VuLWNvZGVgIHNlZ21lbnQsIGEgb25lLWxldmVsIHBhY2thZ2Utc2NyaXB0IHdyYXBwZXIgYXJvdW5kIGl0LCBhbmRcbiAqIGN1c3RvbSBzZWdtZW50cyB0aGF0IHdiZnkgbGVhdmVzIGFsb25lLlxuICovXG50eXBlIFNjcmlwdFNlZ21lbnRLaW5kID0gJ2N1c3RvbScgfCAnZ2VuQ29kZScgfCAnZ2VuQ29kZVdyYXBwZXInO1xuXG5jb25zdCBnZW5Db2RlU2VnbWVudFBhdHRlcm4gPSAvXmJ1blxccyt3YlxccytnZW4tY29kZSQvdTtcblxuLy8gQSBydW5uZXIgZGVsZWdhdGluZyB0byBvbmUgb2YgdGhpcyBwYWNrYWdlJ3Mgb3duIHNjcmlwdHMsIGUuZy4gYGJ1biBydW4gZ2VuLXR5cGVzYC5cbmNvbnN0IHNjcmlwdFJ1bm5lclBhdHRlcm4gPSAvXmJ1blxccytydW5cXHMrKFxcUyspJC91O1xuXG4vLyBBbnl0aGluZyB3YmZ5J3MgYCYmYCBzcGxpdCBjYW5ub3QgbW9kZWwgKHBpcGVzLCBzZXF1ZW5jaW5nLCByZWRpcmVjdGlvbnMsIHF1b3RpbmcsIHN1YnN0aXR1dGlvbnMsIGRpcmVjdG9yeVxuLy8gY2hhbmdlcykuIFNjcmlwdHMgY29udGFpbmluZyBpdCBhcmUgbGVmdCB1bnRvdWNoZWQgaW5zdGVhZCBvZiBiZWluZyByZXdyaXR0ZW4gZnJvbSBhIHdyb25nIHBhcnNlLlxuY29uc3QgdW5zdXBwb3J0ZWRTaGVsbFN5bnRheFBhdHRlcm4gPSAvW1xcbjt8PD5gJCdcIigpXXxcXGJjZFxccy91O1xuXG4vKipcbiAqIFNwbGl0cyBhIHNjcmlwdCBpbnRvIGAmJmAtc2VwYXJhdGVkIHNlZ21lbnRzLCBvciByZXR1cm5zIHVuZGVmaW5lZCB3aGVuIHRoZSBzY3JpcHQgdXNlcyBzaGVsbCBzeW50YXggd2JmeVxuICogZGVsaWJlcmF0ZWx5IGRvZXMgbm90IG1vZGVsLlxuICovXG5leHBvcnQgZnVuY3Rpb24gc3BsaXRTY3JpcHRTZWdtZW50cyhzY3JpcHQ6IHN0cmluZyk6IHN0cmluZ1tdIHwgdW5kZWZpbmVkIHtcbiAgaWYgKHVuc3VwcG9ydGVkU2hlbGxTeW50YXhQYXR0ZXJuLnRlc3Qoc2NyaXB0KSkgcmV0dXJuO1xuICByZXR1cm4gc2NyaXB0XG4gICAgLnNwbGl0KCcmJicpXG4gICAgLm1hcCgoc2VnbWVudCkgPT4gc2VnbWVudC50cmltKCkpXG4gICAgLmZpbHRlcihCb29sZWFuKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNsYXNzaWZ5U2NyaXB0U2VnbWVudChcbiAgc2VnbWVudDogc3RyaW5nLFxuICBzY3JpcHRzOiBQYWNrYWdlSnNvbi5TY3JpcHRzLFxuICBmb2xsb3dzV3JhcHBlciA9IHRydWVcbik6IFNjcmlwdFNlZ21lbnRLaW5kIHtcbiAgY29uc3Qgbm9ybWFsaXplZCA9IHNlZ21lbnQudHJpbSgpLnJlcGxhY2VBbGwoL1xccysvZ3UsICcgJyk7XG4gIGlmIChnZW5Db2RlU2VnbWVudFBhdHRlcm4udGVzdChub3JtYWxpemVkKSkgcmV0dXJuICdnZW5Db2RlJztcbiAgLy8gQSBvbmUtbGV2ZWwgd3JhcHBlciBsb29rdXAgY292ZXJzIGBcInBvc3RpbnN0YWxsXCI6IFwiYnVuIHJ1biBnZW4tdHlwZXNcImAsIHRoZSBzaGFwZSB0aGVzZSByZXBvc2l0b3JpZXMgdXNlO1xuICAvLyBkZWVwZXIgY2hhaW5zIHN0YXkgY3VzdG9tIHNvIHdiZnkgY2Fubm90IGxvb3Agb24gYSBzZWxmLXJlZmVyZW50aWFsIHNjcmlwdC5cbiAgY29uc3Qgc2NyaXB0TmFtZSA9IGZvbGxvd3NXcmFwcGVyID8gc2NyaXB0UnVubmVyUGF0dGVybi5leGVjKG5vcm1hbGl6ZWQpPy5bMV0gOiB1bmRlZmluZWQ7XG4gIGNvbnN0IHRhcmdldCA9IHNjcmlwdE5hbWUgPT09IHVuZGVmaW5lZCA/IHVuZGVmaW5lZCA6IHNjcmlwdHNbc2NyaXB0TmFtZV07XG4gIGlmICghdGFyZ2V0KSByZXR1cm4gJ2N1c3RvbSc7XG4gIGNvbnN0IHNlZ21lbnRzID0gc3BsaXRTY3JpcHRTZWdtZW50cyh0YXJnZXQpO1xuICAvLyBBIHdyYXBwZXIgYXJvdW5kIGEgQ1VTVE9NSVpFRCBnZW4tY29kZSAoYGJ1biB3YiBnZW4tY29kZSAmJiBidW4gcnVuIGJ1aWxkLWFzc2V0c2ApIHN0aWxsIHBlcmZvcm1zIHRoZSBtYW5hZ2VkXG4gIC8vIGdlbmVyYXRpb24sIHNvIGl0IGNvdW50cyBhcyBnZW4tY29kZTsgdHJlYXRpbmcgaXQgYXMgY3VzdG9tIHdvdWxkIGFwcGVuZCBhIHNlY29uZCBgd2IgZ2VuLWNvZGVgIGFuZCBydW4gZXZlcnlcbiAgLy8gZ2VuZXJhdG9yIHR3aWNlIHBlciBpbnN0YWxsLlxuICBpZiAoc2VnbWVudHM/Lmxlbmd0aCAhPT0gMSkge1xuICAgIC8vIEEgd3JhcHBlciBhcm91bmQgYSBDVVNUT01JWkVEIGdlbi1jb2RlIChgYnVuIHdiIGdlbi1jb2RlICYmIGJ1biBydW4gYnVpbGQtYXNzZXRzYCkgYWxyZWFkeSBwZXJmb3JtcyB0aGVcbiAgICAvLyBtYW5hZ2VkIGdlbmVyYXRpb24gQU5EIHRoZSBwcm9qZWN0J3Mgb3duIHN0ZXBzLCBzbyBpdCBpcyB0aGUgaW5zdGFsbC10aW1lIGVudHJ5IHBvaW50OiBpdCBtdXN0IGJlIGtlcHQgYXNcbiAgICAvLyB3cml0dGVuLiBSZXBsYWNpbmcgaXQgd2l0aCBhIGJhcmUgYHdiIGdlbi1jb2RlYCB3b3VsZCBkcm9wIHRob3NlIHN0ZXBzOyBhcHBlbmRpbmcgb25lIHdvdWxkIHJ1biBldmVyeVxuICAgIC8vIGdlbmVyYXRvciB0d2ljZS5cbiAgICByZXR1cm4gc2VnbWVudHM/LnNvbWUoKGlubmVyKSA9PiBnZW5Db2RlU2VnbWVudFBhdHRlcm4udGVzdChpbm5lci50cmltKCkucmVwbGFjZUFsbCgvXFxzKy9ndSwgJyAnKSkpXG4gICAgICA/ICdnZW5Db2RlV3JhcHBlcidcbiAgICAgIDogJ2N1c3RvbSc7XG4gIH1cbiAgcmV0dXJuIGNsYXNzaWZ5U2NyaXB0U2VnbWVudChzZWdtZW50c1swXSA/PyAnJywgc2NyaXB0cywgZmFsc2UpO1xufVxuIiwiaW1wb3J0IHR5cGUgeyBTcGF3blN5bmNPcHRpb25zIH0gZnJvbSAnbm9kZTpjaGlsZF9wcm9jZXNzJztcbmltcG9ydCBjaGlsZF9wcm9jZXNzIGZyb20gJ25vZGU6Y2hpbGRfcHJvY2Vzcyc7XG5cbmV4cG9ydCBmdW5jdGlvbiBzcGF3blN5bmMoY29tbWFuZDogc3RyaW5nLCBhcmdzOiBzdHJpbmdbXSwgY3dkOiBzdHJpbmcsIHJldHJ5ID0gMCk6IHZvaWQge1xuICBzcGF3blN5bmNBbmRSZXR1cm5TdGF0dXMoY29tbWFuZCwgYXJncywgY3dkLCByZXRyeSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBzcGF3blN5bmNBbmRSZXR1cm5TdGF0dXMoY29tbWFuZDogc3RyaW5nLCBhcmdzOiBzdHJpbmdbXSwgY3dkOiBzdHJpbmcsIHJldHJ5ID0gMCk6IG51bWJlciB7XG4gIGRvIHtcbiAgICBjb25zdCBbbmV3Q21kLCBuZXdBcmdzLCBvcHRpb25zXSA9IGdldFNwYXduU3luY0FyZ3MoY29tbWFuZCwgYXJncywgY3dkKTtcbiAgICBjb25zb2xlLmxvZyhgJCAke25ld0NtZH0gJHtuZXdBcmdzLmpvaW4oJyAnKX0gYXQgJHtjd2R9YCk7XG4gICAgY29uc3QgcmV0ID0gY2hpbGRfcHJvY2Vzcy5zcGF3blN5bmMobmV3Q21kLCBuZXdBcmdzLCBvcHRpb25zKTtcbiAgICBjb25zdCBzdGF0dXMgPSByZXQuc3RhdHVzID8/IDE7XG4gICAgaWYgKHN0YXR1cyA9PT0gMCkgYnJlYWs7XG4gICAgaWYgKHJldHJ5IDw9IDApIHJldHVybiBzdGF0dXM7XG4gIH0gd2hpbGUgKC0tcmV0cnkgPj0gMCk7XG4gIHJldHVybiAwO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gc3Bhd25TeW5jQW5kUmV0dXJuU3Rkb3V0KGNvbW1hbmQ6IHN0cmluZywgYXJnczogc3RyaW5nW10sIGN3ZDogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIHNwYXduU3luY0FuZFJldHVyblN0ZG91dEludGVybmFsKGNvbW1hbmQsIGFyZ3MsIGN3ZClbMV07XG59XG5cbmZ1bmN0aW9uIHNwYXduU3luY0FuZFJldHVyblN0ZG91dEludGVybmFsKGNvbW1hbmQ6IHN0cmluZywgYXJnczogc3RyaW5nW10sIGN3ZDogc3RyaW5nKTogW251bWJlciwgc3RyaW5nXSB7XG4gIGNvbnN0IFtuZXdDbWQsIG5ld0FyZ3MsIG9wdGlvbnNdID0gZ2V0U3Bhd25TeW5jQXJncyhjb21tYW5kLCBhcmdzLCBjd2QpO1xuICBvcHRpb25zLnN0ZGlvID0gJ3BpcGUnO1xuICBjb25zdCBwcm9jID0gY2hpbGRfcHJvY2Vzcy5zcGF3blN5bmMobmV3Q21kLCBuZXdBcmdzLCBvcHRpb25zKTtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bm5lY2Vzc2FyeS1jb25kaXRpb24gLS0gc3Bhd25TeW5jIHJldHVybnMgbnVsbCBzdGRlcnIgb24gRU5PRU5ULlxuICBjb25zdCBzdGRlcnIgPSBwcm9jLnN0ZGVyciA/PyAnJztcbiAgY29uc3QgZXJyb3IgPSB0eXBlb2Ygc3RkZXJyID09PSAnc3RyaW5nJyA/IHN0ZGVyci50cmltKCkgOiBzdGRlcnIudG9TdHJpbmcoKS50cmltKCk7XG4gIGlmIChwcm9jLmVycm9yKSB7XG4gICAgY29uc29sZS5lcnJvcihgJHtuZXdDbWR9IFske25ld0FyZ3MubWFwKChzKSA9PiBgXCIke3N9XCJgKS5qb2luKCcsICcpfV0gZmFpbGVkIHdpdGg6ICR7cHJvYy5lcnJvci5tZXNzYWdlfWApO1xuICB9IGVsc2UgaWYgKGVycm9yKSB7XG4gICAgY29uc29sZS5lcnJvcihcbiAgICAgIGAke25ld0NtZH0gWyR7bmV3QXJncy5tYXAoKHMpID0+IGBcIiR7c31cImApLmpvaW4oJywgJyl9XSBvdXRwdXRzIHRoZSBmb2xsb3dpbmcgY29udGVudCB0byBzdGRlcnI6XFxuJHtlcnJvcn1gXG4gICAgKTtcbiAgfVxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVubmVjZXNzYXJ5LWNvbmRpdGlvbiAtLSBzcGF3blN5bmMgcmV0dXJucyBudWxsIHN0ZG91dCBvbiBFTk9FTlQuXG4gIGNvbnN0IHN0ZG91dCA9IHByb2Muc3Rkb3V0ID8/ICcnO1xuICBjb25zdCBzdGRvdXRUZXh0ID0gdHlwZW9mIHN0ZG91dCA9PT0gJ3N0cmluZycgPyBzdGRvdXQgOiBzdGRvdXQudG9TdHJpbmcoKTtcbiAgcmV0dXJuIFtwcm9jLnN0YXR1cyA/PyAxLCBzdGRvdXRUZXh0LnRyaW0oKV07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRTcGF3blN5bmNBcmdzKGNvbW1hbmQ6IHN0cmluZywgYXJnczogc3RyaW5nW10sIGN3ZDogc3RyaW5nKTogW3N0cmluZywgc3RyaW5nW10sIFNwYXduU3luY09wdGlvbnNdIHtcbiAgY29uc3QgZW52ID0geyAuLi5wcm9jZXNzLmVudiB9O1xuICBpZiAoZW52LlBBVEggJiYgZW52LkJFUlJZX0JJTl9GT0xERVIpIHtcbiAgICBlbnYuUEFUSCA9IGVudi5QQVRILnNwbGl0KCc6JylcbiAgICAgIC5maWx0ZXIoKHApID0+IHAgIT09IGVudi5CRVJSWV9CSU5fRk9MREVSKVxuICAgICAgLmpvaW4oJzonKTtcbiAgfVxuXG4gIHJldHVybiBbXG4gICAgY29tbWFuZCxcbiAgICBhcmdzLFxuICAgIHtcbiAgICAgIGN3ZCxcbiAgICAgIGVudixcbiAgICAgIGVuY29kaW5nOiAndXRmOCcsXG4gICAgICBzaGVsbDogZmFsc2UsXG4gICAgICBzdGRpbzogJ2luaGVyaXQnLFxuICAgIH0sXG4gIF07XG59XG4iLCJleHBvcnQgZnVuY3Rpb24gZXNjYXBlUmVnRXhwKHZhbHVlOiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gdmFsdWUucmVwbGFjZUFsbCgvWy4qKz9eJHt9KCl8W1xcXVxcXFxdL2d1LCBTdHJpbmcucmF3YFxcJCZgKTtcbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBmc3AgZnJvbSAnbm9kZTpmcy9wcm9taXNlcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgeyBnbG9iSWdub3JlIH0gZnJvbSAnQHdpbGxib29zdGVyL3NoYXJlZC1saWItbm9kZS9zcmMnO1xuaW1wb3J0IGZnIGZyb20gJ2Zhc3QtZ2xvYic7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VKc29uIH0gZnJvbSAndHlwZS1mZXN0JztcbmltcG9ydCB7IHogfSBmcm9tICd6b2QnO1xuXG5pbXBvcnQgeyBnZXRPY3Rva2l0LCBnaXRIdWJVdGlsIH0gZnJvbSAnLi91dGlscy9naXRodWJVdGlsLmpzJztcbmltcG9ydCB7IGpzb25jVXRpbCB9IGZyb20gJy4vdXRpbHMvanNvbmNVdGlsLmpzJztcbmltcG9ydCB7IGNsYXNzaWZ5U2NyaXB0U2VnbWVudCwgc3BsaXRTY3JpcHRTZWdtZW50cyB9IGZyb20gJy4vdXRpbHMvbWFuYWdlZFNjcmlwdFNlZ21lbnQuanMnO1xuaW1wb3J0IHsgc3Bhd25TeW5jQW5kUmV0dXJuU3Rkb3V0IH0gZnJvbSAnLi91dGlscy9zcGF3blV0aWwuanMnO1xuaW1wb3J0IHsgZXNjYXBlUmVnRXhwIH0gZnJvbSAnLi91dGlscy9zdHJpbmdVdGlsLmpzJztcbmltcG9ydCB7IGdldFdvcmtzcGFjZVBhY2thZ2VKc29uUGF0aHMsIGdldFdvcmtzcGFjZVN1YkRpclBhdGhzIH0gZnJvbSAnLi91dGlscy93b3Jrc3BhY2VVdGlsLmpzJztcblxuZXhwb3J0IGludGVyZmFjZSBQYWNrYWdlQ29uZmlnIHtcbiAgZGlyUGF0aDogc3RyaW5nO1xuICBkb2NrZXJmaWxlOiBzdHJpbmc7XG4gIGlzUm9vdDogYm9vbGVhbjtcbiAgaXNQdWJsaWNSZXBvOiBib29sZWFuO1xuICAvLyBXaGV0aGVyIGlzUHVibGljUmVwbyBjb21lcyBmcm9tIGFuIGFjdHVhbCBHaXRIdWIgQVBJIHJlc3BvbnNlOiBhIGZhaWxlZCBsb29rdXAgKG9mZmxpbmUsXG4gIC8vIHJhdGUtbGltaXRlZCwgYmFkIGNyZWRlbnRpYWwpIGNvbGxhcHNlcyB0byBpc1B1YmxpY1JlcG89ZmFsc2UsIHdoaWNoIHZpc2liaWxpdHktc2Vuc2l0aXZlXG4gIC8vIGdlbmVyYXRvcnMgbXVzdCBub3QgbWlzdGFrZSBmb3IgYSBjb25maXJtZWQgcHJpdmF0ZSByZXBvc2l0b3J5LlxuICBpc1JlcG9WaXNpYmlsaXR5S25vd246IGJvb2xlYW47XG4gIGlzUmVmZXJyZWRCeU90aGVyUmVwbzogYm9vbGVhbjtcbiAgcmVwb3NpdG9yeT86IHN0cmluZztcbiAgcmVwb0F1dGhvcj86IHN0cmluZztcbiAgcmVwb05hbWU/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/PyBvd25lcjtcbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGZzVXRpbCB9IGZyb20gJy4uL3V0aWxzL2ZzVXRpbC5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcbmltcG9ydCB7IGdlbmVyYXRlc1dvcmtlclR5cGVzIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBoYXNDbG91ZGZsYXJlRGVwbG95V29ya2Zsb3csIGludm9rZXNXYkRlcGxveSB9IGZyb20gJy4vd29ya2Zsb3cuanMnO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVBZ2VudEluc3RydWN0aW9ucyhyb290Q29uZmlnOiBQYWNrYWdlQ29uZmlnLCBhbGxDb25maWdzOiBQYWNrYWdlQ29uZmlnW10pOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdnZW5lcmF0ZUFnZW50SW5zdHJ1Y3Rpb25zJywgYXN5bmMgKCkgPT4ge1xuICAgIGlmICghcm9vdENvbmZpZy5pc1Jvb3QpIHJldHVybjtcblxuICAgIGNvbnN0IGV4dHJhQ29udGVudCA9IGF3YWl0IHJlYWRBZ2VudHNFeHRyYUNvbnRlbnQocm9vdENvbmZpZy5kaXJQYXRoKTtcblxuICAgIGZvciAoY29uc3QgW2ZpbGVOYW1lLCB0b29sTmFtZV0gb2YgW1xuICAgICAgWydBR0VOVFMubWQnLCAnQ29kZXggQ0xJJ10sXG4gICAgICBbJ0NMQVVERS5tZCcsICdDbGF1ZGUgQ29kZSddLFxuICAgICAgWydHRU1JTkkubWQnLCAnR2VtaW5pIENMSSddLFxuICAgIF0gYXMgY29uc3QpIHtcbiAgICAgIGNvbnN0IGNvbnRlbnQgPSBnZW5lcmF0ZUFnZW50SW5zdHJ1Y3Rpb24ocm9vdENvbmZpZywgYWxsQ29uZmlncywgdG9vbE5hbWUsIGV4dHJhQ29udGVudCk7XG4gICAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShyb290Q29uZmlnLmRpclBhdGgsIGZpbGVOYW1lKTtcbiAgICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiBmc1V0aWwuZ2VuZXJhdGVGaWxlKGZpbGVQYXRoLCBjb250ZW50KSk7XG4gICAgfVxuXG4gICAgY29uc3QgY3Vyc29yUnVsZXNQYXRoID0gcGF0aC5yZXNvbHZlKHJvb3RDb25maWcuZGlyUGF0aCwgJy5jdXJzb3IvcnVsZXMvZ2VuZXJhbC5tZGMnKTtcbiAgICBjb25zdCBjdXJzb3JSdWxlc0NvbnRlbnQgPSBnZW5lcmF0ZUN1cnNvckdlbmVyYWxNZGNDb250ZW50KHJvb3RDb25maWcsIGFsbENvbmZpZ3MsIGV4dHJhQ29udGVudCk7XG4gICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzVXRpbC5nZW5lcmF0ZUZpbGUoY3Vyc29yUnVsZXNQYXRoLCBjdXJzb3JSdWxlc0NvbnRlbnQpKTtcbiAgfSk7XG59XG5cbmNvbnN0IGFnZW50c0V4dHJhQ29udGVudENhY2hlID0gbmV3IE1hcDxzdHJpbmcsIHN0cmluZyB8IHVuZGVmaW5lZD4oKTtcblxuLyoqXG4gKiBSZWFkcyB0aGUgcm9vdCdzIHVzZXItYXV0aG9yZWQgQUdFTlRTX0VYVFJBLm1kIG9uY2UgcGVyIHByb2Nlc3M6IHdiZnkgbmV2ZXIgcmV3cml0ZXMgdGhlIGZpbGUsXG4gKiBhbmQgYm90aCB0aGUgYWdlbnQtaW5zdHJ1Y3Rpb24gYW5kIEdlbWluaSBnZW5lcmF0b3JzIG5lZWQgaXRzIGNvbnRlbnQuIENhY2hpbmcgdGhlIHJlc29sdmVkXG4gKiB2YWx1ZSAobm90IHRoZSBQcm9taXNlKSBpcyByYWNlLWZyZWUgYmVjYXVzZSB0aGUgdHdvIGNhbGxlcnMgcnVuIHNlcXVlbnRpYWxseSBpbiBpbmRleC50cy5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJlYWRBZ2VudHNFeHRyYUNvbnRlbnQocm9vdERpclBhdGg6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nIHwgdW5kZWZpbmVkPiB7XG4gIGNvbnN0IGFnZW50c0V4dHJhUGF0aCA9IHBhdGgucmVzb2x2ZShyb290RGlyUGF0aCwgJ0FHRU5UU19FWFRSQS5tZCcpO1xuICBpZiAoIWFnZW50c0V4dHJhQ29udGVudENhY2hlLmhhcyhhZ2VudHNFeHRyYVBhdGgpKSB7XG4gICAgYWdlbnRzRXh0cmFDb250ZW50Q2FjaGUuc2V0KGFnZW50c0V4dHJhUGF0aCwgYXdhaXQgZnNVdGlsLnJlYWRGaWxlSWZFeGlzdHMoYWdlbnRzRXh0cmFQYXRoKSk7XG4gIH1cbiAgcmV0dXJuIGFnZW50c0V4dHJhQ29udGVudENhY2hlLmdldChhZ2VudHNFeHRyYVBhdGgpO1xufVxuXG5mdW5jdGlvbiBnZW5lcmF0ZUN1cnNvckdlbmVyYWxNZGNDb250ZW50KFxuICBjb25maWc6IFBhY2thZ2VDb25maWcsXG4gIGFsbENvbmZpZ3M6IFBhY2thZ2VDb25maWdbXSxcbiAgZXh0cmFDb250ZW50Pzogc3RyaW5nXG4pOiBzdHJpbmcge1xuICBjb25zdCBmcm9udG1hdHRlciA9IGAtLS1cXG5kZXNjcmlwdGlvbjogR2VuZXJhbCBDb2RpbmcgUnVsZXNcXG5nbG9iczpcXG5hbHdheXNBcHBseTogdHJ1ZVxcbi0tLWA7XG4gIGNvbnN0IGJvZHkgPSBnZW5lcmF0ZUFnZW50SW5zdHJ1Y3Rpb24oY29uZmlnLCBhbGxDb25maWdzLCAnQ3Vyc29yJywgZXh0cmFDb250ZW50KTtcbiAgcmV0dXJuIGAke2Zyb250bWF0dGVyfVxcblxcbiR7Ym9keX1gO1xufVxuXG5mdW5jdGlvbiBnZW5lcmF0ZUFnZW50SW5zdHJ1Y3Rpb24oXG4gIHJvb3RDb25maWc6IFBhY2thZ2VDb25maWcsXG4gIGFsbENvbmZpZ3M6IFBhY2thZ2VDb25maWdbXSxcbiAgdG9vbE5hbWU6IHN0cmluZyxcbiAgZXh0cmFDb250ZW50Pzogc3RyaW5nXG4pOiBzdHJpbmcge1xuICBjb25zdCBwYWNrYWdlTWFuYWdlciA9ICdidW4nO1xuICBjb25zdCBkZXNjcmlwdGlvbiA9IHJvb3RDb25maWcucGFja2FnZUpzb24/LmRlc2NyaXB0aW9uO1xuICBjb25zdCBmbm94SW5zdHJ1Y3Rpb24gPSBmcy5leGlzdHNTeW5jKHBhdGgucmVzb2x2ZShyb290Q29uZmlnLmRpclBhdGgsICdmbm94LnRvbWwnKSlcbiAgICA/IGBcXG4tIEVudmlyb25tZW50IHZhcmlhYmxlcyBhbmQgc2VjcmV0cyBsaXZlIGluIFxcYGZub3gudG9tbFxcYCAobWlzZSArIGZub3gpOyBuZXZlciBjcmVhdGUgXFxgLmVudlxcYCwgXFxgLmVudi4qXFxgLCBvciBcXGAuZGV2LnZhcnNcXGAgZmlsZXMuIFJ1biBjb21tYW5kcyB0aHJvdWdoIFxcYCR7cGFja2FnZU1hbmFnZXJ9IHdiIC4uLlxcYCBvciBcXGBmbm94IHJ1biAtUCA8cHJvZmlsZT4gLS0gPGNvbW1hbmQ+XFxgLiBQcm9maWxlIHNlY3JldHMgbG9hZCBvbmx5IHdoZW4gYSBwcm9maWxlIGlzIHNlbGVjdGVkOiBtb2RlLWF3YXJlIHdiIGNvbW1hbmRzIChlLmcuIFxcYHdiIHN0YXJ0XFxgLCBcXGB3YiB0ZXN0XFxgKSBhbmQgXFxgd2IgZG90ZW52XFxgIHNlbGVjdCBpdCB0aGVtc2VsdmVzIChcXGB3YiBkb3RlbnZcXGAgdXNlcyBcXGBXQl9FTlZcXGAsIGVsc2UgXFxgRk5PWF9QUk9GSUxFXFxgLCBlbHNlIFxcYE5PREVfRU5WXFxgLCBlbHNlIHRoZSBkZXZlbG9wbWVudCBwcm9maWxlOyBcXGBXQl9FTlZcXGAgYWNjZXB0cyBvbmx5IFxcYGRldmVsb3BtZW50XFxgL1xcYHRlc3RcXGAvXFxgc3RhZ2luZ1xcYC9cXGBwcm9kdWN0aW9uXFxgLCBzbyB1c2UgXFxgRk5PWF9QUk9GSUxFXFxgIGZvciBhbnkgb3RoZXIgcHJvZmlsZSksIHdoaWxlIGJhcmUgXFxgZm5veCBydW5cXGAgbmVlZHMgYW4gZXhwbGljaXQgXFxgLVAgPHByb2ZpbGU+XFxgLmBcbiAgICA6ICcnO1xuICAvLyBtaXNlIG93bnMgdGhlIHBpbm5lZCB0b29sIHZlcnNpb25zLCBzbyBhIHZlcnNpb24gbWlzbWF0Y2ggaXMgZml4ZWQgYnkgZWRpdGluZyBtaXNlLnRvbWwg4oCUIG5vdFxuICAvLyBieSBpbnN0YWxsaW5nIGEgZGlmZmVyZW50IHZlcnNpb24gZ2xvYmFsbHksIHdoaWNoIHRoZSBuZXh0IGBtaXNlIGluc3RhbGxgIHNpbGVudGx5IG92ZXJyaWRlcy5cbiAgY29uc3QgbWlzZUluc3RydWN0aW9uID0gZnMuZXhpc3RzU3luYyhwYXRoLnJlc29sdmUocm9vdENvbmZpZy5kaXJQYXRoLCAnbWlzZS50b21sJykpXG4gICAgPyAnXFxuLSBUb29sIHZlcnNpb25zIChlLmcuLCBub2RlKSBhcmUgcGlubmVkIGluIGBtaXNlLnRvbWxgOyBydW4gYG1pc2UgaW5zdGFsbGAgYWZ0ZXIgY2hhbmdpbmcgaXQgYW5kIG5ldmVyIGluc3RhbGwgdGhvc2UgdG9vbHMgZ2xvYmFsbHkgaW5zdGVhZC4nXG4gICAgOiAnJztcbiAgLy8gSXNvbGF0ZWQgaW5zdGFsbHMgYXJlIHRoZSBvcmcgc3RhbmRhcmQgKHdiZnkgZ2VuZXJhdGVzIG5vIG90aGVyIGxpbmtlcikgYW5kIHRoZSBtb3N0XG4gIC8vIGFnZW50LWhvc3RpbGUgcGFydCBvZiB0aGUgc3RhY2s6IGEgcGFja2FnZSB0aGF0IGlzIG9ubHkgcmVhY2hhYmxlIGJlY2F1c2UgYSBkZXBlbmRlbmN5IGhvaXN0ZWRcbiAgLy8gaXQgbm8gbG9uZ2VyIHJlc29sdmVzLCBhbmQgdGhlIHJlZmxleCBmaXggKHN3aXRjaGluZyB0aGUgbGlua2VyIGJhY2spIHNpbGVudGx5IHJlaW50cm9kdWNlc1xuICAvLyB0aGUgcGhhbnRvbSBkZXBlbmRlbmNpZXMgdGhlIGxheW91dCBleGlzdHMgdG8gY2F0Y2guXG4gIGNvbnN0IGlzb2xhdGVkSW5zdGFsbEluc3RydWN0aW9uID0gYFxcbi0gXFxgYnVuZmlnLnRvbWxcXGAgdXNlcyBCdW4ncyBpc29sYXRlZCBsaW5rZXIsIHNvIG9ubHkgZGVjbGFyZWQgZGVwZW5kZW5jaWVzIHJlc29sdmUuIElmIGFuIGltcG9ydCBmYWlscyB0byByZXNvbHZlLCBkZWNsYXJlIHRoYXQgcGFja2FnZSBpbiB0aGUgXFxgcGFja2FnZS5qc29uXFxgIHRoYXQgaW1wb3J0cyBpdDsgbmV2ZXIgc3dpdGNoIFxcYGxpbmtlclxcYCB0byBcXGBob2lzdGVkXFxgIG9yIGFkZCB0byBcXGBwdWJsaWNIb2lzdFBhdHRlcm5cXGAgdG8gd29yayBhcm91bmQgaXQuYDtcbiAgLy8gRXZlcnkgY2xhdXNlIHN0YXRlcyBvbmx5IGEgdmVyaWZpZWQgZmFjdCwgcmV1c2luZyB0aGUgd29ya2Zsb3cgZ2VuZXJhdG9yJ3Mgb3duIGRldGVjdG9yczogdGhlXG4gIC8vIHdyYW5nbGVyLWNvbmZpZyBjbGF1c2UgbmVlZHMgYW4gYWN0dWFsIGNvbmZpZyBmaWxlIChpc0Nsb3VkZmxhcmUgYWxzbyBtYXRjaGVzIGEgbWVyZSB3cmFuZ2xlclxuICAvLyBtZW50aW9uIGluIGEgc2NyaXB0IG9yIHdvcmtmbG93KSwgdGhlIHdvcmtmbG93IGNsYXVzZSBuZWVkcyBhIGxpdmUgcmV1c2FibGUtZGVwbG95IGNhbGxlclxuICAvLyAoWUFNTC1wYXJzZWQgam9icy4qLnVzZXMsIG5vdCBhIHJhdy10ZXh0L2NvbW1lbnQgbWF0Y2gpLCBhbmQgdGhlIGB3YiBkZXBsb3lgIGNsYXVzZSBuZWVkcyBhXG4gIC8vIGRlcGxveSBzY3JpcHQgd2hvc2UgY29tbWFuZCB0b2tlbiBpcyBgd2Ig4oCmIGRlcGxveWAuXG4gIGNvbnN0IG93bnNXcmFuZ2xlckNvbmZpZyA9IGFsbENvbmZpZ3Muc29tZSgoY29uZmlnKSA9PiBjb25maWcuZG9lc0NvbnRhaW5XcmFuZ2xlckNvbmZpZyk7XG4gIC8vIE9ubHkgY2xhaW0gdGhlIGZpbGUgaXMgZ2VuZXJhdGVkIHdoZXJlIGl0IGFjdHVhbGx5IGlzOiBhIHBhY2thZ2UgdGhhdCBoYW5kLW1haW50YWlucyBpdHMgYEVudmAgKGUuZy4gdW5kZXJcbiAgLy8gYHR5cGVzOiBbXCJidW5cIl1gKSBpcyBkZWxpYmVyYXRlbHkgbGVmdCB1bm1hbmFnZWQsIGFuZCB0ZWxsaW5nIGFuIGFnZW50IHRvIHJ1biBgd2IgZ2VuLWNvZGVgIHRoZXJlIHdvdWxkIHNlbmRcbiAgLy8gaXQgYWZ0ZXIgYSBmaWxlIHRoYXQgbmV2ZXIgYXBwZWFycyDigJQgYW5kIGF3YXkgZnJvbSB0aGUgYEVudmAgaXQgc2hvdWxkIGJlIGVkaXRpbmcuXG4gIGNvbnN0IG93bnNHZW5lcmF0ZWRXb3JrZXJUeXBlcyA9IGFsbENvbmZpZ3Muc29tZSgoY29uZmlnKSA9PiBnZW5lcmF0ZXNXb3JrZXJUeXBlcyhjb25maWcpKTtcbiAgY29uc3QgaGFzRGVwbG95V29ya2Zsb3cgPSBoYXNDbG91ZGZsYXJlRGVwbG95V29ya2Zsb3cocGF0aC5yZXNvbHZlKHJvb3RDb25maWcuZGlyUGF0aCwgJy5naXRodWIvd29ya2Zsb3dzJykpO1xuICBjb25zdCB1c2VzV2JEZXBsb3kgPSBhbGxDb25maWdzLnNvbWUoKGNvbmZpZykgPT4ge1xuICAgIGNvbnN0IGRlcGxveVNjcmlwdCA9IGNvbmZpZy5wYWNrYWdlSnNvbj8uc2NyaXB0cz8uWydkZXBsb3knXTtcbiAgICByZXR1cm4gKFxuICAgICAgdHlwZW9mIGRlcGxveVNjcmlwdCA9PT0gJ3N0cmluZycgJiZcbiAgICAgIGludm9rZXNXYkRlcGxveShkZXBsb3lTY3JpcHQsIG5ldyBTZXQoT2JqZWN0LmtleXMoY29uZmlnLnBhY2thZ2VKc29uPy5zY3JpcHRzID8/IHt9KSkpXG4gICAgKTtcbiAgfSk7XG4gIC8vIEluZGVwZW5kZW50IGZhY3RzIHN0YXkgc2VwYXJhdGUgc2VudGVuY2VzOiB0aGUgd29ya2Zsb3cncyBvd24gZGVwbG95IG1lY2hhbmlzbSBpcyBub3RcbiAgLy8gaW5zcGVjdGVkLCBzbyB0aGUgd2ItZGVwbG95IGNsYXVzZSBtdXN0IG5vdCBjbGFpbSB0aGUgd29ya2Zsb3cgaW52b2tlcyBpdC5cbiAgY29uc3QgY2xvdWRmbGFyZUluc3RydWN0aW9uID0gb3duc1dyYW5nbGVyQ29uZmlnXG4gICAgPyBgXFxuLSBUaGlzIHByb2plY3QgcnVucyBvbiBDbG91ZGZsYXJlIFdvcmtlcnM6IHRoZSB3cmFuZ2xlciBjb25maWd1cmF0aW9uIGZpbGUgaG9sZHMgdGhlIFdvcmtlcidzIGNvbmZpZ3VyYXRpb24sIGluY2x1ZGluZyBiaW5kaW5ncyBhbmQgcGVyLWVudmlyb25tZW50IG92ZXJyaWRlcy4ke2hhc0RlcGxveVdvcmtmbG93ID8gJyBUaGUgZGVwbG95IHdvcmtmbG93cyB1bmRlciBgLmdpdGh1Yi93b3JrZmxvd3NgIHBlcmZvcm0gZGVwbG95bWVudHMuJyA6ICcnfSR7dXNlc1diRGVwbG95ID8gJyBUaGUgYGRlcGxveWAgcGFja2FnZSBzY3JpcHQgcnVucyBgd2IgZGVwbG95YC4nIDogJyd9JHtvd25zR2VuZXJhdGVkV29ya2VyVHlwZXMgPyBgXFxuLSBcXGB3b3JrZXItY29uZmlndXJhdGlvbi5kLnRzXFxgIGlzIGdpdGlnbm9yZWQgYW5kIGdlbmVyYXRlZCBieSBcXGAke3BhY2thZ2VNYW5hZ2VyfSB3YiBnZW4tY29kZVxcYDsgYWZ0ZXIgY2hhbmdpbmcgYmluZGluZ3Mgb3IgdmFycyBpbiB0aGUgd3JhbmdsZXIgY29uZmlndXJhdGlvbiwgcmUtcnVuIGl0IGluc3RlYWQgb2YgZWRpdGluZyB0aGUgZmlsZSBieSBoYW5kLmAgOiAnJ31gXG4gICAgOiAnJztcbiAgLy8gV2lsbEJvb3N0ZXIgUmFpbHdheSBwcm9qZWN0IGlkZW50aWZpZXJzIGFyZSBtYW5hZ2VkIGluIGRlcGxveSB3b3JrZmxvdyBzZXR0aW5ncy5cbiAgY29uc3QgcmFpbHdheUluc3RydWN0aW9uID0gcm9vdENvbmZpZy5pc1JhaWx3YXlcbiAgICA/ICdcXG4tIFJhaWx3YXkgcHJvamVjdCBpbmZvcm1hdGlvbiBpcyBpbiB0aGUgZGVwbG95IHdvcmtmbG93cyB1bmRlciBgLmdpdGh1Yi93b3JrZmxvd3NgLidcbiAgICA6ICcnO1xuICBjb25zdCBwbGF5d3JpZ2h0VGVzdFNlcnZlckluc3RydWN0aW9uID0gaGFzUGxheXdyaWdodFRlc3RTZXJ2ZXIoYWxsQ29uZmlncylcbiAgICA/IGBcXG4tIFVzZSBcXGAke3BhY2thZ2VNYW5hZ2VyfSB3YiBzdGFydCAtLW1vZGUgdGVzdFxcYCB0byBsYXVuY2ggYSB3ZWIgc2VydmVyIGZvciBkZWJ1Z2dpbmcgb3IgdGVzdGluZy5gXG4gICAgOiAnJztcbiAgY29uc3QgY29BdXRob3JJbnN0cnVjdGlvbiA9IHJvb3RDb25maWcuaXNXaWxsQm9vc3RlclJlcG9cbiAgICA/IGBcXG4gIC0gRW5kIHlvdXIgY29tbWl0IG1lc3NhZ2Ugd2l0aCBhIGJsYW5rIGxpbmUgZm9sbG93ZWQgYnkgXFxgQ28tYXV0aG9yZWQtYnk6IFdpbGxCb29zdGVyICgke3Rvb2xOYW1lfSkgPGFnZW50QHdpbGxib29zdGVyLmNvbT5cXGAuYFxuICAgIDogJyc7XG4gIC8vIEtleWVkIG9uIHRoZSByZXBvc2l0b3J5IGNsYXNzaWZpY2F0aW9uIHJhdGhlciB0aGFuIG9uIHRoZSB0ZW1wbGF0ZSBmaWxlcycgcHJlc2VuY2U6IHRoZSBzYW1lXG4gIC8vIHJ1biB3cml0ZXMgdGhlIHRlbXBsYXRlcyBmb3IgV2lsbEJvb3N0ZXIgLyBXaWxsQm9vc3RlckxhYiByZXBvc2l0b3JpZXMgYmVmb3JlIHRoaXMgZ2VuZXJhdG9yXG4gIC8vIHJ1bnMsIGFuZCBoYW5kLWFkZGVkIHRlbXBsYXRlcyBlbHNld2hlcmUgYmVsb25nIHRvIEFHRU5UU19FWFRSQS5tZC5cbiAgY29uc3QgcHJUZW1wbGF0ZUluc3RydWN0aW9uID0gcm9vdENvbmZpZy5pc1dpbGxCb29zdGVyUmVwb1xuICAgID8gXCJcXG4gIC0gQmFzZSB0aGUgUFIgYm9keSBvbiBgLmdpdGh1Yi9wdWxsX3JlcXVlc3RfdGVtcGxhdGUubWRgIHdoZW4gY3JlYXRpbmcgb3IgdXBkYXRpbmcgYSBQUiwgZXZlbiB3aGVuIGEgc2tpbGwgb3Igd29ya2Zsb3cgc3VwcGxpZXMgaXRzIG93biBza2VsZXRvbjoga2VlcCB0aGUgdGVtcGxhdGUncyBoZWFkaW5ncyBpbiBvcmRlciwgZmlsbCBlYWNoIHNlY3Rpb24gd2l0aCB3aGF0IGl0cyBwbGFjZWhvbGRlciBjb21tZW50IGFza3MgZm9yIGF0IGEgbGVuZ3RoIGZpdHRpbmcgdGhlIGNoYW5nZSAoYSBzZW50ZW5jZSBmb3IgYSBzbWFsbCBjaGFuZ2UsIG51bWJlcmVkIHN1YnNlY3Rpb25zIGZvciBhIGxhcmdlIG9uZSksIGRlbGV0ZSB0aGUgcGxhY2Vob2xkZXIgY29tbWVudHMgYW5kIGFuIGVtcHR5IE5vdGVzIHNlY3Rpb24sIGFuZCBrZWVwIGBDbG9zZSAjPG4+YCBvbmx5IHdoZW4gdGhlIFBSIHJlc29sdmVzIGFuIGV4aXN0aW5nIGlzc3VlLlwiXG4gICAgOiAnJztcbiAgY29uc3QgaXNzdWVUZW1wbGF0ZUluc3RydWN0aW9uID0gcm9vdENvbmZpZy5pc1dpbGxCb29zdGVyUmVwb1xuICAgID8gJ1xcbi0gV2hlbiBjcmVhdGluZyBhbiBpc3N1ZSwgZm9sbG93IHRoZSBjbG9zZXN0IHRlbXBsYXRlIHVuZGVyIGAuZ2l0aHViL0lTU1VFX1RFTVBMQVRFL2A6IGBidWcubWRgIGZvciB3cm9uZyBiZWhhdmlvciwgYGNoYW5nZS5tZGAgZm9yIGFueXRoaW5nIHRvIGJ1aWxkIG9yIGFsdGVyOyBhIHF1ZXN0aW9uIG9yIG5vdGUgZml0dGluZyBuZWl0aGVyIG5lZWRzIG5vIHRlbXBsYXRlLiBUaGUgWUFNTCBmcm9udCBtYXR0ZXIgYmV0d2VlbiB0aGUgYC0tLWAgbGluZXMgaXMgbWV0YWRhdGEsIG5vdCBib2R5IHRleHQ6IHByZWZpeCB0aGUgdGl0bGUgYXMgaXRzIGB0aXRsZWAgc2F5cywgcGFzcyBpdHMgYGxhYmVsc2AgdmlhIGAtLWxhYmVsYCwgYW5kIHN1Ym1pdCBvbmx5IHRoZSBjb250ZW50IGJlbG93IHRoZSBjbG9zaW5nIGAtLS1gIGFzIHRoZSBib2R5LiBBbHdheXMga2VlcCB0aGUgZmlyc3QgdGhyZWUgc2VjdGlvbnMgb2YgYGNoYW5nZS5tZGAgYW5kIGFkZCB0aGUgcmVzdCBhcyB0aGUgY2hhbmdlIGdyb3dzOyBrZWVwIFByb2JsZW0gYW5kIFByb3Bvc2FsIG9mIGBidWcubWRgIGFuZCBkcm9wIEV2aWRlbmNlIG9yIEltcGFjdCB3aGVuIHRoZXkgYWRkIG5vdGhpbmcuIERlbGV0ZSB0aGUgcGxhY2Vob2xkZXIgY29tbWVudHMuJ1xuICAgIDogJyc7XG4gIGNvbnN0IHByb2plY3ROYW1lID0gcm9vdENvbmZpZy5wYWNrYWdlSnNvbj8ubmFtZSB8fCBwYXRoLmJhc2VuYW1lKHBhdGgucmVzb2x2ZShyb290Q29uZmlnLmRpclBhdGgpKTtcbiAgY29uc3QgYmFzZUNvbnRlbnQgPSBgXG4jIyBQcm9qZWN0IEluZm9ybWF0aW9uXG5cbi0gTmFtZTogXFxgJHtwcm9qZWN0TmFtZX1cXGAke2Rlc2NyaXB0aW9uID8gYFxcbi0gRGVzY3JpcHRpb246ICR7ZGVzY3JpcHRpb259YCA6ICcnfVxuLSBQYWNrYWdlIE1hbmFnZXI6ICR7cGFja2FnZU1hbmFnZXJ9XG5cbiMjIEdlbmVyYWwgSW5zdHJ1Y3Rpb25zXG5cbi0gSWYgb24gXFxgbWFpblxcYCwgY3JlYXRlIGEgbmV3IGJyYW5jaDsgb3RoZXJ3aXNlIHdvcmsgb24gdGhlIGN1cnJlbnQgYnJhbmNoLlxuLSBSdW4gXFxgZ2l0XFxgIGNvbW1hbmRzIG9uZSBhdCBhIHRpbWUgdG8gYXZvaWQgXFxgaW5kZXgubG9ja1xcYCBjb25mbGljdHMuXG4tIFdyaXRlIGEgdGVzdCBvbmx5IHdoZW4gZXhwbGljaXRseSByZXF1ZXN0ZWQsIG9yIHdoZW4gYSBiZWhhdmlvciBpcyBsaWtlbHkgdG8gcmVncmVzcyBhbmQgbm8gZXhpc3RpbmcgYXV0b21hdGljIGNoZWNrICh0eXBlIGNoZWNraW5nLCBsaW50aW5nLCBhbiBleGlzdGluZyB0ZXN0IG9yIENJIGNoZWNrKSB3b3VsZCBjYXRjaCB0aGUgYnJlYWthZ2UuIE5ldmVyIGFkZCBhIHRlc3QgdGhhdCBtZXJlbHkgcmVzdGF0ZXMgYSBtYXBwaW5nIGZyb20gY29uZGl0aW9ucyB0byBjb25zdGFudCBvdXRwdXRzIChpdCBmYWlscyBvbmx5IG9uIGludGVudGlvbmFsIGVkaXRzKSBvciB0aGF0IG9ubHkgY29uZmlybXMgYW4gZXh0ZXJuYWwgZmFjdCAoYSBsaWJyYXJ5J3MgYmVoYXZpb3IsIHdoZXRoZXIgYSB2ZXJzaW9uIGZpeGVzIGFuIGlzc3VlKTsgdmVyaWZ5IHRob3NlIG9uY2UgbWFudWFsbHkuXG4tIFdoZW4gd3JpdGluZyB0ZXN0cywgZm9sbG93IHRoZXNlIHJ1bGVzOlxuICAtIFRlc3QgZXh0ZXJuYWxseSBvYnNlcnZhYmxlIGJlaGF2aW9yIChlLmcuLCBlbWl0dGVkIGZpbGVzLCBDTEkgb3V0cHV0LCByZW5kZXJlZCByZXN1bHRzKSBhdCB0aGUgc3lzdGVtIGJvdW5kYXJ5LCBub3QgaW1wbGVtZW50YXRpb24gZGV0YWlsczogZG8gbm90IG1pcnJvciBwcm9kdWN0aW9uIGxvZ2ljLCBhc3NlcnQgdGhhdCBhIGJyYW5jaCBpcyB0YWtlbiwgb3IgZmVlZCBoYW5kLWFzc2VtYmxlZCBpbnRlcm5hbCBvYmplY3RzIHRvIGludGVybmFsIGZ1bmN0aW9ucy5cbiAgLSBQcmVmZXIgYWN0dWFsIEFQSSBjYWxscyBvdmVyIG1vY2tzLCB1bmxlc3MgYWN0dWFsIGNhbGxzIGFyZSBpbXByYWN0aWNhbCwgaGF2ZSB1bmludGVuZGVkIHNpZGUgZWZmZWN0cywgb3IgbW9ja3MgYXJlIGV4cGxpY2l0bHkgcmVxdWVzdGVkLlxuICAtIEVuc3VyZSB0ZXN0cyBhcmUgaWRlbXBvdGVudCBhbmQgaW5kZXBlbmRlbnQgKGUuZy4sIHJlc2V0IHBlcnNpc3RlbnQgZGF0YSkgc28gdGhleSBjYW4gcnVuIHJlcGVhdGVkbHkgb3IgaW4gcGFyYWxsZWwuXG4gIC0gQXZvaWQgZml4ZWQgd2FpdHMgaW4gRTJFIHRlc3RzOyB3YWl0IGZvciBjb25kaXRpb25zIGluc3RlYWQuXG4gIC0gQ29udGludWUgbW9kaWZ5aW5nIHRlc3RzIGFuZC9vciBjb2RlIHVudGlsIGFsbCB0ZXN0cyBwYXNzLlxuLSBXaGVuIGZpeGluZyBpc3N1ZXMgKGluY2x1ZGluZyB0ZXN0IGZhaWx1cmVzKSwgaW52ZXN0aWdhdGUgdGhlIHJvb3QgY2F1c2UgZmlyc3QgKGUuZy4sIHZpYSBkZWJ1ZyBsb2dzIG9yIHNjcmVlbnNob3RzKSBhbmQgZml4IGl0IGluc3RlYWQgb2YgYXBwbHlpbmcgd29ya2Fyb3VuZHMuXG4tIEFmdGVyIG1ha2luZyBjaGFuZ2VzLCBydW4gXFxgJHtwYWNrYWdlTWFuYWdlcn0gcnVuIHZlcmlmeVxcYCAodHlwZSBjaGVja2luZyBhbmQgbGludGluZzsgdXAgdG8gMTAgbWludXRlcyksIG9yIFxcYCR7cGFja2FnZU1hbmFnZXJ9IHJ1biB2ZXJpZnktZnVsbFxcYCAoYWxsIHRlc3RzOyB1cCB0byAxIGhvdXIpIGlmIHlvdSBjaGFuZ2VkIHJ1bnRpbWUgYmVoYXZpb3Igb3IgdGVzdHMuIEZpeCBlcnJvcnMgYW5kIHJlLXJ1biB1bnRpbCBpdCBwYXNzZXMuXG4gIC0gQWdlbnQgc2hlbGxzIG1heSBraWxsIHRyYWNrZWQgY29tbWFuZHMgKGJhY2tncm91bmQgb25lcyBpbmNsdWRlZCkgYWZ0ZXIgbWludXRlcywgc28gcnVuIGNvbW1hbmRzIHRoYXQgY2FuIGV4Y2VlZCB5b3VyIHNoZWxsLWNhbGwgdGltZW91dCAoZS5nLiwgYm90aCB2ZXJpZnkgc2NyaXB0cykgZGV0YWNoZWQgdmlhIG5vaHVwIGZyb20gYSBjYWxsIHRoYXQgcmV0dXJucyBpbW1lZGlhdGVseTogXFxgbWtkaXIgLXAgLnRtcDsgcm0gLWYgLnRtcC92ZXJpZnktZnVsbC5leGl0OyBub2h1cCBzaCAtYyAnJHtwYWNrYWdlTWFuYWdlcn0gcnVuIHZlcmlmeS1mdWxsOyBlY2hvICQ/ID4gLnRtcC92ZXJpZnktZnVsbC5leGl0JyA+IC50bXAvdmVyaWZ5LWZ1bGwubG9nIDI+JjEgJlxcYCAodGhlIHJlZGlyZWN0cyBhcmUgcmVxdWlyZWQ7IGFuIGluaGVyaXRlZCBzdGRvdXQvc3RkZXJyIHBpcGUga2VlcHMgdGhlIGNhbGwgd2FpdGluZykuIFBvbGwgZnJvbSBzZXBhcmF0ZSBjYWxscywgZWFjaCBzaG9ydGVyIHRoYW4gdGhhdCB0aW1lb3V0LCB1bnRpbCB0aGUgZXhpdCBmaWxlIGFwcGVhcnMgKGl0cyBjb250ZW50IGlzIHRoZSBleGl0IGNvZGUpOiBcXGBmb3IgaSBpbiAxIDIgMzsgZG8gdGVzdCAtZiAudG1wL3ZlcmlmeS1mdWxsLmV4aXQgJiYgYnJlYWs7IHNsZWVwIDIwOyBkb25lOyBjYXQgLnRtcC92ZXJpZnktZnVsbC5leGl0IDI+L2Rldi9udWxsIHx8IGVjaG8gc3RpbGwgcnVubmluZ1xcYDsgdGhlbiByZWFkIHRoZSBsb2cuIElmIHRoZSBleGl0IGZpbGUgbmV2ZXIgYXBwZWFycyBhbmQgdGhlIGxvZyBzdG9wcyBncm93aW5nLCB0aGUgcnVuIGRpZWQuXG4tIE9uY2UgdmVyaWZpZWQsIGNvbW1pdCBhbmQgcHVzaCB0byB0aGUgY3VycmVudCAobm9uLW1haW4pIGJyYW5jaCwgYW5kIGNyZWF0ZSBhIFBSIHZpYSBcXGBnaFxcYCBpZiBub25lIGV4aXN0cyBmb3IgdGhlIGJyYW5jaC5cbiAgLSBGb2xsb3cgdGhlIENvbnZlbnRpb25hbCBDb21taXRzIGZvcm1hdCAoZS5nLiwgXFxgZmVhdDpcXGAsIFxcYGZpeDpcXGApLiR7Y29BdXRob3JJbnN0cnVjdGlvbn1cbiAgLSBBbHdheXMgY3JlYXRlIG5ldyBjb21taXRzOyBhdm9pZCBcXGAtLWFtZW5kXFxgLiR7cHJUZW1wbGF0ZUluc3RydWN0aW9ufSR7aXNzdWVUZW1wbGF0ZUluc3RydWN0aW9ufVxuLSBJbiBhbnkgZXhwbGFuYXRvcnkgdGV4dCAoY29tbWl0IG1lc3NhZ2VzLCBQUiBkZXNjcmlwdGlvbnMsIGRvY3VtZW50YXRpb24sIGNvZGUgY29tbWVudHMsIGV0Yy4pLCBkZXNjcmliZSBvbmx5IHRoZSBjdXJyZW50IGltcGxlbWVudGF0aW9uOiBuZXZlciBtZW50aW9uIHN5bWJvbHMgb3IgY29uY2VwdHMgdGhhdCB3ZXJlIGFkZGVkIGFuZCBsYXRlciByZW1vdmVkIG9yIHJlbmFtZWQgYWxvbmcgdGhlIHdheSwgYW5kIGRyb3AgYW55IHN0YXRlbWVudCBuYW1pbmcgYW4gaWRlbnRpZmllciBvciBmZWF0dXJlIHlvdSBjYW5ub3QgY29uZmlybSBleGlzdHMgaW4gdGhlIGZpbmFsIGRpZmYgb3IgdGhlIGN1cnJlbnQgY29kZWJhc2UuIFdoZW5ldmVyIHlvdSBub3RpY2UgZG9jdW1lbnRhdGlvbiBvciBjb21tZW50cyB0aGF0IG5vIGxvbmdlciBtYXRjaCB0aGUgY3VycmVudCBpbXBsZW1lbnRhdGlvbiAocmVtb3ZlZCBvcHRpb25zLCBkZXByZWNhdGVkIHVzYWdlLCBvdXRkYXRlZCBiZWhhdmlvciksIGRlbGV0ZSBvciByZXdyaXRlIHRoZW0sIGV2ZW4gaW4gZmlsZXMgeW91IGFyZSBub3Qgb3RoZXJ3aXNlIGNoYW5naW5nLiBNZW50aW9uIGEgcGFzdCBzdGF0ZSBvbmx5IHdoZXJlIGl0IGlzIG5lZWRlZCB0byB1bmRlcnN0YW5kIHdoeSB0aGUgY3VycmVudCBkZXNpZ24gaXMgYXMgaXQgaXMsIG9yIHdoZW4gZXhwbGljaXRseSBhc2tlZDsgZmlsZXMgdGhhdCByZWNvcmQgaGlzdG9yeSBieSBkZXNpZ24gKGUuZy4sIGEgY2hhbmdlbG9nKSBhcmUgZXhlbXB0LlxuLSBVc2UgaGVyZWRvYyBmb3IgbXVsdGktbGluZSBjb21tYW5kIGlucHV0IChlLmcuLCBcXGBnaXQgY29tbWl0IC1GIC1cXGAsIFxcYGdoIHByIGNyZWF0ZSAtLWJvZHktZmlsZSAtXFxgLCBcXGBnaCBpc3N1ZSBjcmVhdGUgLS1ib2R5LWZpbGUgLVxcYCkuXG4tIFB1dCB0ZW1wb3JhcnkgZmlsZXMgaW4gXFxgLnRtcFxcYDsgdXNlIFxcYC90bXBcXGAgb25seSBmb3IgZmlsZXMgdGhhdCBtdXN0IGxpdmUgb3V0c2lkZSB0aGUgcmVwby5cbi0gXFxgQUdFTlRTLm1kXFxgLCBcXGBDTEFVREUubWRcXGAsIFxcYEdFTUlOSS5tZFxcYCwgXFxgLmN1cnNvci9ydWxlcy9nZW5lcmFsLm1kY1xcYCwgYW5kIFxcYC5nZW1pbmkvc3R5bGVndWlkZS5tZFxcYCBhcmUgZ2VuZXJhdGVkIGZyb20gXFxgQUdFTlRTX0VYVFJBLm1kXFxgIGFuZCBvdmVyd3JpdHRlbiBvbiBldmVyeSBcXGB3YmZ5XFxgIHJ1bjsgdG8gY2hhbmdlIGFnZW50IGluc3RydWN0aW9ucywgZWRpdCBvbmx5IFxcYEFHRU5UU19FWFRSQS5tZFxcYC4ke21pc2VJbnN0cnVjdGlvbn0ke2lzb2xhdGVkSW5zdGFsbEluc3RydWN0aW9ufSR7Zm5veEluc3RydWN0aW9ufSR7Y2xvdWRmbGFyZUluc3RydWN0aW9ufSR7cmFpbHdheUluc3RydWN0aW9ufSR7cGxheXdyaWdodFRlc3RTZXJ2ZXJJbnN0cnVjdGlvbn1cblxuJHtnZW5lcmF0ZUFnZW50Q29kaW5nU3R5bGUocm9vdENvbmZpZywgYWxsQ29uZmlncyl9XG5gXG4gICAgLnJlcGxhY2VBbGwoL1xcLlxcblxcbistL2csICcuXFxuLScpXG4gICAgLnJlcGxhY2VBbGwoL1xcbnszLH0vZywgJ1xcblxcbicpXG4gICAgLnRyaW0oKTtcblxuICBjb25zdCBoYXNOZXdTZWN0aW9uID0gZXh0cmFDb250ZW50Py50cmltKCkuc3RhcnRzV2l0aCgnIycpO1xuICBjb25zdCBub3JtYWxpemVkRXh0cmFDb250ZW50ID0gZXh0cmFDb250ZW50XG4gICAgPyBoYXNOZXdTZWN0aW9uXG4gICAgICA/ICdcXG5cXG4nICsgZXh0cmFDb250ZW50LnRyaW0oKVxuICAgICAgOiAnXFxuJyArIGV4dHJhQ29udGVudFxuICAgIDogJyc7XG4gIHJldHVybiBiYXNlQ29udGVudCArIG5vcm1hbGl6ZWRFeHRyYUNvbnRlbnQ7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZW5lcmF0ZUFnZW50Q29kaW5nU3R5bGUocm9vdENvbmZpZzogUGFja2FnZUNvbmZpZywgYWxsQ29uZmlnczogUGFja2FnZUNvbmZpZ1tdKTogc3RyaW5nIHtcbiAgLy8gVGF1cmkgZGVza3RvcCBhcHBzIHNoaXAgV2luZG93cyBidWlsZHMsIGFuZCB0aGUgYm91bmRhcnkgYmV0d2VlbiBhcHAgY29kZSBhbmQgc2hhcmVkIGNvZGUgaXNcbiAgLy8gdG9vIGZ1enp5IHRvIHNjb3BlIHRoZSBtYWNPUy9MaW51eC1vbmx5IHJ1bGUgcGVyIHBhY2thZ2UsIHNvIHN1Y2ggcmVwb3NpdG9yaWVzIHRhcmdldCBhbGxcbiAgLy8gdGhyZWUgT1NlcyBpbnN0ZWFkLlxuICBjb25zdCBoYXNEZXNrdG9wQXBwID0gYWxsQ29uZmlncy5zb21lKChjKSA9PiBjLmRlcGVuZGluZy50YXVyaSB8fCBjLmRvZXNDb250YWluVGF1cmlDb25maWdJblBhY2thZ2VzKTtcbiAgLy8gQSBwdWJsaWMgcmVwb3NpdG9yeSB3aXRoIG5vIGBAd2lsbGJvb3N0ZXIvYCBwYWNrYWdlIGlzIE9TUyBmb3IgdGhlIGdlbmVyYWwgcHVibGljLCB3aG9zZSB1c2Vyc1xuICAvLyBtYXkgcnVuIFdpbmRvd3MsIHNvIG5vIE9TIHJlc3RyaWN0aW9uIGFwcGxpZXMgdGhlcmUuIEFuIHVua25vd24gdmlzaWJpbGl0eSBjb2xsYXBzZXMgdG9cbiAgLy8gaXNQdWJsaWNSZXBvPWZhbHNlIGFuZCB0aGVyZWZvcmUga2VlcHMgdGhlIHJlc3RyaWN0aXZlIGRlZmF1bHQuXG4gIGNvbnN0IGlzR2VuZXJhbFB1YmxpY09zcyA9XG4gICAgcm9vdENvbmZpZy5pc1B1YmxpY1JlcG8gJiYgYWxsQ29uZmlncy5ldmVyeSgoYykgPT4gIWMucGFja2FnZUpzb24/Lm5hbWU/LnN0YXJ0c1dpdGgoJ0B3aWxsYm9vc3Rlci8nKSk7XG4gIGNvbnN0IG9zQ29tcGF0aWJpbGl0eUluc3RydWN0aW9uID0gaXNHZW5lcmFsUHVibGljT3NzXG4gICAgPyAnJ1xuICAgIDogaGFzRGVza3RvcEFwcFxuICAgICAgPyAnLSBFbnN1cmUgY29tcGF0aWJpbGl0eSB3aXRoIFdpbmRvd3MsIG1hY09TLCBhbmQgTGludXguJ1xuICAgICAgOiAnLSBFbnN1cmUgY29tcGF0aWJpbGl0eSBvbmx5IHdpdGggbWFjT1MgYW5kIExpbnV4OyBkbyBub3QgaW5jbHVkZSBXaW5kb3dzLXNwZWNpZmljIGNvZGUuJztcbiAgLy8gQ2xvdWRmbGFyZSBXb3JrZXJzIGV4ZWN1dGUgYWNyb3NzIG1hbnkgZXBoZW1lcmFsIGlzb2xhdGVzIGFuZCB0d28gcmVxdWVzdHMgYXJlIG5vdCBndWFyYW50ZWVkXG4gIC8vIHRvIGhpdCB0aGUgc2FtZSBpbnN0YW5jZSwgc28gdGhlIHNpbmdsZS1pbnN0YW5jZSBzaW1wbGlmaWNhdGlvbiBzaWxlbnRseSBsb3NlcyBzdGF0ZSB0aGVyZSDigJRcbiAgLy8gYnV0IFdvcmtlcnMgZGVsaWJlcmF0ZWx5IHJldXNlIGV4ZWN1dGlvbiBjb250ZXh0cywgc28gYmVzdC1lZmZvcnQgaXNvbGF0ZS1sb2NhbCBjYWNoZXMgc3RheVxuICAvLyBsZWdpdGltYXRlIChodHRwczovL2RldmVsb3BlcnMuY2xvdWRmbGFyZS5jb20vd29ya2Vycy9yZWZlcmVuY2UvaG93LXdvcmtlcnMtd29ya3MvKS4gVGhlXG4gIC8vIHNpZ25hbHMgYXJlIGNvcnJlbGF0ZWQgUEVSIFBBQ0tBR0U6IGEgbW9ub3JlcG8gY2FuIGhvc3QgYSBzaW5nbGUtaW5zdGFuY2Ugc2VydmVyIGFwcCBuZXh0IHRvXG4gIC8vIGFuIHVucmVsYXRlZCBXb3JrZXIsIGFuZCBuZWl0aGVyIG1heSBvdmVycmlkZSB0aGUgb3RoZXIncyBydWxlLiBkb2VzQ29udGFpbldyYW5nbGVyQ29uZmlnIGlzXG4gIC8vIHRoZSBhY2N1cmF0ZSBXb3JrZXJzIHNpZ25hbCAoaXNDbG91ZGZsYXJlIGFsc28gbWF0Y2hlcyBhIG1lcmUgd3JhbmdsZXIgbWVudGlvbiBpbiBhIHNjcmlwdCBvclxuICAvLyB3b3JrZmxvdykuXG4gIGNvbnN0IGhhc1dvcmtlcnNBcHAgPSBhbGxDb25maWdzLnNvbWUoKGMpID0+IGMuZG9lc0NvbnRhaW5XcmFuZ2xlckNvbmZpZyk7XG4gIGNvbnN0IGhhc1NpbmdsZUluc3RhbmNlU2VydmVyQXBwID0gYWxsQ29uZmlncy5zb21lKFxuICAgIChjKSA9PiAoYy5kZXBlbmRpbmcubmV4dCB8fCBjLmRlcGVuZGluZy52aW5leHQpICYmICFjLmRvZXNDb250YWluV3JhbmdsZXJDb25maWdcbiAgKTtcbiAgY29uc3Qgd29ya2Vyc0luc3RydWN0aW9uID1cbiAgICAnLSBDbG91ZGZsYXJlIFdvcmtlcnMgcnVuIGFjcm9zcyBtYW55IGVwaGVtZXJhbCBpc29sYXRlcywgc28gdHdvIHJlcXVlc3RzIG1heSBoaXQgZGlmZmVyZW50IGluc3RhbmNlczogbmV2ZXIgbGV0IGNvcnJlY3RuZXNzIGRlcGVuZCBvbiBtb2R1bGUtbGV2ZWwgbXV0YWJsZSBzdGF0ZTsgcGVyc2lzdCBhdXRob3JpdGF0aXZlIHNoYXJlZCBzdGF0ZSBpbiBiaW5kaW5ncyAoRDEsIEtWLCBSMiwgRHVyYWJsZSBPYmplY3RzKS4gQmVzdC1lZmZvcnQgaXNvbGF0ZS1sb2NhbCBjYWNoZXMgb2Ygbm9uLXJlcXVlc3Qtc2NvcGVkIGRhdGEgYXJlIGZpbmUuJztcbiAgY29uc3Qgc2VydmVySW5zdGFuY2VJbnN0cnVjdGlvbiA9IGhhc1dvcmtlcnNBcHBcbiAgICA/IGhhc1NpbmdsZUluc3RhbmNlU2VydmVyQXBwXG4gICAgICA/IGAke3dvcmtlcnNJbnN0cnVjdGlvbn0gVGhpcyBhcHBsaWVzIHRvIGFsbCBjb2RlIHJ1bm5pbmcgb24gQ2xvdWRmbGFyZSBXb3JrZXJzICh0aGUgd3JhbmdsZXItY29uZmlndXJlZCBwYWNrYWdlcyBhbmQgYW55IHdvcmtzcGFjZSBwYWNrYWdlIHRoZXkgaW1wb3J0KTsgYXNzdW1lIGEgc2luZ2xlIHNlcnZlciBpbnN0YW5jZSBmb3IgdGhlIG90aGVyIHNlcnZlciBhcHBzLmBcbiAgICAgIDogd29ya2Vyc0luc3RydWN0aW9uXG4gICAgOiBoYXNTaW5nbGVJbnN0YW5jZVNlcnZlckFwcFxuICAgICAgPyAnLSBBc3N1bWUgYSBzaW5nbGUgc2VydmVyIGluc3RhbmNlLidcbiAgICAgIDogJyc7XG4gIC8vIEtlZXAgdG9wLWRvd24gb3JkZXJpbmcgZ3VpZGFuY2UgZnVuY3Rpb24tb25seSBiZWNhdXNlIGNsYXNzZXMgYXJlIG5vdCBob2lzdGVkIGFuZCBjYW4gZmFpbCB3aGVuIGluaGVyaXRhbmNlIG9yIHRvcC1sZXZlbCBpbnN0YW50aWF0aW9uIGRlcGVuZHMgb24gZGVjbGFyYXRpb24gb3JkZXIuXG4gIHJldHVybiBgXG4jIyBDb2RpbmcgU3R5bGVcblxuLSBVc2UgY2FtZWxDYXNlIGZpbGUgbmFtZXMgZm9yIEphdmFTY3JpcHQvVHlwZVNjcmlwdCAoUGFzY2FsQ2FzZSBmb3IgUmVhY3QgY29tcG9uZW50cykuXG4tIFNpbXBsaWZ5IGNvZGUgYXMgbXVjaCBhcyBwb3NzaWJsZSB0byBlbGltaW5hdGUgcmVkdW5kYW5jeS5cbi0gRGVzaWduIG1vZHVsZXMgYW5kIGRpcmVjdG9yaWVzIHdpdGggaGlnaCBjb2hlc2lvbiBhbmQgbG93IGNvdXBsaW5nOyBzcGxpdCBsYXJnZSBtb2R1bGVzIHdoZW4gbmVlZGVkLlxuLSBQbGFjZSBjYWxsaW5nIGZ1bmN0aW9ucyBhYm92ZSB0aGUgZnVuY3Rpb25zIHRoZXkgY2FsbCAodG9wLWRvd24gb3JkZXIpOyBwbGFjZSB2YXJpYWJsZSBhbmQgdHlwZSBkZWNsYXJhdGlvbnMgYWJvdmUgdGhlaXIgdXNhZ2UuXG4tIFdyaXRlIGNvbW1lbnRzIGFuZCBKU0RvYyBvbmx5IGZvciBoYXJkLXRvLXVuZGVyc3RhbmQgY29kZTogZXhwbGFpbiBcIndoeVwiIGluIGNvbW1lbnRzIGFuZCBcIndoYXRcIiBpbiBKU0RvYy5cbi0gTmV2ZXIgZXhwbGFpbiBob3cgV2lsbEJvb3N0ZXIncyBpbi1ob3VzZSB0b29scyAoZS5nLiwgXFxgd2JcXGAsIFxcYHdiZnlcXGApIHdvcmsgaW4gY29kZSBjb21tZW50cyBvciBkb2N1bWVudHMgb3V0c2lkZSB0aGUgdG9vbCdzIG93biBwYWNrYWdlLCBleGNlcHQgaW4gaW5zdHJ1Y3Rpb25zIGZvciBBSSBhZ2VudHMgKGUuZy4sIGRvIG5vdCBub3RlIHRoYXQgXFxgUE9SVFxcYCBpcyB1bnNldCBiZWNhdXNlIFxcYHdiXFxgIHBpY2tzIGEgZnJlZSBwb3J0KS5cbi0gSWYgbGludCBlcnJvcnMgb3Igd2FybmluZ3MgY2Fubm90IGJlIGZpeGVkLCB1c2UgaWdub3JlIGNvbW1lbnRzIHdpdGggcmVhc29ucyAoZS5nLiwgXFxgLy8gb3hsaW50LWRpc2FibGUtbmV4dC1saW5lIDxydWxlPiAtLSA8cmVhc29uPlxcYCkuXG4tIFByZWZlciBcXGB1bmRlZmluZWRcXGAgb3ZlciBcXGBudWxsXFxgIHVubGVzcyByZXF1aXJlZCBieSBBUElzIG9yIGxpYnJhcmllcy5cbi0gVmFsaWRhdGUgSmF2YVNjcmlwdCBvYmplY3RzIChlLmcuLCBwYXJzZWQgSlNPTiwgQVBJIHJlc3BvbnNlcykgd2l0aCBcXGB6b2RcXGAgd2hlbmV2ZXIgcG9zc2libGUgaW5zdGVhZCBvZiBoYW5kLXdyaXR0ZW4gY2hlY2tzIG9yIHR5cGUgYXNzZXJ0aW9ucy5cbi0gQnVpbGQgcHJvbXB0cyBhcyBhIHNpbmdsZSB0ZW1wbGF0ZSBsaXRlcmFsIGluc3RlYWQgb2YgXFxgam9pbigpXFxgIG9uIGEgcHJlLWNvbXB1dGFibGUgYXJyYXkgb2Ygc3RyaW5ncy5cbi0gQXNzdW1lIGFsbCBlbnZpcm9ubWVudCB2YXJpYWJsZXMgYXJlIGRlZmluZWQ7IGlmIHZhbGlkYXRpb24gaXMgbmVlZGVkLCBcXGBhc3NlcnRcXGAgdGhlbSBhdCBzdGFydHVwIHRvIGZhaWwgZmFzdC5cbi0gQXNzdW1lIGxvY2FsIHRvb2xzIHN1Y2ggYXMgXFxgZ2l0XFxgLCBcXGBnaFxcYCwgYW5kIFxcYGdocVxcYCBhcmUgaW5zdGFsbGVkIGFuZCBhdXRoZW50aWNhdGVkLlxuJHtvc0NvbXBhdGliaWxpdHlJbnN0cnVjdGlvbn1cbiR7XG4gIGFsbENvbmZpZ3Muc29tZSgoYykgPT4gYy5kZXBlbmRpbmcuZ2VuSTE4blRzKVxuICAgID8gYC0gUmVnaXN0ZXIgc3RyaW5nIGxpdGVyYWxzIGZvciBSZWFjdCBjb21wb25lbnRzIGluIHRoZSBcXGBpMThuXFxgIHJlc291cmNlIGZpbGVzIChlLmcuLCBcXGBpMThuL2phLUpQLmpzb25cXGApIGFuZCByZWZlcmVuY2UgdGhlbSB2aWEgdGhlIFxcYGkxOG5cXGAgdXRpbGl0eSAoZS5nLiwgXFxgaTE4bi5wYWdlcy5ob21lLnRpdGxlKClcXGAgZm9yIFxcYHsgXCJwYWdlc1wiOiB7IFwiaG9tZVwiOiB7IFwidGl0bGVcIjogXCJNeSBBcHBcIiB9IH0gfVxcYCkuYFxuICAgIDogJydcbn1cblxuJHtcbiAgYWxsQ29uZmlncy5zb21lKChjKSA9PiBjLmRlcGVuZGluZy5yZWFjdCB8fCBjLmRlcGVuZGluZy5uZXh0IHx8IGMuZGVwZW5kaW5nLnZpbmV4dClcbiAgICA/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+ICdveGxpbnQtY29uZmlnJywgd2hpY2ggaXMgaXRzIGRpcmVjdG9yeSB1bmRlciBgcGFja2FnZXMvYC5cbiAgY29uc3QgY29uZmlnUGFja2FnZURpciA9IGNvbmZpZ1BhY2thZ2VOYW1lLnNwbGl0KCcvJykucG9wKCkgPz8gJyc7XG4gIC8vIERlcml2ZSB0aGUgd2lsbGJvb3N0ZXItY29uZmlncyByb290IGZyb20gdGhlIHBhY2thZ2UgYmVpbmcgZ2VuZXJhdGVkLCBub3QgZnJvbSB0aGUgQ0xJIGVudHJ5XG4gIC8vIHBhdGg6IGB3YmZ5IDxyZXBvPi9wYWNrYWdlcy88cGtnPmAgaXMgYSBzdXBwb3J0ZWQgaW52b2NhdGlvbiB3aG9zZSBlbnRyeSBjb25maWcgaXMgdGhlIGNoaWxkXG4gIC8vIHBhY2thZ2UgcmF0aGVyIHRoYW4gdGhlIHJlcG8gcm9vdCwgc28gcmVseWluZyBvbiB0aGUgZW50cnkgd291bGQgZW1pdCBhIG5lc3RlZCwgdW5yZXNvbHZhYmxlXG4gIC8vIHBhdGggZm9yIGEgZGlyZWN0bHkgdGFyZ2V0ZWQgY29uZmlnIHBhY2thZ2UuIEV2ZXJ5IHdpbGxib29zdGVyLWNvbmZpZ3MgcGFja2FnZSBpcyBlaXRoZXIgdGhlXG4gIC8vIHJvb3Qgb3IgYSBkaXJlY3QgY2hpbGQgdW5kZXIgYHBhY2thZ2VzL2AsIHNvIHRoZSByb290IGlzIHRoZSBwYWNrYWdlIGRpciBpdHNlbGYgb3IgaXRzIGdyYW5kcGFyZW50LlxuICBjb25zdCByZXBvUm9vdERpclBhdGggPSBjb25maWcuaXNSb290ID8gY29uZmlnLmRpclBhdGggOiBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICcuLicsICcuLicpO1xuICBjb25zdCBsb2NhbEVudHJ5ID0gcGF0aC5yZXNvbHZlKHJlcG9Sb290RGlyUGF0aCwgJ3BhY2thZ2VzJywgY29uZmlnUGFja2FnZURpciwgJ2NvbmZpZy5tanMnKTtcbiAgY29uc3QgcmVsYXRpdmVQYXRoID0gcGF0aC5yZWxhdGl2ZShjb25maWcuZGlyUGF0aCwgbG9jYWxFbnRyeSk7XG4gIHJldHVybiByZWxhdGl2ZVBhdGguc3RhcnRzV2l0aCgnLicpID8gcmVsYXRpdmVQYXRoIDogYC4vJHtyZWxhdGl2ZVBhdGh9YDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzUHVibGlzaGVkV2lsbGJvb3N0ZXJDb25maWdzUGFja2FnZShjb25maWc6IFBhY2thZ2VDb25maWcpOiBib29sZWFuIHtcbiAgcmV0dXJuIChcbiAgICBjb25maWcuaXNXaWxsQm9vc3RlckNvbmZpZ3MgJiZcbiAgICAhY29uZmlnLmlzUm9vdCAmJlxuICAgIGNvbmZpZy5wYWNrYWdlSnNvbj8ucHJpdmF0ZSAhPT0gdHJ1ZSAmJlxuICAgIEFycmF5LmlzQXJyYXkoY29uZmlnLnBhY2thZ2VKc29uPy5maWxlcykgJiZcbiAgICBjb25maWcucGFja2FnZUpzb24uZmlsZXMubGVuZ3RoID4gMFxuICApO1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHsgZ2xvYklnbm9yZSB9IGZyb20gJ0B3aWxsYm9vc3Rlci9zaGFyZWQtbGliLW5vZGUvc3JjJztcbmltcG9ydCBtZXJnZSBmcm9tICdkZWVwbWVyZ2UnO1xuaW1wb3J0IGZnIGZyb20gJ2Zhc3QtZ2xvYic7XG5pbXBvcnQgc2VtdmVyIGZyb20gJ3NlbXZlcic7XG5pbXBvcnQgeyBzb3J0UGFja2FnZUpzb24gfSBmcm9tICdzb3J0LXBhY2thZ2UtanNvbic7XG5pbXBvcnQgKiBhcyBhc3QgZnJvbSAndHlwZXNjcmlwdC91bnN0YWJsZS9hc3QnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlSnNvbiwgU2V0UmVxdWlyZWQgfSBmcm9tICd0eXBlLWZlc3QnO1xuXG5pbXBvcnQgeyBnZXRMYXRlc3RDb21taXRIYXNoIH0gZnJvbSAnLi4vZ2l0aHViL2NvbW1pdC5qcyc7XG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHsgZ2VuZXJhdGVzV29ya2VyVHlwZXMsIGdldFdvcmtlclR5cGVzU2NyaXB0RXJyb3IsIHR5cGUgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgY2xhc3NpZnlTY3JpcHRTZWdtZW50LCBzcGxpdFNjcmlwdFNlZ21lbnRzIH0gZnJvbSAnLi4vdXRpbHMvbWFuYWdlZFNjcmlwdFNlZ21lbnQuanMnO1xuaW1wb3J0IHsgZnNVdGlsIH0gZnJvbSAnLi4vdXRpbHMvZnNVdGlsLmpzJztcbmltcG9ydCB7IGdpdEh1YlV0aWwgfSBmcm9tICcuLi91dGlscy9naXRodWJVdGlsLmpzJztcbmltcG9ydCB7IGNvbWJpbmVNZXJnZSB9IGZyb20gJy4uL3V0aWxzL21lcmdlVXRpbC5qcyc7XG5pbXBvcnQgeyBkb2VzQ29udGFpbkphdmEsIGRvZXNDb250YWluSnNPclRzIH0gZnJvbSAnLi4vdXRpbHMvcGFja2FnZUNhcGFiaWxpdGllcy5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcbmltcG9ydCB7IHNwYXduU3luYywgc3Bhd25TeW5jQW5kUmV0dXJuU3Rkb3V0IH0gZnJvbSAnLi4vdXRpbHMvc3Bhd25VdGlsLmpzJztcbmltcG9ydCB7IGVzY2FwZVJlZ0V4cCB9IGZyb20gJy4uL3V0aWxzL3N0cmluZ1V0aWwuanMnO1xuaW1wb3J0IHsgZ2V0VHNjb25maWdCYXNlRGVwZW5kZW5jaWVzLCBtYW5hZ2VkVHNjb25maWdCYXNlRGVwZW5kZW5jaWVzIH0gZnJvbSAnLi4vdXRpbHMvdHNjb25maWdCYXNlLmpzJztcbmltcG9ydCB7IHBhcnNlU291cmNlRmlsZSB9IGZyb20gJy4uL3V0aWxzL3R5cGVzY3JpcHRBcGkuanMnO1xuaW1wb3J0IHsgaXNQdWJsaXNoZWRXaWxsYm9vc3RlckNvbmZpZ3NQYWNrYWdlIH0gZnJvbSAnLi4vdXRpbHMvd2lsbGJvb3N0ZXJDb25maWdzVXRpbC5qcyc7XG5pbXBvcnQge1xuICBnZXREZWNsYXJlZFdvcmtzcGFjZVBhdHRlcm5zLFxuICBnZXRXb3Jrc3BhY2VQYWNrYWdlSnNvblBhdGhzLFxuICBoYXNEZWNsYXJlZFBhY2thZ2VzU3RhclBhdHRlcm4sXG4gIGhhc0ltcGxpY2l0V29ya3NwYWNlQmFzZWxpbmUsXG59IGZyb20gJy4uL3V0aWxzL3dvcmtzcGFjZVV0aWwuanMnO1xuaW1wb3J0IHsgYnVuTWluaW11bVJlbGVhc2VBZ2VFeGNsdWRlcywgYnVuTWluaW11bVJlbGVhc2VBZ2VTZWNvbmRzIH0gZnJvbSAnLi9idW5maWcuanMnO1xuXG5jb25zdCBveGxpbnREZXBzID0gWydAd2lsbGJvb3N0ZXIvb3hmbXQtY29uZmlnJywgJ0B3aWxsYm9vc3Rlci9veGxpbnQtY29uZmlnJywgJ294Zm10JywgJ294bGludCcsICdveGxpbnQtdHNnb2xpbnQnXTtcbmNvbnN0IHR5cGVzY3JpcHREZXBlbmRlbmN5ID0gJ3R5cGVzY3JpcHQnO1xuLy8gVHlwZVNjcmlwdCA3J3MgYHR5cGVzY3JpcHRgIHBhY2thZ2UgaXMgdGhlIHRzZ28gbmF0aXZlIGNvbXBpbGVyIGFuZCBleHBvc2VzIG5vXG4vLyBwcm9ncmFtbWF0aWMgQVBJLiBOZXh0LmpzJ3MgYnVpbGQtdGltZSBgdmVyaWZ5VHlwZVNjcmlwdFNldHVwYCBuZWVkcyB0aGF0IEFQSSwgc29cbi8vIGBuZXh0IGJ1aWxkYCBmYWlscyAoXCJ0cnlpbmcgdG8gdXNlIFR5cGVTY3JpcHQgYnV0IGRvIG5vdCBoYXZlIHRoZSByZXF1aXJlZCBwYWNrYWdlKHMpXCIpXG4vLyB3aXRoIG9ubHkgYHR5cGVzY3JpcHRgIHY3IGluc3RhbGxlZC4gTmV4dC5qcyByZXNvbHZlcyB0aGUgdHNnbyBiaW5hcnkgdGhyb3VnaCB0aGVcbi8vIHNlcGFyYXRlIGBAdHlwZXNjcmlwdC9uYXRpdmUtcHJldmlld2AgcGFja2FnZSwgc28gTmV4dC5qcy1mYW1pbHkgcmVwb3MgbXVzdCBpbnN0YWxsXG4vLyBib3RoOyBvdGhlciByZXBvcyBvbmx5IG5lZWQgYHR5cGVzY3JpcHRgIGZvciBgdHNjYCB0eXBlY2hlY2tzLlxuY29uc3QgdHlwZXNjcmlwdEdvRGVwZW5kZW5jeSA9ICdAdHlwZXNjcmlwdC9uYXRpdmUtcHJldmlldyc7XG5jb25zdCB3YkRlcGVuZGVuY3kgPSAnQHdpbGxib29zdGVyL3diJztcbmNvbnN0IGJ1aWxkVHNEZXBlbmRlbmN5ID0gJ2J1aWxkLXRzJztcbmNvbnN0IGxlZnRob29rRGVwZW5kZW5jeSA9ICdsZWZ0aG9vayc7XG5jb25zdCBtYW5hZ2VkRGVwZW5kZW5jeU5hbWVzID0gbmV3IFNldChbXG4gIHdiRGVwZW5kZW5jeSxcbiAgYnVpbGRUc0RlcGVuZGVuY3ksXG4gIGxlZnRob29rRGVwZW5kZW5jeSxcbiAgdHlwZXNjcmlwdERlcGVuZGVuY3ksXG4gIHR5cGVzY3JpcHRHb0RlcGVuZGVuY3ksXG4gICdzb3J0LXBhY2thZ2UtanNvbicsXG4gIC8vIE1peGVkIEB0eXBlcy9idW4gdmVyc2lvbnMgYWNyb3NzIGEgbW9ub3JlcG8gbG9hZCB0d28gYnVuLXR5cGVzIGNvcGllcywgd2hpY2hcbiAgLy8gYnJlYWtzIGdsb2JhbCBpbnRlcmZhY2UgbWVyZ2luZyAoZS5nLiBSZXNwb25zZS9IZWFkZXJzKSBkdXJpbmcgdHlwZSBjaGVja2luZy5cbiAgJ0B0eXBlcy9idW4nLFxuICAuLi5veGxpbnREZXBzLFxuXSk7XG5jb25zdCBsYXRlc3REZXBlbmRlbmN5VmVyc2lvbkNhY2hlID0gbmV3IE1hcDxzdHJpbmcsIHN0cmluZz4oKTtcbmNvbnN0IHBhY2thZ2VBZ2VHYXRlTXMgPSBidW5NaW5pbXVtUmVsZWFzZUFnZVNlY29uZHMgKiAxMDAwO1xuY29uc3QgbnBtUGFja2FnZVRpbWVzQ2FjaGUgPSBuZXcgTWFwPHN0cmluZywgUmVjb3JkPHN0cmluZywgc3RyaW5nPj4oKTtcbmNvbnN0IGRlcGVuZGVuY3lTZWN0aW9uS2V5cyA9IFsnZGVwZW5kZW5jaWVzJywgJ2RldkRlcGVuZGVuY2llcycsICdvcHRpb25hbERlcGVuZGVuY2llcycsICdwZWVyRGVwZW5kZW5jaWVzJ10gYXMgY29uc3Q7XG5cbnR5cGUgV3JpdGFibGVQYWNrYWdlSnNvbiA9IFNldFJlcXVpcmVkPFxuICBQYWNrYWdlSnNvbixcbiAgJ3NjcmlwdHMnIHwgJ2RlcGVuZGVuY2llcycgfCAnZGV2RGVwZW5kZW5jaWVzJyB8ICdwZWVyRGVwZW5kZW5jaWVzJ1xuPjtcblxuaW50ZXJmYWNlIERlcGVuZGVuY3lVcGRhdGVzIHtcbiAgZGVwZW5kZW5jaWVzOiBzdHJpbmdbXTtcbiAgZGV2RGVwZW5kZW5jaWVzOiBzdHJpbmdbXTtcbiAgcHl0aG9uRGV2RGVwZW5kZW5jaWVzOiBzdHJpbmdbXTtcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlUGFja2FnZUpzb24oXG4gIGNvbmZpZzogUGFja2FnZUNvbmZpZyxcbiAgcm9vdENvbmZpZzogUGFja2FnZUNvbmZpZyxcbiAgc2tpcEFkZGluZ0RlcHM6IGJvb2xlYW5cbik6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2dlbmVyYXRlUGFja2FnZUpzb24nLCBhc3luYyAoKSA9PiB7XG4gICAgYXdhaXQgY29yZShjb25maWcsIHJvb3RDb25maWcsIHNraXBBZGRpbmdEZXBzKTtcbiAgfSk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGNvcmUoY29uZmlnOiBQYWNrYWdlQ29uZmlnLCByb290Q29uZmlnOiBQYWNrYWdlQ29uZmlnLCBza2lwQWRkaW5nRGVwczogYm9vbGVhbik6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCB3b3JrZXJUeXBlc1NjcmlwdEVycm9yID0gZ2V0V29ya2VyVHlwZXNTY3JpcHRFcnJvcihjb25maWcpO1xuICBpZiAod29ya2VyVHlwZXNTY3JpcHRFcnJvcikgdGhyb3cgbmV3IEVycm9yKHdvcmtlclR5cGVzU2NyaXB0RXJyb3IpO1xuICBjb25zdCBmaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJ3BhY2thZ2UuanNvbicpO1xuICBjb25zdCBqc29uT2JqID0gYXdhaXQgcmVhZFBhY2thZ2VKc29uKGZpbGVQYXRoKTtcbiAgdXBkYXRlU2NyaXB0cyhjb25maWcsIGpzb25PYmopO1xuICBhd2FpdCBlbnN1cmVUcnVzdGVkRGVwZW5kZW5jaWVzKGNvbmZpZywganNvbk9iaik7XG4gIG1vdmVNYW5hZ2VkVG9vbERlcGVuZGVuY2llc1RvRGV2RGVwZW5kZW5jaWVzKGpzb25PYmopO1xuICBwcnVuZUNhcGFiaWxpdHlEZXBlbmRlbnRDb21waWxlckRlcGVuZGVuY2llcyhjb25maWcsIGpzb25PYmopO1xuICBjb25zdCBkZXBlbmRlbmN5VXBkYXRlcyA9IGF3YWl0IGFwcGx5UGFja2FnZUpzb25Db252ZW50aW9ucyhjb25maWcsIHJvb3RDb25maWcsIGpzb25PYmopO1xuICBhd2FpdCBub3JtYWxpemVQYWNrYWdlTWV0YWRhdGEoY29uZmlnLCByb290Q29uZmlnLCBqc29uT2JqLCBkZXBlbmRlbmN5VXBkYXRlcyk7XG4gIC8vIE9uIGEgZmlyc3QgcnVuIHRoZXJlIGlzIG5vIG1hbmlmZXN0IGZvciBgYnVuIGFkZGAgdG8gdXBkYXRlIHJlbGlhYmx5LiBXcml0ZSB0aGUgcmVzb2x2ZWRcbiAgLy8gZGVwZW5kZW5jeSB2ZXJzaW9ucyBpbnRvIHRoZSBuZXcgbWFuaWZlc3QgZGlyZWN0bHk7IHRoZSBmaW5hbCByZXBvc2l0b3J5LXdpZGUgYGJ1biBpbnN0YWxsYFxuICAvLyB0aGVuIGluc3RhbGxzIHRoZW0gYW5kIHJlbWFpbnMgdGhlIGF1dGhvcml0YXRpdmUgZmFpbHVyZSBjaGVjay5cbiAgYWRkRGVwZW5kZW5jeVZlcnNpb25zVG9QYWNrYWdlSnNvbihcbiAgICBjb25maWcsXG4gICAgcm9vdENvbmZpZyxcbiAgICBqc29uT2JqLFxuICAgIGRlcGVuZGVuY3lVcGRhdGVzLFxuICAgIHNraXBBZGRpbmdEZXBzIHx8ICFjb25maWcuZG9lc0NvbnRhaW5QYWNrYWdlSnNvblxuICApO1xuICBhd2FpdCB1cGRhdGVQcml2YXRlUGFja2FnZXMoanNvbk9iaik7XG4gIHJlbW92ZUVtcHR5RGVwZW5kZW5jeVNlY3Rpb25zKGpzb25PYmopO1xuXG4gIGRlbGV0ZSBqc29uT2JqLnBhY2thZ2VNYW5hZ2VyO1xuICAvLyBZYXJuIHJlYWRzIHBhY2thZ2UuanNvbiBmcm9tIGRpc2sgYmVmb3JlIGRlY2lkaW5nIHdoZXRoZXIgYHlhcm4gYWRkIC1EYFxuICAvLyBjb25mbGljdHMgd2l0aCBhbiBleGlzdGluZyByZWd1bGFyIGRlcGVuZGVuY3ksIHNvIHRoaXMgd3JpdGUgbXVzdCBmaW5pc2hcbiAgLy8gYmVmb3JlIGluc3RhbGxpbmcgdGhlIG1hbmFnZWQgZGVwZW5kZW5jeSB1cGRhdGVzIGJlbG93LiBLZWVwIHRoaXMgZ2VuZXJhdGVkXG4gIC8vIGZpbGUgc29ydGVkIGV2ZW4gd2hlbiB3ZSBsYXRlciBydW4gdGhlIHRhcmdldCByZXBvc2l0b3J5J3MgZm9ybWF0dGVyIHNvIGFcbiAgLy8gbWlkLXJ1biBpbnRlcnJ1cHRpb24gbmV2ZXIgbGVhdmVzIHBhY2thZ2UuanNvbiBpbiBhIHBhcnRpYWxseSBtYW5hZ2VkIG9yZGVyLlxuICAvLyBBIHJlZnVzZWQgd3JpdGUgKGUuZy4gYSBzeW1saW5rZWQgcGFja2FnZS5qc29uKSBtdXN0IGFsc28gYWJvcnQgdGhlIGRlcGVuZGVuY3kgaW5zdGFsbGF0aW9uXG4gIC8vIGJlbG93OiBgYnVuIGFkZGAgZm9sbG93cyB0aGUgc3ltbGluayBhbmQgd291bGQgbW9kaWZ5IHRoZSBmaWxlIG91dHNpZGUgdGhlIHJlcG9zaXRvcnkuXG4gIGlmICghKGF3YWl0IGZzVXRpbC5nZW5lcmF0ZUZpbGUoZmlsZVBhdGgsIHNlcmlhbGl6ZVBhY2thZ2VKc29uKGpzb25PYmopKSkpIHJldHVybjtcblxuICBpZiAoIXNraXBBZGRpbmdEZXBzKSB7XG4gICAgaW5zdGFsbERlcGVuZGVuY3lVcGRhdGVzKGNvbmZpZywgcm9vdENvbmZpZywganNvbk9iaiwgZGVwZW5kZW5jeVVwZGF0ZXMpO1xuICAgIC8vIEEgbmV3bHkgY3JlYXRlZCBtYW5pZmVzdCBpcyBhbHJlYWR5IHNvcnRlZCBieSB3YmZ5J3MgYnVuZGxlZCBzZXJpYWxpemVyOyB0aGUgdGFyZ2V0IGZvcm1hdHRlclxuICAgIC8vIGlzIGF2YWlsYWJsZSB3aXRob3V0IGFuIGV4dHJhIGZldGNoIG9ubHkgd2hlbiB0aGlzIHJ1biBzdGFydGVkIHdpdGggcGFja2FnZS5qc29uLlxuICAgIGlmIChjb25maWcuZG9lc0NvbnRhaW5QYWNrYWdlSnNvbikge1xuICAgICAgZm9ybWF0UGFja2FnZUpzb25XaXRoUHJvamVjdEZvcm1hdHRlcihjb25maWcsIGZpbGVQYXRoKTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gc2VyaWFsaXplUGFja2FnZUpzb24oanNvbk9iajogV3JpdGFibGVQYWNrYWdlSnNvbik6IHN0cmluZyB7XG4gIC8vIGZzVXRpbC5nZW5lcmF0ZUZpbGUoKSBub3JtYWxpemVzIHRoZSB0cmFpbGluZyBuZXdsaW5lLCBzbyBrZWVwIHRoZSBzZXJpYWxpemVyXG4gIC8vIGZvY3VzZWQgb24gdGhlIEpTT04gcGF5bG9hZCBpdHNlbGYuXG4gIHJldHVybiBKU09OLnN0cmluZ2lmeShzb3J0UGFja2FnZUpzb24oanNvbk9iaiksIHVuZGVmaW5lZCwgMik7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHJlYWRQYWNrYWdlSnNvbihmaWxlUGF0aDogc3RyaW5nKTogUHJvbWlzZTxXcml0YWJsZVBhY2thZ2VKc29uPiB7XG4gIGxldCBqc29uT2JqOiBQYWNrYWdlSnNvbiA9IHt9O1xuICB0cnkge1xuICAgIGNvbnN0IGpzb25UZXh0ID0gYXdhaXQgZnMucHJvbWlzZXMucmVhZEZpbGUoZmlsZVBhdGgsICd1dGY4Jyk7XG4gICAganNvbk9iaiA9IEpTT04ucGFyc2UoanNvblRleHQpIGFzIFBhY2thZ2VKc29uO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIC8vIERvY3VtZW50YXRpb24tb25seSByZXBvc2l0b3JpZXMgaGF2ZSBubyBtYW5pZmVzdCBvbiB0aGVpciBmaXJzdCB3YmZ5IHJ1bi4gU3RhcnRpbmcgZnJvbSBhblxuICAgIC8vIGVtcHR5IG9iamVjdCBsZXRzIHRoZSBub3JtYWwgZ2VuZXJhdG9yIGVzdGFibGlzaCB0aGUgc2FtZSBtYW5hZ2VkIGJhc2VsaW5lIGFzIGV2ZXJ5IG90aGVyXG4gICAgLy8gcmVwb3NpdG9yeTsgbWFsZm9ybWVkIG9yIHVucmVhZGFibGUgZXhpc3RpbmcgbWFuaWZlc3RzIG11c3Qgc3RpbGwgZmFpbCBsb3VkbHkuXG4gICAgaWYgKChlcnJvciBhcyBOb2RlSlMuRXJybm9FeGNlcHRpb24pLmNvZGUgIT09ICdFTk9FTlQnKSB0aHJvdyBlcnJvcjtcbiAgfVxuICBqc29uT2JqLnNjcmlwdHMgPSBqc29uT2JqLnNjcmlwdHMgPz8ge307XG4gIGpzb25PYmouZGVwZW5kZW5jaWVzID0ganNvbk9iai5kZXBlbmRlbmNpZXMgPz8ge307XG4gIGpzb25PYmouZGV2RGVwZW5kZW5jaWVzID0ganNvbk9iai5kZXZEZXBlbmRlbmNpZXMgPz8ge307XG4gIGpzb25PYmoucGVlckRlcGVuZGVuY2llcyA9IGpzb25PYmoucGVlckRlcGVuZGVuY2llcyA/PyB7fTtcbiAgcmV0dXJuIGpzb25PYmogYXMgV3JpdGFibGVQYWNrYWdlSnNvbjtcbn1cblxuZnVuY3Rpb24gcHJ1bmVDYXBhYmlsaXR5RGVwZW5kZW50Q29tcGlsZXJEZXBlbmRlbmNpZXMoY29uZmlnOiBQYWNrYWdlQ29uZmlnLCBqc29uT2JqOiBXcml0YWJsZVBhY2thZ2VKc29uKTogdm9pZCB7XG4gIC8vIFJ1biBiZWZvcmUgYXBwbHlQYWNrYWdlSnNvbkNvbnZlbnRpb25zLCB3aGljaCByZS1hZGRzIHRzZ28gb25seSBmb3IgY3VycmVudCBOZXh0LmpzLWZhbWlseSByZXBvc2l0b3JpZXMuXG4gIGRlbGV0ZSBqc29uT2JqLmRlcGVuZGVuY2llc1t0eXBlc2NyaXB0R29EZXBlbmRlbmN5XTtcbiAgZGVsZXRlIGpzb25PYmouZGV2RGVwZW5kZW5jaWVzW3R5cGVzY3JpcHRHb0RlcGVuZGVuY3ldO1xuICBpZiAoIWNvbmZpZy5kb2VzQ29udGFpblR5cGVTY3JpcHQgJiYgIWNvbmZpZy5kb2VzQ29udGFpblR5cGVTY3JpcHRJblBhY2thZ2VzKSB7XG4gICAgZGVsZXRlIGpzb25PYmouZGVwZW5kZW5jaWVzW3R5cGVzY3JpcHREZXBlbmRlbmN5XTtcbiAgICBkZWxldGUganNvbk9iai5kZXZEZXBlbmRlbmNpZXNbdHlwZXNjcmlwdERlcGVuZGVuY3ldO1xuICB9XG59XG5cbmZ1bmN0aW9uIHVwZGF0ZVNjcmlwdHMoY29uZmlnOiBQYWNrYWdlQ29uZmlnLCBqc29uT2JqOiBXcml0YWJsZVBhY2thZ2VKc29uKTogdm9pZCB7XG4gIGpzb25PYmouc2NyaXB0cyA9IHsgLi4uanNvbk9iai5zY3JpcHRzLCAuLi5nZW5lcmF0ZVNjcmlwdHMoY29uZmlnLCBqc29uT2JqLnNjcmlwdHMpIH07XG59XG5cbi8qKlxuICogS2VlcHMgdGhlIHByb2plY3QncyBvd24gc2VnbWVudHMgaW4gb3JkZXIsIHJlcGxhY2luZyB0aGUgZmlyc3QgbWFuYWdlZCBnZW4tY29kZSBzcGVsbGluZyB3aXRoXG4gKiBgYnVuIHdiIGdlbi1jb2RlYCBhbmQgZHJvcHBpbmcgbGF0ZXIgZHVwbGljYXRlcy4gQXBwZW5kcyBnZW5lcmF0aW9uIG9ubHkgd2hlbiB0aGUgc2NyaXB0XG4gKiBjb250YWluZWQgbm9uZSwgc28gbm90aGluZyBpcyByZW9yZGVyZWQuXG4gKi9cbmZ1bmN0aW9uIHJlYnVpbGRQb3N0aW5zdGFsbFNlZ21lbnRzKHNlZ21lbnRzOiBzdHJpbmdbXSwgc2NyaXB0czogUGFja2FnZUpzb24uU2NyaXB0cyk6IHN0cmluZ1tdIHtcbiAgY29uc3Qga2luZHMgPSBzZWdtZW50cy5tYXAoKHNlZ21lbnQpID0+IGNsYXNzaWZ5U2NyaXB0U2VnbWVudChzZWdtZW50LCBzY3JpcHRzLCB0cnVlKSk7XG4gIC8vIEEgd3JhcHBlciBhcm91bmQgYSBjdXN0b21pemVkIGdlbi1jb2RlIGFscmVhZHkgZ2VuZXJhdGVzOyBhZGRpbmcgYW5vdGhlciBpbnZvY2F0aW9uIHdvdWxkIHJ1biBldmVyeVxuICAvLyBnZW5lcmF0b3IgdHdpY2UuXG4gIGxldCBnZW5lcmF0aW9uUGxhY2VkID0ga2luZHMuaW5jbHVkZXMoJ2dlbkNvZGVXcmFwcGVyJyk7XG4gIGNvbnN0IHJlc3VsdDogc3RyaW5nW10gPSBbXTtcbiAgZm9yIChjb25zdCBbaW5kZXgsIHNlZ21lbnRdIG9mIHNlZ21lbnRzLmVudHJpZXMoKSkge1xuICAgIGNvbnN0IGtpbmQgPSBraW5kc1tpbmRleF07XG4gICAgaWYgKGtpbmQgPT09ICdjdXN0b20nIHx8IGtpbmQgPT09ICdnZW5Db2RlV3JhcHBlcicpIHtcbiAgICAgIHJlc3VsdC5wdXNoKHNlZ21lbnQpO1xuICAgIH0gZWxzZSBpZiAoIWdlbmVyYXRpb25QbGFjZWQpIHtcbiAgICAgIHJlc3VsdC5wdXNoKCdidW4gd2IgZ2VuLWNvZGUnKTtcbiAgICAgIGdlbmVyYXRpb25QbGFjZWQgPSB0cnVlO1xuICAgIH1cbiAgfVxuICBpZiAoIWdlbmVyYXRpb25QbGFjZWQpIHJlc3VsdC5wdXNoKCdidW4gd2IgZ2VuLWNvZGUnKTtcbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuLyoqXG4gKiBOb3JtYWxpemVzIG1hbmFnZWQgZ2VuLWNvZGUgc2VnbWVudHMgd2hpbGUga2VlcGluZyB0aGUgZmlyc3Qgc2VnbWVudCdzIHBvc2l0aW9uIHNvIGEgY3VzdG9tXG4gKiBzdGVwIHRoYXQgY29uc3VtZXMgZ2VuZXJhdGVkIG91dHB1dCBzdGlsbCBydW5zIGFmdGVyIGl0LiBSZXR1cm5zIHdpdGhvdXQgY2hhbmdpbmcgYW5cbiAqIHVucGFyc2VhYmxlIHNjcmlwdC5cbiAqL1xuZnVuY3Rpb24gdXBkYXRlUG9zdGluc3RhbGxTY3JpcHQoc2NyaXB0czogUGFja2FnZUpzb24uU2NyaXB0cywgbWFuYWdlc1dvcmtlclR5cGVzOiBib29sZWFuKTogdm9pZCB7XG4gIC8vIGBidW4gd2IgZ2VuLWNvZGVgIHJlZ2VuZXJhdGVzIHdvcmtlci1jb25maWd1cmF0aW9uLmQudHMgaXRzZWxmLCBzbyBhIHBhY2thZ2Ugd2l0aCBhXG4gIC8vIGNvZGUtZ2VuZXJhdGlvbiBvciB3b3JrZXItdHlwZXMgcGlwZWxpbmUgZ2V0cyBvbmUgbWFuYWdlZCBnZW5lcmF0aW9uIHNlZ21lbnQuXG4gIGlmIChzY3JpcHRzWydnZW4tY29kZSddIHx8IG1hbmFnZXNXb3JrZXJUeXBlcykge1xuICAgIC8vIFByb2plY3Qtb3duZWQgc3RlcHMgYXJlIG5ldmVyIGRyb3BwZWQsIGFuZCB0aGVpciBQT1NJVElPTiByZWxhdGl2ZSB0byBnZW5lcmF0aW9uIGlzIHByZXNlcnZlZDogYSBzdGVwXG4gICAgLy8gYmVmb3JlIGl0IG1heSBwcm9kdWNlIGB3cmFuZ2xlciB0eXBlc2AnIGlucHV0cyAoYSB3cmFuZ2xlciBjb25maWcsIGAuZGV2LnZhcnNgKSwgd2hpbGUgb25lIGFmdGVyIGl0IG1heVxuICAgIC8vIGNvbnN1bWUgdGhlIGdlbmVyYXRlZCB0eXBlcy4gU28gdGhlIG1hbmFnZWQgZ2VuZXJhdGlvbiByZXBsYWNlcyB0aGUgZmlyc3QgbWFuYWdlZCBzZWdtZW50IGluIHBsYWNlLCBhbmQgaXNcbiAgICAvLyBhcHBlbmRlZCBvbmx5IHdoZW4gdGhlIHNjcmlwdCBoYWQgbm9uZS4gQSB3cmFwcGVyIGFyb3VuZCBhIGN1c3RvbWl6ZWQgZ2VuLWNvZGUgYWxyZWFkeSBwZXJmb3JtcyB0aGVcbiAgICAvLyBnZW5lcmF0aW9uIHBsdXMgdGhlIHByb2plY3QncyBvd24gc3RlcHMsIHNvIGl0IHN1cHByZXNzZXMgdGhlIHJlcGxhY2VtZW50IGVudGlyZWx5LlxuICAgIGNvbnN0IHNlZ21lbnRzID0gc2NyaXB0cy5wb3N0aW5zdGFsbCA9PT0gdW5kZWZpbmVkID8gW10gOiBzcGxpdFNjcmlwdFNlZ21lbnRzKHNjcmlwdHMucG9zdGluc3RhbGwpO1xuICAgIGNvbnN0IGtlcHRTZWdtZW50cyA9IHNlZ21lbnRzICYmIHJlYnVpbGRQb3N0aW5zdGFsbFNlZ21lbnRzKHNlZ21lbnRzLCBzY3JpcHRzKTtcbiAgICBpZiAoa2VwdFNlZ21lbnRzKSB7XG4gICAgICBzY3JpcHRzLnBvc3RpbnN0YWxsID0ga2VwdFNlZ21lbnRzLmpvaW4oJyAmJiAnKTtcbiAgICB9XG4gICAgLy8gQW55IG90aGVyIHVucGFyc2VhYmxlIHBvc3RpbnN0YWxsIGlzIGxlZnQgdG8gYSBodW1hbiByYXRoZXIgdGhhbiByZXdyaXR0ZW4gZnJvbSBhIHdyb25nIHBhcnNlLlxuICB9XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGFwcGx5UGFja2FnZUpzb25Db252ZW50aW9ucyhcbiAgY29uZmlnOiBQYWNrYWdlQ29uZmlnLFxuICByb290Q29uZmlnOiBQYWNrYWdlQ29uZmlnLFxuICBqc29uT2JqOiBXcml0YWJsZVBhY2thZ2VKc29uXG4pOiBQcm9taXNlPERlcGVuZGVuY3lVcGRhdGVzPiB7XG4gIGNvbnN0IGRlcGVuZGVuY2llczogc3RyaW5nW10gPSBbXTtcbiAgY29uc3QgZGV2RGVwZW5kZW5jaWVzID0gWydzb3J0LXBhY2thZ2UtanNvbiddO1xuICBjb25zdCBweXRob25EZXZEZXBlbmRlbmNpZXM6IHN0cmluZ1tdID0gW107XG4gIGNvbnN0IGhhc0phdmEgPSBkb2VzQ29udGFpbkphdmEoY29uZmlnKTtcblxuICBpZiAoXG4gICAgaGFzSmF2YSAmJlxuICAgICFmcy5leGlzdHNTeW5jKHBhdGguam9pbihyb290Q29uZmlnLmRpclBhdGgsICcucHJldHRpZXJyYy5qc29uJykpICYmXG4gICAgIWZzLmV4aXN0c1N5bmMocGF0aC5qb2luKGNvbmZpZy5kaXJQYXRoLCAnLnByZXR0aWVycmMuanNvbicpKVxuICApIHtcbiAgICBqc29uT2JqLnByZXR0aWVyID0gJ0B3aWxsYm9vc3Rlci9wcmV0dGllci1jb25maWcnO1xuICAgIGRldkRlcGVuZGVuY2llcy5wdXNoKCdwcmV0dGllci1wbHVnaW4tamF2YScsICdAd2lsbGJvb3N0ZXIvcHJldHRpZXItY29uZmlnJyk7XG4gIH1cbiAgaWYgKGhhc0phdmEpIHtcbiAgICBkZXZEZXBlbmRlbmNpZXMucHVzaCgncHJldHRpZXInKTtcbiAgfVxuXG4gIGlmIChjb25maWcuaXNSb290KSB7XG4gICAgLy8gTGVmdGhvb2sgZ2VuZXJhdGlvbiBpcyBiZXN0LWVmZm9ydCBhbmQgLmxlZnRob29rIGlzIGFic2VudCBmcm9tIERvY2tlciBidWlsZCBjb250ZXh0cywgc28gYVxuICAgIC8vIG1pc3Npbmcgbm9ybWFsaXplciBpcyB2YWxpZC4gT25jZSBwcmVzZW50LCBpdHMgZmFpbHVyZSBtdXN0IGFib3J0IGluc3RhbGwgcmF0aGVyIHRoYW4gbGVhdmUgYVxuICAgIC8vIEd1YXJkLXBpbm5lZCBsb2NrZmlsZSBiZWhpbmQ7IGtlZXAgdGhhdCBmYWlsLWZhc3QgZ3JvdXBpbmcgZXhwbGljaXQgYmVmb3JlIGFueSB3b3Jrc3BhY2UgYnVpbGQuXG4gICAganNvbk9iai5zY3JpcHRzLnByZXBhcmUgPVxuICAgICAgJyhidW4gbGVmdGhvb2sgaW5zdGFsbCB8fCB0cnVlKSAmJiAodGVzdCAhIC1mIC5sZWZ0aG9vay9ub3JtYWxpemUtYnVuLWxvY2tmaWxlLnNoIHx8IGJhc2ggLmxlZnRob29rL25vcm1hbGl6ZS1idW4tbG9ja2ZpbGUuc2gpJztcbiAgICAvLyBXaGVuIEB3aWxsYm9vc3Rlci93YiBpcyBhIHdvcmtzcGFjZSBvZiB0aGlzIHJlcG9zaXRvcnksIHRoZSBnZW5lcmF0ZWQgYGJ1biB3YiDigKZgIHNjcmlwdHMgcnVuXG4gICAgLy8gaXRzIGdpdGlnbm9yZWQgZGlzdCBidWlsZCAoYmluL2luZGV4LmpzIGltcG9ydHMgLi4vZGlzdC9pbmRleC5qcyksIHNvIGEgZnJlc2ggY2hlY2tvdXQgbXVzdFxuICAgIC8vIGJ1aWxkIGl0IGR1cmluZyBpbnN0YWxsOyByZWdpc3RyeSBpbnN0YWxscyBzaGlwIGEgcHJlYnVpbHQgZGlzdCBhbmQgbmVlZCBubyBleHRyYSBzdGVwLlxuICAgIGNvbnN0IHdiV29ya3NwYWNlRGlyID0gZ2V0V29ya3NwYWNlUGFja2FnZURpcnMocm9vdENvbmZpZykuZ2V0KHdiRGVwZW5kZW5jeSk7XG4gICAgaWYgKHdiV29ya3NwYWNlRGlyKSB7XG4gICAgICAvLyBTaW5nbGUgcXVvdGVzICh3aXRoIGVtYmVkZGVkIHF1b3RlcyBlc2NhcGVkKSBwcmV2ZW50IHRoZSBzaGVsbCBmcm9tIGV4cGFuZGluZyBgJCjigKYpYCBvclxuICAgICAgLy8gdmFyaWFibGVzIHRoYXQgYSBob3N0aWxlIGRpcmVjdG9yeSBuYW1lIGNvdWxkIHNtdWdnbGUgaW50byB0aGUgZ2VuZXJhdGVkIHNjcmlwdC5cbiAgICAgIGpzb25PYmouc2NyaXB0cy5wcmVwYXJlICs9IGAgJiYgYnVuIHJ1biAtLWN3ZCAnJHt3YldvcmtzcGFjZURpci5yZXBsYWNlQWxsKFwiJ1wiLCBTdHJpbmcucmF3YCdcXCcnYCl9JyBidWlsZGA7XG4gICAgfVxuICAgIGRldkRlcGVuZGVuY2llcy5wdXNoKGxlZnRob29rRGVwZW5kZW5jeSk7XG5cbiAgICBpZiAoY29uZmlnLmRlcGVuZGluZy5zZW1hbnRpY1JlbGVhc2UpIHtcbiAgICAgIGlmIChkb2VzUmVsZWFzZVNjcmlwdEluc3RhbGxTZW1hbnRpY1JlbGVhc2UoanNvbk9iai5zY3JpcHRzLnJlbGVhc2UpKSB7XG4gICAgICAgIGRlbGV0ZSBqc29uT2JqLmRldkRlcGVuZGVuY2llc1snc2VtYW50aWMtcmVsZWFzZSddO1xuICAgICAgfSBlbHNlIGlmIChcbiAgICAgICAgIWpzb25PYmouZGV2RGVwZW5kZW5jaWVzWydzZW1hbnRpYy1yZWxlYXNlJ10gJiZcbiAgICAgICAgIWpzb25PYmouZGV2RGVwZW5kZW5jaWVzWydtdWx0aS1zZW1hbnRpYy1yZWxlYXNlJ10gJiZcbiAgICAgICAgIWpzb25PYmouZGV2RGVwZW5kZW5jaWVzWydAcWl3aS9tdWx0aS1zZW1hbnRpYy1yZWxlYXNlJ11cbiAgICAgICkge1xuICAgICAgICBkZXZEZXBlbmRlbmNpZXMucHVzaCgnc2VtYW50aWMtcmVsZWFzZScpO1xuICAgICAgfVxuICAgICAganNvbk9iai52ZXJzaW9uID0gJzAuMC4wLXNlbWFudGljYWxseS1yZWxlYXNlZCc7XG4gICAgfVxuXG4gICAgaWYgKGNvbmZpZy5kZXBlbmRpbmcucGxheXdyaWdodFRlc3QpIHtcbiAgICAgIC8vIFNpbmNlIGFydGlsbGVyeSByZXF1aXJlcyBhIHNwZWNpZmljIHZlcnNpb24gb2YgQHBsYXl3cmlnaHQvdGVzdFxuICAgICAgY29uc3QgaGFzQXJ0aWxsZXJ5ID0ganNvbk9iai5kZXBlbmRlbmNpZXMuYXJ0aWxsZXJ5IHx8IGpzb25PYmouZGV2RGVwZW5kZW5jaWVzLmFydGlsbGVyeTtcbiAgICAgIC8vIFNpbmNlIGxsbS10b29sYm94IHJlcXVpcmVzIEBwbGF5d3JpZ2h0L3Rlc3QgaW4gZGVwZW5kZW5jaWVzXG4gICAgICBpZiAoIWhhc0FydGlsbGVyeSAmJiAhanNvbk9iai5kZXBlbmRlbmNpZXNbJ0BwbGF5d3JpZ2h0L3Rlc3QnXSkge1xuICAgICAgICBkZXZEZXBlbmRlbmNpZXMucHVzaCgnQHBsYXl3cmlnaHQvdGVzdCcpO1xuICAgICAgfVxuICAgICAgaWYgKGNvbmZpZy5kZXBlbmRpbmcucGxheXdyaWdodFJ1bnRpbWUpIHtcbiAgICAgICAgLy8gUnVudGltZSBpbXBvcnRzIG5lZWQgdGhlIHN0YW5kYWxvbmUgcGFja2FnZSBhZnRlciBEb2NrZXIgcHJ1bmluZyByZW1vdmVzIGRldkRlcGVuZGVuY2llcy5cbiAgICAgICAganNvbk9iai5kZXBlbmRlbmNpZXMucGxheXdyaWdodCA/Pz1cbiAgICAgICAgICBqc29uT2JqLmRldkRlcGVuZGVuY2llcy5wbGF5d3JpZ2h0ID8/XG4gICAgICAgICAganNvbk9iai5kZXBlbmRlbmNpZXNbJ0BwbGF5d3JpZ2h0L3Rlc3QnXSA/P1xuICAgICAgICAgIGpzb25PYmouZGV2RGVwZW5kZW5jaWVzWydAcGxheXdyaWdodC90ZXN0J107XG4gICAgICAgIGRlcGVuZGVuY2llcy5wdXNoKCdwbGF5d3JpZ2h0Jyk7XG4gICAgICAgIGRlbGV0ZSBqc29uT2JqLmRldkRlcGVuZGVuY2llcy5wbGF5d3JpZ2h0O1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZGVsZXRlIGpzb25PYmouZGVwZW5kZW5jaWVzLnBsYXl3cmlnaHQ7XG4gICAgICAgIGRlbGV0ZSBqc29uT2JqLmRldkRlcGVuZGVuY2llcy5wbGF5d3JpZ2h0O1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChjb25maWcuZG9lc0NvbnRhaW5TdWJQYWNrYWdlSnNvbnMpIHtcbiAgICAgIC8vIFdlIGRvbid0IGFsbG93IG5vbi1hcnJheSB3b3Jrc3BhY2VzIGluIG1vbm9yZXBvLiBZYXJuIHYxJ3Mgb2JqZWN0IGZvcm0ga2VlcHMgaXRzXG4gICAgICAvLyBkZWNsYXJlZCBwYXR0ZXJucyAod29ya3NwYWNlcy5wYWNrYWdlcyk7IG9ubHkgZXh0cmFzIHN1Y2ggYXMgbm9ob2lzdCBhcmUgZHJvcHBlZC5cbiAgICAgIC8vIEZvcmNlIGBwYWNrYWdlcy8qYCBvbmx5IHdoZW4gaXQgYWN0dWFsbHkgbWF0Y2hlcyBhIHdvcmtzcGFjZSBtYW5pZmVzdDogYW4gYXBwcy8qLW9ubHlcbiAgICAgIC8vIG1vbm9yZXBvIG11c3Qgbm90IGdldCBhIG5ldmVyLW1hdGNoaW5nIHBhdHRlcm4gYXBwZW5kZWQgdG8gaXRzIGRlY2xhcmF0aW9uLiBBXG4gICAgICAvLyBiYXNlbGluZS1zZWVkaW5nIGRlY2xhcmF0aW9uIG5lZWRzIG5vIGZvcmNlZCBwYXR0ZXJuIGF0IGFsbCDigJQgdGhlIHNlZWRlZCBiYXNlbGluZVxuICAgICAgLy8gKGAqLypgIG9yIGAqKmApIGFscmVhZHkgY292ZXJzIHBhY2thZ2VzLyouIFRoZSBmb3JjZWQgcGF0dGVybiBpcyBQUkVQRU5ERUQ6IEJ1blxuICAgICAgLy8gZXZhbHVhdGVzIHdvcmtzcGFjZSBwYXR0ZXJucyBzZXF1ZW50aWFsbHksIHNvIGEgcG9zaXRpdmUgcGF0dGVybiBwbGFjZWQgYWZ0ZXIgYSB1c2VyXG4gICAgICAvLyBuZWdhdGlvbiB3b3VsZCByZS1pbmNsdWRlIHRoZSBuZWdhdGVkIHBhY2thZ2VzLiBBIGRlY2xhcmF0aW9uIHRoYXQgYWxyZWFkeSBjb3ZlcnNcbiAgICAgIC8vIHBhY2thZ2VzLyogdW5kZXIgbm9ybWFsaXphdGlvbiAoZS5nLiBgLi9wYWNrYWdlcy8qYCkgaXMga2VwdCB2ZXJiYXRpbTogZm9yY2luZyBhIHRleHR1YWxcbiAgICAgIC8vIGBwYWNrYWdlcy8qYCBuZXh0IHRvIGl0IHdvdWxkIHBlcnNpc3QgYSBkdXBsaWNhdGUgZXF1aXZhbGVudCBwYXR0ZXJuLlxuICAgICAgY29uc3QgZm9yY2VkUGF0dGVybnMgPVxuICAgICAgICAhaGFzSW1wbGljaXRXb3Jrc3BhY2VCYXNlbGluZShqc29uT2JqLndvcmtzcGFjZXMpICYmXG4gICAgICAgICFoYXNEZWNsYXJlZFBhY2thZ2VzU3RhclBhdHRlcm4oanNvbk9iai53b3Jrc3BhY2VzKSAmJlxuICAgICAgICBmZy5nbG9iU3luYygncGFja2FnZXMvKi9wYWNrYWdlLmpzb24nLCB7IGN3ZDogY29uZmlnLmRpclBhdGgsIGlnbm9yZTogWycqKi9ub2RlX21vZHVsZXMvKionXSB9KS5sZW5ndGggPiAwXG4gICAgICAgICAgPyBbJ3BhY2thZ2VzLyonXVxuICAgICAgICAgIDogW107XG4gICAgICBqc29uT2JqLndvcmtzcGFjZXMgPSBtZXJnZS5hbGwoW2ZvcmNlZFBhdHRlcm5zLCBnZXREZWNsYXJlZFdvcmtzcGFjZVBhdHRlcm5zKGpzb25PYmoud29ya3NwYWNlcyldLCB7XG4gICAgICAgIGFycmF5TWVyZ2U6IGNvbWJpbmVNZXJnZSxcbiAgICAgIH0pO1xuICAgICAgLy8gQm90aCBpbnB1dHMgY2FuIGJlIGVtcHR5IChlLmcuIHBhY2thZ2VzL3BhY2thZ2UuanNvbiB3aXRob3V0IGFueSBwYWNrYWdlcy8qL3BhY2thZ2UuanNvblxuICAgICAgLy8gYW5kIG5vIGRlY2xhcmVkIHdvcmtzcGFjZXMpOyBkbyBub3QgcGVyc2lzdCBhIG1lYW5pbmdsZXNzIGB3b3Jrc3BhY2VzOiBbXWAuXG4gICAgICBpZiAoQXJyYXkuaXNBcnJheShqc29uT2JqLndvcmtzcGFjZXMpICYmIGpzb25PYmoud29ya3NwYWNlcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgZGVsZXRlIGpzb25PYmoud29ya3NwYWNlcztcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKEFycmF5LmlzQXJyYXkoanNvbk9iai53b3Jrc3BhY2VzKSkge1xuICAgICAganNvbk9iai53b3Jrc3BhY2VzID0ganNvbk9iai53b3Jrc3BhY2VzLmZpbHRlcihcbiAgICAgICAgKHdvcmtzcGFjZSkgPT5cbiAgICAgICAgICBmZy5nbG9iU3luYyh3b3Jrc3BhY2UsIHtcbiAgICAgICAgICAgIGRvdDogdHJ1ZSxcbiAgICAgICAgICAgIGN3ZDogY29uZmlnLmRpclBhdGgsXG4gICAgICAgICAgICBpZ25vcmU6IGdsb2JJZ25vcmUsXG4gICAgICAgICAgfSkubGVuZ3RoID4gMFxuICAgICAgKTtcbiAgICAgIGlmIChqc29uT2JqLndvcmtzcGFjZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIGRlbGV0ZSBqc29uT2JqLndvcmtzcGFjZXM7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLy8gZml4ZXJzL25leHRDb25maWcudHMgZW5hYmxlcyBgcmVhY3RDb21waWxlcjogdHJ1ZWAgZm9yIGV2ZXJ5IE5leHQuanMgcHJvamVjdCwgYW5kIE5leHQuanNcbiAgLy8gcmVzb2x2ZXMgYGJhYmVsLXBsdWdpbi1yZWFjdC1jb21waWxlcmAgYXQgYnVpbGQgdGltZSB3aGVuIFJlYWN0IENvbXBpbGVyIGlzIG9uLiBBZGQgaXQgaGVyZSBzb1xuICAvLyB0aGUgbWFuYWdlZCBuZXh0LmNvbmZpZyBuZXZlciBicmVha3MgYG5leHQgYnVpbGRgIHdpdGggYW4gdW5yZXNvbHZlZC1wYWNrYWdlIGVycm9yLlxuICBpZiAoY29uZmlnLmRlcGVuZGluZy5uZXh0KSB7XG4gICAgZGV2RGVwZW5kZW5jaWVzLnB1c2goJ2JhYmVsLXBsdWdpbi1yZWFjdC1jb21waWxlcicpO1xuICB9XG5cbiAgLy8gYHdiIHZlcmlmeSAtLWZ1bGxgIGF1ZGl0cyBldmVyeSBgKi5zbGlkZXYubWRgIGRlY2sgd2l0aCBzbGlkZXYtY2hlY2ssIHNvIHRoZSBjaGVja2VyIGhhcyB0byBiZVxuICAvLyBpbnN0YWxsZWQgd2hlcmV2ZXIgYSBkZWNrIGxpdmVzLlxuICBpZiAoY29uZmlnLmRvZXNDb250YWluU2xpZGV2TWQpIHtcbiAgICBkZXZEZXBlbmRlbmNpZXMucHVzaCgnc2xpZGV2LWNoZWNrJyk7XG4gIH1cblxuICBpZiAoIWlzV2JQYWNrYWdlKGpzb25PYmopKSB7XG4gICAgLy8gQSBgd29ya3NwYWNlOmAgc3BlY2lmaWVyIGRlcGVuZHMgb24gdGhlIHdiIGRldmVsb3BlZCBpbiB0aGlzIHJlcG9zaXRvcnkgKGUuZy5cbiAgICAvLyBXaWxsQm9vc3Rlci9zaGFyZWQgaXRzZWxmKTsgaW5zdGFsbGluZyB0aGUgbGF0ZXN0IHJlZ2lzdHJ5IHJlbGVhc2Ugb3ZlciBpdCB3b3VsZCBzaWxlbnRseVxuICAgIC8vIHJlcGxhY2UgdGhlIGxvY2FsIGJ1aWxkIHdpdGggYSBwdWJsaXNoZWQgb25lLCBzbyBsZWF2ZSBzdWNoIGEgZGVjbGFyYXRpb24gdW50b3VjaGVkLlxuICAgIGNvbnN0IHdiU3BlY2lmaWVyID0ganNvbk9iai5kZXBlbmRlbmNpZXNbd2JEZXBlbmRlbmN5XSA/PyBqc29uT2JqLmRldkRlcGVuZGVuY2llc1t3YkRlcGVuZGVuY3ldO1xuICAgIGlmICghd2JTcGVjaWZpZXI/LnN0YXJ0c1dpdGgoJ3dvcmtzcGFjZTonKSkge1xuICAgICAgaWYgKHNob3VsZEtlZXBXYkFzUnVudGltZURlcGVuZGVuY3koanNvbk9iaikpIHtcbiAgICAgICAgZGVwZW5kZW5jaWVzLnB1c2god2JEZXBlbmRlbmN5KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGRldkRlcGVuZGVuY2llcy5wdXNoKHdiRGVwZW5kZW5jeSk7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIC8vIGJ1aWxkLXRzIG93bnMgVHlwZVNjcmlwdCBleGVjdXRpb24gYW5kIGRlY2xhcmF0aW9uIGVtaXQuIHdiZnkgbXVzdCBhbHdheXNcbiAgLy8ga2VlcCBleGlzdGluZyBidWlsZC10cyB1c2VycyBjdXJyZW50IGJlY2F1c2Ugb2xkZXIgcmVsZWFzZXMgY2FuIGVtaXQgLmQudHNcbiAgLy8gZmlsZXMgYXQgcGF0aHMgdGhhdCBubyBsb25nZXIgbWF0Y2ggcGFja2FnZSBleHBvcnRzLlxuICBpZiAoXG4gICAganNvbk9iai5kZXBlbmRlbmNpZXNbYnVpbGRUc0RlcGVuZGVuY3ldIHx8XG4gICAganNvbk9iai5kZXZEZXBlbmRlbmNpZXNbYnVpbGRUc0RlcGVuZGVuY3ldIHx8XG4gICAgT2JqZWN0LnZhbHVlcyhqc29uT2JqLnNjcmlwdHMpLnNvbWUoKHNjcmlwdCkgPT4gc2NyaXB0Py5pbmNsdWRlcyhidWlsZFRzRGVwZW5kZW5jeSkpXG4gICkge1xuICAgIGlmIChzaG91bGRLZWVwQnVpbGRUc0FzUnVudGltZURlcGVuZGVuY3koanNvbk9iaikpIHtcbiAgICAgIGRlcGVuZGVuY2llcy5wdXNoKGJ1aWxkVHNEZXBlbmRlbmN5KTtcbiAgICB9IGVsc2Uge1xuICAgICAgZGV2RGVwZW5kZW5jaWVzLnB1c2goYnVpbGRUc0RlcGVuZGVuY3kpO1xuICAgIH1cbiAgfVxuICBpZiAoZG9lc0NvbnRhaW5Kc09yVHMoY29uZmlnKSkge1xuICAgIGRldkRlcGVuZGVuY2llcy5wdXNoKC4uLm94bGludERlcHMpO1xuICB9XG5cbiAgY29uc3QgdHNjb25maWdCYXNlRGVwZW5kZW5jaWVzID0gZG9lc0NvbnRhaW5Kc09yVHMoY29uZmlnKSA/IGdldFRzY29uZmlnQmFzZURlcGVuZGVuY2llcyhjb25maWcpIDogW107XG4gIGF3YWl0IHJlbW92ZVVudXNlZFRzY29uZmlnQmFzZURlcGVuZGVuY2llcyhjb25maWcsIGpzb25PYmosIHRzY29uZmlnQmFzZURlcGVuZGVuY2llcyk7XG4gIGRldkRlcGVuZGVuY2llcy5wdXNoKC4uLnRzY29uZmlnQmFzZURlcGVuZGVuY2llcyk7XG5cbiAgaWYgKGNvbmZpZy5kb2VzQ29udGFpblR5cGVTY3JpcHQgfHwgY29uZmlnLmRvZXNDb250YWluVHlwZVNjcmlwdEluUGFja2FnZXMpIHtcbiAgICAvLyBUeXBlU2NyaXB0IDcgc2hpcHMgdGhlIG5hdGl2ZSBjb21waWxlciBhcyB0aGUgYHR5cGVzY3JpcHRgIHBhY2thZ2UsIHNvIGl0IGlzXG4gICAgLy8gbm93IHRoZSBtYW5hZ2VkIGNvbXBpbGVyIGZvciBldmVyeSBUeXBlU2NyaXB0IHJlcG8gKHR5cGVjaGVja2luZyBydW5zIGB0c2NgKS5cbiAgICBkZXZEZXBlbmRlbmNpZXMucHVzaCh0eXBlc2NyaXB0RGVwZW5kZW5jeSk7XG4gICAgLy8gTmV4dC5qcydzIGBuZXh0IGJ1aWxkYCBpbnNwZWN0cyBgQHR5cGVzY3JpcHQvbmF0aXZlLXByZXZpZXdgICh0c2dvKSB0byBydW4gaXRzIHR5cGVcbiAgICAvLyBjaGVjazsgdGhlIGB0eXBlc2NyaXB0YCB2NyBwYWNrYWdlIGFsb25lIGxhY2tzIHRoZSBBUEkgbmV4dCBuZWVkcywgc28ga2VlcCBib3RoXG4gICAgLy8gaW5zdGFsbGVkIGZvciBOZXh0LmpzLWZhbWlseSByZXBvcy4gU2VlIHRoZSB0eXBlc2NyaXB0R29EZXBlbmRlbmN5IGNvbW1lbnQgYWJvdmUuXG4gICAgaWYgKGNvbmZpZy5kZXBlbmRpbmcubmV4dCB8fCBjb25maWcuZGVwZW5kaW5nLmJsaXR6IHx8IGNvbmZpZy5kZXBlbmRpbmcudmluZXh0KSB7XG4gICAgICBkZXZEZXBlbmRlbmNpZXMucHVzaCh0eXBlc2NyaXB0R29EZXBlbmRlbmN5KTtcbiAgICB9XG4gICAgLy8gUmVhY3QgTmF0aXZlIHJlbGllcyBvbiBAdHNjb25maWcvcmVhY3QtbmF0aXZlJ3MgYW1iaWVudCB0eXBlcyBpbnN0ZWFkIG9mIEB0eXBlcy9idW4uXG4gICAgaWYgKCFjb25maWcuZGVwZW5kaW5nLnJlYWN0TmF0aXZlKSB7XG4gICAgICBkZXZEZXBlbmRlbmNpZXMucHVzaCgnQHR5cGVzL2J1bicpO1xuICAgIH1cbiAgICBpZiAoXG4gICAgICBqc29uT2JqLmRlcGVuZGVuY2llcy5qZXN0IHx8XG4gICAgICBqc29uT2JqLmRldkRlcGVuZGVuY2llcy5qZXN0IHx8XG4gICAgICBqc29uT2JqLmRlcGVuZGVuY2llc1snQGplc3QvZ2xvYmFscyddIHx8XG4gICAgICBqc29uT2JqLmRldkRlcGVuZGVuY2llc1snQGplc3QvZ2xvYmFscyddIHx8XG4gICAgICBqc29uT2JqLmRlcGVuZGVuY2llc1sndHMtamVzdCddIHx8XG4gICAgICBqc29uT2JqLmRldkRlcGVuZGVuY2llc1sndHMtamVzdCddXG4gICAgKSB7XG4gICAgICBkZXZEZXBlbmRlbmNpZXMucHVzaCgnQHR5cGVzL2plc3QnKTtcbiAgICB9XG4gIH1cblxuICBpZiAoY29uZmlnLmlzV2lsbEJvb3N0ZXJDb25maWdzKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGRlcGVuZGVuY2llczogZGVwZW5kZW5jaWVzLmZpbHRlcigoZGVwKSA9PiAhZGVwLmluY2x1ZGVzKCdAd2lsbGJvb3N0ZXIvJykpLFxuICAgICAgZGV2RGVwZW5kZW5jaWVzOiBkZXZEZXBlbmRlbmNpZXMuZmlsdGVyKChkZXApID0+ICFkZXAuaW5jbHVkZXMoJ0B3aWxsYm9vc3Rlci8nKSksXG4gICAgICBweXRob25EZXZEZXBlbmRlbmNpZXMsXG4gICAgfTtcbiAgfVxuXG4gIHJldHVybiB7IGRlcGVuZGVuY2llcywgZGV2RGVwZW5kZW5jaWVzLCBweXRob25EZXZEZXBlbmRlbmNpZXMgfTtcbn1cblxuZnVuY3Rpb24gZG9lc1JlbGVhc2VTY3JpcHRJbnN0YWxsU2VtYW50aWNSZWxlYXNlKHNjcmlwdDogdW5rbm93bik6IGJvb2xlYW4ge1xuICBpZiAodHlwZW9mIHNjcmlwdCAhPT0gJ3N0cmluZycpIHJldHVybiBmYWxzZTtcbiAgcmV0dXJuIC9cXGIoPzpidW54fG5weHxwbnBtXFxzK2RseHx5YXJuXFxzK2RseClcXHMrc2VtYW50aWMtcmVsZWFzZSg/OkBcXFMrKT9cXGIvdS50ZXN0KHNjcmlwdCk7XG59XG5cbmZ1bmN0aW9uIG1vdmVNYW5hZ2VkVG9vbERlcGVuZGVuY2llc1RvRGV2RGVwZW5kZW5jaWVzKGpzb25PYmo6IFdyaXRhYmxlUGFja2FnZUpzb24pOiB2b2lkIHtcbiAgZm9yIChjb25zdCBbZGVwZW5kZW5jeSwga2VlcEFzUnVudGltZV0gb2YgW1xuICAgIFt3YkRlcGVuZGVuY3ksIHNob3VsZEtlZXBXYkFzUnVudGltZURlcGVuZGVuY3koanNvbk9iaildLFxuICAgIFtidWlsZFRzRGVwZW5kZW5jeSwgc2hvdWxkS2VlcEJ1aWxkVHNBc1J1bnRpbWVEZXBlbmRlbmN5KGpzb25PYmopXSxcbiAgXSBhcyBjb25zdCkge1xuICAgIGlmIChrZWVwQXNSdW50aW1lKSB7XG4gICAgICBjb25zdCBkZXZWZXJzaW9uID0ganNvbk9iai5kZXZEZXBlbmRlbmNpZXNbZGVwZW5kZW5jeV07XG4gICAgICBpZiAoIWRldlZlcnNpb24pIGNvbnRpbnVlO1xuICAgICAgY29uc3QgcnVudGltZVZlcnNpb24gPSBqc29uT2JqLmRlcGVuZGVuY2llc1tkZXBlbmRlbmN5XTtcbiAgICAgIGlmICghcnVudGltZVZlcnNpb24gfHwgaXNOZXdlclBhY2thZ2VWZXJzaW9uKGRldlZlcnNpb24sIHJ1bnRpbWVWZXJzaW9uKSkge1xuICAgICAgICBqc29uT2JqLmRlcGVuZGVuY2llc1tkZXBlbmRlbmN5XSA9IGRldlZlcnNpb247XG4gICAgICB9XG4gICAgICBkZWxldGUganNvbk9iai5kZXZEZXBlbmRlbmNpZXNbZGVwZW5kZW5jeV07XG4gICAgfSBlbHNlIGlmIChqc29uT2JqLmRlcGVuZGVuY2llc1tkZXBlbmRlbmN5XSkge1xuICAgICAganNvbk9iai5kZXZEZXBlbmRlbmNpZXNbZGVwZW5kZW5jeV0gPz89IGpzb25PYmouZGVwZW5kZW5jaWVzW2RlcGVuZGVuY3ldO1xuICAgICAgZGVsZXRlIGpzb25PYmouZGVwZW5kZW5jaWVzW2RlcGVuZGVuY3ldO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBzaG91bGRLZWVwV2JBc1J1bnRpbWVEZXBlbmRlbmN5KGpzb25PYmo6IFBhY2thZ2VKc29uKTogYm9vbGVhbiB7XG4gIC8vIFByb2R1Y3Rpb24gaW1hZ2VzIHJ1biBtaWdyYXRpb25zIGFmdGVyIGRldkRlcGVuZGVuY2llcyBhcmUgcHJ1bmVkLCBqdXN0IGFzIHBhY2thZ2UgbWFuYWdlcnNcbiAgLy8gcnVuIHBvc3RpbnN0YWxsIGR1cmluZyBwcm9kdWN0aW9uIGluc3RhbGxzLCBzbyBib3RoIGVudHJ5IHBvaW50cyBtdXN0IHJldGFpbiB0aGUgd2IgYmluYXJ5LlxuICAvLyBLZWVwIHRoZSB3b3JkIG1hdGNoIGNvbnNlcnZhdGl2ZTogc3VwcG9ydGVkIGN1c3RvbSB3cmFwcGVycyBjYW4gcHV0IHdiIGluc2lkZSBzaGVsbCBsb29wcyB0aGF0XG4gIC8vIHRoZSBjb21tYW5kLXBvc2l0aW9uIHBhcnNlciBjYW5ub3QgY2xhc3NpZnksIHdoaWxlIGEgZmFsc2UgcG9zaXRpdmUgb25seSByZXRhaW5zIHRoZSBDTEkuXG4gIHJldHVybiBbanNvbk9iai5zY3JpcHRzPy5wb3N0aW5zdGFsbCwganNvbk9iai5zY3JpcHRzPy5bJ2RiLW1pZ3JhdGUnXV0uc29tZShcbiAgICAoc2NyaXB0KSA9PiB0eXBlb2Ygc2NyaXB0ID09PSAnc3RyaW5nJyAmJiAvXFxid2JcXGIvdS50ZXN0KHNjcmlwdClcbiAgKTtcbn1cblxuZnVuY3Rpb24gc2hvdWxkS2VlcEJ1aWxkVHNBc1J1bnRpbWVEZXBlbmRlbmN5KGpzb25PYmo6IFBhY2thZ2VKc29uKTogYm9vbGVhbiB7XG4gIGNvbnN0IHByaXNtYSA9IGpzb25PYmoucHJpc21hIGFzIHsgc2VlZD86IHVua25vd24gfSB8IHVuZGVmaW5lZDtcbiAgcmV0dXJuIGRvZXNTZWVkQ29tbWFuZFVzZUJ1aWxkVHMocHJpc21hPy5zZWVkKSB8fCBkb2VzU2VlZENvbW1hbmRVc2VCdWlsZFRzKGpzb25PYmouc2NyaXB0cz8uc2VlZCk7XG59XG5cbmZ1bmN0aW9uIGRvZXNTZWVkQ29tbWFuZFVzZUJ1aWxkVHMoc2VlZENvbW1hbmQ6IHVua25vd24pOiBib29sZWFuIHtcbiAgLy8gUHJvZHVjdGlvbiBEb2NrZXIgaW1hZ2VzIHJ1biBzZWVkIHNjcmlwdHMgYWZ0ZXIgZGV2RGVwZW5kZW5jaWVzIGFyZSBwcnVuZWQsXG4gIC8vIHNvIFR5cGVTY3JpcHQgc2VlZCBydW5uZXJzIG11c3QgcmVtYWluIGF2YWlsYWJsZSBhdCBydW50aW1lLlxuICByZXR1cm4gdHlwZW9mIHNlZWRDb21tYW5kID09PSAnc3RyaW5nJyAmJiAvKD88IVtcXHctXSlidWlsZC10cyg/IVtcXHctXSkvdS50ZXN0KHNlZWRDb21tYW5kKTtcbn1cblxuY29uc3QgZGVwZW5kZW5jeURlY2xhcmF0aW9uU2VjdGlvbnMgPSBbXG4gICdkZXBlbmRlbmNpZXMnLFxuICAnZGV2RGVwZW5kZW5jaWVzJyxcbiAgJ29wdGlvbmFsRGVwZW5kZW5jaWVzJyxcbiAgJ3BlZXJEZXBlbmRlbmNpZXMnLFxuXSBhcyBjb25zdDtcblxuLyoqXG4gKiBGb3JjZXMgc3RvcmUtaW5jb21wYXRpYmxlIHBhY2thZ2VzIHRvIHN0YXkgcHJvamVjdC1sb2NhbCB3aGVuIHRoZSBnZW5lcmF0ZWQgYnVuZmlnLnRvbWwgZW5hYmxlc1xuICogQnVuJ3MgZ2xvYmFsIHN0b3JlOiBgY2hha3JhIHR5cGVnZW5gIChydW4gYnkgYHdiIGdlbi1jb2RlYClcbiAqIHdyaXRlcyBnZW5lcmF0ZWQgdHlwZXMgaW50byB0aGUgaW5zdGFsbGVkIEBjaGFrcmEtdWkvcmVhY3QgcGFja2FnZSwgd2hpY2ggd291bGQgb3RoZXJ3aXNlXG4gKiBtdXRhdGUgdGhlIG1hY2hpbmUtd2lkZSBzdG9yZSBzaGFyZWQgYWNyb3NzIHJlcG9zaXRvcmllcywgYW5kIGRyaXp6bGUta2l0IHJlcXVpcmVzIGRyaXp6bGUtb3JtXG4gKiB3aXRob3V0IGRlY2xhcmluZyBpdCwgd2hpY2ggdGhlIHN0b3JlIHJlYWxwYXRoIHBsYWNlcyBiZXlvbmQgYSBwbGFpbiBub2RlX21vZHVsZXMgd2Fsay11cC5cbiAqIExpc3RpbmcgdGhlbSBpbiBgdHJ1c3RlZERlcGVuZGVuY2llc2AgbWFrZXMgQnVuIG1hdGVyaWFsaXplIGEgcGVyLXByb2plY3QgY29weSB1bmRlclxuICogYG5vZGVfbW9kdWxlcy8uYnVuL2AsIHdob3NlIHNpYmxpbmcgYG5vZGVfbW9kdWxlcy8uYnVuL25vZGVfbW9kdWxlcy9gIGxpbmtzIGV2ZXJ5IGluc3RhbGxlZFxuICogcGFja2FnZSBhbmQgdGhlcmVmb3JlIHJlc29sdmVzIHRoZSB1bmRlY2xhcmVkIHJlcXVpcmVzLlxuICovXG5hc3luYyBmdW5jdGlvbiBlbnN1cmVUcnVzdGVkRGVwZW5kZW5jaWVzKGNvbmZpZzogUGFja2FnZUNvbmZpZywganNvbk9iajogV3JpdGFibGVQYWNrYWdlSnNvbik6IFByb21pc2U8dm9pZD4ge1xuICAvLyBCdW4gY29uc3VsdHMgdHJ1c3RlZERlcGVuZGVuY2llcyBpbiB0aGUgd29ya3NwYWNlIHJvb3QncyBwYWNrYWdlLmpzb24gb25seSwgc28gdGhlIGxpc3QgaXNcbiAgLy8gbWFuYWdlZCB0aGVyZSBhbmQgbXVzdCBjb3ZlciBkZXBlbmRlbmNpZXMgZGVjbGFyZWQgYW55d2hlcmUgaW4gdGhlIHJlcG9zaXRvcnkuXG4gIGlmICghY29uZmlnLmlzUm9vdCkgcmV0dXJuO1xuICBjb25zdCBidW5Kc29uT2JqID0ganNvbk9iaiBhcyBXcml0YWJsZVBhY2thZ2VKc29uICYgeyB0cnVzdGVkRGVwZW5kZW5jaWVzPzogc3RyaW5nW10gfTtcbiAgLy8gQnVuIGluc3RhbGxzIG9wdGlvbmFsIGFuZCBwZWVyIGRlcGVuZGVuY2llcyBieSBkZWZhdWx0LCBzbyBhbGwgZGVjbGFyYXRpb24gc2VjdGlvbnMgY291bnQuXG4gIC8vIEV2ZXJ5IGRlY2xhcmVkIHJhbmdlIGlzIGtlcHQgcGVyIHBhY2thZ2U6IGEgcm9vdCBkZWNsYXJhdGlvbiBtdXN0IG5vdCBtYXNrIGEgd29ya3NwYWNlIG9uZVxuICAvLyAoZS5nLiByb290IEBjaGFrcmEtdWkvY2xpIHYyIGFsb25nc2lkZSBhIHdvcmtzcGFjZSBvbiB2MykuXG4gIGNvbnN0IGRlY2xhcmVkRGVwZW5kZW5jaWVzID0gbmV3IE1hcDxzdHJpbmcsIHN0cmluZ1tdPigpO1xuICBjb25zdCBhZGREZWNsYXJlZERlcGVuZGVuY2llcyA9IChwYWNrYWdlSnNvbjogUGFja2FnZUpzb24pOiB2b2lkID0+IHtcbiAgICBmb3IgKGNvbnN0IHNlY3Rpb24gb2YgZGVwZW5kZW5jeURlY2xhcmF0aW9uU2VjdGlvbnMpIHtcbiAgICAgIGZvciAoY29uc3QgW2RlcGVuZGVuY3lOYW1lLCB2ZXJzaW9uUmFuZ2VdIG9mIE9iamVjdC5lbnRyaWVzKHBhY2thZ2VKc29uW3NlY3Rpb25dID8/IHt9KSkge1xuICAgICAgICBpZiAodHlwZW9mIHZlcnNpb25SYW5nZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICBjb25zdCB2ZXJzaW9uUmFuZ2VzID0gZGVjbGFyZWREZXBlbmRlbmNpZXMuZ2V0KGRlcGVuZGVuY3lOYW1lKTtcbiAgICAgICAgICBpZiAodmVyc2lvblJhbmdlcykge1xuICAgICAgICAgICAgdmVyc2lvblJhbmdlcy5wdXNoKHZlcnNpb25SYW5nZSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGRlY2xhcmVkRGVwZW5kZW5jaWVzLnNldChkZXBlbmRlbmN5TmFtZSwgW3ZlcnNpb25SYW5nZV0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfTtcbiAgYWRkRGVjbGFyZWREZXBlbmRlbmNpZXMoanNvbk9iaik7XG4gIGZvciAoY29uc3QgcGFja2FnZUpzb25QYXRoIG9mIGdldFdvcmtzcGFjZVBhY2thZ2VKc29uUGF0aHMoY29uZmlnKSkge1xuICAgIHRyeSB7XG4gICAgICBhZGREZWNsYXJlZERlcGVuZGVuY2llcyhcbiAgICAgICAgSlNPTi5wYXJzZShhd2FpdCBmcy5wcm9taXNlcy5yZWFkRmlsZShwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsIHBhY2thZ2VKc29uUGF0aCksICd1dGY4JykpIGFzIFBhY2thZ2VKc29uXG4gICAgICApO1xuICAgIH0gY2F0Y2gge1xuICAgICAgLy8gaWdub3JlIHVucmVhZGFibGUgd29ya3NwYWNlIHBhY2thZ2UuanNvblxuICAgIH1cbiAgfVxuICAvLyBPbmx5IEBjaGFrcmEtdWkvY2xpIHYzJ3MgYGNoYWtyYSB0eXBlZ2VuYCB3cml0ZXMgaW50byB0aGUgaW5zdGFsbGVkIEBjaGFrcmEtdWkvcmVhY3Q7XG4gIC8vIHYyJ3MgYGNoYWtyYS1jbGkgdG9rZW5zYCB3cml0ZXMgaW50byBAY2hha3JhLXVpL3N0eWxlZC1zeXN0ZW0gaW5zdGVhZCwgc28gdHJ1c3RpbmdcbiAgLy8gQGNoYWtyYS11aS9yZWFjdCB0aGVyZSB3b3VsZCBmb3JjZSBhIHVzZWxlc3MgcHJvamVjdC1sb2NhbCBjb3B5IHdpdGhvdXQgZml4aW5nIGdlbi1jb2RlLlxuICAvLyBNaXJyb3Igd2IgZ2VuLWNvZGUncyBjbGFzc2lmaWNhdGlvbjogb25seSBhIHJhbmdlIHdob3NlIGxlYWRpbmcgbWFqb3IgcGFyc2VzIHRvIDIgc2VsZWN0cyB0aGVcbiAgLy8gdjIgY29tbWFuZCwgc28gZGlnaXRsZXNzIHNwZWNzIGxpa2UgYGxhdGVzdGAgb3IgY2F0YWxvZyByZWZlcmVuY2VzIGNvdW50IGFzIHYzLlxuICBjb25zdCBoYXNDaGFrcmFDbGlWMyA9IChkZWNsYXJlZERlcGVuZGVuY2llcy5nZXQoJ0BjaGFrcmEtdWkvY2xpJykgPz8gW10pLnNvbWUoXG4gICAgKHZlcnNpb25SYW5nZSkgPT4gL1xcZCsvdS5leGVjKHZlcnNpb25SYW5nZSk/LlswXSAhPT0gJzInXG4gICk7XG4gIGNvbnN0IHJlcXVpcmVkV2JmeVBhY2thZ2VzID0gW1xuICAgIC4uLihoYXNDaGFrcmFDbGlWMyAmJiBkZWNsYXJlZERlcGVuZGVuY2llcy5oYXMoJ0BjaGFrcmEtdWkvcmVhY3QnKSA/IFsnQGNoYWtyYS11aS9yZWFjdCddIDogW10pLFxuICAgIC4uLihkZWNsYXJlZERlcGVuZGVuY2llcy5oYXMoJ2RyaXp6bGUta2l0JykgPyBbJ2RyaXp6bGUta2l0J10gOiBbXSksXG4gICAgLy8gVGhlc2UgZ2l0LWRlcGVuZGVuY3kgYnVpbGRzIGltcG9ydCBwYWNrYWdlcyB0aGV5IGRvIG5vdCBkZWNsYXJlIChlLmcuIHpvZCksIHdoaWNoIHRoZVxuICAgIC8vIGdsb2JhbC1zdG9yZSBsYXlvdXQgcGxhY2VzIGJleW9uZCB0aGVpciB3YWxrLXVwOyBhIHByb2plY3QtbG9jYWwgY29weSB1bmRlclxuICAgIC8vIG5vZGVfbW9kdWxlcy8uYnVuIHJlc29sdmVzIHRoZW0gKG9ic2VydmVkIGluIFdpbGxCb29zdGVyL3Byb21wdC1zdHVkeSkuXG4gICAgLi4uKGRlY2xhcmVkRGVwZW5kZW5jaWVzLmhhcygnQHdpbGxib29zdGVyL2p1ZGdlJykgPyBbJ0B3aWxsYm9vc3Rlci9qdWRnZSddIDogW10pLFxuICAgIC4uLihkZWNsYXJlZERlcGVuZGVuY2llcy5oYXMoJ0B3aWxsYm9vc3Rlci9sbG0tcHJveHknKSA/IFsnQHdpbGxib29zdGVyL2xsbS1wcm94eSddIDogW10pLFxuICAgIC8vIGJsaXR6IGFuZCBAYmxpdHpqcy9hdXRoIHJlcXVpcmUgcmVhY3QgKGFuZCBvdGhlciBwZWVycykgd2l0aG91dCBkZWNsYXJpbmcgdGhlbSwgcmVseWluZyBvblxuICAgIC8vIGhvaXN0aW5nLCB3aGljaCB0aGUgZ2xvYmFsLXN0b3JlIGxheW91dCBwbGFjZXMgYmV5b25kIHRoZWlyIHdhbGstdXAgKG9ic2VydmVkIGluXG4gICAgLy8gV2lsbEJvb3N0ZXIvc3VydmV5LXN5c3RlbTogYG5leHQgYnVpbGRgIHBhZ2UtZGF0YSBjb2xsZWN0aW9uIGRpZXMgd2l0aCBcIkNhbm5vdCBmaW5kIG1vZHVsZVxuICAgIC8vICdyZWFjdCdcIiBmcm9tIEBibGl0empzL2F1dGgpLiBAYmxpdHpqcy9ycGMgaXMgTk9UIGxpc3RlZCBiZWNhdXNlIGl0IHByb3Blcmx5IGRlY2xhcmVzIGl0c1xuICAgIC8vIHJlYWN0L0B0YW5zdGFjayBwZWVycywgc28gQnVuIGxpbmtzIHRoZW0gaW50byBpdHMgc3RvcmUgZW50cnkuIEBibGl0empzL25leHQgaXNcbiAgICAvLyBkZWxpYmVyYXRlbHkgTk9UIGxpc3RlZCBlaXRoZXI6IHRydXN0aW5nIGl0IHdvdWxkIHJ1biBpdHMgcG9zdGluc3RhbGwgKGBibGl0eiBjb2RlZ2VuYCksXG4gICAgLy8gd2hpY2ggcGF0Y2hlcyB0aGUgaW5zdGFsbGVkIG5leHQgcGFja2FnZSBpbiBwbGFjZSDigJQgcmVwb3NpdG9yaWVzIHBhdGNoIG91dCB0aGF0IHBvc3RpbnN0YWxsXG4gICAgLy8gd2l0aCBgYnVuIHBhdGNoYCBpbnN0ZWFkLCB3aGljaCBhbHNvIGtlZXBzIHRoZSBwYWNrYWdlIHByb2plY3QtbG9jYWwuXG4gICAgLi4uKGRlY2xhcmVkRGVwZW5kZW5jaWVzLmhhcygnYmxpdHonKSA/IFsnYmxpdHonXSA6IFtdKSxcbiAgICAuLi4oZGVjbGFyZWREZXBlbmRlbmNpZXMuaGFzKCdAYmxpdHpqcy9hdXRoJykgPyBbJ0BibGl0empzL2F1dGgnXSA6IFtdKSxcbiAgICAvLyBCdW4gZG9lcyBub3QgbGluayBAaG9va2Zvcm0vcmVzb2x2ZXJzJyBPUFRJT05BTCB2YWxpZGF0b3IgcGVlcnMgKGUuZy4gem9kKSBpbnRvIGl0c1xuICAgIC8vIGdsb2JhbC1zdG9yZSBlbnRyeSBldmVuIHdoZW4gdGhlIHByb2plY3QgaW5zdGFsbHMgdGhlbSwgc28gaXRzIHNlcnZlci1zaWRlXG4gICAgLy8gYGltcG9ydCAnem9kJ2AgZmFpbHMgZnJvbSB0aGUgc3RvcmUgKG9ic2VydmVkIGluIFdpbGxCb29zdGVyL3N1cnZleS1zeXN0ZW0pLlxuICAgIC4uLihkZWNsYXJlZERlcGVuZGVuY2llcy5oYXMoJ0Bob29rZm9ybS9yZXNvbHZlcnMnKSA/IFsnQGhvb2tmb3JtL3Jlc29sdmVycyddIDogW10pLFxuICAgIC8vIEB6b29tL3J0bXMgaW5zdGFsbHMgaXRzIG5hdGl2ZSBydG1zLm5vZGUgYmluZGluZyBpbiBhIGxpZmVjeWNsZSBzY3JpcHQuIFdpdGhvdXQgZXhwbGljaXRcbiAgICAvLyB0cnVzdCwgQnVuIHNraXBzIHRoYXQgc2NyaXB0IGFuZCB0aGUgcGFja2FnZSBmYWlscyBhcyBzb29uIGFzIHRoZSBab29tIGJvdCBpbXBvcnRzIGl0XG4gICAgLy8gKG9ic2VydmVkIGluIFdpbGxCb29zdGVyL3NtYXJ0c2Utem9vbS1ib3QpLlxuICAgIC4uLihkZWNsYXJlZERlcGVuZGVuY2llcy5oYXMoJ0B6b29tL3J0bXMnKSA/IFsnQHpvb20vcnRtcyddIDogW10pLFxuICBdO1xuXG4gIC8vIHdiZnkgZnVsbHkgb3ducyB0aGlzIGZpZWxkOiBhIHBhY2thZ2Ugd2hvc2UgbGlmZWN5Y2xlIHNjcmlwdHMgbXVzdCBydW4gZ2V0cyBhZGRlZCB0byB3YmZ5XG4gIC8vIGl0c2VsZiBpbnN0ZWFkIG9mIHRvIGluZGl2aWR1YWwgcmVwb3NpdG9yaWVzLCBzbyB1bm1hbmFnZWQgZW50cmllcyBhcmUgYWx3YXlzIHJlbW92ZWQg4oCUXG4gIC8vIGluY2x1ZGluZyBhbiBleHBsaWNpdGx5IGVtcHR5IGRlbnktYWxsIGxpc3QsIHdob3NlIGRlbGV0aW9uIGRlbGliZXJhdGVseSByZXN0b3JlcyBCdW4nc1xuICAvLyBkZWZhdWx0IGFsbG93LWxpc3QgKHRoZSBvd25lcnNoaXAgcG9saWN5IGNob3NlbiBpbiAjOTc1KS5cbiAgY29uc3QgZXhpc3RpbmdUcnVzdGVkID0gYnVuSnNvbk9iai50cnVzdGVkRGVwZW5kZW5jaWVzO1xuICBpZiAocmVxdWlyZWRXYmZ5UGFja2FnZXMubGVuZ3RoID09PSAwKSB7XG4gICAgaWYgKGV4aXN0aW5nVHJ1c3RlZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAvLyBEZWxldGluZyB0aGUgZmllbGQgcmVzdG9yZXMgQnVuJ3MgZnVsbCBkZWZhdWx0IGFsbG93LWxpc3QsIHNvIG9ubHkgZW50cmllcyBvdXRzaWRlIHRoYXRcbiAgICAgIC8vIGxpc3QgYWN0dWFsbHkgbG9zZSB0aGVpciBsaWZlY3ljbGUgc2NyaXB0cy5cbiAgICAgIHdhcm5BYm91dFJlbW92ZWRUcnVzdGVkRGVwZW5kZW5jaWVzKGNvbmZpZywgZXhpc3RpbmdUcnVzdGVkLCBuZXcgU2V0KCkpO1xuICAgICAgZGVsZXRlIGJ1bkpzb25PYmoudHJ1c3RlZERlcGVuZGVuY2llcztcbiAgICB9XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgLy8gQW4gZXhwbGljaXQgdHJ1c3RlZERlcGVuZGVuY2llcyBsaXN0IFJFUExBQ0VTIEJ1bidzIGRlZmF1bHQgYWxsb3ctbGlzdCBpbnN0ZWFkIG9mIGV4dGVuZGluZ1xuICAvLyBpdCwgYW5kIEJ1biBwcmludHMgbm8gd2FybmluZyBmb3IgdGhlIHBvc3RpbnN0YWxscyBpdCBjb25zZXF1ZW50bHkgc2tpcHMgKGUuZy4gQHJhaWx3YXkvY2xpXG4gIC8vIGRvd25sb2FkcyBpdHMgYmluYXJ5IGluIHBvc3RpbnN0YWxsIGFuZCBleGl0cyAxIHdpdGhvdXQgb25lKS4gSW5jbHVkZSB0aGUgRU5USVJFIGRlZmF1bHQgbGlzdDpcbiAgLy8gZW50cmllcyBmb3IgcGFja2FnZXMgdGhhdCBhcmUgbm90IGluc3RhbGxlZCBhcmUgaW5lcnQsIGFuZCB0aGlzIGlzIHRoZSBvbmx5IHJlcHJlc2VudGF0aW9uXG4gIC8vIHRoYXQgc3RheXMgY29ycmVjdCBmb3IgdHJhbnNpdGl2ZSBkZXBlbmRlbmNpZXMgdGhlIGZpbmFsIGBidW4gaW5zdGFsbGAgcmVzb2x2ZXMgYWZ0ZXIgdGhpc1xuICAvLyBydW5zIOKAlCBhbiBpbnRlcnNlY3Rpb24gd2l0aCBhIG1pc3Npbmcgb3Igc3RhbGUgbG9ja2ZpbGUgd291bGQgc2lsZW50bHkgZHJvcCB0aGVtLlxuICBjb25zdCBkZWZhdWx0VHJ1c3RlZERlcGVuZGVuY2llcyA9IGdldERlZmF1bHRUcnVzdGVkRGVwZW5kZW5jaWVzKGNvbmZpZyk7XG4gIC8vIGxlZnRob29rIGlzIGFwcGVuZGVkIGV4cGxpY2l0bHkgc28gdGhlIGRlZmF1bHQtbGlzdCBsb29rdXAgZmFpbGluZyBjYW5ub3QgZHJvcCBpdDogaXQgaXNcbiAgLy8gcmVxdWlyZWQgaW4gZXZlcnkgbWFuYWdlZCByZXBvc2l0b3J5LlxuICBjb25zdCBuZXdUcnVzdGVkUGFja2FnZXMgPSBuZXcgU2V0KFtcbiAgICAuLi5yZXF1aXJlZFdiZnlQYWNrYWdlcyxcbiAgICBsZWZ0aG9va0RlcGVuZGVuY3ksXG4gICAgLi4uKGRlZmF1bHRUcnVzdGVkRGVwZW5kZW5jaWVzID8/IFtdKSxcbiAgXSk7XG4gIHdhcm5BYm91dFJlbW92ZWRUcnVzdGVkRGVwZW5kZW5jaWVzKGNvbmZpZywgZXhpc3RpbmdUcnVzdGVkID8/IFtdLCBuZXdUcnVzdGVkUGFja2FnZXMpO1xuICBidW5Kc29uT2JqLnRydXN0ZWREZXBlbmRlbmNpZXMgPSBbLi4ubmV3VHJ1c3RlZFBhY2thZ2VzXS50b1NvcnRlZCgpO1xufVxuXG4vLyBUaGUgcGFja2FnZXMgd2JmeSBpdHNlbGYgbWF5IHdyaXRlIGludG8gdHJ1c3RlZERlcGVuZGVuY2llczsgdGhlaXIgcmVtb3ZhbCBpcyBtYW5hZ2VkIGNsZWFudXAsXG4vLyBuZXZlciBhIGxvc3Mgb2YgdXNlciBwb2xpY3kuXG5jb25zdCB3YmZ5TWFuYWdlZFRydXN0ZWREZXBlbmRlbmNpZXMgPSBuZXcgU2V0KFtcbiAgJ0BibGl0empzL2F1dGgnLFxuICAnQGNoYWtyYS11aS9yZWFjdCcsXG4gICdAaG9va2Zvcm0vcmVzb2x2ZXJzJyxcbiAgJ0B3aWxsYm9vc3Rlci9qdWRnZScsXG4gICdAd2lsbGJvb3N0ZXIvbGxtLXByb3h5JyxcbiAgJ0B6b29tL3J0bXMnLFxuICAnYmxpdHonLFxuICAnZHJpenpsZS1raXQnLFxuICBsZWZ0aG9va0RlcGVuZGVuY3ksXG5dKTtcblxuZnVuY3Rpb24gd2FybkFib3V0UmVtb3ZlZFRydXN0ZWREZXBlbmRlbmNpZXMoXG4gIGNvbmZpZzogUGFja2FnZUNvbmZpZyxcbiAgZXhpc3RpbmdUcnVzdGVkOiByZWFkb25seSBzdHJpbmdbXSxcbiAga2VwdFBhY2thZ2VzOiBSZWFkb25seVNldDxzdHJpbmc+XG4pOiB2b2lkIHtcbiAgLy8gQSBkZWZhdWx0LXRydXN0ZWQgZW50cnkgbmV2ZXIgbG9zZXMgYW55dGhpbmcgYnkgcmVtb3ZhbDogd2hpbGUgdGhlIHBhY2thZ2UgaXMgaW5zdGFsbGVkIHRoZVxuICAvLyBrZXB0IGxpc3QgKG9yLCB3aGVuIHRoZSBmaWVsZCBpcyBkZWxldGVkLCBCdW4ncyBvd24gZGVmYXVsdCBsaXN0KSBzdGlsbCB0cnVzdHMgaXQuXG4gIGNvbnN0IGRlZmF1bHRUcnVzdGVkRGVwZW5kZW5jaWVzID0gZ2V0RGVmYXVsdFRydXN0ZWREZXBlbmRlbmNpZXMoY29uZmlnKTtcbiAgY29uc3QgcmVtb3ZlZFBhY2thZ2VzID0gZXhpc3RpbmdUcnVzdGVkLmZpbHRlcihcbiAgICAocGtnKSA9PiAha2VwdFBhY2thZ2VzLmhhcyhwa2cpICYmICF3YmZ5TWFuYWdlZFRydXN0ZWREZXBlbmRlbmNpZXMuaGFzKHBrZykgJiYgIWRlZmF1bHRUcnVzdGVkRGVwZW5kZW5jaWVzPy5oYXMocGtnKVxuICApO1xuICBpZiAocmVtb3ZlZFBhY2thZ2VzLmxlbmd0aCA+IDApIHtcbiAgICBjb25zb2xlLndhcm4oXG4gICAgICBgUmVtb3ZpbmcgdW5tYW5hZ2VkIHRydXN0ZWREZXBlbmRlbmNpZXMgZW50cmllczogJHtyZW1vdmVkUGFja2FnZXMuam9pbignLCAnKX0uIHdiZnkgb3ducyB0aGlzIGZpZWxkOyBpZiB0aGVpciBsaWZlY3ljbGUgc2NyaXB0cyBhcmUgcmVxdWlyZWQsIGFkZCB0aGUgcGFja2FnZXMgdG8gd2JmeSBpdHNlbGYuYFxuICAgICk7XG4gIH1cbn1cblxubGV0IGNhY2hlZERlZmF1bHRUcnVzdGVkRGVwZW5kZW5jaWVzOiBTZXQ8c3RyaW5nPiB8IHVuZGVmaW5lZDtcblxuLyoqIEZldGNoZXMgQnVuJ3MgZGVmYXVsdCB0cnVzdGVkLWRlcGVuZGVuY3kgYWxsb3ctbGlzdCBmcm9tIHRoZSBCdW4gdmVyc2lvbiBpbnN0YWxsaW5nIHRoZSByZXBvc2l0b3J5LiAqL1xuZnVuY3Rpb24gZ2V0RGVmYXVsdFRydXN0ZWREZXBlbmRlbmNpZXMoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogU2V0PHN0cmluZz4gfCB1bmRlZmluZWQge1xuICBpZiAoIWNhY2hlZERlZmF1bHRUcnVzdGVkRGVwZW5kZW5jaWVzKSB7XG4gICAgLy8gQnVuIGNvbG9yaXplcyB0aGUgbGlzdCBtYXJrZXJzIHdoZW4gRk9SQ0VfQ09MT1IgaXMgc2V0IChlLmcuIGJ5IHRlc3QgcnVubmVycyBvbiBDSSksIHNvXG4gICAgLy8gQU5TSSBlc2NhcGUgc2VxdWVuY2VzIG11c3QgYmUgc3RyaXBwZWQgYmVmb3JlIHBhcnNpbmcuXG4gICAgY29uc3Qgc3Rkb3V0ID0gc3Bhd25TeW5jQW5kUmV0dXJuU3Rkb3V0KCdidW4nLCBbJ3BtJywgJ2RlZmF1bHQtdHJ1c3RlZCddLCBjb25maWcuZGlyUGF0aCkucmVwbGFjZUFsbChcbiAgICAgIC8vIG94bGludC1kaXNhYmxlLW5leHQtbGluZSBuby1jb250cm9sLXJlZ2V4IC0tIG1hdGNoaW5nIEFOU0kgZXNjYXBlIHNlcXVlbmNlcyByZXF1aXJlcyB0aGUgRVNDIGNvbnRyb2wgY2hhcmFjdGVyXG4gICAgICAvXFx1MDAxQlxcW1swLTk7XSptL2d1LFxuICAgICAgJydcbiAgICApO1xuICAgIGNvbnN0IHBhcnNlZERlcGVuZGVuY2llcyA9IG5ldyBTZXQoWy4uLnN0ZG91dC5tYXRjaEFsbCgvXlxccyotXFxzKyhcXFMrKSQvZ211KV0ubWFwKChtYXRjaCkgPT4gbWF0Y2hbMV0gYXMgc3RyaW5nKSk7XG4gICAgaWYgKHBhcnNlZERlcGVuZGVuY2llcy5zaXplID09PSAwKSB7XG4gICAgICAvLyBEbyBub3QgY2FjaGUgdGhlIGZhaWx1cmU6IGEgdGFyZ2V0LWxvY2FsIHByb2JsZW0gKGUuZy4gYW4gdW5yZWFkYWJsZSBwYWNrYWdlLmpzb24pIG11c3RcbiAgICAgIC8vIG5vdCBkZW55IHRoZSBkZWZhdWx0IGxpc3QgdG8gZXZlcnkgbGF0ZXIgdGFyZ2V0IG9mIGEgbXVsdGktcGF0aCBydW4uXG4gICAgICBjb25zb2xlLndhcm4oJ0ZhaWxlZCB0byByZWFkIHRoZSBkZWZhdWx0IGFsbG93LWxpc3QgdmlhIGBidW4gcG0gZGVmYXVsdC10cnVzdGVkYC4nKTtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuICAgIGNhY2hlZERlZmF1bHRUcnVzdGVkRGVwZW5kZW5jaWVzID0gcGFyc2VkRGVwZW5kZW5jaWVzO1xuICB9XG4gIHJldHVybiBjYWNoZWREZWZhdWx0VHJ1c3RlZERlcGVuZGVuY2llcztcbn1cblxuYXN5bmMgZnVuY3Rpb24gbm9ybWFsaXplUGFja2FnZU1ldGFkYXRhKFxuICBjb25maWc6IFBhY2thZ2VDb25maWcsXG4gIHJvb3RDb25maWc6IFBhY2thZ2VDb25maWcsXG4gIGpzb25PYmo6IFdyaXRhYmxlUGFja2FnZUpzb24sXG4gIGRlcGVuZGVuY3lVcGRhdGVzOiBEZXBlbmRlbmN5VXBkYXRlc1xuKTogUHJvbWlzZTx2b2lkPiB7XG4gIGlmICghanNvbk9iai5uYW1lKSB7XG4gICAganNvbk9iai5uYW1lID0gcGF0aC5iYXNlbmFtZShjb25maWcuZGlyUGF0aCk7XG4gIH1cblxuICAvLyBFeHBsaWNpdCByb290IHB1Ymxpc2hpbmcgaW50ZW50IHRha2VzIHByZWNlZGVuY2Ugb3ZlciB3YmZ5J3MgcHJpdmF0ZSBtb25vcmVwby1yb290IGRlZmF1bHQuXG4gIGlmIChjb25maWcuZG9lc0NvbnRhaW5TdWJQYWNrYWdlSnNvbnMgJiYgKGNvbmZpZy5yZWxlYXNlLm5wbVB1Ymxpc2hlc1Jvb3QgfHwganNvbk9iai5wdWJsaXNoQ29uZmlnKSkge1xuICAgIGRlbGV0ZSBqc29uT2JqLnByaXZhdGU7XG4gIH0gZWxzZSBpZiAoY29uZmlnLmRvZXNDb250YWluU3ViUGFja2FnZUpzb25zICYmICFjb25maWcucmVsZWFzZS5ucG0gJiYgIWpzb25PYmoucHVibGlzaENvbmZpZykge1xuICAgIGpzb25PYmoucHJpdmF0ZSA9IHRydWU7XG4gIH1cbiAgaWYgKCFqc29uT2JqLmxpY2Vuc2UpIHtcbiAgICBqc29uT2JqLmxpY2Vuc2UgPSAnVU5MSUNFTlNFRCc7XG4gIH1cbiAgaWYgKCFqc29uT2JqLnByaXZhdGUgJiYganNvbk9iai5saWNlbnNlICE9PSAnVU5MSUNFTlNFRCcgJiYgcm9vdENvbmZpZy5pc1B1YmxpY1JlcG8pIHtcbiAgICBqc29uT2JqLnB1Ymxpc2hDb25maWcgPz89IHt9O1xuICAgIGpzb25PYmoucHVibGlzaENvbmZpZy5hY2Nlc3MgPz89ICdwdWJsaWMnO1xuICAgIC8vIFdpdGhvdXQgYW4gZXhwbGljaXQgcmVnaXN0cnksIG5wbSByZXNvbHZlcyB0aGUgcHVibGlzaCB0YXJnZXQgZnJvbSB0aGUgd29ya3NwYWNlIC5ucG1yYyxcbiAgICAvLyB3aG9zZSBkZWZhdWx0IHJlZ2lzdHJ5IG9uIENJIG1heSBiZSB0aGUgVGFrdW1pIEd1YXJkIGluc3RhbGwgcHJveHkg4oCUIHdoaWNoIHJlamVjdHNcbiAgICAvLyBgbnBtIHB1Ymxpc2hgIHdpdGggNDA1IChzaGFyZWQjMTA3MikuIGA/Pz1gIGtlZXBzIGEgZGVsaWJlcmF0ZWx5IGRpZmZlcmVudCByZWdpc3RyeS5cbiAgICBqc29uT2JqLnB1Ymxpc2hDb25maWcucmVnaXN0cnkgPz89ICdodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy8nO1xuICB9XG4gIGNvbnN0IG93bmVyID0gY29uZmlnLnJlcG9BdXRob3I7XG4gIGlmIChvd25lciA9PT0gJ1dpbGxCb29zdGVyJyB8fCBvd25lciA9PT0gJ1dpbGxCb29zdGVyTGFiJykge1xuICAgIGpzb25PYmouYXV0aG9yID0gJ1dpbGxCb29zdGVyIEluYy4nO1xuICB9XG4gIGF3YWl0IG5vcm1hbGl6ZVB1Ymxpc2hlZENvbmZpZ1BhY2thZ2VNZXRhZGF0YShjb25maWcsIGpzb25PYmopO1xuICBpZiAoIWNvbmZpZy5pc1Jvb3QgJiYganNvbk9iai5wcml2YXRlICYmICFqc29uT2JqLm1haW4pIHtcbiAgICAvLyBNYWtlIFZTQ29kZSBwb3NzaWJsZSB0byByZWZhY3RvciBjb2RlIGFjcm9zcyBzdWJwYWNrYWdlcy5cbiAgICBqc29uT2JqLm1haW4gPSAnLi9zcmMnO1xuICB9XG5cbiAgaWYgKCFjb25maWcuZG9lc0NvbnRhaW5TdWJQYWNrYWdlSnNvbnMpIHtcbiAgICBpZiAoY29uZmlnLmRvZXNDb250YWluUHVic3BlY1lhbWwpIHtcbiAgICAgIGpzb25PYmouc2NyaXB0cy5saW50ID0gJ2ZsdXR0ZXIgYW5hbHl6ZSc7XG4gICAgICBqc29uT2JqLnNjcmlwdHNbJ2xpbnQtZml4J10gPSAnYnVuIHJ1biBsaW50JztcbiAgICAgIGNvbnN0IGRpcnMgPSBbJ2xpYicsICd0ZXN0JywgJ3Rlc3RfZHJpdmVyJ10uZmlsdGVyKChkaXIpID0+IGZzLmV4aXN0c1N5bmMocGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCBkaXIpKSk7XG4gICAgICBpZiAoZGlycy5sZW5ndGggPiAwKSB7XG4gICAgICAgIGpzb25PYmouc2NyaXB0c1snZm9ybWF0LWNvZGUnXSA9IGBkYXJ0IGZvcm1hdCAkKGZpbmQgJHtkaXJzLmpvaW4oXG4gICAgICAgICAgJyAnXG4gICAgICAgICl9IC1uYW1lIGdlbmVyYXRlZCAtcHJ1bmUgLW8gLW5hbWUgJyouZnJlZXplZC5kYXJ0JyAtcHJ1bmUgLW8gLW5hbWUgJyouZy5kYXJ0JyAtcHJ1bmUgLW8gLW5hbWUgJyouZGFydCcgLXByaW50KWA7XG4gICAgICAgIGpzb25PYmouc2NyaXB0cy5mb3JtYXQgPSBhcHBlbmRGb3JtYXRDb2RlQ29tbWFuZChqc29uT2JqLnNjcmlwdHMuZm9ybWF0KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCBweXRob25QYWNrYWdlTWFuYWdlciA9IGdldFB5dGhvblBhY2thZ2VNYW5hZ2VyKGNvbmZpZyk7XG4gICAgaWYgKHB5dGhvblBhY2thZ2VNYW5hZ2VyKSB7XG4gICAgICBjb25zdCBzY3JpcHRSdW5uZXIgPSAnYnVuIHJ1bic7XG4gICAgICBqc29uT2JqLnNjcmlwdHNbJ2NvbW1vbi9jaS1zZXR1cCddID0gYCR7c2NyaXB0UnVubmVyfSBzZXR1cC0ke3B5dGhvblBhY2thZ2VNYW5hZ2VyfWA7XG4gICAgICBkZWxldGUganNvbk9iai5zY3JpcHRzW2BzZXR1cC0ke3B5dGhvblBhY2thZ2VNYW5hZ2VyID09PSAncG9ldHJ5JyA/ICd1dicgOiAncG9ldHJ5J31gXTtcbiAgICAgIGpzb25PYmouc2NyaXB0c1tgc2V0dXAtJHtweXRob25QYWNrYWdlTWFuYWdlcn1gXSA9IGdldFB5dGhvblNldHVwQ29tbWFuZChweXRob25QYWNrYWdlTWFuYWdlcik7XG4gICAgICBjb25zdCBweXRob25GaWxlcyA9IGF3YWl0IGZnLmdsb2IoJyoqLyoucHknLCB7XG4gICAgICAgIGN3ZDogY29uZmlnLmRpclBhdGgsXG4gICAgICAgIGRvdDogdHJ1ZSxcbiAgICAgICAgaWdub3JlOiBnbG9iSWdub3JlLFxuICAgICAgfSk7XG4gICAgICBjb25zdCBkaXJOYW1lU2V0ID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gICAgICBmb3IgKGNvbnN0IHB5dGhvbkZpbGUgb2YgcHl0aG9uRmlsZXMpIHtcbiAgICAgICAgY29uc3QgW2ZpcnN0LCBzZWNvbmRdID0gcHl0aG9uRmlsZS5zcGxpdCgnLycpO1xuICAgICAgICBpZiAoZmlyc3QgJiYgc2Vjb25kKSB7XG4gICAgICAgICAgZGlyTmFtZVNldC5hZGQoZmlyc3QpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAoZGlyTmFtZVNldC5zaXplID4gMCkge1xuICAgICAgICBjb25zdCBkaXJOYW1lc1N0ciA9IFsuLi5kaXJOYW1lU2V0XS5qb2luKCcgJyk7XG4gICAgICAgIGNvbnN0IHB5dGhvblJ1bm5lciA9IGAke3B5dGhvblBhY2thZ2VNYW5hZ2VyfSBydW5gO1xuICAgICAgICBqc29uT2JqLnNjcmlwdHNbJ2Zvcm1hdC1jb2RlJ10gPVxuICAgICAgICAgIGAke3B5dGhvblJ1bm5lcn0gaXNvcnQgLS1wcm9maWxlIGJsYWNrICR7ZGlyTmFtZXNTdHJ9ICYmICR7cHl0aG9uUnVubmVyfSBibGFjayAke2Rpck5hbWVzU3RyfWA7XG4gICAgICAgIGlmIChqc29uT2JqLnNjcmlwdHMubGludCkge1xuICAgICAgICAgIGpzb25PYmouc2NyaXB0cy5saW50ID0gYCR7cHl0aG9uUnVubmVyfSBmbGFrZTggJHtkaXJOYW1lc1N0cn0gJiYgJHtqc29uT2JqLnNjcmlwdHMubGludH1gO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGpzb25PYmouc2NyaXB0cy5saW50ID0gYCR7cHl0aG9uUnVubmVyfSBmbGFrZTggJHtkaXJOYW1lc1N0cn1gO1xuICAgICAgICAgIGpzb25PYmouc2NyaXB0c1snbGludC1maXgnXSA9IGAke3NjcmlwdFJ1bm5lcn0gbGludGA7XG4gICAgICAgIH1cbiAgICAgICAganNvbk9iai5zY3JpcHRzLmZvcm1hdCA9IGFwcGVuZEZvcm1hdENvZGVDb21tYW5kKGpzb25PYmouc2NyaXB0cy5mb3JtYXQpO1xuICAgICAgICBkZXBlbmRlbmN5VXBkYXRlcy5weXRob25EZXZEZXBlbmRlbmNpZXMucHVzaCgnYmxhY2snLCAnaXNvcnQnLCAnZmxha2U4Jyk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgaWYgKGNvbmZpZy5yZXBvc2l0b3J5IHx8IGpzb25PYmoucmVwb3NpdG9yeSkge1xuICAgIGpzb25PYmoucmVwb3NpdG9yeSA9IGZvcm1hdFJlcG9zaXRvcnlGb3JQYWNrYWdlSnNvbihjb25maWcucmVwb3NpdG9yeSA/PyBqc29uT2JqLnJlcG9zaXRvcnksIGpzb25PYmoucmVwb3NpdG9yeSk7XG4gIH1cblxuICBjb25zdCBnZW5Db2RlU2NyaXB0ID0ganNvbk9iai5zY3JpcHRzWydnZW4tY29kZSddO1xuICBpZiAoc2hvdWxkR2VuZXJhdGVXYkdlbkNvZGVTY3JpcHQoY29uZmlnKSkge1xuICAgIC8vIFByZXNlcnZlIHByb2plY3Qtc3BlY2lmaWMgc3RlcHMgYSByZXBvIGFwcGVuZGVkIHRvIHRoZSBtYW5hZ2VkIGBidW4gd2IgZ2VuLWNvZGVgIChlLmcuIGJ1aWxkaW5nIGV4dHJhIGRlcGxveVxuICAgIC8vIGFzc2V0cykgaW5zdGVhZCBvZiBkaXNjYXJkaW5nIHRoZW07IG9ubHkgdGhlIG1hbmFnZWQgZ2VuLWNvZGUgc2VnbWVudCBpcyB3YmZ5J3MgdG9cbiAgICAvLyByZWdlbmVyYXRlLiBBbiB1bnBhcnNlYWJsZSBzY3JpcHQgaXMgbGVmdCBhbG9uZSByYXRoZXIgdGhhbiByZXdyaXR0ZW4gZnJvbSBhIHdyb25nIHBhcnNlLlxuICAgIGNvbnN0IHNlZ21lbnRzID0gZ2VuQ29kZVNjcmlwdCA9PT0gdW5kZWZpbmVkID8gW10gOiBzcGxpdFNjcmlwdFNlZ21lbnRzKGdlbkNvZGVTY3JpcHQpO1xuICAgIGNvbnN0IGN1c3RvbVNlZ21lbnRzID0gc2VnbWVudHM/LmZpbHRlcihcbiAgICAgIChzZWdtZW50KSA9PiBjbGFzc2lmeVNjcmlwdFNlZ21lbnQoc2VnbWVudCwganNvbk9iai5zY3JpcHRzLCB0cnVlKSA9PT0gJ2N1c3RvbSdcbiAgICApO1xuICAgIGlmIChjdXN0b21TZWdtZW50cykge1xuICAgICAganNvbk9iai5zY3JpcHRzWydnZW4tY29kZSddID0gWydidW4gd2IgZ2VuLWNvZGUnLCAuLi5jdXN0b21TZWdtZW50c10uam9pbignICYmICcpO1xuICAgIH1cbiAgfVxuICB1cGRhdGVQb3N0aW5zdGFsbFNjcmlwdChqc29uT2JqLnNjcmlwdHMsIGdlbmVyYXRlc1dvcmtlclR5cGVzKGNvbmZpZykpO1xufVxuXG5mdW5jdGlvbiBzaG91bGRHZW5lcmF0ZVdiR2VuQ29kZVNjcmlwdChjb25maWc6IFBhY2thZ2VDb25maWcpOiBib29sZWFuIHtcbiAgcmV0dXJuIGNvbmZpZy5kZXBlbmRpbmcuYmxpdHogfHwgY29uZmlnLmRlcGVuZGluZy5jaGFrcmEgfHwgY29uZmlnLmRlcGVuZGluZy5nZW5JMThuVHMgfHwgY29uZmlnLmRlcGVuZGluZy5wcmlzbWE7XG59XG5cbmZ1bmN0aW9uIGFwcGVuZEZvcm1hdENvZGVDb21tYW5kKGZvcm1hdFNjcmlwdDogc3RyaW5nIHwgdW5kZWZpbmVkKTogc3RyaW5nIHtcbiAgcmV0dXJuIGZvcm1hdFNjcmlwdCA/IGAke2Zvcm1hdFNjcmlwdH0gJiYgYnVuIHJ1biBmb3JtYXQtY29kZWAgOiAnYnVuIHJ1biBmb3JtYXQtY29kZSc7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIG5vcm1hbGl6ZVB1Ymxpc2hlZENvbmZpZ1BhY2thZ2VNZXRhZGF0YShcbiAgY29uZmlnOiBQYWNrYWdlQ29uZmlnLFxuICBqc29uT2JqOiBXcml0YWJsZVBhY2thZ2VKc29uXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgaWYgKCFpc1B1Ymxpc2hlZFdpbGxib29zdGVyQ29uZmlnc1BhY2thZ2UoY29uZmlnKSkgcmV0dXJuO1xuXG4gIGNvbnN0IGNvbmZpZ01qc1BhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICdjb25maWcubWpzJyk7XG4gIGlmICghZnMuZXhpc3RzU3luYyhjb25maWdNanNQYXRoKSkgcmV0dXJuO1xuXG4gIGpzb25PYmoudHlwZSA9ICdtb2R1bGUnO1xuXG4gIGNvbnN0IGNvbmZpZ0R0c1BhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICdjb25maWcuZC50cycpO1xuICBpZiAoIWZzLmV4aXN0c1N5bmMoY29uZmlnRHRzUGF0aCkpIHJldHVybjtcblxuICBqc29uT2JqLmZpbGVzID0gWy4uLm5ldyBTZXQoWy4uLihqc29uT2JqLmZpbGVzID8/IFtdKSwgJ2NvbmZpZy5kLm10cyddKV07XG4gIC8vIE5vZGVOZXh0IHJlc29sdmVzIGEgcmVsYXRpdmUgYC4vY29uZmlnLm1qc2AgaW1wb3J0IHRvIGBjb25maWcuZC5tdHNgLCBub3RcbiAgLy8gdGhlIHBhY2thZ2UtbGV2ZWwgYHR5cGVzYCBmaWVsZC4gS2VlcCB0aGUgcHVibGlzaGVkIGNvbmZpZyBpbXBvcnRhYmxlIGZyb21cbiAgLy8gcGFja2FnZS1sb2NhbCBUeXBlU2NyaXB0IGxpbnRlciBzZXR0aW5ncy5cbiAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzVXRpbC5nZW5lcmF0ZUZpbGUocGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnY29uZmlnLmQubXRzJyksIGNvbmZpZ0RtdHNDb250ZW50KSk7XG59XG5cbmNvbnN0IGNvbmZpZ0RtdHNDb250ZW50ID0gYGV4cG9ydCB7IGRlZmF1bHQgfSBmcm9tICcuL2NvbmZpZy5qcyc7XG5gO1xuXG5mdW5jdGlvbiBhZGREZXBlbmRlbmN5VmVyc2lvbnNUb1BhY2thZ2VKc29uKFxuICBjb25maWc6IFBhY2thZ2VDb25maWcsXG4gIHJvb3RDb25maWc6IFBhY2thZ2VDb25maWcsXG4gIGpzb25PYmo6IFdyaXRhYmxlUGFja2FnZUpzb24sXG4gIGRlcGVuZGVuY3lVcGRhdGVzOiBEZXBlbmRlbmN5VXBkYXRlcyxcbiAgc2tpcEFkZGluZ0RlcHM6IGJvb2xlYW5cbik6IHZvaWQge1xuICBjb25zdCBwYWNrYWdlSnNvbkRlcGVuZGVuY2llcyA9IGpzb25PYmouZGVwZW5kZW5jaWVzO1xuICBjb25zdCBwYWNrYWdlSnNvbkRldkRlcGVuZGVuY2llcyA9IGpzb25PYmouZGV2RGVwZW5kZW5jaWVzO1xuICBkZXBlbmRlbmN5VXBkYXRlcy5kZXBlbmRlbmNpZXMgPSBhZGRQYWNrYWdlSnNvbkRlcGVuZGVuY2llcyhcbiAgICBjb25maWcsXG4gICAgcm9vdENvbmZpZyxcbiAgICBqc29uT2JqLFxuICAgIHBhY2thZ2VKc29uRGVwZW5kZW5jaWVzLFxuICAgIFsuLi5kZXBlbmRlbmN5VXBkYXRlcy5kZXBlbmRlbmNpZXMsIC4uLmdldEV4aXN0aW5nTWFuYWdlZERlcGVuZGVuY2llcyhwYWNrYWdlSnNvbkRlcGVuZGVuY2llcywganNvbk9iaildLFxuICAgIHNraXBBZGRpbmdEZXBzXG4gICk7XG4gIGRlcGVuZGVuY3lVcGRhdGVzLmRldkRlcGVuZGVuY2llcyA9IGRlcGVuZGVuY3lVcGRhdGVzLmRldkRlcGVuZGVuY2llcy5maWx0ZXIoKGRlcCkgPT4gIXBhY2thZ2VKc29uRGVwZW5kZW5jaWVzW2RlcF0pO1xuICBkZXBlbmRlbmN5VXBkYXRlcy5kZXZEZXBlbmRlbmNpZXMgPSBhZGRQYWNrYWdlSnNvbkRlcGVuZGVuY2llcyhcbiAgICBjb25maWcsXG4gICAgcm9vdENvbmZpZyxcbiAgICBqc29uT2JqLFxuICAgIHBhY2thZ2VKc29uRGV2RGVwZW5kZW5jaWVzLFxuICAgIFsuLi5kZXBlbmRlbmN5VXBkYXRlcy5kZXZEZXBlbmRlbmNpZXMsIC4uLmdldEV4aXN0aW5nTWFuYWdlZERlcGVuZGVuY2llcyhwYWNrYWdlSnNvbkRldkRlcGVuZGVuY2llcywganNvbk9iaildLFxuICAgIHNraXBBZGRpbmdEZXBzXG4gICk7XG59XG5cbmZ1bmN0aW9uIGdldEV4aXN0aW5nTWFuYWdlZERlcGVuZGVuY2llcyhcbiAgcGFja2FnZUpzb25EZXBlbmRlbmNpZXM6IFBhcnRpYWw8UmVjb3JkPHN0cmluZywgc3RyaW5nPj4sXG4gIGpzb25PYmo6IFBhY2thZ2VKc29uXG4pOiBzdHJpbmdbXSB7XG4gIHJldHVybiBPYmplY3Qua2V5cyhwYWNrYWdlSnNvbkRlcGVuZGVuY2llcykuZmlsdGVyKFxuICAgIChkZXBlbmRlbmN5KSA9PlxuICAgICAgbWFuYWdlZERlcGVuZGVuY3lOYW1lcy5oYXMoZGVwZW5kZW5jeSkgJiZcbiAgICAgIC8vIEEgcHVibGljIHBhY2thZ2UncyBgd29ya3NwYWNlOmAgc3BlY2lmaWVyIG11c3QgbmV2ZXIgYmUgcmUtbWFuYWdlZCB2aWEgYSByZWdpc3RyeSBpbnN0YWxsXG4gICAgICAvLyAocHJpdmF0ZSBvbmVzIGFyZSBub3JtYWxpemVkIHRvIGB3b3Jrc3BhY2U6KmAgbGF0ZXIpLiBUaGlzIGFsc28gY292ZXJzIHJ1bm5pbmcgd2JmeSBvbiBhXG4gICAgICAvLyBtb25vcmVwbyBTVUJESVJFQ1RPUlksIHdoZXJlIHRoZSBwYXJlbnQncyB3b3Jrc3BhY2VzIGFyZSBpbnZpc2libGUgYW5kIHRoZSB3b3Jrc3BhY2UtbWFwXG4gICAgICAvLyBndWFyZCBpbiBhZGRQYWNrYWdlSnNvbkRlcGVuZGVuY2llcyBjYW5ub3QgcHJvdGVjdCB0aGUgc3BlY2lmaWVyLlxuICAgICAgKGpzb25PYmoucHJpdmF0ZSB8fCAhcGFja2FnZUpzb25EZXBlbmRlbmNpZXNbZGVwZW5kZW5jeV0/LnN0YXJ0c1dpdGgoJ3dvcmtzcGFjZTonKSlcbiAgKTtcbn1cblxuZnVuY3Rpb24gcmVtb3ZlRW1wdHlEZXBlbmRlbmN5U2VjdGlvbnMoanNvbk9iajogUGFja2FnZUpzb24pOiB2b2lkIHtcbiAgZm9yIChjb25zdCBrZXkgb2YgZGVwZW5kZW5jeVNlY3Rpb25LZXlzKSB7XG4gICAgY29uc3Qgc2VjdGlvbiA9IGpzb25PYmpba2V5XTtcbiAgICBpZiAoc2VjdGlvbiAmJiBPYmplY3Qua2V5cyhzZWN0aW9uKS5sZW5ndGggPT09IDApIHtcbiAgICAgIFJlZmxlY3QuZGVsZXRlUHJvcGVydHkoanNvbk9iaiwga2V5KTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gaW5zdGFsbERlcGVuZGVuY3lVcGRhdGVzKFxuICBjb25maWc6IFBhY2thZ2VDb25maWcsXG4gIHJvb3RDb25maWc6IFBhY2thZ2VDb25maWcsXG4gIGpzb25PYmo6IFBhY2thZ2VKc29uLFxuICBkZXBlbmRlbmN5VXBkYXRlczogRGVwZW5kZW5jeVVwZGF0ZXNcbik6IHZvaWQge1xuICBpZiAoY29uZmlnLmRvZXNDb250YWluUGFja2FnZUpzb24pIHtcbiAgICBjb25zdCBkZXBlbmRlbmNpZXMgPSBkZXBlbmRlbmN5VXBkYXRlcy5kZXBlbmRlbmNpZXMuZmlsdGVyKChkZXApID0+ICFqc29uT2JqLmRldkRlcGVuZGVuY2llcz8uW2RlcF0pO1xuICAgIGluc3RhbGxOcG1EZXBlbmRlbmNpZXMoY29uZmlnLCByb290Q29uZmlnLCBkZXBlbmRlbmNpZXMsIGZhbHNlKTtcblxuICAgIGNvbnN0IGRldkRlcGVuZGVuY2llcyA9IGRlcGVuZGVuY3lVcGRhdGVzLmRldkRlcGVuZGVuY2llcy5maWx0ZXIoKGRlcCkgPT4gIWpzb25PYmouZGVwZW5kZW5jaWVzPy5bZGVwXSk7XG4gICAgaW5zdGFsbE5wbURlcGVuZGVuY2llcyhjb25maWcsIHJvb3RDb25maWcsIGRldkRlcGVuZGVuY2llcywgdHJ1ZSk7XG4gIH1cblxuICBjb25zdCBweXRob25QYWNrYWdlTWFuYWdlciA9IGdldFB5dGhvblBhY2thZ2VNYW5hZ2VyKGNvbmZpZyk7XG4gIGlmIChweXRob25QYWNrYWdlTWFuYWdlciAmJiBkZXBlbmRlbmN5VXBkYXRlcy5weXRob25EZXZEZXBlbmRlbmNpZXMubGVuZ3RoID4gMCkge1xuICAgIGNvbnN0IGRlcGVuZGVuY2llcyA9IFsuLi5uZXcgU2V0KGRlcGVuZGVuY3lVcGRhdGVzLnB5dGhvbkRldkRlcGVuZGVuY2llcyldO1xuICAgIGlmIChweXRob25QYWNrYWdlTWFuYWdlciA9PT0gJ3BvZXRyeScpIHtcbiAgICAgIHNwYXduU3luYygncG9ldHJ5JywgWydhZGQnLCAnLS1ncm91cCcsICdkZXYnLCAuLi5kZXBlbmRlbmNpZXNdLCBjb25maWcuZGlyUGF0aCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHNwYXduU3luYygndXYnLCBbJ2FkZCcsICctLWRldicsIC4uLmRlcGVuZGVuY2llc10sIGNvbmZpZy5kaXJQYXRoKTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gZ2V0UHl0aG9uUGFja2FnZU1hbmFnZXIoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogJ3BvZXRyeScgfCAndXYnIHwgdW5kZWZpbmVkIHtcbiAgaWYgKGNvbmZpZy5kb2VzQ29udGFpblV2TG9jaykgcmV0dXJuICd1dic7XG4gIGlmIChjb25maWcuZG9lc0NvbnRhaW5Qb2V0cnlMb2NrKSByZXR1cm4gJ3BvZXRyeSc7XG59XG5cbmZ1bmN0aW9uIGdldFB5dGhvblNldHVwQ29tbWFuZChwYWNrYWdlTWFuYWdlcjogJ3BvZXRyeScgfCAndXYnKTogc3RyaW5nIHtcbiAgaWYgKHBhY2thZ2VNYW5hZ2VyID09PSAndXYnKSByZXR1cm4gJ3V2IHN5bmMgLS1mcm96ZW4nO1xuICAvLyBgbWlzZSB3aGljaCBweXRob25gIHlpZWxkcyB0aGUgc2luZ2xlIGFjdGl2ZSBpbnRlcnByZXRlciBwYXRoOyBgbWlzZSBjdXJyZW50IHB5dGhvbmAgY2FuXG4gIC8vIHByaW50IG11bHRpcGxlIHNwYWNlLXNlcGFyYXRlZCB2ZXJzaW9ucyAobWlzZSBzdXBwb3J0cyBtdWx0aS12ZXJzaW9uIHBpbnMpLCB3aGljaCB3b3VsZCBwYXNzXG4gIC8vIGV4dHJhIHBvc2l0aW9uYWwgYXJndW1lbnRzIHRvIGBwb2V0cnkgZW52IHVzZWAuIFdoZW4gbWlzZSBpcyBtaXNzaW5nIG9yIHB5dGhvbiBpc1xuICAvLyB1bmNvbmZpZ3VyZWQsIHNraXAgYHBvZXRyeSBlbnYgdXNlYCBhbmQgZmFsbCBiYWNrIHRvIHBvZXRyeSdzIGRlZmF1bHQgaW50ZXJwcmV0ZXIgaW5zdGVhZCBvZlxuICAvLyBhYm9ydGluZyB0aGUgY2hhaW4uXG4gIC8vIFRoZSBgfHwgdHJ1ZWAgY292ZXJzIG9ubHkgdGhlIG1pc2UgcmVzb2x1dGlvbjogYSBtaXNzaW5nL3VuY29uZmlndXJlZCBtaXNlIGZhbGxzIGJhY2sgdG9cbiAgLy8gcG9ldHJ5J3MgZGVmYXVsdCBpbnRlcnByZXRlciwgd2hpbGUgYSBmYWlsaW5nIGBwb2V0cnkgZW52IHVzZWAgc3RpbGwgYWJvcnRzIHRoZSBjaGFpbi5cbiAgcmV0dXJuICdwb2V0cnkgY29uZmlnIHZpcnR1YWxlbnZzLmluLXByb2plY3QgdHJ1ZSAmJiB7IHB5dGhvbl9wYXRoPVwiJChtaXNlIHdoaWNoIHB5dGhvbiAyPi9kZXYvbnVsbClcIiB8fCB0cnVlOyB9ICYmIHsgWyAteiBcIiRweXRob25fcGF0aFwiIF0gfHwgcG9ldHJ5IGVudiB1c2UgXCIkcHl0aG9uX3BhdGhcIjsgfSAmJiBwb2V0cnkgcnVuIHBpcCBpbnN0YWxsIC0tdXBncmFkZSBwaXAgJiYgcG9ldHJ5IGluc3RhbGwnO1xufVxuXG5mdW5jdGlvbiBpbnN0YWxsTnBtRGVwZW5kZW5jaWVzKFxuICBjb25maWc6IFBhY2thZ2VDb25maWcsXG4gIHJvb3RDb25maWc6IFBhY2thZ2VDb25maWcsXG4gIGRlcGVuZGVuY2llczogc3RyaW5nW10sXG4gIGRldjogYm9vbGVhblxuKTogdm9pZCB7XG4gIGlmIChkZXBlbmRlbmNpZXMubGVuZ3RoID09PSAwKSByZXR1cm47XG5cbiAgY29uc3QgZGVwZW5kZW5jeVNwZWNpZmllcnMgPSBbXG4gICAgLi4ubmV3IFNldChkZXBlbmRlbmNpZXMubWFwKChkZXBlbmRlbmN5KSA9PiBnZXRJbnN0YWxsRGVwZW5kZW5jeVNwZWNpZmllcihjb25maWcsIHJvb3RDb25maWcsIGRlcGVuZGVuY3kpKSksXG4gIF07XG4gIHNwYXduU3luYygnYnVuJywgWydhZGQnLCAuLi4oZGV2ID8gWyctRCddIDogW10pLCAnLS1leGFjdCcsIC4uLmRlcGVuZGVuY3lTcGVjaWZpZXJzXSwgY29uZmlnLmRpclBhdGgpO1xufVxuXG5mdW5jdGlvbiBhZGRQYWNrYWdlSnNvbkRlcGVuZGVuY2llcyhcbiAgY29uZmlnOiBQYWNrYWdlQ29uZmlnLFxuICByb290Q29uZmlnOiBQYWNrYWdlQ29uZmlnLFxuICBqc29uT2JqOiBXcml0YWJsZVBhY2thZ2VKc29uLFxuICBwYWNrYWdlSnNvbkRlcGVuZGVuY2llczogUGFydGlhbDxSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+PixcbiAgZGVwZW5kZW5jaWVzOiBzdHJpbmdbXSxcbiAgc2tpcEFkZGluZ0RlcHM6IGJvb2xlYW5cbik6IHN0cmluZ1tdIHtcbiAgY29uc3QgZGVwZW5kZW5jaWVzVG9JbnN0YWxsOiBzdHJpbmdbXSA9IFtdO1xuICBmb3IgKGNvbnN0IGRlcGVuZGVuY3kgb2YgbmV3IFNldChkZXBlbmRlbmNpZXMpKSB7XG4gICAgLy8gQSBwcml2YXRlIHBhY2thZ2Ugd2hvc2UgbW9ub3JlcG8gY29udGFpbnMgdGhpcyBkZXBlbmRlbmN5IGFzIGEgd29ya3NwYWNlIG11c3QgcmVmZXJlbmNlIGl0XG4gICAgLy8gdmlhIHRoZSB3b3Jrc3BhY2UgcHJvdG9jb2w6IHBpbm5pbmcgYSByZWdpc3RyeSB2ZXJzaW9uIG1ha2VzIEJ1biBzaGFkb3cgdGhlIHNhbWUtbmFtZVxuICAgIC8vIHdvcmtzcGFjZSBhbmQgc2tpcCBpbnN0YWxsaW5nIHRoZSB3b3Jrc3BhY2UncyBvd24gZGVwZW5kZW5jaWVzLiAoUHVibGlzaGVkIHBhY2thZ2VzIGluc3RlYWRcbiAgICAvLyBwaW4gYSBjb25jcmV0ZSB2ZXJzaW9uIGJlY2F1c2UgYG5wbSBwdWJsaXNoYCByZWplY3RzIGB3b3Jrc3BhY2U6KmAgc3BlY2lmaWVycyDigJQgYnV0IGFuXG4gICAgLy8gRVhJU1RJTkcgYHdvcmtzcGFjZTpgIGRlY2xhcmF0aW9uIGlzIGFsd2F5cyBrZXB0OiBvdmVyd3JpdGluZyBpdCB3aXRoIGEgcmVnaXN0cnkgcmVsZWFzZVxuICAgIC8vIHdvdWxkIHNpbGVudGx5IGJyZWFrIHRoZSBsb2NhbCB3b3Jrc3BhY2UgbGluay4pXG5cbiAgICAvLyBBIGRlY2xhcmVkIGB3b3Jrc3BhY2U6YCBzcGVjaWZpZXIgYWx3YXlzIHdpbnMsIHdoZXRoZXIgb3Igbm90IHRoZSB3b3Jrc3BhY2UgbWFwIHNlZXMgdGhlXG4gICAgLy8gcGFja2FnZTogcnVubmluZyB3YmZ5IG9uIGEgbW9ub3JlcG8gU1VCRElSRUNUT1JZIGhpZGVzIHRoZSBwYXJlbnQncyB3b3Jrc3BhY2VzLCBzbyB0aGUgbWFwXG4gICAgLy8gYWxvbmUgY2Fubm90IGJlIHRydXN0ZWQgdG8gZGV0ZWN0IGEgbG9jYWwgd29ya3NwYWNlIGxpbmsuXG4gICAgaWYgKHBhY2thZ2VKc29uRGVwZW5kZW5jaWVzW2RlcGVuZGVuY3ldPy5zdGFydHNXaXRoKCd3b3Jrc3BhY2U6JykpIHtcbiAgICAgIGlmIChqc29uT2JqLnByaXZhdGUpIHtcbiAgICAgICAgcGFja2FnZUpzb25EZXBlbmRlbmNpZXNbZGVwZW5kZW5jeV0gPSAnd29ya3NwYWNlOionO1xuICAgICAgfVxuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGlmIChqc29uT2JqLnByaXZhdGUgJiYgZ2V0V29ya3NwYWNlUGFja2FnZURpcnMocm9vdENvbmZpZykuaGFzKGRlcGVuZGVuY3kpKSB7XG4gICAgICBjb25zdCBleGlzdGluZ1NwZWNpZmllciA9IHBhY2thZ2VKc29uRGVwZW5kZW5jaWVzW2RlcGVuZGVuY3ldO1xuICAgICAgaWYgKCFleGlzdGluZ1NwZWNpZmllciB8fCBleGlzdGluZ1NwZWNpZmllci5zdGFydHNXaXRoKCd3b3Jrc3BhY2U6JykpIHtcbiAgICAgICAgcGFja2FnZUpzb25EZXBlbmRlbmNpZXNbZGVwZW5kZW5jeV0gPSAnd29ya3NwYWNlOionO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIC8vIEFuIGV4aXN0aW5nIENPTkNSRVRFIHBpbiBvbiBhIHdvcmtzcGFjZSBwYWNrYWdlIGlzIGEgZGVsaWJlcmF0ZSBjaG9pY2UgYW5kIG11c3Qgbm90IGJlXG4gICAgICAvLyBjb252ZXJ0ZWQgdG8gdGhlIHdvcmtzcGFjZSBwcm90b2NvbC4gTm90ZSB0aGUgdHJhZGUtb2ZmIGVpdGhlciB3YXk6IG5wbSAod2hpY2hcbiAgICAgIC8vIHNlbWFudGljLXJlbGVhc2UncyBucG0gcGx1Z2luIHNoZWxscyBvdXQgdG8pIGNhbm5vdCBwYXJzZSBgd29ya3NwYWNlOmAgc3BlY2lmaWVycywgd2hpbGVcbiAgICAgIC8vIGEgcmVnaXN0cnkgcGluIG1ha2VzIGEgY29sZCBidW4gaW5zdGFsbCBzaGFkb3cgdGhlIHdvcmtzcGFjZSBhbmQgc2tpcCBpdHMgZGVwZW5kZW5jaWVzIOKAlFxuICAgICAgLy8gV2lsbEJvb3N0ZXIvc2hhcmVkIGtlZXBzIGB3b3Jrc3BhY2U6KmAgYW5kIHN0cmlwcyB0aGUgcHJvdG9jb2wgb24gdGhlIENJIGNoZWNrb3V0IHJpZ2h0XG4gICAgICAvLyBiZWZvcmUgcmVsZWFzaW5nIChzY3JpcHRzL3N0cmlwV29ya3NwYWNlUHJvdG9jb2wubWpzKS4gRmFsbCB0aHJvdWdoIHNvIGEgY29uY3JldGUgcGluXG4gICAgICAvLyBrZWVwcyBiZWluZyBidW1wZWQgbGlrZSBhbnkgbWFuYWdlZCBkZXBlbmRlbmN5LlxuICAgIH1cbiAgICBjb25zdCBzaG91bGRVcGRhdGVFeGlzdGluZ0RlcGVuZGVuY3kgPSBzaG91bGRVcGRhdGVFeGlzdGluZ01hbmFnZWREZXBlbmRlbmN5KFxuICAgICAgY29uZmlnLFxuICAgICAgcm9vdENvbmZpZyxcbiAgICAgIGRlcGVuZGVuY3ksXG4gICAgICBwYWNrYWdlSnNvbkRlcGVuZGVuY2llc1tkZXBlbmRlbmN5XVxuICAgICk7XG4gICAgaWYgKHNob3VsZFVwZGF0ZUV4aXN0aW5nRGVwZW5kZW5jeSkge1xuICAgICAgY29uc3QgbWFuYWdlZFZlcnNpb24gPSBnZXRNYW5hZ2VkRGVwZW5kZW5jeVZlcnNpb24oY29uZmlnLCByb290Q29uZmlnLCBkZXBlbmRlbmN5KTtcbiAgICAgIGlmIChzaG91bGREb3duZ3JhZGVBZ2VHYXRlZE1hbmFnZWREZXBlbmRlbmN5KGRlcGVuZGVuY3ksIHBhY2thZ2VKc29uRGVwZW5kZW5jaWVzW2RlcGVuZGVuY3ldLCBtYW5hZ2VkVmVyc2lvbikpIHtcbiAgICAgICAgLy8gYGJ1biBhZGQgZGVwZW5kZW5jeWAgcHJlc2VydmVzIGFuIGV4aXN0aW5nIGV4YWN0IHBpbiwgc28gd3JpdGUgdGhlIGFnZS1jbGVhcmVkIHZlcnNpb25cbiAgICAgICAgLy8gZGlyZWN0bHkuIFRoZSBmaW5hbCByZXBvc2l0b3J5LXdpZGUgaW5zdGFsbCByZWZyZXNoZXMgdGhlIGxvY2tmaWxlIGFmdGVyIGV2ZXJ5IHBhY2thZ2VcbiAgICAgICAgLy8gbWFuaWZlc3QgaGFzIGNvbnZlcmdlZCBvbiB0aGUgZ2VuZXJhdGVkIHJlbGVhc2UtYWdlIHBvbGljeS5cbiAgICAgICAgcGFja2FnZUpzb25EZXBlbmRlbmNpZXNbZGVwZW5kZW5jeV0gPSBtYW5hZ2VkVmVyc2lvbjtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBkZXBlbmRlbmNpZXNUb0luc3RhbGwucHVzaChkZXBlbmRlbmN5KTtcbiAgICAgIGlmICghc2tpcEFkZGluZ0RlcHMpIGNvbnRpbnVlO1xuICAgIH1cbiAgICBpZiAoXG4gICAgICBwYWNrYWdlSnNvbkRlcGVuZGVuY2llc1tkZXBlbmRlbmN5XSAmJlxuICAgICAgIXNob3VsZFVwZGF0ZUV4aXN0aW5nRGVwZW5kZW5jeSAmJlxuICAgICAgcGFja2FnZUpzb25EZXBlbmRlbmNpZXNbZGVwZW5kZW5jeV0gIT09ICcqJ1xuICAgIClcbiAgICAgIGNvbnRpbnVlO1xuICAgIGNvbnN0IGxhdGVzdFZlcnNpb24gPSBnZXRNYW5hZ2VkRGVwZW5kZW5jeVZlcnNpb24oY29uZmlnLCByb290Q29uZmlnLCBkZXBlbmRlbmN5KTtcbiAgICBpZiAobGF0ZXN0VmVyc2lvbiA9PT0gJyonICYmIHBhY2thZ2VKc29uRGVwZW5kZW5jaWVzW2RlcGVuZGVuY3ldKSBjb250aW51ZTtcbiAgICBwYWNrYWdlSnNvbkRlcGVuZGVuY2llc1tkZXBlbmRlbmN5XSA9IGxhdGVzdFZlcnNpb247XG4gIH1cbiAgcmV0dXJuIGRlcGVuZGVuY2llc1RvSW5zdGFsbDtcbn1cblxuZnVuY3Rpb24gZm9ybWF0UGFja2FnZUpzb25XaXRoUHJvamVjdEZvcm1hdHRlcihjb25maWc6IFBhY2thZ2VDb25maWcsIGZpbGVQYXRoOiBzdHJpbmcpOiB2b2lkIHtcbiAgY29uc3QgcmVsYXRpdmVGaWxlUGF0aCA9IHBhdGgucmVsYXRpdmUoY29uZmlnLmRpclBhdGgsIGZpbGVQYXRoKTtcbiAgaWYgKCFyZWxhdGl2ZUZpbGVQYXRoKSByZXR1cm47XG5cbiAgLy8gUmV1c2UgdGhlIHRhcmdldCByZXBvc2l0b3J5J3Mgb3duIGZvcm1hdHRlciBhZnRlciBkZXBlbmRlbmN5IGluc3RhbGxhdGlvbiBzb1xuICAvLyBwYWNrYWdlLmpzb24gbWF0Y2hlcyB3aGF0ZXZlciBpdHMgY3VycmVudCBzb3J0LXBhY2thZ2UtanNvbiB2ZXJzaW9uIGV4cGVjdHMuXG4gIC8vIFRoaXMgYXZvaWRzIGZvbGxvdy11cCBhdXRvZml4IGNvbW1pdHMgY2F1c2VkIG9ubHkgYnkgZm9ybWF0dGVyIHZlcnNpb24gZHJpZnRcbiAgLy8gYmV0d2VlbiB3YmZ5IGFuZCB0aGUgcHJvamVjdCBiZWluZyB1cGRhdGVkLlxuICBzcGF3blN5bmMoJ2J1bngnLCBbJ3NvcnQtcGFja2FnZS1qc29uJywgcmVsYXRpdmVGaWxlUGF0aF0sIGNvbmZpZy5kaXJQYXRoKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gcmVtb3ZlVW51c2VkVHNjb25maWdCYXNlRGVwZW5kZW5jaWVzKFxuICBjb25maWc6IFBhY2thZ2VDb25maWcsXG4gIGpzb25PYmo6IFdyaXRhYmxlUGFja2FnZUpzb24sXG4gIHVzZWREZXBlbmRlbmNpZXM6IHN0cmluZ1tdXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgdXNlZERlcGVuZGVuY3lTZXQgPSBuZXcgU2V0KHVzZWREZXBlbmRlbmNpZXMpO1xuICBjb25zdCBleGlzdGluZ1RzY29uZmlnQmFzZURlcGVuZGVuY2llcyA9IGF3YWl0IGdldEV4aXN0aW5nVHNjb25maWdCYXNlRGVwZW5kZW5jaWVzKGNvbmZpZyk7XG4gIGZvciAoY29uc3QgZGVwZW5kZW5jeSBvZiBtYW5hZ2VkVHNjb25maWdCYXNlRGVwZW5kZW5jaWVzKSB7XG4gICAgaWYgKHVzZWREZXBlbmRlbmN5U2V0LmhhcyhkZXBlbmRlbmN5KSB8fCBleGlzdGluZ1RzY29uZmlnQmFzZURlcGVuZGVuY2llcy5oYXMoZGVwZW5kZW5jeSkpIGNvbnRpbnVlO1xuICAgIC8vIHdiZnkgb3ducyB0aGVzZSBiYXNlLWNvbmZpZyBwYWNrYWdlcy4gUmVtb3ZlIHN0YWxlIHZhcmlhbnRzIHdoZW4gcmVwb1xuICAgIC8vIGNhcGFiaWxpdGllcyBjaGFuZ2UsIHN1Y2ggYXMgTmV4dC5qcyB0YWtpbmcgb3duZXJzaGlwIG9mIHRzY29uZmlnLmpzb24uXG4gICAgZm9yIChjb25zdCBzZWN0aW9uIG9mIGdldERlcGVuZGVuY3lTZWN0aW9ucyhqc29uT2JqKSkge1xuICAgICAgUmVmbGVjdC5kZWxldGVQcm9wZXJ0eShzZWN0aW9uLCBkZXBlbmRlbmN5KTtcbiAgICB9XG4gIH1cbn1cblxuYXN5bmMgZnVuY3Rpb24gZ2V0RXhpc3RpbmdUc2NvbmZpZ0Jhc2VEZXBlbmRlbmNpZXMoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTxTZXQ8c3RyaW5nPj4ge1xuICBjb25zdCBleGlzdGluZ1RzY29uZmlnQmFzZURlcGVuZGVuY2llcyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICBjb25zdCBmaWxlUGF0aHMgPSBhd2FpdCBmZy5nbG9iKCcqKi90c2NvbmZpZyouanNvbicsIHtcbiAgICBjd2Q6IGNvbmZpZy5kaXJQYXRoLFxuICAgIGRvdDogdHJ1ZSxcbiAgICBpZ25vcmU6IGdsb2JJZ25vcmUsXG4gIH0pO1xuXG4gIGZvciAoY29uc3QgZmlsZVBhdGggb2YgZmlsZVBhdGhzKSB7XG4gICAgY29uc3QgYWJzb2x1dGVGaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgZmlsZVBhdGgpO1xuICAgIC8vIFR5cGVTY3JpcHQgNydzIG5hdGl2ZSBjb21waWxlciBkcm9wcGVkIHRoZSBpbi1wcm9jZXNzIGBwYXJzZUNvbmZpZ0ZpbGVUZXh0VG9Kc29uYFxuICAgIC8vIGhlbHBlciwgc28gcGFyc2UgdGhlIHRzY29uZmlnIGludG8gYW4gQVNUIGFuZCByZWFkIGl0cyB0b3AtbGV2ZWwgYGV4dGVuZHNgIGRpcmVjdGx5LlxuICAgIGNvbnN0IHNvdXJjZSA9IGF3YWl0IHBhcnNlU291cmNlRmlsZShhYnNvbHV0ZUZpbGVQYXRoKTtcbiAgICBpZiAoIXNvdXJjZSkge1xuICAgICAgY29uc29sZS53YXJuKGBQcmVzZXJ2ZSBtYW5hZ2VkIEB0c2NvbmZpZyBkZXBlbmRlbmNpZXMgYmVjYXVzZSAke2Fic29sdXRlRmlsZVBhdGh9IGNvdWxkIG5vdCBiZSBwYXJzZWQuYCk7XG4gICAgICByZXR1cm4gbmV3IFNldChtYW5hZ2VkVHNjb25maWdCYXNlRGVwZW5kZW5jaWVzKTtcbiAgICB9XG4gICAgZm9yIChjb25zdCB2YWx1ZSBvZiByZWFkVHNjb25maWdFeHRlbmRzKHNvdXJjZSkpIHtcbiAgICAgIGZvciAoY29uc3QgZGVwZW5kZW5jeSBvZiBtYW5hZ2VkVHNjb25maWdCYXNlRGVwZW5kZW5jaWVzKSB7XG4gICAgICAgIGlmICh2YWx1ZSA9PT0gZGVwZW5kZW5jeSB8fCB2YWx1ZS5zdGFydHNXaXRoKGAke2RlcGVuZGVuY3l9L2ApKSB7XG4gICAgICAgICAgZXhpc3RpbmdUc2NvbmZpZ0Jhc2VEZXBlbmRlbmNpZXMuYWRkKGRlcGVuZGVuY3kpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGV4aXN0aW5nVHNjb25maWdCYXNlRGVwZW5kZW5jaWVzO1xufVxuXG4vKiogUmVhZHMgdGhlIHRvcC1sZXZlbCBgZXh0ZW5kc2AgZW50cmllcyAoYSBzdHJpbmcgb3IgYXJyYXkgb2Ygc3RyaW5ncykgZnJvbSBhIHBhcnNlZCB0c2NvbmZpZy4gKi9cbmZ1bmN0aW9uIHJlYWRUc2NvbmZpZ0V4dGVuZHMoc291cmNlOiBhc3QuU291cmNlRmlsZSk6IHN0cmluZ1tdIHtcbiAgY29uc3QgdmFsdWVzOiBzdHJpbmdbXSA9IFtdO1xuICBmb3IgKGNvbnN0IHByb3BlcnR5IG9mIGdldFRzY29uZmlnUm9vdFByb3BlcnRpZXMoc291cmNlKSkge1xuICAgIGlmIChhc3QuaXNQcm9wZXJ0eUFzc2lnbm1lbnQocHJvcGVydHkpICYmIGFzdC5pc1N0cmluZ0xpdGVyYWwocHJvcGVydHkubmFtZSkgJiYgcHJvcGVydHkubmFtZS50ZXh0ID09PSAnZXh0ZW5kcycpIHtcbiAgICAgIGNvbGxlY3RTdHJpbmdMaXRlcmFsVmFsdWVzKHByb3BlcnR5LmluaXRpYWxpemVyLCB2YWx1ZXMpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gdmFsdWVzO1xufVxuXG5mdW5jdGlvbiBnZXRUc2NvbmZpZ1Jvb3RQcm9wZXJ0aWVzKHNvdXJjZTogYXN0LlNvdXJjZUZpbGUpOiByZWFkb25seSBhc3QuT2JqZWN0TGl0ZXJhbEVsZW1lbnRMaWtlW10ge1xuICBmb3IgKGNvbnN0IHN0YXRlbWVudCBvZiBzb3VyY2Uuc3RhdGVtZW50cykge1xuICAgIGlmIChhc3QuaXNFeHByZXNzaW9uU3RhdGVtZW50KHN0YXRlbWVudCkgJiYgYXN0LmlzT2JqZWN0TGl0ZXJhbEV4cHJlc3Npb24oc3RhdGVtZW50LmV4cHJlc3Npb24pKSB7XG4gICAgICByZXR1cm4gc3RhdGVtZW50LmV4cHJlc3Npb24ucHJvcGVydGllcztcbiAgICB9XG4gIH1cbiAgcmV0dXJuIFtdO1xufVxuXG5mdW5jdGlvbiBjb2xsZWN0U3RyaW5nTGl0ZXJhbFZhbHVlcyhub2RlOiBhc3QuRXhwcmVzc2lvbiwgdmFsdWVzOiBzdHJpbmdbXSk6IHZvaWQge1xuICBpZiAoYXN0LmlzU3RyaW5nTGl0ZXJhbChub2RlKSkge1xuICAgIHZhbHVlcy5wdXNoKG5vZGUudGV4dCk7XG4gIH0gZWxzZSBpZiAoYXN0LmlzQXJyYXlMaXRlcmFsRXhwcmVzc2lvbihub2RlKSkge1xuICAgIGZvciAoY29uc3QgZWxlbWVudCBvZiBub2RlLmVsZW1lbnRzKSB7XG4gICAgICBjb2xsZWN0U3RyaW5nTGl0ZXJhbFZhbHVlcyhlbGVtZW50LCB2YWx1ZXMpO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBnZXREZXBlbmRlbmN5U2VjdGlvbnMoanNvbk9iajogUGFja2FnZUpzb24pOiBQYXJ0aWFsPFJlY29yZDxzdHJpbmcsIHN0cmluZz4+W10ge1xuICByZXR1cm4gZGVwZW5kZW5jeVNlY3Rpb25LZXlzXG4gICAgLm1hcCgoa2V5KSA9PiBqc29uT2JqW2tleV0pXG4gICAgLmZpbHRlcigoc2VjdGlvbik6IHNlY3Rpb24gaXMgUGFydGlhbDxSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+PiA9PiAhIXNlY3Rpb24pO1xufVxuXG5mdW5jdGlvbiBnZXRMYXRlc3REZXBlbmRlbmN5VmVyc2lvbihkZXBlbmRlbmN5OiBzdHJpbmcpOiBzdHJpbmcge1xuICBjb25zdCBjYWNoZWRWZXJzaW9uID0gbGF0ZXN0RGVwZW5kZW5jeVZlcnNpb25DYWNoZS5nZXQoZGVwZW5kZW5jeSk7XG4gIGlmIChjYWNoZWRWZXJzaW9uKSByZXR1cm4gY2FjaGVkVmVyc2lvbjtcblxuICBjb25zdCB2ZXJzaW9uID0gZ2V0RGVwZW5kZW5jeVZlcnNpb25Gcm9tTnBtKGRlcGVuZGVuY3kpO1xuICBsYXRlc3REZXBlbmRlbmN5VmVyc2lvbkNhY2hlLnNldChkZXBlbmRlbmN5LCB2ZXJzaW9uKTtcbiAgcmV0dXJuIHZlcnNpb247XG59XG5cbmZ1bmN0aW9uIGdldERlcGVuZGVuY3lWZXJzaW9uRnJvbU5wbShkZXBlbmRlbmN5OiBzdHJpbmcpOiBzdHJpbmcge1xuICBpZiAoIXNob3VsZEFwcGx5UGFja2FnZUFnZUdhdGUoZGVwZW5kZW5jeSkpIHtcbiAgICByZXR1cm4gZ2V0UmF3RGVwZW5kZW5jeVZlcnNpb25Gcm9tTnBtKGRlcGVuZGVuY3kpO1xuICB9XG5cbiAgcmV0dXJuIGdldExhdGVzdEFnZUdhdGVkRGVwZW5kZW5jeVZlcnNpb24oZGVwZW5kZW5jeSk7XG59XG5cbmZ1bmN0aW9uIGdldExhdGVzdEFnZUdhdGVkRGVwZW5kZW5jeVZlcnNpb24oZGVwZW5kZW5jeTogc3RyaW5nKTogc3RyaW5nIHtcbiAgY29uc3QgdGltZXMgPSBnZXROcG1QYWNrYWdlVGltZXMoZGVwZW5kZW5jeSk7XG4gIGNvbnN0IGxhdGVzdFZlcnNpb24gPSBnZXRSYXdEZXBlbmRlbmN5VmVyc2lvbkZyb21OcG0oZGVwZW5kZW5jeSk7XG4gIGlmIChsYXRlc3RWZXJzaW9uICE9PSAnKicgJiYgaXNQdWJsaXNoZWRCZWZvcmVBZ2VHYXRlKHRpbWVzW2xhdGVzdFZlcnNpb25dKSkge1xuICAgIHJldHVybiBsYXRlc3RWZXJzaW9uO1xuICB9XG5cbiAgcmV0dXJuIGdldEFnZUdhdGVkVmVyc2lvbnNEZXNjZW5kaW5nKHRpbWVzKVswXSA/PyAnKic7XG59XG5cbi8qKiBFdmVyeSBzdGFibGUgcmVsZWFzZSBpbiBgdGltZXNgIHRoYXQgYWxyZWFkeSBjbGVhcmVkIHRoZSBhZ2UgZ2F0ZSwgbmV3ZXN0IGZpcnN0LiAqL1xuZnVuY3Rpb24gZ2V0QWdlR2F0ZWRWZXJzaW9uc0Rlc2NlbmRpbmcodGltZXM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4pOiBzdHJpbmdbXSB7XG4gIGNvbnN0IG5vdyA9IERhdGUubm93KCk7XG4gIHJldHVybiBPYmplY3QuZW50cmllcyh0aW1lcylcbiAgICAuZmlsdGVyKChbdmVyc2lvbl0pID0+IHNlbXZlci52YWxpZCh2ZXJzaW9uKSlcbiAgICAuZmlsdGVyKChbdmVyc2lvbl0pID0+IChzZW12ZXIucHJlcmVsZWFzZSh2ZXJzaW9uKT8ubGVuZ3RoID8/IDApID09PSAwKVxuICAgIC5maWx0ZXIoKFssIHB1Ymxpc2hlZEF0XSkgPT4gTnVtYmVyLmlzRmluaXRlKERhdGUucGFyc2UocHVibGlzaGVkQXQpKSlcbiAgICAuZmlsdGVyKChbLCBwdWJsaXNoZWRBdF0pID0+IG5vdyAtIERhdGUucGFyc2UocHVibGlzaGVkQXQpID49IHBhY2thZ2VBZ2VHYXRlTXMpXG4gICAgLnRvU29ydGVkKChbdmVyc2lvbkFdLCBbdmVyc2lvbkJdKSA9PiBzZW12ZXIucmNvbXBhcmUodmVyc2lvbkEsIHZlcnNpb25CKSlcbiAgICAubWFwKChbdmVyc2lvbl0pID0+IHZlcnNpb24pO1xufVxuXG5mdW5jdGlvbiBpc1B1Ymxpc2hlZEJlZm9yZUFnZUdhdGUocHVibGlzaGVkQXQ6IHN0cmluZyB8IHVuZGVmaW5lZCk6IGJvb2xlYW4ge1xuICBpZiAoIXB1Ymxpc2hlZEF0KSByZXR1cm4gZmFsc2U7XG4gIGNvbnN0IHB1Ymxpc2hlZFRpbWUgPSBEYXRlLnBhcnNlKHB1Ymxpc2hlZEF0KTtcbiAgcmV0dXJuIE51bWJlci5pc0Zpbml0ZShwdWJsaXNoZWRUaW1lKSAmJiBEYXRlLm5vdygpIC0gcHVibGlzaGVkVGltZSA+PSBwYWNrYWdlQWdlR2F0ZU1zO1xufVxuXG5mdW5jdGlvbiBnZXROcG1QYWNrYWdlVGltZXMoZGVwZW5kZW5jeTogc3RyaW5nKTogUmVjb3JkPHN0cmluZywgc3RyaW5nPiB7XG4gIGNvbnN0IHBhY2thZ2VOYW1lID0gZGVwZW5kZW5jeS5yZXBsYWNlKC9AW15AL10rJC91LCAnJyk7XG4gIGNvbnN0IGNhY2hlZFRpbWVzID0gbnBtUGFja2FnZVRpbWVzQ2FjaGUuZ2V0KHBhY2thZ2VOYW1lKTtcbiAgaWYgKGNhY2hlZFRpbWVzKSByZXR1cm4gY2FjaGVkVGltZXM7XG5cbiAgY29uc3Qgc3Rkb3V0ID0gc3Bhd25TeW5jQW5kUmV0dXJuU3Rkb3V0KFxuICAgICducG0nLFxuICAgIFsnc2hvdycsIHBhY2thZ2VOYW1lLCAndGltZScsICctLWpzb24nLCAnLS13b3Jrc3BhY2VzPWZhbHNlJ10sXG4gICAgcHJvY2Vzcy5jd2QoKVxuICApO1xuICBpZiAoIXN0ZG91dCkgcmV0dXJuIHt9O1xuXG4gIHRyeSB7XG4gICAgY29uc3QgcGFyc2VkID0gSlNPTi5wYXJzZShzdGRvdXQpIGFzIFJlY29yZDxzdHJpbmcsIHN0cmluZz4gfCBbUmVjb3JkPHN0cmluZywgc3RyaW5nPl07XG4gICAgY29uc3QgdGltZXMgPSBBcnJheS5pc0FycmF5KHBhcnNlZCkgPyBwYXJzZWRbMF0gOiBwYXJzZWQ7XG4gICAgaWYgKCF0aW1lcykgcmV0dXJuIHt9O1xuICAgIG5wbVBhY2thZ2VUaW1lc0NhY2hlLnNldChwYWNrYWdlTmFtZSwgdGltZXMpO1xuICAgIHJldHVybiB0aW1lcztcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIHt9O1xuICB9XG59XG5cbmZ1bmN0aW9uIHNob3VsZEFwcGx5UGFja2FnZUFnZUdhdGUoZGVwZW5kZW5jeTogc3RyaW5nKTogYm9vbGVhbiB7XG4gIC8vIEtlZXAgbWFuYWdlZCBmaXJzdC1wYXJ0eSBwYWNrYWdlcyBhbGlnbmVkIHdpdGggQnVuJ3MgZXhwbGljaXQgZXhlbXB0aW9ucy4gd2JmeSdzIGdlbmVyYXRlZFxuICAvLyBjb25maWd1cmF0aW9uIGNhbiByZWx5IG9uIHRoZSBjdXJyZW50IHdiIGNvbnRyYWN0LCBzbyBpbmRlcGVuZGVudGx5IHNvYWtpbmcgb3IgZG93bmdyYWRpbmcgd2JcbiAgLy8gd291bGQgcGFpciBuZXcgZ2VuZXJhdGVkIGZpbGVzIHdpdGggYW4gaW5jb21wYXRpYmxlIG9sZCBDTEkuIFRob3NlIHBhY2thZ2VzIGFyZSByZWxlYXNlZCBhbmRcbiAgLy8gZml4ZWQgYXQgdGhlaXIgc291cmNlIGluc3RlYWQ7IG9ubHkgcGFja2FnZXMgQnVuIGl0c2VsZiBnYXRlcyBtYXkgYmUgc2VsZWN0ZWQgZnJvbSBvbGRlciB0YWdzLlxuICByZXR1cm4gIWJ1bk1pbmltdW1SZWxlYXNlQWdlRXhjbHVkZXMuc29tZSgocGF0dGVybikgPT4gZG9lc1BhY2thZ2VQYXR0ZXJuTWF0Y2gocGF0dGVybiwgZGVwZW5kZW5jeSkpO1xufVxuXG5mdW5jdGlvbiBkb2VzUGFja2FnZVBhdHRlcm5NYXRjaChwYXR0ZXJuOiBzdHJpbmcsIGRlcGVuZGVuY3k6IHN0cmluZyk6IGJvb2xlYW4ge1xuICBpZiAocGF0dGVybiA9PT0gZGVwZW5kZW5jeSkgcmV0dXJuIHRydWU7XG4gIGlmICghcGF0dGVybi5pbmNsdWRlcygnKicpKSByZXR1cm4gZmFsc2U7XG5cbiAgY29uc3QgZXNjYXBlZFBhdHRlcm4gPSBwYXR0ZXJuLnJlcGxhY2VBbGwoL1suKz9eJHt9KCl8W1xcXVxcXFxdL2d1LCBTdHJpbmcucmF3YFxcJCZgKS5yZXBsYWNlQWxsKCcqJywgJy4qJyk7XG4gIHJldHVybiBuZXcgUmVnRXhwKGBeJHtlc2NhcGVkUGF0dGVybn0kYCwgJ3UnKS50ZXN0KGRlcGVuZGVuY3kpO1xufVxuXG5mdW5jdGlvbiBnZXRSYXdEZXBlbmRlbmN5VmVyc2lvbkZyb21OcG0oZGVwZW5kZW5jeTogc3RyaW5nKTogc3RyaW5nIHtcbiAgLy8gTm8gY2FjaGUgaGVyZTogdGhlIG9ubHkgY2FsbGVyIGNoYWluIGdvZXMgdGhyb3VnaCBnZXRMYXRlc3REZXBlbmRlbmN5VmVyc2lvbiwgd2hpY2ggYWxyZWFkeVxuICAvLyBtZW1vaXplcyBwZXIgZGVwZW5kZW5jeSwgc28gdGhpcyBjYW4gcnVuIGF0IG1vc3Qgb25jZSBwZXIgZGVwZW5kZW5jeS5cbiAgcmV0dXJuIHNwYXduU3luY0FuZFJldHVyblN0ZG91dCgnbnBtJywgWydzaG93JywgZGVwZW5kZW5jeSwgJ3ZlcnNpb24nLCAnLS13b3Jrc3BhY2VzPWZhbHNlJ10sIHByb2Nlc3MuY3dkKCkpIHx8ICcqJztcbn1cblxuZnVuY3Rpb24gZ2V0SW5zdGFsbERlcGVuZGVuY3lTcGVjaWZpZXIoY29uZmlnOiBQYWNrYWdlQ29uZmlnLCByb290Q29uZmlnOiBQYWNrYWdlQ29uZmlnLCBkZXBlbmRlbmN5OiBzdHJpbmcpOiBzdHJpbmcge1xuICAvLyBUeXBlU2NyaXB0IGlzIHZlcnNpb24tY2FwcGVkIGluIEJsaXR6IHJlcG9zaXRvcmllcywgc28gaXRzIGluc3RhbGwgc3BlY2lmaWVyIG11c3QgY2FycnkgdGhlXG4gIC8vIG1hbmFnZWQgdmVyc2lvbiDigJQgYSBiYXJlIGBidW4gYWRkYCB3b3VsZCBpbnN0YWxsIHRoZSBpbmNvbXBhdGlibGUgbGF0ZXN0LlxuICBpZiAoZGVwZW5kZW5jeSA9PT0gdHlwZXNjcmlwdERlcGVuZGVuY3kgJiYgaXNCbGl0elJlcG9zaXRvcnkoY29uZmlnLCByb290Q29uZmlnKSkge1xuICAgIHJldHVybiBgJHtkZXBlbmRlbmN5fUAke2dldE1hbmFnZWREZXBlbmRlbmN5VmVyc2lvbihjb25maWcsIHJvb3RDb25maWcsIGRlcGVuZGVuY3kpfWA7XG4gIH1cbiAgcmV0dXJuIGRlcGVuZGVuY3k7XG59XG5cbi8qKiBXaGV0aGVyIHRoZSByZXBvc2l0b3J5IGNvbnRhaW5zIGEgQmxpdHogYXBwICh0aGUgY3VycmVudCBwYWNrYWdlIG9yIHRoZSB3b3Jrc3BhY2Ugcm9vdCkuICovXG5mdW5jdGlvbiBpc0JsaXR6UmVwb3NpdG9yeShjb25maWc6IFBhY2thZ2VDb25maWcsIHJvb3RDb25maWc6IFBhY2thZ2VDb25maWcpOiBib29sZWFuIHtcbiAgcmV0dXJuIGNvbmZpZy5kZXBlbmRpbmcuYmxpdHogfHwgcm9vdENvbmZpZy5kZXBlbmRpbmcuYmxpdHo7XG59XG5cbmNvbnN0IHdvcmtzcGFjZVBhY2thZ2VEaXJzQ2FjaGUgPSBuZXcgTWFwPHN0cmluZywgTWFwPHN0cmluZywgc3RyaW5nPj4oKTtcblxuLyoqIE1hcCBmcm9tIGVhY2ggd29ya3NwYWNlIHBhY2thZ2UncyBuYW1lIHRvIGl0cyBkaXJlY3RvcnkgKHJlbGF0aXZlIHRvIHRoZSBtb25vcmVwbyByb290KS4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRXb3Jrc3BhY2VQYWNrYWdlRGlycyhyb290Q29uZmlnOiBQYWNrYWdlQ29uZmlnKTogTWFwPHN0cmluZywgc3RyaW5nPiB7XG4gIGNvbnN0IGNhY2hlZCA9IHdvcmtzcGFjZVBhY2thZ2VEaXJzQ2FjaGUuZ2V0KHJvb3RDb25maWcuZGlyUGF0aCk7XG4gIGlmIChjYWNoZWQpIHJldHVybiBjYWNoZWQ7XG5cbiAgY29uc3Qgd29ya3NwYWNlRGlyc0J5TmFtZSA9IG5ldyBNYXA8c3RyaW5nLCBzdHJpbmc+KCk7XG4gIGZvciAoY29uc3QgcGFja2FnZUpzb25QYXRoIG9mIGdldFdvcmtzcGFjZVBhY2thZ2VKc29uUGF0aHMocm9vdENvbmZpZykpIHtcbiAgICB0cnkge1xuICAgICAgY29uc3Qgd29ya3NwYWNlUGFja2FnZUpzb24gPSBKU09OLnBhcnNlKFxuICAgICAgICBmcy5yZWFkRmlsZVN5bmMocGF0aC5yZXNvbHZlKHJvb3RDb25maWcuZGlyUGF0aCwgcGFja2FnZUpzb25QYXRoKSwgJ3V0ZjgnKVxuICAgICAgKSBhcyBQYWNrYWdlSnNvbjtcbiAgICAgIGlmICh3b3Jrc3BhY2VQYWNrYWdlSnNvbi5uYW1lKSB7XG4gICAgICAgIHdvcmtzcGFjZURpcnNCeU5hbWUuc2V0KHdvcmtzcGFjZVBhY2thZ2VKc29uLm5hbWUsIHBhdGgucG9zaXguZGlybmFtZShwYWNrYWdlSnNvblBhdGgpKTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIGlnbm9yZSB1bnBhcnNhYmxlIHdvcmtzcGFjZSBwYWNrYWdlLmpzb25cbiAgICB9XG4gIH1cbiAgd29ya3NwYWNlUGFja2FnZURpcnNDYWNoZS5zZXQocm9vdENvbmZpZy5kaXJQYXRoLCB3b3Jrc3BhY2VEaXJzQnlOYW1lKTtcbiAgcmV0dXJuIHdvcmtzcGFjZURpcnNCeU5hbWU7XG59XG5cbmZ1bmN0aW9uIHNob3VsZFVwZGF0ZUV4aXN0aW5nTWFuYWdlZERlcGVuZGVuY3koXG4gIGNvbmZpZzogUGFja2FnZUNvbmZpZyxcbiAgcm9vdENvbmZpZzogUGFja2FnZUNvbmZpZyxcbiAgZGVwZW5kZW5jeTogc3RyaW5nLFxuICBjdXJyZW50VmVyc2lvbjogc3RyaW5nIHwgdW5kZWZpbmVkXG4pOiBib29sZWFuIHtcbiAgaWYgKCFjdXJyZW50VmVyc2lvbikgcmV0dXJuIHRydWU7XG4gIGlmIChjdXJyZW50VmVyc2lvbiA9PT0gJyonKSByZXR1cm4gdHJ1ZTtcbiAgaWYgKGlzV29ya3NwYWNlUHJvdG9jb2xSYW5nZShjdXJyZW50VmVyc2lvbikpIHJldHVybiB0cnVlO1xuICBpZiAoIW1hbmFnZWREZXBlbmRlbmN5TmFtZXMuaGFzKGRlcGVuZGVuY3kpKSByZXR1cm4gZmFsc2U7XG4gIGNvbnN0IG1hbmFnZWRWZXJzaW9uID0gZ2V0TWFuYWdlZERlcGVuZGVuY3lWZXJzaW9uKGNvbmZpZywgcm9vdENvbmZpZywgZGVwZW5kZW5jeSk7XG4gIGNvbnN0IGN1cnJlbnRWYWxpZFZlcnNpb24gPSBzZW12ZXIudmFsaWQoY3VycmVudFZlcnNpb24pO1xuICAvLyBBIFR5cGVTY3JpcHQgNyBwaW4gaW4gYSBCbGl0eiByZXBvc2l0b3J5IGlzIGxpa2V3aXNlIGluY29tcGF0aWJsZSAoYG5leHQgYnVpbGRgIGZhaWxzIG9uXG4gIC8vIHRoZSBOZXh0LmpzIDE1IHRoYXQgQmxpdHogcGlucyDigJQgc2VlIGdldE1hbmFnZWREZXBlbmRlbmN5VmVyc2lvbiksIHNvIHJld3JpdGUgaXQgdG8gdGhlXG4gIC8vIGNhcHBlZCByZWxlYXNlIGluc3RlYWQgb2YgcHJlc2VydmluZyBpdCB2aWEgdGhlIG5vLWRvd25ncmFkZSBydWxlIGJlbG93LiBUaGUgcGluIG1heSBiZSBhXG4gIC8vIFJBTkdFIChlLmcuIGBeNy4wLjBgKSwgd2hpY2ggc2VtdmVyLnZhbGlkIHJlamVjdHMg4oCUIGp1ZGdlIHRoZSBtYWpvciBmcm9tIHRoZSByYW5nZSBtaW5pbXVtLlxuICBjb25zdCBjdXJyZW50VHlwZXNjcmlwdFZlcnNpb24gPVxuICAgIGN1cnJlbnRWYWxpZFZlcnNpb24gPz8gKHNlbXZlci52YWxpZFJhbmdlKGN1cnJlbnRWZXJzaW9uKSA/IHNlbXZlci5taW5WZXJzaW9uKGN1cnJlbnRWZXJzaW9uKT8udmVyc2lvbiA6IHVuZGVmaW5lZCk7XG4gIGlmIChcbiAgICBkZXBlbmRlbmN5ID09PSB0eXBlc2NyaXB0RGVwZW5kZW5jeSAmJlxuICAgIGlzQmxpdHpSZXBvc2l0b3J5KGNvbmZpZywgcm9vdENvbmZpZykgJiZcbiAgICBjdXJyZW50VHlwZXNjcmlwdFZlcnNpb24gJiZcbiAgICBzZW12ZXIubWFqb3IoY3VycmVudFR5cGVzY3JpcHRWZXJzaW9uKSA+PSA3ICYmXG4gICAgc2VtdmVyLnZhbGlkKG1hbmFnZWRWZXJzaW9uKSAmJlxuICAgIGlzTmV3ZXJQYWNrYWdlVmVyc2lvbihjdXJyZW50VmVyc2lvbiwgbWFuYWdlZFZlcnNpb24pXG4gICkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIC8vIFRoZSBnZW5lcmF0ZWQgYnVuZmlnIGFwcGxpZXMgdGhlIG9yZ2FuaXphdGlvbiBhZ2UgZ2F0ZSBldmVuIHRvIGV4YWN0IHBpbnMuIElmIGEgbWFuYWdlZFxuICAvLyB0aGlyZC1wYXJ0eSB0b29sIGlzIG5ld2VyIHRoYW4gdGhlIG5ld2VzdCByZWxlYXNlIHRoYXQgY2xlYXJlZCB0aGF0IGdhdGUsIHByZXNlcnZpbmcgdGhlIHBpblxuICAvLyBwcm9kdWNlcyBhIHBhY2thZ2UuanNvbiB0aGF0IGEgZnJlc2ggaW5zdGFsbCB3aXRob3V0IHRoZSBvbGQgbG9ja2ZpbGUgY2Fubm90IHJlc29sdmUgKG5vdGFibHlcbiAgLy8gb3B0aW1pemVkIERvY2tlciBidWlsZHMpLiBLZWVwIHRoZSBuby1kb3duZ3JhZGUgcG9saWN5IG9ubHkgd2hlbiB0aGUgZGVwZW5kZW5jeSBpcyBleGVtcHQgZnJvbVxuICAvLyB0aGUgZ2F0ZTsgYWdlLWdhdGVkIG1hbmFnZWQgdG9vbHMgbXVzdCBjb252ZXJnZSBvbiB0aGUgdmVyc2lvbiB0aGUgZ2VuZXJhdGVkIGJ1bmZpZyBhY2NlcHRzLlxuICBpZiAoc2hvdWxkRG93bmdyYWRlQWdlR2F0ZWRNYW5hZ2VkRGVwZW5kZW5jeShkZXBlbmRlbmN5LCBjdXJyZW50VmVyc2lvbiwgbWFuYWdlZFZlcnNpb24pKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgLy8gd2JmeSBvd25zIHRoZXNlIHRvb2wgZGVwZW5kZW5jaWVzLCBidXQgYXBwbHlpbmcgd2JmeSBzaG91bGQgbm90IGRvd25ncmFkZSBhXG4gIC8vIHJlcG9zaXRvcnkgdGhhdCBhbHJlYWR5IHBpbnMgYSBuZXdlciByZXZpZXdlZCByZWxlYXNlIHdoZW4gdGhlIG9yZyBwb2xpY3kgZXhlbXB0cyBpdC5cbiAgcmV0dXJuIGlzTmV3ZXJQYWNrYWdlVmVyc2lvbihtYW5hZ2VkVmVyc2lvbiwgY3VycmVudFZlcnNpb24pO1xufVxuXG5mdW5jdGlvbiBzaG91bGREb3duZ3JhZGVBZ2VHYXRlZE1hbmFnZWREZXBlbmRlbmN5KFxuICBkZXBlbmRlbmN5OiBzdHJpbmcsXG4gIGN1cnJlbnRWZXJzaW9uOiBzdHJpbmcgfCB1bmRlZmluZWQsXG4gIG1hbmFnZWRWZXJzaW9uOiBzdHJpbmdcbik6IGN1cnJlbnRWZXJzaW9uIGlzIHN0cmluZyB7XG4gIGlmICghY3VycmVudFZlcnNpb24pIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgY29uc3QgdmFsaWRDdXJyZW50VmVyc2lvbiA9IHNlbXZlci52YWxpZChjdXJyZW50VmVyc2lvbik7XG4gIGNvbnN0IHZhbGlkTWFuYWdlZFZlcnNpb24gPSBzZW12ZXIudmFsaWQobWFuYWdlZFZlcnNpb24pO1xuICByZXR1cm4gKFxuICAgIHNob3VsZEFwcGx5UGFja2FnZUFnZUdhdGUoZGVwZW5kZW5jeSkgJiZcbiAgICB2YWxpZEN1cnJlbnRWZXJzaW9uICE9PSBudWxsICYmXG4gICAgdmFsaWRNYW5hZ2VkVmVyc2lvbiAhPT0gbnVsbCAmJlxuICAgIHNlbXZlci5ndCh2YWxpZEN1cnJlbnRWZXJzaW9uLCB2YWxpZE1hbmFnZWRWZXJzaW9uKVxuICApO1xufVxuXG4vLyBUaGUgbmV3ZXN0IFR5cGVTY3JpcHQgNiByZWxlYXNlIGF0IHRoZSB0aW1lIHRoZSBCbGl0eiBjYXAgc2hpcHBlZDsgdXNlZCBvbmx5IHdoZW4gdGhlIHJlZ2lzdHJ5XG4vLyBsb29rdXAgZm9yIHRoZSBhY3R1YWwgbmV3ZXN0IHByZS12NyByZWxlYXNlIGZhaWxzIChzZWUgZ2V0TWFuYWdlZERlcGVuZGVuY3lWZXJzaW9uKS5cbmNvbnN0IGxhc3RLbm93blByZVY3VHlwZXNjcmlwdFZlcnNpb24gPSAnNi4wLjMnO1xuXG5mdW5jdGlvbiBnZXRNYW5hZ2VkRGVwZW5kZW5jeVZlcnNpb24oY29uZmlnOiBQYWNrYWdlQ29uZmlnLCByb290Q29uZmlnOiBQYWNrYWdlQ29uZmlnLCBkZXBlbmRlbmN5OiBzdHJpbmcpOiBzdHJpbmcge1xuICBjb25zdCBsYXRlc3RWZXJzaW9uID0gZ2V0TGF0ZXN0RGVwZW5kZW5jeVZlcnNpb24oZGVwZW5kZW5jeSk7XG4gIGlmIChkZXBlbmRlbmN5ID09PSB0eXBlc2NyaXB0RGVwZW5kZW5jeSAmJiBpc0JsaXR6UmVwb3NpdG9yeShjb25maWcsIHJvb3RDb25maWcpKSB7XG4gICAgLy8gQmxpdHogcGlucyBOZXh0LmpzIDE1LCB3aG9zZSBidWlsZC10aW1lIGB2ZXJpZnlUeXBlU2NyaXB0U2V0dXBgIHJlcXVpcmVzIHRoZSBjbGFzc2ljXG4gICAgLy8gYHR5cGVzY3JpcHRgIGNvbXBpbGVyIEFQSTsgdGhlIFR5cGVTY3JpcHQgNyBgdHlwZXNjcmlwdGAgcGFja2FnZSBpcyB0aGUgdHNnbyBiaW5hcnlcbiAgICAvLyB3aXRob3V0IHRoYXQgQVBJLCBzbyBgbmV4dCBidWlsZGAgYWJvcnRzIHdpdGggXCJGYWlsZWQgdG8gaW5zdGFsbCByZXF1aXJlZCBUeXBlU2NyaXB0XG4gICAgLy8gZGVwZW5kZW5jaWVzXCIgKG9ic2VydmVkIGluIFdpbGxCb29zdGVyL3N1cnZleS1zeXN0ZW0pLiBDYXAgYHR5cGVzY3JpcHRgIGJlbG93IDcgdW50aWxcbiAgICAvLyBCbGl0eiBzdXBwb3J0cyBhIE5leHQuanMgcmVsZWFzZSB0aGF0IHVuZGVyc3RhbmRzIHRzZ28uIEEgZmFpbGVkIHJlZ2lzdHJ5IGxvb2t1cCBtdXN0XG4gICAgLy8gcmVzb2x2ZSB0byBhIGtub3duLWNvbXBhdGlibGUgcmVsZWFzZSDigJQgZmFsbGluZyBiYWNrIHRvIGxhdGVzdFZlcnNpb24gd291bGQgcmVpbnN0YWxsIHRoZVxuICAgIC8vIGluY29tcGF0aWJsZSBUeXBlU2NyaXB0IDcuXG4gICAgY29uc3QgdmFsaWRMYXRlc3RWZXJzaW9uID0gc2VtdmVyLnZhbGlkKGxhdGVzdFZlcnNpb24pO1xuICAgIGlmICh2YWxpZExhdGVzdFZlcnNpb24gJiYgc2VtdmVyLm1ham9yKHZhbGlkTGF0ZXN0VmVyc2lvbikgPCA3KSByZXR1cm4gbGF0ZXN0VmVyc2lvbjtcbiAgICAvLyBUaGUgY2FwcGVkIGxvb2t1cCBtdXN0IHJlc3BlY3QgdGhlIGFnZSBnYXRlIHRvbzogdGhpcyB2ZXJzaW9uIGlzIHdyaXR0ZW4gYXMgYW4gZXhhY3QgcGluLFxuICAgIC8vIGFuZCBCdW4gcmVmdXNlcyB0byByZXNvbHZlIG9uZSBwdWJsaXNoZWQgaW5zaWRlIHRoZSBtaW5pbXVtLXJlbGVhc2UtYWdlIHdpbmRvdy4gVGhlcmUgaXMgbm9cbiAgICAvLyB1bmdhdGVkIGZhbGxiYWNrIOKAlCB3aXRob3V0IHB1YmxpY2F0aW9uIG1ldGFkYXRhIHRoZSBhZ2Ugb2YgYSByYW5nZSByZXN1bHQgaXMgdW5rbm93biwgc28gYVxuICAgIC8vIHBhcnRpYWwgcmVnaXN0cnkgZmFpbHVyZSB3b3VsZCBvdGhlcndpc2Ugd3JpdGUgYSB2ZXJzaW9uIEJ1biB0aGVuIHJlZnVzZXMgdG8gaW5zdGFsbC5cbiAgICByZXR1cm4gZ2V0TGF0ZXN0QWdlR2F0ZWRWZXJzaW9uQmVsb3codHlwZXNjcmlwdERlcGVuZGVuY3ksICc3LjAuMCcpID8/IGxhc3RLbm93blByZVY3VHlwZXNjcmlwdFZlcnNpb247XG4gIH1cbiAgcmV0dXJuIGxhdGVzdFZlcnNpb247XG59XG5cbi8qKlxuICogVGhlIGhpZ2hlc3QgcmVsZWFzZSBvZiBgcGFja2FnZU5hbWVgIGJlbG93IGBleGNsdXNpdmVVcHBlckJvdW5kYCB0aGF0IGFscmVhZHkgY2xlYXJlZCB0aGUgYWdlXG4gKiBnYXRlLCBvciB1bmRlZmluZWQgd2hlbiB0aGUgcmVnaXN0cnkgbG9va3VwIGZhaWxzIG9yIG5vIHN1Y2ggcmVsZWFzZSBleGlzdHMgeWV0LlxuICovXG5mdW5jdGlvbiBnZXRMYXRlc3RBZ2VHYXRlZFZlcnNpb25CZWxvdyhwYWNrYWdlTmFtZTogc3RyaW5nLCBleGNsdXNpdmVVcHBlckJvdW5kOiBzdHJpbmcpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICByZXR1cm4gZ2V0QWdlR2F0ZWRWZXJzaW9uc0Rlc2NlbmRpbmcoZ2V0TnBtUGFja2FnZVRpbWVzKHBhY2thZ2VOYW1lKSkuZmluZCgodmVyc2lvbikgPT5cbiAgICBzZW12ZXIubHQodmVyc2lvbiwgZXhjbHVzaXZlVXBwZXJCb3VuZClcbiAgKTtcbn1cblxuZnVuY3Rpb24gaXNOZXdlclBhY2thZ2VWZXJzaW9uKGNhbmRpZGF0ZVZlcnNpb246IHN0cmluZywgY3VycmVudFZlcnNpb246IHN0cmluZyk6IGJvb2xlYW4ge1xuICBjb25zdCB2YWxpZExhdGVzdFZlcnNpb24gPSBzZW12ZXIudmFsaWQoY2FuZGlkYXRlVmVyc2lvbik7XG4gIGNvbnN0IHZhbGlkQ3VycmVudFZlcnNpb24gPSBzZW12ZXIudmFsaWQoY3VycmVudFZlcnNpb24pO1xuICByZXR1cm4gIXZhbGlkTGF0ZXN0VmVyc2lvbiB8fCAhdmFsaWRDdXJyZW50VmVyc2lvbiB8fCBzZW12ZXIuZ3QodmFsaWRMYXRlc3RWZXJzaW9uLCB2YWxpZEN1cnJlbnRWZXJzaW9uKTtcbn1cblxuZnVuY3Rpb24gaXNXb3Jrc3BhY2VQcm90b2NvbFJhbmdlKHZlcnNpb246IHN0cmluZyk6IGJvb2xlYW4ge1xuICByZXR1cm4gdmVyc2lvbi5zdGFydHNXaXRoKCd3b3Jrc3BhY2U6Jyk7XG59XG5cbmZ1bmN0aW9uIGZvcm1hdFJlcG9zaXRvcnlGb3JQYWNrYWdlSnNvbihcbiAgcmVwb3NpdG9yeTogUGFja2FnZUpzb25bJ3JlcG9zaXRvcnknXSxcbiAgZXhpc3RpbmdSZXBvc2l0b3J5PzogUGFja2FnZUpzb25bJ3JlcG9zaXRvcnknXVxuKTogUGFja2FnZUpzb25bJ3JlcG9zaXRvcnknXSB7XG4gIGNvbnN0IG5vcm1hbGl6ZWRSZXBvc2l0b3J5ID0gbm9ybWFsaXplUmVwb3NpdG9yeVVybEZvclBhY2thZ2VKc29uKHJlcG9zaXRvcnkpO1xuICBpZiAobm9ybWFsaXplZFJlcG9zaXRvcnkpIHtcbiAgICByZXR1cm4gYnVpbGROb3JtYWxpemVkUmVwb3NpdG9yeUZvclBhY2thZ2VKc29uKG5vcm1hbGl6ZWRSZXBvc2l0b3J5LCByZXBvc2l0b3J5LCBleGlzdGluZ1JlcG9zaXRvcnkpO1xuICB9XG5cbiAgY29uc3Qgbm9ybWFsaXplZEV4aXN0aW5nUmVwb3NpdG9yeSA9IG5vcm1hbGl6ZVJlcG9zaXRvcnlVcmxGb3JQYWNrYWdlSnNvbihleGlzdGluZ1JlcG9zaXRvcnkpO1xuICBpZiAobm9ybWFsaXplZEV4aXN0aW5nUmVwb3NpdG9yeSkge1xuICAgIHJldHVybiBidWlsZE5vcm1hbGl6ZWRSZXBvc2l0b3J5Rm9yUGFja2FnZUpzb24obm9ybWFsaXplZEV4aXN0aW5nUmVwb3NpdG9yeSwgZXhpc3RpbmdSZXBvc2l0b3J5KTtcbiAgfVxuXG4gIHJldHVybiByZXBvc2l0b3J5O1xufVxuXG5mdW5jdGlvbiBub3JtYWxpemVSZXBvc2l0b3J5VXJsRm9yUGFja2FnZUpzb24ocmVwb3NpdG9yeTogUGFja2FnZUpzb25bJ3JlcG9zaXRvcnknXSk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGlmICh0eXBlb2YgcmVwb3NpdG9yeSA9PT0gJ3N0cmluZycpIHtcbiAgICBpZiAoIXJlcG9zaXRvcnkuc3RhcnRzV2l0aCgnZ2l0aHViOicpKSByZXR1cm47XG5cbiAgICBjb25zdCBbb3duZXIsIHJlcG9dID0gZ2l0SHViVXRpbC5nZXRPcmdBbmROYW1lKHJlcG9zaXRvcnkpO1xuICAgIGlmICghb3duZXIgfHwgIXJlcG8pIHJldHVybjtcbiAgICByZXR1cm4gYGdpdCtodHRwczovL2dpdGh1Yi5jb20vJHtvd25lcn0vJHtyZXBvfS5naXRgO1xuICB9XG5cbiAgY29uc3QgcmVwb3NpdG9yeVVybCA9IHJlcG9zaXRvcnk/LnVybDtcbiAgaWYgKHR5cGVvZiByZXBvc2l0b3J5VXJsICE9PSAnc3RyaW5nJykgcmV0dXJuO1xuXG4gIGNvbnN0IG1hdGNoZWQgPSAvXig/OmdpdFxcKyk/aHR0cHM6XFwvXFwvZ2l0aHViXFwuY29tXFwvKFteL10rKVxcLyhbXi9dKz8pKD86XFwuZ2l0KT8kL3UuZXhlYyhyZXBvc2l0b3J5VXJsKTtcbiAgaWYgKCFtYXRjaGVkKSByZXR1cm47XG5cbiAgY29uc3QgWywgb3duZXIsIHJlcG9dID0gbWF0Y2hlZDtcbiAgcmV0dXJuIGBnaXQraHR0cHM6Ly9naXRodWIuY29tLyR7b3duZXJ9LyR7cmVwb30uZ2l0YDtcbn1cblxuZnVuY3Rpb24gYnVpbGROb3JtYWxpemVkUmVwb3NpdG9yeUZvclBhY2thZ2VKc29uKFxuICBub3JtYWxpemVkVXJsOiBzdHJpbmcsXG4gIHJlcG9zaXRvcnk6IFBhY2thZ2VKc29uWydyZXBvc2l0b3J5J10sXG4gIGV4aXN0aW5nUmVwb3NpdG9yeT86IFBhY2thZ2VKc29uWydyZXBvc2l0b3J5J11cbik6IFBhY2thZ2VKc29uWydyZXBvc2l0b3J5J10ge1xuICBjb25zdCByZXBvc2l0b3J5T2JqID1cbiAgICB0eXBlb2YgcmVwb3NpdG9yeSA9PT0gJ29iamVjdCdcbiAgICAgID8gcmVwb3NpdG9yeVxuICAgICAgOiB0eXBlb2YgZXhpc3RpbmdSZXBvc2l0b3J5ID09PSAnb2JqZWN0J1xuICAgICAgICA/IGV4aXN0aW5nUmVwb3NpdG9yeVxuICAgICAgICA6IHVuZGVmaW5lZDtcblxuICByZXR1cm4ge1xuICAgIC4uLnJlcG9zaXRvcnlPYmosXG4gICAgdHlwZTogJ2dpdCcsXG4gICAgdXJsOiBub3JtYWxpemVkVXJsLFxuICB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2VuZXJhdGVTY3JpcHRzKGNvbmZpZzogUGFja2FnZUNvbmZpZywgb2xkU2NyaXB0czogUGFja2FnZUpzb24uU2NyaXB0cyk6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4ge1xuICBjb25zdCBoYXNUeXBlY2hlY2sgPSBjb25maWcuZG9lc0NvbnRhaW5UeXBlU2NyaXB0IHx8IGNvbmZpZy5kb2VzQ29udGFpblR5cGVTY3JpcHRJblBhY2thZ2VzO1xuICBjb25zdCBzY3JpcHRzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge1xuICAgIC8vIE5vIGAtLWJ1bmA6IGl0cyBub2RlLT5idW4gUEFUSCBzaGltIGxlYWtzIGludG8gZXZlcnkgY2hpbGQgcHJvY2VzcyBhbmQgYnJlYWtzIHRvb2xzXG4gICAgLy8gcmVxdWlyaW5nIHJlYWwgTm9kZS5qcyAoUGxheXdyaWdodCwgd3JhbmdsZXIsIHZpbmV4dCkuXG4gICAgY2xlYW51cDogJ2J1biB3YiBsaW50IC0tZml4IC0tZm9ybWF0JyxcbiAgICBmb3JtYXQ6IGBidW4gd2IgbGludCAtLWZvcm1hdGAsXG4gICAgbGludDogYGJ1biB3YiBsaW50YCxcbiAgICAnbGludC1maXgnOiAnYnVuIHdiIGxpbnQgLS1maXgnLFxuICAgIHRlc3Q6ICdidW4gd2IgdGVzdCcsXG4gICAgdHlwZWNoZWNrOiAnYnVuIHdiIHR5cGVjaGVjaycsXG4gICAgdmVyaWZ5OiAnYnVuIHdiIHZlcmlmeScsXG4gICAgJ3ZlcmlmeS1mdWxsJzogJ2J1biB3YiB2ZXJpZnkgLS1mdWxsJyxcbiAgfTtcbiAgaWYgKGNvbmZpZy5pc1Jvb3QpIHtcbiAgICBhcHBseVRlc3RPbkNpU2NyaXB0KHNjcmlwdHMsIG9sZFNjcmlwdHMpO1xuICB9XG4gIGFwcGx5VGVzdFNjcmlwdChjb25maWcsIHNjcmlwdHMsIG9sZFNjcmlwdHMpO1xuICBrZWVwR2VuZXJhdGVkU2NyaXB0V3JhcHBlcnMoc2NyaXB0cywgb2xkU2NyaXB0cywgWyd0ZXN0JywgJ3ZlcmlmeS1mdWxsJ10pO1xuICBhcHBseURhdGFiYXNlU2NyaXB0cyhjb25maWcsIHNjcmlwdHMsIG9sZFNjcmlwdHMsIGBidW4gJHtnZXRXYkRhdGFiYXNlQ29tbWFuZChjb25maWcpfWApO1xuICBhcHBseU1pc2VUYXNrU2NyaXB0cyhjb25maWcsIHNjcmlwdHMsIG9sZFNjcmlwdHMsIFsnYnVpbGQnLCAnZGV2JywgJ3N0YXJ0JywgJ3Rlc3QnLCAndHlwZWNoZWNrJ10pO1xuICBpZiAoIWhhc1R5cGVjaGVjaykge1xuICAgIGRlbGV0ZSBzY3JpcHRzLnR5cGVjaGVjaztcbiAgfSBlbHNlIGlmIChjb25maWcuZGVwZW5kaW5nLnB5cmlnaHQpIHtcbiAgICBzY3JpcHRzLnR5cGVjaGVjayArPSAnICYmIHB5cmlnaHQnO1xuICB9XG4gIHJldHVybiBzY3JpcHRzO1xufVxuXG4vLyBDSSB3b3JrZmxvd3MgKGJvdGggdGhlIHJldXNhYmxlIHRlc3Qgd29ya2Zsb3cgYW5kIHRoZSBzZWxmLWNvbnRhaW5lZCB2YXJpYW50IGZvciBub24tV2lsbEJvb3N0ZXJcbi8vIHJlcG9zaXRvcmllcykgcHJlZmVyIGB0ZXN0L2NpYCBvdmVyIGB0ZXN0YCwgc28gc3RhbmRhcmRpemUgaXQgb24gYHdiIHRlc3Qtb24tY2lgIGF0IHRoZSByb290IOKAlFxuLy8gYHdiIHRlc3Qtb24tY2lgIGFscmVhZHkgaXRlcmF0ZXMgd29ya3NwYWNlIHBhY2thZ2VzIGl0c2VsZi5cbmZ1bmN0aW9uIGFwcGx5VGVzdE9uQ2lTY3JpcHQoc2NyaXB0czogUmVjb3JkPHN0cmluZywgc3RyaW5nPiwgb2xkU2NyaXB0czogUGFja2FnZUpzb24uU2NyaXB0cyk6IHZvaWQge1xuICBjb25zdCBvbGRTY3JpcHQgPSBvbGRTY3JpcHRzWyd0ZXN0L2NpJ107XG4gIC8vIFNvbWUgcmVwb3NpdG9yaWVzIHdyYXAgQ0kgdGVzdHMgd2l0aCBleHRyYSBzdGVwcyAoZS5nLiBzZWxlY3Rpbmcgc3BlYyBmaWxlcyBvciBydW5uaW5nIHJhd1xuICAvLyBQbGF5d3JpZ2h0KSB0aGF0IHdiIGNhbm5vdCBpbmZlciBnZW5lcmljYWxseTsgc3VjaCB3cmFwcGVycyBhcmUgcHJlc2VydmVkLlxuICBzY3JpcHRzWyd0ZXN0L2NpJ10gPSBvbGRTY3JpcHQgJiYgIWlzR2VuZXJhdGVkVGVzdE9uQ2lTY3JpcHQob2xkU2NyaXB0KSA/IG9sZFNjcmlwdCA6ICdidW4gd2IgdGVzdC1vbi1jaSc7XG59XG5cbi8qKiBXaGV0aGVyIGEgc2NyaXB0IGJvZHkgaXMgb25lIG9mIHRoZSBnZW5lcmF0ZWQgYHdiIHRlc3Qtb24tY2lgIGludm9jYXRpb25zLiAqL1xuZnVuY3Rpb24gaXNHZW5lcmF0ZWRUZXN0T25DaVNjcmlwdChzY3JpcHQ6IHN0cmluZyk6IGJvb2xlYW4ge1xuICByZXR1cm4gc2NyaXB0LnRyaW0oKSA9PT0gJ2J1biB3YiB0ZXN0LW9uLWNpJztcbn1cblxuLyoqXG4gKiBgd2IgdGVzdGAgcnVucyBKYXZhU2NyaXB0L1R5cGVTY3JpcHQgdGVzdCBydW5uZXJzIG9ubHksIHNvIHJlcGxhY2luZyB0aGUgYHRlc3RgIHNjcmlwdCBvZiBhXG4gKiBwYWNrYWdlIHdyaXR0ZW4gaW4gYW5vdGhlciBsYW5ndWFnZSAoZS5nLiBhIE1hdmVuIG9yIGFuIFJTcGVjIHBhY2thZ2UgaW4gYSBwb2x5Z2xvdCBtb25vcmVwbylcbiAqIHNpbGVudGx5IGRyb3BzIGl0cyB3aG9sZSBzdWl0ZTogdGhlIGdlbmVyYXRlZCBzY3JpcHQgdGhlbiBzdWNjZWVkcyB3aXRob3V0IHJ1bm5pbmcgYW55dGhpbmcuXG4gKiBTdWNoIGEgcGFja2FnZSBrZWVwcyBpdHMgb3duIGB0ZXN0YCBzY3JpcHQ7IEpTL1RTIHBhY2thZ2VzIGFyZSBzdGFuZGFyZGl6ZWQgYXMgdXN1YWwuXG4gKi9cbmZ1bmN0aW9uIGFwcGx5VGVzdFNjcmlwdChcbiAgY29uZmlnOiBQYWNrYWdlQ29uZmlnLFxuICBzY3JpcHRzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+LFxuICBvbGRTY3JpcHRzOiBQYWNrYWdlSnNvbi5TY3JpcHRzXG4pOiB2b2lkIHtcbiAgY29uc3Qgb2xkU2NyaXB0ID0gb2xkU2NyaXB0cy50ZXN0Py50cmltKCk7XG4gIGlmICghb2xkU2NyaXB0IHx8IGRvZXNDb250YWluSnNPclRzKGNvbmZpZykgfHwgaXNHZW5lcmF0ZWRUZXN0U2NyaXB0KG9sZFNjcmlwdCkpIHJldHVybjtcbiAgc2NyaXB0cy50ZXN0ID0gb2xkU2NyaXB0O1xufVxuXG4vKiogV2hldGhlciBhIHNjcmlwdCBib2R5IGlzIG9uZSBvZiB0aGUgS05PV04gZ2VuZXJhdGVkIGB3YiB0ZXN0YCBpbnZvY2F0aW9ucy4gKi9cbmZ1bmN0aW9uIGlzR2VuZXJhdGVkVGVzdFNjcmlwdChzY3JpcHQ6IHN0cmluZyk6IGJvb2xlYW4ge1xuICByZXR1cm4gc2NyaXB0LnRyaW0oKSA9PT0gJ2J1biB3YiB0ZXN0Jztcbn1cblxuLyoqXG4gKiBLZWVwcyBhIHNjcmlwdCB0aGF0IENIQUlOUyBleHRyYSBjb21tYW5kcyBvbnRvIHRoZSBnZW5lcmF0ZWQgb25lIChlLmcuIGEgcG9seWdsb3QgbW9ub3JlcG9cbiAqIGFwcGVuZGluZyBpdHMgTWF2ZW4gYW5kIFJTcGVjIHN1aXRlcyB0byBgd2IgdGVzdGAsIHdoaWNoIHJ1bnMgSmF2YVNjcmlwdC9UeXBlU2NyaXB0IHJ1bm5lcnNcbiAqIG9ubHkpLiBTdWNoIGEgd3JhcHBlciBzdGlsbCBydW5zIHRoZSBnZW5lcmF0ZWQgY29tbWFuZCwgc28gcmVwbGFjaW5nIGl0IHdvdWxkIHNpbGVudGx5IGRyb3AgdGhlXG4gKiByZXBvc2l0b3J5J3Mgb3duIHN0ZXBzIOKAlCB0aGUgc2FtZSByZWFzb25pbmcgYXMgYGFwcGx5VGVzdE9uQ2lTY3JpcHRgLiBBbiB1bnJlY29nbml6ZWQgY2hhaW5lZFxuICogc2NyaXB0IGlzIGtlcHQgd2hvbGVzYWxlIHJhdGhlciB0aGFuIGxvc2luZyBpdHMgcHJvamVjdC1vd25lZCBjb21tYW5kcy5cbiAqL1xuZnVuY3Rpb24ga2VlcEdlbmVyYXRlZFNjcmlwdFdyYXBwZXJzKFxuICBzY3JpcHRzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+LFxuICBvbGRTY3JpcHRzOiBQYWNrYWdlSnNvbi5TY3JpcHRzLFxuICBzY3JpcHROYW1lczogc3RyaW5nW11cbik6IHZvaWQge1xuICBmb3IgKGNvbnN0IHNjcmlwdE5hbWUgb2Ygc2NyaXB0TmFtZXMpIHtcbiAgICBjb25zdCBvbGRTY3JpcHQgPSBvbGRTY3JpcHRzW3NjcmlwdE5hbWVdPy50cmltKCk7XG4gICAgY29uc3QgZ2VuZXJhdGVkU2NyaXB0ID0gc2NyaXB0c1tzY3JpcHROYW1lXTtcbiAgICBpZiAoIW9sZFNjcmlwdCB8fCAhZ2VuZXJhdGVkU2NyaXB0IHx8IG9sZFNjcmlwdCA9PT0gZ2VuZXJhdGVkU2NyaXB0KSBjb250aW51ZTtcbiAgICBjb25zdCBoZWFkUmVnRXhwID0gbmV3IFJlZ0V4cChcbiAgICAgIGBeJHtlc2NhcGVSZWdFeHAoZ2VuZXJhdGVkU2NyaXB0KS5yZXBsYWNlQWxsKCcgJywgU3RyaW5nLnJhd2BbIFxcdF0rYCl9KD89WyBcXFxcdF0qKD86JiZ8XFxcXHxcXFxcfHw7fFxcXFxuKSlgLFxuICAgICAgJ3UnXG4gICAgKTtcbiAgICAvLyBBIG5ld2xpbmUgc2VwYXJhdGVzIHNoZWxsIGNvbW1hbmRzIGp1c3QgbGlrZSAmJiwgfHwgYW5kIDsuXG4gICAgaWYgKGhlYWRSZWdFeHAudGVzdChvbGRTY3JpcHQpKSB7XG4gICAgICAvLyBBIGZ1bmN0aW9uIHJlcGxhY2VtZW50IGtlZXBzIGAkYC1zaGFwZWQgY2hhcmFjdGVycyBpbiB0aGUgZ2VuZXJhdGVkIGNvbW1hbmQgbGl0ZXJhbC5cbiAgICAgIHNjcmlwdHNbc2NyaXB0TmFtZV0gPSBvbGRTY3JpcHQucmVwbGFjZShoZWFkUmVnRXhwLCAoKSA9PiBnZW5lcmF0ZWRTY3JpcHQpO1xuICAgIH0gZWxzZSBpZiAoLyg/OiYmfFxcfFxcfHw7fFxcbikvdS50ZXN0KG9sZFNjcmlwdCkpIHtcbiAgICAgIHNjcmlwdHNbc2NyaXB0TmFtZV0gPSBvbGRTY3JpcHQ7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGFwcGx5RGF0YWJhc2VTY3JpcHRzKFxuICBjb25maWc6IFBhY2thZ2VDb25maWcsXG4gIHNjcmlwdHM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4sXG4gIG9sZFNjcmlwdHM6IFBhY2thZ2VKc29uLlNjcmlwdHMsXG4gIHdiRGJDb21tYW5kOiBzdHJpbmdcbik6IHZvaWQge1xuICBpZiAoIWNvbmZpZy5kZXBlbmRpbmcucHJpc21hICYmICFjb25maWcuZGVwZW5kaW5nLmRyaXp6bGUpIHJldHVybjtcblxuICBhcHBseURhdGFiYXNlU2NyaXB0KHNjcmlwdHMsIG9sZFNjcmlwdHMsICdkYi1jcmVhdGUtbWlncmF0aW9uJywgYCR7d2JEYkNvbW1hbmR9IG1pZ3JhdGUtZGV2YCwgJ21pZ3JhdGUtZGV2Jyk7XG4gIGFwcGx5RGF0YWJhc2VTY3JpcHQoXG4gICAgc2NyaXB0cyxcbiAgICBvbGRTY3JpcHRzLFxuICAgICdkYi1taWdyYXRlJyxcbiAgICBgJHt3YkRiQ29tbWFuZH0gbWlncmF0ZSAtLWNoZWNrLWlkZW1wb3RlbmN5YCxcbiAgICAnbWlncmF0ZSAtLWNoZWNrLWlkZW1wb3RlbmN5J1xuICApO1xuICBhcHBseURhdGFiYXNlU2NyaXB0KHNjcmlwdHMsIG9sZFNjcmlwdHMsICdkYi12aWV3JywgYCR7d2JEYkNvbW1hbmR9IHN0dWRpb2AsICdzdHVkaW8nKTtcbn1cblxuZnVuY3Rpb24gYXBwbHlEYXRhYmFzZVNjcmlwdChcbiAgc2NyaXB0czogUmVjb3JkPHN0cmluZywgc3RyaW5nPixcbiAgb2xkU2NyaXB0czogUGFja2FnZUpzb24uU2NyaXB0cyxcbiAgbmFtZTogc3RyaW5nLFxuICBnZW5lcmF0ZWRTY3JpcHQ6IHN0cmluZyxcbiAgZ2VuZXJhdGVkQXJndW1lbnRzOiBzdHJpbmdcbik6IHZvaWQge1xuICBjb25zdCBvbGRTY3JpcHQgPSBvbGRTY3JpcHRzW25hbWVdO1xuICAvLyBTb21lIHJlcG9zaXRvcmllcyB3cmFwIG1pZ3JhdGlvbiBjb21tYW5kcyB0byBwcmVwYXJlIFNRTGl0ZSBkaXJlY3RvcmllcyxcbiAgLy8gZmFuIG91dCBvdmVyIHRlbmFudHMsIG9yIHBlcmZvcm0gY2xlYW51cCB0aGF0IHdiIGNhbm5vdCBpbmZlciBnZW5lcmljYWxseS5cbiAgY29uc3QgZ2VuZXJhdGVkQm9kaWVzID0gW2BidW4gd2IgZGIgJHtnZW5lcmF0ZWRBcmd1bWVudHN9YCwgYGJ1biB3YiBwcmlzbWEgJHtnZW5lcmF0ZWRBcmd1bWVudHN9YF07XG4gIHNjcmlwdHNbbmFtZV0gPSBvbGRTY3JpcHQgJiYgIWdlbmVyYXRlZEJvZGllcy5pbmNsdWRlcyhvbGRTY3JpcHQudHJpbSgpKSA/IG9sZFNjcmlwdCA6IGdlbmVyYXRlZFNjcmlwdDtcbn1cblxuZnVuY3Rpb24gZ2V0V2JEYXRhYmFzZUNvbW1hbmQoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogJ3diIGRiJyB8ICd3YiBwcmlzbWEnIHtcbiAgaWYgKGNvbmZpZy5kZXBlbmRpbmcucHJpc21hKSByZXR1cm4gJ3diIHByaXNtYSc7XG4gIHJldHVybiAnd2IgZGInO1xufVxuXG5mdW5jdGlvbiBpc1diUGFja2FnZShwYWNrYWdlSnNvbjogUGFja2FnZUpzb24gfCB1bmRlZmluZWQpOiBib29sZWFuIHtcbiAgcmV0dXJuIHBhY2thZ2VKc29uPy5uYW1lID09PSB3YkRlcGVuZGVuY3k7XG59XG5cbmZ1bmN0aW9uIGFwcGx5TWlzZVRhc2tTY3JpcHRzKFxuICBjb25maWc6IFBhY2thZ2VDb25maWcsXG4gIHNjcmlwdHM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4sXG4gIG9sZFNjcmlwdHM6IFBhY2thZ2VKc29uLlNjcmlwdHMsXG4gIG5hbWVzOiBzdHJpbmdbXVxuKTogdm9pZCB7XG4gIGZvciAoY29uc3QgbmFtZSBvZiBuYW1lcykge1xuICAgIGlmICghaGFzTWlzZVRhc2soY29uZmlnLCBuYW1lKSkgY29udGludWU7XG4gICAgaWYgKGRvZXNNaXNlVGFza0NhbGxQYWNrYWdlU2NyaXB0KGNvbmZpZywgbmFtZSkpIGNvbnRpbnVlO1xuICAgIC8vIFByZXNlcnZlIGEgbGVhZGluZyBgS0VZPVZBTFVFIGAgZW52IHByZWZpeCAoZS5nLiBgTUlTRV9FTlY9dGVzdGApIG9uIGFuIGV4aXN0aW5nIG1pc2UgYnJpZGdlLlxuICAgIC8vIFN1Y2ggYSBwcmVmaXggaXMgcmVxdWlyZWQgZm9yIG1pc2UgY29uZmlnIGVudmlyb25tZW50cyAobWlzZS48TUlTRV9FTlY+LnRvbWwpLCB3aGljaCBhcmVcbiAgICAvLyBzZWxlY3RlZCBmcm9tIE1JU0VfRU5WICpiZWZvcmUqIG1pc2Ugc3RhcnRzIGFuZCBjYW5ub3QgYmUgc3dpdGNoZWQgZnJvbSBpbnNpZGUgYSB0YXNrOyBkcm9wcGluZ1xuICAgIC8vIGl0IHdvdWxkIHNpbGVudGx5IHJ1biB0aGUgdGFzayBpbiB0aGUgZGVmYXVsdCBlbnZpcm9ubWVudC5cbiAgICBjb25zdCBlbnZQcmVmaXggPSBleHRyYWN0TWlzZUJyaWRnZUVudlByZWZpeChvbGRTY3JpcHRzW25hbWVdLCBuYW1lKTtcbiAgICBpZiAoZW52UHJlZml4ID09PSB1bmRlZmluZWQgJiYgb2xkU2NyaXB0c1tuYW1lXSAmJiAhKG5hbWUgaW4gc2NyaXB0cykpIGNvbnRpbnVlO1xuICAgIHNjcmlwdHNbbmFtZV0gPSBgJHtlbnZQcmVmaXggPz8gJyd9bWlzZSBydW4gJHtuYW1lfWA7XG4gIH1cbn1cblxuLyoqXG4gKiBSZXR1cm5zIHRoZSBsZWFkaW5nIGBLRVk9VkFMVUUgYCBlbnYtdmFyIHByZWZpeCBvZiBhbiBleGlzdGluZyBgbWlzZSBydW4gPG5hbWU+YCBicmlkZ2Ugc2NyaXB0XG4gKiAocG9zc2libHkgYW4gZW1wdHkgc3RyaW5nIHdoZW4gdGhlIGJyaWRnZSBoYXMgbm8gcHJlZml4KSwgb3IgYHVuZGVmaW5lZGAgd2hlbiB0aGUgc2NyaXB0IGlzIG5vdCBhXG4gKiBtaXNlIGJyaWRnZSBmb3IgdGhlIGdpdmVuIHRhc2suXG4gKi9cbmZ1bmN0aW9uIGV4dHJhY3RNaXNlQnJpZGdlRW52UHJlZml4KHNjcmlwdDogdW5rbm93biwgbmFtZTogc3RyaW5nKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgaWYgKHR5cGVvZiBzY3JpcHQgIT09ICdzdHJpbmcnKSByZXR1cm4gdW5kZWZpbmVkO1xuICAvLyBFYWNoIGFzc2lnbm1lbnQgdmFsdWUgbWF5IGJlIGRvdWJsZS1xdW90ZWQsIHNpbmdsZS1xdW90ZWQsIG9yIGFuIHVucXVvdGVkIHJ1biBvZiBub24td2hpdGVzcGFjZSxcbiAgLy8gc28gcHJlZml4ZXMgbGlrZSBgTUlTRV9FTlY9XCJhIGJcImAgKHdob3NlIHZhbHVlIGNvbnRhaW5zIHNwYWNlcykgYXJlIG1hdGNoZWQgaW5zdGVhZCBvZiBkcm9wcGVkLlxuICBjb25zdCBtYXRjaCA9IG5ldyBSZWdFeHAoU3RyaW5nLnJhd2BeKCg/Olxcdys9KD86XCJbXlwiXSpcInwnW14nXSonfFxcUyspXFxzKykqKW1pc2UgcnVuICR7ZXNjYXBlUmVnRXhwKG5hbWUpfSRgLCAndScpLmV4ZWMoXG4gICAgc2NyaXB0LnRyaW0oKVxuICApO1xuICByZXR1cm4gbWF0Y2g/LlsxXTtcbn1cblxuZnVuY3Rpb24gaGFzTWlzZVRhc2soY29uZmlnOiBQYWNrYWdlQ29uZmlnLCBuYW1lOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgcmV0dXJuIE9iamVjdC5oYXNPd24oY29uZmlnLm1pc2VUYXNrcywgbmFtZSk7XG59XG5cbmZ1bmN0aW9uIGRvZXNNaXNlVGFza0NhbGxQYWNrYWdlU2NyaXB0KGNvbmZpZzogUGFja2FnZUNvbmZpZywgbmFtZTogc3RyaW5nKTogYm9vbGVhbiB7XG4gIGNvbnN0IHRhc2sgPSBjb25maWcubWlzZVRhc2tzW25hbWVdO1xuICBpZiAoIXRhc2spIHJldHVybiBmYWxzZTtcbiAgY29uc3QgcGFja2FnZU1hbmFnZXJzID0gWydidW4nLCAneWFybicsICducG0nLCAncG5wbSddO1xuICByZXR1cm4gcGFja2FnZU1hbmFnZXJzLnNvbWUoKHBhY2thZ2VNYW5hZ2VyKSA9PlxuICAgIG5ldyBSZWdFeHAoU3RyaW5nLnJhd2BcXGIke3BhY2thZ2VNYW5hZ2VyfVxccysoPzpydW5cXHMrKT8ke2VzY2FwZVJlZ0V4cChuYW1lKX0oPyFbYS16QS1aMC05X1xcLTouXSlgLCAndScpLnRlc3QodGFzaylcbiAgKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gdXBkYXRlUHJpdmF0ZVBhY2thZ2VzKGpzb25PYmo6IFdyaXRhYmxlUGFja2FnZUpzb24pOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgcGFja2FnZU5hbWVzID0gbmV3IFNldChbLi4uT2JqZWN0LmtleXMoanNvbk9iai5kZXBlbmRlbmNpZXMpLCAuLi5PYmplY3Qua2V5cyhqc29uT2JqLmRldkRlcGVuZGVuY2llcyldKTtcbiAgY29uc3QgcHJpdmF0ZVBhY2thZ2VzOiB7XG4gICAgcGFja2FnZU5hbWU6IHN0cmluZztcbiAgICBvcmc6IHN0cmluZztcbiAgICByZXBvOiBzdHJpbmc7XG4gICAgdGFyZ2V0OiAnZGVwZW5kZW5jaWVzJyB8ICdkZXZEZXBlbmRlbmNpZXMnO1xuICB9W10gPSBbXG4gICAgeyBwYWNrYWdlTmFtZTogJ0B3aWxsYm9vc3Rlci9jb2RlLWFuYWx5emVyJywgb3JnOiAnV2lsbEJvb3N0ZXInLCByZXBvOiAnY29kZS1hbmFseXplcicsIHRhcmdldDogJ2RldkRlcGVuZGVuY2llcycgfSxcbiAgICB7IHBhY2thZ2VOYW1lOiAnQHdpbGxib29zdGVyL2p1ZGdlJywgb3JnOiAnV2lsbEJvb3N0ZXJMYWInLCByZXBvOiAnanVkZ2UnLCB0YXJnZXQ6ICdkZXBlbmRlbmNpZXMnIH0sXG4gICAgeyBwYWNrYWdlTmFtZTogJ0B3aWxsYm9vc3Rlci9sbG0tcHJveHknLCBvcmc6ICdXaWxsQm9vc3RlckxhYicsIHJlcG86ICdsbG0tcHJveHknLCB0YXJnZXQ6ICdkZXBlbmRlbmNpZXMnIH0sXG4gIF07XG5cbiAgYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgcHJpdmF0ZVBhY2thZ2VzLm1hcChhc3luYyAoeyBvcmcsIHBhY2thZ2VOYW1lLCByZXBvLCB0YXJnZXQgfSkgPT4ge1xuICAgICAgaWYgKCFwYWNrYWdlTmFtZXMuaGFzKHBhY2thZ2VOYW1lKSB8fCBpc1dvcmtzcGFjZVBhY2thZ2UoanNvbk9iaiwgcGFja2FnZU5hbWUpKSByZXR1cm47XG5cbiAgICAgIGNvbnN0IGV4aXN0aW5nU3BlY2lmaWVyID0ganNvbk9iai5kZXBlbmRlbmNpZXNbcGFja2FnZU5hbWVdID8/IGpzb25PYmouZGV2RGVwZW5kZW5jaWVzW3BhY2thZ2VOYW1lXTtcbiAgICAgIGNvbnN0IG90aGVyVGFyZ2V0ID0gdGFyZ2V0ID09PSAnZGVwZW5kZW5jaWVzJyA/ICdkZXZEZXBlbmRlbmNpZXMnIDogJ2RlcGVuZGVuY2llcyc7XG4gICAgICAvLyBUaGUgbGludCBydWxlIGRpc2FsbG93cyBgZGVsZXRlYCB3aXRoIGNvbXB1dGVkIHBhY2thZ2UgbmFtZXM7IFJlZmxlY3QgaGFzIHRoZSBzYW1lIGRlbGV0aW9uIHNlbWFudGljcyBoZXJlLlxuICAgICAgUmVmbGVjdC5kZWxldGVQcm9wZXJ0eShqc29uT2JqW290aGVyVGFyZ2V0XSwgcGFja2FnZU5hbWUpO1xuICAgICAganNvbk9ialt0YXJnZXRdW3BhY2thZ2VOYW1lXSA9IGlzUGlubmVkUHJpdmF0ZVBhY2thZ2VTcGVjaWZpZXIoZXhpc3RpbmdTcGVjaWZpZXIsIG9yZywgcmVwbylcbiAgICAgICAgPyBleGlzdGluZ1NwZWNpZmllclxuICAgICAgICA6IGF3YWl0IGdldExhdGVzdFByaXZhdGVQYWNrYWdlU3BlY2lmaWVyKG9yZywgcmVwbyk7XG4gICAgfSlcbiAgKTtcbn1cblxuLyoqXG4gKiBXaGV0aGVyIHRoZSBleGlzdGluZyBzcGVjaWZpZXIgYWxyZWFkeSBwaW5zIGEgZ2l0IHJlZiBvZiB0aGUgZXhwZWN0ZWQgcHJpdmF0ZSByZXBvc2l0b3J5LlxuICogd2JmeSBtdXN0IG5vdCBidW1wIHN1Y2ggcGluczogYSBydW4gaW50ZW5kZWQgYXMgY29uZmlndXJhdGlvbi9wYWNrYWdlLW1hbmFnZXIgbWFpbnRlbmFuY2VcbiAqIHdvdWxkIG90aGVyd2lzZSBjaGFuZ2UgdGhlIGRlcGVuZGVuY3kncyB2ZXJzaW9uIGFzIGEgc2lkZSBlZmZlY3QgKHVwZGF0aW5nIHBpbnMgaXMgUmVub3ZhdGUnc1xuICogam9iKSwgcG9zc2libHkgdG8gYSBjb21taXQgd2hvc2UgcHJlYnVpbHQgYXJ0aWZhY3RzIGFyZSBtaXNzaW5nLlxuICovXG5mdW5jdGlvbiBpc1Bpbm5lZFByaXZhdGVQYWNrYWdlU3BlY2lmaWVyKFxuICBzcGVjaWZpZXI6IHN0cmluZyB8IHVuZGVmaW5lZCxcbiAgb3JnOiBzdHJpbmcsXG4gIHJlcG86IHN0cmluZ1xuKTogc3BlY2lmaWVyIGlzIHN0cmluZyB7XG4gIGlmICghc3BlY2lmaWVyKSByZXR1cm4gZmFsc2U7XG4gIHJldHVybiBuZXcgUmVnRXhwKFN0cmluZy5yYXdgKD86XnxbOi9dKSR7b3JnfS8ke3JlcG99KD86XFwuZ2l0KT8jXFxTKyRgLCAndScpLnRlc3Qoc3BlY2lmaWVyKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gZ2V0TGF0ZXN0UHJpdmF0ZVBhY2thZ2VTcGVjaWZpZXIob3JnOiBzdHJpbmcsIHJlcG86IHN0cmluZyk6IFByb21pc2U8c3RyaW5nPiB7XG4gIGNvbnN0IGNvbW1pdEhhc2ggPSBhd2FpdCBnZXRMYXRlc3RDb21taXRIYXNoKG9yZywgcmVwbyk7XG4gIHJldHVybiBgZ2l0QGdpdGh1Yi5jb206JHtvcmd9LyR7cmVwb30uZ2l0IyR7Y29tbWl0SGFzaH1gO1xufVxuXG5mdW5jdGlvbiBpc1dvcmtzcGFjZVBhY2thZ2UoanNvbk9iajogUGFja2FnZUpzb24sIHBhY2thZ2VOYW1lOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgcmV0dXJuIChqc29uT2JqLmRldkRlcGVuZGVuY2llcz8uW3BhY2thZ2VOYW1lXSB8fCBqc29uT2JqLmRlcGVuZGVuY2llcz8uW3BhY2thZ2VOYW1lXSB8fCAnJykuaW5jbHVkZXMoJ3dvcmtzcGFjZScpO1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0ICogYXMgeWFtbCBmcm9tICdqcy15YW1sJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB7IGZzVXRpbCB9IGZyb20gJy4uL3V0aWxzL2ZzVXRpbC5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGV4dGVuc2lvbnMgfSBmcm9tICcuLi91dGlscy9leHRlbnNpb25zLmpzJztcbmltcG9ydCB7IGdldEdlbkkxOG5Uc0NvbW1hbmQgfSBmcm9tICcuLi91dGlscy9nZW5JMThuVHMuanMnO1xuaW1wb3J0IHsgZG9lc0NvbnRhaW5KYXZhLCBkb2VzQ29udGFpbkpzT3JUcyB9IGZyb20gJy4uL3V0aWxzL3BhY2thZ2VDYXBhYmlsaXRpZXMuanMnO1xuXG5pbXBvcnQgeyBnZW5lcmF0ZVNjcmlwdHMgfSBmcm9tICcuL3BhY2thZ2VKc29uLmpzJztcblxuaW50ZXJmYWNlIExlZnRob29rU2V0dGluZ3Mge1xuICBnbG9iX21hdGNoZXI6ICdkb3VibGVzdGFyJztcbiAgJ3Bvc3QtbWVyZ2UnOiB7XG4gICAgam9iczogTGVmdGhvb2tKb2JbXTtcbiAgfTtcbiAgJ3ByZS1jb21taXQnOiB7XG4gICAgam9iczogTGVmdGhvb2tKb2JbXTtcbiAgfTtcbiAgJ3ByZS1wdXNoJzoge1xuICAgIGpvYnM6IExlZnRob29rSm9iW107XG4gIH07XG59XG5cbmludGVyZmFjZSBMZWZ0aG9va0pvYiB7XG4gIG5hbWU6IHN0cmluZztcbiAgZ2xvYj86IHN0cmluZztcbiAgcnVuPzogc3RyaW5nO1xuICBzY3JpcHQ/OiBzdHJpbmc7XG4gIHJ1bm5lcj86ICdiYXNoJztcbiAgc3RhZ2VfZml4ZWQ/OiB0cnVlO1xufVxuXG5jb25zdCBiYXNlU2V0dGluZ3M6IE9taXQ8TGVmdGhvb2tTZXR0aW5ncywgJ3ByZS1jb21taXQnPiA9IHtcbiAgZ2xvYl9tYXRjaGVyOiAnZG91Ymxlc3RhcicsXG4gICdwb3N0LW1lcmdlJzoge1xuICAgIGpvYnM6IFtcbiAgICAgIHtcbiAgICAgICAgbmFtZTogJ3ByZXBhcmUnLFxuICAgICAgICBzY3JpcHQ6ICdwcmVwYXJlLnNoJyxcbiAgICAgICAgcnVubmVyOiAnYmFzaCcsXG4gICAgICB9LFxuICAgIF0sXG4gIH0sXG4gICdwcmUtcHVzaCc6IHtcbiAgICBqb2JzOiBbXG4gICAgICB7XG4gICAgICAgIG5hbWU6ICdjaGVjaycsXG4gICAgICAgIHNjcmlwdDogJ2NoZWNrLnNoJyxcbiAgICAgICAgcnVubmVyOiAnYmFzaCcsXG4gICAgICB9LFxuICAgIF0sXG4gIH0sXG59O1xuXG4vLyBMZWZ0aG9vayBleHBhbmRzIHtzdGFnZWRfZmlsZXN9IGFzIHNoZWxsLWVzY2FwZWQgYXJncywgc28gdGhlIHVucXVvdGVkIGxvb3BzIGJlbG93IGtlZXAgcGF0aHNcbi8vIHdpdGggc3BhY2VzIGludGFjdC5cbmNvbnN0IHByZUNvbW1pdFNldHRpbmdzOiBMZWZ0aG9va1NldHRpbmdzWydwcmUtY29tbWl0J10gPSB7XG4gIGpvYnM6IFtcbiAgICB7XG4gICAgICBuYW1lOiAnY2xlYW51cCcsXG4gICAgICBnbG9iOiAnJyxcbiAgICAgIHJ1bjogJycsXG4gICAgICBzdGFnZV9maXhlZDogdHJ1ZSxcbiAgICB9LFxuICAgIHtcbiAgICAgIG5hbWU6ICdjaGVjay1taWdyYXRpb25zJyxcbiAgICAgIGdsb2I6ICcqKi9taWdyYXRpb24uc3FsJyxcbiAgICAgIHJ1bjogYFxuZmFpbGVkPTBcbmZvciBmaWxlIGluIHtzdGFnZWRfZmlsZXN9OyBkb1xuICBpZiBncmVwIC1xICdXYXJuaW5nczonIFwiJGZpbGVcIjsgdGhlblxuICAgIGVjaG8gXCJNaWdyYXRpb24gU1FMIGZpbGUgKCRmaWxlKSBjb250YWlucyB3YXJuaW5ncyEgUGxlYXNlIHNvbHZlIHRoZSB3YXJuaW5ncyBhbmQgY29tbWl0IGFnYWluLlwiXG4gICAgZmFpbGVkPTFcbiAgZmlcbmRvbmVcbmV4aXQgXCIkZmFpbGVkXCJcbmAudHJpbSgpLFxuICAgIH0sXG4gICAge1xuICAgICAgLy8gYnVuIHJlY29yZHMgYW4gYWJzb2x1dGUgYHJlc29sdmVkYCBVUkwgZm9yIGFuIGFscmVhZHktbG9ja2VkIHBhY2thZ2Ugd2hlbmV2ZXIgdGhlXG4gICAgICAvLyBjb25maWd1cmVkIHJlZ2lzdHJ5IGRvZXMgbm90IHNlcnZlIHRoZSB0YXJiYWxsIGhvc3QgaW4gdGhlIHBhY2thZ2UgbWV0YWRhdGEg4oCUIHdoaWNoIGlzXG4gICAgICAvLyBleGFjdGx5IHdoYXQgdGhlIFRha3VtaSBHdWFyZCBwcm94eSBkb2VzLiBTbyBhbiBpbnN0YWxsIHJ1biB3aXRoIEd1YXJkIGFzIHRoZSBkZWZhdWx0XG4gICAgICAvLyByZWdpc3RyeSAoQ0ksIG9yIGEgZGV2ZWxvcGVyIHdobyBwdXQgaXQgaW4gfi8ubnBtcmMpIGJha2VzIG5wbS5mbGF0dC50ZWNoIFVSTHMgaW50b1xuICAgICAgLy8gYnVuLmxvY2ssIGFuZCBjb21taXR0aW5nIHRoZW0gcGlucyBhIFNIQVJFRCBsb2NrZmlsZSB0byBvbmUgZW52aXJvbm1lbnQncyBtaXJyb3I6IGV2ZXJ5XG4gICAgICAvLyBsYXRlciBpbnN0YWxsIGRvd25sb2FkcyB0aHJvdWdoIHRoZSBwcm94eSwgYW5kIGEgY29sZC1jYWNoZSBpbnN0YWxsIGZhaWxzIG91dHJpZ2h0IHdpdGhcbiAgICAgIC8vIDQwMSBmb3IgYW55b25lIHdob3NlIG5wbXJjIGNhcnJpZXMgYSByZWdpc3RyeS5ucG1qcy5vcmcgdG9rZW4sIGJlY2F1c2UgYnVuIHNlbmRzIHRoZVxuICAgICAgLy8gZGVmYXVsdCByZWdpc3RyeSdzIGNyZWRlbnRpYWxzIHRvIHdoYXRldmVyIGhvc3QgdGhlIGxvY2tmaWxlIG5hbWVzLiBHdWFyZCBjb3ZlcmFnZSBkb2VzXG4gICAgICAvLyBub3QgZGVwZW5kIG9uIHRoZXNlIFVSTHMg4oCUIHdpdGggYW4gZW1wdHkgYHJlc29sdmVkYCwgYnVuIGRlcml2ZXMgdGhlIGRvd25sb2FkIFVSTCBmcm9tXG4gICAgICAvLyB0aGUgY29uZmlndXJlZCByZWdpc3RyeSDigJQgc28gc3RyaXAgdGhlbS4gT25seSB0aGUgR3VhcmQgaG9zdCBpcyBzdHJpcHBlZDogYSBzY29wZWRcbiAgICAgIC8vIHJlZ2lzdHJ5IHN1Y2ggYXMgVmVyZGFjY2lvIGxlZ2l0aW1hdGVseSByZWNvcmRzIGl0cyBvd24gVVJMIGZvciBwcml2YXRlIHBhY2thZ2VzLlxuICAgICAgbmFtZTogJ25vcm1hbGl6ZS1idW4tbG9ja2ZpbGUnLFxuICAgICAgZ2xvYjogJ2J1bi5sb2NrJyxcbiAgICAgIHJ1bjogJ2Jhc2ggLmxlZnRob29rL25vcm1hbGl6ZS1idW4tbG9ja2ZpbGUuc2gge3N0YWdlZF9maWxlc30nLFxuICAgICAgc3RhZ2VfZml4ZWQ6IHRydWUsXG4gICAgfSxcbiAgICB7XG4gICAgICAvLyBPbmx5IHdpbGxib29zdGVyLWNvbmZpZ3MgZ2V0cyB0aGlzIGpvYjogZXZlcnkgb3RoZXIgcmVwb3NpdG9yeSdzIHJlbm92YXRlLmpzb25jIG1lcmVseVxuICAgICAgLy8gZXh0ZW5kcyB0aGUgc2hhcmVkIHByZXNldCwgYW5kIHRoZSB2YWxpZGF0b3IgZG9lcyBub3QgcmVzb2x2ZSByZW1vdGUgcHJlc2V0cywgc28gcnVubmluZyBpdFxuICAgICAgLy8gdGhlcmUgd291bGQgdmFsaWRhdGUgdHdvIGxpbmVzIGFuZCBjYXRjaCBub3RoaW5nLiBgLS1uby1nbG9iYWxgIHZhbGlkYXRlcyB0aGUgcHJlc2V0IGFzIGFcbiAgICAgIC8vIHJlcG8gY29uZmlnIGluc3RlYWQgb2YgYSBzZWxmLWhvc3RlZCBnbG9iYWwgY29uZmlnLCBhbmQgYEBsYXRlc3RgIGtlZXBzIG5wbSBmcm9tIHNpbGVudGx5XG4gICAgICAvLyBpbnN0YWxsaW5nIGFuIGFuY2llbnQgUmVub3ZhdGUgdGhhdCBjYW5ub3QgZXZlbiBwYXJzZSBKU09OQyB3aGVuIHRoZSBsb2NhbCBOb2RlIGxhZ3MgYmVoaW5kLlxuICAgICAgLy8gU3RhZ2luZyBhIGRlbGV0aW9uIG9mIHJlbm92YXRlLmpzb25jIGxlYXZlcyBubyBmaWxlIGZvciBpbnNwZWN0aW9uLCBzbyBMZWZ0aG9vayBza2lwcyB0aGlzXG4gICAgICAvLyBqb2IgaW5zdGVhZCBvZiBydW5uaW5nIHRoZSB2YWxpZGF0b3Igb24gYSBtaXNzaW5nIHBhdGgg4oCUIGRlbGliZXJhdGVseSwgYmVjYXVzZSBkZWxldGluZyB0aGVcbiAgICAgIC8vIHNoYXJlZCBwcmVzZXQgaXMgbm90IGFuIG9wZXJhdGlvbiB0aGlzIGhvb2sgbmVlZHMgdG8gZ3VhcmQuXG4gICAgICBuYW1lOiAndmFsaWRhdGUtcmVub3ZhdGUtY29uZmlnJyxcbiAgICAgIGdsb2I6ICdyZW5vdmF0ZS5qc29uYycsXG4gICAgICBydW46ICducHggLS15ZXMgLS1wYWNrYWdlIHJlbm92YXRlQGxhdGVzdCAtLSByZW5vdmF0ZS1jb25maWctdmFsaWRhdG9yIC0tc3RyaWN0IC0tbm8tZ2xvYmFsIHtzdGFnZWRfZmlsZXN9JyxcbiAgICB9LFxuICBdLFxufTtcblxuY29uc3Qgc2NyaXB0cyA9IHtcbiAgLy8gcHJlcGFyZSBjYWxscyB0aGlzIHdpdGhvdXQgYXJndW1lbnRzIGFmdGVyIEJ1biBzYXZlcyB0aGUgcm9vdCBsb2NrZmlsZTsgTGVmdGhvb2sgcGFzc2VzIGl0c1xuICAvLyBzdGFnZWQgcGF0aC4gVGhlIHVucHJlZGljdGFibGUgc2libGluZyBmaWxlIG1ha2VzIHJlcGxhY2VtZW50IGF0b21pYywgYGNwIC1wYCBwcmVzZXJ2ZXMgaXRzXG4gIC8vIG1vZGUsIGFuZCB0aGUgYW5jaG9yZWQgcGF0dGVybiBjYW5ub3QgZXJhc2UgYSBkaXJlY3QgdGFyYmFsbCBkZXBlbmRlbmN5IFVSTC5cbiAgbm9ybWFsaXplQnVuTG9ja2ZpbGU6IGBcbiMhL2Jpbi9iYXNoXG5zZXQgLWVcblxuaWYgW1sgXCIkI1wiIC1lcSAwIF1dOyB0aGVuXG4gIHNldCAtLSBidW4ubG9ja1xuZmlcblxubm9ybWFsaXplZD1cIlwiXG50cmFwICdbWyAteiBcIiRub3JtYWxpemVkXCIgXV0gfHwgcm0gLWYgXCIkbm9ybWFsaXplZFwiJyBFWElUXG5mb3IgZmlsZSBpbiBcIiRAXCI7IGRvXG4gIFtbIC1mIFwiJGZpbGVcIiBdXSB8fCBjb250aW51ZVxuICBub3JtYWxpemVkPVwiJChta3RlbXAgXCIkZmlsZS53YmZ5LW5vcm1hbGl6aW5nLlhYWFhYWFwiKVwiXG4gIGNwIC1wIFwiJGZpbGVcIiBcIiRub3JtYWxpemVkXCJcbiAgc2VkIC1FICdzIyhcIiwgKVwiaHR0cHM6Ly9ucG1cXFxcLmZsYXR0XFxcXC50ZWNoL1teXCJdKlwiI1xcXFwxXCJcIiNnJyBcIiRmaWxlXCIgPiBcIiRub3JtYWxpemVkXCJcbiAgaWYgISBjbXAgLXMgXCIkZmlsZVwiIFwiJG5vcm1hbGl6ZWRcIjsgdGhlblxuICAgIG12IFwiJG5vcm1hbGl6ZWRcIiBcIiRmaWxlXCJcbiAgICBlY2hvIFwiUmVtb3ZlZCBUYWt1bWkgR3VhcmQgcHJveHkgVVJMcyBmcm9tICRmaWxlIHNvIHRoZSBsb2NrZmlsZSBzdGF5cyByZWdpc3RyeS1hZ25vc3RpYy5cIlxuICBmaVxuICBybSAtZiBcIiRub3JtYWxpemVkXCJcbiAgbm9ybWFsaXplZD1cIlwiXG5kb25lXG5gLnRyaW0oKSxcbiAgcG9zdE1lcmdlOiBgXG4jIS9iaW4vYmFzaFxuXG5jaGFuZ2VkX2ZpbGVzPVwiJChnaXQgZGlmZi10cmVlIC1yIC0tbmFtZS1vbmx5IC0tbm8tY29tbWl0LWlkIE9SSUdfSEVBRCBIRUFEKVwiXG5cbnJ1bl9pZl9jaGFuZ2VkKCkge1xuICBpZiBlY2hvIFwiJGNoYW5nZWRfZmlsZXNcIiB8IGdyZXAgLS1xdWlldCAtRSBcIiQxXCI7IHRoZW5cbiAgICBldmFsIFwiJDJcIlxuICBmaVxufVxuYC50cmltKCksXG59O1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVMZWZ0aG9vayhjb25maWc6IFBhY2thZ2VDb25maWcsIGFsbENvbmZpZ3M6IFBhY2thZ2VDb25maWdbXSA9IFtjb25maWddKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZ2VuZXJhdGVMZWZ0aG9vaycsIGFzeW5jICgpID0+IHtcbiAgICBhd2FpdCBjb3JlKGNvbmZpZywgYWxsQ29uZmlncyk7XG4gIH0pO1xufVxuXG5hc3luYyBmdW5jdGlvbiBjb3JlKGNvbmZpZzogUGFja2FnZUNvbmZpZywgYWxsQ29uZmlnczogUGFja2FnZUNvbmZpZ1tdKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IGRpclBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICcubGVmdGhvb2snKTtcbiAgY29uc3QgeyBsaW50IH0gPSBnZW5lcmF0ZVNjcmlwdHMoY29uZmlnLCB7fSk7XG4gIGNvbnN0IHNldHRpbmdzOiBQYXJ0aWFsPExlZnRob29rU2V0dGluZ3M+ID0ge1xuICAgIC4uLmJhc2VTZXR0aW5ncyxcbiAgICAncHJlLWNvbW1pdCc6IHtcbiAgICAgIGpvYnM6IGdldFByZUNvbW1pdEpvYnMoY29uZmlnKSxcbiAgICB9LFxuICB9O1xuICBpZiAoIWxpbnQpIHtcbiAgICBkZWxldGUgc2V0dGluZ3NbJ3ByZS1wdXNoJ107XG4gIH1cbiAgYXdhaXQgUHJvbWlzZS5hbGwoW1xuICAgIGZzVXRpbC53cml0ZUZpbGVDb25maW5lZChwYXRoLmpvaW4oY29uZmlnLmRpclBhdGgsICdsZWZ0aG9vay55bWwnKSwgeWFtbC5kdW1wKHNldHRpbmdzLCB7IGxpbmVXaWR0aDogLTEgfSkpLFxuICAgIGZzLnByb21pc2VzLnJtKGRpclBhdGgsIHsgZm9yY2U6IHRydWUsIHJlY3Vyc2l2ZTogdHJ1ZSB9KSxcbiAgXSk7XG5cbiAgaWYgKGxpbnQpIHtcbiAgICBjb25zdCBwcmVQdXNoID0gZ2V0UHJlUHVzaFNjcmlwdChjb25maWcpO1xuICAgIGZzLm1rZGlyU3luYyhwYXRoLmpvaW4oZGlyUGF0aCwgJ3ByZS1wdXNoJyksIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICAgIGF3YWl0IGZzLnByb21pc2VzLndyaXRlRmlsZShwYXRoLmpvaW4oZGlyUGF0aCwgJ3ByZS1wdXNoJywgJ2NoZWNrLnNoJyksIHByZVB1c2ggKyAnXFxuJywge1xuICAgICAgbW9kZTogMG83NTUsXG4gICAgfSk7XG4gIH1cbiAgY29uc3QgcG9zdE1lcmdlQ29tbWFuZCA9IGAke3NjcmlwdHMucG9zdE1lcmdlfVxcblxcbiR7Z2VuZXJhdGVQb3N0TWVyZ2VDb21tYW5kcyhjb25maWcsIGFsbENvbmZpZ3MpLmpvaW4oJ1xcbicpfVxcbmA7XG4gIGZzLm1rZGlyU3luYyhkaXJQYXRoLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgYXdhaXQgZnMucHJvbWlzZXMud3JpdGVGaWxlKHBhdGgucmVzb2x2ZShkaXJQYXRoLCAnbm9ybWFsaXplLWJ1bi1sb2NrZmlsZS5zaCcpLCBzY3JpcHRzLm5vcm1hbGl6ZUJ1bkxvY2tmaWxlICsgJ1xcbicsIHtcbiAgICBtb2RlOiAwbzc1NSxcbiAgfSk7XG4gIGZzLm1rZGlyU3luYyhwYXRoLmpvaW4oZGlyUGF0aCwgJ3Bvc3QtbWVyZ2UnKSwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gIGF3YWl0IGZzLnByb21pc2VzLndyaXRlRmlsZShwYXRoLnJlc29sdmUoZGlyUGF0aCwgJ3Bvc3QtbWVyZ2UnLCAncHJlcGFyZS5zaCcpLCBwb3N0TWVyZ2VDb21tYW5kLCB7XG4gICAgbW9kZTogMG83NTUsXG4gIH0pO1xufVxuXG5mdW5jdGlvbiBnZXRQcmVQdXNoU2NyaXB0KGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IHN0cmluZyB7XG4gIC8vIEJ1biByZXBvcyByZWNlaXZlIHdiIGFzIHBhcnQgb2Ygd2JmeSdzIG1hbmFnZWQgdG9vbGNoYWluLCBzbyBnZW5lcmF0ZSB0aGVcbiAgLy8gZmluYWwgaG9vayBjb21tYW5kIG9uIHRoZSBmaXJzdCBydW4gaW5zdGVhZCBvZiBjaGFuZ2luZyBpdCBvbiB0aGUgc2Vjb25kLlxuICBjb25zdCBxdWlldExpbnRDb21tYW5kID0gJ2J1biB3YiBsaW50IC0tcXVpZXQnO1xuICAvLyBObyBzZXBhcmF0ZSB0eXBlY2hlY2sgc3RlcCBuZWVkZWQg4oCUIHRoZSBsaW50IGNvbW1hbmQgYWxyZWFkeSBpbmNsdWRlcyB0eXBlY2hlY2tpbmcuXG4gIGlmIChjb25maWcucmVwb3NpdG9yeT8uc3RhcnRzV2l0aCgnZ2l0aHViOldpbGxCb29zdGVyTGFiLycpKSB7XG4gICAgcmV0dXJuIGBcbiMhL2Jpbi9iYXNoXG5cbmlmIFsgJChnaXQgYnJhbmNoIC0tc2hvdy1jdXJyZW50KSA9IFwibWFpblwiIF0gJiYgWyAkKGdpdCBjb25maWcgdXNlci5lbWFpbCkgIT0gXCJleGthenV1QGdtYWlsLmNvbVwiIF07IHRoZW5cbiAgZWNobyBcIioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlwiXG4gIGVjaG8gXCIqKiogRG9uJ3QgcHVzaCBtYWluIGJyYW5jaCBkaXJlY3RseS4gVXNlIFBSISAqKipcIlxuICBlY2hvIFwiKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXCJcbiAgZXhpdCAxXG5maVxuXG4ke3F1aWV0TGludENvbW1hbmR9XG5gLnRyaW0oKTtcbiAgfVxuICByZXR1cm4gcXVpZXRMaW50Q29tbWFuZDtcbn1cblxuZnVuY3Rpb24gZ2V0UHJlQ29tbWl0Sm9icyhjb25maWc6IFBhY2thZ2VDb25maWcpOiBMZWZ0aG9va0pvYltdIHtcbiAgcmV0dXJuIHByZUNvbW1pdFNldHRpbmdzLmpvYnNcbiAgICAuZmlsdGVyKChqb2IpID0+IGpvYi5uYW1lICE9PSAndmFsaWRhdGUtcmVub3ZhdGUtY29uZmlnJyB8fCBjb25maWcuaXNXaWxsQm9vc3RlckNvbmZpZ3MpXG4gICAgLm1hcCgoam9iKSA9PlxuICAgICAgam9iLm5hbWUgPT09ICdjbGVhbnVwJ1xuICAgICAgICA/IHtcbiAgICAgICAgICAgIC4uLmpvYixcbiAgICAgICAgICAgIGdsb2I6IGdldENsZWFudXBHbG9icyhjb25maWcpLFxuICAgICAgICAgICAgcnVuOiBnZXRDbGVhbnVwQ29tbWFuZChjb25maWcpLFxuICAgICAgICAgIH1cbiAgICAgICAgOiBqb2JcbiAgICApO1xufVxuXG5mdW5jdGlvbiBnZXRDbGVhbnVwR2xvYnMoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogc3RyaW5nIHtcbiAgLy8gTGV0IGB3YiBsaW50IC0tZm9ybWF0YCBkZWNpZGUgd2hldGhlciBQcmV0dGllciBpcyBhdmFpbGFibGU7IHRoZSBob29rXG4gIC8vIHN0aWxsIG5lZWRzIHRvIHRyaWdnZXIgd2hlbiBhZGRpbmcgdGhlIGZpcnN0IHByZXR0aWVyLW9ubHkgZmlsZS5cbiAgY29uc3Qgc3VwcG9ydGVkRXh0ZW5zaW9ucyA9IFsuLi5leHRlbnNpb25zLnByZXR0aWVyT25seV07XG4gIGlmIChkb2VzQ29udGFpbkpzT3JUcyhjb25maWcpKSB7XG4gICAgc3VwcG9ydGVkRXh0ZW5zaW9ucy5wdXNoKC4uLmV4dGVuc2lvbnMub3hmbXQsIC4uLmV4dGVuc2lvbnMub3hsaW50KTtcbiAgfVxuICBpZiAoY29uZmlnLmRvZXNDb250YWluUG9ldHJ5TG9jayB8fCBjb25maWcuZG9lc0NvbnRhaW5VdkxvY2spIHtcbiAgICBzdXBwb3J0ZWRFeHRlbnNpb25zLnB1c2goJ3B5Jyk7XG4gIH1cbiAgaWYgKGNvbmZpZy5kb2VzQ29udGFpblB1YnNwZWNZYW1sKSB7XG4gICAgc3VwcG9ydGVkRXh0ZW5zaW9ucy5wdXNoKCdkYXJ0Jyk7XG4gIH1cbiAgY29uc3QgZmlsdGVyZWRFeHRlbnNpb25zID0gWy4uLm5ldyBTZXQoc3VwcG9ydGVkRXh0ZW5zaW9ucyldLnRvU29ydGVkKCk7XG4gIHJldHVybiBgKiovKi57JHtmaWx0ZXJlZEV4dGVuc2lvbnMuam9pbignLCcpfX1gO1xufVxuXG5mdW5jdGlvbiBnZXRDbGVhbnVwQ29tbWFuZChjb25maWc6IFBhY2thZ2VDb25maWcpOiBzdHJpbmcge1xuICBpZiAoaGFzTG9jYWxXYldvcmtzcGFjZShjb25maWcpKSB7XG4gICAgcmV0dXJuIFN0cmluZy5yYXdgXG5idW4gcnVuIC0tY3dkIHBhY2thZ2VzL3diIHN0YXJ0IC0td29ya2luZy1kaXIgXCIkKGdpdCByZXYtcGFyc2UgLS1zaG93LXRvcGxldmVsKVwiIGxpbnQgLS1maXggLS1mb3JtYXQgLS0ge3N0YWdlZF9maWxlc31cbmAudHJpbSgpO1xuICB9XG4gIC8vIFB5dGhvbi1vbmx5IEJ1biByZXBvcyBpbnN0YWxsIHdiIGZvciBzaGFyZWQgc2NyaXB0cyBidXQgbm90IE94bGludCwgc29cbiAgLy8gc3RhZ2VkLWZpbGUgaG9va3MgbXVzdCB1c2UgdGhlIGxhbmd1YWdlLXNwZWNpZmljIGZvcm1hdHRlciBwYXRoIGJlbG93LlxuICBjb25zdCBjYW5Vc2VXYkZvclN0YWdlZEZpbGVzID0gZG9lc0NvbnRhaW5Kc09yVHMoY29uZmlnKSB8fCBkb2VzQ29udGFpbkphdmEoY29uZmlnKTtcbiAgaWYgKGNhblVzZVdiRm9yU3RhZ2VkRmlsZXMpIHtcbiAgICByZXR1cm4gYFxuYnVuIHdiIGxpbnQgLS1maXggLS1mb3JtYXQgLS0ge3N0YWdlZF9maWxlc31cbmAudHJpbSgpO1xuICB9XG5cbiAgcmV0dXJuIFN0cmluZy5yYXdgXG5wYWNrYWdlX2pzb25fZmlsZXM9XCIkKHByaW50ZiAnJXNcXG4nIHtzdGFnZWRfZmlsZXN9IHwgZ3JlcCAtRSAnKF58LylwYWNrYWdlXFwuanNvbiQnIHx8IHRydWUpXCJcbiR7aGFzUHl0aG9uUGFja2FnZU1hbmFnZXIoY29uZmlnKSA/IFN0cmluZy5yYXdgcHl0aG9uX2ZpbGVzPVwiJChwcmludGYgJyVzXFxuJyB7c3RhZ2VkX2ZpbGVzfSB8IGdyZXAgLUUgJ1xcLnB5JCcgfHwgdHJ1ZSlcImAgOiAnJ31cbiR7Y29uZmlnLmRvZXNDb250YWluUHVic3BlY1lhbWwgPyBTdHJpbmcucmF3YGRhcnRfZmlsZXM9XCIkKHByaW50ZiAnJXNcXG4nIHtzdGFnZWRfZmlsZXN9IHwgZ3JlcCAtRSAnXFwuZGFydCQnIHwgZ3JlcCAtdiAnZ2VuZXJhdGVkJyB8IGdyZXAgLXYgJ1xcLmZyZWV6ZWRcXC5kYXJ0JCcgfCBncmVwIC12ICdcXC5nXFwuZGFydCQnIHx8IHRydWUpXCJgIDogJyd9XG5cbmlmIFsgLW4gXCIkcGFja2FnZV9qc29uX2ZpbGVzXCIgXTsgdGhlblxuICBidW4gc29ydC1wYWNrYWdlLWpzb24gJHBhY2thZ2VfanNvbl9maWxlc1xuZmlcbiR7XG4gIGhhc1B5dGhvblBhY2thZ2VNYW5hZ2VyKGNvbmZpZylcbiAgICA/IGBpZiBbIC1uIFwiJHB5dGhvbl9maWxlc1wiIF07IHRoZW5cbiAgJHtnZXRQeXRob25SdW5uZXIoY29uZmlnKX0gaXNvcnQgLS1wcm9maWxlIGJsYWNrIC0tZmlsdGVyLWZpbGVzICRweXRob25fZmlsZXNcbiAgJHtnZXRQeXRob25SdW5uZXIoY29uZmlnKX0gYmxhY2sgJHB5dGhvbl9maWxlc1xuICAke2dldFB5dGhvblJ1bm5lcihjb25maWcpfSBmbGFrZTggJHB5dGhvbl9maWxlc1xuZmlgXG4gICAgOiAnJ1xufVxuJHtcbiAgY29uZmlnLmRvZXNDb250YWluUHVic3BlY1lhbWxcbiAgICA/IGBpZiBbIC1uIFwiJGRhcnRfZmlsZXNcIiBdOyB0aGVuXG4gIGRhcnQgZm9ybWF0ICRkYXJ0X2ZpbGVzXG5maWBcbiAgICA6ICcnXG59XG5gLnRyaW0oKTtcbn1cblxuZnVuY3Rpb24gaGFzTG9jYWxXYldvcmtzcGFjZShjb25maWc6IFBhY2thZ2VDb25maWcpOiBib29sZWFuIHtcbiAgaWYgKCFjb25maWcuaXNSb290KSByZXR1cm4gZmFsc2U7XG5cbiAgY29uc3QgbG9jYWxXYlBhY2thZ2VKc29uUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJ3BhY2thZ2VzJywgJ3diJywgJ3BhY2thZ2UuanNvbicpO1xuICBpZiAoIWZzLmV4aXN0c1N5bmMobG9jYWxXYlBhY2thZ2VKc29uUGF0aCkpIHJldHVybiBmYWxzZTtcblxuICB0cnkge1xuICAgIGNvbnN0IHBhY2thZ2VKc29uID0gSlNPTi5wYXJzZShmcy5yZWFkRmlsZVN5bmMobG9jYWxXYlBhY2thZ2VKc29uUGF0aCwgJ3V0ZjgnKSkgYXMgeyBuYW1lPzogc3RyaW5nIH07XG4gICAgcmV0dXJuIHBhY2thZ2VKc29uLm5hbWUgPT09ICdAd2lsbGJvb3N0ZXIvd2InO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn1cblxuZnVuY3Rpb24gZ2VuZXJhdGVQb3N0TWVyZ2VDb21tYW5kcyhjb25maWc6IFBhY2thZ2VDb25maWcsIGFsbENvbmZpZ3M6IFBhY2thZ2VDb25maWdbXSk6IHN0cmluZ1tdIHtcbiAgY29uc3QgcG9zdE1lcmdlQ29tbWFuZHM6IHN0cmluZ1tdID0gW107XG4gIGNvbnN0IHRvb2xzQ2hhbmdlZFBhdHRlcm4gPSBTdHJpbmcucmF3YChtaXNlXFwudG9tbHxcXC5taXNlXFwudG9tbClgO1xuICBwb3N0TWVyZ2VDb21tYW5kcy5wdXNoKFN0cmluZy5yYXdgcnVuX2lmX2NoYW5nZWQgXCIke3Rvb2xzQ2hhbmdlZFBhdHRlcm59XCIgXCJtaXNlIGluc3RhbGxcImApO1xuICBjb25zdCBpbnN0YWxsQ29tbWFuZCA9ICdidW4gaW5zdGFsbCc7XG4gIC8vIERvIE5PVCBhZGQgYC52aW5leHRgIGhlcmU6IGl0IGhvbGRzIG9ubHkgdmluZXh0J3MgY29udGVudC1oYXNoZWQgZm9udCBjYWNoZSBhbmQgdGhlIGRldlxuICAvLyBzZXJ2ZXIncyBsb2NrIGZpbGUgKGRlbGV0aW5nIHRoZSBsb2NrIGRpc2FibGVzIHRoZSBkdXBsaWNhdGUtZGV2LXNlcnZlciBndWFyZCBmb3IgYSBydW5uaW5nXG4gIC8vIHNlcnZlcikuIHZpbmV4dCdzIGJ1aWxkIG91dHB1dCBnb2VzIHRvIGBkaXN0L2AsIGFuZCBWaXRlJ3MgZGVwZW5kZW5jeSBjYWNoZSBpcyBoYW5kbGVkIGJ5XG4gIC8vIHRoZSBzZXBhcmF0ZSBpbnN0YWxsLWxheW91dCBob29rIGJlbG93LlxuICAvLyBTY2FuIGV2ZXJ5IHdvcmtzcGFjZSBjb25maWcgKG5vdCBqdXN0IHRoZSByb290KTogaW4gYSBtb25vcmVwbyB0aGUgYXBwIHVzdWFsbHkgbGl2ZXMgaW5cbiAgLy8gcGFja2FnZXMvPGFwcD4gb3IgYXBwcy88YXBwPiwgYW5kIHRoZSBjYWNoZSBkaXJlY3RvcmllcyBhcmUgd29ya3NwYWNlLXJlbGF0aXZlLlxuICBjb25zdCBuZXh0Q2FjaGVEaXJQYXRocyA9IGNvbGxlY3RXb3Jrc3BhY2VSZWxhdGl2ZURpclBhdGhzKFxuICAgIGNvbmZpZyxcbiAgICBhbGxDb25maWdzLFxuICAgICh3b3Jrc3BhY2VDb25maWcpID0+IHdvcmtzcGFjZUNvbmZpZy5kZXBlbmRpbmcuYmxpdHogfHwgd29ya3NwYWNlQ29uZmlnLmRlcGVuZGluZy5uZXh0LFxuICAgICcubmV4dCdcbiAgKTtcbiAgY29uc3Qgcm1OZXh0RGlyZWN0b3JpZXMgPVxuICAgIG5leHRDYWNoZURpclBhdGhzLmxlbmd0aCA+IDAgPyBgICYmIHJtIC1SZiAtLSAke25leHRDYWNoZURpclBhdGhzLm1hcChxdW90ZUZvckV2YWx1YXRlZFNoZWxsKS5qb2luKCcgJyl9YCA6ICcnO1xuICAvLyBCdW4gZG9lcyBub3QgcmVsaW5rIGFuIGV4aXN0aW5nIGlzb2xhdGVkIHRyZWUgd2hlbiBnbG9iYWxTdG9yZS9saW5rZXIgc2V0dGluZ3MgY2hhbmdlLiBJbnNwZWN0XG4gIC8vIHRob3NlIGtleXMgcmF0aGVyIHRoYW4gZXZlcnkgYnVuZmlnIGNoYW5nZTogbWluaW11bVJlbGVhc2VBZ2UgdXBkYXRlcyBtdXN0IG5vdCBkZXN0cm95IGFcbiAgLy8gY29udHJpYnV0b3IncyB3b3JraW5nIGluc3RhbGwgYmVmb3JlIGEgcG90ZW50aWFsbHkgbmV0d29yay1kZXBlbmRlbnQgcmVwbGFjZW1lbnQgc3VjY2VlZHMuXG4gIGNvbnN0IG5vZGVNb2R1bGVzRGlyUGF0aHMgPSBjb2xsZWN0V29ya3NwYWNlUmVsYXRpdmVEaXJQYXRocyhjb25maWcsIGFsbENvbmZpZ3MsICgpID0+IHRydWUsICdub2RlX21vZHVsZXMnKTtcbiAgcG9zdE1lcmdlQ29tbWFuZHMucHVzaChcbiAgICBTdHJpbmcucmF3YGlmIGdpdCBkaWZmIC0tbm8tY29sb3IgLVUwIE9SSUdfSEVBRCBIRUFEIC0tICcqYnVuZmlnLnRvbWwnIHwgZ3JlcCAtLXF1aWV0IC1FICdeWystXSAqKGdsb2JhbFN0b3JlfGxpbmtlcnxwdWJsaWNIb2lzdFBhdHRlcm4pJzsgdGhlbiBybSAtUmYgLS0gJHtub2RlTW9kdWxlc0RpclBhdGhzLm1hcChxdW90ZUZvclNoZWxsKS5qb2luKCcgJyl9OyBmaWBcbiAgKTtcbiAgLy8gYnVuLmxvY2stb25seSBtZXJnZXMgKFJlbm92YXRlIGxvY2tmaWxlIG1haW50ZW5hbmNlKSwgYnVuZmlnLnRvbWwgLyAubnBtcmMgY2hhbmdlcyAobGlua2VyLFxuICAvLyByZWdpc3RyeSwgaG9pc3RpbmcpLCBhbmQgcGF0Y2ggZWRpdHMgYWxsIGNoYW5nZSB0aGUgaW5zdGFsbGVkIHRyZWUgd2l0aG91dCB0b3VjaGluZyBwYWNrYWdlLmpzb24uXG4gIHBvc3RNZXJnZUNvbW1hbmRzLnB1c2goXG4gICAgU3RyaW5nLnJhd2BydW5faWZfY2hhbmdlZCBcIihwYWNrYWdlXFwuanNvbnxidW5cXC5sb2NrfGJ1bmZpZ1xcLnRvbWx8XFwubnBtcmN8cGF0Y2hlcy8pXCIgXCIke2luc3RhbGxDb21tYW5kfSR7cm1OZXh0RGlyZWN0b3JpZXN9XCJgXG4gICk7XG4gIC8vIFZpdGUncyBkZXBlbmRlbmN5IGNhY2hlIGluIG5vZGVfbW9kdWxlcy8udml0ZSBzZWxmLWludmFsaWRhdGVzIG9uIGxvY2tmaWxlIC8gcGF0Y2hlcyAvXG4gIC8vIGNvbmZpZyAvIE5PREVfRU5WIGNoYW5nZXMgKHNlZSBWaXRlJ3MgZGVwIHByZS1idW5kbGluZyBkb2NzKSwgc28gdGhlIHJlc2lkdWFsIHN0YWxlIGNhc2UgaXNcbiAgLy8gaW5zdGFsbC1sYXlvdXQgY2hhbmdlcyAoYnVuZmlnLnRvbWwgbGlua2VyLCAubnBtcmMpOiB0aGV5IGNoYW5nZSB0aGUgaW5zdGFsbGVkIHRyZWUgd2l0aG91dFxuICAvLyB0b3VjaGluZyB0aGUgbG9ja2ZpbGUsIGFuZCB0aGV5IGFyZSBhYnNlbnQgZnJvbSBWaXRlJ3MgY2FjaGUga2V5LlxuICBjb25zdCBybVZpdGVDYWNoZURpcmVjdG9yaWVzID0gY29sbGVjdFdvcmtzcGFjZVJlbGF0aXZlRGlyUGF0aHMoXG4gICAgY29uZmlnLFxuICAgIGFsbENvbmZpZ3MsXG4gICAgKHdvcmtzcGFjZUNvbmZpZykgPT4gd29ya3NwYWNlQ29uZmlnLmRlcGVuZGluZy52aW5leHQgfHwgd29ya3NwYWNlQ29uZmlnLmRlcGVuZGluZy52aXRlLFxuICAgICdub2RlX21vZHVsZXMvLnZpdGUnXG4gICk7XG4gIGlmIChybVZpdGVDYWNoZURpcmVjdG9yaWVzLmxlbmd0aCA+IDApIHtcbiAgICBwb3N0TWVyZ2VDb21tYW5kcy5wdXNoKFxuICAgICAgU3RyaW5nLnJhd2BydW5faWZfY2hhbmdlZCBcIihidW5maWdcXC50b21sfFxcLm5wbXJjKVwiIFwicm0gLVJmIC0tICR7cm1WaXRlQ2FjaGVEaXJlY3Rvcmllcy5tYXAocXVvdGVGb3JFdmFsdWF0ZWRTaGVsbCkuam9pbignICcpfVwiYFxuICAgICk7XG4gIH1cbiAgaWYgKGNvbmZpZy5kb2VzQ29udGFpblBvZXRyeUxvY2spIHtcbiAgICBwb3N0TWVyZ2VDb21tYW5kcy5wdXNoKFN0cmluZy5yYXdgcnVuX2lmX2NoYW5nZWQgXCJwb2V0cnlcXC5sb2NrXCIgXCJwb2V0cnkgaW5zdGFsbFwiYCk7XG4gIH1cbiAgaWYgKGNvbmZpZy5kb2VzQ29udGFpblV2TG9jaykge1xuICAgIHBvc3RNZXJnZUNvbW1hbmRzLnB1c2goU3RyaW5nLnJhd2BydW5faWZfY2hhbmdlZCBcInV2XFwubG9ja1wiIFwidXYgc3luYyAtLWZyb3plblwiYCk7XG4gIH1cbiAgLy8gQmxpdHogcmVwb3NpdG9yaWVzIGRlbGliZXJhdGVseSBnZXQgdGhlIHNhbWUgd2ItZHJpdmVuIHByaXNtYSBjb21tYW5kcyBhcyBldmVyeW9uZSBlbHNlOlxuICAvLyB0aGUgYmxpdHogQ0xJJ3MgY29kZWdlbiBwYXRjaGVzIHRoZSBpbnN0YWxsZWQgbmV4dCBwYWNrYWdlIGluIHBsYWNlLCB3aGljaCBtdXN0IG5ldmVyIHJ1blxuICAvLyB1bmRlciBCdW4ncyBzaGFyZWQgZ2xvYmFsIHN0b3JlLiBZYXJuLWVyYSBCbGl0eiByZXBvcyBnZXQgdGhlaXIgcm91dGUgbWFuaWZlc3QgZnJvbVxuICAvLyBgd2IgZ2VuLWNvZGVgJ3MgYGJsaXR6IGNvZGVnZW5gIHN0ZXAsIGFuZCBjdXJyZW50IHdiIHJvdXRlcyBvbmx5IGB3YiBwcmlzbWEgc2VlZGAgdGhyb3VnaFxuICAvLyB0aGUgYmxpdHogQ0xJLCBvbmx5IGZvciBub24tQnVuIHJlcG9zIChzZWUgcGFja2FnZXMvd2Ivc3JjL3NjcmlwdHMvcHJpc21hU2NyaXB0cy50cyk7IHRoZVxuICAvLyBwb3N0LW1lcmdlIGhvb2tzIHN0YXkgd2ItZHJpdmVuIGJlY2F1c2UgYHByaXNtYSBkZXBsb3lgL2BnZW5lcmF0ZWAgbmVlZCBubyBibGl0eiBsb2FkZXIuXG4gIGlmIChjb25maWcuZGVwZW5kaW5nLnByaXNtYSkge1xuICAgIHBvc3RNZXJnZUNvbW1hbmRzLnB1c2goXG4gICAgICBTdHJpbmcucmF3YHJ1bl9pZl9jaGFuZ2VkIFwiLipcXC5wcmlzbWFcIiBcImJ1biB3YiBwcmlzbWEgZGVwbG95XCJgLFxuICAgICAgU3RyaW5nLnJhd2BydW5faWZfY2hhbmdlZCBcIi4qXFwucHJpc21hXCIgXCJidW4gd2IgcHJpc21hIGdlbmVyYXRlXCJgXG4gICAgKTtcbiAgfVxuICBjb25zdCBnZW5JMThuVHNDb21tYW5kID0gZ2V0R2VuSTE4blRzQ29tbWFuZChjb25maWcsIGNvbmZpZy5wYWNrYWdlSnNvbj8uc2NyaXB0cyk7XG4gIGlmIChnZW5JMThuVHNDb21tYW5kKSB7XG4gICAgLy8gZ2VuLWkxOG4tdHMgb3V0cHV0cyBhcmUgY29tbW9ubHkgaWdub3JlZCwgc28gcG9zdC1tZXJnZSByZWdlbmVyYXRlcyB0aGVtIGFmdGVyIHB1bGxlZCByZXNvdXJjZSBjaGFuZ2VzLlxuICAgIHBvc3RNZXJnZUNvbW1hbmRzLnB1c2goU3RyaW5nLnJhd2BydW5faWZfY2hhbmdlZCBcIihefC8paTE4bi8uKlxcLmpzb24kXCIgXCIke2dlbkkxOG5Uc0NvbW1hbmR9XCJgKTtcbiAgfVxuICByZXR1cm4gcG9zdE1lcmdlQ29tbWFuZHM7XG59XG5cbi8vIFRoZSBnZW5lcmF0ZWQgY29tbWFuZCBwYXNzZXMgdGhyb3VnaCBUV08gc2hlbGwgcGFyc2luZyBzdGFnZXM6IHRoZSBwcmVwYXJlLnNoIGxpbmUgcGFyc2VzIGl0IGFzXG4vLyBhIGRvdWJsZS1xdW90ZWQgYXJndW1lbnQgKHByb2Nlc3NpbmcgXFwsIGAsICQgYW5kIFwiIGltbWVkaWF0ZWx5KSwgYW5kIHJ1bl9pZl9jaGFuZ2VkIHRoZW4gZXZhbCdzXG4vLyBpdCAod29yZC1zcGxpdHRpbmcgYW5kIGdsb2JiaW5nKS4gQW4gdW5xdW90ZWQgcGF0aCBjb250YWluaW5nIHNwYWNlcyAoZS5nLiBgYXBwcy9teSBhcHAvLm5leHRgKVxuLy8gd291bGQgd29yZC1zcGxpdCBpbnRvIHVucmVsYXRlZCBybSB0YXJnZXRzLCBhbmQgYCRgL2JhY2t0aWNrIHdvdWxkIGV4cGFuZCBhdCB0aGUgZmlyc3Qgc3RhZ2UuXG4vLyBTbzogc2luZ2xlLXF1b3RlIGZvciB0aGUgZXZhbCBzdGFnZSwgdGhlbiBiYWNrc2xhc2gtZXNjYXBlIHRoZSBkb3VibGUtcXVvdGUtY29udGV4dCBzcGVjaWFscy5cbmZ1bmN0aW9uIHF1b3RlRm9yRXZhbHVhdGVkU2hlbGwoZmlsZVBhdGg6IHN0cmluZyk6IHN0cmluZyB7XG4gIGNvbnN0IGV2YWxRdW90ZWQgPSBxdW90ZUZvclNoZWxsKGZpbGVQYXRoKTtcbiAgcmV0dXJuIGV2YWxRdW90ZWQucmVwbGFjZUFsbCgvW1xcXFxgJFwiXS9ndSwgU3RyaW5nLnJhd2BcXCQmYCk7XG59XG5cbmZ1bmN0aW9uIHF1b3RlRm9yU2hlbGwoZmlsZVBhdGg6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiBgJyR7ZmlsZVBhdGgucmVwbGFjZUFsbChcIidcIiwgU3RyaW5nLnJhd2AnXFwnJ2ApfSdgO1xufVxuXG4vKipcbiAqIFRoZSB3b3Jrc3BhY2UtcmVsYXRpdmUgZGlyZWN0b3JpZXMgKHJvb3QgZmlyc3QsIGRlZHVwbGljYXRlZCwgYDxzdWJEaXJOYW1lPmAgYXBwZW5kZWQpIG9mIGV2ZXJ5XG4gKiB3b3Jrc3BhY2Ugd2hvc2UgY29uZmlnIG1hdGNoZXMgdGhlIHByZWRpY2F0ZS4gVGhlIGhvb2sgc2NyaXB0IHJ1bnMgYXQgdGhlIHJlcG9zaXRvcnkgcm9vdCwgc29cbiAqIHBhdGhzIGFyZSByZWxhdGl2ZSB0byB0aGUgcm9vdCBjb25maWcncyBkaXJlY3RvcnkuXG4gKi9cbmZ1bmN0aW9uIGNvbGxlY3RXb3Jrc3BhY2VSZWxhdGl2ZURpclBhdGhzKFxuICByb290Q29uZmlnOiBQYWNrYWdlQ29uZmlnLFxuICBhbGxDb25maWdzOiBQYWNrYWdlQ29uZmlnW10sXG4gIHByZWRpY2F0ZTogKGNvbmZpZzogUGFja2FnZUNvbmZpZykgPT4gYm9vbGVhbixcbiAgc3ViRGlyTmFtZTogc3RyaW5nXG4pOiBzdHJpbmdbXSB7XG4gIHJldHVybiBbXG4gICAgLi4ubmV3IFNldChcbiAgICAgIGFsbENvbmZpZ3NcbiAgICAgICAgLmZpbHRlcigoY29uZmlnKSA9PiBwcmVkaWNhdGUoY29uZmlnKSlcbiAgICAgICAgLm1hcCgoY29uZmlnKSA9PiB7XG4gICAgICAgICAgY29uc3QgcmVsYXRpdmVEaXJQYXRoID0gcGF0aC5yZWxhdGl2ZShyb290Q29uZmlnLmRpclBhdGgsIGNvbmZpZy5kaXJQYXRoKS5yZXBsYWNlQWxsKCdcXFxcJywgJy8nKTtcbiAgICAgICAgICByZXR1cm4gcmVsYXRpdmVEaXJQYXRoID8gcGF0aC5wb3NpeC5qb2luKHJlbGF0aXZlRGlyUGF0aCwgc3ViRGlyTmFtZSkgOiBzdWJEaXJOYW1lO1xuICAgICAgICB9KVxuICAgICksXG4gIF0udG9Tb3J0ZWQoKTtcbn1cblxuZnVuY3Rpb24gaGFzUHl0aG9uUGFja2FnZU1hbmFnZXIoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogYm9vbGVhbiB7XG4gIHJldHVybiBjb25maWcuZG9lc0NvbnRhaW5Qb2V0cnlMb2NrIHx8IGNvbmZpZy5kb2VzQ29udGFpblV2TG9jaztcbn1cblxuZnVuY3Rpb24gZ2V0UHl0aG9uUnVubmVyKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6ICdwb2V0cnkgcnVuJyB8ICd1diBydW4nIHtcbiAgcmV0dXJuIGNvbmZpZy5kb2VzQ29udGFpblV2TG9jayA/ICd1diBydW4nIDogJ3BvZXRyeSBydW4nO1xufVxuIiwiZXhwb3J0IGZ1bmN0aW9uIG5vcm1hbGl6ZUNvbmZpZ0NvbnRlbnQoY29udGVudDogc3RyaW5nIHwgdW5kZWZpbmVkKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgcmV0dXJuIGNvbnRlbnQ/LnRyaW0oKTtcbn1cbiIsImltcG9ydCB7IGVzY2FwZVJlZ0V4cCB9IGZyb20gJy4uL3V0aWxzL3N0cmluZ1V0aWwuanMnO1xuXG5leHBvcnQgdHlwZSBDb25maWdCbG9ja05hbWUgPSAnYmFzZScgfCAnZXhwb3J0JztcblxuaW50ZXJmYWNlIE1hbmFnZWRDb25maWdCbG9ja3NPcHRpb25zIHtcbiAgYmxvY2tOYW1lczogcmVhZG9ubHkgQ29uZmlnQmxvY2tOYW1lW107XG4gIG1hcmtlclByZWZpeDogc3RyaW5nO1xuICB0b29sTmFtZTogc3RyaW5nO1xufVxuXG5pbnRlcmZhY2UgR2V0Q29uZmlnQ29udGVudE9wdGlvbnMge1xuICBkZXNpcmVkQ29udGVudDogc3RyaW5nO1xuICBleGlzdGluZ0NvbnRlbnQ6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgZmlsZVBhdGg6IHN0cmluZztcbn1cblxuZXhwb3J0IGNsYXNzIE1hbmFnZWRDb25maWdCbG9ja3Mge1xuICBwcml2YXRlIHJlYWRvbmx5IGJsb2NrTmFtZXM6IHJlYWRvbmx5IENvbmZpZ0Jsb2NrTmFtZVtdO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgbWFya2VyUHJlZml4OiBzdHJpbmc7XG5cbiAgcHJpdmF0ZSByZWFkb25seSB0b29sTmFtZTogc3RyaW5nO1xuXG4gIGNvbnN0cnVjdG9yKG9wdGlvbnM6IE1hbmFnZWRDb25maWdCbG9ja3NPcHRpb25zKSB7XG4gICAgdGhpcy5ibG9ja05hbWVzID0gb3B0aW9ucy5ibG9ja05hbWVzO1xuICAgIHRoaXMubWFya2VyUHJlZml4ID0gb3B0aW9ucy5tYXJrZXJQcmVmaXg7XG4gICAgdGhpcy50b29sTmFtZSA9IG9wdGlvbnMudG9vbE5hbWU7XG4gIH1cblxuICBnZXRDb25maWdDb250ZW50KG9wdGlvbnM6IEdldENvbmZpZ0NvbnRlbnRPcHRpb25zKTogc3RyaW5nIHtcbiAgICBpZiAoIW9wdGlvbnMuZXhpc3RpbmdDb250ZW50KSByZXR1cm4gb3B0aW9ucy5kZXNpcmVkQ29udGVudDtcbiAgICBpZiAodGhpcy5oYXNNYW5hZ2VkQmxvY2tzKG9wdGlvbnMuZXhpc3RpbmdDb250ZW50KSkge1xuICAgICAgcmV0dXJuIHRoaXMucmVwbGFjZU1hbmFnZWRCbG9ja3Mob3B0aW9ucy5leGlzdGluZ0NvbnRlbnQsIG9wdGlvbnMuZGVzaXJlZENvbnRlbnQsIG9wdGlvbnMuZmlsZVBhdGgpO1xuICAgIH1cbiAgICByZXR1cm4gb3B0aW9ucy5kZXNpcmVkQ29udGVudDtcbiAgfVxuXG4gIGdldEJsb2NrKGJsb2NrTmFtZTogQ29uZmlnQmxvY2tOYW1lLCBjb250ZW50OiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIHJldHVybiBgJHt0aGlzLmdldFN0YXJ0TWFya2VyKGJsb2NrTmFtZSl9XG4ke2NvbnRlbnR9XG4ke3RoaXMuZ2V0RW5kTWFya2VyKGJsb2NrTmFtZSl9YDtcbiAgfVxuXG4gIGhhc01hbmFnZWRCbG9ja3MoY29udGVudDogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuYmxvY2tOYW1lcy5zb21lKChibG9ja05hbWUpID0+IGNvbnRlbnQuaW5jbHVkZXModGhpcy5nZXRTdGFydE1hcmtlcihibG9ja05hbWUpKSk7XG4gIH1cblxuICBwcml2YXRlIHJlcGxhY2VNYW5hZ2VkQmxvY2tzKGV4aXN0aW5nQ29udGVudDogc3RyaW5nLCBkZXNpcmVkQ29udGVudDogc3RyaW5nLCBmaWxlUGF0aDogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBsZXQgY29udGVudCA9IGV4aXN0aW5nQ29udGVudDtcbiAgICBmb3IgKGNvbnN0IGJsb2NrTmFtZSBvZiB0aGlzLmJsb2NrTmFtZXMpIHtcbiAgICAgIGNvbnN0IHJlcGxhY2VtZW50ID0gdGhpcy5leHRyYWN0TWFuYWdlZEJsb2NrKGRlc2lyZWRDb250ZW50LCBibG9ja05hbWUpO1xuICAgICAgaWYgKCFyZXBsYWNlbWVudCkgY29udGludWU7XG5cbiAgICAgIGNvbnN0IG5leHRDb250ZW50ID0gdGhpcy5yZXBsYWNlTWFuYWdlZEJsb2NrKGNvbnRlbnQsIGJsb2NrTmFtZSwgcmVwbGFjZW1lbnQpO1xuICAgICAgaWYgKCFuZXh0Q29udGVudCkge1xuICAgICAgICBjb25zb2xlLndhcm4oYFNraXBwZWQgdXBkYXRpbmcgaW5jb21wbGV0ZSAke2Jsb2NrTmFtZX0gYmxvY2sgaW4gJHt0aGlzLnRvb2xOYW1lfSBjb25maWc6ICR7ZmlsZVBhdGh9YCk7XG4gICAgICAgIHJldHVybiBleGlzdGluZ0NvbnRlbnQ7XG4gICAgICB9XG4gICAgICBjb250ZW50ID0gbmV4dENvbnRlbnQ7XG4gICAgfVxuICAgIHJldHVybiBjb250ZW50O1xuICB9XG5cbiAgcHJpdmF0ZSBleHRyYWN0TWFuYWdlZEJsb2NrKGNvbnRlbnQ6IHN0cmluZywgYmxvY2tOYW1lOiBDb25maWdCbG9ja05hbWUpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLmdldE1hbmFnZWRCbG9ja1JlZ0V4cChibG9ja05hbWUpLmV4ZWMoY29udGVudCk/LlswXTtcbiAgfVxuXG4gIHByaXZhdGUgcmVwbGFjZU1hbmFnZWRCbG9jayhjb250ZW50OiBzdHJpbmcsIGJsb2NrTmFtZTogQ29uZmlnQmxvY2tOYW1lLCByZXBsYWNlbWVudDogc3RyaW5nKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICBjb25zdCBwYXR0ZXJuID0gdGhpcy5nZXRNYW5hZ2VkQmxvY2tSZWdFeHAoYmxvY2tOYW1lKTtcbiAgICBpZiAoIXBhdHRlcm4udGVzdChjb250ZW50KSkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICByZXR1cm4gY29udGVudC5yZXBsYWNlKHBhdHRlcm4sIHJlcGxhY2VtZW50KTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0TWFuYWdlZEJsb2NrUmVnRXhwKGJsb2NrTmFtZTogQ29uZmlnQmxvY2tOYW1lKTogUmVnRXhwIHtcbiAgICByZXR1cm4gbmV3IFJlZ0V4cChcbiAgICAgIGAke2VzY2FwZVJlZ0V4cCh0aGlzLmdldFN0YXJ0TWFya2VyKGJsb2NrTmFtZSkpfVtcXFxcc1xcXFxTXSo/JHtlc2NhcGVSZWdFeHAodGhpcy5nZXRFbmRNYXJrZXIoYmxvY2tOYW1lKSl9YFxuICAgICk7XG4gIH1cblxuICBwcml2YXRlIGdldFN0YXJ0TWFya2VyKGJsb2NrTmFtZTogQ29uZmlnQmxvY2tOYW1lKTogc3RyaW5nIHtcbiAgICByZXR1cm4gYC8vIHdiZnk6c3RhcnQgJHt0aGlzLm1hcmtlclByZWZpeH0tJHtibG9ja05hbWV9YDtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0RW5kTWFya2VyKGJsb2NrTmFtZTogQ29uZmlnQmxvY2tOYW1lKTogc3RyaW5nIHtcbiAgICByZXR1cm4gYC8vIHdiZnk6ZW5kICR7dGhpcy5tYXJrZXJQcmVmaXh9LSR7YmxvY2tOYW1lfWA7XG4gIH1cbn1cbiIsImltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGZzVXRpbCB9IGZyb20gJy4uL3V0aWxzL2ZzVXRpbC5qcyc7XG5pbXBvcnQgeyByZXNvbHZlV2lsbGJvb3N0ZXJDb25maWdNb2R1bGUgfSBmcm9tICcuLi91dGlscy93aWxsYm9vc3RlckNvbmZpZ3NVdGlsLmpzJztcblxuaW1wb3J0IHsgbm9ybWFsaXplQ29uZmlnQ29udGVudCB9IGZyb20gJy4vY29uZmlnQ29udGVudC5qcyc7XG5pbXBvcnQgeyBNYW5hZ2VkQ29uZmlnQmxvY2tzIH0gZnJvbSAnLi9tYW5hZ2VkQ29uZmlnQmxvY2suanMnO1xuXG5jb25zdCBtYW5hZ2VkQ29uZmlnQmxvY2tzID0gbmV3IE1hbmFnZWRDb25maWdCbG9ja3Moe1xuICBibG9ja05hbWVzOiBbJ2Jhc2UnLCAnZXhwb3J0J10sXG4gIG1hcmtlclByZWZpeDogJ294Zm10JyxcbiAgdG9vbE5hbWU6ICdveGZtdCcsXG59KTtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlT3hmbXRDb25maWcoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZ2VuZXJhdGVPeGZtdENvbmZpZycsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJ294Zm10LmNvbmZpZy50cycpO1xuICAgIGNvbnN0IGV4aXN0aW5nQ29udGVudCA9IGF3YWl0IGZzVXRpbC5yZWFkRmlsZUlmRXhpc3RzKGZpbGVQYXRoKTtcbiAgICBjb25zdCBkZXNpcmVkQ29udGVudCA9IG1hbmFnZWRDb25maWdCbG9ja3MuZ2V0Q29uZmlnQ29udGVudCh7XG4gICAgICBkZXNpcmVkQ29udGVudDogZ2V0Q29uZmlnQ29udGVudChjb25maWcpLFxuICAgICAgZXhpc3RpbmdDb250ZW50LFxuICAgICAgZmlsZVBhdGgsXG4gICAgfSk7XG4gICAgaWYgKG5vcm1hbGl6ZUNvbmZpZ0NvbnRlbnQoZXhpc3RpbmdDb250ZW50KSAhPT0gbm9ybWFsaXplQ29uZmlnQ29udGVudChkZXNpcmVkQ29udGVudCkpIHtcbiAgICAgIGF3YWl0IGZzVXRpbC5nZW5lcmF0ZUZpbGUoZmlsZVBhdGgsIGRlc2lyZWRDb250ZW50KTtcbiAgICB9XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBnZXRDb25maWdDb250ZW50KGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IHN0cmluZyB7XG4gIGNvbnN0IG94Zm10QmFzZUNvbmZpZ01vZHVsZSA9IHJlc29sdmVXaWxsYm9vc3RlckNvbmZpZ01vZHVsZShjb25maWcsICdAd2lsbGJvb3N0ZXIvb3hmbXQtY29uZmlnJyk7XG5cbiAgLy8gQ29tbW9uSlMgcGFja2FnZXMgbmVlZCByZXF1aXJlL21vZHVsZS5leHBvcnRzIGhlcmU6IG94Zm10IGNvbmZpZyBmaWxlcyBhcmVcbiAgLy8gb25seSBhdXRvLWRpc2NvdmVyZWQgYXMgLnRzLCBhbmQgdGhlIHNoYXJlZCBjb25maWcgcGFja2FnZSBpcyBFU00tb25seS5cbiAgLy8gTm8gLy8vIDxyZWZlcmVuY2UgdHlwZXM+IGxpbmU6IHRoZSB3YmZ5LWdlbmVyYXRlZCB0c2NvbmZpZyBhbHJlYWR5IGNvdmVycyAqLmNvbmZpZy50cyB3aXRoXG4gIC8vIHR5cGVzIFtcImJ1blwiXSwgd2hpY2ggdHlwZXMgcmVxdWlyZS9tb2R1bGUuZXhwb3J0cywgd2hpbGUgYSBcIm5vZGVcIiByZWZlcmVuY2UgYnJlYWtzIHVuZGVyXG4gIC8vIEJ1bidzIGlzb2xhdGVkIGxpbmtlciB3aGVyZSB0aGUgdW5kZWNsYXJlZCBAdHlwZXMvbm9kZSBpcyB1bnJlc29sdmFibGUgKFRTMjY4OCkuXG4gIGlmICghY29uZmlnLmlzRXNtUGFja2FnZSkge1xuICAgIHJldHVybiBgJHttYW5hZ2VkQ29uZmlnQmxvY2tzLmdldEJsb2NrKFxuICAgICAgJ2Jhc2UnLFxuICAgICAgYGltcG9ydCB0eXBlIHsgT3hmbXRDb25maWcgfSBmcm9tICdveGZtdCc7XG5cbi8vIG94bGludC1kaXNhYmxlIHVuaWNvcm4vcHJlZmVyLW1vZHVsZSAtLSBPeGZtdCBjb25maWcgZmlsZXMgYXJlIG9ubHkgYXV0by1kaXNjb3ZlcmVkIGFzIC50cywgYW5kIENvbW1vbkpTIGF2b2lkcyBFU00gcGFja2FnZSBsb2FkaW5nIGlzc3Vlcy5cbmNvbnN0IG94Zm10Q29uZmlnID0gcmVxdWlyZSgnJHtveGZtdEJhc2VDb25maWdNb2R1bGV9Jyk7XG5cbmNvbnN0IG94Zm10UmVzb2x2ZWRDb25maWc6IE94Zm10Q29uZmlnID0gb3hmbXRDb25maWcuZGVmYXVsdCA/PyBveGZtdENvbmZpZztgXG4gICAgKX1cblxuJHttYW5hZ2VkQ29uZmlnQmxvY2tzLmdldEJsb2NrKCdleHBvcnQnLCAnbW9kdWxlLmV4cG9ydHMgPSBveGZtdFJlc29sdmVkQ29uZmlnOycpfVxuYDtcbiAgfVxuXG4gIHJldHVybiBgJHttYW5hZ2VkQ29uZmlnQmxvY2tzLmdldEJsb2NrKFxuICAgICdiYXNlJyxcbiAgICBgaW1wb3J0IHR5cGUgeyBPeGZtdENvbmZpZyB9IGZyb20gJ294Zm10JztcblxuaW1wb3J0IGNvbmZpZyBmcm9tICcke294Zm10QmFzZUNvbmZpZ01vZHVsZX0nO1xuXG5jb25zdCBveGZtdFJlc29sdmVkQ29uZmlnOiBPeGZtdENvbmZpZyA9IGNvbmZpZztgXG4gICl9XG5cbiR7bWFuYWdlZENvbmZpZ0Jsb2Nrcy5nZXRCbG9jaygnZXhwb3J0JywgJ2V4cG9ydCBkZWZhdWx0IG94Zm10UmVzb2x2ZWRDb25maWc7Jyl9XG5gO1xufVxuIiwiaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZnNVdGlsIH0gZnJvbSAnLi4vdXRpbHMvZnNVdGlsLmpzJztcbmltcG9ydCB7XG4gIGlzUHVibGlzaGVkV2lsbGJvb3N0ZXJDb25maWdzUGFja2FnZSxcbiAgcmVzb2x2ZVdpbGxib29zdGVyQ29uZmlnTW9kdWxlLFxufSBmcm9tICcuLi91dGlscy93aWxsYm9vc3RlckNvbmZpZ3NVdGlsLmpzJztcblxuaW1wb3J0IHsgbm9ybWFsaXplQ29uZmlnQ29udGVudCB9IGZyb20gJy4vY29uZmlnQ29udGVudC5qcyc7XG5pbXBvcnQgeyBNYW5hZ2VkQ29uZmlnQmxvY2tzIH0gZnJvbSAnLi9tYW5hZ2VkQ29uZmlnQmxvY2suanMnO1xuXG5jb25zdCBtYW5hZ2VkQ29uZmlnQmxvY2tzID0gbmV3IE1hbmFnZWRDb25maWdCbG9ja3Moe1xuICBibG9ja05hbWVzOiBbJ2Jhc2UnLCAnZXhwb3J0J10sXG4gIG1hcmtlclByZWZpeDogJ294bGludCcsXG4gIHRvb2xOYW1lOiAnb3hsaW50Jyxcbn0pO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVPeGxpbnRDb25maWcoY29uZmlnOiBQYWNrYWdlQ29uZmlnLCBfcm9vdENvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2dlbmVyYXRlT3hsaW50Q29uZmlnJywgYXN5bmMgKCkgPT4ge1xuICAgIC8vIHdpbGxib29zdGVyLWNvbmZpZ3MgcHVibGlzaGVzIGNvbmZpZyBmaWxlcyBhcyBwcm9kdWN0IGNvZGUsIHNvIGdlbmVyYXRpb25cbiAgICAvLyBtdXN0IG5vdCByZXBsYWNlIHBhY2thZ2UtcHJvdmlkZWQgbGludGVyIHNldHRpbmdzLiBHZW5lcmF0ZWQgZmlsZXMgd2l0aFxuICAgIC8vIG1hbmFnZWQgYmxvY2tzIGFyZSBzdGlsbCBzYWZlIHRvIHVwZGF0ZS5cbiAgICBjb25zdCBzaG91bGRQcmVzZXJ2ZVB1Ymxpc2hlZExpbnRlckNvbmZpZyA9IGlzUHVibGlzaGVkV2lsbGJvb3N0ZXJDb25maWdzUGFja2FnZShjb25maWcpO1xuICAgIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnb3hsaW50LmNvbmZpZy50cycpO1xuICAgIGNvbnN0IGV4aXN0aW5nQ29udGVudCA9IGF3YWl0IGZzVXRpbC5yZWFkRmlsZUlmRXhpc3RzKGZpbGVQYXRoKTtcbiAgICBjb25zdCBzaG91bGRQcmVzZXJ2ZUV4aXN0aW5nQ29udGVudCA9XG4gICAgICBzaG91bGRQcmVzZXJ2ZVB1Ymxpc2hlZExpbnRlckNvbmZpZyAmJiBleGlzdGluZ0NvbnRlbnQgJiYgIW1hbmFnZWRDb25maWdCbG9ja3MuaGFzTWFuYWdlZEJsb2NrcyhleGlzdGluZ0NvbnRlbnQpO1xuICAgIGNvbnN0IGRlc2lyZWRDb250ZW50ID0gc2hvdWxkUHJlc2VydmVFeGlzdGluZ0NvbnRlbnRcbiAgICAgID8gZXhpc3RpbmdDb250ZW50XG4gICAgICA6IG1hbmFnZWRDb25maWdCbG9ja3MuZ2V0Q29uZmlnQ29udGVudCh7XG4gICAgICAgICAgZGVzaXJlZENvbnRlbnQ6IGdldENvbmZpZ0NvbnRlbnQoY29uZmlnKSxcbiAgICAgICAgICBleGlzdGluZ0NvbnRlbnQsXG4gICAgICAgICAgZmlsZVBhdGgsXG4gICAgICAgIH0pO1xuXG4gICAgaWYgKG5vcm1hbGl6ZUNvbmZpZ0NvbnRlbnQoZXhpc3RpbmdDb250ZW50KSAhPT0gbm9ybWFsaXplQ29uZmlnQ29udGVudChkZXNpcmVkQ29udGVudCkpIHtcbiAgICAgIGF3YWl0IGZzVXRpbC5nZW5lcmF0ZUZpbGUoZmlsZVBhdGgsIGRlc2lyZWRDb250ZW50KTtcbiAgICB9XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBnZXRDb25maWdDb250ZW50KGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IHN0cmluZyB7XG4gIGNvbnN0IGlzUm9vdENvbmZpZyA9IGNvbmZpZy5pc1Jvb3Q7XG4gIGNvbnN0IG94bGludEJhc2VDb25maWdNb2R1bGUgPSByZXNvbHZlV2lsbGJvb3N0ZXJDb25maWdNb2R1bGUoY29uZmlnLCAnQHdpbGxib29zdGVyL294bGludC1jb25maWcnKTtcblxuICAvLyBEbyBub3QgY29sbGFwc2UgdGhpcyB0byBhIHN0YXRpYyBpbXBvcnQgZm9yIGV2ZXJ5IHBhY2thZ2UuIENvbW1vbkpTIHBhY2thZ2VzXG4gIC8vIHR5cGUtY2hlY2sgYXV0by1kaXNjb3ZlcmVkIG94bGludC5jb25maWcudHMgYXMgQ29tbW9uSlMsIHNvIGltcG9ydGluZyB0aGUgRVNNXG4gIC8vIEB3aWxsYm9vc3Rlci9veGxpbnQtY29uZmlnIHBhY2thZ2UgdHJpZ2dlcnMgVFMxNDc5LiBLZWVwIHRoaXMgaW4gc3luYyB3aXRoXG4gIC8vIGxpdGVyYWN5LXRlc3QncyBnZW5lcmF0ZWQgY29uZmlnIHBhdHRlcm4uXG4gIC8vIE5vIC8vLyA8cmVmZXJlbmNlIHR5cGVzPiBsaW5lOiB0aGUgd2JmeS1nZW5lcmF0ZWQgdHNjb25maWcgYWxyZWFkeSBjb3ZlcnMgKi5jb25maWcudHMgd2l0aFxuICAvLyB0eXBlcyBbXCJidW5cIl0sIHdoaWNoIHR5cGVzIHJlcXVpcmUvbW9kdWxlLmV4cG9ydHMsIHdoaWxlIGEgXCJub2RlXCIgcmVmZXJlbmNlIGJyZWFrcyB1bmRlclxuICAvLyBCdW4ncyBpc29sYXRlZCBsaW5rZXIgd2hlcmUgdGhlIHVuZGVjbGFyZWQgQHR5cGVzL25vZGUgaXMgdW5yZXNvbHZhYmxlIChUUzI2ODgpLlxuICBpZiAoIWNvbmZpZy5pc0VzbVBhY2thZ2UpIHtcbiAgICByZXR1cm4gYCR7bWFuYWdlZENvbmZpZ0Jsb2Nrcy5nZXRCbG9jayhcbiAgICAgICdiYXNlJyxcbiAgICAgIGBpbXBvcnQgdHlwZSB7IE94bGludENvbmZpZyB9IGZyb20gJ294bGludCc7XG5cbi8vIG94bGludC1kaXNhYmxlIHVuaWNvcm4vcHJlZmVyLW1vZHVsZSAtLSBPeGxpbnQgb25seSBhdXRvLWRpc2NvdmVycyAudHMgY29uZmlnIGZpbGVzLCBhbmQgQ29tbW9uSlMgYXZvaWRzIEVTTSBwYWNrYWdlIGxvYWRpbmcgaXNzdWVzLlxuY29uc3Qgb3hsaW50QmFzZUNvbmZpZyA9IHJlcXVpcmUoJyR7b3hsaW50QmFzZUNvbmZpZ01vZHVsZX0nKTtcblxuJHtnZXRSZXNvbHZlZENvbmZpZ0NvbnRlbnQoJ294bGludEJhc2VDb25maWcuZGVmYXVsdCA/PyBveGxpbnRCYXNlQ29uZmlnJywgaXNSb290Q29uZmlnKX1gXG4gICAgKX1cblxuJHttYW5hZ2VkQ29uZmlnQmxvY2tzLmdldEJsb2NrKCdleHBvcnQnLCAnbW9kdWxlLmV4cG9ydHMgPSBveGxpbnRSZXNvbHZlZENvbmZpZzsnKX1cbmA7XG4gIH1cblxuICByZXR1cm4gYCR7bWFuYWdlZENvbmZpZ0Jsb2Nrcy5nZXRCbG9jayhcbiAgICAnYmFzZScsXG4gICAgYGltcG9ydCB0eXBlIHsgT3hsaW50Q29uZmlnIH0gZnJvbSAnb3hsaW50JztcblxuaW1wb3J0IG94bGludEJhc2VDb25maWcgZnJvbSAnJHtveGxpbnRCYXNlQ29uZmlnTW9kdWxlfSc7XG5cbiR7Z2V0UmVzb2x2ZWRDb25maWdDb250ZW50KCdveGxpbnRCYXNlQ29uZmlnJywgaXNSb290Q29uZmlnKX1gXG4gICl9XG5cbiR7bWFuYWdlZENvbmZpZ0Jsb2Nrcy5nZXRCbG9jaygnZXhwb3J0JywgJ2V4cG9ydCBkZWZhdWx0IG94bGludFJlc29sdmVkQ29uZmlnOycpfVxuYDtcbn1cblxuLy8gc3RydWN0dXJlZENsb25lIGtlZXBzIGEgcGFja2FnZS1sb2NhbCBjb3B5IHNvIHJlcG9zaXRvcmllcyBjYW4gYWRkIHNldHRpbmdzIG91dHNpZGUgbWFuYWdlZFxuLy8gYmxvY2tzIHdpdGhvdXQgbXV0YXRpbmcgdGhlIHNoYXJlZCBpbXBvcnRlZCBjb25maWcgb2JqZWN0LiBUaGUgcm9vdCBjb25maWcgZm9yY2VzIHRoZSB0eXBlLWF3YXJlXG4vLyBvcHRpb25zIG9uIGluc2lkZSB0aGUgbWFuYWdlZCBibG9jayBzbyBubyBjdXN0b21pemF0aW9uIGNhbiBzaWxlbnRseSBkaXNhYmxlIHR5cGUgY2hlY2tpbmc7IGV2ZXJ5XG4vLyBvdGhlciBjb25maWcgZGVsZXRlcyB0aGVtIGJlY2F1c2UgT3hsaW50IHJlamVjdHMgdGhvc2Ugcm9vdC1vbmx5IG9wdGlvbnMgZWxzZXdoZXJlICh0eXBlIGNoZWNraW5nXG4vLyBzdXJ2aXZlczogdGhlIGxpbnQgY29tbWFuZHMgcGFzcyAtLXR5cGUtYXdhcmUgYW5kIC0tdHlwZS1jaGVjayBleHBsaWNpdGx5KS5cbmZ1bmN0aW9uIGdldFJlc29sdmVkQ29uZmlnQ29udGVudChiYXNlQ29uZmlnTmFtZTogc3RyaW5nLCBpc1Jvb3RDb25maWc6IGJvb2xlYW4pOiBzdHJpbmcge1xuICBpZiAoaXNSb290Q29uZmlnKSB7XG4gICAgcmV0dXJuIGBjb25zdCBveGxpbnRSZXNvbHZlZENvbmZpZzogT3hsaW50Q29uZmlnID0gc3RydWN0dXJlZENsb25lKCR7YmFzZUNvbmZpZ05hbWV9KTtcbm94bGludFJlc29sdmVkQ29uZmlnLm9wdGlvbnMgPSB7IC4uLm94bGludFJlc29sdmVkQ29uZmlnLm9wdGlvbnMsIHR5cGVBd2FyZTogdHJ1ZSwgdHlwZUNoZWNrOiB0cnVlIH07YDtcbiAgfVxuXG4gIHJldHVybiBgY29uc3Qgb3hsaW50UmVzb2x2ZWRDb25maWc6IE94bGludENvbmZpZyA9IHN0cnVjdHVyZWRDbG9uZSgke2Jhc2VDb25maWdOYW1lfSk7XG5kZWxldGUgb3hsaW50UmVzb2x2ZWRDb25maWcub3B0aW9ucztgO1xufVxuIiwiaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZnNVdGlsIH0gZnJvbSAnLi4vdXRpbHMvZnNVdGlsLmpzJztcbmltcG9ydCB7IGlnbm9yZUZpbGVVdGlsIH0gZnJvbSAnLi4vdXRpbHMvaWdub3JlRmlsZVV0aWwuanMnO1xuaW1wb3J0IHsgcHJvbWlzZVBvb2wgfSBmcm9tICcuLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5cbmNvbnN0IGNvbW1vbkNvbnRlbnQgPSBgXG4zcmQtcGFydHkvXG5hbmRyb2lkL1xuaW9zL1xubm8tZm9ybWF0L1xudGVzdC1maXh0dXJlcy9cbnRlc3QvZml4dHVyZXMvXG4qLmQudHNcbioubWluLmpzXG4ueWFybi9cbi5wbnAuanNcbmA7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZW5lcmF0ZVByZXR0aWVyaWdub3JlKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2dlbmVyYXRlUHJldHRpZXJpZ25vcmUnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICcucHJldHRpZXJpZ25vcmUnKTtcbiAgICBjb25zdCBjb250ZW50ID0gKGF3YWl0IGZzVXRpbC5yZWFkRmlsZUlmRXhpc3RzKGZpbGVQYXRoKSkgPz8gJyc7XG4gICAgY29uc3QgaGVhZFVzZXJDb250ZW50ID0gaWdub3JlRmlsZVV0aWwuZ2V0SGVhZFVzZXJDb250ZW50KGNvbnRlbnQpO1xuICAgIGNvbnN0IHRhaWxVc2VyQ29udGVudCA9IGlnbm9yZUZpbGVVdGlsLmdldFRhaWxVc2VyQ29udGVudChjb250ZW50KTtcblxuICAgIGNvbnN0IGdpdGlnbm9yZUZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnLmdpdGlnbm9yZScpO1xuICAgIGNvbnN0IGdpdGlnbm9yZUNvbnRlbnQgPSAoYXdhaXQgaWdub3JlRmlsZVV0aWwucmVhZEdpdGlnbm9yZVdpdGhvdXRTZXBhcmF0b3JzKGdpdGlnbm9yZUZpbGVQYXRoKSkgfHwgJyc7XG5cbiAgICBsZXQgYWRkaXRpb25hbENvbnRlbnQgPSAnJztcbiAgICBpZiAoY29uZmlnLmRvZXNDb250YWluUHVic3BlY1lhbWwpIHtcbiAgICAgIGFkZGl0aW9uYWxDb250ZW50ID0gYFxuYW5kcm9pZC9hcHAvXG5pb3MvUnVubmVyL0Fzc2V0cy54Y2Fzc2V0cy9cbnB1YnNwZWMueWFtbFxuYDtcbiAgICB9XG5cbiAgICBjb25zdCBuZXdDb250ZW50ID0gaGVhZFVzZXJDb250ZW50ICsgY29tbW9uQ29udGVudCArIGFkZGl0aW9uYWxDb250ZW50ICsgZ2l0aWdub3JlQ29udGVudCArIHRhaWxVc2VyQ29udGVudDtcbiAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnNVdGlsLmdlbmVyYXRlRmlsZShmaWxlUGF0aCwgbmV3Q29udGVudCkpO1xuICB9KTtcbn1cbiIsImltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCBtZXJnZSBmcm9tICdkZWVwbWVyZ2UnO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBmc1V0aWwgfSBmcm9tICcuLi91dGlscy9mc1V0aWwuanMnO1xuaW1wb3J0IHsganNvbmNVdGlsIH0gZnJvbSAnLi4vdXRpbHMvanNvbmNVdGlsLmpzJztcbmltcG9ydCB7IG92ZXJ3cml0ZU1lcmdlIH0gZnJvbSAnLi4vdXRpbHMvbWVyZ2VVdGlsLmpzJztcbmltcG9ydCB7IHNvcnRLZXlzIH0gZnJvbSAnLi4vdXRpbHMvb2JqZWN0VXRpbC5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcblxuY29uc3QganNvbk9iaiA9IHtcbiAgdmVudlBhdGg6ICcuJyxcbiAgdmVudjogJy52ZW52Jyxcbn07XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZW5lcmF0ZVB5cmlnaHRDb25maWdKc29uKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2dlbmVyYXRlUHlyaWdodENvbmZpZ0pzb24nLCBhc3luYyAoKSA9PiB7XG4gICAgbGV0IG5ld1NldHRpbmdzOiBvYmplY3QgPSBzdHJ1Y3R1cmVkQ2xvbmUoanNvbk9iaik7XG4gICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICdweXJpZ2h0Y29uZmlnLmpzb24nKTtcbiAgICBjb25zdCBvbGRDb250ZW50ID0gYXdhaXQgZnNVdGlsLnJlYWRGaWxlSWZFeGlzdHMoZmlsZVBhdGgpO1xuICAgIGxldCBvcmlnaW5hbFNldHRpbmdzSnNvbjogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICAgIGlmIChvbGRDb250ZW50ICE9PSB1bmRlZmluZWQgJiYgIWpzb25jVXRpbC5pc1RyaXZpYU9ubHkob2xkQ29udGVudCkpIHtcbiAgICAgIC8vIHB5cmlnaHRjb25maWcuanNvbiBhbGxvd3MgSlNPTkM7IGFuIGV4aXN0aW5nIGZpbGUgd2JmeSBjYW5ub3QgcGFyc2UgbXVzdCBiZSBsZWZ0XG4gICAgICAvLyB1bnRvdWNoZWQgaW5zdGVhZCBvZiBiZWluZyBvdmVyd3JpdHRlbiB3aXRoIHRoZSBiYXJlIHRlbXBsYXRlLlxuICAgICAgY29uc3Qgb2xkU2V0dGluZ3MgPSBqc29uY1V0aWwucGFyc2VPYmplY3RJZ25vcmluZ0Vycm9yPG9iamVjdD4ob2xkQ29udGVudCk7XG4gICAgICBpZiAoIW9sZFNldHRpbmdzKSB7XG4gICAgICAgIGNvbnNvbGUud2FybihgU2tpcHBlZCBnZW5lcmF0aW5nICR7ZmlsZVBhdGh9IGJlY2F1c2UgdGhlIGV4aXN0aW5nIGNvbnRlbnQgaXMgbm90IHBhcnNhYmxlIGFzIEpTT05DLmApO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBvcmlnaW5hbFNldHRpbmdzSnNvbiA9IEpTT04uc3RyaW5naWZ5KHNvcnRLZXlzKHN0cnVjdHVyZWRDbG9uZShvbGRTZXR0aW5ncykgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pKTtcbiAgICAgIG5ld1NldHRpbmdzID0gbWVyZ2UuYWxsKFtuZXdTZXR0aW5ncywgb2xkU2V0dGluZ3MsIG5ld1NldHRpbmdzXSwgeyBhcnJheU1lcmdlOiBvdmVyd3JpdGVNZXJnZSB9KTtcbiAgICB9XG4gICAgLy8gU2tpcCB0aGUgd3JpdGUgd2hlbiBub3RoaW5nIGNoYW5nZXMgc2VtYW50aWNhbGx5LCBzbyBKU09OQyBjb21tZW50cyBhbmQgZm9ybWF0dGluZyBpbiBhblxuICAgIC8vIGFscmVhZHktY2xlYW4gcHlyaWdodGNvbmZpZy5qc29uIHN1cnZpdmUgd2JmeSBydW5zLlxuICAgIGlmIChvcmlnaW5hbFNldHRpbmdzSnNvbiA9PT0gSlNPTi5zdHJpbmdpZnkoc29ydEtleXMoc3RydWN0dXJlZENsb25lKG5ld1NldHRpbmdzKSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPikpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IG5ld0NvbnRlbnQgPSBKU09OLnN0cmluZ2lmeShuZXdTZXR0aW5ncywgdW5kZWZpbmVkLCAyKTtcbiAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnNVdGlsLmdlbmVyYXRlRmlsZShmaWxlUGF0aCwgbmV3Q29udGVudCkpO1xuICB9KTtcbn1cbiIsImltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB7IGNvbnN1bWVzRG9ja2VyRW52IH0gZnJvbSAnQHdpbGxib29zdGVyL3NoYXJlZC1saWItbm9kZS9zcmMnO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBmc1V0aWwgfSBmcm9tICcuLi91dGlscy9mc1V0aWwuanMnO1xuaW1wb3J0IHsgcHJvbWlzZVBvb2wgfSBmcm9tICcuLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5cbmNvbnN0IG1hbmFnZWRTY3JpcHRzQmxvY2sgPSBgc2NyaXB0cy8qKlxuIXNjcmlwdHMvXG4hc2NyaXB0cy8qLnNoYDtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGZpeFJhaWx3YXlpZ25vcmUoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZml4UmFpbHdheWlnbm9yZScsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJy5yYWlsd2F5aWdub3JlJyk7XG4gICAgY29uc3QgY29udGVudCA9IGF3YWl0IGZzVXRpbC5yZWFkRmlsZUlmRXhpc3RzKGZpbGVQYXRoKTtcbiAgICBjb25zdCB1c2VzRG9ja2VyRW52ID0gY29uc3VtZXNEb2NrZXJFbnYoY29uZmlnLmRvY2tlcmZpbGUpO1xuICAgIGlmICghY29udGVudCkge1xuICAgICAgaWYgKGNvbmZpZy5pc1JhaWx3YXkgJiYgdXNlc0RvY2tlckVudikge1xuICAgICAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnNVdGlsLmdlbmVyYXRlRmlsZShmaWxlUGF0aCwgJyEuZG9ja2VyLmVudlxcbicpKTtcbiAgICAgIH1cbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBsZXQgbmV3Q29udGVudCA9IGNvbnRlbnQucmVwbGFjZSgvXnNjcmlwdHNcXC8kL20sIG1hbmFnZWRTY3JpcHRzQmxvY2spO1xuICAgIC8vIGByYWlsd2F5IHVwYCBzdHJpcHMgZ2l0aWdub3JlZCBmaWxlcyBmcm9tIHRoZSB1cGxvYWRlZCBidWlsZCBjb250ZXh0LCBzbyB0aGUgZ2VuZXJhdGVkXG4gICAgLy8gbm9uLXNlY3JldCAuZG9ja2VyLmVudiAoYHdiIGdlbi1kb2NrZXItZW52YCBvdXRwdXQpIG5lZWRzIGFuIGV4cGxpY2l0IHVuLWlnbm9yZSB0byByZWFjaFxuICAgIC8vIHRoZSByZW1vdGUgRG9ja2VyIGJ1aWxkLiBBcHBlbmRlZCwgbm90IHByZXBlbmRlZDogaWdub3JlIGZpbGVzIGFyZSBsYXN0LW1hdGNoLXdpbnMsIHNvIGFcbiAgICAvLyBoYW5kLXdyaXR0ZW4gcGF0dGVybiBzdWNoIGFzIGAqLmVudmAgZWFybGllciBpbiB0aGUgZmlsZSBtdXN0IG5vdCBzaWxlbnRseSByZS1leGNsdWRlIGl0LlxuICAgIGlmICh1c2VzRG9ja2VyRW52ICYmICEvXiFcXC5kb2NrZXJcXC5lbnYkL20udGVzdChuZXdDb250ZW50KSkge1xuICAgICAgbmV3Q29udGVudCA9IGAke25ld0NvbnRlbnQucmVwbGFjZSgvXFxuPyQvLCAnXFxuJyl9IS5kb2NrZXIuZW52XFxuYDtcbiAgICB9IGVsc2UgaWYgKGNvbmZpZy5kb2NrZXJmaWxlICYmICF1c2VzRG9ja2VyRW52KSB7XG4gICAgICBuZXdDb250ZW50ID0gbmV3Q29udGVudC5yZXBsYWNlKC9eIVxcLmRvY2tlclxcLmVudlxcbj8vbSwgJycpO1xuICAgIH1cbiAgICBpZiAobmV3Q29udGVudCA9PT0gY29udGVudCkgcmV0dXJuO1xuXG4gICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+XG4gICAgICBuZXdDb250ZW50ID8gZnNVdGlsLmdlbmVyYXRlRmlsZShmaWxlUGF0aCwgbmV3Q29udGVudCkgOiBmc1V0aWwucmVtb3ZlQ29uZmluZWQoZmlsZVBhdGgpXG4gICAgKTtcbiAgfSk7XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgdHlwZSB7IEltYWdlLCBMaW5rLCBQYXJhZ3JhcGgsIFBocmFzaW5nQ29udGVudCwgUm9vdENvbnRlbnQgfSBmcm9tICdtZGFzdCc7XG5pbXBvcnQgeyBmcm9tTWFya2Rvd24gfSBmcm9tICdtZGFzdC11dGlsLWZyb20tbWFya2Rvd24nO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHsgam9ic0FsbENhbGxSZXVzYWJsZVdvcmtmbG93IH0gZnJvbSAnLi93b3JrZmxvdy5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGZzVXRpbCB9IGZyb20gJy4uL3V0aWxzL2ZzVXRpbC5qcyc7XG5pbXBvcnQgeyBnZXRPY3Rva2l0IH0gZnJvbSAnLi4vdXRpbHMvZ2l0aHViVXRpbC5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcbmltcG9ydCB7IGdldFdiZnlWZXJzaW9uTGFiZWwgfSBmcm9tICcuLi91dGlscy92ZXJzaW9uLmpzJztcblxuY29uc3Qgc2VtYW50aWNSZWxlYXNlQmFkZ2UgPVxuICAnWyFbc2VtYW50aWMtcmVsZWFzZV0oaHR0cHM6Ly9pbWcuc2hpZWxkcy5pby9iYWRnZS8lMjAlMjAlRjAlOUYlOTMlQTYlRjAlOUYlOUElODAtc2VtYW50aWMtLXJlbGVhc2UtZTEwMDc5LnN2ZyldKGh0dHBzOi8vZ2l0aHViLmNvbS9zZW1hbnRpYy1yZWxlYXNlL3NlbWFudGljLXJlbGVhc2UpJztcblxuY29uc3Qgd2JmeUJhZGdlVXJsUHJlZml4ID0gJ2h0dHBzOi8vaW1nLnNoaWVsZHMuaW8vYmFkZ2Uvd2JmeS0nO1xuY29uc3Qgd2JmeUJhZGdlVXJsU3VmZml4ID0gJy0xZTkwZmYuc3ZnJztcbmNvbnN0IHdiZnlCYWRnZUxpbmsgPSAnaHR0cHM6Ly9naXRodWIuY29tL1dpbGxCb29zdGVyL3NoYXJlZC90cmVlL21haW4vcGFja2FnZXMvd2JmeSc7XG5cbmNvbnN0IG5wbVBhY2thZ2VVcmxQcmVmaXggPSAnaHR0cHM6Ly93d3cubnBtanMuY29tL3BhY2thZ2UvJztcblxuY29uc3QgbWFuYWdlZEJhZGdlUGF0dGVybnMgPSBbXG4gIC9eXFxbIVxcW3diZnlcXF1cXChodHRwczpcXC9cXC9pbWdcXC5zaGllbGRzXFwuaW9cXC9iYWRnZVxcL3diZnktW14pXFxzXSstMWU5MGZmXFwuc3ZnXFwpXFxdXFwoaHR0cHM6XFwvXFwvZ2l0aHViXFwuY29tXFwvV2lsbEJvb3N0ZXJcXC9zaGFyZWRcXC90cmVlXFwvbWFpblxcL3BhY2thZ2VzXFwvd2JmeVxcKSQvdSxcbiAgL15cXFshXFxbW15cXF1dKlxcXVxcKChodHRwczpcXC9cXC9naXRodWJcXC5jb21cXC9bXilcXHNdK1xcL2FjdGlvbnNcXC93b3JrZmxvd3NcXC9bXilcXHNdKylcXC9iYWRnZVxcLnN2Z1xcKVxcXVxcKFxcMVxcKSQvdSxcbiAgLy8gQW55IGJhZGdlIGxpbmtpbmcgdG8gYW4gbnBtIHBhY2thZ2UgcGFnZSwgd2hhdGV2ZXIgaW1hZ2UgaXQgc2hvd3MgYW5kIGhvd2V2ZXIgdGhlIGxpbmsgaXNcbiAgLy8gc3BlbGxlZDogdGhlIGJsb2NrIGlzIHdiZnkncywgaXQgd3JpdGVzIGF0IG1vc3Qgb25lIG5wbSBiYWRnZSwgc28gYSBiYWRnZSBmb3IgYSByZW5hbWVkIG9yXG4gIC8vIHVucHVibGlzaGVkIHBhY2thZ2UgaXMgYSBzdGFsZSBjb3B5IG9mIHRoYXQgb25lIOKAlCBub3QgYW5vdGhlciBiYWRnZSB0byBrZWVwIGJlc2lkZSBpdC5cbiAgL15cXFshXFxbW15cXF1dKlxcXVxcKFteKVxcc10rXFwpXFxdXFwoaHR0cHM/OlxcL1xcLyg/Ond3d1xcLik/bnBtanNcXC5jb21cXC9wYWNrYWdlXFwvW14pXFxzXSpcXCkkL3UsXG5dO1xuXG5mdW5jdGlvbiBidWlsZFdiZnlCYWRnZShsYWJlbDogc3RyaW5nKTogc3RyaW5nIHtcbiAgLy8gSHlwaGVucyBhcmUgZXNjYXBlZCBhcyBgLS1gIHBlciBzaGllbGRzLmlvJ3MgYmFkZ2UgcGF0aCBzeW50YXgsIHNvIGB2MS4yLjMtcmMuMWAgc3RheXMgaW50YWN0LlxuICByZXR1cm4gYFshW3diZnldKCR7d2JmeUJhZGdlVXJsUHJlZml4fSR7bGFiZWwucmVwbGFjZUFsbCgnLScsICctLScpfSR7d2JmeUJhZGdlVXJsU3VmZml4fSldKCR7d2JmeUJhZGdlTGlua30pYDtcbn1cblxuLyoqIFRoZSB2ZXJzaW9uIGxhYmVsIHRoZSB3YmZ5IGJhZGdlIGluIHRoZSByZXBvc2l0b3J5J3MgUkVBRE1FIHJlY29yZHMsIGkuZS4gdGhlIGJ1aWxkIHRoYXQgd2JmaWVkIGl0LiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJlYWRBcHBsaWVkV2JmeVZlcnNpb25MYWJlbChkaXJQYXRoOiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZyB8IHVuZGVmaW5lZD4ge1xuICAvLyBDb25maW5lZCwgYW5kIHRvbGVyYW50IG9mIGFueSByZWFkIGZhaWx1cmU6IGEgUkVBRE1FIHRoYXQgcmVzb2x2ZXMgb3V0c2lkZSB0aGUgcmVwb3NpdG9yeSAoYVxuICAvLyBjb21taXR0ZWQgc3ltbGluaykgb3IgY2Fubm90IGJlIHJlYWQgYXQgYWxsIHNheXMgbm90aGluZyBhYm91dCB3aGljaCBidWlsZCBjb25maWd1cmVkIFRISVNcbiAgLy8gcmVwb3NpdG9yeSwgYW5kIHRoZSBhbnN3ZXIgb25seSBldmVyIHN1cHByZXNzZXMgd29yayDigJQgc28gYW55dGhpbmcgYnV0IGEgcmVhZGFibGUgaW4tcmVwb3NpdG9yeVxuICAvLyBSRUFETUUgbWVhbnMgXCJub3Qga25vd24gdG8gYmUgYXBwbGllZFwiIGFuZCB0aGUgcnVuIHByb2NlZWRzLlxuICBjb25zdCByZWFkbWUgPSBhd2FpdCBmc1V0aWwucmVhZEZpbGVDb25maW5lZElmRXhpc3RzKHBhdGgucmVzb2x2ZShkaXJQYXRoLCAnUkVBRE1FLm1kJykpLmNhdGNoKCgpID0+IHt9KTtcbiAgaWYgKHJlYWRtZSA9PT0gdW5kZWZpbmVkKSByZXR1cm4gdW5kZWZpbmVkO1xuXG4gIC8vIFRoZSBSRUFETUUgaXMgcGFyc2VkIHJhdGhlciB0aGFuIHNjYW5uZWQsIGZvciB0aGUgc2FtZSByZWFzb24gd3JpdGVCYWRnZUJsb2NrIHBhcnNlcyBpdCwgYW5kXG4gIC8vIG9ubHkgdGhlIHNoYXBlIHdyaXRlQmFkZ2VCbG9jayBpdHNlbGYgd3JpdGVzIGNvdW50cyBhcyBhbiBhcHBsaWVkIGJhZGdlOiBhIHRvcC1sZXZlbCBwYXJhZ3JhcGhcbiAgLy8gb2YgYmFkZ2VzLiBBIGJhZGdlIGFueXdoZXJlIGVsc2UgaXMgY29udGVudCB0aGF0IG1lcmVseSBtZW50aW9ucyBvbmUg4oCUIGEgZmVuY2VkIGV4YW1wbGUgKHdiZnknc1xuICAvLyBvd24gZG9jdW1lbnRhdGlvbiBoYXMgdGhvc2UpLCBhIGJsb2NrIHF1b3RlLCBhIGxpc3QgaXRlbSDigJQgYW5kIHJlYWRpbmcgaXQgYXMgYXBwbGllZCB3b3VsZCBza2lwXG4gIC8vIGV2ZXJ5IGZpeGVyIGZvciB0aGUgcmVwb3NpdG9yeS5cbiAgZm9yIChjb25zdCBub2RlIG9mIGZyb21NYXJrZG93bihyZWFkbWUpLmNoaWxkcmVuKSB7XG4gICAgaWYgKCFpc0JhZGdlQmxvY2tOb2RlKG5vZGUpKSBjb250aW51ZTtcbiAgICBmb3IgKGNvbnN0IGJhZGdlIG9mIG5vZGUuY2hpbGRyZW4pIHtcbiAgICAgIGlmICghaXNCYWRnZU5vZGUoYmFkZ2UpKSBjb250aW51ZTtcbiAgICAgIGNvbnN0IHsgdXJsIH0gPSBiYWRnZS5jaGlsZHJlblswXTtcbiAgICAgIGlmICh1cmwuc3RhcnRzV2l0aCh3YmZ5QmFkZ2VVcmxQcmVmaXgpICYmIHVybC5lbmRzV2l0aCh3YmZ5QmFkZ2VVcmxTdWZmaXgpKSB7XG4gICAgICAgIHJldHVybiB1cmwuc2xpY2Uod2JmeUJhZGdlVXJsUHJlZml4Lmxlbmd0aCwgLXdiZnlCYWRnZVVybFN1ZmZpeC5sZW5ndGgpLnJlcGxhY2VBbGwoJy0tJywgJy0nKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcmV0dXJuIHVuZGVmaW5lZDtcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlUmVhZG1lKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2dlbmVyYXRlUmVhZG1lJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnUkVBRE1FLm1kJyk7XG4gICAgLy8gVGhlIHdiZnkgYmFkZ2UgbWFya3MgYSByZXBvc2l0b3J5IGFzIHdiZmllZCwgc28gYSByZXBvc2l0b3J5IHdpdGhvdXQgYSBSRUFETUUgc3RpbGwgZ2V0cyBvbmUuXG4gICAgLy8gcmVhZEZpbGVJZkV4aXN0cyBmYWxscyBiYWNrIE9OTFkgb24gRU5PRU5UOiBhIFJFQURNRSB0aGF0IGV4aXN0cyBidXQgY2Fubm90IGJlIHJlYWQgKGUuZy5cbiAgICAvLyBwZXJtaXNzaW9ucywgRU1GSUxFKSBtdXN0IGFib3J0IHRoZSBnZW5lcmF0b3IgaW5zdGVhZCBvZiBiZWluZyBvdmVyd3JpdHRlbiB3aXRoIHRoZSBzdHViLlxuICAgIGxldCBuZXdDb250ZW50ID1cbiAgICAgIChhd2FpdCBmc1V0aWwucmVhZEZpbGVJZkV4aXN0cyhmaWxlUGF0aCkpID8/XG4gICAgICBgIyAke2NvbmZpZy5wYWNrYWdlSnNvbj8ubmFtZSA/PyBwYXRoLmJhc2VuYW1lKHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCkpfVxcbmA7XG5cbiAgICAvLyBPcmRlcmVkIGJ5IHdoYXQgYSByZWFkZXIgY2FyZXMgYWJvdXQgbW9zdDogdGhlIG5wbSBiYWRnZSBuYW1lcyB0aGUgcGFja2FnZSBhIHJlYWRlciBpbnN0YWxscyxcbiAgICAvLyB0aGVuIHRoZSB3b3JrZmxvdyBiYWRnZXMgcmVwb3J0IHdoZXRoZXIgdGhlIGNvZGUgaXMgY3VycmVudGx5IGhlYWx0aHksIHRoZW4gaG93IGl0IGlzXG4gICAgLy8gcmVsZWFzZWQsIGFuZCBsYXN0IHRoZSB3YmZ5IGJ1aWxkIHRoYXQgY29uZmlndXJlZCBpdC5cbiAgICBjb25zdCBiYWRnZXM6IHN0cmluZ1tdID0gW107XG4gICAgY29uc3QgbnBtUGFja2FnZU5hbWUgPSBhd2FpdCBnZXRQdWJsaXNoZWROcG1QYWNrYWdlTmFtZShjb25maWcpO1xuICAgIGlmIChucG1QYWNrYWdlTmFtZSkgYmFkZ2VzLnB1c2goYnVpbGROcG1CYWRnZShucG1QYWNrYWdlTmFtZSkpO1xuICAgIGJhZGdlcy5wdXNoKC4uLihhd2FpdCBidWlsZFdvcmtmbG93QmFkZ2VzKGNvbmZpZykpKTtcbiAgICBpZiAoZnMuZXhpc3RzU3luYyhwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICcucmVsZWFzZXJjLmpzb24nKSkpIGJhZGdlcy5wdXNoKHNlbWFudGljUmVsZWFzZUJhZGdlKTtcbiAgICBiYWRnZXMucHVzaChidWlsZFdiZnlCYWRnZShnZXRXYmZ5VmVyc2lvbkxhYmVsKCkgPz8gJ2FwcGxpZWQnKSk7XG5cbiAgICAvLyBUaGUgYmxvY2sgaXMgd3JpdHRlbiBpbiBvbmUgcGFzcyBmcm9tIHRoZSBiYWRnZXMgd2JmeSBtYW5hZ2VzIHJpZ2h0IG5vdy4gQSBiYWRnZSB0aGF0IGlzIG5vXG4gICAgLy8gbG9uZ2VyIHdhbnRlZCDigJQgYSBzdXBlcnNlZGVkIHZlcnNpb24sIG9yIG9uZSB3aG9zZSB3b3JrZmxvdyBpcyBnb25lIOKAlCBzaW1wbHkgaXMgbm90IGluIHRoZVxuICAgIC8vIGxpc3QsIHNvIG5vdGhpbmcgaGFzIHRvIHJlbW92ZSBpdC5cbiAgICBuZXdDb250ZW50ID0gd3JpdGVCYWRnZUJsb2NrKG5ld0NvbnRlbnQsIGJhZGdlcyk7XG5cbiAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnNVdGlsLmdlbmVyYXRlRmlsZShmaWxlUGF0aCwgbmV3Q29udGVudCwgZ2V0TGluZUVuZGluZyhuZXdDb250ZW50KSkpO1xuICB9KTtcbn1cblxuLyoqXG4gKiBUaGUgbnBtIHBhY2thZ2UgbmFtZSB0aGUgcmVwb3NpdG9yeSBwdWJsaXNoZXMgZnJvbSBpdHMgcm9vdCBtYW5pZmVzdCwgaWYgYW55LiBBIG1hbmlmZXN0IG5vXG4gKiByZWxlYXNlIHB1Ymxpc2hlcywgb3Igb25lIGtlcHQgb3V0IG9mIHRoZSByZWdpc3RyeSBvbiBwdXJwb3NlLCBoYXMgbm8gcGFja2FnZSBwYWdlIHRvIGxpbmsgdG8uXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGdldFB1Ymxpc2hlZE5wbVBhY2thZ2VOYW1lKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8c3RyaW5nIHwgdW5kZWZpbmVkPiB7XG4gIGNvbnN0IHBhY2thZ2VKc29uID0gY29uZmlnLnBhY2thZ2VKc29uO1xuICBpZiAoIXBhY2thZ2VKc29uPy5uYW1lIHx8ICFjb25maWcucmVsZWFzZS5ucG0pIHJldHVybiB1bmRlZmluZWQ7XG4gIC8vIGBwcml2YXRlYCBpcyByZWFkIHRoZSB3YXkgZ2VuZXJhdGVQYWNrYWdlSnNvbiB3cml0ZXMgaXQ6IGl0IHJlbW92ZXMgdGhlIGZsYWcgZnJvbSBhIE1PTk9SRVBPXG4gIC8vIHJvb3QgdGhhdCBkZWNsYXJlcyBwdWJsaXNoaW5nIGludGVudCwgc28gcmVhZGluZyB0aGUgZmxhZyBhbG9uZSB3b3VsZCBkZW55IHRoZSBiYWRnZSB0byB0aGVcbiAgLy8gdmVyeSBtYW5pZmVzdCB0aGUgc2FtZSBydW4gbWFrZXMgcHVibGlzaGFibGUuIEFueXdoZXJlIGVsc2UgdGhlIGZsYWcgc3RhbmRzIGFzIHdyaXR0ZW4uXG4gIGNvbnN0IGRlY2xhcmVzUHVibGlzaGluZ0ludGVudCA9ICEhcGFja2FnZUpzb24ucHVibGlzaENvbmZpZyB8fCBjb25maWcucmVsZWFzZS5ucG1QdWJsaXNoZXNSb290O1xuICBpZiAocGFja2FnZUpzb24ucHJpdmF0ZSAmJiAhKGNvbmZpZy5kb2VzQ29udGFpblN1YlBhY2thZ2VKc29ucyAmJiBkZWNsYXJlc1B1Ymxpc2hpbmdJbnRlbnQpKSByZXR1cm4gdW5kZWZpbmVkO1xuICAvLyBUaGUgbWFuaWZlc3Qgb25seSBzYXlzIHRoZSByZXBvc2l0b3J5IElOVEVORFMgdG8gcHVibGlzaDogYSBtb25vcmVwbyByb290IHRoYXQgY29uZmlndXJlc1xuICAvLyBAc2VtYW50aWMtcmVsZWFzZS9ucG0gZm9yIGl0cyB3b3Jrc3BhY2VzIGlzIG5ldmVyIG9uIG5wbSBpdHNlbGYsIGFuZCBhIHBhY2thZ2UncyBmaXJzdCByZWxlYXNlXG4gIC8vIGhhcyBub3QgaGFwcGVuZWQgeWV0LiBCb3RoIHdvdWxkIHJlbmRlciBhIGJyb2tlbiBiYWRnZSwgc28gdGhlIHJlZ2lzdHJ5IGRlY2lkZXMuXG4gIHJldHVybiAoYXdhaXQgaXNNaXNzaW5nRnJvbU5wbVJlZ2lzdHJ5KHBhY2thZ2VKc29uLm5hbWUpKSA/IHVuZGVmaW5lZCA6IHBhY2thZ2VKc29uLm5hbWU7XG59XG5cbi8qKlxuICogV2hldGhlciB0aGUgcmVnaXN0cnkgYW5zd2VycyB0aGF0IGl0IGhhcyBubyBzdWNoIHBhY2thZ2Ug4oCUIHRoZSBPTkxZIGFuc3dlciB0aGF0IHJlbW92ZXMgYSBiYWRnZS5cbiAqIEEgY2hlY2sgdGhhdCBjYW5ub3QgcnVuIChvZmZsaW5lLCBhbiBvdXRhZ2UsIGEgdGltZW91dCkgc2F5cyBub3RoaW5nIGFib3V0IHRoZSBwYWNrYWdlLCBhbmRcbiAqIHRyZWF0aW5nIGl0IGFzIGFic2VudCB3b3VsZCBzdHJpcCB0aGUgYmFkZ2Ugb3V0IG9mIGV2ZXJ5IHB1Ymxpc2hlZCByZXBvc2l0b3J5IHdiZnkgdG91Y2hlc1xuICogZHVyaW5nIHRoZSBvdXRhZ2UgYW5kIHB1dCBpdCBiYWNrIGFmdGVyd2FyZHMuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGlzTWlzc2luZ0Zyb21OcG1SZWdpc3RyeShwYWNrYWdlTmFtZTogc3RyaW5nKTogUHJvbWlzZTxib29sZWFuPiB7XG4gIHRyeSB7XG4gICAgLy8gVGhlIHNjb3BlIHNlcGFyYXRvciBtdXN0IHN1cnZpdmUgYXMgYSBwYXRoIHNlZ21lbnQsIHNvIHRoZSBuYW1lIGlzIGVuY29kZWQgcGllY2V3aXNlLlxuICAgIGNvbnN0IGVuY29kZWROYW1lID0gcGFja2FnZU5hbWUuc3BsaXQoJy8nKS5tYXAoZW5jb2RlVVJJQ29tcG9uZW50KS5qb2luKCcvJyk7XG4gICAgLy8gQSBiYWRnZSBpcyBkZWNvcmF0aW9uOiBhIHN0YWxsZWQgcmVnaXN0cnkgY29ubmVjdGlvbiBtdXN0IG5vdCBob2xkIHRoZSB3aG9sZSBydW4gZm9yIGhvd2V2ZXJcbiAgICAvLyBsb25nIHRoZSBuZXR3b3JraW5nIHN0YWNrIHdvdWxkIHdhaXQuIFRoZSBidWRnZXQgaXMgZ2VuZXJvdXMgYmVjYXVzZSBhIHRpbWVvdXQgYW5zd2Vyc1xuICAgIC8vIFwidW5rbm93blwiLCB3aGljaCBrZWVwcyB0aGUgYmFkZ2Ug4oCUIGFuZCBvbiBhIHJlcG9zaXRvcnkgdGhhdCBpcyBub3Qgb24gbnBtIHRoYXQgbWVhbnMgd3JpdGluZ1xuICAgIC8vIG9uZSBpdCBzaG91bGQgbm90IGhhdmU7IGEgd2JmeSBydW4gYWxyZWFkeSBzcGVuZHMgbWludXRlcyBvbiBpbnN0YWxscywgc28gd2FpdGluZyBhIGxpdHRsZVxuICAgIC8vIGxvbmdlciBmb3IgYSByZWFsIGFuc3dlciBjb3N0cyBsZXNzIHRoYW4gYWN0aW5nIG9uIGEgbWlzc2luZyBvbmUuXG4gICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaChgaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvJHtlbmNvZGVkTmFtZX1gLCB7XG4gICAgICBtZXRob2Q6ICdIRUFEJyxcbiAgICAgIHNpZ25hbDogQWJvcnRTaWduYWwudGltZW91dCgxMF8wMDApLFxuICAgIH0pO1xuICAgIHJldHVybiByZXNwb25zZS5zdGF0dXMgPT09IDQwNDtcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG59XG5cbmZ1bmN0aW9uIGJ1aWxkTnBtQmFkZ2UocGFja2FnZU5hbWU6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiBgWyFbbnBtIHZlcnNpb25dKGh0dHBzOi8vaW1nLnNoaWVsZHMuaW8vbnBtL3YvJHtwYWNrYWdlTmFtZX0uc3ZnKV0oJHtucG1QYWNrYWdlVXJsUHJlZml4fSR7cGFja2FnZU5hbWV9KWA7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGJ1aWxkV29ya2Zsb3dCYWRnZXMoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTxzdHJpbmdbXT4ge1xuICBjb25zdCByZXBvc2l0b3J5ID0gY29uZmlnLnJlcG9zaXRvcnk/LnNsaWNlKGNvbmZpZy5yZXBvc2l0b3J5LmluZGV4T2YoJzonKSArIDEpO1xuICBjb25zdCB3b3JrZmxvd3NQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnLmdpdGh1YicsICd3b3JrZmxvd3MnKTtcbiAgaWYgKCFyZXBvc2l0b3J5IHx8ICFmcy5leGlzdHNTeW5jKHdvcmtmbG93c1BhdGgpKSByZXR1cm4gW107XG5cbiAgLy8gV29ya2Zsb3cgYW5kIFJFQURNRSBnZW5lcmF0aW9uIHJ1biBjb25jdXJyZW50bHkuIERvIG5vdCByZXRhaW4gYSBzdGFsZSBSdXN0IGJhZGdlIHdoaWxlIHRoZVxuICAvLyB3b3JrZmxvdyBnZW5lcmF0b3IgcmVtb3ZlcyBhIGNhbGxlciBjcmVhdGVkIGZyb20gYSBmb3JtZXJseSBtaXNkZXRlY3RlZCBsb2NhbCBjYWNoZSDigJQgYnV0XG4gIC8vIG1pcnJvciBpdHMgb3duZXJzaGlwIGNoZWNrOiBhIGN1c3RvbSBzYW1lLW5hbWVkIHdvcmtmbG93IHN1cnZpdmVzLCBzbyBpdHMgYmFkZ2UgbXVzdCB0b28uXG4gIC8vIERlY2lkZWQgc3luY2hyb25vdXNseSBiZWZvcmUgdGhlIGxvb3AncyBmaXJzdCBhd2FpdDogdGhlIGdlbmVyYXRvcidzIGRlbGV0ZSBjYW4gb25seSBsYW5kIGF0XG4gIC8vIGFuIGF3YWl0IHBvaW50LCBhbmQgYSBwb3N0LWRlbGV0ZSByZWFkIHdvdWxkIG1pc3JlcG9ydCB0aGUgd2JmeS1vd25lZCBjYWxsZXIgYXMgY3VzdG9tLlxuICAvLyBObyBleGlzdHNTeW5jIHByZS1jaGVjazogdGhlIGhlbHBlciBhbHJlYWR5IHRyZWF0cyBhIG1pc3NpbmcgZmlsZSBhcyBub3Qgb3duZWQsIGFuZCB0aGlzIHJ1bnNcbiAgLy8gb25jZSBwZXIgcmVwb3NpdG9yeSwgc28gdGhlIGV4Y2VwdGlvbmFsIEVOT0VOVCByZWFkIGNvc3RzIG5vdGhpbmcgd29ydGggYSByZWR1bmRhbnQgc3RhdC5cbiAgY29uc3QgZHJvcHNUZXN0UnVzdEJhZGdlID1cbiAgICBjb25maWcuY2FyZ29Ub21sRGlyUGF0aHMubGVuZ3RoID09PSAwICYmIGpvYnNBbGxDYWxsUmV1c2FibGVXb3JrZmxvdyh3b3JrZmxvd3NQYXRoLCAndGVzdC1ydXN0LnltbCcsICd0ZXN0LXJ1c3QnKTtcblxuICBjb25zdCBiYWRnZXM6IHN0cmluZ1tdID0gW107XG4gIGZvciAoY29uc3QgZmlsZU5hbWUgb2YgZnMucmVhZGRpclN5bmMod29ya2Zsb3dzUGF0aCkpIHtcbiAgICBpZiAoIWZpbGVOYW1lLnN0YXJ0c1dpdGgoJ3Rlc3QnKSAmJiAhZmlsZU5hbWUuc3RhcnRzV2l0aCgnZGVwbG95JykpIGNvbnRpbnVlO1xuICAgIGlmIChmaWxlTmFtZSA9PT0gJ3Rlc3QtcnVzdC55bWwnICYmIGRyb3BzVGVzdFJ1c3RCYWRnZSkgY29udGludWU7XG4gICAgLy8gR2l0SHViJ3MgYmFkZ2UgZW5kcG9pbnQgcmV0dXJucyA0MDQgdW50aWwgdGhlIHdvcmtmbG93IGhhcyBhdCBsZWFzdCBvbmUgcnVuLCBzbyBhIGJhZGdlIGZvciBhXG4gICAgLy8gZGlzcGF0Y2gtb25seSBkZXBsb3kgd29ya2Zsb3cgdGhhdCBoYXMgbmV2ZXIgcnVuIHJlbmRlcnMgYXMgYSBicm9rZW4gaW1hZ2UuIFRlc3Qgd29ya2Zsb3dzIHJ1blxuICAgIC8vIG9uIGV2ZXJ5IFBSLCBzbyBvbmx5IGRlcGxveSBiYWRnZXMgbmVlZCB0aGUgZ3VhcmQuXG4gICAgaWYgKGZpbGVOYW1lLnN0YXJ0c1dpdGgoJ2RlcGxveScpICYmICEoYXdhaXQgaGFzQW55V29ya2Zsb3dSdW4ocmVwb3NpdG9yeSwgZmlsZU5hbWUsIGNvbmZpZy5pc1B1YmxpY1JlcG8pKSkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGNvbnN0IGJhZGdlTmFtZSA9IChmaWxlTmFtZVswXSA/PyAnJykudG9VcHBlckNhc2UoKSArIGZpbGVOYW1lLnNsaWNlKDEsIGZpbGVOYW1lLmluZGV4T2YoJy4nKSkucmVwbGFjZSgnLScsICcgJyk7XG4gICAgY29uc3Qgd29ya2Zsb3dVcmwgPSBgaHR0cHM6Ly9naXRodWIuY29tLyR7cmVwb3NpdG9yeX0vYWN0aW9ucy93b3JrZmxvd3MvJHtlbmNvZGVVcmxQYXRoKGZpbGVOYW1lKX1gO1xuICAgIGJhZGdlcy5wdXNoKGBbIVske2JhZGdlTmFtZX1dKCR7d29ya2Zsb3dVcmx9L2JhZGdlLnN2ZyldKCR7d29ya2Zsb3dVcmx9KWApO1xuICB9XG4gIHJldHVybiBiYWRnZXM7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGhhc0FueVdvcmtmbG93UnVuKFxuICByZXBvc2l0b3J5OiBzdHJpbmcsXG4gIHdvcmtmbG93RmlsZU5hbWU6IHN0cmluZyxcbiAgaXNQdWJsaWNSZXBvOiBib29sZWFuXG4pOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgY29uc3QgW293bmVyLCByZXBvXSA9IHJlcG9zaXRvcnkuc3BsaXQoJy8nKTtcbiAgaWYgKCFvd25lciB8fCAhcmVwbykgcmV0dXJuIHRydWU7XG4gIHRyeSB7XG4gICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBnZXRPY3Rva2l0KG93bmVyKS5yZXF1ZXN0KCdHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2FjdGlvbnMvd29ya2Zsb3dzL3t3b3JrZmxvd19pZH0vcnVucycsIHtcbiAgICAgIG93bmVyLFxuICAgICAgcmVwbyxcbiAgICAgIHdvcmtmbG93X2lkOiB3b3JrZmxvd0ZpbGVOYW1lLFxuICAgICAgcGVyX3BhZ2U6IDEsXG4gICAgfSk7XG4gICAgcmV0dXJuIHJlc3BvbnNlLmRhdGEudG90YWxfY291bnQgPiAwO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIC8vIEZvciBhIFBVQkxJQyByZXBvc2l0b3J5IHRoZSBydW5zIGVuZHBvaW50IG5lZWRzIG5vIGF1dGhvcml6YXRpb24sIHNvIDQwNCByZWxpYWJseSBtZWFucyB0aGVcbiAgICAvLyB3b3JrZmxvdyBpcyBhYnNlbnQgZnJvbSB0aGUgcmVtb3RlIChlLmcuIGFkZGVkIGxvY2FsbHksIG5ldmVyIHB1c2hlZCkg4oCUIGxpa2UgemVybyBydW5zLCBpdHNcbiAgICAvLyBiYWRnZSB3b3VsZCByZW5kZXIgYnJva2VuLiBGb3IgYSBQUklWQVRFIHJlcG9zaXRvcnkgR2l0SHViIGFsc28gYW5zd2VycyA0MDQgd2hlbiB0aGUgdG9rZW5cbiAgICAvLyBpcyBtaXNzaW5nIG9yIHVuZGVyLXNjb3BlZCwgc28gNDA0IGlzIGFtYmlndW91cyB0aGVyZSBhbmQgdGhlIGJhZGdlIGlzIGtlcHQuXG4gICAgaWYgKChlcnJvciBhcyB7IHN0YXR1cz86IG51bWJlciB9KS5zdGF0dXMgPT09IDQwNCAmJiBpc1B1YmxpY1JlcG8pIHJldHVybiBmYWxzZTtcbiAgICAvLyBLZWVwIHRoZSBwcmUtZ3VhcmQgYmVoYXZpb3IgKGluc2VydCB0aGUgYmFkZ2UpIHdoZW4gdGhlIGNoZWNrIGl0c2VsZiBjYW5ub3QgcnVuLlxuICAgIHJldHVybiB0cnVlO1xuICB9XG59XG5cbi8qKlxuICogUmVwbGFjZXMgdGhlIGJhZGdlIGJsb2NrIOKAlCB0aGUgYmFkZ2VzIHdiZnkga2VlcHMgZGlyZWN0bHkgdW5kZXIgdGhlIHRpdGxlIOKAlCB3aXRoIGBtYW5hZ2VkQmFkZ2VzYCxcbiAqIGtlZXBpbmcgYW55IGJhZGdlIHRoZXJlIHRoYXQgd2JmeSBkb2VzIG5vdCBtYW5hZ2UsIGFuZCByZWFzc2VtYmxlcyB0aGUgUkVBRE1FIGFyb3VuZCBpdCB3aXRoXG4gKiBleGFjdGx5IG9uZSBibGFuayBsaW5lIG9uIGVhY2ggc2lkZS5cbiAqXG4gKiBCb3RoIHRoZSB0aXRsZSBhbmQgdGhlIGJsb2NrIGFyZSBsb2NhdGVkIGluIGEgQ29tbW9uTWFyayBzeW50YXggdHJlZSByYXRoZXIgdGhhbiBieSBzY2FubmluZ1xuICogbGluZXM6IG9ubHkgYSByZWFsIHBhcnNlciBrbm93cyB3aGV0aGVyIGEgbGluZSB0aGF0IGxvb2tzIGxpa2UgYSBiYWRnZSBpcyBhIGJhZGdlIChhIHBhcmFncmFwaCBvZlxuICogbGlua2VkIGltYWdlcykgb3IgY29udGVudCB0aGF0IG1lcmVseSByZWFkcyBsaWtlIG9uZSAoYW4gaW5kZW50ZWQgY29kZSBibG9jaywgYSBibG9jayBxdW90ZSwgYVxuICogZmVuY2VkIGV4YW1wbGUsIGEgbXVsdGlsaW5lIGNvZGUgc3BhbiwgYW4gSFRNTCBibG9jaykuIEV2ZXJ5dGhpbmcgb3V0c2lkZSB0aGUgYmxvY2sgaXMgY29waWVkIGJhY2tcbiAqIHZlcmJhdGltIGZyb20gdGhlIG9yaWdpbmFsIHRleHQgdGhyb3VnaCB0aGUgcGFyc2VyJ3MgcG9zaXRpb25hbCBvZmZzZXRzLCBzbyBubyByZWZvcm1hdHRpbmcgb2YgdGhlXG4gKiB1c2VyJ3MgY29udGVudCBpcyBwb3NzaWJsZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHdyaXRlQmFkZ2VCbG9jayhyZWFkbWU6IHN0cmluZywgbWFuYWdlZEJhZGdlczogc3RyaW5nW10pOiBzdHJpbmcge1xuICBjb25zdCBsaW5lRW5kaW5nID0gZ2V0TGluZUVuZGluZyhyZWFkbWUpO1xuICAvLyBBIEJPTSBpcyBub3QgTWFya2Rvd246IGxlZnQgaW4gdGhlIHRleHQgaXQgaGlkZXMgdGhlIGAjYCBvZiB0aGUgdGl0bGUgZnJvbSB0aGUgcGFyc2VyLCBhbmRcbiAgLy8gcHJlcGVuZGluZyB0aGUgYmxvY2sgYWhlYWQgb2YgaXQgd291bGQgc3RyaXAgdGhlIG1hcmtlciBmcm9tIHRoZSBmaWxlJ3MgZmlyc3QgYnl0ZS5cbiAgY29uc3QgYnl0ZU9yZGVyTWFyayA9IHJlYWRtZS5zdGFydHNXaXRoKCfvu78nKSA/ICfvu78nIDogJyc7XG4gIC8vIEZyb250IG1hdHRlciBpcyBkZWxpbWl0ZWQgYnkgdGhlIHNhbWUgYC0tLWAgYSBTZXRleHQgaGVhZGluZyBhbmQgYSB0aGVtYXRpYyBicmVhayB1c2UsIHNvIGl0IGlzXG4gIC8vIGRldGFjaGVkIGJlZm9yZSBwYXJzaW5nIGluc3RlYWQgb2YgYmVpbmcgdG9sZCBhcGFydCBhZnRlcndhcmRzOyBpdCBhbHNvIGhhcyB0byBzdGF5IGZpcnN0IGluIHRoZVxuICAvLyBmaWxlLCB3aGljaCBtYWtlcyBpdCBhIHByZWZpeCBpbiBleGFjdGx5IHRoZSBzYW1lIHdheSB0aGUgQk9NIGlzLlxuICBjb25zdCB3aXRob3V0TWFyayA9IHJlYWRtZS5zbGljZShieXRlT3JkZXJNYXJrLmxlbmd0aCk7XG4gIGNvbnN0IGZyb250TWF0dGVyID0gd2l0aG91dE1hcmsuc3RhcnRzV2l0aCgnLS0tJylcbiAgICA/ICgvXi0tLVsgXFx0XSpcXHI/XFxuW1xcc1xcU10qP14tLS1bIFxcdF0qKD86XFxyP1xcbnwkKS9tdS5leGVjKHdpdGhvdXRNYXJrKT8uWzBdID8/ICcnKVxuICAgIDogJyc7XG4gIGNvbnN0IHByZWZpeCA9IGAke2J5dGVPcmRlck1hcmt9JHtmcm9udE1hdHRlcn1gO1xuICAvLyBUaGUgZmluYWwgbmV3bGluZSBpcyBzZXQgYXNpZGUgcmF0aGVyIHRoYW4gcGFyc2VkIGFzIHRyYWlsaW5nIGJsYW5rIHNwYWNlLCB3aGljaCB0aGUgYmxhbmstbGluZVxuICAvLyB0cmltbWluZyBiZWxvdyB3b3VsZCBvdGhlcndpc2Ugc3dhbGxvdy5cbiAgY29uc3QgZW5kc1dpdGhOZXdsaW5lID0gL1xccj9cXG4kL3UudGVzdChyZWFkbWUpO1xuICBjb25zdCBjb250ZW50ID0gd2l0aG91dE1hcmsuc2xpY2UoZnJvbnRNYXR0ZXIubGVuZ3RoKS5yZXBsYWNlKC9cXHI/XFxuJC91LCAnJyk7XG5cbiAgY29uc3Qgbm9kZXMgPSBmcm9tTWFya2Rvd24oY29udGVudCkuY2hpbGRyZW47XG4gIC8vIEEgbGVhZGluZyBiYWRnZSBibG9jayBpcyB0aGUgdXNlcidzIG93biBsYXlvdXQ6IGl0IHN0YXlzIGFib3ZlIHRoZSB0aXRsZSwgYW5kIHdiZnkncyBibG9jayBnb2VzIGJlbG93LlxuICBjb25zdCBrZWVwc0xlYWRpbmdCbG9jayA9ICEhbm9kZXNbMF0gJiYgaXNCYWRnZUJsb2NrTm9kZShub2Rlc1swXSkgJiYgaXNUaXRsZU5vZGUobm9kZXNbMV0pO1xuICBjb25zdCB0aXRsZUluZGV4ID0ga2VlcHNMZWFkaW5nQmxvY2sgPyAxIDogaXNUaXRsZU5vZGUobm9kZXNbMF0pID8gMCA6IC0xO1xuICAvLyBXaXRob3V0IGEgcmVjb2duaXphYmxlIHRpdGxlIHRoZSBibG9jayBzaXRzIGF0IHRoZSB2ZXJ5IHRvcCwgYWJvdmUgZXZlcnl0aGluZy5cbiAgY29uc3QgaGVhZFN0YXJ0Tm9kZSA9IGtlZXBzTGVhZGluZ0Jsb2NrID8gbm9kZXNbMF0hIDogbm9kZXNbdGl0bGVJbmRleF07XG4gIGNvbnN0IGhlYWQgPVxuICAgIHRpdGxlSW5kZXggPT09IC0xXG4gICAgICA/ICcnXG4gICAgICA6IGNvbnRlbnQuc2xpY2Uoc3RhcnRPZmZzZXRXaXRoSW5kZW50KGNvbnRlbnQsIGhlYWRTdGFydE5vZGUhKSwgbm9kZXNbdGl0bGVJbmRleF0hLnBvc2l0aW9uIS5lbmQub2Zmc2V0KTtcblxuICBjb25zdCBibG9ja05vZGUgPSBub2Rlc1t0aXRsZUluZGV4ICsgMV07XG4gIGNvbnN0IGV4aXN0aW5nID0gYmxvY2tOb2RlICYmIGlzQmFkZ2VCbG9ja05vZGUoYmxvY2tOb2RlKSA/IHJlYWRCYWRnZXMoYmxvY2tOb2RlLCBjb250ZW50KSA6IHVuZGVmaW5lZDtcbiAgY29uc3QgYm9keU5vZGUgPSBleGlzdGluZyAmJiBibG9ja05vZGUgPyBub2Rlc1tub2Rlcy5pbmRleE9mKGJsb2NrTm9kZSkgKyAxXSA6IGJsb2NrTm9kZTtcbiAgY29uc3QgYm9keSA9IGJvZHlOb2RlID8gY29udGVudC5zbGljZShzdGFydE9mZnNldFdpdGhJbmRlbnQoY29udGVudCwgYm9keU5vZGUpKSA6ICcnO1xuXG4gIC8vIFN1cGVyc2VkaW5nIGEgbWFuYWdlZCBiYWRnZSBpcyBqdXN0IGRyb3BwaW5nIHRoZSBvbGQgb25lOiBhIHZlcnNpb24gb3Igd29ya2Zsb3cgY2hhbmdlIGxlYXZlc1xuICAvLyBubyBzdGFsZSBjb3B5LCB3aGlsZSBhbnkgb3RoZXIgYmFkZ2UgaW4gdGhlIGJsb2NrIChpbmNsdWRpbmcgYSBub24tY2Fub25pY2FsIHdiZnkgYmFkZ2UsIHdoaWNoXG4gIC8vIGlzIHJlbW92ZWQgbWFudWFsbHkpIGlzIGtlcHQuXG4gIGNvbnN0IGJhZGdlcyA9IFsuLi5tYW5hZ2VkQmFkZ2VzLCAuLi4oZXhpc3RpbmcgPz8gW10pLmZpbHRlcigoYmFkZ2UpID0+ICFpc01hbmFnZWRCYWRnZShiYWRnZSkpXTtcbiAgLy8gQ29udGVudCBpcyBzbGljZWQgZnJvbSBpdHMgbm9kZSdzIHN0YXJ0IG9mZnNldCwgc28gd2hhdGV2ZXIgYmxhbmsgc3BhY2UgZm9sbG93ZWQgdGhlIGZyb250XG4gIC8vIG1hdHRlciBpcyBnb25lOyBleGFjdGx5IG9uZSBibGFuayBsaW5lIGlzIHJlc3RvcmVkIGhlcmUuIEEgY2xvc2luZyBkZWxpbWl0ZXIgdGhhdCBlbmRlZCBhdCBFT0ZcbiAgLy8gY2FycmllcyBubyBuZXdsaW5lIG9mIGl0cyBvd24gYW5kIG5lZWRzIGJvdGgsIG9yIGAtLS1gIHdvdWxkIGZ1c2Ugd2l0aCB0aGUgZmlyc3QgYmFkZ2UgYW5kXG4gIC8vIGRlc3Ryb3kgdGhlbSBib3RoLiBBIEJPTSBuZWVkcyBubyBzZXBhcmF0b3I6IGl0IGlzIGEgYnl0ZSBtYXJrZXIsIG5vdCBhIGxpbmUuXG4gIGNvbnN0IHNlcGFyYXRvciA9IGZyb250TWF0dGVyID8gKC9cXHI/XFxuJC91LnRlc3QoZnJvbnRNYXR0ZXIpID8gbGluZUVuZGluZyA6IGAke2xpbmVFbmRpbmd9JHtsaW5lRW5kaW5nfWApIDogJyc7XG4gIGNvbnN0IHJlc3VsdCA9XG4gICAgcHJlZml4ICsgc2VwYXJhdG9yICsgW2hlYWQsIGJhZGdlcy5qb2luKGxpbmVFbmRpbmcpLCBib2R5XS5maWx0ZXIoQm9vbGVhbikuam9pbihgJHtsaW5lRW5kaW5nfSR7bGluZUVuZGluZ31gKTtcbiAgcmV0dXJuIGVuZHNXaXRoTmV3bGluZSA/IGAke3Jlc3VsdH0ke2xpbmVFbmRpbmd9YCA6IHJlc3VsdDtcbn1cblxuLyoqXG4gKiBBIG5vZGUncyBzdGFydCBvZmZzZXQsIGV4dGVuZGVkIGJhY2sgb3ZlciB0aGUgbGVhZGluZyB3aGl0ZXNwYWNlIG9uIGl0cyBvd24gbGluZS4gQ29tbW9uTWFya1xuICogYWxsb3dzIG9uZSB0byB0aHJlZSBzcGFjZXMgb2YgaW5kZW50YXRpb24gYmVmb3JlIGEgYmxvY2ssIGFuZCBtZGFzdCByZXBvcnRzIHRoZSBvZmZzZXQgQUZURVJcbiAqIHRoZW0g4oCUIHNvIHNsaWNpbmcgZnJvbSBpdCBzaWxlbnRseSByZWluZGVudHMgY29udGVudCB0aGlzIGdlbmVyYXRvciBwcm9taXNlcyB0byBjb3B5IHZlcmJhdGltLlxuICovXG5mdW5jdGlvbiBzdGFydE9mZnNldFdpdGhJbmRlbnQoY29udGVudDogc3RyaW5nLCBub2RlOiBSb290Q29udGVudCk6IG51bWJlciB7XG4gIGNvbnN0IHN0YXJ0ID0gbm9kZS5wb3NpdGlvbiEuc3RhcnQub2Zmc2V0ITtcbiAgY29uc3QgbGluZVN0YXJ0ID0gY29udGVudC5sYXN0SW5kZXhPZignXFxuJywgc3RhcnQgLSAxKSArIDE7XG4gIHJldHVybiAvXlsgXFx0XSokL3UudGVzdChjb250ZW50LnNsaWNlKGxpbmVTdGFydCwgc3RhcnQpKSA/IGxpbmVTdGFydCA6IHN0YXJ0O1xufVxuXG4vKipcbiAqIFdoZXRoZXIgdGhlIG5vZGUgb3BlbnMgdGhlIFJFQURNRSB3aXRoIGEgdGl0bGUuIE9ubHkgdGhlIEZJUlNUIHBpZWNlIG9mIGNvbnRlbnQgY2FuIGJlIG9uZTogYVxuICogdGl0bGUgaXMgd2hhdCBhIFJFQURNRSBvcGVucyB3aXRoLCBhbmQgYW5jaG9yaW5nIHRoZSBiYWRnZXMgdG8gYSBoZWFkaW5nIGZ1cnRoZXIgZG93biB3b3VsZCBidXJ5XG4gKiB0aGVtIGJlbG93IGNvbnRlbnQgdGhlIGF1dGhvciBwdXQgZmlyc3QuXG4gKi9cbmZ1bmN0aW9uIGlzVGl0bGVOb2RlKG5vZGU6IFJvb3RDb250ZW50IHwgdW5kZWZpbmVkKTogYm9vbGVhbiB7XG4gIGlmICghbm9kZSkgcmV0dXJuIGZhbHNlO1xuICBpZiAobm9kZS50eXBlID09PSAnaGVhZGluZycpIHJldHVybiB0cnVlO1xuICAvLyBNYW55IFJFQURNRXMgY2VudGVyIHRoZWlyIHRpdGxlIGluIEhUTUwgKGA8aDE+YCwgb3IgYSBgPGRpdj5gL2A8cD5gIHdyYXBwaW5nIG9uZSksIHdoaWNoIHRoZVxuICAvLyBwYXJzZXIgcmVwb3J0cyBhcyBvbmUgb3BhcXVlIEhUTUwgYmxvY2s7IHRoZSBiYWRnZXMgZ28gYWZ0ZXIgdGhlIHdob2xlIGJsb2NrLlxuICByZXR1cm4gbm9kZS50eXBlID09PSAnaHRtbCcgJiYgY29udGFpbnNSZW5kZXJlZEgxKG5vZGUudmFsdWUpO1xufVxuXG4vKipcbiAqIFdoZXRoZXIgdGhlIEhUTUwgYmxvY2sgdW5hbWJpZ3VvdXNseSBSRU5ERVJTIGFuIGA8aDE+YCDigJQgdGhlIGNlbnRlcmVkLXRpdGxlIGxheW91dCBtYW55IFJFQURNRXNcbiAqIHVzZSAoYDxoMT5gLCBvciBhIGA8ZGl2PmAvYDxwPmAgd3JhcHBpbmcgb25lKS5cbiAqXG4gKiBEZWxpYmVyYXRlbHkgTk9UIGEgZ2VuZXJhbCBIVE1MIHBhcnNlci4gRGVjaWRpbmcgdGhpcyBleGFjdGx5IHJlcXVpcmVzIHRoZSByZWFsIHRva2VuaXplcidzXG4gKiBzdGF0ZXMg4oCUIHJhdyB0ZXh0LCBSQ0RBVEEsIHNjcmlwdCBkYXRhLCBhdHRyaWJ1dGUgdmFsdWVzLCB0ZW1wbGF0ZSBjb250ZW50cywgZGVjbGFyYXRpb25zIOKAlCBhbmRcbiAqIGFwcHJveGltYXRpbmcgdGhlbSB3aXRoIHJlZ2V4ZXMgaXMgdGhlIHNhbWUgbG9zaW5nIGdhbWUgdGhlIE1hcmtkb3duIHNjYW5uaW5nIHRoaXMgbW9kdWxlXG4gKiByZXBsYWNlZCB3YXMgcGxheWluZy4gU28gdGhlIHJ1bGUgaXM6IHRva2VuaXplIG9ubHkgdGhlIHNpbXBsZSBjYXNlLCBhbmQgdHJlYXQgYW55dGhpbmcgY2FycnlpbmdcbiAqIGEgY29uc3RydWN0IHdob3NlIHBhcnNpbmcgZGVwZW5kcyBvbiB0aG9zZSBzdGF0ZXMgYXMgTk9UIGEgdGl0bGUuIEJlaW5nIHdyb25nIHRoYXQgd2F5IHB1dHMgdGhlXG4gKiBiYWRnZXMgYXQgdGhlIHRvcCBvZiB0aGUgZmlsZSwgd2hpY2ggaXMgbWVyZWx5IHVuaGVscGZ1bDsgYmVpbmcgd3JvbmcgdGhlIG90aGVyIHdheSByZXdyaXRlcyB0aGVcbiAqIHVzZXIncyBSRUFETUUgYXJvdW5kIHRoZSB3cm9uZyBhbmNob3IuXG4gKi9cbmZ1bmN0aW9uIGNvbnRhaW5zUmVuZGVyZWRIMShodG1sOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgLy8gQ29tbWVudHMgY2Fubm90IG5lc3QgYW5kIGVuZCB1bmFtYmlndW91c2x5LCBzbyB0aGV5IGFyZSBzaW1wbHkgcmVtb3ZlZCByYXRoZXIgdGhhbiBkaXNxdWFsaWZ5aW5nLlxuICBjb25zdCB3aXRob3V0Q29tbWVudHMgPSBodG1sLnJlcGxhY2VBbGwoLzwhLS1bXFxzXFxTXSo/KD86LS0+fCQpL2d1LCAnJyk7XG4gIC8vIENEQVRBLCBwcm9jZXNzaW5nIGluc3RydWN0aW9ucywgZGVjbGFyYXRpb25zLCBlbGVtZW50cyB3aG9zZSBjb250ZW50IGlzIHJhdyB0ZXh0IC8gUkNEQVRBIC9cbiAgLy8gc2NyaXB0IGRhdGEsIGFuZCBgPHRlbXBsYXRlPmAgKHdob3NlIGNvbnRlbnRzIGFyZSBpbmVydCkuIEEgcXVvdGVkIGF0dHJpYnV0ZSBjb250YWluaW5nIGA8YFxuICAvLyBtYWtlcyBldmVuIGxvY2F0aW5nIHRoZXNlIHVucmVsaWFibGUsIHNvIGl0IGRpc3F1YWxpZmllcyB0aGUgYmxvY2sgdG9vLlxuICBjb25zdCBhbWJpZ3VvdXNDb25zdHJ1Y3RQYXR0ZXJuID1cbiAgICAvPCFcXFtDREFUQVxcW3w8XFw/fDwhW2EtekEtWl18PFxcLz8oPzpzY3JpcHR8c3R5bGV8dGV4dGFyZWF8dGl0bGV8aWZyYW1lfG5vZnJhbWVzfG5vZW1iZWR8eG1wfHRlbXBsYXRlKVxcYnxcIlteXCJdKjxbXlwiXSpcInwnW14nXSo8W14nXSonL2l1O1xuICBpZiAoYW1iaWd1b3VzQ29uc3RydWN0UGF0dGVybi50ZXN0KHdpdGhvdXRDb21tZW50cykpIHJldHVybiBmYWxzZTtcbiAgLy8gUXVvdGluZyBpcyBzaWduaWZpY2FudCBvbmx5IGluc2lkZSBhIHN0YXJ0IHRhZywgc28gYW4gYXR0cmlidXRlIHZhbHVlIGlzIGNvbnN1bWVkIHdpdGggaXRzIG93blxuICAvLyB0YWcgd2hpbGUgcXVvdGF0aW9uIG1hcmtzIGluIG9yZGluYXJ5IHRleHQgc3RheSB0ZXh0OiBgPGRpdiB0aXRsZT1cIiZsdDtoMSZndDtcIj5gIGRvZXMgbm90IGNvdW50LFxuICAvLyBgXCI8aDE+UHJvamVjdDwvaDE+XCJgIGRvZXMuXG4gIGNvbnN0IHN0YXJ0VGFnUGF0dGVybiA9IC88KFthLXpBLVpdW15cXHMvPl0qKSg/OlwiW15cIl0qXCJ8J1teJ10qJ3xbXj5cIiddKSo+L2d1O1xuICBmb3IgKGNvbnN0IG1hdGNoIG9mIHdpdGhvdXRDb21tZW50cy5tYXRjaEFsbChzdGFydFRhZ1BhdHRlcm4pKSB7XG4gICAgaWYgKG1hdGNoWzFdPy50b0xvd2VyQ2FzZSgpID09PSAnaDEnKSByZXR1cm4gdHJ1ZTtcbiAgfVxuICByZXR1cm4gZmFsc2U7XG59XG5cbi8qKiBXaGV0aGVyIHRoZSBub2RlIGlzIGEgcGFyYWdyYXBoIG9mIGJhZGdlcyBhbmQgbm90aGluZyBlbHNlIOKAlCB0aGUgb25seSBjb250ZW50IHdiZnkgcHV0cyBpbiB0aGUgYmxvY2suICovXG5mdW5jdGlvbiBpc0JhZGdlQmxvY2tOb2RlKG5vZGU6IFJvb3RDb250ZW50KTogbm9kZSBpcyBQYXJhZ3JhcGgge1xuICByZXR1cm4gKFxuICAgIG5vZGUudHlwZSA9PT0gJ3BhcmFncmFwaCcgJiZcbiAgICBub2RlLmNoaWxkcmVuLnNvbWUoKGNoaWxkKSA9PiBpc0JhZGdlTm9kZShjaGlsZCkpICYmXG4gICAgbm9kZS5jaGlsZHJlbi5ldmVyeShcbiAgICAgIChjaGlsZCkgPT4gaXNCYWRnZU5vZGUoY2hpbGQpIHx8IGNoaWxkLnR5cGUgPT09ICdicmVhaycgfHwgKGNoaWxkLnR5cGUgPT09ICd0ZXh0JyAmJiAhY2hpbGQudmFsdWUudHJpbSgpKVxuICAgIClcbiAgKTtcbn1cblxuLyoqIEEgYmFkZ2UgaXMgb25lIGBbIVthbHRdKGltYWdlKV0obGluaylgLCB0aGUgb25seSBzaGFwZSB3YmZ5IGV2ZXIgd3JpdGVzLiAqL1xuZnVuY3Rpb24gaXNCYWRnZU5vZGUobm9kZTogUm9vdENvbnRlbnQgfCBQaHJhc2luZ0NvbnRlbnQpOiBub2RlIGlzIExpbmsgJiB7IGNoaWxkcmVuOiBbSW1hZ2VdIH0ge1xuICByZXR1cm4gbm9kZS50eXBlID09PSAnbGluaycgJiYgbm9kZS5jaGlsZHJlbi5sZW5ndGggPT09IDEgJiYgbm9kZS5jaGlsZHJlblswXT8udHlwZSA9PT0gJ2ltYWdlJztcbn1cblxuLyoqXG4gKiBUaGUgYmFkZ2VzIGluIHRoZSBibG9jaywgYXMgdGhlIGV4YWN0IHNvdXJjZSB0ZXh0IHRoYXQgcHJvZHVjZWQgdGhlbTogYSBiYWRnZSB3YmZ5IGRvZXMgbm90IG1hbmFnZVxuICogaXMgd3JpdHRlbiBiYWNrIGJ5dGUgZm9yIGJ5dGUgaW5zdGVhZCBvZiBiZWluZyByZS1zZXJpYWxpemVkIGZyb20gdGhlIHRyZWUuXG4gKi9cbmZ1bmN0aW9uIHJlYWRCYWRnZXMobm9kZTogUGFyYWdyYXBoLCBjb250ZW50OiBzdHJpbmcpOiBzdHJpbmdbXSB7XG4gIHJldHVybiBub2RlLmNoaWxkcmVuXG4gICAgLmZpbHRlcigoY2hpbGQpID0+IGlzQmFkZ2VOb2RlKGNoaWxkKSlcbiAgICAubWFwKChjaGlsZCkgPT4gY29udGVudC5zbGljZShjaGlsZC5wb3NpdGlvbiEuc3RhcnQub2Zmc2V0LCBjaGlsZC5wb3NpdGlvbiEuZW5kLm9mZnNldCkpO1xufVxuXG4vKipcbiAqIFBlcmNlbnQtZW5jb2RlcyB0aGUgY2hhcmFjdGVycyB0aGF0IHdvdWxkIGVuZCBhIE1hcmtkb3duIGRlc3RpbmF0aW9uIGVhcmx5LiBBIHdvcmtmbG93IGZpbGUgbWF5IGJlXG4gKiBuYW1lZCBhbnl0aGluZyB3aXRoIGEgYC55bWxgIGV4dGVuc2lvbiwgYW5kIG9uZSBjb250YWluaW5nIGAoYCBvciBgKWAgcHJvZHVjZWQgYSBiYWRnZSB0aGF0IHdiZnknc1xuICogb3duIGJhZGdlIHBhdHRlcm4gY291bGQgbm90IHJlYWQgYmFjayDigJQgc28gdGhlIGxpbmUgbGVmdCB0aGUgYmxvY2sgYW5kIHRoZSBiYWRnZSB3YXMgZHVwbGljYXRlZC5cbiAqL1xuZnVuY3Rpb24gZW5jb2RlVXJsUGF0aCh2YWx1ZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIHZhbHVlLnJlcGxhY2VBbGwoL1soKVxcc10vZ3UsIChjaGFyYWN0ZXIpID0+IGAlJHtjaGFyYWN0ZXIuY29kZVBvaW50QXQoMCkhLnRvU3RyaW5nKDE2KS50b1VwcGVyQ2FzZSgpfWApO1xufVxuXG4vKiogV2hldGhlciB0aGUgYmFkZ2UgaXMgb25lIHdiZnkgd3JpdGVzIGl0c2VsZiwgYW5kIHNvIG1heSBiZSByZXBsYWNlZCBieSB0aGUgY3VycmVudCBibG9jay4gKi9cbmZ1bmN0aW9uIGlzTWFuYWdlZEJhZGdlKGJhZGdlOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgcmV0dXJuIGJhZGdlID09PSBzZW1hbnRpY1JlbGVhc2VCYWRnZSB8fCBtYW5hZ2VkQmFkZ2VQYXR0ZXJucy5zb21lKChwYXR0ZXJuKSA9PiBwYXR0ZXJuLnRlc3QoYmFkZ2UpKTtcbn1cblxuZnVuY3Rpb24gZ2V0TGluZUVuZGluZyhjb250ZW50OiBzdHJpbmcpOiAnXFxuJyB8ICdcXHJcXG4nIHtcbiAgcmV0dXJuIGNvbnRlbnQuaW5jbHVkZXMoJ1xcclxcbicpID8gJ1xcclxcbicgOiAnXFxuJztcbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCBtZXJnZSBmcm9tICdkZWVwbWVyZ2UnO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBmc1V0aWwgfSBmcm9tICcuLi91dGlscy9mc1V0aWwuanMnO1xuaW1wb3J0IHsgb3ZlcndyaXRlTWVyZ2UgfSBmcm9tICcuLi91dGlscy9tZXJnZVV0aWwuanMnO1xuaW1wb3J0IHsgcHJvbWlzZVBvb2wgfSBmcm9tICcuLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZW5lcmF0ZVJlbGVhc2VyYyhyb290Q29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZ2VuZXJhdGVSZWxlYXNlcmMnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLnJlc29sdmUocm9vdENvbmZpZy5kaXJQYXRoLCAnLnJlbGVhc2VyYy5qc29uJyk7XG4gICAgaWYgKCFmcy5leGlzdHNTeW5jKGZpbGVQYXRoKSkgcmV0dXJuO1xuXG4gICAgY29uc3Qgc2V0dGluZ3MgPSBKU09OLnBhcnNlKGF3YWl0IGZzLnByb21pc2VzLnJlYWRGaWxlKGZpbGVQYXRoLCAndXRmOCcpKSBhcyB7XG4gICAgICBwbHVnaW5zPzogKHN0cmluZyB8IFtzdHJpbmcsIHVua25vd25dKVtdO1xuICAgICAgZXh0ZW5kcz86IHVua25vd247XG4gICAgfTtcbiAgICBjb25zdCBwbHVnaW5zID0gc2V0dGluZ3MucGx1Z2lucyA/PyBbXTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHBsdWdpbnMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNvbnN0IHBsdWdpbkVudHJ5ID0gcGx1Z2luc1tpXTtcbiAgICAgIGNvbnN0IGlzQXJyYXkgPSBBcnJheS5pc0FycmF5KHBsdWdpbkVudHJ5KTtcbiAgICAgIGNvbnN0IHBsdWdpbiA9IGlzQXJyYXkgPyBwbHVnaW5FbnRyeVswXSA6IHBsdWdpbkVudHJ5O1xuICAgICAgY29uc3Qgb2xkQ29uZmlnID0gKGlzQXJyYXkgJiYgcGx1Z2luRW50cnlbMV0pIHx8IHt9O1xuICAgICAgaWYgKHBsdWdpbiA9PT0gJ0BzZW1hbnRpYy1yZWxlYXNlL2NvbW1pdC1hbmFseXplcicpIHtcbiAgICAgICAgcGx1Z2luc1tpXSA9IFtcbiAgICAgICAgICAnQHNlbWFudGljLXJlbGVhc2UvY29tbWl0LWFuYWx5emVyJyxcbiAgICAgICAgICBtZXJnZS5hbGwoXG4gICAgICAgICAgICBbXG4gICAgICAgICAgICAgIG9sZENvbmZpZyxcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHByZXNldDogJ2NvbnZlbnRpb25hbGNvbW1pdHMnLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIHsgYXJyYXlNZXJnZTogb3ZlcndyaXRlTWVyZ2UgfVxuICAgICAgICAgICksXG4gICAgICAgIF07XG4gICAgICB9IGVsc2UgaWYgKHBsdWdpbiA9PT0gJ0BzZW1hbnRpYy1yZWxlYXNlL2dpdGh1YicpIHtcbiAgICAgICAgcGx1Z2luc1tpXSA9IFtcbiAgICAgICAgICAnQHNlbWFudGljLXJlbGVhc2UvZ2l0aHViJyxcbiAgICAgICAgICBtZXJnZS5hbGwoXG4gICAgICAgICAgICBbXG4gICAgICAgICAgICAgIG9sZENvbmZpZyxcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIC8vIGNmLiBodHRwczovL2dpdGh1Yi5jb20vc2VtYW50aWMtcmVsZWFzZS9zZW1hbnRpYy1yZWxlYXNlL2lzc3Vlcy8yMjA0I2lzc3VlY29tbWVudC0xNTA4NDE3NzA0XG4gICAgICAgICAgICAgICAgc3VjY2Vzc0NvbW1lbnRDb25kaXRpb246IGZhbHNlLFxuICAgICAgICAgICAgICAgIGZhaWxDb21tZW50Q29uZGl0aW9uOiBmYWxzZSxcbiAgICAgICAgICAgICAgICBsYWJlbHM6IFsncjogc2VtYW50aWMtcmVsZWFzZSddLFxuICAgICAgICAgICAgICAgIHJlbGVhc2VkTGFiZWxzOiBbJ3JlbGVhc2VkIDpib29rbWFyazonXSxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICB7IGFycmF5TWVyZ2U6IG92ZXJ3cml0ZU1lcmdlIH1cbiAgICAgICAgICApLFxuICAgICAgICBdO1xuICAgICAgfVxuICAgIH1cbiAgICBjb25zdCBuZXdDb250ZW50ID0gSlNPTi5zdHJpbmdpZnkoc2V0dGluZ3MsIHVuZGVmaW5lZCwgMik7XG4gICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzVXRpbC5nZW5lcmF0ZUZpbGUoZmlsZVBhdGgsIG5ld0NvbnRlbnQpKTtcbiAgfSk7XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgbWVyZ2UgZnJvbSAnZGVlcG1lcmdlJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZnNVdGlsIH0gZnJvbSAnLi4vdXRpbHMvZnNVdGlsLmpzJztcbmltcG9ydCB7IGpzb25jVXRpbCB9IGZyb20gJy4uL3V0aWxzL2pzb25jVXRpbC5qcyc7XG5pbXBvcnQgeyBvdmVyd3JpdGVNZXJnZSB9IGZyb20gJy4uL3V0aWxzL21lcmdlVXRpbC5qcyc7XG5cbmNvbnN0IHNoYXJlZFByZXNldCA9ICdnaXRodWI+V2lsbEJvb3N0ZXIvd2lsbGJvb3N0ZXItY29uZmlnczpyZW5vdmF0ZS5qc29uYyc7XG5jb25zdCBnZW5lcmF0ZWRTZXR0aW5ncyA9IHtcbiAgJHNjaGVtYTogJ2h0dHBzOi8vZG9jcy5yZW5vdmF0ZWJvdC5jb20vcmVub3ZhdGUtc2NoZW1hLmpzb24nLFxuICBleHRlbmRzOiBbc2hhcmVkUHJlc2V0XSxcbn07XG5cbnR5cGUgU2V0dGluZ3MgPSBQYXJ0aWFsPHR5cGVvZiBnZW5lcmF0ZWRTZXR0aW5ncz4gJiB7XG4gIHBhY2thZ2VSdWxlcz86IHsgbWF0Y2hQYWNrYWdlTmFtZXM6IHN0cmluZ1tdOyBlbmFibGVkPzogYm9vbGVhbiB9W107XG59O1xuXG5jb25zdCBtYW5hZ2VkRmlsZU5hbWUgPSAncmVub3ZhdGUuanNvbmMnO1xuXG4vLyB3YmZ5IHN1cHBvcnRzIG9uZSBjYW5vbmljYWwgUmVub3ZhdGUgbG9jYXRpb24uIE5vbi1jYW5vbmljYWwgY29uZmlncyBhcmUgZml4ZWQgaW4gdGhlIHRhcmdldFxuLy8gcmVwb3NpdG9yeSBpbnN0ZWFkIG9mIGJlaW5nIHBhcnNlZCwgbWVyZ2VkLCBvciBkZWxldGVkIGhlcmUuXG5jb25zdCBub25DYW5vbmljYWxDb25maWdQYXRocyA9IFtcbiAgJ3Jlbm92YXRlLmpzb24nLFxuICAncmVub3ZhdGUuanNvbjUnLFxuICAnLmdpdGh1Yi9yZW5vdmF0ZS5qc29uJyxcbiAgJy5naXRodWIvcmVub3ZhdGUuanNvbmMnLFxuICAnLmdpdGh1Yi9yZW5vdmF0ZS5qc29uNScsXG4gICcucmVub3ZhdGVyYycsXG4gICcucmVub3ZhdGVyYy5qc29uJyxcbiAgJy5yZW5vdmF0ZXJjLmpzb241Jyxcbl07XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZW5lcmF0ZVJlbm92YXRlSnNvbmMoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZ2VuZXJhdGVSZW5vdmF0ZUpzb25jJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCBtYW5hZ2VkRmlsZU5hbWUpO1xuICAgIGNvbnN0IG1hbmFnZWRGaWxlU3RhdHMgPSBhd2FpdCBmcy5wcm9taXNlcy5sc3RhdChmaWxlUGF0aCkuY2F0Y2goKCkgPT4ge30pO1xuICAgIGlmIChtYW5hZ2VkRmlsZVN0YXRzPy5pc1N5bWJvbGljTGluaygpKSB7XG4gICAgICBjb25zb2xlLndhcm4oYFNraXBwZWQgZ2VuZXJhdGluZyAke2ZpbGVQYXRofSBiZWNhdXNlIGl0IGlzIGEgc3ltYm9saWMgbGluay5gKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBub25DYW5vbmljYWxDb25maWdDYW5kaWRhdGVzID0gYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgICBub25DYW5vbmljYWxDb25maWdQYXRocy5tYXAoYXN5bmMgKHJlbGF0aXZlUGF0aCkgPT4ge1xuICAgICAgICBjb25zdCBjYW5kaWRhdGUgPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsIHJlbGF0aXZlUGF0aCk7XG4gICAgICAgIHJldHVybiAoYXdhaXQgZnMucHJvbWlzZXMubHN0YXQoY2FuZGlkYXRlKS5jYXRjaCgoKSA9PiB7fSkpID8gY2FuZGlkYXRlIDogdW5kZWZpbmVkO1xuICAgICAgfSlcbiAgICApO1xuICAgIGNvbnN0IG5vbkNhbm9uaWNhbENvbmZpZ1BhdGggPSBub25DYW5vbmljYWxDb25maWdDYW5kaWRhdGVzLmZpbmQoKGNhbmRpZGF0ZSkgPT4gY2FuZGlkYXRlICE9PSB1bmRlZmluZWQpO1xuICAgIGlmIChub25DYW5vbmljYWxDb25maWdQYXRoIHx8IGNvbmZpZy5wYWNrYWdlSnNvbj8ucmVub3ZhdGUpIHtcbiAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgYFNraXBwZWQgZ2VuZXJhdGluZyAke2ZpbGVQYXRofSBiZWNhdXNlIHRoZSByZXBvc2l0b3J5IGhhcyBhIG5vbi1jYW5vbmljYWwgUmVub3ZhdGUgY29uZmlnJHtcbiAgICAgICAgICBub25DYW5vbmljYWxDb25maWdQYXRoID8gYCBhdCAke25vbkNhbm9uaWNhbENvbmZpZ1BhdGh9YCA6ICcgaW4gcGFja2FnZS5qc29uJ1xuICAgICAgICB9LmBcbiAgICAgICk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3Qgb2xkQ29udGVudCA9IGF3YWl0IGZzVXRpbC5yZWFkRmlsZUlmRXhpc3RzKGZpbGVQYXRoKTtcbiAgICBsZXQgb2xkU2V0dGluZ3M6IFNldHRpbmdzIHwgdW5kZWZpbmVkO1xuICAgIGlmIChvbGRDb250ZW50ICE9PSB1bmRlZmluZWQgJiYgIWpzb25jVXRpbC5pc1RyaXZpYU9ubHkob2xkQ29udGVudCkpIHtcbiAgICAgIG9sZFNldHRpbmdzID0ganNvbmNVdGlsLnBhcnNlT2JqZWN0SWdub3JpbmdFcnJvcjxTZXR0aW5ncz4ob2xkQ29udGVudCk7XG4gICAgICBpZiAoIW9sZFNldHRpbmdzKSB7XG4gICAgICAgIGNvbnNvbGUud2FybihgU2tpcHBlZCBnZW5lcmF0aW5nICR7ZmlsZVBhdGh9IGJlY2F1c2UgdGhlIGV4aXN0aW5nIGNvbnRlbnQgaXMgbm90IHBhcnNhYmxlIGFzIEpTT05DLmApO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKG9sZFNldHRpbmdzPy5leHRlbmRzICE9PSB1bmRlZmluZWQgJiYgIUFycmF5LmlzQXJyYXkob2xkU2V0dGluZ3MuZXh0ZW5kcykpIHtcbiAgICAgIGNvbnNvbGUud2FybihgU2tpcHBlZCBnZW5lcmF0aW5nICR7ZmlsZVBhdGh9IGJlY2F1c2UgXCJleHRlbmRzXCIgaXMgbm90IGFuIGFycmF5LmApO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCByZW1vdmVkUHJlc2V0ID0gb2xkU2V0dGluZ3M/LmV4dGVuZHM/LmZpbmQoXG4gICAgICAocHJlc2V0KSA9PiBwcmVzZXQuc3RhcnRzV2l0aCgnZ2l0aHViPldpbGxCb29zdGVyL3dpbGxib29zdGVyLWNvbmZpZ3M6JykgJiYgcHJlc2V0ICE9PSBzaGFyZWRQcmVzZXRcbiAgICApO1xuICAgIGlmIChyZW1vdmVkUHJlc2V0KSB7XG4gICAgICBjb25zb2xlLndhcm4oYFNraXBwZWQgZ2VuZXJhdGluZyAke2ZpbGVQYXRofSBiZWNhdXNlIFwiJHtyZW1vdmVkUHJlc2V0fVwiIG5vIGxvbmdlciBleGlzdHM7IHJlbW92ZSBpdCBtYW51YWxseS5gKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBuZXdTZXR0aW5ncyA9IGJ1aWxkU2V0dGluZ3MoY29uZmlnLCBvbGRTZXR0aW5ncyk7XG4gICAgY29uc3QgeyBjb250ZW50LCBrZXlzTG9zaW5nQ29tbWVudHMgfSA9IGpzb25jVXRpbC5zdHJpbmdpZnlQcmVzZXJ2aW5nVHJpdmlhKFxuICAgICAgb2xkQ29udGVudCxcbiAgICAgIG5ld1NldHRpbmdzIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+XG4gICAgKTtcbiAgICBpZiAob2xkQ29udGVudCAhPT0gdW5kZWZpbmVkICYmIG5vcm1hbGl6ZShjb250ZW50KSA9PT0gbm9ybWFsaXplKG9sZENvbnRlbnQpKSByZXR1cm47XG4gICAgaWYgKCEoYXdhaXQgZnNVdGlsLmdlbmVyYXRlRmlsZShmaWxlUGF0aCwgY29udGVudCkpKSByZXR1cm47XG5cbiAgICBmb3IgKGNvbnN0IGtleSBvZiBrZXlzTG9zaW5nQ29tbWVudHMpIHtcbiAgICAgIGNvbnNvbGUud2FybihgQ29tbWVudHMgaW5zaWRlIFwiJHtrZXl9XCIgd2VyZSBkcm9wcGVkIHdoaWxlIHJld3JpdGluZyBpdCBpbiAke2ZpbGVQYXRofS5gKTtcbiAgICB9XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBidWlsZFNldHRpbmdzKGNvbmZpZzogUGFja2FnZUNvbmZpZywgb2xkU2V0dGluZ3M6IFNldHRpbmdzIHwgdW5kZWZpbmVkKTogU2V0dGluZ3Mge1xuICBjb25zdCBzZXR0aW5ncyA9IG9sZFNldHRpbmdzXG4gICAgPyAobWVyZ2UuYWxsKFtnZW5lcmF0ZWRTZXR0aW5ncywgb2xkU2V0dGluZ3MsIGdlbmVyYXRlZFNldHRpbmdzXSwge1xuICAgICAgICBhcnJheU1lcmdlOiBvdmVyd3JpdGVNZXJnZSxcbiAgICAgIH0pIGFzIFNldHRpbmdzKVxuICAgIDogc3RydWN0dXJlZENsb25lKGdlbmVyYXRlZFNldHRpbmdzKTtcbiAgY29uc3QgZXhpc3RpbmdFeHRlbmRzID0gb2xkU2V0dGluZ3M/LmV4dGVuZHMgPz8gW107XG4gIHNldHRpbmdzLmV4dGVuZHMgPSBjb25maWcuaXNXaWxsQm9vc3RlckNvbmZpZ3NcbiAgICA/IGV4aXN0aW5nRXh0ZW5kcy5maWx0ZXIoKHByZXNldCkgPT4gcHJlc2V0ICE9PSBzaGFyZWRQcmVzZXQpXG4gICAgOiBleGlzdGluZ0V4dGVuZHMuaW5jbHVkZXMoc2hhcmVkUHJlc2V0KVxuICAgICAgPyBleGlzdGluZ0V4dGVuZHNcbiAgICAgIDogW3NoYXJlZFByZXNldCwgLi4uZXhpc3RpbmdFeHRlbmRzXTtcbiAgcmV0dXJuIHNldHRpbmdzO1xufVxuXG5mdW5jdGlvbiBub3JtYWxpemUoY29udGVudDogc3RyaW5nKTogc3RyaW5nIHtcbiAgY29uc3QgdHJpbW1lZENvbnRlbnQgPSBjb250ZW50LnRyaW0oKTtcbiAgcmV0dXJuIHRyaW1tZWRDb250ZW50ID8gdHJpbW1lZENvbnRlbnQgKyAnXFxuJyA6ICcnO1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IG1lcmdlIGZyb20gJ2RlZXBtZXJnZSc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VKc29uLCBUc0NvbmZpZ0pzb24gfSBmcm9tICd0eXBlLWZlc3QnO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBmc1V0aWwgfSBmcm9tICcuLi91dGlscy9mc1V0aWwuanMnO1xuaW1wb3J0IHsganNvbmNVdGlsIH0gZnJvbSAnLi4vdXRpbHMvanNvbmNVdGlsLmpzJztcbmltcG9ydCB7IGNvbWJpbmVNZXJnZSB9IGZyb20gJy4uL3V0aWxzL21lcmdlVXRpbC5qcyc7XG5pbXBvcnQgeyBzb3J0S2V5cyB9IGZyb20gJy4uL3V0aWxzL29iamVjdFV0aWwuanMnO1xuaW1wb3J0IHsgcHJvbWlzZVBvb2wgfSBmcm9tICcuLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5pbXBvcnQgeyBnZXRUc2NvbmZpZ0V4dGVuZHMgfSBmcm9tICcuLi91dGlscy90c2NvbmZpZ0Jhc2UuanMnO1xuaW1wb3J0IHtcbiAgZ2V0TWVhbmluZ2Z1bERlY2xhcmVkV29ya3NwYWNlUGF0dGVybnMsXG4gIGdldFdvcmtzcGFjZURpclBhdHRlcm5zLFxuICBnZXRXb3Jrc3BhY2VTdWJEaXJQYXRocyxcbn0gZnJvbSAnLi4vdXRpbHMvd29ya3NwYWNlVXRpbC5qcyc7XG5cbmNvbnN0IHN1Ykpzb25PYmogPSB7XG4gIGNvbXBpbGVyT3B0aW9uczoge1xuICAgIGFsd2F5c1N0cmljdDogdHJ1ZSxcbiAgICBub1VuY2hlY2tlZEluZGV4ZWRBY2Nlc3M6IHRydWUsIC8vIGZvciBAdHlwZXNjcmlwdC1lc2xpbnQvcHJlZmVyLW51bGxpc2gtY29hbGVzY2luZ1xuICAgIGFsbG93U3ludGhldGljRGVmYXVsdEltcG9ydHM6IHRydWUsIC8vIGFsbG93IGBpbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnYFxuICAgIGVzTW9kdWxlSW50ZXJvcDogdHJ1ZSwgLy8gYWxsb3cgZGVmYXVsdCBpbXBvcnQgZnJvbSBDb21tb25KUy9BTUQvVU1EIG1vZHVsZXNcbiAgICByZXNvbHZlSnNvbk1vZHVsZTogdHJ1ZSwgLy8gYWxsb3cgdG8gaW1wb3J0IEpTT04gZmlsZXNcbiAgICBpbXBvcnRIZWxwZXJzOiBmYWxzZSxcbiAgICBub0VtaXQ6IHRydWUsXG4gIH0sXG4gIGV4Y2x1ZGU6IFsndGVzdC9maXh0dXJlcyddLFxuICAvLyB3YmZ5IGdlbmVyYXRlcyByb290LWxldmVsIHRvb2wgY29uZmlncyBzdWNoIGFzIHBsYXl3cmlnaHQuY29uZmlnLnRzLCBhbmRcbiAgLy8gdHlwZS1hd2FyZSBsaW50aW5nIG5lZWRzIHRob3NlIGZpbGVzIGluIHRoZSBwcm9qZWN0IHRvIHNlZSBOb2RlL0J1biBnbG9iYWxzLlxuICAvLyBgYXBwLyoqYCBpcyBkZWxpYmVyYXRlbHkgYWJzZW50IGV2ZW4gdGhvdWdoIHRoZSBkb2VzQ29udGFpbipTY3JpcHQgc2lnbmFscyBzY2FuIGl0OiBhcHBcbiAgLy8gZGlyZWN0b3JpZXMgYmVsb25nIHRvIGZyYW1ld29yayBwYWNrYWdlcyAoTmV4dC5qcy9CbGl0eiksIHdoaWNoIG93biB0aGVpciB0c2NvbmZpZ1xuICAvLyAoZ2VuZXJhdGVUc2NvbmZpZyBza2lwcyB0aGVtKSwgYW5kIGNoZWNraW5nIGZyYW1ld29yayBzb3VyY2VzIHVuZGVyIHRoaXMgcHJvamVjdCdzIGNvbXBpbGVyXG4gIC8vIG9wdGlvbnMgd291bGQgcHJvZHVjZSBmYWxzZSBlcnJvcnMuXG4gIGluY2x1ZGU6IFsnKi5jb25maWcudHMnLCAnc2NyaXB0cy8qKi8qJywgJ3NyYy8qKi8qJywgJ3Rlc3QvKiovKiddLFxufTtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlVHNjb25maWcoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZ2VuZXJhdGVUc2NvbmZpZycsIGFzeW5jICgpID0+IHtcbiAgICAvLyB2aW5leHQgaXMgdGhlIG9yZydzIE5leHQuanMtZXF1aXZhbGVudCBmcmFtZXdvcmsgYW5kIG93bnMgaXRzIHRzY29uZmlnIGp1c3QgbGlrZSBOZXh0L0JsaXR6LFxuICAgIC8vIHNvIGl0IG11c3Qgc2tpcCB0aGUgc3RhbmRhcmQgZ2VuZXJhdGlvbiB0aGF0IHdvdWxkIG92ZXJ3cml0ZSB0aGUgZnJhbWV3b3JrJ3Mgb3duIHNldHRpbmdzLlxuICAgIGlmIChjb25maWcuZGVwZW5kaW5nLmJsaXR6IHx8IGNvbmZpZy5kZXBlbmRpbmcubmV4dCB8fCBjb25maWcuZGVwZW5kaW5nLnZpbmV4dCkge1xuICAgICAgYXdhaXQgbm9ybWFsaXplRnJhbWV3b3JrVHNjb25maWcoY29uZmlnKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBsZXQgbmV3U2V0dGluZ3MgPSAoY29uZmlnLmlzUm9vdCA/IGJ1aWxkUm9vdEpzb25PYmooY29uZmlnKSA6IHN0cnVjdHVyZWRDbG9uZShzdWJKc29uT2JqKSkgYXMgVHNDb25maWdKc29uO1xuICAgIGNvbnN0IGdlbmVyYXRlZFR5cGVzID0gZ2V0R2VuZXJhdGVkVHlwZXMoY29uZmlnKTtcbiAgICBuZXdTZXR0aW5ncy5leHRlbmRzID0gZ2V0VHNjb25maWdFeHRlbmRzKGNvbmZpZyk7XG4gICAgbmV3U2V0dGluZ3MuY29tcGlsZXJPcHRpb25zID8/PSB7fTtcbiAgICBuZXdTZXR0aW5ncy5jb21waWxlck9wdGlvbnMucm9vdERpciA9IGdldFJvb3REaXIoY29uZmlnKTtcbiAgICBpZiAoZ2VuZXJhdGVkVHlwZXMubGVuZ3RoID4gMCkge1xuICAgICAgbmV3U2V0dGluZ3MuY29tcGlsZXJPcHRpb25zID0geyAuLi5uZXdTZXR0aW5ncy5jb21waWxlck9wdGlvbnMsIHR5cGVzOiBnZW5lcmF0ZWRUeXBlcyB9O1xuICAgIH1cbiAgICBpZiAoIWNvbmZpZy5kb2VzQ29udGFpbkpzeE9yVHN4ICYmICFjb25maWcuZG9lc0NvbnRhaW5Kc3hPclRzeEluUGFja2FnZXMpIHtcbiAgICAgIGRlbGV0ZSBuZXdTZXR0aW5ncy5jb21waWxlck9wdGlvbnM/LmpzeDtcbiAgICB9XG4gICAgaWYgKGNvbmZpZy5kZXBlbmRpbmcucHJpc21hKSB7XG4gICAgICAvLyBQcmlzbWEgc2VlZHMgYW5kIG1pZ3JhdGlvbiBoZWxwZXIgc2NyaXB0cyBvZnRlbiBsaXZlIG91dHNpZGUgc3JjLCBidXRcbiAgICAgIC8vIHR5cGUtYXdhcmUgbGludGluZyBzdGlsbCBuZWVkcyB0aGVtIGNvdmVyZWQgYnkgdGhlIHByb2plY3QgY29uZmlnLlxuICAgICAgYWRkSW5jbHVkZVBhdGgobmV3U2V0dGluZ3MsICdwcmlzbWEvKiovKicpO1xuICAgIH1cblxuICAgIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAndHNjb25maWcuanNvbicpO1xuICAgIGNvbnN0IGV4aXN0aW5nQ29udGVudCA9IGF3YWl0IGZzVXRpbC5yZWFkRmlsZUlmRXhpc3RzKGZpbGVQYXRoKTtcbiAgICBsZXQgb3JpZ2luYWxTZXR0aW5nc0pzb246IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgICAvLyBBIGZpbGUgd2l0aCBubyBjb25maWd1cmF0aW9uIChlbXB0eSBvciBjb21tZW50LW9ubHkpIGlzIHRyZWF0ZWQgbGlrZSBhIG1pc3Npbmcgb25lLCBhcyB0c2MgZG9lcy5cbiAgICBpZiAoZXhpc3RpbmdDb250ZW50ICE9PSB1bmRlZmluZWQgJiYgIWpzb25jVXRpbC5pc1RyaXZpYU9ubHkoZXhpc3RpbmdDb250ZW50KSkge1xuICAgICAgY29uc3Qgb2xkU2V0dGluZ3MgPSBqc29uY1V0aWwucGFyc2VPYmplY3RJZ25vcmluZ0Vycm9yPFRzQ29uZmlnSnNvbj4oZXhpc3RpbmdDb250ZW50KTtcbiAgICAgIC8vIEFuIGV4aXN0aW5nIHRzY29uZmlnLmpzb24gd2JmeSBjYW5ub3QgcGFyc2UgbXVzdCBiZSBsZWZ0IHVudG91Y2hlZDogd3JpdGluZyB0aGVcbiAgICAgIC8vIGdlbmVyYXRlZCBzZXR0aW5ncyB3aXRob3V0IG1lcmdpbmcgd291bGQgc2lsZW50bHkgZGlzY2FyZCB0aGUgcHJvamVjdCdzIGNvbmZpZ3VyYXRpb24uXG4gICAgICBpZiAoIW9sZFNldHRpbmdzKSB7XG4gICAgICAgIGNvbnNvbGUud2FybihgU2tpcHBlZCBnZW5lcmF0aW5nICR7ZmlsZVBhdGh9IGJlY2F1c2UgdGhlIGV4aXN0aW5nIGNvbnRlbnQgaXMgbm90IHBhcnNhYmxlIGFzIEpTT05DLmApO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBvcmlnaW5hbFNldHRpbmdzSnNvbiA9IEpTT04uc3RyaW5naWZ5KHNvcnRLZXlzKHN0cnVjdHVyZWRDbG9uZShvbGRTZXR0aW5ncykpKTtcbiAgICAgIGNvbnN0IGV4aXN0aW5nVHlwZXMgPSBub3JtYWxpemVTdHJpbmdBcnJheShvbGRTZXR0aW5ncy5jb21waWxlck9wdGlvbnM/LnR5cGVzKTtcbiAgICAgIGNvbnN0IGV4aXN0aW5nRW1pdE1ldGFkYXRhID0gcGlja0V4aXN0aW5nRW1pdE1ldGFkYXRhKG9sZFNldHRpbmdzLmNvbXBpbGVyT3B0aW9ucyk7XG4gICAgICBuZXdTZXR0aW5ncy5leHRlbmRzID0gbWVyZ2VUc2NvbmZpZ0V4dGVuZHMobmV3U2V0dGluZ3MuZXh0ZW5kcywgb2xkU2V0dGluZ3MuZXh0ZW5kcyk7XG4gICAgICBkZWxldGUgb2xkU2V0dGluZ3MuZXh0ZW5kcztcbiAgICAgIGRlbGV0ZSBvbGRTZXR0aW5ncy5jb21waWxlck9wdGlvbnM/LmpzeDtcbiAgICAgIGlmIChjb25maWcuaXNSb290KSB7XG4gICAgICAgIHJlbW92ZVN0YWxlTWFuYWdlZFdvcmtzcGFjZUVudHJpZXMoY29uZmlnLCBvbGRTZXR0aW5ncywgbmV3U2V0dGluZ3MpO1xuICAgICAgfVxuICAgICAgbmV3U2V0dGluZ3MgPSBtZXJnZS5hbGwoW25ld1NldHRpbmdzLCBvbGRTZXR0aW5ncywgbmV3U2V0dGluZ3NdLCB7IGFycmF5TWVyZ2U6IGNvbWJpbmVNZXJnZSB9KTtcbiAgICAgIG5ld1NldHRpbmdzLmluY2x1ZGUgPSBuZXdTZXR0aW5ncy5pbmNsdWRlPy5maWx0ZXIoXG4gICAgICAgIChkaXJQYXRoOiBzdHJpbmcpID0+XG4gICAgICAgICAgIWRpclBhdGguaW5jbHVkZXMoJ0B0eXBlcycpICYmICFkaXJQYXRoLmluY2x1ZGVzKCdfX3Rlc3RzX18vJykgJiYgIWRpclBhdGguaW5jbHVkZXMoJ3Rlc3RzLycpXG4gICAgICApO1xuICAgICAgbmV3U2V0dGluZ3MuY29tcGlsZXJPcHRpb25zID8/PSB7fTtcbiAgICAgIC8vIHdiZnktZ2VuZXJhdGVkIHRzY29uZmlnLmpzb24gaXMgYSBsaW50L3R5cGVjaGVjayBwcm9qZWN0LCBub3QgdGhlIGVtaXRcbiAgICAgIC8vIGNvbnRyYWN0LiBJdCBtdXN0IGtlZXAgcm9vdERpciBicm9hZCBlbm91Z2ggZm9yIHJvb3QgY29uZmlnIGZpbGVzLFxuICAgICAgLy8gc2NyaXB0cywgc3JjLCBhbmQgdGVzdHMuIGJ1aWxkLXRzIG93bnMgZW1pdCBhbmQgY3JlYXRlcyBhIHRlbXBvcmFyeVxuICAgICAgLy8gc3JjLW9ubHkgdHNjb25maWcgd2l0aCBub0VtaXQ9ZmFsc2UsIGVtaXREZWNsYXJhdGlvbk9ubHk9dHJ1ZSxcbiAgICAgIC8vIHJvb3REaXI9XCJzcmNcIiwgYW5kIGluY2x1ZGU9W1wic3JjLyoqLypcIl0sIHNvIHByZXNlcnZpbmcgbm9FbWl0PWZhbHNlIG9yXG4gICAgICAvLyByb290RGlyPVwic3JjXCIgaGVyZSB3b3VsZCBvbmx5IGJyZWFrIG5vbi1zcmMgdHlwZS1hd2FyZSBsaW50IGNvdmVyYWdlLlxuICAgICAgbmV3U2V0dGluZ3MuY29tcGlsZXJPcHRpb25zID0geyAuLi5uZXdTZXR0aW5ncy5jb21waWxlck9wdGlvbnMsIC4uLmV4aXN0aW5nRW1pdE1ldGFkYXRhIH07XG5cbiAgICAgIGNvbnN0IG1lcmdlZFR5cGVzID0gWy4uLm5ldyBTZXQoWy4uLmZpbHRlckV4aXN0aW5nVHlwZXMoZXhpc3RpbmdUeXBlcywgZ2VuZXJhdGVkVHlwZXMpLCAuLi5nZW5lcmF0ZWRUeXBlc10pXTtcbiAgICAgIGlmIChtZXJnZWRUeXBlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgIG5ld1NldHRpbmdzLmNvbXBpbGVyT3B0aW9ucy50eXBlcyA9IG1lcmdlZFR5cGVzO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZGVsZXRlIG5ld1NldHRpbmdzLmNvbXBpbGVyT3B0aW9ucy50eXBlcztcbiAgICAgIH1cbiAgICAgIGlmIChzaG91bGREZWxldGVUeXBlUm9vdHMoZ2VuZXJhdGVkVHlwZXMpKSB7XG4gICAgICAgIGRlbGV0ZSBuZXdTZXR0aW5ncy5jb21waWxlck9wdGlvbnMudHlwZVJvb3RzO1xuICAgICAgfVxuICAgIH1cbiAgICBhZGRVbmRpY2lUeXBlc1BhdGhNYXBwaW5nKG5ld1NldHRpbmdzLCBjb25maWcpO1xuICAgIHNvcnRLZXlzKG5ld1NldHRpbmdzKTtcbiAgICBuZXdTZXR0aW5ncy5pbmNsdWRlPy5zb3J0KCk7XG4gICAgLy8gRG9uJ3QgdXNlIG9sZCBkZWNvcmF0b3JcbiAgICBkZWxldGUgbmV3U2V0dGluZ3MuY29tcGlsZXJPcHRpb25zPy5leHBlcmltZW50YWxEZWNvcmF0b3JzO1xuICAgIC8vIFBhY2thZ2UgaW1wb3J0cyBzaG91bGQgcmVzb2x2ZSB0aHJvdWdoIHBhY2thZ2UgZXhwb3J0cyBpbnN0ZWFkIG9mIGJhc2VVcmwuXG4gICAgLy8gcGF0aHMgaXMgaW50ZW50aW9uYWxseSBwcmVzZXJ2ZWQgc28gcmVwby1sb2NhbCB0b29saW5nIGNhbiBrZWVwIGV4cGxpY2l0XG4gICAgLy8gYWxpYXNlcyB3aXRob3V0IHJlbHlpbmcgb24gYmFzZVVybCdzIGJyb2FkIGZhbGxiYWNrIHJlc29sdXRpb24uXG4gICAgZGVsZXRlIG5ld1NldHRpbmdzLmNvbXBpbGVyT3B0aW9ucz8uYmFzZVVybDtcbiAgICBpZiAoY29uZmlnLmRlcGVuZGluZy5yZWFjdE5hdGl2ZSkge1xuICAgICAgZGVsZXRlIG5ld1NldHRpbmdzLmNvbXBpbGVyT3B0aW9ucz8udmVyYmF0aW1Nb2R1bGVTeW50YXg7XG4gICAgfVxuICAgIC8vIFNraXAgdGhlIHdyaXRlIHdoZW4gbm90aGluZyBjaGFuZ2VzIHNlbWFudGljYWxseSwgc28gSlNPTkMgY29tbWVudHMgYW5kIGZvcm1hdHRpbmcgaW4gYW5cbiAgICAvLyBhbHJlYWR5LXVwLXRvLWRhdGUgdHNjb25maWcuanNvbiBzdXJ2aXZlIHdiZnkgcnVucy5cbiAgICBpZiAob3JpZ2luYWxTZXR0aW5nc0pzb24gPT09IEpTT04uc3RyaW5naWZ5KG5ld1NldHRpbmdzKSkgcmV0dXJuO1xuICAgIGNvbnN0IG5ld0NvbnRlbnQgPSBKU09OLnN0cmluZ2lmeShuZXdTZXR0aW5ncywgdW5kZWZpbmVkLCAyKTtcbiAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnNVdGlsLmdlbmVyYXRlRmlsZShmaWxlUGF0aCwgbmV3Q29udGVudCkpO1xuICB9KTtcbn1cblxuLyoqXG4gKiBUaGUgbW9ub3JlcG8tcm9vdCB0c2NvbmZpZywgd2hvc2UgaW5jbHVkZS9leGNsdWRlIGNvdmVyIGV2ZXJ5IERFQ0xBUkVEIHdvcmtzcGFjZSBsYXlvdXQgKGUuZy5cbiAqIGBhcHBzLypgIGFsb25nc2lkZSBgcGFja2FnZXMvKmApIHNvIHR5cGUtYXdhcmUgbGludGluZyBydW4gZnJvbSB0aGUgcm9vdCBzZWVzIGFsbCB3b3Jrc3BhY2VcbiAqIHNvdXJjZXMsIG5vdCBqdXN0IHRoZSBjb252ZW50aW9uYWwgcGFja2FnZXMvKiBkaXJlY3RvcnkuXG4gKi9cbmZ1bmN0aW9uIGJ1aWxkUm9vdEpzb25PYmooY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogVHNDb25maWdKc29uIHtcbiAgY29uc3Qgd29ya3NwYWNlUGF0dGVybnMgPSBjb25maWcuZG9lc0NvbnRhaW5TdWJQYWNrYWdlSnNvbnNcbiAgICA/IGdldFdvcmtzcGFjZURpclBhdHRlcm5zKGNvbmZpZylcbiAgICA6IHsgZXhjbHVkZXM6IFtdLCBpbmNsdWRlczogW10gfTtcbiAgY29uc3Qgc2V0dGluZ3MgPSBzdHJ1Y3R1cmVkQ2xvbmUoc3ViSnNvbk9iaikgYXMgVHNDb25maWdKc29uO1xuICBzZXR0aW5ncy5leGNsdWRlID0gW1xuICAgIC4uLm5ldyBTZXQoW1xuICAgICAgLi4ud29ya3NwYWNlUGF0dGVybnMuaW5jbHVkZXMubWFwKCh3b3Jrc3BhY2VQYXR0ZXJuKSA9PiBgJHt3b3Jrc3BhY2VQYXR0ZXJufS90ZXN0L2ZpeHR1cmVzYCksXG4gICAgICAvLyBOZWdhdGl2ZSB3b3Jrc3BhY2UgcGF0dGVybnMgKGUuZy4gYCFwYWNrYWdlcy9leGNsdWRlZGApIG9wdCB3b3Jrc3BhY2Ugc3VidHJlZXMgb3V0IG9mIHRoZVxuICAgICAgLy8gbW9ub3JlcG8sIHNvIHRoZWlyIHNvdXJjZXMgbXVzdCBub3QgZW50ZXIgdGhlIHJvb3QgdHlwZS1jaGVjayBwcm9qZWN0IGVpdGhlci4gQSBuZWdhdGlvblxuICAgICAgLy8gd2hvc2UgZGlyZWN0b3J5IGlzIGFuIGFuY2VzdG9yIG9mIGEgd29ya3NwYWNlIHlpZWxkcyBwYWNrYWdlLW93bmVkIHN1YnBhdGggZW50cmllc1xuICAgICAgLy8gaW5zdGVhZCBvZiB0aGUgd2hvbGUgc3VidHJlZSAoc2VlIGdldFdvcmtzcGFjZURpclBhdHRlcm5zKS5cbiAgICAgIC4uLndvcmtzcGFjZVBhdHRlcm5zLmV4Y2x1ZGVzLFxuICAgICAgLy8gVGhlIG1hbmFnZWQgaW5jbHVkZXMgYWJvdmUgZGVsaWJlcmF0ZWx5IG9taXQgZnJhbWV3b3JrIGBhcHAvKipgIGRpcmVjdG9yaWVzIChzZWVcbiAgICAgIC8vIHN1Ykpzb25PYmouaW5jbHVkZSdzIGNvbW1lbnQpLCBidXQgYSByZXBvLWF1dGhvcmVkIGJyb2FkIGluY2x1ZGUgc3VjaCBhcyBgZTJlLyoqXFwvKmBcbiAgICAgIC8vIGNhbiBzdGlsbCBkcmFnIGEgZnJhbWV3b3JrIHdvcmtzcGFjZSdzIGFwcCBzb3VyY2VzIGludG8gdGhlIHJvb3QgcHJvamVjdCwgd2hlcmUgdGhleVxuICAgICAgLy8gZmFpbCB1bmRlciB0aGUgcm9vdCBjb21waWxlciBvcHRpb25zIOKAlCB0aGVpciBiYXJlIGBuZXh0LypgIGltcG9ydHMgcmVzb2x2ZSBvbmx5IHRocm91Z2hcbiAgICAgIC8vIHRoZSBmcmFtZXdvcmsgd29ya3NwYWNlJ3Mgb3duIHRzY29uZmlnIGBwYXRoc2AuIEV4Y2x1ZGUgdGhvc2UgYXBwIGRpcmVjdG9yaWVzIHNvIHRoZVxuICAgICAgLy8gcm9vdCBwcm9qZWN0IG5ldmVyIHR5cGUtY2hlY2tzIHRoZW0sIG5vIG1hdHRlciBob3cgYnJvYWQgdGhlIHJlcG8ncyBpbmNsdWRlIGdsb2JzIGFyZS5cbiAgICAgIC4uLmdldEZyYW1ld29ya1dvcmtzcGFjZUFwcEV4Y2x1ZGVzKGNvbmZpZyksXG4gICAgICAuLi4oc2V0dGluZ3MuZXhjbHVkZSA/PyBbXSksXG4gICAgXSksXG4gIF0udG9Tb3J0ZWQoKTtcbiAgc2V0dGluZ3MuaW5jbHVkZSA9IFtcbiAgICAuLi4oc2V0dGluZ3MuaW5jbHVkZSA/PyBbXSksXG4gICAgLi4ud29ya3NwYWNlUGF0dGVybnMuaW5jbHVkZXMuZmxhdE1hcCgod29ya3NwYWNlUGF0dGVybikgPT4gW1xuICAgICAgYCR7d29ya3NwYWNlUGF0dGVybn0vKi5jb25maWcudHNgLFxuICAgICAgYCR7d29ya3NwYWNlUGF0dGVybn0vc2NyaXB0cy8qKi8qYCxcbiAgICAgIGAke3dvcmtzcGFjZVBhdHRlcm59L3NyYy8qKi8qYCxcbiAgICAgIGAke3dvcmtzcGFjZVBhdHRlcm59L3Rlc3QvKiovKmAsXG4gICAgXSksXG4gIF07XG4gIHJldHVybiBzZXR0aW5ncztcbn1cblxuLy8gRnJhbWV3b3JrIHBhY2thZ2VzIG93biB0aGVpciB0c2NvbmZpZyAoZ2VuZXJhdGVUc2NvbmZpZyBza2lwcyB0aGVtKSBhbmQgc2hpbSBiYXJlIGltcG9ydHMgc3VjaCBhc1xuLy8gYG5leHQvbmF2aWdhdGlvbmAgdGhyb3VnaCBwYWNrYWdlLWxvY2FsIGBwYXRoc2A7IHZpbmV4dCBpcyB0aGUgb3JnJ3MgTmV4dC5qcy1lcXVpdmFsZW50IGZyYW1ld29ya1xuLy8gYW5kIGJlaGF2ZXMgdGhlIHNhbWUuIFRoZWlyIGFwcCBzb3VyY2VzIHRoZXJlZm9yZSBvbmx5IHR5cGUtY2hlY2sgdW5kZXIgdGhlaXIgb3duIGNvbmZpZy5cbmNvbnN0IGZyYW1ld29ya0RlcGVuZGVuY3lOYW1lcyA9IFsnYmxpdHonLCAnbmV4dCcsICd2aW5leHQnXTtcblxuLy8gQSBmcmFtZXdvcmsgYXBwIGxpdmVzIGluIGBhcHAvYCBvciwgdW5kZXIgdGhlIHNyYy1kaXJlY3RvcnkgbGF5b3V0LCBgc3JjL2FwcC9gLiBUaGUgcm9vdCBwcm9qZWN0XG4vLyBpbmNsdWRlcyBgPHdvcmtzcGFjZT4vc3JjLyoqLypgLCBzbyBgc3JjL2FwcGAgbGVha3MgaW4ganVzdCBhcyBhIHJlcG8td2lkZSBnbG9iIGNhbiBwdWxsIGluIGBhcHBgLlxuY29uc3QgZnJhbWV3b3JrQXBwRGlyTmFtZXMgPSBbJ2FwcCcsICdzcmMvYXBwJ107XG5cbi8qKiBSb290IGBleGNsdWRlYCBlbnRyaWVzIChwb3NpeCwgcmVsYXRpdmUgdG8gdGhlIHJvb3QpIGZvciBldmVyeSBmcmFtZXdvcmsgd29ya3NwYWNlJ3MgYXBwIGRpcmVjdG9yeS4gKi9cbmZ1bmN0aW9uIGdldEZyYW1ld29ya1dvcmtzcGFjZUFwcEV4Y2x1ZGVzKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IHN0cmluZ1tdIHtcbiAgaWYgKCFjb25maWcuZG9lc0NvbnRhaW5TdWJQYWNrYWdlSnNvbnMpIHJldHVybiBbXTtcbiAgY29uc3QgZXhjbHVkZXM6IHN0cmluZ1tdID0gW107XG4gIGZvciAoY29uc3Qgd29ya3NwYWNlRGlyUGF0aCBvZiBnZXRXb3Jrc3BhY2VTdWJEaXJQYXRocyhjb25maWcpKSB7XG4gICAgaWYgKCFkZXBlbmRzT25GcmFtZXdvcmsocGF0aC5yZXNvbHZlKHdvcmtzcGFjZURpclBhdGgsICdwYWNrYWdlLmpzb24nKSkpIGNvbnRpbnVlO1xuICAgIGZvciAoY29uc3QgYXBwRGlyTmFtZSBvZiBmcmFtZXdvcmtBcHBEaXJOYW1lcykge1xuICAgICAgY29uc3QgYXBwRGlyUGF0aCA9IHBhdGgucmVzb2x2ZSh3b3Jrc3BhY2VEaXJQYXRoLCBhcHBEaXJOYW1lKTtcbiAgICAgIGlmIChmcy5leGlzdHNTeW5jKGFwcERpclBhdGgpKSBleGNsdWRlcy5wdXNoKHBhdGgucmVsYXRpdmUoY29uZmlnLmRpclBhdGgsIGFwcERpclBhdGgpLnJlcGxhY2VBbGwoJ1xcXFwnLCAnLycpKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGV4Y2x1ZGVzO1xufVxuXG5mdW5jdGlvbiBkZXBlbmRzT25GcmFtZXdvcmsobWFuaWZlc3RQYXRoOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgbGV0IG1hbmlmZXN0OiBQYWNrYWdlSnNvbiB8IG51bGw7XG4gIHRyeSB7XG4gICAgbWFuaWZlc3QgPSBKU09OLnBhcnNlKGZzLnJlYWRGaWxlU3luYyhtYW5pZmVzdFBhdGgsICd1dGY4JykpIGFzIFBhY2thZ2VKc29uIHwgbnVsbDtcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIC8vIEEgbWFuaWZlc3QgdGhhdCBwYXJzZXMgdG8gYSBub24tb2JqZWN0IChlLmcuIGEgZmlsZSBsaXRlcmFsbHkgY29udGFpbmluZyBgbnVsbGApIGRlY2xhcmVzIG5vXG4gIC8vIGRlcGVuZGVuY2llczsgZ3VhcmQgdGhlIHByb3BlcnR5IGFjY2Vzcywgd2hpY2ggd291bGQgb3RoZXJ3aXNlIHRocm93IG91dHNpZGUgdGhlIHRyeSBhYm92ZS5cbiAgaWYgKCFtYW5pZmVzdCB8fCB0eXBlb2YgbWFuaWZlc3QgIT09ICdvYmplY3QnKSByZXR1cm4gZmFsc2U7XG4gIGNvbnN0IGRlcGVuZGVuY2llcyA9IHsgLi4ubWFuaWZlc3QuZGVwZW5kZW5jaWVzLCAuLi5tYW5pZmVzdC5kZXZEZXBlbmRlbmNpZXMgfTtcbiAgcmV0dXJuIGZyYW1ld29ya0RlcGVuZGVuY3lOYW1lcy5zb21lKChkZXBlbmRlbmN5TmFtZSkgPT4gZGVwZW5kZW5jaWVzW2RlcGVuZGVuY3lOYW1lXSk7XG59XG5cbmNvbnN0IG1hbmFnZWRXb3Jrc3BhY2VJbmNsdWRlU3VmZml4ZXMgPSBbJyouY29uZmlnLnRzJywgJ3NjcmlwdHMvKiovKicsICdzcmMvKiovKicsICd0ZXN0LyoqLyonXTtcblxuLyoqXG4gKiBSb290IGluY2x1ZGUvZXhjbHVkZSBlbnRyaWVzIHdiZnkgZ2VuZXJhdGVkIGZvciBhbiBlYXJsaWVyIHdvcmtzcGFjZSBsYXlvdXQgKGUuZy4gYHBhY2thZ2VzLypgXG4gKiBnbG9icyBpbiBhIHJlcG8gdGhhdCBub3cgZGVjbGFyZXMgb25seSBgYXBwcy8qYCkgbXVzdCBub3Qgc3Vydml2ZSB0aGUgbWVyZ2Ugd2l0aCB0aGUgZXhpc3RpbmdcbiAqIHRzY29uZmlnLCBvciB0aGUgb2Jzb2xldGUgZGlyZWN0b3JpZXMgd291bGQga2VlcCBlbnRlcmluZyByb290IHR5cGUgY2hlY2tpbmcgZm9yZXZlci4gQSBwcmVmaXhcbiAqIGNvdW50cyBhcyB3YmZ5LW1hbmFnZWQgb25seSB3aGVuIHRoZSBDT01QTEVURSBnZW5lcmF0ZWQgaW5jbHVkZSBzZXQgZm9yIGl0IGlzIHByZXNlbnQgYW5kIG5vXG4gKiBsb25nZXIgZ2VuZXJhdGVkIOKAlCBhIHVzZXItYXV0aG9yZWQgZW50cnkgc3VjaCBhcyBhIGxvbmUgYHRvb2xzLypcXC9zcmMvKipcXC8qYCBuZXZlciBxdWFsaWZpZXMuXG4gKi9cbmZ1bmN0aW9uIHJlbW92ZVN0YWxlTWFuYWdlZFdvcmtzcGFjZUVudHJpZXMoXG4gIGNvbmZpZzogUGFja2FnZUNvbmZpZyxcbiAgb2xkU2V0dGluZ3M6IFRzQ29uZmlnSnNvbixcbiAgbmV3U2V0dGluZ3M6IFRzQ29uZmlnSnNvblxuKTogdm9pZCB7XG4gIGNvbnN0IHN0YWxlUHJlZml4ZXMgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgaWYgKEFycmF5LmlzQXJyYXkob2xkU2V0dGluZ3MuaW5jbHVkZSkpIHtcbiAgICBjb25zdCBvbGRJbmNsdWRlID0gb2xkU2V0dGluZ3MuaW5jbHVkZS5maWx0ZXIoKGVudHJ5KTogZW50cnkgaXMgc3RyaW5nID0+IHR5cGVvZiBlbnRyeSA9PT0gJ3N0cmluZycpO1xuICAgIGNvbnN0IGdlbmVyYXRlZEluY2x1ZGUgPSBuZXcgU2V0KG5ld1NldHRpbmdzLmluY2x1ZGUpO1xuICAgIGZvciAoY29uc3QgZW50cnkgb2Ygb2xkSW5jbHVkZSkge1xuICAgICAgY29uc3Qgd29ya3NwYWNlUHJlZml4ID0gZ2V0TWFuYWdlZFdvcmtzcGFjZVByZWZpeChlbnRyeSk7XG4gICAgICBpZiAod29ya3NwYWNlUHJlZml4ID09PSB1bmRlZmluZWQgfHwgc3RhbGVQcmVmaXhlcy5oYXMod29ya3NwYWNlUHJlZml4KSkgY29udGludWU7XG4gICAgICBjb25zdCBpc0NvbXBsZXRlID0gbWFuYWdlZFdvcmtzcGFjZUluY2x1ZGVTdWZmaXhlcy5ldmVyeSgoc3VmZml4KSA9PlxuICAgICAgICBvbGRJbmNsdWRlLmluY2x1ZGVzKGAke3dvcmtzcGFjZVByZWZpeH0vJHtzdWZmaXh9YClcbiAgICAgICk7XG4gICAgICBjb25zdCBpc1N0aWxsR2VuZXJhdGVkID0gbWFuYWdlZFdvcmtzcGFjZUluY2x1ZGVTdWZmaXhlcy5zb21lKChzdWZmaXgpID0+XG4gICAgICAgIGdlbmVyYXRlZEluY2x1ZGUuaGFzKGAke3dvcmtzcGFjZVByZWZpeH0vJHtzdWZmaXh9YClcbiAgICAgICk7XG4gICAgICBpZiAoaXNDb21wbGV0ZSAmJiAhaXNTdGlsbEdlbmVyYXRlZCkgc3RhbGVQcmVmaXhlcy5hZGQod29ya3NwYWNlUHJlZml4KTtcbiAgICB9XG4gICAgaWYgKHN0YWxlUHJlZml4ZXMuc2l6ZSA+IDApIHtcbiAgICAgIG9sZFNldHRpbmdzLmluY2x1ZGUgPSBvbGRTZXR0aW5ncy5pbmNsdWRlLmZpbHRlcigoZW50cnkpID0+IHtcbiAgICAgICAgY29uc3Qgd29ya3NwYWNlUHJlZml4ID0gdHlwZW9mIGVudHJ5ID09PSAnc3RyaW5nJyA/IGdldE1hbmFnZWRXb3Jrc3BhY2VQcmVmaXgoZW50cnkpIDogdW5kZWZpbmVkO1xuICAgICAgICByZXR1cm4gd29ya3NwYWNlUHJlZml4ID09PSB1bmRlZmluZWQgfHwgIXN0YWxlUHJlZml4ZXMuaGFzKHdvcmtzcGFjZVByZWZpeCk7XG4gICAgICB9KTtcbiAgICB9XG4gIH1cbiAgaWYgKCFBcnJheS5pc0FycmF5KG9sZFNldHRpbmdzLmV4Y2x1ZGUpKSByZXR1cm47XG4gIGNvbnN0IGdlbmVyYXRlZEV4Y2x1ZGUgPSBuZXcgU2V0KG5ld1NldHRpbmdzLmV4Y2x1ZGUpO1xuICBjb25zdCB3b3Jrc3BhY2VEaXJQYXRocyA9IGNvbmZpZy5kb2VzQ29udGFpblN1YlBhY2thZ2VKc29uc1xuICAgID8gZ2V0V29ya3NwYWNlU3ViRGlyUGF0aHMoY29uZmlnKS5tYXAoKHdvcmtzcGFjZURpclBhdGgpID0+XG4gICAgICAgIHBhdGgucmVsYXRpdmUocGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoKSwgd29ya3NwYWNlRGlyUGF0aCkucmVwbGFjZUFsbCgnXFxcXCcsICcvJylcbiAgICAgIClcbiAgICA6IFtdO1xuICBvbGRTZXR0aW5ncy5leGNsdWRlID0gb2xkU2V0dGluZ3MuZXhjbHVkZS5maWx0ZXIoKGVudHJ5KSA9PiB7XG4gICAgaWYgKHR5cGVvZiBlbnRyeSAhPT0gJ3N0cmluZycgfHwgZ2VuZXJhdGVkRXhjbHVkZS5oYXMoZW50cnkpKSByZXR1cm4gdHJ1ZTtcbiAgICBpZiAoZW50cnkuZW5kc1dpdGgoJy90ZXN0L2ZpeHR1cmVzJykpIHtcbiAgICAgIHJldHVybiAhc3RhbGVQcmVmaXhlcy5oYXMoZW50cnkuc2xpY2UoMCwgLScvdGVzdC9maXh0dXJlcycubGVuZ3RoKSk7XG4gICAgfVxuICAgIC8vIEEgZnJhbWV3b3JrIGFwcCBleGNsdWRlIChgPHdvcmtzcGFjZT4vYXBwYCwgYDx3b3Jrc3BhY2U+L3NyYy9hcHBgKSBmb3IgYSBzdGlsbC1kZWNsYXJlZFxuICAgIC8vIHdvcmtzcGFjZSBpcyBwcnVuZWQgYnkgY292ZXJzV29ya3NwYWNlRGlyIGJlbG93IHdoZW4gbm8gbG9uZ2VyIGdlbmVyYXRlZDsgdGhpcyBjYXRjaGVzIHRoZVxuICAgIC8vIHJlbWFpbmluZyBjYXNlLCB3aGVyZSB0aGUgd29ya3NwYWNlIGl0c2VsZiB3YXMgcmVtb3ZlZCBhbmQgaXRzIHByZWZpeCBpcyB0aGVyZWZvcmUgc3RhbGUuXG4gICAgLy8gKEEgd3Jvbmcgc3VmZml4IHN0cmlwIHlpZWxkcyBhIHByZWZpeCBhYnNlbnQgZnJvbSBzdGFsZVByZWZpeGVzLCBzbyB0ZXN0aW5nIGV2ZXJ5IG5hbWUgaXMgc2FmZS4pXG4gICAgaWYgKFxuICAgICAgZnJhbWV3b3JrQXBwRGlyTmFtZXMuc29tZShcbiAgICAgICAgKGFwcERpck5hbWUpID0+IGVudHJ5LmVuZHNXaXRoKGAvJHthcHBEaXJOYW1lfWApICYmIHN0YWxlUHJlZml4ZXMuaGFzKGVudHJ5LnNsaWNlKDAsIC0oYXBwRGlyTmFtZS5sZW5ndGggKyAxKSkpXG4gICAgICApXG4gICAgKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHJldHVybiAhY292ZXJzV29ya3NwYWNlRGlyKGVudHJ5LCB3b3Jrc3BhY2VEaXJQYXRocyk7XG4gIH0pO1xufVxuXG4vLyBXaGV0aGVyIGFuIGV4Y2x1ZGUgZW50cnkgaXMgYSB3b3Jrc3BhY2UgbmVnYXRpb24gKGAhYXBwcy9leGNsdWRlZGApIHdob3NlIG5lZ2F0aW9uIGlzIGdvbmU6IHRoZVxuLy8gZGlyZWN0b3J5IGlzIGEgd29ya3NwYWNlIGFnYWluIGFuZCBtdXN0IHJlLWVudGVyIHRoZSByb290IHByb2plY3QuIHdiZnkgd3JpdGVzIHN1Y2ggYSBuZWdhdGlvbiBhc1xuLy8gYSBkaXJlY3RvcnkgcGF0aCwgYXMgYSBkaXJlY3RvcnkgUEFUVEVSTiB3aGVuIGl0IGV4Y2x1ZGVzIGV4YWN0bHkgd2hhdCBpdCBtYXRjaGVzIChgYXBwcy8qYmApLCBvclxuLy8gYXMgYW4gYW5jZXN0b3IncyBwYWNrYWdlLW93bmVkIHN1YnBhdGhzIChgYXBwcy94L3NyY2ApIOKAlCBzbyB0aGUgZW50cnkgbWF5IGNvdmVyIGEgZGlzY292ZXJlZFxuLy8gd29ya3NwYWNlIGRpcmVjdG9yeSBvciBzaXQgdW5kZXIgb25lLiBBIGdsb2JzdGFyIHNlZ21lbnQgbWFya3MgYSBoeWdpZW5lIGdsb2IgKG5vZGVfbW9kdWxlcywgZTJlXG4vLyBhbmQgZnJpZW5kcyksIHdoaWNoIGlzIG5ldmVyIG5lZ2F0aW9uLWRlcml2ZWQgYW5kIG11c3Qgc3Vydml2ZS5cbmZ1bmN0aW9uIGNvdmVyc1dvcmtzcGFjZURpcihlbnRyeTogc3RyaW5nLCB3b3Jrc3BhY2VEaXJQYXRoczogcmVhZG9ubHkgc3RyaW5nW10pOiBib29sZWFuIHtcbiAgaWYgKGVudHJ5LnNwbGl0KCcvJykuaW5jbHVkZXMoJyoqJykpIHJldHVybiBmYWxzZTtcbiAgY29uc3QgcmVnZXhTb3VyY2UgPSBlbnRyeVxuICAgIC5zcGxpdCgnLycpXG4gICAgLm1hcCgoc2VnbWVudCkgPT5cbiAgICAgIHNlZ21lbnRcbiAgICAgICAgLnJlcGxhY2VBbGwoL1suK14ke30oKXxbXFxdXFxcXF0vZ3UsIFN0cmluZy5yYXdgXFwkJmApXG4gICAgICAgIC5yZXBsYWNlQWxsKCcqJywgJ1teL10qJylcbiAgICAgICAgLnJlcGxhY2VBbGwoJz8nLCAnW14vXScpXG4gICAgKVxuICAgIC5qb2luKCcvJyk7XG4gIGNvbnN0IGVudHJ5UGF0dGVybiA9IG5ldyBSZWdFeHAoYF4ke3JlZ2V4U291cmNlfSg/Oi8uKik/JGAsICd1Jyk7XG4gIHJldHVybiB3b3Jrc3BhY2VEaXJQYXRocy5zb21lKFxuICAgICh3b3Jrc3BhY2VEaXJQYXRoKSA9PiBlbnRyeVBhdHRlcm4udGVzdCh3b3Jrc3BhY2VEaXJQYXRoKSB8fCBlbnRyeS5zdGFydHNXaXRoKGAke3dvcmtzcGFjZURpclBhdGh9L2ApXG4gICk7XG59XG5cbmZ1bmN0aW9uIGdldE1hbmFnZWRXb3Jrc3BhY2VQcmVmaXgoZW50cnk6IHN0cmluZyk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IG1hdGNoZWRTdWZmaXggPSBtYW5hZ2VkV29ya3NwYWNlSW5jbHVkZVN1ZmZpeGVzLmZpbmQoKHN1ZmZpeCkgPT4gZW50cnkuZW5kc1dpdGgoYC8ke3N1ZmZpeH1gKSk7XG4gIGlmICghbWF0Y2hlZFN1ZmZpeCkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgY29uc3Qgd29ya3NwYWNlUHJlZml4ID0gZW50cnkuc2xpY2UoMCwgLShtYXRjaGVkU3VmZml4Lmxlbmd0aCArIDEpKTtcbiAgcmV0dXJuIHdvcmtzcGFjZVByZWZpeCA9PT0gJycgPyB1bmRlZmluZWQgOiB3b3Jrc3BhY2VQcmVmaXg7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIG5vcm1hbGl6ZUZyYW1ld29ya1RzY29uZmlnKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICAvLyBOZXh0L0JsaXR6IG93biB0aGVpciB0c2NvbmZpZyBzaGFwZSwgYnV0IFR5cGVTY3JpcHQgNiBubyBsb25nZXIgYWNjZXB0c1xuICAvLyBub2RlMTAgcmVzb2x2ZXIgc3BlbGxpbmdzIHRoYXQgb2xkZXIgcHJvamVjdHMgY29tbW9ubHkgaW5oZXJpdGVkLlxuICBjb25zdCBmaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJ3RzY29uZmlnLmpzb24nKTtcbiAgY29uc3QgZXhpc3RpbmdDb250ZW50ID0gYXdhaXQgZnNVdGlsLnJlYWRGaWxlSWZFeGlzdHMoZmlsZVBhdGgpO1xuICBpZiAoZXhpc3RpbmdDb250ZW50ID09PSB1bmRlZmluZWQgfHwganNvbmNVdGlsLmlzVHJpdmlhT25seShleGlzdGluZ0NvbnRlbnQpKSByZXR1cm47XG4gIGNvbnN0IHNldHRpbmdzID0ganNvbmNVdGlsLnBhcnNlT2JqZWN0SWdub3JpbmdFcnJvcjxUc0NvbmZpZ0pzb24+KGV4aXN0aW5nQ29udGVudCk7XG4gIGlmICghc2V0dGluZ3MpIHtcbiAgICBjb25zb2xlLndhcm4oYFNraXBwZWQgY2xlYW5pbmcgdXAgJHtmaWxlUGF0aH0gYmVjYXVzZSB0aGUgZXhpc3RpbmcgY29udGVudCBpcyBub3QgcGFyc2FibGUgYXMgSlNPTkMuYCk7XG4gICAgcmV0dXJuO1xuICB9XG4gIGNvbnN0IG9yaWdpbmFsU2V0dGluZ3NKc29uID0gSlNPTi5zdHJpbmdpZnkoc2V0dGluZ3MpO1xuICBub3JtYWxpemVOZXh0VHNjb25maWdNb2R1bGVTZXR0aW5ncyhzZXR0aW5ncyk7XG4gIG5vcm1hbGl6ZU5leHRUc2NvbmZpZ1BhdGhBbGlhc2VzKHNldHRpbmdzLmNvbXBpbGVyT3B0aW9ucyk7XG4gIGFkZFNjcmlwdHNJbmNsdWRlRm9yRnJhbWV3b3JrUHJvamVjdChzZXR0aW5ncyk7XG4gIGFkZFVuZGljaVR5cGVzUGF0aE1hcHBpbmcoc2V0dGluZ3MsIGNvbmZpZyk7XG4gIC8vIFNraXAgdGhlIHdyaXRlIHdoZW4gbm90aGluZyBjaGFuZ2VzIHNlbWFudGljYWxseSwgc28gSlNPTkMgY29tbWVudHMgYW5kIGZvcm1hdHRpbmcgaW4gYW5cbiAgLy8gYWxyZWFkeS1jbGVhbiB0c2NvbmZpZy5qc29uIHN1cnZpdmUgd2JmeSBydW5zLlxuICBpZiAoSlNPTi5zdHJpbmdpZnkoc2V0dGluZ3MpID09PSBvcmlnaW5hbFNldHRpbmdzSnNvbikgcmV0dXJuO1xuICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnNVdGlsLmdlbmVyYXRlRmlsZShmaWxlUGF0aCwgSlNPTi5zdHJpbmdpZnkoc2V0dGluZ3MsIHVuZGVmaW5lZCwgMikpKTtcbn1cblxuLyoqXG4gKiBidW4tdHlwZXMgcmVmZXJlbmNlcyB1bmRpY2ktdHlwZXMgd2l0aG91dCBkZWNsYXJpbmcgaXQgYXMgYSBkZXBlbmRlbmN5IChvdmVuLXNoL2J1biMyMjgwNSksIHNvXG4gKiBCdW4ncyBpc29sYXRlZCBsaW5rZXIgKGVzcGVjaWFsbHkgd2l0aCB0aGUgZ2xvYmFsIHN0b3JlIG91dHNpZGUgdGhlIHJlcG9zaXRvcnkpIGNhbm5vdCByZXNvbHZlXG4gKiBpdCBmcm9tIGJ1bi10eXBlcycgbG9jYXRpb24sIHdoaWNoIHNpbGVudGx5IGRlZ3JhZGVzIGdsb2JhbCBmZXRjaCB0eXBlcyBzdWNoIGFzIFJlc3BvbnNlLiBNYXAgaXRcbiAqIHRvIHRoZSBjb3B5IHRoYXQgYnVuZmlnLnRvbWwncyBwdWJsaWNIb2lzdFBhdHRlcm4gcGxhY2VzIGluIHRoZSByb290IG5vZGVfbW9kdWxlcy5cbiAqL1xuZnVuY3Rpb24gYWRkVW5kaWNpVHlwZXNQYXRoTWFwcGluZyhzZXR0aW5nczogVHNDb25maWdKc29uLCBjb25maWc6IFBhY2thZ2VDb25maWcpOiB2b2lkIHtcbiAgLy8gTWFwIHVuZGljaS10eXBlcyBvbmx5IHdoZW4gYnVuLXR5cGVzIGFjdHVhbGx5IGxvYWRzOiBhbiBleHBsaWNpdCBgdHlwZXNgIGxpc3QgbG9hZHMgaXQgaWZmIGl0XG4gIC8vIGNvbnRhaW5zIFwiYnVuXCIgKGV2ZW4gb24gUmVhY3QgTmF0aXZlLCB3aG9zZSBwcm9qZWN0cyBtYXkgb3B0IGluIGJ5IGhhbmQpOyB3aXRoIGB0eXBlc2BcbiAgLy8gb21pdHRlZCwgVHlwZVNjcmlwdCdzIGF1dG9tYXRpYyBAdHlwZXMgaW5jbHVzaW9uIGxvYWRzIGl0IGJlY2F1c2Ugd2JmeSBpbnN0YWxscyBAdHlwZXMvYnVuXG4gIC8vIGZvciBldmVyeSBUeXBlU2NyaXB0IHByb2plY3QgZXhjZXB0IFJlYWN0IE5hdGl2ZSwgd2hpY2ggdXNlcyBAdHNjb25maWcvcmVhY3QtbmF0aXZlIGluc3RlYWQuXG4gIGNvbnN0IHR5cGVzID0gc2V0dGluZ3MuY29tcGlsZXJPcHRpb25zPy50eXBlcztcbiAgaWYgKHR5cGVzID8gIXR5cGVzLmluY2x1ZGVzKCdidW4nKSA6IGNvbmZpZy5kZXBlbmRpbmcucmVhY3ROYXRpdmUpIHJldHVybjtcbiAgY29uc3QgY29ycmVjdE1hcHBpbmcgPSBgJHtnZXRSb290RGlyKGNvbmZpZyl9L25vZGVfbW9kdWxlcy91bmRpY2ktdHlwZXMvaW5kZXguZC50c2A7XG4gIGNvbnN0IGV4aXN0aW5nTWFwcGluZyA9IHNldHRpbmdzLmNvbXBpbGVyT3B0aW9ucz8ucGF0aHM/LlsndW5kaWNpLXR5cGVzJ107XG4gIGlmIChleGlzdGluZ01hcHBpbmcpIHtcbiAgICAvLyBSZXdyaXRlIHRoZSBnZW5lcmF0ZWQgbWFwcGluZyB3aGVuIGEgd29ya3NwYWNlIG1vdmVzIHRvIGEgZGlmZmVyZW50IHJvb3QgZGVwdGguIEFueSBvdGhlclxuICAgIC8vIHZhbHVlIGlzIGEgZGVsaWJlcmF0ZSByZXBvLWxvY2FsIG1hcHBpbmcgKGUuZy4gcGF0Y2hlZCB0eXBlcykgYW5kIG11c3QgYmUga2VwdC5cbiAgICBpZiAoXG4gICAgICBleGlzdGluZ01hcHBpbmcubGVuZ3RoID09PSAxICYmXG4gICAgICB0eXBlb2YgZXhpc3RpbmdNYXBwaW5nWzBdID09PSAnc3RyaW5nJyAmJlxuICAgICAgLyg/Ol58XFwvKW5vZGVfbW9kdWxlc1xcL3VuZGljaS10eXBlc1xcL2luZGV4XFwuZFxcLnRzJC91LnRlc3QoZXhpc3RpbmdNYXBwaW5nWzBdKVxuICAgICkge1xuICAgICAgc2V0dGluZ3MuY29tcGlsZXJPcHRpb25zIS5wYXRocyFbJ3VuZGljaS10eXBlcyddID0gW2NvcnJlY3RNYXBwaW5nXTtcbiAgICB9XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgc2V0dGluZ3MuY29tcGlsZXJPcHRpb25zID8/PSB7fTtcbiAgc2V0dGluZ3MuY29tcGlsZXJPcHRpb25zLnBhdGhzID0ge1xuICAgIC4uLnNldHRpbmdzLmNvbXBpbGVyT3B0aW9ucy5wYXRocyxcbiAgICAndW5kaWNpLXR5cGVzJzogW2NvcnJlY3RNYXBwaW5nXSxcbiAgfTtcbn1cblxuZnVuY3Rpb24gYWRkU2NyaXB0c0luY2x1ZGVGb3JGcmFtZXdvcmtQcm9qZWN0KHNldHRpbmdzOiBUc0NvbmZpZ0pzb24pOiB2b2lkIHtcbiAgLy8gT21pdHRpbmcgaW5jbHVkZSBsZXRzIGZyYW1ld29yayB0c2NvbmZpZ3Mga2VlcCBUeXBlU2NyaXB0J3MgZGVmYXVsdFxuICAvLyBcImFsbCBUUy9UU1ggZmlsZXNcIiBiZWhhdmlvciwgd2hpY2ggYWxyZWFkeSBjb3ZlcnMgc2NyaXB0cy5cbiAgaWYgKCFzZXR0aW5ncy5pbmNsdWRlKSByZXR1cm47XG4gIGlmIChzZXR0aW5ncy5pbmNsdWRlLmluY2x1ZGVzKCdzY3JpcHRzLyoqLyonKSkgcmV0dXJuO1xuXG4gIHNldHRpbmdzLmluY2x1ZGUucHVzaCgnc2NyaXB0cy8qKi8qJyk7XG4gIHNldHRpbmdzLmluY2x1ZGUuc29ydCgpO1xufVxuXG5mdW5jdGlvbiBub3JtYWxpemVOZXh0VHNjb25maWdNb2R1bGVTZXR0aW5ncyhzZXR0aW5nczogVHNDb25maWdKc29uKTogdm9pZCB7XG4gIGNvbnN0IGNvbXBpbGVyT3B0aW9ucyA9IHNldHRpbmdzLmNvbXBpbGVyT3B0aW9ucztcbiAgaWYgKCFjb21waWxlck9wdGlvbnMpIHJldHVybjtcbiAgY29uc3QgbW9kdWxlUmVzb2x1dGlvbiA9IGxvd2VyQ2FzZVNldHRpbmcoY29tcGlsZXJPcHRpb25zLm1vZHVsZVJlc29sdXRpb24pO1xuICBpZiAobW9kdWxlUmVzb2x1dGlvbiA9PT0gJ25vZGUnIHx8IG1vZHVsZVJlc29sdXRpb24gPT09ICdub2RlMTAnIHx8IG1vZHVsZVJlc29sdXRpb24gPT09IHVuZGVmaW5lZCkge1xuICAgIGlmIChzZXR0aW5ncy5leHRlbmRzKSB7XG4gICAgICAvLyBBbiBleHRlbmRlZCBjb25maWcgbWF5IGFscmVhZHkgc3VwcGx5IGEgdmFsaWQgbW9kdWxlL3Jlc29sdmVyIHBhaXIsIHNvIG9ubHlcbiAgICAgIC8vIHJlbW92ZSB0aGUgcmVtb3ZlZC1pbi1UUzYgbm9kZTEwIHNwZWxsaW5ncyBpbnN0ZWFkIG9mIGZvcmNpbmcgYnVuZGxlciBvbiBpdC5cbiAgICAgIGRlbGV0ZSBjb21waWxlck9wdGlvbnMubW9kdWxlUmVzb2x1dGlvbjtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gTmV4dC5qcyB3cml0ZXMgXCJub2RlXCIgZHVyaW5nIGJ1aWxkIHdoZW4gdGhpcyBvcHRpb24gaXMgbWlzc2luZywgYnV0XG4gICAgICAvLyB0c2dvbGludCB0cmVhdHMgdGhhdCBzcGVsbGluZyBhcyB0aGUgcmVtb3ZlZCBub2RlMTAgcmVzb2x2ZXIuXG4gICAgICBjb21waWxlck9wdGlvbnMubW9kdWxlUmVzb2x1dGlvbiA9ICdidW5kbGVyJztcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gbm9ybWFsaXplTmV4dFRzY29uZmlnUGF0aEFsaWFzZXMoY29tcGlsZXJPcHRpb25zOiBUc0NvbmZpZ0pzb24uQ29tcGlsZXJPcHRpb25zIHwgdW5kZWZpbmVkKTogdm9pZCB7XG4gIGlmICghY29tcGlsZXJPcHRpb25zKSByZXR1cm47XG5cbiAgLy8gdHNnb2xpbnQgZm9sbG93cyBUeXBlU2NyaXB0IDYgdmFsaWRhdGlvbiwgd2hlcmUgYmFzZVVybCBpcyByZW1vdmVkIGFuZFxuICAvLyBwYXRoIHRhcmdldHMgbXVzdCBiZSBleHBsaWNpdGx5IHJlbGF0aXZlLiBOZXh0LmpzIHN0aWxsIGFjY2VwdHMgdGhlIGFsaWFzXG4gIC8vIHNoYXBlIGFmdGVyIGVhY2ggdGFyZ2V0IGlzIHdyaXR0ZW4gd2l0aCBhIGxlYWRpbmcgLi8uXG4gIGRlbGV0ZSBjb21waWxlck9wdGlvbnMuYmFzZVVybDtcbiAgaWYgKCFjb21waWxlck9wdGlvbnMucGF0aHMpIHJldHVybjtcblxuICBmb3IgKGNvbnN0IFthbGlhcywgdGFyZ2V0c10gb2YgT2JqZWN0LmVudHJpZXMoY29tcGlsZXJPcHRpb25zLnBhdGhzKSkge1xuICAgIGNvbXBpbGVyT3B0aW9ucy5wYXRoc1thbGlhc10gPSBub3JtYWxpemVQYXRoQWxpYXNUYXJnZXRzKHRhcmdldHMpO1xuICB9XG59XG5cbmZ1bmN0aW9uIG5vcm1hbGl6ZVBhdGhBbGlhc1RhcmdldHModGFyZ2V0czogc3RyaW5nW10pOiBzdHJpbmdbXSB7XG4gIHJldHVybiB0YXJnZXRzLm1hcCgodGFyZ2V0KSA9PiB7XG4gICAgaWYgKHRhcmdldC5zdGFydHNXaXRoKCcuLycpIHx8IHRhcmdldC5zdGFydHNXaXRoKCcuLi8nKSB8fCBwYXRoLmlzQWJzb2x1dGUodGFyZ2V0KSkgcmV0dXJuIHRhcmdldDtcbiAgICByZXR1cm4gYC4vJHt0YXJnZXR9YDtcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIGdldFJvb3REaXIoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogc3RyaW5nIHtcbiAgaWYgKGNvbmZpZy5pc1Jvb3QpIHJldHVybiAnLic7XG4gIC8vIFRoZSB1bmRpY2ktdHlwZXMgcGF0aCBtYXBwaW5nIG11c3QgcmVhY2ggdGhlIG1vbm9yZXBvIHJvb3QncyBub2RlX21vZHVsZXMgKGJ1bmZpZy50b21sJ3NcbiAgLy8gcHVibGljSG9pc3RQYXR0ZXJuIGhvaXN0cyB0aGUgcGFja2FnZSB0aGVyZSksIGFuZCB3b3Jrc3BhY2UgcGF0dGVybnMgbWF5IGJlIGFyYml0cmFyaWx5IGRlZXBcbiAgLy8gKGUuZy4gYGV4YW1wbGVzLyoqYCksIHNvIGEgZml4ZWQgdHdvLWxldmVsIHByb2JlIGlzIG5vdCBlbm91Z2guIFByZWZlciB0aGUgbmVhcmVzdCBhbmNlc3RvclxuICAvLyBtYW5pZmVzdCB0aGF0IGRlY2xhcmVzIHdvcmtzcGFjZXMgKHRoZSBtb25vcmVwbyByb290KTsgb3RoZXJ3aXNlIGZhbGwgYmFjayB0byB0aGUgbmVhcmVzdFxuICAvLyBhbmNlc3RvciBtYW5pZmVzdC4gU3RvcCBhdCB0aGUgZmlyc3QgZ2l0IHJlcG9zaXRvcnkgYm91bmRhcnkgc28gYW4gdW5yZWxhdGVkIGVuY2xvc2luZ1xuICAvLyByZXBvc2l0b3J5J3MgbWFuaWZlc3QgY2FuIG5ldmVyIGJlIGNob3Nlbi5cbiAgY29uc3QgZGlyUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCk7XG4gIGxldCByb290RGlyUGF0aDogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICBmb3IgKGxldCBhbmNlc3RvckRpclBhdGggPSBwYXRoLmRpcm5hbWUoZGlyUGF0aCk7IDsgYW5jZXN0b3JEaXJQYXRoID0gcGF0aC5kaXJuYW1lKGFuY2VzdG9yRGlyUGF0aCkpIHtcbiAgICBjb25zdCBtYW5pZmVzdFBhdGggPSBwYXRoLnJlc29sdmUoYW5jZXN0b3JEaXJQYXRoLCAncGFja2FnZS5qc29uJyk7XG4gICAgaWYgKGZzLmV4aXN0c1N5bmMobWFuaWZlc3RQYXRoKSkge1xuICAgICAgcm9vdERpclBhdGggPz89IGFuY2VzdG9yRGlyUGF0aDtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IG1hbmlmZXN0ID0gSlNPTi5wYXJzZShmcy5yZWFkRmlsZVN5bmMobWFuaWZlc3RQYXRoLCAndXRmOCcpKSBhcyBQYWNrYWdlSnNvbjtcbiAgICAgICAgLy8gQnVuIG5vLW9wIHBhdHRlcm5zIChlLmcuIGB3b3Jrc3BhY2VzOiBbXCJcIl1gKSBkbyBub3QgbWFrZSBhIG1hbmlmZXN0IGEgd29ya3NwYWNlIHJvb3QuXG4gICAgICAgIGlmIChnZXRNZWFuaW5nZnVsRGVjbGFyZWRXb3Jrc3BhY2VQYXR0ZXJucyhtYW5pZmVzdC53b3Jrc3BhY2VzKS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgcm9vdERpclBhdGggPSBhbmNlc3RvckRpclBhdGg7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2gge1xuICAgICAgICAvLyBBbiB1bnBhcnNhYmxlIG1hbmlmZXN0IHN0aWxsIG1hcmtzIGEgcHJvamVjdCBkaXJlY3Rvcnk7IGtlZXAgY2xpbWJpbmcgZm9yIGEgd29ya3NwYWNlIHJvb3QuXG4gICAgICB9XG4gICAgfVxuICAgIGNvbnN0IGlzUmVwb0JvdW5kYXJ5ID0gZnMuZXhpc3RzU3luYyhwYXRoLnJlc29sdmUoYW5jZXN0b3JEaXJQYXRoLCAnLmdpdCcpKTtcbiAgICBjb25zdCBpc0ZpbGVzeXN0ZW1Sb290ID0gYW5jZXN0b3JEaXJQYXRoID09PSBwYXRoLmRpcm5hbWUoYW5jZXN0b3JEaXJQYXRoKTtcbiAgICBpZiAoaXNSZXBvQm91bmRhcnkgfHwgaXNGaWxlc3lzdGVtUm9vdCkgYnJlYWs7XG4gIH1cbiAgaWYgKCFyb290RGlyUGF0aCkgcmV0dXJuICcuJztcbiAgcmV0dXJuIHBhdGgucmVsYXRpdmUoZGlyUGF0aCwgcm9vdERpclBhdGgpLnJlcGxhY2VBbGwoJ1xcXFwnLCAnLycpIHx8ICcuJztcbn1cblxuZnVuY3Rpb24gbWVyZ2VUc2NvbmZpZ0V4dGVuZHMoXG4gIGdlbmVyYXRlZEV4dGVuZHM6IFRzQ29uZmlnSnNvblsnZXh0ZW5kcyddLFxuICBleGlzdGluZ0V4dGVuZHM6IFRzQ29uZmlnSnNvblsnZXh0ZW5kcyddXG4pOiBUc0NvbmZpZ0pzb25bJ2V4dGVuZHMnXSB7XG4gIGNvbnN0IG1lcmdlZEV4dGVuZHMgPSBbLi4ubm9ybWFsaXplRXh0ZW5kcyhnZW5lcmF0ZWRFeHRlbmRzKSwgLi4ubm9ybWFsaXplRXh0ZW5kcyhleGlzdGluZ0V4dGVuZHMpXTtcbiAgY29uc3QgdW5pcXVlRXh0ZW5kcyA9IFsuLi5uZXcgU2V0KG1lcmdlZEV4dGVuZHMpXTtcbiAgaWYgKHVuaXF1ZUV4dGVuZHMubGVuZ3RoID09PSAwKSByZXR1cm4gdW5kZWZpbmVkO1xuICBpZiAodW5pcXVlRXh0ZW5kcy5sZW5ndGggPT09IDEpIHJldHVybiB1bmlxdWVFeHRlbmRzWzBdO1xuICByZXR1cm4gdW5pcXVlRXh0ZW5kcztcbn1cblxuZnVuY3Rpb24gYWRkSW5jbHVkZVBhdGgoc2V0dGluZ3M6IFRzQ29uZmlnSnNvbiwgZGlyUGF0aDogc3RyaW5nKTogdm9pZCB7XG4gIHNldHRpbmdzLmluY2x1ZGUgPz89IFtdO1xuICBpZiAoIXNldHRpbmdzLmluY2x1ZGUuaW5jbHVkZXMoZGlyUGF0aCkpIHtcbiAgICBzZXR0aW5ncy5pbmNsdWRlLnB1c2goZGlyUGF0aCk7XG4gIH1cbn1cblxuZnVuY3Rpb24gbm9ybWFsaXplRXh0ZW5kcyh2YWx1ZTogVHNDb25maWdKc29uWydleHRlbmRzJ10pOiBzdHJpbmdbXSB7XG4gIGlmICghdmFsdWUpIHJldHVybiBbXTtcbiAgcmV0dXJuIEFycmF5LmlzQXJyYXkodmFsdWUpID8gdmFsdWUgOiBbdmFsdWVdO1xufVxuXG5mdW5jdGlvbiBub3JtYWxpemVTdHJpbmdBcnJheSh2YWx1ZTogdW5rbm93bik6IHN0cmluZ1tdIHtcbiAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycpIHJldHVybiBbdmFsdWVdO1xuICBpZiAoIUFycmF5LmlzQXJyYXkodmFsdWUpKSByZXR1cm4gW107XG4gIHJldHVybiB2YWx1ZS5maWx0ZXIoKGl0ZW0pOiBpdGVtIGlzIHN0cmluZyA9PiB0eXBlb2YgaXRlbSA9PT0gJ3N0cmluZycpO1xufVxuXG5mdW5jdGlvbiBzaG91bGREZWxldGVUeXBlUm9vdHModHlwZU5hbWVzOiBzdHJpbmdbXSk6IGJvb2xlYW4ge1xuICAvLyBPbmx5IGdlbmVyYXRlZCBwYWNrYWdlLW93bmVkIHRlc3QgdHlwZXMgc2hvdWxkIHRyaWdnZXIgdGhpcy4gVXNlci1kZWZpbmVkIHNsYXNoLWJhc2VkXG4gIC8vIGVudHJpZXMgbWF5IGludGVudGlvbmFsbHkgcmVseSBvbiBjdXN0b20gdHlwZVJvb3RzIGFuZCBzaG91bGQgYmUgcHJlc2VydmVkIGFzLWlzLlxuICByZXR1cm4gdHlwZU5hbWVzLnNvbWUoKHR5cGVOYW1lKSA9PiB0eXBlTmFtZSA9PT0gJ2N5cHJlc3MnIHx8IHR5cGVOYW1lLmluY2x1ZGVzKCcvJykpO1xufVxuXG5mdW5jdGlvbiBmaWx0ZXJFeGlzdGluZ1R5cGVzKGV4aXN0aW5nVHlwZXM6IHN0cmluZ1tdLCBnZW5lcmF0ZWRUeXBlczogc3RyaW5nW10pOiBzdHJpbmdbXSB7XG4gIGNvbnN0IGdlbmVyYXRlZFR5cGVTZXQgPSBuZXcgU2V0KGdlbmVyYXRlZFR5cGVzKTtcbiAgcmV0dXJuIGV4aXN0aW5nVHlwZXMuZmlsdGVyKCh0eXBlTmFtZSkgPT4ge1xuICAgIC8vIHdiZnkgb3ducyB0aGVzZSBwYWNrYWdlLXByb3ZpZGVkIHRlc3QgZ2xvYmFscy4gRHJvcCBzdGFsZSBlbnRyaWVzIHdoZW4gdGhlXG4gICAgLy8gY29ycmVzcG9uZGluZyBkZXBlbmRlbmN5IGlzIG5vIGxvbmdlciBwcmVzZW50IHNvIFR5cGVTY3JpcHQgd29uJ3QgcmVxdWlyZVxuICAgIC8vIG1pc3NpbmcgcGFja2FnZXMgc3VjaCBhcyB2aXRlc3QuXG4gICAgaWYgKGlzR2VuZXJhdGVkVGVzdEdsb2JhbFR5cGUodHlwZU5hbWUpICYmICFnZW5lcmF0ZWRUeXBlU2V0Lmhhcyh0eXBlTmFtZSkpIHJldHVybiBmYWxzZTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIGlzR2VuZXJhdGVkVGVzdEdsb2JhbFR5cGUodHlwZU5hbWU6IHN0cmluZyk6IGJvb2xlYW4ge1xuICByZXR1cm4gdHlwZU5hbWUgPT09ICdjeXByZXNzJyB8fCB0eXBlTmFtZSA9PT0gJ2plc3QnIHx8IHR5cGVOYW1lID09PSAnbW9jaGEnIHx8IHR5cGVOYW1lID09PSAndml0ZXN0L2dsb2JhbHMnO1xufVxuXG5mdW5jdGlvbiBsb3dlckNhc2VTZXR0aW5nKHZhbHVlOiB1bmtub3duKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycgPyB2YWx1ZS50b0xvd2VyQ2FzZSgpIDogdW5kZWZpbmVkO1xufVxuXG5mdW5jdGlvbiBwaWNrRXhpc3RpbmdFbWl0TWV0YWRhdGEoXG4gIGNvbXBpbGVyT3B0aW9uczogVHNDb25maWdKc29uWydjb21waWxlck9wdGlvbnMnXVxuKTogUGljazxOb25OdWxsYWJsZTxUc0NvbmZpZ0pzb25bJ2NvbXBpbGVyT3B0aW9ucyddPiwgJ2RlY2xhcmF0aW9uJyB8ICdkZWNsYXJhdGlvbk1hcCcgfCAnc291cmNlTWFwJz4ge1xuICBjb25zdCBlbWl0T3B0aW9ucyA9IHt9IGFzIFBpY2s8XG4gICAgTm9uTnVsbGFibGU8VHNDb25maWdKc29uWydjb21waWxlck9wdGlvbnMnXT4sXG4gICAgJ2RlY2xhcmF0aW9uJyB8ICdkZWNsYXJhdGlvbk1hcCcgfCAnc291cmNlTWFwJ1xuICA+O1xuICBmb3IgKGNvbnN0IGtleSBvZiBbJ2RlY2xhcmF0aW9uJywgJ2RlY2xhcmF0aW9uTWFwJywgJ3NvdXJjZU1hcCddIGFzIGNvbnN0KSB7XG4gICAgY29uc3QgdmFsdWUgPSBjb21waWxlck9wdGlvbnM/LltrZXldO1xuICAgIGlmICh2YWx1ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBlbWl0T3B0aW9uc1trZXldID0gdmFsdWUgYXMgbmV2ZXI7XG4gICAgfVxuICB9XG4gIHJldHVybiBlbWl0T3B0aW9ucztcbn1cblxuZnVuY3Rpb24gZ2V0R2VuZXJhdGVkVHlwZXMoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogc3RyaW5nW10ge1xuICBjb25zdCB0eXBlTmFtZXMgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgY29uc3QgZGVwZW5kZW5jaWVzID0ge1xuICAgIC4uLmNvbmZpZy5wYWNrYWdlSnNvbj8uZGVwZW5kZW5jaWVzLFxuICAgIC4uLmNvbmZpZy5wYWNrYWdlSnNvbj8uZGV2RGVwZW5kZW5jaWVzLFxuICB9O1xuXG4gIC8vIFJlYWN0IE5hdGl2ZSBnZXRzIGl0cyBhbWJpZW50IHR5cGVzIGZyb20gQHRzY29uZmlnL3JlYWN0LW5hdGl2ZSAocmVhY3QtbmF0aXZlLCBqZXN0KS5cbiAgaWYgKCFjb25maWcuZGVwZW5kaW5nLnJlYWN0TmF0aXZlKSB7XG4gICAgdHlwZU5hbWVzLmFkZCgnYnVuJyk7XG4gIH1cbiAgaWYgKFxuICAgIGRlcGVuZGVuY2llcy5qZXN0IHx8XG4gICAgZGVwZW5kZW5jaWVzWydAamVzdC9nbG9iYWxzJ10gfHxcbiAgICBkZXBlbmRlbmNpZXNbJ2plc3QtZW52aXJvbm1lbnQtanNkb20nXSB8fFxuICAgIGRlcGVuZGVuY2llc1sndHMtamVzdCddXG4gICkge1xuICAgIHR5cGVOYW1lcy5hZGQoJ2plc3QnKTtcbiAgfVxuICBpZiAoZGVwZW5kZW5jaWVzLnZpdGVzdCkge1xuICAgIHR5cGVOYW1lcy5hZGQoJ3ZpdGVzdC9nbG9iYWxzJyk7XG4gIH1cbiAgaWYgKGRlcGVuZGVuY2llcy5tb2NoYSkge1xuICAgIHR5cGVOYW1lcy5hZGQoJ21vY2hhJyk7XG4gIH1cbiAgaWYgKGRlcGVuZGVuY2llcy5jeXByZXNzKSB7XG4gICAgdHlwZU5hbWVzLmFkZCgnY3lwcmVzcycpO1xuICB9XG5cbiAgcmV0dXJuIFsuLi50eXBlTmFtZXNdO1xufVxuIiwiaW1wb3J0IG9zIGZyb20gJ25vZGU6b3MnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IG1lcmdlIGZyb20gJ2RlZXBtZXJnZSc7XG5cbmltcG9ydCB7IGZzVXRpbCB9IGZyb20gJy4uL3V0aWxzL2ZzVXRpbC5qcyc7XG5pbXBvcnQgeyBqc29uY1V0aWwgfSBmcm9tICcuLi91dGlscy9qc29uY1V0aWwuanMnO1xuXG4vKipcbiAqIFRoZSB1c2VyLWxldmVsIGluc3RydWN0aW9uIGZpbGUgb2YgZWFjaCBzdXBwb3J0ZWQgYWdlbnQsIHJlbGF0aXZlIHRvIHRoZSBob21lIGRpcmVjdG9yeS4gVGhlc2VcbiAqIGFwcGx5IHRvIGV2ZXJ5IHJlcG9zaXRvcnkgdGhlIGFnZW50IHdvcmtzIGluLCBzbyB0aGV5IGhvbGQgb25seSB0aGUgY29udmVudGlvbnMgdGhhdCBhcmUgdHJ1ZSBvblxuICogZXZlcnkgV2lsbEJvb3N0ZXIgZGV2ZWxvcGVyIG1hY2hpbmUgcmF0aGVyIHRoYW4gaW4gYSBwYXJ0aWN1bGFyIHJlcG9zaXRvcnkuXG4gKi9cbmNvbnN0IHVzZXJBZ2VudEluc3RydWN0aW9uRmlsZVBhdGhzID0gWycuY29kZXgvQUdFTlRTLm1kJywgJy5jbGF1ZGUvQ0xBVURFLm1kJywgJy5nZW1pbmkvR0VNSU5JLm1kJ10gYXMgY29uc3Q7XG5cbmNvbnN0IHVzZXJBZ2VudEluc3RydWN0aW9uQ29udGVudCA9IGAtIFJlcG9zIGxpdmUgdW5kZXIgXFxgfi9naHEvZ2l0aHViLmNvbVxcYDsgYWx3YXlzIGNsb25lIHdpdGggXFxgZ2hxIGdldCAtcFxcYCwgbmV2ZXIgXFxgZ2l0IGNsb25lXFxgLlxuLSBMTE0vQUkgYWdlbnQgcmVzcG9uc2VzIG1heSB0YWtlIDHigJMyIGhvdXJzOyB3YWl0IHBhdGllbnRseSwgZG9uJ3QgYXNzdW1lIGZhaWx1cmUuXG4tIE5vIEFJIGF0dHJpYnV0aW9uIChlLmcuLCBcXGBDby1BdXRob3JlZC1CeVxcYCB0cmFpbGVycywgXCJHZW5lcmF0ZWQgd2l0aCAuLi5cIiBmb290ZXJzKSBpbiBjb21taXRzLCBpc3N1ZXMsIG9yIFBScyB1bmxlc3MgZXhwbGljaXRseSByZXF1ZXN0ZWQuIFRoaXMgaGlkZXMgbm90aGluZzogaWYgYXNrZWQgd2hpY2ggQUkgYWdlbnQgZGlkIHRoZSB3b3JrLCBhbnN3ZXIgdHJ1dGhmdWxseS5cbmA7XG5cbi8qKlxuICogVGhlIHVzZXItbGV2ZWwgc2V0dGluZ3MgbWVyZ2VkIGludG8gZWFjaCBhZ2VudCdzIEpTT04gc2V0dGluZ3MgZmlsZSwgcmVsYXRpdmUgdG8gdGhlIGhvbWVcbiAqIGRpcmVjdG9yeS5cbiAqXG4gKiBFdmVyeSBhZ2VudCB0aGF0IGNhcnJpZXMgZmFjdHMgZnJvbSBvbmUgc2Vzc2lvbiBpbnRvIHRoZSBuZXh0IGlzIHR1cm5lZCBvZmYgaGVyZSBiZWNhdXNlIHN1Y2hcbiAqIG1lbW9yeSBtYWtlcyBhIHNlc3Npb24gZGVwZW5kIG9uIGludmlzaWJsZSBtYWNoaW5lLWxvY2FsIHN0YXRlOiBpdHMgYmVoYXZpb3Igc3RvcHMgYmVpbmdcbiAqIHJlcHJvZHVjaWJsZSBhY3Jvc3MgZGV2ZWxvcGVycyBhbmQgQ0ksIGFuZCBhIHN0YWxlIG9yIHdyb25nIG1lbW9yeSBzaWxlbnRseSBvdmVycmlkZXMgdGhlXG4gKiBpbnN0cnVjdGlvbiBmaWxlcyBhYm92ZS4gQ29kZXggbmVlZHMgbm8gZW50cnkgYmVjYXVzZSBpdHMgbWVtb3JpZXMgYXJlIG9wdC1pblxuICogKGBbZmVhdHVyZXNdIG1lbW9yaWVzID0gdHJ1ZWAgaW4gYH4vLmNvZGV4L2NvbmZpZy50b21sYCksIHNvIGxlYXZpbmcgdGhhdCBmbGFnIHVuc2V0IGlzIGVub3VnaC5cbiAqL1xuY29uc3QgYWdlbnRTZXR0aW5ncyA9IFtcbiAge1xuICAgIHJlbGF0aXZlUGF0aDogJy5jbGF1ZGUvc2V0dGluZ3MuanNvbicsXG4gICAgYWNjZXB0c0NvbW1lbnRzOiBmYWxzZSxcbiAgICAvKipcbiAgICAgKiBDbGF1ZGUgQ29kZSBpbmplY3RzIGl0cyBvd24gYXR0cmlidXRpb24gZGlyZWN0aXZlIChhIGBDby1BdXRob3JlZC1CeWAgdHJhaWxlciwgYSBcIkdlbmVyYXRlZFxuICAgICAqIHdpdGhcIiBmb290ZXIsIGFuZCBhIHNlc3Npb24gbGluaykgaW50byB0aGUgdG9vbCBkZXNjcmlwdGlvbnMgYW5kIG1pZC1zZXNzaW9uIHJlbWluZGVycywgYW5kXG4gICAgICogdGhhdCBkaXJlY3RpdmUgZGVjbGFyZXMgaXRzZWxmIHRvIHJlcGxhY2UgZWFybGllciBndWlkYW5jZSwgc28gdGhlIGluc3RydWN0aW9uIGZpbGUgYWxvbmVcbiAgICAgKiBjYW5ub3Qgc3VwcHJlc3MgaXQuIE9ubHkgdGhpcyBzZXR0aW5nIHJlbW92ZXMgdGhlIGRpcmVjdGl2ZSBhdCBpdHMgc291cmNlLiBBdXRvIG1lbW9yeSBpcyBvblxuICAgICAqIGJ5IGRlZmF1bHQsIHNvIGl0IG11c3QgYmUgdHVybmVkIG9mZiBleHBsaWNpdGx5LlxuICAgICAqL1xuICAgIHNldHRpbmdzOiB7XG4gICAgICBhdHRyaWJ1dGlvbjoge1xuICAgICAgICBjb21taXQ6ICcnLFxuICAgICAgICBwcjogJycsXG4gICAgICAgIHNlc3Npb25Vcmw6IGZhbHNlLFxuICAgICAgfSxcbiAgICAgIGF1dG9NZW1vcnlFbmFibGVkOiBmYWxzZSxcbiAgICB9LFxuICB9LFxuICB7XG4gICAgcmVsYXRpdmVQYXRoOiAnLmdlbWluaS9zZXR0aW5ncy5qc29uJyxcbiAgICAvLyBHZW1pbmkgQ0xJIHN0cmlwcyBjb21tZW50cyBiZWZvcmUgcGFyc2luZyBpdHMgc2V0dGluZ3MgZmlsZSwgdW5saWtlIENsYXVkZSBDb2RlLCB3aGljaFxuICAgIC8vIHJlamVjdHMgYSBjb21tZW50ZWQgZmlsZSBhcyBtYWxmb3JtZWQuXG4gICAgYWNjZXB0c0NvbW1lbnRzOiB0cnVlLFxuICAgIHNldHRpbmdzOiB7XG4gICAgICBleHBlcmltZW50YWw6IHtcbiAgICAgICAgYXV0b01lbW9yeTogZmFsc2UsXG4gICAgICB9LFxuICAgIH0sXG4gIH0sXG5dIGFzIGNvbnN0O1xuXG4vKipcbiAqIE92ZXJ3cml0ZXMgdGhlIHVzZXItbGV2ZWwgaW5zdHJ1Y3Rpb24gZmlsZXMgb2YgZXZlcnkgc3VwcG9ydGVkIGFnZW50IHdpdGggdGhlIGZpeGVkIGNvbnRlbnQgYW5kXG4gKiBtZXJnZXMgdGhlIGZpeGVkIHNldHRpbmdzIGludG8gZWFjaCBhZ2VudCdzIHVzZXIgc2V0dGluZ3MuIFJldHVybnMgZmFsc2Ugd2hlbiBhbnkgZmlsZSB3YXNcbiAqIHNraXBwZWQgKGUuZy4gYSBzeW1saW5rZWQgb3IgdW5wYXJzYWJsZSBmaWxlKSwgc28gdGhlIGNvbW1hbmQgY2FuIGZhaWwgbG91ZGx5LlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVVc2VyQWdlbnRDb25maWdzKCk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICBsZXQgaGFzV3JpdHRlbkFsbCA9IHRydWU7XG4gIGZvciAoY29uc3QgcmVsYXRpdmVQYXRoIG9mIHVzZXJBZ2VudEluc3RydWN0aW9uRmlsZVBhdGhzKSB7XG4gICAgY29uc3QgaGFzV3JpdHRlbiA9IGF3YWl0IGZzVXRpbC5nZW5lcmF0ZUZpbGUocGF0aC5qb2luKG9zLmhvbWVkaXIoKSwgcmVsYXRpdmVQYXRoKSwgdXNlckFnZW50SW5zdHJ1Y3Rpb25Db250ZW50KTtcbiAgICBoYXNXcml0dGVuQWxsICYmPSBoYXNXcml0dGVuO1xuICB9XG4gIGZvciAoY29uc3QgeyBhY2NlcHRzQ29tbWVudHMsIHJlbGF0aXZlUGF0aCwgc2V0dGluZ3MgfSBvZiBhZ2VudFNldHRpbmdzKSB7XG4gICAgLy8gQXdhaXRlZCBzZXBhcmF0ZWx5OiBgJiY9YCB3b3VsZCBza2lwIHRoZSBtZXJnZSBvbmNlIGFuIGVhcmxpZXIgZmlsZSB3YXMgc2tpcHBlZC5cbiAgICBjb25zdCBoYXNNZXJnZWQgPSBhd2FpdCBtZXJnZUFnZW50U2V0dGluZ3MocmVsYXRpdmVQYXRoLCBzZXR0aW5ncywgYWNjZXB0c0NvbW1lbnRzKTtcbiAgICBoYXNXcml0dGVuQWxsICYmPSBoYXNNZXJnZWQ7XG4gIH1cbiAgcmV0dXJuIGhhc1dyaXR0ZW5BbGw7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIG1lcmdlQWdlbnRTZXR0aW5ncyhcbiAgcmVsYXRpdmVQYXRoOiBzdHJpbmcsXG4gIG5ld1NldHRpbmdzOiBvYmplY3QsXG4gIGFjY2VwdHNDb21tZW50czogYm9vbGVhblxuKTogUHJvbWlzZTxib29sZWFuPiB7XG4gIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5qb2luKG9zLmhvbWVkaXIoKSwgcmVsYXRpdmVQYXRoKTtcbiAgY29uc3QgZXhpc3RpbmdDb250ZW50ID0gYXdhaXQgZnNVdGlsLnJlYWRGaWxlSWZFeGlzdHMoZmlsZVBhdGgpO1xuICBsZXQgZXhpc3RpbmdTZXR0aW5nczogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPSB7fTtcbiAgaWYgKGV4aXN0aW5nQ29udGVudCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgLy8gQW4gYWdlbnQgaWdub3JlcyBpdHMgd2hvbGUgc2V0dGluZ3MgZmlsZSB3aGVuIHRoZSBmaWxlIGJyZWFrcyB0aGUgZ3JhbW1hciB0aGUgYWdlbnQgcmVhZHMgaXRcbiAgICAvLyB3aXRoLCBzbyB3YmZ5IGxlYXZlcyBzdWNoIGEgZmlsZSB0byB0aGUgZGV2ZWxvcGVyIHRvIHJlcGFpciByYXRoZXIgdGhhbiByZXdyaXRpbmcgaXQgaW50byBhXG4gICAgLy8gZmlsZSB0aGUgYWdlbnQgc3RpbGwgaWdub3JlczogY29tbWVudHMgYXJlIHRvbGVyYXRlZCBvbmx5IHdoZXJlIHRoZSBhZ2VudCBzdHJpcHMgdGhlbSwgYW5kXG4gICAgLy8gdHJhaWxpbmcgY29tbWFzIG5vd2hlcmUsIHNpbmNlIGJvdGggYWdlbnRzIHBhcnNlIHdpdGggSlNPTi5wYXJzZSBpbiB0aGUgZW5kLiBDb21tZW50LW9ubHlcbiAgICAvLyBjb250ZW50IGlzIGNoZWNrZWQgdG9vLCBiZWNhdXNlIGl0IGlzIGtlcHQgYXMgYSBoZWFkZXIgYWJvdmUgdGhlIGdlbmVyYXRlZCBvYmplY3QuXG4gICAgaWYgKCFhY2NlcHRzQ29tbWVudHMgJiYganNvbmNVdGlsLmNvbnRhaW5zQ29tbWVudChleGlzdGluZ0NvbnRlbnQpKSB7XG4gICAgICBjb25zb2xlLndhcm4oYFNraXBwZWQgdXBkYXRpbmcgJHtmaWxlUGF0aH0gYmVjYXVzZSB0aGlzIGFnZW50IHJlYWRzIGl0IGFzIHN0cmljdCBKU09OLCBjb21tZW50cyBhbmQgYWxsLmApO1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBpZiAoIWpzb25jVXRpbC5pc1RyaXZpYU9ubHkoZXhpc3RpbmdDb250ZW50KSkge1xuICAgICAgY29uc3QgcGFyc2VkU2V0dGluZ3MgPSBqc29uY1V0aWwucGFyc2VPYmplY3RJZ25vcmluZ0Vycm9yPFJlY29yZDxzdHJpbmcsIHVua25vd24+PihleGlzdGluZ0NvbnRlbnQsIGZhbHNlKTtcbiAgICAgIGlmICghcGFyc2VkU2V0dGluZ3MpIHtcbiAgICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICAgIGBTa2lwcGVkIHVwZGF0aW5nICR7ZmlsZVBhdGh9IGJlY2F1c2UgdGhlIGV4aXN0aW5nIGNvbnRlbnQgaXMgbm90IGEgc3RyaWN0IEpTT04gb2JqZWN0IChhIHRyYWlsaW5nIGNvbW1hLCBmb3IgZXhhbXBsZSwgaXMgbm90IGFsbG93ZWQpLmBcbiAgICAgICAgKTtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgICAgZXhpc3RpbmdTZXR0aW5ncyA9IHBhcnNlZFNldHRpbmdzO1xuICAgIH1cbiAgfVxuICBjb25zdCBzZXR0aW5ncyA9IG1lcmdlKGV4aXN0aW5nU2V0dGluZ3MsIG5ld1NldHRpbmdzKTtcbiAgLy8gT25seSB0aGUgcHJvcGVydGllcyB3aG9zZSB2YWx1ZSBjaGFuZ2VzIGFyZSByZXdyaXR0ZW4sIHNvIHRoZSBmaWxlIGtlZXBzIGl0cyBvd24gZm9ybWF0dGluZ1xuICAvLyBhbmQsIHdoZXJlIHRoZSBhZ2VudCBhbGxvd3MgdGhlbSwgaXRzIGNvbW1lbnRzLlxuICBjb25zdCB7IGNvbnRlbnQsIGtleXNMb3NpbmdDb21tZW50cyB9ID0ganNvbmNVdGlsLnN0cmluZ2lmeVByZXNlcnZpbmdUcml2aWEoZXhpc3RpbmdDb250ZW50LCBzZXR0aW5ncyk7XG4gIGlmICghKGF3YWl0IGZzVXRpbC5nZW5lcmF0ZUZpbGUoZmlsZVBhdGgsIGNvbnRlbnQpKSkgcmV0dXJuIGZhbHNlO1xuXG4gIGZvciAoY29uc3Qga2V5IG9mIGtleXNMb3NpbmdDb21tZW50cykge1xuICAgIGNvbnNvbGUud2FybihgQ29tbWVudHMgaW5zaWRlIFwiJHtrZXl9XCIgd2VyZSBkcm9wcGVkIHdoaWxlIHJld3JpdGluZyBpdCBpbiAke2ZpbGVQYXRofS5gKTtcbiAgfVxuICByZXR1cm4gdHJ1ZTtcbn1cbiIsImltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCBtZXJnZSBmcm9tICdkZWVwbWVyZ2UnO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBmc1V0aWwgfSBmcm9tICcuLi91dGlscy9mc1V0aWwuanMnO1xuaW1wb3J0IHsganNvbmNVdGlsIH0gZnJvbSAnLi4vdXRpbHMvanNvbmNVdGlsLmpzJztcbmltcG9ydCB7IHNvcnRLZXlzIH0gZnJvbSAnLi4vdXRpbHMvb2JqZWN0VXRpbC5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcblxuY29uc3QgZXhjbHVkZUZpbGVQYXR0ZXJucyA9IFtcbiAgJyoqLy5naXQvb2JqZWN0cy8qKicsXG4gICcqKi8uZ2l0L3N1YnRyZWUtY2FjaGUvKionLFxuICAnKiovbm9kZV9tb2R1bGVzLyoqJyxcbiAgJyoqL3RtcC8qKicsXG4gICcqKi90ZW1wLyoqJyxcbiAgJyoqL2Rpc3QvKionLFxuXTtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlVnNjb2RlU2V0dGluZ3MoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZ2VuZXJhdGVWc2NvZGVTZXR0aW5ncycsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJy52c2NvZGUnLCAnc2V0dGluZ3MuanNvbicpO1xuICAgIGNvbnN0IGV4aXN0aW5nQ29udGVudCA9IGF3YWl0IGZzVXRpbC5yZWFkRmlsZUlmRXhpc3RzKGZpbGVQYXRoKTtcbiAgICBpZiAoZXhpc3RpbmdDb250ZW50ID09PSB1bmRlZmluZWQgfHwganNvbmNVdGlsLmlzVHJpdmlhT25seShleGlzdGluZ0NvbnRlbnQpKSByZXR1cm47XG4gICAgLy8gLnZzY29kZS9zZXR0aW5ncy5qc29uIGlzIEpTT05DIGJ5IGRlZmluaXRpb247IEpTT04ucGFyc2Ugd291bGQgbWFrZSB3YmZ5IHNpbGVudGx5IHNraXBcbiAgICAvLyBjb21tZW50ZWQgZmlsZXMuXG4gICAgY29uc3QgcGFyc2VkU2V0dGluZ3MgPSBqc29uY1V0aWwucGFyc2VPYmplY3RJZ25vcmluZ0Vycm9yPG9iamVjdD4oZXhpc3RpbmdDb250ZW50KTtcbiAgICBpZiAoIXBhcnNlZFNldHRpbmdzKSB7XG4gICAgICBjb25zb2xlLndhcm4oYFNraXBwZWQgdXBkYXRpbmcgJHtmaWxlUGF0aH0gYmVjYXVzZSB0aGUgZXhpc3RpbmcgY29udGVudCBpcyBub3QgcGFyc2FibGUgYXMgSlNPTkMuYCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IG9yaWdpbmFsU2V0dGluZ3NKc29uID0gSlNPTi5zdHJpbmdpZnkoc29ydEtleXMoc3RydWN0dXJlZENsb25lKHBhcnNlZFNldHRpbmdzKSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPikpO1xuICAgIGxldCBzZXR0aW5ncyA9IHBhcnNlZFNldHRpbmdzO1xuICAgIGZvciAoY29uc3QgZXhjbHVkZUZpbGVQYXR0ZXJuIG9mIGV4Y2x1ZGVGaWxlUGF0dGVybnMpIHtcbiAgICAgIHNldHRpbmdzID0gbWVyZ2UuYWxsKFtzZXR0aW5ncywgZXhjbHVkZVNldHRpbmcoZXhjbHVkZUZpbGVQYXR0ZXJuKV0pO1xuICAgIH1cbiAgICBpZiAoY29uZmlnLmRvZXNDb250YWluUG9ldHJ5TG9jayB8fCBjb25maWcuZG9lc0NvbnRhaW5VdkxvY2spIHtcbiAgICAgIHNldHRpbmdzID0gbWVyZ2UuYWxsKFtzZXR0aW5ncywgZXhjbHVkZVNldHRpbmcoJyoqLy52ZW52LyoqJyldKTtcbiAgICB9XG4gICAgaWYgKGNvbmZpZy5kZXBlbmRpbmcubmV4dCkge1xuICAgICAgc2V0dGluZ3MgPSBtZXJnZS5hbGwoW3NldHRpbmdzLCBleGNsdWRlU2V0dGluZygnKiovLm5leHQvKionKV0pO1xuICAgIH1cbiAgICBzb3J0S2V5cyhzZXR0aW5ncyBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPik7XG4gICAgLy8gU2tpcCB0aGUgd3JpdGUgd2hlbiBub3RoaW5nIGNoYW5nZXMgc2VtYW50aWNhbGx5LCBzbyBKU09OQyBjb21tZW50cyBhbmQgZm9ybWF0dGluZyBpbiBhblxuICAgIC8vIGFscmVhZHktY2xlYW4gc2V0dGluZ3MuanNvbiBzdXJ2aXZlIHdiZnkgcnVucy5cbiAgICBpZiAoSlNPTi5zdHJpbmdpZnkoc2V0dGluZ3MpID09PSBvcmlnaW5hbFNldHRpbmdzSnNvbikgcmV0dXJuO1xuICAgIGNvbnN0IG5ld0NvbnRlbnQgPSBKU09OLnN0cmluZ2lmeShzZXR0aW5ncywgdW5kZWZpbmVkLCAyKTtcbiAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnNVdGlsLmdlbmVyYXRlRmlsZShmaWxlUGF0aCwgbmV3Q29udGVudCkpO1xuICB9KTtcbn1cblxuZnVuY3Rpb24gZXhjbHVkZVNldHRpbmcoZXhjbHVkZUZpbGVQYXR0ZXJuOiBzdHJpbmcpOiBvYmplY3Qge1xuICByZXR1cm4ge1xuICAgICdmaWxlcy53YXRjaGVyRXhjbHVkZSc6IHtcbiAgICAgIFtleGNsdWRlRmlsZVBhdHRlcm5dOiB0cnVlLFxuICAgIH0sXG4gIH07XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBmc1V0aWwgfSBmcm9tICcuLi91dGlscy9mc1V0aWwuanMnO1xuXG5pbnRlcmZhY2UgRm5veFRvbWxTdWJ0cmVlIHtcbiAgc2VjcmV0cz86IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICBwcm9maWxlcz86IFJlY29yZDxzdHJpbmcsIHsgc2VjcmV0cz86IFJlY29yZDxzdHJpbmcsIHVua25vd24+IH0gfCB1bmRlZmluZWQ+O1xufVxuXG4vLyBUaGUgZm91ciBzdGFuZGFyZCBXQl9FTlYgbW9kZXM7IHN0YWdpbmcgaXMgb3B0aW9uYWwgYW5kIG9ubHkgY29tcGxldGVkIHdoZW4gdGhlIHJlcG9zaXRvcnlcbi8vIGFscmVhZHkgZGVjbGFyZXMgdGhlIHN0YWdpbmcgcHJvZmlsZS5cbmNvbnN0IHdiRW52TW9kZXMgPSBbJ2RldmVsb3BtZW50JywgJ3Rlc3QnLCAnc3RhZ2luZycsICdwcm9kdWN0aW9uJ10gYXMgY29uc3Q7XG50eXBlIFdiRW52TW9kZSA9ICh0eXBlb2Ygd2JFbnZNb2RlcylbbnVtYmVyXTtcblxuLyoqXG4gKiBFbnN1cmVzIGEgZm5veCByZXBvc2l0b3J5IGRlZmluZXMgV0JfRU5WIGZvciBldmVyeSBzdGFuZGFyZCBtb2RlIChhbmQgTkVYVF9QVUJMSUNfV0JfRU5WIHdoZW5cbiAqIGFueSB3b3Jrc3BhY2UgZGVwZW5kcyBvbiBOZXh0LmpzIG9yIHZpbmV4dCkgaW4gZm5veC50b21sIHByb2ZpbGVzLiBFeGlzdGluZyBkZWZpbml0aW9ucyBhcmVcbiAqIGFsd2F5cyBsZWZ0IHVudG91Y2hlZC4gTm9uLWZub3ggcmVwb3NpdG9yaWVzIGFyZSBza2lwcGVkOiAuZW52IGZpbGVzIGFyZSBubyBsb25nZXIgbWFuYWdlZC5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGVuc3VyZVdiRW52RGVmaW5pdGlvbnMocm9vdENvbmZpZzogUGFja2FnZUNvbmZpZywgYWxsQ29uZmlnczogUGFja2FnZUNvbmZpZ1tdKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZW5zdXJlV2JFbnZEZWZpbml0aW9ucycsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBuZWVkc05leHRQdWJsaWMgPSBhbGxDb25maWdzLnNvbWUoKGNvbmZpZykgPT4gcmVxdWlyZXNOZXh0UHVibGljV2JFbnYoY29uZmlnKSk7XG4gICAgY29uc3QgZm5veFRvbWxQYXRoID0gcGF0aC5yZXNvbHZlKHJvb3RDb25maWcuZGlyUGF0aCwgJ2Zub3gudG9tbCcpO1xuICAgIC8vIGxzdGF0LCBub3QgZXhpc3RzU3luYzogZXhpc3RzU3luYyBpcyBmYWxzZSBmb3IgYSBEQU5HTElORyBmbm94LnRvbWwgc3ltbGluazsgYW55IGZub3gudG9tbFxuICAgIC8vIGRpcmVjdG9yeSBlbnRyeSBtYXJrcyBhIGZub3ggcmVwb3NpdG9yeSwgYW5kIGEgcmVmdXNlZC9kYW5nbGluZyBvbmUgYWJvcnRzIGluc3RlYWQgb2ZcbiAgICAvLyBiZWluZyB0cmVhdGVkIGFzIGEgbm9uLWZub3ggcmVwb3NpdG9yeSB3aGlsZSB0aGUgZm5veCBzeW5jaHJvbml6YXRpb24gaXMgZmFpbGluZy5cbiAgICBpZiAoIShhd2FpdCBmcy5wcm9taXNlcy5sc3RhdChmbm94VG9tbFBhdGgpLmNhdGNoKCgpID0+IHt9KSkpIHJldHVybjtcbiAgICBjb25zdCBjb250ZW50ID0gYXdhaXQgZnNVdGlsLnJlYWRGaWxlQ29uZmluZWRJZkV4aXN0cyhmbm94VG9tbFBhdGgpO1xuICAgIGlmIChjb250ZW50ID09PSB1bmRlZmluZWQpIHJldHVybjtcbiAgICBjb25zdCB1cGRhdGVkQ29udGVudCA9IGluc2VydFdiRW52SW50b0Zub3hUb21sKGNvbnRlbnQsIG5lZWRzTmV4dFB1YmxpYyk7XG4gICAgaWYgKHVwZGF0ZWRDb250ZW50ICE9PSB1bmRlZmluZWQgJiYgdXBkYXRlZENvbnRlbnQgIT09IGNvbnRlbnQpIHtcbiAgICAgIGF3YWl0IGZzVXRpbC5nZW5lcmF0ZUZpbGUoZm5veFRvbWxQYXRoLCB1cGRhdGVkQ29udGVudCk7XG4gICAgfVxuICB9KTtcbn1cblxuLyoqXG4gKiBNaXJyb3JzIHdiJ3MgcmVxdWlyZXNOZXh0UHVibGljV2JFbnYgY29udHJhY3QgKHBhY2thZ2VzL3diL3NyYy9wcm9qZWN0LnRzKTogdGhlIGZyYW1ld29yayBtYXlcbiAqIGJlIGRlY2xhcmVkIGluIEFOWSBvZiB0aGUgZm91ciBkZXBlbmRlbmN5IHNlY3Rpb25zIChlLmcuIGBuZXh0YCBhcyBhIGRldkRlcGVuZGVuY3kgaW4gYSBzaGFyZWRcbiAqIGNvbXBvbmVudCBsaWJyYXJ5KSwgd2hpbGUgd2JmeSdzIGBkZXBlbmRpbmcubmV4dGAgbG9va3Mgb25seSBhdCByZWd1bGFyIGRlcGVuZGVuY2llcy5cbiAqL1xuZnVuY3Rpb24gcmVxdWlyZXNOZXh0UHVibGljV2JFbnYoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogYm9vbGVhbiB7XG4gIHJldHVybiBbJ2RlcGVuZGVuY2llcycsICdkZXZEZXBlbmRlbmNpZXMnLCAnb3B0aW9uYWxEZXBlbmRlbmNpZXMnLCAncGVlckRlcGVuZGVuY2llcyddLnNvbWUoKHNlY3Rpb24pID0+IHtcbiAgICBjb25zdCBkZXBlbmRlbmNpZXMgPSBjb25maWcucGFja2FnZUpzb24/LltzZWN0aW9uIGFzICdkZXBlbmRlbmNpZXMnXTtcbiAgICByZXR1cm4gISFkZXBlbmRlbmNpZXM/LlsnbmV4dCddIHx8ICEhZGVwZW5kZW5jaWVzPy5bJ3ZpbmV4dCddO1xuICB9KTtcbn1cblxuLyoqXG4gKiBJbnNlcnRzIG1pc3NpbmcgV0JfRU5WIChhbmQgb3B0aW9uYWxseSBORVhUX1BVQkxJQ19XQl9FTlYpIGVudHJpZXMgaW50byBhIGZub3gudG9tbDogdGhlIGJhc2VcbiAqIGBbc2VjcmV0c11gIHRhYmxlIGNhcnJpZXMgdGhlIGRldmVsb3BtZW50IGRlZmF1bHRzIGFuZCBgW3Byb2ZpbGVzLjxtb2RlPi5zZWNyZXRzXWAgb3ZlcmxheXNcbiAqIGVhY2ggb3RoZXIgbW9kZSwgbWF0Y2hpbmcgdGhlIG9yZy1zdGFuZGFyZCBsYXlvdXQuIEZvcm1hdHRpbmcgYW5kIGNvbW1lbnRzIGFyZSBwcmVzZXJ2ZWQ7IG9ubHlcbiAqIG1pc3NpbmcgbGluZXMgYXJlIGluc2VydGVkIG9yIG1pc3Npbmcgc2VjdGlvbnMgYXBwZW5kZWQuIFJldHVybnMgdW5kZWZpbmVkIHdoZW4gdGhlIGNvbnRlbnRcbiAqIGNhbm5vdCBiZSBzYWZlbHkgZWRpdGVkICh1bnBhcnNhYmxlIGJlZm9yZSBvciBhZnRlciB0aGUgZWRpdCkuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpbnNlcnRXYkVudkludG9Gbm94VG9tbChjb250ZW50OiBzdHJpbmcsIG5lZWRzTmV4dFB1YmxpYzogYm9vbGVhbik6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGxldCBzZXR0aW5nczogRm5veFRvbWxTdWJ0cmVlO1xuICB0cnkge1xuICAgIHNldHRpbmdzID0gQnVuLlRPTUwucGFyc2UoY29udGVudCkgYXMgRm5veFRvbWxTdWJ0cmVlO1xuICB9IGNhdGNoIHtcbiAgICBjb25zb2xlLndhcm4oJ1NraXBwZWQgaW5zZXJ0aW5nIFdCX0VOViBpbnRvIGZub3gudG9tbCBiZWNhdXNlIGl0IGlzIG5vdCBwYXJzYWJsZSBhcyBUT01MLicpO1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cblxuICBjb25zdCBrZXlOYW1lcyA9IG5lZWRzTmV4dFB1YmxpYyA/IFsnV0JfRU5WJywgJ05FWFRfUFVCTElDX1dCX0VOViddIDogWydXQl9FTlYnXTtcbiAgbGV0IHVwZGF0ZWRDb250ZW50ID0gY29udGVudDtcbiAgZm9yIChjb25zdCBtb2RlIG9mIHdiRW52TW9kZXMpIHtcbiAgICAvLyBUaGUgc3RhZ2luZyBtb2RlIGlzIG9wdGlvbmFsOiBjb21wbGV0ZSBpdCBvbmx5IHdoZW4gdGhlIHJlcG9zaXRvcnkgYWxyZWFkeSBkZWNsYXJlcyB0aGUgcHJvZmlsZS5cbiAgICBpZiAobW9kZSA9PT0gJ3N0YWdpbmcnICYmICFzZXR0aW5ncy5wcm9maWxlcz8uc3RhZ2luZykgY29udGludWU7XG4gICAgY29uc3QgZGVmaW5lZEtleXMgPSBtb2RlID09PSAnZGV2ZWxvcG1lbnQnID8gc2V0dGluZ3Muc2VjcmV0cyA6IHNldHRpbmdzLnByb2ZpbGVzPy5bbW9kZV0/LnNlY3JldHM7XG4gICAgZm9yIChjb25zdCBrZXlOYW1lIG9mIGtleU5hbWVzKSB7XG4gICAgICBjb25zdCBkZWZpbmVkID0gZGVmaW5lZEtleXM/LltrZXlOYW1lXTtcbiAgICAgIGNvbnN0IGRlZmluZWRWYWx1ZSA9XG4gICAgICAgIHR5cGVvZiBkZWZpbmVkID09PSAnc3RyaW5nJyA/IGRlZmluZWQgOiAoZGVmaW5lZCBhcyB7IGRlZmF1bHQ/OiB1bmtub3duIH0gfCB1bmRlZmluZWQpPy5kZWZhdWx0O1xuICAgICAgd2Fybk9uVW5leHBlY3RlZFdiRW52VmFsdWUoa2V5TmFtZSwgZGVmaW5lZFZhbHVlLCBtb2RlKTtcbiAgICB9XG4gICAgY29uc3QgbWlzc2luZ0xpbmVzID0ga2V5TmFtZXNcbiAgICAgIC5maWx0ZXIoKGtleU5hbWUpID0+IGRlZmluZWRLZXlzPy5ba2V5TmFtZV0gPT09IHVuZGVmaW5lZClcbiAgICAgIC5tYXAoKGtleU5hbWUpID0+IGAke2tleU5hbWV9ID0geyBkZWZhdWx0ID0gXCIke21vZGV9XCIgfWApO1xuICAgIGlmIChtaXNzaW5nTGluZXMubGVuZ3RoID09PSAwKSBjb250aW51ZTtcbiAgICB1cGRhdGVkQ29udGVudCA9IGluc2VydEludG9Gbm94U2VjdGlvbihcbiAgICAgIHVwZGF0ZWRDb250ZW50LFxuICAgICAgbW9kZSA9PT0gJ2RldmVsb3BtZW50JyA/ICdzZWNyZXRzJyA6IGBwcm9maWxlcy4ke21vZGV9LnNlY3JldHNgLFxuICAgICAgbWlzc2luZ0xpbmVzXG4gICAgKTtcbiAgfVxuICBpZiAodXBkYXRlZENvbnRlbnQgPT09IGNvbnRlbnQpIHJldHVybiBjb250ZW50O1xuXG4gIC8vIFJlLXBhcnNlIGJlZm9yZSByZXR1cm5pbmc6IGFuIHVudXN1YWwgbGF5b3V0IChlLmcuIGRvdHRlZCBrZXlzIHdpdGhvdXQgYSB0YWJsZSBoZWFkZXIpIGNvdWxkXG4gIC8vIG1ha2UgdGhlIHRleHR1YWwgZWRpdCBwcm9kdWNlIGEgZHVwbGljYXRlIHRhYmxlOyBmYWlsIHNhZmVseSBpbnN0ZWFkIG9mIGNvcnJ1cHRpbmcgdGhlIGZpbGUuXG4gIHRyeSB7XG4gICAgY29uc3QgdXBkYXRlZFNldHRpbmdzID0gQnVuLlRPTUwucGFyc2UodXBkYXRlZENvbnRlbnQpIGFzIEZub3hUb21sU3VidHJlZTtcbiAgICBmb3IgKGNvbnN0IG1vZGUgb2Ygd2JFbnZNb2Rlcykge1xuICAgICAgaWYgKG1vZGUgPT09ICdzdGFnaW5nJyAmJiAhc2V0dGluZ3MucHJvZmlsZXM/LnN0YWdpbmcpIGNvbnRpbnVlO1xuICAgICAgY29uc3QgZGVmaW5lZEtleXMgPSBtb2RlID09PSAnZGV2ZWxvcG1lbnQnID8gdXBkYXRlZFNldHRpbmdzLnNlY3JldHMgOiB1cGRhdGVkU2V0dGluZ3MucHJvZmlsZXM/Llttb2RlXT8uc2VjcmV0cztcbiAgICAgIGlmIChrZXlOYW1lcy5zb21lKChrZXlOYW1lKSA9PiBkZWZpbmVkS2V5cz8uW2tleU5hbWVdID09PSB1bmRlZmluZWQpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgdGhlIGluc2VydGVkICR7bW9kZX0gZW50cmllcyBkaWQgbm90IHRha2UgZWZmZWN0YCk7XG4gICAgICB9XG4gICAgfVxuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGNvbnNvbGUud2FybihgU2tpcHBlZCBpbnNlcnRpbmcgV0JfRU5WIGludG8gZm5veC50b21sIGJlY2F1c2UgJHsoZXJyb3IgYXMgRXJyb3IpLm1lc3NhZ2V9LmApO1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cbiAgcmV0dXJuIHVwZGF0ZWRDb250ZW50O1xufVxuXG4vKipcbiAqIFdhcm5zIHdoZW4gYW4gZXhpc3RpbmcgV0JfRU5WLWZhbWlseSBkZWZpbml0aW9uIG5hbWVzIGEgZGlmZmVyZW50IG1vZGUgdGhhbiB0aGUgb25lIGl0IGlzXG4gKiBkZWZpbmVkIGZvciAoYSB0eXBvIGxpa2UgYHByb2RjdXRpb25gIG9yIGBwcm9kdWN0aW9uMWAsIG9yIGEgY29weS1wYXN0ZWQgd3JvbmcgbW9kZSk6IHdiXG4gKiByZWplY3RzIG5vbi1zdGFuZGFyZCB2YWx1ZXMgYXQgcnVudGltZSwgc28gc3VyZmFjaW5nIHRoZSBtaXNtYXRjaCBkdXJpbmcgd2JmeSBpcyB0aGUgZWFybGllc3RcbiAqIHBvc3NpYmxlIHNpZ25hbC4gVGhlIHBhc3NlZCB2YWx1ZSBpcyBhbHdheXMgcGxhaW50ZXh0IChhIGZub3ggYGRlZmF1bHRgIGZpZWxkKSDigJQgZW5jcnlwdGVkXG4gKiBmbm94IGVudHJpZXMgYXJlIGB7IHByb3ZpZGVyLCB2YWx1ZSB9YCBvYmplY3RzIHdob3NlIGBkZWZhdWx0YCBpcyBhYnNlbnQuXG4gKi9cbmZ1bmN0aW9uIHdhcm5PblVuZXhwZWN0ZWRXYkVudlZhbHVlKGtleU5hbWU6IHN0cmluZywgdmFsdWU6IHVua25vd24sIG1vZGU6IFdiRW52TW9kZSk6IHZvaWQge1xuICAvLyBBbiBFTVBUWSB2YWx1ZSBjb3VudHMgYXMgdW5zZXQgKHdiIHN1cHBsaWVzIHRoZSBmYWxsYmFjayBtb2RlKSwgbm90IGFzIGEgbWlzbWF0Y2hpbmcgbW9kZS5cbiAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gJ3N0cmluZycgfHwgdmFsdWUgPT09ICcnIHx8IHZhbHVlID09PSBtb2RlKSByZXR1cm47XG4gIC8vIEEgZHluYW1pYyB2YWx1ZSAoZS5nLiBgTkVYVF9QVUJMSUNfV0JfRU5WPSR7V0JfRU5WfWApIG1heSBsZWdpdGltYXRlbHkgcmVzb2x2ZSB0byB0aGUgbW9kZVxuICAvLyB0aHJvdWdoIGV4cGFuc2lvbiwgd2hpY2ggdGhpcyBzdGF0aWMgY2hlY2sgY2Fubm90IGV2YWx1YXRlIOKAlCBza2lwIGluc3RlYWQgb2YgbWlzZmlyaW5nLlxuICAvLyBmbm94IGV4cGFuZHMgb25seSBgJHsuLi59YCAoYSBiYXJlIGAkVU5TRVRgIHN0YXlzIGxpdGVyYWwpLlxuICBpZiAodmFsdWUuaW5jbHVkZXMoJyR7JykpIHJldHVybjtcbiAgaWYgKGtleU5hbWUgPT09ICdORVhUX1BVQkxJQ19XQl9FTlYnKSB7XG4gICAgY29uc29sZS53YXJuKFxuICAgICAgYCR7a2V5TmFtZX0gaW4gZm5veC50b21sIGlzIFwiJHt2YWx1ZX1cIiBidXQgc2hvdWxkIGJlIFwiJHttb2RlfVwiIGZvciB0aGUgJHttb2RlfSBtb2RlOyB3YiBvdmVycmlkZXMgaXQgd2l0aCBXQl9FTlYsIGJ1dCBhIGRpcmVjdCBmcmFtZXdvcmsgYnVpbGQgd291bGQgaW5saW5lIHRoaXMgdmFsdWUuYFxuICAgICk7XG4gICAgcmV0dXJuO1xuICB9XG4gIGNvbnNvbGUud2FybihcbiAgICBgJHtrZXlOYW1lfSBpbiBmbm94LnRvbWwgaXMgXCIke3ZhbHVlfVwiIGJ1dCBzaG91bGQgYmUgXCIke21vZGV9XCIgZm9yIHRoZSAke21vZGV9IG1vZGU7IHdiIHJlamVjdHMgdmFsdWVzIG91dHNpZGUgZGV2ZWxvcG1lbnQvdGVzdC9zdGFnaW5nL3Byb2R1Y3Rpb24uYFxuICApO1xufVxuXG4vKipcbiAqIEluc2VydHMgbGluZXMgYXQgdGhlIHRvcCBvZiBhIFRPTUwgc2VjdGlvbiwgcmlnaHQgYWZ0ZXIgaXRzIGBbaGVhZGVyXWAgbGluZSBzbyBwcm9maWxlLXNwZWNpZmljXG4gKiBlbnRyaWVzIHN0YXkgZ3JvdXBlZCB3aXRoIHRoZWlyIGhlYWRlcjsgdGhlIHNlY3Rpb24gaXMgYXBwZW5kZWQgYXQgdGhlIGVuZCB3aGVuIGl0IGlzIGFic2VudC5cbiAqL1xuZnVuY3Rpb24gaW5zZXJ0SW50b0Zub3hTZWN0aW9uKGNvbnRlbnQ6IHN0cmluZywgc2VjdGlvbk5hbWU6IHN0cmluZywgaW5zZXJ0ZWRMaW5lczogc3RyaW5nW10pOiBzdHJpbmcge1xuICAvLyB3YmZ5IHdyaXRlcyB0aGUgaGVhZGVyIHdpdGhvdXQgd2hpdGVzcGFjZSBhcm91bmQgdGhlIGRvdHRlZC1rZXkgY29tcG9uZW50cy5cbiAgY29uc3QgaGVhZGVyUGF0dGVybiA9IG5ldyBSZWdFeHAoU3RyaW5nLnJhd2BeXFxzKlxcWyR7c2VjdGlvbk5hbWUucmVwbGFjZUFsbCgnLicsIFN0cmluZy5yYXdgXFwuYCl9XFxdXFxzKig/OiMuKik/JGAsICd1Jyk7XG4gIGNvbnN0IGxpbmVzID0gY29udGVudC5zcGxpdCgnXFxuJyk7XG4gIGNvbnN0IGhlYWRlckluZGV4ID0gbGluZXMuZmluZEluZGV4KChsaW5lKSA9PiBoZWFkZXJQYXR0ZXJuLnRlc3QobGluZSkpO1xuICBpZiAoaGVhZGVySW5kZXggPT09IC0xKSB7XG4gICAgcmV0dXJuIGAke2NvbnRlbnQudHJpbUVuZCgpfVxcblxcblske3NlY3Rpb25OYW1lfV1cXG4ke2luc2VydGVkTGluZXMuam9pbignXFxuJyl9XFxuYDtcbiAgfVxuICByZXR1cm4gWy4uLmxpbmVzLnNsaWNlKDAsIGhlYWRlckluZGV4ICsgMSksIC4uLmluc2VydGVkTGluZXMsIC4uLmxpbmVzLnNsaWNlKGhlYWRlckluZGV4ICsgMSldLmpvaW4oJ1xcbicpO1xufVxuIiwiLy8gR2l0SHViIEFjdGlvbnMgdmFsdWVsZXNzIGV2ZW50cyBzdWNoIGFzIGBwdWxsX3JlcXVlc3Q6YCByZXF1aXJlIFlBTUwgbnVsbCB2YWx1ZXMuXG4vKiBlc2xpbnQtZGlzYWJsZSB1bmljb3JuL25vLW51bGwgKi9cblxuaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0ICogYXMgeWFtbCBmcm9tICdqcy15YW1sJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZnNVdGlsIH0gZnJvbSAnLi4vdXRpbHMvZnNVdGlsLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuXG4vKipcbiAqIFJlcG9zaXRvcmllcyBvdXRzaWRlIFdpbGxCb29zdGVyIC8gV2lsbEJvb3N0ZXJMYWIgY2Fubm90IGNhbGwgdGhlIG9yZ2FuaXphdGlvbidzIHJldXNhYmxlXG4gKiB3b3JrZmxvd3M6IHRob3NlIHdvcmtmbG93cyBkZXBlbmQgb24gb3JnYW5pemF0aW9uIHNlY3JldHMgKFZFUkRBQ0NJT19UT0tFTiwgRGlzY29yZCB3ZWJob29rcylcbiAqIGFuZCBzZWxmLWhvc3RlZCBydW5uZXJzIHRoYXQgb3RoZXIgb3duZXJzIGRvIG5vdCBoYXZlLiBUaGlzIGdlbmVyYXRvciBpbnN0ZWFkIGVtaXRzXG4gKiBzZWxmLWNvbnRhaW5lZCB3b3JrZmxvd3MgYnVpbHQgb25seSBmcm9tIHdoYXQgYW55IHJlcG9zaXRvcnkgb3duZXIgY2FuIHByb3ZpZGU6IHRoZSByZXBvc2l0b3J5XG4gKiBjb250ZW50cyAobWlzZS50b21sLCBwYWNrYWdlLmpzb24gc2NyaXB0cykgYW5kIHRoZSBzaW5nbGUgYEZOT1hfQUdFX0tFWWAgcmVwb3NpdG9yeSBzZWNyZXQgd2hlblxuICogdGhlIHJlcG9zaXRvcnkgdXNlcyBmbm94LiBHZW5lcmF0aW9uIGlzIGtleWVkIG9uIHJlcG9zaXRvcnkgc3RhdGUsIG5ldmVyIG9uIHRoZSBvd25lcidzXG4gKiBpZGVudGl0eSwgc28gaXQgd29ya3MgZm9yIGFyYml0cmFyeSBwZXJzb25hbCByZXBvc2l0b3JpZXMuXG4gKi9cblxuLyoqIEZpcnN0IGxpbmUgb2YgZXZlcnkgZ2VuZXJhdGVkIGZpbGU7IGZpbGVzIHdpdGhvdXQgaXQgYXJlIGhhbmQtd3JpdHRlbiBhbmQgbmV2ZXIgdG91Y2hlZC4gKi9cbmV4cG9ydCBjb25zdCBzZWxmQ29udGFpbmVkV29ya2Zsb3dNYXJrZXIgPSAnIyBHZW5lcmF0ZWQgYnkgd2JmeS4nO1xuXG4vLyBTYW1lIHBpbnMgYXMgdGhlIHJldXNhYmxlIHdvcmtmbG93cyAvIHRoZWlyIGNvbnN1bWVyczsgUmVub3ZhdGUgdXBkYXRlcyB0aGVtIGluIHRoZSB0YXJnZXQgcmVwb3NpdG9yeS5cbmNvbnN0IGNoZWNrb3V0QWN0aW9uID0gJ2FjdGlvbnMvY2hlY2tvdXRAdjcuMC4xJztcbmNvbnN0IG1pc2VBY3Rpb24gPSAnamR4L21pc2UtYWN0aW9uQHY0LjIuMyc7XG5jb25zdCBjYWNoZUFjdGlvbiA9ICdhY3Rpb25zL2NhY2hlQHY2LjEuMCc7XG5jb25zdCB1cGxvYWRBcnRpZmFjdEFjdGlvbiA9ICdhY3Rpb25zL3VwbG9hZC1hcnRpZmFjdEB2Ny4wLjEnO1xuLy8gdjYuMS4xOyB0aGUgc2FtZSBwaW4gYXMgdGhlIHJldXNhYmxlIHNlbWFudGljLXByIHdvcmtmbG93LlxuY29uc3Qgc2VtYW50aWNQdWxsUmVxdWVzdEFjdGlvbiA9ICdhbWFubm4vYWN0aW9uLXNlbWFudGljLXB1bGwtcmVxdWVzdEA0NWI5ZWQ3Y2YyNDA4N2EyZjc3ODViZjU1YmU5NzM5NGJhODdlMWMyJztcbi8vIHYzLjAuMzsgZGVwbG95cyBhcmUgbmV0d29yay1oZWF2eSBhbmQgYmVuZWZpdCBmcm9tIHJldHJpZXMgd2l0aCBhIGxvbmcgdGltZW91dC5cbmNvbnN0IHJldHJ5QWN0aW9uID0gJ25pY2stZmllbGRzL3JldHJ5QGRkNTZmMWNhOGNhOTkxZTIzODVjMThhYjZkZDM2ZWE3ZjlmZGI1NWYnO1xuXG4vKipcbiAqIEpvYi1sZXZlbCBlbnYgdGhhdCB0dXJucyB0aGUgVGFrdW1pIEd1YXJkIGluc3RhbGwgcGF0aCBvbiwgbWlycm9yaW5nIHRoZSByZXVzYWJsZSB3b3JrZmxvd3MuXG4gKlxuICogYHNlY3JldHNgIGlzIHVuYXZhaWxhYmxlIGluIGEgc3RlcC1sZXZlbCBgaWY6YCwgc28gdGhlIHByZXNlbmNlIG9mIHRoZSB0b2tlbiBpcyBleHBvc2VkIGFzIGFcbiAqIG5vbi1zZWNyZXQgc2lnbmFsOyBhbiB1bnNldCBzZWNyZXQgZXhwYW5kcyB0byBgZmFsc2VgIGFuZCBsZWF2ZXMgZXZlcnkgR3VhcmQgc3RlcCBza2lwcGVkLCB3aGljaFxuICogaXMgd2hhdCBrZWVwcyB0aGUgZ2VuZXJhdGVkIHdvcmtmbG93cyBydW5uYWJsZSBpbiBhIHJlcG9zaXRvcnkgdGhhdCBuZXZlciByZWdpc3RlcnMgdGhlIHNlY3JldC5cbiAqIFRBS1VNSV9HVUFSRF9UT0tFTiBpdHNlbGYgaXMgZGVmaW5lZC1idXQtRU1QVFkgam9iLXdpZGUgc28gdGhlIGAke1RBS1VNSV9HVUFSRF9UT0tFTn1gIHJlZmVyZW5jZVxuICogaW4gdGhlIGdlbmVyYXRlZCAubnBtcmMgc3RpbGwgZXhwYW5kcyAodG8gJycpIGluIHRoZSBzdGVwcyB0aGF0IGRlbGliZXJhdGVseSBydW4gd2l0aG91dCB0aGVcbiAqIHRva2VuOyBhIHJlZmVyZW5jZSB0byBhbiB1bmRlZmluZWQgdmFyaWFibGUgaXMgd2hhdCBicmVha3MgYW4gaW5zdGFsbCwgYW4gZW1wdHkgb25lIGlzIGZpbmUuXG4gKi9cbmNvbnN0IGd1YXJkSm9iRW52OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge1xuICBIQVNfVEFLVU1JX0dVQVJEX1RPS0VOOiAnJHt7ICEhc2VjcmV0cy5UQUtVTUlfR1VBUkRfVE9LRU4gfX0nLFxuICBUQUtVTUlfR1VBUkRfVE9LRU46ICcnLFxufTtcblxuaW50ZXJmYWNlIFN0ZXAge1xuICBuYW1lPzogc3RyaW5nO1xuICBpZD86IHN0cmluZztcbiAgaWY/OiBzdHJpbmc7XG4gIHVzZXM/OiBzdHJpbmc7XG4gIHJ1bj86IHN0cmluZztcbiAgJ3dvcmtpbmctZGlyZWN0b3J5Jz86IHN0cmluZztcbiAgd2l0aD86IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICBlbnY/OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+O1xufVxuXG5pbnRlcmZhY2UgV29ya2Zsb3cge1xuICBuYW1lOiBzdHJpbmc7XG4gIG9uOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgY29uY3VycmVuY3k/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgcGVybWlzc2lvbnM/OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+O1xuICBqb2JzOiBSZWNvcmQ8XG4gICAgc3RyaW5nLFxuICAgIHsgJ3J1bnMtb24nOiBzdHJpbmc7IHBlcm1pc3Npb25zPzogUmVjb3JkPHN0cmluZywgc3RyaW5nPjsgZW52PzogUmVjb3JkPHN0cmluZywgc3RyaW5nPjsgc3RlcHM6IFN0ZXBbXSB9XG4gID47XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZW5lcmF0ZVNlbGZDb250YWluZWRXb3JrZmxvd3MoXG4gIHJvb3RDb25maWc6IFBhY2thZ2VDb25maWcsXG4gIGFsbFBhY2thZ2VDb25maWdzOiBQYWNrYWdlQ29uZmlnW10gPSBbcm9vdENvbmZpZ11cbik6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2dlbmVyYXRlU2VsZkNvbnRhaW5lZFdvcmtmbG93cycsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCB3b3JrZmxvd3NQYXRoID0gcGF0aC5yZXNvbHZlKHJvb3RDb25maWcuZGlyUGF0aCwgJy5naXRodWInLCAnd29ya2Zsb3dzJyk7XG4gICAgaWYgKCEoYXdhaXQgZnNVdGlsLmlzQ29uZmluZWRXcml0YWJsZVBhdGgod29ya2Zsb3dzUGF0aCkpKSB7XG4gICAgICBjb25zb2xlLndhcm4oYFNraXBwZWQgZ2VuZXJhdGluZyB3b3JrZmxvd3MgYmVjYXVzZSAke3dvcmtmbG93c1BhdGh9IHJlc29sdmVzIG91dHNpZGUgdGhlIHJlcG9zaXRvcnkuYCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGF3YWl0IGZzLnByb21pc2VzLm1rZGlyKHdvcmtmbG93c1BhdGgsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuXG4gICAgY29uc3QgdXNlc0Zub3ggPSBmcy5leGlzdHNTeW5jKHBhdGgucmVzb2x2ZShyb290Q29uZmlnLmRpclBhdGgsICdmbm94LnRvbWwnKSk7XG4gICAgY29uc3Qgd29ya2Zsb3dCeUZpbGVOYW1lOiBSZWNvcmQ8c3RyaW5nLCBXb3JrZmxvdz4gPSB7XG4gICAgICAndGVzdC55bWwnOiBidWlsZFRlc3RXb3JrZmxvdyhyb290Q29uZmlnLCBhbGxQYWNrYWdlQ29uZmlncywgdXNlc0Zub3gpLFxuICAgICAgJ3NlbWFudGljLXByLnltbCc6IGJ1aWxkU2VtYW50aWNQcldvcmtmbG93KCksXG4gICAgfTtcbiAgICAvLyBEZXBsb3kgd29ya2Zsb3dzIGFyZSBnZW5lcmF0ZWQgcGVyIGRlcGxveSBzY3JpcHQgdGhlIHJlcG9zaXRvcnkgZGVjbGFyZXMsIHNvIGEgcmVwb3NpdG9yeVxuICAgIC8vIHdpdGhvdXQgYSBzdGFnaW5nIGVudmlyb25tZW50IHNpbXBseSBnZXRzIG5vIHN0YWdpbmcgd29ya2Zsb3cuIE9ubHkgc2NyaXB0cyB0aGF0IGludm9rZVxuICAgIC8vIGB3YiBkZXBsb3lgIHF1YWxpZnk6IGEgYmVzcG9rZSBkZXBsb3kgc2NyaXB0IG1heSBub3QgYmUgc2FmZSB0byB0cmlnZ2VyIGF1dG9tYXRpY2FsbHlcbiAgICAvLyAoZGVwbG95LXN0YWdpbmcgcnVucyBvbiBldmVyeSBwdXNoIHRvIHRoZSBkZWZhdWx0IGJyYW5jaCkuXG4gICAgY29uc3Qgc2NyaXB0cyA9IHJvb3RDb25maWcucGFja2FnZUpzb24/LnNjcmlwdHMgPz8ge307XG4gICAgY29uc3QgaGFzUHJvZHVjdGlvbkRlcGxveVdvcmtmbG93ID0gaXNXYkRlcGxveVNjcmlwdChzY3JpcHRzWydkZXBsb3knXSk7XG4gICAgaWYgKGhhc1Byb2R1Y3Rpb25EZXBsb3lXb3JrZmxvdykge1xuICAgICAgd29ya2Zsb3dCeUZpbGVOYW1lWydkZXBsb3ktcHJvZHVjdGlvbi55bWwnXSA9IGJ1aWxkRGVwbG95V29ya2Zsb3coJ3Byb2R1Y3Rpb24nLCAnZGVwbG95JywgdXNlc0Zub3gpO1xuICAgIH1cbiAgICBpZiAoaXNXYkRlcGxveVNjcmlwdChzY3JpcHRzWydkZXBsb3k6c3RhZ2luZyddKSkge1xuICAgICAgd29ya2Zsb3dCeUZpbGVOYW1lWydkZXBsb3ktc3RhZ2luZy55bWwnXSA9IGJ1aWxkRGVwbG95V29ya2Zsb3coJ3N0YWdpbmcnLCAnZGVwbG95OnN0YWdpbmcnLCB1c2VzRm5veCk7XG4gICAgfVxuICAgIGlmIChyb290Q29uZmlnLmRlcGVuZGluZy5zZW1hbnRpY1JlbGVhc2UgJiYgcm9vdENvbmZpZy5yZWxlYXNlLmJyYW5jaGVzLmxlbmd0aCA+IDApIHtcbiAgICAgIHdvcmtmbG93QnlGaWxlTmFtZVsncmVsZWFzZS55bWwnXSA9IGJ1aWxkUmVsZWFzZVdvcmtmbG93KHJvb3RDb25maWcsIGhhc1Byb2R1Y3Rpb25EZXBsb3lXb3JrZmxvdywgdXNlc0Zub3gpO1xuICAgIH1cbiAgICBmb3IgKGNvbnN0IFtmaWxlTmFtZSwgd29ya2Zsb3ddIG9mIE9iamVjdC5lbnRyaWVzKHdvcmtmbG93QnlGaWxlTmFtZSkpIHtcbiAgICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiB3cml0ZVNlbGZDb250YWluZWRXb3JrZmxvdyhwYXRoLmpvaW4od29ya2Zsb3dzUGF0aCwgZmlsZU5hbWUpLCB3b3JrZmxvdykpO1xuICAgIH1cbiAgfSk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHdyaXRlU2VsZkNvbnRhaW5lZFdvcmtmbG93KGZpbGVQYXRoOiBzdHJpbmcsIHdvcmtmbG93OiBXb3JrZmxvdyk6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBvbGRDb250ZW50ID0gYXdhaXQgZnNVdGlsLnJlYWRGaWxlSWZFeGlzdHMoZmlsZVBhdGgpO1xuICAvLyBVbmxpa2UgV2lsbEJvb3N0ZXItb3JnYW5pemF0aW9uIHJlcG9zaXRvcmllcywgd2JmeSBkb2VzIG5vdCBvd24gYXJiaXRyYXJ5IHJlcG9zaXRvcmllcycgQ0k6XG4gIC8vIG9ubHkgZmlsZXMgaXQgZ2VuZXJhdGVkIChpZGVudGlmaWVkIGJ5IHRoZSBtYXJrZXIpIGFyZSByZWdlbmVyYXRlZCwgYW5kIGhhbmQtd3JpdHRlblxuICAvLyB3b3JrZmxvd3MgYXJlIG5ldmVyIHRvdWNoZWQuIE93bmVycyBvcHQgb3V0IHBlcm1hbmVudGx5IGJ5IHJlbW92aW5nIHRoZSBtYXJrZXIgbGluZS5cbiAgLy8gQW4gZW1wdHkgb3Igd2hpdGVzcGFjZS1vbmx5IGZpbGUgY2FycmllcyBubyBoYW5kLXdyaXR0ZW4gY29udGVudCwgc28gaXQgaXMgdHJlYXRlZCBhcyBhYnNlbnQuXG4gIGlmIChvbGRDb250ZW50ICE9PSB1bmRlZmluZWQgJiYgb2xkQ29udGVudC50cmltKCkgIT09ICcnICYmICFvbGRDb250ZW50LnN0YXJ0c1dpdGgoc2VsZkNvbnRhaW5lZFdvcmtmbG93TWFya2VyKSkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGNvbnN0IGhlYWRlciA9IGAke3NlbGZDb250YWluZWRXb3JrZmxvd01hcmtlcn0gUmVtb3ZlIHRoaXMgbGluZSB0byBzdG9wIHdiZnkgZnJvbSBvdmVyd3JpdGluZyB0aGlzIGZpbGUuXFxuYDtcbiAgY29uc3QgeWFtbFRleHQgPSB5YW1sLmR1bXAod29ya2Zsb3csIHsgbGluZVdpZHRoOiAtMSB9KTtcbiAgYXdhaXQgZnNVdGlsLndyaXRlRmlsZUNvbmZpbmVkKGZpbGVQYXRoLCBoZWFkZXIgKyB5YW1sVGV4dCk7XG59XG5cbmZ1bmN0aW9uIHdvcmtpbmdEaXIoZGlyUGF0aDogc3RyaW5nKTogUGljazxTdGVwLCAnd29ya2luZy1kaXJlY3RvcnknPiB7XG4gIHJldHVybiBkaXJQYXRoID8geyAnd29ya2luZy1kaXJlY3RvcnknOiBkaXJQYXRoIH0gOiB7fTtcbn1cblxuZnVuY3Rpb24gaXNXYkRlcGxveVNjcmlwdChzY3JpcHQ6IHVua25vd24pOiBib29sZWFuIHtcbiAgcmV0dXJuIHR5cGVvZiBzY3JpcHQgPT09ICdzdHJpbmcnICYmIC9cXGJ3YiBkZXBsb3lcXGIvdS50ZXN0KHNjcmlwdCk7XG59XG5cbmZ1bmN0aW9uIGJ1aWxkVGVzdFdvcmtmbG93KGNvbmZpZzogUGFja2FnZUNvbmZpZywgYWxsUGFja2FnZUNvbmZpZ3M6IFBhY2thZ2VDb25maWdbXSwgdXNlc0Zub3g6IGJvb2xlYW4pOiBXb3JrZmxvdyB7XG4gIC8vIFBsYXl3cmlnaHQgbWF5IGJlIGRlY2xhcmVkIG9ubHkgaW4gd29ya3NwYWNlIHBhY2thZ2VzOyBgd2IgdGVzdC1vbi1jaWAgcnVucyBldmVyeSBkZWNsYXJpbmdcbiAgLy8gcGFja2FnZSdzIGUyZSB0ZXN0cywgc28gdGhlIHdvcmtmbG93IG11c3QgaW5zdGFsbCBicm93c2VycyBmb3IgZWFjaCBvZiB0aGVtICh0aGVpciB2ZXJzaW9uc1xuICAvLyBtYXkgZGlmZmVyLCBhbmQgZWFjaCBsaWJyYXJ5IHZlcnNpb24gcmVxdWlyZXMgaXRzIG1hdGNoaW5nIGJyb3dzZXIgYmluYXJpZXMpLiBCdW4ncyBpc29sYXRlZFxuICAvLyBsaW5rZXIgcmVzb2x2ZXMgdGhlIHBsYXl3cmlnaHQgYmluYXJ5IG9ubHkgZnJvbSB0aGUgZGVjbGFyaW5nIHBhY2thZ2UsIGhlbmNlIHRoZVxuICAvLyB3b3JraW5nLWRpcmVjdG9yeSBvbiBldmVyeSBzdGVwLiBUaGUgYnJvd3NlcnMgbGFuZCBpbiB+Ly5jYWNoZS9tcy1wbGF5d3JpZ2h0LCBzaGFyZWQgYWNyb3NzXG4gIC8vIHdvcmtzcGFjZXMsIHNvIHNhbWUtdmVyc2lvbiBpbnN0YWxscyBuYXR1cmFsbHkgZGVkdXBsaWNhdGUuXG4gIGNvbnN0IHBsYXl3cmlnaHREaXJQYXRocyA9IFsuLi5hbGxQYWNrYWdlQ29uZmlnc11cbiAgICAudG9Tb3J0ZWQoKGEsIGIpID0+IGEuZGlyUGF0aC5sb2NhbGVDb21wYXJlKGIuZGlyUGF0aCkpXG4gICAgLmZpbHRlcigocGFja2FnZUNvbmZpZykgPT4gcGFja2FnZUNvbmZpZy5kZXBlbmRpbmcucGxheXdyaWdodFRlc3QpXG4gICAgLm1hcCgocGFja2FnZUNvbmZpZykgPT4gcGF0aC5yZWxhdGl2ZShjb25maWcuZGlyUGF0aCwgcGFja2FnZUNvbmZpZy5kaXJQYXRoKSk7XG4gIGNvbnN0IGhhc1R5cGVjaGVjayA9IGNvbmZpZy5kb2VzQ29udGFpblR5cGVTY3JpcHQgfHwgY29uZmlnLmRvZXNDb250YWluVHlwZVNjcmlwdEluUGFja2FnZXM7XG4gIC8vIFN0ZXAtc2NvcGVkIGxpa2UgdGhlIHJldXNhYmxlIHRlc3Qgd29ya2Zsb3c6IGRlcGVuZGVuY3kgbGlmZWN5Y2xlIHNjcmlwdHMgcnVuIGJ5IGBidW4gaW5zdGFsbGBcbiAgLy8gbXVzdCBub3QgYmUgYWJsZSB0byByZWFkIHRoZSBsb25nLWxpdmVkIGFnZSBpZGVudGl0eS5cbiAgY29uc3QgZm5veEVudjogUGljazxTdGVwLCAnZW52Jz4gPSB1c2VzRm5veCA/IHsgZW52OiB7IEZOT1hfQUdFX0tFWTogJyR7eyBzZWNyZXRzLkZOT1hfQUdFX0tFWSB9fScgfSB9IDoge307XG5cbiAgY29uc3Qgc3RlcHM6IFN0ZXBbXSA9IFtcbiAgICB7IHVzZXM6IGNoZWNrb3V0QWN0aW9uIH0sXG4gICAgeyB1c2VzOiBtaXNlQWN0aW9uIH0sXG4gICAgLi4uYnVpbGRJbnN0YWxsU3RlcHModHJ1ZSksXG4gICAgLi4uKHBsYXl3cmlnaHREaXJQYXRocy5sZW5ndGggPiAwXG4gICAgICA/IChbXG4gICAgICAgICAgLi4ucGxheXdyaWdodERpclBhdGhzLm1hcCgoZGlyUGF0aCwgaW5kZXgpOiBTdGVwID0+ICh7XG4gICAgICAgICAgICBuYW1lOiBgR2V0IFBsYXl3cmlnaHQgdmVyc2lvbiR7ZGlyUGF0aCA/IGAgKCR7ZGlyUGF0aH0pYCA6ICcnfWAsXG4gICAgICAgICAgICAvLyBUaGUgSU5TVEFMTEVEIHZlcnNpb24sIG5vdCB0aGUgcGFja2FnZS5qc29uIHNwZWNpZmllcjogYSByYW5nZSBsaWtlIGBeMS40NS4wYFxuICAgICAgICAgICAgLy8gc3RheXMgdW5jaGFuZ2VkIGFjcm9zcyBsb2NrZmlsZSB1cGRhdGVzLCBzbyBrZXlpbmcgdGhlIGNhY2hlIG9uIGl0IHdvdWxkIHJlc3RvcmVcbiAgICAgICAgICAgIC8vIHN0YWxlIGJyb3dzZXJzIHRoYXQgbm8gbG9uZ2VyIG1hdGNoIHRoZSBsaWJyYXJ5LiBSdW5zIGFmdGVyIGBidW4gaW5zdGFsbGAsIHNvIHRoZVxuICAgICAgICAgICAgLy8gcGFja2FnZSBpcyByZXNvbHZhYmxlIGZyb20gdGhlIGRlY2xhcmluZyBwYWNrYWdlJ3MgZGlyZWN0b3J5LlxuICAgICAgICAgICAgaWQ6IGBwbGF5d3JpZ2h0LXZlcnNpb24tJHtpbmRleH1gLFxuICAgICAgICAgICAgcnVuOiAnZWNobyBcInZlcnNpb249JChidW4gLWUgXCJ0cnkgeyBjb25zb2xlLmxvZyhyZXF1aXJlKFxcJ0BwbGF5d3JpZ2h0L3Rlc3QvcGFja2FnZS5qc29uXFwnKS52ZXJzaW9uKSB9IGNhdGNoIHt9XCIpXCIgPj4gXCIkR0lUSFVCX09VVFBVVFwiJyxcbiAgICAgICAgICAgIC4uLndvcmtpbmdEaXIoZGlyUGF0aCksXG4gICAgICAgICAgfSkpLFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIG5hbWU6ICdDYWNoZSBQbGF5d3JpZ2h0IGJyb3dzZXJzJyxcbiAgICAgICAgICAgIGlkOiAncGxheXdyaWdodC1jYWNoZScsXG4gICAgICAgICAgICB1c2VzOiBjYWNoZUFjdGlvbixcbiAgICAgICAgICAgIHdpdGg6IHtcbiAgICAgICAgICAgICAgcGF0aDogJ34vLmNhY2hlL21zLXBsYXl3cmlnaHQnLFxuICAgICAgICAgICAgICBrZXk6IGBwbGF5d3JpZ2h0LVxcJHt7IHJ1bm5lci5vcyB9fS0ke3BsYXl3cmlnaHREaXJQYXRoc1xuICAgICAgICAgICAgICAgIC5tYXAoKF8sIGluZGV4KSA9PiBgXFwke3sgc3RlcHMucGxheXdyaWdodC12ZXJzaW9uLSR7aW5kZXh9Lm91dHB1dHMudmVyc2lvbiB9fWApXG4gICAgICAgICAgICAgICAgLmpvaW4oJy0nKX1gLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9LFxuICAgICAgICAgIC4uLnBsYXl3cmlnaHREaXJQYXRocy5tYXAoKGRpclBhdGgpOiBTdGVwID0+ICh7XG4gICAgICAgICAgICBpZjogXCJzdGVwcy5wbGF5d3JpZ2h0LWNhY2hlLm91dHB1dHMuY2FjaGUtaGl0ICE9ICd0cnVlJ1wiLFxuICAgICAgICAgICAgcnVuOiAnYnVuIHBsYXl3cmlnaHQgaW5zdGFsbCAtLXdpdGgtZGVwcycsXG4gICAgICAgICAgICAuLi53b3JraW5nRGlyKGRpclBhdGgpLFxuICAgICAgICAgIH0pKSxcbiAgICAgICAgICAuLi5wbGF5d3JpZ2h0RGlyUGF0aHMubWFwKChkaXJQYXRoKTogU3RlcCA9PiAoe1xuICAgICAgICAgICAgLy8gVGhlIGNhY2hlZCBicm93c2VycyBzdGlsbCBuZWVkIHRoZWlyIHN5c3RlbSBkZXBlbmRlbmNpZXMgb24gYSBmcmVzaCBydW5uZXIuXG4gICAgICAgICAgICBpZjogXCJzdGVwcy5wbGF5d3JpZ2h0LWNhY2hlLm91dHB1dHMuY2FjaGUtaGl0ID09ICd0cnVlJ1wiLFxuICAgICAgICAgICAgcnVuOiAnYnVuIHBsYXl3cmlnaHQgaW5zdGFsbC1kZXBzJyxcbiAgICAgICAgICAgIC4uLndvcmtpbmdEaXIoZGlyUGF0aCksXG4gICAgICAgICAgfSkpLFxuICAgICAgICBdIHNhdGlzZmllcyBTdGVwW10pXG4gICAgICA6IFtdKSxcbiAgICAuLi4oaGFzVHlwZWNoZWNrID8gW3sgcnVuOiAnYnVuIHJ1biB0eXBlY2hlY2snLCAuLi5mbm94RW52IH1dIDogW10pLFxuICAgIHsgcnVuOiAnYnVuIHJ1biBsaW50JywgLi4uZm5veEVudiB9LFxuICAgIHsgcnVuOiAnYnVuIHJ1biB0ZXN0L2NpJywgLi4uZm5veEVudiB9LFxuICAgIC4uLihwbGF5d3JpZ2h0RGlyUGF0aHMubGVuZ3RoID4gMFxuICAgICAgPyBbXG4gICAgICAgICAge1xuICAgICAgICAgICAgbmFtZTogJ1VwbG9hZCB0ZXN0IHJlc3VsdHMnLFxuICAgICAgICAgICAgaWY6ICcke3sgYWx3YXlzKCkgfX0nLFxuICAgICAgICAgICAgdXNlczogdXBsb2FkQXJ0aWZhY3RBY3Rpb24sXG4gICAgICAgICAgICB3aXRoOiB7XG4gICAgICAgICAgICAgIG5hbWU6ICd0ZXN0LXJlc3VsdHMnLFxuICAgICAgICAgICAgICAvLyBFdmVyeSBkZWNsYXJpbmcgcGFja2FnZSB3cml0ZXMgaXRzIG93biB0ZXN0LXJlc3VsdHMgZGlyZWN0b3J5OyBhIG5ld2xpbmUtc2VwYXJhdGVkXG4gICAgICAgICAgICAgIC8vIGxpc3QgdXBsb2FkcyB0aGVtIGFsbC5cbiAgICAgICAgICAgICAgcGF0aDogcGxheXdyaWdodERpclBhdGhzXG4gICAgICAgICAgICAgICAgLm1hcCgoZGlyUGF0aCkgPT4gKGRpclBhdGggPyBwYXRoLnBvc2l4LmpvaW4oZGlyUGF0aCwgJ3Rlc3QtcmVzdWx0cycpIDogJ3Rlc3QtcmVzdWx0cycpKVxuICAgICAgICAgICAgICAgIC5qb2luKCdcXG4nKSxcbiAgICAgICAgICAgICAgJ2lmLW5vLWZpbGVzLWZvdW5kJzogJ2lnbm9yZScsXG4gICAgICAgICAgICAgICdyZXRlbnRpb24tZGF5cyc6IDE0LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9LFxuICAgICAgICBdXG4gICAgICA6IFtdKSxcbiAgXTtcblxuICByZXR1cm4ge1xuICAgIG5hbWU6ICdUZXN0JyxcbiAgICBvbjoge1xuICAgICAgcHVsbF9yZXF1ZXN0OiBudWxsLFxuICAgICAgcHVzaDogeyBicmFuY2hlczogWydtYWluJ10gfSxcbiAgICB9LFxuICAgIGNvbmN1cnJlbmN5OiB7XG4gICAgICBncm91cDogJyR7eyBnaXRodWIud29ya2Zsb3cgfX0tJHt7IGdpdGh1Yi5yZWYgfX0nLFxuICAgICAgJ2NhbmNlbC1pbi1wcm9ncmVzcyc6IHRydWUsXG4gICAgfSxcbiAgICBwZXJtaXNzaW9uczogeyBjb250ZW50czogJ3JlYWQnIH0sXG4gICAgam9iczoge1xuICAgICAgdGVzdDoge1xuICAgICAgICAncnVucy1vbic6ICd1YnVudHUtbGF0ZXN0JyxcbiAgICAgICAgZW52OiB7IEZPUkNFX0NPTE9SOiAnMycsIFdCX0VOVjogJ3Rlc3QnLCAuLi5ndWFyZEpvYkVudiB9LFxuICAgICAgICBzdGVwcyxcbiAgICAgIH0sXG4gICAgfSxcbiAgfTtcbn1cblxuZnVuY3Rpb24gYnVpbGREZXBsb3lXb3JrZmxvdyhlbnZpcm9ubWVudDogJ3N0YWdpbmcnIHwgJ3Byb2R1Y3Rpb24nLCBzY3JpcHROYW1lOiBzdHJpbmcsIHVzZXNGbm94OiBib29sZWFuKTogV29ya2Zsb3cge1xuICByZXR1cm4ge1xuICAgIG5hbWU6IGBEZXBsb3kgYXBwIG9uICR7ZW52aXJvbm1lbnR9YCxcbiAgICBvbjoge1xuICAgICAgd29ya2Zsb3dfZGlzcGF0Y2g6IG51bGwsXG4gICAgICAvLyBQcm9kdWN0aW9uIGRlcGxveXMgZm9sbG93IHB1Ymxpc2hlZCByZWxlYXNlcyAoc2VlIHRoZSByZWxlYXNlIHdvcmtmbG93J3MgdHJpZ2dlciBzdGVwKTtcbiAgICAgIC8vIHN0YWdpbmcgY29udmVyZ2VzIG9uIGV2ZXJ5IGRlZmF1bHQtYnJhbmNoIHB1c2guXG4gICAgICAuLi4oZW52aXJvbm1lbnQgPT09ICdwcm9kdWN0aW9uJ1xuICAgICAgICA/IHsgcmVsZWFzZTogeyB0eXBlczogWydwdWJsaXNoZWQnXSB9IH1cbiAgICAgICAgOiB7IHB1c2g6IHsgYnJhbmNoZXM6IFsnbWFpbiddLCAncGF0aHMtaWdub3JlJzogWycqKi5tZCcsICcqKi9kb2NzLyoqJ10gfSB9KSxcbiAgICB9LFxuICAgIGNvbmN1cnJlbmN5OiB7XG4gICAgICBncm91cDogJyR7eyBnaXRodWIud29ya2Zsb3cgfX0nLFxuICAgICAgJ2NhbmNlbC1pbi1wcm9ncmVzcyc6IGZhbHNlLFxuICAgIH0sXG4gICAgcGVybWlzc2lvbnM6IHsgY29udGVudHM6ICdyZWFkJyB9LFxuICAgIGpvYnM6IHtcbiAgICAgIGRlcGxveToge1xuICAgICAgICAncnVucy1vbic6ICd1YnVudHUtbGF0ZXN0JyxcbiAgICAgICAgZW52OiB7IFdCX0VOVjogZW52aXJvbm1lbnQsIC4uLmd1YXJkSm9iRW52IH0sXG4gICAgICAgIHN0ZXBzOiBbXG4gICAgICAgICAgLy8gZmV0Y2gtZGVwdGggMCBzbyBgZ2l0IGRlc2NyaWJlYCBzZWVzIHRoZSB0YWdzIFdCX1ZFUlNJT04gaXMgZGVyaXZlZCBmcm9tLlxuICAgICAgICAgIHsgdXNlczogY2hlY2tvdXRBY3Rpb24sIHdpdGg6IHsgJ2ZldGNoLWRlcHRoJzogMCB9IH0sXG4gICAgICAgICAgeyB1c2VzOiBtaXNlQWN0aW9uIH0sXG4gICAgICAgICAge1xuICAgICAgICAgICAgbmFtZTogJ1NldCBXQl9WRVJTSU9OJyxcbiAgICAgICAgICAgIHJ1bjogJ3NldCAtZXVvIHBpcGVmYWlsXFxuV0JfVkVSU0lPTj0kKGdpdCBkZXNjcmliZSAtLWFsd2F5cyAtLXRhZ3MpXFxuZWNobyBcIldCX1ZFUlNJT049JFdCX1ZFUlNJT05cIiA+PiBcIiRHSVRIVUJfRU5WXCInLFxuICAgICAgICAgIH0sXG4gICAgICAgICAgLi4uYnVpbGRJbnN0YWxsU3RlcHMoZmFsc2UpLFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIG5hbWU6ICdEZXBsb3knLFxuICAgICAgICAgICAgdXNlczogcmV0cnlBY3Rpb24sXG4gICAgICAgICAgICB3aXRoOiB7XG4gICAgICAgICAgICAgIHRpbWVvdXRfbWludXRlczogNjAsXG4gICAgICAgICAgICAgIG1heF9hdHRlbXB0czogNSxcbiAgICAgICAgICAgICAgY29tbWFuZDogYGJ1biBydW4gJHtzY3JpcHROYW1lfWAsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgLy8gU3RlcC1zY29wZWQgbGlrZSB0aGUgdGVzdCB3b3JrZmxvdzogZGVwZW5kZW5jeSBsaWZlY3ljbGUgc2NyaXB0cyBydW4gYnlcbiAgICAgICAgICAgIC8vIGBidW4gaW5zdGFsbGAgbXVzdCBub3QgYmUgYWJsZSB0byByZWFkIHRoZSBsb25nLWxpdmVkIGFnZSBpZGVudGl0eS5cbiAgICAgICAgICAgIC4uLih1c2VzRm5veCA/IHsgZW52OiB7IEZOT1hfQUdFX0tFWTogJyR7eyBzZWNyZXRzLkZOT1hfQUdFX0tFWSB9fScgfSB9IDoge30pLFxuICAgICAgICAgIH0sXG4gICAgICAgIF0sXG4gICAgICB9LFxuICAgIH0sXG4gIH07XG59XG5cbmZ1bmN0aW9uIGJ1aWxkUmVsZWFzZVdvcmtmbG93KFxuICBjb25maWc6IFBhY2thZ2VDb25maWcsXG4gIGhhc1Byb2R1Y3Rpb25EZXBsb3lXb3JrZmxvdzogYm9vbGVhbixcbiAgdXNlc0Zub3g6IGJvb2xlYW5cbik6IFdvcmtmbG93IHtcbiAgY29uc3QgZm5veEVudjogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHVzZXNGbm94ID8geyBGTk9YX0FHRV9LRVk6ICcke3sgc2VjcmV0cy5GTk9YX0FHRV9LRVkgfX0nIH0gOiB7fTtcbiAgcmV0dXJuIHtcbiAgICBuYW1lOiAnUmVsZWFzZScsXG4gICAgb246IHtcbiAgICAgIHB1c2g6IHsgYnJhbmNoZXM6IFsuLi5jb25maWcucmVsZWFzZS5icmFuY2hlc10gfSxcbiAgICB9LFxuICAgIGNvbmN1cnJlbmN5OiB7XG4gICAgICBncm91cDogJyR7eyBnaXRodWIud29ya2Zsb3cgfX0nLFxuICAgICAgJ2NhbmNlbC1pbi1wcm9ncmVzcyc6IGZhbHNlLFxuICAgIH0sXG4gICAgcGVybWlzc2lvbnM6IHtcbiAgICAgIC8vIGZvciBzZW1hbnRpYy1yZWxlYXNlXG4gICAgICBjb250ZW50czogJ3dyaXRlJyxcbiAgICAgIC8vIGZvciBkaXNwYXRjaGluZyB0aGUgcHJvZHVjdGlvbiBkZXBsb3kgd29ya2Zsb3cgYWZ0ZXIgYSByZWxlYXNlXG4gICAgICAuLi4oaGFzUHJvZHVjdGlvbkRlcGxveVdvcmtmbG93ID8geyBhY3Rpb25zOiAnd3JpdGUnIH0gOiB7fSksXG4gICAgfSxcbiAgICBqb2JzOiB7XG4gICAgICByZWxlYXNlOiB7XG4gICAgICAgICdydW5zLW9uJzogJ3VidW50dS1sYXRlc3QnLFxuICAgICAgICAvLyBSZWxlYXNlcyBidWlsZCBwcm9kdWN0aW9uIGFydGlmYWN0cywgaGVuY2UgdGhlIGVudmlyb25tZW50IOKAlCB0aGUgc2FtZSBkZWZhdWx0IGFzIHRoZVxuICAgICAgICAvLyByZXVzYWJsZSByZWxlYXNlIHdvcmtmbG93LiB3YidzIENJIGd1YXJkIGFsc28gcmVxdWlyZXMgYW4gZXhwb3J0ZWQgV0JfRU5WLCBzbyB3aXRob3V0XG4gICAgICAgIC8vIGl0IGEgYHBvc3RpbnN0YWxsYCB0aGF0IGNhbGxzIHdiIChlLmcuIGB3YiBnZW4tY29kZWApIGV4aXRzIDEgYmVmb3JlIHNlbWFudGljLXJlbGVhc2VcbiAgICAgICAgLy8gcnVucy5cbiAgICAgICAgZW52OiB7IFdCX0VOVjogJ3Byb2R1Y3Rpb24nLCAuLi5ndWFyZEpvYkVudiB9LFxuICAgICAgICBzdGVwczogW1xuICAgICAgICAgIC8vIGZldGNoLWRlcHRoIDA6IHNlbWFudGljLXJlbGVhc2UgcmVhZHMgdGhlIGZ1bGwgaGlzdG9yeSB0byBjb21wdXRlIHRoZSBuZXh0IHZlcnNpb24uXG4gICAgICAgICAgeyB1c2VzOiBjaGVja291dEFjdGlvbiwgd2l0aDogeyAnZmV0Y2gtZGVwdGgnOiAwIH0gfSxcbiAgICAgICAgICB7IHVzZXM6IG1pc2VBY3Rpb24gfSxcbiAgICAgICAgICAuLi5idWlsZEluc3RhbGxTdGVwcyhmYWxzZSksXG4gICAgICAgICAgLi4uKGhhc1Byb2R1Y3Rpb25EZXBsb3lXb3JrZmxvd1xuICAgICAgICAgICAgPyBbXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgbmFtZTogJ0dldCBjdXJyZW50IGxhdGVzdCB0YWcnLFxuICAgICAgICAgICAgICAgICAgaWQ6ICdwcmUtcmVsZWFzZS10YWcnLFxuICAgICAgICAgICAgICAgICAgcnVuOiAnc2V0IC1ldW8gcGlwZWZhaWxcXG5lY2hvIFwidGFnPSQoZ2l0IGRlc2NyaWJlIC0tdGFncyAtLWFiYnJldj0wIDI+L2Rldi9udWxsIHx8IGVjaG8gXFwnXFwnKVwiID4+IFwiJEdJVEhVQl9PVVRQVVRcIicsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgXVxuICAgICAgICAgICAgOiBbXSksXG4gICAgICAgICAge1xuICAgICAgICAgICAgbmFtZTogJ1JlbGVhc2UnLFxuICAgICAgICAgICAgLy8gc2VtYW50aWMtcmVsZWFzZSBjaGVja3MgTm9kZS5qcyBydW50aW1lIHJlcXVpcmVtZW50czsgYGJ1biA8YmluPmAgcmVzcGVjdHMgaXRzXG4gICAgICAgICAgICAvLyBgIyEvdXNyL2Jpbi9lbnYgbm9kZWAgc2hlYmFuZywgc28gaXQgc3RpbGwgcnVucyB1bmRlciByZWFsIE5vZGUuXG4gICAgICAgICAgICBydW46ICdidW4gc2VtYW50aWMtcmVsZWFzZScsXG4gICAgICAgICAgICBlbnY6IHtcbiAgICAgICAgICAgICAgR0lUSFVCX1RPS0VOOiAnJHt7IHNlY3JldHMuR0lUSFVCX1RPS0VOIH19JyxcbiAgICAgICAgICAgICAgTEVGVEhPT0s6ICcwJyxcbiAgICAgICAgICAgICAgLi4uZm5veEVudixcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfSxcbiAgICAgICAgICAuLi4oaGFzUHJvZHVjdGlvbkRlcGxveVdvcmtmbG93XG4gICAgICAgICAgICA/IChbXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgbmFtZTogJ0NoZWNrIGZvciBuZXcgcmVsZWFzZSB0YWcnLFxuICAgICAgICAgICAgICAgICAgaWQ6ICdwb3N0LXJlbGVhc2UtdGFnJyxcbiAgICAgICAgICAgICAgICAgIHJ1bjogJ3NldCAtZXVvIHBpcGVmYWlsXFxuZ2l0IGZldGNoIC0tdGFncyAtLWZvcmNlXFxuTkVXX1RBRz0kKGdpdCBkZXNjcmliZSAtLXRhZ3MgLS1hYmJyZXY9MCAyPi9kZXYvbnVsbCB8fCBlY2hvIFxcJ1xcJylcXG5lY2hvIFwidGFnPSRORVdfVEFHXCIgPj4gXCIkR0lUSFVCX09VVFBVVFwiXFxuaWYgW1sgLW4gXCIkTkVXX1RBR1wiICYmIFwiJE5FV19UQUdcIiAhPSBcIiR7eyBzdGVwcy5wcmUtcmVsZWFzZS10YWcub3V0cHV0cy50YWcgfX1cIiBdXTsgdGhlblxcbiAgZWNobyBcImNyZWF0ZWQ9dHJ1ZVwiID4+IFwiJEdJVEhVQl9PVVRQVVRcIlxcbmZpJyxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgIGlmOiBcInN0ZXBzLnBvc3QtcmVsZWFzZS10YWcub3V0cHV0cy5jcmVhdGVkID09ICd0cnVlJ1wiLFxuICAgICAgICAgICAgICAgICAgbmFtZTogJ1RyaWdnZXIgcHJvZHVjdGlvbiBkZXBsb3knLFxuICAgICAgICAgICAgICAgICAgLy8gQSBHSVRIVUJfVE9LRU4tY3JlYXRlZCByZWxlYXNlIGRvZXMgbm90IGZpcmUgdGhlIGRlcGxveSB3b3JrZmxvdydzXG4gICAgICAgICAgICAgICAgICAvLyByZWxlYXNlLXB1Ymxpc2hlZCB0cmlnZ2VyLCBzbyBkaXNwYXRjaCBpdCBleHBsaWNpdGx5IG9uIHRoZSBuZXcgdGFnLlxuICAgICAgICAgICAgICAgICAgcnVuOiAnZ2ggd29ya2Zsb3cgcnVuIGRlcGxveS1wcm9kdWN0aW9uLnltbCAtLXJlZiBcIiR7eyBzdGVwcy5wb3N0LXJlbGVhc2UtdGFnLm91dHB1dHMudGFnIH19XCInLFxuICAgICAgICAgICAgICAgICAgZW52OiB7IEdIX1RPS0VOOiAnJHt7IHNlY3JldHMuR0lUSFVCX1RPS0VOIH19JyB9LFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIF0gc2F0aXNmaWVzIFN0ZXBbXSlcbiAgICAgICAgICAgIDogW10pLFxuICAgICAgICBdLFxuICAgICAgfSxcbiAgICB9LFxuICB9O1xufVxuXG4vKipcbiAqIFRoZSBpbnN0YWxsIHNlcXVlbmNlIGV2ZXJ5IGdlbmVyYXRlZCB3b3JrZmxvdyBzaGFyZXM6IGBidW4gaW5zdGFsbCAtLWZyb3plbi1sb2NrZmlsZWAsIGhhcmRlbmVkIGludG8gdGhlXG4gKiByZXVzYWJsZSB3b3JrZmxvd3MnIHRocmVlLXN0ZXAgZGFuY2Ugd2hlbiB0aGUgcmVwb3NpdG9yeSByZWdpc3RlcnMgYSBUQUtVTUlfR1VBUkRfVE9LRU4gc2VjcmV0LlxuICpcbiAqIFRha3VtaSBHdWFyZCAoaHR0cHM6Ly9mbGF0dC50ZWNoL3Rha3VtaS9mZWF0dXJlcy9ndWFyZCkgaXMgYSByZWdpc3RyeSBwcm94eSB0aGF0IGJsb2Nrc1xuICoga25vd24tbWFsaWNpb3VzIHBhY2thZ2VzLiBSb3V0aW5nIHRoZSBERUZBVUxUIHJlZ2lzdHJ5IHRocm91Z2ggaXQgaXMgd2hhdCBwcm90ZWN0cyB0aGUgaW5zdGFsbCxcbiAqIGFuZCB0aGUgdG9rZW4gYXV0aGVudGljYXRlcyB0aGF0IHByb3h5IOKAlCBzbyB0aGUgdG9rZW4gaGFzIHRvIGJlIHByZXNlbnQgd2hpbGUgZGVwZW5kZW5jaWVzIGFyZVxuICogcmVzb2x2ZWQsIHdoaWNoIGlzIGV4YWN0bHkgd2hlbiBhIGNvbXByb21pc2VkIGRlcGVuZGVuY3kncyBsaWZlY3ljbGUgc2NyaXB0IHdvdWxkIHJ1bi4gSGVuY2UgdGhlXG4gKiBzcGxpdDogcmVzb2x2ZSBhbmQgZG93bmxvYWQgd2l0aCBgLS1pZ25vcmUtc2NyaXB0c2AgYW5kIHRoZSB0b2tlbiwgdGhlbiByZXBsYXkgdGhlIHNraXBwZWRcbiAqIGxpZmVjeWNsZSBzY3JpcHRzIGluIGEgc2Vjb25kIGluc3RhbGwgdGhhdCBoYXMgbm8gdG9rZW4gKGV2ZXJ5IHBhY2thZ2UgaXMgYWxyZWFkeSBjYWNoZWQsIGFuZFxuICogR3VhcmQgc2VydmVzIGFub255bW91c2x5IGFueXdheSkuIE9ubHkgYnVuIGlzIGdlbmVyYXRlZCBoZXJlLCBhbmQgYnVuIHJlYWRzIC5ucG1yYywgc28gbm9cbiAqIHBhY2thZ2UtbWFuYWdlciBicmFuY2hpbmcgaXMgbmVlZGVkLlxuICpcbiAqIFRoZSBzaGVsbCBkZXRhaWxzIGRlbGliZXJhdGVseSBtaXJyb3IgcmV1c2FibGUtd29ya2Zsb3dzJyBwcm9kdWN0aW9uLXByb3ZlbiBpbnN0YWxsIHN0ZXBzOiBiYXJlXG4gKiBgJFJVTk5FUl9URU1QYCAoc2V0IGJ5IHRoZSBydW5uZXIgYXBwbGljYXRpb24gb24gZXZlcnkgcnVubmVyLCBhbmQgYHNldCAtdWAgZmFpbHMgbG91ZGx5IGlmIG5vdCksXG4gKiBgW1sgLWUgLm5wbXJjIF1dYCwgYW5kIHRoZSBzZWNvbmQgYHJtIC1yZiBub2RlX21vZHVsZXNgIGluIHRoZSBmYWxsYmFjayAoYW4gaW50ZXJydXB0ZWQgbGlmZWN5Y2xlXG4gKiBydW4gbWF5IGxlYXZlIG5vZGVfbW9kdWxlcyBpbmNvbnNpc3RlbnQsIHNvIHRoZSByZXRyeSBzdGFydHMgY2xlYW4gcmF0aGVyIHRoYW4gdHJ1c3RpbmcgYSByZXBhaXIpLlxuICpcbiAqIGB0b2xlcmF0ZUxpZmVjeWNsZVNjcmlwdEZhaWx1cmVgIGRlY2lkZXMgd2hhdCBhIGZhaWxpbmcgbGlmZWN5Y2xlLXNjcmlwdCByZXBsYXkgZG9lcy4gRXZlcnlcbiAqIHJlcGxheSBydW5zIHRva2VubGVzcyBhbmQgd2l0aG91dCBGTk9YX0FHRV9LRVkgKHRoZSBrZXkgaXMgc2NvcGVkIHRvIHRoZSBsYXRlciBEZXBsb3kvUmVsZWFzZVxuICogc3RlcCksIHNvIGEgcG9zdGluc3RhbGwgdGhhdCBuZWVkcyBkZWNyeXB0ZWQgc2VjcmV0cyBpcyB1bnN1cHBvcnRlZCBpbiBhbGwgb2YgdGhlbSBieSBkZXNpZ24uXG4gKiBUaGUgdGVzdCB3b3JrZmxvdyB0b2xlcmF0ZXMgdGhlIGZhaWx1cmUgYmVjYXVzZSB0eXBlY2hlY2svbGludC90ZXN0IGZhaWwgbG91ZGx5IG9uIGEgZGVncmFkZWRcbiAqIHRyZWUgYW55d2F5LiBEZXBsb3kgYW5kIHJlbGVhc2Ugd29ya2Zsb3dzIG11c3Qgbm90OiBhIGA6Ondhcm5pbmc6OmAgZG9lcyBub3QgZmFpbCB0aGUgam9iLCBzb1xuICogdGhlIGZhbGxiYWNrIHdvdWxkIHNoaXAgYSB0cmVlIHdob3NlIGxpZmVjeWNsZSBzY3JpcHRzIChlLmcuIGEgYHBvc3RpbnN0YWxsOiB3YiBnZW4tY29kZWApXG4gKiBuZXZlciByYW4sIHNpbGVudGx5IGRlcGxveWluZyBkZWdyYWRlZCBvdXRwdXQgKCMxMTI3KS5cbiAqL1xuZnVuY3Rpb24gYnVpbGRJbnN0YWxsU3RlcHModG9sZXJhdGVMaWZlY3ljbGVTY3JpcHRGYWlsdXJlOiBib29sZWFuKTogU3RlcFtdIHtcbiAgcmV0dXJuIFtcbiAgICB7XG4gICAgICBpZjogXCIke3sgZW52LkhBU19UQUtVTUlfR1VBUkRfVE9LRU4gPT0gJ3RydWUnIH19XCIsXG4gICAgICBuYW1lOiAnR2VuZXJhdGUgLm5wbXJjIGZvciBUYWt1bWkgR3VhcmQnLFxuICAgICAgLy8gVGhlIHRva2VuIGlzIHdyaXR0ZW4gYXMgYSBsaXRlcmFsIGAke1RBS1VNSV9HVUFSRF9UT0tFTn1gIHJlZmVyZW5jZSB0aGF0IGJ1biBleHBhbmRzIGF0XG4gICAgICAvLyBpbnN0YWxsIHRpbWUsIHNvIHRoZSBzZWNyZXQgaXRzZWxmIG5ldmVyIGxhbmRzIGluIGEgZmlsZS4gVGhlIG1hbmFnZWQgbGluZXMgYXJlIHN0cmlwcGVkXG4gICAgICAvLyBmcm9tIGFuIGV4aXN0aW5nIC5ucG1yYyBmaXJzdDogYSByZXBvc2l0b3J5IG91dHNpZGUgdGhlIG9yZ2FuaXphdGlvbnMgbWF5IGxlZ2l0aW1hdGVseVxuICAgICAgLy8gY29tbWl0IG9uZSAoc2NvcGUgbWFwcGluZ3MgZm9yIGFub3RoZXIgcmVnaXN0cnkpLCBhbmQgZHJvcHBpbmcgb25seSB0aGVzZSB0d28gbGluZXMga2VlcHNcbiAgICAgIC8vIHRoZSByZXN0IG9mIGl0IGluIGVmZmVjdC4gUmVwbGFjaW5nIHRoZSBmaWxlIHdpdGggYG12YCByYXRoZXIgdGhhbiBhcHBlbmRpbmcgaW4gcGxhY2Ugc3RvcHNcbiAgICAgIC8vIGEgY29tbWl0dGVkIHN5bWxpbmsgZnJvbSByZWRpcmVjdGluZyB0aGUgd3JpdGUgaW50bywgc2F5LCBhIHBlcnNpc3RlbnQgaG9tZSBucG1yYy5cbiAgICAgIHJ1bjogYHNldCAtZXVvIHBpcGVmYWlsXG5OUE1SQz1cIiQobWt0ZW1wIFwiJFJVTk5FUl9URU1QL25wbXJjLlhYWFhYWFwiKVwiXG5pZiBbWyAtZSAubnBtcmMgXV07IHRoZW5cbiAgZ3JlcCAtdkUgJ15yZWdpc3RyeT18Xi8vbnBtXFxcXC5mbGF0dFxcXFwudGVjaC86X2F1dGhUb2tlbicgLm5wbXJjID4gXCIkTlBNUkNcIiB8fCB0cnVlXG5maVxuZWNobyAncmVnaXN0cnk9aHR0cHM6Ly9ucG0uZmxhdHQudGVjaC8nID4+IFwiJE5QTVJDXCJcbmVjaG8gJy8vbnBtLmZsYXR0LnRlY2gvOl9hdXRoVG9rZW49XFwke1RBS1VNSV9HVUFSRF9UT0tFTn0nID4+IFwiJE5QTVJDXCJcbnJtIC1mIC5ucG1yY1xubXYgXCIkTlBNUkNcIiAubnBtcmNgLFxuICAgIH0sXG4gICAge1xuICAgICAgbmFtZTogJ0luc3RhbGwgZGVwZW5kZW5jaWVzJyxcbiAgICAgIC8vIC0tZnJvemVuLWxvY2tmaWxlOiBhIHBsYWluIGBidW4gaW5zdGFsbGAgc2lsZW50bHkgcmVwYWlycyBhIGJ1bi5sb2NrIHRoYXQgaXMgc3RhbGUgYWdhaW5zdFxuICAgICAgLy8gcGFja2FnZS5qc29uLCBzbyBDSSB3b3VsZCBydW4gZGVwZW5kZW5jeSByZXNvbHV0aW9ucyB0aGF0IHdlcmUgbmV2ZXIgcmV2aWV3ZWQgKCMxMTI2KS5cbiAgICAgIC8vIFdpdGggTk8gYnVuLmxvY2sgYXQgYWxsLCAtLWZyb3plbi1sb2NrZmlsZSBzaWxlbnRseSBpbnN0YWxscyBmcmVzaCwgdW5waW5uZWQgcmVzb2x1dGlvbnNcbiAgICAgIC8vIChCdW4gMS4zLjE0IGV4aXRzIDAgYW5kIHdyaXRlcyBubyBsb2NrZmlsZSksIHNvIGEgbWlzc2luZyBsb2NrZmlsZSBtdXN0IGZhaWwgZXhwbGljaXRseS5cbiAgICAgIHJ1bjogYHNldCAtZXVvIHBpcGVmYWlsXG5pZiBbWyAhIC1lIGJ1bi5sb2NrIF1dOyB0aGVuXG4gIGVjaG8gXCI6OmVycm9yOjpidW4ubG9jayBpcyBtaXNzaW5nOyBjb21taXQgaXQgc28gQ0kgaW5zdGFsbHMgc3RheSByZXByb2R1Y2libGVcIlxuICBleGl0IDFcbmZpXG5pZiBbWyBcIiRIQVNfVEFLVU1JX0dVQVJEX1RPS0VOXCIgPT0gXCJ0cnVlXCIgXV07IHRoZW5cbiAgYnVuIGluc3RhbGwgLS1mcm96ZW4tbG9ja2ZpbGUgLS1pZ25vcmUtc2NyaXB0c1xuZWxzZVxuICBidW4gaW5zdGFsbCAtLWZyb3plbi1sb2NrZmlsZVxuZmlgLFxuICAgICAgLy8gU3RlcC1zY29wZWQ6IGEgam9iLWxldmVsIHRva2VuIHdvdWxkIGJlIHJlYWRhYmxlIGJ5IGV2ZXJ5IGRlcGVuZGVuY3kgbGlmZWN5Y2xlIHNjcmlwdCB0aGVcbiAgICAgIC8vIHRva2VubGVzcyByZXBsYXkgYmVsb3cgcnVucy5cbiAgICAgIGVudjogeyBUQUtVTUlfR1VBUkRfVE9LRU46ICcke3sgc2VjcmV0cy5UQUtVTUlfR1VBUkRfVE9LRU4gfX0nIH0sXG4gICAgfSxcbiAgICB7XG4gICAgICBpZjogXCIke3sgZW52LkhBU19UQUtVTUlfR1VBUkRfVE9LRU4gPT0gJ3RydWUnIH19XCIsXG4gICAgICBuYW1lOiAnUnVuIGRlcGVuZGVuY3kgbGlmZWN5Y2xlIHNjcmlwdHMgd2l0aG91dCByZWdpc3RyeSBjcmVkZW50aWFscycsXG4gICAgICAvLyBBIHJlcGVhdGVkIGBidW4gaW5zdGFsbGAgaXMgYSBuby1vcCB0aGF0IHJlcGxheXMgbm90aGluZywgc28gbm9kZV9tb2R1bGVzIGhhcyB0byBnbyBmaXJzdC5cbiAgICAgIHJ1bjogYHNldCAtZXVvIHBpcGVmYWlsXG5ybSAtcmYgbm9kZV9tb2R1bGVzXG5idW4gaW5zdGFsbCAtLWZyb3plbi1sb2NrZmlsZSR7XG4gICAgICAgIHRvbGVyYXRlTGlmZWN5Y2xlU2NyaXB0RmFpbHVyZVxuICAgICAgICAgID8gYCB8fCB7XG4gIGVjaG8gXCI6Ondhcm5pbmc6OkxpZmVjeWNsZSBzY3JpcHRzIGZhaWxlZDsgY29tcGxldGluZyB0aGUgaW5zdGFsbCB3aXRob3V0IHRoZW1cIlxuICBybSAtcmYgbm9kZV9tb2R1bGVzXG4gIGJ1biBpbnN0YWxsIC0tZnJvemVuLWxvY2tmaWxlIC0taWdub3JlLXNjcmlwdHNcbn1gXG4gICAgICAgICAgOiAnJ1xuICAgICAgfWAsXG4gICAgfSxcbiAgICB7XG4gICAgICBpZjogXCIke3sgZW52LkhBU19UQUtVTUlfR1VBUkRfVE9LRU4gPT0gJ3RydWUnIH19XCIsXG4gICAgICBuYW1lOiAnUmVtb3ZlIHRoZSBnZW5lcmF0ZWQgLm5wbXJjJyxcbiAgICAgIC8vIE5vdGhpbmcgYWZ0ZXIgdGhlIGluc3RhbGwgbmVlZHMgdGhlIHByb3h5LCBhbmQgbGVhdmluZyBpdCBpbiBwbGFjZSB3b3VsZCBicmVhayB0aGUgb25lXG4gICAgICAvLyB0aGluZyBHdWFyZCByZWZ1c2VzIHRvIHNlcnZlOiBpdCBhbnN3ZXJzIGBucG0gcHVibGlzaGAgd2l0aCA0MDUsIHNvIGEgcmVsZWFzZSB3b3JrZmxvd1xuICAgICAgLy8gd2hvc2UgcGFja2FnZSBsYWNrcyBhbiBleHBsaWNpdCBwdWJsaXNoQ29uZmlnLnJlZ2lzdHJ5IHdvdWxkIGZhaWwgdG8gcHVibGlzaC5cbiAgICAgIHJ1bjogYHNldCAtZXVvIHBpcGVmYWlsXG5pZiBnaXQgbHMtZmlsZXMgLS1lcnJvci11bm1hdGNoIC0tIC5ucG1yYyA+IC9kZXYvbnVsbCAyPiYxOyB0aGVuXG4gIGdpdCBjaGVja291dCAtLSAubnBtcmNcbmVsc2VcbiAgcm0gLWYgLm5wbXJjXG5maWAsXG4gICAgfSxcbiAgXTtcbn1cblxuZnVuY3Rpb24gYnVpbGRTZW1hbnRpY1ByV29ya2Zsb3coKTogV29ya2Zsb3cge1xuICByZXR1cm4ge1xuICAgIG5hbWU6ICdMaW50IFBSIHRpdGxlJyxcbiAgICBvbjoge1xuICAgICAgcHVsbF9yZXF1ZXN0X3RhcmdldDogeyB0eXBlczogWydvcGVuZWQnLCAnZWRpdGVkJywgJ3N5bmNocm9uaXplJ10gfSxcbiAgICB9LFxuICAgIGpvYnM6IHtcbiAgICAgICdzZW1hbnRpYy1wcic6IHtcbiAgICAgICAgJ3J1bnMtb24nOiAndWJ1bnR1LWxhdGVzdCcsXG4gICAgICAgIC8vIFRoZSBhY3Rpb24gcmVhZHMgdGhlIHB1bGwgcmVxdWVzdCwgYW5kIGl0cyBgd2lwYCBzdXBwb3J0IHBvc3RzIGEgY29tbWl0IHN0YXR1czsgbmVpdGhlclxuICAgICAgICAvLyBwZXJtaXNzaW9uIGlzIGdyYW50ZWQgd2hlbiB0aGUgcmVwb3NpdG9yeSByZXN0cmljdHMgZGVmYXVsdCB3b3JrZmxvdyBwZXJtaXNzaW9ucy5cbiAgICAgICAgcGVybWlzc2lvbnM6IHsgJ3B1bGwtcmVxdWVzdHMnOiAncmVhZCcsIHN0YXR1c2VzOiAnd3JpdGUnIH0sXG4gICAgICAgIHN0ZXBzOiBbXG4gICAgICAgICAge1xuICAgICAgICAgICAgdXNlczogc2VtYW50aWNQdWxsUmVxdWVzdEFjdGlvbixcbiAgICAgICAgICAgIHdpdGg6IHsgd2lwOiB0cnVlIH0sXG4gICAgICAgICAgICBlbnY6IHsgR0lUSFVCX1RPS0VOOiAnJHt7IHNlY3JldHMuR0lUSFVCX1RPS0VOIH19JyB9LFxuICAgICAgICAgIH0sXG4gICAgICAgIF0sXG4gICAgICB9LFxuICAgIH0sXG4gIH07XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgc2VtdmVyIGZyb20gJ3NlbXZlcic7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGZzVXRpbCB9IGZyb20gJy4uL3V0aWxzL2ZzVXRpbC5qcyc7XG5pbXBvcnQgeyBzcGF3blN5bmNBbmRSZXR1cm5TdGRvdXQgfSBmcm9tICcuLi91dGlscy9zcGF3blV0aWwuanMnO1xuXG5pbnRlcmZhY2UgTWlzZVRvbWwge1xuICB0b29scz86IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICBba2V5OiBzdHJpbmddOiB1bmtub3duO1xufVxuXG4vLyBUaGUgb2xkZXN0IEJ1biBydW50aW1lIHdiZnkgc3VwcG9ydHMuXG5leHBvcnQgY29uc3QgbWluaW11bUJ1blZlcnNpb24gPSAnMS40LjAnO1xuXG4vKipcbiAqIEVuc3VyZXMgbWlzZS50b21sIG1hbmFnZXMgdGhlIE5vZGUuanMgYW5kICh3aGVuIGZub3gudG9tbCBleGlzdHMpIGZub3ggdG9vbCB2ZXJzaW9ucyB3aGlsZVxuICogcHJlc2VydmluZyB0aGUgQnVuIHBpbiBhbmQgdW5yZWxhdGVkIG1pc2Ugc2V0dGluZ3MuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZW5lcmF0ZU1pc2VUb21sKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2dlbmVyYXRlTWlzZVRvbWwnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgbWlzZVRvbWxQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnbWlzZS50b21sJyk7XG4gICAgLy8gQSBwYXJzZSBmYWlsdXJlIG11c3QgYWJvcnQgaW5zdGVhZCBvZiBmYWxsaW5nIGJhY2sgdG8ge306IHJlZ2VuZXJhdGluZyBmcm9tIGFuIGVtcHR5IG9iamVjdFxuICAgIC8vIHdvdWxkIHNpbGVudGx5IHJlcGxhY2UgdGhlIHVzZXIncyBleGlzdGluZyAoYWxiZWl0IGJyb2tlbikgbWlzZS50b21sLlxuICAgIGNvbnN0IHNldHRpbmdzID0gcGFyc2VNaXNlVG9tbChtaXNlVG9tbFBhdGgpO1xuICAgIGNvbnN0IHRvb2xzID0geyAuLi5zZXR0aW5ncy50b29scyB9O1xuXG4gICAgLy8gRW5zdXJlIE5vZGUuanMgaXMgYWx3YXlzIHBpbm5lZDogZ2VuZXJhdGVkIGhvb2tzIGFuZCBDSSBydW4gYG1pc2UgaW5zdGFsbGAsIGFuZCBhbiB1bnBpbm5lZFxuICAgIC8vIE5vZGUgd291bGQgY29tZSBmcm9tIHdoYXRldmVyIGhhcHBlbnMgdG8gYmUgb24gUEFUSC5cbiAgICAvLyBMaWZ0LXRoZW4tcGluOiB0aGUgbGlmdCBvbmx5IHRvdWNoZXMgZXhhY3QgcGlucyBhbmQgdGhlIHBpbiBvbmx5IHRvdWNoZXMgc2VsZWN0b3JzLCBzb1xuICAgIC8vIG9yZGVyaW5nIHRoZSBsaWZ0IGZpcnN0IGF2b2lkcyByZXNvbHZpbmcgYG1pc2UgbGF0ZXN0IG5vZGVAbHRzYCB0d2ljZSBmb3IgdW5waW5uZWQgcmVwb3MuXG4gICAgdG9vbHMubm9kZSA9IHBpbkNvbmNyZXRlVG9vbFZlcnNpb24oXG4gICAgICAnbm9kZScsXG4gICAgICBsaWZ0T3V0ZGF0ZWRUb29sVmVyc2lvbldpdGhpbk1ham9yKCdub2RlQGx0cycsIHRvb2xzLm5vZGUsIGNvbmZpZy5kaXJQYXRoKSxcbiAgICAgIGNvbmZpZy5kaXJQYXRoXG4gICAgKTtcbiAgICAvLyBCdW4gaXMgbmV2ZXIgYWRkZWQgb3IgY2hhbmdlZDogYSBtaXNzaW5nIHBpbiBzdGF5cyBtaXNzaW5nIChkZXZlbG9wZXJzIGluc3RhbGwgQnVuIGdsb2JhbGx5XG4gICAgLy8gdG8gcnVuIHdiZnkpLCBhbmQgaGFzU3VwcG9ydGVkQnVuUGluKCkgaGFzIGFscmVhZHkgcmVqZWN0ZWQgYW55IHBpbiB0aGF0IGlzIG5vdCBvbmUgZXhhY3RcbiAgICAvLyBzdXBwb3J0ZWQgdmVyc2lvbi5cbiAgICBpZiAoZnMuZXhpc3RzU3luYyhwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICdmbm94LnRvbWwnKSkpIHtcbiAgICAgIHRvb2xzLmZub3ggPSBwaW5Db25jcmV0ZVRvb2xWZXJzaW9uKFxuICAgICAgICAnZm5veCcsXG4gICAgICAgIGxpZnRPdXRkYXRlZFRvb2xWZXJzaW9uV2l0aGluTWFqb3IoJ2Zub3gnLCB0b29scy5mbm94LCBjb25maWcuZGlyUGF0aCksXG4gICAgICAgIGNvbmZpZy5kaXJQYXRoXG4gICAgICApO1xuICAgIH1cbiAgICBzZXR0aW5ncy50b29scyA9IHRvb2xzO1xuXG4gICAgLy8gQHRzLWV4cGVjdC1lcnJvciAtLSBCdW4gMS40IHByb3ZpZGVzIFRPTUwuc3RyaW5naWZ5IGJlZm9yZSB0aGUgYWdlLWdhdGVkIEB0eXBlcy9idW4gdmVyc2lvbiBkZWNsYXJlcyBpdC5cbiAgICBhd2FpdCBmc1V0aWwuZ2VuZXJhdGVGaWxlKG1pc2VUb21sUGF0aCwgQnVuLlRPTUwuc3RyaW5naWZ5KHNldHRpbmdzKSk7XG4gIH0pO1xufVxuXG4vKiogV2hldGhlciBtaXNlLnRvbWwgb21pdHMgQnVuIG9yIHBpbnMgaXQgdG8gb25lIGV4YWN0IHZlcnNpb24gdGhhdCB3YmZ5IHN1cHBvcnRzLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGhhc1N1cHBvcnRlZEJ1blBpbihkaXJQYXRoOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgbGV0IGJ1blZlcnNpb246IHVua25vd247XG4gIHRyeSB7XG4gICAgYnVuVmVyc2lvbiA9IHBhcnNlTWlzZVRvbWwocGF0aC5yZXNvbHZlKGRpclBhdGgsICdtaXNlLnRvbWwnKSkudG9vbHM/LmJ1bjtcbiAgfSBjYXRjaCB7XG4gICAgLy8gTGV0IGdlbmVyYXRlTWlzZVRvbWwgcmVwb3J0IHRoZSB1bnJlYWRhYmxlIG9yIG1hbGZvcm1lZCBmaWxlLlxuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIHJldHVybiAoXG4gICAgYnVuVmVyc2lvbiA9PT0gdW5kZWZpbmVkIHx8XG4gICAgKHR5cGVvZiBidW5WZXJzaW9uID09PSAnc3RyaW5nJyAmJiAhIXNlbXZlci52YWxpZChidW5WZXJzaW9uKSAmJiBzZW12ZXIuZ3RlKGJ1blZlcnNpb24sIG1pbmltdW1CdW5WZXJzaW9uKSlcbiAgKTtcbn1cblxuLyoqXG4gKiBMaWZ0cyBhbiBleGFjdCB0b29sIHBpbiBiZWxvdyB0aGUgbGF0ZXN0IHJlc29sdmFibGUgdmVyc2lvbiDigJQgd2l0aGluIHRoZSBTQU1FIG1ham9yIOKAlCB0byB0aGF0XG4gKiB2ZXJzaW9uIChOb2RlLmpzIHJlc29sdmVzIGFnYWluc3QgdGhlIGxhdGVzdCBMVFMpOiB0aGUgcmVwb3NpdG9yeS1zdHJ1Y3R1cmUgc3RhbmRhcmQgdHJhY2tzIHRoZVxuICogY3VycmVudCB0b29sY2hhaW4gYWNyb3NzIHJlcG9zaXRvcmllcyBhbmQgUmVub3ZhdGUgZG9lcyBub3QgbWFuYWdlIG1pc2UudG9tbCBwaW5zLCBzb1xuICogcGF0Y2gvbWlub3IgZHJpZnQgKGUuZy4gbm9kZSAyNC4xNi4wIHZzIDI0LjE4LjAsIGZub3ggMS4zMC4wIHZzIDEuMzEuMCkgbmV2ZXIgc2VsZi1oZWFscy4gQSBwaW5cbiAqIG9uIGFuIG9sZGVyIG1ham9yIGlzIGEgZGVsaWJlcmF0ZSBjb21wYXRpYmlsaXR5IGNob2ljZSBhbmQgaXMga2VwdCwgYXMgYXJlIG5vbi1leGFjdCBhbmRcbiAqIG5vbi1zdHJpbmcgZm9ybXMuIFdoZW4gbWlzZSBjYW5ub3QgcmVzb2x2ZSB0aGUgc2VsZWN0b3IgKGUuZy4gb2ZmbGluZSksIHRoZSBwaW4gaXMga2VwdC5cbiAqL1xuZnVuY3Rpb24gbGlmdE91dGRhdGVkVG9vbFZlcnNpb25XaXRoaW5NYWpvcihzZWxlY3Rvcjogc3RyaW5nLCB2ZXJzaW9uOiB1bmtub3duLCBjd2Q6IHN0cmluZyk6IHVua25vd24ge1xuICBpZiAodHlwZW9mIHZlcnNpb24gIT09ICdzdHJpbmcnIHx8ICFzZW12ZXIudmFsaWQodmVyc2lvbikpIHJldHVybiB2ZXJzaW9uO1xuICBjb25zdCBsYXRlc3RWZXJzaW9uID0gc3Bhd25TeW5jQW5kUmV0dXJuU3Rkb3V0KCdtaXNlJywgWydsYXRlc3QnLCBzZWxlY3Rvcl0sIGN3ZCk7XG4gIHJldHVybiBzZW12ZXIudmFsaWQobGF0ZXN0VmVyc2lvbikgJiZcbiAgICBzZW12ZXIubWFqb3IobGF0ZXN0VmVyc2lvbikgPT09IHNlbXZlci5tYWpvcih2ZXJzaW9uKSAmJlxuICAgIHNlbXZlci5sdCh2ZXJzaW9uLCBsYXRlc3RWZXJzaW9uKVxuICAgID8gbGF0ZXN0VmVyc2lvblxuICAgIDogdmVyc2lvbjtcbn1cblxuLyoqXG4gKiBSZXBsYWNlcyBhbiB1bnBpbm5lZCBzZWxlY3RvciAoYGxhdGVzdGAsIGEgcmFuZ2Ugc3VjaCBhcyBcIjI0XCIsIGFuIGFsaWFzLCBvciBhIG1pc3NpbmcgZW50cnkpXG4gKiB3aXRoIHRoZSBuZXdlc3QgY29uY3JldGUgdmVyc2lvbiBtaXNlIHJlc29sdmVzIGZvciBpdCwgYmVjYXVzZSB0aGUgcmVwb3NpdG9yeS1zdHJ1Y3R1cmVcbiAqIHN0YW5kYXJkIHJlcXVpcmVzIGNvbmNyZXRlIHBpbnM6IENJIGluc3RhbGxzIHdoYXRldmVyIGFuIHVucGlubmVkIHNlbGVjdG9yIHJlc29sdmVzIHRvIGF0IHJ1blxuICogdGltZSwgc28gYnVpbGRzIGRyaWZ0IGFjcm9zcyBydW5zLiBFeGFjdCB2ZXJzaW9ucyBhcmUga2VwdCBhcy1pcywgYW5kIG5vbi1zdHJpbmcgZm9ybXMgKG1pc2Unc1xuICogYXJyYXkgYW5kIGB7IHZlcnNpb24gPSBcIuKAplwiIH1gIGZvcm1zKSBhcmUgdXNlci1tYW5hZ2VkIGFuZCBsZWZ0IHVudG91Y2hlZC4gV2hlbiBtaXNlIGlzXG4gKiB1bmF2YWlsYWJsZSBvciBjYW5ub3QgcmVzb2x2ZSB0aGUgc2VsZWN0b3IgKGUuZy4gb2ZmbGluZSksIHRoZSBvcmlnaW5hbCBzZWxlY3RvciBpcyBrZXB0IOKAlFxuICogYW4gdW5waW5uZWQgdG9vbCBpcyBiZXR0ZXIgdGhhbiBhIGJyb2tlbiBjb25maWd1cmF0aW9uLlxuICovXG5mdW5jdGlvbiBwaW5Db25jcmV0ZVRvb2xWZXJzaW9uKHRvb2w6IHN0cmluZywgdmVyc2lvbjogdW5rbm93biwgY3dkOiBzdHJpbmcpOiB1bmtub3duIHtcbiAgaWYgKHZlcnNpb24gIT09IHVuZGVmaW5lZCAmJiAodHlwZW9mIHZlcnNpb24gIT09ICdzdHJpbmcnIHx8IHNlbXZlci52YWxpZCh2ZXJzaW9uKSkpIHJldHVybiB2ZXJzaW9uO1xuICAvLyBOb3JtYWxpemUgc2VsZWN0b3IgZm9ybXMgYG1pc2UgbGF0ZXN0YCBjYW5ub3QgcmVzb2x2ZSBldmVuIHRob3VnaCBtaXNlIGNvbmZpZ3VyYXRpb24gYWNjZXB0c1xuICAvLyB0aGVtOiBgcHJlZml4OjI0YCBpcyByZWplY3RlZCBvdXRyaWdodCB3aGlsZSBgMjRgIHJlc29sdmVzLCBhbmQgYGx0cy8qYCB5aWVsZHMgZW1wdHkgb3V0cHV0XG4gIC8vIHdoaWxlIGBsdHNgIHJlc29sdmVzLiBNb2RpZmllciBzZWxlY3RvcnMgc3VjaCBhcyBgc3ViLTI6bHRzYCBzdGF5IHVucmVzb2x2YWJsZSBhbmQgZmFsbCBiYWNrXG4gIC8vIHRvIHRoZSBvcmlnaW5hbCBzZWxlY3RvciBiZWxvdy5cbiAgY29uc3QgcmFuZ2UgPSB0eXBlb2YgdmVyc2lvbiA9PT0gJ3N0cmluZycgPyB2ZXJzaW9uLnJlcGxhY2UoL15wcmVmaXg6L3UsICcnKS5yZXBsYWNlKC9cXC9cXCokL3UsICcnKSA6IHVuZGVmaW5lZDtcbiAgLy8gV2l0aCBubyBtZWFuaW5nZnVsIHNlbGVjdG9yLCBOb2RlLmpzIHBpbnMgdG8gdGhlIGxhdGVzdCBMVFMgKG1hdGNoaW5nIHRoZSByZXVzYWJsZSB3b3JrZmxvd3MnXG4gIC8vIGBsdHMvKmAgZmFsbGJhY2spIHJhdGhlciB0aGFuIHRoZSBuZXdlc3QgcmVsZWFzZS5cbiAgY29uc3QgZGVmYXVsdFNlbGVjdG9yID0gdG9vbCA9PT0gJ25vZGUnID8gJ25vZGVAbHRzJyA6IHRvb2w7XG4gIGNvbnN0IHNlbGVjdG9yID0gcmFuZ2UgJiYgcmFuZ2UgIT09ICdsYXRlc3QnID8gYCR7dG9vbH1AJHtyYW5nZX1gIDogZGVmYXVsdFNlbGVjdG9yO1xuICBjb25zdCByZXNvbHZlZFZlcnNpb24gPSBzcGF3blN5bmNBbmRSZXR1cm5TdGRvdXQoJ21pc2UnLCBbJ2xhdGVzdCcsIHNlbGVjdG9yXSwgY3dkKTtcbiAgcmV0dXJuIHNlbXZlci52YWxpZChyZXNvbHZlZFZlcnNpb24pID8gcmVzb2x2ZWRWZXJzaW9uIDogKHZlcnNpb24gPz8gJ2xhdGVzdCcpO1xufVxuXG5mdW5jdGlvbiBwYXJzZU1pc2VUb21sKG1pc2VUb21sUGF0aDogc3RyaW5nKTogTWlzZVRvbWwge1xuICBsZXQgY29udGVudDogc3RyaW5nO1xuICB0cnkge1xuICAgIGNvbnRlbnQgPSBmcy5yZWFkRmlsZVN5bmMobWlzZVRvbWxQYXRoLCAndXRmOCcpO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIC8vIE9ubHkgYSByZXBvc2l0b3J5IHdpdGhvdXQgbWlzZS50b21sIHN0YXJ0cyBmcm9tIGFuIGVtcHR5IGNvbmZpZ3VyYXRpb247IGFuIHVucmVhZGFibGUgZmlsZVxuICAgIC8vIChlLmcuIHBlcm1pc3Npb25zKSBtdXN0IGFib3J0IGluc3RlYWQgb2YgYmVpbmcgb3ZlcndyaXR0ZW4gd2l0aCBnZW5lcmF0ZWQgc2V0dGluZ3MuXG4gICAgaWYgKChlcnJvciBhcyBOb2RlSlMuRXJybm9FeGNlcHRpb24pLmNvZGUgPT09ICdFTk9FTlQnKSByZXR1cm4ge307XG4gICAgdGhyb3cgZXJyb3I7XG4gIH1cbiAgcmV0dXJuIEJ1bi5UT01MLnBhcnNlKGNvbnRlbnQpIGFzIE1pc2VUb21sO1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBmc1V0aWwgfSBmcm9tICcuLi91dGlscy9mc1V0aWwuanMnO1xuaW1wb3J0IHsgcHJpdmF0ZVJlZ2lzdHJ5U2NvcGVNYXBwaW5nLCByZXBvUmVzb2x2ZXNQcml2YXRlUGFja2FnZXMgfSBmcm9tICcuLi91dGlscy9wcml2YXRlUGFja2FnZXMuanMnO1xuXG4vKipcbiAqIEJ1biByZWFkcyByZWdpc3RyeSBzY29wZSBtYXBwaW5ncyBmcm9tIGEgcGh5c2ljYWwgcmVwb3NpdG9yeSAubnBtcmMgZHVyaW5nIFJlbm92YXRlIGFydGlmYWN0XG4gKiB1cGRhdGVzOyBSZW5vdmF0ZSdzIG5wbXJjIHNldHRpbmcgaXMgdXNlZCBvbmx5IGJ5IGl0cyBkYXRhc291cmNlIGxheWVyLiBLZWVwIHRoZSBub24tc2VjcmV0XG4gKiBtYXBwaW5nIGluIHJlcG9zaXRvcmllcyB0aGF0IHJlc29sdmUgcHJpdmF0ZSBwYWNrYWdlcywgd2hpbGUgYXV0aGVudGljYXRpb24gcmVtYWlucyBpbiB0aGVcbiAqIGRldmVsb3BlcidzIH4vLm5wbXJjIGxvY2FsbHkgYW5kIGluIHRlbXBvcmFyeSBDSSBvciBNZW5kIGNvbmZpZ3VyYXRpb24uXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZW5lcmF0ZVJlcG9zaXRvcnlOcG1yYyhjb25maWdzOiBQYWNrYWdlQ29uZmlnW10pOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgcmVwb0F1dGhvciA9IGNvbmZpZ3NbMF0/LnJlcG9BdXRob3I7XG4gIGlmIChyZXBvQXV0aG9yICE9PSAnV2lsbEJvb3N0ZXInICYmIHJlcG9BdXRob3IgIT09ICdXaWxsQm9vc3RlckxhYicpIHJldHVybjtcblxuICBjb25zdCBucG1yY1BhdGhzID0gbmV3IFNldChjb25maWdzLm1hcCgoY29uZmlnKSA9PiBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICcubnBtcmMnKSkpO1xuICBjb25zdCByb290Q29uZmlnID0gY29uZmlncy5maW5kKChjb25maWcpID0+IGNvbmZpZy5pc1Jvb3QpO1xuICBpZiAocm9vdENvbmZpZyAmJiByZXBvUmVzb2x2ZXNQcml2YXRlUGFja2FnZXMocm9vdENvbmZpZykpIHtcbiAgICBjb25zdCByb290TnBtcmNQYXRoID0gcGF0aC5yZXNvbHZlKHJvb3RDb25maWcuZGlyUGF0aCwgJy5ucG1yYycpO1xuICAgIGF3YWl0IGZzVXRpbC5nZW5lcmF0ZUZpbGUocm9vdE5wbXJjUGF0aCwgcHJpdmF0ZVJlZ2lzdHJ5U2NvcGVNYXBwaW5nKTtcbiAgICBucG1yY1BhdGhzLmRlbGV0ZShyb290TnBtcmNQYXRoKTtcbiAgfVxuXG4gIGZvciAoY29uc3QgbnBtcmNQYXRoIG9mIG5wbXJjUGF0aHMpIGF3YWl0IHJlbW92ZU5wbXJjKG5wbXJjUGF0aCk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHJlbW92ZU5wbXJjKG5wbXJjUGF0aDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gIGlmICghKGF3YWl0IGZzLnByb21pc2VzLmxzdGF0KG5wbXJjUGF0aCkuY2F0Y2goKCkgPT4ge30pKSkgcmV0dXJuO1xuICBpZiAoYXdhaXQgZnNVdGlsLnJlbW92ZUNvbmZpbmVkKG5wbXJjUGF0aCkpIHtcbiAgICBjb25zb2xlLmluZm8oYFJlbW92ZWQgbm9uLWNhbm9uaWNhbCByZXBvc2l0b3J5IG5wbXJjICR7bnBtcmNQYXRofS5gKTtcbiAgfVxufVxuIiwiaW1wb3J0IHR5cGUgeyBPY3Rva2l0IH0gZnJvbSAnQG9jdG9raXQvY29yZSc7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGdldE9jdG9raXQsIGhhc0dpdEh1YlRva2VuIH0gZnJvbSAnLi4vdXRpbHMvZ2l0aHViVXRpbC5qcyc7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBzZXR1cExhYmVscyhjb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdzZXR1cExhYmVscycsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCB7IHJlcG9BdXRob3I6IG93bmVyLCByZXBvTmFtZTogcmVwbyB9ID0gY29uZmlnO1xuICAgIGlmICghb3duZXIgfHwgIXJlcG8pIHJldHVybjtcbiAgICBpZiAob3duZXIgIT09ICdXaWxsQm9vc3RlcicgJiYgb3duZXIgIT09ICdXaWxsQm9vc3RlckxhYicpIHJldHVybjtcbiAgICBpZiAoIWhhc0dpdEh1YlRva2VuKG93bmVyKSkgcmV0dXJuO1xuXG4gICAgY29uc3Qgb2N0b2tpdCA9IGdldE9jdG9raXQob3duZXIpO1xuXG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdkMTogeC1lYXN5IDpoZWRnZWhvZzonLCAnRURFOUZFJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAnZDI6IGVhc3kgOnJhYmJpdDI6JywgJ0RERDZGRScpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ2QzOiBtZWRpdW0gOm94OicsICdDNEI1RkQnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdkNDogaGFyZCA6c3F1aWQ6JywgJ0E3OEJGQScpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ2Q1OiB4LWhhcmQgOndoYWxlMjonLCAnOEI1Q0Y2Jyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAncDE6IGNyaXRpY2FsIDpmaXJlOjpmaXJlOjpmaXJlOicsICdFRjQ0NDQnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdwMjogdXJnZW50IDpmaXJlOjpmaXJlOicsICdGODcxNzEnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdwMzogaW1wb3J0YW50IDpmaXJlOicsICdGQ0E1QTUnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdwNDogbmljZSB0byBoYXZlIDpkcm9wbGV0OicsICdGRUNBQ0EnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdyOiBibGl0eicsICc1MzAwYmMnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdyOiBmaXJlYmFzZScsICdmZmNhMjgnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdyOiBwcmlzbWEnLCAnMGMzNDRiJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAncjogcmVhY3QnLCAnNjFkYWZiJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAncjogc2VtYW50aWMtcmVsZWFzZScsICc0OTQ5NDknKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdyZWFkeSA6cm9ja2V0OicsICcyMkM1NUUnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdyZXZpZXcgcmVxdWVzdGVkIDptYWc6JywgJ0ZCQ0EwNCcpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ3JlbGVhc2VkIDpib29rbWFyazonLCAnNjM2NkYxJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAnczogMC41aCA6Y2xvY2sxMjMwOicsICdGM0Y0RjYnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdzOiAxaCA6Y2xvY2sxOicsICdFNUU3RUInKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdzOiAyaCA6Y2xvY2syOicsICdEMUQ1REInKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdzOiAzaCA6Y2xvY2szOicsICc5Q0EzQUYnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdzOiA1aCA6Y2xvY2s1OicsICc2QjcyODAnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdzOiA4aCA6Y2xvY2s4OicsICc0QjU1NjMnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdzOiAxM2ggOmNsb2NrMTonLCAnMzc0MTUxJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAndDogYnVpbGQgOmhhbW1lcjonLCAnQkZEQkZFJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAndDogY2hvcmUgOmJyb29tOicsICdCRkRCRkUnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICd0OiBjaSA6Y29uc3RydWN0aW9uX3dvcmtlcjonLCAnQkZEQkZFJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAndDogZG9jcyA6bWVtbzonLCAnQkZEQkZFJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAndDogZmVhdCA6c3BhcmtsZXM6JywgJ0JGREJGRScpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ3Q6IGZpeCA6YnVnOicsICdCRkRCRkUnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICd0OiBwZXJmIDp6YXA6JywgJ0JGREJGRScpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ3Q6IHJlZmFjdG9yIDpyZWN5Y2xlOicsICdCRkRCRkUnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICd0OiBzdHlsZSA6bGlwc3RpY2s6JywgJ0JGREJGRScpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ3Q6IHRlc3QgOnRlc3RfdHViZTonLCAnQkZEQkZFJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAncHJvamVjdCcsICcyNDI5MkYnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdmb2N1c2VkIDpkYXJ0OicsICcyMkM1NUUnKTtcblxuICAgICAgYXdhaXQgZGVsZXRlTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdidWcnKTtcbiAgICAgIGF3YWl0IGRlbGV0ZUxhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAnZG9jdW1lbnRhdGlvbicpO1xuICAgICAgYXdhaXQgZGVsZXRlTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdkdXBsaWNhdGUnKTtcbiAgICAgIGF3YWl0IGRlbGV0ZUxhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAnZW5oYW5jZW1lbnQnKTtcbiAgICAgIGF3YWl0IGRlbGV0ZUxhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAnZ29vZCBmaXJzdCBpc3N1ZScpO1xuICAgICAgYXdhaXQgZGVsZXRlTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdoZWxwIHdhbnRlZCcpO1xuICAgICAgYXdhaXQgZGVsZXRlTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdpbnZhbGlkJyk7XG4gICAgICBhd2FpdCBkZWxldGVMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ3F1ZXN0aW9uJyk7XG4gICAgICBhd2FpdCBkZWxldGVMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ3dvbnRmaXgnKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgY29uc29sZS53YXJuKCdTa2lwIHNldHVwTGFiZWxzIGR1ZSB0bzonLCAoZXJyb3IgYXMgRXJyb3IgfCB1bmRlZmluZWQpPy5zdGFjayA/PyBlcnJvcik7XG4gICAgfVxuICB9KTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gc2V0dXBMYWJlbChvY3Rva2l0OiBPY3Rva2l0LCBvd25lcjogc3RyaW5nLCByZXBvOiBzdHJpbmcsIG5hbWU6IHN0cmluZywgY29sb3I6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICB0cnkge1xuICAgIGF3YWl0IG9jdG9raXQucmVxdWVzdCgnUE9TVCAvcmVwb3Mve293bmVyfS97cmVwb30vbGFiZWxzJywge1xuICAgICAgb3duZXIsXG4gICAgICByZXBvLFxuICAgICAgbmFtZSxcbiAgICAgIGNvbG9yLFxuICAgIH0pO1xuICB9IGNhdGNoIHtcbiAgICBhd2FpdCBvY3Rva2l0LnJlcXVlc3QoJ1BBVENIIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9sYWJlbHMve25hbWV9Jywge1xuICAgICAgb3duZXIsXG4gICAgICByZXBvLFxuICAgICAgbmFtZSxcbiAgICAgIGNvbG9yLFxuICAgIH0pO1xuICB9XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGRlbGV0ZUxhYmVsKG9jdG9raXQ6IE9jdG9raXQsIG93bmVyOiBzdHJpbmcsIHJlcG86IHN0cmluZywgbmFtZTogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gIHRyeSB7XG4gICAgYXdhaXQgb2N0b2tpdC5yZXF1ZXN0KCdERUxFVEUgL3JlcG9zL3tvd25lcn0ve3JlcG99L2xhYmVscy97bmFtZX0nLCB7XG4gICAgICBvd25lcixcbiAgICAgIHJlcG8sXG4gICAgICBuYW1lLFxuICAgIH0pO1xuICB9IGNhdGNoIHtcbiAgICAvLyBkbyBub3RoaW5nXG4gIH1cbn1cbiIsImltcG9ydCB0eXBlIHsgT2N0b2tpdCB9IGZyb20gJ0BvY3Rva2l0L2NvcmUnO1xuaW1wb3J0IHsgd2l0aFJldHJ5IH0gZnJvbSAnQHdpbGxib29zdGVyL3NoYXJlZC1saWIvc3JjJztcblxuaW1wb3J0IHsgaXNSZXVzYWJsZVdvcmtmbG93c1JlcG8gfSBmcm9tICcuLi9nZW5lcmF0b3JzL3dvcmtmbG93LmpzJztcbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGdldE9jdG9raXQsIGhhc0dpdEh1YlRva2VuLCBpc0dpdEh1YlBlcm1pc3Npb25PclZpc2liaWxpdHlFcnJvciB9IGZyb20gJy4uL3V0aWxzL2dpdGh1YlV0aWwuanMnO1xuXG5pbnRlcmZhY2UgUmVwb3NpdG9yeVJ1bGVzZXRQYXlsb2FkIHtcbiAgbmFtZTogc3RyaW5nO1xuICB0YXJnZXQ6ICdicmFuY2gnO1xuICBlbmZvcmNlbWVudDogJ2FjdGl2ZSc7XG4gIGNvbmRpdGlvbnM6IHtcbiAgICByZWZfbmFtZToge1xuICAgICAgaW5jbHVkZTogc3RyaW5nW107XG4gICAgICBleGNsdWRlOiBzdHJpbmdbXTtcbiAgICB9O1xuICB9O1xuICBydWxlczogKFxuICAgIHwge1xuICAgICAgICB0eXBlOiAnZGVsZXRpb24nIHwgJ25vbl9mYXN0X2ZvcndhcmQnO1xuICAgICAgfVxuICAgIHwge1xuICAgICAgICB0eXBlOiAncmVxdWlyZWRfc3RhdHVzX2NoZWNrcyc7XG4gICAgICAgIHBhcmFtZXRlcnM6IHtcbiAgICAgICAgICBzdHJpY3RfcmVxdWlyZWRfc3RhdHVzX2NoZWNrc19wb2xpY3k6IGJvb2xlYW47XG4gICAgICAgICAgZG9fbm90X2VuZm9yY2Vfb25fY3JlYXRlOiBib29sZWFuO1xuICAgICAgICAgIHJlcXVpcmVkX3N0YXR1c19jaGVja3M6IHtcbiAgICAgICAgICAgIGNvbnRleHQ6IHN0cmluZztcbiAgICAgICAgICAgIGludGVncmF0aW9uX2lkOiBudW1iZXI7XG4gICAgICAgICAgfVtdO1xuICAgICAgICB9O1xuICAgICAgfVxuICAgIHwge1xuICAgICAgICB0eXBlOiAncHVsbF9yZXF1ZXN0JztcbiAgICAgICAgcGFyYW1ldGVyczoge1xuICAgICAgICAgIHJlcXVpcmVkX2FwcHJvdmluZ19yZXZpZXdfY291bnQ6IG51bWJlcjtcbiAgICAgICAgICBkaXNtaXNzX3N0YWxlX3Jldmlld3Nfb25fcHVzaDogYm9vbGVhbjtcbiAgICAgICAgICByZXF1aXJlZF9yZXZpZXdlcnM6IFtdO1xuICAgICAgICAgIHJlcXVpcmVfY29kZV9vd25lcl9yZXZpZXc6IGJvb2xlYW47XG4gICAgICAgICAgcmVxdWlyZV9sYXN0X3B1c2hfYXBwcm92YWw6IGJvb2xlYW47XG4gICAgICAgICAgcmVxdWlyZWRfcmV2aWV3X3RocmVhZF9yZXNvbHV0aW9uOiBib29sZWFuO1xuICAgICAgICAgIGFsbG93ZWRfbWVyZ2VfbWV0aG9kczogWydzcXVhc2gnXTtcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgKVtdO1xuICBieXBhc3NfYWN0b3JzOiB7XG4gICAgYWN0b3JfaWQ6IG51bWJlcjtcbiAgICBhY3Rvcl90eXBlOiAnVGVhbSc7XG4gICAgYnlwYXNzX21vZGU6ICdwdWxsX3JlcXVlc3QnO1xuICB9W107XG59XG5cbmludGVyZmFjZSBSZXBvc2l0b3J5UnVsZXNldFN1bW1hcnkge1xuICBpZD86IG51bWJlcjtcbiAgbmFtZT86IHN0cmluZztcbiAgc291cmNlX3R5cGU/OiBzdHJpbmc7XG59XG5cbmNvbnN0IEdJVEhVQl9BUElfVkVSU0lPTl9IRUFERVIgPSB7XG4gICdYLUdpdEh1Yi1BcGktVmVyc2lvbic6ICcyMDIyLTExLTI4Jyxcbn0gYXMgY29uc3Q7XG5cbmNvbnN0IEdJVEhVQl9BQ1RJT05TX0lOVEVHUkFUSU9OX0lEID0gMTVfMzY4O1xuXG5jb25zdCBQUk9URUNUX01BSU5fUlVMRVNFVDogUmVwb3NpdG9yeVJ1bGVzZXRQYXlsb2FkID0ge1xuICBuYW1lOiAnUHJvdGVjdCBtYWluJyxcbiAgdGFyZ2V0OiAnYnJhbmNoJyxcbiAgZW5mb3JjZW1lbnQ6ICdhY3RpdmUnLFxuICBjb25kaXRpb25zOiB7XG4gICAgcmVmX25hbWU6IHtcbiAgICAgIGV4Y2x1ZGU6IFtdLFxuICAgICAgaW5jbHVkZTogWyd+REVGQVVMVF9CUkFOQ0gnXSxcbiAgICB9LFxuICB9LFxuICBydWxlczogW1xuICAgIHtcbiAgICAgIHR5cGU6ICdkZWxldGlvbicsXG4gICAgfSxcbiAgICB7XG4gICAgICB0eXBlOiAncmVxdWlyZWRfc3RhdHVzX2NoZWNrcycsXG4gICAgICBwYXJhbWV0ZXJzOiB7XG4gICAgICAgIHN0cmljdF9yZXF1aXJlZF9zdGF0dXNfY2hlY2tzX3BvbGljeTogZmFsc2UsXG4gICAgICAgIGRvX25vdF9lbmZvcmNlX29uX2NyZWF0ZTogdHJ1ZSxcbiAgICAgICAgcmVxdWlyZWRfc3RhdHVzX2NoZWNrczogW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIGNvbnRleHQ6ICd0ZXN0IC8gdGVzdCcsXG4gICAgICAgICAgICBpbnRlZ3JhdGlvbl9pZDogR0lUSFVCX0FDVElPTlNfSU5URUdSQVRJT05fSUQsXG4gICAgICAgICAgfSxcbiAgICAgICAgICB7XG4gICAgICAgICAgICBjb250ZXh0OiAnc2VtYW50aWMtcHIgLyBzZW1hbnRpYy1wcicsXG4gICAgICAgICAgICBpbnRlZ3JhdGlvbl9pZDogR0lUSFVCX0FDVElPTlNfSU5URUdSQVRJT05fSUQsXG4gICAgICAgICAgfSxcbiAgICAgICAgXSxcbiAgICAgIH0sXG4gICAgfSxcbiAgICB7XG4gICAgICB0eXBlOiAnbm9uX2Zhc3RfZm9yd2FyZCcsXG4gICAgfSxcbiAgICB7XG4gICAgICB0eXBlOiAncHVsbF9yZXF1ZXN0JyxcbiAgICAgIHBhcmFtZXRlcnM6IHtcbiAgICAgICAgcmVxdWlyZWRfYXBwcm92aW5nX3Jldmlld19jb3VudDogMCxcbiAgICAgICAgZGlzbWlzc19zdGFsZV9yZXZpZXdzX29uX3B1c2g6IGZhbHNlLFxuICAgICAgICByZXF1aXJlZF9yZXZpZXdlcnM6IFtdLFxuICAgICAgICByZXF1aXJlX2NvZGVfb3duZXJfcmV2aWV3OiBmYWxzZSxcbiAgICAgICAgcmVxdWlyZV9sYXN0X3B1c2hfYXBwcm92YWw6IGZhbHNlLFxuICAgICAgICByZXF1aXJlZF9yZXZpZXdfdGhyZWFkX3Jlc29sdXRpb246IGZhbHNlLFxuICAgICAgICBhbGxvd2VkX21lcmdlX21ldGhvZHM6IFsnc3F1YXNoJ10sXG4gICAgICB9LFxuICAgIH0sXG4gIF0sXG4gIGJ5cGFzc19hY3RvcnM6IFtcbiAgICB7XG4gICAgICBhY3Rvcl9pZDogMTdfNzc3XzQ5NSxcbiAgICAgIGFjdG9yX3R5cGU6ICdUZWFtJyxcbiAgICAgIGJ5cGFzc19tb2RlOiAncHVsbF9yZXF1ZXN0JyxcbiAgICB9LFxuICBdLFxufTtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHNldHVwUmVwb3NpdG9yeVJ1bGVzZXRzKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ3NldHVwUmVwb3NpdG9yeVJ1bGVzZXRzJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IHsgcmVwb0F1dGhvcjogb3duZXIsIHJlcG9OYW1lOiByZXBvIH0gPSBjb25maWc7XG4gICAgaWYgKCFvd25lciB8fCAhcmVwbykgcmV0dXJuO1xuICAgIGlmIChvd25lciAhPT0gJ1dpbGxCb29zdGVyJykgcmV0dXJuO1xuICAgIC8vIFRoZSByZXVzYWJsZS13b3JrZmxvd3MgcmVwbyBob3N0cyB3b3JrZmxvd19jYWxsIGRlZmluaXRpb25zLCBzbyB0aGVcbiAgICAvLyBQcm90ZWN0IG1haW4gcnVsZXNldCB3b3VsZCByZXF1aXJlIHRlc3Qvc2VtYW50aWMtcHIgY2hlY2tzIHRoYXQgbmV2ZXIgcnVuIHRoZXJlLlxuICAgIGlmIChpc1JldXNhYmxlV29ya2Zsb3dzUmVwbyhjb25maWcucmVwb3NpdG9yeSkpIHJldHVybjtcbiAgICBpZiAoIWhhc0dpdEh1YlRva2VuKG93bmVyKSkgcmV0dXJuO1xuXG4gICAgY29uc3Qgb2N0b2tpdCA9IGdldE9jdG9raXQob3duZXIpO1xuXG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IHVwc2VydFByb3RlY3RNYWluUnVsZXNldChvY3Rva2l0LCBvd25lciwgcmVwbywgYnVpbGRQcm90ZWN0TWFpblJ1bGVzZXQoY29uZmlnKSk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGlmICghaXNHaXRIdWJQZXJtaXNzaW9uT3JWaXNpYmlsaXR5RXJyb3IoZXJyb3IpKSB0aHJvdyBlcnJvcjtcblxuICAgICAgLy8gUmVwb3NpdG9yeSBydWxlc2V0cyByZXF1aXJlIGFkbWluaXN0cmF0aW9uIHBlcm1pc3Npb24sIHdoaWNoIGxvY2FsIHJ1bnNcbiAgICAgIC8vIG1heSBub3QgaGF2ZSBldmVuIHdoZW4gZmlsZS1nZW5lcmF0aW9uIGFuZCBwdXNoZXMgYXJlIGFsbG93ZWQuXG4gICAgICBjb25zb2xlLndhcm4oJ1NraXAgc2V0dXBSZXBvc2l0b3J5UnVsZXNldHMgZHVlIHRvOicsIChlcnJvciBhcyBFcnJvciB8IHVuZGVmaW5lZCk/LnN0YWNrID8/IGVycm9yKTtcbiAgICB9XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBidWlsZFByb3RlY3RNYWluUnVsZXNldChjb25maWc6IFBhY2thZ2VDb25maWcpOiBSZXBvc2l0b3J5UnVsZXNldFBheWxvYWQge1xuICBjb25zdCBydWxlc2V0ID0gc3RydWN0dXJlZENsb25lKFBST1RFQ1RfTUFJTl9SVUxFU0VUKTtcbiAgaWYgKGNvbmZpZy5jYXJnb1RvbWxEaXJQYXRocy5sZW5ndGggPiAwKSB7XG4gICAgZm9yIChjb25zdCBydWxlIG9mIHJ1bGVzZXQucnVsZXMpIHtcbiAgICAgIGlmIChydWxlLnR5cGUgIT09ICdyZXF1aXJlZF9zdGF0dXNfY2hlY2tzJykgY29udGludWU7XG4gICAgICAvLyBUaGUgY29udGV4dCBpcyBgPGNhbGxlciBqb2IgaWQ+IC8gPHJldXNhYmxlIGpvYiBpZD5gIG9mIHRoZSB3YmZ5LWdlbmVyYXRlZCB0ZXN0LXJ1c3QueW1sLlxuICAgICAgcnVsZS5wYXJhbWV0ZXJzLnJlcXVpcmVkX3N0YXR1c19jaGVja3MucHVzaCh7XG4gICAgICAgIGNvbnRleHQ6ICd0ZXN0LXJ1c3QgLyB0ZXN0LXJ1c3QnLFxuICAgICAgICBpbnRlZ3JhdGlvbl9pZDogR0lUSFVCX0FDVElPTlNfSU5URUdSQVRJT05fSUQsXG4gICAgICB9KTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHJ1bGVzZXQ7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHVwc2VydFByb3RlY3RNYWluUnVsZXNldChcbiAgb2N0b2tpdDogT2N0b2tpdCxcbiAgb3duZXI6IHN0cmluZyxcbiAgcmVwbzogc3RyaW5nLFxuICBydWxlc2V0OiBSZXBvc2l0b3J5UnVsZXNldFBheWxvYWRcbik6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBleGlzdGluZ1J1bGVzZXQgPSBhd2FpdCBmaW5kUmVwb3NpdG9yeVJ1bGVzZXQob2N0b2tpdCwgb3duZXIsIHJlcG8sIHJ1bGVzZXQubmFtZSk7XG4gIGNvbnN0IGV4aXN0aW5nUnVsZXNldElkID0gZXhpc3RpbmdSdWxlc2V0Py5pZDtcblxuICBhd2FpdCB3aXRoUmV0cnkoXG4gICAgYXN5bmMgKCkgPT4ge1xuICAgICAgaWYgKGV4aXN0aW5nUnVsZXNldElkKSB7XG4gICAgICAgIGF3YWl0IG9jdG9raXQucmVxdWVzdCgnUFVUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9ydWxlc2V0cy97cnVsZXNldF9pZH0nLCB7XG4gICAgICAgICAgb3duZXIsXG4gICAgICAgICAgcmVwbyxcbiAgICAgICAgICBydWxlc2V0X2lkOiBleGlzdGluZ1J1bGVzZXRJZCxcbiAgICAgICAgICAuLi5ydWxlc2V0LFxuICAgICAgICAgIGhlYWRlcnM6IEdJVEhVQl9BUElfVkVSU0lPTl9IRUFERVIsXG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGF3YWl0IG9jdG9raXQucmVxdWVzdCgnUE9TVCAvcmVwb3Mve293bmVyfS97cmVwb30vcnVsZXNldHMnLCB7XG4gICAgICAgIG93bmVyLFxuICAgICAgICByZXBvLFxuICAgICAgICAuLi5ydWxlc2V0LFxuICAgICAgICBoZWFkZXJzOiBHSVRIVUJfQVBJX1ZFUlNJT05fSEVBREVSLFxuICAgICAgfSk7XG4gICAgfSxcbiAgICB7XG4gICAgICBzaG91bGRSZXRyeTogKGVycm9yKSA9PiAhaXNHaXRIdWJQZXJtaXNzaW9uT3JWaXNpYmlsaXR5RXJyb3IoZXJyb3IpLFxuICAgIH1cbiAgKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gZmluZFJlcG9zaXRvcnlSdWxlc2V0KFxuICBvY3Rva2l0OiBPY3Rva2l0LFxuICBvd25lcjogc3RyaW5nLFxuICByZXBvOiBzdHJpbmcsXG4gIHJ1bGVzZXROYW1lOiBzdHJpbmdcbik6IFByb21pc2U8UmVwb3NpdG9yeVJ1bGVzZXRTdW1tYXJ5IHwgdW5kZWZpbmVkPiB7XG4gIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgd2l0aFJldHJ5KFxuICAgICgpID0+XG4gICAgICBvY3Rva2l0LnJlcXVlc3QoJ0dFVCAvcmVwb3Mve293bmVyfS97cmVwb30vcnVsZXNldHMnLCB7XG4gICAgICAgIG93bmVyLFxuICAgICAgICByZXBvLFxuICAgICAgICBpbmNsdWRlc19wYXJlbnRzOiBmYWxzZSxcbiAgICAgICAgdGFyZ2V0czogJ2JyYW5jaCcsXG4gICAgICAgIGhlYWRlcnM6IEdJVEhVQl9BUElfVkVSU0lPTl9IRUFERVIsXG4gICAgICB9KSxcbiAgICB7XG4gICAgICBzaG91bGRSZXRyeTogKGVycm9yKSA9PiAhaXNHaXRIdWJQZXJtaXNzaW9uT3JWaXNpYmlsaXR5RXJyb3IoZXJyb3IpLFxuICAgIH1cbiAgKTtcbiAgY29uc3QgcnVsZXNldHMgPSByZXNwb25zZS5kYXRhO1xuICBpZiAoIUFycmF5LmlzQXJyYXkocnVsZXNldHMpKSByZXR1cm47XG4gIHJldHVybiBydWxlc2V0cy5maW5kKChydWxlc2V0KSA9PiBydWxlc2V0Lm5hbWUgPT09IHJ1bGVzZXROYW1lICYmIHJ1bGVzZXQuc291cmNlX3R5cGUgPT09ICdSZXBvc2l0b3J5Jyk7XG59XG4iLCJpbXBvcnQgeyB3aXRoUmV0cnkgfSBmcm9tICdAd2lsbGJvb3N0ZXIvc2hhcmVkLWxpYi9zcmMnO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBnZXRPY3Rva2l0LCBoYXNHaXRIdWJUb2tlbiwgaXNHaXRIdWJQZXJtaXNzaW9uT3JWaXNpYmlsaXR5RXJyb3IgfSBmcm9tICcuLi91dGlscy9naXRodWJVdGlsLmpzJztcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHNldHVwR2l0SHViU2V0dGluZ3MoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignc2V0dXBHaXRIdWJTZXR0aW5ncycsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCB7IHJlcG9BdXRob3I6IG93bmVyLCByZXBvTmFtZTogcmVwbyB9ID0gY29uZmlnO1xuICAgIGlmICghb3duZXIgfHwgIXJlcG8pIHJldHVybjtcbiAgICBpZiAob3duZXIgIT09ICdXaWxsQm9vc3RlcicgJiYgb3duZXIgIT09ICdXaWxsQm9vc3RlckxhYicpIHJldHVybjtcbiAgICBpZiAoIWhhc0dpdEh1YlRva2VuKG93bmVyKSkgcmV0dXJuO1xuXG4gICAgY29uc3Qgb2N0b2tpdCA9IGdldE9jdG9raXQob3duZXIpO1xuXG4gICAgdHJ5IHtcbiAgICAgIC8vIFJlcG9zaXRvcnkgc2V0dGluZ3MgbmVlZCBhZG1pbmlzdHJhdGlvbiBwZXJtaXNzaW9uLCB1bmxpa2UgZmlsZSBnZW5lcmF0aW9uLlxuICAgICAgYXdhaXQgd2l0aFJldHJ5KFxuICAgICAgICAoKSA9PlxuICAgICAgICAgIG9jdG9raXQucmVxdWVzdCgnUEFUQ0ggL3JlcG9zL3tvd25lcn0ve3JlcG99Jywge1xuICAgICAgICAgICAgb3duZXIsXG4gICAgICAgICAgICByZXBvLFxuICAgICAgICAgICAgYWxsb3dfYXV0b19tZXJnZTogdHJ1ZSxcbiAgICAgICAgICAgIGFsbG93X21lcmdlX2NvbW1pdDogZmFsc2UsXG4gICAgICAgICAgICBhbGxvd19zcXVhc2hfbWVyZ2U6IHRydWUsXG4gICAgICAgICAgICBhbGxvd19yZWJhc2VfbWVyZ2U6IGZhbHNlLFxuICAgICAgICAgICAgYWxsb3dfdXBkYXRlX2JyYW5jaDogdHJ1ZSxcbiAgICAgICAgICAgIGRlbGV0ZV9icmFuY2hfb25fbWVyZ2U6IHRydWUsXG4gICAgICAgICAgICBzcXVhc2hfbWVyZ2VfY29tbWl0X3RpdGxlOiAnUFJfVElUTEUnLFxuICAgICAgICAgICAgc3F1YXNoX21lcmdlX2NvbW1pdF9tZXNzYWdlOiAnQkxBTksnLFxuICAgICAgICAgICAgaGVhZGVyczoge1xuICAgICAgICAgICAgICAnWC1HaXRIdWItQXBpLVZlcnNpb24nOiAnMjAyMi0xMS0yOCcsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgLi4uKGNvbmZpZy5yZXBvc2l0b3J5Py5zdGFydHNXaXRoKCdnaXRodWI6V2lsbEJvb3N0ZXIvJykgPyB7IGFsbG93X2F1dG9fbWVyZ2U6IHRydWUgfSA6IHt9KSxcbiAgICAgICAgICB9KSxcbiAgICAgICAge1xuICAgICAgICAgIHNob3VsZFJldHJ5OiAoZXJyb3IpID0+ICFpc0dpdEh1YlBlcm1pc3Npb25PclZpc2liaWxpdHlFcnJvcihlcnJvciksXG4gICAgICAgIH1cbiAgICAgICk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGlmICghaXNHaXRIdWJQZXJtaXNzaW9uT3JWaXNpYmlsaXR5RXJyb3IoZXJyb3IpKSB0aHJvdyBlcnJvcjtcblxuICAgICAgLy8gTG9jYWwgd2JmeSBydW5zIG9mdGVuIGhhdmUgcHVzaCBwZXJtaXNzaW9uIHdpdGhvdXQgYWRtaW4gcGVybWlzc2lvbi5cbiAgICAgIGNvbnNvbGUud2FybignU2tpcCBzZXR1cEdpdEh1YlNldHRpbmdzIGR1ZSB0bzonLCAoZXJyb3IgYXMgRXJyb3IgfCB1bmRlZmluZWQpPy5zdGFjayA/PyBlcnJvcik7XG4gICAgfVxuICB9KTtcbn1cbiIsImltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbi8vIFRoZSBgL3NyY2AgZW50cnkgKGEgZGVjbGFyZWQgZXhwb3J0KSBsZXRzIHRoaXMgd29ya3NwYWNlIGNvbnN1bWVyIHVzZSB0aGUgc291cmNlcyB3aXRob3V0XG4vLyBidWlsZGluZyBzaGFyZWQtbGliIGZpcnN0LCBhcyBldmVyeSBvdGhlciBpbXBvcnQgb2YgaXQgaW4gdGhpcyBwYWNrYWdlIGRvZXMuXG5pbXBvcnQge1xuICBCVUdfSVNTVUVfU0VDVElPTlMsXG4gIENIQU5HRV9JU1NVRV9TRUNUSU9OUyxcbiAgUFVMTF9SRVFVRVNUX1NFQ1RJT05TLFxuICByZW5kZXJTZWN0aW9uVGVtcGxhdGUsXG59IGZyb20gJ0B3aWxsYm9vc3Rlci9zaGFyZWQtbGliL3NyYyc7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGZzVXRpbCB9IGZyb20gJy4uL3V0aWxzL2ZzVXRpbC5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcblxuY29uc3QgdGVtcGxhdGVzID0ge1xuICAncHVsbF9yZXF1ZXN0X3RlbXBsYXRlLm1kJzogYFxuQ2xvc2UgIzxJc3N1ZU51bWJlcj5cblxuPCEtLSBXcml0ZSBmb3IgYSByZXZpZXdlciB3aG8gaGFzIG5vdCBmb2xsb3dlZCB0aGUgd29yay4gU2NhbGUgZWFjaCBzZWN0aW9uIHRvIHRoZSBjaGFuZ2U6IGEgc2VudGVuY2UgZm9yIGEgc21hbGwgY2hhbmdlLCBudW1iZXJlZCBzdWJzZWN0aW9ucyBmb3IgYSBsYXJnZSBvbmUuIERlbGV0ZSB0aGlzIGNvbW1lbnQgYW5kIHRoZSBwbGFjZWhvbGRlciBjb21tZW50cyBiZWxvdy4gLS0+XG5cbiR7cmVuZGVyU2VjdGlvblRlbXBsYXRlKFBVTExfUkVRVUVTVF9TRUNUSU9OUyl9XG5gLnRyaW0oKSxcbiAgJ0lTU1VFX1RFTVBMQVRFL2J1Zy5tZCc6IGBcbi0tLVxubmFtZTogQnVnIC8gUHJvYmxlbVxuYWJvdXQ6IFNvbWV0aGluZyBiZWhhdmVzIHdyb25nbHlcbnRpdGxlOiAnZml4OiAnXG5sYWJlbHM6ICd0OiBmaXggOmJ1ZzonXG4tLS1cblxuPCEtLSBLZWVwIFByb2JsZW0gYW5kIFByb3Bvc2FsOyBkZWxldGUgRXZpZGVuY2Ugb3IgSW1wYWN0IHdoZW4gdGhleSBhZGQgbm90aGluZy4gRGVsZXRlIHRoZXNlIGNvbW1lbnRzLiAtLT5cblxuJHtyZW5kZXJTZWN0aW9uVGVtcGxhdGUoQlVHX0lTU1VFX1NFQ1RJT05TKX1cbmAudHJpbSgpLFxuICAnSVNTVUVfVEVNUExBVEUvY2hhbmdlLm1kJzogYFxuLS0tXG5uYW1lOiBDaGFuZ2UgLyBGZWF0dXJlXG5hYm91dDogUHJvcG9zZSBhIGNoYW5nZSB0aGF0IGEgdGhpcmQgcGFydHkgY291bGQgaW1wbGVtZW50IHdpdGhvdXQgYXNraW5nIGEgcXVlc3Rpb25cbnRpdGxlOiAnZmVhdDogJ1xubGFiZWxzOiAndDogZmVhdCA6c3BhcmtsZXM6J1xuLS0tXG5cbjwhLS0gS2VlcCB0aGUgZmlyc3QgdGhyZWUgc2VjdGlvbnMgZm9yIGFueSBjaGFuZ2UgYW5kIGFkZCB0aGUgb3RoZXJzIGFzIHRoZSBjaGFuZ2UgZ3Jvd3M7IGEgbGFyZ2UgY2hhbmdlIGZpbGxzIGFsbCBvZiB0aGVtIChzcGVjLWJvb3N0ZXIgcmV2aWV3cyBhZ2FpbnN0IHRoaXMgbGlzdCkuIERlbGV0ZSB0aGVzZSBjb21tZW50cy4gLS0+XG5cbiR7cmVuZGVyU2VjdGlvblRlbXBsYXRlKENIQU5HRV9JU1NVRV9TRUNUSU9OUyl9XG5gLnRyaW0oKSxcbiAgJ0lTU1VFX1RFTVBMQVRFL2NvbmZpZy55bWwnOiAnYmxhbmtfaXNzdWVzX2VuYWJsZWQ6IHRydWUnLFxufTtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlR2l0SHViVGVtcGxhdGVzKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2dlbmVyYXRlR2l0SHViVGVtcGxhdGVzJywgYXN5bmMgKCkgPT4ge1xuICAgIC8vIFRlbXBsYXRlcyBhcmUgcmVwb3NpdG9yeS1sZXZlbCBmaWxlcywgc28gYSBkaXJlY3Qgd29ya3NwYWNlLWNoaWxkIGludm9jYXRpb24gbXVzdCBub3QgY3JlYXRlIHRoZW0uXG4gICAgaWYgKCFjb25maWcuaXNXaWxsQm9vc3RlclJlcG8gfHwgIWNvbmZpZy5pc1Jvb3QpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IFtmaWxlTmFtZSwgY29udGVudF0gb2YgT2JqZWN0LmVudHJpZXModGVtcGxhdGVzKSkge1xuICAgICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICcuZ2l0aHViJywgZmlsZU5hbWUpO1xuICAgICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzVXRpbC5nZW5lcmF0ZUZpbGUoZmlsZVBhdGgsIGNvbnRlbnQpKTtcbiAgICB9XG4gIH0pO1xufVxuIiwiaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5cbmNvbnN0IGRlcGVuZGVuY3lTZWN0aW9uS2V5cyA9IFsnZGVwZW5kZW5jaWVzJywgJ2RldkRlcGVuZGVuY2llcycsICdvcHRpb25hbERlcGVuZGVuY2llcycsICdwZWVyRGVwZW5kZW5jaWVzJ10gYXMgY29uc3Q7XG5jb25zdCBhbGxvd2VkR2l0SHViT3JnYW5pemF0aW9uUGF0dGVybiA9IFN0cmluZy5yYXdgKD86V2lsbEJvb3N0ZXJ8V2lsbEJvb3N0ZXJMYWIpYDtcbmNvbnN0IGFsbG93ZWRHaXREZXBlbmRlbmN5UGF0dGVybnMgPSBbXG4gIG5ldyBSZWdFeHAoYF4ke2FsbG93ZWRHaXRIdWJPcmdhbml6YXRpb25QYXR0ZXJufS9bXiNcXFxcc10rKD86I1xcXFxTKyk/JGAsICd1JyksXG4gIG5ldyBSZWdFeHAoYF5naXRodWI6JHthbGxvd2VkR2l0SHViT3JnYW5pemF0aW9uUGF0dGVybn0vW14jXFxcXHNdKyg/OiNcXFxcUyspPyRgLCAndScpLFxuICBuZXcgUmVnRXhwKFxuICAgIGBeKD86Z2l0XFxcXCspP2h0dHBzOi8vZ2l0aHViXFxcXC5jb20vJHthbGxvd2VkR2l0SHViT3JnYW5pemF0aW9uUGF0dGVybn0vW14jXFxcXHNdKyg/OlxcXFwuZ2l0KT8oPzojXFxcXFMrKT8kYCxcbiAgICAndSdcbiAgKSxcbiAgbmV3IFJlZ0V4cChcbiAgICBgXig/OmdpdFxcXFwrKT9zc2g6Ly9naXRAZ2l0aHViXFxcXC5jb21bOi9dJHthbGxvd2VkR2l0SHViT3JnYW5pemF0aW9uUGF0dGVybn0vW14jXFxcXHNdKyg/OlxcXFwuZ2l0KT8oPzojXFxcXFMrKT8kYCxcbiAgICAndSdcbiAgKSxcbiAgbmV3IFJlZ0V4cChgXig/OmdpdFxcXFwrKT9naXRAZ2l0aHViXFxcXC5jb206JHthbGxvd2VkR2l0SHViT3JnYW5pemF0aW9uUGF0dGVybn0vW14jXFxcXHNdKyg/OlxcXFwuZ2l0KT8oPzojXFxcXFMrKT8kYCwgJ3UnKSxcbl07XG5cbmludGVyZmFjZSBEaXNhbGxvd2VkRGVwZW5kZW5jeVNvdXJjZSB7XG4gIGRlcGVuZGVuY3lOYW1lOiBzdHJpbmc7XG4gIGRpclBhdGg6IHN0cmluZztcbiAgc2VjdGlvbk5hbWU6ICh0eXBlb2YgZGVwZW5kZW5jeVNlY3Rpb25LZXlzKVtudW1iZXJdO1xuICBzcGVjaWZpZXI6IHN0cmluZztcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGFzc2VydFNhZmVEZXBlbmRlbmN5U291cmNlcyhjb25maWdzOiBQYWNrYWdlQ29uZmlnW10pOiB2b2lkIHtcbiAgY29uc3QgZGlzYWxsb3dlZFNvdXJjZXMgPSBjb25maWdzLmZsYXRNYXAoZ2V0RGlzYWxsb3dlZERlcGVuZGVuY3lTb3VyY2VzKTtcbiAgaWYgKGRpc2FsbG93ZWRTb3VyY2VzLmxlbmd0aCA9PT0gMCkgcmV0dXJuO1xuXG4gIGNvbnN0IGRldGFpbHMgPSBkaXNhbGxvd2VkU291cmNlc1xuICAgIC5tYXAoXG4gICAgICAoeyBkZXBlbmRlbmN5TmFtZSwgZGlyUGF0aCwgc2VjdGlvbk5hbWUsIHNwZWNpZmllciB9KSA9PlxuICAgICAgICBgLSAke3BhdGguam9pbihkaXJQYXRoLCAncGFja2FnZS5qc29uJyl9OiAke3NlY3Rpb25OYW1lfS4ke2RlcGVuZGVuY3lOYW1lfSB1c2VzICR7c3BlY2lmaWVyfWBcbiAgICApXG4gICAgLmpvaW4oJ1xcbicpO1xuXG4gIHRocm93IG5ldyBFcnJvcihcbiAgICBgRGlzYWxsb3dlZCBHaXQgZGVwZW5kZW5jeSBzb3VyY2VzIGZvdW5kLlxcbk9ubHkgV2lsbEJvb3N0ZXIgYW5kIFdpbGxCb29zdGVyTGFiIEdpdEh1YiBkZXBlbmRlbmNpZXMgYXJlIGFsbG93ZWQuXFxuJHtkZXRhaWxzfWBcbiAgKTtcbn1cblxuZnVuY3Rpb24gZ2V0RGlzYWxsb3dlZERlcGVuZGVuY3lTb3VyY2VzKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IERpc2FsbG93ZWREZXBlbmRlbmN5U291cmNlW10ge1xuICBjb25zdCBwYWNrYWdlSnNvbiA9IGNvbmZpZy5wYWNrYWdlSnNvbjtcbiAgaWYgKCFwYWNrYWdlSnNvbikgcmV0dXJuIFtdO1xuXG4gIGNvbnN0IGRpc2FsbG93ZWRTb3VyY2VzOiBEaXNhbGxvd2VkRGVwZW5kZW5jeVNvdXJjZVtdID0gW107XG4gIGZvciAoY29uc3Qgc2VjdGlvbk5hbWUgb2YgZGVwZW5kZW5jeVNlY3Rpb25LZXlzKSB7XG4gICAgY29uc3Qgc2VjdGlvbiA9IHBhY2thZ2VKc29uW3NlY3Rpb25OYW1lXTtcbiAgICBpZiAoIXNlY3Rpb24pIGNvbnRpbnVlO1xuXG4gICAgZm9yIChjb25zdCBbZGVwZW5kZW5jeU5hbWUsIHNwZWNpZmllcl0gb2YgT2JqZWN0LmVudHJpZXMoc2VjdGlvbikpIHtcbiAgICAgIGlmICghc3BlY2lmaWVyKSBjb250aW51ZTtcbiAgICAgIGlmICghaXNHaXREZXBlbmRlbmN5U3BlY2lmaWVyKHNwZWNpZmllcikpIGNvbnRpbnVlO1xuICAgICAgaWYgKGlzQWxsb3dlZEdpdERlcGVuZGVuY3lTcGVjaWZpZXIoc3BlY2lmaWVyKSkgY29udGludWU7XG5cbiAgICAgIGRpc2FsbG93ZWRTb3VyY2VzLnB1c2goe1xuICAgICAgICBkZXBlbmRlbmN5TmFtZSxcbiAgICAgICAgZGlyUGF0aDogY29uZmlnLmRpclBhdGgsXG4gICAgICAgIHNlY3Rpb25OYW1lLFxuICAgICAgICBzcGVjaWZpZXIsXG4gICAgICB9KTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGRpc2FsbG93ZWRTb3VyY2VzO1xufVxuXG5mdW5jdGlvbiBpc0dpdERlcGVuZGVuY3lTcGVjaWZpZXIoc3BlY2lmaWVyOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgcmV0dXJuIChcbiAgICBpc0dpdEh1YlNob3J0aGFuZFNwZWNpZmllcihzcGVjaWZpZXIpIHx8XG4gICAgL14oPzpiaXRidWNrZXR8Z2lzdHxnaXRodWJ8Z2l0bGFiKTovdS50ZXN0KHNwZWNpZmllcikgfHxcbiAgICAvXmh0dHBzPzpcXC9cXC8oPzpiaXRidWNrZXRcXC5vcmd8Z2l0aHViXFwuY29tfGdpdGxhYlxcLmNvbSlcXC8vdS50ZXN0KHNwZWNpZmllcikgfHxcbiAgICAvXig/Omh0dHBzP3xzc2gpOlxcL1xcL1xcUytcXC5naXQoPzojXFxTKyk/JC91LnRlc3Qoc3BlY2lmaWVyKSB8fFxuICAgIC9eW15AXFxzXStAW146XFxzXSs6XFxTKyg/OiNcXFMrKT8kL3UudGVzdChzcGVjaWZpZXIpIHx8XG4gICAgc3BlY2lmaWVyLnN0YXJ0c1dpdGgoJ2dpdDonKSB8fFxuICAgIHNwZWNpZmllci5zdGFydHNXaXRoKCdnaXQrJykgfHxcbiAgICBzcGVjaWZpZXIuc3RhcnRzV2l0aCgnc3NoOi8vZ2l0QCcpXG4gICk7XG59XG5cbmZ1bmN0aW9uIGlzR2l0SHViU2hvcnRoYW5kU3BlY2lmaWVyKHNwZWNpZmllcjogc3RyaW5nKTogYm9vbGVhbiB7XG4gIHJldHVybiAvXlthLXpBLVowLTldW1xcdy4tXSpcXC9bXFx3Li1dKyg/OiNcXFMrKT8kL3UudGVzdChzcGVjaWZpZXIpO1xufVxuXG5mdW5jdGlvbiBpc0FsbG93ZWRHaXREZXBlbmRlbmN5U3BlY2lmaWVyKHNwZWNpZmllcjogc3RyaW5nKTogYm9vbGVhbiB7XG4gIHJldHVybiBhbGxvd2VkR2l0RGVwZW5kZW5jeVBhdHRlcm5zLnNvbWUoKHBhdHRlcm4pID0+IHBhdHRlcm4udGVzdChzcGVjaWZpZXIpKTtcbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB7IGlnbm9yZUVycm9yLCBpZ25vcmVFcnJvckFzeW5jIH0gZnJvbSAnQHdpbGxib29zdGVyL3NoYXJlZC1saWIvc3JjJztcbmltcG9ydCB7IG5vcm1hbGl6ZUJ1bkxvY2tmaWxlIH0gZnJvbSAnQHdpbGxib29zdGVyL3NoYXJlZC1saWItbm9kZS9zcmMnO1xuaW1wb3J0IHlhcmdzIGZyb20gJ3lhcmdzJztcblxuaW1wb3J0IHsgZml4TmV4dENvbmZpZ0pzb24gfSBmcm9tICcuL2ZpeGVycy9uZXh0Q29uZmlnLmpzJztcbmltcG9ydCB7IGZpeENoYWtyYVRvYXN0ZXIgfSBmcm9tICcuL2ZpeGVycy9jaGFrcmFUb2FzdGVyLmpzJztcbmltcG9ydCB7IGZpeFBsYXl3cmlnaHRDb25maWcgfSBmcm9tICcuL2ZpeGVycy9wbGF5d3JpZ2h0Q29uZmlnLmpzJztcbmltcG9ydCB7IGZpeFR5cG9zIH0gZnJvbSAnLi9maXhlcnMvdHlwb3MuanMnO1xuaW1wb3J0IHsgZ2VuZXJhdGVBZ2VudEluc3RydWN0aW9ucyB9IGZyb20gJy4vZ2VuZXJhdG9ycy9hZ2VudHMuanMnO1xuaW1wb3J0IHsgZ2VuZXJhdGVCdW5maWdUb21sLCByZWFkQnVuR2xvYmFsU3RvcmUsIHJlc29sdmVCdW5HbG9iYWxTdG9yZSB9IGZyb20gJy4vZ2VuZXJhdG9ycy9idW5maWcuanMnO1xuaW1wb3J0IHsgZ2VuZXJhdGVEb2NrZXJpZ25vcmUgfSBmcm9tICcuL2dlbmVyYXRvcnMvZG9ja2VyaWdub3JlLmpzJztcbmltcG9ydCB7IGdlbmVyYXRlRWRpdG9yY29uZmlnIH0gZnJvbSAnLi9nZW5lcmF0b3JzL2VkaXRvcmNvbmZpZy5qcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZUZub3hUb21sIH0gZnJvbSAnLi9nZW5lcmF0b3JzL2Zub3hUb21sLmpzJztcbmltcG9ydCB7IGdlbmVyYXRlR2VtaW5pQ29uZmlnIH0gZnJvbSAnLi9nZW5lcmF0b3JzL2dlbWluaUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZUdpdGF0dHJpYnV0ZXMsIHJlbm9ybWFsaXplVHJhY2tlZFRleHRGaWxlcyB9IGZyb20gJy4vZ2VuZXJhdG9ycy9naXRhdHRyaWJ1dGVzLmpzJztcbmltcG9ydCB7IGdlbmVyYXRlR2l0aWdub3JlIH0gZnJvbSAnLi9nZW5lcmF0b3JzL2dpdGlnbm9yZS5qcyc7XG5pbXBvcnQgeyBlbnN1cmVHbG9iYWxSZWxlYXNlQWdlR2F0ZXMgfSBmcm9tICcuL2dlbmVyYXRvcnMvZ2xvYmFsUmVsZWFzZUFnZUdhdGUuanMnO1xuaW1wb3J0IHsgZ2VuZXJhdGVJZGVhU2V0dGluZ3MgfSBmcm9tICcuL2dlbmVyYXRvcnMvaWRlYS5qcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZUxlZnRob29rIH0gZnJvbSAnLi9nZW5lcmF0b3JzL2xlZnRob29rLmpzJztcbmltcG9ydCB7IGdlbmVyYXRlUGFja2FnZUpzb24sIGdldFdvcmtzcGFjZVBhY2thZ2VEaXJzIH0gZnJvbSAnLi9nZW5lcmF0b3JzL3BhY2thZ2VKc29uLmpzJztcbmltcG9ydCB7IGdlbmVyYXRlT3hmbXRDb25maWcgfSBmcm9tICcuL2dlbmVyYXRvcnMvb3hmbXRDb25maWcuanMnO1xuaW1wb3J0IHsgZ2VuZXJhdGVPeGxpbnRDb25maWcgfSBmcm9tICcuL2dlbmVyYXRvcnMvb3hsaW50Q29uZmlnLmpzJztcbmltcG9ydCB7IGdlbmVyYXRlUHJldHRpZXJpZ25vcmUgfSBmcm9tICcuL2dlbmVyYXRvcnMvcHJldHRpZXJpZ25vcmUuanMnO1xuaW1wb3J0IHsgZ2VuZXJhdGVQeXJpZ2h0Q29uZmlnSnNvbiB9IGZyb20gJy4vZ2VuZXJhdG9ycy9weXJpZ2h0Q29uZmlnLmpzJztcbmltcG9ydCB7IGZpeFJhaWx3YXlpZ25vcmUgfSBmcm9tICcuL2dlbmVyYXRvcnMvcmFpbHdheWlnbm9yZS5qcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZVJlYWRtZSwgcmVhZEFwcGxpZWRXYmZ5VmVyc2lvbkxhYmVsIH0gZnJvbSAnLi9nZW5lcmF0b3JzL3JlYWRtZS5qcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZVJlbGVhc2VyYyB9IGZyb20gJy4vZ2VuZXJhdG9ycy9yZWxlYXNlcmMuanMnO1xuaW1wb3J0IHsgZ2VuZXJhdGVSZW5vdmF0ZUpzb25jIH0gZnJvbSAnLi9nZW5lcmF0b3JzL3Jlbm92YXRlSnNvbmMuanMnO1xuaW1wb3J0IHsgZ2VuZXJhdGVUc2NvbmZpZyB9IGZyb20gJy4vZ2VuZXJhdG9ycy90c2NvbmZpZy5qcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZVVzZXJBZ2VudENvbmZpZ3MgfSBmcm9tICcuL2dlbmVyYXRvcnMvdXNlckFnZW50Q29uZmlncy5qcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZVZzY29kZVNldHRpbmdzIH0gZnJvbSAnLi9nZW5lcmF0b3JzL3ZzY29kZVNldHRpbmdzLmpzJztcbmltcG9ydCB7IGVuc3VyZVdiRW52RGVmaW5pdGlvbnMgfSBmcm9tICcuL2dlbmVyYXRvcnMvd2JFbnYuanMnO1xuaW1wb3J0IHsgZ2VuZXJhdGVTZWxmQ29udGFpbmVkV29ya2Zsb3dzIH0gZnJvbSAnLi9nZW5lcmF0b3JzL3NlbGZDb250YWluZWRXb3JrZmxvdy5qcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZVdvcmtmbG93cywgaXNSZXVzYWJsZVdvcmtmbG93c1JlcG8gfSBmcm9tICcuL2dlbmVyYXRvcnMvd29ya2Zsb3cuanMnO1xuaW1wb3J0IHsgZ2VuZXJhdGVNaXNlVG9tbCwgaGFzU3VwcG9ydGVkQnVuUGluLCBtaW5pbXVtQnVuVmVyc2lvbiB9IGZyb20gJy4vZ2VuZXJhdG9ycy9taXNlVG9tbC5qcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZVJlcG9zaXRvcnlOcG1yYyB9IGZyb20gJy4vZ2VuZXJhdG9ycy9ucG1yYy5qcyc7XG5pbXBvcnQgeyBzZXR1cExhYmVscyB9IGZyb20gJy4vZ2l0aHViL2xhYmVsLmpzJztcbmltcG9ydCB7IHNldHVwUmVwb3NpdG9yeVJ1bGVzZXRzIH0gZnJvbSAnLi9naXRodWIvcnVsZXNldC5qcyc7XG5pbXBvcnQgeyBzZXR1cEdpdEh1YlNldHRpbmdzIH0gZnJvbSAnLi9naXRodWIvc2V0dGluZ3MuanMnO1xuaW1wb3J0IHsgZ2VuZXJhdGVHaXRIdWJUZW1wbGF0ZXMgfSBmcm9tICcuL2dpdGh1Yi90ZW1wbGF0ZS5qcyc7XG5pbXBvcnQgeyBvcHRpb25zIH0gZnJvbSAnLi9vcHRpb25zLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBnZXRQYWNrYWdlQ29uZmlnLCBnZXRXb3JrZXJUeXBlc1NjcmlwdEVycm9yIH0gZnJvbSAnLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGFzc2VydFNhZmVEZXBlbmRlbmN5U291cmNlcyB9IGZyb20gJy4vdXRpbHMvZGVwZW5kZW5jeVNvdXJjZVBvbGljeS5qcyc7XG5pbXBvcnQgeyBmc1V0aWwgfSBmcm9tICcuL3V0aWxzL2ZzVXRpbC5qcyc7XG5pbXBvcnQgeyBkb2VzQ29udGFpbkphdmEsIGRvZXNDb250YWluSnNPclRzIH0gZnJvbSAnLi91dGlscy9wYWNrYWdlQ2FwYWJpbGl0aWVzLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5pbXBvcnQgeyBzcGF3blN5bmMsIHNwYXduU3luY0FuZFJldHVyblN0YXR1cywgc3Bhd25TeW5jQW5kUmV0dXJuU3Rkb3V0IH0gZnJvbSAnLi91dGlscy9zcGF3blV0aWwuanMnO1xuaW1wb3J0IHsgZGlzcG9zZVR5cGVTY3JpcHRBcGkgfSBmcm9tICcuL3V0aWxzL3R5cGVzY3JpcHRBcGkuanMnO1xuaW1wb3J0IHsgZ2V0V2JmeVZlcnNpb24sIGdldFdiZnlWZXJzaW9uTGFiZWwgfSBmcm9tICcuL3V0aWxzL3ZlcnNpb24uanMnO1xuaW1wb3J0IHsgZ2V0V29ya3NwYWNlU3ViRGlyUGF0aHMgfSBmcm9tICcuL3V0aWxzL3dvcmtzcGFjZVV0aWwuanMnO1xuXG4vKipcbiAqIEFwcGxpZXMgb25seSB0aGUgZ2xvYmFsIHJlbGVhc2UtYWdlIGdhdGUsIHdpdGhvdXQgdG91Y2hpbmcgYW55IHJlcG9zaXRvcnkuIFNwZWxsZWQgb3V0IGluIGZ1bGxcbiAqIHJhdGhlciB0aGFuIHNob3J0ZW5lZCAoZS5nLiBgZ2F0ZWApIGJlY2F1c2UgdGhlIGRlZmF1bHQgY29tbWFuZCB0YWtlcyBwb3NpdGlvbmFsIHBhdGhzOiBhIHNob3J0XG4gKiBuYW1lIHdvdWxkIHN3YWxsb3cgYSBkaXJlY3RvcnkgdGhhdCBoYXBwZW5zIHRvIHNoYXJlIGl0LlxuICovXG5jb25zdCBhcHBseVJlbGVhc2VBZ2VHYXRlQ29tbWFuZCA9ICdhcHBseS1yZWxlYXNlLWFnZS1nYXRlJztcbi8qKiBTYW1lIG5hbWluZyByYXRpb25hbGUgYXMgYXBwbHlSZWxlYXNlQWdlR2F0ZUNvbW1hbmQuICovXG5jb25zdCBnZW5lcmF0ZVVzZXJBZ2VudENvbmZpZ3NDb21tYW5kID0gJ2dlbmVyYXRlLXVzZXItYWdlbnQtY29uZmlncyc7XG5cbmFzeW5jIGZ1bmN0aW9uIG1haW4oKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IGFyZ3YgPSBhd2FpdCB5YXJncyhwcm9jZXNzLmFyZ3Yuc2xpY2UoMikpXG4gICAgLmNvbW1hbmQoXG4gICAgICBhcHBseVJlbGVhc2VBZ2VHYXRlQ29tbWFuZCxcbiAgICAgIFwiQXBwbHkgb25seSB0aGUgb3JnYW5pemF0aW9uJ3MgbWluaW11bS1yZWxlYXNlLWFnZSBwb2xpY3kgdG8gdGhpcyBtYWNoaW5lJ3MgZ2xvYmFsIHBhY2thZ2UtbWFuYWdlciBjb25maWdzXCJcbiAgICApXG4gICAgLmNvbW1hbmQoXG4gICAgICBnZW5lcmF0ZVVzZXJBZ2VudENvbmZpZ3NDb21tYW5kLFxuICAgICAgXCJPdmVyd3JpdGUgdGhpcyB1c2VyJ3MgYWdlbnQgaW5zdHJ1Y3Rpb24gZmlsZXMgKH4vLmNvZGV4L0FHRU5UUy5tZCwgfi8uY2xhdWRlL0NMQVVERS5tZCwgfi8uZ2VtaW5pL0dFTUlOSS5tZCkgd2l0aCB0aGUgb3JnYW5pemF0aW9uJ3MgZml4ZWQgY29udGVudCBhbmQgbWVyZ2UgdGhlIG9yZ2FuaXphdGlvbidzIHNldHRpbmdzIGludG8gfi8uY2xhdWRlL3NldHRpbmdzLmpzb24gYW5kIH4vLmdlbWluaS9zZXR0aW5ncy5qc29uXCJcbiAgICApXG4gICAgLmNvbW1hbmQoJyQwIFtwYXRocy4uXScsICdNYWtlIGEgZ2l2ZW4gcHJvamVjdCBmb2xsb3cgdGhlIFdpbGxCb29zdGVyIHN0YW5kYXJkJywgKHlhcmdzKSA9PiB7XG4gICAgICB5YXJncy5wb3NpdGlvbmFsKCdwYXRocycsIHtcbiAgICAgICAgZGVzY3JpYmU6ICdwcm9qZWN0IHBhdGhzIHRvIGJlIHdiZmllZCcsXG4gICAgICAgIGFycmF5OiB0cnVlLFxuICAgICAgICB0eXBlOiAnc3RyaW5nJyxcbiAgICAgICAgZGVmYXVsdDogWycuJ10sXG4gICAgICB9KTtcbiAgICB9KVxuICAgIC5vcHRpb25zKHtcbiAgICAgIGZvcmNlOiB7XG4gICAgICAgIGRlc2NyaXB0aW9uOiAnQXBwbHkgd2JmeSBldmVuIHdoZW4gdGhlIHJlcG9zaXRvcnkgYWxyZWFkeSByZWNvcmRzIHRoaXMgd2JmeSB2ZXJzaW9uJyxcbiAgICAgICAgdHlwZTogJ2Jvb2xlYW4nLFxuICAgICAgICBkZWZhdWx0OiBmYWxzZSxcbiAgICAgICAgYWxpYXM6ICdmJyxcbiAgICAgIH0sXG4gICAgICBza2lwRGVwczoge1xuICAgICAgICBkZXNjcmlwdGlvbjpcbiAgICAgICAgICAnU2tpcCBhZGRpbmcgbWFuYWdlZCBkZXBlbmRlbmNpZXMgYW5kIHRoZSBsaW5rZXIgcHJvYmUgKHRoZSBmaW5hbCBgYnVuIGluc3RhbGxgIHJlZnJlc2hpbmcgdGhlIGxvY2tmaWxlIHN0aWxsIHJ1bnMpJyxcbiAgICAgICAgdHlwZTogJ2Jvb2xlYW4nLFxuICAgICAgICBkZWZhdWx0OiBmYWxzZSxcbiAgICAgICAgYWxpYXM6ICdkJyxcbiAgICAgIH0sXG4gICAgICB2ZXJib3NlOiB7XG4gICAgICAgIGRlc2NyaXB0aW9uOiAnV2hldGhlciBvciBub3QgdG8gZW5hYmxlIHZlcmJvc2UgbW9kZScsXG4gICAgICAgIHR5cGU6ICdib29sZWFuJyxcbiAgICAgICAgZGVmYXVsdDogZmFsc2UsXG4gICAgICAgIGFsaWFzOiAndicsXG4gICAgICB9LFxuICAgIH0pXG4gICAgLnZlcnNpb24oZ2V0V2JmeVZlcnNpb24oKSlcbiAgICAuc3RyaWN0KCkuYXJndjtcbiAgb3B0aW9ucy5pc1ZlcmJvc2UgPSBhcmd2LnZlcmJvc2U7XG5cbiAgLy8gRGVsaWJlcmF0ZWx5IGJlZm9yZSB0aGUgQnVuIGNoZWNrIGluIHdpbGxib29zdGVyaWZ5UGF0aHMoKTogdGhlIGdhdGUgbXVzdCBiZSBhcHBsaWFibGUgb24gYVxuICAvLyBtYWNoaW5lIHdob3NlIEJ1biBpcyBvdXRkYXRlZCwgd2hpY2ggaXMgZXhhY3RseSBhIG1hY2hpbmUgdGhhdCBzdGlsbCBuZWVkcyBnYXRpbmcuXG4gIGlmIChhcmd2Ll9bMF0gPT09IGFwcGx5UmVsZWFzZUFnZUdhdGVDb21tYW5kKSB7XG4gICAgaWYgKCFlbnN1cmVHbG9iYWxSZWxlYXNlQWdlR2F0ZXMoKSkgcHJvY2Vzcy5leGl0Q29kZSA9IDE7XG4gICAgcmV0dXJuO1xuICB9XG4gIGlmIChhcmd2Ll9bMF0gPT09IGdlbmVyYXRlVXNlckFnZW50Q29uZmlnc0NvbW1hbmQpIHtcbiAgICBpZiAoIShhd2FpdCBnZW5lcmF0ZVVzZXJBZ2VudENvbmZpZ3MoKSkpIHByb2Nlc3MuZXhpdENvZGUgPSAxO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGxldCBoYXNJbnZhbGlkUGFja2FnZUNvbmZpZyA9IGZhbHNlO1xuICB0cnkge1xuICAgIGhhc0ludmFsaWRQYWNrYWdlQ29uZmlnID0gYXdhaXQgd2lsbGJvb3N0ZXJpZnlQYXRocyhhcmd2LnBhdGhzIGFzIHN0cmluZ1tdLCBhcmd2LnNraXBEZXBzLCBhcmd2LmZvcmNlKTtcbiAgfSBmaW5hbGx5IHtcbiAgICAvLyBUaGUgVHlwZVNjcmlwdCBjb21waWxlciBzZXJ2ZXIgc3Bhd25lZCBmb3IgQVNUIHBhcnNpbmcga2VlcHMgYW4gb3BlbiBJUENcbiAgICAvLyBjaGFubmVsIHRoYXQgd291bGQgb3RoZXJ3aXNlIHByZXZlbnQgdGhlIE5vZGUuanMgcHJvY2VzcyBmcm9tIGV4aXRpbmcuXG4gICAgYXdhaXQgZGlzcG9zZVR5cGVTY3JpcHRBcGkoKTtcbiAgfVxuICBpZiAoaGFzSW52YWxpZFBhY2thZ2VDb25maWcpIHtcbiAgICBwcm9jZXNzLmV4aXRDb2RlID0gMTtcbiAgfVxufVxuXG5hc3luYyBmdW5jdGlvbiB3aWxsYm9vc3RlcmlmeVBhdGhzKHBhdGhzOiBzdHJpbmdbXSwgc2tpcERlcHM6IGJvb2xlYW4sIGZvcmNlOiBib29sZWFuKTogUHJvbWlzZTxib29sZWFuPiB7XG4gIC8vIEJlZm9yZSBhbnl0aGluZyBlbHNlIOKAlCBldmVuIHRoZSBCdW4gY2hlY2sgYmVsb3c6IHRoZSBkZXZlbG9wZXIgbWFjaGluZSdzIGdsb2JhbFxuICAvLyBwYWNrYWdlLW1hbmFnZXIgY29uZmlncyBtdXN0IHJlY2VpdmUgdGhlIG9yZydzIG1pbmltdW0tcmVsZWFzZS1hZ2UgcG9saWN5IG9uIEVWRVJZIHJ1bixcbiAgLy8gYmVjYXVzZSB0aGV5IGFyZSB3aGF0IGd1YXJkcyBicmFuZC1uZXcgbG9jYWwgcHJvamVjdHMgdGhhdCBoYXZlIG5vIHdiZnktZ2VuZXJhdGVkIHJlcG9zaXRvcnlcbiAgLy8gY29uZmlnIHlldCwgYW5kIHRoYXQgcHJvdGVjdGlvbiBtdXN0IHdvcmsgYmVmb3JlIHRoZSBzdXBwb3J0ZWQtdmVyc2lvbiBjaGVjay5cbiAgZW5zdXJlR2xvYmFsUmVsZWFzZUFnZUdhdGVzKCk7XG5cbiAgLy8gd2JmeSBtYW5hZ2VzIHJlcG9zaXRvcmllcyB0aHJvdWdoIEJ1biArIG1pc2UgYW5kIHVzZXMgQnVuIDEuNCBydW50aW1lIEFQSXMuIFRoZSB2ZXJzaW9uIGZsb29yXG4gIC8vIGFsc28gZW5zdXJlcyB0aGUgZ2VuZXJhdGVkIGJ1bmZpZy50b21sIG9wdGlvbnMgcHJvZHVjZSB0aGUgaW5zdGFsbCBsYXlvdXQgd2JmeSB2YWxpZGF0ZXMuIEl0XG4gIC8vIHN0YXlzIHVuY29uZGl0aW9uYWwgZXZlbiB0aG91Z2ggdGhlIGFscmVhZHktYXBwbGllZCBjaGVjayBiZWxvdyBjYW4gbWFrZSBhIHJ1biBhIG5vLW9wOiBhblxuICAvLyBvdXRkYXRlZCBCdW4gaXMgYSBicm9rZW4gZW52aXJvbm1lbnQgd2JmeSBtdXN0IHJlcG9ydCwgYW5kIGhpZGluZyBpdCB3aGVuZXZlciBldmVyeSBwYXRoXG4gIC8vIGhhcHBlbnMgdG8gYmUgc2tpcHBlZCB3b3VsZCBzdXJmYWNlIGl0IG9ubHkgbGF0ZXIuXG4gIGNvbnN0IGJ1blZlcnNpb24gPSBCdW4udmVyc2lvbjtcbiAgaWYgKEJ1bi5zZW12ZXIub3JkZXIoYnVuVmVyc2lvbiwgbWluaW11bUJ1blZlcnNpb24pIDwgMCkge1xuICAgIGNvbnNvbGUuZXJyb3IoYHdiZnkgcmVxdWlyZXMgQnVuID49ICR7bWluaW11bUJ1blZlcnNpb259IChmb3VuZCAke2J1blZlcnNpb259KS4gVXBncmFkZSBCdW4gYW5kIHJlLXJ1bi5gKTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIC8vIEEgYC1kaXJ0eS1sb2NhbGAgbGFiZWwgaWRlbnRpZmllcyBhbiBlZGl0ZWQgY2hlY2tvdXQsIHdob3NlIG5leHQgYnVpbGQgcHJvZHVjZXMgZGlmZmVyZW50IGZpbGVzXG4gIC8vIHVuZGVyIHRoZSBzYW1lIGxhYmVsLCBzbyBzdWNoIGEgcnVuIGlzIG5ldmVyIHRyZWF0ZWQgYXMgYWxyZWFkeSBhcHBsaWVkLlxuICBjb25zdCB2ZXJzaW9uTGFiZWwgPSBnZXRXYmZ5VmVyc2lvbkxhYmVsKCk7XG4gIGNvbnN0IHNraXBwYWJsZVZlcnNpb25MYWJlbCA9XG4gICAgIWZvcmNlICYmIHZlcnNpb25MYWJlbCAmJiAhdmVyc2lvbkxhYmVsLmVuZHNXaXRoKCctZGlydHktbG9jYWwnKSA/IHZlcnNpb25MYWJlbCA6IHVuZGVmaW5lZDtcblxuICBsZXQgaGFzSW52YWxpZFBhY2thZ2VDb25maWcgPSBmYWxzZTtcbiAgZm9yIChjb25zdCBpbnB1dERpclBhdGggb2YgcGF0aHMpIHtcbiAgICAvLyBOb3JtYWxpemUgb25jZSBhdCB0aGUgQ0xJIGJvdW5kYXJ5LiBHZW5lcmF0b3JzIHVzZSBkaXJQYXRoIGZvciBjd2QgYW5kIGJhc2VuYW1lIGRlY2lzaW9ucztcbiAgICAvLyBsZWF2aW5nIHRoZSBzdXBwb3J0ZWQgZGVmYXVsdCBgLmAgdW5yZXNvbHZlZCB3b3VsZCBnZW5lcmF0ZSBhbiBpbnZhbGlkIHBhY2thZ2UgbmFtZSBvZiBgLmAuXG4gICAgY29uc3Qgcm9vdERpclBhdGggPSBwYXRoLnJlc29sdmUoaW5wdXREaXJQYXRoKTtcbiAgICAvLyBDb25maW5lIGV2ZXJ5IGdlbmVyYXRlZCBmaWxlIHRvIHRoaXMgcmVwb3NpdG9yeSAoc2VlIGZzVXRpbC5nZW5lcmF0ZUZpbGUpLiBTZXQgQkVGT1JFIGFueVxuICAgIC8vIGZpeGVyIHdyaXRlcywgYW5kIHJlc2V0IG9uIGV2ZXJ5IGl0ZXJhdGlvbiBzbyBhIG11bHRpLXBhdGggcnVuIG5ldmVyIGtlZXBzIHRoZSBwcmV2aW91cyByb290LlxuICAgIGZzVXRpbC5zZXRSb290RGlyUGF0aChmcy5leGlzdHNTeW5jKHJvb3REaXJQYXRoKSA/IHJvb3REaXJQYXRoIDogdW5kZWZpbmVkKTtcblxuICAgIC8vIEEgcmVwb3NpdG9yeSBwcmVjb25kaXRpb24sIGNoZWNrZWQgYmVmb3JlIHRoZSBhbHJlYWR5LWFwcGxpZWQgc2tpcCBiZWxvdyBhbmQgYmVmb3JlIGFueSBmaWxlXG4gICAgLy8gaXMgd3JpdHRlbjogYW4gdW5zdXBwb3J0ZWQgcGluIG11c3QgYmUgcmVwb3J0ZWQgb24gZXZlcnkgcnVuIGFuZCBtdXN0IG5vdCBzdGFtcCB0aGUgYmFkZ2UuXG4gICAgaWYgKCFoYXNTdXBwb3J0ZWRCdW5QaW4ocm9vdERpclBhdGgpKSB7XG4gICAgICBjb25zb2xlLmVycm9yKFxuICAgICAgICBgU2tpcCAke3Jvb3REaXJQYXRofTogbWlzZS50b21sIG11c3QgcGluIEJ1biB0byBvbmUgZXhhY3QgdmVyc2lvbiA+PSAke21pbmltdW1CdW5WZXJzaW9ufSBvciBvbWl0IGl0LiBVcGRhdGUgdGhlIHBpbiBhbmQgcmUtcnVuLmBcbiAgICAgICk7XG4gICAgICBoYXNJbnZhbGlkUGFja2FnZUNvbmZpZyA9IHRydWU7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICAvLyBUaGUgYmFkZ2UgcmVjb3JkcyB0aGUgYnVpbGQgdGhhdCBnZW5lcmF0ZWQgdGhlIHJlcG9zaXRvcnkncyBjb25maWd1cmF0aW9uLCBzbyB0aGUgc2FtZSBidWlsZFxuICAgIC8vIHdvdWxkIG9ubHkgcmV3cml0ZSB3aGF0IGlzIGFscmVhZHkgdGhlcmUuIFNraXBwaW5nIGlzIGEgZGVsaWJlcmF0ZSB0cmFkZTogdGhlIHBhcnRzIG9mIGEgcnVuXG4gICAgLy8gdGhhdCBkZXBlbmQgb24gc3RhdGUgT1VUU0lERSB0aGUgcmVwb3NpdG9yeSAoR2l0SHViIHNldHRpbmdzLCBkZXBlbmRlbmN5IHVwZGF0ZXMsIHRoZSBmZXRjaGVkXG4gICAgLy8gLmdpdGlnbm9yZSkgZG8gZ2V0IHNraXBwZWQgdG9vLCB3aGljaCBpcyB3aGF0IC0tZm9yY2UgaXMgZm9yLlxuICAgIGlmIChza2lwcGFibGVWZXJzaW9uTGFiZWwgJiYgKGF3YWl0IHJlYWRBcHBsaWVkV2JmeVZlcnNpb25MYWJlbChyb290RGlyUGF0aCkpID09PSBza2lwcGFibGVWZXJzaW9uTGFiZWwpIHtcbiAgICAgIGNvbnNvbGUuaW5mbyhgU2tpcCAke3Jvb3REaXJQYXRofTogd2JmeSAke3NraXBwYWJsZVZlcnNpb25MYWJlbH0gaXMgYWxyZWFkeSBhcHBsaWVkLiBQYXNzIC0tZm9yY2UgdG8gcmUtYXBwbHkuYCk7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgY29uc3QgcGFja2FnZXNEaXJQYXRoID0gcGF0aC5qb2luKHJvb3REaXJQYXRoLCAncGFja2FnZXMnKTtcbiAgICBjb25zdCBkaXJlbnRzID0gKGF3YWl0IGlnbm9yZUVycm9yQXN5bmMoKCkgPT4gZnMucHJvbWlzZXMucmVhZGRpcihwYWNrYWdlc0RpclBhdGgsIHsgd2l0aEZpbGVUeXBlczogdHJ1ZSB9KSkpID8/IFtdO1xuICAgIGNvbnN0IHBhY2thZ2VzU3ViRGlyUGF0aHMgPSBkaXJlbnRzXG4gICAgICAuZmlsdGVyKChkKSA9PiBkLmlzRGlyZWN0b3J5KCkpXG4gICAgICAubWFwKChkKSA9PiBwYXRoLnJlc29sdmUocGFja2FnZXNEaXJQYXRoLCBkLm5hbWUpKTtcbiAgICAvLyBBbHNvIGNvdmVyIHdvcmtzcGFjZXMgZGVjbGFyZWQgb3V0c2lkZSBwYWNrYWdlcy8qIChlLmcuIGFwcHMvKik6IHRoZXkgcmVjZWl2ZSB0aGUgc2FtZVxuICAgIC8vIG1hbmFnZWQgY29uZmlncyAodHNjb25maWcuanNvbiwgcGFja2FnZS5qc29uIGNvbnZlbnRpb25zLCDigKYpIGFzIHBhY2thZ2VzLyogY2hpbGRyZW4uXG4gICAgY29uc3Qgcm9vdFBhY2thZ2VKc29uID1cbiAgICAgIGlnbm9yZUVycm9yKFxuICAgICAgICAoKSA9PlxuICAgICAgICAgIEpTT04ucGFyc2UoZnMucmVhZEZpbGVTeW5jKHBhdGgucmVzb2x2ZShyb290RGlyUGF0aCwgJ3BhY2thZ2UuanNvbicpLCAndXRmOCcpKSBhcyBQYWNrYWdlQ29uZmlnWydwYWNrYWdlSnNvbiddXG4gICAgICApID8/IHt9O1xuICAgIGNvbnN0IHdvcmtzcGFjZVN1YkRpclBhdGhzID0gZ2V0V29ya3NwYWNlU3ViRGlyUGF0aHMoe1xuICAgICAgZGlyUGF0aDogcm9vdERpclBhdGgsXG4gICAgICBwYWNrYWdlSnNvbjogcm9vdFBhY2thZ2VKc29uLFxuICAgICAgZG9lc0NvbnRhaW5TdWJQYWNrYWdlSnNvbnM6IHBhY2thZ2VzU3ViRGlyUGF0aHMuc29tZSgoc3ViRGlyUGF0aCkgPT5cbiAgICAgICAgZnMuZXhpc3RzU3luYyhwYXRoLnJlc29sdmUoc3ViRGlyUGF0aCwgJ3BhY2thZ2UuanNvbicpKVxuICAgICAgKSxcbiAgICB9KTtcbiAgICBjb25zdCBzdWJEaXJQYXRocyA9IFsuLi5uZXcgU2V0KFsuLi5wYWNrYWdlc1N1YkRpclBhdGhzLCAuLi53b3Jrc3BhY2VTdWJEaXJQYXRoc10pXS5maWx0ZXIoXG4gICAgICAoc3ViRGlyUGF0aCkgPT4gc3ViRGlyUGF0aCAhPT0gcGF0aC5yZXNvbHZlKHJvb3REaXJQYXRoKVxuICAgICk7XG5cbiAgICAvLyBSZWZ1c2VkIHdyaXRlcyBvbiBjb3JlIG1hbmFnZWQgZmlsZXMgd291bGQgbGVhdmUgdGhlIHJlcG9zaXRvcnkgcGFydGlhbGx5IHVwZGF0ZWQsIHNvIHNraXBcbiAgICAvLyBpdCBCRUZPUkUgYW55IG11dGF0aW9uIHdoZW4gb25lIG9mIHRoZW0gaXMgYSBzeW1saW5rIG9yIHJlc29sdmVzIG91dHNpZGUgdGhlIHJlcG9zaXRvcnkuXG4gICAgY29uc3QgbWFuYWdlZEZpbGVQYXRocyA9IFtcbiAgICAgIC4uLlsnLmdpdGF0dHJpYnV0ZXMnLCAnYnVuZmlnLnRvbWwnLCAnbGVmdGhvb2sueW1sJywgJ3BhY2thZ2UuanNvbicsICd0c2NvbmZpZy5qc29uJ10ubWFwKChuYW1lKSA9PlxuICAgICAgICBwYXRoLnJlc29sdmUocm9vdERpclBhdGgsIG5hbWUpXG4gICAgICApLFxuICAgICAgLi4uc3ViRGlyUGF0aHMuZmxhdE1hcCgoc3ViRGlyUGF0aCkgPT5cbiAgICAgICAgWydwYWNrYWdlLmpzb24nLCAndHNjb25maWcuanNvbiddLm1hcCgobmFtZSkgPT4gcGF0aC5yZXNvbHZlKHN1YkRpclBhdGgsIG5hbWUpKVxuICAgICAgKSxcbiAgICBdO1xuICAgIGNvbnN0IHdyaXRhYmxlUmVzdWx0cyA9IGF3YWl0IFByb21pc2UuYWxsKFxuICAgICAgbWFuYWdlZEZpbGVQYXRocy5tYXAoKGZpbGVQYXRoKSA9PiBmc1V0aWwuaXNDb25maW5lZFdyaXRhYmxlUGF0aChmaWxlUGF0aCkpXG4gICAgKTtcbiAgICBpZiAod3JpdGFibGVSZXN1bHRzLmluY2x1ZGVzKGZhbHNlKSkge1xuICAgICAgY29uc29sZS5lcnJvcihgU2tpcCAke3Jvb3REaXJQYXRofTogYSBtYW5hZ2VkIGNvbmZpZyBmaWxlIGlzIGEgc3ltbGluayBvciByZXNvbHZlcyBvdXRzaWRlIHRoZSByZXBvc2l0b3J5LmApO1xuICAgICAgaGFzSW52YWxpZFBhY2thZ2VDb25maWcgPSB0cnVlO1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgY29uc3QgcHJlZmxpZ2h0RXJyb3JzID0gW3Jvb3REaXJQYXRoLCAuLi5zdWJEaXJQYXRoc10uZmxhdE1hcCgoZGlyUGF0aCkgPT4ge1xuICAgICAgY29uc3QgcGFja2FnZUpzb25QYXRoID0gcGF0aC5yZXNvbHZlKGRpclBhdGgsICdwYWNrYWdlLmpzb24nKTtcbiAgICAgIGlmICghZnMuZXhpc3RzU3luYyhwYWNrYWdlSnNvblBhdGgpKSByZXR1cm4gW107XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBwYWNrYWdlSnNvbiA9IEpTT04ucGFyc2UoZnMucmVhZEZpbGVTeW5jKHBhY2thZ2VKc29uUGF0aCwgJ3V0ZjgnKSkgYXMgUGFja2FnZUNvbmZpZ1sncGFja2FnZUpzb24nXTtcbiAgICAgICAgY29uc3QgZXJyb3IgPSBnZXRXb3JrZXJUeXBlc1NjcmlwdEVycm9yKHsgcGFja2FnZUpzb24gfSk7XG4gICAgICAgIHJldHVybiBlcnJvciA/IFtgJHtkaXJQYXRofTogJHtlcnJvcn1gXSA6IFtdO1xuICAgICAgfSBjYXRjaCB7XG4gICAgICAgIHJldHVybiBbYCR7cGFja2FnZUpzb25QYXRofSBpcyBpbnZhbGlkYF07XG4gICAgICB9XG4gICAgfSk7XG4gICAgaWYgKHByZWZsaWdodEVycm9ycy5sZW5ndGggPiAwKSB7XG4gICAgICBjb25zb2xlLmVycm9yKGBTa2lwICR7cm9vdERpclBhdGh9OlxcbiR7cHJlZmxpZ2h0RXJyb3JzLmpvaW4oJ1xcbicpfWApO1xuICAgICAgaGFzSW52YWxpZFBhY2thZ2VDb25maWcgPSB0cnVlO1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgLy8gTGV0IGdldFBhY2thZ2VDb25maWcgZGVyaXZlIGlzUm9vdCBmb3IgdGhlIGVudHJ5IHBhdGg6IGB3YmZ5IDxyZXBvPi9wYWNrYWdlcy88YXBwPmAgaXMgYVxuICAgIC8vIHN1cHBvcnRlZCBpbnZvY2F0aW9uIHdob3NlIHRhcmdldCBtdXN0IGtlZXAgaXRzIGNoaWxkIGNsYXNzaWZpY2F0aW9uLCBzbyBmb3JjaW5nXG4gICAgLy8gYGlzUm9vdDogdHJ1ZWAgaGVyZSB3b3VsZCBhcHBseSByb290LW9ubHkgcHJvY2Vzc2luZyAobGVmdGhvb2sgaW5zdGFsbCwgcm9vdCB0c2NvbmZpZyxcbiAgICAvLyBBR0VOVFMubWQsIOKApikgdG8gYSBzdWJwYWNrYWdlLlxuICAgIGNvbnN0IHJvb3RDb25maWcgPSBhd2FpdCBnZXRQYWNrYWdlQ29uZmlnKHJvb3REaXJQYXRoKTtcbiAgICBpZiAob3B0aW9ucy5pc1ZlcmJvc2UpIHtcbiAgICAgIGNvbnNvbGUubG9nKCdyb290Q29uZmlnOicsIHJvb3RDb25maWcpO1xuICAgIH1cbiAgICBpZiAoIXJvb3RDb25maWcpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoYHRoZXJlIGlzIG5vIHZhbGlkIHBhY2thZ2UuanNvbiBpbiAke3Jvb3REaXJQYXRofWApO1xuICAgICAgaGFzSW52YWxpZFBhY2thZ2VDb25maWcgPSB0cnVlO1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIC8vIEV2ZXJ5IGRpc2NvdmVyZWQgd29ya3NwYWNlIChpbmNsdWRpbmcgbm9uLXBhY2thZ2VzLyogbGF5b3V0cyBzdWNoIGFzIGFwcHMvKikgaXMgYSBjaGlsZFxuICAgIC8vIHBhY2thZ2U7IHRoZSBwYWNrYWdlcy8qIGhldXJpc3RpYyBpbnNpZGUgZ2V0UGFja2FnZUNvbmZpZyB3b3VsZCBtaXNjbGFzc2lmeSBhcHBzLyogYXMgcm9vdHMuXG4gICAgY29uc3QgbnVsbGFibGVTdWJQYWNrYWdlQ29uZmlncyA9IGF3YWl0IFByb21pc2UuYWxsKFxuICAgICAgc3ViRGlyUGF0aHMubWFwKChzdWJEaXJQYXRoKSA9PiBnZXRQYWNrYWdlQ29uZmlnKHN1YkRpclBhdGgsIHsgaXNSb290OiBmYWxzZSB9KSlcbiAgICApO1xuICAgIGNvbnN0IGludmFsaWRTdWJQYWNrYWdlRGlyUGF0aCA9IHN1YkRpclBhdGhzLmZpbmQoXG4gICAgICAoc3ViRGlyUGF0aCwgaW5kZXgpID0+ICFudWxsYWJsZVN1YlBhY2thZ2VDb25maWdzW2luZGV4XSAmJiBmcy5leGlzdHNTeW5jKHBhdGguam9pbihzdWJEaXJQYXRoLCAncGFja2FnZS5qc29uJykpXG4gICAgKTtcbiAgICBpZiAoaW52YWxpZFN1YlBhY2thZ2VEaXJQYXRoKSB7XG4gICAgICBjb25zb2xlLmVycm9yKGBTa2lwICR7cm9vdERpclBhdGh9OiAke2ludmFsaWRTdWJQYWNrYWdlRGlyUGF0aH0vcGFja2FnZS5qc29uIGlzIGludmFsaWQuYCk7XG4gICAgICBoYXNJbnZhbGlkUGFja2FnZUNvbmZpZyA9IHRydWU7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgY29uc3Qgc3ViUGFja2FnZUNvbmZpZ3MgPSBudWxsYWJsZVN1YlBhY2thZ2VDb25maWdzLmZpbHRlcigoY29uZmlnKSA9PiAhIWNvbmZpZyk7XG4gICAgY29uc3QgYWxsUGFja2FnZUNvbmZpZ3MgPSBbcm9vdENvbmZpZywgLi4uc3ViUGFja2FnZUNvbmZpZ3NdO1xuICAgIC8vIFRoZSBtYW5hZ2VkIGlnbm9yZSBydWxlIGlzIHVuYW5jaG9yZWQsIHNvIGEgbmVzdGVkIGNvcHkgKGUuZy4gd29ya2Vycy9hcGkvLmVudi5jbG91ZGZsYXJlKSBpc1xuICAgIC8vIGFzIG11Y2ggYSBsZWFrIGFzIGEgcm9vdCBvbmU7IHRoZSB3aWxkY2FyZCBwYXRoc3BlYyBjb3ZlcnMgZXZlcnkgZGVwdGggaW4gb25lIHF1ZXJ5LlxuICAgIGNvbnN0IHRyYWNrZWRDbG91ZGZsYXJlRW52UGF0aHMgPSBhbGxQYWNrYWdlQ29uZmlncy5zb21lKChjb25maWcpID0+IGNvbmZpZy5pc0Nsb3VkZmxhcmUpXG4gICAgICA/IHNwYXduU3luY0FuZFJldHVyblN0ZG91dChcbiAgICAgICAgICAnZ2l0JyxcbiAgICAgICAgICBbJy1jJywgJ2NvcmUucXVvdGVQYXRoPWZhbHNlJywgJ2xzLWZpbGVzJywgJy0tJywgJy5lbnYuY2xvdWRmbGFyZScsICcqLy5lbnYuY2xvdWRmbGFyZSddLFxuICAgICAgICAgIHJvb3RDb25maWcuZGlyUGF0aFxuICAgICAgICApXG4gICAgICAgICAgLnNwbGl0KCdcXG4nKVxuICAgICAgICAgIC5maWx0ZXIoQm9vbGVhbilcbiAgICAgICAgICAubWFwKChmaWxlUGF0aCkgPT4gcGF0aC5yZXNvbHZlKHJvb3RDb25maWcuZGlyUGF0aCwgZmlsZVBhdGgpKVxuICAgICAgOiBbXTtcbiAgICBpZiAodHJhY2tlZENsb3VkZmxhcmVFbnZQYXRocy5sZW5ndGggPiAwKSB7XG4gICAgICBjb25zb2xlLmVycm9yKFxuICAgICAgICBgU0VDVVJJVFkgRVJST1I6IENsb3VkZmxhcmUgY3JlZGVudGlhbHMgbXVzdCBiZSB1bnRyYWNrZWQuIFJlbW92ZSAke3RyYWNrZWRDbG91ZGZsYXJlRW52UGF0aHMuam9pbihcbiAgICAgICAgICAnLCAnXG4gICAgICAgICl9IGZyb20gR2l0LCBwdXJnZSB0aGUgdG9rZW4gZnJvbSBoaXN0b3J5LCBhbmQgcm90YXRlIENMT1VERkxBUkVfQVBJX1RPS0VOIGJlZm9yZSByZXJ1bm5pbmcgd2JmeS5gXG4gICAgICApO1xuICAgICAgaGFzSW52YWxpZFBhY2thZ2VDb25maWcgPSB0cnVlO1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGNvbnN0IGFiYnJldmlhdGlvblByb21pc2UgPSBmaXhUeXBvcyhyb290Q29uZmlnKTtcblxuICAgIGF3YWl0IGdlbmVyYXRlUmVwb3NpdG9yeU5wbXJjKGFsbFBhY2thZ2VDb25maWdzKTtcblxuICAgIGlmIChvcHRpb25zLmlzVmVyYm9zZSkge1xuICAgICAgZm9yIChjb25zdCBjb25maWcgb2YgYWxsUGFja2FnZUNvbmZpZ3MpIHtcbiAgICAgICAgY29uc29sZS5pbmZvKGNvbmZpZyk7XG4gICAgICB9XG4gICAgfVxuICAgIGFzc2VydFNhZmVEZXBlbmRlbmN5U291cmNlcyhhbGxQYWNrYWdlQ29uZmlncyk7XG4gICAgLy8gTWFuYWdlZCByZXBvc2l0b3JpZXMgdXNlIEJ1biB3aXRoIG1pc2UgKGFuZCBvcHRpb25hbGx5IGZub3gpLlxuICAgIGNvbnN0IHByZXZpb3VzQnVuR2xvYmFsU3RvcmUgPSByZWFkQnVuR2xvYmFsU3RvcmUocm9vdERpclBhdGgpO1xuICAgIC8vIFJvb3QtbGV2ZWwgaW5zdGFsbCBsYXlvdXQgbXVzdCBjb3ZlciB3b3Jrc3BhY2UgYXBwcyB0b286IE5leHQuanMgY29tbW9ubHkgbGl2ZXMgdW5kZXJcbiAgICAvLyBwYWNrYWdlcy8qIG9yIGFwcHMvKiB3aGlsZSBidW5maWcudG9tbCBleGlzdHMgb25seSBhdCB0aGUgcmVwb3NpdG9yeSByb290LlxuICAgIGNvbnN0IHVzZUdsb2JhbFN0b3JlID0gcmVzb2x2ZUJ1bkdsb2JhbFN0b3JlKGFsbFBhY2thZ2VDb25maWdzLCBwcmV2aW91c0J1bkdsb2JhbFN0b3JlLCBza2lwRGVwcyk7XG4gICAgYXdhaXQgZ2VuZXJhdGVCdW5maWdUb21sKHJvb3RDb25maWcsIHVzZUdsb2JhbFN0b3JlKTtcbiAgICBhd2FpdCBnZW5lcmF0ZU1pc2VUb21sKHJvb3RDb25maWcpO1xuICAgIGF3YWl0IGdlbmVyYXRlRm5veFRvbWwocm9vdENvbmZpZyk7XG4gICAgLy8gUnVuIGFmdGVyIGdlbmVyYXRlRm5veFRvbWwgc28gaXRzIHRyYW5zYWN0aW9uYWwgcmVjaXBpZW50IHN5bmMgY2Fubm90IHJlc3RvcmUgYSBzbmFwc2hvdFxuICAgIC8vIG92ZXIgZGVmaW5pdGlvbnMgaW5zZXJ0ZWQgaGVyZS5cbiAgICBhd2FpdCBlbnN1cmVXYkVudkRlZmluaXRpb25zKHJvb3RDb25maWcsIGFsbFBhY2thZ2VDb25maWdzKTtcbiAgICAvLyBwcm9taXNlUG9vbC5ydW4gcmVzb2x2ZXMgd2hlbiBhIHRhc2sgU1RBUlRTLCBzbyB0aGUgZ2VuZXJhdGVkIGJ1bmZpZy50b21sIGlzIG5vdFxuICAgIC8vIGd1YXJhbnRlZWQgdG8gYmUgb24gZGlzayB5ZXQ7IHRoZSBwcm9iZSBiZWxvdyBtdXN0IG5vdCB2YWxpZGF0ZSBhIHN0YWxlIGNvbmZpZ3VyYXRpb24uXG4gICAgYXdhaXQgcHJvbWlzZVBvb2wucHJvbWlzZUFsbCgpO1xuXG4gICAgLy8gVGhlIGxheW91dCBtdXN0IGJlIHZlcmlmaWVkIGluc3RhbGxhYmxlIEJFRk9SRSBhbnkgYGJ1biBhZGRgIG11dGF0ZXMgcGFja2FnZS5qc29uIGZpbGVzOlxuICAgIC8vIHBlci1wYWNrYWdlIGluc3RhbGxzIHRvbGVyYXRlIGZhaWx1cmVzIChzcGF3blN5bmMgZGlzY2FyZHMgdGhlaXIgc3RhdHVzKSwgc28gYSBsYXlvdXQgdGhhdFxuICAgIC8vIGNhbm5vdCBpbnN0YWxsIHdvdWxkIHNpbGVudGx5IGRyb3AgZXZlcnkgbWFuYWdlZCBkZXBlbmRlbmN5IHVwZGF0ZSBmb3IgdGhlIHJlc3Qgb2YgdGhlIHJ1bi5cbiAgICAvLyBBIGRvY3Mtb25seSByZXBvc2l0b3J5IGhhcyBubyBtYW5pZmVzdCB0byBwcm9iZSBvbiBpdHMgZmlyc3QgcnVuOyBnZW5lcmF0ZVBhY2thZ2VKc29uIGJlbG93XG4gICAgLy8gY3JlYXRlcyBpdCBiZWZvcmUgdGhlIGF1dGhvcml0YXRpdmUgcmVmcmVzaEJ1bkxvY2sgY2hlY2suXG4gICAgaWYgKFxuICAgICAgIXNraXBEZXBzICYmXG4gICAgICByb290Q29uZmlnLmRvZXNDb250YWluUGFja2FnZUpzb24gJiZcbiAgICAgICFwcm9iZUlzb2xhdGVkQnVuSW5zdGFsbChyb290RGlyUGF0aCwgcm9vdENvbmZpZywgcHJldmlvdXNCdW5HbG9iYWxTdG9yZSwgdXNlR2xvYmFsU3RvcmUpXG4gICAgKSB7XG4gICAgICAvLyByZWZyZXNoQnVuTG9jayBiZWxvdyBpcyB0aGUgYXV0aG9yaXR5IG9uIHdoZXRoZXIgdGhlIGZpbmFsIGluc3RhbGwgZmFpbGVkLlxuICAgICAgY29uc29sZS53YXJuKGBidW4gaW5zdGFsbCBjdXJyZW50bHkgZmFpbHMgaW4gJHtyb290RGlyUGF0aH0gdW5kZXIgdGhlIGlzb2xhdGVkIGxpbmtlci5gKTtcbiAgICB9XG5cbiAgICBjb25zdCBzaG91bGRSdW5Xb3JrZmxvd3MgPVxuICAgICAgIWlzUmV1c2FibGVXb3JrZmxvd3NSZXBvKHJvb3RDb25maWcucmVwb3NpdG9yeSkgJiZcbiAgICAgIChyb290Q29uZmlnLnJlcG9zaXRvcnk/LnN0YXJ0c1dpdGgoJ2dpdGh1YjpXaWxsQm9vc3Rlci8nKSB8fFxuICAgICAgICByb290Q29uZmlnLnJlcG9zaXRvcnk/LnN0YXJ0c1dpdGgoJ2dpdGh1YjpXaWxsQm9vc3RlckxhYi8nKSk7XG4gICAgLy8gT3RoZXIgb3duZXJzIGNhbm5vdCBjYWxsIHRoZSBvcmdhbml6YXRpb24ncyByZXVzYWJsZSB3b3JrZmxvd3MgKHRoZWlyIHNlY3JldHMgYW5kIHJ1bm5lcnNcbiAgICAvLyBkbyBub3QgZXhpc3QgdGhlcmUpLCBzbyBhbnkgb3RoZXIgR2l0SHViLWhvc3RlZCBOb2RlLmpzIHJlcG9zaXRvcnkgZ2V0cyBzZWxmLWNvbnRhaW5lZFxuICAgIC8vIHdvcmtmbG93cyBpbnN0ZWFkIOKAlCBrZXllZCBvbiByZXBvc2l0b3J5IHN0YXRlLCBuZXZlciBvbiB0aGUgb3duZXIncyBpZGVudGl0eS5cbiAgICAvLyByb290Q29uZmlnLmlzUm9vdDogYSBkaXJlY3Qgd29ya3NwYWNlLWNoaWxkIGludm9jYXRpb24gKGB3YmZ5IDxyZXBvPi9wYWNrYWdlcy88YXBwPmApIGtlZXBzXG4gICAgLy8gaXNSb290IGZhbHNlLCBhbmQgR2l0SHViIGlnbm9yZXMgd29ya2Zsb3cgZmlsZXMgbmVzdGVkIHVuZGVyIGEgcGFja2FnZSBkaXJlY3RvcnkuXG4gICAgY29uc3Qgc2hvdWxkUnVuU2VsZkNvbnRhaW5lZFdvcmtmbG93cyA9XG4gICAgICAhc2hvdWxkUnVuV29ya2Zsb3dzICYmXG4gICAgICAhaXNSZXVzYWJsZVdvcmtmbG93c1JlcG8ocm9vdENvbmZpZy5yZXBvc2l0b3J5KSAmJlxuICAgICAgISFyb290Q29uZmlnLnJlcG9zaXRvcnk/LnN0YXJ0c1dpdGgoJ2dpdGh1YjonKSAmJlxuICAgICAgcm9vdENvbmZpZy5pc1Jvb3Q7XG4gICAgYXdhaXQgUHJvbWlzZS5hbGwoW1xuICAgICAgYWJicmV2aWF0aW9uUHJvbWlzZS50aGVuKCgpID0+IGdlbmVyYXRlUmVhZG1lKHJvb3RDb25maWcpKSxcbiAgICAgIGdlbmVyYXRlRG9ja2VyaWdub3JlKHJvb3RDb25maWcpLFxuICAgICAgZ2VuZXJhdGVFZGl0b3Jjb25maWcocm9vdENvbmZpZyksXG4gICAgICBnZW5lcmF0ZUdlbWluaUNvbmZpZyhyb290Q29uZmlnLCBhbGxQYWNrYWdlQ29uZmlncyksXG4gICAgICBnZW5lcmF0ZUdpdGF0dHJpYnV0ZXMocm9vdENvbmZpZyksXG4gICAgICBnZW5lcmF0ZUdpdEh1YlRlbXBsYXRlcyhyb290Q29uZmlnKSxcbiAgICAgIGdlbmVyYXRlSWRlYVNldHRpbmdzKHJvb3RDb25maWcpLFxuICAgICAgZml4UmFpbHdheWlnbm9yZShyb290Q29uZmlnKSxcbiAgICAgIGdlbmVyYXRlUmVub3ZhdGVKc29uYyhyb290Q29uZmlnKSxcbiAgICAgIGdlbmVyYXRlUmVsZWFzZXJjKHJvb3RDb25maWcpLFxuICAgICAgLi4uKHNob3VsZFJ1bldvcmtmbG93cyA/IFtnZW5lcmF0ZVdvcmtmbG93cyhyb290Q29uZmlnKV0gOiBbXSksXG4gICAgICAuLi4oc2hvdWxkUnVuU2VsZkNvbnRhaW5lZFdvcmtmbG93cyA/IFtnZW5lcmF0ZVNlbGZDb250YWluZWRXb3JrZmxvd3Mocm9vdENvbmZpZywgYWxsUGFja2FnZUNvbmZpZ3MpXSA6IFtdKSxcbiAgICAgIHNldHVwTGFiZWxzKHJvb3RDb25maWcpLFxuICAgICAgc2V0dXBSZXBvc2l0b3J5UnVsZXNldHMocm9vdENvbmZpZyksXG4gICAgICBzZXR1cEdpdEh1YlNldHRpbmdzKHJvb3RDb25maWcpLFxuICAgICAgLy8gR2l0IGhvb2tzIGFyZSByZXBvc2l0b3J5LWxldmVsIHN0YXRlOiBhIGRpcmVjdCB3b3Jrc3BhY2UtY2hpbGQgaW52b2NhdGlvbiBtdXN0IG5vdCB3cml0ZSBhXG4gICAgICAvLyBjaGlsZCBsZWZ0aG9vay55bWwgb3IgcmVwbGFjZSB0aGUgZW5jbG9zaW5nIHJlcG9zaXRvcnkncyBob29rIGluc3RhbGxhdGlvbi5cbiAgICAgIC4uLihyb290Q29uZmlnLmlzUm9vdCA/IFtnZW5lcmF0ZUxlZnRob29rKHJvb3RDb25maWcsIGFsbFBhY2thZ2VDb25maWdzKV0gOiBbXSksXG4gICAgXSk7XG4gICAgYXdhaXQgcHJvbWlzZVBvb2wucHJvbWlzZUFsbCgpO1xuICAgIC8vIEFmdGVyIHRoZSB3b3JrZmxvdyBnZW5lcmF0b3IgKGFuZCBpdHMgcG9vbGVkIHdyaXRlcykgc28gdGhlIGluc3RydWN0aW9uIGZpbGVzIGRlc2NyaWJlIHRoZVxuICAgIC8vIGZpbmFsaXplZCB3b3JrZmxvdyBmaWxlcyBpbnN0ZWFkIG9mIGxhZ2dpbmcgb25lIHJ1biBiZWhpbmQuXG4gICAgYXdhaXQgZ2VuZXJhdGVBZ2VudEluc3RydWN0aW9ucyhyb290Q29uZmlnLCBhbGxQYWNrYWdlQ29uZmlncyk7XG4gICAgYXdhaXQgcHJvbWlzZVBvb2wucHJvbWlzZUFsbCgpO1xuXG4gICAgY29uc3QgcHJvbWlzZXM6IFByb21pc2U8dm9pZD5bXSA9IFtdO1xuICAgIGZvciAoY29uc3QgY29uZmlnIG9mIGFsbFBhY2thZ2VDb25maWdzKSB7XG4gICAgICBpZiAoY29uZmlnLmRlcGVuZGluZy5wbGF5d3JpZ2h0VGVzdCkge1xuICAgICAgICBwcm9taXNlcy5wdXNoKGZpeFBsYXl3cmlnaHRDb25maWcoY29uZmlnKSk7XG4gICAgICB9XG4gICAgICBpZiAoY29uZmlnLmRlcGVuZGluZy5uZXh0KSB7XG4gICAgICAgIHByb21pc2VzLnB1c2goZml4TmV4dENvbmZpZ0pzb24oY29uZmlnKSk7XG4gICAgICB9XG4gICAgICBpZiAoY29uZmlnLmRlcGVuZGluZy5jaGFrcmEpIHtcbiAgICAgICAgcHJvbWlzZXMucHVzaChmaXhDaGFrcmFUb2FzdGVyKGNvbmZpZykpO1xuICAgICAgfVxuICAgICAgYXdhaXQgZ2VuZXJhdGVHaXRpZ25vcmUoY29uZmlnLCByb290Q29uZmlnKTtcbiAgICAgIGF3YWl0IHByb21pc2VQb29sLnByb21pc2VBbGwoKTtcbiAgICAgIGlmICghY29uZmlnLmlzUm9vdCAmJiAhY29uZmlnLmRvZXNDb250YWluUGFja2FnZUpzb24pIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBpZiAoZG9lc0NvbnRhaW5KYXZhKGNvbmZpZykpIGF3YWl0IGdlbmVyYXRlUHJldHRpZXJpZ25vcmUoY29uZmlnKTtcbiAgICAgIGF3YWl0IGdlbmVyYXRlUGFja2FnZUpzb24oY29uZmlnLCByb290Q29uZmlnLCBza2lwRGVwcyk7XG5cbiAgICAgIGlmIChjb25maWcuZG9lc0NvbnRhaW5Wc2NvZGVTZXR0aW5nc0pzb24pIHtcbiAgICAgICAgcHJvbWlzZXMucHVzaChnZW5lcmF0ZVZzY29kZVNldHRpbmdzKGNvbmZpZykpO1xuICAgICAgfVxuICAgICAgaWYgKGNvbmZpZy5kb2VzQ29udGFpblR5cGVTY3JpcHQgfHwgY29uZmlnLmRvZXNDb250YWluVHlwZVNjcmlwdEluUGFja2FnZXMpIHtcbiAgICAgICAgcHJvbWlzZXMucHVzaChnZW5lcmF0ZVRzY29uZmlnKGNvbmZpZykpO1xuICAgICAgfVxuICAgICAgaWYgKGRvZXNDb250YWluSnNPclRzKGNvbmZpZykpIHtcbiAgICAgICAgcHJvbWlzZXMucHVzaChnZW5lcmF0ZU94Zm10Q29uZmlnKGNvbmZpZykpO1xuICAgICAgICBwcm9taXNlcy5wdXNoKGdlbmVyYXRlT3hsaW50Q29uZmlnKGNvbmZpZywgcm9vdENvbmZpZykpO1xuICAgICAgfSBlbHNlIGlmICghY29uZmlnLmlzUm9vdCAmJiBjb25maWcuZG9lc0NvbnRhaW5QYWNrYWdlSnNvbiAmJiBkb2VzQ29udGFpbkpzT3JUcyhyb290Q29uZmlnKSkge1xuICAgICAgICAvLyBNb25vcmVwbyB2ZXJpZmljYXRpb24gY2FuIGludm9rZSBveGxpbnQgZnJvbSBldmVyeSB3b3Jrc3BhY2UuIEdpdmVcbiAgICAgICAgLy8gbm9uLWNvZGUgcGFja2FnZXMgYSBsb2NhbCBjb25maWcgc28gb3hsaW50IGRvZXMgbm90IGNsaW1iIHRvIHRoZVxuICAgICAgICAvLyByb290IGNvbmZpZyBhbmQgcmVqZWN0IHJvb3Qtb25seSB0eXBlLWF3YXJlIG9wdGlvbnMgZnJvbSBhIHBhY2thZ2UgY3dkLlxuICAgICAgICBwcm9taXNlcy5wdXNoKGdlbmVyYXRlT3hsaW50Q29uZmlnKGNvbmZpZywgcm9vdENvbmZpZykpO1xuICAgICAgfVxuICAgICAgaWYgKGNvbmZpZy5kZXBlbmRpbmcucHlyaWdodCkge1xuICAgICAgICBwcm9taXNlcy5wdXNoKGdlbmVyYXRlUHlyaWdodENvbmZpZ0pzb24oY29uZmlnKSk7XG4gICAgICB9XG4gICAgfVxuICAgIGF3YWl0IFByb21pc2UuYWxsKHByb21pc2VzKTtcbiAgICBhd2FpdCBwcm9taXNlUG9vbC5wcm9taXNlQWxsKCk7XG4gICAgLy8gUnVuIGFmdGVyIGV2ZXJ5IHBvb2xlZCBnZW5lcmF0b3Igd3JpdGUgc28gbm9ybWFsaXphdGlvbiBjYW5ub3Qgb3ZlcndyaXRlIGEgY29uY3VycmVudFxuICAgIC8vIHVwZGF0ZSwgYW5kIGJlZm9yZSBjbGVhbnVwIHNvIGZvcm1hdHRlciBtZXRhZGF0YSBjYWNoZXMgb2JzZXJ2ZSB0aGUgY2hhbmdlZCBmaWxlcy5cbiAgICByZW5vcm1hbGl6ZVRyYWNrZWRUZXh0RmlsZXMocm9vdERpclBhdGgpO1xuICAgIC8vIFJlZnJlc2ggbG9jayBmaWxlc1xuICAgIHRyeSB7XG4gICAgICByZWZyZXNoQnVuTG9jayhyb290RGlyUGF0aCk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIC8vIEEgZmFpbGVkIGluc3RhbGwgbXVzdCBmYWlsIHRoZSBDTEk6IGV4aXRpbmcgMCB3aXRoIGEgc3RhbGUgb3IgbWlzc2luZyBCdW4gbG9ja2ZpbGUgd291bGRcbiAgICAgIC8vIGhpZGUgYSBicm9rZW4gbWFuYWdlZCBjb25maWd1cmF0aW9uLlxuICAgICAgY29uc29sZS5lcnJvcignRmFpbGVkIHRvIHJlZnJlc2ggdGhlIEJ1biBsb2NrZmlsZTonLCAoZXJyb3IgYXMgRXJyb3IgfCB1bmRlZmluZWQpPy5tZXNzYWdlID8/IGVycm9yKTtcbiAgICAgIGhhc0ludmFsaWRQYWNrYWdlQ29uZmlnID0gdHJ1ZTtcbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgIC8vIEJ1biB3cml0ZXMgYnVuLmxvY2sgYmVmb3JlIGxpZmVjeWNsZSBzY3JpcHRzLCBzbyBhIGZhaWxlZCBpbnN0YWxsIGNhbiBzdGlsbCBsZWF2ZSBHdWFyZFxuICAgICAgLy8gVVJMcyBiZWhpbmQuIE5vcm1hbGl6ZSBib3RoIHN1Y2Nlc3MgYW5kIGZhaWx1cmUgb3V0cHV0IHdpdGhvdXQgcmVwbGFjaW5nIHRoZSBpbnN0YWxsIGVycm9yLlxuICAgICAgY29uc3Qgbm9ybWFsaXplZExvY2tmaWxlUGF0aCA9IG5vcm1hbGl6ZUJ1bkxvY2tmaWxlKHJvb3REaXJQYXRoKTtcbiAgICAgIGlmIChub3JtYWxpemVkTG9ja2ZpbGVQYXRoKSB7XG4gICAgICAgIGNvbnNvbGUuaW5mbyhgUmVtb3ZlZCBUYWt1bWkgR3VhcmQgcHJveHkgVVJMcyBmcm9tICR7bm9ybWFsaXplZExvY2tmaWxlUGF0aH0gdG8ga2VlcCBpdCByZWdpc3RyeS1hZ25vc3RpYy5gKTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgY29uc29sZS5lcnJvcignRmFpbGVkIHRvIG5vcm1hbGl6ZSB0aGUgQnVuIGxvY2tmaWxlOicsIChlcnJvciBhcyBFcnJvciB8IHVuZGVmaW5lZCk/Lm1lc3NhZ2UgPz8gZXJyb3IpO1xuICAgICAgaGFzSW52YWxpZFBhY2thZ2VDb25maWcgPSB0cnVlO1xuICAgIH1cbiAgICBzcGF3blN5bmMoJ2J1bicsIFsnY2xlYW51cCddLCByb290RGlyUGF0aCk7XG4gIH1cbiAgcmV0dXJuIGhhc0ludmFsaWRQYWNrYWdlQ29uZmlnO1xufVxuXG4vKipcbiAqIFByb2JlcyBgYnVuIGluc3RhbGxgIHVuZGVyIHRoZSBpc29sYXRlZCBsaW5rZXIuIEFuIGluY29tcGF0aWJpbGl0eSBtdXN0IGJlIGZpeGVkIGluIHRoZVxuICogcmVwb3NpdG9yeSBvciBpbiB3YmZ5J3MgbWFuYWdlZCBsaXN0cywgbmV2ZXIgYnkgc3dpdGNoaW5nIHRoZSBsaW5rZXIuIFJldHVybnMgZmFsc2Ugd2hlbiB0aGVcbiAqIGluc3RhbGwgZmFpbHMuXG4gKi9cbmZ1bmN0aW9uIHByb2JlSXNvbGF0ZWRCdW5JbnN0YWxsKFxuICByb290RGlyUGF0aDogc3RyaW5nLFxuICByb290Q29uZmlnOiBQYWNrYWdlQ29uZmlnLFxuICBwcmV2aW91c0dsb2JhbFN0b3JlOiBib29sZWFuIHwgdW5kZWZpbmVkLFxuICB1c2VHbG9iYWxTdG9yZTogYm9vbGVhblxuKTogYm9vbGVhbiB7XG4gIC8vIEEgbGF5b3V0IHN3aXRjaCBtdXN0IHByb2JlIGZyb20gYSBjbGVhbiB0cmVlIGJlY2F1c2UgQnVuIGRvZXMgbm90IHJlbW92ZSB0aGUgcHJldmlvdXMgbGF5b3V0J3MgbGVmdG92ZXJzLlxuICBpZiAocHJldmlvdXNHbG9iYWxTdG9yZSAhPT0gdXNlR2xvYmFsU3RvcmUpIHtcbiAgICByZW1vdmVOb2RlTW9kdWxlcyhyb290RGlyUGF0aCwgcm9vdENvbmZpZyk7XG4gIH1cbiAgLy8gUmV0cnkgb25jZSBzbyBhIHRyYW5zaWVudCBmYWlsdXJlIChyZWdpc3RyeSBoaWNjdXAsIGZsYWt5IGxpZmVjeWNsZSBzY3JpcHQpIGRvZXMgbm90XG4gIC8vIG1hc3F1ZXJhZGUgYXMgYSBsYXlvdXQgaW5jb21wYXRpYmlsaXR5LlxuICBpZiAoc3Bhd25TeW5jQW5kUmV0dXJuU3RhdHVzKCdidW4nLCBbJ2luc3RhbGwnXSwgcm9vdERpclBhdGgsIDEpID09PSAwKSByZXR1cm4gdHJ1ZTtcblxuICAvLyBDbGVhbiB1cCB0aGUgZmFpbGVkIGF0dGVtcHQgc28gbGF0ZXIgaW5zdGFsbHMgZG8gbm90IHJ1biBvbiBhIHBvbGx1dGVkIHRyZWUuXG4gIHJlbW92ZU5vZGVNb2R1bGVzKHJvb3REaXJQYXRoLCByb290Q29uZmlnKTtcbiAgcmV0dXJuIGZhbHNlO1xufVxuXG5mdW5jdGlvbiByZW1vdmVOb2RlTW9kdWxlcyhyb290RGlyUGF0aDogc3RyaW5nLCByb290Q29uZmlnOiBQYWNrYWdlQ29uZmlnKTogdm9pZCB7XG4gIC8vIENvdmVyIGV2ZXJ5IGRlY2xhcmVkIHdvcmtzcGFjZTogbGVmdG92ZXJzIGNhbiBrZWVwIHBoYW50b20gZGVwZW5kZW5jaWVzIHJlc29sdmFibGUuXG4gIGNvbnN0IG5vZGVNb2R1bGVzUGF0aHMgPSBbXG4gICAgcGF0aC5yZXNvbHZlKHJvb3REaXJQYXRoLCAnbm9kZV9tb2R1bGVzJyksXG4gICAgLi4uWy4uLmdldFdvcmtzcGFjZVBhY2thZ2VEaXJzKHJvb3RDb25maWcpLnZhbHVlcygpXS5tYXAoKHdvcmtzcGFjZURpcikgPT5cbiAgICAgIHBhdGgucmVzb2x2ZShyb290RGlyUGF0aCwgd29ya3NwYWNlRGlyLCAnbm9kZV9tb2R1bGVzJylcbiAgICApLFxuICBdO1xuICAvLyBOZXZlciBkZWxldGUgdGhyb3VnaCBhIHdvcmtzcGFjZSBzeW1saW5rIHRoYXQgZXNjYXBlcyB0aGlzIHJlcG9zaXRvcnkuXG4gIGNvbnN0IHJlYWxSb290RGlyUGF0aCA9IGZzLnJlYWxwYXRoU3luYyhyb290RGlyUGF0aCk7XG4gIGZvciAoY29uc3Qgbm9kZU1vZHVsZXNQYXRoIG9mIG5vZGVNb2R1bGVzUGF0aHMpIHtcbiAgICBjb25zdCByZWFsUGFyZW50RGlyUGF0aCA9IGlnbm9yZUVycm9yKCgpID0+IGZzLnJlYWxwYXRoU3luYyhwYXRoLmRpcm5hbWUobm9kZU1vZHVsZXNQYXRoKSkpO1xuICAgIGlmIChcbiAgICAgICFyZWFsUGFyZW50RGlyUGF0aCB8fFxuICAgICAgKHJlYWxQYXJlbnREaXJQYXRoICE9PSByZWFsUm9vdERpclBhdGggJiYgIXJlYWxQYXJlbnREaXJQYXRoLnN0YXJ0c1dpdGgocmVhbFJvb3REaXJQYXRoICsgcGF0aC5zZXApKVxuICAgICkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGZzLnJtU3luYyhub2RlTW9kdWxlc1BhdGgsIHsgcmVjdXJzaXZlOiB0cnVlLCBmb3JjZTogdHJ1ZSB9KTtcbiAgfVxufVxuXG5mdW5jdGlvbiByZWZyZXNoQnVuTG9jayhyb290RGlyUGF0aDogc3RyaW5nKTogdm9pZCB7XG4gIC8vIHdiZnkgc2hvdWxkIHVwZGF0ZSBvbmx5IHRoZSBwYWNrYWdlcyBpdCBleHBsaWNpdGx5IG1hbmFnZXMgdGhyb3VnaCBidW4gYWRkLlxuICAvLyBSdW5uaW5nIGJ1biB1cGRhdGUgaGVyZSByZWZyZXNoZXMgdW5yZWxhdGVkIGFwcGxpY2F0aW9uIGRlcGVuZGVuY2llcyBhbmRcbiAgLy8gY2FuIGNoYW5nZSBwcm9kdWN0IGJlaGF2aW9yLCBzbyBrZWVwIHRoZSBleGlzdGluZyBsb2NrIGFuZCByZWNvbmNpbGUgaXQuXG4gIGNvbnN0IHN0YXR1cyA9IHNwYXduU3luY0FuZFJldHVyblN0YXR1cygnYnVuJywgWydpbnN0YWxsJ10sIHJvb3REaXJQYXRoLCAxKTtcbiAgaWYgKHN0YXR1cyA9PT0gMCkgcmV0dXJuO1xuICB0aHJvdyBuZXcgRXJyb3IoYEZhaWxlZCB0byByZWZyZXNoIEJ1biBsb2NrZmlsZTogYnVuIGluc3RhbGwgZXhpdGVkIHdpdGggc3RhdHVzICR7c3RhdHVzfWApO1xufVxuXG5hd2FpdCBtYWluKCk7XG4iXSwieF9nb29nbGVfaWdub3JlTGlzdCI6WzQzLDQ0LDQ1LDQ2LDQ3LDQ4XSwibWFwcGluZ3MiOiIreUJBV0EsTUFBYSxHQUFvRCxDQUMvRCxDQUNFLFFBQVMsTUFDVCxZQUFhLHNHQUNmLEVBQ0EsQ0FDRSxRQUFTLG1CQUNULFlBQ0UsNEdBQ0osRUFDQSxDQUNFLFFBQVMsb0JBQ1QsWUFDRSx5S0FDSixFQUNBLENBQ0UsUUFBUyxVQUNULFlBQWEsK0RBQ2YsRUFDQSxDQUNFLFFBQVMsUUFDVCxZQUFhLHNHQUNmLENBQ0YsRUFHYSxHQUFpRCxDQUM1RCxDQUFFLFFBQVMsVUFBVyxZQUFhLDhDQUErQyxFQUNsRixDQUFFLFFBQVMsV0FBWSxZQUFhLDZDQUE4QyxFQUNsRixDQUFFLFFBQVMsU0FBVSxZQUFhLHdDQUF5QyxFQUMzRSxDQUFFLFFBQVMsV0FBWSxZQUFhLHVEQUF3RCxDQUM5RixFQVFhLEdBQW9ELENBQy9ELENBQ0UsUUFBUyxzQkFDVCxZQUFhLHdFQUNmLEVBQ0EsQ0FDRSxRQUFTLFdBQ1QsWUFDRSxrTkFDSixFQUNBLENBQ0UsUUFBUyxzQkFDVCxZQUNFLHdHQUNKLEVBQ0EsQ0FDRSxRQUFTLHNCQUNULFlBQWEsbUdBQ2YsRUFDQSxDQUNFLFFBQVMscUJBQ1QsWUFDRSwwT0FDSixFQUNBLENBQ0UsUUFBUyw4QkFDVCxZQUFhLG1HQUNmLEVBQ0EsQ0FDRSxRQUFTLGVBQ1QsWUFBYSxnRkFDZixFQUNBLENBQ0UsUUFBUyxpQkFDVCxZQUFhLHdGQUNmLENBQ0YsRUFRQSxTQUFnQixHQUFzQixFQUE4QyxDQUNsRixPQUFPLEVBQ0osSUFDRSxHQUNDLE1BQU0sRUFBUSxRQUFRLFdBQVcsRUFBUSxZQUFZLE9BQU8sQ0FBQyxDQUFDLENBQUMsWUFBWSxJQUFJLEVBQVEsWUFBWSxNQUFNLENBQUMsRUFBRSxNQUNoSCxDQUFDLENBQ0EsS0FBSzs7Q0FBTSxDQUNoQixDQ3JHQSxlQUFzQixHQUFNLEVBQXFDLENBQy9E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
|
|
502
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJuYW1lcyI6WyJmcyIsInBhcnNlSnNvbmMiLCJmc3AiLCJyZWxlYXNlQWdlR2F0ZS5kYXlzIiwicmVsZWFzZUFnZUdhdGUuZXhjbHVkZXMiLCJuZXdDb250ZW50IiwiY29tbW9uQ29udGVudCIsIm5ld0NvbnRlbnQiLCJjaGlsZF9wcm9jZXNzIiwiY29tbW9uQ29udGVudCIsImNoaWxkX3Byb2Nlc3MiLCJzb3J0T2JqZWN0S2V5cyIsImdpdEhvb2tzIiwiZGV0ZWN0TmV3bGluZSIsImRlcGVuZGVuY3lTZWN0aW9uS2V5cyIsImNvcmUiLCJtYW5hZ2VkQ29uZmlnQmxvY2tzIiwiZ2V0Q29uZmlnQ29udGVudCJdLCJzb3VyY2VzIjpbIi4uLy4uL3NoYXJlZC1saWIvc3JjL2dpdGh1YlRlbXBsYXRlcy50cyIsIi4uLy4uL3NoYXJlZC1saWIvc3JjL3NsZWVwLnRzIiwiLi4vLi4vc2hhcmVkLWxpYi9zcmMvZXJyb3IudHMiLCIuLi8uLi9zaGFyZWQtbGliLW5vZGUvc3JjL2J1bldvcmtzcGFjZXMudHMiLCIuLi8uLi9zaGFyZWQtbGliLW5vZGUvc3JjL2J1bkxvY2tmaWxlLnRzIiwiLi4vLi4vc2hhcmVkLWxpYi1ub2RlL3NyYy9kb2NrZXJmaWxlLnRzIiwiLi4vLi4vc2hhcmVkLWxpYi1ub2RlL3NyYy9nbG9iLnRzIiwiLi4vc3JjL29wdGlvbnMudHMiLCIuLi9zcmMvbG9nZ2VyLnRzIiwiLi4vc3JjL3V0aWxzL2ZzVXRpbC50cyIsIi4uL3NyYy91dGlscy9wcm9taXNlUG9vbC50cyIsIi4uL3NyYy91dGlscy90eXBlc2NyaXB0QXBpLnRzIiwiLi4vc3JjL2ZpeGVycy9uZXh0Q29uZmlnLnRzIiwiLi4vc3JjL2ZpeGVycy9jaGFrcmFUb2FzdGVyLnRzIiwiLi4vc3JjL2ZpeGVycy9wbGF5d3JpZ2h0Q29uZmlnLnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvZm5veFRvbWwudHMiLCIuLi9zcmMvdXRpbHMvbWVyZ2VVdGlsLnRzIiwiLi4vc3JjL3V0aWxzL29iamVjdFV0aWwudHMiLCIuLi9zcmMvdXRpbHMvd29ya3NwYWNlVXRpbC50cyIsIi4uL3NyYy91dGlscy9wcml2YXRlUGFja2FnZXMudHMiLCIuLi9zcmMvZ2VuZXJhdG9ycy93b3JrZmxvdy50cyIsIi4uL3NyYy9maXhlcnMvdHlwb3MudHMiLCIuLi9zcmMvdXRpbHMvZ2l0aHViVXRpbC50cyIsIi4uL3NyYy91dGlscy9qc29uY1V0aWwudHMiLCIuLi9zcmMvdXRpbHMvbWFuYWdlZFNjcmlwdFNlZ21lbnQudHMiLCIuLi9zcmMvdXRpbHMvc3Bhd25VdGlsLnRzIiwiLi4vc3JjL3V0aWxzL3N0cmluZ1V0aWwudHMiLCIuLi9zcmMvcGFja2FnZUNvbmZpZy50cyIsIi4uL3NyYy9nZW5lcmF0b3JzL2FnZW50cy50cyIsIi4uL2NvbmZpZ3MvcmVsZWFzZUFnZUdhdGUuanNvbiIsIi4uL3NyYy9nZW5lcmF0b3JzL2J1bmZpZy50cyIsIi4uL3NyYy91dGlscy9pZ25vcmVGaWxlVXRpbC50cyIsIi4uL3NyYy9nZW5lcmF0b3JzL2RvY2tlcmlnbm9yZS50cyIsIi4uL3NyYy91dGlscy9leHRlbnNpb25zLnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvZWRpdG9yY29uZmlnLnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvZ2VtaW5pQ29uZmlnLnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvZ2l0YXR0cmlidXRlcy50cyIsIi4uL3NyYy9nZW5lcmF0b3JzL2dpdGlnbm9yZS50cyIsIi4uL3NyYy91dGlscy92ZXJzaW9uLnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvZ2xvYmFsUmVsZWFzZUFnZUdhdGUudHMiLCIuLi9zcmMvdXRpbHMvcGFja2FnZUNhcGFiaWxpdGllcy50cyIsIi4uL3NyYy9nZW5lcmF0b3JzL2lkZWEudHMiLCIuLi9zcmMvdXRpbHMvZ2VuSTE4blRzLnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLmJ1bi9pbnN0YWxsL2NhY2hlL2xpbmtzL3NvcnQtb2JqZWN0LWtleXNAMi4xLjAtMThkZjJmODM3ZTZlYzI5YS9ub2RlX21vZHVsZXMvc29ydC1vYmplY3Qta2V5cy9pbmRleC5qcyIsIi4uLy4uLy4uLy4uLy4uLy4uLy5idW4vaW5zdGFsbC9jYWNoZS9saW5rcy9kZXRlY3QtaW5kZW50QDcuMC4yLTZiNzVkYzBmNTY1MzNiZDkvbm9kZV9tb2R1bGVzL2RldGVjdC1pbmRlbnQvaW5kZXguanMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uYnVuL2luc3RhbGwvY2FjaGUvbGlua3MvZGV0ZWN0LW5ld2xpbmVANC4wLjEtNWRhOWRmNjUxMjVlZTc5NS9ub2RlX21vZHVsZXMvZGV0ZWN0LW5ld2xpbmUvaW5kZXguanMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uYnVuL2luc3RhbGwvY2FjaGUvbGlua3MvZ2l0LWhvb2tzLWxpc3RANC4yLjEtNmNhMmIyNjlkOTE2MzMyZS9ub2RlX21vZHVsZXMvZ2l0LWhvb2tzLWxpc3QvaW5kZXguanNvbiIsIi4uLy4uLy4uLy4uLy4uLy4uLy5idW4vaW5zdGFsbC9jYWNoZS9saW5rcy9pcy1wbGFpbi1vYmpANC4xLjAtNDdmZGRkNzcwNjQ4ZTU3Ny9ub2RlX21vZHVsZXMvaXMtcGxhaW4tb2JqL2luZGV4LmpzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLmJ1bi9pbnN0YWxsL2NhY2hlL2xpbmtzL3NvcnQtcGFja2FnZS1qc29uQDQuMC4wLTYzNTFiOTJmODI2MTU2ZjQvbm9kZV9tb2R1bGVzL3NvcnQtcGFja2FnZS1qc29uL2luZGV4LmpzIiwiLi4vc3JjL2dpdGh1Yi9jb21taXQudHMiLCIuLi9zcmMvdXRpbHMvdHNjb25maWdCYXNlLnRzIiwiLi4vc3JjL3V0aWxzL3dpbGxib29zdGVyQ29uZmlnc1V0aWwudHMiLCIuLi9zcmMvZ2VuZXJhdG9ycy9wYWNrYWdlSnNvbi50cyIsIi4uL3NyYy9nZW5lcmF0b3JzL2xlZnRob29rLnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvY29uZmlnQ29udGVudC50cyIsIi4uL3NyYy9nZW5lcmF0b3JzL21hbmFnZWRDb25maWdCbG9jay50cyIsIi4uL3NyYy9nZW5lcmF0b3JzL294Zm10Q29uZmlnLnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvb3hsaW50Q29uZmlnLnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvcHJldHRpZXJpZ25vcmUudHMiLCIuLi9zcmMvZ2VuZXJhdG9ycy9weXJpZ2h0Q29uZmlnLnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvcmFpbHdheWlnbm9yZS50cyIsIi4uL3NyYy9nZW5lcmF0b3JzL3JlYWRtZS50cyIsIi4uL3NyYy9nZW5lcmF0b3JzL3JlbGVhc2VyYy50cyIsIi4uL3NyYy9nZW5lcmF0b3JzL3Jlbm92YXRlSnNvbmMudHMiLCIuLi9zcmMvZ2VuZXJhdG9ycy90c2NvbmZpZy50cyIsIi4uL3NyYy9nZW5lcmF0b3JzL3VzZXJBZ2VudENvbmZpZ3MudHMiLCIuLi9zcmMvZ2VuZXJhdG9ycy92c2NvZGVTZXR0aW5ncy50cyIsIi4uL3NyYy9nZW5lcmF0b3JzL3diRW52LnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvc2VsZkNvbnRhaW5lZFdvcmtmbG93LnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvbWlzZVRvbWwudHMiLCIuLi9zcmMvZ2VuZXJhdG9ycy9ucG1yYy50cyIsIi4uL3NyYy9naXRodWIvbGFiZWwudHMiLCIuLi9zcmMvZ2l0aHViL3J1bGVzZXQudHMiLCIuLi9zcmMvZ2l0aHViL3NldHRpbmdzLnRzIiwiLi4vc3JjL2dpdGh1Yi90ZW1wbGF0ZS50cyIsIi4uL3NyYy91dGlscy9kZXBlbmRlbmN5U291cmNlUG9saWN5LnRzIiwiLi4vc3JjL2luZGV4LnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQSBzZWN0aW9uIG9mIGEgUFIgb3IgaXNzdWUgYm9keTogaXRzIGhlYWRpbmcgYW5kIHdoYXQgdGhlIHNlY3Rpb24gbXVzdCBzdGF0ZS4gYHJlcXVpcmVtZW50YFxuICogc3RhcnRzIGxvd2VyY2FzZSBhbmQgZW5kcyB3aXRob3V0IHB1bmN0dWF0aW9uLCBzbyB0aGF0IGl0IHJlYWRzIGJvdGggYXMgYSBwbGFjZWhvbGRlciBzZW50ZW5jZVxuICogKGNhcGl0YWxpemVkLCB3aXRoIGEgcGVyaW9kIGFwcGVuZGVkKSBhbmQgYXMgYSBjaGVja2xpc3QgY2xhdXNlIGFmdGVyIHRoZSBoZWFkaW5nLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFRlbXBsYXRlU2VjdGlvbiB7XG4gIHJlYWRvbmx5IGhlYWRpbmc6IHN0cmluZztcbiAgcmVhZG9ubHkgcmVxdWlyZW1lbnQ6IHN0cmluZztcbn1cblxuLyoqIFNlY3Rpb25zIG9mIGEgcHVsbCByZXF1ZXN0IGJvZHksIGluIHRoZSBvcmRlciB0aGV5IGFwcGVhciBpbiB0aGUgUFIgdGVtcGxhdGUuICovXG5leHBvcnQgY29uc3QgUFVMTF9SRVFVRVNUX1NFQ1RJT05TOiByZWFkb25seSBUZW1wbGF0ZVNlY3Rpb25bXSA9IFtcbiAge1xuICAgIGhlYWRpbmc6ICdXaHknLFxuICAgIHJlcXVpcmVtZW50OiAndGhlIHByb2JsZW0sIHdpdGggdGhlIG51bWJlcnMgb3Igb2JzZXJ2YXRpb25zIGJlaGluZCBpdCwgYW5kIHdoeSB0aGlzIGFwcHJvYWNoIG92ZXIgdGhlIGFsdGVybmF0aXZlcycsXG4gIH0sXG4gIHtcbiAgICBoZWFkaW5nOiAnQ3VzdG9tZXIgU3VtbWFyeScsXG4gICAgcmVxdWlyZW1lbnQ6XG4gICAgICAnYmVoYXZpb3IsIHdvcmtmbG93LCBvciB1c2VyLXZpc2libGUgY2hhbmdlcywgd3JpdHRlbiBmb3IgcmVhZGVycyB3aG8ga25vdyBub3RoaW5nIGFib3V0IHRoZSBpbXBsZW1lbnRhdGlvbicsXG4gIH0sXG4gIHtcbiAgICBoZWFkaW5nOiAnVGVjaG5pY2FsIFN1bW1hcnknLFxuICAgIHJlcXVpcmVtZW50OlxuICAgICAgJ2RlY2lzaW9ucyBhbmQgdGhlaXIgcmVhc29ucywgZGF0YSBmbG93LCB3aGVyZSB0byBsb29rICh0aGUgZmlsZXMgdGhhdCBtYXR0ZXIgbW9zdCksIGFuZCB3aGF0IHRvIGNoZWNrIGhhcmRlc3Q6IHRoZSBwYXJ0cyB3aG9zZSBjb3JyZWN0bmVzcyBpcyBhcmd1ZWQgcmF0aGVyIHRoYW4gcHJvdmVuJyxcbiAgfSxcbiAge1xuICAgIGhlYWRpbmc6ICdUZXN0aW5nJyxcbiAgICByZXF1aXJlbWVudDogJ2NvbW1hbmRzIHJ1biwgdGVzdHMgYWRkZWQsIGFuZCB3aGF0IHdhcyBOT1QgZXhlcmNpc2VkIGFuZCB3aHknLFxuICB9LFxuICB7XG4gICAgaGVhZGluZzogJ05vdGVzJyxcbiAgICByZXF1aXJlbWVudDogJ2tub3duIGxpbWl0YXRpb25zLCBjb21wYXRpYmlsaXR5IGFuZCBtaWdyYXRpb24sIGZvbGxvdy11cCB3b3JrOyBkZWxldGUgdGhpcyBzZWN0aW9uIGlmIHRoZXJlIGlzIG5vbmUnLFxuICB9LFxuXTtcblxuLyoqIFNlY3Rpb25zIG9mIGEgYnVnIHJlcG9ydCwgaW4gdGhlIG9yZGVyIHRoZXkgYXBwZWFyIGluIHRoZSBpc3N1ZSB0ZW1wbGF0ZS4gKi9cbmV4cG9ydCBjb25zdCBCVUdfSVNTVUVfU0VDVElPTlM6IHJlYWRvbmx5IFRlbXBsYXRlU2VjdGlvbltdID0gW1xuICB7IGhlYWRpbmc6ICdQcm9ibGVtJywgcmVxdWlyZW1lbnQ6ICd3aGF0IGhhcHBlbnMsIGFuZCB3aGF0IHNob3VsZCBoYXBwZW4gaW5zdGVhZCcgfSxcbiAgeyBoZWFkaW5nOiAnRXZpZGVuY2UnLCByZXF1aXJlbWVudDogJ3JlcHJvZHVjdGlvbiBzdGVwcywgbG9ncywgcnVuIElEcywgb3IgbGlua3MnIH0sXG4gIHsgaGVhZGluZzogJ0ltcGFjdCcsIHJlcXVpcmVtZW50OiAnd2hvIG9yIHdoYXQgaXMgYWZmZWN0ZWQsIGFuZCBob3cgYmFkbHknIH0sXG4gIHsgaGVhZGluZzogJ1Byb3Bvc2FsJywgcmVxdWlyZW1lbnQ6ICd0aGUgZml4IHlvdSBoYXZlIGluIG1pbmQsIGFuZCB0aGUgcm9vdCBjYXVzZSBpZiBrbm93bicgfSxcbl07XG5cbi8qKlxuICogU2VjdGlvbnMgYSBjaGFuZ2Ugc3BlY2lmaWNhdGlvbiBtdXN0IHNldHRsZSBiZWZvcmUgYSB0aGlyZCBwYXJ0eSBjYW4gaW1wbGVtZW50IGl0LCBkZWZpbmVkXG4gKiBvbmNlIHNvIHRoYXQgdGhlIGlzc3VlIHRlbXBsYXRlIGFuZCBhbnkgdG9vbCB0aGF0IGRyYWZ0cyBvciByZXZpZXdzIHNwZWNpZmljYXRpb25zIGFnYWluc3RcbiAqIHRoZXNlIHNlY3Rpb25zIGNhbm5vdCBkcmlmdCBhcGFydDsgY2hlY2tsaXN0IGNvbnN1bWVycyByZW5kZXIgaXQgd2l0aCBgcmVuZGVyU2VjdGlvbkNoZWNrbGlzdGAuXG4gKiBUaGUgZmlyc3QgdGhyZWUgc2VjdGlvbnMgc3VmZmljZSBmb3IgYSBzbWFsbCBjaGFuZ2UsIHNvIHRoZXkgY29tZSBmaXJzdC5cbiAqL1xuZXhwb3J0IGNvbnN0IENIQU5HRV9JU1NVRV9TRUNUSU9OUzogcmVhZG9ubHkgVGVtcGxhdGVTZWN0aW9uW10gPSBbXG4gIHtcbiAgICBoZWFkaW5nOiAnQmFja2dyb3VuZCBhbmQgZ29hbCcsXG4gICAgcmVxdWlyZW1lbnQ6ICd0aGUgcHJvYmxlbSBiZWluZyBzb2x2ZWQsIGZvciB3aG9tLCBhbmQgd2hhdCBvdXRjb21lIGNvdW50cyBhcyBzdWNjZXNzJyxcbiAgfSxcbiAge1xuICAgIGhlYWRpbmc6ICdCZWhhdmlvcicsXG4gICAgcmVxdWlyZW1lbnQ6XG4gICAgICAnZXZlcnkgdXNlci0gb3IgY2FsbGVyLW9ic2VydmFibGUgYmVoYXZpb3IsIGluY2x1ZGluZyBpbnB1dHMsIG91dHB1dHMsIGVycm9yIGNhc2VzLCBlZGdlIGNhc2VzLCBhbmQgaW50ZXJhY3Rpb25zIHdpdGggZXhpc3RpbmcgYmVoYXZpb3IsIHN0YXRlZCBwcmVjaXNlbHkgZW5vdWdoIHRoYXQgdHdvIGltcGxlbWVudGVycyB3b3VsZCBidWlsZCB0aGUgc2FtZSB0aGluZycsXG4gIH0sXG4gIHtcbiAgICBoZWFkaW5nOiAnQWNjZXB0YW5jZSBjcml0ZXJpYScsXG4gICAgcmVxdWlyZW1lbnQ6XG4gICAgICAnY2hlY2thYmxlIGNvbmRpdGlvbnMgKEdpdmVuL1doZW4vVGhlbiBvciBhbiBlcXVpdmFsZW50KSB0aGF0IGRlY2lkZSB3aGV0aGVyIHRoZSBpbXBsZW1lbnRhdGlvbiBpcyBkb25lJyxcbiAgfSxcbiAge1xuICAgIGhlYWRpbmc6ICdTY29wZSBhbmQgbm9uLWdvYWxzJyxcbiAgICByZXF1aXJlbWVudDogJ3doYXQgdGhlIGNoYW5nZSBjb3ZlcnMgYW5kIHdoYXQgaXQgZGVsaWJlcmF0ZWx5IGxlYXZlcyBvdXQsIHNvIGFuIGltcGxlbWVudGVyIGtub3dzIHdoZXJlIHRvIHN0b3AnLFxuICB9LFxuICB7XG4gICAgaGVhZGluZzogJ0Rlc2lnbiBjb25zdHJhaW50cycsXG4gICAgcmVxdWlyZW1lbnQ6XG4gICAgICAndGhlIGRhdGEsIEFQSSwgc2NoZW1hLCBVSSwgYW5kIGNvbmZpZ3VyYXRpb24gY2hhbmdlcywgbmFtaW5nLCBhbmQgdGhlIGV4aXN0aW5nIGNvZGUgb3IgY29udmVudGlvbnMgdGhlIGltcGxlbWVudGF0aW9uIG11c3QgZml0IOKAlCBhcyBmYXIgYXMgdGhlIHdyaXRlciBpbnRlbmRzIHRvIGNvbnN0cmFpbiB0aGVtLCB3aXRoIGV2ZXJ5dGhpbmcgZWxzZSBleHBsaWNpdGx5IGxlZnQgdG8gdGhlIGltcGxlbWVudGVyJyxcbiAgfSxcbiAge1xuICAgIGhlYWRpbmc6ICdDb21wYXRpYmlsaXR5IGFuZCBtaWdyYXRpb24nLFxuICAgIHJlcXVpcmVtZW50OiAnd2hhdCBleGlzdGluZyBkYXRhLCB1c2VycywgY2FsbGVycywgb3IgY29uZmlndXJhdGlvbnMgYXJlIGFmZmVjdGVkIGFuZCBob3cgdGhlIHRyYW5zaXRpb24gaGFwcGVucycsXG4gIH0sXG4gIHtcbiAgICBoZWFkaW5nOiAnVmVyaWZpY2F0aW9uJyxcbiAgICByZXF1aXJlbWVudDogJ2hvdyB0aGUgY2hhbmdlIGlzIHRlc3RlZCBvciBkZW1vbnN0cmF0ZWQsIGluY2x1ZGluZyB3aGF0IG5lZWRzIG5vIHRlc3QgYW5kIHdoeScsXG4gIH0sXG4gIHtcbiAgICBoZWFkaW5nOiAnT3BlbiBxdWVzdGlvbnMnLFxuICAgIHJlcXVpcmVtZW50OiAndW5kZWNpZGVkIHBvaW50cywgZWFjaCB3aXRoIGl0cyBvcHRpb25zOyBlbXB0eSBvbmNlIHRoZSBzcGVjaWZpY2F0aW9uIGlzIGltcGxlbWVudGFibGUnLFxuICB9LFxuXTtcblxuLyoqIFJlbmRlcnMgc2VjdGlvbnMgYXMgbWFya2Rvd24gYnVsbGV0cyAoYC0gKipIZWFkaW5nKio6IHJlcXVpcmVtZW50YCkuICovXG5leHBvcnQgZnVuY3Rpb24gcmVuZGVyU2VjdGlvbkNoZWNrbGlzdChzZWN0aW9uczogcmVhZG9ubHkgVGVtcGxhdGVTZWN0aW9uW10pOiBzdHJpbmcge1xuICByZXR1cm4gc2VjdGlvbnMubWFwKChzZWN0aW9uKSA9PiBgLSAqKiR7c2VjdGlvbi5oZWFkaW5nfSoqOiAke3NlY3Rpb24ucmVxdWlyZW1lbnR9YCkuam9pbignXFxuJyk7XG59XG5cbi8qKiBSZW5kZXJzIHNlY3Rpb25zIGFzIG1hcmtkb3duIGhlYWRpbmdzLCBlYWNoIGZvbGxvd2VkIGJ5IGl0cyByZXF1aXJlbWVudCBhcyBhIHBsYWNlaG9sZGVyIGNvbW1lbnQuICovXG5leHBvcnQgZnVuY3Rpb24gcmVuZGVyU2VjdGlvblRlbXBsYXRlKHNlY3Rpb25zOiByZWFkb25seSBUZW1wbGF0ZVNlY3Rpb25bXSk6IHN0cmluZyB7XG4gIHJldHVybiBzZWN0aW9uc1xuICAgIC5tYXAoXG4gICAgICAoc2VjdGlvbikgPT5cbiAgICAgICAgYCMjICR7c2VjdGlvbi5oZWFkaW5nfVxcblxcbjwhLS0gJHtzZWN0aW9uLnJlcXVpcmVtZW50LmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpfSR7c2VjdGlvbi5yZXF1aXJlbWVudC5zbGljZSgxKX0uIC0tPmBcbiAgICApXG4gICAgLmpvaW4oJ1xcblxcbicpO1xufVxuIiwiZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHNsZWVwKG1pbGxpc2Vjb25kczogbnVtYmVyKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4gc2V0VGltZW91dChyZXNvbHZlLCBtaWxsaXNlY29uZHMpKTtcbn1cbiIsImltcG9ydCB7IHNsZWVwIH0gZnJvbSAnLi9zbGVlcC5qcyc7XG5cbi8qKlxuICogQ29udmVydCBhbiBvYmplY3QgdG8gYW4gZXJyb3IuXG4gKiBAcGFyYW0gb2JqIFRoZSBvYmplY3QgdG8gY29udmVydC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGVycm9yaWZ5KG9iajogdW5rbm93bik6IEVycm9yIHtcbiAgaWYgKG9iaiBpbnN0YW5jZW9mIEVycm9yKSByZXR1cm4gb2JqO1xuICBpZiAodHlwZW9mIG9iaiA9PT0gJ3N0cmluZycpIHJldHVybiBuZXcgRXJyb3Iob2JqKTtcbiAgdHJ5IHtcbiAgICByZXR1cm4gbmV3IEVycm9yKEpTT04uc3RyaW5naWZ5KG9iaikpO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gbmV3IEVycm9yKFN0cmluZyhvYmopKTtcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gaWdub3JlRXJyb3I8VD4oZm46ICgpID0+IFQpOiBUIHwgdW5kZWZpbmVkIHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gZm4oKTtcbiAgfSBjYXRjaCB7XG4gICAgLy8gZG8gbm90aGluZ1xuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpZ25vcmVFbm9lbnQ8VD4oZm46ICgpID0+IFQpOiBUIHwgdW5kZWZpbmVkIHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gZm4oKTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBpZiAodHlwZW9mIGVycm9yID09PSAnb2JqZWN0JyAmJiBlcnJvciAmJiAnY29kZScgaW4gZXJyb3IgJiYgZXJyb3IuY29kZSA9PT0gJ0VOT0VOVCcpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhyb3cgZXJyb3I7XG4gIH1cbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGlnbm9yZUVycm9yQXN5bmM8VD4oZm46ICgpID0+IFByb21pc2U8VD4pOiBQcm9taXNlPFQgfCB1bmRlZmluZWQ+IHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gYXdhaXQgZm4oKTtcbiAgfSBjYXRjaCB7XG4gICAgLy8gZG8gbm90aGluZ1xuICB9XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBpZ25vcmVFbm9lbnRBc3luYzxUPihmbjogKCkgPT4gUHJvbWlzZTxUPik6IFByb21pc2U8VCB8IHVuZGVmaW5lZD4ge1xuICB0cnkge1xuICAgIHJldHVybiBhd2FpdCBmbigpO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGlmICh0eXBlb2YgZXJyb3IgPT09ICdvYmplY3QnICYmIGVycm9yICYmICdjb2RlJyBpbiBlcnJvciAmJiBlcnJvci5jb2RlID09PSAnRU5PRU5UJykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aHJvdyBlcnJvcjtcbiAgfVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIFJldHJ5T3B0aW9ucyB7XG4gIGJlZm9yZVJldHJ5PzogKGVycm9yOiB1bmtub3duKSA9PiBQcm9taXNlPHZvaWQ+O1xuICBoYW5kbGVFcnJvcj86IChlcnJvcjogdW5rbm93bikgPT4gUHJvbWlzZTx2b2lkPjtcbiAgLyoqXG4gICAqIFRoZSBtYXhpbXVtIG51bWJlciBvZiB0b3RhbCBhdHRlbXB0cywgaW5jbHVkaW5nIHRoZSBpbml0aWFsIGF0dGVtcHQuXG4gICAqIEZvciBleGFtcGxlLCBgcmV0cnlDb3VudDogM2AgcnVucyB0aGUgZnVuY3Rpb24gYXQgbW9zdCAzIHRpbWVzOiAxIGluaXRpYWwgYXR0ZW1wdCBhbmQgdXAgdG8gMiByZXRyaWVzLlxuICAgKi9cbiAgcmV0cnlDb3VudD86IG51bWJlcjtcbiAgcmV0cnlMb2dnZXI/OiAobWVzc2FnZTogc3RyaW5nKSA9PiB2b2lkO1xuICBzaG91bGRSZXRyeT86IChlcnJvcjogdW5rbm93bikgPT4gYm9vbGVhbjtcbiAgc2xlZXBNaWxsaXNlY29uZHM/OiBudW1iZXI7XG4gIHVwZGF0ZVNsZWVwTWlsbGlzZWNvbmRzPzogKHNsZWVwTWlsbGlzZWNvbmRzOiBudW1iZXIpID0+IG51bWJlcjtcbn1cblxuLyoqXG4gKiBSZXRyeSB0aGUgZ2l2ZW4gZnVuY3Rpb24uXG4gKiBAcGFyYW0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gcmV0cnkuXG4gKiBAcGFyYW0gYmVmb3JlUmV0cnkgVGhlIGZ1bmN0aW9uIHRvIGNhbGwgaW1tZWRpYXRlbHkgYmVmb3JlIHJldHJ5aW5nLlxuICogQHBhcmFtIGhhbmRsZUVycm9yIFRoZSBmdW5jdGlvbiB0byBjYWxsIHdoZW4gYW4gZXJyb3Igb2NjdXJzLlxuICogQHBhcmFtIHJldHJ5Q291bnQgVGhlIG1heGltdW0gbnVtYmVyIG9mIHRvdGFsIGF0dGVtcHRzLCBpbmNsdWRpbmcgdGhlIGluaXRpYWwgYXR0ZW1wdC5cbiAqIEBwYXJhbSByZXRyeUxvZ2dlciBUaGUgZnVuY3Rpb24gdG8gbG9nIHJldHJ5aW5nLlxuICogQHBhcmFtIHNsZWVwTWlsbGlzZWNvbmRzIFRoZSBudW1iZXIgb2YgbWlsbGlzZWNvbmRzIHRvIHNsZWVwIGJlZm9yZSByZXRyeWluZy5cbiAqIEBwYXJhbSB1cGRhdGVTbGVlcE1pbGxpc2Vjb25kcyBUaGUgZnVuY3Rpb24gdG8gdXBkYXRlIHNsZWVwIG1pbGxpc2Vjb25kcyBhZnRlciBlYWNoIHJldHJ5LlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gd2l0aFJldHJ5PFQ+KFxuICBmdW5jOiAoZmFpbGVkQ291bnQ6IG51bWJlcikgPT4gVCB8IFByb21pc2U8VD4sXG4gIHtcbiAgICBiZWZvcmVSZXRyeSxcbiAgICBoYW5kbGVFcnJvcixcbiAgICByZXRyeUNvdW50ID0gMyxcbiAgICByZXRyeUxvZ2dlcixcbiAgICBzaG91bGRSZXRyeSxcbiAgICBzbGVlcE1pbGxpc2Vjb25kcyA9IDAsXG4gICAgdXBkYXRlU2xlZXBNaWxsaXNlY29uZHMsXG4gIH06IFJldHJ5T3B0aW9ucyA9IHt9XG4pOiBQcm9taXNlPFQ+IHtcbiAgbGV0IGZhaWxlZENvdW50ID0gMDtcbiAgZm9yICg7Oykge1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gYXdhaXQgZnVuYyhmYWlsZWRDb3VudCk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGF3YWl0IGhhbmRsZUVycm9yPy4oZXJyb3IpO1xuICAgICAgZmFpbGVkQ291bnQrKztcbiAgICAgIGlmIChmYWlsZWRDb3VudCA+PSByZXRyeUNvdW50KSB7XG4gICAgICAgIHRocm93IGVycm9yO1xuICAgICAgfVxuICAgICAgaWYgKHNob3VsZFJldHJ5ICYmICFzaG91bGRSZXRyeShlcnJvcikpIHtcbiAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICB9XG4gICAgICBpZiAoc2xlZXBNaWxsaXNlY29uZHMgPiAwKSB7XG4gICAgICAgIGF3YWl0IHNsZWVwKHNsZWVwTWlsbGlzZWNvbmRzKTtcbiAgICAgIH1cbiAgICAgIGlmICh1cGRhdGVTbGVlcE1pbGxpc2Vjb25kcykge1xuICAgICAgICBzbGVlcE1pbGxpc2Vjb25kcyA9IHVwZGF0ZVNsZWVwTWlsbGlzZWNvbmRzKHNsZWVwTWlsbGlzZWNvbmRzKTtcbiAgICAgIH1cbiAgICAgIHJldHJ5TG9nZ2VyPy4oYFJldHJ5IGR1ZSB0bzogJHtlcnJvcn1cbiR7ZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/ICctLS1cXG4nICsgKGVycm9yLnN0YWNrID8/ICcnKSA6ICcnfWApO1xuICAgICAgYXdhaXQgYmVmb3JlUmV0cnk/LihlcnJvcik7XG4gICAgfVxuICB9XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgZmcgZnJvbSAnZmFzdC1nbG9iJztcblxuLyoqIFRoZSBgd29ya3NwYWNlc2AgZmllbGQgb2YgYSByb290IHBhY2thZ2UuanNvbjogdGhlIGFycmF5IGZvcm0gb3IgWWFybiB2MSdzIG9iamVjdCBmb3JtLiAqL1xuZXhwb3J0IHR5cGUgV29ya3NwYWNlc0RlY2xhcmF0aW9uID0gc3RyaW5nW10gfCB7IHBhY2thZ2VzPzogc3RyaW5nW10gfSB8IHVuZGVmaW5lZDtcblxuLyoqXG4gKiBFdmVyeSB3b3Jrc3BhY2UgcGFja2FnZS5qc29uIHBhdGggKHJlbGF0aXZlIHRvIHRoZSBtb25vcmVwbyByb290LCBzb3J0ZWQpIHRoYXQgQnVuIHdvdWxkIGxpbmtcbiAqIGZvciB0aGUgZ2l2ZW4gcm9vdCBwYWNrYWdlLmpzb24gYHdvcmtzcGFjZXNgIGRlY2xhcmF0aW9uLiBDYW5vbmljYWxpemVzIHRoZSBkZWNsYXJlZCBwYXR0ZXJuc1xuICogKHNlZSBnZXRNZWFuaW5nZnVsRGVjbGFyZWRXb3Jrc3BhY2VQYXR0ZXJucyksIGRyb3BzIHBhdHRlcm5zIGVzY2FwaW5nIHRoZSByZXBvc2l0b3J5IChzZWVcbiAqIGlzSW5SZXBvc2l0b3J5V29ya3NwYWNlUGF0dGVybiksIGFuZCByZXNvbHZlcyB0aGUgcmVzdCB3aXRoIEJ1bidzIHNlcXVlbnRpYWwgc2VtYW50aWNzIChzZWVcbiAqIHJlc29sdmVXb3Jrc3BhY2VQYWNrYWdlSnNvblBhdGhzKS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlc29sdmVCdW5Xb3Jrc3BhY2VQYWNrYWdlSnNvblBhdGhzKHdvcmtzcGFjZXM6IFdvcmtzcGFjZXNEZWNsYXJhdGlvbiwgcm9vdERpclBhdGg6IHN0cmluZyk6IHN0cmluZ1tdIHtcbiAgcmV0dXJuIHJlc29sdmVXb3Jrc3BhY2VQYWNrYWdlSnNvblBhdGhzKFxuICAgIGdldE1lYW5pbmdmdWxEZWNsYXJlZFdvcmtzcGFjZVBhdHRlcm5zKHdvcmtzcGFjZXMpLmZpbHRlcigod29ya3NwYWNlUGF0dGVybikgPT5cbiAgICAgIGlzSW5SZXBvc2l0b3J5V29ya3NwYWNlUGF0dGVybih3b3Jrc3BhY2VQYXR0ZXJuKVxuICAgICksXG4gICAgcm9vdERpclBhdGhcbiAgKTtcbn1cblxuLyoqXG4gKiBSZXNvbHZlcyB3b3Jrc3BhY2UgcGF0dGVybnMgdG8gcGFja2FnZS5qc29uIHBhdGhzIG1pbWlja2luZyBCdW4ncyBTRVFVRU5USUFMIGV2YWx1YXRpb24sXG4gKiBkZXJpdmVkIGVtcGlyaWNhbGx5IHdpdGggQnVuIDEuMy4xNCAoZml4dHVyZSByZXBvcyBvYnNlcnZlZCB2aWEgYGJ1biBpbnN0YWxsIC0tbG9ja2ZpbGUtb25seWA7XG4gKiBXaWxsQm9vc3Rlci9zaGFyZWQjMTAwNCAvIFdpbGxCb29zdGVyL3NoYXJlZCMxMDA1KTpcbiAqIDEuIFBhdHRlcm5zIGFyZSBldmFsdWF0ZWQgaW4gZGVjbGFyYXRpb24gb3JkZXIgaW50byBhbiBhY2N1bXVsYXRpbmcgc2V0OiBhIHBvc2l0aXZlIGdsb2JcbiAqICAgIHBhdHRlcm4gYWRkcyBldmVyeSBwYWNrYWdlLmpzb24gaXQgbWF0Y2hlczsgYSBuZWdhdGlvbiBkZWxldGVzIGl0cyBtYXRjaGVzIGZyb20gdGhlIHNldFxuICogICAgYWNjdW11bGF0ZWQgU08gRkFSLCBzbyBhIGxhdGVyIHBvc2l0aXZlIHJlLWFkZHMgdGhlbSAoYFtcIiFhcHBzL2V4Y2x1ZGVkXCIsIFwiYXBwcy8qXCJdYCBsaW5rc1xuICogICAgYXBwcy9leGNsdWRlZCwgd2hpbGUgYFtcImFwcHMvKlwiLCBcIiFhcHBzL2V4Y2x1ZGVkXCJdYCBkb2VzIG5vdCkuXG4gKiAyLiBBIG5lZ2F0aW9uIHdob3NlIG5vcm1hbGl6ZWQgYm9keSBoYXMgRVhBQ1RMWSB0d28gc2VnbWVudHMsIHdob3NlIGxhc3Qgc2VnbWVudCBpcyBhIHN0YXItcnVuXG4gKiAgICAoYCpgLCBgKipgLCBgKioqYCwg4oCmKSwgYW5kIHdob3NlIGZpcnN0IHNlZ21lbnQgaXMgTk9UIGl0c2VsZiBhIHN0YXItcnVuIGZpcnN0IHNlZWRzIHRoZVxuICogICAgaW1wbGljaXQgYmFzZWxpbmUgaW50byB0aGUgc2V0LCB0aGVuIGRlbGV0ZXMgaXRzIG93biBtYXRjaGVzOiBhIGAqKmAgbGFzdCBzZWdtZW50IHNlZWRzXG4gKiAgICBgKipgIChwYWNrYWdlcyBhdCBhbnkgZGVwdGgpLCBhbnkgb3RoZXIgc3Rhci1ydW4gc2VlZHMgYCpcXC8qYCAoZGVwdGggMiBvbmx5KS4gU2VlZGluZ1xuICogICAgaGFwcGVucyBldmVuIGFsb25nc2lkZSBwb3NpdGl2ZSBwYXR0ZXJucyAoYFtcImFwcHMvKlwiLCBcIiFvdGhlci8qXCJdYCBsaW5rcyBldmVyeSBkZXB0aC0yXG4gKiAgICBwYWNrYWdlIG91dHNpZGUgb3RoZXIvKS4gTm8gb3RoZXIgbmVnYXRpb24gc2hhcGUgc2VlZHM6IGAhKmAsIGAhKipgLCBgISpcXC8qYCwgYCEqXFwvKipgLFxuICogICAgYCEqKlxcLypgLCBgIWEvYi8qYCwgYCFhL2IvKipgLCBgIWRpcmAsIGFuZCBgIWRpci8qeGAgZWFjaCBsaW5rIG5vdGhpbmcgb24gdGhlaXIgb3duLlxuICogICAgYD9gLCBicmFjZSwgYW5kIGNoYXJhY3Rlci1jbGFzcyBsYXN0IHNlZ21lbnRzIGJlaGF2ZSBFUlJBVElDQUxMWSAoYFtcIiFvdGhlci8/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+IG5hbWUuc3RhcnRzV2l0aChQUklWQVRFX1NDT1BFKSkpO1xuICB9KTtcbn1cblxuZnVuY3Rpb24gcmVhZFBhY2thZ2VKc29uSWZFeGlzdHMoZmlsZVBhdGg6IHN0cmluZyk6IFBhY2thZ2VKc29uIHwgdW5kZWZpbmVkIHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gSlNPTi5wYXJzZShmcy5yZWFkRmlsZVN5bmMoZmlsZVBhdGgsICd1dGY4JykpIGFzIFBhY2thZ2VKc29uO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG59XG4iLCIvLyBHaXRIdWIgQWN0aW9ucyB2YWx1ZWxlc3MgZXZlbnRzIHN1Y2ggYXMgYHB1bGxfcmVxdWVzdDpgIHJlcXVpcmUgWUFNTCBudWxsIHZhbHVlcy5cbi8qIGVzbGludC1kaXNhYmxlIHVuaWNvcm4vbm8tbnVsbCAqL1xuXG5pbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgbWVyZ2UgZnJvbSAnZGVlcG1lcmdlJztcbmltcG9ydCAqIGFzIHlhbWwgZnJvbSAnanMteWFtbCc7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgeyBoYXNGbm94U3luY0ZhaWxlZCwgcmVzb2x2ZUZub3hDaUFnZUtleVNlY3JldE5hbWUgfSBmcm9tICcuL2Zub3hUb21sLmpzJztcbmltcG9ydCB7IGZzVXRpbCB9IGZyb20gJy4uL3V0aWxzL2ZzVXRpbC5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGNvbWJpbmVNZXJnZSB9IGZyb20gJy4uL3V0aWxzL21lcmdlVXRpbC5qcyc7XG5pbXBvcnQgeyBtb3ZlVG9Cb3R0b20sIHNvcnRLZXlzIH0gZnJvbSAnLi4vdXRpbHMvb2JqZWN0VXRpbC5qcyc7XG5pbXBvcnQgeyByZXBvUmVzb2x2ZXNQcml2YXRlUGFja2FnZXMgfSBmcm9tICcuLi91dGlscy9wcml2YXRlUGFja2FnZXMuanMnO1xuaW1wb3J0IHsgcHJvbWlzZVBvb2wgfSBmcm9tICcuLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5cbmludGVyZmFjZSBXb3JrZmxvdyB7XG4gIG5hbWU/OiBzdHJpbmc7XG4gIG9uPzogT247XG4gIGNvbmN1cnJlbmN5PzogQ29uY3VycmVuY3k7XG4gIHBlcm1pc3Npb25zPzogUmVjb3JkPHN0cmluZywgc3RyaW5nPjtcbiAgam9iczogUmVjb3JkPHN0cmluZywgSm9iPjtcbn1cblxuaW50ZXJmYWNlIENvbmN1cnJlbmN5IHtcbiAgZ3JvdXA6IHN0cmluZztcbiAgJ2NhbmNlbC1pbi1wcm9ncmVzcyc6IGJvb2xlYW47XG4gIHF1ZXVlPzogJ3NpbmdsZScgfCAnbWF4Jztcbn1cblxuaW50ZXJmYWNlIE9uIHtcbiAgLy8gR2l0SHViIEFjdGlvbnMgdHJlYXRzIGBldmVudDogbnVsbGAgYXMgYSB2YWx1ZWxlc3MgZXZlbnQgbWFwcGluZywgZS5nLlxuICAvLyBgcHVsbF9yZXF1ZXN0OmAuIGB1bmRlZmluZWRgIHdvdWxkIG9taXQgdGhlIGV2ZW50IGVudGlyZWx5IHdoZW4gZHVtcGluZyBZQU1MLlxuICBpc3N1ZXM/OiBUeXBlcyB8IG51bGw7XG4gIHB1bGxfcmVxdWVzdD86IFB1bGxSZXF1ZXN0IHwgbnVsbDtcbiAgcHVsbF9yZXF1ZXN0X3RhcmdldD86IFR5cGVzIHwgbnVsbDtcbiAgcHVzaD86IFB1c2g7XG4gIHNjaGVkdWxlPzogU2NoZWR1bGVbXTtcbiAgd29ya2Zsb3dfZGlzcGF0Y2g/OiBudWxsO1xufVxuXG5pbnRlcmZhY2UgUHVsbFJlcXVlc3Qge1xuICAncGF0aHMtaWdub3JlJz86IHN0cmluZ1tdO1xuICB0eXBlcz86IHN0cmluZ1tdO1xufVxuXG5pbnRlcmZhY2UgUHVzaCB7XG4gIGJyYW5jaGVzOiBzdHJpbmdbXTtcbiAgJ3BhdGhzLWlnbm9yZSc/OiBzdHJpbmdbXTtcbn1cblxuaW50ZXJmYWNlIFNjaGVkdWxlIHtcbiAgY3Jvbjogc3RyaW5nO1xufVxuXG5pbnRlcmZhY2UgVHlwZXMge1xuICB0eXBlczogc3RyaW5nW107XG59XG5cbmludGVyZmFjZSBKb2Ige1xuICAncnVucy1vbic/OiBzdHJpbmc7XG4gIGVudj86IFJlY29yZDxzdHJpbmcsIHN0cmluZz47XG4gIHBlcm1pc3Npb25zPzogUmVjb3JkPHN0cmluZywgc3RyaW5nPjtcbiAgc3RlcHM/OiBTdGVwW107XG4gIHVzZXM/OiBzdHJpbmc7XG4gIGlmPzogc3RyaW5nO1xuICBzZWNyZXRzPzogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gfCAnaW5oZXJpdCc7XG4gIHdpdGg/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbn1cblxuaW50ZXJmYWNlIFN0ZXAge1xuICB1c2VzPzogc3RyaW5nO1xuICB3aXRoPzogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gIHJ1bj86IHN0cmluZztcbn1cblxuY29uc3Qgd29ya2Zsb3dzID0ge1xuICB0ZXN0OiB7XG4gICAgbmFtZTogJ1Rlc3QnLFxuICAgIG9uOiB7XG4gICAgICBwdWxsX3JlcXVlc3Q6IG51bGwsXG4gICAgICBwdXNoOiB7XG4gICAgICAgIGJyYW5jaGVzOiBbJ21haW4nXSxcbiAgICAgIH0sXG4gICAgICAvLyBMZXQgbWFpbnRhaW5lcnMgcmUtcnVuIHRoZSB0ZXN0cyBieSBoYW5kLlxuICAgICAgd29ya2Zsb3dfZGlzcGF0Y2g6IG51bGwsXG4gICAgfSxcbiAgICAvLyBjZi4gaHR0cHM6Ly9kb2NzLmdpdGh1Yi5jb20vZW4vYWN0aW9ucy91c2luZy1qb2JzL3VzaW5nLWNvbmN1cnJlbmN5I2V4YW1wbGUtb25seS1jYW5jZWwtaW4tcHJvZ3Jlc3Mtam9icy1vci1ydW5zLWZvci10aGUtY3VycmVudC13b3JrZmxvd1xuICAgIGNvbmN1cnJlbmN5OiB7XG4gICAgICBncm91cDogJyR7eyBnaXRodWIud29ya2Zsb3cgfX0tJHt7IGdpdGh1Yi5yZWYgfX0nLFxuICAgICAgJ2NhbmNlbC1pbi1wcm9ncmVzcyc6IHRydWUsXG4gICAgfSxcbiAgICAvLyBOb25lIG9mIHRoZXNlIG1heSBiZSBuYXJyb3dlZCBqdXN0IGJlY2F1c2UgdGhlIHJldXNhYmxlIHRlc3Qgd29ya2Zsb3cgbmV2ZXIgcHVzaGVzOlxuICAgIHBlcm1pc3Npb25zOiB7XG4gICAgICAvLyBmb3IgdGhlIHRlc3Qgam9iJ3Mgc2tpcC1kdXBsaWNhdGUtYWN0aW9ucyBjYWxsIHdpdGggY2FuY2VsX290aGVyczogdHJ1ZSAodGhlIHJldXNhYmxlXG4gICAgICAvLyB0ZXN0IHdvcmtmbG93IGRlY2xhcmVzIG5vIHBlcm1pc3Npb25zIG9mIGl0cyBvd24sIHNvIGl0cyBqb2JzIHJ1biBvbiB0aGlzIHRva2VuKVxuICAgICAgYWN0aW9uczogJ3dyaXRlJyxcbiAgICAgIC8vIGZvciBgc2VtYW50aWMtcmVsZWFzZSAtLWRyeS1ydW5gLCB3aGljaCBkb2VzIGEgYGdpdCBwdXNoIC0tZHJ5LXJ1bmAgdG8gdmVyaWZ5IHdyaXRlXG4gICAgICAvLyBhY2Nlc3MgYW5kIGFib3J0cyB3aXRoIEVHSVROT1BFUk1JU1NJT04gd2l0aG91dCBpdFxuICAgICAgY29udGVudHM6ICd3cml0ZScsXG4gICAgICAvLyBmb3IgcGtnLXByZWZsaWdodCBQUiBmaWxlIGxpc3RpbmdcbiAgICAgICdwdWxsLXJlcXVlc3RzJzogJ3JlYWQnLFxuICAgIH0sXG4gICAgam9iczoge1xuICAgICAgdGVzdDoge1xuICAgICAgICB1c2VzOiAnV2lsbEJvb3N0ZXIvcmV1c2FibGUtd29ya2Zsb3dzLy5naXRodWIvd29ya2Zsb3dzL3Rlc3QueW1sQG1haW4nLFxuICAgICAgfSxcbiAgICB9LFxuICB9LFxuICAndGVzdC1ydXN0Jzoge1xuICAgIG5hbWU6ICdUZXN0IFJ1c3QnLFxuICAgIG9uOiB7XG4gICAgICBwdWxsX3JlcXVlc3Q6IG51bGwsXG4gICAgICBwdXNoOiB7XG4gICAgICAgIGJyYW5jaGVzOiBbJ21haW4nXSxcbiAgICAgIH0sXG4gICAgfSxcbiAgICBjb25jdXJyZW5jeToge1xuICAgICAgZ3JvdXA6ICcke3sgZ2l0aHViLndvcmtmbG93IH19LSR7eyBnaXRodWIucmVmIH19JyxcbiAgICAgICdjYW5jZWwtaW4tcHJvZ3Jlc3MnOiB0cnVlLFxuICAgIH0sXG4gICAgam9iczoge1xuICAgICAgJ3Rlc3QtcnVzdCc6IHtcbiAgICAgICAgdXNlczogJ1dpbGxCb29zdGVyL3JldXNhYmxlLXdvcmtmbG93cy8uZ2l0aHViL3dvcmtmbG93cy90ZXN0LXJ1c3QueW1sQG1haW4nLFxuICAgICAgfSxcbiAgICB9LFxuICB9LFxuICByZWxlYXNlOiB7XG4gICAgbmFtZTogJ1JlbGVhc2UnLFxuICAgIG9uOiB7XG4gICAgICBwdXNoOiB7XG4gICAgICAgIGJyYW5jaGVzOiBbXSxcbiAgICAgIH0sXG4gICAgfSxcbiAgICAvLyBgcXVldWU6IG1heGAgaGVyZSB0b28gKCM5NzQpOiBHaXRIdWIncyBkZWZhdWx0IHF1ZXVlIChgc2luZ2xlYCkgY2FuY2VscyBhbiBhbHJlYWR5LVBFTkRJTkdcbiAgICAvLyBjYWxsZXIgcnVuIHdoZW4gYW5vdGhlciBvbmUgcXVldWVzIOKAlCBiZWZvcmUgaXRzIGpvYiAoYW5kIHRoZSByZXVzYWJsZSB3b3JrZmxvdydzIG93blxuICAgIC8vIGpvYi1sZXZlbCBgcXVldWU6IG1heGApIGV2ZXIgc3RhcnRzIOKAlCBzaWxlbnRseSBkcm9wcGluZyB0aGF0IHJlbGVhc2UgdHJpZ2dlci5cbiAgICAvLyBUaGUgY2FsbGVyLWxldmVsIGdyb3VwIG11c3QgTk9UIHJldXNlIHRoZSByZXVzYWJsZSB3b3JrZmxvdydzIGpvYi1sZXZlbCBncm91cCBuYW1lXG4gICAgLy8gKGByZWxlYXNlLSR7eyBnaXRodWIucmVwb3NpdG9yeSB9fWApOiB3b3JrZmxvdy1sZXZlbCBhbmQgam9iLWxldmVsIGdyb3VwcyBzaGFyZSBvbmVcbiAgICAvLyByZXBvc2l0b3J5LXdpZGUgbmFtZXNwYWNlLCBhbmQgaWRlbnRpY2FsIG5hbWVzIGRlYWRsb2NrIHRoZSBydW4gKFwiQ2FuY2VsaW5nIHNpbmNlIGFcbiAgICAvLyBkZWFkbG9jayBmb3IgY29uY3VycmVuY3kgZ3JvdXAgLi4uIHdhcyBkZXRlY3RlZCBiZXR3ZWVuICd0b3AgbGV2ZWwgd29ya2Zsb3cnIGFuZCAnPGpvYj4nXCIpLlxuICAgIGNvbmN1cnJlbmN5OiB7XG4gICAgICBncm91cDogJyR7eyBnaXRodWIud29ya2Zsb3cgfX0nLFxuICAgICAgJ2NhbmNlbC1pbi1wcm9ncmVzcyc6IGZhbHNlLFxuICAgICAgcXVldWU6ICdtYXgnLFxuICAgIH0sXG4gICAgcGVybWlzc2lvbnM6IHtcbiAgICAgIC8vIGh0dHBzOi8vZG9jcy5ucG1qcy5jb20vdHJ1c3RlZC1wdWJsaXNoZXJzI3N0ZXAtMi1jb25maWd1cmUteW91ci1jaWNkLXdvcmtmbG93XG4gICAgICAnaWQtdG9rZW4nOiAnd3JpdGUnLFxuICAgICAgLy8gZm9yIHNlbWFudGljLXJlbGVhc2VcbiAgICAgIGNvbnRlbnRzOiAnd3JpdGUnLFxuICAgIH0sXG4gICAgam9iczoge1xuICAgICAgcmVsZWFzZToge1xuICAgICAgICB1c2VzOiAnV2lsbEJvb3N0ZXIvcmV1c2FibGUtd29ya2Zsb3dzLy5naXRodWIvd29ya2Zsb3dzL3JlbGVhc2UueW1sQG1haW4nLFxuICAgICAgfSxcbiAgICB9LFxuICB9LFxuICAnc2VtYW50aWMtcHInOiB7XG4gICAgbmFtZTogJ0xpbnQgUFIgdGl0bGUnLFxuICAgIG9uOiB7XG4gICAgICBwdWxsX3JlcXVlc3RfdGFyZ2V0OiB7XG4gICAgICAgIHR5cGVzOiBbJ29wZW5lZCcsICdlZGl0ZWQnLCAnc3luY2hyb25pemUnXSxcbiAgICAgIH0sXG4gICAgfSxcbiAgICBqb2JzOiB7XG4gICAgICAnc2VtYW50aWMtcHInOiB7XG4gICAgICAgIHVzZXM6ICdXaWxsQm9vc3Rlci9yZXVzYWJsZS13b3JrZmxvd3MvLmdpdGh1Yi93b3JrZmxvd3Mvc2VtYW50aWMtcHIueW1sQG1haW4nLFxuICAgICAgfSxcbiAgICB9LFxuICB9LFxuICBzeW5jOiB7XG4gICAgbmFtZTogJ1N5bmMnLFxuICAgIG9uOiB7fSxcbiAgICBwZXJtaXNzaW9uczoge1xuICAgICAgLy8gZm9yIGNvbW1pdGluZyBjaGFuZ2VzXG4gICAgICBjb250ZW50czogJ3dyaXRlJyxcbiAgICB9LFxuICAgIGpvYnM6IHtcbiAgICAgIHN5bmM6IHsgdXNlczogJ1dpbGxCb29zdGVyL3JldXNhYmxlLXdvcmtmbG93cy8uZ2l0aHViL3dvcmtmbG93cy9zeW5jLnltbEBtYWluJyB9LFxuICAgIH0sXG4gIH0sXG4gICdjbG9zZS1jb21tZW50Jzoge1xuICAgIG5hbWU6ICdBZGQgY2xvc2UgY29tbWVudCcsXG4gICAgb246IHtcbiAgICAgIHB1bGxfcmVxdWVzdDoge1xuICAgICAgICB0eXBlczogWydvcGVuZWQnXSxcbiAgICAgIH0sXG4gICAgfSxcbiAgICBqb2JzOiB7XG4gICAgICAnY2xvc2UtY29tbWVudCc6IHtcbiAgICAgICAgdXNlczogJ1dpbGxCb29zdGVyL3JldXNhYmxlLXdvcmtmbG93cy8uZ2l0aHViL3dvcmtmbG93cy9jbG9zZS1jb21tZW50LnltbEBtYWluJyxcbiAgICAgIH0sXG4gICAgfSxcbiAgfSxcbn0gYXMgY29uc3Q7XG5cbnR5cGUgS25vd25LaW5kID0ga2V5b2YgdHlwZW9mIHdvcmtmbG93cyB8ICdkZXBsb3knO1xuXG4vKipcbiAqIFBhcnNlcyBhIGB1c2VzOmAgdmFsdWUgY2FsbGluZyBvbmUgb2YgV2lsbEJvb3N0ZXIncyBvd24gcmV1c2FibGUgd29ya2Zsb3dzIChvciB0aGVcbiAqIFdpbGxCb29zdGVyTGFiIHN5bmMgbWlycm9yKSBpbnRvIHRoZSB3b3JrZmxvdyBuYW1lICh3aXRob3V0IGV4dGVuc2lvbikgYW5kIGdpdCByZWYuIE9ubHkgdGhvc2VcbiAqIGZvbGxvdyB0aGUgY29udHJhY3Qgd2JmeSBlbmZvcmNlcyDigJQgY2FsbGVycyBvZiBhbm90aGVyIG9yZ2FuaXphdGlvbidzIHNhbWUtbmFtZWQgcmVwb3NpdG9yeSBhcmVcbiAqIGxlZnQgYWxvbmUuIEdpdEh1YiB0cmVhdHMgb3duZXIvcmVwb3NpdG9yeSBuYW1lcyBjYXNlLWluc2Vuc2l0aXZlbHksIHNvIHRoZSBjb21wYXJpc29uIGRvZXNcbiAqIHRvbywgd2hpbGUgdGhlIHdvcmtmbG93IHBhdGggYW5kIHJlZiBzdGF5IGNhc2Utc2Vuc2l0aXZlLlxuICovXG5mdW5jdGlvbiBwYXJzZU9yZ1JldXNhYmxlV29ya2Zsb3dDYWxsKFxuICB1c2VzOiBzdHJpbmcgfCB1bmRlZmluZWRcbik6IHsgd29ya2Zsb3dOYW1lOiBzdHJpbmc7IGV4dGVuc2lvbjogc3RyaW5nOyByZWY6IHN0cmluZyB9IHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgbWF0Y2ggPSAvXihbXi9dKylcXC8oW14vXSspXFwvXFwuZ2l0aHViXFwvd29ya2Zsb3dzXFwvKFteL0BdKz8pXFwuKHlhP21sKUAoLispJC91LmV4ZWModXNlcyA/PyAnJyk7XG4gIGlmICghbWF0Y2gpIHJldHVybiB1bmRlZmluZWQ7XG4gIGNvbnN0IG93bmVyID0gbWF0Y2hbMV0hLnRvTG93ZXJDYXNlKCk7XG4gIGlmICgob3duZXIgIT09ICd3aWxsYm9vc3RlcicgJiYgb3duZXIgIT09ICd3aWxsYm9vc3RlcmxhYicpIHx8IG1hdGNoWzJdIS50b0xvd2VyQ2FzZSgpICE9PSAncmV1c2FibGUtd29ya2Zsb3dzJykge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cbiAgcmV0dXJuIHsgd29ya2Zsb3dOYW1lOiBtYXRjaFszXSEsIGV4dGVuc2lvbjogbWF0Y2hbNF0hLCByZWY6IG1hdGNoWzVdISB9O1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVXb3JrZmxvd3Mocm9vdENvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2dlbmVyYXRlV29ya2Zsb3cnLCBhc3luYyAoKSA9PiB7XG4gICAgaWYgKGlzUmV1c2FibGVXb3JrZmxvd3NSZXBvKHJvb3RDb25maWcucmVwb3NpdG9yeSkpIHtcbiAgICAgIC8vIERvbid0IHRvdWNoIHJldXNhYmxlLXdvcmtmbG93cyByZXBvIGJlY2F1c2UgaXQgaG9zdHMgdXBzdHJlYW0gd29ya2Zsb3cgZGVmaW5pdGlvbnMuXG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3Qgd29ya2Zsb3dzUGF0aCA9IHBhdGgucmVzb2x2ZShyb290Q29uZmlnLmRpclBhdGgsICcuZ2l0aHViJywgJ3dvcmtmbG93cycpO1xuICAgIC8vIFdpdGggLmdpdGh1YiBvciAuZ2l0aHViL3dvcmtmbG93cyBzeW1saW5rZWQgb3V0c2lkZSB0aGUgcmVwb3NpdG9yeSwgd3JpdGVZYW1sJ3MgZ3VhcmRzXG4gICAgLy8gYWxyZWFkeSByZWZ1c2UgdGhlIHdyaXRlcywgYnV0IHJlYWRkaXIvcm0gYmVsb3cgd291bGQgc3RpbGwgZW51bWVyYXRlIGFuZCBERUxFVEUgZmlsZXNcbiAgICAvLyBvdXRzaWRlIHRoZSByZXBvc2l0b3J5IOKAlCBzbyByZXF1aXJlIHRoZSBkaXJlY3RvcnkgdG8gcmVzb2x2ZSBpbnNpZGUgaXQgYmVmb3JlIGFueVxuICAgIC8vIHRyYXZlcnNhbCwgbWtkaXIsIG9yIGNsZWFudXAuXG4gICAgaWYgKCEoYXdhaXQgZnNVdGlsLmlzQ29uZmluZWRXcml0YWJsZVBhdGgod29ya2Zsb3dzUGF0aCkpKSB7XG4gICAgICBjb25zb2xlLndhcm4oYFNraXBwZWQgZ2VuZXJhdGluZyB3b3JrZmxvd3MgYmVjYXVzZSAke3dvcmtmbG93c1BhdGh9IHJlc29sdmVzIG91dHNpZGUgdGhlIHJlcG9zaXRvcnkuYCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGF3YWl0IGZzLnByb21pc2VzLm1rZGlyKHdvcmtmbG93c1BhdGgsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuXG4gICAgY29uc3QgZW50cmllcyA9IGF3YWl0IGZzLnByb21pc2VzLnJlYWRkaXIod29ya2Zsb3dzUGF0aCwgeyB3aXRoRmlsZVR5cGVzOiB0cnVlIH0pO1xuICAgIC8vIHdiZnkgd3JpdGVzIC55bWwgd29ya2Zsb3dzLCBzbyBlYWNoIGtpbmQgbWFwcyB0byBpdHMgLnltbCBmaWxlLlxuICAgIGNvbnN0IGZpbGVOYW1lc0J5S2luZCA9IG5ldyBNYXA8c3RyaW5nLCBzdHJpbmc+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/LnN0YXJ0c1dpdGgoJ2dpdGh1YjpXaWxsQm9vc3Rlci8nKSkge1xuICAgIGpvYi51c2VzID0gYFdpbGxCb29zdGVyL3JldXNhYmxlLXdvcmtmbG93cy8uZ2l0aHViL3dvcmtmbG93cy8ke29yZ1dvcmtmbG93Q2FsbC53b3JrZmxvd05hbWV9LiR7b3JnV29ya2Zsb3dDYWxsLmV4dGVuc2lvbn1AJHtvcmdXb3JrZmxvd0NhbGwucmVmfWA7XG4gIH0gZWxzZSBpZiAob3JnV29ya2Zsb3dDYWxsICYmIGNvbmZpZy5yZXBvc2l0b3J5Py5zdGFydHNXaXRoKCdnaXRodWI6V2lsbEJvb3N0ZXJMYWIvJykpIHtcbiAgICBqb2IudXNlcyA9IGBXaWxsQm9vc3RlckxhYi9yZXVzYWJsZS13b3JrZmxvd3MvLmdpdGh1Yi93b3JrZmxvd3MvJHtvcmdXb3JrZmxvd0NhbGwud29ya2Zsb3dOYW1lfS4ke29yZ1dvcmtmbG93Q2FsbC5leHRlbnNpb259QCR7b3JnV29ya2Zsb3dDYWxsLnJlZn1gO1xuICB9XG5cbiAgaWYgKGNvbmZpZy5kb2VzQ29udGFpbkRvY2tlcmZpbGUgJiYgIWpvYi53aXRoLmNpX2xhYmVsICYmIGtpbmQuc3RhcnRzV2l0aCgndGVzdCcpKSB7XG4gICAgam9iLndpdGguY2lfbGFiZWwgPSAnbGFyZ2UnO1xuICB9XG4gIC8vIEJlY2F1c2UgZ2l0aHViLmV2ZW50LnJlcG9zaXRvcnkucHJpdmF0ZSBpcyBhbHdheXMgdHJ1ZSBpZiBqb2IgaXMgc2NoZWR1bGVkXG4gIGlmIChraW5kID09PSAncmVsZWFzZScgfHwga2luZC5zdGFydHNXaXRoKCd0ZXN0JykgfHwga2luZC5zdGFydHNXaXRoKCdkZXBsb3knKSkge1xuICAgIGlmIChjb25maWcuaXNQdWJsaWNSZXBvKSB7XG4gICAgICBqb2Iud2l0aC5naXRodWJfaG9zdGVkX3J1bm5lciA9IHRydWU7XG4gICAgfVxuICAgIC8vIEFuIGV4aXN0aW5nIGdpdGh1Yl9ob3N0ZWRfcnVubmVyIG9uIGEgUFJJVkFURSByZXBvc2l0b3J5IGlzIHByZXNlcnZlZCBvbiBwdXJwb3NlOiB0aGUgaW5wdXRcbiAgICAvLyBleGlzdHMgcHJlY2lzZWx5IHNvIGEgcHJpdmF0ZSBjYWxsZXIgY2FuIG9wdCBpbnRvIEdpdEh1Yi1ob3N0ZWQgcnVubmVycywgYW5kIHdiZnkgbXVzdCBub3RcbiAgICAvLyByZXZlcnQgdGhhdCBtYW51YWwgY2hvaWNlIChvbmx5IHRoZSBvdGhlciBraW5kcyBiZWxvdyBuZXZlciB0YWtlIHRoZSBpbnB1dCkuXG4gIH0gZWxzZSB7XG4gICAgZGVsZXRlIGpvYi53aXRoLmdpdGh1Yl9ob3N0ZWRfcnVubmVyO1xuICB9XG5cbiAgaWYgKE9iamVjdC5rZXlzKGpvYi53aXRoKS5sZW5ndGggPiAwKSB7XG4gICAgc29ydEtleXMoam9iLndpdGgpO1xuICB9IGVsc2Uge1xuICAgIGRlbGV0ZSBqb2Iud2l0aDtcbiAgfVxuICBpZiAoc2VjcmV0cykge1xuICAgIGlmIChPYmplY3Qua2V5cyhzZWNyZXRzKS5sZW5ndGggPiAwKSB7XG4gICAgICBjb25zdCBuZXdTZWNyZXRzID0gc29ydEtleXMoc2VjcmV0cyk7XG4gICAgICBkZWxldGUgam9iLnNlY3JldHM7XG4gICAgICBqb2Iuc2VjcmV0cyA9IG5ld1NlY3JldHM7XG4gICAgfSBlbHNlIHtcbiAgICAgIGRlbGV0ZSBqb2Iuc2VjcmV0cztcbiAgICB9XG4gIH1cbn1cblxuLyoqXG4gKiBUaGUgc2VjcmV0IGV4cHJlc3Npb24gdGhlIGNhbGxlciBtYXBzIGludG8gdGhlIGNhbGxlZSdzIGRlY2xhcmVkIEZOT1hfQUdFX0tFWSwgb3IgdW5kZWZpbmVkXG4gKiB3aGVuIHRoZSByZXBvc2l0b3J5IHN0YXRlIGRvZXMgbm90IGlkZW50aWZ5IGEgdXNhYmxlIENJIGlkZW50aXR5IOKAlCBhbiB1bmtub3duIHZpc2liaWxpdHksIGFcbiAqIHJlcG9zaXRvcnkgbm8gQ0kgc2NvcGUgY292ZXJzIChkZXJpdmluZyBmcm9tIHRoZSBzYW1lIHByaW5jaXBhbCByb3N0ZXIgYXMgdGhlIHJlY2lwaWVudCBzeW5jXG4gKiBrZWVwcyB0aGUgdHdvIGZyb20gZXZlciBkaXNhZ3JlZWluZyksIG9yIGEgZmFpbGVkIGZub3ggcmVjaXBpZW50IHN5bmMsIHdob3NlIGNpcGhlcnRleHRzIG1heVxuICogc3RpbGwgdGFyZ2V0IHRoZSBwcmV2aW91cyBpZGVudGl0eS4gVGhlIGNhbGxlciBtdXN0IHRoZW4gcHJlc2VydmUgYW55IGV4aXN0aW5nIG1hcHBpbmcuXG4gKi9cbmZ1bmN0aW9uIGZub3hBZ2VLZXlNYXBwaW5nKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGlmICghY29uZmlnLmlzUmVwb1Zpc2liaWxpdHlLbm93biB8fCBoYXNGbm94U3luY0ZhaWxlZCgpKSByZXR1cm4gdW5kZWZpbmVkO1xuICBjb25zdCBzZWNyZXROYW1lID0gcmVzb2x2ZUZub3hDaUFnZUtleVNlY3JldE5hbWUoY29uZmlnKTtcbiAgcmV0dXJuIHNlY3JldE5hbWUgJiYgYFxcJHt7IHNlY3JldHMuJHtzZWNyZXROYW1lfSB9fWA7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHdyaXRlWWFtbChuZXdTZXR0aW5nczogV29ya2Zsb3csIGZpbGVQYXRoOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgLy8gQSBwZXJtaXNzaW9ucyBvYmplY3QgZW1wdGllZCBieSB0aGUgcGVyLWtpbmQgZGVsZXRpb25zIChlLmcuIGFuIGV4aXN0aW5nIHRlc3QtcnVzdCBjYWxsZXJcbiAgLy8gd2hvc2Ugb25seSBlbnRyeSB3YXMgYGFjdGlvbnNgKSBtdXN0IGJlIGRyb3BwZWQgZW50aXJlbHk6IGBwZXJtaXNzaW9uczoge31gIHN0cmlwcyBFVkVSWVxuICAvLyB0b2tlbiBwZXJtaXNzaW9uIGZyb20gdGhlIHdvcmtmbG93LCB1bmxpa2UgdGhlIGFic2VudCBrZXkgd2hpY2gga2VlcHMgdGhlIGRlZmF1bHRzLlxuICBpZiAobmV3U2V0dGluZ3MucGVybWlzc2lvbnMgJiYgT2JqZWN0LmtleXMobmV3U2V0dGluZ3MucGVybWlzc2lvbnMpLmxlbmd0aCA9PT0gMCkge1xuICAgIGRlbGV0ZSBuZXdTZXR0aW5ncy5wZXJtaXNzaW9ucztcbiAgfVxuICBjb25zdCB5YW1sVGV4dCA9IHlhbWwuZHVtcChuZXdTZXR0aW5ncywgeyBsaW5lV2lkdGg6IC0xIH0pO1xuICBhd2FpdCBmc1V0aWwud3JpdGVGaWxlQ29uZmluZWQoZmlsZVBhdGgsIHlhbWxUZXh0KTtcbn1cbiIsImltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB7IGdsb2JJZ25vcmUgfSBmcm9tICdAd2lsbGJvb3N0ZXIvc2hhcmVkLWxpYi1ub2RlL3NyYyc7XG5pbXBvcnQgZmcgZnJvbSAnZmFzdC1nbG9iJztcblxuaW1wb3J0IHsgaXNSZXVzYWJsZVdvcmtmbG93c1JlcG8gfSBmcm9tICcuLi9nZW5lcmF0b3JzL3dvcmtmbG93LmpzJztcbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgeyBvcHRpb25zIH0gZnJvbSAnLi4vb3B0aW9ucy5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGZzVXRpbCB9IGZyb20gJy4uL3V0aWxzL2ZzVXRpbC5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcbmltcG9ydCB7IGdldFdvcmtzcGFjZURpclBhdHRlcm5zIH0gZnJvbSAnLi4vdXRpbHMvd29ya3NwYWNlVXRpbC5qcyc7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBmaXhUeXBvcyhwYWNrYWdlQ29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZml4VHlwb3MnLCBhc3luYyAoKSA9PiB7XG4gICAgaWYgKGlzUmV1c2FibGVXb3JrZmxvd3NSZXBvKHBhY2thZ2VDb25maWcucmVwb3NpdG9yeSkpIHJldHVybjtcblxuICAgIGNvbnN0IGRpclBhdGggPSBwYWNrYWdlQ29uZmlnLmRpclBhdGg7XG4gICAgY29uc3QgZG9jRmlsZXMgPSBhd2FpdCBmZy5nbG9iKCcqKi8qLm1kJywgeyBkb3Q6IHRydWUsIGN3ZDogZGlyUGF0aCwgaWdub3JlOiBnbG9iSWdub3JlIH0pO1xuICAgIGlmIChvcHRpb25zLmlzVmVyYm9zZSkge1xuICAgICAgY29uc29sZS5pbmZvKGBGb3VuZCAke2RvY0ZpbGVzLmxlbmd0aH0gbWFya2Rvd24gZmlsZXMgaW4gJHtkaXJQYXRofWApO1xuICAgIH1cbiAgICBmb3IgKGNvbnN0IG1kRmlsZSBvZiBkb2NGaWxlcykge1xuICAgICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLmpvaW4oZGlyUGF0aCwgbWRGaWxlKTtcbiAgICAgIHZvaWQgcHJvbWlzZVBvb2wucnVuKGFzeW5jICgpID0+IHtcbiAgICAgICAgY29uc3QgY29udGVudCA9IGF3YWl0IGZzVXRpbC5yZWFkRmlsZUlmRXhpc3RzKGZpbGVQYXRoKTtcbiAgICAgICAgaWYgKGNvbnRlbnQgPT09IHVuZGVmaW5lZCkgcmV0dXJuO1xuICAgICAgICBsZXQgbmV3Q29udGVudCA9IGZpeFR5cG9zSW5UZXh0KGNvbnRlbnQpO1xuICAgICAgICBuZXdDb250ZW50ID0gcmVwbGFjZVdpdGhDb25maWcobmV3Q29udGVudCwgcGFja2FnZUNvbmZpZywgJ2RvYycpO1xuICAgICAgICBpZiAoY29udGVudCAhPT0gbmV3Q29udGVudCkge1xuICAgICAgICAgIGF3YWl0IGZzVXRpbC5nZW5lcmF0ZUZpbGUoZmlsZVBhdGgsIG5ld0NvbnRlbnQpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICAvLyBmaXhUeXBvcyBydW5zIG9uY2Ugb24gdGhlIHJvb3QgY29uZmlnLCBzbyB0aGlzIGdsb2Igc2V0IG11c3QgY292ZXIgZXZlcnkgZGVjbGFyZWQgd29ya3NwYWNlXG4gICAgLy8gbGF5b3V0IChlLmcuIGFwcHMvKiksIG5vdCBqdXN0IHRoZSBjb252ZW50aW9uYWwgcGFja2FnZXMvKiBkaXJlY3Rvcnkg4oCUIHdoaWxlIGhvbm9yaW5nXG4gICAgLy8gZGVjbGFyZWQgbmVnYXRpb25zIChlLmcuIGAhYXBwcy9leGNsdWRlZGApLCB3aG9zZSBzb3VyY2VzIGFyZSBub3QgcGFydCBvZiB0aGUgbW9ub3JlcG8uXG4gICAgY29uc3Qgd29ya3NwYWNlRGlyUGF0dGVybnMgPSBnZXRXb3Jrc3BhY2VEaXJQYXR0ZXJucyhwYWNrYWdlQ29uZmlnKTtcbiAgICBjb25zdCB0c0ZpbGVzID0gYXdhaXQgZmcuZ2xvYihcbiAgICAgIFtcbiAgICAgICAgJ3thcHAsc3JjLHRlc3Qsc2NyaXB0c30vKiovKi57Y2pzLG1qcyxqcyxqc3gsY3RzLG10cyx0cyx0c3h9JyxcbiAgICAgICAgJ3BhY2thZ2VzLyoqL3thcHAsc3JjLHRlc3Qsc2NyaXB0c30vKiovKi57Y2pzLG1qcyxqcyxqc3gsY3RzLG10cyx0cyx0c3h9JyxcbiAgICAgICAgLi4ud29ya3NwYWNlRGlyUGF0dGVybnMuaW5jbHVkZXMubWFwKFxuICAgICAgICAgIChkaXJQYXR0ZXJuKSA9PiBgJHtkaXJQYXR0ZXJufS8qKi97YXBwLHNyYyx0ZXN0LHNjcmlwdHN9LyoqLyoue2NqcyxtanMsanMsanN4LGN0cyxtdHMsdHMsdHN4fWBcbiAgICAgICAgKSxcbiAgICAgIF0sXG4gICAgICB7XG4gICAgICAgIGRvdDogdHJ1ZSxcbiAgICAgICAgY3dkOiBkaXJQYXRoLFxuICAgICAgICBpZ25vcmU6IFsuLi5nbG9iSWdub3JlLCAuLi53b3Jrc3BhY2VEaXJQYXR0ZXJucy5leGNsdWRlcy5tYXAoKGRpclBhdHRlcm4pID0+IGAke2RpclBhdHRlcm59LyoqYCldLFxuICAgICAgfVxuICAgICk7XG4gICAgaWYgKG9wdGlvbnMuaXNWZXJib3NlKSB7XG4gICAgICBjb25zb2xlLmluZm8oYEZvdW5kICR7dHNGaWxlcy5sZW5ndGh9IFR5cGVTY3JpcHQgZmlsZXMgaW4gJHtkaXJQYXRofWApO1xuICAgIH1cbiAgICBmb3IgKGNvbnN0IHRzRmlsZSBvZiB0c0ZpbGVzKSB7XG4gICAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGguam9pbihkaXJQYXRoLCB0c0ZpbGUpO1xuICAgICAgdm9pZCBwcm9taXNlUG9vbC5ydW4oYXN5bmMgKCkgPT4ge1xuICAgICAgICBjb25zdCBvbGRDb250ZW50ID0gYXdhaXQgZnNVdGlsLnJlYWRGaWxlSWZFeGlzdHMoZmlsZVBhdGgpO1xuICAgICAgICBpZiAob2xkQ29udGVudCA9PT0gdW5kZWZpbmVkKSByZXR1cm47XG4gICAgICAgIGxldCBuZXdDb250ZW50ID0gZml4VHlwb3NJbkNvZGUob2xkQ29udGVudCk7XG4gICAgICAgIG5ld0NvbnRlbnQgPSByZXBsYWNlV2l0aENvbmZpZyhuZXdDb250ZW50LCBwYWNrYWdlQ29uZmlnLCAndHMnKTtcblxuICAgICAgICBpZiAob2xkQ29udGVudCAhPT0gbmV3Q29udGVudCkge1xuICAgICAgICAgIGF3YWl0IGZzVXRpbC5nZW5lcmF0ZUZpbGUoZmlsZVBhdGgsIG5ld0NvbnRlbnQpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBjb25zdCB0ZXh0QmFzZWRGaWxlcyA9IGF3YWl0IGZnLmdsb2IoJyoqLyoue2NzdixodG0saHRtbCx0c3YseG1sLHlhbWwseW1sfScsIHtcbiAgICAgIGRvdDogdHJ1ZSxcbiAgICAgIGN3ZDogZGlyUGF0aCxcbiAgICAgIGlnbm9yZTogZ2xvYklnbm9yZSxcbiAgICB9KTtcbiAgICBpZiAob3B0aW9ucy5pc1ZlcmJvc2UpIHtcbiAgICAgIGNvbnNvbGUuaW5mbyhgRm91bmQgJHt0ZXh0QmFzZWRGaWxlcy5sZW5ndGh9IHRleHQtYmFzZWQgZmlsZXMgaW4gJHtkaXJQYXRofWApO1xuICAgIH1cbiAgICBmb3IgKGNvbnN0IGZpbGUgb2YgdGV4dEJhc2VkRmlsZXMpIHtcbiAgICAgIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5qb2luKGRpclBhdGgsIGZpbGUpO1xuICAgICAgdm9pZCBwcm9taXNlUG9vbC5ydW4oYXN5bmMgKCkgPT4ge1xuICAgICAgICBjb25zdCBvbGRDb250ZW50ID0gYXdhaXQgZnNVdGlsLnJlYWRGaWxlSWZFeGlzdHMoZmlsZVBhdGgpO1xuICAgICAgICBpZiAob2xkQ29udGVudCA9PT0gdW5kZWZpbmVkKSByZXR1cm47XG4gICAgICAgIGxldCBuZXdDb250ZW50ID0gZml4VHlwb3NJblRleHQob2xkQ29udGVudCk7XG4gICAgICAgIG5ld0NvbnRlbnQgPSByZXBsYWNlV2l0aENvbmZpZyhuZXdDb250ZW50LCBwYWNrYWdlQ29uZmlnLCAndGV4dCcpO1xuXG4gICAgICAgIGlmIChvbGRDb250ZW50ICE9PSBuZXdDb250ZW50KSB7XG4gICAgICAgICAgYXdhaXQgZnNVdGlsLmdlbmVyYXRlRmlsZShmaWxlUGF0aCwgbmV3Q29udGVudCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGF3YWl0IHByb21pc2VQb29sLnByb21pc2VBbGwoKTtcbiAgfSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBmaXhUeXBvc0luVGV4dChjb250ZW50OiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gY29udGVudFxuICAgIC5yZXBsYWNlQWxsKC9cXGJjXFwuZlxcLig/PVxcc3wkKS9nLCAnY2YuJylcbiAgICAucmVwbGFjZUFsbCgvXFxiZWdcXC4oPz1cXHN8JCkvZywgJ2UuZy4nKVxuICAgIC5yZXBsYWNlQWxsKC9cXGJpZVxcLig/PVxccykvZywgJ2kuZS4nKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGZpeFR5cG9zSW5Db2RlKGNvbnRlbnQ6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiAoXG4gICAgY29udGVudFxuICAgICAgLnJlcGxhY2VBbGwoL1xcL1xcKltcXHNcXFNdKj9cXCpcXC8vZywgKGNvbW1lbnQpID0+IGZpeFR5cG9zSW5UZXh0KGNvbW1lbnQpKVxuICAgICAgLy8gVGhlIHdvcmQgYm91bmRhcnkgYW5kIHRyYWlsaW5nLXdoaXRlc3BhY2UgZ3VhcmQga2VlcCB3b3JkcyBtZXJlbHkgZW5kaW5nIGluIHRoZVxuICAgICAgLy8gYWJicmV2aWF0aW9uIGxldHRlcnMgKGUuZy4gXCJjb29raWUuXCIsIFwibGVnLlwiKSBpbnRhY3QuXG4gICAgICAucmVwbGFjZUFsbCgvKF58XFxzKVxcL1xcLyguKj8pXFxiY1xcLmZcXC4oPz1cXHN8JCkvZywgJyQxLy8kMmNmLicpXG4gICAgICAucmVwbGFjZUFsbCgvKF58XFxzKVxcL1xcLyguKj8pXFxiZWdcXC4oPz1cXHN8JCkvZywgJyQxLy8kMmUuZy4nKVxuICAgICAgLnJlcGxhY2VBbGwoLyhefFxccylcXC9cXC8oLio/KVxcYmllXFwuKD89XFxzfCQpL2csICckMS8vJDJpLmUuJylcbiAgKTtcbn1cblxuZnVuY3Rpb24gcmVwbGFjZVdpdGhDb25maWcobmV3Q29udGVudDogc3RyaW5nLCBwYWNrYWdlQ29uZmlnOiBQYWNrYWdlQ29uZmlnLCBwcm9wTmFtZTogJ2RvYycgfCAndHMnIHwgJ3RleHQnKTogc3RyaW5nIHtcbiAgZm9yIChjb25zdCBbYmVmb3JlLCBhZnRlcl0gb2YgT2JqZWN0LmVudHJpZXMocGFja2FnZUNvbmZpZy53YmZ5SnNvbj8udHlwb3M/LmFsbCA/PyB7fSkpIHtcbiAgICBuZXdDb250ZW50ID0gbmV3Q29udGVudC5yZXBsYWNlQWxsKGJlZm9yZSwgYWZ0ZXIpO1xuICB9XG4gIGZvciAoY29uc3QgW2JlZm9yZSwgYWZ0ZXJdIG9mIE9iamVjdC5lbnRyaWVzKHBhY2thZ2VDb25maWcud2JmeUpzb24/LnR5cG9zPy5bcHJvcE5hbWVdID8/IHt9KSkge1xuICAgIG5ld0NvbnRlbnQgPSBuZXdDb250ZW50LnJlcGxhY2VBbGwoYmVmb3JlLCBhZnRlcik7XG4gIH1cbiAgcmV0dXJuIG5ld0NvbnRlbnQ7XG59XG4iLCJpbXBvcnQgY2hpbGRQcm9jZXNzIGZyb20gJ25vZGU6Y2hpbGRfcHJvY2Vzcyc7XG5cbmltcG9ydCB7IE9jdG9raXQgfSBmcm9tICdAb2N0b2tpdC9jb3JlJztcblxuY2xhc3MgR2l0SHViVXRpbCB7XG4gIGdldE9yZ0FuZE5hbWUodXJsT3JGdWxsTmFtZTogc3RyaW5nKTogW3N0cmluZywgc3RyaW5nXSB7XG4gICAgY29uc3QgdXJsV2l0aG91dFByb3RvY29sID0gdXJsT3JGdWxsTmFtZS5zcGxpdCgnOicpLmF0KC0xKTtcbiAgICBjb25zdCBuYW1lcyA9IHVybFdpdGhvdXRQcm90b2NvbD8uc3BsaXQoJy8nKTtcbiAgICBjb25zdCBvcmcgPSBuYW1lcz8uYXQoLTIpID8/ICcnO1xuICAgIC8vIFRoZSBkb3QgbXVzdCBiZSBlc2NhcGVkOiBhbiB1bmVzY2FwZWQgYC5gIG1hdGNoZXMgQU5ZIGNoYXJhY3Rlciwgc28gYGxlZ2l0YCBsb3N0IGl0cyBgbGAgYW5kIGBlYC5cbiAgICBjb25zdCBuYW1lID0gbmFtZXM/LmF0KC0xKT8ucmVwbGFjZSgvXFwuZ2l0JC91LCAnJykgPz8gJyc7XG4gICAgcmV0dXJuIFtvcmcsIG5hbWVdO1xuICB9XG59XG5leHBvcnQgY29uc3QgZ2l0SHViVXRpbCA9IG5ldyBHaXRIdWJVdGlsKCk7XG5cbmV4cG9ydCBmdW5jdGlvbiBpc0dpdEh1YlBlcm1pc3Npb25PclZpc2liaWxpdHlFcnJvcihlcnJvcjogdW5rbm93bik6IGJvb2xlYW4ge1xuICBpZiAoIWVycm9yIHx8IHR5cGVvZiBlcnJvciAhPT0gJ29iamVjdCcpIHJldHVybiBmYWxzZTtcbiAgY29uc3Qgc3RhdHVzID0gKGVycm9yIGFzIHsgc3RhdHVzPzogbnVtYmVyIH0pLnN0YXR1cztcbiAgcmV0dXJuIHN0YXR1cyA9PT0gNDAxIHx8IHN0YXR1cyA9PT0gNDAzIHx8IHN0YXR1cyA9PT0gNDA0O1xufVxuXG5jb25zdCBvY3Rva2l0Q2FjaGUgPSBuZXcgTWFwPHN0cmluZywgT2N0b2tpdD4oKTtcblxuZXhwb3J0IGZ1bmN0aW9uIGdldE9jdG9raXQob3duZXI/OiBzdHJpbmcpOiBPY3Rva2l0IHtcbiAgLy8gR2l0SHViIG93bmVyIG5hbWVzIGFyZSBjYXNlLWluc2Vuc2l0aXZlLCBzbyBjcmVkZW50aWFsIHNlbGVjdGlvbiAoYW5kIHRoZSBjYWNoZSBrZXkpIG11c3RcbiAgLy8gbm90IGRlcGVuZCBvbiBob3cgYSByZW1vdGUgVVJMIGhhcHBlbnMgdG8gc3BlbGwgdGhlIG9yZ2FuaXphdGlvbi5cbiAgY29uc3Qga2V5ID0gb3duZXI/LnRvTG93ZXJDYXNlKCkgPz8gJyc7XG4gIGNvbnN0IGNhY2hlZCA9IG9jdG9raXRDYWNoZS5nZXQoa2V5KTtcbiAgaWYgKGNhY2hlZCkgcmV0dXJuIGNhY2hlZDtcblxuICBjb25zdCBvY3Rva2l0ID0gbmV3IE9jdG9raXQoe1xuICAgIGF1dGg6IGdldEdpdEh1YlRva2VuKG93bmVyKSB8fCB1bmRlZmluZWQsXG4gIH0pO1xuICBvY3Rva2l0Q2FjaGUuc2V0KGtleSwgb2N0b2tpdCk7XG4gIHJldHVybiBvY3Rva2l0O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaGFzR2l0SHViVG9rZW4ob3duZXI6IHN0cmluZyk6IGJvb2xlYW4ge1xuICByZXR1cm4gISFnZXRHaXRIdWJUb2tlbihvd25lcik7XG59XG5cbmZ1bmN0aW9uIGdldEdpdEh1YlRva2VuKG93bmVyPzogc3RyaW5nKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgLy8gQ2FzZS1pbnNlbnNpdGl2ZSBvbiBwdXJwb3NlOiBhIG5vbmNhbm9uaWNhbGx5IGNhc2VkIHJlbW90ZSAoZS5nLiBnaXRodWIuY29tL3dpbGxib29zdGVybGFiL+KApilcbiAgLy8gbXVzdCBzdGlsbCBzZWxlY3QgdGhlIG9yZ2FuaXphdGlvbidzIG93biBQQVQg4oCUIGZhbGxpbmcgdGhyb3VnaCB0byB0aGUgZ2VuZXJpYyBicmFuY2ggd291bGRcbiAgLy8gcHJlZmVyIHRoZSBPVEhFUiBvcmdhbml6YXRpb24ncyBQQVQsIHdoaWNoIGNhbm5vdCByZWFkIHRoaXMgb3JnYW5pemF0aW9uJ3MgcHJpdmF0ZVxuICAvLyByZXBvc2l0b3JpZXMuXG4gIGNvbnN0IG5vcm1hbGl6ZWRPd25lciA9IG93bmVyPy50b0xvd2VyQ2FzZSgpO1xuICBpZiAobm9ybWFsaXplZE93bmVyID09PSAnd2lsbGJvb3N0ZXInKSB7XG4gICAgcmV0dXJuIHByb2Nlc3MuZW52LkdIX0JPVF9QQVRfRk9SX1dJTExCT09TVEVSIHx8IGdldEdpdEh1YkNsaVRva2VuKCk7XG4gIH1cbiAgaWYgKG5vcm1hbGl6ZWRPd25lciA9PT0gJ3dpbGxib29zdGVybGFiJykge1xuICAgIHJldHVybiBwcm9jZXNzLmVudi5HSF9CT1RfUEFUX0ZPUl9XSUxMQk9PU1RFUkxBQiB8fCBnZXRHaXRIdWJDbGlUb2tlbigpO1xuICB9XG4gIHJldHVybiAoXG4gICAgcHJvY2Vzcy5lbnYuR0hfQk9UX1BBVF9GT1JfV0lMTEJPT1NURVIgfHxcbiAgICBwcm9jZXNzLmVudi5HSF9CT1RfUEFUX0ZPUl9XSUxMQk9PU1RFUkxBQiB8fFxuICAgIHByb2Nlc3MuZW52LkdIX1RPS0VOIHx8XG4gICAgcHJvY2Vzcy5lbnYuR0lUSFVCX1RPS0VOIHx8XG4gICAgZ2V0R2l0SHViQ2xpVG9rZW4oKVxuICApO1xufVxuXG5sZXQgZ2l0SHViQ2xpVG9rZW46IHN0cmluZyB8IHVuZGVmaW5lZDtcblxuZnVuY3Rpb24gZ2V0R2l0SHViQ2xpVG9rZW4oKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgaWYgKGdpdEh1YkNsaVRva2VuICE9PSB1bmRlZmluZWQpIHJldHVybiBnaXRIdWJDbGlUb2tlbiB8fCB1bmRlZmluZWQ7XG5cbiAgdHJ5IHtcbiAgICAvLyBTb21lIGxvY2FsIHJ1bnMgcmVseSBvbiBHaXRIdWIgQ0xJIGF1dGhlbnRpY2F0aW9uIGluc3RlYWQgb2YgZXhwb3J0ZWQgZW52IHRva2Vucy5cbiAgICBnaXRIdWJDbGlUb2tlbiA9XG4gICAgICBjaGlsZFByb2Nlc3NcbiAgICAgICAgLmV4ZWNGaWxlU3luYygnZ2gnLCBbJ2F1dGgnLCAndG9rZW4nXSwge1xuICAgICAgICAgIGVuY29kaW5nOiAndXRmOCcsXG4gICAgICAgICAgc3RkaW86IFsnaWdub3JlJywgJ3BpcGUnLCAnaWdub3JlJ10sXG4gICAgICAgIH0pXG4gICAgICAgIC50cmltKCkgfHwgJyc7XG4gIH0gY2F0Y2gge1xuICAgIGdpdEh1YkNsaVRva2VuID0gJyc7XG4gIH1cbiAgcmV0dXJuIGdpdEh1YkNsaVRva2VuIHx8IHVuZGVmaW5lZDtcbn1cbiIsImltcG9ydCB0eXBlIHsgUGFyc2VFcnJvciB9IGZyb20gJ2pzb25jLXBhcnNlcic7XG5pbXBvcnQgeyBhcHBseUVkaXRzLCBjcmVhdGVTY2FubmVyLCBmaW5kTm9kZUF0TG9jYXRpb24sIG1vZGlmeSwgcGFyc2UgYXMgcGFyc2VKc29uYywgcGFyc2VUcmVlIH0gZnJvbSAnanNvbmMtcGFyc2VyJztcblxuLy8ganNvbmMtcGFyc2VyIGRlY2xhcmVzIFN5bnRheEtpbmQvU2NhbkVycm9yIGFzIGFtYmllbnQgY29uc3QgZW51bXMsIHdoaWNoIGNhbm5vdCBiZSBpbXBvcnRlZFxuLy8gdW5kZXIgdmVyYmF0aW1Nb2R1bGVTeW50YXg7IG1pcnJvciB0aGUgbmVlZGVkIG1lbWJlciB2YWx1ZXMgbG9jYWxseS5cbmNvbnN0IHN5bnRheEtpbmQgPSB7IGxpbmVDb21tZW50VHJpdmlhOiAxMiwgYmxvY2tDb21tZW50VHJpdmlhOiAxMywgbGluZUJyZWFrVHJpdmlhOiAxNCwgdHJpdmlhOiAxNSwgZW9mOiAxNyB9O1xuY29uc3Qgc2NhbkVycm9yTm9uZSA9IDA7XG5cbmV4cG9ydCBjb25zdCBqc29uY1V0aWwgPSB7XG4gIC8qKlxuICAgKiBUZWxscyB3aGV0aGVyIHRoZSBjb250ZW50IGhvbGRzIG5vIGNvbmZpZ3VyYXRpb24gYXQgYWxsIOKAlCBvbmx5IHdoaXRlc3BhY2UsIGNvbXBsZXRlIGNvbW1lbnRzLFxuICAgKiBhbmQvb3IgYSBCT00uIHRzYyB0cmVhdHMgc3VjaCBhIHRzY29uZmlnLmpzb24gYXMgYW4gZW1wdHkgY29uZmlnLCBzbyBnZW5lcmF0b3JzIHNob3VsZCB0cmVhdFxuICAgKiBpdCBsaWtlIGEgbWlzc2luZyBmaWxlIChhbmQgZ2VuZXJhdGUgZGVmYXVsdHMpIGluc3RlYWQgb2YgcmVmdXNpbmcgdG8gbWFuYWdlIGl0LiBMZXhpY2FsbHlcbiAgICogYnJva2VuIHRyaXZpYSAoZS5nLiBhbiB1bnRlcm1pbmF0ZWQgYmxvY2sgY29tbWVudCkgaXMgTk9UIHRyaXZpYS1vbmx5OiB0aGUgZmlsZSBtdXN0IGJlIGxlZnRcbiAgICogdW50b3VjaGVkIHJhdGhlciB0aGFuIG92ZXJ3cml0dGVuIHdpdGggZGVmYXVsdHMuXG4gICAqL1xuICBpc1RyaXZpYU9ubHkoY29udGVudDogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgY29uc3Qgc2Nhbm5lciA9IGNyZWF0ZVNjYW5uZXIoY29udGVudC5yZXBsYWNlKC9eXFx1RkVGRi8sICcnKSk7XG4gICAgZm9yIChsZXQga2luZDogbnVtYmVyID0gc2Nhbm5lci5zY2FuKCk7IGtpbmQgIT09IHN5bnRheEtpbmQuZW9mOyBraW5kID0gc2Nhbm5lci5zY2FuKCkpIHtcbiAgICAgIGlmIChcbiAgICAgICAgKHNjYW5uZXIuZ2V0VG9rZW5FcnJvcigpIGFzIG51bWJlcikgIT09IHNjYW5FcnJvck5vbmUgfHxcbiAgICAgICAgKGtpbmQgIT09IHN5bnRheEtpbmQubGluZUNvbW1lbnRUcml2aWEgJiZcbiAgICAgICAgICBraW5kICE9PSBzeW50YXhLaW5kLmJsb2NrQ29tbWVudFRyaXZpYSAmJlxuICAgICAgICAgIGtpbmQgIT09IHN5bnRheEtpbmQudHJpdmlhICYmXG4gICAgICAgICAga2luZCAhPT0gc3ludGF4S2luZC5saW5lQnJlYWtUcml2aWEpXG4gICAgICApIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfSxcbiAgLyoqXG4gICAqIFBhcnNlcyBhIEpTT05DIChKU09OIHdpdGggY29tbWVudHMpIG9iamVjdCBmcm9tIGNvbmZpZyBmaWxlcyBzdWNoIGFzIHRzY29uZmlnLmpzb24sXG4gICAqIHB5cmlnaHRjb25maWcuanNvbiwgcmVub3ZhdGUuanNvbiwgLnZzY29kZS9zZXR0aW5ncy5qc29uLCBhbmQgd3JhbmdsZXIuanNvbmMuXG4gICAqXG4gICAqIGpzb25jLXBhcnNlciBpcyBmYXVsdCB0b2xlcmFudCBhbmQgcmV0dXJucyBhIHBhcnRpYWwgb2JqZWN0IGZvciBtYWxmb3JtZWQgaW5wdXQsIHdoaWNoIG11c3RcbiAgICogbm90IGJlIHRyZWF0ZWQgYXMgdGhlIGZpbGUncyBjb25maWd1cmF0aW9uOyByZWplY3QgYW55IHBhcnNlIGVycm9yIGluc3RlYWQuIEEgbGVhZGluZyBCT00gaXNcbiAgICogc3RyaXBwZWQgYmVjYXVzZSBUeXBlU2NyaXB0IGFjY2VwdHMgQk9NJ2QgY29uZmlnIGZpbGVzIHdoaWxlIGpzb25jLXBhcnNlciByZXBvcnRzIHRoZSBCT00gYXNcbiAgICogYSBwYXJzZSBlcnJvci4gQ2FsbGVycyB3aG9zZSByZWFkZXIgcmVqZWN0cyB0cmFpbGluZyBjb21tYXMgdHVybiBgYWxsb3dUcmFpbGluZ0NvbW1hYFxuICAgKiBvZmYgc28gc3VjaCBhIGZpbGUgaXMgcmVwb3J0ZWQgYXMgbWFsZm9ybWVkIGhlcmUgdG9vLlxuICAgKi9cbiAgcGFyc2VPYmplY3RJZ25vcmluZ0Vycm9yPFQgZXh0ZW5kcyBvYmplY3Q+KGNvbnRlbnQ6IHN0cmluZywgYWxsb3dUcmFpbGluZ0NvbW1hID0gdHJ1ZSk6IFQgfCB1bmRlZmluZWQge1xuICAgIGNvbnN0IHBhcnNlRXJyb3JzOiBQYXJzZUVycm9yW10gPSBbXTtcbiAgICBjb25zdCB2YWx1ZSA9IHBhcnNlSnNvbmMoY29udGVudC5yZXBsYWNlKC9eXFx1RkVGRi8sICcnKSwgcGFyc2VFcnJvcnMsIHsgYWxsb3dUcmFpbGluZ0NvbW1hIH0pIGFzIFQgfCB1bmRlZmluZWQ7XG4gICAgcmV0dXJuIHBhcnNlRXJyb3JzLmxlbmd0aCA9PT0gMCAmJiAhIXZhbHVlICYmIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiYgIUFycmF5LmlzQXJyYXkodmFsdWUpXG4gICAgICA/IHZhbHVlXG4gICAgICA6IHVuZGVmaW5lZDtcbiAgfSxcbiAgLyoqIFRlbGxzIHdoZXRoZXIgdGhlIGNvbnRlbnQgY2FycmllcyBhdCBsZWFzdCBvbmUgY29tbWVudCwgaS5lLiBjb250ZW50IEpTT04uc3RyaW5naWZ5IHdvdWxkIGRyb3AuICovXG4gIGNvbnRhaW5zQ29tbWVudChjb250ZW50OiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICBjb25zdCBzY2FubmVyID0gY3JlYXRlU2Nhbm5lcihjb250ZW50LnJlcGxhY2UoL15cXHVGRUZGLywgJycpKTtcbiAgICBmb3IgKGxldCBraW5kOiBudW1iZXIgPSBzY2FubmVyLnNjYW4oKTsga2luZCAhPT0gc3ludGF4S2luZC5lb2Y7IGtpbmQgPSBzY2FubmVyLnNjYW4oKSkge1xuICAgICAgLy8gQSBsZXhpY2FsIGVycm9yIG1lYW5zIHRoZSByZW1haW5pbmcgdG9rZW5zIGFyZSB1bnJlbGlhYmxlOyByZXBvcnQgbm8gY29tbWVudCByYXRoZXIgdGhhblxuICAgICAgLy8gZ3Vlc3NpbmcuIEEgY2FsbGVyIHRoYXQgb25seSB3YXJucyBhYm91dCBkcm9wcGVkIGNvbW1lbnRzIGxvc2VzIG5vdGhpbmcsIGFuZCBvbmUgdGhhdFxuICAgICAgLy8gcmVmdXNlcyBhIGNvbW1lbnRlZCBmaWxlIGZvciBhIHN0cmljdC1KU09OIHJlYWRlciBzdGlsbCByZWplY3RzIHN1Y2ggY29udGVudCB3aGVuIGl0XG4gICAgICAvLyBwYXJzZXMgaXQuXG4gICAgICBpZiAoKHNjYW5uZXIuZ2V0VG9rZW5FcnJvcigpIGFzIG51bWJlcikgIT09IHNjYW5FcnJvck5vbmUpIHJldHVybiBmYWxzZTtcbiAgICAgIGlmIChraW5kID09PSBzeW50YXhLaW5kLmxpbmVDb21tZW50VHJpdmlhIHx8IGtpbmQgPT09IHN5bnRheEtpbmQuYmxvY2tDb21tZW50VHJpdmlhKSByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9LFxuICAvKipcbiAgICogU2VyaWFsaXplcyBgc2V0dGluZ3NgIGludG8gYG9sZENvbnRlbnRgLCBlZGl0aW5nIG9ubHkgdGhlIHRvcC1sZXZlbCBwcm9wZXJ0aWVzIHdob3NlIHZhbHVlc1xuICAgKiBjaGFuZ2VkIHNvIHRoZSBjb21tZW50cyBhbmQgZm9ybWF0dGluZyBvZiBhbiBleGlzdGluZyBmaWxlIHN1cnZpdmUuIENhbGxlcnMgbmV2ZXIgZHJvcFxuICAgKiBwcm9wZXJ0aWVzIChnZW5lcmF0ZWQgc2V0dGluZ3MgYXJlIG1lcmdlZCBPTiBUT1Agb2YgdGhlIGV4aXN0aW5nIG9uZXMpLCBzbyByZW1vdmFscyBhcmUgbm90XG4gICAqIGhhbmRsZWQ6IGEgcHJvcGVydHkgbWlzc2luZyBmcm9tIGBzZXR0aW5nc2AgaXMgbGVmdCB1bnRvdWNoZWQgcmF0aGVyIHRoYW4gZGVsZXRlZC5cbiAgICpcbiAgICogVHJpdmlhLW9ubHkgY29udGVudCBrZWVwcyBpdHMgY29tbWVudHMgYXMgYSBoZWFkZXIgYWJvdmUgdGhlIGdlbmVyYXRlZCBvYmplY3QsIHJhdGhlciB0aGFuXG4gICAqIGJlaW5nIHJlcGxhY2VkIG91dHJpZ2h0IG9yIHJ1biB0aHJvdWdoIG1vZGlmeSgpICh3aGljaCB3b3VsZCBtb3ZlIHRoZSBvYmplY3QgaW4gZnJvbnQgb2YgdGhlbSkuXG4gICAqL1xuICBzdHJpbmdpZnlQcmVzZXJ2aW5nVHJpdmlhKFxuICAgIG9sZENvbnRlbnQ6IHN0cmluZyB8IHVuZGVmaW5lZCxcbiAgICBzZXR0aW5nczogUmVjb3JkPHN0cmluZywgdW5rbm93bj5cbiAgKTogeyBjb250ZW50OiBzdHJpbmc7IGtleXNMb3NpbmdDb21tZW50czogc3RyaW5nW10gfSB7XG4gICAgaWYgKG9sZENvbnRlbnQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuIHsgY29udGVudDogSlNPTi5zdHJpbmdpZnkoc2V0dGluZ3MsIHVuZGVmaW5lZCwgMiksIGtleXNMb3NpbmdDb21tZW50czogW10gfTtcbiAgICB9XG5cbiAgICBjb25zdCBvbGRTZXR0aW5ncyA9IGpzb25jVXRpbC5wYXJzZU9iamVjdElnbm9yaW5nRXJyb3I8UmVjb3JkPHN0cmluZywgdW5rbm93bj4+KG9sZENvbnRlbnQpO1xuICAgIC8vIERyb3AgYSBsZWFkaW5nIEJPTTogbW9kaWZ5KCkgaW5zZXJ0cyB0aGUgZ2VuZXJhdGVkIG9iamVjdCBCRUZPUkUgYW55IGxlYWRpbmcgdHJpdmlhLCB3aGljaFxuICAgIC8vIHdvdWxkIGxlYXZlIHRoZSBCT00gc3RyYW5kZWQgbWlkLWZpbGUgd2hlcmUgaXQgaXMgYSBzeW50YXggZXJyb3IgcmF0aGVyIHRoYW4gYW4gaWdub3JlZCBtYXJrLlxuICAgIGxldCBjb250ZW50ID0gb2xkQ29udGVudC5yZXBsYWNlKC9eXFx1RkVGRi8sICcnKTtcbiAgICBpZiAoanNvbmNVdGlsLmlzVHJpdmlhT25seShjb250ZW50KSkge1xuICAgICAgY29uc3QgaGVhZGVyID0gY29udGVudC50cmltKCk7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBjb250ZW50OiBgJHtoZWFkZXIgPyBoZWFkZXIgKyAnXFxuJyA6ICcnfSR7SlNPTi5zdHJpbmdpZnkoc2V0dGluZ3MsIHVuZGVmaW5lZCwgMil9YCxcbiAgICAgICAga2V5c0xvc2luZ0NvbW1lbnRzOiBbXSxcbiAgICAgIH07XG4gICAgfVxuICAgIGNvbnN0IG1vZGlmeU9wdGlvbnMgPSB7IGZvcm1hdHRpbmdPcHRpb25zOiBkZXRlY3RGb3JtYXR0aW5nT3B0aW9ucyhjb250ZW50KSB9O1xuICAgIGNvbnN0IGtleXNMb3NpbmdDb21tZW50czogc3RyaW5nW10gPSBbXTtcbiAgICBjb25zdCBuZXdFbnRyaWVzOiBbc3RyaW5nLCB1bmtub3duXVtdID0gW107XG4gICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMoc2V0dGluZ3MpKSB7XG4gICAgICBjb25zdCBvbGRWYWx1ZSA9IG9sZFNldHRpbmdzPy5ba2V5XTtcbiAgICAgIC8vIENvbXBhcmUgc2VyaWFsaXplZCBmb3JtcyBzbyBkZWVwLWVxdWFsIHZhbHVlcyAoZS5nLiBhIHJlLW1lcmdlZCBgZXh0ZW5kc2AgYXJyYXkpIGRvIG5vdFxuICAgICAgLy8gcmV3cml0ZSB0aGUgcHJvcGVydHkgYW5kIHJlZmxvdyBpdHMgZm9ybWF0dGluZy5cbiAgICAgIGlmIChKU09OLnN0cmluZ2lmeShvbGRWYWx1ZSkgPT09IEpTT04uc3RyaW5naWZ5KHZhbHVlKSkgY29udGludWU7XG4gICAgICBpZiAob2xkVmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICBuZXdFbnRyaWVzLnB1c2goW2tleSwgdmFsdWVdKTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICAvLyBSZXBsYWNpbmcgYSB3aG9sZSBhcnJheSB3b3VsZCBkaXNjYXJkIHRoZSBjb21tZW50cyBiZXR3ZWVuIGl0cyBlbGVtZW50cywgc28gZ3JvdyBpdCB3aXRoXG4gICAgICAvLyBwZXItZWxlbWVudCBpbnNlcnRpb25zIHdoZW5ldmVyIHRoZSBuZXcgdmFsdWUgb25seSBhZGRzIHRvIGl0LlxuICAgICAgY29uc3QgaW5zZXJ0aW9ucyA9IEFycmF5LmlzQXJyYXkob2xkVmFsdWUpICYmIEFycmF5LmlzQXJyYXkodmFsdWUpID8gZmluZEluc2VydGlvbnMob2xkVmFsdWUsIHZhbHVlKSA6IHVuZGVmaW5lZDtcbiAgICAgIGZvciAoY29uc3QgaW5zZXJ0aW9uIG9mIGluc2VydGlvbnMgPz8gW10pIHtcbiAgICAgICAgY29udGVudCA9IGFwcGx5RWRpdHMoXG4gICAgICAgICAgY29udGVudCxcbiAgICAgICAgICBtb2RpZnkoY29udGVudCwgW2tleSwgaW5zZXJ0aW9uLmluZGV4XSwgaW5zZXJ0aW9uLnZhbHVlLCB7IC4uLm1vZGlmeU9wdGlvbnMsIGlzQXJyYXlJbnNlcnRpb246IHRydWUgfSlcbiAgICAgICAgKTtcbiAgICAgICAgY29udGVudCA9IHJlc3RvcmVUcmFpbGluZ0NvbW1lbnQoY29udGVudCwga2V5LCBpbnNlcnRpb24uaW5kZXgpO1xuICAgICAgfVxuICAgICAgaWYgKGluc2VydGlvbnMpIGNvbnRpbnVlO1xuICAgICAgLy8gUmV3cml0aW5nIHRoZSB3aG9sZSB2YWx1ZSBpcyB0aGUgb25seSBvcHRpb24gbGVmdCAodGhlIG5ldyBvbmUgZHJvcHMgb3IgcmVvcmRlcnMgZWxlbWVudHMpLFxuICAgICAgLy8gYW5kIGl0IHRha2VzIGFueSBjb21tZW50IG5lc3RlZCBpbnNpZGUgaXQgYWxvbmcuIFJlcG9ydCB0aGF0IHJhdGhlciB0aGFuIGxvc2luZyBpdCBxdWlldGx5LlxuICAgICAgY29uc3QgcmVwbGFjZWRUZXh0ID0gdmFsdWVUZXh0T2YoY29udGVudCwga2V5KTtcbiAgICAgIGlmIChyZXBsYWNlZFRleHQgIT09IHVuZGVmaW5lZCAmJiBqc29uY1V0aWwuY29udGFpbnNDb21tZW50KHJlcGxhY2VkVGV4dCkpIGtleXNMb3NpbmdDb21tZW50cy5wdXNoKGtleSk7XG4gICAgICBjb250ZW50ID0gYXBwbHlFZGl0cyhjb250ZW50LCBtb2RpZnkoY29udGVudCwgW2tleV0sIHZhbHVlLCBtb2RpZnlPcHRpb25zKSk7XG4gICAgfVxuICAgIC8vIFByZXBlbmQgcmF0aGVyIHRoYW4gYXBwZW5kIHRoZSBwcm9wZXJ0aWVzIHRoYXQgYXJlIG5ldzogYXBwZW5kaW5nIGRldGFjaGVzIGEgdHJhaWxpbmdcbiAgICAvLyBzYW1lLWxpbmUgY29tbWVudCBmcm9tIHRoZSBsYXN0IHByb3BlcnR5LCBsZWF2aW5nIGl0IHRvIGRlc2NyaWJlIHRoZSBnZW5lcmF0ZWQgdmFsdWVcbiAgICAvLyBpbnN0ZWFkLiBJbnNlcnRpbmcgaW4gcmV2ZXJzZSBrZWVwcyB0aGUgb3JkZXIgdGhlIHNldHRpbmdzIGRlY2xhcmUgdGhlbSBpbi5cbiAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBuZXdFbnRyaWVzLnRvUmV2ZXJzZWQoKSkge1xuICAgICAgY29udGVudCA9IGFwcGx5RWRpdHMoY29udGVudCwgbW9kaWZ5KGNvbnRlbnQsIFtrZXldLCB2YWx1ZSwgeyAuLi5tb2RpZnlPcHRpb25zLCBnZXRJbnNlcnRpb25JbmRleDogKCkgPT4gMCB9KSk7XG4gICAgfVxuICAgIHJldHVybiB7IGNvbnRlbnQsIGtleXNMb3NpbmdDb21tZW50cyB9O1xuICB9LFxufTtcblxuLyoqIFJldHVybnMgdGhlIHNvdXJjZSB0ZXh0IG9mIGEgdG9wLWxldmVsIHByb3BlcnR5J3MgdmFsdWUsIGNvbW1lbnRzIGFuZCBhbGwuICovXG5mdW5jdGlvbiB2YWx1ZVRleHRPZihjb250ZW50OiBzdHJpbmcsIGtleTogc3RyaW5nKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgY29uc3Qgcm9vdCA9IHBhcnNlVHJlZShjb250ZW50KTtcbiAgY29uc3Qgbm9kZSA9IHJvb3QgJiYgZmluZE5vZGVBdExvY2F0aW9uKHJvb3QsIFtrZXldKTtcbiAgcmV0dXJuIG5vZGUgJiYgY29udGVudC5zbGljZShub2RlLm9mZnNldCwgbm9kZS5vZmZzZXQgKyBub2RlLmxlbmd0aCk7XG59XG5cbi8vIFRoZSB3aG9sZSBzYW1lLWxpbmUgY29tbWVudCBzZXF1ZW5jZSwgbm90IGp1c3QgdGhlIGZpcnN0IG9uZTogYSBsaW5lIGNvbW1lbnQgZW5kcyBpdCAoaXQgcnVucyB0b1xuLy8gdGhlIG5ld2xpbmUpLCBidXQgYW55IG51bWJlciBvZiBibG9jayBjb21tZW50cyBjYW4gcHJlY2VkZSBpdCwgYW5kIG1vdmluZyBvbmx5IHRoZSBmaXJzdCB3b3VsZFxuLy8gbGVhdmUgdGhlIHJlc3QgZGVzY3JpYmluZyB0aGUgd3JvbmcgZWxlbWVudC5cbmNvbnN0IHRyYWlsaW5nQ29tbWVudFBhdHRlcm4gPSAvXig/OlteXFxTXFxuXSpcXC9cXCpbXFxTXFxzXSo/XFwqXFwvKSooPzpbXlxcU1xcbl0qXFwvXFwvW15cXG5dKik/L3U7XG5cbi8qKlxuICogUmVhdHRhY2hlcyBhIHNhbWUtbGluZSBjb21tZW50IHRvIHRoZSBlbGVtZW50IGl0IGRlc2NyaWJlcy4gSW5zZXJ0aW5nIGludG8gYW4gYXJyYXkgcGxhY2VzIHRoZVxuICogbmV3IGVsZW1lbnQgQkVGT1JFIHRoZSB0cml2aWEgdGhhdCBmb2xsb3dzIGl0cyBwcmVkZWNlc3Nvciwgc28gYXBwZW5kaW5nIGFmdGVyXG4gKiBgeyAuLi4gfSAvLyB3aHkgdGhpcyBydWxlIGV4aXN0c2AgbGVhdmVzIHRoYXQgY29tbWVudCBleHBsYWluaW5nIHRoZSBnZW5lcmF0ZWQgZWxlbWVudCBpbnN0ZWFkLlxuICogQSBmcmVzaGx5IHNlcmlhbGl6ZWQgZWxlbWVudCBuZXZlciBjYXJyaWVzIGEgY29tbWVudCBvZiBpdHMgb3duLCBzbyBhbnl0aGluZyB0cmFpbGluZyB0aGVcbiAqIGluc2VydGlvbiBiZWxvbmdlZCB0byB0aGUgZWxlbWVudCBiZWZvcmUgaXQuXG4gKi9cbmZ1bmN0aW9uIHJlc3RvcmVUcmFpbGluZ0NvbW1lbnQoY29udGVudDogc3RyaW5nLCBrZXk6IHN0cmluZywgaW5zZXJ0ZWRJbmRleDogbnVtYmVyKTogc3RyaW5nIHtcbiAgaWYgKGluc2VydGVkSW5kZXggPT09IDApIHJldHVybiBjb250ZW50O1xuICBjb25zdCByb290ID0gcGFyc2VUcmVlKGNvbnRlbnQpO1xuICBjb25zdCBlbGVtZW50cyA9IChyb290ICYmIGZpbmROb2RlQXRMb2NhdGlvbihyb290LCBba2V5XSkpPy5jaGlsZHJlbjtcbiAgY29uc3QgaW5zZXJ0ZWQgPSBlbGVtZW50cz8uW2luc2VydGVkSW5kZXhdO1xuICBjb25zdCBwcmV2aW91cyA9IGVsZW1lbnRzPy5baW5zZXJ0ZWRJbmRleCAtIDFdO1xuICBpZiAoIWluc2VydGVkIHx8ICFwcmV2aW91cykgcmV0dXJuIGNvbnRlbnQ7XG4gIGNvbnN0IGluc2VydGVkRW5kID0gaW5zZXJ0ZWQub2Zmc2V0ICsgaW5zZXJ0ZWQubGVuZ3RoO1xuICBjb25zdCBjb21tZW50ID0gdHJhaWxpbmdDb21tZW50UGF0dGVybi5leGVjKGNvbnRlbnQuc2xpY2UoaW5zZXJ0ZWRFbmQpKT8uWzBdO1xuICBpZiAoIWNvbW1lbnQpIHJldHVybiBjb250ZW50O1xuICAvLyBMYW5kIHRoZSBjb21tZW50IGFmdGVyIHRoZSBzZXBhcmF0aW5nIGNvbW1hIHNvIHRoZSBlbGVtZW50IGtlZXBzIGl0cyBvd24gbGluZSBpbnRhY3QuXG4gIGNvbnN0IHByZXZpb3VzRW5kID0gcHJldmlvdXMub2Zmc2V0ICsgcHJldmlvdXMubGVuZ3RoO1xuICBjb25zdCByZXN0b3JlT2Zmc2V0ID0gcHJldmlvdXNFbmQgKyAoL15cXHMqLC91LmV4ZWMoY29udGVudC5zbGljZShwcmV2aW91c0VuZCkpPy5bMF0ubGVuZ3RoID8/IDApO1xuICByZXR1cm4gKFxuICAgIGNvbnRlbnQuc2xpY2UoMCwgcmVzdG9yZU9mZnNldCkgK1xuICAgIGNvbW1lbnQgK1xuICAgIGNvbnRlbnQuc2xpY2UocmVzdG9yZU9mZnNldCwgaW5zZXJ0ZWRFbmQpICtcbiAgICBjb250ZW50LnNsaWNlKGluc2VydGVkRW5kICsgY29tbWVudC5sZW5ndGgpXG4gICk7XG59XG5cbi8qKlxuICogTWlycm9ycyB0aGUgaW5kZW50YXRpb24gdGhlIGZpbGUgYWxyZWFkeSB1c2VzLCBzbyBhIHNlbWFudGljIGNoYW5nZSBkb2VzIG5vdCByZWluZGVudCB1bnJlbGF0ZWRcbiAqIGxpbmVzLiBUaGUgZmlyc3QgcHJvcGVydHkgaXMgbWVhc3VyZWQgcmF0aGVyIHRoYW4gdGhlIGZpcnN0IGluZGVudGVkIGxpbmUsIGJlY2F1c2UgYSBkZWNvcmF0ZWRcbiAqIGJsb2NrIGNvbW1lbnQgKGAgKiAuLi5gKSB3b3VsZCBvdGhlcndpc2UgcGFzcyBmb3IgdGhlIGZpbGUncyBpbmRlbnRhdGlvbi4gRmFsbHMgYmFjayB0byB0aGUgdHdvXG4gKiBzcGFjZXMgZXZlcnkgZ2VuZXJhdGVkIGNvbmZpZyB1c2VzLlxuICovXG5mdW5jdGlvbiBkZXRlY3RGb3JtYXR0aW5nT3B0aW9ucyhjb250ZW50OiBzdHJpbmcpOiB7IGluc2VydFNwYWNlczogYm9vbGVhbjsgdGFiU2l6ZTogbnVtYmVyIH0ge1xuICBjb25zdCBmaXJzdFByb3BlcnR5ID0gcGFyc2VUcmVlKGNvbnRlbnQpPy5jaGlsZHJlbj8uWzBdO1xuICBjb25zdCBpbmRlbnRhdGlvbiA9XG4gICAgZmlyc3RQcm9wZXJ0eSAmJiBjb250ZW50LnNsaWNlKGNvbnRlbnQubGFzdEluZGV4T2YoJ1xcbicsIGZpcnN0UHJvcGVydHkub2Zmc2V0KSArIDEsIGZpcnN0UHJvcGVydHkub2Zmc2V0KTtcbiAgaWYgKCFpbmRlbnRhdGlvbiB8fCAhL15bXFx0IF0rJC91LnRlc3QoaW5kZW50YXRpb24pKSByZXR1cm4geyBpbnNlcnRTcGFjZXM6IHRydWUsIHRhYlNpemU6IDIgfTtcbiAgaWYgKGluZGVudGF0aW9uLnN0YXJ0c1dpdGgoJ1xcdCcpKSByZXR1cm4geyBpbnNlcnRTcGFjZXM6IGZhbHNlLCB0YWJTaXplOiAxIH07XG4gIHJldHVybiB7IGluc2VydFNwYWNlczogdHJ1ZSwgdGFiU2l6ZTogaW5kZW50YXRpb24ubGVuZ3RoIH07XG59XG5cbi8qKlxuICogUmV0dXJucyB0aGUgZWxlbWVudHMgdG8gaW5zZXJ0IGludG8gYG9sZFZhbHVlYCB0byB0dXJuIGl0IGludG8gYG5ld1ZhbHVlYCwgb3IgdW5kZWZpbmVkIHdoZW5cbiAqIHRoYXQgaXMgaW1wb3NzaWJsZSBiZWNhdXNlIGBuZXdWYWx1ZWAgZHJvcHMgb3IgcmVvcmRlcnMgYW4gZXhpc3RpbmcgZWxlbWVudCAodGhlIGNhbGxlciBtdXN0XG4gKiB0aGVuIHJlcGxhY2UgdGhlIGFycmF5IHdob2xlc2FsZSkuIEluZGljZXMgYWRkcmVzcyB0aGUgYXJyYXkgYXMgaXQgZ3Jvd3MsIHNvIGFwcGx5aW5nIHRoZVxuICogaW5zZXJ0aW9ucyBsZWZ0IHRvIHJpZ2h0IHlpZWxkcyBgbmV3VmFsdWVgLlxuICovXG5mdW5jdGlvbiBmaW5kSW5zZXJ0aW9ucyhvbGRWYWx1ZTogdW5rbm93bltdLCBuZXdWYWx1ZTogdW5rbm93bltdKTogeyBpbmRleDogbnVtYmVyOyB2YWx1ZTogdW5rbm93biB9W10gfCB1bmRlZmluZWQge1xuICBjb25zdCBpbnNlcnRpb25zOiB7IGluZGV4OiBudW1iZXI7IHZhbHVlOiB1bmtub3duIH1bXSA9IFtdO1xuICBsZXQgb2xkSW5kZXggPSAwO1xuICBmb3IgKGNvbnN0IFtuZXdJbmRleCwgZWxlbWVudF0gb2YgbmV3VmFsdWUuZW50cmllcygpKSB7XG4gICAgaWYgKG9sZEluZGV4IDwgb2xkVmFsdWUubGVuZ3RoICYmIEpTT04uc3RyaW5naWZ5KG9sZFZhbHVlW29sZEluZGV4XSkgPT09IEpTT04uc3RyaW5naWZ5KGVsZW1lbnQpKSB7XG4gICAgICBvbGRJbmRleCsrO1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGluc2VydGlvbnMucHVzaCh7IGluZGV4OiBuZXdJbmRleCwgdmFsdWU6IGVsZW1lbnQgfSk7XG4gIH1cbiAgcmV0dXJuIG9sZEluZGV4ID09PSBvbGRWYWx1ZS5sZW5ndGggPyBpbnNlcnRpb25zIDogdW5kZWZpbmVkO1xufVxuIiwiaW1wb3J0IHR5cGUgeyBQYWNrYWdlSnNvbiB9IGZyb20gJ3R5cGUtZmVzdCc7XG5cbi8qKlxuICogUmVjb2duaXplcyB0aGUgbWFuYWdlZCBgd2IgZ2VuLWNvZGVgIHNlZ21lbnQsIGEgb25lLWxldmVsIHBhY2thZ2Utc2NyaXB0IHdyYXBwZXIgYXJvdW5kIGl0LCBhbmRcbiAqIGN1c3RvbSBzZWdtZW50cyB0aGF0IHdiZnkgbGVhdmVzIGFsb25lLlxuICovXG50eXBlIFNjcmlwdFNlZ21lbnRLaW5kID0gJ2N1c3RvbScgfCAnZ2VuQ29kZScgfCAnZ2VuQ29kZVdyYXBwZXInO1xuXG5jb25zdCBnZW5Db2RlU2VnbWVudFBhdHRlcm4gPSAvXmJ1blxccyt3YlxccytnZW4tY29kZSQvdTtcblxuLy8gQSBydW5uZXIgZGVsZWdhdGluZyB0byBvbmUgb2YgdGhpcyBwYWNrYWdlJ3Mgb3duIHNjcmlwdHMsIGUuZy4gYGJ1biBydW4gZ2VuLXR5cGVzYC5cbmNvbnN0IHNjcmlwdFJ1bm5lclBhdHRlcm4gPSAvXmJ1blxccytydW5cXHMrKFxcUyspJC91O1xuXG4vLyBBbnl0aGluZyB3YmZ5J3MgYCYmYCBzcGxpdCBjYW5ub3QgbW9kZWwgKHBpcGVzLCBzZXF1ZW5jaW5nLCByZWRpcmVjdGlvbnMsIHF1b3RpbmcsIHN1YnN0aXR1dGlvbnMsIGRpcmVjdG9yeVxuLy8gY2hhbmdlcykuIFNjcmlwdHMgY29udGFpbmluZyBpdCBhcmUgbGVmdCB1bnRvdWNoZWQgaW5zdGVhZCBvZiBiZWluZyByZXdyaXR0ZW4gZnJvbSBhIHdyb25nIHBhcnNlLlxuY29uc3QgdW5zdXBwb3J0ZWRTaGVsbFN5bnRheFBhdHRlcm4gPSAvW1xcbjt8PD5gJCdcIigpXXxcXGJjZFxccy91O1xuXG4vKipcbiAqIFNwbGl0cyBhIHNjcmlwdCBpbnRvIGAmJmAtc2VwYXJhdGVkIHNlZ21lbnRzLCBvciByZXR1cm5zIHVuZGVmaW5lZCB3aGVuIHRoZSBzY3JpcHQgdXNlcyBzaGVsbCBzeW50YXggd2JmeVxuICogZGVsaWJlcmF0ZWx5IGRvZXMgbm90IG1vZGVsLlxuICovXG5leHBvcnQgZnVuY3Rpb24gc3BsaXRTY3JpcHRTZWdtZW50cyhzY3JpcHQ6IHN0cmluZyk6IHN0cmluZ1tdIHwgdW5kZWZpbmVkIHtcbiAgaWYgKHVuc3VwcG9ydGVkU2hlbGxTeW50YXhQYXR0ZXJuLnRlc3Qoc2NyaXB0KSkgcmV0dXJuO1xuICByZXR1cm4gc2NyaXB0XG4gICAgLnNwbGl0KCcmJicpXG4gICAgLm1hcCgoc2VnbWVudCkgPT4gc2VnbWVudC50cmltKCkpXG4gICAgLmZpbHRlcihCb29sZWFuKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNsYXNzaWZ5U2NyaXB0U2VnbWVudChcbiAgc2VnbWVudDogc3RyaW5nLFxuICBzY3JpcHRzOiBQYWNrYWdlSnNvbi5TY3JpcHRzLFxuICBmb2xsb3dzV3JhcHBlciA9IHRydWVcbik6IFNjcmlwdFNlZ21lbnRLaW5kIHtcbiAgY29uc3Qgbm9ybWFsaXplZCA9IHNlZ21lbnQudHJpbSgpLnJlcGxhY2VBbGwoL1xccysvZ3UsICcgJyk7XG4gIGlmIChnZW5Db2RlU2VnbWVudFBhdHRlcm4udGVzdChub3JtYWxpemVkKSkgcmV0dXJuICdnZW5Db2RlJztcbiAgLy8gQSBvbmUtbGV2ZWwgd3JhcHBlciBsb29rdXAgY292ZXJzIGBcInBvc3RpbnN0YWxsXCI6IFwiYnVuIHJ1biBnZW4tdHlwZXNcImAsIHRoZSBzaGFwZSB0aGVzZSByZXBvc2l0b3JpZXMgdXNlO1xuICAvLyBkZWVwZXIgY2hhaW5zIHN0YXkgY3VzdG9tIHNvIHdiZnkgY2Fubm90IGxvb3Agb24gYSBzZWxmLXJlZmVyZW50aWFsIHNjcmlwdC5cbiAgY29uc3Qgc2NyaXB0TmFtZSA9IGZvbGxvd3NXcmFwcGVyID8gc2NyaXB0UnVubmVyUGF0dGVybi5leGVjKG5vcm1hbGl6ZWQpPy5bMV0gOiB1bmRlZmluZWQ7XG4gIGNvbnN0IHRhcmdldCA9IHNjcmlwdE5hbWUgPT09IHVuZGVmaW5lZCA/IHVuZGVmaW5lZCA6IHNjcmlwdHNbc2NyaXB0TmFtZV07XG4gIGlmICghdGFyZ2V0KSByZXR1cm4gJ2N1c3RvbSc7XG4gIGNvbnN0IHNlZ21lbnRzID0gc3BsaXRTY3JpcHRTZWdtZW50cyh0YXJnZXQpO1xuICAvLyBBIHdyYXBwZXIgYXJvdW5kIGEgQ1VTVE9NSVpFRCBnZW4tY29kZSAoYGJ1biB3YiBnZW4tY29kZSAmJiBidW4gcnVuIGJ1aWxkLWFzc2V0c2ApIHN0aWxsIHBlcmZvcm1zIHRoZSBtYW5hZ2VkXG4gIC8vIGdlbmVyYXRpb24sIHNvIGl0IGNvdW50cyBhcyBnZW4tY29kZTsgdHJlYXRpbmcgaXQgYXMgY3VzdG9tIHdvdWxkIGFwcGVuZCBhIHNlY29uZCBgd2IgZ2VuLWNvZGVgIGFuZCBydW4gZXZlcnlcbiAgLy8gZ2VuZXJhdG9yIHR3aWNlIHBlciBpbnN0YWxsLlxuICBpZiAoc2VnbWVudHM/Lmxlbmd0aCAhPT0gMSkge1xuICAgIC8vIEEgd3JhcHBlciBhcm91bmQgYSBDVVNUT01JWkVEIGdlbi1jb2RlIChgYnVuIHdiIGdlbi1jb2RlICYmIGJ1biBydW4gYnVpbGQtYXNzZXRzYCkgYWxyZWFkeSBwZXJmb3JtcyB0aGVcbiAgICAvLyBtYW5hZ2VkIGdlbmVyYXRpb24gQU5EIHRoZSBwcm9qZWN0J3Mgb3duIHN0ZXBzLCBzbyBpdCBpcyB0aGUgaW5zdGFsbC10aW1lIGVudHJ5IHBvaW50OiBpdCBtdXN0IGJlIGtlcHQgYXNcbiAgICAvLyB3cml0dGVuLiBSZXBsYWNpbmcgaXQgd2l0aCBhIGJhcmUgYHdiIGdlbi1jb2RlYCB3b3VsZCBkcm9wIHRob3NlIHN0ZXBzOyBhcHBlbmRpbmcgb25lIHdvdWxkIHJ1biBldmVyeVxuICAgIC8vIGdlbmVyYXRvciB0d2ljZS5cbiAgICByZXR1cm4gc2VnbWVudHM/LnNvbWUoKGlubmVyKSA9PiBnZW5Db2RlU2VnbWVudFBhdHRlcm4udGVzdChpbm5lci50cmltKCkucmVwbGFjZUFsbCgvXFxzKy9ndSwgJyAnKSkpXG4gICAgICA/ICdnZW5Db2RlV3JhcHBlcidcbiAgICAgIDogJ2N1c3RvbSc7XG4gIH1cbiAgcmV0dXJuIGNsYXNzaWZ5U2NyaXB0U2VnbWVudChzZWdtZW50c1swXSA/PyAnJywgc2NyaXB0cywgZmFsc2UpO1xufVxuIiwiaW1wb3J0IHR5cGUgeyBTcGF3blN5bmNPcHRpb25zIH0gZnJvbSAnbm9kZTpjaGlsZF9wcm9jZXNzJztcbmltcG9ydCBjaGlsZF9wcm9jZXNzIGZyb20gJ25vZGU6Y2hpbGRfcHJvY2Vzcyc7XG5cbmV4cG9ydCBmdW5jdGlvbiBzcGF3blN5bmMoY29tbWFuZDogc3RyaW5nLCBhcmdzOiBzdHJpbmdbXSwgY3dkOiBzdHJpbmcsIHJldHJ5ID0gMCk6IHZvaWQge1xuICBzcGF3blN5bmNBbmRSZXR1cm5TdGF0dXMoY29tbWFuZCwgYXJncywgY3dkLCByZXRyeSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBzcGF3blN5bmNBbmRSZXR1cm5TdGF0dXMoY29tbWFuZDogc3RyaW5nLCBhcmdzOiBzdHJpbmdbXSwgY3dkOiBzdHJpbmcsIHJldHJ5ID0gMCk6IG51bWJlciB7XG4gIGRvIHtcbiAgICBjb25zdCBbbmV3Q21kLCBuZXdBcmdzLCBvcHRpb25zXSA9IGdldFNwYXduU3luY0FyZ3MoY29tbWFuZCwgYXJncywgY3dkKTtcbiAgICBjb25zb2xlLmxvZyhgJCAke25ld0NtZH0gJHtuZXdBcmdzLmpvaW4oJyAnKX0gYXQgJHtjd2R9YCk7XG4gICAgY29uc3QgcmV0ID0gY2hpbGRfcHJvY2Vzcy5zcGF3blN5bmMobmV3Q21kLCBuZXdBcmdzLCBvcHRpb25zKTtcbiAgICBjb25zdCBzdGF0dXMgPSByZXQuc3RhdHVzID8/IDE7XG4gICAgaWYgKHN0YXR1cyA9PT0gMCkgYnJlYWs7XG4gICAgaWYgKHJldHJ5IDw9IDApIHJldHVybiBzdGF0dXM7XG4gIH0gd2hpbGUgKC0tcmV0cnkgPj0gMCk7XG4gIHJldHVybiAwO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gc3Bhd25TeW5jQW5kUmV0dXJuU3Rkb3V0KGNvbW1hbmQ6IHN0cmluZywgYXJnczogc3RyaW5nW10sIGN3ZDogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIHNwYXduU3luY0FuZFJldHVyblN0ZG91dEludGVybmFsKGNvbW1hbmQsIGFyZ3MsIGN3ZClbMV07XG59XG5cbmZ1bmN0aW9uIHNwYXduU3luY0FuZFJldHVyblN0ZG91dEludGVybmFsKGNvbW1hbmQ6IHN0cmluZywgYXJnczogc3RyaW5nW10sIGN3ZDogc3RyaW5nKTogW251bWJlciwgc3RyaW5nXSB7XG4gIGNvbnN0IFtuZXdDbWQsIG5ld0FyZ3MsIG9wdGlvbnNdID0gZ2V0U3Bhd25TeW5jQXJncyhjb21tYW5kLCBhcmdzLCBjd2QpO1xuICBvcHRpb25zLnN0ZGlvID0gJ3BpcGUnO1xuICBjb25zdCBwcm9jID0gY2hpbGRfcHJvY2Vzcy5zcGF3blN5bmMobmV3Q21kLCBuZXdBcmdzLCBvcHRpb25zKTtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bm5lY2Vzc2FyeS1jb25kaXRpb24gLS0gc3Bhd25TeW5jIHJldHVybnMgbnVsbCBzdGRlcnIgb24gRU5PRU5ULlxuICBjb25zdCBzdGRlcnIgPSBwcm9jLnN0ZGVyciA/PyAnJztcbiAgY29uc3QgZXJyb3IgPSB0eXBlb2Ygc3RkZXJyID09PSAnc3RyaW5nJyA/IHN0ZGVyci50cmltKCkgOiBzdGRlcnIudG9TdHJpbmcoKS50cmltKCk7XG4gIGlmIChwcm9jLmVycm9yKSB7XG4gICAgY29uc29sZS5lcnJvcihgJHtuZXdDbWR9IFske25ld0FyZ3MubWFwKChzKSA9PiBgXCIke3N9XCJgKS5qb2luKCcsICcpfV0gZmFpbGVkIHdpdGg6ICR7cHJvYy5lcnJvci5tZXNzYWdlfWApO1xuICB9IGVsc2UgaWYgKGVycm9yKSB7XG4gICAgY29uc29sZS5lcnJvcihcbiAgICAgIGAke25ld0NtZH0gWyR7bmV3QXJncy5tYXAoKHMpID0+IGBcIiR7c31cImApLmpvaW4oJywgJyl9XSBvdXRwdXRzIHRoZSBmb2xsb3dpbmcgY29udGVudCB0byBzdGRlcnI6XFxuJHtlcnJvcn1gXG4gICAgKTtcbiAgfVxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVubmVjZXNzYXJ5LWNvbmRpdGlvbiAtLSBzcGF3blN5bmMgcmV0dXJucyBudWxsIHN0ZG91dCBvbiBFTk9FTlQuXG4gIGNvbnN0IHN0ZG91dCA9IHByb2Muc3Rkb3V0ID8/ICcnO1xuICBjb25zdCBzdGRvdXRUZXh0ID0gdHlwZW9mIHN0ZG91dCA9PT0gJ3N0cmluZycgPyBzdGRvdXQgOiBzdGRvdXQudG9TdHJpbmcoKTtcbiAgcmV0dXJuIFtwcm9jLnN0YXR1cyA/PyAxLCBzdGRvdXRUZXh0LnRyaW0oKV07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRTcGF3blN5bmNBcmdzKGNvbW1hbmQ6IHN0cmluZywgYXJnczogc3RyaW5nW10sIGN3ZDogc3RyaW5nKTogW3N0cmluZywgc3RyaW5nW10sIFNwYXduU3luY09wdGlvbnNdIHtcbiAgY29uc3QgZW52ID0geyAuLi5wcm9jZXNzLmVudiB9O1xuICBpZiAoZW52LlBBVEggJiYgZW52LkJFUlJZX0JJTl9GT0xERVIpIHtcbiAgICBlbnYuUEFUSCA9IGVudi5QQVRILnNwbGl0KCc6JylcbiAgICAgIC5maWx0ZXIoKHApID0+IHAgIT09IGVudi5CRVJSWV9CSU5fRk9MREVSKVxuICAgICAgLmpvaW4oJzonKTtcbiAgfVxuXG4gIHJldHVybiBbXG4gICAgY29tbWFuZCxcbiAgICBhcmdzLFxuICAgIHtcbiAgICAgIGN3ZCxcbiAgICAgIGVudixcbiAgICAgIGVuY29kaW5nOiAndXRmOCcsXG4gICAgICBzaGVsbDogZmFsc2UsXG4gICAgICBzdGRpbzogJ2luaGVyaXQnLFxuICAgIH0sXG4gIF07XG59XG4iLCJleHBvcnQgZnVuY3Rpb24gZXNjYXBlUmVnRXhwKHZhbHVlOiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gdmFsdWUucmVwbGFjZUFsbCgvWy4qKz9eJHt9KCl8W1xcXVxcXFxdL2d1LCBTdHJpbmcucmF3YFxcJCZgKTtcbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBmc3AgZnJvbSAnbm9kZTpmcy9wcm9taXNlcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgeyBnbG9iSWdub3JlIH0gZnJvbSAnQHdpbGxib29zdGVyL3NoYXJlZC1saWItbm9kZS9zcmMnO1xuaW1wb3J0IGZnIGZyb20gJ2Zhc3QtZ2xvYic7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VKc29uIH0gZnJvbSAndHlwZS1mZXN0JztcbmltcG9ydCB7IHogfSBmcm9tICd6b2QnO1xuXG5pbXBvcnQgeyBnZXRPY3Rva2l0LCBnaXRIdWJVdGlsIH0gZnJvbSAnLi91dGlscy9naXRodWJVdGlsLmpzJztcbmltcG9ydCB7IGpzb25jVXRpbCB9IGZyb20gJy4vdXRpbHMvanNvbmNVdGlsLmpzJztcbmltcG9ydCB7IGNsYXNzaWZ5U2NyaXB0U2VnbWVudCwgc3BsaXRTY3JpcHRTZWdtZW50cyB9IGZyb20gJy4vdXRpbHMvbWFuYWdlZFNjcmlwdFNlZ21lbnQuanMnO1xuaW1wb3J0IHsgc3Bhd25TeW5jQW5kUmV0dXJuU3Rkb3V0IH0gZnJvbSAnLi91dGlscy9zcGF3blV0aWwuanMnO1xuaW1wb3J0IHsgZXNjYXBlUmVnRXhwIH0gZnJvbSAnLi91dGlscy9zdHJpbmdVdGlsLmpzJztcbmltcG9ydCB7IGdldFdvcmtzcGFjZVBhY2thZ2VKc29uUGF0aHMsIGdldFdvcmtzcGFjZVN1YkRpclBhdGhzIH0gZnJvbSAnLi91dGlscy93b3Jrc3BhY2VVdGlsLmpzJztcblxuZXhwb3J0IGludGVyZmFjZSBQYWNrYWdlQ29uZmlnIHtcbiAgZGlyUGF0aDogc3RyaW5nO1xuICBkb2NrZXJmaWxlOiBzdHJpbmc7XG4gIGlzUm9vdDogYm9vbGVhbjtcbiAgaXNQdWJsaWNSZXBvOiBib29sZWFuO1xuICAvLyBXaGV0aGVyIGlzUHVibGljUmVwbyBjb21lcyBmcm9tIGFuIGFjdHVhbCBHaXRIdWIgQVBJIHJlc3BvbnNlOiBhIGZhaWxlZCBsb29rdXAgKG9mZmxpbmUsXG4gIC8vIHJhdGUtbGltaXRlZCwgYmFkIGNyZWRlbnRpYWwpIGNvbGxhcHNlcyB0byBpc1B1YmxpY1JlcG89ZmFsc2UsIHdoaWNoIHZpc2liaWxpdHktc2Vuc2l0aXZlXG4gIC8vIGdlbmVyYXRvcnMgbXVzdCBub3QgbWlzdGFrZSBmb3IgYSBjb25maXJtZWQgcHJpdmF0ZSByZXBvc2l0b3J5LlxuICBpc1JlcG9WaXNpYmlsaXR5S25vd246IGJvb2xlYW47XG4gIGlzUmVmZXJyZWRCeU90aGVyUmVwbzogYm9vbGVhbjtcbiAgcmVwb3NpdG9yeT86IHN0cmluZztcbiAgcmVwb0F1dGhvcj86IHN0cmluZztcbiAgcmVwb05hbWU/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/PyBvd25lcjtcbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGZzVXRpbCB9IGZyb20gJy4uL3V0aWxzL2ZzVXRpbC5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcbmltcG9ydCB7IGdlbmVyYXRlc1dvcmtlclR5cGVzIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBoYXNDbG91ZGZsYXJlRGVwbG95V29ya2Zsb3csIGludm9rZXNXYkRlcGxveSB9IGZyb20gJy4vd29ya2Zsb3cuanMnO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVBZ2VudEluc3RydWN0aW9ucyhyb290Q29uZmlnOiBQYWNrYWdlQ29uZmlnLCBhbGxDb25maWdzOiBQYWNrYWdlQ29uZmlnW10pOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdnZW5lcmF0ZUFnZW50SW5zdHJ1Y3Rpb25zJywgYXN5bmMgKCkgPT4ge1xuICAgIGlmICghcm9vdENvbmZpZy5pc1Jvb3QpIHJldHVybjtcblxuICAgIGNvbnN0IGV4dHJhQ29udGVudCA9IGF3YWl0IHJlYWRBZ2VudHNFeHRyYUNvbnRlbnQocm9vdENvbmZpZy5kaXJQYXRoKTtcblxuICAgIGZvciAoY29uc3QgW2ZpbGVOYW1lLCB0b29sTmFtZV0gb2YgW1xuICAgICAgWydBR0VOVFMubWQnLCAnQ29kZXggQ0xJJ10sXG4gICAgICBbJ0NMQVVERS5tZCcsICdDbGF1ZGUgQ29kZSddLFxuICAgICAgWydHRU1JTkkubWQnLCAnR2VtaW5pIENMSSddLFxuICAgIF0gYXMgY29uc3QpIHtcbiAgICAgIGNvbnN0IGNvbnRlbnQgPSBnZW5lcmF0ZUFnZW50SW5zdHJ1Y3Rpb24ocm9vdENvbmZpZywgYWxsQ29uZmlncywgdG9vbE5hbWUsIGV4dHJhQ29udGVudCk7XG4gICAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShyb290Q29uZmlnLmRpclBhdGgsIGZpbGVOYW1lKTtcbiAgICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiBmc1V0aWwuZ2VuZXJhdGVGaWxlKGZpbGVQYXRoLCBjb250ZW50KSk7XG4gICAgfVxuXG4gICAgY29uc3QgY3Vyc29yUnVsZXNQYXRoID0gcGF0aC5yZXNvbHZlKHJvb3RDb25maWcuZGlyUGF0aCwgJy5jdXJzb3IvcnVsZXMvZ2VuZXJhbC5tZGMnKTtcbiAgICBjb25zdCBjdXJzb3JSdWxlc0NvbnRlbnQgPSBnZW5lcmF0ZUN1cnNvckdlbmVyYWxNZGNDb250ZW50KHJvb3RDb25maWcsIGFsbENvbmZpZ3MsIGV4dHJhQ29udGVudCk7XG4gICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzVXRpbC5nZW5lcmF0ZUZpbGUoY3Vyc29yUnVsZXNQYXRoLCBjdXJzb3JSdWxlc0NvbnRlbnQpKTtcbiAgfSk7XG59XG5cbmNvbnN0IGFnZW50c0V4dHJhQ29udGVudENhY2hlID0gbmV3IE1hcDxzdHJpbmcsIHN0cmluZyB8IHVuZGVmaW5lZD4oKTtcblxuLyoqXG4gKiBSZWFkcyB0aGUgcm9vdCdzIHVzZXItYXV0aG9yZWQgQUdFTlRTX0VYVFJBLm1kIG9uY2UgcGVyIHByb2Nlc3M6IHdiZnkgbmV2ZXIgcmV3cml0ZXMgdGhlIGZpbGUsXG4gKiBhbmQgYm90aCB0aGUgYWdlbnQtaW5zdHJ1Y3Rpb24gYW5kIEdlbWluaSBnZW5lcmF0b3JzIG5lZWQgaXRzIGNvbnRlbnQuIENhY2hpbmcgdGhlIHJlc29sdmVkXG4gKiB2YWx1ZSAobm90IHRoZSBQcm9taXNlKSBpcyByYWNlLWZyZWUgYmVjYXVzZSB0aGUgdHdvIGNhbGxlcnMgcnVuIHNlcXVlbnRpYWxseSBpbiBpbmRleC50cy5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJlYWRBZ2VudHNFeHRyYUNvbnRlbnQocm9vdERpclBhdGg6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nIHwgdW5kZWZpbmVkPiB7XG4gIGNvbnN0IGFnZW50c0V4dHJhUGF0aCA9IHBhdGgucmVzb2x2ZShyb290RGlyUGF0aCwgJ0FHRU5UU19FWFRSQS5tZCcpO1xuICBpZiAoIWFnZW50c0V4dHJhQ29udGVudENhY2hlLmhhcyhhZ2VudHNFeHRyYVBhdGgpKSB7XG4gICAgYWdlbnRzRXh0cmFDb250ZW50Q2FjaGUuc2V0KGFnZW50c0V4dHJhUGF0aCwgYXdhaXQgZnNVdGlsLnJlYWRGaWxlSWZFeGlzdHMoYWdlbnRzRXh0cmFQYXRoKSk7XG4gIH1cbiAgcmV0dXJuIGFnZW50c0V4dHJhQ29udGVudENhY2hlLmdldChhZ2VudHNFeHRyYVBhdGgpO1xufVxuXG5mdW5jdGlvbiBnZW5lcmF0ZUN1cnNvckdlbmVyYWxNZGNDb250ZW50KFxuICBjb25maWc6IFBhY2thZ2VDb25maWcsXG4gIGFsbENvbmZpZ3M6IFBhY2thZ2VDb25maWdbXSxcbiAgZXh0cmFDb250ZW50Pzogc3RyaW5nXG4pOiBzdHJpbmcge1xuICBjb25zdCBmcm9udG1hdHRlciA9IGAtLS1cXG5kZXNjcmlwdGlvbjogR2VuZXJhbCBDb2RpbmcgUnVsZXNcXG5nbG9iczpcXG5hbHdheXNBcHBseTogdHJ1ZVxcbi0tLWA7XG4gIGNvbnN0IGJvZHkgPSBnZW5lcmF0ZUFnZW50SW5zdHJ1Y3Rpb24oY29uZmlnLCBhbGxDb25maWdzLCAnQ3Vyc29yJywgZXh0cmFDb250ZW50KTtcbiAgcmV0dXJuIGAke2Zyb250bWF0dGVyfVxcblxcbiR7Ym9keX1gO1xufVxuXG5mdW5jdGlvbiBnZW5lcmF0ZUFnZW50SW5zdHJ1Y3Rpb24oXG4gIHJvb3RDb25maWc6IFBhY2thZ2VDb25maWcsXG4gIGFsbENvbmZpZ3M6IFBhY2thZ2VDb25maWdbXSxcbiAgdG9vbE5hbWU6IHN0cmluZyxcbiAgZXh0cmFDb250ZW50Pzogc3RyaW5nXG4pOiBzdHJpbmcge1xuICBjb25zdCBwYWNrYWdlTWFuYWdlciA9ICdidW4nO1xuICBjb25zdCBkZXNjcmlwdGlvbiA9IHJvb3RDb25maWcucGFja2FnZUpzb24/LmRlc2NyaXB0aW9uO1xuICBjb25zdCBmbm94SW5zdHJ1Y3Rpb24gPSBmcy5leGlzdHNTeW5jKHBhdGgucmVzb2x2ZShyb290Q29uZmlnLmRpclBhdGgsICdmbm94LnRvbWwnKSlcbiAgICA/IGBcXG4tIEVudmlyb25tZW50IHZhcmlhYmxlcyBhbmQgc2VjcmV0cyBsaXZlIGluIFxcYGZub3gudG9tbFxcYCAobWlzZSArIGZub3gpOyBuZXZlciBjcmVhdGUgXFxgLmVudlxcYCwgXFxgLmVudi4qXFxgLCBvciBcXGAuZGV2LnZhcnNcXGAgZmlsZXMuIFJ1biBjb21tYW5kcyB0aHJvdWdoIFxcYCR7cGFja2FnZU1hbmFnZXJ9IHdiIC4uLlxcYCBvciBcXGBmbm94IHJ1biAtUCA8cHJvZmlsZT4gLS0gPGNvbW1hbmQ+XFxgLiBQcm9maWxlIHNlY3JldHMgbG9hZCBvbmx5IHdoZW4gYSBwcm9maWxlIGlzIHNlbGVjdGVkOiBtb2RlLWF3YXJlIHdiIGNvbW1hbmRzIChlLmcuIFxcYHdiIHN0YXJ0XFxgLCBcXGB3YiB0ZXN0XFxgKSBhbmQgXFxgd2IgZG90ZW52XFxgIHNlbGVjdCBpdCB0aGVtc2VsdmVzIChcXGB3YiBkb3RlbnZcXGAgdXNlcyBcXGBXQl9FTlZcXGAsIGVsc2UgXFxgRk5PWF9QUk9GSUxFXFxgLCBlbHNlIFxcYE5PREVfRU5WXFxgLCBlbHNlIHRoZSBkZXZlbG9wbWVudCBwcm9maWxlOyBcXGBXQl9FTlZcXGAgYWNjZXB0cyBvbmx5IFxcYGRldmVsb3BtZW50XFxgL1xcYHRlc3RcXGAvXFxgc3RhZ2luZ1xcYC9cXGBwcm9kdWN0aW9uXFxgLCBzbyB1c2UgXFxgRk5PWF9QUk9GSUxFXFxgIGZvciBhbnkgb3RoZXIgcHJvZmlsZSksIHdoaWxlIGJhcmUgXFxgZm5veCBydW5cXGAgbmVlZHMgYW4gZXhwbGljaXQgXFxgLVAgPHByb2ZpbGU+XFxgLmBcbiAgICA6ICcnO1xuICAvLyBtaXNlIG93bnMgdGhlIHBpbm5lZCB0b29sIHZlcnNpb25zLCBzbyBhIHZlcnNpb24gbWlzbWF0Y2ggaXMgZml4ZWQgYnkgZWRpdGluZyBtaXNlLnRvbWwg4oCUIG5vdFxuICAvLyBieSBpbnN0YWxsaW5nIGEgZGlmZmVyZW50IHZlcnNpb24gZ2xvYmFsbHksIHdoaWNoIHRoZSBuZXh0IGBtaXNlIGluc3RhbGxgIHNpbGVudGx5IG92ZXJyaWRlcy5cbiAgY29uc3QgbWlzZUluc3RydWN0aW9uID0gZnMuZXhpc3RzU3luYyhwYXRoLnJlc29sdmUocm9vdENvbmZpZy5kaXJQYXRoLCAnbWlzZS50b21sJykpXG4gICAgPyAnXFxuLSBUb29sIHZlcnNpb25zIChlLmcuLCBub2RlKSBhcmUgcGlubmVkIGluIGBtaXNlLnRvbWxgOyBydW4gYG1pc2UgaW5zdGFsbGAgYWZ0ZXIgY2hhbmdpbmcgaXQgYW5kIG5ldmVyIGluc3RhbGwgdGhvc2UgdG9vbHMgZ2xvYmFsbHkgaW5zdGVhZC4nXG4gICAgOiAnJztcbiAgLy8gSXNvbGF0ZWQgaW5zdGFsbHMgYXJlIHRoZSBvcmcgc3RhbmRhcmQgKHdiZnkgZ2VuZXJhdGVzIG5vIG90aGVyIGxpbmtlcikgYW5kIHRoZSBtb3N0XG4gIC8vIGFnZW50LWhvc3RpbGUgcGFydCBvZiB0aGUgc3RhY2s6IGEgcGFja2FnZSB0aGF0IGlzIG9ubHkgcmVhY2hhYmxlIGJlY2F1c2UgYSBkZXBlbmRlbmN5IGhvaXN0ZWRcbiAgLy8gaXQgbm8gbG9uZ2VyIHJlc29sdmVzLCBhbmQgdGhlIHJlZmxleCBmaXggKHN3aXRjaGluZyB0aGUgbGlua2VyIGJhY2spIHNpbGVudGx5IHJlaW50cm9kdWNlc1xuICAvLyB0aGUgcGhhbnRvbSBkZXBlbmRlbmNpZXMgdGhlIGxheW91dCBleGlzdHMgdG8gY2F0Y2guXG4gIGNvbnN0IGlzb2xhdGVkSW5zdGFsbEluc3RydWN0aW9uID0gYFxcbi0gXFxgYnVuZmlnLnRvbWxcXGAgdXNlcyBCdW4ncyBpc29sYXRlZCBsaW5rZXIsIHNvIG9ubHkgZGVjbGFyZWQgZGVwZW5kZW5jaWVzIHJlc29sdmUuIElmIGFuIGltcG9ydCBmYWlscyB0byByZXNvbHZlLCBkZWNsYXJlIHRoYXQgcGFja2FnZSBpbiB0aGUgXFxgcGFja2FnZS5qc29uXFxgIHRoYXQgaW1wb3J0cyBpdDsgbmV2ZXIgc3dpdGNoIFxcYGxpbmtlclxcYCB0byBcXGBob2lzdGVkXFxgIG9yIGFkZCB0byBcXGBwdWJsaWNIb2lzdFBhdHRlcm5cXGAgdG8gd29yayBhcm91bmQgaXQuYDtcbiAgLy8gRXZlcnkgY2xhdXNlIHN0YXRlcyBvbmx5IGEgdmVyaWZpZWQgZmFjdCwgcmV1c2luZyB0aGUgd29ya2Zsb3cgZ2VuZXJhdG9yJ3Mgb3duIGRldGVjdG9yczogdGhlXG4gIC8vIHdyYW5nbGVyLWNvbmZpZyBjbGF1c2UgbmVlZHMgYW4gYWN0dWFsIGNvbmZpZyBmaWxlIChpc0Nsb3VkZmxhcmUgYWxzbyBtYXRjaGVzIGEgbWVyZSB3cmFuZ2xlclxuICAvLyBtZW50aW9uIGluIGEgc2NyaXB0IG9yIHdvcmtmbG93KSwgdGhlIHdvcmtmbG93IGNsYXVzZSBuZWVkcyBhIGxpdmUgcmV1c2FibGUtZGVwbG95IGNhbGxlclxuICAvLyAoWUFNTC1wYXJzZWQgam9icy4qLnVzZXMsIG5vdCBhIHJhdy10ZXh0L2NvbW1lbnQgbWF0Y2gpLCBhbmQgdGhlIGB3YiBkZXBsb3lgIGNsYXVzZSBuZWVkcyBhXG4gIC8vIGRlcGxveSBzY3JpcHQgd2hvc2UgY29tbWFuZCB0b2tlbiBpcyBgd2Ig4oCmIGRlcGxveWAuXG4gIGNvbnN0IG93bnNXcmFuZ2xlckNvbmZpZyA9IGFsbENvbmZpZ3Muc29tZSgoY29uZmlnKSA9PiBjb25maWcuZG9lc0NvbnRhaW5XcmFuZ2xlckNvbmZpZyk7XG4gIC8vIE9ubHkgY2xhaW0gdGhlIGZpbGUgaXMgZ2VuZXJhdGVkIHdoZXJlIGl0IGFjdHVhbGx5IGlzOiBhIHBhY2thZ2UgdGhhdCBoYW5kLW1haW50YWlucyBpdHMgYEVudmAgKGUuZy4gdW5kZXJcbiAgLy8gYHR5cGVzOiBbXCJidW5cIl1gKSBpcyBkZWxpYmVyYXRlbHkgbGVmdCB1bm1hbmFnZWQsIGFuZCB0ZWxsaW5nIGFuIGFnZW50IHRvIHJ1biBgd2IgZ2VuLWNvZGVgIHRoZXJlIHdvdWxkIHNlbmRcbiAgLy8gaXQgYWZ0ZXIgYSBmaWxlIHRoYXQgbmV2ZXIgYXBwZWFycyDigJQgYW5kIGF3YXkgZnJvbSB0aGUgYEVudmAgaXQgc2hvdWxkIGJlIGVkaXRpbmcuXG4gIGNvbnN0IG93bnNHZW5lcmF0ZWRXb3JrZXJUeXBlcyA9IGFsbENvbmZpZ3Muc29tZSgoY29uZmlnKSA9PiBnZW5lcmF0ZXNXb3JrZXJUeXBlcyhjb25maWcpKTtcbiAgY29uc3QgaGFzRGVwbG95V29ya2Zsb3cgPSBoYXNDbG91ZGZsYXJlRGVwbG95V29ya2Zsb3cocGF0aC5yZXNvbHZlKHJvb3RDb25maWcuZGlyUGF0aCwgJy5naXRodWIvd29ya2Zsb3dzJykpO1xuICBjb25zdCB1c2VzV2JEZXBsb3kgPSBhbGxDb25maWdzLnNvbWUoKGNvbmZpZykgPT4ge1xuICAgIGNvbnN0IGRlcGxveVNjcmlwdCA9IGNvbmZpZy5wYWNrYWdlSnNvbj8uc2NyaXB0cz8uWydkZXBsb3knXTtcbiAgICByZXR1cm4gKFxuICAgICAgdHlwZW9mIGRlcGxveVNjcmlwdCA9PT0gJ3N0cmluZycgJiZcbiAgICAgIGludm9rZXNXYkRlcGxveShkZXBsb3lTY3JpcHQsIG5ldyBTZXQoT2JqZWN0LmtleXMoY29uZmlnLnBhY2thZ2VKc29uPy5zY3JpcHRzID8/IHt9KSkpXG4gICAgKTtcbiAgfSk7XG4gIC8vIEluZGVwZW5kZW50IGZhY3RzIHN0YXkgc2VwYXJhdGUgc2VudGVuY2VzOiB0aGUgd29ya2Zsb3cncyBvd24gZGVwbG95IG1lY2hhbmlzbSBpcyBub3RcbiAgLy8gaW5zcGVjdGVkLCBzbyB0aGUgd2ItZGVwbG95IGNsYXVzZSBtdXN0IG5vdCBjbGFpbSB0aGUgd29ya2Zsb3cgaW52b2tlcyBpdC5cbiAgY29uc3QgY2xvdWRmbGFyZUluc3RydWN0aW9uID0gb3duc1dyYW5nbGVyQ29uZmlnXG4gICAgPyBgXFxuLSBUaGlzIHByb2plY3QgcnVucyBvbiBDbG91ZGZsYXJlIFdvcmtlcnM6IHRoZSB3cmFuZ2xlciBjb25maWd1cmF0aW9uIGZpbGUgaG9sZHMgdGhlIFdvcmtlcidzIGNvbmZpZ3VyYXRpb24sIGluY2x1ZGluZyBiaW5kaW5ncyBhbmQgcGVyLWVudmlyb25tZW50IG92ZXJyaWRlcy4ke2hhc0RlcGxveVdvcmtmbG93ID8gJyBUaGUgZGVwbG95IHdvcmtmbG93cyB1bmRlciBgLmdpdGh1Yi93b3JrZmxvd3NgIHBlcmZvcm0gZGVwbG95bWVudHMuJyA6ICcnfSR7dXNlc1diRGVwbG95ID8gJyBUaGUgYGRlcGxveWAgcGFja2FnZSBzY3JpcHQgcnVucyBgd2IgZGVwbG95YC4nIDogJyd9JHtvd25zR2VuZXJhdGVkV29ya2VyVHlwZXMgPyBgXFxuLSBcXGB3b3JrZXItY29uZmlndXJhdGlvbi5kLnRzXFxgIGlzIGdpdGlnbm9yZWQgYW5kIGdlbmVyYXRlZCBieSBcXGAke3BhY2thZ2VNYW5hZ2VyfSB3YiBnZW4tY29kZVxcYDsgYWZ0ZXIgY2hhbmdpbmcgYmluZGluZ3Mgb3IgdmFycyBpbiB0aGUgd3JhbmdsZXIgY29uZmlndXJhdGlvbiwgcmUtcnVuIGl0IGluc3RlYWQgb2YgZWRpdGluZyB0aGUgZmlsZSBieSBoYW5kLmAgOiAnJ31gXG4gICAgOiAnJztcbiAgLy8gV2lsbEJvb3N0ZXIgUmFpbHdheSBwcm9qZWN0IGlkZW50aWZpZXJzIGFyZSBtYW5hZ2VkIGluIGRlcGxveSB3b3JrZmxvdyBzZXR0aW5ncy5cbiAgY29uc3QgcmFpbHdheUluc3RydWN0aW9uID0gcm9vdENvbmZpZy5pc1JhaWx3YXlcbiAgICA/ICdcXG4tIFJhaWx3YXkgcHJvamVjdCBpbmZvcm1hdGlvbiBpcyBpbiB0aGUgZGVwbG95IHdvcmtmbG93cyB1bmRlciBgLmdpdGh1Yi93b3JrZmxvd3NgLidcbiAgICA6ICcnO1xuICBjb25zdCBwbGF5d3JpZ2h0VGVzdFNlcnZlckluc3RydWN0aW9uID0gaGFzUGxheXdyaWdodFRlc3RTZXJ2ZXIoYWxsQ29uZmlncylcbiAgICA/IGBcXG4tIFVzZSBcXGAke3BhY2thZ2VNYW5hZ2VyfSB3YiBzdGFydCAtLW1vZGUgdGVzdFxcYCB0byBsYXVuY2ggYSB3ZWIgc2VydmVyIGZvciBkZWJ1Z2dpbmcgb3IgdGVzdGluZy5gXG4gICAgOiAnJztcbiAgY29uc3QgY29BdXRob3JJbnN0cnVjdGlvbiA9IHJvb3RDb25maWcuaXNXaWxsQm9vc3RlclJlcG9cbiAgICA/IGBcXG4gIC0gRW5kIHlvdXIgY29tbWl0IG1lc3NhZ2Ugd2l0aCBhIGJsYW5rIGxpbmUgZm9sbG93ZWQgYnkgXFxgQ28tYXV0aG9yZWQtYnk6IFdpbGxCb29zdGVyICgke3Rvb2xOYW1lfSkgPGFnZW50QHdpbGxib29zdGVyLmNvbT5cXGAuYFxuICAgIDogJyc7XG4gIC8vIEtleWVkIG9uIHRoZSByZXBvc2l0b3J5IGNsYXNzaWZpY2F0aW9uIHJhdGhlciB0aGFuIG9uIHRoZSB0ZW1wbGF0ZSBmaWxlcycgcHJlc2VuY2U6IHRoZSBzYW1lXG4gIC8vIHJ1biB3cml0ZXMgdGhlIHRlbXBsYXRlcyBmb3IgV2lsbEJvb3N0ZXIgLyBXaWxsQm9vc3RlckxhYiByZXBvc2l0b3JpZXMgYmVmb3JlIHRoaXMgZ2VuZXJhdG9yXG4gIC8vIHJ1bnMsIGFuZCBoYW5kLWFkZGVkIHRlbXBsYXRlcyBlbHNld2hlcmUgYmVsb25nIHRvIEFHRU5UU19FWFRSQS5tZC5cbiAgY29uc3QgcHJUZW1wbGF0ZUluc3RydWN0aW9uID0gcm9vdENvbmZpZy5pc1dpbGxCb29zdGVyUmVwb1xuICAgID8gXCJcXG4gIC0gQmFzZSB0aGUgUFIgYm9keSBvbiBgLmdpdGh1Yi9wdWxsX3JlcXVlc3RfdGVtcGxhdGUubWRgIHdoZW4gY3JlYXRpbmcgb3IgdXBkYXRpbmcgYSBQUiwgZXZlbiB3aGVuIGEgc2tpbGwgb3Igd29ya2Zsb3cgc3VwcGxpZXMgaXRzIG93biBza2VsZXRvbjoga2VlcCB0aGUgdGVtcGxhdGUncyBoZWFkaW5ncyBpbiBvcmRlciwgZmlsbCBlYWNoIHNlY3Rpb24gd2l0aCB3aGF0IGl0cyBwbGFjZWhvbGRlciBjb21tZW50IGFza3MgZm9yIGF0IGEgbGVuZ3RoIGZpdHRpbmcgdGhlIGNoYW5nZSAoYSBzZW50ZW5jZSBmb3IgYSBzbWFsbCBjaGFuZ2UsIG51bWJlcmVkIHN1YnNlY3Rpb25zIGZvciBhIGxhcmdlIG9uZSksIGRlbGV0ZSB0aGUgcGxhY2Vob2xkZXIgY29tbWVudHMgYW5kIGFuIGVtcHR5IE5vdGVzIHNlY3Rpb24sIGFuZCBrZWVwIGBDbG9zZSAjPG4+YCBvbmx5IHdoZW4gdGhlIFBSIHJlc29sdmVzIGFuIGV4aXN0aW5nIGlzc3VlLlwiXG4gICAgOiAnJztcbiAgY29uc3QgaXNzdWVUZW1wbGF0ZUluc3RydWN0aW9uID0gcm9vdENvbmZpZy5pc1dpbGxCb29zdGVyUmVwb1xuICAgID8gJ1xcbi0gV2hlbiBjcmVhdGluZyBhbiBpc3N1ZSwgZm9sbG93IHRoZSBjbG9zZXN0IHRlbXBsYXRlIHVuZGVyIGAuZ2l0aHViL0lTU1VFX1RFTVBMQVRFL2A6IGBidWcubWRgIGZvciB3cm9uZyBiZWhhdmlvciwgYGNoYW5nZS5tZGAgZm9yIGFueXRoaW5nIHRvIGJ1aWxkIG9yIGFsdGVyOyBhIHF1ZXN0aW9uIG9yIG5vdGUgZml0dGluZyBuZWl0aGVyIG5lZWRzIG5vIHRlbXBsYXRlLiBUaGUgWUFNTCBmcm9udCBtYXR0ZXIgYmV0d2VlbiB0aGUgYC0tLWAgbGluZXMgaXMgbWV0YWRhdGEsIG5vdCBib2R5IHRleHQ6IHByZWZpeCB0aGUgdGl0bGUgYXMgaXRzIGB0aXRsZWAgc2F5cywgcGFzcyBpdHMgYGxhYmVsc2AgdmlhIGAtLWxhYmVsYCwgYW5kIHN1Ym1pdCBvbmx5IHRoZSBjb250ZW50IGJlbG93IHRoZSBjbG9zaW5nIGAtLS1gIGFzIHRoZSBib2R5LiBBbHdheXMga2VlcCB0aGUgZmlyc3QgdGhyZWUgc2VjdGlvbnMgb2YgYGNoYW5nZS5tZGAgYW5kIGFkZCB0aGUgcmVzdCBhcyB0aGUgY2hhbmdlIGdyb3dzOyBrZWVwIFByb2JsZW0gYW5kIFByb3Bvc2FsIG9mIGBidWcubWRgIGFuZCBkcm9wIEV2aWRlbmNlIG9yIEltcGFjdCB3aGVuIHRoZXkgYWRkIG5vdGhpbmcuIERlbGV0ZSB0aGUgcGxhY2Vob2xkZXIgY29tbWVudHMuJ1xuICAgIDogJyc7XG4gIGNvbnN0IHByb2plY3ROYW1lID0gcm9vdENvbmZpZy5wYWNrYWdlSnNvbj8ubmFtZSB8fCBwYXRoLmJhc2VuYW1lKHBhdGgucmVzb2x2ZShyb290Q29uZmlnLmRpclBhdGgpKTtcbiAgY29uc3QgYmFzZUNvbnRlbnQgPSBgXG4jIyBQcm9qZWN0IEluZm9ybWF0aW9uXG5cbi0gTmFtZTogXFxgJHtwcm9qZWN0TmFtZX1cXGAke2Rlc2NyaXB0aW9uID8gYFxcbi0gRGVzY3JpcHRpb246ICR7ZGVzY3JpcHRpb259YCA6ICcnfVxuLSBQYWNrYWdlIE1hbmFnZXI6ICR7cGFja2FnZU1hbmFnZXJ9XG5cbiMjIEdlbmVyYWwgSW5zdHJ1Y3Rpb25zXG5cbi0gSWYgb24gXFxgbWFpblxcYCwgY3JlYXRlIGEgbmV3IGJyYW5jaDsgb3RoZXJ3aXNlIHdvcmsgb24gdGhlIGN1cnJlbnQgYnJhbmNoLlxuLSBSdW4gXFxgZ2l0XFxgIGNvbW1hbmRzIG9uZSBhdCBhIHRpbWUgdG8gYXZvaWQgXFxgaW5kZXgubG9ja1xcYCBjb25mbGljdHMuXG4tIFdyaXRlIGEgdGVzdCBvbmx5IHdoZW4gZXhwbGljaXRseSByZXF1ZXN0ZWQsIG9yIHdoZW4gYSBiZWhhdmlvciBpcyBsaWtlbHkgdG8gcmVncmVzcyBhbmQgbm8gZXhpc3RpbmcgYXV0b21hdGljIGNoZWNrICh0eXBlIGNoZWNraW5nLCBsaW50aW5nLCBhbiBleGlzdGluZyB0ZXN0IG9yIENJIGNoZWNrKSB3b3VsZCBjYXRjaCB0aGUgYnJlYWthZ2UuIE5ldmVyIGFkZCBhIHRlc3QgdGhhdCBtZXJlbHkgcmVzdGF0ZXMgYSBtYXBwaW5nIGZyb20gY29uZGl0aW9ucyB0byBjb25zdGFudCBvdXRwdXRzIChpdCBmYWlscyBvbmx5IG9uIGludGVudGlvbmFsIGVkaXRzKSBvciB0aGF0IG9ubHkgY29uZmlybXMgYW4gZXh0ZXJuYWwgZmFjdCAoYSBsaWJyYXJ5J3MgYmVoYXZpb3IsIHdoZXRoZXIgYSB2ZXJzaW9uIGZpeGVzIGFuIGlzc3VlKTsgdmVyaWZ5IHRob3NlIG9uY2UgbWFudWFsbHkuXG4tIFdoZW4gd3JpdGluZyB0ZXN0cywgZm9sbG93IHRoZXNlIHJ1bGVzOlxuICAtIFRlc3QgZXh0ZXJuYWxseSBvYnNlcnZhYmxlIGJlaGF2aW9yIChlLmcuLCBlbWl0dGVkIGZpbGVzLCBDTEkgb3V0cHV0LCByZW5kZXJlZCByZXN1bHRzKSBhdCB0aGUgc3lzdGVtIGJvdW5kYXJ5LCBub3QgaW1wbGVtZW50YXRpb24gZGV0YWlsczogZG8gbm90IG1pcnJvciBwcm9kdWN0aW9uIGxvZ2ljLCBhc3NlcnQgdGhhdCBhIGJyYW5jaCBpcyB0YWtlbiwgb3IgZmVlZCBoYW5kLWFzc2VtYmxlZCBpbnRlcm5hbCBvYmplY3RzIHRvIGludGVybmFsIGZ1bmN0aW9ucy5cbiAgLSBQcmVmZXIgYWN0dWFsIEFQSSBjYWxscyBvdmVyIG1vY2tzLCB1bmxlc3MgYWN0dWFsIGNhbGxzIGFyZSBpbXByYWN0aWNhbCwgaGF2ZSB1bmludGVuZGVkIHNpZGUgZWZmZWN0cywgb3IgbW9ja3MgYXJlIGV4cGxpY2l0bHkgcmVxdWVzdGVkLlxuICAtIEVuc3VyZSB0ZXN0cyBhcmUgaWRlbXBvdGVudCBhbmQgaW5kZXBlbmRlbnQgKGUuZy4sIHJlc2V0IHBlcnNpc3RlbnQgZGF0YSkgc28gdGhleSBjYW4gcnVuIHJlcGVhdGVkbHkgb3IgaW4gcGFyYWxsZWwuXG4gIC0gQXZvaWQgZml4ZWQgd2FpdHMgaW4gRTJFIHRlc3RzOyB3YWl0IGZvciBjb25kaXRpb25zIGluc3RlYWQuXG4gIC0gQ29udGludWUgbW9kaWZ5aW5nIHRlc3RzIGFuZC9vciBjb2RlIHVudGlsIGFsbCB0ZXN0cyBwYXNzLlxuLSBXaGVuIGZpeGluZyBpc3N1ZXMgKGluY2x1ZGluZyB0ZXN0IGZhaWx1cmVzKSwgaW52ZXN0aWdhdGUgdGhlIHJvb3QgY2F1c2UgZmlyc3QgKGUuZy4sIHZpYSBkZWJ1ZyBsb2dzIG9yIHNjcmVlbnNob3RzKSBhbmQgZml4IGl0IGluc3RlYWQgb2YgYXBwbHlpbmcgd29ya2Fyb3VuZHMuXG4tIEFmdGVyIG1ha2luZyBjaGFuZ2VzLCBydW4gXFxgJHtwYWNrYWdlTWFuYWdlcn0gcnVuIHZlcmlmeVxcYCAodHlwZSBjaGVja2luZyBhbmQgbGludGluZzsgdXAgdG8gMTAgbWludXRlcyksIG9yIFxcYCR7cGFja2FnZU1hbmFnZXJ9IHJ1biB2ZXJpZnktZnVsbFxcYCAoYWxsIHRlc3RzOyB1cCB0byAxIGhvdXIpIGlmIHlvdSBjaGFuZ2VkIHJ1bnRpbWUgYmVoYXZpb3Igb3IgdGVzdHMuIEZpeCBlcnJvcnMgYW5kIHJlLXJ1biB1bnRpbCBpdCBwYXNzZXMuXG4gIC0gUnVuIHZlcmlmaWNhdGlvbiBub3JtYWxseSBhbmQgd2FpdCBmb3IgY29tcGxldGlvbiB3aXRob3V0IHJlc3RhcnRpbmcgaXQuIFByZWZlciBjb21wbGV0aW9uIG5vdGlmaWNhdGlvbnM7IG90aGVyd2lzZSB1c2UgdGhlIGxvbmdlc3QgcGVybWl0dGVkIHdhaXQuIE5vIG91dHB1dCBkb2VzIG5vdCBtZWFuIHRoZSBjb21tYW5kIGhhcyBzdG9wcGVkLiBJZiB0aGUgZGlzcGxheWVkIGV4Y2VycHQgaXMgaW5zdWZmaWNpZW50LCByZWFkIHRoZSBpbmRpY2F0ZWQgbG9nIGZpbGUgYmVmb3JlIHJlcnVubmluZyB2ZXJpZmljYXRpb24uIElmIHRoZSBlbnZpcm9ubWVudCBraWxscyBsb25nLXJ1bm5pbmcgY29tbWFuZHMsIHVzZSBkZXRhY2hlZCBleGVjdXRpb24gd2l0aCBhIHNhdmVkIGxvZyBhbmQgZXhpdCBzdGF0dXMuXG4tIE9uY2UgdmVyaWZpZWQsIGNvbW1pdCBhbmQgcHVzaCB0byB0aGUgY3VycmVudCAobm9uLW1haW4pIGJyYW5jaCwgYW5kIGNyZWF0ZSBhIFBSIHZpYSBcXGBnaFxcYCBpZiBub25lIGV4aXN0cyBmb3IgdGhlIGJyYW5jaC5cbiAgLSBGb2xsb3cgdGhlIENvbnZlbnRpb25hbCBDb21taXRzIGZvcm1hdCAoZS5nLiwgXFxgZmVhdDpcXGAsIFxcYGZpeDpcXGApLiR7Y29BdXRob3JJbnN0cnVjdGlvbn1cbiAgLSBBbHdheXMgY3JlYXRlIG5ldyBjb21taXRzOyBhdm9pZCBcXGAtLWFtZW5kXFxgLiR7cHJUZW1wbGF0ZUluc3RydWN0aW9ufSR7aXNzdWVUZW1wbGF0ZUluc3RydWN0aW9ufVxuLSBJbiBhbnkgZXhwbGFuYXRvcnkgdGV4dCAoY29tbWl0IG1lc3NhZ2VzLCBQUiBkZXNjcmlwdGlvbnMsIGRvY3VtZW50YXRpb24sIGNvZGUgY29tbWVudHMsIGV0Yy4pLCBkZXNjcmliZSBvbmx5IHRoZSBjdXJyZW50IGltcGxlbWVudGF0aW9uOiBuZXZlciBtZW50aW9uIHN5bWJvbHMgb3IgY29uY2VwdHMgdGhhdCB3ZXJlIGFkZGVkIGFuZCBsYXRlciByZW1vdmVkIG9yIHJlbmFtZWQgYWxvbmcgdGhlIHdheSwgYW5kIGRyb3AgYW55IHN0YXRlbWVudCBuYW1pbmcgYW4gaWRlbnRpZmllciBvciBmZWF0dXJlIHlvdSBjYW5ub3QgY29uZmlybSBleGlzdHMgaW4gdGhlIGZpbmFsIGRpZmYgb3IgdGhlIGN1cnJlbnQgY29kZWJhc2UuIFdoZW5ldmVyIHlvdSBub3RpY2UgZG9jdW1lbnRhdGlvbiBvciBjb21tZW50cyB0aGF0IG5vIGxvbmdlciBtYXRjaCB0aGUgY3VycmVudCBpbXBsZW1lbnRhdGlvbiAocmVtb3ZlZCBvcHRpb25zLCBkZXByZWNhdGVkIHVzYWdlLCBvdXRkYXRlZCBiZWhhdmlvciksIGRlbGV0ZSBvciByZXdyaXRlIHRoZW0sIGV2ZW4gaW4gZmlsZXMgeW91IGFyZSBub3Qgb3RoZXJ3aXNlIGNoYW5naW5nLiBNZW50aW9uIGEgcGFzdCBzdGF0ZSBvbmx5IHdoZXJlIGl0IGlzIG5lZWRlZCB0byB1bmRlcnN0YW5kIHdoeSB0aGUgY3VycmVudCBkZXNpZ24gaXMgYXMgaXQgaXMsIG9yIHdoZW4gZXhwbGljaXRseSBhc2tlZDsgZmlsZXMgdGhhdCByZWNvcmQgaGlzdG9yeSBieSBkZXNpZ24gKGUuZy4sIGEgY2hhbmdlbG9nKSBhcmUgZXhlbXB0LlxuLSBVc2UgaGVyZWRvYyBmb3IgbXVsdGktbGluZSBjb21tYW5kIGlucHV0IChlLmcuLCBcXGBnaXQgY29tbWl0IC1GIC1cXGAsIFxcYGdoIHByIGNyZWF0ZSAtLWJvZHktZmlsZSAtXFxgLCBcXGBnaCBpc3N1ZSBjcmVhdGUgLS1ib2R5LWZpbGUgLVxcYCkuXG4tIFB1dCB0ZW1wb3JhcnkgZmlsZXMgaW4gXFxgLnRtcFxcYDsgdXNlIFxcYC90bXBcXGAgb25seSBmb3IgZmlsZXMgdGhhdCBtdXN0IGxpdmUgb3V0c2lkZSB0aGUgcmVwby5cbi0gXFxgQUdFTlRTLm1kXFxgLCBcXGBDTEFVREUubWRcXGAsIFxcYEdFTUlOSS5tZFxcYCwgXFxgLmN1cnNvci9ydWxlcy9nZW5lcmFsLm1kY1xcYCwgYW5kIFxcYC5nZW1pbmkvc3R5bGVndWlkZS5tZFxcYCBhcmUgZ2VuZXJhdGVkIGZyb20gXFxgQUdFTlRTX0VYVFJBLm1kXFxgIGFuZCBvdmVyd3JpdHRlbiBvbiBldmVyeSBcXGB3YmZ5XFxgIHJ1bjsgdG8gY2hhbmdlIGFnZW50IGluc3RydWN0aW9ucywgZWRpdCBvbmx5IFxcYEFHRU5UU19FWFRSQS5tZFxcYC4ke21pc2VJbnN0cnVjdGlvbn0ke2lzb2xhdGVkSW5zdGFsbEluc3RydWN0aW9ufSR7Zm5veEluc3RydWN0aW9ufSR7Y2xvdWRmbGFyZUluc3RydWN0aW9ufSR7cmFpbHdheUluc3RydWN0aW9ufSR7cGxheXdyaWdodFRlc3RTZXJ2ZXJJbnN0cnVjdGlvbn1cblxuJHtnZW5lcmF0ZUFnZW50Q29kaW5nU3R5bGUocm9vdENvbmZpZywgYWxsQ29uZmlncyl9XG5gXG4gICAgLnJlcGxhY2VBbGwoL1xcLlxcblxcbistL2csICcuXFxuLScpXG4gICAgLnJlcGxhY2VBbGwoL1xcbnszLH0vZywgJ1xcblxcbicpXG4gICAgLnRyaW0oKTtcblxuICBjb25zdCBoYXNOZXdTZWN0aW9uID0gZXh0cmFDb250ZW50Py50cmltKCkuc3RhcnRzV2l0aCgnIycpO1xuICBjb25zdCBub3JtYWxpemVkRXh0cmFDb250ZW50ID0gZXh0cmFDb250ZW50XG4gICAgPyBoYXNOZXdTZWN0aW9uXG4gICAgICA/ICdcXG5cXG4nICsgZXh0cmFDb250ZW50LnRyaW0oKVxuICAgICAgOiAnXFxuJyArIGV4dHJhQ29udGVudFxuICAgIDogJyc7XG4gIHJldHVybiBiYXNlQ29udGVudCArIG5vcm1hbGl6ZWRFeHRyYUNvbnRlbnQ7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZW5lcmF0ZUFnZW50Q29kaW5nU3R5bGUocm9vdENvbmZpZzogUGFja2FnZUNvbmZpZywgYWxsQ29uZmlnczogUGFja2FnZUNvbmZpZ1tdKTogc3RyaW5nIHtcbiAgLy8gVGF1cmkgZGVza3RvcCBhcHBzIHNoaXAgV2luZG93cyBidWlsZHMsIGFuZCB0aGUgYm91bmRhcnkgYmV0d2VlbiBhcHAgY29kZSBhbmQgc2hhcmVkIGNvZGUgaXNcbiAgLy8gdG9vIGZ1enp5IHRvIHNjb3BlIHRoZSBtYWNPUy9MaW51eC1vbmx5IHJ1bGUgcGVyIHBhY2thZ2UsIHNvIHN1Y2ggcmVwb3NpdG9yaWVzIHRhcmdldCBhbGxcbiAgLy8gdGhyZWUgT1NlcyBpbnN0ZWFkLlxuICBjb25zdCBoYXNEZXNrdG9wQXBwID0gYWxsQ29uZmlncy5zb21lKChjKSA9PiBjLmRlcGVuZGluZy50YXVyaSB8fCBjLmRvZXNDb250YWluVGF1cmlDb25maWdJblBhY2thZ2VzKTtcbiAgLy8gQSBwdWJsaWMgcmVwb3NpdG9yeSB3aXRoIG5vIGBAd2lsbGJvb3N0ZXIvYCBwYWNrYWdlIGlzIE9TUyBmb3IgdGhlIGdlbmVyYWwgcHVibGljLCB3aG9zZSB1c2Vyc1xuICAvLyBtYXkgcnVuIFdpbmRvd3MsIHNvIG5vIE9TIHJlc3RyaWN0aW9uIGFwcGxpZXMgdGhlcmUuIEFuIHVua25vd24gdmlzaWJpbGl0eSBjb2xsYXBzZXMgdG9cbiAgLy8gaXNQdWJsaWNSZXBvPWZhbHNlIGFuZCB0aGVyZWZvcmUga2VlcHMgdGhlIHJlc3RyaWN0aXZlIGRlZmF1bHQuXG4gIGNvbnN0IGlzR2VuZXJhbFB1YmxpY09zcyA9XG4gICAgcm9vdENvbmZpZy5pc1B1YmxpY1JlcG8gJiYgYWxsQ29uZmlncy5ldmVyeSgoYykgPT4gIWMucGFja2FnZUpzb24/Lm5hbWU/LnN0YXJ0c1dpdGgoJ0B3aWxsYm9vc3Rlci8nKSk7XG4gIGNvbnN0IG9zQ29tcGF0aWJpbGl0eUluc3RydWN0aW9uID0gaXNHZW5lcmFsUHVibGljT3NzXG4gICAgPyAnJ1xuICAgIDogaGFzRGVza3RvcEFwcFxuICAgICAgPyAnLSBFbnN1cmUgY29tcGF0aWJpbGl0eSB3aXRoIFdpbmRvd3MsIG1hY09TLCBhbmQgTGludXguJ1xuICAgICAgOiAnLSBFbnN1cmUgY29tcGF0aWJpbGl0eSBvbmx5IHdpdGggbWFjT1MgYW5kIExpbnV4OyBkbyBub3QgaW5jbHVkZSBXaW5kb3dzLXNwZWNpZmljIGNvZGUuJztcbiAgLy8gQ2xvdWRmbGFyZSBXb3JrZXJzIGV4ZWN1dGUgYWNyb3NzIG1hbnkgZXBoZW1lcmFsIGlzb2xhdGVzIGFuZCB0d28gcmVxdWVzdHMgYXJlIG5vdCBndWFyYW50ZWVkXG4gIC8vIHRvIGhpdCB0aGUgc2FtZSBpbnN0YW5jZSwgc28gdGhlIHNpbmdsZS1pbnN0YW5jZSBzaW1wbGlmaWNhdGlvbiBzaWxlbnRseSBsb3NlcyBzdGF0ZSB0aGVyZSDigJRcbiAgLy8gYnV0IFdvcmtlcnMgZGVsaWJlcmF0ZWx5IHJldXNlIGV4ZWN1dGlvbiBjb250ZXh0cywgc28gYmVzdC1lZmZvcnQgaXNvbGF0ZS1sb2NhbCBjYWNoZXMgc3RheVxuICAvLyBsZWdpdGltYXRlIChodHRwczovL2RldmVsb3BlcnMuY2xvdWRmbGFyZS5jb20vd29ya2Vycy9yZWZlcmVuY2UvaG93LXdvcmtlcnMtd29ya3MvKS4gVGhlXG4gIC8vIHNpZ25hbHMgYXJlIGNvcnJlbGF0ZWQgUEVSIFBBQ0tBR0U6IGEgbW9ub3JlcG8gY2FuIGhvc3QgYSBzaW5nbGUtaW5zdGFuY2Ugc2VydmVyIGFwcCBuZXh0IHRvXG4gIC8vIGFuIHVucmVsYXRlZCBXb3JrZXIsIGFuZCBuZWl0aGVyIG1heSBvdmVycmlkZSB0aGUgb3RoZXIncyBydWxlLiBkb2VzQ29udGFpbldyYW5nbGVyQ29uZmlnIGlzXG4gIC8vIHRoZSBhY2N1cmF0ZSBXb3JrZXJzIHNpZ25hbCAoaXNDbG91ZGZsYXJlIGFsc28gbWF0Y2hlcyBhIG1lcmUgd3JhbmdsZXIgbWVudGlvbiBpbiBhIHNjcmlwdCBvclxuICAvLyB3b3JrZmxvdykuXG4gIGNvbnN0IGhhc1dvcmtlcnNBcHAgPSBhbGxDb25maWdzLnNvbWUoKGMpID0+IGMuZG9lc0NvbnRhaW5XcmFuZ2xlckNvbmZpZyk7XG4gIGNvbnN0IGhhc1NpbmdsZUluc3RhbmNlU2VydmVyQXBwID0gYWxsQ29uZmlncy5zb21lKFxuICAgIChjKSA9PiAoYy5kZXBlbmRpbmcubmV4dCB8fCBjLmRlcGVuZGluZy52aW5leHQpICYmICFjLmRvZXNDb250YWluV3JhbmdsZXJDb25maWdcbiAgKTtcbiAgY29uc3Qgd29ya2Vyc0luc3RydWN0aW9uID1cbiAgICAnLSBDbG91ZGZsYXJlIFdvcmtlcnMgcnVuIGFjcm9zcyBtYW55IGVwaGVtZXJhbCBpc29sYXRlcywgc28gdHdvIHJlcXVlc3RzIG1heSBoaXQgZGlmZmVyZW50IGluc3RhbmNlczogbmV2ZXIgbGV0IGNvcnJlY3RuZXNzIGRlcGVuZCBvbiBtb2R1bGUtbGV2ZWwgbXV0YWJsZSBzdGF0ZTsgcGVyc2lzdCBhdXRob3JpdGF0aXZlIHNoYXJlZCBzdGF0ZSBpbiBiaW5kaW5ncyAoRDEsIEtWLCBSMiwgRHVyYWJsZSBPYmplY3RzKS4gQmVzdC1lZmZvcnQgaXNvbGF0ZS1sb2NhbCBjYWNoZXMgb2Ygbm9uLXJlcXVlc3Qtc2NvcGVkIGRhdGEgYXJlIGZpbmUuJztcbiAgY29uc3Qgc2VydmVySW5zdGFuY2VJbnN0cnVjdGlvbiA9IGhhc1dvcmtlcnNBcHBcbiAgICA/IGhhc1NpbmdsZUluc3RhbmNlU2VydmVyQXBwXG4gICAgICA/IGAke3dvcmtlcnNJbnN0cnVjdGlvbn0gVGhpcyBhcHBsaWVzIHRvIGFsbCBjb2RlIHJ1bm5pbmcgb24gQ2xvdWRmbGFyZSBXb3JrZXJzICh0aGUgd3JhbmdsZXItY29uZmlndXJlZCBwYWNrYWdlcyBhbmQgYW55IHdvcmtzcGFjZSBwYWNrYWdlIHRoZXkgaW1wb3J0KTsgYXNzdW1lIGEgc2luZ2xlIHNlcnZlciBpbnN0YW5jZSBmb3IgdGhlIG90aGVyIHNlcnZlciBhcHBzLmBcbiAgICAgIDogd29ya2Vyc0luc3RydWN0aW9uXG4gICAgOiBoYXNTaW5nbGVJbnN0YW5jZVNlcnZlckFwcFxuICAgICAgPyAnLSBBc3N1bWUgYSBzaW5nbGUgc2VydmVyIGluc3RhbmNlLidcbiAgICAgIDogJyc7XG4gIC8vIEtlZXAgdG9wLWRvd24gb3JkZXJpbmcgZ3VpZGFuY2UgZnVuY3Rpb24tb25seSBiZWNhdXNlIGNsYXNzZXMgYXJlIG5vdCBob2lzdGVkIGFuZCBjYW4gZmFpbCB3aGVuIGluaGVyaXRhbmNlIG9yIHRvcC1sZXZlbCBpbnN0YW50aWF0aW9uIGRlcGVuZHMgb24gZGVjbGFyYXRpb24gb3JkZXIuXG4gIHJldHVybiBgXG4jIyBDb2RpbmcgU3R5bGVcblxuLSBVc2UgY2FtZWxDYXNlIGZpbGUgbmFtZXMgZm9yIEphdmFTY3JpcHQvVHlwZVNjcmlwdCAoUGFzY2FsQ2FzZSBmb3IgUmVhY3QgY29tcG9uZW50cykuXG4tIFNpbXBsaWZ5IGNvZGUgYXMgbXVjaCBhcyBwb3NzaWJsZSB0byBlbGltaW5hdGUgcmVkdW5kYW5jeS5cbi0gRGVzaWduIG1vZHVsZXMgYW5kIGRpcmVjdG9yaWVzIHdpdGggaGlnaCBjb2hlc2lvbiBhbmQgbG93IGNvdXBsaW5nOyBzcGxpdCBsYXJnZSBtb2R1bGVzIHdoZW4gbmVlZGVkLlxuLSBQbGFjZSBjYWxsaW5nIGZ1bmN0aW9ucyBhYm92ZSB0aGUgZnVuY3Rpb25zIHRoZXkgY2FsbCAodG9wLWRvd24gb3JkZXIpOyBwbGFjZSB2YXJpYWJsZSBhbmQgdHlwZSBkZWNsYXJhdGlvbnMgYWJvdmUgdGhlaXIgdXNhZ2UuXG4tIFdyaXRlIGNvbW1lbnRzIGFuZCBKU0RvYyBvbmx5IGZvciBoYXJkLXRvLXVuZGVyc3RhbmQgY29kZTogZXhwbGFpbiBcIndoeVwiIGluIGNvbW1lbnRzIGFuZCBcIndoYXRcIiBpbiBKU0RvYy5cbi0gTmV2ZXIgZXhwbGFpbiBob3cgV2lsbEJvb3N0ZXIncyBpbi1ob3VzZSB0b29scyAoZS5nLiwgXFxgd2JcXGAsIFxcYHdiZnlcXGApIHdvcmsgaW4gY29kZSBjb21tZW50cyBvciBkb2N1bWVudHMgb3V0c2lkZSB0aGUgdG9vbCdzIG93biBwYWNrYWdlLCBleGNlcHQgaW4gaW5zdHJ1Y3Rpb25zIGZvciBBSSBhZ2VudHMgKGUuZy4sIGRvIG5vdCBub3RlIHRoYXQgXFxgUE9SVFxcYCBpcyB1bnNldCBiZWNhdXNlIFxcYHdiXFxgIHBpY2tzIGEgZnJlZSBwb3J0KS5cbi0gSWYgbGludCBlcnJvcnMgb3Igd2FybmluZ3MgY2Fubm90IGJlIGZpeGVkLCB1c2UgaWdub3JlIGNvbW1lbnRzIHdpdGggcmVhc29ucyAoZS5nLiwgXFxgLy8gb3hsaW50LWRpc2FibGUtbmV4dC1saW5lIDxydWxlPiAtLSA8cmVhc29uPlxcYCkuXG4tIFByZWZlciBcXGB1bmRlZmluZWRcXGAgb3ZlciBcXGBudWxsXFxgIHVubGVzcyByZXF1aXJlZCBieSBBUElzIG9yIGxpYnJhcmllcy5cbi0gVmFsaWRhdGUgSmF2YVNjcmlwdCBvYmplY3RzIChlLmcuLCBwYXJzZWQgSlNPTiwgQVBJIHJlc3BvbnNlcykgd2l0aCBcXGB6b2RcXGAgd2hlbmV2ZXIgcG9zc2libGUgaW5zdGVhZCBvZiBoYW5kLXdyaXR0ZW4gY2hlY2tzIG9yIHR5cGUgYXNzZXJ0aW9ucy5cbi0gQnVpbGQgcHJvbXB0cyBhcyBhIHNpbmdsZSB0ZW1wbGF0ZSBsaXRlcmFsIGluc3RlYWQgb2YgXFxgam9pbigpXFxgIG9uIGEgcHJlLWNvbXB1dGFibGUgYXJyYXkgb2Ygc3RyaW5ncy5cbi0gQXNzdW1lIGFsbCBlbnZpcm9ubWVudCB2YXJpYWJsZXMgYXJlIGRlZmluZWQ7IGlmIHZhbGlkYXRpb24gaXMgbmVlZGVkLCBcXGBhc3NlcnRcXGAgdGhlbSBhdCBzdGFydHVwIHRvIGZhaWwgZmFzdC5cbi0gQXNzdW1lIGxvY2FsIHRvb2xzIHN1Y2ggYXMgXFxgZ2l0XFxgLCBcXGBnaFxcYCwgYW5kIFxcYGdocVxcYCBhcmUgaW5zdGFsbGVkIGFuZCBhdXRoZW50aWNhdGVkLlxuJHtvc0NvbXBhdGliaWxpdHlJbnN0cnVjdGlvbn1cbiR7XG4gIGFsbENvbmZpZ3Muc29tZSgoYykgPT4gYy5kZXBlbmRpbmcuZ2VuSTE4blRzKVxuICAgID8gYC0gUmVnaXN0ZXIgc3RyaW5nIGxpdGVyYWxzIGZvciBSZWFjdCBjb21wb25lbnRzIGluIHRoZSBcXGBpMThuXFxgIHJlc291cmNlIGZpbGVzIChlLmcuLCBcXGBpMThuL2phLUpQLmpzb25cXGApIGFuZCByZWZlcmVuY2UgdGhlbSB2aWEgdGhlIFxcYGkxOG5cXGAgdXRpbGl0eSAoZS5nLiwgXFxgaTE4bi5wYWdlcy5ob21lLnRpdGxlKClcXGAgZm9yIFxcYHsgXCJwYWdlc1wiOiB7IFwiaG9tZVwiOiB7IFwidGl0bGVcIjogXCJNeSBBcHBcIiB9IH0gfVxcYCkuYFxuICAgIDogJydcbn1cblxuJHtcbiAgYWxsQ29uZmlncy5zb21lKChjKSA9PiBjLmRlcGVuZGluZy5yZWFjdCB8fCBjLmRlcGVuZGluZy5uZXh0IHx8IGMuZGVwZW5kaW5nLnZpbmV4dClcbiAgICA/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+ICdveGxpbnQtY29uZmlnJywgd2hpY2ggaXMgaXRzIGRpcmVjdG9yeSB1bmRlciBgcGFja2FnZXMvYC5cbiAgY29uc3QgY29uZmlnUGFja2FnZURpciA9IGNvbmZpZ1BhY2thZ2VOYW1lLnNwbGl0KCcvJykucG9wKCkgPz8gJyc7XG4gIC8vIERlcml2ZSB0aGUgd2lsbGJvb3N0ZXItY29uZmlncyByb290IGZyb20gdGhlIHBhY2thZ2UgYmVpbmcgZ2VuZXJhdGVkLCBub3QgZnJvbSB0aGUgQ0xJIGVudHJ5XG4gIC8vIHBhdGg6IGB3YmZ5IDxyZXBvPi9wYWNrYWdlcy88cGtnPmAgaXMgYSBzdXBwb3J0ZWQgaW52b2NhdGlvbiB3aG9zZSBlbnRyeSBjb25maWcgaXMgdGhlIGNoaWxkXG4gIC8vIHBhY2thZ2UgcmF0aGVyIHRoYW4gdGhlIHJlcG8gcm9vdCwgc28gcmVseWluZyBvbiB0aGUgZW50cnkgd291bGQgZW1pdCBhIG5lc3RlZCwgdW5yZXNvbHZhYmxlXG4gIC8vIHBhdGggZm9yIGEgZGlyZWN0bHkgdGFyZ2V0ZWQgY29uZmlnIHBhY2thZ2UuIEV2ZXJ5IHdpbGxib29zdGVyLWNvbmZpZ3MgcGFja2FnZSBpcyBlaXRoZXIgdGhlXG4gIC8vIHJvb3Qgb3IgYSBkaXJlY3QgY2hpbGQgdW5kZXIgYHBhY2thZ2VzL2AsIHNvIHRoZSByb290IGlzIHRoZSBwYWNrYWdlIGRpciBpdHNlbGYgb3IgaXRzIGdyYW5kcGFyZW50LlxuICBjb25zdCByZXBvUm9vdERpclBhdGggPSBjb25maWcuaXNSb290ID8gY29uZmlnLmRpclBhdGggOiBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICcuLicsICcuLicpO1xuICBjb25zdCBsb2NhbEVudHJ5ID0gcGF0aC5yZXNvbHZlKHJlcG9Sb290RGlyUGF0aCwgJ3BhY2thZ2VzJywgY29uZmlnUGFja2FnZURpciwgJ2NvbmZpZy5tanMnKTtcbiAgY29uc3QgcmVsYXRpdmVQYXRoID0gcGF0aC5yZWxhdGl2ZShjb25maWcuZGlyUGF0aCwgbG9jYWxFbnRyeSk7XG4gIHJldHVybiByZWxhdGl2ZVBhdGguc3RhcnRzV2l0aCgnLicpID8gcmVsYXRpdmVQYXRoIDogYC4vJHtyZWxhdGl2ZVBhdGh9YDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzUHVibGlzaGVkV2lsbGJvb3N0ZXJDb25maWdzUGFja2FnZShjb25maWc6IFBhY2thZ2VDb25maWcpOiBib29sZWFuIHtcbiAgcmV0dXJuIChcbiAgICBjb25maWcuaXNXaWxsQm9vc3RlckNvbmZpZ3MgJiZcbiAgICAhY29uZmlnLmlzUm9vdCAmJlxuICAgIGNvbmZpZy5wYWNrYWdlSnNvbj8ucHJpdmF0ZSAhPT0gdHJ1ZSAmJlxuICAgIEFycmF5LmlzQXJyYXkoY29uZmlnLnBhY2thZ2VKc29uPy5maWxlcykgJiZcbiAgICBjb25maWcucGFja2FnZUpzb24uZmlsZXMubGVuZ3RoID4gMFxuICApO1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHsgZ2xvYklnbm9yZSB9IGZyb20gJ0B3aWxsYm9vc3Rlci9zaGFyZWQtbGliLW5vZGUvc3JjJztcbmltcG9ydCBtZXJnZSBmcm9tICdkZWVwbWVyZ2UnO1xuaW1wb3J0IGZnIGZyb20gJ2Zhc3QtZ2xvYic7XG5pbXBvcnQgc2VtdmVyIGZyb20gJ3NlbXZlcic7XG5pbXBvcnQgeyBzb3J0UGFja2FnZUpzb24gfSBmcm9tICdzb3J0LXBhY2thZ2UtanNvbic7XG5pbXBvcnQgKiBhcyBhc3QgZnJvbSAndHlwZXNjcmlwdC91bnN0YWJsZS9hc3QnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlSnNvbiwgU2V0UmVxdWlyZWQgfSBmcm9tICd0eXBlLWZlc3QnO1xuXG5pbXBvcnQgeyBnZXRMYXRlc3RDb21taXRIYXNoIH0gZnJvbSAnLi4vZ2l0aHViL2NvbW1pdC5qcyc7XG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHsgZ2VuZXJhdGVzV29ya2VyVHlwZXMsIGdldFdvcmtlclR5cGVzU2NyaXB0RXJyb3IsIHR5cGUgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgY2xhc3NpZnlTY3JpcHRTZWdtZW50LCBzcGxpdFNjcmlwdFNlZ21lbnRzIH0gZnJvbSAnLi4vdXRpbHMvbWFuYWdlZFNjcmlwdFNlZ21lbnQuanMnO1xuaW1wb3J0IHsgZnNVdGlsIH0gZnJvbSAnLi4vdXRpbHMvZnNVdGlsLmpzJztcbmltcG9ydCB7IGdpdEh1YlV0aWwgfSBmcm9tICcuLi91dGlscy9naXRodWJVdGlsLmpzJztcbmltcG9ydCB7IGNvbWJpbmVNZXJnZSB9IGZyb20gJy4uL3V0aWxzL21lcmdlVXRpbC5qcyc7XG5pbXBvcnQgeyBkb2VzQ29udGFpbkphdmEsIGRvZXNDb250YWluSnNPclRzIH0gZnJvbSAnLi4vdXRpbHMvcGFja2FnZUNhcGFiaWxpdGllcy5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcbmltcG9ydCB7IHNwYXduU3luYywgc3Bhd25TeW5jQW5kUmV0dXJuU3Rkb3V0IH0gZnJvbSAnLi4vdXRpbHMvc3Bhd25VdGlsLmpzJztcbmltcG9ydCB7IGVzY2FwZVJlZ0V4cCB9IGZyb20gJy4uL3V0aWxzL3N0cmluZ1V0aWwuanMnO1xuaW1wb3J0IHsgZ2V0VHNjb25maWdCYXNlRGVwZW5kZW5jaWVzLCBtYW5hZ2VkVHNjb25maWdCYXNlRGVwZW5kZW5jaWVzIH0gZnJvbSAnLi4vdXRpbHMvdHNjb25maWdCYXNlLmpzJztcbmltcG9ydCB7IHBhcnNlU291cmNlRmlsZSB9IGZyb20gJy4uL3V0aWxzL3R5cGVzY3JpcHRBcGkuanMnO1xuaW1wb3J0IHsgaXNQdWJsaXNoZWRXaWxsYm9vc3RlckNvbmZpZ3NQYWNrYWdlIH0gZnJvbSAnLi4vdXRpbHMvd2lsbGJvb3N0ZXJDb25maWdzVXRpbC5qcyc7XG5pbXBvcnQge1xuICBnZXREZWNsYXJlZFdvcmtzcGFjZVBhdHRlcm5zLFxuICBnZXRXb3Jrc3BhY2VQYWNrYWdlSnNvblBhdGhzLFxuICBoYXNEZWNsYXJlZFBhY2thZ2VzU3RhclBhdHRlcm4sXG4gIGhhc0ltcGxpY2l0V29ya3NwYWNlQmFzZWxpbmUsXG59IGZyb20gJy4uL3V0aWxzL3dvcmtzcGFjZVV0aWwuanMnO1xuaW1wb3J0IHsgYnVuTWluaW11bVJlbGVhc2VBZ2VFeGNsdWRlcywgYnVuTWluaW11bVJlbGVhc2VBZ2VTZWNvbmRzIH0gZnJvbSAnLi9idW5maWcuanMnO1xuXG5jb25zdCBveGxpbnREZXBzID0gWydAd2lsbGJvb3N0ZXIvb3hmbXQtY29uZmlnJywgJ0B3aWxsYm9vc3Rlci9veGxpbnQtY29uZmlnJywgJ294Zm10JywgJ294bGludCcsICdveGxpbnQtdHNnb2xpbnQnXTtcbmNvbnN0IHR5cGVzY3JpcHREZXBlbmRlbmN5ID0gJ3R5cGVzY3JpcHQnO1xuLy8gVHlwZVNjcmlwdCA3J3MgYHR5cGVzY3JpcHRgIHBhY2thZ2UgaXMgdGhlIHRzZ28gbmF0aXZlIGNvbXBpbGVyIGFuZCBleHBvc2VzIG5vXG4vLyBwcm9ncmFtbWF0aWMgQVBJLiBOZXh0LmpzJ3MgYnVpbGQtdGltZSBgdmVyaWZ5VHlwZVNjcmlwdFNldHVwYCBuZWVkcyB0aGF0IEFQSSwgc29cbi8vIGBuZXh0IGJ1aWxkYCBmYWlscyAoXCJ0cnlpbmcgdG8gdXNlIFR5cGVTY3JpcHQgYnV0IGRvIG5vdCBoYXZlIHRoZSByZXF1aXJlZCBwYWNrYWdlKHMpXCIpXG4vLyB3aXRoIG9ubHkgYHR5cGVzY3JpcHRgIHY3IGluc3RhbGxlZC4gTmV4dC5qcyByZXNvbHZlcyB0aGUgdHNnbyBiaW5hcnkgdGhyb3VnaCB0aGVcbi8vIHNlcGFyYXRlIGBAdHlwZXNjcmlwdC9uYXRpdmUtcHJldmlld2AgcGFja2FnZSwgc28gTmV4dC5qcy1mYW1pbHkgcmVwb3MgbXVzdCBpbnN0YWxsXG4vLyBib3RoOyBvdGhlciByZXBvcyBvbmx5IG5lZWQgYHR5cGVzY3JpcHRgIGZvciBgdHNjYCB0eXBlY2hlY2tzLlxuY29uc3QgdHlwZXNjcmlwdEdvRGVwZW5kZW5jeSA9ICdAdHlwZXNjcmlwdC9uYXRpdmUtcHJldmlldyc7XG5jb25zdCB3YkRlcGVuZGVuY3kgPSAnQHdpbGxib29zdGVyL3diJztcbmNvbnN0IGJ1aWxkVHNEZXBlbmRlbmN5ID0gJ2J1aWxkLXRzJztcbmNvbnN0IGxlZnRob29rRGVwZW5kZW5jeSA9ICdsZWZ0aG9vayc7XG5jb25zdCBtYW5hZ2VkRGVwZW5kZW5jeU5hbWVzID0gbmV3IFNldChbXG4gIHdiRGVwZW5kZW5jeSxcbiAgYnVpbGRUc0RlcGVuZGVuY3ksXG4gIGxlZnRob29rRGVwZW5kZW5jeSxcbiAgdHlwZXNjcmlwdERlcGVuZGVuY3ksXG4gIHR5cGVzY3JpcHRHb0RlcGVuZGVuY3ksXG4gICdzb3J0LXBhY2thZ2UtanNvbicsXG4gIC8vIE1peGVkIEB0eXBlcy9idW4gdmVyc2lvbnMgYWNyb3NzIGEgbW9ub3JlcG8gbG9hZCB0d28gYnVuLXR5cGVzIGNvcGllcywgd2hpY2hcbiAgLy8gYnJlYWtzIGdsb2JhbCBpbnRlcmZhY2UgbWVyZ2luZyAoZS5nLiBSZXNwb25zZS9IZWFkZXJzKSBkdXJpbmcgdHlwZSBjaGVja2luZy5cbiAgJ0B0eXBlcy9idW4nLFxuICAuLi5veGxpbnREZXBzLFxuXSk7XG5jb25zdCBsYXRlc3REZXBlbmRlbmN5VmVyc2lvbkNhY2hlID0gbmV3IE1hcDxzdHJpbmcsIHN0cmluZz4oKTtcbmNvbnN0IHBhY2thZ2VBZ2VHYXRlTXMgPSBidW5NaW5pbXVtUmVsZWFzZUFnZVNlY29uZHMgKiAxMDAwO1xuY29uc3QgbnBtUGFja2FnZVRpbWVzQ2FjaGUgPSBuZXcgTWFwPHN0cmluZywgUmVjb3JkPHN0cmluZywgc3RyaW5nPj4oKTtcbmNvbnN0IGRlcGVuZGVuY3lTZWN0aW9uS2V5cyA9IFsnZGVwZW5kZW5jaWVzJywgJ2RldkRlcGVuZGVuY2llcycsICdvcHRpb25hbERlcGVuZGVuY2llcycsICdwZWVyRGVwZW5kZW5jaWVzJ10gYXMgY29uc3Q7XG5cbnR5cGUgV3JpdGFibGVQYWNrYWdlSnNvbiA9IFNldFJlcXVpcmVkPFxuICBQYWNrYWdlSnNvbixcbiAgJ3NjcmlwdHMnIHwgJ2RlcGVuZGVuY2llcycgfCAnZGV2RGVwZW5kZW5jaWVzJyB8ICdwZWVyRGVwZW5kZW5jaWVzJ1xuPjtcblxuaW50ZXJmYWNlIERlcGVuZGVuY3lVcGRhdGVzIHtcbiAgZGVwZW5kZW5jaWVzOiBzdHJpbmdbXTtcbiAgZGV2RGVwZW5kZW5jaWVzOiBzdHJpbmdbXTtcbiAgcHl0aG9uRGV2RGVwZW5kZW5jaWVzOiBzdHJpbmdbXTtcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlUGFja2FnZUpzb24oXG4gIGNvbmZpZzogUGFja2FnZUNvbmZpZyxcbiAgcm9vdENvbmZpZzogUGFja2FnZUNvbmZpZyxcbiAgc2tpcEFkZGluZ0RlcHM6IGJvb2xlYW5cbik6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2dlbmVyYXRlUGFja2FnZUpzb24nLCBhc3luYyAoKSA9PiB7XG4gICAgYXdhaXQgY29yZShjb25maWcsIHJvb3RDb25maWcsIHNraXBBZGRpbmdEZXBzKTtcbiAgfSk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGNvcmUoY29uZmlnOiBQYWNrYWdlQ29uZmlnLCByb290Q29uZmlnOiBQYWNrYWdlQ29uZmlnLCBza2lwQWRkaW5nRGVwczogYm9vbGVhbik6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCB3b3JrZXJUeXBlc1NjcmlwdEVycm9yID0gZ2V0V29ya2VyVHlwZXNTY3JpcHRFcnJvcihjb25maWcpO1xuICBpZiAod29ya2VyVHlwZXNTY3JpcHRFcnJvcikgdGhyb3cgbmV3IEVycm9yKHdvcmtlclR5cGVzU2NyaXB0RXJyb3IpO1xuICBjb25zdCBmaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJ3BhY2thZ2UuanNvbicpO1xuICBjb25zdCBqc29uT2JqID0gYXdhaXQgcmVhZFBhY2thZ2VKc29uKGZpbGVQYXRoKTtcbiAgdXBkYXRlU2NyaXB0cyhjb25maWcsIGpzb25PYmopO1xuICBhd2FpdCBlbnN1cmVUcnVzdGVkRGVwZW5kZW5jaWVzKGNvbmZpZywganNvbk9iaik7XG4gIG1vdmVNYW5hZ2VkVG9vbERlcGVuZGVuY2llc1RvRGV2RGVwZW5kZW5jaWVzKGpzb25PYmopO1xuICBwcnVuZUNhcGFiaWxpdHlEZXBlbmRlbnRDb21waWxlckRlcGVuZGVuY2llcyhjb25maWcsIGpzb25PYmopO1xuICBjb25zdCBkZXBlbmRlbmN5VXBkYXRlcyA9IGF3YWl0IGFwcGx5UGFja2FnZUpzb25Db252ZW50aW9ucyhjb25maWcsIHJvb3RDb25maWcsIGpzb25PYmopO1xuICBhd2FpdCBub3JtYWxpemVQYWNrYWdlTWV0YWRhdGEoY29uZmlnLCByb290Q29uZmlnLCBqc29uT2JqLCBkZXBlbmRlbmN5VXBkYXRlcyk7XG4gIC8vIE9uIGEgZmlyc3QgcnVuIHRoZXJlIGlzIG5vIG1hbmlmZXN0IGZvciBgYnVuIGFkZGAgdG8gdXBkYXRlIHJlbGlhYmx5LiBXcml0ZSB0aGUgcmVzb2x2ZWRcbiAgLy8gZGVwZW5kZW5jeSB2ZXJzaW9ucyBpbnRvIHRoZSBuZXcgbWFuaWZlc3QgZGlyZWN0bHk7IHRoZSBmaW5hbCByZXBvc2l0b3J5LXdpZGUgYGJ1biBpbnN0YWxsYFxuICAvLyB0aGVuIGluc3RhbGxzIHRoZW0gYW5kIHJlbWFpbnMgdGhlIGF1dGhvcml0YXRpdmUgZmFpbHVyZSBjaGVjay5cbiAgYWRkRGVwZW5kZW5jeVZlcnNpb25zVG9QYWNrYWdlSnNvbihcbiAgICBjb25maWcsXG4gICAgcm9vdENvbmZpZyxcbiAgICBqc29uT2JqLFxuICAgIGRlcGVuZGVuY3lVcGRhdGVzLFxuICAgIHNraXBBZGRpbmdEZXBzIHx8ICFjb25maWcuZG9lc0NvbnRhaW5QYWNrYWdlSnNvblxuICApO1xuICBhd2FpdCB1cGRhdGVQcml2YXRlUGFja2FnZXMoanNvbk9iaik7XG4gIHJlbW92ZUVtcHR5RGVwZW5kZW5jeVNlY3Rpb25zKGpzb25PYmopO1xuXG4gIGRlbGV0ZSBqc29uT2JqLnBhY2thZ2VNYW5hZ2VyO1xuICAvLyBZYXJuIHJlYWRzIHBhY2thZ2UuanNvbiBmcm9tIGRpc2sgYmVmb3JlIGRlY2lkaW5nIHdoZXRoZXIgYHlhcm4gYWRkIC1EYFxuICAvLyBjb25mbGljdHMgd2l0aCBhbiBleGlzdGluZyByZWd1bGFyIGRlcGVuZGVuY3ksIHNvIHRoaXMgd3JpdGUgbXVzdCBmaW5pc2hcbiAgLy8gYmVmb3JlIGluc3RhbGxpbmcgdGhlIG1hbmFnZWQgZGVwZW5kZW5jeSB1cGRhdGVzIGJlbG93LiBLZWVwIHRoaXMgZ2VuZXJhdGVkXG4gIC8vIGZpbGUgc29ydGVkIGV2ZW4gd2hlbiB3ZSBsYXRlciBydW4gdGhlIHRhcmdldCByZXBvc2l0b3J5J3MgZm9ybWF0dGVyIHNvIGFcbiAgLy8gbWlkLXJ1biBpbnRlcnJ1cHRpb24gbmV2ZXIgbGVhdmVzIHBhY2thZ2UuanNvbiBpbiBhIHBhcnRpYWxseSBtYW5hZ2VkIG9yZGVyLlxuICAvLyBBIHJlZnVzZWQgd3JpdGUgKGUuZy4gYSBzeW1saW5rZWQgcGFja2FnZS5qc29uKSBtdXN0IGFsc28gYWJvcnQgdGhlIGRlcGVuZGVuY3kgaW5zdGFsbGF0aW9uXG4gIC8vIGJlbG93OiBgYnVuIGFkZGAgZm9sbG93cyB0aGUgc3ltbGluayBhbmQgd291bGQgbW9kaWZ5IHRoZSBmaWxlIG91dHNpZGUgdGhlIHJlcG9zaXRvcnkuXG4gIGlmICghKGF3YWl0IGZzVXRpbC5nZW5lcmF0ZUZpbGUoZmlsZVBhdGgsIHNlcmlhbGl6ZVBhY2thZ2VKc29uKGpzb25PYmopKSkpIHJldHVybjtcblxuICBpZiAoIXNraXBBZGRpbmdEZXBzKSB7XG4gICAgaW5zdGFsbERlcGVuZGVuY3lVcGRhdGVzKGNvbmZpZywgcm9vdENvbmZpZywganNvbk9iaiwgZGVwZW5kZW5jeVVwZGF0ZXMpO1xuICAgIC8vIEEgbmV3bHkgY3JlYXRlZCBtYW5pZmVzdCBpcyBhbHJlYWR5IHNvcnRlZCBieSB3YmZ5J3MgYnVuZGxlZCBzZXJpYWxpemVyOyB0aGUgdGFyZ2V0IGZvcm1hdHRlclxuICAgIC8vIGlzIGF2YWlsYWJsZSB3aXRob3V0IGFuIGV4dHJhIGZldGNoIG9ubHkgd2hlbiB0aGlzIHJ1biBzdGFydGVkIHdpdGggcGFja2FnZS5qc29uLlxuICAgIGlmIChjb25maWcuZG9lc0NvbnRhaW5QYWNrYWdlSnNvbikge1xuICAgICAgZm9ybWF0UGFja2FnZUpzb25XaXRoUHJvamVjdEZvcm1hdHRlcihjb25maWcsIGZpbGVQYXRoKTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gc2VyaWFsaXplUGFja2FnZUpzb24oanNvbk9iajogV3JpdGFibGVQYWNrYWdlSnNvbik6IHN0cmluZyB7XG4gIC8vIGZzVXRpbC5nZW5lcmF0ZUZpbGUoKSBub3JtYWxpemVzIHRoZSB0cmFpbGluZyBuZXdsaW5lLCBzbyBrZWVwIHRoZSBzZXJpYWxpemVyXG4gIC8vIGZvY3VzZWQgb24gdGhlIEpTT04gcGF5bG9hZCBpdHNlbGYuXG4gIHJldHVybiBKU09OLnN0cmluZ2lmeShzb3J0UGFja2FnZUpzb24oanNvbk9iaiksIHVuZGVmaW5lZCwgMik7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHJlYWRQYWNrYWdlSnNvbihmaWxlUGF0aDogc3RyaW5nKTogUHJvbWlzZTxXcml0YWJsZVBhY2thZ2VKc29uPiB7XG4gIGxldCBqc29uT2JqOiBQYWNrYWdlSnNvbiA9IHt9O1xuICB0cnkge1xuICAgIGNvbnN0IGpzb25UZXh0ID0gYXdhaXQgZnMucHJvbWlzZXMucmVhZEZpbGUoZmlsZVBhdGgsICd1dGY4Jyk7XG4gICAganNvbk9iaiA9IEpTT04ucGFyc2UoanNvblRleHQpIGFzIFBhY2thZ2VKc29uO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIC8vIERvY3VtZW50YXRpb24tb25seSByZXBvc2l0b3JpZXMgaGF2ZSBubyBtYW5pZmVzdCBvbiB0aGVpciBmaXJzdCB3YmZ5IHJ1bi4gU3RhcnRpbmcgZnJvbSBhblxuICAgIC8vIGVtcHR5IG9iamVjdCBsZXRzIHRoZSBub3JtYWwgZ2VuZXJhdG9yIGVzdGFibGlzaCB0aGUgc2FtZSBtYW5hZ2VkIGJhc2VsaW5lIGFzIGV2ZXJ5IG90aGVyXG4gICAgLy8gcmVwb3NpdG9yeTsgbWFsZm9ybWVkIG9yIHVucmVhZGFibGUgZXhpc3RpbmcgbWFuaWZlc3RzIG11c3Qgc3RpbGwgZmFpbCBsb3VkbHkuXG4gICAgaWYgKChlcnJvciBhcyBOb2RlSlMuRXJybm9FeGNlcHRpb24pLmNvZGUgIT09ICdFTk9FTlQnKSB0aHJvdyBlcnJvcjtcbiAgfVxuICBqc29uT2JqLnNjcmlwdHMgPSBqc29uT2JqLnNjcmlwdHMgPz8ge307XG4gIGpzb25PYmouZGVwZW5kZW5jaWVzID0ganNvbk9iai5kZXBlbmRlbmNpZXMgPz8ge307XG4gIGpzb25PYmouZGV2RGVwZW5kZW5jaWVzID0ganNvbk9iai5kZXZEZXBlbmRlbmNpZXMgPz8ge307XG4gIGpzb25PYmoucGVlckRlcGVuZGVuY2llcyA9IGpzb25PYmoucGVlckRlcGVuZGVuY2llcyA/PyB7fTtcbiAgcmV0dXJuIGpzb25PYmogYXMgV3JpdGFibGVQYWNrYWdlSnNvbjtcbn1cblxuZnVuY3Rpb24gcHJ1bmVDYXBhYmlsaXR5RGVwZW5kZW50Q29tcGlsZXJEZXBlbmRlbmNpZXMoY29uZmlnOiBQYWNrYWdlQ29uZmlnLCBqc29uT2JqOiBXcml0YWJsZVBhY2thZ2VKc29uKTogdm9pZCB7XG4gIC8vIFJ1biBiZWZvcmUgYXBwbHlQYWNrYWdlSnNvbkNvbnZlbnRpb25zLCB3aGljaCByZS1hZGRzIHRzZ28gb25seSBmb3IgY3VycmVudCBOZXh0LmpzLWZhbWlseSByZXBvc2l0b3JpZXMuXG4gIGRlbGV0ZSBqc29uT2JqLmRlcGVuZGVuY2llc1t0eXBlc2NyaXB0R29EZXBlbmRlbmN5XTtcbiAgZGVsZXRlIGpzb25PYmouZGV2RGVwZW5kZW5jaWVzW3R5cGVzY3JpcHRHb0RlcGVuZGVuY3ldO1xuICBpZiAoIWNvbmZpZy5kb2VzQ29udGFpblR5cGVTY3JpcHQgJiYgIWNvbmZpZy5kb2VzQ29udGFpblR5cGVTY3JpcHRJblBhY2thZ2VzKSB7XG4gICAgZGVsZXRlIGpzb25PYmouZGVwZW5kZW5jaWVzW3R5cGVzY3JpcHREZXBlbmRlbmN5XTtcbiAgICBkZWxldGUganNvbk9iai5kZXZEZXBlbmRlbmNpZXNbdHlwZXNjcmlwdERlcGVuZGVuY3ldO1xuICB9XG59XG5cbmZ1bmN0aW9uIHVwZGF0ZVNjcmlwdHMoY29uZmlnOiBQYWNrYWdlQ29uZmlnLCBqc29uT2JqOiBXcml0YWJsZVBhY2thZ2VKc29uKTogdm9pZCB7XG4gIGpzb25PYmouc2NyaXB0cyA9IHsgLi4uanNvbk9iai5zY3JpcHRzLCAuLi5nZW5lcmF0ZVNjcmlwdHMoY29uZmlnLCBqc29uT2JqLnNjcmlwdHMpIH07XG59XG5cbi8qKlxuICogS2VlcHMgdGhlIHByb2plY3QncyBvd24gc2VnbWVudHMgaW4gb3JkZXIsIHJlcGxhY2luZyB0aGUgZmlyc3QgbWFuYWdlZCBnZW4tY29kZSBzcGVsbGluZyB3aXRoXG4gKiBgYnVuIHdiIGdlbi1jb2RlYCBhbmQgZHJvcHBpbmcgbGF0ZXIgZHVwbGljYXRlcy4gQXBwZW5kcyBnZW5lcmF0aW9uIG9ubHkgd2hlbiB0aGUgc2NyaXB0XG4gKiBjb250YWluZWQgbm9uZSwgc28gbm90aGluZyBpcyByZW9yZGVyZWQuXG4gKi9cbmZ1bmN0aW9uIHJlYnVpbGRQb3N0aW5zdGFsbFNlZ21lbnRzKHNlZ21lbnRzOiBzdHJpbmdbXSwgc2NyaXB0czogUGFja2FnZUpzb24uU2NyaXB0cyk6IHN0cmluZ1tdIHtcbiAgY29uc3Qga2luZHMgPSBzZWdtZW50cy5tYXAoKHNlZ21lbnQpID0+IGNsYXNzaWZ5U2NyaXB0U2VnbWVudChzZWdtZW50LCBzY3JpcHRzLCB0cnVlKSk7XG4gIC8vIEEgd3JhcHBlciBhcm91bmQgYSBjdXN0b21pemVkIGdlbi1jb2RlIGFscmVhZHkgZ2VuZXJhdGVzOyBhZGRpbmcgYW5vdGhlciBpbnZvY2F0aW9uIHdvdWxkIHJ1biBldmVyeVxuICAvLyBnZW5lcmF0b3IgdHdpY2UuXG4gIGxldCBnZW5lcmF0aW9uUGxhY2VkID0ga2luZHMuaW5jbHVkZXMoJ2dlbkNvZGVXcmFwcGVyJyk7XG4gIGNvbnN0IHJlc3VsdDogc3RyaW5nW10gPSBbXTtcbiAgZm9yIChjb25zdCBbaW5kZXgsIHNlZ21lbnRdIG9mIHNlZ21lbnRzLmVudHJpZXMoKSkge1xuICAgIGNvbnN0IGtpbmQgPSBraW5kc1tpbmRleF07XG4gICAgaWYgKGtpbmQgPT09ICdjdXN0b20nIHx8IGtpbmQgPT09ICdnZW5Db2RlV3JhcHBlcicpIHtcbiAgICAgIHJlc3VsdC5wdXNoKHNlZ21lbnQpO1xuICAgIH0gZWxzZSBpZiAoIWdlbmVyYXRpb25QbGFjZWQpIHtcbiAgICAgIHJlc3VsdC5wdXNoKCdidW4gd2IgZ2VuLWNvZGUnKTtcbiAgICAgIGdlbmVyYXRpb25QbGFjZWQgPSB0cnVlO1xuICAgIH1cbiAgfVxuICBpZiAoIWdlbmVyYXRpb25QbGFjZWQpIHJlc3VsdC5wdXNoKCdidW4gd2IgZ2VuLWNvZGUnKTtcbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuLyoqXG4gKiBOb3JtYWxpemVzIG1hbmFnZWQgZ2VuLWNvZGUgc2VnbWVudHMgd2hpbGUga2VlcGluZyB0aGUgZmlyc3Qgc2VnbWVudCdzIHBvc2l0aW9uIHNvIGEgY3VzdG9tXG4gKiBzdGVwIHRoYXQgY29uc3VtZXMgZ2VuZXJhdGVkIG91dHB1dCBzdGlsbCBydW5zIGFmdGVyIGl0LiBSZXR1cm5zIHdpdGhvdXQgY2hhbmdpbmcgYW5cbiAqIHVucGFyc2VhYmxlIHNjcmlwdC5cbiAqL1xuZnVuY3Rpb24gdXBkYXRlUG9zdGluc3RhbGxTY3JpcHQoc2NyaXB0czogUGFja2FnZUpzb24uU2NyaXB0cywgbWFuYWdlc1dvcmtlclR5cGVzOiBib29sZWFuKTogdm9pZCB7XG4gIC8vIGBidW4gd2IgZ2VuLWNvZGVgIHJlZ2VuZXJhdGVzIHdvcmtlci1jb25maWd1cmF0aW9uLmQudHMgaXRzZWxmLCBzbyBhIHBhY2thZ2Ugd2l0aCBhXG4gIC8vIGNvZGUtZ2VuZXJhdGlvbiBvciB3b3JrZXItdHlwZXMgcGlwZWxpbmUgZ2V0cyBvbmUgbWFuYWdlZCBnZW5lcmF0aW9uIHNlZ21lbnQuXG4gIGlmIChzY3JpcHRzWydnZW4tY29kZSddIHx8IG1hbmFnZXNXb3JrZXJUeXBlcykge1xuICAgIC8vIFByb2plY3Qtb3duZWQgc3RlcHMgYXJlIG5ldmVyIGRyb3BwZWQsIGFuZCB0aGVpciBQT1NJVElPTiByZWxhdGl2ZSB0byBnZW5lcmF0aW9uIGlzIHByZXNlcnZlZDogYSBzdGVwXG4gICAgLy8gYmVmb3JlIGl0IG1heSBwcm9kdWNlIGB3cmFuZ2xlciB0eXBlc2AnIGlucHV0cyAoYSB3cmFuZ2xlciBjb25maWcsIGAuZGV2LnZhcnNgKSwgd2hpbGUgb25lIGFmdGVyIGl0IG1heVxuICAgIC8vIGNvbnN1bWUgdGhlIGdlbmVyYXRlZCB0eXBlcy4gU28gdGhlIG1hbmFnZWQgZ2VuZXJhdGlvbiByZXBsYWNlcyB0aGUgZmlyc3QgbWFuYWdlZCBzZWdtZW50IGluIHBsYWNlLCBhbmQgaXNcbiAgICAvLyBhcHBlbmRlZCBvbmx5IHdoZW4gdGhlIHNjcmlwdCBoYWQgbm9uZS4gQSB3cmFwcGVyIGFyb3VuZCBhIGN1c3RvbWl6ZWQgZ2VuLWNvZGUgYWxyZWFkeSBwZXJmb3JtcyB0aGVcbiAgICAvLyBnZW5lcmF0aW9uIHBsdXMgdGhlIHByb2plY3QncyBvd24gc3RlcHMsIHNvIGl0IHN1cHByZXNzZXMgdGhlIHJlcGxhY2VtZW50IGVudGlyZWx5LlxuICAgIGNvbnN0IHNlZ21lbnRzID0gc2NyaXB0cy5wb3N0aW5zdGFsbCA9PT0gdW5kZWZpbmVkID8gW10gOiBzcGxpdFNjcmlwdFNlZ21lbnRzKHNjcmlwdHMucG9zdGluc3RhbGwpO1xuICAgIGNvbnN0IGtlcHRTZWdtZW50cyA9IHNlZ21lbnRzICYmIHJlYnVpbGRQb3N0aW5zdGFsbFNlZ21lbnRzKHNlZ21lbnRzLCBzY3JpcHRzKTtcbiAgICBpZiAoa2VwdFNlZ21lbnRzKSB7XG4gICAgICBzY3JpcHRzLnBvc3RpbnN0YWxsID0ga2VwdFNlZ21lbnRzLmpvaW4oJyAmJiAnKTtcbiAgICB9XG4gICAgLy8gQW55IG90aGVyIHVucGFyc2VhYmxlIHBvc3RpbnN0YWxsIGlzIGxlZnQgdG8gYSBodW1hbiByYXRoZXIgdGhhbiByZXdyaXR0ZW4gZnJvbSBhIHdyb25nIHBhcnNlLlxuICB9XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGFwcGx5UGFja2FnZUpzb25Db252ZW50aW9ucyhcbiAgY29uZmlnOiBQYWNrYWdlQ29uZmlnLFxuICByb290Q29uZmlnOiBQYWNrYWdlQ29uZmlnLFxuICBqc29uT2JqOiBXcml0YWJsZVBhY2thZ2VKc29uXG4pOiBQcm9taXNlPERlcGVuZGVuY3lVcGRhdGVzPiB7XG4gIGNvbnN0IGRlcGVuZGVuY2llczogc3RyaW5nW10gPSBbXTtcbiAgY29uc3QgZGV2RGVwZW5kZW5jaWVzID0gWydzb3J0LXBhY2thZ2UtanNvbiddO1xuICBjb25zdCBweXRob25EZXZEZXBlbmRlbmNpZXM6IHN0cmluZ1tdID0gW107XG4gIGNvbnN0IGhhc0phdmEgPSBkb2VzQ29udGFpbkphdmEoY29uZmlnKTtcblxuICBpZiAoXG4gICAgaGFzSmF2YSAmJlxuICAgICFmcy5leGlzdHNTeW5jKHBhdGguam9pbihyb290Q29uZmlnLmRpclBhdGgsICcucHJldHRpZXJyYy5qc29uJykpICYmXG4gICAgIWZzLmV4aXN0c1N5bmMocGF0aC5qb2luKGNvbmZpZy5kaXJQYXRoLCAnLnByZXR0aWVycmMuanNvbicpKVxuICApIHtcbiAgICBqc29uT2JqLnByZXR0aWVyID0gJ0B3aWxsYm9vc3Rlci9wcmV0dGllci1jb25maWcnO1xuICAgIGRldkRlcGVuZGVuY2llcy5wdXNoKCdwcmV0dGllci1wbHVnaW4tamF2YScsICdAd2lsbGJvb3N0ZXIvcHJldHRpZXItY29uZmlnJyk7XG4gIH1cbiAgaWYgKGhhc0phdmEpIHtcbiAgICBkZXZEZXBlbmRlbmNpZXMucHVzaCgncHJldHRpZXInKTtcbiAgfVxuXG4gIGlmIChjb25maWcuaXNSb290KSB7XG4gICAgLy8gTGVmdGhvb2sgZ2VuZXJhdGlvbiBpcyBiZXN0LWVmZm9ydCBhbmQgLmxlZnRob29rIGlzIGFic2VudCBmcm9tIERvY2tlciBidWlsZCBjb250ZXh0cywgc28gYVxuICAgIC8vIG1pc3Npbmcgbm9ybWFsaXplciBpcyB2YWxpZC4gT25jZSBwcmVzZW50LCBpdHMgZmFpbHVyZSBtdXN0IGFib3J0IGluc3RhbGwgcmF0aGVyIHRoYW4gbGVhdmUgYVxuICAgIC8vIEd1YXJkLXBpbm5lZCBsb2NrZmlsZSBiZWhpbmQ7IGtlZXAgdGhhdCBmYWlsLWZhc3QgZ3JvdXBpbmcgZXhwbGljaXQgYmVmb3JlIGFueSB3b3Jrc3BhY2UgYnVpbGQuXG4gICAganNvbk9iai5zY3JpcHRzLnByZXBhcmUgPVxuICAgICAgJyhidW4gbGVmdGhvb2sgaW5zdGFsbCB8fCB0cnVlKSAmJiAodGVzdCAhIC1mIC5sZWZ0aG9vay9ub3JtYWxpemUtYnVuLWxvY2tmaWxlLnNoIHx8IGJhc2ggLmxlZnRob29rL25vcm1hbGl6ZS1idW4tbG9ja2ZpbGUuc2gpJztcbiAgICAvLyBXaGVuIEB3aWxsYm9vc3Rlci93YiBpcyBhIHdvcmtzcGFjZSBvZiB0aGlzIHJlcG9zaXRvcnksIHRoZSBnZW5lcmF0ZWQgYGJ1biB3YiDigKZgIHNjcmlwdHMgcnVuXG4gICAgLy8gaXRzIGdpdGlnbm9yZWQgZGlzdCBidWlsZCAoYmluL2luZGV4LmpzIGltcG9ydHMgLi4vZGlzdC9pbmRleC5qcyksIHNvIGEgZnJlc2ggY2hlY2tvdXQgbXVzdFxuICAgIC8vIGJ1aWxkIGl0IGR1cmluZyBpbnN0YWxsOyByZWdpc3RyeSBpbnN0YWxscyBzaGlwIGEgcHJlYnVpbHQgZGlzdCBhbmQgbmVlZCBubyBleHRyYSBzdGVwLlxuICAgIGNvbnN0IHdiV29ya3NwYWNlRGlyID0gZ2V0V29ya3NwYWNlUGFja2FnZURpcnMocm9vdENvbmZpZykuZ2V0KHdiRGVwZW5kZW5jeSk7XG4gICAgaWYgKHdiV29ya3NwYWNlRGlyKSB7XG4gICAgICAvLyBTaW5nbGUgcXVvdGVzICh3aXRoIGVtYmVkZGVkIHF1b3RlcyBlc2NhcGVkKSBwcmV2ZW50IHRoZSBzaGVsbCBmcm9tIGV4cGFuZGluZyBgJCjigKYpYCBvclxuICAgICAgLy8gdmFyaWFibGVzIHRoYXQgYSBob3N0aWxlIGRpcmVjdG9yeSBuYW1lIGNvdWxkIHNtdWdnbGUgaW50byB0aGUgZ2VuZXJhdGVkIHNjcmlwdC5cbiAgICAgIGpzb25PYmouc2NyaXB0cy5wcmVwYXJlICs9IGAgJiYgYnVuIHJ1biAtLWN3ZCAnJHt3YldvcmtzcGFjZURpci5yZXBsYWNlQWxsKFwiJ1wiLCBTdHJpbmcucmF3YCdcXCcnYCl9JyBidWlsZGA7XG4gICAgfVxuICAgIGRldkRlcGVuZGVuY2llcy5wdXNoKGxlZnRob29rRGVwZW5kZW5jeSk7XG5cbiAgICBpZiAoY29uZmlnLmRlcGVuZGluZy5zZW1hbnRpY1JlbGVhc2UpIHtcbiAgICAgIGlmIChkb2VzUmVsZWFzZVNjcmlwdEluc3RhbGxTZW1hbnRpY1JlbGVhc2UoanNvbk9iai5zY3JpcHRzLnJlbGVhc2UpKSB7XG4gICAgICAgIGRlbGV0ZSBqc29uT2JqLmRldkRlcGVuZGVuY2llc1snc2VtYW50aWMtcmVsZWFzZSddO1xuICAgICAgfSBlbHNlIGlmIChcbiAgICAgICAgIWpzb25PYmouZGV2RGVwZW5kZW5jaWVzWydzZW1hbnRpYy1yZWxlYXNlJ10gJiZcbiAgICAgICAgIWpzb25PYmouZGV2RGVwZW5kZW5jaWVzWydtdWx0aS1zZW1hbnRpYy1yZWxlYXNlJ10gJiZcbiAgICAgICAgIWpzb25PYmouZGV2RGVwZW5kZW5jaWVzWydAcWl3aS9tdWx0aS1zZW1hbnRpYy1yZWxlYXNlJ11cbiAgICAgICkge1xuICAgICAgICBkZXZEZXBlbmRlbmNpZXMucHVzaCgnc2VtYW50aWMtcmVsZWFzZScpO1xuICAgICAgfVxuICAgICAganNvbk9iai52ZXJzaW9uID0gJzAuMC4wLXNlbWFudGljYWxseS1yZWxlYXNlZCc7XG4gICAgfVxuXG4gICAgaWYgKGNvbmZpZy5kZXBlbmRpbmcucGxheXdyaWdodFRlc3QpIHtcbiAgICAgIC8vIFNpbmNlIGFydGlsbGVyeSByZXF1aXJlcyBhIHNwZWNpZmljIHZlcnNpb24gb2YgQHBsYXl3cmlnaHQvdGVzdFxuICAgICAgY29uc3QgaGFzQXJ0aWxsZXJ5ID0ganNvbk9iai5kZXBlbmRlbmNpZXMuYXJ0aWxsZXJ5IHx8IGpzb25PYmouZGV2RGVwZW5kZW5jaWVzLmFydGlsbGVyeTtcbiAgICAgIC8vIFNpbmNlIGxsbS10b29sYm94IHJlcXVpcmVzIEBwbGF5d3JpZ2h0L3Rlc3QgaW4gZGVwZW5kZW5jaWVzXG4gICAgICBpZiAoIWhhc0FydGlsbGVyeSAmJiAhanNvbk9iai5kZXBlbmRlbmNpZXNbJ0BwbGF5d3JpZ2h0L3Rlc3QnXSkge1xuICAgICAgICBkZXZEZXBlbmRlbmNpZXMucHVzaCgnQHBsYXl3cmlnaHQvdGVzdCcpO1xuICAgICAgfVxuICAgICAgaWYgKGNvbmZpZy5kZXBlbmRpbmcucGxheXdyaWdodFJ1bnRpbWUpIHtcbiAgICAgICAgLy8gUnVudGltZSBpbXBvcnRzIG5lZWQgdGhlIHN0YW5kYWxvbmUgcGFja2FnZSBhZnRlciBEb2NrZXIgcHJ1bmluZyByZW1vdmVzIGRldkRlcGVuZGVuY2llcy5cbiAgICAgICAganNvbk9iai5kZXBlbmRlbmNpZXMucGxheXdyaWdodCA/Pz1cbiAgICAgICAgICBqc29uT2JqLmRldkRlcGVuZGVuY2llcy5wbGF5d3JpZ2h0ID8/XG4gICAgICAgICAganNvbk9iai5kZXBlbmRlbmNpZXNbJ0BwbGF5d3JpZ2h0L3Rlc3QnXSA/P1xuICAgICAgICAgIGpzb25PYmouZGV2RGVwZW5kZW5jaWVzWydAcGxheXdyaWdodC90ZXN0J107XG4gICAgICAgIGRlcGVuZGVuY2llcy5wdXNoKCdwbGF5d3JpZ2h0Jyk7XG4gICAgICAgIGRlbGV0ZSBqc29uT2JqLmRldkRlcGVuZGVuY2llcy5wbGF5d3JpZ2h0O1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZGVsZXRlIGpzb25PYmouZGVwZW5kZW5jaWVzLnBsYXl3cmlnaHQ7XG4gICAgICAgIGRlbGV0ZSBqc29uT2JqLmRldkRlcGVuZGVuY2llcy5wbGF5d3JpZ2h0O1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChjb25maWcuZG9lc0NvbnRhaW5TdWJQYWNrYWdlSnNvbnMpIHtcbiAgICAgIC8vIFdlIGRvbid0IGFsbG93IG5vbi1hcnJheSB3b3Jrc3BhY2VzIGluIG1vbm9yZXBvLiBZYXJuIHYxJ3Mgb2JqZWN0IGZvcm0ga2VlcHMgaXRzXG4gICAgICAvLyBkZWNsYXJlZCBwYXR0ZXJucyAod29ya3NwYWNlcy5wYWNrYWdlcyk7IG9ubHkgZXh0cmFzIHN1Y2ggYXMgbm9ob2lzdCBhcmUgZHJvcHBlZC5cbiAgICAgIC8vIEZvcmNlIGBwYWNrYWdlcy8qYCBvbmx5IHdoZW4gaXQgYWN0dWFsbHkgbWF0Y2hlcyBhIHdvcmtzcGFjZSBtYW5pZmVzdDogYW4gYXBwcy8qLW9ubHlcbiAgICAgIC8vIG1vbm9yZXBvIG11c3Qgbm90IGdldCBhIG5ldmVyLW1hdGNoaW5nIHBhdHRlcm4gYXBwZW5kZWQgdG8gaXRzIGRlY2xhcmF0aW9uLiBBXG4gICAgICAvLyBiYXNlbGluZS1zZWVkaW5nIGRlY2xhcmF0aW9uIG5lZWRzIG5vIGZvcmNlZCBwYXR0ZXJuIGF0IGFsbCDigJQgdGhlIHNlZWRlZCBiYXNlbGluZVxuICAgICAgLy8gKGAqLypgIG9yIGAqKmApIGFscmVhZHkgY292ZXJzIHBhY2thZ2VzLyouIFRoZSBmb3JjZWQgcGF0dGVybiBpcyBQUkVQRU5ERUQ6IEJ1blxuICAgICAgLy8gZXZhbHVhdGVzIHdvcmtzcGFjZSBwYXR0ZXJucyBzZXF1ZW50aWFsbHksIHNvIGEgcG9zaXRpdmUgcGF0dGVybiBwbGFjZWQgYWZ0ZXIgYSB1c2VyXG4gICAgICAvLyBuZWdhdGlvbiB3b3VsZCByZS1pbmNsdWRlIHRoZSBuZWdhdGVkIHBhY2thZ2VzLiBBIGRlY2xhcmF0aW9uIHRoYXQgYWxyZWFkeSBjb3ZlcnNcbiAgICAgIC8vIHBhY2thZ2VzLyogdW5kZXIgbm9ybWFsaXphdGlvbiAoZS5nLiBgLi9wYWNrYWdlcy8qYCkgaXMga2VwdCB2ZXJiYXRpbTogZm9yY2luZyBhIHRleHR1YWxcbiAgICAgIC8vIGBwYWNrYWdlcy8qYCBuZXh0IHRvIGl0IHdvdWxkIHBlcnNpc3QgYSBkdXBsaWNhdGUgZXF1aXZhbGVudCBwYXR0ZXJuLlxuICAgICAgY29uc3QgZm9yY2VkUGF0dGVybnMgPVxuICAgICAgICAhaGFzSW1wbGljaXRXb3Jrc3BhY2VCYXNlbGluZShqc29uT2JqLndvcmtzcGFjZXMpICYmXG4gICAgICAgICFoYXNEZWNsYXJlZFBhY2thZ2VzU3RhclBhdHRlcm4oanNvbk9iai53b3Jrc3BhY2VzKSAmJlxuICAgICAgICBmZy5nbG9iU3luYygncGFja2FnZXMvKi9wYWNrYWdlLmpzb24nLCB7IGN3ZDogY29uZmlnLmRpclBhdGgsIGlnbm9yZTogWycqKi9ub2RlX21vZHVsZXMvKionXSB9KS5sZW5ndGggPiAwXG4gICAgICAgICAgPyBbJ3BhY2thZ2VzLyonXVxuICAgICAgICAgIDogW107XG4gICAgICBqc29uT2JqLndvcmtzcGFjZXMgPSBtZXJnZS5hbGwoW2ZvcmNlZFBhdHRlcm5zLCBnZXREZWNsYXJlZFdvcmtzcGFjZVBhdHRlcm5zKGpzb25PYmoud29ya3NwYWNlcyldLCB7XG4gICAgICAgIGFycmF5TWVyZ2U6IGNvbWJpbmVNZXJnZSxcbiAgICAgIH0pO1xuICAgICAgLy8gQm90aCBpbnB1dHMgY2FuIGJlIGVtcHR5IChlLmcuIHBhY2thZ2VzL3BhY2thZ2UuanNvbiB3aXRob3V0IGFueSBwYWNrYWdlcy8qL3BhY2thZ2UuanNvblxuICAgICAgLy8gYW5kIG5vIGRlY2xhcmVkIHdvcmtzcGFjZXMpOyBkbyBub3QgcGVyc2lzdCBhIG1lYW5pbmdsZXNzIGB3b3Jrc3BhY2VzOiBbXWAuXG4gICAgICBpZiAoQXJyYXkuaXNBcnJheShqc29uT2JqLndvcmtzcGFjZXMpICYmIGpzb25PYmoud29ya3NwYWNlcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgZGVsZXRlIGpzb25PYmoud29ya3NwYWNlcztcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKEFycmF5LmlzQXJyYXkoanNvbk9iai53b3Jrc3BhY2VzKSkge1xuICAgICAganNvbk9iai53b3Jrc3BhY2VzID0ganNvbk9iai53b3Jrc3BhY2VzLmZpbHRlcihcbiAgICAgICAgKHdvcmtzcGFjZSkgPT5cbiAgICAgICAgICBmZy5nbG9iU3luYyh3b3Jrc3BhY2UsIHtcbiAgICAgICAgICAgIGRvdDogdHJ1ZSxcbiAgICAgICAgICAgIGN3ZDogY29uZmlnLmRpclBhdGgsXG4gICAgICAgICAgICBpZ25vcmU6IGdsb2JJZ25vcmUsXG4gICAgICAgICAgfSkubGVuZ3RoID4gMFxuICAgICAgKTtcbiAgICAgIGlmIChqc29uT2JqLndvcmtzcGFjZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIGRlbGV0ZSBqc29uT2JqLndvcmtzcGFjZXM7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLy8gZml4ZXJzL25leHRDb25maWcudHMgZW5hYmxlcyBgcmVhY3RDb21waWxlcjogdHJ1ZWAgZm9yIGV2ZXJ5IE5leHQuanMgcHJvamVjdCwgYW5kIE5leHQuanNcbiAgLy8gcmVzb2x2ZXMgYGJhYmVsLXBsdWdpbi1yZWFjdC1jb21waWxlcmAgYXQgYnVpbGQgdGltZSB3aGVuIFJlYWN0IENvbXBpbGVyIGlzIG9uLiBBZGQgaXQgaGVyZSBzb1xuICAvLyB0aGUgbWFuYWdlZCBuZXh0LmNvbmZpZyBuZXZlciBicmVha3MgYG5leHQgYnVpbGRgIHdpdGggYW4gdW5yZXNvbHZlZC1wYWNrYWdlIGVycm9yLlxuICBpZiAoY29uZmlnLmRlcGVuZGluZy5uZXh0KSB7XG4gICAgZGV2RGVwZW5kZW5jaWVzLnB1c2goJ2JhYmVsLXBsdWdpbi1yZWFjdC1jb21waWxlcicpO1xuICB9XG5cbiAgLy8gYHdiIHZlcmlmeSAtLWZ1bGxgIGF1ZGl0cyBldmVyeSBgKi5zbGlkZXYubWRgIGRlY2sgd2l0aCBzbGlkZXYtY2hlY2ssIHNvIHRoZSBjaGVja2VyIGhhcyB0byBiZVxuICAvLyBpbnN0YWxsZWQgd2hlcmV2ZXIgYSBkZWNrIGxpdmVzLlxuICBpZiAoY29uZmlnLmRvZXNDb250YWluU2xpZGV2TWQpIHtcbiAgICBkZXZEZXBlbmRlbmNpZXMucHVzaCgnc2xpZGV2LWNoZWNrJyk7XG4gIH1cblxuICBpZiAoIWlzV2JQYWNrYWdlKGpzb25PYmopKSB7XG4gICAgLy8gQSBgd29ya3NwYWNlOmAgc3BlY2lmaWVyIGRlcGVuZHMgb24gdGhlIHdiIGRldmVsb3BlZCBpbiB0aGlzIHJlcG9zaXRvcnkgKGUuZy5cbiAgICAvLyBXaWxsQm9vc3Rlci9zaGFyZWQgaXRzZWxmKTsgaW5zdGFsbGluZyB0aGUgbGF0ZXN0IHJlZ2lzdHJ5IHJlbGVhc2Ugb3ZlciBpdCB3b3VsZCBzaWxlbnRseVxuICAgIC8vIHJlcGxhY2UgdGhlIGxvY2FsIGJ1aWxkIHdpdGggYSBwdWJsaXNoZWQgb25lLCBzbyBsZWF2ZSBzdWNoIGEgZGVjbGFyYXRpb24gdW50b3VjaGVkLlxuICAgIGNvbnN0IHdiU3BlY2lmaWVyID0ganNvbk9iai5kZXBlbmRlbmNpZXNbd2JEZXBlbmRlbmN5XSA/PyBqc29uT2JqLmRldkRlcGVuZGVuY2llc1t3YkRlcGVuZGVuY3ldO1xuICAgIGlmICghd2JTcGVjaWZpZXI/LnN0YXJ0c1dpdGgoJ3dvcmtzcGFjZTonKSkge1xuICAgICAgaWYgKHNob3VsZEtlZXBXYkFzUnVudGltZURlcGVuZGVuY3koanNvbk9iaikpIHtcbiAgICAgICAgZGVwZW5kZW5jaWVzLnB1c2god2JEZXBlbmRlbmN5KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGRldkRlcGVuZGVuY2llcy5wdXNoKHdiRGVwZW5kZW5jeSk7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIC8vIGJ1aWxkLXRzIG93bnMgVHlwZVNjcmlwdCBleGVjdXRpb24gYW5kIGRlY2xhcmF0aW9uIGVtaXQuIHdiZnkgbXVzdCBhbHdheXNcbiAgLy8ga2VlcCBleGlzdGluZyBidWlsZC10cyB1c2VycyBjdXJyZW50IGJlY2F1c2Ugb2xkZXIgcmVsZWFzZXMgY2FuIGVtaXQgLmQudHNcbiAgLy8gZmlsZXMgYXQgcGF0aHMgdGhhdCBubyBsb25nZXIgbWF0Y2ggcGFja2FnZSBleHBvcnRzLlxuICBpZiAoXG4gICAganNvbk9iai5kZXBlbmRlbmNpZXNbYnVpbGRUc0RlcGVuZGVuY3ldIHx8XG4gICAganNvbk9iai5kZXZEZXBlbmRlbmNpZXNbYnVpbGRUc0RlcGVuZGVuY3ldIHx8XG4gICAgT2JqZWN0LnZhbHVlcyhqc29uT2JqLnNjcmlwdHMpLnNvbWUoKHNjcmlwdCkgPT4gc2NyaXB0Py5pbmNsdWRlcyhidWlsZFRzRGVwZW5kZW5jeSkpXG4gICkge1xuICAgIGlmIChzaG91bGRLZWVwQnVpbGRUc0FzUnVudGltZURlcGVuZGVuY3koanNvbk9iaikpIHtcbiAgICAgIGRlcGVuZGVuY2llcy5wdXNoKGJ1aWxkVHNEZXBlbmRlbmN5KTtcbiAgICB9IGVsc2Uge1xuICAgICAgZGV2RGVwZW5kZW5jaWVzLnB1c2goYnVpbGRUc0RlcGVuZGVuY3kpO1xuICAgIH1cbiAgfVxuICBpZiAoZG9lc0NvbnRhaW5Kc09yVHMoY29uZmlnKSkge1xuICAgIGRldkRlcGVuZGVuY2llcy5wdXNoKC4uLm94bGludERlcHMpO1xuICB9XG5cbiAgY29uc3QgdHNjb25maWdCYXNlRGVwZW5kZW5jaWVzID0gZG9lc0NvbnRhaW5Kc09yVHMoY29uZmlnKSA/IGdldFRzY29uZmlnQmFzZURlcGVuZGVuY2llcyhjb25maWcpIDogW107XG4gIGF3YWl0IHJlbW92ZVVudXNlZFRzY29uZmlnQmFzZURlcGVuZGVuY2llcyhjb25maWcsIGpzb25PYmosIHRzY29uZmlnQmFzZURlcGVuZGVuY2llcyk7XG4gIGRldkRlcGVuZGVuY2llcy5wdXNoKC4uLnRzY29uZmlnQmFzZURlcGVuZGVuY2llcyk7XG5cbiAgaWYgKGNvbmZpZy5kb2VzQ29udGFpblR5cGVTY3JpcHQgfHwgY29uZmlnLmRvZXNDb250YWluVHlwZVNjcmlwdEluUGFja2FnZXMpIHtcbiAgICAvLyBUeXBlU2NyaXB0IDcgc2hpcHMgdGhlIG5hdGl2ZSBjb21waWxlciBhcyB0aGUgYHR5cGVzY3JpcHRgIHBhY2thZ2UsIHNvIGl0IGlzXG4gICAgLy8gbm93IHRoZSBtYW5hZ2VkIGNvbXBpbGVyIGZvciBldmVyeSBUeXBlU2NyaXB0IHJlcG8gKHR5cGVjaGVja2luZyBydW5zIGB0c2NgKS5cbiAgICBkZXZEZXBlbmRlbmNpZXMucHVzaCh0eXBlc2NyaXB0RGVwZW5kZW5jeSk7XG4gICAgLy8gTmV4dC5qcydzIGBuZXh0IGJ1aWxkYCBpbnNwZWN0cyBgQHR5cGVzY3JpcHQvbmF0aXZlLXByZXZpZXdgICh0c2dvKSB0byBydW4gaXRzIHR5cGVcbiAgICAvLyBjaGVjazsgdGhlIGB0eXBlc2NyaXB0YCB2NyBwYWNrYWdlIGFsb25lIGxhY2tzIHRoZSBBUEkgbmV4dCBuZWVkcywgc28ga2VlcCBib3RoXG4gICAgLy8gaW5zdGFsbGVkIGZvciBOZXh0LmpzLWZhbWlseSByZXBvcy4gU2VlIHRoZSB0eXBlc2NyaXB0R29EZXBlbmRlbmN5IGNvbW1lbnQgYWJvdmUuXG4gICAgaWYgKGNvbmZpZy5kZXBlbmRpbmcubmV4dCB8fCBjb25maWcuZGVwZW5kaW5nLmJsaXR6IHx8IGNvbmZpZy5kZXBlbmRpbmcudmluZXh0KSB7XG4gICAgICBkZXZEZXBlbmRlbmNpZXMucHVzaCh0eXBlc2NyaXB0R29EZXBlbmRlbmN5KTtcbiAgICB9XG4gICAgLy8gUmVhY3QgTmF0aXZlIHJlbGllcyBvbiBAdHNjb25maWcvcmVhY3QtbmF0aXZlJ3MgYW1iaWVudCB0eXBlcyBpbnN0ZWFkIG9mIEB0eXBlcy9idW4uXG4gICAgaWYgKCFjb25maWcuZGVwZW5kaW5nLnJlYWN0TmF0aXZlKSB7XG4gICAgICBkZXZEZXBlbmRlbmNpZXMucHVzaCgnQHR5cGVzL2J1bicpO1xuICAgIH1cbiAgICBpZiAoXG4gICAgICBqc29uT2JqLmRlcGVuZGVuY2llcy5qZXN0IHx8XG4gICAgICBqc29uT2JqLmRldkRlcGVuZGVuY2llcy5qZXN0IHx8XG4gICAgICBqc29uT2JqLmRlcGVuZGVuY2llc1snQGplc3QvZ2xvYmFscyddIHx8XG4gICAgICBqc29uT2JqLmRldkRlcGVuZGVuY2llc1snQGplc3QvZ2xvYmFscyddIHx8XG4gICAgICBqc29uT2JqLmRlcGVuZGVuY2llc1sndHMtamVzdCddIHx8XG4gICAgICBqc29uT2JqLmRldkRlcGVuZGVuY2llc1sndHMtamVzdCddXG4gICAgKSB7XG4gICAgICBkZXZEZXBlbmRlbmNpZXMucHVzaCgnQHR5cGVzL2plc3QnKTtcbiAgICB9XG4gIH1cblxuICBpZiAoY29uZmlnLmlzV2lsbEJvb3N0ZXJDb25maWdzKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGRlcGVuZGVuY2llczogZGVwZW5kZW5jaWVzLmZpbHRlcigoZGVwKSA9PiAhZGVwLmluY2x1ZGVzKCdAd2lsbGJvb3N0ZXIvJykpLFxuICAgICAgZGV2RGVwZW5kZW5jaWVzOiBkZXZEZXBlbmRlbmNpZXMuZmlsdGVyKChkZXApID0+ICFkZXAuaW5jbHVkZXMoJ0B3aWxsYm9vc3Rlci8nKSksXG4gICAgICBweXRob25EZXZEZXBlbmRlbmNpZXMsXG4gICAgfTtcbiAgfVxuXG4gIHJldHVybiB7IGRlcGVuZGVuY2llcywgZGV2RGVwZW5kZW5jaWVzLCBweXRob25EZXZEZXBlbmRlbmNpZXMgfTtcbn1cblxuZnVuY3Rpb24gZG9lc1JlbGVhc2VTY3JpcHRJbnN0YWxsU2VtYW50aWNSZWxlYXNlKHNjcmlwdDogdW5rbm93bik6IGJvb2xlYW4ge1xuICBpZiAodHlwZW9mIHNjcmlwdCAhPT0gJ3N0cmluZycpIHJldHVybiBmYWxzZTtcbiAgcmV0dXJuIC9cXGIoPzpidW54fG5weHxwbnBtXFxzK2RseHx5YXJuXFxzK2RseClcXHMrc2VtYW50aWMtcmVsZWFzZSg/OkBcXFMrKT9cXGIvdS50ZXN0KHNjcmlwdCk7XG59XG5cbmZ1bmN0aW9uIG1vdmVNYW5hZ2VkVG9vbERlcGVuZGVuY2llc1RvRGV2RGVwZW5kZW5jaWVzKGpzb25PYmo6IFdyaXRhYmxlUGFja2FnZUpzb24pOiB2b2lkIHtcbiAgZm9yIChjb25zdCBbZGVwZW5kZW5jeSwga2VlcEFzUnVudGltZV0gb2YgW1xuICAgIFt3YkRlcGVuZGVuY3ksIHNob3VsZEtlZXBXYkFzUnVudGltZURlcGVuZGVuY3koanNvbk9iaildLFxuICAgIFtidWlsZFRzRGVwZW5kZW5jeSwgc2hvdWxkS2VlcEJ1aWxkVHNBc1J1bnRpbWVEZXBlbmRlbmN5KGpzb25PYmopXSxcbiAgXSBhcyBjb25zdCkge1xuICAgIGlmIChrZWVwQXNSdW50aW1lKSB7XG4gICAgICBjb25zdCBkZXZWZXJzaW9uID0ganNvbk9iai5kZXZEZXBlbmRlbmNpZXNbZGVwZW5kZW5jeV07XG4gICAgICBpZiAoIWRldlZlcnNpb24pIGNvbnRpbnVlO1xuICAgICAgY29uc3QgcnVudGltZVZlcnNpb24gPSBqc29uT2JqLmRlcGVuZGVuY2llc1tkZXBlbmRlbmN5XTtcbiAgICAgIGlmICghcnVudGltZVZlcnNpb24gfHwgaXNOZXdlclBhY2thZ2VWZXJzaW9uKGRldlZlcnNpb24sIHJ1bnRpbWVWZXJzaW9uKSkge1xuICAgICAgICBqc29uT2JqLmRlcGVuZGVuY2llc1tkZXBlbmRlbmN5XSA9IGRldlZlcnNpb247XG4gICAgICB9XG4gICAgICBkZWxldGUganNvbk9iai5kZXZEZXBlbmRlbmNpZXNbZGVwZW5kZW5jeV07XG4gICAgfSBlbHNlIGlmIChqc29uT2JqLmRlcGVuZGVuY2llc1tkZXBlbmRlbmN5XSkge1xuICAgICAganNvbk9iai5kZXZEZXBlbmRlbmNpZXNbZGVwZW5kZW5jeV0gPz89IGpzb25PYmouZGVwZW5kZW5jaWVzW2RlcGVuZGVuY3ldO1xuICAgICAgZGVsZXRlIGpzb25PYmouZGVwZW5kZW5jaWVzW2RlcGVuZGVuY3ldO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBzaG91bGRLZWVwV2JBc1J1bnRpbWVEZXBlbmRlbmN5KGpzb25PYmo6IFBhY2thZ2VKc29uKTogYm9vbGVhbiB7XG4gIC8vIFByb2R1Y3Rpb24gaW1hZ2VzIHJ1biBtaWdyYXRpb25zIGFmdGVyIGRldkRlcGVuZGVuY2llcyBhcmUgcHJ1bmVkLCBqdXN0IGFzIHBhY2thZ2UgbWFuYWdlcnNcbiAgLy8gcnVuIHBvc3RpbnN0YWxsIGR1cmluZyBwcm9kdWN0aW9uIGluc3RhbGxzLCBzbyBib3RoIGVudHJ5IHBvaW50cyBtdXN0IHJldGFpbiB0aGUgd2IgYmluYXJ5LlxuICAvLyBLZWVwIHRoZSB3b3JkIG1hdGNoIGNvbnNlcnZhdGl2ZTogc3VwcG9ydGVkIGN1c3RvbSB3cmFwcGVycyBjYW4gcHV0IHdiIGluc2lkZSBzaGVsbCBsb29wcyB0aGF0XG4gIC8vIHRoZSBjb21tYW5kLXBvc2l0aW9uIHBhcnNlciBjYW5ub3QgY2xhc3NpZnksIHdoaWxlIGEgZmFsc2UgcG9zaXRpdmUgb25seSByZXRhaW5zIHRoZSBDTEkuXG4gIHJldHVybiBbanNvbk9iai5zY3JpcHRzPy5wb3N0aW5zdGFsbCwganNvbk9iai5zY3JpcHRzPy5bJ2RiLW1pZ3JhdGUnXV0uc29tZShcbiAgICAoc2NyaXB0KSA9PiB0eXBlb2Ygc2NyaXB0ID09PSAnc3RyaW5nJyAmJiAvXFxid2JcXGIvdS50ZXN0KHNjcmlwdClcbiAgKTtcbn1cblxuZnVuY3Rpb24gc2hvdWxkS2VlcEJ1aWxkVHNBc1J1bnRpbWVEZXBlbmRlbmN5KGpzb25PYmo6IFBhY2thZ2VKc29uKTogYm9vbGVhbiB7XG4gIGNvbnN0IHByaXNtYSA9IGpzb25PYmoucHJpc21hIGFzIHsgc2VlZD86IHVua25vd24gfSB8IHVuZGVmaW5lZDtcbiAgcmV0dXJuIGRvZXNTZWVkQ29tbWFuZFVzZUJ1aWxkVHMocHJpc21hPy5zZWVkKSB8fCBkb2VzU2VlZENvbW1hbmRVc2VCdWlsZFRzKGpzb25PYmouc2NyaXB0cz8uc2VlZCk7XG59XG5cbmZ1bmN0aW9uIGRvZXNTZWVkQ29tbWFuZFVzZUJ1aWxkVHMoc2VlZENvbW1hbmQ6IHVua25vd24pOiBib29sZWFuIHtcbiAgLy8gUHJvZHVjdGlvbiBEb2NrZXIgaW1hZ2VzIHJ1biBzZWVkIHNjcmlwdHMgYWZ0ZXIgZGV2RGVwZW5kZW5jaWVzIGFyZSBwcnVuZWQsXG4gIC8vIHNvIFR5cGVTY3JpcHQgc2VlZCBydW5uZXJzIG11c3QgcmVtYWluIGF2YWlsYWJsZSBhdCBydW50aW1lLlxuICByZXR1cm4gdHlwZW9mIHNlZWRDb21tYW5kID09PSAnc3RyaW5nJyAmJiAvKD88IVtcXHctXSlidWlsZC10cyg/IVtcXHctXSkvdS50ZXN0KHNlZWRDb21tYW5kKTtcbn1cblxuY29uc3QgZGVwZW5kZW5jeURlY2xhcmF0aW9uU2VjdGlvbnMgPSBbXG4gICdkZXBlbmRlbmNpZXMnLFxuICAnZGV2RGVwZW5kZW5jaWVzJyxcbiAgJ29wdGlvbmFsRGVwZW5kZW5jaWVzJyxcbiAgJ3BlZXJEZXBlbmRlbmNpZXMnLFxuXSBhcyBjb25zdDtcblxuLyoqXG4gKiBGb3JjZXMgc3RvcmUtaW5jb21wYXRpYmxlIHBhY2thZ2VzIHRvIHN0YXkgcHJvamVjdC1sb2NhbCB3aGVuIHRoZSBnZW5lcmF0ZWQgYnVuZmlnLnRvbWwgZW5hYmxlc1xuICogQnVuJ3MgZ2xvYmFsIHN0b3JlOiBgY2hha3JhIHR5cGVnZW5gIChydW4gYnkgYHdiIGdlbi1jb2RlYClcbiAqIHdyaXRlcyBnZW5lcmF0ZWQgdHlwZXMgaW50byB0aGUgaW5zdGFsbGVkIEBjaGFrcmEtdWkvcmVhY3QgcGFja2FnZSwgd2hpY2ggd291bGQgb3RoZXJ3aXNlXG4gKiBtdXRhdGUgdGhlIG1hY2hpbmUtd2lkZSBzdG9yZSBzaGFyZWQgYWNyb3NzIHJlcG9zaXRvcmllcywgYW5kIGRyaXp6bGUta2l0IHJlcXVpcmVzIGRyaXp6bGUtb3JtXG4gKiB3aXRob3V0IGRlY2xhcmluZyBpdCwgd2hpY2ggdGhlIHN0b3JlIHJlYWxwYXRoIHBsYWNlcyBiZXlvbmQgYSBwbGFpbiBub2RlX21vZHVsZXMgd2Fsay11cC5cbiAqIExpc3RpbmcgdGhlbSBpbiBgdHJ1c3RlZERlcGVuZGVuY2llc2AgbWFrZXMgQnVuIG1hdGVyaWFsaXplIGEgcGVyLXByb2plY3QgY29weSB1bmRlclxuICogYG5vZGVfbW9kdWxlcy8uYnVuL2AsIHdob3NlIHNpYmxpbmcgYG5vZGVfbW9kdWxlcy8uYnVuL25vZGVfbW9kdWxlcy9gIGxpbmtzIGV2ZXJ5IGluc3RhbGxlZFxuICogcGFja2FnZSBhbmQgdGhlcmVmb3JlIHJlc29sdmVzIHRoZSB1bmRlY2xhcmVkIHJlcXVpcmVzLlxuICovXG5hc3luYyBmdW5jdGlvbiBlbnN1cmVUcnVzdGVkRGVwZW5kZW5jaWVzKGNvbmZpZzogUGFja2FnZUNvbmZpZywganNvbk9iajogV3JpdGFibGVQYWNrYWdlSnNvbik6IFByb21pc2U8dm9pZD4ge1xuICAvLyBCdW4gY29uc3VsdHMgdHJ1c3RlZERlcGVuZGVuY2llcyBpbiB0aGUgd29ya3NwYWNlIHJvb3QncyBwYWNrYWdlLmpzb24gb25seSwgc28gdGhlIGxpc3QgaXNcbiAgLy8gbWFuYWdlZCB0aGVyZSBhbmQgbXVzdCBjb3ZlciBkZXBlbmRlbmNpZXMgZGVjbGFyZWQgYW55d2hlcmUgaW4gdGhlIHJlcG9zaXRvcnkuXG4gIGlmICghY29uZmlnLmlzUm9vdCkgcmV0dXJuO1xuICBjb25zdCBidW5Kc29uT2JqID0ganNvbk9iaiBhcyBXcml0YWJsZVBhY2thZ2VKc29uICYgeyB0cnVzdGVkRGVwZW5kZW5jaWVzPzogc3RyaW5nW10gfTtcbiAgLy8gQnVuIGluc3RhbGxzIG9wdGlvbmFsIGFuZCBwZWVyIGRlcGVuZGVuY2llcyBieSBkZWZhdWx0LCBzbyBhbGwgZGVjbGFyYXRpb24gc2VjdGlvbnMgY291bnQuXG4gIC8vIEV2ZXJ5IGRlY2xhcmVkIHJhbmdlIGlzIGtlcHQgcGVyIHBhY2thZ2U6IGEgcm9vdCBkZWNsYXJhdGlvbiBtdXN0IG5vdCBtYXNrIGEgd29ya3NwYWNlIG9uZVxuICAvLyAoZS5nLiByb290IEBjaGFrcmEtdWkvY2xpIHYyIGFsb25nc2lkZSBhIHdvcmtzcGFjZSBvbiB2MykuXG4gIGNvbnN0IGRlY2xhcmVkRGVwZW5kZW5jaWVzID0gbmV3IE1hcDxzdHJpbmcsIHN0cmluZ1tdPigpO1xuICBjb25zdCBhZGREZWNsYXJlZERlcGVuZGVuY2llcyA9IChwYWNrYWdlSnNvbjogUGFja2FnZUpzb24pOiB2b2lkID0+IHtcbiAgICBmb3IgKGNvbnN0IHNlY3Rpb24gb2YgZGVwZW5kZW5jeURlY2xhcmF0aW9uU2VjdGlvbnMpIHtcbiAgICAgIGZvciAoY29uc3QgW2RlcGVuZGVuY3lOYW1lLCB2ZXJzaW9uUmFuZ2VdIG9mIE9iamVjdC5lbnRyaWVzKHBhY2thZ2VKc29uW3NlY3Rpb25dID8/IHt9KSkge1xuICAgICAgICBpZiAodHlwZW9mIHZlcnNpb25SYW5nZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICBjb25zdCB2ZXJzaW9uUmFuZ2VzID0gZGVjbGFyZWREZXBlbmRlbmNpZXMuZ2V0KGRlcGVuZGVuY3lOYW1lKTtcbiAgICAgICAgICBpZiAodmVyc2lvblJhbmdlcykge1xuICAgICAgICAgICAgdmVyc2lvblJhbmdlcy5wdXNoKHZlcnNpb25SYW5nZSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGRlY2xhcmVkRGVwZW5kZW5jaWVzLnNldChkZXBlbmRlbmN5TmFtZSwgW3ZlcnNpb25SYW5nZV0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfTtcbiAgYWRkRGVjbGFyZWREZXBlbmRlbmNpZXMoanNvbk9iaik7XG4gIGZvciAoY29uc3QgcGFja2FnZUpzb25QYXRoIG9mIGdldFdvcmtzcGFjZVBhY2thZ2VKc29uUGF0aHMoY29uZmlnKSkge1xuICAgIHRyeSB7XG4gICAgICBhZGREZWNsYXJlZERlcGVuZGVuY2llcyhcbiAgICAgICAgSlNPTi5wYXJzZShhd2FpdCBmcy5wcm9taXNlcy5yZWFkRmlsZShwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsIHBhY2thZ2VKc29uUGF0aCksICd1dGY4JykpIGFzIFBhY2thZ2VKc29uXG4gICAgICApO1xuICAgIH0gY2F0Y2gge1xuICAgICAgLy8gaWdub3JlIHVucmVhZGFibGUgd29ya3NwYWNlIHBhY2thZ2UuanNvblxuICAgIH1cbiAgfVxuICAvLyBPbmx5IEBjaGFrcmEtdWkvY2xpIHYzJ3MgYGNoYWtyYSB0eXBlZ2VuYCB3cml0ZXMgaW50byB0aGUgaW5zdGFsbGVkIEBjaGFrcmEtdWkvcmVhY3Q7XG4gIC8vIHYyJ3MgYGNoYWtyYS1jbGkgdG9rZW5zYCB3cml0ZXMgaW50byBAY2hha3JhLXVpL3N0eWxlZC1zeXN0ZW0gaW5zdGVhZCwgc28gdHJ1c3RpbmdcbiAgLy8gQGNoYWtyYS11aS9yZWFjdCB0aGVyZSB3b3VsZCBmb3JjZSBhIHVzZWxlc3MgcHJvamVjdC1sb2NhbCBjb3B5IHdpdGhvdXQgZml4aW5nIGdlbi1jb2RlLlxuICAvLyBNaXJyb3Igd2IgZ2VuLWNvZGUncyBjbGFzc2lmaWNhdGlvbjogb25seSBhIHJhbmdlIHdob3NlIGxlYWRpbmcgbWFqb3IgcGFyc2VzIHRvIDIgc2VsZWN0cyB0aGVcbiAgLy8gdjIgY29tbWFuZCwgc28gZGlnaXRsZXNzIHNwZWNzIGxpa2UgYGxhdGVzdGAgb3IgY2F0YWxvZyByZWZlcmVuY2VzIGNvdW50IGFzIHYzLlxuICBjb25zdCBoYXNDaGFrcmFDbGlWMyA9IChkZWNsYXJlZERlcGVuZGVuY2llcy5nZXQoJ0BjaGFrcmEtdWkvY2xpJykgPz8gW10pLnNvbWUoXG4gICAgKHZlcnNpb25SYW5nZSkgPT4gL1xcZCsvdS5leGVjKHZlcnNpb25SYW5nZSk/LlswXSAhPT0gJzInXG4gICk7XG4gIGNvbnN0IHJlcXVpcmVkV2JmeVBhY2thZ2VzID0gW1xuICAgIC4uLihoYXNDaGFrcmFDbGlWMyAmJiBkZWNsYXJlZERlcGVuZGVuY2llcy5oYXMoJ0BjaGFrcmEtdWkvcmVhY3QnKSA/IFsnQGNoYWtyYS11aS9yZWFjdCddIDogW10pLFxuICAgIC4uLihkZWNsYXJlZERlcGVuZGVuY2llcy5oYXMoJ2RyaXp6bGUta2l0JykgPyBbJ2RyaXp6bGUta2l0J10gOiBbXSksXG4gICAgLy8gVGhlc2UgZ2l0LWRlcGVuZGVuY3kgYnVpbGRzIGltcG9ydCBwYWNrYWdlcyB0aGV5IGRvIG5vdCBkZWNsYXJlIChlLmcuIHpvZCksIHdoaWNoIHRoZVxuICAgIC8vIGdsb2JhbC1zdG9yZSBsYXlvdXQgcGxhY2VzIGJleW9uZCB0aGVpciB3YWxrLXVwOyBhIHByb2plY3QtbG9jYWwgY29weSB1bmRlclxuICAgIC8vIG5vZGVfbW9kdWxlcy8uYnVuIHJlc29sdmVzIHRoZW0gKG9ic2VydmVkIGluIFdpbGxCb29zdGVyL3Byb21wdC1zdHVkeSkuXG4gICAgLi4uKGRlY2xhcmVkRGVwZW5kZW5jaWVzLmhhcygnQHdpbGxib29zdGVyL2p1ZGdlJykgPyBbJ0B3aWxsYm9vc3Rlci9qdWRnZSddIDogW10pLFxuICAgIC4uLihkZWNsYXJlZERlcGVuZGVuY2llcy5oYXMoJ0B3aWxsYm9vc3Rlci9sbG0tcHJveHknKSA/IFsnQHdpbGxib29zdGVyL2xsbS1wcm94eSddIDogW10pLFxuICAgIC8vIGJsaXR6IGFuZCBAYmxpdHpqcy9hdXRoIHJlcXVpcmUgcmVhY3QgKGFuZCBvdGhlciBwZWVycykgd2l0aG91dCBkZWNsYXJpbmcgdGhlbSwgcmVseWluZyBvblxuICAgIC8vIGhvaXN0aW5nLCB3aGljaCB0aGUgZ2xvYmFsLXN0b3JlIGxheW91dCBwbGFjZXMgYmV5b25kIHRoZWlyIHdhbGstdXAgKG9ic2VydmVkIGluXG4gICAgLy8gV2lsbEJvb3N0ZXIvc3VydmV5LXN5c3RlbTogYG5leHQgYnVpbGRgIHBhZ2UtZGF0YSBjb2xsZWN0aW9uIGRpZXMgd2l0aCBcIkNhbm5vdCBmaW5kIG1vZHVsZVxuICAgIC8vICdyZWFjdCdcIiBmcm9tIEBibGl0empzL2F1dGgpLiBAYmxpdHpqcy9ycGMgaXMgTk9UIGxpc3RlZCBiZWNhdXNlIGl0IHByb3Blcmx5IGRlY2xhcmVzIGl0c1xuICAgIC8vIHJlYWN0L0B0YW5zdGFjayBwZWVycywgc28gQnVuIGxpbmtzIHRoZW0gaW50byBpdHMgc3RvcmUgZW50cnkuIEBibGl0empzL25leHQgaXNcbiAgICAvLyBkZWxpYmVyYXRlbHkgTk9UIGxpc3RlZCBlaXRoZXI6IHRydXN0aW5nIGl0IHdvdWxkIHJ1biBpdHMgcG9zdGluc3RhbGwgKGBibGl0eiBjb2RlZ2VuYCksXG4gICAgLy8gd2hpY2ggcGF0Y2hlcyB0aGUgaW5zdGFsbGVkIG5leHQgcGFja2FnZSBpbiBwbGFjZSDigJQgcmVwb3NpdG9yaWVzIHBhdGNoIG91dCB0aGF0IHBvc3RpbnN0YWxsXG4gICAgLy8gd2l0aCBgYnVuIHBhdGNoYCBpbnN0ZWFkLCB3aGljaCBhbHNvIGtlZXBzIHRoZSBwYWNrYWdlIHByb2plY3QtbG9jYWwuXG4gICAgLi4uKGRlY2xhcmVkRGVwZW5kZW5jaWVzLmhhcygnYmxpdHonKSA/IFsnYmxpdHonXSA6IFtdKSxcbiAgICAuLi4oZGVjbGFyZWREZXBlbmRlbmNpZXMuaGFzKCdAYmxpdHpqcy9hdXRoJykgPyBbJ0BibGl0empzL2F1dGgnXSA6IFtdKSxcbiAgICAvLyBCdW4gZG9lcyBub3QgbGluayBAaG9va2Zvcm0vcmVzb2x2ZXJzJyBPUFRJT05BTCB2YWxpZGF0b3IgcGVlcnMgKGUuZy4gem9kKSBpbnRvIGl0c1xuICAgIC8vIGdsb2JhbC1zdG9yZSBlbnRyeSBldmVuIHdoZW4gdGhlIHByb2plY3QgaW5zdGFsbHMgdGhlbSwgc28gaXRzIHNlcnZlci1zaWRlXG4gICAgLy8gYGltcG9ydCAnem9kJ2AgZmFpbHMgZnJvbSB0aGUgc3RvcmUgKG9ic2VydmVkIGluIFdpbGxCb29zdGVyL3N1cnZleS1zeXN0ZW0pLlxuICAgIC4uLihkZWNsYXJlZERlcGVuZGVuY2llcy5oYXMoJ0Bob29rZm9ybS9yZXNvbHZlcnMnKSA/IFsnQGhvb2tmb3JtL3Jlc29sdmVycyddIDogW10pLFxuICAgIC8vIEB6b29tL3J0bXMgaW5zdGFsbHMgaXRzIG5hdGl2ZSBydG1zLm5vZGUgYmluZGluZyBpbiBhIGxpZmVjeWNsZSBzY3JpcHQuIFdpdGhvdXQgZXhwbGljaXRcbiAgICAvLyB0cnVzdCwgQnVuIHNraXBzIHRoYXQgc2NyaXB0IGFuZCB0aGUgcGFja2FnZSBmYWlscyBhcyBzb29uIGFzIHRoZSBab29tIGJvdCBpbXBvcnRzIGl0XG4gICAgLy8gKG9ic2VydmVkIGluIFdpbGxCb29zdGVyL3NtYXJ0c2Utem9vbS1ib3QpLlxuICAgIC4uLihkZWNsYXJlZERlcGVuZGVuY2llcy5oYXMoJ0B6b29tL3J0bXMnKSA/IFsnQHpvb20vcnRtcyddIDogW10pLFxuICBdO1xuXG4gIC8vIHdiZnkgZnVsbHkgb3ducyB0aGlzIGZpZWxkOiBhIHBhY2thZ2Ugd2hvc2UgbGlmZWN5Y2xlIHNjcmlwdHMgbXVzdCBydW4gZ2V0cyBhZGRlZCB0byB3YmZ5XG4gIC8vIGl0c2VsZiBpbnN0ZWFkIG9mIHRvIGluZGl2aWR1YWwgcmVwb3NpdG9yaWVzLCBzbyB1bm1hbmFnZWQgZW50cmllcyBhcmUgYWx3YXlzIHJlbW92ZWQg4oCUXG4gIC8vIGluY2x1ZGluZyBhbiBleHBsaWNpdGx5IGVtcHR5IGRlbnktYWxsIGxpc3QsIHdob3NlIGRlbGV0aW9uIGRlbGliZXJhdGVseSByZXN0b3JlcyBCdW4nc1xuICAvLyBkZWZhdWx0IGFsbG93LWxpc3QgKHRoZSBvd25lcnNoaXAgcG9saWN5IGNob3NlbiBpbiAjOTc1KS5cbiAgY29uc3QgZXhpc3RpbmdUcnVzdGVkID0gYnVuSnNvbk9iai50cnVzdGVkRGVwZW5kZW5jaWVzO1xuICBpZiAocmVxdWlyZWRXYmZ5UGFja2FnZXMubGVuZ3RoID09PSAwKSB7XG4gICAgaWYgKGV4aXN0aW5nVHJ1c3RlZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAvLyBEZWxldGluZyB0aGUgZmllbGQgcmVzdG9yZXMgQnVuJ3MgZnVsbCBkZWZhdWx0IGFsbG93LWxpc3QsIHNvIG9ubHkgZW50cmllcyBvdXRzaWRlIHRoYXRcbiAgICAgIC8vIGxpc3QgYWN0dWFsbHkgbG9zZSB0aGVpciBsaWZlY3ljbGUgc2NyaXB0cy5cbiAgICAgIHdhcm5BYm91dFJlbW92ZWRUcnVzdGVkRGVwZW5kZW5jaWVzKGNvbmZpZywgZXhpc3RpbmdUcnVzdGVkLCBuZXcgU2V0KCkpO1xuICAgICAgZGVsZXRlIGJ1bkpzb25PYmoudHJ1c3RlZERlcGVuZGVuY2llcztcbiAgICB9XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgLy8gQW4gZXhwbGljaXQgdHJ1c3RlZERlcGVuZGVuY2llcyBsaXN0IFJFUExBQ0VTIEJ1bidzIGRlZmF1bHQgYWxsb3ctbGlzdCBpbnN0ZWFkIG9mIGV4dGVuZGluZ1xuICAvLyBpdCwgYW5kIEJ1biBwcmludHMgbm8gd2FybmluZyBmb3IgdGhlIHBvc3RpbnN0YWxscyBpdCBjb25zZXF1ZW50bHkgc2tpcHMgKGUuZy4gQHJhaWx3YXkvY2xpXG4gIC8vIGRvd25sb2FkcyBpdHMgYmluYXJ5IGluIHBvc3RpbnN0YWxsIGFuZCBleGl0cyAxIHdpdGhvdXQgb25lKS4gSW5jbHVkZSB0aGUgRU5USVJFIGRlZmF1bHQgbGlzdDpcbiAgLy8gZW50cmllcyBmb3IgcGFja2FnZXMgdGhhdCBhcmUgbm90IGluc3RhbGxlZCBhcmUgaW5lcnQsIGFuZCB0aGlzIGlzIHRoZSBvbmx5IHJlcHJlc2VudGF0aW9uXG4gIC8vIHRoYXQgc3RheXMgY29ycmVjdCBmb3IgdHJhbnNpdGl2ZSBkZXBlbmRlbmNpZXMgdGhlIGZpbmFsIGBidW4gaW5zdGFsbGAgcmVzb2x2ZXMgYWZ0ZXIgdGhpc1xuICAvLyBydW5zIOKAlCBhbiBpbnRlcnNlY3Rpb24gd2l0aCBhIG1pc3Npbmcgb3Igc3RhbGUgbG9ja2ZpbGUgd291bGQgc2lsZW50bHkgZHJvcCB0aGVtLlxuICBjb25zdCBkZWZhdWx0VHJ1c3RlZERlcGVuZGVuY2llcyA9IGdldERlZmF1bHRUcnVzdGVkRGVwZW5kZW5jaWVzKGNvbmZpZyk7XG4gIC8vIGxlZnRob29rIGlzIGFwcGVuZGVkIGV4cGxpY2l0bHkgc28gdGhlIGRlZmF1bHQtbGlzdCBsb29rdXAgZmFpbGluZyBjYW5ub3QgZHJvcCBpdDogaXQgaXNcbiAgLy8gcmVxdWlyZWQgaW4gZXZlcnkgbWFuYWdlZCByZXBvc2l0b3J5LlxuICBjb25zdCBuZXdUcnVzdGVkUGFja2FnZXMgPSBuZXcgU2V0KFtcbiAgICAuLi5yZXF1aXJlZFdiZnlQYWNrYWdlcyxcbiAgICBsZWZ0aG9va0RlcGVuZGVuY3ksXG4gICAgLi4uKGRlZmF1bHRUcnVzdGVkRGVwZW5kZW5jaWVzID8/IFtdKSxcbiAgXSk7XG4gIHdhcm5BYm91dFJlbW92ZWRUcnVzdGVkRGVwZW5kZW5jaWVzKGNvbmZpZywgZXhpc3RpbmdUcnVzdGVkID8/IFtdLCBuZXdUcnVzdGVkUGFja2FnZXMpO1xuICBidW5Kc29uT2JqLnRydXN0ZWREZXBlbmRlbmNpZXMgPSBbLi4ubmV3VHJ1c3RlZFBhY2thZ2VzXS50b1NvcnRlZCgpO1xufVxuXG4vLyBUaGUgcGFja2FnZXMgd2JmeSBpdHNlbGYgbWF5IHdyaXRlIGludG8gdHJ1c3RlZERlcGVuZGVuY2llczsgdGhlaXIgcmVtb3ZhbCBpcyBtYW5hZ2VkIGNsZWFudXAsXG4vLyBuZXZlciBhIGxvc3Mgb2YgdXNlciBwb2xpY3kuXG5jb25zdCB3YmZ5TWFuYWdlZFRydXN0ZWREZXBlbmRlbmNpZXMgPSBuZXcgU2V0KFtcbiAgJ0BibGl0empzL2F1dGgnLFxuICAnQGNoYWtyYS11aS9yZWFjdCcsXG4gICdAaG9va2Zvcm0vcmVzb2x2ZXJzJyxcbiAgJ0B3aWxsYm9vc3Rlci9qdWRnZScsXG4gICdAd2lsbGJvb3N0ZXIvbGxtLXByb3h5JyxcbiAgJ0B6b29tL3J0bXMnLFxuICAnYmxpdHonLFxuICAnZHJpenpsZS1raXQnLFxuICBsZWZ0aG9va0RlcGVuZGVuY3ksXG5dKTtcblxuZnVuY3Rpb24gd2FybkFib3V0UmVtb3ZlZFRydXN0ZWREZXBlbmRlbmNpZXMoXG4gIGNvbmZpZzogUGFja2FnZUNvbmZpZyxcbiAgZXhpc3RpbmdUcnVzdGVkOiByZWFkb25seSBzdHJpbmdbXSxcbiAga2VwdFBhY2thZ2VzOiBSZWFkb25seVNldDxzdHJpbmc+XG4pOiB2b2lkIHtcbiAgLy8gQSBkZWZhdWx0LXRydXN0ZWQgZW50cnkgbmV2ZXIgbG9zZXMgYW55dGhpbmcgYnkgcmVtb3ZhbDogd2hpbGUgdGhlIHBhY2thZ2UgaXMgaW5zdGFsbGVkIHRoZVxuICAvLyBrZXB0IGxpc3QgKG9yLCB3aGVuIHRoZSBmaWVsZCBpcyBkZWxldGVkLCBCdW4ncyBvd24gZGVmYXVsdCBsaXN0KSBzdGlsbCB0cnVzdHMgaXQuXG4gIGNvbnN0IGRlZmF1bHRUcnVzdGVkRGVwZW5kZW5jaWVzID0gZ2V0RGVmYXVsdFRydXN0ZWREZXBlbmRlbmNpZXMoY29uZmlnKTtcbiAgY29uc3QgcmVtb3ZlZFBhY2thZ2VzID0gZXhpc3RpbmdUcnVzdGVkLmZpbHRlcihcbiAgICAocGtnKSA9PiAha2VwdFBhY2thZ2VzLmhhcyhwa2cpICYmICF3YmZ5TWFuYWdlZFRydXN0ZWREZXBlbmRlbmNpZXMuaGFzKHBrZykgJiYgIWRlZmF1bHRUcnVzdGVkRGVwZW5kZW5jaWVzPy5oYXMocGtnKVxuICApO1xuICBpZiAocmVtb3ZlZFBhY2thZ2VzLmxlbmd0aCA+IDApIHtcbiAgICBjb25zb2xlLndhcm4oXG4gICAgICBgUmVtb3ZpbmcgdW5tYW5hZ2VkIHRydXN0ZWREZXBlbmRlbmNpZXMgZW50cmllczogJHtyZW1vdmVkUGFja2FnZXMuam9pbignLCAnKX0uIHdiZnkgb3ducyB0aGlzIGZpZWxkOyBpZiB0aGVpciBsaWZlY3ljbGUgc2NyaXB0cyBhcmUgcmVxdWlyZWQsIGFkZCB0aGUgcGFja2FnZXMgdG8gd2JmeSBpdHNlbGYuYFxuICAgICk7XG4gIH1cbn1cblxubGV0IGNhY2hlZERlZmF1bHRUcnVzdGVkRGVwZW5kZW5jaWVzOiBTZXQ8c3RyaW5nPiB8IHVuZGVmaW5lZDtcblxuLyoqIEZldGNoZXMgQnVuJ3MgZGVmYXVsdCB0cnVzdGVkLWRlcGVuZGVuY3kgYWxsb3ctbGlzdCBmcm9tIHRoZSBCdW4gdmVyc2lvbiBpbnN0YWxsaW5nIHRoZSByZXBvc2l0b3J5LiAqL1xuZnVuY3Rpb24gZ2V0RGVmYXVsdFRydXN0ZWREZXBlbmRlbmNpZXMoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogU2V0PHN0cmluZz4gfCB1bmRlZmluZWQge1xuICBpZiAoIWNhY2hlZERlZmF1bHRUcnVzdGVkRGVwZW5kZW5jaWVzKSB7XG4gICAgLy8gQnVuIGNvbG9yaXplcyB0aGUgbGlzdCBtYXJrZXJzIHdoZW4gRk9SQ0VfQ09MT1IgaXMgc2V0IChlLmcuIGJ5IHRlc3QgcnVubmVycyBvbiBDSSksIHNvXG4gICAgLy8gQU5TSSBlc2NhcGUgc2VxdWVuY2VzIG11c3QgYmUgc3RyaXBwZWQgYmVmb3JlIHBhcnNpbmcuXG4gICAgY29uc3Qgc3Rkb3V0ID0gc3Bhd25TeW5jQW5kUmV0dXJuU3Rkb3V0KCdidW4nLCBbJ3BtJywgJ2RlZmF1bHQtdHJ1c3RlZCddLCBjb25maWcuZGlyUGF0aCkucmVwbGFjZUFsbChcbiAgICAgIC8vIG94bGludC1kaXNhYmxlLW5leHQtbGluZSBuby1jb250cm9sLXJlZ2V4IC0tIG1hdGNoaW5nIEFOU0kgZXNjYXBlIHNlcXVlbmNlcyByZXF1aXJlcyB0aGUgRVNDIGNvbnRyb2wgY2hhcmFjdGVyXG4gICAgICAvXFx1MDAxQlxcW1swLTk7XSptL2d1LFxuICAgICAgJydcbiAgICApO1xuICAgIGNvbnN0IHBhcnNlZERlcGVuZGVuY2llcyA9IG5ldyBTZXQoWy4uLnN0ZG91dC5tYXRjaEFsbCgvXlxccyotXFxzKyhcXFMrKSQvZ211KV0ubWFwKChtYXRjaCkgPT4gbWF0Y2hbMV0gYXMgc3RyaW5nKSk7XG4gICAgaWYgKHBhcnNlZERlcGVuZGVuY2llcy5zaXplID09PSAwKSB7XG4gICAgICAvLyBEbyBub3QgY2FjaGUgdGhlIGZhaWx1cmU6IGEgdGFyZ2V0LWxvY2FsIHByb2JsZW0gKGUuZy4gYW4gdW5yZWFkYWJsZSBwYWNrYWdlLmpzb24pIG11c3RcbiAgICAgIC8vIG5vdCBkZW55IHRoZSBkZWZhdWx0IGxpc3QgdG8gZXZlcnkgbGF0ZXIgdGFyZ2V0IG9mIGEgbXVsdGktcGF0aCBydW4uXG4gICAgICBjb25zb2xlLndhcm4oJ0ZhaWxlZCB0byByZWFkIHRoZSBkZWZhdWx0IGFsbG93LWxpc3QgdmlhIGBidW4gcG0gZGVmYXVsdC10cnVzdGVkYC4nKTtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuICAgIGNhY2hlZERlZmF1bHRUcnVzdGVkRGVwZW5kZW5jaWVzID0gcGFyc2VkRGVwZW5kZW5jaWVzO1xuICB9XG4gIHJldHVybiBjYWNoZWREZWZhdWx0VHJ1c3RlZERlcGVuZGVuY2llcztcbn1cblxuYXN5bmMgZnVuY3Rpb24gbm9ybWFsaXplUGFja2FnZU1ldGFkYXRhKFxuICBjb25maWc6IFBhY2thZ2VDb25maWcsXG4gIHJvb3RDb25maWc6IFBhY2thZ2VDb25maWcsXG4gIGpzb25PYmo6IFdyaXRhYmxlUGFja2FnZUpzb24sXG4gIGRlcGVuZGVuY3lVcGRhdGVzOiBEZXBlbmRlbmN5VXBkYXRlc1xuKTogUHJvbWlzZTx2b2lkPiB7XG4gIGlmICghanNvbk9iai5uYW1lKSB7XG4gICAganNvbk9iai5uYW1lID0gcGF0aC5iYXNlbmFtZShjb25maWcuZGlyUGF0aCk7XG4gIH1cblxuICAvLyBFeHBsaWNpdCByb290IHB1Ymxpc2hpbmcgaW50ZW50IHRha2VzIHByZWNlZGVuY2Ugb3ZlciB3YmZ5J3MgcHJpdmF0ZSBtb25vcmVwby1yb290IGRlZmF1bHQuXG4gIGlmIChjb25maWcuZG9lc0NvbnRhaW5TdWJQYWNrYWdlSnNvbnMgJiYgKGNvbmZpZy5yZWxlYXNlLm5wbVB1Ymxpc2hlc1Jvb3QgfHwganNvbk9iai5wdWJsaXNoQ29uZmlnKSkge1xuICAgIGRlbGV0ZSBqc29uT2JqLnByaXZhdGU7XG4gIH0gZWxzZSBpZiAoY29uZmlnLmRvZXNDb250YWluU3ViUGFja2FnZUpzb25zICYmICFjb25maWcucmVsZWFzZS5ucG0gJiYgIWpzb25PYmoucHVibGlzaENvbmZpZykge1xuICAgIGpzb25PYmoucHJpdmF0ZSA9IHRydWU7XG4gIH1cbiAgaWYgKCFqc29uT2JqLmxpY2Vuc2UpIHtcbiAgICBqc29uT2JqLmxpY2Vuc2UgPSAnVU5MSUNFTlNFRCc7XG4gIH1cbiAgaWYgKCFqc29uT2JqLnByaXZhdGUgJiYganNvbk9iai5saWNlbnNlICE9PSAnVU5MSUNFTlNFRCcgJiYgcm9vdENvbmZpZy5pc1B1YmxpY1JlcG8pIHtcbiAgICBqc29uT2JqLnB1Ymxpc2hDb25maWcgPz89IHt9O1xuICAgIGpzb25PYmoucHVibGlzaENvbmZpZy5hY2Nlc3MgPz89ICdwdWJsaWMnO1xuICAgIC8vIFdpdGhvdXQgYW4gZXhwbGljaXQgcmVnaXN0cnksIG5wbSByZXNvbHZlcyB0aGUgcHVibGlzaCB0YXJnZXQgZnJvbSB0aGUgd29ya3NwYWNlIC5ucG1yYyxcbiAgICAvLyB3aG9zZSBkZWZhdWx0IHJlZ2lzdHJ5IG9uIENJIG1heSBiZSB0aGUgVGFrdW1pIEd1YXJkIGluc3RhbGwgcHJveHkg4oCUIHdoaWNoIHJlamVjdHNcbiAgICAvLyBgbnBtIHB1Ymxpc2hgIHdpdGggNDA1IChzaGFyZWQjMTA3MikuIGA/Pz1gIGtlZXBzIGEgZGVsaWJlcmF0ZWx5IGRpZmZlcmVudCByZWdpc3RyeS5cbiAgICBqc29uT2JqLnB1Ymxpc2hDb25maWcucmVnaXN0cnkgPz89ICdodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy8nO1xuICB9XG4gIGNvbnN0IG93bmVyID0gY29uZmlnLnJlcG9BdXRob3I7XG4gIGlmIChvd25lciA9PT0gJ1dpbGxCb29zdGVyJyB8fCBvd25lciA9PT0gJ1dpbGxCb29zdGVyTGFiJykge1xuICAgIGpzb25PYmouYXV0aG9yID0gJ1dpbGxCb29zdGVyIEluYy4nO1xuICB9XG4gIGF3YWl0IG5vcm1hbGl6ZVB1Ymxpc2hlZENvbmZpZ1BhY2thZ2VNZXRhZGF0YShjb25maWcsIGpzb25PYmopO1xuICBpZiAoIWNvbmZpZy5pc1Jvb3QgJiYganNvbk9iai5wcml2YXRlICYmICFqc29uT2JqLm1haW4pIHtcbiAgICAvLyBNYWtlIFZTQ29kZSBwb3NzaWJsZSB0byByZWZhY3RvciBjb2RlIGFjcm9zcyBzdWJwYWNrYWdlcy5cbiAgICBqc29uT2JqLm1haW4gPSAnLi9zcmMnO1xuICB9XG5cbiAgaWYgKCFjb25maWcuZG9lc0NvbnRhaW5TdWJQYWNrYWdlSnNvbnMpIHtcbiAgICBpZiAoY29uZmlnLmRvZXNDb250YWluUHVic3BlY1lhbWwpIHtcbiAgICAgIGpzb25PYmouc2NyaXB0cy5saW50ID0gJ2ZsdXR0ZXIgYW5hbHl6ZSc7XG4gICAgICBqc29uT2JqLnNjcmlwdHNbJ2xpbnQtZml4J10gPSAnYnVuIHJ1biBsaW50JztcbiAgICAgIGNvbnN0IGRpcnMgPSBbJ2xpYicsICd0ZXN0JywgJ3Rlc3RfZHJpdmVyJ10uZmlsdGVyKChkaXIpID0+IGZzLmV4aXN0c1N5bmMocGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCBkaXIpKSk7XG4gICAgICBpZiAoZGlycy5sZW5ndGggPiAwKSB7XG4gICAgICAgIGpzb25PYmouc2NyaXB0c1snZm9ybWF0LWNvZGUnXSA9IGBkYXJ0IGZvcm1hdCAkKGZpbmQgJHtkaXJzLmpvaW4oXG4gICAgICAgICAgJyAnXG4gICAgICAgICl9IC1uYW1lIGdlbmVyYXRlZCAtcHJ1bmUgLW8gLW5hbWUgJyouZnJlZXplZC5kYXJ0JyAtcHJ1bmUgLW8gLW5hbWUgJyouZy5kYXJ0JyAtcHJ1bmUgLW8gLW5hbWUgJyouZGFydCcgLXByaW50KWA7XG4gICAgICAgIGpzb25PYmouc2NyaXB0cy5mb3JtYXQgPSBhcHBlbmRGb3JtYXRDb2RlQ29tbWFuZChqc29uT2JqLnNjcmlwdHMuZm9ybWF0KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCBweXRob25QYWNrYWdlTWFuYWdlciA9IGdldFB5dGhvblBhY2thZ2VNYW5hZ2VyKGNvbmZpZyk7XG4gICAgaWYgKHB5dGhvblBhY2thZ2VNYW5hZ2VyKSB7XG4gICAgICBjb25zdCBzY3JpcHRSdW5uZXIgPSAnYnVuIHJ1bic7XG4gICAgICBqc29uT2JqLnNjcmlwdHNbJ2NvbW1vbi9jaS1zZXR1cCddID0gYCR7c2NyaXB0UnVubmVyfSBzZXR1cC0ke3B5dGhvblBhY2thZ2VNYW5hZ2VyfWA7XG4gICAgICBkZWxldGUganNvbk9iai5zY3JpcHRzW2BzZXR1cC0ke3B5dGhvblBhY2thZ2VNYW5hZ2VyID09PSAncG9ldHJ5JyA/ICd1dicgOiAncG9ldHJ5J31gXTtcbiAgICAgIGpzb25PYmouc2NyaXB0c1tgc2V0dXAtJHtweXRob25QYWNrYWdlTWFuYWdlcn1gXSA9IGdldFB5dGhvblNldHVwQ29tbWFuZChweXRob25QYWNrYWdlTWFuYWdlcik7XG4gICAgICBjb25zdCBweXRob25GaWxlcyA9IGF3YWl0IGZnLmdsb2IoJyoqLyoucHknLCB7XG4gICAgICAgIGN3ZDogY29uZmlnLmRpclBhdGgsXG4gICAgICAgIGRvdDogdHJ1ZSxcbiAgICAgICAgaWdub3JlOiBnbG9iSWdub3JlLFxuICAgICAgfSk7XG4gICAgICBjb25zdCBkaXJOYW1lU2V0ID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gICAgICBmb3IgKGNvbnN0IHB5dGhvbkZpbGUgb2YgcHl0aG9uRmlsZXMpIHtcbiAgICAgICAgY29uc3QgW2ZpcnN0LCBzZWNvbmRdID0gcHl0aG9uRmlsZS5zcGxpdCgnLycpO1xuICAgICAgICBpZiAoZmlyc3QgJiYgc2Vjb25kKSB7XG4gICAgICAgICAgZGlyTmFtZVNldC5hZGQoZmlyc3QpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAoZGlyTmFtZVNldC5zaXplID4gMCkge1xuICAgICAgICBjb25zdCBkaXJOYW1lc1N0ciA9IFsuLi5kaXJOYW1lU2V0XS5qb2luKCcgJyk7XG4gICAgICAgIGNvbnN0IHB5dGhvblJ1bm5lciA9IGAke3B5dGhvblBhY2thZ2VNYW5hZ2VyfSBydW5gO1xuICAgICAgICBqc29uT2JqLnNjcmlwdHNbJ2Zvcm1hdC1jb2RlJ10gPVxuICAgICAgICAgIGAke3B5dGhvblJ1bm5lcn0gaXNvcnQgLS1wcm9maWxlIGJsYWNrICR7ZGlyTmFtZXNTdHJ9ICYmICR7cHl0aG9uUnVubmVyfSBibGFjayAke2Rpck5hbWVzU3RyfWA7XG4gICAgICAgIGlmIChqc29uT2JqLnNjcmlwdHMubGludCkge1xuICAgICAgICAgIGpzb25PYmouc2NyaXB0cy5saW50ID0gYCR7cHl0aG9uUnVubmVyfSBmbGFrZTggJHtkaXJOYW1lc1N0cn0gJiYgJHtqc29uT2JqLnNjcmlwdHMubGludH1gO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGpzb25PYmouc2NyaXB0cy5saW50ID0gYCR7cHl0aG9uUnVubmVyfSBmbGFrZTggJHtkaXJOYW1lc1N0cn1gO1xuICAgICAgICAgIGpzb25PYmouc2NyaXB0c1snbGludC1maXgnXSA9IGAke3NjcmlwdFJ1bm5lcn0gbGludGA7XG4gICAgICAgIH1cbiAgICAgICAganNvbk9iai5zY3JpcHRzLmZvcm1hdCA9IGFwcGVuZEZvcm1hdENvZGVDb21tYW5kKGpzb25PYmouc2NyaXB0cy5mb3JtYXQpO1xuICAgICAgICBkZXBlbmRlbmN5VXBkYXRlcy5weXRob25EZXZEZXBlbmRlbmNpZXMucHVzaCgnYmxhY2snLCAnaXNvcnQnLCAnZmxha2U4Jyk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgaWYgKGNvbmZpZy5yZXBvc2l0b3J5IHx8IGpzb25PYmoucmVwb3NpdG9yeSkge1xuICAgIGpzb25PYmoucmVwb3NpdG9yeSA9IGZvcm1hdFJlcG9zaXRvcnlGb3JQYWNrYWdlSnNvbihjb25maWcucmVwb3NpdG9yeSA/PyBqc29uT2JqLnJlcG9zaXRvcnksIGpzb25PYmoucmVwb3NpdG9yeSk7XG4gIH1cblxuICBjb25zdCBnZW5Db2RlU2NyaXB0ID0ganNvbk9iai5zY3JpcHRzWydnZW4tY29kZSddO1xuICBpZiAoc2hvdWxkR2VuZXJhdGVXYkdlbkNvZGVTY3JpcHQoY29uZmlnKSkge1xuICAgIC8vIFByZXNlcnZlIHByb2plY3Qtc3BlY2lmaWMgc3RlcHMgYSByZXBvIGFwcGVuZGVkIHRvIHRoZSBtYW5hZ2VkIGBidW4gd2IgZ2VuLWNvZGVgIChlLmcuIGJ1aWxkaW5nIGV4dHJhIGRlcGxveVxuICAgIC8vIGFzc2V0cykgaW5zdGVhZCBvZiBkaXNjYXJkaW5nIHRoZW07IG9ubHkgdGhlIG1hbmFnZWQgZ2VuLWNvZGUgc2VnbWVudCBpcyB3YmZ5J3MgdG9cbiAgICAvLyByZWdlbmVyYXRlLiBBbiB1bnBhcnNlYWJsZSBzY3JpcHQgaXMgbGVmdCBhbG9uZSByYXRoZXIgdGhhbiByZXdyaXR0ZW4gZnJvbSBhIHdyb25nIHBhcnNlLlxuICAgIGNvbnN0IHNlZ21lbnRzID0gZ2VuQ29kZVNjcmlwdCA9PT0gdW5kZWZpbmVkID8gW10gOiBzcGxpdFNjcmlwdFNlZ21lbnRzKGdlbkNvZGVTY3JpcHQpO1xuICAgIGNvbnN0IGN1c3RvbVNlZ21lbnRzID0gc2VnbWVudHM/LmZpbHRlcihcbiAgICAgIChzZWdtZW50KSA9PiBjbGFzc2lmeVNjcmlwdFNlZ21lbnQoc2VnbWVudCwganNvbk9iai5zY3JpcHRzLCB0cnVlKSA9PT0gJ2N1c3RvbSdcbiAgICApO1xuICAgIGlmIChjdXN0b21TZWdtZW50cykge1xuICAgICAganNvbk9iai5zY3JpcHRzWydnZW4tY29kZSddID0gWydidW4gd2IgZ2VuLWNvZGUnLCAuLi5jdXN0b21TZWdtZW50c10uam9pbignICYmICcpO1xuICAgIH1cbiAgfVxuICB1cGRhdGVQb3N0aW5zdGFsbFNjcmlwdChqc29uT2JqLnNjcmlwdHMsIGdlbmVyYXRlc1dvcmtlclR5cGVzKGNvbmZpZykpO1xufVxuXG5mdW5jdGlvbiBzaG91bGRHZW5lcmF0ZVdiR2VuQ29kZVNjcmlwdChjb25maWc6IFBhY2thZ2VDb25maWcpOiBib29sZWFuIHtcbiAgcmV0dXJuIGNvbmZpZy5kZXBlbmRpbmcuYmxpdHogfHwgY29uZmlnLmRlcGVuZGluZy5jaGFrcmEgfHwgY29uZmlnLmRlcGVuZGluZy5nZW5JMThuVHMgfHwgY29uZmlnLmRlcGVuZGluZy5wcmlzbWE7XG59XG5cbmZ1bmN0aW9uIGFwcGVuZEZvcm1hdENvZGVDb21tYW5kKGZvcm1hdFNjcmlwdDogc3RyaW5nIHwgdW5kZWZpbmVkKTogc3RyaW5nIHtcbiAgcmV0dXJuIGZvcm1hdFNjcmlwdCA/IGAke2Zvcm1hdFNjcmlwdH0gJiYgYnVuIHJ1biBmb3JtYXQtY29kZWAgOiAnYnVuIHJ1biBmb3JtYXQtY29kZSc7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIG5vcm1hbGl6ZVB1Ymxpc2hlZENvbmZpZ1BhY2thZ2VNZXRhZGF0YShcbiAgY29uZmlnOiBQYWNrYWdlQ29uZmlnLFxuICBqc29uT2JqOiBXcml0YWJsZVBhY2thZ2VKc29uXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgaWYgKCFpc1B1Ymxpc2hlZFdpbGxib29zdGVyQ29uZmlnc1BhY2thZ2UoY29uZmlnKSkgcmV0dXJuO1xuXG4gIGNvbnN0IGNvbmZpZ01qc1BhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICdjb25maWcubWpzJyk7XG4gIGlmICghZnMuZXhpc3RzU3luYyhjb25maWdNanNQYXRoKSkgcmV0dXJuO1xuXG4gIGpzb25PYmoudHlwZSA9ICdtb2R1bGUnO1xuXG4gIGNvbnN0IGNvbmZpZ0R0c1BhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICdjb25maWcuZC50cycpO1xuICBpZiAoIWZzLmV4aXN0c1N5bmMoY29uZmlnRHRzUGF0aCkpIHJldHVybjtcblxuICBqc29uT2JqLmZpbGVzID0gWy4uLm5ldyBTZXQoWy4uLihqc29uT2JqLmZpbGVzID8/IFtdKSwgJ2NvbmZpZy5kLm10cyddKV07XG4gIC8vIE5vZGVOZXh0IHJlc29sdmVzIGEgcmVsYXRpdmUgYC4vY29uZmlnLm1qc2AgaW1wb3J0IHRvIGBjb25maWcuZC5tdHNgLCBub3RcbiAgLy8gdGhlIHBhY2thZ2UtbGV2ZWwgYHR5cGVzYCBmaWVsZC4gS2VlcCB0aGUgcHVibGlzaGVkIGNvbmZpZyBpbXBvcnRhYmxlIGZyb21cbiAgLy8gcGFja2FnZS1sb2NhbCBUeXBlU2NyaXB0IGxpbnRlciBzZXR0aW5ncy5cbiAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzVXRpbC5nZW5lcmF0ZUZpbGUocGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnY29uZmlnLmQubXRzJyksIGNvbmZpZ0RtdHNDb250ZW50KSk7XG59XG5cbmNvbnN0IGNvbmZpZ0RtdHNDb250ZW50ID0gYGV4cG9ydCB7IGRlZmF1bHQgfSBmcm9tICcuL2NvbmZpZy5qcyc7XG5gO1xuXG5mdW5jdGlvbiBhZGREZXBlbmRlbmN5VmVyc2lvbnNUb1BhY2thZ2VKc29uKFxuICBjb25maWc6IFBhY2thZ2VDb25maWcsXG4gIHJvb3RDb25maWc6IFBhY2thZ2VDb25maWcsXG4gIGpzb25PYmo6IFdyaXRhYmxlUGFja2FnZUpzb24sXG4gIGRlcGVuZGVuY3lVcGRhdGVzOiBEZXBlbmRlbmN5VXBkYXRlcyxcbiAgc2tpcEFkZGluZ0RlcHM6IGJvb2xlYW5cbik6IHZvaWQge1xuICBjb25zdCBwYWNrYWdlSnNvbkRlcGVuZGVuY2llcyA9IGpzb25PYmouZGVwZW5kZW5jaWVzO1xuICBjb25zdCBwYWNrYWdlSnNvbkRldkRlcGVuZGVuY2llcyA9IGpzb25PYmouZGV2RGVwZW5kZW5jaWVzO1xuICBkZXBlbmRlbmN5VXBkYXRlcy5kZXBlbmRlbmNpZXMgPSBhZGRQYWNrYWdlSnNvbkRlcGVuZGVuY2llcyhcbiAgICBjb25maWcsXG4gICAgcm9vdENvbmZpZyxcbiAgICBqc29uT2JqLFxuICAgIHBhY2thZ2VKc29uRGVwZW5kZW5jaWVzLFxuICAgIFsuLi5kZXBlbmRlbmN5VXBkYXRlcy5kZXBlbmRlbmNpZXMsIC4uLmdldEV4aXN0aW5nTWFuYWdlZERlcGVuZGVuY2llcyhwYWNrYWdlSnNvbkRlcGVuZGVuY2llcywganNvbk9iaildLFxuICAgIHNraXBBZGRpbmdEZXBzXG4gICk7XG4gIGRlcGVuZGVuY3lVcGRhdGVzLmRldkRlcGVuZGVuY2llcyA9IGRlcGVuZGVuY3lVcGRhdGVzLmRldkRlcGVuZGVuY2llcy5maWx0ZXIoKGRlcCkgPT4gIXBhY2thZ2VKc29uRGVwZW5kZW5jaWVzW2RlcF0pO1xuICBkZXBlbmRlbmN5VXBkYXRlcy5kZXZEZXBlbmRlbmNpZXMgPSBhZGRQYWNrYWdlSnNvbkRlcGVuZGVuY2llcyhcbiAgICBjb25maWcsXG4gICAgcm9vdENvbmZpZyxcbiAgICBqc29uT2JqLFxuICAgIHBhY2thZ2VKc29uRGV2RGVwZW5kZW5jaWVzLFxuICAgIFsuLi5kZXBlbmRlbmN5VXBkYXRlcy5kZXZEZXBlbmRlbmNpZXMsIC4uLmdldEV4aXN0aW5nTWFuYWdlZERlcGVuZGVuY2llcyhwYWNrYWdlSnNvbkRldkRlcGVuZGVuY2llcywganNvbk9iaildLFxuICAgIHNraXBBZGRpbmdEZXBzXG4gICk7XG59XG5cbmZ1bmN0aW9uIGdldEV4aXN0aW5nTWFuYWdlZERlcGVuZGVuY2llcyhcbiAgcGFja2FnZUpzb25EZXBlbmRlbmNpZXM6IFBhcnRpYWw8UmVjb3JkPHN0cmluZywgc3RyaW5nPj4sXG4gIGpzb25PYmo6IFBhY2thZ2VKc29uXG4pOiBzdHJpbmdbXSB7XG4gIHJldHVybiBPYmplY3Qua2V5cyhwYWNrYWdlSnNvbkRlcGVuZGVuY2llcykuZmlsdGVyKFxuICAgIChkZXBlbmRlbmN5KSA9PlxuICAgICAgbWFuYWdlZERlcGVuZGVuY3lOYW1lcy5oYXMoZGVwZW5kZW5jeSkgJiZcbiAgICAgIC8vIEEgcHVibGljIHBhY2thZ2UncyBgd29ya3NwYWNlOmAgc3BlY2lmaWVyIG11c3QgbmV2ZXIgYmUgcmUtbWFuYWdlZCB2aWEgYSByZWdpc3RyeSBpbnN0YWxsXG4gICAgICAvLyAocHJpdmF0ZSBvbmVzIGFyZSBub3JtYWxpemVkIHRvIGB3b3Jrc3BhY2U6KmAgbGF0ZXIpLiBUaGlzIGFsc28gY292ZXJzIHJ1bm5pbmcgd2JmeSBvbiBhXG4gICAgICAvLyBtb25vcmVwbyBTVUJESVJFQ1RPUlksIHdoZXJlIHRoZSBwYXJlbnQncyB3b3Jrc3BhY2VzIGFyZSBpbnZpc2libGUgYW5kIHRoZSB3b3Jrc3BhY2UtbWFwXG4gICAgICAvLyBndWFyZCBpbiBhZGRQYWNrYWdlSnNvbkRlcGVuZGVuY2llcyBjYW5ub3QgcHJvdGVjdCB0aGUgc3BlY2lmaWVyLlxuICAgICAgKGpzb25PYmoucHJpdmF0ZSB8fCAhcGFja2FnZUpzb25EZXBlbmRlbmNpZXNbZGVwZW5kZW5jeV0/LnN0YXJ0c1dpdGgoJ3dvcmtzcGFjZTonKSlcbiAgKTtcbn1cblxuZnVuY3Rpb24gcmVtb3ZlRW1wdHlEZXBlbmRlbmN5U2VjdGlvbnMoanNvbk9iajogUGFja2FnZUpzb24pOiB2b2lkIHtcbiAgZm9yIChjb25zdCBrZXkgb2YgZGVwZW5kZW5jeVNlY3Rpb25LZXlzKSB7XG4gICAgY29uc3Qgc2VjdGlvbiA9IGpzb25PYmpba2V5XTtcbiAgICBpZiAoc2VjdGlvbiAmJiBPYmplY3Qua2V5cyhzZWN0aW9uKS5sZW5ndGggPT09IDApIHtcbiAgICAgIFJlZmxlY3QuZGVsZXRlUHJvcGVydHkoanNvbk9iaiwga2V5KTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gaW5zdGFsbERlcGVuZGVuY3lVcGRhdGVzKFxuICBjb25maWc6IFBhY2thZ2VDb25maWcsXG4gIHJvb3RDb25maWc6IFBhY2thZ2VDb25maWcsXG4gIGpzb25PYmo6IFBhY2thZ2VKc29uLFxuICBkZXBlbmRlbmN5VXBkYXRlczogRGVwZW5kZW5jeVVwZGF0ZXNcbik6IHZvaWQge1xuICBpZiAoY29uZmlnLmRvZXNDb250YWluUGFja2FnZUpzb24pIHtcbiAgICBjb25zdCBkZXBlbmRlbmNpZXMgPSBkZXBlbmRlbmN5VXBkYXRlcy5kZXBlbmRlbmNpZXMuZmlsdGVyKChkZXApID0+ICFqc29uT2JqLmRldkRlcGVuZGVuY2llcz8uW2RlcF0pO1xuICAgIGluc3RhbGxOcG1EZXBlbmRlbmNpZXMoY29uZmlnLCByb290Q29uZmlnLCBkZXBlbmRlbmNpZXMsIGZhbHNlKTtcblxuICAgIGNvbnN0IGRldkRlcGVuZGVuY2llcyA9IGRlcGVuZGVuY3lVcGRhdGVzLmRldkRlcGVuZGVuY2llcy5maWx0ZXIoKGRlcCkgPT4gIWpzb25PYmouZGVwZW5kZW5jaWVzPy5bZGVwXSk7XG4gICAgaW5zdGFsbE5wbURlcGVuZGVuY2llcyhjb25maWcsIHJvb3RDb25maWcsIGRldkRlcGVuZGVuY2llcywgdHJ1ZSk7XG4gIH1cblxuICBjb25zdCBweXRob25QYWNrYWdlTWFuYWdlciA9IGdldFB5dGhvblBhY2thZ2VNYW5hZ2VyKGNvbmZpZyk7XG4gIGlmIChweXRob25QYWNrYWdlTWFuYWdlciAmJiBkZXBlbmRlbmN5VXBkYXRlcy5weXRob25EZXZEZXBlbmRlbmNpZXMubGVuZ3RoID4gMCkge1xuICAgIGNvbnN0IGRlcGVuZGVuY2llcyA9IFsuLi5uZXcgU2V0KGRlcGVuZGVuY3lVcGRhdGVzLnB5dGhvbkRldkRlcGVuZGVuY2llcyldO1xuICAgIGlmIChweXRob25QYWNrYWdlTWFuYWdlciA9PT0gJ3BvZXRyeScpIHtcbiAgICAgIHNwYXduU3luYygncG9ldHJ5JywgWydhZGQnLCAnLS1ncm91cCcsICdkZXYnLCAuLi5kZXBlbmRlbmNpZXNdLCBjb25maWcuZGlyUGF0aCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHNwYXduU3luYygndXYnLCBbJ2FkZCcsICctLWRldicsIC4uLmRlcGVuZGVuY2llc10sIGNvbmZpZy5kaXJQYXRoKTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gZ2V0UHl0aG9uUGFja2FnZU1hbmFnZXIoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogJ3BvZXRyeScgfCAndXYnIHwgdW5kZWZpbmVkIHtcbiAgaWYgKGNvbmZpZy5kb2VzQ29udGFpblV2TG9jaykgcmV0dXJuICd1dic7XG4gIGlmIChjb25maWcuZG9lc0NvbnRhaW5Qb2V0cnlMb2NrKSByZXR1cm4gJ3BvZXRyeSc7XG59XG5cbmZ1bmN0aW9uIGdldFB5dGhvblNldHVwQ29tbWFuZChwYWNrYWdlTWFuYWdlcjogJ3BvZXRyeScgfCAndXYnKTogc3RyaW5nIHtcbiAgaWYgKHBhY2thZ2VNYW5hZ2VyID09PSAndXYnKSByZXR1cm4gJ3V2IHN5bmMgLS1mcm96ZW4nO1xuICAvLyBgbWlzZSB3aGljaCBweXRob25gIHlpZWxkcyB0aGUgc2luZ2xlIGFjdGl2ZSBpbnRlcnByZXRlciBwYXRoOyBgbWlzZSBjdXJyZW50IHB5dGhvbmAgY2FuXG4gIC8vIHByaW50IG11bHRpcGxlIHNwYWNlLXNlcGFyYXRlZCB2ZXJzaW9ucyAobWlzZSBzdXBwb3J0cyBtdWx0aS12ZXJzaW9uIHBpbnMpLCB3aGljaCB3b3VsZCBwYXNzXG4gIC8vIGV4dHJhIHBvc2l0aW9uYWwgYXJndW1lbnRzIHRvIGBwb2V0cnkgZW52IHVzZWAuIFdoZW4gbWlzZSBpcyBtaXNzaW5nIG9yIHB5dGhvbiBpc1xuICAvLyB1bmNvbmZpZ3VyZWQsIHNraXAgYHBvZXRyeSBlbnYgdXNlYCBhbmQgZmFsbCBiYWNrIHRvIHBvZXRyeSdzIGRlZmF1bHQgaW50ZXJwcmV0ZXIgaW5zdGVhZCBvZlxuICAvLyBhYm9ydGluZyB0aGUgY2hhaW4uXG4gIC8vIFRoZSBgfHwgdHJ1ZWAgY292ZXJzIG9ubHkgdGhlIG1pc2UgcmVzb2x1dGlvbjogYSBtaXNzaW5nL3VuY29uZmlndXJlZCBtaXNlIGZhbGxzIGJhY2sgdG9cbiAgLy8gcG9ldHJ5J3MgZGVmYXVsdCBpbnRlcnByZXRlciwgd2hpbGUgYSBmYWlsaW5nIGBwb2V0cnkgZW52IHVzZWAgc3RpbGwgYWJvcnRzIHRoZSBjaGFpbi5cbiAgcmV0dXJuICdwb2V0cnkgY29uZmlnIHZpcnR1YWxlbnZzLmluLXByb2plY3QgdHJ1ZSAmJiB7IHB5dGhvbl9wYXRoPVwiJChtaXNlIHdoaWNoIHB5dGhvbiAyPi9kZXYvbnVsbClcIiB8fCB0cnVlOyB9ICYmIHsgWyAteiBcIiRweXRob25fcGF0aFwiIF0gfHwgcG9ldHJ5IGVudiB1c2UgXCIkcHl0aG9uX3BhdGhcIjsgfSAmJiBwb2V0cnkgcnVuIHBpcCBpbnN0YWxsIC0tdXBncmFkZSBwaXAgJiYgcG9ldHJ5IGluc3RhbGwnO1xufVxuXG5mdW5jdGlvbiBpbnN0YWxsTnBtRGVwZW5kZW5jaWVzKFxuICBjb25maWc6IFBhY2thZ2VDb25maWcsXG4gIHJvb3RDb25maWc6IFBhY2thZ2VDb25maWcsXG4gIGRlcGVuZGVuY2llczogc3RyaW5nW10sXG4gIGRldjogYm9vbGVhblxuKTogdm9pZCB7XG4gIGlmIChkZXBlbmRlbmNpZXMubGVuZ3RoID09PSAwKSByZXR1cm47XG5cbiAgY29uc3QgZGVwZW5kZW5jeVNwZWNpZmllcnMgPSBbXG4gICAgLi4ubmV3IFNldChkZXBlbmRlbmNpZXMubWFwKChkZXBlbmRlbmN5KSA9PiBnZXRJbnN0YWxsRGVwZW5kZW5jeVNwZWNpZmllcihjb25maWcsIHJvb3RDb25maWcsIGRlcGVuZGVuY3kpKSksXG4gIF07XG4gIHNwYXduU3luYygnYnVuJywgWydhZGQnLCAuLi4oZGV2ID8gWyctRCddIDogW10pLCAnLS1leGFjdCcsIC4uLmRlcGVuZGVuY3lTcGVjaWZpZXJzXSwgY29uZmlnLmRpclBhdGgpO1xufVxuXG5mdW5jdGlvbiBhZGRQYWNrYWdlSnNvbkRlcGVuZGVuY2llcyhcbiAgY29uZmlnOiBQYWNrYWdlQ29uZmlnLFxuICByb290Q29uZmlnOiBQYWNrYWdlQ29uZmlnLFxuICBqc29uT2JqOiBXcml0YWJsZVBhY2thZ2VKc29uLFxuICBwYWNrYWdlSnNvbkRlcGVuZGVuY2llczogUGFydGlhbDxSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+PixcbiAgZGVwZW5kZW5jaWVzOiBzdHJpbmdbXSxcbiAgc2tpcEFkZGluZ0RlcHM6IGJvb2xlYW5cbik6IHN0cmluZ1tdIHtcbiAgY29uc3QgZGVwZW5kZW5jaWVzVG9JbnN0YWxsOiBzdHJpbmdbXSA9IFtdO1xuICBmb3IgKGNvbnN0IGRlcGVuZGVuY3kgb2YgbmV3IFNldChkZXBlbmRlbmNpZXMpKSB7XG4gICAgLy8gQSBwcml2YXRlIHBhY2thZ2Ugd2hvc2UgbW9ub3JlcG8gY29udGFpbnMgdGhpcyBkZXBlbmRlbmN5IGFzIGEgd29ya3NwYWNlIG11c3QgcmVmZXJlbmNlIGl0XG4gICAgLy8gdmlhIHRoZSB3b3Jrc3BhY2UgcHJvdG9jb2w6IHBpbm5pbmcgYSByZWdpc3RyeSB2ZXJzaW9uIG1ha2VzIEJ1biBzaGFkb3cgdGhlIHNhbWUtbmFtZVxuICAgIC8vIHdvcmtzcGFjZSBhbmQgc2tpcCBpbnN0YWxsaW5nIHRoZSB3b3Jrc3BhY2UncyBvd24gZGVwZW5kZW5jaWVzLiAoUHVibGlzaGVkIHBhY2thZ2VzIGluc3RlYWRcbiAgICAvLyBwaW4gYSBjb25jcmV0ZSB2ZXJzaW9uIGJlY2F1c2UgYG5wbSBwdWJsaXNoYCByZWplY3RzIGB3b3Jrc3BhY2U6KmAgc3BlY2lmaWVycyDigJQgYnV0IGFuXG4gICAgLy8gRVhJU1RJTkcgYHdvcmtzcGFjZTpgIGRlY2xhcmF0aW9uIGlzIGFsd2F5cyBrZXB0OiBvdmVyd3JpdGluZyBpdCB3aXRoIGEgcmVnaXN0cnkgcmVsZWFzZVxuICAgIC8vIHdvdWxkIHNpbGVudGx5IGJyZWFrIHRoZSBsb2NhbCB3b3Jrc3BhY2UgbGluay4pXG5cbiAgICAvLyBBIGRlY2xhcmVkIGB3b3Jrc3BhY2U6YCBzcGVjaWZpZXIgYWx3YXlzIHdpbnMsIHdoZXRoZXIgb3Igbm90IHRoZSB3b3Jrc3BhY2UgbWFwIHNlZXMgdGhlXG4gICAgLy8gcGFja2FnZTogcnVubmluZyB3YmZ5IG9uIGEgbW9ub3JlcG8gU1VCRElSRUNUT1JZIGhpZGVzIHRoZSBwYXJlbnQncyB3b3Jrc3BhY2VzLCBzbyB0aGUgbWFwXG4gICAgLy8gYWxvbmUgY2Fubm90IGJlIHRydXN0ZWQgdG8gZGV0ZWN0IGEgbG9jYWwgd29ya3NwYWNlIGxpbmsuXG4gICAgaWYgKHBhY2thZ2VKc29uRGVwZW5kZW5jaWVzW2RlcGVuZGVuY3ldPy5zdGFydHNXaXRoKCd3b3Jrc3BhY2U6JykpIHtcbiAgICAgIGlmIChqc29uT2JqLnByaXZhdGUpIHtcbiAgICAgICAgcGFja2FnZUpzb25EZXBlbmRlbmNpZXNbZGVwZW5kZW5jeV0gPSAnd29ya3NwYWNlOionO1xuICAgICAgfVxuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGlmIChqc29uT2JqLnByaXZhdGUgJiYgZ2V0V29ya3NwYWNlUGFja2FnZURpcnMocm9vdENvbmZpZykuaGFzKGRlcGVuZGVuY3kpKSB7XG4gICAgICBjb25zdCBleGlzdGluZ1NwZWNpZmllciA9IHBhY2thZ2VKc29uRGVwZW5kZW5jaWVzW2RlcGVuZGVuY3ldO1xuICAgICAgaWYgKCFleGlzdGluZ1NwZWNpZmllciB8fCBleGlzdGluZ1NwZWNpZmllci5zdGFydHNXaXRoKCd3b3Jrc3BhY2U6JykpIHtcbiAgICAgICAgcGFja2FnZUpzb25EZXBlbmRlbmNpZXNbZGVwZW5kZW5jeV0gPSAnd29ya3NwYWNlOionO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIC8vIEFuIGV4aXN0aW5nIENPTkNSRVRFIHBpbiBvbiBhIHdvcmtzcGFjZSBwYWNrYWdlIGlzIGEgZGVsaWJlcmF0ZSBjaG9pY2UgYW5kIG11c3Qgbm90IGJlXG4gICAgICAvLyBjb252ZXJ0ZWQgdG8gdGhlIHdvcmtzcGFjZSBwcm90b2NvbC4gTm90ZSB0aGUgdHJhZGUtb2ZmIGVpdGhlciB3YXk6IG5wbSAod2hpY2hcbiAgICAgIC8vIHNlbWFudGljLXJlbGVhc2UncyBucG0gcGx1Z2luIHNoZWxscyBvdXQgdG8pIGNhbm5vdCBwYXJzZSBgd29ya3NwYWNlOmAgc3BlY2lmaWVycywgd2hpbGVcbiAgICAgIC8vIGEgcmVnaXN0cnkgcGluIG1ha2VzIGEgY29sZCBidW4gaW5zdGFsbCBzaGFkb3cgdGhlIHdvcmtzcGFjZSBhbmQgc2tpcCBpdHMgZGVwZW5kZW5jaWVzIOKAlFxuICAgICAgLy8gV2lsbEJvb3N0ZXIvc2hhcmVkIGtlZXBzIGB3b3Jrc3BhY2U6KmAgYW5kIHN0cmlwcyB0aGUgcHJvdG9jb2wgb24gdGhlIENJIGNoZWNrb3V0IHJpZ2h0XG4gICAgICAvLyBiZWZvcmUgcmVsZWFzaW5nIChzY3JpcHRzL3N0cmlwV29ya3NwYWNlUHJvdG9jb2wubWpzKS4gRmFsbCB0aHJvdWdoIHNvIGEgY29uY3JldGUgcGluXG4gICAgICAvLyBrZWVwcyBiZWluZyBidW1wZWQgbGlrZSBhbnkgbWFuYWdlZCBkZXBlbmRlbmN5LlxuICAgIH1cbiAgICBjb25zdCBzaG91bGRVcGRhdGVFeGlzdGluZ0RlcGVuZGVuY3kgPSBzaG91bGRVcGRhdGVFeGlzdGluZ01hbmFnZWREZXBlbmRlbmN5KFxuICAgICAgY29uZmlnLFxuICAgICAgcm9vdENvbmZpZyxcbiAgICAgIGRlcGVuZGVuY3ksXG4gICAgICBwYWNrYWdlSnNvbkRlcGVuZGVuY2llc1tkZXBlbmRlbmN5XVxuICAgICk7XG4gICAgaWYgKHNob3VsZFVwZGF0ZUV4aXN0aW5nRGVwZW5kZW5jeSkge1xuICAgICAgY29uc3QgbWFuYWdlZFZlcnNpb24gPSBnZXRNYW5hZ2VkRGVwZW5kZW5jeVZlcnNpb24oY29uZmlnLCByb290Q29uZmlnLCBkZXBlbmRlbmN5KTtcbiAgICAgIGlmIChzaG91bGREb3duZ3JhZGVBZ2VHYXRlZE1hbmFnZWREZXBlbmRlbmN5KGRlcGVuZGVuY3ksIHBhY2thZ2VKc29uRGVwZW5kZW5jaWVzW2RlcGVuZGVuY3ldLCBtYW5hZ2VkVmVyc2lvbikpIHtcbiAgICAgICAgLy8gYGJ1biBhZGQgZGVwZW5kZW5jeWAgcHJlc2VydmVzIGFuIGV4aXN0aW5nIGV4YWN0IHBpbiwgc28gd3JpdGUgdGhlIGFnZS1jbGVhcmVkIHZlcnNpb25cbiAgICAgICAgLy8gZGlyZWN0bHkuIFRoZSBmaW5hbCByZXBvc2l0b3J5LXdpZGUgaW5zdGFsbCByZWZyZXNoZXMgdGhlIGxvY2tmaWxlIGFmdGVyIGV2ZXJ5IHBhY2thZ2VcbiAgICAgICAgLy8gbWFuaWZlc3QgaGFzIGNvbnZlcmdlZCBvbiB0aGUgZ2VuZXJhdGVkIHJlbGVhc2UtYWdlIHBvbGljeS5cbiAgICAgICAgcGFja2FnZUpzb25EZXBlbmRlbmNpZXNbZGVwZW5kZW5jeV0gPSBtYW5hZ2VkVmVyc2lvbjtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBkZXBlbmRlbmNpZXNUb0luc3RhbGwucHVzaChkZXBlbmRlbmN5KTtcbiAgICAgIGlmICghc2tpcEFkZGluZ0RlcHMpIGNvbnRpbnVlO1xuICAgIH1cbiAgICBpZiAoXG4gICAgICBwYWNrYWdlSnNvbkRlcGVuZGVuY2llc1tkZXBlbmRlbmN5XSAmJlxuICAgICAgIXNob3VsZFVwZGF0ZUV4aXN0aW5nRGVwZW5kZW5jeSAmJlxuICAgICAgcGFja2FnZUpzb25EZXBlbmRlbmNpZXNbZGVwZW5kZW5jeV0gIT09ICcqJ1xuICAgIClcbiAgICAgIGNvbnRpbnVlO1xuICAgIGNvbnN0IGxhdGVzdFZlcnNpb24gPSBnZXRNYW5hZ2VkRGVwZW5kZW5jeVZlcnNpb24oY29uZmlnLCByb290Q29uZmlnLCBkZXBlbmRlbmN5KTtcbiAgICBpZiAobGF0ZXN0VmVyc2lvbiA9PT0gJyonICYmIHBhY2thZ2VKc29uRGVwZW5kZW5jaWVzW2RlcGVuZGVuY3ldKSBjb250aW51ZTtcbiAgICBwYWNrYWdlSnNvbkRlcGVuZGVuY2llc1tkZXBlbmRlbmN5XSA9IGxhdGVzdFZlcnNpb247XG4gIH1cbiAgcmV0dXJuIGRlcGVuZGVuY2llc1RvSW5zdGFsbDtcbn1cblxuZnVuY3Rpb24gZm9ybWF0UGFja2FnZUpzb25XaXRoUHJvamVjdEZvcm1hdHRlcihjb25maWc6IFBhY2thZ2VDb25maWcsIGZpbGVQYXRoOiBzdHJpbmcpOiB2b2lkIHtcbiAgY29uc3QgcmVsYXRpdmVGaWxlUGF0aCA9IHBhdGgucmVsYXRpdmUoY29uZmlnLmRpclBhdGgsIGZpbGVQYXRoKTtcbiAgaWYgKCFyZWxhdGl2ZUZpbGVQYXRoKSByZXR1cm47XG5cbiAgLy8gUmV1c2UgdGhlIHRhcmdldCByZXBvc2l0b3J5J3Mgb3duIGZvcm1hdHRlciBhZnRlciBkZXBlbmRlbmN5IGluc3RhbGxhdGlvbiBzb1xuICAvLyBwYWNrYWdlLmpzb24gbWF0Y2hlcyB3aGF0ZXZlciBpdHMgY3VycmVudCBzb3J0LXBhY2thZ2UtanNvbiB2ZXJzaW9uIGV4cGVjdHMuXG4gIC8vIFRoaXMgYXZvaWRzIGZvbGxvdy11cCBhdXRvZml4IGNvbW1pdHMgY2F1c2VkIG9ubHkgYnkgZm9ybWF0dGVyIHZlcnNpb24gZHJpZnRcbiAgLy8gYmV0d2VlbiB3YmZ5IGFuZCB0aGUgcHJvamVjdCBiZWluZyB1cGRhdGVkLlxuICBzcGF3blN5bmMoJ2J1bngnLCBbJ3NvcnQtcGFja2FnZS1qc29uJywgcmVsYXRpdmVGaWxlUGF0aF0sIGNvbmZpZy5kaXJQYXRoKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gcmVtb3ZlVW51c2VkVHNjb25maWdCYXNlRGVwZW5kZW5jaWVzKFxuICBjb25maWc6IFBhY2thZ2VDb25maWcsXG4gIGpzb25PYmo6IFdyaXRhYmxlUGFja2FnZUpzb24sXG4gIHVzZWREZXBlbmRlbmNpZXM6IHN0cmluZ1tdXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgdXNlZERlcGVuZGVuY3lTZXQgPSBuZXcgU2V0KHVzZWREZXBlbmRlbmNpZXMpO1xuICBjb25zdCBleGlzdGluZ1RzY29uZmlnQmFzZURlcGVuZGVuY2llcyA9IGF3YWl0IGdldEV4aXN0aW5nVHNjb25maWdCYXNlRGVwZW5kZW5jaWVzKGNvbmZpZyk7XG4gIGZvciAoY29uc3QgZGVwZW5kZW5jeSBvZiBtYW5hZ2VkVHNjb25maWdCYXNlRGVwZW5kZW5jaWVzKSB7XG4gICAgaWYgKHVzZWREZXBlbmRlbmN5U2V0LmhhcyhkZXBlbmRlbmN5KSB8fCBleGlzdGluZ1RzY29uZmlnQmFzZURlcGVuZGVuY2llcy5oYXMoZGVwZW5kZW5jeSkpIGNvbnRpbnVlO1xuICAgIC8vIHdiZnkgb3ducyB0aGVzZSBiYXNlLWNvbmZpZyBwYWNrYWdlcy4gUmVtb3ZlIHN0YWxlIHZhcmlhbnRzIHdoZW4gcmVwb1xuICAgIC8vIGNhcGFiaWxpdGllcyBjaGFuZ2UsIHN1Y2ggYXMgTmV4dC5qcyB0YWtpbmcgb3duZXJzaGlwIG9mIHRzY29uZmlnLmpzb24uXG4gICAgZm9yIChjb25zdCBzZWN0aW9uIG9mIGdldERlcGVuZGVuY3lTZWN0aW9ucyhqc29uT2JqKSkge1xuICAgICAgUmVmbGVjdC5kZWxldGVQcm9wZXJ0eShzZWN0aW9uLCBkZXBlbmRlbmN5KTtcbiAgICB9XG4gIH1cbn1cblxuYXN5bmMgZnVuY3Rpb24gZ2V0RXhpc3RpbmdUc2NvbmZpZ0Jhc2VEZXBlbmRlbmNpZXMoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTxTZXQ8c3RyaW5nPj4ge1xuICBjb25zdCBleGlzdGluZ1RzY29uZmlnQmFzZURlcGVuZGVuY2llcyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICBjb25zdCBmaWxlUGF0aHMgPSBhd2FpdCBmZy5nbG9iKCcqKi90c2NvbmZpZyouanNvbicsIHtcbiAgICBjd2Q6IGNvbmZpZy5kaXJQYXRoLFxuICAgIGRvdDogdHJ1ZSxcbiAgICBpZ25vcmU6IGdsb2JJZ25vcmUsXG4gIH0pO1xuXG4gIGZvciAoY29uc3QgZmlsZVBhdGggb2YgZmlsZVBhdGhzKSB7XG4gICAgY29uc3QgYWJzb2x1dGVGaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgZmlsZVBhdGgpO1xuICAgIC8vIFR5cGVTY3JpcHQgNydzIG5hdGl2ZSBjb21waWxlciBkcm9wcGVkIHRoZSBpbi1wcm9jZXNzIGBwYXJzZUNvbmZpZ0ZpbGVUZXh0VG9Kc29uYFxuICAgIC8vIGhlbHBlciwgc28gcGFyc2UgdGhlIHRzY29uZmlnIGludG8gYW4gQVNUIGFuZCByZWFkIGl0cyB0b3AtbGV2ZWwgYGV4dGVuZHNgIGRpcmVjdGx5LlxuICAgIGNvbnN0IHNvdXJjZSA9IGF3YWl0IHBhcnNlU291cmNlRmlsZShhYnNvbHV0ZUZpbGVQYXRoKTtcbiAgICBpZiAoIXNvdXJjZSkge1xuICAgICAgY29uc29sZS53YXJuKGBQcmVzZXJ2ZSBtYW5hZ2VkIEB0c2NvbmZpZyBkZXBlbmRlbmNpZXMgYmVjYXVzZSAke2Fic29sdXRlRmlsZVBhdGh9IGNvdWxkIG5vdCBiZSBwYXJzZWQuYCk7XG4gICAgICByZXR1cm4gbmV3IFNldChtYW5hZ2VkVHNjb25maWdCYXNlRGVwZW5kZW5jaWVzKTtcbiAgICB9XG4gICAgZm9yIChjb25zdCB2YWx1ZSBvZiByZWFkVHNjb25maWdFeHRlbmRzKHNvdXJjZSkpIHtcbiAgICAgIGZvciAoY29uc3QgZGVwZW5kZW5jeSBvZiBtYW5hZ2VkVHNjb25maWdCYXNlRGVwZW5kZW5jaWVzKSB7XG4gICAgICAgIGlmICh2YWx1ZSA9PT0gZGVwZW5kZW5jeSB8fCB2YWx1ZS5zdGFydHNXaXRoKGAke2RlcGVuZGVuY3l9L2ApKSB7XG4gICAgICAgICAgZXhpc3RpbmdUc2NvbmZpZ0Jhc2VEZXBlbmRlbmNpZXMuYWRkKGRlcGVuZGVuY3kpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGV4aXN0aW5nVHNjb25maWdCYXNlRGVwZW5kZW5jaWVzO1xufVxuXG4vKiogUmVhZHMgdGhlIHRvcC1sZXZlbCBgZXh0ZW5kc2AgZW50cmllcyAoYSBzdHJpbmcgb3IgYXJyYXkgb2Ygc3RyaW5ncykgZnJvbSBhIHBhcnNlZCB0c2NvbmZpZy4gKi9cbmZ1bmN0aW9uIHJlYWRUc2NvbmZpZ0V4dGVuZHMoc291cmNlOiBhc3QuU291cmNlRmlsZSk6IHN0cmluZ1tdIHtcbiAgY29uc3QgdmFsdWVzOiBzdHJpbmdbXSA9IFtdO1xuICBmb3IgKGNvbnN0IHByb3BlcnR5IG9mIGdldFRzY29uZmlnUm9vdFByb3BlcnRpZXMoc291cmNlKSkge1xuICAgIGlmIChhc3QuaXNQcm9wZXJ0eUFzc2lnbm1lbnQocHJvcGVydHkpICYmIGFzdC5pc1N0cmluZ0xpdGVyYWwocHJvcGVydHkubmFtZSkgJiYgcHJvcGVydHkubmFtZS50ZXh0ID09PSAnZXh0ZW5kcycpIHtcbiAgICAgIGNvbGxlY3RTdHJpbmdMaXRlcmFsVmFsdWVzKHByb3BlcnR5LmluaXRpYWxpemVyLCB2YWx1ZXMpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gdmFsdWVzO1xufVxuXG5mdW5jdGlvbiBnZXRUc2NvbmZpZ1Jvb3RQcm9wZXJ0aWVzKHNvdXJjZTogYXN0LlNvdXJjZUZpbGUpOiByZWFkb25seSBhc3QuT2JqZWN0TGl0ZXJhbEVsZW1lbnRMaWtlW10ge1xuICBmb3IgKGNvbnN0IHN0YXRlbWVudCBvZiBzb3VyY2Uuc3RhdGVtZW50cykge1xuICAgIGlmIChhc3QuaXNFeHByZXNzaW9uU3RhdGVtZW50KHN0YXRlbWVudCkgJiYgYXN0LmlzT2JqZWN0TGl0ZXJhbEV4cHJlc3Npb24oc3RhdGVtZW50LmV4cHJlc3Npb24pKSB7XG4gICAgICByZXR1cm4gc3RhdGVtZW50LmV4cHJlc3Npb24ucHJvcGVydGllcztcbiAgICB9XG4gIH1cbiAgcmV0dXJuIFtdO1xufVxuXG5mdW5jdGlvbiBjb2xsZWN0U3RyaW5nTGl0ZXJhbFZhbHVlcyhub2RlOiBhc3QuRXhwcmVzc2lvbiwgdmFsdWVzOiBzdHJpbmdbXSk6IHZvaWQge1xuICBpZiAoYXN0LmlzU3RyaW5nTGl0ZXJhbChub2RlKSkge1xuICAgIHZhbHVlcy5wdXNoKG5vZGUudGV4dCk7XG4gIH0gZWxzZSBpZiAoYXN0LmlzQXJyYXlMaXRlcmFsRXhwcmVzc2lvbihub2RlKSkge1xuICAgIGZvciAoY29uc3QgZWxlbWVudCBvZiBub2RlLmVsZW1lbnRzKSB7XG4gICAgICBjb2xsZWN0U3RyaW5nTGl0ZXJhbFZhbHVlcyhlbGVtZW50LCB2YWx1ZXMpO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBnZXREZXBlbmRlbmN5U2VjdGlvbnMoanNvbk9iajogUGFja2FnZUpzb24pOiBQYXJ0aWFsPFJlY29yZDxzdHJpbmcsIHN0cmluZz4+W10ge1xuICByZXR1cm4gZGVwZW5kZW5jeVNlY3Rpb25LZXlzXG4gICAgLm1hcCgoa2V5KSA9PiBqc29uT2JqW2tleV0pXG4gICAgLmZpbHRlcigoc2VjdGlvbik6IHNlY3Rpb24gaXMgUGFydGlhbDxSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+PiA9PiAhIXNlY3Rpb24pO1xufVxuXG5mdW5jdGlvbiBnZXRMYXRlc3REZXBlbmRlbmN5VmVyc2lvbihkZXBlbmRlbmN5OiBzdHJpbmcpOiBzdHJpbmcge1xuICBjb25zdCBjYWNoZWRWZXJzaW9uID0gbGF0ZXN0RGVwZW5kZW5jeVZlcnNpb25DYWNoZS5nZXQoZGVwZW5kZW5jeSk7XG4gIGlmIChjYWNoZWRWZXJzaW9uKSByZXR1cm4gY2FjaGVkVmVyc2lvbjtcblxuICBjb25zdCB2ZXJzaW9uID0gZ2V0RGVwZW5kZW5jeVZlcnNpb25Gcm9tTnBtKGRlcGVuZGVuY3kpO1xuICBsYXRlc3REZXBlbmRlbmN5VmVyc2lvbkNhY2hlLnNldChkZXBlbmRlbmN5LCB2ZXJzaW9uKTtcbiAgcmV0dXJuIHZlcnNpb247XG59XG5cbmZ1bmN0aW9uIGdldERlcGVuZGVuY3lWZXJzaW9uRnJvbU5wbShkZXBlbmRlbmN5OiBzdHJpbmcpOiBzdHJpbmcge1xuICBpZiAoIXNob3VsZEFwcGx5UGFja2FnZUFnZUdhdGUoZGVwZW5kZW5jeSkpIHtcbiAgICByZXR1cm4gZ2V0UmF3RGVwZW5kZW5jeVZlcnNpb25Gcm9tTnBtKGRlcGVuZGVuY3kpO1xuICB9XG5cbiAgcmV0dXJuIGdldExhdGVzdEFnZUdhdGVkRGVwZW5kZW5jeVZlcnNpb24oZGVwZW5kZW5jeSk7XG59XG5cbmZ1bmN0aW9uIGdldExhdGVzdEFnZUdhdGVkRGVwZW5kZW5jeVZlcnNpb24oZGVwZW5kZW5jeTogc3RyaW5nKTogc3RyaW5nIHtcbiAgY29uc3QgdGltZXMgPSBnZXROcG1QYWNrYWdlVGltZXMoZGVwZW5kZW5jeSk7XG4gIGNvbnN0IGxhdGVzdFZlcnNpb24gPSBnZXRSYXdEZXBlbmRlbmN5VmVyc2lvbkZyb21OcG0oZGVwZW5kZW5jeSk7XG4gIGlmIChsYXRlc3RWZXJzaW9uICE9PSAnKicgJiYgaXNQdWJsaXNoZWRCZWZvcmVBZ2VHYXRlKHRpbWVzW2xhdGVzdFZlcnNpb25dKSkge1xuICAgIHJldHVybiBsYXRlc3RWZXJzaW9uO1xuICB9XG5cbiAgcmV0dXJuIGdldEFnZUdhdGVkVmVyc2lvbnNEZXNjZW5kaW5nKHRpbWVzKVswXSA/PyAnKic7XG59XG5cbi8qKiBFdmVyeSBzdGFibGUgcmVsZWFzZSBpbiBgdGltZXNgIHRoYXQgYWxyZWFkeSBjbGVhcmVkIHRoZSBhZ2UgZ2F0ZSwgbmV3ZXN0IGZpcnN0LiAqL1xuZnVuY3Rpb24gZ2V0QWdlR2F0ZWRWZXJzaW9uc0Rlc2NlbmRpbmcodGltZXM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4pOiBzdHJpbmdbXSB7XG4gIGNvbnN0IG5vdyA9IERhdGUubm93KCk7XG4gIHJldHVybiBPYmplY3QuZW50cmllcyh0aW1lcylcbiAgICAuZmlsdGVyKChbdmVyc2lvbl0pID0+IHNlbXZlci52YWxpZCh2ZXJzaW9uKSlcbiAgICAuZmlsdGVyKChbdmVyc2lvbl0pID0+IChzZW12ZXIucHJlcmVsZWFzZSh2ZXJzaW9uKT8ubGVuZ3RoID8/IDApID09PSAwKVxuICAgIC5maWx0ZXIoKFssIHB1Ymxpc2hlZEF0XSkgPT4gTnVtYmVyLmlzRmluaXRlKERhdGUucGFyc2UocHVibGlzaGVkQXQpKSlcbiAgICAuZmlsdGVyKChbLCBwdWJsaXNoZWRBdF0pID0+IG5vdyAtIERhdGUucGFyc2UocHVibGlzaGVkQXQpID49IHBhY2thZ2VBZ2VHYXRlTXMpXG4gICAgLnRvU29ydGVkKChbdmVyc2lvbkFdLCBbdmVyc2lvbkJdKSA9PiBzZW12ZXIucmNvbXBhcmUodmVyc2lvbkEsIHZlcnNpb25CKSlcbiAgICAubWFwKChbdmVyc2lvbl0pID0+IHZlcnNpb24pO1xufVxuXG5mdW5jdGlvbiBpc1B1Ymxpc2hlZEJlZm9yZUFnZUdhdGUocHVibGlzaGVkQXQ6IHN0cmluZyB8IHVuZGVmaW5lZCk6IGJvb2xlYW4ge1xuICBpZiAoIXB1Ymxpc2hlZEF0KSByZXR1cm4gZmFsc2U7XG4gIGNvbnN0IHB1Ymxpc2hlZFRpbWUgPSBEYXRlLnBhcnNlKHB1Ymxpc2hlZEF0KTtcbiAgcmV0dXJuIE51bWJlci5pc0Zpbml0ZShwdWJsaXNoZWRUaW1lKSAmJiBEYXRlLm5vdygpIC0gcHVibGlzaGVkVGltZSA+PSBwYWNrYWdlQWdlR2F0ZU1zO1xufVxuXG5mdW5jdGlvbiBnZXROcG1QYWNrYWdlVGltZXMoZGVwZW5kZW5jeTogc3RyaW5nKTogUmVjb3JkPHN0cmluZywgc3RyaW5nPiB7XG4gIGNvbnN0IHBhY2thZ2VOYW1lID0gZGVwZW5kZW5jeS5yZXBsYWNlKC9AW15AL10rJC91LCAnJyk7XG4gIGNvbnN0IGNhY2hlZFRpbWVzID0gbnBtUGFja2FnZVRpbWVzQ2FjaGUuZ2V0KHBhY2thZ2VOYW1lKTtcbiAgaWYgKGNhY2hlZFRpbWVzKSByZXR1cm4gY2FjaGVkVGltZXM7XG5cbiAgY29uc3Qgc3Rkb3V0ID0gc3Bhd25TeW5jQW5kUmV0dXJuU3Rkb3V0KFxuICAgICducG0nLFxuICAgIFsnc2hvdycsIHBhY2thZ2VOYW1lLCAndGltZScsICctLWpzb24nLCAnLS13b3Jrc3BhY2VzPWZhbHNlJ10sXG4gICAgcHJvY2Vzcy5jd2QoKVxuICApO1xuICBpZiAoIXN0ZG91dCkgcmV0dXJuIHt9O1xuXG4gIHRyeSB7XG4gICAgY29uc3QgcGFyc2VkID0gSlNPTi5wYXJzZShzdGRvdXQpIGFzIFJlY29yZDxzdHJpbmcsIHN0cmluZz4gfCBbUmVjb3JkPHN0cmluZywgc3RyaW5nPl07XG4gICAgY29uc3QgdGltZXMgPSBBcnJheS5pc0FycmF5KHBhcnNlZCkgPyBwYXJzZWRbMF0gOiBwYXJzZWQ7XG4gICAgaWYgKCF0aW1lcykgcmV0dXJuIHt9O1xuICAgIG5wbVBhY2thZ2VUaW1lc0NhY2hlLnNldChwYWNrYWdlTmFtZSwgdGltZXMpO1xuICAgIHJldHVybiB0aW1lcztcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIHt9O1xuICB9XG59XG5cbmZ1bmN0aW9uIHNob3VsZEFwcGx5UGFja2FnZUFnZUdhdGUoZGVwZW5kZW5jeTogc3RyaW5nKTogYm9vbGVhbiB7XG4gIC8vIEtlZXAgbWFuYWdlZCBmaXJzdC1wYXJ0eSBwYWNrYWdlcyBhbGlnbmVkIHdpdGggQnVuJ3MgZXhwbGljaXQgZXhlbXB0aW9ucy4gd2JmeSdzIGdlbmVyYXRlZFxuICAvLyBjb25maWd1cmF0aW9uIGNhbiByZWx5IG9uIHRoZSBjdXJyZW50IHdiIGNvbnRyYWN0LCBzbyBpbmRlcGVuZGVudGx5IHNvYWtpbmcgb3IgZG93bmdyYWRpbmcgd2JcbiAgLy8gd291bGQgcGFpciBuZXcgZ2VuZXJhdGVkIGZpbGVzIHdpdGggYW4gaW5jb21wYXRpYmxlIG9sZCBDTEkuIFRob3NlIHBhY2thZ2VzIGFyZSByZWxlYXNlZCBhbmRcbiAgLy8gZml4ZWQgYXQgdGhlaXIgc291cmNlIGluc3RlYWQ7IG9ubHkgcGFja2FnZXMgQnVuIGl0c2VsZiBnYXRlcyBtYXkgYmUgc2VsZWN0ZWQgZnJvbSBvbGRlciB0YWdzLlxuICByZXR1cm4gIWJ1bk1pbmltdW1SZWxlYXNlQWdlRXhjbHVkZXMuc29tZSgocGF0dGVybikgPT4gZG9lc1BhY2thZ2VQYXR0ZXJuTWF0Y2gocGF0dGVybiwgZGVwZW5kZW5jeSkpO1xufVxuXG5mdW5jdGlvbiBkb2VzUGFja2FnZVBhdHRlcm5NYXRjaChwYXR0ZXJuOiBzdHJpbmcsIGRlcGVuZGVuY3k6IHN0cmluZyk6IGJvb2xlYW4ge1xuICBpZiAocGF0dGVybiA9PT0gZGVwZW5kZW5jeSkgcmV0dXJuIHRydWU7XG4gIGlmICghcGF0dGVybi5pbmNsdWRlcygnKicpKSByZXR1cm4gZmFsc2U7XG5cbiAgY29uc3QgZXNjYXBlZFBhdHRlcm4gPSBwYXR0ZXJuLnJlcGxhY2VBbGwoL1suKz9eJHt9KCl8W1xcXVxcXFxdL2d1LCBTdHJpbmcucmF3YFxcJCZgKS5yZXBsYWNlQWxsKCcqJywgJy4qJyk7XG4gIHJldHVybiBuZXcgUmVnRXhwKGBeJHtlc2NhcGVkUGF0dGVybn0kYCwgJ3UnKS50ZXN0KGRlcGVuZGVuY3kpO1xufVxuXG5mdW5jdGlvbiBnZXRSYXdEZXBlbmRlbmN5VmVyc2lvbkZyb21OcG0oZGVwZW5kZW5jeTogc3RyaW5nKTogc3RyaW5nIHtcbiAgLy8gTm8gY2FjaGUgaGVyZTogdGhlIG9ubHkgY2FsbGVyIGNoYWluIGdvZXMgdGhyb3VnaCBnZXRMYXRlc3REZXBlbmRlbmN5VmVyc2lvbiwgd2hpY2ggYWxyZWFkeVxuICAvLyBtZW1vaXplcyBwZXIgZGVwZW5kZW5jeSwgc28gdGhpcyBjYW4gcnVuIGF0IG1vc3Qgb25jZSBwZXIgZGVwZW5kZW5jeS5cbiAgcmV0dXJuIHNwYXduU3luY0FuZFJldHVyblN0ZG91dCgnbnBtJywgWydzaG93JywgZGVwZW5kZW5jeSwgJ3ZlcnNpb24nLCAnLS13b3Jrc3BhY2VzPWZhbHNlJ10sIHByb2Nlc3MuY3dkKCkpIHx8ICcqJztcbn1cblxuZnVuY3Rpb24gZ2V0SW5zdGFsbERlcGVuZGVuY3lTcGVjaWZpZXIoY29uZmlnOiBQYWNrYWdlQ29uZmlnLCByb290Q29uZmlnOiBQYWNrYWdlQ29uZmlnLCBkZXBlbmRlbmN5OiBzdHJpbmcpOiBzdHJpbmcge1xuICAvLyBUeXBlU2NyaXB0IGlzIHZlcnNpb24tY2FwcGVkIGluIEJsaXR6IHJlcG9zaXRvcmllcywgc28gaXRzIGluc3RhbGwgc3BlY2lmaWVyIG11c3QgY2FycnkgdGhlXG4gIC8vIG1hbmFnZWQgdmVyc2lvbiDigJQgYSBiYXJlIGBidW4gYWRkYCB3b3VsZCBpbnN0YWxsIHRoZSBpbmNvbXBhdGlibGUgbGF0ZXN0LlxuICBpZiAoZGVwZW5kZW5jeSA9PT0gdHlwZXNjcmlwdERlcGVuZGVuY3kgJiYgaXNCbGl0elJlcG9zaXRvcnkoY29uZmlnLCByb290Q29uZmlnKSkge1xuICAgIHJldHVybiBgJHtkZXBlbmRlbmN5fUAke2dldE1hbmFnZWREZXBlbmRlbmN5VmVyc2lvbihjb25maWcsIHJvb3RDb25maWcsIGRlcGVuZGVuY3kpfWA7XG4gIH1cbiAgcmV0dXJuIGRlcGVuZGVuY3k7XG59XG5cbi8qKiBXaGV0aGVyIHRoZSByZXBvc2l0b3J5IGNvbnRhaW5zIGEgQmxpdHogYXBwICh0aGUgY3VycmVudCBwYWNrYWdlIG9yIHRoZSB3b3Jrc3BhY2Ugcm9vdCkuICovXG5mdW5jdGlvbiBpc0JsaXR6UmVwb3NpdG9yeShjb25maWc6IFBhY2thZ2VDb25maWcsIHJvb3RDb25maWc6IFBhY2thZ2VDb25maWcpOiBib29sZWFuIHtcbiAgcmV0dXJuIGNvbmZpZy5kZXBlbmRpbmcuYmxpdHogfHwgcm9vdENvbmZpZy5kZXBlbmRpbmcuYmxpdHo7XG59XG5cbmNvbnN0IHdvcmtzcGFjZVBhY2thZ2VEaXJzQ2FjaGUgPSBuZXcgTWFwPHN0cmluZywgTWFwPHN0cmluZywgc3RyaW5nPj4oKTtcblxuLyoqIE1hcCBmcm9tIGVhY2ggd29ya3NwYWNlIHBhY2thZ2UncyBuYW1lIHRvIGl0cyBkaXJlY3RvcnkgKHJlbGF0aXZlIHRvIHRoZSBtb25vcmVwbyByb290KS4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRXb3Jrc3BhY2VQYWNrYWdlRGlycyhyb290Q29uZmlnOiBQYWNrYWdlQ29uZmlnKTogTWFwPHN0cmluZywgc3RyaW5nPiB7XG4gIGNvbnN0IGNhY2hlZCA9IHdvcmtzcGFjZVBhY2thZ2VEaXJzQ2FjaGUuZ2V0KHJvb3RDb25maWcuZGlyUGF0aCk7XG4gIGlmIChjYWNoZWQpIHJldHVybiBjYWNoZWQ7XG5cbiAgY29uc3Qgd29ya3NwYWNlRGlyc0J5TmFtZSA9IG5ldyBNYXA8c3RyaW5nLCBzdHJpbmc+KCk7XG4gIGZvciAoY29uc3QgcGFja2FnZUpzb25QYXRoIG9mIGdldFdvcmtzcGFjZVBhY2thZ2VKc29uUGF0aHMocm9vdENvbmZpZykpIHtcbiAgICB0cnkge1xuICAgICAgY29uc3Qgd29ya3NwYWNlUGFja2FnZUpzb24gPSBKU09OLnBhcnNlKFxuICAgICAgICBmcy5yZWFkRmlsZVN5bmMocGF0aC5yZXNvbHZlKHJvb3RDb25maWcuZGlyUGF0aCwgcGFja2FnZUpzb25QYXRoKSwgJ3V0ZjgnKVxuICAgICAgKSBhcyBQYWNrYWdlSnNvbjtcbiAgICAgIGlmICh3b3Jrc3BhY2VQYWNrYWdlSnNvbi5uYW1lKSB7XG4gICAgICAgIHdvcmtzcGFjZURpcnNCeU5hbWUuc2V0KHdvcmtzcGFjZVBhY2thZ2VKc29uLm5hbWUsIHBhdGgucG9zaXguZGlybmFtZShwYWNrYWdlSnNvblBhdGgpKTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIGlnbm9yZSB1bnBhcnNhYmxlIHdvcmtzcGFjZSBwYWNrYWdlLmpzb25cbiAgICB9XG4gIH1cbiAgd29ya3NwYWNlUGFja2FnZURpcnNDYWNoZS5zZXQocm9vdENvbmZpZy5kaXJQYXRoLCB3b3Jrc3BhY2VEaXJzQnlOYW1lKTtcbiAgcmV0dXJuIHdvcmtzcGFjZURpcnNCeU5hbWU7XG59XG5cbmZ1bmN0aW9uIHNob3VsZFVwZGF0ZUV4aXN0aW5nTWFuYWdlZERlcGVuZGVuY3koXG4gIGNvbmZpZzogUGFja2FnZUNvbmZpZyxcbiAgcm9vdENvbmZpZzogUGFja2FnZUNvbmZpZyxcbiAgZGVwZW5kZW5jeTogc3RyaW5nLFxuICBjdXJyZW50VmVyc2lvbjogc3RyaW5nIHwgdW5kZWZpbmVkXG4pOiBib29sZWFuIHtcbiAgaWYgKCFjdXJyZW50VmVyc2lvbikgcmV0dXJuIHRydWU7XG4gIGlmIChjdXJyZW50VmVyc2lvbiA9PT0gJyonKSByZXR1cm4gdHJ1ZTtcbiAgaWYgKGlzV29ya3NwYWNlUHJvdG9jb2xSYW5nZShjdXJyZW50VmVyc2lvbikpIHJldHVybiB0cnVlO1xuICBpZiAoIW1hbmFnZWREZXBlbmRlbmN5TmFtZXMuaGFzKGRlcGVuZGVuY3kpKSByZXR1cm4gZmFsc2U7XG4gIGNvbnN0IG1hbmFnZWRWZXJzaW9uID0gZ2V0TWFuYWdlZERlcGVuZGVuY3lWZXJzaW9uKGNvbmZpZywgcm9vdENvbmZpZywgZGVwZW5kZW5jeSk7XG4gIGNvbnN0IGN1cnJlbnRWYWxpZFZlcnNpb24gPSBzZW12ZXIudmFsaWQoY3VycmVudFZlcnNpb24pO1xuICAvLyBBIFR5cGVTY3JpcHQgNyBwaW4gaW4gYSBCbGl0eiByZXBvc2l0b3J5IGlzIGxpa2V3aXNlIGluY29tcGF0aWJsZSAoYG5leHQgYnVpbGRgIGZhaWxzIG9uXG4gIC8vIHRoZSBOZXh0LmpzIDE1IHRoYXQgQmxpdHogcGlucyDigJQgc2VlIGdldE1hbmFnZWREZXBlbmRlbmN5VmVyc2lvbiksIHNvIHJld3JpdGUgaXQgdG8gdGhlXG4gIC8vIGNhcHBlZCByZWxlYXNlIGluc3RlYWQgb2YgcHJlc2VydmluZyBpdCB2aWEgdGhlIG5vLWRvd25ncmFkZSBydWxlIGJlbG93LiBUaGUgcGluIG1heSBiZSBhXG4gIC8vIFJBTkdFIChlLmcuIGBeNy4wLjBgKSwgd2hpY2ggc2VtdmVyLnZhbGlkIHJlamVjdHMg4oCUIGp1ZGdlIHRoZSBtYWpvciBmcm9tIHRoZSByYW5nZSBtaW5pbXVtLlxuICBjb25zdCBjdXJyZW50VHlwZXNjcmlwdFZlcnNpb24gPVxuICAgIGN1cnJlbnRWYWxpZFZlcnNpb24gPz8gKHNlbXZlci52YWxpZFJhbmdlKGN1cnJlbnRWZXJzaW9uKSA/IHNlbXZlci5taW5WZXJzaW9uKGN1cnJlbnRWZXJzaW9uKT8udmVyc2lvbiA6IHVuZGVmaW5lZCk7XG4gIGlmIChcbiAgICBkZXBlbmRlbmN5ID09PSB0eXBlc2NyaXB0RGVwZW5kZW5jeSAmJlxuICAgIGlzQmxpdHpSZXBvc2l0b3J5KGNvbmZpZywgcm9vdENvbmZpZykgJiZcbiAgICBjdXJyZW50VHlwZXNjcmlwdFZlcnNpb24gJiZcbiAgICBzZW12ZXIubWFqb3IoY3VycmVudFR5cGVzY3JpcHRWZXJzaW9uKSA+PSA3ICYmXG4gICAgc2VtdmVyLnZhbGlkKG1hbmFnZWRWZXJzaW9uKSAmJlxuICAgIGlzTmV3ZXJQYWNrYWdlVmVyc2lvbihjdXJyZW50VmVyc2lvbiwgbWFuYWdlZFZlcnNpb24pXG4gICkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIC8vIFRoZSBnZW5lcmF0ZWQgYnVuZmlnIGFwcGxpZXMgdGhlIG9yZ2FuaXphdGlvbiBhZ2UgZ2F0ZSBldmVuIHRvIGV4YWN0IHBpbnMuIElmIGEgbWFuYWdlZFxuICAvLyB0aGlyZC1wYXJ0eSB0b29sIGlzIG5ld2VyIHRoYW4gdGhlIG5ld2VzdCByZWxlYXNlIHRoYXQgY2xlYXJlZCB0aGF0IGdhdGUsIHByZXNlcnZpbmcgdGhlIHBpblxuICAvLyBwcm9kdWNlcyBhIHBhY2thZ2UuanNvbiB0aGF0IGEgZnJlc2ggaW5zdGFsbCB3aXRob3V0IHRoZSBvbGQgbG9ja2ZpbGUgY2Fubm90IHJlc29sdmUgKG5vdGFibHlcbiAgLy8gb3B0aW1pemVkIERvY2tlciBidWlsZHMpLiBLZWVwIHRoZSBuby1kb3duZ3JhZGUgcG9saWN5IG9ubHkgd2hlbiB0aGUgZGVwZW5kZW5jeSBpcyBleGVtcHQgZnJvbVxuICAvLyB0aGUgZ2F0ZTsgYWdlLWdhdGVkIG1hbmFnZWQgdG9vbHMgbXVzdCBjb252ZXJnZSBvbiB0aGUgdmVyc2lvbiB0aGUgZ2VuZXJhdGVkIGJ1bmZpZyBhY2NlcHRzLlxuICBpZiAoc2hvdWxkRG93bmdyYWRlQWdlR2F0ZWRNYW5hZ2VkRGVwZW5kZW5jeShkZXBlbmRlbmN5LCBjdXJyZW50VmVyc2lvbiwgbWFuYWdlZFZlcnNpb24pKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgLy8gd2JmeSBvd25zIHRoZXNlIHRvb2wgZGVwZW5kZW5jaWVzLCBidXQgYXBwbHlpbmcgd2JmeSBzaG91bGQgbm90IGRvd25ncmFkZSBhXG4gIC8vIHJlcG9zaXRvcnkgdGhhdCBhbHJlYWR5IHBpbnMgYSBuZXdlciByZXZpZXdlZCByZWxlYXNlIHdoZW4gdGhlIG9yZyBwb2xpY3kgZXhlbXB0cyBpdC5cbiAgcmV0dXJuIGlzTmV3ZXJQYWNrYWdlVmVyc2lvbihtYW5hZ2VkVmVyc2lvbiwgY3VycmVudFZlcnNpb24pO1xufVxuXG5mdW5jdGlvbiBzaG91bGREb3duZ3JhZGVBZ2VHYXRlZE1hbmFnZWREZXBlbmRlbmN5KFxuICBkZXBlbmRlbmN5OiBzdHJpbmcsXG4gIGN1cnJlbnRWZXJzaW9uOiBzdHJpbmcgfCB1bmRlZmluZWQsXG4gIG1hbmFnZWRWZXJzaW9uOiBzdHJpbmdcbik6IGN1cnJlbnRWZXJzaW9uIGlzIHN0cmluZyB7XG4gIGlmICghY3VycmVudFZlcnNpb24pIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgY29uc3QgdmFsaWRDdXJyZW50VmVyc2lvbiA9IHNlbXZlci52YWxpZChjdXJyZW50VmVyc2lvbik7XG4gIGNvbnN0IHZhbGlkTWFuYWdlZFZlcnNpb24gPSBzZW12ZXIudmFsaWQobWFuYWdlZFZlcnNpb24pO1xuICByZXR1cm4gKFxuICAgIHNob3VsZEFwcGx5UGFja2FnZUFnZUdhdGUoZGVwZW5kZW5jeSkgJiZcbiAgICB2YWxpZEN1cnJlbnRWZXJzaW9uICE9PSBudWxsICYmXG4gICAgdmFsaWRNYW5hZ2VkVmVyc2lvbiAhPT0gbnVsbCAmJlxuICAgIHNlbXZlci5ndCh2YWxpZEN1cnJlbnRWZXJzaW9uLCB2YWxpZE1hbmFnZWRWZXJzaW9uKVxuICApO1xufVxuXG4vLyBUaGUgbmV3ZXN0IFR5cGVTY3JpcHQgNiByZWxlYXNlIGF0IHRoZSB0aW1lIHRoZSBCbGl0eiBjYXAgc2hpcHBlZDsgdXNlZCBvbmx5IHdoZW4gdGhlIHJlZ2lzdHJ5XG4vLyBsb29rdXAgZm9yIHRoZSBhY3R1YWwgbmV3ZXN0IHByZS12NyByZWxlYXNlIGZhaWxzIChzZWUgZ2V0TWFuYWdlZERlcGVuZGVuY3lWZXJzaW9uKS5cbmNvbnN0IGxhc3RLbm93blByZVY3VHlwZXNjcmlwdFZlcnNpb24gPSAnNi4wLjMnO1xuXG5mdW5jdGlvbiBnZXRNYW5hZ2VkRGVwZW5kZW5jeVZlcnNpb24oY29uZmlnOiBQYWNrYWdlQ29uZmlnLCByb290Q29uZmlnOiBQYWNrYWdlQ29uZmlnLCBkZXBlbmRlbmN5OiBzdHJpbmcpOiBzdHJpbmcge1xuICBjb25zdCBsYXRlc3RWZXJzaW9uID0gZ2V0TGF0ZXN0RGVwZW5kZW5jeVZlcnNpb24oZGVwZW5kZW5jeSk7XG4gIGlmIChkZXBlbmRlbmN5ID09PSB0eXBlc2NyaXB0RGVwZW5kZW5jeSAmJiBpc0JsaXR6UmVwb3NpdG9yeShjb25maWcsIHJvb3RDb25maWcpKSB7XG4gICAgLy8gQmxpdHogcGlucyBOZXh0LmpzIDE1LCB3aG9zZSBidWlsZC10aW1lIGB2ZXJpZnlUeXBlU2NyaXB0U2V0dXBgIHJlcXVpcmVzIHRoZSBjbGFzc2ljXG4gICAgLy8gYHR5cGVzY3JpcHRgIGNvbXBpbGVyIEFQSTsgdGhlIFR5cGVTY3JpcHQgNyBgdHlwZXNjcmlwdGAgcGFja2FnZSBpcyB0aGUgdHNnbyBiaW5hcnlcbiAgICAvLyB3aXRob3V0IHRoYXQgQVBJLCBzbyBgbmV4dCBidWlsZGAgYWJvcnRzIHdpdGggXCJGYWlsZWQgdG8gaW5zdGFsbCByZXF1aXJlZCBUeXBlU2NyaXB0XG4gICAgLy8gZGVwZW5kZW5jaWVzXCIgKG9ic2VydmVkIGluIFdpbGxCb29zdGVyL3N1cnZleS1zeXN0ZW0pLiBDYXAgYHR5cGVzY3JpcHRgIGJlbG93IDcgdW50aWxcbiAgICAvLyBCbGl0eiBzdXBwb3J0cyBhIE5leHQuanMgcmVsZWFzZSB0aGF0IHVuZGVyc3RhbmRzIHRzZ28uIEEgZmFpbGVkIHJlZ2lzdHJ5IGxvb2t1cCBtdXN0XG4gICAgLy8gcmVzb2x2ZSB0byBhIGtub3duLWNvbXBhdGlibGUgcmVsZWFzZSDigJQgZmFsbGluZyBiYWNrIHRvIGxhdGVzdFZlcnNpb24gd291bGQgcmVpbnN0YWxsIHRoZVxuICAgIC8vIGluY29tcGF0aWJsZSBUeXBlU2NyaXB0IDcuXG4gICAgY29uc3QgdmFsaWRMYXRlc3RWZXJzaW9uID0gc2VtdmVyLnZhbGlkKGxhdGVzdFZlcnNpb24pO1xuICAgIGlmICh2YWxpZExhdGVzdFZlcnNpb24gJiYgc2VtdmVyLm1ham9yKHZhbGlkTGF0ZXN0VmVyc2lvbikgPCA3KSByZXR1cm4gbGF0ZXN0VmVyc2lvbjtcbiAgICAvLyBUaGUgY2FwcGVkIGxvb2t1cCBtdXN0IHJlc3BlY3QgdGhlIGFnZSBnYXRlIHRvbzogdGhpcyB2ZXJzaW9uIGlzIHdyaXR0ZW4gYXMgYW4gZXhhY3QgcGluLFxuICAgIC8vIGFuZCBCdW4gcmVmdXNlcyB0byByZXNvbHZlIG9uZSBwdWJsaXNoZWQgaW5zaWRlIHRoZSBtaW5pbXVtLXJlbGVhc2UtYWdlIHdpbmRvdy4gVGhlcmUgaXMgbm9cbiAgICAvLyB1bmdhdGVkIGZhbGxiYWNrIOKAlCB3aXRob3V0IHB1YmxpY2F0aW9uIG1ldGFkYXRhIHRoZSBhZ2Ugb2YgYSByYW5nZSByZXN1bHQgaXMgdW5rbm93biwgc28gYVxuICAgIC8vIHBhcnRpYWwgcmVnaXN0cnkgZmFpbHVyZSB3b3VsZCBvdGhlcndpc2Ugd3JpdGUgYSB2ZXJzaW9uIEJ1biB0aGVuIHJlZnVzZXMgdG8gaW5zdGFsbC5cbiAgICByZXR1cm4gZ2V0TGF0ZXN0QWdlR2F0ZWRWZXJzaW9uQmVsb3codHlwZXNjcmlwdERlcGVuZGVuY3ksICc3LjAuMCcpID8/IGxhc3RLbm93blByZVY3VHlwZXNjcmlwdFZlcnNpb247XG4gIH1cbiAgcmV0dXJuIGxhdGVzdFZlcnNpb247XG59XG5cbi8qKlxuICogVGhlIGhpZ2hlc3QgcmVsZWFzZSBvZiBgcGFja2FnZU5hbWVgIGJlbG93IGBleGNsdXNpdmVVcHBlckJvdW5kYCB0aGF0IGFscmVhZHkgY2xlYXJlZCB0aGUgYWdlXG4gKiBnYXRlLCBvciB1bmRlZmluZWQgd2hlbiB0aGUgcmVnaXN0cnkgbG9va3VwIGZhaWxzIG9yIG5vIHN1Y2ggcmVsZWFzZSBleGlzdHMgeWV0LlxuICovXG5mdW5jdGlvbiBnZXRMYXRlc3RBZ2VHYXRlZFZlcnNpb25CZWxvdyhwYWNrYWdlTmFtZTogc3RyaW5nLCBleGNsdXNpdmVVcHBlckJvdW5kOiBzdHJpbmcpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICByZXR1cm4gZ2V0QWdlR2F0ZWRWZXJzaW9uc0Rlc2NlbmRpbmcoZ2V0TnBtUGFja2FnZVRpbWVzKHBhY2thZ2VOYW1lKSkuZmluZCgodmVyc2lvbikgPT5cbiAgICBzZW12ZXIubHQodmVyc2lvbiwgZXhjbHVzaXZlVXBwZXJCb3VuZClcbiAgKTtcbn1cblxuZnVuY3Rpb24gaXNOZXdlclBhY2thZ2VWZXJzaW9uKGNhbmRpZGF0ZVZlcnNpb246IHN0cmluZywgY3VycmVudFZlcnNpb246IHN0cmluZyk6IGJvb2xlYW4ge1xuICBjb25zdCB2YWxpZExhdGVzdFZlcnNpb24gPSBzZW12ZXIudmFsaWQoY2FuZGlkYXRlVmVyc2lvbik7XG4gIGNvbnN0IHZhbGlkQ3VycmVudFZlcnNpb24gPSBzZW12ZXIudmFsaWQoY3VycmVudFZlcnNpb24pO1xuICByZXR1cm4gIXZhbGlkTGF0ZXN0VmVyc2lvbiB8fCAhdmFsaWRDdXJyZW50VmVyc2lvbiB8fCBzZW12ZXIuZ3QodmFsaWRMYXRlc3RWZXJzaW9uLCB2YWxpZEN1cnJlbnRWZXJzaW9uKTtcbn1cblxuZnVuY3Rpb24gaXNXb3Jrc3BhY2VQcm90b2NvbFJhbmdlKHZlcnNpb246IHN0cmluZyk6IGJvb2xlYW4ge1xuICByZXR1cm4gdmVyc2lvbi5zdGFydHNXaXRoKCd3b3Jrc3BhY2U6Jyk7XG59XG5cbmZ1bmN0aW9uIGZvcm1hdFJlcG9zaXRvcnlGb3JQYWNrYWdlSnNvbihcbiAgcmVwb3NpdG9yeTogUGFja2FnZUpzb25bJ3JlcG9zaXRvcnknXSxcbiAgZXhpc3RpbmdSZXBvc2l0b3J5PzogUGFja2FnZUpzb25bJ3JlcG9zaXRvcnknXVxuKTogUGFja2FnZUpzb25bJ3JlcG9zaXRvcnknXSB7XG4gIGNvbnN0IG5vcm1hbGl6ZWRSZXBvc2l0b3J5ID0gbm9ybWFsaXplUmVwb3NpdG9yeVVybEZvclBhY2thZ2VKc29uKHJlcG9zaXRvcnkpO1xuICBpZiAobm9ybWFsaXplZFJlcG9zaXRvcnkpIHtcbiAgICByZXR1cm4gYnVpbGROb3JtYWxpemVkUmVwb3NpdG9yeUZvclBhY2thZ2VKc29uKG5vcm1hbGl6ZWRSZXBvc2l0b3J5LCByZXBvc2l0b3J5LCBleGlzdGluZ1JlcG9zaXRvcnkpO1xuICB9XG5cbiAgY29uc3Qgbm9ybWFsaXplZEV4aXN0aW5nUmVwb3NpdG9yeSA9IG5vcm1hbGl6ZVJlcG9zaXRvcnlVcmxGb3JQYWNrYWdlSnNvbihleGlzdGluZ1JlcG9zaXRvcnkpO1xuICBpZiAobm9ybWFsaXplZEV4aXN0aW5nUmVwb3NpdG9yeSkge1xuICAgIHJldHVybiBidWlsZE5vcm1hbGl6ZWRSZXBvc2l0b3J5Rm9yUGFja2FnZUpzb24obm9ybWFsaXplZEV4aXN0aW5nUmVwb3NpdG9yeSwgZXhpc3RpbmdSZXBvc2l0b3J5KTtcbiAgfVxuXG4gIHJldHVybiByZXBvc2l0b3J5O1xufVxuXG5mdW5jdGlvbiBub3JtYWxpemVSZXBvc2l0b3J5VXJsRm9yUGFja2FnZUpzb24ocmVwb3NpdG9yeTogUGFja2FnZUpzb25bJ3JlcG9zaXRvcnknXSk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGlmICh0eXBlb2YgcmVwb3NpdG9yeSA9PT0gJ3N0cmluZycpIHtcbiAgICBpZiAoIXJlcG9zaXRvcnkuc3RhcnRzV2l0aCgnZ2l0aHViOicpKSByZXR1cm47XG5cbiAgICBjb25zdCBbb3duZXIsIHJlcG9dID0gZ2l0SHViVXRpbC5nZXRPcmdBbmROYW1lKHJlcG9zaXRvcnkpO1xuICAgIGlmICghb3duZXIgfHwgIXJlcG8pIHJldHVybjtcbiAgICByZXR1cm4gYGdpdCtodHRwczovL2dpdGh1Yi5jb20vJHtvd25lcn0vJHtyZXBvfS5naXRgO1xuICB9XG5cbiAgY29uc3QgcmVwb3NpdG9yeVVybCA9IHJlcG9zaXRvcnk/LnVybDtcbiAgaWYgKHR5cGVvZiByZXBvc2l0b3J5VXJsICE9PSAnc3RyaW5nJykgcmV0dXJuO1xuXG4gIGNvbnN0IG1hdGNoZWQgPSAvXig/OmdpdFxcKyk/aHR0cHM6XFwvXFwvZ2l0aHViXFwuY29tXFwvKFteL10rKVxcLyhbXi9dKz8pKD86XFwuZ2l0KT8kL3UuZXhlYyhyZXBvc2l0b3J5VXJsKTtcbiAgaWYgKCFtYXRjaGVkKSByZXR1cm47XG5cbiAgY29uc3QgWywgb3duZXIsIHJlcG9dID0gbWF0Y2hlZDtcbiAgcmV0dXJuIGBnaXQraHR0cHM6Ly9naXRodWIuY29tLyR7b3duZXJ9LyR7cmVwb30uZ2l0YDtcbn1cblxuZnVuY3Rpb24gYnVpbGROb3JtYWxpemVkUmVwb3NpdG9yeUZvclBhY2thZ2VKc29uKFxuICBub3JtYWxpemVkVXJsOiBzdHJpbmcsXG4gIHJlcG9zaXRvcnk6IFBhY2thZ2VKc29uWydyZXBvc2l0b3J5J10sXG4gIGV4aXN0aW5nUmVwb3NpdG9yeT86IFBhY2thZ2VKc29uWydyZXBvc2l0b3J5J11cbik6IFBhY2thZ2VKc29uWydyZXBvc2l0b3J5J10ge1xuICBjb25zdCByZXBvc2l0b3J5T2JqID1cbiAgICB0eXBlb2YgcmVwb3NpdG9yeSA9PT0gJ29iamVjdCdcbiAgICAgID8gcmVwb3NpdG9yeVxuICAgICAgOiB0eXBlb2YgZXhpc3RpbmdSZXBvc2l0b3J5ID09PSAnb2JqZWN0J1xuICAgICAgICA/IGV4aXN0aW5nUmVwb3NpdG9yeVxuICAgICAgICA6IHVuZGVmaW5lZDtcblxuICByZXR1cm4ge1xuICAgIC4uLnJlcG9zaXRvcnlPYmosXG4gICAgdHlwZTogJ2dpdCcsXG4gICAgdXJsOiBub3JtYWxpemVkVXJsLFxuICB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2VuZXJhdGVTY3JpcHRzKGNvbmZpZzogUGFja2FnZUNvbmZpZywgb2xkU2NyaXB0czogUGFja2FnZUpzb24uU2NyaXB0cyk6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4ge1xuICBjb25zdCBoYXNUeXBlY2hlY2sgPSBjb25maWcuZG9lc0NvbnRhaW5UeXBlU2NyaXB0IHx8IGNvbmZpZy5kb2VzQ29udGFpblR5cGVTY3JpcHRJblBhY2thZ2VzO1xuICBjb25zdCBzY3JpcHRzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge1xuICAgIC8vIE5vIGAtLWJ1bmA6IGl0cyBub2RlLT5idW4gUEFUSCBzaGltIGxlYWtzIGludG8gZXZlcnkgY2hpbGQgcHJvY2VzcyBhbmQgYnJlYWtzIHRvb2xzXG4gICAgLy8gcmVxdWlyaW5nIHJlYWwgTm9kZS5qcyAoUGxheXdyaWdodCwgd3JhbmdsZXIsIHZpbmV4dCkuXG4gICAgY2xlYW51cDogJ2J1biB3YiBsaW50IC0tZml4IC0tZm9ybWF0JyxcbiAgICBmb3JtYXQ6IGBidW4gd2IgbGludCAtLWZvcm1hdGAsXG4gICAgbGludDogYGJ1biB3YiBsaW50YCxcbiAgICAnbGludC1maXgnOiAnYnVuIHdiIGxpbnQgLS1maXgnLFxuICAgIHRlc3Q6ICdidW4gd2IgdGVzdCcsXG4gICAgdHlwZWNoZWNrOiAnYnVuIHdiIHR5cGVjaGVjaycsXG4gICAgdmVyaWZ5OiAnYnVuIHdiIHZlcmlmeScsXG4gICAgJ3ZlcmlmeS1mdWxsJzogJ2J1biB3YiB2ZXJpZnkgLS1mdWxsJyxcbiAgfTtcbiAgaWYgKGNvbmZpZy5pc1Jvb3QpIHtcbiAgICBhcHBseVRlc3RPbkNpU2NyaXB0KHNjcmlwdHMsIG9sZFNjcmlwdHMpO1xuICB9XG4gIGFwcGx5VGVzdFNjcmlwdChjb25maWcsIHNjcmlwdHMsIG9sZFNjcmlwdHMpO1xuICBrZWVwR2VuZXJhdGVkU2NyaXB0V3JhcHBlcnMoc2NyaXB0cywgb2xkU2NyaXB0cywgWyd0ZXN0JywgJ3ZlcmlmeS1mdWxsJ10pO1xuICBhcHBseURhdGFiYXNlU2NyaXB0cyhjb25maWcsIHNjcmlwdHMsIG9sZFNjcmlwdHMsIGBidW4gJHtnZXRXYkRhdGFiYXNlQ29tbWFuZChjb25maWcpfWApO1xuICBhcHBseU1pc2VUYXNrU2NyaXB0cyhjb25maWcsIHNjcmlwdHMsIG9sZFNjcmlwdHMsIFsnYnVpbGQnLCAnZGV2JywgJ3N0YXJ0JywgJ3Rlc3QnLCAndHlwZWNoZWNrJ10pO1xuICBpZiAoIWhhc1R5cGVjaGVjaykge1xuICAgIGRlbGV0ZSBzY3JpcHRzLnR5cGVjaGVjaztcbiAgfSBlbHNlIGlmIChjb25maWcuZGVwZW5kaW5nLnB5cmlnaHQpIHtcbiAgICBzY3JpcHRzLnR5cGVjaGVjayArPSAnICYmIHB5cmlnaHQnO1xuICB9XG4gIHJldHVybiBzY3JpcHRzO1xufVxuXG4vLyBDSSB3b3JrZmxvd3MgKGJvdGggdGhlIHJldXNhYmxlIHRlc3Qgd29ya2Zsb3cgYW5kIHRoZSBzZWxmLWNvbnRhaW5lZCB2YXJpYW50IGZvciBub24tV2lsbEJvb3N0ZXJcbi8vIHJlcG9zaXRvcmllcykgcHJlZmVyIGB0ZXN0L2NpYCBvdmVyIGB0ZXN0YCwgc28gc3RhbmRhcmRpemUgaXQgb24gYHdiIHRlc3Qtb24tY2lgIGF0IHRoZSByb290IOKAlFxuLy8gYHdiIHRlc3Qtb24tY2lgIGFscmVhZHkgaXRlcmF0ZXMgd29ya3NwYWNlIHBhY2thZ2VzIGl0c2VsZi5cbmZ1bmN0aW9uIGFwcGx5VGVzdE9uQ2lTY3JpcHQoc2NyaXB0czogUmVjb3JkPHN0cmluZywgc3RyaW5nPiwgb2xkU2NyaXB0czogUGFja2FnZUpzb24uU2NyaXB0cyk6IHZvaWQge1xuICBjb25zdCBvbGRTY3JpcHQgPSBvbGRTY3JpcHRzWyd0ZXN0L2NpJ107XG4gIC8vIFNvbWUgcmVwb3NpdG9yaWVzIHdyYXAgQ0kgdGVzdHMgd2l0aCBleHRyYSBzdGVwcyAoZS5nLiBzZWxlY3Rpbmcgc3BlYyBmaWxlcyBvciBydW5uaW5nIHJhd1xuICAvLyBQbGF5d3JpZ2h0KSB0aGF0IHdiIGNhbm5vdCBpbmZlciBnZW5lcmljYWxseTsgc3VjaCB3cmFwcGVycyBhcmUgcHJlc2VydmVkLlxuICBzY3JpcHRzWyd0ZXN0L2NpJ10gPSBvbGRTY3JpcHQgJiYgIWlzR2VuZXJhdGVkVGVzdE9uQ2lTY3JpcHQob2xkU2NyaXB0KSA/IG9sZFNjcmlwdCA6ICdidW4gd2IgdGVzdC1vbi1jaSc7XG59XG5cbi8qKiBXaGV0aGVyIGEgc2NyaXB0IGJvZHkgaXMgb25lIG9mIHRoZSBnZW5lcmF0ZWQgYHdiIHRlc3Qtb24tY2lgIGludm9jYXRpb25zLiAqL1xuZnVuY3Rpb24gaXNHZW5lcmF0ZWRUZXN0T25DaVNjcmlwdChzY3JpcHQ6IHN0cmluZyk6IGJvb2xlYW4ge1xuICByZXR1cm4gc2NyaXB0LnRyaW0oKSA9PT0gJ2J1biB3YiB0ZXN0LW9uLWNpJztcbn1cblxuLyoqXG4gKiBgd2IgdGVzdGAgcnVucyBKYXZhU2NyaXB0L1R5cGVTY3JpcHQgdGVzdCBydW5uZXJzIG9ubHksIHNvIHJlcGxhY2luZyB0aGUgYHRlc3RgIHNjcmlwdCBvZiBhXG4gKiBwYWNrYWdlIHdyaXR0ZW4gaW4gYW5vdGhlciBsYW5ndWFnZSAoZS5nLiBhIE1hdmVuIG9yIGFuIFJTcGVjIHBhY2thZ2UgaW4gYSBwb2x5Z2xvdCBtb25vcmVwbylcbiAqIHNpbGVudGx5IGRyb3BzIGl0cyB3aG9sZSBzdWl0ZTogdGhlIGdlbmVyYXRlZCBzY3JpcHQgdGhlbiBzdWNjZWVkcyB3aXRob3V0IHJ1bm5pbmcgYW55dGhpbmcuXG4gKiBTdWNoIGEgcGFja2FnZSBrZWVwcyBpdHMgb3duIGB0ZXN0YCBzY3JpcHQ7IEpTL1RTIHBhY2thZ2VzIGFyZSBzdGFuZGFyZGl6ZWQgYXMgdXN1YWwuXG4gKi9cbmZ1bmN0aW9uIGFwcGx5VGVzdFNjcmlwdChcbiAgY29uZmlnOiBQYWNrYWdlQ29uZmlnLFxuICBzY3JpcHRzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+LFxuICBvbGRTY3JpcHRzOiBQYWNrYWdlSnNvbi5TY3JpcHRzXG4pOiB2b2lkIHtcbiAgY29uc3Qgb2xkU2NyaXB0ID0gb2xkU2NyaXB0cy50ZXN0Py50cmltKCk7XG4gIGlmICghb2xkU2NyaXB0IHx8IGRvZXNDb250YWluSnNPclRzKGNvbmZpZykgfHwgaXNHZW5lcmF0ZWRUZXN0U2NyaXB0KG9sZFNjcmlwdCkpIHJldHVybjtcbiAgc2NyaXB0cy50ZXN0ID0gb2xkU2NyaXB0O1xufVxuXG4vKiogV2hldGhlciBhIHNjcmlwdCBib2R5IGlzIG9uZSBvZiB0aGUgS05PV04gZ2VuZXJhdGVkIGB3YiB0ZXN0YCBpbnZvY2F0aW9ucy4gKi9cbmZ1bmN0aW9uIGlzR2VuZXJhdGVkVGVzdFNjcmlwdChzY3JpcHQ6IHN0cmluZyk6IGJvb2xlYW4ge1xuICByZXR1cm4gc2NyaXB0LnRyaW0oKSA9PT0gJ2J1biB3YiB0ZXN0Jztcbn1cblxuLyoqXG4gKiBLZWVwcyBhIHNjcmlwdCB0aGF0IENIQUlOUyBleHRyYSBjb21tYW5kcyBvbnRvIHRoZSBnZW5lcmF0ZWQgb25lIChlLmcuIGEgcG9seWdsb3QgbW9ub3JlcG9cbiAqIGFwcGVuZGluZyBpdHMgTWF2ZW4gYW5kIFJTcGVjIHN1aXRlcyB0byBgd2IgdGVzdGAsIHdoaWNoIHJ1bnMgSmF2YVNjcmlwdC9UeXBlU2NyaXB0IHJ1bm5lcnNcbiAqIG9ubHkpLiBTdWNoIGEgd3JhcHBlciBzdGlsbCBydW5zIHRoZSBnZW5lcmF0ZWQgY29tbWFuZCwgc28gcmVwbGFjaW5nIGl0IHdvdWxkIHNpbGVudGx5IGRyb3AgdGhlXG4gKiByZXBvc2l0b3J5J3Mgb3duIHN0ZXBzIOKAlCB0aGUgc2FtZSByZWFzb25pbmcgYXMgYGFwcGx5VGVzdE9uQ2lTY3JpcHRgLiBBbiB1bnJlY29nbml6ZWQgY2hhaW5lZFxuICogc2NyaXB0IGlzIGtlcHQgd2hvbGVzYWxlIHJhdGhlciB0aGFuIGxvc2luZyBpdHMgcHJvamVjdC1vd25lZCBjb21tYW5kcy5cbiAqL1xuZnVuY3Rpb24ga2VlcEdlbmVyYXRlZFNjcmlwdFdyYXBwZXJzKFxuICBzY3JpcHRzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+LFxuICBvbGRTY3JpcHRzOiBQYWNrYWdlSnNvbi5TY3JpcHRzLFxuICBzY3JpcHROYW1lczogc3RyaW5nW11cbik6IHZvaWQge1xuICBmb3IgKGNvbnN0IHNjcmlwdE5hbWUgb2Ygc2NyaXB0TmFtZXMpIHtcbiAgICBjb25zdCBvbGRTY3JpcHQgPSBvbGRTY3JpcHRzW3NjcmlwdE5hbWVdPy50cmltKCk7XG4gICAgY29uc3QgZ2VuZXJhdGVkU2NyaXB0ID0gc2NyaXB0c1tzY3JpcHROYW1lXTtcbiAgICBpZiAoIW9sZFNjcmlwdCB8fCAhZ2VuZXJhdGVkU2NyaXB0IHx8IG9sZFNjcmlwdCA9PT0gZ2VuZXJhdGVkU2NyaXB0KSBjb250aW51ZTtcbiAgICBjb25zdCBoZWFkUmVnRXhwID0gbmV3IFJlZ0V4cChcbiAgICAgIGBeJHtlc2NhcGVSZWdFeHAoZ2VuZXJhdGVkU2NyaXB0KS5yZXBsYWNlQWxsKCcgJywgU3RyaW5nLnJhd2BbIFxcdF0rYCl9KD89WyBcXFxcdF0qKD86JiZ8XFxcXHxcXFxcfHw7fFxcXFxuKSlgLFxuICAgICAgJ3UnXG4gICAgKTtcbiAgICAvLyBBIG5ld2xpbmUgc2VwYXJhdGVzIHNoZWxsIGNvbW1hbmRzIGp1c3QgbGlrZSAmJiwgfHwgYW5kIDsuXG4gICAgaWYgKGhlYWRSZWdFeHAudGVzdChvbGRTY3JpcHQpKSB7XG4gICAgICAvLyBBIGZ1bmN0aW9uIHJlcGxhY2VtZW50IGtlZXBzIGAkYC1zaGFwZWQgY2hhcmFjdGVycyBpbiB0aGUgZ2VuZXJhdGVkIGNvbW1hbmQgbGl0ZXJhbC5cbiAgICAgIHNjcmlwdHNbc2NyaXB0TmFtZV0gPSBvbGRTY3JpcHQucmVwbGFjZShoZWFkUmVnRXhwLCAoKSA9PiBnZW5lcmF0ZWRTY3JpcHQpO1xuICAgIH0gZWxzZSBpZiAoLyg/OiYmfFxcfFxcfHw7fFxcbikvdS50ZXN0KG9sZFNjcmlwdCkpIHtcbiAgICAgIHNjcmlwdHNbc2NyaXB0TmFtZV0gPSBvbGRTY3JpcHQ7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGFwcGx5RGF0YWJhc2VTY3JpcHRzKFxuICBjb25maWc6IFBhY2thZ2VDb25maWcsXG4gIHNjcmlwdHM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4sXG4gIG9sZFNjcmlwdHM6IFBhY2thZ2VKc29uLlNjcmlwdHMsXG4gIHdiRGJDb21tYW5kOiBzdHJpbmdcbik6IHZvaWQge1xuICBpZiAoIWNvbmZpZy5kZXBlbmRpbmcucHJpc21hICYmICFjb25maWcuZGVwZW5kaW5nLmRyaXp6bGUpIHJldHVybjtcblxuICBhcHBseURhdGFiYXNlU2NyaXB0KHNjcmlwdHMsIG9sZFNjcmlwdHMsICdkYi1jcmVhdGUtbWlncmF0aW9uJywgYCR7d2JEYkNvbW1hbmR9IG1pZ3JhdGUtZGV2YCwgJ21pZ3JhdGUtZGV2Jyk7XG4gIGFwcGx5RGF0YWJhc2VTY3JpcHQoXG4gICAgc2NyaXB0cyxcbiAgICBvbGRTY3JpcHRzLFxuICAgICdkYi1taWdyYXRlJyxcbiAgICBgJHt3YkRiQ29tbWFuZH0gbWlncmF0ZSAtLWNoZWNrLWlkZW1wb3RlbmN5YCxcbiAgICAnbWlncmF0ZSAtLWNoZWNrLWlkZW1wb3RlbmN5J1xuICApO1xuICBhcHBseURhdGFiYXNlU2NyaXB0KHNjcmlwdHMsIG9sZFNjcmlwdHMsICdkYi12aWV3JywgYCR7d2JEYkNvbW1hbmR9IHN0dWRpb2AsICdzdHVkaW8nKTtcbn1cblxuZnVuY3Rpb24gYXBwbHlEYXRhYmFzZVNjcmlwdChcbiAgc2NyaXB0czogUmVjb3JkPHN0cmluZywgc3RyaW5nPixcbiAgb2xkU2NyaXB0czogUGFja2FnZUpzb24uU2NyaXB0cyxcbiAgbmFtZTogc3RyaW5nLFxuICBnZW5lcmF0ZWRTY3JpcHQ6IHN0cmluZyxcbiAgZ2VuZXJhdGVkQXJndW1lbnRzOiBzdHJpbmdcbik6IHZvaWQge1xuICBjb25zdCBvbGRTY3JpcHQgPSBvbGRTY3JpcHRzW25hbWVdO1xuICAvLyBTb21lIHJlcG9zaXRvcmllcyB3cmFwIG1pZ3JhdGlvbiBjb21tYW5kcyB0byBwcmVwYXJlIFNRTGl0ZSBkaXJlY3RvcmllcyxcbiAgLy8gZmFuIG91dCBvdmVyIHRlbmFudHMsIG9yIHBlcmZvcm0gY2xlYW51cCB0aGF0IHdiIGNhbm5vdCBpbmZlciBnZW5lcmljYWxseS5cbiAgY29uc3QgZ2VuZXJhdGVkQm9kaWVzID0gW2BidW4gd2IgZGIgJHtnZW5lcmF0ZWRBcmd1bWVudHN9YCwgYGJ1biB3YiBwcmlzbWEgJHtnZW5lcmF0ZWRBcmd1bWVudHN9YF07XG4gIHNjcmlwdHNbbmFtZV0gPSBvbGRTY3JpcHQgJiYgIWdlbmVyYXRlZEJvZGllcy5pbmNsdWRlcyhvbGRTY3JpcHQudHJpbSgpKSA/IG9sZFNjcmlwdCA6IGdlbmVyYXRlZFNjcmlwdDtcbn1cblxuZnVuY3Rpb24gZ2V0V2JEYXRhYmFzZUNvbW1hbmQoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogJ3diIGRiJyB8ICd3YiBwcmlzbWEnIHtcbiAgaWYgKGNvbmZpZy5kZXBlbmRpbmcucHJpc21hKSByZXR1cm4gJ3diIHByaXNtYSc7XG4gIHJldHVybiAnd2IgZGInO1xufVxuXG5mdW5jdGlvbiBpc1diUGFja2FnZShwYWNrYWdlSnNvbjogUGFja2FnZUpzb24gfCB1bmRlZmluZWQpOiBib29sZWFuIHtcbiAgcmV0dXJuIHBhY2thZ2VKc29uPy5uYW1lID09PSB3YkRlcGVuZGVuY3k7XG59XG5cbmZ1bmN0aW9uIGFwcGx5TWlzZVRhc2tTY3JpcHRzKFxuICBjb25maWc6IFBhY2thZ2VDb25maWcsXG4gIHNjcmlwdHM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4sXG4gIG9sZFNjcmlwdHM6IFBhY2thZ2VKc29uLlNjcmlwdHMsXG4gIG5hbWVzOiBzdHJpbmdbXVxuKTogdm9pZCB7XG4gIGZvciAoY29uc3QgbmFtZSBvZiBuYW1lcykge1xuICAgIGlmICghaGFzTWlzZVRhc2soY29uZmlnLCBuYW1lKSkgY29udGludWU7XG4gICAgaWYgKGRvZXNNaXNlVGFza0NhbGxQYWNrYWdlU2NyaXB0KGNvbmZpZywgbmFtZSkpIGNvbnRpbnVlO1xuICAgIC8vIFByZXNlcnZlIGEgbGVhZGluZyBgS0VZPVZBTFVFIGAgZW52IHByZWZpeCAoZS5nLiBgTUlTRV9FTlY9dGVzdGApIG9uIGFuIGV4aXN0aW5nIG1pc2UgYnJpZGdlLlxuICAgIC8vIFN1Y2ggYSBwcmVmaXggaXMgcmVxdWlyZWQgZm9yIG1pc2UgY29uZmlnIGVudmlyb25tZW50cyAobWlzZS48TUlTRV9FTlY+LnRvbWwpLCB3aGljaCBhcmVcbiAgICAvLyBzZWxlY3RlZCBmcm9tIE1JU0VfRU5WICpiZWZvcmUqIG1pc2Ugc3RhcnRzIGFuZCBjYW5ub3QgYmUgc3dpdGNoZWQgZnJvbSBpbnNpZGUgYSB0YXNrOyBkcm9wcGluZ1xuICAgIC8vIGl0IHdvdWxkIHNpbGVudGx5IHJ1biB0aGUgdGFzayBpbiB0aGUgZGVmYXVsdCBlbnZpcm9ubWVudC5cbiAgICBjb25zdCBlbnZQcmVmaXggPSBleHRyYWN0TWlzZUJyaWRnZUVudlByZWZpeChvbGRTY3JpcHRzW25hbWVdLCBuYW1lKTtcbiAgICBpZiAoZW52UHJlZml4ID09PSB1bmRlZmluZWQgJiYgb2xkU2NyaXB0c1tuYW1lXSAmJiAhKG5hbWUgaW4gc2NyaXB0cykpIGNvbnRpbnVlO1xuICAgIHNjcmlwdHNbbmFtZV0gPSBgJHtlbnZQcmVmaXggPz8gJyd9bWlzZSBydW4gJHtuYW1lfWA7XG4gIH1cbn1cblxuLyoqXG4gKiBSZXR1cm5zIHRoZSBsZWFkaW5nIGBLRVk9VkFMVUUgYCBlbnYtdmFyIHByZWZpeCBvZiBhbiBleGlzdGluZyBgbWlzZSBydW4gPG5hbWU+YCBicmlkZ2Ugc2NyaXB0XG4gKiAocG9zc2libHkgYW4gZW1wdHkgc3RyaW5nIHdoZW4gdGhlIGJyaWRnZSBoYXMgbm8gcHJlZml4KSwgb3IgYHVuZGVmaW5lZGAgd2hlbiB0aGUgc2NyaXB0IGlzIG5vdCBhXG4gKiBtaXNlIGJyaWRnZSBmb3IgdGhlIGdpdmVuIHRhc2suXG4gKi9cbmZ1bmN0aW9uIGV4dHJhY3RNaXNlQnJpZGdlRW52UHJlZml4KHNjcmlwdDogdW5rbm93biwgbmFtZTogc3RyaW5nKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgaWYgKHR5cGVvZiBzY3JpcHQgIT09ICdzdHJpbmcnKSByZXR1cm4gdW5kZWZpbmVkO1xuICAvLyBFYWNoIGFzc2lnbm1lbnQgdmFsdWUgbWF5IGJlIGRvdWJsZS1xdW90ZWQsIHNpbmdsZS1xdW90ZWQsIG9yIGFuIHVucXVvdGVkIHJ1biBvZiBub24td2hpdGVzcGFjZSxcbiAgLy8gc28gcHJlZml4ZXMgbGlrZSBgTUlTRV9FTlY9XCJhIGJcImAgKHdob3NlIHZhbHVlIGNvbnRhaW5zIHNwYWNlcykgYXJlIG1hdGNoZWQgaW5zdGVhZCBvZiBkcm9wcGVkLlxuICBjb25zdCBtYXRjaCA9IG5ldyBSZWdFeHAoU3RyaW5nLnJhd2BeKCg/Olxcdys9KD86XCJbXlwiXSpcInwnW14nXSonfFxcUyspXFxzKykqKW1pc2UgcnVuICR7ZXNjYXBlUmVnRXhwKG5hbWUpfSRgLCAndScpLmV4ZWMoXG4gICAgc2NyaXB0LnRyaW0oKVxuICApO1xuICByZXR1cm4gbWF0Y2g/LlsxXTtcbn1cblxuZnVuY3Rpb24gaGFzTWlzZVRhc2soY29uZmlnOiBQYWNrYWdlQ29uZmlnLCBuYW1lOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgcmV0dXJuIE9iamVjdC5oYXNPd24oY29uZmlnLm1pc2VUYXNrcywgbmFtZSk7XG59XG5cbmZ1bmN0aW9uIGRvZXNNaXNlVGFza0NhbGxQYWNrYWdlU2NyaXB0KGNvbmZpZzogUGFja2FnZUNvbmZpZywgbmFtZTogc3RyaW5nKTogYm9vbGVhbiB7XG4gIGNvbnN0IHRhc2sgPSBjb25maWcubWlzZVRhc2tzW25hbWVdO1xuICBpZiAoIXRhc2spIHJldHVybiBmYWxzZTtcbiAgY29uc3QgcGFja2FnZU1hbmFnZXJzID0gWydidW4nLCAneWFybicsICducG0nLCAncG5wbSddO1xuICByZXR1cm4gcGFja2FnZU1hbmFnZXJzLnNvbWUoKHBhY2thZ2VNYW5hZ2VyKSA9PlxuICAgIG5ldyBSZWdFeHAoU3RyaW5nLnJhd2BcXGIke3BhY2thZ2VNYW5hZ2VyfVxccysoPzpydW5cXHMrKT8ke2VzY2FwZVJlZ0V4cChuYW1lKX0oPyFbYS16QS1aMC05X1xcLTouXSlgLCAndScpLnRlc3QodGFzaylcbiAgKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gdXBkYXRlUHJpdmF0ZVBhY2thZ2VzKGpzb25PYmo6IFdyaXRhYmxlUGFja2FnZUpzb24pOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgcGFja2FnZU5hbWVzID0gbmV3IFNldChbLi4uT2JqZWN0LmtleXMoanNvbk9iai5kZXBlbmRlbmNpZXMpLCAuLi5PYmplY3Qua2V5cyhqc29uT2JqLmRldkRlcGVuZGVuY2llcyldKTtcbiAgY29uc3QgcHJpdmF0ZVBhY2thZ2VzOiB7XG4gICAgcGFja2FnZU5hbWU6IHN0cmluZztcbiAgICBvcmc6IHN0cmluZztcbiAgICByZXBvOiBzdHJpbmc7XG4gICAgdGFyZ2V0OiAnZGVwZW5kZW5jaWVzJyB8ICdkZXZEZXBlbmRlbmNpZXMnO1xuICB9W10gPSBbXG4gICAgeyBwYWNrYWdlTmFtZTogJ0B3aWxsYm9vc3Rlci9jb2RlLWFuYWx5emVyJywgb3JnOiAnV2lsbEJvb3N0ZXInLCByZXBvOiAnY29kZS1hbmFseXplcicsIHRhcmdldDogJ2RldkRlcGVuZGVuY2llcycgfSxcbiAgICB7IHBhY2thZ2VOYW1lOiAnQHdpbGxib29zdGVyL2p1ZGdlJywgb3JnOiAnV2lsbEJvb3N0ZXJMYWInLCByZXBvOiAnanVkZ2UnLCB0YXJnZXQ6ICdkZXBlbmRlbmNpZXMnIH0sXG4gICAgeyBwYWNrYWdlTmFtZTogJ0B3aWxsYm9vc3Rlci9sbG0tcHJveHknLCBvcmc6ICdXaWxsQm9vc3RlckxhYicsIHJlcG86ICdsbG0tcHJveHknLCB0YXJnZXQ6ICdkZXBlbmRlbmNpZXMnIH0sXG4gIF07XG5cbiAgYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgcHJpdmF0ZVBhY2thZ2VzLm1hcChhc3luYyAoeyBvcmcsIHBhY2thZ2VOYW1lLCByZXBvLCB0YXJnZXQgfSkgPT4ge1xuICAgICAgaWYgKCFwYWNrYWdlTmFtZXMuaGFzKHBhY2thZ2VOYW1lKSB8fCBpc1dvcmtzcGFjZVBhY2thZ2UoanNvbk9iaiwgcGFja2FnZU5hbWUpKSByZXR1cm47XG5cbiAgICAgIGNvbnN0IGV4aXN0aW5nU3BlY2lmaWVyID0ganNvbk9iai5kZXBlbmRlbmNpZXNbcGFja2FnZU5hbWVdID8/IGpzb25PYmouZGV2RGVwZW5kZW5jaWVzW3BhY2thZ2VOYW1lXTtcbiAgICAgIGNvbnN0IG90aGVyVGFyZ2V0ID0gdGFyZ2V0ID09PSAnZGVwZW5kZW5jaWVzJyA/ICdkZXZEZXBlbmRlbmNpZXMnIDogJ2RlcGVuZGVuY2llcyc7XG4gICAgICAvLyBUaGUgbGludCBydWxlIGRpc2FsbG93cyBgZGVsZXRlYCB3aXRoIGNvbXB1dGVkIHBhY2thZ2UgbmFtZXM7IFJlZmxlY3QgaGFzIHRoZSBzYW1lIGRlbGV0aW9uIHNlbWFudGljcyBoZXJlLlxuICAgICAgUmVmbGVjdC5kZWxldGVQcm9wZXJ0eShqc29uT2JqW290aGVyVGFyZ2V0XSwgcGFja2FnZU5hbWUpO1xuICAgICAganNvbk9ialt0YXJnZXRdW3BhY2thZ2VOYW1lXSA9IGlzUGlubmVkUHJpdmF0ZVBhY2thZ2VTcGVjaWZpZXIoZXhpc3RpbmdTcGVjaWZpZXIsIG9yZywgcmVwbylcbiAgICAgICAgPyBleGlzdGluZ1NwZWNpZmllclxuICAgICAgICA6IGF3YWl0IGdldExhdGVzdFByaXZhdGVQYWNrYWdlU3BlY2lmaWVyKG9yZywgcmVwbyk7XG4gICAgfSlcbiAgKTtcbn1cblxuLyoqXG4gKiBXaGV0aGVyIHRoZSBleGlzdGluZyBzcGVjaWZpZXIgYWxyZWFkeSBwaW5zIGEgZ2l0IHJlZiBvZiB0aGUgZXhwZWN0ZWQgcHJpdmF0ZSByZXBvc2l0b3J5LlxuICogd2JmeSBtdXN0IG5vdCBidW1wIHN1Y2ggcGluczogYSBydW4gaW50ZW5kZWQgYXMgY29uZmlndXJhdGlvbi9wYWNrYWdlLW1hbmFnZXIgbWFpbnRlbmFuY2VcbiAqIHdvdWxkIG90aGVyd2lzZSBjaGFuZ2UgdGhlIGRlcGVuZGVuY3kncyB2ZXJzaW9uIGFzIGEgc2lkZSBlZmZlY3QgKHVwZGF0aW5nIHBpbnMgaXMgUmVub3ZhdGUnc1xuICogam9iKSwgcG9zc2libHkgdG8gYSBjb21taXQgd2hvc2UgcHJlYnVpbHQgYXJ0aWZhY3RzIGFyZSBtaXNzaW5nLlxuICovXG5mdW5jdGlvbiBpc1Bpbm5lZFByaXZhdGVQYWNrYWdlU3BlY2lmaWVyKFxuICBzcGVjaWZpZXI6IHN0cmluZyB8IHVuZGVmaW5lZCxcbiAgb3JnOiBzdHJpbmcsXG4gIHJlcG86IHN0cmluZ1xuKTogc3BlY2lmaWVyIGlzIHN0cmluZyB7XG4gIGlmICghc3BlY2lmaWVyKSByZXR1cm4gZmFsc2U7XG4gIHJldHVybiBuZXcgUmVnRXhwKFN0cmluZy5yYXdgKD86XnxbOi9dKSR7b3JnfS8ke3JlcG99KD86XFwuZ2l0KT8jXFxTKyRgLCAndScpLnRlc3Qoc3BlY2lmaWVyKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gZ2V0TGF0ZXN0UHJpdmF0ZVBhY2thZ2VTcGVjaWZpZXIob3JnOiBzdHJpbmcsIHJlcG86IHN0cmluZyk6IFByb21pc2U8c3RyaW5nPiB7XG4gIGNvbnN0IGNvbW1pdEhhc2ggPSBhd2FpdCBnZXRMYXRlc3RDb21taXRIYXNoKG9yZywgcmVwbyk7XG4gIHJldHVybiBgZ2l0QGdpdGh1Yi5jb206JHtvcmd9LyR7cmVwb30uZ2l0IyR7Y29tbWl0SGFzaH1gO1xufVxuXG5mdW5jdGlvbiBpc1dvcmtzcGFjZVBhY2thZ2UoanNvbk9iajogUGFja2FnZUpzb24sIHBhY2thZ2VOYW1lOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgcmV0dXJuIChqc29uT2JqLmRldkRlcGVuZGVuY2llcz8uW3BhY2thZ2VOYW1lXSB8fCBqc29uT2JqLmRlcGVuZGVuY2llcz8uW3BhY2thZ2VOYW1lXSB8fCAnJykuaW5jbHVkZXMoJ3dvcmtzcGFjZScpO1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0ICogYXMgeWFtbCBmcm9tICdqcy15YW1sJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB7IGZzVXRpbCB9IGZyb20gJy4uL3V0aWxzL2ZzVXRpbC5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGV4dGVuc2lvbnMgfSBmcm9tICcuLi91dGlscy9leHRlbnNpb25zLmpzJztcbmltcG9ydCB7IGdldEdlbkkxOG5Uc0NvbW1hbmQgfSBmcm9tICcuLi91dGlscy9nZW5JMThuVHMuanMnO1xuaW1wb3J0IHsgZG9lc0NvbnRhaW5KYXZhLCBkb2VzQ29udGFpbkpzT3JUcyB9IGZyb20gJy4uL3V0aWxzL3BhY2thZ2VDYXBhYmlsaXRpZXMuanMnO1xuXG5pbXBvcnQgeyBnZW5lcmF0ZVNjcmlwdHMgfSBmcm9tICcuL3BhY2thZ2VKc29uLmpzJztcblxuaW50ZXJmYWNlIExlZnRob29rU2V0dGluZ3Mge1xuICBnbG9iX21hdGNoZXI6ICdkb3VibGVzdGFyJztcbiAgJ3Bvc3QtbWVyZ2UnOiB7XG4gICAgam9iczogTGVmdGhvb2tKb2JbXTtcbiAgfTtcbiAgJ3ByZS1jb21taXQnOiB7XG4gICAgam9iczogTGVmdGhvb2tKb2JbXTtcbiAgfTtcbiAgJ3ByZS1wdXNoJzoge1xuICAgIGpvYnM6IExlZnRob29rSm9iW107XG4gIH07XG59XG5cbmludGVyZmFjZSBMZWZ0aG9va0pvYiB7XG4gIG5hbWU6IHN0cmluZztcbiAgZ2xvYj86IHN0cmluZztcbiAgcnVuPzogc3RyaW5nO1xuICBzY3JpcHQ/OiBzdHJpbmc7XG4gIHJ1bm5lcj86ICdiYXNoJztcbiAgc3RhZ2VfZml4ZWQ/OiB0cnVlO1xufVxuXG5jb25zdCBiYXNlU2V0dGluZ3M6IE9taXQ8TGVmdGhvb2tTZXR0aW5ncywgJ3ByZS1jb21taXQnPiA9IHtcbiAgZ2xvYl9tYXRjaGVyOiAnZG91Ymxlc3RhcicsXG4gICdwb3N0LW1lcmdlJzoge1xuICAgIGpvYnM6IFtcbiAgICAgIHtcbiAgICAgICAgbmFtZTogJ3ByZXBhcmUnLFxuICAgICAgICBzY3JpcHQ6ICdwcmVwYXJlLnNoJyxcbiAgICAgICAgcnVubmVyOiAnYmFzaCcsXG4gICAgICB9LFxuICAgIF0sXG4gIH0sXG4gICdwcmUtcHVzaCc6IHtcbiAgICBqb2JzOiBbXG4gICAgICB7XG4gICAgICAgIG5hbWU6ICdjaGVjaycsXG4gICAgICAgIHNjcmlwdDogJ2NoZWNrLnNoJyxcbiAgICAgICAgcnVubmVyOiAnYmFzaCcsXG4gICAgICB9LFxuICAgIF0sXG4gIH0sXG59O1xuXG4vLyBMZWZ0aG9vayBleHBhbmRzIHtzdGFnZWRfZmlsZXN9IGFzIHNoZWxsLWVzY2FwZWQgYXJncywgc28gdGhlIHVucXVvdGVkIGxvb3BzIGJlbG93IGtlZXAgcGF0aHNcbi8vIHdpdGggc3BhY2VzIGludGFjdC5cbmNvbnN0IHByZUNvbW1pdFNldHRpbmdzOiBMZWZ0aG9va1NldHRpbmdzWydwcmUtY29tbWl0J10gPSB7XG4gIGpvYnM6IFtcbiAgICB7XG4gICAgICBuYW1lOiAnY2xlYW51cCcsXG4gICAgICBnbG9iOiAnJyxcbiAgICAgIHJ1bjogJycsXG4gICAgICBzdGFnZV9maXhlZDogdHJ1ZSxcbiAgICB9LFxuICAgIHtcbiAgICAgIG5hbWU6ICdjaGVjay1taWdyYXRpb25zJyxcbiAgICAgIGdsb2I6ICcqKi9taWdyYXRpb24uc3FsJyxcbiAgICAgIHJ1bjogYFxuZmFpbGVkPTBcbmZvciBmaWxlIGluIHtzdGFnZWRfZmlsZXN9OyBkb1xuICBpZiBncmVwIC1xICdXYXJuaW5nczonIFwiJGZpbGVcIjsgdGhlblxuICAgIGVjaG8gXCJNaWdyYXRpb24gU1FMIGZpbGUgKCRmaWxlKSBjb250YWlucyB3YXJuaW5ncyEgUGxlYXNlIHNvbHZlIHRoZSB3YXJuaW5ncyBhbmQgY29tbWl0IGFnYWluLlwiXG4gICAgZmFpbGVkPTFcbiAgZmlcbmRvbmVcbmV4aXQgXCIkZmFpbGVkXCJcbmAudHJpbSgpLFxuICAgIH0sXG4gICAge1xuICAgICAgLy8gYnVuIHJlY29yZHMgYW4gYWJzb2x1dGUgYHJlc29sdmVkYCBVUkwgZm9yIGFuIGFscmVhZHktbG9ja2VkIHBhY2thZ2Ugd2hlbmV2ZXIgdGhlXG4gICAgICAvLyBjb25maWd1cmVkIHJlZ2lzdHJ5IGRvZXMgbm90IHNlcnZlIHRoZSB0YXJiYWxsIGhvc3QgaW4gdGhlIHBhY2thZ2UgbWV0YWRhdGEg4oCUIHdoaWNoIGlzXG4gICAgICAvLyBleGFjdGx5IHdoYXQgdGhlIFRha3VtaSBHdWFyZCBwcm94eSBkb2VzLiBTbyBhbiBpbnN0YWxsIHJ1biB3aXRoIEd1YXJkIGFzIHRoZSBkZWZhdWx0XG4gICAgICAvLyByZWdpc3RyeSAoQ0ksIG9yIGEgZGV2ZWxvcGVyIHdobyBwdXQgaXQgaW4gfi8ubnBtcmMpIGJha2VzIG5wbS5mbGF0dC50ZWNoIFVSTHMgaW50b1xuICAgICAgLy8gYnVuLmxvY2ssIGFuZCBjb21taXR0aW5nIHRoZW0gcGlucyBhIFNIQVJFRCBsb2NrZmlsZSB0byBvbmUgZW52aXJvbm1lbnQncyBtaXJyb3I6IGV2ZXJ5XG4gICAgICAvLyBsYXRlciBpbnN0YWxsIGRvd25sb2FkcyB0aHJvdWdoIHRoZSBwcm94eSwgYW5kIGEgY29sZC1jYWNoZSBpbnN0YWxsIGZhaWxzIG91dHJpZ2h0IHdpdGhcbiAgICAgIC8vIDQwMSBmb3IgYW55b25lIHdob3NlIG5wbXJjIGNhcnJpZXMgYSByZWdpc3RyeS5ucG1qcy5vcmcgdG9rZW4sIGJlY2F1c2UgYnVuIHNlbmRzIHRoZVxuICAgICAgLy8gZGVmYXVsdCByZWdpc3RyeSdzIGNyZWRlbnRpYWxzIHRvIHdoYXRldmVyIGhvc3QgdGhlIGxvY2tmaWxlIG5hbWVzLiBHdWFyZCBjb3ZlcmFnZSBkb2VzXG4gICAgICAvLyBub3QgZGVwZW5kIG9uIHRoZXNlIFVSTHMg4oCUIHdpdGggYW4gZW1wdHkgYHJlc29sdmVkYCwgYnVuIGRlcml2ZXMgdGhlIGRvd25sb2FkIFVSTCBmcm9tXG4gICAgICAvLyB0aGUgY29uZmlndXJlZCByZWdpc3RyeSDigJQgc28gc3RyaXAgdGhlbS4gT25seSB0aGUgR3VhcmQgaG9zdCBpcyBzdHJpcHBlZDogYSBzY29wZWRcbiAgICAgIC8vIHJlZ2lzdHJ5IHN1Y2ggYXMgVmVyZGFjY2lvIGxlZ2l0aW1hdGVseSByZWNvcmRzIGl0cyBvd24gVVJMIGZvciBwcml2YXRlIHBhY2thZ2VzLlxuICAgICAgbmFtZTogJ25vcm1hbGl6ZS1idW4tbG9ja2ZpbGUnLFxuICAgICAgZ2xvYjogJ2J1bi5sb2NrJyxcbiAgICAgIHJ1bjogJ2Jhc2ggLmxlZnRob29rL25vcm1hbGl6ZS1idW4tbG9ja2ZpbGUuc2gge3N0YWdlZF9maWxlc30nLFxuICAgICAgc3RhZ2VfZml4ZWQ6IHRydWUsXG4gICAgfSxcbiAgICB7XG4gICAgICAvLyBPbmx5IHdpbGxib29zdGVyLWNvbmZpZ3MgZ2V0cyB0aGlzIGpvYjogZXZlcnkgb3RoZXIgcmVwb3NpdG9yeSdzIHJlbm92YXRlLmpzb25jIG1lcmVseVxuICAgICAgLy8gZXh0ZW5kcyB0aGUgc2hhcmVkIHByZXNldCwgYW5kIHRoZSB2YWxpZGF0b3IgZG9lcyBub3QgcmVzb2x2ZSByZW1vdGUgcHJlc2V0cywgc28gcnVubmluZyBpdFxuICAgICAgLy8gdGhlcmUgd291bGQgdmFsaWRhdGUgdHdvIGxpbmVzIGFuZCBjYXRjaCBub3RoaW5nLiBgLS1uby1nbG9iYWxgIHZhbGlkYXRlcyB0aGUgcHJlc2V0IGFzIGFcbiAgICAgIC8vIHJlcG8gY29uZmlnIGluc3RlYWQgb2YgYSBzZWxmLWhvc3RlZCBnbG9iYWwgY29uZmlnLCBhbmQgYEBsYXRlc3RgIGtlZXBzIG5wbSBmcm9tIHNpbGVudGx5XG4gICAgICAvLyBpbnN0YWxsaW5nIGFuIGFuY2llbnQgUmVub3ZhdGUgdGhhdCBjYW5ub3QgZXZlbiBwYXJzZSBKU09OQyB3aGVuIHRoZSBsb2NhbCBOb2RlIGxhZ3MgYmVoaW5kLlxuICAgICAgLy8gU3RhZ2luZyBhIGRlbGV0aW9uIG9mIHJlbm92YXRlLmpzb25jIGxlYXZlcyBubyBmaWxlIGZvciBpbnNwZWN0aW9uLCBzbyBMZWZ0aG9vayBza2lwcyB0aGlzXG4gICAgICAvLyBqb2IgaW5zdGVhZCBvZiBydW5uaW5nIHRoZSB2YWxpZGF0b3Igb24gYSBtaXNzaW5nIHBhdGgg4oCUIGRlbGliZXJhdGVseSwgYmVjYXVzZSBkZWxldGluZyB0aGVcbiAgICAgIC8vIHNoYXJlZCBwcmVzZXQgaXMgbm90IGFuIG9wZXJhdGlvbiB0aGlzIGhvb2sgbmVlZHMgdG8gZ3VhcmQuXG4gICAgICBuYW1lOiAndmFsaWRhdGUtcmVub3ZhdGUtY29uZmlnJyxcbiAgICAgIGdsb2I6ICdyZW5vdmF0ZS5qc29uYycsXG4gICAgICBydW46ICducHggLS15ZXMgLS1wYWNrYWdlIHJlbm92YXRlQGxhdGVzdCAtLSByZW5vdmF0ZS1jb25maWctdmFsaWRhdG9yIC0tc3RyaWN0IC0tbm8tZ2xvYmFsIHtzdGFnZWRfZmlsZXN9JyxcbiAgICB9LFxuICBdLFxufTtcblxuY29uc3Qgc2NyaXB0cyA9IHtcbiAgLy8gcHJlcGFyZSBjYWxscyB0aGlzIHdpdGhvdXQgYXJndW1lbnRzIGFmdGVyIEJ1biBzYXZlcyB0aGUgcm9vdCBsb2NrZmlsZTsgTGVmdGhvb2sgcGFzc2VzIGl0c1xuICAvLyBzdGFnZWQgcGF0aC4gVGhlIHVucHJlZGljdGFibGUgc2libGluZyBmaWxlIG1ha2VzIHJlcGxhY2VtZW50IGF0b21pYywgYGNwIC1wYCBwcmVzZXJ2ZXMgaXRzXG4gIC8vIG1vZGUsIGFuZCB0aGUgYW5jaG9yZWQgcGF0dGVybiBjYW5ub3QgZXJhc2UgYSBkaXJlY3QgdGFyYmFsbCBkZXBlbmRlbmN5IFVSTC5cbiAgbm9ybWFsaXplQnVuTG9ja2ZpbGU6IGBcbiMhL2Jpbi9iYXNoXG5zZXQgLWVcblxuaWYgW1sgXCIkI1wiIC1lcSAwIF1dOyB0aGVuXG4gIHNldCAtLSBidW4ubG9ja1xuZmlcblxubm9ybWFsaXplZD1cIlwiXG50cmFwICdbWyAteiBcIiRub3JtYWxpemVkXCIgXV0gfHwgcm0gLWYgXCIkbm9ybWFsaXplZFwiJyBFWElUXG5mb3IgZmlsZSBpbiBcIiRAXCI7IGRvXG4gIFtbIC1mIFwiJGZpbGVcIiBdXSB8fCBjb250aW51ZVxuICBub3JtYWxpemVkPVwiJChta3RlbXAgXCIkZmlsZS53YmZ5LW5vcm1hbGl6aW5nLlhYWFhYWFwiKVwiXG4gIGNwIC1wIFwiJGZpbGVcIiBcIiRub3JtYWxpemVkXCJcbiAgc2VkIC1FICdzIyhcIiwgKVwiaHR0cHM6Ly9ucG1cXFxcLmZsYXR0XFxcXC50ZWNoL1teXCJdKlwiI1xcXFwxXCJcIiNnJyBcIiRmaWxlXCIgPiBcIiRub3JtYWxpemVkXCJcbiAgaWYgISBjbXAgLXMgXCIkZmlsZVwiIFwiJG5vcm1hbGl6ZWRcIjsgdGhlblxuICAgIG12IFwiJG5vcm1hbGl6ZWRcIiBcIiRmaWxlXCJcbiAgICBlY2hvIFwiUmVtb3ZlZCBUYWt1bWkgR3VhcmQgcHJveHkgVVJMcyBmcm9tICRmaWxlIHNvIHRoZSBsb2NrZmlsZSBzdGF5cyByZWdpc3RyeS1hZ25vc3RpYy5cIlxuICBmaVxuICBybSAtZiBcIiRub3JtYWxpemVkXCJcbiAgbm9ybWFsaXplZD1cIlwiXG5kb25lXG5gLnRyaW0oKSxcbiAgcG9zdE1lcmdlOiBgXG4jIS9iaW4vYmFzaFxuXG5jaGFuZ2VkX2ZpbGVzPVwiJChnaXQgZGlmZi10cmVlIC1yIC0tbmFtZS1vbmx5IC0tbm8tY29tbWl0LWlkIE9SSUdfSEVBRCBIRUFEKVwiXG5cbnJ1bl9pZl9jaGFuZ2VkKCkge1xuICBpZiBlY2hvIFwiJGNoYW5nZWRfZmlsZXNcIiB8IGdyZXAgLS1xdWlldCAtRSBcIiQxXCI7IHRoZW5cbiAgICBldmFsIFwiJDJcIlxuICBmaVxufVxuYC50cmltKCksXG59O1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVMZWZ0aG9vayhjb25maWc6IFBhY2thZ2VDb25maWcsIGFsbENvbmZpZ3M6IFBhY2thZ2VDb25maWdbXSA9IFtjb25maWddKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZ2VuZXJhdGVMZWZ0aG9vaycsIGFzeW5jICgpID0+IHtcbiAgICBhd2FpdCBjb3JlKGNvbmZpZywgYWxsQ29uZmlncyk7XG4gIH0pO1xufVxuXG5hc3luYyBmdW5jdGlvbiBjb3JlKGNvbmZpZzogUGFja2FnZUNvbmZpZywgYWxsQ29uZmlnczogUGFja2FnZUNvbmZpZ1tdKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IGRpclBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICcubGVmdGhvb2snKTtcbiAgY29uc3QgeyBsaW50IH0gPSBnZW5lcmF0ZVNjcmlwdHMoY29uZmlnLCB7fSk7XG4gIGNvbnN0IHNldHRpbmdzOiBQYXJ0aWFsPExlZnRob29rU2V0dGluZ3M+ID0ge1xuICAgIC4uLmJhc2VTZXR0aW5ncyxcbiAgICAncHJlLWNvbW1pdCc6IHtcbiAgICAgIGpvYnM6IGdldFByZUNvbW1pdEpvYnMoY29uZmlnKSxcbiAgICB9LFxuICB9O1xuICBpZiAoIWxpbnQpIHtcbiAgICBkZWxldGUgc2V0dGluZ3NbJ3ByZS1wdXNoJ107XG4gIH1cbiAgYXdhaXQgUHJvbWlzZS5hbGwoW1xuICAgIGZzVXRpbC53cml0ZUZpbGVDb25maW5lZChwYXRoLmpvaW4oY29uZmlnLmRpclBhdGgsICdsZWZ0aG9vay55bWwnKSwgeWFtbC5kdW1wKHNldHRpbmdzLCB7IGxpbmVXaWR0aDogLTEgfSkpLFxuICAgIGZzLnByb21pc2VzLnJtKGRpclBhdGgsIHsgZm9yY2U6IHRydWUsIHJlY3Vyc2l2ZTogdHJ1ZSB9KSxcbiAgXSk7XG5cbiAgaWYgKGxpbnQpIHtcbiAgICBjb25zdCBwcmVQdXNoID0gZ2V0UHJlUHVzaFNjcmlwdChjb25maWcpO1xuICAgIGZzLm1rZGlyU3luYyhwYXRoLmpvaW4oZGlyUGF0aCwgJ3ByZS1wdXNoJyksIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICAgIGF3YWl0IGZzLnByb21pc2VzLndyaXRlRmlsZShwYXRoLmpvaW4oZGlyUGF0aCwgJ3ByZS1wdXNoJywgJ2NoZWNrLnNoJyksIHByZVB1c2ggKyAnXFxuJywge1xuICAgICAgbW9kZTogMG83NTUsXG4gICAgfSk7XG4gIH1cbiAgY29uc3QgcG9zdE1lcmdlQ29tbWFuZCA9IGAke3NjcmlwdHMucG9zdE1lcmdlfVxcblxcbiR7Z2VuZXJhdGVQb3N0TWVyZ2VDb21tYW5kcyhjb25maWcsIGFsbENvbmZpZ3MpLmpvaW4oJ1xcbicpfVxcbmA7XG4gIGZzLm1rZGlyU3luYyhkaXJQYXRoLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgYXdhaXQgZnMucHJvbWlzZXMud3JpdGVGaWxlKHBhdGgucmVzb2x2ZShkaXJQYXRoLCAnbm9ybWFsaXplLWJ1bi1sb2NrZmlsZS5zaCcpLCBzY3JpcHRzLm5vcm1hbGl6ZUJ1bkxvY2tmaWxlICsgJ1xcbicsIHtcbiAgICBtb2RlOiAwbzc1NSxcbiAgfSk7XG4gIGZzLm1rZGlyU3luYyhwYXRoLmpvaW4oZGlyUGF0aCwgJ3Bvc3QtbWVyZ2UnKSwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gIGF3YWl0IGZzLnByb21pc2VzLndyaXRlRmlsZShwYXRoLnJlc29sdmUoZGlyUGF0aCwgJ3Bvc3QtbWVyZ2UnLCAncHJlcGFyZS5zaCcpLCBwb3N0TWVyZ2VDb21tYW5kLCB7XG4gICAgbW9kZTogMG83NTUsXG4gIH0pO1xufVxuXG5mdW5jdGlvbiBnZXRQcmVQdXNoU2NyaXB0KGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IHN0cmluZyB7XG4gIC8vIEJ1biByZXBvcyByZWNlaXZlIHdiIGFzIHBhcnQgb2Ygd2JmeSdzIG1hbmFnZWQgdG9vbGNoYWluLCBzbyBnZW5lcmF0ZSB0aGVcbiAgLy8gZmluYWwgaG9vayBjb21tYW5kIG9uIHRoZSBmaXJzdCBydW4gaW5zdGVhZCBvZiBjaGFuZ2luZyBpdCBvbiB0aGUgc2Vjb25kLlxuICBjb25zdCBxdWlldExpbnRDb21tYW5kID0gJ2J1biB3YiBsaW50IC0tcXVpZXQnO1xuICAvLyBObyBzZXBhcmF0ZSB0eXBlY2hlY2sgc3RlcCBuZWVkZWQg4oCUIHRoZSBsaW50IGNvbW1hbmQgYWxyZWFkeSBpbmNsdWRlcyB0eXBlY2hlY2tpbmcuXG4gIGlmIChjb25maWcucmVwb3NpdG9yeT8uc3RhcnRzV2l0aCgnZ2l0aHViOldpbGxCb29zdGVyTGFiLycpKSB7XG4gICAgcmV0dXJuIGBcbiMhL2Jpbi9iYXNoXG5cbmlmIFsgJChnaXQgYnJhbmNoIC0tc2hvdy1jdXJyZW50KSA9IFwibWFpblwiIF0gJiYgWyAkKGdpdCBjb25maWcgdXNlci5lbWFpbCkgIT0gXCJleGthenV1QGdtYWlsLmNvbVwiIF07IHRoZW5cbiAgZWNobyBcIioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlwiXG4gIGVjaG8gXCIqKiogRG9uJ3QgcHVzaCBtYWluIGJyYW5jaCBkaXJlY3RseS4gVXNlIFBSISAqKipcIlxuICBlY2hvIFwiKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXCJcbiAgZXhpdCAxXG5maVxuXG4ke3F1aWV0TGludENvbW1hbmR9XG5gLnRyaW0oKTtcbiAgfVxuICByZXR1cm4gcXVpZXRMaW50Q29tbWFuZDtcbn1cblxuZnVuY3Rpb24gZ2V0UHJlQ29tbWl0Sm9icyhjb25maWc6IFBhY2thZ2VDb25maWcpOiBMZWZ0aG9va0pvYltdIHtcbiAgcmV0dXJuIHByZUNvbW1pdFNldHRpbmdzLmpvYnNcbiAgICAuZmlsdGVyKChqb2IpID0+IGpvYi5uYW1lICE9PSAndmFsaWRhdGUtcmVub3ZhdGUtY29uZmlnJyB8fCBjb25maWcuaXNXaWxsQm9vc3RlckNvbmZpZ3MpXG4gICAgLm1hcCgoam9iKSA9PlxuICAgICAgam9iLm5hbWUgPT09ICdjbGVhbnVwJ1xuICAgICAgICA/IHtcbiAgICAgICAgICAgIC4uLmpvYixcbiAgICAgICAgICAgIGdsb2I6IGdldENsZWFudXBHbG9icyhjb25maWcpLFxuICAgICAgICAgICAgcnVuOiBnZXRDbGVhbnVwQ29tbWFuZChjb25maWcpLFxuICAgICAgICAgIH1cbiAgICAgICAgOiBqb2JcbiAgICApO1xufVxuXG5mdW5jdGlvbiBnZXRDbGVhbnVwR2xvYnMoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogc3RyaW5nIHtcbiAgLy8gTGV0IGB3YiBsaW50IC0tZm9ybWF0YCBkZWNpZGUgd2hldGhlciBQcmV0dGllciBpcyBhdmFpbGFibGU7IHRoZSBob29rXG4gIC8vIHN0aWxsIG5lZWRzIHRvIHRyaWdnZXIgd2hlbiBhZGRpbmcgdGhlIGZpcnN0IHByZXR0aWVyLW9ubHkgZmlsZS5cbiAgY29uc3Qgc3VwcG9ydGVkRXh0ZW5zaW9ucyA9IFsuLi5leHRlbnNpb25zLnByZXR0aWVyT25seV07XG4gIGlmIChkb2VzQ29udGFpbkpzT3JUcyhjb25maWcpKSB7XG4gICAgc3VwcG9ydGVkRXh0ZW5zaW9ucy5wdXNoKC4uLmV4dGVuc2lvbnMub3hmbXQsIC4uLmV4dGVuc2lvbnMub3hsaW50KTtcbiAgfVxuICBpZiAoY29uZmlnLmRvZXNDb250YWluUG9ldHJ5TG9jayB8fCBjb25maWcuZG9lc0NvbnRhaW5VdkxvY2spIHtcbiAgICBzdXBwb3J0ZWRFeHRlbnNpb25zLnB1c2goJ3B5Jyk7XG4gIH1cbiAgaWYgKGNvbmZpZy5kb2VzQ29udGFpblB1YnNwZWNZYW1sKSB7XG4gICAgc3VwcG9ydGVkRXh0ZW5zaW9ucy5wdXNoKCdkYXJ0Jyk7XG4gIH1cbiAgY29uc3QgZmlsdGVyZWRFeHRlbnNpb25zID0gWy4uLm5ldyBTZXQoc3VwcG9ydGVkRXh0ZW5zaW9ucyldLnRvU29ydGVkKCk7XG4gIHJldHVybiBgKiovKi57JHtmaWx0ZXJlZEV4dGVuc2lvbnMuam9pbignLCcpfX1gO1xufVxuXG5mdW5jdGlvbiBnZXRDbGVhbnVwQ29tbWFuZChjb25maWc6IFBhY2thZ2VDb25maWcpOiBzdHJpbmcge1xuICBpZiAoaGFzTG9jYWxXYldvcmtzcGFjZShjb25maWcpKSB7XG4gICAgcmV0dXJuIFN0cmluZy5yYXdgXG5idW4gcnVuIC0tY3dkIHBhY2thZ2VzL3diIHN0YXJ0IC0td29ya2luZy1kaXIgXCIkKGdpdCByZXYtcGFyc2UgLS1zaG93LXRvcGxldmVsKVwiIGxpbnQgLS1maXggLS1mb3JtYXQgLS0ge3N0YWdlZF9maWxlc31cbmAudHJpbSgpO1xuICB9XG4gIC8vIFB5dGhvbi1vbmx5IEJ1biByZXBvcyBpbnN0YWxsIHdiIGZvciBzaGFyZWQgc2NyaXB0cyBidXQgbm90IE94bGludCwgc29cbiAgLy8gc3RhZ2VkLWZpbGUgaG9va3MgbXVzdCB1c2UgdGhlIGxhbmd1YWdlLXNwZWNpZmljIGZvcm1hdHRlciBwYXRoIGJlbG93LlxuICBjb25zdCBjYW5Vc2VXYkZvclN0YWdlZEZpbGVzID0gZG9lc0NvbnRhaW5Kc09yVHMoY29uZmlnKSB8fCBkb2VzQ29udGFpbkphdmEoY29uZmlnKTtcbiAgaWYgKGNhblVzZVdiRm9yU3RhZ2VkRmlsZXMpIHtcbiAgICByZXR1cm4gYFxuYnVuIHdiIGxpbnQgLS1maXggLS1mb3JtYXQgLS0ge3N0YWdlZF9maWxlc31cbmAudHJpbSgpO1xuICB9XG5cbiAgcmV0dXJuIFN0cmluZy5yYXdgXG5wYWNrYWdlX2pzb25fZmlsZXM9XCIkKHByaW50ZiAnJXNcXG4nIHtzdGFnZWRfZmlsZXN9IHwgZ3JlcCAtRSAnKF58LylwYWNrYWdlXFwuanNvbiQnIHx8IHRydWUpXCJcbiR7aGFzUHl0aG9uUGFja2FnZU1hbmFnZXIoY29uZmlnKSA/IFN0cmluZy5yYXdgcHl0aG9uX2ZpbGVzPVwiJChwcmludGYgJyVzXFxuJyB7c3RhZ2VkX2ZpbGVzfSB8IGdyZXAgLUUgJ1xcLnB5JCcgfHwgdHJ1ZSlcImAgOiAnJ31cbiR7Y29uZmlnLmRvZXNDb250YWluUHVic3BlY1lhbWwgPyBTdHJpbmcucmF3YGRhcnRfZmlsZXM9XCIkKHByaW50ZiAnJXNcXG4nIHtzdGFnZWRfZmlsZXN9IHwgZ3JlcCAtRSAnXFwuZGFydCQnIHwgZ3JlcCAtdiAnZ2VuZXJhdGVkJyB8IGdyZXAgLXYgJ1xcLmZyZWV6ZWRcXC5kYXJ0JCcgfCBncmVwIC12ICdcXC5nXFwuZGFydCQnIHx8IHRydWUpXCJgIDogJyd9XG5cbmlmIFsgLW4gXCIkcGFja2FnZV9qc29uX2ZpbGVzXCIgXTsgdGhlblxuICBidW4gc29ydC1wYWNrYWdlLWpzb24gJHBhY2thZ2VfanNvbl9maWxlc1xuZmlcbiR7XG4gIGhhc1B5dGhvblBhY2thZ2VNYW5hZ2VyKGNvbmZpZylcbiAgICA/IGBpZiBbIC1uIFwiJHB5dGhvbl9maWxlc1wiIF07IHRoZW5cbiAgJHtnZXRQeXRob25SdW5uZXIoY29uZmlnKX0gaXNvcnQgLS1wcm9maWxlIGJsYWNrIC0tZmlsdGVyLWZpbGVzICRweXRob25fZmlsZXNcbiAgJHtnZXRQeXRob25SdW5uZXIoY29uZmlnKX0gYmxhY2sgJHB5dGhvbl9maWxlc1xuICAke2dldFB5dGhvblJ1bm5lcihjb25maWcpfSBmbGFrZTggJHB5dGhvbl9maWxlc1xuZmlgXG4gICAgOiAnJ1xufVxuJHtcbiAgY29uZmlnLmRvZXNDb250YWluUHVic3BlY1lhbWxcbiAgICA/IGBpZiBbIC1uIFwiJGRhcnRfZmlsZXNcIiBdOyB0aGVuXG4gIGRhcnQgZm9ybWF0ICRkYXJ0X2ZpbGVzXG5maWBcbiAgICA6ICcnXG59XG5gLnRyaW0oKTtcbn1cblxuZnVuY3Rpb24gaGFzTG9jYWxXYldvcmtzcGFjZShjb25maWc6IFBhY2thZ2VDb25maWcpOiBib29sZWFuIHtcbiAgaWYgKCFjb25maWcuaXNSb290KSByZXR1cm4gZmFsc2U7XG5cbiAgY29uc3QgbG9jYWxXYlBhY2thZ2VKc29uUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJ3BhY2thZ2VzJywgJ3diJywgJ3BhY2thZ2UuanNvbicpO1xuICBpZiAoIWZzLmV4aXN0c1N5bmMobG9jYWxXYlBhY2thZ2VKc29uUGF0aCkpIHJldHVybiBmYWxzZTtcblxuICB0cnkge1xuICAgIGNvbnN0IHBhY2thZ2VKc29uID0gSlNPTi5wYXJzZShmcy5yZWFkRmlsZVN5bmMobG9jYWxXYlBhY2thZ2VKc29uUGF0aCwgJ3V0ZjgnKSkgYXMgeyBuYW1lPzogc3RyaW5nIH07XG4gICAgcmV0dXJuIHBhY2thZ2VKc29uLm5hbWUgPT09ICdAd2lsbGJvb3N0ZXIvd2InO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn1cblxuZnVuY3Rpb24gZ2VuZXJhdGVQb3N0TWVyZ2VDb21tYW5kcyhjb25maWc6IFBhY2thZ2VDb25maWcsIGFsbENvbmZpZ3M6IFBhY2thZ2VDb25maWdbXSk6IHN0cmluZ1tdIHtcbiAgY29uc3QgcG9zdE1lcmdlQ29tbWFuZHM6IHN0cmluZ1tdID0gW107XG4gIGNvbnN0IHRvb2xzQ2hhbmdlZFBhdHRlcm4gPSBTdHJpbmcucmF3YChtaXNlXFwudG9tbHxcXC5taXNlXFwudG9tbClgO1xuICBwb3N0TWVyZ2VDb21tYW5kcy5wdXNoKFN0cmluZy5yYXdgcnVuX2lmX2NoYW5nZWQgXCIke3Rvb2xzQ2hhbmdlZFBhdHRlcm59XCIgXCJtaXNlIGluc3RhbGxcImApO1xuICBjb25zdCBpbnN0YWxsQ29tbWFuZCA9ICdidW4gaW5zdGFsbCc7XG4gIC8vIERvIE5PVCBhZGQgYC52aW5leHRgIGhlcmU6IGl0IGhvbGRzIG9ubHkgdmluZXh0J3MgY29udGVudC1oYXNoZWQgZm9udCBjYWNoZSBhbmQgdGhlIGRldlxuICAvLyBzZXJ2ZXIncyBsb2NrIGZpbGUgKGRlbGV0aW5nIHRoZSBsb2NrIGRpc2FibGVzIHRoZSBkdXBsaWNhdGUtZGV2LXNlcnZlciBndWFyZCBmb3IgYSBydW5uaW5nXG4gIC8vIHNlcnZlcikuIHZpbmV4dCdzIGJ1aWxkIG91dHB1dCBnb2VzIHRvIGBkaXN0L2AsIGFuZCBWaXRlJ3MgZGVwZW5kZW5jeSBjYWNoZSBpcyBoYW5kbGVkIGJ5XG4gIC8vIHRoZSBzZXBhcmF0ZSBpbnN0YWxsLWxheW91dCBob29rIGJlbG93LlxuICAvLyBTY2FuIGV2ZXJ5IHdvcmtzcGFjZSBjb25maWcgKG5vdCBqdXN0IHRoZSByb290KTogaW4gYSBtb25vcmVwbyB0aGUgYXBwIHVzdWFsbHkgbGl2ZXMgaW5cbiAgLy8gcGFja2FnZXMvPGFwcD4gb3IgYXBwcy88YXBwPiwgYW5kIHRoZSBjYWNoZSBkaXJlY3RvcmllcyBhcmUgd29ya3NwYWNlLXJlbGF0aXZlLlxuICBjb25zdCBuZXh0Q2FjaGVEaXJQYXRocyA9IGNvbGxlY3RXb3Jrc3BhY2VSZWxhdGl2ZURpclBhdGhzKFxuICAgIGNvbmZpZyxcbiAgICBhbGxDb25maWdzLFxuICAgICh3b3Jrc3BhY2VDb25maWcpID0+IHdvcmtzcGFjZUNvbmZpZy5kZXBlbmRpbmcuYmxpdHogfHwgd29ya3NwYWNlQ29uZmlnLmRlcGVuZGluZy5uZXh0LFxuICAgICcubmV4dCdcbiAgKTtcbiAgY29uc3Qgcm1OZXh0RGlyZWN0b3JpZXMgPVxuICAgIG5leHRDYWNoZURpclBhdGhzLmxlbmd0aCA+IDAgPyBgICYmIHJtIC1SZiAtLSAke25leHRDYWNoZURpclBhdGhzLm1hcChxdW90ZUZvckV2YWx1YXRlZFNoZWxsKS5qb2luKCcgJyl9YCA6ICcnO1xuICAvLyBCdW4gZG9lcyBub3QgcmVsaW5rIGFuIGV4aXN0aW5nIGlzb2xhdGVkIHRyZWUgd2hlbiBnbG9iYWxTdG9yZS9saW5rZXIgc2V0dGluZ3MgY2hhbmdlLiBJbnNwZWN0XG4gIC8vIHRob3NlIGtleXMgcmF0aGVyIHRoYW4gZXZlcnkgYnVuZmlnIGNoYW5nZTogbWluaW11bVJlbGVhc2VBZ2UgdXBkYXRlcyBtdXN0IG5vdCBkZXN0cm95IGFcbiAgLy8gY29udHJpYnV0b3IncyB3b3JraW5nIGluc3RhbGwgYmVmb3JlIGEgcG90ZW50aWFsbHkgbmV0d29yay1kZXBlbmRlbnQgcmVwbGFjZW1lbnQgc3VjY2VlZHMuXG4gIGNvbnN0IG5vZGVNb2R1bGVzRGlyUGF0aHMgPSBjb2xsZWN0V29ya3NwYWNlUmVsYXRpdmVEaXJQYXRocyhjb25maWcsIGFsbENvbmZpZ3MsICgpID0+IHRydWUsICdub2RlX21vZHVsZXMnKTtcbiAgcG9zdE1lcmdlQ29tbWFuZHMucHVzaChcbiAgICBTdHJpbmcucmF3YGlmIGdpdCBkaWZmIC0tbm8tY29sb3IgLVUwIE9SSUdfSEVBRCBIRUFEIC0tICcqYnVuZmlnLnRvbWwnIHwgZ3JlcCAtLXF1aWV0IC1FICdeWystXSAqKGdsb2JhbFN0b3JlfGxpbmtlcnxwdWJsaWNIb2lzdFBhdHRlcm4pJzsgdGhlbiBybSAtUmYgLS0gJHtub2RlTW9kdWxlc0RpclBhdGhzLm1hcChxdW90ZUZvclNoZWxsKS5qb2luKCcgJyl9OyBmaWBcbiAgKTtcbiAgLy8gYnVuLmxvY2stb25seSBtZXJnZXMgKFJlbm92YXRlIGxvY2tmaWxlIG1haW50ZW5hbmNlKSwgYnVuZmlnLnRvbWwgLyAubnBtcmMgY2hhbmdlcyAobGlua2VyLFxuICAvLyByZWdpc3RyeSwgaG9pc3RpbmcpLCBhbmQgcGF0Y2ggZWRpdHMgYWxsIGNoYW5nZSB0aGUgaW5zdGFsbGVkIHRyZWUgd2l0aG91dCB0b3VjaGluZyBwYWNrYWdlLmpzb24uXG4gIHBvc3RNZXJnZUNvbW1hbmRzLnB1c2goXG4gICAgU3RyaW5nLnJhd2BydW5faWZfY2hhbmdlZCBcIihwYWNrYWdlXFwuanNvbnxidW5cXC5sb2NrfGJ1bmZpZ1xcLnRvbWx8XFwubnBtcmN8cGF0Y2hlcy8pXCIgXCIke2luc3RhbGxDb21tYW5kfSR7cm1OZXh0RGlyZWN0b3JpZXN9XCJgXG4gICk7XG4gIC8vIFZpdGUncyBkZXBlbmRlbmN5IGNhY2hlIGluIG5vZGVfbW9kdWxlcy8udml0ZSBzZWxmLWludmFsaWRhdGVzIG9uIGxvY2tmaWxlIC8gcGF0Y2hlcyAvXG4gIC8vIGNvbmZpZyAvIE5PREVfRU5WIGNoYW5nZXMgKHNlZSBWaXRlJ3MgZGVwIHByZS1idW5kbGluZyBkb2NzKSwgc28gdGhlIHJlc2lkdWFsIHN0YWxlIGNhc2UgaXNcbiAgLy8gaW5zdGFsbC1sYXlvdXQgY2hhbmdlcyAoYnVuZmlnLnRvbWwgbGlua2VyLCAubnBtcmMpOiB0aGV5IGNoYW5nZSB0aGUgaW5zdGFsbGVkIHRyZWUgd2l0aG91dFxuICAvLyB0b3VjaGluZyB0aGUgbG9ja2ZpbGUsIGFuZCB0aGV5IGFyZSBhYnNlbnQgZnJvbSBWaXRlJ3MgY2FjaGUga2V5LlxuICBjb25zdCBybVZpdGVDYWNoZURpcmVjdG9yaWVzID0gY29sbGVjdFdvcmtzcGFjZVJlbGF0aXZlRGlyUGF0aHMoXG4gICAgY29uZmlnLFxuICAgIGFsbENvbmZpZ3MsXG4gICAgKHdvcmtzcGFjZUNvbmZpZykgPT4gd29ya3NwYWNlQ29uZmlnLmRlcGVuZGluZy52aW5leHQgfHwgd29ya3NwYWNlQ29uZmlnLmRlcGVuZGluZy52aXRlLFxuICAgICdub2RlX21vZHVsZXMvLnZpdGUnXG4gICk7XG4gIGlmIChybVZpdGVDYWNoZURpcmVjdG9yaWVzLmxlbmd0aCA+IDApIHtcbiAgICBwb3N0TWVyZ2VDb21tYW5kcy5wdXNoKFxuICAgICAgU3RyaW5nLnJhd2BydW5faWZfY2hhbmdlZCBcIihidW5maWdcXC50b21sfFxcLm5wbXJjKVwiIFwicm0gLVJmIC0tICR7cm1WaXRlQ2FjaGVEaXJlY3Rvcmllcy5tYXAocXVvdGVGb3JFdmFsdWF0ZWRTaGVsbCkuam9pbignICcpfVwiYFxuICAgICk7XG4gIH1cbiAgaWYgKGNvbmZpZy5kb2VzQ29udGFpblBvZXRyeUxvY2spIHtcbiAgICBwb3N0TWVyZ2VDb21tYW5kcy5wdXNoKFN0cmluZy5yYXdgcnVuX2lmX2NoYW5nZWQgXCJwb2V0cnlcXC5sb2NrXCIgXCJwb2V0cnkgaW5zdGFsbFwiYCk7XG4gIH1cbiAgaWYgKGNvbmZpZy5kb2VzQ29udGFpblV2TG9jaykge1xuICAgIHBvc3RNZXJnZUNvbW1hbmRzLnB1c2goU3RyaW5nLnJhd2BydW5faWZfY2hhbmdlZCBcInV2XFwubG9ja1wiIFwidXYgc3luYyAtLWZyb3plblwiYCk7XG4gIH1cbiAgLy8gQmxpdHogcmVwb3NpdG9yaWVzIGRlbGliZXJhdGVseSBnZXQgdGhlIHNhbWUgd2ItZHJpdmVuIHByaXNtYSBjb21tYW5kcyBhcyBldmVyeW9uZSBlbHNlOlxuICAvLyB0aGUgYmxpdHogQ0xJJ3MgY29kZWdlbiBwYXRjaGVzIHRoZSBpbnN0YWxsZWQgbmV4dCBwYWNrYWdlIGluIHBsYWNlLCB3aGljaCBtdXN0IG5ldmVyIHJ1blxuICAvLyB1bmRlciBCdW4ncyBzaGFyZWQgZ2xvYmFsIHN0b3JlLiBZYXJuLWVyYSBCbGl0eiByZXBvcyBnZXQgdGhlaXIgcm91dGUgbWFuaWZlc3QgZnJvbVxuICAvLyBgd2IgZ2VuLWNvZGVgJ3MgYGJsaXR6IGNvZGVnZW5gIHN0ZXAsIGFuZCBjdXJyZW50IHdiIHJvdXRlcyBvbmx5IGB3YiBwcmlzbWEgc2VlZGAgdGhyb3VnaFxuICAvLyB0aGUgYmxpdHogQ0xJLCBvbmx5IGZvciBub24tQnVuIHJlcG9zIChzZWUgcGFja2FnZXMvd2Ivc3JjL3NjcmlwdHMvcHJpc21hU2NyaXB0cy50cyk7IHRoZVxuICAvLyBwb3N0LW1lcmdlIGhvb2tzIHN0YXkgd2ItZHJpdmVuIGJlY2F1c2UgYHByaXNtYSBkZXBsb3lgL2BnZW5lcmF0ZWAgbmVlZCBubyBibGl0eiBsb2FkZXIuXG4gIGlmIChjb25maWcuZGVwZW5kaW5nLnByaXNtYSkge1xuICAgIHBvc3RNZXJnZUNvbW1hbmRzLnB1c2goXG4gICAgICBTdHJpbmcucmF3YHJ1bl9pZl9jaGFuZ2VkIFwiLipcXC5wcmlzbWFcIiBcImJ1biB3YiBwcmlzbWEgZGVwbG95XCJgLFxuICAgICAgU3RyaW5nLnJhd2BydW5faWZfY2hhbmdlZCBcIi4qXFwucHJpc21hXCIgXCJidW4gd2IgcHJpc21hIGdlbmVyYXRlXCJgXG4gICAgKTtcbiAgfVxuICBjb25zdCBnZW5JMThuVHNDb21tYW5kID0gZ2V0R2VuSTE4blRzQ29tbWFuZChjb25maWcsIGNvbmZpZy5wYWNrYWdlSnNvbj8uc2NyaXB0cyk7XG4gIGlmIChnZW5JMThuVHNDb21tYW5kKSB7XG4gICAgLy8gZ2VuLWkxOG4tdHMgb3V0cHV0cyBhcmUgY29tbW9ubHkgaWdub3JlZCwgc28gcG9zdC1tZXJnZSByZWdlbmVyYXRlcyB0aGVtIGFmdGVyIHB1bGxlZCByZXNvdXJjZSBjaGFuZ2VzLlxuICAgIHBvc3RNZXJnZUNvbW1hbmRzLnB1c2goU3RyaW5nLnJhd2BydW5faWZfY2hhbmdlZCBcIihefC8paTE4bi8uKlxcLmpzb24kXCIgXCIke2dlbkkxOG5Uc0NvbW1hbmR9XCJgKTtcbiAgfVxuICByZXR1cm4gcG9zdE1lcmdlQ29tbWFuZHM7XG59XG5cbi8vIFRoZSBnZW5lcmF0ZWQgY29tbWFuZCBwYXNzZXMgdGhyb3VnaCBUV08gc2hlbGwgcGFyc2luZyBzdGFnZXM6IHRoZSBwcmVwYXJlLnNoIGxpbmUgcGFyc2VzIGl0IGFzXG4vLyBhIGRvdWJsZS1xdW90ZWQgYXJndW1lbnQgKHByb2Nlc3NpbmcgXFwsIGAsICQgYW5kIFwiIGltbWVkaWF0ZWx5KSwgYW5kIHJ1bl9pZl9jaGFuZ2VkIHRoZW4gZXZhbCdzXG4vLyBpdCAod29yZC1zcGxpdHRpbmcgYW5kIGdsb2JiaW5nKS4gQW4gdW5xdW90ZWQgcGF0aCBjb250YWluaW5nIHNwYWNlcyAoZS5nLiBgYXBwcy9teSBhcHAvLm5leHRgKVxuLy8gd291bGQgd29yZC1zcGxpdCBpbnRvIHVucmVsYXRlZCBybSB0YXJnZXRzLCBhbmQgYCRgL2JhY2t0aWNrIHdvdWxkIGV4cGFuZCBhdCB0aGUgZmlyc3Qgc3RhZ2UuXG4vLyBTbzogc2luZ2xlLXF1b3RlIGZvciB0aGUgZXZhbCBzdGFnZSwgdGhlbiBiYWNrc2xhc2gtZXNjYXBlIHRoZSBkb3VibGUtcXVvdGUtY29udGV4dCBzcGVjaWFscy5cbmZ1bmN0aW9uIHF1b3RlRm9yRXZhbHVhdGVkU2hlbGwoZmlsZVBhdGg6IHN0cmluZyk6IHN0cmluZyB7XG4gIGNvbnN0IGV2YWxRdW90ZWQgPSBxdW90ZUZvclNoZWxsKGZpbGVQYXRoKTtcbiAgcmV0dXJuIGV2YWxRdW90ZWQucmVwbGFjZUFsbCgvW1xcXFxgJFwiXS9ndSwgU3RyaW5nLnJhd2BcXCQmYCk7XG59XG5cbmZ1bmN0aW9uIHF1b3RlRm9yU2hlbGwoZmlsZVBhdGg6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiBgJyR7ZmlsZVBhdGgucmVwbGFjZUFsbChcIidcIiwgU3RyaW5nLnJhd2AnXFwnJ2ApfSdgO1xufVxuXG4vKipcbiAqIFRoZSB3b3Jrc3BhY2UtcmVsYXRpdmUgZGlyZWN0b3JpZXMgKHJvb3QgZmlyc3QsIGRlZHVwbGljYXRlZCwgYDxzdWJEaXJOYW1lPmAgYXBwZW5kZWQpIG9mIGV2ZXJ5XG4gKiB3b3Jrc3BhY2Ugd2hvc2UgY29uZmlnIG1hdGNoZXMgdGhlIHByZWRpY2F0ZS4gVGhlIGhvb2sgc2NyaXB0IHJ1bnMgYXQgdGhlIHJlcG9zaXRvcnkgcm9vdCwgc29cbiAqIHBhdGhzIGFyZSByZWxhdGl2ZSB0byB0aGUgcm9vdCBjb25maWcncyBkaXJlY3RvcnkuXG4gKi9cbmZ1bmN0aW9uIGNvbGxlY3RXb3Jrc3BhY2VSZWxhdGl2ZURpclBhdGhzKFxuICByb290Q29uZmlnOiBQYWNrYWdlQ29uZmlnLFxuICBhbGxDb25maWdzOiBQYWNrYWdlQ29uZmlnW10sXG4gIHByZWRpY2F0ZTogKGNvbmZpZzogUGFja2FnZUNvbmZpZykgPT4gYm9vbGVhbixcbiAgc3ViRGlyTmFtZTogc3RyaW5nXG4pOiBzdHJpbmdbXSB7XG4gIHJldHVybiBbXG4gICAgLi4ubmV3IFNldChcbiAgICAgIGFsbENvbmZpZ3NcbiAgICAgICAgLmZpbHRlcigoY29uZmlnKSA9PiBwcmVkaWNhdGUoY29uZmlnKSlcbiAgICAgICAgLm1hcCgoY29uZmlnKSA9PiB7XG4gICAgICAgICAgY29uc3QgcmVsYXRpdmVEaXJQYXRoID0gcGF0aC5yZWxhdGl2ZShyb290Q29uZmlnLmRpclBhdGgsIGNvbmZpZy5kaXJQYXRoKS5yZXBsYWNlQWxsKCdcXFxcJywgJy8nKTtcbiAgICAgICAgICByZXR1cm4gcmVsYXRpdmVEaXJQYXRoID8gcGF0aC5wb3NpeC5qb2luKHJlbGF0aXZlRGlyUGF0aCwgc3ViRGlyTmFtZSkgOiBzdWJEaXJOYW1lO1xuICAgICAgICB9KVxuICAgICksXG4gIF0udG9Tb3J0ZWQoKTtcbn1cblxuZnVuY3Rpb24gaGFzUHl0aG9uUGFja2FnZU1hbmFnZXIoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogYm9vbGVhbiB7XG4gIHJldHVybiBjb25maWcuZG9lc0NvbnRhaW5Qb2V0cnlMb2NrIHx8IGNvbmZpZy5kb2VzQ29udGFpblV2TG9jaztcbn1cblxuZnVuY3Rpb24gZ2V0UHl0aG9uUnVubmVyKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6ICdwb2V0cnkgcnVuJyB8ICd1diBydW4nIHtcbiAgcmV0dXJuIGNvbmZpZy5kb2VzQ29udGFpblV2TG9jayA/ICd1diBydW4nIDogJ3BvZXRyeSBydW4nO1xufVxuIiwiZXhwb3J0IGZ1bmN0aW9uIG5vcm1hbGl6ZUNvbmZpZ0NvbnRlbnQoY29udGVudDogc3RyaW5nIHwgdW5kZWZpbmVkKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgcmV0dXJuIGNvbnRlbnQ/LnRyaW0oKTtcbn1cbiIsImltcG9ydCB7IGVzY2FwZVJlZ0V4cCB9IGZyb20gJy4uL3V0aWxzL3N0cmluZ1V0aWwuanMnO1xuXG5leHBvcnQgdHlwZSBDb25maWdCbG9ja05hbWUgPSAnYmFzZScgfCAnZXhwb3J0JztcblxuaW50ZXJmYWNlIE1hbmFnZWRDb25maWdCbG9ja3NPcHRpb25zIHtcbiAgYmxvY2tOYW1lczogcmVhZG9ubHkgQ29uZmlnQmxvY2tOYW1lW107XG4gIG1hcmtlclByZWZpeDogc3RyaW5nO1xuICB0b29sTmFtZTogc3RyaW5nO1xufVxuXG5pbnRlcmZhY2UgR2V0Q29uZmlnQ29udGVudE9wdGlvbnMge1xuICBkZXNpcmVkQ29udGVudDogc3RyaW5nO1xuICBleGlzdGluZ0NvbnRlbnQ6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgZmlsZVBhdGg6IHN0cmluZztcbn1cblxuZXhwb3J0IGNsYXNzIE1hbmFnZWRDb25maWdCbG9ja3Mge1xuICBwcml2YXRlIHJlYWRvbmx5IGJsb2NrTmFtZXM6IHJlYWRvbmx5IENvbmZpZ0Jsb2NrTmFtZVtdO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgbWFya2VyUHJlZml4OiBzdHJpbmc7XG5cbiAgcHJpdmF0ZSByZWFkb25seSB0b29sTmFtZTogc3RyaW5nO1xuXG4gIGNvbnN0cnVjdG9yKG9wdGlvbnM6IE1hbmFnZWRDb25maWdCbG9ja3NPcHRpb25zKSB7XG4gICAgdGhpcy5ibG9ja05hbWVzID0gb3B0aW9ucy5ibG9ja05hbWVzO1xuICAgIHRoaXMubWFya2VyUHJlZml4ID0gb3B0aW9ucy5tYXJrZXJQcmVmaXg7XG4gICAgdGhpcy50b29sTmFtZSA9IG9wdGlvbnMudG9vbE5hbWU7XG4gIH1cblxuICBnZXRDb25maWdDb250ZW50KG9wdGlvbnM6IEdldENvbmZpZ0NvbnRlbnRPcHRpb25zKTogc3RyaW5nIHtcbiAgICBpZiAoIW9wdGlvbnMuZXhpc3RpbmdDb250ZW50KSByZXR1cm4gb3B0aW9ucy5kZXNpcmVkQ29udGVudDtcbiAgICBpZiAodGhpcy5oYXNNYW5hZ2VkQmxvY2tzKG9wdGlvbnMuZXhpc3RpbmdDb250ZW50KSkge1xuICAgICAgcmV0dXJuIHRoaXMucmVwbGFjZU1hbmFnZWRCbG9ja3Mob3B0aW9ucy5leGlzdGluZ0NvbnRlbnQsIG9wdGlvbnMuZGVzaXJlZENvbnRlbnQsIG9wdGlvbnMuZmlsZVBhdGgpO1xuICAgIH1cbiAgICByZXR1cm4gb3B0aW9ucy5kZXNpcmVkQ29udGVudDtcbiAgfVxuXG4gIGdldEJsb2NrKGJsb2NrTmFtZTogQ29uZmlnQmxvY2tOYW1lLCBjb250ZW50OiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIHJldHVybiBgJHt0aGlzLmdldFN0YXJ0TWFya2VyKGJsb2NrTmFtZSl9XG4ke2NvbnRlbnR9XG4ke3RoaXMuZ2V0RW5kTWFya2VyKGJsb2NrTmFtZSl9YDtcbiAgfVxuXG4gIGhhc01hbmFnZWRCbG9ja3MoY29udGVudDogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuYmxvY2tOYW1lcy5zb21lKChibG9ja05hbWUpID0+IGNvbnRlbnQuaW5jbHVkZXModGhpcy5nZXRTdGFydE1hcmtlcihibG9ja05hbWUpKSk7XG4gIH1cblxuICBwcml2YXRlIHJlcGxhY2VNYW5hZ2VkQmxvY2tzKGV4aXN0aW5nQ29udGVudDogc3RyaW5nLCBkZXNpcmVkQ29udGVudDogc3RyaW5nLCBmaWxlUGF0aDogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBsZXQgY29udGVudCA9IGV4aXN0aW5nQ29udGVudDtcbiAgICBmb3IgKGNvbnN0IGJsb2NrTmFtZSBvZiB0aGlzLmJsb2NrTmFtZXMpIHtcbiAgICAgIGNvbnN0IHJlcGxhY2VtZW50ID0gdGhpcy5leHRyYWN0TWFuYWdlZEJsb2NrKGRlc2lyZWRDb250ZW50LCBibG9ja05hbWUpO1xuICAgICAgaWYgKCFyZXBsYWNlbWVudCkgY29udGludWU7XG5cbiAgICAgIGNvbnN0IG5leHRDb250ZW50ID0gdGhpcy5yZXBsYWNlTWFuYWdlZEJsb2NrKGNvbnRlbnQsIGJsb2NrTmFtZSwgcmVwbGFjZW1lbnQpO1xuICAgICAgaWYgKCFuZXh0Q29udGVudCkge1xuICAgICAgICBjb25zb2xlLndhcm4oYFNraXBwZWQgdXBkYXRpbmcgaW5jb21wbGV0ZSAke2Jsb2NrTmFtZX0gYmxvY2sgaW4gJHt0aGlzLnRvb2xOYW1lfSBjb25maWc6ICR7ZmlsZVBhdGh9YCk7XG4gICAgICAgIHJldHVybiBleGlzdGluZ0NvbnRlbnQ7XG4gICAgICB9XG4gICAgICBjb250ZW50ID0gbmV4dENvbnRlbnQ7XG4gICAgfVxuICAgIHJldHVybiBjb250ZW50O1xuICB9XG5cbiAgcHJpdmF0ZSBleHRyYWN0TWFuYWdlZEJsb2NrKGNvbnRlbnQ6IHN0cmluZywgYmxvY2tOYW1lOiBDb25maWdCbG9ja05hbWUpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLmdldE1hbmFnZWRCbG9ja1JlZ0V4cChibG9ja05hbWUpLmV4ZWMoY29udGVudCk/LlswXTtcbiAgfVxuXG4gIHByaXZhdGUgcmVwbGFjZU1hbmFnZWRCbG9jayhjb250ZW50OiBzdHJpbmcsIGJsb2NrTmFtZTogQ29uZmlnQmxvY2tOYW1lLCByZXBsYWNlbWVudDogc3RyaW5nKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICBjb25zdCBwYXR0ZXJuID0gdGhpcy5nZXRNYW5hZ2VkQmxvY2tSZWdFeHAoYmxvY2tOYW1lKTtcbiAgICBpZiAoIXBhdHRlcm4udGVzdChjb250ZW50KSkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICByZXR1cm4gY29udGVudC5yZXBsYWNlKHBhdHRlcm4sIHJlcGxhY2VtZW50KTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0TWFuYWdlZEJsb2NrUmVnRXhwKGJsb2NrTmFtZTogQ29uZmlnQmxvY2tOYW1lKTogUmVnRXhwIHtcbiAgICByZXR1cm4gbmV3IFJlZ0V4cChcbiAgICAgIGAke2VzY2FwZVJlZ0V4cCh0aGlzLmdldFN0YXJ0TWFya2VyKGJsb2NrTmFtZSkpfVtcXFxcc1xcXFxTXSo/JHtlc2NhcGVSZWdFeHAodGhpcy5nZXRFbmRNYXJrZXIoYmxvY2tOYW1lKSl9YFxuICAgICk7XG4gIH1cblxuICBwcml2YXRlIGdldFN0YXJ0TWFya2VyKGJsb2NrTmFtZTogQ29uZmlnQmxvY2tOYW1lKTogc3RyaW5nIHtcbiAgICByZXR1cm4gYC8vIHdiZnk6c3RhcnQgJHt0aGlzLm1hcmtlclByZWZpeH0tJHtibG9ja05hbWV9YDtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0RW5kTWFya2VyKGJsb2NrTmFtZTogQ29uZmlnQmxvY2tOYW1lKTogc3RyaW5nIHtcbiAgICByZXR1cm4gYC8vIHdiZnk6ZW5kICR7dGhpcy5tYXJrZXJQcmVmaXh9LSR7YmxvY2tOYW1lfWA7XG4gIH1cbn1cbiIsImltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGZzVXRpbCB9IGZyb20gJy4uL3V0aWxzL2ZzVXRpbC5qcyc7XG5pbXBvcnQgeyByZXNvbHZlV2lsbGJvb3N0ZXJDb25maWdNb2R1bGUgfSBmcm9tICcuLi91dGlscy93aWxsYm9vc3RlckNvbmZpZ3NVdGlsLmpzJztcblxuaW1wb3J0IHsgbm9ybWFsaXplQ29uZmlnQ29udGVudCB9IGZyb20gJy4vY29uZmlnQ29udGVudC5qcyc7XG5pbXBvcnQgeyBNYW5hZ2VkQ29uZmlnQmxvY2tzIH0gZnJvbSAnLi9tYW5hZ2VkQ29uZmlnQmxvY2suanMnO1xuXG5jb25zdCBtYW5hZ2VkQ29uZmlnQmxvY2tzID0gbmV3IE1hbmFnZWRDb25maWdCbG9ja3Moe1xuICBibG9ja05hbWVzOiBbJ2Jhc2UnLCAnZXhwb3J0J10sXG4gIG1hcmtlclByZWZpeDogJ294Zm10JyxcbiAgdG9vbE5hbWU6ICdveGZtdCcsXG59KTtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlT3hmbXRDb25maWcoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZ2VuZXJhdGVPeGZtdENvbmZpZycsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJ294Zm10LmNvbmZpZy50cycpO1xuICAgIGNvbnN0IGV4aXN0aW5nQ29udGVudCA9IGF3YWl0IGZzVXRpbC5yZWFkRmlsZUlmRXhpc3RzKGZpbGVQYXRoKTtcbiAgICBjb25zdCBkZXNpcmVkQ29udGVudCA9IG1hbmFnZWRDb25maWdCbG9ja3MuZ2V0Q29uZmlnQ29udGVudCh7XG4gICAgICBkZXNpcmVkQ29udGVudDogZ2V0Q29uZmlnQ29udGVudChjb25maWcpLFxuICAgICAgZXhpc3RpbmdDb250ZW50LFxuICAgICAgZmlsZVBhdGgsXG4gICAgfSk7XG4gICAgaWYgKG5vcm1hbGl6ZUNvbmZpZ0NvbnRlbnQoZXhpc3RpbmdDb250ZW50KSAhPT0gbm9ybWFsaXplQ29uZmlnQ29udGVudChkZXNpcmVkQ29udGVudCkpIHtcbiAgICAgIGF3YWl0IGZzVXRpbC5nZW5lcmF0ZUZpbGUoZmlsZVBhdGgsIGRlc2lyZWRDb250ZW50KTtcbiAgICB9XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBnZXRDb25maWdDb250ZW50KGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IHN0cmluZyB7XG4gIGNvbnN0IG94Zm10QmFzZUNvbmZpZ01vZHVsZSA9IHJlc29sdmVXaWxsYm9vc3RlckNvbmZpZ01vZHVsZShjb25maWcsICdAd2lsbGJvb3N0ZXIvb3hmbXQtY29uZmlnJyk7XG5cbiAgLy8gQ29tbW9uSlMgcGFja2FnZXMgbmVlZCByZXF1aXJlL21vZHVsZS5leHBvcnRzIGhlcmU6IG94Zm10IGNvbmZpZyBmaWxlcyBhcmVcbiAgLy8gb25seSBhdXRvLWRpc2NvdmVyZWQgYXMgLnRzLCBhbmQgdGhlIHNoYXJlZCBjb25maWcgcGFja2FnZSBpcyBFU00tb25seS5cbiAgLy8gTm8gLy8vIDxyZWZlcmVuY2UgdHlwZXM+IGxpbmU6IHRoZSB3YmZ5LWdlbmVyYXRlZCB0c2NvbmZpZyBhbHJlYWR5IGNvdmVycyAqLmNvbmZpZy50cyB3aXRoXG4gIC8vIHR5cGVzIFtcImJ1blwiXSwgd2hpY2ggdHlwZXMgcmVxdWlyZS9tb2R1bGUuZXhwb3J0cywgd2hpbGUgYSBcIm5vZGVcIiByZWZlcmVuY2UgYnJlYWtzIHVuZGVyXG4gIC8vIEJ1bidzIGlzb2xhdGVkIGxpbmtlciB3aGVyZSB0aGUgdW5kZWNsYXJlZCBAdHlwZXMvbm9kZSBpcyB1bnJlc29sdmFibGUgKFRTMjY4OCkuXG4gIGlmICghY29uZmlnLmlzRXNtUGFja2FnZSkge1xuICAgIHJldHVybiBgJHttYW5hZ2VkQ29uZmlnQmxvY2tzLmdldEJsb2NrKFxuICAgICAgJ2Jhc2UnLFxuICAgICAgYGltcG9ydCB0eXBlIHsgT3hmbXRDb25maWcgfSBmcm9tICdveGZtdCc7XG5cbi8vIG94bGludC1kaXNhYmxlIHVuaWNvcm4vcHJlZmVyLW1vZHVsZSAtLSBPeGZtdCBjb25maWcgZmlsZXMgYXJlIG9ubHkgYXV0by1kaXNjb3ZlcmVkIGFzIC50cywgYW5kIENvbW1vbkpTIGF2b2lkcyBFU00gcGFja2FnZSBsb2FkaW5nIGlzc3Vlcy5cbmNvbnN0IG94Zm10Q29uZmlnID0gcmVxdWlyZSgnJHtveGZtdEJhc2VDb25maWdNb2R1bGV9Jyk7XG5cbmNvbnN0IG94Zm10UmVzb2x2ZWRDb25maWc6IE94Zm10Q29uZmlnID0gb3hmbXRDb25maWcuZGVmYXVsdCA/PyBveGZtdENvbmZpZztgXG4gICAgKX1cblxuJHttYW5hZ2VkQ29uZmlnQmxvY2tzLmdldEJsb2NrKCdleHBvcnQnLCAnbW9kdWxlLmV4cG9ydHMgPSBveGZtdFJlc29sdmVkQ29uZmlnOycpfVxuYDtcbiAgfVxuXG4gIHJldHVybiBgJHttYW5hZ2VkQ29uZmlnQmxvY2tzLmdldEJsb2NrKFxuICAgICdiYXNlJyxcbiAgICBgaW1wb3J0IHR5cGUgeyBPeGZtdENvbmZpZyB9IGZyb20gJ294Zm10JztcblxuaW1wb3J0IGNvbmZpZyBmcm9tICcke294Zm10QmFzZUNvbmZpZ01vZHVsZX0nO1xuXG5jb25zdCBveGZtdFJlc29sdmVkQ29uZmlnOiBPeGZtdENvbmZpZyA9IGNvbmZpZztgXG4gICl9XG5cbiR7bWFuYWdlZENvbmZpZ0Jsb2Nrcy5nZXRCbG9jaygnZXhwb3J0JywgJ2V4cG9ydCBkZWZhdWx0IG94Zm10UmVzb2x2ZWRDb25maWc7Jyl9XG5gO1xufVxuIiwiaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZnNVdGlsIH0gZnJvbSAnLi4vdXRpbHMvZnNVdGlsLmpzJztcbmltcG9ydCB7XG4gIGlzUHVibGlzaGVkV2lsbGJvb3N0ZXJDb25maWdzUGFja2FnZSxcbiAgcmVzb2x2ZVdpbGxib29zdGVyQ29uZmlnTW9kdWxlLFxufSBmcm9tICcuLi91dGlscy93aWxsYm9vc3RlckNvbmZpZ3NVdGlsLmpzJztcblxuaW1wb3J0IHsgbm9ybWFsaXplQ29uZmlnQ29udGVudCB9IGZyb20gJy4vY29uZmlnQ29udGVudC5qcyc7XG5pbXBvcnQgeyBNYW5hZ2VkQ29uZmlnQmxvY2tzIH0gZnJvbSAnLi9tYW5hZ2VkQ29uZmlnQmxvY2suanMnO1xuXG5jb25zdCBtYW5hZ2VkQ29uZmlnQmxvY2tzID0gbmV3IE1hbmFnZWRDb25maWdCbG9ja3Moe1xuICBibG9ja05hbWVzOiBbJ2Jhc2UnLCAnZXhwb3J0J10sXG4gIG1hcmtlclByZWZpeDogJ294bGludCcsXG4gIHRvb2xOYW1lOiAnb3hsaW50Jyxcbn0pO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVPeGxpbnRDb25maWcoY29uZmlnOiBQYWNrYWdlQ29uZmlnLCBfcm9vdENvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2dlbmVyYXRlT3hsaW50Q29uZmlnJywgYXN5bmMgKCkgPT4ge1xuICAgIC8vIHdpbGxib29zdGVyLWNvbmZpZ3MgcHVibGlzaGVzIGNvbmZpZyBmaWxlcyBhcyBwcm9kdWN0IGNvZGUsIHNvIGdlbmVyYXRpb25cbiAgICAvLyBtdXN0IG5vdCByZXBsYWNlIHBhY2thZ2UtcHJvdmlkZWQgbGludGVyIHNldHRpbmdzLiBHZW5lcmF0ZWQgZmlsZXMgd2l0aFxuICAgIC8vIG1hbmFnZWQgYmxvY2tzIGFyZSBzdGlsbCBzYWZlIHRvIHVwZGF0ZS5cbiAgICBjb25zdCBzaG91bGRQcmVzZXJ2ZVB1Ymxpc2hlZExpbnRlckNvbmZpZyA9IGlzUHVibGlzaGVkV2lsbGJvb3N0ZXJDb25maWdzUGFja2FnZShjb25maWcpO1xuICAgIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnb3hsaW50LmNvbmZpZy50cycpO1xuICAgIGNvbnN0IGV4aXN0aW5nQ29udGVudCA9IGF3YWl0IGZzVXRpbC5yZWFkRmlsZUlmRXhpc3RzKGZpbGVQYXRoKTtcbiAgICBjb25zdCBzaG91bGRQcmVzZXJ2ZUV4aXN0aW5nQ29udGVudCA9XG4gICAgICBzaG91bGRQcmVzZXJ2ZVB1Ymxpc2hlZExpbnRlckNvbmZpZyAmJiBleGlzdGluZ0NvbnRlbnQgJiYgIW1hbmFnZWRDb25maWdCbG9ja3MuaGFzTWFuYWdlZEJsb2NrcyhleGlzdGluZ0NvbnRlbnQpO1xuICAgIGNvbnN0IGRlc2lyZWRDb250ZW50ID0gc2hvdWxkUHJlc2VydmVFeGlzdGluZ0NvbnRlbnRcbiAgICAgID8gZXhpc3RpbmdDb250ZW50XG4gICAgICA6IG1hbmFnZWRDb25maWdCbG9ja3MuZ2V0Q29uZmlnQ29udGVudCh7XG4gICAgICAgICAgZGVzaXJlZENvbnRlbnQ6IGdldENvbmZpZ0NvbnRlbnQoY29uZmlnKSxcbiAgICAgICAgICBleGlzdGluZ0NvbnRlbnQsXG4gICAgICAgICAgZmlsZVBhdGgsXG4gICAgICAgIH0pO1xuXG4gICAgaWYgKG5vcm1hbGl6ZUNvbmZpZ0NvbnRlbnQoZXhpc3RpbmdDb250ZW50KSAhPT0gbm9ybWFsaXplQ29uZmlnQ29udGVudChkZXNpcmVkQ29udGVudCkpIHtcbiAgICAgIGF3YWl0IGZzVXRpbC5nZW5lcmF0ZUZpbGUoZmlsZVBhdGgsIGRlc2lyZWRDb250ZW50KTtcbiAgICB9XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBnZXRDb25maWdDb250ZW50KGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IHN0cmluZyB7XG4gIGNvbnN0IGlzUm9vdENvbmZpZyA9IGNvbmZpZy5pc1Jvb3Q7XG4gIGNvbnN0IG94bGludEJhc2VDb25maWdNb2R1bGUgPSByZXNvbHZlV2lsbGJvb3N0ZXJDb25maWdNb2R1bGUoY29uZmlnLCAnQHdpbGxib29zdGVyL294bGludC1jb25maWcnKTtcblxuICAvLyBEbyBub3QgY29sbGFwc2UgdGhpcyB0byBhIHN0YXRpYyBpbXBvcnQgZm9yIGV2ZXJ5IHBhY2thZ2UuIENvbW1vbkpTIHBhY2thZ2VzXG4gIC8vIHR5cGUtY2hlY2sgYXV0by1kaXNjb3ZlcmVkIG94bGludC5jb25maWcudHMgYXMgQ29tbW9uSlMsIHNvIGltcG9ydGluZyB0aGUgRVNNXG4gIC8vIEB3aWxsYm9vc3Rlci9veGxpbnQtY29uZmlnIHBhY2thZ2UgdHJpZ2dlcnMgVFMxNDc5LiBLZWVwIHRoaXMgaW4gc3luYyB3aXRoXG4gIC8vIGxpdGVyYWN5LXRlc3QncyBnZW5lcmF0ZWQgY29uZmlnIHBhdHRlcm4uXG4gIC8vIE5vIC8vLyA8cmVmZXJlbmNlIHR5cGVzPiBsaW5lOiB0aGUgd2JmeS1nZW5lcmF0ZWQgdHNjb25maWcgYWxyZWFkeSBjb3ZlcnMgKi5jb25maWcudHMgd2l0aFxuICAvLyB0eXBlcyBbXCJidW5cIl0sIHdoaWNoIHR5cGVzIHJlcXVpcmUvbW9kdWxlLmV4cG9ydHMsIHdoaWxlIGEgXCJub2RlXCIgcmVmZXJlbmNlIGJyZWFrcyB1bmRlclxuICAvLyBCdW4ncyBpc29sYXRlZCBsaW5rZXIgd2hlcmUgdGhlIHVuZGVjbGFyZWQgQHR5cGVzL25vZGUgaXMgdW5yZXNvbHZhYmxlIChUUzI2ODgpLlxuICBpZiAoIWNvbmZpZy5pc0VzbVBhY2thZ2UpIHtcbiAgICByZXR1cm4gYCR7bWFuYWdlZENvbmZpZ0Jsb2Nrcy5nZXRCbG9jayhcbiAgICAgICdiYXNlJyxcbiAgICAgIGBpbXBvcnQgdHlwZSB7IE94bGludENvbmZpZyB9IGZyb20gJ294bGludCc7XG5cbi8vIG94bGludC1kaXNhYmxlIHVuaWNvcm4vcHJlZmVyLW1vZHVsZSAtLSBPeGxpbnQgb25seSBhdXRvLWRpc2NvdmVycyAudHMgY29uZmlnIGZpbGVzLCBhbmQgQ29tbW9uSlMgYXZvaWRzIEVTTSBwYWNrYWdlIGxvYWRpbmcgaXNzdWVzLlxuY29uc3Qgb3hsaW50QmFzZUNvbmZpZyA9IHJlcXVpcmUoJyR7b3hsaW50QmFzZUNvbmZpZ01vZHVsZX0nKTtcblxuJHtnZXRSZXNvbHZlZENvbmZpZ0NvbnRlbnQoJ294bGludEJhc2VDb25maWcuZGVmYXVsdCA/PyBveGxpbnRCYXNlQ29uZmlnJywgaXNSb290Q29uZmlnKX1gXG4gICAgKX1cblxuJHttYW5hZ2VkQ29uZmlnQmxvY2tzLmdldEJsb2NrKCdleHBvcnQnLCAnbW9kdWxlLmV4cG9ydHMgPSBveGxpbnRSZXNvbHZlZENvbmZpZzsnKX1cbmA7XG4gIH1cblxuICByZXR1cm4gYCR7bWFuYWdlZENvbmZpZ0Jsb2Nrcy5nZXRCbG9jayhcbiAgICAnYmFzZScsXG4gICAgYGltcG9ydCB0eXBlIHsgT3hsaW50Q29uZmlnIH0gZnJvbSAnb3hsaW50JztcblxuaW1wb3J0IG94bGludEJhc2VDb25maWcgZnJvbSAnJHtveGxpbnRCYXNlQ29uZmlnTW9kdWxlfSc7XG5cbiR7Z2V0UmVzb2x2ZWRDb25maWdDb250ZW50KCdveGxpbnRCYXNlQ29uZmlnJywgaXNSb290Q29uZmlnKX1gXG4gICl9XG5cbiR7bWFuYWdlZENvbmZpZ0Jsb2Nrcy5nZXRCbG9jaygnZXhwb3J0JywgJ2V4cG9ydCBkZWZhdWx0IG94bGludFJlc29sdmVkQ29uZmlnOycpfVxuYDtcbn1cblxuLy8gc3RydWN0dXJlZENsb25lIGtlZXBzIGEgcGFja2FnZS1sb2NhbCBjb3B5IHNvIHJlcG9zaXRvcmllcyBjYW4gYWRkIHNldHRpbmdzIG91dHNpZGUgbWFuYWdlZFxuLy8gYmxvY2tzIHdpdGhvdXQgbXV0YXRpbmcgdGhlIHNoYXJlZCBpbXBvcnRlZCBjb25maWcgb2JqZWN0LiBUaGUgcm9vdCBjb25maWcgZm9yY2VzIHRoZSB0eXBlLWF3YXJlXG4vLyBvcHRpb25zIG9uIGluc2lkZSB0aGUgbWFuYWdlZCBibG9jayBzbyBubyBjdXN0b21pemF0aW9uIGNhbiBzaWxlbnRseSBkaXNhYmxlIHR5cGUgY2hlY2tpbmc7IGV2ZXJ5XG4vLyBvdGhlciBjb25maWcgZGVsZXRlcyB0aGVtIGJlY2F1c2UgT3hsaW50IHJlamVjdHMgdGhvc2Ugcm9vdC1vbmx5IG9wdGlvbnMgZWxzZXdoZXJlICh0eXBlIGNoZWNraW5nXG4vLyBzdXJ2aXZlczogdGhlIGxpbnQgY29tbWFuZHMgcGFzcyAtLXR5cGUtYXdhcmUgYW5kIC0tdHlwZS1jaGVjayBleHBsaWNpdGx5KS5cbmZ1bmN0aW9uIGdldFJlc29sdmVkQ29uZmlnQ29udGVudChiYXNlQ29uZmlnTmFtZTogc3RyaW5nLCBpc1Jvb3RDb25maWc6IGJvb2xlYW4pOiBzdHJpbmcge1xuICBpZiAoaXNSb290Q29uZmlnKSB7XG4gICAgcmV0dXJuIGBjb25zdCBveGxpbnRSZXNvbHZlZENvbmZpZzogT3hsaW50Q29uZmlnID0gc3RydWN0dXJlZENsb25lKCR7YmFzZUNvbmZpZ05hbWV9KTtcbm94bGludFJlc29sdmVkQ29uZmlnLm9wdGlvbnMgPSB7IC4uLm94bGludFJlc29sdmVkQ29uZmlnLm9wdGlvbnMsIHR5cGVBd2FyZTogdHJ1ZSwgdHlwZUNoZWNrOiB0cnVlIH07YDtcbiAgfVxuXG4gIHJldHVybiBgY29uc3Qgb3hsaW50UmVzb2x2ZWRDb25maWc6IE94bGludENvbmZpZyA9IHN0cnVjdHVyZWRDbG9uZSgke2Jhc2VDb25maWdOYW1lfSk7XG5kZWxldGUgb3hsaW50UmVzb2x2ZWRDb25maWcub3B0aW9ucztgO1xufVxuIiwiaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZnNVdGlsIH0gZnJvbSAnLi4vdXRpbHMvZnNVdGlsLmpzJztcbmltcG9ydCB7IGlnbm9yZUZpbGVVdGlsIH0gZnJvbSAnLi4vdXRpbHMvaWdub3JlRmlsZVV0aWwuanMnO1xuaW1wb3J0IHsgcHJvbWlzZVBvb2wgfSBmcm9tICcuLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5cbmNvbnN0IGNvbW1vbkNvbnRlbnQgPSBgXG4zcmQtcGFydHkvXG5hbmRyb2lkL1xuaW9zL1xubm8tZm9ybWF0L1xudGVzdC1maXh0dXJlcy9cbnRlc3QvZml4dHVyZXMvXG4qLmQudHNcbioubWluLmpzXG4ueWFybi9cbi5wbnAuanNcbmA7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZW5lcmF0ZVByZXR0aWVyaWdub3JlKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2dlbmVyYXRlUHJldHRpZXJpZ25vcmUnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICcucHJldHRpZXJpZ25vcmUnKTtcbiAgICBjb25zdCBjb250ZW50ID0gKGF3YWl0IGZzVXRpbC5yZWFkRmlsZUlmRXhpc3RzKGZpbGVQYXRoKSkgPz8gJyc7XG4gICAgY29uc3QgaGVhZFVzZXJDb250ZW50ID0gaWdub3JlRmlsZVV0aWwuZ2V0SGVhZFVzZXJDb250ZW50KGNvbnRlbnQpO1xuICAgIGNvbnN0IHRhaWxVc2VyQ29udGVudCA9IGlnbm9yZUZpbGVVdGlsLmdldFRhaWxVc2VyQ29udGVudChjb250ZW50KTtcblxuICAgIGNvbnN0IGdpdGlnbm9yZUZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnLmdpdGlnbm9yZScpO1xuICAgIGNvbnN0IGdpdGlnbm9yZUNvbnRlbnQgPSAoYXdhaXQgaWdub3JlRmlsZVV0aWwucmVhZEdpdGlnbm9yZVdpdGhvdXRTZXBhcmF0b3JzKGdpdGlnbm9yZUZpbGVQYXRoKSkgfHwgJyc7XG5cbiAgICBsZXQgYWRkaXRpb25hbENvbnRlbnQgPSAnJztcbiAgICBpZiAoY29uZmlnLmRvZXNDb250YWluUHVic3BlY1lhbWwpIHtcbiAgICAgIGFkZGl0aW9uYWxDb250ZW50ID0gYFxuYW5kcm9pZC9hcHAvXG5pb3MvUnVubmVyL0Fzc2V0cy54Y2Fzc2V0cy9cbnB1YnNwZWMueWFtbFxuYDtcbiAgICB9XG5cbiAgICBjb25zdCBuZXdDb250ZW50ID0gaGVhZFVzZXJDb250ZW50ICsgY29tbW9uQ29udGVudCArIGFkZGl0aW9uYWxDb250ZW50ICsgZ2l0aWdub3JlQ29udGVudCArIHRhaWxVc2VyQ29udGVudDtcbiAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnNVdGlsLmdlbmVyYXRlRmlsZShmaWxlUGF0aCwgbmV3Q29udGVudCkpO1xuICB9KTtcbn1cbiIsImltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCBtZXJnZSBmcm9tICdkZWVwbWVyZ2UnO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBmc1V0aWwgfSBmcm9tICcuLi91dGlscy9mc1V0aWwuanMnO1xuaW1wb3J0IHsganNvbmNVdGlsIH0gZnJvbSAnLi4vdXRpbHMvanNvbmNVdGlsLmpzJztcbmltcG9ydCB7IG92ZXJ3cml0ZU1lcmdlIH0gZnJvbSAnLi4vdXRpbHMvbWVyZ2VVdGlsLmpzJztcbmltcG9ydCB7IHNvcnRLZXlzIH0gZnJvbSAnLi4vdXRpbHMvb2JqZWN0VXRpbC5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcblxuY29uc3QganNvbk9iaiA9IHtcbiAgdmVudlBhdGg6ICcuJyxcbiAgdmVudjogJy52ZW52Jyxcbn07XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZW5lcmF0ZVB5cmlnaHRDb25maWdKc29uKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2dlbmVyYXRlUHlyaWdodENvbmZpZ0pzb24nLCBhc3luYyAoKSA9PiB7XG4gICAgbGV0IG5ld1NldHRpbmdzOiBvYmplY3QgPSBzdHJ1Y3R1cmVkQ2xvbmUoanNvbk9iaik7XG4gICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICdweXJpZ2h0Y29uZmlnLmpzb24nKTtcbiAgICBjb25zdCBvbGRDb250ZW50ID0gYXdhaXQgZnNVdGlsLnJlYWRGaWxlSWZFeGlzdHMoZmlsZVBhdGgpO1xuICAgIGxldCBvcmlnaW5hbFNldHRpbmdzSnNvbjogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICAgIGlmIChvbGRDb250ZW50ICE9PSB1bmRlZmluZWQgJiYgIWpzb25jVXRpbC5pc1RyaXZpYU9ubHkob2xkQ29udGVudCkpIHtcbiAgICAgIC8vIHB5cmlnaHRjb25maWcuanNvbiBhbGxvd3MgSlNPTkM7IGFuIGV4aXN0aW5nIGZpbGUgd2JmeSBjYW5ub3QgcGFyc2UgbXVzdCBiZSBsZWZ0XG4gICAgICAvLyB1bnRvdWNoZWQgaW5zdGVhZCBvZiBiZWluZyBvdmVyd3JpdHRlbiB3aXRoIHRoZSBiYXJlIHRlbXBsYXRlLlxuICAgICAgY29uc3Qgb2xkU2V0dGluZ3MgPSBqc29uY1V0aWwucGFyc2VPYmplY3RJZ25vcmluZ0Vycm9yPG9iamVjdD4ob2xkQ29udGVudCk7XG4gICAgICBpZiAoIW9sZFNldHRpbmdzKSB7XG4gICAgICAgIGNvbnNvbGUud2FybihgU2tpcHBlZCBnZW5lcmF0aW5nICR7ZmlsZVBhdGh9IGJlY2F1c2UgdGhlIGV4aXN0aW5nIGNvbnRlbnQgaXMgbm90IHBhcnNhYmxlIGFzIEpTT05DLmApO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBvcmlnaW5hbFNldHRpbmdzSnNvbiA9IEpTT04uc3RyaW5naWZ5KHNvcnRLZXlzKHN0cnVjdHVyZWRDbG9uZShvbGRTZXR0aW5ncykgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pKTtcbiAgICAgIG5ld1NldHRpbmdzID0gbWVyZ2UuYWxsKFtuZXdTZXR0aW5ncywgb2xkU2V0dGluZ3MsIG5ld1NldHRpbmdzXSwgeyBhcnJheU1lcmdlOiBvdmVyd3JpdGVNZXJnZSB9KTtcbiAgICB9XG4gICAgLy8gU2tpcCB0aGUgd3JpdGUgd2hlbiBub3RoaW5nIGNoYW5nZXMgc2VtYW50aWNhbGx5LCBzbyBKU09OQyBjb21tZW50cyBhbmQgZm9ybWF0dGluZyBpbiBhblxuICAgIC8vIGFscmVhZHktY2xlYW4gcHlyaWdodGNvbmZpZy5qc29uIHN1cnZpdmUgd2JmeSBydW5zLlxuICAgIGlmIChvcmlnaW5hbFNldHRpbmdzSnNvbiA9PT0gSlNPTi5zdHJpbmdpZnkoc29ydEtleXMoc3RydWN0dXJlZENsb25lKG5ld1NldHRpbmdzKSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPikpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IG5ld0NvbnRlbnQgPSBKU09OLnN0cmluZ2lmeShuZXdTZXR0aW5ncywgdW5kZWZpbmVkLCAyKTtcbiAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnNVdGlsLmdlbmVyYXRlRmlsZShmaWxlUGF0aCwgbmV3Q29udGVudCkpO1xuICB9KTtcbn1cbiIsImltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB7IGNvbnN1bWVzRG9ja2VyRW52IH0gZnJvbSAnQHdpbGxib29zdGVyL3NoYXJlZC1saWItbm9kZS9zcmMnO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBmc1V0aWwgfSBmcm9tICcuLi91dGlscy9mc1V0aWwuanMnO1xuaW1wb3J0IHsgcHJvbWlzZVBvb2wgfSBmcm9tICcuLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5cbmNvbnN0IG1hbmFnZWRTY3JpcHRzQmxvY2sgPSBgc2NyaXB0cy8qKlxuIXNjcmlwdHMvXG4hc2NyaXB0cy8qLnNoYDtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGZpeFJhaWx3YXlpZ25vcmUoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZml4UmFpbHdheWlnbm9yZScsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJy5yYWlsd2F5aWdub3JlJyk7XG4gICAgY29uc3QgY29udGVudCA9IGF3YWl0IGZzVXRpbC5yZWFkRmlsZUlmRXhpc3RzKGZpbGVQYXRoKTtcbiAgICBjb25zdCB1c2VzRG9ja2VyRW52ID0gY29uc3VtZXNEb2NrZXJFbnYoY29uZmlnLmRvY2tlcmZpbGUpO1xuICAgIGlmICghY29udGVudCkge1xuICAgICAgaWYgKGNvbmZpZy5pc1JhaWx3YXkgJiYgdXNlc0RvY2tlckVudikge1xuICAgICAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnNVdGlsLmdlbmVyYXRlRmlsZShmaWxlUGF0aCwgJyEuZG9ja2VyLmVudlxcbicpKTtcbiAgICAgIH1cbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBsZXQgbmV3Q29udGVudCA9IGNvbnRlbnQucmVwbGFjZSgvXnNjcmlwdHNcXC8kL20sIG1hbmFnZWRTY3JpcHRzQmxvY2spO1xuICAgIC8vIGByYWlsd2F5IHVwYCBzdHJpcHMgZ2l0aWdub3JlZCBmaWxlcyBmcm9tIHRoZSB1cGxvYWRlZCBidWlsZCBjb250ZXh0LCBzbyB0aGUgZ2VuZXJhdGVkXG4gICAgLy8gbm9uLXNlY3JldCAuZG9ja2VyLmVudiAoYHdiIGdlbi1kb2NrZXItZW52YCBvdXRwdXQpIG5lZWRzIGFuIGV4cGxpY2l0IHVuLWlnbm9yZSB0byByZWFjaFxuICAgIC8vIHRoZSByZW1vdGUgRG9ja2VyIGJ1aWxkLiBBcHBlbmRlZCwgbm90IHByZXBlbmRlZDogaWdub3JlIGZpbGVzIGFyZSBsYXN0LW1hdGNoLXdpbnMsIHNvIGFcbiAgICAvLyBoYW5kLXdyaXR0ZW4gcGF0dGVybiBzdWNoIGFzIGAqLmVudmAgZWFybGllciBpbiB0aGUgZmlsZSBtdXN0IG5vdCBzaWxlbnRseSByZS1leGNsdWRlIGl0LlxuICAgIGlmICh1c2VzRG9ja2VyRW52ICYmICEvXiFcXC5kb2NrZXJcXC5lbnYkL20udGVzdChuZXdDb250ZW50KSkge1xuICAgICAgbmV3Q29udGVudCA9IGAke25ld0NvbnRlbnQucmVwbGFjZSgvXFxuPyQvLCAnXFxuJyl9IS5kb2NrZXIuZW52XFxuYDtcbiAgICB9IGVsc2UgaWYgKGNvbmZpZy5kb2NrZXJmaWxlICYmICF1c2VzRG9ja2VyRW52KSB7XG4gICAgICBuZXdDb250ZW50ID0gbmV3Q29udGVudC5yZXBsYWNlKC9eIVxcLmRvY2tlclxcLmVudlxcbj8vbSwgJycpO1xuICAgIH1cbiAgICBpZiAobmV3Q29udGVudCA9PT0gY29udGVudCkgcmV0dXJuO1xuXG4gICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+XG4gICAgICBuZXdDb250ZW50ID8gZnNVdGlsLmdlbmVyYXRlRmlsZShmaWxlUGF0aCwgbmV3Q29udGVudCkgOiBmc1V0aWwucmVtb3ZlQ29uZmluZWQoZmlsZVBhdGgpXG4gICAgKTtcbiAgfSk7XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgdHlwZSB7IEltYWdlLCBMaW5rLCBQYXJhZ3JhcGgsIFBocmFzaW5nQ29udGVudCwgUm9vdENvbnRlbnQgfSBmcm9tICdtZGFzdCc7XG5pbXBvcnQgeyBmcm9tTWFya2Rvd24gfSBmcm9tICdtZGFzdC11dGlsLWZyb20tbWFya2Rvd24nO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHsgam9ic0FsbENhbGxSZXVzYWJsZVdvcmtmbG93IH0gZnJvbSAnLi93b3JrZmxvdy5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGZzVXRpbCB9IGZyb20gJy4uL3V0aWxzL2ZzVXRpbC5qcyc7XG5pbXBvcnQgeyBnZXRPY3Rva2l0IH0gZnJvbSAnLi4vdXRpbHMvZ2l0aHViVXRpbC5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcbmltcG9ydCB7IGdldFdiZnlWZXJzaW9uTGFiZWwgfSBmcm9tICcuLi91dGlscy92ZXJzaW9uLmpzJztcblxuY29uc3Qgc2VtYW50aWNSZWxlYXNlQmFkZ2UgPVxuICAnWyFbc2VtYW50aWMtcmVsZWFzZV0oaHR0cHM6Ly9pbWcuc2hpZWxkcy5pby9iYWRnZS8lMjAlMjAlRjAlOUYlOTMlQTYlRjAlOUYlOUElODAtc2VtYW50aWMtLXJlbGVhc2UtZTEwMDc5LnN2ZyldKGh0dHBzOi8vZ2l0aHViLmNvbS9zZW1hbnRpYy1yZWxlYXNlL3NlbWFudGljLXJlbGVhc2UpJztcblxuY29uc3Qgd2JmeUJhZGdlVXJsUHJlZml4ID0gJ2h0dHBzOi8vaW1nLnNoaWVsZHMuaW8vYmFkZ2Uvd2JmeS0nO1xuY29uc3Qgd2JmeUJhZGdlVXJsU3VmZml4ID0gJy0xZTkwZmYuc3ZnJztcbmNvbnN0IHdiZnlCYWRnZUxpbmsgPSAnaHR0cHM6Ly9naXRodWIuY29tL1dpbGxCb29zdGVyL3NoYXJlZC90cmVlL21haW4vcGFja2FnZXMvd2JmeSc7XG5cbmNvbnN0IG5wbVBhY2thZ2VVcmxQcmVmaXggPSAnaHR0cHM6Ly93d3cubnBtanMuY29tL3BhY2thZ2UvJztcblxuY29uc3QgbWFuYWdlZEJhZGdlUGF0dGVybnMgPSBbXG4gIC9eXFxbIVxcW3diZnlcXF1cXChodHRwczpcXC9cXC9pbWdcXC5zaGllbGRzXFwuaW9cXC9iYWRnZVxcL3diZnktW14pXFxzXSstMWU5MGZmXFwuc3ZnXFwpXFxdXFwoaHR0cHM6XFwvXFwvZ2l0aHViXFwuY29tXFwvV2lsbEJvb3N0ZXJcXC9zaGFyZWRcXC90cmVlXFwvbWFpblxcL3BhY2thZ2VzXFwvd2JmeVxcKSQvdSxcbiAgL15cXFshXFxbW15cXF1dKlxcXVxcKChodHRwczpcXC9cXC9naXRodWJcXC5jb21cXC9bXilcXHNdK1xcL2FjdGlvbnNcXC93b3JrZmxvd3NcXC9bXilcXHNdKylcXC9iYWRnZVxcLnN2Z1xcKVxcXVxcKFxcMVxcKSQvdSxcbiAgLy8gQW55IGJhZGdlIGxpbmtpbmcgdG8gYW4gbnBtIHBhY2thZ2UgcGFnZSwgd2hhdGV2ZXIgaW1hZ2UgaXQgc2hvd3MgYW5kIGhvd2V2ZXIgdGhlIGxpbmsgaXNcbiAgLy8gc3BlbGxlZDogdGhlIGJsb2NrIGlzIHdiZnkncywgaXQgd3JpdGVzIGF0IG1vc3Qgb25lIG5wbSBiYWRnZSwgc28gYSBiYWRnZSBmb3IgYSByZW5hbWVkIG9yXG4gIC8vIHVucHVibGlzaGVkIHBhY2thZ2UgaXMgYSBzdGFsZSBjb3B5IG9mIHRoYXQgb25lIOKAlCBub3QgYW5vdGhlciBiYWRnZSB0byBrZWVwIGJlc2lkZSBpdC5cbiAgL15cXFshXFxbW15cXF1dKlxcXVxcKFteKVxcc10rXFwpXFxdXFwoaHR0cHM/OlxcL1xcLyg/Ond3d1xcLik/bnBtanNcXC5jb21cXC9wYWNrYWdlXFwvW14pXFxzXSpcXCkkL3UsXG5dO1xuXG5mdW5jdGlvbiBidWlsZFdiZnlCYWRnZShsYWJlbDogc3RyaW5nKTogc3RyaW5nIHtcbiAgLy8gSHlwaGVucyBhcmUgZXNjYXBlZCBhcyBgLS1gIHBlciBzaGllbGRzLmlvJ3MgYmFkZ2UgcGF0aCBzeW50YXgsIHNvIGB2MS4yLjMtcmMuMWAgc3RheXMgaW50YWN0LlxuICByZXR1cm4gYFshW3diZnldKCR7d2JmeUJhZGdlVXJsUHJlZml4fSR7bGFiZWwucmVwbGFjZUFsbCgnLScsICctLScpfSR7d2JmeUJhZGdlVXJsU3VmZml4fSldKCR7d2JmeUJhZGdlTGlua30pYDtcbn1cblxuLyoqIFRoZSB2ZXJzaW9uIGxhYmVsIHRoZSB3YmZ5IGJhZGdlIGluIHRoZSByZXBvc2l0b3J5J3MgUkVBRE1FIHJlY29yZHMsIGkuZS4gdGhlIGJ1aWxkIHRoYXQgd2JmaWVkIGl0LiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJlYWRBcHBsaWVkV2JmeVZlcnNpb25MYWJlbChkaXJQYXRoOiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZyB8IHVuZGVmaW5lZD4ge1xuICAvLyBDb25maW5lZCwgYW5kIHRvbGVyYW50IG9mIGFueSByZWFkIGZhaWx1cmU6IGEgUkVBRE1FIHRoYXQgcmVzb2x2ZXMgb3V0c2lkZSB0aGUgcmVwb3NpdG9yeSAoYVxuICAvLyBjb21taXR0ZWQgc3ltbGluaykgb3IgY2Fubm90IGJlIHJlYWQgYXQgYWxsIHNheXMgbm90aGluZyBhYm91dCB3aGljaCBidWlsZCBjb25maWd1cmVkIFRISVNcbiAgLy8gcmVwb3NpdG9yeSwgYW5kIHRoZSBhbnN3ZXIgb25seSBldmVyIHN1cHByZXNzZXMgd29yayDigJQgc28gYW55dGhpbmcgYnV0IGEgcmVhZGFibGUgaW4tcmVwb3NpdG9yeVxuICAvLyBSRUFETUUgbWVhbnMgXCJub3Qga25vd24gdG8gYmUgYXBwbGllZFwiIGFuZCB0aGUgcnVuIHByb2NlZWRzLlxuICBjb25zdCByZWFkbWUgPSBhd2FpdCBmc1V0aWwucmVhZEZpbGVDb25maW5lZElmRXhpc3RzKHBhdGgucmVzb2x2ZShkaXJQYXRoLCAnUkVBRE1FLm1kJykpLmNhdGNoKCgpID0+IHt9KTtcbiAgaWYgKHJlYWRtZSA9PT0gdW5kZWZpbmVkKSByZXR1cm4gdW5kZWZpbmVkO1xuXG4gIC8vIFRoZSBSRUFETUUgaXMgcGFyc2VkIHJhdGhlciB0aGFuIHNjYW5uZWQsIGZvciB0aGUgc2FtZSByZWFzb24gd3JpdGVCYWRnZUJsb2NrIHBhcnNlcyBpdCwgYW5kXG4gIC8vIG9ubHkgdGhlIHNoYXBlIHdyaXRlQmFkZ2VCbG9jayBpdHNlbGYgd3JpdGVzIGNvdW50cyBhcyBhbiBhcHBsaWVkIGJhZGdlOiBhIHRvcC1sZXZlbCBwYXJhZ3JhcGhcbiAgLy8gb2YgYmFkZ2VzLiBBIGJhZGdlIGFueXdoZXJlIGVsc2UgaXMgY29udGVudCB0aGF0IG1lcmVseSBtZW50aW9ucyBvbmUg4oCUIGEgZmVuY2VkIGV4YW1wbGUgKHdiZnknc1xuICAvLyBvd24gZG9jdW1lbnRhdGlvbiBoYXMgdGhvc2UpLCBhIGJsb2NrIHF1b3RlLCBhIGxpc3QgaXRlbSDigJQgYW5kIHJlYWRpbmcgaXQgYXMgYXBwbGllZCB3b3VsZCBza2lwXG4gIC8vIGV2ZXJ5IGZpeGVyIGZvciB0aGUgcmVwb3NpdG9yeS5cbiAgZm9yIChjb25zdCBub2RlIG9mIGZyb21NYXJrZG93bihyZWFkbWUpLmNoaWxkcmVuKSB7XG4gICAgaWYgKCFpc0JhZGdlQmxvY2tOb2RlKG5vZGUpKSBjb250aW51ZTtcbiAgICBmb3IgKGNvbnN0IGJhZGdlIG9mIG5vZGUuY2hpbGRyZW4pIHtcbiAgICAgIGlmICghaXNCYWRnZU5vZGUoYmFkZ2UpKSBjb250aW51ZTtcbiAgICAgIGNvbnN0IHsgdXJsIH0gPSBiYWRnZS5jaGlsZHJlblswXTtcbiAgICAgIGlmICh1cmwuc3RhcnRzV2l0aCh3YmZ5QmFkZ2VVcmxQcmVmaXgpICYmIHVybC5lbmRzV2l0aCh3YmZ5QmFkZ2VVcmxTdWZmaXgpKSB7XG4gICAgICAgIHJldHVybiB1cmwuc2xpY2Uod2JmeUJhZGdlVXJsUHJlZml4Lmxlbmd0aCwgLXdiZnlCYWRnZVVybFN1ZmZpeC5sZW5ndGgpLnJlcGxhY2VBbGwoJy0tJywgJy0nKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcmV0dXJuIHVuZGVmaW5lZDtcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlUmVhZG1lKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2dlbmVyYXRlUmVhZG1lJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnUkVBRE1FLm1kJyk7XG4gICAgLy8gVGhlIHdiZnkgYmFkZ2UgbWFya3MgYSByZXBvc2l0b3J5IGFzIHdiZmllZCwgc28gYSByZXBvc2l0b3J5IHdpdGhvdXQgYSBSRUFETUUgc3RpbGwgZ2V0cyBvbmUuXG4gICAgLy8gcmVhZEZpbGVJZkV4aXN0cyBmYWxscyBiYWNrIE9OTFkgb24gRU5PRU5UOiBhIFJFQURNRSB0aGF0IGV4aXN0cyBidXQgY2Fubm90IGJlIHJlYWQgKGUuZy5cbiAgICAvLyBwZXJtaXNzaW9ucywgRU1GSUxFKSBtdXN0IGFib3J0IHRoZSBnZW5lcmF0b3IgaW5zdGVhZCBvZiBiZWluZyBvdmVyd3JpdHRlbiB3aXRoIHRoZSBzdHViLlxuICAgIGxldCBuZXdDb250ZW50ID1cbiAgICAgIChhd2FpdCBmc1V0aWwucmVhZEZpbGVJZkV4aXN0cyhmaWxlUGF0aCkpID8/XG4gICAgICBgIyAke2NvbmZpZy5wYWNrYWdlSnNvbj8ubmFtZSA/PyBwYXRoLmJhc2VuYW1lKHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCkpfVxcbmA7XG5cbiAgICAvLyBPcmRlcmVkIGJ5IHdoYXQgYSByZWFkZXIgY2FyZXMgYWJvdXQgbW9zdDogdGhlIG5wbSBiYWRnZSBuYW1lcyB0aGUgcGFja2FnZSBhIHJlYWRlciBpbnN0YWxscyxcbiAgICAvLyB0aGVuIHRoZSB3b3JrZmxvdyBiYWRnZXMgcmVwb3J0IHdoZXRoZXIgdGhlIGNvZGUgaXMgY3VycmVudGx5IGhlYWx0aHksIHRoZW4gaG93IGl0IGlzXG4gICAgLy8gcmVsZWFzZWQsIGFuZCBsYXN0IHRoZSB3YmZ5IGJ1aWxkIHRoYXQgY29uZmlndXJlZCBpdC5cbiAgICBjb25zdCBiYWRnZXM6IHN0cmluZ1tdID0gW107XG4gICAgY29uc3QgbnBtUGFja2FnZU5hbWUgPSBhd2FpdCBnZXRQdWJsaXNoZWROcG1QYWNrYWdlTmFtZShjb25maWcpO1xuICAgIGlmIChucG1QYWNrYWdlTmFtZSkgYmFkZ2VzLnB1c2goYnVpbGROcG1CYWRnZShucG1QYWNrYWdlTmFtZSkpO1xuICAgIGJhZGdlcy5wdXNoKC4uLihhd2FpdCBidWlsZFdvcmtmbG93QmFkZ2VzKGNvbmZpZykpKTtcbiAgICBpZiAoZnMuZXhpc3RzU3luYyhwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICcucmVsZWFzZXJjLmpzb24nKSkpIGJhZGdlcy5wdXNoKHNlbWFudGljUmVsZWFzZUJhZGdlKTtcbiAgICBiYWRnZXMucHVzaChidWlsZFdiZnlCYWRnZShnZXRXYmZ5VmVyc2lvbkxhYmVsKCkgPz8gJ2FwcGxpZWQnKSk7XG5cbiAgICAvLyBUaGUgYmxvY2sgaXMgd3JpdHRlbiBpbiBvbmUgcGFzcyBmcm9tIHRoZSBiYWRnZXMgd2JmeSBtYW5hZ2VzIHJpZ2h0IG5vdy4gQSBiYWRnZSB0aGF0IGlzIG5vXG4gICAgLy8gbG9uZ2VyIHdhbnRlZCDigJQgYSBzdXBlcnNlZGVkIHZlcnNpb24sIG9yIG9uZSB3aG9zZSB3b3JrZmxvdyBpcyBnb25lIOKAlCBzaW1wbHkgaXMgbm90IGluIHRoZVxuICAgIC8vIGxpc3QsIHNvIG5vdGhpbmcgaGFzIHRvIHJlbW92ZSBpdC5cbiAgICBuZXdDb250ZW50ID0gd3JpdGVCYWRnZUJsb2NrKG5ld0NvbnRlbnQsIGJhZGdlcyk7XG5cbiAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnNVdGlsLmdlbmVyYXRlRmlsZShmaWxlUGF0aCwgbmV3Q29udGVudCwgZ2V0TGluZUVuZGluZyhuZXdDb250ZW50KSkpO1xuICB9KTtcbn1cblxuLyoqXG4gKiBUaGUgbnBtIHBhY2thZ2UgbmFtZSB0aGUgcmVwb3NpdG9yeSBwdWJsaXNoZXMgZnJvbSBpdHMgcm9vdCBtYW5pZmVzdCwgaWYgYW55LiBBIG1hbmlmZXN0IG5vXG4gKiByZWxlYXNlIHB1Ymxpc2hlcywgb3Igb25lIGtlcHQgb3V0IG9mIHRoZSByZWdpc3RyeSBvbiBwdXJwb3NlLCBoYXMgbm8gcGFja2FnZSBwYWdlIHRvIGxpbmsgdG8uXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGdldFB1Ymxpc2hlZE5wbVBhY2thZ2VOYW1lKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8c3RyaW5nIHwgdW5kZWZpbmVkPiB7XG4gIGNvbnN0IHBhY2thZ2VKc29uID0gY29uZmlnLnBhY2thZ2VKc29uO1xuICBpZiAoIXBhY2thZ2VKc29uPy5uYW1lIHx8ICFjb25maWcucmVsZWFzZS5ucG0pIHJldHVybiB1bmRlZmluZWQ7XG4gIC8vIGBwcml2YXRlYCBpcyByZWFkIHRoZSB3YXkgZ2VuZXJhdGVQYWNrYWdlSnNvbiB3cml0ZXMgaXQ6IGl0IHJlbW92ZXMgdGhlIGZsYWcgZnJvbSBhIE1PTk9SRVBPXG4gIC8vIHJvb3QgdGhhdCBkZWNsYXJlcyBwdWJsaXNoaW5nIGludGVudCwgc28gcmVhZGluZyB0aGUgZmxhZyBhbG9uZSB3b3VsZCBkZW55IHRoZSBiYWRnZSB0byB0aGVcbiAgLy8gdmVyeSBtYW5pZmVzdCB0aGUgc2FtZSBydW4gbWFrZXMgcHVibGlzaGFibGUuIEFueXdoZXJlIGVsc2UgdGhlIGZsYWcgc3RhbmRzIGFzIHdyaXR0ZW4uXG4gIGNvbnN0IGRlY2xhcmVzUHVibGlzaGluZ0ludGVudCA9ICEhcGFja2FnZUpzb24ucHVibGlzaENvbmZpZyB8fCBjb25maWcucmVsZWFzZS5ucG1QdWJsaXNoZXNSb290O1xuICBpZiAocGFja2FnZUpzb24ucHJpdmF0ZSAmJiAhKGNvbmZpZy5kb2VzQ29udGFpblN1YlBhY2thZ2VKc29ucyAmJiBkZWNsYXJlc1B1Ymxpc2hpbmdJbnRlbnQpKSByZXR1cm4gdW5kZWZpbmVkO1xuICAvLyBUaGUgbWFuaWZlc3Qgb25seSBzYXlzIHRoZSByZXBvc2l0b3J5IElOVEVORFMgdG8gcHVibGlzaDogYSBtb25vcmVwbyByb290IHRoYXQgY29uZmlndXJlc1xuICAvLyBAc2VtYW50aWMtcmVsZWFzZS9ucG0gZm9yIGl0cyB3b3Jrc3BhY2VzIGlzIG5ldmVyIG9uIG5wbSBpdHNlbGYsIGFuZCBhIHBhY2thZ2UncyBmaXJzdCByZWxlYXNlXG4gIC8vIGhhcyBub3QgaGFwcGVuZWQgeWV0LiBCb3RoIHdvdWxkIHJlbmRlciBhIGJyb2tlbiBiYWRnZSwgc28gdGhlIHJlZ2lzdHJ5IGRlY2lkZXMuXG4gIHJldHVybiAoYXdhaXQgaXNNaXNzaW5nRnJvbU5wbVJlZ2lzdHJ5KHBhY2thZ2VKc29uLm5hbWUpKSA/IHVuZGVmaW5lZCA6IHBhY2thZ2VKc29uLm5hbWU7XG59XG5cbi8qKlxuICogV2hldGhlciB0aGUgcmVnaXN0cnkgYW5zd2VycyB0aGF0IGl0IGhhcyBubyBzdWNoIHBhY2thZ2Ug4oCUIHRoZSBPTkxZIGFuc3dlciB0aGF0IHJlbW92ZXMgYSBiYWRnZS5cbiAqIEEgY2hlY2sgdGhhdCBjYW5ub3QgcnVuIChvZmZsaW5lLCBhbiBvdXRhZ2UsIGEgdGltZW91dCkgc2F5cyBub3RoaW5nIGFib3V0IHRoZSBwYWNrYWdlLCBhbmRcbiAqIHRyZWF0aW5nIGl0IGFzIGFic2VudCB3b3VsZCBzdHJpcCB0aGUgYmFkZ2Ugb3V0IG9mIGV2ZXJ5IHB1Ymxpc2hlZCByZXBvc2l0b3J5IHdiZnkgdG91Y2hlc1xuICogZHVyaW5nIHRoZSBvdXRhZ2UgYW5kIHB1dCBpdCBiYWNrIGFmdGVyd2FyZHMuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGlzTWlzc2luZ0Zyb21OcG1SZWdpc3RyeShwYWNrYWdlTmFtZTogc3RyaW5nKTogUHJvbWlzZTxib29sZWFuPiB7XG4gIHRyeSB7XG4gICAgLy8gVGhlIHNjb3BlIHNlcGFyYXRvciBtdXN0IHN1cnZpdmUgYXMgYSBwYXRoIHNlZ21lbnQsIHNvIHRoZSBuYW1lIGlzIGVuY29kZWQgcGllY2V3aXNlLlxuICAgIGNvbnN0IGVuY29kZWROYW1lID0gcGFja2FnZU5hbWUuc3BsaXQoJy8nKS5tYXAoZW5jb2RlVVJJQ29tcG9uZW50KS5qb2luKCcvJyk7XG4gICAgLy8gQSBiYWRnZSBpcyBkZWNvcmF0aW9uOiBhIHN0YWxsZWQgcmVnaXN0cnkgY29ubmVjdGlvbiBtdXN0IG5vdCBob2xkIHRoZSB3aG9sZSBydW4gZm9yIGhvd2V2ZXJcbiAgICAvLyBsb25nIHRoZSBuZXR3b3JraW5nIHN0YWNrIHdvdWxkIHdhaXQuIFRoZSBidWRnZXQgaXMgZ2VuZXJvdXMgYmVjYXVzZSBhIHRpbWVvdXQgYW5zd2Vyc1xuICAgIC8vIFwidW5rbm93blwiLCB3aGljaCBrZWVwcyB0aGUgYmFkZ2Ug4oCUIGFuZCBvbiBhIHJlcG9zaXRvcnkgdGhhdCBpcyBub3Qgb24gbnBtIHRoYXQgbWVhbnMgd3JpdGluZ1xuICAgIC8vIG9uZSBpdCBzaG91bGQgbm90IGhhdmU7IGEgd2JmeSBydW4gYWxyZWFkeSBzcGVuZHMgbWludXRlcyBvbiBpbnN0YWxscywgc28gd2FpdGluZyBhIGxpdHRsZVxuICAgIC8vIGxvbmdlciBmb3IgYSByZWFsIGFuc3dlciBjb3N0cyBsZXNzIHRoYW4gYWN0aW5nIG9uIGEgbWlzc2luZyBvbmUuXG4gICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaChgaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvJHtlbmNvZGVkTmFtZX1gLCB7XG4gICAgICBtZXRob2Q6ICdIRUFEJyxcbiAgICAgIHNpZ25hbDogQWJvcnRTaWduYWwudGltZW91dCgxMF8wMDApLFxuICAgIH0pO1xuICAgIHJldHVybiByZXNwb25zZS5zdGF0dXMgPT09IDQwNDtcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG59XG5cbmZ1bmN0aW9uIGJ1aWxkTnBtQmFkZ2UocGFja2FnZU5hbWU6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiBgWyFbbnBtIHZlcnNpb25dKGh0dHBzOi8vaW1nLnNoaWVsZHMuaW8vbnBtL3YvJHtwYWNrYWdlTmFtZX0uc3ZnKV0oJHtucG1QYWNrYWdlVXJsUHJlZml4fSR7cGFja2FnZU5hbWV9KWA7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGJ1aWxkV29ya2Zsb3dCYWRnZXMoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTxzdHJpbmdbXT4ge1xuICBjb25zdCByZXBvc2l0b3J5ID0gY29uZmlnLnJlcG9zaXRvcnk/LnNsaWNlKGNvbmZpZy5yZXBvc2l0b3J5LmluZGV4T2YoJzonKSArIDEpO1xuICBjb25zdCB3b3JrZmxvd3NQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnLmdpdGh1YicsICd3b3JrZmxvd3MnKTtcbiAgaWYgKCFyZXBvc2l0b3J5IHx8ICFmcy5leGlzdHNTeW5jKHdvcmtmbG93c1BhdGgpKSByZXR1cm4gW107XG5cbiAgLy8gV29ya2Zsb3cgYW5kIFJFQURNRSBnZW5lcmF0aW9uIHJ1biBjb25jdXJyZW50bHkuIERvIG5vdCByZXRhaW4gYSBzdGFsZSBSdXN0IGJhZGdlIHdoaWxlIHRoZVxuICAvLyB3b3JrZmxvdyBnZW5lcmF0b3IgcmVtb3ZlcyBhIGNhbGxlciBjcmVhdGVkIGZyb20gYSBmb3JtZXJseSBtaXNkZXRlY3RlZCBsb2NhbCBjYWNoZSDigJQgYnV0XG4gIC8vIG1pcnJvciBpdHMgb3duZXJzaGlwIGNoZWNrOiBhIGN1c3RvbSBzYW1lLW5hbWVkIHdvcmtmbG93IHN1cnZpdmVzLCBzbyBpdHMgYmFkZ2UgbXVzdCB0b28uXG4gIC8vIERlY2lkZWQgc3luY2hyb25vdXNseSBiZWZvcmUgdGhlIGxvb3AncyBmaXJzdCBhd2FpdDogdGhlIGdlbmVyYXRvcidzIGRlbGV0ZSBjYW4gb25seSBsYW5kIGF0XG4gIC8vIGFuIGF3YWl0IHBvaW50LCBhbmQgYSBwb3N0LWRlbGV0ZSByZWFkIHdvdWxkIG1pc3JlcG9ydCB0aGUgd2JmeS1vd25lZCBjYWxsZXIgYXMgY3VzdG9tLlxuICAvLyBObyBleGlzdHNTeW5jIHByZS1jaGVjazogdGhlIGhlbHBlciBhbHJlYWR5IHRyZWF0cyBhIG1pc3NpbmcgZmlsZSBhcyBub3Qgb3duZWQsIGFuZCB0aGlzIHJ1bnNcbiAgLy8gb25jZSBwZXIgcmVwb3NpdG9yeSwgc28gdGhlIGV4Y2VwdGlvbmFsIEVOT0VOVCByZWFkIGNvc3RzIG5vdGhpbmcgd29ydGggYSByZWR1bmRhbnQgc3RhdC5cbiAgY29uc3QgZHJvcHNUZXN0UnVzdEJhZGdlID1cbiAgICBjb25maWcuY2FyZ29Ub21sRGlyUGF0aHMubGVuZ3RoID09PSAwICYmIGpvYnNBbGxDYWxsUmV1c2FibGVXb3JrZmxvdyh3b3JrZmxvd3NQYXRoLCAndGVzdC1ydXN0LnltbCcsICd0ZXN0LXJ1c3QnKTtcblxuICBjb25zdCBiYWRnZXM6IHN0cmluZ1tdID0gW107XG4gIGZvciAoY29uc3QgZmlsZU5hbWUgb2YgZnMucmVhZGRpclN5bmMod29ya2Zsb3dzUGF0aCkpIHtcbiAgICBpZiAoIWZpbGVOYW1lLnN0YXJ0c1dpdGgoJ3Rlc3QnKSAmJiAhZmlsZU5hbWUuc3RhcnRzV2l0aCgnZGVwbG95JykpIGNvbnRpbnVlO1xuICAgIGlmIChmaWxlTmFtZSA9PT0gJ3Rlc3QtcnVzdC55bWwnICYmIGRyb3BzVGVzdFJ1c3RCYWRnZSkgY29udGludWU7XG4gICAgLy8gR2l0SHViJ3MgYmFkZ2UgZW5kcG9pbnQgcmV0dXJucyA0MDQgdW50aWwgdGhlIHdvcmtmbG93IGhhcyBhdCBsZWFzdCBvbmUgcnVuLCBzbyBhIGJhZGdlIGZvciBhXG4gICAgLy8gZGlzcGF0Y2gtb25seSBkZXBsb3kgd29ya2Zsb3cgdGhhdCBoYXMgbmV2ZXIgcnVuIHJlbmRlcnMgYXMgYSBicm9rZW4gaW1hZ2UuIFRlc3Qgd29ya2Zsb3dzIHJ1blxuICAgIC8vIG9uIGV2ZXJ5IFBSLCBzbyBvbmx5IGRlcGxveSBiYWRnZXMgbmVlZCB0aGUgZ3VhcmQuXG4gICAgaWYgKGZpbGVOYW1lLnN0YXJ0c1dpdGgoJ2RlcGxveScpICYmICEoYXdhaXQgaGFzQW55V29ya2Zsb3dSdW4ocmVwb3NpdG9yeSwgZmlsZU5hbWUsIGNvbmZpZy5pc1B1YmxpY1JlcG8pKSkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGNvbnN0IGJhZGdlTmFtZSA9IChmaWxlTmFtZVswXSA/PyAnJykudG9VcHBlckNhc2UoKSArIGZpbGVOYW1lLnNsaWNlKDEsIGZpbGVOYW1lLmluZGV4T2YoJy4nKSkucmVwbGFjZSgnLScsICcgJyk7XG4gICAgY29uc3Qgd29ya2Zsb3dVcmwgPSBgaHR0cHM6Ly9naXRodWIuY29tLyR7cmVwb3NpdG9yeX0vYWN0aW9ucy93b3JrZmxvd3MvJHtlbmNvZGVVcmxQYXRoKGZpbGVOYW1lKX1gO1xuICAgIGJhZGdlcy5wdXNoKGBbIVske2JhZGdlTmFtZX1dKCR7d29ya2Zsb3dVcmx9L2JhZGdlLnN2ZyldKCR7d29ya2Zsb3dVcmx9KWApO1xuICB9XG4gIHJldHVybiBiYWRnZXM7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGhhc0FueVdvcmtmbG93UnVuKFxuICByZXBvc2l0b3J5OiBzdHJpbmcsXG4gIHdvcmtmbG93RmlsZU5hbWU6IHN0cmluZyxcbiAgaXNQdWJsaWNSZXBvOiBib29sZWFuXG4pOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgY29uc3QgW293bmVyLCByZXBvXSA9IHJlcG9zaXRvcnkuc3BsaXQoJy8nKTtcbiAgaWYgKCFvd25lciB8fCAhcmVwbykgcmV0dXJuIHRydWU7XG4gIHRyeSB7XG4gICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBnZXRPY3Rva2l0KG93bmVyKS5yZXF1ZXN0KCdHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2FjdGlvbnMvd29ya2Zsb3dzL3t3b3JrZmxvd19pZH0vcnVucycsIHtcbiAgICAgIG93bmVyLFxuICAgICAgcmVwbyxcbiAgICAgIHdvcmtmbG93X2lkOiB3b3JrZmxvd0ZpbGVOYW1lLFxuICAgICAgcGVyX3BhZ2U6IDEsXG4gICAgfSk7XG4gICAgcmV0dXJuIHJlc3BvbnNlLmRhdGEudG90YWxfY291bnQgPiAwO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIC8vIEZvciBhIFBVQkxJQyByZXBvc2l0b3J5IHRoZSBydW5zIGVuZHBvaW50IG5lZWRzIG5vIGF1dGhvcml6YXRpb24sIHNvIDQwNCByZWxpYWJseSBtZWFucyB0aGVcbiAgICAvLyB3b3JrZmxvdyBpcyBhYnNlbnQgZnJvbSB0aGUgcmVtb3RlIChlLmcuIGFkZGVkIGxvY2FsbHksIG5ldmVyIHB1c2hlZCkg4oCUIGxpa2UgemVybyBydW5zLCBpdHNcbiAgICAvLyBiYWRnZSB3b3VsZCByZW5kZXIgYnJva2VuLiBGb3IgYSBQUklWQVRFIHJlcG9zaXRvcnkgR2l0SHViIGFsc28gYW5zd2VycyA0MDQgd2hlbiB0aGUgdG9rZW5cbiAgICAvLyBpcyBtaXNzaW5nIG9yIHVuZGVyLXNjb3BlZCwgc28gNDA0IGlzIGFtYmlndW91cyB0aGVyZSBhbmQgdGhlIGJhZGdlIGlzIGtlcHQuXG4gICAgaWYgKChlcnJvciBhcyB7IHN0YXR1cz86IG51bWJlciB9KS5zdGF0dXMgPT09IDQwNCAmJiBpc1B1YmxpY1JlcG8pIHJldHVybiBmYWxzZTtcbiAgICAvLyBLZWVwIHRoZSBwcmUtZ3VhcmQgYmVoYXZpb3IgKGluc2VydCB0aGUgYmFkZ2UpIHdoZW4gdGhlIGNoZWNrIGl0c2VsZiBjYW5ub3QgcnVuLlxuICAgIHJldHVybiB0cnVlO1xuICB9XG59XG5cbi8qKlxuICogUmVwbGFjZXMgdGhlIGJhZGdlIGJsb2NrIOKAlCB0aGUgYmFkZ2VzIHdiZnkga2VlcHMgZGlyZWN0bHkgdW5kZXIgdGhlIHRpdGxlIOKAlCB3aXRoIGBtYW5hZ2VkQmFkZ2VzYCxcbiAqIGtlZXBpbmcgYW55IGJhZGdlIHRoZXJlIHRoYXQgd2JmeSBkb2VzIG5vdCBtYW5hZ2UsIGFuZCByZWFzc2VtYmxlcyB0aGUgUkVBRE1FIGFyb3VuZCBpdCB3aXRoXG4gKiBleGFjdGx5IG9uZSBibGFuayBsaW5lIG9uIGVhY2ggc2lkZS5cbiAqXG4gKiBCb3RoIHRoZSB0aXRsZSBhbmQgdGhlIGJsb2NrIGFyZSBsb2NhdGVkIGluIGEgQ29tbW9uTWFyayBzeW50YXggdHJlZSByYXRoZXIgdGhhbiBieSBzY2FubmluZ1xuICogbGluZXM6IG9ubHkgYSByZWFsIHBhcnNlciBrbm93cyB3aGV0aGVyIGEgbGluZSB0aGF0IGxvb2tzIGxpa2UgYSBiYWRnZSBpcyBhIGJhZGdlIChhIHBhcmFncmFwaCBvZlxuICogbGlua2VkIGltYWdlcykgb3IgY29udGVudCB0aGF0IG1lcmVseSByZWFkcyBsaWtlIG9uZSAoYW4gaW5kZW50ZWQgY29kZSBibG9jaywgYSBibG9jayBxdW90ZSwgYVxuICogZmVuY2VkIGV4YW1wbGUsIGEgbXVsdGlsaW5lIGNvZGUgc3BhbiwgYW4gSFRNTCBibG9jaykuIEV2ZXJ5dGhpbmcgb3V0c2lkZSB0aGUgYmxvY2sgaXMgY29waWVkIGJhY2tcbiAqIHZlcmJhdGltIGZyb20gdGhlIG9yaWdpbmFsIHRleHQgdGhyb3VnaCB0aGUgcGFyc2VyJ3MgcG9zaXRpb25hbCBvZmZzZXRzLCBzbyBubyByZWZvcm1hdHRpbmcgb2YgdGhlXG4gKiB1c2VyJ3MgY29udGVudCBpcyBwb3NzaWJsZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHdyaXRlQmFkZ2VCbG9jayhyZWFkbWU6IHN0cmluZywgbWFuYWdlZEJhZGdlczogc3RyaW5nW10pOiBzdHJpbmcge1xuICBjb25zdCBsaW5lRW5kaW5nID0gZ2V0TGluZUVuZGluZyhyZWFkbWUpO1xuICAvLyBBIEJPTSBpcyBub3QgTWFya2Rvd246IGxlZnQgaW4gdGhlIHRleHQgaXQgaGlkZXMgdGhlIGAjYCBvZiB0aGUgdGl0bGUgZnJvbSB0aGUgcGFyc2VyLCBhbmRcbiAgLy8gcHJlcGVuZGluZyB0aGUgYmxvY2sgYWhlYWQgb2YgaXQgd291bGQgc3RyaXAgdGhlIG1hcmtlciBmcm9tIHRoZSBmaWxlJ3MgZmlyc3QgYnl0ZS5cbiAgY29uc3QgYnl0ZU9yZGVyTWFyayA9IHJlYWRtZS5zdGFydHNXaXRoKCfvu78nKSA/ICfvu78nIDogJyc7XG4gIC8vIEZyb250IG1hdHRlciBpcyBkZWxpbWl0ZWQgYnkgdGhlIHNhbWUgYC0tLWAgYSBTZXRleHQgaGVhZGluZyBhbmQgYSB0aGVtYXRpYyBicmVhayB1c2UsIHNvIGl0IGlzXG4gIC8vIGRldGFjaGVkIGJlZm9yZSBwYXJzaW5nIGluc3RlYWQgb2YgYmVpbmcgdG9sZCBhcGFydCBhZnRlcndhcmRzOyBpdCBhbHNvIGhhcyB0byBzdGF5IGZpcnN0IGluIHRoZVxuICAvLyBmaWxlLCB3aGljaCBtYWtlcyBpdCBhIHByZWZpeCBpbiBleGFjdGx5IHRoZSBzYW1lIHdheSB0aGUgQk9NIGlzLlxuICBjb25zdCB3aXRob3V0TWFyayA9IHJlYWRtZS5zbGljZShieXRlT3JkZXJNYXJrLmxlbmd0aCk7XG4gIGNvbnN0IGZyb250TWF0dGVyID0gd2l0aG91dE1hcmsuc3RhcnRzV2l0aCgnLS0tJylcbiAgICA/ICgvXi0tLVsgXFx0XSpcXHI/XFxuW1xcc1xcU10qP14tLS1bIFxcdF0qKD86XFxyP1xcbnwkKS9tdS5leGVjKHdpdGhvdXRNYXJrKT8uWzBdID8/ICcnKVxuICAgIDogJyc7XG4gIGNvbnN0IHByZWZpeCA9IGAke2J5dGVPcmRlck1hcmt9JHtmcm9udE1hdHRlcn1gO1xuICAvLyBUaGUgZmluYWwgbmV3bGluZSBpcyBzZXQgYXNpZGUgcmF0aGVyIHRoYW4gcGFyc2VkIGFzIHRyYWlsaW5nIGJsYW5rIHNwYWNlLCB3aGljaCB0aGUgYmxhbmstbGluZVxuICAvLyB0cmltbWluZyBiZWxvdyB3b3VsZCBvdGhlcndpc2Ugc3dhbGxvdy5cbiAgY29uc3QgZW5kc1dpdGhOZXdsaW5lID0gL1xccj9cXG4kL3UudGVzdChyZWFkbWUpO1xuICBjb25zdCBjb250ZW50ID0gd2l0aG91dE1hcmsuc2xpY2UoZnJvbnRNYXR0ZXIubGVuZ3RoKS5yZXBsYWNlKC9cXHI/XFxuJC91LCAnJyk7XG5cbiAgY29uc3Qgbm9kZXMgPSBmcm9tTWFya2Rvd24oY29udGVudCkuY2hpbGRyZW47XG4gIC8vIEEgbGVhZGluZyBiYWRnZSBibG9jayBpcyB0aGUgdXNlcidzIG93biBsYXlvdXQ6IGl0IHN0YXlzIGFib3ZlIHRoZSB0aXRsZSwgYW5kIHdiZnkncyBibG9jayBnb2VzIGJlbG93LlxuICBjb25zdCBrZWVwc0xlYWRpbmdCbG9jayA9ICEhbm9kZXNbMF0gJiYgaXNCYWRnZUJsb2NrTm9kZShub2Rlc1swXSkgJiYgaXNUaXRsZU5vZGUobm9kZXNbMV0pO1xuICBjb25zdCB0aXRsZUluZGV4ID0ga2VlcHNMZWFkaW5nQmxvY2sgPyAxIDogaXNUaXRsZU5vZGUobm9kZXNbMF0pID8gMCA6IC0xO1xuICAvLyBXaXRob3V0IGEgcmVjb2duaXphYmxlIHRpdGxlIHRoZSBibG9jayBzaXRzIGF0IHRoZSB2ZXJ5IHRvcCwgYWJvdmUgZXZlcnl0aGluZy5cbiAgY29uc3QgaGVhZFN0YXJ0Tm9kZSA9IGtlZXBzTGVhZGluZ0Jsb2NrID8gbm9kZXNbMF0hIDogbm9kZXNbdGl0bGVJbmRleF07XG4gIGNvbnN0IGhlYWQgPVxuICAgIHRpdGxlSW5kZXggPT09IC0xXG4gICAgICA/ICcnXG4gICAgICA6IGNvbnRlbnQuc2xpY2Uoc3RhcnRPZmZzZXRXaXRoSW5kZW50KGNvbnRlbnQsIGhlYWRTdGFydE5vZGUhKSwgbm9kZXNbdGl0bGVJbmRleF0hLnBvc2l0aW9uIS5lbmQub2Zmc2V0KTtcblxuICBjb25zdCBibG9ja05vZGUgPSBub2Rlc1t0aXRsZUluZGV4ICsgMV07XG4gIGNvbnN0IGV4aXN0aW5nID0gYmxvY2tOb2RlICYmIGlzQmFkZ2VCbG9ja05vZGUoYmxvY2tOb2RlKSA/IHJlYWRCYWRnZXMoYmxvY2tOb2RlLCBjb250ZW50KSA6IHVuZGVmaW5lZDtcbiAgY29uc3QgYm9keU5vZGUgPSBleGlzdGluZyAmJiBibG9ja05vZGUgPyBub2Rlc1tub2Rlcy5pbmRleE9mKGJsb2NrTm9kZSkgKyAxXSA6IGJsb2NrTm9kZTtcbiAgY29uc3QgYm9keSA9IGJvZHlOb2RlID8gY29udGVudC5zbGljZShzdGFydE9mZnNldFdpdGhJbmRlbnQoY29udGVudCwgYm9keU5vZGUpKSA6ICcnO1xuXG4gIC8vIFN1cGVyc2VkaW5nIGEgbWFuYWdlZCBiYWRnZSBpcyBqdXN0IGRyb3BwaW5nIHRoZSBvbGQgb25lOiBhIHZlcnNpb24gb3Igd29ya2Zsb3cgY2hhbmdlIGxlYXZlc1xuICAvLyBubyBzdGFsZSBjb3B5LCB3aGlsZSBhbnkgb3RoZXIgYmFkZ2UgaW4gdGhlIGJsb2NrIChpbmNsdWRpbmcgYSBub24tY2Fub25pY2FsIHdiZnkgYmFkZ2UsIHdoaWNoXG4gIC8vIGlzIHJlbW92ZWQgbWFudWFsbHkpIGlzIGtlcHQuXG4gIGNvbnN0IGJhZGdlcyA9IFsuLi5tYW5hZ2VkQmFkZ2VzLCAuLi4oZXhpc3RpbmcgPz8gW10pLmZpbHRlcigoYmFkZ2UpID0+ICFpc01hbmFnZWRCYWRnZShiYWRnZSkpXTtcbiAgLy8gQ29udGVudCBpcyBzbGljZWQgZnJvbSBpdHMgbm9kZSdzIHN0YXJ0IG9mZnNldCwgc28gd2hhdGV2ZXIgYmxhbmsgc3BhY2UgZm9sbG93ZWQgdGhlIGZyb250XG4gIC8vIG1hdHRlciBpcyBnb25lOyBleGFjdGx5IG9uZSBibGFuayBsaW5lIGlzIHJlc3RvcmVkIGhlcmUuIEEgY2xvc2luZyBkZWxpbWl0ZXIgdGhhdCBlbmRlZCBhdCBFT0ZcbiAgLy8gY2FycmllcyBubyBuZXdsaW5lIG9mIGl0cyBvd24gYW5kIG5lZWRzIGJvdGgsIG9yIGAtLS1gIHdvdWxkIGZ1c2Ugd2l0aCB0aGUgZmlyc3QgYmFkZ2UgYW5kXG4gIC8vIGRlc3Ryb3kgdGhlbSBib3RoLiBBIEJPTSBuZWVkcyBubyBzZXBhcmF0b3I6IGl0IGlzIGEgYnl0ZSBtYXJrZXIsIG5vdCBhIGxpbmUuXG4gIGNvbnN0IHNlcGFyYXRvciA9IGZyb250TWF0dGVyID8gKC9cXHI/XFxuJC91LnRlc3QoZnJvbnRNYXR0ZXIpID8gbGluZUVuZGluZyA6IGAke2xpbmVFbmRpbmd9JHtsaW5lRW5kaW5nfWApIDogJyc7XG4gIGNvbnN0IHJlc3VsdCA9XG4gICAgcHJlZml4ICsgc2VwYXJhdG9yICsgW2hlYWQsIGJhZGdlcy5qb2luKGxpbmVFbmRpbmcpLCBib2R5XS5maWx0ZXIoQm9vbGVhbikuam9pbihgJHtsaW5lRW5kaW5nfSR7bGluZUVuZGluZ31gKTtcbiAgcmV0dXJuIGVuZHNXaXRoTmV3bGluZSA/IGAke3Jlc3VsdH0ke2xpbmVFbmRpbmd9YCA6IHJlc3VsdDtcbn1cblxuLyoqXG4gKiBBIG5vZGUncyBzdGFydCBvZmZzZXQsIGV4dGVuZGVkIGJhY2sgb3ZlciB0aGUgbGVhZGluZyB3aGl0ZXNwYWNlIG9uIGl0cyBvd24gbGluZS4gQ29tbW9uTWFya1xuICogYWxsb3dzIG9uZSB0byB0aHJlZSBzcGFjZXMgb2YgaW5kZW50YXRpb24gYmVmb3JlIGEgYmxvY2ssIGFuZCBtZGFzdCByZXBvcnRzIHRoZSBvZmZzZXQgQUZURVJcbiAqIHRoZW0g4oCUIHNvIHNsaWNpbmcgZnJvbSBpdCBzaWxlbnRseSByZWluZGVudHMgY29udGVudCB0aGlzIGdlbmVyYXRvciBwcm9taXNlcyB0byBjb3B5IHZlcmJhdGltLlxuICovXG5mdW5jdGlvbiBzdGFydE9mZnNldFdpdGhJbmRlbnQoY29udGVudDogc3RyaW5nLCBub2RlOiBSb290Q29udGVudCk6IG51bWJlciB7XG4gIGNvbnN0IHN0YXJ0ID0gbm9kZS5wb3NpdGlvbiEuc3RhcnQub2Zmc2V0ITtcbiAgY29uc3QgbGluZVN0YXJ0ID0gY29udGVudC5sYXN0SW5kZXhPZignXFxuJywgc3RhcnQgLSAxKSArIDE7XG4gIHJldHVybiAvXlsgXFx0XSokL3UudGVzdChjb250ZW50LnNsaWNlKGxpbmVTdGFydCwgc3RhcnQpKSA/IGxpbmVTdGFydCA6IHN0YXJ0O1xufVxuXG4vKipcbiAqIFdoZXRoZXIgdGhlIG5vZGUgb3BlbnMgdGhlIFJFQURNRSB3aXRoIGEgdGl0bGUuIE9ubHkgdGhlIEZJUlNUIHBpZWNlIG9mIGNvbnRlbnQgY2FuIGJlIG9uZTogYVxuICogdGl0bGUgaXMgd2hhdCBhIFJFQURNRSBvcGVucyB3aXRoLCBhbmQgYW5jaG9yaW5nIHRoZSBiYWRnZXMgdG8gYSBoZWFkaW5nIGZ1cnRoZXIgZG93biB3b3VsZCBidXJ5XG4gKiB0aGVtIGJlbG93IGNvbnRlbnQgdGhlIGF1dGhvciBwdXQgZmlyc3QuXG4gKi9cbmZ1bmN0aW9uIGlzVGl0bGVOb2RlKG5vZGU6IFJvb3RDb250ZW50IHwgdW5kZWZpbmVkKTogYm9vbGVhbiB7XG4gIGlmICghbm9kZSkgcmV0dXJuIGZhbHNlO1xuICBpZiAobm9kZS50eXBlID09PSAnaGVhZGluZycpIHJldHVybiB0cnVlO1xuICAvLyBNYW55IFJFQURNRXMgY2VudGVyIHRoZWlyIHRpdGxlIGluIEhUTUwgKGA8aDE+YCwgb3IgYSBgPGRpdj5gL2A8cD5gIHdyYXBwaW5nIG9uZSksIHdoaWNoIHRoZVxuICAvLyBwYXJzZXIgcmVwb3J0cyBhcyBvbmUgb3BhcXVlIEhUTUwgYmxvY2s7IHRoZSBiYWRnZXMgZ28gYWZ0ZXIgdGhlIHdob2xlIGJsb2NrLlxuICByZXR1cm4gbm9kZS50eXBlID09PSAnaHRtbCcgJiYgY29udGFpbnNSZW5kZXJlZEgxKG5vZGUudmFsdWUpO1xufVxuXG4vKipcbiAqIFdoZXRoZXIgdGhlIEhUTUwgYmxvY2sgdW5hbWJpZ3VvdXNseSBSRU5ERVJTIGFuIGA8aDE+YCDigJQgdGhlIGNlbnRlcmVkLXRpdGxlIGxheW91dCBtYW55IFJFQURNRXNcbiAqIHVzZSAoYDxoMT5gLCBvciBhIGA8ZGl2PmAvYDxwPmAgd3JhcHBpbmcgb25lKS5cbiAqXG4gKiBEZWxpYmVyYXRlbHkgTk9UIGEgZ2VuZXJhbCBIVE1MIHBhcnNlci4gRGVjaWRpbmcgdGhpcyBleGFjdGx5IHJlcXVpcmVzIHRoZSByZWFsIHRva2VuaXplcidzXG4gKiBzdGF0ZXMg4oCUIHJhdyB0ZXh0LCBSQ0RBVEEsIHNjcmlwdCBkYXRhLCBhdHRyaWJ1dGUgdmFsdWVzLCB0ZW1wbGF0ZSBjb250ZW50cywgZGVjbGFyYXRpb25zIOKAlCBhbmRcbiAqIGFwcHJveGltYXRpbmcgdGhlbSB3aXRoIHJlZ2V4ZXMgaXMgdGhlIHNhbWUgbG9zaW5nIGdhbWUgdGhlIE1hcmtkb3duIHNjYW5uaW5nIHRoaXMgbW9kdWxlXG4gKiByZXBsYWNlZCB3YXMgcGxheWluZy4gU28gdGhlIHJ1bGUgaXM6IHRva2VuaXplIG9ubHkgdGhlIHNpbXBsZSBjYXNlLCBhbmQgdHJlYXQgYW55dGhpbmcgY2FycnlpbmdcbiAqIGEgY29uc3RydWN0IHdob3NlIHBhcnNpbmcgZGVwZW5kcyBvbiB0aG9zZSBzdGF0ZXMgYXMgTk9UIGEgdGl0bGUuIEJlaW5nIHdyb25nIHRoYXQgd2F5IHB1dHMgdGhlXG4gKiBiYWRnZXMgYXQgdGhlIHRvcCBvZiB0aGUgZmlsZSwgd2hpY2ggaXMgbWVyZWx5IHVuaGVscGZ1bDsgYmVpbmcgd3JvbmcgdGhlIG90aGVyIHdheSByZXdyaXRlcyB0aGVcbiAqIHVzZXIncyBSRUFETUUgYXJvdW5kIHRoZSB3cm9uZyBhbmNob3IuXG4gKi9cbmZ1bmN0aW9uIGNvbnRhaW5zUmVuZGVyZWRIMShodG1sOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgLy8gQ29tbWVudHMgY2Fubm90IG5lc3QgYW5kIGVuZCB1bmFtYmlndW91c2x5LCBzbyB0aGV5IGFyZSBzaW1wbHkgcmVtb3ZlZCByYXRoZXIgdGhhbiBkaXNxdWFsaWZ5aW5nLlxuICBjb25zdCB3aXRob3V0Q29tbWVudHMgPSBodG1sLnJlcGxhY2VBbGwoLzwhLS1bXFxzXFxTXSo/KD86LS0+fCQpL2d1LCAnJyk7XG4gIC8vIENEQVRBLCBwcm9jZXNzaW5nIGluc3RydWN0aW9ucywgZGVjbGFyYXRpb25zLCBlbGVtZW50cyB3aG9zZSBjb250ZW50IGlzIHJhdyB0ZXh0IC8gUkNEQVRBIC9cbiAgLy8gc2NyaXB0IGRhdGEsIGFuZCBgPHRlbXBsYXRlPmAgKHdob3NlIGNvbnRlbnRzIGFyZSBpbmVydCkuIEEgcXVvdGVkIGF0dHJpYnV0ZSBjb250YWluaW5nIGA8YFxuICAvLyBtYWtlcyBldmVuIGxvY2F0aW5nIHRoZXNlIHVucmVsaWFibGUsIHNvIGl0IGRpc3F1YWxpZmllcyB0aGUgYmxvY2sgdG9vLlxuICBjb25zdCBhbWJpZ3VvdXNDb25zdHJ1Y3RQYXR0ZXJuID1cbiAgICAvPCFcXFtDREFUQVxcW3w8XFw/fDwhW2EtekEtWl18PFxcLz8oPzpzY3JpcHR8c3R5bGV8dGV4dGFyZWF8dGl0bGV8aWZyYW1lfG5vZnJhbWVzfG5vZW1iZWR8eG1wfHRlbXBsYXRlKVxcYnxcIlteXCJdKjxbXlwiXSpcInwnW14nXSo8W14nXSonL2l1O1xuICBpZiAoYW1iaWd1b3VzQ29uc3RydWN0UGF0dGVybi50ZXN0KHdpdGhvdXRDb21tZW50cykpIHJldHVybiBmYWxzZTtcbiAgLy8gUXVvdGluZyBpcyBzaWduaWZpY2FudCBvbmx5IGluc2lkZSBhIHN0YXJ0IHRhZywgc28gYW4gYXR0cmlidXRlIHZhbHVlIGlzIGNvbnN1bWVkIHdpdGggaXRzIG93blxuICAvLyB0YWcgd2hpbGUgcXVvdGF0aW9uIG1hcmtzIGluIG9yZGluYXJ5IHRleHQgc3RheSB0ZXh0OiBgPGRpdiB0aXRsZT1cIiZsdDtoMSZndDtcIj5gIGRvZXMgbm90IGNvdW50LFxuICAvLyBgXCI8aDE+UHJvamVjdDwvaDE+XCJgIGRvZXMuXG4gIGNvbnN0IHN0YXJ0VGFnUGF0dGVybiA9IC88KFthLXpBLVpdW15cXHMvPl0qKSg/OlwiW15cIl0qXCJ8J1teJ10qJ3xbXj5cIiddKSo+L2d1O1xuICBmb3IgKGNvbnN0IG1hdGNoIG9mIHdpdGhvdXRDb21tZW50cy5tYXRjaEFsbChzdGFydFRhZ1BhdHRlcm4pKSB7XG4gICAgaWYgKG1hdGNoWzFdPy50b0xvd2VyQ2FzZSgpID09PSAnaDEnKSByZXR1cm4gdHJ1ZTtcbiAgfVxuICByZXR1cm4gZmFsc2U7XG59XG5cbi8qKiBXaGV0aGVyIHRoZSBub2RlIGlzIGEgcGFyYWdyYXBoIG9mIGJhZGdlcyBhbmQgbm90aGluZyBlbHNlIOKAlCB0aGUgb25seSBjb250ZW50IHdiZnkgcHV0cyBpbiB0aGUgYmxvY2suICovXG5mdW5jdGlvbiBpc0JhZGdlQmxvY2tOb2RlKG5vZGU6IFJvb3RDb250ZW50KTogbm9kZSBpcyBQYXJhZ3JhcGgge1xuICByZXR1cm4gKFxuICAgIG5vZGUudHlwZSA9PT0gJ3BhcmFncmFwaCcgJiZcbiAgICBub2RlLmNoaWxkcmVuLnNvbWUoKGNoaWxkKSA9PiBpc0JhZGdlTm9kZShjaGlsZCkpICYmXG4gICAgbm9kZS5jaGlsZHJlbi5ldmVyeShcbiAgICAgIChjaGlsZCkgPT4gaXNCYWRnZU5vZGUoY2hpbGQpIHx8IGNoaWxkLnR5cGUgPT09ICdicmVhaycgfHwgKGNoaWxkLnR5cGUgPT09ICd0ZXh0JyAmJiAhY2hpbGQudmFsdWUudHJpbSgpKVxuICAgIClcbiAgKTtcbn1cblxuLyoqIEEgYmFkZ2UgaXMgb25lIGBbIVthbHRdKGltYWdlKV0obGluaylgLCB0aGUgb25seSBzaGFwZSB3YmZ5IGV2ZXIgd3JpdGVzLiAqL1xuZnVuY3Rpb24gaXNCYWRnZU5vZGUobm9kZTogUm9vdENvbnRlbnQgfCBQaHJhc2luZ0NvbnRlbnQpOiBub2RlIGlzIExpbmsgJiB7IGNoaWxkcmVuOiBbSW1hZ2VdIH0ge1xuICByZXR1cm4gbm9kZS50eXBlID09PSAnbGluaycgJiYgbm9kZS5jaGlsZHJlbi5sZW5ndGggPT09IDEgJiYgbm9kZS5jaGlsZHJlblswXT8udHlwZSA9PT0gJ2ltYWdlJztcbn1cblxuLyoqXG4gKiBUaGUgYmFkZ2VzIGluIHRoZSBibG9jaywgYXMgdGhlIGV4YWN0IHNvdXJjZSB0ZXh0IHRoYXQgcHJvZHVjZWQgdGhlbTogYSBiYWRnZSB3YmZ5IGRvZXMgbm90IG1hbmFnZVxuICogaXMgd3JpdHRlbiBiYWNrIGJ5dGUgZm9yIGJ5dGUgaW5zdGVhZCBvZiBiZWluZyByZS1zZXJpYWxpemVkIGZyb20gdGhlIHRyZWUuXG4gKi9cbmZ1bmN0aW9uIHJlYWRCYWRnZXMobm9kZTogUGFyYWdyYXBoLCBjb250ZW50OiBzdHJpbmcpOiBzdHJpbmdbXSB7XG4gIHJldHVybiBub2RlLmNoaWxkcmVuXG4gICAgLmZpbHRlcigoY2hpbGQpID0+IGlzQmFkZ2VOb2RlKGNoaWxkKSlcbiAgICAubWFwKChjaGlsZCkgPT4gY29udGVudC5zbGljZShjaGlsZC5wb3NpdGlvbiEuc3RhcnQub2Zmc2V0LCBjaGlsZC5wb3NpdGlvbiEuZW5kLm9mZnNldCkpO1xufVxuXG4vKipcbiAqIFBlcmNlbnQtZW5jb2RlcyB0aGUgY2hhcmFjdGVycyB0aGF0IHdvdWxkIGVuZCBhIE1hcmtkb3duIGRlc3RpbmF0aW9uIGVhcmx5LiBBIHdvcmtmbG93IGZpbGUgbWF5IGJlXG4gKiBuYW1lZCBhbnl0aGluZyB3aXRoIGEgYC55bWxgIGV4dGVuc2lvbiwgYW5kIG9uZSBjb250YWluaW5nIGAoYCBvciBgKWAgcHJvZHVjZWQgYSBiYWRnZSB0aGF0IHdiZnknc1xuICogb3duIGJhZGdlIHBhdHRlcm4gY291bGQgbm90IHJlYWQgYmFjayDigJQgc28gdGhlIGxpbmUgbGVmdCB0aGUgYmxvY2sgYW5kIHRoZSBiYWRnZSB3YXMgZHVwbGljYXRlZC5cbiAqL1xuZnVuY3Rpb24gZW5jb2RlVXJsUGF0aCh2YWx1ZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIHZhbHVlLnJlcGxhY2VBbGwoL1soKVxcc10vZ3UsIChjaGFyYWN0ZXIpID0+IGAlJHtjaGFyYWN0ZXIuY29kZVBvaW50QXQoMCkhLnRvU3RyaW5nKDE2KS50b1VwcGVyQ2FzZSgpfWApO1xufVxuXG4vKiogV2hldGhlciB0aGUgYmFkZ2UgaXMgb25lIHdiZnkgd3JpdGVzIGl0c2VsZiwgYW5kIHNvIG1heSBiZSByZXBsYWNlZCBieSB0aGUgY3VycmVudCBibG9jay4gKi9cbmZ1bmN0aW9uIGlzTWFuYWdlZEJhZGdlKGJhZGdlOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgcmV0dXJuIGJhZGdlID09PSBzZW1hbnRpY1JlbGVhc2VCYWRnZSB8fCBtYW5hZ2VkQmFkZ2VQYXR0ZXJucy5zb21lKChwYXR0ZXJuKSA9PiBwYXR0ZXJuLnRlc3QoYmFkZ2UpKTtcbn1cblxuZnVuY3Rpb24gZ2V0TGluZUVuZGluZyhjb250ZW50OiBzdHJpbmcpOiAnXFxuJyB8ICdcXHJcXG4nIHtcbiAgcmV0dXJuIGNvbnRlbnQuaW5jbHVkZXMoJ1xcclxcbicpID8gJ1xcclxcbicgOiAnXFxuJztcbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCBtZXJnZSBmcm9tICdkZWVwbWVyZ2UnO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBmc1V0aWwgfSBmcm9tICcuLi91dGlscy9mc1V0aWwuanMnO1xuaW1wb3J0IHsgb3ZlcndyaXRlTWVyZ2UgfSBmcm9tICcuLi91dGlscy9tZXJnZVV0aWwuanMnO1xuaW1wb3J0IHsgcHJvbWlzZVBvb2wgfSBmcm9tICcuLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZW5lcmF0ZVJlbGVhc2VyYyhyb290Q29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZ2VuZXJhdGVSZWxlYXNlcmMnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLnJlc29sdmUocm9vdENvbmZpZy5kaXJQYXRoLCAnLnJlbGVhc2VyYy5qc29uJyk7XG4gICAgaWYgKCFmcy5leGlzdHNTeW5jKGZpbGVQYXRoKSkgcmV0dXJuO1xuXG4gICAgY29uc3Qgc2V0dGluZ3MgPSBKU09OLnBhcnNlKGF3YWl0IGZzLnByb21pc2VzLnJlYWRGaWxlKGZpbGVQYXRoLCAndXRmOCcpKSBhcyB7XG4gICAgICBwbHVnaW5zPzogKHN0cmluZyB8IFtzdHJpbmcsIHVua25vd25dKVtdO1xuICAgICAgZXh0ZW5kcz86IHVua25vd247XG4gICAgfTtcbiAgICBjb25zdCBwbHVnaW5zID0gc2V0dGluZ3MucGx1Z2lucyA/PyBbXTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHBsdWdpbnMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNvbnN0IHBsdWdpbkVudHJ5ID0gcGx1Z2luc1tpXTtcbiAgICAgIGNvbnN0IGlzQXJyYXkgPSBBcnJheS5pc0FycmF5KHBsdWdpbkVudHJ5KTtcbiAgICAgIGNvbnN0IHBsdWdpbiA9IGlzQXJyYXkgPyBwbHVnaW5FbnRyeVswXSA6IHBsdWdpbkVudHJ5O1xuICAgICAgY29uc3Qgb2xkQ29uZmlnID0gKGlzQXJyYXkgJiYgcGx1Z2luRW50cnlbMV0pIHx8IHt9O1xuICAgICAgaWYgKHBsdWdpbiA9PT0gJ0BzZW1hbnRpYy1yZWxlYXNlL2NvbW1pdC1hbmFseXplcicpIHtcbiAgICAgICAgcGx1Z2luc1tpXSA9IFtcbiAgICAgICAgICAnQHNlbWFudGljLXJlbGVhc2UvY29tbWl0LWFuYWx5emVyJyxcbiAgICAgICAgICBtZXJnZS5hbGwoXG4gICAgICAgICAgICBbXG4gICAgICAgICAgICAgIG9sZENvbmZpZyxcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHByZXNldDogJ2NvbnZlbnRpb25hbGNvbW1pdHMnLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIHsgYXJyYXlNZXJnZTogb3ZlcndyaXRlTWVyZ2UgfVxuICAgICAgICAgICksXG4gICAgICAgIF07XG4gICAgICB9IGVsc2UgaWYgKHBsdWdpbiA9PT0gJ0BzZW1hbnRpYy1yZWxlYXNlL2dpdGh1YicpIHtcbiAgICAgICAgcGx1Z2luc1tpXSA9IFtcbiAgICAgICAgICAnQHNlbWFudGljLXJlbGVhc2UvZ2l0aHViJyxcbiAgICAgICAgICBtZXJnZS5hbGwoXG4gICAgICAgICAgICBbXG4gICAgICAgICAgICAgIG9sZENvbmZpZyxcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIC8vIGNmLiBodHRwczovL2dpdGh1Yi5jb20vc2VtYW50aWMtcmVsZWFzZS9zZW1hbnRpYy1yZWxlYXNlL2lzc3Vlcy8yMjA0I2lzc3VlY29tbWVudC0xNTA4NDE3NzA0XG4gICAgICAgICAgICAgICAgc3VjY2Vzc0NvbW1lbnRDb25kaXRpb246IGZhbHNlLFxuICAgICAgICAgICAgICAgIGZhaWxDb21tZW50Q29uZGl0aW9uOiBmYWxzZSxcbiAgICAgICAgICAgICAgICBsYWJlbHM6IFsncjogc2VtYW50aWMtcmVsZWFzZSddLFxuICAgICAgICAgICAgICAgIHJlbGVhc2VkTGFiZWxzOiBbJ3JlbGVhc2VkIDpib29rbWFyazonXSxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICB7IGFycmF5TWVyZ2U6IG92ZXJ3cml0ZU1lcmdlIH1cbiAgICAgICAgICApLFxuICAgICAgICBdO1xuICAgICAgfVxuICAgIH1cbiAgICBjb25zdCBuZXdDb250ZW50ID0gSlNPTi5zdHJpbmdpZnkoc2V0dGluZ3MsIHVuZGVmaW5lZCwgMik7XG4gICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzVXRpbC5nZW5lcmF0ZUZpbGUoZmlsZVBhdGgsIG5ld0NvbnRlbnQpKTtcbiAgfSk7XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgbWVyZ2UgZnJvbSAnZGVlcG1lcmdlJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZnNVdGlsIH0gZnJvbSAnLi4vdXRpbHMvZnNVdGlsLmpzJztcbmltcG9ydCB7IGpzb25jVXRpbCB9IGZyb20gJy4uL3V0aWxzL2pzb25jVXRpbC5qcyc7XG5pbXBvcnQgeyBvdmVyd3JpdGVNZXJnZSB9IGZyb20gJy4uL3V0aWxzL21lcmdlVXRpbC5qcyc7XG5cbmNvbnN0IHNoYXJlZFByZXNldCA9ICdnaXRodWI+V2lsbEJvb3N0ZXIvd2lsbGJvb3N0ZXItY29uZmlnczpyZW5vdmF0ZS5qc29uYyc7XG5jb25zdCBnZW5lcmF0ZWRTZXR0aW5ncyA9IHtcbiAgJHNjaGVtYTogJ2h0dHBzOi8vZG9jcy5yZW5vdmF0ZWJvdC5jb20vcmVub3ZhdGUtc2NoZW1hLmpzb24nLFxuICBleHRlbmRzOiBbc2hhcmVkUHJlc2V0XSxcbn07XG5cbnR5cGUgU2V0dGluZ3MgPSBQYXJ0aWFsPHR5cGVvZiBnZW5lcmF0ZWRTZXR0aW5ncz4gJiB7XG4gIHBhY2thZ2VSdWxlcz86IHsgbWF0Y2hQYWNrYWdlTmFtZXM6IHN0cmluZ1tdOyBlbmFibGVkPzogYm9vbGVhbiB9W107XG59O1xuXG5jb25zdCBtYW5hZ2VkRmlsZU5hbWUgPSAncmVub3ZhdGUuanNvbmMnO1xuXG4vLyB3YmZ5IHN1cHBvcnRzIG9uZSBjYW5vbmljYWwgUmVub3ZhdGUgbG9jYXRpb24uIE5vbi1jYW5vbmljYWwgY29uZmlncyBhcmUgZml4ZWQgaW4gdGhlIHRhcmdldFxuLy8gcmVwb3NpdG9yeSBpbnN0ZWFkIG9mIGJlaW5nIHBhcnNlZCwgbWVyZ2VkLCBvciBkZWxldGVkIGhlcmUuXG5jb25zdCBub25DYW5vbmljYWxDb25maWdQYXRocyA9IFtcbiAgJ3Jlbm92YXRlLmpzb24nLFxuICAncmVub3ZhdGUuanNvbjUnLFxuICAnLmdpdGh1Yi9yZW5vdmF0ZS5qc29uJyxcbiAgJy5naXRodWIvcmVub3ZhdGUuanNvbmMnLFxuICAnLmdpdGh1Yi9yZW5vdmF0ZS5qc29uNScsXG4gICcucmVub3ZhdGVyYycsXG4gICcucmVub3ZhdGVyYy5qc29uJyxcbiAgJy5yZW5vdmF0ZXJjLmpzb241Jyxcbl07XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZW5lcmF0ZVJlbm92YXRlSnNvbmMoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZ2VuZXJhdGVSZW5vdmF0ZUpzb25jJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCBtYW5hZ2VkRmlsZU5hbWUpO1xuICAgIGNvbnN0IG1hbmFnZWRGaWxlU3RhdHMgPSBhd2FpdCBmcy5wcm9taXNlcy5sc3RhdChmaWxlUGF0aCkuY2F0Y2goKCkgPT4ge30pO1xuICAgIGlmIChtYW5hZ2VkRmlsZVN0YXRzPy5pc1N5bWJvbGljTGluaygpKSB7XG4gICAgICBjb25zb2xlLndhcm4oYFNraXBwZWQgZ2VuZXJhdGluZyAke2ZpbGVQYXRofSBiZWNhdXNlIGl0IGlzIGEgc3ltYm9saWMgbGluay5gKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBub25DYW5vbmljYWxDb25maWdDYW5kaWRhdGVzID0gYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgICBub25DYW5vbmljYWxDb25maWdQYXRocy5tYXAoYXN5bmMgKHJlbGF0aXZlUGF0aCkgPT4ge1xuICAgICAgICBjb25zdCBjYW5kaWRhdGUgPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsIHJlbGF0aXZlUGF0aCk7XG4gICAgICAgIHJldHVybiAoYXdhaXQgZnMucHJvbWlzZXMubHN0YXQoY2FuZGlkYXRlKS5jYXRjaCgoKSA9PiB7fSkpID8gY2FuZGlkYXRlIDogdW5kZWZpbmVkO1xuICAgICAgfSlcbiAgICApO1xuICAgIGNvbnN0IG5vbkNhbm9uaWNhbENvbmZpZ1BhdGggPSBub25DYW5vbmljYWxDb25maWdDYW5kaWRhdGVzLmZpbmQoKGNhbmRpZGF0ZSkgPT4gY2FuZGlkYXRlICE9PSB1bmRlZmluZWQpO1xuICAgIGlmIChub25DYW5vbmljYWxDb25maWdQYXRoIHx8IGNvbmZpZy5wYWNrYWdlSnNvbj8ucmVub3ZhdGUpIHtcbiAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgYFNraXBwZWQgZ2VuZXJhdGluZyAke2ZpbGVQYXRofSBiZWNhdXNlIHRoZSByZXBvc2l0b3J5IGhhcyBhIG5vbi1jYW5vbmljYWwgUmVub3ZhdGUgY29uZmlnJHtcbiAgICAgICAgICBub25DYW5vbmljYWxDb25maWdQYXRoID8gYCBhdCAke25vbkNhbm9uaWNhbENvbmZpZ1BhdGh9YCA6ICcgaW4gcGFja2FnZS5qc29uJ1xuICAgICAgICB9LmBcbiAgICAgICk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3Qgb2xkQ29udGVudCA9IGF3YWl0IGZzVXRpbC5yZWFkRmlsZUlmRXhpc3RzKGZpbGVQYXRoKTtcbiAgICBsZXQgb2xkU2V0dGluZ3M6IFNldHRpbmdzIHwgdW5kZWZpbmVkO1xuICAgIGlmIChvbGRDb250ZW50ICE9PSB1bmRlZmluZWQgJiYgIWpzb25jVXRpbC5pc1RyaXZpYU9ubHkob2xkQ29udGVudCkpIHtcbiAgICAgIG9sZFNldHRpbmdzID0ganNvbmNVdGlsLnBhcnNlT2JqZWN0SWdub3JpbmdFcnJvcjxTZXR0aW5ncz4ob2xkQ29udGVudCk7XG4gICAgICBpZiAoIW9sZFNldHRpbmdzKSB7XG4gICAgICAgIGNvbnNvbGUud2FybihgU2tpcHBlZCBnZW5lcmF0aW5nICR7ZmlsZVBhdGh9IGJlY2F1c2UgdGhlIGV4aXN0aW5nIGNvbnRlbnQgaXMgbm90IHBhcnNhYmxlIGFzIEpTT05DLmApO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKG9sZFNldHRpbmdzPy5leHRlbmRzICE9PSB1bmRlZmluZWQgJiYgIUFycmF5LmlzQXJyYXkob2xkU2V0dGluZ3MuZXh0ZW5kcykpIHtcbiAgICAgIGNvbnNvbGUud2FybihgU2tpcHBlZCBnZW5lcmF0aW5nICR7ZmlsZVBhdGh9IGJlY2F1c2UgXCJleHRlbmRzXCIgaXMgbm90IGFuIGFycmF5LmApO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCByZW1vdmVkUHJlc2V0ID0gb2xkU2V0dGluZ3M/LmV4dGVuZHM/LmZpbmQoXG4gICAgICAocHJlc2V0KSA9PiBwcmVzZXQuc3RhcnRzV2l0aCgnZ2l0aHViPldpbGxCb29zdGVyL3dpbGxib29zdGVyLWNvbmZpZ3M6JykgJiYgcHJlc2V0ICE9PSBzaGFyZWRQcmVzZXRcbiAgICApO1xuICAgIGlmIChyZW1vdmVkUHJlc2V0KSB7XG4gICAgICBjb25zb2xlLndhcm4oYFNraXBwZWQgZ2VuZXJhdGluZyAke2ZpbGVQYXRofSBiZWNhdXNlIFwiJHtyZW1vdmVkUHJlc2V0fVwiIG5vIGxvbmdlciBleGlzdHM7IHJlbW92ZSBpdCBtYW51YWxseS5gKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBuZXdTZXR0aW5ncyA9IGJ1aWxkU2V0dGluZ3MoY29uZmlnLCBvbGRTZXR0aW5ncyk7XG4gICAgY29uc3QgeyBjb250ZW50LCBrZXlzTG9zaW5nQ29tbWVudHMgfSA9IGpzb25jVXRpbC5zdHJpbmdpZnlQcmVzZXJ2aW5nVHJpdmlhKFxuICAgICAgb2xkQ29udGVudCxcbiAgICAgIG5ld1NldHRpbmdzIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+XG4gICAgKTtcbiAgICBpZiAob2xkQ29udGVudCAhPT0gdW5kZWZpbmVkICYmIG5vcm1hbGl6ZShjb250ZW50KSA9PT0gbm9ybWFsaXplKG9sZENvbnRlbnQpKSByZXR1cm47XG4gICAgaWYgKCEoYXdhaXQgZnNVdGlsLmdlbmVyYXRlRmlsZShmaWxlUGF0aCwgY29udGVudCkpKSByZXR1cm47XG5cbiAgICBmb3IgKGNvbnN0IGtleSBvZiBrZXlzTG9zaW5nQ29tbWVudHMpIHtcbiAgICAgIGNvbnNvbGUud2FybihgQ29tbWVudHMgaW5zaWRlIFwiJHtrZXl9XCIgd2VyZSBkcm9wcGVkIHdoaWxlIHJld3JpdGluZyBpdCBpbiAke2ZpbGVQYXRofS5gKTtcbiAgICB9XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBidWlsZFNldHRpbmdzKGNvbmZpZzogUGFja2FnZUNvbmZpZywgb2xkU2V0dGluZ3M6IFNldHRpbmdzIHwgdW5kZWZpbmVkKTogU2V0dGluZ3Mge1xuICBjb25zdCBzZXR0aW5ncyA9IG9sZFNldHRpbmdzXG4gICAgPyAobWVyZ2UuYWxsKFtnZW5lcmF0ZWRTZXR0aW5ncywgb2xkU2V0dGluZ3MsIGdlbmVyYXRlZFNldHRpbmdzXSwge1xuICAgICAgICBhcnJheU1lcmdlOiBvdmVyd3JpdGVNZXJnZSxcbiAgICAgIH0pIGFzIFNldHRpbmdzKVxuICAgIDogc3RydWN0dXJlZENsb25lKGdlbmVyYXRlZFNldHRpbmdzKTtcbiAgY29uc3QgZXhpc3RpbmdFeHRlbmRzID0gb2xkU2V0dGluZ3M/LmV4dGVuZHMgPz8gW107XG4gIHNldHRpbmdzLmV4dGVuZHMgPSBjb25maWcuaXNXaWxsQm9vc3RlckNvbmZpZ3NcbiAgICA/IGV4aXN0aW5nRXh0ZW5kcy5maWx0ZXIoKHByZXNldCkgPT4gcHJlc2V0ICE9PSBzaGFyZWRQcmVzZXQpXG4gICAgOiBleGlzdGluZ0V4dGVuZHMuaW5jbHVkZXMoc2hhcmVkUHJlc2V0KVxuICAgICAgPyBleGlzdGluZ0V4dGVuZHNcbiAgICAgIDogW3NoYXJlZFByZXNldCwgLi4uZXhpc3RpbmdFeHRlbmRzXTtcbiAgcmV0dXJuIHNldHRpbmdzO1xufVxuXG5mdW5jdGlvbiBub3JtYWxpemUoY29udGVudDogc3RyaW5nKTogc3RyaW5nIHtcbiAgY29uc3QgdHJpbW1lZENvbnRlbnQgPSBjb250ZW50LnRyaW0oKTtcbiAgcmV0dXJuIHRyaW1tZWRDb250ZW50ID8gdHJpbW1lZENvbnRlbnQgKyAnXFxuJyA6ICcnO1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IG1lcmdlIGZyb20gJ2RlZXBtZXJnZSc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VKc29uLCBUc0NvbmZpZ0pzb24gfSBmcm9tICd0eXBlLWZlc3QnO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBmc1V0aWwgfSBmcm9tICcuLi91dGlscy9mc1V0aWwuanMnO1xuaW1wb3J0IHsganNvbmNVdGlsIH0gZnJvbSAnLi4vdXRpbHMvanNvbmNVdGlsLmpzJztcbmltcG9ydCB7IGNvbWJpbmVNZXJnZSB9IGZyb20gJy4uL3V0aWxzL21lcmdlVXRpbC5qcyc7XG5pbXBvcnQgeyBzb3J0S2V5cyB9IGZyb20gJy4uL3V0aWxzL29iamVjdFV0aWwuanMnO1xuaW1wb3J0IHsgcHJvbWlzZVBvb2wgfSBmcm9tICcuLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5pbXBvcnQgeyBnZXRUc2NvbmZpZ0V4dGVuZHMgfSBmcm9tICcuLi91dGlscy90c2NvbmZpZ0Jhc2UuanMnO1xuaW1wb3J0IHtcbiAgZ2V0TWVhbmluZ2Z1bERlY2xhcmVkV29ya3NwYWNlUGF0dGVybnMsXG4gIGdldFdvcmtzcGFjZURpclBhdHRlcm5zLFxuICBnZXRXb3Jrc3BhY2VTdWJEaXJQYXRocyxcbn0gZnJvbSAnLi4vdXRpbHMvd29ya3NwYWNlVXRpbC5qcyc7XG5cbmNvbnN0IHN1Ykpzb25PYmogPSB7XG4gIGNvbXBpbGVyT3B0aW9uczoge1xuICAgIGFsd2F5c1N0cmljdDogdHJ1ZSxcbiAgICBub1VuY2hlY2tlZEluZGV4ZWRBY2Nlc3M6IHRydWUsIC8vIGZvciBAdHlwZXNjcmlwdC1lc2xpbnQvcHJlZmVyLW51bGxpc2gtY29hbGVzY2luZ1xuICAgIGFsbG93U3ludGhldGljRGVmYXVsdEltcG9ydHM6IHRydWUsIC8vIGFsbG93IGBpbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnYFxuICAgIGVzTW9kdWxlSW50ZXJvcDogdHJ1ZSwgLy8gYWxsb3cgZGVmYXVsdCBpbXBvcnQgZnJvbSBDb21tb25KUy9BTUQvVU1EIG1vZHVsZXNcbiAgICByZXNvbHZlSnNvbk1vZHVsZTogdHJ1ZSwgLy8gYWxsb3cgdG8gaW1wb3J0IEpTT04gZmlsZXNcbiAgICBpbXBvcnRIZWxwZXJzOiBmYWxzZSxcbiAgICBub0VtaXQ6IHRydWUsXG4gIH0sXG4gIGV4Y2x1ZGU6IFsndGVzdC9maXh0dXJlcyddLFxuICAvLyB3YmZ5IGdlbmVyYXRlcyByb290LWxldmVsIHRvb2wgY29uZmlncyBzdWNoIGFzIHBsYXl3cmlnaHQuY29uZmlnLnRzLCBhbmRcbiAgLy8gdHlwZS1hd2FyZSBsaW50aW5nIG5lZWRzIHRob3NlIGZpbGVzIGluIHRoZSBwcm9qZWN0IHRvIHNlZSBOb2RlL0J1biBnbG9iYWxzLlxuICAvLyBgYXBwLyoqYCBpcyBkZWxpYmVyYXRlbHkgYWJzZW50IGV2ZW4gdGhvdWdoIHRoZSBkb2VzQ29udGFpbipTY3JpcHQgc2lnbmFscyBzY2FuIGl0OiBhcHBcbiAgLy8gZGlyZWN0b3JpZXMgYmVsb25nIHRvIGZyYW1ld29yayBwYWNrYWdlcyAoTmV4dC5qcy9CbGl0eiksIHdoaWNoIG93biB0aGVpciB0c2NvbmZpZ1xuICAvLyAoZ2VuZXJhdGVUc2NvbmZpZyBza2lwcyB0aGVtKSwgYW5kIGNoZWNraW5nIGZyYW1ld29yayBzb3VyY2VzIHVuZGVyIHRoaXMgcHJvamVjdCdzIGNvbXBpbGVyXG4gIC8vIG9wdGlvbnMgd291bGQgcHJvZHVjZSBmYWxzZSBlcnJvcnMuXG4gIGluY2x1ZGU6IFsnKi5jb25maWcudHMnLCAnc2NyaXB0cy8qKi8qJywgJ3NyYy8qKi8qJywgJ3Rlc3QvKiovKiddLFxufTtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlVHNjb25maWcoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZ2VuZXJhdGVUc2NvbmZpZycsIGFzeW5jICgpID0+IHtcbiAgICAvLyB2aW5leHQgaXMgdGhlIG9yZydzIE5leHQuanMtZXF1aXZhbGVudCBmcmFtZXdvcmsgYW5kIG93bnMgaXRzIHRzY29uZmlnIGp1c3QgbGlrZSBOZXh0L0JsaXR6LFxuICAgIC8vIHNvIGl0IG11c3Qgc2tpcCB0aGUgc3RhbmRhcmQgZ2VuZXJhdGlvbiB0aGF0IHdvdWxkIG92ZXJ3cml0ZSB0aGUgZnJhbWV3b3JrJ3Mgb3duIHNldHRpbmdzLlxuICAgIGlmIChjb25maWcuZGVwZW5kaW5nLmJsaXR6IHx8IGNvbmZpZy5kZXBlbmRpbmcubmV4dCB8fCBjb25maWcuZGVwZW5kaW5nLnZpbmV4dCkge1xuICAgICAgYXdhaXQgbm9ybWFsaXplRnJhbWV3b3JrVHNjb25maWcoY29uZmlnKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBsZXQgbmV3U2V0dGluZ3MgPSAoY29uZmlnLmlzUm9vdCA/IGJ1aWxkUm9vdEpzb25PYmooY29uZmlnKSA6IHN0cnVjdHVyZWRDbG9uZShzdWJKc29uT2JqKSkgYXMgVHNDb25maWdKc29uO1xuICAgIGNvbnN0IGdlbmVyYXRlZFR5cGVzID0gZ2V0R2VuZXJhdGVkVHlwZXMoY29uZmlnKTtcbiAgICBuZXdTZXR0aW5ncy5leHRlbmRzID0gZ2V0VHNjb25maWdFeHRlbmRzKGNvbmZpZyk7XG4gICAgbmV3U2V0dGluZ3MuY29tcGlsZXJPcHRpb25zID8/PSB7fTtcbiAgICBuZXdTZXR0aW5ncy5jb21waWxlck9wdGlvbnMucm9vdERpciA9IGdldFJvb3REaXIoY29uZmlnKTtcbiAgICBpZiAoZ2VuZXJhdGVkVHlwZXMubGVuZ3RoID4gMCkge1xuICAgICAgbmV3U2V0dGluZ3MuY29tcGlsZXJPcHRpb25zID0geyAuLi5uZXdTZXR0aW5ncy5jb21waWxlck9wdGlvbnMsIHR5cGVzOiBnZW5lcmF0ZWRUeXBlcyB9O1xuICAgIH1cbiAgICBpZiAoIWNvbmZpZy5kb2VzQ29udGFpbkpzeE9yVHN4ICYmICFjb25maWcuZG9lc0NvbnRhaW5Kc3hPclRzeEluUGFja2FnZXMpIHtcbiAgICAgIGRlbGV0ZSBuZXdTZXR0aW5ncy5jb21waWxlck9wdGlvbnM/LmpzeDtcbiAgICB9XG4gICAgaWYgKGNvbmZpZy5kZXBlbmRpbmcucHJpc21hKSB7XG4gICAgICAvLyBQcmlzbWEgc2VlZHMgYW5kIG1pZ3JhdGlvbiBoZWxwZXIgc2NyaXB0cyBvZnRlbiBsaXZlIG91dHNpZGUgc3JjLCBidXRcbiAgICAgIC8vIHR5cGUtYXdhcmUgbGludGluZyBzdGlsbCBuZWVkcyB0aGVtIGNvdmVyZWQgYnkgdGhlIHByb2plY3QgY29uZmlnLlxuICAgICAgYWRkSW5jbHVkZVBhdGgobmV3U2V0dGluZ3MsICdwcmlzbWEvKiovKicpO1xuICAgIH1cblxuICAgIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAndHNjb25maWcuanNvbicpO1xuICAgIGNvbnN0IGV4aXN0aW5nQ29udGVudCA9IGF3YWl0IGZzVXRpbC5yZWFkRmlsZUlmRXhpc3RzKGZpbGVQYXRoKTtcbiAgICBsZXQgb3JpZ2luYWxTZXR0aW5nc0pzb246IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgICAvLyBBIGZpbGUgd2l0aCBubyBjb25maWd1cmF0aW9uIChlbXB0eSBvciBjb21tZW50LW9ubHkpIGlzIHRyZWF0ZWQgbGlrZSBhIG1pc3Npbmcgb25lLCBhcyB0c2MgZG9lcy5cbiAgICBpZiAoZXhpc3RpbmdDb250ZW50ICE9PSB1bmRlZmluZWQgJiYgIWpzb25jVXRpbC5pc1RyaXZpYU9ubHkoZXhpc3RpbmdDb250ZW50KSkge1xuICAgICAgY29uc3Qgb2xkU2V0dGluZ3MgPSBqc29uY1V0aWwucGFyc2VPYmplY3RJZ25vcmluZ0Vycm9yPFRzQ29uZmlnSnNvbj4oZXhpc3RpbmdDb250ZW50KTtcbiAgICAgIC8vIEFuIGV4aXN0aW5nIHRzY29uZmlnLmpzb24gd2JmeSBjYW5ub3QgcGFyc2UgbXVzdCBiZSBsZWZ0IHVudG91Y2hlZDogd3JpdGluZyB0aGVcbiAgICAgIC8vIGdlbmVyYXRlZCBzZXR0aW5ncyB3aXRob3V0IG1lcmdpbmcgd291bGQgc2lsZW50bHkgZGlzY2FyZCB0aGUgcHJvamVjdCdzIGNvbmZpZ3VyYXRpb24uXG4gICAgICBpZiAoIW9sZFNldHRpbmdzKSB7XG4gICAgICAgIGNvbnNvbGUud2FybihgU2tpcHBlZCBnZW5lcmF0aW5nICR7ZmlsZVBhdGh9IGJlY2F1c2UgdGhlIGV4aXN0aW5nIGNvbnRlbnQgaXMgbm90IHBhcnNhYmxlIGFzIEpTT05DLmApO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBvcmlnaW5hbFNldHRpbmdzSnNvbiA9IEpTT04uc3RyaW5naWZ5KHNvcnRLZXlzKHN0cnVjdHVyZWRDbG9uZShvbGRTZXR0aW5ncykpKTtcbiAgICAgIGNvbnN0IGV4aXN0aW5nVHlwZXMgPSBub3JtYWxpemVTdHJpbmdBcnJheShvbGRTZXR0aW5ncy5jb21waWxlck9wdGlvbnM/LnR5cGVzKTtcbiAgICAgIGNvbnN0IGV4aXN0aW5nRW1pdE1ldGFkYXRhID0gcGlja0V4aXN0aW5nRW1pdE1ldGFkYXRhKG9sZFNldHRpbmdzLmNvbXBpbGVyT3B0aW9ucyk7XG4gICAgICBuZXdTZXR0aW5ncy5leHRlbmRzID0gbWVyZ2VUc2NvbmZpZ0V4dGVuZHMobmV3U2V0dGluZ3MuZXh0ZW5kcywgb2xkU2V0dGluZ3MuZXh0ZW5kcyk7XG4gICAgICBkZWxldGUgb2xkU2V0dGluZ3MuZXh0ZW5kcztcbiAgICAgIGRlbGV0ZSBvbGRTZXR0aW5ncy5jb21waWxlck9wdGlvbnM/LmpzeDtcbiAgICAgIGlmIChjb25maWcuaXNSb290KSB7XG4gICAgICAgIHJlbW92ZVN0YWxlTWFuYWdlZFdvcmtzcGFjZUVudHJpZXMoY29uZmlnLCBvbGRTZXR0aW5ncywgbmV3U2V0dGluZ3MpO1xuICAgICAgfVxuICAgICAgbmV3U2V0dGluZ3MgPSBtZXJnZS5hbGwoW25ld1NldHRpbmdzLCBvbGRTZXR0aW5ncywgbmV3U2V0dGluZ3NdLCB7IGFycmF5TWVyZ2U6IGNvbWJpbmVNZXJnZSB9KTtcbiAgICAgIG5ld1NldHRpbmdzLmluY2x1ZGUgPSBuZXdTZXR0aW5ncy5pbmNsdWRlPy5maWx0ZXIoXG4gICAgICAgIChkaXJQYXRoOiBzdHJpbmcpID0+XG4gICAgICAgICAgIWRpclBhdGguaW5jbHVkZXMoJ0B0eXBlcycpICYmICFkaXJQYXRoLmluY2x1ZGVzKCdfX3Rlc3RzX18vJykgJiYgIWRpclBhdGguaW5jbHVkZXMoJ3Rlc3RzLycpXG4gICAgICApO1xuICAgICAgbmV3U2V0dGluZ3MuY29tcGlsZXJPcHRpb25zID8/PSB7fTtcbiAgICAgIC8vIHdiZnktZ2VuZXJhdGVkIHRzY29uZmlnLmpzb24gaXMgYSBsaW50L3R5cGVjaGVjayBwcm9qZWN0LCBub3QgdGhlIGVtaXRcbiAgICAgIC8vIGNvbnRyYWN0LiBJdCBtdXN0IGtlZXAgcm9vdERpciBicm9hZCBlbm91Z2ggZm9yIHJvb3QgY29uZmlnIGZpbGVzLFxuICAgICAgLy8gc2NyaXB0cywgc3JjLCBhbmQgdGVzdHMuIGJ1aWxkLXRzIG93bnMgZW1pdCBhbmQgY3JlYXRlcyBhIHRlbXBvcmFyeVxuICAgICAgLy8gc3JjLW9ubHkgdHNjb25maWcgd2l0aCBub0VtaXQ9ZmFsc2UsIGVtaXREZWNsYXJhdGlvbk9ubHk9dHJ1ZSxcbiAgICAgIC8vIHJvb3REaXI9XCJzcmNcIiwgYW5kIGluY2x1ZGU9W1wic3JjLyoqLypcIl0sIHNvIHByZXNlcnZpbmcgbm9FbWl0PWZhbHNlIG9yXG4gICAgICAvLyByb290RGlyPVwic3JjXCIgaGVyZSB3b3VsZCBvbmx5IGJyZWFrIG5vbi1zcmMgdHlwZS1hd2FyZSBsaW50IGNvdmVyYWdlLlxuICAgICAgbmV3U2V0dGluZ3MuY29tcGlsZXJPcHRpb25zID0geyAuLi5uZXdTZXR0aW5ncy5jb21waWxlck9wdGlvbnMsIC4uLmV4aXN0aW5nRW1pdE1ldGFkYXRhIH07XG5cbiAgICAgIGNvbnN0IG1lcmdlZFR5cGVzID0gWy4uLm5ldyBTZXQoWy4uLmZpbHRlckV4aXN0aW5nVHlwZXMoZXhpc3RpbmdUeXBlcywgZ2VuZXJhdGVkVHlwZXMpLCAuLi5nZW5lcmF0ZWRUeXBlc10pXTtcbiAgICAgIGlmIChtZXJnZWRUeXBlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgIG5ld1NldHRpbmdzLmNvbXBpbGVyT3B0aW9ucy50eXBlcyA9IG1lcmdlZFR5cGVzO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZGVsZXRlIG5ld1NldHRpbmdzLmNvbXBpbGVyT3B0aW9ucy50eXBlcztcbiAgICAgIH1cbiAgICAgIGlmIChzaG91bGREZWxldGVUeXBlUm9vdHMoZ2VuZXJhdGVkVHlwZXMpKSB7XG4gICAgICAgIGRlbGV0ZSBuZXdTZXR0aW5ncy5jb21waWxlck9wdGlvbnMudHlwZVJvb3RzO1xuICAgICAgfVxuICAgIH1cbiAgICBhZGRVbmRpY2lUeXBlc1BhdGhNYXBwaW5nKG5ld1NldHRpbmdzLCBjb25maWcpO1xuICAgIHNvcnRLZXlzKG5ld1NldHRpbmdzKTtcbiAgICBuZXdTZXR0aW5ncy5pbmNsdWRlPy5zb3J0KCk7XG4gICAgLy8gRG9uJ3QgdXNlIG9sZCBkZWNvcmF0b3JcbiAgICBkZWxldGUgbmV3U2V0dGluZ3MuY29tcGlsZXJPcHRpb25zPy5leHBlcmltZW50YWxEZWNvcmF0b3JzO1xuICAgIC8vIFBhY2thZ2UgaW1wb3J0cyBzaG91bGQgcmVzb2x2ZSB0aHJvdWdoIHBhY2thZ2UgZXhwb3J0cyBpbnN0ZWFkIG9mIGJhc2VVcmwuXG4gICAgLy8gcGF0aHMgaXMgaW50ZW50aW9uYWxseSBwcmVzZXJ2ZWQgc28gcmVwby1sb2NhbCB0b29saW5nIGNhbiBrZWVwIGV4cGxpY2l0XG4gICAgLy8gYWxpYXNlcyB3aXRob3V0IHJlbHlpbmcgb24gYmFzZVVybCdzIGJyb2FkIGZhbGxiYWNrIHJlc29sdXRpb24uXG4gICAgZGVsZXRlIG5ld1NldHRpbmdzLmNvbXBpbGVyT3B0aW9ucz8uYmFzZVVybDtcbiAgICBpZiAoY29uZmlnLmRlcGVuZGluZy5yZWFjdE5hdGl2ZSkge1xuICAgICAgZGVsZXRlIG5ld1NldHRpbmdzLmNvbXBpbGVyT3B0aW9ucz8udmVyYmF0aW1Nb2R1bGVTeW50YXg7XG4gICAgfVxuICAgIC8vIFNraXAgdGhlIHdyaXRlIHdoZW4gbm90aGluZyBjaGFuZ2VzIHNlbWFudGljYWxseSwgc28gSlNPTkMgY29tbWVudHMgYW5kIGZvcm1hdHRpbmcgaW4gYW5cbiAgICAvLyBhbHJlYWR5LXVwLXRvLWRhdGUgdHNjb25maWcuanNvbiBzdXJ2aXZlIHdiZnkgcnVucy5cbiAgICBpZiAob3JpZ2luYWxTZXR0aW5nc0pzb24gPT09IEpTT04uc3RyaW5naWZ5KG5ld1NldHRpbmdzKSkgcmV0dXJuO1xuICAgIGNvbnN0IG5ld0NvbnRlbnQgPSBKU09OLnN0cmluZ2lmeShuZXdTZXR0aW5ncywgdW5kZWZpbmVkLCAyKTtcbiAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnNVdGlsLmdlbmVyYXRlRmlsZShmaWxlUGF0aCwgbmV3Q29udGVudCkpO1xuICB9KTtcbn1cblxuLyoqXG4gKiBUaGUgbW9ub3JlcG8tcm9vdCB0c2NvbmZpZywgd2hvc2UgaW5jbHVkZS9leGNsdWRlIGNvdmVyIGV2ZXJ5IERFQ0xBUkVEIHdvcmtzcGFjZSBsYXlvdXQgKGUuZy5cbiAqIGBhcHBzLypgIGFsb25nc2lkZSBgcGFja2FnZXMvKmApIHNvIHR5cGUtYXdhcmUgbGludGluZyBydW4gZnJvbSB0aGUgcm9vdCBzZWVzIGFsbCB3b3Jrc3BhY2VcbiAqIHNvdXJjZXMsIG5vdCBqdXN0IHRoZSBjb252ZW50aW9uYWwgcGFja2FnZXMvKiBkaXJlY3RvcnkuXG4gKi9cbmZ1bmN0aW9uIGJ1aWxkUm9vdEpzb25PYmooY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogVHNDb25maWdKc29uIHtcbiAgY29uc3Qgd29ya3NwYWNlUGF0dGVybnMgPSBjb25maWcuZG9lc0NvbnRhaW5TdWJQYWNrYWdlSnNvbnNcbiAgICA/IGdldFdvcmtzcGFjZURpclBhdHRlcm5zKGNvbmZpZylcbiAgICA6IHsgZXhjbHVkZXM6IFtdLCBpbmNsdWRlczogW10gfTtcbiAgY29uc3Qgc2V0dGluZ3MgPSBzdHJ1Y3R1cmVkQ2xvbmUoc3ViSnNvbk9iaikgYXMgVHNDb25maWdKc29uO1xuICBzZXR0aW5ncy5leGNsdWRlID0gW1xuICAgIC4uLm5ldyBTZXQoW1xuICAgICAgLi4ud29ya3NwYWNlUGF0dGVybnMuaW5jbHVkZXMubWFwKCh3b3Jrc3BhY2VQYXR0ZXJuKSA9PiBgJHt3b3Jrc3BhY2VQYXR0ZXJufS90ZXN0L2ZpeHR1cmVzYCksXG4gICAgICAvLyBOZWdhdGl2ZSB3b3Jrc3BhY2UgcGF0dGVybnMgKGUuZy4gYCFwYWNrYWdlcy9leGNsdWRlZGApIG9wdCB3b3Jrc3BhY2Ugc3VidHJlZXMgb3V0IG9mIHRoZVxuICAgICAgLy8gbW9ub3JlcG8sIHNvIHRoZWlyIHNvdXJjZXMgbXVzdCBub3QgZW50ZXIgdGhlIHJvb3QgdHlwZS1jaGVjayBwcm9qZWN0IGVpdGhlci4gQSBuZWdhdGlvblxuICAgICAgLy8gd2hvc2UgZGlyZWN0b3J5IGlzIGFuIGFuY2VzdG9yIG9mIGEgd29ya3NwYWNlIHlpZWxkcyBwYWNrYWdlLW93bmVkIHN1YnBhdGggZW50cmllc1xuICAgICAgLy8gaW5zdGVhZCBvZiB0aGUgd2hvbGUgc3VidHJlZSAoc2VlIGdldFdvcmtzcGFjZURpclBhdHRlcm5zKS5cbiAgICAgIC4uLndvcmtzcGFjZVBhdHRlcm5zLmV4Y2x1ZGVzLFxuICAgICAgLy8gVGhlIG1hbmFnZWQgaW5jbHVkZXMgYWJvdmUgZGVsaWJlcmF0ZWx5IG9taXQgZnJhbWV3b3JrIGBhcHAvKipgIGRpcmVjdG9yaWVzIChzZWVcbiAgICAgIC8vIHN1Ykpzb25PYmouaW5jbHVkZSdzIGNvbW1lbnQpLCBidXQgYSByZXBvLWF1dGhvcmVkIGJyb2FkIGluY2x1ZGUgc3VjaCBhcyBgZTJlLyoqXFwvKmBcbiAgICAgIC8vIGNhbiBzdGlsbCBkcmFnIGEgZnJhbWV3b3JrIHdvcmtzcGFjZSdzIGFwcCBzb3VyY2VzIGludG8gdGhlIHJvb3QgcHJvamVjdCwgd2hlcmUgdGhleVxuICAgICAgLy8gZmFpbCB1bmRlciB0aGUgcm9vdCBjb21waWxlciBvcHRpb25zIOKAlCB0aGVpciBiYXJlIGBuZXh0LypgIGltcG9ydHMgcmVzb2x2ZSBvbmx5IHRocm91Z2hcbiAgICAgIC8vIHRoZSBmcmFtZXdvcmsgd29ya3NwYWNlJ3Mgb3duIHRzY29uZmlnIGBwYXRoc2AuIEV4Y2x1ZGUgdGhvc2UgYXBwIGRpcmVjdG9yaWVzIHNvIHRoZVxuICAgICAgLy8gcm9vdCBwcm9qZWN0IG5ldmVyIHR5cGUtY2hlY2tzIHRoZW0sIG5vIG1hdHRlciBob3cgYnJvYWQgdGhlIHJlcG8ncyBpbmNsdWRlIGdsb2JzIGFyZS5cbiAgICAgIC4uLmdldEZyYW1ld29ya1dvcmtzcGFjZUFwcEV4Y2x1ZGVzKGNvbmZpZyksXG4gICAgICAuLi4oc2V0dGluZ3MuZXhjbHVkZSA/PyBbXSksXG4gICAgXSksXG4gIF0udG9Tb3J0ZWQoKTtcbiAgc2V0dGluZ3MuaW5jbHVkZSA9IFtcbiAgICAuLi4oc2V0dGluZ3MuaW5jbHVkZSA/PyBbXSksXG4gICAgLi4ud29ya3NwYWNlUGF0dGVybnMuaW5jbHVkZXMuZmxhdE1hcCgod29ya3NwYWNlUGF0dGVybikgPT4gW1xuICAgICAgYCR7d29ya3NwYWNlUGF0dGVybn0vKi5jb25maWcudHNgLFxuICAgICAgYCR7d29ya3NwYWNlUGF0dGVybn0vc2NyaXB0cy8qKi8qYCxcbiAgICAgIGAke3dvcmtzcGFjZVBhdHRlcm59L3NyYy8qKi8qYCxcbiAgICAgIGAke3dvcmtzcGFjZVBhdHRlcm59L3Rlc3QvKiovKmAsXG4gICAgXSksXG4gIF07XG4gIHJldHVybiBzZXR0aW5ncztcbn1cblxuLy8gRnJhbWV3b3JrIHBhY2thZ2VzIG93biB0aGVpciB0c2NvbmZpZyAoZ2VuZXJhdGVUc2NvbmZpZyBza2lwcyB0aGVtKSBhbmQgc2hpbSBiYXJlIGltcG9ydHMgc3VjaCBhc1xuLy8gYG5leHQvbmF2aWdhdGlvbmAgdGhyb3VnaCBwYWNrYWdlLWxvY2FsIGBwYXRoc2A7IHZpbmV4dCBpcyB0aGUgb3JnJ3MgTmV4dC5qcy1lcXVpdmFsZW50IGZyYW1ld29ya1xuLy8gYW5kIGJlaGF2ZXMgdGhlIHNhbWUuIFRoZWlyIGFwcCBzb3VyY2VzIHRoZXJlZm9yZSBvbmx5IHR5cGUtY2hlY2sgdW5kZXIgdGhlaXIgb3duIGNvbmZpZy5cbmNvbnN0IGZyYW1ld29ya0RlcGVuZGVuY3lOYW1lcyA9IFsnYmxpdHonLCAnbmV4dCcsICd2aW5leHQnXTtcblxuLy8gQSBmcmFtZXdvcmsgYXBwIGxpdmVzIGluIGBhcHAvYCBvciwgdW5kZXIgdGhlIHNyYy1kaXJlY3RvcnkgbGF5b3V0LCBgc3JjL2FwcC9gLiBUaGUgcm9vdCBwcm9qZWN0XG4vLyBpbmNsdWRlcyBgPHdvcmtzcGFjZT4vc3JjLyoqLypgLCBzbyBgc3JjL2FwcGAgbGVha3MgaW4ganVzdCBhcyBhIHJlcG8td2lkZSBnbG9iIGNhbiBwdWxsIGluIGBhcHBgLlxuY29uc3QgZnJhbWV3b3JrQXBwRGlyTmFtZXMgPSBbJ2FwcCcsICdzcmMvYXBwJ107XG5cbi8qKiBSb290IGBleGNsdWRlYCBlbnRyaWVzIChwb3NpeCwgcmVsYXRpdmUgdG8gdGhlIHJvb3QpIGZvciBldmVyeSBmcmFtZXdvcmsgd29ya3NwYWNlJ3MgYXBwIGRpcmVjdG9yeS4gKi9cbmZ1bmN0aW9uIGdldEZyYW1ld29ya1dvcmtzcGFjZUFwcEV4Y2x1ZGVzKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IHN0cmluZ1tdIHtcbiAgaWYgKCFjb25maWcuZG9lc0NvbnRhaW5TdWJQYWNrYWdlSnNvbnMpIHJldHVybiBbXTtcbiAgY29uc3QgZXhjbHVkZXM6IHN0cmluZ1tdID0gW107XG4gIGZvciAoY29uc3Qgd29ya3NwYWNlRGlyUGF0aCBvZiBnZXRXb3Jrc3BhY2VTdWJEaXJQYXRocyhjb25maWcpKSB7XG4gICAgaWYgKCFkZXBlbmRzT25GcmFtZXdvcmsocGF0aC5yZXNvbHZlKHdvcmtzcGFjZURpclBhdGgsICdwYWNrYWdlLmpzb24nKSkpIGNvbnRpbnVlO1xuICAgIGZvciAoY29uc3QgYXBwRGlyTmFtZSBvZiBmcmFtZXdvcmtBcHBEaXJOYW1lcykge1xuICAgICAgY29uc3QgYXBwRGlyUGF0aCA9IHBhdGgucmVzb2x2ZSh3b3Jrc3BhY2VEaXJQYXRoLCBhcHBEaXJOYW1lKTtcbiAgICAgIGlmIChmcy5leGlzdHNTeW5jKGFwcERpclBhdGgpKSBleGNsdWRlcy5wdXNoKHBhdGgucmVsYXRpdmUoY29uZmlnLmRpclBhdGgsIGFwcERpclBhdGgpLnJlcGxhY2VBbGwoJ1xcXFwnLCAnLycpKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGV4Y2x1ZGVzO1xufVxuXG5mdW5jdGlvbiBkZXBlbmRzT25GcmFtZXdvcmsobWFuaWZlc3RQYXRoOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgbGV0IG1hbmlmZXN0OiBQYWNrYWdlSnNvbiB8IG51bGw7XG4gIHRyeSB7XG4gICAgbWFuaWZlc3QgPSBKU09OLnBhcnNlKGZzLnJlYWRGaWxlU3luYyhtYW5pZmVzdFBhdGgsICd1dGY4JykpIGFzIFBhY2thZ2VKc29uIHwgbnVsbDtcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIC8vIEEgbWFuaWZlc3QgdGhhdCBwYXJzZXMgdG8gYSBub24tb2JqZWN0IChlLmcuIGEgZmlsZSBsaXRlcmFsbHkgY29udGFpbmluZyBgbnVsbGApIGRlY2xhcmVzIG5vXG4gIC8vIGRlcGVuZGVuY2llczsgZ3VhcmQgdGhlIHByb3BlcnR5IGFjY2Vzcywgd2hpY2ggd291bGQgb3RoZXJ3aXNlIHRocm93IG91dHNpZGUgdGhlIHRyeSBhYm92ZS5cbiAgaWYgKCFtYW5pZmVzdCB8fCB0eXBlb2YgbWFuaWZlc3QgIT09ICdvYmplY3QnKSByZXR1cm4gZmFsc2U7XG4gIGNvbnN0IGRlcGVuZGVuY2llcyA9IHsgLi4ubWFuaWZlc3QuZGVwZW5kZW5jaWVzLCAuLi5tYW5pZmVzdC5kZXZEZXBlbmRlbmNpZXMgfTtcbiAgcmV0dXJuIGZyYW1ld29ya0RlcGVuZGVuY3lOYW1lcy5zb21lKChkZXBlbmRlbmN5TmFtZSkgPT4gZGVwZW5kZW5jaWVzW2RlcGVuZGVuY3lOYW1lXSk7XG59XG5cbmNvbnN0IG1hbmFnZWRXb3Jrc3BhY2VJbmNsdWRlU3VmZml4ZXMgPSBbJyouY29uZmlnLnRzJywgJ3NjcmlwdHMvKiovKicsICdzcmMvKiovKicsICd0ZXN0LyoqLyonXTtcblxuLyoqXG4gKiBSb290IGluY2x1ZGUvZXhjbHVkZSBlbnRyaWVzIHdiZnkgZ2VuZXJhdGVkIGZvciBhbiBlYXJsaWVyIHdvcmtzcGFjZSBsYXlvdXQgKGUuZy4gYHBhY2thZ2VzLypgXG4gKiBnbG9icyBpbiBhIHJlcG8gdGhhdCBub3cgZGVjbGFyZXMgb25seSBgYXBwcy8qYCkgbXVzdCBub3Qgc3Vydml2ZSB0aGUgbWVyZ2Ugd2l0aCB0aGUgZXhpc3RpbmdcbiAqIHRzY29uZmlnLCBvciB0aGUgb2Jzb2xldGUgZGlyZWN0b3JpZXMgd291bGQga2VlcCBlbnRlcmluZyByb290IHR5cGUgY2hlY2tpbmcgZm9yZXZlci4gQSBwcmVmaXhcbiAqIGNvdW50cyBhcyB3YmZ5LW1hbmFnZWQgb25seSB3aGVuIHRoZSBDT01QTEVURSBnZW5lcmF0ZWQgaW5jbHVkZSBzZXQgZm9yIGl0IGlzIHByZXNlbnQgYW5kIG5vXG4gKiBsb25nZXIgZ2VuZXJhdGVkIOKAlCBhIHVzZXItYXV0aG9yZWQgZW50cnkgc3VjaCBhcyBhIGxvbmUgYHRvb2xzLypcXC9zcmMvKipcXC8qYCBuZXZlciBxdWFsaWZpZXMuXG4gKi9cbmZ1bmN0aW9uIHJlbW92ZVN0YWxlTWFuYWdlZFdvcmtzcGFjZUVudHJpZXMoXG4gIGNvbmZpZzogUGFja2FnZUNvbmZpZyxcbiAgb2xkU2V0dGluZ3M6IFRzQ29uZmlnSnNvbixcbiAgbmV3U2V0dGluZ3M6IFRzQ29uZmlnSnNvblxuKTogdm9pZCB7XG4gIGNvbnN0IHN0YWxlUHJlZml4ZXMgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgaWYgKEFycmF5LmlzQXJyYXkob2xkU2V0dGluZ3MuaW5jbHVkZSkpIHtcbiAgICBjb25zdCBvbGRJbmNsdWRlID0gb2xkU2V0dGluZ3MuaW5jbHVkZS5maWx0ZXIoKGVudHJ5KTogZW50cnkgaXMgc3RyaW5nID0+IHR5cGVvZiBlbnRyeSA9PT0gJ3N0cmluZycpO1xuICAgIGNvbnN0IGdlbmVyYXRlZEluY2x1ZGUgPSBuZXcgU2V0KG5ld1NldHRpbmdzLmluY2x1ZGUpO1xuICAgIGZvciAoY29uc3QgZW50cnkgb2Ygb2xkSW5jbHVkZSkge1xuICAgICAgY29uc3Qgd29ya3NwYWNlUHJlZml4ID0gZ2V0TWFuYWdlZFdvcmtzcGFjZVByZWZpeChlbnRyeSk7XG4gICAgICBpZiAod29ya3NwYWNlUHJlZml4ID09PSB1bmRlZmluZWQgfHwgc3RhbGVQcmVmaXhlcy5oYXMod29ya3NwYWNlUHJlZml4KSkgY29udGludWU7XG4gICAgICBjb25zdCBpc0NvbXBsZXRlID0gbWFuYWdlZFdvcmtzcGFjZUluY2x1ZGVTdWZmaXhlcy5ldmVyeSgoc3VmZml4KSA9PlxuICAgICAgICBvbGRJbmNsdWRlLmluY2x1ZGVzKGAke3dvcmtzcGFjZVByZWZpeH0vJHtzdWZmaXh9YClcbiAgICAgICk7XG4gICAgICBjb25zdCBpc1N0aWxsR2VuZXJhdGVkID0gbWFuYWdlZFdvcmtzcGFjZUluY2x1ZGVTdWZmaXhlcy5zb21lKChzdWZmaXgpID0+XG4gICAgICAgIGdlbmVyYXRlZEluY2x1ZGUuaGFzKGAke3dvcmtzcGFjZVByZWZpeH0vJHtzdWZmaXh9YClcbiAgICAgICk7XG4gICAgICBpZiAoaXNDb21wbGV0ZSAmJiAhaXNTdGlsbEdlbmVyYXRlZCkgc3RhbGVQcmVmaXhlcy5hZGQod29ya3NwYWNlUHJlZml4KTtcbiAgICB9XG4gICAgaWYgKHN0YWxlUHJlZml4ZXMuc2l6ZSA+IDApIHtcbiAgICAgIG9sZFNldHRpbmdzLmluY2x1ZGUgPSBvbGRTZXR0aW5ncy5pbmNsdWRlLmZpbHRlcigoZW50cnkpID0+IHtcbiAgICAgICAgY29uc3Qgd29ya3NwYWNlUHJlZml4ID0gdHlwZW9mIGVudHJ5ID09PSAnc3RyaW5nJyA/IGdldE1hbmFnZWRXb3Jrc3BhY2VQcmVmaXgoZW50cnkpIDogdW5kZWZpbmVkO1xuICAgICAgICByZXR1cm4gd29ya3NwYWNlUHJlZml4ID09PSB1bmRlZmluZWQgfHwgIXN0YWxlUHJlZml4ZXMuaGFzKHdvcmtzcGFjZVByZWZpeCk7XG4gICAgICB9KTtcbiAgICB9XG4gIH1cbiAgaWYgKCFBcnJheS5pc0FycmF5KG9sZFNldHRpbmdzLmV4Y2x1ZGUpKSByZXR1cm47XG4gIGNvbnN0IGdlbmVyYXRlZEV4Y2x1ZGUgPSBuZXcgU2V0KG5ld1NldHRpbmdzLmV4Y2x1ZGUpO1xuICBjb25zdCB3b3Jrc3BhY2VEaXJQYXRocyA9IGNvbmZpZy5kb2VzQ29udGFpblN1YlBhY2thZ2VKc29uc1xuICAgID8gZ2V0V29ya3NwYWNlU3ViRGlyUGF0aHMoY29uZmlnKS5tYXAoKHdvcmtzcGFjZURpclBhdGgpID0+XG4gICAgICAgIHBhdGgucmVsYXRpdmUocGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoKSwgd29ya3NwYWNlRGlyUGF0aCkucmVwbGFjZUFsbCgnXFxcXCcsICcvJylcbiAgICAgIClcbiAgICA6IFtdO1xuICBvbGRTZXR0aW5ncy5leGNsdWRlID0gb2xkU2V0dGluZ3MuZXhjbHVkZS5maWx0ZXIoKGVudHJ5KSA9PiB7XG4gICAgaWYgKHR5cGVvZiBlbnRyeSAhPT0gJ3N0cmluZycgfHwgZ2VuZXJhdGVkRXhjbHVkZS5oYXMoZW50cnkpKSByZXR1cm4gdHJ1ZTtcbiAgICBpZiAoZW50cnkuZW5kc1dpdGgoJy90ZXN0L2ZpeHR1cmVzJykpIHtcbiAgICAgIHJldHVybiAhc3RhbGVQcmVmaXhlcy5oYXMoZW50cnkuc2xpY2UoMCwgLScvdGVzdC9maXh0dXJlcycubGVuZ3RoKSk7XG4gICAgfVxuICAgIC8vIEEgZnJhbWV3b3JrIGFwcCBleGNsdWRlIChgPHdvcmtzcGFjZT4vYXBwYCwgYDx3b3Jrc3BhY2U+L3NyYy9hcHBgKSBmb3IgYSBzdGlsbC1kZWNsYXJlZFxuICAgIC8vIHdvcmtzcGFjZSBpcyBwcnVuZWQgYnkgY292ZXJzV29ya3NwYWNlRGlyIGJlbG93IHdoZW4gbm8gbG9uZ2VyIGdlbmVyYXRlZDsgdGhpcyBjYXRjaGVzIHRoZVxuICAgIC8vIHJlbWFpbmluZyBjYXNlLCB3aGVyZSB0aGUgd29ya3NwYWNlIGl0c2VsZiB3YXMgcmVtb3ZlZCBhbmQgaXRzIHByZWZpeCBpcyB0aGVyZWZvcmUgc3RhbGUuXG4gICAgLy8gKEEgd3Jvbmcgc3VmZml4IHN0cmlwIHlpZWxkcyBhIHByZWZpeCBhYnNlbnQgZnJvbSBzdGFsZVByZWZpeGVzLCBzbyB0ZXN0aW5nIGV2ZXJ5IG5hbWUgaXMgc2FmZS4pXG4gICAgaWYgKFxuICAgICAgZnJhbWV3b3JrQXBwRGlyTmFtZXMuc29tZShcbiAgICAgICAgKGFwcERpck5hbWUpID0+IGVudHJ5LmVuZHNXaXRoKGAvJHthcHBEaXJOYW1lfWApICYmIHN0YWxlUHJlZml4ZXMuaGFzKGVudHJ5LnNsaWNlKDAsIC0oYXBwRGlyTmFtZS5sZW5ndGggKyAxKSkpXG4gICAgICApXG4gICAgKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHJldHVybiAhY292ZXJzV29ya3NwYWNlRGlyKGVudHJ5LCB3b3Jrc3BhY2VEaXJQYXRocyk7XG4gIH0pO1xufVxuXG4vLyBXaGV0aGVyIGFuIGV4Y2x1ZGUgZW50cnkgaXMgYSB3b3Jrc3BhY2UgbmVnYXRpb24gKGAhYXBwcy9leGNsdWRlZGApIHdob3NlIG5lZ2F0aW9uIGlzIGdvbmU6IHRoZVxuLy8gZGlyZWN0b3J5IGlzIGEgd29ya3NwYWNlIGFnYWluIGFuZCBtdXN0IHJlLWVudGVyIHRoZSByb290IHByb2plY3QuIHdiZnkgd3JpdGVzIHN1Y2ggYSBuZWdhdGlvbiBhc1xuLy8gYSBkaXJlY3RvcnkgcGF0aCwgYXMgYSBkaXJlY3RvcnkgUEFUVEVSTiB3aGVuIGl0IGV4Y2x1ZGVzIGV4YWN0bHkgd2hhdCBpdCBtYXRjaGVzIChgYXBwcy8qYmApLCBvclxuLy8gYXMgYW4gYW5jZXN0b3IncyBwYWNrYWdlLW93bmVkIHN1YnBhdGhzIChgYXBwcy94L3NyY2ApIOKAlCBzbyB0aGUgZW50cnkgbWF5IGNvdmVyIGEgZGlzY292ZXJlZFxuLy8gd29ya3NwYWNlIGRpcmVjdG9yeSBvciBzaXQgdW5kZXIgb25lLiBBIGdsb2JzdGFyIHNlZ21lbnQgbWFya3MgYSBoeWdpZW5lIGdsb2IgKG5vZGVfbW9kdWxlcywgZTJlXG4vLyBhbmQgZnJpZW5kcyksIHdoaWNoIGlzIG5ldmVyIG5lZ2F0aW9uLWRlcml2ZWQgYW5kIG11c3Qgc3Vydml2ZS5cbmZ1bmN0aW9uIGNvdmVyc1dvcmtzcGFjZURpcihlbnRyeTogc3RyaW5nLCB3b3Jrc3BhY2VEaXJQYXRoczogcmVhZG9ubHkgc3RyaW5nW10pOiBib29sZWFuIHtcbiAgaWYgKGVudHJ5LnNwbGl0KCcvJykuaW5jbHVkZXMoJyoqJykpIHJldHVybiBmYWxzZTtcbiAgY29uc3QgcmVnZXhTb3VyY2UgPSBlbnRyeVxuICAgIC5zcGxpdCgnLycpXG4gICAgLm1hcCgoc2VnbWVudCkgPT5cbiAgICAgIHNlZ21lbnRcbiAgICAgICAgLnJlcGxhY2VBbGwoL1suK14ke30oKXxbXFxdXFxcXF0vZ3UsIFN0cmluZy5yYXdgXFwkJmApXG4gICAgICAgIC5yZXBsYWNlQWxsKCcqJywgJ1teL10qJylcbiAgICAgICAgLnJlcGxhY2VBbGwoJz8nLCAnW14vXScpXG4gICAgKVxuICAgIC5qb2luKCcvJyk7XG4gIGNvbnN0IGVudHJ5UGF0dGVybiA9IG5ldyBSZWdFeHAoYF4ke3JlZ2V4U291cmNlfSg/Oi8uKik/JGAsICd1Jyk7XG4gIHJldHVybiB3b3Jrc3BhY2VEaXJQYXRocy5zb21lKFxuICAgICh3b3Jrc3BhY2VEaXJQYXRoKSA9PiBlbnRyeVBhdHRlcm4udGVzdCh3b3Jrc3BhY2VEaXJQYXRoKSB8fCBlbnRyeS5zdGFydHNXaXRoKGAke3dvcmtzcGFjZURpclBhdGh9L2ApXG4gICk7XG59XG5cbmZ1bmN0aW9uIGdldE1hbmFnZWRXb3Jrc3BhY2VQcmVmaXgoZW50cnk6IHN0cmluZyk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IG1hdGNoZWRTdWZmaXggPSBtYW5hZ2VkV29ya3NwYWNlSW5jbHVkZVN1ZmZpeGVzLmZpbmQoKHN1ZmZpeCkgPT4gZW50cnkuZW5kc1dpdGgoYC8ke3N1ZmZpeH1gKSk7XG4gIGlmICghbWF0Y2hlZFN1ZmZpeCkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgY29uc3Qgd29ya3NwYWNlUHJlZml4ID0gZW50cnkuc2xpY2UoMCwgLShtYXRjaGVkU3VmZml4Lmxlbmd0aCArIDEpKTtcbiAgcmV0dXJuIHdvcmtzcGFjZVByZWZpeCA9PT0gJycgPyB1bmRlZmluZWQgOiB3b3Jrc3BhY2VQcmVmaXg7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIG5vcm1hbGl6ZUZyYW1ld29ya1RzY29uZmlnKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICAvLyBOZXh0L0JsaXR6IG93biB0aGVpciB0c2NvbmZpZyBzaGFwZSwgYnV0IFR5cGVTY3JpcHQgNiBubyBsb25nZXIgYWNjZXB0c1xuICAvLyBub2RlMTAgcmVzb2x2ZXIgc3BlbGxpbmdzIHRoYXQgb2xkZXIgcHJvamVjdHMgY29tbW9ubHkgaW5oZXJpdGVkLlxuICBjb25zdCBmaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJ3RzY29uZmlnLmpzb24nKTtcbiAgY29uc3QgZXhpc3RpbmdDb250ZW50ID0gYXdhaXQgZnNVdGlsLnJlYWRGaWxlSWZFeGlzdHMoZmlsZVBhdGgpO1xuICBpZiAoZXhpc3RpbmdDb250ZW50ID09PSB1bmRlZmluZWQgfHwganNvbmNVdGlsLmlzVHJpdmlhT25seShleGlzdGluZ0NvbnRlbnQpKSByZXR1cm47XG4gIGNvbnN0IHNldHRpbmdzID0ganNvbmNVdGlsLnBhcnNlT2JqZWN0SWdub3JpbmdFcnJvcjxUc0NvbmZpZ0pzb24+KGV4aXN0aW5nQ29udGVudCk7XG4gIGlmICghc2V0dGluZ3MpIHtcbiAgICBjb25zb2xlLndhcm4oYFNraXBwZWQgY2xlYW5pbmcgdXAgJHtmaWxlUGF0aH0gYmVjYXVzZSB0aGUgZXhpc3RpbmcgY29udGVudCBpcyBub3QgcGFyc2FibGUgYXMgSlNPTkMuYCk7XG4gICAgcmV0dXJuO1xuICB9XG4gIGNvbnN0IG9yaWdpbmFsU2V0dGluZ3NKc29uID0gSlNPTi5zdHJpbmdpZnkoc2V0dGluZ3MpO1xuICBub3JtYWxpemVOZXh0VHNjb25maWdNb2R1bGVTZXR0aW5ncyhzZXR0aW5ncyk7XG4gIG5vcm1hbGl6ZU5leHRUc2NvbmZpZ1BhdGhBbGlhc2VzKHNldHRpbmdzLmNvbXBpbGVyT3B0aW9ucyk7XG4gIGFkZFNjcmlwdHNJbmNsdWRlRm9yRnJhbWV3b3JrUHJvamVjdChzZXR0aW5ncyk7XG4gIGFkZFVuZGljaVR5cGVzUGF0aE1hcHBpbmcoc2V0dGluZ3MsIGNvbmZpZyk7XG4gIC8vIFNraXAgdGhlIHdyaXRlIHdoZW4gbm90aGluZyBjaGFuZ2VzIHNlbWFudGljYWxseSwgc28gSlNPTkMgY29tbWVudHMgYW5kIGZvcm1hdHRpbmcgaW4gYW5cbiAgLy8gYWxyZWFkeS1jbGVhbiB0c2NvbmZpZy5qc29uIHN1cnZpdmUgd2JmeSBydW5zLlxuICBpZiAoSlNPTi5zdHJpbmdpZnkoc2V0dGluZ3MpID09PSBvcmlnaW5hbFNldHRpbmdzSnNvbikgcmV0dXJuO1xuICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnNVdGlsLmdlbmVyYXRlRmlsZShmaWxlUGF0aCwgSlNPTi5zdHJpbmdpZnkoc2V0dGluZ3MsIHVuZGVmaW5lZCwgMikpKTtcbn1cblxuLyoqXG4gKiBidW4tdHlwZXMgcmVmZXJlbmNlcyB1bmRpY2ktdHlwZXMgd2l0aG91dCBkZWNsYXJpbmcgaXQgYXMgYSBkZXBlbmRlbmN5IChvdmVuLXNoL2J1biMyMjgwNSksIHNvXG4gKiBCdW4ncyBpc29sYXRlZCBsaW5rZXIgKGVzcGVjaWFsbHkgd2l0aCB0aGUgZ2xvYmFsIHN0b3JlIG91dHNpZGUgdGhlIHJlcG9zaXRvcnkpIGNhbm5vdCByZXNvbHZlXG4gKiBpdCBmcm9tIGJ1bi10eXBlcycgbG9jYXRpb24sIHdoaWNoIHNpbGVudGx5IGRlZ3JhZGVzIGdsb2JhbCBmZXRjaCB0eXBlcyBzdWNoIGFzIFJlc3BvbnNlLiBNYXAgaXRcbiAqIHRvIHRoZSBjb3B5IHRoYXQgYnVuZmlnLnRvbWwncyBwdWJsaWNIb2lzdFBhdHRlcm4gcGxhY2VzIGluIHRoZSByb290IG5vZGVfbW9kdWxlcy5cbiAqL1xuZnVuY3Rpb24gYWRkVW5kaWNpVHlwZXNQYXRoTWFwcGluZyhzZXR0aW5nczogVHNDb25maWdKc29uLCBjb25maWc6IFBhY2thZ2VDb25maWcpOiB2b2lkIHtcbiAgLy8gTWFwIHVuZGljaS10eXBlcyBvbmx5IHdoZW4gYnVuLXR5cGVzIGFjdHVhbGx5IGxvYWRzOiBhbiBleHBsaWNpdCBgdHlwZXNgIGxpc3QgbG9hZHMgaXQgaWZmIGl0XG4gIC8vIGNvbnRhaW5zIFwiYnVuXCIgKGV2ZW4gb24gUmVhY3QgTmF0aXZlLCB3aG9zZSBwcm9qZWN0cyBtYXkgb3B0IGluIGJ5IGhhbmQpOyB3aXRoIGB0eXBlc2BcbiAgLy8gb21pdHRlZCwgVHlwZVNjcmlwdCdzIGF1dG9tYXRpYyBAdHlwZXMgaW5jbHVzaW9uIGxvYWRzIGl0IGJlY2F1c2Ugd2JmeSBpbnN0YWxscyBAdHlwZXMvYnVuXG4gIC8vIGZvciBldmVyeSBUeXBlU2NyaXB0IHByb2plY3QgZXhjZXB0IFJlYWN0IE5hdGl2ZSwgd2hpY2ggdXNlcyBAdHNjb25maWcvcmVhY3QtbmF0aXZlIGluc3RlYWQuXG4gIGNvbnN0IHR5cGVzID0gc2V0dGluZ3MuY29tcGlsZXJPcHRpb25zPy50eXBlcztcbiAgaWYgKHR5cGVzID8gIXR5cGVzLmluY2x1ZGVzKCdidW4nKSA6IGNvbmZpZy5kZXBlbmRpbmcucmVhY3ROYXRpdmUpIHJldHVybjtcbiAgY29uc3QgY29ycmVjdE1hcHBpbmcgPSBgJHtnZXRSb290RGlyKGNvbmZpZyl9L25vZGVfbW9kdWxlcy91bmRpY2ktdHlwZXMvaW5kZXguZC50c2A7XG4gIGNvbnN0IGV4aXN0aW5nTWFwcGluZyA9IHNldHRpbmdzLmNvbXBpbGVyT3B0aW9ucz8ucGF0aHM/LlsndW5kaWNpLXR5cGVzJ107XG4gIGlmIChleGlzdGluZ01hcHBpbmcpIHtcbiAgICAvLyBSZXdyaXRlIHRoZSBnZW5lcmF0ZWQgbWFwcGluZyB3aGVuIGEgd29ya3NwYWNlIG1vdmVzIHRvIGEgZGlmZmVyZW50IHJvb3QgZGVwdGguIEFueSBvdGhlclxuICAgIC8vIHZhbHVlIGlzIGEgZGVsaWJlcmF0ZSByZXBvLWxvY2FsIG1hcHBpbmcgKGUuZy4gcGF0Y2hlZCB0eXBlcykgYW5kIG11c3QgYmUga2VwdC5cbiAgICBpZiAoXG4gICAgICBleGlzdGluZ01hcHBpbmcubGVuZ3RoID09PSAxICYmXG4gICAgICB0eXBlb2YgZXhpc3RpbmdNYXBwaW5nWzBdID09PSAnc3RyaW5nJyAmJlxuICAgICAgLyg/Ol58XFwvKW5vZGVfbW9kdWxlc1xcL3VuZGljaS10eXBlc1xcL2luZGV4XFwuZFxcLnRzJC91LnRlc3QoZXhpc3RpbmdNYXBwaW5nWzBdKVxuICAgICkge1xuICAgICAgc2V0dGluZ3MuY29tcGlsZXJPcHRpb25zIS5wYXRocyFbJ3VuZGljaS10eXBlcyddID0gW2NvcnJlY3RNYXBwaW5nXTtcbiAgICB9XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgc2V0dGluZ3MuY29tcGlsZXJPcHRpb25zID8/PSB7fTtcbiAgc2V0dGluZ3MuY29tcGlsZXJPcHRpb25zLnBhdGhzID0ge1xuICAgIC4uLnNldHRpbmdzLmNvbXBpbGVyT3B0aW9ucy5wYXRocyxcbiAgICAndW5kaWNpLXR5cGVzJzogW2NvcnJlY3RNYXBwaW5nXSxcbiAgfTtcbn1cblxuZnVuY3Rpb24gYWRkU2NyaXB0c0luY2x1ZGVGb3JGcmFtZXdvcmtQcm9qZWN0KHNldHRpbmdzOiBUc0NvbmZpZ0pzb24pOiB2b2lkIHtcbiAgLy8gT21pdHRpbmcgaW5jbHVkZSBsZXRzIGZyYW1ld29yayB0c2NvbmZpZ3Mga2VlcCBUeXBlU2NyaXB0J3MgZGVmYXVsdFxuICAvLyBcImFsbCBUUy9UU1ggZmlsZXNcIiBiZWhhdmlvciwgd2hpY2ggYWxyZWFkeSBjb3ZlcnMgc2NyaXB0cy5cbiAgaWYgKCFzZXR0aW5ncy5pbmNsdWRlKSByZXR1cm47XG4gIGlmIChzZXR0aW5ncy5pbmNsdWRlLmluY2x1ZGVzKCdzY3JpcHRzLyoqLyonKSkgcmV0dXJuO1xuXG4gIHNldHRpbmdzLmluY2x1ZGUucHVzaCgnc2NyaXB0cy8qKi8qJyk7XG4gIHNldHRpbmdzLmluY2x1ZGUuc29ydCgpO1xufVxuXG5mdW5jdGlvbiBub3JtYWxpemVOZXh0VHNjb25maWdNb2R1bGVTZXR0aW5ncyhzZXR0aW5nczogVHNDb25maWdKc29uKTogdm9pZCB7XG4gIGNvbnN0IGNvbXBpbGVyT3B0aW9ucyA9IHNldHRpbmdzLmNvbXBpbGVyT3B0aW9ucztcbiAgaWYgKCFjb21waWxlck9wdGlvbnMpIHJldHVybjtcbiAgY29uc3QgbW9kdWxlUmVzb2x1dGlvbiA9IGxvd2VyQ2FzZVNldHRpbmcoY29tcGlsZXJPcHRpb25zLm1vZHVsZVJlc29sdXRpb24pO1xuICBpZiAobW9kdWxlUmVzb2x1dGlvbiA9PT0gJ25vZGUnIHx8IG1vZHVsZVJlc29sdXRpb24gPT09ICdub2RlMTAnIHx8IG1vZHVsZVJlc29sdXRpb24gPT09IHVuZGVmaW5lZCkge1xuICAgIGlmIChzZXR0aW5ncy5leHRlbmRzKSB7XG4gICAgICAvLyBBbiBleHRlbmRlZCBjb25maWcgbWF5IGFscmVhZHkgc3VwcGx5IGEgdmFsaWQgbW9kdWxlL3Jlc29sdmVyIHBhaXIsIHNvIG9ubHlcbiAgICAgIC8vIHJlbW92ZSB0aGUgcmVtb3ZlZC1pbi1UUzYgbm9kZTEwIHNwZWxsaW5ncyBpbnN0ZWFkIG9mIGZvcmNpbmcgYnVuZGxlciBvbiBpdC5cbiAgICAgIGRlbGV0ZSBjb21waWxlck9wdGlvbnMubW9kdWxlUmVzb2x1dGlvbjtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gTmV4dC5qcyB3cml0ZXMgXCJub2RlXCIgZHVyaW5nIGJ1aWxkIHdoZW4gdGhpcyBvcHRpb24gaXMgbWlzc2luZywgYnV0XG4gICAgICAvLyB0c2dvbGludCB0cmVhdHMgdGhhdCBzcGVsbGluZyBhcyB0aGUgcmVtb3ZlZCBub2RlMTAgcmVzb2x2ZXIuXG4gICAgICBjb21waWxlck9wdGlvbnMubW9kdWxlUmVzb2x1dGlvbiA9ICdidW5kbGVyJztcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gbm9ybWFsaXplTmV4dFRzY29uZmlnUGF0aEFsaWFzZXMoY29tcGlsZXJPcHRpb25zOiBUc0NvbmZpZ0pzb24uQ29tcGlsZXJPcHRpb25zIHwgdW5kZWZpbmVkKTogdm9pZCB7XG4gIGlmICghY29tcGlsZXJPcHRpb25zKSByZXR1cm47XG5cbiAgLy8gdHNnb2xpbnQgZm9sbG93cyBUeXBlU2NyaXB0IDYgdmFsaWRhdGlvbiwgd2hlcmUgYmFzZVVybCBpcyByZW1vdmVkIGFuZFxuICAvLyBwYXRoIHRhcmdldHMgbXVzdCBiZSBleHBsaWNpdGx5IHJlbGF0aXZlLiBOZXh0LmpzIHN0aWxsIGFjY2VwdHMgdGhlIGFsaWFzXG4gIC8vIHNoYXBlIGFmdGVyIGVhY2ggdGFyZ2V0IGlzIHdyaXR0ZW4gd2l0aCBhIGxlYWRpbmcgLi8uXG4gIGRlbGV0ZSBjb21waWxlck9wdGlvbnMuYmFzZVVybDtcbiAgaWYgKCFjb21waWxlck9wdGlvbnMucGF0aHMpIHJldHVybjtcblxuICBmb3IgKGNvbnN0IFthbGlhcywgdGFyZ2V0c10gb2YgT2JqZWN0LmVudHJpZXMoY29tcGlsZXJPcHRpb25zLnBhdGhzKSkge1xuICAgIGNvbXBpbGVyT3B0aW9ucy5wYXRoc1thbGlhc10gPSBub3JtYWxpemVQYXRoQWxpYXNUYXJnZXRzKHRhcmdldHMpO1xuICB9XG59XG5cbmZ1bmN0aW9uIG5vcm1hbGl6ZVBhdGhBbGlhc1RhcmdldHModGFyZ2V0czogc3RyaW5nW10pOiBzdHJpbmdbXSB7XG4gIHJldHVybiB0YXJnZXRzLm1hcCgodGFyZ2V0KSA9PiB7XG4gICAgaWYgKHRhcmdldC5zdGFydHNXaXRoKCcuLycpIHx8IHRhcmdldC5zdGFydHNXaXRoKCcuLi8nKSB8fCBwYXRoLmlzQWJzb2x1dGUodGFyZ2V0KSkgcmV0dXJuIHRhcmdldDtcbiAgICByZXR1cm4gYC4vJHt0YXJnZXR9YDtcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIGdldFJvb3REaXIoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogc3RyaW5nIHtcbiAgaWYgKGNvbmZpZy5pc1Jvb3QpIHJldHVybiAnLic7XG4gIC8vIFRoZSB1bmRpY2ktdHlwZXMgcGF0aCBtYXBwaW5nIG11c3QgcmVhY2ggdGhlIG1vbm9yZXBvIHJvb3QncyBub2RlX21vZHVsZXMgKGJ1bmZpZy50b21sJ3NcbiAgLy8gcHVibGljSG9pc3RQYXR0ZXJuIGhvaXN0cyB0aGUgcGFja2FnZSB0aGVyZSksIGFuZCB3b3Jrc3BhY2UgcGF0dGVybnMgbWF5IGJlIGFyYml0cmFyaWx5IGRlZXBcbiAgLy8gKGUuZy4gYGV4YW1wbGVzLyoqYCksIHNvIGEgZml4ZWQgdHdvLWxldmVsIHByb2JlIGlzIG5vdCBlbm91Z2guIFByZWZlciB0aGUgbmVhcmVzdCBhbmNlc3RvclxuICAvLyBtYW5pZmVzdCB0aGF0IGRlY2xhcmVzIHdvcmtzcGFjZXMgKHRoZSBtb25vcmVwbyByb290KTsgb3RoZXJ3aXNlIGZhbGwgYmFjayB0byB0aGUgbmVhcmVzdFxuICAvLyBhbmNlc3RvciBtYW5pZmVzdC4gU3RvcCBhdCB0aGUgZmlyc3QgZ2l0IHJlcG9zaXRvcnkgYm91bmRhcnkgc28gYW4gdW5yZWxhdGVkIGVuY2xvc2luZ1xuICAvLyByZXBvc2l0b3J5J3MgbWFuaWZlc3QgY2FuIG5ldmVyIGJlIGNob3Nlbi5cbiAgY29uc3QgZGlyUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCk7XG4gIGxldCByb290RGlyUGF0aDogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICBmb3IgKGxldCBhbmNlc3RvckRpclBhdGggPSBwYXRoLmRpcm5hbWUoZGlyUGF0aCk7IDsgYW5jZXN0b3JEaXJQYXRoID0gcGF0aC5kaXJuYW1lKGFuY2VzdG9yRGlyUGF0aCkpIHtcbiAgICBjb25zdCBtYW5pZmVzdFBhdGggPSBwYXRoLnJlc29sdmUoYW5jZXN0b3JEaXJQYXRoLCAncGFja2FnZS5qc29uJyk7XG4gICAgaWYgKGZzLmV4aXN0c1N5bmMobWFuaWZlc3RQYXRoKSkge1xuICAgICAgcm9vdERpclBhdGggPz89IGFuY2VzdG9yRGlyUGF0aDtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IG1hbmlmZXN0ID0gSlNPTi5wYXJzZShmcy5yZWFkRmlsZVN5bmMobWFuaWZlc3RQYXRoLCAndXRmOCcpKSBhcyBQYWNrYWdlSnNvbjtcbiAgICAgICAgLy8gQnVuIG5vLW9wIHBhdHRlcm5zIChlLmcuIGB3b3Jrc3BhY2VzOiBbXCJcIl1gKSBkbyBub3QgbWFrZSBhIG1hbmlmZXN0IGEgd29ya3NwYWNlIHJvb3QuXG4gICAgICAgIGlmIChnZXRNZWFuaW5nZnVsRGVjbGFyZWRXb3Jrc3BhY2VQYXR0ZXJucyhtYW5pZmVzdC53b3Jrc3BhY2VzKS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgcm9vdERpclBhdGggPSBhbmNlc3RvckRpclBhdGg7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2gge1xuICAgICAgICAvLyBBbiB1bnBhcnNhYmxlIG1hbmlmZXN0IHN0aWxsIG1hcmtzIGEgcHJvamVjdCBkaXJlY3Rvcnk7IGtlZXAgY2xpbWJpbmcgZm9yIGEgd29ya3NwYWNlIHJvb3QuXG4gICAgICB9XG4gICAgfVxuICAgIGNvbnN0IGlzUmVwb0JvdW5kYXJ5ID0gZnMuZXhpc3RzU3luYyhwYXRoLnJlc29sdmUoYW5jZXN0b3JEaXJQYXRoLCAnLmdpdCcpKTtcbiAgICBjb25zdCBpc0ZpbGVzeXN0ZW1Sb290ID0gYW5jZXN0b3JEaXJQYXRoID09PSBwYXRoLmRpcm5hbWUoYW5jZXN0b3JEaXJQYXRoKTtcbiAgICBpZiAoaXNSZXBvQm91bmRhcnkgfHwgaXNGaWxlc3lzdGVtUm9vdCkgYnJlYWs7XG4gIH1cbiAgaWYgKCFyb290RGlyUGF0aCkgcmV0dXJuICcuJztcbiAgcmV0dXJuIHBhdGgucmVsYXRpdmUoZGlyUGF0aCwgcm9vdERpclBhdGgpLnJlcGxhY2VBbGwoJ1xcXFwnLCAnLycpIHx8ICcuJztcbn1cblxuZnVuY3Rpb24gbWVyZ2VUc2NvbmZpZ0V4dGVuZHMoXG4gIGdlbmVyYXRlZEV4dGVuZHM6IFRzQ29uZmlnSnNvblsnZXh0ZW5kcyddLFxuICBleGlzdGluZ0V4dGVuZHM6IFRzQ29uZmlnSnNvblsnZXh0ZW5kcyddXG4pOiBUc0NvbmZpZ0pzb25bJ2V4dGVuZHMnXSB7XG4gIGNvbnN0IG1lcmdlZEV4dGVuZHMgPSBbLi4ubm9ybWFsaXplRXh0ZW5kcyhnZW5lcmF0ZWRFeHRlbmRzKSwgLi4ubm9ybWFsaXplRXh0ZW5kcyhleGlzdGluZ0V4dGVuZHMpXTtcbiAgY29uc3QgdW5pcXVlRXh0ZW5kcyA9IFsuLi5uZXcgU2V0KG1lcmdlZEV4dGVuZHMpXTtcbiAgaWYgKHVuaXF1ZUV4dGVuZHMubGVuZ3RoID09PSAwKSByZXR1cm4gdW5kZWZpbmVkO1xuICBpZiAodW5pcXVlRXh0ZW5kcy5sZW5ndGggPT09IDEpIHJldHVybiB1bmlxdWVFeHRlbmRzWzBdO1xuICByZXR1cm4gdW5pcXVlRXh0ZW5kcztcbn1cblxuZnVuY3Rpb24gYWRkSW5jbHVkZVBhdGgoc2V0dGluZ3M6IFRzQ29uZmlnSnNvbiwgZGlyUGF0aDogc3RyaW5nKTogdm9pZCB7XG4gIHNldHRpbmdzLmluY2x1ZGUgPz89IFtdO1xuICBpZiAoIXNldHRpbmdzLmluY2x1ZGUuaW5jbHVkZXMoZGlyUGF0aCkpIHtcbiAgICBzZXR0aW5ncy5pbmNsdWRlLnB1c2goZGlyUGF0aCk7XG4gIH1cbn1cblxuZnVuY3Rpb24gbm9ybWFsaXplRXh0ZW5kcyh2YWx1ZTogVHNDb25maWdKc29uWydleHRlbmRzJ10pOiBzdHJpbmdbXSB7XG4gIGlmICghdmFsdWUpIHJldHVybiBbXTtcbiAgcmV0dXJuIEFycmF5LmlzQXJyYXkodmFsdWUpID8gdmFsdWUgOiBbdmFsdWVdO1xufVxuXG5mdW5jdGlvbiBub3JtYWxpemVTdHJpbmdBcnJheSh2YWx1ZTogdW5rbm93bik6IHN0cmluZ1tdIHtcbiAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycpIHJldHVybiBbdmFsdWVdO1xuICBpZiAoIUFycmF5LmlzQXJyYXkodmFsdWUpKSByZXR1cm4gW107XG4gIHJldHVybiB2YWx1ZS5maWx0ZXIoKGl0ZW0pOiBpdGVtIGlzIHN0cmluZyA9PiB0eXBlb2YgaXRlbSA9PT0gJ3N0cmluZycpO1xufVxuXG5mdW5jdGlvbiBzaG91bGREZWxldGVUeXBlUm9vdHModHlwZU5hbWVzOiBzdHJpbmdbXSk6IGJvb2xlYW4ge1xuICAvLyBPbmx5IGdlbmVyYXRlZCBwYWNrYWdlLW93bmVkIHRlc3QgdHlwZXMgc2hvdWxkIHRyaWdnZXIgdGhpcy4gVXNlci1kZWZpbmVkIHNsYXNoLWJhc2VkXG4gIC8vIGVudHJpZXMgbWF5IGludGVudGlvbmFsbHkgcmVseSBvbiBjdXN0b20gdHlwZVJvb3RzIGFuZCBzaG91bGQgYmUgcHJlc2VydmVkIGFzLWlzLlxuICByZXR1cm4gdHlwZU5hbWVzLnNvbWUoKHR5cGVOYW1lKSA9PiB0eXBlTmFtZSA9PT0gJ2N5cHJlc3MnIHx8IHR5cGVOYW1lLmluY2x1ZGVzKCcvJykpO1xufVxuXG5mdW5jdGlvbiBmaWx0ZXJFeGlzdGluZ1R5cGVzKGV4aXN0aW5nVHlwZXM6IHN0cmluZ1tdLCBnZW5lcmF0ZWRUeXBlczogc3RyaW5nW10pOiBzdHJpbmdbXSB7XG4gIGNvbnN0IGdlbmVyYXRlZFR5cGVTZXQgPSBuZXcgU2V0KGdlbmVyYXRlZFR5cGVzKTtcbiAgcmV0dXJuIGV4aXN0aW5nVHlwZXMuZmlsdGVyKCh0eXBlTmFtZSkgPT4ge1xuICAgIC8vIHdiZnkgb3ducyB0aGVzZSBwYWNrYWdlLXByb3ZpZGVkIHRlc3QgZ2xvYmFscy4gRHJvcCBzdGFsZSBlbnRyaWVzIHdoZW4gdGhlXG4gICAgLy8gY29ycmVzcG9uZGluZyBkZXBlbmRlbmN5IGlzIG5vIGxvbmdlciBwcmVzZW50IHNvIFR5cGVTY3JpcHQgd29uJ3QgcmVxdWlyZVxuICAgIC8vIG1pc3NpbmcgcGFja2FnZXMgc3VjaCBhcyB2aXRlc3QuXG4gICAgaWYgKGlzR2VuZXJhdGVkVGVzdEdsb2JhbFR5cGUodHlwZU5hbWUpICYmICFnZW5lcmF0ZWRUeXBlU2V0Lmhhcyh0eXBlTmFtZSkpIHJldHVybiBmYWxzZTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIGlzR2VuZXJhdGVkVGVzdEdsb2JhbFR5cGUodHlwZU5hbWU6IHN0cmluZyk6IGJvb2xlYW4ge1xuICByZXR1cm4gdHlwZU5hbWUgPT09ICdjeXByZXNzJyB8fCB0eXBlTmFtZSA9PT0gJ2plc3QnIHx8IHR5cGVOYW1lID09PSAnbW9jaGEnIHx8IHR5cGVOYW1lID09PSAndml0ZXN0L2dsb2JhbHMnO1xufVxuXG5mdW5jdGlvbiBsb3dlckNhc2VTZXR0aW5nKHZhbHVlOiB1bmtub3duKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycgPyB2YWx1ZS50b0xvd2VyQ2FzZSgpIDogdW5kZWZpbmVkO1xufVxuXG5mdW5jdGlvbiBwaWNrRXhpc3RpbmdFbWl0TWV0YWRhdGEoXG4gIGNvbXBpbGVyT3B0aW9uczogVHNDb25maWdKc29uWydjb21waWxlck9wdGlvbnMnXVxuKTogUGljazxOb25OdWxsYWJsZTxUc0NvbmZpZ0pzb25bJ2NvbXBpbGVyT3B0aW9ucyddPiwgJ2RlY2xhcmF0aW9uJyB8ICdkZWNsYXJhdGlvbk1hcCcgfCAnc291cmNlTWFwJz4ge1xuICBjb25zdCBlbWl0T3B0aW9ucyA9IHt9IGFzIFBpY2s8XG4gICAgTm9uTnVsbGFibGU8VHNDb25maWdKc29uWydjb21waWxlck9wdGlvbnMnXT4sXG4gICAgJ2RlY2xhcmF0aW9uJyB8ICdkZWNsYXJhdGlvbk1hcCcgfCAnc291cmNlTWFwJ1xuICA+O1xuICBmb3IgKGNvbnN0IGtleSBvZiBbJ2RlY2xhcmF0aW9uJywgJ2RlY2xhcmF0aW9uTWFwJywgJ3NvdXJjZU1hcCddIGFzIGNvbnN0KSB7XG4gICAgY29uc3QgdmFsdWUgPSBjb21waWxlck9wdGlvbnM/LltrZXldO1xuICAgIGlmICh2YWx1ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBlbWl0T3B0aW9uc1trZXldID0gdmFsdWUgYXMgbmV2ZXI7XG4gICAgfVxuICB9XG4gIHJldHVybiBlbWl0T3B0aW9ucztcbn1cblxuZnVuY3Rpb24gZ2V0R2VuZXJhdGVkVHlwZXMoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogc3RyaW5nW10ge1xuICBjb25zdCB0eXBlTmFtZXMgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgY29uc3QgZGVwZW5kZW5jaWVzID0ge1xuICAgIC4uLmNvbmZpZy5wYWNrYWdlSnNvbj8uZGVwZW5kZW5jaWVzLFxuICAgIC4uLmNvbmZpZy5wYWNrYWdlSnNvbj8uZGV2RGVwZW5kZW5jaWVzLFxuICB9O1xuXG4gIC8vIFJlYWN0IE5hdGl2ZSBnZXRzIGl0cyBhbWJpZW50IHR5cGVzIGZyb20gQHRzY29uZmlnL3JlYWN0LW5hdGl2ZSAocmVhY3QtbmF0aXZlLCBqZXN0KS5cbiAgaWYgKCFjb25maWcuZGVwZW5kaW5nLnJlYWN0TmF0aXZlKSB7XG4gICAgdHlwZU5hbWVzLmFkZCgnYnVuJyk7XG4gIH1cbiAgaWYgKFxuICAgIGRlcGVuZGVuY2llcy5qZXN0IHx8XG4gICAgZGVwZW5kZW5jaWVzWydAamVzdC9nbG9iYWxzJ10gfHxcbiAgICBkZXBlbmRlbmNpZXNbJ2plc3QtZW52aXJvbm1lbnQtanNkb20nXSB8fFxuICAgIGRlcGVuZGVuY2llc1sndHMtamVzdCddXG4gICkge1xuICAgIHR5cGVOYW1lcy5hZGQoJ2plc3QnKTtcbiAgfVxuICBpZiAoZGVwZW5kZW5jaWVzLnZpdGVzdCkge1xuICAgIHR5cGVOYW1lcy5hZGQoJ3ZpdGVzdC9nbG9iYWxzJyk7XG4gIH1cbiAgaWYgKGRlcGVuZGVuY2llcy5tb2NoYSkge1xuICAgIHR5cGVOYW1lcy5hZGQoJ21vY2hhJyk7XG4gIH1cbiAgaWYgKGRlcGVuZGVuY2llcy5jeXByZXNzKSB7XG4gICAgdHlwZU5hbWVzLmFkZCgnY3lwcmVzcycpO1xuICB9XG5cbiAgcmV0dXJuIFsuLi50eXBlTmFtZXNdO1xufVxuIiwiaW1wb3J0IG9zIGZyb20gJ25vZGU6b3MnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IG1lcmdlIGZyb20gJ2RlZXBtZXJnZSc7XG5cbmltcG9ydCB7IGZzVXRpbCB9IGZyb20gJy4uL3V0aWxzL2ZzVXRpbC5qcyc7XG5pbXBvcnQgeyBqc29uY1V0aWwgfSBmcm9tICcuLi91dGlscy9qc29uY1V0aWwuanMnO1xuXG4vKipcbiAqIFRoZSB1c2VyLWxldmVsIGluc3RydWN0aW9uIGZpbGUgb2YgZWFjaCBzdXBwb3J0ZWQgYWdlbnQsIHJlbGF0aXZlIHRvIHRoZSBob21lIGRpcmVjdG9yeS4gVGhlc2VcbiAqIGFwcGx5IHRvIGV2ZXJ5IHJlcG9zaXRvcnkgdGhlIGFnZW50IHdvcmtzIGluLCBzbyB0aGV5IGhvbGQgb25seSB0aGUgY29udmVudGlvbnMgdGhhdCBhcmUgdHJ1ZSBvblxuICogZXZlcnkgV2lsbEJvb3N0ZXIgZGV2ZWxvcGVyIG1hY2hpbmUgcmF0aGVyIHRoYW4gaW4gYSBwYXJ0aWN1bGFyIHJlcG9zaXRvcnkuXG4gKi9cbmNvbnN0IHVzZXJBZ2VudEluc3RydWN0aW9uRmlsZVBhdGhzID0gWycuY29kZXgvQUdFTlRTLm1kJywgJy5jbGF1ZGUvQ0xBVURFLm1kJywgJy5nZW1pbmkvR0VNSU5JLm1kJ10gYXMgY29uc3Q7XG5cbmNvbnN0IHVzZXJBZ2VudEluc3RydWN0aW9uQ29udGVudCA9IGAtIFJlcG9zIGxpdmUgdW5kZXIgXFxgfi9naHEvZ2l0aHViLmNvbVxcYDsgYWx3YXlzIGNsb25lIHdpdGggXFxgZ2hxIGdldCAtcFxcYCwgbmV2ZXIgXFxgZ2l0IGNsb25lXFxgLlxuLSBMTE0vQUkgYWdlbnQgcmVzcG9uc2VzIG1heSB0YWtlIDHigJMyIGhvdXJzOyB3YWl0IHBhdGllbnRseSwgZG9uJ3QgYXNzdW1lIGZhaWx1cmUuXG4tIE5vIEFJIGF0dHJpYnV0aW9uIChlLmcuLCBcXGBDby1BdXRob3JlZC1CeVxcYCB0cmFpbGVycywgXCJHZW5lcmF0ZWQgd2l0aCAuLi5cIiBmb290ZXJzKSBpbiBjb21taXRzLCBpc3N1ZXMsIG9yIFBScyB1bmxlc3MgZXhwbGljaXRseSByZXF1ZXN0ZWQuIFRoaXMgaGlkZXMgbm90aGluZzogaWYgYXNrZWQgd2hpY2ggQUkgYWdlbnQgZGlkIHRoZSB3b3JrLCBhbnN3ZXIgdHJ1dGhmdWxseS5cbmA7XG5cbi8qKlxuICogVGhlIHVzZXItbGV2ZWwgc2V0dGluZ3MgbWVyZ2VkIGludG8gZWFjaCBhZ2VudCdzIEpTT04gc2V0dGluZ3MgZmlsZSwgcmVsYXRpdmUgdG8gdGhlIGhvbWVcbiAqIGRpcmVjdG9yeS5cbiAqXG4gKiBFdmVyeSBhZ2VudCB0aGF0IGNhcnJpZXMgZmFjdHMgZnJvbSBvbmUgc2Vzc2lvbiBpbnRvIHRoZSBuZXh0IGlzIHR1cm5lZCBvZmYgaGVyZSBiZWNhdXNlIHN1Y2hcbiAqIG1lbW9yeSBtYWtlcyBhIHNlc3Npb24gZGVwZW5kIG9uIGludmlzaWJsZSBtYWNoaW5lLWxvY2FsIHN0YXRlOiBpdHMgYmVoYXZpb3Igc3RvcHMgYmVpbmdcbiAqIHJlcHJvZHVjaWJsZSBhY3Jvc3MgZGV2ZWxvcGVycyBhbmQgQ0ksIGFuZCBhIHN0YWxlIG9yIHdyb25nIG1lbW9yeSBzaWxlbnRseSBvdmVycmlkZXMgdGhlXG4gKiBpbnN0cnVjdGlvbiBmaWxlcyBhYm92ZS4gQ29kZXggbmVlZHMgbm8gZW50cnkgYmVjYXVzZSBpdHMgbWVtb3JpZXMgYXJlIG9wdC1pblxuICogKGBbZmVhdHVyZXNdIG1lbW9yaWVzID0gdHJ1ZWAgaW4gYH4vLmNvZGV4L2NvbmZpZy50b21sYCksIHNvIGxlYXZpbmcgdGhhdCBmbGFnIHVuc2V0IGlzIGVub3VnaC5cbiAqL1xuY29uc3QgYWdlbnRTZXR0aW5ncyA9IFtcbiAge1xuICAgIHJlbGF0aXZlUGF0aDogJy5jbGF1ZGUvc2V0dGluZ3MuanNvbicsXG4gICAgYWNjZXB0c0NvbW1lbnRzOiBmYWxzZSxcbiAgICAvKipcbiAgICAgKiBDbGF1ZGUgQ29kZSBpbmplY3RzIGl0cyBvd24gYXR0cmlidXRpb24gZGlyZWN0aXZlIChhIGBDby1BdXRob3JlZC1CeWAgdHJhaWxlciwgYSBcIkdlbmVyYXRlZFxuICAgICAqIHdpdGhcIiBmb290ZXIsIGFuZCBhIHNlc3Npb24gbGluaykgaW50byB0aGUgdG9vbCBkZXNjcmlwdGlvbnMgYW5kIG1pZC1zZXNzaW9uIHJlbWluZGVycywgYW5kXG4gICAgICogdGhhdCBkaXJlY3RpdmUgZGVjbGFyZXMgaXRzZWxmIHRvIHJlcGxhY2UgZWFybGllciBndWlkYW5jZSwgc28gdGhlIGluc3RydWN0aW9uIGZpbGUgYWxvbmVcbiAgICAgKiBjYW5ub3Qgc3VwcHJlc3MgaXQuIE9ubHkgdGhpcyBzZXR0aW5nIHJlbW92ZXMgdGhlIGRpcmVjdGl2ZSBhdCBpdHMgc291cmNlLiBBdXRvIG1lbW9yeSBpcyBvblxuICAgICAqIGJ5IGRlZmF1bHQsIHNvIGl0IG11c3QgYmUgdHVybmVkIG9mZiBleHBsaWNpdGx5LlxuICAgICAqL1xuICAgIHNldHRpbmdzOiB7XG4gICAgICBhdHRyaWJ1dGlvbjoge1xuICAgICAgICBjb21taXQ6ICcnLFxuICAgICAgICBwcjogJycsXG4gICAgICAgIHNlc3Npb25Vcmw6IGZhbHNlLFxuICAgICAgfSxcbiAgICAgIGF1dG9NZW1vcnlFbmFibGVkOiBmYWxzZSxcbiAgICB9LFxuICB9LFxuICB7XG4gICAgcmVsYXRpdmVQYXRoOiAnLmdlbWluaS9zZXR0aW5ncy5qc29uJyxcbiAgICAvLyBHZW1pbmkgQ0xJIHN0cmlwcyBjb21tZW50cyBiZWZvcmUgcGFyc2luZyBpdHMgc2V0dGluZ3MgZmlsZSwgdW5saWtlIENsYXVkZSBDb2RlLCB3aGljaFxuICAgIC8vIHJlamVjdHMgYSBjb21tZW50ZWQgZmlsZSBhcyBtYWxmb3JtZWQuXG4gICAgYWNjZXB0c0NvbW1lbnRzOiB0cnVlLFxuICAgIHNldHRpbmdzOiB7XG4gICAgICBleHBlcmltZW50YWw6IHtcbiAgICAgICAgYXV0b01lbW9yeTogZmFsc2UsXG4gICAgICB9LFxuICAgIH0sXG4gIH0sXG5dIGFzIGNvbnN0O1xuXG4vKipcbiAqIE92ZXJ3cml0ZXMgdGhlIHVzZXItbGV2ZWwgaW5zdHJ1Y3Rpb24gZmlsZXMgb2YgZXZlcnkgc3VwcG9ydGVkIGFnZW50IHdpdGggdGhlIGZpeGVkIGNvbnRlbnQgYW5kXG4gKiBtZXJnZXMgdGhlIGZpeGVkIHNldHRpbmdzIGludG8gZWFjaCBhZ2VudCdzIHVzZXIgc2V0dGluZ3MuIFJldHVybnMgZmFsc2Ugd2hlbiBhbnkgZmlsZSB3YXNcbiAqIHNraXBwZWQgKGUuZy4gYSBzeW1saW5rZWQgb3IgdW5wYXJzYWJsZSBmaWxlKSwgc28gdGhlIGNvbW1hbmQgY2FuIGZhaWwgbG91ZGx5LlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVVc2VyQWdlbnRDb25maWdzKCk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICBsZXQgaGFzV3JpdHRlbkFsbCA9IHRydWU7XG4gIGZvciAoY29uc3QgcmVsYXRpdmVQYXRoIG9mIHVzZXJBZ2VudEluc3RydWN0aW9uRmlsZVBhdGhzKSB7XG4gICAgY29uc3QgaGFzV3JpdHRlbiA9IGF3YWl0IGZzVXRpbC5nZW5lcmF0ZUZpbGUocGF0aC5qb2luKG9zLmhvbWVkaXIoKSwgcmVsYXRpdmVQYXRoKSwgdXNlckFnZW50SW5zdHJ1Y3Rpb25Db250ZW50KTtcbiAgICBoYXNXcml0dGVuQWxsICYmPSBoYXNXcml0dGVuO1xuICB9XG4gIGZvciAoY29uc3QgeyBhY2NlcHRzQ29tbWVudHMsIHJlbGF0aXZlUGF0aCwgc2V0dGluZ3MgfSBvZiBhZ2VudFNldHRpbmdzKSB7XG4gICAgLy8gQXdhaXRlZCBzZXBhcmF0ZWx5OiBgJiY9YCB3b3VsZCBza2lwIHRoZSBtZXJnZSBvbmNlIGFuIGVhcmxpZXIgZmlsZSB3YXMgc2tpcHBlZC5cbiAgICBjb25zdCBoYXNNZXJnZWQgPSBhd2FpdCBtZXJnZUFnZW50U2V0dGluZ3MocmVsYXRpdmVQYXRoLCBzZXR0aW5ncywgYWNjZXB0c0NvbW1lbnRzKTtcbiAgICBoYXNXcml0dGVuQWxsICYmPSBoYXNNZXJnZWQ7XG4gIH1cbiAgcmV0dXJuIGhhc1dyaXR0ZW5BbGw7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIG1lcmdlQWdlbnRTZXR0aW5ncyhcbiAgcmVsYXRpdmVQYXRoOiBzdHJpbmcsXG4gIG5ld1NldHRpbmdzOiBvYmplY3QsXG4gIGFjY2VwdHNDb21tZW50czogYm9vbGVhblxuKTogUHJvbWlzZTxib29sZWFuPiB7XG4gIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5qb2luKG9zLmhvbWVkaXIoKSwgcmVsYXRpdmVQYXRoKTtcbiAgY29uc3QgZXhpc3RpbmdDb250ZW50ID0gYXdhaXQgZnNVdGlsLnJlYWRGaWxlSWZFeGlzdHMoZmlsZVBhdGgpO1xuICBsZXQgZXhpc3RpbmdTZXR0aW5nczogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPSB7fTtcbiAgaWYgKGV4aXN0aW5nQ29udGVudCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgLy8gQW4gYWdlbnQgaWdub3JlcyBpdHMgd2hvbGUgc2V0dGluZ3MgZmlsZSB3aGVuIHRoZSBmaWxlIGJyZWFrcyB0aGUgZ3JhbW1hciB0aGUgYWdlbnQgcmVhZHMgaXRcbiAgICAvLyB3aXRoLCBzbyB3YmZ5IGxlYXZlcyBzdWNoIGEgZmlsZSB0byB0aGUgZGV2ZWxvcGVyIHRvIHJlcGFpciByYXRoZXIgdGhhbiByZXdyaXRpbmcgaXQgaW50byBhXG4gICAgLy8gZmlsZSB0aGUgYWdlbnQgc3RpbGwgaWdub3JlczogY29tbWVudHMgYXJlIHRvbGVyYXRlZCBvbmx5IHdoZXJlIHRoZSBhZ2VudCBzdHJpcHMgdGhlbSwgYW5kXG4gICAgLy8gdHJhaWxpbmcgY29tbWFzIG5vd2hlcmUsIHNpbmNlIGJvdGggYWdlbnRzIHBhcnNlIHdpdGggSlNPTi5wYXJzZSBpbiB0aGUgZW5kLiBDb21tZW50LW9ubHlcbiAgICAvLyBjb250ZW50IGlzIGNoZWNrZWQgdG9vLCBiZWNhdXNlIGl0IGlzIGtlcHQgYXMgYSBoZWFkZXIgYWJvdmUgdGhlIGdlbmVyYXRlZCBvYmplY3QuXG4gICAgaWYgKCFhY2NlcHRzQ29tbWVudHMgJiYganNvbmNVdGlsLmNvbnRhaW5zQ29tbWVudChleGlzdGluZ0NvbnRlbnQpKSB7XG4gICAgICBjb25zb2xlLndhcm4oYFNraXBwZWQgdXBkYXRpbmcgJHtmaWxlUGF0aH0gYmVjYXVzZSB0aGlzIGFnZW50IHJlYWRzIGl0IGFzIHN0cmljdCBKU09OLCBjb21tZW50cyBhbmQgYWxsLmApO1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBpZiAoIWpzb25jVXRpbC5pc1RyaXZpYU9ubHkoZXhpc3RpbmdDb250ZW50KSkge1xuICAgICAgY29uc3QgcGFyc2VkU2V0dGluZ3MgPSBqc29uY1V0aWwucGFyc2VPYmplY3RJZ25vcmluZ0Vycm9yPFJlY29yZDxzdHJpbmcsIHVua25vd24+PihleGlzdGluZ0NvbnRlbnQsIGZhbHNlKTtcbiAgICAgIGlmICghcGFyc2VkU2V0dGluZ3MpIHtcbiAgICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICAgIGBTa2lwcGVkIHVwZGF0aW5nICR7ZmlsZVBhdGh9IGJlY2F1c2UgdGhlIGV4aXN0aW5nIGNvbnRlbnQgaXMgbm90IGEgc3RyaWN0IEpTT04gb2JqZWN0IChhIHRyYWlsaW5nIGNvbW1hLCBmb3IgZXhhbXBsZSwgaXMgbm90IGFsbG93ZWQpLmBcbiAgICAgICAgKTtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgICAgZXhpc3RpbmdTZXR0aW5ncyA9IHBhcnNlZFNldHRpbmdzO1xuICAgIH1cbiAgfVxuICBjb25zdCBzZXR0aW5ncyA9IG1lcmdlKGV4aXN0aW5nU2V0dGluZ3MsIG5ld1NldHRpbmdzKTtcbiAgLy8gT25seSB0aGUgcHJvcGVydGllcyB3aG9zZSB2YWx1ZSBjaGFuZ2VzIGFyZSByZXdyaXR0ZW4sIHNvIHRoZSBmaWxlIGtlZXBzIGl0cyBvd24gZm9ybWF0dGluZ1xuICAvLyBhbmQsIHdoZXJlIHRoZSBhZ2VudCBhbGxvd3MgdGhlbSwgaXRzIGNvbW1lbnRzLlxuICBjb25zdCB7IGNvbnRlbnQsIGtleXNMb3NpbmdDb21tZW50cyB9ID0ganNvbmNVdGlsLnN0cmluZ2lmeVByZXNlcnZpbmdUcml2aWEoZXhpc3RpbmdDb250ZW50LCBzZXR0aW5ncyk7XG4gIGlmICghKGF3YWl0IGZzVXRpbC5nZW5lcmF0ZUZpbGUoZmlsZVBhdGgsIGNvbnRlbnQpKSkgcmV0dXJuIGZhbHNlO1xuXG4gIGZvciAoY29uc3Qga2V5IG9mIGtleXNMb3NpbmdDb21tZW50cykge1xuICAgIGNvbnNvbGUud2FybihgQ29tbWVudHMgaW5zaWRlIFwiJHtrZXl9XCIgd2VyZSBkcm9wcGVkIHdoaWxlIHJld3JpdGluZyBpdCBpbiAke2ZpbGVQYXRofS5gKTtcbiAgfVxuICByZXR1cm4gdHJ1ZTtcbn1cbiIsImltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCBtZXJnZSBmcm9tICdkZWVwbWVyZ2UnO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBmc1V0aWwgfSBmcm9tICcuLi91dGlscy9mc1V0aWwuanMnO1xuaW1wb3J0IHsganNvbmNVdGlsIH0gZnJvbSAnLi4vdXRpbHMvanNvbmNVdGlsLmpzJztcbmltcG9ydCB7IHNvcnRLZXlzIH0gZnJvbSAnLi4vdXRpbHMvb2JqZWN0VXRpbC5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcblxuY29uc3QgZXhjbHVkZUZpbGVQYXR0ZXJucyA9IFtcbiAgJyoqLy5naXQvb2JqZWN0cy8qKicsXG4gICcqKi8uZ2l0L3N1YnRyZWUtY2FjaGUvKionLFxuICAnKiovbm9kZV9tb2R1bGVzLyoqJyxcbiAgJyoqL3RtcC8qKicsXG4gICcqKi90ZW1wLyoqJyxcbiAgJyoqL2Rpc3QvKionLFxuXTtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlVnNjb2RlU2V0dGluZ3MoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZ2VuZXJhdGVWc2NvZGVTZXR0aW5ncycsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJy52c2NvZGUnLCAnc2V0dGluZ3MuanNvbicpO1xuICAgIGNvbnN0IGV4aXN0aW5nQ29udGVudCA9IGF3YWl0IGZzVXRpbC5yZWFkRmlsZUlmRXhpc3RzKGZpbGVQYXRoKTtcbiAgICBpZiAoZXhpc3RpbmdDb250ZW50ID09PSB1bmRlZmluZWQgfHwganNvbmNVdGlsLmlzVHJpdmlhT25seShleGlzdGluZ0NvbnRlbnQpKSByZXR1cm47XG4gICAgLy8gLnZzY29kZS9zZXR0aW5ncy5qc29uIGlzIEpTT05DIGJ5IGRlZmluaXRpb247IEpTT04ucGFyc2Ugd291bGQgbWFrZSB3YmZ5IHNpbGVudGx5IHNraXBcbiAgICAvLyBjb21tZW50ZWQgZmlsZXMuXG4gICAgY29uc3QgcGFyc2VkU2V0dGluZ3MgPSBqc29uY1V0aWwucGFyc2VPYmplY3RJZ25vcmluZ0Vycm9yPG9iamVjdD4oZXhpc3RpbmdDb250ZW50KTtcbiAgICBpZiAoIXBhcnNlZFNldHRpbmdzKSB7XG4gICAgICBjb25zb2xlLndhcm4oYFNraXBwZWQgdXBkYXRpbmcgJHtmaWxlUGF0aH0gYmVjYXVzZSB0aGUgZXhpc3RpbmcgY29udGVudCBpcyBub3QgcGFyc2FibGUgYXMgSlNPTkMuYCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IG9yaWdpbmFsU2V0dGluZ3NKc29uID0gSlNPTi5zdHJpbmdpZnkoc29ydEtleXMoc3RydWN0dXJlZENsb25lKHBhcnNlZFNldHRpbmdzKSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPikpO1xuICAgIGxldCBzZXR0aW5ncyA9IHBhcnNlZFNldHRpbmdzO1xuICAgIGZvciAoY29uc3QgZXhjbHVkZUZpbGVQYXR0ZXJuIG9mIGV4Y2x1ZGVGaWxlUGF0dGVybnMpIHtcbiAgICAgIHNldHRpbmdzID0gbWVyZ2UuYWxsKFtzZXR0aW5ncywgZXhjbHVkZVNldHRpbmcoZXhjbHVkZUZpbGVQYXR0ZXJuKV0pO1xuICAgIH1cbiAgICBpZiAoY29uZmlnLmRvZXNDb250YWluUG9ldHJ5TG9jayB8fCBjb25maWcuZG9lc0NvbnRhaW5VdkxvY2spIHtcbiAgICAgIHNldHRpbmdzID0gbWVyZ2UuYWxsKFtzZXR0aW5ncywgZXhjbHVkZVNldHRpbmcoJyoqLy52ZW52LyoqJyldKTtcbiAgICB9XG4gICAgaWYgKGNvbmZpZy5kZXBlbmRpbmcubmV4dCkge1xuICAgICAgc2V0dGluZ3MgPSBtZXJnZS5hbGwoW3NldHRpbmdzLCBleGNsdWRlU2V0dGluZygnKiovLm5leHQvKionKV0pO1xuICAgIH1cbiAgICBzb3J0S2V5cyhzZXR0aW5ncyBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPik7XG4gICAgLy8gU2tpcCB0aGUgd3JpdGUgd2hlbiBub3RoaW5nIGNoYW5nZXMgc2VtYW50aWNhbGx5LCBzbyBKU09OQyBjb21tZW50cyBhbmQgZm9ybWF0dGluZyBpbiBhblxuICAgIC8vIGFscmVhZHktY2xlYW4gc2V0dGluZ3MuanNvbiBzdXJ2aXZlIHdiZnkgcnVucy5cbiAgICBpZiAoSlNPTi5zdHJpbmdpZnkoc2V0dGluZ3MpID09PSBvcmlnaW5hbFNldHRpbmdzSnNvbikgcmV0dXJuO1xuICAgIGNvbnN0IG5ld0NvbnRlbnQgPSBKU09OLnN0cmluZ2lmeShzZXR0aW5ncywgdW5kZWZpbmVkLCAyKTtcbiAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnNVdGlsLmdlbmVyYXRlRmlsZShmaWxlUGF0aCwgbmV3Q29udGVudCkpO1xuICB9KTtcbn1cblxuZnVuY3Rpb24gZXhjbHVkZVNldHRpbmcoZXhjbHVkZUZpbGVQYXR0ZXJuOiBzdHJpbmcpOiBvYmplY3Qge1xuICByZXR1cm4ge1xuICAgICdmaWxlcy53YXRjaGVyRXhjbHVkZSc6IHtcbiAgICAgIFtleGNsdWRlRmlsZVBhdHRlcm5dOiB0cnVlLFxuICAgIH0sXG4gIH07XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBmc1V0aWwgfSBmcm9tICcuLi91dGlscy9mc1V0aWwuanMnO1xuXG5pbnRlcmZhY2UgRm5veFRvbWxTdWJ0cmVlIHtcbiAgc2VjcmV0cz86IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICBwcm9maWxlcz86IFJlY29yZDxzdHJpbmcsIHsgc2VjcmV0cz86IFJlY29yZDxzdHJpbmcsIHVua25vd24+IH0gfCB1bmRlZmluZWQ+O1xufVxuXG4vLyBUaGUgZm91ciBzdGFuZGFyZCBXQl9FTlYgbW9kZXM7IHN0YWdpbmcgaXMgb3B0aW9uYWwgYW5kIG9ubHkgY29tcGxldGVkIHdoZW4gdGhlIHJlcG9zaXRvcnlcbi8vIGFscmVhZHkgZGVjbGFyZXMgdGhlIHN0YWdpbmcgcHJvZmlsZS5cbmNvbnN0IHdiRW52TW9kZXMgPSBbJ2RldmVsb3BtZW50JywgJ3Rlc3QnLCAnc3RhZ2luZycsICdwcm9kdWN0aW9uJ10gYXMgY29uc3Q7XG50eXBlIFdiRW52TW9kZSA9ICh0eXBlb2Ygd2JFbnZNb2RlcylbbnVtYmVyXTtcblxuLyoqXG4gKiBFbnN1cmVzIGEgZm5veCByZXBvc2l0b3J5IGRlZmluZXMgV0JfRU5WIGZvciBldmVyeSBzdGFuZGFyZCBtb2RlIChhbmQgTkVYVF9QVUJMSUNfV0JfRU5WIHdoZW5cbiAqIGFueSB3b3Jrc3BhY2UgZGVwZW5kcyBvbiBOZXh0LmpzIG9yIHZpbmV4dCkgaW4gZm5veC50b21sIHByb2ZpbGVzLiBFeGlzdGluZyBkZWZpbml0aW9ucyBhcmVcbiAqIGFsd2F5cyBsZWZ0IHVudG91Y2hlZC4gTm9uLWZub3ggcmVwb3NpdG9yaWVzIGFyZSBza2lwcGVkOiAuZW52IGZpbGVzIGFyZSBubyBsb25nZXIgbWFuYWdlZC5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGVuc3VyZVdiRW52RGVmaW5pdGlvbnMocm9vdENvbmZpZzogUGFja2FnZUNvbmZpZywgYWxsQ29uZmlnczogUGFja2FnZUNvbmZpZ1tdKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZW5zdXJlV2JFbnZEZWZpbml0aW9ucycsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBuZWVkc05leHRQdWJsaWMgPSBhbGxDb25maWdzLnNvbWUoKGNvbmZpZykgPT4gcmVxdWlyZXNOZXh0UHVibGljV2JFbnYoY29uZmlnKSk7XG4gICAgY29uc3QgZm5veFRvbWxQYXRoID0gcGF0aC5yZXNvbHZlKHJvb3RDb25maWcuZGlyUGF0aCwgJ2Zub3gudG9tbCcpO1xuICAgIC8vIGxzdGF0LCBub3QgZXhpc3RzU3luYzogZXhpc3RzU3luYyBpcyBmYWxzZSBmb3IgYSBEQU5HTElORyBmbm94LnRvbWwgc3ltbGluazsgYW55IGZub3gudG9tbFxuICAgIC8vIGRpcmVjdG9yeSBlbnRyeSBtYXJrcyBhIGZub3ggcmVwb3NpdG9yeSwgYW5kIGEgcmVmdXNlZC9kYW5nbGluZyBvbmUgYWJvcnRzIGluc3RlYWQgb2ZcbiAgICAvLyBiZWluZyB0cmVhdGVkIGFzIGEgbm9uLWZub3ggcmVwb3NpdG9yeSB3aGlsZSB0aGUgZm5veCBzeW5jaHJvbml6YXRpb24gaXMgZmFpbGluZy5cbiAgICBpZiAoIShhd2FpdCBmcy5wcm9taXNlcy5sc3RhdChmbm94VG9tbFBhdGgpLmNhdGNoKCgpID0+IHt9KSkpIHJldHVybjtcbiAgICBjb25zdCBjb250ZW50ID0gYXdhaXQgZnNVdGlsLnJlYWRGaWxlQ29uZmluZWRJZkV4aXN0cyhmbm94VG9tbFBhdGgpO1xuICAgIGlmIChjb250ZW50ID09PSB1bmRlZmluZWQpIHJldHVybjtcbiAgICBjb25zdCB1cGRhdGVkQ29udGVudCA9IGluc2VydFdiRW52SW50b0Zub3hUb21sKGNvbnRlbnQsIG5lZWRzTmV4dFB1YmxpYyk7XG4gICAgaWYgKHVwZGF0ZWRDb250ZW50ICE9PSB1bmRlZmluZWQgJiYgdXBkYXRlZENvbnRlbnQgIT09IGNvbnRlbnQpIHtcbiAgICAgIGF3YWl0IGZzVXRpbC5nZW5lcmF0ZUZpbGUoZm5veFRvbWxQYXRoLCB1cGRhdGVkQ29udGVudCk7XG4gICAgfVxuICB9KTtcbn1cblxuLyoqXG4gKiBNaXJyb3JzIHdiJ3MgcmVxdWlyZXNOZXh0UHVibGljV2JFbnYgY29udHJhY3QgKHBhY2thZ2VzL3diL3NyYy9wcm9qZWN0LnRzKTogdGhlIGZyYW1ld29yayBtYXlcbiAqIGJlIGRlY2xhcmVkIGluIEFOWSBvZiB0aGUgZm91ciBkZXBlbmRlbmN5IHNlY3Rpb25zIChlLmcuIGBuZXh0YCBhcyBhIGRldkRlcGVuZGVuY3kgaW4gYSBzaGFyZWRcbiAqIGNvbXBvbmVudCBsaWJyYXJ5KSwgd2hpbGUgd2JmeSdzIGBkZXBlbmRpbmcubmV4dGAgbG9va3Mgb25seSBhdCByZWd1bGFyIGRlcGVuZGVuY2llcy5cbiAqL1xuZnVuY3Rpb24gcmVxdWlyZXNOZXh0UHVibGljV2JFbnYoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogYm9vbGVhbiB7XG4gIHJldHVybiBbJ2RlcGVuZGVuY2llcycsICdkZXZEZXBlbmRlbmNpZXMnLCAnb3B0aW9uYWxEZXBlbmRlbmNpZXMnLCAncGVlckRlcGVuZGVuY2llcyddLnNvbWUoKHNlY3Rpb24pID0+IHtcbiAgICBjb25zdCBkZXBlbmRlbmNpZXMgPSBjb25maWcucGFja2FnZUpzb24/LltzZWN0aW9uIGFzICdkZXBlbmRlbmNpZXMnXTtcbiAgICByZXR1cm4gISFkZXBlbmRlbmNpZXM/LlsnbmV4dCddIHx8ICEhZGVwZW5kZW5jaWVzPy5bJ3ZpbmV4dCddO1xuICB9KTtcbn1cblxuLyoqXG4gKiBJbnNlcnRzIG1pc3NpbmcgV0JfRU5WIChhbmQgb3B0aW9uYWxseSBORVhUX1BVQkxJQ19XQl9FTlYpIGVudHJpZXMgaW50byBhIGZub3gudG9tbDogdGhlIGJhc2VcbiAqIGBbc2VjcmV0c11gIHRhYmxlIGNhcnJpZXMgdGhlIGRldmVsb3BtZW50IGRlZmF1bHRzIGFuZCBgW3Byb2ZpbGVzLjxtb2RlPi5zZWNyZXRzXWAgb3ZlcmxheXNcbiAqIGVhY2ggb3RoZXIgbW9kZSwgbWF0Y2hpbmcgdGhlIG9yZy1zdGFuZGFyZCBsYXlvdXQuIEZvcm1hdHRpbmcgYW5kIGNvbW1lbnRzIGFyZSBwcmVzZXJ2ZWQ7IG9ubHlcbiAqIG1pc3NpbmcgbGluZXMgYXJlIGluc2VydGVkIG9yIG1pc3Npbmcgc2VjdGlvbnMgYXBwZW5kZWQuIFJldHVybnMgdW5kZWZpbmVkIHdoZW4gdGhlIGNvbnRlbnRcbiAqIGNhbm5vdCBiZSBzYWZlbHkgZWRpdGVkICh1bnBhcnNhYmxlIGJlZm9yZSBvciBhZnRlciB0aGUgZWRpdCkuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpbnNlcnRXYkVudkludG9Gbm94VG9tbChjb250ZW50OiBzdHJpbmcsIG5lZWRzTmV4dFB1YmxpYzogYm9vbGVhbik6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGxldCBzZXR0aW5nczogRm5veFRvbWxTdWJ0cmVlO1xuICB0cnkge1xuICAgIHNldHRpbmdzID0gQnVuLlRPTUwucGFyc2UoY29udGVudCkgYXMgRm5veFRvbWxTdWJ0cmVlO1xuICB9IGNhdGNoIHtcbiAgICBjb25zb2xlLndhcm4oJ1NraXBwZWQgaW5zZXJ0aW5nIFdCX0VOViBpbnRvIGZub3gudG9tbCBiZWNhdXNlIGl0IGlzIG5vdCBwYXJzYWJsZSBhcyBUT01MLicpO1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cblxuICBjb25zdCBrZXlOYW1lcyA9IG5lZWRzTmV4dFB1YmxpYyA/IFsnV0JfRU5WJywgJ05FWFRfUFVCTElDX1dCX0VOViddIDogWydXQl9FTlYnXTtcbiAgbGV0IHVwZGF0ZWRDb250ZW50ID0gY29udGVudDtcbiAgZm9yIChjb25zdCBtb2RlIG9mIHdiRW52TW9kZXMpIHtcbiAgICAvLyBUaGUgc3RhZ2luZyBtb2RlIGlzIG9wdGlvbmFsOiBjb21wbGV0ZSBpdCBvbmx5IHdoZW4gdGhlIHJlcG9zaXRvcnkgYWxyZWFkeSBkZWNsYXJlcyB0aGUgcHJvZmlsZS5cbiAgICBpZiAobW9kZSA9PT0gJ3N0YWdpbmcnICYmICFzZXR0aW5ncy5wcm9maWxlcz8uc3RhZ2luZykgY29udGludWU7XG4gICAgY29uc3QgZGVmaW5lZEtleXMgPSBtb2RlID09PSAnZGV2ZWxvcG1lbnQnID8gc2V0dGluZ3Muc2VjcmV0cyA6IHNldHRpbmdzLnByb2ZpbGVzPy5bbW9kZV0/LnNlY3JldHM7XG4gICAgZm9yIChjb25zdCBrZXlOYW1lIG9mIGtleU5hbWVzKSB7XG4gICAgICBjb25zdCBkZWZpbmVkID0gZGVmaW5lZEtleXM/LltrZXlOYW1lXTtcbiAgICAgIGNvbnN0IGRlZmluZWRWYWx1ZSA9XG4gICAgICAgIHR5cGVvZiBkZWZpbmVkID09PSAnc3RyaW5nJyA/IGRlZmluZWQgOiAoZGVmaW5lZCBhcyB7IGRlZmF1bHQ/OiB1bmtub3duIH0gfCB1bmRlZmluZWQpPy5kZWZhdWx0O1xuICAgICAgd2Fybk9uVW5leHBlY3RlZFdiRW52VmFsdWUoa2V5TmFtZSwgZGVmaW5lZFZhbHVlLCBtb2RlKTtcbiAgICB9XG4gICAgY29uc3QgbWlzc2luZ0xpbmVzID0ga2V5TmFtZXNcbiAgICAgIC5maWx0ZXIoKGtleU5hbWUpID0+IGRlZmluZWRLZXlzPy5ba2V5TmFtZV0gPT09IHVuZGVmaW5lZClcbiAgICAgIC5tYXAoKGtleU5hbWUpID0+IGAke2tleU5hbWV9ID0geyBkZWZhdWx0ID0gXCIke21vZGV9XCIgfWApO1xuICAgIGlmIChtaXNzaW5nTGluZXMubGVuZ3RoID09PSAwKSBjb250aW51ZTtcbiAgICB1cGRhdGVkQ29udGVudCA9IGluc2VydEludG9Gbm94U2VjdGlvbihcbiAgICAgIHVwZGF0ZWRDb250ZW50LFxuICAgICAgbW9kZSA9PT0gJ2RldmVsb3BtZW50JyA/ICdzZWNyZXRzJyA6IGBwcm9maWxlcy4ke21vZGV9LnNlY3JldHNgLFxuICAgICAgbWlzc2luZ0xpbmVzXG4gICAgKTtcbiAgfVxuICBpZiAodXBkYXRlZENvbnRlbnQgPT09IGNvbnRlbnQpIHJldHVybiBjb250ZW50O1xuXG4gIC8vIFJlLXBhcnNlIGJlZm9yZSByZXR1cm5pbmc6IGFuIHVudXN1YWwgbGF5b3V0IChlLmcuIGRvdHRlZCBrZXlzIHdpdGhvdXQgYSB0YWJsZSBoZWFkZXIpIGNvdWxkXG4gIC8vIG1ha2UgdGhlIHRleHR1YWwgZWRpdCBwcm9kdWNlIGEgZHVwbGljYXRlIHRhYmxlOyBmYWlsIHNhZmVseSBpbnN0ZWFkIG9mIGNvcnJ1cHRpbmcgdGhlIGZpbGUuXG4gIHRyeSB7XG4gICAgY29uc3QgdXBkYXRlZFNldHRpbmdzID0gQnVuLlRPTUwucGFyc2UodXBkYXRlZENvbnRlbnQpIGFzIEZub3hUb21sU3VidHJlZTtcbiAgICBmb3IgKGNvbnN0IG1vZGUgb2Ygd2JFbnZNb2Rlcykge1xuICAgICAgaWYgKG1vZGUgPT09ICdzdGFnaW5nJyAmJiAhc2V0dGluZ3MucHJvZmlsZXM/LnN0YWdpbmcpIGNvbnRpbnVlO1xuICAgICAgY29uc3QgZGVmaW5lZEtleXMgPSBtb2RlID09PSAnZGV2ZWxvcG1lbnQnID8gdXBkYXRlZFNldHRpbmdzLnNlY3JldHMgOiB1cGRhdGVkU2V0dGluZ3MucHJvZmlsZXM/Llttb2RlXT8uc2VjcmV0cztcbiAgICAgIGlmIChrZXlOYW1lcy5zb21lKChrZXlOYW1lKSA9PiBkZWZpbmVkS2V5cz8uW2tleU5hbWVdID09PSB1bmRlZmluZWQpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgdGhlIGluc2VydGVkICR7bW9kZX0gZW50cmllcyBkaWQgbm90IHRha2UgZWZmZWN0YCk7XG4gICAgICB9XG4gICAgfVxuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGNvbnNvbGUud2FybihgU2tpcHBlZCBpbnNlcnRpbmcgV0JfRU5WIGludG8gZm5veC50b21sIGJlY2F1c2UgJHsoZXJyb3IgYXMgRXJyb3IpLm1lc3NhZ2V9LmApO1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cbiAgcmV0dXJuIHVwZGF0ZWRDb250ZW50O1xufVxuXG4vKipcbiAqIFdhcm5zIHdoZW4gYW4gZXhpc3RpbmcgV0JfRU5WLWZhbWlseSBkZWZpbml0aW9uIG5hbWVzIGEgZGlmZmVyZW50IG1vZGUgdGhhbiB0aGUgb25lIGl0IGlzXG4gKiBkZWZpbmVkIGZvciAoYSB0eXBvIGxpa2UgYHByb2RjdXRpb25gIG9yIGBwcm9kdWN0aW9uMWAsIG9yIGEgY29weS1wYXN0ZWQgd3JvbmcgbW9kZSk6IHdiXG4gKiByZWplY3RzIG5vbi1zdGFuZGFyZCB2YWx1ZXMgYXQgcnVudGltZSwgc28gc3VyZmFjaW5nIHRoZSBtaXNtYXRjaCBkdXJpbmcgd2JmeSBpcyB0aGUgZWFybGllc3RcbiAqIHBvc3NpYmxlIHNpZ25hbC4gVGhlIHBhc3NlZCB2YWx1ZSBpcyBhbHdheXMgcGxhaW50ZXh0IChhIGZub3ggYGRlZmF1bHRgIGZpZWxkKSDigJQgZW5jcnlwdGVkXG4gKiBmbm94IGVudHJpZXMgYXJlIGB7IHByb3ZpZGVyLCB2YWx1ZSB9YCBvYmplY3RzIHdob3NlIGBkZWZhdWx0YCBpcyBhYnNlbnQuXG4gKi9cbmZ1bmN0aW9uIHdhcm5PblVuZXhwZWN0ZWRXYkVudlZhbHVlKGtleU5hbWU6IHN0cmluZywgdmFsdWU6IHVua25vd24sIG1vZGU6IFdiRW52TW9kZSk6IHZvaWQge1xuICAvLyBBbiBFTVBUWSB2YWx1ZSBjb3VudHMgYXMgdW5zZXQgKHdiIHN1cHBsaWVzIHRoZSBmYWxsYmFjayBtb2RlKSwgbm90IGFzIGEgbWlzbWF0Y2hpbmcgbW9kZS5cbiAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gJ3N0cmluZycgfHwgdmFsdWUgPT09ICcnIHx8IHZhbHVlID09PSBtb2RlKSByZXR1cm47XG4gIC8vIEEgZHluYW1pYyB2YWx1ZSAoZS5nLiBgTkVYVF9QVUJMSUNfV0JfRU5WPSR7V0JfRU5WfWApIG1heSBsZWdpdGltYXRlbHkgcmVzb2x2ZSB0byB0aGUgbW9kZVxuICAvLyB0aHJvdWdoIGV4cGFuc2lvbiwgd2hpY2ggdGhpcyBzdGF0aWMgY2hlY2sgY2Fubm90IGV2YWx1YXRlIOKAlCBza2lwIGluc3RlYWQgb2YgbWlzZmlyaW5nLlxuICAvLyBmbm94IGV4cGFuZHMgb25seSBgJHsuLi59YCAoYSBiYXJlIGAkVU5TRVRgIHN0YXlzIGxpdGVyYWwpLlxuICBpZiAodmFsdWUuaW5jbHVkZXMoJyR7JykpIHJldHVybjtcbiAgaWYgKGtleU5hbWUgPT09ICdORVhUX1BVQkxJQ19XQl9FTlYnKSB7XG4gICAgY29uc29sZS53YXJuKFxuICAgICAgYCR7a2V5TmFtZX0gaW4gZm5veC50b21sIGlzIFwiJHt2YWx1ZX1cIiBidXQgc2hvdWxkIGJlIFwiJHttb2RlfVwiIGZvciB0aGUgJHttb2RlfSBtb2RlOyB3YiBvdmVycmlkZXMgaXQgd2l0aCBXQl9FTlYsIGJ1dCBhIGRpcmVjdCBmcmFtZXdvcmsgYnVpbGQgd291bGQgaW5saW5lIHRoaXMgdmFsdWUuYFxuICAgICk7XG4gICAgcmV0dXJuO1xuICB9XG4gIGNvbnNvbGUud2FybihcbiAgICBgJHtrZXlOYW1lfSBpbiBmbm94LnRvbWwgaXMgXCIke3ZhbHVlfVwiIGJ1dCBzaG91bGQgYmUgXCIke21vZGV9XCIgZm9yIHRoZSAke21vZGV9IG1vZGU7IHdiIHJlamVjdHMgdmFsdWVzIG91dHNpZGUgZGV2ZWxvcG1lbnQvdGVzdC9zdGFnaW5nL3Byb2R1Y3Rpb24uYFxuICApO1xufVxuXG4vKipcbiAqIEluc2VydHMgbGluZXMgYXQgdGhlIHRvcCBvZiBhIFRPTUwgc2VjdGlvbiwgcmlnaHQgYWZ0ZXIgaXRzIGBbaGVhZGVyXWAgbGluZSBzbyBwcm9maWxlLXNwZWNpZmljXG4gKiBlbnRyaWVzIHN0YXkgZ3JvdXBlZCB3aXRoIHRoZWlyIGhlYWRlcjsgdGhlIHNlY3Rpb24gaXMgYXBwZW5kZWQgYXQgdGhlIGVuZCB3aGVuIGl0IGlzIGFic2VudC5cbiAqL1xuZnVuY3Rpb24gaW5zZXJ0SW50b0Zub3hTZWN0aW9uKGNvbnRlbnQ6IHN0cmluZywgc2VjdGlvbk5hbWU6IHN0cmluZywgaW5zZXJ0ZWRMaW5lczogc3RyaW5nW10pOiBzdHJpbmcge1xuICAvLyB3YmZ5IHdyaXRlcyB0aGUgaGVhZGVyIHdpdGhvdXQgd2hpdGVzcGFjZSBhcm91bmQgdGhlIGRvdHRlZC1rZXkgY29tcG9uZW50cy5cbiAgY29uc3QgaGVhZGVyUGF0dGVybiA9IG5ldyBSZWdFeHAoU3RyaW5nLnJhd2BeXFxzKlxcWyR7c2VjdGlvbk5hbWUucmVwbGFjZUFsbCgnLicsIFN0cmluZy5yYXdgXFwuYCl9XFxdXFxzKig/OiMuKik/JGAsICd1Jyk7XG4gIGNvbnN0IGxpbmVzID0gY29udGVudC5zcGxpdCgnXFxuJyk7XG4gIGNvbnN0IGhlYWRlckluZGV4ID0gbGluZXMuZmluZEluZGV4KChsaW5lKSA9PiBoZWFkZXJQYXR0ZXJuLnRlc3QobGluZSkpO1xuICBpZiAoaGVhZGVySW5kZXggPT09IC0xKSB7XG4gICAgcmV0dXJuIGAke2NvbnRlbnQudHJpbUVuZCgpfVxcblxcblske3NlY3Rpb25OYW1lfV1cXG4ke2luc2VydGVkTGluZXMuam9pbignXFxuJyl9XFxuYDtcbiAgfVxuICByZXR1cm4gWy4uLmxpbmVzLnNsaWNlKDAsIGhlYWRlckluZGV4ICsgMSksIC4uLmluc2VydGVkTGluZXMsIC4uLmxpbmVzLnNsaWNlKGhlYWRlckluZGV4ICsgMSldLmpvaW4oJ1xcbicpO1xufVxuIiwiLy8gR2l0SHViIEFjdGlvbnMgdmFsdWVsZXNzIGV2ZW50cyBzdWNoIGFzIGBwdWxsX3JlcXVlc3Q6YCByZXF1aXJlIFlBTUwgbnVsbCB2YWx1ZXMuXG4vKiBlc2xpbnQtZGlzYWJsZSB1bmljb3JuL25vLW51bGwgKi9cblxuaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0ICogYXMgeWFtbCBmcm9tICdqcy15YW1sJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZnNVdGlsIH0gZnJvbSAnLi4vdXRpbHMvZnNVdGlsLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuXG4vKipcbiAqIFJlcG9zaXRvcmllcyBvdXRzaWRlIFdpbGxCb29zdGVyIC8gV2lsbEJvb3N0ZXJMYWIgY2Fubm90IGNhbGwgdGhlIG9yZ2FuaXphdGlvbidzIHJldXNhYmxlXG4gKiB3b3JrZmxvd3M6IHRob3NlIHdvcmtmbG93cyBkZXBlbmQgb24gb3JnYW5pemF0aW9uIHNlY3JldHMgKFZFUkRBQ0NJT19UT0tFTiwgRGlzY29yZCB3ZWJob29rcylcbiAqIGFuZCBzZWxmLWhvc3RlZCBydW5uZXJzIHRoYXQgb3RoZXIgb3duZXJzIGRvIG5vdCBoYXZlLiBUaGlzIGdlbmVyYXRvciBpbnN0ZWFkIGVtaXRzXG4gKiBzZWxmLWNvbnRhaW5lZCB3b3JrZmxvd3MgYnVpbHQgb25seSBmcm9tIHdoYXQgYW55IHJlcG9zaXRvcnkgb3duZXIgY2FuIHByb3ZpZGU6IHRoZSByZXBvc2l0b3J5XG4gKiBjb250ZW50cyAobWlzZS50b21sLCBwYWNrYWdlLmpzb24gc2NyaXB0cykgYW5kIHRoZSBzaW5nbGUgYEZOT1hfQUdFX0tFWWAgcmVwb3NpdG9yeSBzZWNyZXQgd2hlblxuICogdGhlIHJlcG9zaXRvcnkgdXNlcyBmbm94LiBHZW5lcmF0aW9uIGlzIGtleWVkIG9uIHJlcG9zaXRvcnkgc3RhdGUsIG5ldmVyIG9uIHRoZSBvd25lcidzXG4gKiBpZGVudGl0eSwgc28gaXQgd29ya3MgZm9yIGFyYml0cmFyeSBwZXJzb25hbCByZXBvc2l0b3JpZXMuXG4gKi9cblxuLyoqIEZpcnN0IGxpbmUgb2YgZXZlcnkgZ2VuZXJhdGVkIGZpbGU7IGZpbGVzIHdpdGhvdXQgaXQgYXJlIGhhbmQtd3JpdHRlbiBhbmQgbmV2ZXIgdG91Y2hlZC4gKi9cbmV4cG9ydCBjb25zdCBzZWxmQ29udGFpbmVkV29ya2Zsb3dNYXJrZXIgPSAnIyBHZW5lcmF0ZWQgYnkgd2JmeS4nO1xuXG4vLyBTYW1lIHBpbnMgYXMgdGhlIHJldXNhYmxlIHdvcmtmbG93cyAvIHRoZWlyIGNvbnN1bWVyczsgUmVub3ZhdGUgdXBkYXRlcyB0aGVtIGluIHRoZSB0YXJnZXQgcmVwb3NpdG9yeS5cbmNvbnN0IGNoZWNrb3V0QWN0aW9uID0gJ2FjdGlvbnMvY2hlY2tvdXRAdjcuMC4xJztcbmNvbnN0IG1pc2VBY3Rpb24gPSAnamR4L21pc2UtYWN0aW9uQHY0LjIuMyc7XG5jb25zdCBjYWNoZUFjdGlvbiA9ICdhY3Rpb25zL2NhY2hlQHY2LjEuMCc7XG5jb25zdCB1cGxvYWRBcnRpZmFjdEFjdGlvbiA9ICdhY3Rpb25zL3VwbG9hZC1hcnRpZmFjdEB2Ny4wLjEnO1xuLy8gdjYuMS4xOyB0aGUgc2FtZSBwaW4gYXMgdGhlIHJldXNhYmxlIHNlbWFudGljLXByIHdvcmtmbG93LlxuY29uc3Qgc2VtYW50aWNQdWxsUmVxdWVzdEFjdGlvbiA9ICdhbWFubm4vYWN0aW9uLXNlbWFudGljLXB1bGwtcmVxdWVzdEA0NWI5ZWQ3Y2YyNDA4N2EyZjc3ODViZjU1YmU5NzM5NGJhODdlMWMyJztcbi8vIHYzLjAuMzsgZGVwbG95cyBhcmUgbmV0d29yay1oZWF2eSBhbmQgYmVuZWZpdCBmcm9tIHJldHJpZXMgd2l0aCBhIGxvbmcgdGltZW91dC5cbmNvbnN0IHJldHJ5QWN0aW9uID0gJ25pY2stZmllbGRzL3JldHJ5QGRkNTZmMWNhOGNhOTkxZTIzODVjMThhYjZkZDM2ZWE3ZjlmZGI1NWYnO1xuXG4vKipcbiAqIEpvYi1sZXZlbCBlbnYgdGhhdCB0dXJucyB0aGUgVGFrdW1pIEd1YXJkIGluc3RhbGwgcGF0aCBvbiwgbWlycm9yaW5nIHRoZSByZXVzYWJsZSB3b3JrZmxvd3MuXG4gKlxuICogYHNlY3JldHNgIGlzIHVuYXZhaWxhYmxlIGluIGEgc3RlcC1sZXZlbCBgaWY6YCwgc28gdGhlIHByZXNlbmNlIG9mIHRoZSB0b2tlbiBpcyBleHBvc2VkIGFzIGFcbiAqIG5vbi1zZWNyZXQgc2lnbmFsOyBhbiB1bnNldCBzZWNyZXQgZXhwYW5kcyB0byBgZmFsc2VgIGFuZCBsZWF2ZXMgZXZlcnkgR3VhcmQgc3RlcCBza2lwcGVkLCB3aGljaFxuICogaXMgd2hhdCBrZWVwcyB0aGUgZ2VuZXJhdGVkIHdvcmtmbG93cyBydW5uYWJsZSBpbiBhIHJlcG9zaXRvcnkgdGhhdCBuZXZlciByZWdpc3RlcnMgdGhlIHNlY3JldC5cbiAqIFRBS1VNSV9HVUFSRF9UT0tFTiBpdHNlbGYgaXMgZGVmaW5lZC1idXQtRU1QVFkgam9iLXdpZGUgc28gdGhlIGAke1RBS1VNSV9HVUFSRF9UT0tFTn1gIHJlZmVyZW5jZVxuICogaW4gdGhlIGdlbmVyYXRlZCAubnBtcmMgc3RpbGwgZXhwYW5kcyAodG8gJycpIGluIHRoZSBzdGVwcyB0aGF0IGRlbGliZXJhdGVseSBydW4gd2l0aG91dCB0aGVcbiAqIHRva2VuOyBhIHJlZmVyZW5jZSB0byBhbiB1bmRlZmluZWQgdmFyaWFibGUgaXMgd2hhdCBicmVha3MgYW4gaW5zdGFsbCwgYW4gZW1wdHkgb25lIGlzIGZpbmUuXG4gKi9cbmNvbnN0IGd1YXJkSm9iRW52OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge1xuICBIQVNfVEFLVU1JX0dVQVJEX1RPS0VOOiAnJHt7ICEhc2VjcmV0cy5UQUtVTUlfR1VBUkRfVE9LRU4gfX0nLFxuICBUQUtVTUlfR1VBUkRfVE9LRU46ICcnLFxufTtcblxuaW50ZXJmYWNlIFN0ZXAge1xuICBuYW1lPzogc3RyaW5nO1xuICBpZD86IHN0cmluZztcbiAgaWY/OiBzdHJpbmc7XG4gIHVzZXM/OiBzdHJpbmc7XG4gIHJ1bj86IHN0cmluZztcbiAgJ3dvcmtpbmctZGlyZWN0b3J5Jz86IHN0cmluZztcbiAgd2l0aD86IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICBlbnY/OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+O1xufVxuXG5pbnRlcmZhY2UgV29ya2Zsb3cge1xuICBuYW1lOiBzdHJpbmc7XG4gIG9uOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgY29uY3VycmVuY3k/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgcGVybWlzc2lvbnM/OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+O1xuICBqb2JzOiBSZWNvcmQ8XG4gICAgc3RyaW5nLFxuICAgIHsgJ3J1bnMtb24nOiBzdHJpbmc7IHBlcm1pc3Npb25zPzogUmVjb3JkPHN0cmluZywgc3RyaW5nPjsgZW52PzogUmVjb3JkPHN0cmluZywgc3RyaW5nPjsgc3RlcHM6IFN0ZXBbXSB9XG4gID47XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZW5lcmF0ZVNlbGZDb250YWluZWRXb3JrZmxvd3MoXG4gIHJvb3RDb25maWc6IFBhY2thZ2VDb25maWcsXG4gIGFsbFBhY2thZ2VDb25maWdzOiBQYWNrYWdlQ29uZmlnW10gPSBbcm9vdENvbmZpZ11cbik6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2dlbmVyYXRlU2VsZkNvbnRhaW5lZFdvcmtmbG93cycsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCB3b3JrZmxvd3NQYXRoID0gcGF0aC5yZXNvbHZlKHJvb3RDb25maWcuZGlyUGF0aCwgJy5naXRodWInLCAnd29ya2Zsb3dzJyk7XG4gICAgaWYgKCEoYXdhaXQgZnNVdGlsLmlzQ29uZmluZWRXcml0YWJsZVBhdGgod29ya2Zsb3dzUGF0aCkpKSB7XG4gICAgICBjb25zb2xlLndhcm4oYFNraXBwZWQgZ2VuZXJhdGluZyB3b3JrZmxvd3MgYmVjYXVzZSAke3dvcmtmbG93c1BhdGh9IHJlc29sdmVzIG91dHNpZGUgdGhlIHJlcG9zaXRvcnkuYCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGF3YWl0IGZzLnByb21pc2VzLm1rZGlyKHdvcmtmbG93c1BhdGgsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuXG4gICAgY29uc3QgdXNlc0Zub3ggPSBmcy5leGlzdHNTeW5jKHBhdGgucmVzb2x2ZShyb290Q29uZmlnLmRpclBhdGgsICdmbm94LnRvbWwnKSk7XG4gICAgY29uc3Qgd29ya2Zsb3dCeUZpbGVOYW1lOiBSZWNvcmQ8c3RyaW5nLCBXb3JrZmxvdz4gPSB7XG4gICAgICAndGVzdC55bWwnOiBidWlsZFRlc3RXb3JrZmxvdyhyb290Q29uZmlnLCBhbGxQYWNrYWdlQ29uZmlncywgdXNlc0Zub3gpLFxuICAgICAgJ3NlbWFudGljLXByLnltbCc6IGJ1aWxkU2VtYW50aWNQcldvcmtmbG93KCksXG4gICAgfTtcbiAgICAvLyBEZXBsb3kgd29ya2Zsb3dzIGFyZSBnZW5lcmF0ZWQgcGVyIGRlcGxveSBzY3JpcHQgdGhlIHJlcG9zaXRvcnkgZGVjbGFyZXMsIHNvIGEgcmVwb3NpdG9yeVxuICAgIC8vIHdpdGhvdXQgYSBzdGFnaW5nIGVudmlyb25tZW50IHNpbXBseSBnZXRzIG5vIHN0YWdpbmcgd29ya2Zsb3cuIE9ubHkgc2NyaXB0cyB0aGF0IGludm9rZVxuICAgIC8vIGB3YiBkZXBsb3lgIHF1YWxpZnk6IGEgYmVzcG9rZSBkZXBsb3kgc2NyaXB0IG1heSBub3QgYmUgc2FmZSB0byB0cmlnZ2VyIGF1dG9tYXRpY2FsbHlcbiAgICAvLyAoZGVwbG95LXN0YWdpbmcgcnVucyBvbiBldmVyeSBwdXNoIHRvIHRoZSBkZWZhdWx0IGJyYW5jaCkuXG4gICAgY29uc3Qgc2NyaXB0cyA9IHJvb3RDb25maWcucGFja2FnZUpzb24/LnNjcmlwdHMgPz8ge307XG4gICAgY29uc3QgaGFzUHJvZHVjdGlvbkRlcGxveVdvcmtmbG93ID0gaXNXYkRlcGxveVNjcmlwdChzY3JpcHRzWydkZXBsb3knXSk7XG4gICAgaWYgKGhhc1Byb2R1Y3Rpb25EZXBsb3lXb3JrZmxvdykge1xuICAgICAgd29ya2Zsb3dCeUZpbGVOYW1lWydkZXBsb3ktcHJvZHVjdGlvbi55bWwnXSA9IGJ1aWxkRGVwbG95V29ya2Zsb3coJ3Byb2R1Y3Rpb24nLCAnZGVwbG95JywgdXNlc0Zub3gpO1xuICAgIH1cbiAgICBpZiAoaXNXYkRlcGxveVNjcmlwdChzY3JpcHRzWydkZXBsb3k6c3RhZ2luZyddKSkge1xuICAgICAgd29ya2Zsb3dCeUZpbGVOYW1lWydkZXBsb3ktc3RhZ2luZy55bWwnXSA9IGJ1aWxkRGVwbG95V29ya2Zsb3coJ3N0YWdpbmcnLCAnZGVwbG95OnN0YWdpbmcnLCB1c2VzRm5veCk7XG4gICAgfVxuICAgIGlmIChyb290Q29uZmlnLmRlcGVuZGluZy5zZW1hbnRpY1JlbGVhc2UgJiYgcm9vdENvbmZpZy5yZWxlYXNlLmJyYW5jaGVzLmxlbmd0aCA+IDApIHtcbiAgICAgIHdvcmtmbG93QnlGaWxlTmFtZVsncmVsZWFzZS55bWwnXSA9IGJ1aWxkUmVsZWFzZVdvcmtmbG93KHJvb3RDb25maWcsIGhhc1Byb2R1Y3Rpb25EZXBsb3lXb3JrZmxvdywgdXNlc0Zub3gpO1xuICAgIH1cbiAgICBmb3IgKGNvbnN0IFtmaWxlTmFtZSwgd29ya2Zsb3ddIG9mIE9iamVjdC5lbnRyaWVzKHdvcmtmbG93QnlGaWxlTmFtZSkpIHtcbiAgICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiB3cml0ZVNlbGZDb250YWluZWRXb3JrZmxvdyhwYXRoLmpvaW4od29ya2Zsb3dzUGF0aCwgZmlsZU5hbWUpLCB3b3JrZmxvdykpO1xuICAgIH1cbiAgfSk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHdyaXRlU2VsZkNvbnRhaW5lZFdvcmtmbG93KGZpbGVQYXRoOiBzdHJpbmcsIHdvcmtmbG93OiBXb3JrZmxvdyk6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBvbGRDb250ZW50ID0gYXdhaXQgZnNVdGlsLnJlYWRGaWxlSWZFeGlzdHMoZmlsZVBhdGgpO1xuICAvLyBVbmxpa2UgV2lsbEJvb3N0ZXItb3JnYW5pemF0aW9uIHJlcG9zaXRvcmllcywgd2JmeSBkb2VzIG5vdCBvd24gYXJiaXRyYXJ5IHJlcG9zaXRvcmllcycgQ0k6XG4gIC8vIG9ubHkgZmlsZXMgaXQgZ2VuZXJhdGVkIChpZGVudGlmaWVkIGJ5IHRoZSBtYXJrZXIpIGFyZSByZWdlbmVyYXRlZCwgYW5kIGhhbmQtd3JpdHRlblxuICAvLyB3b3JrZmxvd3MgYXJlIG5ldmVyIHRvdWNoZWQuIE93bmVycyBvcHQgb3V0IHBlcm1hbmVudGx5IGJ5IHJlbW92aW5nIHRoZSBtYXJrZXIgbGluZS5cbiAgLy8gQW4gZW1wdHkgb3Igd2hpdGVzcGFjZS1vbmx5IGZpbGUgY2FycmllcyBubyBoYW5kLXdyaXR0ZW4gY29udGVudCwgc28gaXQgaXMgdHJlYXRlZCBhcyBhYnNlbnQuXG4gIGlmIChvbGRDb250ZW50ICE9PSB1bmRlZmluZWQgJiYgb2xkQ29udGVudC50cmltKCkgIT09ICcnICYmICFvbGRDb250ZW50LnN0YXJ0c1dpdGgoc2VsZkNvbnRhaW5lZFdvcmtmbG93TWFya2VyKSkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGNvbnN0IGhlYWRlciA9IGAke3NlbGZDb250YWluZWRXb3JrZmxvd01hcmtlcn0gUmVtb3ZlIHRoaXMgbGluZSB0byBzdG9wIHdiZnkgZnJvbSBvdmVyd3JpdGluZyB0aGlzIGZpbGUuXFxuYDtcbiAgY29uc3QgeWFtbFRleHQgPSB5YW1sLmR1bXAod29ya2Zsb3csIHsgbGluZVdpZHRoOiAtMSB9KTtcbiAgYXdhaXQgZnNVdGlsLndyaXRlRmlsZUNvbmZpbmVkKGZpbGVQYXRoLCBoZWFkZXIgKyB5YW1sVGV4dCk7XG59XG5cbmZ1bmN0aW9uIHdvcmtpbmdEaXIoZGlyUGF0aDogc3RyaW5nKTogUGljazxTdGVwLCAnd29ya2luZy1kaXJlY3RvcnknPiB7XG4gIHJldHVybiBkaXJQYXRoID8geyAnd29ya2luZy1kaXJlY3RvcnknOiBkaXJQYXRoIH0gOiB7fTtcbn1cblxuZnVuY3Rpb24gaXNXYkRlcGxveVNjcmlwdChzY3JpcHQ6IHVua25vd24pOiBib29sZWFuIHtcbiAgcmV0dXJuIHR5cGVvZiBzY3JpcHQgPT09ICdzdHJpbmcnICYmIC9cXGJ3YiBkZXBsb3lcXGIvdS50ZXN0KHNjcmlwdCk7XG59XG5cbmZ1bmN0aW9uIGJ1aWxkVGVzdFdvcmtmbG93KGNvbmZpZzogUGFja2FnZUNvbmZpZywgYWxsUGFja2FnZUNvbmZpZ3M6IFBhY2thZ2VDb25maWdbXSwgdXNlc0Zub3g6IGJvb2xlYW4pOiBXb3JrZmxvdyB7XG4gIC8vIFBsYXl3cmlnaHQgbWF5IGJlIGRlY2xhcmVkIG9ubHkgaW4gd29ya3NwYWNlIHBhY2thZ2VzOyBgd2IgdGVzdC1vbi1jaWAgcnVucyBldmVyeSBkZWNsYXJpbmdcbiAgLy8gcGFja2FnZSdzIGUyZSB0ZXN0cywgc28gdGhlIHdvcmtmbG93IG11c3QgaW5zdGFsbCBicm93c2VycyBmb3IgZWFjaCBvZiB0aGVtICh0aGVpciB2ZXJzaW9uc1xuICAvLyBtYXkgZGlmZmVyLCBhbmQgZWFjaCBsaWJyYXJ5IHZlcnNpb24gcmVxdWlyZXMgaXRzIG1hdGNoaW5nIGJyb3dzZXIgYmluYXJpZXMpLiBCdW4ncyBpc29sYXRlZFxuICAvLyBsaW5rZXIgcmVzb2x2ZXMgdGhlIHBsYXl3cmlnaHQgYmluYXJ5IG9ubHkgZnJvbSB0aGUgZGVjbGFyaW5nIHBhY2thZ2UsIGhlbmNlIHRoZVxuICAvLyB3b3JraW5nLWRpcmVjdG9yeSBvbiBldmVyeSBzdGVwLiBUaGUgYnJvd3NlcnMgbGFuZCBpbiB+Ly5jYWNoZS9tcy1wbGF5d3JpZ2h0LCBzaGFyZWQgYWNyb3NzXG4gIC8vIHdvcmtzcGFjZXMsIHNvIHNhbWUtdmVyc2lvbiBpbnN0YWxscyBuYXR1cmFsbHkgZGVkdXBsaWNhdGUuXG4gIGNvbnN0IHBsYXl3cmlnaHREaXJQYXRocyA9IFsuLi5hbGxQYWNrYWdlQ29uZmlnc11cbiAgICAudG9Tb3J0ZWQoKGEsIGIpID0+IGEuZGlyUGF0aC5sb2NhbGVDb21wYXJlKGIuZGlyUGF0aCkpXG4gICAgLmZpbHRlcigocGFja2FnZUNvbmZpZykgPT4gcGFja2FnZUNvbmZpZy5kZXBlbmRpbmcucGxheXdyaWdodFRlc3QpXG4gICAgLm1hcCgocGFja2FnZUNvbmZpZykgPT4gcGF0aC5yZWxhdGl2ZShjb25maWcuZGlyUGF0aCwgcGFja2FnZUNvbmZpZy5kaXJQYXRoKSk7XG4gIGNvbnN0IGhhc1R5cGVjaGVjayA9IGNvbmZpZy5kb2VzQ29udGFpblR5cGVTY3JpcHQgfHwgY29uZmlnLmRvZXNDb250YWluVHlwZVNjcmlwdEluUGFja2FnZXM7XG4gIC8vIFN0ZXAtc2NvcGVkIGxpa2UgdGhlIHJldXNhYmxlIHRlc3Qgd29ya2Zsb3c6IGRlcGVuZGVuY3kgbGlmZWN5Y2xlIHNjcmlwdHMgcnVuIGJ5IGBidW4gaW5zdGFsbGBcbiAgLy8gbXVzdCBub3QgYmUgYWJsZSB0byByZWFkIHRoZSBsb25nLWxpdmVkIGFnZSBpZGVudGl0eS5cbiAgY29uc3QgZm5veEVudjogUGljazxTdGVwLCAnZW52Jz4gPSB1c2VzRm5veCA/IHsgZW52OiB7IEZOT1hfQUdFX0tFWTogJyR7eyBzZWNyZXRzLkZOT1hfQUdFX0tFWSB9fScgfSB9IDoge307XG5cbiAgY29uc3Qgc3RlcHM6IFN0ZXBbXSA9IFtcbiAgICB7IHVzZXM6IGNoZWNrb3V0QWN0aW9uIH0sXG4gICAgeyB1c2VzOiBtaXNlQWN0aW9uIH0sXG4gICAgLi4uYnVpbGRJbnN0YWxsU3RlcHModHJ1ZSksXG4gICAgLi4uKHBsYXl3cmlnaHREaXJQYXRocy5sZW5ndGggPiAwXG4gICAgICA/IChbXG4gICAgICAgICAgLi4ucGxheXdyaWdodERpclBhdGhzLm1hcCgoZGlyUGF0aCwgaW5kZXgpOiBTdGVwID0+ICh7XG4gICAgICAgICAgICBuYW1lOiBgR2V0IFBsYXl3cmlnaHQgdmVyc2lvbiR7ZGlyUGF0aCA/IGAgKCR7ZGlyUGF0aH0pYCA6ICcnfWAsXG4gICAgICAgICAgICAvLyBUaGUgSU5TVEFMTEVEIHZlcnNpb24sIG5vdCB0aGUgcGFja2FnZS5qc29uIHNwZWNpZmllcjogYSByYW5nZSBsaWtlIGBeMS40NS4wYFxuICAgICAgICAgICAgLy8gc3RheXMgdW5jaGFuZ2VkIGFjcm9zcyBsb2NrZmlsZSB1cGRhdGVzLCBzbyBrZXlpbmcgdGhlIGNhY2hlIG9uIGl0IHdvdWxkIHJlc3RvcmVcbiAgICAgICAgICAgIC8vIHN0YWxlIGJyb3dzZXJzIHRoYXQgbm8gbG9uZ2VyIG1hdGNoIHRoZSBsaWJyYXJ5LiBSdW5zIGFmdGVyIGBidW4gaW5zdGFsbGAsIHNvIHRoZVxuICAgICAgICAgICAgLy8gcGFja2FnZSBpcyByZXNvbHZhYmxlIGZyb20gdGhlIGRlY2xhcmluZyBwYWNrYWdlJ3MgZGlyZWN0b3J5LlxuICAgICAgICAgICAgaWQ6IGBwbGF5d3JpZ2h0LXZlcnNpb24tJHtpbmRleH1gLFxuICAgICAgICAgICAgcnVuOiAnZWNobyBcInZlcnNpb249JChidW4gLWUgXCJ0cnkgeyBjb25zb2xlLmxvZyhyZXF1aXJlKFxcJ0BwbGF5d3JpZ2h0L3Rlc3QvcGFja2FnZS5qc29uXFwnKS52ZXJzaW9uKSB9IGNhdGNoIHt9XCIpXCIgPj4gXCIkR0lUSFVCX09VVFBVVFwiJyxcbiAgICAgICAgICAgIC4uLndvcmtpbmdEaXIoZGlyUGF0aCksXG4gICAgICAgICAgfSkpLFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIG5hbWU6ICdDYWNoZSBQbGF5d3JpZ2h0IGJyb3dzZXJzJyxcbiAgICAgICAgICAgIGlkOiAncGxheXdyaWdodC1jYWNoZScsXG4gICAgICAgICAgICB1c2VzOiBjYWNoZUFjdGlvbixcbiAgICAgICAgICAgIHdpdGg6IHtcbiAgICAgICAgICAgICAgcGF0aDogJ34vLmNhY2hlL21zLXBsYXl3cmlnaHQnLFxuICAgICAgICAgICAgICBrZXk6IGBwbGF5d3JpZ2h0LVxcJHt7IHJ1bm5lci5vcyB9fS0ke3BsYXl3cmlnaHREaXJQYXRoc1xuICAgICAgICAgICAgICAgIC5tYXAoKF8sIGluZGV4KSA9PiBgXFwke3sgc3RlcHMucGxheXdyaWdodC12ZXJzaW9uLSR7aW5kZXh9Lm91dHB1dHMudmVyc2lvbiB9fWApXG4gICAgICAgICAgICAgICAgLmpvaW4oJy0nKX1gLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9LFxuICAgICAgICAgIC4uLnBsYXl3cmlnaHREaXJQYXRocy5tYXAoKGRpclBhdGgpOiBTdGVwID0+ICh7XG4gICAgICAgICAgICBpZjogXCJzdGVwcy5wbGF5d3JpZ2h0LWNhY2hlLm91dHB1dHMuY2FjaGUtaGl0ICE9ICd0cnVlJ1wiLFxuICAgICAgICAgICAgcnVuOiAnYnVuIHBsYXl3cmlnaHQgaW5zdGFsbCAtLXdpdGgtZGVwcycsXG4gICAgICAgICAgICAuLi53b3JraW5nRGlyKGRpclBhdGgpLFxuICAgICAgICAgIH0pKSxcbiAgICAgICAgICAuLi5wbGF5d3JpZ2h0RGlyUGF0aHMubWFwKChkaXJQYXRoKTogU3RlcCA9PiAoe1xuICAgICAgICAgICAgLy8gVGhlIGNhY2hlZCBicm93c2VycyBzdGlsbCBuZWVkIHRoZWlyIHN5c3RlbSBkZXBlbmRlbmNpZXMgb24gYSBmcmVzaCBydW5uZXIuXG4gICAgICAgICAgICBpZjogXCJzdGVwcy5wbGF5d3JpZ2h0LWNhY2hlLm91dHB1dHMuY2FjaGUtaGl0ID09ICd0cnVlJ1wiLFxuICAgICAgICAgICAgcnVuOiAnYnVuIHBsYXl3cmlnaHQgaW5zdGFsbC1kZXBzJyxcbiAgICAgICAgICAgIC4uLndvcmtpbmdEaXIoZGlyUGF0aCksXG4gICAgICAgICAgfSkpLFxuICAgICAgICBdIHNhdGlzZmllcyBTdGVwW10pXG4gICAgICA6IFtdKSxcbiAgICAuLi4oaGFzVHlwZWNoZWNrID8gW3sgcnVuOiAnYnVuIHJ1biB0eXBlY2hlY2snLCAuLi5mbm94RW52IH1dIDogW10pLFxuICAgIHsgcnVuOiAnYnVuIHJ1biBsaW50JywgLi4uZm5veEVudiB9LFxuICAgIHsgcnVuOiAnYnVuIHJ1biB0ZXN0L2NpJywgLi4uZm5veEVudiB9LFxuICAgIC4uLihwbGF5d3JpZ2h0RGlyUGF0aHMubGVuZ3RoID4gMFxuICAgICAgPyBbXG4gICAgICAgICAge1xuICAgICAgICAgICAgbmFtZTogJ1VwbG9hZCB0ZXN0IHJlc3VsdHMnLFxuICAgICAgICAgICAgaWY6ICcke3sgYWx3YXlzKCkgfX0nLFxuICAgICAgICAgICAgdXNlczogdXBsb2FkQXJ0aWZhY3RBY3Rpb24sXG4gICAgICAgICAgICB3aXRoOiB7XG4gICAgICAgICAgICAgIG5hbWU6ICd0ZXN0LXJlc3VsdHMnLFxuICAgICAgICAgICAgICAvLyBFdmVyeSBkZWNsYXJpbmcgcGFja2FnZSB3cml0ZXMgaXRzIG93biB0ZXN0LXJlc3VsdHMgZGlyZWN0b3J5OyBhIG5ld2xpbmUtc2VwYXJhdGVkXG4gICAgICAgICAgICAgIC8vIGxpc3QgdXBsb2FkcyB0aGVtIGFsbC5cbiAgICAgICAgICAgICAgcGF0aDogcGxheXdyaWdodERpclBhdGhzXG4gICAgICAgICAgICAgICAgLm1hcCgoZGlyUGF0aCkgPT4gKGRpclBhdGggPyBwYXRoLnBvc2l4LmpvaW4oZGlyUGF0aCwgJ3Rlc3QtcmVzdWx0cycpIDogJ3Rlc3QtcmVzdWx0cycpKVxuICAgICAgICAgICAgICAgIC5qb2luKCdcXG4nKSxcbiAgICAgICAgICAgICAgJ2lmLW5vLWZpbGVzLWZvdW5kJzogJ2lnbm9yZScsXG4gICAgICAgICAgICAgICdyZXRlbnRpb24tZGF5cyc6IDE0LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9LFxuICAgICAgICBdXG4gICAgICA6IFtdKSxcbiAgXTtcblxuICByZXR1cm4ge1xuICAgIG5hbWU6ICdUZXN0JyxcbiAgICBvbjoge1xuICAgICAgcHVsbF9yZXF1ZXN0OiBudWxsLFxuICAgICAgcHVzaDogeyBicmFuY2hlczogWydtYWluJ10gfSxcbiAgICB9LFxuICAgIGNvbmN1cnJlbmN5OiB7XG4gICAgICBncm91cDogJyR7eyBnaXRodWIud29ya2Zsb3cgfX0tJHt7IGdpdGh1Yi5yZWYgfX0nLFxuICAgICAgJ2NhbmNlbC1pbi1wcm9ncmVzcyc6IHRydWUsXG4gICAgfSxcbiAgICBwZXJtaXNzaW9uczogeyBjb250ZW50czogJ3JlYWQnIH0sXG4gICAgam9iczoge1xuICAgICAgdGVzdDoge1xuICAgICAgICAncnVucy1vbic6ICd1YnVudHUtbGF0ZXN0JyxcbiAgICAgICAgZW52OiB7IEZPUkNFX0NPTE9SOiAnMycsIFdCX0VOVjogJ3Rlc3QnLCAuLi5ndWFyZEpvYkVudiB9LFxuICAgICAgICBzdGVwcyxcbiAgICAgIH0sXG4gICAgfSxcbiAgfTtcbn1cblxuZnVuY3Rpb24gYnVpbGREZXBsb3lXb3JrZmxvdyhlbnZpcm9ubWVudDogJ3N0YWdpbmcnIHwgJ3Byb2R1Y3Rpb24nLCBzY3JpcHROYW1lOiBzdHJpbmcsIHVzZXNGbm94OiBib29sZWFuKTogV29ya2Zsb3cge1xuICByZXR1cm4ge1xuICAgIG5hbWU6IGBEZXBsb3kgYXBwIG9uICR7ZW52aXJvbm1lbnR9YCxcbiAgICBvbjoge1xuICAgICAgd29ya2Zsb3dfZGlzcGF0Y2g6IG51bGwsXG4gICAgICAvLyBQcm9kdWN0aW9uIGRlcGxveXMgZm9sbG93IHB1Ymxpc2hlZCByZWxlYXNlcyAoc2VlIHRoZSByZWxlYXNlIHdvcmtmbG93J3MgdHJpZ2dlciBzdGVwKTtcbiAgICAgIC8vIHN0YWdpbmcgY29udmVyZ2VzIG9uIGV2ZXJ5IGRlZmF1bHQtYnJhbmNoIHB1c2guXG4gICAgICAuLi4oZW52aXJvbm1lbnQgPT09ICdwcm9kdWN0aW9uJ1xuICAgICAgICA/IHsgcmVsZWFzZTogeyB0eXBlczogWydwdWJsaXNoZWQnXSB9IH1cbiAgICAgICAgOiB7IHB1c2g6IHsgYnJhbmNoZXM6IFsnbWFpbiddLCAncGF0aHMtaWdub3JlJzogWycqKi5tZCcsICcqKi9kb2NzLyoqJ10gfSB9KSxcbiAgICB9LFxuICAgIGNvbmN1cnJlbmN5OiB7XG4gICAgICBncm91cDogJyR7eyBnaXRodWIud29ya2Zsb3cgfX0nLFxuICAgICAgJ2NhbmNlbC1pbi1wcm9ncmVzcyc6IGZhbHNlLFxuICAgIH0sXG4gICAgcGVybWlzc2lvbnM6IHsgY29udGVudHM6ICdyZWFkJyB9LFxuICAgIGpvYnM6IHtcbiAgICAgIGRlcGxveToge1xuICAgICAgICAncnVucy1vbic6ICd1YnVudHUtbGF0ZXN0JyxcbiAgICAgICAgZW52OiB7IFdCX0VOVjogZW52aXJvbm1lbnQsIC4uLmd1YXJkSm9iRW52IH0sXG4gICAgICAgIHN0ZXBzOiBbXG4gICAgICAgICAgLy8gZmV0Y2gtZGVwdGggMCBzbyBgZ2l0IGRlc2NyaWJlYCBzZWVzIHRoZSB0YWdzIFdCX1ZFUlNJT04gaXMgZGVyaXZlZCBmcm9tLlxuICAgICAgICAgIHsgdXNlczogY2hlY2tvdXRBY3Rpb24sIHdpdGg6IHsgJ2ZldGNoLWRlcHRoJzogMCB9IH0sXG4gICAgICAgICAgeyB1c2VzOiBtaXNlQWN0aW9uIH0sXG4gICAgICAgICAge1xuICAgICAgICAgICAgbmFtZTogJ1NldCBXQl9WRVJTSU9OJyxcbiAgICAgICAgICAgIHJ1bjogJ3NldCAtZXVvIHBpcGVmYWlsXFxuV0JfVkVSU0lPTj0kKGdpdCBkZXNjcmliZSAtLWFsd2F5cyAtLXRhZ3MpXFxuZWNobyBcIldCX1ZFUlNJT049JFdCX1ZFUlNJT05cIiA+PiBcIiRHSVRIVUJfRU5WXCInLFxuICAgICAgICAgIH0sXG4gICAgICAgICAgLi4uYnVpbGRJbnN0YWxsU3RlcHMoZmFsc2UpLFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIG5hbWU6ICdEZXBsb3knLFxuICAgICAgICAgICAgdXNlczogcmV0cnlBY3Rpb24sXG4gICAgICAgICAgICB3aXRoOiB7XG4gICAgICAgICAgICAgIHRpbWVvdXRfbWludXRlczogNjAsXG4gICAgICAgICAgICAgIG1heF9hdHRlbXB0czogNSxcbiAgICAgICAgICAgICAgY29tbWFuZDogYGJ1biBydW4gJHtzY3JpcHROYW1lfWAsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgLy8gU3RlcC1zY29wZWQgbGlrZSB0aGUgdGVzdCB3b3JrZmxvdzogZGVwZW5kZW5jeSBsaWZlY3ljbGUgc2NyaXB0cyBydW4gYnlcbiAgICAgICAgICAgIC8vIGBidW4gaW5zdGFsbGAgbXVzdCBub3QgYmUgYWJsZSB0byByZWFkIHRoZSBsb25nLWxpdmVkIGFnZSBpZGVudGl0eS5cbiAgICAgICAgICAgIC4uLih1c2VzRm5veCA/IHsgZW52OiB7IEZOT1hfQUdFX0tFWTogJyR7eyBzZWNyZXRzLkZOT1hfQUdFX0tFWSB9fScgfSB9IDoge30pLFxuICAgICAgICAgIH0sXG4gICAgICAgIF0sXG4gICAgICB9LFxuICAgIH0sXG4gIH07XG59XG5cbmZ1bmN0aW9uIGJ1aWxkUmVsZWFzZVdvcmtmbG93KFxuICBjb25maWc6IFBhY2thZ2VDb25maWcsXG4gIGhhc1Byb2R1Y3Rpb25EZXBsb3lXb3JrZmxvdzogYm9vbGVhbixcbiAgdXNlc0Zub3g6IGJvb2xlYW5cbik6IFdvcmtmbG93IHtcbiAgY29uc3QgZm5veEVudjogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHVzZXNGbm94ID8geyBGTk9YX0FHRV9LRVk6ICcke3sgc2VjcmV0cy5GTk9YX0FHRV9LRVkgfX0nIH0gOiB7fTtcbiAgcmV0dXJuIHtcbiAgICBuYW1lOiAnUmVsZWFzZScsXG4gICAgb246IHtcbiAgICAgIHB1c2g6IHsgYnJhbmNoZXM6IFsuLi5jb25maWcucmVsZWFzZS5icmFuY2hlc10gfSxcbiAgICB9LFxuICAgIGNvbmN1cnJlbmN5OiB7XG4gICAgICBncm91cDogJyR7eyBnaXRodWIud29ya2Zsb3cgfX0nLFxuICAgICAgJ2NhbmNlbC1pbi1wcm9ncmVzcyc6IGZhbHNlLFxuICAgIH0sXG4gICAgcGVybWlzc2lvbnM6IHtcbiAgICAgIC8vIGZvciBzZW1hbnRpYy1yZWxlYXNlXG4gICAgICBjb250ZW50czogJ3dyaXRlJyxcbiAgICAgIC8vIGZvciBkaXNwYXRjaGluZyB0aGUgcHJvZHVjdGlvbiBkZXBsb3kgd29ya2Zsb3cgYWZ0ZXIgYSByZWxlYXNlXG4gICAgICAuLi4oaGFzUHJvZHVjdGlvbkRlcGxveVdvcmtmbG93ID8geyBhY3Rpb25zOiAnd3JpdGUnIH0gOiB7fSksXG4gICAgfSxcbiAgICBqb2JzOiB7XG4gICAgICByZWxlYXNlOiB7XG4gICAgICAgICdydW5zLW9uJzogJ3VidW50dS1sYXRlc3QnLFxuICAgICAgICAvLyBSZWxlYXNlcyBidWlsZCBwcm9kdWN0aW9uIGFydGlmYWN0cywgaGVuY2UgdGhlIGVudmlyb25tZW50IOKAlCB0aGUgc2FtZSBkZWZhdWx0IGFzIHRoZVxuICAgICAgICAvLyByZXVzYWJsZSByZWxlYXNlIHdvcmtmbG93LiB3YidzIENJIGd1YXJkIGFsc28gcmVxdWlyZXMgYW4gZXhwb3J0ZWQgV0JfRU5WLCBzbyB3aXRob3V0XG4gICAgICAgIC8vIGl0IGEgYHBvc3RpbnN0YWxsYCB0aGF0IGNhbGxzIHdiIChlLmcuIGB3YiBnZW4tY29kZWApIGV4aXRzIDEgYmVmb3JlIHNlbWFudGljLXJlbGVhc2VcbiAgICAgICAgLy8gcnVucy5cbiAgICAgICAgZW52OiB7IFdCX0VOVjogJ3Byb2R1Y3Rpb24nLCAuLi5ndWFyZEpvYkVudiB9LFxuICAgICAgICBzdGVwczogW1xuICAgICAgICAgIC8vIGZldGNoLWRlcHRoIDA6IHNlbWFudGljLXJlbGVhc2UgcmVhZHMgdGhlIGZ1bGwgaGlzdG9yeSB0byBjb21wdXRlIHRoZSBuZXh0IHZlcnNpb24uXG4gICAgICAgICAgeyB1c2VzOiBjaGVja291dEFjdGlvbiwgd2l0aDogeyAnZmV0Y2gtZGVwdGgnOiAwIH0gfSxcbiAgICAgICAgICB7IHVzZXM6IG1pc2VBY3Rpb24gfSxcbiAgICAgICAgICAuLi5idWlsZEluc3RhbGxTdGVwcyhmYWxzZSksXG4gICAgICAgICAgLi4uKGhhc1Byb2R1Y3Rpb25EZXBsb3lXb3JrZmxvd1xuICAgICAgICAgICAgPyBbXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgbmFtZTogJ0dldCBjdXJyZW50IGxhdGVzdCB0YWcnLFxuICAgICAgICAgICAgICAgICAgaWQ6ICdwcmUtcmVsZWFzZS10YWcnLFxuICAgICAgICAgICAgICAgICAgcnVuOiAnc2V0IC1ldW8gcGlwZWZhaWxcXG5lY2hvIFwidGFnPSQoZ2l0IGRlc2NyaWJlIC0tdGFncyAtLWFiYnJldj0wIDI+L2Rldi9udWxsIHx8IGVjaG8gXFwnXFwnKVwiID4+IFwiJEdJVEhVQl9PVVRQVVRcIicsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgXVxuICAgICAgICAgICAgOiBbXSksXG4gICAgICAgICAge1xuICAgICAgICAgICAgbmFtZTogJ1JlbGVhc2UnLFxuICAgICAgICAgICAgLy8gc2VtYW50aWMtcmVsZWFzZSBjaGVja3MgTm9kZS5qcyBydW50aW1lIHJlcXVpcmVtZW50czsgYGJ1biA8YmluPmAgcmVzcGVjdHMgaXRzXG4gICAgICAgICAgICAvLyBgIyEvdXNyL2Jpbi9lbnYgbm9kZWAgc2hlYmFuZywgc28gaXQgc3RpbGwgcnVucyB1bmRlciByZWFsIE5vZGUuXG4gICAgICAgICAgICBydW46ICdidW4gc2VtYW50aWMtcmVsZWFzZScsXG4gICAgICAgICAgICBlbnY6IHtcbiAgICAgICAgICAgICAgR0lUSFVCX1RPS0VOOiAnJHt7IHNlY3JldHMuR0lUSFVCX1RPS0VOIH19JyxcbiAgICAgICAgICAgICAgTEVGVEhPT0s6ICcwJyxcbiAgICAgICAgICAgICAgLi4uZm5veEVudixcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfSxcbiAgICAgICAgICAuLi4oaGFzUHJvZHVjdGlvbkRlcGxveVdvcmtmbG93XG4gICAgICAgICAgICA/IChbXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgbmFtZTogJ0NoZWNrIGZvciBuZXcgcmVsZWFzZSB0YWcnLFxuICAgICAgICAgICAgICAgICAgaWQ6ICdwb3N0LXJlbGVhc2UtdGFnJyxcbiAgICAgICAgICAgICAgICAgIHJ1bjogJ3NldCAtZXVvIHBpcGVmYWlsXFxuZ2l0IGZldGNoIC0tdGFncyAtLWZvcmNlXFxuTkVXX1RBRz0kKGdpdCBkZXNjcmliZSAtLXRhZ3MgLS1hYmJyZXY9MCAyPi9kZXYvbnVsbCB8fCBlY2hvIFxcJ1xcJylcXG5lY2hvIFwidGFnPSRORVdfVEFHXCIgPj4gXCIkR0lUSFVCX09VVFBVVFwiXFxuaWYgW1sgLW4gXCIkTkVXX1RBR1wiICYmIFwiJE5FV19UQUdcIiAhPSBcIiR7eyBzdGVwcy5wcmUtcmVsZWFzZS10YWcub3V0cHV0cy50YWcgfX1cIiBdXTsgdGhlblxcbiAgZWNobyBcImNyZWF0ZWQ9dHJ1ZVwiID4+IFwiJEdJVEhVQl9PVVRQVVRcIlxcbmZpJyxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgIGlmOiBcInN0ZXBzLnBvc3QtcmVsZWFzZS10YWcub3V0cHV0cy5jcmVhdGVkID09ICd0cnVlJ1wiLFxuICAgICAgICAgICAgICAgICAgbmFtZTogJ1RyaWdnZXIgcHJvZHVjdGlvbiBkZXBsb3knLFxuICAgICAgICAgICAgICAgICAgLy8gQSBHSVRIVUJfVE9LRU4tY3JlYXRlZCByZWxlYXNlIGRvZXMgbm90IGZpcmUgdGhlIGRlcGxveSB3b3JrZmxvdydzXG4gICAgICAgICAgICAgICAgICAvLyByZWxlYXNlLXB1Ymxpc2hlZCB0cmlnZ2VyLCBzbyBkaXNwYXRjaCBpdCBleHBsaWNpdGx5IG9uIHRoZSBuZXcgdGFnLlxuICAgICAgICAgICAgICAgICAgcnVuOiAnZ2ggd29ya2Zsb3cgcnVuIGRlcGxveS1wcm9kdWN0aW9uLnltbCAtLXJlZiBcIiR7eyBzdGVwcy5wb3N0LXJlbGVhc2UtdGFnLm91dHB1dHMudGFnIH19XCInLFxuICAgICAgICAgICAgICAgICAgZW52OiB7IEdIX1RPS0VOOiAnJHt7IHNlY3JldHMuR0lUSFVCX1RPS0VOIH19JyB9LFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIF0gc2F0aXNmaWVzIFN0ZXBbXSlcbiAgICAgICAgICAgIDogW10pLFxuICAgICAgICBdLFxuICAgICAgfSxcbiAgICB9LFxuICB9O1xufVxuXG4vKipcbiAqIFRoZSBpbnN0YWxsIHNlcXVlbmNlIGV2ZXJ5IGdlbmVyYXRlZCB3b3JrZmxvdyBzaGFyZXM6IGBidW4gaW5zdGFsbCAtLWZyb3plbi1sb2NrZmlsZWAsIGhhcmRlbmVkIGludG8gdGhlXG4gKiByZXVzYWJsZSB3b3JrZmxvd3MnIHRocmVlLXN0ZXAgZGFuY2Ugd2hlbiB0aGUgcmVwb3NpdG9yeSByZWdpc3RlcnMgYSBUQUtVTUlfR1VBUkRfVE9LRU4gc2VjcmV0LlxuICpcbiAqIFRha3VtaSBHdWFyZCAoaHR0cHM6Ly9mbGF0dC50ZWNoL3Rha3VtaS9mZWF0dXJlcy9ndWFyZCkgaXMgYSByZWdpc3RyeSBwcm94eSB0aGF0IGJsb2Nrc1xuICoga25vd24tbWFsaWNpb3VzIHBhY2thZ2VzLiBSb3V0aW5nIHRoZSBERUZBVUxUIHJlZ2lzdHJ5IHRocm91Z2ggaXQgaXMgd2hhdCBwcm90ZWN0cyB0aGUgaW5zdGFsbCxcbiAqIGFuZCB0aGUgdG9rZW4gYXV0aGVudGljYXRlcyB0aGF0IHByb3h5IOKAlCBzbyB0aGUgdG9rZW4gaGFzIHRvIGJlIHByZXNlbnQgd2hpbGUgZGVwZW5kZW5jaWVzIGFyZVxuICogcmVzb2x2ZWQsIHdoaWNoIGlzIGV4YWN0bHkgd2hlbiBhIGNvbXByb21pc2VkIGRlcGVuZGVuY3kncyBsaWZlY3ljbGUgc2NyaXB0IHdvdWxkIHJ1bi4gSGVuY2UgdGhlXG4gKiBzcGxpdDogcmVzb2x2ZSBhbmQgZG93bmxvYWQgd2l0aCBgLS1pZ25vcmUtc2NyaXB0c2AgYW5kIHRoZSB0b2tlbiwgdGhlbiByZXBsYXkgdGhlIHNraXBwZWRcbiAqIGxpZmVjeWNsZSBzY3JpcHRzIGluIGEgc2Vjb25kIGluc3RhbGwgdGhhdCBoYXMgbm8gdG9rZW4gKGV2ZXJ5IHBhY2thZ2UgaXMgYWxyZWFkeSBjYWNoZWQsIGFuZFxuICogR3VhcmQgc2VydmVzIGFub255bW91c2x5IGFueXdheSkuIE9ubHkgYnVuIGlzIGdlbmVyYXRlZCBoZXJlLCBhbmQgYnVuIHJlYWRzIC5ucG1yYywgc28gbm9cbiAqIHBhY2thZ2UtbWFuYWdlciBicmFuY2hpbmcgaXMgbmVlZGVkLlxuICpcbiAqIFRoZSBzaGVsbCBkZXRhaWxzIGRlbGliZXJhdGVseSBtaXJyb3IgcmV1c2FibGUtd29ya2Zsb3dzJyBwcm9kdWN0aW9uLXByb3ZlbiBpbnN0YWxsIHN0ZXBzOiBiYXJlXG4gKiBgJFJVTk5FUl9URU1QYCAoc2V0IGJ5IHRoZSBydW5uZXIgYXBwbGljYXRpb24gb24gZXZlcnkgcnVubmVyLCBhbmQgYHNldCAtdWAgZmFpbHMgbG91ZGx5IGlmIG5vdCksXG4gKiBgW1sgLWUgLm5wbXJjIF1dYCwgYW5kIHRoZSBzZWNvbmQgYHJtIC1yZiBub2RlX21vZHVsZXNgIGluIHRoZSBmYWxsYmFjayAoYW4gaW50ZXJydXB0ZWQgbGlmZWN5Y2xlXG4gKiBydW4gbWF5IGxlYXZlIG5vZGVfbW9kdWxlcyBpbmNvbnNpc3RlbnQsIHNvIHRoZSByZXRyeSBzdGFydHMgY2xlYW4gcmF0aGVyIHRoYW4gdHJ1c3RpbmcgYSByZXBhaXIpLlxuICpcbiAqIGB0b2xlcmF0ZUxpZmVjeWNsZVNjcmlwdEZhaWx1cmVgIGRlY2lkZXMgd2hhdCBhIGZhaWxpbmcgbGlmZWN5Y2xlLXNjcmlwdCByZXBsYXkgZG9lcy4gRXZlcnlcbiAqIHJlcGxheSBydW5zIHRva2VubGVzcyBhbmQgd2l0aG91dCBGTk9YX0FHRV9LRVkgKHRoZSBrZXkgaXMgc2NvcGVkIHRvIHRoZSBsYXRlciBEZXBsb3kvUmVsZWFzZVxuICogc3RlcCksIHNvIGEgcG9zdGluc3RhbGwgdGhhdCBuZWVkcyBkZWNyeXB0ZWQgc2VjcmV0cyBpcyB1bnN1cHBvcnRlZCBpbiBhbGwgb2YgdGhlbSBieSBkZXNpZ24uXG4gKiBUaGUgdGVzdCB3b3JrZmxvdyB0b2xlcmF0ZXMgdGhlIGZhaWx1cmUgYmVjYXVzZSB0eXBlY2hlY2svbGludC90ZXN0IGZhaWwgbG91ZGx5IG9uIGEgZGVncmFkZWRcbiAqIHRyZWUgYW55d2F5LiBEZXBsb3kgYW5kIHJlbGVhc2Ugd29ya2Zsb3dzIG11c3Qgbm90OiBhIGA6Ondhcm5pbmc6OmAgZG9lcyBub3QgZmFpbCB0aGUgam9iLCBzb1xuICogdGhlIGZhbGxiYWNrIHdvdWxkIHNoaXAgYSB0cmVlIHdob3NlIGxpZmVjeWNsZSBzY3JpcHRzIChlLmcuIGEgYHBvc3RpbnN0YWxsOiB3YiBnZW4tY29kZWApXG4gKiBuZXZlciByYW4sIHNpbGVudGx5IGRlcGxveWluZyBkZWdyYWRlZCBvdXRwdXQgKCMxMTI3KS5cbiAqL1xuZnVuY3Rpb24gYnVpbGRJbnN0YWxsU3RlcHModG9sZXJhdGVMaWZlY3ljbGVTY3JpcHRGYWlsdXJlOiBib29sZWFuKTogU3RlcFtdIHtcbiAgcmV0dXJuIFtcbiAgICB7XG4gICAgICBpZjogXCIke3sgZW52LkhBU19UQUtVTUlfR1VBUkRfVE9LRU4gPT0gJ3RydWUnIH19XCIsXG4gICAgICBuYW1lOiAnR2VuZXJhdGUgLm5wbXJjIGZvciBUYWt1bWkgR3VhcmQnLFxuICAgICAgLy8gVGhlIHRva2VuIGlzIHdyaXR0ZW4gYXMgYSBsaXRlcmFsIGAke1RBS1VNSV9HVUFSRF9UT0tFTn1gIHJlZmVyZW5jZSB0aGF0IGJ1biBleHBhbmRzIGF0XG4gICAgICAvLyBpbnN0YWxsIHRpbWUsIHNvIHRoZSBzZWNyZXQgaXRzZWxmIG5ldmVyIGxhbmRzIGluIGEgZmlsZS4gVGhlIG1hbmFnZWQgbGluZXMgYXJlIHN0cmlwcGVkXG4gICAgICAvLyBmcm9tIGFuIGV4aXN0aW5nIC5ucG1yYyBmaXJzdDogYSByZXBvc2l0b3J5IG91dHNpZGUgdGhlIG9yZ2FuaXphdGlvbnMgbWF5IGxlZ2l0aW1hdGVseVxuICAgICAgLy8gY29tbWl0IG9uZSAoc2NvcGUgbWFwcGluZ3MgZm9yIGFub3RoZXIgcmVnaXN0cnkpLCBhbmQgZHJvcHBpbmcgb25seSB0aGVzZSB0d28gbGluZXMga2VlcHNcbiAgICAgIC8vIHRoZSByZXN0IG9mIGl0IGluIGVmZmVjdC4gUmVwbGFjaW5nIHRoZSBmaWxlIHdpdGggYG12YCByYXRoZXIgdGhhbiBhcHBlbmRpbmcgaW4gcGxhY2Ugc3RvcHNcbiAgICAgIC8vIGEgY29tbWl0dGVkIHN5bWxpbmsgZnJvbSByZWRpcmVjdGluZyB0aGUgd3JpdGUgaW50bywgc2F5LCBhIHBlcnNpc3RlbnQgaG9tZSBucG1yYy5cbiAgICAgIHJ1bjogYHNldCAtZXVvIHBpcGVmYWlsXG5OUE1SQz1cIiQobWt0ZW1wIFwiJFJVTk5FUl9URU1QL25wbXJjLlhYWFhYWFwiKVwiXG5pZiBbWyAtZSAubnBtcmMgXV07IHRoZW5cbiAgZ3JlcCAtdkUgJ15yZWdpc3RyeT18Xi8vbnBtXFxcXC5mbGF0dFxcXFwudGVjaC86X2F1dGhUb2tlbicgLm5wbXJjID4gXCIkTlBNUkNcIiB8fCB0cnVlXG5maVxuZWNobyAncmVnaXN0cnk9aHR0cHM6Ly9ucG0uZmxhdHQudGVjaC8nID4+IFwiJE5QTVJDXCJcbmVjaG8gJy8vbnBtLmZsYXR0LnRlY2gvOl9hdXRoVG9rZW49XFwke1RBS1VNSV9HVUFSRF9UT0tFTn0nID4+IFwiJE5QTVJDXCJcbnJtIC1mIC5ucG1yY1xubXYgXCIkTlBNUkNcIiAubnBtcmNgLFxuICAgIH0sXG4gICAge1xuICAgICAgbmFtZTogJ0luc3RhbGwgZGVwZW5kZW5jaWVzJyxcbiAgICAgIC8vIC0tZnJvemVuLWxvY2tmaWxlOiBhIHBsYWluIGBidW4gaW5zdGFsbGAgc2lsZW50bHkgcmVwYWlycyBhIGJ1bi5sb2NrIHRoYXQgaXMgc3RhbGUgYWdhaW5zdFxuICAgICAgLy8gcGFja2FnZS5qc29uLCBzbyBDSSB3b3VsZCBydW4gZGVwZW5kZW5jeSByZXNvbHV0aW9ucyB0aGF0IHdlcmUgbmV2ZXIgcmV2aWV3ZWQgKCMxMTI2KS5cbiAgICAgIC8vIFdpdGggTk8gYnVuLmxvY2sgYXQgYWxsLCAtLWZyb3plbi1sb2NrZmlsZSBzaWxlbnRseSBpbnN0YWxscyBmcmVzaCwgdW5waW5uZWQgcmVzb2x1dGlvbnNcbiAgICAgIC8vIChCdW4gMS4zLjE0IGV4aXRzIDAgYW5kIHdyaXRlcyBubyBsb2NrZmlsZSksIHNvIGEgbWlzc2luZyBsb2NrZmlsZSBtdXN0IGZhaWwgZXhwbGljaXRseS5cbiAgICAgIHJ1bjogYHNldCAtZXVvIHBpcGVmYWlsXG5pZiBbWyAhIC1lIGJ1bi5sb2NrIF1dOyB0aGVuXG4gIGVjaG8gXCI6OmVycm9yOjpidW4ubG9jayBpcyBtaXNzaW5nOyBjb21taXQgaXQgc28gQ0kgaW5zdGFsbHMgc3RheSByZXByb2R1Y2libGVcIlxuICBleGl0IDFcbmZpXG5pZiBbWyBcIiRIQVNfVEFLVU1JX0dVQVJEX1RPS0VOXCIgPT0gXCJ0cnVlXCIgXV07IHRoZW5cbiAgYnVuIGluc3RhbGwgLS1mcm96ZW4tbG9ja2ZpbGUgLS1pZ25vcmUtc2NyaXB0c1xuZWxzZVxuICBidW4gaW5zdGFsbCAtLWZyb3plbi1sb2NrZmlsZVxuZmlgLFxuICAgICAgLy8gU3RlcC1zY29wZWQ6IGEgam9iLWxldmVsIHRva2VuIHdvdWxkIGJlIHJlYWRhYmxlIGJ5IGV2ZXJ5IGRlcGVuZGVuY3kgbGlmZWN5Y2xlIHNjcmlwdCB0aGVcbiAgICAgIC8vIHRva2VubGVzcyByZXBsYXkgYmVsb3cgcnVucy5cbiAgICAgIGVudjogeyBUQUtVTUlfR1VBUkRfVE9LRU46ICcke3sgc2VjcmV0cy5UQUtVTUlfR1VBUkRfVE9LRU4gfX0nIH0sXG4gICAgfSxcbiAgICB7XG4gICAgICBpZjogXCIke3sgZW52LkhBU19UQUtVTUlfR1VBUkRfVE9LRU4gPT0gJ3RydWUnIH19XCIsXG4gICAgICBuYW1lOiAnUnVuIGRlcGVuZGVuY3kgbGlmZWN5Y2xlIHNjcmlwdHMgd2l0aG91dCByZWdpc3RyeSBjcmVkZW50aWFscycsXG4gICAgICAvLyBBIHJlcGVhdGVkIGBidW4gaW5zdGFsbGAgaXMgYSBuby1vcCB0aGF0IHJlcGxheXMgbm90aGluZywgc28gbm9kZV9tb2R1bGVzIGhhcyB0byBnbyBmaXJzdC5cbiAgICAgIHJ1bjogYHNldCAtZXVvIHBpcGVmYWlsXG5ybSAtcmYgbm9kZV9tb2R1bGVzXG5idW4gaW5zdGFsbCAtLWZyb3plbi1sb2NrZmlsZSR7XG4gICAgICAgIHRvbGVyYXRlTGlmZWN5Y2xlU2NyaXB0RmFpbHVyZVxuICAgICAgICAgID8gYCB8fCB7XG4gIGVjaG8gXCI6Ondhcm5pbmc6OkxpZmVjeWNsZSBzY3JpcHRzIGZhaWxlZDsgY29tcGxldGluZyB0aGUgaW5zdGFsbCB3aXRob3V0IHRoZW1cIlxuICBybSAtcmYgbm9kZV9tb2R1bGVzXG4gIGJ1biBpbnN0YWxsIC0tZnJvemVuLWxvY2tmaWxlIC0taWdub3JlLXNjcmlwdHNcbn1gXG4gICAgICAgICAgOiAnJ1xuICAgICAgfWAsXG4gICAgfSxcbiAgICB7XG4gICAgICBpZjogXCIke3sgZW52LkhBU19UQUtVTUlfR1VBUkRfVE9LRU4gPT0gJ3RydWUnIH19XCIsXG4gICAgICBuYW1lOiAnUmVtb3ZlIHRoZSBnZW5lcmF0ZWQgLm5wbXJjJyxcbiAgICAgIC8vIE5vdGhpbmcgYWZ0ZXIgdGhlIGluc3RhbGwgbmVlZHMgdGhlIHByb3h5LCBhbmQgbGVhdmluZyBpdCBpbiBwbGFjZSB3b3VsZCBicmVhayB0aGUgb25lXG4gICAgICAvLyB0aGluZyBHdWFyZCByZWZ1c2VzIHRvIHNlcnZlOiBpdCBhbnN3ZXJzIGBucG0gcHVibGlzaGAgd2l0aCA0MDUsIHNvIGEgcmVsZWFzZSB3b3JrZmxvd1xuICAgICAgLy8gd2hvc2UgcGFja2FnZSBsYWNrcyBhbiBleHBsaWNpdCBwdWJsaXNoQ29uZmlnLnJlZ2lzdHJ5IHdvdWxkIGZhaWwgdG8gcHVibGlzaC5cbiAgICAgIHJ1bjogYHNldCAtZXVvIHBpcGVmYWlsXG5pZiBnaXQgbHMtZmlsZXMgLS1lcnJvci11bm1hdGNoIC0tIC5ucG1yYyA+IC9kZXYvbnVsbCAyPiYxOyB0aGVuXG4gIGdpdCBjaGVja291dCAtLSAubnBtcmNcbmVsc2VcbiAgcm0gLWYgLm5wbXJjXG5maWAsXG4gICAgfSxcbiAgXTtcbn1cblxuZnVuY3Rpb24gYnVpbGRTZW1hbnRpY1ByV29ya2Zsb3coKTogV29ya2Zsb3cge1xuICByZXR1cm4ge1xuICAgIG5hbWU6ICdMaW50IFBSIHRpdGxlJyxcbiAgICBvbjoge1xuICAgICAgcHVsbF9yZXF1ZXN0X3RhcmdldDogeyB0eXBlczogWydvcGVuZWQnLCAnZWRpdGVkJywgJ3N5bmNocm9uaXplJ10gfSxcbiAgICB9LFxuICAgIGpvYnM6IHtcbiAgICAgICdzZW1hbnRpYy1wcic6IHtcbiAgICAgICAgJ3J1bnMtb24nOiAndWJ1bnR1LWxhdGVzdCcsXG4gICAgICAgIC8vIFRoZSBhY3Rpb24gcmVhZHMgdGhlIHB1bGwgcmVxdWVzdCwgYW5kIGl0cyBgd2lwYCBzdXBwb3J0IHBvc3RzIGEgY29tbWl0IHN0YXR1czsgbmVpdGhlclxuICAgICAgICAvLyBwZXJtaXNzaW9uIGlzIGdyYW50ZWQgd2hlbiB0aGUgcmVwb3NpdG9yeSByZXN0cmljdHMgZGVmYXVsdCB3b3JrZmxvdyBwZXJtaXNzaW9ucy5cbiAgICAgICAgcGVybWlzc2lvbnM6IHsgJ3B1bGwtcmVxdWVzdHMnOiAncmVhZCcsIHN0YXR1c2VzOiAnd3JpdGUnIH0sXG4gICAgICAgIHN0ZXBzOiBbXG4gICAgICAgICAge1xuICAgICAgICAgICAgdXNlczogc2VtYW50aWNQdWxsUmVxdWVzdEFjdGlvbixcbiAgICAgICAgICAgIHdpdGg6IHsgd2lwOiB0cnVlIH0sXG4gICAgICAgICAgICBlbnY6IHsgR0lUSFVCX1RPS0VOOiAnJHt7IHNlY3JldHMuR0lUSFVCX1RPS0VOIH19JyB9LFxuICAgICAgICAgIH0sXG4gICAgICAgIF0sXG4gICAgICB9LFxuICAgIH0sXG4gIH07XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgc2VtdmVyIGZyb20gJ3NlbXZlcic7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGZzVXRpbCB9IGZyb20gJy4uL3V0aWxzL2ZzVXRpbC5qcyc7XG5pbXBvcnQgeyBzcGF3blN5bmNBbmRSZXR1cm5TdGRvdXQgfSBmcm9tICcuLi91dGlscy9zcGF3blV0aWwuanMnO1xuXG5pbnRlcmZhY2UgTWlzZVRvbWwge1xuICB0b29scz86IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICBba2V5OiBzdHJpbmddOiB1bmtub3duO1xufVxuXG4vLyBUaGUgb2xkZXN0IEJ1biBydW50aW1lIHdiZnkgc3VwcG9ydHMuXG5leHBvcnQgY29uc3QgbWluaW11bUJ1blZlcnNpb24gPSAnMS40LjAnO1xuXG4vKipcbiAqIEVuc3VyZXMgbWlzZS50b21sIG1hbmFnZXMgdGhlIE5vZGUuanMgYW5kICh3aGVuIGZub3gudG9tbCBleGlzdHMpIGZub3ggdG9vbCB2ZXJzaW9ucyB3aGlsZVxuICogcHJlc2VydmluZyB0aGUgQnVuIHBpbiBhbmQgdW5yZWxhdGVkIG1pc2Ugc2V0dGluZ3MuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZW5lcmF0ZU1pc2VUb21sKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2dlbmVyYXRlTWlzZVRvbWwnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgbWlzZVRvbWxQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnbWlzZS50b21sJyk7XG4gICAgLy8gQSBwYXJzZSBmYWlsdXJlIG11c3QgYWJvcnQgaW5zdGVhZCBvZiBmYWxsaW5nIGJhY2sgdG8ge306IHJlZ2VuZXJhdGluZyBmcm9tIGFuIGVtcHR5IG9iamVjdFxuICAgIC8vIHdvdWxkIHNpbGVudGx5IHJlcGxhY2UgdGhlIHVzZXIncyBleGlzdGluZyAoYWxiZWl0IGJyb2tlbikgbWlzZS50b21sLlxuICAgIGNvbnN0IHNldHRpbmdzID0gcGFyc2VNaXNlVG9tbChtaXNlVG9tbFBhdGgpO1xuICAgIGNvbnN0IHRvb2xzID0geyAuLi5zZXR0aW5ncy50b29scyB9O1xuXG4gICAgLy8gRW5zdXJlIE5vZGUuanMgaXMgYWx3YXlzIHBpbm5lZDogZ2VuZXJhdGVkIGhvb2tzIGFuZCBDSSBydW4gYG1pc2UgaW5zdGFsbGAsIGFuZCBhbiB1bnBpbm5lZFxuICAgIC8vIE5vZGUgd291bGQgY29tZSBmcm9tIHdoYXRldmVyIGhhcHBlbnMgdG8gYmUgb24gUEFUSC5cbiAgICAvLyBMaWZ0LXRoZW4tcGluOiB0aGUgbGlmdCBvbmx5IHRvdWNoZXMgZXhhY3QgcGlucyBhbmQgdGhlIHBpbiBvbmx5IHRvdWNoZXMgc2VsZWN0b3JzLCBzb1xuICAgIC8vIG9yZGVyaW5nIHRoZSBsaWZ0IGZpcnN0IGF2b2lkcyByZXNvbHZpbmcgYG1pc2UgbGF0ZXN0IG5vZGVAbHRzYCB0d2ljZSBmb3IgdW5waW5uZWQgcmVwb3MuXG4gICAgdG9vbHMubm9kZSA9IHBpbkNvbmNyZXRlVG9vbFZlcnNpb24oXG4gICAgICAnbm9kZScsXG4gICAgICBsaWZ0T3V0ZGF0ZWRUb29sVmVyc2lvbldpdGhpbk1ham9yKCdub2RlQGx0cycsIHRvb2xzLm5vZGUsIGNvbmZpZy5kaXJQYXRoKSxcbiAgICAgIGNvbmZpZy5kaXJQYXRoXG4gICAgKTtcbiAgICAvLyBCdW4gaXMgbmV2ZXIgYWRkZWQgb3IgY2hhbmdlZDogYSBtaXNzaW5nIHBpbiBzdGF5cyBtaXNzaW5nIChkZXZlbG9wZXJzIGluc3RhbGwgQnVuIGdsb2JhbGx5XG4gICAgLy8gdG8gcnVuIHdiZnkpLCBhbmQgaGFzU3VwcG9ydGVkQnVuUGluKCkgaGFzIGFscmVhZHkgcmVqZWN0ZWQgYW55IHBpbiB0aGF0IGlzIG5vdCBvbmUgZXhhY3RcbiAgICAvLyBzdXBwb3J0ZWQgdmVyc2lvbi5cbiAgICBpZiAoZnMuZXhpc3RzU3luYyhwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICdmbm94LnRvbWwnKSkpIHtcbiAgICAgIHRvb2xzLmZub3ggPSBwaW5Db25jcmV0ZVRvb2xWZXJzaW9uKFxuICAgICAgICAnZm5veCcsXG4gICAgICAgIGxpZnRPdXRkYXRlZFRvb2xWZXJzaW9uV2l0aGluTWFqb3IoJ2Zub3gnLCB0b29scy5mbm94LCBjb25maWcuZGlyUGF0aCksXG4gICAgICAgIGNvbmZpZy5kaXJQYXRoXG4gICAgICApO1xuICAgIH1cbiAgICBzZXR0aW5ncy50b29scyA9IHRvb2xzO1xuXG4gICAgLy8gQHRzLWV4cGVjdC1lcnJvciAtLSBCdW4gMS40IHByb3ZpZGVzIFRPTUwuc3RyaW5naWZ5IGJlZm9yZSB0aGUgYWdlLWdhdGVkIEB0eXBlcy9idW4gdmVyc2lvbiBkZWNsYXJlcyBpdC5cbiAgICBhd2FpdCBmc1V0aWwuZ2VuZXJhdGVGaWxlKG1pc2VUb21sUGF0aCwgQnVuLlRPTUwuc3RyaW5naWZ5KHNldHRpbmdzKSk7XG4gIH0pO1xufVxuXG4vKiogV2hldGhlciBtaXNlLnRvbWwgb21pdHMgQnVuIG9yIHBpbnMgaXQgdG8gb25lIGV4YWN0IHZlcnNpb24gdGhhdCB3YmZ5IHN1cHBvcnRzLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGhhc1N1cHBvcnRlZEJ1blBpbihkaXJQYXRoOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgbGV0IGJ1blZlcnNpb246IHVua25vd247XG4gIHRyeSB7XG4gICAgYnVuVmVyc2lvbiA9IHBhcnNlTWlzZVRvbWwocGF0aC5yZXNvbHZlKGRpclBhdGgsICdtaXNlLnRvbWwnKSkudG9vbHM/LmJ1bjtcbiAgfSBjYXRjaCB7XG4gICAgLy8gTGV0IGdlbmVyYXRlTWlzZVRvbWwgcmVwb3J0IHRoZSB1bnJlYWRhYmxlIG9yIG1hbGZvcm1lZCBmaWxlLlxuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIHJldHVybiAoXG4gICAgYnVuVmVyc2lvbiA9PT0gdW5kZWZpbmVkIHx8XG4gICAgKHR5cGVvZiBidW5WZXJzaW9uID09PSAnc3RyaW5nJyAmJiAhIXNlbXZlci52YWxpZChidW5WZXJzaW9uKSAmJiBzZW12ZXIuZ3RlKGJ1blZlcnNpb24sIG1pbmltdW1CdW5WZXJzaW9uKSlcbiAgKTtcbn1cblxuLyoqXG4gKiBMaWZ0cyBhbiBleGFjdCB0b29sIHBpbiBiZWxvdyB0aGUgbGF0ZXN0IHJlc29sdmFibGUgdmVyc2lvbiDigJQgd2l0aGluIHRoZSBTQU1FIG1ham9yIOKAlCB0byB0aGF0XG4gKiB2ZXJzaW9uIChOb2RlLmpzIHJlc29sdmVzIGFnYWluc3QgdGhlIGxhdGVzdCBMVFMpOiB0aGUgcmVwb3NpdG9yeS1zdHJ1Y3R1cmUgc3RhbmRhcmQgdHJhY2tzIHRoZVxuICogY3VycmVudCB0b29sY2hhaW4gYWNyb3NzIHJlcG9zaXRvcmllcyBhbmQgUmVub3ZhdGUgZG9lcyBub3QgbWFuYWdlIG1pc2UudG9tbCBwaW5zLCBzb1xuICogcGF0Y2gvbWlub3IgZHJpZnQgKGUuZy4gbm9kZSAyNC4xNi4wIHZzIDI0LjE4LjAsIGZub3ggMS4zMC4wIHZzIDEuMzEuMCkgbmV2ZXIgc2VsZi1oZWFscy4gQSBwaW5cbiAqIG9uIGFuIG9sZGVyIG1ham9yIGlzIGEgZGVsaWJlcmF0ZSBjb21wYXRpYmlsaXR5IGNob2ljZSBhbmQgaXMga2VwdCwgYXMgYXJlIG5vbi1leGFjdCBhbmRcbiAqIG5vbi1zdHJpbmcgZm9ybXMuIFdoZW4gbWlzZSBjYW5ub3QgcmVzb2x2ZSB0aGUgc2VsZWN0b3IgKGUuZy4gb2ZmbGluZSksIHRoZSBwaW4gaXMga2VwdC5cbiAqL1xuZnVuY3Rpb24gbGlmdE91dGRhdGVkVG9vbFZlcnNpb25XaXRoaW5NYWpvcihzZWxlY3Rvcjogc3RyaW5nLCB2ZXJzaW9uOiB1bmtub3duLCBjd2Q6IHN0cmluZyk6IHVua25vd24ge1xuICBpZiAodHlwZW9mIHZlcnNpb24gIT09ICdzdHJpbmcnIHx8ICFzZW12ZXIudmFsaWQodmVyc2lvbikpIHJldHVybiB2ZXJzaW9uO1xuICBjb25zdCBsYXRlc3RWZXJzaW9uID0gc3Bhd25TeW5jQW5kUmV0dXJuU3Rkb3V0KCdtaXNlJywgWydsYXRlc3QnLCBzZWxlY3Rvcl0sIGN3ZCk7XG4gIHJldHVybiBzZW12ZXIudmFsaWQobGF0ZXN0VmVyc2lvbikgJiZcbiAgICBzZW12ZXIubWFqb3IobGF0ZXN0VmVyc2lvbikgPT09IHNlbXZlci5tYWpvcih2ZXJzaW9uKSAmJlxuICAgIHNlbXZlci5sdCh2ZXJzaW9uLCBsYXRlc3RWZXJzaW9uKVxuICAgID8gbGF0ZXN0VmVyc2lvblxuICAgIDogdmVyc2lvbjtcbn1cblxuLyoqXG4gKiBSZXBsYWNlcyBhbiB1bnBpbm5lZCBzZWxlY3RvciAoYGxhdGVzdGAsIGEgcmFuZ2Ugc3VjaCBhcyBcIjI0XCIsIGFuIGFsaWFzLCBvciBhIG1pc3NpbmcgZW50cnkpXG4gKiB3aXRoIHRoZSBuZXdlc3QgY29uY3JldGUgdmVyc2lvbiBtaXNlIHJlc29sdmVzIGZvciBpdCwgYmVjYXVzZSB0aGUgcmVwb3NpdG9yeS1zdHJ1Y3R1cmVcbiAqIHN0YW5kYXJkIHJlcXVpcmVzIGNvbmNyZXRlIHBpbnM6IENJIGluc3RhbGxzIHdoYXRldmVyIGFuIHVucGlubmVkIHNlbGVjdG9yIHJlc29sdmVzIHRvIGF0IHJ1blxuICogdGltZSwgc28gYnVpbGRzIGRyaWZ0IGFjcm9zcyBydW5zLiBFeGFjdCB2ZXJzaW9ucyBhcmUga2VwdCBhcy1pcywgYW5kIG5vbi1zdHJpbmcgZm9ybXMgKG1pc2Unc1xuICogYXJyYXkgYW5kIGB7IHZlcnNpb24gPSBcIuKAplwiIH1gIGZvcm1zKSBhcmUgdXNlci1tYW5hZ2VkIGFuZCBsZWZ0IHVudG91Y2hlZC4gV2hlbiBtaXNlIGlzXG4gKiB1bmF2YWlsYWJsZSBvciBjYW5ub3QgcmVzb2x2ZSB0aGUgc2VsZWN0b3IgKGUuZy4gb2ZmbGluZSksIHRoZSBvcmlnaW5hbCBzZWxlY3RvciBpcyBrZXB0IOKAlFxuICogYW4gdW5waW5uZWQgdG9vbCBpcyBiZXR0ZXIgdGhhbiBhIGJyb2tlbiBjb25maWd1cmF0aW9uLlxuICovXG5mdW5jdGlvbiBwaW5Db25jcmV0ZVRvb2xWZXJzaW9uKHRvb2w6IHN0cmluZywgdmVyc2lvbjogdW5rbm93biwgY3dkOiBzdHJpbmcpOiB1bmtub3duIHtcbiAgaWYgKHZlcnNpb24gIT09IHVuZGVmaW5lZCAmJiAodHlwZW9mIHZlcnNpb24gIT09ICdzdHJpbmcnIHx8IHNlbXZlci52YWxpZCh2ZXJzaW9uKSkpIHJldHVybiB2ZXJzaW9uO1xuICAvLyBOb3JtYWxpemUgc2VsZWN0b3IgZm9ybXMgYG1pc2UgbGF0ZXN0YCBjYW5ub3QgcmVzb2x2ZSBldmVuIHRob3VnaCBtaXNlIGNvbmZpZ3VyYXRpb24gYWNjZXB0c1xuICAvLyB0aGVtOiBgcHJlZml4OjI0YCBpcyByZWplY3RlZCBvdXRyaWdodCB3aGlsZSBgMjRgIHJlc29sdmVzLCBhbmQgYGx0cy8qYCB5aWVsZHMgZW1wdHkgb3V0cHV0XG4gIC8vIHdoaWxlIGBsdHNgIHJlc29sdmVzLiBNb2RpZmllciBzZWxlY3RvcnMgc3VjaCBhcyBgc3ViLTI6bHRzYCBzdGF5IHVucmVzb2x2YWJsZSBhbmQgZmFsbCBiYWNrXG4gIC8vIHRvIHRoZSBvcmlnaW5hbCBzZWxlY3RvciBiZWxvdy5cbiAgY29uc3QgcmFuZ2UgPSB0eXBlb2YgdmVyc2lvbiA9PT0gJ3N0cmluZycgPyB2ZXJzaW9uLnJlcGxhY2UoL15wcmVmaXg6L3UsICcnKS5yZXBsYWNlKC9cXC9cXCokL3UsICcnKSA6IHVuZGVmaW5lZDtcbiAgLy8gV2l0aCBubyBtZWFuaW5nZnVsIHNlbGVjdG9yLCBOb2RlLmpzIHBpbnMgdG8gdGhlIGxhdGVzdCBMVFMgKG1hdGNoaW5nIHRoZSByZXVzYWJsZSB3b3JrZmxvd3MnXG4gIC8vIGBsdHMvKmAgZmFsbGJhY2spIHJhdGhlciB0aGFuIHRoZSBuZXdlc3QgcmVsZWFzZS5cbiAgY29uc3QgZGVmYXVsdFNlbGVjdG9yID0gdG9vbCA9PT0gJ25vZGUnID8gJ25vZGVAbHRzJyA6IHRvb2w7XG4gIGNvbnN0IHNlbGVjdG9yID0gcmFuZ2UgJiYgcmFuZ2UgIT09ICdsYXRlc3QnID8gYCR7dG9vbH1AJHtyYW5nZX1gIDogZGVmYXVsdFNlbGVjdG9yO1xuICBjb25zdCByZXNvbHZlZFZlcnNpb24gPSBzcGF3blN5bmNBbmRSZXR1cm5TdGRvdXQoJ21pc2UnLCBbJ2xhdGVzdCcsIHNlbGVjdG9yXSwgY3dkKTtcbiAgcmV0dXJuIHNlbXZlci52YWxpZChyZXNvbHZlZFZlcnNpb24pID8gcmVzb2x2ZWRWZXJzaW9uIDogKHZlcnNpb24gPz8gJ2xhdGVzdCcpO1xufVxuXG5mdW5jdGlvbiBwYXJzZU1pc2VUb21sKG1pc2VUb21sUGF0aDogc3RyaW5nKTogTWlzZVRvbWwge1xuICBsZXQgY29udGVudDogc3RyaW5nO1xuICB0cnkge1xuICAgIGNvbnRlbnQgPSBmcy5yZWFkRmlsZVN5bmMobWlzZVRvbWxQYXRoLCAndXRmOCcpO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIC8vIE9ubHkgYSByZXBvc2l0b3J5IHdpdGhvdXQgbWlzZS50b21sIHN0YXJ0cyBmcm9tIGFuIGVtcHR5IGNvbmZpZ3VyYXRpb247IGFuIHVucmVhZGFibGUgZmlsZVxuICAgIC8vIChlLmcuIHBlcm1pc3Npb25zKSBtdXN0IGFib3J0IGluc3RlYWQgb2YgYmVpbmcgb3ZlcndyaXR0ZW4gd2l0aCBnZW5lcmF0ZWQgc2V0dGluZ3MuXG4gICAgaWYgKChlcnJvciBhcyBOb2RlSlMuRXJybm9FeGNlcHRpb24pLmNvZGUgPT09ICdFTk9FTlQnKSByZXR1cm4ge307XG4gICAgdGhyb3cgZXJyb3I7XG4gIH1cbiAgcmV0dXJuIEJ1bi5UT01MLnBhcnNlKGNvbnRlbnQpIGFzIE1pc2VUb21sO1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBmc1V0aWwgfSBmcm9tICcuLi91dGlscy9mc1V0aWwuanMnO1xuaW1wb3J0IHsgcHJpdmF0ZVJlZ2lzdHJ5U2NvcGVNYXBwaW5nLCByZXBvUmVzb2x2ZXNQcml2YXRlUGFja2FnZXMgfSBmcm9tICcuLi91dGlscy9wcml2YXRlUGFja2FnZXMuanMnO1xuXG4vKipcbiAqIEJ1biByZWFkcyByZWdpc3RyeSBzY29wZSBtYXBwaW5ncyBmcm9tIGEgcGh5c2ljYWwgcmVwb3NpdG9yeSAubnBtcmMgZHVyaW5nIFJlbm92YXRlIGFydGlmYWN0XG4gKiB1cGRhdGVzOyBSZW5vdmF0ZSdzIG5wbXJjIHNldHRpbmcgaXMgdXNlZCBvbmx5IGJ5IGl0cyBkYXRhc291cmNlIGxheWVyLiBLZWVwIHRoZSBub24tc2VjcmV0XG4gKiBtYXBwaW5nIGluIHJlcG9zaXRvcmllcyB0aGF0IHJlc29sdmUgcHJpdmF0ZSBwYWNrYWdlcywgd2hpbGUgYXV0aGVudGljYXRpb24gcmVtYWlucyBpbiB0aGVcbiAqIGRldmVsb3BlcidzIH4vLm5wbXJjIGxvY2FsbHkgYW5kIGluIHRlbXBvcmFyeSBDSSBvciBNZW5kIGNvbmZpZ3VyYXRpb24uXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZW5lcmF0ZVJlcG9zaXRvcnlOcG1yYyhjb25maWdzOiBQYWNrYWdlQ29uZmlnW10pOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgcmVwb0F1dGhvciA9IGNvbmZpZ3NbMF0/LnJlcG9BdXRob3I7XG4gIGlmIChyZXBvQXV0aG9yICE9PSAnV2lsbEJvb3N0ZXInICYmIHJlcG9BdXRob3IgIT09ICdXaWxsQm9vc3RlckxhYicpIHJldHVybjtcblxuICBjb25zdCBucG1yY1BhdGhzID0gbmV3IFNldChjb25maWdzLm1hcCgoY29uZmlnKSA9PiBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICcubnBtcmMnKSkpO1xuICBjb25zdCByb290Q29uZmlnID0gY29uZmlncy5maW5kKChjb25maWcpID0+IGNvbmZpZy5pc1Jvb3QpO1xuICBpZiAocm9vdENvbmZpZyAmJiByZXBvUmVzb2x2ZXNQcml2YXRlUGFja2FnZXMocm9vdENvbmZpZykpIHtcbiAgICBjb25zdCByb290TnBtcmNQYXRoID0gcGF0aC5yZXNvbHZlKHJvb3RDb25maWcuZGlyUGF0aCwgJy5ucG1yYycpO1xuICAgIGF3YWl0IGZzVXRpbC5nZW5lcmF0ZUZpbGUocm9vdE5wbXJjUGF0aCwgcHJpdmF0ZVJlZ2lzdHJ5U2NvcGVNYXBwaW5nKTtcbiAgICBucG1yY1BhdGhzLmRlbGV0ZShyb290TnBtcmNQYXRoKTtcbiAgfVxuXG4gIGZvciAoY29uc3QgbnBtcmNQYXRoIG9mIG5wbXJjUGF0aHMpIGF3YWl0IHJlbW92ZU5wbXJjKG5wbXJjUGF0aCk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHJlbW92ZU5wbXJjKG5wbXJjUGF0aDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gIGlmICghKGF3YWl0IGZzLnByb21pc2VzLmxzdGF0KG5wbXJjUGF0aCkuY2F0Y2goKCkgPT4ge30pKSkgcmV0dXJuO1xuICBpZiAoYXdhaXQgZnNVdGlsLnJlbW92ZUNvbmZpbmVkKG5wbXJjUGF0aCkpIHtcbiAgICBjb25zb2xlLmluZm8oYFJlbW92ZWQgbm9uLWNhbm9uaWNhbCByZXBvc2l0b3J5IG5wbXJjICR7bnBtcmNQYXRofS5gKTtcbiAgfVxufVxuIiwiaW1wb3J0IHR5cGUgeyBPY3Rva2l0IH0gZnJvbSAnQG9jdG9raXQvY29yZSc7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGdldE9jdG9raXQsIGhhc0dpdEh1YlRva2VuIH0gZnJvbSAnLi4vdXRpbHMvZ2l0aHViVXRpbC5qcyc7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBzZXR1cExhYmVscyhjb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdzZXR1cExhYmVscycsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCB7IHJlcG9BdXRob3I6IG93bmVyLCByZXBvTmFtZTogcmVwbyB9ID0gY29uZmlnO1xuICAgIGlmICghb3duZXIgfHwgIXJlcG8pIHJldHVybjtcbiAgICBpZiAob3duZXIgIT09ICdXaWxsQm9vc3RlcicgJiYgb3duZXIgIT09ICdXaWxsQm9vc3RlckxhYicpIHJldHVybjtcbiAgICBpZiAoIWhhc0dpdEh1YlRva2VuKG93bmVyKSkgcmV0dXJuO1xuXG4gICAgY29uc3Qgb2N0b2tpdCA9IGdldE9jdG9raXQob3duZXIpO1xuXG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdkMTogeC1lYXN5IDpoZWRnZWhvZzonLCAnRURFOUZFJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAnZDI6IGVhc3kgOnJhYmJpdDI6JywgJ0RERDZGRScpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ2QzOiBtZWRpdW0gOm94OicsICdDNEI1RkQnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdkNDogaGFyZCA6c3F1aWQ6JywgJ0E3OEJGQScpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ2Q1OiB4LWhhcmQgOndoYWxlMjonLCAnOEI1Q0Y2Jyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAncDE6IGNyaXRpY2FsIDpmaXJlOjpmaXJlOjpmaXJlOicsICdFRjQ0NDQnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdwMjogdXJnZW50IDpmaXJlOjpmaXJlOicsICdGODcxNzEnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdwMzogaW1wb3J0YW50IDpmaXJlOicsICdGQ0E1QTUnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdwNDogbmljZSB0byBoYXZlIDpkcm9wbGV0OicsICdGRUNBQ0EnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdyOiBibGl0eicsICc1MzAwYmMnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdyOiBmaXJlYmFzZScsICdmZmNhMjgnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdyOiBwcmlzbWEnLCAnMGMzNDRiJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAncjogcmVhY3QnLCAnNjFkYWZiJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAncjogc2VtYW50aWMtcmVsZWFzZScsICc0OTQ5NDknKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdyZWFkeSA6cm9ja2V0OicsICcyMkM1NUUnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdyZXZpZXcgcmVxdWVzdGVkIDptYWc6JywgJ0ZCQ0EwNCcpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ3JlbGVhc2VkIDpib29rbWFyazonLCAnNjM2NkYxJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAnczogMC41aCA6Y2xvY2sxMjMwOicsICdGM0Y0RjYnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdzOiAxaCA6Y2xvY2sxOicsICdFNUU3RUInKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdzOiAyaCA6Y2xvY2syOicsICdEMUQ1REInKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdzOiAzaCA6Y2xvY2szOicsICc5Q0EzQUYnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdzOiA1aCA6Y2xvY2s1OicsICc2QjcyODAnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdzOiA4aCA6Y2xvY2s4OicsICc0QjU1NjMnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdzOiAxM2ggOmNsb2NrMTonLCAnMzc0MTUxJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAndDogYnVpbGQgOmhhbW1lcjonLCAnQkZEQkZFJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAndDogY2hvcmUgOmJyb29tOicsICdCRkRCRkUnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICd0OiBjaSA6Y29uc3RydWN0aW9uX3dvcmtlcjonLCAnQkZEQkZFJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAndDogZG9jcyA6bWVtbzonLCAnQkZEQkZFJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAndDogZmVhdCA6c3BhcmtsZXM6JywgJ0JGREJGRScpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ3Q6IGZpeCA6YnVnOicsICdCRkRCRkUnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICd0OiBwZXJmIDp6YXA6JywgJ0JGREJGRScpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ3Q6IHJlZmFjdG9yIDpyZWN5Y2xlOicsICdCRkRCRkUnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICd0OiBzdHlsZSA6bGlwc3RpY2s6JywgJ0JGREJGRScpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ3Q6IHRlc3QgOnRlc3RfdHViZTonLCAnQkZEQkZFJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAncHJvamVjdCcsICcyNDI5MkYnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdmb2N1c2VkIDpkYXJ0OicsICcyMkM1NUUnKTtcblxuICAgICAgYXdhaXQgZGVsZXRlTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdidWcnKTtcbiAgICAgIGF3YWl0IGRlbGV0ZUxhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAnZG9jdW1lbnRhdGlvbicpO1xuICAgICAgYXdhaXQgZGVsZXRlTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdkdXBsaWNhdGUnKTtcbiAgICAgIGF3YWl0IGRlbGV0ZUxhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAnZW5oYW5jZW1lbnQnKTtcbiAgICAgIGF3YWl0IGRlbGV0ZUxhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAnZ29vZCBmaXJzdCBpc3N1ZScpO1xuICAgICAgYXdhaXQgZGVsZXRlTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdoZWxwIHdhbnRlZCcpO1xuICAgICAgYXdhaXQgZGVsZXRlTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdpbnZhbGlkJyk7XG4gICAgICBhd2FpdCBkZWxldGVMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ3F1ZXN0aW9uJyk7XG4gICAgICBhd2FpdCBkZWxldGVMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ3dvbnRmaXgnKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgY29uc29sZS53YXJuKCdTa2lwIHNldHVwTGFiZWxzIGR1ZSB0bzonLCAoZXJyb3IgYXMgRXJyb3IgfCB1bmRlZmluZWQpPy5zdGFjayA/PyBlcnJvcik7XG4gICAgfVxuICB9KTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gc2V0dXBMYWJlbChvY3Rva2l0OiBPY3Rva2l0LCBvd25lcjogc3RyaW5nLCByZXBvOiBzdHJpbmcsIG5hbWU6IHN0cmluZywgY29sb3I6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICB0cnkge1xuICAgIGF3YWl0IG9jdG9raXQucmVxdWVzdCgnUE9TVCAvcmVwb3Mve293bmVyfS97cmVwb30vbGFiZWxzJywge1xuICAgICAgb3duZXIsXG4gICAgICByZXBvLFxuICAgICAgbmFtZSxcbiAgICAgIGNvbG9yLFxuICAgIH0pO1xuICB9IGNhdGNoIHtcbiAgICBhd2FpdCBvY3Rva2l0LnJlcXVlc3QoJ1BBVENIIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9sYWJlbHMve25hbWV9Jywge1xuICAgICAgb3duZXIsXG4gICAgICByZXBvLFxuICAgICAgbmFtZSxcbiAgICAgIGNvbG9yLFxuICAgIH0pO1xuICB9XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGRlbGV0ZUxhYmVsKG9jdG9raXQ6IE9jdG9raXQsIG93bmVyOiBzdHJpbmcsIHJlcG86IHN0cmluZywgbmFtZTogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gIHRyeSB7XG4gICAgYXdhaXQgb2N0b2tpdC5yZXF1ZXN0KCdERUxFVEUgL3JlcG9zL3tvd25lcn0ve3JlcG99L2xhYmVscy97bmFtZX0nLCB7XG4gICAgICBvd25lcixcbiAgICAgIHJlcG8sXG4gICAgICBuYW1lLFxuICAgIH0pO1xuICB9IGNhdGNoIHtcbiAgICAvLyBkbyBub3RoaW5nXG4gIH1cbn1cbiIsImltcG9ydCB0eXBlIHsgT2N0b2tpdCB9IGZyb20gJ0BvY3Rva2l0L2NvcmUnO1xuaW1wb3J0IHsgd2l0aFJldHJ5IH0gZnJvbSAnQHdpbGxib29zdGVyL3NoYXJlZC1saWIvc3JjJztcblxuaW1wb3J0IHsgaXNSZXVzYWJsZVdvcmtmbG93c1JlcG8gfSBmcm9tICcuLi9nZW5lcmF0b3JzL3dvcmtmbG93LmpzJztcbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGdldE9jdG9raXQsIGhhc0dpdEh1YlRva2VuLCBpc0dpdEh1YlBlcm1pc3Npb25PclZpc2liaWxpdHlFcnJvciB9IGZyb20gJy4uL3V0aWxzL2dpdGh1YlV0aWwuanMnO1xuXG5pbnRlcmZhY2UgUmVwb3NpdG9yeVJ1bGVzZXRQYXlsb2FkIHtcbiAgbmFtZTogc3RyaW5nO1xuICB0YXJnZXQ6ICdicmFuY2gnO1xuICBlbmZvcmNlbWVudDogJ2FjdGl2ZSc7XG4gIGNvbmRpdGlvbnM6IHtcbiAgICByZWZfbmFtZToge1xuICAgICAgaW5jbHVkZTogc3RyaW5nW107XG4gICAgICBleGNsdWRlOiBzdHJpbmdbXTtcbiAgICB9O1xuICB9O1xuICBydWxlczogKFxuICAgIHwge1xuICAgICAgICB0eXBlOiAnZGVsZXRpb24nIHwgJ25vbl9mYXN0X2ZvcndhcmQnO1xuICAgICAgfVxuICAgIHwge1xuICAgICAgICB0eXBlOiAncmVxdWlyZWRfc3RhdHVzX2NoZWNrcyc7XG4gICAgICAgIHBhcmFtZXRlcnM6IHtcbiAgICAgICAgICBzdHJpY3RfcmVxdWlyZWRfc3RhdHVzX2NoZWNrc19wb2xpY3k6IGJvb2xlYW47XG4gICAgICAgICAgZG9fbm90X2VuZm9yY2Vfb25fY3JlYXRlOiBib29sZWFuO1xuICAgICAgICAgIHJlcXVpcmVkX3N0YXR1c19jaGVja3M6IHtcbiAgICAgICAgICAgIGNvbnRleHQ6IHN0cmluZztcbiAgICAgICAgICAgIGludGVncmF0aW9uX2lkOiBudW1iZXI7XG4gICAgICAgICAgfVtdO1xuICAgICAgICB9O1xuICAgICAgfVxuICAgIHwge1xuICAgICAgICB0eXBlOiAncHVsbF9yZXF1ZXN0JztcbiAgICAgICAgcGFyYW1ldGVyczoge1xuICAgICAgICAgIHJlcXVpcmVkX2FwcHJvdmluZ19yZXZpZXdfY291bnQ6IG51bWJlcjtcbiAgICAgICAgICBkaXNtaXNzX3N0YWxlX3Jldmlld3Nfb25fcHVzaDogYm9vbGVhbjtcbiAgICAgICAgICByZXF1aXJlZF9yZXZpZXdlcnM6IFtdO1xuICAgICAgICAgIHJlcXVpcmVfY29kZV9vd25lcl9yZXZpZXc6IGJvb2xlYW47XG4gICAgICAgICAgcmVxdWlyZV9sYXN0X3B1c2hfYXBwcm92YWw6IGJvb2xlYW47XG4gICAgICAgICAgcmVxdWlyZWRfcmV2aWV3X3RocmVhZF9yZXNvbHV0aW9uOiBib29sZWFuO1xuICAgICAgICAgIGFsbG93ZWRfbWVyZ2VfbWV0aG9kczogWydzcXVhc2gnXTtcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgKVtdO1xuICBieXBhc3NfYWN0b3JzOiB7XG4gICAgYWN0b3JfaWQ6IG51bWJlcjtcbiAgICBhY3Rvcl90eXBlOiAnVGVhbSc7XG4gICAgYnlwYXNzX21vZGU6ICdwdWxsX3JlcXVlc3QnO1xuICB9W107XG59XG5cbmludGVyZmFjZSBSZXBvc2l0b3J5UnVsZXNldFN1bW1hcnkge1xuICBpZD86IG51bWJlcjtcbiAgbmFtZT86IHN0cmluZztcbiAgc291cmNlX3R5cGU/OiBzdHJpbmc7XG59XG5cbmNvbnN0IEdJVEhVQl9BUElfVkVSU0lPTl9IRUFERVIgPSB7XG4gICdYLUdpdEh1Yi1BcGktVmVyc2lvbic6ICcyMDIyLTExLTI4Jyxcbn0gYXMgY29uc3Q7XG5cbmNvbnN0IEdJVEhVQl9BQ1RJT05TX0lOVEVHUkFUSU9OX0lEID0gMTVfMzY4O1xuXG5jb25zdCBQUk9URUNUX01BSU5fUlVMRVNFVDogUmVwb3NpdG9yeVJ1bGVzZXRQYXlsb2FkID0ge1xuICBuYW1lOiAnUHJvdGVjdCBtYWluJyxcbiAgdGFyZ2V0OiAnYnJhbmNoJyxcbiAgZW5mb3JjZW1lbnQ6ICdhY3RpdmUnLFxuICBjb25kaXRpb25zOiB7XG4gICAgcmVmX25hbWU6IHtcbiAgICAgIGV4Y2x1ZGU6IFtdLFxuICAgICAgaW5jbHVkZTogWyd+REVGQVVMVF9CUkFOQ0gnXSxcbiAgICB9LFxuICB9LFxuICBydWxlczogW1xuICAgIHtcbiAgICAgIHR5cGU6ICdkZWxldGlvbicsXG4gICAgfSxcbiAgICB7XG4gICAgICB0eXBlOiAncmVxdWlyZWRfc3RhdHVzX2NoZWNrcycsXG4gICAgICBwYXJhbWV0ZXJzOiB7XG4gICAgICAgIHN0cmljdF9yZXF1aXJlZF9zdGF0dXNfY2hlY2tzX3BvbGljeTogZmFsc2UsXG4gICAgICAgIGRvX25vdF9lbmZvcmNlX29uX2NyZWF0ZTogdHJ1ZSxcbiAgICAgICAgcmVxdWlyZWRfc3RhdHVzX2NoZWNrczogW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIGNvbnRleHQ6ICd0ZXN0IC8gdGVzdCcsXG4gICAgICAgICAgICBpbnRlZ3JhdGlvbl9pZDogR0lUSFVCX0FDVElPTlNfSU5URUdSQVRJT05fSUQsXG4gICAgICAgICAgfSxcbiAgICAgICAgICB7XG4gICAgICAgICAgICBjb250ZXh0OiAnc2VtYW50aWMtcHIgLyBzZW1hbnRpYy1wcicsXG4gICAgICAgICAgICBpbnRlZ3JhdGlvbl9pZDogR0lUSFVCX0FDVElPTlNfSU5URUdSQVRJT05fSUQsXG4gICAgICAgICAgfSxcbiAgICAgICAgXSxcbiAgICAgIH0sXG4gICAgfSxcbiAgICB7XG4gICAgICB0eXBlOiAnbm9uX2Zhc3RfZm9yd2FyZCcsXG4gICAgfSxcbiAgICB7XG4gICAgICB0eXBlOiAncHVsbF9yZXF1ZXN0JyxcbiAgICAgIHBhcmFtZXRlcnM6IHtcbiAgICAgICAgcmVxdWlyZWRfYXBwcm92aW5nX3Jldmlld19jb3VudDogMCxcbiAgICAgICAgZGlzbWlzc19zdGFsZV9yZXZpZXdzX29uX3B1c2g6IGZhbHNlLFxuICAgICAgICByZXF1aXJlZF9yZXZpZXdlcnM6IFtdLFxuICAgICAgICByZXF1aXJlX2NvZGVfb3duZXJfcmV2aWV3OiBmYWxzZSxcbiAgICAgICAgcmVxdWlyZV9sYXN0X3B1c2hfYXBwcm92YWw6IGZhbHNlLFxuICAgICAgICByZXF1aXJlZF9yZXZpZXdfdGhyZWFkX3Jlc29sdXRpb246IGZhbHNlLFxuICAgICAgICBhbGxvd2VkX21lcmdlX21ldGhvZHM6IFsnc3F1YXNoJ10sXG4gICAgICB9LFxuICAgIH0sXG4gIF0sXG4gIGJ5cGFzc19hY3RvcnM6IFtcbiAgICB7XG4gICAgICBhY3Rvcl9pZDogMTdfNzc3XzQ5NSxcbiAgICAgIGFjdG9yX3R5cGU6ICdUZWFtJyxcbiAgICAgIGJ5cGFzc19tb2RlOiAncHVsbF9yZXF1ZXN0JyxcbiAgICB9LFxuICBdLFxufTtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHNldHVwUmVwb3NpdG9yeVJ1bGVzZXRzKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ3NldHVwUmVwb3NpdG9yeVJ1bGVzZXRzJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IHsgcmVwb0F1dGhvcjogb3duZXIsIHJlcG9OYW1lOiByZXBvIH0gPSBjb25maWc7XG4gICAgaWYgKCFvd25lciB8fCAhcmVwbykgcmV0dXJuO1xuICAgIGlmIChvd25lciAhPT0gJ1dpbGxCb29zdGVyJykgcmV0dXJuO1xuICAgIC8vIFRoZSByZXVzYWJsZS13b3JrZmxvd3MgcmVwbyBob3N0cyB3b3JrZmxvd19jYWxsIGRlZmluaXRpb25zLCBzbyB0aGVcbiAgICAvLyBQcm90ZWN0IG1haW4gcnVsZXNldCB3b3VsZCByZXF1aXJlIHRlc3Qvc2VtYW50aWMtcHIgY2hlY2tzIHRoYXQgbmV2ZXIgcnVuIHRoZXJlLlxuICAgIGlmIChpc1JldXNhYmxlV29ya2Zsb3dzUmVwbyhjb25maWcucmVwb3NpdG9yeSkpIHJldHVybjtcbiAgICBpZiAoIWhhc0dpdEh1YlRva2VuKG93bmVyKSkgcmV0dXJuO1xuXG4gICAgY29uc3Qgb2N0b2tpdCA9IGdldE9jdG9raXQob3duZXIpO1xuXG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IHVwc2VydFByb3RlY3RNYWluUnVsZXNldChvY3Rva2l0LCBvd25lciwgcmVwbywgYnVpbGRQcm90ZWN0TWFpblJ1bGVzZXQoY29uZmlnKSk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGlmICghaXNHaXRIdWJQZXJtaXNzaW9uT3JWaXNpYmlsaXR5RXJyb3IoZXJyb3IpKSB0aHJvdyBlcnJvcjtcblxuICAgICAgLy8gUmVwb3NpdG9yeSBydWxlc2V0cyByZXF1aXJlIGFkbWluaXN0cmF0aW9uIHBlcm1pc3Npb24sIHdoaWNoIGxvY2FsIHJ1bnNcbiAgICAgIC8vIG1heSBub3QgaGF2ZSBldmVuIHdoZW4gZmlsZS1nZW5lcmF0aW9uIGFuZCBwdXNoZXMgYXJlIGFsbG93ZWQuXG4gICAgICBjb25zb2xlLndhcm4oJ1NraXAgc2V0dXBSZXBvc2l0b3J5UnVsZXNldHMgZHVlIHRvOicsIChlcnJvciBhcyBFcnJvciB8IHVuZGVmaW5lZCk/LnN0YWNrID8/IGVycm9yKTtcbiAgICB9XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBidWlsZFByb3RlY3RNYWluUnVsZXNldChjb25maWc6IFBhY2thZ2VDb25maWcpOiBSZXBvc2l0b3J5UnVsZXNldFBheWxvYWQge1xuICBjb25zdCBydWxlc2V0ID0gc3RydWN0dXJlZENsb25lKFBST1RFQ1RfTUFJTl9SVUxFU0VUKTtcbiAgaWYgKGNvbmZpZy5jYXJnb1RvbWxEaXJQYXRocy5sZW5ndGggPiAwKSB7XG4gICAgZm9yIChjb25zdCBydWxlIG9mIHJ1bGVzZXQucnVsZXMpIHtcbiAgICAgIGlmIChydWxlLnR5cGUgIT09ICdyZXF1aXJlZF9zdGF0dXNfY2hlY2tzJykgY29udGludWU7XG4gICAgICAvLyBUaGUgY29udGV4dCBpcyBgPGNhbGxlciBqb2IgaWQ+IC8gPHJldXNhYmxlIGpvYiBpZD5gIG9mIHRoZSB3YmZ5LWdlbmVyYXRlZCB0ZXN0LXJ1c3QueW1sLlxuICAgICAgcnVsZS5wYXJhbWV0ZXJzLnJlcXVpcmVkX3N0YXR1c19jaGVja3MucHVzaCh7XG4gICAgICAgIGNvbnRleHQ6ICd0ZXN0LXJ1c3QgLyB0ZXN0LXJ1c3QnLFxuICAgICAgICBpbnRlZ3JhdGlvbl9pZDogR0lUSFVCX0FDVElPTlNfSU5URUdSQVRJT05fSUQsXG4gICAgICB9KTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHJ1bGVzZXQ7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHVwc2VydFByb3RlY3RNYWluUnVsZXNldChcbiAgb2N0b2tpdDogT2N0b2tpdCxcbiAgb3duZXI6IHN0cmluZyxcbiAgcmVwbzogc3RyaW5nLFxuICBydWxlc2V0OiBSZXBvc2l0b3J5UnVsZXNldFBheWxvYWRcbik6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBleGlzdGluZ1J1bGVzZXQgPSBhd2FpdCBmaW5kUmVwb3NpdG9yeVJ1bGVzZXQob2N0b2tpdCwgb3duZXIsIHJlcG8sIHJ1bGVzZXQubmFtZSk7XG4gIGNvbnN0IGV4aXN0aW5nUnVsZXNldElkID0gZXhpc3RpbmdSdWxlc2V0Py5pZDtcblxuICBhd2FpdCB3aXRoUmV0cnkoXG4gICAgYXN5bmMgKCkgPT4ge1xuICAgICAgaWYgKGV4aXN0aW5nUnVsZXNldElkKSB7XG4gICAgICAgIGF3YWl0IG9jdG9raXQucmVxdWVzdCgnUFVUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9ydWxlc2V0cy97cnVsZXNldF9pZH0nLCB7XG4gICAgICAgICAgb3duZXIsXG4gICAgICAgICAgcmVwbyxcbiAgICAgICAgICBydWxlc2V0X2lkOiBleGlzdGluZ1J1bGVzZXRJZCxcbiAgICAgICAgICAuLi5ydWxlc2V0LFxuICAgICAgICAgIGhlYWRlcnM6IEdJVEhVQl9BUElfVkVSU0lPTl9IRUFERVIsXG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGF3YWl0IG9jdG9raXQucmVxdWVzdCgnUE9TVCAvcmVwb3Mve293bmVyfS97cmVwb30vcnVsZXNldHMnLCB7XG4gICAgICAgIG93bmVyLFxuICAgICAgICByZXBvLFxuICAgICAgICAuLi5ydWxlc2V0LFxuICAgICAgICBoZWFkZXJzOiBHSVRIVUJfQVBJX1ZFUlNJT05fSEVBREVSLFxuICAgICAgfSk7XG4gICAgfSxcbiAgICB7XG4gICAgICBzaG91bGRSZXRyeTogKGVycm9yKSA9PiAhaXNHaXRIdWJQZXJtaXNzaW9uT3JWaXNpYmlsaXR5RXJyb3IoZXJyb3IpLFxuICAgIH1cbiAgKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gZmluZFJlcG9zaXRvcnlSdWxlc2V0KFxuICBvY3Rva2l0OiBPY3Rva2l0LFxuICBvd25lcjogc3RyaW5nLFxuICByZXBvOiBzdHJpbmcsXG4gIHJ1bGVzZXROYW1lOiBzdHJpbmdcbik6IFByb21pc2U8UmVwb3NpdG9yeVJ1bGVzZXRTdW1tYXJ5IHwgdW5kZWZpbmVkPiB7XG4gIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgd2l0aFJldHJ5KFxuICAgICgpID0+XG4gICAgICBvY3Rva2l0LnJlcXVlc3QoJ0dFVCAvcmVwb3Mve293bmVyfS97cmVwb30vcnVsZXNldHMnLCB7XG4gICAgICAgIG93bmVyLFxuICAgICAgICByZXBvLFxuICAgICAgICBpbmNsdWRlc19wYXJlbnRzOiBmYWxzZSxcbiAgICAgICAgdGFyZ2V0czogJ2JyYW5jaCcsXG4gICAgICAgIGhlYWRlcnM6IEdJVEhVQl9BUElfVkVSU0lPTl9IRUFERVIsXG4gICAgICB9KSxcbiAgICB7XG4gICAgICBzaG91bGRSZXRyeTogKGVycm9yKSA9PiAhaXNHaXRIdWJQZXJtaXNzaW9uT3JWaXNpYmlsaXR5RXJyb3IoZXJyb3IpLFxuICAgIH1cbiAgKTtcbiAgY29uc3QgcnVsZXNldHMgPSByZXNwb25zZS5kYXRhO1xuICBpZiAoIUFycmF5LmlzQXJyYXkocnVsZXNldHMpKSByZXR1cm47XG4gIHJldHVybiBydWxlc2V0cy5maW5kKChydWxlc2V0KSA9PiBydWxlc2V0Lm5hbWUgPT09IHJ1bGVzZXROYW1lICYmIHJ1bGVzZXQuc291cmNlX3R5cGUgPT09ICdSZXBvc2l0b3J5Jyk7XG59XG4iLCJpbXBvcnQgeyB3aXRoUmV0cnkgfSBmcm9tICdAd2lsbGJvb3N0ZXIvc2hhcmVkLWxpYi9zcmMnO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBnZXRPY3Rva2l0LCBoYXNHaXRIdWJUb2tlbiwgaXNHaXRIdWJQZXJtaXNzaW9uT3JWaXNpYmlsaXR5RXJyb3IgfSBmcm9tICcuLi91dGlscy9naXRodWJVdGlsLmpzJztcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHNldHVwR2l0SHViU2V0dGluZ3MoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignc2V0dXBHaXRIdWJTZXR0aW5ncycsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCB7IHJlcG9BdXRob3I6IG93bmVyLCByZXBvTmFtZTogcmVwbyB9ID0gY29uZmlnO1xuICAgIGlmICghb3duZXIgfHwgIXJlcG8pIHJldHVybjtcbiAgICBpZiAob3duZXIgIT09ICdXaWxsQm9vc3RlcicgJiYgb3duZXIgIT09ICdXaWxsQm9vc3RlckxhYicpIHJldHVybjtcbiAgICBpZiAoIWhhc0dpdEh1YlRva2VuKG93bmVyKSkgcmV0dXJuO1xuXG4gICAgY29uc3Qgb2N0b2tpdCA9IGdldE9jdG9raXQob3duZXIpO1xuXG4gICAgdHJ5IHtcbiAgICAgIC8vIFJlcG9zaXRvcnkgc2V0dGluZ3MgbmVlZCBhZG1pbmlzdHJhdGlvbiBwZXJtaXNzaW9uLCB1bmxpa2UgZmlsZSBnZW5lcmF0aW9uLlxuICAgICAgYXdhaXQgd2l0aFJldHJ5KFxuICAgICAgICAoKSA9PlxuICAgICAgICAgIG9jdG9raXQucmVxdWVzdCgnUEFUQ0ggL3JlcG9zL3tvd25lcn0ve3JlcG99Jywge1xuICAgICAgICAgICAgb3duZXIsXG4gICAgICAgICAgICByZXBvLFxuICAgICAgICAgICAgYWxsb3dfYXV0b19tZXJnZTogdHJ1ZSxcbiAgICAgICAgICAgIGFsbG93X21lcmdlX2NvbW1pdDogZmFsc2UsXG4gICAgICAgICAgICBhbGxvd19zcXVhc2hfbWVyZ2U6IHRydWUsXG4gICAgICAgICAgICBhbGxvd19yZWJhc2VfbWVyZ2U6IGZhbHNlLFxuICAgICAgICAgICAgYWxsb3dfdXBkYXRlX2JyYW5jaDogdHJ1ZSxcbiAgICAgICAgICAgIGRlbGV0ZV9icmFuY2hfb25fbWVyZ2U6IHRydWUsXG4gICAgICAgICAgICBzcXVhc2hfbWVyZ2VfY29tbWl0X3RpdGxlOiAnUFJfVElUTEUnLFxuICAgICAgICAgICAgc3F1YXNoX21lcmdlX2NvbW1pdF9tZXNzYWdlOiAnQkxBTksnLFxuICAgICAgICAgICAgaGVhZGVyczoge1xuICAgICAgICAgICAgICAnWC1HaXRIdWItQXBpLVZlcnNpb24nOiAnMjAyMi0xMS0yOCcsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgLi4uKGNvbmZpZy5yZXBvc2l0b3J5Py5zdGFydHNXaXRoKCdnaXRodWI6V2lsbEJvb3N0ZXIvJykgPyB7IGFsbG93X2F1dG9fbWVyZ2U6IHRydWUgfSA6IHt9KSxcbiAgICAgICAgICB9KSxcbiAgICAgICAge1xuICAgICAgICAgIHNob3VsZFJldHJ5OiAoZXJyb3IpID0+ICFpc0dpdEh1YlBlcm1pc3Npb25PclZpc2liaWxpdHlFcnJvcihlcnJvciksXG4gICAgICAgIH1cbiAgICAgICk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGlmICghaXNHaXRIdWJQZXJtaXNzaW9uT3JWaXNpYmlsaXR5RXJyb3IoZXJyb3IpKSB0aHJvdyBlcnJvcjtcblxuICAgICAgLy8gTG9jYWwgd2JmeSBydW5zIG9mdGVuIGhhdmUgcHVzaCBwZXJtaXNzaW9uIHdpdGhvdXQgYWRtaW4gcGVybWlzc2lvbi5cbiAgICAgIGNvbnNvbGUud2FybignU2tpcCBzZXR1cEdpdEh1YlNldHRpbmdzIGR1ZSB0bzonLCAoZXJyb3IgYXMgRXJyb3IgfCB1bmRlZmluZWQpPy5zdGFjayA/PyBlcnJvcik7XG4gICAgfVxuICB9KTtcbn1cbiIsImltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbi8vIFRoZSBgL3NyY2AgZW50cnkgKGEgZGVjbGFyZWQgZXhwb3J0KSBsZXRzIHRoaXMgd29ya3NwYWNlIGNvbnN1bWVyIHVzZSB0aGUgc291cmNlcyB3aXRob3V0XG4vLyBidWlsZGluZyBzaGFyZWQtbGliIGZpcnN0LCBhcyBldmVyeSBvdGhlciBpbXBvcnQgb2YgaXQgaW4gdGhpcyBwYWNrYWdlIGRvZXMuXG5pbXBvcnQge1xuICBCVUdfSVNTVUVfU0VDVElPTlMsXG4gIENIQU5HRV9JU1NVRV9TRUNUSU9OUyxcbiAgUFVMTF9SRVFVRVNUX1NFQ1RJT05TLFxuICByZW5kZXJTZWN0aW9uVGVtcGxhdGUsXG59IGZyb20gJ0B3aWxsYm9vc3Rlci9zaGFyZWQtbGliL3NyYyc7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGZzVXRpbCB9IGZyb20gJy4uL3V0aWxzL2ZzVXRpbC5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcblxuY29uc3QgdGVtcGxhdGVzID0ge1xuICAncHVsbF9yZXF1ZXN0X3RlbXBsYXRlLm1kJzogYFxuQ2xvc2UgIzxJc3N1ZU51bWJlcj5cblxuPCEtLSBXcml0ZSBmb3IgYSByZXZpZXdlciB3aG8gaGFzIG5vdCBmb2xsb3dlZCB0aGUgd29yay4gU2NhbGUgZWFjaCBzZWN0aW9uIHRvIHRoZSBjaGFuZ2U6IGEgc2VudGVuY2UgZm9yIGEgc21hbGwgY2hhbmdlLCBudW1iZXJlZCBzdWJzZWN0aW9ucyBmb3IgYSBsYXJnZSBvbmUuIERlbGV0ZSB0aGlzIGNvbW1lbnQgYW5kIHRoZSBwbGFjZWhvbGRlciBjb21tZW50cyBiZWxvdy4gLS0+XG5cbiR7cmVuZGVyU2VjdGlvblRlbXBsYXRlKFBVTExfUkVRVUVTVF9TRUNUSU9OUyl9XG5gLnRyaW0oKSxcbiAgJ0lTU1VFX1RFTVBMQVRFL2J1Zy5tZCc6IGBcbi0tLVxubmFtZTogQnVnIC8gUHJvYmxlbVxuYWJvdXQ6IFNvbWV0aGluZyBiZWhhdmVzIHdyb25nbHlcbnRpdGxlOiAnZml4OiAnXG5sYWJlbHM6ICd0OiBmaXggOmJ1ZzonXG4tLS1cblxuPCEtLSBLZWVwIFByb2JsZW0gYW5kIFByb3Bvc2FsOyBkZWxldGUgRXZpZGVuY2Ugb3IgSW1wYWN0IHdoZW4gdGhleSBhZGQgbm90aGluZy4gRGVsZXRlIHRoZXNlIGNvbW1lbnRzLiAtLT5cblxuJHtyZW5kZXJTZWN0aW9uVGVtcGxhdGUoQlVHX0lTU1VFX1NFQ1RJT05TKX1cbmAudHJpbSgpLFxuICAnSVNTVUVfVEVNUExBVEUvY2hhbmdlLm1kJzogYFxuLS0tXG5uYW1lOiBDaGFuZ2UgLyBGZWF0dXJlXG5hYm91dDogUHJvcG9zZSBhIGNoYW5nZSB0aGF0IGEgdGhpcmQgcGFydHkgY291bGQgaW1wbGVtZW50IHdpdGhvdXQgYXNraW5nIGEgcXVlc3Rpb25cbnRpdGxlOiAnZmVhdDogJ1xubGFiZWxzOiAndDogZmVhdCA6c3BhcmtsZXM6J1xuLS0tXG5cbjwhLS0gS2VlcCB0aGUgZmlyc3QgdGhyZWUgc2VjdGlvbnMgZm9yIGFueSBjaGFuZ2UgYW5kIGFkZCB0aGUgb3RoZXJzIGFzIHRoZSBjaGFuZ2UgZ3Jvd3M7IGEgbGFyZ2UgY2hhbmdlIGZpbGxzIGFsbCBvZiB0aGVtIChzcGVjLWJvb3N0ZXIgcmV2aWV3cyBhZ2FpbnN0IHRoaXMgbGlzdCkuIERlbGV0ZSB0aGVzZSBjb21tZW50cy4gLS0+XG5cbiR7cmVuZGVyU2VjdGlvblRlbXBsYXRlKENIQU5HRV9JU1NVRV9TRUNUSU9OUyl9XG5gLnRyaW0oKSxcbiAgJ0lTU1VFX1RFTVBMQVRFL2NvbmZpZy55bWwnOiAnYmxhbmtfaXNzdWVzX2VuYWJsZWQ6IHRydWUnLFxufTtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlR2l0SHViVGVtcGxhdGVzKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2dlbmVyYXRlR2l0SHViVGVtcGxhdGVzJywgYXN5bmMgKCkgPT4ge1xuICAgIC8vIFRlbXBsYXRlcyBhcmUgcmVwb3NpdG9yeS1sZXZlbCBmaWxlcywgc28gYSBkaXJlY3Qgd29ya3NwYWNlLWNoaWxkIGludm9jYXRpb24gbXVzdCBub3QgY3JlYXRlIHRoZW0uXG4gICAgaWYgKCFjb25maWcuaXNXaWxsQm9vc3RlclJlcG8gfHwgIWNvbmZpZy5pc1Jvb3QpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IFtmaWxlTmFtZSwgY29udGVudF0gb2YgT2JqZWN0LmVudHJpZXModGVtcGxhdGVzKSkge1xuICAgICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICcuZ2l0aHViJywgZmlsZU5hbWUpO1xuICAgICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzVXRpbC5nZW5lcmF0ZUZpbGUoZmlsZVBhdGgsIGNvbnRlbnQpKTtcbiAgICB9XG4gIH0pO1xufVxuIiwiaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5cbmNvbnN0IGRlcGVuZGVuY3lTZWN0aW9uS2V5cyA9IFsnZGVwZW5kZW5jaWVzJywgJ2RldkRlcGVuZGVuY2llcycsICdvcHRpb25hbERlcGVuZGVuY2llcycsICdwZWVyRGVwZW5kZW5jaWVzJ10gYXMgY29uc3Q7XG5jb25zdCBhbGxvd2VkR2l0SHViT3JnYW5pemF0aW9uUGF0dGVybiA9IFN0cmluZy5yYXdgKD86V2lsbEJvb3N0ZXJ8V2lsbEJvb3N0ZXJMYWIpYDtcbmNvbnN0IGFsbG93ZWRHaXREZXBlbmRlbmN5UGF0dGVybnMgPSBbXG4gIG5ldyBSZWdFeHAoYF4ke2FsbG93ZWRHaXRIdWJPcmdhbml6YXRpb25QYXR0ZXJufS9bXiNcXFxcc10rKD86I1xcXFxTKyk/JGAsICd1JyksXG4gIG5ldyBSZWdFeHAoYF5naXRodWI6JHthbGxvd2VkR2l0SHViT3JnYW5pemF0aW9uUGF0dGVybn0vW14jXFxcXHNdKyg/OiNcXFxcUyspPyRgLCAndScpLFxuICBuZXcgUmVnRXhwKFxuICAgIGBeKD86Z2l0XFxcXCspP2h0dHBzOi8vZ2l0aHViXFxcXC5jb20vJHthbGxvd2VkR2l0SHViT3JnYW5pemF0aW9uUGF0dGVybn0vW14jXFxcXHNdKyg/OlxcXFwuZ2l0KT8oPzojXFxcXFMrKT8kYCxcbiAgICAndSdcbiAgKSxcbiAgbmV3IFJlZ0V4cChcbiAgICBgXig/OmdpdFxcXFwrKT9zc2g6Ly9naXRAZ2l0aHViXFxcXC5jb21bOi9dJHthbGxvd2VkR2l0SHViT3JnYW5pemF0aW9uUGF0dGVybn0vW14jXFxcXHNdKyg/OlxcXFwuZ2l0KT8oPzojXFxcXFMrKT8kYCxcbiAgICAndSdcbiAgKSxcbiAgbmV3IFJlZ0V4cChgXig/OmdpdFxcXFwrKT9naXRAZ2l0aHViXFxcXC5jb206JHthbGxvd2VkR2l0SHViT3JnYW5pemF0aW9uUGF0dGVybn0vW14jXFxcXHNdKyg/OlxcXFwuZ2l0KT8oPzojXFxcXFMrKT8kYCwgJ3UnKSxcbl07XG5cbmludGVyZmFjZSBEaXNhbGxvd2VkRGVwZW5kZW5jeVNvdXJjZSB7XG4gIGRlcGVuZGVuY3lOYW1lOiBzdHJpbmc7XG4gIGRpclBhdGg6IHN0cmluZztcbiAgc2VjdGlvbk5hbWU6ICh0eXBlb2YgZGVwZW5kZW5jeVNlY3Rpb25LZXlzKVtudW1iZXJdO1xuICBzcGVjaWZpZXI6IHN0cmluZztcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGFzc2VydFNhZmVEZXBlbmRlbmN5U291cmNlcyhjb25maWdzOiBQYWNrYWdlQ29uZmlnW10pOiB2b2lkIHtcbiAgY29uc3QgZGlzYWxsb3dlZFNvdXJjZXMgPSBjb25maWdzLmZsYXRNYXAoZ2V0RGlzYWxsb3dlZERlcGVuZGVuY3lTb3VyY2VzKTtcbiAgaWYgKGRpc2FsbG93ZWRTb3VyY2VzLmxlbmd0aCA9PT0gMCkgcmV0dXJuO1xuXG4gIGNvbnN0IGRldGFpbHMgPSBkaXNhbGxvd2VkU291cmNlc1xuICAgIC5tYXAoXG4gICAgICAoeyBkZXBlbmRlbmN5TmFtZSwgZGlyUGF0aCwgc2VjdGlvbk5hbWUsIHNwZWNpZmllciB9KSA9PlxuICAgICAgICBgLSAke3BhdGguam9pbihkaXJQYXRoLCAncGFja2FnZS5qc29uJyl9OiAke3NlY3Rpb25OYW1lfS4ke2RlcGVuZGVuY3lOYW1lfSB1c2VzICR7c3BlY2lmaWVyfWBcbiAgICApXG4gICAgLmpvaW4oJ1xcbicpO1xuXG4gIHRocm93IG5ldyBFcnJvcihcbiAgICBgRGlzYWxsb3dlZCBHaXQgZGVwZW5kZW5jeSBzb3VyY2VzIGZvdW5kLlxcbk9ubHkgV2lsbEJvb3N0ZXIgYW5kIFdpbGxCb29zdGVyTGFiIEdpdEh1YiBkZXBlbmRlbmNpZXMgYXJlIGFsbG93ZWQuXFxuJHtkZXRhaWxzfWBcbiAgKTtcbn1cblxuZnVuY3Rpb24gZ2V0RGlzYWxsb3dlZERlcGVuZGVuY3lTb3VyY2VzKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IERpc2FsbG93ZWREZXBlbmRlbmN5U291cmNlW10ge1xuICBjb25zdCBwYWNrYWdlSnNvbiA9IGNvbmZpZy5wYWNrYWdlSnNvbjtcbiAgaWYgKCFwYWNrYWdlSnNvbikgcmV0dXJuIFtdO1xuXG4gIGNvbnN0IGRpc2FsbG93ZWRTb3VyY2VzOiBEaXNhbGxvd2VkRGVwZW5kZW5jeVNvdXJjZVtdID0gW107XG4gIGZvciAoY29uc3Qgc2VjdGlvbk5hbWUgb2YgZGVwZW5kZW5jeVNlY3Rpb25LZXlzKSB7XG4gICAgY29uc3Qgc2VjdGlvbiA9IHBhY2thZ2VKc29uW3NlY3Rpb25OYW1lXTtcbiAgICBpZiAoIXNlY3Rpb24pIGNvbnRpbnVlO1xuXG4gICAgZm9yIChjb25zdCBbZGVwZW5kZW5jeU5hbWUsIHNwZWNpZmllcl0gb2YgT2JqZWN0LmVudHJpZXMoc2VjdGlvbikpIHtcbiAgICAgIGlmICghc3BlY2lmaWVyKSBjb250aW51ZTtcbiAgICAgIGlmICghaXNHaXREZXBlbmRlbmN5U3BlY2lmaWVyKHNwZWNpZmllcikpIGNvbnRpbnVlO1xuICAgICAgaWYgKGlzQWxsb3dlZEdpdERlcGVuZGVuY3lTcGVjaWZpZXIoc3BlY2lmaWVyKSkgY29udGludWU7XG5cbiAgICAgIGRpc2FsbG93ZWRTb3VyY2VzLnB1c2goe1xuICAgICAgICBkZXBlbmRlbmN5TmFtZSxcbiAgICAgICAgZGlyUGF0aDogY29uZmlnLmRpclBhdGgsXG4gICAgICAgIHNlY3Rpb25OYW1lLFxuICAgICAgICBzcGVjaWZpZXIsXG4gICAgICB9KTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGRpc2FsbG93ZWRTb3VyY2VzO1xufVxuXG5mdW5jdGlvbiBpc0dpdERlcGVuZGVuY3lTcGVjaWZpZXIoc3BlY2lmaWVyOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgcmV0dXJuIChcbiAgICBpc0dpdEh1YlNob3J0aGFuZFNwZWNpZmllcihzcGVjaWZpZXIpIHx8XG4gICAgL14oPzpiaXRidWNrZXR8Z2lzdHxnaXRodWJ8Z2l0bGFiKTovdS50ZXN0KHNwZWNpZmllcikgfHxcbiAgICAvXmh0dHBzPzpcXC9cXC8oPzpiaXRidWNrZXRcXC5vcmd8Z2l0aHViXFwuY29tfGdpdGxhYlxcLmNvbSlcXC8vdS50ZXN0KHNwZWNpZmllcikgfHxcbiAgICAvXig/Omh0dHBzP3xzc2gpOlxcL1xcL1xcUytcXC5naXQoPzojXFxTKyk/JC91LnRlc3Qoc3BlY2lmaWVyKSB8fFxuICAgIC9eW15AXFxzXStAW146XFxzXSs6XFxTKyg/OiNcXFMrKT8kL3UudGVzdChzcGVjaWZpZXIpIHx8XG4gICAgc3BlY2lmaWVyLnN0YXJ0c1dpdGgoJ2dpdDonKSB8fFxuICAgIHNwZWNpZmllci5zdGFydHNXaXRoKCdnaXQrJykgfHxcbiAgICBzcGVjaWZpZXIuc3RhcnRzV2l0aCgnc3NoOi8vZ2l0QCcpXG4gICk7XG59XG5cbmZ1bmN0aW9uIGlzR2l0SHViU2hvcnRoYW5kU3BlY2lmaWVyKHNwZWNpZmllcjogc3RyaW5nKTogYm9vbGVhbiB7XG4gIHJldHVybiAvXlthLXpBLVowLTldW1xcdy4tXSpcXC9bXFx3Li1dKyg/OiNcXFMrKT8kL3UudGVzdChzcGVjaWZpZXIpO1xufVxuXG5mdW5jdGlvbiBpc0FsbG93ZWRHaXREZXBlbmRlbmN5U3BlY2lmaWVyKHNwZWNpZmllcjogc3RyaW5nKTogYm9vbGVhbiB7XG4gIHJldHVybiBhbGxvd2VkR2l0RGVwZW5kZW5jeVBhdHRlcm5zLnNvbWUoKHBhdHRlcm4pID0+IHBhdHRlcm4udGVzdChzcGVjaWZpZXIpKTtcbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB7IGlnbm9yZUVycm9yLCBpZ25vcmVFcnJvckFzeW5jIH0gZnJvbSAnQHdpbGxib29zdGVyL3NoYXJlZC1saWIvc3JjJztcbmltcG9ydCB7IG5vcm1hbGl6ZUJ1bkxvY2tmaWxlIH0gZnJvbSAnQHdpbGxib29zdGVyL3NoYXJlZC1saWItbm9kZS9zcmMnO1xuaW1wb3J0IHlhcmdzIGZyb20gJ3lhcmdzJztcblxuaW1wb3J0IHsgZml4TmV4dENvbmZpZ0pzb24gfSBmcm9tICcuL2ZpeGVycy9uZXh0Q29uZmlnLmpzJztcbmltcG9ydCB7IGZpeENoYWtyYVRvYXN0ZXIgfSBmcm9tICcuL2ZpeGVycy9jaGFrcmFUb2FzdGVyLmpzJztcbmltcG9ydCB7IGZpeFBsYXl3cmlnaHRDb25maWcgfSBmcm9tICcuL2ZpeGVycy9wbGF5d3JpZ2h0Q29uZmlnLmpzJztcbmltcG9ydCB7IGZpeFR5cG9zIH0gZnJvbSAnLi9maXhlcnMvdHlwb3MuanMnO1xuaW1wb3J0IHsgZ2VuZXJhdGVBZ2VudEluc3RydWN0aW9ucyB9IGZyb20gJy4vZ2VuZXJhdG9ycy9hZ2VudHMuanMnO1xuaW1wb3J0IHsgZ2VuZXJhdGVCdW5maWdUb21sLCByZWFkQnVuR2xvYmFsU3RvcmUsIHJlc29sdmVCdW5HbG9iYWxTdG9yZSB9IGZyb20gJy4vZ2VuZXJhdG9ycy9idW5maWcuanMnO1xuaW1wb3J0IHsgZ2VuZXJhdGVEb2NrZXJpZ25vcmUgfSBmcm9tICcuL2dlbmVyYXRvcnMvZG9ja2VyaWdub3JlLmpzJztcbmltcG9ydCB7IGdlbmVyYXRlRWRpdG9yY29uZmlnIH0gZnJvbSAnLi9nZW5lcmF0b3JzL2VkaXRvcmNvbmZpZy5qcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZUZub3hUb21sIH0gZnJvbSAnLi9nZW5lcmF0b3JzL2Zub3hUb21sLmpzJztcbmltcG9ydCB7IGdlbmVyYXRlR2VtaW5pQ29uZmlnIH0gZnJvbSAnLi9nZW5lcmF0b3JzL2dlbWluaUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZUdpdGF0dHJpYnV0ZXMsIHJlbm9ybWFsaXplVHJhY2tlZFRleHRGaWxlcyB9IGZyb20gJy4vZ2VuZXJhdG9ycy9naXRhdHRyaWJ1dGVzLmpzJztcbmltcG9ydCB7IGdlbmVyYXRlR2l0aWdub3JlIH0gZnJvbSAnLi9nZW5lcmF0b3JzL2dpdGlnbm9yZS5qcyc7XG5pbXBvcnQgeyBlbnN1cmVHbG9iYWxSZWxlYXNlQWdlR2F0ZXMgfSBmcm9tICcuL2dlbmVyYXRvcnMvZ2xvYmFsUmVsZWFzZUFnZUdhdGUuanMnO1xuaW1wb3J0IHsgZ2VuZXJhdGVJZGVhU2V0dGluZ3MgfSBmcm9tICcuL2dlbmVyYXRvcnMvaWRlYS5qcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZUxlZnRob29rIH0gZnJvbSAnLi9nZW5lcmF0b3JzL2xlZnRob29rLmpzJztcbmltcG9ydCB7IGdlbmVyYXRlUGFja2FnZUpzb24sIGdldFdvcmtzcGFjZVBhY2thZ2VEaXJzIH0gZnJvbSAnLi9nZW5lcmF0b3JzL3BhY2thZ2VKc29uLmpzJztcbmltcG9ydCB7IGdlbmVyYXRlT3hmbXRDb25maWcgfSBmcm9tICcuL2dlbmVyYXRvcnMvb3hmbXRDb25maWcuanMnO1xuaW1wb3J0IHsgZ2VuZXJhdGVPeGxpbnRDb25maWcgfSBmcm9tICcuL2dlbmVyYXRvcnMvb3hsaW50Q29uZmlnLmpzJztcbmltcG9ydCB7IGdlbmVyYXRlUHJldHRpZXJpZ25vcmUgfSBmcm9tICcuL2dlbmVyYXRvcnMvcHJldHRpZXJpZ25vcmUuanMnO1xuaW1wb3J0IHsgZ2VuZXJhdGVQeXJpZ2h0Q29uZmlnSnNvbiB9IGZyb20gJy4vZ2VuZXJhdG9ycy9weXJpZ2h0Q29uZmlnLmpzJztcbmltcG9ydCB7IGZpeFJhaWx3YXlpZ25vcmUgfSBmcm9tICcuL2dlbmVyYXRvcnMvcmFpbHdheWlnbm9yZS5qcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZVJlYWRtZSwgcmVhZEFwcGxpZWRXYmZ5VmVyc2lvbkxhYmVsIH0gZnJvbSAnLi9nZW5lcmF0b3JzL3JlYWRtZS5qcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZVJlbGVhc2VyYyB9IGZyb20gJy4vZ2VuZXJhdG9ycy9yZWxlYXNlcmMuanMnO1xuaW1wb3J0IHsgZ2VuZXJhdGVSZW5vdmF0ZUpzb25jIH0gZnJvbSAnLi9nZW5lcmF0b3JzL3Jlbm92YXRlSnNvbmMuanMnO1xuaW1wb3J0IHsgZ2VuZXJhdGVUc2NvbmZpZyB9IGZyb20gJy4vZ2VuZXJhdG9ycy90c2NvbmZpZy5qcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZVVzZXJBZ2VudENvbmZpZ3MgfSBmcm9tICcuL2dlbmVyYXRvcnMvdXNlckFnZW50Q29uZmlncy5qcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZVZzY29kZVNldHRpbmdzIH0gZnJvbSAnLi9nZW5lcmF0b3JzL3ZzY29kZVNldHRpbmdzLmpzJztcbmltcG9ydCB7IGVuc3VyZVdiRW52RGVmaW5pdGlvbnMgfSBmcm9tICcuL2dlbmVyYXRvcnMvd2JFbnYuanMnO1xuaW1wb3J0IHsgZ2VuZXJhdGVTZWxmQ29udGFpbmVkV29ya2Zsb3dzIH0gZnJvbSAnLi9nZW5lcmF0b3JzL3NlbGZDb250YWluZWRXb3JrZmxvdy5qcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZVdvcmtmbG93cywgaXNSZXVzYWJsZVdvcmtmbG93c1JlcG8gfSBmcm9tICcuL2dlbmVyYXRvcnMvd29ya2Zsb3cuanMnO1xuaW1wb3J0IHsgZ2VuZXJhdGVNaXNlVG9tbCwgaGFzU3VwcG9ydGVkQnVuUGluLCBtaW5pbXVtQnVuVmVyc2lvbiB9IGZyb20gJy4vZ2VuZXJhdG9ycy9taXNlVG9tbC5qcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZVJlcG9zaXRvcnlOcG1yYyB9IGZyb20gJy4vZ2VuZXJhdG9ycy9ucG1yYy5qcyc7XG5pbXBvcnQgeyBzZXR1cExhYmVscyB9IGZyb20gJy4vZ2l0aHViL2xhYmVsLmpzJztcbmltcG9ydCB7IHNldHVwUmVwb3NpdG9yeVJ1bGVzZXRzIH0gZnJvbSAnLi9naXRodWIvcnVsZXNldC5qcyc7XG5pbXBvcnQgeyBzZXR1cEdpdEh1YlNldHRpbmdzIH0gZnJvbSAnLi9naXRodWIvc2V0dGluZ3MuanMnO1xuaW1wb3J0IHsgZ2VuZXJhdGVHaXRIdWJUZW1wbGF0ZXMgfSBmcm9tICcuL2dpdGh1Yi90ZW1wbGF0ZS5qcyc7XG5pbXBvcnQgeyBvcHRpb25zIH0gZnJvbSAnLi9vcHRpb25zLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBnZXRQYWNrYWdlQ29uZmlnLCBnZXRXb3JrZXJUeXBlc1NjcmlwdEVycm9yIH0gZnJvbSAnLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGFzc2VydFNhZmVEZXBlbmRlbmN5U291cmNlcyB9IGZyb20gJy4vdXRpbHMvZGVwZW5kZW5jeVNvdXJjZVBvbGljeS5qcyc7XG5pbXBvcnQgeyBmc1V0aWwgfSBmcm9tICcuL3V0aWxzL2ZzVXRpbC5qcyc7XG5pbXBvcnQgeyBkb2VzQ29udGFpbkphdmEsIGRvZXNDb250YWluSnNPclRzIH0gZnJvbSAnLi91dGlscy9wYWNrYWdlQ2FwYWJpbGl0aWVzLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5pbXBvcnQgeyBzcGF3blN5bmMsIHNwYXduU3luY0FuZFJldHVyblN0YXR1cywgc3Bhd25TeW5jQW5kUmV0dXJuU3Rkb3V0IH0gZnJvbSAnLi91dGlscy9zcGF3blV0aWwuanMnO1xuaW1wb3J0IHsgZGlzcG9zZVR5cGVTY3JpcHRBcGkgfSBmcm9tICcuL3V0aWxzL3R5cGVzY3JpcHRBcGkuanMnO1xuaW1wb3J0IHsgZ2V0V2JmeVZlcnNpb24sIGdldFdiZnlWZXJzaW9uTGFiZWwgfSBmcm9tICcuL3V0aWxzL3ZlcnNpb24uanMnO1xuaW1wb3J0IHsgZ2V0V29ya3NwYWNlU3ViRGlyUGF0aHMgfSBmcm9tICcuL3V0aWxzL3dvcmtzcGFjZVV0aWwuanMnO1xuXG4vKipcbiAqIEFwcGxpZXMgb25seSB0aGUgZ2xvYmFsIHJlbGVhc2UtYWdlIGdhdGUsIHdpdGhvdXQgdG91Y2hpbmcgYW55IHJlcG9zaXRvcnkuIFNwZWxsZWQgb3V0IGluIGZ1bGxcbiAqIHJhdGhlciB0aGFuIHNob3J0ZW5lZCAoZS5nLiBgZ2F0ZWApIGJlY2F1c2UgdGhlIGRlZmF1bHQgY29tbWFuZCB0YWtlcyBwb3NpdGlvbmFsIHBhdGhzOiBhIHNob3J0XG4gKiBuYW1lIHdvdWxkIHN3YWxsb3cgYSBkaXJlY3RvcnkgdGhhdCBoYXBwZW5zIHRvIHNoYXJlIGl0LlxuICovXG5jb25zdCBhcHBseVJlbGVhc2VBZ2VHYXRlQ29tbWFuZCA9ICdhcHBseS1yZWxlYXNlLWFnZS1nYXRlJztcbi8qKiBTYW1lIG5hbWluZyByYXRpb25hbGUgYXMgYXBwbHlSZWxlYXNlQWdlR2F0ZUNvbW1hbmQuICovXG5jb25zdCBnZW5lcmF0ZVVzZXJBZ2VudENvbmZpZ3NDb21tYW5kID0gJ2dlbmVyYXRlLXVzZXItYWdlbnQtY29uZmlncyc7XG5cbmFzeW5jIGZ1bmN0aW9uIG1haW4oKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IGFyZ3YgPSBhd2FpdCB5YXJncyhwcm9jZXNzLmFyZ3Yuc2xpY2UoMikpXG4gICAgLmNvbW1hbmQoXG4gICAgICBhcHBseVJlbGVhc2VBZ2VHYXRlQ29tbWFuZCxcbiAgICAgIFwiQXBwbHkgb25seSB0aGUgb3JnYW5pemF0aW9uJ3MgbWluaW11bS1yZWxlYXNlLWFnZSBwb2xpY3kgdG8gdGhpcyBtYWNoaW5lJ3MgZ2xvYmFsIHBhY2thZ2UtbWFuYWdlciBjb25maWdzXCJcbiAgICApXG4gICAgLmNvbW1hbmQoXG4gICAgICBnZW5lcmF0ZVVzZXJBZ2VudENvbmZpZ3NDb21tYW5kLFxuICAgICAgXCJPdmVyd3JpdGUgdGhpcyB1c2VyJ3MgYWdlbnQgaW5zdHJ1Y3Rpb24gZmlsZXMgKH4vLmNvZGV4L0FHRU5UUy5tZCwgfi8uY2xhdWRlL0NMQVVERS5tZCwgfi8uZ2VtaW5pL0dFTUlOSS5tZCkgd2l0aCB0aGUgb3JnYW5pemF0aW9uJ3MgZml4ZWQgY29udGVudCBhbmQgbWVyZ2UgdGhlIG9yZ2FuaXphdGlvbidzIHNldHRpbmdzIGludG8gfi8uY2xhdWRlL3NldHRpbmdzLmpzb24gYW5kIH4vLmdlbWluaS9zZXR0aW5ncy5qc29uXCJcbiAgICApXG4gICAgLmNvbW1hbmQoJyQwIFtwYXRocy4uXScsICdNYWtlIGEgZ2l2ZW4gcHJvamVjdCBmb2xsb3cgdGhlIFdpbGxCb29zdGVyIHN0YW5kYXJkJywgKHlhcmdzKSA9PiB7XG4gICAgICB5YXJncy5wb3NpdGlvbmFsKCdwYXRocycsIHtcbiAgICAgICAgZGVzY3JpYmU6ICdwcm9qZWN0IHBhdGhzIHRvIGJlIHdiZmllZCcsXG4gICAgICAgIGFycmF5OiB0cnVlLFxuICAgICAgICB0eXBlOiAnc3RyaW5nJyxcbiAgICAgICAgZGVmYXVsdDogWycuJ10sXG4gICAgICB9KTtcbiAgICB9KVxuICAgIC5vcHRpb25zKHtcbiAgICAgIGZvcmNlOiB7XG4gICAgICAgIGRlc2NyaXB0aW9uOiAnQXBwbHkgd2JmeSBldmVuIHdoZW4gdGhlIHJlcG9zaXRvcnkgYWxyZWFkeSByZWNvcmRzIHRoaXMgd2JmeSB2ZXJzaW9uJyxcbiAgICAgICAgdHlwZTogJ2Jvb2xlYW4nLFxuICAgICAgICBkZWZhdWx0OiBmYWxzZSxcbiAgICAgICAgYWxpYXM6ICdmJyxcbiAgICAgIH0sXG4gICAgICBza2lwRGVwczoge1xuICAgICAgICBkZXNjcmlwdGlvbjpcbiAgICAgICAgICAnU2tpcCBhZGRpbmcgbWFuYWdlZCBkZXBlbmRlbmNpZXMgYW5kIHRoZSBsaW5rZXIgcHJvYmUgKHRoZSBmaW5hbCBgYnVuIGluc3RhbGxgIHJlZnJlc2hpbmcgdGhlIGxvY2tmaWxlIHN0aWxsIHJ1bnMpJyxcbiAgICAgICAgdHlwZTogJ2Jvb2xlYW4nLFxuICAgICAgICBkZWZhdWx0OiBmYWxzZSxcbiAgICAgICAgYWxpYXM6ICdkJyxcbiAgICAgIH0sXG4gICAgICB2ZXJib3NlOiB7XG4gICAgICAgIGRlc2NyaXB0aW9uOiAnV2hldGhlciBvciBub3QgdG8gZW5hYmxlIHZlcmJvc2UgbW9kZScsXG4gICAgICAgIHR5cGU6ICdib29sZWFuJyxcbiAgICAgICAgZGVmYXVsdDogZmFsc2UsXG4gICAgICAgIGFsaWFzOiAndicsXG4gICAgICB9LFxuICAgIH0pXG4gICAgLnZlcnNpb24oZ2V0V2JmeVZlcnNpb24oKSlcbiAgICAuc3RyaWN0KCkuYXJndjtcbiAgb3B0aW9ucy5pc1ZlcmJvc2UgPSBhcmd2LnZlcmJvc2U7XG5cbiAgLy8gRGVsaWJlcmF0ZWx5IGJlZm9yZSB0aGUgQnVuIGNoZWNrIGluIHdpbGxib29zdGVyaWZ5UGF0aHMoKTogdGhlIGdhdGUgbXVzdCBiZSBhcHBsaWFibGUgb24gYVxuICAvLyBtYWNoaW5lIHdob3NlIEJ1biBpcyBvdXRkYXRlZCwgd2hpY2ggaXMgZXhhY3RseSBhIG1hY2hpbmUgdGhhdCBzdGlsbCBuZWVkcyBnYXRpbmcuXG4gIGlmIChhcmd2Ll9bMF0gPT09IGFwcGx5UmVsZWFzZUFnZUdhdGVDb21tYW5kKSB7XG4gICAgaWYgKCFlbnN1cmVHbG9iYWxSZWxlYXNlQWdlR2F0ZXMoKSkgcHJvY2Vzcy5leGl0Q29kZSA9IDE7XG4gICAgcmV0dXJuO1xuICB9XG4gIGlmIChhcmd2Ll9bMF0gPT09IGdlbmVyYXRlVXNlckFnZW50Q29uZmlnc0NvbW1hbmQpIHtcbiAgICBpZiAoIShhd2FpdCBnZW5lcmF0ZVVzZXJBZ2VudENvbmZpZ3MoKSkpIHByb2Nlc3MuZXhpdENvZGUgPSAxO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGxldCBoYXNJbnZhbGlkUGFja2FnZUNvbmZpZyA9IGZhbHNlO1xuICB0cnkge1xuICAgIGhhc0ludmFsaWRQYWNrYWdlQ29uZmlnID0gYXdhaXQgd2lsbGJvb3N0ZXJpZnlQYXRocyhhcmd2LnBhdGhzIGFzIHN0cmluZ1tdLCBhcmd2LnNraXBEZXBzLCBhcmd2LmZvcmNlKTtcbiAgfSBmaW5hbGx5IHtcbiAgICAvLyBUaGUgVHlwZVNjcmlwdCBjb21waWxlciBzZXJ2ZXIgc3Bhd25lZCBmb3IgQVNUIHBhcnNpbmcga2VlcHMgYW4gb3BlbiBJUENcbiAgICAvLyBjaGFubmVsIHRoYXQgd291bGQgb3RoZXJ3aXNlIHByZXZlbnQgdGhlIE5vZGUuanMgcHJvY2VzcyBmcm9tIGV4aXRpbmcuXG4gICAgYXdhaXQgZGlzcG9zZVR5cGVTY3JpcHRBcGkoKTtcbiAgfVxuICBpZiAoaGFzSW52YWxpZFBhY2thZ2VDb25maWcpIHtcbiAgICBwcm9jZXNzLmV4aXRDb2RlID0gMTtcbiAgfVxufVxuXG5hc3luYyBmdW5jdGlvbiB3aWxsYm9vc3RlcmlmeVBhdGhzKHBhdGhzOiBzdHJpbmdbXSwgc2tpcERlcHM6IGJvb2xlYW4sIGZvcmNlOiBib29sZWFuKTogUHJvbWlzZTxib29sZWFuPiB7XG4gIC8vIEJlZm9yZSBhbnl0aGluZyBlbHNlIOKAlCBldmVuIHRoZSBCdW4gY2hlY2sgYmVsb3c6IHRoZSBkZXZlbG9wZXIgbWFjaGluZSdzIGdsb2JhbFxuICAvLyBwYWNrYWdlLW1hbmFnZXIgY29uZmlncyBtdXN0IHJlY2VpdmUgdGhlIG9yZydzIG1pbmltdW0tcmVsZWFzZS1hZ2UgcG9saWN5IG9uIEVWRVJZIHJ1bixcbiAgLy8gYmVjYXVzZSB0aGV5IGFyZSB3aGF0IGd1YXJkcyBicmFuZC1uZXcgbG9jYWwgcHJvamVjdHMgdGhhdCBoYXZlIG5vIHdiZnktZ2VuZXJhdGVkIHJlcG9zaXRvcnlcbiAgLy8gY29uZmlnIHlldCwgYW5kIHRoYXQgcHJvdGVjdGlvbiBtdXN0IHdvcmsgYmVmb3JlIHRoZSBzdXBwb3J0ZWQtdmVyc2lvbiBjaGVjay5cbiAgZW5zdXJlR2xvYmFsUmVsZWFzZUFnZUdhdGVzKCk7XG5cbiAgLy8gd2JmeSBtYW5hZ2VzIHJlcG9zaXRvcmllcyB0aHJvdWdoIEJ1biArIG1pc2UgYW5kIHVzZXMgQnVuIDEuNCBydW50aW1lIEFQSXMuIFRoZSB2ZXJzaW9uIGZsb29yXG4gIC8vIGFsc28gZW5zdXJlcyB0aGUgZ2VuZXJhdGVkIGJ1bmZpZy50b21sIG9wdGlvbnMgcHJvZHVjZSB0aGUgaW5zdGFsbCBsYXlvdXQgd2JmeSB2YWxpZGF0ZXMuIEl0XG4gIC8vIHN0YXlzIHVuY29uZGl0aW9uYWwgZXZlbiB0aG91Z2ggdGhlIGFscmVhZHktYXBwbGllZCBjaGVjayBiZWxvdyBjYW4gbWFrZSBhIHJ1biBhIG5vLW9wOiBhblxuICAvLyBvdXRkYXRlZCBCdW4gaXMgYSBicm9rZW4gZW52aXJvbm1lbnQgd2JmeSBtdXN0IHJlcG9ydCwgYW5kIGhpZGluZyBpdCB3aGVuZXZlciBldmVyeSBwYXRoXG4gIC8vIGhhcHBlbnMgdG8gYmUgc2tpcHBlZCB3b3VsZCBzdXJmYWNlIGl0IG9ubHkgbGF0ZXIuXG4gIGNvbnN0IGJ1blZlcnNpb24gPSBCdW4udmVyc2lvbjtcbiAgaWYgKEJ1bi5zZW12ZXIub3JkZXIoYnVuVmVyc2lvbiwgbWluaW11bUJ1blZlcnNpb24pIDwgMCkge1xuICAgIGNvbnNvbGUuZXJyb3IoYHdiZnkgcmVxdWlyZXMgQnVuID49ICR7bWluaW11bUJ1blZlcnNpb259IChmb3VuZCAke2J1blZlcnNpb259KS4gVXBncmFkZSBCdW4gYW5kIHJlLXJ1bi5gKTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIC8vIEEgYC1kaXJ0eS1sb2NhbGAgbGFiZWwgaWRlbnRpZmllcyBhbiBlZGl0ZWQgY2hlY2tvdXQsIHdob3NlIG5leHQgYnVpbGQgcHJvZHVjZXMgZGlmZmVyZW50IGZpbGVzXG4gIC8vIHVuZGVyIHRoZSBzYW1lIGxhYmVsLCBzbyBzdWNoIGEgcnVuIGlzIG5ldmVyIHRyZWF0ZWQgYXMgYWxyZWFkeSBhcHBsaWVkLlxuICBjb25zdCB2ZXJzaW9uTGFiZWwgPSBnZXRXYmZ5VmVyc2lvbkxhYmVsKCk7XG4gIGNvbnN0IHNraXBwYWJsZVZlcnNpb25MYWJlbCA9XG4gICAgIWZvcmNlICYmIHZlcnNpb25MYWJlbCAmJiAhdmVyc2lvbkxhYmVsLmVuZHNXaXRoKCctZGlydHktbG9jYWwnKSA/IHZlcnNpb25MYWJlbCA6IHVuZGVmaW5lZDtcblxuICBsZXQgaGFzSW52YWxpZFBhY2thZ2VDb25maWcgPSBmYWxzZTtcbiAgZm9yIChjb25zdCBpbnB1dERpclBhdGggb2YgcGF0aHMpIHtcbiAgICAvLyBOb3JtYWxpemUgb25jZSBhdCB0aGUgQ0xJIGJvdW5kYXJ5LiBHZW5lcmF0b3JzIHVzZSBkaXJQYXRoIGZvciBjd2QgYW5kIGJhc2VuYW1lIGRlY2lzaW9ucztcbiAgICAvLyBsZWF2aW5nIHRoZSBzdXBwb3J0ZWQgZGVmYXVsdCBgLmAgdW5yZXNvbHZlZCB3b3VsZCBnZW5lcmF0ZSBhbiBpbnZhbGlkIHBhY2thZ2UgbmFtZSBvZiBgLmAuXG4gICAgY29uc3Qgcm9vdERpclBhdGggPSBwYXRoLnJlc29sdmUoaW5wdXREaXJQYXRoKTtcbiAgICAvLyBDb25maW5lIGV2ZXJ5IGdlbmVyYXRlZCBmaWxlIHRvIHRoaXMgcmVwb3NpdG9yeSAoc2VlIGZzVXRpbC5nZW5lcmF0ZUZpbGUpLiBTZXQgQkVGT1JFIGFueVxuICAgIC8vIGZpeGVyIHdyaXRlcywgYW5kIHJlc2V0IG9uIGV2ZXJ5IGl0ZXJhdGlvbiBzbyBhIG11bHRpLXBhdGggcnVuIG5ldmVyIGtlZXBzIHRoZSBwcmV2aW91cyByb290LlxuICAgIGZzVXRpbC5zZXRSb290RGlyUGF0aChmcy5leGlzdHNTeW5jKHJvb3REaXJQYXRoKSA/IHJvb3REaXJQYXRoIDogdW5kZWZpbmVkKTtcblxuICAgIC8vIEEgcmVwb3NpdG9yeSBwcmVjb25kaXRpb24sIGNoZWNrZWQgYmVmb3JlIHRoZSBhbHJlYWR5LWFwcGxpZWQgc2tpcCBiZWxvdyBhbmQgYmVmb3JlIGFueSBmaWxlXG4gICAgLy8gaXMgd3JpdHRlbjogYW4gdW5zdXBwb3J0ZWQgcGluIG11c3QgYmUgcmVwb3J0ZWQgb24gZXZlcnkgcnVuIGFuZCBtdXN0IG5vdCBzdGFtcCB0aGUgYmFkZ2UuXG4gICAgaWYgKCFoYXNTdXBwb3J0ZWRCdW5QaW4ocm9vdERpclBhdGgpKSB7XG4gICAgICBjb25zb2xlLmVycm9yKFxuICAgICAgICBgU2tpcCAke3Jvb3REaXJQYXRofTogbWlzZS50b21sIG11c3QgcGluIEJ1biB0byBvbmUgZXhhY3QgdmVyc2lvbiA+PSAke21pbmltdW1CdW5WZXJzaW9ufSBvciBvbWl0IGl0LiBVcGRhdGUgdGhlIHBpbiBhbmQgcmUtcnVuLmBcbiAgICAgICk7XG4gICAgICBoYXNJbnZhbGlkUGFja2FnZUNvbmZpZyA9IHRydWU7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICAvLyBUaGUgYmFkZ2UgcmVjb3JkcyB0aGUgYnVpbGQgdGhhdCBnZW5lcmF0ZWQgdGhlIHJlcG9zaXRvcnkncyBjb25maWd1cmF0aW9uLCBzbyB0aGUgc2FtZSBidWlsZFxuICAgIC8vIHdvdWxkIG9ubHkgcmV3cml0ZSB3aGF0IGlzIGFscmVhZHkgdGhlcmUuIFNraXBwaW5nIGlzIGEgZGVsaWJlcmF0ZSB0cmFkZTogdGhlIHBhcnRzIG9mIGEgcnVuXG4gICAgLy8gdGhhdCBkZXBlbmQgb24gc3RhdGUgT1VUU0lERSB0aGUgcmVwb3NpdG9yeSAoR2l0SHViIHNldHRpbmdzLCBkZXBlbmRlbmN5IHVwZGF0ZXMsIHRoZSBmZXRjaGVkXG4gICAgLy8gLmdpdGlnbm9yZSkgZG8gZ2V0IHNraXBwZWQgdG9vLCB3aGljaCBpcyB3aGF0IC0tZm9yY2UgaXMgZm9yLlxuICAgIGlmIChza2lwcGFibGVWZXJzaW9uTGFiZWwgJiYgKGF3YWl0IHJlYWRBcHBsaWVkV2JmeVZlcnNpb25MYWJlbChyb290RGlyUGF0aCkpID09PSBza2lwcGFibGVWZXJzaW9uTGFiZWwpIHtcbiAgICAgIGNvbnNvbGUuaW5mbyhgU2tpcCAke3Jvb3REaXJQYXRofTogd2JmeSAke3NraXBwYWJsZVZlcnNpb25MYWJlbH0gaXMgYWxyZWFkeSBhcHBsaWVkLiBQYXNzIC0tZm9yY2UgdG8gcmUtYXBwbHkuYCk7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgY29uc3QgcGFja2FnZXNEaXJQYXRoID0gcGF0aC5qb2luKHJvb3REaXJQYXRoLCAncGFja2FnZXMnKTtcbiAgICBjb25zdCBkaXJlbnRzID0gKGF3YWl0IGlnbm9yZUVycm9yQXN5bmMoKCkgPT4gZnMucHJvbWlzZXMucmVhZGRpcihwYWNrYWdlc0RpclBhdGgsIHsgd2l0aEZpbGVUeXBlczogdHJ1ZSB9KSkpID8/IFtdO1xuICAgIGNvbnN0IHBhY2thZ2VzU3ViRGlyUGF0aHMgPSBkaXJlbnRzXG4gICAgICAuZmlsdGVyKChkKSA9PiBkLmlzRGlyZWN0b3J5KCkpXG4gICAgICAubWFwKChkKSA9PiBwYXRoLnJlc29sdmUocGFja2FnZXNEaXJQYXRoLCBkLm5hbWUpKTtcbiAgICAvLyBBbHNvIGNvdmVyIHdvcmtzcGFjZXMgZGVjbGFyZWQgb3V0c2lkZSBwYWNrYWdlcy8qIChlLmcuIGFwcHMvKik6IHRoZXkgcmVjZWl2ZSB0aGUgc2FtZVxuICAgIC8vIG1hbmFnZWQgY29uZmlncyAodHNjb25maWcuanNvbiwgcGFja2FnZS5qc29uIGNvbnZlbnRpb25zLCDigKYpIGFzIHBhY2thZ2VzLyogY2hpbGRyZW4uXG4gICAgY29uc3Qgcm9vdFBhY2thZ2VKc29uID1cbiAgICAgIGlnbm9yZUVycm9yKFxuICAgICAgICAoKSA9PlxuICAgICAgICAgIEpTT04ucGFyc2UoZnMucmVhZEZpbGVTeW5jKHBhdGgucmVzb2x2ZShyb290RGlyUGF0aCwgJ3BhY2thZ2UuanNvbicpLCAndXRmOCcpKSBhcyBQYWNrYWdlQ29uZmlnWydwYWNrYWdlSnNvbiddXG4gICAgICApID8/IHt9O1xuICAgIGNvbnN0IHdvcmtzcGFjZVN1YkRpclBhdGhzID0gZ2V0V29ya3NwYWNlU3ViRGlyUGF0aHMoe1xuICAgICAgZGlyUGF0aDogcm9vdERpclBhdGgsXG4gICAgICBwYWNrYWdlSnNvbjogcm9vdFBhY2thZ2VKc29uLFxuICAgICAgZG9lc0NvbnRhaW5TdWJQYWNrYWdlSnNvbnM6IHBhY2thZ2VzU3ViRGlyUGF0aHMuc29tZSgoc3ViRGlyUGF0aCkgPT5cbiAgICAgICAgZnMuZXhpc3RzU3luYyhwYXRoLnJlc29sdmUoc3ViRGlyUGF0aCwgJ3BhY2thZ2UuanNvbicpKVxuICAgICAgKSxcbiAgICB9KTtcbiAgICBjb25zdCBzdWJEaXJQYXRocyA9IFsuLi5uZXcgU2V0KFsuLi5wYWNrYWdlc1N1YkRpclBhdGhzLCAuLi53b3Jrc3BhY2VTdWJEaXJQYXRoc10pXS5maWx0ZXIoXG4gICAgICAoc3ViRGlyUGF0aCkgPT4gc3ViRGlyUGF0aCAhPT0gcGF0aC5yZXNvbHZlKHJvb3REaXJQYXRoKVxuICAgICk7XG5cbiAgICAvLyBSZWZ1c2VkIHdyaXRlcyBvbiBjb3JlIG1hbmFnZWQgZmlsZXMgd291bGQgbGVhdmUgdGhlIHJlcG9zaXRvcnkgcGFydGlhbGx5IHVwZGF0ZWQsIHNvIHNraXBcbiAgICAvLyBpdCBCRUZPUkUgYW55IG11dGF0aW9uIHdoZW4gb25lIG9mIHRoZW0gaXMgYSBzeW1saW5rIG9yIHJlc29sdmVzIG91dHNpZGUgdGhlIHJlcG9zaXRvcnkuXG4gICAgY29uc3QgbWFuYWdlZEZpbGVQYXRocyA9IFtcbiAgICAgIC4uLlsnLmdpdGF0dHJpYnV0ZXMnLCAnYnVuZmlnLnRvbWwnLCAnbGVmdGhvb2sueW1sJywgJ3BhY2thZ2UuanNvbicsICd0c2NvbmZpZy5qc29uJ10ubWFwKChuYW1lKSA9PlxuICAgICAgICBwYXRoLnJlc29sdmUocm9vdERpclBhdGgsIG5hbWUpXG4gICAgICApLFxuICAgICAgLi4uc3ViRGlyUGF0aHMuZmxhdE1hcCgoc3ViRGlyUGF0aCkgPT5cbiAgICAgICAgWydwYWNrYWdlLmpzb24nLCAndHNjb25maWcuanNvbiddLm1hcCgobmFtZSkgPT4gcGF0aC5yZXNvbHZlKHN1YkRpclBhdGgsIG5hbWUpKVxuICAgICAgKSxcbiAgICBdO1xuICAgIGNvbnN0IHdyaXRhYmxlUmVzdWx0cyA9IGF3YWl0IFByb21pc2UuYWxsKFxuICAgICAgbWFuYWdlZEZpbGVQYXRocy5tYXAoKGZpbGVQYXRoKSA9PiBmc1V0aWwuaXNDb25maW5lZFdyaXRhYmxlUGF0aChmaWxlUGF0aCkpXG4gICAgKTtcbiAgICBpZiAod3JpdGFibGVSZXN1bHRzLmluY2x1ZGVzKGZhbHNlKSkge1xuICAgICAgY29uc29sZS5lcnJvcihgU2tpcCAke3Jvb3REaXJQYXRofTogYSBtYW5hZ2VkIGNvbmZpZyBmaWxlIGlzIGEgc3ltbGluayBvciByZXNvbHZlcyBvdXRzaWRlIHRoZSByZXBvc2l0b3J5LmApO1xuICAgICAgaGFzSW52YWxpZFBhY2thZ2VDb25maWcgPSB0cnVlO1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgY29uc3QgcHJlZmxpZ2h0RXJyb3JzID0gW3Jvb3REaXJQYXRoLCAuLi5zdWJEaXJQYXRoc10uZmxhdE1hcCgoZGlyUGF0aCkgPT4ge1xuICAgICAgY29uc3QgcGFja2FnZUpzb25QYXRoID0gcGF0aC5yZXNvbHZlKGRpclBhdGgsICdwYWNrYWdlLmpzb24nKTtcbiAgICAgIGlmICghZnMuZXhpc3RzU3luYyhwYWNrYWdlSnNvblBhdGgpKSByZXR1cm4gW107XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBwYWNrYWdlSnNvbiA9IEpTT04ucGFyc2UoZnMucmVhZEZpbGVTeW5jKHBhY2thZ2VKc29uUGF0aCwgJ3V0ZjgnKSkgYXMgUGFja2FnZUNvbmZpZ1sncGFja2FnZUpzb24nXTtcbiAgICAgICAgY29uc3QgZXJyb3IgPSBnZXRXb3JrZXJUeXBlc1NjcmlwdEVycm9yKHsgcGFja2FnZUpzb24gfSk7XG4gICAgICAgIHJldHVybiBlcnJvciA/IFtgJHtkaXJQYXRofTogJHtlcnJvcn1gXSA6IFtdO1xuICAgICAgfSBjYXRjaCB7XG4gICAgICAgIHJldHVybiBbYCR7cGFja2FnZUpzb25QYXRofSBpcyBpbnZhbGlkYF07XG4gICAgICB9XG4gICAgfSk7XG4gICAgaWYgKHByZWZsaWdodEVycm9ycy5sZW5ndGggPiAwKSB7XG4gICAgICBjb25zb2xlLmVycm9yKGBTa2lwICR7cm9vdERpclBhdGh9OlxcbiR7cHJlZmxpZ2h0RXJyb3JzLmpvaW4oJ1xcbicpfWApO1xuICAgICAgaGFzSW52YWxpZFBhY2thZ2VDb25maWcgPSB0cnVlO1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgLy8gTGV0IGdldFBhY2thZ2VDb25maWcgZGVyaXZlIGlzUm9vdCBmb3IgdGhlIGVudHJ5IHBhdGg6IGB3YmZ5IDxyZXBvPi9wYWNrYWdlcy88YXBwPmAgaXMgYVxuICAgIC8vIHN1cHBvcnRlZCBpbnZvY2F0aW9uIHdob3NlIHRhcmdldCBtdXN0IGtlZXAgaXRzIGNoaWxkIGNsYXNzaWZpY2F0aW9uLCBzbyBmb3JjaW5nXG4gICAgLy8gYGlzUm9vdDogdHJ1ZWAgaGVyZSB3b3VsZCBhcHBseSByb290LW9ubHkgcHJvY2Vzc2luZyAobGVmdGhvb2sgaW5zdGFsbCwgcm9vdCB0c2NvbmZpZyxcbiAgICAvLyBBR0VOVFMubWQsIOKApikgdG8gYSBzdWJwYWNrYWdlLlxuICAgIGNvbnN0IHJvb3RDb25maWcgPSBhd2FpdCBnZXRQYWNrYWdlQ29uZmlnKHJvb3REaXJQYXRoKTtcbiAgICBpZiAob3B0aW9ucy5pc1ZlcmJvc2UpIHtcbiAgICAgIGNvbnNvbGUubG9nKCdyb290Q29uZmlnOicsIHJvb3RDb25maWcpO1xuICAgIH1cbiAgICBpZiAoIXJvb3RDb25maWcpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoYHRoZXJlIGlzIG5vIHZhbGlkIHBhY2thZ2UuanNvbiBpbiAke3Jvb3REaXJQYXRofWApO1xuICAgICAgaGFzSW52YWxpZFBhY2thZ2VDb25maWcgPSB0cnVlO1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIC8vIEV2ZXJ5IGRpc2NvdmVyZWQgd29ya3NwYWNlIChpbmNsdWRpbmcgbm9uLXBhY2thZ2VzLyogbGF5b3V0cyBzdWNoIGFzIGFwcHMvKikgaXMgYSBjaGlsZFxuICAgIC8vIHBhY2thZ2U7IHRoZSBwYWNrYWdlcy8qIGhldXJpc3RpYyBpbnNpZGUgZ2V0UGFja2FnZUNvbmZpZyB3b3VsZCBtaXNjbGFzc2lmeSBhcHBzLyogYXMgcm9vdHMuXG4gICAgY29uc3QgbnVsbGFibGVTdWJQYWNrYWdlQ29uZmlncyA9IGF3YWl0IFByb21pc2UuYWxsKFxuICAgICAgc3ViRGlyUGF0aHMubWFwKChzdWJEaXJQYXRoKSA9PiBnZXRQYWNrYWdlQ29uZmlnKHN1YkRpclBhdGgsIHsgaXNSb290OiBmYWxzZSB9KSlcbiAgICApO1xuICAgIGNvbnN0IGludmFsaWRTdWJQYWNrYWdlRGlyUGF0aCA9IHN1YkRpclBhdGhzLmZpbmQoXG4gICAgICAoc3ViRGlyUGF0aCwgaW5kZXgpID0+ICFudWxsYWJsZVN1YlBhY2thZ2VDb25maWdzW2luZGV4XSAmJiBmcy5leGlzdHNTeW5jKHBhdGguam9pbihzdWJEaXJQYXRoLCAncGFja2FnZS5qc29uJykpXG4gICAgKTtcbiAgICBpZiAoaW52YWxpZFN1YlBhY2thZ2VEaXJQYXRoKSB7XG4gICAgICBjb25zb2xlLmVycm9yKGBTa2lwICR7cm9vdERpclBhdGh9OiAke2ludmFsaWRTdWJQYWNrYWdlRGlyUGF0aH0vcGFja2FnZS5qc29uIGlzIGludmFsaWQuYCk7XG4gICAgICBoYXNJbnZhbGlkUGFja2FnZUNvbmZpZyA9IHRydWU7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgY29uc3Qgc3ViUGFja2FnZUNvbmZpZ3MgPSBudWxsYWJsZVN1YlBhY2thZ2VDb25maWdzLmZpbHRlcigoY29uZmlnKSA9PiAhIWNvbmZpZyk7XG4gICAgY29uc3QgYWxsUGFja2FnZUNvbmZpZ3MgPSBbcm9vdENvbmZpZywgLi4uc3ViUGFja2FnZUNvbmZpZ3NdO1xuICAgIC8vIFRoZSBtYW5hZ2VkIGlnbm9yZSBydWxlIGlzIHVuYW5jaG9yZWQsIHNvIGEgbmVzdGVkIGNvcHkgKGUuZy4gd29ya2Vycy9hcGkvLmVudi5jbG91ZGZsYXJlKSBpc1xuICAgIC8vIGFzIG11Y2ggYSBsZWFrIGFzIGEgcm9vdCBvbmU7IHRoZSB3aWxkY2FyZCBwYXRoc3BlYyBjb3ZlcnMgZXZlcnkgZGVwdGggaW4gb25lIHF1ZXJ5LlxuICAgIGNvbnN0IHRyYWNrZWRDbG91ZGZsYXJlRW52UGF0aHMgPSBhbGxQYWNrYWdlQ29uZmlncy5zb21lKChjb25maWcpID0+IGNvbmZpZy5pc0Nsb3VkZmxhcmUpXG4gICAgICA/IHNwYXduU3luY0FuZFJldHVyblN0ZG91dChcbiAgICAgICAgICAnZ2l0JyxcbiAgICAgICAgICBbJy1jJywgJ2NvcmUucXVvdGVQYXRoPWZhbHNlJywgJ2xzLWZpbGVzJywgJy0tJywgJy5lbnYuY2xvdWRmbGFyZScsICcqLy5lbnYuY2xvdWRmbGFyZSddLFxuICAgICAgICAgIHJvb3RDb25maWcuZGlyUGF0aFxuICAgICAgICApXG4gICAgICAgICAgLnNwbGl0KCdcXG4nKVxuICAgICAgICAgIC5maWx0ZXIoQm9vbGVhbilcbiAgICAgICAgICAubWFwKChmaWxlUGF0aCkgPT4gcGF0aC5yZXNvbHZlKHJvb3RDb25maWcuZGlyUGF0aCwgZmlsZVBhdGgpKVxuICAgICAgOiBbXTtcbiAgICBpZiAodHJhY2tlZENsb3VkZmxhcmVFbnZQYXRocy5sZW5ndGggPiAwKSB7XG4gICAgICBjb25zb2xlLmVycm9yKFxuICAgICAgICBgU0VDVVJJVFkgRVJST1I6IENsb3VkZmxhcmUgY3JlZGVudGlhbHMgbXVzdCBiZSB1bnRyYWNrZWQuIFJlbW92ZSAke3RyYWNrZWRDbG91ZGZsYXJlRW52UGF0aHMuam9pbihcbiAgICAgICAgICAnLCAnXG4gICAgICAgICl9IGZyb20gR2l0LCBwdXJnZSB0aGUgdG9rZW4gZnJvbSBoaXN0b3J5LCBhbmQgcm90YXRlIENMT1VERkxBUkVfQVBJX1RPS0VOIGJlZm9yZSByZXJ1bm5pbmcgd2JmeS5gXG4gICAgICApO1xuICAgICAgaGFzSW52YWxpZFBhY2thZ2VDb25maWcgPSB0cnVlO1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGNvbnN0IGFiYnJldmlhdGlvblByb21pc2UgPSBmaXhUeXBvcyhyb290Q29uZmlnKTtcblxuICAgIGF3YWl0IGdlbmVyYXRlUmVwb3NpdG9yeU5wbXJjKGFsbFBhY2thZ2VDb25maWdzKTtcblxuICAgIGlmIChvcHRpb25zLmlzVmVyYm9zZSkge1xuICAgICAgZm9yIChjb25zdCBjb25maWcgb2YgYWxsUGFja2FnZUNvbmZpZ3MpIHtcbiAgICAgICAgY29uc29sZS5pbmZvKGNvbmZpZyk7XG4gICAgICB9XG4gICAgfVxuICAgIGFzc2VydFNhZmVEZXBlbmRlbmN5U291cmNlcyhhbGxQYWNrYWdlQ29uZmlncyk7XG4gICAgLy8gTWFuYWdlZCByZXBvc2l0b3JpZXMgdXNlIEJ1biB3aXRoIG1pc2UgKGFuZCBvcHRpb25hbGx5IGZub3gpLlxuICAgIGNvbnN0IHByZXZpb3VzQnVuR2xvYmFsU3RvcmUgPSByZWFkQnVuR2xvYmFsU3RvcmUocm9vdERpclBhdGgpO1xuICAgIC8vIFJvb3QtbGV2ZWwgaW5zdGFsbCBsYXlvdXQgbXVzdCBjb3ZlciB3b3Jrc3BhY2UgYXBwcyB0b286IE5leHQuanMgY29tbW9ubHkgbGl2ZXMgdW5kZXJcbiAgICAvLyBwYWNrYWdlcy8qIG9yIGFwcHMvKiB3aGlsZSBidW5maWcudG9tbCBleGlzdHMgb25seSBhdCB0aGUgcmVwb3NpdG9yeSByb290LlxuICAgIGNvbnN0IHVzZUdsb2JhbFN0b3JlID0gcmVzb2x2ZUJ1bkdsb2JhbFN0b3JlKGFsbFBhY2thZ2VDb25maWdzLCBwcmV2aW91c0J1bkdsb2JhbFN0b3JlLCBza2lwRGVwcyk7XG4gICAgYXdhaXQgZ2VuZXJhdGVCdW5maWdUb21sKHJvb3RDb25maWcsIHVzZUdsb2JhbFN0b3JlKTtcbiAgICBhd2FpdCBnZW5lcmF0ZU1pc2VUb21sKHJvb3RDb25maWcpO1xuICAgIGF3YWl0IGdlbmVyYXRlRm5veFRvbWwocm9vdENvbmZpZyk7XG4gICAgLy8gUnVuIGFmdGVyIGdlbmVyYXRlRm5veFRvbWwgc28gaXRzIHRyYW5zYWN0aW9uYWwgcmVjaXBpZW50IHN5bmMgY2Fubm90IHJlc3RvcmUgYSBzbmFwc2hvdFxuICAgIC8vIG92ZXIgZGVmaW5pdGlvbnMgaW5zZXJ0ZWQgaGVyZS5cbiAgICBhd2FpdCBlbnN1cmVXYkVudkRlZmluaXRpb25zKHJvb3RDb25maWcsIGFsbFBhY2thZ2VDb25maWdzKTtcbiAgICAvLyBwcm9taXNlUG9vbC5ydW4gcmVzb2x2ZXMgd2hlbiBhIHRhc2sgU1RBUlRTLCBzbyB0aGUgZ2VuZXJhdGVkIGJ1bmZpZy50b21sIGlzIG5vdFxuICAgIC8vIGd1YXJhbnRlZWQgdG8gYmUgb24gZGlzayB5ZXQ7IHRoZSBwcm9iZSBiZWxvdyBtdXN0IG5vdCB2YWxpZGF0ZSBhIHN0YWxlIGNvbmZpZ3VyYXRpb24uXG4gICAgYXdhaXQgcHJvbWlzZVBvb2wucHJvbWlzZUFsbCgpO1xuXG4gICAgLy8gVGhlIGxheW91dCBtdXN0IGJlIHZlcmlmaWVkIGluc3RhbGxhYmxlIEJFRk9SRSBhbnkgYGJ1biBhZGRgIG11dGF0ZXMgcGFja2FnZS5qc29uIGZpbGVzOlxuICAgIC8vIHBlci1wYWNrYWdlIGluc3RhbGxzIHRvbGVyYXRlIGZhaWx1cmVzIChzcGF3blN5bmMgZGlzY2FyZHMgdGhlaXIgc3RhdHVzKSwgc28gYSBsYXlvdXQgdGhhdFxuICAgIC8vIGNhbm5vdCBpbnN0YWxsIHdvdWxkIHNpbGVudGx5IGRyb3AgZXZlcnkgbWFuYWdlZCBkZXBlbmRlbmN5IHVwZGF0ZSBmb3IgdGhlIHJlc3Qgb2YgdGhlIHJ1bi5cbiAgICAvLyBBIGRvY3Mtb25seSByZXBvc2l0b3J5IGhhcyBubyBtYW5pZmVzdCB0byBwcm9iZSBvbiBpdHMgZmlyc3QgcnVuOyBnZW5lcmF0ZVBhY2thZ2VKc29uIGJlbG93XG4gICAgLy8gY3JlYXRlcyBpdCBiZWZvcmUgdGhlIGF1dGhvcml0YXRpdmUgcmVmcmVzaEJ1bkxvY2sgY2hlY2suXG4gICAgaWYgKFxuICAgICAgIXNraXBEZXBzICYmXG4gICAgICByb290Q29uZmlnLmRvZXNDb250YWluUGFja2FnZUpzb24gJiZcbiAgICAgICFwcm9iZUlzb2xhdGVkQnVuSW5zdGFsbChyb290RGlyUGF0aCwgcm9vdENvbmZpZywgcHJldmlvdXNCdW5HbG9iYWxTdG9yZSwgdXNlR2xvYmFsU3RvcmUpXG4gICAgKSB7XG4gICAgICAvLyByZWZyZXNoQnVuTG9jayBiZWxvdyBpcyB0aGUgYXV0aG9yaXR5IG9uIHdoZXRoZXIgdGhlIGZpbmFsIGluc3RhbGwgZmFpbGVkLlxuICAgICAgY29uc29sZS53YXJuKGBidW4gaW5zdGFsbCBjdXJyZW50bHkgZmFpbHMgaW4gJHtyb290RGlyUGF0aH0gdW5kZXIgdGhlIGlzb2xhdGVkIGxpbmtlci5gKTtcbiAgICB9XG5cbiAgICBjb25zdCBzaG91bGRSdW5Xb3JrZmxvd3MgPVxuICAgICAgIWlzUmV1c2FibGVXb3JrZmxvd3NSZXBvKHJvb3RDb25maWcucmVwb3NpdG9yeSkgJiZcbiAgICAgIChyb290Q29uZmlnLnJlcG9zaXRvcnk/LnN0YXJ0c1dpdGgoJ2dpdGh1YjpXaWxsQm9vc3Rlci8nKSB8fFxuICAgICAgICByb290Q29uZmlnLnJlcG9zaXRvcnk/LnN0YXJ0c1dpdGgoJ2dpdGh1YjpXaWxsQm9vc3RlckxhYi8nKSk7XG4gICAgLy8gT3RoZXIgb3duZXJzIGNhbm5vdCBjYWxsIHRoZSBvcmdhbml6YXRpb24ncyByZXVzYWJsZSB3b3JrZmxvd3MgKHRoZWlyIHNlY3JldHMgYW5kIHJ1bm5lcnNcbiAgICAvLyBkbyBub3QgZXhpc3QgdGhlcmUpLCBzbyBhbnkgb3RoZXIgR2l0SHViLWhvc3RlZCBOb2RlLmpzIHJlcG9zaXRvcnkgZ2V0cyBzZWxmLWNvbnRhaW5lZFxuICAgIC8vIHdvcmtmbG93cyBpbnN0ZWFkIOKAlCBrZXllZCBvbiByZXBvc2l0b3J5IHN0YXRlLCBuZXZlciBvbiB0aGUgb3duZXIncyBpZGVudGl0eS5cbiAgICAvLyByb290Q29uZmlnLmlzUm9vdDogYSBkaXJlY3Qgd29ya3NwYWNlLWNoaWxkIGludm9jYXRpb24gKGB3YmZ5IDxyZXBvPi9wYWNrYWdlcy88YXBwPmApIGtlZXBzXG4gICAgLy8gaXNSb290IGZhbHNlLCBhbmQgR2l0SHViIGlnbm9yZXMgd29ya2Zsb3cgZmlsZXMgbmVzdGVkIHVuZGVyIGEgcGFja2FnZSBkaXJlY3RvcnkuXG4gICAgY29uc3Qgc2hvdWxkUnVuU2VsZkNvbnRhaW5lZFdvcmtmbG93cyA9XG4gICAgICAhc2hvdWxkUnVuV29ya2Zsb3dzICYmXG4gICAgICAhaXNSZXVzYWJsZVdvcmtmbG93c1JlcG8ocm9vdENvbmZpZy5yZXBvc2l0b3J5KSAmJlxuICAgICAgISFyb290Q29uZmlnLnJlcG9zaXRvcnk/LnN0YXJ0c1dpdGgoJ2dpdGh1YjonKSAmJlxuICAgICAgcm9vdENvbmZpZy5pc1Jvb3Q7XG4gICAgYXdhaXQgUHJvbWlzZS5hbGwoW1xuICAgICAgYWJicmV2aWF0aW9uUHJvbWlzZS50aGVuKCgpID0+IGdlbmVyYXRlUmVhZG1lKHJvb3RDb25maWcpKSxcbiAgICAgIGdlbmVyYXRlRG9ja2VyaWdub3JlKHJvb3RDb25maWcpLFxuICAgICAgZ2VuZXJhdGVFZGl0b3Jjb25maWcocm9vdENvbmZpZyksXG4gICAgICBnZW5lcmF0ZUdlbWluaUNvbmZpZyhyb290Q29uZmlnLCBhbGxQYWNrYWdlQ29uZmlncyksXG4gICAgICBnZW5lcmF0ZUdpdGF0dHJpYnV0ZXMocm9vdENvbmZpZyksXG4gICAgICBnZW5lcmF0ZUdpdEh1YlRlbXBsYXRlcyhyb290Q29uZmlnKSxcbiAgICAgIGdlbmVyYXRlSWRlYVNldHRpbmdzKHJvb3RDb25maWcpLFxuICAgICAgZml4UmFpbHdheWlnbm9yZShyb290Q29uZmlnKSxcbiAgICAgIGdlbmVyYXRlUmVub3ZhdGVKc29uYyhyb290Q29uZmlnKSxcbiAgICAgIGdlbmVyYXRlUmVsZWFzZXJjKHJvb3RDb25maWcpLFxuICAgICAgLi4uKHNob3VsZFJ1bldvcmtmbG93cyA/IFtnZW5lcmF0ZVdvcmtmbG93cyhyb290Q29uZmlnKV0gOiBbXSksXG4gICAgICAuLi4oc2hvdWxkUnVuU2VsZkNvbnRhaW5lZFdvcmtmbG93cyA/IFtnZW5lcmF0ZVNlbGZDb250YWluZWRXb3JrZmxvd3Mocm9vdENvbmZpZywgYWxsUGFja2FnZUNvbmZpZ3MpXSA6IFtdKSxcbiAgICAgIHNldHVwTGFiZWxzKHJvb3RDb25maWcpLFxuICAgICAgc2V0dXBSZXBvc2l0b3J5UnVsZXNldHMocm9vdENvbmZpZyksXG4gICAgICBzZXR1cEdpdEh1YlNldHRpbmdzKHJvb3RDb25maWcpLFxuICAgICAgLy8gR2l0IGhvb2tzIGFyZSByZXBvc2l0b3J5LWxldmVsIHN0YXRlOiBhIGRpcmVjdCB3b3Jrc3BhY2UtY2hpbGQgaW52b2NhdGlvbiBtdXN0IG5vdCB3cml0ZSBhXG4gICAgICAvLyBjaGlsZCBsZWZ0aG9vay55bWwgb3IgcmVwbGFjZSB0aGUgZW5jbG9zaW5nIHJlcG9zaXRvcnkncyBob29rIGluc3RhbGxhdGlvbi5cbiAgICAgIC4uLihyb290Q29uZmlnLmlzUm9vdCA/IFtnZW5lcmF0ZUxlZnRob29rKHJvb3RDb25maWcsIGFsbFBhY2thZ2VDb25maWdzKV0gOiBbXSksXG4gICAgXSk7XG4gICAgYXdhaXQgcHJvbWlzZVBvb2wucHJvbWlzZUFsbCgpO1xuICAgIC8vIEFmdGVyIHRoZSB3b3JrZmxvdyBnZW5lcmF0b3IgKGFuZCBpdHMgcG9vbGVkIHdyaXRlcykgc28gdGhlIGluc3RydWN0aW9uIGZpbGVzIGRlc2NyaWJlIHRoZVxuICAgIC8vIGZpbmFsaXplZCB3b3JrZmxvdyBmaWxlcyBpbnN0ZWFkIG9mIGxhZ2dpbmcgb25lIHJ1biBiZWhpbmQuXG4gICAgYXdhaXQgZ2VuZXJhdGVBZ2VudEluc3RydWN0aW9ucyhyb290Q29uZmlnLCBhbGxQYWNrYWdlQ29uZmlncyk7XG4gICAgYXdhaXQgcHJvbWlzZVBvb2wucHJvbWlzZUFsbCgpO1xuXG4gICAgY29uc3QgcHJvbWlzZXM6IFByb21pc2U8dm9pZD5bXSA9IFtdO1xuICAgIGZvciAoY29uc3QgY29uZmlnIG9mIGFsbFBhY2thZ2VDb25maWdzKSB7XG4gICAgICBpZiAoY29uZmlnLmRlcGVuZGluZy5wbGF5d3JpZ2h0VGVzdCkge1xuICAgICAgICBwcm9taXNlcy5wdXNoKGZpeFBsYXl3cmlnaHRDb25maWcoY29uZmlnKSk7XG4gICAgICB9XG4gICAgICBpZiAoY29uZmlnLmRlcGVuZGluZy5uZXh0KSB7XG4gICAgICAgIHByb21pc2VzLnB1c2goZml4TmV4dENvbmZpZ0pzb24oY29uZmlnKSk7XG4gICAgICB9XG4gICAgICBpZiAoY29uZmlnLmRlcGVuZGluZy5jaGFrcmEpIHtcbiAgICAgICAgcHJvbWlzZXMucHVzaChmaXhDaGFrcmFUb2FzdGVyKGNvbmZpZykpO1xuICAgICAgfVxuICAgICAgYXdhaXQgZ2VuZXJhdGVHaXRpZ25vcmUoY29uZmlnLCByb290Q29uZmlnKTtcbiAgICAgIGF3YWl0IHByb21pc2VQb29sLnByb21pc2VBbGwoKTtcbiAgICAgIGlmICghY29uZmlnLmlzUm9vdCAmJiAhY29uZmlnLmRvZXNDb250YWluUGFja2FnZUpzb24pIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBpZiAoZG9lc0NvbnRhaW5KYXZhKGNvbmZpZykpIGF3YWl0IGdlbmVyYXRlUHJldHRpZXJpZ25vcmUoY29uZmlnKTtcbiAgICAgIGF3YWl0IGdlbmVyYXRlUGFja2FnZUpzb24oY29uZmlnLCByb290Q29uZmlnLCBza2lwRGVwcyk7XG5cbiAgICAgIGlmIChjb25maWcuZG9lc0NvbnRhaW5Wc2NvZGVTZXR0aW5nc0pzb24pIHtcbiAgICAgICAgcHJvbWlzZXMucHVzaChnZW5lcmF0ZVZzY29kZVNldHRpbmdzKGNvbmZpZykpO1xuICAgICAgfVxuICAgICAgaWYgKGNvbmZpZy5kb2VzQ29udGFpblR5cGVTY3JpcHQgfHwgY29uZmlnLmRvZXNDb250YWluVHlwZVNjcmlwdEluUGFja2FnZXMpIHtcbiAgICAgICAgcHJvbWlzZXMucHVzaChnZW5lcmF0ZVRzY29uZmlnKGNvbmZpZykpO1xuICAgICAgfVxuICAgICAgaWYgKGRvZXNDb250YWluSnNPclRzKGNvbmZpZykpIHtcbiAgICAgICAgcHJvbWlzZXMucHVzaChnZW5lcmF0ZU94Zm10Q29uZmlnKGNvbmZpZykpO1xuICAgICAgICBwcm9taXNlcy5wdXNoKGdlbmVyYXRlT3hsaW50Q29uZmlnKGNvbmZpZywgcm9vdENvbmZpZykpO1xuICAgICAgfSBlbHNlIGlmICghY29uZmlnLmlzUm9vdCAmJiBjb25maWcuZG9lc0NvbnRhaW5QYWNrYWdlSnNvbiAmJiBkb2VzQ29udGFpbkpzT3JUcyhyb290Q29uZmlnKSkge1xuICAgICAgICAvLyBNb25vcmVwbyB2ZXJpZmljYXRpb24gY2FuIGludm9rZSBveGxpbnQgZnJvbSBldmVyeSB3b3Jrc3BhY2UuIEdpdmVcbiAgICAgICAgLy8gbm9uLWNvZGUgcGFja2FnZXMgYSBsb2NhbCBjb25maWcgc28gb3hsaW50IGRvZXMgbm90IGNsaW1iIHRvIHRoZVxuICAgICAgICAvLyByb290IGNvbmZpZyBhbmQgcmVqZWN0IHJvb3Qtb25seSB0eXBlLWF3YXJlIG9wdGlvbnMgZnJvbSBhIHBhY2thZ2UgY3dkLlxuICAgICAgICBwcm9taXNlcy5wdXNoKGdlbmVyYXRlT3hsaW50Q29uZmlnKGNvbmZpZywgcm9vdENvbmZpZykpO1xuICAgICAgfVxuICAgICAgaWYgKGNvbmZpZy5kZXBlbmRpbmcucHlyaWdodCkge1xuICAgICAgICBwcm9taXNlcy5wdXNoKGdlbmVyYXRlUHlyaWdodENvbmZpZ0pzb24oY29uZmlnKSk7XG4gICAgICB9XG4gICAgfVxuICAgIGF3YWl0IFByb21pc2UuYWxsKHByb21pc2VzKTtcbiAgICBhd2FpdCBwcm9taXNlUG9vbC5wcm9taXNlQWxsKCk7XG4gICAgLy8gUnVuIGFmdGVyIGV2ZXJ5IHBvb2xlZCBnZW5lcmF0b3Igd3JpdGUgc28gbm9ybWFsaXphdGlvbiBjYW5ub3Qgb3ZlcndyaXRlIGEgY29uY3VycmVudFxuICAgIC8vIHVwZGF0ZSwgYW5kIGJlZm9yZSBjbGVhbnVwIHNvIGZvcm1hdHRlciBtZXRhZGF0YSBjYWNoZXMgb2JzZXJ2ZSB0aGUgY2hhbmdlZCBmaWxlcy5cbiAgICByZW5vcm1hbGl6ZVRyYWNrZWRUZXh0RmlsZXMocm9vdERpclBhdGgpO1xuICAgIC8vIFJlZnJlc2ggbG9jayBmaWxlc1xuICAgIHRyeSB7XG4gICAgICByZWZyZXNoQnVuTG9jayhyb290RGlyUGF0aCk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIC8vIEEgZmFpbGVkIGluc3RhbGwgbXVzdCBmYWlsIHRoZSBDTEk6IGV4aXRpbmcgMCB3aXRoIGEgc3RhbGUgb3IgbWlzc2luZyBCdW4gbG9ja2ZpbGUgd291bGRcbiAgICAgIC8vIGhpZGUgYSBicm9rZW4gbWFuYWdlZCBjb25maWd1cmF0aW9uLlxuICAgICAgY29uc29sZS5lcnJvcignRmFpbGVkIHRvIHJlZnJlc2ggdGhlIEJ1biBsb2NrZmlsZTonLCAoZXJyb3IgYXMgRXJyb3IgfCB1bmRlZmluZWQpPy5tZXNzYWdlID8/IGVycm9yKTtcbiAgICAgIGhhc0ludmFsaWRQYWNrYWdlQ29uZmlnID0gdHJ1ZTtcbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgIC8vIEJ1biB3cml0ZXMgYnVuLmxvY2sgYmVmb3JlIGxpZmVjeWNsZSBzY3JpcHRzLCBzbyBhIGZhaWxlZCBpbnN0YWxsIGNhbiBzdGlsbCBsZWF2ZSBHdWFyZFxuICAgICAgLy8gVVJMcyBiZWhpbmQuIE5vcm1hbGl6ZSBib3RoIHN1Y2Nlc3MgYW5kIGZhaWx1cmUgb3V0cHV0IHdpdGhvdXQgcmVwbGFjaW5nIHRoZSBpbnN0YWxsIGVycm9yLlxuICAgICAgY29uc3Qgbm9ybWFsaXplZExvY2tmaWxlUGF0aCA9IG5vcm1hbGl6ZUJ1bkxvY2tmaWxlKHJvb3REaXJQYXRoKTtcbiAgICAgIGlmIChub3JtYWxpemVkTG9ja2ZpbGVQYXRoKSB7XG4gICAgICAgIGNvbnNvbGUuaW5mbyhgUmVtb3ZlZCBUYWt1bWkgR3VhcmQgcHJveHkgVVJMcyBmcm9tICR7bm9ybWFsaXplZExvY2tmaWxlUGF0aH0gdG8ga2VlcCBpdCByZWdpc3RyeS1hZ25vc3RpYy5gKTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgY29uc29sZS5lcnJvcignRmFpbGVkIHRvIG5vcm1hbGl6ZSB0aGUgQnVuIGxvY2tmaWxlOicsIChlcnJvciBhcyBFcnJvciB8IHVuZGVmaW5lZCk/Lm1lc3NhZ2UgPz8gZXJyb3IpO1xuICAgICAgaGFzSW52YWxpZFBhY2thZ2VDb25maWcgPSB0cnVlO1xuICAgIH1cbiAgICBzcGF3blN5bmMoJ2J1bicsIFsnY2xlYW51cCddLCByb290RGlyUGF0aCk7XG4gIH1cbiAgcmV0dXJuIGhhc0ludmFsaWRQYWNrYWdlQ29uZmlnO1xufVxuXG4vKipcbiAqIFByb2JlcyBgYnVuIGluc3RhbGxgIHVuZGVyIHRoZSBpc29sYXRlZCBsaW5rZXIuIEFuIGluY29tcGF0aWJpbGl0eSBtdXN0IGJlIGZpeGVkIGluIHRoZVxuICogcmVwb3NpdG9yeSBvciBpbiB3YmZ5J3MgbWFuYWdlZCBsaXN0cywgbmV2ZXIgYnkgc3dpdGNoaW5nIHRoZSBsaW5rZXIuIFJldHVybnMgZmFsc2Ugd2hlbiB0aGVcbiAqIGluc3RhbGwgZmFpbHMuXG4gKi9cbmZ1bmN0aW9uIHByb2JlSXNvbGF0ZWRCdW5JbnN0YWxsKFxuICByb290RGlyUGF0aDogc3RyaW5nLFxuICByb290Q29uZmlnOiBQYWNrYWdlQ29uZmlnLFxuICBwcmV2aW91c0dsb2JhbFN0b3JlOiBib29sZWFuIHwgdW5kZWZpbmVkLFxuICB1c2VHbG9iYWxTdG9yZTogYm9vbGVhblxuKTogYm9vbGVhbiB7XG4gIC8vIEEgbGF5b3V0IHN3aXRjaCBtdXN0IHByb2JlIGZyb20gYSBjbGVhbiB0cmVlIGJlY2F1c2UgQnVuIGRvZXMgbm90IHJlbW92ZSB0aGUgcHJldmlvdXMgbGF5b3V0J3MgbGVmdG92ZXJzLlxuICBpZiAocHJldmlvdXNHbG9iYWxTdG9yZSAhPT0gdXNlR2xvYmFsU3RvcmUpIHtcbiAgICByZW1vdmVOb2RlTW9kdWxlcyhyb290RGlyUGF0aCwgcm9vdENvbmZpZyk7XG4gIH1cbiAgLy8gUmV0cnkgb25jZSBzbyBhIHRyYW5zaWVudCBmYWlsdXJlIChyZWdpc3RyeSBoaWNjdXAsIGZsYWt5IGxpZmVjeWNsZSBzY3JpcHQpIGRvZXMgbm90XG4gIC8vIG1hc3F1ZXJhZGUgYXMgYSBsYXlvdXQgaW5jb21wYXRpYmlsaXR5LlxuICBpZiAoc3Bhd25TeW5jQW5kUmV0dXJuU3RhdHVzKCdidW4nLCBbJ2luc3RhbGwnXSwgcm9vdERpclBhdGgsIDEpID09PSAwKSByZXR1cm4gdHJ1ZTtcblxuICAvLyBDbGVhbiB1cCB0aGUgZmFpbGVkIGF0dGVtcHQgc28gbGF0ZXIgaW5zdGFsbHMgZG8gbm90IHJ1biBvbiBhIHBvbGx1dGVkIHRyZWUuXG4gIHJlbW92ZU5vZGVNb2R1bGVzKHJvb3REaXJQYXRoLCByb290Q29uZmlnKTtcbiAgcmV0dXJuIGZhbHNlO1xufVxuXG5mdW5jdGlvbiByZW1vdmVOb2RlTW9kdWxlcyhyb290RGlyUGF0aDogc3RyaW5nLCByb290Q29uZmlnOiBQYWNrYWdlQ29uZmlnKTogdm9pZCB7XG4gIC8vIENvdmVyIGV2ZXJ5IGRlY2xhcmVkIHdvcmtzcGFjZTogbGVmdG92ZXJzIGNhbiBrZWVwIHBoYW50b20gZGVwZW5kZW5jaWVzIHJlc29sdmFibGUuXG4gIGNvbnN0IG5vZGVNb2R1bGVzUGF0aHMgPSBbXG4gICAgcGF0aC5yZXNvbHZlKHJvb3REaXJQYXRoLCAnbm9kZV9tb2R1bGVzJyksXG4gICAgLi4uWy4uLmdldFdvcmtzcGFjZVBhY2thZ2VEaXJzKHJvb3RDb25maWcpLnZhbHVlcygpXS5tYXAoKHdvcmtzcGFjZURpcikgPT5cbiAgICAgIHBhdGgucmVzb2x2ZShyb290RGlyUGF0aCwgd29ya3NwYWNlRGlyLCAnbm9kZV9tb2R1bGVzJylcbiAgICApLFxuICBdO1xuICAvLyBOZXZlciBkZWxldGUgdGhyb3VnaCBhIHdvcmtzcGFjZSBzeW1saW5rIHRoYXQgZXNjYXBlcyB0aGlzIHJlcG9zaXRvcnkuXG4gIGNvbnN0IHJlYWxSb290RGlyUGF0aCA9IGZzLnJlYWxwYXRoU3luYyhyb290RGlyUGF0aCk7XG4gIGZvciAoY29uc3Qgbm9kZU1vZHVsZXNQYXRoIG9mIG5vZGVNb2R1bGVzUGF0aHMpIHtcbiAgICBjb25zdCByZWFsUGFyZW50RGlyUGF0aCA9IGlnbm9yZUVycm9yKCgpID0+IGZzLnJlYWxwYXRoU3luYyhwYXRoLmRpcm5hbWUobm9kZU1vZHVsZXNQYXRoKSkpO1xuICAgIGlmIChcbiAgICAgICFyZWFsUGFyZW50RGlyUGF0aCB8fFxuICAgICAgKHJlYWxQYXJlbnREaXJQYXRoICE9PSByZWFsUm9vdERpclBhdGggJiYgIXJlYWxQYXJlbnREaXJQYXRoLnN0YXJ0c1dpdGgocmVhbFJvb3REaXJQYXRoICsgcGF0aC5zZXApKVxuICAgICkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGZzLnJtU3luYyhub2RlTW9kdWxlc1BhdGgsIHsgcmVjdXJzaXZlOiB0cnVlLCBmb3JjZTogdHJ1ZSB9KTtcbiAgfVxufVxuXG5mdW5jdGlvbiByZWZyZXNoQnVuTG9jayhyb290RGlyUGF0aDogc3RyaW5nKTogdm9pZCB7XG4gIC8vIHdiZnkgc2hvdWxkIHVwZGF0ZSBvbmx5IHRoZSBwYWNrYWdlcyBpdCBleHBsaWNpdGx5IG1hbmFnZXMgdGhyb3VnaCBidW4gYWRkLlxuICAvLyBSdW5uaW5nIGJ1biB1cGRhdGUgaGVyZSByZWZyZXNoZXMgdW5yZWxhdGVkIGFwcGxpY2F0aW9uIGRlcGVuZGVuY2llcyBhbmRcbiAgLy8gY2FuIGNoYW5nZSBwcm9kdWN0IGJlaGF2aW9yLCBzbyBrZWVwIHRoZSBleGlzdGluZyBsb2NrIGFuZCByZWNvbmNpbGUgaXQuXG4gIGNvbnN0IHN0YXR1cyA9IHNwYXduU3luY0FuZFJldHVyblN0YXR1cygnYnVuJywgWydpbnN0YWxsJ10sIHJvb3REaXJQYXRoLCAxKTtcbiAgaWYgKHN0YXR1cyA9PT0gMCkgcmV0dXJuO1xuICB0aHJvdyBuZXcgRXJyb3IoYEZhaWxlZCB0byByZWZyZXNoIEJ1biBsb2NrZmlsZTogYnVuIGluc3RhbGwgZXhpdGVkIHdpdGggc3RhdHVzICR7c3RhdHVzfWApO1xufVxuXG5hd2FpdCBtYWluKCk7XG4iXSwieF9nb29nbGVfaWdub3JlTGlzdCI6WzQzLDQ0LDQ1LDQ2LDQ3LDQ4XSwibWFwcGluZ3MiOiIreUJBV0EsTUFBYSxHQUFvRCxDQUMvRCxDQUNFLFFBQVMsTUFDVCxZQUFhLHNHQUNmLEVBQ0EsQ0FDRSxRQUFTLG1CQUNULFlBQ0UsNEdBQ0osRUFDQSxDQUNFLFFBQVMsb0JBQ1QsWUFDRSx5S0FDSixFQUNBLENBQ0UsUUFBUyxVQUNULFlBQWEsK0RBQ2YsRUFDQSxDQUNFLFFBQVMsUUFDVCxZQUFhLHNHQUNmLENBQ0YsRUFHYSxHQUFpRCxDQUM1RCxDQUFFLFFBQVMsVUFBVyxZQUFhLDhDQUErQyxFQUNsRixDQUFFLFFBQVMsV0FBWSxZQUFhLDZDQUE4QyxFQUNsRixDQUFFLFFBQVMsU0FBVSxZQUFhLHdDQUF5QyxFQUMzRSxDQUFFLFFBQVMsV0FBWSxZ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
|