wbfy 5.2.29 → 5.2.30

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (2) hide show
  1. package/dist/index.js +2 -2
  2. package/package.json +1 -1
package/dist/index.js CHANGED
@@ -1,2 +1,2 @@
1
- import e from"node:fs";import t from"node:path";import{ignoreEnoentAsync as n,withRetry as s,ignoreErrorAsync as i}from"@willbooster/shared-lib";import o from"fast-glob";import r from"yargs";import a from"node:fs/promises";import{PromisePool as c}from"minimal-promise-pool";import l from"deepmerge";import p from"typescript";import d from"js-yaml";import u from"lodash.clonedeep";import{Octokit as m}from"@octokit/core";import f from"node:child_process";import g from"node:os";import h from"dotenv";import y from"libsodium-wrappers";import{distance as w}from"fastest-levenshtein";import{simpleGit as b}from"simple-git";import{z as v}from"zod";const k=new class{isVerbose=!1;doesUploadEnvVars=!1};const x=new class{async functionIgnoringException(e,t){k.isVerbose&&console.info(`--------- ${e} start ---------`);try{await t()}catch(t){console.info(`Error occurred in ${e}: ${t instanceof Error?t.stack:String(t)}}`)}k.isVerbose&&console.info(`---------- ${e} end ----------`)}};async function _(e){return x.functionIgnoringException("fixDockerfile",async()=>{if(!e.doesContainDockerfile)return;const n=e.dockerfile,s=n;n!==s&&await a.writeFile(t.join(e.dirPath,"Dockerfile"),s)})}const j={async readFileIgnoringError(t){try{return await e.promises.readFile(t,"utf8")}catch{}},async generateFile(n,s){await e.promises.mkdir(t.dirname(n),{recursive:!0});let i=s.replaceAll("\r\n","\n").trim();i&&(i+="\n"),await e.promises.writeFile(n,i)}},S=new c;async function P(n){return x.functionIgnoringException("fixNextConfigJson",async()=>{const s=["js","mjs","cjs"].map(e=>t.resolve(n.dirPath,`next.config.${e}`)).find(t=>e.existsSync(t));if(!s)return;const i=(await e.promises.readFile(s,"utf8")).replace(/=\s*{([\S\s]*)};/,(e,t)=>(t.includes("eslint:")||(t+="eslint: { ignoreDuringBuilds: true },"),t.includes("typescript:")||(t+="typescript: { ignoreBuildErrors: true },"),`= {${t}};`));await S.run(()=>j.generateFile(s,i))})}const $=e=>({kind:"literal",value:e}),C=e=>({kind:"object",value:e}),F={forbidOnly:$("!!process.env.CI"),retries:$("process.env.PWDEBUG ? 0 : process.env.CI ? 5 : 1"),timeout:$("120_000"),use:C({actionTimeout:$("10_000"),trace:$("process.env.CI ? 'on-first-retry' : 'retain-on-failure'"),screenshot:$("process.env.CI ? 'only-on-failure' : 'only-on-failure'"),video:$("process.env.CI ? 'retain-on-failure' : 'retain-on-failure'")}),workers:$("process.env.PWDEBUG ? 1 : undefined"),webServer:C({command:$("'yarn start-test-server'"),url:$("process.env.NEXT_PUBLIC_BASE_URL"),reuseExistingServer:$("!!process.env.CI"),timeout:$("300_000"),stdout:$("'ignore'"),stderr:$("'pipe'"),env:$("{\n ...process.env,\n PRISMA_USER_CONSENT_FOR_DANGEROUS_AI_ACTION: 'true',\n}"),gracefulShutdown:$("{\n signal: 'SIGTERM',\n timeout: 500,\n}")})};async function E(n){return x.functionIgnoringException("fixPlaywrightConfig",async()=>{const s=t.resolve(n.dirPath,"playwright.config.ts");if(!e.existsSync(s))return;const i=await e.promises.readFile(s,"utf8"),o=/defineConfig\s*\(\s*(\{[\s\S]*?})\s*\);?/.exec(i),r=o?.[1];if(!r)return;const a=function(e){const t=p.createSourceFile("playwright-config.ts",`const config = ${e};`,p.ScriptTarget.Latest,!0,p.ScriptKind.TS),n=t.statements[0];if(!n||!p.isVariableStatement(n))return;const s=n.declarationList.declarations[0];if(!s?.initializer||!p.isObjectLiteralExpression(s.initializer))return;return B(s.initializer,t)}(r);if(!a)return;const c=A(l.all([F,a,F]),0),d=i.replace(r,c);await S.run(()=>j.generateFile(s,d))})}function B(e,t){const n={};for(const s of e.properties){if(!p.isPropertyAssignment(s)||!p.isIdentifier(s.name)&&!p.isStringLiteral(s.name))return;const e=O(s.initializer,t);if(void 0===e)return;n[s.name.getText(t)]=e}return n}function O(e,t){if(p.isObjectLiteralExpression(e)){const n=B(e,t);return n?C(n):$(e.getText(t))}if(p.isArrayLiteralExpression(e)){const n=e.elements.map(e=>O(e,t));return n.some(e=>void 0===e)?$(e.getText(t)):{kind:"array",value:n}}return $(e.getText(t))}function I(e,t){return"array"===e.kind?function(e,t){if(0===e.length)return"[]";const n=" ".repeat(t+1),s=e.map(e=>{const s=I(e,t+1).split("\n");if(s[s.length-1]=`${s.at(-1)},`,"literal"===e.kind)for(let e=1;e<s.length;e+=1)s[e]=`${n}${s[e]}`;return s[0]=`${n}${s[0]}`,s.join("\n")}),i=" ".repeat(t);return`[\n${s.join("\n")}\n${i}]`}(e.value,t):"literal"===e.kind?e.value:A(e.value,t)}function A(e,t){const n=" ".repeat(t+1),s=Object.entries(e).map(([e,s])=>{const i=I(s,t+1).split("\n");if(i[i.length-1]=`${i.at(-1)},`,"literal"===s.kind)for(let e=1;e<i.length;e+=1)i[e]=`${n}${i[e]}`;return i[0]=`${n}${e}: ${i[0]}`,i.join("\n")}),i=" ".repeat(t);return 0===s.length?`{\n${i}}`:`{\n${s.join("\n")}\n${i}}`}const T=["**/node_modules/**","**/.venv/**","**/test-fixtures/**","**/test/fixtures/**","**/dist/**","**/build/**","**/target/**","**/temp/**","**/tmp/**"];async function D(e){return x.functionIgnoringException("fixPrismaEnvFiles",async()=>{const n=await o.glob(["*.env","*.env.*"],{dot:!0,cwd:e.dirPath,ignore:T});for(const s of n){const n=t.resolve(e.dirPath,s),i=(await a.readFile(n,"utf8")).replace(/DATABASE_URL="?(.+\.sqlite3)"?[\n$]/,'DATABASE_URL="$1?connection_limit=1"\n');await a.writeFile(n,i)}})}async function R(n){return x.functionIgnoringException("fixTestDirectoriesUpdatingPackageJson",async()=>{await Promise.all(n.map(async n=>{const s=t.join(n,"test");for(const i of["__tests__","tests"]){const o=t.join(n,i);try{await e.promises.rename(o,s);const r=await e.promises.readFile(t.join(n,"package.json"),"utf8"),a=r.replaceAll(i,"test");if(r===a)return;await e.promises.writeFile(t.join(n,"package.json"),a)}catch{}}}))})}async function W(e,s){return x.functionIgnoringException("fixTypeDefinitions",async()=>{const i=t.resolve(e.dirPath,"@types"),o=e.isRoot&&e.doesContainSubPackageJsons?void 0:t.resolve(e.dirPath,"src","types"),r=await n(()=>a.readdir(i,{withFileTypes:!0}));if(r)for(const e of r){const r=e.name.slice(0,-5),c=e.name.endsWith(".d.ts");let l=c?r:e.name;l.includes("__")&&(l=`@${l.replace("__","/")}`);const p=s.some(e=>e.packageJson?.dependencies?.[l]||e.packageJson?.devDependencies?.[l]);e.isFile()&&c?p?(await a.mkdir(t.join(i,r)),await S.run(()=>a.rename(t.join(i,e.name),t.join(i,r,"index.d.ts")))):o&&(await a.mkdir(o,{recursive:!0}),await S.run(()=>a.rename(t.join(i,e.name),t.join(o,e.name)))):e.isDirectory()&&o&&!p&&(await a.mkdir(o,{recursive:!0}),await S.run(()=>n(()=>a.rename(t.join(i,e.name,"index.d.ts"),t.join(o,`${e.name}.d.ts`)))))}})}function L(e,t){return t}function N(e,t,n){const s=[...e];for(const[i,o]of t.entries())void 0===s[i]?s[i]=n.cloneUnlessOtherwiseSpecified(o,n):n.isMergeableObject(o)?s[i]=l(e[i],o,n):e.includes(o)||s.push(o);return s}function J(e){const t=Object.entries(e).toSorted(([e],[t])=>e.localeCompare(t));for(const[n,s]of t)delete e[n],e[n]=s,"object"==typeof s&&null!==s&&J(s);return e}const G={test:{name:"Test",on:{pull_request:null,push:{branches:["main","wbfy"]}},concurrency:{group:"${{ github.workflow }}-${{ github.ref }}","cancel-in-progress":!0},permissions:{contents:"write"},jobs:{test:{uses:"WillBooster/reusable-workflows/.github/workflows/test.yml@main"}}},autofix:{name:"Fix code automatically",on:{pull_request:null},concurrency:{group:"${{ github.workflow }}-${{ github.ref }}","cancel-in-progress":!0},jobs:{test:{uses:"WillBooster/reusable-workflows/.github/workflows/autofix.yml@main"}}},release:{name:"Release",on:{push:{branches:[]}},concurrency:{group:"${{ github.workflow }}","cancel-in-progress":!1},permissions:{"id-token":"write",contents:"write"},jobs:{release:{uses:"WillBooster/reusable-workflows/.github/workflows/release.yml@main"}}},"semantic-pr":{name:"Lint PR title",on:{pull_request_target:{types:["opened","edited","synchronize"]}},jobs:{"semantic-pr":{uses:"WillBooster/reusable-workflows/.github/workflows/semantic-pr.yml@main"}}},sync:{name:"Sync",on:{},permissions:{contents:"write"},jobs:{sync:{uses:"WillBooster/reusable-workflows/.github/workflows/sync.yml@main"}}},"close-comment":{name:"Add close comment",on:{pull_request:{types:["opened"]}},jobs:{"close-comment":{uses:"WillBooster/reusable-workflows/.github/workflows/close-comment.yml@main"}}},"gen-pr-claude":{name:"Generate PR with Claude Code",on:{issues:{types:["labeled"]},pull_request:{types:["labeled"]}},jobs:{"gen-pr":{if:"contains(github.event.label.name, 'gen-pr-all') || contains(github.event.label.name, 'gen-pr-claude')",uses:"WillBooster/reusable-workflows/.github/workflows/gen-pr.yml@main",with:{"coding-tool":"claude-code","issue-number":"${{ github.event.issue.number || github.event.number }}","test-command":"yarn|bun check-all-for-ai"},secrets:{CLAUDE_CODE_OAUTH_TOKEN:"${{ secrets.CLAUDE_CODE_OAUTH_TOKEN }}"}}}},"gen-pr-codex":{name:"Generate PR with Codex CLI",on:{issues:{types:["labeled"]},pull_request:{types:["labeled"]}},jobs:{"gen-pr":{if:"contains(github.event.label.name, 'gen-pr-all') || contains(github.event.label.name, 'gen-pr-codex')",uses:"WillBooster/reusable-workflows/.github/workflows/gen-pr.yml@main",with:{"coding-tool":"codex-cli","issue-number":"${{ github.event.issue.number || github.event.number }}","test-command":"yarn|bun check-all-for-ai"},secrets:{OPENAI_API_KEY:"${{ secrets.OPENAI_API_KEY }}"}}}},"gen-pr-gemini":{name:"Generate PR with Gemini CLI",on:{issues:{types:["labeled"]},pull_request:{types:["labeled"]}},jobs:{"gen-pr":{if:"contains(github.event.label.name, 'gen-pr-all') || contains(github.event.label.name, 'gen-pr-gemini')",uses:"WillBooster/reusable-workflows/.github/workflows/gen-pr.yml@main",with:{"coding-tool":"gemini-cli","issue-number":"${{ github.event.issue.number || github.event.number }}","test-command":"yarn|bun check-all-for-ai"},secrets:{GEMINI_API_KEY:"${{ secrets.GEMINI_API_KEY }}"}}}}};async function z(n){const s=["add-focused-issue-to-project.yml","add-issue-to-project.yml","add-ready-issue-to-project.yml","notify-ready.yml","wbfy.yml","wbfy-merge.yml"];return x.functionIgnoringException("generateWorkflow",async()=>{if(U(n.repository))return;const i=t.resolve(n.dirPath,".github","workflows");await e.promises.mkdir(i,{recursive:!0});const o=t.resolve(n.dirPath,".github","semantic.yml");await S.run(()=>e.promises.rm(o,{force:!0,recursive:!0}));const r=await e.promises.readdir(i,{withFileTypes:!0}),a=new Set(["test.yml","autofix.yml","semantic-pr.yml","close-comment.yml","gen-pr-claude.yml","gen-pr-codex.yml","gen-pr-gemini.yml",...r.filter(e=>e.isFile()&&e.name.endsWith(".yml")).map(e=>e.name)]);n.depending.semanticRelease&&a.add("release.yml"),a.delete("autofix.yml"),n.isPublicRepo||s.push("autofix.yml"),a.delete("add-issue-to-project.yml"),a.delete("add-ready-issue-to-project.yml"),a.delete("notify-ready.yml");for(const e of a){const s=t.basename(e,".yml");await S.run(()=>M(n,i,s))}for(const n of s)await S.run(()=>e.promises.rm(t.join(i,n),{force:!0,recursive:!0}))})}function U(e){return e?.endsWith("/reusable-workflows")??!1}async function M(n,s,i){let o=u(i in G?G[i]:{});if(!("jobs"in o))return;const r=t.join(s,`${i}.yml`);try{const t=await e.promises.readFile(r,"utf8"),n=d.load(t);o=l.all([o,n,o],{arrayMerge:N})}catch{}i.startsWith("deploy")&&(o={...o,concurrency:{group:"${{ github.workflow }}","cancel-in-progress":!1}},function(e,t){const n=e[t];delete e[t],e[t]=n}(o,"jobs"),o.on?.push&&(o.on.push["paths-ignore"]=[...new Set(["**.md","**/docs/**",...o.on.push["paths-ignore"]??[]])]));let a=!1;for(const e of Object.values(o.jobs))e.uses?.includes("/reusable-workflows/")&&(q(n,e,i),a=!0);if(a){switch(i){case"release":if(o.on?.schedule)delete o.on.push;else{if(!(o.on?.push&&n.release.branches.length>0))return void await e.promises.rm(t.join(s,"release.yml"),{force:!0});o.on.push.branches=n.release.branches}break;case"test":o.on?.pull_request&&delete o.on.pull_request["paths-ignore"],o.on?.push&&(delete o.on.push["paths-ignore"],o.on.push.branches=o.on.push.branches.filter(e=>"renovate/**"!==e))}if(function(e){delete e.jobs["add-to-project"]}(o),await H(o,r),"release"===i)await e.promises.rm(t.join(s,"semantic-release.yml"),{force:!0});else if("sync"===i){if(await e.promises.rm(t.join(s,"sync-init.yml"),{force:!0}),!o.jobs.sync?.with)return;o.jobs["sync-force"]=o.jobs.sync;const n=o.jobs.sync.with.sync_params_without_dest;if("string"!=typeof n)return;o.jobs.sync.with.sync_params_without_dest=`--force ${n}`,o.name="Force to Sync",o.on={workflow_dispatch:null},delete o.jobs.sync,await H(o,t.join(s,"sync-force.yml"))}}}function q(e,t,n){if(t.with??={},t.secrets??={},delete t.secrets.NPM_TOKEN,"test"!==n&&"release"!==n&&"gen-pr-claude"!==n&&"gen-pr-codex"!==n&&"gen-pr-gemini"!==n||(t.secrets.GH_TOKEN="${{ secrets.GITHUB_TOKEN }}"),"gen-pr-claude"!==n&&"gen-pr-codex"!==n&&"gen-pr-gemini"!==n||(t.with["test-command"]=e.isBun?"bun run check-all-for-ai":"yarn check-all-for-ai"),t.secrets.FIREBASE_TOKEN&&(t.secrets.GCP_SA_KEY_JSON_FOR_FIREBASE="${{ secrets.GCP_SA_KEY_JSON_FOR_FIREBASE }}",delete t.secrets.FIREBASE_TOKEN),(t.secrets.DISCORD_WEBHOOK_URL&&("release"===n||n.startsWith("deploy"))||t.with.server_url&&n.startsWith("deploy"))&&(t.secrets.DISCORD_WEBHOOK_URL="${{ secrets.DISCORD_WEBHOOK_URL_FOR_RELEASE }}"),"sync"===n){const e=t.with.sync_params_without_dest;"string"==typeof e&&(t.with.sync_params_without_dest=e.replace("sync ",""))}if(e.repository?.startsWith("github:WillBooster/")?t.uses=t.uses?.replace("WillBoosterLab/","WillBooster/"):e.repository?.startsWith("github:WillBoosterLab/")&&(t.uses=t.uses?.replace("WillBooster/","WillBoosterLab/")),".env"===t.with.dot_env_path&&delete t.with.dot_env_path,function(e){if(!e.with)return;delete e.with.non_self_hosted,delete e.with.notify_discord,delete e.with.require_fly,delete e.with.require_gcloud,delete e.with.label,delete e.with.labelOperator,e.with.ci_size&&(e.with.ci_label=e.with.ci_size,delete e.with.ci_size)}(t),n.startsWith("deploy")&&t.secrets.FLY_API_TOKEN&&"string"==typeof t.with.deploy_command&&(t.with.deploy_command=t.with.deploy_command.replace(/\s+--json/,"")),e.doesContainDockerfile&&!t.with.ci_label&&n.startsWith("test")&&(t.with.ci_label="large"),"release"===n||"test"===n||n.startsWith("deploy")?e.isPublicRepo&&(t.with.github_hosted_runner=!0):delete t.with.github_hosted_runner,Object.keys(t.with).length>0?J(t.with):delete t.with,Object.keys(t.secrets).length>0){const e=J(t.secrets);delete t.secrets,t.secrets=e}else delete t.secrets}async function H(t,n){const s=d.dump(t,{lineWidth:-1,noCompatMode:!0,styles:{"!!null":"empty"}});await e.promises.writeFile(n,s)}async function Y(n){return x.functionIgnoringException("fixTypos",async()=>{if(U(n.repository))return;const s=n.dirPath,i=await o.glob("**/*.md",{dot:!0,cwd:s,ignore:T});k.isVerbose&&console.info(`Found ${i.length} markdown files in ${s}`);for(const o of i){const i=t.join(s,o);await S.run(async()=>{const t=await e.promises.readFile(i,"utf8");let s=K(t);s=X(s,n,"doc"),t!==s&&await j.generateFile(i,s)})}const r=await o.glob(["{app,src,test,scripts}/**/*.{cjs,mjs,js,jsx,cts,mts,ts,tsx}","packages/**/{app,src,test,scripts}/**/*.{cjs,mjs,js,jsx,cts,mts,ts,tsx}"],{dot:!0,cwd:s,ignore:T});k.isVerbose&&console.info(`Found ${r.length} TypeScript files in ${s}`);for(const i of r){const o=t.join(s,i),r=await e.promises.readFile(o,"utf8");let a=V(r);a=X(a,n,"ts"),r!==a&&await j.generateFile(o,a)}const a=await o.glob("**/*.{csv,htm,html,tsv,xml,yaml,yml}",{dot:!0,cwd:s,ignore:T});k.isVerbose&&console.info(`Found ${a.length} text-based files in ${s}`);for(const i of a){const o=t.join(s,i),r=await e.promises.readFile(o,"utf8");let a=K(r);a=X(a,n,"text"),r!==a&&await j.generateFile(o,a)}await S.promiseAll()})}function K(e){return e.replaceAll(/\bc\.f\.([^$])/g,"cf.$1").replaceAll(/\beg\.([^$])/g,"e.g.$1").replaceAll(/\bie\.([^$])/g,"i.e.$1")}function V(e){return e.replaceAll(/\/\/(.*)c\.f\./g,"//$1cf.").replaceAll(/\/\/(.*)eg\./g,"//$1e.g.").replaceAll(/\/\/(.*)ie\./g,"//$1i.e.")}function X(e,t,n){for(const[n,s]of Object.entries(t.wbfyJson?.typos?.all??{}))e=e.replaceAll(n,s);for(const[s,i]of Object.entries(t.wbfyJson?.typos?.[n]??{}))e=e.replaceAll(s,i);return e}async function Q(e,n){return x.functionIgnoringException("generateAgentInstructions",async()=>{if(!e.isRoot)return;const s=t.resolve(e.dirPath,"AGENTS_EXTRA.md"),i=await j.readFileIgnoringError(s);for(const[s,o]of[["AGENTS.md","Codex CLI"],["CLAUDE.md","Claude Code"],["GEMINI.md","Gemini CLI"]]){const r=Z(e,n,o,i),a=t.resolve(e.dirPath,s);await S.run(()=>j.generateFile(a,r))}const o=t.resolve(e.dirPath,".cursor/rules/general.mdc"),r=function(e,t,n){const s="---\ndescription: General Coding Rules\nglobs:\nalwaysApply: true\n---",i=Z(e,t,"Cursor",n);return`${s}\n\n${i}`}(e,n,i);await S.run(()=>j.generateFile(o,r))})}function Z(e,t,n,s){const i=e.isBun?"bun":"yarn",o=`\n## Project Information\n\n- Name: ${e.packageJson?.name}\n- Description: ${e.packageJson?.description}\n- Package Manager: ${i}\n\n## General Instructions\n\n${t.some(e=>e.depending.genI18nTs)?'- When introducing new string literals in React components, update the language resource files in the `i18n` directory (e.g., `i18n/ja-JP.json`). Reference these strings using the `i18n` utility. For example, use `i18n.pages.home.title()` for `{ "pages": { "home": { "title": "My App" } } }`.':""}\n- Do not write tests unless explicitly requested.\n- After making code changes, run \`${i} check-all-for-ai\` to execute all tests (note: this may take up to 30 minutes), or run \`${i} check-for-ai\` for type checking and linting only.\n - If you are confident your changes will not break any tests, you may use \`check-for-ai\`.\n- Once you have verified your changes, commit them to the current branch using the \`--no-verify\` option and push to the current branch.\n - Follow conventional commits, i.e., your commit message should start with \`feat:\`, \`fix:\`, etc.\n - Make sure to add a new line at the end of your commit message${e.isWillBoosterRepo?` with: \`Co-authored-by: WillBooster (${n}) <agent@willbooster.com>\``:""}.\n - Always create new commits. Avoid using \`--amend\`.\n${t.some(e=>e.hasStartTest)?`- Use \`${i} run start-test\` to launch a web server for debugging or testing.`:""}\n\n## Coding Style\n\n- Write comments that explain "why" rather than "what". Avoid explanations that can be understood from the code itself.\n- Use stderr for logging debug messages temporarily since stdout output is sometimes omitted.\n- When adding new functions or classes, define them below any functions or classes that call them to maintain clear call order.\n- Prefer \`undefined\` over \`null\` unless explicitly dealing with APIs or libraries that require \`null\`.\n- Always perform existence checks on array due to \`noUncheckedIndexedAccess: true\`.\n${t.some(e=>e.depending.react||e.depending.next)?"- Prefer `useImmer` for storing an array or an object to `useState`.":""}\n${t.some(e=>e.depending.next)?"- Since this project uses the React Compiler, you do not need to use `useCallback` or `useMemo` for performance optimization.":""}\n`.replaceAll(/\.\n\n+-/g,".\n-").replaceAll(/\n{3,}/g,"\n\n").trim();return s?o+"\n"+s.trimEnd():o}const ee=new class{getOrgAndName(e){const t=e.split(":").at(-1),n=t?.split("/");return[n?.at(-2)??"",n?.at(-1)?.replace(/.git$/,"")??""]}},te=new Map;function ne(e){const t=e??"",n=te.get(t);if(n)return n;const s=new m({auth:ie(e)||void 0});return te.set(t,s),s}function se(e){return!!ie(e)}function ie(e){return"WillBooster"===e?process.env.GH_BOT_PAT_FOR_WILLBOOSTER:"WillBoosterLab"===e?process.env.GH_BOT_PAT_FOR_WILLBOOSTERLAB:process.env.GH_BOT_PAT_FOR_WILLBOOSTER||process.env.GH_BOT_PAT_FOR_WILLBOOSTERLAB||process.env.GH_TOKEN||process.env.GITHUB_TOKEN}function oe(e,t,n,s=0){do{const[s,i,o]=ae(e,t,n);if(0===f.spawnSync(s,i,o).status)break}while(--s>=0)}function re(e,t,n){const[s,i,o]=ae(e,t,n);o.stdio="pipe";const r=f.spawnSync(s,i,o),a=r.stderr.toString().trim();return a&&console.error(`${s} [${i.map(e=>`"${e}"`).join(", ")}] outputs the following content to stderr:\n${a}`),r.stdout.toString().trim()}function ae(e,t,n){const s={...process.env};return s.PATH&&s.BERRY_BIN_FOLDER&&(s.PATH=s.PATH.replace(`${s.BERRY_BIN_FOLDER}:`,"")),s.ASDF_DIR&&(t=["-l","-c",`${e} ${t.join(" ")}`],e="bash"),[e,t,{cwd:n,env:s,shell:!1,stdio:"inherit"}]}function ce(e){const t=e.split(/[+.-]/).map(Number).filter(e=>!Number.isNaN(e));let n=0,s=1;for(const e of t)n+=e*s,s/=1e3;return n}const le="3.9.19",pe="zulu-11.74.15";async function de(n){return x.functionIgnoringException("generateToolVersions",async()=>{await async function(n){if(!n.versionsText)return;const s=n.versionsText.trim().split("\n").map(e=>{const[t,n]=e.trim().split(/\s+/);return`${ue.has(t??"")?" ":""}${t??""} ${n??""}`}).toSorted().map(e=>e.trim()).filter(e=>!e.startsWith("lefthook")),i=[...new Set(s)];if(n.doesContainPoetryLock){const e=await fetch("https://pypi.org/pypi/poetry/json"),t=await e.json(),n=t?.info?.version;n&&fe(i,"poetry",n),fe(i,"python",le,!0)}n.depending.firebase&&fe(i,"java",pe,!0);if(n.doesContainPackageJson)if(n.isBun){const e=await async function(e,t){try{const n=(await ne().request("GET /repos/{owner}/{repo}/releases/latest",{owner:e,repo:t})).data.tag_name,s=n.lastIndexOf("v"),i=-1===s?n:n.slice(s+1);return/^\d/.test(i)?i:void 0}catch(e){return void console.error("Failed to fetch Bun tags due to:",e)}}("oven-sh","bun");e&&fe(i,"bun",e)}else{const e=re("npm",["show","yarn","version"],n.dirPath);fe(i,"yarn",e)}for(const s of me){const i=t.resolve(n.dirPath,`.${s}-version`);e.promises.rm(i,{force:!0})}const o=t.resolve(n.dirPath,".tool-versions");await(i.length>0?S.run(()=>e.promises.writeFile(o,i.join("\n")+"\n")):S.run(()=>e.promises.rm(o,{force:!0}))),await S.promiseAll(),oe("asdf",["plugin","update","--all"],n.dirPath),oe("asdf",["install"],n.dirPath)}(n)})}const ue=new Set(["java","nodejs","bun","python"]),me=["java","node","python"];function fe(e,t,n,s=!1){const i=e.findIndex(e=>e.split(/\s+/)[0]===t),o=`${t} ${n}`;if(-1===i)e.splice(s?0:e.length,0,o);else{const[,t]=e[i].split(/\s+/);ce(n)>ce(t??"")&&(e[i]=o)}}async function ge(n){return x.functionIgnoringException("generateBiomeJsonc",async()=>{let s={root:n.isRoot,$schema:"./node_modules/@biomejs/biome/configuration_schema.json",extends:["@willbooster/biome-config"]};const i=t.resolve(n.dirPath,"biome.jsonc");try{const t=await e.promises.readFile(i,"utf8"),n=JSON.parse(t);s=l.all([s,n,s],{arrayMerge:L})}catch{}const o=JSON.stringify(s);await S.run(()=>j.generateFile(i,o))})}async function he(n){return x.functionIgnoringException("generateBunfigToml",async()=>{const s=t.resolve(n.dirPath,"bunfig.toml"),i=e.existsSync(s)&&e.readFileSync(s,"utf8").includes("exact = false")?'env = false\ntelemetry = false\n\n[install]\nexact = false\nlinker = "hoisted"\nminimumReleaseAge = 432000 # 5 days\nminimumReleaseAgeExcludes = [\n "@willbooster/babel-configs",\n "@willbooster/biome-config",\n "@willbooster/eslint-config-js",\n "@willbooster/eslint-config-js-react",\n "@willbooster/eslint-config-next",\n "@willbooster/eslint-config-ts",\n "@willbooster/eslint-config-ts-react",\n "@willbooster/prettier-config",\n "@willbooster/wb"\n]\n\n[run]\nbun = true\n':'env = false\ntelemetry = false\n\n[install]\nexact = true\nlinker = "hoisted"\nminimumReleaseAge = 432000 # 5 days\nminimumReleaseAgeExcludes = [\n "@willbooster/babel-configs",\n "@willbooster/biome-config",\n "@willbooster/eslint-config-js",\n "@willbooster/eslint-config-js-react",\n "@willbooster/eslint-config-next",\n "@willbooster/eslint-config-ts",\n "@willbooster/eslint-config-ts-react",\n "@willbooster/prettier-config",\n "@willbooster/wb"\n]\n\n[run]\nbun = true\n';await S.run(()=>j.generateFile(s,i))})}const ye="# Project-specific settings",we=/# Project-specific settings[^\n]*\n/gm,be="# Generated by wbfy",ve=`${ye} (head)\n\n\n${be}\n`,ke=`\n${ye} (tail)\n`,xe={separator:be,separatorPrefix:"# Generated by ",defaultHeadUserContent:ve,defaultTailUserContent:ke,async readGitignoreWithoutSeparators(t){try{let n=await e.promises.readFile(t,"utf8");const s=_e(n);return s>0&&(n=n.slice(0,s-1)),n.replaceAll(we,"").replaceAll(/# Generated by [^\n]*\n/gm,"").replaceAll(/\r?\n\r?\n(\r?\n)+/gm,"\n\n").trim()+"\n"}catch{}},getHeadUserContent(e){const t=e.indexOf(this.separatorPrefix);return-1!==t?e.slice(0,e.indexOf("\n",t)+1).replaceAll(we,`${ye} (head)\n`):ve},getTailUserContent(e){const t=_e(e);return t>0?e.slice(t-1):ke},async isBerryZeroInstallEnabled(t){try{return(await e.promises.readFile(t,"utf8")).includes("\n!.yarn/cache")}catch{return!1}}};function _e(e){const t=e.indexOf(ye),n=e.lastIndexOf(ye);return n>t?n:-1}async function je(n){return x.functionIgnoringException("generateDockerignore",async()=>{const s=t.resolve(n.dirPath,".dockerignore");if(n.doesContainDockerfile){const e=await j.readFileIgnoringError(s)??"",t=xe.getHeadUserContent(e)+"\n**/.idea\n**/*.sqlite3*\n**/.yarn/install-state.gz\n**/.venv\n"+xe.getTailUserContent(e);await S.run(()=>j.generateFile(s,t))}else await e.promises.rm(s,{force:!0})})}const Se={codeWith2IndentSize:["cjs","mjs","js","jsx","cts","mts","ts","tsx","json","json5","jsonc","cpp","dart","htm","html","pu","puml","rb","vue","xml","yaml","yml","sh"].toSorted(),codeWith4IndentSize:["go","gradle","java","py"].toSorted(),markdownLike:["md"].toSorted(),eslint:["cjs","mjs","js","cts","mts","ts","tsx","jsx"].toSorted(),prettier:["cjs","mjs","java","js","jsx","cts","mts","ts","tsx","json","json5","jsonc","css","htm","html","md","scss","vue","yaml","yml"].toSorted(),biome:["cjs","mjs","js","jsx","cts","mts","ts","tsx","json","json5","jsonc","htm","html","vue","svelte","astro","css","yaml","yml","gql"].toSorted()},Pe=`root = true\n\n[*]\ncharset = utf-8\nend_of_line = lf\ninsert_final_newline = true\ntrim_trailing_whitespace = true\n\n${Ce(Se.codeWith2IndentSize)}\nindent_size = 2\nindent_style = space\n\n${Ce(Se.codeWith4IndentSize)}\nindent_size = 4\nindent_style = space\n\n${Ce(Se.markdownLike)}\nmax_line_length = off\ntrim_trailing_whitespace = false\n\n[{Makefile,*.mk}]\nindent_style = tab\n`;async function $e(e){return x.functionIgnoringException("generateEditorconfig",async()=>{const n=t.resolve(e.dirPath,".editorconfig");await S.run(()=>j.generateFile(n,Pe))})}function Ce(e){return e.length>1?`[*.{${e.join(",")}}]`:`[*.${e[0]}]`}async function Fe(n){return x.functionIgnoringException("generateEslintrc",async()=>{await S.run(()=>e.promises.rm(t.resolve(n.dirPath,".eslintrc.json"),{force:!0})),await S.run(()=>e.promises.rm(t.resolve(n.dirPath,".eslintignore"),{force:!0})),await S.run(()=>e.promises.rm(t.resolve(n.dirPath,"eslint.config.js"),{force:!0}));const s=t.resolve(n.dirPath,"eslint.config.mjs");if(n.isBun)await S.run(()=>e.promises.rm(s,{force:!0}));else if(n.eslintBase){try{if(!(await e.promises.readFile(s,"utf8")).includes("export { default }"))return}catch{}await S.run(()=>j.generateFile(s,`export { default } from '${n.eslintBase}';`))}})}const Ee={have_fun:!0,code_review:{disable:!1,comment_severity_threshold:"MEDIUM",max_review_comments:-1,pull_request_opened:{help:!1,summary:!0,code_review:!0}},ignore_patterns:["**/__generated__"]};async function Be(n){return x.functionIgnoringException("generateGeminiConfig",async()=>{if(!n.isRoot)return;const s=t.resolve(n.dirPath,".gemini"),i=t.resolve(s,"config.yml"),o=t.resolve(s,"styleguide.md");let r=u(Ee);try{const t=await e.promises.readFile(i,"utf8"),n=d.load(t);r=l.all([r,n,r],{arrayMerge:L})}catch{}const a=d.dump(r,{lineWidth:-1,noCompatMode:!0,styles:{"!!null":"empty"}}),c=[S.run(()=>j.generateFile(i,a))];e.existsSync(o)||c.push(S.run(()=>j.generateFile(o,"日本語でレビューしてください。"))),await Promise.all(c)})}async function Oe(n){return x.functionIgnoringException("generateGeminiSettings",async()=>{if(!n.isRoot)return;const s=t.resolve(n.dirPath,".gemini"),i=t.resolve(s,"settings.json");await e.promises.rm(i,{force:!0})})}const Ie=`* text=auto\n\n*.lockb binary diff=lockb\n*.vcproj text eol=crlf\n\n${[...Se.codeWith2IndentSize,...Se.codeWith4IndentSize,...Se.markdownLike].map(e=>`*.${e} text eol=lf`).join("\n")}\n\ndist/** linguist-generated=true\n`;async function Ae(e){return x.functionIgnoringException("generateGitattributes",async()=>{const n=t.resolve(e.dirPath,".gitattributes");await S.run(()=>j.generateFile(n,Ie))})}const Te=["windows","macos","linux","jetbrains","visualstudiocode","emacs","vim","yarn"];async function De(e,n){return x.functionIgnoringException("generateGitignore",async()=>{const s=t.resolve(e.dirPath,".gitignore"),i=await j.readFileIgnoringError(s)??"";let o=xe.getHeadUserContent(i)+"\n!.keep\n.aider*\n.env.production\n*/mount/*.hash\n.devcontainer/\n.idea/AugmentWebviewStateStore.xml\n.idea/copilot.*\n.idea/copilot/chatSessions/\n.serena/\n.tmp/\n__generated__/\n@willbooster/\ndist/\ntemp/\ntmp/\n";const r=xe.getTailUserContent(i),a=[...Te];e.doesContainGemfile&&a.push("ruby"),e.doesContainGoMod&&(a.push("go"),o+=`${t.basename(e.dirPath)}\n`),e.doesContainPackageJson&&a.push("node"),e.doesContainPomXml&&(a.push("maven"),o+=".idea/google-java-format.xml\n"),e.doesContainPubspecYaml&&(a.push("flutter","AndroidStudio","ruby"),o+=".flutter-plugins-dependencies\nandroid/key.properties\nios/.bundle\n.idea/runConfigurations.xml\n"),e.doesContainTemplateYaml&&(o+=".aws-sam/\npackaged.yaml\n"),e.doesContainPoetryLock&&(a.push("python"),o+=".venv/\n"),e.depending.blitz&&(o+=".blitz/\n.blitz**\n"),e.depending.next&&a.push("nextjs"),(n.depending.firebase||e.depending.firebase)&&a.push("firebase"),e.depending.prisma&&(o+="*.sqlite3*\n"),e.depending.playwrightTest&&(o+="playwright-report/\ntest-results/\n"),(n.depending.reactNative||e.depending.reactNative)&&(a.push("reactnative"),o+="google-services.json\nandroid/app/src/main/assets/\n"),e.depending.storybook&&a.push("storybookjs"),e.depending.litestream&&(o+="gcp-sa-key.json\n");let c="";for(const e of a){let t=await Le(e)??"";if(!t){const n=`https://www.toptal.com/developers/gitignore/api/${e}`,s=await fetch(n),i=await s.text();if(!s.ok||i.includes("Attention Required!")||i.includes("<title>"))return void console.error(`Failed to fetch ${n}`);t=i.trim(),await S.run(()=>We(e,t)),k.isVerbose&&console.info(`Fetched ${n}`)}c&&(c+="\n"),c+=t+"\n"}await xe.isBerryZeroInstallEnabled(s)||(c=c.replace("!.yarn/cache","# !.yarn/cache").replace("# .pnp.*",".pnp.*")),(e.doesContainPomXml||e.doesContainPubspecYaml)&&(c=c.replaceAll(/^# .idea\/artifacts$/gm,".idea/artifacts").replaceAll(/^# .idea\/compiler.xml$/gm,".idea/compiler.xml").replaceAll(/^# .idea\/jarRepositories.xml$/gm,".idea/jarRepositories.xml").replaceAll(/^# .idea\/modules.xml$/gm,".idea/modules.xml").replaceAll(/^# .idea\/*.iml$/gm,".idea/*.iml").replaceAll(/^# .idea\/modules$/gm,".idea/modules").replaceAll(/^# *.iml$/gm,"*.iml").replaceAll(/^# *.ipr$/gm,"*.ipr"),e.doesContainPubspecYaml&&(c=c.replaceAll(/^.idea\/modules.xml$/gm,"# .idea/modules.xml"))),c=c.replaceAll(/^.idea\/?$/gm,"# .idea"),(n.depending.reactNative||e.depending.reactNative||e.doesContainPubspecYaml)&&(c=c.replaceAll(/^(.idea\/.+)$/gm,"$1\nandroid/$1"));const l=o+"\n"+c+r;await S.run(()=>j.generateFile(s,l))})}const Re=t.join(g.homedir(),".cache","wbfy","gitignore");async function We(n,s){await e.promises.mkdir(Re,{recursive:!0}),await e.promises.writeFile(t.join(Re,n),s)}async function Le(n){try{const s=await e.promises.stat(t.join(Re,n));if(Date.now()-s.mtimeMs>216e5)return;return await e.promises.readFile(t.join(Re,n),"utf8")}catch{}}function Ne(e,t){try{const n=`git@github.com:${e}/${t}.git`,s=re("git",["ls-remote",n,"HEAD"],process.cwd()).split(/\s+/)[0];if(!s)throw new Error(`No commits found for ${e}/${t}`);return Promise.resolve(s)}catch(n){return Promise.reject(new Error(`Failed to fetch commits for ${e}/${t}: ${String(n)}`))}}const Je={getLintFixSuffix:e=>e.doesContainJsxOrTsx?' --rule "{ react-hooks/exhaustive-deps: 0 }"':""},Ge=["eslint","eslint-config-flat-gitignore","eslint-config-prettier","eslint-plugin-import-x","eslint-plugin-sort-class-members","eslint-plugin-sort-destructure-keys","eslint-plugin-unicorn","eslint-plugin-unused-imports","globals"],ze=[...Ge,"typescript-eslint","eslint-import-resolver-typescript"],Ue=["eslint-plugin-react","eslint-plugin-react-hooks","eslint-plugin-react-compiler"],Me={"@willbooster/eslint-config-js":["@willbooster/eslint-config-js",...Ge],"@willbooster/eslint-config-js-react":["@willbooster/eslint-config-js-react",...Ge,...Ue],"@willbooster/eslint-config-ts":["@willbooster/eslint-config-ts",...ze],"@willbooster/eslint-config-ts-react":["@willbooster/eslint-config-ts-react",...ze,...Ue],"@willbooster/eslint-config-next":["@willbooster/eslint-config-next","eslint-config-next",...ze,...Ue]};async function qe(n,s,i){return x.functionIgnoringException("generatePackageJson",async()=>{await async function(n,s,i){const r=t.resolve(n.dirPath,"package.json"),a=await e.promises.readFile(r,"utf8"),c=JSON.parse(a);c.scripts=c.scripts??{},c.dependencies=c.dependencies??{},c.devDependencies=c.devDependencies??{},c.peerDependencies=c.peerDependencies??{};const p=n.isBun?"bun":"yarn";await async function(t){"WillBooster LLC"===t.author&&(t.author="WillBooster Inc.");delete t.scripts["sort-package-json"],delete t.scripts["sort-all-package-json"],delete t.scripts["typecheck/warn"],delete t.scripts["typecheck:gen-code"],delete t.scripts["typecheck:codegen"],delete t.dependencies.tslib,delete t.devDependencies["@willbooster/eslint-config"],delete t.devDependencies["@willbooster/eslint-config-react"],delete t.devDependencies["@willbooster/renovate-config"],delete t.devDependencies["@willbooster/tsconfig"],delete t.devDependencies["eslint-import-resolver-node"],delete t.devDependencies["eslint-plugin-prettier"],delete t.devDependencies.lerna,delete t.devDependencies.pinst,delete t.scripts["flutter-format"],delete t.scripts["format-flutter"],delete t.scripts["python-format"],delete t.scripts["format-python"],delete t.scripts.prettier,delete t.scripts["check-all"],await S.run(()=>e.promises.rm("lerna.json",{force:!0})),delete t.devDependencies["@typescript-eslint/eslint-plugin"],delete t.devDependencies["@typescript-eslint/parser"],delete t.devDependencies["eslint-plugin-import"]}(c);for(const[e,t]of Object.entries(c.scripts))t.includes("git clone")||(c.scripts[e]=t.replace(/yarn\s*&&\s*/,"").replace(/yarn\s*install\s*&&\s*/,""));c.scripts=l(c.scripts,He(n,c.scripts)),"check-for-ai"in c.scripts&&("gen-code"in c.scripts&&(c.scripts["check-for-ai"]=`${p} gen-code > /dev/null && ${c.scripts["check-for-ai"]}`),c.scripts["check-for-ai"]=`${p} install > /dev/null && ${c.scripts["check-for-ai"]}`);n.isBun?delete c.scripts.prettify:c.scripts.prettify=(c.scripts.prettify??"")+await async function(n){const s=t.resolve(n,".prettierignore"),i=await e.promises.readFile(s,"utf8"),o=i.indexOf(xe.separatorPrefix);if(-1===o)return"";const r=i.slice(0,o);return`${r.split("\n").map(e=>{const t=e.trim();return t.endsWith("/")?t.slice(0,-1):t}).filter(e=>e&&!e.startsWith("#")&&!e.includes("/")).map(e=>` "!**/${e}/**"`).join("")} || true`}(n.dirPath);for(const[e,t]of Object.entries(c.scripts))t?.includes("yarn workspaces foreach")&&(t.includes("--all")||t.includes("--recursive")||t.includes("--since")||t.includes("--worktree")||(c.scripts[e]=t.replace("yarn workspaces foreach","yarn workspaces foreach --all")));let d=[],u=["prettier","sort-package-json"];const m=[];e.existsSync(t.join(s.dirPath,".prettierrc.json"))||e.existsSync(t.join(n.dirPath,".prettierrc.json"))||(c.prettier="@willbooster/prettier-config",u.push("prettier-plugin-java","@willbooster/prettier-config"));n.isBun?delete c.devDependencies["lint-staged"]:u.push("lint-staged");if(n.isRoot){if(n.isBun?(delete c.devDependencies.husky,delete c.devDependencies.pinst,c.scripts.prepare="lefthook install || true",u.push("lefthook")):(u.push("husky"),c.scripts.prepare="husky || true",c.scripts.postinstall="husky || true",(n.isPublicRepo||n.isReferredByOtherRepo)&&(u.push("pinst"),c.scripts.prepack="pinst --disable",c.scripts.postpack="pinst --enable")),n.depending.semanticRelease&&(c.devDependencies["semantic-release"]||c.devDependencies["multi-semantic-release"]||c.devDependencies["@qiwi/multi-semantic-release"]||u.push("semantic-release"),c.version="0.0.0-semantically-released"),n.depending.playwrightTest){c.dependencies.artillery||c.devDependencies.artillery||c.dependencies["@playwright/test"]||(u.push("@playwright/test"),delete c.dependencies["@playwright/test"]),delete c.dependencies.playwright,delete c.devDependencies.playwright}n.doesContainSubPackageJsons?c.workspaces=Array.isArray(c.workspaces)?l.all([c.workspaces,["packages/*"]],{arrayMerge:N}):["packages/*"]:Array.isArray(c.workspaces)&&(c.workspaces=c.workspaces.filter(e=>o.globSync(e,{dot:!0,cwd:n.dirPath,ignore:T}).length>0),0===c.workspaces.length&&delete c.workspaces)}if(n.depending.wb||n.isBun){c.dependencies["@willbooster/wb"]?d.push(c.dependencies["@willbooster/wb"].startsWith("10.")?"@willbooster/wb@10.7.1":"@willbooster/wb"):u.push(c.devDependencies["@willbooster/wb"]?.startsWith("10.")?"@willbooster/wb@10.7.1":"@willbooster/wb");for(const[e,t]of Object.entries(c.scripts))c.scripts[e]=t.replace(/wb\s+db/,"wb prisma")}(n.doesContainJavaScript||n.doesContainJavaScriptInPackages||n.doesContainTypeScript||n.doesContainTypeScriptInPackages)&&(n.isBun?(u.push("@biomejs/biome","@willbooster/biome-config"),delete c.devDependencies.eslint,delete c.devDependencies.micromatch,delete c.devDependencies["typescript-eslint"]):u.push("eslint","micromatch"));(n.doesContainTypeScript||n.doesContainTypeScriptInPackages)&&(u.push("typescript"),n.isBun&&u.push("@types/bun"));n.eslintBase&&u.push(...Me[n.eslintBase]);n.isWillBoosterConfigs&&(d=d.filter(e=>!e.includes("@willbooster/")),u=u.filter(e=>!e.includes("@willbooster/")));c.name||(c.name=t.basename(n.dirPath));n.doesContainSubPackageJsons&&(c.private=!0);c.license||(c.license="UNLICENSED");!c.private&&"UNLICENSED"!==c.license&&s.isPublicRepo&&(c.publishConfig??={},c.publishConfig.access??="public");const[f]=ee.getOrgAndName(n.repository??"");"WillBooster"!==f&&"WillBoosterLab"!==f||(c.author="WillBooster Inc.");n.isRoot||!c.private||c.main||(c.main="./src");if(delete c.resolutions?.["npm/chalk"],!n.doesContainSubPackageJsons){if(!n.isBun)if(n.doesContainJavaScript||n.doesContainTypeScript)c.scripts["lint-fix"]=(c.scripts["lint-fix"]??"")+Je.getLintFixSuffix(n);else{delete c.scripts.lint,delete c.scripts["lint-fix"];for(const e of["cleanup","check-for-ai"]){const t=c.scripts[e];t&&(c.scripts[e]=t.replace(/ ?&& ?yarn lint-fix(?: --quiet)?/,""))}}if(n.doesContainPubspecYaml){c.scripts.lint="flutter analyze",c.scripts["lint-fix"]="yarn lint";const s=["lib","test","test_driver"].filter(s=>e.existsSync(t.resolve(n.dirPath,s)));s.length>0&&(c.scripts["format-code"]=`dart format $(find ${s.join(" ")} -name generated -prune -o -name '*.freezed.dart' -prune -o -name '*.g.dart' -prune -o -name '*.dart' -print)`,c.scripts.format=(c.scripts.format??"")+" && yarn format-code")}if(n.doesContainPoetryLock){"poetry install"===c.scripts.postinstall&&delete c.scripts.postinstall;const e=await o.glob("**/*.py",{cwd:n.dirPath,dot:!0,ignore:T}),t=new Set;for(const n of e){const[e,s]=n.split(/[/\\]/);e&&s&&t.add(e)}if(t.size>0){const e=[...t].join(" ");c.scripts["format-code"]=`poetry run isort --profile black ${e} && poetry run black ${e}`,c.scripts.lint?c.scripts.lint=`poetry run flake8 ${e} && ${c.scripts.lint}`:(c.scripts.lint=`poetry run flake8 ${e}`,c.scripts["lint-fix"]="yarn lint"),c.scripts.format=(c.scripts.format??"")+" && yarn format-code",m.push("black","isort","flake8")}}n.repository&&(c.repository=n.repository)}n.depending.blitz?c.scripts["gen-code"]?.startsWith("blitz codegen")?c.scripts["gen-code"].includes("blitz prisma generate")||(c.scripts["gen-code"]=c.scripts["gen-code"].replace("blitz codegen","blitz codegen && blitz prisma generate")):c.scripts["gen-code"]="blitz codegen":n.depending.prisma&&!c.scripts["gen-code"]?.startsWith("prisma generate")&&(c.scripts["gen-code"]="prisma generate");c.dependencies.prettier||delete c.devDependencies["@types/prettier"];0===Object.keys(c.dependencies).length&&delete c.dependencies;0===Object.keys(c.devDependencies).length&&delete c.devDependencies;0===Object.keys(c.peerDependencies).length&&delete c.peerDependencies;await async function(e){e.dependencies=e.dependencies??{},e.devDependencies=e.devDependencies??{};const t=new Set([...Object.keys(e.dependencies),...Object.keys(e.devDependencies)]);if(t.has("@willbooster/auth")&&!Ye(e,"@willbooster/auth")){delete e.devDependencies["@willbooster/auth"];const t=await Ne("WillBoosterLab","auth");e.dependencies["@willbooster/auth"]=`git@github.com:WillBoosterLab/auth.git#${t}`}if(t.has("@discord-bot/shared")&&!Ye(e,"@discord-bot/shared")){delete e.devDependencies["@discord-bot/shared"];const t=await Ne("WillBoosterLab","discord-bot");e.dependencies["@discord-bot/shared"]=`git@github.com:WillBoosterLab/discord-bot.git#${t}`}if(t.has("@willbooster/code-analyzer")&&!Ye(e,"@willbooster/code-analyzer")){delete e.dependencies["@willbooster/code-analyzer"];const t=await Ne("WillBoosterLab","code-analyzer");e.devDependencies["@willbooster/code-analyzer"]=`git@github.com:WillBoosterLab/code-analyzer.git#${t}`}if(t.has("@willbooster/judge")&&!Ye(e,"@willbooster/judge")){delete e.devDependencies["@willbooster/judge"];const t=await Ne("WillBoosterLab","judge");e.dependencies["@willbooster/judge"]=`git@github.com:WillBoosterLab/judge.git#${t}`}if(t.has("@willbooster/llm-proxy")&&!Ye(e,"@willbooster/llm-proxy")){delete e.devDependencies["@willbooster/llm-proxy"];const t=await Ne("WillBoosterLab","llm-proxy");e.dependencies["@willbooster/llm-proxy"]=`git@github.com:WillBoosterLab/llm-proxy.git#${t}`}}(c),n.isBun&&delete c.packageManager;let g=JSON.stringify(c);g=await async function(n,s,i){const r=[];for(const[e]of Object.keys(n))e&&!e.startsWith(":")&&e.includes(":")&&r.push([e,e.replaceAll(":","-")]);if(0===r.length)return s;for(const[e,t]of r)s=s.replaceAll(e,t);const a=await o.glob(["**/*.{md,cjs,mjs,js,jsx,cts,mts,ts,tsx}","**/Dockerfile"],{cwd:i.dirPath,dot:!0,ignore:T});for(const n of a)await S.run(async()=>{const s=t.join(i.dirPath,n),o=await e.promises.readFile(s,"utf8");let a=o;for(const[e,t]of r)a=a.replaceAll(e,t);a!==o&&await e.promises.writeFile(s,a)});return await S.promiseAll(),s}(c.scripts,g,n),await e.promises.writeFile(r,g),i||(d=d.filter(e=>!c.devDependencies?.[e]),d.length>0&&(n.isBun?(oe(p,["remove",...new Set(d)],n.dirPath),oe(p,["add","--exact",...new Set(d)],n.dirPath)):oe(p,["add",...new Set(d)],n.dirPath)),u=u.filter(e=>!c.dependencies?.[e]),u.length>0&&(n.isBun?(oe(p,["remove",...new Set(u)],n.dirPath),oe(p,["add","-D","--exact",...new Set(u)],n.dirPath)):oe(p,["add","-D",...new Set(u)],n.dirPath)),m.length>0&&oe("poetry",["add","--group","dev",...new Set(m)],n.dirPath))}(n,s,i)})}function He(e,t){if(e.isBun){const t=e.doesContainTypeScript||e.doesContainTypeScriptInPackages,n={"check-all-for-ai":"bun run check-for-ai && bun run test --silent","check-for-ai":"bun run cleanup"+(t?" && bun run typecheck":""),cleanup:"bun --bun wb lint --fix --format",format:"bun --bun wb lint --format",lint:"bun --bun wb lint","lint-fix":"bun --bun wb lint --fix",test:"bun wb test",typecheck:"bun --bun wb typecheck"};return t||delete n.typecheck,n}{const n=e.doesContainTypeScript||e.doesContainTypeScriptInPackages,s=t.test;let i={"check-all-for-ai":"yarn check-for-ai && yarn test","check-for-ai":"yarn format > /dev/null 2> /dev/null || true && yarn lint-fix --quiet"+(n?" && yarn typecheck":""),cleanup:"yarn format && yarn lint-fix",format:"sort-package-json && yarn prettify",lint:"eslint --color","lint-fix":"yarn lint --fix",prettify:`prettier --cache --color --write "**/{.*/,}*.{${Se.prettier.join(",")}}" "!**/test{-,/}fixtures/**"`,typecheck:"tsc --noEmit --Pretty"};return e.doesContainSubPackageJsons?i=l({...i},{format:"sort-package-json && yarn prettify && yarn workspaces foreach --all --parallel --verbose run format",lint:"yarn workspaces foreach --all --parallel --verbose run lint","lint-fix":"yarn workspaces foreach --all --parallel --verbose run lint-fix",prettify:`prettier --cache --color --write "**/{.*/,}*.{${Se.prettier.join(",")}}" "!**/packages/**" "!**/test{-,/}fixtures/**"`,test:"CI=1 FORCE_COLOR=3 yarn workspaces foreach --all --verbose run test",typecheck:"yarn workspaces foreach --all --parallel --verbose run typecheck"}):e.depending.pyright&&(i.typecheck=i.typecheck?`${i.typecheck} && `:"",i.typecheck+="pyright"),s?.includes("wb test")&&(i.test=s,i["check-all-for-ai"]=(i["check-all-for-ai"]??"")+" --silent"),n?e.depending.wb&&(i.typecheck="wb typecheck"):delete i.typecheck,i}}function Ye(e,t){return(e.devDependencies?.[t]||e.dependencies?.[t]||"").includes("workspace")}const Ke={preCommit:"node node_modules/.bin/lint-staged",prePush:"yarn typecheck",prePushForLab:'\nif [ $(git branch --show-current) = "main" ]; then\n echo "************************************************"\n echo "*** Don\'t push main branch directly. Use PR! ***"\n echo "************************************************"\n exit 1\nfi\n\nyarn typecheck\n'.trim(),prePushForLabExceptAdmin:'\nif [ $(git branch --show-current) = "main" ] && [ $(git config user.email) != "exkazuu@gmail.com" ]; then\n echo "************************************************"\n echo "*** Don\'t push main branch directly. Use PR! ***"\n echo "************************************************"\n exit 1\nfi\n\nyarn typecheck\n'.trim(),postMerge:'\nchanged_files="$(git diff-tree -r --name-only --no-commit-id ORIG_HEAD HEAD)"\n\nrun_if_changed() {\n if echo "$changed_files" | grep --quiet -E "$1"; then\n eval "$2"\n fi\n}\n'.trim()};async function Ve(n){return x.functionIgnoringException("generateHuskyrcUpdatingPackageJson",async()=>{await async function(n){const s=t.resolve(n.dirPath,"package.json"),i=await e.promises.readFile(s,"utf8"),o=JSON.parse(i);o.scripts??={},delete o.scripts.postinstall,delete o.scripts.postpublish,delete o.scripts.prepare,delete o.scripts.prepublishOnly,delete o.scripts.prepack,delete o.scripts.postpack;const r=t.resolve(n.dirPath,".husky");if(await e.promises.writeFile(s,JSON.stringify(o,void 0,2)),n.isBun)return await e.promises.rm(r,{force:!0,recursive:!0}),void oe("git",["config","--unset","core.hooksPath"],n.dirPath);oe("yarn",["dlx","husky","init"],n.dirPath);const a=t.resolve(r,"pre-commit");await S.run(()=>e.promises.rm(t.resolve(n.dirPath,".huskyrc.json"),{force:!0})),await S.run(()=>e.promises.writeFile(a,Ke.preCommit+"\n"));const{typecheck:c}=He(n,{});if(c){let s=n.repository?.startsWith("github:WillBoosterLab/")?n.repository.toLocaleLowerCase().includes("exercode")?Ke.prePushForLab:Ke.prePushForLabExceptAdmin:Ke.prePush;s=s.replace("yarn typecheck",c.replace("tsc ","node node_modules/.bin/tsc ").replace("wb ","node node_modules/.bin/wb ").replace("pyright","node node_modules/.bin/pyright")),await S.run(()=>e.promises.writeFile(t.resolve(r,"pre-push"),s+"\n",{mode:493}))}const l=`${Ke.postMerge}\n\n${Xe(n).join("\n")}\n`;await S.run(()=>e.promises.writeFile(t.resolve(r,"post-merge"),l,{mode:493}))}(n)})}function Xe(e){const t=[];e.versionsText&&t.push(String.raw`run_if_changed "\..+-version" "awk '{print \$1}' .tool-versions | xargs -I{} asdf plugin add {}"`,String.raw`run_if_changed "\..+-version" "asdf plugin update --all"`),e.versionsText?.includes("python ")&&t.push(String.raw`run_if_changed "\..+-version" "asdf install python"`),e.versionsText&&t.push(String.raw`run_if_changed "\..+-version" "asdf install"`);const n=e.isBun?"bun install":"yarn",s=e.depending.blitz||e.depending.next?" && rm -Rf .next":"";return t.push(String.raw`run_if_changed "package\.json" "${n}${s}"`),e.doesContainPoetryLock&&t.push(String.raw`run_if_changed "poetry\.lock" "poetry install"`),e.depending.blitz?t.push(String.raw`run_if_changed ".*\.prisma" "node node_modules/.bin/blitz prisma migrate deploy"`,String.raw`run_if_changed ".*\.prisma" "node node_modules/.bin/blitz prisma generate"`,String.raw`run_if_changed ".*\.prisma" "node node_modules/.bin/blitz codegen"`):e.depending.prisma&&t.push(String.raw`run_if_changed ".*\.prisma" "node node_modules/.bin/dotenv -c development -- node node_modules/.bin/prisma migrate deploy"`,String.raw`run_if_changed ".*\.prisma" "node node_modules/.bin/dotenv -c development -- node node_modules/.bin/prisma generate"`),t}function Qe(e,t,n,s){return` <TaskOptions isEnabled="true">\n <option name="arguments" value="${t} $FilePathRelativeToProjectRoot$" />\n <option name="checkSyntaxErrors" value="false" />\n <option name="description" />\n <option name="exitCodeBehavior" value="ERROR" />\n <option name="fileExtension" value="${s}" />\n <option name="immediateSync" value="false" />\n <option name="name" value="${n} (.${s})" />\n <option name="output" value="$FilePathRelativeToProjectRoot$" />\n <option name="outputFilters">\n <array />\n </option>\n <option name="outputFromStdout" value="false" />\n <option name="program" value="${e}" />\n <option name="runOnExternalChanges" value="false" />\n <option name="scopeName" value="Project Files" />\n <option name="trackOnlyRoot" value="false" />\n <option name="workingDir" value="$ProjectFileDir$" />\n <envs />\n </TaskOptions>\n`}const Ze=`<?xml version="1.0" encoding="UTF-8"?>\n<project version="4">\n <component name="ProjectTasksOptions">\n${Se.prettier.map(e=>Qe("node","node_modules/.bin/prettier --cache --write","Prettier",e)).join("")}\n </component>\n</project>\n`,et=`<?xml version="1.0" encoding="UTF-8"?>\n<project version="4">\n <component name="ProjectTasksOptions">\n${Se.prettier.map(e=>Qe("bun","--bun node_modules/.bin/biome check --fix --no-errors-on-unmatched --skip-parse-errors","Biome",e)).join("")}\n </component>\n</project>\n`;async function tt(n){return x.functionIgnoringException("generateIdeaSettings",async()=>{const s=t.resolve(n.dirPath,".idea");if(e.existsSync(s)){const i=t.resolve(s,"watcherTasks.xml");await(n.doesContainJavaScript||n.doesContainJavaScriptInPackages||n.doesContainTypeScript||n.doesContainTypeScriptInPackages||n.doesContainPackageJson&&!n.doesContainPubspecYaml&&!n.doesContainGemfile&&!n.doesContainGoMod&&!n.doesContainPomXml?S.run(()=>j.generateFile(i,n.isBun?et:Ze)):S.run(()=>e.promises.rm(i,{force:!0})))}})}const nt={"post-merge":{scripts:{"prepare.sh":{runner:"bash"}}},"pre-commit":{commands:{cleanup:{glob:"*.{cjs,css,cts,htm,html,js,json,json5,jsonc,jsx,md,mjs,mts,scss,ts,tsx,vue,yaml,yml}",run:"bun --bun wb lint --fix --format {staged_files} && git add {staged_files}"},"check-migrations":{glob:"**/migration.sql",run:"\nif grep -q 'Warnings:' {staged_files}; then\n echo \"Migration SQL files ({staged_files}) contain warnings! Please solve the warnings and commit again.\"\n exit 1\nfi\n".trim()}}},"pre-push":{scripts:{"check.sh":{runner:"bash"}}}},st={prePush:"bun --bun node_modules/.bin/wb typecheck",prePushForLab:'\n#!/bin/bash\n\nif [ $(git branch --show-current) = "main" ] && [ $(git config user.email) != "exkazuu@gmail.com" ]; then\n echo "************************************************"\n echo "*** Don\'t push main branch directly. Use PR! ***"\n echo "************************************************"\n exit 1\nfi\n\nbun --bun node_modules/.bin/wb typecheck\n'.trim(),postMerge:'\n#!/bin/bash\n\nchanged_files="$(git diff-tree -r --name-only --no-commit-id ORIG_HEAD HEAD)"\n\nrun_if_changed() {\n if echo "$changed_files" | grep --quiet -E "$1"; then\n eval "$2"\n fi\n}\n'.trim()};async function it(n){return x.functionIgnoringException("generateLefthookUpdatingPackageJson",async()=>{await async function(n){const s=t.resolve(n.dirPath,".lefthook"),{typecheck:i}=He(n,{}),o={...nt};i||delete o["pre-push"];if(await Promise.all([e.promises.writeFile(t.join(n.dirPath,"lefthook.yml"),d.dump(o,{lineWidth:-1,noCompatMode:!0,styles:{"!!null":"empty"}})),e.promises.rm(s,{force:!0,recursive:!0})]),i){const i=n.repository?.startsWith("github:WillBoosterLab/")?st.prePushForLab:st.prePush;e.mkdirSync(t.join(s,"pre-push"),{recursive:!0}),await S.run(()=>e.promises.writeFile(t.join(s,"pre-push","check.sh"),i+"\n",{mode:493}))}const r=`${st.postMerge}\n\n${Xe(n).join("\n")}\n`;e.mkdirSync(t.join(s,"post-merge"),{recursive:!0}),await S.run(()=>e.promises.writeFile(t.resolve(s,"post-merge","prepare.sh"),r,{mode:493}))}(n)})}const ot={node:["src","test","scripts"].toSorted(),blitz:["src","test","scripts","db","integrations","mailers"].toSorted()};async function rt(n){return x.functionIgnoringException("generateLintstagedrc",async()=>{await async function(n){const s=t.resolve(n.dirPath,".lintstagedrc.cjs");if(n.isBun)return void await S.run(()=>e.promises.rm(s,{force:!0}));const i=n.isRoot?"node node_modules/.bin/":"node ../../node_modules/.bin/",o=[];if(n.doesContainJavaScript||n.doesContainTypeScript){const e=`\n '${at(n)}': [${JSON.stringify(`${i}eslint --fix${Je.getLintFixSuffix(n)}`)}, '${i}prettier --cache --write'],`;o.push(e)}const r=n.isRoot?" && !file.includes('/packages/')":"";o.push(`\n './**/*.{${Se.prettier.join(",")}}': files => {\n let filteredFiles = files.filter(file => !file.includes('/test-fixtures/') && !file.includes('/test/fixtures/')${r});${function(e){return e.doesContainJavaScript||e.doesContainTypeScript?`\n\n filteredFiles = filteredFiles.map((file) => path.relative('', file));\n filteredFiles = micromatch.not(filteredFiles, '${at(e)}');\n filteredFiles = filteredFiles.map((file) => path.resolve(file));`:""}(n)}\n if (filteredFiles.length === 0) return [];\n const commands = [\`${i}prettier --cache --write \${filteredFiles.join(' ')}\`];\n if (filteredFiles.some(file => file.endsWith('package.json'))) {\n commands.push('${i}sort-package-json');\n }\n return commands;\n },\n './**/migration.sql': (files) => {\n for (const file of files) {\n const content = fs.readFileSync(file, 'utf-8');\n if (content.includes('Warnings:')) {\n return [\n \`echo '!!! Migration SQL file (\${path.relative('', file)}) contains warnings !!! Solve the warnings and commit again.'\`,\n 'false',\n ];\n }\n }\n return [];\n},`),n.doesContainPubspecYaml&&o.push("\n './{lib,test,test_driver}/**/*.dart': files => {\n const filteredFiles = files.filter(file => !file.includes('generated'))\n .filter(file => !file.endsWith('.freezed.dart') && !file.endsWith('.g.dart'));\n if (filteredFiles.length === 0) return [];\n return [`dart format ${filteredFiles.join(' ')}`];\n },");n.doesContainPoetryLock&&o.push("\n './**/*.py': [\n 'poetry run isort --profile black --filter-files',\n 'poetry run black',\n 'poetry run flake8'\n ],");const a=`const fs = require('fs');\nconst path = require('path');\n${n.doesContainJavaScript||n.doesContainTypeScript?"const micromatch = require('micromatch');\n":""}\nmodule.exports = {${o.join("")}\n};\n`;await S.run(()=>e.promises.rm(t.resolve(n.dirPath,".lintstagedrc.js"),{force:!0})),await S.run(()=>e.promises.rm(t.resolve(n.dirPath,".lintstagedrc.json"),{force:!0})),await S.run(()=>j.generateFile(s,a))}(n)})}function at(e){const t=function(e){return e.depending.blitz?ot.blitz:ot.node}(e).map(e=>`${e}/**/`);return`{,${t.join(",")}}*.{${Se.eslint.join(",")}}`}async function ct(e){return x.functionIgnoringException("generatePrettierignore",async()=>{const n=t.resolve(e.dirPath,".prettierignore"),s=await j.readFileIgnoringError(n)??"",i=xe.getHeadUserContent(s),o=xe.getTailUserContent(s),r=t.resolve(e.dirPath,".gitignore"),a=await xe.readGitignoreWithoutSeparators(r)||"";let c="";e.doesContainPubspecYaml&&(c="\nandroid/app/\nios/Runner/Assets.xcassets/\npubspec.yaml\n");const l=i+"\n3rd-party/\nandroid/\nios/\nno-format/\ntest-fixtures/\ntest/fixtures/\n*.d.ts\n*.min.js\n.yarn/\n.pnp.js\n"+c+a+o;await S.run(()=>j.generateFile(n,l))})}const lt={venvPath:".",venv:".venv"};async function pt(n){return x.functionIgnoringException("generatePyrightConfigJson",async()=>{let s=u(lt);const i=t.resolve(n.dirPath,"pyrightconfig.json");try{const t=await e.promises.readFile(i,"utf8"),n=JSON.parse(t);s=l.all([s,n,s],{arrayMerge:L})}catch{}const o=JSON.stringify(s);await S.run(()=>j.generateFile(i,o))})}async function dt(n){return x.functionIgnoringException("generateReadme",async()=>{const s=t.resolve(n.dirPath,"README.md");let i=await e.promises.readFile(s,"utf8");e.existsSync(t.resolve(n.dirPath,".releaserc.json"))&&(i=ut(i,"[![semantic-release](https://img.shields.io/badge/%20%20%F0%9F%93%A6%F0%9F%9A%80-semantic--release-e10079.svg)](https://github.com/semantic-release/semantic-release)"));const o=n.repository?.slice(n.repository.indexOf(":")+1),r=e.readdirSync(`${n.dirPath}/.github/workflows`);for(const s of r){if(!s.startsWith("test")&&!s.startsWith("deploy"))continue;let r=s;r=(r[0]||"").toUpperCase()+r.slice(1,r.indexOf(".")),r=r.replace("-"," ");const a=`[![${r}](https://github.com/${o}/actions/workflows/${s}/badge.svg)](https://github.com/${o}/actions/workflows/${s})`;e.existsSync(t.resolve(n.dirPath,`.github/workflows/${s}`))&&(i=ut(i,a))}await S.run(()=>j.generateFile(s,i))})}function ut(e,t){e=e.replace(t,"").replaceAll(/\n\n\n+/g,"\n\n");for(let n=0;n<e.length;n++)if("\n"===e[n-1]&&"\n"===e[n]){const s=e.slice(0,n+1);let i=e.slice(n+1);return i.startsWith("[")||i.startsWith("!")||(i=`\n${i}`),`${s}${t}\n${i}`}return`${e}\n${t}\n`}async function mt(n){return x.functionIgnoringException("generateReleaserc",async()=>{const s=t.resolve(n.dirPath,".releaserc.json");if(!e.existsSync(s))return;const i=JSON.parse(await e.promises.readFile(s,"utf8")),o=i.plugins??[];for(let e=0;e<o.length;e++){const t=Array.isArray(o[e])?o[e]?.[0]:o[e],n=Array.isArray(o[e])&&o[e]?.[1]||{};if("@semantic-release/commit-analyzer"===t)o[e]=["@semantic-release/commit-analyzer",l.all([n,{preset:"conventionalcommits"}],{arrayMerge:L})];else if("@semantic-release/github"===t){const{failComment:t,successComment:s,...i}=n;o[e]=["@semantic-release/github",l.all([i,{successCommentCondition:!1,failCommentCondition:!1,labels:["r: semantic-release"],releasedLabels:["released :bookmark:"]}],{arrayMerge:L})]}}const r=JSON.stringify(i);await S.run(()=>j.generateFile(s,r))})}const ft={$schema:"https://docs.renovatebot.com/renovate-schema.json",extends:["github>WillBooster/willbooster-configs:renovate.json5"]};async function gt(n){return x.functionIgnoringException("generateRenovateJson",async()=>{let s=u(ft);const i=t.resolve(n.dirPath,"renovate.json");if(e.existsSync(`${i}5`))return;try{const t=await e.promises.readFile(i,"utf8"),n=JSON.parse(t);s=l.all([s,n,s],{arrayMerge:L}),s.extends=s.extends.filter(e=>"@willbooster"!==e)}catch{}n.depending.blitz&&(s.packageRules??=[],s.packageRules.some(e=>e.matchPackageNames?.includes("next"))||s.packageRules.push({matchPackageNames:["next"],enabled:!1})),await S.run(()=>e.promises.rm(t.resolve(n.dirPath,".dependabot"),{force:!0})),await S.run(()=>e.promises.rm(t.resolve(n.dirPath,".renovaterc.json"),{force:!0}));const o=JSON.stringify(s);await S.run(()=>j.generateFile(i,o))})}const ht={compilerOptions:{target:"ES2022",module:"ESNext",moduleResolution:"Node",jsx:"react-jsx",alwaysStrict:!0,strict:!0,noUncheckedIndexedAccess:!0,skipLibCheck:!0,allowSyntheticDefaultImports:!0,esModuleInterop:!0,resolveJsonModule:!0,declaration:!0,sourceMap:!0,importHelpers:!1,erasableSyntaxOnly:!0,outDir:"dist",typeRoots:["./node_modules/@types","./@types"]},exclude:["packages/*/test/fixtures","test/fixtures"],include:["packages/*/scripts/**/*","packages/*/src/**/*","packages/*/test/**/*","scripts/**/*","src/**/*","test/**/*"]},yt={compilerOptions:{target:"ES2022",module:"ESNext",moduleResolution:"Node",jsx:"react-jsx",alwaysStrict:!0,strict:!0,noUncheckedIndexedAccess:!0,skipLibCheck:!0,allowSyntheticDefaultImports:!0,esModuleInterop:!0,resolveJsonModule:!0,declaration:!0,sourceMap:!0,importHelpers:!1,erasableSyntaxOnly:!0,outDir:"dist",typeRoots:["../../node_modules/@types","../../@types","./@types"]},exclude:["test/fixtures"],include:["scripts/**/*","src/**/*","test/**/*"]};async function wt(n){return x.functionIgnoringException("generateTsconfig",async()=>{if(n.depending.blitz||n.depending.next)return;let s=u(n.isRoot?ht:yt);n.doesContainJsxOrTsx||n.doesContainJsxOrTsxInPackages||delete s.compilerOptions?.jsx,n.isRoot&&!n.doesContainSubPackageJsons&&(s.include=s.include?.filter(e=>!e.startsWith("packages/*/")),s.exclude=s.exclude?.filter(e=>!e.startsWith("packages/*/"))),n.isEsmPackage&&(s.compilerOptions={...s.compilerOptions,module:"NodeNext",moduleResolution:"NodeNext"});const i=t.resolve(n.dirPath,"tsconfig.json");try{const t=await e.promises.readFile(i,"utf8"),o=JSON.parse(t);"./node_modules/@willbooster/tsconfig/tsconfig.json"===o.extends&&delete o.extends,delete s.compilerOptions?.target,n.isEsmPackage||(delete s.compilerOptions?.module,delete s.compilerOptions?.moduleResolution),o.compilerOptions?.jsx&&delete s.compilerOptions?.jsx,s=l.all([s,o,s],{arrayMerge:N}),s.include=s.include?.filter(e=>!e.includes("@types")&&!e.includes("__tests__/")&&!e.includes("tests/"))}catch{}J(s),s.include?.sort();const o=JSON.stringify(s);delete s.compilerOptions?.experimentalDecorators,await S.run(()=>j.generateFile(i,o))})}const bt=["**/.git/objects/**","**/.git/subtree-cache/**","**/node_modules/**","**/tmp/**","**/temp/**","**/dist/**"];async function vt(n){return x.functionIgnoringException("generateVscodeSettings",async()=>{try{const s=t.resolve(n.dirPath,".vscode","settings.json"),i=await e.promises.readFile(s,"utf8");let o=JSON.parse(i);for(const e of bt)o=l.all([o,kt(e)]);n.doesContainPoetryLock&&(o=l.all([o,kt("**/.venv/**")])),n.depending.next&&(o=l.all([o,kt("**/.next/**")])),"editor.codeActionsOnSave"in o&&delete o["editor.codeActionsOnSave"],"editor.formatOnSave"in o&&delete o["editor.formatOnSave"],J(o);const r=JSON.stringify(o,void 0,2);await S.run(()=>j.generateFile(s,r))}catch{}})}function kt(e){return{"files.watcherExclude":{[e]:!0}}}async function xt(n){return x.functionIgnoringException("generateYarnrcYml",async()=>{const s=t.resolve(n.dirPath,".yarnrc.yml");if(n.isBun)return await S.run(()=>e.promises.rm(s,{force:!0})),await S.run(()=>e.promises.rm(t.resolve(n.dirPath,".yarn"),{force:!0,recursive:!0})),void await S.run(()=>e.promises.rm(t.resolve(n.dirPath,"yarn.lock"),{force:!0,recursive:!0}));const i=re("yarn",["--version"],n.dirPath),o=function(e,t){const n=re("npm",["show",e,"versions","--json"],t);return JSON.parse(n).at(-1)}("@yarnpkg/cli",n.dirPath);_t(i)<=_t(o)&&i!==o&&oe("yarn",["set","version",o],n.dirPath,1);const r=t.join(n.dirPath,".yarn","releases");await e.promises.mkdir(r,{recursive:!0});for(const n of await e.promises.readdir(r))n.startsWith("yarn-")&&!n.startsWith(`yarn-${o}.`)&&await S.run(()=>e.promises.rm(t.join(r,n)));const a=t.resolve(n.dirPath,".yarnrc");await S.run(()=>e.promises.rm(a,{force:!0}));const c=d.load(await e.promises.readFile(s,"utf8"));c.defaultSemverRangePrefix="",c.nodeLinker="node-modules",c.nmMode="hardlinks-global",c.npmMinimalAgeGate="5d",c.npmPreapprovedPackages=["@willbooster/babel-configs","@willbooster/biome-config","@willbooster/eslint-config-js","@willbooster/eslint-config-js-react","@willbooster/eslint-config-next","@willbooster/eslint-config-ts","@willbooster/eslint-config-ts-react","@willbooster/prettier-config","@willbooster/wb"],delete c.compressionLevel,0===c.injectEnvironmentFiles?.length&&delete c.injectEnvironmentFiles,c.enableGlobalCache=!0;const l=c.plugins?.length??0;if(c.plugins=c.plugins?.filter(e=>".yarn/plugins/undefined.cjs"!==e.path)??[],c.plugins.length!==l){const s=t.resolve(n.dirPath,".yarnrc","undefined.cjs");await S.run(()=>e.promises.rm(s,{force:!0}))}0===c.plugins.length&&delete c.plugins,await e.promises.writeFile(s,d.dump(c,{lineWidth:-1})),oe("yarn",["dlx","yarn-plugin-auto-install"],n.dirPath)})}function _t(e){const[t]=e.split(".");return Number(t)}async function jt(e){return x.functionIgnoringException("setupLabels",async()=>{const[t,n]=ee.getOrgAndName(e.repository??"");if(!t||!n)return;if("WillBooster"!==t&&"WillBoosterLab"!==t)return;if(!se(t))return;const s=ne(t);try{await St(s,t,n,"d1: x-easy :hedgehog:","EDE9FE"),await St(s,t,n,"d2: easy :rabbit2:","DDD6FE"),await St(s,t,n,"d3: medium :ox:","C4B5FD"),await St(s,t,n,"d4: hard :squid:","A78BFA"),await St(s,t,n,"d5: x-hard :whale2:","8B5CF6"),await St(s,t,n,"p1: critical :fire::fire::fire:","EF4444"),await St(s,t,n,"p2: urgent :fire::fire:","F87171"),await St(s,t,n,"p3: important :fire:","FCA5A5"),await St(s,t,n,"p4: nice to have :droplet:","FECACA"),await St(s,t,n,"r: blitz","5300bc"),await St(s,t,n,"r: firebase","ffca28"),await St(s,t,n,"r: prisma","0c344b"),await St(s,t,n,"r: react","61dafb"),await St(s,t,n,"r: svelte","ff3e00"),await St(s,t,n,"r: semantic-release","494949"),await St(s,t,n,"ready :rocket:","22C55E"),await St(s,t,n,"review requested :mag:","FBCA04"),await St(s,t,n,"released :bookmark:","6366F1"),await St(s,t,n,"s: 0.5h :clock1230:","F3F4F6"),await St(s,t,n,"s: 1h :clock1:","E5E7EB"),await St(s,t,n,"s: 2h :clock2:","D1D5DB"),await St(s,t,n,"s: 3h :clock3:","9CA3AF"),await St(s,t,n,"s: 5h :clock5:","6B7280"),await St(s,t,n,"s: 8h :clock8:","4B5563"),await St(s,t,n,"s: 13h :clock1:","374151"),await St(s,t,n,"t: build :hammer:","BFDBFE"),await St(s,t,n,"t: chore :broom:","BFDBFE"),await St(s,t,n,"t: ci :construction_worker:","BFDBFE"),await St(s,t,n,"t: docs :memo:","BFDBFE"),await St(s,t,n,"t: feat :sparkles:","BFDBFE"),await St(s,t,n,"t: fix :bug:","BFDBFE"),await St(s,t,n,"t: perf :zap:","BFDBFE"),await St(s,t,n,"t: refactor :recycle:","BFDBFE"),await St(s,t,n,"t: style :lipstick:","BFDBFE"),await St(s,t,n,"t: test :test_tube:","BFDBFE"),await St(s,t,n,"project","24292F"),await St(s,t,n,"focused :dart:","22C55E"),await St(s,t,n,"gen-pr-all :robot:","00B4D8"),await St(s,t,n,"gen-pr-claude :robot:","00B4D8"),await St(s,t,n,"gen-pr-codex :robot:","00B4D8"),await St(s,t,n,"gen-pr-gemini :robot:","00B4D8"),await Pt(s,t,n,"bug"),await Pt(s,t,n,"documentation"),await Pt(s,t,n,"duplicate"),await Pt(s,t,n,"enhancement"),await Pt(s,t,n,"good first issue"),await Pt(s,t,n,"help wanted"),await Pt(s,t,n,"invalid"),await Pt(s,t,n,"question"),await Pt(s,t,n,"wontfix"),await Pt(s,t,n,"ready"),await Pt(s,t,n,"review requested"),await Pt(s,t,n,"released"),await Pt(s,t,n,"semantic-release"),await Pt(s,t,n,"llm-pr :robot:"),await Pt(s,t,n,"ai-pr :robot:")}catch(e){console.warn("Skip setupLabels due to:",e?.stack??e)}})}async function St(e,t,n,s,i){try{await e.request("POST /repos/{owner}/{repo}/labels",{owner:t,repo:n,name:s,color:i})}catch{await e.request("PATCH /repos/{owner}/{repo}/labels/{name}",{owner:t,repo:n,name:s,color:i})}}async function Pt(e,t,n,s){try{await e.request("DELETE /repos/{owner}/{repo}/labels/{name}",{owner:t,repo:n,name:s})}catch{}}const $t=["READY_DISCORD_WEBHOOK_URL","GH_BOT_PAT","PUBLIC_GH_BOT_PAT"];async function Ct(e){return x.functionIgnoringException("setupSecrets",async()=>{const[t,n]=ee.getOrgAndName(e.repository??"");if(!t||!n||"WillBoosterLab"!==t)return;if(!se(t)||!k.doesUploadEnvVars)return;const s=h.config().parsed??{};if(0===Object.keys(s).length)return;const i=ne(t);try{for(const e of $t)try{await i.request("DELETE /repos/{owner}/{repo}/actions/secrets/{secret_name}",{owner:t,repo:n,secret_name:e})}catch{}const e=await i.request("GET /repos/{owner}/{repo}/actions/secrets/public-key",{owner:t,repo:n}),{key:o,key_id:r}=e.data;await y.ready;for(const[e,a]of Object.entries(s)){if("GH_BOT_PAT"===e||"GH_BOT_PAT_FOR_WILLBOOSTER"===e||"GH_BOT_PAT_FOR_WILLBOOSTERLAB"===e)continue;const s=y.from_base64(o,y.base64_variants.ORIGINAL),c=y.from_string(a),l=y.crypto_box_seal(c,s),p=y.to_base64(l,y.base64_variants.ORIGINAL);await i.request("PUT /repos/{owner}/{repo}/actions/secrets/{secret_name}",{owner:t,repo:n,secret_name:e,encrypted_value:p,key_id:r})}}catch(e){console.warn("Skip setupSecrets due to:",e?.stack??e)}})}async function Ft(e){const[t,n]=ee.getOrgAndName(e.repository??"");if(!t||!n)return;if("WillBooster"!==t&&"WillBoosterLab"!==t)return;if(!se(t))return;const i=ne(t);await s(()=>i.request("PATCH /repos/{owner}/{repo}",{owner:t,repo:n,allow_auto_merge:!0,allow_merge_commit:!1,allow_squash_merge:!0,allow_rebase_merge:!1,allow_update_branch:!0,delete_branch_on_merge:!0,squash_merge_commit_title:"PR_TITLE",squash_merge_commit_message:"BLANK",headers:{"X-GitHub-Api-Version":"2022-11-28"},...e.repository?.startsWith("github:WillBooster/")?{allow_auto_merge:!0}:{}}))}const Et={"pull_request_template.md":'\nClose #<IssueNumber>\n\n## Self Check\n\n- [ ] I\'ve confirmed `All checks have passed` on this page.\n - PR title follows [Angular\'s commit message format](https://github.com/angular/angular/blob/main/CONTRIBUTING.md#-commit-message-format).\n - PR title doesn\'t have `WIP:`.\n - The test command (e.g., `yarn test`) passed.\n - The lint command (e.g., `yarn lint`) passed.\n - You may leave this box unchecked due to long workflows.\n- [ ] I\'ve reviewed my changes on the GitHub diff view.\n- [ ] I\'ve written the steps to test my changes.\n- [ ] I\'ve added screenshots (if the UI changed).\n - You may leave this box unchecked if you didn\'t modify the UI.\n\n\x3c!-- Please add screenshots if you modify the UI.\n| Current | In coming |\n| ------------------------ | ------------------------ |\n| <img src="" width="400"> | <img src="" width="400"> |\n--\x3e\n\n\x3c!-- Please add steps to test your changes.\n## Steps to Test\n\n1. Open http://localhost-exercode.willbooster.net:3000/ja-JP/courses/_example/lessons/_example_a_plus_b/problems/_example_a_plus_b after login.\n2. Select the language `C`.\n3. Write the following code:\n ```c\n #include <stdio.h>\n\n int main(void) {\n int a, b;\n\n scanf("%d %d", &a, &b);\n printf("%d", a + b);\n return 0;\n }\n ```\n4. Push `Submit` button.\n5. ...\n--\x3e\n'.trim()};async function Bt(n){return x.functionIgnoringException("generateGitHubTemplates",async()=>{for(const[s,i]of Object.entries(Et)){const o=t.resolve(n.dirPath,".github",s);if(e.existsSync(o)){const t=await e.promises.readFile(o,"utf8");if(w(t,i)>i.length/2)continue}await e.promises.mkdir(t.resolve(n.dirPath,".github"),{recursive:!0}),await S.run(()=>j.generateFile(o,i))}})}const Ot=v.object({typos:v.object({all:v.record(v.string(),v.string()).optional(),doc:v.record(v.string(),v.string()).optional(),ts:v.record(v.string(),v.string()).optional(),text:v.record(v.string(),v.string()).optional()}).optional()});async function It(n,s){const i=t.resolve(n,"package.json");try{const o=e.existsSync(i);let r={},c={},l={},p=!1;if(o){const t=e.readFileSync(i,"utf8");l=JSON.parse(t),r=l.dependencies??{},c=l.devDependencies??{},p="module"===l.type}let d=[],u=[];try{const e=t.resolve(n,".releaserc.json"),s=JSON.parse(await a.readFile(e,"utf8"));d=s?.branches??[],u=s?.plugins?.flat()??[]}catch{}const m="packages"!==t.basename(t.resolve(n,".."))||!e.existsSync(t.resolve(n,"..","..","package.json"));let f;m&&(f=await async function(e,t){const n=b(e),s=(await n.getRemotes(!0)).find(e=>"origin"===e.name),i=s?.refs.fetch??s?.refs.push;if("string"==typeof i){const e=await Tt(i);if(e)return e}const o="string"==typeof t.repository?t.repository:t.repository?.url;if(o){const e=await Tt(o);if(e&&"Not Found"!==e.message)return e}}(n,l));let g="";try{g+=(await a.readFile(t.resolve(n,".tool-versions"),"utf8")).trim()}catch{}for(const[e,s]of[["java","java"],["node","nodejs"],["python","python"]])try{const i=await a.readFile(t.resolve(n,`.${e}-version`),"utf8");g&&(g+="\n"),g+=`${s} ${i.trim()}`}catch{}let h="";try{h=await a.readFile(t.resolve(n,"Dockerfile"),"utf8")}catch{}const y=t.resolve(n,"wbfy.json");let w;try{const e=await a.readFile(y,"utf8");w=Ot.parse(JSON.parse(e))}catch{}const v=f?.full_name?`github:${f.full_name}`:void 0,k={dirPath:n,dockerfile:h,isRoot:m,isPublicRepo:!1===f?.private,isReferredByOtherRepo:!!l.files,repository:f?.full_name?`github:${f.full_name}`:void 0,isWillBoosterRepo:Boolean(v?.startsWith("github:WillBooster/")||v?.startsWith("github:WillBoosterLab/")),isBun:s?.isBun||e.existsSync(t.join(n,"bunfig.toml")),isEsmPackage:p,isWillBoosterConfigs:i.includes(`${t.sep}willbooster-configs`),doesContainSubPackageJsons:At("packages/**/package.json",n),doesContainDockerfile:!!h||e.existsSync(t.resolve(n,"docker-compose.yml")),doesContainGemfile:e.existsSync(t.resolve(n,"Gemfile")),doesContainGoMod:e.existsSync(t.resolve(n,"go.mod")),doesContainPackageJson:e.existsSync(t.resolve(n,"package.json")),doesContainPoetryLock:e.existsSync(t.resolve(n,"poetry.lock")),doesContainPomXml:e.existsSync(t.resolve(n,"pom.xml")),doesContainPubspecYaml:e.existsSync(t.resolve(n,"pubspec.yaml")),doesContainTemplateYaml:e.existsSync(t.resolve(n,"template.yaml")),doesContainVscodeSettingsJson:e.existsSync(t.resolve(n,".vscode","settings.json")),doesContainJavaScript:At("{app,src,test,scripts}/**/*.{cjs,mjs,js,jsx}",n),doesContainTypeScript:At("{app,src,test,scripts}/**/*.{cts,mts,ts,tsx}",n),doesContainJsxOrTsx:At("{app,src,test}/**/*.{t,j}sx",n),doesContainJavaScriptInPackages:At("packages/**/{app,src,test,scripts}/**/*.{cjs,mjs,js,jsx}",n),doesContainTypeScriptInPackages:At("packages/**/{app,src,test,scripts}/**/*.{cts,mts,ts,tsx}",n),doesContainJsxOrTsxInPackages:At("packages/**/{app,src,test}/**/*.{t,j}sx",n),hasStartTest:!!l.scripts?.["start-test"],depending:{blitz:!!r.blitz,firebase:!!c["firebase-tools"],genI18nTs:!!c["gen-i18n-ts"],litestream:h.includes("install-litestream.sh"),react:!!r.react,next:!!r.next,playwrightTest:!!r["@playwright/test"]||!!c["@playwright/test"]||!!c.playwright,prisma:!!r["@prisma/client"]||!!c.prisma,pyright:!!c.pyright,reactNative:!!r["react-native"],semanticRelease:!!(c["semantic-release"]||d.length>0||u.length>0),storybook:!!c["@storybook/react"],wb:!!r["@willbooster/wb"]||!!c["@willbooster/wb"]},release:{branches:d,github:u.includes("@semantic-release/github"),npm:u.includes("@semantic-release/npm")},versionsText:g,packageJson:l,wbfyJson:w};if(k.isBun||(k.eslintBase=function(e){if(e.depending.next)return"@willbooster/eslint-config-next";if(e.doesContainTypeScript)return e.doesContainJsxOrTsx?"@willbooster/eslint-config-ts-react":"@willbooster/eslint-config-ts";if(e.doesContainJsxOrTsx)return"@willbooster/eslint-config-js-react";if(e.doesContainJavaScript)return"@willbooster/eslint-config-js"}(k)),k.doesContainGemfile||k.doesContainGoMod||k.doesContainPackageJson||k.doesContainPoetryLock||k.doesContainPomXml||k.doesContainPubspecYaml||k.doesContainTemplateYaml)return k}catch{}}function At(e,t){return o.globSync(e,{dot:!0,cwd:t,ignore:T}).length>0}async function Tt(e){const[t,n]=ee.getOrgAndName(e);if(!t||!n)return;const s={full_name:`${t}/${n}`};try{const e=await ne().request("GET /repos/{owner}/{repo}",{owner:t,repo:n});Object.assign(s,e.data)}catch{}return s}function Dt(e,t){if(!t.isWillBoosterConfigs)return!1;const n=e.packageJson?.name;return"string"==typeof n&&n.startsWith("@willbooster/eslint-config-")}function Rt(n){const s=new Set([t.join(n,"node_modules")]),i=o.globSync("**/node_modules",{cwd:n,dot:!0,onlyDirectories:!0,followSymbolicLinks:!1});for(const e of i)s.add(t.resolve(n,e));for(const t of s)try{e.rmSync(t,{recursive:!0,force:!0})}catch(e){console.warn(e)}}await async function(){const n=await r(process.argv.slice(2)).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({env:{description:"Upload environment variables as secrets to GitHub",type:"boolean",default:!1,alias:"e"},skipDeps:{description:"Skip dependency installation",type:"boolean",default:!1,alias:"d"},verbose:{description:"Whether or not to enable verbose mode",type:"boolean",default:!1,alias:"v"}}).version(function(){let n=t.dirname(new URL(import.meta.url).pathname);for(;!e.existsSync(t.join(n,"package.json"));)n=t.dirname(n);return JSON.parse(e.readFileSync(t.join(n,"package.json"),"utf8")).version}()).strict().argv;k.isVerbose=n.verbose,k.doesUploadEnvVars=n.env;for(const s of n.paths){e.rmSync(t.join(s,"bun.lock"),{force:!0}),e.rmSync(t.join(s,"yarn.lock"),{force:!0}),Rt(s);const o=t.join(s,"packages"),r=(await i(()=>e.promises.readdir(o,{withFileTypes:!0}))??[]).filter(e=>e.isDirectory()).map(e=>t.join(o,e.name));await R([s,...r]);const a=await It(s);if(!a){console.error(`there is no valid package.json in ${s}`);continue}const c=Y(a),l=(await Promise.all(r.map(e=>It(e,a)))).filter(e=>!!e),p=[a,...l];if(k.isVerbose)for(const e of p)console.info(e);await de(a),await xt(a),a.isBun&&await he(a);const d=!U(a.repository)&&(a.repository?.startsWith("github:WillBooster/")||a.repository?.startsWith("github:WillBoosterLab/"));await Promise.all([_(a),D(a),c.then(()=>dt(a)),Q(a,p),je(a),$e(a),Be(a),Oe(a),Ae(a),Bt(a),tt(a),gt(a),mt(a),...d?[z(a)]:[],jt(a),Ct(a),Ft(a),a.isBun?Ve(a).then(()=>it(a)):Ve(a),rt(a)]),await S.promiseAll();const u=[];for(const e of p)Dt(e,a)||((e.doesContainTypeScript||e.doesContainTypeScriptInPackages)&&u.push(W(e,e.isRoot?p:[e])),e.depending.playwrightTest&&u.push(E(e)),e.depending.next&&u.push(P(e)),await De(e,a),await S.promiseAll(),(e.isRoot||e.doesContainPackageJson)&&(await ct(e),await qe(e,a,n.skipDeps),u.push(rt(e)),e.doesContainVscodeSettingsJson&&e.doesContainPackageJson&&u.push(vt(e)),(e.doesContainTypeScript||e.doesContainTypeScriptInPackages)&&u.push(wt(e)),(e.doesContainJavaScript||e.doesContainJavaScriptInPackages||e.doesContainTypeScript||e.doesContainTypeScriptInPackages)&&(a.isBun&&u.push(ge(e)),a.isWillBoosterConfigs||u.push(Fe(e))),e.depending.pyright&&u.push(pt(e))));await Promise.all(u),await S.promiseAll();const m=a.isBun?"bun":"yarn";a.isBun?(e.rmSync(t.join(s,"bun.lock"),{force:!0}),oe(m,["update"],s)):(e.rmSync(t.join(s,"yarn.lock"),{force:!0}),oe(m,["install","--no-immutable"],s)),oe(m,["cleanup"],s),a.isBun||oe(m,["install","--no-immutable"],s)}}();
2
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VzIjpbIi4uL3NyYy9vcHRpb25zLnRzIiwiLi4vc3JjL2xvZ2dlci50cyIsIi4uL3NyYy9maXhlcnMvZG9ja2VyZmlsZS50cyIsIi4uL3NyYy91dGlscy9mc1V0aWwudHMiLCIuLi9zcmMvdXRpbHMvcHJvbWlzZVBvb2wudHMiLCIuLi9zcmMvZml4ZXJzL25leHRDb25maWcudHMiLCIuLi9zcmMvZml4ZXJzL3BsYXl3cmlnaHRDb25maWcudHMiLCIuLi9zcmMvdXRpbHMvZ2xvYlV0aWwudHMiLCIuLi9zcmMvZml4ZXJzL3ByaXNtYS50cyIsIi4uL3NyYy9maXhlcnMvdGVzdERpcmVjdG9yeS50cyIsIi4uL3NyYy9maXhlcnMvdHlwZURlZmluaXRpb24udHMiLCIuLi9zcmMvdXRpbHMvbWVyZ2VVdGlsLnRzIiwiLi4vc3JjL3V0aWxzL29iamVjdFV0aWwudHMiLCIuLi9zcmMvZ2VuZXJhdG9ycy93b3JrZmxvdy50cyIsIi4uL3NyYy9maXhlcnMvdHlwb3MudHMiLCIuLi9zcmMvZ2VuZXJhdG9ycy9hZ2VudHMudHMiLCIuLi9zcmMvdXRpbHMvZ2l0aHViVXRpbC50cyIsIi4uL3NyYy91dGlscy9zcGF3blV0aWwudHMiLCIuLi9zcmMvdXRpbHMvdmVyc2lvbi50cyIsIi4uL3NyYy91dGlscy92ZXJzaW9uQ29uc3RhbnRzLnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvYXNkZi50cyIsIi4uL3NyYy9nZW5lcmF0b3JzL2Jpb21lLnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvYnVuZmlnLnRzIiwiLi4vc3JjL3V0aWxzL2lnbm9yZUZpbGVVdGlsLnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvZG9ja2VyaWdub3JlLnRzIiwiLi4vc3JjL3V0aWxzL2V4dGVuc2lvbnMudHMiLCIuLi9zcmMvZ2VuZXJhdG9ycy9lZGl0b3Jjb25maWcudHMiLCIuLi9zcmMvZ2VuZXJhdG9ycy9lc2xpbnRDb25maWcudHMiLCIuLi9zcmMvZ2VuZXJhdG9ycy9nZW1pbmlDb25maWcudHMiLCIuLi9zcmMvZ2VuZXJhdG9ycy9nZW1pbmlTZXR0aW5ncy50cyIsIi4uL3NyYy9nZW5lcmF0b3JzL2dpdGF0dHJpYnV0ZXMudHMiLCIuLi9zcmMvZ2VuZXJhdG9ycy9naXRpZ25vcmUudHMiLCIuLi9zcmMvZ2l0aHViL2NvbW1pdC50cyIsIi4uL3NyYy91dGlscy9lc2xpbnRVdGlsLnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvcGFja2FnZUpzb24udHMiLCIuLi9zcmMvZ2VuZXJhdG9ycy9odXNreXJjLnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvaWRlYS50cyIsIi4uL3NyYy9nZW5lcmF0b3JzL2xlZnRob29rLnRzIiwiLi4vc3JjL3V0aWxzL3NyY0RpcmVjdG9yaWVzLnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvbGludHN0YWdlZHJjLnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvcHJldHRpZXJpZ25vcmUudHMiLCIuLi9zcmMvZ2VuZXJhdG9ycy9weXJpZ2h0Q29uZmlnLnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvcmVhZG1lLnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvcmVsZWFzZXJjLnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvcmVub3ZhdGVKc29uLnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvdHNjb25maWcudHMiLCIuLi9zcmMvZ2VuZXJhdG9ycy92c2NvZGVTZXR0aW5ncy50cyIsIi4uL3NyYy9nZW5lcmF0b3JzL3lhcm5yYy50cyIsIi4uL3NyYy9naXRodWIvbGFiZWwudHMiLCIuLi9zcmMvZ2l0aHViL3NlY3JldC50cyIsIi4uL3NyYy9naXRodWIvc2V0dGluZ3MudHMiLCIuLi9zcmMvZ2l0aHViL3RlbXBsYXRlLnRzIiwiLi4vc3JjL3BhY2thZ2VDb25maWcudHMiLCIuLi9zcmMvdXRpbHMvcGFja2FnZVNraXBVdGlsLnRzIiwiLi4vc3JjL2luZGV4LnRzIl0sInNvdXJjZXNDb250ZW50IjpbImNsYXNzIE9wdGlvbnMge1xuICBpc1ZlcmJvc2UgPSBmYWxzZTtcbiAgZG9lc1VwbG9hZEVudlZhcnMgPSBmYWxzZTtcbn1cblxuZXhwb3J0IGNvbnN0IG9wdGlvbnMgPSBuZXcgT3B0aW9ucygpO1xuIiwiaW1wb3J0IHsgb3B0aW9ucyB9IGZyb20gJy4vb3B0aW9ucy5qcyc7XG5cbmNsYXNzIExvZ2dlciB7XG4gIGFzeW5jIGZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24obmFtZTogc3RyaW5nLCBmdW5jOiAoKSA9PiBQcm9taXNlPHZvaWQ+KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKG9wdGlvbnMuaXNWZXJib3NlKSB7XG4gICAgICBjb25zb2xlLmluZm8oYC0tLS0tLS0tLSAke25hbWV9IHN0YXJ0IC0tLS0tLS0tLWApO1xuICAgIH1cbiAgICB0cnkge1xuICAgICAgYXdhaXQgZnVuYygpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBjb25zb2xlLmluZm8oYEVycm9yIG9jY3VycmVkIGluICR7bmFtZX06ICR7ZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLnN0YWNrIDogU3RyaW5nKGVycm9yKX19YCk7XG4gICAgfVxuICAgIGlmIChvcHRpb25zLmlzVmVyYm9zZSkge1xuICAgICAgY29uc29sZS5pbmZvKGAtLS0tLS0tLS0tICR7bmFtZX0gZW5kIC0tLS0tLS0tLS1gKTtcbiAgICB9XG4gIH1cbn1cblxuZXhwb3J0IGNvbnN0IGxvZ2dlciA9IG5ldyBMb2dnZXIoKTtcbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzL3Byb21pc2VzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGZpeERvY2tlcmZpbGUoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZml4RG9ja2VyZmlsZScsIGFzeW5jICgpID0+IHtcbiAgICBpZiAoIWNvbmZpZy5kb2VzQ29udGFpbkRvY2tlcmZpbGUpIHJldHVybjtcblxuICAgIGNvbnN0IG9sZENvbnRlbnQgPSBjb25maWcuZG9ja2VyZmlsZTtcbiAgICBjb25zdCBuZXdDb250ZW50ID0gb2xkQ29udGVudDtcblxuICAgIGlmIChvbGRDb250ZW50ID09PSBuZXdDb250ZW50KSByZXR1cm47XG4gICAgYXdhaXQgZnMud3JpdGVGaWxlKHBhdGguam9pbihjb25maWcuZGlyUGF0aCwgJ0RvY2tlcmZpbGUnKSwgbmV3Q29udGVudCk7XG4gIH0pO1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuZXhwb3J0IGNvbnN0IGZzVXRpbCA9IHtcbiAgYXN5bmMgcmVhZEZpbGVJZ25vcmluZ0Vycm9yKGZpbGVQYXRoOiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZyB8IHVuZGVmaW5lZD4ge1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gYXdhaXQgZnMucHJvbWlzZXMucmVhZEZpbGUoZmlsZVBhdGgsICd1dGY4Jyk7XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBkbyBub3RoaW5nXG4gICAgfVxuICB9LFxuICBhc3luYyBnZW5lcmF0ZUZpbGUoZmlsZVBhdGg6IHN0cmluZywgY29udGVudDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgYXdhaXQgZnMucHJvbWlzZXMubWtkaXIocGF0aC5kaXJuYW1lKGZpbGVQYXRoKSwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gICAgbGV0IG5vcm1hbGl6ZWRDb250ZW50ID0gY29udGVudC5yZXBsYWNlQWxsKCdcXHJcXG4nLCAnXFxuJykudHJpbSgpO1xuICAgIGlmIChub3JtYWxpemVkQ29udGVudCkge1xuICAgICAgbm9ybWFsaXplZENvbnRlbnQgKz0gJ1xcbic7XG4gICAgfVxuICAgIGF3YWl0IGZzLnByb21pc2VzLndyaXRlRmlsZShmaWxlUGF0aCwgbm9ybWFsaXplZENvbnRlbnQpO1xuICAgIGNvbnNvbGUubG9nKGBHZW5lcmF0ZWQvVXBkYXRlZCAke2ZpbGVQYXRofWApO1xuICB9LFxufTtcbiIsImltcG9ydCB7IFByb21pc2VQb29sIH0gZnJvbSAnbWluaW1hbC1wcm9taXNlLXBvb2wnO1xuXG5leHBvcnQgY29uc3QgcHJvbWlzZVBvb2wgPSBuZXcgUHJvbWlzZVBvb2woKTtcbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGZzVXRpbCB9IGZyb20gJy4uL3V0aWxzL2ZzVXRpbC5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGZpeE5leHRDb25maWdKc29uKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2ZpeE5leHRDb25maWdKc29uJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IGZpbGVQYXRoID0gWydqcycsICdtanMnLCAnY2pzJ11cbiAgICAgIC5tYXAoKGV4dCkgPT4gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCBgbmV4dC5jb25maWcuJHtleHR9YCkpXG4gICAgICAuZmluZCgocCkgPT4gZnMuZXhpc3RzU3luYyhwKSk7XG4gICAgaWYgKCFmaWxlUGF0aCkgcmV0dXJuO1xuXG4gICAgY29uc3Qgb2xkQ29udGVudCA9IGF3YWl0IGZzLnByb21pc2VzLnJlYWRGaWxlKGZpbGVQYXRoLCAndXRmOCcpO1xuICAgIC8vIFJlcGxhY2UgdGhlIEpTT04gb2JqZWN0IGZyb20gdGhlIGZpbGVcbiAgICBjb25zdCBuZXdDb250ZW50ID0gb2xkQ29udGVudC5yZXBsYWNlKC89XFxzKnsoW1xcU1xcc10qKX07LywgKF8sIHNldHRpbmdzVGV4dDogc3RyaW5nKSA9PiB7XG4gICAgICBpZiAoIXNldHRpbmdzVGV4dC5pbmNsdWRlcygnZXNsaW50OicpKSB7XG4gICAgICAgIHNldHRpbmdzVGV4dCArPSAnZXNsaW50OiB7IGlnbm9yZUR1cmluZ0J1aWxkczogdHJ1ZSB9LCc7XG4gICAgICB9XG4gICAgICBpZiAoIXNldHRpbmdzVGV4dC5pbmNsdWRlcygndHlwZXNjcmlwdDonKSkge1xuICAgICAgICBzZXR0aW5nc1RleHQgKz0gJ3R5cGVzY3JpcHQ6IHsgaWdub3JlQnVpbGRFcnJvcnM6IHRydWUgfSwnO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGA9IHske3NldHRpbmdzVGV4dH19O2A7XG4gICAgfSk7XG4gICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzVXRpbC5nZW5lcmF0ZUZpbGUoZmlsZVBhdGgsIG5ld0NvbnRlbnQpKTtcbiAgfSk7XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgbWVyZ2UgZnJvbSAnZGVlcG1lcmdlJztcbmltcG9ydCB0cyBmcm9tICd0eXBlc2NyaXB0JztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZnNVdGlsIH0gZnJvbSAnLi4vdXRpbHMvZnNVdGlsLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuXG50eXBlIFBhcnNlZFZhbHVlID1cbiAgfCB7IGtpbmQ6ICdhcnJheSc7IHZhbHVlOiBQYXJzZWRWYWx1ZVtdIH1cbiAgfCB7IGtpbmQ6ICdsaXRlcmFsJzsgdmFsdWU6IHN0cmluZyB9XG4gIHwgeyBraW5kOiAnb2JqZWN0JzsgdmFsdWU6IFBhcnNlZE9iamVjdCB9O1xudHlwZSBQYXJzZWRPYmplY3QgPSBSZWNvcmQ8c3RyaW5nLCBQYXJzZWRWYWx1ZT47XG5cbmNvbnN0IGxpdGVyYWwgPSAodmFsdWU6IHN0cmluZyk6IFBhcnNlZFZhbHVlID0+ICh7IGtpbmQ6ICdsaXRlcmFsJywgdmFsdWUgfSk7XG5jb25zdCBhc0FycmF5ID0gKHZhbHVlOiBQYXJzZWRWYWx1ZVtdKTogUGFyc2VkVmFsdWUgPT4gKHsga2luZDogJ2FycmF5JywgdmFsdWUgfSk7XG5jb25zdCBhc09iamVjdCA9ICh2YWx1ZTogUGFyc2VkT2JqZWN0KTogUGFyc2VkVmFsdWUgPT4gKHsga2luZDogJ29iamVjdCcsIHZhbHVlIH0pO1xuXG5jb25zdCBkZWZhdWx0Q29uZmlnOiBQYXJzZWRPYmplY3QgPSB7XG4gIGZvcmJpZE9ubHk6IGxpdGVyYWwoJyEhcHJvY2Vzcy5lbnYuQ0knKSxcbiAgcmV0cmllczogbGl0ZXJhbCgncHJvY2Vzcy5lbnYuUFdERUJVRyA/IDAgOiBwcm9jZXNzLmVudi5DSSA/IDUgOiAxJyksXG4gIHRpbWVvdXQ6IGxpdGVyYWwoJzEyMF8wMDAnKSxcbiAgdXNlOiBhc09iamVjdCh7XG4gICAgYWN0aW9uVGltZW91dDogbGl0ZXJhbCgnMTBfMDAwJyksXG4gICAgdHJhY2U6IGxpdGVyYWwoXCJwcm9jZXNzLmVudi5DSSA/ICdvbi1maXJzdC1yZXRyeScgOiAncmV0YWluLW9uLWZhaWx1cmUnXCIpLFxuICAgIHNjcmVlbnNob3Q6IGxpdGVyYWwoXCJwcm9jZXNzLmVudi5DSSA/ICdvbmx5LW9uLWZhaWx1cmUnIDogJ29ubHktb24tZmFpbHVyZSdcIiksXG4gICAgdmlkZW86IGxpdGVyYWwoXCJwcm9jZXNzLmVudi5DSSA/ICdyZXRhaW4tb24tZmFpbHVyZScgOiAncmV0YWluLW9uLWZhaWx1cmUnXCIpLFxuICB9KSxcbiAgd29ya2VyczogbGl0ZXJhbCgncHJvY2Vzcy5lbnYuUFdERUJVRyA/IDEgOiB1bmRlZmluZWQnKSxcbiAgd2ViU2VydmVyOiBhc09iamVjdCh7XG4gICAgY29tbWFuZDogbGl0ZXJhbChcIid5YXJuIHN0YXJ0LXRlc3Qtc2VydmVyJ1wiKSxcbiAgICB1cmw6IGxpdGVyYWwoJ3Byb2Nlc3MuZW52Lk5FWFRfUFVCTElDX0JBU0VfVVJMJyksXG4gICAgcmV1c2VFeGlzdGluZ1NlcnZlcjogbGl0ZXJhbCgnISFwcm9jZXNzLmVudi5DSScpLFxuICAgIHRpbWVvdXQ6IGxpdGVyYWwoJzMwMF8wMDAnKSxcbiAgICBzdGRvdXQ6IGxpdGVyYWwoXCInaWdub3JlJ1wiKSxcbiAgICBzdGRlcnI6IGxpdGVyYWwoXCIncGlwZSdcIiksXG4gICAgZW52OiBsaXRlcmFsKGB7XG4gIC4uLnByb2Nlc3MuZW52LFxuICBQUklTTUFfVVNFUl9DT05TRU5UX0ZPUl9EQU5HRVJPVVNfQUlfQUNUSU9OOiAndHJ1ZScsXG59YCksXG4gICAgZ3JhY2VmdWxTaHV0ZG93bjogbGl0ZXJhbChge1xuICBzaWduYWw6ICdTSUdURVJNJyxcbiAgdGltZW91dDogNTAwLFxufWApLFxuICB9KSxcbn07XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBmaXhQbGF5d3JpZ2h0Q29uZmlnKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2ZpeFBsYXl3cmlnaHRDb25maWcnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsIGBwbGF5d3JpZ2h0LmNvbmZpZy50c2ApO1xuICAgIGlmICghZnMuZXhpc3RzU3luYyhmaWxlUGF0aCkpIHJldHVybjtcblxuICAgIGNvbnN0IG9sZENvbnRlbnQgPSBhd2FpdCBmcy5wcm9taXNlcy5yZWFkRmlsZShmaWxlUGF0aCwgJ3V0ZjgnKTtcbiAgICBjb25zdCBtYXRjaCA9IC9kZWZpbmVDb25maWdcXHMqXFwoXFxzKihcXHtbXFxzXFxTXSo/fSlcXHMqXFwpOz8vLmV4ZWMob2xkQ29udGVudCk7XG4gICAgY29uc3Qgb2JqZWN0TGl0ZXJhbCA9IG1hdGNoPy5bMV07XG4gICAgaWYgKCFvYmplY3RMaXRlcmFsKSByZXR1cm47XG5cbiAgICBjb25zdCBwYXJzZWQgPSBwYXJzZU9iamVjdExpdGVyYWwob2JqZWN0TGl0ZXJhbCk7XG4gICAgaWYgKCFwYXJzZWQpIHJldHVybjtcblxuICAgIGNvbnN0IG1lcmdlZCA9IG1lcmdlLmFsbDxQYXJzZWRPYmplY3Q+KFtkZWZhdWx0Q29uZmlnLCBwYXJzZWQsIGRlZmF1bHRDb25maWddKTtcbiAgICBjb25zdCBuZXdPYmplY3RMaXRlcmFsID0gc3RyaW5naWZ5T2JqZWN0KG1lcmdlZCwgMCk7XG4gICAgY29uc3QgbmV3Q29udGVudCA9IG9sZENvbnRlbnQucmVwbGFjZShvYmplY3RMaXRlcmFsLCBuZXdPYmplY3RMaXRlcmFsKTtcblxuICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiBmc1V0aWwuZ2VuZXJhdGVGaWxlKGZpbGVQYXRoLCBuZXdDb250ZW50KSk7XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBwYXJzZU9iamVjdExpdGVyYWwob2JqZWN0TGl0ZXJhbDogc3RyaW5nKTogUGFyc2VkT2JqZWN0IHwgdW5kZWZpbmVkIHtcbiAgY29uc3Qgc291cmNlID0gdHMuY3JlYXRlU291cmNlRmlsZShcbiAgICAncGxheXdyaWdodC1jb25maWcudHMnLFxuICAgIGBjb25zdCBjb25maWcgPSAke29iamVjdExpdGVyYWx9O2AsXG4gICAgdHMuU2NyaXB0VGFyZ2V0LkxhdGVzdCxcbiAgICB0cnVlLFxuICAgIHRzLlNjcmlwdEtpbmQuVFNcbiAgKTtcbiAgY29uc3Qgc3RhdGVtZW50ID0gc291cmNlLnN0YXRlbWVudHNbMF07XG4gIGlmICghc3RhdGVtZW50IHx8ICF0cy5pc1ZhcmlhYmxlU3RhdGVtZW50KHN0YXRlbWVudCkpIHJldHVybjtcbiAgY29uc3QgZGVjbGFyYXRpb24gPSBzdGF0ZW1lbnQuZGVjbGFyYXRpb25MaXN0LmRlY2xhcmF0aW9uc1swXTtcbiAgaWYgKCFkZWNsYXJhdGlvbj8uaW5pdGlhbGl6ZXIgfHwgIXRzLmlzT2JqZWN0TGl0ZXJhbEV4cHJlc3Npb24oZGVjbGFyYXRpb24uaW5pdGlhbGl6ZXIpKSByZXR1cm47XG4gIHJldHVybiBwYXJzZU9iamVjdExpdGVyYWxFeHByZXNzaW9uKGRlY2xhcmF0aW9uLmluaXRpYWxpemVyLCBzb3VyY2UpO1xufVxuXG5mdW5jdGlvbiBwYXJzZU9iamVjdExpdGVyYWxFeHByZXNzaW9uKFxuICBvYmplY3RMaXRlcmFsOiB0cy5PYmplY3RMaXRlcmFsRXhwcmVzc2lvbixcbiAgc291cmNlOiB0cy5Tb3VyY2VGaWxlXG4pOiBQYXJzZWRPYmplY3QgfCB1bmRlZmluZWQge1xuICBjb25zdCBwYXJzZWQ6IFBhcnNlZE9iamVjdCA9IHt9O1xuICBmb3IgKGNvbnN0IHByb3BlcnR5IG9mIG9iamVjdExpdGVyYWwucHJvcGVydGllcykge1xuICAgIGlmICghdHMuaXNQcm9wZXJ0eUFzc2lnbm1lbnQocHJvcGVydHkpIHx8ICghdHMuaXNJZGVudGlmaWVyKHByb3BlcnR5Lm5hbWUpICYmICF0cy5pc1N0cmluZ0xpdGVyYWwocHJvcGVydHkubmFtZSkpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IHZhbHVlID0gcGFyc2VFeHByZXNzaW9uKHByb3BlcnR5LmluaXRpYWxpemVyLCBzb3VyY2UpO1xuICAgIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkKSByZXR1cm47XG4gICAgcGFyc2VkW3Byb3BlcnR5Lm5hbWUuZ2V0VGV4dChzb3VyY2UpXSA9IHZhbHVlO1xuICB9XG4gIHJldHVybiBwYXJzZWQ7XG59XG5cbmZ1bmN0aW9uIHBhcnNlRXhwcmVzc2lvbihleHByZXNzaW9uOiB0cy5FeHByZXNzaW9uLCBzb3VyY2U6IHRzLlNvdXJjZUZpbGUpOiBQYXJzZWRWYWx1ZSB8IHVuZGVmaW5lZCB7XG4gIGlmICh0cy5pc09iamVjdExpdGVyYWxFeHByZXNzaW9uKGV4cHJlc3Npb24pKSB7XG4gICAgY29uc3QgcGFyc2VkT2JqZWN0ID0gcGFyc2VPYmplY3RMaXRlcmFsRXhwcmVzc2lvbihleHByZXNzaW9uLCBzb3VyY2UpO1xuICAgIHJldHVybiBwYXJzZWRPYmplY3QgPyBhc09iamVjdChwYXJzZWRPYmplY3QpIDogbGl0ZXJhbChleHByZXNzaW9uLmdldFRleHQoc291cmNlKSk7XG4gIH1cbiAgaWYgKHRzLmlzQXJyYXlMaXRlcmFsRXhwcmVzc2lvbihleHByZXNzaW9uKSkge1xuICAgIGNvbnN0IGVsZW1lbnRzID0gZXhwcmVzc2lvbi5lbGVtZW50cy5tYXAoKGVsZW1lbnQpID0+IHBhcnNlRXhwcmVzc2lvbihlbGVtZW50LCBzb3VyY2UpKTtcbiAgICBpZiAoZWxlbWVudHMuc29tZSgoZWxlbWVudCk6IGVsZW1lbnQgaXMgdW5kZWZpbmVkID0+IGVsZW1lbnQgPT09IHVuZGVmaW5lZCkpIHtcbiAgICAgIHJldHVybiBsaXRlcmFsKGV4cHJlc3Npb24uZ2V0VGV4dChzb3VyY2UpKTtcbiAgICB9XG4gICAgcmV0dXJuIGFzQXJyYXkoZWxlbWVudHMgYXMgUGFyc2VkVmFsdWVbXSk7XG4gIH1cbiAgcmV0dXJuIGxpdGVyYWwoZXhwcmVzc2lvbi5nZXRUZXh0KHNvdXJjZSkpO1xufVxuXG5mdW5jdGlvbiBzdHJpbmdpZnlWYWx1ZSh2YWx1ZTogUGFyc2VkVmFsdWUsIGxldmVsOiBudW1iZXIpOiBzdHJpbmcge1xuICBpZiAodmFsdWUua2luZCA9PT0gJ2FycmF5Jykge1xuICAgIHJldHVybiBzdHJpbmdpZnlBcnJheSh2YWx1ZS52YWx1ZSwgbGV2ZWwpO1xuICB9XG4gIGlmICh2YWx1ZS5raW5kID09PSAnbGl0ZXJhbCcpIHJldHVybiB2YWx1ZS52YWx1ZTtcbiAgcmV0dXJuIHN0cmluZ2lmeU9iamVjdCh2YWx1ZS52YWx1ZSwgbGV2ZWwpO1xufVxuXG5mdW5jdGlvbiBzdHJpbmdpZnlBcnJheSh2YWx1ZXM6IFBhcnNlZFZhbHVlW10sIGxldmVsOiBudW1iZXIpOiBzdHJpbmcge1xuICBpZiAodmFsdWVzLmxlbmd0aCA9PT0gMCkgcmV0dXJuICdbXSc7XG4gIGNvbnN0IGluZGVudCA9ICcgICcucmVwZWF0KGxldmVsICsgMSk7XG4gIGNvbnN0IGxpbmVzID0gdmFsdWVzLm1hcCgodmFsdWUpID0+IHtcbiAgICBjb25zdCBzdHJpbmdpZmllZCA9IHN0cmluZ2lmeVZhbHVlKHZhbHVlLCBsZXZlbCArIDEpLnNwbGl0KCdcXG4nKTtcbiAgICBzdHJpbmdpZmllZFtzdHJpbmdpZmllZC5sZW5ndGggLSAxXSA9IGAke3N0cmluZ2lmaWVkLmF0KC0xKX0sYDtcbiAgICBpZiAodmFsdWUua2luZCA9PT0gJ2xpdGVyYWwnKSB7XG4gICAgICBmb3IgKGxldCBpbmRleCA9IDE7IGluZGV4IDwgc3RyaW5naWZpZWQubGVuZ3RoOyBpbmRleCArPSAxKSB7XG4gICAgICAgIHN0cmluZ2lmaWVkW2luZGV4XSA9IGAke2luZGVudH0ke3N0cmluZ2lmaWVkW2luZGV4XX1gO1xuICAgICAgfVxuICAgIH1cbiAgICBzdHJpbmdpZmllZFswXSA9IGAke2luZGVudH0ke3N0cmluZ2lmaWVkWzBdfWA7XG4gICAgcmV0dXJuIHN0cmluZ2lmaWVkLmpvaW4oJ1xcbicpO1xuICB9KTtcbiAgY29uc3QgY2xvc2luZ0luZGVudCA9ICcgICcucmVwZWF0KGxldmVsKTtcbiAgcmV0dXJuIGBbXFxuJHtsaW5lcy5qb2luKCdcXG4nKX1cXG4ke2Nsb3NpbmdJbmRlbnR9XWA7XG59XG5cbmZ1bmN0aW9uIHN0cmluZ2lmeU9iamVjdChvYmplY3Q6IFBhcnNlZE9iamVjdCwgbGV2ZWw6IG51bWJlcik6IHN0cmluZyB7XG4gIGNvbnN0IGluZGVudCA9ICcgICcucmVwZWF0KGxldmVsICsgMSk7XG4gIGNvbnN0IGxpbmVzID0gT2JqZWN0LmVudHJpZXMob2JqZWN0KS5tYXAoKFtrZXksIHZhbHVlXSkgPT4ge1xuICAgIGNvbnN0IHN0cmluZ2lmaWVkID0gc3RyaW5naWZ5VmFsdWUodmFsdWUsIGxldmVsICsgMSkuc3BsaXQoJ1xcbicpO1xuICAgIHN0cmluZ2lmaWVkW3N0cmluZ2lmaWVkLmxlbmd0aCAtIDFdID0gYCR7c3RyaW5naWZpZWQuYXQoLTEpfSxgO1xuICAgIGlmICh2YWx1ZS5raW5kID09PSAnbGl0ZXJhbCcpIHtcbiAgICAgIGZvciAobGV0IGluZGV4ID0gMTsgaW5kZXggPCBzdHJpbmdpZmllZC5sZW5ndGg7IGluZGV4ICs9IDEpIHtcbiAgICAgICAgc3RyaW5naWZpZWRbaW5kZXhdID0gYCR7aW5kZW50fSR7c3RyaW5naWZpZWRbaW5kZXhdfWA7XG4gICAgICB9XG4gICAgfVxuICAgIHN0cmluZ2lmaWVkWzBdID0gYCR7aW5kZW50fSR7a2V5fTogJHtzdHJpbmdpZmllZFswXX1gO1xuICAgIHJldHVybiBzdHJpbmdpZmllZC5qb2luKCdcXG4nKTtcbiAgfSk7XG4gIGNvbnN0IGNsb3NpbmdJbmRlbnQgPSAnICAnLnJlcGVhdChsZXZlbCk7XG4gIGlmIChsaW5lcy5sZW5ndGggPT09IDApIHJldHVybiBge1xcbiR7Y2xvc2luZ0luZGVudH19YDtcbiAgcmV0dXJuIGB7XFxuJHtsaW5lcy5qb2luKCdcXG4nKX1cXG4ke2Nsb3NpbmdJbmRlbnR9fWA7XG59XG4iLCJleHBvcnQgY29uc3QgZ2xvYklnbm9yZSA9IFtcbiAgJyoqL25vZGVfbW9kdWxlcy8qKicsXG4gICcqKi8udmVudi8qKicsXG4gICcqKi90ZXN0LWZpeHR1cmVzLyoqJyxcbiAgJyoqL3Rlc3QvZml4dHVyZXMvKionLFxuICAnKiovZGlzdC8qKicsXG4gICcqKi9idWlsZC8qKicsXG4gICcqKi90YXJnZXQvKionLFxuICAnKiovdGVtcC8qKicsXG4gICcqKi90bXAvKionLFxuXTtcbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzL3Byb21pc2VzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCBmZyBmcm9tICdmYXN0LWdsb2InO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBnbG9iSWdub3JlIH0gZnJvbSAnLi4vdXRpbHMvZ2xvYlV0aWwuanMnO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZml4UHJpc21hRW52RmlsZXMoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZml4UHJpc21hRW52RmlsZXMnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgZW52RmlsZXMgPSBhd2FpdCBmZy5nbG9iKFsnKi5lbnYnLCAnKi5lbnYuKiddLCB7IGRvdDogdHJ1ZSwgY3dkOiBjb25maWcuZGlyUGF0aCwgaWdub3JlOiBnbG9iSWdub3JlIH0pO1xuICAgIGZvciAoY29uc3QgZW52RmlsZSBvZiBlbnZGaWxlcykge1xuICAgICAgY29uc3QgZW52RmlsZVBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsIGVudkZpbGUpO1xuICAgICAgY29uc3QgY29udGVudCA9IGF3YWl0IGZzLnJlYWRGaWxlKGVudkZpbGVQYXRoLCAndXRmOCcpO1xuICAgICAgY29uc3QgbmV3Q29udGVudCA9IGNvbnRlbnQucmVwbGFjZShcbiAgICAgICAgL0RBVEFCQVNFX1VSTD1cIj8oLitcXC5zcWxpdGUzKVwiP1tcXG4kXS8sXG4gICAgICAgICdEQVRBQkFTRV9VUkw9XCIkMT9jb25uZWN0aW9uX2xpbWl0PTFcIlxcbidcbiAgICAgICk7XG4gICAgICBhd2FpdCBmcy53cml0ZUZpbGUoZW52RmlsZVBhdGgsIG5ld0NvbnRlbnQpO1xuICAgIH1cbiAgfSk7XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZml4VGVzdERpcmVjdG9yaWVzVXBkYXRpbmdQYWNrYWdlSnNvbihwYWNrYWdlRGlyUGF0aHM6IHN0cmluZ1tdKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZml4VGVzdERpcmVjdG9yaWVzVXBkYXRpbmdQYWNrYWdlSnNvbicsIGFzeW5jICgpID0+IHtcbiAgICBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgIHBhY2thZ2VEaXJQYXRocy5tYXAoYXN5bmMgKHBhY2thZ2VEaXJQYXRoKSA9PiB7XG4gICAgICAgIGNvbnN0IG5ld1Rlc3REaXJQYXRoID0gcGF0aC5qb2luKHBhY2thZ2VEaXJQYXRoLCAndGVzdCcpO1xuICAgICAgICBmb3IgKGNvbnN0IG9sZFRlc3REaXJOYW1lIG9mIFsnX190ZXN0c19fJywgJ3Rlc3RzJ10pIHtcbiAgICAgICAgICBjb25zdCBvbGRUZXN0RGlyUGF0aCA9IHBhdGguam9pbihwYWNrYWdlRGlyUGF0aCwgb2xkVGVzdERpck5hbWUpO1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBhd2FpdCBmcy5wcm9taXNlcy5yZW5hbWUob2xkVGVzdERpclBhdGgsIG5ld1Rlc3REaXJQYXRoKTtcbiAgICAgICAgICAgIGNvbnN0IG9sZENvbnRlbnQgPSBhd2FpdCBmcy5wcm9taXNlcy5yZWFkRmlsZShwYXRoLmpvaW4ocGFja2FnZURpclBhdGgsICdwYWNrYWdlLmpzb24nKSwgJ3V0ZjgnKTtcbiAgICAgICAgICAgIGNvbnN0IG5ld0NvbnRlbnQgPSBvbGRDb250ZW50LnJlcGxhY2VBbGwob2xkVGVzdERpck5hbWUsICd0ZXN0Jyk7XG4gICAgICAgICAgICBpZiAob2xkQ29udGVudCA9PT0gbmV3Q29udGVudCkgcmV0dXJuO1xuXG4gICAgICAgICAgICBhd2FpdCBmcy5wcm9taXNlcy53cml0ZUZpbGUocGF0aC5qb2luKHBhY2thZ2VEaXJQYXRoLCAncGFja2FnZS5qc29uJyksIG5ld0NvbnRlbnQpO1xuICAgICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgICAgLy8gZG8gbm90aGluZ1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSlcbiAgICApO1xuICB9KTtcbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzL3Byb21pc2VzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB7IGlnbm9yZUVub2VudEFzeW5jIH0gZnJvbSAnQHdpbGxib29zdGVyL3NoYXJlZC1saWInO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGZpeFR5cGVEZWZpbml0aW9ucyhcbiAgY29uZmlnOiBQYWNrYWdlQ29uZmlnLFxuICBjb25maWdzSW5jbHVkaW5nQ2hpbGRyZW46IFBhY2thZ2VDb25maWdbXVxuKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZml4VHlwZURlZmluaXRpb25zJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IGxpYlR5cGVEaXJQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnQHR5cGVzJyk7XG4gICAgY29uc3Qgc3JjVHlwZURpclBhdGggPVxuICAgICAgY29uZmlnLmlzUm9vdCAmJiBjb25maWcuZG9lc0NvbnRhaW5TdWJQYWNrYWdlSnNvbnMgPyB1bmRlZmluZWQgOiBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICdzcmMnLCAndHlwZXMnKTtcblxuICAgIGNvbnN0IGRpcmVudHMgPSBhd2FpdCBpZ25vcmVFbm9lbnRBc3luYygoKSA9PiBmcy5yZWFkZGlyKGxpYlR5cGVEaXJQYXRoLCB7IHdpdGhGaWxlVHlwZXM6IHRydWUgfSkpO1xuICAgIGlmICghZGlyZW50cykgcmV0dXJuO1xuXG4gICAgZm9yIChjb25zdCBkaXJlbnQgb2YgZGlyZW50cykge1xuICAgICAgY29uc3QgZGlyTmFtZSA9IGRpcmVudC5uYW1lLnNsaWNlKDAsIC01KTtcbiAgICAgIGNvbnN0IGhhc1R5cGVEZWNsYXJhdGlvbkV4dGVuc2lvbiA9IGRpcmVudC5uYW1lLmVuZHNXaXRoKCcuZC50cycpO1xuICAgICAgbGV0IHBhY2thZ2VOYW1lID0gaGFzVHlwZURlY2xhcmF0aW9uRXh0ZW5zaW9uID8gZGlyTmFtZSA6IGRpcmVudC5uYW1lO1xuICAgICAgaWYgKHBhY2thZ2VOYW1lLmluY2x1ZGVzKCdfXycpKSB7XG4gICAgICAgIHBhY2thZ2VOYW1lID0gYEAke3BhY2thZ2VOYW1lLnJlcGxhY2UoJ19fJywgJy8nKX1gO1xuICAgICAgfVxuICAgICAgY29uc3QgaGFzTGlicmFyeSA9IGNvbmZpZ3NJbmNsdWRpbmdDaGlsZHJlbi5zb21lKFxuICAgICAgICAoY29uZmlnKSA9PlxuICAgICAgICAgIGNvbmZpZy5wYWNrYWdlSnNvbj8uZGVwZW5kZW5jaWVzPy5bcGFja2FnZU5hbWVdIHx8IGNvbmZpZy5wYWNrYWdlSnNvbj8uZGV2RGVwZW5kZW5jaWVzPy5bcGFja2FnZU5hbWVdXG4gICAgICApO1xuXG4gICAgICBpZiAoZGlyZW50LmlzRmlsZSgpICYmIGhhc1R5cGVEZWNsYXJhdGlvbkV4dGVuc2lvbikge1xuICAgICAgICBpZiAoaGFzTGlicmFyeSkge1xuICAgICAgICAgIC8vIE1vdmUgQHR5cGVzLzxuYW1lPi9pbmRleC5kLnRzIGlmIGluc3RhbGxlZFxuICAgICAgICAgIGF3YWl0IGZzLm1rZGlyKHBhdGguam9pbihsaWJUeXBlRGlyUGF0aCwgZGlyTmFtZSkpO1xuICAgICAgICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PlxuICAgICAgICAgICAgZnMucmVuYW1lKHBhdGguam9pbihsaWJUeXBlRGlyUGF0aCwgZGlyZW50Lm5hbWUpLCBwYXRoLmpvaW4obGliVHlwZURpclBhdGgsIGRpck5hbWUsICdpbmRleC5kLnRzJykpXG4gICAgICAgICAgKTtcbiAgICAgICAgfSBlbHNlIGlmIChzcmNUeXBlRGlyUGF0aCkge1xuICAgICAgICAgIC8vIE1vdmUgc3JjL3R5cGVzLzxuYW1lPiBpZiBub3QgaW5zdGFsbGVkXG4gICAgICAgICAgYXdhaXQgZnMubWtkaXIoc3JjVHlwZURpclBhdGgsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICAgICAgICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PlxuICAgICAgICAgICAgZnMucmVuYW1lKHBhdGguam9pbihsaWJUeXBlRGlyUGF0aCwgZGlyZW50Lm5hbWUpLCBwYXRoLmpvaW4oc3JjVHlwZURpclBhdGgsIGRpcmVudC5uYW1lKSlcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKGRpcmVudC5pc0RpcmVjdG9yeSgpICYmIHNyY1R5cGVEaXJQYXRoICYmICFoYXNMaWJyYXJ5KSB7XG4gICAgICAgIC8vIE1vdmUgc3JjL3R5cGVzLzxuYW1lPi5kLnRzIGlmIG5vdCBpbnN0YWxsZWRcbiAgICAgICAgYXdhaXQgZnMubWtkaXIoc3JjVHlwZURpclBhdGgsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICAgICAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT5cbiAgICAgICAgICBpZ25vcmVFbm9lbnRBc3luYygoKSA9PlxuICAgICAgICAgICAgZnMucmVuYW1lKFxuICAgICAgICAgICAgICBwYXRoLmpvaW4obGliVHlwZURpclBhdGgsIGRpcmVudC5uYW1lLCAnaW5kZXguZC50cycpLFxuICAgICAgICAgICAgICBwYXRoLmpvaW4oc3JjVHlwZURpclBhdGgsIGAke2RpcmVudC5uYW1lfS5kLnRzYClcbiAgICAgICAgICAgIClcbiAgICAgICAgICApXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuICB9KTtcbn1cbiIsIi8qIGVzbGludC1kaXNhYmxlIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnNhZmUtYXNzaWdubWVudCwgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVuc2FmZS1jYWxsLCBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW5zYWZlLW1lbWJlci1hY2Nlc3MsIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnNhZmUtYXJndW1lbnQgKi9cblxuaW1wb3J0IG1lcmdlIGZyb20gJ2RlZXBtZXJnZSc7XG5cbmV4cG9ydCBmdW5jdGlvbiBvdmVyd3JpdGVNZXJnZTxUPihkZXN0aW5hdGlvbkFycmF5OiBUW10sIHNvdXJjZUFycmF5OiBUW10pOiBUW10ge1xuICByZXR1cm4gc291cmNlQXJyYXk7XG59XG5cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG5leHBvcnQgZnVuY3Rpb24gY29tYmluZU1lcmdlKHRhcmdldDogb2JqZWN0W10sIHNvdXJjZTogb2JqZWN0W10sIG9wdGlvbnM6IGFueSk6IG9iamVjdFtdIHtcbiAgY29uc3QgZGVzdGluYXRpb24gPSBbLi4udGFyZ2V0XTtcblxuICBmb3IgKGNvbnN0IFtpbmRleCwgaXRlbV0gb2Ygc291cmNlLmVudHJpZXMoKSkge1xuICAgIGlmIChkZXN0aW5hdGlvbltpbmRleF0gPT09IHVuZGVmaW5lZCkge1xuICAgICAgZGVzdGluYXRpb25baW5kZXhdID0gb3B0aW9ucy5jbG9uZVVubGVzc090aGVyd2lzZVNwZWNpZmllZChpdGVtLCBvcHRpb25zKTtcbiAgICB9IGVsc2UgaWYgKG9wdGlvbnMuaXNNZXJnZWFibGVPYmplY3QoaXRlbSkpIHtcbiAgICAgIGRlc3RpbmF0aW9uW2luZGV4XSA9IG1lcmdlKHRhcmdldFtpbmRleF0gYXMgb2JqZWN0LCBpdGVtLCBvcHRpb25zKTtcbiAgICB9IGVsc2UgaWYgKCF0YXJnZXQuaW5jbHVkZXMoaXRlbSkpIHtcbiAgICAgIGRlc3RpbmF0aW9uLnB1c2goaXRlbSk7XG4gICAgfVxuICB9XG4gIHJldHVybiBkZXN0aW5hdGlvbjtcbn1cbiIsImV4cG9ydCBmdW5jdGlvbiBtb3ZlVG9Cb3R0b208VE9iaiBleHRlbmRzIFJlY29yZDxUS2V5LCB1bmtub3duPiwgVEtleSBleHRlbmRzIHN0cmluZyB8IG51bWJlciB8IHN5bWJvbD4oXG4gIG9iajogVE9iaixcbiAga2V5OiBUS2V5XG4pOiBUT2JqIHtcbiAgY29uc3QgdmFsdWUgPSBvYmpba2V5XTtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1keW5hbWljLWRlbGV0ZVxuICBkZWxldGUgb2JqW2tleV07XG4gIChvYmogYXMgUmVjb3JkPFRLZXksIHVua25vd24+KVtrZXldID0gdmFsdWU7XG4gIHJldHVybiBvYmo7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBzb3J0S2V5czxUIGV4dGVuZHMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4+KG9iajogVCk6IFQge1xuICBjb25zdCBrZXlBbmRWYWx1ZXMgPSBPYmplY3QuZW50cmllcyhvYmopLnRvU29ydGVkKChba2V5MV0sIFtrZXkyXSkgPT4ga2V5MS5sb2NhbGVDb21wYXJlKGtleTIpKTtcbiAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2Yga2V5QW5kVmFsdWVzKSB7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1keW5hbWljLWRlbGV0ZVxuICAgIGRlbGV0ZSBvYmpba2V5XTtcbiAgICAob2JqIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KVtrZXldID0gdmFsdWU7XG5cbiAgICAvLyBpZiB2YWx1ZSBpcyBhbiBvYmplY3QsIHNvcnQgdGhlIGtleXMgb2YgdGhlIG9iamVjdFxuICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnICYmIHZhbHVlICE9PSBudWxsKSB7XG4gICAgICBzb3J0S2V5cyh2YWx1ZSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPik7XG4gICAgfVxuICB9XG4gIHJldHVybiBvYmo7XG59XG4iLCIvKiBlc2xpbnQtZGlzYWJsZSB1bmljb3JuL25vLW51bGwgKi9cblxuaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IG1lcmdlIGZyb20gJ2RlZXBtZXJnZSc7XG5pbXBvcnQgeWFtbCBmcm9tICdqcy15YW1sJztcbmltcG9ydCBjbG9uZURlZXAgZnJvbSAnbG9kYXNoLmNsb25lZGVlcCc7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGNvbWJpbmVNZXJnZSB9IGZyb20gJy4uL3V0aWxzL21lcmdlVXRpbC5qcyc7XG5pbXBvcnQgeyBtb3ZlVG9Cb3R0b20sIHNvcnRLZXlzIH0gZnJvbSAnLi4vdXRpbHMvb2JqZWN0VXRpbC5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcblxuaW50ZXJmYWNlIFdvcmtmbG93IHtcbiAgbmFtZT86IHN0cmluZztcbiAgb24/OiBPbjtcbiAgY29uY3VycmVuY3k/OiBDb25jdXJyZW5jeTtcbiAgam9iczogUmVjb3JkPHN0cmluZywgSm9iPjtcbn1cblxuaW50ZXJmYWNlIENvbmN1cnJlbmN5IHtcbiAgZ3JvdXA6IHN0cmluZztcbiAgJ2NhbmNlbC1pbi1wcm9ncmVzcyc6IGJvb2xlYW47XG59XG5cbmludGVyZmFjZSBPbiB7XG4gIGlzc3Vlcz86IFR5cGVzO1xuICBwdWxsX3JlcXVlc3Q/OiBQdWxsUmVxdWVzdDtcbiAgcHVsbF9yZXF1ZXN0X3RhcmdldD86IFR5cGVzO1xuICBwdXNoPzogUHVzaDtcbiAgc2NoZWR1bGU/OiBTY2hlZHVsZVtdO1xuICB3b3JrZmxvd19kaXNwYXRjaD86IG51bGw7XG59XG5cbmludGVyZmFjZSBQdWxsUmVxdWVzdCB7XG4gICdwYXRocy1pZ25vcmUnPzogc3RyaW5nW107XG4gIHR5cGVzPzogc3RyaW5nW107XG59XG5cbmludGVyZmFjZSBQdXNoIHtcbiAgYnJhbmNoZXM6IHN0cmluZ1tdO1xuICAncGF0aHMtaWdub3JlJz86IHN0cmluZ1tdO1xufVxuXG5pbnRlcmZhY2UgU2NoZWR1bGUge1xuICBjcm9uOiBzdHJpbmc7XG59XG5cbmludGVyZmFjZSBUeXBlcyB7XG4gIHR5cGVzOiBzdHJpbmdbXTtcbn1cblxuaW50ZXJmYWNlIEpvYiB7XG4gIHVzZXM/OiBzdHJpbmc7XG4gIGlmPzogc3RyaW5nO1xuICBzZWNyZXRzPzogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gIHdpdGg/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbn1cblxuY29uc3Qgd29ya2Zsb3dzID0ge1xuICB0ZXN0OiB7XG4gICAgbmFtZTogJ1Rlc3QnLFxuICAgIG9uOiB7XG4gICAgICBwdWxsX3JlcXVlc3Q6IG51bGwsXG4gICAgICBwdXNoOiB7XG4gICAgICAgIGJyYW5jaGVzOiBbJ21haW4nLCAnd2JmeSddLFxuICAgICAgfSxcbiAgICB9LFxuICAgIC8vIGNmLiBodHRwczovL2RvY3MuZ2l0aHViLmNvbS9lbi9hY3Rpb25zL3VzaW5nLWpvYnMvdXNpbmctY29uY3VycmVuY3kjZXhhbXBsZS1vbmx5LWNhbmNlbC1pbi1wcm9ncmVzcy1qb2JzLW9yLXJ1bnMtZm9yLXRoZS1jdXJyZW50LXdvcmtmbG93XG4gICAgY29uY3VycmVuY3k6IHtcbiAgICAgIGdyb3VwOiAnJHt7IGdpdGh1Yi53b3JrZmxvdyB9fS0ke3sgZ2l0aHViLnJlZiB9fScsXG4gICAgICAnY2FuY2VsLWluLXByb2dyZXNzJzogdHJ1ZSxcbiAgICB9LFxuICAgIHBlcm1pc3Npb25zOiB7XG4gICAgICAvLyBmb3IgbGludGVyIGZpeFxuICAgICAgY29udGVudHM6ICd3cml0ZScsXG4gICAgfSxcbiAgICBqb2JzOiB7XG4gICAgICB0ZXN0OiB7XG4gICAgICAgIHVzZXM6ICdXaWxsQm9vc3Rlci9yZXVzYWJsZS13b3JrZmxvd3MvLmdpdGh1Yi93b3JrZmxvd3MvdGVzdC55bWxAbWFpbicsXG4gICAgICB9LFxuICAgIH0sXG4gIH0sXG4gIGF1dG9maXg6IHtcbiAgICBuYW1lOiAnRml4IGNvZGUgYXV0b21hdGljYWxseScsXG4gICAgb246IHtcbiAgICAgIHB1bGxfcmVxdWVzdDogbnVsbCxcbiAgICB9LFxuICAgIC8vIGNmLiBodHRwczovL2RvY3MuZ2l0aHViLmNvbS9lbi9hY3Rpb25zL3VzaW5nLWpvYnMvdXNpbmctY29uY3VycmVuY3kjZXhhbXBsZS1vbmx5LWNhbmNlbC1pbi1wcm9ncmVzcy1qb2JzLW9yLXJ1bnMtZm9yLXRoZS1jdXJyZW50LXdvcmtmbG93XG4gICAgY29uY3VycmVuY3k6IHtcbiAgICAgIGdyb3VwOiAnJHt7IGdpdGh1Yi53b3JrZmxvdyB9fS0ke3sgZ2l0aHViLnJlZiB9fScsXG4gICAgICAnY2FuY2VsLWluLXByb2dyZXNzJzogdHJ1ZSxcbiAgICB9LFxuICAgIGpvYnM6IHtcbiAgICAgIHRlc3Q6IHtcbiAgICAgICAgdXNlczogJ1dpbGxCb29zdGVyL3JldXNhYmxlLXdvcmtmbG93cy8uZ2l0aHViL3dvcmtmbG93cy9hdXRvZml4LnltbEBtYWluJyxcbiAgICAgIH0sXG4gICAgfSxcbiAgfSxcbiAgcmVsZWFzZToge1xuICAgIG5hbWU6ICdSZWxlYXNlJyxcbiAgICBvbjoge1xuICAgICAgcHVzaDoge1xuICAgICAgICBicmFuY2hlczogW10sXG4gICAgICB9LFxuICAgIH0sXG4gICAgY29uY3VycmVuY3k6IHtcbiAgICAgIGdyb3VwOiAnJHt7IGdpdGh1Yi53b3JrZmxvdyB9fScsXG4gICAgICAnY2FuY2VsLWluLXByb2dyZXNzJzogZmFsc2UsXG4gICAgfSxcbiAgICBwZXJtaXNzaW9uczoge1xuICAgICAgLy8gaHR0cHM6Ly9kb2NzLm5wbWpzLmNvbS90cnVzdGVkLXB1Ymxpc2hlcnMjc3RlcC0yLWNvbmZpZ3VyZS15b3VyLWNpY2Qtd29ya2Zsb3dcbiAgICAgICdpZC10b2tlbic6ICd3cml0ZScsXG4gICAgICAvLyBmb3Igc2VtYW50aWMtcmVsZWFzZVxuICAgICAgY29udGVudHM6ICd3cml0ZScsXG4gICAgfSxcbiAgICBqb2JzOiB7XG4gICAgICByZWxlYXNlOiB7XG4gICAgICAgIHVzZXM6ICdXaWxsQm9vc3Rlci9yZXVzYWJsZS13b3JrZmxvd3MvLmdpdGh1Yi93b3JrZmxvd3MvcmVsZWFzZS55bWxAbWFpbicsXG4gICAgICB9LFxuICAgIH0sXG4gIH0sXG4gICdzZW1hbnRpYy1wcic6IHtcbiAgICBuYW1lOiAnTGludCBQUiB0aXRsZScsXG4gICAgb246IHtcbiAgICAgIHB1bGxfcmVxdWVzdF90YXJnZXQ6IHtcbiAgICAgICAgdHlwZXM6IFsnb3BlbmVkJywgJ2VkaXRlZCcsICdzeW5jaHJvbml6ZSddLFxuICAgICAgfSxcbiAgICB9LFxuICAgIGpvYnM6IHtcbiAgICAgICdzZW1hbnRpYy1wcic6IHtcbiAgICAgICAgdXNlczogJ1dpbGxCb29zdGVyL3JldXNhYmxlLXdvcmtmbG93cy8uZ2l0aHViL3dvcmtmbG93cy9zZW1hbnRpYy1wci55bWxAbWFpbicsXG4gICAgICB9LFxuICAgIH0sXG4gIH0sXG4gIHN5bmM6IHtcbiAgICBuYW1lOiAnU3luYycsXG4gICAgb246IHt9LFxuICAgIHBlcm1pc3Npb25zOiB7XG4gICAgICAvLyBmb3IgY29tbWl0aW5nIGNoYW5nZXNcbiAgICAgIGNvbnRlbnRzOiAnd3JpdGUnLFxuICAgIH0sXG4gICAgam9iczoge1xuICAgICAgc3luYzogeyB1c2VzOiAnV2lsbEJvb3N0ZXIvcmV1c2FibGUtd29ya2Zsb3dzLy5naXRodWIvd29ya2Zsb3dzL3N5bmMueW1sQG1haW4nIH0sXG4gICAgfSxcbiAgfSxcbiAgJ2Nsb3NlLWNvbW1lbnQnOiB7XG4gICAgbmFtZTogJ0FkZCBjbG9zZSBjb21tZW50JyxcbiAgICBvbjoge1xuICAgICAgcHVsbF9yZXF1ZXN0OiB7XG4gICAgICAgIHR5cGVzOiBbJ29wZW5lZCddLFxuICAgICAgfSxcbiAgICB9LFxuICAgIGpvYnM6IHtcbiAgICAgICdjbG9zZS1jb21tZW50Jzoge1xuICAgICAgICB1c2VzOiAnV2lsbEJvb3N0ZXIvcmV1c2FibGUtd29ya2Zsb3dzLy5naXRodWIvd29ya2Zsb3dzL2Nsb3NlLWNvbW1lbnQueW1sQG1haW4nLFxuICAgICAgfSxcbiAgICB9LFxuICB9LFxuICAnZ2VuLXByLWNsYXVkZSc6IHtcbiAgICBuYW1lOiAnR2VuZXJhdGUgUFIgd2l0aCBDbGF1ZGUgQ29kZScsXG4gICAgb246IHtcbiAgICAgIGlzc3Vlczoge1xuICAgICAgICB0eXBlczogWydsYWJlbGVkJ10sXG4gICAgICB9LFxuICAgICAgcHVsbF9yZXF1ZXN0OiB7XG4gICAgICAgIHR5cGVzOiBbJ2xhYmVsZWQnXSxcbiAgICAgIH0sXG4gICAgfSxcbiAgICBqb2JzOiB7XG4gICAgICAnZ2VuLXByJzoge1xuICAgICAgICBpZjogXCJjb250YWlucyhnaXRodWIuZXZlbnQubGFiZWwubmFtZSwgJ2dlbi1wci1hbGwnKSB8fCBjb250YWlucyhnaXRodWIuZXZlbnQubGFiZWwubmFtZSwgJ2dlbi1wci1jbGF1ZGUnKVwiLFxuICAgICAgICB1c2VzOiAnV2lsbEJvb3N0ZXIvcmV1c2FibGUtd29ya2Zsb3dzLy5naXRodWIvd29ya2Zsb3dzL2dlbi1wci55bWxAbWFpbicsXG4gICAgICAgIHdpdGg6IHtcbiAgICAgICAgICAnY29kaW5nLXRvb2wnOiAnY2xhdWRlLWNvZGUnLFxuICAgICAgICAgICdpc3N1ZS1udW1iZXInOiAnJHt7IGdpdGh1Yi5ldmVudC5pc3N1ZS5udW1iZXIgfHwgZ2l0aHViLmV2ZW50Lm51bWJlciB9fScsXG4gICAgICAgICAgJ3Rlc3QtY29tbWFuZCc6ICd5YXJufGJ1biBjaGVjay1hbGwtZm9yLWFpJyxcbiAgICAgICAgfSxcbiAgICAgICAgc2VjcmV0czoge1xuICAgICAgICAgIENMQVVERV9DT0RFX09BVVRIX1RPS0VOOiAnJHt7IHNlY3JldHMuQ0xBVURFX0NPREVfT0FVVEhfVE9LRU4gfX0nLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICB9LFxuICB9LFxuICAnZ2VuLXByLWNvZGV4Jzoge1xuICAgIG5hbWU6ICdHZW5lcmF0ZSBQUiB3aXRoIENvZGV4IENMSScsXG4gICAgb246IHtcbiAgICAgIGlzc3Vlczoge1xuICAgICAgICB0eXBlczogWydsYWJlbGVkJ10sXG4gICAgICB9LFxuICAgICAgcHVsbF9yZXF1ZXN0OiB7XG4gICAgICAgIHR5cGVzOiBbJ2xhYmVsZWQnXSxcbiAgICAgIH0sXG4gICAgfSxcbiAgICBqb2JzOiB7XG4gICAgICAnZ2VuLXByJzoge1xuICAgICAgICBpZjogXCJjb250YWlucyhnaXRodWIuZXZlbnQubGFiZWwubmFtZSwgJ2dlbi1wci1hbGwnKSB8fCBjb250YWlucyhnaXRodWIuZXZlbnQubGFiZWwubmFtZSwgJ2dlbi1wci1jb2RleCcpXCIsXG4gICAgICAgIHVzZXM6ICdXaWxsQm9vc3Rlci9yZXVzYWJsZS13b3JrZmxvd3MvLmdpdGh1Yi93b3JrZmxvd3MvZ2VuLXByLnltbEBtYWluJyxcbiAgICAgICAgd2l0aDoge1xuICAgICAgICAgICdjb2RpbmctdG9vbCc6ICdjb2RleC1jbGknLFxuICAgICAgICAgICdpc3N1ZS1udW1iZXInOiAnJHt7IGdpdGh1Yi5ldmVudC5pc3N1ZS5udW1iZXIgfHwgZ2l0aHViLmV2ZW50Lm51bWJlciB9fScsXG4gICAgICAgICAgJ3Rlc3QtY29tbWFuZCc6ICd5YXJufGJ1biBjaGVjay1hbGwtZm9yLWFpJyxcbiAgICAgICAgfSxcbiAgICAgICAgc2VjcmV0czoge1xuICAgICAgICAgIE9QRU5BSV9BUElfS0VZOiAnJHt7IHNlY3JldHMuT1BFTkFJX0FQSV9LRVkgfX0nLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICB9LFxuICB9LFxuICAnZ2VuLXByLWdlbWluaSc6IHtcbiAgICBuYW1lOiAnR2VuZXJhdGUgUFIgd2l0aCBHZW1pbmkgQ0xJJyxcbiAgICBvbjoge1xuICAgICAgaXNzdWVzOiB7XG4gICAgICAgIHR5cGVzOiBbJ2xhYmVsZWQnXSxcbiAgICAgIH0sXG4gICAgICBwdWxsX3JlcXVlc3Q6IHtcbiAgICAgICAgdHlwZXM6IFsnbGFiZWxlZCddLFxuICAgICAgfSxcbiAgICB9LFxuICAgIGpvYnM6IHtcbiAgICAgICdnZW4tcHInOiB7XG4gICAgICAgIGlmOiBcImNvbnRhaW5zKGdpdGh1Yi5ldmVudC5sYWJlbC5uYW1lLCAnZ2VuLXByLWFsbCcpIHx8IGNvbnRhaW5zKGdpdGh1Yi5ldmVudC5sYWJlbC5uYW1lLCAnZ2VuLXByLWdlbWluaScpXCIsXG4gICAgICAgIHVzZXM6ICdXaWxsQm9vc3Rlci9yZXVzYWJsZS13b3JrZmxvd3MvLmdpdGh1Yi93b3JrZmxvd3MvZ2VuLXByLnltbEBtYWluJyxcbiAgICAgICAgd2l0aDoge1xuICAgICAgICAgICdjb2RpbmctdG9vbCc6ICdnZW1pbmktY2xpJyxcbiAgICAgICAgICAnaXNzdWUtbnVtYmVyJzogJyR7eyBnaXRodWIuZXZlbnQuaXNzdWUubnVtYmVyIHx8IGdpdGh1Yi5ldmVudC5udW1iZXIgfX0nLFxuICAgICAgICAgICd0ZXN0LWNvbW1hbmQnOiAneWFybnxidW4gY2hlY2stYWxsLWZvci1haScsXG4gICAgICAgIH0sXG4gICAgICAgIHNlY3JldHM6IHtcbiAgICAgICAgICBHRU1JTklfQVBJX0tFWTogJyR7eyBzZWNyZXRzLkdFTUlOSV9BUElfS0VZIH19JyxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgfSxcbiAgfSxcbn0gYXMgY29uc3Q7XG5cbnR5cGUgS25vd25LaW5kID0ga2V5b2YgdHlwZW9mIHdvcmtmbG93cyB8ICdkZXBsb3knO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVXb3JrZmxvd3Mocm9vdENvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBmaWxlTmFtZXNUb0JlUmVtb3ZlZCA9IFtcbiAgICAnYWRkLWZvY3VzZWQtaXNzdWUtdG8tcHJvamVjdC55bWwnLFxuICAgICdhZGQtaXNzdWUtdG8tcHJvamVjdC55bWwnLFxuICAgICdhZGQtcmVhZHktaXNzdWUtdG8tcHJvamVjdC55bWwnLFxuICAgICdub3RpZnktcmVhZHkueW1sJyxcbiAgICAnd2JmeS55bWwnLFxuICAgICd3YmZ5LW1lcmdlLnltbCcsXG4gIF07XG5cbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdnZW5lcmF0ZVdvcmtmbG93JywgYXN5bmMgKCkgPT4ge1xuICAgIGlmIChpc1JldXNhYmxlV29ya2Zsb3dzUmVwbyhyb290Q29uZmlnLnJlcG9zaXRvcnkpKSB7XG4gICAgICAvLyBEb24ndCB0b3VjaCByZXVzYWJsZS13b3JrZmxvd3MgcmVwbyBiZWNhdXNlIGl0IGhvc3RzIHVwc3RyZWFtIHdvcmtmbG93IGRlZmluaXRpb25zLlxuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHdvcmtmbG93c1BhdGggPSBwYXRoLnJlc29sdmUocm9vdENvbmZpZy5kaXJQYXRoLCAnLmdpdGh1YicsICd3b3JrZmxvd3MnKTtcbiAgICBhd2FpdCBmcy5wcm9taXNlcy5ta2Rpcih3b3JrZmxvd3NQYXRoLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcblxuICAgIC8vIFJlbW92ZSBjb25maWcgb2Ygc2VtYW50aWMgcHVsbCByZXF1ZXN0XG4gICAgY29uc3Qgc2VtYW50aWNZbWxQYXRoID0gcGF0aC5yZXNvbHZlKHJvb3RDb25maWcuZGlyUGF0aCwgJy5naXRodWInLCAnc2VtYW50aWMueW1sJyk7XG4gICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzLnByb21pc2VzLnJtKHNlbWFudGljWW1sUGF0aCwgeyBmb3JjZTogdHJ1ZSwgcmVjdXJzaXZlOiB0cnVlIH0pKTtcblxuICAgIGNvbnN0IGVudHJpZXMgPSBhd2FpdCBmcy5wcm9taXNlcy5yZWFkZGlyKHdvcmtmbG93c1BhdGgsIHsgd2l0aEZpbGVUeXBlczogdHJ1ZSB9KTtcbiAgICBjb25zdCBmaWxlTmFtZVNldCA9IG5ldyBTZXQoW1xuICAgICAgJ3Rlc3QueW1sJyxcbiAgICAgICdhdXRvZml4LnltbCcsXG4gICAgICAnc2VtYW50aWMtcHIueW1sJyxcbiAgICAgICdjbG9zZS1jb21tZW50LnltbCcsXG4gICAgICAnZ2VuLXByLWNsYXVkZS55bWwnLFxuICAgICAgJ2dlbi1wci1jb2RleC55bWwnLFxuICAgICAgJ2dlbi1wci1nZW1pbmkueW1sJyxcbiAgICAgIC4uLmVudHJpZXMuZmlsdGVyKChkaXJlbnQpID0+IGRpcmVudC5pc0ZpbGUoKSAmJiBkaXJlbnQubmFtZS5lbmRzV2l0aCgnLnltbCcpKS5tYXAoKGRpcmVudCkgPT4gZGlyZW50Lm5hbWUpLFxuICAgIF0pO1xuICAgIGlmIChyb290Q29uZmlnLmRlcGVuZGluZy5zZW1hbnRpY1JlbGVhc2UpIHtcbiAgICAgIGZpbGVOYW1lU2V0LmFkZCgncmVsZWFzZS55bWwnKTtcbiAgICB9XG4gICAgZmlsZU5hbWVTZXQuZGVsZXRlKCdhdXRvZml4LnltbCcpO1xuICAgIGlmICghcm9vdENvbmZpZy5pc1B1YmxpY1JlcG8pIHtcbiAgICAgIC8vIGZvciBhdXRvZml4LmNpXG4gICAgICBmaWxlTmFtZXNUb0JlUmVtb3ZlZC5wdXNoKCdhdXRvZml4LnltbCcpO1xuICAgIH1cbiAgICBmaWxlTmFtZVNldC5kZWxldGUoJ2FkZC1pc3N1ZS10by1wcm9qZWN0LnltbCcpO1xuICAgIGZpbGVOYW1lU2V0LmRlbGV0ZSgnYWRkLXJlYWR5LWlzc3VlLXRvLXByb2plY3QueW1sJyk7XG4gICAgZmlsZU5hbWVTZXQuZGVsZXRlKCdub3RpZnktcmVhZHkueW1sJyk7XG5cbiAgICBmb3IgKGNvbnN0IGZpbGVOYW1lIG9mIGZpbGVOYW1lU2V0KSB7XG4gICAgICAvLyDlrp/pmpvjga9Lbm93bktpbmTku6XlpJbjga7lgKTjgoLku6PlhaXjgZXjgozjgovjgZPjgajjgavms6jmhI9cbiAgICAgIGNvbnN0IGtpbmQgPSBwYXRoLmJhc2VuYW1lKGZpbGVOYW1lLCAnLnltbCcpIGFzIEtub3duS2luZDtcbiAgICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiB3cml0ZVdvcmtmbG93WWFtbChyb290Q29uZmlnLCB3b3JrZmxvd3NQYXRoLCBraW5kKSk7XG4gICAgfVxuXG4gICAgZm9yIChjb25zdCBkZXByZWNhdGVkRmlsZU5hbWUgb2YgZmlsZU5hbWVzVG9CZVJlbW92ZWQpIHtcbiAgICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PlxuICAgICAgICBmcy5wcm9taXNlcy5ybShwYXRoLmpvaW4od29ya2Zsb3dzUGF0aCwgZGVwcmVjYXRlZEZpbGVOYW1lKSwgeyBmb3JjZTogdHJ1ZSwgcmVjdXJzaXZlOiB0cnVlIH0pXG4gICAgICApO1xuICAgIH1cbiAgfSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc1JldXNhYmxlV29ya2Zsb3dzUmVwbyhyZXBvc2l0b3J5Pzogc3RyaW5nKTogYm9vbGVhbiB7XG4gIHJldHVybiByZXBvc2l0b3J5Py5lbmRzV2l0aCgnL3JldXNhYmxlLXdvcmtmbG93cycpID8/IGZhbHNlO1xufVxuXG5hc3luYyBmdW5jdGlvbiB3cml0ZVdvcmtmbG93WWFtbChjb25maWc6IFBhY2thZ2VDb25maWcsIHdvcmtmbG93c1BhdGg6IHN0cmluZywga2luZDogS25vd25LaW5kKTogUHJvbWlzZTx2b2lkPiB7XG4gIGxldCBuZXdTZXR0aW5ncyA9IGNsb25lRGVlcChraW5kIGluIHdvcmtmbG93cyA/IHdvcmtmbG93c1traW5kIGFzIGtleW9mIHR5cGVvZiB3b3JrZmxvd3NdIDoge30pIGFzIFdvcmtmbG93O1xuICAvLyBTa2lwIGEgYnJva2VuIHdvcmtmbG93XG4gIGlmICghKCdqb2JzJyBpbiBuZXdTZXR0aW5ncykpIHJldHVybjtcblxuICBjb25zdCBmaWxlUGF0aCA9IHBhdGguam9pbih3b3JrZmxvd3NQYXRoLCBgJHtraW5kfS55bWxgKTtcbiAgdHJ5IHtcbiAgICBjb25zdCBvbGRDb250ZW50ID0gYXdhaXQgZnMucHJvbWlzZXMucmVhZEZpbGUoZmlsZVBhdGgsICd1dGY4Jyk7XG4gICAgY29uc3Qgb2xkU2V0dGluZ3MgPSB5YW1sLmxvYWQob2xkQ29udGVudCkgYXMgV29ya2Zsb3c7XG4gICAgbmV3U2V0dGluZ3MgPSBtZXJnZS5hbGwoW25ld1NldHRpbmdzLCBvbGRTZXR0aW5ncywgbmV3U2V0dGluZ3NdLCB7IGFycmF5TWVyZ2U6IGNvbWJpbmVNZXJnZSB9KSBhcyBXb3JrZmxvdztcbiAgfSBjYXRjaCB7XG4gICAgLy8gZG8gbm90aGluZ1xuICB9XG5cbiAgaWYgKGtpbmQuc3RhcnRzV2l0aCgnZGVwbG95JykpIHtcbiAgICBuZXdTZXR0aW5ncyA9IHtcbiAgICAgIC4uLm5ld1NldHRpbmdzLFxuICAgICAgY29uY3VycmVuY3k6IHtcbiAgICAgICAgZ3JvdXA6ICcke3sgZ2l0aHViLndvcmtmbG93IH19JyxcbiAgICAgICAgJ2NhbmNlbC1pbi1wcm9ncmVzcyc6IGZhbHNlLFxuICAgICAgfSxcbiAgICB9O1xuICAgIC8vIE1vdmUgam9icyB0byB0aGUgYm90dG9tXG4gICAgbW92ZVRvQm90dG9tKG5ld1NldHRpbmdzLCAnam9icycpO1xuICAgIGlmIChuZXdTZXR0aW5ncy5vbj8ucHVzaCkge1xuICAgICAgbmV3U2V0dGluZ3Mub24ucHVzaFsncGF0aHMtaWdub3JlJ10gPSBbXG4gICAgICAgIC4uLm5ldyBTZXQoWycqKi5tZCcsICcqKi9kb2NzLyoqJywgLi4uKG5ld1NldHRpbmdzLm9uLnB1c2hbJ3BhdGhzLWlnbm9yZSddID8/IFtdKV0pLFxuICAgICAgXTtcbiAgICB9XG4gIH1cblxuICBsZXQgaXNSZXVzYWJsZVdvcmtmbG93ID0gZmFsc2U7XG4gIGZvciAoY29uc3Qgam9iIG9mIE9iamVjdC52YWx1ZXMobmV3U2V0dGluZ3Muam9icykpIHtcbiAgICAvLyBJZ25vcmUgbm9uLXJldXNhYmxlIHdvcmtmbG93c1xuICAgIGlmICgham9iLnVzZXM/LmluY2x1ZGVzKCcvcmV1c2FibGUtd29ya2Zsb3dzLycpKSBjb250aW51ZTtcblxuICAgIG5vcm1hbGl6ZUpvYihjb25maWcsIGpvYiwga2luZCk7XG4gICAgaXNSZXVzYWJsZVdvcmtmbG93ID0gdHJ1ZTtcbiAgfVxuICBpZiAoIWlzUmV1c2FibGVXb3JrZmxvdykgcmV0dXJuO1xuXG4gIHN3aXRjaCAoa2luZCkge1xuICAgIGNhc2UgJ3JlbGVhc2UnOiB7XG4gICAgICBpZiAobmV3U2V0dGluZ3Mub24/LnNjaGVkdWxlKSB7XG4gICAgICAgIGRlbGV0ZSBuZXdTZXR0aW5ncy5vbi5wdXNoO1xuICAgICAgfSBlbHNlIGlmIChuZXdTZXR0aW5ncy5vbj8ucHVzaCAmJiBjb25maWcucmVsZWFzZS5icmFuY2hlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgIG5ld1NldHRpbmdzLm9uLnB1c2guYnJhbmNoZXMgPSBjb25maWcucmVsZWFzZS5icmFuY2hlcztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIERvbid0IHVzZSByZWxlYXNlLnltbCBpZiByZWxlYXNlIGJyYW5jaCBpcyBub3Qgc3BlY2lmaWVkXG4gICAgICAgIGF3YWl0IGZzLnByb21pc2VzLnJtKHBhdGguam9pbih3b3JrZmxvd3NQYXRoLCAncmVsZWFzZS55bWwnKSwgeyBmb3JjZTogdHJ1ZSB9KTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgYnJlYWs7XG4gICAgfVxuICAgIGNhc2UgJ3Rlc3QnOiB7XG4gICAgICAvLyBEb24ndCB1c2UgYHBhdGhzLWlnbm9yZWAgZm9yIHRlc3QgYmVjYXVzZSBHaXRIdWIncyBCcmFuY2ggUHJvdGVjdGlvbiBhbmQgUnVsZXNldHMgcmVxdWlyZSBqb2IgcnVubmluZy5cbiAgICAgIGlmIChuZXdTZXR0aW5ncy5vbj8ucHVsbF9yZXF1ZXN0KSB7XG4gICAgICAgIGRlbGV0ZSBuZXdTZXR0aW5ncy5vbi5wdWxsX3JlcXVlc3RbJ3BhdGhzLWlnbm9yZSddO1xuICAgICAgfVxuICAgICAgaWYgKG5ld1NldHRpbmdzLm9uPy5wdXNoKSB7XG4gICAgICAgIGRlbGV0ZSBuZXdTZXR0aW5ncy5vbi5wdXNoWydwYXRocy1pZ25vcmUnXTtcbiAgICAgICAgbmV3U2V0dGluZ3Mub24ucHVzaC5icmFuY2hlcyA9IG5ld1NldHRpbmdzLm9uLnB1c2guYnJhbmNoZXMuZmlsdGVyKChicmFuY2gpID0+IGJyYW5jaCAhPT0gJ3Jlbm92YXRlLyoqJyk7XG4gICAgICB9XG4gICAgICBicmVhaztcbiAgICB9XG4gICAgLy8gTm8gZGVmYXVsdFxuICB9XG4gIG1pZ3JhdGVXb3JrZmxvdyhuZXdTZXR0aW5ncyk7XG4gIGF3YWl0IHdyaXRlWWFtbChuZXdTZXR0aW5ncywgZmlsZVBhdGgpO1xuXG4gIGlmIChraW5kID09PSAncmVsZWFzZScpIHtcbiAgICBhd2FpdCBmcy5wcm9taXNlcy5ybShwYXRoLmpvaW4od29ya2Zsb3dzUGF0aCwgJ3NlbWFudGljLXJlbGVhc2UueW1sJyksIHsgZm9yY2U6IHRydWUgfSk7XG4gIH0gZWxzZSBpZiAoa2luZCA9PT0gJ3N5bmMnKSB7XG4gICAgYXdhaXQgZnMucHJvbWlzZXMucm0ocGF0aC5qb2luKHdvcmtmbG93c1BhdGgsICdzeW5jLWluaXQueW1sJyksIHsgZm9yY2U6IHRydWUgfSk7XG4gICAgaWYgKCFuZXdTZXR0aW5ncy5qb2JzLnN5bmM/LndpdGgpIHJldHVybjtcblxuICAgIC8vIEdlbmVyYXRlIHN5bmMtZm9yY2UueW1sIGJhc2VkIG9uIHN5bmMueW1sIGlmIGl0IGV4aXN0cy5cbiAgICBuZXdTZXR0aW5ncy5qb2JzWydzeW5jLWZvcmNlJ10gPSBuZXdTZXR0aW5ncy5qb2JzLnN5bmM7XG4gICAgY29uc3QgcGFyYW1zID0gbmV3U2V0dGluZ3Muam9icy5zeW5jLndpdGguc3luY19wYXJhbXNfd2l0aG91dF9kZXN0O1xuICAgIGlmICh0eXBlb2YgcGFyYW1zICE9PSAnc3RyaW5nJykgcmV0dXJuO1xuXG4gICAgbmV3U2V0dGluZ3Muam9icy5zeW5jLndpdGguc3luY19wYXJhbXNfd2l0aG91dF9kZXN0ID0gYC0tZm9yY2UgJHtwYXJhbXN9YDtcbiAgICBuZXdTZXR0aW5ncy5uYW1lID0gJ0ZvcmNlIHRvIFN5bmMnO1xuICAgIG5ld1NldHRpbmdzLm9uID0geyB3b3JrZmxvd19kaXNwYXRjaDogbnVsbCB9O1xuICAgIGRlbGV0ZSBuZXdTZXR0aW5ncy5qb2JzLnN5bmM7XG4gICAgYXdhaXQgd3JpdGVZYW1sKG5ld1NldHRpbmdzLCBwYXRoLmpvaW4od29ya2Zsb3dzUGF0aCwgJ3N5bmMtZm9yY2UueW1sJykpO1xuICB9XG59XG5cbmZ1bmN0aW9uIG5vcm1hbGl6ZUpvYihjb25maWc6IFBhY2thZ2VDb25maWcsIGpvYjogSm9iLCBraW5kOiBLbm93bktpbmQpOiB2b2lkIHtcbiAgam9iLndpdGggPz89IHt9O1xuICBqb2Iuc2VjcmV0cyA/Pz0ge307XG4gIC8vIFVzZSB0cnVzdGVkIHB1Ymxpc2hpbmcgaW5zdGVhZCBvZiBOUE1fVE9LRU5cbiAgZGVsZXRlIGpvYi5zZWNyZXRzLk5QTV9UT0tFTjtcblxuICBpZiAoXG4gICAga2luZCA9PT0gJ3Rlc3QnIHx8XG4gICAga2luZCA9PT0gJ3JlbGVhc2UnIHx8XG4gICAga2luZCA9PT0gJ2dlbi1wci1jbGF1ZGUnIHx8XG4gICAga2luZCA9PT0gJ2dlbi1wci1jb2RleCcgfHxcbiAgICBraW5kID09PSAnZ2VuLXByLWdlbWluaSdcbiAgKSB7XG4gICAgam9iLnNlY3JldHMuR0hfVE9LRU4gPSAnJHt7IHNlY3JldHMuR0lUSFVCX1RPS0VOIH19JztcbiAgfVxuXG4gIC8vIFNldCB0ZXN0LWNvbW1hbmQgZm9yIGdlbi1wciB3b3JrZmxvd3MgYmFzZWQgb24gcGFja2FnZSBtYW5hZ2VyXG4gIGlmIChraW5kID09PSAnZ2VuLXByLWNsYXVkZScgfHwga2luZCA9PT0gJ2dlbi1wci1jb2RleCcgfHwga2luZCA9PT0gJ2dlbi1wci1nZW1pbmknKSB7XG4gICAgam9iLndpdGhbJ3Rlc3QtY29tbWFuZCddID0gY29uZmlnLmlzQnVuID8gJ2J1biBydW4gY2hlY2stYWxsLWZvci1haScgOiAneWFybiBjaGVjay1hbGwtZm9yLWFpJztcbiAgfVxuICBpZiAoam9iLnNlY3JldHMuRklSRUJBU0VfVE9LRU4pIHtcbiAgICBqb2Iuc2VjcmV0cy5HQ1BfU0FfS0VZX0pTT05fRk9SX0ZJUkVCQVNFID0gJyR7eyBzZWNyZXRzLkdDUF9TQV9LRVlfSlNPTl9GT1JfRklSRUJBU0UgfX0nO1xuICAgIGRlbGV0ZSBqb2Iuc2VjcmV0cy5GSVJFQkFTRV9UT0tFTjtcbiAgfVxuICBpZiAoXG4gICAgKGpvYi5zZWNyZXRzLkRJU0NPUkRfV0VCSE9PS19VUkwgJiYgKGtpbmQgPT09ICdyZWxlYXNlJyB8fCBraW5kLnN0YXJ0c1dpdGgoJ2RlcGxveScpKSkgfHxcbiAgICAoam9iLndpdGguc2VydmVyX3VybCAmJiBraW5kLnN0YXJ0c1dpdGgoJ2RlcGxveScpKVxuICApIHtcbiAgICBqb2Iuc2VjcmV0cy5ESVNDT1JEX1dFQkhPT0tfVVJMID0gJyR7eyBzZWNyZXRzLkRJU0NPUkRfV0VCSE9PS19VUkxfRk9SX1JFTEVBU0UgfX0nO1xuICB9XG5cbiAgaWYgKGtpbmQgPT09ICdzeW5jJykge1xuICAgIGNvbnN0IHBhcmFtcyA9IGpvYi53aXRoLnN5bmNfcGFyYW1zX3dpdGhvdXRfZGVzdDtcbiAgICBpZiAodHlwZW9mIHBhcmFtcyA9PT0gJ3N0cmluZycpIHtcbiAgICAgIGpvYi53aXRoLnN5bmNfcGFyYW1zX3dpdGhvdXRfZGVzdCA9IHBhcmFtcy5yZXBsYWNlKCdzeW5jICcsICcnKTtcbiAgICB9XG4gIH1cblxuICBpZiAoY29uZmlnLnJlcG9zaXRvcnk/LnN0YXJ0c1dpdGgoJ2dpdGh1YjpXaWxsQm9vc3Rlci8nKSkge1xuICAgIGpvYi51c2VzID0gam9iLnVzZXM/LnJlcGxhY2UoJ1dpbGxCb29zdGVyTGFiLycsICdXaWxsQm9vc3Rlci8nKTtcbiAgfSBlbHNlIGlmIChjb25maWcucmVwb3NpdG9yeT8uc3RhcnRzV2l0aCgnZ2l0aHViOldpbGxCb29zdGVyTGFiLycpKSB7XG4gICAgam9iLnVzZXMgPSBqb2IudXNlcz8ucmVwbGFjZSgnV2lsbEJvb3N0ZXIvJywgJ1dpbGxCb29zdGVyTGFiLycpO1xuICB9XG5cbiAgLy8gUmVtb3ZlIHJlZHVuZGFudCBwYXJhbWV0ZXJzXG4gIGlmIChqb2Iud2l0aC5kb3RfZW52X3BhdGggPT09ICcuZW52Jykge1xuICAgIGRlbGV0ZSBqb2Iud2l0aC5kb3RfZW52X3BhdGg7XG4gIH1cbiAgLy8gUmVtb3ZlIGRlcHJlY2F0ZWQgcGFyYW1ldGVyc1xuICBtaWdyYXRlSm9iKGpvYik7XG5cbiAgLy8gRG9uJ3QgdXNlIGBmbHkgZGVwbG95IC0tanNvbmAgc2luY2UgaXQgY2F1c2VzIGFuIGVycm9yXG4gIGlmIChraW5kLnN0YXJ0c1dpdGgoJ2RlcGxveScpICYmIGpvYi5zZWNyZXRzLkZMWV9BUElfVE9LRU4gJiYgdHlwZW9mIGpvYi53aXRoLmRlcGxveV9jb21tYW5kID09PSAnc3RyaW5nJykge1xuICAgIGpvYi53aXRoLmRlcGxveV9jb21tYW5kID0gam9iLndpdGguZGVwbG95X2NvbW1hbmQucmVwbGFjZSgvXFxzKy0tanNvbi8sICcnKTtcbiAgfVxuICBpZiAoY29uZmlnLmRvZXNDb250YWluRG9ja2VyZmlsZSAmJiAham9iLndpdGguY2lfbGFiZWwgJiYga2luZC5zdGFydHNXaXRoKCd0ZXN0JykpIHtcbiAgICBqb2Iud2l0aC5jaV9sYWJlbCA9ICdsYXJnZSc7XG4gIH1cbiAgLy8gQmVjYXVzZSBnaXRodWIuZXZlbnQucmVwb3NpdG9yeS5wcml2YXRlIGlzIGFsd2F5cyB0cnVlIGlmIGpvYiBpcyBzY2hlZHVsZWRcbiAgaWYgKGtpbmQgPT09ICdyZWxlYXNlJyB8fCBraW5kID09PSAndGVzdCcgfHwga2luZC5zdGFydHNXaXRoKCdkZXBsb3knKSkge1xuICAgIGlmIChjb25maWcuaXNQdWJsaWNSZXBvKSB7XG4gICAgICBqb2Iud2l0aC5naXRodWJfaG9zdGVkX3J1bm5lciA9IHRydWU7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIGRlbGV0ZSBqb2Iud2l0aC5naXRodWJfaG9zdGVkX3J1bm5lcjtcbiAgfVxuXG4gIGlmIChPYmplY3Qua2V5cyhqb2Iud2l0aCkubGVuZ3RoID4gMCkge1xuICAgIHNvcnRLZXlzKGpvYi53aXRoKTtcbiAgfSBlbHNlIHtcbiAgICBkZWxldGUgam9iLndpdGg7XG4gIH1cbiAgaWYgKE9iamVjdC5rZXlzKGpvYi5zZWNyZXRzKS5sZW5ndGggPiAwKSB7XG4gICAgLy8gTW92ZSBzZWNyZXRzIHByb3AgYWZ0ZXIgd2l0aCBwcm9wXG4gICAgY29uc3QgbmV3U2VjcmV0cyA9IHNvcnRLZXlzKGpvYi5zZWNyZXRzKTtcbiAgICBkZWxldGUgam9iLnNlY3JldHM7XG4gICAgam9iLnNlY3JldHMgPSBuZXdTZWNyZXRzO1xuICB9IGVsc2Uge1xuICAgIGRlbGV0ZSBqb2Iuc2VjcmV0cztcbiAgfVxufVxuXG5hc3luYyBmdW5jdGlvbiB3cml0ZVlhbWwobmV3U2V0dGluZ3M6IFdvcmtmbG93LCBmaWxlUGF0aDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IHlhbWxUZXh0ID0geWFtbC5kdW1wKG5ld1NldHRpbmdzLCB7IGxpbmVXaWR0aDogLTEsIG5vQ29tcGF0TW9kZTogdHJ1ZSwgc3R5bGVzOiB7ICchIW51bGwnOiAnZW1wdHknIH0gfSk7XG4gIGF3YWl0IGZzLnByb21pc2VzLndyaXRlRmlsZShmaWxlUGF0aCwgeWFtbFRleHQpO1xufVxuXG5mdW5jdGlvbiBtaWdyYXRlV29ya2Zsb3cobmV3U2V0dGluZ3M6IFdvcmtmbG93KTogdm9pZCB7XG4gIC8vIFRPRE86IFJlbW92ZSB0aGVtIGFmdGVyIDIwMjMtMDMtMzFcbiAgZGVsZXRlIG5ld1NldHRpbmdzLmpvYnNbJ2FkZC10by1wcm9qZWN0J107XG59XG5cbmZ1bmN0aW9uIG1pZ3JhdGVKb2Ioam9iOiBKb2IpOiB2b2lkIHtcbiAgLy8gVE9ETzogUmVtb3ZlIHRoZW0gYWZ0ZXIgMjAyMy0wMy0zMVxuICBpZiAoIWpvYi53aXRoKSByZXR1cm47XG4gIGRlbGV0ZSBqb2Iud2l0aC5ub25fc2VsZl9ob3N0ZWQ7XG4gIGRlbGV0ZSBqb2Iud2l0aC5ub3RpZnlfZGlzY29yZDtcbiAgZGVsZXRlIGpvYi53aXRoLnJlcXVpcmVfZmx5O1xuICBkZWxldGUgam9iLndpdGgucmVxdWlyZV9nY2xvdWQ7XG4gIGRlbGV0ZSBqb2Iud2l0aC5sYWJlbDtcbiAgZGVsZXRlIGpvYi53aXRoLmxhYmVsT3BlcmF0b3I7XG4gIC8vIEFkZGVkIDIwMjUtMDgtMDZcbiAgaWYgKGpvYi53aXRoLmNpX3NpemUpIHtcbiAgICBqb2Iud2l0aC5jaV9sYWJlbCA9IGpvYi53aXRoLmNpX3NpemU7XG4gICAgZGVsZXRlIGpvYi53aXRoLmNpX3NpemU7XG4gIH1cbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCBmZyBmcm9tICdmYXN0LWdsb2InO1xuXG5pbXBvcnQgeyBpc1JldXNhYmxlV29ya2Zsb3dzUmVwbyB9IGZyb20gJy4uL2dlbmVyYXRvcnMvd29ya2Zsb3cuanMnO1xuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB7IG9wdGlvbnMgfSBmcm9tICcuLi9vcHRpb25zLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZnNVdGlsIH0gZnJvbSAnLi4vdXRpbHMvZnNVdGlsLmpzJztcbmltcG9ydCB7IGdsb2JJZ25vcmUgfSBmcm9tICcuLi91dGlscy9nbG9iVXRpbC5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGZpeFR5cG9zKHBhY2thZ2VDb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdmaXhUeXBvcycsIGFzeW5jICgpID0+IHtcbiAgICBpZiAoaXNSZXVzYWJsZVdvcmtmbG93c1JlcG8ocGFja2FnZUNvbmZpZy5yZXBvc2l0b3J5KSkgcmV0dXJuO1xuXG4gICAgY29uc3QgZGlyUGF0aCA9IHBhY2thZ2VDb25maWcuZGlyUGF0aDtcbiAgICBjb25zdCBkb2NGaWxlcyA9IGF3YWl0IGZnLmdsb2IoJyoqLyoubWQnLCB7IGRvdDogdHJ1ZSwgY3dkOiBkaXJQYXRoLCBpZ25vcmU6IGdsb2JJZ25vcmUgfSk7XG4gICAgaWYgKG9wdGlvbnMuaXNWZXJib3NlKSB7XG4gICAgICBjb25zb2xlLmluZm8oYEZvdW5kICR7ZG9jRmlsZXMubGVuZ3RofSBtYXJrZG93biBmaWxlcyBpbiAke2RpclBhdGh9YCk7XG4gICAgfVxuICAgIGZvciAoY29uc3QgbWRGaWxlIG9mIGRvY0ZpbGVzKSB7XG4gICAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGguam9pbihkaXJQYXRoLCBtZEZpbGUpO1xuICAgICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKGFzeW5jICgpID0+IHtcbiAgICAgICAgY29uc3QgY29udGVudCA9IGF3YWl0IGZzLnByb21pc2VzLnJlYWRGaWxlKGZpbGVQYXRoLCAndXRmOCcpO1xuICAgICAgICBsZXQgbmV3Q29udGVudCA9IGZpeFR5cG9zSW5UZXh0KGNvbnRlbnQpO1xuICAgICAgICBuZXdDb250ZW50ID0gcmVwbGFjZVdpdGhDb25maWcobmV3Q29udGVudCwgcGFja2FnZUNvbmZpZywgJ2RvYycpO1xuICAgICAgICBpZiAoY29udGVudCAhPT0gbmV3Q29udGVudCkge1xuICAgICAgICAgIGF3YWl0IGZzVXRpbC5nZW5lcmF0ZUZpbGUoZmlsZVBhdGgsIG5ld0NvbnRlbnQpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBjb25zdCB0c0ZpbGVzID0gYXdhaXQgZmcuZ2xvYihcbiAgICAgIFtcbiAgICAgICAgJ3thcHAsc3JjLHRlc3Qsc2NyaXB0c30vKiovKi57Y2pzLG1qcyxqcyxqc3gsY3RzLG10cyx0cyx0c3h9JyxcbiAgICAgICAgJ3BhY2thZ2VzLyoqL3thcHAsc3JjLHRlc3Qsc2NyaXB0c30vKiovKi57Y2pzLG1qcyxqcyxqc3gsY3RzLG10cyx0cyx0c3h9JyxcbiAgICAgIF0sXG4gICAgICB7IGRvdDogdHJ1ZSwgY3dkOiBkaXJQYXRoLCBpZ25vcmU6IGdsb2JJZ25vcmUgfVxuICAgICk7XG4gICAgaWYgKG9wdGlvbnMuaXNWZXJib3NlKSB7XG4gICAgICBjb25zb2xlLmluZm8oYEZvdW5kICR7dHNGaWxlcy5sZW5ndGh9IFR5cGVTY3JpcHQgZmlsZXMgaW4gJHtkaXJQYXRofWApO1xuICAgIH1cbiAgICBmb3IgKGNvbnN0IHRzRmlsZSBvZiB0c0ZpbGVzKSB7XG4gICAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGguam9pbihkaXJQYXRoLCB0c0ZpbGUpO1xuICAgICAgY29uc3Qgb2xkQ29udGVudCA9IGF3YWl0IGZzLnByb21pc2VzLnJlYWRGaWxlKGZpbGVQYXRoLCAndXRmOCcpO1xuICAgICAgbGV0IG5ld0NvbnRlbnQgPSBmaXhUeXBvc0luQ29kZShvbGRDb250ZW50KTtcbiAgICAgIG5ld0NvbnRlbnQgPSByZXBsYWNlV2l0aENvbmZpZyhuZXdDb250ZW50LCBwYWNrYWdlQ29uZmlnLCAndHMnKTtcblxuICAgICAgaWYgKG9sZENvbnRlbnQgPT09IG5ld0NvbnRlbnQpIGNvbnRpbnVlO1xuICAgICAgYXdhaXQgZnNVdGlsLmdlbmVyYXRlRmlsZShmaWxlUGF0aCwgbmV3Q29udGVudCk7XG4gICAgfVxuXG4gICAgY29uc3QgdGV4dEJhc2VkRmlsZXMgPSBhd2FpdCBmZy5nbG9iKCcqKi8qLntjc3YsaHRtLGh0bWwsdHN2LHhtbCx5YW1sLHltbH0nLCB7XG4gICAgICBkb3Q6IHRydWUsXG4gICAgICBjd2Q6IGRpclBhdGgsXG4gICAgICBpZ25vcmU6IGdsb2JJZ25vcmUsXG4gICAgfSk7XG4gICAgaWYgKG9wdGlvbnMuaXNWZXJib3NlKSB7XG4gICAgICBjb25zb2xlLmluZm8oYEZvdW5kICR7dGV4dEJhc2VkRmlsZXMubGVuZ3RofSB0ZXh0LWJhc2VkIGZpbGVzIGluICR7ZGlyUGF0aH1gKTtcbiAgICB9XG4gICAgZm9yIChjb25zdCBmaWxlIG9mIHRleHRCYXNlZEZpbGVzKSB7XG4gICAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGguam9pbihkaXJQYXRoLCBmaWxlKTtcbiAgICAgIGNvbnN0IG9sZENvbnRlbnQgPSBhd2FpdCBmcy5wcm9taXNlcy5yZWFkRmlsZShmaWxlUGF0aCwgJ3V0ZjgnKTtcbiAgICAgIGxldCBuZXdDb250ZW50ID0gZml4VHlwb3NJblRleHQob2xkQ29udGVudCk7XG4gICAgICBuZXdDb250ZW50ID0gcmVwbGFjZVdpdGhDb25maWcobmV3Q29udGVudCwgcGFja2FnZUNvbmZpZywgJ3RleHQnKTtcblxuICAgICAgaWYgKG9sZENvbnRlbnQgPT09IG5ld0NvbnRlbnQpIGNvbnRpbnVlO1xuICAgICAgYXdhaXQgZnNVdGlsLmdlbmVyYXRlRmlsZShmaWxlUGF0aCwgbmV3Q29udGVudCk7XG4gICAgfVxuXG4gICAgYXdhaXQgcHJvbWlzZVBvb2wucHJvbWlzZUFsbCgpO1xuICB9KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGZpeFR5cG9zSW5UZXh0KGNvbnRlbnQ6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiBjb250ZW50XG4gICAgLnJlcGxhY2VBbGwoL1xcYmNcXC5mXFwuKFteJF0pL2csICdjZi4kMScpXG4gICAgLnJlcGxhY2VBbGwoL1xcYmVnXFwuKFteJF0pL2csICdlLmcuJDEnKVxuICAgIC5yZXBsYWNlQWxsKC9cXGJpZVxcLihbXiRdKS9nLCAnaS5lLiQxJyk7XG59XG5cbmZ1bmN0aW9uIGZpeFR5cG9zSW5Db2RlKGNvbnRlbnQ6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiBjb250ZW50XG4gICAgLnJlcGxhY2VBbGwoL1xcL1xcLyguKiljXFwuZlxcLi9nLCAnLy8kMWNmLicpXG4gICAgLnJlcGxhY2VBbGwoL1xcL1xcLyguKillZ1xcLi9nLCAnLy8kMWUuZy4nKVxuICAgIC5yZXBsYWNlQWxsKC9cXC9cXC8oLiopaWVcXC4vZywgJy8vJDFpLmUuJyk7XG59XG5cbmZ1bmN0aW9uIHJlcGxhY2VXaXRoQ29uZmlnKG5ld0NvbnRlbnQ6IHN0cmluZywgcGFja2FnZUNvbmZpZzogUGFja2FnZUNvbmZpZywgcHJvcE5hbWU6ICdkb2MnIHwgJ3RzJyB8ICd0ZXh0Jyk6IHN0cmluZyB7XG4gIGZvciAoY29uc3QgW2JlZm9yZSwgYWZ0ZXJdIG9mIE9iamVjdC5lbnRyaWVzKHBhY2thZ2VDb25maWcud2JmeUpzb24/LnR5cG9zPy5hbGwgPz8ge30pKSB7XG4gICAgbmV3Q29udGVudCA9IG5ld0NvbnRlbnQucmVwbGFjZUFsbChiZWZvcmUsIGFmdGVyKTtcbiAgfVxuICBmb3IgKGNvbnN0IFtiZWZvcmUsIGFmdGVyXSBvZiBPYmplY3QuZW50cmllcyhwYWNrYWdlQ29uZmlnLndiZnlKc29uPy50eXBvcz8uW3Byb3BOYW1lXSA/PyB7fSkpIHtcbiAgICBuZXdDb250ZW50ID0gbmV3Q29udGVudC5yZXBsYWNlQWxsKGJlZm9yZSwgYWZ0ZXIpO1xuICB9XG4gIHJldHVybiBuZXdDb250ZW50O1xufVxuIiwiaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZnNVdGlsIH0gZnJvbSAnLi4vdXRpbHMvZnNVdGlsLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVBZ2VudEluc3RydWN0aW9ucyhyb290Q29uZmlnOiBQYWNrYWdlQ29uZmlnLCBhbGxDb25maWdzOiBQYWNrYWdlQ29uZmlnW10pOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdnZW5lcmF0ZUFnZW50SW5zdHJ1Y3Rpb25zJywgYXN5bmMgKCkgPT4ge1xuICAgIGlmICghcm9vdENvbmZpZy5pc1Jvb3QpIHJldHVybjtcblxuICAgIC8vIENoZWNrIGlmIEFHRU5UU19FWFRSQS5tZCBleGlzdHMgYW5kIHJlYWQgaXRzIGNvbnRlbnRcbiAgICBjb25zdCBhZ2VudHNFeHRyYVBhdGggPSBwYXRoLnJlc29sdmUocm9vdENvbmZpZy5kaXJQYXRoLCAnQUdFTlRTX0VYVFJBLm1kJyk7XG4gICAgY29uc3QgZXh0cmFDb250ZW50ID0gYXdhaXQgZnNVdGlsLnJlYWRGaWxlSWdub3JpbmdFcnJvcihhZ2VudHNFeHRyYVBhdGgpO1xuXG4gICAgZm9yIChjb25zdCBbZmlsZU5hbWUsIHRvb2xOYW1lXSBvZiBbXG4gICAgICBbJ0FHRU5UUy5tZCcsICdDb2RleCBDTEknXSxcbiAgICAgIFsnQ0xBVURFLm1kJywgJ0NsYXVkZSBDb2RlJ10sXG4gICAgICBbJ0dFTUlOSS5tZCcsICdHZW1pbmkgQ0xJJ10sXG4gICAgXSBhcyBjb25zdCkge1xuICAgICAgY29uc3QgY29udGVudCA9IGdlbmVyYXRlQWdlbnRJbnN0cnVjdGlvbihyb290Q29uZmlnLCBhbGxDb25maWdzLCB0b29sTmFtZSwgZXh0cmFDb250ZW50KTtcbiAgICAgIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKHJvb3RDb25maWcuZGlyUGF0aCwgZmlsZU5hbWUpO1xuICAgICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzVXRpbC5nZW5lcmF0ZUZpbGUoZmlsZVBhdGgsIGNvbnRlbnQpKTtcbiAgICB9XG5cbiAgICBjb25zdCBjdXJzb3JSdWxlc1BhdGggPSBwYXRoLnJlc29sdmUocm9vdENvbmZpZy5kaXJQYXRoLCAnLmN1cnNvci9ydWxlcy9nZW5lcmFsLm1kYycpO1xuICAgIGNvbnN0IGN1cnNvclJ1bGVzQ29udGVudCA9IGdlbmVyYXRlQ3Vyc29yR2VuZXJhbE1kY0NvbnRlbnQocm9vdENvbmZpZywgYWxsQ29uZmlncywgZXh0cmFDb250ZW50KTtcbiAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnNVdGlsLmdlbmVyYXRlRmlsZShjdXJzb3JSdWxlc1BhdGgsIGN1cnNvclJ1bGVzQ29udGVudCkpO1xuICB9KTtcbn1cblxuZnVuY3Rpb24gZ2VuZXJhdGVBZ2VudEluc3RydWN0aW9uKFxuICByb290Q29uZmlnOiBQYWNrYWdlQ29uZmlnLFxuICBhbGxDb25maWdzOiBQYWNrYWdlQ29uZmlnW10sXG4gIHRvb2xOYW1lOiBzdHJpbmcsXG4gIGV4dHJhQ29udGVudD86IHN0cmluZ1xuKTogc3RyaW5nIHtcbiAgY29uc3QgcGFja2FnZU1hbmFnZXIgPSByb290Q29uZmlnLmlzQnVuID8gJ2J1bicgOiAneWFybic7XG4gIGNvbnN0IGJhc2VDb250ZW50ID0gYFxuIyMgUHJvamVjdCBJbmZvcm1hdGlvblxuXG4tIE5hbWU6ICR7cm9vdENvbmZpZy5wYWNrYWdlSnNvbj8ubmFtZX1cbi0gRGVzY3JpcHRpb246ICR7cm9vdENvbmZpZy5wYWNrYWdlSnNvbj8uZGVzY3JpcHRpb259XG4tIFBhY2thZ2UgTWFuYWdlcjogJHtwYWNrYWdlTWFuYWdlcn1cblxuIyMgR2VuZXJhbCBJbnN0cnVjdGlvbnNcblxuJHtcbiAgYWxsQ29uZmlncy5zb21lKChjKSA9PiBjLmRlcGVuZGluZy5nZW5JMThuVHMpXG4gICAgPyBgLSBXaGVuIGludHJvZHVjaW5nIG5ldyBzdHJpbmcgbGl0ZXJhbHMgaW4gUmVhY3QgY29tcG9uZW50cywgdXBkYXRlIHRoZSBsYW5ndWFnZSByZXNvdXJjZSBmaWxlcyBpbiB0aGUgXFxgaTE4blxcYCBkaXJlY3RvcnkgKGUuZy4sIFxcYGkxOG4vamEtSlAuanNvblxcYCkuIFJlZmVyZW5jZSB0aGVzZSBzdHJpbmdzIHVzaW5nIHRoZSBcXGBpMThuXFxgIHV0aWxpdHkuIEZvciBleGFtcGxlLCB1c2UgXFxgaTE4bi5wYWdlcy5ob21lLnRpdGxlKClcXGAgZm9yIFxcYHsgXCJwYWdlc1wiOiB7IFwiaG9tZVwiOiB7IFwidGl0bGVcIjogXCJNeSBBcHBcIiB9IH0gfVxcYC5gXG4gICAgOiAnJ1xufVxuLSBEbyBub3Qgd3JpdGUgdGVzdHMgdW5sZXNzIGV4cGxpY2l0bHkgcmVxdWVzdGVkLlxuLSBBZnRlciBtYWtpbmcgY29kZSBjaGFuZ2VzLCBydW4gXFxgJHtwYWNrYWdlTWFuYWdlcn0gY2hlY2stYWxsLWZvci1haVxcYCB0byBleGVjdXRlIGFsbCB0ZXN0cyAobm90ZTogdGhpcyBtYXkgdGFrZSB1cCB0byAzMCBtaW51dGVzKSwgb3IgcnVuIFxcYCR7cGFja2FnZU1hbmFnZXJ9IGNoZWNrLWZvci1haVxcYCBmb3IgdHlwZSBjaGVja2luZyBhbmQgbGludGluZyBvbmx5LlxuICAtIElmIHlvdSBhcmUgY29uZmlkZW50IHlvdXIgY2hhbmdlcyB3aWxsIG5vdCBicmVhayBhbnkgdGVzdHMsIHlvdSBtYXkgdXNlIFxcYGNoZWNrLWZvci1haVxcYC5cbi0gT25jZSB5b3UgaGF2ZSB2ZXJpZmllZCB5b3VyIGNoYW5nZXMsIGNvbW1pdCB0aGVtIHRvIHRoZSBjdXJyZW50IGJyYW5jaCB1c2luZyB0aGUgXFxgLS1uby12ZXJpZnlcXGAgb3B0aW9uIGFuZCBwdXNoIHRvIHRoZSBjdXJyZW50IGJyYW5jaC5cbiAgLSBGb2xsb3cgY29udmVudGlvbmFsIGNvbW1pdHMsIGkuZS4sIHlvdXIgY29tbWl0IG1lc3NhZ2Ugc2hvdWxkIHN0YXJ0IHdpdGggXFxgZmVhdDpcXGAsIFxcYGZpeDpcXGAsIGV0Yy5cbiAgLSBNYWtlIHN1cmUgdG8gYWRkIGEgbmV3IGxpbmUgYXQgdGhlIGVuZCBvZiB5b3VyIGNvbW1pdCBtZXNzYWdlJHtyb290Q29uZmlnLmlzV2lsbEJvb3N0ZXJSZXBvID8gYCB3aXRoOiBcXGBDby1hdXRob3JlZC1ieTogV2lsbEJvb3N0ZXIgKCR7dG9vbE5hbWV9KSA8YWdlbnRAd2lsbGJvb3N0ZXIuY29tPlxcYGAgOiAnJ30uXG4gIC0gQWx3YXlzIGNyZWF0ZSBuZXcgY29tbWl0cy4gQXZvaWQgdXNpbmcgXFxgLS1hbWVuZFxcYC5cbiR7XG4gIGFsbENvbmZpZ3Muc29tZSgoYykgPT4gYy5oYXNTdGFydFRlc3QpXG4gICAgPyBgLSBVc2UgXFxgJHtwYWNrYWdlTWFuYWdlcn0gcnVuIHN0YXJ0LXRlc3RcXGAgdG8gbGF1bmNoIGEgd2ViIHNlcnZlciBmb3IgZGVidWdnaW5nIG9yIHRlc3RpbmcuYFxuICAgIDogJydcbn1cblxuIyMgQ29kaW5nIFN0eWxlXG5cbi0gV3JpdGUgY29tbWVudHMgdGhhdCBleHBsYWluIFwid2h5XCIgcmF0aGVyIHRoYW4gXCJ3aGF0XCIuIEF2b2lkIGV4cGxhbmF0aW9ucyB0aGF0IGNhbiBiZSB1bmRlcnN0b29kIGZyb20gdGhlIGNvZGUgaXRzZWxmLlxuLSBVc2Ugc3RkZXJyIGZvciBsb2dnaW5nIGRlYnVnIG1lc3NhZ2VzIHRlbXBvcmFyaWx5IHNpbmNlIHN0ZG91dCBvdXRwdXQgaXMgc29tZXRpbWVzIG9taXR0ZWQuXG4tIFdoZW4gYWRkaW5nIG5ldyBmdW5jdGlvbnMgb3IgY2xhc3NlcywgZGVmaW5lIHRoZW0gYmVsb3cgYW55IGZ1bmN0aW9ucyBvciBjbGFzc2VzIHRoYXQgY2FsbCB0aGVtIHRvIG1haW50YWluIGNsZWFyIGNhbGwgb3JkZXIuXG4tIFByZWZlciBcXGB1bmRlZmluZWRcXGAgb3ZlciBcXGBudWxsXFxgIHVubGVzcyBleHBsaWNpdGx5IGRlYWxpbmcgd2l0aCBBUElzIG9yIGxpYnJhcmllcyB0aGF0IHJlcXVpcmUgXFxgbnVsbFxcYC5cbi0gQWx3YXlzIHBlcmZvcm0gZXhpc3RlbmNlIGNoZWNrcyBvbiBhcnJheSBkdWUgdG8gXFxgbm9VbmNoZWNrZWRJbmRleGVkQWNjZXNzOiB0cnVlXFxgLlxuJHtcbiAgYWxsQ29uZmlncy5zb21lKChjKSA9PiBjLmRlcGVuZGluZy5yZWFjdCB8fCBjLmRlcGVuZGluZy5uZXh0KVxuICAgID8gYC0gUHJlZmVyIFxcYHVzZUltbWVyXFxgIGZvciBzdG9yaW5nIGFuIGFycmF5IG9yIGFuIG9iamVjdCB0byBcXGB1c2VTdGF0ZVxcYC5gXG4gICAgOiAnJ1xufVxuJHtcbiAgYWxsQ29uZmlncy5zb21lKChjKSA9PiBjLmRlcGVuZGluZy5uZXh0KVxuICAgID8gYC0gU2luY2UgdGhpcyBwcm9qZWN0IHVzZXMgdGhlIFJlYWN0IENvbXBpbGVyLCB5b3UgZG8gbm90IG5lZWQgdG8gdXNlIFxcYHVzZUNhbGxiYWNrXFxgIG9yIFxcYHVzZU1lbW9cXGAgZm9yIHBlcmZvcm1hbmNlIG9wdGltaXphdGlvbi5gXG4gICAgOiAnJ1xufVxuYFxuICAgIC5yZXBsYWNlQWxsKC9cXC5cXG5cXG4rLS9nLCAnLlxcbi0nKVxuICAgIC5yZXBsYWNlQWxsKC9cXG57Myx9L2csICdcXG5cXG4nKVxuICAgIC50cmltKCk7XG5cbiAgcmV0dXJuIGV4dHJhQ29udGVudCA/IGJhc2VDb250ZW50ICsgJ1xcbicgKyBleHRyYUNvbnRlbnQudHJpbUVuZCgpIDogYmFzZUNvbnRlbnQ7XG59XG5cbmZ1bmN0aW9uIGdlbmVyYXRlQ3Vyc29yR2VuZXJhbE1kY0NvbnRlbnQoXG4gIGNvbmZpZzogUGFja2FnZUNvbmZpZyxcbiAgYWxsQ29uZmlnczogUGFja2FnZUNvbmZpZ1tdLFxuICBleHRyYUNvbnRlbnQ/OiBzdHJpbmdcbik6IHN0cmluZyB7XG4gIGNvbnN0IGZyb250bWF0dGVyID0gYC0tLVxcbmRlc2NyaXB0aW9uOiBHZW5lcmFsIENvZGluZyBSdWxlc1xcbmdsb2JzOlxcbmFsd2F5c0FwcGx5OiB0cnVlXFxuLS0tYDtcbiAgY29uc3QgYm9keSA9IGdlbmVyYXRlQWdlbnRJbnN0cnVjdGlvbihjb25maWcsIGFsbENvbmZpZ3MsICdDdXJzb3InLCBleHRyYUNvbnRlbnQpO1xuICByZXR1cm4gYCR7ZnJvbnRtYXR0ZXJ9XFxuXFxuJHtib2R5fWA7XG59XG4iLCJpbXBvcnQgeyBPY3Rva2l0IH0gZnJvbSAnQG9jdG9raXQvY29yZSc7XG5cbmNsYXNzIEdpdEh1YlV0aWwge1xuICBnZXRPcmdBbmROYW1lKHVybE9yRnVsbE5hbWU6IHN0cmluZyk6IFtzdHJpbmcsIHN0cmluZ10ge1xuICAgIGNvbnN0IHVybFdpdGhvdXRQcm90b2NvbCA9IHVybE9yRnVsbE5hbWUuc3BsaXQoJzonKS5hdCgtMSk7XG4gICAgY29uc3QgbmFtZXMgPSB1cmxXaXRob3V0UHJvdG9jb2w/LnNwbGl0KCcvJyk7XG4gICAgY29uc3Qgb3JnID0gbmFtZXM/LmF0KC0yKSA/PyAnJztcbiAgICBjb25zdCBuYW1lID0gbmFtZXM/LmF0KC0xKT8ucmVwbGFjZSgvLmdpdCQvLCAnJykgPz8gJyc7XG4gICAgcmV0dXJuIFtvcmcsIG5hbWVdO1xuICB9XG59XG5leHBvcnQgY29uc3QgZ2l0SHViVXRpbCA9IG5ldyBHaXRIdWJVdGlsKCk7XG5cbmNvbnN0IG9jdG9raXRDYWNoZSA9IG5ldyBNYXA8c3RyaW5nLCBPY3Rva2l0PigpO1xuXG5leHBvcnQgZnVuY3Rpb24gZ2V0T2N0b2tpdChvd25lcj86IHN0cmluZyk6IE9jdG9raXQge1xuICBjb25zdCBrZXkgPSBvd25lciA/PyAnJztcbiAgY29uc3QgY2FjaGVkID0gb2N0b2tpdENhY2hlLmdldChrZXkpO1xuICBpZiAoY2FjaGVkKSByZXR1cm4gY2FjaGVkO1xuXG4gIGNvbnN0IG9jdG9raXQgPSBuZXcgT2N0b2tpdCh7XG4gICAgYXV0aDogZ2V0R2l0SHViVG9rZW4ob3duZXIpIHx8IHVuZGVmaW5lZCxcbiAgfSk7XG4gIG9jdG9raXRDYWNoZS5zZXQoa2V5LCBvY3Rva2l0KTtcbiAgcmV0dXJuIG9jdG9raXQ7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBoYXNHaXRIdWJUb2tlbihvd25lcjogc3RyaW5nKTogYm9vbGVhbiB7XG4gIHJldHVybiAhIWdldEdpdEh1YlRva2VuKG93bmVyKTtcbn1cblxuZnVuY3Rpb24gZ2V0R2l0SHViVG9rZW4ob3duZXI/OiBzdHJpbmcpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBpZiAob3duZXIgPT09ICdXaWxsQm9vc3RlcicpIHtcbiAgICByZXR1cm4gcHJvY2Vzcy5lbnYuR0hfQk9UX1BBVF9GT1JfV0lMTEJPT1NURVI7XG4gIH1cbiAgaWYgKG93bmVyID09PSAnV2lsbEJvb3N0ZXJMYWInKSB7XG4gICAgcmV0dXJuIHByb2Nlc3MuZW52LkdIX0JPVF9QQVRfRk9SX1dJTExCT09TVEVSTEFCO1xuICB9XG4gIHJldHVybiAoXG4gICAgcHJvY2Vzcy5lbnYuR0hfQk9UX1BBVF9GT1JfV0lMTEJPT1NURVIgfHxcbiAgICBwcm9jZXNzLmVudi5HSF9CT1RfUEFUX0ZPUl9XSUxMQk9PU1RFUkxBQiB8fFxuICAgIHByb2Nlc3MuZW52LkdIX1RPS0VOIHx8XG4gICAgcHJvY2Vzcy5lbnYuR0lUSFVCX1RPS0VOXG4gICk7XG59XG4iLCJpbXBvcnQgdHlwZSB7IFNwYXduU3luY09wdGlvbnMgfSBmcm9tICdub2RlOmNoaWxkX3Byb2Nlc3MnO1xuaW1wb3J0IGNoaWxkX3Byb2Nlc3MgZnJvbSAnbm9kZTpjaGlsZF9wcm9jZXNzJztcblxuZXhwb3J0IGZ1bmN0aW9uIHNwYXduU3luYyhjb21tYW5kOiBzdHJpbmcsIGFyZ3M6IHN0cmluZ1tdLCBjd2Q6IHN0cmluZywgcmV0cnkgPSAwKTogdm9pZCB7XG4gIGRvIHtcbiAgICBjb25zdCBbbmV3Q21kLCBuZXdBcmdzLCBvcHRpb25zXSA9IGdldFNwYXduU3luY0FyZ3MoY29tbWFuZCwgYXJncywgY3dkKTtcbiAgICBjb25zb2xlLmxvZyhgJCAke25ld0NtZH0gJHtuZXdBcmdzLmpvaW4oJyAnKX0gYXQgJHtjd2R9YCk7XG4gICAgY29uc3QgcmV0ID0gY2hpbGRfcHJvY2Vzcy5zcGF3blN5bmMobmV3Q21kLCBuZXdBcmdzLCBvcHRpb25zKTtcbiAgICBpZiAocmV0LnN0YXR1cyA9PT0gMCkgYnJlYWs7XG4gIH0gd2hpbGUgKC0tcmV0cnkgPj0gMCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBzcGF3blN5bmNXaXRoU3RyaW5nUmVzdWx0KGNvbW1hbmQ6IHN0cmluZywgYXJnczogc3RyaW5nW10sIGN3ZDogc3RyaW5nKTogc3RyaW5nIHtcbiAgY29uc3QgW25ld0NtZCwgbmV3QXJncywgb3B0aW9uc10gPSBnZXRTcGF3blN5bmNBcmdzKGNvbW1hbmQsIGFyZ3MsIGN3ZCk7XG4gIG9wdGlvbnMuc3RkaW8gPSAncGlwZSc7XG4gIGNvbnN0IHByb2MgPSBjaGlsZF9wcm9jZXNzLnNwYXduU3luYyhuZXdDbWQsIG5ld0FyZ3MsIG9wdGlvbnMpO1xuICBjb25zdCBlcnJvciA9IHByb2Muc3RkZXJyLnRvU3RyaW5nKCkudHJpbSgpO1xuICBpZiAoZXJyb3IpIHtcbiAgICBjb25zb2xlLmVycm9yKFxuICAgICAgYCR7bmV3Q21kfSBbJHtuZXdBcmdzLm1hcCgocykgPT4gYFwiJHtzfVwiYCkuam9pbignLCAnKX1dIG91dHB1dHMgdGhlIGZvbGxvd2luZyBjb250ZW50IHRvIHN0ZGVycjpcXG4ke2Vycm9yfWBcbiAgICApO1xuICB9XG4gIHJldHVybiBwcm9jLnN0ZG91dC50b1N0cmluZygpLnRyaW0oKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldFNwYXduU3luY0FyZ3MoY29tbWFuZDogc3RyaW5nLCBhcmdzOiBzdHJpbmdbXSwgY3dkOiBzdHJpbmcpOiBbc3RyaW5nLCBzdHJpbmdbXSwgU3Bhd25TeW5jT3B0aW9uc10ge1xuICBjb25zdCBlbnYgPSB7IC4uLnByb2Nlc3MuZW52IH07XG4gIC8vIFJlbW92ZSBiZXJyeSBmcm9tIFBBVEhcbiAgaWYgKGVudi5QQVRIICYmIGVudi5CRVJSWV9CSU5fRk9MREVSKSB7XG4gICAgZW52LlBBVEggPSBlbnYuUEFUSC5yZXBsYWNlKGAke2Vudi5CRVJSWV9CSU5fRk9MREVSfTpgLCAnJyk7XG4gIH1cblxuICBpZiAoZW52LkFTREZfRElSKSB7XG4gICAgYXJncyA9IFsnLWwnLCAnLWMnLCBgJHtjb21tYW5kfSAke2FyZ3Muam9pbignICcpfWBdO1xuICAgIGNvbW1hbmQgPSAnYmFzaCc7XG4gIH1cbiAgcmV0dXJuIFtcbiAgICBjb21tYW5kLFxuICAgIGFyZ3MsXG4gICAge1xuICAgICAgY3dkLFxuICAgICAgZW52LFxuICAgICAgc2hlbGw6IGZhbHNlLFxuICAgICAgc3RkaW86ICdpbmhlcml0JyxcbiAgICB9LFxuICBdO1xufVxuIiwiZXhwb3J0IGZ1bmN0aW9uIGNvbnZlcnRWZXJzaW9uSW50b051bWJlcih2ZXJzaW9uOiBzdHJpbmcpOiBudW1iZXIge1xuICAvLyBlLmcuIGphdmEgYWRvcHRvcGVuamRrLTExLjAuMTcrOFxuICBjb25zdCBudW1iZXJzID0gdmVyc2lvblxuICAgIC5zcGxpdCgvWysuLV0vKVxuICAgIC5tYXAoTnVtYmVyKVxuICAgIC5maWx0ZXIoKG51bSkgPT4gIU51bWJlci5pc05hTihudW0pKTtcbiAgbGV0IHZlcnNpb25OdW1iZXIgPSAwO1xuICBsZXQgZGl2aXNvciA9IDE7XG4gIGZvciAoY29uc3QgbnVtIG9mIG51bWJlcnMpIHtcbiAgICB2ZXJzaW9uTnVtYmVyICs9IG51bSAqIGRpdmlzb3I7XG4gICAgZGl2aXNvciAvPSAxMDAwO1xuICB9XG4gIHJldHVybiB2ZXJzaW9uTnVtYmVyO1xufVxuIiwiZXhwb3J0IGNvbnN0IFBZVEhPTl9WRVJTSU9OID0gJzMuOS4xOSc7XG5leHBvcnQgY29uc3QgSkFWQV9WRVJTSU9OID0gJ3p1bHUtMTEuNzQuMTUnO1xuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZ2V0T2N0b2tpdCB9IGZyb20gJy4uL3V0aWxzL2dpdGh1YlV0aWwuanMnO1xuaW1wb3J0IHsgcHJvbWlzZVBvb2wgfSBmcm9tICcuLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5pbXBvcnQgeyBzcGF3blN5bmMsIHNwYXduU3luY1dpdGhTdHJpbmdSZXN1bHQgfSBmcm9tICcuLi91dGlscy9zcGF3blV0aWwuanMnO1xuaW1wb3J0IHsgY29udmVydFZlcnNpb25JbnRvTnVtYmVyIH0gZnJvbSAnLi4vdXRpbHMvdmVyc2lvbi5qcyc7XG5pbXBvcnQgeyBKQVZBX1ZFUlNJT04sIFBZVEhPTl9WRVJTSU9OIH0gZnJvbSAnLi4vdXRpbHMvdmVyc2lvbkNvbnN0YW50cy5qcyc7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZW5lcmF0ZVRvb2xWZXJzaW9ucyhjb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdnZW5lcmF0ZVRvb2xWZXJzaW9ucycsIGFzeW5jICgpID0+IHtcbiAgICBhd2FpdCBjb3JlKGNvbmZpZyk7XG4gIH0pO1xufVxuXG5jb25zdCBDT1JFX1RPT0xTID0gbmV3IFNldChbJ2phdmEnLCAnbm9kZWpzJywgJ2J1bicsICdweXRob24nXSk7XG5jb25zdCBERVBSRUNBVEVEX1ZFUlNJT05fUFJFRklYRVMgPSBbJ2phdmEnLCAnbm9kZScsICdweXRob24nXTtcblxuYXN5bmMgZnVuY3Rpb24gY29yZShjb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgaWYgKCFjb25maWcudmVyc2lvbnNUZXh0KSByZXR1cm47XG5cbiAgY29uc3QgZHVwbGljYXRhYmxlTGluZXMgPSBjb25maWcudmVyc2lvbnNUZXh0XG4gICAgLnRyaW0oKVxuICAgIC5zcGxpdCgnXFxuJylcbiAgICAubWFwKChsaW5lKSA9PiB7XG4gICAgICBjb25zdCBbbmFtZSwgdmVyc2lvbl0gPSBsaW5lLnRyaW0oKS5zcGxpdCgvXFxzKy8pO1xuICAgICAgLy8gVG8gbW92ZSB0aGUgdG9wIG9mIHRoZSBzb3J0ZWQgbGlzdCwgd2UgbmVlZCB0byBhZGQgYSBzcGFjZS5cbiAgICAgIHJldHVybiBgJHtDT1JFX1RPT0xTLmhhcyhuYW1lID8/ICcnKSA/ICcgJyA6ICcnfSR7bmFtZSA/PyAnJ30gJHt2ZXJzaW9uID8/ICcnfWA7XG4gICAgfSlcbiAgICAudG9Tb3J0ZWQoKVxuICAgIC8vIFJlbW92ZSBhZGRlZCBzcGFjZXMuXG4gICAgLm1hcCgobGluZSkgPT4gbGluZS50cmltKCkpXG4gICAgLy8gVE9ETzogcmVtb3ZlIHRoZSBmb2xsb3dpbmcgbGluZSBhZnRlciBsZWZ0aG9vayBpcyBpbnN0YWxsZWQgdmlhIG5wbS5cbiAgICAuZmlsdGVyKChsaW5lKSA9PiAhbGluZS5zdGFydHNXaXRoKCdsZWZ0aG9vaycpKTtcbiAgY29uc3QgbGluZXMgPSBbLi4ubmV3IFNldChkdXBsaWNhdGFibGVMaW5lcyldO1xuXG4gIGlmIChjb25maWcuZG9lc0NvbnRhaW5Qb2V0cnlMb2NrKSB7XG4gICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaCgnaHR0cHM6Ly9weXBpLm9yZy9weXBpL3BvZXRyeS9qc29uJyk7XG4gICAgY29uc3QganNvbiA9IChhd2FpdCByZXNwb25zZS5qc29uKCkpIGFzIHsgaW5mbz86IHsgdmVyc2lvbjogc3RyaW5nIH0gfSB8IHVuZGVmaW5lZDtcbiAgICBjb25zdCBwb2V0cnlWZXJzaW9uID0ganNvbj8uaW5mbz8udmVyc2lvbjtcbiAgICBpZiAocG9ldHJ5VmVyc2lvbikge1xuICAgICAgdXBkYXRlVmVyc2lvbihsaW5lcywgJ3BvZXRyeScsIHBvZXRyeVZlcnNpb24pO1xuICAgIH1cbiAgICB1cGRhdGVWZXJzaW9uKGxpbmVzLCAncHl0aG9uJywgUFlUSE9OX1ZFUlNJT04sIHRydWUpO1xuICB9XG4gIGlmIChjb25maWcuZGVwZW5kaW5nLmZpcmViYXNlKSB7XG4gICAgdXBkYXRlVmVyc2lvbihsaW5lcywgJ2phdmEnLCBKQVZBX1ZFUlNJT04sIHRydWUpO1xuICB9XG4gIGlmIChjb25maWcuZG9lc0NvbnRhaW5QYWNrYWdlSnNvbikge1xuICAgIGlmIChjb25maWcuaXNCdW4pIHtcbiAgICAgIGNvbnN0IGJ1blZlcnNpb24gPSBhd2FpdCBnZXRMYXRlc3RWZXJzaW9uRnJvbVRhZ09uR2l0SHViKCdvdmVuLXNoJywgJ2J1bicpO1xuICAgICAgaWYgKGJ1blZlcnNpb24pIHVwZGF0ZVZlcnNpb24obGluZXMsICdidW4nLCBidW5WZXJzaW9uKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgdmVyc2lvbiA9IHNwYXduU3luY1dpdGhTdHJpbmdSZXN1bHQoJ25wbScsIFsnc2hvdycsICd5YXJuJywgJ3ZlcnNpb24nXSwgY29uZmlnLmRpclBhdGgpO1xuICAgICAgdXBkYXRlVmVyc2lvbihsaW5lcywgJ3lhcm4nLCB2ZXJzaW9uKTtcbiAgICB9XG4gIH1cblxuICBmb3IgKGNvbnN0IHByZWZpeCBvZiBERVBSRUNBVEVEX1ZFUlNJT05fUFJFRklYRVMpIHtcbiAgICBjb25zdCB2ZXJzaW9uUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgYC4ke3ByZWZpeH0tdmVyc2lvbmApO1xuICAgIHZvaWQgZnMucHJvbWlzZXMucm0odmVyc2lvblBhdGgsIHsgZm9yY2U6IHRydWUgfSk7XG4gIH1cblxuICBjb25zdCB0b29sVmVyc2lvbnNQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnLnRvb2wtdmVyc2lvbnMnKTtcbiAgYXdhaXQgKGxpbmVzLmxlbmd0aCA+IDBcbiAgICA/IHByb21pc2VQb29sLnJ1bigoKSA9PiBmcy5wcm9taXNlcy53cml0ZUZpbGUodG9vbFZlcnNpb25zUGF0aCwgbGluZXMuam9pbignXFxuJykgKyAnXFxuJykpXG4gICAgOiBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnMucHJvbWlzZXMucm0odG9vbFZlcnNpb25zUGF0aCwgeyBmb3JjZTogdHJ1ZSB9KSkpO1xuICBhd2FpdCBwcm9taXNlUG9vbC5wcm9taXNlQWxsKCk7XG4gIHNwYXduU3luYygnYXNkZicsIFsncGx1Z2luJywgJ3VwZGF0ZScsICctLWFsbCddLCBjb25maWcuZGlyUGF0aCk7XG4gIHNwYXduU3luYygnYXNkZicsIFsnaW5zdGFsbCddLCBjb25maWcuZGlyUGF0aCk7XG59XG5cbmZ1bmN0aW9uIHVwZGF0ZVZlcnNpb24obGluZXM6IHN0cmluZ1tdLCB0b29sTmFtZTogc3RyaW5nLCBuZXdWZXJzaW9uOiBzdHJpbmcsIGhlYWQgPSBmYWxzZSk6IHZvaWQge1xuICBjb25zdCBpbmRleCA9IGxpbmVzLmZpbmRJbmRleCgobCkgPT4gbC5zcGxpdCgvXFxzKy8pWzBdID09PSB0b29sTmFtZSk7XG4gIGNvbnN0IG5ld0xpbmUgPSBgJHt0b29sTmFtZX0gJHtuZXdWZXJzaW9ufWA7XG4gIGlmIChpbmRleCA9PT0gLTEpIHtcbiAgICBsaW5lcy5zcGxpY2UoaGVhZCA/IDAgOiBsaW5lcy5sZW5ndGgsIDAsIG5ld0xpbmUpO1xuICB9IGVsc2Uge1xuICAgIGNvbnN0IFssIHZlcnNpb25dID0gKGxpbmVzW2luZGV4XSBhcyBzdHJpbmcpLnNwbGl0KC9cXHMrLyk7XG4gICAgaWYgKGNvbnZlcnRWZXJzaW9uSW50b051bWJlcihuZXdWZXJzaW9uKSA+IGNvbnZlcnRWZXJzaW9uSW50b051bWJlcih2ZXJzaW9uID8/ICcnKSkge1xuICAgICAgbGluZXNbaW5kZXhdID0gbmV3TGluZTtcbiAgICB9XG4gIH1cbn1cblxuYXN5bmMgZnVuY3Rpb24gZ2V0TGF0ZXN0VmVyc2lvbkZyb21UYWdPbkdpdEh1Yihvcmdhbml6YXRpb246IHN0cmluZywgcmVwb3NpdG9yeTogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmcgfCB1bmRlZmluZWQ+IHtcbiAgdHJ5IHtcbiAgICAvLyBGZXRjaCB0aGUgbGF0ZXN0IHJlbGVhc2UgZnJvbSB0aGUgcmVwb3NpdG9yeSAobm8gcmVxdWlyZWQgcGVybWlzc2lvbnMpXG4gICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBnZXRPY3Rva2l0KCkucmVxdWVzdCgnR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9yZWxlYXNlcy9sYXRlc3QnLCB7XG4gICAgICBvd25lcjogb3JnYW5pemF0aW9uLFxuICAgICAgcmVwbzogcmVwb3NpdG9yeSxcbiAgICB9KTtcbiAgICBjb25zdCB2ZXJzaW9uID0gcmVzcG9uc2UuZGF0YS50YWdfbmFtZTtcbiAgICBjb25zdCBpbmRleCA9IHZlcnNpb24ubGFzdEluZGV4T2YoJ3YnKTtcbiAgICBjb25zdCB2ZXJzaW9uTnVtYmVyVGV4dCA9IGluZGV4ID09PSAtMSA/IHZlcnNpb24gOiB2ZXJzaW9uLnNsaWNlKGluZGV4ICsgMSk7XG4gICAgLy8gQ2hlY2sgdGhlIGZpcnN0IGNoYXJhY3RlciBpcyBhIG51bWJlclxuICAgIHJldHVybiAvXlxcZC8udGVzdCh2ZXJzaW9uTnVtYmVyVGV4dCkgPyB2ZXJzaW9uTnVtYmVyVGV4dCA6IHVuZGVmaW5lZDtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBjb25zb2xlLmVycm9yKCdGYWlsZWQgdG8gZmV0Y2ggQnVuIHRhZ3MgZHVlIHRvOicsIGVycm9yKTtcbiAgICByZXR1cm47XG4gIH1cbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCBtZXJnZSBmcm9tICdkZWVwbWVyZ2UnO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBmc1V0aWwgfSBmcm9tICcuLi91dGlscy9mc1V0aWwuanMnO1xuaW1wb3J0IHsgb3ZlcndyaXRlTWVyZ2UgfSBmcm9tICcuLi91dGlscy9tZXJnZVV0aWwuanMnO1xuaW1wb3J0IHsgcHJvbWlzZVBvb2wgfSBmcm9tICcuLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZW5lcmF0ZUJpb21lSnNvbmMoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZ2VuZXJhdGVCaW9tZUpzb25jJywgYXN5bmMgKCkgPT4ge1xuICAgIGxldCBuZXdTZXR0aW5nczogb2JqZWN0ID0ge1xuICAgICAgcm9vdDogY29uZmlnLmlzUm9vdCxcbiAgICAgICRzY2hlbWE6ICcuL25vZGVfbW9kdWxlcy9AYmlvbWVqcy9iaW9tZS9jb25maWd1cmF0aW9uX3NjaGVtYS5qc29uJyxcbiAgICAgIGV4dGVuZHM6IFsnQHdpbGxib29zdGVyL2Jpb21lLWNvbmZpZyddLFxuICAgIH07XG4gICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICdiaW9tZS5qc29uYycpO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBvbGRDb250ZW50ID0gYXdhaXQgZnMucHJvbWlzZXMucmVhZEZpbGUoZmlsZVBhdGgsICd1dGY4Jyk7XG4gICAgICBjb25zdCBvbGRTZXR0aW5ncyA9IEpTT04ucGFyc2Uob2xkQ29udGVudCkgYXMgb2JqZWN0O1xuICAgICAgbmV3U2V0dGluZ3MgPSBtZXJnZS5hbGwoW25ld1NldHRpbmdzLCBvbGRTZXR0aW5ncywgbmV3U2V0dGluZ3NdLCB7IGFycmF5TWVyZ2U6IG92ZXJ3cml0ZU1lcmdlIH0pO1xuICAgIH0gY2F0Y2gge1xuICAgICAgLy8gZG8gbm90aGluZ1xuICAgIH1cbiAgICBjb25zdCBuZXdDb250ZW50ID0gSlNPTi5zdHJpbmdpZnkobmV3U2V0dGluZ3MpO1xuICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiBmc1V0aWwuZ2VuZXJhdGVGaWxlKGZpbGVQYXRoLCBuZXdDb250ZW50KSk7XG4gIH0pO1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZnNVdGlsIH0gZnJvbSAnLi4vdXRpbHMvZnNVdGlsLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuXG5jb25zdCBuZXdDb250ZW50V2l0aEV4YWN0VHJ1ZSA9IGBlbnYgPSBmYWxzZVxudGVsZW1ldHJ5ID0gZmFsc2VcblxuW2luc3RhbGxdXG5leGFjdCA9IHRydWVcbmxpbmtlciA9IFwiaG9pc3RlZFwiXG5taW5pbXVtUmVsZWFzZUFnZSA9IDQzMjAwMCAjIDUgZGF5c1xubWluaW11bVJlbGVhc2VBZ2VFeGNsdWRlcyA9IFtcbiAgICBcIkB3aWxsYm9vc3Rlci9iYWJlbC1jb25maWdzXCIsXG4gICAgXCJAd2lsbGJvb3N0ZXIvYmlvbWUtY29uZmlnXCIsXG4gICAgXCJAd2lsbGJvb3N0ZXIvZXNsaW50LWNvbmZpZy1qc1wiLFxuICAgIFwiQHdpbGxib29zdGVyL2VzbGludC1jb25maWctanMtcmVhY3RcIixcbiAgICBcIkB3aWxsYm9vc3Rlci9lc2xpbnQtY29uZmlnLW5leHRcIixcbiAgICBcIkB3aWxsYm9vc3Rlci9lc2xpbnQtY29uZmlnLXRzXCIsXG4gICAgXCJAd2lsbGJvb3N0ZXIvZXNsaW50LWNvbmZpZy10cy1yZWFjdFwiLFxuICAgIFwiQHdpbGxib29zdGVyL3ByZXR0aWVyLWNvbmZpZ1wiLFxuICAgIFwiQHdpbGxib29zdGVyL3diXCJcbl1cblxuW3J1bl1cbmJ1biA9IHRydWVcbmA7XG5cbmNvbnN0IG5ld0NvbnRlbnRXaXRoRXhhY3RGYWxzZSA9IGBlbnYgPSBmYWxzZVxudGVsZW1ldHJ5ID0gZmFsc2VcblxuW2luc3RhbGxdXG5leGFjdCA9IGZhbHNlXG5saW5rZXIgPSBcImhvaXN0ZWRcIlxubWluaW11bVJlbGVhc2VBZ2UgPSA0MzIwMDAgIyA1IGRheXNcbm1pbmltdW1SZWxlYXNlQWdlRXhjbHVkZXMgPSBbXG4gICAgXCJAd2lsbGJvb3N0ZXIvYmFiZWwtY29uZmlnc1wiLFxuICAgIFwiQHdpbGxib29zdGVyL2Jpb21lLWNvbmZpZ1wiLFxuICAgIFwiQHdpbGxib29zdGVyL2VzbGludC1jb25maWctanNcIixcbiAgICBcIkB3aWxsYm9vc3Rlci9lc2xpbnQtY29uZmlnLWpzLXJlYWN0XCIsXG4gICAgXCJAd2lsbGJvb3N0ZXIvZXNsaW50LWNvbmZpZy1uZXh0XCIsXG4gICAgXCJAd2lsbGJvb3N0ZXIvZXNsaW50LWNvbmZpZy10c1wiLFxuICAgIFwiQHdpbGxib29zdGVyL2VzbGludC1jb25maWctdHMtcmVhY3RcIixcbiAgICBcIkB3aWxsYm9vc3Rlci9wcmV0dGllci1jb25maWdcIixcbiAgICBcIkB3aWxsYm9vc3Rlci93YlwiXG5dXG5cbltydW5dXG5idW4gPSB0cnVlXG5gO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVCdW5maWdUb21sKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2dlbmVyYXRlQnVuZmlnVG9tbCcsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJ2J1bmZpZy50b21sJyk7XG4gICAgY29uc3QgY29udGVudCA9XG4gICAgICBmcy5leGlzdHNTeW5jKGZpbGVQYXRoKSAmJiBmcy5yZWFkRmlsZVN5bmMoZmlsZVBhdGgsICd1dGY4JykuaW5jbHVkZXMoJ2V4YWN0ID0gZmFsc2UnKVxuICAgICAgICA/IG5ld0NvbnRlbnRXaXRoRXhhY3RGYWxzZVxuICAgICAgICA6IG5ld0NvbnRlbnRXaXRoRXhhY3RUcnVlO1xuICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiBmc1V0aWwuZ2VuZXJhdGVGaWxlKGZpbGVQYXRoLCBjb250ZW50KSk7XG4gIH0pO1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuXG5jb25zdCB1c2VyQ29udGVudEhlYWRlciA9ICcjIFByb2plY3Qtc3BlY2lmaWMgc2V0dGluZ3MnO1xuY29uc3QgdXNlckNvbnRlbnRIZWFkZXJSZWdleCA9IC8jIFByb2plY3Qtc3BlY2lmaWMgc2V0dGluZ3NbXlxcbl0qXFxuL2dtO1xuY29uc3Qgc2VwYXJhdG9yID0gJyMgR2VuZXJhdGVkIGJ5IHdiZnknO1xuY29uc3Qgc2VwYXJhdG9yUHJlZml4ID0gJyMgR2VuZXJhdGVkIGJ5ICc7XG5jb25zdCBkZWZhdWx0SGVhZFVzZXJDb250ZW50ID0gYCR7dXNlckNvbnRlbnRIZWFkZXJ9IChoZWFkKVxuXG5cbiR7c2VwYXJhdG9yfVxuYDtcbmNvbnN0IGRlZmF1bHRUYWlsVXNlckNvbnRlbnQgPSBgXG4ke3VzZXJDb250ZW50SGVhZGVyfSAodGFpbClcbmA7XG5cbmV4cG9ydCBjb25zdCBpZ25vcmVGaWxlVXRpbCA9IHtcbiAgc2VwYXJhdG9yLFxuICBzZXBhcmF0b3JQcmVmaXgsXG4gIGRlZmF1bHRIZWFkVXNlckNvbnRlbnQsXG4gIGRlZmF1bHRUYWlsVXNlckNvbnRlbnQsXG4gIGFzeW5jIHJlYWRHaXRpZ25vcmVXaXRob3V0U2VwYXJhdG9ycyhmaWxlUGF0aDogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmcgfCB1bmRlZmluZWQ+IHtcbiAgICB0cnkge1xuICAgICAgbGV0IGNvbnRlbnQgPSBhd2FpdCBmcy5wcm9taXNlcy5yZWFkRmlsZShmaWxlUGF0aCwgJ3V0ZjgnKTtcbiAgICAgIGNvbnN0IGxhc3RIZWFkZXJJbmRleCA9IGdldEluZGV4T2ZUYWlsVXNlckNvbnRlbnRIZWFkZXIoY29udGVudCk7XG4gICAgICBpZiAobGFzdEhlYWRlckluZGV4ID4gMCkge1xuICAgICAgICBjb250ZW50ID0gY29udGVudC5zbGljZSgwLCBsYXN0SGVhZGVySW5kZXggLSAxKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiAoXG4gICAgICAgIGNvbnRlbnRcbiAgICAgICAgICAucmVwbGFjZUFsbCh1c2VyQ29udGVudEhlYWRlclJlZ2V4LCAnJylcbiAgICAgICAgICAucmVwbGFjZUFsbCgvIyBHZW5lcmF0ZWQgYnkgW15cXG5dKlxcbi9nbSwgJycpXG4gICAgICAgICAgLnJlcGxhY2VBbGwoL1xccj9cXG5cXHI/XFxuKFxccj9cXG4pKy9nbSwgJ1xcblxcbicpXG4gICAgICAgICAgLnRyaW0oKSArICdcXG4nXG4gICAgICApO1xuICAgIH0gY2F0Y2gge1xuICAgICAgLy8gZG8gbm90aGluZ1xuICAgIH1cbiAgfSxcbiAgZ2V0SGVhZFVzZXJDb250ZW50KGNvbnRlbnQ6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgY29uc3QgaW5kZXggPSBjb250ZW50LmluZGV4T2YodGhpcy5zZXBhcmF0b3JQcmVmaXgpO1xuICAgIGlmIChpbmRleCAhPT0gLTEpIHtcbiAgICAgIHJldHVybiBjb250ZW50XG4gICAgICAgIC5zbGljZSgwLCBjb250ZW50LmluZGV4T2YoJ1xcbicsIGluZGV4KSArIDEpXG4gICAgICAgIC5yZXBsYWNlQWxsKHVzZXJDb250ZW50SGVhZGVyUmVnZXgsIGAke3VzZXJDb250ZW50SGVhZGVyfSAoaGVhZClcXG5gKTtcbiAgICB9XG4gICAgcmV0dXJuIGRlZmF1bHRIZWFkVXNlckNvbnRlbnQ7XG4gIH0sXG4gIGdldFRhaWxVc2VyQ29udGVudChjb250ZW50OiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGNvbnN0IGxhc3RIZWFkZXJJbmRleCA9IGdldEluZGV4T2ZUYWlsVXNlckNvbnRlbnRIZWFkZXIoY29udGVudCk7XG4gICAgaWYgKGxhc3RIZWFkZXJJbmRleCA+IDApIHtcbiAgICAgIHJldHVybiBjb250ZW50LnNsaWNlKGxhc3RIZWFkZXJJbmRleCAtIDEpO1xuICAgIH1cbiAgICByZXR1cm4gZGVmYXVsdFRhaWxVc2VyQ29udGVudDtcbiAgfSxcbiAgYXN5bmMgaXNCZXJyeVplcm9JbnN0YWxsRW5hYmxlZChmaWxlUGF0aDogc3RyaW5nKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGNvbnRlbnQgPSBhd2FpdCBmcy5wcm9taXNlcy5yZWFkRmlsZShmaWxlUGF0aCwgJ3V0ZjgnKTtcbiAgICAgIHJldHVybiBjb250ZW50LmluY2x1ZGVzKCdcXG4hLnlhcm4vY2FjaGUnKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH0sXG59O1xuXG5mdW5jdGlvbiBnZXRJbmRleE9mVGFpbFVzZXJDb250ZW50SGVhZGVyKGNvbnRlbnQ6IHN0cmluZyk6IG51bWJlciB7XG4gIGNvbnN0IGluZGV4ID0gY29udGVudC5pbmRleE9mKHVzZXJDb250ZW50SGVhZGVyKTtcbiAgY29uc3QgbGFzdEluZGV4ID0gY29udGVudC5sYXN0SW5kZXhPZih1c2VyQ29udGVudEhlYWRlcik7XG4gIHJldHVybiBsYXN0SW5kZXggPiBpbmRleCA/IGxhc3RJbmRleCA6IC0xO1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZnNVdGlsIH0gZnJvbSAnLi4vdXRpbHMvZnNVdGlsLmpzJztcbmltcG9ydCB7IGlnbm9yZUZpbGVVdGlsIH0gZnJvbSAnLi4vdXRpbHMvaWdub3JlRmlsZVV0aWwuanMnO1xuaW1wb3J0IHsgcHJvbWlzZVBvb2wgfSBmcm9tICcuLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5cbi8vIEV4ZXJjb2Rl44Gn44Gvbm9kZV9tb2R1bGVz44KSQ09QWeOBmeOCi+W/heimgeOBjOOBguOCi+OBn+OCgeOAgW5vZGVfbW9kdWxlc+OCkumZpOWkluOBl+OBpuOBr+OBhOOBkeOBquOBhOOAglxuY29uc3QgY29tbW9uQ29udGVudCA9IGBcbioqLy5pZGVhXG4qKi8qLnNxbGl0ZTMqXG4qKi8ueWFybi9pbnN0YWxsLXN0YXRlLmd6XG4qKi8udmVudlxuYDtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlRG9ja2VyaWdub3JlKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2dlbmVyYXRlRG9ja2VyaWdub3JlJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnLmRvY2tlcmlnbm9yZScpO1xuICAgIGlmIChjb25maWcuZG9lc0NvbnRhaW5Eb2NrZXJmaWxlKSB7XG4gICAgICBjb25zdCBjb250ZW50ID0gKGF3YWl0IGZzVXRpbC5yZWFkRmlsZUlnbm9yaW5nRXJyb3IoZmlsZVBhdGgpKSA/PyAnJztcbiAgICAgIGNvbnN0IGhlYWRVc2VyQ29udGVudCA9IGlnbm9yZUZpbGVVdGlsLmdldEhlYWRVc2VyQ29udGVudChjb250ZW50KTtcbiAgICAgIGNvbnN0IHRhaWxVc2VyQ29udGVudCA9IGlnbm9yZUZpbGVVdGlsLmdldFRhaWxVc2VyQ29udGVudChjb250ZW50KTtcblxuICAgICAgY29uc3QgbmV3Q29udGVudCA9IGhlYWRVc2VyQ29udGVudCArIGNvbW1vbkNvbnRlbnQgKyB0YWlsVXNlckNvbnRlbnQ7XG4gICAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnNVdGlsLmdlbmVyYXRlRmlsZShmaWxlUGF0aCwgbmV3Q29udGVudCkpO1xuICAgIH0gZWxzZSB7XG4gICAgICBhd2FpdCBmcy5wcm9taXNlcy5ybShmaWxlUGF0aCwgeyBmb3JjZTogdHJ1ZSB9KTtcbiAgICB9XG4gIH0pO1xufVxuIiwiZXhwb3J0IGNvbnN0IGV4dGVuc2lvbnMgPSB7XG4gIGNvZGVXaXRoMkluZGVudFNpemU6IFtcbiAgICAnY2pzJyxcbiAgICAnbWpzJyxcbiAgICAnanMnLFxuICAgICdqc3gnLFxuICAgICdjdHMnLFxuICAgICdtdHMnLFxuICAgICd0cycsXG4gICAgJ3RzeCcsXG4gICAgJ2pzb24nLFxuICAgICdqc29uNScsXG4gICAgJ2pzb25jJyxcbiAgICAnY3BwJyxcbiAgICAnZGFydCcsXG4gICAgJ2h0bScsXG4gICAgJ2h0bWwnLFxuICAgICdwdScsXG4gICAgJ3B1bWwnLFxuICAgICdyYicsXG4gICAgJ3Z1ZScsXG4gICAgJ3htbCcsXG4gICAgJ3lhbWwnLFxuICAgICd5bWwnLFxuICAgICdzaCcsXG4gIF0udG9Tb3J0ZWQoKSxcbiAgY29kZVdpdGg0SW5kZW50U2l6ZTogWydnbycsICdncmFkbGUnLCAnamF2YScsICdweSddLnRvU29ydGVkKCksXG4gIG1hcmtkb3duTGlrZTogWydtZCddLnRvU29ydGVkKCksXG4gIGVzbGludDogWydjanMnLCAnbWpzJywgJ2pzJywgJ2N0cycsICdtdHMnLCAndHMnLCAndHN4JywgJ2pzeCddLnRvU29ydGVkKCksXG4gIHByZXR0aWVyOiBbXG4gICAgJ2NqcycsXG4gICAgJ21qcycsXG4gICAgJ2phdmEnLFxuICAgICdqcycsXG4gICAgJ2pzeCcsXG4gICAgJ2N0cycsXG4gICAgJ210cycsXG4gICAgJ3RzJyxcbiAgICAndHN4JyxcbiAgICAnanNvbicsXG4gICAgJ2pzb241JyxcbiAgICAnanNvbmMnLFxuICAgICdjc3MnLFxuICAgICdodG0nLFxuICAgICdodG1sJyxcbiAgICAnbWQnLFxuICAgICdzY3NzJyxcbiAgICAndnVlJyxcbiAgICAneWFtbCcsXG4gICAgJ3ltbCcsXG4gIF0udG9Tb3J0ZWQoKSxcbiAgLy8gY2YuIGh0dHBzOi8vYmlvbWVqcy5kZXYvaW50ZXJuYWxzL2xhbmd1YWdlLXN1cHBvcnQvXG4gIGJpb21lOiBbXG4gICAgJ2NqcycsXG4gICAgJ21qcycsXG4gICAgJ2pzJyxcbiAgICAnanN4JyxcbiAgICAnY3RzJyxcbiAgICAnbXRzJyxcbiAgICAndHMnLFxuICAgICd0c3gnLFxuICAgICdqc29uJyxcbiAgICAnanNvbjUnLFxuICAgICdqc29uYycsXG4gICAgJ2h0bScsXG4gICAgJ2h0bWwnLFxuICAgICd2dWUnLFxuICAgICdzdmVsdGUnLFxuICAgICdhc3RybycsXG4gICAgJ2NzcycsXG4gICAgJ3lhbWwnLFxuICAgICd5bWwnLFxuICAgICdncWwnLFxuICBdLnRvU29ydGVkKCksXG59O1xuIiwiaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZXh0ZW5zaW9ucyB9IGZyb20gJy4uL3V0aWxzL2V4dGVuc2lvbnMuanMnO1xuaW1wb3J0IHsgZnNVdGlsIH0gZnJvbSAnLi4vdXRpbHMvZnNVdGlsLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuXG5jb25zdCBuZXdDb250ZW50ID0gYHJvb3QgPSB0cnVlXG5cblsqXVxuY2hhcnNldCA9IHV0Zi04XG5lbmRfb2ZfbGluZSA9IGxmXG5pbnNlcnRfZmluYWxfbmV3bGluZSA9IHRydWVcbnRyaW1fdHJhaWxpbmdfd2hpdGVzcGFjZSA9IHRydWVcblxuJHtnZW5lcmF0ZUV4dGVuc2lvbnMoZXh0ZW5zaW9ucy5jb2RlV2l0aDJJbmRlbnRTaXplKX1cbmluZGVudF9zaXplID0gMlxuaW5kZW50X3N0eWxlID0gc3BhY2VcblxuJHtnZW5lcmF0ZUV4dGVuc2lvbnMoZXh0ZW5zaW9ucy5jb2RlV2l0aDRJbmRlbnRTaXplKX1cbmluZGVudF9zaXplID0gNFxuaW5kZW50X3N0eWxlID0gc3BhY2VcblxuJHtnZW5lcmF0ZUV4dGVuc2lvbnMoZXh0ZW5zaW9ucy5tYXJrZG93bkxpa2UpfVxubWF4X2xpbmVfbGVuZ3RoID0gb2ZmXG50cmltX3RyYWlsaW5nX3doaXRlc3BhY2UgPSBmYWxzZVxuXG5be01ha2VmaWxlLCoubWt9XVxuaW5kZW50X3N0eWxlID0gdGFiXG5gO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVFZGl0b3Jjb25maWcoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZ2VuZXJhdGVFZGl0b3Jjb25maWcnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICcuZWRpdG9yY29uZmlnJyk7XG4gICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzVXRpbC5nZW5lcmF0ZUZpbGUoZmlsZVBhdGgsIG5ld0NvbnRlbnQpKTtcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIGdlbmVyYXRlRXh0ZW5zaW9ucyhleHRlbnNpb25zOiBzdHJpbmdbXSk6IHN0cmluZyB7XG4gIHJldHVybiBleHRlbnNpb25zLmxlbmd0aCA+IDEgPyBgWyoueyR7ZXh0ZW5zaW9ucy5qb2luKCcsJyl9fV1gIDogYFsqLiR7ZXh0ZW5zaW9uc1swXX1dYDtcbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGZzVXRpbCB9IGZyb20gJy4uL3V0aWxzL2ZzVXRpbC5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlRXNsaW50cmMoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZ2VuZXJhdGVFc2xpbnRyYycsIGFzeW5jICgpID0+IHtcbiAgICAvLyBSZW1vdmUgZGVwcmVjYXRlZCBmaWxlc1xuICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiBmcy5wcm9taXNlcy5ybShwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICcuZXNsaW50cmMuanNvbicpLCB7IGZvcmNlOiB0cnVlIH0pKTtcbiAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnMucHJvbWlzZXMucm0ocGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnLmVzbGludGlnbm9yZScpLCB7IGZvcmNlOiB0cnVlIH0pKTtcbiAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnMucHJvbWlzZXMucm0ocGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnZXNsaW50LmNvbmZpZy5qcycpLCB7IGZvcmNlOiB0cnVlIH0pKTtcblxuICAgIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnZXNsaW50LmNvbmZpZy5tanMnKTtcbiAgICBpZiAoY29uZmlnLmlzQnVuKSB7XG4gICAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnMucHJvbWlzZXMucm0oZmlsZVBhdGgsIHsgZm9yY2U6IHRydWUgfSkpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmICghY29uZmlnLmVzbGludEJhc2UpIHJldHVybjtcblxuICAgIHRyeSB7XG4gICAgICBjb25zdCBvbGRDb250ZW50ID0gYXdhaXQgZnMucHJvbWlzZXMucmVhZEZpbGUoZmlsZVBhdGgsICd1dGY4Jyk7XG4gICAgICBpZiAoIW9sZENvbnRlbnQuaW5jbHVkZXMoJ2V4cG9ydCB7IGRlZmF1bHQgfScpKSByZXR1cm47XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBkbyBub3RoaW5nXG4gICAgfVxuXG4gICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzVXRpbC5nZW5lcmF0ZUZpbGUoZmlsZVBhdGgsIGBleHBvcnQgeyBkZWZhdWx0IH0gZnJvbSAnJHtjb25maWcuZXNsaW50QmFzZX0nO2ApKTtcbiAgfSk7XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgbWVyZ2UgZnJvbSAnZGVlcG1lcmdlJztcbmltcG9ydCB5YW1sIGZyb20gJ2pzLXlhbWwnO1xuaW1wb3J0IGNsb25lRGVlcCBmcm9tICdsb2Rhc2guY2xvbmVkZWVwJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZnNVdGlsIH0gZnJvbSAnLi4vdXRpbHMvZnNVdGlsLmpzJztcbmltcG9ydCB7IG92ZXJ3cml0ZU1lcmdlIH0gZnJvbSAnLi4vdXRpbHMvbWVyZ2VVdGlsLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuXG5jb25zdCBkZWZhdWx0Q29uZmlnID0ge1xuICBoYXZlX2Z1bjogdHJ1ZSxcbiAgY29kZV9yZXZpZXc6IHtcbiAgICBkaXNhYmxlOiBmYWxzZSxcbiAgICBjb21tZW50X3NldmVyaXR5X3RocmVzaG9sZDogJ01FRElVTScsXG4gICAgbWF4X3Jldmlld19jb21tZW50czogLTEsXG4gICAgcHVsbF9yZXF1ZXN0X29wZW5lZDoge1xuICAgICAgaGVscDogZmFsc2UsXG4gICAgICBzdW1tYXJ5OiB0cnVlLFxuICAgICAgY29kZV9yZXZpZXc6IHRydWUsXG4gICAgfSxcbiAgfSxcbiAgaWdub3JlX3BhdHRlcm5zOiBbJyoqL19fZ2VuZXJhdGVkX18nXSxcbn07XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZW5lcmF0ZUdlbWluaUNvbmZpZyhjb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdnZW5lcmF0ZUdlbWluaUNvbmZpZycsIGFzeW5jICgpID0+IHtcbiAgICBpZiAoIWNvbmZpZy5pc1Jvb3QpIHJldHVybjtcblxuICAgIGNvbnN0IGRpclBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICcuZ2VtaW5pJyk7XG4gICAgY29uc3QgY29uZmlnRmlsZVBhdGggPSBwYXRoLnJlc29sdmUoZGlyUGF0aCwgJ2NvbmZpZy55bWwnKTtcbiAgICBjb25zdCBzdHlsZWd1aWRlRmlsZVBhdGggPSBwYXRoLnJlc29sdmUoZGlyUGF0aCwgJ3N0eWxlZ3VpZGUubWQnKTtcblxuICAgIGxldCBuZXdDb25maWc6IG9iamVjdCA9IGNsb25lRGVlcChkZWZhdWx0Q29uZmlnKTtcbiAgICB0cnkge1xuICAgICAgY29uc3Qgb2xkQ29udGVudCA9IGF3YWl0IGZzLnByb21pc2VzLnJlYWRGaWxlKGNvbmZpZ0ZpbGVQYXRoLCAndXRmOCcpO1xuICAgICAgY29uc3Qgb2xkQ29uZmlnID0geWFtbC5sb2FkKG9sZENvbnRlbnQpIGFzIG9iamVjdDtcbiAgICAgIG5ld0NvbmZpZyA9IG1lcmdlLmFsbChbbmV3Q29uZmlnLCBvbGRDb25maWcsIG5ld0NvbmZpZ10sIHsgYXJyYXlNZXJnZTogb3ZlcndyaXRlTWVyZ2UgfSk7XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBkbyBub3RoaW5nIC0gZmlsZSBkb2Vzbid0IGV4aXN0IG9yIGNhbid0IGJlIHBhcnNlZFxuICAgIH1cblxuICAgIGNvbnN0IHlhbWxDb250ZW50ID0geWFtbC5kdW1wKG5ld0NvbmZpZywge1xuICAgICAgbGluZVdpZHRoOiAtMSxcbiAgICAgIG5vQ29tcGF0TW9kZTogdHJ1ZSxcbiAgICAgIHN0eWxlczoge1xuICAgICAgICAnISFudWxsJzogJ2VtcHR5JyxcbiAgICAgIH0sXG4gICAgfSk7XG5cbiAgICBjb25zdCBzdHlsZWd1aWRlQ29udGVudCA9ICfml6XmnKzoqp7jgafjg6zjg5Pjg6Xjg7zjgZfjgabjgY/jgaDjgZXjgYTjgIInO1xuXG4gICAgY29uc3QgcHJvbWlzZXMgPSBbcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzVXRpbC5nZW5lcmF0ZUZpbGUoY29uZmlnRmlsZVBhdGgsIHlhbWxDb250ZW50KSldO1xuICAgIGlmICghZnMuZXhpc3RzU3luYyhzdHlsZWd1aWRlRmlsZVBhdGgpKSB7XG4gICAgICBwcm9taXNlcy5wdXNoKHByb21pc2VQb29sLnJ1bigoKSA9PiBmc1V0aWwuZ2VuZXJhdGVGaWxlKHN0eWxlZ3VpZGVGaWxlUGF0aCwgc3R5bGVndWlkZUNvbnRlbnQpKSk7XG4gICAgfVxuICAgIGF3YWl0IFByb21pc2UuYWxsKHByb21pc2VzKTtcbiAgfSk7XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiByZW1vdmVHZW1pbmlTZXR0aW5ncyhjb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdnZW5lcmF0ZUdlbWluaVNldHRpbmdzJywgYXN5bmMgKCkgPT4ge1xuICAgIGlmICghY29uZmlnLmlzUm9vdCkgcmV0dXJuO1xuXG4gICAgY29uc3QgZGlyUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJy5nZW1pbmknKTtcbiAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShkaXJQYXRoLCAnc2V0dGluZ3MuanNvbicpO1xuICAgIGF3YWl0IGZzLnByb21pc2VzLnJtKGZpbGVQYXRoLCB7IGZvcmNlOiB0cnVlIH0pO1xuICB9KTtcbn1cbiIsImltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGV4dGVuc2lvbnMgfSBmcm9tICcuLi91dGlscy9leHRlbnNpb25zLmpzJztcbmltcG9ydCB7IGZzVXRpbCB9IGZyb20gJy4uL3V0aWxzL2ZzVXRpbC5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcblxuLy8gY2YuIGh0dHBzOi8vYnVuLnNoL2d1aWRlcy9pbnN0YWxsL2dpdC1kaWZmLWJ1bi1sb2NrZmlsZVxuY29uc3QgbmV3Q29udGVudCA9IGAqIHRleHQ9YXV0b1xuXG4qLmxvY2tiIGJpbmFyeSBkaWZmPWxvY2tiXG4qLnZjcHJvaiB0ZXh0IGVvbD1jcmxmXG5cbiR7Wy4uLmV4dGVuc2lvbnMuY29kZVdpdGgySW5kZW50U2l6ZSwgLi4uZXh0ZW5zaW9ucy5jb2RlV2l0aDRJbmRlbnRTaXplLCAuLi5leHRlbnNpb25zLm1hcmtkb3duTGlrZV1cbiAgLm1hcCgoZXh0KSA9PiBgKi4ke2V4dH0gdGV4dCBlb2w9bGZgKVxuICAuam9pbignXFxuJyl9XG5cbmRpc3QvKiogbGluZ3Vpc3QtZ2VuZXJhdGVkPXRydWVcbmA7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZW5lcmF0ZUdpdGF0dHJpYnV0ZXMoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZ2VuZXJhdGVHaXRhdHRyaWJ1dGVzJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnLmdpdGF0dHJpYnV0ZXMnKTtcbiAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnNVdGlsLmdlbmVyYXRlRmlsZShmaWxlUGF0aCwgbmV3Q29udGVudCkpO1xuICB9KTtcbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBvcyBmcm9tICdub2RlOm9zJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgeyBvcHRpb25zIH0gZnJvbSAnLi4vb3B0aW9ucy5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGZzVXRpbCB9IGZyb20gJy4uL3V0aWxzL2ZzVXRpbC5qcyc7XG5pbXBvcnQgeyBpZ25vcmVGaWxlVXRpbCB9IGZyb20gJy4uL3V0aWxzL2lnbm9yZUZpbGVVdGlsLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuXG5jb25zdCBkZWZhdWx0TmFtZXMgPSBbJ3dpbmRvd3MnLCAnbWFjb3MnLCAnbGludXgnLCAnamV0YnJhaW5zJywgJ3Zpc3VhbHN0dWRpb2NvZGUnLCAnZW1hY3MnLCAndmltJywgJ3lhcm4nXTtcblxuY29uc3QgY29tbW9uQ29udGVudCA9IGBcbiEua2VlcFxuLmFpZGVyKlxuLmVudi5wcm9kdWN0aW9uXG4qL21vdW50LyouaGFzaFxuLmRldmNvbnRhaW5lci9cbi5pZGVhL0F1Z21lbnRXZWJ2aWV3U3RhdGVTdG9yZS54bWxcbi5pZGVhL2NvcGlsb3QuKlxuLmlkZWEvY29waWxvdC9jaGF0U2Vzc2lvbnMvXG4uc2VyZW5hL1xuLnRtcC9cbl9fZ2VuZXJhdGVkX18vXG5Ad2lsbGJvb3N0ZXIvXG5kaXN0L1xudGVtcC9cbnRtcC9cbmA7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZW5lcmF0ZUdpdGlnbm9yZShjb25maWc6IFBhY2thZ2VDb25maWcsIHJvb3RDb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdnZW5lcmF0ZUdpdGlnbm9yZScsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJy5naXRpZ25vcmUnKTtcbiAgICBjb25zdCBjb250ZW50ID0gKGF3YWl0IGZzVXRpbC5yZWFkRmlsZUlnbm9yaW5nRXJyb3IoZmlsZVBhdGgpKSA/PyAnJztcbiAgICBsZXQgaGVhZFVzZXJDb250ZW50ID0gaWdub3JlRmlsZVV0aWwuZ2V0SGVhZFVzZXJDb250ZW50KGNvbnRlbnQpICsgY29tbW9uQ29udGVudDtcbiAgICBjb25zdCB0YWlsVXNlckNvbnRlbnQgPSBpZ25vcmVGaWxlVXRpbC5nZXRUYWlsVXNlckNvbnRlbnQoY29udGVudCk7XG5cbiAgICBjb25zdCBuYW1lcyA9IFsuLi5kZWZhdWx0TmFtZXNdO1xuICAgIGlmIChjb25maWcuZG9lc0NvbnRhaW5HZW1maWxlKSB7XG4gICAgICBuYW1lcy5wdXNoKCdydWJ5Jyk7XG4gICAgfVxuICAgIGlmIChjb25maWcuZG9lc0NvbnRhaW5Hb01vZCkge1xuICAgICAgbmFtZXMucHVzaCgnZ28nKTtcbiAgICAgIGhlYWRVc2VyQ29udGVudCArPSBgJHtwYXRoLmJhc2VuYW1lKGNvbmZpZy5kaXJQYXRoKX1cbmA7XG4gICAgfVxuICAgIGlmIChjb25maWcuZG9lc0NvbnRhaW5QYWNrYWdlSnNvbikge1xuICAgICAgbmFtZXMucHVzaCgnbm9kZScpO1xuICAgIH1cbiAgICBpZiAoY29uZmlnLmRvZXNDb250YWluUG9tWG1sKSB7XG4gICAgICBuYW1lcy5wdXNoKCdtYXZlbicpO1xuICAgICAgaGVhZFVzZXJDb250ZW50ICs9IGAuaWRlYS9nb29nbGUtamF2YS1mb3JtYXQueG1sXG5gO1xuICAgIH1cbiAgICBpZiAoY29uZmlnLmRvZXNDb250YWluUHVic3BlY1lhbWwpIHtcbiAgICAgIG5hbWVzLnB1c2goJ2ZsdXR0ZXInLCAnQW5kcm9pZFN0dWRpbycsICdydWJ5Jyk7XG4gICAgICBoZWFkVXNlckNvbnRlbnQgKz0gYC5mbHV0dGVyLXBsdWdpbnMtZGVwZW5kZW5jaWVzXG5hbmRyb2lkL2tleS5wcm9wZXJ0aWVzXG5pb3MvLmJ1bmRsZVxuLmlkZWEvcnVuQ29uZmlndXJhdGlvbnMueG1sXG5gO1xuICAgIH1cbiAgICBpZiAoY29uZmlnLmRvZXNDb250YWluVGVtcGxhdGVZYW1sKSB7XG4gICAgICBoZWFkVXNlckNvbnRlbnQgKz0gYC5hd3Mtc2FtL1xucGFja2FnZWQueWFtbFxuYDtcbiAgICB9XG4gICAgLy8gQmVjYXVzZSAudmVudiBzaG91bGQgYmUgaWdub3JlZCBvbiByb290IGRpcmVjdG9yeVxuICAgIGlmIChjb25maWcuZG9lc0NvbnRhaW5Qb2V0cnlMb2NrKSB7XG4gICAgICBuYW1lcy5wdXNoKCdweXRob24nKTtcbiAgICAgIGhlYWRVc2VyQ29udGVudCArPSBgLnZlbnYvXG5gO1xuICAgIH1cblxuICAgIGlmIChjb25maWcuZGVwZW5kaW5nLmJsaXR6KSB7XG4gICAgICBoZWFkVXNlckNvbnRlbnQgKz0gYC5ibGl0ei9cbi5ibGl0eioqXG5gO1xuICAgIH1cbiAgICBpZiAoY29uZmlnLmRlcGVuZGluZy5uZXh0KSB7XG4gICAgICBuYW1lcy5wdXNoKCduZXh0anMnKTtcbiAgICB9XG4gICAgaWYgKHJvb3RDb25maWcuZGVwZW5kaW5nLmZpcmViYXNlIHx8IGNvbmZpZy5kZXBlbmRpbmcuZmlyZWJhc2UpIHtcbiAgICAgIG5hbWVzLnB1c2goJ2ZpcmViYXNlJyk7XG4gICAgfVxuICAgIGlmIChjb25maWcuZGVwZW5kaW5nLnByaXNtYSkge1xuICAgICAgaGVhZFVzZXJDb250ZW50ICs9IGAqLnNxbGl0ZTMqXG5gO1xuICAgIH1cbiAgICBpZiAoY29uZmlnLmRlcGVuZGluZy5wbGF5d3JpZ2h0VGVzdCkge1xuICAgICAgaGVhZFVzZXJDb250ZW50ICs9IGBwbGF5d3JpZ2h0LXJlcG9ydC9cbnRlc3QtcmVzdWx0cy9cbmA7XG4gICAgfVxuICAgIGlmIChyb290Q29uZmlnLmRlcGVuZGluZy5yZWFjdE5hdGl2ZSB8fCBjb25maWcuZGVwZW5kaW5nLnJlYWN0TmF0aXZlKSB7XG4gICAgICBuYW1lcy5wdXNoKCdyZWFjdG5hdGl2ZScpO1xuICAgICAgaGVhZFVzZXJDb250ZW50ICs9IGBnb29nbGUtc2VydmljZXMuanNvblxuYW5kcm9pZC9hcHAvc3JjL21haW4vYXNzZXRzL1xuYDtcbiAgICB9XG4gICAgaWYgKGNvbmZpZy5kZXBlbmRpbmcuc3Rvcnlib29rKSB7XG4gICAgICBuYW1lcy5wdXNoKCdzdG9yeWJvb2tqcycpO1xuICAgIH1cbiAgICBpZiAoY29uZmlnLmRlcGVuZGluZy5saXRlc3RyZWFtKSB7XG4gICAgICBoZWFkVXNlckNvbnRlbnQgKz0gYGdjcC1zYS1rZXkuanNvblxuYDtcbiAgICB9XG5cbiAgICBsZXQgZ2VuZXJhdGVkID0gJyc7XG4gICAgZm9yIChjb25zdCBuYW1lIG9mIG5hbWVzKSB7XG4gICAgICBsZXQgY29udGVudCA9IChhd2FpdCByZWFkQ2FjaGUobmFtZSkpID8/ICcnO1xuICAgICAgaWYgKCFjb250ZW50KSB7XG4gICAgICAgIGNvbnN0IHVybCA9IGBodHRwczovL3d3dy50b3B0YWwuY29tL2RldmVsb3BlcnMvZ2l0aWdub3JlL2FwaS8ke25hbWV9YDtcbiAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaCh1cmwpO1xuICAgICAgICBjb25zdCByZXNwb25zZVRleHQgPSBhd2FpdCByZXNwb25zZS50ZXh0KCk7XG4gICAgICAgIGlmICghcmVzcG9uc2Uub2sgfHwgcmVzcG9uc2VUZXh0LmluY2x1ZGVzKCdBdHRlbnRpb24gUmVxdWlyZWQhJykgfHwgcmVzcG9uc2VUZXh0LmluY2x1ZGVzKCc8dGl0bGU+JykpIHtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKGBGYWlsZWQgdG8gZmV0Y2ggJHt1cmx9YCk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNvbnRlbnQgPSByZXNwb25zZVRleHQudHJpbSgpO1xuICAgICAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT4gd3JpdGVDYWNoZShuYW1lLCBjb250ZW50KSk7XG4gICAgICAgIGlmIChvcHRpb25zLmlzVmVyYm9zZSkge1xuICAgICAgICAgIGNvbnNvbGUuaW5mbyhgRmV0Y2hlZCAke3VybH1gKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKGdlbmVyYXRlZCkgZ2VuZXJhdGVkICs9ICdcXG4nO1xuICAgICAgZ2VuZXJhdGVkICs9IGNvbnRlbnQgKyAnXFxuJztcbiAgICB9XG4gICAgaWYgKCEoYXdhaXQgaWdub3JlRmlsZVV0aWwuaXNCZXJyeVplcm9JbnN0YWxsRW5hYmxlZChmaWxlUGF0aCkpKSB7XG4gICAgICBnZW5lcmF0ZWQgPSBnZW5lcmF0ZWQucmVwbGFjZSgnIS55YXJuL2NhY2hlJywgJyMgIS55YXJuL2NhY2hlJykucmVwbGFjZSgnIyAucG5wLionLCAnLnBucC4qJyk7XG4gICAgfVxuICAgIGlmIChjb25maWcuZG9lc0NvbnRhaW5Qb21YbWwgfHwgY29uZmlnLmRvZXNDb250YWluUHVic3BlY1lhbWwpIHtcbiAgICAgIGdlbmVyYXRlZCA9IGdlbmVyYXRlZFxuICAgICAgICAucmVwbGFjZUFsbCgvXiMgLmlkZWFcXC9hcnRpZmFjdHMkL2dtLCAnLmlkZWEvYXJ0aWZhY3RzJylcbiAgICAgICAgLnJlcGxhY2VBbGwoL14jIC5pZGVhXFwvY29tcGlsZXIueG1sJC9nbSwgJy5pZGVhL2NvbXBpbGVyLnhtbCcpXG4gICAgICAgIC5yZXBsYWNlQWxsKC9eIyAuaWRlYVxcL2phclJlcG9zaXRvcmllcy54bWwkL2dtLCAnLmlkZWEvamFyUmVwb3NpdG9yaWVzLnhtbCcpXG4gICAgICAgIC5yZXBsYWNlQWxsKC9eIyAuaWRlYVxcL21vZHVsZXMueG1sJC9nbSwgJy5pZGVhL21vZHVsZXMueG1sJylcbiAgICAgICAgLnJlcGxhY2VBbGwoL14jIC5pZGVhXFwvKi5pbWwkL2dtLCAnLmlkZWEvKi5pbWwnKVxuICAgICAgICAucmVwbGFjZUFsbCgvXiMgLmlkZWFcXC9tb2R1bGVzJC9nbSwgJy5pZGVhL21vZHVsZXMnKVxuICAgICAgICAucmVwbGFjZUFsbCgvXiMgKi5pbWwkL2dtLCAnKi5pbWwnKVxuICAgICAgICAucmVwbGFjZUFsbCgvXiMgKi5pcHIkL2dtLCAnKi5pcHInKTtcbiAgICAgIGlmIChjb25maWcuZG9lc0NvbnRhaW5QdWJzcGVjWWFtbCkge1xuICAgICAgICBnZW5lcmF0ZWQgPSBnZW5lcmF0ZWQucmVwbGFjZUFsbCgvXi5pZGVhXFwvbW9kdWxlcy54bWwkL2dtLCAnIyAuaWRlYS9tb2R1bGVzLnhtbCcpO1xuICAgICAgfVxuICAgIH1cbiAgICBnZW5lcmF0ZWQgPSBnZW5lcmF0ZWQucmVwbGFjZUFsbCgvXi5pZGVhXFwvPyQvZ20sICcjIC5pZGVhJyk7XG4gICAgaWYgKHJvb3RDb25maWcuZGVwZW5kaW5nLnJlYWN0TmF0aXZlIHx8IGNvbmZpZy5kZXBlbmRpbmcucmVhY3ROYXRpdmUgfHwgY29uZmlnLmRvZXNDb250YWluUHVic3BlY1lhbWwpIHtcbiAgICAgIGdlbmVyYXRlZCA9IGdlbmVyYXRlZC5yZXBsYWNlQWxsKC9eKC5pZGVhXFwvLispJC9nbSwgJyQxXFxuYW5kcm9pZC8kMScpO1xuICAgIH1cbiAgICBjb25zdCBuZXdDb250ZW50ID0gaGVhZFVzZXJDb250ZW50ICsgJ1xcbicgKyBnZW5lcmF0ZWQgKyB0YWlsVXNlckNvbnRlbnQ7XG4gICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzVXRpbC5nZW5lcmF0ZUZpbGUoZmlsZVBhdGgsIG5ld0NvbnRlbnQpKTtcbiAgfSk7XG59XG5cbmNvbnN0IGRpclBhdGggPSBwYXRoLmpvaW4ob3MuaG9tZWRpcigpLCAnLmNhY2hlJywgJ3diZnknLCAnZ2l0aWdub3JlJyk7XG5cbmFzeW5jIGZ1bmN0aW9uIHdyaXRlQ2FjaGUobmFtZTogc3RyaW5nLCBjb250ZW50OiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgYXdhaXQgZnMucHJvbWlzZXMubWtkaXIoZGlyUGF0aCwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gIGF3YWl0IGZzLnByb21pc2VzLndyaXRlRmlsZShwYXRoLmpvaW4oZGlyUGF0aCwgbmFtZSksIGNvbnRlbnQpO1xufVxuXG5hc3luYyBmdW5jdGlvbiByZWFkQ2FjaGUobmFtZTogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmcgfCB1bmRlZmluZWQ+IHtcbiAgdHJ5IHtcbiAgICBjb25zdCBzdGF0ID0gYXdhaXQgZnMucHJvbWlzZXMuc3RhdChwYXRoLmpvaW4oZGlyUGF0aCwgbmFtZSkpO1xuICAgIGlmIChEYXRlLm5vdygpIC0gc3RhdC5tdGltZU1zID4gNiAqIDYwICogNjAgKiAxMDAwKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHJldHVybiBhd2FpdCBmcy5wcm9taXNlcy5yZWFkRmlsZShwYXRoLmpvaW4oZGlyUGF0aCwgbmFtZSksICd1dGY4Jyk7XG4gIH0gY2F0Y2gge1xuICAgIC8vIGRvIG5vdGhpbmdcbiAgfVxufVxuIiwiaW1wb3J0IHsgc3Bhd25TeW5jV2l0aFN0cmluZ1Jlc3VsdCB9IGZyb20gJy4uL3V0aWxzL3NwYXduVXRpbC5qcyc7XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRMYXRlc3RDb21taXRIYXNoKG9yZ2FuaXphdGlvbjogc3RyaW5nLCByZXBvOiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZz4ge1xuICB0cnkge1xuICAgIGNvbnN0IHJlcG9VcmwgPSBgZ2l0QGdpdGh1Yi5jb206JHtvcmdhbml6YXRpb259LyR7cmVwb30uZ2l0YDtcbiAgICBjb25zdCBvdXRwdXQgPSBzcGF3blN5bmNXaXRoU3RyaW5nUmVzdWx0KCdnaXQnLCBbJ2xzLXJlbW90ZScsIHJlcG9VcmwsICdIRUFEJ10sIHByb2Nlc3MuY3dkKCkpO1xuICAgIGNvbnN0IGNvbW1pdEhhc2ggPSBvdXRwdXQuc3BsaXQoL1xccysvKVswXTtcbiAgICBpZiAoIWNvbW1pdEhhc2gpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgTm8gY29tbWl0cyBmb3VuZCBmb3IgJHtvcmdhbml6YXRpb259LyR7cmVwb31gKTtcbiAgICB9XG4gICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShjb21taXRIYXNoKTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IEVycm9yKGBGYWlsZWQgdG8gZmV0Y2ggY29tbWl0cyBmb3IgJHtvcmdhbml6YXRpb259LyR7cmVwb306ICR7U3RyaW5nKGVycm9yKX1gKSk7XG4gIH1cbn1cbiIsImltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuXG5leHBvcnQgY29uc3QgRXNsaW50VXRpbCA9IHtcbiAgZ2V0TGludEZpeFN1ZmZpeChjb25maWc6IFBhY2thZ2VDb25maWcpOiBzdHJpbmcge1xuICAgIHJldHVybiBjb25maWcuZG9lc0NvbnRhaW5Kc3hPclRzeCA/ICcgLS1ydWxlIFwieyByZWFjdC1ob29rcy9leGhhdXN0aXZlLWRlcHM6IDAgfVwiJyA6ICcnO1xuICB9LFxufTtcbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCBtZXJnZSBmcm9tICdkZWVwbWVyZ2UnO1xuaW1wb3J0IGZnIGZyb20gJ2Zhc3QtZ2xvYic7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VKc29uLCBTZXRSZXF1aXJlZCB9IGZyb20gJ3R5cGUtZmVzdCc7XG5cbmltcG9ydCB7IGdldExhdGVzdENvbW1pdEhhc2ggfSBmcm9tICcuLi9naXRodWIvY29tbWl0LmpzJztcbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IEVzbGludEV4dGVuc2lvbkJhc2UsIFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IEVzbGludFV0aWwgfSBmcm9tICcuLi91dGlscy9lc2xpbnRVdGlsLmpzJztcbmltcG9ydCB7IGV4dGVuc2lvbnMgfSBmcm9tICcuLi91dGlscy9leHRlbnNpb25zLmpzJztcbmltcG9ydCB7IGdpdEh1YlV0aWwgfSBmcm9tICcuLi91dGlscy9naXRodWJVdGlsLmpzJztcbmltcG9ydCB7IGdsb2JJZ25vcmUgfSBmcm9tICcuLi91dGlscy9nbG9iVXRpbC5qcyc7XG5pbXBvcnQgeyBpZ25vcmVGaWxlVXRpbCB9IGZyb20gJy4uL3V0aWxzL2lnbm9yZUZpbGVVdGlsLmpzJztcbmltcG9ydCB7IGNvbWJpbmVNZXJnZSB9IGZyb20gJy4uL3V0aWxzL21lcmdlVXRpbC5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcbmltcG9ydCB7IHNwYXduU3luYyB9IGZyb20gJy4uL3V0aWxzL3NwYXduVXRpbC5qcyc7XG5cbmNvbnN0IGpzQ29tbW9uRGVwcyA9IFtcbiAgJ2VzbGludCcsXG4gICdlc2xpbnQtY29uZmlnLWZsYXQtZ2l0aWdub3JlJyxcbiAgJ2VzbGludC1jb25maWctcHJldHRpZXInLFxuICAnZXNsaW50LXBsdWdpbi1pbXBvcnQteCcsXG4gICdlc2xpbnQtcGx1Z2luLXNvcnQtY2xhc3MtbWVtYmVycycsXG4gICdlc2xpbnQtcGx1Z2luLXNvcnQtZGVzdHJ1Y3R1cmUta2V5cycsXG4gICdlc2xpbnQtcGx1Z2luLXVuaWNvcm4nLFxuICAnZXNsaW50LXBsdWdpbi11bnVzZWQtaW1wb3J0cycsXG4gICdnbG9iYWxzJyxcbl07XG5cbmNvbnN0IHRzQ29tbW9uRGVwcyA9IFsuLi5qc0NvbW1vbkRlcHMsICd0eXBlc2NyaXB0LWVzbGludCcsICdlc2xpbnQtaW1wb3J0LXJlc29sdmVyLXR5cGVzY3JpcHQnXTtcblxuY29uc3QgcmVhY3RDb21tb25EZXBzID0gWydlc2xpbnQtcGx1Z2luLXJlYWN0JywgJ2VzbGludC1wbHVnaW4tcmVhY3QtaG9va3MnLCAnZXNsaW50LXBsdWdpbi1yZWFjdC1jb21waWxlciddO1xuXG5jb25zdCBlc2xpbnREZXBzOiBSZWNvcmQ8RXNsaW50RXh0ZW5zaW9uQmFzZSwgc3RyaW5nW10+ID0ge1xuICAnQHdpbGxib29zdGVyL2VzbGludC1jb25maWctanMnOiBbJ0B3aWxsYm9vc3Rlci9lc2xpbnQtY29uZmlnLWpzJywgLi4uanNDb21tb25EZXBzXSxcbiAgJ0B3aWxsYm9vc3Rlci9lc2xpbnQtY29uZmlnLWpzLXJlYWN0JzogWydAd2lsbGJvb3N0ZXIvZXNsaW50LWNvbmZpZy1qcy1yZWFjdCcsIC4uLmpzQ29tbW9uRGVwcywgLi4ucmVhY3RDb21tb25EZXBzXSxcbiAgJ0B3aWxsYm9vc3Rlci9lc2xpbnQtY29uZmlnLXRzJzogWydAd2lsbGJvb3N0ZXIvZXNsaW50LWNvbmZpZy10cycsIC4uLnRzQ29tbW9uRGVwc10sXG4gICdAd2lsbGJvb3N0ZXIvZXNsaW50LWNvbmZpZy10cy1yZWFjdCc6IFsnQHdpbGxib29zdGVyL2VzbGludC1jb25maWctdHMtcmVhY3QnLCAuLi50c0NvbW1vbkRlcHMsIC4uLnJlYWN0Q29tbW9uRGVwc10sXG4gICdAd2lsbGJvb3N0ZXIvZXNsaW50LWNvbmZpZy1uZXh0JzogW1xuICAgICdAd2lsbGJvb3N0ZXIvZXNsaW50LWNvbmZpZy1uZXh0JyxcbiAgICAnZXNsaW50LWNvbmZpZy1uZXh0JyxcbiAgICAuLi50c0NvbW1vbkRlcHMsXG4gICAgLi4ucmVhY3RDb21tb25EZXBzLFxuICBdLFxufTtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlUGFja2FnZUpzb24oXG4gIGNvbmZpZzogUGFja2FnZUNvbmZpZyxcbiAgcm9vdENvbmZpZzogUGFja2FnZUNvbmZpZyxcbiAgc2tpcEFkZGluZ0RlcHM6IGJvb2xlYW5cbik6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2dlbmVyYXRlUGFja2FnZUpzb24nLCBhc3luYyAoKSA9PiB7XG4gICAgYXdhaXQgY29yZShjb25maWcsIHJvb3RDb25maWcsIHNraXBBZGRpbmdEZXBzKTtcbiAgfSk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGNvcmUoY29uZmlnOiBQYWNrYWdlQ29uZmlnLCByb290Q29uZmlnOiBQYWNrYWdlQ29uZmlnLCBza2lwQWRkaW5nRGVwczogYm9vbGVhbik6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBmaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJ3BhY2thZ2UuanNvbicpO1xuICBjb25zdCBqc29uVGV4dCA9IGF3YWl0IGZzLnByb21pc2VzLnJlYWRGaWxlKGZpbGVQYXRoLCAndXRmOCcpO1xuICBjb25zdCBqc29uT2JqID0gSlNPTi5wYXJzZShqc29uVGV4dCkgYXMgUGFja2FnZUpzb247XG4gIGpzb25PYmouc2NyaXB0cyA9IGpzb25PYmouc2NyaXB0cyA/PyB7fTtcbiAganNvbk9iai5kZXBlbmRlbmNpZXMgPSBqc29uT2JqLmRlcGVuZGVuY2llcyA/PyB7fTtcbiAganNvbk9iai5kZXZEZXBlbmRlbmNpZXMgPSBqc29uT2JqLmRldkRlcGVuZGVuY2llcyA/PyB7fTtcbiAganNvbk9iai5wZWVyRGVwZW5kZW5jaWVzID0ganNvbk9iai5wZWVyRGVwZW5kZW5jaWVzID8/IHt9O1xuICBjb25zdCBwYWNrYWdlTWFuYWdlciA9IGNvbmZpZy5pc0J1biA/ICdidW4nIDogJ3lhcm4nO1xuXG4gIGF3YWl0IHJlbW92ZURlcHJlY2F0ZWRTdHVmZihqc29uT2JqIGFzIFNldFJlcXVpcmVkPFBhY2thZ2VKc29uLCAnc2NyaXB0cycgfCAnZGVwZW5kZW5jaWVzJyB8ICdkZXZEZXBlbmRlbmNpZXMnPik7XG5cbiAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMoanNvbk9iai5zY3JpcHRzIGFzIFJlY29yZDxzdHJpbmcsIHN0cmluZz4pKSB7XG4gICAgLy8gRnJlc2ggcmVwbyBzdGlsbCByZXF1aXJlcyAneWFybiBpbnN0YWxsJ1xuICAgIGlmICghdmFsdWUuaW5jbHVkZXMoJ2dpdCBjbG9uZScpKSB7XG4gICAgICBqc29uT2JqLnNjcmlwdHNba2V5XSA9IHZhbHVlLnJlcGxhY2UoL3lhcm5cXHMqJiZcXHMqLywgJycpLnJlcGxhY2UoL3lhcm5cXHMqaW5zdGFsbFxccyomJlxccyovLCAnJyk7XG4gICAgfVxuICB9XG5cbiAganNvbk9iai5zY3JpcHRzID0gbWVyZ2UoanNvbk9iai5zY3JpcHRzLCBnZW5lcmF0ZVNjcmlwdHMoY29uZmlnLCBqc29uT2JqLnNjcmlwdHMpKTtcblxuICBpZiAoJ2NoZWNrLWZvci1haScgaW4ganNvbk9iai5zY3JpcHRzKSB7XG4gICAgaWYgKCdnZW4tY29kZScgaW4ganNvbk9iai5zY3JpcHRzKSB7XG4gICAgICBqc29uT2JqLnNjcmlwdHNbJ2NoZWNrLWZvci1haSddID0gYCR7cGFja2FnZU1hbmFnZXJ9IGdlbi1jb2RlID4gL2Rldi9udWxsICYmICR7anNvbk9iai5zY3JpcHRzWydjaGVjay1mb3ItYWknXX1gO1xuICAgIH1cbiAgICBqc29uT2JqLnNjcmlwdHNbJ2NoZWNrLWZvci1haSddID0gYCR7cGFja2FnZU1hbmFnZXJ9IGluc3RhbGwgPiAvZGV2L251bGwgJiYgJHtqc29uT2JqLnNjcmlwdHNbJ2NoZWNrLWZvci1haSddfWA7XG4gIH1cblxuICBpZiAoY29uZmlnLmlzQnVuKSB7XG4gICAgZGVsZXRlIGpzb25PYmouc2NyaXB0cy5wcmV0dGlmeTtcbiAgfSBlbHNlIHtcbiAgICBqc29uT2JqLnNjcmlwdHMucHJldHRpZnkgPSAoanNvbk9iai5zY3JpcHRzLnByZXR0aWZ5ID8/ICcnKSArIChhd2FpdCBnZW5lcmF0ZVByZXR0aWVyU3VmZml4KGNvbmZpZy5kaXJQYXRoKSk7XG4gIH1cbiAgLy8gRGVhbCB3aXRoIGJyZWFraW5nIGNoYW5nZXMgaW4geWFybiBiZXJyeSA0LjAuMC1yYy40OVxuICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhqc29uT2JqLnNjcmlwdHMpKSB7XG4gICAgaWYgKCF2YWx1ZT8uaW5jbHVkZXMoJ3lhcm4gd29ya3NwYWNlcyBmb3JlYWNoJykpIGNvbnRpbnVlO1xuICAgIGlmIChcbiAgICAgIHZhbHVlLmluY2x1ZGVzKCctLWFsbCcpIHx8XG4gICAgICB2YWx1ZS5pbmNsdWRlcygnLS1yZWN1cnNpdmUnKSB8fFxuICAgICAgdmFsdWUuaW5jbHVkZXMoJy0tc2luY2UnKSB8fFxuICAgICAgdmFsdWUuaW5jbHVkZXMoJy0td29ya3RyZWUnKVxuICAgIClcbiAgICAgIGNvbnRpbnVlO1xuICAgIGpzb25PYmouc2NyaXB0c1trZXldID0gdmFsdWUucmVwbGFjZSgneWFybiB3b3Jrc3BhY2VzIGZvcmVhY2gnLCAneWFybiB3b3Jrc3BhY2VzIGZvcmVhY2ggLS1hbGwnKTtcbiAgfVxuXG4gIGxldCBkZXBlbmRlbmNpZXM6IHN0cmluZ1tdID0gW107XG4gIGxldCBkZXZEZXBlbmRlbmNpZXMgPSBbJ3ByZXR0aWVyJywgJ3NvcnQtcGFja2FnZS1qc29uJ107XG4gIGNvbnN0IHBvZXRyeURldkRlcGVuZGVuY2llczogc3RyaW5nW10gPSBbXTtcblxuICBpZiAoXG4gICAgIWZzLmV4aXN0c1N5bmMocGF0aC5qb2luKHJvb3RDb25maWcuZGlyUGF0aCwgJy5wcmV0dGllcnJjLmpzb24nKSkgJiZcbiAgICAhZnMuZXhpc3RzU3luYyhwYXRoLmpvaW4oY29uZmlnLmRpclBhdGgsICcucHJldHRpZXJyYy5qc29uJykpXG4gICkge1xuICAgIGpzb25PYmoucHJldHRpZXIgPSAnQHdpbGxib29zdGVyL3ByZXR0aWVyLWNvbmZpZyc7XG4gICAgZGV2RGVwZW5kZW5jaWVzLnB1c2goJ3ByZXR0aWVyLXBsdWdpbi1qYXZhJywgJ0B3aWxsYm9vc3Rlci9wcmV0dGllci1jb25maWcnKTtcbiAgfVxuXG4gIGlmIChjb25maWcuaXNCdW4pIHtcbiAgICBkZWxldGUganNvbk9iai5kZXZEZXBlbmRlbmNpZXNbJ2xpbnQtc3RhZ2VkJ107XG4gIH0gZWxzZSB7XG4gICAgZGV2RGVwZW5kZW5jaWVzLnB1c2goJ2xpbnQtc3RhZ2VkJyk7XG4gIH1cblxuICBpZiAoY29uZmlnLmlzUm9vdCkge1xuICAgIGlmIChjb25maWcuaXNCdW4pIHtcbiAgICAgIGRlbGV0ZSBqc29uT2JqLmRldkRlcGVuZGVuY2llcy5odXNreTtcbiAgICAgIGRlbGV0ZSBqc29uT2JqLmRldkRlcGVuZGVuY2llcy5waW5zdDtcbiAgICAgIGpzb25PYmouc2NyaXB0cy5wcmVwYXJlID0gJ2xlZnRob29rIGluc3RhbGwgfHwgdHJ1ZSc7XG4gICAgICBkZXZEZXBlbmRlbmNpZXMucHVzaCgnbGVmdGhvb2snKTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gVG8gaW5zdGFsbCB0aGUgbGF0ZXN0IGh1c2t5XG4gICAgICBkZXZEZXBlbmRlbmNpZXMucHVzaCgnaHVza3knKTtcbiAgICAgIC8vICd8fCB0cnVlJyBhdm9pZHMgZXJyb3JzIHdoZW4gaHVza3kgaXMgbm90IGluc3RhbGxlZC5cbiAgICAgIGpzb25PYmouc2NyaXB0cy5wcmVwYXJlID0gJ2h1c2t5IHx8IHRydWUnOyAvLyBmb3Igbm9uLXlhcm4gcGFja2FnZSBtYW5hZ2Vycy5cbiAgICAgIGpzb25PYmouc2NyaXB0cy5wb3N0aW5zdGFsbCA9ICdodXNreSB8fCB0cnVlJzsgLy8gZm9yIHlhcm4uXG4gICAgICBpZiAoY29uZmlnLmlzUHVibGljUmVwbyB8fCBjb25maWcuaXNSZWZlcnJlZEJ5T3RoZXJSZXBvKSB7XG4gICAgICAgIC8vIFRvIGluc3RhbGwgdGhlIGxhdGVzdCBwaW5zdFxuICAgICAgICAvLyBodHRwczovL3R5cGljb2RlLmdpdGh1Yi5pby9odXNreS8jLz9pZD1pbnN0YWxsLTFcbiAgICAgICAgZGV2RGVwZW5kZW5jaWVzLnB1c2goJ3BpbnN0Jyk7XG4gICAgICAgIGpzb25PYmouc2NyaXB0cy5wcmVwYWNrID0gJ3BpbnN0IC0tZGlzYWJsZSc7XG4gICAgICAgIGpzb25PYmouc2NyaXB0cy5wb3N0cGFjayA9ICdwaW5zdCAtLWVuYWJsZSc7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGNvbmZpZy5kZXBlbmRpbmcuc2VtYW50aWNSZWxlYXNlKSB7XG4gICAgICBpZiAoXG4gICAgICAgICFqc29uT2JqLmRldkRlcGVuZGVuY2llc1snc2VtYW50aWMtcmVsZWFzZSddICYmXG4gICAgICAgICFqc29uT2JqLmRldkRlcGVuZGVuY2llc1snbXVsdGktc2VtYW50aWMtcmVsZWFzZSddICYmXG4gICAgICAgICFqc29uT2JqLmRldkRlcGVuZGVuY2llc1snQHFpd2kvbXVsdGktc2VtYW50aWMtcmVsZWFzZSddXG4gICAgICApIHtcbiAgICAgICAgZGV2RGVwZW5kZW5jaWVzLnB1c2goJ3NlbWFudGljLXJlbGVhc2UnKTtcbiAgICAgIH1cbiAgICAgIGpzb25PYmoudmVyc2lvbiA9ICcwLjAuMC1zZW1hbnRpY2FsbHktcmVsZWFzZWQnO1xuICAgIH1cblxuICAgIGlmIChjb25maWcuZGVwZW5kaW5nLnBsYXl3cmlnaHRUZXN0KSB7XG4gICAgICAvLyBTaW5jZSBhcnRpbGxlcnkgcmVxdWlyZXMgYSBzcGVjaWZpYyB2ZXJzaW9uIG9mIEBwbGF5d3JpZ2h0L3Rlc3RcbiAgICAgIGNvbnN0IGhhc0FydGlsbGVyeSA9IGpzb25PYmouZGVwZW5kZW5jaWVzLmFydGlsbGVyeSB8fCBqc29uT2JqLmRldkRlcGVuZGVuY2llcy5hcnRpbGxlcnk7XG4gICAgICAvLyBTaW5jZSBsbG0tdG9vbGJveCByZXF1aXJlcyBAcGxheXdyaWdodC90ZXN0IGluIGRlcGVuZGVuY2llc1xuICAgICAgaWYgKCFoYXNBcnRpbGxlcnkgJiYgIWpzb25PYmouZGVwZW5kZW5jaWVzWydAcGxheXdyaWdodC90ZXN0J10pIHtcbiAgICAgICAgZGV2RGVwZW5kZW5jaWVzLnB1c2goJ0BwbGF5d3JpZ2h0L3Rlc3QnKTtcbiAgICAgICAgZGVsZXRlIGpzb25PYmouZGVwZW5kZW5jaWVzWydAcGxheXdyaWdodC90ZXN0J107XG4gICAgICB9XG4gICAgICBkZWxldGUganNvbk9iai5kZXBlbmRlbmNpZXMucGxheXdyaWdodDtcbiAgICAgIGRlbGV0ZSBqc29uT2JqLmRldkRlcGVuZGVuY2llcy5wbGF5d3JpZ2h0O1xuICAgIH1cblxuICAgIGlmIChjb25maWcuZG9lc0NvbnRhaW5TdWJQYWNrYWdlSnNvbnMpIHtcbiAgICAgIC8vIFdlIGRvbid0IGFsbG93IG5vbi1hcnJheSB3b3Jrc3BhY2VzIGluIG1vbm9yZXBvLlxuICAgICAganNvbk9iai53b3Jrc3BhY2VzID0gQXJyYXkuaXNBcnJheShqc29uT2JqLndvcmtzcGFjZXMpXG4gICAgICAgID8gbWVyZ2UuYWxsKFtqc29uT2JqLndvcmtzcGFjZXMsIFsncGFja2FnZXMvKiddXSwge1xuICAgICAgICAgICAgYXJyYXlNZXJnZTogY29tYmluZU1lcmdlLFxuICAgICAgICAgIH0pXG4gICAgICAgIDogWydwYWNrYWdlcy8qJ107XG4gICAgfSBlbHNlIGlmIChBcnJheS5pc0FycmF5KGpzb25PYmoud29ya3NwYWNlcykpIHtcbiAgICAgIGpzb25PYmoud29ya3NwYWNlcyA9IGpzb25PYmoud29ya3NwYWNlcy5maWx0ZXIoXG4gICAgICAgICh3b3Jrc3BhY2UpID0+XG4gICAgICAgICAgZmcuZ2xvYlN5bmMod29ya3NwYWNlLCB7XG4gICAgICAgICAgICBkb3Q6IHRydWUsXG4gICAgICAgICAgICBjd2Q6IGNvbmZpZy5kaXJQYXRoLFxuICAgICAgICAgICAgaWdub3JlOiBnbG9iSWdub3JlLFxuICAgICAgICAgIH0pLmxlbmd0aCA+IDBcbiAgICAgICk7XG4gICAgICBpZiAoanNvbk9iai53b3Jrc3BhY2VzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICBkZWxldGUganNvbk9iai53b3Jrc3BhY2VzO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGlmIChjb25maWcuZGVwZW5kaW5nLndiIHx8IGNvbmZpZy5pc0J1bikge1xuICAgIGlmIChqc29uT2JqLmRlcGVuZGVuY2llc1snQHdpbGxib29zdGVyL3diJ10pIHtcbiAgICAgIGRlcGVuZGVuY2llcy5wdXNoKFxuICAgICAgICBqc29uT2JqLmRlcGVuZGVuY2llc1snQHdpbGxib29zdGVyL3diJ10uc3RhcnRzV2l0aCgnMTAuJykgPyAnQHdpbGxib29zdGVyL3diQDEwLjcuMScgOiAnQHdpbGxib29zdGVyL3diJ1xuICAgICAgKTtcbiAgICB9IGVsc2Uge1xuICAgICAgZGV2RGVwZW5kZW5jaWVzLnB1c2goXG4gICAgICAgIGpzb25PYmouZGV2RGVwZW5kZW5jaWVzWydAd2lsbGJvb3N0ZXIvd2InXT8uc3RhcnRzV2l0aCgnMTAuJykgPyAnQHdpbGxib29zdGVyL3diQDEwLjcuMScgOiAnQHdpbGxib29zdGVyL3diJ1xuICAgICAgKTtcbiAgICB9XG4gICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMoanNvbk9iai5zY3JpcHRzIGFzIFJlY29yZDxzdHJpbmcsIHN0cmluZz4pKSB7XG4gICAgICBqc29uT2JqLnNjcmlwdHNba2V5XSA9IHZhbHVlLnJlcGxhY2UoL3diXFxzK2RiLywgJ3diIHByaXNtYScpO1xuICAgIH1cbiAgfVxuXG4gIGlmIChcbiAgICBjb25maWcuZG9lc0NvbnRhaW5KYXZhU2NyaXB0IHx8XG4gICAgY29uZmlnLmRvZXNDb250YWluSmF2YVNjcmlwdEluUGFja2FnZXMgfHxcbiAgICBjb25maWcuZG9lc0NvbnRhaW5UeXBlU2NyaXB0IHx8XG4gICAgY29uZmlnLmRvZXNDb250YWluVHlwZVNjcmlwdEluUGFja2FnZXNcbiAgKSB7XG4gICAgaWYgKGNvbmZpZy5pc0J1bikge1xuICAgICAgZGV2RGVwZW5kZW5jaWVzLnB1c2goJ0BiaW9tZWpzL2Jpb21lJywgJ0B3aWxsYm9vc3Rlci9iaW9tZS1jb25maWcnKTtcbiAgICAgIGRlbGV0ZSBqc29uT2JqLmRldkRlcGVuZGVuY2llcy5lc2xpbnQ7XG4gICAgICBkZWxldGUganNvbk9iai5kZXZEZXBlbmRlbmNpZXMubWljcm9tYXRjaDtcbiAgICAgIGRlbGV0ZSBqc29uT2JqLmRldkRlcGVuZGVuY2llc1sndHlwZXNjcmlwdC1lc2xpbnQnXTtcbiAgICB9IGVsc2Uge1xuICAgICAgZGV2RGVwZW5kZW5jaWVzLnB1c2goJ2VzbGludCcsICdtaWNyb21hdGNoJyk7XG4gICAgfVxuICB9XG5cbiAgaWYgKGNvbmZpZy5kb2VzQ29udGFpblR5cGVTY3JpcHQgfHwgY29uZmlnLmRvZXNDb250YWluVHlwZVNjcmlwdEluUGFja2FnZXMpIHtcbiAgICBkZXZEZXBlbmRlbmNpZXMucHVzaCgndHlwZXNjcmlwdCcpO1xuICAgIGlmIChjb25maWcuaXNCdW4pIHtcbiAgICAgIGRldkRlcGVuZGVuY2llcy5wdXNoKCdAdHlwZXMvYnVuJyk7XG4gICAgfVxuICB9XG5cbiAgaWYgKGNvbmZpZy5lc2xpbnRCYXNlKSB7XG4gICAgZGV2RGVwZW5kZW5jaWVzLnB1c2goLi4uZXNsaW50RGVwc1tjb25maWcuZXNsaW50QmFzZV0pO1xuICB9XG5cbiAgaWYgKGNvbmZpZy5pc1dpbGxCb29zdGVyQ29uZmlncykge1xuICAgIGRlcGVuZGVuY2llcyA9IGRlcGVuZGVuY2llcy5maWx0ZXIoKGRlcCkgPT4gIWRlcC5pbmNsdWRlcygnQHdpbGxib29zdGVyLycpKTtcbiAgICBkZXZEZXBlbmRlbmNpZXMgPSBkZXZEZXBlbmRlbmNpZXMuZmlsdGVyKChkZXApID0+ICFkZXAuaW5jbHVkZXMoJ0B3aWxsYm9vc3Rlci8nKSk7XG4gIH1cblxuICBpZiAoIWpzb25PYmoubmFtZSkge1xuICAgIGpzb25PYmoubmFtZSA9IHBhdGguYmFzZW5hbWUoY29uZmlnLmRpclBhdGgpO1xuICB9XG5cbiAgaWYgKGNvbmZpZy5kb2VzQ29udGFpblN1YlBhY2thZ2VKc29ucykge1xuICAgIGpzb25PYmoucHJpdmF0ZSA9IHRydWU7XG4gIH1cbiAgaWYgKCFqc29uT2JqLmxpY2Vuc2UpIHtcbiAgICBqc29uT2JqLmxpY2Vuc2UgPSAnVU5MSUNFTlNFRCc7XG4gIH1cbiAgaWYgKCFqc29uT2JqLnByaXZhdGUgJiYganNvbk9iai5saWNlbnNlICE9PSAnVU5MSUNFTlNFRCcgJiYgcm9vdENvbmZpZy5pc1B1YmxpY1JlcG8pIHtcbiAgICBqc29uT2JqLnB1Ymxpc2hDb25maWcgPz89IHt9O1xuICAgIGpzb25PYmoucHVibGlzaENvbmZpZy5hY2Nlc3MgPz89ICdwdWJsaWMnO1xuICB9XG4gIGNvbnN0IFtvd25lcl0gPSBnaXRIdWJVdGlsLmdldE9yZ0FuZE5hbWUoY29uZmlnLnJlcG9zaXRvcnkgPz8gJycpO1xuICBpZiAob3duZXIgPT09ICdXaWxsQm9vc3RlcicgfHwgb3duZXIgPT09ICdXaWxsQm9vc3RlckxhYicpIHtcbiAgICBqc29uT2JqLmF1dGhvciA9ICdXaWxsQm9vc3RlciBJbmMuJztcbiAgfVxuICBpZiAoIWNvbmZpZy5pc1Jvb3QgJiYganNvbk9iai5wcml2YXRlICYmICFqc29uT2JqLm1haW4pIHtcbiAgICAvLyBNYWtlIFZTQ29kZSBwb3NzaWJsZSB0byByZWZhY3RvciBjb2RlIGFjcm9zcyBzdWJwYWNrYWdlcy5cbiAgICBqc29uT2JqLm1haW4gPSAnLi9zcmMnO1xuICB9XG5cbiAgLy8gQmVjYXVzZSBgXCJyZXNvbHV0aW9uc1wiOiB7IFwibnBtL2NoYWxrXCI6IFwiXjQuMS4yXCIgfSxgIGNhdXNlcyBcIkludmFsaWQgbnBtIHRva2VuXCJcbiAgZGVsZXRlIGpzb25PYmoucmVzb2x1dGlvbnM/LlsnbnBtL2NoYWxrJ107XG5cbiAgaWYgKCFjb25maWcuZG9lc0NvbnRhaW5TdWJQYWNrYWdlSnNvbnMpIHtcbiAgICBpZiAoIWNvbmZpZy5pc0J1bikge1xuICAgICAgaWYgKCFjb25maWcuZG9lc0NvbnRhaW5KYXZhU2NyaXB0ICYmICFjb25maWcuZG9lc0NvbnRhaW5UeXBlU2NyaXB0KSB7XG4gICAgICAgIGRlbGV0ZSBqc29uT2JqLnNjcmlwdHMubGludDtcbiAgICAgICAgZGVsZXRlIGpzb25PYmouc2NyaXB0c1snbGludC1maXgnXTtcbiAgICAgICAgZm9yIChjb25zdCBzY3JpcHROYW1lIG9mIFsnY2xlYW51cCcsICdjaGVjay1mb3ItYWknXSkge1xuICAgICAgICAgIGNvbnN0IHNjcmlwdCA9IGpzb25PYmouc2NyaXB0c1tzY3JpcHROYW1lXTtcbiAgICAgICAgICBpZiAoIXNjcmlwdCkgY29udGludWU7XG4gICAgICAgICAganNvbk9iai5zY3JpcHRzW3NjcmlwdE5hbWVdID0gc2NyaXB0LnJlcGxhY2UoLyA/JiYgP3lhcm4gbGludC1maXgoPzogLS1xdWlldCk/LywgJycpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBqc29uT2JqLnNjcmlwdHNbJ2xpbnQtZml4J10gPSAoanNvbk9iai5zY3JpcHRzWydsaW50LWZpeCddID8/ICcnKSArIEVzbGludFV0aWwuZ2V0TGludEZpeFN1ZmZpeChjb25maWcpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChjb25maWcuZG9lc0NvbnRhaW5QdWJzcGVjWWFtbCkge1xuICAgICAganNvbk9iai5zY3JpcHRzLmxpbnQgPSAnZmx1dHRlciBhbmFseXplJztcbiAgICAgIGpzb25PYmouc2NyaXB0c1snbGludC1maXgnXSA9ICd5YXJuIGxpbnQnO1xuICAgICAgY29uc3QgZGlycyA9IFsnbGliJywgJ3Rlc3QnLCAndGVzdF9kcml2ZXInXS5maWx0ZXIoKGRpcikgPT4gZnMuZXhpc3RzU3luYyhwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsIGRpcikpKTtcbiAgICAgIGlmIChkaXJzLmxlbmd0aCA+IDApIHtcbiAgICAgICAganNvbk9iai5zY3JpcHRzWydmb3JtYXQtY29kZSddID0gYGRhcnQgZm9ybWF0ICQoZmluZCAke2RpcnMuam9pbihcbiAgICAgICAgICAnICdcbiAgICAgICAgKX0gLW5hbWUgZ2VuZXJhdGVkIC1wcnVuZSAtbyAtbmFtZSAnKi5mcmVlemVkLmRhcnQnIC1wcnVuZSAtbyAtbmFtZSAnKi5nLmRhcnQnIC1wcnVuZSAtbyAtbmFtZSAnKi5kYXJ0JyAtcHJpbnQpYDtcbiAgICAgICAganNvbk9iai5zY3JpcHRzLmZvcm1hdCA9IChqc29uT2JqLnNjcmlwdHMuZm9ybWF0ID8/ICcnKSArIGAgJiYgeWFybiBmb3JtYXQtY29kZWA7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGNvbmZpZy5kb2VzQ29udGFpblBvZXRyeUxvY2spIHtcbiAgICAgIGlmIChqc29uT2JqLnNjcmlwdHMucG9zdGluc3RhbGwgPT09ICdwb2V0cnkgaW5zdGFsbCcpIHtcbiAgICAgICAgZGVsZXRlIGpzb25PYmouc2NyaXB0cy5wb3N0aW5zdGFsbDtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHB5dGhvbkZpbGVzID0gYXdhaXQgZmcuZ2xvYignKiovKi5weScsIHtcbiAgICAgICAgY3dkOiBjb25maWcuZGlyUGF0aCxcbiAgICAgICAgZG90OiB0cnVlLFxuICAgICAgICBpZ25vcmU6IGdsb2JJZ25vcmUsXG4gICAgICB9KTtcbiAgICAgIGNvbnN0IGRpck5hbWVTZXQgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgICAgIGZvciAoY29uc3QgcHl0aG9uRmlsZSBvZiBweXRob25GaWxlcykge1xuICAgICAgICBjb25zdCBbZmlyc3QsIHNlY29uZF0gPSBweXRob25GaWxlLnNwbGl0KC9bL1xcXFxdLyk7XG4gICAgICAgIGlmIChmaXJzdCAmJiBzZWNvbmQpIHtcbiAgICAgICAgICBkaXJOYW1lU2V0LmFkZChmaXJzdCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChkaXJOYW1lU2V0LnNpemUgPiAwKSB7XG4gICAgICAgIGNvbnN0IGRpck5hbWVzU3RyID0gWy4uLmRpck5hbWVTZXRdLmpvaW4oJyAnKTtcbiAgICAgICAganNvbk9iai5zY3JpcHRzWydmb3JtYXQtY29kZSddID1cbiAgICAgICAgICBgcG9ldHJ5IHJ1biBpc29ydCAtLXByb2ZpbGUgYmxhY2sgJHtkaXJOYW1lc1N0cn0gJiYgcG9ldHJ5IHJ1biBibGFjayAke2Rpck5hbWVzU3RyfWA7XG4gICAgICAgIGlmIChqc29uT2JqLnNjcmlwdHMubGludCkge1xuICAgICAgICAgIGpzb25PYmouc2NyaXB0cy5saW50ID0gYHBvZXRyeSBydW4gZmxha2U4ICR7ZGlyTmFtZXNTdHJ9ICYmICR7anNvbk9iai5zY3JpcHRzLmxpbnR9YDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBqc29uT2JqLnNjcmlwdHMubGludCA9IGBwb2V0cnkgcnVuIGZsYWtlOCAke2Rpck5hbWVzU3RyfWA7XG4gICAgICAgICAganNvbk9iai5zY3JpcHRzWydsaW50LWZpeCddID0gJ3lhcm4gbGludCc7XG4gICAgICAgIH1cbiAgICAgICAganNvbk9iai5zY3JpcHRzLmZvcm1hdCA9IChqc29uT2JqLnNjcmlwdHMuZm9ybWF0ID8/ICcnKSArIGAgJiYgeWFybiBmb3JtYXQtY29kZWA7XG4gICAgICAgIHBvZXRyeURldkRlcGVuZGVuY2llcy5wdXNoKCdibGFjaycsICdpc29ydCcsICdmbGFrZTgnKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoY29uZmlnLnJlcG9zaXRvcnkpIHtcbiAgICAgIGpzb25PYmoucmVwb3NpdG9yeSA9IGNvbmZpZy5yZXBvc2l0b3J5O1xuICAgIH1cbiAgfVxuXG4gIGlmIChjb25maWcuZGVwZW5kaW5nLmJsaXR6KSB7XG4gICAgaWYgKCFqc29uT2JqLnNjcmlwdHNbJ2dlbi1jb2RlJ10/LnN0YXJ0c1dpdGgoJ2JsaXR6IGNvZGVnZW4nKSkge1xuICAgICAganNvbk9iai5zY3JpcHRzWydnZW4tY29kZSddID0gJ2JsaXR6IGNvZGVnZW4nO1xuICAgIH0gZWxzZSBpZiAoIWpzb25PYmouc2NyaXB0c1snZ2VuLWNvZGUnXS5pbmNsdWRlcygnYmxpdHogcHJpc21hIGdlbmVyYXRlJykpIHtcbiAgICAgIGpzb25PYmouc2NyaXB0c1snZ2VuLWNvZGUnXSA9IGpzb25PYmouc2NyaXB0c1snZ2VuLWNvZGUnXS5yZXBsYWNlKFxuICAgICAgICAnYmxpdHogY29kZWdlbicsXG4gICAgICAgICdibGl0eiBjb2RlZ2VuICYmIGJsaXR6IHByaXNtYSBnZW5lcmF0ZSdcbiAgICAgICk7XG4gICAgfVxuICB9IGVsc2UgaWYgKGNvbmZpZy5kZXBlbmRpbmcucHJpc21hICYmICFqc29uT2JqLnNjcmlwdHNbJ2dlbi1jb2RlJ10/LnN0YXJ0c1dpdGgoJ3ByaXNtYSBnZW5lcmF0ZScpKSB7XG4gICAganNvbk9iai5zY3JpcHRzWydnZW4tY29kZSddID0gJ3ByaXNtYSBnZW5lcmF0ZSc7XG4gIH1cblxuICBpZiAoIWpzb25PYmouZGVwZW5kZW5jaWVzLnByZXR0aWVyKSB7XG4gICAgLy8gQmVjYXVzZSBAdHlwZXMvcHJldHRpZXIgYmxvY2tzIHByZXR0aWVyIGV4ZWN1dGlvbi5cbiAgICBkZWxldGUganNvbk9iai5kZXZEZXBlbmRlbmNpZXNbJ0B0eXBlcy9wcmV0dGllciddO1xuICB9XG5cbiAgaWYgKE9iamVjdC5rZXlzKGpzb25PYmouZGVwZW5kZW5jaWVzKS5sZW5ndGggPT09IDApIHtcbiAgICBkZWxldGUganNvbk9iai5kZXBlbmRlbmNpZXM7XG4gIH1cbiAgaWYgKE9iamVjdC5rZXlzKGpzb25PYmouZGV2RGVwZW5kZW5jaWVzKS5sZW5ndGggPT09IDApIHtcbiAgICBkZWxldGUganNvbk9iai5kZXZEZXBlbmRlbmNpZXM7XG4gIH1cbiAgaWYgKE9iamVjdC5rZXlzKGpzb25PYmoucGVlckRlcGVuZGVuY2llcykubGVuZ3RoID09PSAwKSB7XG4gICAgZGVsZXRlIGpzb25PYmoucGVlckRlcGVuZGVuY2llcztcbiAgfVxuXG4gIGF3YWl0IHVwZGF0ZVByaXZhdGVQYWNrYWdlcyhqc29uT2JqKTtcblxuICBpZiAoY29uZmlnLmlzQnVuKSBkZWxldGUganNvbk9iai5wYWNrYWdlTWFuYWdlcjtcbiAgbGV0IG5ld0pzb25UZXh0ID0gSlNPTi5zdHJpbmdpZnkoanNvbk9iaik7XG4gIG5ld0pzb25UZXh0ID0gYXdhaXQgZml4U2NyaXB0TmFtZXMoanNvbk9iai5zY3JpcHRzLCBuZXdKc29uVGV4dCwgY29uZmlnKTtcbiAgYXdhaXQgZnMucHJvbWlzZXMud3JpdGVGaWxlKGZpbGVQYXRoLCBuZXdKc29uVGV4dCk7XG5cbiAgaWYgKCFza2lwQWRkaW5nRGVwcykge1xuICAgIC8vIFdlIGNhbm5vdCBhZGQgZGVwZW5kZW5jaWVzIHdoaWNoIGFyZSBhbHJlYWR5IGluY2x1ZGVkIGluIGRldkRlcGVuZGVuY2llcy5cbiAgICBkZXBlbmRlbmNpZXMgPSBkZXBlbmRlbmNpZXMuZmlsdGVyKChkZXApID0+ICFqc29uT2JqLmRldkRlcGVuZGVuY2llcz8uW2RlcF0pO1xuICAgIGlmIChkZXBlbmRlbmNpZXMubGVuZ3RoID4gMCkge1xuICAgICAgaWYgKGNvbmZpZy5pc0J1bikge1xuICAgICAgICBzcGF3blN5bmMocGFja2FnZU1hbmFnZXIsIFsncmVtb3ZlJywgLi4ubmV3IFNldChkZXBlbmRlbmNpZXMpXSwgY29uZmlnLmRpclBhdGgpO1xuICAgICAgICBzcGF3blN5bmMocGFja2FnZU1hbmFnZXIsIFsnYWRkJywgJy0tZXhhY3QnLCAuLi5uZXcgU2V0KGRlcGVuZGVuY2llcyldLCBjb25maWcuZGlyUGF0aCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzcGF3blN5bmMocGFja2FnZU1hbmFnZXIsIFsnYWRkJywgLi4ubmV3IFNldChkZXBlbmRlbmNpZXMpXSwgY29uZmlnLmRpclBhdGgpO1xuICAgICAgfVxuICAgIH1cbiAgICAvLyBXZSBjYW5ub3QgYWRkIGRldkRlcGVuZGVuY2llcyB3aGljaCBhcmUgYWxyZWFkeSBpbmNsdWRlZCBpbiBkZXBlbmRlbmNpZXMuXG4gICAgZGV2RGVwZW5kZW5jaWVzID0gZGV2RGVwZW5kZW5jaWVzLmZpbHRlcigoZGVwKSA9PiAhanNvbk9iai5kZXBlbmRlbmNpZXM/LltkZXBdKTtcbiAgICBpZiAoZGV2RGVwZW5kZW5jaWVzLmxlbmd0aCA+IDApIHtcbiAgICAgIGlmIChjb25maWcuaXNCdW4pIHtcbiAgICAgICAgc3Bhd25TeW5jKHBhY2thZ2VNYW5hZ2VyLCBbJ3JlbW92ZScsIC4uLm5ldyBTZXQoZGV2RGVwZW5kZW5jaWVzKV0sIGNvbmZpZy5kaXJQYXRoKTtcbiAgICAgICAgc3Bhd25TeW5jKHBhY2thZ2VNYW5hZ2VyLCBbJ2FkZCcsICctRCcsICctLWV4YWN0JywgLi4ubmV3IFNldChkZXZEZXBlbmRlbmNpZXMpXSwgY29uZmlnLmRpclBhdGgpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc3Bhd25TeW5jKHBhY2thZ2VNYW5hZ2VyLCBbJ2FkZCcsICctRCcsIC4uLm5ldyBTZXQoZGV2RGVwZW5kZW5jaWVzKV0sIGNvbmZpZy5kaXJQYXRoKTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKHBvZXRyeURldkRlcGVuZGVuY2llcy5sZW5ndGggPiAwKSB7XG4gICAgICBzcGF3blN5bmMoJ3BvZXRyeScsIFsnYWRkJywgJy0tZ3JvdXAnLCAnZGV2JywgLi4ubmV3IFNldChwb2V0cnlEZXZEZXBlbmRlbmNpZXMpXSwgY29uZmlnLmRpclBhdGgpO1xuICAgIH1cbiAgfVxufVxuXG4vLyBUT0RPOiByZW1vdmUgdGhlIGZvbGxvd2luZyBtaWdyYXRpb24gY29kZSBpbiBmdXR1cmVcbmFzeW5jIGZ1bmN0aW9uIHJlbW92ZURlcHJlY2F0ZWRTdHVmZihcbiAganNvbk9iajogU2V0UmVxdWlyZWQ8UGFja2FnZUpzb24sICdzY3JpcHRzJyB8ICdkZXBlbmRlbmNpZXMnIHwgJ2RldkRlcGVuZGVuY2llcyc+XG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgaWYgKGpzb25PYmouYXV0aG9yID09PSAnV2lsbEJvb3N0ZXIgTExDJykge1xuICAgIGpzb25PYmouYXV0aG9yID0gJ1dpbGxCb29zdGVyIEluYy4nO1xuICB9XG4gIGRlbGV0ZSBqc29uT2JqLnNjcmlwdHNbJ3NvcnQtcGFja2FnZS1qc29uJ107XG4gIGRlbGV0ZSBqc29uT2JqLnNjcmlwdHNbJ3NvcnQtYWxsLXBhY2thZ2UtanNvbiddO1xuICBkZWxldGUganNvbk9iai5zY3JpcHRzWyd0eXBlY2hlY2svd2FybiddO1xuICBkZWxldGUganNvbk9iai5zY3JpcHRzWyd0eXBlY2hlY2s6Z2VuLWNvZGUnXTtcbiAgZGVsZXRlIGpzb25PYmouc2NyaXB0c1sndHlwZWNoZWNrOmNvZGVnZW4nXTtcbiAgZGVsZXRlIGpzb25PYmouZGVwZW5kZW5jaWVzLnRzbGliO1xuICBkZWxldGUganNvbk9iai5kZXZEZXBlbmRlbmNpZXNbJ0B3aWxsYm9vc3Rlci9lc2xpbnQtY29uZmlnJ107XG4gIGRlbGV0ZSBqc29uT2JqLmRldkRlcGVuZGVuY2llc1snQHdpbGxib29zdGVyL2VzbGludC1jb25maWctcmVhY3QnXTtcbiAgZGVsZXRlIGpzb25PYmouZGV2RGVwZW5kZW5jaWVzWydAd2lsbGJvb3N0ZXIvcmVub3ZhdGUtY29uZmlnJ107XG4gIGRlbGV0ZSBqc29uT2JqLmRldkRlcGVuZGVuY2llc1snQHdpbGxib29zdGVyL3RzY29uZmlnJ107XG4gIGRlbGV0ZSBqc29uT2JqLmRldkRlcGVuZGVuY2llc1snZXNsaW50LWltcG9ydC1yZXNvbHZlci1ub2RlJ107XG4gIGRlbGV0ZSBqc29uT2JqLmRldkRlcGVuZGVuY2llc1snZXNsaW50LXBsdWdpbi1wcmV0dGllciddO1xuICBkZWxldGUganNvbk9iai5kZXZEZXBlbmRlbmNpZXMubGVybmE7XG4gIC8vIFRvIGluc3RhbGwgdGhlIGxhdGVzdCBwaW5zdFxuICBkZWxldGUganNvbk9iai5kZXZEZXBlbmRlbmNpZXMucGluc3Q7XG4gIGRlbGV0ZSBqc29uT2JqLnNjcmlwdHNbJ2ZsdXR0ZXItZm9ybWF0J107XG4gIGRlbGV0ZSBqc29uT2JqLnNjcmlwdHNbJ2Zvcm1hdC1mbHV0dGVyJ107XG4gIGRlbGV0ZSBqc29uT2JqLnNjcmlwdHNbJ3B5dGhvbi1mb3JtYXQnXTtcbiAgZGVsZXRlIGpzb25PYmouc2NyaXB0c1snZm9ybWF0LXB5dGhvbiddO1xuICBkZWxldGUganNvbk9iai5zY3JpcHRzLnByZXR0aWVyO1xuICBkZWxldGUganNvbk9iai5zY3JpcHRzWydjaGVjay1hbGwnXTtcbiAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzLnByb21pc2VzLnJtKCdsZXJuYS5qc29uJywgeyBmb3JjZTogdHJ1ZSB9KSk7XG5cbiAgLy8gTWlncmF0ZSBmcm9tIEVTTGludCBsZWdhY3kgY29uZmlncyB0byBmbGF0IGNvbmZpZ3MsXG4gIGRlbGV0ZSBqc29uT2JqLmRldkRlcGVuZGVuY2llc1snQHR5cGVzY3JpcHQtZXNsaW50L2VzbGludC1wbHVnaW4nXTtcbiAgZGVsZXRlIGpzb25PYmouZGV2RGVwZW5kZW5jaWVzWydAdHlwZXNjcmlwdC1lc2xpbnQvcGFyc2VyJ107XG4gIGRlbGV0ZSBqc29uT2JqLmRldkRlcGVuZGVuY2llc1snZXNsaW50LXBsdWdpbi1pbXBvcnQnXTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdlbmVyYXRlU2NyaXB0cyhjb25maWc6IFBhY2thZ2VDb25maWcsIG9sZFNjcmlwdHM6IFBhY2thZ2VKc29uLlNjcmlwdHMpOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+IHtcbiAgaWYgKGNvbmZpZy5pc0J1bikge1xuICAgIGNvbnN0IGhhc1R5cGVjaGVjayA9IGNvbmZpZy5kb2VzQ29udGFpblR5cGVTY3JpcHQgfHwgY29uZmlnLmRvZXNDb250YWluVHlwZVNjcmlwdEluUGFja2FnZXM7XG4gICAgY29uc3Qgc2NyaXB0czogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHtcbiAgICAgICdjaGVjay1hbGwtZm9yLWFpJzogJ2J1biBydW4gY2hlY2stZm9yLWFpICYmIGJ1biBydW4gdGVzdCAtLXNpbGVudCcsXG4gICAgICAnY2hlY2stZm9yLWFpJzogYGJ1biBydW4gY2xlYW51cCR7aGFzVHlwZWNoZWNrID8gJyAmJiBidW4gcnVuIHR5cGVjaGVjaycgOiAnJ31gLFxuICAgICAgY2xlYW51cDogJ2J1biAtLWJ1biB3YiBsaW50IC0tZml4IC0tZm9ybWF0JyxcbiAgICAgIGZvcm1hdDogYGJ1biAtLWJ1biB3YiBsaW50IC0tZm9ybWF0YCxcbiAgICAgIGxpbnQ6IGBidW4gLS1idW4gd2IgbGludGAsXG4gICAgICAnbGludC1maXgnOiAnYnVuIC0tYnVuIHdiIGxpbnQgLS1maXgnLFxuICAgICAgdGVzdDogJ2J1biB3YiB0ZXN0JyxcbiAgICAgIHR5cGVjaGVjazogJ2J1biAtLWJ1biB3YiB0eXBlY2hlY2snLFxuICAgIH07XG4gICAgaWYgKCFoYXNUeXBlY2hlY2spIHtcbiAgICAgIGRlbGV0ZSBzY3JpcHRzLnR5cGVjaGVjaztcbiAgICB9XG4gICAgcmV0dXJuIHNjcmlwdHM7XG4gIH0gZWxzZSB7XG4gICAgY29uc3QgaGFzVHlwZWNoZWNrID0gY29uZmlnLmRvZXNDb250YWluVHlwZVNjcmlwdCB8fCBjb25maWcuZG9lc0NvbnRhaW5UeXBlU2NyaXB0SW5QYWNrYWdlcztcbiAgICBjb25zdCBvbGRUZXN0ID0gb2xkU2NyaXB0cy50ZXN0O1xuICAgIGxldCBzY3JpcHRzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge1xuICAgICAgJ2NoZWNrLWFsbC1mb3ItYWknOiAneWFybiBjaGVjay1mb3ItYWkgJiYgeWFybiB0ZXN0JyxcbiAgICAgICdjaGVjay1mb3ItYWknOiBgeWFybiBmb3JtYXQgPiAvZGV2L251bGwgMj4gL2Rldi9udWxsIHx8IHRydWUgJiYgeWFybiBsaW50LWZpeCAtLXF1aWV0JHtcbiAgICAgICAgaGFzVHlwZWNoZWNrID8gJyAmJiB5YXJuIHR5cGVjaGVjaycgOiAnJ1xuICAgICAgfWAsXG4gICAgICBjbGVhbnVwOiAneWFybiBmb3JtYXQgJiYgeWFybiBsaW50LWZpeCcsXG4gICAgICBmb3JtYXQ6IGBzb3J0LXBhY2thZ2UtanNvbiAmJiB5YXJuIHByZXR0aWZ5YCxcbiAgICAgIGxpbnQ6IGBlc2xpbnQgLS1jb2xvcmAsXG4gICAgICAnbGludC1maXgnOiAneWFybiBsaW50IC0tZml4JyxcbiAgICAgIHByZXR0aWZ5OiBgcHJldHRpZXIgLS1jYWNoZSAtLWNvbG9yIC0td3JpdGUgXCIqKi97LiovLH0qLnske2V4dGVuc2lvbnMucHJldHRpZXIuam9pbignLCcpfX1cIiBcIiEqKi90ZXN0ey0sL31maXh0dXJlcy8qKlwiYCxcbiAgICAgIHR5cGVjaGVjazogJ3RzYyAtLW5vRW1pdCAtLVByZXR0eScsXG4gICAgfTtcbiAgICBpZiAoY29uZmlnLmRvZXNDb250YWluU3ViUGFja2FnZUpzb25zKSB7XG4gICAgICBzY3JpcHRzID0gbWVyZ2UoXG4gICAgICAgIHsgLi4uc2NyaXB0cyB9LFxuICAgICAgICB7XG4gICAgICAgICAgZm9ybWF0OiBgc29ydC1wYWNrYWdlLWpzb24gJiYgeWFybiBwcmV0dGlmeSAmJiB5YXJuIHdvcmtzcGFjZXMgZm9yZWFjaCAtLWFsbCAtLXBhcmFsbGVsIC0tdmVyYm9zZSBydW4gZm9ybWF0YCxcbiAgICAgICAgICBsaW50OiBgeWFybiB3b3Jrc3BhY2VzIGZvcmVhY2ggLS1hbGwgLS1wYXJhbGxlbCAtLXZlcmJvc2UgcnVuIGxpbnRgLFxuICAgICAgICAgICdsaW50LWZpeCc6ICd5YXJuIHdvcmtzcGFjZXMgZm9yZWFjaCAtLWFsbCAtLXBhcmFsbGVsIC0tdmVyYm9zZSBydW4gbGludC1maXgnLFxuICAgICAgICAgIHByZXR0aWZ5OiBgcHJldHRpZXIgLS1jYWNoZSAtLWNvbG9yIC0td3JpdGUgXCIqKi97LiovLH0qLnske2V4dGVuc2lvbnMucHJldHRpZXIuam9pbihcbiAgICAgICAgICAgICcsJ1xuICAgICAgICAgICl9fVwiIFwiISoqL3BhY2thZ2VzLyoqXCIgXCIhKiovdGVzdHstLC99Zml4dHVyZXMvKipcImAsXG4gICAgICAgICAgLy8gQ0k9MSBwcmV2ZW50cyB2aXRlc3QgZnJvbSBlbmFibGluZyB3YXRjaC5cbiAgICAgICAgICAvLyBGT1JDRV9DT0xPUj0zIG1ha2Ugd2IgZW5hYmxlIGNvbG9yIG91dHB1dC5cbiAgICAgICAgICB0ZXN0OiAnQ0k9MSBGT1JDRV9DT0xPUj0zIHlhcm4gd29ya3NwYWNlcyBmb3JlYWNoIC0tYWxsIC0tdmVyYm9zZSBydW4gdGVzdCcsXG4gICAgICAgICAgdHlwZWNoZWNrOiAneWFybiB3b3Jrc3BhY2VzIGZvcmVhY2ggLS1hbGwgLS1wYXJhbGxlbCAtLXZlcmJvc2UgcnVuIHR5cGVjaGVjaycsXG4gICAgICAgIH1cbiAgICAgICk7XG4gICAgfSBlbHNlIGlmIChjb25maWcuZGVwZW5kaW5nLnB5cmlnaHQpIHtcbiAgICAgIHNjcmlwdHMudHlwZWNoZWNrID0gc2NyaXB0cy50eXBlY2hlY2sgPyBgJHtzY3JpcHRzLnR5cGVjaGVja30gJiYgYCA6ICcnO1xuICAgICAgc2NyaXB0cy50eXBlY2hlY2sgKz0gJ3B5cmlnaHQnO1xuICAgIH1cbiAgICBpZiAob2xkVGVzdD8uaW5jbHVkZXMoJ3diIHRlc3QnKSkge1xuICAgICAgc2NyaXB0cy50ZXN0ID0gb2xkVGVzdDtcbiAgICAgIC8vIGB3YmAgc3VwcG9ydHMgYC0tc2lsZW50YCBvcHRpb25cbiAgICAgIHNjcmlwdHNbJ2NoZWNrLWFsbC1mb3ItYWknXSA9IChzY3JpcHRzWydjaGVjay1hbGwtZm9yLWFpJ10gPz8gJycpICsgJyAtLXNpbGVudCc7XG4gICAgfVxuXG4gICAgaWYgKCFoYXNUeXBlY2hlY2spIHtcbiAgICAgIGRlbGV0ZSBzY3JpcHRzLnR5cGVjaGVjaztcbiAgICB9IGVsc2UgaWYgKGNvbmZpZy5kZXBlbmRpbmcud2IpIHtcbiAgICAgIHNjcmlwdHMudHlwZWNoZWNrID0gJ3diIHR5cGVjaGVjayc7XG4gICAgfVxuICAgIHJldHVybiBzY3JpcHRzO1xuICB9XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlUHJldHRpZXJTdWZmaXgoZGlyUGF0aDogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgY29uc3QgZmlsZVBhdGggPSBwYXRoLnJlc29sdmUoZGlyUGF0aCwgJy5wcmV0dGllcmlnbm9yZScpO1xuICBjb25zdCBleGlzdGluZ0NvbnRlbnQgPSBhd2FpdCBmcy5wcm9taXNlcy5yZWFkRmlsZShmaWxlUGF0aCwgJ3V0ZjgnKTtcbiAgY29uc3QgaW5kZXggPSBleGlzdGluZ0NvbnRlbnQuaW5kZXhPZihpZ25vcmVGaWxlVXRpbC5zZXBhcmF0b3JQcmVmaXgpO1xuICBpZiAoaW5kZXggPT09IC0xKSByZXR1cm4gJyc7XG5cbiAgY29uc3Qgb3JpZ2luYWxDb250ZW50ID0gZXhpc3RpbmdDb250ZW50LnNsaWNlKDAsIGluZGV4KTtcbiAgY29uc3QgbGluZXMgPSBvcmlnaW5hbENvbnRlbnRcbiAgICAuc3BsaXQoJ1xcbicpXG4gICAgLm1hcCgobGluZSkgPT4ge1xuICAgICAgY29uc3QgbmV3TGluZSA9IGxpbmUudHJpbSgpO1xuICAgICAgcmV0dXJuIG5ld0xpbmUuZW5kc1dpdGgoJy8nKSA/IG5ld0xpbmUuc2xpY2UoMCwgLTEpIDogbmV3TGluZTtcbiAgICB9KVxuICAgIC5maWx0ZXIoKGwpID0+IGwgJiYgIWwuc3RhcnRzV2l0aCgnIycpICYmICFsLmluY2x1ZGVzKCcvJykpO1xuXG4gIHJldHVybiBgJHtsaW5lcy5tYXAoKGxpbmUpID0+IGAgXCIhKiovJHtsaW5lfS8qKlwiYCkuam9pbignJyl9IHx8IHRydWVgO1xufVxuXG5hc3luYyBmdW5jdGlvbiBmaXhTY3JpcHROYW1lcyhcbiAgc2NyaXB0czogUGFja2FnZUpzb24uU2NyaXB0cyxcbiAgbmV3SnNvblRleHQ6IHN0cmluZyxcbiAgY29uZmlnOiBQYWNrYWdlQ29uZmlnXG4pOiBQcm9taXNlPHN0cmluZz4ge1xuICBjb25zdCBvbGRBbmROZXdTY3JpcHROYW1lczogW3N0cmluZywgc3RyaW5nXVtdID0gW107XG4gIGZvciAoY29uc3QgW2tleV0gb2YgT2JqZWN0LmtleXMoc2NyaXB0cykpIHtcbiAgICBpZiAoa2V5ICYmICFrZXkuc3RhcnRzV2l0aCgnOicpICYmIGtleS5pbmNsdWRlcygnOicpKSB7XG4gICAgICBvbGRBbmROZXdTY3JpcHROYW1lcy5wdXNoKFtrZXksIGtleS5yZXBsYWNlQWxsKCc6JywgJy0nKV0pO1xuICAgIH1cbiAgfVxuICBpZiAob2xkQW5kTmV3U2NyaXB0TmFtZXMubGVuZ3RoID09PSAwKSByZXR1cm4gbmV3SnNvblRleHQ7XG5cbiAgZm9yIChjb25zdCBbb2xkTmFtZSwgbmV3TmFtZV0gb2Ygb2xkQW5kTmV3U2NyaXB0TmFtZXMpIHtcbiAgICBuZXdKc29uVGV4dCA9IG5ld0pzb25UZXh0LnJlcGxhY2VBbGwob2xkTmFtZSwgbmV3TmFtZSk7XG4gIH1cbiAgY29uc3QgZmlsZXMgPSBhd2FpdCBmZy5nbG9iKFsnKiovKi57bWQsY2pzLG1qcyxqcyxqc3gsY3RzLG10cyx0cyx0c3h9JywgJyoqL0RvY2tlcmZpbGUnXSwge1xuICAgIGN3ZDogY29uZmlnLmRpclBhdGgsXG4gICAgZG90OiB0cnVlLFxuICAgIGlnbm9yZTogZ2xvYklnbm9yZSxcbiAgfSk7XG4gIGZvciAoY29uc3QgZmlsZSBvZiBmaWxlcykge1xuICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bihhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGguam9pbihjb25maWcuZGlyUGF0aCwgZmlsZSk7XG4gICAgICBjb25zdCBvbGRDb250ZW50ID0gYXdhaXQgZnMucHJvbWlzZXMucmVhZEZpbGUoZmlsZVBhdGgsICd1dGY4Jyk7XG4gICAgICBsZXQgbmV3Q29udGVudCA9IG9sZENvbnRlbnQ7XG4gICAgICBmb3IgKGNvbnN0IFtvbGROYW1lLCBuZXdOYW1lXSBvZiBvbGRBbmROZXdTY3JpcHROYW1lcykge1xuICAgICAgICBuZXdDb250ZW50ID0gbmV3Q29udGVudC5yZXBsYWNlQWxsKG9sZE5hbWUsIG5ld05hbWUpO1xuICAgICAgfVxuICAgICAgaWYgKG5ld0NvbnRlbnQgIT09IG9sZENvbnRlbnQpIHtcbiAgICAgICAgYXdhaXQgZnMucHJvbWlzZXMud3JpdGVGaWxlKGZpbGVQYXRoLCBuZXdDb250ZW50KTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuICBhd2FpdCBwcm9taXNlUG9vbC5wcm9taXNlQWxsKCk7XG4gIHJldHVybiBuZXdKc29uVGV4dDtcbn1cblxuYXN5bmMgZnVuY3Rpb24gdXBkYXRlUHJpdmF0ZVBhY2thZ2VzKGpzb25PYmo6IFBhY2thZ2VKc29uKTogUHJvbWlzZTx2b2lkPiB7XG4gIGpzb25PYmouZGVwZW5kZW5jaWVzID0ganNvbk9iai5kZXBlbmRlbmNpZXMgPz8ge307XG4gIGpzb25PYmouZGV2RGVwZW5kZW5jaWVzID0ganNvbk9iai5kZXZEZXBlbmRlbmNpZXMgPz8ge307XG4gIGNvbnN0IHBhY2thZ2VOYW1lcyA9IG5ldyBTZXQoWy4uLk9iamVjdC5rZXlzKGpzb25PYmouZGVwZW5kZW5jaWVzKSwgLi4uT2JqZWN0LmtleXMoanNvbk9iai5kZXZEZXBlbmRlbmNpZXMpXSk7XG4gIGlmIChwYWNrYWdlTmFtZXMuaGFzKCdAd2lsbGJvb3N0ZXIvYXV0aCcpICYmICFpc1dvcmtzcGFjZVBhY2thZ2UoanNvbk9iaiwgJ0B3aWxsYm9vc3Rlci9hdXRoJykpIHtcbiAgICBkZWxldGUganNvbk9iai5kZXZEZXBlbmRlbmNpZXNbJ0B3aWxsYm9vc3Rlci9hdXRoJ107XG4gICAgY29uc3QgY29tbWl0SGFzaCA9IGF3YWl0IGdldExhdGVzdENvbW1pdEhhc2goJ1dpbGxCb29zdGVyTGFiJywgJ2F1dGgnKTtcbiAgICBqc29uT2JqLmRlcGVuZGVuY2llc1snQHdpbGxib29zdGVyL2F1dGgnXSA9IGBnaXRAZ2l0aHViLmNvbTpXaWxsQm9vc3RlckxhYi9hdXRoLmdpdCMke2NvbW1pdEhhc2h9YDtcbiAgfVxuICBpZiAocGFja2FnZU5hbWVzLmhhcygnQGRpc2NvcmQtYm90L3NoYXJlZCcpICYmICFpc1dvcmtzcGFjZVBhY2thZ2UoanNvbk9iaiwgJ0BkaXNjb3JkLWJvdC9zaGFyZWQnKSkge1xuICAgIGRlbGV0ZSBqc29uT2JqLmRldkRlcGVuZGVuY2llc1snQGRpc2NvcmQtYm90L3NoYXJlZCddO1xuICAgIGNvbnN0IGNvbW1pdEhhc2ggPSBhd2FpdCBnZXRMYXRlc3RDb21taXRIYXNoKCdXaWxsQm9vc3RlckxhYicsICdkaXNjb3JkLWJvdCcpO1xuICAgIGpzb25PYmouZGVwZW5kZW5jaWVzWydAZGlzY29yZC1ib3Qvc2hhcmVkJ10gPSBgZ2l0QGdpdGh1Yi5jb206V2lsbEJvb3N0ZXJMYWIvZGlzY29yZC1ib3QuZ2l0IyR7Y29tbWl0SGFzaH1gO1xuICB9XG5cbiAgaWYgKHBhY2thZ2VOYW1lcy5oYXMoJ0B3aWxsYm9vc3Rlci9jb2RlLWFuYWx5emVyJykgJiYgIWlzV29ya3NwYWNlUGFja2FnZShqc29uT2JqLCAnQHdpbGxib29zdGVyL2NvZGUtYW5hbHl6ZXInKSkge1xuICAgIGRlbGV0ZSBqc29uT2JqLmRlcGVuZGVuY2llc1snQHdpbGxib29zdGVyL2NvZGUtYW5hbHl6ZXInXTtcbiAgICBjb25zdCBjb21taXRIYXNoID0gYXdhaXQgZ2V0TGF0ZXN0Q29tbWl0SGFzaCgnV2lsbEJvb3N0ZXJMYWInLCAnY29kZS1hbmFseXplcicpO1xuICAgIGpzb25PYmouZGV2RGVwZW5kZW5jaWVzWydAd2lsbGJvb3N0ZXIvY29kZS1hbmFseXplciddID1cbiAgICAgIGBnaXRAZ2l0aHViLmNvbTpXaWxsQm9vc3RlckxhYi9jb2RlLWFuYWx5emVyLmdpdCMke2NvbW1pdEhhc2h9YDtcbiAgfVxuICBpZiAocGFja2FnZU5hbWVzLmhhcygnQHdpbGxib29zdGVyL2p1ZGdlJykgJiYgIWlzV29ya3NwYWNlUGFja2FnZShqc29uT2JqLCAnQHdpbGxib29zdGVyL2p1ZGdlJykpIHtcbiAgICBkZWxldGUganNvbk9iai5kZXZEZXBlbmRlbmNpZXNbJ0B3aWxsYm9vc3Rlci9qdWRnZSddO1xuICAgIGNvbnN0IGNvbW1pdEhhc2ggPSBhd2FpdCBnZXRMYXRlc3RDb21taXRIYXNoKCdXaWxsQm9vc3RlckxhYicsICdqdWRnZScpO1xuICAgIGpzb25PYmouZGVwZW5kZW5jaWVzWydAd2lsbGJvb3N0ZXIvanVkZ2UnXSA9IGBnaXRAZ2l0aHViLmNvbTpXaWxsQm9vc3RlckxhYi9qdWRnZS5naXQjJHtjb21taXRIYXNofWA7XG4gIH1cbiAgaWYgKHBhY2thZ2VOYW1lcy5oYXMoJ0B3aWxsYm9vc3Rlci9sbG0tcHJveHknKSAmJiAhaXNXb3Jrc3BhY2VQYWNrYWdlKGpzb25PYmosICdAd2lsbGJvb3N0ZXIvbGxtLXByb3h5JykpIHtcbiAgICBkZWxldGUganNvbk9iai5kZXZEZXBlbmRlbmNpZXNbJ0B3aWxsYm9vc3Rlci9sbG0tcHJveHknXTtcbiAgICBjb25zdCBjb21taXRIYXNoID0gYXdhaXQgZ2V0TGF0ZXN0Q29tbWl0SGFzaCgnV2lsbEJvb3N0ZXJMYWInLCAnbGxtLXByb3h5Jyk7XG4gICAganNvbk9iai5kZXBlbmRlbmNpZXNbJ0B3aWxsYm9vc3Rlci9sbG0tcHJveHknXSA9IGBnaXRAZ2l0aHViLmNvbTpXaWxsQm9vc3RlckxhYi9sbG0tcHJveHkuZ2l0IyR7Y29tbWl0SGFzaH1gO1xuICB9XG59XG5cbmZ1bmN0aW9uIGlzV29ya3NwYWNlUGFja2FnZShqc29uT2JqOiBQYWNrYWdlSnNvbiwgcGFja2FnZU5hbWU6IHN0cmluZyk6IGJvb2xlYW4ge1xuICByZXR1cm4gKGpzb25PYmouZGV2RGVwZW5kZW5jaWVzPy5bcGFja2FnZU5hbWVdIHx8IGpzb25PYmouZGVwZW5kZW5jaWVzPy5bcGFja2FnZU5hbWVdIHx8ICcnKS5pbmNsdWRlcygnd29ya3NwYWNlJyk7XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VKc29uIH0gZnJvbSAndHlwZS1mZXN0JztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgcHJvbWlzZVBvb2wgfSBmcm9tICcuLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5pbXBvcnQgeyBzcGF3blN5bmMgfSBmcm9tICcuLi91dGlscy9zcGF3blV0aWwuanMnO1xuXG5pbXBvcnQgeyBnZW5lcmF0ZVNjcmlwdHMgfSBmcm9tICcuL3BhY2thZ2VKc29uLmpzJztcblxuY29uc3Qgc2NyaXB0cyA9IHtcbiAgcHJlQ29tbWl0OiAnbm9kZSBub2RlX21vZHVsZXMvLmJpbi9saW50LXN0YWdlZCcsXG4gIHByZVB1c2g6IGB5YXJuIHR5cGVjaGVja2AsXG4gIHByZVB1c2hGb3JMYWI6IGBcbmlmIFsgJChnaXQgYnJhbmNoIC0tc2hvdy1jdXJyZW50KSA9IFwibWFpblwiIF07IHRoZW5cbiAgZWNobyBcIioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlwiXG4gIGVjaG8gXCIqKiogRG9uJ3QgcHVzaCBtYWluIGJyYW5jaCBkaXJlY3RseS4gVXNlIFBSISAqKipcIlxuICBlY2hvIFwiKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXCJcbiAgZXhpdCAxXG5maVxuXG55YXJuIHR5cGVjaGVja1xuYC50cmltKCksXG4gIHByZVB1c2hGb3JMYWJFeGNlcHRBZG1pbjogYFxuaWYgWyAkKGdpdCBicmFuY2ggLS1zaG93LWN1cnJlbnQpID0gXCJtYWluXCIgXSAmJiBbICQoZ2l0IGNvbmZpZyB1c2VyLmVtYWlsKSAhPSBcImV4a2F6dXVAZ21haWwuY29tXCIgXTsgdGhlblxuICBlY2hvIFwiKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXCJcbiAgZWNobyBcIioqKiBEb24ndCBwdXNoIG1haW4gYnJhbmNoIGRpcmVjdGx5LiBVc2UgUFIhICoqKlwiXG4gIGVjaG8gXCIqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcIlxuICBleGl0IDFcbmZpXG5cbnlhcm4gdHlwZWNoZWNrXG5gLnRyaW0oKSxcbiAgcG9zdE1lcmdlOiBgXG5jaGFuZ2VkX2ZpbGVzPVwiJChnaXQgZGlmZi10cmVlIC1yIC0tbmFtZS1vbmx5IC0tbm8tY29tbWl0LWlkIE9SSUdfSEVBRCBIRUFEKVwiXG5cbnJ1bl9pZl9jaGFuZ2VkKCkge1xuICBpZiBlY2hvIFwiJGNoYW5nZWRfZmlsZXNcIiB8IGdyZXAgLS1xdWlldCAtRSBcIiQxXCI7IHRoZW5cbiAgICBldmFsIFwiJDJcIlxuICBmaVxufVxuYC50cmltKCksXG59O1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVIdXNreXJjVXBkYXRpbmdQYWNrYWdlSnNvbihjb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdnZW5lcmF0ZUh1c2t5cmNVcGRhdGluZ1BhY2thZ2VKc29uJywgYXN5bmMgKCkgPT4ge1xuICAgIGF3YWl0IGNvcmUoY29uZmlnKTtcbiAgfSk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGNvcmUoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IHBhY2thZ2VKc29uUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJ3BhY2thZ2UuanNvbicpO1xuICBjb25zdCBqc29uVGV4dCA9IGF3YWl0IGZzLnByb21pc2VzLnJlYWRGaWxlKHBhY2thZ2VKc29uUGF0aCwgJ3V0ZjgnKTtcbiAgY29uc3QgcGFja2FnZUpzb24gPSBKU09OLnBhcnNlKGpzb25UZXh0KSBhcyBQYWNrYWdlSnNvbjtcbiAgcGFja2FnZUpzb24uc2NyaXB0cyA/Pz0ge307XG4gIGRlbGV0ZSBwYWNrYWdlSnNvbi5zY3JpcHRzLnBvc3RpbnN0YWxsO1xuICBkZWxldGUgcGFja2FnZUpzb24uc2NyaXB0cy5wb3N0cHVibGlzaDtcbiAgZGVsZXRlIHBhY2thZ2VKc29uLnNjcmlwdHMucHJlcGFyZTtcbiAgZGVsZXRlIHBhY2thZ2VKc29uLnNjcmlwdHMucHJlcHVibGlzaE9ubHk7XG4gIGRlbGV0ZSBwYWNrYWdlSnNvbi5zY3JpcHRzLnByZXBhY2s7XG4gIGRlbGV0ZSBwYWNrYWdlSnNvbi5zY3JpcHRzLnBvc3RwYWNrO1xuXG4gIGNvbnN0IGRpclBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICcuaHVza3knKTtcbiAgYXdhaXQgZnMucHJvbWlzZXMud3JpdGVGaWxlKHBhY2thZ2VKc29uUGF0aCwgSlNPTi5zdHJpbmdpZnkocGFja2FnZUpzb24sIHVuZGVmaW5lZCwgMikpO1xuICBpZiAoY29uZmlnLmlzQnVuKSB7XG4gICAgYXdhaXQgZnMucHJvbWlzZXMucm0oZGlyUGF0aCwgeyBmb3JjZTogdHJ1ZSwgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICAgIHNwYXduU3luYygnZ2l0JywgWydjb25maWcnLCAnLS11bnNldCcsICdjb3JlLmhvb2tzUGF0aCddLCBjb25maWcuZGlyUGF0aCk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgc3Bhd25TeW5jKCd5YXJuJywgWydkbHgnLCAnaHVza3knLCAnaW5pdCddLCBjb25maWcuZGlyUGF0aCk7XG5cbiAgY29uc3QgcHJlQ29tbWl0RmlsZVBhdGggPSBwYXRoLnJlc29sdmUoZGlyUGF0aCwgJ3ByZS1jb21taXQnKTtcblxuICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnMucHJvbWlzZXMucm0ocGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnLmh1c2t5cmMuanNvbicpLCB7IGZvcmNlOiB0cnVlIH0pKTtcbiAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzLnByb21pc2VzLndyaXRlRmlsZShwcmVDb21taXRGaWxlUGF0aCwgc2NyaXB0cy5wcmVDb21taXQgKyAnXFxuJykpO1xuXG4gIGNvbnN0IHsgdHlwZWNoZWNrIH0gPSBnZW5lcmF0ZVNjcmlwdHMoY29uZmlnLCB7fSk7XG4gIGlmICh0eXBlY2hlY2spIHtcbiAgICBsZXQgcHJlUHVzaCA9IGNvbmZpZy5yZXBvc2l0b3J5Py5zdGFydHNXaXRoKCdnaXRodWI6V2lsbEJvb3N0ZXJMYWIvJylcbiAgICAgID8gY29uZmlnLnJlcG9zaXRvcnkudG9Mb2NhbGVMb3dlckNhc2UoKS5pbmNsdWRlcygnZXhlcmNvZGUnKVxuICAgICAgICA/IHNjcmlwdHMucHJlUHVzaEZvckxhYlxuICAgICAgICA6IHNjcmlwdHMucHJlUHVzaEZvckxhYkV4Y2VwdEFkbWluXG4gICAgICA6IHNjcmlwdHMucHJlUHVzaDtcbiAgICBwcmVQdXNoID0gcHJlUHVzaC5yZXBsYWNlKFxuICAgICAgJ3lhcm4gdHlwZWNoZWNrJyxcbiAgICAgIHR5cGVjaGVja1xuICAgICAgICAucmVwbGFjZSgndHNjICcsICdub2RlIG5vZGVfbW9kdWxlcy8uYmluL3RzYyAnKVxuICAgICAgICAucmVwbGFjZSgnd2IgJywgJ25vZGUgbm9kZV9tb2R1bGVzLy5iaW4vd2IgJylcbiAgICAgICAgLy8gcHlyaWdodCBoYXMgbm8gYXJndW1lbnRzXG4gICAgICAgIC5yZXBsYWNlKCdweXJpZ2h0JywgJ25vZGUgbm9kZV9tb2R1bGVzLy5iaW4vcHlyaWdodCcpXG4gICAgKTtcbiAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT5cbiAgICAgIGZzLnByb21pc2VzLndyaXRlRmlsZShwYXRoLnJlc29sdmUoZGlyUGF0aCwgJ3ByZS1wdXNoJyksIHByZVB1c2ggKyAnXFxuJywge1xuICAgICAgICBtb2RlOiAwbzc1NSxcbiAgICAgIH0pXG4gICAgKTtcbiAgfVxuICBjb25zdCBwb3N0TWVyZ2VDb21tYW5kID0gYCR7c2NyaXB0cy5wb3N0TWVyZ2V9XFxuXFxuJHtnZW5lcmF0ZVBvc3RNZXJnZUNvbW1hbmRzKGNvbmZpZykuam9pbignXFxuJyl9XFxuYDtcbiAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+XG4gICAgZnMucHJvbWlzZXMud3JpdGVGaWxlKHBhdGgucmVzb2x2ZShkaXJQYXRoLCAncG9zdC1tZXJnZScpLCBwb3N0TWVyZ2VDb21tYW5kLCB7XG4gICAgICBtb2RlOiAwbzc1NSxcbiAgICB9KVxuICApO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2VuZXJhdGVQb3N0TWVyZ2VDb21tYW5kcyhjb25maWc6IFBhY2thZ2VDb25maWcpOiBzdHJpbmdbXSB7XG4gIGNvbnN0IHBvc3RNZXJnZUNvbW1hbmRzOiBzdHJpbmdbXSA9IFtdO1xuICBpZiAoY29uZmlnLnZlcnNpb25zVGV4dCkge1xuICAgIHBvc3RNZXJnZUNvbW1hbmRzLnB1c2goXG4gICAgICBTdHJpbmcucmF3YHJ1bl9pZl9jaGFuZ2VkIFwiXFwuListdmVyc2lvblwiIFwiYXdrICd7cHJpbnQgXFwkMX0nIC50b29sLXZlcnNpb25zIHwgeGFyZ3MgLUl7fSBhc2RmIHBsdWdpbiBhZGQge31cImAsXG4gICAgICBTdHJpbmcucmF3YHJ1bl9pZl9jaGFuZ2VkIFwiXFwuListdmVyc2lvblwiIFwiYXNkZiBwbHVnaW4gdXBkYXRlIC0tYWxsXCJgXG4gICAgKTtcbiAgfVxuICAvLyBQeXRob27jgYzjgarjgYTjgajjgqTjg7Pjgrnjg4jjg7zjg6vjgafjgY3jgarjgYTlh6bnkIbns7vjgYzlrZjlnKjjgZnjgovjgZ/jgoHjgIHlvLfliLbnmoTjgavmnIDliJ3jgavjgqTjg7Pjgrnjg4jjg7zjg6vjgZnjgovjgIJcbiAgaWYgKGNvbmZpZy52ZXJzaW9uc1RleHQ/LmluY2x1ZGVzKCdweXRob24gJykpIHtcbiAgICBwb3N0TWVyZ2VDb21tYW5kcy5wdXNoKFN0cmluZy5yYXdgcnVuX2lmX2NoYW5nZWQgXCJcXC4uKy12ZXJzaW9uXCIgXCJhc2RmIGluc3RhbGwgcHl0aG9uXCJgKTtcbiAgfVxuICBpZiAoY29uZmlnLnZlcnNpb25zVGV4dCkge1xuICAgIHBvc3RNZXJnZUNvbW1hbmRzLnB1c2goU3RyaW5nLnJhd2BydW5faWZfY2hhbmdlZCBcIlxcLi4rLXZlcnNpb25cIiBcImFzZGYgaW5zdGFsbFwiYCk7XG4gIH1cbiAgY29uc3QgaW5zdGFsbENvbW1hbmQgPSBjb25maWcuaXNCdW4gPyAnYnVuIGluc3RhbGwnIDogJ3lhcm4nO1xuICBjb25zdCBybU5leHREaXJlY3RvcnkgPSBjb25maWcuZGVwZW5kaW5nLmJsaXR6IHx8IGNvbmZpZy5kZXBlbmRpbmcubmV4dCA/ICcgJiYgcm0gLVJmIC5uZXh0JyA6ICcnO1xuICBwb3N0TWVyZ2VDb21tYW5kcy5wdXNoKFN0cmluZy5yYXdgcnVuX2lmX2NoYW5nZWQgXCJwYWNrYWdlXFwuanNvblwiIFwiJHtpbnN0YWxsQ29tbWFuZH0ke3JtTmV4dERpcmVjdG9yeX1cImApO1xuICBpZiAoY29uZmlnLmRvZXNDb250YWluUG9ldHJ5TG9jaykge1xuICAgIHBvc3RNZXJnZUNvbW1hbmRzLnB1c2goU3RyaW5nLnJhd2BydW5faWZfY2hhbmdlZCBcInBvZXRyeVxcLmxvY2tcIiBcInBvZXRyeSBpbnN0YWxsXCJgKTtcbiAgfVxuICBpZiAoY29uZmlnLmRlcGVuZGluZy5ibGl0eikge1xuICAgIHBvc3RNZXJnZUNvbW1hbmRzLnB1c2goXG4gICAgICBTdHJpbmcucmF3YHJ1bl9pZl9jaGFuZ2VkIFwiLipcXC5wcmlzbWFcIiBcIm5vZGUgbm9kZV9tb2R1bGVzLy5iaW4vYmxpdHogcHJpc21hIG1pZ3JhdGUgZGVwbG95XCJgLFxuICAgICAgU3RyaW5nLnJhd2BydW5faWZfY2hhbmdlZCBcIi4qXFwucHJpc21hXCIgXCJub2RlIG5vZGVfbW9kdWxlcy8uYmluL2JsaXR6IHByaXNtYSBnZW5lcmF0ZVwiYCxcbiAgICAgIFN0cmluZy5yYXdgcnVuX2lmX2NoYW5nZWQgXCIuKlxcLnByaXNtYVwiIFwibm9kZSBub2RlX21vZHVsZXMvLmJpbi9ibGl0eiBjb2RlZ2VuXCJgXG4gICAgKTtcbiAgfSBlbHNlIGlmIChjb25maWcuZGVwZW5kaW5nLnByaXNtYSkge1xuICAgIHBvc3RNZXJnZUNvbW1hbmRzLnB1c2goXG4gICAgICBTdHJpbmcucmF3YHJ1bl9pZl9jaGFuZ2VkIFwiLipcXC5wcmlzbWFcIiBcIm5vZGUgbm9kZV9tb2R1bGVzLy5iaW4vZG90ZW52IC1jIGRldmVsb3BtZW50IC0tIG5vZGUgbm9kZV9tb2R1bGVzLy5iaW4vcHJpc21hIG1pZ3JhdGUgZGVwbG95XCJgLFxuICAgICAgU3RyaW5nLnJhd2BydW5faWZfY2hhbmdlZCBcIi4qXFwucHJpc21hXCIgXCJub2RlIG5vZGVfbW9kdWxlcy8uYmluL2RvdGVudiAtYyBkZXZlbG9wbWVudCAtLSBub2RlIG5vZGVfbW9kdWxlcy8uYmluL3ByaXNtYSBnZW5lcmF0ZVwiYFxuICAgICk7XG4gIH1cbiAgcmV0dXJuIHBvc3RNZXJnZUNvbW1hbmRzO1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZXh0ZW5zaW9ucyB9IGZyb20gJy4uL3V0aWxzL2V4dGVuc2lvbnMuanMnO1xuaW1wb3J0IHsgZnNVdGlsIH0gZnJvbSAnLi4vdXRpbHMvZnNVdGlsLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuXG5mdW5jdGlvbiBjcmVhdGVUYXNrT3B0aW9ucyhydW5uZXI6IHN0cmluZywgYXJnczogc3RyaW5nLCBuYW1lOiBzdHJpbmcsIGV4dGVuc2lvbjogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIGAgICAgPFRhc2tPcHRpb25zIGlzRW5hYmxlZD1cInRydWVcIj5cbiAgICAgIDxvcHRpb24gbmFtZT1cImFyZ3VtZW50c1wiIHZhbHVlPVwiJHthcmdzfSAkRmlsZVBhdGhSZWxhdGl2ZVRvUHJvamVjdFJvb3QkXCIgLz5cbiAgICAgIDxvcHRpb24gbmFtZT1cImNoZWNrU3ludGF4RXJyb3JzXCIgdmFsdWU9XCJmYWxzZVwiIC8+XG4gICAgICA8b3B0aW9uIG5hbWU9XCJkZXNjcmlwdGlvblwiIC8+XG4gICAgICA8b3B0aW9uIG5hbWU9XCJleGl0Q29kZUJlaGF2aW9yXCIgdmFsdWU9XCJFUlJPUlwiIC8+XG4gICAgICA8b3B0aW9uIG5hbWU9XCJmaWxlRXh0ZW5zaW9uXCIgdmFsdWU9XCIke2V4dGVuc2lvbn1cIiAvPlxuICAgICAgPG9wdGlvbiBuYW1lPVwiaW1tZWRpYXRlU3luY1wiIHZhbHVlPVwiZmFsc2VcIiAvPlxuICAgICAgPG9wdGlvbiBuYW1lPVwibmFtZVwiIHZhbHVlPVwiJHtuYW1lfSAoLiR7ZXh0ZW5zaW9ufSlcIiAvPlxuICAgICAgPG9wdGlvbiBuYW1lPVwib3V0cHV0XCIgdmFsdWU9XCIkRmlsZVBhdGhSZWxhdGl2ZVRvUHJvamVjdFJvb3QkXCIgLz5cbiAgICAgIDxvcHRpb24gbmFtZT1cIm91dHB1dEZpbHRlcnNcIj5cbiAgICAgICAgPGFycmF5IC8+XG4gICAgICA8L29wdGlvbj5cbiAgICAgIDxvcHRpb24gbmFtZT1cIm91dHB1dEZyb21TdGRvdXRcIiB2YWx1ZT1cImZhbHNlXCIgLz5cbiAgICAgIDxvcHRpb24gbmFtZT1cInByb2dyYW1cIiB2YWx1ZT1cIiR7cnVubmVyfVwiIC8+XG4gICAgICA8b3B0aW9uIG5hbWU9XCJydW5PbkV4dGVybmFsQ2hhbmdlc1wiIHZhbHVlPVwiZmFsc2VcIiAvPlxuICAgICAgPG9wdGlvbiBuYW1lPVwic2NvcGVOYW1lXCIgdmFsdWU9XCJQcm9qZWN0IEZpbGVzXCIgLz5cbiAgICAgIDxvcHRpb24gbmFtZT1cInRyYWNrT25seVJvb3RcIiB2YWx1ZT1cImZhbHNlXCIgLz5cbiAgICAgIDxvcHRpb24gbmFtZT1cIndvcmtpbmdEaXJcIiB2YWx1ZT1cIiRQcm9qZWN0RmlsZURpciRcIiAvPlxuICAgICAgPGVudnMgLz5cbiAgICA8L1Rhc2tPcHRpb25zPlxuYDtcbn1cblxuY29uc3QgcHJldHRpZXJDb250ZW50ID0gYDw/eG1sIHZlcnNpb249XCIxLjBcIiBlbmNvZGluZz1cIlVURi04XCI/PlxuPHByb2plY3QgdmVyc2lvbj1cIjRcIj5cbiAgPGNvbXBvbmVudCBuYW1lPVwiUHJvamVjdFRhc2tzT3B0aW9uc1wiPlxuJHtleHRlbnNpb25zLnByZXR0aWVyLm1hcCgoZXh0KSA9PiBjcmVhdGVUYXNrT3B0aW9ucygnbm9kZScsICdub2RlX21vZHVsZXMvLmJpbi9wcmV0dGllciAtLWNhY2hlIC0td3JpdGUnLCAnUHJldHRpZXInLCBleHQpKS5qb2luKCcnKX1cbiAgPC9jb21wb25lbnQ+XG48L3Byb2plY3Q+XG5gO1xuXG5jb25zdCBiaW9tZUNvbnRlbnQgPSBgPD94bWwgdmVyc2lvbj1cIjEuMFwiIGVuY29kaW5nPVwiVVRGLThcIj8+XG48cHJvamVjdCB2ZXJzaW9uPVwiNFwiPlxuICA8Y29tcG9uZW50IG5hbWU9XCJQcm9qZWN0VGFza3NPcHRpb25zXCI+XG4ke2V4dGVuc2lvbnMucHJldHRpZXIubWFwKChleHQpID0+IGNyZWF0ZVRhc2tPcHRpb25zKCdidW4nLCAnLS1idW4gbm9kZV9tb2R1bGVzLy5iaW4vYmlvbWUgY2hlY2sgLS1maXggLS1uby1lcnJvcnMtb24tdW5tYXRjaGVkIC0tc2tpcC1wYXJzZS1lcnJvcnMnLCAnQmlvbWUnLCBleHQpKS5qb2luKCcnKX1cbiAgPC9jb21wb25lbnQ+XG48L3Byb2plY3Q+XG5gO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVJZGVhU2V0dGluZ3MoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZ2VuZXJhdGVJZGVhU2V0dGluZ3MnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgZGlyUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJy5pZGVhJyk7XG4gICAgaWYgKGZzLmV4aXN0c1N5bmMoZGlyUGF0aCkpIHtcbiAgICAgIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKGRpclBhdGgsICd3YXRjaGVyVGFza3MueG1sJyk7XG4gICAgICBhd2FpdCAoY29uZmlnLmRvZXNDb250YWluSmF2YVNjcmlwdCB8fFxuICAgICAgY29uZmlnLmRvZXNDb250YWluSmF2YVNjcmlwdEluUGFja2FnZXMgfHxcbiAgICAgIGNvbmZpZy5kb2VzQ29udGFpblR5cGVTY3JpcHQgfHxcbiAgICAgIGNvbmZpZy5kb2VzQ29udGFpblR5cGVTY3JpcHRJblBhY2thZ2VzIHx8XG4gICAgICAoY29uZmlnLmRvZXNDb250YWluUGFja2FnZUpzb24gJiZcbiAgICAgICAgIWNvbmZpZy5kb2VzQ29udGFpblB1YnNwZWNZYW1sICYmXG4gICAgICAgICFjb25maWcuZG9lc0NvbnRhaW5HZW1maWxlICYmXG4gICAgICAgICFjb25maWcuZG9lc0NvbnRhaW5Hb01vZCAmJlxuICAgICAgICAhY29uZmlnLmRvZXNDb250YWluUG9tWG1sKVxuICAgICAgICA/IHByb21pc2VQb29sLnJ1bigoKSA9PiBmc1V0aWwuZ2VuZXJhdGVGaWxlKGZpbGVQYXRoLCBjb25maWcuaXNCdW4gPyBiaW9tZUNvbnRlbnQgOiBwcmV0dGllckNvbnRlbnQpKVxuICAgICAgICA6IHByb21pc2VQb29sLnJ1bigoKSA9PiBmcy5wcm9taXNlcy5ybShmaWxlUGF0aCwgeyBmb3JjZTogdHJ1ZSB9KSkpO1xuICAgIH1cbiAgfSk7XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgeWFtbCBmcm9tICdqcy15YW1sJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgcHJvbWlzZVBvb2wgfSBmcm9tICcuLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5cbmltcG9ydCB7IGdlbmVyYXRlUG9zdE1lcmdlQ29tbWFuZHMgfSBmcm9tICcuL2h1c2t5cmMuanMnO1xuaW1wb3J0IHsgZ2VuZXJhdGVTY3JpcHRzIH0gZnJvbSAnLi9wYWNrYWdlSnNvbi5qcyc7XG5cbmNvbnN0IG5ld1NldHRpbmdzID0ge1xuICAncG9zdC1tZXJnZSc6IHtcbiAgICBzY3JpcHRzOiB7XG4gICAgICAncHJlcGFyZS5zaCc6IHtcbiAgICAgICAgcnVubmVyOiAnYmFzaCcsXG4gICAgICB9LFxuICAgIH0sXG4gIH0sXG4gICdwcmUtY29tbWl0Jzoge1xuICAgIGNvbW1hbmRzOiB7XG4gICAgICBjbGVhbnVwOiB7XG4gICAgICAgIGdsb2I6ICcqLntjanMsY3NzLGN0cyxodG0saHRtbCxqcyxqc29uLGpzb241LGpzb25jLGpzeCxtZCxtanMsbXRzLHNjc3MsdHMsdHN4LHZ1ZSx5YW1sLHltbH0nLFxuICAgICAgICBydW46ICdidW4gLS1idW4gd2IgbGludCAtLWZpeCAtLWZvcm1hdCB7c3RhZ2VkX2ZpbGVzfSAmJiBnaXQgYWRkIHtzdGFnZWRfZmlsZXN9JyxcbiAgICAgIH0sXG4gICAgICAnY2hlY2stbWlncmF0aW9ucyc6IHtcbiAgICAgICAgZ2xvYjogJyoqL21pZ3JhdGlvbi5zcWwnLFxuICAgICAgICBydW46IGBcbmlmIGdyZXAgLXEgJ1dhcm5pbmdzOicge3N0YWdlZF9maWxlc307IHRoZW5cbiAgZWNobyBcIk1pZ3JhdGlvbiBTUUwgZmlsZXMgKHtzdGFnZWRfZmlsZXN9KSBjb250YWluIHdhcm5pbmdzISBQbGVhc2Ugc29sdmUgdGhlIHdhcm5pbmdzIGFuZCBjb21taXQgYWdhaW4uXCJcbiAgZXhpdCAxXG5maVxuYC50cmltKCksXG4gICAgICB9LFxuICAgIH0sXG4gIH0sXG4gICdwcmUtcHVzaCc6IHtcbiAgICBzY3JpcHRzOiB7XG4gICAgICAnY2hlY2suc2gnOiB7XG4gICAgICAgIHJ1bm5lcjogJ2Jhc2gnLFxuICAgICAgfSxcbiAgICB9LFxuICB9LFxufTtcblxuY29uc3Qgc2NyaXB0cyA9IHtcbiAgcHJlUHVzaDogYGJ1biAtLWJ1biBub2RlX21vZHVsZXMvLmJpbi93YiB0eXBlY2hlY2tgLFxuICBwcmVQdXNoRm9yTGFiOiBgXG4jIS9iaW4vYmFzaFxuXG5pZiBbICQoZ2l0IGJyYW5jaCAtLXNob3ctY3VycmVudCkgPSBcIm1haW5cIiBdICYmIFsgJChnaXQgY29uZmlnIHVzZXIuZW1haWwpICE9IFwiZXhrYXp1dUBnbWFpbC5jb21cIiBdOyB0aGVuXG4gIGVjaG8gXCIqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcIlxuICBlY2hvIFwiKioqIERvbid0IHB1c2ggbWFpbiBicmFuY2ggZGlyZWN0bHkuIFVzZSBQUiEgKioqXCJcbiAgZWNobyBcIioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlwiXG4gIGV4aXQgMVxuZmlcblxuYnVuIC0tYnVuIG5vZGVfbW9kdWxlcy8uYmluL3diIHR5cGVjaGVja1xuYC50cmltKCksXG4gIHBvc3RNZXJnZTogYFxuIyEvYmluL2Jhc2hcblxuY2hhbmdlZF9maWxlcz1cIiQoZ2l0IGRpZmYtdHJlZSAtciAtLW5hbWUtb25seSAtLW5vLWNvbW1pdC1pZCBPUklHX0hFQUQgSEVBRClcIlxuXG5ydW5faWZfY2hhbmdlZCgpIHtcbiAgaWYgZWNobyBcIiRjaGFuZ2VkX2ZpbGVzXCIgfCBncmVwIC0tcXVpZXQgLUUgXCIkMVwiOyB0aGVuXG4gICAgZXZhbCBcIiQyXCJcbiAgZmlcbn1cbmAudHJpbSgpLFxufTtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlTGVmdGhvb2tVcGRhdGluZ1BhY2thZ2VKc29uKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2dlbmVyYXRlTGVmdGhvb2tVcGRhdGluZ1BhY2thZ2VKc29uJywgYXN5bmMgKCkgPT4ge1xuICAgIGF3YWl0IGNvcmUoY29uZmlnKTtcbiAgfSk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGNvcmUoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IGRpclBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICcubGVmdGhvb2snKTtcbiAgY29uc3QgeyB0eXBlY2hlY2sgfSA9IGdlbmVyYXRlU2NyaXB0cyhjb25maWcsIHt9KTtcbiAgY29uc3Qgc2V0dGluZ3M6IFBhcnRpYWw8dHlwZW9mIG5ld1NldHRpbmdzPiA9IHsgLi4ubmV3U2V0dGluZ3MgfTtcbiAgaWYgKCF0eXBlY2hlY2spIHtcbiAgICBkZWxldGUgc2V0dGluZ3NbJ3ByZS1wdXNoJ107XG4gIH1cbiAgYXdhaXQgUHJvbWlzZS5hbGwoW1xuICAgIGZzLnByb21pc2VzLndyaXRlRmlsZShcbiAgICAgIHBhdGguam9pbihjb25maWcuZGlyUGF0aCwgJ2xlZnRob29rLnltbCcpLFxuICAgICAgeWFtbC5kdW1wKHNldHRpbmdzLCB7XG4gICAgICAgIGxpbmVXaWR0aDogLTEsXG4gICAgICAgIG5vQ29tcGF0TW9kZTogdHJ1ZSxcbiAgICAgICAgc3R5bGVzOiB7XG4gICAgICAgICAgJyEhbnVsbCc6ICdlbXB0eScsXG4gICAgICAgIH0sXG4gICAgICB9KVxuICAgICksXG4gICAgZnMucHJvbWlzZXMucm0oZGlyUGF0aCwgeyBmb3JjZTogdHJ1ZSwgcmVjdXJzaXZlOiB0cnVlIH0pLFxuICBdKTtcblxuICBpZiAodHlwZWNoZWNrKSB7XG4gICAgY29uc3QgcHJlUHVzaCA9IGNvbmZpZy5yZXBvc2l0b3J5Py5zdGFydHNXaXRoKCdnaXRodWI6V2lsbEJvb3N0ZXJMYWIvJykgPyBzY3JpcHRzLnByZVB1c2hGb3JMYWIgOiBzY3JpcHRzLnByZVB1c2g7XG4gICAgZnMubWtkaXJTeW5jKHBhdGguam9pbihkaXJQYXRoLCAncHJlLXB1c2gnKSwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+XG4gICAgICBmcy5wcm9taXNlcy53cml0ZUZpbGUocGF0aC5qb2luKGRpclBhdGgsICdwcmUtcHVzaCcsICdjaGVjay5zaCcpLCBwcmVQdXNoICsgJ1xcbicsIHtcbiAgICAgICAgbW9kZTogMG83NTUsXG4gICAgICB9KVxuICAgICk7XG4gIH1cbiAgY29uc3QgcG9zdE1lcmdlQ29tbWFuZCA9IGAke3NjcmlwdHMucG9zdE1lcmdlfVxcblxcbiR7Z2VuZXJhdGVQb3N0TWVyZ2VDb21tYW5kcyhjb25maWcpLmpvaW4oJ1xcbicpfVxcbmA7XG4gIGZzLm1rZGlyU3luYyhwYXRoLmpvaW4oZGlyUGF0aCwgJ3Bvc3QtbWVyZ2UnKSwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PlxuICAgIGZzLnByb21pc2VzLndyaXRlRmlsZShwYXRoLnJlc29sdmUoZGlyUGF0aCwgJ3Bvc3QtbWVyZ2UnLCAncHJlcGFyZS5zaCcpLCBwb3N0TWVyZ2VDb21tYW5kLCB7XG4gICAgICBtb2RlOiAwbzc1NSxcbiAgICB9KVxuICApO1xufVxuIiwiaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5cbmNvbnN0IHNyY0RpcmVjdG9yaWVzID0ge1xuICBub2RlOiBbJ3NyYycsICd0ZXN0JywgJ3NjcmlwdHMnXS50b1NvcnRlZCgpLFxuICBibGl0ejogWydzcmMnLCAndGVzdCcsICdzY3JpcHRzJywgJ2RiJywgJ2ludGVncmF0aW9ucycsICdtYWlsZXJzJ10udG9Tb3J0ZWQoKSxcbn07XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRTcmNEaXJzKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IHN0cmluZ1tdIHtcbiAgaWYgKGNvbmZpZy5kZXBlbmRpbmcuYmxpdHopIHtcbiAgICByZXR1cm4gc3JjRGlyZWN0b3JpZXMuYmxpdHo7XG4gIH1cbiAgcmV0dXJuIHNyY0RpcmVjdG9yaWVzLm5vZGU7XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBFc2xpbnRVdGlsIH0gZnJvbSAnLi4vdXRpbHMvZXNsaW50VXRpbC5qcyc7XG5pbXBvcnQgeyBleHRlbnNpb25zIH0gZnJvbSAnLi4vdXRpbHMvZXh0ZW5zaW9ucy5qcyc7XG5pbXBvcnQgeyBmc1V0aWwgfSBmcm9tICcuLi91dGlscy9mc1V0aWwuanMnO1xuaW1wb3J0IHsgcHJvbWlzZVBvb2wgfSBmcm9tICcuLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5pbXBvcnQgeyBnZXRTcmNEaXJzIH0gZnJvbSAnLi4vdXRpbHMvc3JjRGlyZWN0b3JpZXMuanMnO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVMaW50c3RhZ2VkcmMoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZ2VuZXJhdGVMaW50c3RhZ2VkcmMnLCBhc3luYyAoKSA9PiB7XG4gICAgYXdhaXQgY29yZShjb25maWcpO1xuICB9KTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gY29yZShjb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgZmlsZVBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICcubGludHN0YWdlZHJjLmNqcycpO1xuICBpZiAoY29uZmlnLmlzQnVuKSB7XG4gICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzLnByb21pc2VzLnJtKGZpbGVQYXRoLCB7IGZvcmNlOiB0cnVlIH0pKTtcbiAgICByZXR1cm47XG4gIH1cblxuICBjb25zdCBwYWNrYWdlUHJlZml4ID0gY29uZmlnLmlzUm9vdCA/ICdub2RlIG5vZGVfbW9kdWxlcy8uYmluLycgOiAnbm9kZSAuLi8uLi9ub2RlX21vZHVsZXMvLmJpbi8nO1xuICBjb25zdCBsaW5lczogc3RyaW5nW10gPSBbXTtcbiAgaWYgKGNvbmZpZy5kb2VzQ29udGFpbkphdmFTY3JpcHQgfHwgY29uZmlnLmRvZXNDb250YWluVHlwZVNjcmlwdCkge1xuICAgIGNvbnN0IGVzbGludCA9IGBcbiAgJyR7Z2V0RXNsaW50S2V5KGNvbmZpZyl9JzogWyR7SlNPTi5zdHJpbmdpZnkoXG4gICAgYCR7cGFja2FnZVByZWZpeH1lc2xpbnQgLS1maXgke0VzbGludFV0aWwuZ2V0TGludEZpeFN1ZmZpeChjb25maWcpfWBcbiAgKX0sICcke3BhY2thZ2VQcmVmaXh9cHJldHRpZXIgLS1jYWNoZSAtLXdyaXRlJ10sYDtcbiAgICBsaW5lcy5wdXNoKGVzbGludCk7XG4gIH1cbiAgY29uc3QgcGFja2FnZXNGaWx0ZXIgPSBjb25maWcuaXNSb290ID8gXCIgJiYgIWZpbGUuaW5jbHVkZXMoJy9wYWNrYWdlcy8nKVwiIDogJyc7XG4gIGxpbmVzLnB1c2goYFxuICAnLi8qKi8qLnske2V4dGVuc2lvbnMucHJldHRpZXIuam9pbignLCcpfX0nOiBmaWxlcyA9PiB7XG4gICAgbGV0IGZpbHRlcmVkRmlsZXMgPSBmaWxlcy5maWx0ZXIoZmlsZSA9PiAhZmlsZS5pbmNsdWRlcygnL3Rlc3QtZml4dHVyZXMvJykgJiYgIWZpbGUuaW5jbHVkZXMoJy90ZXN0L2ZpeHR1cmVzLycpJHtwYWNrYWdlc0ZpbHRlcn0pOyR7Z2V0RXNsaW50RmlsdGVyRm9yUHJldHRpZXIoY29uZmlnKX1cbiAgICBpZiAoZmlsdGVyZWRGaWxlcy5sZW5ndGggPT09IDApIHJldHVybiBbXTtcbiAgICBjb25zdCBjb21tYW5kcyA9IFtcXGAke3BhY2thZ2VQcmVmaXh9cHJldHRpZXIgLS1jYWNoZSAtLXdyaXRlIFxcJHtmaWx0ZXJlZEZpbGVzLmpvaW4oJyAnKX1cXGBdO1xuICAgIGlmIChmaWx0ZXJlZEZpbGVzLnNvbWUoZmlsZSA9PiBmaWxlLmVuZHNXaXRoKCdwYWNrYWdlLmpzb24nKSkpIHtcbiAgICAgIGNvbW1hbmRzLnB1c2goJyR7cGFja2FnZVByZWZpeH1zb3J0LXBhY2thZ2UtanNvbicpO1xuICAgIH1cbiAgICByZXR1cm4gY29tbWFuZHM7XG4gIH0sXG4gICcuLyoqL21pZ3JhdGlvbi5zcWwnOiAoZmlsZXMpID0+IHtcbiAgZm9yIChjb25zdCBmaWxlIG9mIGZpbGVzKSB7XG4gICAgY29uc3QgY29udGVudCA9IGZzLnJlYWRGaWxlU3luYyhmaWxlLCAndXRmLTgnKTtcbiAgICBpZiAoY29udGVudC5pbmNsdWRlcygnV2FybmluZ3M6JykpIHtcbiAgICAgIHJldHVybiBbXG4gICAgICAgIFxcYGVjaG8gJyEhISBNaWdyYXRpb24gU1FMIGZpbGUgKFxcJHtwYXRoLnJlbGF0aXZlKCcnLCBmaWxlKX0pIGNvbnRhaW5zIHdhcm5pbmdzICEhISBTb2x2ZSB0aGUgd2FybmluZ3MgYW5kIGNvbW1pdCBhZ2Fpbi4nXFxgLFxuICAgICAgICAnZmFsc2UnLFxuICAgICAgXTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIFtdO1xufSxgKTtcbiAgaWYgKGNvbmZpZy5kb2VzQ29udGFpblB1YnNwZWNZYW1sKSB7XG4gICAgbGluZXMucHVzaChgXG4gICcuL3tsaWIsdGVzdCx0ZXN0X2RyaXZlcn0vKiovKi5kYXJ0JzogZmlsZXMgPT4ge1xuICAgIGNvbnN0IGZpbHRlcmVkRmlsZXMgPSBmaWxlcy5maWx0ZXIoZmlsZSA9PiAhZmlsZS5pbmNsdWRlcygnZ2VuZXJhdGVkJykpXG4gICAgICAuZmlsdGVyKGZpbGUgPT4gIWZpbGUuZW5kc1dpdGgoJy5mcmVlemVkLmRhcnQnKSAmJiAhZmlsZS5lbmRzV2l0aCgnLmcuZGFydCcpKTtcbiAgICBpZiAoZmlsdGVyZWRGaWxlcy5sZW5ndGggPT09IDApIHJldHVybiBbXTtcbiAgICByZXR1cm4gW1xcYGRhcnQgZm9ybWF0IFxcJHtmaWx0ZXJlZEZpbGVzLmpvaW4oJyAnKX1cXGBdO1xuICB9LGApO1xuICB9XG4gIGlmIChjb25maWcuZG9lc0NvbnRhaW5Qb2V0cnlMb2NrKSB7XG4gICAgbGluZXMucHVzaChgXG4gICcuLyoqLyoucHknOiBbXG4gICAgJ3BvZXRyeSBydW4gaXNvcnQgLS1wcm9maWxlIGJsYWNrIC0tZmlsdGVyLWZpbGVzJyxcbiAgICAncG9ldHJ5IHJ1biBibGFjaycsXG4gICAgJ3BvZXRyeSBydW4gZmxha2U4J1xuICBdLGApO1xuICB9XG5cbiAgY29uc3QgbmV3Q29udGVudCA9IGBjb25zdCBmcyA9IHJlcXVpcmUoJ2ZzJyk7XG5jb25zdCBwYXRoID0gcmVxdWlyZSgncGF0aCcpO1xuJHtjb25maWcuZG9lc0NvbnRhaW5KYXZhU2NyaXB0IHx8IGNvbmZpZy5kb2VzQ29udGFpblR5cGVTY3JpcHQgPyBcImNvbnN0IG1pY3JvbWF0Y2ggPSByZXF1aXJlKCdtaWNyb21hdGNoJyk7XFxuXCIgOiAnJ31cbm1vZHVsZS5leHBvcnRzID0geyR7bGluZXMuam9pbignJyl9XG59O1xuYDtcblxuICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnMucHJvbWlzZXMucm0ocGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnLmxpbnRzdGFnZWRyYy5qcycpLCB7IGZvcmNlOiB0cnVlIH0pKTtcbiAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzLnByb21pc2VzLnJtKHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJy5saW50c3RhZ2VkcmMuanNvbicpLCB7IGZvcmNlOiB0cnVlIH0pKTtcbiAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzVXRpbC5nZW5lcmF0ZUZpbGUoZmlsZVBhdGgsIG5ld0NvbnRlbnQpKTtcbn1cblxuZnVuY3Rpb24gZ2V0RXNsaW50S2V5KGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IHN0cmluZyB7XG4gIGNvbnN0IGRpcnMgPSBnZXRTcmNEaXJzKGNvbmZpZykubWFwKChkaXIpID0+IGAke2Rpcn0vKiovYCk7XG4gIHJldHVybiBgeywke2RpcnMuam9pbignLCcpfX0qLnske2V4dGVuc2lvbnMuZXNsaW50LmpvaW4oJywnKX19YDtcbn1cblxuZnVuY3Rpb24gZ2V0RXNsaW50RmlsdGVyRm9yUHJldHRpZXIoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogc3RyaW5nIHtcbiAgcmV0dXJuIGNvbmZpZy5kb2VzQ29udGFpbkphdmFTY3JpcHQgfHwgY29uZmlnLmRvZXNDb250YWluVHlwZVNjcmlwdFxuICAgID8gYFxcblxuICAgIGZpbHRlcmVkRmlsZXMgPSBmaWx0ZXJlZEZpbGVzLm1hcCgoZmlsZSkgPT4gcGF0aC5yZWxhdGl2ZSgnJywgZmlsZSkpO1xuICAgIGZpbHRlcmVkRmlsZXMgPSBtaWNyb21hdGNoLm5vdChmaWx0ZXJlZEZpbGVzLCAnJHtnZXRFc2xpbnRLZXkoY29uZmlnKX0nKTtcbiAgICBmaWx0ZXJlZEZpbGVzID0gZmlsdGVyZWRGaWxlcy5tYXAoKGZpbGUpID0+IHBhdGgucmVzb2x2ZShmaWxlKSk7YFxuICAgIDogJyc7XG59XG4iLCJpbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBmc1V0aWwgfSBmcm9tICcuLi91dGlscy9mc1V0aWwuanMnO1xuaW1wb3J0IHsgaWdub3JlRmlsZVV0aWwgfSBmcm9tICcuLi91dGlscy9pZ25vcmVGaWxlVXRpbC5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcblxuY29uc3QgY29tbW9uQ29udGVudCA9IGBcbjNyZC1wYXJ0eS9cbmFuZHJvaWQvXG5pb3MvXG5uby1mb3JtYXQvXG50ZXN0LWZpeHR1cmVzL1xudGVzdC9maXh0dXJlcy9cbiouZC50c1xuKi5taW4uanNcbi55YXJuL1xuLnBucC5qc1xuYDtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlUHJldHRpZXJpZ25vcmUoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZ2VuZXJhdGVQcmV0dGllcmlnbm9yZScsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJy5wcmV0dGllcmlnbm9yZScpO1xuICAgIGNvbnN0IGNvbnRlbnQgPSAoYXdhaXQgZnNVdGlsLnJlYWRGaWxlSWdub3JpbmdFcnJvcihmaWxlUGF0aCkpID8/ICcnO1xuICAgIGNvbnN0IGhlYWRVc2VyQ29udGVudCA9IGlnbm9yZUZpbGVVdGlsLmdldEhlYWRVc2VyQ29udGVudChjb250ZW50KTtcbiAgICBjb25zdCB0YWlsVXNlckNvbnRlbnQgPSBpZ25vcmVGaWxlVXRpbC5nZXRUYWlsVXNlckNvbnRlbnQoY29udGVudCk7XG5cbiAgICBjb25zdCBnaXRpZ25vcmVGaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJy5naXRpZ25vcmUnKTtcbiAgICBjb25zdCBnaXRpZ25vcmVDb250ZW50ID0gKGF3YWl0IGlnbm9yZUZpbGVVdGlsLnJlYWRHaXRpZ25vcmVXaXRob3V0U2VwYXJhdG9ycyhnaXRpZ25vcmVGaWxlUGF0aCkpIHx8ICcnO1xuXG4gICAgbGV0IGFkZGl0aW9uYWxDb250ZW50ID0gJyc7XG4gICAgaWYgKGNvbmZpZy5kb2VzQ29udGFpblB1YnNwZWNZYW1sKSB7XG4gICAgICBhZGRpdGlvbmFsQ29udGVudCA9IGBcbmFuZHJvaWQvYXBwL1xuaW9zL1J1bm5lci9Bc3NldHMueGNhc3NldHMvXG5wdWJzcGVjLnlhbWxcbmA7XG4gICAgfVxuXG4gICAgY29uc3QgbmV3Q29udGVudCA9IGhlYWRVc2VyQ29udGVudCArIGNvbW1vbkNvbnRlbnQgKyBhZGRpdGlvbmFsQ29udGVudCArIGdpdGlnbm9yZUNvbnRlbnQgKyB0YWlsVXNlckNvbnRlbnQ7XG4gICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzVXRpbC5nZW5lcmF0ZUZpbGUoZmlsZVBhdGgsIG5ld0NvbnRlbnQpKTtcbiAgfSk7XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgbWVyZ2UgZnJvbSAnZGVlcG1lcmdlJztcbmltcG9ydCBjbG9uZURlZXAgZnJvbSAnbG9kYXNoLmNsb25lZGVlcCc7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGZzVXRpbCB9IGZyb20gJy4uL3V0aWxzL2ZzVXRpbC5qcyc7XG5pbXBvcnQgeyBvdmVyd3JpdGVNZXJnZSB9IGZyb20gJy4uL3V0aWxzL21lcmdlVXRpbC5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcblxuY29uc3QganNvbk9iaiA9IHtcbiAgdmVudlBhdGg6ICcuJyxcbiAgdmVudjogJy52ZW52Jyxcbn07XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZW5lcmF0ZVB5cmlnaHRDb25maWdKc29uKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2dlbmVyYXRlUHlyaWdodENvbmZpZ0pzb24nLCBhc3luYyAoKSA9PiB7XG4gICAgbGV0IG5ld1NldHRpbmdzOiBvYmplY3QgPSBjbG9uZURlZXAoanNvbk9iaik7XG4gICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICdweXJpZ2h0Y29uZmlnLmpzb24nKTtcbiAgICB0cnkge1xuICAgICAgY29uc3Qgb2xkQ29udGVudCA9IGF3YWl0IGZzLnByb21pc2VzLnJlYWRGaWxlKGZpbGVQYXRoLCAndXRmOCcpO1xuICAgICAgY29uc3Qgb2xkU2V0dGluZ3MgPSBKU09OLnBhcnNlKG9sZENvbnRlbnQpIGFzIG9iamVjdDtcbiAgICAgIG5ld1NldHRpbmdzID0gbWVyZ2UuYWxsKFtuZXdTZXR0aW5ncywgb2xkU2V0dGluZ3MsIG5ld1NldHRpbmdzXSwgeyBhcnJheU1lcmdlOiBvdmVyd3JpdGVNZXJnZSB9KTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIGRvIG5vdGhpbmdcbiAgICB9XG4gICAgY29uc3QgbmV3Q29udGVudCA9IEpTT04uc3RyaW5naWZ5KG5ld1NldHRpbmdzKTtcbiAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnNVdGlsLmdlbmVyYXRlRmlsZShmaWxlUGF0aCwgbmV3Q29udGVudCkpO1xuICB9KTtcbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGZzVXRpbCB9IGZyb20gJy4uL3V0aWxzL2ZzVXRpbC5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcblxuY29uc3Qgc2VtYW50aWNSZWxlYXNlQmFkZ2UgPVxuICAnWyFbc2VtYW50aWMtcmVsZWFzZV0oaHR0cHM6Ly9pbWcuc2hpZWxkcy5pby9iYWRnZS8lMjAlMjAlRjAlOUYlOTMlQTYlRjAlOUYlOUElODAtc2VtYW50aWMtLXJlbGVhc2UtZTEwMDc5LnN2ZyldKGh0dHBzOi8vZ2l0aHViLmNvbS9zZW1hbnRpYy1yZWxlYXNlL3NlbWFudGljLXJlbGVhc2UpJztcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlUmVhZG1lKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2dlbmVyYXRlUmVhZG1lJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnUkVBRE1FLm1kJyk7XG4gICAgbGV0IG5ld0NvbnRlbnQgPSBhd2FpdCBmcy5wcm9taXNlcy5yZWFkRmlsZShmaWxlUGF0aCwgJ3V0ZjgnKTtcblxuICAgIGlmIChmcy5leGlzdHNTeW5jKHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJy5yZWxlYXNlcmMuanNvbicpKSkge1xuICAgICAgbmV3Q29udGVudCA9IGluc2VydEJhZGdlKG5ld0NvbnRlbnQsIHNlbWFudGljUmVsZWFzZUJhZGdlKTtcbiAgICB9XG5cbiAgICBjb25zdCByZXBvc2l0b3J5ID0gY29uZmlnLnJlcG9zaXRvcnk/LnNsaWNlKGNvbmZpZy5yZXBvc2l0b3J5LmluZGV4T2YoJzonKSArIDEpO1xuICAgIGNvbnN0IGZpbGVOYW1lcyA9IGZzLnJlYWRkaXJTeW5jKGAke2NvbmZpZy5kaXJQYXRofS8uZ2l0aHViL3dvcmtmbG93c2ApO1xuICAgIGZvciAoY29uc3QgZmlsZU5hbWUgb2YgZmlsZU5hbWVzKSB7XG4gICAgICBpZiAoIWZpbGVOYW1lLnN0YXJ0c1dpdGgoJ3Rlc3QnKSAmJiAhZmlsZU5hbWUuc3RhcnRzV2l0aCgnZGVwbG95JykpIGNvbnRpbnVlO1xuXG4gICAgICBsZXQgYmFkZ2VOYW1lID0gZmlsZU5hbWU7XG4gICAgICBiYWRnZU5hbWUgPSAoYmFkZ2VOYW1lWzBdIHx8ICcnKS50b1VwcGVyQ2FzZSgpICsgYmFkZ2VOYW1lLnNsaWNlKDEsIGJhZGdlTmFtZS5pbmRleE9mKCcuJykpO1xuICAgICAgYmFkZ2VOYW1lID0gYmFkZ2VOYW1lLnJlcGxhY2UoJy0nLCAnICcpO1xuICAgICAgY29uc3QgYmFkZ2UgPSBgWyFbJHtiYWRnZU5hbWV9XShodHRwczovL2dpdGh1Yi5jb20vJHtyZXBvc2l0b3J5fS9hY3Rpb25zL3dvcmtmbG93cy8ke2ZpbGVOYW1lfS9iYWRnZS5zdmcpXShodHRwczovL2dpdGh1Yi5jb20vJHtyZXBvc2l0b3J5fS9hY3Rpb25zL3dvcmtmbG93cy8ke2ZpbGVOYW1lfSlgO1xuICAgICAgaWYgKGZzLmV4aXN0c1N5bmMocGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCBgLmdpdGh1Yi93b3JrZmxvd3MvJHtmaWxlTmFtZX1gKSkpIHtcbiAgICAgICAgbmV3Q29udGVudCA9IGluc2VydEJhZGdlKG5ld0NvbnRlbnQsIGJhZGdlKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnNVdGlsLmdlbmVyYXRlRmlsZShmaWxlUGF0aCwgbmV3Q29udGVudCkpO1xuICB9KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGluc2VydEJhZGdlKHJlYWRtZTogc3RyaW5nLCBiYWRnZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgLy8g5pei44GrYmFkZ2XjgYzjgYLjgovloLTlkIjjga/liYrpmaRcbiAgcmVhZG1lID0gcmVhZG1lLnJlcGxhY2UoYmFkZ2UsICcnKS5yZXBsYWNlQWxsKC9cXG5cXG5cXG4rL2csICdcXG5cXG4nKTtcblxuICBmb3IgKGxldCBpID0gMDsgaSA8IHJlYWRtZS5sZW5ndGg7IGkrKykge1xuICAgIGlmIChyZWFkbWVbaSAtIDFdID09PSAnXFxuJyAmJiByZWFkbWVbaV0gPT09ICdcXG4nKSB7XG4gICAgICBjb25zdCBiZWZvcmUgPSByZWFkbWUuc2xpY2UoMCwgaSArIDEpO1xuICAgICAgbGV0IGFmdGVyID0gcmVhZG1lLnNsaWNlKGkgKyAxKTtcbiAgICAgIGlmICghYWZ0ZXIuc3RhcnRzV2l0aCgnWycpICYmICFhZnRlci5zdGFydHNXaXRoKCchJykpIHtcbiAgICAgICAgYWZ0ZXIgPSBgXFxuJHthZnRlcn1gO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGAke2JlZm9yZX0ke2JhZGdlfVxcbiR7YWZ0ZXJ9YDtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGAke3JlYWRtZX1cXG4ke2JhZGdlfVxcbmA7XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgbWVyZ2UgZnJvbSAnZGVlcG1lcmdlJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZnNVdGlsIH0gZnJvbSAnLi4vdXRpbHMvZnNVdGlsLmpzJztcbmltcG9ydCB7IG92ZXJ3cml0ZU1lcmdlIH0gZnJvbSAnLi4vdXRpbHMvbWVyZ2VVdGlsLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVSZWxlYXNlcmMocm9vdENvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2dlbmVyYXRlUmVsZWFzZXJjJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKHJvb3RDb25maWcuZGlyUGF0aCwgJy5yZWxlYXNlcmMuanNvbicpO1xuICAgIGlmICghZnMuZXhpc3RzU3luYyhmaWxlUGF0aCkpIHJldHVybjtcblxuICAgIGNvbnN0IHNldHRpbmdzID0gSlNPTi5wYXJzZShhd2FpdCBmcy5wcm9taXNlcy5yZWFkRmlsZShmaWxlUGF0aCwgJ3V0ZjgnKSkgYXMge1xuICAgICAgcGx1Z2lucz86IChzdHJpbmcgfCBbc3RyaW5nLCB1bmtub3duXSlbXTtcbiAgICB9O1xuICAgIGNvbnN0IHBsdWdpbnMgPSBzZXR0aW5ncy5wbHVnaW5zID8/IFtdO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcGx1Z2lucy5sZW5ndGg7IGkrKykge1xuICAgICAgY29uc3QgcGx1Z2luID0gQXJyYXkuaXNBcnJheShwbHVnaW5zW2ldKSA/IHBsdWdpbnNbaV0/LlswXSA6IHBsdWdpbnNbaV07XG4gICAgICBjb25zdCBvbGRDb25maWcgPSAoQXJyYXkuaXNBcnJheShwbHVnaW5zW2ldKSAmJiBwbHVnaW5zW2ldPy5bMV0pIHx8IHt9O1xuICAgICAgaWYgKHBsdWdpbiA9PT0gJ0BzZW1hbnRpYy1yZWxlYXNlL2NvbW1pdC1hbmFseXplcicpIHtcbiAgICAgICAgcGx1Z2luc1tpXSA9IFtcbiAgICAgICAgICAnQHNlbWFudGljLXJlbGVhc2UvY29tbWl0LWFuYWx5emVyJyxcbiAgICAgICAgICBtZXJnZS5hbGwoXG4gICAgICAgICAgICBbXG4gICAgICAgICAgICAgIG9sZENvbmZpZyxcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHByZXNldDogJ2NvbnZlbnRpb25hbGNvbW1pdHMnLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIHsgYXJyYXlNZXJnZTogb3ZlcndyaXRlTWVyZ2UgfVxuICAgICAgICAgICksXG4gICAgICAgIF07XG4gICAgICB9IGVsc2UgaWYgKHBsdWdpbiA9PT0gJ0BzZW1hbnRpYy1yZWxlYXNlL2dpdGh1YicpIHtcbiAgICAgICAgLy8gUmVtb3ZlIGRlcHJlY2F0ZWQgc3VjY2Vzc0NvbW1lbnQgYW5kIGZhaWxDb21tZW50IHByb3BlcnRpZXMgZnJvbSBvbGRDb25maWdcbiAgICAgICAgY29uc3QgeyBmYWlsQ29tbWVudDogXzEsIHN1Y2Nlc3NDb21tZW50OiBfMiwgLi4uY2xlYW5PbGRDb25maWcgfSA9IG9sZENvbmZpZyBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgICAgICAgcGx1Z2luc1tpXSA9IFtcbiAgICAgICAgICAnQHNlbWFudGljLXJlbGVhc2UvZ2l0aHViJyxcbiAgICAgICAgICBtZXJnZS5hbGwoXG4gICAgICAgICAgICBbXG4gICAgICAgICAgICAgIGNsZWFuT2xkQ29uZmlnLFxuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgLy8gY2YuIGh0dHBzOi8vZ2l0aHViLmNvbS9zZW1hbnRpYy1yZWxlYXNlL3NlbWFudGljLXJlbGVhc2UvaXNzdWVzLzIyMDQjaXNzdWVjb21tZW50LTE1MDg0MTc3MDRcbiAgICAgICAgICAgICAgICBzdWNjZXNzQ29tbWVudENvbmRpdGlvbjogZmFsc2UsXG4gICAgICAgICAgICAgICAgZmFpbENvbW1lbnRDb25kaXRpb246IGZhbHNlLFxuICAgICAgICAgICAgICAgIGxhYmVsczogWydyOiBzZW1hbnRpYy1yZWxlYXNlJ10sXG4gICAgICAgICAgICAgICAgcmVsZWFzZWRMYWJlbHM6IFsncmVsZWFzZWQgOmJvb2ttYXJrOiddLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIHsgYXJyYXlNZXJnZTogb3ZlcndyaXRlTWVyZ2UgfVxuICAgICAgICAgICksXG4gICAgICAgIF07XG4gICAgICB9XG4gICAgfVxuICAgIGNvbnN0IG5ld0NvbnRlbnQgPSBKU09OLnN0cmluZ2lmeShzZXR0aW5ncyk7XG4gICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzVXRpbC5nZW5lcmF0ZUZpbGUoZmlsZVBhdGgsIG5ld0NvbnRlbnQpKTtcbiAgfSk7XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgbWVyZ2UgZnJvbSAnZGVlcG1lcmdlJztcbmltcG9ydCBjbG9uZURlZXAgZnJvbSAnbG9kYXNoLmNsb25lZGVlcCc7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGZzVXRpbCB9IGZyb20gJy4uL3V0aWxzL2ZzVXRpbC5qcyc7XG5pbXBvcnQgeyBvdmVyd3JpdGVNZXJnZSB9IGZyb20gJy4uL3V0aWxzL21lcmdlVXRpbC5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcblxuY29uc3QganNvbk9iaiA9IHtcbiAgJHNjaGVtYTogJ2h0dHBzOi8vZG9jcy5yZW5vdmF0ZWJvdC5jb20vcmVub3ZhdGUtc2NoZW1hLmpzb24nLFxuICBleHRlbmRzOiBbJ2dpdGh1Yj5XaWxsQm9vc3Rlci93aWxsYm9vc3Rlci1jb25maWdzOnJlbm92YXRlLmpzb241J10sXG59O1xuXG50eXBlIFNldHRpbmdzID0gdHlwZW9mIGpzb25PYmogJiB7IHBhY2thZ2VSdWxlcz86IHsgbWF0Y2hQYWNrYWdlTmFtZXM6IHN0cmluZ1tdOyBlbmFibGVkPzogYm9vbGVhbiB9W10gfTtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlUmVub3ZhdGVKc29uKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2dlbmVyYXRlUmVub3ZhdGVKc29uJywgYXN5bmMgKCkgPT4ge1xuICAgIGxldCBuZXdTZXR0aW5ncyA9IGNsb25lRGVlcChqc29uT2JqKSBhcyBTZXR0aW5ncztcbiAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJ3Jlbm92YXRlLmpzb24nKTtcbiAgICBpZiAoZnMuZXhpc3RzU3luYyhgJHtmaWxlUGF0aH01YCkpIHtcbiAgICAgIC8vIFNpbmNlIGl0IGlzIGRpZmZpY3VsdCBmb3IgcGFyc2luZyByZW5vdmF0ZS5qc29uNSwgd2UgZG8gbm90aGluZ1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0cnkge1xuICAgICAgY29uc3Qgb2xkQ29udGVudCA9IGF3YWl0IGZzLnByb21pc2VzLnJlYWRGaWxlKGZpbGVQYXRoLCAndXRmOCcpO1xuICAgICAgY29uc3Qgb2xkU2V0dGluZ3MgPSBKU09OLnBhcnNlKG9sZENvbnRlbnQpIGFzIFNldHRpbmdzO1xuICAgICAgbmV3U2V0dGluZ3MgPSBtZXJnZS5hbGwoW25ld1NldHRpbmdzLCBvbGRTZXR0aW5ncywgbmV3U2V0dGluZ3NdLCB7XG4gICAgICAgIGFycmF5TWVyZ2U6IG92ZXJ3cml0ZU1lcmdlLFxuICAgICAgfSkgYXMgU2V0dGluZ3M7XG4gICAgICBuZXdTZXR0aW5ncy5leHRlbmRzID0gbmV3U2V0dGluZ3MuZXh0ZW5kcy5maWx0ZXIoKGl0ZW06IHN0cmluZykgPT4gaXRlbSAhPT0gJ0B3aWxsYm9vc3RlcicpO1xuICAgIH0gY2F0Y2gge1xuICAgICAgLy8gZG8gbm90aGluZ1xuICAgIH1cblxuICAgIC8vIERvbid0IHVwZ3JhZGUgTmV4dC5qcyBhdXRvbWF0aWNhbGx5XG4gICAgaWYgKGNvbmZpZy5kZXBlbmRpbmcuYmxpdHopIHtcbiAgICAgIG5ld1NldHRpbmdzLnBhY2thZ2VSdWxlcyA/Pz0gW107XG4gICAgICBpZiAoXG4gICAgICAgICFuZXdTZXR0aW5ncy5wYWNrYWdlUnVsZXMuc29tZSgocnVsZTogeyBtYXRjaFBhY2thZ2VOYW1lcz86IHN0cmluZ1tdIH0pID0+XG4gICAgICAgICAgcnVsZS5tYXRjaFBhY2thZ2VOYW1lcz8uaW5jbHVkZXMoJ25leHQnKVxuICAgICAgICApXG4gICAgICApIHtcbiAgICAgICAgbmV3U2V0dGluZ3MucGFja2FnZVJ1bGVzLnB1c2goeyBtYXRjaFBhY2thZ2VOYW1lczogWyduZXh0J10sIGVuYWJsZWQ6IGZhbHNlIH0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiBmcy5wcm9taXNlcy5ybShwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICcuZGVwZW5kYWJvdCcpLCB7IGZvcmNlOiB0cnVlIH0pKTtcbiAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnMucHJvbWlzZXMucm0ocGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnLnJlbm92YXRlcmMuanNvbicpLCB7IGZvcmNlOiB0cnVlIH0pKTtcbiAgICBjb25zdCBuZXdDb250ZW50ID0gSlNPTi5zdHJpbmdpZnkobmV3U2V0dGluZ3MpO1xuICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiBmc1V0aWwuZ2VuZXJhdGVGaWxlKGZpbGVQYXRoLCBuZXdDb250ZW50KSk7XG4gIH0pO1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IG1lcmdlIGZyb20gJ2RlZXBtZXJnZSc7XG5pbXBvcnQgY2xvbmVEZWVwIGZyb20gJ2xvZGFzaC5jbG9uZWRlZXAnO1xuaW1wb3J0IHR5cGUgeyBUc0NvbmZpZ0pzb24gfSBmcm9tICd0eXBlLWZlc3QnO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBmc1V0aWwgfSBmcm9tICcuLi91dGlscy9mc1V0aWwuanMnO1xuaW1wb3J0IHsgY29tYmluZU1lcmdlIH0gZnJvbSAnLi4vdXRpbHMvbWVyZ2VVdGlsLmpzJztcbmltcG9ydCB7IHNvcnRLZXlzIH0gZnJvbSAnLi4vdXRpbHMvb2JqZWN0VXRpbC5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcblxuY29uc3Qgcm9vdEpzb25PYmogPSB7XG4gIGNvbXBpbGVyT3B0aW9uczoge1xuICAgIHRhcmdldDogJ0VTMjAyMicsIC8vIGJlY2F1c2UgZGVjb3JhdG9ycyBzaG91bGQgYmUgdHJhbnNwaWxlZCB0byBFUzIwMjIgb24gTm9kZS5qc1xuICAgIG1vZHVsZTogJ0VTTmV4dCcsXG4gICAgbW9kdWxlUmVzb2x1dGlvbjogJ05vZGUnLFxuICAgIGpzeDogJ3JlYWN0LWpzeCcsXG4gICAgYWx3YXlzU3RyaWN0OiB0cnVlLFxuICAgIHN0cmljdDogdHJ1ZSxcbiAgICBub1VuY2hlY2tlZEluZGV4ZWRBY2Nlc3M6IHRydWUsIC8vIGZvciBAdHlwZXNjcmlwdC1lc2xpbnQvcHJlZmVyLW51bGxpc2gtY29hbGVzY2luZ1xuICAgIHNraXBMaWJDaGVjazogdHJ1ZSwgLy8gYmVjYXVzZSBsaWJyYXJpZXMgbWF5IGhhdmUgYnJva2VuIHR5cGVzXG4gICAgYWxsb3dTeW50aGV0aWNEZWZhdWx0SW1wb3J0czogdHJ1ZSwgLy8gYWxsb3cgYGltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCdgXG4gICAgZXNNb2R1bGVJbnRlcm9wOiB0cnVlLCAvLyBhbGxvdyBkZWZhdWx0IGltcG9ydCBmcm9tIENvbW1vbkpTL0FNRC9VTUQgbW9kdWxlc1xuICAgIHJlc29sdmVKc29uTW9kdWxlOiB0cnVlLCAvLyBhbGxvdyB0byBpbXBvcnQgSlNPTiBmaWxlc1xuICAgIGRlY2xhcmF0aW9uOiB0cnVlLFxuICAgIHNvdXJjZU1hcDogdHJ1ZSxcbiAgICBpbXBvcnRIZWxwZXJzOiBmYWxzZSxcbiAgICBlcmFzYWJsZVN5bnRheE9ubHk6IHRydWUsXG4gICAgb3V0RGlyOiAnZGlzdCcsXG4gICAgdHlwZVJvb3RzOiBbJy4vbm9kZV9tb2R1bGVzL0B0eXBlcycsICcuL0B0eXBlcyddLFxuICB9LFxuICBleGNsdWRlOiBbJ3BhY2thZ2VzLyovdGVzdC9maXh0dXJlcycsICd0ZXN0L2ZpeHR1cmVzJ10sXG4gIGluY2x1ZGU6IFtcbiAgICAncGFja2FnZXMvKi9zY3JpcHRzLyoqLyonLFxuICAgICdwYWNrYWdlcy8qL3NyYy8qKi8qJyxcbiAgICAncGFja2FnZXMvKi90ZXN0LyoqLyonLFxuICAgICdzY3JpcHRzLyoqLyonLFxuICAgICdzcmMvKiovKicsXG4gICAgJ3Rlc3QvKiovKicsXG4gIF0sXG59O1xuXG5jb25zdCBzdWJKc29uT2JqID0ge1xuICBjb21waWxlck9wdGlvbnM6IHtcbiAgICB0YXJnZXQ6ICdFUzIwMjInLCAvLyBiZWNhdXNlIGRlY29yYXRvcnMgc2hvdWxkIGJlIHRyYW5zcGlsZWQgdG8gRVMyMDIyIG9uIE5vZGUuanNcbiAgICBtb2R1bGU6ICdFU05leHQnLFxuICAgIG1vZHVsZVJlc29sdXRpb246ICdOb2RlJyxcbiAgICBqc3g6ICdyZWFjdC1qc3gnLFxuICAgIGFsd2F5c1N0cmljdDogdHJ1ZSxcbiAgICBzdHJpY3Q6IHRydWUsXG4gICAgbm9VbmNoZWNrZWRJbmRleGVkQWNjZXNzOiB0cnVlLCAvLyBmb3IgQHR5cGVzY3JpcHQtZXNsaW50L3ByZWZlci1udWxsaXNoLWNvYWxlc2NpbmdcbiAgICBza2lwTGliQ2hlY2s6IHRydWUsIC8vIGJlY2F1c2UgbGlicmFyaWVzIG1heSBoYXZlIGJyb2tlbiB0eXBlc1xuICAgIGFsbG93U3ludGhldGljRGVmYXVsdEltcG9ydHM6IHRydWUsIC8vIGFsbG93IGBpbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnYFxuICAgIGVzTW9kdWxlSW50ZXJvcDogdHJ1ZSwgLy8gYWxsb3cgZGVmYXVsdCBpbXBvcnQgZnJvbSBDb21tb25KUy9BTUQvVU1EIG1vZHVsZXNcbiAgICByZXNvbHZlSnNvbk1vZHVsZTogdHJ1ZSwgLy8gYWxsb3cgdG8gaW1wb3J0IEpTT04gZmlsZXNcbiAgICBkZWNsYXJhdGlvbjogdHJ1ZSxcbiAgICBzb3VyY2VNYXA6IHRydWUsXG4gICAgaW1wb3J0SGVscGVyczogZmFsc2UsXG4gICAgZXJhc2FibGVTeW50YXhPbmx5OiB0cnVlLFxuICAgIG91dERpcjogJ2Rpc3QnLFxuICAgIHR5cGVSb290czogWycuLi8uLi9ub2RlX21vZHVsZXMvQHR5cGVzJywgJy4uLy4uL0B0eXBlcycsICcuL0B0eXBlcyddLFxuICB9LFxuICBleGNsdWRlOiBbJ3Rlc3QvZml4dHVyZXMnXSxcbiAgaW5jbHVkZTogWydzY3JpcHRzLyoqLyonLCAnc3JjLyoqLyonLCAndGVzdC8qKi8qJ10sXG59O1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVUc2NvbmZpZyhjb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdnZW5lcmF0ZVRzY29uZmlnJywgYXN5bmMgKCkgPT4ge1xuICAgIGlmIChjb25maWcuZGVwZW5kaW5nLmJsaXR6IHx8IGNvbmZpZy5kZXBlbmRpbmcubmV4dCkgcmV0dXJuO1xuXG4gICAgbGV0IG5ld1NldHRpbmdzID0gY2xvbmVEZWVwKGNvbmZpZy5pc1Jvb3QgPyByb290SnNvbk9iaiA6IHN1Ykpzb25PYmopIGFzIFRzQ29uZmlnSnNvbjtcbiAgICBpZiAoIWNvbmZpZy5kb2VzQ29udGFpbkpzeE9yVHN4ICYmICFjb25maWcuZG9lc0NvbnRhaW5Kc3hPclRzeEluUGFja2FnZXMpIHtcbiAgICAgIGRlbGV0ZSBuZXdTZXR0aW5ncy5jb21waWxlck9wdGlvbnM/LmpzeDtcbiAgICB9XG4gICAgaWYgKGNvbmZpZy5pc1Jvb3QgJiYgIWNvbmZpZy5kb2VzQ29udGFpblN1YlBhY2thZ2VKc29ucykge1xuICAgICAgbmV3U2V0dGluZ3MuaW5jbHVkZSA9IG5ld1NldHRpbmdzLmluY2x1ZGU/LmZpbHRlcigoZGlyUGF0aDogc3RyaW5nKSA9PiAhZGlyUGF0aC5zdGFydHNXaXRoKCdwYWNrYWdlcy8qLycpKTtcbiAgICAgIG5ld1NldHRpbmdzLmV4Y2x1ZGUgPSBuZXdTZXR0aW5ncy5leGNsdWRlPy5maWx0ZXIoKGRpclBhdGg6IHN0cmluZykgPT4gIWRpclBhdGguc3RhcnRzV2l0aCgncGFja2FnZXMvKi8nKSk7XG4gICAgfVxuICAgIGlmIChjb25maWcuaXNFc21QYWNrYWdlKSB7XG4gICAgICBuZXdTZXR0aW5ncy5jb21waWxlck9wdGlvbnMgPSB7XG4gICAgICAgIC4uLm5ld1NldHRpbmdzLmNvbXBpbGVyT3B0aW9ucyxcbiAgICAgICAgbW9kdWxlOiAnTm9kZU5leHQnLFxuICAgICAgICBtb2R1bGVSZXNvbHV0aW9uOiAnTm9kZU5leHQnLFxuICAgICAgfTtcbiAgICB9XG5cbiAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJ3RzY29uZmlnLmpzb24nKTtcbiAgICB0cnkge1xuICAgICAgY29uc3QgZXhpc3RpbmdDb250ZW50ID0gYXdhaXQgZnMucHJvbWlzZXMucmVhZEZpbGUoZmlsZVBhdGgsICd1dGY4Jyk7XG4gICAgICBjb25zdCBvbGRTZXR0aW5ncyA9IEpTT04ucGFyc2UoZXhpc3RpbmdDb250ZW50KSBhcyBUc0NvbmZpZ0pzb247XG4gICAgICBpZiAob2xkU2V0dGluZ3MuZXh0ZW5kcyA9PT0gJy4vbm9kZV9tb2R1bGVzL0B3aWxsYm9vc3Rlci90c2NvbmZpZy90c2NvbmZpZy5qc29uJykge1xuICAgICAgICBkZWxldGUgb2xkU2V0dGluZ3MuZXh0ZW5kcztcbiAgICAgIH1cbiAgICAgIC8vIERvbid0IG1vZGlmeSBcInRhcmdldFwiLCBcIm1vZHVsZVwiIGFuZCBcIm1vZHVsZVJlc29sdXRpb25cIi5cbiAgICAgIGRlbGV0ZSBuZXdTZXR0aW5ncy5jb21waWxlck9wdGlvbnM/LnRhcmdldDtcbiAgICAgIGlmICghY29uZmlnLmlzRXNtUGFja2FnZSkge1xuICAgICAgICBkZWxldGUgbmV3U2V0dGluZ3MuY29tcGlsZXJPcHRpb25zPy5tb2R1bGU7XG4gICAgICAgIGRlbGV0ZSBuZXdTZXR0aW5ncy5jb21waWxlck9wdGlvbnM/Lm1vZHVsZVJlc29sdXRpb247XG4gICAgICB9XG4gICAgICBpZiAob2xkU2V0dGluZ3MuY29tcGlsZXJPcHRpb25zPy5qc3gpIHtcbiAgICAgICAgZGVsZXRlIG5ld1NldHRpbmdzLmNvbXBpbGVyT3B0aW9ucz8uanN4O1xuICAgICAgfVxuICAgICAgbmV3U2V0dGluZ3MgPSBtZXJnZS5hbGwoW25ld1NldHRpbmdzLCBvbGRTZXR0aW5ncywgbmV3U2V0dGluZ3NdLCB7IGFycmF5TWVyZ2U6IGNvbWJpbmVNZXJnZSB9KTtcbiAgICAgIG5ld1NldHRpbmdzLmluY2x1ZGUgPSBuZXdTZXR0aW5ncy5pbmNsdWRlPy5maWx0ZXIoXG4gICAgICAgIChkaXJQYXRoOiBzdHJpbmcpID0+XG4gICAgICAgICAgIWRpclBhdGguaW5jbHVkZXMoJ0B0eXBlcycpICYmICFkaXJQYXRoLmluY2x1ZGVzKCdfX3Rlc3RzX18vJykgJiYgIWRpclBhdGguaW5jbHVkZXMoJ3Rlc3RzLycpXG4gICAgICApO1xuICAgIH0gY2F0Y2gge1xuICAgICAgLy8gZG8gbm90aGluZ1xuICAgIH1cbiAgICBzb3J0S2V5cyhuZXdTZXR0aW5ncyk7XG4gICAgbmV3U2V0dGluZ3MuaW5jbHVkZT8uc29ydCgpO1xuICAgIGNvbnN0IG5ld0NvbnRlbnQgPSBKU09OLnN0cmluZ2lmeShuZXdTZXR0aW5ncyk7XG4gICAgLy8gRG9uJ3QgdXNlIG9sZCBkZWNvcmF0b3JcbiAgICBkZWxldGUgbmV3U2V0dGluZ3MuY29tcGlsZXJPcHRpb25zPy5leHBlcmltZW50YWxEZWNvcmF0b3JzO1xuICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiBmc1V0aWwuZ2VuZXJhdGVGaWxlKGZpbGVQYXRoLCBuZXdDb250ZW50KSk7XG4gIH0pO1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IG1lcmdlIGZyb20gJ2RlZXBtZXJnZSc7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGZzVXRpbCB9IGZyb20gJy4uL3V0aWxzL2ZzVXRpbC5qcyc7XG5pbXBvcnQgeyBzb3J0S2V5cyB9IGZyb20gJy4uL3V0aWxzL29iamVjdFV0aWwuanMnO1xuaW1wb3J0IHsgcHJvbWlzZVBvb2wgfSBmcm9tICcuLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5cbmNvbnN0IGV4Y2x1ZGVGaWxlUGF0dGVybnMgPSBbXG4gICcqKi8uZ2l0L29iamVjdHMvKionLFxuICAnKiovLmdpdC9zdWJ0cmVlLWNhY2hlLyoqJyxcbiAgJyoqL25vZGVfbW9kdWxlcy8qKicsXG4gICcqKi90bXAvKionLFxuICAnKiovdGVtcC8qKicsXG4gICcqKi9kaXN0LyoqJyxcbl07XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZW5lcmF0ZVZzY29kZVNldHRpbmdzKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2dlbmVyYXRlVnNjb2RlU2V0dGluZ3MnLCBhc3luYyAoKSA9PiB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnLnZzY29kZScsICdzZXR0aW5ncy5qc29uJyk7XG4gICAgICBjb25zdCBleGlzdGluZ0NvbnRlbnQgPSBhd2FpdCBmcy5wcm9taXNlcy5yZWFkRmlsZShmaWxlUGF0aCwgJ3V0ZjgnKTtcbiAgICAgIGxldCBzZXR0aW5ncyA9IEpTT04ucGFyc2UoZXhpc3RpbmdDb250ZW50KSBhcyBvYmplY3Q7XG4gICAgICBmb3IgKGNvbnN0IGV4Y2x1ZGVGaWxlUGF0dGVybiBvZiBleGNsdWRlRmlsZVBhdHRlcm5zKSB7XG4gICAgICAgIHNldHRpbmdzID0gbWVyZ2UuYWxsKFtzZXR0aW5ncywgZXhjbHVkZVNldHRpbmcoZXhjbHVkZUZpbGVQYXR0ZXJuKV0pO1xuICAgICAgfVxuICAgICAgaWYgKGNvbmZpZy5kb2VzQ29udGFpblBvZXRyeUxvY2spIHtcbiAgICAgICAgc2V0dGluZ3MgPSBtZXJnZS5hbGwoW3NldHRpbmdzLCBleGNsdWRlU2V0dGluZygnKiovLnZlbnYvKionKV0pO1xuICAgICAgfVxuICAgICAgaWYgKGNvbmZpZy5kZXBlbmRpbmcubmV4dCkge1xuICAgICAgICBzZXR0aW5ncyA9IG1lcmdlLmFsbChbc2V0dGluZ3MsIGV4Y2x1ZGVTZXR0aW5nKCcqKi8ubmV4dC8qKicpXSk7XG4gICAgICB9XG4gICAgICAvLyBMTE3jgavjgojjgot2aWJlIGNvZGluZ+OBp+OBr+OAgeiHquWLleODleOCqeODvOODnuODg+ODiOOChOOCs+ODvOODieOCouOCr+OCt+ODp+ODs+OCkueEoeWKueWMluOBmeOCi+OBk+OBqOOBp1xuICAgICAgLy8g55Sf5oiQ44GV44KM44Gf44Kz44O844OJ44Gu5YWD44Gu5b2i5byP44KS57at5oyB44Gn44GN44KLXG4gICAgICBpZiAoJ2VkaXRvci5jb2RlQWN0aW9uc09uU2F2ZScgaW4gc2V0dGluZ3MpIHtcbiAgICAgICAgZGVsZXRlIHNldHRpbmdzWydlZGl0b3IuY29kZUFjdGlvbnNPblNhdmUnXTtcbiAgICAgIH1cbiAgICAgIGlmICgnZWRpdG9yLmZvcm1hdE9uU2F2ZScgaW4gc2V0dGluZ3MpIHtcbiAgICAgICAgZGVsZXRlIHNldHRpbmdzWydlZGl0b3IuZm9ybWF0T25TYXZlJ107XG4gICAgICB9XG4gICAgICBzb3J0S2V5cyhzZXR0aW5ncyBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPik7XG4gICAgICBjb25zdCBuZXdDb250ZW50ID0gSlNPTi5zdHJpbmdpZnkoc2V0dGluZ3MsIHVuZGVmaW5lZCwgMik7XG4gICAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnNVdGlsLmdlbmVyYXRlRmlsZShmaWxlUGF0aCwgbmV3Q29udGVudCkpO1xuICAgIH0gY2F0Y2gge1xuICAgICAgLy8gZG8gbm90aGluZ1xuICAgIH1cbiAgfSk7XG59XG5cbmZ1bmN0aW9uIGV4Y2x1ZGVTZXR0aW5nKGV4Y2x1ZGVGaWxlUGF0dGVybjogc3RyaW5nKTogb2JqZWN0IHtcbiAgcmV0dXJuIHtcbiAgICAnZmlsZXMud2F0Y2hlckV4Y2x1ZGUnOiB7XG4gICAgICBbZXhjbHVkZUZpbGVQYXR0ZXJuXTogdHJ1ZSxcbiAgICB9LFxuICB9O1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHR5cGUgeyBDb25maWd1cmF0aW9uVmFsdWVNYXAgfSBmcm9tICdAeWFybnBrZy9jb3JlJztcbmltcG9ydCB5YW1sIGZyb20gJ2pzLXlhbWwnO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcbmltcG9ydCB7IHNwYXduU3luYywgc3Bhd25TeW5jV2l0aFN0cmluZ1Jlc3VsdCB9IGZyb20gJy4uL3V0aWxzL3NwYXduVXRpbC5qcyc7XG5cbnR5cGUgU2V0dGluZ3MgPSB7XG4gIGRlZmF1bHRTZW12ZXJSYW5nZVByZWZpeDogc3RyaW5nO1xuICBubU1vZGU6IHN0cmluZztcbiAgbm9kZUxpbmtlcjogc3RyaW5nO1xuICBucG1NaW5pbWFsQWdlR2F0ZT86IHN0cmluZztcbiAgbnBtUHJlYXBwcm92ZWRQYWNrYWdlcz86IHN0cmluZ1tdO1xuICBwbHVnaW5zPzogUGx1Z2luW107XG59ICYgUGFydGlhbDxDb25maWd1cmF0aW9uVmFsdWVNYXA+O1xuXG5pbnRlcmZhY2UgUGx1Z2luIHtcbiAgY2hlY2tzdW06IHN0cmluZztcbiAgcGF0aDogc3RyaW5nO1xuICBzcGVjOiBzdHJpbmc7XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZW5lcmF0ZVlhcm5yY1ltbChjb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdnZW5lcmF0ZVlhcm5yY1ltbCcsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCB5YXJucmNZbWxQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnLnlhcm5yYy55bWwnKTtcbiAgICBpZiAoY29uZmlnLmlzQnVuKSB7XG4gICAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnMucHJvbWlzZXMucm0oeWFybnJjWW1sUGF0aCwgeyBmb3JjZTogdHJ1ZSB9KSk7XG4gICAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT5cbiAgICAgICAgZnMucHJvbWlzZXMucm0ocGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnLnlhcm4nKSwgeyBmb3JjZTogdHJ1ZSwgcmVjdXJzaXZlOiB0cnVlIH0pXG4gICAgICApO1xuICAgICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+XG4gICAgICAgIGZzLnByb21pc2VzLnJtKHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJ3lhcm4ubG9jaycpLCB7IGZvcmNlOiB0cnVlLCByZWN1cnNpdmU6IHRydWUgfSlcbiAgICAgICk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgY3VycmVudFZlcnNpb24gPSBzcGF3blN5bmNXaXRoU3RyaW5nUmVzdWx0KCd5YXJuJywgWyctLXZlcnNpb24nXSwgY29uZmlnLmRpclBhdGgpO1xuICAgIGNvbnN0IGxhdGVzdFZlcnNpb24gPSBnZXRMYXRlc3RWZXJzaW9uKCdAeWFybnBrZy9jbGknLCBjb25maWcuZGlyUGF0aCk7XG4gICAgaWYgKGdldE1ham9yTnVtYmVyKGN1cnJlbnRWZXJzaW9uKSA8PSBnZXRNYWpvck51bWJlcihsYXRlc3RWZXJzaW9uKSAmJiBjdXJyZW50VmVyc2lvbiAhPT0gbGF0ZXN0VmVyc2lvbikge1xuICAgICAgc3Bhd25TeW5jKCd5YXJuJywgWydzZXQnLCAndmVyc2lvbicsIGxhdGVzdFZlcnNpb25dLCBjb25maWcuZGlyUGF0aCwgMSk7XG4gICAgfVxuXG4gICAgY29uc3QgcmVsZWFzZXNQYXRoID0gcGF0aC5qb2luKGNvbmZpZy5kaXJQYXRoLCAnLnlhcm4nLCAncmVsZWFzZXMnKTtcbiAgICBhd2FpdCBmcy5wcm9taXNlcy5ta2RpcihyZWxlYXNlc1BhdGgsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICAgIGZvciAoY29uc3QgZmlsZSBvZiBhd2FpdCBmcy5wcm9taXNlcy5yZWFkZGlyKHJlbGVhc2VzUGF0aCkpIHtcbiAgICAgIGlmIChmaWxlLnN0YXJ0c1dpdGgoJ3lhcm4tJykgJiYgIWZpbGUuc3RhcnRzV2l0aChgeWFybi0ke2xhdGVzdFZlcnNpb259LmApKSB7XG4gICAgICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiBmcy5wcm9taXNlcy5ybShwYXRoLmpvaW4ocmVsZWFzZXNQYXRoLCBmaWxlKSkpO1xuICAgICAgICBjb25zb2xlLmxvZygnUmVtb3ZlZCcsIHBhdGguam9pbihyZWxlYXNlc1BhdGgsIGZpbGUpKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCB5YXJucmNQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnLnlhcm5yYycpO1xuICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiBmcy5wcm9taXNlcy5ybSh5YXJucmNQYXRoLCB7IGZvcmNlOiB0cnVlIH0pKTtcblxuICAgIGNvbnN0IHNldHRpbmdzID0geWFtbC5sb2FkKGF3YWl0IGZzLnByb21pc2VzLnJlYWRGaWxlKHlhcm5yY1ltbFBhdGgsICd1dGY4JykpIGFzIFNldHRpbmdzO1xuICAgIHNldHRpbmdzLmRlZmF1bHRTZW12ZXJSYW5nZVByZWZpeCA9ICcnO1xuICAgIHNldHRpbmdzLm5vZGVMaW5rZXIgPSAnbm9kZS1tb2R1bGVzJztcbiAgICBzZXR0aW5ncy5ubU1vZGUgPSAnaGFyZGxpbmtzLWdsb2JhbCc7XG4gICAgc2V0dGluZ3MubnBtTWluaW1hbEFnZUdhdGUgPSAnNWQnO1xuICAgIHNldHRpbmdzLm5wbVByZWFwcHJvdmVkUGFja2FnZXMgPSBbXG4gICAgICAnQHdpbGxib29zdGVyL2JhYmVsLWNvbmZpZ3MnLFxuICAgICAgJ0B3aWxsYm9vc3Rlci9iaW9tZS1jb25maWcnLFxuICAgICAgJ0B3aWxsYm9vc3Rlci9lc2xpbnQtY29uZmlnLWpzJyxcbiAgICAgICdAd2lsbGJvb3N0ZXIvZXNsaW50LWNvbmZpZy1qcy1yZWFjdCcsXG4gICAgICAnQHdpbGxib29zdGVyL2VzbGludC1jb25maWctbmV4dCcsXG4gICAgICAnQHdpbGxib29zdGVyL2VzbGludC1jb25maWctdHMnLFxuICAgICAgJ0B3aWxsYm9vc3Rlci9lc2xpbnQtY29uZmlnLXRzLXJlYWN0JyxcbiAgICAgICdAd2lsbGJvb3N0ZXIvcHJldHRpZXItY29uZmlnJyxcbiAgICAgICdAd2lsbGJvb3N0ZXIvd2InLFxuICAgIF07XG4gICAgZGVsZXRlIHNldHRpbmdzLmNvbXByZXNzaW9uTGV2ZWw7XG4gICAgaWYgKHNldHRpbmdzLmluamVjdEVudmlyb25tZW50RmlsZXM/Lmxlbmd0aCA9PT0gMCkge1xuICAgICAgZGVsZXRlIHNldHRpbmdzLmluamVjdEVudmlyb25tZW50RmlsZXM7XG4gICAgfVxuICAgIC8vIGNmLiBodHRwczovL2dpdGh1Yi5jb20veWFybnBrZy9iZXJyeS9wdWxsLzQ2OThcbiAgICBzZXR0aW5ncy5lbmFibGVHbG9iYWxDYWNoZSA9IHRydWU7XG4gICAgY29uc3Qgb3JpZ2luYWxMZW5ndGggPSBzZXR0aW5ncy5wbHVnaW5zPy5sZW5ndGggPz8gMDtcbiAgICBzZXR0aW5ncy5wbHVnaW5zID0gc2V0dGluZ3MucGx1Z2lucz8uZmlsdGVyKChwKSA9PiBwLnBhdGggIT09ICcueWFybi9wbHVnaW5zL3VuZGVmaW5lZC5janMnKSA/PyBbXTtcbiAgICBpZiAoc2V0dGluZ3MucGx1Z2lucy5sZW5ndGggIT09IG9yaWdpbmFsTGVuZ3RoKSB7XG4gICAgICBjb25zdCBwbHVnaW5QYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnLnlhcm5yYycsICd1bmRlZmluZWQuY2pzJyk7XG4gICAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnMucHJvbWlzZXMucm0ocGx1Z2luUGF0aCwgeyBmb3JjZTogdHJ1ZSB9KSk7XG4gICAgfVxuICAgIGlmIChzZXR0aW5ncy5wbHVnaW5zLmxlbmd0aCA9PT0gMCkge1xuICAgICAgZGVsZXRlIHNldHRpbmdzLnBsdWdpbnM7XG4gICAgfVxuICAgIGF3YWl0IGZzLnByb21pc2VzLndyaXRlRmlsZSh5YXJucmNZbWxQYXRoLCB5YW1sLmR1bXAoc2V0dGluZ3MsIHsgbGluZVdpZHRoOiAtMSB9KSk7XG5cbiAgICBzcGF3blN5bmMoJ3lhcm4nLCBbJ2RseCcsICd5YXJuLXBsdWdpbi1hdXRvLWluc3RhbGwnXSwgY29uZmlnLmRpclBhdGgpO1xuICB9KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldExhdGVzdFZlcnNpb24ocGFja2FnZU5hbWU6IHN0cmluZywgZGlyUGF0aDogc3RyaW5nKTogc3RyaW5nIHtcbiAgY29uc3QgdmVyc2lvbnNKc29uID0gc3Bhd25TeW5jV2l0aFN0cmluZ1Jlc3VsdCgnbnBtJywgWydzaG93JywgcGFja2FnZU5hbWUsICd2ZXJzaW9ucycsICctLWpzb24nXSwgZGlyUGF0aCk7XG4gIGNvbnN0IHZlcnNpb25zID0gSlNPTi5wYXJzZSh2ZXJzaW9uc0pzb24pIGFzIHN0cmluZ1tdO1xuICByZXR1cm4gdmVyc2lvbnMuYXQoLTEpIGFzIHN0cmluZztcbn1cbmZ1bmN0aW9uIGdldE1ham9yTnVtYmVyKHZlcnNpb246IHN0cmluZyk6IG51bWJlciB7XG4gIGNvbnN0IFttYWpvcl0gPSB2ZXJzaW9uLnNwbGl0KCcuJyk7XG4gIHJldHVybiBOdW1iZXIobWFqb3IpO1xufVxuIiwiaW1wb3J0IHR5cGUgeyBPY3Rva2l0IH0gZnJvbSAnQG9jdG9raXQvY29yZSc7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGdldE9jdG9raXQsIGdpdEh1YlV0aWwsIGhhc0dpdEh1YlRva2VuIH0gZnJvbSAnLi4vdXRpbHMvZ2l0aHViVXRpbC5qcyc7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBzZXR1cExhYmVscyhjb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdzZXR1cExhYmVscycsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBbb3duZXIsIHJlcG9dID0gZ2l0SHViVXRpbC5nZXRPcmdBbmROYW1lKGNvbmZpZy5yZXBvc2l0b3J5ID8/ICcnKTtcbiAgICBpZiAoIW93bmVyIHx8ICFyZXBvKSByZXR1cm47XG4gICAgaWYgKG93bmVyICE9PSAnV2lsbEJvb3N0ZXInICYmIG93bmVyICE9PSAnV2lsbEJvb3N0ZXJMYWInKSByZXR1cm47XG4gICAgaWYgKCFoYXNHaXRIdWJUb2tlbihvd25lcikpIHJldHVybjtcblxuICAgIGNvbnN0IG9jdG9raXQgPSBnZXRPY3Rva2l0KG93bmVyKTtcblxuICAgIHRyeSB7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAnZDE6IHgtZWFzeSA6aGVkZ2Vob2c6JywgJ0VERTlGRScpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ2QyOiBlYXN5IDpyYWJiaXQyOicsICdEREQ2RkUnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdkMzogbWVkaXVtIDpveDonLCAnQzRCNUZEJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAnZDQ6IGhhcmQgOnNxdWlkOicsICdBNzhCRkEnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdkNTogeC1oYXJkIDp3aGFsZTI6JywgJzhCNUNGNicpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ3AxOiBjcml0aWNhbCA6ZmlyZTo6ZmlyZTo6ZmlyZTonLCAnRUY0NDQ0Jyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAncDI6IHVyZ2VudCA6ZmlyZTo6ZmlyZTonLCAnRjg3MTcxJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAncDM6IGltcG9ydGFudCA6ZmlyZTonLCAnRkNBNUE1Jyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAncDQ6IG5pY2UgdG8gaGF2ZSA6ZHJvcGxldDonLCAnRkVDQUNBJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAncjogYmxpdHonLCAnNTMwMGJjJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAncjogZmlyZWJhc2UnLCAnZmZjYTI4Jyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAncjogcHJpc21hJywgJzBjMzQ0YicpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ3I6IHJlYWN0JywgJzYxZGFmYicpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ3I6IHN2ZWx0ZScsICdmZjNlMDAnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdyOiBzZW1hbnRpYy1yZWxlYXNlJywgJzQ5NDk0OScpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ3JlYWR5IDpyb2NrZXQ6JywgJzIyQzU1RScpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ3JldmlldyByZXF1ZXN0ZWQgOm1hZzonLCAnRkJDQTA0Jyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAncmVsZWFzZWQgOmJvb2ttYXJrOicsICc2MzY2RjEnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdzOiAwLjVoIDpjbG9jazEyMzA6JywgJ0YzRjRGNicpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ3M6IDFoIDpjbG9jazE6JywgJ0U1RTdFQicpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ3M6IDJoIDpjbG9jazI6JywgJ0QxRDVEQicpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ3M6IDNoIDpjbG9jazM6JywgJzlDQTNBRicpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ3M6IDVoIDpjbG9jazU6JywgJzZCNzI4MCcpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ3M6IDhoIDpjbG9jazg6JywgJzRCNTU2MycpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ3M6IDEzaCA6Y2xvY2sxOicsICczNzQxNTEnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICd0OiBidWlsZCA6aGFtbWVyOicsICdCRkRCRkUnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICd0OiBjaG9yZSA6YnJvb206JywgJ0JGREJGRScpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ3Q6IGNpIDpjb25zdHJ1Y3Rpb25fd29ya2VyOicsICdCRkRCRkUnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICd0OiBkb2NzIDptZW1vOicsICdCRkRCRkUnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICd0OiBmZWF0IDpzcGFya2xlczonLCAnQkZEQkZFJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAndDogZml4IDpidWc6JywgJ0JGREJGRScpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ3Q6IHBlcmYgOnphcDonLCAnQkZEQkZFJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAndDogcmVmYWN0b3IgOnJlY3ljbGU6JywgJ0JGREJGRScpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ3Q6IHN0eWxlIDpsaXBzdGljazonLCAnQkZEQkZFJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAndDogdGVzdCA6dGVzdF90dWJlOicsICdCRkRCRkUnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdwcm9qZWN0JywgJzI0MjkyRicpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ2ZvY3VzZWQgOmRhcnQ6JywgJzIyQzU1RScpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ2dlbi1wci1hbGwgOnJvYm90OicsICcwMEI0RDgnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdnZW4tcHItY2xhdWRlIDpyb2JvdDonLCAnMDBCNEQ4Jyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAnZ2VuLXByLWNvZGV4IDpyb2JvdDonLCAnMDBCNEQ4Jyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAnZ2VuLXByLWdlbWluaSA6cm9ib3Q6JywgJzAwQjREOCcpO1xuXG4gICAgICBhd2FpdCBkZWxldGVMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ2J1ZycpO1xuICAgICAgYXdhaXQgZGVsZXRlTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdkb2N1bWVudGF0aW9uJyk7XG4gICAgICBhd2FpdCBkZWxldGVMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ2R1cGxpY2F0ZScpO1xuICAgICAgYXdhaXQgZGVsZXRlTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdlbmhhbmNlbWVudCcpO1xuICAgICAgYXdhaXQgZGVsZXRlTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdnb29kIGZpcnN0IGlzc3VlJyk7XG4gICAgICBhd2FpdCBkZWxldGVMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ2hlbHAgd2FudGVkJyk7XG4gICAgICBhd2FpdCBkZWxldGVMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ2ludmFsaWQnKTtcbiAgICAgIGF3YWl0IGRlbGV0ZUxhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAncXVlc3Rpb24nKTtcbiAgICAgIGF3YWl0IGRlbGV0ZUxhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAnd29udGZpeCcpO1xuXG4gICAgICBhd2FpdCBkZWxldGVMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ3JlYWR5Jyk7XG4gICAgICBhd2FpdCBkZWxldGVMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ3JldmlldyByZXF1ZXN0ZWQnKTtcbiAgICAgIGF3YWl0IGRlbGV0ZUxhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAncmVsZWFzZWQnKTtcbiAgICAgIGF3YWl0IGRlbGV0ZUxhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAnc2VtYW50aWMtcmVsZWFzZScpO1xuICAgICAgYXdhaXQgZGVsZXRlTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdsbG0tcHIgOnJvYm90OicpO1xuICAgICAgYXdhaXQgZGVsZXRlTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdhaS1wciA6cm9ib3Q6Jyk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNvbnNvbGUud2FybignU2tpcCBzZXR1cExhYmVscyBkdWUgdG86JywgKGVycm9yIGFzIEVycm9yIHwgdW5kZWZpbmVkKT8uc3RhY2sgPz8gZXJyb3IpO1xuICAgIH1cbiAgfSk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHNldHVwTGFiZWwob2N0b2tpdDogT2N0b2tpdCwgb3duZXI6IHN0cmluZywgcmVwbzogc3RyaW5nLCBuYW1lOiBzdHJpbmcsIGNvbG9yOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgdHJ5IHtcbiAgICAvLyBJc3N1ZXMgcGVybWlzc2lvblxuICAgIGF3YWl0IG9jdG9raXQucmVxdWVzdCgnUE9TVCAvcmVwb3Mve293bmVyfS97cmVwb30vbGFiZWxzJywge1xuICAgICAgb3duZXIsXG4gICAgICByZXBvLFxuICAgICAgbmFtZSxcbiAgICAgIGNvbG9yLFxuICAgIH0pO1xuICB9IGNhdGNoIHtcbiAgICAvLyBJc3N1ZXMgcGVybWlzc2lvblxuICAgIGF3YWl0IG9jdG9raXQucmVxdWVzdCgnUEFUQ0ggL3JlcG9zL3tvd25lcn0ve3JlcG99L2xhYmVscy97bmFtZX0nLCB7XG4gICAgICBvd25lcixcbiAgICAgIHJlcG8sXG4gICAgICBuYW1lLFxuICAgICAgY29sb3IsXG4gICAgfSk7XG4gIH1cbn1cblxuYXN5bmMgZnVuY3Rpb24gZGVsZXRlTGFiZWwob2N0b2tpdDogT2N0b2tpdCwgb3duZXI6IHN0cmluZywgcmVwbzogc3RyaW5nLCBuYW1lOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgdHJ5IHtcbiAgICAvLyBJc3N1ZXMgcGVybWlzc2lvblxuICAgIGF3YWl0IG9jdG9raXQucmVxdWVzdCgnREVMRVRFIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9sYWJlbHMve25hbWV9Jywge1xuICAgICAgb3duZXIsXG4gICAgICByZXBvLFxuICAgICAgbmFtZSxcbiAgICB9KTtcbiAgfSBjYXRjaCB7XG4gICAgLy8gZG8gbm90aGluZ1xuICB9XG59XG4iLCIvKiBlc2xpbnQtZGlzYWJsZSBpbXBvcnQteC9uby1uYW1lZC1hcy1kZWZhdWx0LW1lbWJlciAqL1xuXG5pbXBvcnQgZG90ZW52IGZyb20gJ2RvdGVudic7XG5pbXBvcnQgc29kaXVtIGZyb20gJ2xpYnNvZGl1bS13cmFwcGVycyc7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgeyBvcHRpb25zIH0gZnJvbSAnLi4vb3B0aW9ucy5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGdldE9jdG9raXQsIGdpdEh1YlV0aWwsIGhhc0dpdEh1YlRva2VuIH0gZnJvbSAnLi4vdXRpbHMvZ2l0aHViVXRpbC5qcyc7XG5cbmNvbnN0IERFUFJFQ0FURURfU0VDUkVUX05BTUVTID0gWydSRUFEWV9ESVNDT1JEX1dFQkhPT0tfVVJMJywgJ0dIX0JPVF9QQVQnLCAnUFVCTElDX0dIX0JPVF9QQVQnXTtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHNldHVwU2VjcmV0cyhjb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdzZXR1cFNlY3JldHMnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgW293bmVyLCByZXBvXSA9IGdpdEh1YlV0aWwuZ2V0T3JnQW5kTmFtZShjb25maWcucmVwb3NpdG9yeSA/PyAnJyk7XG4gICAgaWYgKCFvd25lciB8fCAhcmVwbyB8fCBvd25lciAhPT0gJ1dpbGxCb29zdGVyTGFiJykgcmV0dXJuO1xuICAgIGlmICghaGFzR2l0SHViVG9rZW4ob3duZXIpIHx8ICFvcHRpb25zLmRvZXNVcGxvYWRFbnZWYXJzKSByZXR1cm47XG5cbiAgICBjb25zdCBwYXJzZWQgPSBkb3RlbnYuY29uZmlnKCkucGFyc2VkID8/IHt9O1xuICAgIGlmIChPYmplY3Qua2V5cyhwYXJzZWQpLmxlbmd0aCA9PT0gMCkgcmV0dXJuO1xuXG4gICAgY29uc3Qgb2N0b2tpdCA9IGdldE9jdG9raXQob3duZXIpO1xuXG4gICAgdHJ5IHtcbiAgICAgIGZvciAoY29uc3Qgc2VjcmV0TmFtZSBvZiBERVBSRUNBVEVEX1NFQ1JFVF9OQU1FUykge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIC8vIFJlcXVpcmVzIFNlY3JldHMgcGVybWlzc2lvblxuICAgICAgICAgIGF3YWl0IG9jdG9raXQucmVxdWVzdCgnREVMRVRFIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9hY3Rpb25zL3NlY3JldHMve3NlY3JldF9uYW1lfScsIHtcbiAgICAgICAgICAgIG93bmVyLFxuICAgICAgICAgICAgcmVwbyxcbiAgICAgICAgICAgIHNlY3JldF9uYW1lOiBzZWNyZXROYW1lLFxuICAgICAgICAgIH0pO1xuICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICAvLyBkbyBub3RoaW5nXG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gUmVxdWlyZXMgU2VjcmV0cyBwZXJtaXNzaW9uXG4gICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IG9jdG9raXQucmVxdWVzdCgnR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9hY3Rpb25zL3NlY3JldHMvcHVibGljLWtleScsIHtcbiAgICAgICAgb3duZXIsXG4gICAgICAgIHJlcG8sXG4gICAgICB9KTtcbiAgICAgIGNvbnN0IHsga2V5LCBrZXlfaWQ6IGtleUlkIH0gPSByZXNwb25zZS5kYXRhO1xuXG4gICAgICBhd2FpdCBzb2RpdW0ucmVhZHk7XG5cbiAgICAgIGZvciAoY29uc3QgW25hbWUsIHNlY3JldF0gb2YgT2JqZWN0LmVudHJpZXMocGFyc2VkKSkge1xuICAgICAgICBpZiAoXG4gICAgICAgICAgbmFtZSA9PT0gJ0dIX0JPVF9QQVQnIHx8XG4gICAgICAgICAgbmFtZSA9PT0gJ0dIX0JPVF9QQVRfRk9SX1dJTExCT09TVEVSJyB8fFxuICAgICAgICAgIG5hbWUgPT09ICdHSF9CT1RfUEFUX0ZPUl9XSUxMQk9PU1RFUkxBQidcbiAgICAgICAgKSB7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBDb252ZXJ0IFNlY3JldCAmIEJhc2U2NCBrZXkgdG8gVWludDhBcnJheS5cbiAgICAgICAgY29uc3QgcmF3S2V5ID0gc29kaXVtLmZyb21fYmFzZTY0KGtleSwgc29kaXVtLmJhc2U2NF92YXJpYW50cy5PUklHSU5BTCk7XG4gICAgICAgIGNvbnN0IHJhd1NlYyA9IHNvZGl1bS5mcm9tX3N0cmluZyhzZWNyZXQpO1xuXG4gICAgICAgIC8vIEVuY3J5cHQgdGhlIHNlY3JldCB1c2luZyBMaWJTb2RpdW1cbiAgICAgICAgY29uc3QgZW5jQnl0ZXMgPSBzb2RpdW0uY3J5cHRvX2JveF9zZWFsKHJhd1NlYywgcmF3S2V5KTtcblxuICAgICAgICAvLyBDb252ZXJ0IGVuY3J5cHRlZCBVaW50OEFycmF5IHRvIEJhc2U2NFxuICAgICAgICBjb25zdCBlbmNCYXNlNjQgPSBzb2RpdW0udG9fYmFzZTY0KGVuY0J5dGVzLCBzb2RpdW0uYmFzZTY0X3ZhcmlhbnRzLk9SSUdJTkFMKTtcblxuICAgICAgICAvLyBSZXF1aXJlcyBTZWNyZXRzIHBlcm1pc3Npb25cbiAgICAgICAgYXdhaXQgb2N0b2tpdC5yZXF1ZXN0KCdQVVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2FjdGlvbnMvc2VjcmV0cy97c2VjcmV0X25hbWV9Jywge1xuICAgICAgICAgIG93bmVyLFxuICAgICAgICAgIHJlcG8sXG4gICAgICAgICAgc2VjcmV0X25hbWU6IG5hbWUsXG4gICAgICAgICAgZW5jcnlwdGVkX3ZhbHVlOiBlbmNCYXNlNjQsXG4gICAgICAgICAga2V5X2lkOiBrZXlJZCxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNvbnNvbGUud2FybignU2tpcCBzZXR1cFNlY3JldHMgZHVlIHRvOicsIChlcnJvciBhcyBFcnJvciB8IHVuZGVmaW5lZCk/LnN0YWNrID8/IGVycm9yKTtcbiAgICB9XG4gIH0pO1xufVxuIiwiaW1wb3J0IHsgd2l0aFJldHJ5IH0gZnJvbSAnQHdpbGxib29zdGVyL3NoYXJlZC1saWInO1xuXG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGdldE9jdG9raXQsIGdpdEh1YlV0aWwsIGhhc0dpdEh1YlRva2VuIH0gZnJvbSAnLi4vdXRpbHMvZ2l0aHViVXRpbC5qcyc7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBzZXR1cEdpdEh1YlNldHRpbmdzKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBbb3duZXIsIHJlcG9dID0gZ2l0SHViVXRpbC5nZXRPcmdBbmROYW1lKGNvbmZpZy5yZXBvc2l0b3J5ID8/ICcnKTtcbiAgaWYgKCFvd25lciB8fCAhcmVwbykgcmV0dXJuO1xuICBpZiAob3duZXIgIT09ICdXaWxsQm9vc3RlcicgJiYgb3duZXIgIT09ICdXaWxsQm9vc3RlckxhYicpIHJldHVybjtcbiAgaWYgKCFoYXNHaXRIdWJUb2tlbihvd25lcikpIHJldHVybjtcblxuICBjb25zdCBvY3Rva2l0ID0gZ2V0T2N0b2tpdChvd25lcik7XG5cbiAgLy8gQWRtaW5pc3RyYXRpb24gcGVybWlzc2lvblxuICBhd2FpdCB3aXRoUmV0cnkoKCkgPT5cbiAgICBvY3Rva2l0LnJlcXVlc3QoJ1BBVENIIC9yZXBvcy97b3duZXJ9L3tyZXBvfScsIHtcbiAgICAgIG93bmVyLFxuICAgICAgcmVwbyxcbiAgICAgIGFsbG93X2F1dG9fbWVyZ2U6IHRydWUsXG4gICAgICBhbGxvd19tZXJnZV9jb21taXQ6IGZhbHNlLFxuICAgICAgYWxsb3dfc3F1YXNoX21lcmdlOiB0cnVlLFxuICAgICAgYWxsb3dfcmViYXNlX21lcmdlOiBmYWxzZSxcbiAgICAgIGFsbG93X3VwZGF0ZV9icmFuY2g6IHRydWUsXG4gICAgICBkZWxldGVfYnJhbmNoX29uX21lcmdlOiB0cnVlLFxuICAgICAgc3F1YXNoX21lcmdlX2NvbW1pdF90aXRsZTogJ1BSX1RJVExFJyxcbiAgICAgIHNxdWFzaF9tZXJnZV9jb21taXRfbWVzc2FnZTogJ0JMQU5LJyxcbiAgICAgIGhlYWRlcnM6IHtcbiAgICAgICAgJ1gtR2l0SHViLUFwaS1WZXJzaW9uJzogJzIwMjItMTEtMjgnLFxuICAgICAgfSxcbiAgICAgIC4uLihjb25maWcucmVwb3NpdG9yeT8uc3RhcnRzV2l0aCgnZ2l0aHViOldpbGxCb29zdGVyLycpID8geyBhbGxvd19hdXRvX21lcmdlOiB0cnVlIH0gOiB7fSksXG4gICAgfSlcbiAgKTtcbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB7IGRpc3RhbmNlIH0gZnJvbSAnZmFzdGVzdC1sZXZlbnNodGVpbic7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGZzVXRpbCB9IGZyb20gJy4uL3V0aWxzL2ZzVXRpbC5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcblxuY29uc3QgdGVtcGxhdGVzID0ge1xuICAncHVsbF9yZXF1ZXN0X3RlbXBsYXRlLm1kJzogYFxuQ2xvc2UgIzxJc3N1ZU51bWJlcj5cblxuIyMgU2VsZiBDaGVja1xuXG4tIFsgXSBJJ3ZlIGNvbmZpcm1lZCBcXGBBbGwgY2hlY2tzIGhhdmUgcGFzc2VkXFxgIG9uIHRoaXMgcGFnZS5cbiAgLSBQUiB0aXRsZSBmb2xsb3dzIFtBbmd1bGFyJ3MgY29tbWl0IG1lc3NhZ2UgZm9ybWF0XShodHRwczovL2dpdGh1Yi5jb20vYW5ndWxhci9hbmd1bGFyL2Jsb2IvbWFpbi9DT05UUklCVVRJTkcubWQjLWNvbW1pdC1tZXNzYWdlLWZvcm1hdCkuXG4gIC0gUFIgdGl0bGUgZG9lc24ndCBoYXZlIFxcYFdJUDpcXGAuXG4gIC0gVGhlIHRlc3QgY29tbWFuZCAoZS5nLiwgXFxgeWFybiB0ZXN0XFxgKSBwYXNzZWQuXG4gIC0gVGhlIGxpbnQgY29tbWFuZCAoZS5nLiwgXFxgeWFybiBsaW50XFxgKSBwYXNzZWQuXG4gIC0gWW91IG1heSBsZWF2ZSB0aGlzIGJveCB1bmNoZWNrZWQgZHVlIHRvIGxvbmcgd29ya2Zsb3dzLlxuLSBbIF0gSSd2ZSByZXZpZXdlZCBteSBjaGFuZ2VzIG9uIHRoZSBHaXRIdWIgZGlmZiB2aWV3LlxuLSBbIF0gSSd2ZSB3cml0dGVuIHRoZSBzdGVwcyB0byB0ZXN0IG15IGNoYW5nZXMuXG4tIFsgXSBJJ3ZlIGFkZGVkIHNjcmVlbnNob3RzIChpZiB0aGUgVUkgY2hhbmdlZCkuXG4gIC0gWW91IG1heSBsZWF2ZSB0aGlzIGJveCB1bmNoZWNrZWQgaWYgeW91IGRpZG4ndCBtb2RpZnkgdGhlIFVJLlxuXG48IS0tIFBsZWFzZSBhZGQgc2NyZWVuc2hvdHMgaWYgeW91IG1vZGlmeSB0aGUgVUkuXG58IEN1cnJlbnQgICAgICAgICAgICAgICAgICB8IEluIGNvbWluZyAgICAgICAgICAgICAgICB8XG58IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8XG58IDxpbWcgc3JjPVwiXCIgd2lkdGg9XCI0MDBcIj4gfCA8aW1nIHNyYz1cIlwiIHdpZHRoPVwiNDAwXCI+IHxcbi0tPlxuXG48IS0tIFBsZWFzZSBhZGQgc3RlcHMgdG8gdGVzdCB5b3VyIGNoYW5nZXMuXG4jIyBTdGVwcyB0byBUZXN0XG5cbjEuIE9wZW4gaHR0cDovL2xvY2FsaG9zdC1leGVyY29kZS53aWxsYm9vc3Rlci5uZXQ6MzAwMC9qYS1KUC9jb3Vyc2VzL19leGFtcGxlL2xlc3NvbnMvX2V4YW1wbGVfYV9wbHVzX2IvcHJvYmxlbXMvX2V4YW1wbGVfYV9wbHVzX2IgYWZ0ZXIgbG9naW4uXG4yLiBTZWxlY3QgdGhlIGxhbmd1YWdlIFxcYENcXGAuXG4zLiBXcml0ZSB0aGUgZm9sbG93aW5nIGNvZGU6XG4gICBcXGBcXGBcXGBjXG4gICAjaW5jbHVkZSA8c3RkaW8uaD5cblxuICAgaW50IG1haW4odm9pZCkge1xuICAgICBpbnQgYSwgYjtcblxuICAgICBzY2FuZihcIiVkICVkXCIsICZhLCAmYik7XG4gICAgIHByaW50ZihcIiVkXCIsIGEgKyBiKTtcbiAgICAgcmV0dXJuIDA7XG4gICB9XG4gICBcXGBcXGBcXGBcbjQuIFB1c2ggXFxgU3VibWl0XFxgIGJ1dHRvbi5cbjUuIC4uLlxuLS0+XG5gLnRyaW0oKSxcbn07XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZW5lcmF0ZUdpdEh1YlRlbXBsYXRlcyhjb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdnZW5lcmF0ZUdpdEh1YlRlbXBsYXRlcycsIGFzeW5jICgpID0+IHtcbiAgICBmb3IgKGNvbnN0IFtmaWxlTmFtZSwgbmV3Q29udGVudF0gb2YgT2JqZWN0LmVudHJpZXModGVtcGxhdGVzKSkge1xuICAgICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICcuZ2l0aHViJywgZmlsZU5hbWUpO1xuICAgICAgaWYgKGZzLmV4aXN0c1N5bmMoZmlsZVBhdGgpKSB7XG4gICAgICAgIGNvbnN0IG9sZENvbnRlbnQgPSBhd2FpdCBmcy5wcm9taXNlcy5yZWFkRmlsZShmaWxlUGF0aCwgJ3V0ZjgnKTtcbiAgICAgICAgaWYgKGRpc3RhbmNlKG9sZENvbnRlbnQsIG5ld0NvbnRlbnQpID4gbmV3Q29udGVudC5sZW5ndGggLyAyKSB7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgYXdhaXQgZnMucHJvbWlzZXMubWtkaXIocGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnLmdpdGh1YicpLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiBmc1V0aWwuZ2VuZXJhdGVGaWxlKGZpbGVQYXRoLCBuZXdDb250ZW50KSk7XG4gICAgfVxuICB9KTtcbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBmc3AgZnJvbSAnbm9kZTpmcy9wcm9taXNlcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgZmcgZnJvbSAnZmFzdC1nbG9iJztcbmltcG9ydCB7IHNpbXBsZUdpdCB9IGZyb20gJ3NpbXBsZS1naXQnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlSnNvbiB9IGZyb20gJ3R5cGUtZmVzdCc7XG5pbXBvcnQgeyB6IH0gZnJvbSAnem9kJztcblxuaW1wb3J0IHsgZ2V0T2N0b2tpdCwgZ2l0SHViVXRpbCB9IGZyb20gJy4vdXRpbHMvZ2l0aHViVXRpbC5qcyc7XG5pbXBvcnQgeyBnbG9iSWdub3JlIH0gZnJvbSAnLi91dGlscy9nbG9iVXRpbC5qcyc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgUGFja2FnZUNvbmZpZyB7XG4gIGRpclBhdGg6IHN0cmluZztcbiAgZG9ja2VyZmlsZTogc3RyaW5nO1xuICBpc1Jvb3Q6IGJvb2xlYW47XG4gIGlzUHVibGljUmVwbzogYm9vbGVhbjtcbiAgaXNSZWZlcnJlZEJ5T3RoZXJSZXBvOiBib29sZWFuO1xuICByZXBvc2l0b3J5Pzogc3RyaW5nO1xuICBpc1dpbGxCb29zdGVyUmVwbzogYm9vbGVhbjtcbiAgaXNCdW46IGJvb2xlYW47XG4gIGlzRXNtUGFja2FnZTogYm9vbGVhbjtcbiAgaXNXaWxsQm9vc3RlckNvbmZpZ3M6IGJvb2xlYW47XG4gIC8vIGRlcGVuZGVuY3kgaW5mb3JtYXRpb25cbiAgZG9lc0NvbnRhaW5TdWJQYWNrYWdlSnNvbnM6IGJvb2xlYW47XG4gIGRvZXNDb250YWluRG9ja2VyZmlsZTogYm9vbGVhbjtcbiAgZG9lc0NvbnRhaW5HZW1maWxlOiBib29sZWFuO1xuICBkb2VzQ29udGFpbkdvTW9kOiBib29sZWFuO1xuICBkb2VzQ29udGFpblBhY2thZ2VKc29uOiBib29sZWFuO1xuICBkb2VzQ29udGFpblBvZXRyeUxvY2s6IGJvb2xlYW47XG4gIGRvZXNDb250YWluUG9tWG1sOiBib29sZWFuO1xuICBkb2VzQ29udGFpblB1YnNwZWNZYW1sOiBib29sZWFuO1xuICBkb2VzQ29udGFpblRlbXBsYXRlWWFtbDogYm9vbGVhbjtcbiAgZG9lc0NvbnRhaW5Wc2NvZGVTZXR0aW5nc0pzb246IGJvb2xlYW47XG4gIC8vIHNvdXJjZSBjb2RlIGZpbGVzXG4gIGRvZXNDb250YWluSmF2YVNjcmlwdDogYm9vbGVhbjtcbiAgZG9lc0NvbnRhaW5UeXBlU2NyaXB0OiBib29sZWFuO1xuICBkb2VzQ29udGFpbkpzeE9yVHN4OiBib29sZWFuO1xuICBkb2VzQ29udGFpbkphdmFTY3JpcHRJblBhY2thZ2VzOiBib29sZWFuO1xuICBkb2VzQ29udGFpblR5cGVTY3JpcHRJblBhY2thZ2VzOiBib29sZWFuO1xuICBkb2VzQ29udGFpbkpzeE9yVHN4SW5QYWNrYWdlczogYm9vbGVhbjtcblxuICBoYXNTdGFydFRlc3Q6IGJvb2xlYW47XG5cbiAgZGVwZW5kaW5nOiB7XG4gICAgYmxpdHo6IGJvb2xlYW47XG4gICAgZmlyZWJhc2U6IGJvb2xlYW47XG4gICAgZ2VuSTE4blRzOiBib29sZWFuO1xuICAgIGxpdGVzdHJlYW06IGJvb2xlYW47XG4gICAgbmV4dDogYm9vbGVhbjtcbiAgICBwbGF5d3JpZ2h0VGVzdDogYm9vbGVhbjtcbiAgICBwcmlzbWE6IGJvb2xlYW47XG4gICAgcHlyaWdodDogYm9vbGVhbjtcbiAgICByZWFjdDogYm9vbGVhbjtcbiAgICByZWFjdE5hdGl2ZTogYm9vbGVhbjtcbiAgICBzZW1hbnRpY1JlbGVhc2U6IGJvb2xlYW47XG4gICAgc3Rvcnlib29rOiBib29sZWFuO1xuICAgIHdiOiBib29sZWFuO1xuICB9O1xuICByZWxlYXNlOiB7XG4gICAgYnJhbmNoZXM6IHN0cmluZ1tdO1xuICAgIGdpdGh1YjogYm9vbGVhbjtcbiAgICBucG06IGJvb2xlYW47XG4gIH07XG4gIGVzbGludEJhc2U/OiBFc2xpbnRFeHRlbnNpb25CYXNlO1xuICB2ZXJzaW9uc1RleHQ/OiBzdHJpbmc7XG4gIHBhY2thZ2VKc29uPzogUGFja2FnZUpzb247XG4gIHdiZnlKc29uPzogV2JmeUpzb247XG59XG5cbnR5cGUgV2JmeUpzb24gPSB6LmluZmVyPHR5cGVvZiB3YmZ5SnNvblNjaGVtYT47XG5cbmNvbnN0IHdiZnlKc29uU2NoZW1hID0gei5vYmplY3Qoe1xuICB0eXBvczogelxuICAgIC5vYmplY3Qoe1xuICAgICAgYWxsOiB6LnJlY29yZCh6LnN0cmluZygpLCB6LnN0cmluZygpKS5vcHRpb25hbCgpLFxuICAgICAgZG9jOiB6LnJlY29yZCh6LnN0cmluZygpLCB6LnN0cmluZygpKS5vcHRpb25hbCgpLFxuICAgICAgdHM6IHoucmVjb3JkKHouc3RyaW5nKCksIHouc3RyaW5nKCkpLm9wdGlvbmFsKCksXG4gICAgICB0ZXh0OiB6LnJlY29yZCh6LnN0cmluZygpLCB6LnN0cmluZygpKS5vcHRpb25hbCgpLFxuICAgIH0pXG4gICAgLm9wdGlvbmFsKCksXG59KTtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdldFBhY2thZ2VDb25maWcoXG4gIGRpclBhdGg6IHN0cmluZyxcbiAgcm9vdENvbmZpZz86IFBhY2thZ2VDb25maWdcbik6IFByb21pc2U8UGFja2FnZUNvbmZpZyB8IHVuZGVmaW5lZD4ge1xuICBjb25zdCBwYWNrYWdlSnNvblBhdGggPSBwYXRoLnJlc29sdmUoZGlyUGF0aCwgJ3BhY2thZ2UuanNvbicpO1xuICB0cnkge1xuICAgIGNvbnN0IGRvZXNDb250YWluUGFja2FnZUpzb24gPSBmcy5leGlzdHNTeW5jKHBhY2thZ2VKc29uUGF0aCk7XG4gICAgbGV0IGRlcGVuZGVuY2llczogUGFja2FnZUpzb25bJ2RlcGVuZGVuY2llcyddID0ge307XG4gICAgbGV0IGRldkRlcGVuZGVuY2llczogUGFja2FnZUpzb25bJ2RldkRlcGVuZGVuY2llcyddID0ge307XG4gICAgbGV0IHBhY2thZ2VKc29uOiBQYWNrYWdlSnNvbiA9IHt9O1xuICAgIGxldCBlc21QYWNrYWdlID0gZmFsc2U7XG4gICAgaWYgKGRvZXNDb250YWluUGFja2FnZUpzb24pIHtcbiAgICAgIGNvbnN0IHBhY2thZ2VKc29uVGV4dCA9IGZzLnJlYWRGaWxlU3luYyhwYWNrYWdlSnNvblBhdGgsICd1dGY4Jyk7XG4gICAgICBwYWNrYWdlSnNvbiA9IEpTT04ucGFyc2UocGFja2FnZUpzb25UZXh0KSBhcyBQYWNrYWdlSnNvbjtcbiAgICAgIGRlcGVuZGVuY2llcyA9IHBhY2thZ2VKc29uLmRlcGVuZGVuY2llcyA/PyB7fTtcbiAgICAgIGRldkRlcGVuZGVuY2llcyA9IHBhY2thZ2VKc29uLmRldkRlcGVuZGVuY2llcyA/PyB7fTtcbiAgICAgIGVzbVBhY2thZ2UgPSBwYWNrYWdlSnNvbi50eXBlID09PSAnbW9kdWxlJztcbiAgICB9XG5cbiAgICBsZXQgcmVsZWFzZUJyYW5jaGVzOiBzdHJpbmdbXSA9IFtdO1xuICAgIGxldCByZWxlYXNlUGx1Z2luczogc3RyaW5nW10gPSBbXTtcbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVsZWFzZXJjSnNvblBhdGggPSBwYXRoLnJlc29sdmUoZGlyUGF0aCwgJy5yZWxlYXNlcmMuanNvbicpO1xuICAgICAgY29uc3QganNvbiA9IEpTT04ucGFyc2UoYXdhaXQgZnNwLnJlYWRGaWxlKHJlbGVhc2VyY0pzb25QYXRoLCAndXRmOCcpKSBhc1xuICAgICAgICB8IHtcbiAgICAgICAgICAgIGJyYW5jaGVzOiBzdHJpbmdbXTtcbiAgICAgICAgICAgIHBsdWdpbnM/OiBzdHJpbmdbXVtdO1xuICAgICAgICAgIH1cbiAgICAgICAgfCB1bmRlZmluZWQ7XG4gICAgICByZWxlYXNlQnJhbmNoZXMgPSBqc29uPy5icmFuY2hlcyA/PyBbXTtcbiAgICAgIHJlbGVhc2VQbHVnaW5zID0ganNvbj8ucGx1Z2lucz8uZmxhdCgpID8/IFtdO1xuICAgIH0gY2F0Y2gge1xuICAgICAgLy8gZG8gbm90aGluZ1xuICAgIH1cblxuICAgIGNvbnN0IGlzUm9vdCA9XG4gICAgICBwYXRoLmJhc2VuYW1lKHBhdGgucmVzb2x2ZShkaXJQYXRoLCAnLi4nKSkgIT09ICdwYWNrYWdlcycgfHxcbiAgICAgICFmcy5leGlzdHNTeW5jKHBhdGgucmVzb2x2ZShkaXJQYXRoLCAnLi4nLCAnLi4nLCAncGFja2FnZS5qc29uJykpO1xuXG4gICAgbGV0IHJlcG9JbmZvOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB8IHVuZGVmaW5lZDtcbiAgICBpZiAoaXNSb290KSB7XG4gICAgICByZXBvSW5mbyA9IGF3YWl0IGZldGNoUmVwb0luZm8oZGlyUGF0aCwgcGFja2FnZUpzb24pO1xuICAgIH1cblxuICAgIGxldCB2ZXJzaW9uc1RleHQgPSAnJztcbiAgICB0cnkge1xuICAgICAgY29uc3QgY29udGVudCA9IGF3YWl0IGZzcC5yZWFkRmlsZShwYXRoLnJlc29sdmUoZGlyUGF0aCwgJy50b29sLXZlcnNpb25zJyksICd1dGY4Jyk7XG4gICAgICB2ZXJzaW9uc1RleHQgKz0gY29udGVudC50cmltKCk7XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBkbyBub3RoaW5nXG4gICAgfVxuICAgIGZvciAoY29uc3QgW3ByZWZpeCwgbmFtZV0gb2YgW1xuICAgICAgWydqYXZhJywgJ2phdmEnXSxcbiAgICAgIFsnbm9kZScsICdub2RlanMnXSxcbiAgICAgIFsncHl0aG9uJywgJ3B5dGhvbiddLFxuICAgIF0pIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IG5vZGVWZXJzaW9uQ29udGVudCA9IGF3YWl0IGZzcC5yZWFkRmlsZShwYXRoLnJlc29sdmUoZGlyUGF0aCwgYC4ke3ByZWZpeH0tdmVyc2lvbmApLCAndXRmOCcpO1xuICAgICAgICBpZiAodmVyc2lvbnNUZXh0KSB7XG4gICAgICAgICAgdmVyc2lvbnNUZXh0ICs9ICdcXG4nO1xuICAgICAgICB9XG4gICAgICAgIHZlcnNpb25zVGV4dCArPSBgJHtuYW1lfSAke25vZGVWZXJzaW9uQ29udGVudC50cmltKCl9YDtcbiAgICAgIH0gY2F0Y2gge1xuICAgICAgICAvLyBkbyBub3RoaW5nXG4gICAgICB9XG4gICAgfVxuXG4gICAgbGV0IGRvY2tlcmZpbGUgPSAnJztcbiAgICB0cnkge1xuICAgICAgZG9ja2VyZmlsZSA9IGF3YWl0IGZzcC5yZWFkRmlsZShwYXRoLnJlc29sdmUoZGlyUGF0aCwgJ0RvY2tlcmZpbGUnKSwgJ3V0ZjgnKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIGRvIG5vdGhpbmdcbiAgICB9XG5cbiAgICAvLyBSZWFkIHdiZnkuanNvblxuICAgIGNvbnN0IHdiZnlKc29uUGF0aCA9IHBhdGgucmVzb2x2ZShkaXJQYXRoLCAnd2JmeS5qc29uJyk7XG4gICAgbGV0IHdiZnlKc29uOiBXYmZ5SnNvbiB8IHVuZGVmaW5lZDtcbiAgICB0cnkge1xuICAgICAgY29uc3Qgd2JmeUpzb25UZXh0ID0gYXdhaXQgZnNwLnJlYWRGaWxlKHdiZnlKc29uUGF0aCwgJ3V0ZjgnKTtcbiAgICAgIHdiZnlKc29uID0gd2JmeUpzb25TY2hlbWEucGFyc2UoSlNPTi5wYXJzZSh3YmZ5SnNvblRleHQpKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIGRvIG5vdGhpbmdcbiAgICB9XG5cbiAgICBjb25zdCByZXBvc2l0b3J5ID0gcmVwb0luZm8/LmZ1bGxfbmFtZSA/IGBnaXRodWI6JHtyZXBvSW5mby5mdWxsX25hbWUgYXMgc3RyaW5nfWAgOiB1bmRlZmluZWQ7XG4gICAgY29uc3QgY29uZmlnOiBQYWNrYWdlQ29uZmlnID0ge1xuICAgICAgZGlyUGF0aCxcbiAgICAgIGRvY2tlcmZpbGUsXG4gICAgICBpc1Jvb3QsXG4gICAgICBpc1B1YmxpY1JlcG86IHJlcG9JbmZvPy5wcml2YXRlID09PSBmYWxzZSxcbiAgICAgIGlzUmVmZXJyZWRCeU90aGVyUmVwbzogISFwYWNrYWdlSnNvbi5maWxlcyxcbiAgICAgIHJlcG9zaXRvcnk6IHJlcG9JbmZvPy5mdWxsX25hbWUgPyBgZ2l0aHViOiR7cmVwb0luZm8uZnVsbF9uYW1lIGFzIHN0cmluZ31gIDogdW5kZWZpbmVkLFxuICAgICAgaXNXaWxsQm9vc3RlclJlcG86IEJvb2xlYW4oXG4gICAgICAgIHJlcG9zaXRvcnk/LnN0YXJ0c1dpdGgoJ2dpdGh1YjpXaWxsQm9vc3Rlci8nKSB8fCByZXBvc2l0b3J5Py5zdGFydHNXaXRoKCdnaXRodWI6V2lsbEJvb3N0ZXJMYWIvJylcbiAgICAgICksXG4gICAgICBpc0J1bjogcm9vdENvbmZpZz8uaXNCdW4gfHwgZnMuZXhpc3RzU3luYyhwYXRoLmpvaW4oZGlyUGF0aCwgJ2J1bmZpZy50b21sJykpLFxuICAgICAgaXNFc21QYWNrYWdlOiBlc21QYWNrYWdlLFxuICAgICAgaXNXaWxsQm9vc3RlckNvbmZpZ3M6IHBhY2thZ2VKc29uUGF0aC5pbmNsdWRlcyhgJHtwYXRoLnNlcH13aWxsYm9vc3Rlci1jb25maWdzYCksXG4gICAgICBkb2VzQ29udGFpblN1YlBhY2thZ2VKc29uczogY29udGFpbnNBbnkoJ3BhY2thZ2VzLyoqL3BhY2thZ2UuanNvbicsIGRpclBhdGgpLFxuICAgICAgZG9lc0NvbnRhaW5Eb2NrZXJmaWxlOiAhIWRvY2tlcmZpbGUgfHwgZnMuZXhpc3RzU3luYyhwYXRoLnJlc29sdmUoZGlyUGF0aCwgJ2RvY2tlci1jb21wb3NlLnltbCcpKSxcbiAgICAgIGRvZXNDb250YWluR2VtZmlsZTogZnMuZXhpc3RzU3luYyhwYXRoLnJlc29sdmUoZGlyUGF0aCwgJ0dlbWZpbGUnKSksXG4gICAgICBkb2VzQ29udGFpbkdvTW9kOiBmcy5leGlzdHNTeW5jKHBhdGgucmVzb2x2ZShkaXJQYXRoLCAnZ28ubW9kJykpLFxuICAgICAgZG9lc0NvbnRhaW5QYWNrYWdlSnNvbjogZnMuZXhpc3RzU3luYyhwYXRoLnJlc29sdmUoZGlyUGF0aCwgJ3BhY2thZ2UuanNvbicpKSxcbiAgICAgIGRvZXNDb250YWluUG9ldHJ5TG9jazogZnMuZXhpc3RzU3luYyhwYXRoLnJlc29sdmUoZGlyUGF0aCwgJ3BvZXRyeS5sb2NrJykpLFxuICAgICAgZG9lc0NvbnRhaW5Qb21YbWw6IGZzLmV4aXN0c1N5bmMocGF0aC5yZXNvbHZlKGRpclBhdGgsICdwb20ueG1sJykpLFxuICAgICAgZG9lc0NvbnRhaW5QdWJzcGVjWWFtbDogZnMuZXhpc3RzU3luYyhwYXRoLnJlc29sdmUoZGlyUGF0aCwgJ3B1YnNwZWMueWFtbCcpKSxcbiAgICAgIGRvZXNDb250YWluVGVtcGxhdGVZYW1sOiBmcy5leGlzdHNTeW5jKHBhdGgucmVzb2x2ZShkaXJQYXRoLCAndGVtcGxhdGUueWFtbCcpKSxcbiAgICAgIGRvZXNDb250YWluVnNjb2RlU2V0dGluZ3NKc29uOiBmcy5leGlzdHNTeW5jKHBhdGgucmVzb2x2ZShkaXJQYXRoLCAnLnZzY29kZScsICdzZXR0aW5ncy5qc29uJykpLFxuICAgICAgZG9lc0NvbnRhaW5KYXZhU2NyaXB0OiBjb250YWluc0FueSgne2FwcCxzcmMsdGVzdCxzY3JpcHRzfS8qKi8qLntjanMsbWpzLGpzLGpzeH0nLCBkaXJQYXRoKSxcbiAgICAgIGRvZXNDb250YWluVHlwZVNjcmlwdDogY29udGFpbnNBbnkoJ3thcHAsc3JjLHRlc3Qsc2NyaXB0c30vKiovKi57Y3RzLG10cyx0cyx0c3h9JywgZGlyUGF0aCksXG4gICAgICBkb2VzQ29udGFpbkpzeE9yVHN4OiBjb250YWluc0FueSgne2FwcCxzcmMsdGVzdH0vKiovKi57dCxqfXN4JywgZGlyUGF0aCksXG4gICAgICBkb2VzQ29udGFpbkphdmFTY3JpcHRJblBhY2thZ2VzOiBjb250YWluc0FueSgncGFja2FnZXMvKiove2FwcCxzcmMsdGVzdCxzY3JpcHRzfS8qKi8qLntjanMsbWpzLGpzLGpzeH0nLCBkaXJQYXRoKSxcbiAgICAgIGRvZXNDb250YWluVHlwZVNjcmlwdEluUGFja2FnZXM6IGNvbnRhaW5zQW55KCdwYWNrYWdlcy8qKi97YXBwLHNyYyx0ZXN0LHNjcmlwdHN9LyoqLyoue2N0cyxtdHMsdHMsdHN4fScsIGRpclBhdGgpLFxuICAgICAgZG9lc0NvbnRhaW5Kc3hPclRzeEluUGFja2FnZXM6IGNvbnRhaW5zQW55KCdwYWNrYWdlcy8qKi97YXBwLHNyYyx0ZXN0fS8qKi8qLnt0LGp9c3gnLCBkaXJQYXRoKSxcbiAgICAgIGhhc1N0YXJ0VGVzdDogISFwYWNrYWdlSnNvbi5zY3JpcHRzPy5bJ3N0YXJ0LXRlc3QnXSxcbiAgICAgIGRlcGVuZGluZzoge1xuICAgICAgICBibGl0ejogISFkZXBlbmRlbmNpZXMuYmxpdHosXG4gICAgICAgIGZpcmViYXNlOiAhIWRldkRlcGVuZGVuY2llc1snZmlyZWJhc2UtdG9vbHMnXSxcbiAgICAgICAgZ2VuSTE4blRzOiAhIWRldkRlcGVuZGVuY2llc1snZ2VuLWkxOG4tdHMnXSxcbiAgICAgICAgbGl0ZXN0cmVhbTogZG9ja2VyZmlsZS5pbmNsdWRlcygnaW5zdGFsbC1saXRlc3RyZWFtLnNoJyksXG4gICAgICAgIHJlYWN0OiAhIWRlcGVuZGVuY2llcy5yZWFjdCxcbiAgICAgICAgbmV4dDogISFkZXBlbmRlbmNpZXMubmV4dCxcbiAgICAgICAgcGxheXdyaWdodFRlc3Q6XG4gICAgICAgICAgISFkZXBlbmRlbmNpZXNbJ0BwbGF5d3JpZ2h0L3Rlc3QnXSB8fCAhIWRldkRlcGVuZGVuY2llc1snQHBsYXl3cmlnaHQvdGVzdCddIHx8ICEhZGV2RGVwZW5kZW5jaWVzLnBsYXl3cmlnaHQsXG4gICAgICAgIHByaXNtYTogISFkZXBlbmRlbmNpZXNbJ0BwcmlzbWEvY2xpZW50J10gfHwgISFkZXZEZXBlbmRlbmNpZXMucHJpc21hLFxuICAgICAgICBweXJpZ2h0OiAhIWRldkRlcGVuZGVuY2llcy5weXJpZ2h0LFxuICAgICAgICByZWFjdE5hdGl2ZTogISFkZXBlbmRlbmNpZXNbJ3JlYWN0LW5hdGl2ZSddLFxuICAgICAgICBzZW1hbnRpY1JlbGVhc2U6ICEhKFxuICAgICAgICAgIGRldkRlcGVuZGVuY2llc1snc2VtYW50aWMtcmVsZWFzZSddIHx8XG4gICAgICAgICAgcmVsZWFzZUJyYW5jaGVzLmxlbmd0aCA+IDAgfHxcbiAgICAgICAgICByZWxlYXNlUGx1Z2lucy5sZW5ndGggPiAwXG4gICAgICAgICksXG4gICAgICAgIHN0b3J5Ym9vazogISFkZXZEZXBlbmRlbmNpZXNbJ0BzdG9yeWJvb2svcmVhY3QnXSxcbiAgICAgICAgd2I6ICEhZGVwZW5kZW5jaWVzWydAd2lsbGJvb3N0ZXIvd2InXSB8fCAhIWRldkRlcGVuZGVuY2llc1snQHdpbGxib29zdGVyL3diJ10sXG4gICAgICB9LFxuICAgICAgcmVsZWFzZToge1xuICAgICAgICBicmFuY2hlczogcmVsZWFzZUJyYW5jaGVzLFxuICAgICAgICBnaXRodWI6IHJlbGVhc2VQbHVnaW5zLmluY2x1ZGVzKCdAc2VtYW50aWMtcmVsZWFzZS9naXRodWInKSxcbiAgICAgICAgbnBtOiByZWxlYXNlUGx1Z2lucy5pbmNsdWRlcygnQHNlbWFudGljLXJlbGVhc2UvbnBtJyksXG4gICAgICB9LFxuICAgICAgdmVyc2lvbnNUZXh0LFxuICAgICAgcGFja2FnZUpzb24sXG4gICAgICB3YmZ5SnNvbixcbiAgICB9O1xuICAgIGlmICghY29uZmlnLmlzQnVuKSB7XG4gICAgICBjb25maWcuZXNsaW50QmFzZSA9IGdldEVzbGludEV4dGVuc2lvbkJhc2UoY29uZmlnKTtcbiAgICB9XG4gICAgaWYgKFxuICAgICAgY29uZmlnLmRvZXNDb250YWluR2VtZmlsZSB8fFxuICAgICAgY29uZmlnLmRvZXNDb250YWluR29Nb2QgfHxcbiAgICAgIGNvbmZpZy5kb2VzQ29udGFpblBhY2thZ2VKc29uIHx8XG4gICAgICBjb25maWcuZG9lc0NvbnRhaW5Qb2V0cnlMb2NrIHx8XG4gICAgICBjb25maWcuZG9lc0NvbnRhaW5Qb21YbWwgfHxcbiAgICAgIGNvbmZpZy5kb2VzQ29udGFpblB1YnNwZWNZYW1sIHx8XG4gICAgICBjb25maWcuZG9lc0NvbnRhaW5UZW1wbGF0ZVlhbWxcbiAgICApIHtcbiAgICAgIHJldHVybiBjb25maWc7XG4gICAgfVxuICB9IGNhdGNoIHtcbiAgICAvLyBkbyBub3RoaW5nXG4gIH1cbn1cblxuZnVuY3Rpb24gY29udGFpbnNBbnkocGF0dGVybjogc3RyaW5nLCBkaXJQYXRoOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgcmV0dXJuIGZnLmdsb2JTeW5jKHBhdHRlcm4sIHsgZG90OiB0cnVlLCBjd2Q6IGRpclBhdGgsIGlnbm9yZTogZ2xvYklnbm9yZSB9KS5sZW5ndGggPiAwO1xufVxuXG5leHBvcnQgdHlwZSBFc2xpbnRFeHRlbnNpb25CYXNlID1cbiAgfCAnQHdpbGxib29zdGVyL2VzbGludC1jb25maWctdHMtcmVhY3QnXG4gIHwgJ0B3aWxsYm9vc3Rlci9lc2xpbnQtY29uZmlnLXRzJ1xuICB8ICdAd2lsbGJvb3N0ZXIvZXNsaW50LWNvbmZpZy1qcy1yZWFjdCdcbiAgfCAnQHdpbGxib29zdGVyL2VzbGludC1jb25maWctanMnXG4gIHwgJ0B3aWxsYm9vc3Rlci9lc2xpbnQtY29uZmlnLW5leHQnO1xuXG5mdW5jdGlvbiBnZXRFc2xpbnRFeHRlbnNpb25CYXNlKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IEVzbGludEV4dGVuc2lvbkJhc2UgfCB1bmRlZmluZWQge1xuICBpZiAoY29uZmlnLmRlcGVuZGluZy5uZXh0KSB7XG4gICAgcmV0dXJuICdAd2lsbGJvb3N0ZXIvZXNsaW50LWNvbmZpZy1uZXh0JztcbiAgfSBlbHNlIGlmIChjb25maWcuZG9lc0NvbnRhaW5UeXBlU2NyaXB0KSB7XG4gICAgcmV0dXJuIGNvbmZpZy5kb2VzQ29udGFpbkpzeE9yVHN4ID8gJ0B3aWxsYm9vc3Rlci9lc2xpbnQtY29uZmlnLXRzLXJlYWN0JyA6ICdAd2lsbGJvb3N0ZXIvZXNsaW50LWNvbmZpZy10cyc7XG4gIH0gZWxzZSB7XG4gICAgaWYgKGNvbmZpZy5kb2VzQ29udGFpbkpzeE9yVHN4KSB7XG4gICAgICByZXR1cm4gJ0B3aWxsYm9vc3Rlci9lc2xpbnQtY29uZmlnLWpzLXJlYWN0JztcbiAgICB9IGVsc2UgaWYgKGNvbmZpZy5kb2VzQ29udGFpbkphdmFTY3JpcHQpIHtcbiAgICAgIHJldHVybiAnQHdpbGxib29zdGVyL2VzbGludC1jb25maWctanMnO1xuICAgIH1cbiAgfVxufVxuXG5hc3luYyBmdW5jdGlvbiBmZXRjaFJlcG9JbmZvKGRpclBhdGg6IHN0cmluZywgcGFja2FnZUpzb246IFBhY2thZ2VKc29uKTogUHJvbWlzZTxSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB8IHVuZGVmaW5lZD4ge1xuICBjb25zdCBnaXQgPSBzaW1wbGVHaXQoZGlyUGF0aCk7XG4gIGNvbnN0IHJlbW90ZXMgPSBhd2FpdCBnaXQuZ2V0UmVtb3Rlcyh0cnVlKTtcbiAgY29uc3Qgb3JpZ2luID0gcmVtb3Rlcy5maW5kKChyKSA9PiByLm5hbWUgPT09ICdvcmlnaW4nKTtcbiAgY29uc3QgcmVtb3RlVXJsID0gb3JpZ2luPy5yZWZzLmZldGNoID8/IG9yaWdpbj8ucmVmcy5wdXNoO1xuICBpZiAodHlwZW9mIHJlbW90ZVVybCA9PT0gJ3N0cmluZycpIHtcbiAgICBjb25zdCBqc29uID0gYXdhaXQgcmVxdWVzdFJlcG9JbmZvKHJlbW90ZVVybCk7XG4gICAgaWYgKGpzb24pIHJldHVybiBqc29uO1xuICB9XG5cbiAgY29uc3QgdXJsID0gdHlwZW9mIHBhY2thZ2VKc29uLnJlcG9zaXRvcnkgPT09ICdzdHJpbmcnID8gcGFja2FnZUpzb24ucmVwb3NpdG9yeSA6IHBhY2thZ2VKc29uLnJlcG9zaXRvcnk/LnVybDtcbiAgaWYgKHVybCkge1xuICAgIGNvbnN0IGpzb24gPSBhd2FpdCByZXF1ZXN0UmVwb0luZm8odXJsKTtcbiAgICBpZiAoanNvbiAmJiBqc29uLm1lc3NhZ2UgIT09ICdOb3QgRm91bmQnKSByZXR1cm4ganNvbjtcbiAgfVxufVxuXG5hc3luYyBmdW5jdGlvbiByZXF1ZXN0UmVwb0luZm8odXJsT3JGdWxsTmFtZTogc3RyaW5nKTogUHJvbWlzZTxSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB8IHVuZGVmaW5lZD4ge1xuICBjb25zdCBbb3JnLCBuYW1lXSA9IGdpdEh1YlV0aWwuZ2V0T3JnQW5kTmFtZSh1cmxPckZ1bGxOYW1lKTtcbiAgaWYgKCFvcmcgfHwgIW5hbWUpIHJldHVybjtcblxuICBjb25zdCByZXQgPSB7IGZ1bGxfbmFtZTogYCR7b3JnfS8ke25hbWV9YCB9O1xuICB0cnkge1xuICAgIC8vIE1ldGFkYXRhIHBlcm1pc3Npb25cbiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGdldE9jdG9raXQoKS5yZXF1ZXN0KCdHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99Jywge1xuICAgICAgb3duZXI6IG9yZyxcbiAgICAgIHJlcG86IG5hbWUsXG4gICAgfSk7XG4gICAgT2JqZWN0LmFzc2lnbihyZXQsIHJlc3BvbnNlLmRhdGEpO1xuICB9IGNhdGNoIHtcbiAgICAvLyBkbyBub3RoaW5nXG4gIH1cbiAgcmV0dXJuIHJldDtcbn1cbiIsImltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuXG5jb25zdCBFU0xJTlRfQ09ORklHX1BSRUZJWCA9ICdAd2lsbGJvb3N0ZXIvZXNsaW50LWNvbmZpZy0nO1xuXG5leHBvcnQgZnVuY3Rpb24gc2hvdWxkU2tpcFBhY2thZ2UoY29uZmlnOiBQYWNrYWdlQ29uZmlnLCByb290Q29uZmlnOiBQYWNrYWdlQ29uZmlnKTogYm9vbGVhbiB7XG4gIGlmICghcm9vdENvbmZpZy5pc1dpbGxCb29zdGVyQ29uZmlncykgcmV0dXJuIGZhbHNlO1xuXG4gIGNvbnN0IHBhY2thZ2VOYW1lID0gY29uZmlnLnBhY2thZ2VKc29uPy5uYW1lO1xuICByZXR1cm4gdHlwZW9mIHBhY2thZ2VOYW1lID09PSAnc3RyaW5nJyAmJiBwYWNrYWdlTmFtZS5zdGFydHNXaXRoKEVTTElOVF9DT05GSUdfUFJFRklYKTtcbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB7IGlnbm9yZUVycm9yQXN5bmMgfSBmcm9tICdAd2lsbGJvb3N0ZXIvc2hhcmVkLWxpYic7XG5pbXBvcnQgZmcgZnJvbSAnZmFzdC1nbG9iJztcbmltcG9ydCB5YXJncyBmcm9tICd5YXJncyc7XG5cbmltcG9ydCB7IGZpeERvY2tlcmZpbGUgfSBmcm9tICcuL2ZpeGVycy9kb2NrZXJmaWxlLmpzJztcbmltcG9ydCB7IGZpeE5leHRDb25maWdKc29uIH0gZnJvbSAnLi9maXhlcnMvbmV4dENvbmZpZy5qcyc7XG5pbXBvcnQgeyBmaXhQbGF5d3JpZ2h0Q29uZmlnIH0gZnJvbSAnLi9maXhlcnMvcGxheXdyaWdodENvbmZpZy5qcyc7XG5pbXBvcnQgeyBmaXhQcmlzbWFFbnZGaWxlcyB9IGZyb20gJy4vZml4ZXJzL3ByaXNtYS5qcyc7XG5pbXBvcnQgeyBmaXhUZXN0RGlyZWN0b3JpZXNVcGRhdGluZ1BhY2thZ2VKc29uIH0gZnJvbSAnLi9maXhlcnMvdGVzdERpcmVjdG9yeS5qcyc7XG5pbXBvcnQgeyBmaXhUeXBlRGVmaW5pdGlvbnMgfSBmcm9tICcuL2ZpeGVycy90eXBlRGVmaW5pdGlvbi5qcyc7XG5pbXBvcnQgeyBmaXhUeXBvcyB9IGZyb20gJy4vZml4ZXJzL3R5cG9zLmpzJztcbmltcG9ydCB7IGdlbmVyYXRlQWdlbnRJbnN0cnVjdGlvbnMgfSBmcm9tICcuL2dlbmVyYXRvcnMvYWdlbnRzLmpzJztcbmltcG9ydCB7IGdlbmVyYXRlVG9vbFZlcnNpb25zIH0gZnJvbSAnLi9nZW5lcmF0b3JzL2FzZGYuanMnO1xuaW1wb3J0IHsgZ2VuZXJhdGVCaW9tZUpzb25jIH0gZnJvbSAnLi9nZW5lcmF0b3JzL2Jpb21lLmpzJztcbmltcG9ydCB7IGdlbmVyYXRlQnVuZmlnVG9tbCB9IGZyb20gJy4vZ2VuZXJhdG9ycy9idW5maWcuanMnO1xuaW1wb3J0IHsgZ2VuZXJhdGVEb2NrZXJpZ25vcmUgfSBmcm9tICcuL2dlbmVyYXRvcnMvZG9ja2VyaWdub3JlLmpzJztcbmltcG9ydCB7IGdlbmVyYXRlRWRpdG9yY29uZmlnIH0gZnJvbSAnLi9nZW5lcmF0b3JzL2VkaXRvcmNvbmZpZy5qcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZUVzbGludHJjIH0gZnJvbSAnLi9nZW5lcmF0b3JzL2VzbGludENvbmZpZy5qcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZUdlbWluaUNvbmZpZyB9IGZyb20gJy4vZ2VuZXJhdG9ycy9nZW1pbmlDb25maWcuanMnO1xuaW1wb3J0IHsgcmVtb3ZlR2VtaW5pU2V0dGluZ3MgfSBmcm9tICcuL2dlbmVyYXRvcnMvZ2VtaW5pU2V0dGluZ3MuanMnO1xuaW1wb3J0IHsgZ2VuZXJhdGVHaXRhdHRyaWJ1dGVzIH0gZnJvbSAnLi9nZW5lcmF0b3JzL2dpdGF0dHJpYnV0ZXMuanMnO1xuaW1wb3J0IHsgZ2VuZXJhdGVHaXRpZ25vcmUgfSBmcm9tICcuL2dlbmVyYXRvcnMvZ2l0aWdub3JlLmpzJztcbmltcG9ydCB7IGdlbmVyYXRlSHVza3lyY1VwZGF0aW5nUGFja2FnZUpzb24gfSBmcm9tICcuL2dlbmVyYXRvcnMvaHVza3lyYy5qcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZUlkZWFTZXR0aW5ncyB9IGZyb20gJy4vZ2VuZXJhdG9ycy9pZGVhLmpzJztcbmltcG9ydCB7IGdlbmVyYXRlTGVmdGhvb2tVcGRhdGluZ1BhY2thZ2VKc29uIH0gZnJvbSAnLi9nZW5lcmF0b3JzL2xlZnRob29rLmpzJztcbmltcG9ydCB7IGdlbmVyYXRlTGludHN0YWdlZHJjIH0gZnJvbSAnLi9nZW5lcmF0b3JzL2xpbnRzdGFnZWRyYy5qcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZVBhY2thZ2VKc29uIH0gZnJvbSAnLi9nZW5lcmF0b3JzL3BhY2thZ2VKc29uLmpzJztcbmltcG9ydCB7IGdlbmVyYXRlUHJldHRpZXJpZ25vcmUgfSBmcm9tICcuL2dlbmVyYXRvcnMvcHJldHRpZXJpZ25vcmUuanMnO1xuaW1wb3J0IHsgZ2VuZXJhdGVQeXJpZ2h0Q29uZmlnSnNvbiB9IGZyb20gJy4vZ2VuZXJhdG9ycy9weXJpZ2h0Q29uZmlnLmpzJztcbmltcG9ydCB7IGdlbmVyYXRlUmVhZG1lIH0gZnJvbSAnLi9nZW5lcmF0b3JzL3JlYWRtZS5qcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZVJlbGVhc2VyYyB9IGZyb20gJy4vZ2VuZXJhdG9ycy9yZWxlYXNlcmMuanMnO1xuaW1wb3J0IHsgZ2VuZXJhdGVSZW5vdmF0ZUpzb24gfSBmcm9tICcuL2dlbmVyYXRvcnMvcmVub3ZhdGVKc29uLmpzJztcbmltcG9ydCB7IGdlbmVyYXRlVHNjb25maWcgfSBmcm9tICcuL2dlbmVyYXRvcnMvdHNjb25maWcuanMnO1xuaW1wb3J0IHsgZ2VuZXJhdGVWc2NvZGVTZXR0aW5ncyB9IGZyb20gJy4vZ2VuZXJhdG9ycy92c2NvZGVTZXR0aW5ncy5qcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZVdvcmtmbG93cywgaXNSZXVzYWJsZVdvcmtmbG93c1JlcG8gfSBmcm9tICcuL2dlbmVyYXRvcnMvd29ya2Zsb3cuanMnO1xuaW1wb3J0IHsgZ2VuZXJhdGVZYXJucmNZbWwgfSBmcm9tICcuL2dlbmVyYXRvcnMveWFybnJjLmpzJztcbmltcG9ydCB7IHNldHVwTGFiZWxzIH0gZnJvbSAnLi9naXRodWIvbGFiZWwuanMnO1xuaW1wb3J0IHsgc2V0dXBTZWNyZXRzIH0gZnJvbSAnLi9naXRodWIvc2VjcmV0LmpzJztcbmltcG9ydCB7IHNldHVwR2l0SHViU2V0dGluZ3MgfSBmcm9tICcuL2dpdGh1Yi9zZXR0aW5ncy5qcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZUdpdEh1YlRlbXBsYXRlcyB9IGZyb20gJy4vZ2l0aHViL3RlbXBsYXRlLmpzJztcbmltcG9ydCB7IG9wdGlvbnMgfSBmcm9tICcuL29wdGlvbnMuanMnO1xuaW1wb3J0IHsgZ2V0UGFja2FnZUNvbmZpZyB9IGZyb20gJy4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBzaG91bGRTa2lwUGFja2FnZSB9IGZyb20gJy4vdXRpbHMvcGFja2FnZVNraXBVdGlsLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5pbXBvcnQgeyBzcGF3blN5bmMgfSBmcm9tICcuL3V0aWxzL3NwYXduVXRpbC5qcyc7XG5cbmFzeW5jIGZ1bmN0aW9uIG1haW4oKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IGFyZ3YgPSBhd2FpdCB5YXJncyhwcm9jZXNzLmFyZ3Yuc2xpY2UoMikpXG4gICAgLmNvbW1hbmQoJyQwIFtwYXRocy4uXScsICdNYWtlIGEgZ2l2ZW4gcHJvamVjdCBmb2xsb3cgdGhlIFdpbGxCb29zdGVyIHN0YW5kYXJkJywgKHlhcmdzKSA9PiB7XG4gICAgICB5YXJncy5wb3NpdGlvbmFsKCdwYXRocycsIHtcbiAgICAgICAgZGVzY3JpYmU6ICdwcm9qZWN0IHBhdGhzIHRvIGJlIHdiZmllZCcsXG4gICAgICAgIGFycmF5OiB0cnVlLFxuICAgICAgICB0eXBlOiAnc3RyaW5nJyxcbiAgICAgICAgZGVmYXVsdDogWycuJ10sXG4gICAgICB9KTtcbiAgICB9KVxuICAgIC5vcHRpb25zKHtcbiAgICAgIGVudjoge1xuICAgICAgICBkZXNjcmlwdGlvbjogJ1VwbG9hZCBlbnZpcm9ubWVudCB2YXJpYWJsZXMgYXMgc2VjcmV0cyB0byBHaXRIdWInLFxuICAgICAgICB0eXBlOiAnYm9vbGVhbicsXG4gICAgICAgIGRlZmF1bHQ6IGZhbHNlLFxuICAgICAgICBhbGlhczogJ2UnLFxuICAgICAgfSxcbiAgICAgIHNraXBEZXBzOiB7XG4gICAgICAgIGRlc2NyaXB0aW9uOiAnU2tpcCBkZXBlbmRlbmN5IGluc3RhbGxhdGlvbicsXG4gICAgICAgIHR5cGU6ICdib29sZWFuJyxcbiAgICAgICAgZGVmYXVsdDogZmFsc2UsXG4gICAgICAgIGFsaWFzOiAnZCcsXG4gICAgICB9LFxuICAgICAgdmVyYm9zZToge1xuICAgICAgICBkZXNjcmlwdGlvbjogJ1doZXRoZXIgb3Igbm90IHRvIGVuYWJsZSB2ZXJib3NlIG1vZGUnLFxuICAgICAgICB0eXBlOiAnYm9vbGVhbicsXG4gICAgICAgIGRlZmF1bHQ6IGZhbHNlLFxuICAgICAgICBhbGlhczogJ3YnLFxuICAgICAgfSxcbiAgICB9KVxuICAgIC52ZXJzaW9uKGdldFZlcnNpb24oKSlcbiAgICAuc3RyaWN0KCkuYXJndjtcbiAgb3B0aW9ucy5pc1ZlcmJvc2UgPSBhcmd2LnZlcmJvc2U7XG4gIG9wdGlvbnMuZG9lc1VwbG9hZEVudlZhcnMgPSBhcmd2LmVudjtcblxuICBmb3IgKGNvbnN0IHJvb3REaXJQYXRoIG9mIGFyZ3YucGF0aHMgYXMgc3RyaW5nW10pIHtcbiAgICAvLyBDbGVhbiB1cCBsb2NrIGZpbGVzIGFuZCBub2RlX21vZHVsZXMgZGlyZWN0b3JpZXNcbiAgICBmcy5ybVN5bmMocGF0aC5qb2luKHJvb3REaXJQYXRoLCAnYnVuLmxvY2snKSwgeyBmb3JjZTogdHJ1ZSB9KTtcbiAgICBmcy5ybVN5bmMocGF0aC5qb2luKHJvb3REaXJQYXRoLCAneWFybi5sb2NrJyksIHsgZm9yY2U6IHRydWUgfSk7XG4gICAgcmVtb3ZlTm9kZU1vZHVsZXNEaXJlY3Rvcmllcyhyb290RGlyUGF0aCk7XG5cbiAgICBjb25zdCBwYWNrYWdlc0RpclBhdGggPSBwYXRoLmpvaW4ocm9vdERpclBhdGgsICdwYWNrYWdlcycpO1xuICAgIGNvbnN0IGRpcmVudHMgPSAoYXdhaXQgaWdub3JlRXJyb3JBc3luYygoKSA9PiBmcy5wcm9taXNlcy5yZWFkZGlyKHBhY2thZ2VzRGlyUGF0aCwgeyB3aXRoRmlsZVR5cGVzOiB0cnVlIH0pKSkgPz8gW107XG4gICAgY29uc3Qgc3ViRGlyUGF0aHMgPSBkaXJlbnRzLmZpbHRlcigoZCkgPT4gZC5pc0RpcmVjdG9yeSgpKS5tYXAoKGQpID0+IHBhdGguam9pbihwYWNrYWdlc0RpclBhdGgsIGQubmFtZSkpO1xuXG4gICAgYXdhaXQgZml4VGVzdERpcmVjdG9yaWVzVXBkYXRpbmdQYWNrYWdlSnNvbihbcm9vdERpclBhdGgsIC4uLnN1YkRpclBhdGhzXSk7XG5cbiAgICBjb25zdCByb290Q29uZmlnID0gYXdhaXQgZ2V0UGFja2FnZUNvbmZpZyhyb290RGlyUGF0aCk7XG4gICAgY29uc29sZS5sb2coJ3Jvb3RDb25maWc6Jywgcm9vdENvbmZpZyk7XG4gICAgaWYgKCFyb290Q29uZmlnKSB7XG4gICAgICBjb25zb2xlLmVycm9yKGB0aGVyZSBpcyBubyB2YWxpZCBwYWNrYWdlLmpzb24gaW4gJHtyb290RGlyUGF0aH1gKTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBjb25zdCBhYmJyZXZpYXRpb25Qcm9taXNlID0gZml4VHlwb3Mocm9vdENvbmZpZyk7XG5cbiAgICBjb25zdCBudWxsYWJsZVN1YlBhY2thZ2VDb25maWdzID0gYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgICBzdWJEaXJQYXRocy5tYXAoKHN1YkRpclBhdGgpID0+IGdldFBhY2thZ2VDb25maWcoc3ViRGlyUGF0aCwgcm9vdENvbmZpZykpXG4gICAgKTtcbiAgICBjb25zdCBzdWJQYWNrYWdlQ29uZmlncyA9IG51bGxhYmxlU3ViUGFja2FnZUNvbmZpZ3MuZmlsdGVyKChjb25maWcpID0+ICEhY29uZmlnKTtcbiAgICBjb25zdCBhbGxQYWNrYWdlQ29uZmlncyA9IFtyb290Q29uZmlnLCAuLi5zdWJQYWNrYWdlQ29uZmlnc107XG5cbiAgICBpZiAob3B0aW9ucy5pc1ZlcmJvc2UpIHtcbiAgICAgIGZvciAoY29uc3QgY29uZmlnIG9mIGFsbFBhY2thZ2VDb25maWdzKSB7XG4gICAgICAgIGNvbnNvbGUuaW5mbyhjb25maWcpO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIEluc3RhbGwgdG9vbHMgdmlhIGFzZGYgYXQgZmlyc3RcbiAgICBhd2FpdCBnZW5lcmF0ZVRvb2xWZXJzaW9ucyhyb290Q29uZmlnKTtcbiAgICAvLyBJbnN0YWxsIHlhcm4gYmVycnlcbiAgICBhd2FpdCBnZW5lcmF0ZVlhcm5yY1ltbChyb290Q29uZmlnKTtcbiAgICBpZiAocm9vdENvbmZpZy5pc0J1bikge1xuICAgICAgYXdhaXQgZ2VuZXJhdGVCdW5maWdUb21sKHJvb3RDb25maWcpO1xuICAgIH1cblxuICAgIGNvbnN0IHNob3VsZFJ1bldvcmtmbG93cyA9XG4gICAgICAhaXNSZXVzYWJsZVdvcmtmbG93c1JlcG8ocm9vdENvbmZpZy5yZXBvc2l0b3J5KSAmJlxuICAgICAgKHJvb3RDb25maWcucmVwb3NpdG9yeT8uc3RhcnRzV2l0aCgnZ2l0aHViOldpbGxCb29zdGVyLycpIHx8XG4gICAgICAgIHJvb3RDb25maWcucmVwb3NpdG9yeT8uc3RhcnRzV2l0aCgnZ2l0aHViOldpbGxCb29zdGVyTGFiLycpKTtcbiAgICBhd2FpdCBQcm9taXNlLmFsbChbXG4gICAgICBmaXhEb2NrZXJmaWxlKHJvb3RDb25maWcpLFxuICAgICAgZml4UHJpc21hRW52RmlsZXMocm9vdENvbmZpZyksXG4gICAgICBhYmJyZXZpYXRpb25Qcm9taXNlLnRoZW4oKCkgPT4gZ2VuZXJhdGVSZWFkbWUocm9vdENvbmZpZykpLFxuICAgICAgZ2VuZXJhdGVBZ2VudEluc3RydWN0aW9ucyhyb290Q29uZmlnLCBhbGxQYWNrYWdlQ29uZmlncyksXG4gICAgICBnZW5lcmF0ZURvY2tlcmlnbm9yZShyb290Q29uZmlnKSxcbiAgICAgIGdlbmVyYXRlRWRpdG9yY29uZmlnKHJvb3RDb25maWcpLFxuICAgICAgZ2VuZXJhdGVHZW1pbmlDb25maWcocm9vdENvbmZpZyksXG4gICAgICByZW1vdmVHZW1pbmlTZXR0aW5ncyhyb290Q29uZmlnKSxcbiAgICAgIGdlbmVyYXRlR2l0YXR0cmlidXRlcyhyb290Q29uZmlnKSxcbiAgICAgIGdlbmVyYXRlR2l0SHViVGVtcGxhdGVzKHJvb3RDb25maWcpLFxuICAgICAgZ2VuZXJhdGVJZGVhU2V0dGluZ3Mocm9vdENvbmZpZyksXG4gICAgICBnZW5lcmF0ZVJlbm92YXRlSnNvbihyb290Q29uZmlnKSxcbiAgICAgIGdlbmVyYXRlUmVsZWFzZXJjKHJvb3RDb25maWcpLFxuICAgICAgLi4uKHNob3VsZFJ1bldvcmtmbG93cyA/IFtnZW5lcmF0ZVdvcmtmbG93cyhyb290Q29uZmlnKV0gOiBbXSksXG4gICAgICBzZXR1cExhYmVscyhyb290Q29uZmlnKSxcbiAgICAgIHNldHVwU2VjcmV0cyhyb290Q29uZmlnKSxcbiAgICAgIHNldHVwR2l0SHViU2V0dGluZ3Mocm9vdENvbmZpZyksXG4gICAgICByb290Q29uZmlnLmlzQnVuXG4gICAgICAgID8gZ2VuZXJhdGVIdXNreXJjVXBkYXRpbmdQYWNrYWdlSnNvbihyb290Q29uZmlnKS50aGVuKCgpID0+IGdlbmVyYXRlTGVmdGhvb2tVcGRhdGluZ1BhY2thZ2VKc29uKHJvb3RDb25maWcpKVxuICAgICAgICA6IGdlbmVyYXRlSHVza3lyY1VwZGF0aW5nUGFja2FnZUpzb24ocm9vdENvbmZpZyksXG4gICAgICBnZW5lcmF0ZUxpbnRzdGFnZWRyYyhyb290Q29uZmlnKSxcbiAgICBdKTtcbiAgICBhd2FpdCBwcm9taXNlUG9vbC5wcm9taXNlQWxsKCk7XG5cbiAgICBjb25zdCBwcm9taXNlczogUHJvbWlzZTx2b2lkPltdID0gW107XG4gICAgZm9yIChjb25zdCBjb25maWcgb2YgYWxsUGFja2FnZUNvbmZpZ3MpIHtcbiAgICAgIGlmIChzaG91bGRTa2lwUGFja2FnZShjb25maWcsIHJvb3RDb25maWcpKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgaWYgKGNvbmZpZy5kb2VzQ29udGFpblR5cGVTY3JpcHQgfHwgY29uZmlnLmRvZXNDb250YWluVHlwZVNjcmlwdEluUGFja2FnZXMpIHtcbiAgICAgICAgcHJvbWlzZXMucHVzaChmaXhUeXBlRGVmaW5pdGlvbnMoY29uZmlnLCBjb25maWcuaXNSb290ID8gYWxsUGFja2FnZUNvbmZpZ3MgOiBbY29uZmlnXSkpO1xuICAgICAgfVxuICAgICAgaWYgKGNvbmZpZy5kZXBlbmRpbmcucGxheXdyaWdodFRlc3QpIHtcbiAgICAgICAgcHJvbWlzZXMucHVzaChmaXhQbGF5d3JpZ2h0Q29uZmlnKGNvbmZpZykpO1xuICAgICAgfVxuICAgICAgaWYgKGNvbmZpZy5kZXBlbmRpbmcubmV4dCkge1xuICAgICAgICBwcm9taXNlcy5wdXNoKGZpeE5leHRDb25maWdKc29uKGNvbmZpZykpO1xuICAgICAgfVxuICAgICAgYXdhaXQgZ2VuZXJhdGVHaXRpZ25vcmUoY29uZmlnLCByb290Q29uZmlnKTtcbiAgICAgIGF3YWl0IHByb21pc2VQb29sLnByb21pc2VBbGwoKTtcbiAgICAgIGlmICghY29uZmlnLmlzUm9vdCAmJiAhY29uZmlnLmRvZXNDb250YWluUGFja2FnZUpzb24pIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBhd2FpdCBnZW5lcmF0ZVByZXR0aWVyaWdub3JlKGNvbmZpZyk7XG4gICAgICBhd2FpdCBnZW5lcmF0ZVBhY2thZ2VKc29uKGNvbmZpZywgcm9vdENvbmZpZywgYXJndi5za2lwRGVwcyk7XG5cbiAgICAgIHByb21pc2VzLnB1c2goZ2VuZXJhdGVMaW50c3RhZ2VkcmMoY29uZmlnKSk7XG4gICAgICBpZiAoY29uZmlnLmRvZXNDb250YWluVnNjb2RlU2V0dGluZ3NKc29uICYmIGNvbmZpZy5kb2VzQ29udGFpblBhY2thZ2VKc29uKSB7XG4gICAgICAgIHByb21pc2VzLnB1c2goZ2VuZXJhdGVWc2NvZGVTZXR0aW5ncyhjb25maWcpKTtcbiAgICAgIH1cbiAgICAgIGlmIChjb25maWcuZG9lc0NvbnRhaW5UeXBlU2NyaXB0IHx8IGNvbmZpZy5kb2VzQ29udGFpblR5cGVTY3JpcHRJblBhY2thZ2VzKSB7XG4gICAgICAgIHByb21pc2VzLnB1c2goZ2VuZXJhdGVUc2NvbmZpZyhjb25maWcpKTtcbiAgICAgIH1cbiAgICAgIGlmIChcbiAgICAgICAgY29uZmlnLmRvZXNDb250YWluSmF2YVNjcmlwdCB8fFxuICAgICAgICBjb25maWcuZG9lc0NvbnRhaW5KYXZhU2NyaXB0SW5QYWNrYWdlcyB8fFxuICAgICAgICBjb25maWcuZG9lc0NvbnRhaW5UeXBlU2NyaXB0IHx8XG4gICAgICAgIGNvbmZpZy5kb2VzQ29udGFpblR5cGVTY3JpcHRJblBhY2thZ2VzXG4gICAgICApIHtcbiAgICAgICAgaWYgKHJvb3RDb25maWcuaXNCdW4pIHtcbiAgICAgICAgICBwcm9taXNlcy5wdXNoKGdlbmVyYXRlQmlvbWVKc29uYyhjb25maWcpKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIXJvb3RDb25maWcuaXNXaWxsQm9vc3RlckNvbmZpZ3MpIHtcbiAgICAgICAgICBwcm9taXNlcy5wdXNoKGdlbmVyYXRlRXNsaW50cmMoY29uZmlnKSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChjb25maWcuZGVwZW5kaW5nLnB5cmlnaHQpIHtcbiAgICAgICAgcHJvbWlzZXMucHVzaChnZW5lcmF0ZVB5cmlnaHRDb25maWdKc29uKGNvbmZpZykpO1xuICAgICAgfVxuICAgIH1cbiAgICBhd2FpdCBQcm9taXNlLmFsbChwcm9taXNlcyk7XG4gICAgYXdhaXQgcHJvbWlzZVBvb2wucHJvbWlzZUFsbCgpO1xuXG4gICAgY29uc3QgcGFja2FnZU1hbmFnZXIgPSByb290Q29uZmlnLmlzQnVuID8gJ2J1bicgOiAneWFybic7XG4gICAgLy8gUmVmcmVzaCBsb2NrIGZpbGVzXG4gICAgaWYgKHJvb3RDb25maWcuaXNCdW4pIHtcbiAgICAgIGZzLnJtU3luYyhwYXRoLmpvaW4ocm9vdERpclBhdGgsICdidW4ubG9jaycpLCB7IGZvcmNlOiB0cnVlIH0pO1xuICAgICAgc3Bhd25TeW5jKHBhY2thZ2VNYW5hZ2VyLCBbJ3VwZGF0ZSddLCByb290RGlyUGF0aCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGZzLnJtU3luYyhwYXRoLmpvaW4ocm9vdERpclBhdGgsICd5YXJuLmxvY2snKSwgeyBmb3JjZTogdHJ1ZSB9KTtcbiAgICAgIHNwYXduU3luYyhwYWNrYWdlTWFuYWdlciwgWydpbnN0YWxsJywgJy0tbm8taW1tdXRhYmxlJ10sIHJvb3REaXJQYXRoKTtcbiAgICB9XG4gICAgc3Bhd25TeW5jKHBhY2thZ2VNYW5hZ2VyLCBbJ2NsZWFudXAnXSwgcm9vdERpclBhdGgpO1xuICAgIC8vICd5YXJuIGluc3RhbGwnIHNob3VsZCBiZSBhZnRlciBgeWFybiBjbGVhbnVwYCBiZWNhdXNlIHlhcm4gYmVycnkgZ2VuZXJhdGVzIHlhcm4ubG9ja1xuICAgIC8vIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGNvbnRlbnRzIG9mIGRlcGVuZGFudCBzdWItcGFja2FnZSBpbiBtb25vcmVwb1xuICAgIGlmICghcm9vdENvbmZpZy5pc0J1bikge1xuICAgICAgc3Bhd25TeW5jKHBhY2thZ2VNYW5hZ2VyLCBbJ2luc3RhbGwnLCAnLS1uby1pbW11dGFibGUnXSwgcm9vdERpclBhdGgpO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiByZW1vdmVOb2RlTW9kdWxlc0RpcmVjdG9yaWVzKGRpclBhdGg6IHN0cmluZyk6IHZvaWQge1xuICBjb25zdCBub2RlTW9kdWxlc1BhdGhzID0gbmV3IFNldChbcGF0aC5qb2luKGRpclBhdGgsICdub2RlX21vZHVsZXMnKV0pO1xuICBjb25zdCBnbG9iYmVkUGF0aHMgPSBmZy5nbG9iU3luYygnKiovbm9kZV9tb2R1bGVzJywge1xuICAgIGN3ZDogZGlyUGF0aCxcbiAgICBkb3Q6IHRydWUsXG4gICAgb25seURpcmVjdG9yaWVzOiB0cnVlLFxuICAgIGZvbGxvd1N5bWJvbGljTGlua3M6IGZhbHNlLFxuICB9KTtcbiAgZm9yIChjb25zdCBub2RlTW9kdWxlc1BhdGggb2YgZ2xvYmJlZFBhdGhzKSB7XG4gICAgbm9kZU1vZHVsZXNQYXRocy5hZGQocGF0aC5yZXNvbHZlKGRpclBhdGgsIG5vZGVNb2R1bGVzUGF0aCkpO1xuICB9XG4gIGZvciAoY29uc3Qgbm9kZU1vZHVsZXNQYXRoIG9mIG5vZGVNb2R1bGVzUGF0aHMpIHtcbiAgICB0cnkge1xuICAgICAgZnMucm1TeW5jKG5vZGVNb2R1bGVzUGF0aCwgeyByZWN1cnNpdmU6IHRydWUsIGZvcmNlOiB0cnVlIH0pO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBjb25zb2xlLndhcm4oZXJyb3IpO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBnZXRWZXJzaW9uKCk6IHN0cmluZyB7XG4gIGxldCBwYWNrYWdlSnNvbkRpciA9IHBhdGguZGlybmFtZShuZXcgVVJMKGltcG9ydC5tZXRhLnVybCkucGF0aG5hbWUpO1xuICB3aGlsZSAoIWZzLmV4aXN0c1N5bmMocGF0aC5qb2luKHBhY2thZ2VKc29uRGlyLCAncGFja2FnZS5qc29uJykpKSB7XG4gICAgcGFja2FnZUpzb25EaXIgPSBwYXRoLmRpcm5hbWUocGFja2FnZUpzb25EaXIpO1xuICB9XG4gIGNvbnN0IHBhY2thZ2VKc29uID0gSlNPTi5wYXJzZShmcy5yZWFkRmlsZVN5bmMocGF0aC5qb2luKHBhY2thZ2VKc29uRGlyLCAncGFja2FnZS5qc29uJyksICd1dGY4JykpIGFzIHtcbiAgICB2ZXJzaW9uOiBzdHJpbmc7XG4gIH07XG4gIHJldHVybiBwYWNrYWdlSnNvbi52ZXJzaW9uO1xufVxuXG5hd2FpdCBtYWluKCk7XG4iXSwibmFtZXMiOlsib3B0aW9ucyIsImlzVmVyYm9zZSIsImRvZXNVcGxvYWRFbnZWYXJzIiwibG9nZ2VyIiwiZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbiIsIm5hbWUiLCJmdW5jIiwiY29uc29sZSIsImluZm8iLCJlcnJvciIsIkVycm9yIiwic3RhY2siLCJTdHJpbmciLCJhc3luYyIsImZpeERvY2tlcmZpbGUiLCJjb25maWciLCJkb2VzQ29udGFpbkRvY2tlcmZpbGUiLCJvbGRDb250ZW50IiwiZG9ja2VyZmlsZSIsIm5ld0NvbnRlbnQiLCJmcyIsIndyaXRlRmlsZSIsInBhdGgiLCJqb2luIiwiZGlyUGF0aCIsImZzVXRpbCIsInJlYWRGaWxlSWdub3JpbmdFcnJvciIsImZpbGVQYXRoIiwicHJvbWlzZXMiLCJyZWFkRmlsZSIsImdlbmVyYXRlRmlsZSIsImNvbnRlbnQiLCJta2RpciIsImRpcm5hbWUiLCJyZWN1cnNpdmUiLCJub3JtYWxpemVkQ29udGVudCIsInJlcGxhY2VBbGwiLCJ0cmltIiwicHJvbWlzZVBvb2wiLCJQcm9taXNlUG9vbCIsImZpeE5leHRDb25maWdKc29uIiwibWFwIiwiZXh0IiwicmVzb2x2ZSIsImZpbmQiLCJwIiwiZXhpc3RzU3luYyIsInJlcGxhY2UiLCJfIiwic2V0dGluZ3NUZXh0IiwiaW5jbHVkZXMiLCJydW4iLCJsaXRlcmFsIiwidmFsdWUiLCJraW5kIiwiYXNPYmplY3QiLCJkZWZhdWx0Q29uZmlnIiwiZm9yYmlkT25seSIsInJldHJpZXMiLCJ0aW1lb3V0IiwidXNlIiwiYWN0aW9uVGltZW91dCIsInRyYWNlIiwic2NyZWVuc2hvdCIsInZpZGVvIiwid29ya2VycyIsIndlYlNlcnZlciIsImNvbW1hbmQiLCJ1cmwiLCJyZXVzZUV4aXN0aW5nU2VydmVyIiwic3Rkb3V0Iiwic3RkZXJyIiwiZW52IiwiZ3JhY2VmdWxTaHV0ZG93biIsImZpeFBsYXl3cmlnaHRDb25maWciLCJtYXRjaCIsImV4ZWMiLCJvYmplY3RMaXRlcmFsIiwicGFyc2VkIiwic291cmNlIiwidHMiLCJjcmVhdGVTb3VyY2VGaWxlIiwiU2NyaXB0VGFyZ2V0IiwiTGF0ZXN0IiwiU2NyaXB0S2luZCIsIlRTIiwic3RhdGVtZW50Iiwic3RhdGVtZW50cyIsImlzVmFyaWFibGVTdGF0ZW1lbnQiLCJkZWNsYXJhdGlvbiIsImRlY2xhcmF0aW9uTGlzdCIsImRlY2xhcmF0aW9ucyIsImluaXRpYWxpemVyIiwiaXNPYmplY3RMaXRlcmFsRXhwcmVzc2lvbiIsInBhcnNlT2JqZWN0TGl0ZXJhbEV4cHJlc3Npb24iLCJwYXJzZU9iamVjdExpdGVyYWwiLCJuZXdPYmplY3RMaXRlcmFsIiwic3RyaW5naWZ5T2JqZWN0IiwibWVyZ2UiLCJhbGwiLCJwcm9wZXJ0eSIsInByb3BlcnRpZXMiLCJpc1Byb3BlcnR5QXNzaWdubWVudCIsImlzSWRlbnRpZmllciIsImlzU3RyaW5nTGl0ZXJhbCIsInBhcnNlRXhwcmVzc2lvbiIsInVuZGVmaW5lZCIsImdldFRleHQiLCJleHByZXNzaW9uIiwicGFyc2VkT2JqZWN0IiwiaXNBcnJheUxpdGVyYWxFeHByZXNzaW9uIiwiZWxlbWVudHMiLCJlbGVtZW50Iiwic29tZSIsInN0cmluZ2lmeVZhbHVlIiwibGV2ZWwiLCJ2YWx1ZXMiLCJsZW5ndGgiLCJpbmRlbnQiLCJyZXBlYXQiLCJsaW5lcyIsInN0cmluZ2lmaWVkIiwic3BsaXQiLCJhdCIsImluZGV4IiwiY2xvc2luZ0luZGVudCIsInN0cmluZ2lmeUFycmF5Iiwib2JqZWN0IiwiT2JqZWN0IiwiZW50cmllcyIsImtleSIsImdsb2JJZ25vcmUiLCJmaXhQcmlzbWFFbnZGaWxlcyIsImVudkZpbGVzIiwiZmciLCJnbG9iIiwiZG90IiwiY3dkIiwiaWdub3JlIiwiZW52RmlsZSIsImVudkZpbGVQYXRoIiwiZml4VGVzdERpcmVjdG9yaWVzVXBkYXRpbmdQYWNrYWdlSnNvbiIsInBhY2thZ2VEaXJQYXRocyIsIlByb21pc2UiLCJuZXdUZXN0RGlyUGF0aCIsInBhY2thZ2VEaXJQYXRoIiwib2xkVGVzdERpck5hbWUiLCJvbGRUZXN0RGlyUGF0aCIsInJlbmFtZSIsImZpeFR5cGVEZWZpbml0aW9ucyIsImNvbmZpZ3NJbmNsdWRpbmdDaGlsZHJlbiIsImxpYlR5cGVEaXJQYXRoIiwic3JjVHlwZURpclBhdGgiLCJpc1Jvb3QiLCJkb2VzQ29udGFpblN1YlBhY2thZ2VKc29ucyIsImRpcmVudHMiLCJpZ25vcmVFbm9lbnRBc3luYyIsInJlYWRkaXIiLCJ3aXRoRmlsZVR5cGVzIiwiZGlyZW50IiwiZGlyTmFtZSIsInNsaWNlIiwiaGFzVHlwZURlY2xhcmF0aW9uRXh0ZW5zaW9uIiwiZW5kc1dpdGgiLCJwYWNrYWdlTmFtZSIsImhhc0xpYnJhcnkiLCJwYWNrYWdlSnNvbiIsImRlcGVuZGVuY2llcyIsImRldkRlcGVuZGVuY2llcyIsImlzRmlsZSIsImlzRGlyZWN0b3J5Iiwib3ZlcndyaXRlTWVyZ2UiLCJkZXN0aW5hdGlvbkFycmF5Iiwic291cmNlQXJyYXkiLCJjb21iaW5lTWVyZ2UiLCJ0YXJnZXQiLCJkZXN0aW5hdGlvbiIsIml0ZW0iLCJjbG9uZVVubGVzc090aGVyd2lzZVNwZWNpZmllZCIsImlzTWVyZ2VhYmxlT2JqZWN0IiwicHVzaCIsInNvcnRLZXlzIiwib2JqIiwia2V5QW5kVmFsdWVzIiwidG9Tb3J0ZWQiLCJrZXkxIiwia2V5MiIsImxvY2FsZUNvbXBhcmUiLCJ3b3JrZmxvd3MiLCJ0ZXN0Iiwib24iLCJwdWxsX3JlcXVlc3QiLCJicmFuY2hlcyIsImNvbmN1cnJlbmN5IiwiZ3JvdXAiLCJwZXJtaXNzaW9ucyIsImNvbnRlbnRzIiwiam9icyIsInVzZXMiLCJhdXRvZml4IiwicmVsZWFzZSIsInB1bGxfcmVxdWVzdF90YXJnZXQiLCJ0eXBlcyIsInN5bmMiLCJpc3N1ZXMiLCJpZiIsIndpdGgiLCJzZWNyZXRzIiwiQ0xBVURFX0NPREVfT0FVVEhfVE9LRU4iLCJPUEVOQUlfQVBJX0tFWSIsIkdFTUlOSV9BUElfS0VZIiwiZ2VuZXJhdGVXb3JrZmxvd3MiLCJyb290Q29uZmlnIiwiZmlsZU5hbWVzVG9CZVJlbW92ZWQiLCJpc1JldXNhYmxlV29ya2Zsb3dzUmVwbyIsInJlcG9zaXRvcnkiLCJ3b3JrZmxvd3NQYXRoIiwic2VtYW50aWNZbWxQYXRoIiwicm0iLCJmb3JjZSIsImZpbGVOYW1lU2V0IiwiU2V0IiwiZmlsdGVyIiwiZGVwZW5kaW5nIiwic2VtYW50aWNSZWxlYXNlIiwiYWRkIiwiZGVsZXRlIiwiaXNQdWJsaWNSZXBvIiwiZmlsZU5hbWUiLCJiYXNlbmFtZSIsIndyaXRlV29ya2Zsb3dZYW1sIiwiZGVwcmVjYXRlZEZpbGVOYW1lIiwibmV3U2V0dGluZ3MiLCJjbG9uZURlZXAiLCJvbGRTZXR0aW5ncyIsInlhbWwiLCJsb2FkIiwiYXJyYXlNZXJnZSIsInN0YXJ0c1dpdGgiLCJtb3ZlVG9Cb3R0b20iLCJpc1JldXNhYmxlV29ya2Zsb3ciLCJqb2IiLCJub3JtYWxpemVKb2IiLCJzY2hlZHVsZSIsImJyYW5jaCIsIm1pZ3JhdGVXb3JrZmxvdyIsIndyaXRlWWFtbCIsInBhcmFtcyIsInN5bmNfcGFyYW1zX3dpdGhvdXRfZGVzdCIsIndvcmtmbG93X2Rpc3BhdGNoIiwiTlBNX1RPS0VOIiwiR0hfVE9LRU4iLCJpc0J1biIsIkZJUkVCQVNFX1RPS0VOIiwiR0NQX1NBX0tFWV9KU09OX0ZPUl9GSVJFQkFTRSIsIkRJU0NPUkRfV0VCSE9PS19VUkwiLCJzZXJ2ZXJfdXJsIiwiZG90X2Vudl9wYXRoIiwibm9uX3NlbGZfaG9zdGVkIiwibm90aWZ5X2Rpc2NvcmQiLCJyZXF1aXJlX2ZseSIsInJlcXVpcmVfZ2Nsb3VkIiwibGFiZWwiLCJsYWJlbE9wZXJhdG9yIiwiY2lfc2l6ZSIsImNpX2xhYmVsIiwibWlncmF0ZUpvYiIsIkZMWV9BUElfVE9LRU4iLCJkZXBsb3lfY29tbWFuZCIsImdpdGh1Yl9ob3N0ZWRfcnVubmVyIiwia2V5cyIsIm5ld1NlY3JldHMiLCJ5YW1sVGV4dCIsImR1bXAiLCJsaW5lV2lkdGgiLCJub0NvbXBhdE1vZGUiLCJzdHlsZXMiLCJmaXhUeXBvcyIsInBhY2thZ2VDb25maWciLCJkb2NGaWxlcyIsIm1kRmlsZSIsImZpeFR5cG9zSW5UZXh0IiwicmVwbGFjZVdpdGhDb25maWciLCJ0c0ZpbGVzIiwidHNGaWxlIiwiZml4VHlwb3NJbkNvZGUiLCJ0ZXh0QmFzZWRGaWxlcyIsImZpbGUiLCJwcm9taXNlQWxsIiwicHJvcE5hbWUiLCJiZWZvcmUiLCJhZnRlciIsIndiZnlKc29uIiwidHlwb3MiLCJnZW5lcmF0ZUFnZW50SW5zdHJ1Y3Rpb25zIiwiYWxsQ29uZmlncyIsImFnZW50c0V4dHJhUGF0aCIsImV4dHJhQ29udGVudCIsInRvb2xOYW1lIiwiZ2VuZXJhdGVBZ2VudEluc3RydWN0aW9uIiwiY3Vyc29yUnVsZXNQYXRoIiwiY3Vyc29yUnVsZXNDb250ZW50IiwiZnJvbnRtYXR0ZXIiLCJib2R5IiwiZ2VuZXJhdGVDdXJzb3JHZW5lcmFsTWRjQ29udGVudCIsInBhY2thZ2VNYW5hZ2VyIiwiYmFzZUNvbnRlbnQiLCJkZXNjcmlwdGlvbiIsImMiLCJnZW5JMThuVHMiLCJpc1dpbGxCb29zdGVyUmVwbyIsImhhc1N0YXJ0VGVzdCIsInJlYWN0IiwibmV4dCIsInRyaW1FbmQiLCJnaXRIdWJVdGlsIiwiZ2V0T3JnQW5kTmFtZSIsInVybE9yRnVsbE5hbWUiLCJ1cmxXaXRob3V0UHJvdG9jb2wiLCJuYW1lcyIsIm9jdG9raXRDYWNoZSIsIk1hcCIsImdldE9jdG9raXQiLCJvd25lciIsImNhY2hlZCIsImdldCIsIm9jdG9raXQiLCJPY3Rva2l0IiwiYXV0aCIsImdldEdpdEh1YlRva2VuIiwic2V0IiwiaGFzR2l0SHViVG9rZW4iLCJwcm9jZXNzIiwiR0hfQk9UX1BBVF9GT1JfV0lMTEJPT1NURVIiLCJHSF9CT1RfUEFUX0ZPUl9XSUxMQk9PU1RFUkxBQiIsIkdJVEhVQl9UT0tFTiIsInNwYXduU3luYyIsImFyZ3MiLCJyZXRyeSIsIm5ld0NtZCIsIm5ld0FyZ3MiLCJnZXRTcGF3blN5bmNBcmdzIiwiY2hpbGRfcHJvY2VzcyIsInN0YXR1cyIsInNwYXduU3luY1dpdGhTdHJpbmdSZXN1bHQiLCJzdGRpbyIsInByb2MiLCJ0b1N0cmluZyIsInMiLCJQQVRIIiwiQkVSUllfQklOX0ZPTERFUiIsIkFTREZfRElSIiwic2hlbGwiLCJjb252ZXJ0VmVyc2lvbkludG9OdW1iZXIiLCJ2ZXJzaW9uIiwibnVtYmVycyIsIk51bWJlciIsIm51bSIsImlzTmFOIiwidmVyc2lvbk51bWJlciIsImRpdmlzb3IiLCJQWVRIT05fVkVSU0lPTiIsIkpBVkFfVkVSU0lPTiIsImdlbmVyYXRlVG9vbFZlcnNpb25zIiwidmVyc2lvbnNUZXh0IiwiZHVwbGljYXRhYmxlTGluZXMiLCJsaW5lIiwiQ09SRV9UT09MUyIsImhhcyIsImRvZXNDb250YWluUG9ldHJ5TG9jayIsInJlc3BvbnNlIiwiZmV0Y2giLCJqc29uIiwicG9ldHJ5VmVyc2lvbiIsInVwZGF0ZVZlcnNpb24iLCJmaXJlYmFzZSIsImRvZXNDb250YWluUGFja2FnZUpzb24iLCJidW5WZXJzaW9uIiwib3JnYW5pemF0aW9uIiwicmVxdWVzdCIsInJlcG8iLCJkYXRhIiwidGFnX25hbWUiLCJsYXN0SW5kZXhPZiIsInZlcnNpb25OdW1iZXJUZXh0IiwiZ2V0TGF0ZXN0VmVyc2lvbkZyb21UYWdPbkdpdEh1YiIsInByZWZpeCIsIkRFUFJFQ0FURURfVkVSU0lPTl9QUkVGSVhFUyIsInZlcnNpb25QYXRoIiwidG9vbFZlcnNpb25zUGF0aCIsImNvcmUiLCJuZXdWZXJzaW9uIiwiaGVhZCIsImZpbmRJbmRleCIsImwiLCJuZXdMaW5lIiwic3BsaWNlIiwiZ2VuZXJhdGVCaW9tZUpzb25jIiwicm9vdCIsIiRzY2hlbWEiLCJleHRlbmRzIiwiSlNPTiIsInBhcnNlIiwic3RyaW5naWZ5IiwiZ2VuZXJhdGVCdW5maWdUb21sIiwicmVhZEZpbGVTeW5jIiwidXNlckNvbnRlbnRIZWFkZXIiLCJ1c2VyQ29udGVudEhlYWRlclJlZ2V4Iiwic2VwYXJhdG9yIiwiZGVmYXVsdEhlYWRVc2VyQ29udGVudCIsImRlZmF1bHRUYWlsVXNlckNvbnRlbnQiLCJpZ25vcmVGaWxlVXRpbCIsInNlcGFyYXRvclByZWZpeCIsInJlYWRHaXRpZ25vcmVXaXRob3V0U2VwYXJhdG9ycyIsImxhc3RIZWFkZXJJbmRleCIsImdldEluZGV4T2ZUYWlsVXNlckNvbnRlbnRIZWFkZXIiLCJnZXRIZWFkVXNlckNvbnRlbnQiLCJpbmRleE9mIiwidGhpcyIsImdldFRhaWxVc2VyQ29udGVudCIsImlzQmVycnlaZXJvSW5zdGFsbEVuYWJsZWQiLCJsYXN0SW5kZXgiLCJnZW5lcmF0ZURvY2tlcmlnbm9yZSIsImV4dGVuc2lvbnMiLCJjb2RlV2l0aDJJbmRlbnRTaXplIiwiY29kZVdpdGg0SW5kZW50U2l6ZSIsIm1hcmtkb3duTGlrZSIsImVzbGludCIsInByZXR0aWVyIiwiYmlvbWUiLCJnZW5lcmF0ZUV4dGVuc2lvbnMiLCJnZW5lcmF0ZUVkaXRvcmNvbmZpZyIsImdlbmVyYXRlRXNsaW50cmMiLCJlc2xpbnRCYXNlIiwiaGF2ZV9mdW4iLCJjb2RlX3JldmlldyIsImRpc2FibGUiLCJjb21tZW50X3NldmVyaXR5X3RocmVzaG9sZCIsIm1heF9yZXZpZXdfY29tbWVudHMiLCJwdWxsX3JlcXVlc3Rfb3BlbmVkIiwiaGVscCIsInN1bW1hcnkiLCJpZ25vcmVfcGF0dGVybnMiLCJnZW5lcmF0ZUdlbWluaUNvbmZpZyIsImNvbmZpZ0ZpbGVQYXRoIiwic3R5bGVndWlkZUZpbGVQYXRoIiwibmV3Q29uZmlnIiwib2xkQ29uZmlnIiwieWFtbENvbnRlbnQiLCJyZW1vdmVHZW1pbmlTZXR0aW5ncyIsImdlbmVyYXRlR2l0YXR0cmlidXRlcyIsImRlZmF1bHROYW1lcyIsImdlbmVyYXRlR2l0aWdub3JlIiwiaGVhZFVzZXJDb250ZW50IiwidGFpbFVzZXJDb250ZW50IiwiZG9lc0NvbnRhaW5HZW1maWxlIiwiZG9lc0NvbnRhaW5Hb01vZCIsImRvZXNDb250YWluUG9tWG1sIiwiZG9lc0NvbnRhaW5QdWJzcGVjWWFtbCIsImRvZXNDb250YWluVGVtcGxhdGVZYW1sIiwiYmxpdHoiLCJwcmlzbWEiLCJwbGF5d3JpZ2h0VGVzdCIsInJlYWN0TmF0aXZlIiwic3Rvcnlib29rIiwibGl0ZXN0cmVhbSIsImdlbmVyYXRlZCIsInJlYWRDYWNoZSIsInJlc3BvbnNlVGV4dCIsInRleHQiLCJvayIsIndyaXRlQ2FjaGUiLCJvcyIsImhvbWVkaXIiLCJzdGF0IiwiRGF0ZSIsIm5vdyIsIm10aW1lTXMiLCJnZXRMYXRlc3RDb21taXRIYXNoIiwicmVwb1VybCIsImNvbW1pdEhhc2giLCJyZWplY3QiLCJFc2xpbnRVdGlsIiwiZ2V0TGludEZpeFN1ZmZpeCIsImRvZXNDb250YWluSnN4T3JUc3giLCJqc0NvbW1vbkRlcHMiLCJ0c0NvbW1vbkRlcHMiLCJyZWFjdENvbW1vbkRlcHMiLCJlc2xpbnREZXBzIiwiZ2VuZXJhdGVQYWNrYWdlSnNvbiIsInNraXBBZGRpbmdEZXBzIiwianNvblRleHQiLCJqc29uT2JqIiwic2NyaXB0cyIsInBlZXJEZXBlbmRlbmNpZXMiLCJhdXRob3IiLCJ0c2xpYiIsImxlcm5hIiwicGluc3QiLCJyZW1vdmVEZXByZWNhdGVkU3R1ZmYiLCJnZW5lcmF0ZVNjcmlwdHMiLCJwcmV0dGlmeSIsImV4aXN0aW5nQ29udGVudCIsIm9yaWdpbmFsQ29udGVudCIsImdlbmVyYXRlUHJldHRpZXJTdWZmaXgiLCJwb2V0cnlEZXZEZXBlbmRlbmNpZXMiLCJodXNreSIsInByZXBhcmUiLCJwb3N0aW5zdGFsbCIsImlzUmVmZXJyZWRCeU90aGVyUmVwbyIsInByZXBhY2siLCJwb3N0cGFjayIsImFydGlsbGVyeSIsInBsYXl3cmlnaHQiLCJ3b3Jrc3BhY2VzIiwiQXJyYXkiLCJpc0FycmF5Iiwid29ya3NwYWNlIiwiZ2xvYlN5bmMiLCJ3YiIsImRvZXNDb250YWluSmF2YVNjcmlwdCIsImRvZXNDb250YWluSmF2YVNjcmlwdEluUGFja2FnZXMiLCJkb2VzQ29udGFpblR5cGVTY3JpcHQiLCJkb2VzQ29udGFpblR5cGVTY3JpcHRJblBhY2thZ2VzIiwibWljcm9tYXRjaCIsImlzV2lsbEJvb3N0ZXJDb25maWdzIiwiZGVwIiwicHJpdmF0ZSIsImxpY2Vuc2UiLCJwdWJsaXNoQ29uZmlnIiwiYWNjZXNzIiwibWFpbiIsInJlc29sdXRpb25zIiwibGludCIsInNjcmlwdE5hbWUiLCJzY3JpcHQiLCJkaXJzIiwiZGlyIiwiZm9ybWF0IiwicHl0aG9uRmlsZXMiLCJkaXJOYW1lU2V0IiwicHl0aG9uRmlsZSIsImZpcnN0Iiwic2Vjb25kIiwic2l6ZSIsImRpck5hbWVzU3RyIiwicGFja2FnZU5hbWVzIiwiaXNXb3Jrc3BhY2VQYWNrYWdlIiwidXBkYXRlUHJpdmF0ZVBhY2thZ2VzIiwibmV3SnNvblRleHQiLCJvbGRBbmROZXdTY3JpcHROYW1lcyIsIm9sZE5hbWUiLCJuZXdOYW1lIiwiZmlsZXMiLCJmaXhTY3JpcHROYW1lcyIsIm9sZFNjcmlwdHMiLCJoYXNUeXBlY2hlY2siLCJjbGVhbnVwIiwidHlwZWNoZWNrIiwib2xkVGVzdCIsInB5cmlnaHQiLCJwcmVDb21taXQiLCJwcmVQdXNoIiwicHJlUHVzaEZvckxhYiIsInByZVB1c2hGb3JMYWJFeGNlcHRBZG1pbiIsInBvc3RNZXJnZSIsImdlbmVyYXRlSHVza3lyY1VwZGF0aW5nUGFja2FnZUpzb24iLCJwYWNrYWdlSnNvblBhdGgiLCJwb3N0cHVibGlzaCIsInByZXB1Ymxpc2hPbmx5IiwicHJlQ29tbWl0RmlsZVBhdGgiLCJ0b0xvY2FsZUxvd2VyQ2FzZSIsIm1vZGUiLCJwb3N0TWVyZ2VDb21tYW5kIiwiZ2VuZXJhdGVQb3N0TWVyZ2VDb21tYW5kcyIsInBvc3RNZXJnZUNvbW1hbmRzIiwicmF3IiwiaW5zdGFsbENvbW1hbmQiLCJybU5leHREaXJlY3RvcnkiLCJjcmVhdGVUYXNrT3B0aW9ucyIsInJ1bm5lciIsImV4dGVuc2lvbiIsInByZXR0aWVyQ29udGVudCIsImJpb21lQ29udGVudCIsImdlbmVyYXRlSWRlYVNldHRpbmdzIiwiY29tbWFuZHMiLCJnZW5lcmF0ZUxlZnRob29rVXBkYXRpbmdQYWNrYWdlSnNvbiIsInNldHRpbmdzIiwibWtkaXJTeW5jIiwic3JjRGlyZWN0b3JpZXMiLCJub2RlIiwiZ2VuZXJhdGVMaW50c3RhZ2VkcmMiLCJwYWNrYWdlUHJlZml4IiwiZ2V0RXNsaW50S2V5IiwicGFja2FnZXNGaWx0ZXIiLCJnZXRFc2xpbnRGaWx0ZXJGb3JQcmV0dGllciIsImdldFNyY0RpcnMiLCJnZW5lcmF0ZVByZXR0aWVyaWdub3JlIiwiZ2l0aWdub3JlRmlsZVBhdGgiLCJnaXRpZ25vcmVDb250ZW50IiwiYWRkaXRpb25hbENvbnRlbnQiLCJ2ZW52UGF0aCIsInZlbnYiLCJnZW5lcmF0ZVB5cmlnaHRDb25maWdKc29uIiwiZ2VuZXJhdGVSZWFkbWUiLCJpbnNlcnRCYWRnZSIsImZpbGVOYW1lcyIsInJlYWRkaXJTeW5jIiwiYmFkZ2VOYW1lIiwidG9VcHBlckNhc2UiLCJiYWRnZSIsInJlYWRtZSIsImkiLCJnZW5lcmF0ZVJlbGVhc2VyYyIsInBsdWdpbnMiLCJwbHVnaW4iLCJwcmVzZXQiLCJmYWlsQ29tbWVudCIsIl8xIiwic3VjY2Vzc0NvbW1lbnQiLCJfMiIsImNsZWFuT2xkQ29uZmlnIiwic3VjY2Vzc0NvbW1lbnRDb25kaXRpb24iLCJmYWlsQ29tbWVudENvbmRpdGlvbiIsImxhYmVscyIsInJlbGVhc2VkTGFiZWxzIiwiZ2VuZXJhdGVSZW5vdmF0ZUpzb24iLCJwYWNrYWdlUnVsZXMiLCJydWxlIiwibWF0Y2hQYWNrYWdlTmFtZXMiLCJlbmFibGVkIiwicm9vdEpzb25PYmoiLCJjb21waWxlck9wdGlvbnMiLCJtb2R1bGUiLCJtb2R1bGVSZXNvbHV0aW9uIiwianN4IiwiYWx3YXlzU3RyaWN0Iiwic3RyaWN0Iiwibm9VbmNoZWNrZWRJbmRleGVkQWNjZXNzIiwic2tpcExpYkNoZWNrIiwiYWxsb3dTeW50aGV0aWNEZWZhdWx0SW1wb3J0cyIsImVzTW9kdWxlSW50ZXJvcCIsInJlc29sdmVKc29uTW9kdWxlIiwic291cmNlTWFwIiwiaW1wb3J0SGVscGVycyIsImVyYXNhYmxlU3ludGF4T25seSIsIm91dERpciIsInR5cGVSb290cyIsImV4Y2x1ZGUiLCJpbmNsdWRlIiwic3ViSnNvbk9iaiIsImdlbmVyYXRlVHNjb25maWciLCJkb2VzQ29udGFpbkpzeE9yVHN4SW5QYWNrYWdlcyIsImlzRXNtUGFja2FnZSIsInNvcnQiLCJleHBlcmltZW50YWxEZWNvcmF0b3JzIiwiZXhjbHVkZUZpbGVQYXR0ZXJucyIsImdlbmVyYXRlVnNjb2RlU2V0dGluZ3MiLCJleGNsdWRlRmlsZVBhdHRlcm4iLCJleGNsdWRlU2V0dGluZyIsImdlbmVyYXRlWWFybnJjWW1sIiwieWFybnJjWW1sUGF0aCIsImN1cnJlbnRWZXJzaW9uIiwibGF0ZXN0VmVyc2lvbiIsInZlcnNpb25zSnNvbiIsImdldExhdGVzdFZlcnNpb24iLCJnZXRNYWpvck51bWJlciIsInJlbGVhc2VzUGF0aCIsInlhcm5yY1BhdGgiLCJkZWZhdWx0U2VtdmVyUmFuZ2VQcmVmaXgiLCJub2RlTGlua2VyIiwibm1Nb2RlIiwibnBtTWluaW1hbEFnZUdhdGUiLCJucG1QcmVhcHByb3ZlZFBhY2thZ2VzIiwiY29tcHJlc3Npb25MZXZlbCIsImluamVjdEVudmlyb25tZW50RmlsZXMiLCJlbmFibGVHbG9iYWxDYWNoZSIsIm9yaWdpbmFsTGVuZ3RoIiwicGx1Z2luUGF0aCIsIm1ham9yIiwic2V0dXBMYWJlbHMiLCJzZXR1cExhYmVsIiwiZGVsZXRlTGFiZWwiLCJ3YXJuIiwiY29sb3IiLCJERVBSRUNBVEVEX1NFQ1JFVF9OQU1FUyIsInNldHVwU2VjcmV0cyIsImRvdGVudiIsInNlY3JldE5hbWUiLCJzZWNyZXRfbmFtZSIsImtleV9pZCIsImtleUlkIiwic29kaXVtIiwicmVhZHkiLCJzZWNyZXQiLCJyYXdLZXkiLCJmcm9tX2Jhc2U2NCIsImJhc2U2NF92YXJpYW50cyIsIk9SSUdJTkFMIiwicmF3U2VjIiwiZnJvbV9zdHJpbmciLCJlbmNCeXRlcyIsImNyeXB0b19ib3hfc2VhbCIsImVuY0Jhc2U2NCIsInRvX2Jhc2U2NCIsImVuY3J5cHRlZF92YWx1ZSIsInNldHVwR2l0SHViU2V0dGluZ3MiLCJ3aXRoUmV0cnkiLCJhbGxvd19hdXRvX21lcmdlIiwiYWxsb3dfbWVyZ2VfY29tbWl0IiwiYWxsb3dfc3F1YXNoX21lcmdlIiwiYWxsb3dfcmViYXNlX21lcmdlIiwiYWxsb3dfdXBkYXRlX2JyYW5jaCIsImRlbGV0ZV9icmFuY2hfb25fbWVyZ2UiLCJzcXVhc2hfbWVyZ2VfY29tbWl0X3RpdGxlIiwic3F1YXNoX21lcmdlX2NvbW1pdF9tZXNzYWdlIiwiaGVhZGVycyIsInRlbXBsYXRlcyIsImdlbmVyYXRlR2l0SHViVGVtcGxhdGVzIiwiZGlzdGFuY2UiLCJ3YmZ5SnNvblNjaGVtYSIsInoiLCJyZWNvcmQiLCJzdHJpbmciLCJvcHRpb25hbCIsImRvYyIsImdldFBhY2thZ2VDb25maWciLCJlc21QYWNrYWdlIiwicGFja2FnZUpzb25UZXh0IiwidHlwZSIsInJlbGVhc2VCcmFuY2hlcyIsInJlbGVhc2VQbHVnaW5zIiwicmVsZWFzZXJjSnNvblBhdGgiLCJmc3AiLCJmbGF0IiwicmVwb0luZm8iLCJnaXQiLCJzaW1wbGVHaXQiLCJvcmlnaW4iLCJnZXRSZW1vdGVzIiwiciIsInJlbW90ZVVybCIsInJlZnMiLCJyZXF1ZXN0UmVwb0luZm8iLCJtZXNzYWdlIiwiZmV0Y2hSZXBvSW5mbyIsIm5vZGVWZXJzaW9uQ29udGVudCIsIndiZnlKc29uUGF0aCIsIndiZnlKc29uVGV4dCIsImZ1bGxfbmFtZSIsIkJvb2xlYW4iLCJzZXAiLCJjb250YWluc0FueSIsImRvZXNDb250YWluVnNjb2RlU2V0dGluZ3NKc29uIiwiZ2l0aHViIiwibnBtIiwiZ2V0RXNsaW50RXh0ZW5zaW9uQmFzZSIsInBhdHRlcm4iLCJvcmciLCJyZXQiLCJhc3NpZ24iLCJzaG91bGRTa2lwUGFja2FnZSIsInJlbW92ZU5vZGVNb2R1bGVzRGlyZWN0b3JpZXMiLCJub2RlTW9kdWxlc1BhdGhzIiwiZ2xvYmJlZFBhdGhzIiwib25seURpcmVjdG9yaWVzIiwiZm9sbG93U3ltYm9saWNMaW5rcyIsIm5vZGVNb2R1bGVzUGF0aCIsInJtU3luYyIsImFyZ3YiLCJ5YXJncyIsInBvc2l0aW9uYWwiLCJkZXNjcmliZSIsImFycmF5IiwiZGVmYXVsdCIsImFsaWFzIiwic2tpcERlcHMiLCJ2ZXJib3NlIiwicGFja2FnZUpzb25EaXIiLCJVUkwiLCJwYXRobmFtZSIsImdldFZlcnNpb24iLCJyb290RGlyUGF0aCIsInBhdGhzIiwicGFja2FnZXNEaXJQYXRoIiwic3ViRGlyUGF0aHMiLCJpZ25vcmVFcnJvckFzeW5jIiwiZCIsImFiYnJldmlhdGlvblByb21pc2UiLCJzdWJQYWNrYWdlQ29uZmlncyIsInN1YkRpclBhdGgiLCJhbGxQYWNrYWdlQ29uZmlncyIsInNob3VsZFJ1bldvcmtmbG93cyIsInRoZW4iXSwibWFwcGluZ3MiOiJtb0JBS08sTUFBTUEsRUFBVSxJQUx2QixNQUNFQyxXQUFZLEVBQ1pDLG1CQUFvQixHQ2dCZixNQUFNQyxFQUFTLElBaEJ0QixNQUNFLCtCQUFNQyxDQUEwQkMsRUFBY0MsR0FDeENOLEVBQVFDLFdBQ1ZNLFFBQVFDLEtBQUssYUFB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
1
+ import e from"node:fs";import t from"node:path";import{ignoreEnoentAsync as n,withRetry as s,ignoreErrorAsync as i}from"@willbooster/shared-lib";import o from"fast-glob";import r from"yargs";import a from"node:fs/promises";import{PromisePool as c}from"minimal-promise-pool";import l from"deepmerge";import p from"typescript";import d from"js-yaml";import u from"lodash.clonedeep";import{Octokit as m}from"@octokit/core";import f from"node:child_process";import g from"node:os";import h from"dotenv";import y from"libsodium-wrappers";import{distance as w}from"fastest-levenshtein";import{simpleGit as b}from"simple-git";import{z as v}from"zod";const k=new class{isVerbose=!1;doesUploadEnvVars=!1};const x=new class{async functionIgnoringException(e,t){k.isVerbose&&console.info(`--------- ${e} start ---------`);try{await t()}catch(t){console.info(`Error occurred in ${e}: ${t instanceof Error?t.stack:String(t)}}`)}k.isVerbose&&console.info(`---------- ${e} end ----------`)}};async function _(e){return x.functionIgnoringException("fixDockerfile",async()=>{if(!e.doesContainDockerfile)return;const n=e.dockerfile,s=n;n!==s&&await a.writeFile(t.join(e.dirPath,"Dockerfile"),s)})}const j={async readFileIgnoringError(t){try{return await e.promises.readFile(t,"utf8")}catch{}},async generateFile(n,s){await e.promises.mkdir(t.dirname(n),{recursive:!0});let i=s.replaceAll("\r\n","\n").trim();i&&(i+="\n"),await e.promises.writeFile(n,i)}},S=new c;async function P(n){return x.functionIgnoringException("fixNextConfigJson",async()=>{const s=["js","mjs","cjs"].map(e=>t.resolve(n.dirPath,`next.config.${e}`)).find(t=>e.existsSync(t));if(!s)return;const i=(await e.promises.readFile(s,"utf8")).replace(/=\s*{([\S\s]*)};/,(e,t)=>(t.includes("eslint:")||(t+="eslint: { ignoreDuringBuilds: true },"),t.includes("typescript:")||(t+="typescript: { ignoreBuildErrors: true },"),`= {${t}};`));await S.run(()=>j.generateFile(s,i))})}const $=e=>({kind:"literal",value:e}),C=e=>({kind:"object",value:e}),F={forbidOnly:$("!!process.env.CI"),retries:$("process.env.PWDEBUG ? 0 : process.env.CI ? 5 : 1"),timeout:$("120_000"),use:C({actionTimeout:$("10_000"),trace:$("process.env.CI ? 'on-first-retry' : 'retain-on-failure'"),screenshot:$("process.env.CI ? 'only-on-failure' : 'only-on-failure'"),video:$("process.env.CI ? 'retain-on-failure' : 'retain-on-failure'")}),workers:$("process.env.PWDEBUG ? 1 : undefined"),webServer:C({command:$("'yarn start-test-server'"),url:$("process.env.NEXT_PUBLIC_BASE_URL"),reuseExistingServer:$("!!process.env.CI"),timeout:$("300_000"),stdout:$("'ignore'"),stderr:$("'pipe'"),env:$("{\n ...process.env,\n PRISMA_USER_CONSENT_FOR_DANGEROUS_AI_ACTION: 'true',\n}"),gracefulShutdown:$("{\n signal: 'SIGTERM',\n timeout: 500,\n}")})};async function E(n){return x.functionIgnoringException("fixPlaywrightConfig",async()=>{const s=t.resolve(n.dirPath,"playwright.config.ts");if(!e.existsSync(s))return;const i=await e.promises.readFile(s,"utf8"),o=/defineConfig\s*\(\s*(\{[\s\S]*?})\s*\);?/.exec(i),r=o?.[1];if(!r)return;const a=function(e){const t=p.createSourceFile("playwright-config.ts",`const config = ${e};`,p.ScriptTarget.Latest,!0,p.ScriptKind.TS),n=t.statements[0];if(!n||!p.isVariableStatement(n))return;const s=n.declarationList.declarations[0];if(!s?.initializer||!p.isObjectLiteralExpression(s.initializer))return;return O(s.initializer,t)}(r);if(!a)return;const c=A(l.all([F,a,F]),0),d=i.replace(r,c);await S.run(()=>j.generateFile(s,d))})}function O(e,t){const n={};for(const s of e.properties){if(!p.isPropertyAssignment(s)||!p.isIdentifier(s.name)&&!p.isStringLiteral(s.name))return;const e=B(s.initializer,t);if(void 0===e)return;n[s.name.getText(t)]=e}return n}function B(e,t){if(p.isObjectLiteralExpression(e)){const n=O(e,t);return n?C(n):$(e.getText(t))}if(p.isArrayLiteralExpression(e)){const n=e.elements.map(e=>B(e,t));return n.some(e=>void 0===e)?$(e.getText(t)):{kind:"array",value:n}}return $(e.getText(t))}function I(e,t){return"array"===e.kind?function(e,t){if(0===e.length)return"[]";const n=" ".repeat(t+1),s=e.map(e=>{const s=I(e,t+1).split("\n");if(s[s.length-1]=`${s.at(-1)},`,"literal"===e.kind)for(let e=1;e<s.length;e+=1)s[e]=`${n}${s[e]}`;return s[0]=`${n}${s[0]}`,s.join("\n")}),i=" ".repeat(t);return`[\n${s.join("\n")}\n${i}]`}(e.value,t):"literal"===e.kind?e.value:A(e.value,t)}function A(e,t){const n=" ".repeat(t+1),s=Object.entries(e).map(([e,s])=>{const i=I(s,t+1).split("\n");if(i[i.length-1]=`${i.at(-1)},`,"literal"===s.kind)for(let e=1;e<i.length;e+=1)i[e]=`${n}${i[e]}`;return i[0]=`${n}${e}: ${i[0]}`,i.join("\n")}),i=" ".repeat(t);return 0===s.length?`{\n${i}}`:`{\n${s.join("\n")}\n${i}}`}const T=["**/node_modules/**","**/.venv/**","**/test-fixtures/**","**/test/fixtures/**","**/dist/**","**/build/**","**/target/**","**/temp/**","**/tmp/**"];async function D(e){return x.functionIgnoringException("fixPrismaEnvFiles",async()=>{const n=await o.glob(["*.env","*.env.*"],{dot:!0,cwd:e.dirPath,ignore:T});for(const s of n){const n=t.resolve(e.dirPath,s),i=(await a.readFile(n,"utf8")).replace(/DATABASE_URL="?(.+\.sqlite3)"?[\n$]/,'DATABASE_URL="$1?connection_limit=1"\n');await a.writeFile(n,i)}})}async function R(n){return x.functionIgnoringException("fixTestDirectoriesUpdatingPackageJson",async()=>{await Promise.all(n.map(async n=>{const s=t.join(n,"test");for(const i of["__tests__","tests"]){const o=t.join(n,i);try{await e.promises.rename(o,s);const r=await e.promises.readFile(t.join(n,"package.json"),"utf8"),a=r.replaceAll(i,"test");if(r===a)return;await e.promises.writeFile(t.join(n,"package.json"),a)}catch{}}}))})}async function W(e,s){return x.functionIgnoringException("fixTypeDefinitions",async()=>{const i=t.resolve(e.dirPath,"@types"),o=e.isRoot&&e.doesContainSubPackageJsons?void 0:t.resolve(e.dirPath,"src","types"),r=await n(()=>a.readdir(i,{withFileTypes:!0}));if(r)for(const e of r){const r=e.name.slice(0,-5),c=e.name.endsWith(".d.ts");let l=c?r:e.name;l.includes("__")&&(l=`@${l.replace("__","/")}`);const p=s.some(e=>e.packageJson?.dependencies?.[l]||e.packageJson?.devDependencies?.[l]);e.isFile()&&c?p?(await a.mkdir(t.join(i,r)),await S.run(()=>a.rename(t.join(i,e.name),t.join(i,r,"index.d.ts")))):o&&(await a.mkdir(o,{recursive:!0}),await S.run(()=>a.rename(t.join(i,e.name),t.join(o,e.name)))):e.isDirectory()&&o&&!p&&(await a.mkdir(o,{recursive:!0}),await S.run(()=>n(()=>a.rename(t.join(i,e.name,"index.d.ts"),t.join(o,`${e.name}.d.ts`)))))}})}function L(e,t){return t}function N(e,t,n){const s=[...e];for(const[i,o]of t.entries())void 0===s[i]?s[i]=n.cloneUnlessOtherwiseSpecified(o,n):n.isMergeableObject(o)?s[i]=l(e[i],o,n):e.includes(o)||s.push(o);return s}function J(e){const t=Object.entries(e).toSorted(([e],[t])=>e.localeCompare(t));for(const[n,s]of t)delete e[n],e[n]=s,"object"==typeof s&&null!==s&&J(s);return e}const G={test:{name:"Test",on:{pull_request:null,push:{branches:["main","wbfy"]}},concurrency:{group:"${{ github.workflow }}-${{ github.ref }}","cancel-in-progress":!0},permissions:{contents:"write"},jobs:{test:{uses:"WillBooster/reusable-workflows/.github/workflows/test.yml@main"}}},autofix:{name:"Fix code automatically",on:{pull_request:null},concurrency:{group:"${{ github.workflow }}-${{ github.ref }}","cancel-in-progress":!0},jobs:{test:{uses:"WillBooster/reusable-workflows/.github/workflows/autofix.yml@main"}}},release:{name:"Release",on:{push:{branches:[]}},concurrency:{group:"${{ github.workflow }}","cancel-in-progress":!1},permissions:{"id-token":"write",contents:"write"},jobs:{release:{uses:"WillBooster/reusable-workflows/.github/workflows/release.yml@main"}}},"semantic-pr":{name:"Lint PR title",on:{pull_request_target:{types:["opened","edited","synchronize"]}},jobs:{"semantic-pr":{uses:"WillBooster/reusable-workflows/.github/workflows/semantic-pr.yml@main"}}},sync:{name:"Sync",on:{},permissions:{contents:"write"},jobs:{sync:{uses:"WillBooster/reusable-workflows/.github/workflows/sync.yml@main"}}},"close-comment":{name:"Add close comment",on:{pull_request:{types:["opened"]}},jobs:{"close-comment":{uses:"WillBooster/reusable-workflows/.github/workflows/close-comment.yml@main"}}},"gen-pr-claude":{name:"Generate PR with Claude Code",on:{issues:{types:["labeled"]},pull_request:{types:["labeled"]}},jobs:{"gen-pr":{if:"contains(github.event.label.name, 'gen-pr-all') || contains(github.event.label.name, 'gen-pr-claude')",uses:"WillBooster/reusable-workflows/.github/workflows/gen-pr.yml@main",with:{"coding-tool":"claude-code","issue-number":"${{ github.event.issue.number || github.event.number }}","test-command":"yarn|bun check-all-for-ai"},secrets:{CLAUDE_CODE_OAUTH_TOKEN:"${{ secrets.CLAUDE_CODE_OAUTH_TOKEN }}"}}}},"gen-pr-codex":{name:"Generate PR with Codex CLI",on:{issues:{types:["labeled"]},pull_request:{types:["labeled"]}},jobs:{"gen-pr":{if:"contains(github.event.label.name, 'gen-pr-all') || contains(github.event.label.name, 'gen-pr-codex')",uses:"WillBooster/reusable-workflows/.github/workflows/gen-pr.yml@main",with:{"coding-tool":"codex-cli","issue-number":"${{ github.event.issue.number || github.event.number }}","test-command":"yarn|bun check-all-for-ai"},secrets:{OPENAI_API_KEY:"${{ secrets.OPENAI_API_KEY }}"}}}},"gen-pr-gemini":{name:"Generate PR with Gemini CLI",on:{issues:{types:["labeled"]},pull_request:{types:["labeled"]}},jobs:{"gen-pr":{if:"contains(github.event.label.name, 'gen-pr-all') || contains(github.event.label.name, 'gen-pr-gemini')",uses:"WillBooster/reusable-workflows/.github/workflows/gen-pr.yml@main",with:{"coding-tool":"gemini-cli","issue-number":"${{ github.event.issue.number || github.event.number }}","test-command":"yarn|bun check-all-for-ai"},secrets:{GEMINI_API_KEY:"${{ secrets.GEMINI_API_KEY }}"}}}}};async function z(n){const s=["add-focused-issue-to-project.yml","add-issue-to-project.yml","add-ready-issue-to-project.yml","notify-ready.yml","wbfy.yml","wbfy-merge.yml"];return x.functionIgnoringException("generateWorkflow",async()=>{if(U(n.repository))return;const i=t.resolve(n.dirPath,".github","workflows");await e.promises.mkdir(i,{recursive:!0});const o=t.resolve(n.dirPath,".github","semantic.yml");await S.run(()=>e.promises.rm(o,{force:!0,recursive:!0}));const r=await e.promises.readdir(i,{withFileTypes:!0}),a=new Set(["test.yml","autofix.yml","semantic-pr.yml","close-comment.yml","gen-pr-claude.yml","gen-pr-codex.yml","gen-pr-gemini.yml",...r.filter(e=>e.isFile()&&e.name.endsWith(".yml")).map(e=>e.name)]);n.depending.semanticRelease&&a.add("release.yml"),a.delete("autofix.yml"),n.isPublicRepo||s.push("autofix.yml"),a.delete("add-issue-to-project.yml"),a.delete("add-ready-issue-to-project.yml"),a.delete("notify-ready.yml");for(const e of a){const s=t.basename(e,".yml");await S.run(()=>M(n,i,s))}for(const n of s)await S.run(()=>e.promises.rm(t.join(i,n),{force:!0,recursive:!0}))})}function U(e){return e?.endsWith("/reusable-workflows")??!1}async function M(n,s,i){let o=u(i in G?G[i]:{});if(!("jobs"in o))return;const r=t.join(s,`${i}.yml`);try{const t=await e.promises.readFile(r,"utf8"),n=d.load(t);o=l.all([o,n,o],{arrayMerge:N})}catch{}i.startsWith("deploy")&&(o={...o,concurrency:{group:"${{ github.workflow }}","cancel-in-progress":!1}},function(e,t){const n=e[t];delete e[t],e[t]=n}(o,"jobs"),o.on?.push&&(o.on.push["paths-ignore"]=[...new Set(["**.md","**/docs/**",...o.on.push["paths-ignore"]??[]])]));let a=!1;for(const e of Object.values(o.jobs))e.uses?.includes("/reusable-workflows/")&&(q(n,e,i),a=!0);if(a){switch(i){case"release":if(o.on?.schedule)delete o.on.push;else{if(!(o.on?.push&&n.release.branches.length>0))return void await e.promises.rm(t.join(s,"release.yml"),{force:!0});o.on.push.branches=n.release.branches}break;case"test":o.on?.pull_request&&delete o.on.pull_request["paths-ignore"],o.on?.push&&(delete o.on.push["paths-ignore"],o.on.push.branches=o.on.push.branches.filter(e=>"renovate/**"!==e))}if(function(e){delete e.jobs["add-to-project"]}(o),await H(o,r),"release"===i)await e.promises.rm(t.join(s,"semantic-release.yml"),{force:!0});else if("sync"===i){if(await e.promises.rm(t.join(s,"sync-init.yml"),{force:!0}),!o.jobs.sync?.with)return;o.jobs["sync-force"]=o.jobs.sync;const n=o.jobs.sync.with.sync_params_without_dest;if("string"!=typeof n)return;o.jobs.sync.with.sync_params_without_dest=`--force ${n}`,o.name="Force to Sync",o.on={workflow_dispatch:null},delete o.jobs.sync,await H(o,t.join(s,"sync-force.yml"))}}}function q(e,t,n){if(t.with??={},t.secrets??={},delete t.secrets.NPM_TOKEN,"test"!==n&&"release"!==n&&"gen-pr-claude"!==n&&"gen-pr-codex"!==n&&"gen-pr-gemini"!==n||(t.secrets.GH_TOKEN="${{ secrets.GITHUB_TOKEN }}"),"gen-pr-claude"!==n&&"gen-pr-codex"!==n&&"gen-pr-gemini"!==n||(t.with["test-command"]=e.isBun?"bun run check-all-for-ai":"yarn check-all-for-ai"),t.secrets.FIREBASE_TOKEN&&(t.secrets.GCP_SA_KEY_JSON_FOR_FIREBASE="${{ secrets.GCP_SA_KEY_JSON_FOR_FIREBASE }}",delete t.secrets.FIREBASE_TOKEN),(t.secrets.DISCORD_WEBHOOK_URL&&("release"===n||n.startsWith("deploy"))||t.with.server_url&&n.startsWith("deploy"))&&(t.secrets.DISCORD_WEBHOOK_URL="${{ secrets.DISCORD_WEBHOOK_URL_FOR_RELEASE }}"),"sync"===n){const e=t.with.sync_params_without_dest;"string"==typeof e&&(t.with.sync_params_without_dest=e.replace("sync ",""))}if(e.repository?.startsWith("github:WillBooster/")?t.uses=t.uses?.replace("WillBoosterLab/","WillBooster/"):e.repository?.startsWith("github:WillBoosterLab/")&&(t.uses=t.uses?.replace("WillBooster/","WillBoosterLab/")),".env"===t.with.dot_env_path&&delete t.with.dot_env_path,function(e){if(!e.with)return;delete e.with.non_self_hosted,delete e.with.notify_discord,delete e.with.require_fly,delete e.with.require_gcloud,delete e.with.label,delete e.with.labelOperator,e.with.ci_size&&(e.with.ci_label=e.with.ci_size,delete e.with.ci_size)}(t),n.startsWith("deploy")&&t.secrets.FLY_API_TOKEN&&"string"==typeof t.with.deploy_command&&(t.with.deploy_command=t.with.deploy_command.replace(/\s+--json/,"")),e.doesContainDockerfile&&!t.with.ci_label&&n.startsWith("test")&&(t.with.ci_label="large"),"release"===n||"test"===n||n.startsWith("deploy")?e.isPublicRepo&&(t.with.github_hosted_runner=!0):delete t.with.github_hosted_runner,Object.keys(t.with).length>0?J(t.with):delete t.with,Object.keys(t.secrets).length>0){const e=J(t.secrets);delete t.secrets,t.secrets=e}else delete t.secrets}async function H(t,n){const s=d.dump(t,{lineWidth:-1,noCompatMode:!0,styles:{"!!null":"empty"}});await e.promises.writeFile(n,s)}async function Y(n){return x.functionIgnoringException("fixTypos",async()=>{if(U(n.repository))return;const s=n.dirPath,i=await o.glob("**/*.md",{dot:!0,cwd:s,ignore:T});k.isVerbose&&console.info(`Found ${i.length} markdown files in ${s}`);for(const o of i){const i=t.join(s,o);await S.run(async()=>{const t=await e.promises.readFile(i,"utf8");let s=K(t);s=X(s,n,"doc"),t!==s&&await j.generateFile(i,s)})}const r=await o.glob(["{app,src,test,scripts}/**/*.{cjs,mjs,js,jsx,cts,mts,ts,tsx}","packages/**/{app,src,test,scripts}/**/*.{cjs,mjs,js,jsx,cts,mts,ts,tsx}"],{dot:!0,cwd:s,ignore:T});k.isVerbose&&console.info(`Found ${r.length} TypeScript files in ${s}`);for(const i of r){const o=t.join(s,i),r=await e.promises.readFile(o,"utf8");let a=V(r);a=X(a,n,"ts"),r!==a&&await j.generateFile(o,a)}const a=await o.glob("**/*.{csv,htm,html,tsv,xml,yaml,yml}",{dot:!0,cwd:s,ignore:T});k.isVerbose&&console.info(`Found ${a.length} text-based files in ${s}`);for(const i of a){const o=t.join(s,i),r=await e.promises.readFile(o,"utf8");let a=K(r);a=X(a,n,"text"),r!==a&&await j.generateFile(o,a)}await S.promiseAll()})}function K(e){return e.replaceAll(/\bc\.f\.([^$])/g,"cf.$1").replaceAll(/\beg\.([^$])/g,"e.g.$1").replaceAll(/\bie\.([^$])/g,"i.e.$1")}function V(e){return e.replaceAll(/\/\/(.*)c\.f\./g,"//$1cf.").replaceAll(/\/\/(.*)eg\./g,"//$1e.g.").replaceAll(/\/\/(.*)ie\./g,"//$1i.e.")}function X(e,t,n){for(const[n,s]of Object.entries(t.wbfyJson?.typos?.all??{}))e=e.replaceAll(n,s);for(const[s,i]of Object.entries(t.wbfyJson?.typos?.[n]??{}))e=e.replaceAll(s,i);return e}async function Q(e,n){return x.functionIgnoringException("generateAgentInstructions",async()=>{if(!e.isRoot)return;const s=t.resolve(e.dirPath,"AGENTS_EXTRA.md"),i=await j.readFileIgnoringError(s);for(const[s,o]of[["AGENTS.md","Codex CLI"],["CLAUDE.md","Claude Code"],["GEMINI.md","Gemini CLI"]]){const r=Z(e,n,o,i),a=t.resolve(e.dirPath,s);await S.run(()=>j.generateFile(a,r))}const o=t.resolve(e.dirPath,".cursor/rules/general.mdc"),r=function(e,t,n){const s="---\ndescription: General Coding Rules\nglobs:\nalwaysApply: true\n---",i=Z(e,t,"Cursor",n);return`${s}\n\n${i}`}(e,n,i);await S.run(()=>j.generateFile(o,r))})}function Z(e,t,n,s){const i=e.isBun?"bun":"yarn",o=`\n## Project Information\n\n- Name: ${e.packageJson?.name}\n- Description: ${e.packageJson?.description}\n- Package Manager: ${i}\n\n## General Instructions\n\n${t.some(e=>e.depending.genI18nTs)?'- When introducing new string literals in React components, update the language resource files in the `i18n` directory (e.g., `i18n/ja-JP.json`). Reference these strings using the `i18n` utility. For example, use `i18n.pages.home.title()` for `{ "pages": { "home": { "title": "My App" } } }`.':""}\n- Do not write tests unless explicitly requested.\n- After making code changes, run \`${i} check-all-for-ai\` to execute all tests (note: this may take up to 30 minutes), or run \`${i} check-for-ai\` for type checking and linting only.\n - If you are confident your changes will not break any tests, you may use \`check-for-ai\`.\n- Once you have verified your changes, commit them to the current branch using the \`--no-verify\` option and push to the current branch.\n - Follow conventional commits, i.e., your commit message should start with \`feat:\`, \`fix:\`, etc.\n - Make sure to add a new line at the end of your commit message${e.isWillBoosterRepo?` with: \`Co-authored-by: WillBooster (${n}) <agent@willbooster.com>\``:""}.\n - Always create new commits. Avoid using \`--amend\`.\n${t.some(e=>e.hasStartTest)?`- Use \`${i} run start-test\` to launch a web server for debugging or testing.`:""}\n\n## Coding Style\n\n- Write comments that explain "why" rather than "what". Avoid explanations that can be understood from the code itself.\n- Use stderr for logging debug messages temporarily since stdout output is sometimes omitted.\n- When adding new functions or classes, define them below any functions or classes that call them to maintain clear call order.\n- Prefer \`undefined\` over \`null\` unless explicitly dealing with APIs or libraries that require \`null\`.\n- Always perform existence checks on array due to \`noUncheckedIndexedAccess: true\`.\n${t.some(e=>e.depending.react||e.depending.next)?"- Prefer `useImmer` for storing an array or an object to `useState`.":""}\n${t.some(e=>e.depending.next)?"- Since this project uses the React Compiler, you do not need to use `useCallback` or `useMemo` for performance optimization.":""}\n`.replaceAll(/\.\n\n+-/g,".\n-").replaceAll(/\n{3,}/g,"\n\n").trim();return s?o+"\n"+s.trimEnd():o}const ee=new class{getOrgAndName(e){const t=e.split(":").at(-1),n=t?.split("/");return[n?.at(-2)??"",n?.at(-1)?.replace(/.git$/,"")??""]}},te=new Map;function ne(e){const t=e??"",n=te.get(t);if(n)return n;const s=new m({auth:ie(e)||void 0});return te.set(t,s),s}function se(e){return!!ie(e)}function ie(e){return"WillBooster"===e?process.env.GH_BOT_PAT_FOR_WILLBOOSTER:"WillBoosterLab"===e?process.env.GH_BOT_PAT_FOR_WILLBOOSTERLAB:process.env.GH_BOT_PAT_FOR_WILLBOOSTER||process.env.GH_BOT_PAT_FOR_WILLBOOSTERLAB||process.env.GH_TOKEN||process.env.GITHUB_TOKEN}function oe(e,t,n,s=0){do{const[s,i,o]=ae(e,t,n);if(0===f.spawnSync(s,i,o).status)break}while(--s>=0)}function re(e,t,n){const[s,i,o]=ae(e,t,n);o.stdio="pipe";const r=f.spawnSync(s,i,o),a=r.stderr.toString().trim();return a&&console.error(`${s} [${i.map(e=>`"${e}"`).join(", ")}] outputs the following content to stderr:\n${a}`),r.stdout.toString().trim()}function ae(e,t,n){const s={...process.env};return s.PATH&&s.BERRY_BIN_FOLDER&&(s.PATH=s.PATH.replace(`${s.BERRY_BIN_FOLDER}:`,"")),s.ASDF_DIR&&(t=["-l","-c",`${e} ${t.join(" ")}`],e="bash"),[e,t,{cwd:n,env:s,shell:!1,stdio:"inherit"}]}function ce(e){const t=e.split(/[+.-]/).map(Number).filter(e=>!Number.isNaN(e));let n=0,s=1;for(const e of t)n+=e*s,s/=1e3;return n}const le="3.9.19",pe="zulu-11.74.15";async function de(n){return x.functionIgnoringException("generateToolVersions",async()=>{await async function(n){if(!n.versionsText)return;const s=n.versionsText.trim().split("\n").map(e=>{const[t,n]=e.trim().split(/\s+/);return`${ue.has(t??"")?" ":""}${t??""} ${n??""}`}).toSorted().map(e=>e.trim()).filter(e=>!e.startsWith("lefthook")),i=[...new Set(s)];if(n.doesContainPoetryLock){const e=await fetch("https://pypi.org/pypi/poetry/json"),t=await e.json(),n=t?.info?.version;n&&fe(i,"poetry",n),fe(i,"python",le,!0)}n.depending.firebase&&fe(i,"java",pe,!0);if(n.doesContainPackageJson)if(n.isBun){const e=await async function(e,t){try{const n=(await ne().request("GET /repos/{owner}/{repo}/releases/latest",{owner:e,repo:t})).data.tag_name,s=n.lastIndexOf("v"),i=-1===s?n:n.slice(s+1);return/^\d/.test(i)?i:void 0}catch(e){return void console.error("Failed to fetch Bun tags due to:",e)}}("oven-sh","bun");e&&fe(i,"bun",e)}else{const e=re("npm",["show","yarn","version"],n.dirPath);fe(i,"yarn",e)}for(const s of me){const i=t.resolve(n.dirPath,`.${s}-version`);e.promises.rm(i,{force:!0})}const o=t.resolve(n.dirPath,".tool-versions");await(i.length>0?S.run(()=>e.promises.writeFile(o,i.join("\n")+"\n")):S.run(()=>e.promises.rm(o,{force:!0}))),await S.promiseAll(),oe("asdf",["plugin","update","--all"],n.dirPath),oe("asdf",["install"],n.dirPath)}(n)})}const ue=new Set(["java","nodejs","bun","python"]),me=["java","node","python"];function fe(e,t,n,s=!1){const i=e.findIndex(e=>e.split(/\s+/)[0]===t),o=`${t} ${n}`;if(-1===i)e.splice(s?0:e.length,0,o);else{const[,t]=e[i].split(/\s+/);ce(n)>ce(t??"")&&(e[i]=o)}}async function ge(n){return x.functionIgnoringException("generateBiomeJsonc",async()=>{let s={root:n.isRoot,$schema:"./node_modules/@biomejs/biome/configuration_schema.json",extends:["@willbooster/biome-config"]};const i=t.resolve(n.dirPath,"biome.jsonc");try{const t=await e.promises.readFile(i,"utf8"),n=JSON.parse(t);s=l.all([s,n,s],{arrayMerge:L})}catch{}const o=JSON.stringify(s);await S.run(()=>j.generateFile(i,o))})}async function he(n){return x.functionIgnoringException("generateBunfigToml",async()=>{const s=t.resolve(n.dirPath,"bunfig.toml"),i=e.existsSync(s)&&e.readFileSync(s,"utf8").includes("exact = false")?'env = false\ntelemetry = false\n\n[install]\nexact = false\nlinker = "hoisted"\nminimumReleaseAge = 432000 # 5 days\nminimumReleaseAgeExcludes = [\n "@willbooster/babel-configs",\n "@willbooster/biome-config",\n "@willbooster/eslint-config-js",\n "@willbooster/eslint-config-js-react",\n "@willbooster/eslint-config-next",\n "@willbooster/eslint-config-ts",\n "@willbooster/eslint-config-ts-react",\n "@willbooster/prettier-config",\n "@willbooster/wb"\n]\n\n[run]\nbun = true\n':'env = false\ntelemetry = false\n\n[install]\nexact = true\nlinker = "hoisted"\nminimumReleaseAge = 432000 # 5 days\nminimumReleaseAgeExcludes = [\n "@willbooster/babel-configs",\n "@willbooster/biome-config",\n "@willbooster/eslint-config-js",\n "@willbooster/eslint-config-js-react",\n "@willbooster/eslint-config-next",\n "@willbooster/eslint-config-ts",\n "@willbooster/eslint-config-ts-react",\n "@willbooster/prettier-config",\n "@willbooster/wb"\n]\n\n[run]\nbun = true\n';await S.run(()=>j.generateFile(s,i))})}const ye="# Project-specific settings",we=/# Project-specific settings[^\n]*\n/gm,be="# Generated by wbfy",ve=`${ye} (head)\n\n\n${be}\n`,ke=`\n${ye} (tail)\n`,xe={separator:be,separatorPrefix:"# Generated by ",defaultHeadUserContent:ve,defaultTailUserContent:ke,async readGitignoreWithoutSeparators(t){try{let n=await e.promises.readFile(t,"utf8");const s=_e(n);return s>0&&(n=n.slice(0,s-1)),n.replaceAll(we,"").replaceAll(/# Generated by [^\n]*\n/gm,"").replaceAll(/\r?\n\r?\n(\r?\n)+/gm,"\n\n").trim()+"\n"}catch{}},getHeadUserContent(e){const t=e.indexOf(this.separatorPrefix);return-1!==t?e.slice(0,e.indexOf("\n",t)+1).replaceAll(we,`${ye} (head)\n`):ve},getTailUserContent(e){const t=_e(e);return t>0?e.slice(t-1):ke},async isBerryZeroInstallEnabled(t){try{return(await e.promises.readFile(t,"utf8")).includes("\n!.yarn/cache")}catch{return!1}}};function _e(e){const t=e.indexOf(ye),n=e.lastIndexOf(ye);return n>t?n:-1}async function je(n){return x.functionIgnoringException("generateDockerignore",async()=>{const s=t.resolve(n.dirPath,".dockerignore");if(n.doesContainDockerfile){const e=await j.readFileIgnoringError(s)??"",t=xe.getHeadUserContent(e)+"\n**/.idea\n**/*.sqlite3*\n**/.yarn/install-state.gz\n**/.venv\n"+xe.getTailUserContent(e);await S.run(()=>j.generateFile(s,t))}else await e.promises.rm(s,{force:!0})})}const Se={codeWith2IndentSize:["cjs","mjs","js","jsx","cts","mts","ts","tsx","json","json5","jsonc","cpp","dart","htm","html","pu","puml","rb","vue","xml","yaml","yml","sh"].toSorted(),codeWith4IndentSize:["go","gradle","java","py"].toSorted(),markdownLike:["md"].toSorted(),eslint:["cjs","mjs","js","cts","mts","ts","tsx","jsx"].toSorted(),prettier:["cjs","mjs","java","js","jsx","cts","mts","ts","tsx","json","json5","jsonc","css","htm","html","md","scss","vue","yaml","yml"].toSorted(),biome:["cjs","mjs","js","jsx","cts","mts","ts","tsx","json","json5","jsonc","htm","html","vue","svelte","astro","css","yaml","yml","gql"].toSorted()},Pe=`root = true\n\n[*]\ncharset = utf-8\nend_of_line = lf\ninsert_final_newline = true\ntrim_trailing_whitespace = true\n\n${Ce(Se.codeWith2IndentSize)}\nindent_size = 2\nindent_style = space\n\n${Ce(Se.codeWith4IndentSize)}\nindent_size = 4\nindent_style = space\n\n${Ce(Se.markdownLike)}\nmax_line_length = off\ntrim_trailing_whitespace = false\n\n[{Makefile,*.mk}]\nindent_style = tab\n`;async function $e(e){return x.functionIgnoringException("generateEditorconfig",async()=>{const n=t.resolve(e.dirPath,".editorconfig");await S.run(()=>j.generateFile(n,Pe))})}function Ce(e){return e.length>1?`[*.{${e.join(",")}}]`:`[*.${e[0]}]`}async function Fe(n){return x.functionIgnoringException("generateEslintrc",async()=>{await S.run(()=>e.promises.rm(t.resolve(n.dirPath,".eslintrc.json"),{force:!0})),await S.run(()=>e.promises.rm(t.resolve(n.dirPath,".eslintignore"),{force:!0})),await S.run(()=>e.promises.rm(t.resolve(n.dirPath,"eslint.config.js"),{force:!0}));const s=t.resolve(n.dirPath,"eslint.config.mjs");if(n.isBun)await S.run(()=>e.promises.rm(s,{force:!0}));else if(n.eslintBase){try{if(!(await e.promises.readFile(s,"utf8")).includes("export { default }"))return}catch{}await S.run(()=>j.generateFile(s,`export { default } from '${n.eslintBase}';`))}})}const Ee={have_fun:!0,code_review:{disable:!1,comment_severity_threshold:"MEDIUM",max_review_comments:-1,pull_request_opened:{help:!1,summary:!0,code_review:!0}},ignore_patterns:["**/__generated__"]};async function Oe(n){return x.functionIgnoringException("generateGeminiConfig",async()=>{if(!n.isRoot)return;const s=t.resolve(n.dirPath,".gemini"),i=t.resolve(s,"config.yml"),o=t.resolve(s,"styleguide.md");let r=u(Ee);try{const t=await e.promises.readFile(i,"utf8"),n=d.load(t);r=l.all([r,n,r],{arrayMerge:L})}catch{}const a=d.dump(r,{lineWidth:-1,noCompatMode:!0,styles:{"!!null":"empty"}}),c=[S.run(()=>j.generateFile(i,a))];e.existsSync(o)||c.push(S.run(()=>j.generateFile(o,"日本語でレビューしてください。"))),await Promise.all(c)})}async function Be(n){return x.functionIgnoringException("generateGeminiSettings",async()=>{if(!n.isRoot)return;const s=t.resolve(n.dirPath,".gemini"),i=t.resolve(s,"settings.json");await e.promises.rm(i,{force:!0})})}const Ie=`* text=auto\n\n*.lockb binary diff=lockb\n*.vcproj text eol=crlf\n\n${[...Se.codeWith2IndentSize,...Se.codeWith4IndentSize,...Se.markdownLike].map(e=>`*.${e} text eol=lf`).join("\n")}\n\ndist/** linguist-generated=true\n`;async function Ae(e){return x.functionIgnoringException("generateGitattributes",async()=>{const n=t.resolve(e.dirPath,".gitattributes");await S.run(()=>j.generateFile(n,Ie))})}const Te=["windows","macos","linux","jetbrains","visualstudiocode","emacs","vim","yarn"];async function De(e,n){return x.functionIgnoringException("generateGitignore",async()=>{const s=t.resolve(e.dirPath,".gitignore"),i=await j.readFileIgnoringError(s)??"";let o=xe.getHeadUserContent(i)+"\n!.keep\n.aider*\n.env.production\n*/mount/*.hash\n.devcontainer/\n.idea/AugmentWebviewStateStore.xml\n.idea/copilot.*\n.idea/copilot/chatSessions/\n.serena/\n.tmp/\n__generated__/\n@willbooster/\ndist/\ntemp/\ntmp/\n";const r=xe.getTailUserContent(i),a=[...Te];e.doesContainGemfile&&a.push("ruby"),e.doesContainGoMod&&(a.push("go"),o+=`${t.basename(e.dirPath)}\n`),e.doesContainPackageJson&&a.push("node"),e.doesContainPomXml&&(a.push("maven"),o+=".idea/google-java-format.xml\n"),e.doesContainPubspecYaml&&(a.push("flutter","AndroidStudio","ruby"),o+=".flutter-plugins-dependencies\nandroid/key.properties\nios/.bundle\n.idea/runConfigurations.xml\n"),e.doesContainTemplateYaml&&(o+=".aws-sam/\npackaged.yaml\n"),e.doesContainPoetryLock&&(a.push("python"),o+=".venv/\n"),e.depending.blitz&&(o+=".blitz/\n.blitz**\n"),e.depending.next&&a.push("nextjs"),(n.depending.firebase||e.depending.firebase)&&a.push("firebase"),e.depending.prisma&&(o+="*.sqlite3*\n"),e.depending.playwrightTest&&(o+="playwright-report/\ntest-results/\n"),(n.depending.reactNative||e.depending.reactNative)&&(a.push("reactnative"),o+="google-services.json\nandroid/app/src/main/assets/\n"),e.depending.storybook&&a.push("storybookjs"),e.depending.litestream&&(o+="gcp-sa-key.json\n");let c="";for(const e of a){let t=await Le(e)??"";if(!t){const n=`https://www.toptal.com/developers/gitignore/api/${e}`,s=await fetch(n),i=await s.text();if(!s.ok||i.includes("Attention Required!")||i.includes("<title>"))return void console.error(`Failed to fetch ${n}`);t=i.trim(),await S.run(()=>We(e,t)),k.isVerbose&&console.info(`Fetched ${n}`)}c&&(c+="\n"),c+=t+"\n"}await xe.isBerryZeroInstallEnabled(s)||(c=c.replace("!.yarn/cache","# !.yarn/cache").replace("# .pnp.*",".pnp.*")),(e.doesContainPomXml||e.doesContainPubspecYaml)&&(c=c.replaceAll(/^# .idea\/artifacts$/gm,".idea/artifacts").replaceAll(/^# .idea\/compiler.xml$/gm,".idea/compiler.xml").replaceAll(/^# .idea\/jarRepositories.xml$/gm,".idea/jarRepositories.xml").replaceAll(/^# .idea\/modules.xml$/gm,".idea/modules.xml").replaceAll(/^# .idea\/*.iml$/gm,".idea/*.iml").replaceAll(/^# .idea\/modules$/gm,".idea/modules").replaceAll(/^# *.iml$/gm,"*.iml").replaceAll(/^# *.ipr$/gm,"*.ipr"),e.doesContainPubspecYaml&&(c=c.replaceAll(/^.idea\/modules.xml$/gm,"# .idea/modules.xml"))),c=c.replaceAll(/^.idea\/?$/gm,"# .idea"),(n.depending.reactNative||e.depending.reactNative||e.doesContainPubspecYaml)&&(c=c.replaceAll(/^(.idea\/.+)$/gm,"$1\nandroid/$1"));const l=o+"\n"+c+r;await S.run(()=>j.generateFile(s,l))})}const Re=t.join(g.homedir(),".cache","wbfy","gitignore");async function We(n,s){await e.promises.mkdir(Re,{recursive:!0}),await e.promises.writeFile(t.join(Re,n),s)}async function Le(n){try{const s=await e.promises.stat(t.join(Re,n));if(Date.now()-s.mtimeMs>216e5)return;return await e.promises.readFile(t.join(Re,n),"utf8")}catch{}}function Ne(e,t){try{const n=`git@github.com:${e}/${t}.git`,s=re("git",["ls-remote",n,"HEAD"],process.cwd()).split(/\s+/)[0];if(!s)throw new Error(`No commits found for ${e}/${t}`);return Promise.resolve(s)}catch(n){return Promise.reject(new Error(`Failed to fetch commits for ${e}/${t}: ${String(n)}`))}}const Je={getLintFixSuffix:e=>e.doesContainJsxOrTsx?' --rule "{ react-hooks/exhaustive-deps: 0 }"':""},Ge=["eslint","eslint-config-flat-gitignore","eslint-config-prettier","eslint-plugin-import-x","eslint-plugin-sort-class-members","eslint-plugin-sort-destructure-keys","eslint-plugin-unicorn","eslint-plugin-unused-imports","globals"],ze=[...Ge,"typescript-eslint","eslint-import-resolver-typescript"],Ue=["eslint-plugin-react","eslint-plugin-react-hooks","eslint-plugin-react-compiler"],Me={"@willbooster/eslint-config-js":["@willbooster/eslint-config-js",...Ge],"@willbooster/eslint-config-js-react":["@willbooster/eslint-config-js-react",...Ge,...Ue],"@willbooster/eslint-config-ts":["@willbooster/eslint-config-ts",...ze],"@willbooster/eslint-config-ts-react":["@willbooster/eslint-config-ts-react",...ze,...Ue],"@willbooster/eslint-config-next":["@willbooster/eslint-config-next","eslint-config-next",...ze,...Ue]};async function qe(n,s,i){return x.functionIgnoringException("generatePackageJson",async()=>{await async function(n,s,i){const r=t.resolve(n.dirPath,"package.json"),a=await e.promises.readFile(r,"utf8"),c=JSON.parse(a);c.scripts=c.scripts??{},c.dependencies=c.dependencies??{},c.devDependencies=c.devDependencies??{},c.peerDependencies=c.peerDependencies??{};const p=n.isBun?"bun":"yarn";await async function(t){"WillBooster LLC"===t.author&&(t.author="WillBooster Inc.");delete t.scripts["sort-package-json"],delete t.scripts["sort-all-package-json"],delete t.scripts["typecheck/warn"],delete t.scripts["typecheck:gen-code"],delete t.scripts["typecheck:codegen"],delete t.dependencies.tslib,delete t.devDependencies["@willbooster/eslint-config"],delete t.devDependencies["@willbooster/eslint-config-react"],delete t.devDependencies["@willbooster/renovate-config"],delete t.devDependencies["@willbooster/tsconfig"],delete t.devDependencies["eslint-import-resolver-node"],delete t.devDependencies["eslint-plugin-prettier"],delete t.devDependencies.lerna,delete t.devDependencies.pinst,delete t.scripts["flutter-format"],delete t.scripts["format-flutter"],delete t.scripts["python-format"],delete t.scripts["format-python"],delete t.scripts.prettier,delete t.scripts["check-all"],await S.run(()=>e.promises.rm("lerna.json",{force:!0})),delete t.devDependencies["@typescript-eslint/eslint-plugin"],delete t.devDependencies["@typescript-eslint/parser"],delete t.devDependencies["eslint-plugin-import"]}(c);for(const[e,t]of Object.entries(c.scripts))t.includes("git clone")||(c.scripts[e]=t.replace(/yarn\s*&&\s*/,"").replace(/yarn\s*install\s*&&\s*/,""));c.scripts=l(c.scripts,He(n,c.scripts)),"check-for-ai"in c.scripts&&("gen-code"in c.scripts&&(c.scripts["check-for-ai"]=`${p} gen-code > /dev/null && ${c.scripts["check-for-ai"]}`),c.scripts["check-for-ai"]=`${p} install > /dev/null && ${c.scripts["check-for-ai"]}`);n.isBun?delete c.scripts.prettify:c.scripts.prettify=(c.scripts.prettify??"")+await async function(n){const s=t.resolve(n,".prettierignore"),i=await e.promises.readFile(s,"utf8"),o=i.indexOf(xe.separatorPrefix);if(-1===o)return"";const r=i.slice(0,o);return`${r.split("\n").map(e=>{const t=e.trim();return t.endsWith("/")?t.slice(0,-1):t}).filter(e=>e&&!e.startsWith("#")&&!e.includes("/")).map(e=>` "!**/${e}/**"`).join("")} || true`}(n.dirPath);for(const[e,t]of Object.entries(c.scripts))t?.includes("yarn workspaces foreach")&&(t.includes("--all")||t.includes("--recursive")||t.includes("--since")||t.includes("--worktree")||(c.scripts[e]=t.replace("yarn workspaces foreach","yarn workspaces foreach --all")));let d=[],u=["prettier","sort-package-json"];const m=[];e.existsSync(t.join(s.dirPath,".prettierrc.json"))||e.existsSync(t.join(n.dirPath,".prettierrc.json"))||(c.prettier="@willbooster/prettier-config",u.push("prettier-plugin-java","@willbooster/prettier-config"));n.isBun?delete c.devDependencies["lint-staged"]:u.push("lint-staged");if(n.isRoot){if(n.isBun?(delete c.devDependencies.husky,delete c.devDependencies.pinst,c.scripts.prepare="lefthook install || true",u.push("lefthook")):(u.push("husky"),c.scripts.prepare="husky || true",c.scripts.postinstall="husky || true",(n.isPublicRepo||n.isReferredByOtherRepo)&&(u.push("pinst"),c.scripts.prepack="pinst --disable",c.scripts.postpack="pinst --enable")),n.depending.semanticRelease&&(c.devDependencies["semantic-release"]||c.devDependencies["multi-semantic-release"]||c.devDependencies["@qiwi/multi-semantic-release"]||u.push("semantic-release"),c.version="0.0.0-semantically-released"),n.depending.playwrightTest){c.dependencies.artillery||c.devDependencies.artillery||c.dependencies["@playwright/test"]||(u.push("@playwright/test"),delete c.dependencies["@playwright/test"]),delete c.dependencies.playwright,delete c.devDependencies.playwright}n.doesContainSubPackageJsons?c.workspaces=Array.isArray(c.workspaces)?l.all([c.workspaces,["packages/*"]],{arrayMerge:N}):["packages/*"]:Array.isArray(c.workspaces)&&(c.workspaces=c.workspaces.filter(e=>o.globSync(e,{dot:!0,cwd:n.dirPath,ignore:T}).length>0),0===c.workspaces.length&&delete c.workspaces)}if(n.depending.wb||n.isBun){c.dependencies["@willbooster/wb"]?d.push(c.dependencies["@willbooster/wb"].startsWith("10.")?"@willbooster/wb@10.7.1":"@willbooster/wb"):u.push(c.devDependencies["@willbooster/wb"]?.startsWith("10.")?"@willbooster/wb@10.7.1":"@willbooster/wb");for(const[e,t]of Object.entries(c.scripts))c.scripts[e]=t.replace(/wb\s+db/,"wb prisma")}(n.doesContainJavaScript||n.doesContainJavaScriptInPackages||n.doesContainTypeScript||n.doesContainTypeScriptInPackages)&&(n.isBun?(u.push("@biomejs/biome","@willbooster/biome-config"),delete c.devDependencies.eslint,delete c.devDependencies.micromatch,delete c.devDependencies["typescript-eslint"]):u.push("eslint","micromatch"));(n.doesContainTypeScript||n.doesContainTypeScriptInPackages)&&(u.push("typescript"),n.isBun&&u.push("@types/bun"));n.eslintBase&&u.push(...Me[n.eslintBase]);n.isWillBoosterConfigs&&(d=d.filter(e=>!e.includes("@willbooster/")),u=u.filter(e=>!e.includes("@willbooster/")));c.name||(c.name=t.basename(n.dirPath));n.doesContainSubPackageJsons&&(c.private=!0);c.license||(c.license="UNLICENSED");!c.private&&"UNLICENSED"!==c.license&&s.isPublicRepo&&(c.publishConfig??={},c.publishConfig.access??="public");const[f]=ee.getOrgAndName(n.repository??"");"WillBooster"!==f&&"WillBoosterLab"!==f||(c.author="WillBooster Inc.");n.isRoot||!c.private||c.main||(c.main="./src");if(delete c.resolutions?.["npm/chalk"],!n.doesContainSubPackageJsons){if(!n.isBun)if(n.doesContainJavaScript||n.doesContainTypeScript)c.scripts["lint-fix"]=(c.scripts["lint-fix"]??"")+Je.getLintFixSuffix(n);else{delete c.scripts.lint,delete c.scripts["lint-fix"];for(const e of["cleanup","check-for-ai"]){const t=c.scripts[e];t&&(c.scripts[e]=t.replace(/ ?&& ?yarn lint-fix(?: --quiet)?/,""))}}if(n.doesContainPubspecYaml){c.scripts.lint="flutter analyze",c.scripts["lint-fix"]="yarn lint";const s=["lib","test","test_driver"].filter(s=>e.existsSync(t.resolve(n.dirPath,s)));s.length>0&&(c.scripts["format-code"]=`dart format $(find ${s.join(" ")} -name generated -prune -o -name '*.freezed.dart' -prune -o -name '*.g.dart' -prune -o -name '*.dart' -print)`,c.scripts.format=(c.scripts.format??"")+" && yarn format-code")}if(n.doesContainPoetryLock){"poetry install"===c.scripts.postinstall&&delete c.scripts.postinstall;const e=await o.glob("**/*.py",{cwd:n.dirPath,dot:!0,ignore:T}),t=new Set;for(const n of e){const[e,s]=n.split(/[/\\]/);e&&s&&t.add(e)}if(t.size>0){const e=[...t].join(" ");c.scripts["format-code"]=`poetry run isort --profile black ${e} && poetry run black ${e}`,c.scripts.lint?c.scripts.lint=`poetry run flake8 ${e} && ${c.scripts.lint}`:(c.scripts.lint=`poetry run flake8 ${e}`,c.scripts["lint-fix"]="yarn lint"),c.scripts.format=(c.scripts.format??"")+" && yarn format-code",m.push("black","isort","flake8")}}n.repository&&(c.repository=n.repository)}n.depending.blitz?c.scripts["gen-code"]?.startsWith("blitz codegen")?c.scripts["gen-code"].includes("blitz prisma generate")||(c.scripts["gen-code"]=c.scripts["gen-code"].replace("blitz codegen","blitz codegen && blitz prisma generate")):c.scripts["gen-code"]="blitz codegen":n.depending.prisma&&!c.scripts["gen-code"]?.startsWith("prisma generate")&&(c.scripts["gen-code"]="prisma generate");c.dependencies.prettier||delete c.devDependencies["@types/prettier"];0===Object.keys(c.dependencies).length&&delete c.dependencies;0===Object.keys(c.devDependencies).length&&delete c.devDependencies;0===Object.keys(c.peerDependencies).length&&delete c.peerDependencies;await async function(e){e.dependencies=e.dependencies??{},e.devDependencies=e.devDependencies??{};const t=new Set([...Object.keys(e.dependencies),...Object.keys(e.devDependencies)]);if(t.has("@willbooster/auth")&&!Ye(e,"@willbooster/auth")){delete e.devDependencies["@willbooster/auth"];const t=await Ne("WillBoosterLab","auth");e.dependencies["@willbooster/auth"]=`git@github.com:WillBoosterLab/auth.git#${t}`}if(t.has("@discord-bot/shared")&&!Ye(e,"@discord-bot/shared")){delete e.devDependencies["@discord-bot/shared"];const t=await Ne("WillBoosterLab","discord-bot");e.dependencies["@discord-bot/shared"]=`git@github.com:WillBoosterLab/discord-bot.git#${t}`}if(t.has("@willbooster/code-analyzer")&&!Ye(e,"@willbooster/code-analyzer")){delete e.dependencies["@willbooster/code-analyzer"];const t=await Ne("WillBoosterLab","code-analyzer");e.devDependencies["@willbooster/code-analyzer"]=`git@github.com:WillBoosterLab/code-analyzer.git#${t}`}if(t.has("@willbooster/judge")&&!Ye(e,"@willbooster/judge")){delete e.devDependencies["@willbooster/judge"];const t=await Ne("WillBoosterLab","judge");e.dependencies["@willbooster/judge"]=`git@github.com:WillBoosterLab/judge.git#${t}`}if(t.has("@willbooster/llm-proxy")&&!Ye(e,"@willbooster/llm-proxy")){delete e.devDependencies["@willbooster/llm-proxy"];const t=await Ne("WillBoosterLab","llm-proxy");e.dependencies["@willbooster/llm-proxy"]=`git@github.com:WillBoosterLab/llm-proxy.git#${t}`}}(c),n.isBun&&delete c.packageManager;let g=JSON.stringify(c);g=await async function(n,s,i){const r=[];for(const[e]of Object.keys(n))e&&!e.startsWith(":")&&e.includes(":")&&r.push([e,e.replaceAll(":","-")]);if(0===r.length)return s;for(const[e,t]of r)s=s.replaceAll(e,t);const a=await o.glob(["**/*.{md,cjs,mjs,js,jsx,cts,mts,ts,tsx}","**/Dockerfile"],{cwd:i.dirPath,dot:!0,ignore:T});for(const n of a)await S.run(async()=>{const s=t.join(i.dirPath,n),o=await e.promises.readFile(s,"utf8");let a=o;for(const[e,t]of r)a=a.replaceAll(e,t);a!==o&&await e.promises.writeFile(s,a)});return await S.promiseAll(),s}(c.scripts,g,n),await e.promises.writeFile(r,g),i||(d=d.filter(e=>!c.devDependencies?.[e]),d.length>0&&(n.isBun?(oe(p,["remove",...new Set(d)],n.dirPath),oe(p,["add","--exact",...new Set(d)],n.dirPath)):oe(p,["add",...new Set(d)],n.dirPath)),u=u.filter(e=>!c.dependencies?.[e]),u.length>0&&(n.isBun?(oe(p,["remove",...new Set(u)],n.dirPath),oe(p,["add","-D","--exact",...new Set(u)],n.dirPath)):oe(p,["add","-D",...new Set(u)],n.dirPath)),m.length>0&&oe("poetry",["add","--group","dev",...new Set(m)],n.dirPath))}(n,s,i)})}function He(e,t){if(e.isBun){const t=e.doesContainTypeScript||e.doesContainTypeScriptInPackages,n={"check-all-for-ai":"bun run check-for-ai && bun run test --silent","check-for-ai":"bun run cleanup"+(t?" && bun run typecheck":""),cleanup:"bun --bun wb lint --fix --format",format:"bun --bun wb lint --format",lint:"bun --bun wb lint","lint-fix":"bun --bun wb lint --fix",test:"bun wb test",typecheck:"bun --bun wb typecheck"};return t||delete n.typecheck,n}{const n=e.doesContainTypeScript||e.doesContainTypeScriptInPackages,s=t.test;let i={"check-all-for-ai":"yarn check-for-ai && yarn test","check-for-ai":"yarn format > /dev/null 2> /dev/null || true && yarn lint-fix --quiet"+(n?" && yarn typecheck":""),cleanup:"yarn format && yarn lint-fix",format:"sort-package-json && yarn prettify",lint:"eslint --color","lint-fix":"yarn lint --fix",prettify:`prettier --cache --color --write "**/{.*/,}*.{${Se.prettier.join(",")}}" "!**/test{-,/}fixtures/**"`,typecheck:"tsc --noEmit --Pretty"};return e.doesContainSubPackageJsons?i=l({...i},{format:"sort-package-json && yarn prettify && yarn workspaces foreach --all --parallel --verbose run format",lint:"yarn workspaces foreach --all --parallel --verbose run lint","lint-fix":"yarn workspaces foreach --all --parallel --verbose run lint-fix",prettify:`prettier --cache --color --write "**/{.*/,}*.{${Se.prettier.join(",")}}" "!**/packages/**" "!**/test{-,/}fixtures/**"`,test:"CI=1 FORCE_COLOR=3 yarn workspaces foreach --all --verbose run test",typecheck:"yarn workspaces foreach --all --parallel --verbose run typecheck"}):e.depending.pyright&&(i.typecheck=i.typecheck?`${i.typecheck} && `:"",i.typecheck+="pyright"),s?.includes("wb test")&&(i.test=s,i["check-all-for-ai"]=(i["check-all-for-ai"]??"")+" --silent"),n?e.depending.wb&&(i.typecheck="wb typecheck"):delete i.typecheck,i}}function Ye(e,t){return(e.devDependencies?.[t]||e.dependencies?.[t]||"").includes("workspace")}const Ke={preCommit:"node node_modules/.bin/lint-staged",prePush:"yarn typecheck",prePushForLab:'\nif [ $(git branch --show-current) = "main" ]; then\n echo "************************************************"\n echo "*** Don\'t push main branch directly. Use PR! ***"\n echo "************************************************"\n exit 1\nfi\n\nyarn typecheck\n'.trim(),prePushForLabExceptAdmin:'\nif [ $(git branch --show-current) = "main" ] && [ $(git config user.email) != "exkazuu@gmail.com" ]; then\n echo "************************************************"\n echo "*** Don\'t push main branch directly. Use PR! ***"\n echo "************************************************"\n exit 1\nfi\n\nyarn typecheck\n'.trim(),postMerge:'\nchanged_files="$(git diff-tree -r --name-only --no-commit-id ORIG_HEAD HEAD)"\n\nrun_if_changed() {\n if echo "$changed_files" | grep --quiet -E "$1"; then\n eval "$2"\n fi\n}\n'.trim()};async function Ve(n){return x.functionIgnoringException("generateHuskyrcUpdatingPackageJson",async()=>{await async function(n){const s=t.resolve(n.dirPath,"package.json"),i=await e.promises.readFile(s,"utf8"),o=JSON.parse(i);o.scripts??={},delete o.scripts.postinstall,delete o.scripts.postpublish,delete o.scripts.prepare,delete o.scripts.prepublishOnly,delete o.scripts.prepack,delete o.scripts.postpack;const r=t.resolve(n.dirPath,".husky");if(await e.promises.writeFile(s,JSON.stringify(o,void 0,2)),n.isBun)return await e.promises.rm(r,{force:!0,recursive:!0}),void oe("git",["config","--unset","core.hooksPath"],n.dirPath);oe("yarn",["dlx","husky","init"],n.dirPath);const a=t.resolve(r,"pre-commit");await S.run(()=>e.promises.rm(t.resolve(n.dirPath,".huskyrc.json"),{force:!0})),await S.run(()=>e.promises.writeFile(a,Ke.preCommit+"\n"));const{typecheck:c}=He(n,{});if(c){let s=n.repository?.startsWith("github:WillBoosterLab/")?n.repository.toLocaleLowerCase().includes("exercode")?Ke.prePushForLab:Ke.prePushForLabExceptAdmin:Ke.prePush;s=s.replace("yarn typecheck",c.replace("tsc ","node node_modules/.bin/tsc ").replace("wb ","node node_modules/.bin/wb ").replace("pyright","node node_modules/.bin/pyright")),await S.run(()=>e.promises.writeFile(t.resolve(r,"pre-push"),s+"\n",{mode:493}))}const l=`${Ke.postMerge}\n\n${Xe(n).join("\n")}\n`;await S.run(()=>e.promises.writeFile(t.resolve(r,"post-merge"),l,{mode:493}))}(n)})}function Xe(e){const t=[];e.versionsText&&t.push(String.raw`run_if_changed "\..+-version" "awk '{print \$1}' .tool-versions | xargs -I{} asdf plugin add {}"`,String.raw`run_if_changed "\..+-version" "asdf plugin update --all"`),e.versionsText?.includes("python ")&&t.push(String.raw`run_if_changed "\..+-version" "asdf install python"`),e.versionsText&&t.push(String.raw`run_if_changed "\..+-version" "asdf install"`);const n=e.isBun?"bun install":"yarn",s=e.depending.blitz||e.depending.next?" && rm -Rf .next":"";return t.push(String.raw`run_if_changed "package\.json" "${n}${s}"`),e.doesContainPoetryLock&&t.push(String.raw`run_if_changed "poetry\.lock" "poetry install"`),e.depending.blitz?t.push(String.raw`run_if_changed ".*\.prisma" "node node_modules/.bin/blitz prisma migrate deploy"`,String.raw`run_if_changed ".*\.prisma" "node node_modules/.bin/blitz prisma generate"`,String.raw`run_if_changed ".*\.prisma" "node node_modules/.bin/blitz codegen"`):e.depending.prisma&&t.push(String.raw`run_if_changed ".*\.prisma" "node node_modules/.bin/dotenv -c development -- node node_modules/.bin/prisma migrate deploy"`,String.raw`run_if_changed ".*\.prisma" "node node_modules/.bin/dotenv -c development -- node node_modules/.bin/prisma generate"`),t}function Qe(e,t,n,s){return` <TaskOptions isEnabled="true">\n <option name="arguments" value="${t} $FilePathRelativeToProjectRoot$" />\n <option name="checkSyntaxErrors" value="false" />\n <option name="description" />\n <option name="exitCodeBehavior" value="ERROR" />\n <option name="fileExtension" value="${s}" />\n <option name="immediateSync" value="false" />\n <option name="name" value="${n} (.${s})" />\n <option name="output" value="$FilePathRelativeToProjectRoot$" />\n <option name="outputFilters">\n <array />\n </option>\n <option name="outputFromStdout" value="false" />\n <option name="program" value="${e}" />\n <option name="runOnExternalChanges" value="false" />\n <option name="scopeName" value="Project Files" />\n <option name="trackOnlyRoot" value="false" />\n <option name="workingDir" value="$ProjectFileDir$" />\n <envs />\n </TaskOptions>\n`}const Ze=`<?xml version="1.0" encoding="UTF-8"?>\n<project version="4">\n <component name="ProjectTasksOptions">\n${Se.prettier.map(e=>Qe("node","node_modules/.bin/prettier --cache --write","Prettier",e)).join("")}\n </component>\n</project>\n`,et=`<?xml version="1.0" encoding="UTF-8"?>\n<project version="4">\n <component name="ProjectTasksOptions">\n${Se.prettier.map(e=>Qe("bun","--bun node_modules/.bin/biome check --fix --no-errors-on-unmatched --skip-parse-errors","Biome",e)).join("")}\n </component>\n</project>\n`;async function tt(n){return x.functionIgnoringException("generateIdeaSettings",async()=>{const s=t.resolve(n.dirPath,".idea");if(e.existsSync(s)){const i=t.resolve(s,"watcherTasks.xml");await(n.doesContainJavaScript||n.doesContainJavaScriptInPackages||n.doesContainTypeScript||n.doesContainTypeScriptInPackages||n.doesContainPackageJson&&!n.doesContainPubspecYaml&&!n.doesContainGemfile&&!n.doesContainGoMod&&!n.doesContainPomXml?S.run(()=>j.generateFile(i,n.isBun?et:Ze)):S.run(()=>e.promises.rm(i,{force:!0})))}})}const nt={"post-merge":{scripts:{"prepare.sh":{runner:"bash"}}},"pre-commit":{commands:{cleanup:{glob:"*.{cjs,css,cts,htm,html,js,json,json5,jsonc,jsx,md,mjs,mts,scss,ts,tsx,vue,yaml,yml}",run:"bun --bun wb lint --fix --format {staged_files} && git add {staged_files}"},"check-migrations":{glob:"**/migration.sql",run:"\nif grep -q 'Warnings:' {staged_files}; then\n echo \"Migration SQL files ({staged_files}) contain warnings! Please solve the warnings and commit again.\"\n exit 1\nfi\n".trim()}}},"pre-push":{scripts:{"check.sh":{runner:"bash"}}}},st={prePush:"bun --bun node_modules/.bin/wb typecheck",prePushForLab:'\n#!/bin/bash\n\nif [ $(git branch --show-current) = "main" ] && [ $(git config user.email) != "exkazuu@gmail.com" ]; then\n echo "************************************************"\n echo "*** Don\'t push main branch directly. Use PR! ***"\n echo "************************************************"\n exit 1\nfi\n\nbun --bun node_modules/.bin/wb typecheck\n'.trim(),postMerge:'\n#!/bin/bash\n\nchanged_files="$(git diff-tree -r --name-only --no-commit-id ORIG_HEAD HEAD)"\n\nrun_if_changed() {\n if echo "$changed_files" | grep --quiet -E "$1"; then\n eval "$2"\n fi\n}\n'.trim()};async function it(n){return x.functionIgnoringException("generateLefthookUpdatingPackageJson",async()=>{await async function(n){const s=t.resolve(n.dirPath,".lefthook"),{typecheck:i}=He(n,{}),o={...nt};i||delete o["pre-push"];if(await Promise.all([e.promises.writeFile(t.join(n.dirPath,"lefthook.yml"),d.dump(o,{lineWidth:-1,noCompatMode:!0,styles:{"!!null":"empty"}})),e.promises.rm(s,{force:!0,recursive:!0})]),i){const i=n.repository?.startsWith("github:WillBoosterLab/")?st.prePushForLab:st.prePush;e.mkdirSync(t.join(s,"pre-push"),{recursive:!0}),await S.run(()=>e.promises.writeFile(t.join(s,"pre-push","check.sh"),i+"\n",{mode:493}))}const r=`${st.postMerge}\n\n${Xe(n).join("\n")}\n`;e.mkdirSync(t.join(s,"post-merge"),{recursive:!0}),await S.run(()=>e.promises.writeFile(t.resolve(s,"post-merge","prepare.sh"),r,{mode:493}))}(n)})}const ot={node:["src","test","scripts"].toSorted(),blitz:["src","test","scripts","db","integrations","mailers"].toSorted()};async function rt(n){return x.functionIgnoringException("generateLintstagedrc",async()=>{await async function(n){const s=t.resolve(n.dirPath,".lintstagedrc.cjs");if(n.isBun)return void await S.run(()=>e.promises.rm(s,{force:!0}));const i=n.isRoot?"node node_modules/.bin/":"node ../../node_modules/.bin/",o=[];if(n.doesContainJavaScript||n.doesContainTypeScript){const e=`\n '${at(n)}': [${JSON.stringify(`${i}eslint --fix${Je.getLintFixSuffix(n)}`)}, '${i}prettier --cache --write'],`;o.push(e)}const r=n.isRoot?" && !file.includes('/packages/')":"";o.push(`\n './**/*.{${Se.prettier.join(",")}}': files => {\n let filteredFiles = files.filter(file => !file.includes('/test-fixtures/') && !file.includes('/test/fixtures/')${r});${function(e){return e.doesContainJavaScript||e.doesContainTypeScript?`\n\n filteredFiles = filteredFiles.map((file) => path.relative('', file));\n filteredFiles = micromatch.not(filteredFiles, '${at(e)}');\n filteredFiles = filteredFiles.map((file) => path.resolve(file));`:""}(n)}\n if (filteredFiles.length === 0) return [];\n const commands = [\`${i}prettier --cache --write \${filteredFiles.join(' ')}\`];\n if (filteredFiles.some(file => file.endsWith('package.json'))) {\n commands.push('${i}sort-package-json');\n }\n return commands;\n },\n './**/migration.sql': (files) => {\n for (const file of files) {\n const content = fs.readFileSync(file, 'utf-8');\n if (content.includes('Warnings:')) {\n return [\n \`echo '!!! Migration SQL file (\${path.relative('', file)}) contains warnings !!! Solve the warnings and commit again.'\`,\n 'false',\n ];\n }\n }\n return [];\n},`),n.doesContainPubspecYaml&&o.push("\n './{lib,test,test_driver}/**/*.dart': files => {\n const filteredFiles = files.filter(file => !file.includes('generated'))\n .filter(file => !file.endsWith('.freezed.dart') && !file.endsWith('.g.dart'));\n if (filteredFiles.length === 0) return [];\n return [`dart format ${filteredFiles.join(' ')}`];\n },");n.doesContainPoetryLock&&o.push("\n './**/*.py': [\n 'poetry run isort --profile black --filter-files',\n 'poetry run black',\n 'poetry run flake8'\n ],");const a=`const fs = require('fs');\nconst path = require('path');\n${n.doesContainJavaScript||n.doesContainTypeScript?"const micromatch = require('micromatch');\n":""}\nmodule.exports = {${o.join("")}\n};\n`;await S.run(()=>e.promises.rm(t.resolve(n.dirPath,".lintstagedrc.js"),{force:!0})),await S.run(()=>e.promises.rm(t.resolve(n.dirPath,".lintstagedrc.json"),{force:!0})),await S.run(()=>j.generateFile(s,a))}(n)})}function at(e){const t=function(e){return e.depending.blitz?ot.blitz:ot.node}(e).map(e=>`${e}/**/`);return`{,${t.join(",")}}*.{${Se.eslint.join(",")}}`}async function ct(e){return x.functionIgnoringException("generatePrettierignore",async()=>{const n=t.resolve(e.dirPath,".prettierignore"),s=await j.readFileIgnoringError(n)??"",i=xe.getHeadUserContent(s),o=xe.getTailUserContent(s),r=t.resolve(e.dirPath,".gitignore"),a=await xe.readGitignoreWithoutSeparators(r)||"";let c="";e.doesContainPubspecYaml&&(c="\nandroid/app/\nios/Runner/Assets.xcassets/\npubspec.yaml\n");const l=i+"\n3rd-party/\nandroid/\nios/\nno-format/\ntest-fixtures/\ntest/fixtures/\n*.d.ts\n*.min.js\n.yarn/\n.pnp.js\n"+c+a+o;await S.run(()=>j.generateFile(n,l))})}const lt={venvPath:".",venv:".venv"};async function pt(n){return x.functionIgnoringException("generatePyrightConfigJson",async()=>{let s=u(lt);const i=t.resolve(n.dirPath,"pyrightconfig.json");try{const t=await e.promises.readFile(i,"utf8"),n=JSON.parse(t);s=l.all([s,n,s],{arrayMerge:L})}catch{}const o=JSON.stringify(s);await S.run(()=>j.generateFile(i,o))})}async function dt(n){return x.functionIgnoringException("generateReadme",async()=>{const s=t.resolve(n.dirPath,"README.md");let i=await e.promises.readFile(s,"utf8");e.existsSync(t.resolve(n.dirPath,".releaserc.json"))&&(i=ut(i,"[![semantic-release](https://img.shields.io/badge/%20%20%F0%9F%93%A6%F0%9F%9A%80-semantic--release-e10079.svg)](https://github.com/semantic-release/semantic-release)"));const o=n.repository?.slice(n.repository.indexOf(":")+1),r=e.readdirSync(`${n.dirPath}/.github/workflows`);for(const s of r){if(!s.startsWith("test")&&!s.startsWith("deploy"))continue;let r=s;r=(r[0]||"").toUpperCase()+r.slice(1,r.indexOf(".")),r=r.replace("-"," ");const a=`[![${r}](https://github.com/${o}/actions/workflows/${s}/badge.svg)](https://github.com/${o}/actions/workflows/${s})`;e.existsSync(t.resolve(n.dirPath,`.github/workflows/${s}`))&&(i=ut(i,a))}await S.run(()=>j.generateFile(s,i))})}function ut(e,t){e=e.replace(t,"").replaceAll(/\n\n\n+/g,"\n\n");for(let n=0;n<e.length;n++)if("\n"===e[n-1]&&"\n"===e[n]){const s=e.slice(0,n+1);let i=e.slice(n+1);return i.startsWith("[")||i.startsWith("!")||(i=`\n${i}`),`${s}${t}\n${i}`}return`${e}\n${t}\n`}async function mt(n){return x.functionIgnoringException("generateReleaserc",async()=>{const s=t.resolve(n.dirPath,".releaserc.json");if(!e.existsSync(s))return;const i=JSON.parse(await e.promises.readFile(s,"utf8")),o=i.plugins??[];for(let e=0;e<o.length;e++){const t=Array.isArray(o[e])?o[e]?.[0]:o[e],n=Array.isArray(o[e])&&o[e]?.[1]||{};if("@semantic-release/commit-analyzer"===t)o[e]=["@semantic-release/commit-analyzer",l.all([n,{preset:"conventionalcommits"}],{arrayMerge:L})];else if("@semantic-release/github"===t){const{failComment:t,successComment:s,...i}=n;o[e]=["@semantic-release/github",l.all([i,{successCommentCondition:!1,failCommentCondition:!1,labels:["r: semantic-release"],releasedLabels:["released :bookmark:"]}],{arrayMerge:L})]}}const r=JSON.stringify(i);await S.run(()=>j.generateFile(s,r))})}const ft={$schema:"https://docs.renovatebot.com/renovate-schema.json",extends:["github>WillBooster/willbooster-configs:renovate.json5"]};async function gt(n){return x.functionIgnoringException("generateRenovateJson",async()=>{let s=u(ft);const i=t.resolve(n.dirPath,"renovate.json");if(e.existsSync(`${i}5`))return;try{const t=await e.promises.readFile(i,"utf8"),n=JSON.parse(t);s=l.all([s,n,s],{arrayMerge:L}),s.extends=s.extends.filter(e=>"@willbooster"!==e)}catch{}n.depending.blitz&&(s.packageRules??=[],s.packageRules.some(e=>e.matchPackageNames?.includes("next"))||s.packageRules.push({matchPackageNames:["next"],enabled:!1})),await S.run(()=>e.promises.rm(t.resolve(n.dirPath,".dependabot"),{force:!0})),await S.run(()=>e.promises.rm(t.resolve(n.dirPath,".renovaterc.json"),{force:!0}));const o=JSON.stringify(s);await S.run(()=>j.generateFile(i,o))})}const ht={compilerOptions:{target:"ES2022",module:"ESNext",moduleResolution:"Node",jsx:"react-jsx",alwaysStrict:!0,strict:!0,noUncheckedIndexedAccess:!0,skipLibCheck:!0,allowSyntheticDefaultImports:!0,esModuleInterop:!0,resolveJsonModule:!0,declaration:!0,sourceMap:!0,importHelpers:!1,erasableSyntaxOnly:!0,outDir:"dist",typeRoots:["./node_modules/@types","./@types"]},exclude:["packages/*/test/fixtures","test/fixtures"],include:["packages/*/scripts/**/*","packages/*/src/**/*","packages/*/test/**/*","scripts/**/*","src/**/*","test/**/*"]},yt={compilerOptions:{target:"ES2022",module:"ESNext",moduleResolution:"Node",jsx:"react-jsx",alwaysStrict:!0,strict:!0,noUncheckedIndexedAccess:!0,skipLibCheck:!0,allowSyntheticDefaultImports:!0,esModuleInterop:!0,resolveJsonModule:!0,declaration:!0,sourceMap:!0,importHelpers:!1,erasableSyntaxOnly:!0,outDir:"dist",typeRoots:["../../node_modules/@types","../../@types","./@types"]},exclude:["test/fixtures"],include:["scripts/**/*","src/**/*","test/**/*"]};async function wt(n){return x.functionIgnoringException("generateTsconfig",async()=>{if(n.depending.blitz||n.depending.next)return;let s=u(n.isRoot?ht:yt);n.doesContainJsxOrTsx||n.doesContainJsxOrTsxInPackages||delete s.compilerOptions?.jsx,n.isRoot&&!n.doesContainSubPackageJsons&&(s.include=s.include?.filter(e=>!e.startsWith("packages/*/")),s.exclude=s.exclude?.filter(e=>!e.startsWith("packages/*/"))),n.isEsmPackage&&(s.compilerOptions={...s.compilerOptions,module:"NodeNext",moduleResolution:"NodeNext"});const i=t.resolve(n.dirPath,"tsconfig.json");try{const t=await e.promises.readFile(i,"utf8"),o=JSON.parse(t);"./node_modules/@willbooster/tsconfig/tsconfig.json"===o.extends&&delete o.extends,delete s.compilerOptions?.target,n.isEsmPackage||(delete s.compilerOptions?.module,delete s.compilerOptions?.moduleResolution),o.compilerOptions?.jsx&&delete s.compilerOptions?.jsx,s=l.all([s,o,s],{arrayMerge:N}),s.include=s.include?.filter(e=>!e.includes("@types")&&!e.includes("__tests__/")&&!e.includes("tests/"))}catch{}J(s),s.include?.sort();const o=JSON.stringify(s);delete s.compilerOptions?.experimentalDecorators,await S.run(()=>j.generateFile(i,o))})}const bt=["**/.git/objects/**","**/.git/subtree-cache/**","**/node_modules/**","**/tmp/**","**/temp/**","**/dist/**"];async function vt(n){return x.functionIgnoringException("generateVscodeSettings",async()=>{try{const s=t.resolve(n.dirPath,".vscode","settings.json"),i=await e.promises.readFile(s,"utf8");let o=JSON.parse(i);for(const e of bt)o=l.all([o,kt(e)]);n.doesContainPoetryLock&&(o=l.all([o,kt("**/.venv/**")])),n.depending.next&&(o=l.all([o,kt("**/.next/**")])),"editor.codeActionsOnSave"in o&&delete o["editor.codeActionsOnSave"],"editor.formatOnSave"in o&&delete o["editor.formatOnSave"],J(o);const r=JSON.stringify(o,void 0,2);await S.run(()=>j.generateFile(s,r))}catch{}})}function kt(e){return{"files.watcherExclude":{[e]:!0}}}async function xt(n){return x.functionIgnoringException("generateYarnrcYml",async()=>{const s=t.resolve(n.dirPath,".yarnrc.yml");if(n.isBun)return await S.run(()=>e.promises.rm(s,{force:!0})),await S.run(()=>e.promises.rm(t.resolve(n.dirPath,".yarn"),{force:!0,recursive:!0})),void await S.run(()=>e.promises.rm(t.resolve(n.dirPath,"yarn.lock"),{force:!0,recursive:!0}));const i=re("yarn",["--version"],n.dirPath),o=function(e,t){const n=re("npm",["show",e,"versions","--json"],t);return JSON.parse(n).at(-1)}("@yarnpkg/cli",n.dirPath);_t(i)<=_t(o)&&i!==o&&oe("yarn",["set","version",o],n.dirPath,1);const r=t.join(n.dirPath,".yarn","releases");await e.promises.mkdir(r,{recursive:!0});for(const n of await e.promises.readdir(r))n.startsWith("yarn-")&&!n.startsWith(`yarn-${o}.`)&&await S.run(()=>e.promises.rm(t.join(r,n)));const a=t.resolve(n.dirPath,".yarnrc");await S.run(()=>e.promises.rm(a,{force:!0}));const c=d.load(await e.promises.readFile(s,"utf8"));c.defaultSemverRangePrefix="",c.nodeLinker="node-modules",c.nmMode="hardlinks-global",c.npmMinimalAgeGate="5d",c.npmPreapprovedPackages=["@willbooster/babel-configs","@willbooster/biome-config","@willbooster/eslint-config-js","@willbooster/eslint-config-js-react","@willbooster/eslint-config-next","@willbooster/eslint-config-ts","@willbooster/eslint-config-ts-react","@willbooster/prettier-config","@willbooster/wb"],delete c.compressionLevel,0===c.injectEnvironmentFiles?.length&&delete c.injectEnvironmentFiles,c.enableGlobalCache=!0;const l=c.plugins?.length??0;if(c.plugins=c.plugins?.filter(e=>".yarn/plugins/undefined.cjs"!==e.path)??[],c.plugins.length!==l){const s=t.resolve(n.dirPath,".yarnrc","undefined.cjs");await S.run(()=>e.promises.rm(s,{force:!0}))}0===c.plugins.length&&delete c.plugins,await e.promises.writeFile(s,d.dump(c,{lineWidth:-1})),oe("yarn",["dlx","yarn-plugin-auto-install"],n.dirPath)})}function _t(e){const[t]=e.split(".");return Number(t)}async function jt(e){return x.functionIgnoringException("setupLabels",async()=>{const[t,n]=ee.getOrgAndName(e.repository??"");if(!t||!n)return;if("WillBooster"!==t&&"WillBoosterLab"!==t)return;if(!se(t))return;const s=ne(t);try{await St(s,t,n,"d1: x-easy :hedgehog:","EDE9FE"),await St(s,t,n,"d2: easy :rabbit2:","DDD6FE"),await St(s,t,n,"d3: medium :ox:","C4B5FD"),await St(s,t,n,"d4: hard :squid:","A78BFA"),await St(s,t,n,"d5: x-hard :whale2:","8B5CF6"),await St(s,t,n,"p1: critical :fire::fire::fire:","EF4444"),await St(s,t,n,"p2: urgent :fire::fire:","F87171"),await St(s,t,n,"p3: important :fire:","FCA5A5"),await St(s,t,n,"p4: nice to have :droplet:","FECACA"),await St(s,t,n,"r: blitz","5300bc"),await St(s,t,n,"r: firebase","ffca28"),await St(s,t,n,"r: prisma","0c344b"),await St(s,t,n,"r: react","61dafb"),await St(s,t,n,"r: svelte","ff3e00"),await St(s,t,n,"r: semantic-release","494949"),await St(s,t,n,"ready :rocket:","22C55E"),await St(s,t,n,"review requested :mag:","FBCA04"),await St(s,t,n,"released :bookmark:","6366F1"),await St(s,t,n,"s: 0.5h :clock1230:","F3F4F6"),await St(s,t,n,"s: 1h :clock1:","E5E7EB"),await St(s,t,n,"s: 2h :clock2:","D1D5DB"),await St(s,t,n,"s: 3h :clock3:","9CA3AF"),await St(s,t,n,"s: 5h :clock5:","6B7280"),await St(s,t,n,"s: 8h :clock8:","4B5563"),await St(s,t,n,"s: 13h :clock1:","374151"),await St(s,t,n,"t: build :hammer:","BFDBFE"),await St(s,t,n,"t: chore :broom:","BFDBFE"),await St(s,t,n,"t: ci :construction_worker:","BFDBFE"),await St(s,t,n,"t: docs :memo:","BFDBFE"),await St(s,t,n,"t: feat :sparkles:","BFDBFE"),await St(s,t,n,"t: fix :bug:","BFDBFE"),await St(s,t,n,"t: perf :zap:","BFDBFE"),await St(s,t,n,"t: refactor :recycle:","BFDBFE"),await St(s,t,n,"t: style :lipstick:","BFDBFE"),await St(s,t,n,"t: test :test_tube:","BFDBFE"),await St(s,t,n,"project","24292F"),await St(s,t,n,"focused :dart:","22C55E"),await St(s,t,n,"gen-pr-all :robot:","00B4D8"),await St(s,t,n,"gen-pr-claude :robot:","00B4D8"),await St(s,t,n,"gen-pr-codex :robot:","00B4D8"),await St(s,t,n,"gen-pr-gemini :robot:","00B4D8"),await Pt(s,t,n,"bug"),await Pt(s,t,n,"documentation"),await Pt(s,t,n,"duplicate"),await Pt(s,t,n,"enhancement"),await Pt(s,t,n,"good first issue"),await Pt(s,t,n,"help wanted"),await Pt(s,t,n,"invalid"),await Pt(s,t,n,"question"),await Pt(s,t,n,"wontfix"),await Pt(s,t,n,"ready"),await Pt(s,t,n,"review requested"),await Pt(s,t,n,"released"),await Pt(s,t,n,"semantic-release"),await Pt(s,t,n,"llm-pr :robot:"),await Pt(s,t,n,"ai-pr :robot:")}catch(e){console.warn("Skip setupLabels due to:",e?.stack??e)}})}async function St(e,t,n,s,i){try{await e.request("POST /repos/{owner}/{repo}/labels",{owner:t,repo:n,name:s,color:i})}catch{await e.request("PATCH /repos/{owner}/{repo}/labels/{name}",{owner:t,repo:n,name:s,color:i})}}async function Pt(e,t,n,s){try{await e.request("DELETE /repos/{owner}/{repo}/labels/{name}",{owner:t,repo:n,name:s})}catch{}}const $t=["READY_DISCORD_WEBHOOK_URL","GH_BOT_PAT","PUBLIC_GH_BOT_PAT"];async function Ct(e){return x.functionIgnoringException("setupSecrets",async()=>{const[t,n]=ee.getOrgAndName(e.repository??"");if(!t||!n||"WillBoosterLab"!==t)return;if(!se(t)||!k.doesUploadEnvVars)return;const s=h.config().parsed??{};if(0===Object.keys(s).length)return;const i=ne(t);try{for(const e of $t)try{await i.request("DELETE /repos/{owner}/{repo}/actions/secrets/{secret_name}",{owner:t,repo:n,secret_name:e})}catch{}const e=await i.request("GET /repos/{owner}/{repo}/actions/secrets/public-key",{owner:t,repo:n}),{key:o,key_id:r}=e.data;await y.ready;for(const[e,a]of Object.entries(s)){if("GH_BOT_PAT"===e||"GH_BOT_PAT_FOR_WILLBOOSTER"===e||"GH_BOT_PAT_FOR_WILLBOOSTERLAB"===e)continue;const s=y.from_base64(o,y.base64_variants.ORIGINAL),c=y.from_string(a),l=y.crypto_box_seal(c,s),p=y.to_base64(l,y.base64_variants.ORIGINAL);await i.request("PUT /repos/{owner}/{repo}/actions/secrets/{secret_name}",{owner:t,repo:n,secret_name:e,encrypted_value:p,key_id:r})}}catch(e){console.warn("Skip setupSecrets due to:",e?.stack??e)}})}async function Ft(e){const[t,n]=ee.getOrgAndName(e.repository??"");if(!t||!n)return;if("WillBooster"!==t&&"WillBoosterLab"!==t)return;if(!se(t))return;const i=ne(t);await s(()=>i.request("PATCH /repos/{owner}/{repo}",{owner:t,repo:n,allow_auto_merge:!0,allow_merge_commit:!1,allow_squash_merge:!0,allow_rebase_merge:!1,allow_update_branch:!0,delete_branch_on_merge:!0,squash_merge_commit_title:"PR_TITLE",squash_merge_commit_message:"BLANK",headers:{"X-GitHub-Api-Version":"2022-11-28"},...e.repository?.startsWith("github:WillBooster/")?{allow_auto_merge:!0}:{}}))}const Et={"pull_request_template.md":'\nClose #<IssueNumber>\n\n## Self Check\n\n- [ ] I\'ve confirmed `All checks have passed` on this page.\n - PR title follows [Angular\'s commit message format](https://github.com/angular/angular/blob/main/CONTRIBUTING.md#-commit-message-format).\n - PR title doesn\'t have `WIP:`.\n - The test command (e.g., `yarn test`) passed.\n - The lint command (e.g., `yarn lint`) passed.\n - You may leave this box unchecked due to long workflows.\n- [ ] I\'ve reviewed my changes on the GitHub diff view.\n- [ ] I\'ve written the steps to test my changes.\n- [ ] I\'ve added screenshots (if the UI changed).\n - You may leave this box unchecked if you didn\'t modify the UI.\n\n\x3c!-- Please add screenshots if you modify the UI.\n| Current | In coming |\n| ------------------------ | ------------------------ |\n| <img src="" width="400"> | <img src="" width="400"> |\n--\x3e\n\n\x3c!-- Please add steps to test your changes.\n## Steps to Test\n\n1. Open http://localhost-exercode.willbooster.net:3000/ja-JP/courses/_example/lessons/_example_a_plus_b/problems/_example_a_plus_b after login.\n2. Select the language `C`.\n3. Write the following code:\n ```c\n #include <stdio.h>\n\n int main(void) {\n int a, b;\n\n scanf("%d %d", &a, &b);\n printf("%d", a + b);\n return 0;\n }\n ```\n4. Push `Submit` button.\n5. ...\n--\x3e\n'.trim()};async function Ot(n){return x.functionIgnoringException("generateGitHubTemplates",async()=>{for(const[s,i]of Object.entries(Et)){const o=t.resolve(n.dirPath,".github",s);if(e.existsSync(o)){const t=await e.promises.readFile(o,"utf8");if(w(t,i)>i.length/2)continue}await e.promises.mkdir(t.resolve(n.dirPath,".github"),{recursive:!0}),await S.run(()=>j.generateFile(o,i))}})}const Bt=v.object({typos:v.object({all:v.record(v.string(),v.string()).optional(),doc:v.record(v.string(),v.string()).optional(),ts:v.record(v.string(),v.string()).optional(),text:v.record(v.string(),v.string()).optional()}).optional()});async function It(n,s){const i=t.resolve(n,"package.json");try{const o=e.existsSync(i);let r={},c={},l={},p=!1;if(o){const t=e.readFileSync(i,"utf8");l=JSON.parse(t),r=l.dependencies??{},c=l.devDependencies??{},p="module"===l.type}let d=[],u=[];try{const e=t.resolve(n,".releaserc.json"),s=JSON.parse(await a.readFile(e,"utf8"));d=s?.branches??[],u=s?.plugins?.flat()??[]}catch{}const m="packages"!==t.basename(t.resolve(n,".."))||!e.existsSync(t.resolve(n,"..","..","package.json"));let f;m&&(f=await async function(e,t){const n=b(e),s=(await n.getRemotes(!0)).find(e=>"origin"===e.name),i=s?.refs.fetch??s?.refs.push;if("string"==typeof i){const e=await Tt(i);if(e)return e}const o="string"==typeof t.repository?t.repository:t.repository?.url;if(o){const e=await Tt(o);if(e&&"Not Found"!==e.message)return e}}(n,l));let g="";try{g+=(await a.readFile(t.resolve(n,".tool-versions"),"utf8")).trim()}catch{}for(const[e,s]of[["java","java"],["node","nodejs"],["python","python"]])try{const i=await a.readFile(t.resolve(n,`.${e}-version`),"utf8");g&&(g+="\n"),g+=`${s} ${i.trim()}`}catch{}let h="";try{h=await a.readFile(t.resolve(n,"Dockerfile"),"utf8")}catch{}const y=t.resolve(n,"wbfy.json");let w;try{const e=await a.readFile(y,"utf8");w=Bt.parse(JSON.parse(e))}catch{}const v=f?.full_name?`github:${f.full_name}`:void 0,k=i.includes(`${t.sep}willbooster-configs`),x="string"==typeof l.name?l.name:void 0,_={dirPath:n,dockerfile:h,isRoot:m,isPublicRepo:!1===f?.private,isReferredByOtherRepo:!!l.files,repository:f?.full_name?`github:${f.full_name}`:void 0,isWillBoosterRepo:Boolean(v?.startsWith("github:WillBooster/")||v?.startsWith("github:WillBoosterLab/")),isBun:s?.isBun||e.existsSync(t.join(n,"bunfig.toml")),isEsmPackage:p,isWillBoosterConfigs:k,doesContainSubPackageJsons:At("packages/**/package.json",n),doesContainDockerfile:!!h||e.existsSync(t.resolve(n,"docker-compose.yml")),doesContainGemfile:e.existsSync(t.resolve(n,"Gemfile")),doesContainGoMod:e.existsSync(t.resolve(n,"go.mod")),doesContainPackageJson:e.existsSync(t.resolve(n,"package.json")),doesContainPoetryLock:e.existsSync(t.resolve(n,"poetry.lock")),doesContainPomXml:e.existsSync(t.resolve(n,"pom.xml")),doesContainPubspecYaml:e.existsSync(t.resolve(n,"pubspec.yaml")),doesContainTemplateYaml:e.existsSync(t.resolve(n,"template.yaml")),doesContainVscodeSettingsJson:e.existsSync(t.resolve(n,".vscode","settings.json")),doesContainJavaScript:At("{app,src,test,scripts}/**/*.{cjs,mjs,js,jsx}",n),doesContainTypeScript:At("{app,src,test,scripts}/**/*.{cts,mts,ts,tsx}",n),doesContainJsxOrTsx:At("{app,src,test}/**/*.{t,j}sx",n),doesContainJavaScriptInPackages:At("packages/**/{app,src,test,scripts}/**/*.{cjs,mjs,js,jsx}",n),doesContainTypeScriptInPackages:At("packages/**/{app,src,test,scripts}/**/*.{cts,mts,ts,tsx}",n),doesContainJsxOrTsxInPackages:At("packages/**/{app,src,test}/**/*.{t,j}sx",n),hasStartTest:!!l.scripts?.["start-test"],depending:{blitz:!!r.blitz,firebase:!!c["firebase-tools"],genI18nTs:!!c["gen-i18n-ts"],litestream:h.includes("install-litestream.sh"),react:!!r.react,next:!!r.next,playwrightTest:!!r["@playwright/test"]||!!c["@playwright/test"]||!!c.playwright,prisma:!!r["@prisma/client"]||!!c.prisma,pyright:!!c.pyright,reactNative:!!r["react-native"],semanticRelease:!!(c["semantic-release"]||d.length>0||u.length>0),storybook:!!c["@storybook/react"],wb:!!r["@willbooster/wb"]||!!c["@willbooster/wb"]},release:{branches:d,github:u.includes("@semantic-release/github"),npm:u.includes("@semantic-release/npm")},shouldSkipApplying:k&&!0===x?.startsWith("@willbooster/eslint-config-"),versionsText:g,packageJson:l,wbfyJson:w};if(_.isBun||(_.eslintBase=function(e){if(e.depending.next)return"@willbooster/eslint-config-next";if(e.doesContainTypeScript)return e.doesContainJsxOrTsx?"@willbooster/eslint-config-ts-react":"@willbooster/eslint-config-ts";if(e.doesContainJsxOrTsx)return"@willbooster/eslint-config-js-react";if(e.doesContainJavaScript)return"@willbooster/eslint-config-js"}(_)),_.doesContainGemfile||_.doesContainGoMod||_.doesContainPackageJson||_.doesContainPoetryLock||_.doesContainPomXml||_.doesContainPubspecYaml||_.doesContainTemplateYaml)return _}catch{}}function At(e,t){return o.globSync(e,{dot:!0,cwd:t,ignore:T}).length>0}async function Tt(e){const[t,n]=ee.getOrgAndName(e);if(!t||!n)return;const s={full_name:`${t}/${n}`};try{const e=await ne().request("GET /repos/{owner}/{repo}",{owner:t,repo:n});Object.assign(s,e.data)}catch{}return s}function Dt(n){const s=new Set([t.join(n,"node_modules")]),i=o.globSync("**/node_modules",{cwd:n,dot:!0,onlyDirectories:!0,followSymbolicLinks:!1});for(const e of i)s.add(t.resolve(n,e));for(const t of s)try{e.rmSync(t,{recursive:!0,force:!0})}catch(e){console.warn(e)}}await async function(){const n=await r(process.argv.slice(2)).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({env:{description:"Upload environment variables as secrets to GitHub",type:"boolean",default:!1,alias:"e"},skipDeps:{description:"Skip dependency installation",type:"boolean",default:!1,alias:"d"},verbose:{description:"Whether or not to enable verbose mode",type:"boolean",default:!1,alias:"v"}}).version(function(){let n=t.dirname(new URL(import.meta.url).pathname);for(;!e.existsSync(t.join(n,"package.json"));)n=t.dirname(n);return JSON.parse(e.readFileSync(t.join(n,"package.json"),"utf8")).version}()).strict().argv;k.isVerbose=n.verbose,k.doesUploadEnvVars=n.env;for(const s of n.paths){e.rmSync(t.join(s,"bun.lock"),{force:!0}),e.rmSync(t.join(s,"yarn.lock"),{force:!0}),Dt(s);const o=t.join(s,"packages"),r=(await i(()=>e.promises.readdir(o,{withFileTypes:!0}))??[]).filter(e=>e.isDirectory()).map(e=>t.join(o,e.name));await R([s,...r]);const a=await It(s);if(!a){console.error(`there is no valid package.json in ${s}`);continue}const c=Y(a),l=(await Promise.all(r.map(e=>It(e,a)))).filter(e=>!!e),p=[a,...l];if(k.isVerbose)for(const e of p)console.info(e);await de(a),await xt(a),a.isBun&&await he(a);const d=!U(a.repository)&&(a.repository?.startsWith("github:WillBooster/")||a.repository?.startsWith("github:WillBoosterLab/"));await Promise.all([_(a),D(a),c.then(()=>dt(a)),Q(a,p),je(a),$e(a),Oe(a),Be(a),Ae(a),Ot(a),tt(a),gt(a),mt(a),...d?[z(a)]:[],jt(a),Ct(a),Ft(a),a.isBun?Ve(a).then(()=>it(a)):Ve(a),rt(a)]),await S.promiseAll();const u=[];for(const e of p)e.shouldSkipApplying||((e.doesContainTypeScript||e.doesContainTypeScriptInPackages)&&u.push(W(e,e.isRoot?p:[e])),e.depending.playwrightTest&&u.push(E(e)),e.depending.next&&u.push(P(e)),await De(e,a),await S.promiseAll(),(e.isRoot||e.doesContainPackageJson)&&(await ct(e),await qe(e,a,n.skipDeps),u.push(rt(e)),e.doesContainVscodeSettingsJson&&e.doesContainPackageJson&&u.push(vt(e)),(e.doesContainTypeScript||e.doesContainTypeScriptInPackages)&&u.push(wt(e)),(e.doesContainJavaScript||e.doesContainJavaScriptInPackages||e.doesContainTypeScript||e.doesContainTypeScriptInPackages)&&(a.isBun&&u.push(ge(e)),a.isWillBoosterConfigs||u.push(Fe(e))),e.depending.pyright&&u.push(pt(e))));await Promise.all(u),await S.promiseAll();const m=a.isBun?"bun":"yarn";a.isBun?(e.rmSync(t.join(s,"bun.lock"),{force:!0}),oe(m,["update"],s)):(e.rmSync(t.join(s,"yarn.lock"),{force:!0}),oe(m,["install","--no-immutable"],s)),oe(m,["cleanup"],s),a.isBun||oe(m,["install","--no-immutable"],s)}}();
2
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VzIjpbIi4uL3NyYy9vcHRpb25zLnRzIiwiLi4vc3JjL2xvZ2dlci50cyIsIi4uL3NyYy9maXhlcnMvZG9ja2VyZmlsZS50cyIsIi4uL3NyYy91dGlscy9mc1V0aWwudHMiLCIuLi9zcmMvdXRpbHMvcHJvbWlzZVBvb2wudHMiLCIuLi9zcmMvZml4ZXJzL25leHRDb25maWcudHMiLCIuLi9zcmMvZml4ZXJzL3BsYXl3cmlnaHRDb25maWcudHMiLCIuLi9zcmMvdXRpbHMvZ2xvYlV0aWwudHMiLCIuLi9zcmMvZml4ZXJzL3ByaXNtYS50cyIsIi4uL3NyYy9maXhlcnMvdGVzdERpcmVjdG9yeS50cyIsIi4uL3NyYy9maXhlcnMvdHlwZURlZmluaXRpb24udHMiLCIuLi9zcmMvdXRpbHMvbWVyZ2VVdGlsLnRzIiwiLi4vc3JjL3V0aWxzL29iamVjdFV0aWwudHMiLCIuLi9zcmMvZ2VuZXJhdG9ycy93b3JrZmxvdy50cyIsIi4uL3NyYy9maXhlcnMvdHlwb3MudHMiLCIuLi9zcmMvZ2VuZXJhdG9ycy9hZ2VudHMudHMiLCIuLi9zcmMvdXRpbHMvZ2l0aHViVXRpbC50cyIsIi4uL3NyYy91dGlscy9zcGF3blV0aWwudHMiLCIuLi9zcmMvdXRpbHMvdmVyc2lvbi50cyIsIi4uL3NyYy91dGlscy92ZXJzaW9uQ29uc3RhbnRzLnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvYXNkZi50cyIsIi4uL3NyYy9nZW5lcmF0b3JzL2Jpb21lLnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvYnVuZmlnLnRzIiwiLi4vc3JjL3V0aWxzL2lnbm9yZUZpbGVVdGlsLnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvZG9ja2VyaWdub3JlLnRzIiwiLi4vc3JjL3V0aWxzL2V4dGVuc2lvbnMudHMiLCIuLi9zcmMvZ2VuZXJhdG9ycy9lZGl0b3Jjb25maWcudHMiLCIuLi9zcmMvZ2VuZXJhdG9ycy9lc2xpbnRDb25maWcudHMiLCIuLi9zcmMvZ2VuZXJhdG9ycy9nZW1pbmlDb25maWcudHMiLCIuLi9zcmMvZ2VuZXJhdG9ycy9nZW1pbmlTZXR0aW5ncy50cyIsIi4uL3NyYy9nZW5lcmF0b3JzL2dpdGF0dHJpYnV0ZXMudHMiLCIuLi9zcmMvZ2VuZXJhdG9ycy9naXRpZ25vcmUudHMiLCIuLi9zcmMvZ2l0aHViL2NvbW1pdC50cyIsIi4uL3NyYy91dGlscy9lc2xpbnRVdGlsLnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvcGFja2FnZUpzb24udHMiLCIuLi9zcmMvZ2VuZXJhdG9ycy9odXNreXJjLnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvaWRlYS50cyIsIi4uL3NyYy9nZW5lcmF0b3JzL2xlZnRob29rLnRzIiwiLi4vc3JjL3V0aWxzL3NyY0RpcmVjdG9yaWVzLnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvbGludHN0YWdlZHJjLnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvcHJldHRpZXJpZ25vcmUudHMiLCIuLi9zcmMvZ2VuZXJhdG9ycy9weXJpZ2h0Q29uZmlnLnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvcmVhZG1lLnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvcmVsZWFzZXJjLnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvcmVub3ZhdGVKc29uLnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvdHNjb25maWcudHMiLCIuLi9zcmMvZ2VuZXJhdG9ycy92c2NvZGVTZXR0aW5ncy50cyIsIi4uL3NyYy9nZW5lcmF0b3JzL3lhcm5yYy50cyIsIi4uL3NyYy9naXRodWIvbGFiZWwudHMiLCIuLi9zcmMvZ2l0aHViL3NlY3JldC50cyIsIi4uL3NyYy9naXRodWIvc2V0dGluZ3MudHMiLCIuLi9zcmMvZ2l0aHViL3RlbXBsYXRlLnRzIiwiLi4vc3JjL3BhY2thZ2VDb25maWcudHMiLCIuLi9zcmMvaW5kZXgudHMiXSwic291cmNlc0NvbnRlbnQiOlsiY2xhc3MgT3B0aW9ucyB7XG4gIGlzVmVyYm9zZSA9IGZhbHNlO1xuICBkb2VzVXBsb2FkRW52VmFycyA9IGZhbHNlO1xufVxuXG5leHBvcnQgY29uc3Qgb3B0aW9ucyA9IG5ldyBPcHRpb25zKCk7XG4iLCJpbXBvcnQgeyBvcHRpb25zIH0gZnJvbSAnLi9vcHRpb25zLmpzJztcblxuY2xhc3MgTG9nZ2VyIHtcbiAgYXN5bmMgZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbihuYW1lOiBzdHJpbmcsIGZ1bmM6ICgpID0+IFByb21pc2U8dm9pZD4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAob3B0aW9ucy5pc1ZlcmJvc2UpIHtcbiAgICAgIGNvbnNvbGUuaW5mbyhgLS0tLS0tLS0tICR7bmFtZX0gc3RhcnQgLS0tLS0tLS0tYCk7XG4gICAgfVxuICAgIHRyeSB7XG4gICAgICBhd2FpdCBmdW5jKCk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNvbnNvbGUuaW5mbyhgRXJyb3Igb2NjdXJyZWQgaW4gJHtuYW1lfTogJHtlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3Iuc3RhY2sgOiBTdHJpbmcoZXJyb3IpfX1gKTtcbiAgICB9XG4gICAgaWYgKG9wdGlvbnMuaXNWZXJib3NlKSB7XG4gICAgICBjb25zb2xlLmluZm8oYC0tLS0tLS0tLS0gJHtuYW1lfSBlbmQgLS0tLS0tLS0tLWApO1xuICAgIH1cbiAgfVxufVxuXG5leHBvcnQgY29uc3QgbG9nZ2VyID0gbmV3IExvZ2dlcigpO1xuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMvcHJvbWlzZXMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZml4RG9ja2VyZmlsZShjb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdmaXhEb2NrZXJmaWxlJywgYXN5bmMgKCkgPT4ge1xuICAgIGlmICghY29uZmlnLmRvZXNDb250YWluRG9ja2VyZmlsZSkgcmV0dXJuO1xuXG4gICAgY29uc3Qgb2xkQ29udGVudCA9IGNvbmZpZy5kb2NrZXJmaWxlO1xuICAgIGNvbnN0IG5ld0NvbnRlbnQgPSBvbGRDb250ZW50O1xuXG4gICAgaWYgKG9sZENvbnRlbnQgPT09IG5ld0NvbnRlbnQpIHJldHVybjtcbiAgICBhd2FpdCBmcy53cml0ZUZpbGUocGF0aC5qb2luKGNvbmZpZy5kaXJQYXRoLCAnRG9ja2VyZmlsZScpLCBuZXdDb250ZW50KTtcbiAgfSk7XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5leHBvcnQgY29uc3QgZnNVdGlsID0ge1xuICBhc3luYyByZWFkRmlsZUlnbm9yaW5nRXJyb3IoZmlsZVBhdGg6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nIHwgdW5kZWZpbmVkPiB7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiBhd2FpdCBmcy5wcm9taXNlcy5yZWFkRmlsZShmaWxlUGF0aCwgJ3V0ZjgnKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIGRvIG5vdGhpbmdcbiAgICB9XG4gIH0sXG4gIGFzeW5jIGdlbmVyYXRlRmlsZShmaWxlUGF0aDogc3RyaW5nLCBjb250ZW50OiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBhd2FpdCBmcy5wcm9taXNlcy5ta2RpcihwYXRoLmRpcm5hbWUoZmlsZVBhdGgpLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgICBsZXQgbm9ybWFsaXplZENvbnRlbnQgPSBjb250ZW50LnJlcGxhY2VBbGwoJ1xcclxcbicsICdcXG4nKS50cmltKCk7XG4gICAgaWYgKG5vcm1hbGl6ZWRDb250ZW50KSB7XG4gICAgICBub3JtYWxpemVkQ29udGVudCArPSAnXFxuJztcbiAgICB9XG4gICAgYXdhaXQgZnMucHJvbWlzZXMud3JpdGVGaWxlKGZpbGVQYXRoLCBub3JtYWxpemVkQ29udGVudCk7XG4gICAgY29uc29sZS5sb2coYEdlbmVyYXRlZC9VcGRhdGVkICR7ZmlsZVBhdGh9YCk7XG4gIH0sXG59O1xuIiwiaW1wb3J0IHsgUHJvbWlzZVBvb2wgfSBmcm9tICdtaW5pbWFsLXByb21pc2UtcG9vbCc7XG5cbmV4cG9ydCBjb25zdCBwcm9taXNlUG9vbCA9IG5ldyBQcm9taXNlUG9vbCgpO1xuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZnNVdGlsIH0gZnJvbSAnLi4vdXRpbHMvZnNVdGlsLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZml4TmV4dENvbmZpZ0pzb24oY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZml4TmV4dENvbmZpZ0pzb24nLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgZmlsZVBhdGggPSBbJ2pzJywgJ21qcycsICdjanMnXVxuICAgICAgLm1hcCgoZXh0KSA9PiBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsIGBuZXh0LmNvbmZpZy4ke2V4dH1gKSlcbiAgICAgIC5maW5kKChwKSA9PiBmcy5leGlzdHNTeW5jKHApKTtcbiAgICBpZiAoIWZpbGVQYXRoKSByZXR1cm47XG5cbiAgICBjb25zdCBvbGRDb250ZW50ID0gYXdhaXQgZnMucHJvbWlzZXMucmVhZEZpbGUoZmlsZVBhdGgsICd1dGY4Jyk7XG4gICAgLy8gUmVwbGFjZSB0aGUgSlNPTiBvYmplY3QgZnJvbSB0aGUgZmlsZVxuICAgIGNvbnN0IG5ld0NvbnRlbnQgPSBvbGRDb250ZW50LnJlcGxhY2UoLz1cXHMqeyhbXFxTXFxzXSopfTsvLCAoXywgc2V0dGluZ3NUZXh0OiBzdHJpbmcpID0+IHtcbiAgICAgIGlmICghc2V0dGluZ3NUZXh0LmluY2x1ZGVzKCdlc2xpbnQ6JykpIHtcbiAgICAgICAgc2V0dGluZ3NUZXh0ICs9ICdlc2xpbnQ6IHsgaWdub3JlRHVyaW5nQnVpbGRzOiB0cnVlIH0sJztcbiAgICAgIH1cbiAgICAgIGlmICghc2V0dGluZ3NUZXh0LmluY2x1ZGVzKCd0eXBlc2NyaXB0OicpKSB7XG4gICAgICAgIHNldHRpbmdzVGV4dCArPSAndHlwZXNjcmlwdDogeyBpZ25vcmVCdWlsZEVycm9yczogdHJ1ZSB9LCc7XG4gICAgICB9XG4gICAgICByZXR1cm4gYD0geyR7c2V0dGluZ3NUZXh0fX07YDtcbiAgICB9KTtcbiAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnNVdGlsLmdlbmVyYXRlRmlsZShmaWxlUGF0aCwgbmV3Q29udGVudCkpO1xuICB9KTtcbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCBtZXJnZSBmcm9tICdkZWVwbWVyZ2UnO1xuaW1wb3J0IHRzIGZyb20gJ3R5cGVzY3JpcHQnO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBmc1V0aWwgfSBmcm9tICcuLi91dGlscy9mc1V0aWwuanMnO1xuaW1wb3J0IHsgcHJvbWlzZVBvb2wgfSBmcm9tICcuLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5cbnR5cGUgUGFyc2VkVmFsdWUgPVxuICB8IHsga2luZDogJ2FycmF5JzsgdmFsdWU6IFBhcnNlZFZhbHVlW10gfVxuICB8IHsga2luZDogJ2xpdGVyYWwnOyB2YWx1ZTogc3RyaW5nIH1cbiAgfCB7IGtpbmQ6ICdvYmplY3QnOyB2YWx1ZTogUGFyc2VkT2JqZWN0IH07XG50eXBlIFBhcnNlZE9iamVjdCA9IFJlY29yZDxzdHJpbmcsIFBhcnNlZFZhbHVlPjtcblxuY29uc3QgbGl0ZXJhbCA9ICh2YWx1ZTogc3RyaW5nKTogUGFyc2VkVmFsdWUgPT4gKHsga2luZDogJ2xpdGVyYWwnLCB2YWx1ZSB9KTtcbmNvbnN0IGFzQXJyYXkgPSAodmFsdWU6IFBhcnNlZFZhbHVlW10pOiBQYXJzZWRWYWx1ZSA9PiAoeyBraW5kOiAnYXJyYXknLCB2YWx1ZSB9KTtcbmNvbnN0IGFzT2JqZWN0ID0gKHZhbHVlOiBQYXJzZWRPYmplY3QpOiBQYXJzZWRWYWx1ZSA9PiAoeyBraW5kOiAnb2JqZWN0JywgdmFsdWUgfSk7XG5cbmNvbnN0IGRlZmF1bHRDb25maWc6IFBhcnNlZE9iamVjdCA9IHtcbiAgZm9yYmlkT25seTogbGl0ZXJhbCgnISFwcm9jZXNzLmVudi5DSScpLFxuICByZXRyaWVzOiBsaXRlcmFsKCdwcm9jZXNzLmVudi5QV0RFQlVHID8gMCA6IHByb2Nlc3MuZW52LkNJID8gNSA6IDEnKSxcbiAgdGltZW91dDogbGl0ZXJhbCgnMTIwXzAwMCcpLFxuICB1c2U6IGFzT2JqZWN0KHtcbiAgICBhY3Rpb25UaW1lb3V0OiBsaXRlcmFsKCcxMF8wMDAnKSxcbiAgICB0cmFjZTogbGl0ZXJhbChcInByb2Nlc3MuZW52LkNJID8gJ29uLWZpcnN0LXJldHJ5JyA6ICdyZXRhaW4tb24tZmFpbHVyZSdcIiksXG4gICAgc2NyZWVuc2hvdDogbGl0ZXJhbChcInByb2Nlc3MuZW52LkNJID8gJ29ubHktb24tZmFpbHVyZScgOiAnb25seS1vbi1mYWlsdXJlJ1wiKSxcbiAgICB2aWRlbzogbGl0ZXJhbChcInByb2Nlc3MuZW52LkNJID8gJ3JldGFpbi1vbi1mYWlsdXJlJyA6ICdyZXRhaW4tb24tZmFpbHVyZSdcIiksXG4gIH0pLFxuICB3b3JrZXJzOiBsaXRlcmFsKCdwcm9jZXNzLmVudi5QV0RFQlVHID8gMSA6IHVuZGVmaW5lZCcpLFxuICB3ZWJTZXJ2ZXI6IGFzT2JqZWN0KHtcbiAgICBjb21tYW5kOiBsaXRlcmFsKFwiJ3lhcm4gc3RhcnQtdGVzdC1zZXJ2ZXInXCIpLFxuICAgIHVybDogbGl0ZXJhbCgncHJvY2Vzcy5lbnYuTkVYVF9QVUJMSUNfQkFTRV9VUkwnKSxcbiAgICByZXVzZUV4aXN0aW5nU2VydmVyOiBsaXRlcmFsKCchIXByb2Nlc3MuZW52LkNJJyksXG4gICAgdGltZW91dDogbGl0ZXJhbCgnMzAwXzAwMCcpLFxuICAgIHN0ZG91dDogbGl0ZXJhbChcIidpZ25vcmUnXCIpLFxuICAgIHN0ZGVycjogbGl0ZXJhbChcIidwaXBlJ1wiKSxcbiAgICBlbnY6IGxpdGVyYWwoYHtcbiAgLi4ucHJvY2Vzcy5lbnYsXG4gIFBSSVNNQV9VU0VSX0NPTlNFTlRfRk9SX0RBTkdFUk9VU19BSV9BQ1RJT046ICd0cnVlJyxcbn1gKSxcbiAgICBncmFjZWZ1bFNodXRkb3duOiBsaXRlcmFsKGB7XG4gIHNpZ25hbDogJ1NJR1RFUk0nLFxuICB0aW1lb3V0OiA1MDAsXG59YCksXG4gIH0pLFxufTtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGZpeFBsYXl3cmlnaHRDb25maWcoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZml4UGxheXdyaWdodENvbmZpZycsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgYHBsYXl3cmlnaHQuY29uZmlnLnRzYCk7XG4gICAgaWYgKCFmcy5leGlzdHNTeW5jKGZpbGVQYXRoKSkgcmV0dXJuO1xuXG4gICAgY29uc3Qgb2xkQ29udGVudCA9IGF3YWl0IGZzLnByb21pc2VzLnJlYWRGaWxlKGZpbGVQYXRoLCAndXRmOCcpO1xuICAgIGNvbnN0IG1hdGNoID0gL2RlZmluZUNvbmZpZ1xccypcXChcXHMqKFxce1tcXHNcXFNdKj99KVxccypcXCk7Py8uZXhlYyhvbGRDb250ZW50KTtcbiAgICBjb25zdCBvYmplY3RMaXRlcmFsID0gbWF0Y2g/LlsxXTtcbiAgICBpZiAoIW9iamVjdExpdGVyYWwpIHJldHVybjtcblxuICAgIGNvbnN0IHBhcnNlZCA9IHBhcnNlT2JqZWN0TGl0ZXJhbChvYmplY3RMaXRlcmFsKTtcbiAgICBpZiAoIXBhcnNlZCkgcmV0dXJuO1xuXG4gICAgY29uc3QgbWVyZ2VkID0gbWVyZ2UuYWxsPFBhcnNlZE9iamVjdD4oW2RlZmF1bHRDb25maWcsIHBhcnNlZCwgZGVmYXVsdENvbmZpZ10pO1xuICAgIGNvbnN0IG5ld09iamVjdExpdGVyYWwgPSBzdHJpbmdpZnlPYmplY3QobWVyZ2VkLCAwKTtcbiAgICBjb25zdCBuZXdDb250ZW50ID0gb2xkQ29udGVudC5yZXBsYWNlKG9iamVjdExpdGVyYWwsIG5ld09iamVjdExpdGVyYWwpO1xuXG4gICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzVXRpbC5nZW5lcmF0ZUZpbGUoZmlsZVBhdGgsIG5ld0NvbnRlbnQpKTtcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIHBhcnNlT2JqZWN0TGl0ZXJhbChvYmplY3RMaXRlcmFsOiBzdHJpbmcpOiBQYXJzZWRPYmplY3QgfCB1bmRlZmluZWQge1xuICBjb25zdCBzb3VyY2UgPSB0cy5jcmVhdGVTb3VyY2VGaWxlKFxuICAgICdwbGF5d3JpZ2h0LWNvbmZpZy50cycsXG4gICAgYGNvbnN0IGNvbmZpZyA9ICR7b2JqZWN0TGl0ZXJhbH07YCxcbiAgICB0cy5TY3JpcHRUYXJnZXQuTGF0ZXN0LFxuICAgIHRydWUsXG4gICAgdHMuU2NyaXB0S2luZC5UU1xuICApO1xuICBjb25zdCBzdGF0ZW1lbnQgPSBzb3VyY2Uuc3RhdGVtZW50c1swXTtcbiAgaWYgKCFzdGF0ZW1lbnQgfHwgIXRzLmlzVmFyaWFibGVTdGF0ZW1lbnQoc3RhdGVtZW50KSkgcmV0dXJuO1xuICBjb25zdCBkZWNsYXJhdGlvbiA9IHN0YXRlbWVudC5kZWNsYXJhdGlvbkxpc3QuZGVjbGFyYXRpb25zWzBdO1xuICBpZiAoIWRlY2xhcmF0aW9uPy5pbml0aWFsaXplciB8fCAhdHMuaXNPYmplY3RMaXRlcmFsRXhwcmVzc2lvbihkZWNsYXJhdGlvbi5pbml0aWFsaXplcikpIHJldHVybjtcbiAgcmV0dXJuIHBhcnNlT2JqZWN0TGl0ZXJhbEV4cHJlc3Npb24oZGVjbGFyYXRpb24uaW5pdGlhbGl6ZXIsIHNvdXJjZSk7XG59XG5cbmZ1bmN0aW9uIHBhcnNlT2JqZWN0TGl0ZXJhbEV4cHJlc3Npb24oXG4gIG9iamVjdExpdGVyYWw6IHRzLk9iamVjdExpdGVyYWxFeHByZXNzaW9uLFxuICBzb3VyY2U6IHRzLlNvdXJjZUZpbGVcbik6IFBhcnNlZE9iamVjdCB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IHBhcnNlZDogUGFyc2VkT2JqZWN0ID0ge307XG4gIGZvciAoY29uc3QgcHJvcGVydHkgb2Ygb2JqZWN0TGl0ZXJhbC5wcm9wZXJ0aWVzKSB7XG4gICAgaWYgKCF0cy5pc1Byb3BlcnR5QXNzaWdubWVudChwcm9wZXJ0eSkgfHwgKCF0cy5pc0lkZW50aWZpZXIocHJvcGVydHkubmFtZSkgJiYgIXRzLmlzU3RyaW5nTGl0ZXJhbChwcm9wZXJ0eS5uYW1lKSkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgdmFsdWUgPSBwYXJzZUV4cHJlc3Npb24ocHJvcGVydHkuaW5pdGlhbGl6ZXIsIHNvdXJjZSk7XG4gICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQpIHJldHVybjtcbiAgICBwYXJzZWRbcHJvcGVydHkubmFtZS5nZXRUZXh0KHNvdXJjZSldID0gdmFsdWU7XG4gIH1cbiAgcmV0dXJuIHBhcnNlZDtcbn1cblxuZnVuY3Rpb24gcGFyc2VFeHByZXNzaW9uKGV4cHJlc3Npb246IHRzLkV4cHJlc3Npb24sIHNvdXJjZTogdHMuU291cmNlRmlsZSk6IFBhcnNlZFZhbHVlIHwgdW5kZWZpbmVkIHtcbiAgaWYgKHRzLmlzT2JqZWN0TGl0ZXJhbEV4cHJlc3Npb24oZXhwcmVzc2lvbikpIHtcbiAgICBjb25zdCBwYXJzZWRPYmplY3QgPSBwYXJzZU9iamVjdExpdGVyYWxFeHByZXNzaW9uKGV4cHJlc3Npb24sIHNvdXJjZSk7XG4gICAgcmV0dXJuIHBhcnNlZE9iamVjdCA/IGFzT2JqZWN0KHBhcnNlZE9iamVjdCkgOiBsaXRlcmFsKGV4cHJlc3Npb24uZ2V0VGV4dChzb3VyY2UpKTtcbiAgfVxuICBpZiAodHMuaXNBcnJheUxpdGVyYWxFeHByZXNzaW9uKGV4cHJlc3Npb24pKSB7XG4gICAgY29uc3QgZWxlbWVudHMgPSBleHByZXNzaW9uLmVsZW1lbnRzLm1hcCgoZWxlbWVudCkgPT4gcGFyc2VFeHByZXNzaW9uKGVsZW1lbnQsIHNvdXJjZSkpO1xuICAgIGlmIChlbGVtZW50cy5zb21lKChlbGVtZW50KTogZWxlbWVudCBpcyB1bmRlZmluZWQgPT4gZWxlbWVudCA9PT0gdW5kZWZpbmVkKSkge1xuICAgICAgcmV0dXJuIGxpdGVyYWwoZXhwcmVzc2lvbi5nZXRUZXh0KHNvdXJjZSkpO1xuICAgIH1cbiAgICByZXR1cm4gYXNBcnJheShlbGVtZW50cyBhcyBQYXJzZWRWYWx1ZVtdKTtcbiAgfVxuICByZXR1cm4gbGl0ZXJhbChleHByZXNzaW9uLmdldFRleHQoc291cmNlKSk7XG59XG5cbmZ1bmN0aW9uIHN0cmluZ2lmeVZhbHVlKHZhbHVlOiBQYXJzZWRWYWx1ZSwgbGV2ZWw6IG51bWJlcik6IHN0cmluZyB7XG4gIGlmICh2YWx1ZS5raW5kID09PSAnYXJyYXknKSB7XG4gICAgcmV0dXJuIHN0cmluZ2lmeUFycmF5KHZhbHVlLnZhbHVlLCBsZXZlbCk7XG4gIH1cbiAgaWYgKHZhbHVlLmtpbmQgPT09ICdsaXRlcmFsJykgcmV0dXJuIHZhbHVlLnZhbHVlO1xuICByZXR1cm4gc3RyaW5naWZ5T2JqZWN0KHZhbHVlLnZhbHVlLCBsZXZlbCk7XG59XG5cbmZ1bmN0aW9uIHN0cmluZ2lmeUFycmF5KHZhbHVlczogUGFyc2VkVmFsdWVbXSwgbGV2ZWw6IG51bWJlcik6IHN0cmluZyB7XG4gIGlmICh2YWx1ZXMubGVuZ3RoID09PSAwKSByZXR1cm4gJ1tdJztcbiAgY29uc3QgaW5kZW50ID0gJyAgJy5yZXBlYXQobGV2ZWwgKyAxKTtcbiAgY29uc3QgbGluZXMgPSB2YWx1ZXMubWFwKCh2YWx1ZSkgPT4ge1xuICAgIGNvbnN0IHN0cmluZ2lmaWVkID0gc3RyaW5naWZ5VmFsdWUodmFsdWUsIGxldmVsICsgMSkuc3BsaXQoJ1xcbicpO1xuICAgIHN0cmluZ2lmaWVkW3N0cmluZ2lmaWVkLmxlbmd0aCAtIDFdID0gYCR7c3RyaW5naWZpZWQuYXQoLTEpfSxgO1xuICAgIGlmICh2YWx1ZS5raW5kID09PSAnbGl0ZXJhbCcpIHtcbiAgICAgIGZvciAobGV0IGluZGV4ID0gMTsgaW5kZXggPCBzdHJpbmdpZmllZC5sZW5ndGg7IGluZGV4ICs9IDEpIHtcbiAgICAgICAgc3RyaW5naWZpZWRbaW5kZXhdID0gYCR7aW5kZW50fSR7c3RyaW5naWZpZWRbaW5kZXhdfWA7XG4gICAgICB9XG4gICAgfVxuICAgIHN0cmluZ2lmaWVkWzBdID0gYCR7aW5kZW50fSR7c3RyaW5naWZpZWRbMF19YDtcbiAgICByZXR1cm4gc3RyaW5naWZpZWQuam9pbignXFxuJyk7XG4gIH0pO1xuICBjb25zdCBjbG9zaW5nSW5kZW50ID0gJyAgJy5yZXBlYXQobGV2ZWwpO1xuICByZXR1cm4gYFtcXG4ke2xpbmVzLmpvaW4oJ1xcbicpfVxcbiR7Y2xvc2luZ0luZGVudH1dYDtcbn1cblxuZnVuY3Rpb24gc3RyaW5naWZ5T2JqZWN0KG9iamVjdDogUGFyc2VkT2JqZWN0LCBsZXZlbDogbnVtYmVyKTogc3RyaW5nIHtcbiAgY29uc3QgaW5kZW50ID0gJyAgJy5yZXBlYXQobGV2ZWwgKyAxKTtcbiAgY29uc3QgbGluZXMgPSBPYmplY3QuZW50cmllcyhvYmplY3QpLm1hcCgoW2tleSwgdmFsdWVdKSA9PiB7XG4gICAgY29uc3Qgc3RyaW5naWZpZWQgPSBzdHJpbmdpZnlWYWx1ZSh2YWx1ZSwgbGV2ZWwgKyAxKS5zcGxpdCgnXFxuJyk7XG4gICAgc3RyaW5naWZpZWRbc3RyaW5naWZpZWQubGVuZ3RoIC0gMV0gPSBgJHtzdHJpbmdpZmllZC5hdCgtMSl9LGA7XG4gICAgaWYgKHZhbHVlLmtpbmQgPT09ICdsaXRlcmFsJykge1xuICAgICAgZm9yIChsZXQgaW5kZXggPSAxOyBpbmRleCA8IHN0cmluZ2lmaWVkLmxlbmd0aDsgaW5kZXggKz0gMSkge1xuICAgICAgICBzdHJpbmdpZmllZFtpbmRleF0gPSBgJHtpbmRlbnR9JHtzdHJpbmdpZmllZFtpbmRleF19YDtcbiAgICAgIH1cbiAgICB9XG4gICAgc3RyaW5naWZpZWRbMF0gPSBgJHtpbmRlbnR9JHtrZXl9OiAke3N0cmluZ2lmaWVkWzBdfWA7XG4gICAgcmV0dXJuIHN0cmluZ2lmaWVkLmpvaW4oJ1xcbicpO1xuICB9KTtcbiAgY29uc3QgY2xvc2luZ0luZGVudCA9ICcgICcucmVwZWF0KGxldmVsKTtcbiAgaWYgKGxpbmVzLmxlbmd0aCA9PT0gMCkgcmV0dXJuIGB7XFxuJHtjbG9zaW5nSW5kZW50fX1gO1xuICByZXR1cm4gYHtcXG4ke2xpbmVzLmpvaW4oJ1xcbicpfVxcbiR7Y2xvc2luZ0luZGVudH19YDtcbn1cbiIsImV4cG9ydCBjb25zdCBnbG9iSWdub3JlID0gW1xuICAnKiovbm9kZV9tb2R1bGVzLyoqJyxcbiAgJyoqLy52ZW52LyoqJyxcbiAgJyoqL3Rlc3QtZml4dHVyZXMvKionLFxuICAnKiovdGVzdC9maXh0dXJlcy8qKicsXG4gICcqKi9kaXN0LyoqJyxcbiAgJyoqL2J1aWxkLyoqJyxcbiAgJyoqL3RhcmdldC8qKicsXG4gICcqKi90ZW1wLyoqJyxcbiAgJyoqL3RtcC8qKicsXG5dO1xuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMvcHJvbWlzZXMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IGZnIGZyb20gJ2Zhc3QtZ2xvYic7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGdsb2JJZ25vcmUgfSBmcm9tICcuLi91dGlscy9nbG9iVXRpbC5qcyc7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBmaXhQcmlzbWFFbnZGaWxlcyhjb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdmaXhQcmlzbWFFbnZGaWxlcycsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBlbnZGaWxlcyA9IGF3YWl0IGZnLmdsb2IoWycqLmVudicsICcqLmVudi4qJ10sIHsgZG90OiB0cnVlLCBjd2Q6IGNvbmZpZy5kaXJQYXRoLCBpZ25vcmU6IGdsb2JJZ25vcmUgfSk7XG4gICAgZm9yIChjb25zdCBlbnZGaWxlIG9mIGVudkZpbGVzKSB7XG4gICAgICBjb25zdCBlbnZGaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgZW52RmlsZSk7XG4gICAgICBjb25zdCBjb250ZW50ID0gYXdhaXQgZnMucmVhZEZpbGUoZW52RmlsZVBhdGgsICd1dGY4Jyk7XG4gICAgICBjb25zdCBuZXdDb250ZW50ID0gY29udGVudC5yZXBsYWNlKFxuICAgICAgICAvREFUQUJBU0VfVVJMPVwiPyguK1xcLnNxbGl0ZTMpXCI/W1xcbiRdLyxcbiAgICAgICAgJ0RBVEFCQVNFX1VSTD1cIiQxP2Nvbm5lY3Rpb25fbGltaXQ9MVwiXFxuJ1xuICAgICAgKTtcbiAgICAgIGF3YWl0IGZzLndyaXRlRmlsZShlbnZGaWxlUGF0aCwgbmV3Q29udGVudCk7XG4gICAgfVxuICB9KTtcbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBmaXhUZXN0RGlyZWN0b3JpZXNVcGRhdGluZ1BhY2thZ2VKc29uKHBhY2thZ2VEaXJQYXRoczogc3RyaW5nW10pOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdmaXhUZXN0RGlyZWN0b3JpZXNVcGRhdGluZ1BhY2thZ2VKc29uJywgYXN5bmMgKCkgPT4ge1xuICAgIGF3YWl0IFByb21pc2UuYWxsKFxuICAgICAgcGFja2FnZURpclBhdGhzLm1hcChhc3luYyAocGFja2FnZURpclBhdGgpID0+IHtcbiAgICAgICAgY29uc3QgbmV3VGVzdERpclBhdGggPSBwYXRoLmpvaW4ocGFja2FnZURpclBhdGgsICd0ZXN0Jyk7XG4gICAgICAgIGZvciAoY29uc3Qgb2xkVGVzdERpck5hbWUgb2YgWydfX3Rlc3RzX18nLCAndGVzdHMnXSkge1xuICAgICAgICAgIGNvbnN0IG9sZFRlc3REaXJQYXRoID0gcGF0aC5qb2luKHBhY2thZ2VEaXJQYXRoLCBvbGRUZXN0RGlyTmFtZSk7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGF3YWl0IGZzLnByb21pc2VzLnJlbmFtZShvbGRUZXN0RGlyUGF0aCwgbmV3VGVzdERpclBhdGgpO1xuICAgICAgICAgICAgY29uc3Qgb2xkQ29udGVudCA9IGF3YWl0IGZzLnByb21pc2VzLnJlYWRGaWxlKHBhdGguam9pbihwYWNrYWdlRGlyUGF0aCwgJ3BhY2thZ2UuanNvbicpLCAndXRmOCcpO1xuICAgICAgICAgICAgY29uc3QgbmV3Q29udGVudCA9IG9sZENvbnRlbnQucmVwbGFjZUFsbChvbGRUZXN0RGlyTmFtZSwgJ3Rlc3QnKTtcbiAgICAgICAgICAgIGlmIChvbGRDb250ZW50ID09PSBuZXdDb250ZW50KSByZXR1cm47XG5cbiAgICAgICAgICAgIGF3YWl0IGZzLnByb21pc2VzLndyaXRlRmlsZShwYXRoLmpvaW4ocGFja2FnZURpclBhdGgsICdwYWNrYWdlLmpzb24nKSwgbmV3Q29udGVudCk7XG4gICAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgICAvLyBkbyBub3RoaW5nXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9KVxuICAgICk7XG4gIH0pO1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMvcHJvbWlzZXMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHsgaWdub3JlRW5vZW50QXN5bmMgfSBmcm9tICdAd2lsbGJvb3N0ZXIvc2hhcmVkLWxpYic7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZml4VHlwZURlZmluaXRpb25zKFxuICBjb25maWc6IFBhY2thZ2VDb25maWcsXG4gIGNvbmZpZ3NJbmNsdWRpbmdDaGlsZHJlbjogUGFja2FnZUNvbmZpZ1tdXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdmaXhUeXBlRGVmaW5pdGlvbnMnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgbGliVHlwZURpclBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICdAdHlwZXMnKTtcbiAgICBjb25zdCBzcmNUeXBlRGlyUGF0aCA9XG4gICAgICBjb25maWcuaXNSb290ICYmIGNvbmZpZy5kb2VzQ29udGFpblN1YlBhY2thZ2VKc29ucyA/IHVuZGVmaW5lZCA6IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJ3NyYycsICd0eXBlcycpO1xuXG4gICAgY29uc3QgZGlyZW50cyA9IGF3YWl0IGlnbm9yZUVub2VudEFzeW5jKCgpID0+IGZzLnJlYWRkaXIobGliVHlwZURpclBhdGgsIHsgd2l0aEZpbGVUeXBlczogdHJ1ZSB9KSk7XG4gICAgaWYgKCFkaXJlbnRzKSByZXR1cm47XG5cbiAgICBmb3IgKGNvbnN0IGRpcmVudCBvZiBkaXJlbnRzKSB7XG4gICAgICBjb25zdCBkaXJOYW1lID0gZGlyZW50Lm5hbWUuc2xpY2UoMCwgLTUpO1xuICAgICAgY29uc3QgaGFzVHlwZURlY2xhcmF0aW9uRXh0ZW5zaW9uID0gZGlyZW50Lm5hbWUuZW5kc1dpdGgoJy5kLnRzJyk7XG4gICAgICBsZXQgcGFja2FnZU5hbWUgPSBoYXNUeXBlRGVjbGFyYXRpb25FeHRlbnNpb24gPyBkaXJOYW1lIDogZGlyZW50Lm5hbWU7XG4gICAgICBpZiAocGFja2FnZU5hbWUuaW5jbHVkZXMoJ19fJykpIHtcbiAgICAgICAgcGFja2FnZU5hbWUgPSBgQCR7cGFja2FnZU5hbWUucmVwbGFjZSgnX18nLCAnLycpfWA7XG4gICAgICB9XG4gICAgICBjb25zdCBoYXNMaWJyYXJ5ID0gY29uZmlnc0luY2x1ZGluZ0NoaWxkcmVuLnNvbWUoXG4gICAgICAgIChjb25maWcpID0+XG4gICAgICAgICAgY29uZmlnLnBhY2thZ2VKc29uPy5kZXBlbmRlbmNpZXM/LltwYWNrYWdlTmFtZV0gfHwgY29uZmlnLnBhY2thZ2VKc29uPy5kZXZEZXBlbmRlbmNpZXM/LltwYWNrYWdlTmFtZV1cbiAgICAgICk7XG5cbiAgICAgIGlmIChkaXJlbnQuaXNGaWxlKCkgJiYgaGFzVHlwZURlY2xhcmF0aW9uRXh0ZW5zaW9uKSB7XG4gICAgICAgIGlmIChoYXNMaWJyYXJ5KSB7XG4gICAgICAgICAgLy8gTW92ZSBAdHlwZXMvPG5hbWU+L2luZGV4LmQudHMgaWYgaW5zdGFsbGVkXG4gICAgICAgICAgYXdhaXQgZnMubWtkaXIocGF0aC5qb2luKGxpYlR5cGVEaXJQYXRoLCBkaXJOYW1lKSk7XG4gICAgICAgICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+XG4gICAgICAgICAgICBmcy5yZW5hbWUocGF0aC5qb2luKGxpYlR5cGVEaXJQYXRoLCBkaXJlbnQubmFtZSksIHBhdGguam9pbihsaWJUeXBlRGlyUGF0aCwgZGlyTmFtZSwgJ2luZGV4LmQudHMnKSlcbiAgICAgICAgICApO1xuICAgICAgICB9IGVsc2UgaWYgKHNyY1R5cGVEaXJQYXRoKSB7XG4gICAgICAgICAgLy8gTW92ZSBzcmMvdHlwZXMvPG5hbWU+IGlmIG5vdCBpbnN0YWxsZWRcbiAgICAgICAgICBhd2FpdCBmcy5ta2RpcihzcmNUeXBlRGlyUGF0aCwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gICAgICAgICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+XG4gICAgICAgICAgICBmcy5yZW5hbWUocGF0aC5qb2luKGxpYlR5cGVEaXJQYXRoLCBkaXJlbnQubmFtZSksIHBhdGguam9pbihzcmNUeXBlRGlyUGF0aCwgZGlyZW50Lm5hbWUpKVxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoZGlyZW50LmlzRGlyZWN0b3J5KCkgJiYgc3JjVHlwZURpclBhdGggJiYgIWhhc0xpYnJhcnkpIHtcbiAgICAgICAgLy8gTW92ZSBzcmMvdHlwZXMvPG5hbWU+LmQudHMgaWYgbm90IGluc3RhbGxlZFxuICAgICAgICBhd2FpdCBmcy5ta2RpcihzcmNUeXBlRGlyUGF0aCwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gICAgICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PlxuICAgICAgICAgIGlnbm9yZUVub2VudEFzeW5jKCgpID0+XG4gICAgICAgICAgICBmcy5yZW5hbWUoXG4gICAgICAgICAgICAgIHBhdGguam9pbihsaWJUeXBlRGlyUGF0aCwgZGlyZW50Lm5hbWUsICdpbmRleC5kLnRzJyksXG4gICAgICAgICAgICAgIHBhdGguam9pbihzcmNUeXBlRGlyUGF0aCwgYCR7ZGlyZW50Lm5hbWV9LmQudHNgKVxuICAgICAgICAgICAgKVxuICAgICAgICAgIClcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG4gIH0pO1xufVxuIiwiLyogZXNsaW50LWRpc2FibGUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVuc2FmZS1hc3NpZ25tZW50LCBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW5zYWZlLWNhbGwsIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnNhZmUtbWVtYmVyLWFjY2VzcywgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVuc2FmZS1hcmd1bWVudCAqL1xuXG5pbXBvcnQgbWVyZ2UgZnJvbSAnZGVlcG1lcmdlJztcblxuZXhwb3J0IGZ1bmN0aW9uIG92ZXJ3cml0ZU1lcmdlPFQ+KGRlc3RpbmF0aW9uQXJyYXk6IFRbXSwgc291cmNlQXJyYXk6IFRbXSk6IFRbXSB7XG4gIHJldHVybiBzb3VyY2VBcnJheTtcbn1cblxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbmV4cG9ydCBmdW5jdGlvbiBjb21iaW5lTWVyZ2UodGFyZ2V0OiBvYmplY3RbXSwgc291cmNlOiBvYmplY3RbXSwgb3B0aW9uczogYW55KTogb2JqZWN0W10ge1xuICBjb25zdCBkZXN0aW5hdGlvbiA9IFsuLi50YXJnZXRdO1xuXG4gIGZvciAoY29uc3QgW2luZGV4LCBpdGVtXSBvZiBzb3VyY2UuZW50cmllcygpKSB7XG4gICAgaWYgKGRlc3RpbmF0aW9uW2luZGV4XSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBkZXN0aW5hdGlvbltpbmRleF0gPSBvcHRpb25zLmNsb25lVW5sZXNzT3RoZXJ3aXNlU3BlY2lmaWVkKGl0ZW0sIG9wdGlvbnMpO1xuICAgIH0gZWxzZSBpZiAob3B0aW9ucy5pc01lcmdlYWJsZU9iamVjdChpdGVtKSkge1xuICAgICAgZGVzdGluYXRpb25baW5kZXhdID0gbWVyZ2UodGFyZ2V0W2luZGV4XSBhcyBvYmplY3QsIGl0ZW0sIG9wdGlvbnMpO1xuICAgIH0gZWxzZSBpZiAoIXRhcmdldC5pbmNsdWRlcyhpdGVtKSkge1xuICAgICAgZGVzdGluYXRpb24ucHVzaChpdGVtKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGRlc3RpbmF0aW9uO1xufVxuIiwiZXhwb3J0IGZ1bmN0aW9uIG1vdmVUb0JvdHRvbTxUT2JqIGV4dGVuZHMgUmVjb3JkPFRLZXksIHVua25vd24+LCBUS2V5IGV4dGVuZHMgc3RyaW5nIHwgbnVtYmVyIHwgc3ltYm9sPihcbiAgb2JqOiBUT2JqLFxuICBrZXk6IFRLZXlcbik6IFRPYmoge1xuICBjb25zdCB2YWx1ZSA9IG9ialtrZXldO1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWR5bmFtaWMtZGVsZXRlXG4gIGRlbGV0ZSBvYmpba2V5XTtcbiAgKG9iaiBhcyBSZWNvcmQ8VEtleSwgdW5rbm93bj4pW2tleV0gPSB2YWx1ZTtcbiAgcmV0dXJuIG9iajtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHNvcnRLZXlzPFQgZXh0ZW5kcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj4ob2JqOiBUKTogVCB7XG4gIGNvbnN0IGtleUFuZFZhbHVlcyA9IE9iamVjdC5lbnRyaWVzKG9iaikudG9Tb3J0ZWQoKFtrZXkxXSwgW2tleTJdKSA9PiBrZXkxLmxvY2FsZUNvbXBhcmUoa2V5MikpO1xuICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBrZXlBbmRWYWx1ZXMpIHtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWR5bmFtaWMtZGVsZXRlXG4gICAgZGVsZXRlIG9ialtrZXldO1xuICAgIChvYmogYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pW2tleV0gPSB2YWx1ZTtcblxuICAgIC8vIGlmIHZhbHVlIGlzIGFuIG9iamVjdCwgc29ydCB0aGUga2V5cyBvZiB0aGUgb2JqZWN0XG4gICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiYgdmFsdWUgIT09IG51bGwpIHtcbiAgICAgIHNvcnRLZXlzKHZhbHVlIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIG9iajtcbn1cbiIsIi8qIGVzbGludC1kaXNhYmxlIHVuaWNvcm4vbm8tbnVsbCAqL1xuXG5pbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgbWVyZ2UgZnJvbSAnZGVlcG1lcmdlJztcbmltcG9ydCB5YW1sIGZyb20gJ2pzLXlhbWwnO1xuaW1wb3J0IGNsb25lRGVlcCBmcm9tICdsb2Rhc2guY2xvbmVkZWVwJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgY29tYmluZU1lcmdlIH0gZnJvbSAnLi4vdXRpbHMvbWVyZ2VVdGlsLmpzJztcbmltcG9ydCB7IG1vdmVUb0JvdHRvbSwgc29ydEtleXMgfSBmcm9tICcuLi91dGlscy9vYmplY3RVdGlsLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuXG5pbnRlcmZhY2UgV29ya2Zsb3cge1xuICBuYW1lPzogc3RyaW5nO1xuICBvbj86IE9uO1xuICBjb25jdXJyZW5jeT86IENvbmN1cnJlbmN5O1xuICBqb2JzOiBSZWNvcmQ8c3RyaW5nLCBKb2I+O1xufVxuXG5pbnRlcmZhY2UgQ29uY3VycmVuY3kge1xuICBncm91cDogc3RyaW5nO1xuICAnY2FuY2VsLWluLXByb2dyZXNzJzogYm9vbGVhbjtcbn1cblxuaW50ZXJmYWNlIE9uIHtcbiAgaXNzdWVzPzogVHlwZXM7XG4gIHB1bGxfcmVxdWVzdD86IFB1bGxSZXF1ZXN0O1xuICBwdWxsX3JlcXVlc3RfdGFyZ2V0PzogVHlwZXM7XG4gIHB1c2g/OiBQdXNoO1xuICBzY2hlZHVsZT86IFNjaGVkdWxlW107XG4gIHdvcmtmbG93X2Rpc3BhdGNoPzogbnVsbDtcbn1cblxuaW50ZXJmYWNlIFB1bGxSZXF1ZXN0IHtcbiAgJ3BhdGhzLWlnbm9yZSc/OiBzdHJpbmdbXTtcbiAgdHlwZXM/OiBzdHJpbmdbXTtcbn1cblxuaW50ZXJmYWNlIFB1c2gge1xuICBicmFuY2hlczogc3RyaW5nW107XG4gICdwYXRocy1pZ25vcmUnPzogc3RyaW5nW107XG59XG5cbmludGVyZmFjZSBTY2hlZHVsZSB7XG4gIGNyb246IHN0cmluZztcbn1cblxuaW50ZXJmYWNlIFR5cGVzIHtcbiAgdHlwZXM6IHN0cmluZ1tdO1xufVxuXG5pbnRlcmZhY2UgSm9iIHtcbiAgdXNlcz86IHN0cmluZztcbiAgaWY/OiBzdHJpbmc7XG4gIHNlY3JldHM/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgd2l0aD86IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xufVxuXG5jb25zdCB3b3JrZmxvd3MgPSB7XG4gIHRlc3Q6IHtcbiAgICBuYW1lOiAnVGVzdCcsXG4gICAgb246IHtcbiAgICAgIHB1bGxfcmVxdWVzdDogbnVsbCxcbiAgICAgIHB1c2g6IHtcbiAgICAgICAgYnJhbmNoZXM6IFsnbWFpbicsICd3YmZ5J10sXG4gICAgICB9LFxuICAgIH0sXG4gICAgLy8gY2YuIGh0dHBzOi8vZG9jcy5naXRodWIuY29tL2VuL2FjdGlvbnMvdXNpbmctam9icy91c2luZy1jb25jdXJyZW5jeSNleGFtcGxlLW9ubHktY2FuY2VsLWluLXByb2dyZXNzLWpvYnMtb3ItcnVucy1mb3ItdGhlLWN1cnJlbnQtd29ya2Zsb3dcbiAgICBjb25jdXJyZW5jeToge1xuICAgICAgZ3JvdXA6ICcke3sgZ2l0aHViLndvcmtmbG93IH19LSR7eyBnaXRodWIucmVmIH19JyxcbiAgICAgICdjYW5jZWwtaW4tcHJvZ3Jlc3MnOiB0cnVlLFxuICAgIH0sXG4gICAgcGVybWlzc2lvbnM6IHtcbiAgICAgIC8vIGZvciBsaW50ZXIgZml4XG4gICAgICBjb250ZW50czogJ3dyaXRlJyxcbiAgICB9LFxuICAgIGpvYnM6IHtcbiAgICAgIHRlc3Q6IHtcbiAgICAgICAgdXNlczogJ1dpbGxCb29zdGVyL3JldXNhYmxlLXdvcmtmbG93cy8uZ2l0aHViL3dvcmtmbG93cy90ZXN0LnltbEBtYWluJyxcbiAgICAgIH0sXG4gICAgfSxcbiAgfSxcbiAgYXV0b2ZpeDoge1xuICAgIG5hbWU6ICdGaXggY29kZSBhdXRvbWF0aWNhbGx5JyxcbiAgICBvbjoge1xuICAgICAgcHVsbF9yZXF1ZXN0OiBudWxsLFxuICAgIH0sXG4gICAgLy8gY2YuIGh0dHBzOi8vZG9jcy5naXRodWIuY29tL2VuL2FjdGlvbnMvdXNpbmctam9icy91c2luZy1jb25jdXJyZW5jeSNleGFtcGxlLW9ubHktY2FuY2VsLWluLXByb2dyZXNzLWpvYnMtb3ItcnVucy1mb3ItdGhlLWN1cnJlbnQtd29ya2Zsb3dcbiAgICBjb25jdXJyZW5jeToge1xuICAgICAgZ3JvdXA6ICcke3sgZ2l0aHViLndvcmtmbG93IH19LSR7eyBnaXRodWIucmVmIH19JyxcbiAgICAgICdjYW5jZWwtaW4tcHJvZ3Jlc3MnOiB0cnVlLFxuICAgIH0sXG4gICAgam9iczoge1xuICAgICAgdGVzdDoge1xuICAgICAgICB1c2VzOiAnV2lsbEJvb3N0ZXIvcmV1c2FibGUtd29ya2Zsb3dzLy5naXRodWIvd29ya2Zsb3dzL2F1dG9maXgueW1sQG1haW4nLFxuICAgICAgfSxcbiAgICB9LFxuICB9LFxuICByZWxlYXNlOiB7XG4gICAgbmFtZTogJ1JlbGVhc2UnLFxuICAgIG9uOiB7XG4gICAgICBwdXNoOiB7XG4gICAgICAgIGJyYW5jaGVzOiBbXSxcbiAgICAgIH0sXG4gICAgfSxcbiAgICBjb25jdXJyZW5jeToge1xuICAgICAgZ3JvdXA6ICcke3sgZ2l0aHViLndvcmtmbG93IH19JyxcbiAgICAgICdjYW5jZWwtaW4tcHJvZ3Jlc3MnOiBmYWxzZSxcbiAgICB9LFxuICAgIHBlcm1pc3Npb25zOiB7XG4gICAgICAvLyBodHRwczovL2RvY3MubnBtanMuY29tL3RydXN0ZWQtcHVibGlzaGVycyNzdGVwLTItY29uZmlndXJlLXlvdXItY2ljZC13b3JrZmxvd1xuICAgICAgJ2lkLXRva2VuJzogJ3dyaXRlJyxcbiAgICAgIC8vIGZvciBzZW1hbnRpYy1yZWxlYXNlXG4gICAgICBjb250ZW50czogJ3dyaXRlJyxcbiAgICB9LFxuICAgIGpvYnM6IHtcbiAgICAgIHJlbGVhc2U6IHtcbiAgICAgICAgdXNlczogJ1dpbGxCb29zdGVyL3JldXNhYmxlLXdvcmtmbG93cy8uZ2l0aHViL3dvcmtmbG93cy9yZWxlYXNlLnltbEBtYWluJyxcbiAgICAgIH0sXG4gICAgfSxcbiAgfSxcbiAgJ3NlbWFudGljLXByJzoge1xuICAgIG5hbWU6ICdMaW50IFBSIHRpdGxlJyxcbiAgICBvbjoge1xuICAgICAgcHVsbF9yZXF1ZXN0X3RhcmdldDoge1xuICAgICAgICB0eXBlczogWydvcGVuZWQnLCAnZWRpdGVkJywgJ3N5bmNocm9uaXplJ10sXG4gICAgICB9LFxuICAgIH0sXG4gICAgam9iczoge1xuICAgICAgJ3NlbWFudGljLXByJzoge1xuICAgICAgICB1c2VzOiAnV2lsbEJvb3N0ZXIvcmV1c2FibGUtd29ya2Zsb3dzLy5naXRodWIvd29ya2Zsb3dzL3NlbWFudGljLXByLnltbEBtYWluJyxcbiAgICAgIH0sXG4gICAgfSxcbiAgfSxcbiAgc3luYzoge1xuICAgIG5hbWU6ICdTeW5jJyxcbiAgICBvbjoge30sXG4gICAgcGVybWlzc2lvbnM6IHtcbiAgICAgIC8vIGZvciBjb21taXRpbmcgY2hhbmdlc1xuICAgICAgY29udGVudHM6ICd3cml0ZScsXG4gICAgfSxcbiAgICBqb2JzOiB7XG4gICAgICBzeW5jOiB7IHVzZXM6ICdXaWxsQm9vc3Rlci9yZXVzYWJsZS13b3JrZmxvd3MvLmdpdGh1Yi93b3JrZmxvd3Mvc3luYy55bWxAbWFpbicgfSxcbiAgICB9LFxuICB9LFxuICAnY2xvc2UtY29tbWVudCc6IHtcbiAgICBuYW1lOiAnQWRkIGNsb3NlIGNvbW1lbnQnLFxuICAgIG9uOiB7XG4gICAgICBwdWxsX3JlcXVlc3Q6IHtcbiAgICAgICAgdHlwZXM6IFsnb3BlbmVkJ10sXG4gICAgICB9LFxuICAgIH0sXG4gICAgam9iczoge1xuICAgICAgJ2Nsb3NlLWNvbW1lbnQnOiB7XG4gICAgICAgIHVzZXM6ICdXaWxsQm9vc3Rlci9yZXVzYWJsZS13b3JrZmxvd3MvLmdpdGh1Yi93b3JrZmxvd3MvY2xvc2UtY29tbWVudC55bWxAbWFpbicsXG4gICAgICB9LFxuICAgIH0sXG4gIH0sXG4gICdnZW4tcHItY2xhdWRlJzoge1xuICAgIG5hbWU6ICdHZW5lcmF0ZSBQUiB3aXRoIENsYXVkZSBDb2RlJyxcbiAgICBvbjoge1xuICAgICAgaXNzdWVzOiB7XG4gICAgICAgIHR5cGVzOiBbJ2xhYmVsZWQnXSxcbiAgICAgIH0sXG4gICAgICBwdWxsX3JlcXVlc3Q6IHtcbiAgICAgICAgdHlwZXM6IFsnbGFiZWxlZCddLFxuICAgICAgfSxcbiAgICB9LFxuICAgIGpvYnM6IHtcbiAgICAgICdnZW4tcHInOiB7XG4gICAgICAgIGlmOiBcImNvbnRhaW5zKGdpdGh1Yi5ldmVudC5sYWJlbC5uYW1lLCAnZ2VuLXByLWFsbCcpIHx8IGNvbnRhaW5zKGdpdGh1Yi5ldmVudC5sYWJlbC5uYW1lLCAnZ2VuLXByLWNsYXVkZScpXCIsXG4gICAgICAgIHVzZXM6ICdXaWxsQm9vc3Rlci9yZXVzYWJsZS13b3JrZmxvd3MvLmdpdGh1Yi93b3JrZmxvd3MvZ2VuLXByLnltbEBtYWluJyxcbiAgICAgICAgd2l0aDoge1xuICAgICAgICAgICdjb2RpbmctdG9vbCc6ICdjbGF1ZGUtY29kZScsXG4gICAgICAgICAgJ2lzc3VlLW51bWJlcic6ICcke3sgZ2l0aHViLmV2ZW50Lmlzc3VlLm51bWJlciB8fCBnaXRodWIuZXZlbnQubnVtYmVyIH19JyxcbiAgICAgICAgICAndGVzdC1jb21tYW5kJzogJ3lhcm58YnVuIGNoZWNrLWFsbC1mb3ItYWknLFxuICAgICAgICB9LFxuICAgICAgICBzZWNyZXRzOiB7XG4gICAgICAgICAgQ0xBVURFX0NPREVfT0FVVEhfVE9LRU46ICcke3sgc2VjcmV0cy5DTEFVREVfQ09ERV9PQVVUSF9UT0tFTiB9fScsXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgIH0sXG4gIH0sXG4gICdnZW4tcHItY29kZXgnOiB7XG4gICAgbmFtZTogJ0dlbmVyYXRlIFBSIHdpdGggQ29kZXggQ0xJJyxcbiAgICBvbjoge1xuICAgICAgaXNzdWVzOiB7XG4gICAgICAgIHR5cGVzOiBbJ2xhYmVsZWQnXSxcbiAgICAgIH0sXG4gICAgICBwdWxsX3JlcXVlc3Q6IHtcbiAgICAgICAgdHlwZXM6IFsnbGFiZWxlZCddLFxuICAgICAgfSxcbiAgICB9LFxuICAgIGpvYnM6IHtcbiAgICAgICdnZW4tcHInOiB7XG4gICAgICAgIGlmOiBcImNvbnRhaW5zKGdpdGh1Yi5ldmVudC5sYWJlbC5uYW1lLCAnZ2VuLXByLWFsbCcpIHx8IGNvbnRhaW5zKGdpdGh1Yi5ldmVudC5sYWJlbC5uYW1lLCAnZ2VuLXByLWNvZGV4JylcIixcbiAgICAgICAgdXNlczogJ1dpbGxCb29zdGVyL3JldXNhYmxlLXdvcmtmbG93cy8uZ2l0aHViL3dvcmtmbG93cy9nZW4tcHIueW1sQG1haW4nLFxuICAgICAgICB3aXRoOiB7XG4gICAgICAgICAgJ2NvZGluZy10b29sJzogJ2NvZGV4LWNsaScsXG4gICAgICAgICAgJ2lzc3VlLW51bWJlcic6ICcke3sgZ2l0aHViLmV2ZW50Lmlzc3VlLm51bWJlciB8fCBnaXRodWIuZXZlbnQubnVtYmVyIH19JyxcbiAgICAgICAgICAndGVzdC1jb21tYW5kJzogJ3lhcm58YnVuIGNoZWNrLWFsbC1mb3ItYWknLFxuICAgICAgICB9LFxuICAgICAgICBzZWNyZXRzOiB7XG4gICAgICAgICAgT1BFTkFJX0FQSV9LRVk6ICcke3sgc2VjcmV0cy5PUEVOQUlfQVBJX0tFWSB9fScsXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgIH0sXG4gIH0sXG4gICdnZW4tcHItZ2VtaW5pJzoge1xuICAgIG5hbWU6ICdHZW5lcmF0ZSBQUiB3aXRoIEdlbWluaSBDTEknLFxuICAgIG9uOiB7XG4gICAgICBpc3N1ZXM6IHtcbiAgICAgICAgdHlwZXM6IFsnbGFiZWxlZCddLFxuICAgICAgfSxcbiAgICAgIHB1bGxfcmVxdWVzdDoge1xuICAgICAgICB0eXBlczogWydsYWJlbGVkJ10sXG4gICAgICB9LFxuICAgIH0sXG4gICAgam9iczoge1xuICAgICAgJ2dlbi1wcic6IHtcbiAgICAgICAgaWY6IFwiY29udGFpbnMoZ2l0aHViLmV2ZW50LmxhYmVsLm5hbWUsICdnZW4tcHItYWxsJykgfHwgY29udGFpbnMoZ2l0aHViLmV2ZW50LmxhYmVsLm5hbWUsICdnZW4tcHItZ2VtaW5pJylcIixcbiAgICAgICAgdXNlczogJ1dpbGxCb29zdGVyL3JldXNhYmxlLXdvcmtmbG93cy8uZ2l0aHViL3dvcmtmbG93cy9nZW4tcHIueW1sQG1haW4nLFxuICAgICAgICB3aXRoOiB7XG4gICAgICAgICAgJ2NvZGluZy10b29sJzogJ2dlbWluaS1jbGknLFxuICAgICAgICAgICdpc3N1ZS1udW1iZXInOiAnJHt7IGdpdGh1Yi5ldmVudC5pc3N1ZS5udW1iZXIgfHwgZ2l0aHViLmV2ZW50Lm51bWJlciB9fScsXG4gICAgICAgICAgJ3Rlc3QtY29tbWFuZCc6ICd5YXJufGJ1biBjaGVjay1hbGwtZm9yLWFpJyxcbiAgICAgICAgfSxcbiAgICAgICAgc2VjcmV0czoge1xuICAgICAgICAgIEdFTUlOSV9BUElfS0VZOiAnJHt7IHNlY3JldHMuR0VNSU5JX0FQSV9LRVkgfX0nLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICB9LFxuICB9LFxufSBhcyBjb25zdDtcblxudHlwZSBLbm93bktpbmQgPSBrZXlvZiB0eXBlb2Ygd29ya2Zsb3dzIHwgJ2RlcGxveSc7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZW5lcmF0ZVdvcmtmbG93cyhyb290Q29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IGZpbGVOYW1lc1RvQmVSZW1vdmVkID0gW1xuICAgICdhZGQtZm9jdXNlZC1pc3N1ZS10by1wcm9qZWN0LnltbCcsXG4gICAgJ2FkZC1pc3N1ZS10by1wcm9qZWN0LnltbCcsXG4gICAgJ2FkZC1yZWFkeS1pc3N1ZS10by1wcm9qZWN0LnltbCcsXG4gICAgJ25vdGlmeS1yZWFkeS55bWwnLFxuICAgICd3YmZ5LnltbCcsXG4gICAgJ3diZnktbWVyZ2UueW1sJyxcbiAgXTtcblxuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2dlbmVyYXRlV29ya2Zsb3cnLCBhc3luYyAoKSA9PiB7XG4gICAgaWYgKGlzUmV1c2FibGVXb3JrZmxvd3NSZXBvKHJvb3RDb25maWcucmVwb3NpdG9yeSkpIHtcbiAgICAgIC8vIERvbid0IHRvdWNoIHJldXNhYmxlLXdvcmtmbG93cyByZXBvIGJlY2F1c2UgaXQgaG9zdHMgdXBzdHJlYW0gd29ya2Zsb3cgZGVmaW5pdGlvbnMuXG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3Qgd29ya2Zsb3dzUGF0aCA9IHBhdGgucmVzb2x2ZShyb290Q29uZmlnLmRpclBhdGgsICcuZ2l0aHViJywgJ3dvcmtmbG93cycpO1xuICAgIGF3YWl0IGZzLnByb21pc2VzLm1rZGlyKHdvcmtmbG93c1BhdGgsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuXG4gICAgLy8gUmVtb3ZlIGNvbmZpZyBvZiBzZW1hbnRpYyBwdWxsIHJlcXVlc3RcbiAgICBjb25zdCBzZW1hbnRpY1ltbFBhdGggPSBwYXRoLnJlc29sdmUocm9vdENvbmZpZy5kaXJQYXRoLCAnLmdpdGh1YicsICdzZW1hbnRpYy55bWwnKTtcbiAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnMucHJvbWlzZXMucm0oc2VtYW50aWNZbWxQYXRoLCB7IGZvcmNlOiB0cnVlLCByZWN1cnNpdmU6IHRydWUgfSkpO1xuXG4gICAgY29uc3QgZW50cmllcyA9IGF3YWl0IGZzLnByb21pc2VzLnJlYWRkaXIod29ya2Zsb3dzUGF0aCwgeyB3aXRoRmlsZVR5cGVzOiB0cnVlIH0pO1xuICAgIGNvbnN0IGZpbGVOYW1lU2V0ID0gbmV3IFNldChbXG4gICAgICAndGVzdC55bWwnLFxuICAgICAgJ2F1dG9maXgueW1sJyxcbiAgICAgICdzZW1hbnRpYy1wci55bWwnLFxuICAgICAgJ2Nsb3NlLWNvbW1lbnQueW1sJyxcbiAgICAgICdnZW4tcHItY2xhdWRlLnltbCcsXG4gICAgICAnZ2VuLXByLWNvZGV4LnltbCcsXG4gICAgICAnZ2VuLXByLWdlbWluaS55bWwnLFxuICAgICAgLi4uZW50cmllcy5maWx0ZXIoKGRpcmVudCkgPT4gZGlyZW50LmlzRmlsZSgpICYmIGRpcmVudC5uYW1lLmVuZHNXaXRoKCcueW1sJykpLm1hcCgoZGlyZW50KSA9PiBkaXJlbnQubmFtZSksXG4gICAgXSk7XG4gICAgaWYgKHJvb3RDb25maWcuZGVwZW5kaW5nLnNlbWFudGljUmVsZWFzZSkge1xuICAgICAgZmlsZU5hbWVTZXQuYWRkKCdyZWxlYXNlLnltbCcpO1xuICAgIH1cbiAgICBmaWxlTmFtZVNldC5kZWxldGUoJ2F1dG9maXgueW1sJyk7XG4gICAgaWYgKCFyb290Q29uZmlnLmlzUHVibGljUmVwbykge1xuICAgICAgLy8gZm9yIGF1dG9maXguY2lcbiAgICAgIGZpbGVOYW1lc1RvQmVSZW1vdmVkLnB1c2goJ2F1dG9maXgueW1sJyk7XG4gICAgfVxuICAgIGZpbGVOYW1lU2V0LmRlbGV0ZSgnYWRkLWlzc3VlLXRvLXByb2plY3QueW1sJyk7XG4gICAgZmlsZU5hbWVTZXQuZGVsZXRlKCdhZGQtcmVhZHktaXNzdWUtdG8tcHJvamVjdC55bWwnKTtcbiAgICBmaWxlTmFtZVNldC5kZWxldGUoJ25vdGlmeS1yZWFkeS55bWwnKTtcblxuICAgIGZvciAoY29uc3QgZmlsZU5hbWUgb2YgZmlsZU5hbWVTZXQpIHtcbiAgICAgIC8vIOWun+mam+OBr0tub3duS2luZOS7peWkluOBruWApOOCguS7o+WFpeOBleOCjOOCi+OBk+OBqOOBq+azqOaEj1xuICAgICAgY29uc3Qga2luZCA9IHBhdGguYmFzZW5hbWUoZmlsZU5hbWUsICcueW1sJykgYXMgS25vd25LaW5kO1xuICAgICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IHdyaXRlV29ya2Zsb3dZYW1sKHJvb3RDb25maWcsIHdvcmtmbG93c1BhdGgsIGtpbmQpKTtcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IGRlcHJlY2F0ZWRGaWxlTmFtZSBvZiBmaWxlTmFtZXNUb0JlUmVtb3ZlZCkge1xuICAgICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+XG4gICAgICAgIGZzLnByb21pc2VzLnJtKHBhdGguam9pbih3b3JrZmxvd3NQYXRoLCBkZXByZWNhdGVkRmlsZU5hbWUpLCB7IGZvcmNlOiB0cnVlLCByZWN1cnNpdmU6IHRydWUgfSlcbiAgICAgICk7XG4gICAgfVxuICB9KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzUmV1c2FibGVXb3JrZmxvd3NSZXBvKHJlcG9zaXRvcnk/OiBzdHJpbmcpOiBib29sZWFuIHtcbiAgcmV0dXJuIHJlcG9zaXRvcnk/LmVuZHNXaXRoKCcvcmV1c2FibGUtd29ya2Zsb3dzJykgPz8gZmFsc2U7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHdyaXRlV29ya2Zsb3dZYW1sKGNvbmZpZzogUGFja2FnZUNvbmZpZywgd29ya2Zsb3dzUGF0aDogc3RyaW5nLCBraW5kOiBLbm93bktpbmQpOiBQcm9taXNlPHZvaWQ+IHtcbiAgbGV0IG5ld1NldHRpbmdzID0gY2xvbmVEZWVwKGtpbmQgaW4gd29ya2Zsb3dzID8gd29ya2Zsb3dzW2tpbmQgYXMga2V5b2YgdHlwZW9mIHdvcmtmbG93c10gOiB7fSkgYXMgV29ya2Zsb3c7XG4gIC8vIFNraXAgYSBicm9rZW4gd29ya2Zsb3dcbiAgaWYgKCEoJ2pvYnMnIGluIG5ld1NldHRpbmdzKSkgcmV0dXJuO1xuXG4gIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5qb2luKHdvcmtmbG93c1BhdGgsIGAke2tpbmR9LnltbGApO1xuICB0cnkge1xuICAgIGNvbnN0IG9sZENvbnRlbnQgPSBhd2FpdCBmcy5wcm9taXNlcy5yZWFkRmlsZShmaWxlUGF0aCwgJ3V0ZjgnKTtcbiAgICBjb25zdCBvbGRTZXR0aW5ncyA9IHlhbWwubG9hZChvbGRDb250ZW50KSBhcyBXb3JrZmxvdztcbiAgICBuZXdTZXR0aW5ncyA9IG1lcmdlLmFsbChbbmV3U2V0dGluZ3MsIG9sZFNldHRpbmdzLCBuZXdTZXR0aW5nc10sIHsgYXJyYXlNZXJnZTogY29tYmluZU1lcmdlIH0pIGFzIFdvcmtmbG93O1xuICB9IGNhdGNoIHtcbiAgICAvLyBkbyBub3RoaW5nXG4gIH1cblxuICBpZiAoa2luZC5zdGFydHNXaXRoKCdkZXBsb3knKSkge1xuICAgIG5ld1NldHRpbmdzID0ge1xuICAgICAgLi4ubmV3U2V0dGluZ3MsXG4gICAgICBjb25jdXJyZW5jeToge1xuICAgICAgICBncm91cDogJyR7eyBnaXRodWIud29ya2Zsb3cgfX0nLFxuICAgICAgICAnY2FuY2VsLWluLXByb2dyZXNzJzogZmFsc2UsXG4gICAgICB9LFxuICAgIH07XG4gICAgLy8gTW92ZSBqb2JzIHRvIHRoZSBib3R0b21cbiAgICBtb3ZlVG9Cb3R0b20obmV3U2V0dGluZ3MsICdqb2JzJyk7XG4gICAgaWYgKG5ld1NldHRpbmdzLm9uPy5wdXNoKSB7XG4gICAgICBuZXdTZXR0aW5ncy5vbi5wdXNoWydwYXRocy1pZ25vcmUnXSA9IFtcbiAgICAgICAgLi4ubmV3IFNldChbJyoqLm1kJywgJyoqL2RvY3MvKionLCAuLi4obmV3U2V0dGluZ3Mub24ucHVzaFsncGF0aHMtaWdub3JlJ10gPz8gW10pXSksXG4gICAgICBdO1xuICAgIH1cbiAgfVxuXG4gIGxldCBpc1JldXNhYmxlV29ya2Zsb3cgPSBmYWxzZTtcbiAgZm9yIChjb25zdCBqb2Igb2YgT2JqZWN0LnZhbHVlcyhuZXdTZXR0aW5ncy5qb2JzKSkge1xuICAgIC8vIElnbm9yZSBub24tcmV1c2FibGUgd29ya2Zsb3dzXG4gICAgaWYgKCFqb2IudXNlcz8uaW5jbHVkZXMoJy9yZXVzYWJsZS13b3JrZmxvd3MvJykpIGNvbnRpbnVlO1xuXG4gICAgbm9ybWFsaXplSm9iKGNvbmZpZywgam9iLCBraW5kKTtcbiAgICBpc1JldXNhYmxlV29ya2Zsb3cgPSB0cnVlO1xuICB9XG4gIGlmICghaXNSZXVzYWJsZVdvcmtmbG93KSByZXR1cm47XG5cbiAgc3dpdGNoIChraW5kKSB7XG4gICAgY2FzZSAncmVsZWFzZSc6IHtcbiAgICAgIGlmIChuZXdTZXR0aW5ncy5vbj8uc2NoZWR1bGUpIHtcbiAgICAgICAgZGVsZXRlIG5ld1NldHRpbmdzLm9uLnB1c2g7XG4gICAgICB9IGVsc2UgaWYgKG5ld1NldHRpbmdzLm9uPy5wdXNoICYmIGNvbmZpZy5yZWxlYXNlLmJyYW5jaGVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgbmV3U2V0dGluZ3Mub24ucHVzaC5icmFuY2hlcyA9IGNvbmZpZy5yZWxlYXNlLmJyYW5jaGVzO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gRG9uJ3QgdXNlIHJlbGVhc2UueW1sIGlmIHJlbGVhc2UgYnJhbmNoIGlzIG5vdCBzcGVjaWZpZWRcbiAgICAgICAgYXdhaXQgZnMucHJvbWlzZXMucm0ocGF0aC5qb2luKHdvcmtmbG93c1BhdGgsICdyZWxlYXNlLnltbCcpLCB7IGZvcmNlOiB0cnVlIH0pO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBicmVhaztcbiAgICB9XG4gICAgY2FzZSAndGVzdCc6IHtcbiAgICAgIC8vIERvbid0IHVzZSBgcGF0aHMtaWdub3JlYCBmb3IgdGVzdCBiZWNhdXNlIEdpdEh1YidzIEJyYW5jaCBQcm90ZWN0aW9uIGFuZCBSdWxlc2V0cyByZXF1aXJlIGpvYiBydW5uaW5nLlxuICAgICAgaWYgKG5ld1NldHRpbmdzLm9uPy5wdWxsX3JlcXVlc3QpIHtcbiAgICAgICAgZGVsZXRlIG5ld1NldHRpbmdzLm9uLnB1bGxfcmVxdWVzdFsncGF0aHMtaWdub3JlJ107XG4gICAgICB9XG4gICAgICBpZiAobmV3U2V0dGluZ3Mub24/LnB1c2gpIHtcbiAgICAgICAgZGVsZXRlIG5ld1NldHRpbmdzLm9uLnB1c2hbJ3BhdGhzLWlnbm9yZSddO1xuICAgICAgICBuZXdTZXR0aW5ncy5vbi5wdXNoLmJyYW5jaGVzID0gbmV3U2V0dGluZ3Mub24ucHVzaC5icmFuY2hlcy5maWx0ZXIoKGJyYW5jaCkgPT4gYnJhbmNoICE9PSAncmVub3ZhdGUvKionKTtcbiAgICAgIH1cbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgICAvLyBObyBkZWZhdWx0XG4gIH1cbiAgbWlncmF0ZVdvcmtmbG93KG5ld1NldHRpbmdzKTtcbiAgYXdhaXQgd3JpdGVZYW1sKG5ld1NldHRpbmdzLCBmaWxlUGF0aCk7XG5cbiAgaWYgKGtpbmQgPT09ICdyZWxlYXNlJykge1xuICAgIGF3YWl0IGZzLnByb21pc2VzLnJtKHBhdGguam9pbih3b3JrZmxvd3NQYXRoLCAnc2VtYW50aWMtcmVsZWFzZS55bWwnKSwgeyBmb3JjZTogdHJ1ZSB9KTtcbiAgfSBlbHNlIGlmIChraW5kID09PSAnc3luYycpIHtcbiAgICBhd2FpdCBmcy5wcm9taXNlcy5ybShwYXRoLmpvaW4od29ya2Zsb3dzUGF0aCwgJ3N5bmMtaW5pdC55bWwnKSwgeyBmb3JjZTogdHJ1ZSB9KTtcbiAgICBpZiAoIW5ld1NldHRpbmdzLmpvYnMuc3luYz8ud2l0aCkgcmV0dXJuO1xuXG4gICAgLy8gR2VuZXJhdGUgc3luYy1mb3JjZS55bWwgYmFzZWQgb24gc3luYy55bWwgaWYgaXQgZXhpc3RzLlxuICAgIG5ld1NldHRpbmdzLmpvYnNbJ3N5bmMtZm9yY2UnXSA9IG5ld1NldHRpbmdzLmpvYnMuc3luYztcbiAgICBjb25zdCBwYXJhbXMgPSBuZXdTZXR0aW5ncy5qb2JzLnN5bmMud2l0aC5zeW5jX3BhcmFtc193aXRob3V0X2Rlc3Q7XG4gICAgaWYgKHR5cGVvZiBwYXJhbXMgIT09ICdzdHJpbmcnKSByZXR1cm47XG5cbiAgICBuZXdTZXR0aW5ncy5qb2JzLnN5bmMud2l0aC5zeW5jX3BhcmFtc193aXRob3V0X2Rlc3QgPSBgLS1mb3JjZSAke3BhcmFtc31gO1xuICAgIG5ld1NldHRpbmdzLm5hbWUgPSAnRm9yY2UgdG8gU3luYyc7XG4gICAgbmV3U2V0dGluZ3Mub24gPSB7IHdvcmtmbG93X2Rpc3BhdGNoOiBudWxsIH07XG4gICAgZGVsZXRlIG5ld1NldHRpbmdzLmpvYnMuc3luYztcbiAgICBhd2FpdCB3cml0ZVlhbWwobmV3U2V0dGluZ3MsIHBhdGguam9pbih3b3JrZmxvd3NQYXRoLCAnc3luYy1mb3JjZS55bWwnKSk7XG4gIH1cbn1cblxuZnVuY3Rpb24gbm9ybWFsaXplSm9iKGNvbmZpZzogUGFja2FnZUNvbmZpZywgam9iOiBKb2IsIGtpbmQ6IEtub3duS2luZCk6IHZvaWQge1xuICBqb2Iud2l0aCA/Pz0ge307XG4gIGpvYi5zZWNyZXRzID8/PSB7fTtcbiAgLy8gVXNlIHRydXN0ZWQgcHVibGlzaGluZyBpbnN0ZWFkIG9mIE5QTV9UT0tFTlxuICBkZWxldGUgam9iLnNlY3JldHMuTlBNX1RPS0VOO1xuXG4gIGlmIChcbiAgICBraW5kID09PSAndGVzdCcgfHxcbiAgICBraW5kID09PSAncmVsZWFzZScgfHxcbiAgICBraW5kID09PSAnZ2VuLXByLWNsYXVkZScgfHxcbiAgICBraW5kID09PSAnZ2VuLXByLWNvZGV4JyB8fFxuICAgIGtpbmQgPT09ICdnZW4tcHItZ2VtaW5pJ1xuICApIHtcbiAgICBqb2Iuc2VjcmV0cy5HSF9UT0tFTiA9ICcke3sgc2VjcmV0cy5HSVRIVUJfVE9LRU4gfX0nO1xuICB9XG5cbiAgLy8gU2V0IHRlc3QtY29tbWFuZCBmb3IgZ2VuLXByIHdvcmtmbG93cyBiYXNlZCBvbiBwYWNrYWdlIG1hbmFnZXJcbiAgaWYgKGtpbmQgPT09ICdnZW4tcHItY2xhdWRlJyB8fCBraW5kID09PSAnZ2VuLXByLWNvZGV4JyB8fCBraW5kID09PSAnZ2VuLXByLWdlbWluaScpIHtcbiAgICBqb2Iud2l0aFsndGVzdC1jb21tYW5kJ10gPSBjb25maWcuaXNCdW4gPyAnYnVuIHJ1biBjaGVjay1hbGwtZm9yLWFpJyA6ICd5YXJuIGNoZWNrLWFsbC1mb3ItYWknO1xuICB9XG4gIGlmIChqb2Iuc2VjcmV0cy5GSVJFQkFTRV9UT0tFTikge1xuICAgIGpvYi5zZWNyZXRzLkdDUF9TQV9LRVlfSlNPTl9GT1JfRklSRUJBU0UgPSAnJHt7IHNlY3JldHMuR0NQX1NBX0tFWV9KU09OX0ZPUl9GSVJFQkFTRSB9fSc7XG4gICAgZGVsZXRlIGpvYi5zZWNyZXRzLkZJUkVCQVNFX1RPS0VOO1xuICB9XG4gIGlmIChcbiAgICAoam9iLnNlY3JldHMuRElTQ09SRF9XRUJIT09LX1VSTCAmJiAoa2luZCA9PT0gJ3JlbGVhc2UnIHx8IGtpbmQuc3RhcnRzV2l0aCgnZGVwbG95JykpKSB8fFxuICAgIChqb2Iud2l0aC5zZXJ2ZXJfdXJsICYmIGtpbmQuc3RhcnRzV2l0aCgnZGVwbG95JykpXG4gICkge1xuICAgIGpvYi5zZWNyZXRzLkRJU0NPUkRfV0VCSE9PS19VUkwgPSAnJHt7IHNlY3JldHMuRElTQ09SRF9XRUJIT09LX1VSTF9GT1JfUkVMRUFTRSB9fSc7XG4gIH1cblxuICBpZiAoa2luZCA9PT0gJ3N5bmMnKSB7XG4gICAgY29uc3QgcGFyYW1zID0gam9iLndpdGguc3luY19wYXJhbXNfd2l0aG91dF9kZXN0O1xuICAgIGlmICh0eXBlb2YgcGFyYW1zID09PSAnc3RyaW5nJykge1xuICAgICAgam9iLndpdGguc3luY19wYXJhbXNfd2l0aG91dF9kZXN0ID0gcGFyYW1zLnJlcGxhY2UoJ3N5bmMgJywgJycpO1xuICAgIH1cbiAgfVxuXG4gIGlmIChjb25maWcucmVwb3NpdG9yeT8uc3RhcnRzV2l0aCgnZ2l0aHViOldpbGxCb29zdGVyLycpKSB7XG4gICAgam9iLnVzZXMgPSBqb2IudXNlcz8ucmVwbGFjZSgnV2lsbEJvb3N0ZXJMYWIvJywgJ1dpbGxCb29zdGVyLycpO1xuICB9IGVsc2UgaWYgKGNvbmZpZy5yZXBvc2l0b3J5Py5zdGFydHNXaXRoKCdnaXRodWI6V2lsbEJvb3N0ZXJMYWIvJykpIHtcbiAgICBqb2IudXNlcyA9IGpvYi51c2VzPy5yZXBsYWNlKCdXaWxsQm9vc3Rlci8nLCAnV2lsbEJvb3N0ZXJMYWIvJyk7XG4gIH1cblxuICAvLyBSZW1vdmUgcmVkdW5kYW50IHBhcmFtZXRlcnNcbiAgaWYgKGpvYi53aXRoLmRvdF9lbnZfcGF0aCA9PT0gJy5lbnYnKSB7XG4gICAgZGVsZXRlIGpvYi53aXRoLmRvdF9lbnZfcGF0aDtcbiAgfVxuICAvLyBSZW1vdmUgZGVwcmVjYXRlZCBwYXJhbWV0ZXJzXG4gIG1pZ3JhdGVKb2Ioam9iKTtcblxuICAvLyBEb24ndCB1c2UgYGZseSBkZXBsb3kgLS1qc29uYCBzaW5jZSBpdCBjYXVzZXMgYW4gZXJyb3JcbiAgaWYgKGtpbmQuc3RhcnRzV2l0aCgnZGVwbG95JykgJiYgam9iLnNlY3JldHMuRkxZX0FQSV9UT0tFTiAmJiB0eXBlb2Ygam9iLndpdGguZGVwbG95X2NvbW1hbmQgPT09ICdzdHJpbmcnKSB7XG4gICAgam9iLndpdGguZGVwbG95X2NvbW1hbmQgPSBqb2Iud2l0aC5kZXBsb3lfY29tbWFuZC5yZXBsYWNlKC9cXHMrLS1qc29uLywgJycpO1xuICB9XG4gIGlmIChjb25maWcuZG9lc0NvbnRhaW5Eb2NrZXJmaWxlICYmICFqb2Iud2l0aC5jaV9sYWJlbCAmJiBraW5kLnN0YXJ0c1dpdGgoJ3Rlc3QnKSkge1xuICAgIGpvYi53aXRoLmNpX2xhYmVsID0gJ2xhcmdlJztcbiAgfVxuICAvLyBCZWNhdXNlIGdpdGh1Yi5ldmVudC5yZXBvc2l0b3J5LnByaXZhdGUgaXMgYWx3YXlzIHRydWUgaWYgam9iIGlzIHNjaGVkdWxlZFxuICBpZiAoa2luZCA9PT0gJ3JlbGVhc2UnIHx8IGtpbmQgPT09ICd0ZXN0JyB8fCBraW5kLnN0YXJ0c1dpdGgoJ2RlcGxveScpKSB7XG4gICAgaWYgKGNvbmZpZy5pc1B1YmxpY1JlcG8pIHtcbiAgICAgIGpvYi53aXRoLmdpdGh1Yl9ob3N0ZWRfcnVubmVyID0gdHJ1ZTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgZGVsZXRlIGpvYi53aXRoLmdpdGh1Yl9ob3N0ZWRfcnVubmVyO1xuICB9XG5cbiAgaWYgKE9iamVjdC5rZXlzKGpvYi53aXRoKS5sZW5ndGggPiAwKSB7XG4gICAgc29ydEtleXMoam9iLndpdGgpO1xuICB9IGVsc2Uge1xuICAgIGRlbGV0ZSBqb2Iud2l0aDtcbiAgfVxuICBpZiAoT2JqZWN0LmtleXMoam9iLnNlY3JldHMpLmxlbmd0aCA+IDApIHtcbiAgICAvLyBNb3ZlIHNlY3JldHMgcHJvcCBhZnRlciB3aXRoIHByb3BcbiAgICBjb25zdCBuZXdTZWNyZXRzID0gc29ydEtleXMoam9iLnNlY3JldHMpO1xuICAgIGRlbGV0ZSBqb2Iuc2VjcmV0cztcbiAgICBqb2Iuc2VjcmV0cyA9IG5ld1NlY3JldHM7XG4gIH0gZWxzZSB7XG4gICAgZGVsZXRlIGpvYi5zZWNyZXRzO1xuICB9XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHdyaXRlWWFtbChuZXdTZXR0aW5nczogV29ya2Zsb3csIGZpbGVQYXRoOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgeWFtbFRleHQgPSB5YW1sLmR1bXAobmV3U2V0dGluZ3MsIHsgbGluZVdpZHRoOiAtMSwgbm9Db21wYXRNb2RlOiB0cnVlLCBzdHlsZXM6IHsgJyEhbnVsbCc6ICdlbXB0eScgfSB9KTtcbiAgYXdhaXQgZnMucHJvbWlzZXMud3JpdGVGaWxlKGZpbGVQYXRoLCB5YW1sVGV4dCk7XG59XG5cbmZ1bmN0aW9uIG1pZ3JhdGVXb3JrZmxvdyhuZXdTZXR0aW5nczogV29ya2Zsb3cpOiB2b2lkIHtcbiAgLy8gVE9ETzogUmVtb3ZlIHRoZW0gYWZ0ZXIgMjAyMy0wMy0zMVxuICBkZWxldGUgbmV3U2V0dGluZ3Muam9ic1snYWRkLXRvLXByb2plY3QnXTtcbn1cblxuZnVuY3Rpb24gbWlncmF0ZUpvYihqb2I6IEpvYik6IHZvaWQge1xuICAvLyBUT0RPOiBSZW1vdmUgdGhlbSBhZnRlciAyMDIzLTAzLTMxXG4gIGlmICgham9iLndpdGgpIHJldHVybjtcbiAgZGVsZXRlIGpvYi53aXRoLm5vbl9zZWxmX2hvc3RlZDtcbiAgZGVsZXRlIGpvYi53aXRoLm5vdGlmeV9kaXNjb3JkO1xuICBkZWxldGUgam9iLndpdGgucmVxdWlyZV9mbHk7XG4gIGRlbGV0ZSBqb2Iud2l0aC5yZXF1aXJlX2djbG91ZDtcbiAgZGVsZXRlIGpvYi53aXRoLmxhYmVsO1xuICBkZWxldGUgam9iLndpdGgubGFiZWxPcGVyYXRvcjtcbiAgLy8gQWRkZWQgMjAyNS0wOC0wNlxuICBpZiAoam9iLndpdGguY2lfc2l6ZSkge1xuICAgIGpvYi53aXRoLmNpX2xhYmVsID0gam9iLndpdGguY2lfc2l6ZTtcbiAgICBkZWxldGUgam9iLndpdGguY2lfc2l6ZTtcbiAgfVxufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IGZnIGZyb20gJ2Zhc3QtZ2xvYic7XG5cbmltcG9ydCB7IGlzUmV1c2FibGVXb3JrZmxvd3NSZXBvIH0gZnJvbSAnLi4vZ2VuZXJhdG9ycy93b3JrZmxvdy5qcyc7XG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHsgb3B0aW9ucyB9IGZyb20gJy4uL29wdGlvbnMuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBmc1V0aWwgfSBmcm9tICcuLi91dGlscy9mc1V0aWwuanMnO1xuaW1wb3J0IHsgZ2xvYklnbm9yZSB9IGZyb20gJy4uL3V0aWxzL2dsb2JVdGlsLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZml4VHlwb3MocGFja2FnZUNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2ZpeFR5cG9zJywgYXN5bmMgKCkgPT4ge1xuICAgIGlmIChpc1JldXNhYmxlV29ya2Zsb3dzUmVwbyhwYWNrYWdlQ29uZmlnLnJlcG9zaXRvcnkpKSByZXR1cm47XG5cbiAgICBjb25zdCBkaXJQYXRoID0gcGFja2FnZUNvbmZpZy5kaXJQYXRoO1xuICAgIGNvbnN0IGRvY0ZpbGVzID0gYXdhaXQgZmcuZ2xvYignKiovKi5tZCcsIHsgZG90OiB0cnVlLCBjd2Q6IGRpclBhdGgsIGlnbm9yZTogZ2xvYklnbm9yZSB9KTtcbiAgICBpZiAob3B0aW9ucy5pc1ZlcmJvc2UpIHtcbiAgICAgIGNvbnNvbGUuaW5mbyhgRm91bmQgJHtkb2NGaWxlcy5sZW5ndGh9IG1hcmtkb3duIGZpbGVzIGluICR7ZGlyUGF0aH1gKTtcbiAgICB9XG4gICAgZm9yIChjb25zdCBtZEZpbGUgb2YgZG9jRmlsZXMpIHtcbiAgICAgIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5qb2luKGRpclBhdGgsIG1kRmlsZSk7XG4gICAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oYXN5bmMgKCkgPT4ge1xuICAgICAgICBjb25zdCBjb250ZW50ID0gYXdhaXQgZnMucHJvbWlzZXMucmVhZEZpbGUoZmlsZVBhdGgsICd1dGY4Jyk7XG4gICAgICAgIGxldCBuZXdDb250ZW50ID0gZml4VHlwb3NJblRleHQoY29udGVudCk7XG4gICAgICAgIG5ld0NvbnRlbnQgPSByZXBsYWNlV2l0aENvbmZpZyhuZXdDb250ZW50LCBwYWNrYWdlQ29uZmlnLCAnZG9jJyk7XG4gICAgICAgIGlmIChjb250ZW50ICE9PSBuZXdDb250ZW50KSB7XG4gICAgICAgICAgYXdhaXQgZnNVdGlsLmdlbmVyYXRlRmlsZShmaWxlUGF0aCwgbmV3Q29udGVudCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGNvbnN0IHRzRmlsZXMgPSBhd2FpdCBmZy5nbG9iKFxuICAgICAgW1xuICAgICAgICAne2FwcCxzcmMsdGVzdCxzY3JpcHRzfS8qKi8qLntjanMsbWpzLGpzLGpzeCxjdHMsbXRzLHRzLHRzeH0nLFxuICAgICAgICAncGFja2FnZXMvKiove2FwcCxzcmMsdGVzdCxzY3JpcHRzfS8qKi8qLntjanMsbWpzLGpzLGpzeCxjdHMsbXRzLHRzLHRzeH0nLFxuICAgICAgXSxcbiAgICAgIHsgZG90OiB0cnVlLCBjd2Q6IGRpclBhdGgsIGlnbm9yZTogZ2xvYklnbm9yZSB9XG4gICAgKTtcbiAgICBpZiAob3B0aW9ucy5pc1ZlcmJvc2UpIHtcbiAgICAgIGNvbnNvbGUuaW5mbyhgRm91bmQgJHt0c0ZpbGVzLmxlbmd0aH0gVHlwZVNjcmlwdCBmaWxlcyBpbiAke2RpclBhdGh9YCk7XG4gICAgfVxuICAgIGZvciAoY29uc3QgdHNGaWxlIG9mIHRzRmlsZXMpIHtcbiAgICAgIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5qb2luKGRpclBhdGgsIHRzRmlsZSk7XG4gICAgICBjb25zdCBvbGRDb250ZW50ID0gYXdhaXQgZnMucHJvbWlzZXMucmVhZEZpbGUoZmlsZVBhdGgsICd1dGY4Jyk7XG4gICAgICBsZXQgbmV3Q29udGVudCA9IGZpeFR5cG9zSW5Db2RlKG9sZENvbnRlbnQpO1xuICAgICAgbmV3Q29udGVudCA9IHJlcGxhY2VXaXRoQ29uZmlnKG5ld0NvbnRlbnQsIHBhY2thZ2VDb25maWcsICd0cycpO1xuXG4gICAgICBpZiAob2xkQ29udGVudCA9PT0gbmV3Q29udGVudCkgY29udGludWU7XG4gICAgICBhd2FpdCBmc1V0aWwuZ2VuZXJhdGVGaWxlKGZpbGVQYXRoLCBuZXdDb250ZW50KTtcbiAgICB9XG5cbiAgICBjb25zdCB0ZXh0QmFzZWRGaWxlcyA9IGF3YWl0IGZnLmdsb2IoJyoqLyoue2NzdixodG0saHRtbCx0c3YseG1sLHlhbWwseW1sfScsIHtcbiAgICAgIGRvdDogdHJ1ZSxcbiAgICAgIGN3ZDogZGlyUGF0aCxcbiAgICAgIGlnbm9yZTogZ2xvYklnbm9yZSxcbiAgICB9KTtcbiAgICBpZiAob3B0aW9ucy5pc1ZlcmJvc2UpIHtcbiAgICAgIGNvbnNvbGUuaW5mbyhgRm91bmQgJHt0ZXh0QmFzZWRGaWxlcy5sZW5ndGh9IHRleHQtYmFzZWQgZmlsZXMgaW4gJHtkaXJQYXRofWApO1xuICAgIH1cbiAgICBmb3IgKGNvbnN0IGZpbGUgb2YgdGV4dEJhc2VkRmlsZXMpIHtcbiAgICAgIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5qb2luKGRpclBhdGgsIGZpbGUpO1xuICAgICAgY29uc3Qgb2xkQ29udGVudCA9IGF3YWl0IGZzLnByb21pc2VzLnJlYWRGaWxlKGZpbGVQYXRoLCAndXRmOCcpO1xuICAgICAgbGV0IG5ld0NvbnRlbnQgPSBmaXhUeXBvc0luVGV4dChvbGRDb250ZW50KTtcbiAgICAgIG5ld0NvbnRlbnQgPSByZXBsYWNlV2l0aENvbmZpZyhuZXdDb250ZW50LCBwYWNrYWdlQ29uZmlnLCAndGV4dCcpO1xuXG4gICAgICBpZiAob2xkQ29udGVudCA9PT0gbmV3Q29udGVudCkgY29udGludWU7XG4gICAgICBhd2FpdCBmc1V0aWwuZ2VuZXJhdGVGaWxlKGZpbGVQYXRoLCBuZXdDb250ZW50KTtcbiAgICB9XG5cbiAgICBhd2FpdCBwcm9taXNlUG9vbC5wcm9taXNlQWxsKCk7XG4gIH0pO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZml4VHlwb3NJblRleHQoY29udGVudDogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIGNvbnRlbnRcbiAgICAucmVwbGFjZUFsbCgvXFxiY1xcLmZcXC4oW14kXSkvZywgJ2NmLiQxJylcbiAgICAucmVwbGFjZUFsbCgvXFxiZWdcXC4oW14kXSkvZywgJ2UuZy4kMScpXG4gICAgLnJlcGxhY2VBbGwoL1xcYmllXFwuKFteJF0pL2csICdpLmUuJDEnKTtcbn1cblxuZnVuY3Rpb24gZml4VHlwb3NJbkNvZGUoY29udGVudDogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIGNvbnRlbnRcbiAgICAucmVwbGFjZUFsbCgvXFwvXFwvKC4qKWNcXC5mXFwuL2csICcvLyQxY2YuJylcbiAgICAucmVwbGFjZUFsbCgvXFwvXFwvKC4qKWVnXFwuL2csICcvLyQxZS5nLicpXG4gICAgLnJlcGxhY2VBbGwoL1xcL1xcLyguKilpZVxcLi9nLCAnLy8kMWkuZS4nKTtcbn1cblxuZnVuY3Rpb24gcmVwbGFjZVdpdGhDb25maWcobmV3Q29udGVudDogc3RyaW5nLCBwYWNrYWdlQ29uZmlnOiBQYWNrYWdlQ29uZmlnLCBwcm9wTmFtZTogJ2RvYycgfCAndHMnIHwgJ3RleHQnKTogc3RyaW5nIHtcbiAgZm9yIChjb25zdCBbYmVmb3JlLCBhZnRlcl0gb2YgT2JqZWN0LmVudHJpZXMocGFja2FnZUNvbmZpZy53YmZ5SnNvbj8udHlwb3M/LmFsbCA/PyB7fSkpIHtcbiAgICBuZXdDb250ZW50ID0gbmV3Q29udGVudC5yZXBsYWNlQWxsKGJlZm9yZSwgYWZ0ZXIpO1xuICB9XG4gIGZvciAoY29uc3QgW2JlZm9yZSwgYWZ0ZXJdIG9mIE9iamVjdC5lbnRyaWVzKHBhY2thZ2VDb25maWcud2JmeUpzb24/LnR5cG9zPy5bcHJvcE5hbWVdID8/IHt9KSkge1xuICAgIG5ld0NvbnRlbnQgPSBuZXdDb250ZW50LnJlcGxhY2VBbGwoYmVmb3JlLCBhZnRlcik7XG4gIH1cbiAgcmV0dXJuIG5ld0NvbnRlbnQ7XG59XG4iLCJpbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBmc1V0aWwgfSBmcm9tICcuLi91dGlscy9mc1V0aWwuanMnO1xuaW1wb3J0IHsgcHJvbWlzZVBvb2wgfSBmcm9tICcuLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZW5lcmF0ZUFnZW50SW5zdHJ1Y3Rpb25zKHJvb3RDb25maWc6IFBhY2thZ2VDb25maWcsIGFsbENvbmZpZ3M6IFBhY2thZ2VDb25maWdbXSk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2dlbmVyYXRlQWdlbnRJbnN0cnVjdGlvbnMnLCBhc3luYyAoKSA9PiB7XG4gICAgaWYgKCFyb290Q29uZmlnLmlzUm9vdCkgcmV0dXJuO1xuXG4gICAgLy8gQ2hlY2sgaWYgQUdFTlRTX0VYVFJBLm1kIGV4aXN0cyBhbmQgcmVhZCBpdHMgY29udGVudFxuICAgIGNvbnN0IGFnZW50c0V4dHJhUGF0aCA9IHBhdGgucmVzb2x2ZShyb290Q29uZmlnLmRpclBhdGgsICdBR0VOVFNfRVhUUkEubWQnKTtcbiAgICBjb25zdCBleHRyYUNvbnRlbnQgPSBhd2FpdCBmc1V0aWwucmVhZEZpbGVJZ25vcmluZ0Vycm9yKGFnZW50c0V4dHJhUGF0aCk7XG5cbiAgICBmb3IgKGNvbnN0IFtmaWxlTmFtZSwgdG9vbE5hbWVdIG9mIFtcbiAgICAgIFsnQUdFTlRTLm1kJywgJ0NvZGV4IENMSSddLFxuICAgICAgWydDTEFVREUubWQnLCAnQ2xhdWRlIENvZGUnXSxcbiAgICAgIFsnR0VNSU5JLm1kJywgJ0dlbWluaSBDTEknXSxcbiAgICBdIGFzIGNvbnN0KSB7XG4gICAgICBjb25zdCBjb250ZW50ID0gZ2VuZXJhdGVBZ2VudEluc3RydWN0aW9uKHJvb3RDb25maWcsIGFsbENvbmZpZ3MsIHRvb2xOYW1lLCBleHRyYUNvbnRlbnQpO1xuICAgICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLnJlc29sdmUocm9vdENvbmZpZy5kaXJQYXRoLCBmaWxlTmFtZSk7XG4gICAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnNVdGlsLmdlbmVyYXRlRmlsZShmaWxlUGF0aCwgY29udGVudCkpO1xuICAgIH1cblxuICAgIGNvbnN0IGN1cnNvclJ1bGVzUGF0aCA9IHBhdGgucmVzb2x2ZShyb290Q29uZmlnLmRpclBhdGgsICcuY3Vyc29yL3J1bGVzL2dlbmVyYWwubWRjJyk7XG4gICAgY29uc3QgY3Vyc29yUnVsZXNDb250ZW50ID0gZ2VuZXJhdGVDdXJzb3JHZW5lcmFsTWRjQ29udGVudChyb290Q29uZmlnLCBhbGxDb25maWdzLCBleHRyYUNvbnRlbnQpO1xuICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiBmc1V0aWwuZ2VuZXJhdGVGaWxlKGN1cnNvclJ1bGVzUGF0aCwgY3Vyc29yUnVsZXNDb250ZW50KSk7XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBnZW5lcmF0ZUFnZW50SW5zdHJ1Y3Rpb24oXG4gIHJvb3RDb25maWc6IFBhY2thZ2VDb25maWcsXG4gIGFsbENvbmZpZ3M6IFBhY2thZ2VDb25maWdbXSxcbiAgdG9vbE5hbWU6IHN0cmluZyxcbiAgZXh0cmFDb250ZW50Pzogc3RyaW5nXG4pOiBzdHJpbmcge1xuICBjb25zdCBwYWNrYWdlTWFuYWdlciA9IHJvb3RDb25maWcuaXNCdW4gPyAnYnVuJyA6ICd5YXJuJztcbiAgY29uc3QgYmFzZUNvbnRlbnQgPSBgXG4jIyBQcm9qZWN0IEluZm9ybWF0aW9uXG5cbi0gTmFtZTogJHtyb290Q29uZmlnLnBhY2thZ2VKc29uPy5uYW1lfVxuLSBEZXNjcmlwdGlvbjogJHtyb290Q29uZmlnLnBhY2thZ2VKc29uPy5kZXNjcmlwdGlvbn1cbi0gUGFja2FnZSBNYW5hZ2VyOiAke3BhY2thZ2VNYW5hZ2VyfVxuXG4jIyBHZW5lcmFsIEluc3RydWN0aW9uc1xuXG4ke1xuICBhbGxDb25maWdzLnNvbWUoKGMpID0+IGMuZGVwZW5kaW5nLmdlbkkxOG5UcylcbiAgICA/IGAtIFdoZW4gaW50cm9kdWNpbmcgbmV3IHN0cmluZyBsaXRlcmFscyBpbiBSZWFjdCBjb21wb25lbnRzLCB1cGRhdGUgdGhlIGxhbmd1YWdlIHJlc291cmNlIGZpbGVzIGluIHRoZSBcXGBpMThuXFxgIGRpcmVjdG9yeSAoZS5nLiwgXFxgaTE4bi9qYS1KUC5qc29uXFxgKS4gUmVmZXJlbmNlIHRoZXNlIHN0cmluZ3MgdXNpbmcgdGhlIFxcYGkxOG5cXGAgdXRpbGl0eS4gRm9yIGV4YW1wbGUsIHVzZSBcXGBpMThuLnBhZ2VzLmhvbWUudGl0bGUoKVxcYCBmb3IgXFxgeyBcInBhZ2VzXCI6IHsgXCJob21lXCI6IHsgXCJ0aXRsZVwiOiBcIk15IEFwcFwiIH0gfSB9XFxgLmBcbiAgICA6ICcnXG59XG4tIERvIG5vdCB3cml0ZSB0ZXN0cyB1bmxlc3MgZXhwbGljaXRseSByZXF1ZXN0ZWQuXG4tIEFmdGVyIG1ha2luZyBjb2RlIGNoYW5nZXMsIHJ1biBcXGAke3BhY2thZ2VNYW5hZ2VyfSBjaGVjay1hbGwtZm9yLWFpXFxgIHRvIGV4ZWN1dGUgYWxsIHRlc3RzIChub3RlOiB0aGlzIG1heSB0YWtlIHVwIHRvIDMwIG1pbnV0ZXMpLCBvciBydW4gXFxgJHtwYWNrYWdlTWFuYWdlcn0gY2hlY2stZm9yLWFpXFxgIGZvciB0eXBlIGNoZWNraW5nIGFuZCBsaW50aW5nIG9ubHkuXG4gIC0gSWYgeW91IGFyZSBjb25maWRlbnQgeW91ciBjaGFuZ2VzIHdpbGwgbm90IGJyZWFrIGFueSB0ZXN0cywgeW91IG1heSB1c2UgXFxgY2hlY2stZm9yLWFpXFxgLlxuLSBPbmNlIHlvdSBoYXZlIHZlcmlmaWVkIHlvdXIgY2hhbmdlcywgY29tbWl0IHRoZW0gdG8gdGhlIGN1cnJlbnQgYnJhbmNoIHVzaW5nIHRoZSBcXGAtLW5vLXZlcmlmeVxcYCBvcHRpb24gYW5kIHB1c2ggdG8gdGhlIGN1cnJlbnQgYnJhbmNoLlxuICAtIEZvbGxvdyBjb252ZW50aW9uYWwgY29tbWl0cywgaS5lLiwgeW91ciBjb21taXQgbWVzc2FnZSBzaG91bGQgc3RhcnQgd2l0aCBcXGBmZWF0OlxcYCwgXFxgZml4OlxcYCwgZXRjLlxuICAtIE1ha2Ugc3VyZSB0byBhZGQgYSBuZXcgbGluZSBhdCB0aGUgZW5kIG9mIHlvdXIgY29tbWl0IG1lc3NhZ2Uke3Jvb3RDb25maWcuaXNXaWxsQm9vc3RlclJlcG8gPyBgIHdpdGg6IFxcYENvLWF1dGhvcmVkLWJ5OiBXaWxsQm9vc3RlciAoJHt0b29sTmFtZX0pIDxhZ2VudEB3aWxsYm9vc3Rlci5jb20+XFxgYCA6ICcnfS5cbiAgLSBBbHdheXMgY3JlYXRlIG5ldyBjb21taXRzLiBBdm9pZCB1c2luZyBcXGAtLWFtZW5kXFxgLlxuJHtcbiAgYWxsQ29uZmlncy5zb21lKChjKSA9PiBjLmhhc1N0YXJ0VGVzdClcbiAgICA/IGAtIFVzZSBcXGAke3BhY2thZ2VNYW5hZ2VyfSBydW4gc3RhcnQtdGVzdFxcYCB0byBsYXVuY2ggYSB3ZWIgc2VydmVyIGZvciBkZWJ1Z2dpbmcgb3IgdGVzdGluZy5gXG4gICAgOiAnJ1xufVxuXG4jIyBDb2RpbmcgU3R5bGVcblxuLSBXcml0ZSBjb21tZW50cyB0aGF0IGV4cGxhaW4gXCJ3aHlcIiByYXRoZXIgdGhhbiBcIndoYXRcIi4gQXZvaWQgZXhwbGFuYXRpb25zIHRoYXQgY2FuIGJlIHVuZGVyc3Rvb2QgZnJvbSB0aGUgY29kZSBpdHNlbGYuXG4tIFVzZSBzdGRlcnIgZm9yIGxvZ2dpbmcgZGVidWcgbWVzc2FnZXMgdGVtcG9yYXJpbHkgc2luY2Ugc3Rkb3V0IG91dHB1dCBpcyBzb21ldGltZXMgb21pdHRlZC5cbi0gV2hlbiBhZGRpbmcgbmV3IGZ1bmN0aW9ucyBvciBjbGFzc2VzLCBkZWZpbmUgdGhlbSBiZWxvdyBhbnkgZnVuY3Rpb25zIG9yIGNsYXNzZXMgdGhhdCBjYWxsIHRoZW0gdG8gbWFpbnRhaW4gY2xlYXIgY2FsbCBvcmRlci5cbi0gUHJlZmVyIFxcYHVuZGVmaW5lZFxcYCBvdmVyIFxcYG51bGxcXGAgdW5sZXNzIGV4cGxpY2l0bHkgZGVhbGluZyB3aXRoIEFQSXMgb3IgbGlicmFyaWVzIHRoYXQgcmVxdWlyZSBcXGBudWxsXFxgLlxuLSBBbHdheXMgcGVyZm9ybSBleGlzdGVuY2UgY2hlY2tzIG9uIGFycmF5IGR1ZSB0byBcXGBub1VuY2hlY2tlZEluZGV4ZWRBY2Nlc3M6IHRydWVcXGAuXG4ke1xuICBhbGxDb25maWdzLnNvbWUoKGMpID0+IGMuZGVwZW5kaW5nLnJlYWN0IHx8IGMuZGVwZW5kaW5nLm5leHQpXG4gICAgPyBgLSBQcmVmZXIgXFxgdXNlSW1tZXJcXGAgZm9yIHN0b3JpbmcgYW4gYXJyYXkgb3IgYW4gb2JqZWN0IHRvIFxcYHVzZVN0YXRlXFxgLmBcbiAgICA6ICcnXG59XG4ke1xuICBhbGxDb25maWdzLnNvbWUoKGMpID0+IGMuZGVwZW5kaW5nLm5leHQpXG4gICAgPyBgLSBTaW5jZSB0aGlzIHByb2plY3QgdXNlcyB0aGUgUmVhY3QgQ29tcGlsZXIsIHlvdSBkbyBub3QgbmVlZCB0byB1c2UgXFxgdXNlQ2FsbGJhY2tcXGAgb3IgXFxgdXNlTWVtb1xcYCBmb3IgcGVyZm9ybWFuY2Ugb3B0aW1pemF0aW9uLmBcbiAgICA6ICcnXG59XG5gXG4gICAgLnJlcGxhY2VBbGwoL1xcLlxcblxcbistL2csICcuXFxuLScpXG4gICAgLnJlcGxhY2VBbGwoL1xcbnszLH0vZywgJ1xcblxcbicpXG4gICAgLnRyaW0oKTtcblxuICByZXR1cm4gZXh0cmFDb250ZW50ID8gYmFzZUNvbnRlbnQgKyAnXFxuJyArIGV4dHJhQ29udGVudC50cmltRW5kKCkgOiBiYXNlQ29udGVudDtcbn1cblxuZnVuY3Rpb24gZ2VuZXJhdGVDdXJzb3JHZW5lcmFsTWRjQ29udGVudChcbiAgY29uZmlnOiBQYWNrYWdlQ29uZmlnLFxuICBhbGxDb25maWdzOiBQYWNrYWdlQ29uZmlnW10sXG4gIGV4dHJhQ29udGVudD86IHN0cmluZ1xuKTogc3RyaW5nIHtcbiAgY29uc3QgZnJvbnRtYXR0ZXIgPSBgLS0tXFxuZGVzY3JpcHRpb246IEdlbmVyYWwgQ29kaW5nIFJ1bGVzXFxuZ2xvYnM6XFxuYWx3YXlzQXBwbHk6IHRydWVcXG4tLS1gO1xuICBjb25zdCBib2R5ID0gZ2VuZXJhdGVBZ2VudEluc3RydWN0aW9uKGNvbmZpZywgYWxsQ29uZmlncywgJ0N1cnNvcicsIGV4dHJhQ29udGVudCk7XG4gIHJldHVybiBgJHtmcm9udG1hdHRlcn1cXG5cXG4ke2JvZHl9YDtcbn1cbiIsImltcG9ydCB7IE9jdG9raXQgfSBmcm9tICdAb2N0b2tpdC9jb3JlJztcblxuY2xhc3MgR2l0SHViVXRpbCB7XG4gIGdldE9yZ0FuZE5hbWUodXJsT3JGdWxsTmFtZTogc3RyaW5nKTogW3N0cmluZywgc3RyaW5nXSB7XG4gICAgY29uc3QgdXJsV2l0aG91dFByb3RvY29sID0gdXJsT3JGdWxsTmFtZS5zcGxpdCgnOicpLmF0KC0xKTtcbiAgICBjb25zdCBuYW1lcyA9IHVybFdpdGhvdXRQcm90b2NvbD8uc3BsaXQoJy8nKTtcbiAgICBjb25zdCBvcmcgPSBuYW1lcz8uYXQoLTIpID8/ICcnO1xuICAgIGNvbnN0IG5hbWUgPSBuYW1lcz8uYXQoLTEpPy5yZXBsYWNlKC8uZ2l0JC8sICcnKSA/PyAnJztcbiAgICByZXR1cm4gW29yZywgbmFtZV07XG4gIH1cbn1cbmV4cG9ydCBjb25zdCBnaXRIdWJVdGlsID0gbmV3IEdpdEh1YlV0aWwoKTtcblxuY29uc3Qgb2N0b2tpdENhY2hlID0gbmV3IE1hcDxzdHJpbmcsIE9jdG9raXQ+KCk7XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRPY3Rva2l0KG93bmVyPzogc3RyaW5nKTogT2N0b2tpdCB7XG4gIGNvbnN0IGtleSA9IG93bmVyID8/ICcnO1xuICBjb25zdCBjYWNoZWQgPSBvY3Rva2l0Q2FjaGUuZ2V0KGtleSk7XG4gIGlmIChjYWNoZWQpIHJldHVybiBjYWNoZWQ7XG5cbiAgY29uc3Qgb2N0b2tpdCA9IG5ldyBPY3Rva2l0KHtcbiAgICBhdXRoOiBnZXRHaXRIdWJUb2tlbihvd25lcikgfHwgdW5kZWZpbmVkLFxuICB9KTtcbiAgb2N0b2tpdENhY2hlLnNldChrZXksIG9jdG9raXQpO1xuICByZXR1cm4gb2N0b2tpdDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGhhc0dpdEh1YlRva2VuKG93bmVyOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgcmV0dXJuICEhZ2V0R2l0SHViVG9rZW4ob3duZXIpO1xufVxuXG5mdW5jdGlvbiBnZXRHaXRIdWJUb2tlbihvd25lcj86IHN0cmluZyk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGlmIChvd25lciA9PT0gJ1dpbGxCb29zdGVyJykge1xuICAgIHJldHVybiBwcm9jZXNzLmVudi5HSF9CT1RfUEFUX0ZPUl9XSUxMQk9PU1RFUjtcbiAgfVxuICBpZiAob3duZXIgPT09ICdXaWxsQm9vc3RlckxhYicpIHtcbiAgICByZXR1cm4gcHJvY2Vzcy5lbnYuR0hfQk9UX1BBVF9GT1JfV0lMTEJPT1NURVJMQUI7XG4gIH1cbiAgcmV0dXJuIChcbiAgICBwcm9jZXNzLmVudi5HSF9CT1RfUEFUX0ZPUl9XSUxMQk9PU1RFUiB8fFxuICAgIHByb2Nlc3MuZW52LkdIX0JPVF9QQVRfRk9SX1dJTExCT09TVEVSTEFCIHx8XG4gICAgcHJvY2Vzcy5lbnYuR0hfVE9LRU4gfHxcbiAgICBwcm9jZXNzLmVudi5HSVRIVUJfVE9LRU5cbiAgKTtcbn1cbiIsImltcG9ydCB0eXBlIHsgU3Bhd25TeW5jT3B0aW9ucyB9IGZyb20gJ25vZGU6Y2hpbGRfcHJvY2Vzcyc7XG5pbXBvcnQgY2hpbGRfcHJvY2VzcyBmcm9tICdub2RlOmNoaWxkX3Byb2Nlc3MnO1xuXG5leHBvcnQgZnVuY3Rpb24gc3Bhd25TeW5jKGNvbW1hbmQ6IHN0cmluZywgYXJnczogc3RyaW5nW10sIGN3ZDogc3RyaW5nLCByZXRyeSA9IDApOiB2b2lkIHtcbiAgZG8ge1xuICAgIGNvbnN0IFtuZXdDbWQsIG5ld0FyZ3MsIG9wdGlvbnNdID0gZ2V0U3Bhd25TeW5jQXJncyhjb21tYW5kLCBhcmdzLCBjd2QpO1xuICAgIGNvbnNvbGUubG9nKGAkICR7bmV3Q21kfSAke25ld0FyZ3Muam9pbignICcpfSBhdCAke2N3ZH1gKTtcbiAgICBjb25zdCByZXQgPSBjaGlsZF9wcm9jZXNzLnNwYXduU3luYyhuZXdDbWQsIG5ld0FyZ3MsIG9wdGlvbnMpO1xuICAgIGlmIChyZXQuc3RhdHVzID09PSAwKSBicmVhaztcbiAgfSB3aGlsZSAoLS1yZXRyeSA+PSAwKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHNwYXduU3luY1dpdGhTdHJpbmdSZXN1bHQoY29tbWFuZDogc3RyaW5nLCBhcmdzOiBzdHJpbmdbXSwgY3dkOiBzdHJpbmcpOiBzdHJpbmcge1xuICBjb25zdCBbbmV3Q21kLCBuZXdBcmdzLCBvcHRpb25zXSA9IGdldFNwYXduU3luY0FyZ3MoY29tbWFuZCwgYXJncywgY3dkKTtcbiAgb3B0aW9ucy5zdGRpbyA9ICdwaXBlJztcbiAgY29uc3QgcHJvYyA9IGNoaWxkX3Byb2Nlc3Muc3Bhd25TeW5jKG5ld0NtZCwgbmV3QXJncywgb3B0aW9ucyk7XG4gIGNvbnN0IGVycm9yID0gcHJvYy5zdGRlcnIudG9TdHJpbmcoKS50cmltKCk7XG4gIGlmIChlcnJvcikge1xuICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICBgJHtuZXdDbWR9IFske25ld0FyZ3MubWFwKChzKSA9PiBgXCIke3N9XCJgKS5qb2luKCcsICcpfV0gb3V0cHV0cyB0aGUgZm9sbG93aW5nIGNvbnRlbnQgdG8gc3RkZXJyOlxcbiR7ZXJyb3J9YFxuICAgICk7XG4gIH1cbiAgcmV0dXJuIHByb2Muc3Rkb3V0LnRvU3RyaW5nKCkudHJpbSgpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0U3Bhd25TeW5jQXJncyhjb21tYW5kOiBzdHJpbmcsIGFyZ3M6IHN0cmluZ1tdLCBjd2Q6IHN0cmluZyk6IFtzdHJpbmcsIHN0cmluZ1tdLCBTcGF3blN5bmNPcHRpb25zXSB7XG4gIGNvbnN0IGVudiA9IHsgLi4ucHJvY2Vzcy5lbnYgfTtcbiAgLy8gUmVtb3ZlIGJlcnJ5IGZyb20gUEFUSFxuICBpZiAoZW52LlBBVEggJiYgZW52LkJFUlJZX0JJTl9GT0xERVIpIHtcbiAgICBlbnYuUEFUSCA9IGVudi5QQVRILnJlcGxhY2UoYCR7ZW52LkJFUlJZX0JJTl9GT0xERVJ9OmAsICcnKTtcbiAgfVxuXG4gIGlmIChlbnYuQVNERl9ESVIpIHtcbiAgICBhcmdzID0gWyctbCcsICctYycsIGAke2NvbW1hbmR9ICR7YXJncy5qb2luKCcgJyl9YF07XG4gICAgY29tbWFuZCA9ICdiYXNoJztcbiAgfVxuICByZXR1cm4gW1xuICAgIGNvbW1hbmQsXG4gICAgYXJncyxcbiAgICB7XG4gICAgICBjd2QsXG4gICAgICBlbnYsXG4gICAgICBzaGVsbDogZmFsc2UsXG4gICAgICBzdGRpbzogJ2luaGVyaXQnLFxuICAgIH0sXG4gIF07XG59XG4iLCJleHBvcnQgZnVuY3Rpb24gY29udmVydFZlcnNpb25JbnRvTnVtYmVyKHZlcnNpb246IHN0cmluZyk6IG51bWJlciB7XG4gIC8vIGUuZy4gamF2YSBhZG9wdG9wZW5qZGstMTEuMC4xNys4XG4gIGNvbnN0IG51bWJlcnMgPSB2ZXJzaW9uXG4gICAgLnNwbGl0KC9bKy4tXS8pXG4gICAgLm1hcChOdW1iZXIpXG4gICAgLmZpbHRlcigobnVtKSA9PiAhTnVtYmVyLmlzTmFOKG51bSkpO1xuICBsZXQgdmVyc2lvbk51bWJlciA9IDA7XG4gIGxldCBkaXZpc29yID0gMTtcbiAgZm9yIChjb25zdCBudW0gb2YgbnVtYmVycykge1xuICAgIHZlcnNpb25OdW1iZXIgKz0gbnVtICogZGl2aXNvcjtcbiAgICBkaXZpc29yIC89IDEwMDA7XG4gIH1cbiAgcmV0dXJuIHZlcnNpb25OdW1iZXI7XG59XG4iLCJleHBvcnQgY29uc3QgUFlUSE9OX1ZFUlNJT04gPSAnMy45LjE5JztcbmV4cG9ydCBjb25zdCBKQVZBX1ZFUlNJT04gPSAnenVsdS0xMS43NC4xNSc7XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBnZXRPY3Rva2l0IH0gZnJvbSAnLi4vdXRpbHMvZ2l0aHViVXRpbC5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcbmltcG9ydCB7IHNwYXduU3luYywgc3Bhd25TeW5jV2l0aFN0cmluZ1Jlc3VsdCB9IGZyb20gJy4uL3V0aWxzL3NwYXduVXRpbC5qcyc7XG5pbXBvcnQgeyBjb252ZXJ0VmVyc2lvbkludG9OdW1iZXIgfSBmcm9tICcuLi91dGlscy92ZXJzaW9uLmpzJztcbmltcG9ydCB7IEpBVkFfVkVSU0lPTiwgUFlUSE9OX1ZFUlNJT04gfSBmcm9tICcuLi91dGlscy92ZXJzaW9uQ29uc3RhbnRzLmpzJztcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlVG9vbFZlcnNpb25zKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2dlbmVyYXRlVG9vbFZlcnNpb25zJywgYXN5bmMgKCkgPT4ge1xuICAgIGF3YWl0IGNvcmUoY29uZmlnKTtcbiAgfSk7XG59XG5cbmNvbnN0IENPUkVfVE9PTFMgPSBuZXcgU2V0KFsnamF2YScsICdub2RlanMnLCAnYnVuJywgJ3B5dGhvbiddKTtcbmNvbnN0IERFUFJFQ0FURURfVkVSU0lPTl9QUkVGSVhFUyA9IFsnamF2YScsICdub2RlJywgJ3B5dGhvbiddO1xuXG5hc3luYyBmdW5jdGlvbiBjb3JlKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICBpZiAoIWNvbmZpZy52ZXJzaW9uc1RleHQpIHJldHVybjtcblxuICBjb25zdCBkdXBsaWNhdGFibGVMaW5lcyA9IGNvbmZpZy52ZXJzaW9uc1RleHRcbiAgICAudHJpbSgpXG4gICAgLnNwbGl0KCdcXG4nKVxuICAgIC5tYXAoKGxpbmUpID0+IHtcbiAgICAgIGNvbnN0IFtuYW1lLCB2ZXJzaW9uXSA9IGxpbmUudHJpbSgpLnNwbGl0KC9cXHMrLyk7XG4gICAgICAvLyBUbyBtb3ZlIHRoZSB0b3Agb2YgdGhlIHNvcnRlZCBsaXN0LCB3ZSBuZWVkIHRvIGFkZCBhIHNwYWNlLlxuICAgICAgcmV0dXJuIGAke0NPUkVfVE9PTFMuaGFzKG5hbWUgPz8gJycpID8gJyAnIDogJyd9JHtuYW1lID8/ICcnfSAke3ZlcnNpb24gPz8gJyd9YDtcbiAgICB9KVxuICAgIC50b1NvcnRlZCgpXG4gICAgLy8gUmVtb3ZlIGFkZGVkIHNwYWNlcy5cbiAgICAubWFwKChsaW5lKSA9PiBsaW5lLnRyaW0oKSlcbiAgICAvLyBUT0RPOiByZW1vdmUgdGhlIGZvbGxvd2luZyBsaW5lIGFmdGVyIGxlZnRob29rIGlzIGluc3RhbGxlZCB2aWEgbnBtLlxuICAgIC5maWx0ZXIoKGxpbmUpID0+ICFsaW5lLnN0YXJ0c1dpdGgoJ2xlZnRob29rJykpO1xuICBjb25zdCBsaW5lcyA9IFsuLi5uZXcgU2V0KGR1cGxpY2F0YWJsZUxpbmVzKV07XG5cbiAgaWYgKGNvbmZpZy5kb2VzQ29udGFpblBvZXRyeUxvY2spIHtcbiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoKCdodHRwczovL3B5cGkub3JnL3B5cGkvcG9ldHJ5L2pzb24nKTtcbiAgICBjb25zdCBqc29uID0gKGF3YWl0IHJlc3BvbnNlLmpzb24oKSkgYXMgeyBpbmZvPzogeyB2ZXJzaW9uOiBzdHJpbmcgfSB9IHwgdW5kZWZpbmVkO1xuICAgIGNvbnN0IHBvZXRyeVZlcnNpb24gPSBqc29uPy5pbmZvPy52ZXJzaW9uO1xuICAgIGlmIChwb2V0cnlWZXJzaW9uKSB7XG4gICAgICB1cGRhdGVWZXJzaW9uKGxpbmVzLCAncG9ldHJ5JywgcG9ldHJ5VmVyc2lvbik7XG4gICAgfVxuICAgIHVwZGF0ZVZlcnNpb24obGluZXMsICdweXRob24nLCBQWVRIT05fVkVSU0lPTiwgdHJ1ZSk7XG4gIH1cbiAgaWYgKGNvbmZpZy5kZXBlbmRpbmcuZmlyZWJhc2UpIHtcbiAgICB1cGRhdGVWZXJzaW9uKGxpbmVzLCAnamF2YScsIEpBVkFfVkVSU0lPTiwgdHJ1ZSk7XG4gIH1cbiAgaWYgKGNvbmZpZy5kb2VzQ29udGFpblBhY2thZ2VKc29uKSB7XG4gICAgaWYgKGNvbmZpZy5pc0J1bikge1xuICAgICAgY29uc3QgYnVuVmVyc2lvbiA9IGF3YWl0IGdldExhdGVzdFZlcnNpb25Gcm9tVGFnT25HaXRIdWIoJ292ZW4tc2gnLCAnYnVuJyk7XG4gICAgICBpZiAoYnVuVmVyc2lvbikgdXBkYXRlVmVyc2lvbihsaW5lcywgJ2J1bicsIGJ1blZlcnNpb24pO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCB2ZXJzaW9uID0gc3Bhd25TeW5jV2l0aFN0cmluZ1Jlc3VsdCgnbnBtJywgWydzaG93JywgJ3lhcm4nLCAndmVyc2lvbiddLCBjb25maWcuZGlyUGF0aCk7XG4gICAgICB1cGRhdGVWZXJzaW9uKGxpbmVzLCAneWFybicsIHZlcnNpb24pO1xuICAgIH1cbiAgfVxuXG4gIGZvciAoY29uc3QgcHJlZml4IG9mIERFUFJFQ0FURURfVkVSU0lPTl9QUkVGSVhFUykge1xuICAgIGNvbnN0IHZlcnNpb25QYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCBgLiR7cHJlZml4fS12ZXJzaW9uYCk7XG4gICAgdm9pZCBmcy5wcm9taXNlcy5ybSh2ZXJzaW9uUGF0aCwgeyBmb3JjZTogdHJ1ZSB9KTtcbiAgfVxuXG4gIGNvbnN0IHRvb2xWZXJzaW9uc1BhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICcudG9vbC12ZXJzaW9ucycpO1xuICBhd2FpdCAobGluZXMubGVuZ3RoID4gMFxuICAgID8gcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzLnByb21pc2VzLndyaXRlRmlsZSh0b29sVmVyc2lvbnNQYXRoLCBsaW5lcy5qb2luKCdcXG4nKSArICdcXG4nKSlcbiAgICA6IHByb21pc2VQb29sLnJ1bigoKSA9PiBmcy5wcm9taXNlcy5ybSh0b29sVmVyc2lvbnNQYXRoLCB7IGZvcmNlOiB0cnVlIH0pKSk7XG4gIGF3YWl0IHByb21pc2VQb29sLnByb21pc2VBbGwoKTtcbiAgc3Bhd25TeW5jKCdhc2RmJywgWydwbHVnaW4nLCAndXBkYXRlJywgJy0tYWxsJ10sIGNvbmZpZy5kaXJQYXRoKTtcbiAgc3Bhd25TeW5jKCdhc2RmJywgWydpbnN0YWxsJ10sIGNvbmZpZy5kaXJQYXRoKTtcbn1cblxuZnVuY3Rpb24gdXBkYXRlVmVyc2lvbihsaW5lczogc3RyaW5nW10sIHRvb2xOYW1lOiBzdHJpbmcsIG5ld1ZlcnNpb246IHN0cmluZywgaGVhZCA9IGZhbHNlKTogdm9pZCB7XG4gIGNvbnN0IGluZGV4ID0gbGluZXMuZmluZEluZGV4KChsKSA9PiBsLnNwbGl0KC9cXHMrLylbMF0gPT09IHRvb2xOYW1lKTtcbiAgY29uc3QgbmV3TGluZSA9IGAke3Rvb2xOYW1lfSAke25ld1ZlcnNpb259YDtcbiAgaWYgKGluZGV4ID09PSAtMSkge1xuICAgIGxpbmVzLnNwbGljZShoZWFkID8gMCA6IGxpbmVzLmxlbmd0aCwgMCwgbmV3TGluZSk7XG4gIH0gZWxzZSB7XG4gICAgY29uc3QgWywgdmVyc2lvbl0gPSAobGluZXNbaW5kZXhdIGFzIHN0cmluZykuc3BsaXQoL1xccysvKTtcbiAgICBpZiAoY29udmVydFZlcnNpb25JbnRvTnVtYmVyKG5ld1ZlcnNpb24pID4gY29udmVydFZlcnNpb25JbnRvTnVtYmVyKHZlcnNpb24gPz8gJycpKSB7XG4gICAgICBsaW5lc1tpbmRleF0gPSBuZXdMaW5lO1xuICAgIH1cbiAgfVxufVxuXG5hc3luYyBmdW5jdGlvbiBnZXRMYXRlc3RWZXJzaW9uRnJvbVRhZ09uR2l0SHViKG9yZ2FuaXphdGlvbjogc3RyaW5nLCByZXBvc2l0b3J5OiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZyB8IHVuZGVmaW5lZD4ge1xuICB0cnkge1xuICAgIC8vIEZldGNoIHRoZSBsYXRlc3QgcmVsZWFzZSBmcm9tIHRoZSByZXBvc2l0b3J5IChubyByZXF1aXJlZCBwZXJtaXNzaW9ucylcbiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGdldE9jdG9raXQoKS5yZXF1ZXN0KCdHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L3JlbGVhc2VzL2xhdGVzdCcsIHtcbiAgICAgIG93bmVyOiBvcmdhbml6YXRpb24sXG4gICAgICByZXBvOiByZXBvc2l0b3J5LFxuICAgIH0pO1xuICAgIGNvbnN0IHZlcnNpb24gPSByZXNwb25zZS5kYXRhLnRhZ19uYW1lO1xuICAgIGNvbnN0IGluZGV4ID0gdmVyc2lvbi5sYXN0SW5kZXhPZigndicpO1xuICAgIGNvbnN0IHZlcnNpb25OdW1iZXJUZXh0ID0gaW5kZXggPT09IC0xID8gdmVyc2lvbiA6IHZlcnNpb24uc2xpY2UoaW5kZXggKyAxKTtcbiAgICAvLyBDaGVjayB0aGUgZmlyc3QgY2hhcmFjdGVyIGlzIGEgbnVtYmVyXG4gICAgcmV0dXJuIC9eXFxkLy50ZXN0KHZlcnNpb25OdW1iZXJUZXh0KSA/IHZlcnNpb25OdW1iZXJUZXh0IDogdW5kZWZpbmVkO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGNvbnNvbGUuZXJyb3IoJ0ZhaWxlZCB0byBmZXRjaCBCdW4gdGFncyBkdWUgdG86JywgZXJyb3IpO1xuICAgIHJldHVybjtcbiAgfVxufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IG1lcmdlIGZyb20gJ2RlZXBtZXJnZSc7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGZzVXRpbCB9IGZyb20gJy4uL3V0aWxzL2ZzVXRpbC5qcyc7XG5pbXBvcnQgeyBvdmVyd3JpdGVNZXJnZSB9IGZyb20gJy4uL3V0aWxzL21lcmdlVXRpbC5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlQmlvbWVKc29uYyhjb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdnZW5lcmF0ZUJpb21lSnNvbmMnLCBhc3luYyAoKSA9PiB7XG4gICAgbGV0IG5ld1NldHRpbmdzOiBvYmplY3QgPSB7XG4gICAgICByb290OiBjb25maWcuaXNSb290LFxuICAgICAgJHNjaGVtYTogJy4vbm9kZV9tb2R1bGVzL0BiaW9tZWpzL2Jpb21lL2NvbmZpZ3VyYXRpb25fc2NoZW1hLmpzb24nLFxuICAgICAgZXh0ZW5kczogWydAd2lsbGJvb3N0ZXIvYmlvbWUtY29uZmlnJ10sXG4gICAgfTtcbiAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJ2Jpb21lLmpzb25jJyk7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IG9sZENvbnRlbnQgPSBhd2FpdCBmcy5wcm9taXNlcy5yZWFkRmlsZShmaWxlUGF0aCwgJ3V0ZjgnKTtcbiAgICAgIGNvbnN0IG9sZFNldHRpbmdzID0gSlNPTi5wYXJzZShvbGRDb250ZW50KSBhcyBvYmplY3Q7XG4gICAgICBuZXdTZXR0aW5ncyA9IG1lcmdlLmFsbChbbmV3U2V0dGluZ3MsIG9sZFNldHRpbmdzLCBuZXdTZXR0aW5nc10sIHsgYXJyYXlNZXJnZTogb3ZlcndyaXRlTWVyZ2UgfSk7XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBkbyBub3RoaW5nXG4gICAgfVxuICAgIGNvbnN0IG5ld0NvbnRlbnQgPSBKU09OLnN0cmluZ2lmeShuZXdTZXR0aW5ncyk7XG4gICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzVXRpbC5nZW5lcmF0ZUZpbGUoZmlsZVBhdGgsIG5ld0NvbnRlbnQpKTtcbiAgfSk7XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBmc1V0aWwgfSBmcm9tICcuLi91dGlscy9mc1V0aWwuanMnO1xuaW1wb3J0IHsgcHJvbWlzZVBvb2wgfSBmcm9tICcuLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5cbmNvbnN0IG5ld0NvbnRlbnRXaXRoRXhhY3RUcnVlID0gYGVudiA9IGZhbHNlXG50ZWxlbWV0cnkgPSBmYWxzZVxuXG5baW5zdGFsbF1cbmV4YWN0ID0gdHJ1ZVxubGlua2VyID0gXCJob2lzdGVkXCJcbm1pbmltdW1SZWxlYXNlQWdlID0gNDMyMDAwICMgNSBkYXlzXG5taW5pbXVtUmVsZWFzZUFnZUV4Y2x1ZGVzID0gW1xuICAgIFwiQHdpbGxib29zdGVyL2JhYmVsLWNvbmZpZ3NcIixcbiAgICBcIkB3aWxsYm9vc3Rlci9iaW9tZS1jb25maWdcIixcbiAgICBcIkB3aWxsYm9vc3Rlci9lc2xpbnQtY29uZmlnLWpzXCIsXG4gICAgXCJAd2lsbGJvb3N0ZXIvZXNsaW50LWNvbmZpZy1qcy1yZWFjdFwiLFxuICAgIFwiQHdpbGxib29zdGVyL2VzbGludC1jb25maWctbmV4dFwiLFxuICAgIFwiQHdpbGxib29zdGVyL2VzbGludC1jb25maWctdHNcIixcbiAgICBcIkB3aWxsYm9vc3Rlci9lc2xpbnQtY29uZmlnLXRzLXJlYWN0XCIsXG4gICAgXCJAd2lsbGJvb3N0ZXIvcHJldHRpZXItY29uZmlnXCIsXG4gICAgXCJAd2lsbGJvb3N0ZXIvd2JcIlxuXVxuXG5bcnVuXVxuYnVuID0gdHJ1ZVxuYDtcblxuY29uc3QgbmV3Q29udGVudFdpdGhFeGFjdEZhbHNlID0gYGVudiA9IGZhbHNlXG50ZWxlbWV0cnkgPSBmYWxzZVxuXG5baW5zdGFsbF1cbmV4YWN0ID0gZmFsc2VcbmxpbmtlciA9IFwiaG9pc3RlZFwiXG5taW5pbXVtUmVsZWFzZUFnZSA9IDQzMjAwMCAjIDUgZGF5c1xubWluaW11bVJlbGVhc2VBZ2VFeGNsdWRlcyA9IFtcbiAgICBcIkB3aWxsYm9vc3Rlci9iYWJlbC1jb25maWdzXCIsXG4gICAgXCJAd2lsbGJvb3N0ZXIvYmlvbWUtY29uZmlnXCIsXG4gICAgXCJAd2lsbGJvb3N0ZXIvZXNsaW50LWNvbmZpZy1qc1wiLFxuICAgIFwiQHdpbGxib29zdGVyL2VzbGludC1jb25maWctanMtcmVhY3RcIixcbiAgICBcIkB3aWxsYm9vc3Rlci9lc2xpbnQtY29uZmlnLW5leHRcIixcbiAgICBcIkB3aWxsYm9vc3Rlci9lc2xpbnQtY29uZmlnLXRzXCIsXG4gICAgXCJAd2lsbGJvb3N0ZXIvZXNsaW50LWNvbmZpZy10cy1yZWFjdFwiLFxuICAgIFwiQHdpbGxib29zdGVyL3ByZXR0aWVyLWNvbmZpZ1wiLFxuICAgIFwiQHdpbGxib29zdGVyL3diXCJcbl1cblxuW3J1bl1cbmJ1biA9IHRydWVcbmA7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZW5lcmF0ZUJ1bmZpZ1RvbWwoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZ2VuZXJhdGVCdW5maWdUb21sJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnYnVuZmlnLnRvbWwnKTtcbiAgICBjb25zdCBjb250ZW50ID1cbiAgICAgIGZzLmV4aXN0c1N5bmMoZmlsZVBhdGgpICYmIGZzLnJlYWRGaWxlU3luYyhmaWxlUGF0aCwgJ3V0ZjgnKS5pbmNsdWRlcygnZXhhY3QgPSBmYWxzZScpXG4gICAgICAgID8gbmV3Q29udGVudFdpdGhFeGFjdEZhbHNlXG4gICAgICAgIDogbmV3Q29udGVudFdpdGhFeGFjdFRydWU7XG4gICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzVXRpbC5nZW5lcmF0ZUZpbGUoZmlsZVBhdGgsIGNvbnRlbnQpKTtcbiAgfSk7XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5cbmNvbnN0IHVzZXJDb250ZW50SGVhZGVyID0gJyMgUHJvamVjdC1zcGVjaWZpYyBzZXR0aW5ncyc7XG5jb25zdCB1c2VyQ29udGVudEhlYWRlclJlZ2V4ID0gLyMgUHJvamVjdC1zcGVjaWZpYyBzZXR0aW5nc1teXFxuXSpcXG4vZ207XG5jb25zdCBzZXBhcmF0b3IgPSAnIyBHZW5lcmF0ZWQgYnkgd2JmeSc7XG5jb25zdCBzZXBhcmF0b3JQcmVmaXggPSAnIyBHZW5lcmF0ZWQgYnkgJztcbmNvbnN0IGRlZmF1bHRIZWFkVXNlckNvbnRlbnQgPSBgJHt1c2VyQ29udGVudEhlYWRlcn0gKGhlYWQpXG5cblxuJHtzZXBhcmF0b3J9XG5gO1xuY29uc3QgZGVmYXVsdFRhaWxVc2VyQ29udGVudCA9IGBcbiR7dXNlckNvbnRlbnRIZWFkZXJ9ICh0YWlsKVxuYDtcblxuZXhwb3J0IGNvbnN0IGlnbm9yZUZpbGVVdGlsID0ge1xuICBzZXBhcmF0b3IsXG4gIHNlcGFyYXRvclByZWZpeCxcbiAgZGVmYXVsdEhlYWRVc2VyQ29udGVudCxcbiAgZGVmYXVsdFRhaWxVc2VyQ29udGVudCxcbiAgYXN5bmMgcmVhZEdpdGlnbm9yZVdpdGhvdXRTZXBhcmF0b3JzKGZpbGVQYXRoOiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZyB8IHVuZGVmaW5lZD4ge1xuICAgIHRyeSB7XG4gICAgICBsZXQgY29udGVudCA9IGF3YWl0IGZzLnByb21pc2VzLnJlYWRGaWxlKGZpbGVQYXRoLCAndXRmOCcpO1xuICAgICAgY29uc3QgbGFzdEhlYWRlckluZGV4ID0gZ2V0SW5kZXhPZlRhaWxVc2VyQ29udGVudEhlYWRlcihjb250ZW50KTtcbiAgICAgIGlmIChsYXN0SGVhZGVySW5kZXggPiAwKSB7XG4gICAgICAgIGNvbnRlbnQgPSBjb250ZW50LnNsaWNlKDAsIGxhc3RIZWFkZXJJbmRleCAtIDEpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIChcbiAgICAgICAgY29udGVudFxuICAgICAgICAgIC5yZXBsYWNlQWxsKHVzZXJDb250ZW50SGVhZGVyUmVnZXgsICcnKVxuICAgICAgICAgIC5yZXBsYWNlQWxsKC8jIEdlbmVyYXRlZCBieSBbXlxcbl0qXFxuL2dtLCAnJylcbiAgICAgICAgICAucmVwbGFjZUFsbCgvXFxyP1xcblxccj9cXG4oXFxyP1xcbikrL2dtLCAnXFxuXFxuJylcbiAgICAgICAgICAudHJpbSgpICsgJ1xcbidcbiAgICAgICk7XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBkbyBub3RoaW5nXG4gICAgfVxuICB9LFxuICBnZXRIZWFkVXNlckNvbnRlbnQoY29udGVudDogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBjb25zdCBpbmRleCA9IGNvbnRlbnQuaW5kZXhPZih0aGlzLnNlcGFyYXRvclByZWZpeCk7XG4gICAgaWYgKGluZGV4ICE9PSAtMSkge1xuICAgICAgcmV0dXJuIGNvbnRlbnRcbiAgICAgICAgLnNsaWNlKDAsIGNvbnRlbnQuaW5kZXhPZignXFxuJywgaW5kZXgpICsgMSlcbiAgICAgICAgLnJlcGxhY2VBbGwodXNlckNvbnRlbnRIZWFkZXJSZWdleCwgYCR7dXNlckNvbnRlbnRIZWFkZXJ9IChoZWFkKVxcbmApO1xuICAgIH1cbiAgICByZXR1cm4gZGVmYXVsdEhlYWRVc2VyQ29udGVudDtcbiAgfSxcbiAgZ2V0VGFpbFVzZXJDb250ZW50KGNvbnRlbnQ6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgY29uc3QgbGFzdEhlYWRlckluZGV4ID0gZ2V0SW5kZXhPZlRhaWxVc2VyQ29udGVudEhlYWRlcihjb250ZW50KTtcbiAgICBpZiAobGFzdEhlYWRlckluZGV4ID4gMCkge1xuICAgICAgcmV0dXJuIGNvbnRlbnQuc2xpY2UobGFzdEhlYWRlckluZGV4IC0gMSk7XG4gICAgfVxuICAgIHJldHVybiBkZWZhdWx0VGFpbFVzZXJDb250ZW50O1xuICB9LFxuICBhc3luYyBpc0JlcnJ5WmVyb0luc3RhbGxFbmFibGVkKGZpbGVQYXRoOiBzdHJpbmcpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgY29udGVudCA9IGF3YWl0IGZzLnByb21pc2VzLnJlYWRGaWxlKGZpbGVQYXRoLCAndXRmOCcpO1xuICAgICAgcmV0dXJuIGNvbnRlbnQuaW5jbHVkZXMoJ1xcbiEueWFybi9jYWNoZScpO1xuICAgIH0gY2F0Y2gge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfSxcbn07XG5cbmZ1bmN0aW9uIGdldEluZGV4T2ZUYWlsVXNlckNvbnRlbnRIZWFkZXIoY29udGVudDogc3RyaW5nKTogbnVtYmVyIHtcbiAgY29uc3QgaW5kZXggPSBjb250ZW50LmluZGV4T2YodXNlckNvbnRlbnRIZWFkZXIpO1xuICBjb25zdCBsYXN0SW5kZXggPSBjb250ZW50Lmxhc3RJbmRleE9mKHVzZXJDb250ZW50SGVhZGVyKTtcbiAgcmV0dXJuIGxhc3RJbmRleCA+IGluZGV4ID8gbGFzdEluZGV4IDogLTE7XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBmc1V0aWwgfSBmcm9tICcuLi91dGlscy9mc1V0aWwuanMnO1xuaW1wb3J0IHsgaWdub3JlRmlsZVV0aWwgfSBmcm9tICcuLi91dGlscy9pZ25vcmVGaWxlVXRpbC5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcblxuLy8gRXhlcmNvZGXjgafjga9ub2RlX21vZHVsZXPjgpJDT1BZ44GZ44KL5b+F6KaB44GM44GC44KL44Gf44KB44CBbm9kZV9tb2R1bGVz44KS6Zmk5aSW44GX44Gm44Gv44GE44GR44Gq44GE44CCXG5jb25zdCBjb21tb25Db250ZW50ID0gYFxuKiovLmlkZWFcbioqLyouc3FsaXRlMypcbioqLy55YXJuL2luc3RhbGwtc3RhdGUuZ3pcbioqLy52ZW52XG5gO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVEb2NrZXJpZ25vcmUoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZ2VuZXJhdGVEb2NrZXJpZ25vcmUnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICcuZG9ja2VyaWdub3JlJyk7XG4gICAgaWYgKGNvbmZpZy5kb2VzQ29udGFpbkRvY2tlcmZpbGUpIHtcbiAgICAgIGNvbnN0IGNvbnRlbnQgPSAoYXdhaXQgZnNVdGlsLnJlYWRGaWxlSWdub3JpbmdFcnJvcihmaWxlUGF0aCkpID8/ICcnO1xuICAgICAgY29uc3QgaGVhZFVzZXJDb250ZW50ID0gaWdub3JlRmlsZVV0aWwuZ2V0SGVhZFVzZXJDb250ZW50KGNvbnRlbnQpO1xuICAgICAgY29uc3QgdGFpbFVzZXJDb250ZW50ID0gaWdub3JlRmlsZVV0aWwuZ2V0VGFpbFVzZXJDb250ZW50KGNvbnRlbnQpO1xuXG4gICAgICBjb25zdCBuZXdDb250ZW50ID0gaGVhZFVzZXJDb250ZW50ICsgY29tbW9uQ29udGVudCArIHRhaWxVc2VyQ29udGVudDtcbiAgICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiBmc1V0aWwuZ2VuZXJhdGVGaWxlKGZpbGVQYXRoLCBuZXdDb250ZW50KSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGF3YWl0IGZzLnByb21pc2VzLnJtKGZpbGVQYXRoLCB7IGZvcmNlOiB0cnVlIH0pO1xuICAgIH1cbiAgfSk7XG59XG4iLCJleHBvcnQgY29uc3QgZXh0ZW5zaW9ucyA9IHtcbiAgY29kZVdpdGgySW5kZW50U2l6ZTogW1xuICAgICdjanMnLFxuICAgICdtanMnLFxuICAgICdqcycsXG4gICAgJ2pzeCcsXG4gICAgJ2N0cycsXG4gICAgJ210cycsXG4gICAgJ3RzJyxcbiAgICAndHN4JyxcbiAgICAnanNvbicsXG4gICAgJ2pzb241JyxcbiAgICAnanNvbmMnLFxuICAgICdjcHAnLFxuICAgICdkYXJ0JyxcbiAgICAnaHRtJyxcbiAgICAnaHRtbCcsXG4gICAgJ3B1JyxcbiAgICAncHVtbCcsXG4gICAgJ3JiJyxcbiAgICAndnVlJyxcbiAgICAneG1sJyxcbiAgICAneWFtbCcsXG4gICAgJ3ltbCcsXG4gICAgJ3NoJyxcbiAgXS50b1NvcnRlZCgpLFxuICBjb2RlV2l0aDRJbmRlbnRTaXplOiBbJ2dvJywgJ2dyYWRsZScsICdqYXZhJywgJ3B5J10udG9Tb3J0ZWQoKSxcbiAgbWFya2Rvd25MaWtlOiBbJ21kJ10udG9Tb3J0ZWQoKSxcbiAgZXNsaW50OiBbJ2NqcycsICdtanMnLCAnanMnLCAnY3RzJywgJ210cycsICd0cycsICd0c3gnLCAnanN4J10udG9Tb3J0ZWQoKSxcbiAgcHJldHRpZXI6IFtcbiAgICAnY2pzJyxcbiAgICAnbWpzJyxcbiAgICAnamF2YScsXG4gICAgJ2pzJyxcbiAgICAnanN4JyxcbiAgICAnY3RzJyxcbiAgICAnbXRzJyxcbiAgICAndHMnLFxuICAgICd0c3gnLFxuICAgICdqc29uJyxcbiAgICAnanNvbjUnLFxuICAgICdqc29uYycsXG4gICAgJ2NzcycsXG4gICAgJ2h0bScsXG4gICAgJ2h0bWwnLFxuICAgICdtZCcsXG4gICAgJ3Njc3MnLFxuICAgICd2dWUnLFxuICAgICd5YW1sJyxcbiAgICAneW1sJyxcbiAgXS50b1NvcnRlZCgpLFxuICAvLyBjZi4gaHR0cHM6Ly9iaW9tZWpzLmRldi9pbnRlcm5hbHMvbGFuZ3VhZ2Utc3VwcG9ydC9cbiAgYmlvbWU6IFtcbiAgICAnY2pzJyxcbiAgICAnbWpzJyxcbiAgICAnanMnLFxuICAgICdqc3gnLFxuICAgICdjdHMnLFxuICAgICdtdHMnLFxuICAgICd0cycsXG4gICAgJ3RzeCcsXG4gICAgJ2pzb24nLFxuICAgICdqc29uNScsXG4gICAgJ2pzb25jJyxcbiAgICAnaHRtJyxcbiAgICAnaHRtbCcsXG4gICAgJ3Z1ZScsXG4gICAgJ3N2ZWx0ZScsXG4gICAgJ2FzdHJvJyxcbiAgICAnY3NzJyxcbiAgICAneWFtbCcsXG4gICAgJ3ltbCcsXG4gICAgJ2dxbCcsXG4gIF0udG9Tb3J0ZWQoKSxcbn07XG4iLCJpbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBleHRlbnNpb25zIH0gZnJvbSAnLi4vdXRpbHMvZXh0ZW5zaW9ucy5qcyc7XG5pbXBvcnQgeyBmc1V0aWwgfSBmcm9tICcuLi91dGlscy9mc1V0aWwuanMnO1xuaW1wb3J0IHsgcHJvbWlzZVBvb2wgfSBmcm9tICcuLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5cbmNvbnN0IG5ld0NvbnRlbnQgPSBgcm9vdCA9IHRydWVcblxuWypdXG5jaGFyc2V0ID0gdXRmLThcbmVuZF9vZl9saW5lID0gbGZcbmluc2VydF9maW5hbF9uZXdsaW5lID0gdHJ1ZVxudHJpbV90cmFpbGluZ193aGl0ZXNwYWNlID0gdHJ1ZVxuXG4ke2dlbmVyYXRlRXh0ZW5zaW9ucyhleHRlbnNpb25zLmNvZGVXaXRoMkluZGVudFNpemUpfVxuaW5kZW50X3NpemUgPSAyXG5pbmRlbnRfc3R5bGUgPSBzcGFjZVxuXG4ke2dlbmVyYXRlRXh0ZW5zaW9ucyhleHRlbnNpb25zLmNvZGVXaXRoNEluZGVudFNpemUpfVxuaW5kZW50X3NpemUgPSA0XG5pbmRlbnRfc3R5bGUgPSBzcGFjZVxuXG4ke2dlbmVyYXRlRXh0ZW5zaW9ucyhleHRlbnNpb25zLm1hcmtkb3duTGlrZSl9XG5tYXhfbGluZV9sZW5ndGggPSBvZmZcbnRyaW1fdHJhaWxpbmdfd2hpdGVzcGFjZSA9IGZhbHNlXG5cblt7TWFrZWZpbGUsKi5ta31dXG5pbmRlbnRfc3R5bGUgPSB0YWJcbmA7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZW5lcmF0ZUVkaXRvcmNvbmZpZyhjb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdnZW5lcmF0ZUVkaXRvcmNvbmZpZycsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJy5lZGl0b3Jjb25maWcnKTtcbiAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnNVdGlsLmdlbmVyYXRlRmlsZShmaWxlUGF0aCwgbmV3Q29udGVudCkpO1xuICB9KTtcbn1cblxuZnVuY3Rpb24gZ2VuZXJhdGVFeHRlbnNpb25zKGV4dGVuc2lvbnM6IHN0cmluZ1tdKTogc3RyaW5nIHtcbiAgcmV0dXJuIGV4dGVuc2lvbnMubGVuZ3RoID4gMSA/IGBbKi57JHtleHRlbnNpb25zLmpvaW4oJywnKX19XWAgOiBgWyouJHtleHRlbnNpb25zWzBdfV1gO1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZnNVdGlsIH0gZnJvbSAnLi4vdXRpbHMvZnNVdGlsLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVFc2xpbnRyYyhjb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdnZW5lcmF0ZUVzbGludHJjJywgYXN5bmMgKCkgPT4ge1xuICAgIC8vIFJlbW92ZSBkZXByZWNhdGVkIGZpbGVzXG4gICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzLnByb21pc2VzLnJtKHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJy5lc2xpbnRyYy5qc29uJyksIHsgZm9yY2U6IHRydWUgfSkpO1xuICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiBmcy5wcm9taXNlcy5ybShwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICcuZXNsaW50aWdub3JlJyksIHsgZm9yY2U6IHRydWUgfSkpO1xuICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiBmcy5wcm9taXNlcy5ybShwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICdlc2xpbnQuY29uZmlnLmpzJyksIHsgZm9yY2U6IHRydWUgfSkpO1xuXG4gICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICdlc2xpbnQuY29uZmlnLm1qcycpO1xuICAgIGlmIChjb25maWcuaXNCdW4pIHtcbiAgICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiBmcy5wcm9taXNlcy5ybShmaWxlUGF0aCwgeyBmb3JjZTogdHJ1ZSB9KSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKCFjb25maWcuZXNsaW50QmFzZSkgcmV0dXJuO1xuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IG9sZENvbnRlbnQgPSBhd2FpdCBmcy5wcm9taXNlcy5yZWFkRmlsZShmaWxlUGF0aCwgJ3V0ZjgnKTtcbiAgICAgIGlmICghb2xkQ29udGVudC5pbmNsdWRlcygnZXhwb3J0IHsgZGVmYXVsdCB9JykpIHJldHVybjtcbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIGRvIG5vdGhpbmdcbiAgICB9XG5cbiAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnNVdGlsLmdlbmVyYXRlRmlsZShmaWxlUGF0aCwgYGV4cG9ydCB7IGRlZmF1bHQgfSBmcm9tICcke2NvbmZpZy5lc2xpbnRCYXNlfSc7YCkpO1xuICB9KTtcbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCBtZXJnZSBmcm9tICdkZWVwbWVyZ2UnO1xuaW1wb3J0IHlhbWwgZnJvbSAnanMteWFtbCc7XG5pbXBvcnQgY2xvbmVEZWVwIGZyb20gJ2xvZGFzaC5jbG9uZWRlZXAnO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBmc1V0aWwgfSBmcm9tICcuLi91dGlscy9mc1V0aWwuanMnO1xuaW1wb3J0IHsgb3ZlcndyaXRlTWVyZ2UgfSBmcm9tICcuLi91dGlscy9tZXJnZVV0aWwuanMnO1xuaW1wb3J0IHsgcHJvbWlzZVBvb2wgfSBmcm9tICcuLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5cbmNvbnN0IGRlZmF1bHRDb25maWcgPSB7XG4gIGhhdmVfZnVuOiB0cnVlLFxuICBjb2RlX3Jldmlldzoge1xuICAgIGRpc2FibGU6IGZhbHNlLFxuICAgIGNvbW1lbnRfc2V2ZXJpdHlfdGhyZXNob2xkOiAnTUVESVVNJyxcbiAgICBtYXhfcmV2aWV3X2NvbW1lbnRzOiAtMSxcbiAgICBwdWxsX3JlcXVlc3Rfb3BlbmVkOiB7XG4gICAgICBoZWxwOiBmYWxzZSxcbiAgICAgIHN1bW1hcnk6IHRydWUsXG4gICAgICBjb2RlX3JldmlldzogdHJ1ZSxcbiAgICB9LFxuICB9LFxuICBpZ25vcmVfcGF0dGVybnM6IFsnKiovX19nZW5lcmF0ZWRfXyddLFxufTtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlR2VtaW5pQ29uZmlnKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2dlbmVyYXRlR2VtaW5pQ29uZmlnJywgYXN5bmMgKCkgPT4ge1xuICAgIGlmICghY29uZmlnLmlzUm9vdCkgcmV0dXJuO1xuXG4gICAgY29uc3QgZGlyUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJy5nZW1pbmknKTtcbiAgICBjb25zdCBjb25maWdGaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShkaXJQYXRoLCAnY29uZmlnLnltbCcpO1xuICAgIGNvbnN0IHN0eWxlZ3VpZGVGaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShkaXJQYXRoLCAnc3R5bGVndWlkZS5tZCcpO1xuXG4gICAgbGV0IG5ld0NvbmZpZzogb2JqZWN0ID0gY2xvbmVEZWVwKGRlZmF1bHRDb25maWcpO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBvbGRDb250ZW50ID0gYXdhaXQgZnMucHJvbWlzZXMucmVhZEZpbGUoY29uZmlnRmlsZVBhdGgsICd1dGY4Jyk7XG4gICAgICBjb25zdCBvbGRDb25maWcgPSB5YW1sLmxvYWQob2xkQ29udGVudCkgYXMgb2JqZWN0O1xuICAgICAgbmV3Q29uZmlnID0gbWVyZ2UuYWxsKFtuZXdDb25maWcsIG9sZENvbmZpZywgbmV3Q29uZmlnXSwgeyBhcnJheU1lcmdlOiBvdmVyd3JpdGVNZXJnZSB9KTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIGRvIG5vdGhpbmcgLSBmaWxlIGRvZXNuJ3QgZXhpc3Qgb3IgY2FuJ3QgYmUgcGFyc2VkXG4gICAgfVxuXG4gICAgY29uc3QgeWFtbENvbnRlbnQgPSB5YW1sLmR1bXAobmV3Q29uZmlnLCB7XG4gICAgICBsaW5lV2lkdGg6IC0xLFxuICAgICAgbm9Db21wYXRNb2RlOiB0cnVlLFxuICAgICAgc3R5bGVzOiB7XG4gICAgICAgICchIW51bGwnOiAnZW1wdHknLFxuICAgICAgfSxcbiAgICB9KTtcblxuICAgIGNvbnN0IHN0eWxlZ3VpZGVDb250ZW50ID0gJ+aXpeacrOiqnuOBp+ODrOODk+ODpeODvOOBl+OBpuOBj+OBoOOBleOBhOOAgic7XG5cbiAgICBjb25zdCBwcm9taXNlcyA9IFtwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnNVdGlsLmdlbmVyYXRlRmlsZShjb25maWdGaWxlUGF0aCwgeWFtbENvbnRlbnQpKV07XG4gICAgaWYgKCFmcy5leGlzdHNTeW5jKHN0eWxlZ3VpZGVGaWxlUGF0aCkpIHtcbiAgICAgIHByb21pc2VzLnB1c2gocHJvbWlzZVBvb2wucnVuKCgpID0+IGZzVXRpbC5nZW5lcmF0ZUZpbGUoc3R5bGVndWlkZUZpbGVQYXRoLCBzdHlsZWd1aWRlQ29udGVudCkpKTtcbiAgICB9XG4gICAgYXdhaXQgUHJvbWlzZS5hbGwocHJvbWlzZXMpO1xuICB9KTtcbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJlbW92ZUdlbWluaVNldHRpbmdzKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2dlbmVyYXRlR2VtaW5pU2V0dGluZ3MnLCBhc3luYyAoKSA9PiB7XG4gICAgaWYgKCFjb25maWcuaXNSb290KSByZXR1cm47XG5cbiAgICBjb25zdCBkaXJQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnLmdlbWluaScpO1xuICAgIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKGRpclBhdGgsICdzZXR0aW5ncy5qc29uJyk7XG4gICAgYXdhaXQgZnMucHJvbWlzZXMucm0oZmlsZVBhdGgsIHsgZm9yY2U6IHRydWUgfSk7XG4gIH0pO1xufVxuIiwiaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZXh0ZW5zaW9ucyB9IGZyb20gJy4uL3V0aWxzL2V4dGVuc2lvbnMuanMnO1xuaW1wb3J0IHsgZnNVdGlsIH0gZnJvbSAnLi4vdXRpbHMvZnNVdGlsLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuXG4vLyBjZi4gaHR0cHM6Ly9idW4uc2gvZ3VpZGVzL2luc3RhbGwvZ2l0LWRpZmYtYnVuLWxvY2tmaWxlXG5jb25zdCBuZXdDb250ZW50ID0gYCogdGV4dD1hdXRvXG5cbioubG9ja2IgYmluYXJ5IGRpZmY9bG9ja2JcbioudmNwcm9qIHRleHQgZW9sPWNybGZcblxuJHtbLi4uZXh0ZW5zaW9ucy5jb2RlV2l0aDJJbmRlbnRTaXplLCAuLi5leHRlbnNpb25zLmNvZGVXaXRoNEluZGVudFNpemUsIC4uLmV4dGVuc2lvbnMubWFya2Rvd25MaWtlXVxuICAubWFwKChleHQpID0+IGAqLiR7ZXh0fSB0ZXh0IGVvbD1sZmApXG4gIC5qb2luKCdcXG4nKX1cblxuZGlzdC8qKiBsaW5ndWlzdC1nZW5lcmF0ZWQ9dHJ1ZVxuYDtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlR2l0YXR0cmlidXRlcyhjb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdnZW5lcmF0ZUdpdGF0dHJpYnV0ZXMnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICcuZ2l0YXR0cmlidXRlcycpO1xuICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiBmc1V0aWwuZ2VuZXJhdGVGaWxlKGZpbGVQYXRoLCBuZXdDb250ZW50KSk7XG4gIH0pO1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IG9zIGZyb20gJ25vZGU6b3MnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB7IG9wdGlvbnMgfSBmcm9tICcuLi9vcHRpb25zLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZnNVdGlsIH0gZnJvbSAnLi4vdXRpbHMvZnNVdGlsLmpzJztcbmltcG9ydCB7IGlnbm9yZUZpbGVVdGlsIH0gZnJvbSAnLi4vdXRpbHMvaWdub3JlRmlsZVV0aWwuanMnO1xuaW1wb3J0IHsgcHJvbWlzZVBvb2wgfSBmcm9tICcuLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5cbmNvbnN0IGRlZmF1bHROYW1lcyA9IFsnd2luZG93cycsICdtYWNvcycsICdsaW51eCcsICdqZXRicmFpbnMnLCAndmlzdWFsc3R1ZGlvY29kZScsICdlbWFjcycsICd2aW0nLCAneWFybiddO1xuXG5jb25zdCBjb21tb25Db250ZW50ID0gYFxuIS5rZWVwXG4uYWlkZXIqXG4uZW52LnByb2R1Y3Rpb25cbiovbW91bnQvKi5oYXNoXG4uZGV2Y29udGFpbmVyL1xuLmlkZWEvQXVnbWVudFdlYnZpZXdTdGF0ZVN0b3JlLnhtbFxuLmlkZWEvY29waWxvdC4qXG4uaWRlYS9jb3BpbG90L2NoYXRTZXNzaW9ucy9cbi5zZXJlbmEvXG4udG1wL1xuX19nZW5lcmF0ZWRfXy9cbkB3aWxsYm9vc3Rlci9cbmRpc3QvXG50ZW1wL1xudG1wL1xuYDtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlR2l0aWdub3JlKGNvbmZpZzogUGFja2FnZUNvbmZpZywgcm9vdENvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2dlbmVyYXRlR2l0aWdub3JlJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnLmdpdGlnbm9yZScpO1xuICAgIGNvbnN0IGNvbnRlbnQgPSAoYXdhaXQgZnNVdGlsLnJlYWRGaWxlSWdub3JpbmdFcnJvcihmaWxlUGF0aCkpID8/ICcnO1xuICAgIGxldCBoZWFkVXNlckNvbnRlbnQgPSBpZ25vcmVGaWxlVXRpbC5nZXRIZWFkVXNlckNvbnRlbnQoY29udGVudCkgKyBjb21tb25Db250ZW50O1xuICAgIGNvbnN0IHRhaWxVc2VyQ29udGVudCA9IGlnbm9yZUZpbGVVdGlsLmdldFRhaWxVc2VyQ29udGVudChjb250ZW50KTtcblxuICAgIGNvbnN0IG5hbWVzID0gWy4uLmRlZmF1bHROYW1lc107XG4gICAgaWYgKGNvbmZpZy5kb2VzQ29udGFpbkdlbWZpbGUpIHtcbiAgICAgIG5hbWVzLnB1c2goJ3J1YnknKTtcbiAgICB9XG4gICAgaWYgKGNvbmZpZy5kb2VzQ29udGFpbkdvTW9kKSB7XG4gICAgICBuYW1lcy5wdXNoKCdnbycpO1xuICAgICAgaGVhZFVzZXJDb250ZW50ICs9IGAke3BhdGguYmFzZW5hbWUoY29uZmlnLmRpclBhdGgpfVxuYDtcbiAgICB9XG4gICAgaWYgKGNvbmZpZy5kb2VzQ29udGFpblBhY2thZ2VKc29uKSB7XG4gICAgICBuYW1lcy5wdXNoKCdub2RlJyk7XG4gICAgfVxuICAgIGlmIChjb25maWcuZG9lc0NvbnRhaW5Qb21YbWwpIHtcbiAgICAgIG5hbWVzLnB1c2goJ21hdmVuJyk7XG4gICAgICBoZWFkVXNlckNvbnRlbnQgKz0gYC5pZGVhL2dvb2dsZS1qYXZhLWZvcm1hdC54bWxcbmA7XG4gICAgfVxuICAgIGlmIChjb25maWcuZG9lc0NvbnRhaW5QdWJzcGVjWWFtbCkge1xuICAgICAgbmFtZXMucHVzaCgnZmx1dHRlcicsICdBbmRyb2lkU3R1ZGlvJywgJ3J1YnknKTtcbiAgICAgIGhlYWRVc2VyQ29udGVudCArPSBgLmZsdXR0ZXItcGx1Z2lucy1kZXBlbmRlbmNpZXNcbmFuZHJvaWQva2V5LnByb3BlcnRpZXNcbmlvcy8uYnVuZGxlXG4uaWRlYS9ydW5Db25maWd1cmF0aW9ucy54bWxcbmA7XG4gICAgfVxuICAgIGlmIChjb25maWcuZG9lc0NvbnRhaW5UZW1wbGF0ZVlhbWwpIHtcbiAgICAgIGhlYWRVc2VyQ29udGVudCArPSBgLmF3cy1zYW0vXG5wYWNrYWdlZC55YW1sXG5gO1xuICAgIH1cbiAgICAvLyBCZWNhdXNlIC52ZW52IHNob3VsZCBiZSBpZ25vcmVkIG9uIHJvb3QgZGlyZWN0b3J5XG4gICAgaWYgKGNvbmZpZy5kb2VzQ29udGFpblBvZXRyeUxvY2spIHtcbiAgICAgIG5hbWVzLnB1c2goJ3B5dGhvbicpO1xuICAgICAgaGVhZFVzZXJDb250ZW50ICs9IGAudmVudi9cbmA7XG4gICAgfVxuXG4gICAgaWYgKGNvbmZpZy5kZXBlbmRpbmcuYmxpdHopIHtcbiAgICAgIGhlYWRVc2VyQ29udGVudCArPSBgLmJsaXR6L1xuLmJsaXR6KipcbmA7XG4gICAgfVxuICAgIGlmIChjb25maWcuZGVwZW5kaW5nLm5leHQpIHtcbiAgICAgIG5hbWVzLnB1c2goJ25leHRqcycpO1xuICAgIH1cbiAgICBpZiAocm9vdENvbmZpZy5kZXBlbmRpbmcuZmlyZWJhc2UgfHwgY29uZmlnLmRlcGVuZGluZy5maXJlYmFzZSkge1xuICAgICAgbmFtZXMucHVzaCgnZmlyZWJhc2UnKTtcbiAgICB9XG4gICAgaWYgKGNvbmZpZy5kZXBlbmRpbmcucHJpc21hKSB7XG4gICAgICBoZWFkVXNlckNvbnRlbnQgKz0gYCouc3FsaXRlMypcbmA7XG4gICAgfVxuICAgIGlmIChjb25maWcuZGVwZW5kaW5nLnBsYXl3cmlnaHRUZXN0KSB7XG4gICAgICBoZWFkVXNlckNvbnRlbnQgKz0gYHBsYXl3cmlnaHQtcmVwb3J0L1xudGVzdC1yZXN1bHRzL1xuYDtcbiAgICB9XG4gICAgaWYgKHJvb3RDb25maWcuZGVwZW5kaW5nLnJlYWN0TmF0aXZlIHx8IGNvbmZpZy5kZXBlbmRpbmcucmVhY3ROYXRpdmUpIHtcbiAgICAgIG5hbWVzLnB1c2goJ3JlYWN0bmF0aXZlJyk7XG4gICAgICBoZWFkVXNlckNvbnRlbnQgKz0gYGdvb2dsZS1zZXJ2aWNlcy5qc29uXG5hbmRyb2lkL2FwcC9zcmMvbWFpbi9hc3NldHMvXG5gO1xuICAgIH1cbiAgICBpZiAoY29uZmlnLmRlcGVuZGluZy5zdG9yeWJvb2spIHtcbiAgICAgIG5hbWVzLnB1c2goJ3N0b3J5Ym9va2pzJyk7XG4gICAgfVxuICAgIGlmIChjb25maWcuZGVwZW5kaW5nLmxpdGVzdHJlYW0pIHtcbiAgICAgIGhlYWRVc2VyQ29udGVudCArPSBgZ2NwLXNhLWtleS5qc29uXG5gO1xuICAgIH1cblxuICAgIGxldCBnZW5lcmF0ZWQgPSAnJztcbiAgICBmb3IgKGNvbnN0IG5hbWUgb2YgbmFtZXMpIHtcbiAgICAgIGxldCBjb250ZW50ID0gKGF3YWl0IHJlYWRDYWNoZShuYW1lKSkgPz8gJyc7XG4gICAgICBpZiAoIWNvbnRlbnQpIHtcbiAgICAgICAgY29uc3QgdXJsID0gYGh0dHBzOi8vd3d3LnRvcHRhbC5jb20vZGV2ZWxvcGVycy9naXRpZ25vcmUvYXBpLyR7bmFtZX1gO1xuICAgICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoKHVybCk7XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlVGV4dCA9IGF3YWl0IHJlc3BvbnNlLnRleHQoKTtcbiAgICAgICAgaWYgKCFyZXNwb25zZS5vayB8fCByZXNwb25zZVRleHQuaW5jbHVkZXMoJ0F0dGVudGlvbiBSZXF1aXJlZCEnKSB8fCByZXNwb25zZVRleHQuaW5jbHVkZXMoJzx0aXRsZT4nKSkge1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoYEZhaWxlZCB0byBmZXRjaCAke3VybH1gKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY29udGVudCA9IHJlc3BvbnNlVGV4dC50cmltKCk7XG4gICAgICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiB3cml0ZUNhY2hlKG5hbWUsIGNvbnRlbnQpKTtcbiAgICAgICAgaWYgKG9wdGlvbnMuaXNWZXJib3NlKSB7XG4gICAgICAgICAgY29uc29sZS5pbmZvKGBGZXRjaGVkICR7dXJsfWApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAoZ2VuZXJhdGVkKSBnZW5lcmF0ZWQgKz0gJ1xcbic7XG4gICAgICBnZW5lcmF0ZWQgKz0gY29udGVudCArICdcXG4nO1xuICAgIH1cbiAgICBpZiAoIShhd2FpdCBpZ25vcmVGaWxlVXRpbC5pc0JlcnJ5WmVyb0luc3RhbGxFbmFibGVkKGZpbGVQYXRoKSkpIHtcbiAgICAgIGdlbmVyYXRlZCA9IGdlbmVyYXRlZC5yZXBsYWNlKCchLnlhcm4vY2FjaGUnLCAnIyAhLnlhcm4vY2FjaGUnKS5yZXBsYWNlKCcjIC5wbnAuKicsICcucG5wLionKTtcbiAgICB9XG4gICAgaWYgKGNvbmZpZy5kb2VzQ29udGFpblBvbVhtbCB8fCBjb25maWcuZG9lc0NvbnRhaW5QdWJzcGVjWWFtbCkge1xuICAgICAgZ2VuZXJhdGVkID0gZ2VuZXJhdGVkXG4gICAgICAgIC5yZXBsYWNlQWxsKC9eIyAuaWRlYVxcL2FydGlmYWN0cyQvZ20sICcuaWRlYS9hcnRpZmFjdHMnKVxuICAgICAgICAucmVwbGFjZUFsbCgvXiMgLmlkZWFcXC9jb21waWxlci54bWwkL2dtLCAnLmlkZWEvY29tcGlsZXIueG1sJylcbiAgICAgICAgLnJlcGxhY2VBbGwoL14jIC5pZGVhXFwvamFyUmVwb3NpdG9yaWVzLnhtbCQvZ20sICcuaWRlYS9qYXJSZXBvc2l0b3JpZXMueG1sJylcbiAgICAgICAgLnJlcGxhY2VBbGwoL14jIC5pZGVhXFwvbW9kdWxlcy54bWwkL2dtLCAnLmlkZWEvbW9kdWxlcy54bWwnKVxuICAgICAgICAucmVwbGFjZUFsbCgvXiMgLmlkZWFcXC8qLmltbCQvZ20sICcuaWRlYS8qLmltbCcpXG4gICAgICAgIC5yZXBsYWNlQWxsKC9eIyAuaWRlYVxcL21vZHVsZXMkL2dtLCAnLmlkZWEvbW9kdWxlcycpXG4gICAgICAgIC5yZXBsYWNlQWxsKC9eIyAqLmltbCQvZ20sICcqLmltbCcpXG4gICAgICAgIC5yZXBsYWNlQWxsKC9eIyAqLmlwciQvZ20sICcqLmlwcicpO1xuICAgICAgaWYgKGNvbmZpZy5kb2VzQ29udGFpblB1YnNwZWNZYW1sKSB7XG4gICAgICAgIGdlbmVyYXRlZCA9IGdlbmVyYXRlZC5yZXBsYWNlQWxsKC9eLmlkZWFcXC9tb2R1bGVzLnhtbCQvZ20sICcjIC5pZGVhL21vZHVsZXMueG1sJyk7XG4gICAgICB9XG4gICAgfVxuICAgIGdlbmVyYXRlZCA9IGdlbmVyYXRlZC5yZXBsYWNlQWxsKC9eLmlkZWFcXC8/JC9nbSwgJyMgLmlkZWEnKTtcbiAgICBpZiAocm9vdENvbmZpZy5kZXBlbmRpbmcucmVhY3ROYXRpdmUgfHwgY29uZmlnLmRlcGVuZGluZy5yZWFjdE5hdGl2ZSB8fCBjb25maWcuZG9lc0NvbnRhaW5QdWJzcGVjWWFtbCkge1xuICAgICAgZ2VuZXJhdGVkID0gZ2VuZXJhdGVkLnJlcGxhY2VBbGwoL14oLmlkZWFcXC8uKykkL2dtLCAnJDFcXG5hbmRyb2lkLyQxJyk7XG4gICAgfVxuICAgIGNvbnN0IG5ld0NvbnRlbnQgPSBoZWFkVXNlckNvbnRlbnQgKyAnXFxuJyArIGdlbmVyYXRlZCArIHRhaWxVc2VyQ29udGVudDtcbiAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnNVdGlsLmdlbmVyYXRlRmlsZShmaWxlUGF0aCwgbmV3Q29udGVudCkpO1xuICB9KTtcbn1cblxuY29uc3QgZGlyUGF0aCA9IHBhdGguam9pbihvcy5ob21lZGlyKCksICcuY2FjaGUnLCAnd2JmeScsICdnaXRpZ25vcmUnKTtcblxuYXN5bmMgZnVuY3Rpb24gd3JpdGVDYWNoZShuYW1lOiBzdHJpbmcsIGNvbnRlbnQ6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICBhd2FpdCBmcy5wcm9taXNlcy5ta2RpcihkaXJQYXRoLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgYXdhaXQgZnMucHJvbWlzZXMud3JpdGVGaWxlKHBhdGguam9pbihkaXJQYXRoLCBuYW1lKSwgY29udGVudCk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHJlYWRDYWNoZShuYW1lOiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZyB8IHVuZGVmaW5lZD4ge1xuICB0cnkge1xuICAgIGNvbnN0IHN0YXQgPSBhd2FpdCBmcy5wcm9taXNlcy5zdGF0KHBhdGguam9pbihkaXJQYXRoLCBuYW1lKSk7XG4gICAgaWYgKERhdGUubm93KCkgLSBzdGF0Lm10aW1lTXMgPiA2ICogNjAgKiA2MCAqIDEwMDApIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgcmV0dXJuIGF3YWl0IGZzLnByb21pc2VzLnJlYWRGaWxlKHBhdGguam9pbihkaXJQYXRoLCBuYW1lKSwgJ3V0ZjgnKTtcbiAgfSBjYXRjaCB7XG4gICAgLy8gZG8gbm90aGluZ1xuICB9XG59XG4iLCJpbXBvcnQgeyBzcGF3blN5bmNXaXRoU3RyaW5nUmVzdWx0IH0gZnJvbSAnLi4vdXRpbHMvc3Bhd25VdGlsLmpzJztcblxuZXhwb3J0IGZ1bmN0aW9uIGdldExhdGVzdENvbW1pdEhhc2gob3JnYW5pemF0aW9uOiBzdHJpbmcsIHJlcG86IHN0cmluZyk6IFByb21pc2U8c3RyaW5nPiB7XG4gIHRyeSB7XG4gICAgY29uc3QgcmVwb1VybCA9IGBnaXRAZ2l0aHViLmNvbToke29yZ2FuaXphdGlvbn0vJHtyZXBvfS5naXRgO1xuICAgIGNvbnN0IG91dHB1dCA9IHNwYXduU3luY1dpdGhTdHJpbmdSZXN1bHQoJ2dpdCcsIFsnbHMtcmVtb3RlJywgcmVwb1VybCwgJ0hFQUQnXSwgcHJvY2Vzcy5jd2QoKSk7XG4gICAgY29uc3QgY29tbWl0SGFzaCA9IG91dHB1dC5zcGxpdCgvXFxzKy8pWzBdO1xuICAgIGlmICghY29tbWl0SGFzaCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBObyBjb21taXRzIGZvdW5kIGZvciAke29yZ2FuaXphdGlvbn0vJHtyZXBvfWApO1xuICAgIH1cbiAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKGNvbW1pdEhhc2gpO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIHJldHVybiBQcm9taXNlLnJlamVjdChuZXcgRXJyb3IoYEZhaWxlZCB0byBmZXRjaCBjb21taXRzIGZvciAke29yZ2FuaXphdGlvbn0vJHtyZXBvfTogJHtTdHJpbmcoZXJyb3IpfWApKTtcbiAgfVxufVxuIiwiaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5cbmV4cG9ydCBjb25zdCBFc2xpbnRVdGlsID0ge1xuICBnZXRMaW50Rml4U3VmZml4KGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGNvbmZpZy5kb2VzQ29udGFpbkpzeE9yVHN4ID8gJyAtLXJ1bGUgXCJ7IHJlYWN0LWhvb2tzL2V4aGF1c3RpdmUtZGVwczogMCB9XCInIDogJyc7XG4gIH0sXG59O1xuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IG1lcmdlIGZyb20gJ2RlZXBtZXJnZSc7XG5pbXBvcnQgZmcgZnJvbSAnZmFzdC1nbG9iJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUpzb24sIFNldFJlcXVpcmVkIH0gZnJvbSAndHlwZS1mZXN0JztcblxuaW1wb3J0IHsgZ2V0TGF0ZXN0Q29tbWl0SGFzaCB9IGZyb20gJy4uL2dpdGh1Yi9jb21taXQuanMnO1xuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgRXNsaW50RXh0ZW5zaW9uQmFzZSwgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgRXNsaW50VXRpbCB9IGZyb20gJy4uL3V0aWxzL2VzbGludFV0aWwuanMnO1xuaW1wb3J0IHsgZXh0ZW5zaW9ucyB9IGZyb20gJy4uL3V0aWxzL2V4dGVuc2lvbnMuanMnO1xuaW1wb3J0IHsgZ2l0SHViVXRpbCB9IGZyb20gJy4uL3V0aWxzL2dpdGh1YlV0aWwuanMnO1xuaW1wb3J0IHsgZ2xvYklnbm9yZSB9IGZyb20gJy4uL3V0aWxzL2dsb2JVdGlsLmpzJztcbmltcG9ydCB7IGlnbm9yZUZpbGVVdGlsIH0gZnJvbSAnLi4vdXRpbHMvaWdub3JlRmlsZVV0aWwuanMnO1xuaW1wb3J0IHsgY29tYmluZU1lcmdlIH0gZnJvbSAnLi4vdXRpbHMvbWVyZ2VVdGlsLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuaW1wb3J0IHsgc3Bhd25TeW5jIH0gZnJvbSAnLi4vdXRpbHMvc3Bhd25VdGlsLmpzJztcblxuY29uc3QganNDb21tb25EZXBzID0gW1xuICAnZXNsaW50JyxcbiAgJ2VzbGludC1jb25maWctZmxhdC1naXRpZ25vcmUnLFxuICAnZXNsaW50LWNvbmZpZy1wcmV0dGllcicsXG4gICdlc2xpbnQtcGx1Z2luLWltcG9ydC14JyxcbiAgJ2VzbGludC1wbHVnaW4tc29ydC1jbGFzcy1tZW1iZXJzJyxcbiAgJ2VzbGludC1wbHVnaW4tc29ydC1kZXN0cnVjdHVyZS1rZXlzJyxcbiAgJ2VzbGludC1wbHVnaW4tdW5pY29ybicsXG4gICdlc2xpbnQtcGx1Z2luLXVudXNlZC1pbXBvcnRzJyxcbiAgJ2dsb2JhbHMnLFxuXTtcblxuY29uc3QgdHNDb21tb25EZXBzID0gWy4uLmpzQ29tbW9uRGVwcywgJ3R5cGVzY3JpcHQtZXNsaW50JywgJ2VzbGludC1pbXBvcnQtcmVzb2x2ZXItdHlwZXNjcmlwdCddO1xuXG5jb25zdCByZWFjdENvbW1vbkRlcHMgPSBbJ2VzbGludC1wbHVnaW4tcmVhY3QnLCAnZXNsaW50LXBsdWdpbi1yZWFjdC1ob29rcycsICdlc2xpbnQtcGx1Z2luLXJlYWN0LWNvbXBpbGVyJ107XG5cbmNvbnN0IGVzbGludERlcHM6IFJlY29yZDxFc2xpbnRFeHRlbnNpb25CYXNlLCBzdHJpbmdbXT4gPSB7XG4gICdAd2lsbGJvb3N0ZXIvZXNsaW50LWNvbmZpZy1qcyc6IFsnQHdpbGxib29zdGVyL2VzbGludC1jb25maWctanMnLCAuLi5qc0NvbW1vbkRlcHNdLFxuICAnQHdpbGxib29zdGVyL2VzbGludC1jb25maWctanMtcmVhY3QnOiBbJ0B3aWxsYm9vc3Rlci9lc2xpbnQtY29uZmlnLWpzLXJlYWN0JywgLi4uanNDb21tb25EZXBzLCAuLi5yZWFjdENvbW1vbkRlcHNdLFxuICAnQHdpbGxib29zdGVyL2VzbGludC1jb25maWctdHMnOiBbJ0B3aWxsYm9vc3Rlci9lc2xpbnQtY29uZmlnLXRzJywgLi4udHNDb21tb25EZXBzXSxcbiAgJ0B3aWxsYm9vc3Rlci9lc2xpbnQtY29uZmlnLXRzLXJlYWN0JzogWydAd2lsbGJvb3N0ZXIvZXNsaW50LWNvbmZpZy10cy1yZWFjdCcsIC4uLnRzQ29tbW9uRGVwcywgLi4ucmVhY3RDb21tb25EZXBzXSxcbiAgJ0B3aWxsYm9vc3Rlci9lc2xpbnQtY29uZmlnLW5leHQnOiBbXG4gICAgJ0B3aWxsYm9vc3Rlci9lc2xpbnQtY29uZmlnLW5leHQnLFxuICAgICdlc2xpbnQtY29uZmlnLW5leHQnLFxuICAgIC4uLnRzQ29tbW9uRGVwcyxcbiAgICAuLi5yZWFjdENvbW1vbkRlcHMsXG4gIF0sXG59O1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVQYWNrYWdlSnNvbihcbiAgY29uZmlnOiBQYWNrYWdlQ29uZmlnLFxuICByb290Q29uZmlnOiBQYWNrYWdlQ29uZmlnLFxuICBza2lwQWRkaW5nRGVwczogYm9vbGVhblxuKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZ2VuZXJhdGVQYWNrYWdlSnNvbicsIGFzeW5jICgpID0+IHtcbiAgICBhd2FpdCBjb3JlKGNvbmZpZywgcm9vdENvbmZpZywgc2tpcEFkZGluZ0RlcHMpO1xuICB9KTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gY29yZShjb25maWc6IFBhY2thZ2VDb25maWcsIHJvb3RDb25maWc6IFBhY2thZ2VDb25maWcsIHNraXBBZGRpbmdEZXBzOiBib29sZWFuKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAncGFja2FnZS5qc29uJyk7XG4gIGNvbnN0IGpzb25UZXh0ID0gYXdhaXQgZnMucHJvbWlzZXMucmVhZEZpbGUoZmlsZVBhdGgsICd1dGY4Jyk7XG4gIGNvbnN0IGpzb25PYmogPSBKU09OLnBhcnNlKGpzb25UZXh0KSBhcyBQYWNrYWdlSnNvbjtcbiAganNvbk9iai5zY3JpcHRzID0ganNvbk9iai5zY3JpcHRzID8/IHt9O1xuICBqc29uT2JqLmRlcGVuZGVuY2llcyA9IGpzb25PYmouZGVwZW5kZW5jaWVzID8/IHt9O1xuICBqc29uT2JqLmRldkRlcGVuZGVuY2llcyA9IGpzb25PYmouZGV2RGVwZW5kZW5jaWVzID8/IHt9O1xuICBqc29uT2JqLnBlZXJEZXBlbmRlbmNpZXMgPSBqc29uT2JqLnBlZXJEZXBlbmRlbmNpZXMgPz8ge307XG4gIGNvbnN0IHBhY2thZ2VNYW5hZ2VyID0gY29uZmlnLmlzQnVuID8gJ2J1bicgOiAneWFybic7XG5cbiAgYXdhaXQgcmVtb3ZlRGVwcmVjYXRlZFN0dWZmKGpzb25PYmogYXMgU2V0UmVxdWlyZWQ8UGFja2FnZUpzb24sICdzY3JpcHRzJyB8ICdkZXBlbmRlbmNpZXMnIHwgJ2RldkRlcGVuZGVuY2llcyc+KTtcblxuICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhqc29uT2JqLnNjcmlwdHMgYXMgUmVjb3JkPHN0cmluZywgc3RyaW5nPikpIHtcbiAgICAvLyBGcmVzaCByZXBvIHN0aWxsIHJlcXVpcmVzICd5YXJuIGluc3RhbGwnXG4gICAgaWYgKCF2YWx1ZS5pbmNsdWRlcygnZ2l0IGNsb25lJykpIHtcbiAgICAgIGpzb25PYmouc2NyaXB0c1trZXldID0gdmFsdWUucmVwbGFjZSgveWFyblxccyomJlxccyovLCAnJykucmVwbGFjZSgveWFyblxccyppbnN0YWxsXFxzKiYmXFxzKi8sICcnKTtcbiAgICB9XG4gIH1cblxuICBqc29uT2JqLnNjcmlwdHMgPSBtZXJnZShqc29uT2JqLnNjcmlwdHMsIGdlbmVyYXRlU2NyaXB0cyhjb25maWcsIGpzb25PYmouc2NyaXB0cykpO1xuXG4gIGlmICgnY2hlY2stZm9yLWFpJyBpbiBqc29uT2JqLnNjcmlwdHMpIHtcbiAgICBpZiAoJ2dlbi1jb2RlJyBpbiBqc29uT2JqLnNjcmlwdHMpIHtcbiAgICAgIGpzb25PYmouc2NyaXB0c1snY2hlY2stZm9yLWFpJ10gPSBgJHtwYWNrYWdlTWFuYWdlcn0gZ2VuLWNvZGUgPiAvZGV2L251bGwgJiYgJHtqc29uT2JqLnNjcmlwdHNbJ2NoZWNrLWZvci1haSddfWA7XG4gICAgfVxuICAgIGpzb25PYmouc2NyaXB0c1snY2hlY2stZm9yLWFpJ10gPSBgJHtwYWNrYWdlTWFuYWdlcn0gaW5zdGFsbCA+IC9kZXYvbnVsbCAmJiAke2pzb25PYmouc2NyaXB0c1snY2hlY2stZm9yLWFpJ119YDtcbiAgfVxuXG4gIGlmIChjb25maWcuaXNCdW4pIHtcbiAgICBkZWxldGUganNvbk9iai5zY3JpcHRzLnByZXR0aWZ5O1xuICB9IGVsc2Uge1xuICAgIGpzb25PYmouc2NyaXB0cy5wcmV0dGlmeSA9IChqc29uT2JqLnNjcmlwdHMucHJldHRpZnkgPz8gJycpICsgKGF3YWl0IGdlbmVyYXRlUHJldHRpZXJTdWZmaXgoY29uZmlnLmRpclBhdGgpKTtcbiAgfVxuICAvLyBEZWFsIHdpdGggYnJlYWtpbmcgY2hhbmdlcyBpbiB5YXJuIGJlcnJ5IDQuMC4wLXJjLjQ5XG4gIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKGpzb25PYmouc2NyaXB0cykpIHtcbiAgICBpZiAoIXZhbHVlPy5pbmNsdWRlcygneWFybiB3b3Jrc3BhY2VzIGZvcmVhY2gnKSkgY29udGludWU7XG4gICAgaWYgKFxuICAgICAgdmFsdWUuaW5jbHVkZXMoJy0tYWxsJykgfHxcbiAgICAgIHZhbHVlLmluY2x1ZGVzKCctLXJlY3Vyc2l2ZScpIHx8XG4gICAgICB2YWx1ZS5pbmNsdWRlcygnLS1zaW5jZScpIHx8XG4gICAgICB2YWx1ZS5pbmNsdWRlcygnLS13b3JrdHJlZScpXG4gICAgKVxuICAgICAgY29udGludWU7XG4gICAganNvbk9iai5zY3JpcHRzW2tleV0gPSB2YWx1ZS5yZXBsYWNlKCd5YXJuIHdvcmtzcGFjZXMgZm9yZWFjaCcsICd5YXJuIHdvcmtzcGFjZXMgZm9yZWFjaCAtLWFsbCcpO1xuICB9XG5cbiAgbGV0IGRlcGVuZGVuY2llczogc3RyaW5nW10gPSBbXTtcbiAgbGV0IGRldkRlcGVuZGVuY2llcyA9IFsncHJldHRpZXInLCAnc29ydC1wYWNrYWdlLWpzb24nXTtcbiAgY29uc3QgcG9ldHJ5RGV2RGVwZW5kZW5jaWVzOiBzdHJpbmdbXSA9IFtdO1xuXG4gIGlmIChcbiAgICAhZnMuZXhpc3RzU3luYyhwYXRoLmpvaW4ocm9vdENvbmZpZy5kaXJQYXRoLCAnLnByZXR0aWVycmMuanNvbicpKSAmJlxuICAgICFmcy5leGlzdHNTeW5jKHBhdGguam9pbihjb25maWcuZGlyUGF0aCwgJy5wcmV0dGllcnJjLmpzb24nKSlcbiAgKSB7XG4gICAganNvbk9iai5wcmV0dGllciA9ICdAd2lsbGJvb3N0ZXIvcHJldHRpZXItY29uZmlnJztcbiAgICBkZXZEZXBlbmRlbmNpZXMucHVzaCgncHJldHRpZXItcGx1Z2luLWphdmEnLCAnQHdpbGxib29zdGVyL3ByZXR0aWVyLWNvbmZpZycpO1xuICB9XG5cbiAgaWYgKGNvbmZpZy5pc0J1bikge1xuICAgIGRlbGV0ZSBqc29uT2JqLmRldkRlcGVuZGVuY2llc1snbGludC1zdGFnZWQnXTtcbiAgfSBlbHNlIHtcbiAgICBkZXZEZXBlbmRlbmNpZXMucHVzaCgnbGludC1zdGFnZWQnKTtcbiAgfVxuXG4gIGlmIChjb25maWcuaXNSb290KSB7XG4gICAgaWYgKGNvbmZpZy5pc0J1bikge1xuICAgICAgZGVsZXRlIGpzb25PYmouZGV2RGVwZW5kZW5jaWVzLmh1c2t5O1xuICAgICAgZGVsZXRlIGpzb25PYmouZGV2RGVwZW5kZW5jaWVzLnBpbnN0O1xuICAgICAganNvbk9iai5zY3JpcHRzLnByZXBhcmUgPSAnbGVmdGhvb2sgaW5zdGFsbCB8fCB0cnVlJztcbiAgICAgIGRldkRlcGVuZGVuY2llcy5wdXNoKCdsZWZ0aG9vaycpO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBUbyBpbnN0YWxsIHRoZSBsYXRlc3QgaHVza3lcbiAgICAgIGRldkRlcGVuZGVuY2llcy5wdXNoKCdodXNreScpO1xuICAgICAgLy8gJ3x8IHRydWUnIGF2b2lkcyBlcnJvcnMgd2hlbiBodXNreSBpcyBub3QgaW5zdGFsbGVkLlxuICAgICAganNvbk9iai5zY3JpcHRzLnByZXBhcmUgPSAnaHVza3kgfHwgdHJ1ZSc7IC8vIGZvciBub24teWFybiBwYWNrYWdlIG1hbmFnZXJzLlxuICAgICAganNvbk9iai5zY3JpcHRzLnBvc3RpbnN0YWxsID0gJ2h1c2t5IHx8IHRydWUnOyAvLyBmb3IgeWFybi5cbiAgICAgIGlmIChjb25maWcuaXNQdWJsaWNSZXBvIHx8IGNvbmZpZy5pc1JlZmVycmVkQnlPdGhlclJlcG8pIHtcbiAgICAgICAgLy8gVG8gaW5zdGFsbCB0aGUgbGF0ZXN0IHBpbnN0XG4gICAgICAgIC8vIGh0dHBzOi8vdHlwaWNvZGUuZ2l0aHViLmlvL2h1c2t5LyMvP2lkPWluc3RhbGwtMVxuICAgICAgICBkZXZEZXBlbmRlbmNpZXMucHVzaCgncGluc3QnKTtcbiAgICAgICAganNvbk9iai5zY3JpcHRzLnByZXBhY2sgPSAncGluc3QgLS1kaXNhYmxlJztcbiAgICAgICAganNvbk9iai5zY3JpcHRzLnBvc3RwYWNrID0gJ3BpbnN0IC0tZW5hYmxlJztcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoY29uZmlnLmRlcGVuZGluZy5zZW1hbnRpY1JlbGVhc2UpIHtcbiAgICAgIGlmIChcbiAgICAgICAgIWpzb25PYmouZGV2RGVwZW5kZW5jaWVzWydzZW1hbnRpYy1yZWxlYXNlJ10gJiZcbiAgICAgICAgIWpzb25PYmouZGV2RGVwZW5kZW5jaWVzWydtdWx0aS1zZW1hbnRpYy1yZWxlYXNlJ10gJiZcbiAgICAgICAgIWpzb25PYmouZGV2RGVwZW5kZW5jaWVzWydAcWl3aS9tdWx0aS1zZW1hbnRpYy1yZWxlYXNlJ11cbiAgICAgICkge1xuICAgICAgICBkZXZEZXBlbmRlbmNpZXMucHVzaCgnc2VtYW50aWMtcmVsZWFzZScpO1xuICAgICAgfVxuICAgICAganNvbk9iai52ZXJzaW9uID0gJzAuMC4wLXNlbWFudGljYWxseS1yZWxlYXNlZCc7XG4gICAgfVxuXG4gICAgaWYgKGNvbmZpZy5kZXBlbmRpbmcucGxheXdyaWdodFRlc3QpIHtcbiAgICAgIC8vIFNpbmNlIGFydGlsbGVyeSByZXF1aXJlcyBhIHNwZWNpZmljIHZlcnNpb24gb2YgQHBsYXl3cmlnaHQvdGVzdFxuICAgICAgY29uc3QgaGFzQXJ0aWxsZXJ5ID0ganNvbk9iai5kZXBlbmRlbmNpZXMuYXJ0aWxsZXJ5IHx8IGpzb25PYmouZGV2RGVwZW5kZW5jaWVzLmFydGlsbGVyeTtcbiAgICAgIC8vIFNpbmNlIGxsbS10b29sYm94IHJlcXVpcmVzIEBwbGF5d3JpZ2h0L3Rlc3QgaW4gZGVwZW5kZW5jaWVzXG4gICAgICBpZiAoIWhhc0FydGlsbGVyeSAmJiAhanNvbk9iai5kZXBlbmRlbmNpZXNbJ0BwbGF5d3JpZ2h0L3Rlc3QnXSkge1xuICAgICAgICBkZXZEZXBlbmRlbmNpZXMucHVzaCgnQHBsYXl3cmlnaHQvdGVzdCcpO1xuICAgICAgICBkZWxldGUganNvbk9iai5kZXBlbmRlbmNpZXNbJ0BwbGF5d3JpZ2h0L3Rlc3QnXTtcbiAgICAgIH1cbiAgICAgIGRlbGV0ZSBqc29uT2JqLmRlcGVuZGVuY2llcy5wbGF5d3JpZ2h0O1xuICAgICAgZGVsZXRlIGpzb25PYmouZGV2RGVwZW5kZW5jaWVzLnBsYXl3cmlnaHQ7XG4gICAgfVxuXG4gICAgaWYgKGNvbmZpZy5kb2VzQ29udGFpblN1YlBhY2thZ2VKc29ucykge1xuICAgICAgLy8gV2UgZG9uJ3QgYWxsb3cgbm9uLWFycmF5IHdvcmtzcGFjZXMgaW4gbW9ub3JlcG8uXG4gICAgICBqc29uT2JqLndvcmtzcGFjZXMgPSBBcnJheS5pc0FycmF5KGpzb25PYmoud29ya3NwYWNlcylcbiAgICAgICAgPyBtZXJnZS5hbGwoW2pzb25PYmoud29ya3NwYWNlcywgWydwYWNrYWdlcy8qJ11dLCB7XG4gICAgICAgICAgICBhcnJheU1lcmdlOiBjb21iaW5lTWVyZ2UsXG4gICAgICAgICAgfSlcbiAgICAgICAgOiBbJ3BhY2thZ2VzLyonXTtcbiAgICB9IGVsc2UgaWYgKEFycmF5LmlzQXJyYXkoanNvbk9iai53b3Jrc3BhY2VzKSkge1xuICAgICAganNvbk9iai53b3Jrc3BhY2VzID0ganNvbk9iai53b3Jrc3BhY2VzLmZpbHRlcihcbiAgICAgICAgKHdvcmtzcGFjZSkgPT5cbiAgICAgICAgICBmZy5nbG9iU3luYyh3b3Jrc3BhY2UsIHtcbiAgICAgICAgICAgIGRvdDogdHJ1ZSxcbiAgICAgICAgICAgIGN3ZDogY29uZmlnLmRpclBhdGgsXG4gICAgICAgICAgICBpZ25vcmU6IGdsb2JJZ25vcmUsXG4gICAgICAgICAgfSkubGVuZ3RoID4gMFxuICAgICAgKTtcbiAgICAgIGlmIChqc29uT2JqLndvcmtzcGFjZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIGRlbGV0ZSBqc29uT2JqLndvcmtzcGFjZXM7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgaWYgKGNvbmZpZy5kZXBlbmRpbmcud2IgfHwgY29uZmlnLmlzQnVuKSB7XG4gICAgaWYgKGpzb25PYmouZGVwZW5kZW5jaWVzWydAd2lsbGJvb3N0ZXIvd2InXSkge1xuICAgICAgZGVwZW5kZW5jaWVzLnB1c2goXG4gICAgICAgIGpzb25PYmouZGVwZW5kZW5jaWVzWydAd2lsbGJvb3N0ZXIvd2InXS5zdGFydHNXaXRoKCcxMC4nKSA/ICdAd2lsbGJvb3N0ZXIvd2JAMTAuNy4xJyA6ICdAd2lsbGJvb3N0ZXIvd2InXG4gICAgICApO1xuICAgIH0gZWxzZSB7XG4gICAgICBkZXZEZXBlbmRlbmNpZXMucHVzaChcbiAgICAgICAganNvbk9iai5kZXZEZXBlbmRlbmNpZXNbJ0B3aWxsYm9vc3Rlci93YiddPy5zdGFydHNXaXRoKCcxMC4nKSA/ICdAd2lsbGJvb3N0ZXIvd2JAMTAuNy4xJyA6ICdAd2lsbGJvb3N0ZXIvd2InXG4gICAgICApO1xuICAgIH1cbiAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhqc29uT2JqLnNjcmlwdHMgYXMgUmVjb3JkPHN0cmluZywgc3RyaW5nPikpIHtcbiAgICAgIGpzb25PYmouc2NyaXB0c1trZXldID0gdmFsdWUucmVwbGFjZSgvd2JcXHMrZGIvLCAnd2IgcHJpc21hJyk7XG4gICAgfVxuICB9XG5cbiAgaWYgKFxuICAgIGNvbmZpZy5kb2VzQ29udGFpbkphdmFTY3JpcHQgfHxcbiAgICBjb25maWcuZG9lc0NvbnRhaW5KYXZhU2NyaXB0SW5QYWNrYWdlcyB8fFxuICAgIGNvbmZpZy5kb2VzQ29udGFpblR5cGVTY3JpcHQgfHxcbiAgICBjb25maWcuZG9lc0NvbnRhaW5UeXBlU2NyaXB0SW5QYWNrYWdlc1xuICApIHtcbiAgICBpZiAoY29uZmlnLmlzQnVuKSB7XG4gICAgICBkZXZEZXBlbmRlbmNpZXMucHVzaCgnQGJpb21lanMvYmlvbWUnLCAnQHdpbGxib29zdGVyL2Jpb21lLWNvbmZpZycpO1xuICAgICAgZGVsZXRlIGpzb25PYmouZGV2RGVwZW5kZW5jaWVzLmVzbGludDtcbiAgICAgIGRlbGV0ZSBqc29uT2JqLmRldkRlcGVuZGVuY2llcy5taWNyb21hdGNoO1xuICAgICAgZGVsZXRlIGpzb25PYmouZGV2RGVwZW5kZW5jaWVzWyd0eXBlc2NyaXB0LWVzbGludCddO1xuICAgIH0gZWxzZSB7XG4gICAgICBkZXZEZXBlbmRlbmNpZXMucHVzaCgnZXNsaW50JywgJ21pY3JvbWF0Y2gnKTtcbiAgICB9XG4gIH1cblxuICBpZiAoY29uZmlnLmRvZXNDb250YWluVHlwZVNjcmlwdCB8fCBjb25maWcuZG9lc0NvbnRhaW5UeXBlU2NyaXB0SW5QYWNrYWdlcykge1xuICAgIGRldkRlcGVuZGVuY2llcy5wdXNoKCd0eXBlc2NyaXB0Jyk7XG4gICAgaWYgKGNvbmZpZy5pc0J1bikge1xuICAgICAgZGV2RGVwZW5kZW5jaWVzLnB1c2goJ0B0eXBlcy9idW4nKTtcbiAgICB9XG4gIH1cblxuICBpZiAoY29uZmlnLmVzbGludEJhc2UpIHtcbiAgICBkZXZEZXBlbmRlbmNpZXMucHVzaCguLi5lc2xpbnREZXBzW2NvbmZpZy5lc2xpbnRCYXNlXSk7XG4gIH1cblxuICBpZiAoY29uZmlnLmlzV2lsbEJvb3N0ZXJDb25maWdzKSB7XG4gICAgZGVwZW5kZW5jaWVzID0gZGVwZW5kZW5jaWVzLmZpbHRlcigoZGVwKSA9PiAhZGVwLmluY2x1ZGVzKCdAd2lsbGJvb3N0ZXIvJykpO1xuICAgIGRldkRlcGVuZGVuY2llcyA9IGRldkRlcGVuZGVuY2llcy5maWx0ZXIoKGRlcCkgPT4gIWRlcC5pbmNsdWRlcygnQHdpbGxib29zdGVyLycpKTtcbiAgfVxuXG4gIGlmICghanNvbk9iai5uYW1lKSB7XG4gICAganNvbk9iai5uYW1lID0gcGF0aC5iYXNlbmFtZShjb25maWcuZGlyUGF0aCk7XG4gIH1cblxuICBpZiAoY29uZmlnLmRvZXNDb250YWluU3ViUGFja2FnZUpzb25zKSB7XG4gICAganNvbk9iai5wcml2YXRlID0gdHJ1ZTtcbiAgfVxuICBpZiAoIWpzb25PYmoubGljZW5zZSkge1xuICAgIGpzb25PYmoubGljZW5zZSA9ICdVTkxJQ0VOU0VEJztcbiAgfVxuICBpZiAoIWpzb25PYmoucHJpdmF0ZSAmJiBqc29uT2JqLmxpY2Vuc2UgIT09ICdVTkxJQ0VOU0VEJyAmJiByb290Q29uZmlnLmlzUHVibGljUmVwbykge1xuICAgIGpzb25PYmoucHVibGlzaENvbmZpZyA/Pz0ge307XG4gICAganNvbk9iai5wdWJsaXNoQ29uZmlnLmFjY2VzcyA/Pz0gJ3B1YmxpYyc7XG4gIH1cbiAgY29uc3QgW293bmVyXSA9IGdpdEh1YlV0aWwuZ2V0T3JnQW5kTmFtZShjb25maWcucmVwb3NpdG9yeSA/PyAnJyk7XG4gIGlmIChvd25lciA9PT0gJ1dpbGxCb29zdGVyJyB8fCBvd25lciA9PT0gJ1dpbGxCb29zdGVyTGFiJykge1xuICAgIGpzb25PYmouYXV0aG9yID0gJ1dpbGxCb29zdGVyIEluYy4nO1xuICB9XG4gIGlmICghY29uZmlnLmlzUm9vdCAmJiBqc29uT2JqLnByaXZhdGUgJiYgIWpzb25PYmoubWFpbikge1xuICAgIC8vIE1ha2UgVlNDb2RlIHBvc3NpYmxlIHRvIHJlZmFjdG9yIGNvZGUgYWNyb3NzIHN1YnBhY2thZ2VzLlxuICAgIGpzb25PYmoubWFpbiA9ICcuL3NyYyc7XG4gIH1cblxuICAvLyBCZWNhdXNlIGBcInJlc29sdXRpb25zXCI6IHsgXCJucG0vY2hhbGtcIjogXCJeNC4xLjJcIiB9LGAgY2F1c2VzIFwiSW52YWxpZCBucG0gdG9rZW5cIlxuICBkZWxldGUganNvbk9iai5yZXNvbHV0aW9ucz8uWyducG0vY2hhbGsnXTtcblxuICBpZiAoIWNvbmZpZy5kb2VzQ29udGFpblN1YlBhY2thZ2VKc29ucykge1xuICAgIGlmICghY29uZmlnLmlzQnVuKSB7XG4gICAgICBpZiAoIWNvbmZpZy5kb2VzQ29udGFpbkphdmFTY3JpcHQgJiYgIWNvbmZpZy5kb2VzQ29udGFpblR5cGVTY3JpcHQpIHtcbiAgICAgICAgZGVsZXRlIGpzb25PYmouc2NyaXB0cy5saW50O1xuICAgICAgICBkZWxldGUganNvbk9iai5zY3JpcHRzWydsaW50LWZpeCddO1xuICAgICAgICBmb3IgKGNvbnN0IHNjcmlwdE5hbWUgb2YgWydjbGVhbnVwJywgJ2NoZWNrLWZvci1haSddKSB7XG4gICAgICAgICAgY29uc3Qgc2NyaXB0ID0ganNvbk9iai5zY3JpcHRzW3NjcmlwdE5hbWVdO1xuICAgICAgICAgIGlmICghc2NyaXB0KSBjb250aW51ZTtcbiAgICAgICAgICBqc29uT2JqLnNjcmlwdHNbc2NyaXB0TmFtZV0gPSBzY3JpcHQucmVwbGFjZSgvID8mJiA/eWFybiBsaW50LWZpeCg/OiAtLXF1aWV0KT8vLCAnJyk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGpzb25PYmouc2NyaXB0c1snbGludC1maXgnXSA9IChqc29uT2JqLnNjcmlwdHNbJ2xpbnQtZml4J10gPz8gJycpICsgRXNsaW50VXRpbC5nZXRMaW50Rml4U3VmZml4KGNvbmZpZyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGNvbmZpZy5kb2VzQ29udGFpblB1YnNwZWNZYW1sKSB7XG4gICAgICBqc29uT2JqLnNjcmlwdHMubGludCA9ICdmbHV0dGVyIGFuYWx5emUnO1xuICAgICAganNvbk9iai5zY3JpcHRzWydsaW50LWZpeCddID0gJ3lhcm4gbGludCc7XG4gICAgICBjb25zdCBkaXJzID0gWydsaWInLCAndGVzdCcsICd0ZXN0X2RyaXZlciddLmZpbHRlcigoZGlyKSA9PiBmcy5leGlzdHNTeW5jKHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgZGlyKSkpO1xuICAgICAgaWYgKGRpcnMubGVuZ3RoID4gMCkge1xuICAgICAgICBqc29uT2JqLnNjcmlwdHNbJ2Zvcm1hdC1jb2RlJ10gPSBgZGFydCBmb3JtYXQgJChmaW5kICR7ZGlycy5qb2luKFxuICAgICAgICAgICcgJ1xuICAgICAgICApfSAtbmFtZSBnZW5lcmF0ZWQgLXBydW5lIC1vIC1uYW1lICcqLmZyZWV6ZWQuZGFydCcgLXBydW5lIC1vIC1uYW1lICcqLmcuZGFydCcgLXBydW5lIC1vIC1uYW1lICcqLmRhcnQnIC1wcmludClgO1xuICAgICAgICBqc29uT2JqLnNjcmlwdHMuZm9ybWF0ID0gKGpzb25PYmouc2NyaXB0cy5mb3JtYXQgPz8gJycpICsgYCAmJiB5YXJuIGZvcm1hdC1jb2RlYDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoY29uZmlnLmRvZXNDb250YWluUG9ldHJ5TG9jaykge1xuICAgICAgaWYgKGpzb25PYmouc2NyaXB0cy5wb3N0aW5zdGFsbCA9PT0gJ3BvZXRyeSBpbnN0YWxsJykge1xuICAgICAgICBkZWxldGUganNvbk9iai5zY3JpcHRzLnBvc3RpbnN0YWxsO1xuICAgICAgfVxuICAgICAgY29uc3QgcHl0aG9uRmlsZXMgPSBhd2FpdCBmZy5nbG9iKCcqKi8qLnB5Jywge1xuICAgICAgICBjd2Q6IGNvbmZpZy5kaXJQYXRoLFxuICAgICAgICBkb3Q6IHRydWUsXG4gICAgICAgIGlnbm9yZTogZ2xvYklnbm9yZSxcbiAgICAgIH0pO1xuICAgICAgY29uc3QgZGlyTmFtZVNldCA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICAgICAgZm9yIChjb25zdCBweXRob25GaWxlIG9mIHB5dGhvbkZpbGVzKSB7XG4gICAgICAgIGNvbnN0IFtmaXJzdCwgc2Vjb25kXSA9IHB5dGhvbkZpbGUuc3BsaXQoL1svXFxcXF0vKTtcbiAgICAgICAgaWYgKGZpcnN0ICYmIHNlY29uZCkge1xuICAgICAgICAgIGRpck5hbWVTZXQuYWRkKGZpcnN0KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKGRpck5hbWVTZXQuc2l6ZSA+IDApIHtcbiAgICAgICAgY29uc3QgZGlyTmFtZXNTdHIgPSBbLi4uZGlyTmFtZVNldF0uam9pbignICcpO1xuICAgICAgICBqc29uT2JqLnNjcmlwdHNbJ2Zvcm1hdC1jb2RlJ10gPVxuICAgICAgICAgIGBwb2V0cnkgcnVuIGlzb3J0IC0tcHJvZmlsZSBibGFjayAke2Rpck5hbWVzU3RyfSAmJiBwb2V0cnkgcnVuIGJsYWNrICR7ZGlyTmFtZXNTdHJ9YDtcbiAgICAgICAgaWYgKGpzb25PYmouc2NyaXB0cy5saW50KSB7XG4gICAgICAgICAganNvbk9iai5zY3JpcHRzLmxpbnQgPSBgcG9ldHJ5IHJ1biBmbGFrZTggJHtkaXJOYW1lc1N0cn0gJiYgJHtqc29uT2JqLnNjcmlwdHMubGludH1gO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGpzb25PYmouc2NyaXB0cy5saW50ID0gYHBvZXRyeSBydW4gZmxha2U4ICR7ZGlyTmFtZXNTdHJ9YDtcbiAgICAgICAgICBqc29uT2JqLnNjcmlwdHNbJ2xpbnQtZml4J10gPSAneWFybiBsaW50JztcbiAgICAgICAgfVxuICAgICAgICBqc29uT2JqLnNjcmlwdHMuZm9ybWF0ID0gKGpzb25PYmouc2NyaXB0cy5mb3JtYXQgPz8gJycpICsgYCAmJiB5YXJuIGZvcm1hdC1jb2RlYDtcbiAgICAgICAgcG9ldHJ5RGV2RGVwZW5kZW5jaWVzLnB1c2goJ2JsYWNrJywgJ2lzb3J0JywgJ2ZsYWtlOCcpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChjb25maWcucmVwb3NpdG9yeSkge1xuICAgICAganNvbk9iai5yZXBvc2l0b3J5ID0gY29uZmlnLnJlcG9zaXRvcnk7XG4gICAgfVxuICB9XG5cbiAgaWYgKGNvbmZpZy5kZXBlbmRpbmcuYmxpdHopIHtcbiAgICBpZiAoIWpzb25PYmouc2NyaXB0c1snZ2VuLWNvZGUnXT8uc3RhcnRzV2l0aCgnYmxpdHogY29kZWdlbicpKSB7XG4gICAgICBqc29uT2JqLnNjcmlwdHNbJ2dlbi1jb2RlJ10gPSAnYmxpdHogY29kZWdlbic7XG4gICAgfSBlbHNlIGlmICghanNvbk9iai5zY3JpcHRzWydnZW4tY29kZSddLmluY2x1ZGVzKCdibGl0eiBwcmlzbWEgZ2VuZXJhdGUnKSkge1xuICAgICAganNvbk9iai5zY3JpcHRzWydnZW4tY29kZSddID0ganNvbk9iai5zY3JpcHRzWydnZW4tY29kZSddLnJlcGxhY2UoXG4gICAgICAgICdibGl0eiBjb2RlZ2VuJyxcbiAgICAgICAgJ2JsaXR6IGNvZGVnZW4gJiYgYmxpdHogcHJpc21hIGdlbmVyYXRlJ1xuICAgICAgKTtcbiAgICB9XG4gIH0gZWxzZSBpZiAoY29uZmlnLmRlcGVuZGluZy5wcmlzbWEgJiYgIWpzb25PYmouc2NyaXB0c1snZ2VuLWNvZGUnXT8uc3RhcnRzV2l0aCgncHJpc21hIGdlbmVyYXRlJykpIHtcbiAgICBqc29uT2JqLnNjcmlwdHNbJ2dlbi1jb2RlJ10gPSAncHJpc21hIGdlbmVyYXRlJztcbiAgfVxuXG4gIGlmICghanNvbk9iai5kZXBlbmRlbmNpZXMucHJldHRpZXIpIHtcbiAgICAvLyBCZWNhdXNlIEB0eXBlcy9wcmV0dGllciBibG9ja3MgcHJldHRpZXIgZXhlY3V0aW9uLlxuICAgIGRlbGV0ZSBqc29uT2JqLmRldkRlcGVuZGVuY2llc1snQHR5cGVzL3ByZXR0aWVyJ107XG4gIH1cblxuICBpZiAoT2JqZWN0LmtleXMoanNvbk9iai5kZXBlbmRlbmNpZXMpLmxlbmd0aCA9PT0gMCkge1xuICAgIGRlbGV0ZSBqc29uT2JqLmRlcGVuZGVuY2llcztcbiAgfVxuICBpZiAoT2JqZWN0LmtleXMoanNvbk9iai5kZXZEZXBlbmRlbmNpZXMpLmxlbmd0aCA9PT0gMCkge1xuICAgIGRlbGV0ZSBqc29uT2JqLmRldkRlcGVuZGVuY2llcztcbiAgfVxuICBpZiAoT2JqZWN0LmtleXMoanNvbk9iai5wZWVyRGVwZW5kZW5jaWVzKS5sZW5ndGggPT09IDApIHtcbiAgICBkZWxldGUganNvbk9iai5wZWVyRGVwZW5kZW5jaWVzO1xuICB9XG5cbiAgYXdhaXQgdXBkYXRlUHJpdmF0ZVBhY2thZ2VzKGpzb25PYmopO1xuXG4gIGlmIChjb25maWcuaXNCdW4pIGRlbGV0ZSBqc29uT2JqLnBhY2thZ2VNYW5hZ2VyO1xuICBsZXQgbmV3SnNvblRleHQgPSBKU09OLnN0cmluZ2lmeShqc29uT2JqKTtcbiAgbmV3SnNvblRleHQgPSBhd2FpdCBmaXhTY3JpcHROYW1lcyhqc29uT2JqLnNjcmlwdHMsIG5ld0pzb25UZXh0LCBjb25maWcpO1xuICBhd2FpdCBmcy5wcm9taXNlcy53cml0ZUZpbGUoZmlsZVBhdGgsIG5ld0pzb25UZXh0KTtcblxuICBpZiAoIXNraXBBZGRpbmdEZXBzKSB7XG4gICAgLy8gV2UgY2Fubm90IGFkZCBkZXBlbmRlbmNpZXMgd2hpY2ggYXJlIGFscmVhZHkgaW5jbHVkZWQgaW4gZGV2RGVwZW5kZW5jaWVzLlxuICAgIGRlcGVuZGVuY2llcyA9IGRlcGVuZGVuY2llcy5maWx0ZXIoKGRlcCkgPT4gIWpzb25PYmouZGV2RGVwZW5kZW5jaWVzPy5bZGVwXSk7XG4gICAgaWYgKGRlcGVuZGVuY2llcy5sZW5ndGggPiAwKSB7XG4gICAgICBpZiAoY29uZmlnLmlzQnVuKSB7XG4gICAgICAgIHNwYXduU3luYyhwYWNrYWdlTWFuYWdlciwgWydyZW1vdmUnLCAuLi5uZXcgU2V0KGRlcGVuZGVuY2llcyldLCBjb25maWcuZGlyUGF0aCk7XG4gICAgICAgIHNwYXduU3luYyhwYWNrYWdlTWFuYWdlciwgWydhZGQnLCAnLS1leGFjdCcsIC4uLm5ldyBTZXQoZGVwZW5kZW5jaWVzKV0sIGNvbmZpZy5kaXJQYXRoKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHNwYXduU3luYyhwYWNrYWdlTWFuYWdlciwgWydhZGQnLCAuLi5uZXcgU2V0KGRlcGVuZGVuY2llcyldLCBjb25maWcuZGlyUGF0aCk7XG4gICAgICB9XG4gICAgfVxuICAgIC8vIFdlIGNhbm5vdCBhZGQgZGV2RGVwZW5kZW5jaWVzIHdoaWNoIGFyZSBhbHJlYWR5IGluY2x1ZGVkIGluIGRlcGVuZGVuY2llcy5cbiAgICBkZXZEZXBlbmRlbmNpZXMgPSBkZXZEZXBlbmRlbmNpZXMuZmlsdGVyKChkZXApID0+ICFqc29uT2JqLmRlcGVuZGVuY2llcz8uW2RlcF0pO1xuICAgIGlmIChkZXZEZXBlbmRlbmNpZXMubGVuZ3RoID4gMCkge1xuICAgICAgaWYgKGNvbmZpZy5pc0J1bikge1xuICAgICAgICBzcGF3blN5bmMocGFja2FnZU1hbmFnZXIsIFsncmVtb3ZlJywgLi4ubmV3IFNldChkZXZEZXBlbmRlbmNpZXMpXSwgY29uZmlnLmRpclBhdGgpO1xuICAgICAgICBzcGF3blN5bmMocGFja2FnZU1hbmFnZXIsIFsnYWRkJywgJy1EJywgJy0tZXhhY3QnLCAuLi5uZXcgU2V0KGRldkRlcGVuZGVuY2llcyldLCBjb25maWcuZGlyUGF0aCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzcGF3blN5bmMocGFja2FnZU1hbmFnZXIsIFsnYWRkJywgJy1EJywgLi4ubmV3IFNldChkZXZEZXBlbmRlbmNpZXMpXSwgY29uZmlnLmRpclBhdGgpO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAocG9ldHJ5RGV2RGVwZW5kZW5jaWVzLmxlbmd0aCA+IDApIHtcbiAgICAgIHNwYXduU3luYygncG9ldHJ5JywgWydhZGQnLCAnLS1ncm91cCcsICdkZXYnLCAuLi5uZXcgU2V0KHBvZXRyeURldkRlcGVuZGVuY2llcyldLCBjb25maWcuZGlyUGF0aCk7XG4gICAgfVxuICB9XG59XG5cbi8vIFRPRE86IHJlbW92ZSB0aGUgZm9sbG93aW5nIG1pZ3JhdGlvbiBjb2RlIGluIGZ1dHVyZVxuYXN5bmMgZnVuY3Rpb24gcmVtb3ZlRGVwcmVjYXRlZFN0dWZmKFxuICBqc29uT2JqOiBTZXRSZXF1aXJlZDxQYWNrYWdlSnNvbiwgJ3NjcmlwdHMnIHwgJ2RlcGVuZGVuY2llcycgfCAnZGV2RGVwZW5kZW5jaWVzJz5cbik6IFByb21pc2U8dm9pZD4ge1xuICBpZiAoanNvbk9iai5hdXRob3IgPT09ICdXaWxsQm9vc3RlciBMTEMnKSB7XG4gICAganNvbk9iai5hdXRob3IgPSAnV2lsbEJvb3N0ZXIgSW5jLic7XG4gIH1cbiAgZGVsZXRlIGpzb25PYmouc2NyaXB0c1snc29ydC1wYWNrYWdlLWpzb24nXTtcbiAgZGVsZXRlIGpzb25PYmouc2NyaXB0c1snc29ydC1hbGwtcGFja2FnZS1qc29uJ107XG4gIGRlbGV0ZSBqc29uT2JqLnNjcmlwdHNbJ3R5cGVjaGVjay93YXJuJ107XG4gIGRlbGV0ZSBqc29uT2JqLnNjcmlwdHNbJ3R5cGVjaGVjazpnZW4tY29kZSddO1xuICBkZWxldGUganNvbk9iai5zY3JpcHRzWyd0eXBlY2hlY2s6Y29kZWdlbiddO1xuICBkZWxldGUganNvbk9iai5kZXBlbmRlbmNpZXMudHNsaWI7XG4gIGRlbGV0ZSBqc29uT2JqLmRldkRlcGVuZGVuY2llc1snQHdpbGxib29zdGVyL2VzbGludC1jb25maWcnXTtcbiAgZGVsZXRlIGpzb25PYmouZGV2RGVwZW5kZW5jaWVzWydAd2lsbGJvb3N0ZXIvZXNsaW50LWNvbmZpZy1yZWFjdCddO1xuICBkZWxldGUganNvbk9iai5kZXZEZXBlbmRlbmNpZXNbJ0B3aWxsYm9vc3Rlci9yZW5vdmF0ZS1jb25maWcnXTtcbiAgZGVsZXRlIGpzb25PYmouZGV2RGVwZW5kZW5jaWVzWydAd2lsbGJvb3N0ZXIvdHNjb25maWcnXTtcbiAgZGVsZXRlIGpzb25PYmouZGV2RGVwZW5kZW5jaWVzWydlc2xpbnQtaW1wb3J0LXJlc29sdmVyLW5vZGUnXTtcbiAgZGVsZXRlIGpzb25PYmouZGV2RGVwZW5kZW5jaWVzWydlc2xpbnQtcGx1Z2luLXByZXR0aWVyJ107XG4gIGRlbGV0ZSBqc29uT2JqLmRldkRlcGVuZGVuY2llcy5sZXJuYTtcbiAgLy8gVG8gaW5zdGFsbCB0aGUgbGF0ZXN0IHBpbnN0XG4gIGRlbGV0ZSBqc29uT2JqLmRldkRlcGVuZGVuY2llcy5waW5zdDtcbiAgZGVsZXRlIGpzb25PYmouc2NyaXB0c1snZmx1dHRlci1mb3JtYXQnXTtcbiAgZGVsZXRlIGpzb25PYmouc2NyaXB0c1snZm9ybWF0LWZsdXR0ZXInXTtcbiAgZGVsZXRlIGpzb25PYmouc2NyaXB0c1sncHl0aG9uLWZvcm1hdCddO1xuICBkZWxldGUganNvbk9iai5zY3JpcHRzWydmb3JtYXQtcHl0aG9uJ107XG4gIGRlbGV0ZSBqc29uT2JqLnNjcmlwdHMucHJldHRpZXI7XG4gIGRlbGV0ZSBqc29uT2JqLnNjcmlwdHNbJ2NoZWNrLWFsbCddO1xuICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnMucHJvbWlzZXMucm0oJ2xlcm5hLmpzb24nLCB7IGZvcmNlOiB0cnVlIH0pKTtcblxuICAvLyBNaWdyYXRlIGZyb20gRVNMaW50IGxlZ2FjeSBjb25maWdzIHRvIGZsYXQgY29uZmlncyxcbiAgZGVsZXRlIGpzb25PYmouZGV2RGVwZW5kZW5jaWVzWydAdHlwZXNjcmlwdC1lc2xpbnQvZXNsaW50LXBsdWdpbiddO1xuICBkZWxldGUganNvbk9iai5kZXZEZXBlbmRlbmNpZXNbJ0B0eXBlc2NyaXB0LWVzbGludC9wYXJzZXInXTtcbiAgZGVsZXRlIGpzb25PYmouZGV2RGVwZW5kZW5jaWVzWydlc2xpbnQtcGx1Z2luLWltcG9ydCddO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2VuZXJhdGVTY3JpcHRzKGNvbmZpZzogUGFja2FnZUNvbmZpZywgb2xkU2NyaXB0czogUGFja2FnZUpzb24uU2NyaXB0cyk6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4ge1xuICBpZiAoY29uZmlnLmlzQnVuKSB7XG4gICAgY29uc3QgaGFzVHlwZWNoZWNrID0gY29uZmlnLmRvZXNDb250YWluVHlwZVNjcmlwdCB8fCBjb25maWcuZG9lc0NvbnRhaW5UeXBlU2NyaXB0SW5QYWNrYWdlcztcbiAgICBjb25zdCBzY3JpcHRzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge1xuICAgICAgJ2NoZWNrLWFsbC1mb3ItYWknOiAnYnVuIHJ1biBjaGVjay1mb3ItYWkgJiYgYnVuIHJ1biB0ZXN0IC0tc2lsZW50JyxcbiAgICAgICdjaGVjay1mb3ItYWknOiBgYnVuIHJ1biBjbGVhbnVwJHtoYXNUeXBlY2hlY2sgPyAnICYmIGJ1biBydW4gdHlwZWNoZWNrJyA6ICcnfWAsXG4gICAgICBjbGVhbnVwOiAnYnVuIC0tYnVuIHdiIGxpbnQgLS1maXggLS1mb3JtYXQnLFxuICAgICAgZm9ybWF0OiBgYnVuIC0tYnVuIHdiIGxpbnQgLS1mb3JtYXRgLFxuICAgICAgbGludDogYGJ1biAtLWJ1biB3YiBsaW50YCxcbiAgICAgICdsaW50LWZpeCc6ICdidW4gLS1idW4gd2IgbGludCAtLWZpeCcsXG4gICAgICB0ZXN0OiAnYnVuIHdiIHRlc3QnLFxuICAgICAgdHlwZWNoZWNrOiAnYnVuIC0tYnVuIHdiIHR5cGVjaGVjaycsXG4gICAgfTtcbiAgICBpZiAoIWhhc1R5cGVjaGVjaykge1xuICAgICAgZGVsZXRlIHNjcmlwdHMudHlwZWNoZWNrO1xuICAgIH1cbiAgICByZXR1cm4gc2NyaXB0cztcbiAgfSBlbHNlIHtcbiAgICBjb25zdCBoYXNUeXBlY2hlY2sgPSBjb25maWcuZG9lc0NvbnRhaW5UeXBlU2NyaXB0IHx8IGNvbmZpZy5kb2VzQ29udGFpblR5cGVTY3JpcHRJblBhY2thZ2VzO1xuICAgIGNvbnN0IG9sZFRlc3QgPSBvbGRTY3JpcHRzLnRlc3Q7XG4gICAgbGV0IHNjcmlwdHM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7XG4gICAgICAnY2hlY2stYWxsLWZvci1haSc6ICd5YXJuIGNoZWNrLWZvci1haSAmJiB5YXJuIHRlc3QnLFxuICAgICAgJ2NoZWNrLWZvci1haSc6IGB5YXJuIGZvcm1hdCA+IC9kZXYvbnVsbCAyPiAvZGV2L251bGwgfHwgdHJ1ZSAmJiB5YXJuIGxpbnQtZml4IC0tcXVpZXQke1xuICAgICAgICBoYXNUeXBlY2hlY2sgPyAnICYmIHlhcm4gdHlwZWNoZWNrJyA6ICcnXG4gICAgICB9YCxcbiAgICAgIGNsZWFudXA6ICd5YXJuIGZvcm1hdCAmJiB5YXJuIGxpbnQtZml4JyxcbiAgICAgIGZvcm1hdDogYHNvcnQtcGFja2FnZS1qc29uICYmIHlhcm4gcHJldHRpZnlgLFxuICAgICAgbGludDogYGVzbGludCAtLWNvbG9yYCxcbiAgICAgICdsaW50LWZpeCc6ICd5YXJuIGxpbnQgLS1maXgnLFxuICAgICAgcHJldHRpZnk6IGBwcmV0dGllciAtLWNhY2hlIC0tY29sb3IgLS13cml0ZSBcIioqL3suKi8sfSoueyR7ZXh0ZW5zaW9ucy5wcmV0dGllci5qb2luKCcsJyl9fVwiIFwiISoqL3Rlc3R7LSwvfWZpeHR1cmVzLyoqXCJgLFxuICAgICAgdHlwZWNoZWNrOiAndHNjIC0tbm9FbWl0IC0tUHJldHR5JyxcbiAgICB9O1xuICAgIGlmIChjb25maWcuZG9lc0NvbnRhaW5TdWJQYWNrYWdlSnNvbnMpIHtcbiAgICAgIHNjcmlwdHMgPSBtZXJnZShcbiAgICAgICAgeyAuLi5zY3JpcHRzIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBmb3JtYXQ6IGBzb3J0LXBhY2thZ2UtanNvbiAmJiB5YXJuIHByZXR0aWZ5ICYmIHlhcm4gd29ya3NwYWNlcyBmb3JlYWNoIC0tYWxsIC0tcGFyYWxsZWwgLS12ZXJib3NlIHJ1biBmb3JtYXRgLFxuICAgICAgICAgIGxpbnQ6IGB5YXJuIHdvcmtzcGFjZXMgZm9yZWFjaCAtLWFsbCAtLXBhcmFsbGVsIC0tdmVyYm9zZSBydW4gbGludGAsXG4gICAgICAgICAgJ2xpbnQtZml4JzogJ3lhcm4gd29ya3NwYWNlcyBmb3JlYWNoIC0tYWxsIC0tcGFyYWxsZWwgLS12ZXJib3NlIHJ1biBsaW50LWZpeCcsXG4gICAgICAgICAgcHJldHRpZnk6IGBwcmV0dGllciAtLWNhY2hlIC0tY29sb3IgLS13cml0ZSBcIioqL3suKi8sfSoueyR7ZXh0ZW5zaW9ucy5wcmV0dGllci5qb2luKFxuICAgICAgICAgICAgJywnXG4gICAgICAgICAgKX19XCIgXCIhKiovcGFja2FnZXMvKipcIiBcIiEqKi90ZXN0ey0sL31maXh0dXJlcy8qKlwiYCxcbiAgICAgICAgICAvLyBDST0xIHByZXZlbnRzIHZpdGVzdCBmcm9tIGVuYWJsaW5nIHdhdGNoLlxuICAgICAgICAgIC8vIEZPUkNFX0NPTE9SPTMgbWFrZSB3YiBlbmFibGUgY29sb3Igb3V0cHV0LlxuICAgICAgICAgIHRlc3Q6ICdDST0xIEZPUkNFX0NPTE9SPTMgeWFybiB3b3Jrc3BhY2VzIGZvcmVhY2ggLS1hbGwgLS12ZXJib3NlIHJ1biB0ZXN0JyxcbiAgICAgICAgICB0eXBlY2hlY2s6ICd5YXJuIHdvcmtzcGFjZXMgZm9yZWFjaCAtLWFsbCAtLXBhcmFsbGVsIC0tdmVyYm9zZSBydW4gdHlwZWNoZWNrJyxcbiAgICAgICAgfVxuICAgICAgKTtcbiAgICB9IGVsc2UgaWYgKGNvbmZpZy5kZXBlbmRpbmcucHlyaWdodCkge1xuICAgICAgc2NyaXB0cy50eXBlY2hlY2sgPSBzY3JpcHRzLnR5cGVjaGVjayA/IGAke3NjcmlwdHMudHlwZWNoZWNrfSAmJiBgIDogJyc7XG4gICAgICBzY3JpcHRzLnR5cGVjaGVjayArPSAncHlyaWdodCc7XG4gICAgfVxuICAgIGlmIChvbGRUZXN0Py5pbmNsdWRlcygnd2IgdGVzdCcpKSB7XG4gICAgICBzY3JpcHRzLnRlc3QgPSBvbGRUZXN0O1xuICAgICAgLy8gYHdiYCBzdXBwb3J0cyBgLS1zaWxlbnRgIG9wdGlvblxuICAgICAgc2NyaXB0c1snY2hlY2stYWxsLWZvci1haSddID0gKHNjcmlwdHNbJ2NoZWNrLWFsbC1mb3ItYWknXSA/PyAnJykgKyAnIC0tc2lsZW50JztcbiAgICB9XG5cbiAgICBpZiAoIWhhc1R5cGVjaGVjaykge1xuICAgICAgZGVsZXRlIHNjcmlwdHMudHlwZWNoZWNrO1xuICAgIH0gZWxzZSBpZiAoY29uZmlnLmRlcGVuZGluZy53Yikge1xuICAgICAgc2NyaXB0cy50eXBlY2hlY2sgPSAnd2IgdHlwZWNoZWNrJztcbiAgICB9XG4gICAgcmV0dXJuIHNjcmlwdHM7XG4gIH1cbn1cblxuYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVQcmV0dGllclN1ZmZpeChkaXJQYXRoOiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZz4ge1xuICBjb25zdCBmaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShkaXJQYXRoLCAnLnByZXR0aWVyaWdub3JlJyk7XG4gIGNvbnN0IGV4aXN0aW5nQ29udGVudCA9IGF3YWl0IGZzLnByb21pc2VzLnJlYWRGaWxlKGZpbGVQYXRoLCAndXRmOCcpO1xuICBjb25zdCBpbmRleCA9IGV4aXN0aW5nQ29udGVudC5pbmRleE9mKGlnbm9yZUZpbGVVdGlsLnNlcGFyYXRvclByZWZpeCk7XG4gIGlmIChpbmRleCA9PT0gLTEpIHJldHVybiAnJztcblxuICBjb25zdCBvcmlnaW5hbENvbnRlbnQgPSBleGlzdGluZ0NvbnRlbnQuc2xpY2UoMCwgaW5kZXgpO1xuICBjb25zdCBsaW5lcyA9IG9yaWdpbmFsQ29udGVudFxuICAgIC5zcGxpdCgnXFxuJylcbiAgICAubWFwKChsaW5lKSA9PiB7XG4gICAgICBjb25zdCBuZXdMaW5lID0gbGluZS50cmltKCk7XG4gICAgICByZXR1cm4gbmV3TGluZS5lbmRzV2l0aCgnLycpID8gbmV3TGluZS5zbGljZSgwLCAtMSkgOiBuZXdMaW5lO1xuICAgIH0pXG4gICAgLmZpbHRlcigobCkgPT4gbCAmJiAhbC5zdGFydHNXaXRoKCcjJykgJiYgIWwuaW5jbHVkZXMoJy8nKSk7XG5cbiAgcmV0dXJuIGAke2xpbmVzLm1hcCgobGluZSkgPT4gYCBcIiEqKi8ke2xpbmV9LyoqXCJgKS5qb2luKCcnKX0gfHwgdHJ1ZWA7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGZpeFNjcmlwdE5hbWVzKFxuICBzY3JpcHRzOiBQYWNrYWdlSnNvbi5TY3JpcHRzLFxuICBuZXdKc29uVGV4dDogc3RyaW5nLFxuICBjb25maWc6IFBhY2thZ2VDb25maWdcbik6IFByb21pc2U8c3RyaW5nPiB7XG4gIGNvbnN0IG9sZEFuZE5ld1NjcmlwdE5hbWVzOiBbc3RyaW5nLCBzdHJpbmddW10gPSBbXTtcbiAgZm9yIChjb25zdCBba2V5XSBvZiBPYmplY3Qua2V5cyhzY3JpcHRzKSkge1xuICAgIGlmIChrZXkgJiYgIWtleS5zdGFydHNXaXRoKCc6JykgJiYga2V5LmluY2x1ZGVzKCc6JykpIHtcbiAgICAgIG9sZEFuZE5ld1NjcmlwdE5hbWVzLnB1c2goW2tleSwga2V5LnJlcGxhY2VBbGwoJzonLCAnLScpXSk7XG4gICAgfVxuICB9XG4gIGlmIChvbGRBbmROZXdTY3JpcHROYW1lcy5sZW5ndGggPT09IDApIHJldHVybiBuZXdKc29uVGV4dDtcblxuICBmb3IgKGNvbnN0IFtvbGROYW1lLCBuZXdOYW1lXSBvZiBvbGRBbmROZXdTY3JpcHROYW1lcykge1xuICAgIG5ld0pzb25UZXh0ID0gbmV3SnNvblRleHQucmVwbGFjZUFsbChvbGROYW1lLCBuZXdOYW1lKTtcbiAgfVxuICBjb25zdCBmaWxlcyA9IGF3YWl0IGZnLmdsb2IoWycqKi8qLnttZCxjanMsbWpzLGpzLGpzeCxjdHMsbXRzLHRzLHRzeH0nLCAnKiovRG9ja2VyZmlsZSddLCB7XG4gICAgY3dkOiBjb25maWcuZGlyUGF0aCxcbiAgICBkb3Q6IHRydWUsXG4gICAgaWdub3JlOiBnbG9iSWdub3JlLFxuICB9KTtcbiAgZm9yIChjb25zdCBmaWxlIG9mIGZpbGVzKSB7XG4gICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5qb2luKGNvbmZpZy5kaXJQYXRoLCBmaWxlKTtcbiAgICAgIGNvbnN0IG9sZENvbnRlbnQgPSBhd2FpdCBmcy5wcm9taXNlcy5yZWFkRmlsZShmaWxlUGF0aCwgJ3V0ZjgnKTtcbiAgICAgIGxldCBuZXdDb250ZW50ID0gb2xkQ29udGVudDtcbiAgICAgIGZvciAoY29uc3QgW29sZE5hbWUsIG5ld05hbWVdIG9mIG9sZEFuZE5ld1NjcmlwdE5hbWVzKSB7XG4gICAgICAgIG5ld0NvbnRlbnQgPSBuZXdDb250ZW50LnJlcGxhY2VBbGwob2xkTmFtZSwgbmV3TmFtZSk7XG4gICAgICB9XG4gICAgICBpZiAobmV3Q29udGVudCAhPT0gb2xkQ29udGVudCkge1xuICAgICAgICBhd2FpdCBmcy5wcm9taXNlcy53cml0ZUZpbGUoZmlsZVBhdGgsIG5ld0NvbnRlbnQpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG4gIGF3YWl0IHByb21pc2VQb29sLnByb21pc2VBbGwoKTtcbiAgcmV0dXJuIG5ld0pzb25UZXh0O1xufVxuXG5hc3luYyBmdW5jdGlvbiB1cGRhdGVQcml2YXRlUGFja2FnZXMoanNvbk9iajogUGFja2FnZUpzb24pOiBQcm9taXNlPHZvaWQ+IHtcbiAganNvbk9iai5kZXBlbmRlbmNpZXMgPSBqc29uT2JqLmRlcGVuZGVuY2llcyA/PyB7fTtcbiAganNvbk9iai5kZXZEZXBlbmRlbmNpZXMgPSBqc29uT2JqLmRldkRlcGVuZGVuY2llcyA/PyB7fTtcbiAgY29uc3QgcGFja2FnZU5hbWVzID0gbmV3IFNldChbLi4uT2JqZWN0LmtleXMoanNvbk9iai5kZXBlbmRlbmNpZXMpLCAuLi5PYmplY3Qua2V5cyhqc29uT2JqLmRldkRlcGVuZGVuY2llcyldKTtcbiAgaWYgKHBhY2thZ2VOYW1lcy5oYXMoJ0B3aWxsYm9vc3Rlci9hdXRoJykgJiYgIWlzV29ya3NwYWNlUGFja2FnZShqc29uT2JqLCAnQHdpbGxib29zdGVyL2F1dGgnKSkge1xuICAgIGRlbGV0ZSBqc29uT2JqLmRldkRlcGVuZGVuY2llc1snQHdpbGxib29zdGVyL2F1dGgnXTtcbiAgICBjb25zdCBjb21taXRIYXNoID0gYXdhaXQgZ2V0TGF0ZXN0Q29tbWl0SGFzaCgnV2lsbEJvb3N0ZXJMYWInLCAnYXV0aCcpO1xuICAgIGpzb25PYmouZGVwZW5kZW5jaWVzWydAd2lsbGJvb3N0ZXIvYXV0aCddID0gYGdpdEBnaXRodWIuY29tOldpbGxCb29zdGVyTGFiL2F1dGguZ2l0IyR7Y29tbWl0SGFzaH1gO1xuICB9XG4gIGlmIChwYWNrYWdlTmFtZXMuaGFzKCdAZGlzY29yZC1ib3Qvc2hhcmVkJykgJiYgIWlzV29ya3NwYWNlUGFja2FnZShqc29uT2JqLCAnQGRpc2NvcmQtYm90L3NoYXJlZCcpKSB7XG4gICAgZGVsZXRlIGpzb25PYmouZGV2RGVwZW5kZW5jaWVzWydAZGlzY29yZC1ib3Qvc2hhcmVkJ107XG4gICAgY29uc3QgY29tbWl0SGFzaCA9IGF3YWl0IGdldExhdGVzdENvbW1pdEhhc2goJ1dpbGxCb29zdGVyTGFiJywgJ2Rpc2NvcmQtYm90Jyk7XG4gICAganNvbk9iai5kZXBlbmRlbmNpZXNbJ0BkaXNjb3JkLWJvdC9zaGFyZWQnXSA9IGBnaXRAZ2l0aHViLmNvbTpXaWxsQm9vc3RlckxhYi9kaXNjb3JkLWJvdC5naXQjJHtjb21taXRIYXNofWA7XG4gIH1cblxuICBpZiAocGFja2FnZU5hbWVzLmhhcygnQHdpbGxib29zdGVyL2NvZGUtYW5hbHl6ZXInKSAmJiAhaXNXb3Jrc3BhY2VQYWNrYWdlKGpzb25PYmosICdAd2lsbGJvb3N0ZXIvY29kZS1hbmFseXplcicpKSB7XG4gICAgZGVsZXRlIGpzb25PYmouZGVwZW5kZW5jaWVzWydAd2lsbGJvb3N0ZXIvY29kZS1hbmFseXplciddO1xuICAgIGNvbnN0IGNvbW1pdEhhc2ggPSBhd2FpdCBnZXRMYXRlc3RDb21taXRIYXNoKCdXaWxsQm9vc3RlckxhYicsICdjb2RlLWFuYWx5emVyJyk7XG4gICAganNvbk9iai5kZXZEZXBlbmRlbmNpZXNbJ0B3aWxsYm9vc3Rlci9jb2RlLWFuYWx5emVyJ10gPVxuICAgICAgYGdpdEBnaXRodWIuY29tOldpbGxCb29zdGVyTGFiL2NvZGUtYW5hbHl6ZXIuZ2l0IyR7Y29tbWl0SGFzaH1gO1xuICB9XG4gIGlmIChwYWNrYWdlTmFtZXMuaGFzKCdAd2lsbGJvb3N0ZXIvanVkZ2UnKSAmJiAhaXNXb3Jrc3BhY2VQYWNrYWdlKGpzb25PYmosICdAd2lsbGJvb3N0ZXIvanVkZ2UnKSkge1xuICAgIGRlbGV0ZSBqc29uT2JqLmRldkRlcGVuZGVuY2llc1snQHdpbGxib29zdGVyL2p1ZGdlJ107XG4gICAgY29uc3QgY29tbWl0SGFzaCA9IGF3YWl0IGdldExhdGVzdENvbW1pdEhhc2goJ1dpbGxCb29zdGVyTGFiJywgJ2p1ZGdlJyk7XG4gICAganNvbk9iai5kZXBlbmRlbmNpZXNbJ0B3aWxsYm9vc3Rlci9qdWRnZSddID0gYGdpdEBnaXRodWIuY29tOldpbGxCb29zdGVyTGFiL2p1ZGdlLmdpdCMke2NvbW1pdEhhc2h9YDtcbiAgfVxuICBpZiAocGFja2FnZU5hbWVzLmhhcygnQHdpbGxib29zdGVyL2xsbS1wcm94eScpICYmICFpc1dvcmtzcGFjZVBhY2thZ2UoanNvbk9iaiwgJ0B3aWxsYm9vc3Rlci9sbG0tcHJveHknKSkge1xuICAgIGRlbGV0ZSBqc29uT2JqLmRldkRlcGVuZGVuY2llc1snQHdpbGxib29zdGVyL2xsbS1wcm94eSddO1xuICAgIGNvbnN0IGNvbW1pdEhhc2ggPSBhd2FpdCBnZXRMYXRlc3RDb21taXRIYXNoKCdXaWxsQm9vc3RlckxhYicsICdsbG0tcHJveHknKTtcbiAgICBqc29uT2JqLmRlcGVuZGVuY2llc1snQHdpbGxib29zdGVyL2xsbS1wcm94eSddID0gYGdpdEBnaXRodWIuY29tOldpbGxCb29zdGVyTGFiL2xsbS1wcm94eS5naXQjJHtjb21taXRIYXNofWA7XG4gIH1cbn1cblxuZnVuY3Rpb24gaXNXb3Jrc3BhY2VQYWNrYWdlKGpzb25PYmo6IFBhY2thZ2VKc29uLCBwYWNrYWdlTmFtZTogc3RyaW5nKTogYm9vbGVhbiB7XG4gIHJldHVybiAoanNvbk9iai5kZXZEZXBlbmRlbmNpZXM/LltwYWNrYWdlTmFtZV0gfHwganNvbk9iai5kZXBlbmRlbmNpZXM/LltwYWNrYWdlTmFtZV0gfHwgJycpLmluY2x1ZGVzKCd3b3Jrc3BhY2UnKTtcbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB0eXBlIHsgUGFja2FnZUpzb24gfSBmcm9tICd0eXBlLWZlc3QnO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcbmltcG9ydCB7IHNwYXduU3luYyB9IGZyb20gJy4uL3V0aWxzL3NwYXduVXRpbC5qcyc7XG5cbmltcG9ydCB7IGdlbmVyYXRlU2NyaXB0cyB9IGZyb20gJy4vcGFja2FnZUpzb24uanMnO1xuXG5jb25zdCBzY3JpcHRzID0ge1xuICBwcmVDb21taXQ6ICdub2RlIG5vZGVfbW9kdWxlcy8uYmluL2xpbnQtc3RhZ2VkJyxcbiAgcHJlUHVzaDogYHlhcm4gdHlwZWNoZWNrYCxcbiAgcHJlUHVzaEZvckxhYjogYFxuaWYgWyAkKGdpdCBicmFuY2ggLS1zaG93LWN1cnJlbnQpID0gXCJtYWluXCIgXTsgdGhlblxuICBlY2hvIFwiKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXCJcbiAgZWNobyBcIioqKiBEb24ndCBwdXNoIG1haW4gYnJhbmNoIGRpcmVjdGx5LiBVc2UgUFIhICoqKlwiXG4gIGVjaG8gXCIqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcIlxuICBleGl0IDFcbmZpXG5cbnlhcm4gdHlwZWNoZWNrXG5gLnRyaW0oKSxcbiAgcHJlUHVzaEZvckxhYkV4Y2VwdEFkbWluOiBgXG5pZiBbICQoZ2l0IGJyYW5jaCAtLXNob3ctY3VycmVudCkgPSBcIm1haW5cIiBdICYmIFsgJChnaXQgY29uZmlnIHVzZXIuZW1haWwpICE9IFwiZXhrYXp1dUBnbWFpbC5jb21cIiBdOyB0aGVuXG4gIGVjaG8gXCIqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcIlxuICBlY2hvIFwiKioqIERvbid0IHB1c2ggbWFpbiBicmFuY2ggZGlyZWN0bHkuIFVzZSBQUiEgKioqXCJcbiAgZWNobyBcIioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlwiXG4gIGV4aXQgMVxuZmlcblxueWFybiB0eXBlY2hlY2tcbmAudHJpbSgpLFxuICBwb3N0TWVyZ2U6IGBcbmNoYW5nZWRfZmlsZXM9XCIkKGdpdCBkaWZmLXRyZWUgLXIgLS1uYW1lLW9ubHkgLS1uby1jb21taXQtaWQgT1JJR19IRUFEIEhFQUQpXCJcblxucnVuX2lmX2NoYW5nZWQoKSB7XG4gIGlmIGVjaG8gXCIkY2hhbmdlZF9maWxlc1wiIHwgZ3JlcCAtLXF1aWV0IC1FIFwiJDFcIjsgdGhlblxuICAgIGV2YWwgXCIkMlwiXG4gIGZpXG59XG5gLnRyaW0oKSxcbn07XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZW5lcmF0ZUh1c2t5cmNVcGRhdGluZ1BhY2thZ2VKc29uKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2dlbmVyYXRlSHVza3lyY1VwZGF0aW5nUGFja2FnZUpzb24nLCBhc3luYyAoKSA9PiB7XG4gICAgYXdhaXQgY29yZShjb25maWcpO1xuICB9KTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gY29yZShjb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgcGFja2FnZUpzb25QYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAncGFja2FnZS5qc29uJyk7XG4gIGNvbnN0IGpzb25UZXh0ID0gYXdhaXQgZnMucHJvbWlzZXMucmVhZEZpbGUocGFja2FnZUpzb25QYXRoLCAndXRmOCcpO1xuICBjb25zdCBwYWNrYWdlSnNvbiA9IEpTT04ucGFyc2UoanNvblRleHQpIGFzIFBhY2thZ2VKc29uO1xuICBwYWNrYWdlSnNvbi5zY3JpcHRzID8/PSB7fTtcbiAgZGVsZXRlIHBhY2thZ2VKc29uLnNjcmlwdHMucG9zdGluc3RhbGw7XG4gIGRlbGV0ZSBwYWNrYWdlSnNvbi5zY3JpcHRzLnBvc3RwdWJsaXNoO1xuICBkZWxldGUgcGFja2FnZUpzb24uc2NyaXB0cy5wcmVwYXJlO1xuICBkZWxldGUgcGFja2FnZUpzb24uc2NyaXB0cy5wcmVwdWJsaXNoT25seTtcbiAgZGVsZXRlIHBhY2thZ2VKc29uLnNjcmlwdHMucHJlcGFjaztcbiAgZGVsZXRlIHBhY2thZ2VKc29uLnNjcmlwdHMucG9zdHBhY2s7XG5cbiAgY29uc3QgZGlyUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJy5odXNreScpO1xuICBhd2FpdCBmcy5wcm9taXNlcy53cml0ZUZpbGUocGFja2FnZUpzb25QYXRoLCBKU09OLnN0cmluZ2lmeShwYWNrYWdlSnNvbiwgdW5kZWZpbmVkLCAyKSk7XG4gIGlmIChjb25maWcuaXNCdW4pIHtcbiAgICBhd2FpdCBmcy5wcm9taXNlcy5ybShkaXJQYXRoLCB7IGZvcmNlOiB0cnVlLCByZWN1cnNpdmU6IHRydWUgfSk7XG4gICAgc3Bhd25TeW5jKCdnaXQnLCBbJ2NvbmZpZycsICctLXVuc2V0JywgJ2NvcmUuaG9va3NQYXRoJ10sIGNvbmZpZy5kaXJQYXRoKTtcbiAgICByZXR1cm47XG4gIH1cblxuICBzcGF3blN5bmMoJ3lhcm4nLCBbJ2RseCcsICdodXNreScsICdpbml0J10sIGNvbmZpZy5kaXJQYXRoKTtcblxuICBjb25zdCBwcmVDb21taXRGaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShkaXJQYXRoLCAncHJlLWNvbW1pdCcpO1xuXG4gIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiBmcy5wcm9taXNlcy5ybShwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICcuaHVza3lyYy5qc29uJyksIHsgZm9yY2U6IHRydWUgfSkpO1xuICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnMucHJvbWlzZXMud3JpdGVGaWxlKHByZUNvbW1pdEZpbGVQYXRoLCBzY3JpcHRzLnByZUNvbW1pdCArICdcXG4nKSk7XG5cbiAgY29uc3QgeyB0eXBlY2hlY2sgfSA9IGdlbmVyYXRlU2NyaXB0cyhjb25maWcsIHt9KTtcbiAgaWYgKHR5cGVjaGVjaykge1xuICAgIGxldCBwcmVQdXNoID0gY29uZmlnLnJlcG9zaXRvcnk/LnN0YXJ0c1dpdGgoJ2dpdGh1YjpXaWxsQm9vc3RlckxhYi8nKVxuICAgICAgPyBjb25maWcucmVwb3NpdG9yeS50b0xvY2FsZUxvd2VyQ2FzZSgpLmluY2x1ZGVzKCdleGVyY29kZScpXG4gICAgICAgID8gc2NyaXB0cy5wcmVQdXNoRm9yTGFiXG4gICAgICAgIDogc2NyaXB0cy5wcmVQdXNoRm9yTGFiRXhjZXB0QWRtaW5cbiAgICAgIDogc2NyaXB0cy5wcmVQdXNoO1xuICAgIHByZVB1c2ggPSBwcmVQdXNoLnJlcGxhY2UoXG4gICAgICAneWFybiB0eXBlY2hlY2snLFxuICAgICAgdHlwZWNoZWNrXG4gICAgICAgIC5yZXBsYWNlKCd0c2MgJywgJ25vZGUgbm9kZV9tb2R1bGVzLy5iaW4vdHNjICcpXG4gICAgICAgIC5yZXBsYWNlKCd3YiAnLCAnbm9kZSBub2RlX21vZHVsZXMvLmJpbi93YiAnKVxuICAgICAgICAvLyBweXJpZ2h0IGhhcyBubyBhcmd1bWVudHNcbiAgICAgICAgLnJlcGxhY2UoJ3B5cmlnaHQnLCAnbm9kZSBub2RlX21vZHVsZXMvLmJpbi9weXJpZ2h0JylcbiAgICApO1xuICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PlxuICAgICAgZnMucHJvbWlzZXMud3JpdGVGaWxlKHBhdGgucmVzb2x2ZShkaXJQYXRoLCAncHJlLXB1c2gnKSwgcHJlUHVzaCArICdcXG4nLCB7XG4gICAgICAgIG1vZGU6IDBvNzU1LFxuICAgICAgfSlcbiAgICApO1xuICB9XG4gIGNvbnN0IHBvc3RNZXJnZUNvbW1hbmQgPSBgJHtzY3JpcHRzLnBvc3RNZXJnZX1cXG5cXG4ke2dlbmVyYXRlUG9zdE1lcmdlQ29tbWFuZHMoY29uZmlnKS5qb2luKCdcXG4nKX1cXG5gO1xuICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT5cbiAgICBmcy5wcm9taXNlcy53cml0ZUZpbGUocGF0aC5yZXNvbHZlKGRpclBhdGgsICdwb3N0LW1lcmdlJyksIHBvc3RNZXJnZUNvbW1hbmQsIHtcbiAgICAgIG1vZGU6IDBvNzU1LFxuICAgIH0pXG4gICk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZW5lcmF0ZVBvc3RNZXJnZUNvbW1hbmRzKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IHN0cmluZ1tdIHtcbiAgY29uc3QgcG9zdE1lcmdlQ29tbWFuZHM6IHN0cmluZ1tdID0gW107XG4gIGlmIChjb25maWcudmVyc2lvbnNUZXh0KSB7XG4gICAgcG9zdE1lcmdlQ29tbWFuZHMucHVzaChcbiAgICAgIFN0cmluZy5yYXdgcnVuX2lmX2NoYW5nZWQgXCJcXC4uKy12ZXJzaW9uXCIgXCJhd2sgJ3twcmludCBcXCQxfScgLnRvb2wtdmVyc2lvbnMgfCB4YXJncyAtSXt9IGFzZGYgcGx1Z2luIGFkZCB7fVwiYCxcbiAgICAgIFN0cmluZy5yYXdgcnVuX2lmX2NoYW5nZWQgXCJcXC4uKy12ZXJzaW9uXCIgXCJhc2RmIHBsdWdpbiB1cGRhdGUgLS1hbGxcImBcbiAgICApO1xuICB9XG4gIC8vIFB5dGhvbuOBjOOBquOBhOOBqOOCpOODs+OCueODiOODvOODq+OBp+OBjeOBquOBhOWHpueQhuezu+OBjOWtmOWcqOOBmeOCi+OBn+OCgeOAgeW8t+WItueahOOBq+acgOWIneOBq+OCpOODs+OCueODiOODvOODq+OBmeOCi+OAglxuICBpZiAoY29uZmlnLnZlcnNpb25zVGV4dD8uaW5jbHVkZXMoJ3B5dGhvbiAnKSkge1xuICAgIHBvc3RNZXJnZUNvbW1hbmRzLnB1c2goU3RyaW5nLnJhd2BydW5faWZfY2hhbmdlZCBcIlxcLi4rLXZlcnNpb25cIiBcImFzZGYgaW5zdGFsbCBweXRob25cImApO1xuICB9XG4gIGlmIChjb25maWcudmVyc2lvbnNUZXh0KSB7XG4gICAgcG9zdE1lcmdlQ29tbWFuZHMucHVzaChTdHJpbmcucmF3YHJ1bl9pZl9jaGFuZ2VkIFwiXFwuListdmVyc2lvblwiIFwiYXNkZiBpbnN0YWxsXCJgKTtcbiAgfVxuICBjb25zdCBpbnN0YWxsQ29tbWFuZCA9IGNvbmZpZy5pc0J1biA/ICdidW4gaW5zdGFsbCcgOiAneWFybic7XG4gIGNvbnN0IHJtTmV4dERpcmVjdG9yeSA9IGNvbmZpZy5kZXBlbmRpbmcuYmxpdHogfHwgY29uZmlnLmRlcGVuZGluZy5uZXh0ID8gJyAmJiBybSAtUmYgLm5leHQnIDogJyc7XG4gIHBvc3RNZXJnZUNvbW1hbmRzLnB1c2goU3RyaW5nLnJhd2BydW5faWZfY2hhbmdlZCBcInBhY2thZ2VcXC5qc29uXCIgXCIke2luc3RhbGxDb21tYW5kfSR7cm1OZXh0RGlyZWN0b3J5fVwiYCk7XG4gIGlmIChjb25maWcuZG9lc0NvbnRhaW5Qb2V0cnlMb2NrKSB7XG4gICAgcG9zdE1lcmdlQ29tbWFuZHMucHVzaChTdHJpbmcucmF3YHJ1bl9pZl9jaGFuZ2VkIFwicG9ldHJ5XFwubG9ja1wiIFwicG9ldHJ5IGluc3RhbGxcImApO1xuICB9XG4gIGlmIChjb25maWcuZGVwZW5kaW5nLmJsaXR6KSB7XG4gICAgcG9zdE1lcmdlQ29tbWFuZHMucHVzaChcbiAgICAgIFN0cmluZy5yYXdgcnVuX2lmX2NoYW5nZWQgXCIuKlxcLnByaXNtYVwiIFwibm9kZSBub2RlX21vZHVsZXMvLmJpbi9ibGl0eiBwcmlzbWEgbWlncmF0ZSBkZXBsb3lcImAsXG4gICAgICBTdHJpbmcucmF3YHJ1bl9pZl9jaGFuZ2VkIFwiLipcXC5wcmlzbWFcIiBcIm5vZGUgbm9kZV9tb2R1bGVzLy5iaW4vYmxpdHogcHJpc21hIGdlbmVyYXRlXCJgLFxuICAgICAgU3RyaW5nLnJhd2BydW5faWZfY2hhbmdlZCBcIi4qXFwucHJpc21hXCIgXCJub2RlIG5vZGVfbW9kdWxlcy8uYmluL2JsaXR6IGNvZGVnZW5cImBcbiAgICApO1xuICB9IGVsc2UgaWYgKGNvbmZpZy5kZXBlbmRpbmcucHJpc21hKSB7XG4gICAgcG9zdE1lcmdlQ29tbWFuZHMucHVzaChcbiAgICAgIFN0cmluZy5yYXdgcnVuX2lmX2NoYW5nZWQgXCIuKlxcLnByaXNtYVwiIFwibm9kZSBub2RlX21vZHVsZXMvLmJpbi9kb3RlbnYgLWMgZGV2ZWxvcG1lbnQgLS0gbm9kZSBub2RlX21vZHVsZXMvLmJpbi9wcmlzbWEgbWlncmF0ZSBkZXBsb3lcImAsXG4gICAgICBTdHJpbmcucmF3YHJ1bl9pZl9jaGFuZ2VkIFwiLipcXC5wcmlzbWFcIiBcIm5vZGUgbm9kZV9tb2R1bGVzLy5iaW4vZG90ZW52IC1jIGRldmVsb3BtZW50IC0tIG5vZGUgbm9kZV9tb2R1bGVzLy5iaW4vcHJpc21hIGdlbmVyYXRlXCJgXG4gICAgKTtcbiAgfVxuICByZXR1cm4gcG9zdE1lcmdlQ29tbWFuZHM7XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBleHRlbnNpb25zIH0gZnJvbSAnLi4vdXRpbHMvZXh0ZW5zaW9ucy5qcyc7XG5pbXBvcnQgeyBmc1V0aWwgfSBmcm9tICcuLi91dGlscy9mc1V0aWwuanMnO1xuaW1wb3J0IHsgcHJvbWlzZVBvb2wgfSBmcm9tICcuLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5cbmZ1bmN0aW9uIGNyZWF0ZVRhc2tPcHRpb25zKHJ1bm5lcjogc3RyaW5nLCBhcmdzOiBzdHJpbmcsIG5hbWU6IHN0cmluZywgZXh0ZW5zaW9uOiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gYCAgICA8VGFza09wdGlvbnMgaXNFbmFibGVkPVwidHJ1ZVwiPlxuICAgICAgPG9wdGlvbiBuYW1lPVwiYXJndW1lbnRzXCIgdmFsdWU9XCIke2FyZ3N9ICRGaWxlUGF0aFJlbGF0aXZlVG9Qcm9qZWN0Um9vdCRcIiAvPlxuICAgICAgPG9wdGlvbiBuYW1lPVwiY2hlY2tTeW50YXhFcnJvcnNcIiB2YWx1ZT1cImZhbHNlXCIgLz5cbiAgICAgIDxvcHRpb24gbmFtZT1cImRlc2NyaXB0aW9uXCIgLz5cbiAgICAgIDxvcHRpb24gbmFtZT1cImV4aXRDb2RlQmVoYXZpb3JcIiB2YWx1ZT1cIkVSUk9SXCIgLz5cbiAgICAgIDxvcHRpb24gbmFtZT1cImZpbGVFeHRlbnNpb25cIiB2YWx1ZT1cIiR7ZXh0ZW5zaW9ufVwiIC8+XG4gICAgICA8b3B0aW9uIG5hbWU9XCJpbW1lZGlhdGVTeW5jXCIgdmFsdWU9XCJmYWxzZVwiIC8+XG4gICAgICA8b3B0aW9uIG5hbWU9XCJuYW1lXCIgdmFsdWU9XCIke25hbWV9ICguJHtleHRlbnNpb259KVwiIC8+XG4gICAgICA8b3B0aW9uIG5hbWU9XCJvdXRwdXRcIiB2YWx1ZT1cIiRGaWxlUGF0aFJlbGF0aXZlVG9Qcm9qZWN0Um9vdCRcIiAvPlxuICAgICAgPG9wdGlvbiBuYW1lPVwib3V0cHV0RmlsdGVyc1wiPlxuICAgICAgICA8YXJyYXkgLz5cbiAgICAgIDwvb3B0aW9uPlxuICAgICAgPG9wdGlvbiBuYW1lPVwib3V0cHV0RnJvbVN0ZG91dFwiIHZhbHVlPVwiZmFsc2VcIiAvPlxuICAgICAgPG9wdGlvbiBuYW1lPVwicHJvZ3JhbVwiIHZhbHVlPVwiJHtydW5uZXJ9XCIgLz5cbiAgICAgIDxvcHRpb24gbmFtZT1cInJ1bk9uRXh0ZXJuYWxDaGFuZ2VzXCIgdmFsdWU9XCJmYWxzZVwiIC8+XG4gICAgICA8b3B0aW9uIG5hbWU9XCJzY29wZU5hbWVcIiB2YWx1ZT1cIlByb2plY3QgRmlsZXNcIiAvPlxuICAgICAgPG9wdGlvbiBuYW1lPVwidHJhY2tPbmx5Um9vdFwiIHZhbHVlPVwiZmFsc2VcIiAvPlxuICAgICAgPG9wdGlvbiBuYW1lPVwid29ya2luZ0RpclwiIHZhbHVlPVwiJFByb2plY3RGaWxlRGlyJFwiIC8+XG4gICAgICA8ZW52cyAvPlxuICAgIDwvVGFza09wdGlvbnM+XG5gO1xufVxuXG5jb25zdCBwcmV0dGllckNvbnRlbnQgPSBgPD94bWwgdmVyc2lvbj1cIjEuMFwiIGVuY29kaW5nPVwiVVRGLThcIj8+XG48cHJvamVjdCB2ZXJzaW9uPVwiNFwiPlxuICA8Y29tcG9uZW50IG5hbWU9XCJQcm9qZWN0VGFza3NPcHRpb25zXCI+XG4ke2V4dGVuc2lvbnMucHJldHRpZXIubWFwKChleHQpID0+IGNyZWF0ZVRhc2tPcHRpb25zKCdub2RlJywgJ25vZGVfbW9kdWxlcy8uYmluL3ByZXR0aWVyIC0tY2FjaGUgLS13cml0ZScsICdQcmV0dGllcicsIGV4dCkpLmpvaW4oJycpfVxuICA8L2NvbXBvbmVudD5cbjwvcHJvamVjdD5cbmA7XG5cbmNvbnN0IGJpb21lQ29udGVudCA9IGA8P3htbCB2ZXJzaW9uPVwiMS4wXCIgZW5jb2Rpbmc9XCJVVEYtOFwiPz5cbjxwcm9qZWN0IHZlcnNpb249XCI0XCI+XG4gIDxjb21wb25lbnQgbmFtZT1cIlByb2plY3RUYXNrc09wdGlvbnNcIj5cbiR7ZXh0ZW5zaW9ucy5wcmV0dGllci5tYXAoKGV4dCkgPT4gY3JlYXRlVGFza09wdGlvbnMoJ2J1bicsICctLWJ1biBub2RlX21vZHVsZXMvLmJpbi9iaW9tZSBjaGVjayAtLWZpeCAtLW5vLWVycm9ycy1vbi11bm1hdGNoZWQgLS1za2lwLXBhcnNlLWVycm9ycycsICdCaW9tZScsIGV4dCkpLmpvaW4oJycpfVxuICA8L2NvbXBvbmVudD5cbjwvcHJvamVjdD5cbmA7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZW5lcmF0ZUlkZWFTZXR0aW5ncyhjb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdnZW5lcmF0ZUlkZWFTZXR0aW5ncycsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBkaXJQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnLmlkZWEnKTtcbiAgICBpZiAoZnMuZXhpc3RzU3luYyhkaXJQYXRoKSkge1xuICAgICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLnJlc29sdmUoZGlyUGF0aCwgJ3dhdGNoZXJUYXNrcy54bWwnKTtcbiAgICAgIGF3YWl0IChjb25maWcuZG9lc0NvbnRhaW5KYXZhU2NyaXB0IHx8XG4gICAgICBjb25maWcuZG9lc0NvbnRhaW5KYXZhU2NyaXB0SW5QYWNrYWdlcyB8fFxuICAgICAgY29uZmlnLmRvZXNDb250YWluVHlwZVNjcmlwdCB8fFxuICAgICAgY29uZmlnLmRvZXNDb250YWluVHlwZVNjcmlwdEluUGFja2FnZXMgfHxcbiAgICAgIChjb25maWcuZG9lc0NvbnRhaW5QYWNrYWdlSnNvbiAmJlxuICAgICAgICAhY29uZmlnLmRvZXNDb250YWluUHVic3BlY1lhbWwgJiZcbiAgICAgICAgIWNvbmZpZy5kb2VzQ29udGFpbkdlbWZpbGUgJiZcbiAgICAgICAgIWNvbmZpZy5kb2VzQ29udGFpbkdvTW9kICYmXG4gICAgICAgICFjb25maWcuZG9lc0NvbnRhaW5Qb21YbWwpXG4gICAgICAgID8gcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzVXRpbC5nZW5lcmF0ZUZpbGUoZmlsZVBhdGgsIGNvbmZpZy5pc0J1biA/IGJpb21lQ29udGVudCA6IHByZXR0aWVyQ29udGVudCkpXG4gICAgICAgIDogcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzLnByb21pc2VzLnJtKGZpbGVQYXRoLCB7IGZvcmNlOiB0cnVlIH0pKSk7XG4gICAgfVxuICB9KTtcbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB5YW1sIGZyb20gJ2pzLXlhbWwnO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcblxuaW1wb3J0IHsgZ2VuZXJhdGVQb3N0TWVyZ2VDb21tYW5kcyB9IGZyb20gJy4vaHVza3lyYy5qcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZVNjcmlwdHMgfSBmcm9tICcuL3BhY2thZ2VKc29uLmpzJztcblxuY29uc3QgbmV3U2V0dGluZ3MgPSB7XG4gICdwb3N0LW1lcmdlJzoge1xuICAgIHNjcmlwdHM6IHtcbiAgICAgICdwcmVwYXJlLnNoJzoge1xuICAgICAgICBydW5uZXI6ICdiYXNoJyxcbiAgICAgIH0sXG4gICAgfSxcbiAgfSxcbiAgJ3ByZS1jb21taXQnOiB7XG4gICAgY29tbWFuZHM6IHtcbiAgICAgIGNsZWFudXA6IHtcbiAgICAgICAgZ2xvYjogJyoue2Nqcyxjc3MsY3RzLGh0bSxodG1sLGpzLGpzb24sanNvbjUsanNvbmMsanN4LG1kLG1qcyxtdHMsc2Nzcyx0cyx0c3gsdnVlLHlhbWwseW1sfScsXG4gICAgICAgIHJ1bjogJ2J1biAtLWJ1biB3YiBsaW50IC0tZml4IC0tZm9ybWF0IHtzdGFnZWRfZmlsZXN9ICYmIGdpdCBhZGQge3N0YWdlZF9maWxlc30nLFxuICAgICAgfSxcbiAgICAgICdjaGVjay1taWdyYXRpb25zJzoge1xuICAgICAgICBnbG9iOiAnKiovbWlncmF0aW9uLnNxbCcsXG4gICAgICAgIHJ1bjogYFxuaWYgZ3JlcCAtcSAnV2FybmluZ3M6JyB7c3RhZ2VkX2ZpbGVzfTsgdGhlblxuICBlY2hvIFwiTWlncmF0aW9uIFNRTCBmaWxlcyAoe3N0YWdlZF9maWxlc30pIGNvbnRhaW4gd2FybmluZ3MhIFBsZWFzZSBzb2x2ZSB0aGUgd2FybmluZ3MgYW5kIGNvbW1pdCBhZ2Fpbi5cIlxuICBleGl0IDFcbmZpXG5gLnRyaW0oKSxcbiAgICAgIH0sXG4gICAgfSxcbiAgfSxcbiAgJ3ByZS1wdXNoJzoge1xuICAgIHNjcmlwdHM6IHtcbiAgICAgICdjaGVjay5zaCc6IHtcbiAgICAgICAgcnVubmVyOiAnYmFzaCcsXG4gICAgICB9LFxuICAgIH0sXG4gIH0sXG59O1xuXG5jb25zdCBzY3JpcHRzID0ge1xuICBwcmVQdXNoOiBgYnVuIC0tYnVuIG5vZGVfbW9kdWxlcy8uYmluL3diIHR5cGVjaGVja2AsXG4gIHByZVB1c2hGb3JMYWI6IGBcbiMhL2Jpbi9iYXNoXG5cbmlmIFsgJChnaXQgYnJhbmNoIC0tc2hvdy1jdXJyZW50KSA9IFwibWFpblwiIF0gJiYgWyAkKGdpdCBjb25maWcgdXNlci5lbWFpbCkgIT0gXCJleGthenV1QGdtYWlsLmNvbVwiIF07IHRoZW5cbiAgZWNobyBcIioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlwiXG4gIGVjaG8gXCIqKiogRG9uJ3QgcHVzaCBtYWluIGJyYW5jaCBkaXJlY3RseS4gVXNlIFBSISAqKipcIlxuICBlY2hvIFwiKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXCJcbiAgZXhpdCAxXG5maVxuXG5idW4gLS1idW4gbm9kZV9tb2R1bGVzLy5iaW4vd2IgdHlwZWNoZWNrXG5gLnRyaW0oKSxcbiAgcG9zdE1lcmdlOiBgXG4jIS9iaW4vYmFzaFxuXG5jaGFuZ2VkX2ZpbGVzPVwiJChnaXQgZGlmZi10cmVlIC1yIC0tbmFtZS1vbmx5IC0tbm8tY29tbWl0LWlkIE9SSUdfSEVBRCBIRUFEKVwiXG5cbnJ1bl9pZl9jaGFuZ2VkKCkge1xuICBpZiBlY2hvIFwiJGNoYW5nZWRfZmlsZXNcIiB8IGdyZXAgLS1xdWlldCAtRSBcIiQxXCI7IHRoZW5cbiAgICBldmFsIFwiJDJcIlxuICBmaVxufVxuYC50cmltKCksXG59O1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVMZWZ0aG9va1VwZGF0aW5nUGFja2FnZUpzb24oY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZ2VuZXJhdGVMZWZ0aG9va1VwZGF0aW5nUGFja2FnZUpzb24nLCBhc3luYyAoKSA9PiB7XG4gICAgYXdhaXQgY29yZShjb25maWcpO1xuICB9KTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gY29yZShjb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgZGlyUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJy5sZWZ0aG9vaycpO1xuICBjb25zdCB7IHR5cGVjaGVjayB9ID0gZ2VuZXJhdGVTY3JpcHRzKGNvbmZpZywge30pO1xuICBjb25zdCBzZXR0aW5nczogUGFydGlhbDx0eXBlb2YgbmV3U2V0dGluZ3M+ID0geyAuLi5uZXdTZXR0aW5ncyB9O1xuICBpZiAoIXR5cGVjaGVjaykge1xuICAgIGRlbGV0ZSBzZXR0aW5nc1sncHJlLXB1c2gnXTtcbiAgfVxuICBhd2FpdCBQcm9taXNlLmFsbChbXG4gICAgZnMucHJvbWlzZXMud3JpdGVGaWxlKFxuICAgICAgcGF0aC5qb2luKGNvbmZpZy5kaXJQYXRoLCAnbGVmdGhvb2sueW1sJyksXG4gICAgICB5YW1sLmR1bXAoc2V0dGluZ3MsIHtcbiAgICAgICAgbGluZVdpZHRoOiAtMSxcbiAgICAgICAgbm9Db21wYXRNb2RlOiB0cnVlLFxuICAgICAgICBzdHlsZXM6IHtcbiAgICAgICAgICAnISFudWxsJzogJ2VtcHR5JyxcbiAgICAgICAgfSxcbiAgICAgIH0pXG4gICAgKSxcbiAgICBmcy5wcm9taXNlcy5ybShkaXJQYXRoLCB7IGZvcmNlOiB0cnVlLCByZWN1cnNpdmU6IHRydWUgfSksXG4gIF0pO1xuXG4gIGlmICh0eXBlY2hlY2spIHtcbiAgICBjb25zdCBwcmVQdXNoID0gY29uZmlnLnJlcG9zaXRvcnk/LnN0YXJ0c1dpdGgoJ2dpdGh1YjpXaWxsQm9vc3RlckxhYi8nKSA/IHNjcmlwdHMucHJlUHVzaEZvckxhYiA6IHNjcmlwdHMucHJlUHVzaDtcbiAgICBmcy5ta2RpclN5bmMocGF0aC5qb2luKGRpclBhdGgsICdwcmUtcHVzaCcpLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT5cbiAgICAgIGZzLnByb21pc2VzLndyaXRlRmlsZShwYXRoLmpvaW4oZGlyUGF0aCwgJ3ByZS1wdXNoJywgJ2NoZWNrLnNoJyksIHByZVB1c2ggKyAnXFxuJywge1xuICAgICAgICBtb2RlOiAwbzc1NSxcbiAgICAgIH0pXG4gICAgKTtcbiAgfVxuICBjb25zdCBwb3N0TWVyZ2VDb21tYW5kID0gYCR7c2NyaXB0cy5wb3N0TWVyZ2V9XFxuXFxuJHtnZW5lcmF0ZVBvc3RNZXJnZUNvbW1hbmRzKGNvbmZpZykuam9pbignXFxuJyl9XFxuYDtcbiAgZnMubWtkaXJTeW5jKHBhdGguam9pbihkaXJQYXRoLCAncG9zdC1tZXJnZScpLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+XG4gICAgZnMucHJvbWlzZXMud3JpdGVGaWxlKHBhdGgucmVzb2x2ZShkaXJQYXRoLCAncG9zdC1tZXJnZScsICdwcmVwYXJlLnNoJyksIHBvc3RNZXJnZUNvbW1hbmQsIHtcbiAgICAgIG1vZGU6IDBvNzU1LFxuICAgIH0pXG4gICk7XG59XG4iLCJpbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcblxuY29uc3Qgc3JjRGlyZWN0b3JpZXMgPSB7XG4gIG5vZGU6IFsnc3JjJywgJ3Rlc3QnLCAnc2NyaXB0cyddLnRvU29ydGVkKCksXG4gIGJsaXR6OiBbJ3NyYycsICd0ZXN0JywgJ3NjcmlwdHMnLCAnZGInLCAnaW50ZWdyYXRpb25zJywgJ21haWxlcnMnXS50b1NvcnRlZCgpLFxufTtcblxuZXhwb3J0IGZ1bmN0aW9uIGdldFNyY0RpcnMoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogc3RyaW5nW10ge1xuICBpZiAoY29uZmlnLmRlcGVuZGluZy5ibGl0eikge1xuICAgIHJldHVybiBzcmNEaXJlY3Rvcmllcy5ibGl0ejtcbiAgfVxuICByZXR1cm4gc3JjRGlyZWN0b3JpZXMubm9kZTtcbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IEVzbGludFV0aWwgfSBmcm9tICcuLi91dGlscy9lc2xpbnRVdGlsLmpzJztcbmltcG9ydCB7IGV4dGVuc2lvbnMgfSBmcm9tICcuLi91dGlscy9leHRlbnNpb25zLmpzJztcbmltcG9ydCB7IGZzVXRpbCB9IGZyb20gJy4uL3V0aWxzL2ZzVXRpbC5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcbmltcG9ydCB7IGdldFNyY0RpcnMgfSBmcm9tICcuLi91dGlscy9zcmNEaXJlY3Rvcmllcy5qcyc7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZW5lcmF0ZUxpbnRzdGFnZWRyYyhjb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdnZW5lcmF0ZUxpbnRzdGFnZWRyYycsIGFzeW5jICgpID0+IHtcbiAgICBhd2FpdCBjb3JlKGNvbmZpZyk7XG4gIH0pO1xufVxuXG5hc3luYyBmdW5jdGlvbiBjb3JlKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBmaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJy5saW50c3RhZ2VkcmMuY2pzJyk7XG4gIGlmIChjb25maWcuaXNCdW4pIHtcbiAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnMucHJvbWlzZXMucm0oZmlsZVBhdGgsIHsgZm9yY2U6IHRydWUgfSkpO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGNvbnN0IHBhY2thZ2VQcmVmaXggPSBjb25maWcuaXNSb290ID8gJ25vZGUgbm9kZV9tb2R1bGVzLy5iaW4vJyA6ICdub2RlIC4uLy4uL25vZGVfbW9kdWxlcy8uYmluLyc7XG4gIGNvbnN0IGxpbmVzOiBzdHJpbmdbXSA9IFtdO1xuICBpZiAoY29uZmlnLmRvZXNDb250YWluSmF2YVNjcmlwdCB8fCBjb25maWcuZG9lc0NvbnRhaW5UeXBlU2NyaXB0KSB7XG4gICAgY29uc3QgZXNsaW50ID0gYFxuICAnJHtnZXRFc2xpbnRLZXkoY29uZmlnKX0nOiBbJHtKU09OLnN0cmluZ2lmeShcbiAgICBgJHtwYWNrYWdlUHJlZml4fWVzbGludCAtLWZpeCR7RXNsaW50VXRpbC5nZXRMaW50Rml4U3VmZml4KGNvbmZpZyl9YFxuICApfSwgJyR7cGFja2FnZVByZWZpeH1wcmV0dGllciAtLWNhY2hlIC0td3JpdGUnXSxgO1xuICAgIGxpbmVzLnB1c2goZXNsaW50KTtcbiAgfVxuICBjb25zdCBwYWNrYWdlc0ZpbHRlciA9IGNvbmZpZy5pc1Jvb3QgPyBcIiAmJiAhZmlsZS5pbmNsdWRlcygnL3BhY2thZ2VzLycpXCIgOiAnJztcbiAgbGluZXMucHVzaChgXG4gICcuLyoqLyoueyR7ZXh0ZW5zaW9ucy5wcmV0dGllci5qb2luKCcsJyl9fSc6IGZpbGVzID0+IHtcbiAgICBsZXQgZmlsdGVyZWRGaWxlcyA9IGZpbGVzLmZpbHRlcihmaWxlID0+ICFmaWxlLmluY2x1ZGVzKCcvdGVzdC1maXh0dXJlcy8nKSAmJiAhZmlsZS5pbmNsdWRlcygnL3Rlc3QvZml4dHVyZXMvJykke3BhY2thZ2VzRmlsdGVyfSk7JHtnZXRFc2xpbnRGaWx0ZXJGb3JQcmV0dGllcihjb25maWcpfVxuICAgIGlmIChmaWx0ZXJlZEZpbGVzLmxlbmd0aCA9PT0gMCkgcmV0dXJuIFtdO1xuICAgIGNvbnN0IGNvbW1hbmRzID0gW1xcYCR7cGFja2FnZVByZWZpeH1wcmV0dGllciAtLWNhY2hlIC0td3JpdGUgXFwke2ZpbHRlcmVkRmlsZXMuam9pbignICcpfVxcYF07XG4gICAgaWYgKGZpbHRlcmVkRmlsZXMuc29tZShmaWxlID0+IGZpbGUuZW5kc1dpdGgoJ3BhY2thZ2UuanNvbicpKSkge1xuICAgICAgY29tbWFuZHMucHVzaCgnJHtwYWNrYWdlUHJlZml4fXNvcnQtcGFja2FnZS1qc29uJyk7XG4gICAgfVxuICAgIHJldHVybiBjb21tYW5kcztcbiAgfSxcbiAgJy4vKiovbWlncmF0aW9uLnNxbCc6IChmaWxlcykgPT4ge1xuICBmb3IgKGNvbnN0IGZpbGUgb2YgZmlsZXMpIHtcbiAgICBjb25zdCBjb250ZW50ID0gZnMucmVhZEZpbGVTeW5jKGZpbGUsICd1dGYtOCcpO1xuICAgIGlmIChjb250ZW50LmluY2x1ZGVzKCdXYXJuaW5nczonKSkge1xuICAgICAgcmV0dXJuIFtcbiAgICAgICAgXFxgZWNobyAnISEhIE1pZ3JhdGlvbiBTUUwgZmlsZSAoXFwke3BhdGgucmVsYXRpdmUoJycsIGZpbGUpfSkgY29udGFpbnMgd2FybmluZ3MgISEhIFNvbHZlIHRoZSB3YXJuaW5ncyBhbmQgY29tbWl0IGFnYWluLidcXGAsXG4gICAgICAgICdmYWxzZScsXG4gICAgICBdO1xuICAgIH1cbiAgfVxuICByZXR1cm4gW107XG59LGApO1xuICBpZiAoY29uZmlnLmRvZXNDb250YWluUHVic3BlY1lhbWwpIHtcbiAgICBsaW5lcy5wdXNoKGBcbiAgJy4ve2xpYix0ZXN0LHRlc3RfZHJpdmVyfS8qKi8qLmRhcnQnOiBmaWxlcyA9PiB7XG4gICAgY29uc3QgZmlsdGVyZWRGaWxlcyA9IGZpbGVzLmZpbHRlcihmaWxlID0+ICFmaWxlLmluY2x1ZGVzKCdnZW5lcmF0ZWQnKSlcbiAgICAgIC5maWx0ZXIoZmlsZSA9PiAhZmlsZS5lbmRzV2l0aCgnLmZyZWV6ZWQuZGFydCcpICYmICFmaWxlLmVuZHNXaXRoKCcuZy5kYXJ0JykpO1xuICAgIGlmIChmaWx0ZXJlZEZpbGVzLmxlbmd0aCA9PT0gMCkgcmV0dXJuIFtdO1xuICAgIHJldHVybiBbXFxgZGFydCBmb3JtYXQgXFwke2ZpbHRlcmVkRmlsZXMuam9pbignICcpfVxcYF07XG4gIH0sYCk7XG4gIH1cbiAgaWYgKGNvbmZpZy5kb2VzQ29udGFpblBvZXRyeUxvY2spIHtcbiAgICBsaW5lcy5wdXNoKGBcbiAgJy4vKiovKi5weSc6IFtcbiAgICAncG9ldHJ5IHJ1biBpc29ydCAtLXByb2ZpbGUgYmxhY2sgLS1maWx0ZXItZmlsZXMnLFxuICAgICdwb2V0cnkgcnVuIGJsYWNrJyxcbiAgICAncG9ldHJ5IHJ1biBmbGFrZTgnXG4gIF0sYCk7XG4gIH1cblxuICBjb25zdCBuZXdDb250ZW50ID0gYGNvbnN0IGZzID0gcmVxdWlyZSgnZnMnKTtcbmNvbnN0IHBhdGggPSByZXF1aXJlKCdwYXRoJyk7XG4ke2NvbmZpZy5kb2VzQ29udGFpbkphdmFTY3JpcHQgfHwgY29uZmlnLmRvZXNDb250YWluVHlwZVNjcmlwdCA/IFwiY29uc3QgbWljcm9tYXRjaCA9IHJlcXVpcmUoJ21pY3JvbWF0Y2gnKTtcXG5cIiA6ICcnfVxubW9kdWxlLmV4cG9ydHMgPSB7JHtsaW5lcy5qb2luKCcnKX1cbn07XG5gO1xuXG4gIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiBmcy5wcm9taXNlcy5ybShwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICcubGludHN0YWdlZHJjLmpzJyksIHsgZm9yY2U6IHRydWUgfSkpO1xuICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnMucHJvbWlzZXMucm0ocGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnLmxpbnRzdGFnZWRyYy5qc29uJyksIHsgZm9yY2U6IHRydWUgfSkpO1xuICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnNVdGlsLmdlbmVyYXRlRmlsZShmaWxlUGF0aCwgbmV3Q29udGVudCkpO1xufVxuXG5mdW5jdGlvbiBnZXRFc2xpbnRLZXkoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogc3RyaW5nIHtcbiAgY29uc3QgZGlycyA9IGdldFNyY0RpcnMoY29uZmlnKS5tYXAoKGRpcikgPT4gYCR7ZGlyfS8qKi9gKTtcbiAgcmV0dXJuIGB7LCR7ZGlycy5qb2luKCcsJyl9fSoueyR7ZXh0ZW5zaW9ucy5lc2xpbnQuam9pbignLCcpfX1gO1xufVxuXG5mdW5jdGlvbiBnZXRFc2xpbnRGaWx0ZXJGb3JQcmV0dGllcihjb25maWc6IFBhY2thZ2VDb25maWcpOiBzdHJpbmcge1xuICByZXR1cm4gY29uZmlnLmRvZXNDb250YWluSmF2YVNjcmlwdCB8fCBjb25maWcuZG9lc0NvbnRhaW5UeXBlU2NyaXB0XG4gICAgPyBgXFxuXG4gICAgZmlsdGVyZWRGaWxlcyA9IGZpbHRlcmVkRmlsZXMubWFwKChmaWxlKSA9PiBwYXRoLnJlbGF0aXZlKCcnLCBmaWxlKSk7XG4gICAgZmlsdGVyZWRGaWxlcyA9IG1pY3JvbWF0Y2gubm90KGZpbHRlcmVkRmlsZXMsICcke2dldEVzbGludEtleShjb25maWcpfScpO1xuICAgIGZpbHRlcmVkRmlsZXMgPSBmaWx0ZXJlZEZpbGVzLm1hcCgoZmlsZSkgPT4gcGF0aC5yZXNvbHZlKGZpbGUpKTtgXG4gICAgOiAnJztcbn1cbiIsImltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGZzVXRpbCB9IGZyb20gJy4uL3V0aWxzL2ZzVXRpbC5qcyc7XG5pbXBvcnQgeyBpZ25vcmVGaWxlVXRpbCB9IGZyb20gJy4uL3V0aWxzL2lnbm9yZUZpbGVVdGlsLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuXG5jb25zdCBjb21tb25Db250ZW50ID0gYFxuM3JkLXBhcnR5L1xuYW5kcm9pZC9cbmlvcy9cbm5vLWZvcm1hdC9cbnRlc3QtZml4dHVyZXMvXG50ZXN0L2ZpeHR1cmVzL1xuKi5kLnRzXG4qLm1pbi5qc1xuLnlhcm4vXG4ucG5wLmpzXG5gO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVQcmV0dGllcmlnbm9yZShjb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdnZW5lcmF0ZVByZXR0aWVyaWdub3JlJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnLnByZXR0aWVyaWdub3JlJyk7XG4gICAgY29uc3QgY29udGVudCA9IChhd2FpdCBmc1V0aWwucmVhZEZpbGVJZ25vcmluZ0Vycm9yKGZpbGVQYXRoKSkgPz8gJyc7XG4gICAgY29uc3QgaGVhZFVzZXJDb250ZW50ID0gaWdub3JlRmlsZVV0aWwuZ2V0SGVhZFVzZXJDb250ZW50KGNvbnRlbnQpO1xuICAgIGNvbnN0IHRhaWxVc2VyQ29udGVudCA9IGlnbm9yZUZpbGVVdGlsLmdldFRhaWxVc2VyQ29udGVudChjb250ZW50KTtcblxuICAgIGNvbnN0IGdpdGlnbm9yZUZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnLmdpdGlnbm9yZScpO1xuICAgIGNvbnN0IGdpdGlnbm9yZUNvbnRlbnQgPSAoYXdhaXQgaWdub3JlRmlsZVV0aWwucmVhZEdpdGlnbm9yZVdpdGhvdXRTZXBhcmF0b3JzKGdpdGlnbm9yZUZpbGVQYXRoKSkgfHwgJyc7XG5cbiAgICBsZXQgYWRkaXRpb25hbENvbnRlbnQgPSAnJztcbiAgICBpZiAoY29uZmlnLmRvZXNDb250YWluUHVic3BlY1lhbWwpIHtcbiAgICAgIGFkZGl0aW9uYWxDb250ZW50ID0gYFxuYW5kcm9pZC9hcHAvXG5pb3MvUnVubmVyL0Fzc2V0cy54Y2Fzc2V0cy9cbnB1YnNwZWMueWFtbFxuYDtcbiAgICB9XG5cbiAgICBjb25zdCBuZXdDb250ZW50ID0gaGVhZFVzZXJDb250ZW50ICsgY29tbW9uQ29udGVudCArIGFkZGl0aW9uYWxDb250ZW50ICsgZ2l0aWdub3JlQ29udGVudCArIHRhaWxVc2VyQ29udGVudDtcbiAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnNVdGlsLmdlbmVyYXRlRmlsZShmaWxlUGF0aCwgbmV3Q29udGVudCkpO1xuICB9KTtcbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCBtZXJnZSBmcm9tICdkZWVwbWVyZ2UnO1xuaW1wb3J0IGNsb25lRGVlcCBmcm9tICdsb2Rhc2guY2xvbmVkZWVwJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZnNVdGlsIH0gZnJvbSAnLi4vdXRpbHMvZnNVdGlsLmpzJztcbmltcG9ydCB7IG92ZXJ3cml0ZU1lcmdlIH0gZnJvbSAnLi4vdXRpbHMvbWVyZ2VVdGlsLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuXG5jb25zdCBqc29uT2JqID0ge1xuICB2ZW52UGF0aDogJy4nLFxuICB2ZW52OiAnLnZlbnYnLFxufTtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlUHlyaWdodENvbmZpZ0pzb24oY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZ2VuZXJhdGVQeXJpZ2h0Q29uZmlnSnNvbicsIGFzeW5jICgpID0+IHtcbiAgICBsZXQgbmV3U2V0dGluZ3M6IG9iamVjdCA9IGNsb25lRGVlcChqc29uT2JqKTtcbiAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJ3B5cmlnaHRjb25maWcuanNvbicpO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBvbGRDb250ZW50ID0gYXdhaXQgZnMucHJvbWlzZXMucmVhZEZpbGUoZmlsZVBhdGgsICd1dGY4Jyk7XG4gICAgICBjb25zdCBvbGRTZXR0aW5ncyA9IEpTT04ucGFyc2Uob2xkQ29udGVudCkgYXMgb2JqZWN0O1xuICAgICAgbmV3U2V0dGluZ3MgPSBtZXJnZS5hbGwoW25ld1NldHRpbmdzLCBvbGRTZXR0aW5ncywgbmV3U2V0dGluZ3NdLCB7IGFycmF5TWVyZ2U6IG92ZXJ3cml0ZU1lcmdlIH0pO1xuICAgIH0gY2F0Y2gge1xuICAgICAgLy8gZG8gbm90aGluZ1xuICAgIH1cbiAgICBjb25zdCBuZXdDb250ZW50ID0gSlNPTi5zdHJpbmdpZnkobmV3U2V0dGluZ3MpO1xuICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiBmc1V0aWwuZ2VuZXJhdGVGaWxlKGZpbGVQYXRoLCBuZXdDb250ZW50KSk7XG4gIH0pO1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZnNVdGlsIH0gZnJvbSAnLi4vdXRpbHMvZnNVdGlsLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuXG5jb25zdCBzZW1hbnRpY1JlbGVhc2VCYWRnZSA9XG4gICdbIVtzZW1hbnRpYy1yZWxlYXNlXShodHRwczovL2ltZy5zaGllbGRzLmlvL2JhZGdlLyUyMCUyMCVGMCU5RiU5MyVBNiVGMCU5RiU5QSU4MC1zZW1hbnRpYy0tcmVsZWFzZS1lMTAwNzkuc3ZnKV0oaHR0cHM6Ly9naXRodWIuY29tL3NlbWFudGljLXJlbGVhc2Uvc2VtYW50aWMtcmVsZWFzZSknO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVSZWFkbWUoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZ2VuZXJhdGVSZWFkbWUnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICdSRUFETUUubWQnKTtcbiAgICBsZXQgbmV3Q29udGVudCA9IGF3YWl0IGZzLnByb21pc2VzLnJlYWRGaWxlKGZpbGVQYXRoLCAndXRmOCcpO1xuXG4gICAgaWYgKGZzLmV4aXN0c1N5bmMocGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnLnJlbGVhc2VyYy5qc29uJykpKSB7XG4gICAgICBuZXdDb250ZW50ID0gaW5zZXJ0QmFkZ2UobmV3Q29udGVudCwgc2VtYW50aWNSZWxlYXNlQmFkZ2UpO1xuICAgIH1cblxuICAgIGNvbnN0IHJlcG9zaXRvcnkgPSBjb25maWcucmVwb3NpdG9yeT8uc2xpY2UoY29uZmlnLnJlcG9zaXRvcnkuaW5kZXhPZignOicpICsgMSk7XG4gICAgY29uc3QgZmlsZU5hbWVzID0gZnMucmVhZGRpclN5bmMoYCR7Y29uZmlnLmRpclBhdGh9Ly5naXRodWIvd29ya2Zsb3dzYCk7XG4gICAgZm9yIChjb25zdCBmaWxlTmFtZSBvZiBmaWxlTmFtZXMpIHtcbiAgICAgIGlmICghZmlsZU5hbWUuc3RhcnRzV2l0aCgndGVzdCcpICYmICFmaWxlTmFtZS5zdGFydHNXaXRoKCdkZXBsb3knKSkgY29udGludWU7XG5cbiAgICAgIGxldCBiYWRnZU5hbWUgPSBmaWxlTmFtZTtcbiAgICAgIGJhZGdlTmFtZSA9IChiYWRnZU5hbWVbMF0gfHwgJycpLnRvVXBwZXJDYXNlKCkgKyBiYWRnZU5hbWUuc2xpY2UoMSwgYmFkZ2VOYW1lLmluZGV4T2YoJy4nKSk7XG4gICAgICBiYWRnZU5hbWUgPSBiYWRnZU5hbWUucmVwbGFjZSgnLScsICcgJyk7XG4gICAgICBjb25zdCBiYWRnZSA9IGBbIVske2JhZGdlTmFtZX1dKGh0dHBzOi8vZ2l0aHViLmNvbS8ke3JlcG9zaXRvcnl9L2FjdGlvbnMvd29ya2Zsb3dzLyR7ZmlsZU5hbWV9L2JhZGdlLnN2ZyldKGh0dHBzOi8vZ2l0aHViLmNvbS8ke3JlcG9zaXRvcnl9L2FjdGlvbnMvd29ya2Zsb3dzLyR7ZmlsZU5hbWV9KWA7XG4gICAgICBpZiAoZnMuZXhpc3RzU3luYyhwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsIGAuZ2l0aHViL3dvcmtmbG93cy8ke2ZpbGVOYW1lfWApKSkge1xuICAgICAgICBuZXdDb250ZW50ID0gaW5zZXJ0QmFkZ2UobmV3Q29udGVudCwgYmFkZ2UpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiBmc1V0aWwuZ2VuZXJhdGVGaWxlKGZpbGVQYXRoLCBuZXdDb250ZW50KSk7XG4gIH0pO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaW5zZXJ0QmFkZ2UocmVhZG1lOiBzdHJpbmcsIGJhZGdlOiBzdHJpbmcpOiBzdHJpbmcge1xuICAvLyDml6LjgatiYWRnZeOBjOOBguOCi+WgtOWQiOOBr+WJiumZpFxuICByZWFkbWUgPSByZWFkbWUucmVwbGFjZShiYWRnZSwgJycpLnJlcGxhY2VBbGwoL1xcblxcblxcbisvZywgJ1xcblxcbicpO1xuXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgcmVhZG1lLmxlbmd0aDsgaSsrKSB7XG4gICAgaWYgKHJlYWRtZVtpIC0gMV0gPT09ICdcXG4nICYmIHJlYWRtZVtpXSA9PT0gJ1xcbicpIHtcbiAgICAgIGNvbnN0IGJlZm9yZSA9IHJlYWRtZS5zbGljZSgwLCBpICsgMSk7XG4gICAgICBsZXQgYWZ0ZXIgPSByZWFkbWUuc2xpY2UoaSArIDEpO1xuICAgICAgaWYgKCFhZnRlci5zdGFydHNXaXRoKCdbJykgJiYgIWFmdGVyLnN0YXJ0c1dpdGgoJyEnKSkge1xuICAgICAgICBhZnRlciA9IGBcXG4ke2FmdGVyfWA7XG4gICAgICB9XG4gICAgICByZXR1cm4gYCR7YmVmb3JlfSR7YmFkZ2V9XFxuJHthZnRlcn1gO1xuICAgIH1cbiAgfVxuICByZXR1cm4gYCR7cmVhZG1lfVxcbiR7YmFkZ2V9XFxuYDtcbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCBtZXJnZSBmcm9tICdkZWVwbWVyZ2UnO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBmc1V0aWwgfSBmcm9tICcuLi91dGlscy9mc1V0aWwuanMnO1xuaW1wb3J0IHsgb3ZlcndyaXRlTWVyZ2UgfSBmcm9tICcuLi91dGlscy9tZXJnZVV0aWwuanMnO1xuaW1wb3J0IHsgcHJvbWlzZVBvb2wgfSBmcm9tICcuLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZW5lcmF0ZVJlbGVhc2VyYyhyb290Q29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZ2VuZXJhdGVSZWxlYXNlcmMnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLnJlc29sdmUocm9vdENvbmZpZy5kaXJQYXRoLCAnLnJlbGVhc2VyYy5qc29uJyk7XG4gICAgaWYgKCFmcy5leGlzdHNTeW5jKGZpbGVQYXRoKSkgcmV0dXJuO1xuXG4gICAgY29uc3Qgc2V0dGluZ3MgPSBKU09OLnBhcnNlKGF3YWl0IGZzLnByb21pc2VzLnJlYWRGaWxlKGZpbGVQYXRoLCAndXRmOCcpKSBhcyB7XG4gICAgICBwbHVnaW5zPzogKHN0cmluZyB8IFtzdHJpbmcsIHVua25vd25dKVtdO1xuICAgIH07XG4gICAgY29uc3QgcGx1Z2lucyA9IHNldHRpbmdzLnBsdWdpbnMgPz8gW107XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwbHVnaW5zLmxlbmd0aDsgaSsrKSB7XG4gICAgICBjb25zdCBwbHVnaW4gPSBBcnJheS5pc0FycmF5KHBsdWdpbnNbaV0pID8gcGx1Z2luc1tpXT8uWzBdIDogcGx1Z2luc1tpXTtcbiAgICAgIGNvbnN0IG9sZENvbmZpZyA9IChBcnJheS5pc0FycmF5KHBsdWdpbnNbaV0pICYmIHBsdWdpbnNbaV0/LlsxXSkgfHwge307XG4gICAgICBpZiAocGx1Z2luID09PSAnQHNlbWFudGljLXJlbGVhc2UvY29tbWl0LWFuYWx5emVyJykge1xuICAgICAgICBwbHVnaW5zW2ldID0gW1xuICAgICAgICAgICdAc2VtYW50aWMtcmVsZWFzZS9jb21taXQtYW5hbHl6ZXInLFxuICAgICAgICAgIG1lcmdlLmFsbChcbiAgICAgICAgICAgIFtcbiAgICAgICAgICAgICAgb2xkQ29uZmlnLFxuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgcHJlc2V0OiAnY29udmVudGlvbmFsY29tbWl0cycsXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgeyBhcnJheU1lcmdlOiBvdmVyd3JpdGVNZXJnZSB9XG4gICAgICAgICAgKSxcbiAgICAgICAgXTtcbiAgICAgIH0gZWxzZSBpZiAocGx1Z2luID09PSAnQHNlbWFudGljLXJlbGVhc2UvZ2l0aHViJykge1xuICAgICAgICAvLyBSZW1vdmUgZGVwcmVjYXRlZCBzdWNjZXNzQ29tbWVudCBhbmQgZmFpbENvbW1lbnQgcHJvcGVydGllcyBmcm9tIG9sZENvbmZpZ1xuICAgICAgICBjb25zdCB7IGZhaWxDb21tZW50OiBfMSwgc3VjY2Vzc0NvbW1lbnQ6IF8yLCAuLi5jbGVhbk9sZENvbmZpZyB9ID0gb2xkQ29uZmlnIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICAgICAgICBwbHVnaW5zW2ldID0gW1xuICAgICAgICAgICdAc2VtYW50aWMtcmVsZWFzZS9naXRodWInLFxuICAgICAgICAgIG1lcmdlLmFsbChcbiAgICAgICAgICAgIFtcbiAgICAgICAgICAgICAgY2xlYW5PbGRDb25maWcsXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAvLyBjZi4gaHR0cHM6Ly9naXRodWIuY29tL3NlbWFudGljLXJlbGVhc2Uvc2VtYW50aWMtcmVsZWFzZS9pc3N1ZXMvMjIwNCNpc3N1ZWNvbW1lbnQtMTUwODQxNzcwNFxuICAgICAgICAgICAgICAgIHN1Y2Nlc3NDb21tZW50Q29uZGl0aW9uOiBmYWxzZSxcbiAgICAgICAgICAgICAgICBmYWlsQ29tbWVudENvbmRpdGlvbjogZmFsc2UsXG4gICAgICAgICAgICAgICAgbGFiZWxzOiBbJ3I6IHNlbWFudGljLXJlbGVhc2UnXSxcbiAgICAgICAgICAgICAgICByZWxlYXNlZExhYmVsczogWydyZWxlYXNlZCA6Ym9va21hcms6J10sXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgeyBhcnJheU1lcmdlOiBvdmVyd3JpdGVNZXJnZSB9XG4gICAgICAgICAgKSxcbiAgICAgICAgXTtcbiAgICAgIH1cbiAgICB9XG4gICAgY29uc3QgbmV3Q29udGVudCA9IEpTT04uc3RyaW5naWZ5KHNldHRpbmdzKTtcbiAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnNVdGlsLmdlbmVyYXRlRmlsZShmaWxlUGF0aCwgbmV3Q29udGVudCkpO1xuICB9KTtcbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCBtZXJnZSBmcm9tICdkZWVwbWVyZ2UnO1xuaW1wb3J0IGNsb25lRGVlcCBmcm9tICdsb2Rhc2guY2xvbmVkZWVwJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZnNVdGlsIH0gZnJvbSAnLi4vdXRpbHMvZnNVdGlsLmpzJztcbmltcG9ydCB7IG92ZXJ3cml0ZU1lcmdlIH0gZnJvbSAnLi4vdXRpbHMvbWVyZ2VVdGlsLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuXG5jb25zdCBqc29uT2JqID0ge1xuICAkc2NoZW1hOiAnaHR0cHM6Ly9kb2NzLnJlbm92YXRlYm90LmNvbS9yZW5vdmF0ZS1zY2hlbWEuanNvbicsXG4gIGV4dGVuZHM6IFsnZ2l0aHViPldpbGxCb29zdGVyL3dpbGxib29zdGVyLWNvbmZpZ3M6cmVub3ZhdGUuanNvbjUnXSxcbn07XG5cbnR5cGUgU2V0dGluZ3MgPSB0eXBlb2YganNvbk9iaiAmIHsgcGFja2FnZVJ1bGVzPzogeyBtYXRjaFBhY2thZ2VOYW1lczogc3RyaW5nW107IGVuYWJsZWQ/OiBib29sZWFuIH1bXSB9O1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVSZW5vdmF0ZUpzb24oY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZ2VuZXJhdGVSZW5vdmF0ZUpzb24nLCBhc3luYyAoKSA9PiB7XG4gICAgbGV0IG5ld1NldHRpbmdzID0gY2xvbmVEZWVwKGpzb25PYmopIGFzIFNldHRpbmdzO1xuICAgIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAncmVub3ZhdGUuanNvbicpO1xuICAgIGlmIChmcy5leGlzdHNTeW5jKGAke2ZpbGVQYXRofTVgKSkge1xuICAgICAgLy8gU2luY2UgaXQgaXMgZGlmZmljdWx0IGZvciBwYXJzaW5nIHJlbm92YXRlLmpzb241LCB3ZSBkbyBub3RoaW5nXG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRyeSB7XG4gICAgICBjb25zdCBvbGRDb250ZW50ID0gYXdhaXQgZnMucHJvbWlzZXMucmVhZEZpbGUoZmlsZVBhdGgsICd1dGY4Jyk7XG4gICAgICBjb25zdCBvbGRTZXR0aW5ncyA9IEpTT04ucGFyc2Uob2xkQ29udGVudCkgYXMgU2V0dGluZ3M7XG4gICAgICBuZXdTZXR0aW5ncyA9IG1lcmdlLmFsbChbbmV3U2V0dGluZ3MsIG9sZFNldHRpbmdzLCBuZXdTZXR0aW5nc10sIHtcbiAgICAgICAgYXJyYXlNZXJnZTogb3ZlcndyaXRlTWVyZ2UsXG4gICAgICB9KSBhcyBTZXR0aW5ncztcbiAgICAgIG5ld1NldHRpbmdzLmV4dGVuZHMgPSBuZXdTZXR0aW5ncy5leHRlbmRzLmZpbHRlcigoaXRlbTogc3RyaW5nKSA9PiBpdGVtICE9PSAnQHdpbGxib29zdGVyJyk7XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBkbyBub3RoaW5nXG4gICAgfVxuXG4gICAgLy8gRG9uJ3QgdXBncmFkZSBOZXh0LmpzIGF1dG9tYXRpY2FsbHlcbiAgICBpZiAoY29uZmlnLmRlcGVuZGluZy5ibGl0eikge1xuICAgICAgbmV3U2V0dGluZ3MucGFja2FnZVJ1bGVzID8/PSBbXTtcbiAgICAgIGlmIChcbiAgICAgICAgIW5ld1NldHRpbmdzLnBhY2thZ2VSdWxlcy5zb21lKChydWxlOiB7IG1hdGNoUGFja2FnZU5hbWVzPzogc3RyaW5nW10gfSkgPT5cbiAgICAgICAgICBydWxlLm1hdGNoUGFja2FnZU5hbWVzPy5pbmNsdWRlcygnbmV4dCcpXG4gICAgICAgIClcbiAgICAgICkge1xuICAgICAgICBuZXdTZXR0aW5ncy5wYWNrYWdlUnVsZXMucHVzaCh7IG1hdGNoUGFja2FnZU5hbWVzOiBbJ25leHQnXSwgZW5hYmxlZDogZmFsc2UgfSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzLnByb21pc2VzLnJtKHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJy5kZXBlbmRhYm90JyksIHsgZm9yY2U6IHRydWUgfSkpO1xuICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiBmcy5wcm9taXNlcy5ybShwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICcucmVub3ZhdGVyYy5qc29uJyksIHsgZm9yY2U6IHRydWUgfSkpO1xuICAgIGNvbnN0IG5ld0NvbnRlbnQgPSBKU09OLnN0cmluZ2lmeShuZXdTZXR0aW5ncyk7XG4gICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzVXRpbC5nZW5lcmF0ZUZpbGUoZmlsZVBhdGgsIG5ld0NvbnRlbnQpKTtcbiAgfSk7XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgbWVyZ2UgZnJvbSAnZGVlcG1lcmdlJztcbmltcG9ydCBjbG9uZURlZXAgZnJvbSAnbG9kYXNoLmNsb25lZGVlcCc7XG5pbXBvcnQgdHlwZSB7IFRzQ29uZmlnSnNvbiB9IGZyb20gJ3R5cGUtZmVzdCc7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGZzVXRpbCB9IGZyb20gJy4uL3V0aWxzL2ZzVXRpbC5qcyc7XG5pbXBvcnQgeyBjb21iaW5lTWVyZ2UgfSBmcm9tICcuLi91dGlscy9tZXJnZVV0aWwuanMnO1xuaW1wb3J0IHsgc29ydEtleXMgfSBmcm9tICcuLi91dGlscy9vYmplY3RVdGlsLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuXG5jb25zdCByb290SnNvbk9iaiA9IHtcbiAgY29tcGlsZXJPcHRpb25zOiB7XG4gICAgdGFyZ2V0OiAnRVMyMDIyJywgLy8gYmVjYXVzZSBkZWNvcmF0b3JzIHNob3VsZCBiZSB0cmFuc3BpbGVkIHRvIEVTMjAyMiBvbiBOb2RlLmpzXG4gICAgbW9kdWxlOiAnRVNOZXh0JyxcbiAgICBtb2R1bGVSZXNvbHV0aW9uOiAnTm9kZScsXG4gICAganN4OiAncmVhY3QtanN4JyxcbiAgICBhbHdheXNTdHJpY3Q6IHRydWUsXG4gICAgc3RyaWN0OiB0cnVlLFxuICAgIG5vVW5jaGVja2VkSW5kZXhlZEFjY2VzczogdHJ1ZSwgLy8gZm9yIEB0eXBlc2NyaXB0LWVzbGludC9wcmVmZXItbnVsbGlzaC1jb2FsZXNjaW5nXG4gICAgc2tpcExpYkNoZWNrOiB0cnVlLCAvLyBiZWNhdXNlIGxpYnJhcmllcyBtYXkgaGF2ZSBicm9rZW4gdHlwZXNcbiAgICBhbGxvd1N5bnRoZXRpY0RlZmF1bHRJbXBvcnRzOiB0cnVlLCAvLyBhbGxvdyBgaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0J2BcbiAgICBlc01vZHVsZUludGVyb3A6IHRydWUsIC8vIGFsbG93IGRlZmF1bHQgaW1wb3J0IGZyb20gQ29tbW9uSlMvQU1EL1VNRCBtb2R1bGVzXG4gICAgcmVzb2x2ZUpzb25Nb2R1bGU6IHRydWUsIC8vIGFsbG93IHRvIGltcG9ydCBKU09OIGZpbGVzXG4gICAgZGVjbGFyYXRpb246IHRydWUsXG4gICAgc291cmNlTWFwOiB0cnVlLFxuICAgIGltcG9ydEhlbHBlcnM6IGZhbHNlLFxuICAgIGVyYXNhYmxlU3ludGF4T25seTogdHJ1ZSxcbiAgICBvdXREaXI6ICdkaXN0JyxcbiAgICB0eXBlUm9vdHM6IFsnLi9ub2RlX21vZHVsZXMvQHR5cGVzJywgJy4vQHR5cGVzJ10sXG4gIH0sXG4gIGV4Y2x1ZGU6IFsncGFja2FnZXMvKi90ZXN0L2ZpeHR1cmVzJywgJ3Rlc3QvZml4dHVyZXMnXSxcbiAgaW5jbHVkZTogW1xuICAgICdwYWNrYWdlcy8qL3NjcmlwdHMvKiovKicsXG4gICAgJ3BhY2thZ2VzLyovc3JjLyoqLyonLFxuICAgICdwYWNrYWdlcy8qL3Rlc3QvKiovKicsXG4gICAgJ3NjcmlwdHMvKiovKicsXG4gICAgJ3NyYy8qKi8qJyxcbiAgICAndGVzdC8qKi8qJyxcbiAgXSxcbn07XG5cbmNvbnN0IHN1Ykpzb25PYmogPSB7XG4gIGNvbXBpbGVyT3B0aW9uczoge1xuICAgIHRhcmdldDogJ0VTMjAyMicsIC8vIGJlY2F1c2UgZGVjb3JhdG9ycyBzaG91bGQgYmUgdHJhbnNwaWxlZCB0byBFUzIwMjIgb24gTm9kZS5qc1xuICAgIG1vZHVsZTogJ0VTTmV4dCcsXG4gICAgbW9kdWxlUmVzb2x1dGlvbjogJ05vZGUnLFxuICAgIGpzeDogJ3JlYWN0LWpzeCcsXG4gICAgYWx3YXlzU3RyaWN0OiB0cnVlLFxuICAgIHN0cmljdDogdHJ1ZSxcbiAgICBub1VuY2hlY2tlZEluZGV4ZWRBY2Nlc3M6IHRydWUsIC8vIGZvciBAdHlwZXNjcmlwdC1lc2xpbnQvcHJlZmVyLW51bGxpc2gtY29hbGVzY2luZ1xuICAgIHNraXBMaWJDaGVjazogdHJ1ZSwgLy8gYmVjYXVzZSBsaWJyYXJpZXMgbWF5IGhhdmUgYnJva2VuIHR5cGVzXG4gICAgYWxsb3dTeW50aGV0aWNEZWZhdWx0SW1wb3J0czogdHJ1ZSwgLy8gYWxsb3cgYGltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCdgXG4gICAgZXNNb2R1bGVJbnRlcm9wOiB0cnVlLCAvLyBhbGxvdyBkZWZhdWx0IGltcG9ydCBmcm9tIENvbW1vbkpTL0FNRC9VTUQgbW9kdWxlc1xuICAgIHJlc29sdmVKc29uTW9kdWxlOiB0cnVlLCAvLyBhbGxvdyB0byBpbXBvcnQgSlNPTiBmaWxlc1xuICAgIGRlY2xhcmF0aW9uOiB0cnVlLFxuICAgIHNvdXJjZU1hcDogdHJ1ZSxcbiAgICBpbXBvcnRIZWxwZXJzOiBmYWxzZSxcbiAgICBlcmFzYWJsZVN5bnRheE9ubHk6IHRydWUsXG4gICAgb3V0RGlyOiAnZGlzdCcsXG4gICAgdHlwZVJvb3RzOiBbJy4uLy4uL25vZGVfbW9kdWxlcy9AdHlwZXMnLCAnLi4vLi4vQHR5cGVzJywgJy4vQHR5cGVzJ10sXG4gIH0sXG4gIGV4Y2x1ZGU6IFsndGVzdC9maXh0dXJlcyddLFxuICBpbmNsdWRlOiBbJ3NjcmlwdHMvKiovKicsICdzcmMvKiovKicsICd0ZXN0LyoqLyonXSxcbn07XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZW5lcmF0ZVRzY29uZmlnKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2dlbmVyYXRlVHNjb25maWcnLCBhc3luYyAoKSA9PiB7XG4gICAgaWYgKGNvbmZpZy5kZXBlbmRpbmcuYmxpdHogfHwgY29uZmlnLmRlcGVuZGluZy5uZXh0KSByZXR1cm47XG5cbiAgICBsZXQgbmV3U2V0dGluZ3MgPSBjbG9uZURlZXAoY29uZmlnLmlzUm9vdCA/IHJvb3RKc29uT2JqIDogc3ViSnNvbk9iaikgYXMgVHNDb25maWdKc29uO1xuICAgIGlmICghY29uZmlnLmRvZXNDb250YWluSnN4T3JUc3ggJiYgIWNvbmZpZy5kb2VzQ29udGFpbkpzeE9yVHN4SW5QYWNrYWdlcykge1xuICAgICAgZGVsZXRlIG5ld1NldHRpbmdzLmNvbXBpbGVyT3B0aW9ucz8uanN4O1xuICAgIH1cbiAgICBpZiAoY29uZmlnLmlzUm9vdCAmJiAhY29uZmlnLmRvZXNDb250YWluU3ViUGFja2FnZUpzb25zKSB7XG4gICAgICBuZXdTZXR0aW5ncy5pbmNsdWRlID0gbmV3U2V0dGluZ3MuaW5jbHVkZT8uZmlsdGVyKChkaXJQYXRoOiBzdHJpbmcpID0+ICFkaXJQYXRoLnN0YXJ0c1dpdGgoJ3BhY2thZ2VzLyovJykpO1xuICAgICAgbmV3U2V0dGluZ3MuZXhjbHVkZSA9IG5ld1NldHRpbmdzLmV4Y2x1ZGU/LmZpbHRlcigoZGlyUGF0aDogc3RyaW5nKSA9PiAhZGlyUGF0aC5zdGFydHNXaXRoKCdwYWNrYWdlcy8qLycpKTtcbiAgICB9XG4gICAgaWYgKGNvbmZpZy5pc0VzbVBhY2thZ2UpIHtcbiAgICAgIG5ld1NldHRpbmdzLmNvbXBpbGVyT3B0aW9ucyA9IHtcbiAgICAgICAgLi4ubmV3U2V0dGluZ3MuY29tcGlsZXJPcHRpb25zLFxuICAgICAgICBtb2R1bGU6ICdOb2RlTmV4dCcsXG4gICAgICAgIG1vZHVsZVJlc29sdXRpb246ICdOb2RlTmV4dCcsXG4gICAgICB9O1xuICAgIH1cblxuICAgIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAndHNjb25maWcuanNvbicpO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBleGlzdGluZ0NvbnRlbnQgPSBhd2FpdCBmcy5wcm9taXNlcy5yZWFkRmlsZShmaWxlUGF0aCwgJ3V0ZjgnKTtcbiAgICAgIGNvbnN0IG9sZFNldHRpbmdzID0gSlNPTi5wYXJzZShleGlzdGluZ0NvbnRlbnQpIGFzIFRzQ29uZmlnSnNvbjtcbiAgICAgIGlmIChvbGRTZXR0aW5ncy5leHRlbmRzID09PSAnLi9ub2RlX21vZHVsZXMvQHdpbGxib29zdGVyL3RzY29uZmlnL3RzY29uZmlnLmpzb24nKSB7XG4gICAgICAgIGRlbGV0ZSBvbGRTZXR0aW5ncy5leHRlbmRzO1xuICAgICAgfVxuICAgICAgLy8gRG9uJ3QgbW9kaWZ5IFwidGFyZ2V0XCIsIFwibW9kdWxlXCIgYW5kIFwibW9kdWxlUmVzb2x1dGlvblwiLlxuICAgICAgZGVsZXRlIG5ld1NldHRpbmdzLmNvbXBpbGVyT3B0aW9ucz8udGFyZ2V0O1xuICAgICAgaWYgKCFjb25maWcuaXNFc21QYWNrYWdlKSB7XG4gICAgICAgIGRlbGV0ZSBuZXdTZXR0aW5ncy5jb21waWxlck9wdGlvbnM/Lm1vZHVsZTtcbiAgICAgICAgZGVsZXRlIG5ld1NldHRpbmdzLmNvbXBpbGVyT3B0aW9ucz8ubW9kdWxlUmVzb2x1dGlvbjtcbiAgICAgIH1cbiAgICAgIGlmIChvbGRTZXR0aW5ncy5jb21waWxlck9wdGlvbnM/LmpzeCkge1xuICAgICAgICBkZWxldGUgbmV3U2V0dGluZ3MuY29tcGlsZXJPcHRpb25zPy5qc3g7XG4gICAgICB9XG4gICAgICBuZXdTZXR0aW5ncyA9IG1lcmdlLmFsbChbbmV3U2V0dGluZ3MsIG9sZFNldHRpbmdzLCBuZXdTZXR0aW5nc10sIHsgYXJyYXlNZXJnZTogY29tYmluZU1lcmdlIH0pO1xuICAgICAgbmV3U2V0dGluZ3MuaW5jbHVkZSA9IG5ld1NldHRpbmdzLmluY2x1ZGU/LmZpbHRlcihcbiAgICAgICAgKGRpclBhdGg6IHN0cmluZykgPT5cbiAgICAgICAgICAhZGlyUGF0aC5pbmNsdWRlcygnQHR5cGVzJykgJiYgIWRpclBhdGguaW5jbHVkZXMoJ19fdGVzdHNfXy8nKSAmJiAhZGlyUGF0aC5pbmNsdWRlcygndGVzdHMvJylcbiAgICAgICk7XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBkbyBub3RoaW5nXG4gICAgfVxuICAgIHNvcnRLZXlzKG5ld1NldHRpbmdzKTtcbiAgICBuZXdTZXR0aW5ncy5pbmNsdWRlPy5zb3J0KCk7XG4gICAgY29uc3QgbmV3Q29udGVudCA9IEpTT04uc3RyaW5naWZ5KG5ld1NldHRpbmdzKTtcbiAgICAvLyBEb24ndCB1c2Ugb2xkIGRlY29yYXRvclxuICAgIGRlbGV0ZSBuZXdTZXR0aW5ncy5jb21waWxlck9wdGlvbnM/LmV4cGVyaW1lbnRhbERlY29yYXRvcnM7XG4gICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzVXRpbC5nZW5lcmF0ZUZpbGUoZmlsZVBhdGgsIG5ld0NvbnRlbnQpKTtcbiAgfSk7XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgbWVyZ2UgZnJvbSAnZGVlcG1lcmdlJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZnNVdGlsIH0gZnJvbSAnLi4vdXRpbHMvZnNVdGlsLmpzJztcbmltcG9ydCB7IHNvcnRLZXlzIH0gZnJvbSAnLi4vdXRpbHMvb2JqZWN0VXRpbC5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcblxuY29uc3QgZXhjbHVkZUZpbGVQYXR0ZXJucyA9IFtcbiAgJyoqLy5naXQvb2JqZWN0cy8qKicsXG4gICcqKi8uZ2l0L3N1YnRyZWUtY2FjaGUvKionLFxuICAnKiovbm9kZV9tb2R1bGVzLyoqJyxcbiAgJyoqL3RtcC8qKicsXG4gICcqKi90ZW1wLyoqJyxcbiAgJyoqL2Rpc3QvKionLFxuXTtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlVnNjb2RlU2V0dGluZ3MoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZ2VuZXJhdGVWc2NvZGVTZXR0aW5ncycsIGFzeW5jICgpID0+IHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICcudnNjb2RlJywgJ3NldHRpbmdzLmpzb24nKTtcbiAgICAgIGNvbnN0IGV4aXN0aW5nQ29udGVudCA9IGF3YWl0IGZzLnByb21pc2VzLnJlYWRGaWxlKGZpbGVQYXRoLCAndXRmOCcpO1xuICAgICAgbGV0IHNldHRpbmdzID0gSlNPTi5wYXJzZShleGlzdGluZ0NvbnRlbnQpIGFzIG9iamVjdDtcbiAgICAgIGZvciAoY29uc3QgZXhjbHVkZUZpbGVQYXR0ZXJuIG9mIGV4Y2x1ZGVGaWxlUGF0dGVybnMpIHtcbiAgICAgICAgc2V0dGluZ3MgPSBtZXJnZS5hbGwoW3NldHRpbmdzLCBleGNsdWRlU2V0dGluZyhleGNsdWRlRmlsZVBhdHRlcm4pXSk7XG4gICAgICB9XG4gICAgICBpZiAoY29uZmlnLmRvZXNDb250YWluUG9ldHJ5TG9jaykge1xuICAgICAgICBzZXR0aW5ncyA9IG1lcmdlLmFsbChbc2V0dGluZ3MsIGV4Y2x1ZGVTZXR0aW5nKCcqKi8udmVudi8qKicpXSk7XG4gICAgICB9XG4gICAgICBpZiAoY29uZmlnLmRlcGVuZGluZy5uZXh0KSB7XG4gICAgICAgIHNldHRpbmdzID0gbWVyZ2UuYWxsKFtzZXR0aW5ncywgZXhjbHVkZVNldHRpbmcoJyoqLy5uZXh0LyoqJyldKTtcbiAgICAgIH1cbiAgICAgIC8vIExMTeOBq+OCiOOCi3ZpYmUgY29kaW5n44Gn44Gv44CB6Ieq5YuV44OV44Kp44O844Oe44OD44OI44KE44Kz44O844OJ44Ki44Kv44K344On44Oz44KS54Sh5Yq55YyW44GZ44KL44GT44Go44GnXG4gICAgICAvLyDnlJ/miJDjgZXjgozjgZ/jgrPjg7zjg4njga7lhYPjga7lvaLlvI/jgpLntq3mjIHjgafjgY3jgotcbiAgICAgIGlmICgnZWRpdG9yLmNvZGVBY3Rpb25zT25TYXZlJyBpbiBzZXR0aW5ncykge1xuICAgICAgICBkZWxldGUgc2V0dGluZ3NbJ2VkaXRvci5jb2RlQWN0aW9uc09uU2F2ZSddO1xuICAgICAgfVxuICAgICAgaWYgKCdlZGl0b3IuZm9ybWF0T25TYXZlJyBpbiBzZXR0aW5ncykge1xuICAgICAgICBkZWxldGUgc2V0dGluZ3NbJ2VkaXRvci5mb3JtYXRPblNhdmUnXTtcbiAgICAgIH1cbiAgICAgIHNvcnRLZXlzKHNldHRpbmdzIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KTtcbiAgICAgIGNvbnN0IG5ld0NvbnRlbnQgPSBKU09OLnN0cmluZ2lmeShzZXR0aW5ncywgdW5kZWZpbmVkLCAyKTtcbiAgICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiBmc1V0aWwuZ2VuZXJhdGVGaWxlKGZpbGVQYXRoLCBuZXdDb250ZW50KSk7XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBkbyBub3RoaW5nXG4gICAgfVxuICB9KTtcbn1cblxuZnVuY3Rpb24gZXhjbHVkZVNldHRpbmcoZXhjbHVkZUZpbGVQYXR0ZXJuOiBzdHJpbmcpOiBvYmplY3Qge1xuICByZXR1cm4ge1xuICAgICdmaWxlcy53YXRjaGVyRXhjbHVkZSc6IHtcbiAgICAgIFtleGNsdWRlRmlsZVBhdHRlcm5dOiB0cnVlLFxuICAgIH0sXG4gIH07XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgdHlwZSB7IENvbmZpZ3VyYXRpb25WYWx1ZU1hcCB9IGZyb20gJ0B5YXJucGtnL2NvcmUnO1xuaW1wb3J0IHlhbWwgZnJvbSAnanMteWFtbCc7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuaW1wb3J0IHsgc3Bhd25TeW5jLCBzcGF3blN5bmNXaXRoU3RyaW5nUmVzdWx0IH0gZnJvbSAnLi4vdXRpbHMvc3Bhd25VdGlsLmpzJztcblxudHlwZSBTZXR0aW5ncyA9IHtcbiAgZGVmYXVsdFNlbXZlclJhbmdlUHJlZml4OiBzdHJpbmc7XG4gIG5tTW9kZTogc3RyaW5nO1xuICBub2RlTGlua2VyOiBzdHJpbmc7XG4gIG5wbU1pbmltYWxBZ2VHYXRlPzogc3RyaW5nO1xuICBucG1QcmVhcHByb3ZlZFBhY2thZ2VzPzogc3RyaW5nW107XG4gIHBsdWdpbnM/OiBQbHVnaW5bXTtcbn0gJiBQYXJ0aWFsPENvbmZpZ3VyYXRpb25WYWx1ZU1hcD47XG5cbmludGVyZmFjZSBQbHVnaW4ge1xuICBjaGVja3N1bTogc3RyaW5nO1xuICBwYXRoOiBzdHJpbmc7XG4gIHNwZWM6IHN0cmluZztcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlWWFybnJjWW1sKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2dlbmVyYXRlWWFybnJjWW1sJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IHlhcm5yY1ltbFBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICcueWFybnJjLnltbCcpO1xuICAgIGlmIChjb25maWcuaXNCdW4pIHtcbiAgICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiBmcy5wcm9taXNlcy5ybSh5YXJucmNZbWxQYXRoLCB7IGZvcmNlOiB0cnVlIH0pKTtcbiAgICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PlxuICAgICAgICBmcy5wcm9taXNlcy5ybShwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICcueWFybicpLCB7IGZvcmNlOiB0cnVlLCByZWN1cnNpdmU6IHRydWUgfSlcbiAgICAgICk7XG4gICAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT5cbiAgICAgICAgZnMucHJvbWlzZXMucm0ocGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAneWFybi5sb2NrJyksIHsgZm9yY2U6IHRydWUsIHJlY3Vyc2l2ZTogdHJ1ZSB9KVxuICAgICAgKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBjdXJyZW50VmVyc2lvbiA9IHNwYXduU3luY1dpdGhTdHJpbmdSZXN1bHQoJ3lhcm4nLCBbJy0tdmVyc2lvbiddLCBjb25maWcuZGlyUGF0aCk7XG4gICAgY29uc3QgbGF0ZXN0VmVyc2lvbiA9IGdldExhdGVzdFZlcnNpb24oJ0B5YXJucGtnL2NsaScsIGNvbmZpZy5kaXJQYXRoKTtcbiAgICBpZiAoZ2V0TWFqb3JOdW1iZXIoY3VycmVudFZlcnNpb24pIDw9IGdldE1ham9yTnVtYmVyKGxhdGVzdFZlcnNpb24pICYmIGN1cnJlbnRWZXJzaW9uICE9PSBsYXRlc3RWZXJzaW9uKSB7XG4gICAgICBzcGF3blN5bmMoJ3lhcm4nLCBbJ3NldCcsICd2ZXJzaW9uJywgbGF0ZXN0VmVyc2lvbl0sIGNvbmZpZy5kaXJQYXRoLCAxKTtcbiAgICB9XG5cbiAgICBjb25zdCByZWxlYXNlc1BhdGggPSBwYXRoLmpvaW4oY29uZmlnLmRpclBhdGgsICcueWFybicsICdyZWxlYXNlcycpO1xuICAgIGF3YWl0IGZzLnByb21pc2VzLm1rZGlyKHJlbGVhc2VzUGF0aCwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gICAgZm9yIChjb25zdCBmaWxlIG9mIGF3YWl0IGZzLnByb21pc2VzLnJlYWRkaXIocmVsZWFzZXNQYXRoKSkge1xuICAgICAgaWYgKGZpbGUuc3RhcnRzV2l0aCgneWFybi0nKSAmJiAhZmlsZS5zdGFydHNXaXRoKGB5YXJuLSR7bGF0ZXN0VmVyc2lvbn0uYCkpIHtcbiAgICAgICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzLnByb21pc2VzLnJtKHBhdGguam9pbihyZWxlYXNlc1BhdGgsIGZpbGUpKSk7XG4gICAgICAgIGNvbnNvbGUubG9nKCdSZW1vdmVkJywgcGF0aC5qb2luKHJlbGVhc2VzUGF0aCwgZmlsZSkpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IHlhcm5yY1BhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICcueWFybnJjJyk7XG4gICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzLnByb21pc2VzLnJtKHlhcm5yY1BhdGgsIHsgZm9yY2U6IHRydWUgfSkpO1xuXG4gICAgY29uc3Qgc2V0dGluZ3MgPSB5YW1sLmxvYWQoYXdhaXQgZnMucHJvbWlzZXMucmVhZEZpbGUoeWFybnJjWW1sUGF0aCwgJ3V0ZjgnKSkgYXMgU2V0dGluZ3M7XG4gICAgc2V0dGluZ3MuZGVmYXVsdFNlbXZlclJhbmdlUHJlZml4ID0gJyc7XG4gICAgc2V0dGluZ3Mubm9kZUxpbmtlciA9ICdub2RlLW1vZHVsZXMnO1xuICAgIHNldHRpbmdzLm5tTW9kZSA9ICdoYXJkbGlua3MtZ2xvYmFsJztcbiAgICBzZXR0aW5ncy5ucG1NaW5pbWFsQWdlR2F0ZSA9ICc1ZCc7XG4gICAgc2V0dGluZ3MubnBtUHJlYXBwcm92ZWRQYWNrYWdlcyA9IFtcbiAgICAgICdAd2lsbGJvb3N0ZXIvYmFiZWwtY29uZmlncycsXG4gICAgICAnQHdpbGxib29zdGVyL2Jpb21lLWNvbmZpZycsXG4gICAgICAnQHdpbGxib29zdGVyL2VzbGludC1jb25maWctanMnLFxuICAgICAgJ0B3aWxsYm9vc3Rlci9lc2xpbnQtY29uZmlnLWpzLXJlYWN0JyxcbiAgICAgICdAd2lsbGJvb3N0ZXIvZXNsaW50LWNvbmZpZy1uZXh0JyxcbiAgICAgICdAd2lsbGJvb3N0ZXIvZXNsaW50LWNvbmZpZy10cycsXG4gICAgICAnQHdpbGxib29zdGVyL2VzbGludC1jb25maWctdHMtcmVhY3QnLFxuICAgICAgJ0B3aWxsYm9vc3Rlci9wcmV0dGllci1jb25maWcnLFxuICAgICAgJ0B3aWxsYm9vc3Rlci93YicsXG4gICAgXTtcbiAgICBkZWxldGUgc2V0dGluZ3MuY29tcHJlc3Npb25MZXZlbDtcbiAgICBpZiAoc2V0dGluZ3MuaW5qZWN0RW52aXJvbm1lbnRGaWxlcz8ubGVuZ3RoID09PSAwKSB7XG4gICAgICBkZWxldGUgc2V0dGluZ3MuaW5qZWN0RW52aXJvbm1lbnRGaWxlcztcbiAgICB9XG4gICAgLy8gY2YuIGh0dHBzOi8vZ2l0aHViLmNvbS95YXJucGtnL2JlcnJ5L3B1bGwvNDY5OFxuICAgIHNldHRpbmdzLmVuYWJsZUdsb2JhbENhY2hlID0gdHJ1ZTtcbiAgICBjb25zdCBvcmlnaW5hbExlbmd0aCA9IHNldHRpbmdzLnBsdWdpbnM/Lmxlbmd0aCA/PyAwO1xuICAgIHNldHRpbmdzLnBsdWdpbnMgPSBzZXR0aW5ncy5wbHVnaW5zPy5maWx0ZXIoKHApID0+IHAucGF0aCAhPT0gJy55YXJuL3BsdWdpbnMvdW5kZWZpbmVkLmNqcycpID8/IFtdO1xuICAgIGlmIChzZXR0aW5ncy5wbHVnaW5zLmxlbmd0aCAhPT0gb3JpZ2luYWxMZW5ndGgpIHtcbiAgICAgIGNvbnN0IHBsdWdpblBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICcueWFybnJjJywgJ3VuZGVmaW5lZC5janMnKTtcbiAgICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiBmcy5wcm9taXNlcy5ybShwbHVnaW5QYXRoLCB7IGZvcmNlOiB0cnVlIH0pKTtcbiAgICB9XG4gICAgaWYgKHNldHRpbmdzLnBsdWdpbnMubGVuZ3RoID09PSAwKSB7XG4gICAgICBkZWxldGUgc2V0dGluZ3MucGx1Z2lucztcbiAgICB9XG4gICAgYXdhaXQgZnMucHJvbWlzZXMud3JpdGVGaWxlKHlhcm5yY1ltbFBhdGgsIHlhbWwuZHVtcChzZXR0aW5ncywgeyBsaW5lV2lkdGg6IC0xIH0pKTtcblxuICAgIHNwYXduU3luYygneWFybicsIFsnZGx4JywgJ3lhcm4tcGx1Z2luLWF1dG8taW5zdGFsbCddLCBjb25maWcuZGlyUGF0aCk7XG4gIH0pO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0TGF0ZXN0VmVyc2lvbihwYWNrYWdlTmFtZTogc3RyaW5nLCBkaXJQYXRoOiBzdHJpbmcpOiBzdHJpbmcge1xuICBjb25zdCB2ZXJzaW9uc0pzb24gPSBzcGF3blN5bmNXaXRoU3RyaW5nUmVzdWx0KCducG0nLCBbJ3Nob3cnLCBwYWNrYWdlTmFtZSwgJ3ZlcnNpb25zJywgJy0tanNvbiddLCBkaXJQYXRoKTtcbiAgY29uc3QgdmVyc2lvbnMgPSBKU09OLnBhcnNlKHZlcnNpb25zSnNvbikgYXMgc3RyaW5nW107XG4gIHJldHVybiB2ZXJzaW9ucy5hdCgtMSkgYXMgc3RyaW5nO1xufVxuZnVuY3Rpb24gZ2V0TWFqb3JOdW1iZXIodmVyc2lvbjogc3RyaW5nKTogbnVtYmVyIHtcbiAgY29uc3QgW21ham9yXSA9IHZlcnNpb24uc3BsaXQoJy4nKTtcbiAgcmV0dXJuIE51bWJlcihtYWpvcik7XG59XG4iLCJpbXBvcnQgdHlwZSB7IE9jdG9raXQgfSBmcm9tICdAb2N0b2tpdC9jb3JlJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZ2V0T2N0b2tpdCwgZ2l0SHViVXRpbCwgaGFzR2l0SHViVG9rZW4gfSBmcm9tICcuLi91dGlscy9naXRodWJVdGlsLmpzJztcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHNldHVwTGFiZWxzKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ3NldHVwTGFiZWxzJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IFtvd25lciwgcmVwb10gPSBnaXRIdWJVdGlsLmdldE9yZ0FuZE5hbWUoY29uZmlnLnJlcG9zaXRvcnkgPz8gJycpO1xuICAgIGlmICghb3duZXIgfHwgIXJlcG8pIHJldHVybjtcbiAgICBpZiAob3duZXIgIT09ICdXaWxsQm9vc3RlcicgJiYgb3duZXIgIT09ICdXaWxsQm9vc3RlckxhYicpIHJldHVybjtcbiAgICBpZiAoIWhhc0dpdEh1YlRva2VuKG93bmVyKSkgcmV0dXJuO1xuXG4gICAgY29uc3Qgb2N0b2tpdCA9IGdldE9jdG9raXQob3duZXIpO1xuXG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdkMTogeC1lYXN5IDpoZWRnZWhvZzonLCAnRURFOUZFJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAnZDI6IGVhc3kgOnJhYmJpdDI6JywgJ0RERDZGRScpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ2QzOiBtZWRpdW0gOm94OicsICdDNEI1RkQnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdkNDogaGFyZCA6c3F1aWQ6JywgJ0E3OEJGQScpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ2Q1OiB4LWhhcmQgOndoYWxlMjonLCAnOEI1Q0Y2Jyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAncDE6IGNyaXRpY2FsIDpmaXJlOjpmaXJlOjpmaXJlOicsICdFRjQ0NDQnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdwMjogdXJnZW50IDpmaXJlOjpmaXJlOicsICdGODcxNzEnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdwMzogaW1wb3J0YW50IDpmaXJlOicsICdGQ0E1QTUnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdwNDogbmljZSB0byBoYXZlIDpkcm9wbGV0OicsICdGRUNBQ0EnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdyOiBibGl0eicsICc1MzAwYmMnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdyOiBmaXJlYmFzZScsICdmZmNhMjgnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdyOiBwcmlzbWEnLCAnMGMzNDRiJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAncjogcmVhY3QnLCAnNjFkYWZiJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAncjogc3ZlbHRlJywgJ2ZmM2UwMCcpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ3I6IHNlbWFudGljLXJlbGVhc2UnLCAnNDk0OTQ5Jyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAncmVhZHkgOnJvY2tldDonLCAnMjJDNTVFJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAncmV2aWV3IHJlcXVlc3RlZCA6bWFnOicsICdGQkNBMDQnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdyZWxlYXNlZCA6Ym9va21hcms6JywgJzYzNjZGMScpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ3M6IDAuNWggOmNsb2NrMTIzMDonLCAnRjNGNEY2Jyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAnczogMWggOmNsb2NrMTonLCAnRTVFN0VCJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAnczogMmggOmNsb2NrMjonLCAnRDFENURCJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAnczogM2ggOmNsb2NrMzonLCAnOUNBM0FGJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAnczogNWggOmNsb2NrNTonLCAnNkI3MjgwJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAnczogOGggOmNsb2NrODonLCAnNEI1NTYzJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAnczogMTNoIDpjbG9jazE6JywgJzM3NDE1MScpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ3Q6IGJ1aWxkIDpoYW1tZXI6JywgJ0JGREJGRScpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ3Q6IGNob3JlIDpicm9vbTonLCAnQkZEQkZFJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAndDogY2kgOmNvbnN0cnVjdGlvbl93b3JrZXI6JywgJ0JGREJGRScpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ3Q6IGRvY3MgOm1lbW86JywgJ0JGREJGRScpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ3Q6IGZlYXQgOnNwYXJrbGVzOicsICdCRkRCRkUnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICd0OiBmaXggOmJ1ZzonLCAnQkZEQkZFJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAndDogcGVyZiA6emFwOicsICdCRkRCRkUnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICd0OiByZWZhY3RvciA6cmVjeWNsZTonLCAnQkZEQkZFJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAndDogc3R5bGUgOmxpcHN0aWNrOicsICdCRkRCRkUnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICd0OiB0ZXN0IDp0ZXN0X3R1YmU6JywgJ0JGREJGRScpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ3Byb2plY3QnLCAnMjQyOTJGJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAnZm9jdXNlZCA6ZGFydDonLCAnMjJDNTVFJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAnZ2VuLXByLWFsbCA6cm9ib3Q6JywgJzAwQjREOCcpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ2dlbi1wci1jbGF1ZGUgOnJvYm90OicsICcwMEI0RDgnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdnZW4tcHItY29kZXggOnJvYm90OicsICcwMEI0RDgnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdnZW4tcHItZ2VtaW5pIDpyb2JvdDonLCAnMDBCNEQ4Jyk7XG5cbiAgICAgIGF3YWl0IGRlbGV0ZUxhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAnYnVnJyk7XG4gICAgICBhd2FpdCBkZWxldGVMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ2RvY3VtZW50YXRpb24nKTtcbiAgICAgIGF3YWl0IGRlbGV0ZUxhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAnZHVwbGljYXRlJyk7XG4gICAgICBhd2FpdCBkZWxldGVMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ2VuaGFuY2VtZW50Jyk7XG4gICAgICBhd2FpdCBkZWxldGVMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ2dvb2QgZmlyc3QgaXNzdWUnKTtcbiAgICAgIGF3YWl0IGRlbGV0ZUxhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAnaGVscCB3YW50ZWQnKTtcbiAgICAgIGF3YWl0IGRlbGV0ZUxhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAnaW52YWxpZCcpO1xuICAgICAgYXdhaXQgZGVsZXRlTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdxdWVzdGlvbicpO1xuICAgICAgYXdhaXQgZGVsZXRlTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICd3b250Zml4Jyk7XG5cbiAgICAgIGF3YWl0IGRlbGV0ZUxhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAncmVhZHknKTtcbiAgICAgIGF3YWl0IGRlbGV0ZUxhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAncmV2aWV3IHJlcXVlc3RlZCcpO1xuICAgICAgYXdhaXQgZGVsZXRlTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdyZWxlYXNlZCcpO1xuICAgICAgYXdhaXQgZGVsZXRlTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdzZW1hbnRpYy1yZWxlYXNlJyk7XG4gICAgICBhd2FpdCBkZWxldGVMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ2xsbS1wciA6cm9ib3Q6Jyk7XG4gICAgICBhd2FpdCBkZWxldGVMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ2FpLXByIDpyb2JvdDonKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgY29uc29sZS53YXJuKCdTa2lwIHNldHVwTGFiZWxzIGR1ZSB0bzonLCAoZXJyb3IgYXMgRXJyb3IgfCB1bmRlZmluZWQpPy5zdGFjayA/PyBlcnJvcik7XG4gICAgfVxuICB9KTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gc2V0dXBMYWJlbChvY3Rva2l0OiBPY3Rva2l0LCBvd25lcjogc3RyaW5nLCByZXBvOiBzdHJpbmcsIG5hbWU6IHN0cmluZywgY29sb3I6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICB0cnkge1xuICAgIC8vIElzc3VlcyBwZXJtaXNzaW9uXG4gICAgYXdhaXQgb2N0b2tpdC5yZXF1ZXN0KCdQT1NUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9sYWJlbHMnLCB7XG4gICAgICBvd25lcixcbiAgICAgIHJlcG8sXG4gICAgICBuYW1lLFxuICAgICAgY29sb3IsXG4gICAgfSk7XG4gIH0gY2F0Y2gge1xuICAgIC8vIElzc3VlcyBwZXJtaXNzaW9uXG4gICAgYXdhaXQgb2N0b2tpdC5yZXF1ZXN0KCdQQVRDSCAvcmVwb3Mve293bmVyfS97cmVwb30vbGFiZWxzL3tuYW1lfScsIHtcbiAgICAgIG93bmVyLFxuICAgICAgcmVwbyxcbiAgICAgIG5hbWUsXG4gICAgICBjb2xvcixcbiAgICB9KTtcbiAgfVxufVxuXG5hc3luYyBmdW5jdGlvbiBkZWxldGVMYWJlbChvY3Rva2l0OiBPY3Rva2l0LCBvd25lcjogc3RyaW5nLCByZXBvOiBzdHJpbmcsIG5hbWU6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICB0cnkge1xuICAgIC8vIElzc3VlcyBwZXJtaXNzaW9uXG4gICAgYXdhaXQgb2N0b2tpdC5yZXF1ZXN0KCdERUxFVEUgL3JlcG9zL3tvd25lcn0ve3JlcG99L2xhYmVscy97bmFtZX0nLCB7XG4gICAgICBvd25lcixcbiAgICAgIHJlcG8sXG4gICAgICBuYW1lLFxuICAgIH0pO1xuICB9IGNhdGNoIHtcbiAgICAvLyBkbyBub3RoaW5nXG4gIH1cbn1cbiIsIi8qIGVzbGludC1kaXNhYmxlIGltcG9ydC14L25vLW5hbWVkLWFzLWRlZmF1bHQtbWVtYmVyICovXG5cbmltcG9ydCBkb3RlbnYgZnJvbSAnZG90ZW52JztcbmltcG9ydCBzb2RpdW0gZnJvbSAnbGlic29kaXVtLXdyYXBwZXJzJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB7IG9wdGlvbnMgfSBmcm9tICcuLi9vcHRpb25zLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZ2V0T2N0b2tpdCwgZ2l0SHViVXRpbCwgaGFzR2l0SHViVG9rZW4gfSBmcm9tICcuLi91dGlscy9naXRodWJVdGlsLmpzJztcblxuY29uc3QgREVQUkVDQVRFRF9TRUNSRVRfTkFNRVMgPSBbJ1JFQURZX0RJU0NPUkRfV0VCSE9PS19VUkwnLCAnR0hfQk9UX1BBVCcsICdQVUJMSUNfR0hfQk9UX1BBVCddO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gc2V0dXBTZWNyZXRzKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ3NldHVwU2VjcmV0cycsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBbb3duZXIsIHJlcG9dID0gZ2l0SHViVXRpbC5nZXRPcmdBbmROYW1lKGNvbmZpZy5yZXBvc2l0b3J5ID8/ICcnKTtcbiAgICBpZiAoIW93bmVyIHx8ICFyZXBvIHx8IG93bmVyICE9PSAnV2lsbEJvb3N0ZXJMYWInKSByZXR1cm47XG4gICAgaWYgKCFoYXNHaXRIdWJUb2tlbihvd25lcikgfHwgIW9wdGlvbnMuZG9lc1VwbG9hZEVudlZhcnMpIHJldHVybjtcblxuICAgIGNvbnN0IHBhcnNlZCA9IGRvdGVudi5jb25maWcoKS5wYXJzZWQgPz8ge307XG4gICAgaWYgKE9iamVjdC5rZXlzKHBhcnNlZCkubGVuZ3RoID09PSAwKSByZXR1cm47XG5cbiAgICBjb25zdCBvY3Rva2l0ID0gZ2V0T2N0b2tpdChvd25lcik7XG5cbiAgICB0cnkge1xuICAgICAgZm9yIChjb25zdCBzZWNyZXROYW1lIG9mIERFUFJFQ0FURURfU0VDUkVUX05BTUVTKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgLy8gUmVxdWlyZXMgU2VjcmV0cyBwZXJtaXNzaW9uXG4gICAgICAgICAgYXdhaXQgb2N0b2tpdC5yZXF1ZXN0KCdERUxFVEUgL3JlcG9zL3tvd25lcn0ve3JlcG99L2FjdGlvbnMvc2VjcmV0cy97c2VjcmV0X25hbWV9Jywge1xuICAgICAgICAgICAgb3duZXIsXG4gICAgICAgICAgICByZXBvLFxuICAgICAgICAgICAgc2VjcmV0X25hbWU6IHNlY3JldE5hbWUsXG4gICAgICAgICAgfSk7XG4gICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgIC8vIGRvIG5vdGhpbmdcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBSZXF1aXJlcyBTZWNyZXRzIHBlcm1pc3Npb25cbiAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgb2N0b2tpdC5yZXF1ZXN0KCdHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2FjdGlvbnMvc2VjcmV0cy9wdWJsaWMta2V5Jywge1xuICAgICAgICBvd25lcixcbiAgICAgICAgcmVwbyxcbiAgICAgIH0pO1xuICAgICAgY29uc3QgeyBrZXksIGtleV9pZDoga2V5SWQgfSA9IHJlc3BvbnNlLmRhdGE7XG5cbiAgICAgIGF3YWl0IHNvZGl1bS5yZWFkeTtcblxuICAgICAgZm9yIChjb25zdCBbbmFtZSwgc2VjcmV0XSBvZiBPYmplY3QuZW50cmllcyhwYXJzZWQpKSB7XG4gICAgICAgIGlmIChcbiAgICAgICAgICBuYW1lID09PSAnR0hfQk9UX1BBVCcgfHxcbiAgICAgICAgICBuYW1lID09PSAnR0hfQk9UX1BBVF9GT1JfV0lMTEJPT1NURVInIHx8XG4gICAgICAgICAgbmFtZSA9PT0gJ0dIX0JPVF9QQVRfRk9SX1dJTExCT09TVEVSTEFCJ1xuICAgICAgICApIHtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIENvbnZlcnQgU2VjcmV0ICYgQmFzZTY0IGtleSB0byBVaW50OEFycmF5LlxuICAgICAgICBjb25zdCByYXdLZXkgPSBzb2RpdW0uZnJvbV9iYXNlNjQoa2V5LCBzb2RpdW0uYmFzZTY0X3ZhcmlhbnRzLk9SSUdJTkFMKTtcbiAgICAgICAgY29uc3QgcmF3U2VjID0gc29kaXVtLmZyb21fc3RyaW5nKHNlY3JldCk7XG5cbiAgICAgICAgLy8gRW5jcnlwdCB0aGUgc2VjcmV0IHVzaW5nIExpYlNvZGl1bVxuICAgICAgICBjb25zdCBlbmNCeXRlcyA9IHNvZGl1bS5jcnlwdG9fYm94X3NlYWwocmF3U2VjLCByYXdLZXkpO1xuXG4gICAgICAgIC8vIENvbnZlcnQgZW5jcnlwdGVkIFVpbnQ4QXJyYXkgdG8gQmFzZTY0XG4gICAgICAgIGNvbnN0IGVuY0Jhc2U2NCA9IHNvZGl1bS50b19iYXNlNjQoZW5jQnl0ZXMsIHNvZGl1bS5iYXNlNjRfdmFyaWFudHMuT1JJR0lOQUwpO1xuXG4gICAgICAgIC8vIFJlcXVpcmVzIFNlY3JldHMgcGVybWlzc2lvblxuICAgICAgICBhd2FpdCBvY3Rva2l0LnJlcXVlc3QoJ1BVVCAvcmVwb3Mve293bmVyfS97cmVwb30vYWN0aW9ucy9zZWNyZXRzL3tzZWNyZXRfbmFtZX0nLCB7XG4gICAgICAgICAgb3duZXIsXG4gICAgICAgICAgcmVwbyxcbiAgICAgICAgICBzZWNyZXRfbmFtZTogbmFtZSxcbiAgICAgICAgICBlbmNyeXB0ZWRfdmFsdWU6IGVuY0Jhc2U2NCxcbiAgICAgICAgICBrZXlfaWQ6IGtleUlkLFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgY29uc29sZS53YXJuKCdTa2lwIHNldHVwU2VjcmV0cyBkdWUgdG86JywgKGVycm9yIGFzIEVycm9yIHwgdW5kZWZpbmVkKT8uc3RhY2sgPz8gZXJyb3IpO1xuICAgIH1cbiAgfSk7XG59XG4iLCJpbXBvcnQgeyB3aXRoUmV0cnkgfSBmcm9tICdAd2lsbGJvb3N0ZXIvc2hhcmVkLWxpYic7XG5cbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZ2V0T2N0b2tpdCwgZ2l0SHViVXRpbCwgaGFzR2l0SHViVG9rZW4gfSBmcm9tICcuLi91dGlscy9naXRodWJVdGlsLmpzJztcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHNldHVwR2l0SHViU2V0dGluZ3MoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IFtvd25lciwgcmVwb10gPSBnaXRIdWJVdGlsLmdldE9yZ0FuZE5hbWUoY29uZmlnLnJlcG9zaXRvcnkgPz8gJycpO1xuICBpZiAoIW93bmVyIHx8ICFyZXBvKSByZXR1cm47XG4gIGlmIChvd25lciAhPT0gJ1dpbGxCb29zdGVyJyAmJiBvd25lciAhPT0gJ1dpbGxCb29zdGVyTGFiJykgcmV0dXJuO1xuICBpZiAoIWhhc0dpdEh1YlRva2VuKG93bmVyKSkgcmV0dXJuO1xuXG4gIGNvbnN0IG9jdG9raXQgPSBnZXRPY3Rva2l0KG93bmVyKTtcblxuICAvLyBBZG1pbmlzdHJhdGlvbiBwZXJtaXNzaW9uXG4gIGF3YWl0IHdpdGhSZXRyeSgoKSA9PlxuICAgIG9jdG9raXQucmVxdWVzdCgnUEFUQ0ggL3JlcG9zL3tvd25lcn0ve3JlcG99Jywge1xuICAgICAgb3duZXIsXG4gICAgICByZXBvLFxuICAgICAgYWxsb3dfYXV0b19tZXJnZTogdHJ1ZSxcbiAgICAgIGFsbG93X21lcmdlX2NvbW1pdDogZmFsc2UsXG4gICAgICBhbGxvd19zcXVhc2hfbWVyZ2U6IHRydWUsXG4gICAgICBhbGxvd19yZWJhc2VfbWVyZ2U6IGZhbHNlLFxuICAgICAgYWxsb3dfdXBkYXRlX2JyYW5jaDogdHJ1ZSxcbiAgICAgIGRlbGV0ZV9icmFuY2hfb25fbWVyZ2U6IHRydWUsXG4gICAgICBzcXVhc2hfbWVyZ2VfY29tbWl0X3RpdGxlOiAnUFJfVElUTEUnLFxuICAgICAgc3F1YXNoX21lcmdlX2NvbW1pdF9tZXNzYWdlOiAnQkxBTksnLFxuICAgICAgaGVhZGVyczoge1xuICAgICAgICAnWC1HaXRIdWItQXBpLVZlcnNpb24nOiAnMjAyMi0xMS0yOCcsXG4gICAgICB9LFxuICAgICAgLi4uKGNvbmZpZy5yZXBvc2l0b3J5Py5zdGFydHNXaXRoKCdnaXRodWI6V2lsbEJvb3N0ZXIvJykgPyB7IGFsbG93X2F1dG9fbWVyZ2U6IHRydWUgfSA6IHt9KSxcbiAgICB9KVxuICApO1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHsgZGlzdGFuY2UgfSBmcm9tICdmYXN0ZXN0LWxldmVuc2h0ZWluJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZnNVdGlsIH0gZnJvbSAnLi4vdXRpbHMvZnNVdGlsLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuXG5jb25zdCB0ZW1wbGF0ZXMgPSB7XG4gICdwdWxsX3JlcXVlc3RfdGVtcGxhdGUubWQnOiBgXG5DbG9zZSAjPElzc3VlTnVtYmVyPlxuXG4jIyBTZWxmIENoZWNrXG5cbi0gWyBdIEkndmUgY29uZmlybWVkIFxcYEFsbCBjaGVja3MgaGF2ZSBwYXNzZWRcXGAgb24gdGhpcyBwYWdlLlxuICAtIFBSIHRpdGxlIGZvbGxvd3MgW0FuZ3VsYXIncyBjb21taXQgbWVzc2FnZSBmb3JtYXRdKGh0dHBzOi8vZ2l0aHViLmNvbS9hbmd1bGFyL2FuZ3VsYXIvYmxvYi9tYWluL0NPTlRSSUJVVElORy5tZCMtY29tbWl0LW1lc3NhZ2UtZm9ybWF0KS5cbiAgLSBQUiB0aXRsZSBkb2Vzbid0IGhhdmUgXFxgV0lQOlxcYC5cbiAgLSBUaGUgdGVzdCBjb21tYW5kIChlLmcuLCBcXGB5YXJuIHRlc3RcXGApIHBhc3NlZC5cbiAgLSBUaGUgbGludCBjb21tYW5kIChlLmcuLCBcXGB5YXJuIGxpbnRcXGApIHBhc3NlZC5cbiAgLSBZb3UgbWF5IGxlYXZlIHRoaXMgYm94IHVuY2hlY2tlZCBkdWUgdG8gbG9uZyB3b3JrZmxvd3MuXG4tIFsgXSBJJ3ZlIHJldmlld2VkIG15IGNoYW5nZXMgb24gdGhlIEdpdEh1YiBkaWZmIHZpZXcuXG4tIFsgXSBJJ3ZlIHdyaXR0ZW4gdGhlIHN0ZXBzIHRvIHRlc3QgbXkgY2hhbmdlcy5cbi0gWyBdIEkndmUgYWRkZWQgc2NyZWVuc2hvdHMgKGlmIHRoZSBVSSBjaGFuZ2VkKS5cbiAgLSBZb3UgbWF5IGxlYXZlIHRoaXMgYm94IHVuY2hlY2tlZCBpZiB5b3UgZGlkbid0IG1vZGlmeSB0aGUgVUkuXG5cbjwhLS0gUGxlYXNlIGFkZCBzY3JlZW5zaG90cyBpZiB5b3UgbW9kaWZ5IHRoZSBVSS5cbnwgQ3VycmVudCAgICAgICAgICAgICAgICAgIHwgSW4gY29taW5nICAgICAgICAgICAgICAgIHxcbnwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHxcbnwgPGltZyBzcmM9XCJcIiB3aWR0aD1cIjQwMFwiPiB8IDxpbWcgc3JjPVwiXCIgd2lkdGg9XCI0MDBcIj4gfFxuLS0+XG5cbjwhLS0gUGxlYXNlIGFkZCBzdGVwcyB0byB0ZXN0IHlvdXIgY2hhbmdlcy5cbiMjIFN0ZXBzIHRvIFRlc3RcblxuMS4gT3BlbiBodHRwOi8vbG9jYWxob3N0LWV4ZXJjb2RlLndpbGxib29zdGVyLm5ldDozMDAwL2phLUpQL2NvdXJzZXMvX2V4YW1wbGUvbGVzc29ucy9fZXhhbXBsZV9hX3BsdXNfYi9wcm9ibGVtcy9fZXhhbXBsZV9hX3BsdXNfYiBhZnRlciBsb2dpbi5cbjIuIFNlbGVjdCB0aGUgbGFuZ3VhZ2UgXFxgQ1xcYC5cbjMuIFdyaXRlIHRoZSBmb2xsb3dpbmcgY29kZTpcbiAgIFxcYFxcYFxcYGNcbiAgICNpbmNsdWRlIDxzdGRpby5oPlxuXG4gICBpbnQgbWFpbih2b2lkKSB7XG4gICAgIGludCBhLCBiO1xuXG4gICAgIHNjYW5mKFwiJWQgJWRcIiwgJmEsICZiKTtcbiAgICAgcHJpbnRmKFwiJWRcIiwgYSArIGIpO1xuICAgICByZXR1cm4gMDtcbiAgIH1cbiAgIFxcYFxcYFxcYFxuNC4gUHVzaCBcXGBTdWJtaXRcXGAgYnV0dG9uLlxuNS4gLi4uXG4tLT5cbmAudHJpbSgpLFxufTtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlR2l0SHViVGVtcGxhdGVzKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2dlbmVyYXRlR2l0SHViVGVtcGxhdGVzJywgYXN5bmMgKCkgPT4ge1xuICAgIGZvciAoY29uc3QgW2ZpbGVOYW1lLCBuZXdDb250ZW50XSBvZiBPYmplY3QuZW50cmllcyh0ZW1wbGF0ZXMpKSB7XG4gICAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJy5naXRodWInLCBmaWxlTmFtZSk7XG4gICAgICBpZiAoZnMuZXhpc3RzU3luYyhmaWxlUGF0aCkpIHtcbiAgICAgICAgY29uc3Qgb2xkQ29udGVudCA9IGF3YWl0IGZzLnByb21pc2VzLnJlYWRGaWxlKGZpbGVQYXRoLCAndXRmOCcpO1xuICAgICAgICBpZiAoZGlzdGFuY2Uob2xkQ29udGVudCwgbmV3Q29udGVudCkgPiBuZXdDb250ZW50Lmxlbmd0aCAvIDIpIHtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBhd2FpdCBmcy5wcm9taXNlcy5ta2RpcihwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICcuZ2l0aHViJyksIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICAgICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzVXRpbC5nZW5lcmF0ZUZpbGUoZmlsZVBhdGgsIG5ld0NvbnRlbnQpKTtcbiAgICB9XG4gIH0pO1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IGZzcCBmcm9tICdub2RlOmZzL3Byb21pc2VzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCBmZyBmcm9tICdmYXN0LWdsb2InO1xuaW1wb3J0IHsgc2ltcGxlR2l0IH0gZnJvbSAnc2ltcGxlLWdpdCc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VKc29uIH0gZnJvbSAndHlwZS1mZXN0JztcbmltcG9ydCB7IHogfSBmcm9tICd6b2QnO1xuXG5pbXBvcnQgeyBnZXRPY3Rva2l0LCBnaXRIdWJVdGlsIH0gZnJvbSAnLi91dGlscy9naXRodWJVdGlsLmpzJztcbmltcG9ydCB7IGdsb2JJZ25vcmUgfSBmcm9tICcuL3V0aWxzL2dsb2JVdGlsLmpzJztcblxuZXhwb3J0IGludGVyZmFjZSBQYWNrYWdlQ29uZmlnIHtcbiAgZGlyUGF0aDogc3RyaW5nO1xuICBkb2NrZXJmaWxlOiBzdHJpbmc7XG4gIGlzUm9vdDogYm9vbGVhbjtcbiAgaXNQdWJsaWNSZXBvOiBib29sZWFuO1xuICBpc1JlZmVycmVkQnlPdGhlclJlcG86IGJvb2xlYW47XG4gIHJlcG9zaXRvcnk/OiBzdHJpbmc7XG4gIGlzV2lsbEJvb3N0ZXJSZXBvOiBib29sZWFuO1xuICBpc0J1bjogYm9vbGVhbjtcbiAgaXNFc21QYWNrYWdlOiBib29sZWFuO1xuICBpc1dpbGxCb29zdGVyQ29uZmlnczogYm9vbGVhbjtcbiAgLy8gZGVwZW5kZW5jeSBpbmZvcm1hdGlvblxuICBkb2VzQ29udGFpblN1YlBhY2thZ2VKc29uczogYm9vbGVhbjtcbiAgZG9lc0NvbnRhaW5Eb2NrZXJmaWxlOiBib29sZWFuO1xuICBkb2VzQ29udGFpbkdlbWZpbGU6IGJvb2xlYW47XG4gIGRvZXNDb250YWluR29Nb2Q6IGJvb2xlYW47XG4gIGRvZXNDb250YWluUGFja2FnZUpzb246IGJvb2xlYW47XG4gIGRvZXNDb250YWluUG9ldHJ5TG9jazogYm9vbGVhbjtcbiAgZG9lc0NvbnRhaW5Qb21YbWw6IGJvb2xlYW47XG4gIGRvZXNDb250YWluUHVic3BlY1lhbWw6IGJvb2xlYW47XG4gIGRvZXNDb250YWluVGVtcGxhdGVZYW1sOiBib29sZWFuO1xuICBkb2VzQ29udGFpblZzY29kZVNldHRpbmdzSnNvbjogYm9vbGVhbjtcbiAgLy8gc291cmNlIGNvZGUgZmlsZXNcbiAgZG9lc0NvbnRhaW5KYXZhU2NyaXB0OiBib29sZWFuO1xuICBkb2VzQ29udGFpblR5cGVTY3JpcHQ6IGJvb2xlYW47XG4gIGRvZXNDb250YWluSnN4T3JUc3g6IGJvb2xlYW47XG4gIGRvZXNDb250YWluSmF2YVNjcmlwdEluUGFja2FnZXM6IGJvb2xlYW47XG4gIGRvZXNDb250YWluVHlwZVNjcmlwdEluUGFja2FnZXM6IGJvb2xlYW47XG4gIGRvZXNDb250YWluSnN4T3JUc3hJblBhY2thZ2VzOiBib29sZWFuO1xuXG4gIGhhc1N0YXJ0VGVzdDogYm9vbGVhbjtcblxuICBkZXBlbmRpbmc6IHtcbiAgICBibGl0ejogYm9vbGVhbjtcbiAgICBmaXJlYmFzZTogYm9vbGVhbjtcbiAgICBnZW5JMThuVHM6IGJvb2xlYW47XG4gICAgbGl0ZXN0cmVhbTogYm9vbGVhbjtcbiAgICBuZXh0OiBib29sZWFuO1xuICAgIHBsYXl3cmlnaHRUZXN0OiBib29sZWFuO1xuICAgIHByaXNtYTogYm9vbGVhbjtcbiAgICBweXJpZ2h0OiBib29sZWFuO1xuICAgIHJlYWN0OiBib29sZWFuO1xuICAgIHJlYWN0TmF0aXZlOiBib29sZWFuO1xuICAgIHNlbWFudGljUmVsZWFzZTogYm9vbGVhbjtcbiAgICBzdG9yeWJvb2s6IGJvb2xlYW47XG4gICAgd2I6IGJvb2xlYW47XG4gIH07XG4gIHJlbGVhc2U6IHtcbiAgICBicmFuY2hlczogc3RyaW5nW107XG4gICAgZ2l0aHViOiBib29sZWFuO1xuICAgIG5wbTogYm9vbGVhbjtcbiAgfTtcbiAgZXNsaW50QmFzZT86IEVzbGludEV4dGVuc2lvbkJhc2U7XG4gIHNob3VsZFNraXBBcHBseWluZzogYm9vbGVhbjtcbiAgdmVyc2lvbnNUZXh0Pzogc3RyaW5nO1xuICBwYWNrYWdlSnNvbj86IFBhY2thZ2VKc29uO1xuICB3YmZ5SnNvbj86IFdiZnlKc29uO1xufVxuXG50eXBlIFdiZnlKc29uID0gei5pbmZlcjx0eXBlb2Ygd2JmeUpzb25TY2hlbWE+O1xuXG5jb25zdCB3YmZ5SnNvblNjaGVtYSA9IHoub2JqZWN0KHtcbiAgdHlwb3M6IHpcbiAgICAub2JqZWN0KHtcbiAgICAgIGFsbDogei5yZWNvcmQoei5zdHJpbmcoKSwgei5zdHJpbmcoKSkub3B0aW9uYWwoKSxcbiAgICAgIGRvYzogei5yZWNvcmQoei5zdHJpbmcoKSwgei5zdHJpbmcoKSkub3B0aW9uYWwoKSxcbiAgICAgIHRzOiB6LnJlY29yZCh6LnN0cmluZygpLCB6LnN0cmluZygpKS5vcHRpb25hbCgpLFxuICAgICAgdGV4dDogei5yZWNvcmQoei5zdHJpbmcoKSwgei5zdHJpbmcoKSkub3B0aW9uYWwoKSxcbiAgICB9KVxuICAgIC5vcHRpb25hbCgpLFxufSk7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZXRQYWNrYWdlQ29uZmlnKFxuICBkaXJQYXRoOiBzdHJpbmcsXG4gIHJvb3RDb25maWc/OiBQYWNrYWdlQ29uZmlnXG4pOiBQcm9taXNlPFBhY2thZ2VDb25maWcgfCB1bmRlZmluZWQ+IHtcbiAgY29uc3QgcGFja2FnZUpzb25QYXRoID0gcGF0aC5yZXNvbHZlKGRpclBhdGgsICdwYWNrYWdlLmpzb24nKTtcbiAgdHJ5IHtcbiAgICBjb25zdCBkb2VzQ29udGFpblBhY2thZ2VKc29uID0gZnMuZXhpc3RzU3luYyhwYWNrYWdlSnNvblBhdGgpO1xuICAgIGxldCBkZXBlbmRlbmNpZXM6IFBhY2thZ2VKc29uWydkZXBlbmRlbmNpZXMnXSA9IHt9O1xuICAgIGxldCBkZXZEZXBlbmRlbmNpZXM6IFBhY2thZ2VKc29uWydkZXZEZXBlbmRlbmNpZXMnXSA9IHt9O1xuICAgIGxldCBwYWNrYWdlSnNvbjogUGFja2FnZUpzb24gPSB7fTtcbiAgICBsZXQgZXNtUGFja2FnZSA9IGZhbHNlO1xuICAgIGlmIChkb2VzQ29udGFpblBhY2thZ2VKc29uKSB7XG4gICAgICBjb25zdCBwYWNrYWdlSnNvblRleHQgPSBmcy5yZWFkRmlsZVN5bmMocGFja2FnZUpzb25QYXRoLCAndXRmOCcpO1xuICAgICAgcGFja2FnZUpzb24gPSBKU09OLnBhcnNlKHBhY2thZ2VKc29uVGV4dCkgYXMgUGFja2FnZUpzb247XG4gICAgICBkZXBlbmRlbmNpZXMgPSBwYWNrYWdlSnNvbi5kZXBlbmRlbmNpZXMgPz8ge307XG4gICAgICBkZXZEZXBlbmRlbmNpZXMgPSBwYWNrYWdlSnNvbi5kZXZEZXBlbmRlbmNpZXMgPz8ge307XG4gICAgICBlc21QYWNrYWdlID0gcGFja2FnZUpzb24udHlwZSA9PT0gJ21vZHVsZSc7XG4gICAgfVxuXG4gICAgbGV0IHJlbGVhc2VCcmFuY2hlczogc3RyaW5nW10gPSBbXTtcbiAgICBsZXQgcmVsZWFzZVBsdWdpbnM6IHN0cmluZ1tdID0gW107XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJlbGVhc2VyY0pzb25QYXRoID0gcGF0aC5yZXNvbHZlKGRpclBhdGgsICcucmVsZWFzZXJjLmpzb24nKTtcbiAgICAgIGNvbnN0IGpzb24gPSBKU09OLnBhcnNlKGF3YWl0IGZzcC5yZWFkRmlsZShyZWxlYXNlcmNKc29uUGF0aCwgJ3V0ZjgnKSkgYXNcbiAgICAgICAgfCB7XG4gICAgICAgICAgICBicmFuY2hlczogc3RyaW5nW107XG4gICAgICAgICAgICBwbHVnaW5zPzogc3RyaW5nW11bXTtcbiAgICAgICAgICB9XG4gICAgICAgIHwgdW5kZWZpbmVkO1xuICAgICAgcmVsZWFzZUJyYW5jaGVzID0ganNvbj8uYnJhbmNoZXMgPz8gW107XG4gICAgICByZWxlYXNlUGx1Z2lucyA9IGpzb24/LnBsdWdpbnM/LmZsYXQoKSA/PyBbXTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIGRvIG5vdGhpbmdcbiAgICB9XG5cbiAgICBjb25zdCBpc1Jvb3QgPVxuICAgICAgcGF0aC5iYXNlbmFtZShwYXRoLnJlc29sdmUoZGlyUGF0aCwgJy4uJykpICE9PSAncGFja2FnZXMnIHx8XG4gICAgICAhZnMuZXhpc3RzU3luYyhwYXRoLnJlc29sdmUoZGlyUGF0aCwgJy4uJywgJy4uJywgJ3BhY2thZ2UuanNvbicpKTtcblxuICAgIGxldCByZXBvSW5mbzogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gfCB1bmRlZmluZWQ7XG4gICAgaWYgKGlzUm9vdCkge1xuICAgICAgcmVwb0luZm8gPSBhd2FpdCBmZXRjaFJlcG9JbmZvKGRpclBhdGgsIHBhY2thZ2VKc29uKTtcbiAgICB9XG5cbiAgICBsZXQgdmVyc2lvbnNUZXh0ID0gJyc7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGNvbnRlbnQgPSBhd2FpdCBmc3AucmVhZEZpbGUocGF0aC5yZXNvbHZlKGRpclBhdGgsICcudG9vbC12ZXJzaW9ucycpLCAndXRmOCcpO1xuICAgICAgdmVyc2lvbnNUZXh0ICs9IGNvbnRlbnQudHJpbSgpO1xuICAgIH0gY2F0Y2gge1xuICAgICAgLy8gZG8gbm90aGluZ1xuICAgIH1cbiAgICBmb3IgKGNvbnN0IFtwcmVmaXgsIG5hbWVdIG9mIFtcbiAgICAgIFsnamF2YScsICdqYXZhJ10sXG4gICAgICBbJ25vZGUnLCAnbm9kZWpzJ10sXG4gICAgICBbJ3B5dGhvbicsICdweXRob24nXSxcbiAgICBdKSB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBub2RlVmVyc2lvbkNvbnRlbnQgPSBhd2FpdCBmc3AucmVhZEZpbGUocGF0aC5yZXNvbHZlKGRpclBhdGgsIGAuJHtwcmVmaXh9LXZlcnNpb25gKSwgJ3V0ZjgnKTtcbiAgICAgICAgaWYgKHZlcnNpb25zVGV4dCkge1xuICAgICAgICAgIHZlcnNpb25zVGV4dCArPSAnXFxuJztcbiAgICAgICAgfVxuICAgICAgICB2ZXJzaW9uc1RleHQgKz0gYCR7bmFtZX0gJHtub2RlVmVyc2lvbkNvbnRlbnQudHJpbSgpfWA7XG4gICAgICB9IGNhdGNoIHtcbiAgICAgICAgLy8gZG8gbm90aGluZ1xuICAgICAgfVxuICAgIH1cblxuICAgIGxldCBkb2NrZXJmaWxlID0gJyc7XG4gICAgdHJ5IHtcbiAgICAgIGRvY2tlcmZpbGUgPSBhd2FpdCBmc3AucmVhZEZpbGUocGF0aC5yZXNvbHZlKGRpclBhdGgsICdEb2NrZXJmaWxlJyksICd1dGY4Jyk7XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBkbyBub3RoaW5nXG4gICAgfVxuXG4gICAgLy8gUmVhZCB3YmZ5Lmpzb25cbiAgICBjb25zdCB3YmZ5SnNvblBhdGggPSBwYXRoLnJlc29sdmUoZGlyUGF0aCwgJ3diZnkuanNvbicpO1xuICAgIGxldCB3YmZ5SnNvbjogV2JmeUpzb24gfCB1bmRlZmluZWQ7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHdiZnlKc29uVGV4dCA9IGF3YWl0IGZzcC5yZWFkRmlsZSh3YmZ5SnNvblBhdGgsICd1dGY4Jyk7XG4gICAgICB3YmZ5SnNvbiA9IHdiZnlKc29uU2NoZW1hLnBhcnNlKEpTT04ucGFyc2Uod2JmeUpzb25UZXh0KSk7XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBkbyBub3RoaW5nXG4gICAgfVxuXG4gICAgY29uc3QgcmVwb3NpdG9yeSA9IHJlcG9JbmZvPy5mdWxsX25hbWUgPyBgZ2l0aHViOiR7cmVwb0luZm8uZnVsbF9uYW1lIGFzIHN0cmluZ31gIDogdW5kZWZpbmVkO1xuICAgIGNvbnN0IGlzV2lsbEJvb3N0ZXJDb25maWdzID0gcGFja2FnZUpzb25QYXRoLmluY2x1ZGVzKGAke3BhdGguc2VwfXdpbGxib29zdGVyLWNvbmZpZ3NgKTtcbiAgICBjb25zdCBwYWNrYWdlTmFtZSA9IHR5cGVvZiBwYWNrYWdlSnNvbi5uYW1lID09PSAnc3RyaW5nJyA/IHBhY2thZ2VKc29uLm5hbWUgOiB1bmRlZmluZWQ7XG4gICAgY29uc3QgY29uZmlnOiBQYWNrYWdlQ29uZmlnID0ge1xuICAgICAgZGlyUGF0aCxcbiAgICAgIGRvY2tlcmZpbGUsXG4gICAgICBpc1Jvb3QsXG4gICAgICBpc1B1YmxpY1JlcG86IHJlcG9JbmZvPy5wcml2YXRlID09PSBmYWxzZSxcbiAgICAgIGlzUmVmZXJyZWRCeU90aGVyUmVwbzogISFwYWNrYWdlSnNvbi5maWxlcyxcbiAgICAgIHJlcG9zaXRvcnk6IHJlcG9JbmZvPy5mdWxsX25hbWUgPyBgZ2l0aHViOiR7cmVwb0luZm8uZnVsbF9uYW1lIGFzIHN0cmluZ31gIDogdW5kZWZpbmVkLFxuICAgICAgaXNXaWxsQm9vc3RlclJlcG86IEJvb2xlYW4oXG4gICAgICAgIHJlcG9zaXRvcnk/LnN0YXJ0c1dpdGgoJ2dpdGh1YjpXaWxsQm9vc3Rlci8nKSB8fCByZXBvc2l0b3J5Py5zdGFydHNXaXRoKCdnaXRodWI6V2lsbEJvb3N0ZXJMYWIvJylcbiAgICAgICksXG4gICAgICBpc0J1bjogcm9vdENvbmZpZz8uaXNCdW4gfHwgZnMuZXhpc3RzU3luYyhwYXRoLmpvaW4oZGlyUGF0aCwgJ2J1bmZpZy50b21sJykpLFxuICAgICAgaXNFc21QYWNrYWdlOiBlc21QYWNrYWdlLFxuICAgICAgaXNXaWxsQm9vc3RlckNvbmZpZ3MsXG4gICAgICBkb2VzQ29udGFpblN1YlBhY2thZ2VKc29uczogY29udGFpbnNBbnkoJ3BhY2thZ2VzLyoqL3BhY2thZ2UuanNvbicsIGRpclBhdGgpLFxuICAgICAgZG9lc0NvbnRhaW5Eb2NrZXJmaWxlOiAhIWRvY2tlcmZpbGUgfHwgZnMuZXhpc3RzU3luYyhwYXRoLnJlc29sdmUoZGlyUGF0aCwgJ2RvY2tlci1jb21wb3NlLnltbCcpKSxcbiAgICAgIGRvZXNDb250YWluR2VtZmlsZTogZnMuZXhpc3RzU3luYyhwYXRoLnJlc29sdmUoZGlyUGF0aCwgJ0dlbWZpbGUnKSksXG4gICAgICBkb2VzQ29udGFpbkdvTW9kOiBmcy5leGlzdHNTeW5jKHBhdGgucmVzb2x2ZShkaXJQYXRoLCAnZ28ubW9kJykpLFxuICAgICAgZG9lc0NvbnRhaW5QYWNrYWdlSnNvbjogZnMuZXhpc3RzU3luYyhwYXRoLnJlc29sdmUoZGlyUGF0aCwgJ3BhY2thZ2UuanNvbicpKSxcbiAgICAgIGRvZXNDb250YWluUG9ldHJ5TG9jazogZnMuZXhpc3RzU3luYyhwYXRoLnJlc29sdmUoZGlyUGF0aCwgJ3BvZXRyeS5sb2NrJykpLFxuICAgICAgZG9lc0NvbnRhaW5Qb21YbWw6IGZzLmV4aXN0c1N5bmMocGF0aC5yZXNvbHZlKGRpclBhdGgsICdwb20ueG1sJykpLFxuICAgICAgZG9lc0NvbnRhaW5QdWJzcGVjWWFtbDogZnMuZXhpc3RzU3luYyhwYXRoLnJlc29sdmUoZGlyUGF0aCwgJ3B1YnNwZWMueWFtbCcpKSxcbiAgICAgIGRvZXNDb250YWluVGVtcGxhdGVZYW1sOiBmcy5leGlzdHNTeW5jKHBhdGgucmVzb2x2ZShkaXJQYXRoLCAndGVtcGxhdGUueWFtbCcpKSxcbiAgICAgIGRvZXNDb250YWluVnNjb2RlU2V0dGluZ3NKc29uOiBmcy5leGlzdHNTeW5jKHBhdGgucmVzb2x2ZShkaXJQYXRoLCAnLnZzY29kZScsICdzZXR0aW5ncy5qc29uJykpLFxuICAgICAgZG9lc0NvbnRhaW5KYXZhU2NyaXB0OiBjb250YWluc0FueSgne2FwcCxzcmMsdGVzdCxzY3JpcHRzfS8qKi8qLntjanMsbWpzLGpzLGpzeH0nLCBkaXJQYXRoKSxcbiAgICAgIGRvZXNDb250YWluVHlwZVNjcmlwdDogY29udGFpbnNBbnkoJ3thcHAsc3JjLHRlc3Qsc2NyaXB0c30vKiovKi57Y3RzLG10cyx0cyx0c3h9JywgZGlyUGF0aCksXG4gICAgICBkb2VzQ29udGFpbkpzeE9yVHN4OiBjb250YWluc0FueSgne2FwcCxzcmMsdGVzdH0vKiovKi57dCxqfXN4JywgZGlyUGF0aCksXG4gICAgICBkb2VzQ29udGFpbkphdmFTY3JpcHRJblBhY2thZ2VzOiBjb250YWluc0FueSgncGFja2FnZXMvKiove2FwcCxzcmMsdGVzdCxzY3JpcHRzfS8qKi8qLntjanMsbWpzLGpzLGpzeH0nLCBkaXJQYXRoKSxcbiAgICAgIGRvZXNDb250YWluVHlwZVNjcmlwdEluUGFja2FnZXM6IGNvbnRhaW5zQW55KCdwYWNrYWdlcy8qKi97YXBwLHNyYyx0ZXN0LHNjcmlwdHN9LyoqLyoue2N0cyxtdHMsdHMsdHN4fScsIGRpclBhdGgpLFxuICAgICAgZG9lc0NvbnRhaW5Kc3hPclRzeEluUGFja2FnZXM6IGNvbnRhaW5zQW55KCdwYWNrYWdlcy8qKi97YXBwLHNyYyx0ZXN0fS8qKi8qLnt0LGp9c3gnLCBkaXJQYXRoKSxcbiAgICAgIGhhc1N0YXJ0VGVzdDogISFwYWNrYWdlSnNvbi5zY3JpcHRzPy5bJ3N0YXJ0LXRlc3QnXSxcbiAgICAgIGRlcGVuZGluZzoge1xuICAgICAgICBibGl0ejogISFkZXBlbmRlbmNpZXMuYmxpdHosXG4gICAgICAgIGZpcmViYXNlOiAhIWRldkRlcGVuZGVuY2llc1snZmlyZWJhc2UtdG9vbHMnXSxcbiAgICAgICAgZ2VuSTE4blRzOiAhIWRldkRlcGVuZGVuY2llc1snZ2VuLWkxOG4tdHMnXSxcbiAgICAgICAgbGl0ZXN0cmVhbTogZG9ja2VyZmlsZS5pbmNsdWRlcygnaW5zdGFsbC1saXRlc3RyZWFtLnNoJyksXG4gICAgICAgIHJlYWN0OiAhIWRlcGVuZGVuY2llcy5yZWFjdCxcbiAgICAgICAgbmV4dDogISFkZXBlbmRlbmNpZXMubmV4dCxcbiAgICAgICAgcGxheXdyaWdodFRlc3Q6XG4gICAgICAgICAgISFkZXBlbmRlbmNpZXNbJ0BwbGF5d3JpZ2h0L3Rlc3QnXSB8fCAhIWRldkRlcGVuZGVuY2llc1snQHBsYXl3cmlnaHQvdGVzdCddIHx8ICEhZGV2RGVwZW5kZW5jaWVzLnBsYXl3cmlnaHQsXG4gICAgICAgIHByaXNtYTogISFkZXBlbmRlbmNpZXNbJ0BwcmlzbWEvY2xpZW50J10gfHwgISFkZXZEZXBlbmRlbmNpZXMucHJpc21hLFxuICAgICAgICBweXJpZ2h0OiAhIWRldkRlcGVuZGVuY2llcy5weXJpZ2h0LFxuICAgICAgICByZWFjdE5hdGl2ZTogISFkZXBlbmRlbmNpZXNbJ3JlYWN0LW5hdGl2ZSddLFxuICAgICAgICBzZW1hbnRpY1JlbGVhc2U6ICEhKFxuICAgICAgICAgIGRldkRlcGVuZGVuY2llc1snc2VtYW50aWMtcmVsZWFzZSddIHx8XG4gICAgICAgICAgcmVsZWFzZUJyYW5jaGVzLmxlbmd0aCA+IDAgfHxcbiAgICAgICAgICByZWxlYXNlUGx1Z2lucy5sZW5ndGggPiAwXG4gICAgICAgICksXG4gICAgICAgIHN0b3J5Ym9vazogISFkZXZEZXBlbmRlbmNpZXNbJ0BzdG9yeWJvb2svcmVhY3QnXSxcbiAgICAgICAgd2I6ICEhZGVwZW5kZW5jaWVzWydAd2lsbGJvb3N0ZXIvd2InXSB8fCAhIWRldkRlcGVuZGVuY2llc1snQHdpbGxib29zdGVyL3diJ10sXG4gICAgICB9LFxuICAgICAgcmVsZWFzZToge1xuICAgICAgICBicmFuY2hlczogcmVsZWFzZUJyYW5jaGVzLFxuICAgICAgICBnaXRodWI6IHJlbGVhc2VQbHVnaW5zLmluY2x1ZGVzKCdAc2VtYW50aWMtcmVsZWFzZS9naXRodWInKSxcbiAgICAgICAgbnBtOiByZWxlYXNlUGx1Z2lucy5pbmNsdWRlcygnQHNlbWFudGljLXJlbGVhc2UvbnBtJyksXG4gICAgICB9LFxuICAgICAgc2hvdWxkU2tpcEFwcGx5aW5nOiBpc1dpbGxCb29zdGVyQ29uZmlncyAmJiBwYWNrYWdlTmFtZT8uc3RhcnRzV2l0aCgnQHdpbGxib29zdGVyL2VzbGludC1jb25maWctJykgPT09IHRydWUsXG4gICAgICB2ZXJzaW9uc1RleHQsXG4gICAgICBwYWNrYWdlSnNvbixcbiAgICAgIHdiZnlKc29uLFxuICAgIH07XG4gICAgaWYgKCFjb25maWcuaXNCdW4pIHtcbiAgICAgIGNvbmZpZy5lc2xpbnRCYXNlID0gZ2V0RXNsaW50RXh0ZW5zaW9uQmFzZShjb25maWcpO1xuICAgIH1cbiAgICBpZiAoXG4gICAgICBjb25maWcuZG9lc0NvbnRhaW5HZW1maWxlIHx8XG4gICAgICBjb25maWcuZG9lc0NvbnRhaW5Hb01vZCB8fFxuICAgICAgY29uZmlnLmRvZXNDb250YWluUGFja2FnZUpzb24gfHxcbiAgICAgIGNvbmZpZy5kb2VzQ29udGFpblBvZXRyeUxvY2sgfHxcbiAgICAgIGNvbmZpZy5kb2VzQ29udGFpblBvbVhtbCB8fFxuICAgICAgY29uZmlnLmRvZXNDb250YWluUHVic3BlY1lhbWwgfHxcbiAgICAgIGNvbmZpZy5kb2VzQ29udGFpblRlbXBsYXRlWWFtbFxuICAgICkge1xuICAgICAgcmV0dXJuIGNvbmZpZztcbiAgICB9XG4gIH0gY2F0Y2gge1xuICAgIC8vIGRvIG5vdGhpbmdcbiAgfVxufVxuXG5mdW5jdGlvbiBjb250YWluc0FueShwYXR0ZXJuOiBzdHJpbmcsIGRpclBhdGg6IHN0cmluZyk6IGJvb2xlYW4ge1xuICByZXR1cm4gZmcuZ2xvYlN5bmMocGF0dGVybiwgeyBkb3Q6IHRydWUsIGN3ZDogZGlyUGF0aCwgaWdub3JlOiBnbG9iSWdub3JlIH0pLmxlbmd0aCA+IDA7XG59XG5cbmV4cG9ydCB0eXBlIEVzbGludEV4dGVuc2lvbkJhc2UgPVxuICB8ICdAd2lsbGJvb3N0ZXIvZXNsaW50LWNvbmZpZy10cy1yZWFjdCdcbiAgfCAnQHdpbGxib29zdGVyL2VzbGludC1jb25maWctdHMnXG4gIHwgJ0B3aWxsYm9vc3Rlci9lc2xpbnQtY29uZmlnLWpzLXJlYWN0J1xuICB8ICdAd2lsbGJvb3N0ZXIvZXNsaW50LWNvbmZpZy1qcydcbiAgfCAnQHdpbGxib29zdGVyL2VzbGludC1jb25maWctbmV4dCc7XG5cbmZ1bmN0aW9uIGdldEVzbGludEV4dGVuc2lvbkJhc2UoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogRXNsaW50RXh0ZW5zaW9uQmFzZSB8IHVuZGVmaW5lZCB7XG4gIGlmIChjb25maWcuZGVwZW5kaW5nLm5leHQpIHtcbiAgICByZXR1cm4gJ0B3aWxsYm9vc3Rlci9lc2xpbnQtY29uZmlnLW5leHQnO1xuICB9IGVsc2UgaWYgKGNvbmZpZy5kb2VzQ29udGFpblR5cGVTY3JpcHQpIHtcbiAgICByZXR1cm4gY29uZmlnLmRvZXNDb250YWluSnN4T3JUc3ggPyAnQHdpbGxib29zdGVyL2VzbGludC1jb25maWctdHMtcmVhY3QnIDogJ0B3aWxsYm9vc3Rlci9lc2xpbnQtY29uZmlnLXRzJztcbiAgfSBlbHNlIHtcbiAgICBpZiAoY29uZmlnLmRvZXNDb250YWluSnN4T3JUc3gpIHtcbiAgICAgIHJldHVybiAnQHdpbGxib29zdGVyL2VzbGludC1jb25maWctanMtcmVhY3QnO1xuICAgIH0gZWxzZSBpZiAoY29uZmlnLmRvZXNDb250YWluSmF2YVNjcmlwdCkge1xuICAgICAgcmV0dXJuICdAd2lsbGJvb3N0ZXIvZXNsaW50LWNvbmZpZy1qcyc7XG4gICAgfVxuICB9XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGZldGNoUmVwb0luZm8oZGlyUGF0aDogc3RyaW5nLCBwYWNrYWdlSnNvbjogUGFja2FnZUpzb24pOiBQcm9taXNlPFJlY29yZDxzdHJpbmcsIHVua25vd24+IHwgdW5kZWZpbmVkPiB7XG4gIGNvbnN0IGdpdCA9IHNpbXBsZUdpdChkaXJQYXRoKTtcbiAgY29uc3QgcmVtb3RlcyA9IGF3YWl0IGdpdC5nZXRSZW1vdGVzKHRydWUpO1xuICBjb25zdCBvcmlnaW4gPSByZW1vdGVzLmZpbmQoKHIpID0+IHIubmFtZSA9PT0gJ29yaWdpbicpO1xuICBjb25zdCByZW1vdGVVcmwgPSBvcmlnaW4/LnJlZnMuZmV0Y2ggPz8gb3JpZ2luPy5yZWZzLnB1c2g7XG4gIGlmICh0eXBlb2YgcmVtb3RlVXJsID09PSAnc3RyaW5nJykge1xuICAgIGNvbnN0IGpzb24gPSBhd2FpdCByZXF1ZXN0UmVwb0luZm8ocmVtb3RlVXJsKTtcbiAgICBpZiAoanNvbikgcmV0dXJuIGpzb247XG4gIH1cblxuICBjb25zdCB1cmwgPSB0eXBlb2YgcGFja2FnZUpzb24ucmVwb3NpdG9yeSA9PT0gJ3N0cmluZycgPyBwYWNrYWdlSnNvbi5yZXBvc2l0b3J5IDogcGFja2FnZUpzb24ucmVwb3NpdG9yeT8udXJsO1xuICBpZiAodXJsKSB7XG4gICAgY29uc3QganNvbiA9IGF3YWl0IHJlcXVlc3RSZXBvSW5mbyh1cmwpO1xuICAgIGlmIChqc29uICYmIGpzb24ubWVzc2FnZSAhPT0gJ05vdCBGb3VuZCcpIHJldHVybiBqc29uO1xuICB9XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHJlcXVlc3RSZXBvSW5mbyh1cmxPckZ1bGxOYW1lOiBzdHJpbmcpOiBQcm9taXNlPFJlY29yZDxzdHJpbmcsIHVua25vd24+IHwgdW5kZWZpbmVkPiB7XG4gIGNvbnN0IFtvcmcsIG5hbWVdID0gZ2l0SHViVXRpbC5nZXRPcmdBbmROYW1lKHVybE9yRnVsbE5hbWUpO1xuICBpZiAoIW9yZyB8fCAhbmFtZSkgcmV0dXJuO1xuXG4gIGNvbnN0IHJldCA9IHsgZnVsbF9uYW1lOiBgJHtvcmd9LyR7bmFtZX1gIH07XG4gIHRyeSB7XG4gICAgLy8gTWV0YWRhdGEgcGVybWlzc2lvblxuICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZ2V0T2N0b2tpdCgpLnJlcXVlc3QoJ0dFVCAvcmVwb3Mve293bmVyfS97cmVwb30nLCB7XG4gICAgICBvd25lcjogb3JnLFxuICAgICAgcmVwbzogbmFtZSxcbiAgICB9KTtcbiAgICBPYmplY3QuYXNzaWduKHJldCwgcmVzcG9uc2UuZGF0YSk7XG4gIH0gY2F0Y2gge1xuICAgIC8vIGRvIG5vdGhpbmdcbiAgfVxuICByZXR1cm4gcmV0O1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHsgaWdub3JlRXJyb3JBc3luYyB9IGZyb20gJ0B3aWxsYm9vc3Rlci9zaGFyZWQtbGliJztcbmltcG9ydCBmZyBmcm9tICdmYXN0LWdsb2InO1xuaW1wb3J0IHlhcmdzIGZyb20gJ3lhcmdzJztcblxuaW1wb3J0IHsgZml4RG9ja2VyZmlsZSB9IGZyb20gJy4vZml4ZXJzL2RvY2tlcmZpbGUuanMnO1xuaW1wb3J0IHsgZml4TmV4dENvbmZpZ0pzb24gfSBmcm9tICcuL2ZpeGVycy9uZXh0Q29uZmlnLmpzJztcbmltcG9ydCB7IGZpeFBsYXl3cmlnaHRDb25maWcgfSBmcm9tICcuL2ZpeGVycy9wbGF5d3JpZ2h0Q29uZmlnLmpzJztcbmltcG9ydCB7IGZpeFByaXNtYUVudkZpbGVzIH0gZnJvbSAnLi9maXhlcnMvcHJpc21hLmpzJztcbmltcG9ydCB7IGZpeFRlc3REaXJlY3Rvcmllc1VwZGF0aW5nUGFja2FnZUpzb24gfSBmcm9tICcuL2ZpeGVycy90ZXN0RGlyZWN0b3J5LmpzJztcbmltcG9ydCB7IGZpeFR5cGVEZWZpbml0aW9ucyB9IGZyb20gJy4vZml4ZXJzL3R5cGVEZWZpbml0aW9uLmpzJztcbmltcG9ydCB7IGZpeFR5cG9zIH0gZnJvbSAnLi9maXhlcnMvdHlwb3MuanMnO1xuaW1wb3J0IHsgZ2VuZXJhdGVBZ2VudEluc3RydWN0aW9ucyB9IGZyb20gJy4vZ2VuZXJhdG9ycy9hZ2VudHMuanMnO1xuaW1wb3J0IHsgZ2VuZXJhdGVUb29sVmVyc2lvbnMgfSBmcm9tICcuL2dlbmVyYXRvcnMvYXNkZi5qcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZUJpb21lSnNvbmMgfSBmcm9tICcuL2dlbmVyYXRvcnMvYmlvbWUuanMnO1xuaW1wb3J0IHsgZ2VuZXJhdGVCdW5maWdUb21sIH0gZnJvbSAnLi9nZW5lcmF0b3JzL2J1bmZpZy5qcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZURvY2tlcmlnbm9yZSB9IGZyb20gJy4vZ2VuZXJhdG9ycy9kb2NrZXJpZ25vcmUuanMnO1xuaW1wb3J0IHsgZ2VuZXJhdGVFZGl0b3Jjb25maWcgfSBmcm9tICcuL2dlbmVyYXRvcnMvZWRpdG9yY29uZmlnLmpzJztcbmltcG9ydCB7IGdlbmVyYXRlRXNsaW50cmMgfSBmcm9tICcuL2dlbmVyYXRvcnMvZXNsaW50Q29uZmlnLmpzJztcbmltcG9ydCB7IGdlbmVyYXRlR2VtaW5pQ29uZmlnIH0gZnJvbSAnLi9nZW5lcmF0b3JzL2dlbWluaUNvbmZpZy5qcyc7XG5pbXBvcnQgeyByZW1vdmVHZW1pbmlTZXR0aW5ncyB9IGZyb20gJy4vZ2VuZXJhdG9ycy9nZW1pbmlTZXR0aW5ncy5qcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZUdpdGF0dHJpYnV0ZXMgfSBmcm9tICcuL2dlbmVyYXRvcnMvZ2l0YXR0cmlidXRlcy5qcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZUdpdGlnbm9yZSB9IGZyb20gJy4vZ2VuZXJhdG9ycy9naXRpZ25vcmUuanMnO1xuaW1wb3J0IHsgZ2VuZXJhdGVIdXNreXJjVXBkYXRpbmdQYWNrYWdlSnNvbiB9IGZyb20gJy4vZ2VuZXJhdG9ycy9odXNreXJjLmpzJztcbmltcG9ydCB7IGdlbmVyYXRlSWRlYVNldHRpbmdzIH0gZnJvbSAnLi9nZW5lcmF0b3JzL2lkZWEuanMnO1xuaW1wb3J0IHsgZ2VuZXJhdGVMZWZ0aG9va1VwZGF0aW5nUGFja2FnZUpzb24gfSBmcm9tICcuL2dlbmVyYXRvcnMvbGVmdGhvb2suanMnO1xuaW1wb3J0IHsgZ2VuZXJhdGVMaW50c3RhZ2VkcmMgfSBmcm9tICcuL2dlbmVyYXRvcnMvbGludHN0YWdlZHJjLmpzJztcbmltcG9ydCB7IGdlbmVyYXRlUGFja2FnZUpzb24gfSBmcm9tICcuL2dlbmVyYXRvcnMvcGFja2FnZUpzb24uanMnO1xuaW1wb3J0IHsgZ2VuZXJhdGVQcmV0dGllcmlnbm9yZSB9IGZyb20gJy4vZ2VuZXJhdG9ycy9wcmV0dGllcmlnbm9yZS5qcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZVB5cmlnaHRDb25maWdKc29uIH0gZnJvbSAnLi9nZW5lcmF0b3JzL3B5cmlnaHRDb25maWcuanMnO1xuaW1wb3J0IHsgZ2VuZXJhdGVSZWFkbWUgfSBmcm9tICcuL2dlbmVyYXRvcnMvcmVhZG1lLmpzJztcbmltcG9ydCB7IGdlbmVyYXRlUmVsZWFzZXJjIH0gZnJvbSAnLi9nZW5lcmF0b3JzL3JlbGVhc2VyYy5qcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZVJlbm92YXRlSnNvbiB9IGZyb20gJy4vZ2VuZXJhdG9ycy9yZW5vdmF0ZUpzb24uanMnO1xuaW1wb3J0IHsgZ2VuZXJhdGVUc2NvbmZpZyB9IGZyb20gJy4vZ2VuZXJhdG9ycy90c2NvbmZpZy5qcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZVZzY29kZVNldHRpbmdzIH0gZnJvbSAnLi9nZW5lcmF0b3JzL3ZzY29kZVNldHRpbmdzLmpzJztcbmltcG9ydCB7IGdlbmVyYXRlV29ya2Zsb3dzLCBpc1JldXNhYmxlV29ya2Zsb3dzUmVwbyB9IGZyb20gJy4vZ2VuZXJhdG9ycy93b3JrZmxvdy5qcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZVlhcm5yY1ltbCB9IGZyb20gJy4vZ2VuZXJhdG9ycy95YXJucmMuanMnO1xuaW1wb3J0IHsgc2V0dXBMYWJlbHMgfSBmcm9tICcuL2dpdGh1Yi9sYWJlbC5qcyc7XG5pbXBvcnQgeyBzZXR1cFNlY3JldHMgfSBmcm9tICcuL2dpdGh1Yi9zZWNyZXQuanMnO1xuaW1wb3J0IHsgc2V0dXBHaXRIdWJTZXR0aW5ncyB9IGZyb20gJy4vZ2l0aHViL3NldHRpbmdzLmpzJztcbmltcG9ydCB7IGdlbmVyYXRlR2l0SHViVGVtcGxhdGVzIH0gZnJvbSAnLi9naXRodWIvdGVtcGxhdGUuanMnO1xuaW1wb3J0IHsgb3B0aW9ucyB9IGZyb20gJy4vb3B0aW9ucy5qcyc7XG5pbXBvcnQgeyBnZXRQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5pbXBvcnQgeyBzcGF3blN5bmMgfSBmcm9tICcuL3V0aWxzL3NwYXduVXRpbC5qcyc7XG5cbmFzeW5jIGZ1bmN0aW9uIG1haW4oKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IGFyZ3YgPSBhd2FpdCB5YXJncyhwcm9jZXNzLmFyZ3Yuc2xpY2UoMikpXG4gICAgLmNvbW1hbmQoJyQwIFtwYXRocy4uXScsICdNYWtlIGEgZ2l2ZW4gcHJvamVjdCBmb2xsb3cgdGhlIFdpbGxCb29zdGVyIHN0YW5kYXJkJywgKHlhcmdzKSA9PiB7XG4gICAgICB5YXJncy5wb3NpdGlvbmFsKCdwYXRocycsIHtcbiAgICAgICAgZGVzY3JpYmU6ICdwcm9qZWN0IHBhdGhzIHRvIGJlIHdiZmllZCcsXG4gICAgICAgIGFycmF5OiB0cnVlLFxuICAgICAgICB0eXBlOiAnc3RyaW5nJyxcbiAgICAgICAgZGVmYXVsdDogWycuJ10sXG4gICAgICB9KTtcbiAgICB9KVxuICAgIC5vcHRpb25zKHtcbiAgICAgIGVudjoge1xuICAgICAgICBkZXNjcmlwdGlvbjogJ1VwbG9hZCBlbnZpcm9ubWVudCB2YXJpYWJsZXMgYXMgc2VjcmV0cyB0byBHaXRIdWInLFxuICAgICAgICB0eXBlOiAnYm9vbGVhbicsXG4gICAgICAgIGRlZmF1bHQ6IGZhbHNlLFxuICAgICAgICBhbGlhczogJ2UnLFxuICAgICAgfSxcbiAgICAgIHNraXBEZXBzOiB7XG4gICAgICAgIGRlc2NyaXB0aW9uOiAnU2tpcCBkZXBlbmRlbmN5IGluc3RhbGxhdGlvbicsXG4gICAgICAgIHR5cGU6ICdib29sZWFuJyxcbiAgICAgICAgZGVmYXVsdDogZmFsc2UsXG4gICAgICAgIGFsaWFzOiAnZCcsXG4gICAgICB9LFxuICAgICAgdmVyYm9zZToge1xuICAgICAgICBkZXNjcmlwdGlvbjogJ1doZXRoZXIgb3Igbm90IHRvIGVuYWJsZSB2ZXJib3NlIG1vZGUnLFxuICAgICAgICB0eXBlOiAnYm9vbGVhbicsXG4gICAgICAgIGRlZmF1bHQ6IGZhbHNlLFxuICAgICAgICBhbGlhczogJ3YnLFxuICAgICAgfSxcbiAgICB9KVxuICAgIC52ZXJzaW9uKGdldFZlcnNpb24oKSlcbiAgICAuc3RyaWN0KCkuYXJndjtcbiAgb3B0aW9ucy5pc1ZlcmJvc2UgPSBhcmd2LnZlcmJvc2U7XG4gIG9wdGlvbnMuZG9lc1VwbG9hZEVudlZhcnMgPSBhcmd2LmVudjtcblxuICBmb3IgKGNvbnN0IHJvb3REaXJQYXRoIG9mIGFyZ3YucGF0aHMgYXMgc3RyaW5nW10pIHtcbiAgICAvLyBDbGVhbiB1cCBsb2NrIGZpbGVzIGFuZCBub2RlX21vZHVsZXMgZGlyZWN0b3JpZXNcbiAgICBmcy5ybVN5bmMocGF0aC5qb2luKHJvb3REaXJQYXRoLCAnYnVuLmxvY2snKSwgeyBmb3JjZTogdHJ1ZSB9KTtcbiAgICBmcy5ybVN5bmMocGF0aC5qb2luKHJvb3REaXJQYXRoLCAneWFybi5sb2NrJyksIHsgZm9yY2U6IHRydWUgfSk7XG4gICAgcmVtb3ZlTm9kZU1vZHVsZXNEaXJlY3Rvcmllcyhyb290RGlyUGF0aCk7XG5cbiAgICBjb25zdCBwYWNrYWdlc0RpclBhdGggPSBwYXRoLmpvaW4ocm9vdERpclBhdGgsICdwYWNrYWdlcycpO1xuICAgIGNvbnN0IGRpcmVudHMgPSAoYXdhaXQgaWdub3JlRXJyb3JBc3luYygoKSA9PiBmcy5wcm9taXNlcy5yZWFkZGlyKHBhY2thZ2VzRGlyUGF0aCwgeyB3aXRoRmlsZVR5cGVzOiB0cnVlIH0pKSkgPz8gW107XG4gICAgY29uc3Qgc3ViRGlyUGF0aHMgPSBkaXJlbnRzLmZpbHRlcigoZCkgPT4gZC5pc0RpcmVjdG9yeSgpKS5tYXAoKGQpID0+IHBhdGguam9pbihwYWNrYWdlc0RpclBhdGgsIGQubmFtZSkpO1xuXG4gICAgYXdhaXQgZml4VGVzdERpcmVjdG9yaWVzVXBkYXRpbmdQYWNrYWdlSnNvbihbcm9vdERpclBhdGgsIC4uLnN1YkRpclBhdGhzXSk7XG5cbiAgICBjb25zdCByb290Q29uZmlnID0gYXdhaXQgZ2V0UGFja2FnZUNvbmZpZyhyb290RGlyUGF0aCk7XG4gICAgY29uc29sZS5sb2coJ3Jvb3RDb25maWc6Jywgcm9vdENvbmZpZyk7XG4gICAgaWYgKCFyb290Q29uZmlnKSB7XG4gICAgICBjb25zb2xlLmVycm9yKGB0aGVyZSBpcyBubyB2YWxpZCBwYWNrYWdlLmpzb24gaW4gJHtyb290RGlyUGF0aH1gKTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBjb25zdCBhYmJyZXZpYXRpb25Qcm9taXNlID0gZml4VHlwb3Mocm9vdENvbmZpZyk7XG5cbiAgICBjb25zdCBudWxsYWJsZVN1YlBhY2thZ2VDb25maWdzID0gYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgICBzdWJEaXJQYXRocy5tYXAoKHN1YkRpclBhdGgpID0+IGdldFBhY2thZ2VDb25maWcoc3ViRGlyUGF0aCwgcm9vdENvbmZpZykpXG4gICAgKTtcbiAgICBjb25zdCBzdWJQYWNrYWdlQ29uZmlncyA9IG51bGxhYmxlU3ViUGFja2FnZUNvbmZpZ3MuZmlsdGVyKChjb25maWcpID0+ICEhY29uZmlnKTtcbiAgICBjb25zdCBhbGxQYWNrYWdlQ29uZmlncyA9IFtyb290Q29uZmlnLCAuLi5zdWJQYWNrYWdlQ29uZmlnc107XG5cbiAgICBpZiAob3B0aW9ucy5pc1ZlcmJvc2UpIHtcbiAgICAgIGZvciAoY29uc3QgY29uZmlnIG9mIGFsbFBhY2thZ2VDb25maWdzKSB7XG4gICAgICAgIGNvbnNvbGUuaW5mbyhjb25maWcpO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIEluc3RhbGwgdG9vbHMgdmlhIGFzZGYgYXQgZmlyc3RcbiAgICBhd2FpdCBnZW5lcmF0ZVRvb2xWZXJzaW9ucyhyb290Q29uZmlnKTtcbiAgICAvLyBJbnN0YWxsIHlhcm4gYmVycnlcbiAgICBhd2FpdCBnZW5lcmF0ZVlhcm5yY1ltbChyb290Q29uZmlnKTtcbiAgICBpZiAocm9vdENvbmZpZy5pc0J1bikge1xuICAgICAgYXdhaXQgZ2VuZXJhdGVCdW5maWdUb21sKHJvb3RDb25maWcpO1xuICAgIH1cblxuICAgIGNvbnN0IHNob3VsZFJ1bldvcmtmbG93cyA9XG4gICAgICAhaXNSZXVzYWJsZVdvcmtmbG93c1JlcG8ocm9vdENvbmZpZy5yZXBvc2l0b3J5KSAmJlxuICAgICAgKHJvb3RDb25maWcucmVwb3NpdG9yeT8uc3RhcnRzV2l0aCgnZ2l0aHViOldpbGxCb29zdGVyLycpIHx8XG4gICAgICAgIHJvb3RDb25maWcucmVwb3NpdG9yeT8uc3RhcnRzV2l0aCgnZ2l0aHViOldpbGxCb29zdGVyTGFiLycpKTtcbiAgICBhd2FpdCBQcm9taXNlLmFsbChbXG4gICAgICBmaXhEb2NrZXJmaWxlKHJvb3RDb25maWcpLFxuICAgICAgZml4UHJpc21hRW52RmlsZXMocm9vdENvbmZpZyksXG4gICAgICBhYmJyZXZpYXRpb25Qcm9taXNlLnRoZW4oKCkgPT4gZ2VuZXJhdGVSZWFkbWUocm9vdENvbmZpZykpLFxuICAgICAgZ2VuZXJhdGVBZ2VudEluc3RydWN0aW9ucyhyb290Q29uZmlnLCBhbGxQYWNrYWdlQ29uZmlncyksXG4gICAgICBnZW5lcmF0ZURvY2tlcmlnbm9yZShyb290Q29uZmlnKSxcbiAgICAgIGdlbmVyYXRlRWRpdG9yY29uZmlnKHJvb3RDb25maWcpLFxuICAgICAgZ2VuZXJhdGVHZW1pbmlDb25maWcocm9vdENvbmZpZyksXG4gICAgICByZW1vdmVHZW1pbmlTZXR0aW5ncyhyb290Q29uZmlnKSxcbiAgICAgIGdlbmVyYXRlR2l0YXR0cmlidXRlcyhyb290Q29uZmlnKSxcbiAgICAgIGdlbmVyYXRlR2l0SHViVGVtcGxhdGVzKHJvb3RDb25maWcpLFxuICAgICAgZ2VuZXJhdGVJZGVhU2V0dGluZ3Mocm9vdENvbmZpZyksXG4gICAgICBnZW5lcmF0ZVJlbm92YXRlSnNvbihyb290Q29uZmlnKSxcbiAgICAgIGdlbmVyYXRlUmVsZWFzZXJjKHJvb3RDb25maWcpLFxuICAgICAgLi4uKHNob3VsZFJ1bldvcmtmbG93cyA/IFtnZW5lcmF0ZVdvcmtmbG93cyhyb290Q29uZmlnKV0gOiBbXSksXG4gICAgICBzZXR1cExhYmVscyhyb290Q29uZmlnKSxcbiAgICAgIHNldHVwU2VjcmV0cyhyb290Q29uZmlnKSxcbiAgICAgIHNldHVwR2l0SHViU2V0dGluZ3Mocm9vdENvbmZpZyksXG4gICAgICByb290Q29uZmlnLmlzQnVuXG4gICAgICAgID8gZ2VuZXJhdGVIdXNreXJjVXBkYXRpbmdQYWNrYWdlSnNvbihyb290Q29uZmlnKS50aGVuKCgpID0+IGdlbmVyYXRlTGVmdGhvb2tVcGRhdGluZ1BhY2thZ2VKc29uKHJvb3RDb25maWcpKVxuICAgICAgICA6IGdlbmVyYXRlSHVza3lyY1VwZGF0aW5nUGFja2FnZUpzb24ocm9vdENvbmZpZyksXG4gICAgICBnZW5lcmF0ZUxpbnRzdGFnZWRyYyhyb290Q29uZmlnKSxcbiAgICBdKTtcbiAgICBhd2FpdCBwcm9taXNlUG9vbC5wcm9taXNlQWxsKCk7XG5cbiAgICBjb25zdCBwcm9taXNlczogUHJvbWlzZTx2b2lkPltdID0gW107XG4gICAgZm9yIChjb25zdCBjb25maWcgb2YgYWxsUGFja2FnZUNvbmZpZ3MpIHtcbiAgICAgIGlmIChjb25maWcuc2hvdWxkU2tpcEFwcGx5aW5nKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgaWYgKGNvbmZpZy5kb2VzQ29udGFpblR5cGVTY3JpcHQgfHwgY29uZmlnLmRvZXNDb250YWluVHlwZVNjcmlwdEluUGFja2FnZXMpIHtcbiAgICAgICAgcHJvbWlzZXMucHVzaChmaXhUeXBlRGVmaW5pdGlvbnMoY29uZmlnLCBjb25maWcuaXNSb290ID8gYWxsUGFja2FnZUNvbmZpZ3MgOiBbY29uZmlnXSkpO1xuICAgICAgfVxuICAgICAgaWYgKGNvbmZpZy5kZXBlbmRpbmcucGxheXdyaWdodFRlc3QpIHtcbiAgICAgICAgcHJvbWlzZXMucHVzaChmaXhQbGF5d3JpZ2h0Q29uZmlnKGNvbmZpZykpO1xuICAgICAgfVxuICAgICAgaWYgKGNvbmZpZy5kZXBlbmRpbmcubmV4dCkge1xuICAgICAgICBwcm9taXNlcy5wdXNoKGZpeE5leHRDb25maWdKc29uKGNvbmZpZykpO1xuICAgICAgfVxuICAgICAgYXdhaXQgZ2VuZXJhdGVHaXRpZ25vcmUoY29uZmlnLCByb290Q29uZmlnKTtcbiAgICAgIGF3YWl0IHByb21pc2VQb29sLnByb21pc2VBbGwoKTtcbiAgICAgIGlmICghY29uZmlnLmlzUm9vdCAmJiAhY29uZmlnLmRvZXNDb250YWluUGFja2FnZUpzb24pIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBhd2FpdCBnZW5lcmF0ZVByZXR0aWVyaWdub3JlKGNvbmZpZyk7XG4gICAgICBhd2FpdCBnZW5lcmF0ZVBhY2thZ2VKc29uKGNvbmZpZywgcm9vdENvbmZpZywgYXJndi5za2lwRGVwcyk7XG5cbiAgICAgIHByb21pc2VzLnB1c2goZ2VuZXJhdGVMaW50c3RhZ2VkcmMoY29uZmlnKSk7XG4gICAgICBpZiAoY29uZmlnLmRvZXNDb250YWluVnNjb2RlU2V0dGluZ3NKc29uICYmIGNvbmZpZy5kb2VzQ29udGFpblBhY2thZ2VKc29uKSB7XG4gICAgICAgIHByb21pc2VzLnB1c2goZ2VuZXJhdGVWc2NvZGVTZXR0aW5ncyhjb25maWcpKTtcbiAgICAgIH1cbiAgICAgIGlmIChjb25maWcuZG9lc0NvbnRhaW5UeXBlU2NyaXB0IHx8IGNvbmZpZy5kb2VzQ29udGFpblR5cGVTY3JpcHRJblBhY2thZ2VzKSB7XG4gICAgICAgIHByb21pc2VzLnB1c2goZ2VuZXJhdGVUc2NvbmZpZyhjb25maWcpKTtcbiAgICAgIH1cbiAgICAgIGlmIChcbiAgICAgICAgY29uZmlnLmRvZXNDb250YWluSmF2YVNjcmlwdCB8fFxuICAgICAgICBjb25maWcuZG9lc0NvbnRhaW5KYXZhU2NyaXB0SW5QYWNrYWdlcyB8fFxuICAgICAgICBjb25maWcuZG9lc0NvbnRhaW5UeXBlU2NyaXB0IHx8XG4gICAgICAgIGNvbmZpZy5kb2VzQ29udGFpblR5cGVTY3JpcHRJblBhY2thZ2VzXG4gICAgICApIHtcbiAgICAgICAgaWYgKHJvb3RDb25maWcuaXNCdW4pIHtcbiAgICAgICAgICBwcm9taXNlcy5wdXNoKGdlbmVyYXRlQmlvbWVKc29uYyhjb25maWcpKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIXJvb3RDb25maWcuaXNXaWxsQm9vc3RlckNvbmZpZ3MpIHtcbiAgICAgICAgICBwcm9taXNlcy5wdXNoKGdlbmVyYXRlRXNsaW50cmMoY29uZmlnKSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChjb25maWcuZGVwZW5kaW5nLnB5cmlnaHQpIHtcbiAgICAgICAgcHJvbWlzZXMucHVzaChnZW5lcmF0ZVB5cmlnaHRDb25maWdKc29uKGNvbmZpZykpO1xuICAgICAgfVxuICAgIH1cbiAgICBhd2FpdCBQcm9taXNlLmFsbChwcm9taXNlcyk7XG4gICAgYXdhaXQgcHJvbWlzZVBvb2wucHJvbWlzZUFsbCgpO1xuXG4gICAgY29uc3QgcGFja2FnZU1hbmFnZXIgPSByb290Q29uZmlnLmlzQnVuID8gJ2J1bicgOiAneWFybic7XG4gICAgLy8gUmVmcmVzaCBsb2NrIGZpbGVzXG4gICAgaWYgKHJvb3RDb25maWcuaXNCdW4pIHtcbiAgICAgIGZzLnJtU3luYyhwYXRoLmpvaW4ocm9vdERpclBhdGgsICdidW4ubG9jaycpLCB7IGZvcmNlOiB0cnVlIH0pO1xuICAgICAgc3Bhd25TeW5jKHBhY2thZ2VNYW5hZ2VyLCBbJ3VwZGF0ZSddLCByb290RGlyUGF0aCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGZzLnJtU3luYyhwYXRoLmpvaW4ocm9vdERpclBhdGgsICd5YXJuLmxvY2snKSwgeyBmb3JjZTogdHJ1ZSB9KTtcbiAgICAgIHNwYXduU3luYyhwYWNrYWdlTWFuYWdlciwgWydpbnN0YWxsJywgJy0tbm8taW1tdXRhYmxlJ10sIHJvb3REaXJQYXRoKTtcbiAgICB9XG4gICAgc3Bhd25TeW5jKHBhY2thZ2VNYW5hZ2VyLCBbJ2NsZWFudXAnXSwgcm9vdERpclBhdGgpO1xuICAgIC8vICd5YXJuIGluc3RhbGwnIHNob3VsZCBiZSBhZnRlciBgeWFybiBjbGVhbnVwYCBiZWNhdXNlIHlhcm4gYmVycnkgZ2VuZXJhdGVzIHlhcm4ubG9ja1xuICAgIC8vIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGNvbnRlbnRzIG9mIGRlcGVuZGFudCBzdWItcGFja2FnZSBpbiBtb25vcmVwb1xuICAgIGlmICghcm9vdENvbmZpZy5pc0J1bikge1xuICAgICAgc3Bhd25TeW5jKHBhY2thZ2VNYW5hZ2VyLCBbJ2luc3RhbGwnLCAnLS1uby1pbW11dGFibGUnXSwgcm9vdERpclBhdGgpO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiByZW1vdmVOb2RlTW9kdWxlc0RpcmVjdG9yaWVzKGRpclBhdGg6IHN0cmluZyk6IHZvaWQge1xuICBjb25zdCBub2RlTW9kdWxlc1BhdGhzID0gbmV3IFNldChbcGF0aC5qb2luKGRpclBhdGgsICdub2RlX21vZHVsZXMnKV0pO1xuICBjb25zdCBnbG9iYmVkUGF0aHMgPSBmZy5nbG9iU3luYygnKiovbm9kZV9tb2R1bGVzJywge1xuICAgIGN3ZDogZGlyUGF0aCxcbiAgICBkb3Q6IHRydWUsXG4gICAgb25seURpcmVjdG9yaWVzOiB0cnVlLFxuICAgIGZvbGxvd1N5bWJvbGljTGlua3M6IGZhbHNlLFxuICB9KTtcbiAgZm9yIChjb25zdCBub2RlTW9kdWxlc1BhdGggb2YgZ2xvYmJlZFBhdGhzKSB7XG4gICAgbm9kZU1vZHVsZXNQYXRocy5hZGQocGF0aC5yZXNvbHZlKGRpclBhdGgsIG5vZGVNb2R1bGVzUGF0aCkpO1xuICB9XG4gIGZvciAoY29uc3Qgbm9kZU1vZHVsZXNQYXRoIG9mIG5vZGVNb2R1bGVzUGF0aHMpIHtcbiAgICB0cnkge1xuICAgICAgZnMucm1TeW5jKG5vZGVNb2R1bGVzUGF0aCwgeyByZWN1cnNpdmU6IHRydWUsIGZvcmNlOiB0cnVlIH0pO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBjb25zb2xlLndhcm4oZXJyb3IpO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBnZXRWZXJzaW9uKCk6IHN0cmluZyB7XG4gIGxldCBwYWNrYWdlSnNvbkRpciA9IHBhdGguZGlybmFtZShuZXcgVVJMKGltcG9ydC5tZXRhLnVybCkucGF0aG5hbWUpO1xuICB3aGlsZSAoIWZzLmV4aXN0c1N5bmMocGF0aC5qb2luKHBhY2thZ2VKc29uRGlyLCAncGFja2FnZS5qc29uJykpKSB7XG4gICAgcGFja2FnZUpzb25EaXIgPSBwYXRoLmRpcm5hbWUocGFja2FnZUpzb25EaXIpO1xuICB9XG4gIGNvbnN0IHBhY2thZ2VKc29uID0gSlNPTi5wYXJzZShmcy5yZWFkRmlsZVN5bmMocGF0aC5qb2luKHBhY2thZ2VKc29uRGlyLCAncGFja2FnZS5qc29uJyksICd1dGY4JykpIGFzIHtcbiAgICB2ZXJzaW9uOiBzdHJpbmc7XG4gIH07XG4gIHJldHVybiBwYWNrYWdlSnNvbi52ZXJzaW9uO1xufVxuXG5hd2FpdCBtYWluKCk7XG4iXSwibmFtZXMiOlsib3B0aW9ucyIsImlzVmVyYm9zZSIsImRvZXNVcGxvYWRFbnZWYXJzIiwibG9nZ2VyIiwiZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbiIsIm5hbWUiLCJmdW5jIiwiY29uc29sZSIsImluZm8iLCJlcnJvciIsIkVycm9yIiwic3RhY2siLCJTdHJpbmciLCJhc3luYyIsImZpeERvY2tlcmZpbGUiLCJjb25maWciLCJkb2VzQ29udGFpbkRvY2tlcmZpbGUiLCJvbGRDb250ZW50IiwiZG9ja2VyZmlsZSIsIm5ld0NvbnRlbnQiLCJmcyIsIndyaXRlRmlsZSIsInBhdGgiLCJqb2luIiwiZGlyUGF0aCIsImZzVXRpbCIsInJlYWRGaWxlSWdub3JpbmdFcnJvciIsImZpbGVQYXRoIiwicHJvbWlzZXMiLCJyZWFkRmlsZSIsImdlbmVyYXRlRmlsZSIsImNvbnRlbnQiLCJta2RpciIsImRpcm5hbWUiLCJyZWN1cnNpdmUiLCJub3JtYWxpemVkQ29udGVudCIsInJlcGxhY2VBbGwiLCJ0cmltIiwicHJvbWlzZVBvb2wiLCJQcm9taXNlUG9vbCIsImZpeE5leHRDb25maWdKc29uIiwibWFwIiwiZXh0IiwicmVzb2x2ZSIsImZpbmQiLCJwIiwiZXhpc3RzU3luYyIsInJlcGxhY2UiLCJfIiwic2V0dGluZ3NUZXh0IiwiaW5jbHVkZXMiLCJydW4iLCJsaXRlcmFsIiwidmFsdWUiLCJraW5kIiwiYXNPYmplY3QiLCJkZWZhdWx0Q29uZmlnIiwiZm9yYmlkT25seSIsInJldHJpZXMiLCJ0aW1lb3V0IiwidXNlIiwiYWN0aW9uVGltZW91dCIsInRyYWNlIiwic2NyZWVuc2hvdCIsInZpZGVvIiwid29ya2VycyIsIndlYlNlcnZlciIsImNvbW1hbmQiLCJ1cmwiLCJyZXVzZUV4aXN0aW5nU2VydmVyIiwic3Rkb3V0Iiwic3RkZXJyIiwiZW52IiwiZ3JhY2VmdWxTaHV0ZG93biIsImZpeFBsYXl3cmlnaHRDb25maWciLCJtYXRjaCIsImV4ZWMiLCJvYmplY3RMaXRlcmFsIiwicGFyc2VkIiwic291cmNlIiwidHMiLCJjcmVhdGVTb3VyY2VGaWxlIiwiU2NyaXB0VGFyZ2V0IiwiTGF0ZXN0IiwiU2NyaXB0S2luZCIsIlRTIiwic3RhdGVtZW50Iiwic3RhdGVtZW50cyIsImlzVmFyaWFibGVTdGF0ZW1lbnQiLCJkZWNsYXJhdGlvbiIsImRlY2xhcmF0aW9uTGlzdCIsImRlY2xhcmF0aW9ucyIsImluaXRpYWxpemVyIiwiaXNPYmplY3RMaXRlcmFsRXhwcmVzc2lvbiIsInBhcnNlT2JqZWN0TGl0ZXJhbEV4cHJlc3Npb24iLCJwYXJzZU9iamVjdExpdGVyYWwiLCJuZXdPYmplY3RMaXRlcmFsIiwic3RyaW5naWZ5T2JqZWN0IiwibWVyZ2UiLCJhbGwiLCJwcm9wZXJ0eSIsInByb3BlcnRpZXMiLCJpc1Byb3BlcnR5QXNzaWdubWVudCIsImlzSWRlbnRpZmllciIsImlzU3RyaW5nTGl0ZXJhbCIsInBhcnNlRXhwcmVzc2lvbiIsInVuZGVmaW5lZCIsImdldFRleHQiLCJleHByZXNzaW9uIiwicGFyc2VkT2JqZWN0IiwiaXNBcnJheUxpdGVyYWxFeHByZXNzaW9uIiwiZWxlbWVudHMiLCJlbGVtZW50Iiwic29tZSIsInN0cmluZ2lmeVZhbHVlIiwibGV2ZWwiLCJ2YWx1ZXMiLCJsZW5ndGgiLCJpbmRlbnQiLCJyZXBlYXQiLCJsaW5lcyIsInN0cmluZ2lmaWVkIiwic3BsaXQiLCJhdCIsImluZGV4IiwiY2xvc2luZ0luZGVudCIsInN0cmluZ2lmeUFycmF5Iiwib2JqZWN0IiwiT2JqZWN0IiwiZW50cmllcyIsImtleSIsImdsb2JJZ25vcmUiLCJmaXhQcmlzbWFFbnZGaWxlcyIsImVudkZpbGVzIiwiZmciLCJnbG9iIiwiZG90IiwiY3dkIiwiaWdub3JlIiwiZW52RmlsZSIsImVudkZpbGVQYXRoIiwiZml4VGVzdERpcmVjdG9yaWVzVXBkYXRpbmdQYWNrYWdlSnNvbiIsInBhY2thZ2VEaXJQYXRocyIsIlByb21pc2UiLCJuZXdUZXN0RGlyUGF0aCIsInBhY2thZ2VEaXJQYXRoIiwib2xkVGVzdERpck5hbWUiLCJvbGRUZXN0RGlyUGF0aCIsInJlbmFtZSIsImZpeFR5cGVEZWZpbml0aW9ucyIsImNvbmZpZ3NJbmNsdWRpbmdDaGlsZHJlbiIsImxpYlR5cGVEaXJQYXRoIiwic3JjVHlwZURpclBhdGgiLCJpc1Jvb3QiLCJkb2VzQ29udGFpblN1YlBhY2thZ2VKc29ucyIsImRpcmVudHMiLCJpZ25vcmVFbm9lbnRBc3luYyIsInJlYWRkaXIiLCJ3aXRoRmlsZVR5cGVzIiwiZGlyZW50IiwiZGlyTmFtZSIsInNsaWNlIiwiaGFzVHlwZURlY2xhcmF0aW9uRXh0ZW5zaW9uIiwiZW5kc1dpdGgiLCJwYWNrYWdlTmFtZSIsImhhc0xpYnJhcnkiLCJwYWNrYWdlSnNvbiIsImRlcGVuZGVuY2llcyIsImRldkRlcGVuZGVuY2llcyIsImlzRmlsZSIsImlzRGlyZWN0b3J5Iiwib3ZlcndyaXRlTWVyZ2UiLCJkZXN0aW5hdGlvbkFycmF5Iiwic291cmNlQXJyYXkiLCJjb21iaW5lTWVyZ2UiLCJ0YXJnZXQiLCJkZXN0aW5hdGlvbiIsIml0ZW0iLCJjbG9uZVVubGVzc090aGVyd2lzZVNwZWNpZmllZCIsImlzTWVyZ2VhYmxlT2JqZWN0IiwicHVzaCIsInNvcnRLZXlzIiwib2JqIiwia2V5QW5kVmFsdWVzIiwidG9Tb3J0ZWQiLCJrZXkxIiwia2V5MiIsImxvY2FsZUNvbXBhcmUiLCJ3b3JrZmxvd3MiLCJ0ZXN0Iiwib24iLCJwdWxsX3JlcXVlc3QiLCJicmFuY2hlcyIsImNvbmN1cnJlbmN5IiwiZ3JvdXAiLCJwZXJtaXNzaW9ucyIsImNvbnRlbnRzIiwiam9icyIsInVzZXMiLCJhdXRvZml4IiwicmVsZWFzZSIsInB1bGxfcmVxdWVzdF90YXJnZXQiLCJ0eXBlcyIsInN5bmMiLCJpc3N1ZXMiLCJpZiIsIndpdGgiLCJzZWNyZXRzIiwiQ0xBVURFX0NPREVfT0FVVEhfVE9LRU4iLCJPUEVOQUlfQVBJX0tFWSIsIkdFTUlOSV9BUElfS0VZIiwiZ2VuZXJhdGVXb3JrZmxvd3MiLCJyb290Q29uZmlnIiwiZmlsZU5hbWVzVG9CZVJlbW92ZWQiLCJpc1JldXNhYmxlV29ya2Zsb3dzUmVwbyIsInJlcG9zaXRvcnkiLCJ3b3JrZmxvd3NQYXRoIiwic2VtYW50aWNZbWxQYXRoIiwicm0iLCJmb3JjZSIsImZpbGVOYW1lU2V0IiwiU2V0IiwiZmlsdGVyIiwiZGVwZW5kaW5nIiwic2VtYW50aWNSZWxlYXNlIiwiYWRkIiwiZGVsZXRlIiwiaXNQdWJsaWNSZXBvIiwiZmlsZU5hbWUiLCJiYXNlbmFtZSIsIndyaXRlV29ya2Zsb3dZYW1sIiwiZGVwcmVjYXRlZEZpbGVOYW1lIiwibmV3U2V0dGluZ3MiLCJjbG9uZURlZXAiLCJvbGRTZXR0aW5ncyIsInlhbWwiLCJsb2FkIiwiYXJyYXlNZXJnZSIsInN0YXJ0c1dpdGgiLCJtb3ZlVG9Cb3R0b20iLCJpc1JldXNhYmxlV29ya2Zsb3ciLCJqb2IiLCJub3JtYWxpemVKb2IiLCJzY2hlZHVsZSIsImJyYW5jaCIsIm1pZ3JhdGVXb3JrZmxvdyIsIndyaXRlWWFtbCIsInBhcmFtcyIsInN5bmNfcGFyYW1zX3dpdGhvdXRfZGVzdCIsIndvcmtmbG93X2Rpc3BhdGNoIiwiTlBNX1RPS0VOIiwiR0hfVE9LRU4iLCJpc0J1biIsIkZJUkVCQVNFX1RPS0VOIiwiR0NQX1NBX0tFWV9KU09OX0ZPUl9GSVJFQkFTRSIsIkRJU0NPUkRfV0VCSE9PS19VUkwiLCJzZXJ2ZXJfdXJsIiwiZG90X2Vudl9wYXRoIiwibm9uX3NlbGZfaG9zdGVkIiwibm90aWZ5X2Rpc2NvcmQiLCJyZXF1aXJlX2ZseSIsInJlcXVpcmVfZ2Nsb3VkIiwibGFiZWwiLCJsYWJlbE9wZXJhdG9yIiwiY2lfc2l6ZSIsImNpX2xhYmVsIiwibWlncmF0ZUpvYiIsIkZMWV9BUElfVE9LRU4iLCJkZXBsb3lfY29tbWFuZCIsImdpdGh1Yl9ob3N0ZWRfcnVubmVyIiwia2V5cyIsIm5ld1NlY3JldHMiLCJ5YW1sVGV4dCIsImR1bXAiLCJsaW5lV2lkdGgiLCJub0NvbXBhdE1vZGUiLCJzdHlsZXMiLCJmaXhUeXBvcyIsInBhY2thZ2VDb25maWciLCJkb2NGaWxlcyIsIm1kRmlsZSIsImZpeFR5cG9zSW5UZXh0IiwicmVwbGFjZVdpdGhDb25maWciLCJ0c0ZpbGVzIiwidHNGaWxlIiwiZml4VHlwb3NJbkNvZGUiLCJ0ZXh0QmFzZWRGaWxlcyIsImZpbGUiLCJwcm9taXNlQWxsIiwicHJvcE5hbWUiLCJiZWZvcmUiLCJhZnRlciIsIndiZnlKc29uIiwidHlwb3MiLCJnZW5lcmF0ZUFnZW50SW5zdHJ1Y3Rpb25zIiwiYWxsQ29uZmlncyIsImFnZW50c0V4dHJhUGF0aCIsImV4dHJhQ29udGVudCIsInRvb2xOYW1lIiwiZ2VuZXJhdGVBZ2VudEluc3RydWN0aW9uIiwiY3Vyc29yUnVsZXNQYXRoIiwiY3Vyc29yUnVsZXNDb250ZW50IiwiZnJvbnRtYXR0ZXIiLCJib2R5IiwiZ2VuZXJhdGVDdXJzb3JHZW5lcmFsTWRjQ29udGVudCIsInBhY2thZ2VNYW5hZ2VyIiwiYmFzZUNvbnRlbnQiLCJkZXNjcmlwdGlvbiIsImMiLCJnZW5JMThuVHMiLCJpc1dpbGxCb29zdGVyUmVwbyIsImhhc1N0YXJ0VGVzdCIsInJlYWN0IiwibmV4dCIsInRyaW1FbmQiLCJnaXRIdWJVdGlsIiwiZ2V0T3JnQW5kTmFtZSIsInVybE9yRnVsbE5hbWUiLCJ1cmxXaXRob3V0UHJvdG9jb2wiLCJuYW1lcyIsIm9jdG9raXRDYWNoZSIsIk1hcCIsImdldE9jdG9raXQiLCJvd25lciIsImNhY2hlZCIsImdldCIsIm9jdG9raXQiLCJPY3Rva2l0IiwiYXV0aCIsImdldEdpdEh1YlRva2VuIiwic2V0IiwiaGFzR2l0SHViVG9rZW4iLCJwcm9jZXNzIiwiR0hfQk9UX1BBVF9GT1JfV0lMTEJPT1NURVIiLCJHSF9CT1RfUEFUX0ZPUl9XSUxMQk9PU1RFUkxBQiIsIkdJVEhVQl9UT0tFTiIsInNwYXduU3luYyIsImFyZ3MiLCJyZXRyeSIsIm5ld0NtZCIsIm5ld0FyZ3MiLCJnZXRTcGF3blN5bmNBcmdzIiwiY2hpbGRfcHJvY2VzcyIsInN0YXR1cyIsInNwYXduU3luY1dpdGhTdHJpbmdSZXN1bHQiLCJzdGRpbyIsInByb2MiLCJ0b1N0cmluZyIsInMiLCJQQVRIIiwiQkVSUllfQklOX0ZPTERFUiIsIkFTREZfRElSIiwic2hlbGwiLCJjb252ZXJ0VmVyc2lvbkludG9OdW1iZXIiLCJ2ZXJzaW9uIiwibnVtYmVycyIsIk51bWJlciIsIm51bSIsImlzTmFOIiwidmVyc2lvbk51bWJlciIsImRpdmlzb3IiLCJQWVRIT05fVkVSU0lPTiIsIkpBVkFfVkVSU0lPTiIsImdlbmVyYXRlVG9vbFZlcnNpb25zIiwidmVyc2lvbnNUZXh0IiwiZHVwbGljYXRhYmxlTGluZXMiLCJsaW5lIiwiQ09SRV9UT09MUyIsImhhcyIsImRvZXNDb250YWluUG9ldHJ5TG9jayIsInJlc3BvbnNlIiwiZmV0Y2giLCJqc29uIiwicG9ldHJ5VmVyc2lvbiIsInVwZGF0ZVZlcnNpb24iLCJmaXJlYmFzZSIsImRvZXNDb250YWluUGFja2FnZUpzb24iLCJidW5WZXJzaW9uIiwib3JnYW5pemF0aW9uIiwicmVxdWVzdCIsInJlcG8iLCJkYXRhIiwidGFnX25hbWUiLCJsYXN0SW5kZXhPZiIsInZlcnNpb25OdW1iZXJUZXh0IiwiZ2V0TGF0ZXN0VmVyc2lvbkZyb21UYWdPbkdpdEh1YiIsInByZWZpeCIsIkRFUFJFQ0FURURfVkVSU0lPTl9QUkVGSVhFUyIsInZlcnNpb25QYXRoIiwidG9vbFZlcnNpb25zUGF0aCIsImNvcmUiLCJuZXdWZXJzaW9uIiwiaGVhZCIsImZpbmRJbmRleCIsImwiLCJuZXdMaW5lIiwic3BsaWNlIiwiZ2VuZXJhdGVCaW9tZUpzb25jIiwicm9vdCIsIiRzY2hlbWEiLCJleHRlbmRzIiwiSlNPTiIsInBhcnNlIiwic3RyaW5naWZ5IiwiZ2VuZXJhdGVCdW5maWdUb21sIiwicmVhZEZpbGVTeW5jIiwidXNlckNvbnRlbnRIZWFkZXIiLCJ1c2VyQ29udGVudEhlYWRlclJlZ2V4Iiwic2VwYXJhdG9yIiwiZGVmYXVsdEhlYWRVc2VyQ29udGVudCIsImRlZmF1bHRUYWlsVXNlckNvbnRlbnQiLCJpZ25vcmVGaWxlVXRpbCIsInNlcGFyYXRvclByZWZpeCIsInJlYWRHaXRpZ25vcmVXaXRob3V0U2VwYXJhdG9ycyIsImxhc3RIZWFkZXJJbmRleCIsImdldEluZGV4T2ZUYWlsVXNlckNvbnRlbnRIZWFkZXIiLCJnZXRIZWFkVXNlckNvbnRlbnQiLCJpbmRleE9mIiwidGhpcyIsImdldFRhaWxVc2VyQ29udGVudCIsImlzQmVycnlaZXJvSW5zdGFsbEVuYWJsZWQiLCJsYXN0SW5kZXgiLCJnZW5lcmF0ZURvY2tlcmlnbm9yZSIsImV4dGVuc2lvbnMiLCJjb2RlV2l0aDJJbmRlbnRTaXplIiwiY29kZVdpdGg0SW5kZW50U2l6ZSIsIm1hcmtkb3duTGlrZSIsImVzbGludCIsInByZXR0aWVyIiwiYmlvbWUiLCJnZW5lcmF0ZUV4dGVuc2lvbnMiLCJnZW5lcmF0ZUVkaXRvcmNvbmZpZyIsImdlbmVyYXRlRXNsaW50cmMiLCJlc2xpbnRCYXNlIiwiaGF2ZV9mdW4iLCJjb2RlX3JldmlldyIsImRpc2FibGUiLCJjb21tZW50X3NldmVyaXR5X3RocmVzaG9sZCIsIm1heF9yZXZpZXdfY29tbWVudHMiLCJwdWxsX3JlcXVlc3Rfb3BlbmVkIiwiaGVscCIsInN1bW1hcnkiLCJpZ25vcmVfcGF0dGVybnMiLCJnZW5lcmF0ZUdlbWluaUNvbmZpZyIsImNvbmZpZ0ZpbGVQYXRoIiwic3R5bGVndWlkZUZpbGVQYXRoIiwibmV3Q29uZmlnIiwib2xkQ29uZmlnIiwieWFtbENvbnRlbnQiLCJyZW1vdmVHZW1pbmlTZXR0aW5ncyIsImdlbmVyYXRlR2l0YXR0cmlidXRlcyIsImRlZmF1bHROYW1lcyIsImdlbmVyYXRlR2l0aWdub3JlIiwiaGVhZFVzZXJDb250ZW50IiwidGFpbFVzZXJDb250ZW50IiwiZG9lc0NvbnRhaW5HZW1maWxlIiwiZG9lc0NvbnRhaW5Hb01vZCIsImRvZXNDb250YWluUG9tWG1sIiwiZG9lc0NvbnRhaW5QdWJzcGVjWWFtbCIsImRvZXNDb250YWluVGVtcGxhdGVZYW1sIiwiYmxpdHoiLCJwcmlzbWEiLCJwbGF5d3JpZ2h0VGVzdCIsInJlYWN0TmF0aXZlIiwic3Rvcnlib29rIiwibGl0ZXN0cmVhbSIsImdlbmVyYXRlZCIsInJlYWRDYWNoZSIsInJlc3BvbnNlVGV4dCIsInRleHQiLCJvayIsIndyaXRlQ2FjaGUiLCJvcyIsImhvbWVkaXIiLCJzdGF0IiwiRGF0ZSIsIm5vdyIsIm10aW1lTXMiLCJnZXRMYXRlc3RDb21taXRIYXNoIiwicmVwb1VybCIsImNvbW1pdEhhc2giLCJyZWplY3QiLCJFc2xpbnRVdGlsIiwiZ2V0TGludEZpeFN1ZmZpeCIsImRvZXNDb250YWluSnN4T3JUc3giLCJqc0NvbW1vbkRlcHMiLCJ0c0NvbW1vbkRlcHMiLCJyZWFjdENvbW1vbkRlcHMiLCJlc2xpbnREZXBzIiwiZ2VuZXJhdGVQYWNrYWdlSnNvbiIsInNraXBBZGRpbmdEZXBzIiwianNvblRleHQiLCJqc29uT2JqIiwic2NyaXB0cyIsInBlZXJEZXBlbmRlbmNpZXMiLCJhdXRob3IiLCJ0c2xpYiIsImxlcm5hIiwicGluc3QiLCJyZW1vdmVEZXByZWNhdGVkU3R1ZmYiLCJnZW5lcmF0ZVNjcmlwdHMiLCJwcmV0dGlmeSIsImV4aXN0aW5nQ29udGVudCIsIm9yaWdpbmFsQ29udGVudCIsImdlbmVyYXRlUHJldHRpZXJTdWZmaXgiLCJwb2V0cnlEZXZEZXBlbmRlbmNpZXMiLCJodXNreSIsInByZXBhcmUiLCJwb3N0aW5zdGFsbCIsImlzUmVmZXJyZWRCeU90aGVyUmVwbyIsInByZXBhY2siLCJwb3N0cGFjayIsImFydGlsbGVyeSIsInBsYXl3cmlnaHQiLCJ3b3Jrc3BhY2VzIiwiQXJyYXkiLCJpc0FycmF5Iiwid29ya3NwYWNlIiwiZ2xvYlN5bmMiLCJ3YiIsImRvZXNDb250YWluSmF2YVNjcmlwdCIsImRvZXNDb250YWluSmF2YVNjcmlwdEluUGFja2FnZXMiLCJkb2VzQ29udGFpblR5cGVTY3JpcHQiLCJkb2VzQ29udGFpblR5cGVTY3JpcHRJblBhY2thZ2VzIiwibWljcm9tYXRjaCIsImlzV2lsbEJvb3N0ZXJDb25maWdzIiwiZGVwIiwicHJpdmF0ZSIsImxpY2Vuc2UiLCJwdWJsaXNoQ29uZmlnIiwiYWNjZXNzIiwibWFpbiIsInJlc29sdXRpb25zIiwibGludCIsInNjcmlwdE5hbWUiLCJzY3JpcHQiLCJkaXJzIiwiZGlyIiwiZm9ybWF0IiwicHl0aG9uRmlsZXMiLCJkaXJOYW1lU2V0IiwicHl0aG9uRmlsZSIsImZpcnN0Iiwic2Vjb25kIiwic2l6ZSIsImRpck5hbWVzU3RyIiwicGFja2FnZU5hbWVzIiwiaXNXb3Jrc3BhY2VQYWNrYWdlIiwidXBkYXRlUHJpdmF0ZVBhY2thZ2VzIiwibmV3SnNvblRleHQiLCJvbGRBbmROZXdTY3JpcHROYW1lcyIsIm9sZE5hbWUiLCJuZXdOYW1lIiwiZmlsZXMiLCJmaXhTY3JpcHROYW1lcyIsIm9sZFNjcmlwdHMiLCJoYXNUeXBlY2hlY2siLCJjbGVhbnVwIiwidHlwZWNoZWNrIiwib2xkVGVzdCIsInB5cmlnaHQiLCJwcmVDb21taXQiLCJwcmVQdXNoIiwicHJlUHVzaEZvckxhYiIsInByZVB1c2hGb3JMYWJFeGNlcHRBZG1pbiIsInBvc3RNZXJnZSIsImdlbmVyYXRlSHVza3lyY1VwZGF0aW5nUGFja2FnZUpzb24iLCJwYWNrYWdlSnNvblBhdGgiLCJwb3N0cHVibGlzaCIsInByZXB1Ymxpc2hPbmx5IiwicHJlQ29tbWl0RmlsZVBhdGgiLCJ0b0xvY2FsZUxvd2VyQ2FzZSIsIm1vZGUiLCJwb3N0TWVyZ2VDb21tYW5kIiwiZ2VuZXJhdGVQb3N0TWVyZ2VDb21tYW5kcyIsInBvc3RNZXJnZUNvbW1hbmRzIiwicmF3IiwiaW5zdGFsbENvbW1hbmQiLCJybU5leHREaXJlY3RvcnkiLCJjcmVhdGVUYXNrT3B0aW9ucyIsInJ1bm5lciIsImV4dGVuc2lvbiIsInByZXR0aWVyQ29udGVudCIsImJpb21lQ29udGVudCIsImdlbmVyYXRlSWRlYVNldHRpbmdzIiwiY29tbWFuZHMiLCJnZW5lcmF0ZUxlZnRob29rVXBkYXRpbmdQYWNrYWdlSnNvbiIsInNldHRpbmdzIiwibWtkaXJTeW5jIiwic3JjRGlyZWN0b3JpZXMiLCJub2RlIiwiZ2VuZXJhdGVMaW50c3RhZ2VkcmMiLCJwYWNrYWdlUHJlZml4IiwiZ2V0RXNsaW50S2V5IiwicGFja2FnZXNGaWx0ZXIiLCJnZXRFc2xpbnRGaWx0ZXJGb3JQcmV0dGllciIsImdldFNyY0RpcnMiLCJnZW5lcmF0ZVByZXR0aWVyaWdub3JlIiwiZ2l0aWdub3JlRmlsZVBhdGgiLCJnaXRpZ25vcmVDb250ZW50IiwiYWRkaXRpb25hbENvbnRlbnQiLCJ2ZW52UGF0aCIsInZlbnYiLCJnZW5lcmF0ZVB5cmlnaHRDb25maWdKc29uIiwiZ2VuZXJhdGVSZWFkbWUiLCJpbnNlcnRCYWRnZSIsImZpbGVOYW1lcyIsInJlYWRkaXJTeW5jIiwiYmFkZ2VOYW1lIiwidG9VcHBlckNhc2UiLCJiYWRnZSIsInJlYWRtZSIsImkiLCJnZW5lcmF0ZVJlbGVhc2VyYyIsInBsdWdpbnMiLCJwbHVnaW4iLCJwcmVzZXQiLCJmYWlsQ29tbWVudCIsIl8xIiwic3VjY2Vzc0NvbW1lbnQiLCJfMiIsImNsZWFuT2xkQ29uZmlnIiwic3VjY2Vzc0NvbW1lbnRDb25kaXRpb24iLCJmYWlsQ29tbWVudENvbmRpdGlvbiIsImxhYmVscyIsInJlbGVhc2VkTGFiZWxzIiwiZ2VuZXJhdGVSZW5vdmF0ZUpzb24iLCJwYWNrYWdlUnVsZXMiLCJydWxlIiwibWF0Y2hQYWNrYWdlTmFtZXMiLCJlbmFibGVkIiwicm9vdEpzb25PYmoiLCJjb21waWxlck9wdGlvbnMiLCJtb2R1bGUiLCJtb2R1bGVSZXNvbHV0aW9uIiwianN4IiwiYWx3YXlzU3RyaWN0Iiwic3RyaWN0Iiwibm9VbmNoZWNrZWRJbmRleGVkQWNjZXNzIiwic2tpcExpYkNoZWNrIiwiYWxsb3dTeW50aGV0aWNEZWZhdWx0SW1wb3J0cyIsImVzTW9kdWxlSW50ZXJvcCIsInJlc29sdmVKc29uTW9kdWxlIiwic291cmNlTWFwIiwiaW1wb3J0SGVscGVycyIsImVyYXNhYmxlU3ludGF4T25seSIsIm91dERpciIsInR5cGVSb290cyIsImV4Y2x1ZGUiLCJpbmNsdWRlIiwic3ViSnNvbk9iaiIsImdlbmVyYXRlVHNjb25maWciLCJkb2VzQ29udGFpbkpzeE9yVHN4SW5QYWNrYWdlcyIsImlzRXNtUGFja2FnZSIsInNvcnQiLCJleHBlcmltZW50YWxEZWNvcmF0b3JzIiwiZXhjbHVkZUZpbGVQYXR0ZXJucyIsImdlbmVyYXRlVnNjb2RlU2V0dGluZ3MiLCJleGNsdWRlRmlsZVBhdHRlcm4iLCJleGNsdWRlU2V0dGluZyIsImdlbmVyYXRlWWFybnJjWW1sIiwieWFybnJjWW1sUGF0aCIsImN1cnJlbnRWZXJzaW9uIiwibGF0ZXN0VmVyc2lvbiIsInZlcnNpb25zSnNvbiIsImdldExhdGVzdFZlcnNpb24iLCJnZXRNYWpvck51bWJlciIsInJlbGVhc2VzUGF0aCIsInlhcm5yY1BhdGgiLCJkZWZhdWx0U2VtdmVyUmFuZ2VQcmVmaXgiLCJub2RlTGlua2VyIiwibm1Nb2RlIiwibnBtTWluaW1hbEFnZUdhdGUiLCJucG1QcmVhcHByb3ZlZFBhY2thZ2VzIiwiY29tcHJlc3Npb25MZXZlbCIsImluamVjdEVudmlyb25tZW50RmlsZXMiLCJlbmFibGVHbG9iYWxDYWNoZSIsIm9yaWdpbmFsTGVuZ3RoIiwicGx1Z2luUGF0aCIsIm1ham9yIiwic2V0dXBMYWJlbHMiLCJzZXR1cExhYmVsIiwiZGVsZXRlTGFiZWwiLCJ3YXJuIiwiY29sb3IiLCJERVBSRUNBVEVEX1NFQ1JFVF9OQU1FUyIsInNldHVwU2VjcmV0cyIsImRvdGVudiIsInNlY3JldE5hbWUiLCJzZWNyZXRfbmFtZSIsImtleV9pZCIsImtleUlkIiwic29kaXVtIiwicmVhZHkiLCJzZWNyZXQiLCJyYXdLZXkiLCJmcm9tX2Jhc2U2NCIsImJhc2U2NF92YXJpYW50cyIsIk9SSUdJTkFMIiwicmF3U2VjIiwiZnJvbV9zdHJpbmciLCJlbmNCeXRlcyIsImNyeXB0b19ib3hfc2VhbCIsImVuY0Jhc2U2NCIsInRvX2Jhc2U2NCIsImVuY3J5cHRlZF92YWx1ZSIsInNldHVwR2l0SHViU2V0dGluZ3MiLCJ3aXRoUmV0cnkiLCJhbGxvd19hdXRvX21lcmdlIiwiYWxsb3dfbWVyZ2VfY29tbWl0IiwiYWxsb3dfc3F1YXNoX21lcmdlIiwiYWxsb3dfcmViYXNlX21lcmdlIiwiYWxsb3dfdXBkYXRlX2JyYW5jaCIsImRlbGV0ZV9icmFuY2hfb25fbWVyZ2UiLCJzcXVhc2hfbWVyZ2VfY29tbWl0X3RpdGxlIiwic3F1YXNoX21lcmdlX2NvbW1pdF9tZXNzYWdlIiwiaGVhZGVycyIsInRlbXBsYXRlcyIsImdlbmVyYXRlR2l0SHViVGVtcGxhdGVzIiwiZGlzdGFuY2UiLCJ3YmZ5SnNvblNjaGVtYSIsInoiLCJyZWNvcmQiLCJzdHJpbmciLCJvcHRpb25hbCIsImRvYyIsImdldFBhY2thZ2VDb25maWciLCJlc21QYWNrYWdlIiwicGFja2FnZUpzb25UZXh0IiwidHlwZSIsInJlbGVhc2VCcmFuY2hlcyIsInJlbGVhc2VQbHVnaW5zIiwicmVsZWFzZXJjSnNvblBhdGgiLCJmc3AiLCJmbGF0IiwicmVwb0luZm8iLCJnaXQiLCJzaW1wbGVHaXQiLCJvcmlnaW4iLCJnZXRSZW1vdGVzIiwiciIsInJlbW90ZVVybCIsInJlZnMiLCJyZXF1ZXN0UmVwb0luZm8iLCJtZXNzYWdlIiwiZmV0Y2hSZXBvSW5mbyIsIm5vZGVWZXJzaW9uQ29udGVudCIsIndiZnlKc29uUGF0aCIsIndiZnlKc29uVGV4dCIsImZ1bGxfbmFtZSIsInNlcCIsIkJvb2xlYW4iLCJjb250YWluc0FueSIsImRvZXNDb250YWluVnNjb2RlU2V0dGluZ3NKc29uIiwiZ2l0aHViIiwibnBtIiwic2hvdWxkU2tpcEFwcGx5aW5nIiwiZ2V0RXNsaW50RXh0ZW5zaW9uQmFzZSIsInBhdHRlcm4iLCJvcmciLCJyZXQiLCJhc3NpZ24iLCJyZW1vdmVOb2RlTW9kdWxlc0RpcmVjdG9yaWVzIiwibm9kZU1vZHVsZXNQYXRocyIsImdsb2JiZWRQYXRocyIsIm9ubHlEaXJlY3RvcmllcyIsImZvbGxvd1N5bWJvbGljTGlua3MiLCJub2RlTW9kdWxlc1BhdGgiLCJybVN5bmMiLCJhcmd2IiwieWFyZ3MiLCJwb3NpdGlvbmFsIiwiZGVzY3JpYmUiLCJhcnJheSIsImRlZmF1bHQiLCJhbGlhcyIsInNraXBEZXBzIiwidmVyYm9zZSIsInBhY2thZ2VKc29uRGlyIiwiVVJMIiwicGF0aG5hbWUiLCJnZXRWZXJzaW9uIiwicm9vdERpclBhdGgiLCJwYXRocyIsInBhY2thZ2VzRGlyUGF0aCIsInN1YkRpclBhdGhzIiwiaWdub3JlRXJyb3JBc3luYyIsImQiLCJhYmJyZXZpYXRpb25Qcm9taXNlIiwic3ViUGFja2FnZUNvbmZpZ3MiLCJzdWJEaXJQYXRoIiwiYWxsUGFja2FnZUNvbmZpZ3MiLCJzaG91bGRSdW5Xb3JrZmxvd3MiLCJ0aGVuIl0sIm1hcHBpbmdzIjoibW9CQUtPLE1BQU1BLEVBQVUsSUFMdkIsTUFDRUMsV0FBWSxFQUNaQyxtQkFBb0IsR0NnQmYsTUFBTUMsRUFBUyxJQWhCdEIsTUFDRSwrQkFBTUMsQ0FBMEJDLEVBQWNDLEdBQ3hDTixFQUFRQyxXQUNWTSxRQUFRQyxLQUFLLGFBQWFILHFCQUU1QixVQUNRQyxHQUNSLENBQUUsTUFBT0csR0FDUEYsUUFBUUMsS0FBSyxxQkFBcUJILE1BQVNJLGFBQWlCQyxNQUFRRCxFQUFNRSxNQUFRQyxPQUFPSCxNQUMzRixDQUNJVCxFQUFRQyxXQUNWTSxRQUFRQyxLQUFLLGNBQWNILG1CQUUvQixHQ1RLUSxlQUFlQyxFQUFjQyxHQUNsQyxPQUFPWixFQUFPQywwQkFBMEIsZ0JBQWlCUyxVQUN2RCxJQUFLRSxFQUFPQyxzQkFBdUIsT0FFbkMsTUFBTUMsRUFBYUYsRUFBT0csV0FDcEJDLEVBQWFGLEVB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