wbfy 5.3.0 → 5.3.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (2) hide show
  1. package/dist/index.js +2 -2
  2. package/package.json +3 -3
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}),F=e=>({kind:"object",value:e}),C={forbidOnly:$("!!process.env.CI"),retries:$("process.env.PWDEBUG ? 0 : process.env.CI ? 5 : 1"),timeout:$("120_000"),use:F({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:F({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([C,a,C]),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?F(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={name:"autofix.ci",on:{pull_request:null,push:{branches:["main"]}},permissions:{contents:"read"},concurrency:{group:"autofix-${{ github.head_ref }}","cancel-in-progress":!0},jobs:{autofix:{"runs-on":"ubuntu-latest",steps:[{uses:"actions/checkout@v6"},{uses:"actions/setup-node@v6",with:{"check-latest":!0}},{run:"yarn install"},{run:"yarn cleanup"},{run:"yarn build"},{uses:"autofix-ci/action@v1"}]}}},z={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"}}},U={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"}}},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 M(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(q(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("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(()=>H(n,i,s))}for(const n of s)await S.run(()=>e.promises.rm(t.join(i,n),{force:!0,recursive:!0}))})}function q(e){return e?.endsWith("/reusable-workflows")??!1}async function H(n,s,i){const o=t.join(s,`${i}.yml`);if("autofix"===i){const e=function(e){if(!e.isPublicRepo)return u(z);const t=e.isBun?"bun":"yarn",n=e.isBun?"bun run":"yarn",s=[{uses:"actions/checkout@v6"},{uses:"actions/setup-node@v6",with:{"check-latest":!0}},...e.isBun?[{uses:"oven-sh/setup-bun@v1",with:{"bun-version":"latest"}}]:[],{run:`${t} install`},{run:`${n} cleanup`}];e.packageJson?.scripts?.build&&s.push({run:`${n} build`});s.push({uses:"autofix-ci/action@v1"});const i=u(G);return i.jobs={autofix:{"runs-on":"ubuntu-latest",steps:s}},i}(n);return V(e),void await K(e,o)}let r=u(i in U?U[i]:{});if(!("jobs"in r))return;try{const t=await e.promises.readFile(o,"utf8"),n=d.load(t);r=l.all([r,n,r],{arrayMerge:N})}catch{}i.startsWith("deploy")&&(r={...r,concurrency:{group:"${{ github.workflow }}","cancel-in-progress":!1}},function(e,t){const n=e[t];delete e[t],e[t]=n}(r,"jobs"),r.on?.push&&(r.on.push["paths-ignore"]=[...new Set(["**.md","**/docs/**",...r.on.push["paths-ignore"]??[]])]));let a=!1;for(const e of Object.values(r.jobs))e.uses?.includes("/reusable-workflows/")&&(Y(n,e,i),a=!0);if(a){switch(i){case"release":if(r.on?.schedule)delete r.on.push;else{if(!(r.on?.push&&n.release.branches.length>0))return void await e.promises.rm(t.join(s,"release.yml"),{force:!0});r.on.push.branches=n.release.branches}break;case"test":r.on?.pull_request&&delete r.on.pull_request["paths-ignore"],r.on?.push&&(delete r.on.push["paths-ignore"],r.on.push.branches=r.on.push.branches.filter(e=>"renovate/**"!==e))}if(V(r),await K(r,o),"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}),!r.jobs.sync?.with)return;r.jobs["sync-force"]=r.jobs.sync;const n=r.jobs.sync.with.sync_params_without_dest;if("string"!=typeof n)return;r.jobs.sync.with.sync_params_without_dest=`--force ${n}`,r.name="Force to Sync",r.on={workflow_dispatch:null},delete r.jobs.sync,await K(r,t.join(s,"sync-force.yml"))}}}function Y(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 K(t,n){const s=d.dump(t,{lineWidth:-1,noCompatMode:!0,styles:{"!!null":"empty"}});await e.promises.writeFile(n,s)}function V(e){delete e.jobs["add-to-project"]}async function X(n){return x.functionIgnoringException("fixTypos",async()=>{if(q(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=Q(t);s=ee(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=Z(r);a=ee(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=Q(r);a=ee(a,n,"text"),r!==a&&await j.generateFile(o,a)}await S.promiseAll()})}function Q(e){return e.replaceAll(/\bc\.f\.([^$])/g,"cf.$1").replaceAll(/\beg\.([^$])/g,"e.g.$1").replaceAll(/\bie\.([^$])/g,"i.e.$1")}function Z(e){return e.replaceAll(/\/\/(.*)c\.f\./g,"//$1cf.").replaceAll(/\/\/(.*)eg\./g,"//$1e.g.").replaceAll(/\/\/(.*)ie\./g,"//$1i.e.")}function ee(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 te(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=ne(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=ne(e,t,"Cursor",n);return`${s}\n\n${i}`}(e,n,i);await S.run(()=>j.generateFile(o,r))})}function ne(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 se=new class{getOrgAndName(e){const t=e.split(":").at(-1),n=t?.split("/");return[n?.at(-2)??"",n?.at(-1)?.replace(/.git$/,"")??""]}},ie=new Map;function oe(e){const t=e??"",n=ie.get(t);if(n)return n;const s=new m({auth:ae(e)||void 0});return ie.set(t,s),s}function re(e){return!!ae(e)}function ae(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 ce(e,t,n,s=0){do{const[s,i,o]=pe(e,t,n);if(0===f.spawnSync(s,i,o).status)break}while(--s>=0)}function le(e,t,n){const[s,i,o]=pe(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 pe(t,n,s){const i={...process.env};i.PATH&&i.BERRY_BIN_FOLDER&&(i.PATH=i.PATH.replace(`${i.BERRY_BIN_FOLDER}:`,""));const o=i.ASDF_DIR??`${g.homedir()}/.asdf`;if(o&&e.existsSync(o)){const e=[`${o}/shims`,`${o}/bin`],t=i.PATH?i.PATH.split(":"):[];i.PATH=[...e,...t.filter(t=>!e.includes(t))].join(":"),i.ASDF_DIR??=o,i.ASDF_NODEJS_VERSION??="system"}return i.ASDF_DIR&&(n=["-l","-c",`${t} ${n.join(" ")}`],t="bash"),[t,n,{cwd:s,env:i,shell:!1,stdio:"inherit"}]}function de(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 ue="3.9.19",me="zulu-11.74.15";async function fe(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`${ge.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&&ye(i,"poetry",n),ye(i,"python",ue,!0)}n.depending.firebase&&ye(i,"java",me,!0);if(n.doesContainPackageJson)if(n.isBun){const e=await async function(e,t){try{const n=(await oe().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&&ye(i,"bun",e)}else{const e=le("npm",["show","yarn","version"],n.dirPath);ye(i,"yarn",e)}for(const s of he){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(),ce("asdf",["plugin","update","--all"],n.dirPath),ce("asdf",["install"],n.dirPath)}(n)})}const ge=new Set(["java","nodejs","bun","python"]),he=["java","node","python"];function ye(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+/);de(n)>de(t??"")&&(e[i]=o)}}async function we(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 be(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 ve="# Project-specific settings",ke=/# Project-specific settings[^\n]*\n/gm,xe="# Generated by wbfy",_e=`${ve} (head)\n\n\n${xe}\n`,je=`\n${ve} (tail)\n`,Se={separator:xe,separatorPrefix:"# Generated by ",defaultHeadUserContent:_e,defaultTailUserContent:je,async readGitignoreWithoutSeparators(t){try{let n=await e.promises.readFile(t,"utf8");const s=Pe(n);return s>0&&(n=n.slice(0,s-1)),n.replaceAll(ke,"").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(ke,`${ve} (head)\n`):_e},getTailUserContent(e){const t=Pe(e);return t>0?e.slice(t-1):je},async isBerryZeroInstallEnabled(t){try{return(await e.promises.readFile(t,"utf8")).includes("\n!.yarn/cache")}catch{return!1}}};function Pe(e){const t=e.indexOf(ve),n=e.lastIndexOf(ve);return n>t?n:-1}async function $e(n){return x.functionIgnoringException("generateDockerignore",async()=>{const s=t.resolve(n.dirPath,".dockerignore");if(n.doesContainDockerfile){const e=await j.readFileIgnoringError(s)??"",t=Se.getHeadUserContent(e)+"\n**/.idea\n**/*.sqlite3*\n**/.yarn/install-state.gz\n**/.venv\n"+Se.getTailUserContent(e);await S.run(()=>j.generateFile(s,t))}else await e.promises.rm(s,{force:!0})})}const Fe={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()},Ce=`root = true\n\n[*]\ncharset = utf-8\nend_of_line = lf\ninsert_final_newline = true\ntrim_trailing_whitespace = true\n\n${Be(Fe.codeWith2IndentSize)}\nindent_size = 2\nindent_style = space\n\n${Be(Fe.codeWith4IndentSize)}\nindent_size = 4\nindent_style = space\n\n${Be(Fe.markdownLike)}\nmax_line_length = off\ntrim_trailing_whitespace = false\n\n[{Makefile,*.mk}]\nindent_style = tab\n`;async function Ee(e){return x.functionIgnoringException("generateEditorconfig",async()=>{const n=t.resolve(e.dirPath,".editorconfig");await S.run(()=>j.generateFile(n,Ce))})}function Be(e){return e.length>1?`[*.{${e.join(",")}}]`:`[*.${e[0]}]`}async function Oe(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 Ie={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 Ae(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(Ie);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 Te(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 De=`* text=auto\n\n*.lockb binary diff=lockb\n*.vcproj text eol=crlf\n\n${[...Fe.codeWith2IndentSize,...Fe.codeWith4IndentSize,...Fe.markdownLike].map(e=>`*.${e} text eol=lf`).join("\n")}\n\ndist/** linguist-generated=true\n`;async function Re(e){return x.functionIgnoringException("generateGitattributes",async()=>{const n=t.resolve(e.dirPath,".gitattributes");await S.run(()=>j.generateFile(n,De))})}const We=["windows","macos","linux","jetbrains","visualstudiocode","emacs","vim","yarn"];async function Le(e,n){return x.functionIgnoringException("generateGitignore",async()=>{const s=t.resolve(e.dirPath,".gitignore"),i=await j.readFileIgnoringError(s)??"";let o=Se.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=Se.getTailUserContent(i),a=[...We];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 Ge(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(()=>Je(e,t)),k.isVerbose&&console.info(`Fetched ${n}`)}c&&(c+="\n"),c+=t+"\n"}await Se.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 Ne=t.join(g.homedir(),".cache","wbfy","gitignore");async function Je(n,s){await e.promises.mkdir(Ne,{recursive:!0}),await e.promises.writeFile(t.join(Ne,n),s)}async function Ge(n){try{const s=await e.promises.stat(t.join(Ne,n));if(Date.now()-s.mtimeMs>216e5)return;return await e.promises.readFile(t.join(Ne,n),"utf8")}catch{}}function ze(e,t){try{const n=`git@github.com:${e}/${t}.git`,s=le("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 Ue={getLintFixSuffix:e=>e.doesContainJsxOrTsx?' --rule "{ react-hooks/exhaustive-deps: 0 }"':""},Me=["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"],qe=[...Me,"typescript-eslint","eslint-import-resolver-typescript"],He=["eslint-plugin-react","eslint-plugin-react-hooks","eslint-plugin-react-compiler"],Ye={"@willbooster/eslint-config-js":["@willbooster/eslint-config-js",...Me],"@willbooster/eslint-config-js-react":["@willbooster/eslint-config-js-react",...Me,...He],"@willbooster/eslint-config-ts":["@willbooster/eslint-config-ts",...qe],"@willbooster/eslint-config-ts-react":["@willbooster/eslint-config-ts-react",...qe,...He],"@willbooster/eslint-config-next":["@willbooster/eslint-config-next","eslint-config-next",...qe,...He]};async function Ke(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,Ve(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(Se.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(...Ye[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]=se.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"]??"")+Ue.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")&&!Xe(e,"@willbooster/auth")){delete e.devDependencies["@willbooster/auth"];const t=await ze("WillBoosterLab","auth");e.dependencies["@willbooster/auth"]=`git@github.com:WillBoosterLab/auth.git#${t}`}if(t.has("@discord-bot/shared")&&!Xe(e,"@discord-bot/shared")){delete e.devDependencies["@discord-bot/shared"];const t=await ze("WillBoosterLab","discord-bot");e.dependencies["@discord-bot/shared"]=`git@github.com:WillBoosterLab/discord-bot.git#${t}`}if(t.has("@willbooster/code-analyzer")&&!Xe(e,"@willbooster/code-analyzer")){delete e.dependencies["@willbooster/code-analyzer"];const t=await ze("WillBoosterLab","code-analyzer");e.devDependencies["@willbooster/code-analyzer"]=`git@github.com:WillBoosterLab/code-analyzer.git#${t}`}if(t.has("@willbooster/judge")&&!Xe(e,"@willbooster/judge")){delete e.devDependencies["@willbooster/judge"];const t=await ze("WillBoosterLab","judge");e.dependencies["@willbooster/judge"]=`git@github.com:WillBoosterLab/judge.git#${t}`}if(t.has("@willbooster/llm-proxy")&&!Xe(e,"@willbooster/llm-proxy")){delete e.devDependencies["@willbooster/llm-proxy"];const t=await ze("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?(ce(p,["remove",...new Set(d)],n.dirPath),ce(p,["add","--exact",...new Set(d)],n.dirPath)):ce(p,["add",...new Set(d)],n.dirPath)),u=u.filter(e=>!c.dependencies?.[e]),u.length>0&&(n.isBun?(ce(p,["remove",...new Set(u)],n.dirPath),ce(p,["add","-D","--exact",...new Set(u)],n.dirPath)):ce(p,["add","-D",...new Set(u)],n.dirPath)),m.length>0&&ce("poetry",["add","--group","dev",...new Set(m)],n.dirPath))}(n,s,i)})}function Ve(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 "**/{.*/,}*.{${Fe.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 "**/{.*/,}*.{${Fe.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 Xe(e,t){return(e.devDependencies?.[t]||e.dependencies?.[t]||"").includes("workspace")}const Qe={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 Ze(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 ce("git",["config","--unset","core.hooksPath"],n.dirPath);ce("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,Qe.preCommit+"\n"));const{typecheck:c}=Ve(n,{});if(c){let s=n.repository?.startsWith("github:WillBoosterLab/")?n.repository.toLocaleLowerCase().includes("exercode")?Qe.prePushForLab:Qe.prePushForLabExceptAdmin:Qe.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=`${Qe.postMerge}\n\n${et(n).join("\n")}\n`;await S.run(()=>e.promises.writeFile(t.resolve(r,"post-merge"),l,{mode:493}))}(n)})}function et(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 tt(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 nt=`<?xml version="1.0" encoding="UTF-8"?>\n<project version="4">\n <component name="ProjectTasksOptions">\n${Fe.prettier.map(e=>tt("node","node_modules/.bin/prettier --cache --write","Prettier",e)).join("")}\n </component>\n</project>\n`,st=`<?xml version="1.0" encoding="UTF-8"?>\n<project version="4">\n <component name="ProjectTasksOptions">\n${Fe.prettier.map(e=>tt("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 it(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?st:nt)):S.run(()=>e.promises.rm(i,{force:!0})))}})}const ot={"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"}}}},rt={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 at(n){return x.functionIgnoringException("generateLefthookUpdatingPackageJson",async()=>{await async function(n){const s=t.resolve(n.dirPath,".lefthook"),{typecheck:i}=Ve(n,{}),o={...ot};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/")?rt.prePushForLab:rt.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=`${rt.postMerge}\n\n${et(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 ct={node:["src","test","scripts"].toSorted(),blitz:["src","test","scripts","db","integrations","mailers"].toSorted()};async function lt(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 '${pt(n)}': [${JSON.stringify(`${i}eslint --fix${Ue.getLintFixSuffix(n)}`)}, '${i}prettier --cache --write'],`;o.push(e)}const r=n.isRoot?" && !file.includes('/packages/')":"";o.push(`\n './**/*.{${Fe.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, '${pt(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 pt(e){const t=function(e){return e.depending.blitz?ct.blitz:ct.node}(e).map(e=>`${e}/**/`);return`{,${t.join(",")}}*.{${Fe.eslint.join(",")}}`}async function dt(e){return x.functionIgnoringException("generatePrettierignore",async()=>{const n=t.resolve(e.dirPath,".prettierignore"),s=await j.readFileIgnoringError(n)??"",i=Se.getHeadUserContent(s),o=Se.getTailUserContent(s),r=t.resolve(e.dirPath,".gitignore"),a=await Se.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 ut={venvPath:".",venv:".venv"};async function mt(n){return x.functionIgnoringException("generatePyrightConfigJson",async()=>{let s=u(ut);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 ft(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=gt(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=gt(i,a))}await S.run(()=>j.generateFile(s,i))})}function gt(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 ht(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 yt={$schema:"https://docs.renovatebot.com/renovate-schema.json",extends:["github>WillBooster/willbooster-configs:renovate.json5"]};async function wt(n){return x.functionIgnoringException("generateRenovateJson",async()=>{let s=u(yt);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 bt={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/**/*"]},vt={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 kt(n){return x.functionIgnoringException("generateTsconfig",async()=>{if(n.depending.blitz||n.depending.next)return;let s=u(n.isRoot?bt:vt);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 xt=["**/.git/objects/**","**/.git/subtree-cache/**","**/node_modules/**","**/tmp/**","**/temp/**","**/dist/**"];async function _t(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 xt)o=l.all([o,jt(e)]);n.doesContainPoetryLock&&(o=l.all([o,jt("**/.venv/**")])),n.depending.next&&(o=l.all([o,jt("**/.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 jt(e){return{"files.watcherExclude":{[e]:!0}}}async function St(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=le("yarn",["--version"],n.dirPath),o=function(e,t){const n=le("npm",["show",e,"versions","--json"],t);return JSON.parse(n).at(-1)}("@yarnpkg/cli",n.dirPath);Pt(i)<=Pt(o)&&i!==o&&ce("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})),ce("yarn",["dlx","yarn-plugin-auto-install"],n.dirPath)})}function Pt(e){const[t]=e.split(".");return Number(t)}async function $t(e){return x.functionIgnoringException("setupLabels",async()=>{const[t,n]=se.getOrgAndName(e.repository??"");if(!t||!n)return;if("WillBooster"!==t&&"WillBoosterLab"!==t)return;if(!re(t))return;const s=oe(t);try{await Ft(s,t,n,"d1: x-easy :hedgehog:","EDE9FE"),await Ft(s,t,n,"d2: easy :rabbit2:","DDD6FE"),await Ft(s,t,n,"d3: medium :ox:","C4B5FD"),await Ft(s,t,n,"d4: hard :squid:","A78BFA"),await Ft(s,t,n,"d5: x-hard :whale2:","8B5CF6"),await Ft(s,t,n,"p1: critical :fire::fire::fire:","EF4444"),await Ft(s,t,n,"p2: urgent :fire::fire:","F87171"),await Ft(s,t,n,"p3: important :fire:","FCA5A5"),await Ft(s,t,n,"p4: nice to have :droplet:","FECACA"),await Ft(s,t,n,"r: blitz","5300bc"),await Ft(s,t,n,"r: firebase","ffca28"),await Ft(s,t,n,"r: prisma","0c344b"),await Ft(s,t,n,"r: react","61dafb"),await Ft(s,t,n,"r: svelte","ff3e00"),await Ft(s,t,n,"r: semantic-release","494949"),await Ft(s,t,n,"ready :rocket:","22C55E"),await Ft(s,t,n,"review requested :mag:","FBCA04"),await Ft(s,t,n,"released :bookmark:","6366F1"),await Ft(s,t,n,"s: 0.5h :clock1230:","F3F4F6"),await Ft(s,t,n,"s: 1h :clock1:","E5E7EB"),await Ft(s,t,n,"s: 2h :clock2:","D1D5DB"),await Ft(s,t,n,"s: 3h :clock3:","9CA3AF"),await Ft(s,t,n,"s: 5h :clock5:","6B7280"),await Ft(s,t,n,"s: 8h :clock8:","4B5563"),await Ft(s,t,n,"s: 13h :clock1:","374151"),await Ft(s,t,n,"t: build :hammer:","BFDBFE"),await Ft(s,t,n,"t: chore :broom:","BFDBFE"),await Ft(s,t,n,"t: ci :construction_worker:","BFDBFE"),await Ft(s,t,n,"t: docs :memo:","BFDBFE"),await Ft(s,t,n,"t: feat :sparkles:","BFDBFE"),await Ft(s,t,n,"t: fix :bug:","BFDBFE"),await Ft(s,t,n,"t: perf :zap:","BFDBFE"),await Ft(s,t,n,"t: refactor :recycle:","BFDBFE"),await Ft(s,t,n,"t: style :lipstick:","BFDBFE"),await Ft(s,t,n,"t: test :test_tube:","BFDBFE"),await Ft(s,t,n,"project","24292F"),await Ft(s,t,n,"focused :dart:","22C55E"),await Ft(s,t,n,"gen-pr-all :robot:","00B4D8"),await Ft(s,t,n,"gen-pr-claude :robot:","00B4D8"),await Ft(s,t,n,"gen-pr-codex :robot:","00B4D8"),await Ft(s,t,n,"gen-pr-gemini :robot:","00B4D8"),await Ct(s,t,n,"bug"),await Ct(s,t,n,"documentation"),await Ct(s,t,n,"duplicate"),await Ct(s,t,n,"enhancement"),await Ct(s,t,n,"good first issue"),await Ct(s,t,n,"help wanted"),await Ct(s,t,n,"invalid"),await Ct(s,t,n,"question"),await Ct(s,t,n,"wontfix"),await Ct(s,t,n,"ready"),await Ct(s,t,n,"review requested"),await Ct(s,t,n,"released"),await Ct(s,t,n,"semantic-release"),await Ct(s,t,n,"llm-pr :robot:"),await Ct(s,t,n,"ai-pr :robot:")}catch(e){console.warn("Skip setupLabels due to:",e?.stack??e)}})}async function Ft(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 Ct(e,t,n,s){try{await e.request("DELETE /repos/{owner}/{repo}/labels/{name}",{owner:t,repo:n,name:s})}catch{}}const Et=["READY_DISCORD_WEBHOOK_URL","GH_BOT_PAT","PUBLIC_GH_BOT_PAT"];async function Bt(e){return x.functionIgnoringException("setupSecrets",async()=>{const[t,n]=se.getOrgAndName(e.repository??"");if(!t||!n||"WillBoosterLab"!==t)return;if(!re(t)||!k.doesUploadEnvVars)return;const s=h.config().parsed??{};if(0===Object.keys(s).length)return;const i=oe(t);try{for(const e of Et)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 Ot(e){const[t,n]=se.getOrgAndName(e.repository??"");if(!t||!n)return;if("WillBooster"!==t&&"WillBoosterLab"!==t)return;if(!re(t))return;const i=oe(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 It={"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 At(n){return x.functionIgnoringException("generateGitHubTemplates",async()=>{for(const[s,i]of Object.entries(It)){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 Tt=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 Dt(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 Wt(i);if(e)return e}const o="string"==typeof t.repository?t.repository:t.repository?.url;if(o){const e=await Wt(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=Tt.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:Rt("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:Rt("{app,src,test,scripts}/**/*.{cjs,mjs,js,jsx}",n),doesContainTypeScript:Rt("{app,src,test,scripts}/**/*.{cts,mts,ts,tsx}",n),doesContainJsxOrTsx:Rt("{app,src,test}/**/*.{t,j}sx",n),doesContainJavaScriptInPackages:Rt("packages/**/{app,src,test,scripts}/**/*.{cjs,mjs,js,jsx}",n),doesContainTypeScriptInPackages:Rt("packages/**/{app,src,test,scripts}/**/*.{cts,mts,ts,tsx}",n),doesContainJsxOrTsxInPackages:Rt("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 Rt(e,t){return o.globSync(e,{dot:!0,cwd:t,ignore:T}).length>0}async function Wt(e){const[t,n]=se.getOrgAndName(e);if(!t||!n)return;const s={full_name:`${t}/${n}`};try{const e=await oe().request("GET /repos/{owner}/{repo}",{owner:t,repo:n});Object.assign(s,e.data)}catch{}return s}function Lt(e){return e.isWillBoosterConfigs&&!0===e.packageJson?.name?.startsWith("@willbooster/eslint-config-")}function Nt(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}),Nt(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 Dt(s);if(!a){console.error(`there is no valid package.json in ${s}`);continue}const c=X(a),l=(await Promise.all(r.map(e=>Dt(e,a)))).filter(e=>!!e),p=[a,...l];if(k.isVerbose)for(const e of p)console.info(e);await fe(a),await St(a),a.isBun&&await be(a);const d=!q(a.repository)&&(a.repository?.startsWith("github:WillBooster/")||a.repository?.startsWith("github:WillBoosterLab/"));await Promise.all([_(a),D(a),c.then(()=>ft(a)),te(a,p),$e(a),Ee(a),Ae(a),Te(a),Re(a),At(a),it(a),wt(a),ht(a),...d?[M(a)]:[],$t(a),Bt(a),Ot(a),a.isBun?Ze(a).then(()=>at(a)):Ze(a),lt(a)]),await S.promiseAll();const u=[];for(const e of p)Lt(e)||((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 Le(e,a),await S.promiseAll(),(e.isRoot||e.doesContainPackageJson)&&(await dt(e),await Ke(e,a,n.skipDeps),u.push(lt(e)),e.doesContainVscodeSettingsJson&&e.doesContainPackageJson&&u.push(_t(e)),(e.doesContainTypeScript||e.doesContainTypeScriptInPackages)&&u.push(kt(e)),(e.doesContainJavaScript||e.doesContainJavaScriptInPackages||e.doesContainTypeScript||e.doesContainTypeScriptInPackages)&&(a.isBun&&u.push(we(e)),a.isWillBoosterConfigs||u.push(Oe(e))),e.depending.pyright&&u.push(mt(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}),ce(m,["update"],s)):(e.rmSync(t.join(s,"yarn.lock"),{force:!0}),ce(m,["install","--no-immutable"],s)),ce(m,["cleanup"],s),a.isBun||ce(m,["install","--no-immutable"],s)}}();
2
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VzIjpbIi4uL3NyYy9vcHRpb25zLnRzIiwiLi4vc3JjL2xvZ2dlci50cyIsIi4uL3NyYy9maXhlcnMvZG9ja2VyZmlsZS50cyIsIi4uL3NyYy91dGlscy9mc1V0aWwudHMiLCIuLi9zcmMvdXRpbHMvcHJvbWlzZVBvb2wudHMiLCIuLi9zcmMvZml4ZXJzL25leHRDb25maWcudHMiLCIuLi9zcmMvZml4ZXJzL3BsYXl3cmlnaHRDb25maWcudHMiLCIuLi9zcmMvdXRpbHMvZ2xvYlV0aWwudHMiLCIuLi9zcmMvZml4ZXJzL3ByaXNtYS50cyIsIi4uL3NyYy9maXhlcnMvdGVzdERpcmVjdG9yeS50cyIsIi4uL3NyYy9maXhlcnMvdHlwZURlZmluaXRpb24udHMiLCIuLi9zcmMvdXRpbHMvbWVyZ2VVdGlsLnRzIiwiLi4vc3JjL3V0aWxzL29iamVjdFV0aWwudHMiLCIuLi9zcmMvZ2VuZXJhdG9ycy93b3JrZmxvdy50cyIsIi4uL3NyYy9maXhlcnMvdHlwb3MudHMiLCIuLi9zcmMvZ2VuZXJhdG9ycy9hZ2VudHMudHMiLCIuLi9zcmMvdXRpbHMvZ2l0aHViVXRpbC50cyIsIi4uL3NyYy91dGlscy9zcGF3blV0aWwudHMiLCIuLi9zcmMvdXRpbHMvdmVyc2lvbi50cyIsIi4uL3NyYy91dGlscy92ZXJzaW9uQ29uc3RhbnRzLnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvYXNkZi50cyIsIi4uL3NyYy9nZW5lcmF0b3JzL2Jpb21lLnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvYnVuZmlnLnRzIiwiLi4vc3JjL3V0aWxzL2lnbm9yZUZpbGVVdGlsLnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvZG9ja2VyaWdub3JlLnRzIiwiLi4vc3JjL3V0aWxzL2V4dGVuc2lvbnMudHMiLCIuLi9zcmMvZ2VuZXJhdG9ycy9lZGl0b3Jjb25maWcudHMiLCIuLi9zcmMvZ2VuZXJhdG9ycy9lc2xpbnRDb25maWcudHMiLCIuLi9zcmMvZ2VuZXJhdG9ycy9nZW1pbmlDb25maWcudHMiLCIuLi9zcmMvZ2VuZXJhdG9ycy9nZW1pbmlTZXR0aW5ncy50cyIsIi4uL3NyYy9nZW5lcmF0b3JzL2dpdGF0dHJpYnV0ZXMudHMiLCIuLi9zcmMvZ2VuZXJhdG9ycy9naXRpZ25vcmUudHMiLCIuLi9zcmMvZ2l0aHViL2NvbW1pdC50cyIsIi4uL3NyYy91dGlscy9lc2xpbnRVdGlsLnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvcGFja2FnZUpzb24udHMiLCIuLi9zcmMvZ2VuZXJhdG9ycy9odXNreXJjLnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvaWRlYS50cyIsIi4uL3NyYy9nZW5lcmF0b3JzL2xlZnRob29rLnRzIiwiLi4vc3JjL3V0aWxzL3NyY0RpcmVjdG9yaWVzLnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvbGludHN0YWdlZHJjLnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvcHJldHRpZXJpZ25vcmUudHMiLCIuLi9zcmMvZ2VuZXJhdG9ycy9weXJpZ2h0Q29uZmlnLnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvcmVhZG1lLnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvcmVsZWFzZXJjLnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvcmVub3ZhdGVKc29uLnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvdHNjb25maWcudHMiLCIuLi9zcmMvZ2VuZXJhdG9ycy92c2NvZGVTZXR0aW5ncy50cyIsIi4uL3NyYy9nZW5lcmF0b3JzL3lhcm5yYy50cyIsIi4uL3NyYy9naXRodWIvbGFiZWwudHMiLCIuLi9zcmMvZ2l0aHViL3NlY3JldC50cyIsIi4uL3NyYy9naXRodWIvc2V0dGluZ3MudHMiLCIuLi9zcmMvZ2l0aHViL3RlbXBsYXRlLnRzIiwiLi4vc3JjL3BhY2thZ2VDb25maWcudHMiLCIuLi9zcmMvdXRpbHMvd2lsbGJvb3N0ZXJDb25maWdzVXRpbC50cyIsIi4uL3NyYy9pbmRleC50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJjbGFzcyBPcHRpb25zIHtcbiAgaXNWZXJib3NlID0gZmFsc2U7XG4gIGRvZXNVcGxvYWRFbnZWYXJzID0gZmFsc2U7XG59XG5cbmV4cG9ydCBjb25zdCBvcHRpb25zID0gbmV3IE9wdGlvbnMoKTtcbiIsImltcG9ydCB7IG9wdGlvbnMgfSBmcm9tICcuL29wdGlvbnMuanMnO1xuXG5jbGFzcyBMb2dnZXIge1xuICBhc3luYyBmdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKG5hbWU6IHN0cmluZywgZnVuYzogKCkgPT4gUHJvbWlzZTx2b2lkPik6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmIChvcHRpb25zLmlzVmVyYm9zZSkge1xuICAgICAgY29uc29sZS5pbmZvKGAtLS0tLS0tLS0gJHtuYW1lfSBzdGFydCAtLS0tLS0tLS1gKTtcbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IGZ1bmMoKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgY29uc29sZS5pbmZvKGBFcnJvciBvY2N1cnJlZCBpbiAke25hbWV9OiAke2Vycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5zdGFjayA6IFN0cmluZyhlcnJvcil9fWApO1xuICAgIH1cbiAgICBpZiAob3B0aW9ucy5pc1ZlcmJvc2UpIHtcbiAgICAgIGNvbnNvbGUuaW5mbyhgLS0tLS0tLS0tLSAke25hbWV9IGVuZCAtLS0tLS0tLS0tYCk7XG4gICAgfVxuICB9XG59XG5cbmV4cG9ydCBjb25zdCBsb2dnZXIgPSBuZXcgTG9nZ2VyKCk7XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcy9wcm9taXNlcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBmaXhEb2NrZXJmaWxlKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2ZpeERvY2tlcmZpbGUnLCBhc3luYyAoKSA9PiB7XG4gICAgaWYgKCFjb25maWcuZG9lc0NvbnRhaW5Eb2NrZXJmaWxlKSByZXR1cm47XG5cbiAgICBjb25zdCBvbGRDb250ZW50ID0gY29uZmlnLmRvY2tlcmZpbGU7XG4gICAgY29uc3QgbmV3Q29udGVudCA9IG9sZENvbnRlbnQ7XG5cbiAgICBpZiAob2xkQ29udGVudCA9PT0gbmV3Q29udGVudCkgcmV0dXJuO1xuICAgIGF3YWl0IGZzLndyaXRlRmlsZShwYXRoLmpvaW4oY29uZmlnLmRpclBhdGgsICdEb2NrZXJmaWxlJyksIG5ld0NvbnRlbnQpO1xuICB9KTtcbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmV4cG9ydCBjb25zdCBmc1V0aWwgPSB7XG4gIGFzeW5jIHJlYWRGaWxlSWdub3JpbmdFcnJvcihmaWxlUGF0aDogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmcgfCB1bmRlZmluZWQ+IHtcbiAgICB0cnkge1xuICAgICAgcmV0dXJuIGF3YWl0IGZzLnByb21pc2VzLnJlYWRGaWxlKGZpbGVQYXRoLCAndXRmOCcpO1xuICAgIH0gY2F0Y2gge1xuICAgICAgLy8gZG8gbm90aGluZ1xuICAgIH1cbiAgfSxcbiAgYXN5bmMgZ2VuZXJhdGVGaWxlKGZpbGVQYXRoOiBzdHJpbmcsIGNvbnRlbnQ6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgIGF3YWl0IGZzLnByb21pc2VzLm1rZGlyKHBhdGguZGlybmFtZShmaWxlUGF0aCksIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICAgIGxldCBub3JtYWxpemVkQ29udGVudCA9IGNvbnRlbnQucmVwbGFjZUFsbCgnXFxyXFxuJywgJ1xcbicpLnRyaW0oKTtcbiAgICBpZiAobm9ybWFsaXplZENvbnRlbnQpIHtcbiAgICAgIG5vcm1hbGl6ZWRDb250ZW50ICs9ICdcXG4nO1xuICAgIH1cbiAgICBhd2FpdCBmcy5wcm9taXNlcy53cml0ZUZpbGUoZmlsZVBhdGgsIG5vcm1hbGl6ZWRDb250ZW50KTtcbiAgICBjb25zb2xlLmxvZyhgR2VuZXJhdGVkL1VwZGF0ZWQgJHtmaWxlUGF0aH1gKTtcbiAgfSxcbn07XG4iLCJpbXBvcnQgeyBQcm9taXNlUG9vbCB9IGZyb20gJ21pbmltYWwtcHJvbWlzZS1wb29sJztcblxuZXhwb3J0IGNvbnN0IHByb21pc2VQb29sID0gbmV3IFByb21pc2VQb29sKCk7XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBmc1V0aWwgfSBmcm9tICcuLi91dGlscy9mc1V0aWwuanMnO1xuaW1wb3J0IHsgcHJvbWlzZVBvb2wgfSBmcm9tICcuLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBmaXhOZXh0Q29uZmlnSnNvbihjb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdmaXhOZXh0Q29uZmlnSnNvbicsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBmaWxlUGF0aCA9IFsnanMnLCAnbWpzJywgJ2NqcyddXG4gICAgICAubWFwKChleHQpID0+IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgYG5leHQuY29uZmlnLiR7ZXh0fWApKVxuICAgICAgLmZpbmQoKHApID0+IGZzLmV4aXN0c1N5bmMocCkpO1xuICAgIGlmICghZmlsZVBhdGgpIHJldHVybjtcblxuICAgIGNvbnN0IG9sZENvbnRlbnQgPSBhd2FpdCBmcy5wcm9taXNlcy5yZWFkRmlsZShmaWxlUGF0aCwgJ3V0ZjgnKTtcbiAgICAvLyBSZXBsYWNlIHRoZSBKU09OIG9iamVjdCBmcm9tIHRoZSBmaWxlXG4gICAgY29uc3QgbmV3Q29udGVudCA9IG9sZENvbnRlbnQucmVwbGFjZSgvPVxccyp7KFtcXFNcXHNdKil9Oy8sIChfLCBzZXR0aW5nc1RleHQ6IHN0cmluZykgPT4ge1xuICAgICAgaWYgKCFzZXR0aW5nc1RleHQuaW5jbHVkZXMoJ2VzbGludDonKSkge1xuICAgICAgICBzZXR0aW5nc1RleHQgKz0gJ2VzbGludDogeyBpZ25vcmVEdXJpbmdCdWlsZHM6IHRydWUgfSwnO1xuICAgICAgfVxuICAgICAgaWYgKCFzZXR0aW5nc1RleHQuaW5jbHVkZXMoJ3R5cGVzY3JpcHQ6JykpIHtcbiAgICAgICAgc2V0dGluZ3NUZXh0ICs9ICd0eXBlc2NyaXB0OiB7IGlnbm9yZUJ1aWxkRXJyb3JzOiB0cnVlIH0sJztcbiAgICAgIH1cbiAgICAgIHJldHVybiBgPSB7JHtzZXR0aW5nc1RleHR9fTtgO1xuICAgIH0pO1xuICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiBmc1V0aWwuZ2VuZXJhdGVGaWxlKGZpbGVQYXRoLCBuZXdDb250ZW50KSk7XG4gIH0pO1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IG1lcmdlIGZyb20gJ2RlZXBtZXJnZSc7XG5pbXBvcnQgdHMgZnJvbSAndHlwZXNjcmlwdCc7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGZzVXRpbCB9IGZyb20gJy4uL3V0aWxzL2ZzVXRpbC5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcblxudHlwZSBQYXJzZWRWYWx1ZSA9XG4gIHwgeyBraW5kOiAnYXJyYXknOyB2YWx1ZTogUGFyc2VkVmFsdWVbXSB9XG4gIHwgeyBraW5kOiAnbGl0ZXJhbCc7IHZhbHVlOiBzdHJpbmcgfVxuICB8IHsga2luZDogJ29iamVjdCc7IHZhbHVlOiBQYXJzZWRPYmplY3QgfTtcbnR5cGUgUGFyc2VkT2JqZWN0ID0gUmVjb3JkPHN0cmluZywgUGFyc2VkVmFsdWU+O1xuXG5jb25zdCBsaXRlcmFsID0gKHZhbHVlOiBzdHJpbmcpOiBQYXJzZWRWYWx1ZSA9PiAoeyBraW5kOiAnbGl0ZXJhbCcsIHZhbHVlIH0pO1xuY29uc3QgYXNBcnJheSA9ICh2YWx1ZTogUGFyc2VkVmFsdWVbXSk6IFBhcnNlZFZhbHVlID0+ICh7IGtpbmQ6ICdhcnJheScsIHZhbHVlIH0pO1xuY29uc3QgYXNPYmplY3QgPSAodmFsdWU6IFBhcnNlZE9iamVjdCk6IFBhcnNlZFZhbHVlID0+ICh7IGtpbmQ6ICdvYmplY3QnLCB2YWx1ZSB9KTtcblxuY29uc3QgZGVmYXVsdENvbmZpZzogUGFyc2VkT2JqZWN0ID0ge1xuICBmb3JiaWRPbmx5OiBsaXRlcmFsKCchIXByb2Nlc3MuZW52LkNJJyksXG4gIHJldHJpZXM6IGxpdGVyYWwoJ3Byb2Nlc3MuZW52LlBXREVCVUcgPyAwIDogcHJvY2Vzcy5lbnYuQ0kgPyA1IDogMScpLFxuICB0aW1lb3V0OiBsaXRlcmFsKCcxMjBfMDAwJyksXG4gIHVzZTogYXNPYmplY3Qoe1xuICAgIGFjdGlvblRpbWVvdXQ6IGxpdGVyYWwoJzEwXzAwMCcpLFxuICAgIHRyYWNlOiBsaXRlcmFsKFwicHJvY2Vzcy5lbnYuQ0kgPyAnb24tZmlyc3QtcmV0cnknIDogJ3JldGFpbi1vbi1mYWlsdXJlJ1wiKSxcbiAgICBzY3JlZW5zaG90OiBsaXRlcmFsKFwicHJvY2Vzcy5lbnYuQ0kgPyAnb25seS1vbi1mYWlsdXJlJyA6ICdvbmx5LW9uLWZhaWx1cmUnXCIpLFxuICAgIHZpZGVvOiBsaXRlcmFsKFwicHJvY2Vzcy5lbnYuQ0kgPyAncmV0YWluLW9uLWZhaWx1cmUnIDogJ3JldGFpbi1vbi1mYWlsdXJlJ1wiKSxcbiAgfSksXG4gIHdvcmtlcnM6IGxpdGVyYWwoJ3Byb2Nlc3MuZW52LlBXREVCVUcgPyAxIDogdW5kZWZpbmVkJyksXG4gIHdlYlNlcnZlcjogYXNPYmplY3Qoe1xuICAgIGNvbW1hbmQ6IGxpdGVyYWwoXCIneWFybiBzdGFydC10ZXN0LXNlcnZlcidcIiksXG4gICAgdXJsOiBsaXRlcmFsKCdwcm9jZXNzLmVudi5ORVhUX1BVQkxJQ19CQVNFX1VSTCcpLFxuICAgIHJldXNlRXhpc3RpbmdTZXJ2ZXI6IGxpdGVyYWwoJyEhcHJvY2Vzcy5lbnYuQ0knKSxcbiAgICB0aW1lb3V0OiBsaXRlcmFsKCczMDBfMDAwJyksXG4gICAgc3Rkb3V0OiBsaXRlcmFsKFwiJ2lnbm9yZSdcIiksXG4gICAgc3RkZXJyOiBsaXRlcmFsKFwiJ3BpcGUnXCIpLFxuICAgIGVudjogbGl0ZXJhbChge1xuICAuLi5wcm9jZXNzLmVudixcbiAgUFJJU01BX1VTRVJfQ09OU0VOVF9GT1JfREFOR0VST1VTX0FJX0FDVElPTjogJ3RydWUnLFxufWApLFxuICAgIGdyYWNlZnVsU2h1dGRvd246IGxpdGVyYWwoYHtcbiAgc2lnbmFsOiAnU0lHVEVSTScsXG4gIHRpbWVvdXQ6IDUwMCxcbn1gKSxcbiAgfSksXG59O1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZml4UGxheXdyaWdodENvbmZpZyhjb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdmaXhQbGF5d3JpZ2h0Q29uZmlnJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCBgcGxheXdyaWdodC5jb25maWcudHNgKTtcbiAgICBpZiAoIWZzLmV4aXN0c1N5bmMoZmlsZVBhdGgpKSByZXR1cm47XG5cbiAgICBjb25zdCBvbGRDb250ZW50ID0gYXdhaXQgZnMucHJvbWlzZXMucmVhZEZpbGUoZmlsZVBhdGgsICd1dGY4Jyk7XG4gICAgY29uc3QgbWF0Y2ggPSAvZGVmaW5lQ29uZmlnXFxzKlxcKFxccyooXFx7W1xcc1xcU10qP30pXFxzKlxcKTs/Ly5leGVjKG9sZENvbnRlbnQpO1xuICAgIGNvbnN0IG9iamVjdExpdGVyYWwgPSBtYXRjaD8uWzFdO1xuICAgIGlmICghb2JqZWN0TGl0ZXJhbCkgcmV0dXJuO1xuXG4gICAgY29uc3QgcGFyc2VkID0gcGFyc2VPYmplY3RMaXRlcmFsKG9iamVjdExpdGVyYWwpO1xuICAgIGlmICghcGFyc2VkKSByZXR1cm47XG5cbiAgICBjb25zdCBtZXJnZWQgPSBtZXJnZS5hbGw8UGFyc2VkT2JqZWN0PihbZGVmYXVsdENvbmZpZywgcGFyc2VkLCBkZWZhdWx0Q29uZmlnXSk7XG4gICAgY29uc3QgbmV3T2JqZWN0TGl0ZXJhbCA9IHN0cmluZ2lmeU9iamVjdChtZXJnZWQsIDApO1xuICAgIGNvbnN0IG5ld0NvbnRlbnQgPSBvbGRDb250ZW50LnJlcGxhY2Uob2JqZWN0TGl0ZXJhbCwgbmV3T2JqZWN0TGl0ZXJhbCk7XG5cbiAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnNVdGlsLmdlbmVyYXRlRmlsZShmaWxlUGF0aCwgbmV3Q29udGVudCkpO1xuICB9KTtcbn1cblxuZnVuY3Rpb24gcGFyc2VPYmplY3RMaXRlcmFsKG9iamVjdExpdGVyYWw6IHN0cmluZyk6IFBhcnNlZE9iamVjdCB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IHNvdXJjZSA9IHRzLmNyZWF0ZVNvdXJjZUZpbGUoXG4gICAgJ3BsYXl3cmlnaHQtY29uZmlnLnRzJyxcbiAgICBgY29uc3QgY29uZmlnID0gJHtvYmplY3RMaXRlcmFsfTtgLFxuICAgIHRzLlNjcmlwdFRhcmdldC5MYXRlc3QsXG4gICAgdHJ1ZSxcbiAgICB0cy5TY3JpcHRLaW5kLlRTXG4gICk7XG4gIGNvbnN0IHN0YXRlbWVudCA9IHNvdXJjZS5zdGF0ZW1lbnRzWzBdO1xuICBpZiAoIXN0YXRlbWVudCB8fCAhdHMuaXNWYXJpYWJsZVN0YXRlbWVudChzdGF0ZW1lbnQpKSByZXR1cm47XG4gIGNvbnN0IGRlY2xhcmF0aW9uID0gc3RhdGVtZW50LmRlY2xhcmF0aW9uTGlzdC5kZWNsYXJhdGlvbnNbMF07XG4gIGlmICghZGVjbGFyYXRpb24/LmluaXRpYWxpemVyIHx8ICF0cy5pc09iamVjdExpdGVyYWxFeHByZXNzaW9uKGRlY2xhcmF0aW9uLmluaXRpYWxpemVyKSkgcmV0dXJuO1xuICByZXR1cm4gcGFyc2VPYmplY3RMaXRlcmFsRXhwcmVzc2lvbihkZWNsYXJhdGlvbi5pbml0aWFsaXplciwgc291cmNlKTtcbn1cblxuZnVuY3Rpb24gcGFyc2VPYmplY3RMaXRlcmFsRXhwcmVzc2lvbihcbiAgb2JqZWN0TGl0ZXJhbDogdHMuT2JqZWN0TGl0ZXJhbEV4cHJlc3Npb24sXG4gIHNvdXJjZTogdHMuU291cmNlRmlsZVxuKTogUGFyc2VkT2JqZWN0IHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgcGFyc2VkOiBQYXJzZWRPYmplY3QgPSB7fTtcbiAgZm9yIChjb25zdCBwcm9wZXJ0eSBvZiBvYmplY3RMaXRlcmFsLnByb3BlcnRpZXMpIHtcbiAgICBpZiAoIXRzLmlzUHJvcGVydHlBc3NpZ25tZW50KHByb3BlcnR5KSB8fCAoIXRzLmlzSWRlbnRpZmllcihwcm9wZXJ0eS5uYW1lKSAmJiAhdHMuaXNTdHJpbmdMaXRlcmFsKHByb3BlcnR5Lm5hbWUpKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCB2YWx1ZSA9IHBhcnNlRXhwcmVzc2lvbihwcm9wZXJ0eS5pbml0aWFsaXplciwgc291cmNlKTtcbiAgICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCkgcmV0dXJuO1xuICAgIHBhcnNlZFtwcm9wZXJ0eS5uYW1lLmdldFRleHQoc291cmNlKV0gPSB2YWx1ZTtcbiAgfVxuICByZXR1cm4gcGFyc2VkO1xufVxuXG5mdW5jdGlvbiBwYXJzZUV4cHJlc3Npb24oZXhwcmVzc2lvbjogdHMuRXhwcmVzc2lvbiwgc291cmNlOiB0cy5Tb3VyY2VGaWxlKTogUGFyc2VkVmFsdWUgfCB1bmRlZmluZWQge1xuICBpZiAodHMuaXNPYmplY3RMaXRlcmFsRXhwcmVzc2lvbihleHByZXNzaW9uKSkge1xuICAgIGNvbnN0IHBhcnNlZE9iamVjdCA9IHBhcnNlT2JqZWN0TGl0ZXJhbEV4cHJlc3Npb24oZXhwcmVzc2lvbiwgc291cmNlKTtcbiAgICByZXR1cm4gcGFyc2VkT2JqZWN0ID8gYXNPYmplY3QocGFyc2VkT2JqZWN0KSA6IGxpdGVyYWwoZXhwcmVzc2lvbi5nZXRUZXh0KHNvdXJjZSkpO1xuICB9XG4gIGlmICh0cy5pc0FycmF5TGl0ZXJhbEV4cHJlc3Npb24oZXhwcmVzc2lvbikpIHtcbiAgICBjb25zdCBlbGVtZW50cyA9IGV4cHJlc3Npb24uZWxlbWVudHMubWFwKChlbGVtZW50KSA9PiBwYXJzZUV4cHJlc3Npb24oZWxlbWVudCwgc291cmNlKSk7XG4gICAgaWYgKGVsZW1lbnRzLnNvbWUoKGVsZW1lbnQpOiBlbGVtZW50IGlzIHVuZGVmaW5lZCA9PiBlbGVtZW50ID09PSB1bmRlZmluZWQpKSB7XG4gICAgICByZXR1cm4gbGl0ZXJhbChleHByZXNzaW9uLmdldFRleHQoc291cmNlKSk7XG4gICAgfVxuICAgIHJldHVybiBhc0FycmF5KGVsZW1lbnRzIGFzIFBhcnNlZFZhbHVlW10pO1xuICB9XG4gIHJldHVybiBsaXRlcmFsKGV4cHJlc3Npb24uZ2V0VGV4dChzb3VyY2UpKTtcbn1cblxuZnVuY3Rpb24gc3RyaW5naWZ5VmFsdWUodmFsdWU6IFBhcnNlZFZhbHVlLCBsZXZlbDogbnVtYmVyKTogc3RyaW5nIHtcbiAgaWYgKHZhbHVlLmtpbmQgPT09ICdhcnJheScpIHtcbiAgICByZXR1cm4gc3RyaW5naWZ5QXJyYXkodmFsdWUudmFsdWUsIGxldmVsKTtcbiAgfVxuICBpZiAodmFsdWUua2luZCA9PT0gJ2xpdGVyYWwnKSByZXR1cm4gdmFsdWUudmFsdWU7XG4gIHJldHVybiBzdHJpbmdpZnlPYmplY3QodmFsdWUudmFsdWUsIGxldmVsKTtcbn1cblxuZnVuY3Rpb24gc3RyaW5naWZ5QXJyYXkodmFsdWVzOiBQYXJzZWRWYWx1ZVtdLCBsZXZlbDogbnVtYmVyKTogc3RyaW5nIHtcbiAgaWYgKHZhbHVlcy5sZW5ndGggPT09IDApIHJldHVybiAnW10nO1xuICBjb25zdCBpbmRlbnQgPSAnICAnLnJlcGVhdChsZXZlbCArIDEpO1xuICBjb25zdCBsaW5lcyA9IHZhbHVlcy5tYXAoKHZhbHVlKSA9PiB7XG4gICAgY29uc3Qgc3RyaW5naWZpZWQgPSBzdHJpbmdpZnlWYWx1ZSh2YWx1ZSwgbGV2ZWwgKyAxKS5zcGxpdCgnXFxuJyk7XG4gICAgc3RyaW5naWZpZWRbc3RyaW5naWZpZWQubGVuZ3RoIC0gMV0gPSBgJHtzdHJpbmdpZmllZC5hdCgtMSl9LGA7XG4gICAgaWYgKHZhbHVlLmtpbmQgPT09ICdsaXRlcmFsJykge1xuICAgICAgZm9yIChsZXQgaW5kZXggPSAxOyBpbmRleCA8IHN0cmluZ2lmaWVkLmxlbmd0aDsgaW5kZXggKz0gMSkge1xuICAgICAgICBzdHJpbmdpZmllZFtpbmRleF0gPSBgJHtpbmRlbnR9JHtzdHJpbmdpZmllZFtpbmRleF19YDtcbiAgICAgIH1cbiAgICB9XG4gICAgc3RyaW5naWZpZWRbMF0gPSBgJHtpbmRlbnR9JHtzdHJpbmdpZmllZFswXX1gO1xuICAgIHJldHVybiBzdHJpbmdpZmllZC5qb2luKCdcXG4nKTtcbiAgfSk7XG4gIGNvbnN0IGNsb3NpbmdJbmRlbnQgPSAnICAnLnJlcGVhdChsZXZlbCk7XG4gIHJldHVybiBgW1xcbiR7bGluZXMuam9pbignXFxuJyl9XFxuJHtjbG9zaW5nSW5kZW50fV1gO1xufVxuXG5mdW5jdGlvbiBzdHJpbmdpZnlPYmplY3Qob2JqZWN0OiBQYXJzZWRPYmplY3QsIGxldmVsOiBudW1iZXIpOiBzdHJpbmcge1xuICBjb25zdCBpbmRlbnQgPSAnICAnLnJlcGVhdChsZXZlbCArIDEpO1xuICBjb25zdCBsaW5lcyA9IE9iamVjdC5lbnRyaWVzKG9iamVjdCkubWFwKChba2V5LCB2YWx1ZV0pID0+IHtcbiAgICBjb25zdCBzdHJpbmdpZmllZCA9IHN0cmluZ2lmeVZhbHVlKHZhbHVlLCBsZXZlbCArIDEpLnNwbGl0KCdcXG4nKTtcbiAgICBzdHJpbmdpZmllZFtzdHJpbmdpZmllZC5sZW5ndGggLSAxXSA9IGAke3N0cmluZ2lmaWVkLmF0KC0xKX0sYDtcbiAgICBpZiAodmFsdWUua2luZCA9PT0gJ2xpdGVyYWwnKSB7XG4gICAgICBmb3IgKGxldCBpbmRleCA9IDE7IGluZGV4IDwgc3RyaW5naWZpZWQubGVuZ3RoOyBpbmRleCArPSAxKSB7XG4gICAgICAgIHN0cmluZ2lmaWVkW2luZGV4XSA9IGAke2luZGVudH0ke3N0cmluZ2lmaWVkW2luZGV4XX1gO1xuICAgICAgfVxuICAgIH1cbiAgICBzdHJpbmdpZmllZFswXSA9IGAke2luZGVudH0ke2tleX06ICR7c3RyaW5naWZpZWRbMF19YDtcbiAgICByZXR1cm4gc3RyaW5naWZpZWQuam9pbignXFxuJyk7XG4gIH0pO1xuICBjb25zdCBjbG9zaW5nSW5kZW50ID0gJyAgJy5yZXBlYXQobGV2ZWwpO1xuICBpZiAobGluZXMubGVuZ3RoID09PSAwKSByZXR1cm4gYHtcXG4ke2Nsb3NpbmdJbmRlbnR9fWA7XG4gIHJldHVybiBge1xcbiR7bGluZXMuam9pbignXFxuJyl9XFxuJHtjbG9zaW5nSW5kZW50fX1gO1xufVxuIiwiZXhwb3J0IGNvbnN0IGdsb2JJZ25vcmUgPSBbXG4gICcqKi9ub2RlX21vZHVsZXMvKionLFxuICAnKiovLnZlbnYvKionLFxuICAnKiovdGVzdC1maXh0dXJlcy8qKicsXG4gICcqKi90ZXN0L2ZpeHR1cmVzLyoqJyxcbiAgJyoqL2Rpc3QvKionLFxuICAnKiovYnVpbGQvKionLFxuICAnKiovdGFyZ2V0LyoqJyxcbiAgJyoqL3RlbXAvKionLFxuICAnKiovdG1wLyoqJyxcbl07XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcy9wcm9taXNlcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgZmcgZnJvbSAnZmFzdC1nbG9iJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZ2xvYklnbm9yZSB9IGZyb20gJy4uL3V0aWxzL2dsb2JVdGlsLmpzJztcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGZpeFByaXNtYUVudkZpbGVzKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2ZpeFByaXNtYUVudkZpbGVzJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IGVudkZpbGVzID0gYXdhaXQgZmcuZ2xvYihbJyouZW52JywgJyouZW52LionXSwgeyBkb3Q6IHRydWUsIGN3ZDogY29uZmlnLmRpclBhdGgsIGlnbm9yZTogZ2xvYklnbm9yZSB9KTtcbiAgICBmb3IgKGNvbnN0IGVudkZpbGUgb2YgZW52RmlsZXMpIHtcbiAgICAgIGNvbnN0IGVudkZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCBlbnZGaWxlKTtcbiAgICAgIGNvbnN0IGNvbnRlbnQgPSBhd2FpdCBmcy5yZWFkRmlsZShlbnZGaWxlUGF0aCwgJ3V0ZjgnKTtcbiAgICAgIGNvbnN0IG5ld0NvbnRlbnQgPSBjb250ZW50LnJlcGxhY2UoXG4gICAgICAgIC9EQVRBQkFTRV9VUkw9XCI/KC4rXFwuc3FsaXRlMylcIj9bXFxuJF0vLFxuICAgICAgICAnREFUQUJBU0VfVVJMPVwiJDE/Y29ubmVjdGlvbl9saW1pdD0xXCJcXG4nXG4gICAgICApO1xuICAgICAgYXdhaXQgZnMud3JpdGVGaWxlKGVudkZpbGVQYXRoLCBuZXdDb250ZW50KTtcbiAgICB9XG4gIH0pO1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGZpeFRlc3REaXJlY3Rvcmllc1VwZGF0aW5nUGFja2FnZUpzb24ocGFja2FnZURpclBhdGhzOiBzdHJpbmdbXSk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2ZpeFRlc3REaXJlY3Rvcmllc1VwZGF0aW5nUGFja2FnZUpzb24nLCBhc3luYyAoKSA9PiB7XG4gICAgYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgICBwYWNrYWdlRGlyUGF0aHMubWFwKGFzeW5jIChwYWNrYWdlRGlyUGF0aCkgPT4ge1xuICAgICAgICBjb25zdCBuZXdUZXN0RGlyUGF0aCA9IHBhdGguam9pbihwYWNrYWdlRGlyUGF0aCwgJ3Rlc3QnKTtcbiAgICAgICAgZm9yIChjb25zdCBvbGRUZXN0RGlyTmFtZSBvZiBbJ19fdGVzdHNfXycsICd0ZXN0cyddKSB7XG4gICAgICAgICAgY29uc3Qgb2xkVGVzdERpclBhdGggPSBwYXRoLmpvaW4ocGFja2FnZURpclBhdGgsIG9sZFRlc3REaXJOYW1lKTtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgYXdhaXQgZnMucHJvbWlzZXMucmVuYW1lKG9sZFRlc3REaXJQYXRoLCBuZXdUZXN0RGlyUGF0aCk7XG4gICAgICAgICAgICBjb25zdCBvbGRDb250ZW50ID0gYXdhaXQgZnMucHJvbWlzZXMucmVhZEZpbGUocGF0aC5qb2luKHBhY2thZ2VEaXJQYXRoLCAncGFja2FnZS5qc29uJyksICd1dGY4Jyk7XG4gICAgICAgICAgICBjb25zdCBuZXdDb250ZW50ID0gb2xkQ29udGVudC5yZXBsYWNlQWxsKG9sZFRlc3REaXJOYW1lLCAndGVzdCcpO1xuICAgICAgICAgICAgaWYgKG9sZENvbnRlbnQgPT09IG5ld0NvbnRlbnQpIHJldHVybjtcblxuICAgICAgICAgICAgYXdhaXQgZnMucHJvbWlzZXMud3JpdGVGaWxlKHBhdGguam9pbihwYWNrYWdlRGlyUGF0aCwgJ3BhY2thZ2UuanNvbicpLCBuZXdDb250ZW50KTtcbiAgICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICAgIC8vIGRvIG5vdGhpbmdcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgKTtcbiAgfSk7XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcy9wcm9taXNlcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgeyBpZ25vcmVFbm9lbnRBc3luYyB9IGZyb20gJ0B3aWxsYm9vc3Rlci9zaGFyZWQtbGliJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgcHJvbWlzZVBvb2wgfSBmcm9tICcuLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBmaXhUeXBlRGVmaW5pdGlvbnMoXG4gIGNvbmZpZzogUGFja2FnZUNvbmZpZyxcbiAgY29uZmlnc0luY2x1ZGluZ0NoaWxkcmVuOiBQYWNrYWdlQ29uZmlnW11cbik6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2ZpeFR5cGVEZWZpbml0aW9ucycsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBsaWJUeXBlRGlyUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJ0B0eXBlcycpO1xuICAgIGNvbnN0IHNyY1R5cGVEaXJQYXRoID1cbiAgICAgIGNvbmZpZy5pc1Jvb3QgJiYgY29uZmlnLmRvZXNDb250YWluU3ViUGFja2FnZUpzb25zID8gdW5kZWZpbmVkIDogcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnc3JjJywgJ3R5cGVzJyk7XG5cbiAgICBjb25zdCBkaXJlbnRzID0gYXdhaXQgaWdub3JlRW5vZW50QXN5bmMoKCkgPT4gZnMucmVhZGRpcihsaWJUeXBlRGlyUGF0aCwgeyB3aXRoRmlsZVR5cGVzOiB0cnVlIH0pKTtcbiAgICBpZiAoIWRpcmVudHMpIHJldHVybjtcblxuICAgIGZvciAoY29uc3QgZGlyZW50IG9mIGRpcmVudHMpIHtcbiAgICAgIGNvbnN0IGRpck5hbWUgPSBkaXJlbnQubmFtZS5zbGljZSgwLCAtNSk7XG4gICAgICBjb25zdCBoYXNUeXBlRGVjbGFyYXRpb25FeHRlbnNpb24gPSBkaXJlbnQubmFtZS5lbmRzV2l0aCgnLmQudHMnKTtcbiAgICAgIGxldCBwYWNrYWdlTmFtZSA9IGhhc1R5cGVEZWNsYXJhdGlvbkV4dGVuc2lvbiA/IGRpck5hbWUgOiBkaXJlbnQubmFtZTtcbiAgICAgIGlmIChwYWNrYWdlTmFtZS5pbmNsdWRlcygnX18nKSkge1xuICAgICAgICBwYWNrYWdlTmFtZSA9IGBAJHtwYWNrYWdlTmFtZS5yZXBsYWNlKCdfXycsICcvJyl9YDtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGhhc0xpYnJhcnkgPSBjb25maWdzSW5jbHVkaW5nQ2hpbGRyZW4uc29tZShcbiAgICAgICAgKGNvbmZpZykgPT5cbiAgICAgICAgICBjb25maWcucGFja2FnZUpzb24/LmRlcGVuZGVuY2llcz8uW3BhY2thZ2VOYW1lXSB8fCBjb25maWcucGFja2FnZUpzb24/LmRldkRlcGVuZGVuY2llcz8uW3BhY2thZ2VOYW1lXVxuICAgICAgKTtcblxuICAgICAgaWYgKGRpcmVudC5pc0ZpbGUoKSAmJiBoYXNUeXBlRGVjbGFyYXRpb25FeHRlbnNpb24pIHtcbiAgICAgICAgaWYgKGhhc0xpYnJhcnkpIHtcbiAgICAgICAgICAvLyBNb3ZlIEB0eXBlcy88bmFtZT4vaW5kZXguZC50cyBpZiBpbnN0YWxsZWRcbiAgICAgICAgICBhd2FpdCBmcy5ta2RpcihwYXRoLmpvaW4obGliVHlwZURpclBhdGgsIGRpck5hbWUpKTtcbiAgICAgICAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT5cbiAgICAgICAgICAgIGZzLnJlbmFtZShwYXRoLmpvaW4obGliVHlwZURpclBhdGgsIGRpcmVudC5uYW1lKSwgcGF0aC5qb2luKGxpYlR5cGVEaXJQYXRoLCBkaXJOYW1lLCAnaW5kZXguZC50cycpKVxuICAgICAgICAgICk7XG4gICAgICAgIH0gZWxzZSBpZiAoc3JjVHlwZURpclBhdGgpIHtcbiAgICAgICAgICAvLyBNb3ZlIHNyYy90eXBlcy88bmFtZT4gaWYgbm90IGluc3RhbGxlZFxuICAgICAgICAgIGF3YWl0IGZzLm1rZGlyKHNyY1R5cGVEaXJQYXRoLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgICAgICAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT5cbiAgICAgICAgICAgIGZzLnJlbmFtZShwYXRoLmpvaW4obGliVHlwZURpclBhdGgsIGRpcmVudC5uYW1lKSwgcGF0aC5qb2luKHNyY1R5cGVEaXJQYXRoLCBkaXJlbnQubmFtZSkpXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChkaXJlbnQuaXNEaXJlY3RvcnkoKSAmJiBzcmNUeXBlRGlyUGF0aCAmJiAhaGFzTGlicmFyeSkge1xuICAgICAgICAvLyBNb3ZlIHNyYy90eXBlcy88bmFtZT4uZC50cyBpZiBub3QgaW5zdGFsbGVkXG4gICAgICAgIGF3YWl0IGZzLm1rZGlyKHNyY1R5cGVEaXJQYXRoLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgICAgICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+XG4gICAgICAgICAgaWdub3JlRW5vZW50QXN5bmMoKCkgPT5cbiAgICAgICAgICAgIGZzLnJlbmFtZShcbiAgICAgICAgICAgICAgcGF0aC5qb2luKGxpYlR5cGVEaXJQYXRoLCBkaXJlbnQubmFtZSwgJ2luZGV4LmQudHMnKSxcbiAgICAgICAgICAgICAgcGF0aC5qb2luKHNyY1R5cGVEaXJQYXRoLCBgJHtkaXJlbnQubmFtZX0uZC50c2ApXG4gICAgICAgICAgICApXG4gICAgICAgICAgKVxuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cbiAgfSk7XG59XG4iLCIvKiBlc2xpbnQtZGlzYWJsZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW5zYWZlLWFzc2lnbm1lbnQsIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnNhZmUtY2FsbCwgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVuc2FmZS1tZW1iZXItYWNjZXNzLCBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW5zYWZlLWFyZ3VtZW50ICovXG5cbmltcG9ydCBtZXJnZSBmcm9tICdkZWVwbWVyZ2UnO1xuXG5leHBvcnQgZnVuY3Rpb24gb3ZlcndyaXRlTWVyZ2U8VD4oZGVzdGluYXRpb25BcnJheTogVFtdLCBzb3VyY2VBcnJheTogVFtdKTogVFtdIHtcbiAgcmV0dXJuIHNvdXJjZUFycmF5O1xufVxuXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuZXhwb3J0IGZ1bmN0aW9uIGNvbWJpbmVNZXJnZSh0YXJnZXQ6IG9iamVjdFtdLCBzb3VyY2U6IG9iamVjdFtdLCBvcHRpb25zOiBhbnkpOiBvYmplY3RbXSB7XG4gIGNvbnN0IGRlc3RpbmF0aW9uID0gWy4uLnRhcmdldF07XG5cbiAgZm9yIChjb25zdCBbaW5kZXgsIGl0ZW1dIG9mIHNvdXJjZS5lbnRyaWVzKCkpIHtcbiAgICBpZiAoZGVzdGluYXRpb25baW5kZXhdID09PSB1bmRlZmluZWQpIHtcbiAgICAgIGRlc3RpbmF0aW9uW2luZGV4XSA9IG9wdGlvbnMuY2xvbmVVbmxlc3NPdGhlcndpc2VTcGVjaWZpZWQoaXRlbSwgb3B0aW9ucyk7XG4gICAgfSBlbHNlIGlmIChvcHRpb25zLmlzTWVyZ2VhYmxlT2JqZWN0KGl0ZW0pKSB7XG4gICAgICBkZXN0aW5hdGlvbltpbmRleF0gPSBtZXJnZSh0YXJnZXRbaW5kZXhdIGFzIG9iamVjdCwgaXRlbSwgb3B0aW9ucyk7XG4gICAgfSBlbHNlIGlmICghdGFyZ2V0LmluY2x1ZGVzKGl0ZW0pKSB7XG4gICAgICBkZXN0aW5hdGlvbi5wdXNoKGl0ZW0pO1xuICAgIH1cbiAgfVxuICByZXR1cm4gZGVzdGluYXRpb247XG59XG4iLCJleHBvcnQgZnVuY3Rpb24gbW92ZVRvQm90dG9tPFRPYmogZXh0ZW5kcyBSZWNvcmQ8VEtleSwgdW5rbm93bj4sIFRLZXkgZXh0ZW5kcyBzdHJpbmcgfCBudW1iZXIgfCBzeW1ib2w+KFxuICBvYmo6IFRPYmosXG4gIGtleTogVEtleVxuKTogVE9iaiB7XG4gIGNvbnN0IHZhbHVlID0gb2JqW2tleV07XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZHluYW1pYy1kZWxldGVcbiAgZGVsZXRlIG9ialtrZXldO1xuICAob2JqIGFzIFJlY29yZDxUS2V5LCB1bmtub3duPilba2V5XSA9IHZhbHVlO1xuICByZXR1cm4gb2JqO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gc29ydEtleXM8VCBleHRlbmRzIFJlY29yZDxzdHJpbmcsIHVua25vd24+PihvYmo6IFQpOiBUIHtcbiAgY29uc3Qga2V5QW5kVmFsdWVzID0gT2JqZWN0LmVudHJpZXMob2JqKS50b1NvcnRlZCgoW2tleTFdLCBba2V5Ml0pID0+IGtleTEubG9jYWxlQ29tcGFyZShrZXkyKSk7XG4gIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIGtleUFuZFZhbHVlcykge1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZHluYW1pYy1kZWxldGVcbiAgICBkZWxldGUgb2JqW2tleV07XG4gICAgKG9iaiBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPilba2V5XSA9IHZhbHVlO1xuXG4gICAgLy8gaWYgdmFsdWUgaXMgYW4gb2JqZWN0LCBzb3J0IHRoZSBrZXlzIG9mIHRoZSBvYmplY3RcbiAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJiB2YWx1ZSAhPT0gbnVsbCkge1xuICAgICAgc29ydEtleXModmFsdWUgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pO1xuICAgIH1cbiAgfVxuICByZXR1cm4gb2JqO1xufVxuIiwiLyogZXNsaW50LWRpc2FibGUgdW5pY29ybi9uby1udWxsICovXG5cbmltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCBtZXJnZSBmcm9tICdkZWVwbWVyZ2UnO1xuaW1wb3J0IHlhbWwgZnJvbSAnanMteWFtbCc7XG5pbXBvcnQgY2xvbmVEZWVwIGZyb20gJ2xvZGFzaC5jbG9uZWRlZXAnO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBjb21iaW5lTWVyZ2UgfSBmcm9tICcuLi91dGlscy9tZXJnZVV0aWwuanMnO1xuaW1wb3J0IHsgbW92ZVRvQm90dG9tLCBzb3J0S2V5cyB9IGZyb20gJy4uL3V0aWxzL29iamVjdFV0aWwuanMnO1xuaW1wb3J0IHsgcHJvbWlzZVBvb2wgfSBmcm9tICcuLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5cbmludGVyZmFjZSBXb3JrZmxvdyB7XG4gIG5hbWU/OiBzdHJpbmc7XG4gIG9uPzogT247XG4gIGNvbmN1cnJlbmN5PzogQ29uY3VycmVuY3k7XG4gIHBlcm1pc3Npb25zPzogUmVjb3JkPHN0cmluZywgc3RyaW5nPjtcbiAgam9iczogUmVjb3JkPHN0cmluZywgSm9iPjtcbn1cblxuaW50ZXJmYWNlIENvbmN1cnJlbmN5IHtcbiAgZ3JvdXA6IHN0cmluZztcbiAgJ2NhbmNlbC1pbi1wcm9ncmVzcyc6IGJvb2xlYW47XG59XG5cbmludGVyZmFjZSBPbiB7XG4gIGlzc3Vlcz86IFR5cGVzIHwgbnVsbDtcbiAgcHVsbF9yZXF1ZXN0PzogUHVsbFJlcXVlc3QgfCBudWxsO1xuICBwdWxsX3JlcXVlc3RfdGFyZ2V0PzogVHlwZXMgfCBudWxsO1xuICBwdXNoPzogUHVzaDtcbiAgc2NoZWR1bGU/OiBTY2hlZHVsZVtdO1xuICB3b3JrZmxvd19kaXNwYXRjaD86IG51bGw7XG59XG5cbmludGVyZmFjZSBQdWxsUmVxdWVzdCB7XG4gICdwYXRocy1pZ25vcmUnPzogc3RyaW5nW107XG4gIHR5cGVzPzogc3RyaW5nW107XG59XG5cbmludGVyZmFjZSBQdXNoIHtcbiAgYnJhbmNoZXM6IHN0cmluZ1tdO1xuICAncGF0aHMtaWdub3JlJz86IHN0cmluZ1tdO1xufVxuXG5pbnRlcmZhY2UgU2NoZWR1bGUge1xuICBjcm9uOiBzdHJpbmc7XG59XG5cbmludGVyZmFjZSBUeXBlcyB7XG4gIHR5cGVzOiBzdHJpbmdbXTtcbn1cblxuaW50ZXJmYWNlIEpvYiB7XG4gICdydW5zLW9uJz86IHN0cmluZztcbiAgcGVybWlzc2lvbnM/OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+O1xuICBzdGVwcz86IFN0ZXBbXTtcbiAgdXNlcz86IHN0cmluZztcbiAgaWY/OiBzdHJpbmc7XG4gIHNlY3JldHM/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgd2l0aD86IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xufVxuXG5pbnRlcmZhY2UgU3RlcCB7XG4gIHVzZXM/OiBzdHJpbmc7XG4gIHdpdGg/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgcnVuPzogc3RyaW5nO1xufVxuXG5jb25zdCBwdWJsaWNSZXBvQXV0b2ZpeFdvcmtmbG93OiBXb3JrZmxvdyA9IHtcbiAgbmFtZTogJ2F1dG9maXguY2knLFxuICBvbjoge1xuICAgIHB1bGxfcmVxdWVzdDogbnVsbCxcbiAgICBwdXNoOiB7XG4gICAgICBicmFuY2hlczogWydtYWluJ10sXG4gICAgfSxcbiAgfSxcbiAgcGVybWlzc2lvbnM6IHtcbiAgICBjb250ZW50czogJ3JlYWQnLFxuICB9LFxuICBjb25jdXJyZW5jeToge1xuICAgIGdyb3VwOiAnYXV0b2ZpeC0ke3sgZ2l0aHViLmhlYWRfcmVmIH19JyxcbiAgICAnY2FuY2VsLWluLXByb2dyZXNzJzogdHJ1ZSxcbiAgfSxcbiAgam9iczoge1xuICAgIGF1dG9maXg6IHtcbiAgICAgICdydW5zLW9uJzogJ3VidW50dS1sYXRlc3QnLFxuICAgICAgc3RlcHM6IFtcbiAgICAgICAgeyB1c2VzOiAnYWN0aW9ucy9jaGVja291dEB2NicgfSxcbiAgICAgICAgeyB1c2VzOiAnYWN0aW9ucy9zZXR1cC1ub2RlQHY2Jywgd2l0aDogeyAnY2hlY2stbGF0ZXN0JzogdHJ1ZSB9IH0sXG4gICAgICAgIHsgcnVuOiAneWFybiBpbnN0YWxsJyB9LFxuICAgICAgICB7IHJ1bjogJ3lhcm4gY2xlYW51cCcgfSxcbiAgICAgICAgeyBydW46ICd5YXJuIGJ1aWxkJyB9LFxuICAgICAgICB7IHVzZXM6ICdhdXRvZml4LWNpL2FjdGlvbkB2MScgfSxcbiAgICAgIF0sXG4gICAgfSxcbiAgfSxcbn07XG5cbmNvbnN0IHByaXZhdGVSZXBvQXV0b2ZpeFdvcmtmbG93OiBXb3JrZmxvdyA9IHtcbiAgbmFtZTogJ0ZpeCBjb2RlIGF1dG9tYXRpY2FsbHknLFxuICBvbjoge1xuICAgIHB1bGxfcmVxdWVzdDogbnVsbCxcbiAgfSxcbiAgY29uY3VycmVuY3k6IHtcbiAgICBncm91cDogJyR7eyBnaXRodWIud29ya2Zsb3cgfX0tJHt7IGdpdGh1Yi5yZWYgfX0nLFxuICAgICdjYW5jZWwtaW4tcHJvZ3Jlc3MnOiB0cnVlLFxuICB9LFxuICBqb2JzOiB7XG4gICAgdGVzdDoge1xuICAgICAgdXNlczogJ1dpbGxCb29zdGVyL3JldXNhYmxlLXdvcmtmbG93cy8uZ2l0aHViL3dvcmtmbG93cy9hdXRvZml4LnltbEBtYWluJyxcbiAgICB9LFxuICB9LFxufTtcblxuY29uc3Qgd29ya2Zsb3dzID0ge1xuICB0ZXN0OiB7XG4gICAgbmFtZTogJ1Rlc3QnLFxuICAgIG9uOiB7XG4gICAgICBwdWxsX3JlcXVlc3Q6IG51bGwsXG4gICAgICBwdXNoOiB7XG4gICAgICAgIGJyYW5jaGVzOiBbJ21haW4nLCAnd2JmeSddLFxuICAgICAgfSxcbiAgICB9LFxuICAgIC8vIGNmLiBodHRwczovL2RvY3MuZ2l0aHViLmNvbS9lbi9hY3Rpb25zL3VzaW5nLWpvYnMvdXNpbmctY29uY3VycmVuY3kjZXhhbXBsZS1vbmx5LWNhbmNlbC1pbi1wcm9ncmVzcy1qb2JzLW9yLXJ1bnMtZm9yLXRoZS1jdXJyZW50LXdvcmtmbG93XG4gICAgY29uY3VycmVuY3k6IHtcbiAgICAgIGdyb3VwOiAnJHt7IGdpdGh1Yi53b3JrZmxvdyB9fS0ke3sgZ2l0aHViLnJlZiB9fScsXG4gICAgICAnY2FuY2VsLWluLXByb2dyZXNzJzogdHJ1ZSxcbiAgICB9LFxuICAgIHBlcm1pc3Npb25zOiB7XG4gICAgICAvLyBmb3IgbGludGVyIGZpeFxuICAgICAgY29udGVudHM6ICd3cml0ZScsXG4gICAgfSxcbiAgICBqb2JzOiB7XG4gICAgICB0ZXN0OiB7XG4gICAgICAgIHVzZXM6ICdXaWxsQm9vc3Rlci9yZXVzYWJsZS13b3JrZmxvd3MvLmdpdGh1Yi93b3JrZmxvd3MvdGVzdC55bWxAbWFpbicsXG4gICAgICB9LFxuICAgIH0sXG4gIH0sXG4gIHJlbGVhc2U6IHtcbiAgICBuYW1lOiAnUmVsZWFzZScsXG4gICAgb246IHtcbiAgICAgIHB1c2g6IHtcbiAgICAgICAgYnJhbmNoZXM6IFtdLFxuICAgICAgfSxcbiAgICB9LFxuICAgIGNvbmN1cnJlbmN5OiB7XG4gICAgICBncm91cDogJyR7eyBnaXRodWIud29ya2Zsb3cgfX0nLFxuICAgICAgJ2NhbmNlbC1pbi1wcm9ncmVzcyc6IGZhbHNlLFxuICAgIH0sXG4gICAgcGVybWlzc2lvbnM6IHtcbiAgICAgIC8vIGh0dHBzOi8vZG9jcy5ucG1qcy5jb20vdHJ1c3RlZC1wdWJsaXNoZXJzI3N0ZXAtMi1jb25maWd1cmUteW91ci1jaWNkLXdvcmtmbG93XG4gICAgICAnaWQtdG9rZW4nOiAnd3JpdGUnLFxuICAgICAgLy8gZm9yIHNlbWFudGljLXJlbGVhc2VcbiAgICAgIGNvbnRlbnRzOiAnd3JpdGUnLFxuICAgIH0sXG4gICAgam9iczoge1xuICAgICAgcmVsZWFzZToge1xuICAgICAgICB1c2VzOiAnV2lsbEJvb3N0ZXIvcmV1c2FibGUtd29ya2Zsb3dzLy5naXRodWIvd29ya2Zsb3dzL3JlbGVhc2UueW1sQG1haW4nLFxuICAgICAgfSxcbiAgICB9LFxuICB9LFxuICAnc2VtYW50aWMtcHInOiB7XG4gICAgbmFtZTogJ0xpbnQgUFIgdGl0bGUnLFxuICAgIG9uOiB7XG4gICAgICBwdWxsX3JlcXVlc3RfdGFyZ2V0OiB7XG4gICAgICAgIHR5cGVzOiBbJ29wZW5lZCcsICdlZGl0ZWQnLCAnc3luY2hyb25pemUnXSxcbiAgICAgIH0sXG4gICAgfSxcbiAgICBqb2JzOiB7XG4gICAgICAnc2VtYW50aWMtcHInOiB7XG4gICAgICAgIHVzZXM6ICdXaWxsQm9vc3Rlci9yZXVzYWJsZS13b3JrZmxvd3MvLmdpdGh1Yi93b3JrZmxvd3Mvc2VtYW50aWMtcHIueW1sQG1haW4nLFxuICAgICAgfSxcbiAgICB9LFxuICB9LFxuICBzeW5jOiB7XG4gICAgbmFtZTogJ1N5bmMnLFxuICAgIG9uOiB7fSxcbiAgICBwZXJtaXNzaW9uczoge1xuICAgICAgLy8gZm9yIGNvbW1pdGluZyBjaGFuZ2VzXG4gICAgICBjb250ZW50czogJ3dyaXRlJyxcbiAgICB9LFxuICAgIGpvYnM6IHtcbiAgICAgIHN5bmM6IHsgdXNlczogJ1dpbGxCb29zdGVyL3JldXNhYmxlLXdvcmtmbG93cy8uZ2l0aHViL3dvcmtmbG93cy9zeW5jLnltbEBtYWluJyB9LFxuICAgIH0sXG4gIH0sXG4gICdjbG9zZS1jb21tZW50Jzoge1xuICAgIG5hbWU6ICdBZGQgY2xvc2UgY29tbWVudCcsXG4gICAgb246IHtcbiAgICAgIHB1bGxfcmVxdWVzdDoge1xuICAgICAgICB0eXBlczogWydvcGVuZWQnXSxcbiAgICAgIH0sXG4gICAgfSxcbiAgICBqb2JzOiB7XG4gICAgICAnY2xvc2UtY29tbWVudCc6IHtcbiAgICAgICAgdXNlczogJ1dpbGxCb29zdGVyL3JldXNhYmxlLXdvcmtmbG93cy8uZ2l0aHViL3dvcmtmbG93cy9jbG9zZS1jb21tZW50LnltbEBtYWluJyxcbiAgICAgIH0sXG4gICAgfSxcbiAgfSxcbiAgJ2dlbi1wci1jbGF1ZGUnOiB7XG4gICAgbmFtZTogJ0dlbmVyYXRlIFBSIHdpdGggQ2xhdWRlIENvZGUnLFxuICAgIG9uOiB7XG4gICAgICBpc3N1ZXM6IHtcbiAgICAgICAgdHlwZXM6IFsnbGFiZWxlZCddLFxuICAgICAgfSxcbiAgICAgIHB1bGxfcmVxdWVzdDoge1xuICAgICAgICB0eXBlczogWydsYWJlbGVkJ10sXG4gICAgICB9LFxuICAgIH0sXG4gICAgam9iczoge1xuICAgICAgJ2dlbi1wcic6IHtcbiAgICAgICAgaWY6IFwiY29udGFpbnMoZ2l0aHViLmV2ZW50LmxhYmVsLm5hbWUsICdnZW4tcHItYWxsJykgfHwgY29udGFpbnMoZ2l0aHViLmV2ZW50LmxhYmVsLm5hbWUsICdnZW4tcHItY2xhdWRlJylcIixcbiAgICAgICAgdXNlczogJ1dpbGxCb29zdGVyL3JldXNhYmxlLXdvcmtmbG93cy8uZ2l0aHViL3dvcmtmbG93cy9nZW4tcHIueW1sQG1haW4nLFxuICAgICAgICB3aXRoOiB7XG4gICAgICAgICAgJ2NvZGluZy10b29sJzogJ2NsYXVkZS1jb2RlJyxcbiAgICAgICAgICAnaXNzdWUtbnVtYmVyJzogJyR7eyBnaXRodWIuZXZlbnQuaXNzdWUubnVtYmVyIHx8IGdpdGh1Yi5ldmVudC5udW1iZXIgfX0nLFxuICAgICAgICAgICd0ZXN0LWNvbW1hbmQnOiAneWFybnxidW4gY2hlY2stYWxsLWZvci1haScsXG4gICAgICAgIH0sXG4gICAgICAgIHNlY3JldHM6IHtcbiAgICAgICAgICBDTEFVREVfQ09ERV9PQVVUSF9UT0tFTjogJyR7eyBzZWNyZXRzLkNMQVVERV9DT0RFX09BVVRIX1RPS0VOIH19JyxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgfSxcbiAgfSxcbiAgJ2dlbi1wci1jb2RleCc6IHtcbiAgICBuYW1lOiAnR2VuZXJhdGUgUFIgd2l0aCBDb2RleCBDTEknLFxuICAgIG9uOiB7XG4gICAgICBpc3N1ZXM6IHtcbiAgICAgICAgdHlwZXM6IFsnbGFiZWxlZCddLFxuICAgICAgfSxcbiAgICAgIHB1bGxfcmVxdWVzdDoge1xuICAgICAgICB0eXBlczogWydsYWJlbGVkJ10sXG4gICAgICB9LFxuICAgIH0sXG4gICAgam9iczoge1xuICAgICAgJ2dlbi1wcic6IHtcbiAgICAgICAgaWY6IFwiY29udGFpbnMoZ2l0aHViLmV2ZW50LmxhYmVsLm5hbWUsICdnZW4tcHItYWxsJykgfHwgY29udGFpbnMoZ2l0aHViLmV2ZW50LmxhYmVsLm5hbWUsICdnZW4tcHItY29kZXgnKVwiLFxuICAgICAgICB1c2VzOiAnV2lsbEJvb3N0ZXIvcmV1c2FibGUtd29ya2Zsb3dzLy5naXRodWIvd29ya2Zsb3dzL2dlbi1wci55bWxAbWFpbicsXG4gICAgICAgIHdpdGg6IHtcbiAgICAgICAgICAnY29kaW5nLXRvb2wnOiAnY29kZXgtY2xpJyxcbiAgICAgICAgICAnaXNzdWUtbnVtYmVyJzogJyR7eyBnaXRodWIuZXZlbnQuaXNzdWUubnVtYmVyIHx8IGdpdGh1Yi5ldmVudC5udW1iZXIgfX0nLFxuICAgICAgICAgICd0ZXN0LWNvbW1hbmQnOiAneWFybnxidW4gY2hlY2stYWxsLWZvci1haScsXG4gICAgICAgIH0sXG4gICAgICAgIHNlY3JldHM6IHtcbiAgICAgICAgICBPUEVOQUlfQVBJX0tFWTogJyR7eyBzZWNyZXRzLk9QRU5BSV9BUElfS0VZIH19JyxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgfSxcbiAgfSxcbiAgJ2dlbi1wci1nZW1pbmknOiB7XG4gICAgbmFtZTogJ0dlbmVyYXRlIFBSIHdpdGggR2VtaW5pIENMSScsXG4gICAgb246IHtcbiAgICAgIGlzc3Vlczoge1xuICAgICAgICB0eXBlczogWydsYWJlbGVkJ10sXG4gICAgICB9LFxuICAgICAgcHVsbF9yZXF1ZXN0OiB7XG4gICAgICAgIHR5cGVzOiBbJ2xhYmVsZWQnXSxcbiAgICAgIH0sXG4gICAgfSxcbiAgICBqb2JzOiB7XG4gICAgICAnZ2VuLXByJzoge1xuICAgICAgICBpZjogXCJjb250YWlucyhnaXRodWIuZXZlbnQubGFiZWwubmFtZSwgJ2dlbi1wci1hbGwnKSB8fCBjb250YWlucyhnaXRodWIuZXZlbnQubGFiZWwubmFtZSwgJ2dlbi1wci1nZW1pbmknKVwiLFxuICAgICAgICB1c2VzOiAnV2lsbEJvb3N0ZXIvcmV1c2FibGUtd29ya2Zsb3dzLy5naXRodWIvd29ya2Zsb3dzL2dlbi1wci55bWxAbWFpbicsXG4gICAgICAgIHdpdGg6IHtcbiAgICAgICAgICAnY29kaW5nLXRvb2wnOiAnZ2VtaW5pLWNsaScsXG4gICAgICAgICAgJ2lzc3VlLW51bWJlcic6ICcke3sgZ2l0aHViLmV2ZW50Lmlzc3VlLm51bWJlciB8fCBnaXRodWIuZXZlbnQubnVtYmVyIH19JyxcbiAgICAgICAgICAndGVzdC1jb21tYW5kJzogJ3lhcm58YnVuIGNoZWNrLWFsbC1mb3ItYWknLFxuICAgICAgICB9LFxuICAgICAgICBzZWNyZXRzOiB7XG4gICAgICAgICAgR0VNSU5JX0FQSV9LRVk6ICcke3sgc2VjcmV0cy5HRU1JTklfQVBJX0tFWSB9fScsXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgIH0sXG4gIH0sXG59IGFzIGNvbnN0O1xuXG50eXBlIEtub3duS2luZCA9IGtleW9mIHR5cGVvZiB3b3JrZmxvd3MgfCAnZGVwbG95JyB8ICdhdXRvZml4JztcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlV29ya2Zsb3dzKHJvb3RDb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgZmlsZU5hbWVzVG9CZVJlbW92ZWQgPSBbXG4gICAgJ2FkZC1mb2N1c2VkLWlzc3VlLXRvLXByb2plY3QueW1sJyxcbiAgICAnYWRkLWlzc3VlLXRvLXByb2plY3QueW1sJyxcbiAgICAnYWRkLXJlYWR5LWlzc3VlLXRvLXByb2plY3QueW1sJyxcbiAgICAnbm90aWZ5LXJlYWR5LnltbCcsXG4gICAgJ3diZnkueW1sJyxcbiAgICAnd2JmeS1tZXJnZS55bWwnLFxuICBdO1xuXG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZ2VuZXJhdGVXb3JrZmxvdycsIGFzeW5jICgpID0+IHtcbiAgICBpZiAoaXNSZXVzYWJsZVdvcmtmbG93c1JlcG8ocm9vdENvbmZpZy5yZXBvc2l0b3J5KSkge1xuICAgICAgLy8gRG9uJ3QgdG91Y2ggcmV1c2FibGUtd29ya2Zsb3dzIHJlcG8gYmVjYXVzZSBpdCBob3N0cyB1cHN0cmVhbSB3b3JrZmxvdyBkZWZpbml0aW9ucy5cbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCB3b3JrZmxvd3NQYXRoID0gcGF0aC5yZXNvbHZlKHJvb3RDb25maWcuZGlyUGF0aCwgJy5naXRodWInLCAnd29ya2Zsb3dzJyk7XG4gICAgYXdhaXQgZnMucHJvbWlzZXMubWtkaXIod29ya2Zsb3dzUGF0aCwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG5cbiAgICAvLyBSZW1vdmUgY29uZmlnIG9mIHNlbWFudGljIHB1bGwgcmVxdWVzdFxuICAgIGNvbnN0IHNlbWFudGljWW1sUGF0aCA9IHBhdGgucmVzb2x2ZShyb290Q29uZmlnLmRpclBhdGgsICcuZ2l0aHViJywgJ3NlbWFudGljLnltbCcpO1xuICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiBmcy5wcm9taXNlcy5ybShzZW1hbnRpY1ltbFBhdGgsIHsgZm9yY2U6IHRydWUsIHJlY3Vyc2l2ZTogdHJ1ZSB9KSk7XG5cbiAgICBjb25zdCBlbnRyaWVzID0gYXdhaXQgZnMucHJvbWlzZXMucmVhZGRpcih3b3JrZmxvd3NQYXRoLCB7IHdpdGhGaWxlVHlwZXM6IHRydWUgfSk7XG4gICAgY29uc3QgZmlsZU5hbWVTZXQgPSBuZXcgU2V0KFtcbiAgICAgICd0ZXN0LnltbCcsXG4gICAgICAnYXV0b2ZpeC55bWwnLFxuICAgICAgJ3NlbWFudGljLXByLnltbCcsXG4gICAgICAnY2xvc2UtY29tbWVudC55bWwnLFxuICAgICAgJ2dlbi1wci1jbGF1ZGUueW1sJyxcbiAgICAgICdnZW4tcHItY29kZXgueW1sJyxcbiAgICAgICdnZW4tcHItZ2VtaW5pLnltbCcsXG4gICAgICAuLi5lbnRyaWVzLmZpbHRlcigoZGlyZW50KSA9PiBkaXJlbnQuaXNGaWxlKCkgJiYgZGlyZW50Lm5hbWUuZW5kc1dpdGgoJy55bWwnKSkubWFwKChkaXJlbnQpID0+IGRpcmVudC5uYW1lKSxcbiAgICBdKTtcbiAgICBpZiAocm9vdENvbmZpZy5kZXBlbmRpbmcuc2VtYW50aWNSZWxlYXNlKSB7XG4gICAgICBmaWxlTmFtZVNldC5hZGQoJ3JlbGVhc2UueW1sJyk7XG4gICAgfVxuICAgIGZpbGVOYW1lU2V0LmRlbGV0ZSgnYWRkLWlzc3VlLXRvLXByb2plY3QueW1sJyk7XG4gICAgZmlsZU5hbWVTZXQuZGVsZXRlKCdhZGQtcmVhZHktaXNzdWUtdG8tcHJvamVjdC55bWwnKTtcbiAgICBmaWxlTmFtZVNldC5kZWxldGUoJ25vdGlmeS1yZWFkeS55bWwnKTtcblxuICAgIGZvciAoY29uc3QgZmlsZU5hbWUgb2YgZmlsZU5hbWVTZXQpIHtcbiAgICAgIC8vIOWun+mam+OBr0tub3duS2luZOS7peWkluOBruWApOOCguS7o+WFpeOBleOCjOOCi+OBk+OBqOOBq+azqOaEj1xuICAgICAgY29uc3Qga2luZCA9IHBhdGguYmFzZW5hbWUoZmlsZU5hbWUsICcueW1sJykgYXMgS25vd25LaW5kO1xuICAgICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IHdyaXRlV29ya2Zsb3dZYW1sKHJvb3RDb25maWcsIHdvcmtmbG93c1BhdGgsIGtpbmQpKTtcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IGRlcHJlY2F0ZWRGaWxlTmFtZSBvZiBmaWxlTmFtZXNUb0JlUmVtb3ZlZCkge1xuICAgICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+XG4gICAgICAgIGZzLnByb21pc2VzLnJtKHBhdGguam9pbih3b3JrZmxvd3NQYXRoLCBkZXByZWNhdGVkRmlsZU5hbWUpLCB7IGZvcmNlOiB0cnVlLCByZWN1cnNpdmU6IHRydWUgfSlcbiAgICAgICk7XG4gICAgfVxuICB9KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzUmV1c2FibGVXb3JrZmxvd3NSZXBvKHJlcG9zaXRvcnk/OiBzdHJpbmcpOiBib29sZWFuIHtcbiAgcmV0dXJuIHJlcG9zaXRvcnk/LmVuZHNXaXRoKCcvcmV1c2FibGUtd29ya2Zsb3dzJykgPz8gZmFsc2U7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHdyaXRlV29ya2Zsb3dZYW1sKGNvbmZpZzogUGFja2FnZUNvbmZpZywgd29ya2Zsb3dzUGF0aDogc3RyaW5nLCBraW5kOiBLbm93bktpbmQpOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgZmlsZVBhdGggPSBwYXRoLmpvaW4od29ya2Zsb3dzUGF0aCwgYCR7a2luZH0ueW1sYCk7XG5cbiAgaWYgKGtpbmQgPT09ICdhdXRvZml4Jykge1xuICAgIGNvbnN0IG5ld1NldHRpbmdzID0gZ2VuZXJhdGVBdXRvZml4V29ya2Zsb3coY29uZmlnKTtcbiAgICBtaWdyYXRlV29ya2Zsb3cobmV3U2V0dGluZ3MpO1xuICAgIGF3YWl0IHdyaXRlWWFtbChuZXdTZXR0aW5ncywgZmlsZVBhdGgpO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGxldCBuZXdTZXR0aW5ncyA9IGNsb25lRGVlcChraW5kIGluIHdvcmtmbG93cyA/IHdvcmtmbG93c1traW5kIGFzIGtleW9mIHR5cGVvZiB3b3JrZmxvd3NdIDoge30pIGFzIFdvcmtmbG93O1xuICAvLyBTa2lwIGEgYnJva2VuIHdvcmtmbG93XG4gIGlmICghKCdqb2JzJyBpbiBuZXdTZXR0aW5ncykpIHJldHVybjtcblxuICB0cnkge1xuICAgIGNvbnN0IG9sZENvbnRlbnQgPSBhd2FpdCBmcy5wcm9taXNlcy5yZWFkRmlsZShmaWxlUGF0aCwgJ3V0ZjgnKTtcbiAgICBjb25zdCBvbGRTZXR0aW5ncyA9IHlhbWwubG9hZChvbGRDb250ZW50KSBhcyBXb3JrZmxvdztcbiAgICBuZXdTZXR0aW5ncyA9IG1lcmdlLmFsbChbbmV3U2V0dGluZ3MsIG9sZFNldHRpbmdzLCBuZXdTZXR0aW5nc10sIHsgYXJyYXlNZXJnZTogY29tYmluZU1lcmdlIH0pIGFzIFdvcmtmbG93O1xuICB9IGNhdGNoIHtcbiAgICAvLyBkbyBub3RoaW5nXG4gIH1cblxuICBpZiAoa2luZC5zdGFydHNXaXRoKCdkZXBsb3knKSkge1xuICAgIG5ld1NldHRpbmdzID0ge1xuICAgICAgLi4ubmV3U2V0dGluZ3MsXG4gICAgICBjb25jdXJyZW5jeToge1xuICAgICAgICBncm91cDogJyR7eyBnaXRodWIud29ya2Zsb3cgfX0nLFxuICAgICAgICAnY2FuY2VsLWluLXByb2dyZXNzJzogZmFsc2UsXG4gICAgICB9LFxuICAgIH07XG4gICAgLy8gTW92ZSBqb2JzIHRvIHRoZSBib3R0b21cbiAgICBtb3ZlVG9Cb3R0b20obmV3U2V0dGluZ3MsICdqb2JzJyk7XG4gICAgaWYgKG5ld1NldHRpbmdzLm9uPy5wdXNoKSB7XG4gICAgICBuZXdTZXR0aW5ncy5vbi5wdXNoWydwYXRocy1pZ25vcmUnXSA9IFtcbiAgICAgICAgLi4ubmV3IFNldChbJyoqLm1kJywgJyoqL2RvY3MvKionLCAuLi4obmV3U2V0dGluZ3Mub24ucHVzaFsncGF0aHMtaWdub3JlJ10gPz8gW10pXSksXG4gICAgICBdO1xuICAgIH1cbiAgfVxuXG4gIGxldCBpc1JldXNhYmxlV29ya2Zsb3cgPSBmYWxzZTtcbiAgZm9yIChjb25zdCBqb2Igb2YgT2JqZWN0LnZhbHVlcyhuZXdTZXR0aW5ncy5qb2JzKSkge1xuICAgIC8vIElnbm9yZSBub24tcmV1c2FibGUgd29ya2Zsb3dzXG4gICAgaWYgKCFqb2IudXNlcz8uaW5jbHVkZXMoJy9yZXVzYWJsZS13b3JrZmxvd3MvJykpIGNvbnRpbnVlO1xuXG4gICAgbm9ybWFsaXplSm9iKGNvbmZpZywgam9iLCBraW5kKTtcbiAgICBpc1JldXNhYmxlV29ya2Zsb3cgPSB0cnVlO1xuICB9XG4gIGlmICghaXNSZXVzYWJsZVdvcmtmbG93KSByZXR1cm47XG5cbiAgc3dpdGNoIChraW5kKSB7XG4gICAgY2FzZSAncmVsZWFzZSc6IHtcbiAgICAgIGlmIChuZXdTZXR0aW5ncy5vbj8uc2NoZWR1bGUpIHtcbiAgICAgICAgZGVsZXRlIG5ld1NldHRpbmdzLm9uLnB1c2g7XG4gICAgICB9IGVsc2UgaWYgKG5ld1NldHRpbmdzLm9uPy5wdXNoICYmIGNvbmZpZy5yZWxlYXNlLmJyYW5jaGVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgbmV3U2V0dGluZ3Mub24ucHVzaC5icmFuY2hlcyA9IGNvbmZpZy5yZWxlYXNlLmJyYW5jaGVzO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gRG9uJ3QgdXNlIHJlbGVhc2UueW1sIGlmIHJlbGVhc2UgYnJhbmNoIGlzIG5vdCBzcGVjaWZpZWRcbiAgICAgICAgYXdhaXQgZnMucHJvbWlzZXMucm0ocGF0aC5qb2luKHdvcmtmbG93c1BhdGgsICdyZWxlYXNlLnltbCcpLCB7IGZvcmNlOiB0cnVlIH0pO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBicmVhaztcbiAgICB9XG4gICAgY2FzZSAndGVzdCc6IHtcbiAgICAgIC8vIERvbid0IHVzZSBgcGF0aHMtaWdub3JlYCBmb3IgdGVzdCBiZWNhdXNlIEdpdEh1YidzIEJyYW5jaCBQcm90ZWN0aW9uIGFuZCBSdWxlc2V0cyByZXF1aXJlIGpvYiBydW5uaW5nLlxuICAgICAgaWYgKG5ld1NldHRpbmdzLm9uPy5wdWxsX3JlcXVlc3QpIHtcbiAgICAgICAgZGVsZXRlIG5ld1NldHRpbmdzLm9uLnB1bGxfcmVxdWVzdFsncGF0aHMtaWdub3JlJ107XG4gICAgICB9XG4gICAgICBpZiAobmV3U2V0dGluZ3Mub24/LnB1c2gpIHtcbiAgICAgICAgZGVsZXRlIG5ld1NldHRpbmdzLm9uLnB1c2hbJ3BhdGhzLWlnbm9yZSddO1xuICAgICAgICBuZXdTZXR0aW5ncy5vbi5wdXNoLmJyYW5jaGVzID0gbmV3U2V0dGluZ3Mub24ucHVzaC5icmFuY2hlcy5maWx0ZXIoKGJyYW5jaCkgPT4gYnJhbmNoICE9PSAncmVub3ZhdGUvKionKTtcbiAgICAgIH1cbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgICAvLyBObyBkZWZhdWx0XG4gIH1cbiAgbWlncmF0ZVdvcmtmbG93KG5ld1NldHRpbmdzKTtcbiAgYXdhaXQgd3JpdGVZYW1sKG5ld1NldHRpbmdzLCBmaWxlUGF0aCk7XG5cbiAgaWYgKGtpbmQgPT09ICdyZWxlYXNlJykge1xuICAgIGF3YWl0IGZzLnByb21pc2VzLnJtKHBhdGguam9pbih3b3JrZmxvd3NQYXRoLCAnc2VtYW50aWMtcmVsZWFzZS55bWwnKSwgeyBmb3JjZTogdHJ1ZSB9KTtcbiAgfSBlbHNlIGlmIChraW5kID09PSAnc3luYycpIHtcbiAgICBhd2FpdCBmcy5wcm9taXNlcy5ybShwYXRoLmpvaW4od29ya2Zsb3dzUGF0aCwgJ3N5bmMtaW5pdC55bWwnKSwgeyBmb3JjZTogdHJ1ZSB9KTtcbiAgICBpZiAoIW5ld1NldHRpbmdzLmpvYnMuc3luYz8ud2l0aCkgcmV0dXJuO1xuXG4gICAgLy8gR2VuZXJhdGUgc3luYy1mb3JjZS55bWwgYmFzZWQgb24gc3luYy55bWwgaWYgaXQgZXhpc3RzLlxuICAgIG5ld1NldHRpbmdzLmpvYnNbJ3N5bmMtZm9yY2UnXSA9IG5ld1NldHRpbmdzLmpvYnMuc3luYztcbiAgICBjb25zdCBwYXJhbXMgPSBuZXdTZXR0aW5ncy5qb2JzLnN5bmMud2l0aC5zeW5jX3BhcmFtc193aXRob3V0X2Rlc3Q7XG4gICAgaWYgKHR5cGVvZiBwYXJhbXMgIT09ICdzdHJpbmcnKSByZXR1cm47XG5cbiAgICBuZXdTZXR0aW5ncy5qb2JzLnN5bmMud2l0aC5zeW5jX3BhcmFtc193aXRob3V0X2Rlc3QgPSBgLS1mb3JjZSAke3BhcmFtc31gO1xuICAgIG5ld1NldHRpbmdzLm5hbWUgPSAnRm9yY2UgdG8gU3luYyc7XG4gICAgbmV3U2V0dGluZ3Mub24gPSB7IHdvcmtmbG93X2Rpc3BhdGNoOiBudWxsIH07XG4gICAgZGVsZXRlIG5ld1NldHRpbmdzLmpvYnMuc3luYztcbiAgICBhd2FpdCB3cml0ZVlhbWwobmV3U2V0dGluZ3MsIHBhdGguam9pbih3b3JrZmxvd3NQYXRoLCAnc3luYy1mb3JjZS55bWwnKSk7XG4gIH1cbn1cblxuZnVuY3Rpb24gbm9ybWFsaXplSm9iKGNvbmZpZzogUGFja2FnZUNvbmZpZywgam9iOiBKb2IsIGtpbmQ6IEtub3duS2luZCk6IHZvaWQge1xuICBqb2Iud2l0aCA/Pz0ge307XG4gIGpvYi5zZWNyZXRzID8/PSB7fTtcbiAgLy8gVXNlIHRydXN0ZWQgcHVibGlzaGluZyBpbnN0ZWFkIG9mIE5QTV9UT0tFTlxuICBkZWxldGUgam9iLnNlY3JldHMuTlBNX1RPS0VOO1xuXG4gIGlmIChcbiAgICBraW5kID09PSAndGVzdCcgfHxcbiAgICBraW5kID09PSAncmVsZWFzZScgfHxcbiAgICBraW5kID09PSAnZ2VuLXByLWNsYXVkZScgfHxcbiAgICBraW5kID09PSAnZ2VuLXByLWNvZGV4JyB8fFxuICAgIGtpbmQgPT09ICdnZW4tcHItZ2VtaW5pJ1xuICApIHtcbiAgICBqb2Iuc2VjcmV0cy5HSF9UT0tFTiA9ICcke3sgc2VjcmV0cy5HSVRIVUJfVE9LRU4gfX0nO1xuICB9XG5cbiAgLy8gU2V0IHRlc3QtY29tbWFuZCBmb3IgZ2VuLXByIHdvcmtmbG93cyBiYXNlZCBvbiBwYWNrYWdlIG1hbmFnZXJcbiAgaWYgKGtpbmQgPT09ICdnZW4tcHItY2xhdWRlJyB8fCBraW5kID09PSAnZ2VuLXByLWNvZGV4JyB8fCBraW5kID09PSAnZ2VuLXByLWdlbWluaScpIHtcbiAgICBqb2Iud2l0aFsndGVzdC1jb21tYW5kJ10gPSBjb25maWcuaXNCdW4gPyAnYnVuIHJ1biBjaGVjay1hbGwtZm9yLWFpJyA6ICd5YXJuIGNoZWNrLWFsbC1mb3ItYWknO1xuICB9XG4gIGlmIChqb2Iuc2VjcmV0cy5GSVJFQkFTRV9UT0tFTikge1xuICAgIGpvYi5zZWNyZXRzLkdDUF9TQV9LRVlfSlNPTl9GT1JfRklSRUJBU0UgPSAnJHt7IHNlY3JldHMuR0NQX1NBX0tFWV9KU09OX0ZPUl9GSVJFQkFTRSB9fSc7XG4gICAgZGVsZXRlIGpvYi5zZWNyZXRzLkZJUkVCQVNFX1RPS0VOO1xuICB9XG4gIGlmIChcbiAgICAoam9iLnNlY3JldHMuRElTQ09SRF9XRUJIT09LX1VSTCAmJiAoa2luZCA9PT0gJ3JlbGVhc2UnIHx8IGtpbmQuc3RhcnRzV2l0aCgnZGVwbG95JykpKSB8fFxuICAgIChqb2Iud2l0aC5zZXJ2ZXJfdXJsICYmIGtpbmQuc3RhcnRzV2l0aCgnZGVwbG95JykpXG4gICkge1xuICAgIGpvYi5zZWNyZXRzLkRJU0NPUkRfV0VCSE9PS19VUkwgPSAnJHt7IHNlY3JldHMuRElTQ09SRF9XRUJIT09LX1VSTF9GT1JfUkVMRUFTRSB9fSc7XG4gIH1cblxuICBpZiAoa2luZCA9PT0gJ3N5bmMnKSB7XG4gICAgY29uc3QgcGFyYW1zID0gam9iLndpdGguc3luY19wYXJhbXNfd2l0aG91dF9kZXN0O1xuICAgIGlmICh0eXBlb2YgcGFyYW1zID09PSAnc3RyaW5nJykge1xuICAgICAgam9iLndpdGguc3luY19wYXJhbXNfd2l0aG91dF9kZXN0ID0gcGFyYW1zLnJlcGxhY2UoJ3N5bmMgJywgJycpO1xuICAgIH1cbiAgfVxuXG4gIGlmIChjb25maWcucmVwb3NpdG9yeT8uc3RhcnRzV2l0aCgnZ2l0aHViOldpbGxCb29zdGVyLycpKSB7XG4gICAgam9iLnVzZXMgPSBqb2IudXNlcz8ucmVwbGFjZSgnV2lsbEJvb3N0ZXJMYWIvJywgJ1dpbGxCb29zdGVyLycpO1xuICB9IGVsc2UgaWYgKGNvbmZpZy5yZXBvc2l0b3J5Py5zdGFydHNXaXRoKCdnaXRodWI6V2lsbEJvb3N0ZXJMYWIvJykpIHtcbiAgICBqb2IudXNlcyA9IGpvYi51c2VzPy5yZXBsYWNlKCdXaWxsQm9vc3Rlci8nLCAnV2lsbEJvb3N0ZXJMYWIvJyk7XG4gIH1cblxuICAvLyBSZW1vdmUgcmVkdW5kYW50IHBhcmFtZXRlcnNcbiAgaWYgKGpvYi53aXRoLmRvdF9lbnZfcGF0aCA9PT0gJy5lbnYnKSB7XG4gICAgZGVsZXRlIGpvYi53aXRoLmRvdF9lbnZfcGF0aDtcbiAgfVxuICAvLyBSZW1vdmUgZGVwcmVjYXRlZCBwYXJhbWV0ZXJzXG4gIG1pZ3JhdGVKb2Ioam9iKTtcblxuICAvLyBEb24ndCB1c2UgYGZseSBkZXBsb3kgLS1qc29uYCBzaW5jZSBpdCBjYXVzZXMgYW4gZXJyb3JcbiAgaWYgKGtpbmQuc3RhcnRzV2l0aCgnZGVwbG95JykgJiYgam9iLnNlY3JldHMuRkxZX0FQSV9UT0tFTiAmJiB0eXBlb2Ygam9iLndpdGguZGVwbG95X2NvbW1hbmQgPT09ICdzdHJpbmcnKSB7XG4gICAgam9iLndpdGguZGVwbG95X2NvbW1hbmQgPSBqb2Iud2l0aC5kZXBsb3lfY29tbWFuZC5yZXBsYWNlKC9cXHMrLS1qc29uLywgJycpO1xuICB9XG4gIGlmIChjb25maWcuZG9lc0NvbnRhaW5Eb2NrZXJmaWxlICYmICFqb2Iud2l0aC5jaV9sYWJlbCAmJiBraW5kLnN0YXJ0c1dpdGgoJ3Rlc3QnKSkge1xuICAgIGpvYi53aXRoLmNpX2xhYmVsID0gJ2xhcmdlJztcbiAgfVxuICAvLyBCZWNhdXNlIGdpdGh1Yi5ldmVudC5yZXBvc2l0b3J5LnByaXZhdGUgaXMgYWx3YXlzIHRydWUgaWYgam9iIGlzIHNjaGVkdWxlZFxuICBpZiAoa2luZCA9PT0gJ3JlbGVhc2UnIHx8IGtpbmQgPT09ICd0ZXN0JyB8fCBraW5kLnN0YXJ0c1dpdGgoJ2RlcGxveScpKSB7XG4gICAgaWYgKGNvbmZpZy5pc1B1YmxpY1JlcG8pIHtcbiAgICAgIGpvYi53aXRoLmdpdGh1Yl9ob3N0ZWRfcnVubmVyID0gdHJ1ZTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgZGVsZXRlIGpvYi53aXRoLmdpdGh1Yl9ob3N0ZWRfcnVubmVyO1xuICB9XG5cbiAgaWYgKE9iamVjdC5rZXlzKGpvYi53aXRoKS5sZW5ndGggPiAwKSB7XG4gICAgc29ydEtleXMoam9iLndpdGgpO1xuICB9IGVsc2Uge1xuICAgIGRlbGV0ZSBqb2Iud2l0aDtcbiAgfVxuICBpZiAoT2JqZWN0LmtleXMoam9iLnNlY3JldHMpLmxlbmd0aCA+IDApIHtcbiAgICAvLyBNb3ZlIHNlY3JldHMgcHJvcCBhZnRlciB3aXRoIHByb3BcbiAgICBjb25zdCBuZXdTZWNyZXRzID0gc29ydEtleXMoam9iLnNlY3JldHMpO1xuICAgIGRlbGV0ZSBqb2Iuc2VjcmV0cztcbiAgICBqb2Iuc2VjcmV0cyA9IG5ld1NlY3JldHM7XG4gIH0gZWxzZSB7XG4gICAgZGVsZXRlIGpvYi5zZWNyZXRzO1xuICB9XG59XG5cbmZ1bmN0aW9uIGdlbmVyYXRlQXV0b2ZpeFdvcmtmbG93KGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFdvcmtmbG93IHtcbiAgaWYgKCFjb25maWcuaXNQdWJsaWNSZXBvKSB7XG4gICAgcmV0dXJuIGNsb25lRGVlcChwcml2YXRlUmVwb0F1dG9maXhXb3JrZmxvdyk7XG4gIH1cblxuICBjb25zdCBwYWNrYWdlTWFuYWdlciA9IGNvbmZpZy5pc0J1biA/ICdidW4nIDogJ3lhcm4nO1xuICBjb25zdCBzY3JpcHRSdW5uZXIgPSBjb25maWcuaXNCdW4gPyAnYnVuIHJ1bicgOiAneWFybic7XG4gIGNvbnN0IHN0ZXBzOiBTdGVwW10gPSBbXG4gICAgeyB1c2VzOiAnYWN0aW9ucy9jaGVja291dEB2NicgfSxcbiAgICB7IHVzZXM6ICdhY3Rpb25zL3NldHVwLW5vZGVAdjYnLCB3aXRoOiB7ICdjaGVjay1sYXRlc3QnOiB0cnVlIH0gfSxcbiAgICAuLi4oY29uZmlnLmlzQnVuID8gW3sgdXNlczogJ292ZW4tc2gvc2V0dXAtYnVuQHYxJywgd2l0aDogeyAnYnVuLXZlcnNpb24nOiAnbGF0ZXN0JyB9IH1dIDogW10pLFxuICAgIHsgcnVuOiBgJHtwYWNrYWdlTWFuYWdlcn0gaW5zdGFsbGAgfSxcbiAgICB7IHJ1bjogYCR7c2NyaXB0UnVubmVyfSBjbGVhbnVwYCB9LFxuICBdO1xuICBpZiAoY29uZmlnLnBhY2thZ2VKc29uPy5zY3JpcHRzPy5idWlsZCkge1xuICAgIHN0ZXBzLnB1c2goeyBydW46IGAke3NjcmlwdFJ1bm5lcn0gYnVpbGRgIH0pO1xuICB9XG4gIHN0ZXBzLnB1c2goeyB1c2VzOiAnYXV0b2ZpeC1jaS9hY3Rpb25AdjEnIH0pO1xuXG4gIGNvbnN0IGF1dG9maXhXb3JrZmxvdyA9IGNsb25lRGVlcChwdWJsaWNSZXBvQXV0b2ZpeFdvcmtmbG93KTtcbiAgYXV0b2ZpeFdvcmtmbG93LmpvYnMgPSB7XG4gICAgYXV0b2ZpeDoge1xuICAgICAgJ3J1bnMtb24nOiAndWJ1bnR1LWxhdGVzdCcsXG4gICAgICBzdGVwcyxcbiAgICB9LFxuICB9O1xuICByZXR1cm4gYXV0b2ZpeFdvcmtmbG93O1xufVxuXG5hc3luYyBmdW5jdGlvbiB3cml0ZVlhbWwobmV3U2V0dGluZ3M6IFdvcmtmbG93LCBmaWxlUGF0aDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IHlhbWxUZXh0ID0geWFtbC5kdW1wKG5ld1NldHRpbmdzLCB7IGxpbmVXaWR0aDogLTEsIG5vQ29tcGF0TW9kZTogdHJ1ZSwgc3R5bGVzOiB7ICchIW51bGwnOiAnZW1wdHknIH0gfSk7XG4gIGF3YWl0IGZzLnByb21pc2VzLndyaXRlRmlsZShmaWxlUGF0aCwgeWFtbFRleHQpO1xufVxuXG5mdW5jdGlvbiBtaWdyYXRlV29ya2Zsb3cobmV3U2V0dGluZ3M6IFdvcmtmbG93KTogdm9pZCB7XG4gIC8vIFRPRE86IFJlbW92ZSB0aGVtIGFmdGVyIDIwMjMtMDMtMzFcbiAgZGVsZXRlIG5ld1NldHRpbmdzLmpvYnNbJ2FkZC10by1wcm9qZWN0J107XG59XG5cbmZ1bmN0aW9uIG1pZ3JhdGVKb2Ioam9iOiBKb2IpOiB2b2lkIHtcbiAgLy8gVE9ETzogUmVtb3ZlIHRoZW0gYWZ0ZXIgMjAyMy0wMy0zMVxuICBpZiAoIWpvYi53aXRoKSByZXR1cm47XG4gIGRlbGV0ZSBqb2Iud2l0aC5ub25fc2VsZl9ob3N0ZWQ7XG4gIGRlbGV0ZSBqb2Iud2l0aC5ub3RpZnlfZGlzY29yZDtcbiAgZGVsZXRlIGpvYi53aXRoLnJlcXVpcmVfZmx5O1xuICBkZWxldGUgam9iLndpdGgucmVxdWlyZV9nY2xvdWQ7XG4gIGRlbGV0ZSBqb2Iud2l0aC5sYWJlbDtcbiAgZGVsZXRlIGpvYi53aXRoLmxhYmVsT3BlcmF0b3I7XG4gIC8vIEFkZGVkIDIwMjUtMDgtMDZcbiAgaWYgKGpvYi53aXRoLmNpX3NpemUpIHtcbiAgICBqb2Iud2l0aC5jaV9sYWJlbCA9IGpvYi53aXRoLmNpX3NpemU7XG4gICAgZGVsZXRlIGpvYi53aXRoLmNpX3NpemU7XG4gIH1cbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCBmZyBmcm9tICdmYXN0LWdsb2InO1xuXG5pbXBvcnQgeyBpc1JldXNhYmxlV29ya2Zsb3dzUmVwbyB9IGZyb20gJy4uL2dlbmVyYXRvcnMvd29ya2Zsb3cuanMnO1xuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB7IG9wdGlvbnMgfSBmcm9tICcuLi9vcHRpb25zLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZnNVdGlsIH0gZnJvbSAnLi4vdXRpbHMvZnNVdGlsLmpzJztcbmltcG9ydCB7IGdsb2JJZ25vcmUgfSBmcm9tICcuLi91dGlscy9nbG9iVXRpbC5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGZpeFR5cG9zKHBhY2thZ2VDb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdmaXhUeXBvcycsIGFzeW5jICgpID0+IHtcbiAgICBpZiAoaXNSZXVzYWJsZVdvcmtmbG93c1JlcG8ocGFja2FnZUNvbmZpZy5yZXBvc2l0b3J5KSkgcmV0dXJuO1xuXG4gICAgY29uc3QgZGlyUGF0aCA9IHBhY2thZ2VDb25maWcuZGlyUGF0aDtcbiAgICBjb25zdCBkb2NGaWxlcyA9IGF3YWl0IGZnLmdsb2IoJyoqLyoubWQnLCB7IGRvdDogdHJ1ZSwgY3dkOiBkaXJQYXRoLCBpZ25vcmU6IGdsb2JJZ25vcmUgfSk7XG4gICAgaWYgKG9wdGlvbnMuaXNWZXJib3NlKSB7XG4gICAgICBjb25zb2xlLmluZm8oYEZvdW5kICR7ZG9jRmlsZXMubGVuZ3RofSBtYXJrZG93biBmaWxlcyBpbiAke2RpclBhdGh9YCk7XG4gICAgfVxuICAgIGZvciAoY29uc3QgbWRGaWxlIG9mIGRvY0ZpbGVzKSB7XG4gICAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGguam9pbihkaXJQYXRoLCBtZEZpbGUpO1xuICAgICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKGFzeW5jICgpID0+IHtcbiAgICAgICAgY29uc3QgY29udGVudCA9IGF3YWl0IGZzLnByb21pc2VzLnJlYWRGaWxlKGZpbGVQYXRoLCAndXRmOCcpO1xuICAgICAgICBsZXQgbmV3Q29udGVudCA9IGZpeFR5cG9zSW5UZXh0KGNvbnRlbnQpO1xuICAgICAgICBuZXdDb250ZW50ID0gcmVwbGFjZVdpdGhDb25maWcobmV3Q29udGVudCwgcGFja2FnZUNvbmZpZywgJ2RvYycpO1xuICAgICAgICBpZiAoY29udGVudCAhPT0gbmV3Q29udGVudCkge1xuICAgICAgICAgIGF3YWl0IGZzVXRpbC5nZW5lcmF0ZUZpbGUoZmlsZVBhdGgsIG5ld0NvbnRlbnQpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBjb25zdCB0c0ZpbGVzID0gYXdhaXQgZmcuZ2xvYihcbiAgICAgIFtcbiAgICAgICAgJ3thcHAsc3JjLHRlc3Qsc2NyaXB0c30vKiovKi57Y2pzLG1qcyxqcyxqc3gsY3RzLG10cyx0cyx0c3h9JyxcbiAgICAgICAgJ3BhY2thZ2VzLyoqL3thcHAsc3JjLHRlc3Qsc2NyaXB0c30vKiovKi57Y2pzLG1qcyxqcyxqc3gsY3RzLG10cyx0cyx0c3h9JyxcbiAgICAgIF0sXG4gICAgICB7IGRvdDogdHJ1ZSwgY3dkOiBkaXJQYXRoLCBpZ25vcmU6IGdsb2JJZ25vcmUgfVxuICAgICk7XG4gICAgaWYgKG9wdGlvbnMuaXNWZXJib3NlKSB7XG4gICAgICBjb25zb2xlLmluZm8oYEZvdW5kICR7dHNGaWxlcy5sZW5ndGh9IFR5cGVTY3JpcHQgZmlsZXMgaW4gJHtkaXJQYXRofWApO1xuICAgIH1cbiAgICBmb3IgKGNvbnN0IHRzRmlsZSBvZiB0c0ZpbGVzKSB7XG4gICAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGguam9pbihkaXJQYXRoLCB0c0ZpbGUpO1xuICAgICAgY29uc3Qgb2xkQ29udGVudCA9IGF3YWl0IGZzLnByb21pc2VzLnJlYWRGaWxlKGZpbGVQYXRoLCAndXRmOCcpO1xuICAgICAgbGV0IG5ld0NvbnRlbnQgPSBmaXhUeXBvc0luQ29kZShvbGRDb250ZW50KTtcbiAgICAgIG5ld0NvbnRlbnQgPSByZXBsYWNlV2l0aENvbmZpZyhuZXdDb250ZW50LCBwYWNrYWdlQ29uZmlnLCAndHMnKTtcblxuICAgICAgaWYgKG9sZENvbnRlbnQgPT09IG5ld0NvbnRlbnQpIGNvbnRpbnVlO1xuICAgICAgYXdhaXQgZnNVdGlsLmdlbmVyYXRlRmlsZShmaWxlUGF0aCwgbmV3Q29udGVudCk7XG4gICAgfVxuXG4gICAgY29uc3QgdGV4dEJhc2VkRmlsZXMgPSBhd2FpdCBmZy5nbG9iKCcqKi8qLntjc3YsaHRtLGh0bWwsdHN2LHhtbCx5YW1sLHltbH0nLCB7XG4gICAgICBkb3Q6IHRydWUsXG4gICAgICBjd2Q6IGRpclBhdGgsXG4gICAgICBpZ25vcmU6IGdsb2JJZ25vcmUsXG4gICAgfSk7XG4gICAgaWYgKG9wdGlvbnMuaXNWZXJib3NlKSB7XG4gICAgICBjb25zb2xlLmluZm8oYEZvdW5kICR7dGV4dEJhc2VkRmlsZXMubGVuZ3RofSB0ZXh0LWJhc2VkIGZpbGVzIGluICR7ZGlyUGF0aH1gKTtcbiAgICB9XG4gICAgZm9yIChjb25zdCBmaWxlIG9mIHRleHRCYXNlZEZpbGVzKSB7XG4gICAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGguam9pbihkaXJQYXRoLCBmaWxlKTtcbiAgICAgIGNvbnN0IG9sZENvbnRlbnQgPSBhd2FpdCBmcy5wcm9taXNlcy5yZWFkRmlsZShmaWxlUGF0aCwgJ3V0ZjgnKTtcbiAgICAgIGxldCBuZXdDb250ZW50ID0gZml4VHlwb3NJblRleHQob2xkQ29udGVudCk7XG4gICAgICBuZXdDb250ZW50ID0gcmVwbGFjZVdpdGhDb25maWcobmV3Q29udGVudCwgcGFja2FnZUNvbmZpZywgJ3RleHQnKTtcblxuICAgICAgaWYgKG9sZENvbnRlbnQgPT09IG5ld0NvbnRlbnQpIGNvbnRpbnVlO1xuICAgICAgYXdhaXQgZnNVdGlsLmdlbmVyYXRlRmlsZShmaWxlUGF0aCwgbmV3Q29udGVudCk7XG4gICAgfVxuXG4gICAgYXdhaXQgcHJvbWlzZVBvb2wucHJvbWlzZUFsbCgpO1xuICB9KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGZpeFR5cG9zSW5UZXh0KGNvbnRlbnQ6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiBjb250ZW50XG4gICAgLnJlcGxhY2VBbGwoL1xcYmNcXC5mXFwuKFteJF0pL2csICdjZi4kMScpXG4gICAgLnJlcGxhY2VBbGwoL1xcYmVnXFwuKFteJF0pL2csICdlLmcuJDEnKVxuICAgIC5yZXBsYWNlQWxsKC9cXGJpZVxcLihbXiRdKS9nLCAnaS5lLiQxJyk7XG59XG5cbmZ1bmN0aW9uIGZpeFR5cG9zSW5Db2RlKGNvbnRlbnQ6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiBjb250ZW50XG4gICAgLnJlcGxhY2VBbGwoL1xcL1xcLyguKiljXFwuZlxcLi9nLCAnLy8kMWNmLicpXG4gICAgLnJlcGxhY2VBbGwoL1xcL1xcLyguKillZ1xcLi9nLCAnLy8kMWUuZy4nKVxuICAgIC5yZXBsYWNlQWxsKC9cXC9cXC8oLiopaWVcXC4vZywgJy8vJDFpLmUuJyk7XG59XG5cbmZ1bmN0aW9uIHJlcGxhY2VXaXRoQ29uZmlnKG5ld0NvbnRlbnQ6IHN0cmluZywgcGFja2FnZUNvbmZpZzogUGFja2FnZUNvbmZpZywgcHJvcE5hbWU6ICdkb2MnIHwgJ3RzJyB8ICd0ZXh0Jyk6IHN0cmluZyB7XG4gIGZvciAoY29uc3QgW2JlZm9yZSwgYWZ0ZXJdIG9mIE9iamVjdC5lbnRyaWVzKHBhY2thZ2VDb25maWcud2JmeUpzb24/LnR5cG9zPy5hbGwgPz8ge30pKSB7XG4gICAgbmV3Q29udGVudCA9IG5ld0NvbnRlbnQucmVwbGFjZUFsbChiZWZvcmUsIGFmdGVyKTtcbiAgfVxuICBmb3IgKGNvbnN0IFtiZWZvcmUsIGFmdGVyXSBvZiBPYmplY3QuZW50cmllcyhwYWNrYWdlQ29uZmlnLndiZnlKc29uPy50eXBvcz8uW3Byb3BOYW1lXSA/PyB7fSkpIHtcbiAgICBuZXdDb250ZW50ID0gbmV3Q29udGVudC5yZXBsYWNlQWxsKGJlZm9yZSwgYWZ0ZXIpO1xuICB9XG4gIHJldHVybiBuZXdDb250ZW50O1xufVxuIiwiaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZnNVdGlsIH0gZnJvbSAnLi4vdXRpbHMvZnNVdGlsLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVBZ2VudEluc3RydWN0aW9ucyhyb290Q29uZmlnOiBQYWNrYWdlQ29uZmlnLCBhbGxDb25maWdzOiBQYWNrYWdlQ29uZmlnW10pOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdnZW5lcmF0ZUFnZW50SW5zdHJ1Y3Rpb25zJywgYXN5bmMgKCkgPT4ge1xuICAgIGlmICghcm9vdENvbmZpZy5pc1Jvb3QpIHJldHVybjtcblxuICAgIC8vIENoZWNrIGlmIEFHRU5UU19FWFRSQS5tZCBleGlzdHMgYW5kIHJlYWQgaXRzIGNvbnRlbnRcbiAgICBjb25zdCBhZ2VudHNFeHRyYVBhdGggPSBwYXRoLnJlc29sdmUocm9vdENvbmZpZy5kaXJQYXRoLCAnQUdFTlRTX0VYVFJBLm1kJyk7XG4gICAgY29uc3QgZXh0cmFDb250ZW50ID0gYXdhaXQgZnNVdGlsLnJlYWRGaWxlSWdub3JpbmdFcnJvcihhZ2VudHNFeHRyYVBhdGgpO1xuXG4gICAgZm9yIChjb25zdCBbZmlsZU5hbWUsIHRvb2xOYW1lXSBvZiBbXG4gICAgICBbJ0FHRU5UUy5tZCcsICdDb2RleCBDTEknXSxcbiAgICAgIFsnQ0xBVURFLm1kJywgJ0NsYXVkZSBDb2RlJ10sXG4gICAgICBbJ0dFTUlOSS5tZCcsICdHZW1pbmkgQ0xJJ10sXG4gICAgXSBhcyBjb25zdCkge1xuICAgICAgY29uc3QgY29udGVudCA9IGdlbmVyYXRlQWdlbnRJbnN0cnVjdGlvbihyb290Q29uZmlnLCBhbGxDb25maWdzLCB0b29sTmFtZSwgZXh0cmFDb250ZW50KTtcbiAgICAgIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKHJvb3RDb25maWcuZGlyUGF0aCwgZmlsZU5hbWUpO1xuICAgICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzVXRpbC5nZW5lcmF0ZUZpbGUoZmlsZVBhdGgsIGNvbnRlbnQpKTtcbiAgICB9XG5cbiAgICBjb25zdCBjdXJzb3JSdWxlc1BhdGggPSBwYXRoLnJlc29sdmUocm9vdENvbmZpZy5kaXJQYXRoLCAnLmN1cnNvci9ydWxlcy9nZW5lcmFsLm1kYycpO1xuICAgIGNvbnN0IGN1cnNvclJ1bGVzQ29udGVudCA9IGdlbmVyYXRlQ3Vyc29yR2VuZXJhbE1kY0NvbnRlbnQocm9vdENvbmZpZywgYWxsQ29uZmlncywgZXh0cmFDb250ZW50KTtcbiAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnNVdGlsLmdlbmVyYXRlRmlsZShjdXJzb3JSdWxlc1BhdGgsIGN1cnNvclJ1bGVzQ29udGVudCkpO1xuICB9KTtcbn1cblxuZnVuY3Rpb24gZ2VuZXJhdGVBZ2VudEluc3RydWN0aW9uKFxuICByb290Q29uZmlnOiBQYWNrYWdlQ29uZmlnLFxuICBhbGxDb25maWdzOiBQYWNrYWdlQ29uZmlnW10sXG4gIHRvb2xOYW1lOiBzdHJpbmcsXG4gIGV4dHJhQ29udGVudD86IHN0cmluZ1xuKTogc3RyaW5nIHtcbiAgY29uc3QgcGFja2FnZU1hbmFnZXIgPSByb290Q29uZmlnLmlzQnVuID8gJ2J1bicgOiAneWFybic7XG4gIGNvbnN0IGJhc2VDb250ZW50ID0gYFxuIyMgUHJvamVjdCBJbmZvcm1hdGlvblxuXG4tIE5hbWU6ICR7cm9vdENvbmZpZy5wYWNrYWdlSnNvbj8ubmFtZX1cbi0gRGVzY3JpcHRpb246ICR7cm9vdENvbmZpZy5wYWNrYWdlSnNvbj8uZGVzY3JpcHRpb259XG4tIFBhY2thZ2UgTWFuYWdlcjogJHtwYWNrYWdlTWFuYWdlcn1cblxuIyMgR2VuZXJhbCBJbnN0cnVjdGlvbnNcblxuJHtcbiAgYWxsQ29uZmlncy5zb21lKChjKSA9PiBjLmRlcGVuZGluZy5nZW5JMThuVHMpXG4gICAgPyBgLSBXaGVuIGludHJvZHVjaW5nIG5ldyBzdHJpbmcgbGl0ZXJhbHMgaW4gUmVhY3QgY29tcG9uZW50cywgdXBkYXRlIHRoZSBsYW5ndWFnZSByZXNvdXJjZSBmaWxlcyBpbiB0aGUgXFxgaTE4blxcYCBkaXJlY3RvcnkgKGUuZy4sIFxcYGkxOG4vamEtSlAuanNvblxcYCkuIFJlZmVyZW5jZSB0aGVzZSBzdHJpbmdzIHVzaW5nIHRoZSBcXGBpMThuXFxgIHV0aWxpdHkuIEZvciBleGFtcGxlLCB1c2UgXFxgaTE4bi5wYWdlcy5ob21lLnRpdGxlKClcXGAgZm9yIFxcYHsgXCJwYWdlc1wiOiB7IFwiaG9tZVwiOiB7IFwidGl0bGVcIjogXCJNeSBBcHBcIiB9IH0gfVxcYC5gXG4gICAgOiAnJ1xufVxuLSBEbyBub3Qgd3JpdGUgdGVzdHMgdW5sZXNzIGV4cGxpY2l0bHkgcmVxdWVzdGVkLlxuLSBBZnRlciBtYWtpbmcgY29kZSBjaGFuZ2VzLCBydW4gXFxgJHtwYWNrYWdlTWFuYWdlcn0gY2hlY2stYWxsLWZvci1haVxcYCB0byBleGVjdXRlIGFsbCB0ZXN0cyAobm90ZTogdGhpcyBtYXkgdGFrZSB1cCB0byAzMCBtaW51dGVzKSwgb3IgcnVuIFxcYCR7cGFja2FnZU1hbmFnZXJ9IGNoZWNrLWZvci1haVxcYCBmb3IgdHlwZSBjaGVja2luZyBhbmQgbGludGluZyBvbmx5LlxuICAtIElmIHlvdSBhcmUgY29uZmlkZW50IHlvdXIgY2hhbmdlcyB3aWxsIG5vdCBicmVhayBhbnkgdGVzdHMsIHlvdSBtYXkgdXNlIFxcYGNoZWNrLWZvci1haVxcYC5cbi0gT25jZSB5b3UgaGF2ZSB2ZXJpZmllZCB5b3VyIGNoYW5nZXMsIGNvbW1pdCB0aGVtIHRvIHRoZSBjdXJyZW50IGJyYW5jaCB1c2luZyB0aGUgXFxgLS1uby12ZXJpZnlcXGAgb3B0aW9uIGFuZCBwdXNoIHRvIHRoZSBjdXJyZW50IGJyYW5jaC5cbiAgLSBGb2xsb3cgY29udmVudGlvbmFsIGNvbW1pdHMsIGkuZS4sIHlvdXIgY29tbWl0IG1lc3NhZ2Ugc2hvdWxkIHN0YXJ0IHdpdGggXFxgZmVhdDpcXGAsIFxcYGZpeDpcXGAsIGV0Yy5cbiAgLSBNYWtlIHN1cmUgdG8gYWRkIGEgbmV3IGxpbmUgYXQgdGhlIGVuZCBvZiB5b3VyIGNvbW1pdCBtZXNzYWdlJHtyb290Q29uZmlnLmlzV2lsbEJvb3N0ZXJSZXBvID8gYCB3aXRoOiBcXGBDby1hdXRob3JlZC1ieTogV2lsbEJvb3N0ZXIgKCR7dG9vbE5hbWV9KSA8YWdlbnRAd2lsbGJvb3N0ZXIuY29tPlxcYGAgOiAnJ30uXG4gIC0gQWx3YXlzIGNyZWF0ZSBuZXcgY29tbWl0cy4gQXZvaWQgdXNpbmcgXFxgLS1hbWVuZFxcYC5cbiR7XG4gIGFsbENvbmZpZ3Muc29tZSgoYykgPT4gYy5oYXNTdGFydFRlc3QpXG4gICAgPyBgLSBVc2UgXFxgJHtwYWNrYWdlTWFuYWdlcn0gcnVuIHN0YXJ0LXRlc3RcXGAgdG8gbGF1bmNoIGEgd2ViIHNlcnZlciBmb3IgZGVidWdnaW5nIG9yIHRlc3RpbmcuYFxuICAgIDogJydcbn1cblxuIyMgQ29kaW5nIFN0eWxlXG5cbi0gV3JpdGUgY29tbWVudHMgdGhhdCBleHBsYWluIFwid2h5XCIgcmF0aGVyIHRoYW4gXCJ3aGF0XCIuIEF2b2lkIGV4cGxhbmF0aW9ucyB0aGF0IGNhbiBiZSB1bmRlcnN0b29kIGZyb20gdGhlIGNvZGUgaXRzZWxmLlxuLSBVc2Ugc3RkZXJyIGZvciBsb2dnaW5nIGRlYnVnIG1lc3NhZ2VzIHRlbXBvcmFyaWx5IHNpbmNlIHN0ZG91dCBvdXRwdXQgaXMgc29tZXRpbWVzIG9taXR0ZWQuXG4tIFdoZW4gYWRkaW5nIG5ldyBmdW5jdGlvbnMgb3IgY2xhc3NlcywgZGVmaW5lIHRoZW0gYmVsb3cgYW55IGZ1bmN0aW9ucyBvciBjbGFzc2VzIHRoYXQgY2FsbCB0aGVtIHRvIG1haW50YWluIGNsZWFyIGNhbGwgb3JkZXIuXG4tIFByZWZlciBcXGB1bmRlZmluZWRcXGAgb3ZlciBcXGBudWxsXFxgIHVubGVzcyBleHBsaWNpdGx5IGRlYWxpbmcgd2l0aCBBUElzIG9yIGxpYnJhcmllcyB0aGF0IHJlcXVpcmUgXFxgbnVsbFxcYC5cbi0gQWx3YXlzIHBlcmZvcm0gZXhpc3RlbmNlIGNoZWNrcyBvbiBhcnJheSBkdWUgdG8gXFxgbm9VbmNoZWNrZWRJbmRleGVkQWNjZXNzOiB0cnVlXFxgLlxuJHtcbiAgYWxsQ29uZmlncy5zb21lKChjKSA9PiBjLmRlcGVuZGluZy5yZWFjdCB8fCBjLmRlcGVuZGluZy5uZXh0KVxuICAgID8gYC0gUHJlZmVyIFxcYHVzZUltbWVyXFxgIGZvciBzdG9yaW5nIGFuIGFycmF5IG9yIGFuIG9iamVjdCB0byBcXGB1c2VTdGF0ZVxcYC5gXG4gICAgOiAnJ1xufVxuJHtcbiAgYWxsQ29uZmlncy5zb21lKChjKSA9PiBjLmRlcGVuZGluZy5uZXh0KVxuICAgID8gYC0gU2luY2UgdGhpcyBwcm9qZWN0IHVzZXMgdGhlIFJlYWN0IENvbXBpbGVyLCB5b3UgZG8gbm90IG5lZWQgdG8gdXNlIFxcYHVzZUNhbGxiYWNrXFxgIG9yIFxcYHVzZU1lbW9cXGAgZm9yIHBlcmZvcm1hbmNlIG9wdGltaXphdGlvbi5gXG4gICAgOiAnJ1xufVxuYFxuICAgIC5yZXBsYWNlQWxsKC9cXC5cXG5cXG4rLS9nLCAnLlxcbi0nKVxuICAgIC5yZXBsYWNlQWxsKC9cXG57Myx9L2csICdcXG5cXG4nKVxuICAgIC50cmltKCk7XG5cbiAgcmV0dXJuIGV4dHJhQ29udGVudCA/IGJhc2VDb250ZW50ICsgJ1xcbicgKyBleHRyYUNvbnRlbnQudHJpbUVuZCgpIDogYmFzZUNvbnRlbnQ7XG59XG5cbmZ1bmN0aW9uIGdlbmVyYXRlQ3Vyc29yR2VuZXJhbE1kY0NvbnRlbnQoXG4gIGNvbmZpZzogUGFja2FnZUNvbmZpZyxcbiAgYWxsQ29uZmlnczogUGFja2FnZUNvbmZpZ1tdLFxuICBleHRyYUNvbnRlbnQ/OiBzdHJpbmdcbik6IHN0cmluZyB7XG4gIGNvbnN0IGZyb250bWF0dGVyID0gYC0tLVxcbmRlc2NyaXB0aW9uOiBHZW5lcmFsIENvZGluZyBSdWxlc1xcbmdsb2JzOlxcbmFsd2F5c0FwcGx5OiB0cnVlXFxuLS0tYDtcbiAgY29uc3QgYm9keSA9IGdlbmVyYXRlQWdlbnRJbnN0cnVjdGlvbihjb25maWcsIGFsbENvbmZpZ3MsICdDdXJzb3InLCBleHRyYUNvbnRlbnQpO1xuICByZXR1cm4gYCR7ZnJvbnRtYXR0ZXJ9XFxuXFxuJHtib2R5fWA7XG59XG4iLCJpbXBvcnQgeyBPY3Rva2l0IH0gZnJvbSAnQG9jdG9raXQvY29yZSc7XG5cbmNsYXNzIEdpdEh1YlV0aWwge1xuICBnZXRPcmdBbmROYW1lKHVybE9yRnVsbE5hbWU6IHN0cmluZyk6IFtzdHJpbmcsIHN0cmluZ10ge1xuICAgIGNvbnN0IHVybFdpdGhvdXRQcm90b2NvbCA9IHVybE9yRnVsbE5hbWUuc3BsaXQoJzonKS5hdCgtMSk7XG4gICAgY29uc3QgbmFtZXMgPSB1cmxXaXRob3V0UHJvdG9jb2w/LnNwbGl0KCcvJyk7XG4gICAgY29uc3Qgb3JnID0gbmFtZXM/LmF0KC0yKSA/PyAnJztcbiAgICBjb25zdCBuYW1lID0gbmFtZXM/LmF0KC0xKT8ucmVwbGFjZSgvLmdpdCQvLCAnJykgPz8gJyc7XG4gICAgcmV0dXJuIFtvcmcsIG5hbWVdO1xuICB9XG59XG5leHBvcnQgY29uc3QgZ2l0SHViVXRpbCA9IG5ldyBHaXRIdWJVdGlsKCk7XG5cbmNvbnN0IG9jdG9raXRDYWNoZSA9IG5ldyBNYXA8c3RyaW5nLCBPY3Rva2l0PigpO1xuXG5leHBvcnQgZnVuY3Rpb24gZ2V0T2N0b2tpdChvd25lcj86IHN0cmluZyk6IE9jdG9raXQge1xuICBjb25zdCBrZXkgPSBvd25lciA/PyAnJztcbiAgY29uc3QgY2FjaGVkID0gb2N0b2tpdENhY2hlLmdldChrZXkpO1xuICBpZiAoY2FjaGVkKSByZXR1cm4gY2FjaGVkO1xuXG4gIGNvbnN0IG9jdG9raXQgPSBuZXcgT2N0b2tpdCh7XG4gICAgYXV0aDogZ2V0R2l0SHViVG9rZW4ob3duZXIpIHx8IHVuZGVmaW5lZCxcbiAgfSk7XG4gIG9jdG9raXRDYWNoZS5zZXQoa2V5LCBvY3Rva2l0KTtcbiAgcmV0dXJuIG9jdG9raXQ7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBoYXNHaXRIdWJUb2tlbihvd25lcjogc3RyaW5nKTogYm9vbGVhbiB7XG4gIHJldHVybiAhIWdldEdpdEh1YlRva2VuKG93bmVyKTtcbn1cblxuZnVuY3Rpb24gZ2V0R2l0SHViVG9rZW4ob3duZXI/OiBzdHJpbmcpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBpZiAob3duZXIgPT09ICdXaWxsQm9vc3RlcicpIHtcbiAgICByZXR1cm4gcHJvY2Vzcy5lbnYuR0hfQk9UX1BBVF9GT1JfV0lMTEJPT1NURVI7XG4gIH1cbiAgaWYgKG93bmVyID09PSAnV2lsbEJvb3N0ZXJMYWInKSB7XG4gICAgcmV0dXJuIHByb2Nlc3MuZW52LkdIX0JPVF9QQVRfRk9SX1dJTExCT09TVEVSTEFCO1xuICB9XG4gIHJldHVybiAoXG4gICAgcHJvY2Vzcy5lbnYuR0hfQk9UX1BBVF9GT1JfV0lMTEJPT1NURVIgfHxcbiAgICBwcm9jZXNzLmVudi5HSF9CT1RfUEFUX0ZPUl9XSUxMQk9PU1RFUkxBQiB8fFxuICAgIHByb2Nlc3MuZW52LkdIX1RPS0VOIHx8XG4gICAgcHJvY2Vzcy5lbnYuR0lUSFVCX1RPS0VOXG4gICk7XG59XG4iLCJpbXBvcnQgdHlwZSB7IFNwYXduU3luY09wdGlvbnMgfSBmcm9tICdub2RlOmNoaWxkX3Byb2Nlc3MnO1xuaW1wb3J0IGNoaWxkX3Byb2Nlc3MgZnJvbSAnbm9kZTpjaGlsZF9wcm9jZXNzJztcbmltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBvcyBmcm9tICdub2RlOm9zJztcblxuZXhwb3J0IGZ1bmN0aW9uIHNwYXduU3luYyhjb21tYW5kOiBzdHJpbmcsIGFyZ3M6IHN0cmluZ1tdLCBjd2Q6IHN0cmluZywgcmV0cnkgPSAwKTogdm9pZCB7XG4gIGRvIHtcbiAgICBjb25zdCBbbmV3Q21kLCBuZXdBcmdzLCBvcHRpb25zXSA9IGdldFNwYXduU3luY0FyZ3MoY29tbWFuZCwgYXJncywgY3dkKTtcbiAgICBjb25zb2xlLmxvZyhgJCAke25ld0NtZH0gJHtuZXdBcmdzLmpvaW4oJyAnKX0gYXQgJHtjd2R9YCk7XG4gICAgY29uc3QgcmV0ID0gY2hpbGRfcHJvY2Vzcy5zcGF3blN5bmMobmV3Q21kLCBuZXdBcmdzLCBvcHRpb25zKTtcbiAgICBpZiAocmV0LnN0YXR1cyA9PT0gMCkgYnJlYWs7XG4gIH0gd2hpbGUgKC0tcmV0cnkgPj0gMCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBzcGF3blN5bmNXaXRoU3RyaW5nUmVzdWx0KGNvbW1hbmQ6IHN0cmluZywgYXJnczogc3RyaW5nW10sIGN3ZDogc3RyaW5nKTogc3RyaW5nIHtcbiAgY29uc3QgW25ld0NtZCwgbmV3QXJncywgb3B0aW9uc10gPSBnZXRTcGF3blN5bmNBcmdzKGNvbW1hbmQsIGFyZ3MsIGN3ZCk7XG4gIG9wdGlvbnMuc3RkaW8gPSAncGlwZSc7XG4gIGNvbnN0IHByb2MgPSBjaGlsZF9wcm9jZXNzLnNwYXduU3luYyhuZXdDbWQsIG5ld0FyZ3MsIG9wdGlvbnMpO1xuICBjb25zdCBlcnJvciA9IHByb2Muc3RkZXJyLnRvU3RyaW5nKCkudHJpbSgpO1xuICBpZiAoZXJyb3IpIHtcbiAgICBjb25zb2xlLmVycm9yKFxuICAgICAgYCR7bmV3Q21kfSBbJHtuZXdBcmdzLm1hcCgocykgPT4gYFwiJHtzfVwiYCkuam9pbignLCAnKX1dIG91dHB1dHMgdGhlIGZvbGxvd2luZyBjb250ZW50IHRvIHN0ZGVycjpcXG4ke2Vycm9yfWBcbiAgICApO1xuICB9XG4gIHJldHVybiBwcm9jLnN0ZG91dC50b1N0cmluZygpLnRyaW0oKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldFNwYXduU3luY0FyZ3MoY29tbWFuZDogc3RyaW5nLCBhcmdzOiBzdHJpbmdbXSwgY3dkOiBzdHJpbmcpOiBbc3RyaW5nLCBzdHJpbmdbXSwgU3Bhd25TeW5jT3B0aW9uc10ge1xuICBjb25zdCBlbnYgPSB7IC4uLnByb2Nlc3MuZW52IH07XG4gIC8vIFJlbW92ZSBiZXJyeSBmcm9tIFBBVEhcbiAgaWYgKGVudi5QQVRIICYmIGVudi5CRVJSWV9CSU5fRk9MREVSKSB7XG4gICAgZW52LlBBVEggPSBlbnYuUEFUSC5yZXBsYWNlKGAke2Vudi5CRVJSWV9CSU5fRk9MREVSfTpgLCAnJyk7XG4gIH1cbiAgLy8gRW5zdXJlIGFzZGYgc2hpbXMvYmluIGFyZSBvbiBQQVRIIGV2ZW4gd2hlbiBwYXJlbnQgc2hlbGwgZG9lc24ndCBsb2FkIHRoZW1cbiAgY29uc3QgYXNkZkRpciA9IGVudi5BU0RGX0RJUiA/PyBgJHtvcy5ob21lZGlyKCl9Ly5hc2RmYDtcbiAgaWYgKGFzZGZEaXIgJiYgZnMuZXhpc3RzU3luYyhhc2RmRGlyKSkge1xuICAgIGNvbnN0IGFzZGZQYXRocyA9IFtgJHthc2RmRGlyfS9zaGltc2AsIGAke2FzZGZEaXJ9L2JpbmBdO1xuICAgIGNvbnN0IGN1cnJlbnRQYXRocyA9IGVudi5QQVRIID8gZW52LlBBVEguc3BsaXQoJzonKSA6IFtdO1xuICAgIGVudi5QQVRIID0gWy4uLmFzZGZQYXRocywgLi4uY3VycmVudFBhdGhzLmZpbHRlcigocCkgPT4gIWFzZGZQYXRocy5pbmNsdWRlcyhwKSldLmpvaW4oJzonKTtcbiAgICBlbnYuQVNERl9ESVIgPz89IGFzZGZEaXI7XG4gICAgZW52LkFTREZfTk9ERUpTX1ZFUlNJT04gPz89ICdzeXN0ZW0nO1xuICB9XG5cbiAgaWYgKGVudi5BU0RGX0RJUikge1xuICAgIGFyZ3MgPSBbJy1sJywgJy1jJywgYCR7Y29tbWFuZH0gJHthcmdzLmpvaW4oJyAnKX1gXTtcbiAgICBjb21tYW5kID0gJ2Jhc2gnO1xuICB9XG4gIHJldHVybiBbXG4gICAgY29tbWFuZCxcbiAgICBhcmdzLFxuICAgIHtcbiAgICAgIGN3ZCxcbiAgICAgIGVudixcbiAgICAgIHNoZWxsOiBmYWxzZSxcbiAgICAgIHN0ZGlvOiAnaW5oZXJpdCcsXG4gICAgfSxcbiAgXTtcbn1cbiIsImV4cG9ydCBmdW5jdGlvbiBjb252ZXJ0VmVyc2lvbkludG9OdW1iZXIodmVyc2lvbjogc3RyaW5nKTogbnVtYmVyIHtcbiAgLy8gZS5nLiBqYXZhIGFkb3B0b3Blbmpkay0xMS4wLjE3KzhcbiAgY29uc3QgbnVtYmVycyA9IHZlcnNpb25cbiAgICAuc3BsaXQoL1srLi1dLylcbiAgICAubWFwKE51bWJlcilcbiAgICAuZmlsdGVyKChudW0pID0+ICFOdW1iZXIuaXNOYU4obnVtKSk7XG4gIGxldCB2ZXJzaW9uTnVtYmVyID0gMDtcbiAgbGV0IGRpdmlzb3IgPSAxO1xuICBmb3IgKGNvbnN0IG51bSBvZiBudW1iZXJzKSB7XG4gICAgdmVyc2lvbk51bWJlciArPSBudW0gKiBkaXZpc29yO1xuICAgIGRpdmlzb3IgLz0gMTAwMDtcbiAgfVxuICByZXR1cm4gdmVyc2lvbk51bWJlcjtcbn1cbiIsImV4cG9ydCBjb25zdCBQWVRIT05fVkVSU0lPTiA9ICczLjkuMTknO1xuZXhwb3J0IGNvbnN0IEpBVkFfVkVSU0lPTiA9ICd6dWx1LTExLjc0LjE1JztcbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGdldE9jdG9raXQgfSBmcm9tICcuLi91dGlscy9naXRodWJVdGlsLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuaW1wb3J0IHsgc3Bhd25TeW5jLCBzcGF3blN5bmNXaXRoU3RyaW5nUmVzdWx0IH0gZnJvbSAnLi4vdXRpbHMvc3Bhd25VdGlsLmpzJztcbmltcG9ydCB7IGNvbnZlcnRWZXJzaW9uSW50b051bWJlciB9IGZyb20gJy4uL3V0aWxzL3ZlcnNpb24uanMnO1xuaW1wb3J0IHsgSkFWQV9WRVJTSU9OLCBQWVRIT05fVkVSU0lPTiB9IGZyb20gJy4uL3V0aWxzL3ZlcnNpb25Db25zdGFudHMuanMnO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVUb29sVmVyc2lvbnMoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZ2VuZXJhdGVUb29sVmVyc2lvbnMnLCBhc3luYyAoKSA9PiB7XG4gICAgYXdhaXQgY29yZShjb25maWcpO1xuICB9KTtcbn1cblxuY29uc3QgQ09SRV9UT09MUyA9IG5ldyBTZXQoWydqYXZhJywgJ25vZGVqcycsICdidW4nLCAncHl0aG9uJ10pO1xuY29uc3QgREVQUkVDQVRFRF9WRVJTSU9OX1BSRUZJWEVTID0gWydqYXZhJywgJ25vZGUnLCAncHl0aG9uJ107XG5cbmFzeW5jIGZ1bmN0aW9uIGNvcmUoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIGlmICghY29uZmlnLnZlcnNpb25zVGV4dCkgcmV0dXJuO1xuXG4gIGNvbnN0IGR1cGxpY2F0YWJsZUxpbmVzID0gY29uZmlnLnZlcnNpb25zVGV4dFxuICAgIC50cmltKClcbiAgICAuc3BsaXQoJ1xcbicpXG4gICAgLm1hcCgobGluZSkgPT4ge1xuICAgICAgY29uc3QgW25hbWUsIHZlcnNpb25dID0gbGluZS50cmltKCkuc3BsaXQoL1xccysvKTtcbiAgICAgIC8vIFRvIG1vdmUgdGhlIHRvcCBvZiB0aGUgc29ydGVkIGxpc3QsIHdlIG5lZWQgdG8gYWRkIGEgc3BhY2UuXG4gICAgICByZXR1cm4gYCR7Q09SRV9UT09MUy5oYXMobmFtZSA/PyAnJykgPyAnICcgOiAnJ30ke25hbWUgPz8gJyd9ICR7dmVyc2lvbiA/PyAnJ31gO1xuICAgIH0pXG4gICAgLnRvU29ydGVkKClcbiAgICAvLyBSZW1vdmUgYWRkZWQgc3BhY2VzLlxuICAgIC5tYXAoKGxpbmUpID0+IGxpbmUudHJpbSgpKVxuICAgIC8vIFRPRE86IHJlbW92ZSB0aGUgZm9sbG93aW5nIGxpbmUgYWZ0ZXIgbGVmdGhvb2sgaXMgaW5zdGFsbGVkIHZpYSBucG0uXG4gICAgLmZpbHRlcigobGluZSkgPT4gIWxpbmUuc3RhcnRzV2l0aCgnbGVmdGhvb2snKSk7XG4gIGNvbnN0IGxpbmVzID0gWy4uLm5ldyBTZXQoZHVwbGljYXRhYmxlTGluZXMpXTtcblxuICBpZiAoY29uZmlnLmRvZXNDb250YWluUG9ldHJ5TG9jaykge1xuICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2goJ2h0dHBzOi8vcHlwaS5vcmcvcHlwaS9wb2V0cnkvanNvbicpO1xuICAgIGNvbnN0IGpzb24gPSAoYXdhaXQgcmVzcG9uc2UuanNvbigpKSBhcyB7IGluZm8/OiB7IHZlcnNpb246IHN0cmluZyB9IH0gfCB1bmRlZmluZWQ7XG4gICAgY29uc3QgcG9ldHJ5VmVyc2lvbiA9IGpzb24/LmluZm8/LnZlcnNpb247XG4gICAgaWYgKHBvZXRyeVZlcnNpb24pIHtcbiAgICAgIHVwZGF0ZVZlcnNpb24obGluZXMsICdwb2V0cnknLCBwb2V0cnlWZXJzaW9uKTtcbiAgICB9XG4gICAgdXBkYXRlVmVyc2lvbihsaW5lcywgJ3B5dGhvbicsIFBZVEhPTl9WRVJTSU9OLCB0cnVlKTtcbiAgfVxuICBpZiAoY29uZmlnLmRlcGVuZGluZy5maXJlYmFzZSkge1xuICAgIHVwZGF0ZVZlcnNpb24obGluZXMsICdqYXZhJywgSkFWQV9WRVJTSU9OLCB0cnVlKTtcbiAgfVxuICBpZiAoY29uZmlnLmRvZXNDb250YWluUGFja2FnZUpzb24pIHtcbiAgICBpZiAoY29uZmlnLmlzQnVuKSB7XG4gICAgICBjb25zdCBidW5WZXJzaW9uID0gYXdhaXQgZ2V0TGF0ZXN0VmVyc2lvbkZyb21UYWdPbkdpdEh1Yignb3Zlbi1zaCcsICdidW4nKTtcbiAgICAgIGlmIChidW5WZXJzaW9uKSB1cGRhdGVWZXJzaW9uKGxpbmVzLCAnYnVuJywgYnVuVmVyc2lvbik7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IHZlcnNpb24gPSBzcGF3blN5bmNXaXRoU3RyaW5nUmVzdWx0KCducG0nLCBbJ3Nob3cnLCAneWFybicsICd2ZXJzaW9uJ10sIGNvbmZpZy5kaXJQYXRoKTtcbiAgICAgIHVwZGF0ZVZlcnNpb24obGluZXMsICd5YXJuJywgdmVyc2lvbik7XG4gICAgfVxuICB9XG5cbiAgZm9yIChjb25zdCBwcmVmaXggb2YgREVQUkVDQVRFRF9WRVJTSU9OX1BSRUZJWEVTKSB7XG4gICAgY29uc3QgdmVyc2lvblBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsIGAuJHtwcmVmaXh9LXZlcnNpb25gKTtcbiAgICB2b2lkIGZzLnByb21pc2VzLnJtKHZlcnNpb25QYXRoLCB7IGZvcmNlOiB0cnVlIH0pO1xuICB9XG5cbiAgY29uc3QgdG9vbFZlcnNpb25zUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJy50b29sLXZlcnNpb25zJyk7XG4gIGF3YWl0IChsaW5lcy5sZW5ndGggPiAwXG4gICAgPyBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnMucHJvbWlzZXMud3JpdGVGaWxlKHRvb2xWZXJzaW9uc1BhdGgsIGxpbmVzLmpvaW4oJ1xcbicpICsgJ1xcbicpKVxuICAgIDogcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzLnByb21pc2VzLnJtKHRvb2xWZXJzaW9uc1BhdGgsIHsgZm9yY2U6IHRydWUgfSkpKTtcbiAgYXdhaXQgcHJvbWlzZVBvb2wucHJvbWlzZUFsbCgpO1xuICBzcGF3blN5bmMoJ2FzZGYnLCBbJ3BsdWdpbicsICd1cGRhdGUnLCAnLS1hbGwnXSwgY29uZmlnLmRpclBhdGgpO1xuICBzcGF3blN5bmMoJ2FzZGYnLCBbJ2luc3RhbGwnXSwgY29uZmlnLmRpclBhdGgpO1xufVxuXG5mdW5jdGlvbiB1cGRhdGVWZXJzaW9uKGxpbmVzOiBzdHJpbmdbXSwgdG9vbE5hbWU6IHN0cmluZywgbmV3VmVyc2lvbjogc3RyaW5nLCBoZWFkID0gZmFsc2UpOiB2b2lkIHtcbiAgY29uc3QgaW5kZXggPSBsaW5lcy5maW5kSW5kZXgoKGwpID0+IGwuc3BsaXQoL1xccysvKVswXSA9PT0gdG9vbE5hbWUpO1xuICBjb25zdCBuZXdMaW5lID0gYCR7dG9vbE5hbWV9ICR7bmV3VmVyc2lvbn1gO1xuICBpZiAoaW5kZXggPT09IC0xKSB7XG4gICAgbGluZXMuc3BsaWNlKGhlYWQgPyAwIDogbGluZXMubGVuZ3RoLCAwLCBuZXdMaW5lKTtcbiAgfSBlbHNlIHtcbiAgICBjb25zdCBbLCB2ZXJzaW9uXSA9IChsaW5lc1tpbmRleF0gYXMgc3RyaW5nKS5zcGxpdCgvXFxzKy8pO1xuICAgIGlmIChjb252ZXJ0VmVyc2lvbkludG9OdW1iZXIobmV3VmVyc2lvbikgPiBjb252ZXJ0VmVyc2lvbkludG9OdW1iZXIodmVyc2lvbiA/PyAnJykpIHtcbiAgICAgIGxpbmVzW2luZGV4XSA9IG5ld0xpbmU7XG4gICAgfVxuICB9XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGdldExhdGVzdFZlcnNpb25Gcm9tVGFnT25HaXRIdWIob3JnYW5pemF0aW9uOiBzdHJpbmcsIHJlcG9zaXRvcnk6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nIHwgdW5kZWZpbmVkPiB7XG4gIHRyeSB7XG4gICAgLy8gRmV0Y2ggdGhlIGxhdGVzdCByZWxlYXNlIGZyb20gdGhlIHJlcG9zaXRvcnkgKG5vIHJlcXVpcmVkIHBlcm1pc3Npb25zKVxuICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZ2V0T2N0b2tpdCgpLnJlcXVlc3QoJ0dFVCAvcmVwb3Mve293bmVyfS97cmVwb30vcmVsZWFzZXMvbGF0ZXN0Jywge1xuICAgICAgb3duZXI6IG9yZ2FuaXphdGlvbixcbiAgICAgIHJlcG86IHJlcG9zaXRvcnksXG4gICAgfSk7XG4gICAgY29uc3QgdmVyc2lvbiA9IHJlc3BvbnNlLmRhdGEudGFnX25hbWU7XG4gICAgY29uc3QgaW5kZXggPSB2ZXJzaW9uLmxhc3RJbmRleE9mKCd2Jyk7XG4gICAgY29uc3QgdmVyc2lvbk51bWJlclRleHQgPSBpbmRleCA9PT0gLTEgPyB2ZXJzaW9uIDogdmVyc2lvbi5zbGljZShpbmRleCArIDEpO1xuICAgIC8vIENoZWNrIHRoZSBmaXJzdCBjaGFyYWN0ZXIgaXMgYSBudW1iZXJcbiAgICByZXR1cm4gL15cXGQvLnRlc3QodmVyc2lvbk51bWJlclRleHQpID8gdmVyc2lvbk51bWJlclRleHQgOiB1bmRlZmluZWQ7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgY29uc29sZS5lcnJvcignRmFpbGVkIHRvIGZldGNoIEJ1biB0YWdzIGR1ZSB0bzonLCBlcnJvcik7XG4gICAgcmV0dXJuO1xuICB9XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgbWVyZ2UgZnJvbSAnZGVlcG1lcmdlJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZnNVdGlsIH0gZnJvbSAnLi4vdXRpbHMvZnNVdGlsLmpzJztcbmltcG9ydCB7IG92ZXJ3cml0ZU1lcmdlIH0gZnJvbSAnLi4vdXRpbHMvbWVyZ2VVdGlsLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVCaW9tZUpzb25jKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2dlbmVyYXRlQmlvbWVKc29uYycsIGFzeW5jICgpID0+IHtcbiAgICBsZXQgbmV3U2V0dGluZ3M6IG9iamVjdCA9IHtcbiAgICAgIHJvb3Q6IGNvbmZpZy5pc1Jvb3QsXG4gICAgICAkc2NoZW1hOiAnLi9ub2RlX21vZHVsZXMvQGJpb21lanMvYmlvbWUvY29uZmlndXJhdGlvbl9zY2hlbWEuanNvbicsXG4gICAgICBleHRlbmRzOiBbJ0B3aWxsYm9vc3Rlci9iaW9tZS1jb25maWcnXSxcbiAgICB9O1xuICAgIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnYmlvbWUuanNvbmMnKTtcbiAgICB0cnkge1xuICAgICAgY29uc3Qgb2xkQ29udGVudCA9IGF3YWl0IGZzLnByb21pc2VzLnJlYWRGaWxlKGZpbGVQYXRoLCAndXRmOCcpO1xuICAgICAgY29uc3Qgb2xkU2V0dGluZ3MgPSBKU09OLnBhcnNlKG9sZENvbnRlbnQpIGFzIG9iamVjdDtcbiAgICAgIG5ld1NldHRpbmdzID0gbWVyZ2UuYWxsKFtuZXdTZXR0aW5ncywgb2xkU2V0dGluZ3MsIG5ld1NldHRpbmdzXSwgeyBhcnJheU1lcmdlOiBvdmVyd3JpdGVNZXJnZSB9KTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIGRvIG5vdGhpbmdcbiAgICB9XG4gICAgY29uc3QgbmV3Q29udGVudCA9IEpTT04uc3RyaW5naWZ5KG5ld1NldHRpbmdzKTtcbiAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnNVdGlsLmdlbmVyYXRlRmlsZShmaWxlUGF0aCwgbmV3Q29udGVudCkpO1xuICB9KTtcbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGZzVXRpbCB9IGZyb20gJy4uL3V0aWxzL2ZzVXRpbC5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcblxuY29uc3QgbmV3Q29udGVudFdpdGhFeGFjdFRydWUgPSBgZW52ID0gZmFsc2VcbnRlbGVtZXRyeSA9IGZhbHNlXG5cbltpbnN0YWxsXVxuZXhhY3QgPSB0cnVlXG5saW5rZXIgPSBcImhvaXN0ZWRcIlxubWluaW11bVJlbGVhc2VBZ2UgPSA0MzIwMDAgIyA1IGRheXNcbm1pbmltdW1SZWxlYXNlQWdlRXhjbHVkZXMgPSBbXG4gICAgXCJAd2lsbGJvb3N0ZXIvYmFiZWwtY29uZmlnc1wiLFxuICAgIFwiQHdpbGxib29zdGVyL2Jpb21lLWNvbmZpZ1wiLFxuICAgIFwiQHdpbGxib29zdGVyL2VzbGludC1jb25maWctanNcIixcbiAgICBcIkB3aWxsYm9vc3Rlci9lc2xpbnQtY29uZmlnLWpzLXJlYWN0XCIsXG4gICAgXCJAd2lsbGJvb3N0ZXIvZXNsaW50LWNvbmZpZy1uZXh0XCIsXG4gICAgXCJAd2lsbGJvb3N0ZXIvZXNsaW50LWNvbmZpZy10c1wiLFxuICAgIFwiQHdpbGxib29zdGVyL2VzbGludC1jb25maWctdHMtcmVhY3RcIixcbiAgICBcIkB3aWxsYm9vc3Rlci9wcmV0dGllci1jb25maWdcIixcbiAgICBcIkB3aWxsYm9vc3Rlci93YlwiXG5dXG5cbltydW5dXG5idW4gPSB0cnVlXG5gO1xuXG5jb25zdCBuZXdDb250ZW50V2l0aEV4YWN0RmFsc2UgPSBgZW52ID0gZmFsc2VcbnRlbGVtZXRyeSA9IGZhbHNlXG5cbltpbnN0YWxsXVxuZXhhY3QgPSBmYWxzZVxubGlua2VyID0gXCJob2lzdGVkXCJcbm1pbmltdW1SZWxlYXNlQWdlID0gNDMyMDAwICMgNSBkYXlzXG5taW5pbXVtUmVsZWFzZUFnZUV4Y2x1ZGVzID0gW1xuICAgIFwiQHdpbGxib29zdGVyL2JhYmVsLWNvbmZpZ3NcIixcbiAgICBcIkB3aWxsYm9vc3Rlci9iaW9tZS1jb25maWdcIixcbiAgICBcIkB3aWxsYm9vc3Rlci9lc2xpbnQtY29uZmlnLWpzXCIsXG4gICAgXCJAd2lsbGJvb3N0ZXIvZXNsaW50LWNvbmZpZy1qcy1yZWFjdFwiLFxuICAgIFwiQHdpbGxib29zdGVyL2VzbGludC1jb25maWctbmV4dFwiLFxuICAgIFwiQHdpbGxib29zdGVyL2VzbGludC1jb25maWctdHNcIixcbiAgICBcIkB3aWxsYm9vc3Rlci9lc2xpbnQtY29uZmlnLXRzLXJlYWN0XCIsXG4gICAgXCJAd2lsbGJvb3N0ZXIvcHJldHRpZXItY29uZmlnXCIsXG4gICAgXCJAd2lsbGJvb3N0ZXIvd2JcIlxuXVxuXG5bcnVuXVxuYnVuID0gdHJ1ZVxuYDtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlQnVuZmlnVG9tbChjb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdnZW5lcmF0ZUJ1bmZpZ1RvbWwnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICdidW5maWcudG9tbCcpO1xuICAgIGNvbnN0IGNvbnRlbnQgPVxuICAgICAgZnMuZXhpc3RzU3luYyhmaWxlUGF0aCkgJiYgZnMucmVhZEZpbGVTeW5jKGZpbGVQYXRoLCAndXRmOCcpLmluY2x1ZGVzKCdleGFjdCA9IGZhbHNlJylcbiAgICAgICAgPyBuZXdDb250ZW50V2l0aEV4YWN0RmFsc2VcbiAgICAgICAgOiBuZXdDb250ZW50V2l0aEV4YWN0VHJ1ZTtcbiAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnNVdGlsLmdlbmVyYXRlRmlsZShmaWxlUGF0aCwgY29udGVudCkpO1xuICB9KTtcbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcblxuY29uc3QgdXNlckNvbnRlbnRIZWFkZXIgPSAnIyBQcm9qZWN0LXNwZWNpZmljIHNldHRpbmdzJztcbmNvbnN0IHVzZXJDb250ZW50SGVhZGVyUmVnZXggPSAvIyBQcm9qZWN0LXNwZWNpZmljIHNldHRpbmdzW15cXG5dKlxcbi9nbTtcbmNvbnN0IHNlcGFyYXRvciA9ICcjIEdlbmVyYXRlZCBieSB3YmZ5JztcbmNvbnN0IHNlcGFyYXRvclByZWZpeCA9ICcjIEdlbmVyYXRlZCBieSAnO1xuY29uc3QgZGVmYXVsdEhlYWRVc2VyQ29udGVudCA9IGAke3VzZXJDb250ZW50SGVhZGVyfSAoaGVhZClcblxuXG4ke3NlcGFyYXRvcn1cbmA7XG5jb25zdCBkZWZhdWx0VGFpbFVzZXJDb250ZW50ID0gYFxuJHt1c2VyQ29udGVudEhlYWRlcn0gKHRhaWwpXG5gO1xuXG5leHBvcnQgY29uc3QgaWdub3JlRmlsZVV0aWwgPSB7XG4gIHNlcGFyYXRvcixcbiAgc2VwYXJhdG9yUHJlZml4LFxuICBkZWZhdWx0SGVhZFVzZXJDb250ZW50LFxuICBkZWZhdWx0VGFpbFVzZXJDb250ZW50LFxuICBhc3luYyByZWFkR2l0aWdub3JlV2l0aG91dFNlcGFyYXRvcnMoZmlsZVBhdGg6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nIHwgdW5kZWZpbmVkPiB7XG4gICAgdHJ5IHtcbiAgICAgIGxldCBjb250ZW50ID0gYXdhaXQgZnMucHJvbWlzZXMucmVhZEZpbGUoZmlsZVBhdGgsICd1dGY4Jyk7XG4gICAgICBjb25zdCBsYXN0SGVhZGVySW5kZXggPSBnZXRJbmRleE9mVGFpbFVzZXJDb250ZW50SGVhZGVyKGNvbnRlbnQpO1xuICAgICAgaWYgKGxhc3RIZWFkZXJJbmRleCA+IDApIHtcbiAgICAgICAgY29udGVudCA9IGNvbnRlbnQuc2xpY2UoMCwgbGFzdEhlYWRlckluZGV4IC0gMSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gKFxuICAgICAgICBjb250ZW50XG4gICAgICAgICAgLnJlcGxhY2VBbGwodXNlckNvbnRlbnRIZWFkZXJSZWdleCwgJycpXG4gICAgICAgICAgLnJlcGxhY2VBbGwoLyMgR2VuZXJhdGVkIGJ5IFteXFxuXSpcXG4vZ20sICcnKVxuICAgICAgICAgIC5yZXBsYWNlQWxsKC9cXHI/XFxuXFxyP1xcbihcXHI/XFxuKSsvZ20sICdcXG5cXG4nKVxuICAgICAgICAgIC50cmltKCkgKyAnXFxuJ1xuICAgICAgKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIGRvIG5vdGhpbmdcbiAgICB9XG4gIH0sXG4gIGdldEhlYWRVc2VyQ29udGVudChjb250ZW50OiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGNvbnN0IGluZGV4ID0gY29udGVudC5pbmRleE9mKHRoaXMuc2VwYXJhdG9yUHJlZml4KTtcbiAgICBpZiAoaW5kZXggIT09IC0xKSB7XG4gICAgICByZXR1cm4gY29udGVudFxuICAgICAgICAuc2xpY2UoMCwgY29udGVudC5pbmRleE9mKCdcXG4nLCBpbmRleCkgKyAxKVxuICAgICAgICAucmVwbGFjZUFsbCh1c2VyQ29udGVudEhlYWRlclJlZ2V4LCBgJHt1c2VyQ29udGVudEhlYWRlcn0gKGhlYWQpXFxuYCk7XG4gICAgfVxuICAgIHJldHVybiBkZWZhdWx0SGVhZFVzZXJDb250ZW50O1xuICB9LFxuICBnZXRUYWlsVXNlckNvbnRlbnQoY29udGVudDogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBjb25zdCBsYXN0SGVhZGVySW5kZXggPSBnZXRJbmRleE9mVGFpbFVzZXJDb250ZW50SGVhZGVyKGNvbnRlbnQpO1xuICAgIGlmIChsYXN0SGVhZGVySW5kZXggPiAwKSB7XG4gICAgICByZXR1cm4gY29udGVudC5zbGljZShsYXN0SGVhZGVySW5kZXggLSAxKTtcbiAgICB9XG4gICAgcmV0dXJuIGRlZmF1bHRUYWlsVXNlckNvbnRlbnQ7XG4gIH0sXG4gIGFzeW5jIGlzQmVycnlaZXJvSW5zdGFsbEVuYWJsZWQoZmlsZVBhdGg6IHN0cmluZyk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBjb250ZW50ID0gYXdhaXQgZnMucHJvbWlzZXMucmVhZEZpbGUoZmlsZVBhdGgsICd1dGY4Jyk7XG4gICAgICByZXR1cm4gY29udGVudC5pbmNsdWRlcygnXFxuIS55YXJuL2NhY2hlJyk7XG4gICAgfSBjYXRjaCB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9LFxufTtcblxuZnVuY3Rpb24gZ2V0SW5kZXhPZlRhaWxVc2VyQ29udGVudEhlYWRlcihjb250ZW50OiBzdHJpbmcpOiBudW1iZXIge1xuICBjb25zdCBpbmRleCA9IGNvbnRlbnQuaW5kZXhPZih1c2VyQ29udGVudEhlYWRlcik7XG4gIGNvbnN0IGxhc3RJbmRleCA9IGNvbnRlbnQubGFzdEluZGV4T2YodXNlckNvbnRlbnRIZWFkZXIpO1xuICByZXR1cm4gbGFzdEluZGV4ID4gaW5kZXggPyBsYXN0SW5kZXggOiAtMTtcbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGZzVXRpbCB9IGZyb20gJy4uL3V0aWxzL2ZzVXRpbC5qcyc7XG5pbXBvcnQgeyBpZ25vcmVGaWxlVXRpbCB9IGZyb20gJy4uL3V0aWxzL2lnbm9yZUZpbGVVdGlsLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuXG4vLyBFeGVyY29kZeOBp+OBr25vZGVfbW9kdWxlc+OCkkNPUFnjgZnjgovlv4XopoHjgYzjgYLjgovjgZ/jgoHjgIFub2RlX21vZHVsZXPjgpLpmaTlpJbjgZfjgabjga/jgYTjgZHjgarjgYTjgIJcbmNvbnN0IGNvbW1vbkNvbnRlbnQgPSBgXG4qKi8uaWRlYVxuKiovKi5zcWxpdGUzKlxuKiovLnlhcm4vaW5zdGFsbC1zdGF0ZS5nelxuKiovLnZlbnZcbmA7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZW5lcmF0ZURvY2tlcmlnbm9yZShjb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdnZW5lcmF0ZURvY2tlcmlnbm9yZScsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJy5kb2NrZXJpZ25vcmUnKTtcbiAgICBpZiAoY29uZmlnLmRvZXNDb250YWluRG9ja2VyZmlsZSkge1xuICAgICAgY29uc3QgY29udGVudCA9IChhd2FpdCBmc1V0aWwucmVhZEZpbGVJZ25vcmluZ0Vycm9yKGZpbGVQYXRoKSkgPz8gJyc7XG4gICAgICBjb25zdCBoZWFkVXNlckNvbnRlbnQgPSBpZ25vcmVGaWxlVXRpbC5nZXRIZWFkVXNlckNvbnRlbnQoY29udGVudCk7XG4gICAgICBjb25zdCB0YWlsVXNlckNvbnRlbnQgPSBpZ25vcmVGaWxlVXRpbC5nZXRUYWlsVXNlckNvbnRlbnQoY29udGVudCk7XG5cbiAgICAgIGNvbnN0IG5ld0NvbnRlbnQgPSBoZWFkVXNlckNvbnRlbnQgKyBjb21tb25Db250ZW50ICsgdGFpbFVzZXJDb250ZW50O1xuICAgICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzVXRpbC5nZW5lcmF0ZUZpbGUoZmlsZVBhdGgsIG5ld0NvbnRlbnQpKTtcbiAgICB9IGVsc2Uge1xuICAgICAgYXdhaXQgZnMucHJvbWlzZXMucm0oZmlsZVBhdGgsIHsgZm9yY2U6IHRydWUgfSk7XG4gICAgfVxuICB9KTtcbn1cbiIsImV4cG9ydCBjb25zdCBleHRlbnNpb25zID0ge1xuICBjb2RlV2l0aDJJbmRlbnRTaXplOiBbXG4gICAgJ2NqcycsXG4gICAgJ21qcycsXG4gICAgJ2pzJyxcbiAgICAnanN4JyxcbiAgICAnY3RzJyxcbiAgICAnbXRzJyxcbiAgICAndHMnLFxuICAgICd0c3gnLFxuICAgICdqc29uJyxcbiAgICAnanNvbjUnLFxuICAgICdqc29uYycsXG4gICAgJ2NwcCcsXG4gICAgJ2RhcnQnLFxuICAgICdodG0nLFxuICAgICdodG1sJyxcbiAgICAncHUnLFxuICAgICdwdW1sJyxcbiAgICAncmInLFxuICAgICd2dWUnLFxuICAgICd4bWwnLFxuICAgICd5YW1sJyxcbiAgICAneW1sJyxcbiAgICAnc2gnLFxuICBdLnRvU29ydGVkKCksXG4gIGNvZGVXaXRoNEluZGVudFNpemU6IFsnZ28nLCAnZ3JhZGxlJywgJ2phdmEnLCAncHknXS50b1NvcnRlZCgpLFxuICBtYXJrZG93bkxpa2U6IFsnbWQnXS50b1NvcnRlZCgpLFxuICBlc2xpbnQ6IFsnY2pzJywgJ21qcycsICdqcycsICdjdHMnLCAnbXRzJywgJ3RzJywgJ3RzeCcsICdqc3gnXS50b1NvcnRlZCgpLFxuICBwcmV0dGllcjogW1xuICAgICdjanMnLFxuICAgICdtanMnLFxuICAgICdqYXZhJyxcbiAgICAnanMnLFxuICAgICdqc3gnLFxuICAgICdjdHMnLFxuICAgICdtdHMnLFxuICAgICd0cycsXG4gICAgJ3RzeCcsXG4gICAgJ2pzb24nLFxuICAgICdqc29uNScsXG4gICAgJ2pzb25jJyxcbiAgICAnY3NzJyxcbiAgICAnaHRtJyxcbiAgICAnaHRtbCcsXG4gICAgJ21kJyxcbiAgICAnc2NzcycsXG4gICAgJ3Z1ZScsXG4gICAgJ3lhbWwnLFxuICAgICd5bWwnLFxuICBdLnRvU29ydGVkKCksXG4gIC8vIGNmLiBodHRwczovL2Jpb21lanMuZGV2L2ludGVybmFscy9sYW5ndWFnZS1zdXBwb3J0L1xuICBiaW9tZTogW1xuICAgICdjanMnLFxuICAgICdtanMnLFxuICAgICdqcycsXG4gICAgJ2pzeCcsXG4gICAgJ2N0cycsXG4gICAgJ210cycsXG4gICAgJ3RzJyxcbiAgICAndHN4JyxcbiAgICAnanNvbicsXG4gICAgJ2pzb241JyxcbiAgICAnanNvbmMnLFxuICAgICdodG0nLFxuICAgICdodG1sJyxcbiAgICAndnVlJyxcbiAgICAnc3ZlbHRlJyxcbiAgICAnYXN0cm8nLFxuICAgICdjc3MnLFxuICAgICd5YW1sJyxcbiAgICAneW1sJyxcbiAgICAnZ3FsJyxcbiAgXS50b1NvcnRlZCgpLFxufTtcbiIsImltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGV4dGVuc2lvbnMgfSBmcm9tICcuLi91dGlscy9leHRlbnNpb25zLmpzJztcbmltcG9ydCB7IGZzVXRpbCB9IGZyb20gJy4uL3V0aWxzL2ZzVXRpbC5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcblxuY29uc3QgbmV3Q29udGVudCA9IGByb290ID0gdHJ1ZVxuXG5bKl1cbmNoYXJzZXQgPSB1dGYtOFxuZW5kX29mX2xpbmUgPSBsZlxuaW5zZXJ0X2ZpbmFsX25ld2xpbmUgPSB0cnVlXG50cmltX3RyYWlsaW5nX3doaXRlc3BhY2UgPSB0cnVlXG5cbiR7Z2VuZXJhdGVFeHRlbnNpb25zKGV4dGVuc2lvbnMuY29kZVdpdGgySW5kZW50U2l6ZSl9XG5pbmRlbnRfc2l6ZSA9IDJcbmluZGVudF9zdHlsZSA9IHNwYWNlXG5cbiR7Z2VuZXJhdGVFeHRlbnNpb25zKGV4dGVuc2lvbnMuY29kZVdpdGg0SW5kZW50U2l6ZSl9XG5pbmRlbnRfc2l6ZSA9IDRcbmluZGVudF9zdHlsZSA9IHNwYWNlXG5cbiR7Z2VuZXJhdGVFeHRlbnNpb25zKGV4dGVuc2lvbnMubWFya2Rvd25MaWtlKX1cbm1heF9saW5lX2xlbmd0aCA9IG9mZlxudHJpbV90cmFpbGluZ193aGl0ZXNwYWNlID0gZmFsc2VcblxuW3tNYWtlZmlsZSwqLm1rfV1cbmluZGVudF9zdHlsZSA9IHRhYlxuYDtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlRWRpdG9yY29uZmlnKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2dlbmVyYXRlRWRpdG9yY29uZmlnJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnLmVkaXRvcmNvbmZpZycpO1xuICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiBmc1V0aWwuZ2VuZXJhdGVGaWxlKGZpbGVQYXRoLCBuZXdDb250ZW50KSk7XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBnZW5lcmF0ZUV4dGVuc2lvbnMoZXh0ZW5zaW9uczogc3RyaW5nW10pOiBzdHJpbmcge1xuICByZXR1cm4gZXh0ZW5zaW9ucy5sZW5ndGggPiAxID8gYFsqLnske2V4dGVuc2lvbnMuam9pbignLCcpfX1dYCA6IGBbKi4ke2V4dGVuc2lvbnNbMF19XWA7XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBmc1V0aWwgfSBmcm9tICcuLi91dGlscy9mc1V0aWwuanMnO1xuaW1wb3J0IHsgcHJvbWlzZVBvb2wgfSBmcm9tICcuLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZW5lcmF0ZUVzbGludHJjKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2dlbmVyYXRlRXNsaW50cmMnLCBhc3luYyAoKSA9PiB7XG4gICAgLy8gUmVtb3ZlIGRlcHJlY2F0ZWQgZmlsZXNcbiAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnMucHJvbWlzZXMucm0ocGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnLmVzbGludHJjLmpzb24nKSwgeyBmb3JjZTogdHJ1ZSB9KSk7XG4gICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzLnByb21pc2VzLnJtKHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJy5lc2xpbnRpZ25vcmUnKSwgeyBmb3JjZTogdHJ1ZSB9KSk7XG4gICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzLnByb21pc2VzLnJtKHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJ2VzbGludC5jb25maWcuanMnKSwgeyBmb3JjZTogdHJ1ZSB9KSk7XG5cbiAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJ2VzbGludC5jb25maWcubWpzJyk7XG4gICAgaWYgKGNvbmZpZy5pc0J1bikge1xuICAgICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzLnByb21pc2VzLnJtKGZpbGVQYXRoLCB7IGZvcmNlOiB0cnVlIH0pKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoIWNvbmZpZy5lc2xpbnRCYXNlKSByZXR1cm47XG5cbiAgICB0cnkge1xuICAgICAgY29uc3Qgb2xkQ29udGVudCA9IGF3YWl0IGZzLnByb21pc2VzLnJlYWRGaWxlKGZpbGVQYXRoLCAndXRmOCcpO1xuICAgICAgaWYgKCFvbGRDb250ZW50LmluY2x1ZGVzKCdleHBvcnQgeyBkZWZhdWx0IH0nKSkgcmV0dXJuO1xuICAgIH0gY2F0Y2gge1xuICAgICAgLy8gZG8gbm90aGluZ1xuICAgIH1cblxuICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiBmc1V0aWwuZ2VuZXJhdGVGaWxlKGZpbGVQYXRoLCBgZXhwb3J0IHsgZGVmYXVsdCB9IGZyb20gJyR7Y29uZmlnLmVzbGludEJhc2V9JztgKSk7XG4gIH0pO1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IG1lcmdlIGZyb20gJ2RlZXBtZXJnZSc7XG5pbXBvcnQgeWFtbCBmcm9tICdqcy15YW1sJztcbmltcG9ydCBjbG9uZURlZXAgZnJvbSAnbG9kYXNoLmNsb25lZGVlcCc7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGZzVXRpbCB9IGZyb20gJy4uL3V0aWxzL2ZzVXRpbC5qcyc7XG5pbXBvcnQgeyBvdmVyd3JpdGVNZXJnZSB9IGZyb20gJy4uL3V0aWxzL21lcmdlVXRpbC5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcblxuY29uc3QgZGVmYXVsdENvbmZpZyA9IHtcbiAgaGF2ZV9mdW46IHRydWUsXG4gIGNvZGVfcmV2aWV3OiB7XG4gICAgZGlzYWJsZTogZmFsc2UsXG4gICAgY29tbWVudF9zZXZlcml0eV90aHJlc2hvbGQ6ICdNRURJVU0nLFxuICAgIG1heF9yZXZpZXdfY29tbWVudHM6IC0xLFxuICAgIHB1bGxfcmVxdWVzdF9vcGVuZWQ6IHtcbiAgICAgIGhlbHA6IGZhbHNlLFxuICAgICAgc3VtbWFyeTogdHJ1ZSxcbiAgICAgIGNvZGVfcmV2aWV3OiB0cnVlLFxuICAgIH0sXG4gIH0sXG4gIGlnbm9yZV9wYXR0ZXJuczogWycqKi9fX2dlbmVyYXRlZF9fJ10sXG59O1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVHZW1pbmlDb25maWcoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZ2VuZXJhdGVHZW1pbmlDb25maWcnLCBhc3luYyAoKSA9PiB7XG4gICAgaWYgKCFjb25maWcuaXNSb290KSByZXR1cm47XG5cbiAgICBjb25zdCBkaXJQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnLmdlbWluaScpO1xuICAgIGNvbnN0IGNvbmZpZ0ZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKGRpclBhdGgsICdjb25maWcueW1sJyk7XG4gICAgY29uc3Qgc3R5bGVndWlkZUZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKGRpclBhdGgsICdzdHlsZWd1aWRlLm1kJyk7XG5cbiAgICBsZXQgbmV3Q29uZmlnOiBvYmplY3QgPSBjbG9uZURlZXAoZGVmYXVsdENvbmZpZyk7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IG9sZENvbnRlbnQgPSBhd2FpdCBmcy5wcm9taXNlcy5yZWFkRmlsZShjb25maWdGaWxlUGF0aCwgJ3V0ZjgnKTtcbiAgICAgIGNvbnN0IG9sZENvbmZpZyA9IHlhbWwubG9hZChvbGRDb250ZW50KSBhcyBvYmplY3Q7XG4gICAgICBuZXdDb25maWcgPSBtZXJnZS5hbGwoW25ld0NvbmZpZywgb2xkQ29uZmlnLCBuZXdDb25maWddLCB7IGFycmF5TWVyZ2U6IG92ZXJ3cml0ZU1lcmdlIH0pO1xuICAgIH0gY2F0Y2gge1xuICAgICAgLy8gZG8gbm90aGluZyAtIGZpbGUgZG9lc24ndCBleGlzdCBvciBjYW4ndCBiZSBwYXJzZWRcbiAgICB9XG5cbiAgICBjb25zdCB5YW1sQ29udGVudCA9IHlhbWwuZHVtcChuZXdDb25maWcsIHtcbiAgICAgIGxpbmVXaWR0aDogLTEsXG4gICAgICBub0NvbXBhdE1vZGU6IHRydWUsXG4gICAgICBzdHlsZXM6IHtcbiAgICAgICAgJyEhbnVsbCc6ICdlbXB0eScsXG4gICAgICB9LFxuICAgIH0pO1xuXG4gICAgY29uc3Qgc3R5bGVndWlkZUNvbnRlbnQgPSAn5pel5pys6Kqe44Gn44Os44OT44Ol44O844GX44Gm44GP44Gg44GV44GE44CCJztcblxuICAgIGNvbnN0IHByb21pc2VzID0gW3Byb21pc2VQb29sLnJ1bigoKSA9PiBmc1V0aWwuZ2VuZXJhdGVGaWxlKGNvbmZpZ0ZpbGVQYXRoLCB5YW1sQ29udGVudCkpXTtcbiAgICBpZiAoIWZzLmV4aXN0c1N5bmMoc3R5bGVndWlkZUZpbGVQYXRoKSkge1xuICAgICAgcHJvbWlzZXMucHVzaChwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnNVdGlsLmdlbmVyYXRlRmlsZShzdHlsZWd1aWRlRmlsZVBhdGgsIHN0eWxlZ3VpZGVDb250ZW50KSkpO1xuICAgIH1cbiAgICBhd2FpdCBQcm9taXNlLmFsbChwcm9taXNlcyk7XG4gIH0pO1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcmVtb3ZlR2VtaW5pU2V0dGluZ3MoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZ2VuZXJhdGVHZW1pbmlTZXR0aW5ncycsIGFzeW5jICgpID0+IHtcbiAgICBpZiAoIWNvbmZpZy5pc1Jvb3QpIHJldHVybjtcblxuICAgIGNvbnN0IGRpclBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICcuZ2VtaW5pJyk7XG4gICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLnJlc29sdmUoZGlyUGF0aCwgJ3NldHRpbmdzLmpzb24nKTtcbiAgICBhd2FpdCBmcy5wcm9taXNlcy5ybShmaWxlUGF0aCwgeyBmb3JjZTogdHJ1ZSB9KTtcbiAgfSk7XG59XG4iLCJpbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBleHRlbnNpb25zIH0gZnJvbSAnLi4vdXRpbHMvZXh0ZW5zaW9ucy5qcyc7XG5pbXBvcnQgeyBmc1V0aWwgfSBmcm9tICcuLi91dGlscy9mc1V0aWwuanMnO1xuaW1wb3J0IHsgcHJvbWlzZVBvb2wgfSBmcm9tICcuLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5cbi8vIGNmLiBodHRwczovL2J1bi5zaC9ndWlkZXMvaW5zdGFsbC9naXQtZGlmZi1idW4tbG9ja2ZpbGVcbmNvbnN0IG5ld0NvbnRlbnQgPSBgKiB0ZXh0PWF1dG9cblxuKi5sb2NrYiBiaW5hcnkgZGlmZj1sb2NrYlxuKi52Y3Byb2ogdGV4dCBlb2w9Y3JsZlxuXG4ke1suLi5leHRlbnNpb25zLmNvZGVXaXRoMkluZGVudFNpemUsIC4uLmV4dGVuc2lvbnMuY29kZVdpdGg0SW5kZW50U2l6ZSwgLi4uZXh0ZW5zaW9ucy5tYXJrZG93bkxpa2VdXG4gIC5tYXAoKGV4dCkgPT4gYCouJHtleHR9IHRleHQgZW9sPWxmYClcbiAgLmpvaW4oJ1xcbicpfVxuXG5kaXN0LyoqIGxpbmd1aXN0LWdlbmVyYXRlZD10cnVlXG5gO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVHaXRhdHRyaWJ1dGVzKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2dlbmVyYXRlR2l0YXR0cmlidXRlcycsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJy5naXRhdHRyaWJ1dGVzJyk7XG4gICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzVXRpbC5nZW5lcmF0ZUZpbGUoZmlsZVBhdGgsIG5ld0NvbnRlbnQpKTtcbiAgfSk7XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgb3MgZnJvbSAnbm9kZTpvcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHsgb3B0aW9ucyB9IGZyb20gJy4uL29wdGlvbnMuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBmc1V0aWwgfSBmcm9tICcuLi91dGlscy9mc1V0aWwuanMnO1xuaW1wb3J0IHsgaWdub3JlRmlsZVV0aWwgfSBmcm9tICcuLi91dGlscy9pZ25vcmVGaWxlVXRpbC5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcblxuY29uc3QgZGVmYXVsdE5hbWVzID0gWyd3aW5kb3dzJywgJ21hY29zJywgJ2xpbnV4JywgJ2pldGJyYWlucycsICd2aXN1YWxzdHVkaW9jb2RlJywgJ2VtYWNzJywgJ3ZpbScsICd5YXJuJ107XG5cbmNvbnN0IGNvbW1vbkNvbnRlbnQgPSBgXG4hLmtlZXBcbi5haWRlcipcbi5lbnYucHJvZHVjdGlvblxuKi9tb3VudC8qLmhhc2hcbi5kZXZjb250YWluZXIvXG4uaWRlYS9BdWdtZW50V2Vidmlld1N0YXRlU3RvcmUueG1sXG4uaWRlYS9jb3BpbG90Lipcbi5pZGVhL2NvcGlsb3QvY2hhdFNlc3Npb25zL1xuLnNlcmVuYS9cbi50bXAvXG5fX2dlbmVyYXRlZF9fL1xuQHdpbGxib29zdGVyL1xuZGlzdC9cbnRlbXAvXG50bXAvXG5gO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVHaXRpZ25vcmUoY29uZmlnOiBQYWNrYWdlQ29uZmlnLCByb290Q29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZ2VuZXJhdGVHaXRpZ25vcmUnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICcuZ2l0aWdub3JlJyk7XG4gICAgY29uc3QgY29udGVudCA9IChhd2FpdCBmc1V0aWwucmVhZEZpbGVJZ25vcmluZ0Vycm9yKGZpbGVQYXRoKSkgPz8gJyc7XG4gICAgbGV0IGhlYWRVc2VyQ29udGVudCA9IGlnbm9yZUZpbGVVdGlsLmdldEhlYWRVc2VyQ29udGVudChjb250ZW50KSArIGNvbW1vbkNvbnRlbnQ7XG4gICAgY29uc3QgdGFpbFVzZXJDb250ZW50ID0gaWdub3JlRmlsZVV0aWwuZ2V0VGFpbFVzZXJDb250ZW50KGNvbnRlbnQpO1xuXG4gICAgY29uc3QgbmFtZXMgPSBbLi4uZGVmYXVsdE5hbWVzXTtcbiAgICBpZiAoY29uZmlnLmRvZXNDb250YWluR2VtZmlsZSkge1xuICAgICAgbmFtZXMucHVzaCgncnVieScpO1xuICAgIH1cbiAgICBpZiAoY29uZmlnLmRvZXNDb250YWluR29Nb2QpIHtcbiAgICAgIG5hbWVzLnB1c2goJ2dvJyk7XG4gICAgICBoZWFkVXNlckNvbnRlbnQgKz0gYCR7cGF0aC5iYXNlbmFtZShjb25maWcuZGlyUGF0aCl9XG5gO1xuICAgIH1cbiAgICBpZiAoY29uZmlnLmRvZXNDb250YWluUGFja2FnZUpzb24pIHtcbiAgICAgIG5hbWVzLnB1c2goJ25vZGUnKTtcbiAgICB9XG4gICAgaWYgKGNvbmZpZy5kb2VzQ29udGFpblBvbVhtbCkge1xuICAgICAgbmFtZXMucHVzaCgnbWF2ZW4nKTtcbiAgICAgIGhlYWRVc2VyQ29udGVudCArPSBgLmlkZWEvZ29vZ2xlLWphdmEtZm9ybWF0LnhtbFxuYDtcbiAgICB9XG4gICAgaWYgKGNvbmZpZy5kb2VzQ29udGFpblB1YnNwZWNZYW1sKSB7XG4gICAgICBuYW1lcy5wdXNoKCdmbHV0dGVyJywgJ0FuZHJvaWRTdHVkaW8nLCAncnVieScpO1xuICAgICAgaGVhZFVzZXJDb250ZW50ICs9IGAuZmx1dHRlci1wbHVnaW5zLWRlcGVuZGVuY2llc1xuYW5kcm9pZC9rZXkucHJvcGVydGllc1xuaW9zLy5idW5kbGVcbi5pZGVhL3J1bkNvbmZpZ3VyYXRpb25zLnhtbFxuYDtcbiAgICB9XG4gICAgaWYgKGNvbmZpZy5kb2VzQ29udGFpblRlbXBsYXRlWWFtbCkge1xuICAgICAgaGVhZFVzZXJDb250ZW50ICs9IGAuYXdzLXNhbS9cbnBhY2thZ2VkLnlhbWxcbmA7XG4gICAgfVxuICAgIC8vIEJlY2F1c2UgLnZlbnYgc2hvdWxkIGJlIGlnbm9yZWQgb24gcm9vdCBkaXJlY3RvcnlcbiAgICBpZiAoY29uZmlnLmRvZXNDb250YWluUG9ldHJ5TG9jaykge1xuICAgICAgbmFtZXMucHVzaCgncHl0aG9uJyk7XG4gICAgICBoZWFkVXNlckNvbnRlbnQgKz0gYC52ZW52L1xuYDtcbiAgICB9XG5cbiAgICBpZiAoY29uZmlnLmRlcGVuZGluZy5ibGl0eikge1xuICAgICAgaGVhZFVzZXJDb250ZW50ICs9IGAuYmxpdHovXG4uYmxpdHoqKlxuYDtcbiAgICB9XG4gICAgaWYgKGNvbmZpZy5kZXBlbmRpbmcubmV4dCkge1xuICAgICAgbmFtZXMucHVzaCgnbmV4dGpzJyk7XG4gICAgfVxuICAgIGlmIChyb290Q29uZmlnLmRlcGVuZGluZy5maXJlYmFzZSB8fCBjb25maWcuZGVwZW5kaW5nLmZpcmViYXNlKSB7XG4gICAgICBuYW1lcy5wdXNoKCdmaXJlYmFzZScpO1xuICAgIH1cbiAgICBpZiAoY29uZmlnLmRlcGVuZGluZy5wcmlzbWEpIHtcbiAgICAgIGhlYWRVc2VyQ29udGVudCArPSBgKi5zcWxpdGUzKlxuYDtcbiAgICB9XG4gICAgaWYgKGNvbmZpZy5kZXBlbmRpbmcucGxheXdyaWdodFRlc3QpIHtcbiAgICAgIGhlYWRVc2VyQ29udGVudCArPSBgcGxheXdyaWdodC1yZXBvcnQvXG50ZXN0LXJlc3VsdHMvXG5gO1xuICAgIH1cbiAgICBpZiAocm9vdENvbmZpZy5kZXBlbmRpbmcucmVhY3ROYXRpdmUgfHwgY29uZmlnLmRlcGVuZGluZy5yZWFjdE5hdGl2ZSkge1xuICAgICAgbmFtZXMucHVzaCgncmVhY3RuYXRpdmUnKTtcbiAgICAgIGhlYWRVc2VyQ29udGVudCArPSBgZ29vZ2xlLXNlcnZpY2VzLmpzb25cbmFuZHJvaWQvYXBwL3NyYy9tYWluL2Fzc2V0cy9cbmA7XG4gICAgfVxuICAgIGlmIChjb25maWcuZGVwZW5kaW5nLnN0b3J5Ym9vaykge1xuICAgICAgbmFtZXMucHVzaCgnc3Rvcnlib29ranMnKTtcbiAgICB9XG4gICAgaWYgKGNvbmZpZy5kZXBlbmRpbmcubGl0ZXN0cmVhbSkge1xuICAgICAgaGVhZFVzZXJDb250ZW50ICs9IGBnY3Atc2Eta2V5Lmpzb25cbmA7XG4gICAgfVxuXG4gICAgbGV0IGdlbmVyYXRlZCA9ICcnO1xuICAgIGZvciAoY29uc3QgbmFtZSBvZiBuYW1lcykge1xuICAgICAgbGV0IGNvbnRlbnQgPSAoYXdhaXQgcmVhZENhY2hlKG5hbWUpKSA/PyAnJztcbiAgICAgIGlmICghY29udGVudCkge1xuICAgICAgICBjb25zdCB1cmwgPSBgaHR0cHM6Ly93d3cudG9wdGFsLmNvbS9kZXZlbG9wZXJzL2dpdGlnbm9yZS9hcGkvJHtuYW1lfWA7XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2godXJsKTtcbiAgICAgICAgY29uc3QgcmVzcG9uc2VUZXh0ID0gYXdhaXQgcmVzcG9uc2UudGV4dCgpO1xuICAgICAgICBpZiAoIXJlc3BvbnNlLm9rIHx8IHJlc3BvbnNlVGV4dC5pbmNsdWRlcygnQXR0ZW50aW9uIFJlcXVpcmVkIScpIHx8IHJlc3BvbnNlVGV4dC5pbmNsdWRlcygnPHRpdGxlPicpKSB7XG4gICAgICAgICAgY29uc29sZS5lcnJvcihgRmFpbGVkIHRvIGZldGNoICR7dXJsfWApO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb250ZW50ID0gcmVzcG9uc2VUZXh0LnRyaW0oKTtcbiAgICAgICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IHdyaXRlQ2FjaGUobmFtZSwgY29udGVudCkpO1xuICAgICAgICBpZiAob3B0aW9ucy5pc1ZlcmJvc2UpIHtcbiAgICAgICAgICBjb25zb2xlLmluZm8oYEZldGNoZWQgJHt1cmx9YCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChnZW5lcmF0ZWQpIGdlbmVyYXRlZCArPSAnXFxuJztcbiAgICAgIGdlbmVyYXRlZCArPSBjb250ZW50ICsgJ1xcbic7XG4gICAgfVxuICAgIGlmICghKGF3YWl0IGlnbm9yZUZpbGVVdGlsLmlzQmVycnlaZXJvSW5zdGFsbEVuYWJsZWQoZmlsZVBhdGgpKSkge1xuICAgICAgZ2VuZXJhdGVkID0gZ2VuZXJhdGVkLnJlcGxhY2UoJyEueWFybi9jYWNoZScsICcjICEueWFybi9jYWNoZScpLnJlcGxhY2UoJyMgLnBucC4qJywgJy5wbnAuKicpO1xuICAgIH1cbiAgICBpZiAoY29uZmlnLmRvZXNDb250YWluUG9tWG1sIHx8IGNvbmZpZy5kb2VzQ29udGFpblB1YnNwZWNZYW1sKSB7XG4gICAgICBnZW5lcmF0ZWQgPSBnZW5lcmF0ZWRcbiAgICAgICAgLnJlcGxhY2VBbGwoL14jIC5pZGVhXFwvYXJ0aWZhY3RzJC9nbSwgJy5pZGVhL2FydGlmYWN0cycpXG4gICAgICAgIC5yZXBsYWNlQWxsKC9eIyAuaWRlYVxcL2NvbXBpbGVyLnhtbCQvZ20sICcuaWRlYS9jb21waWxlci54bWwnKVxuICAgICAgICAucmVwbGFjZUFsbCgvXiMgLmlkZWFcXC9qYXJSZXBvc2l0b3JpZXMueG1sJC9nbSwgJy5pZGVhL2phclJlcG9zaXRvcmllcy54bWwnKVxuICAgICAgICAucmVwbGFjZUFsbCgvXiMgLmlkZWFcXC9tb2R1bGVzLnhtbCQvZ20sICcuaWRlYS9tb2R1bGVzLnhtbCcpXG4gICAgICAgIC5yZXBsYWNlQWxsKC9eIyAuaWRlYVxcLyouaW1sJC9nbSwgJy5pZGVhLyouaW1sJylcbiAgICAgICAgLnJlcGxhY2VBbGwoL14jIC5pZGVhXFwvbW9kdWxlcyQvZ20sICcuaWRlYS9tb2R1bGVzJylcbiAgICAgICAgLnJlcGxhY2VBbGwoL14jICouaW1sJC9nbSwgJyouaW1sJylcbiAgICAgICAgLnJlcGxhY2VBbGwoL14jICouaXByJC9nbSwgJyouaXByJyk7XG4gICAgICBpZiAoY29uZmlnLmRvZXNDb250YWluUHVic3BlY1lhbWwpIHtcbiAgICAgICAgZ2VuZXJhdGVkID0gZ2VuZXJhdGVkLnJlcGxhY2VBbGwoL14uaWRlYVxcL21vZHVsZXMueG1sJC9nbSwgJyMgLmlkZWEvbW9kdWxlcy54bWwnKTtcbiAgICAgIH1cbiAgICB9XG4gICAgZ2VuZXJhdGVkID0gZ2VuZXJhdGVkLnJlcGxhY2VBbGwoL14uaWRlYVxcLz8kL2dtLCAnIyAuaWRlYScpO1xuICAgIGlmIChyb290Q29uZmlnLmRlcGVuZGluZy5yZWFjdE5hdGl2ZSB8fCBjb25maWcuZGVwZW5kaW5nLnJlYWN0TmF0aXZlIHx8IGNvbmZpZy5kb2VzQ29udGFpblB1YnNwZWNZYW1sKSB7XG4gICAgICBnZW5lcmF0ZWQgPSBnZW5lcmF0ZWQucmVwbGFjZUFsbCgvXiguaWRlYVxcLy4rKSQvZ20sICckMVxcbmFuZHJvaWQvJDEnKTtcbiAgICB9XG4gICAgY29uc3QgbmV3Q29udGVudCA9IGhlYWRVc2VyQ29udGVudCArICdcXG4nICsgZ2VuZXJhdGVkICsgdGFpbFVzZXJDb250ZW50O1xuICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiBmc1V0aWwuZ2VuZXJhdGVGaWxlKGZpbGVQYXRoLCBuZXdDb250ZW50KSk7XG4gIH0pO1xufVxuXG5jb25zdCBkaXJQYXRoID0gcGF0aC5qb2luKG9zLmhvbWVkaXIoKSwgJy5jYWNoZScsICd3YmZ5JywgJ2dpdGlnbm9yZScpO1xuXG5hc3luYyBmdW5jdGlvbiB3cml0ZUNhY2hlKG5hbWU6IHN0cmluZywgY29udGVudDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gIGF3YWl0IGZzLnByb21pc2VzLm1rZGlyKGRpclBhdGgsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICBhd2FpdCBmcy5wcm9taXNlcy53cml0ZUZpbGUocGF0aC5qb2luKGRpclBhdGgsIG5hbWUpLCBjb250ZW50KTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gcmVhZENhY2hlKG5hbWU6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nIHwgdW5kZWZpbmVkPiB7XG4gIHRyeSB7XG4gICAgY29uc3Qgc3RhdCA9IGF3YWl0IGZzLnByb21pc2VzLnN0YXQocGF0aC5qb2luKGRpclBhdGgsIG5hbWUpKTtcbiAgICBpZiAoRGF0ZS5ub3coKSAtIHN0YXQubXRpbWVNcyA+IDYgKiA2MCAqIDYwICogMTAwMCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICByZXR1cm4gYXdhaXQgZnMucHJvbWlzZXMucmVhZEZpbGUocGF0aC5qb2luKGRpclBhdGgsIG5hbWUpLCAndXRmOCcpO1xuICB9IGNhdGNoIHtcbiAgICAvLyBkbyBub3RoaW5nXG4gIH1cbn1cbiIsImltcG9ydCB7IHNwYXduU3luY1dpdGhTdHJpbmdSZXN1bHQgfSBmcm9tICcuLi91dGlscy9zcGF3blV0aWwuanMnO1xuXG5leHBvcnQgZnVuY3Rpb24gZ2V0TGF0ZXN0Q29tbWl0SGFzaChvcmdhbml6YXRpb246IHN0cmluZywgcmVwbzogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgdHJ5IHtcbiAgICBjb25zdCByZXBvVXJsID0gYGdpdEBnaXRodWIuY29tOiR7b3JnYW5pemF0aW9ufS8ke3JlcG99LmdpdGA7XG4gICAgY29uc3Qgb3V0cHV0ID0gc3Bhd25TeW5jV2l0aFN0cmluZ1Jlc3VsdCgnZ2l0JywgWydscy1yZW1vdGUnLCByZXBvVXJsLCAnSEVBRCddLCBwcm9jZXNzLmN3ZCgpKTtcbiAgICBjb25zdCBjb21taXRIYXNoID0gb3V0cHV0LnNwbGl0KC9cXHMrLylbMF07XG4gICAgaWYgKCFjb21taXRIYXNoKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYE5vIGNvbW1pdHMgZm91bmQgZm9yICR7b3JnYW5pemF0aW9ufS8ke3JlcG99YCk7XG4gICAgfVxuICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoY29tbWl0SGFzaCk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgcmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBFcnJvcihgRmFpbGVkIHRvIGZldGNoIGNvbW1pdHMgZm9yICR7b3JnYW5pemF0aW9ufS8ke3JlcG99OiAke1N0cmluZyhlcnJvcil9YCkpO1xuICB9XG59XG4iLCJpbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcblxuZXhwb3J0IGNvbnN0IEVzbGludFV0aWwgPSB7XG4gIGdldExpbnRGaXhTdWZmaXgoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogc3RyaW5nIHtcbiAgICByZXR1cm4gY29uZmlnLmRvZXNDb250YWluSnN4T3JUc3ggPyAnIC0tcnVsZSBcInsgcmVhY3QtaG9va3MvZXhoYXVzdGl2ZS1kZXBzOiAwIH1cIicgOiAnJztcbiAgfSxcbn07XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgbWVyZ2UgZnJvbSAnZGVlcG1lcmdlJztcbmltcG9ydCBmZyBmcm9tICdmYXN0LWdsb2InO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlSnNvbiwgU2V0UmVxdWlyZWQgfSBmcm9tICd0eXBlLWZlc3QnO1xuXG5pbXBvcnQgeyBnZXRMYXRlc3RDb21taXRIYXNoIH0gZnJvbSAnLi4vZ2l0aHViL2NvbW1pdC5qcyc7XG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBFc2xpbnRFeHRlbnNpb25CYXNlLCBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBFc2xpbnRVdGlsIH0gZnJvbSAnLi4vdXRpbHMvZXNsaW50VXRpbC5qcyc7XG5pbXBvcnQgeyBleHRlbnNpb25zIH0gZnJvbSAnLi4vdXRpbHMvZXh0ZW5zaW9ucy5qcyc7XG5pbXBvcnQgeyBnaXRIdWJVdGlsIH0gZnJvbSAnLi4vdXRpbHMvZ2l0aHViVXRpbC5qcyc7XG5pbXBvcnQgeyBnbG9iSWdub3JlIH0gZnJvbSAnLi4vdXRpbHMvZ2xvYlV0aWwuanMnO1xuaW1wb3J0IHsgaWdub3JlRmlsZVV0aWwgfSBmcm9tICcuLi91dGlscy9pZ25vcmVGaWxlVXRpbC5qcyc7XG5pbXBvcnQgeyBjb21iaW5lTWVyZ2UgfSBmcm9tICcuLi91dGlscy9tZXJnZVV0aWwuanMnO1xuaW1wb3J0IHsgcHJvbWlzZVBvb2wgfSBmcm9tICcuLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5pbXBvcnQgeyBzcGF3blN5bmMgfSBmcm9tICcuLi91dGlscy9zcGF3blV0aWwuanMnO1xuXG5jb25zdCBqc0NvbW1vbkRlcHMgPSBbXG4gICdlc2xpbnQnLFxuICAnZXNsaW50LWNvbmZpZy1mbGF0LWdpdGlnbm9yZScsXG4gICdlc2xpbnQtY29uZmlnLXByZXR0aWVyJyxcbiAgJ2VzbGludC1wbHVnaW4taW1wb3J0LXgnLFxuICAnZXNsaW50LXBsdWdpbi1zb3J0LWNsYXNzLW1lbWJlcnMnLFxuICAnZXNsaW50LXBsdWdpbi1zb3J0LWRlc3RydWN0dXJlLWtleXMnLFxuICAnZXNsaW50LXBsdWdpbi11bmljb3JuJyxcbiAgJ2VzbGludC1wbHVnaW4tdW51c2VkLWltcG9ydHMnLFxuICAnZ2xvYmFscycsXG5dO1xuXG5jb25zdCB0c0NvbW1vbkRlcHMgPSBbLi4uanNDb21tb25EZXBzLCAndHlwZXNjcmlwdC1lc2xpbnQnLCAnZXNsaW50LWltcG9ydC1yZXNvbHZlci10eXBlc2NyaXB0J107XG5cbmNvbnN0IHJlYWN0Q29tbW9uRGVwcyA9IFsnZXNsaW50LXBsdWdpbi1yZWFjdCcsICdlc2xpbnQtcGx1Z2luLXJlYWN0LWhvb2tzJywgJ2VzbGludC1wbHVnaW4tcmVhY3QtY29tcGlsZXInXTtcblxuY29uc3QgZXNsaW50RGVwczogUmVjb3JkPEVzbGludEV4dGVuc2lvbkJhc2UsIHN0cmluZ1tdPiA9IHtcbiAgJ0B3aWxsYm9vc3Rlci9lc2xpbnQtY29uZmlnLWpzJzogWydAd2lsbGJvb3N0ZXIvZXNsaW50LWNvbmZpZy1qcycsIC4uLmpzQ29tbW9uRGVwc10sXG4gICdAd2lsbGJvb3N0ZXIvZXNsaW50LWNvbmZpZy1qcy1yZWFjdCc6IFsnQHdpbGxib29zdGVyL2VzbGludC1jb25maWctanMtcmVhY3QnLCAuLi5qc0NvbW1vbkRlcHMsIC4uLnJlYWN0Q29tbW9uRGVwc10sXG4gICdAd2lsbGJvb3N0ZXIvZXNsaW50LWNvbmZpZy10cyc6IFsnQHdpbGxib29zdGVyL2VzbGludC1jb25maWctdHMnLCAuLi50c0NvbW1vbkRlcHNdLFxuICAnQHdpbGxib29zdGVyL2VzbGludC1jb25maWctdHMtcmVhY3QnOiBbJ0B3aWxsYm9vc3Rlci9lc2xpbnQtY29uZmlnLXRzLXJlYWN0JywgLi4udHNDb21tb25EZXBzLCAuLi5yZWFjdENvbW1vbkRlcHNdLFxuICAnQHdpbGxib29zdGVyL2VzbGludC1jb25maWctbmV4dCc6IFtcbiAgICAnQHdpbGxib29zdGVyL2VzbGludC1jb25maWctbmV4dCcsXG4gICAgJ2VzbGludC1jb25maWctbmV4dCcsXG4gICAgLi4udHNDb21tb25EZXBzLFxuICAgIC4uLnJlYWN0Q29tbW9uRGVwcyxcbiAgXSxcbn07XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZW5lcmF0ZVBhY2thZ2VKc29uKFxuICBjb25maWc6IFBhY2thZ2VDb25maWcsXG4gIHJvb3RDb25maWc6IFBhY2thZ2VDb25maWcsXG4gIHNraXBBZGRpbmdEZXBzOiBib29sZWFuXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdnZW5lcmF0ZVBhY2thZ2VKc29uJywgYXN5bmMgKCkgPT4ge1xuICAgIGF3YWl0IGNvcmUoY29uZmlnLCByb290Q29uZmlnLCBza2lwQWRkaW5nRGVwcyk7XG4gIH0pO1xufVxuXG5hc3luYyBmdW5jdGlvbiBjb3JlKGNvbmZpZzogUGFja2FnZUNvbmZpZywgcm9vdENvbmZpZzogUGFja2FnZUNvbmZpZywgc2tpcEFkZGluZ0RlcHM6IGJvb2xlYW4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgZmlsZVBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICdwYWNrYWdlLmpzb24nKTtcbiAgY29uc3QganNvblRleHQgPSBhd2FpdCBmcy5wcm9taXNlcy5yZWFkRmlsZShmaWxlUGF0aCwgJ3V0ZjgnKTtcbiAgY29uc3QganNvbk9iaiA9IEpTT04ucGFyc2UoanNvblRleHQpIGFzIFBhY2thZ2VKc29uO1xuICBqc29uT2JqLnNjcmlwdHMgPSBqc29uT2JqLnNjcmlwdHMgPz8ge307XG4gIGpzb25PYmouZGVwZW5kZW5jaWVzID0ganNvbk9iai5kZXBlbmRlbmNpZXMgPz8ge307XG4gIGpzb25PYmouZGV2RGVwZW5kZW5jaWVzID0ganNvbk9iai5kZXZEZXBlbmRlbmNpZXMgPz8ge307XG4gIGpzb25PYmoucGVlckRlcGVuZGVuY2llcyA9IGpzb25PYmoucGVlckRlcGVuZGVuY2llcyA/PyB7fTtcbiAgY29uc3QgcGFja2FnZU1hbmFnZXIgPSBjb25maWcuaXNCdW4gPyAnYnVuJyA6ICd5YXJuJztcblxuICBhd2FpdCByZW1vdmVEZXByZWNhdGVkU3R1ZmYoanNvbk9iaiBhcyBTZXRSZXF1aXJlZDxQYWNrYWdlSnNvbiwgJ3NjcmlwdHMnIHwgJ2RlcGVuZGVuY2llcycgfCAnZGV2RGVwZW5kZW5jaWVzJz4pO1xuXG4gIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKGpzb25PYmouc2NyaXB0cyBhcyBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+KSkge1xuICAgIC8vIEZyZXNoIHJlcG8gc3RpbGwgcmVxdWlyZXMgJ3lhcm4gaW5zdGFsbCdcbiAgICBpZiAoIXZhbHVlLmluY2x1ZGVzKCdnaXQgY2xvbmUnKSkge1xuICAgICAganNvbk9iai5zY3JpcHRzW2tleV0gPSB2YWx1ZS5yZXBsYWNlKC95YXJuXFxzKiYmXFxzKi8sICcnKS5yZXBsYWNlKC95YXJuXFxzKmluc3RhbGxcXHMqJiZcXHMqLywgJycpO1xuICAgIH1cbiAgfVxuXG4gIGpzb25PYmouc2NyaXB0cyA9IG1lcmdlKGpzb25PYmouc2NyaXB0cywgZ2VuZXJhdGVTY3JpcHRzKGNvbmZpZywganNvbk9iai5zY3JpcHRzKSk7XG5cbiAgaWYgKCdjaGVjay1mb3ItYWknIGluIGpzb25PYmouc2NyaXB0cykge1xuICAgIGlmICgnZ2VuLWNvZGUnIGluIGpzb25PYmouc2NyaXB0cykge1xuICAgICAganNvbk9iai5zY3JpcHRzWydjaGVjay1mb3ItYWknXSA9IGAke3BhY2thZ2VNYW5hZ2VyfSBnZW4tY29kZSA+IC9kZXYvbnVsbCAmJiAke2pzb25PYmouc2NyaXB0c1snY2hlY2stZm9yLWFpJ119YDtcbiAgICB9XG4gICAganNvbk9iai5zY3JpcHRzWydjaGVjay1mb3ItYWknXSA9IGAke3BhY2thZ2VNYW5hZ2VyfSBpbnN0YWxsID4gL2Rldi9udWxsICYmICR7anNvbk9iai5zY3JpcHRzWydjaGVjay1mb3ItYWknXX1gO1xuICB9XG5cbiAgaWYgKGNvbmZpZy5pc0J1bikge1xuICAgIGRlbGV0ZSBqc29uT2JqLnNjcmlwdHMucHJldHRpZnk7XG4gIH0gZWxzZSB7XG4gICAganNvbk9iai5zY3JpcHRzLnByZXR0aWZ5ID0gKGpzb25PYmouc2NyaXB0cy5wcmV0dGlmeSA/PyAnJykgKyAoYXdhaXQgZ2VuZXJhdGVQcmV0dGllclN1ZmZpeChjb25maWcuZGlyUGF0aCkpO1xuICB9XG4gIC8vIERlYWwgd2l0aCBicmVha2luZyBjaGFuZ2VzIGluIHlhcm4gYmVycnkgNC4wLjAtcmMuNDlcbiAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMoanNvbk9iai5zY3JpcHRzKSkge1xuICAgIGlmICghdmFsdWU/LmluY2x1ZGVzKCd5YXJuIHdvcmtzcGFjZXMgZm9yZWFjaCcpKSBjb250aW51ZTtcbiAgICBpZiAoXG4gICAgICB2YWx1ZS5pbmNsdWRlcygnLS1hbGwnKSB8fFxuICAgICAgdmFsdWUuaW5jbHVkZXMoJy0tcmVjdXJzaXZlJykgfHxcbiAgICAgIHZhbHVlLmluY2x1ZGVzKCctLXNpbmNlJykgfHxcbiAgICAgIHZhbHVlLmluY2x1ZGVzKCctLXdvcmt0cmVlJylcbiAgICApXG4gICAgICBjb250aW51ZTtcbiAgICBqc29uT2JqLnNjcmlwdHNba2V5XSA9IHZhbHVlLnJlcGxhY2UoJ3lhcm4gd29ya3NwYWNlcyBmb3JlYWNoJywgJ3lhcm4gd29ya3NwYWNlcyBmb3JlYWNoIC0tYWxsJyk7XG4gIH1cblxuICBsZXQgZGVwZW5kZW5jaWVzOiBzdHJpbmdbXSA9IFtdO1xuICBsZXQgZGV2RGVwZW5kZW5jaWVzID0gWydwcmV0dGllcicsICdzb3J0LXBhY2thZ2UtanNvbiddO1xuICBjb25zdCBwb2V0cnlEZXZEZXBlbmRlbmNpZXM6IHN0cmluZ1tdID0gW107XG5cbiAgaWYgKFxuICAgICFmcy5leGlzdHNTeW5jKHBhdGguam9pbihyb290Q29uZmlnLmRpclBhdGgsICcucHJldHRpZXJyYy5qc29uJykpICYmXG4gICAgIWZzLmV4aXN0c1N5bmMocGF0aC5qb2luKGNvbmZpZy5kaXJQYXRoLCAnLnByZXR0aWVycmMuanNvbicpKVxuICApIHtcbiAgICBqc29uT2JqLnByZXR0aWVyID0gJ0B3aWxsYm9vc3Rlci9wcmV0dGllci1jb25maWcnO1xuICAgIGRldkRlcGVuZGVuY2llcy5wdXNoKCdwcmV0dGllci1wbHVnaW4tamF2YScsICdAd2lsbGJvb3N0ZXIvcHJldHRpZXItY29uZmlnJyk7XG4gIH1cblxuICBpZiAoY29uZmlnLmlzQnVuKSB7XG4gICAgZGVsZXRlIGpzb25PYmouZGV2RGVwZW5kZW5jaWVzWydsaW50LXN0YWdlZCddO1xuICB9IGVsc2Uge1xuICAgIGRldkRlcGVuZGVuY2llcy5wdXNoKCdsaW50LXN0YWdlZCcpO1xuICB9XG5cbiAgaWYgKGNvbmZpZy5pc1Jvb3QpIHtcbiAgICBpZiAoY29uZmlnLmlzQnVuKSB7XG4gICAgICBkZWxldGUganNvbk9iai5kZXZEZXBlbmRlbmNpZXMuaHVza3k7XG4gICAgICBkZWxldGUganNvbk9iai5kZXZEZXBlbmRlbmNpZXMucGluc3Q7XG4gICAgICBqc29uT2JqLnNjcmlwdHMucHJlcGFyZSA9ICdsZWZ0aG9vayBpbnN0YWxsIHx8IHRydWUnO1xuICAgICAgZGV2RGVwZW5kZW5jaWVzLnB1c2goJ2xlZnRob29rJyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIFRvIGluc3RhbGwgdGhlIGxhdGVzdCBodXNreVxuICAgICAgZGV2RGVwZW5kZW5jaWVzLnB1c2goJ2h1c2t5Jyk7XG4gICAgICAvLyAnfHwgdHJ1ZScgYXZvaWRzIGVycm9ycyB3aGVuIGh1c2t5IGlzIG5vdCBpbnN0YWxsZWQuXG4gICAgICBqc29uT2JqLnNjcmlwdHMucHJlcGFyZSA9ICdodXNreSB8fCB0cnVlJzsgLy8gZm9yIG5vbi15YXJuIHBhY2thZ2UgbWFuYWdlcnMuXG4gICAgICBqc29uT2JqLnNjcmlwdHMucG9zdGluc3RhbGwgPSAnaHVza3kgfHwgdHJ1ZSc7IC8vIGZvciB5YXJuLlxuICAgICAgaWYgKGNvbmZpZy5pc1B1YmxpY1JlcG8gfHwgY29uZmlnLmlzUmVmZXJyZWRCeU90aGVyUmVwbykge1xuICAgICAgICAvLyBUbyBpbnN0YWxsIHRoZSBsYXRlc3QgcGluc3RcbiAgICAgICAgLy8gaHR0cHM6Ly90eXBpY29kZS5naXRodWIuaW8vaHVza3kvIy8/aWQ9aW5zdGFsbC0xXG4gICAgICAgIGRldkRlcGVuZGVuY2llcy5wdXNoKCdwaW5zdCcpO1xuICAgICAgICBqc29uT2JqLnNjcmlwdHMucHJlcGFjayA9ICdwaW5zdCAtLWRpc2FibGUnO1xuICAgICAgICBqc29uT2JqLnNjcmlwdHMucG9zdHBhY2sgPSAncGluc3QgLS1lbmFibGUnO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChjb25maWcuZGVwZW5kaW5nLnNlbWFudGljUmVsZWFzZSkge1xuICAgICAgaWYgKFxuICAgICAgICAhanNvbk9iai5kZXZEZXBlbmRlbmNpZXNbJ3NlbWFudGljLXJlbGVhc2UnXSAmJlxuICAgICAgICAhanNvbk9iai5kZXZEZXBlbmRlbmNpZXNbJ211bHRpLXNlbWFudGljLXJlbGVhc2UnXSAmJlxuICAgICAgICAhanNvbk9iai5kZXZEZXBlbmRlbmNpZXNbJ0BxaXdpL211bHRpLXNlbWFudGljLXJlbGVhc2UnXVxuICAgICAgKSB7XG4gICAgICAgIGRldkRlcGVuZGVuY2llcy5wdXNoKCdzZW1hbnRpYy1yZWxlYXNlJyk7XG4gICAgICB9XG4gICAgICBqc29uT2JqLnZlcnNpb24gPSAnMC4wLjAtc2VtYW50aWNhbGx5LXJlbGVhc2VkJztcbiAgICB9XG5cbiAgICBpZiAoY29uZmlnLmRlcGVuZGluZy5wbGF5d3JpZ2h0VGVzdCkge1xuICAgICAgLy8gU2luY2UgYXJ0aWxsZXJ5IHJlcXVpcmVzIGEgc3BlY2lmaWMgdmVyc2lvbiBvZiBAcGxheXdyaWdodC90ZXN0XG4gICAgICBjb25zdCBoYXNBcnRpbGxlcnkgPSBqc29uT2JqLmRlcGVuZGVuY2llcy5hcnRpbGxlcnkgfHwganNvbk9iai5kZXZEZXBlbmRlbmNpZXMuYXJ0aWxsZXJ5O1xuICAgICAgLy8gU2luY2UgbGxtLXRvb2xib3ggcmVxdWlyZXMgQHBsYXl3cmlnaHQvdGVzdCBpbiBkZXBlbmRlbmNpZXNcbiAgICAgIGlmICghaGFzQXJ0aWxsZXJ5ICYmICFqc29uT2JqLmRlcGVuZGVuY2llc1snQHBsYXl3cmlnaHQvdGVzdCddKSB7XG4gICAgICAgIGRldkRlcGVuZGVuY2llcy5wdXNoKCdAcGxheXdyaWdodC90ZXN0Jyk7XG4gICAgICAgIGRlbGV0ZSBqc29uT2JqLmRlcGVuZGVuY2llc1snQHBsYXl3cmlnaHQvdGVzdCddO1xuICAgICAgfVxuICAgICAgZGVsZXRlIGpzb25PYmouZGVwZW5kZW5jaWVzLnBsYXl3cmlnaHQ7XG4gICAgICBkZWxldGUganNvbk9iai5kZXZEZXBlbmRlbmNpZXMucGxheXdyaWdodDtcbiAgICB9XG5cbiAgICBpZiAoY29uZmlnLmRvZXNDb250YWluU3ViUGFja2FnZUpzb25zKSB7XG4gICAgICAvLyBXZSBkb24ndCBhbGxvdyBub24tYXJyYXkgd29ya3NwYWNlcyBpbiBtb25vcmVwby5cbiAgICAgIGpzb25PYmoud29ya3NwYWNlcyA9IEFycmF5LmlzQXJyYXkoanNvbk9iai53b3Jrc3BhY2VzKVxuICAgICAgICA/IG1lcmdlLmFsbChbanNvbk9iai53b3Jrc3BhY2VzLCBbJ3BhY2thZ2VzLyonXV0sIHtcbiAgICAgICAgICAgIGFycmF5TWVyZ2U6IGNvbWJpbmVNZXJnZSxcbiAgICAgICAgICB9KVxuICAgICAgICA6IFsncGFja2FnZXMvKiddO1xuICAgIH0gZWxzZSBpZiAoQXJyYXkuaXNBcnJheShqc29uT2JqLndvcmtzcGFjZXMpKSB7XG4gICAgICBqc29uT2JqLndvcmtzcGFjZXMgPSBqc29uT2JqLndvcmtzcGFjZXMuZmlsdGVyKFxuICAgICAgICAod29ya3NwYWNlKSA9PlxuICAgICAgICAgIGZnLmdsb2JTeW5jKHdvcmtzcGFjZSwge1xuICAgICAgICAgICAgZG90OiB0cnVlLFxuICAgICAgICAgICAgY3dkOiBjb25maWcuZGlyUGF0aCxcbiAgICAgICAgICAgIGlnbm9yZTogZ2xvYklnbm9yZSxcbiAgICAgICAgICB9KS5sZW5ndGggPiAwXG4gICAgICApO1xuICAgICAgaWYgKGpzb25PYmoud29ya3NwYWNlcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgZGVsZXRlIGpzb25PYmoud29ya3NwYWNlcztcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBpZiAoY29uZmlnLmRlcGVuZGluZy53YiB8fCBjb25maWcuaXNCdW4pIHtcbiAgICBpZiAoanNvbk9iai5kZXBlbmRlbmNpZXNbJ0B3aWxsYm9vc3Rlci93YiddKSB7XG4gICAgICBkZXBlbmRlbmNpZXMucHVzaChcbiAgICAgICAganNvbk9iai5kZXBlbmRlbmNpZXNbJ0B3aWxsYm9vc3Rlci93YiddLnN0YXJ0c1dpdGgoJzEwLicpID8gJ0B3aWxsYm9vc3Rlci93YkAxMC43LjEnIDogJ0B3aWxsYm9vc3Rlci93YidcbiAgICAgICk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGRldkRlcGVuZGVuY2llcy5wdXNoKFxuICAgICAgICBqc29uT2JqLmRldkRlcGVuZGVuY2llc1snQHdpbGxib29zdGVyL3diJ10/LnN0YXJ0c1dpdGgoJzEwLicpID8gJ0B3aWxsYm9vc3Rlci93YkAxMC43LjEnIDogJ0B3aWxsYm9vc3Rlci93YidcbiAgICAgICk7XG4gICAgfVxuICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKGpzb25PYmouc2NyaXB0cyBhcyBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+KSkge1xuICAgICAganNvbk9iai5zY3JpcHRzW2tleV0gPSB2YWx1ZS5yZXBsYWNlKC93YlxccytkYi8sICd3YiBwcmlzbWEnKTtcbiAgICB9XG4gIH1cblxuICBpZiAoXG4gICAgY29uZmlnLmRvZXNDb250YWluSmF2YVNjcmlwdCB8fFxuICAgIGNvbmZpZy5kb2VzQ29udGFpbkphdmFTY3JpcHRJblBhY2thZ2VzIHx8XG4gICAgY29uZmlnLmRvZXNDb250YWluVHlwZVNjcmlwdCB8fFxuICAgIGNvbmZpZy5kb2VzQ29udGFpblR5cGVTY3JpcHRJblBhY2thZ2VzXG4gICkge1xuICAgIGlmIChjb25maWcuaXNCdW4pIHtcbiAgICAgIGRldkRlcGVuZGVuY2llcy5wdXNoKCdAYmlvbWVqcy9iaW9tZScsICdAd2lsbGJvb3N0ZXIvYmlvbWUtY29uZmlnJyk7XG4gICAgICBkZWxldGUganNvbk9iai5kZXZEZXBlbmRlbmNpZXMuZXNsaW50O1xuICAgICAgZGVsZXRlIGpzb25PYmouZGV2RGVwZW5kZW5jaWVzLm1pY3JvbWF0Y2g7XG4gICAgICBkZWxldGUganNvbk9iai5kZXZEZXBlbmRlbmNpZXNbJ3R5cGVzY3JpcHQtZXNsaW50J107XG4gICAgfSBlbHNlIHtcbiAgICAgIGRldkRlcGVuZGVuY2llcy5wdXNoKCdlc2xpbnQnLCAnbWljcm9tYXRjaCcpO1xuICAgIH1cbiAgfVxuXG4gIGlmIChjb25maWcuZG9lc0NvbnRhaW5UeXBlU2NyaXB0IHx8IGNvbmZpZy5kb2VzQ29udGFpblR5cGVTY3JpcHRJblBhY2thZ2VzKSB7XG4gICAgZGV2RGVwZW5kZW5jaWVzLnB1c2goJ3R5cGVzY3JpcHQnKTtcbiAgICBpZiAoY29uZmlnLmlzQnVuKSB7XG4gICAgICBkZXZEZXBlbmRlbmNpZXMucHVzaCgnQHR5cGVzL2J1bicpO1xuICAgIH1cbiAgfVxuXG4gIGlmIChjb25maWcuZXNsaW50QmFzZSkge1xuICAgIGRldkRlcGVuZGVuY2llcy5wdXNoKC4uLmVzbGludERlcHNbY29uZmlnLmVzbGludEJhc2VdKTtcbiAgfVxuXG4gIGlmIChjb25maWcuaXNXaWxsQm9vc3RlckNvbmZpZ3MpIHtcbiAgICBkZXBlbmRlbmNpZXMgPSBkZXBlbmRlbmNpZXMuZmlsdGVyKChkZXApID0+ICFkZXAuaW5jbHVkZXMoJ0B3aWxsYm9vc3Rlci8nKSk7XG4gICAgZGV2RGVwZW5kZW5jaWVzID0gZGV2RGVwZW5kZW5jaWVzLmZpbHRlcigoZGVwKSA9PiAhZGVwLmluY2x1ZGVzKCdAd2lsbGJvb3N0ZXIvJykpO1xuICB9XG5cbiAgaWYgKCFqc29uT2JqLm5hbWUpIHtcbiAgICBqc29uT2JqLm5hbWUgPSBwYXRoLmJhc2VuYW1lKGNvbmZpZy5kaXJQYXRoKTtcbiAgfVxuXG4gIGlmIChjb25maWcuZG9lc0NvbnRhaW5TdWJQYWNrYWdlSnNvbnMpIHtcbiAgICBqc29uT2JqLnByaXZhdGUgPSB0cnVlO1xuICB9XG4gIGlmICghanNvbk9iai5saWNlbnNlKSB7XG4gICAganNvbk9iai5saWNlbnNlID0gJ1VOTElDRU5TRUQnO1xuICB9XG4gIGlmICghanNvbk9iai5wcml2YXRlICYmIGpzb25PYmoubGljZW5zZSAhPT0gJ1VOTElDRU5TRUQnICYmIHJvb3RDb25maWcuaXNQdWJsaWNSZXBvKSB7XG4gICAganNvbk9iai5wdWJsaXNoQ29uZmlnID8/PSB7fTtcbiAgICBqc29uT2JqLnB1Ymxpc2hDb25maWcuYWNjZXNzID8/PSAncHVibGljJztcbiAgfVxuICBjb25zdCBbb3duZXJdID0gZ2l0SHViVXRpbC5nZXRPcmdBbmROYW1lKGNvbmZpZy5yZXBvc2l0b3J5ID8/ICcnKTtcbiAgaWYgKG93bmVyID09PSAnV2lsbEJvb3N0ZXInIHx8IG93bmVyID09PSAnV2lsbEJvb3N0ZXJMYWInKSB7XG4gICAganNvbk9iai5hdXRob3IgPSAnV2lsbEJvb3N0ZXIgSW5jLic7XG4gIH1cbiAgaWYgKCFjb25maWcuaXNSb290ICYmIGpzb25PYmoucHJpdmF0ZSAmJiAhanNvbk9iai5tYWluKSB7XG4gICAgLy8gTWFrZSBWU0NvZGUgcG9zc2libGUgdG8gcmVmYWN0b3IgY29kZSBhY3Jvc3Mgc3VicGFja2FnZXMuXG4gICAganNvbk9iai5tYWluID0gJy4vc3JjJztcbiAgfVxuXG4gIC8vIEJlY2F1c2UgYFwicmVzb2x1dGlvbnNcIjogeyBcIm5wbS9jaGFsa1wiOiBcIl40LjEuMlwiIH0sYCBjYXVzZXMgXCJJbnZhbGlkIG5wbSB0b2tlblwiXG4gIGRlbGV0ZSBqc29uT2JqLnJlc29sdXRpb25zPy5bJ25wbS9jaGFsayddO1xuXG4gIGlmICghY29uZmlnLmRvZXNDb250YWluU3ViUGFja2FnZUpzb25zKSB7XG4gICAgaWYgKCFjb25maWcuaXNCdW4pIHtcbiAgICAgIGlmICghY29uZmlnLmRvZXNDb250YWluSmF2YVNjcmlwdCAmJiAhY29uZmlnLmRvZXNDb250YWluVHlwZVNjcmlwdCkge1xuICAgICAgICBkZWxldGUganNvbk9iai5zY3JpcHRzLmxpbnQ7XG4gICAgICAgIGRlbGV0ZSBqc29uT2JqLnNjcmlwdHNbJ2xpbnQtZml4J107XG4gICAgICAgIGZvciAoY29uc3Qgc2NyaXB0TmFtZSBvZiBbJ2NsZWFudXAnLCAnY2hlY2stZm9yLWFpJ10pIHtcbiAgICAgICAgICBjb25zdCBzY3JpcHQgPSBqc29uT2JqLnNjcmlwdHNbc2NyaXB0TmFtZV07XG4gICAgICAgICAgaWYgKCFzY3JpcHQpIGNvbnRpbnVlO1xuICAgICAgICAgIGpzb25PYmouc2NyaXB0c1tzY3JpcHROYW1lXSA9IHNjcmlwdC5yZXBsYWNlKC8gPyYmID95YXJuIGxpbnQtZml4KD86IC0tcXVpZXQpPy8sICcnKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAganNvbk9iai5zY3JpcHRzWydsaW50LWZpeCddID0gKGpzb25PYmouc2NyaXB0c1snbGludC1maXgnXSA/PyAnJykgKyBFc2xpbnRVdGlsLmdldExpbnRGaXhTdWZmaXgoY29uZmlnKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoY29uZmlnLmRvZXNDb250YWluUHVic3BlY1lhbWwpIHtcbiAgICAgIGpzb25PYmouc2NyaXB0cy5saW50ID0gJ2ZsdXR0ZXIgYW5hbHl6ZSc7XG4gICAgICBqc29uT2JqLnNjcmlwdHNbJ2xpbnQtZml4J10gPSAneWFybiBsaW50JztcbiAgICAgIGNvbnN0IGRpcnMgPSBbJ2xpYicsICd0ZXN0JywgJ3Rlc3RfZHJpdmVyJ10uZmlsdGVyKChkaXIpID0+IGZzLmV4aXN0c1N5bmMocGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCBkaXIpKSk7XG4gICAgICBpZiAoZGlycy5sZW5ndGggPiAwKSB7XG4gICAgICAgIGpzb25PYmouc2NyaXB0c1snZm9ybWF0LWNvZGUnXSA9IGBkYXJ0IGZvcm1hdCAkKGZpbmQgJHtkaXJzLmpvaW4oXG4gICAgICAgICAgJyAnXG4gICAgICAgICl9IC1uYW1lIGdlbmVyYXRlZCAtcHJ1bmUgLW8gLW5hbWUgJyouZnJlZXplZC5kYXJ0JyAtcHJ1bmUgLW8gLW5hbWUgJyouZy5kYXJ0JyAtcHJ1bmUgLW8gLW5hbWUgJyouZGFydCcgLXByaW50KWA7XG4gICAgICAgIGpzb25PYmouc2NyaXB0cy5mb3JtYXQgPSAoanNvbk9iai5zY3JpcHRzLmZvcm1hdCA/PyAnJykgKyBgICYmIHlhcm4gZm9ybWF0LWNvZGVgO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChjb25maWcuZG9lc0NvbnRhaW5Qb2V0cnlMb2NrKSB7XG4gICAgICBpZiAoanNvbk9iai5zY3JpcHRzLnBvc3RpbnN0YWxsID09PSAncG9ldHJ5IGluc3RhbGwnKSB7XG4gICAgICAgIGRlbGV0ZSBqc29uT2JqLnNjcmlwdHMucG9zdGluc3RhbGw7XG4gICAgICB9XG4gICAgICBjb25zdCBweXRob25GaWxlcyA9IGF3YWl0IGZnLmdsb2IoJyoqLyoucHknLCB7XG4gICAgICAgIGN3ZDogY29uZmlnLmRpclBhdGgsXG4gICAgICAgIGRvdDogdHJ1ZSxcbiAgICAgICAgaWdub3JlOiBnbG9iSWdub3JlLFxuICAgICAgfSk7XG4gICAgICBjb25zdCBkaXJOYW1lU2V0ID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gICAgICBmb3IgKGNvbnN0IHB5dGhvbkZpbGUgb2YgcHl0aG9uRmlsZXMpIHtcbiAgICAgICAgY29uc3QgW2ZpcnN0LCBzZWNvbmRdID0gcHl0aG9uRmlsZS5zcGxpdCgvWy9cXFxcXS8pO1xuICAgICAgICBpZiAoZmlyc3QgJiYgc2Vjb25kKSB7XG4gICAgICAgICAgZGlyTmFtZVNldC5hZGQoZmlyc3QpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAoZGlyTmFtZVNldC5zaXplID4gMCkge1xuICAgICAgICBjb25zdCBkaXJOYW1lc1N0ciA9IFsuLi5kaXJOYW1lU2V0XS5qb2luKCcgJyk7XG4gICAgICAgIGpzb25PYmouc2NyaXB0c1snZm9ybWF0LWNvZGUnXSA9XG4gICAgICAgICAgYHBvZXRyeSBydW4gaXNvcnQgLS1wcm9maWxlIGJsYWNrICR7ZGlyTmFtZXNTdHJ9ICYmIHBvZXRyeSBydW4gYmxhY2sgJHtkaXJOYW1lc1N0cn1gO1xuICAgICAgICBpZiAoanNvbk9iai5zY3JpcHRzLmxpbnQpIHtcbiAgICAgICAgICBqc29uT2JqLnNjcmlwdHMubGludCA9IGBwb2V0cnkgcnVuIGZsYWtlOCAke2Rpck5hbWVzU3RyfSAmJiAke2pzb25PYmouc2NyaXB0cy5saW50fWA7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAganNvbk9iai5zY3JpcHRzLmxpbnQgPSBgcG9ldHJ5IHJ1biBmbGFrZTggJHtkaXJOYW1lc1N0cn1gO1xuICAgICAgICAgIGpzb25PYmouc2NyaXB0c1snbGludC1maXgnXSA9ICd5YXJuIGxpbnQnO1xuICAgICAgICB9XG4gICAgICAgIGpzb25PYmouc2NyaXB0cy5mb3JtYXQgPSAoanNvbk9iai5zY3JpcHRzLmZvcm1hdCA/PyAnJykgKyBgICYmIHlhcm4gZm9ybWF0LWNvZGVgO1xuICAgICAgICBwb2V0cnlEZXZEZXBlbmRlbmNpZXMucHVzaCgnYmxhY2snLCAnaXNvcnQnLCAnZmxha2U4Jyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGNvbmZpZy5yZXBvc2l0b3J5KSB7XG4gICAgICBqc29uT2JqLnJlcG9zaXRvcnkgPSBjb25maWcucmVwb3NpdG9yeTtcbiAgICB9XG4gIH1cblxuICBpZiAoY29uZmlnLmRlcGVuZGluZy5ibGl0eikge1xuICAgIGlmICghanNvbk9iai5zY3JpcHRzWydnZW4tY29kZSddPy5zdGFydHNXaXRoKCdibGl0eiBjb2RlZ2VuJykpIHtcbiAgICAgIGpzb25PYmouc2NyaXB0c1snZ2VuLWNvZGUnXSA9ICdibGl0eiBjb2RlZ2VuJztcbiAgICB9IGVsc2UgaWYgKCFqc29uT2JqLnNjcmlwdHNbJ2dlbi1jb2RlJ10uaW5jbHVkZXMoJ2JsaXR6IHByaXNtYSBnZW5lcmF0ZScpKSB7XG4gICAgICBqc29uT2JqLnNjcmlwdHNbJ2dlbi1jb2RlJ10gPSBqc29uT2JqLnNjcmlwdHNbJ2dlbi1jb2RlJ10ucmVwbGFjZShcbiAgICAgICAgJ2JsaXR6IGNvZGVnZW4nLFxuICAgICAgICAnYmxpdHogY29kZWdlbiAmJiBibGl0eiBwcmlzbWEgZ2VuZXJhdGUnXG4gICAgICApO1xuICAgIH1cbiAgfSBlbHNlIGlmIChjb25maWcuZGVwZW5kaW5nLnByaXNtYSAmJiAhanNvbk9iai5zY3JpcHRzWydnZW4tY29kZSddPy5zdGFydHNXaXRoKCdwcmlzbWEgZ2VuZXJhdGUnKSkge1xuICAgIGpzb25PYmouc2NyaXB0c1snZ2VuLWNvZGUnXSA9ICdwcmlzbWEgZ2VuZXJhdGUnO1xuICB9XG5cbiAgaWYgKCFqc29uT2JqLmRlcGVuZGVuY2llcy5wcmV0dGllcikge1xuICAgIC8vIEJlY2F1c2UgQHR5cGVzL3ByZXR0aWVyIGJsb2NrcyBwcmV0dGllciBleGVjdXRpb24uXG4gICAgZGVsZXRlIGpzb25PYmouZGV2RGVwZW5kZW5jaWVzWydAdHlwZXMvcHJldHRpZXInXTtcbiAgfVxuXG4gIGlmIChPYmplY3Qua2V5cyhqc29uT2JqLmRlcGVuZGVuY2llcykubGVuZ3RoID09PSAwKSB7XG4gICAgZGVsZXRlIGpzb25PYmouZGVwZW5kZW5jaWVzO1xuICB9XG4gIGlmIChPYmplY3Qua2V5cyhqc29uT2JqLmRldkRlcGVuZGVuY2llcykubGVuZ3RoID09PSAwKSB7XG4gICAgZGVsZXRlIGpzb25PYmouZGV2RGVwZW5kZW5jaWVzO1xuICB9XG4gIGlmIChPYmplY3Qua2V5cyhqc29uT2JqLnBlZXJEZXBlbmRlbmNpZXMpLmxlbmd0aCA9PT0gMCkge1xuICAgIGRlbGV0ZSBqc29uT2JqLnBlZXJEZXBlbmRlbmNpZXM7XG4gIH1cblxuICBhd2FpdCB1cGRhdGVQcml2YXRlUGFja2FnZXMoanNvbk9iaik7XG5cbiAgaWYgKGNvbmZpZy5pc0J1bikgZGVsZXRlIGpzb25PYmoucGFja2FnZU1hbmFnZXI7XG4gIGxldCBuZXdKc29uVGV4dCA9IEpTT04uc3RyaW5naWZ5KGpzb25PYmopO1xuICBuZXdKc29uVGV4dCA9IGF3YWl0IGZpeFNjcmlwdE5hbWVzKGpzb25PYmouc2NyaXB0cywgbmV3SnNvblRleHQsIGNvbmZpZyk7XG4gIGF3YWl0IGZzLnByb21pc2VzLndyaXRlRmlsZShmaWxlUGF0aCwgbmV3SnNvblRleHQpO1xuXG4gIGlmICghc2tpcEFkZGluZ0RlcHMpIHtcbiAgICAvLyBXZSBjYW5ub3QgYWRkIGRlcGVuZGVuY2llcyB3aGljaCBhcmUgYWxyZWFkeSBpbmNsdWRlZCBpbiBkZXZEZXBlbmRlbmNpZXMuXG4gICAgZGVwZW5kZW5jaWVzID0gZGVwZW5kZW5jaWVzLmZpbHRlcigoZGVwKSA9PiAhanNvbk9iai5kZXZEZXBlbmRlbmNpZXM/LltkZXBdKTtcbiAgICBpZiAoZGVwZW5kZW5jaWVzLmxlbmd0aCA+IDApIHtcbiAgICAgIGlmIChjb25maWcuaXNCdW4pIHtcbiAgICAgICAgc3Bhd25TeW5jKHBhY2thZ2VNYW5hZ2VyLCBbJ3JlbW92ZScsIC4uLm5ldyBTZXQoZGVwZW5kZW5jaWVzKV0sIGNvbmZpZy5kaXJQYXRoKTtcbiAgICAgICAgc3Bhd25TeW5jKHBhY2thZ2VNYW5hZ2VyLCBbJ2FkZCcsICctLWV4YWN0JywgLi4ubmV3IFNldChkZXBlbmRlbmNpZXMpXSwgY29uZmlnLmRpclBhdGgpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc3Bhd25TeW5jKHBhY2thZ2VNYW5hZ2VyLCBbJ2FkZCcsIC4uLm5ldyBTZXQoZGVwZW5kZW5jaWVzKV0sIGNvbmZpZy5kaXJQYXRoKTtcbiAgICAgIH1cbiAgICB9XG4gICAgLy8gV2UgY2Fubm90IGFkZCBkZXZEZXBlbmRlbmNpZXMgd2hpY2ggYXJlIGFscmVhZHkgaW5jbHVkZWQgaW4gZGVwZW5kZW5jaWVzLlxuICAgIGRldkRlcGVuZGVuY2llcyA9IGRldkRlcGVuZGVuY2llcy5maWx0ZXIoKGRlcCkgPT4gIWpzb25PYmouZGVwZW5kZW5jaWVzPy5bZGVwXSk7XG4gICAgaWYgKGRldkRlcGVuZGVuY2llcy5sZW5ndGggPiAwKSB7XG4gICAgICBpZiAoY29uZmlnLmlzQnVuKSB7XG4gICAgICAgIHNwYXduU3luYyhwYWNrYWdlTWFuYWdlciwgWydyZW1vdmUnLCAuLi5uZXcgU2V0KGRldkRlcGVuZGVuY2llcyldLCBjb25maWcuZGlyUGF0aCk7XG4gICAgICAgIHNwYXduU3luYyhwYWNrYWdlTWFuYWdlciwgWydhZGQnLCAnLUQnLCAnLS1leGFjdCcsIC4uLm5ldyBTZXQoZGV2RGVwZW5kZW5jaWVzKV0sIGNvbmZpZy5kaXJQYXRoKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHNwYXduU3luYyhwYWNrYWdlTWFuYWdlciwgWydhZGQnLCAnLUQnLCAuLi5uZXcgU2V0KGRldkRlcGVuZGVuY2llcyldLCBjb25maWcuZGlyUGF0aCk7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChwb2V0cnlEZXZEZXBlbmRlbmNpZXMubGVuZ3RoID4gMCkge1xuICAgICAgc3Bhd25TeW5jKCdwb2V0cnknLCBbJ2FkZCcsICctLWdyb3VwJywgJ2RldicsIC4uLm5ldyBTZXQocG9ldHJ5RGV2RGVwZW5kZW5jaWVzKV0sIGNvbmZpZy5kaXJQYXRoKTtcbiAgICB9XG4gIH1cbn1cblxuLy8gVE9ETzogcmVtb3ZlIHRoZSBmb2xsb3dpbmcgbWlncmF0aW9uIGNvZGUgaW4gZnV0dXJlXG5hc3luYyBmdW5jdGlvbiByZW1vdmVEZXByZWNhdGVkU3R1ZmYoXG4gIGpzb25PYmo6IFNldFJlcXVpcmVkPFBhY2thZ2VKc29uLCAnc2NyaXB0cycgfCAnZGVwZW5kZW5jaWVzJyB8ICdkZXZEZXBlbmRlbmNpZXMnPlxuKTogUHJvbWlzZTx2b2lkPiB7XG4gIGlmIChqc29uT2JqLmF1dGhvciA9PT0gJ1dpbGxCb29zdGVyIExMQycpIHtcbiAgICBqc29uT2JqLmF1dGhvciA9ICdXaWxsQm9vc3RlciBJbmMuJztcbiAgfVxuICBkZWxldGUganNvbk9iai5zY3JpcHRzWydzb3J0LXBhY2thZ2UtanNvbiddO1xuICBkZWxldGUganNvbk9iai5zY3JpcHRzWydzb3J0LWFsbC1wYWNrYWdlLWpzb24nXTtcbiAgZGVsZXRlIGpzb25PYmouc2NyaXB0c1sndHlwZWNoZWNrL3dhcm4nXTtcbiAgZGVsZXRlIGpzb25PYmouc2NyaXB0c1sndHlwZWNoZWNrOmdlbi1jb2RlJ107XG4gIGRlbGV0ZSBqc29uT2JqLnNjcmlwdHNbJ3R5cGVjaGVjazpjb2RlZ2VuJ107XG4gIGRlbGV0ZSBqc29uT2JqLmRlcGVuZGVuY2llcy50c2xpYjtcbiAgZGVsZXRlIGpzb25PYmouZGV2RGVwZW5kZW5jaWVzWydAd2lsbGJvb3N0ZXIvZXNsaW50LWNvbmZpZyddO1xuICBkZWxldGUganNvbk9iai5kZXZEZXBlbmRlbmNpZXNbJ0B3aWxsYm9vc3Rlci9lc2xpbnQtY29uZmlnLXJlYWN0J107XG4gIGRlbGV0ZSBqc29uT2JqLmRldkRlcGVuZGVuY2llc1snQHdpbGxib29zdGVyL3Jlbm92YXRlLWNvbmZpZyddO1xuICBkZWxldGUganNvbk9iai5kZXZEZXBlbmRlbmNpZXNbJ0B3aWxsYm9vc3Rlci90c2NvbmZpZyddO1xuICBkZWxldGUganNvbk9iai5kZXZEZXBlbmRlbmNpZXNbJ2VzbGludC1pbXBvcnQtcmVzb2x2ZXItbm9kZSddO1xuICBkZWxldGUganNvbk9iai5kZXZEZXBlbmRlbmNpZXNbJ2VzbGludC1wbHVnaW4tcHJldHRpZXInXTtcbiAgZGVsZXRlIGpzb25PYmouZGV2RGVwZW5kZW5jaWVzLmxlcm5hO1xuICAvLyBUbyBpbnN0YWxsIHRoZSBsYXRlc3QgcGluc3RcbiAgZGVsZXRlIGpzb25PYmouZGV2RGVwZW5kZW5jaWVzLnBpbnN0O1xuICBkZWxldGUganNvbk9iai5zY3JpcHRzWydmbHV0dGVyLWZvcm1hdCddO1xuICBkZWxldGUganNvbk9iai5zY3JpcHRzWydmb3JtYXQtZmx1dHRlciddO1xuICBkZWxldGUganNvbk9iai5zY3JpcHRzWydweXRob24tZm9ybWF0J107XG4gIGRlbGV0ZSBqc29uT2JqLnNjcmlwdHNbJ2Zvcm1hdC1weXRob24nXTtcbiAgZGVsZXRlIGpzb25PYmouc2NyaXB0cy5wcmV0dGllcjtcbiAgZGVsZXRlIGpzb25PYmouc2NyaXB0c1snY2hlY2stYWxsJ107XG4gIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiBmcy5wcm9taXNlcy5ybSgnbGVybmEuanNvbicsIHsgZm9yY2U6IHRydWUgfSkpO1xuXG4gIC8vIE1pZ3JhdGUgZnJvbSBFU0xpbnQgbGVnYWN5IGNvbmZpZ3MgdG8gZmxhdCBjb25maWdzLFxuICBkZWxldGUganNvbk9iai5kZXZEZXBlbmRlbmNpZXNbJ0B0eXBlc2NyaXB0LWVzbGludC9lc2xpbnQtcGx1Z2luJ107XG4gIGRlbGV0ZSBqc29uT2JqLmRldkRlcGVuZGVuY2llc1snQHR5cGVzY3JpcHQtZXNsaW50L3BhcnNlciddO1xuICBkZWxldGUganNvbk9iai5kZXZEZXBlbmRlbmNpZXNbJ2VzbGludC1wbHVnaW4taW1wb3J0J107XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZW5lcmF0ZVNjcmlwdHMoY29uZmlnOiBQYWNrYWdlQ29uZmlnLCBvbGRTY3JpcHRzOiBQYWNrYWdlSnNvbi5TY3JpcHRzKTogUmVjb3JkPHN0cmluZywgc3RyaW5nPiB7XG4gIGlmIChjb25maWcuaXNCdW4pIHtcbiAgICBjb25zdCBoYXNUeXBlY2hlY2sgPSBjb25maWcuZG9lc0NvbnRhaW5UeXBlU2NyaXB0IHx8IGNvbmZpZy5kb2VzQ29udGFpblR5cGVTY3JpcHRJblBhY2thZ2VzO1xuICAgIGNvbnN0IHNjcmlwdHM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7XG4gICAgICAnY2hlY2stYWxsLWZvci1haSc6ICdidW4gcnVuIGNoZWNrLWZvci1haSAmJiBidW4gcnVuIHRlc3QgLS1zaWxlbnQnLFxuICAgICAgJ2NoZWNrLWZvci1haSc6IGBidW4gcnVuIGNsZWFudXAke2hhc1R5cGVjaGVjayA/ICcgJiYgYnVuIHJ1biB0eXBlY2hlY2snIDogJyd9YCxcbiAgICAgIGNsZWFudXA6ICdidW4gLS1idW4gd2IgbGludCAtLWZpeCAtLWZvcm1hdCcsXG4gICAgICBmb3JtYXQ6IGBidW4gLS1idW4gd2IgbGludCAtLWZvcm1hdGAsXG4gICAgICBsaW50OiBgYnVuIC0tYnVuIHdiIGxpbnRgLFxuICAgICAgJ2xpbnQtZml4JzogJ2J1biAtLWJ1biB3YiBsaW50IC0tZml4JyxcbiAgICAgIHRlc3Q6ICdidW4gd2IgdGVzdCcsXG4gICAgICB0eXBlY2hlY2s6ICdidW4gLS1idW4gd2IgdHlwZWNoZWNrJyxcbiAgICB9O1xuICAgIGlmICghaGFzVHlwZWNoZWNrKSB7XG4gICAgICBkZWxldGUgc2NyaXB0cy50eXBlY2hlY2s7XG4gICAgfVxuICAgIHJldHVybiBzY3JpcHRzO1xuICB9IGVsc2Uge1xuICAgIGNvbnN0IGhhc1R5cGVjaGVjayA9IGNvbmZpZy5kb2VzQ29udGFpblR5cGVTY3JpcHQgfHwgY29uZmlnLmRvZXNDb250YWluVHlwZVNjcmlwdEluUGFja2FnZXM7XG4gICAgY29uc3Qgb2xkVGVzdCA9IG9sZFNjcmlwdHMudGVzdDtcbiAgICBsZXQgc2NyaXB0czogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHtcbiAgICAgICdjaGVjay1hbGwtZm9yLWFpJzogJ3lhcm4gY2hlY2stZm9yLWFpICYmIHlhcm4gdGVzdCcsXG4gICAgICAnY2hlY2stZm9yLWFpJzogYHlhcm4gZm9ybWF0ID4gL2Rldi9udWxsIDI+IC9kZXYvbnVsbCB8fCB0cnVlICYmIHlhcm4gbGludC1maXggLS1xdWlldCR7XG4gICAgICAgIGhhc1R5cGVjaGVjayA/ICcgJiYgeWFybiB0eXBlY2hlY2snIDogJydcbiAgICAgIH1gLFxuICAgICAgY2xlYW51cDogJ3lhcm4gZm9ybWF0ICYmIHlhcm4gbGludC1maXgnLFxuICAgICAgZm9ybWF0OiBgc29ydC1wYWNrYWdlLWpzb24gJiYgeWFybiBwcmV0dGlmeWAsXG4gICAgICBsaW50OiBgZXNsaW50IC0tY29sb3JgLFxuICAgICAgJ2xpbnQtZml4JzogJ3lhcm4gbGludCAtLWZpeCcsXG4gICAgICBwcmV0dGlmeTogYHByZXR0aWVyIC0tY2FjaGUgLS1jb2xvciAtLXdyaXRlIFwiKiovey4qLyx9Ki57JHtleHRlbnNpb25zLnByZXR0aWVyLmpvaW4oJywnKX19XCIgXCIhKiovdGVzdHstLC99Zml4dHVyZXMvKipcImAsXG4gICAgICB0eXBlY2hlY2s6ICd0c2MgLS1ub0VtaXQgLS1QcmV0dHknLFxuICAgIH07XG4gICAgaWYgKGNvbmZpZy5kb2VzQ29udGFpblN1YlBhY2thZ2VKc29ucykge1xuICAgICAgc2NyaXB0cyA9IG1lcmdlKFxuICAgICAgICB7IC4uLnNjcmlwdHMgfSxcbiAgICAgICAge1xuICAgICAgICAgIGZvcm1hdDogYHNvcnQtcGFja2FnZS1qc29uICYmIHlhcm4gcHJldHRpZnkgJiYgeWFybiB3b3Jrc3BhY2VzIGZvcmVhY2ggLS1hbGwgLS1wYXJhbGxlbCAtLXZlcmJvc2UgcnVuIGZvcm1hdGAsXG4gICAgICAgICAgbGludDogYHlhcm4gd29ya3NwYWNlcyBmb3JlYWNoIC0tYWxsIC0tcGFyYWxsZWwgLS12ZXJib3NlIHJ1biBsaW50YCxcbiAgICAgICAgICAnbGludC1maXgnOiAneWFybiB3b3Jrc3BhY2VzIGZvcmVhY2ggLS1hbGwgLS1wYXJhbGxlbCAtLXZlcmJvc2UgcnVuIGxpbnQtZml4JyxcbiAgICAgICAgICBwcmV0dGlmeTogYHByZXR0aWVyIC0tY2FjaGUgLS1jb2xvciAtLXdyaXRlIFwiKiovey4qLyx9Ki57JHtleHRlbnNpb25zLnByZXR0aWVyLmpvaW4oXG4gICAgICAgICAgICAnLCdcbiAgICAgICAgICApfX1cIiBcIiEqKi9wYWNrYWdlcy8qKlwiIFwiISoqL3Rlc3R7LSwvfWZpeHR1cmVzLyoqXCJgLFxuICAgICAgICAgIC8vIENJPTEgcHJldmVudHMgdml0ZXN0IGZyb20gZW5hYmxpbmcgd2F0Y2guXG4gICAgICAgICAgLy8gRk9SQ0VfQ09MT1I9MyBtYWtlIHdiIGVuYWJsZSBjb2xvciBvdXRwdXQuXG4gICAgICAgICAgdGVzdDogJ0NJPTEgRk9SQ0VfQ09MT1I9MyB5YXJuIHdvcmtzcGFjZXMgZm9yZWFjaCAtLWFsbCAtLXZlcmJvc2UgcnVuIHRlc3QnLFxuICAgICAgICAgIHR5cGVjaGVjazogJ3lhcm4gd29ya3NwYWNlcyBmb3JlYWNoIC0tYWxsIC0tcGFyYWxsZWwgLS12ZXJib3NlIHJ1biB0eXBlY2hlY2snLFxuICAgICAgICB9XG4gICAgICApO1xuICAgIH0gZWxzZSBpZiAoY29uZmlnLmRlcGVuZGluZy5weXJpZ2h0KSB7XG4gICAgICBzY3JpcHRzLnR5cGVjaGVjayA9IHNjcmlwdHMudHlwZWNoZWNrID8gYCR7c2NyaXB0cy50eXBlY2hlY2t9ICYmIGAgOiAnJztcbiAgICAgIHNjcmlwdHMudHlwZWNoZWNrICs9ICdweXJpZ2h0JztcbiAgICB9XG4gICAgaWYgKG9sZFRlc3Q/LmluY2x1ZGVzKCd3YiB0ZXN0JykpIHtcbiAgICAgIHNjcmlwdHMudGVzdCA9IG9sZFRlc3Q7XG4gICAgICAvLyBgd2JgIHN1cHBvcnRzIGAtLXNpbGVudGAgb3B0aW9uXG4gICAgICBzY3JpcHRzWydjaGVjay1hbGwtZm9yLWFpJ10gPSAoc2NyaXB0c1snY2hlY2stYWxsLWZvci1haSddID8/ICcnKSArICcgLS1zaWxlbnQnO1xuICAgIH1cblxuICAgIGlmICghaGFzVHlwZWNoZWNrKSB7XG4gICAgICBkZWxldGUgc2NyaXB0cy50eXBlY2hlY2s7XG4gICAgfSBlbHNlIGlmIChjb25maWcuZGVwZW5kaW5nLndiKSB7XG4gICAgICBzY3JpcHRzLnR5cGVjaGVjayA9ICd3YiB0eXBlY2hlY2snO1xuICAgIH1cbiAgICByZXR1cm4gc2NyaXB0cztcbiAgfVxufVxuXG5hc3luYyBmdW5jdGlvbiBnZW5lcmF0ZVByZXR0aWVyU3VmZml4KGRpclBhdGg6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nPiB7XG4gIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKGRpclBhdGgsICcucHJldHRpZXJpZ25vcmUnKTtcbiAgY29uc3QgZXhpc3RpbmdDb250ZW50ID0gYXdhaXQgZnMucHJvbWlzZXMucmVhZEZpbGUoZmlsZVBhdGgsICd1dGY4Jyk7XG4gIGNvbnN0IGluZGV4ID0gZXhpc3RpbmdDb250ZW50LmluZGV4T2YoaWdub3JlRmlsZVV0aWwuc2VwYXJhdG9yUHJlZml4KTtcbiAgaWYgKGluZGV4ID09PSAtMSkgcmV0dXJuICcnO1xuXG4gIGNvbnN0IG9yaWdpbmFsQ29udGVudCA9IGV4aXN0aW5nQ29udGVudC5zbGljZSgwLCBpbmRleCk7XG4gIGNvbnN0IGxpbmVzID0gb3JpZ2luYWxDb250ZW50XG4gICAgLnNwbGl0KCdcXG4nKVxuICAgIC5tYXAoKGxpbmUpID0+IHtcbiAgICAgIGNvbnN0IG5ld0xpbmUgPSBsaW5lLnRyaW0oKTtcbiAgICAgIHJldHVybiBuZXdMaW5lLmVuZHNXaXRoKCcvJykgPyBuZXdMaW5lLnNsaWNlKDAsIC0xKSA6IG5ld0xpbmU7XG4gICAgfSlcbiAgICAuZmlsdGVyKChsKSA9PiBsICYmICFsLnN0YXJ0c1dpdGgoJyMnKSAmJiAhbC5pbmNsdWRlcygnLycpKTtcblxuICByZXR1cm4gYCR7bGluZXMubWFwKChsaW5lKSA9PiBgIFwiISoqLyR7bGluZX0vKipcImApLmpvaW4oJycpfSB8fCB0cnVlYDtcbn1cblxuYXN5bmMgZnVuY3Rpb24gZml4U2NyaXB0TmFtZXMoXG4gIHNjcmlwdHM6IFBhY2thZ2VKc29uLlNjcmlwdHMsXG4gIG5ld0pzb25UZXh0OiBzdHJpbmcsXG4gIGNvbmZpZzogUGFja2FnZUNvbmZpZ1xuKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgY29uc3Qgb2xkQW5kTmV3U2NyaXB0TmFtZXM6IFtzdHJpbmcsIHN0cmluZ11bXSA9IFtdO1xuICBmb3IgKGNvbnN0IFtrZXldIG9mIE9iamVjdC5rZXlzKHNjcmlwdHMpKSB7XG4gICAgaWYgKGtleSAmJiAha2V5LnN0YXJ0c1dpdGgoJzonKSAmJiBrZXkuaW5jbHVkZXMoJzonKSkge1xuICAgICAgb2xkQW5kTmV3U2NyaXB0TmFtZXMucHVzaChba2V5LCBrZXkucmVwbGFjZUFsbCgnOicsICctJyldKTtcbiAgICB9XG4gIH1cbiAgaWYgKG9sZEFuZE5ld1NjcmlwdE5hbWVzLmxlbmd0aCA9PT0gMCkgcmV0dXJuIG5ld0pzb25UZXh0O1xuXG4gIGZvciAoY29uc3QgW29sZE5hbWUsIG5ld05hbWVdIG9mIG9sZEFuZE5ld1NjcmlwdE5hbWVzKSB7XG4gICAgbmV3SnNvblRleHQgPSBuZXdKc29uVGV4dC5yZXBsYWNlQWxsKG9sZE5hbWUsIG5ld05hbWUpO1xuICB9XG4gIGNvbnN0IGZpbGVzID0gYXdhaXQgZmcuZ2xvYihbJyoqLyoue21kLGNqcyxtanMsanMsanN4LGN0cyxtdHMsdHMsdHN4fScsICcqKi9Eb2NrZXJmaWxlJ10sIHtcbiAgICBjd2Q6IGNvbmZpZy5kaXJQYXRoLFxuICAgIGRvdDogdHJ1ZSxcbiAgICBpZ25vcmU6IGdsb2JJZ25vcmUsXG4gIH0pO1xuICBmb3IgKGNvbnN0IGZpbGUgb2YgZmlsZXMpIHtcbiAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLmpvaW4oY29uZmlnLmRpclBhdGgsIGZpbGUpO1xuICAgICAgY29uc3Qgb2xkQ29udGVudCA9IGF3YWl0IGZzLnByb21pc2VzLnJlYWRGaWxlKGZpbGVQYXRoLCAndXRmOCcpO1xuICAgICAgbGV0IG5ld0NvbnRlbnQgPSBvbGRDb250ZW50O1xuICAgICAgZm9yIChjb25zdCBbb2xkTmFtZSwgbmV3TmFtZV0gb2Ygb2xkQW5kTmV3U2NyaXB0TmFtZXMpIHtcbiAgICAgICAgbmV3Q29udGVudCA9IG5ld0NvbnRlbnQucmVwbGFjZUFsbChvbGROYW1lLCBuZXdOYW1lKTtcbiAgICAgIH1cbiAgICAgIGlmIChuZXdDb250ZW50ICE9PSBvbGRDb250ZW50KSB7XG4gICAgICAgIGF3YWl0IGZzLnByb21pc2VzLndyaXRlRmlsZShmaWxlUGF0aCwgbmV3Q29udGVudCk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cbiAgYXdhaXQgcHJvbWlzZVBvb2wucHJvbWlzZUFsbCgpO1xuICByZXR1cm4gbmV3SnNvblRleHQ7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHVwZGF0ZVByaXZhdGVQYWNrYWdlcyhqc29uT2JqOiBQYWNrYWdlSnNvbik6IFByb21pc2U8dm9pZD4ge1xuICBqc29uT2JqLmRlcGVuZGVuY2llcyA9IGpzb25PYmouZGVwZW5kZW5jaWVzID8/IHt9O1xuICBqc29uT2JqLmRldkRlcGVuZGVuY2llcyA9IGpzb25PYmouZGV2RGVwZW5kZW5jaWVzID8/IHt9O1xuICBjb25zdCBwYWNrYWdlTmFtZXMgPSBuZXcgU2V0KFsuLi5PYmplY3Qua2V5cyhqc29uT2JqLmRlcGVuZGVuY2llcyksIC4uLk9iamVjdC5rZXlzKGpzb25PYmouZGV2RGVwZW5kZW5jaWVzKV0pO1xuICBpZiAocGFja2FnZU5hbWVzLmhhcygnQHdpbGxib29zdGVyL2F1dGgnKSAmJiAhaXNXb3Jrc3BhY2VQYWNrYWdlKGpzb25PYmosICdAd2lsbGJvb3N0ZXIvYXV0aCcpKSB7XG4gICAgZGVsZXRlIGpzb25PYmouZGV2RGVwZW5kZW5jaWVzWydAd2lsbGJvb3N0ZXIvYXV0aCddO1xuICAgIGNvbnN0IGNvbW1pdEhhc2ggPSBhd2FpdCBnZXRMYXRlc3RDb21taXRIYXNoKCdXaWxsQm9vc3RlckxhYicsICdhdXRoJyk7XG4gICAganNvbk9iai5kZXBlbmRlbmNpZXNbJ0B3aWxsYm9vc3Rlci9hdXRoJ10gPSBgZ2l0QGdpdGh1Yi5jb206V2lsbEJvb3N0ZXJMYWIvYXV0aC5naXQjJHtjb21taXRIYXNofWA7XG4gIH1cbiAgaWYgKHBhY2thZ2VOYW1lcy5oYXMoJ0BkaXNjb3JkLWJvdC9zaGFyZWQnKSAmJiAhaXNXb3Jrc3BhY2VQYWNrYWdlKGpzb25PYmosICdAZGlzY29yZC1ib3Qvc2hhcmVkJykpIHtcbiAgICBkZWxldGUganNvbk9iai5kZXZEZXBlbmRlbmNpZXNbJ0BkaXNjb3JkLWJvdC9zaGFyZWQnXTtcbiAgICBjb25zdCBjb21taXRIYXNoID0gYXdhaXQgZ2V0TGF0ZXN0Q29tbWl0SGFzaCgnV2lsbEJvb3N0ZXJMYWInLCAnZGlzY29yZC1ib3QnKTtcbiAgICBqc29uT2JqLmRlcGVuZGVuY2llc1snQGRpc2NvcmQtYm90L3NoYXJlZCddID0gYGdpdEBnaXRodWIuY29tOldpbGxCb29zdGVyTGFiL2Rpc2NvcmQtYm90LmdpdCMke2NvbW1pdEhhc2h9YDtcbiAgfVxuXG4gIGlmIChwYWNrYWdlTmFtZXMuaGFzKCdAd2lsbGJvb3N0ZXIvY29kZS1hbmFseXplcicpICYmICFpc1dvcmtzcGFjZVBhY2thZ2UoanNvbk9iaiwgJ0B3aWxsYm9vc3Rlci9jb2RlLWFuYWx5emVyJykpIHtcbiAgICBkZWxldGUganNvbk9iai5kZXBlbmRlbmNpZXNbJ0B3aWxsYm9vc3Rlci9jb2RlLWFuYWx5emVyJ107XG4gICAgY29uc3QgY29tbWl0SGFzaCA9IGF3YWl0IGdldExhdGVzdENvbW1pdEhhc2goJ1dpbGxCb29zdGVyTGFiJywgJ2NvZGUtYW5hbHl6ZXInKTtcbiAgICBqc29uT2JqLmRldkRlcGVuZGVuY2llc1snQHdpbGxib29zdGVyL2NvZGUtYW5hbHl6ZXInXSA9XG4gICAgICBgZ2l0QGdpdGh1Yi5jb206V2lsbEJvb3N0ZXJMYWIvY29kZS1hbmFseXplci5naXQjJHtjb21taXRIYXNofWA7XG4gIH1cbiAgaWYgKHBhY2thZ2VOYW1lcy5oYXMoJ0B3aWxsYm9vc3Rlci9qdWRnZScpICYmICFpc1dvcmtzcGFjZVBhY2thZ2UoanNvbk9iaiwgJ0B3aWxsYm9vc3Rlci9qdWRnZScpKSB7XG4gICAgZGVsZXRlIGpzb25PYmouZGV2RGVwZW5kZW5jaWVzWydAd2lsbGJvb3N0ZXIvanVkZ2UnXTtcbiAgICBjb25zdCBjb21taXRIYXNoID0gYXdhaXQgZ2V0TGF0ZXN0Q29tbWl0SGFzaCgnV2lsbEJvb3N0ZXJMYWInLCAnanVkZ2UnKTtcbiAgICBqc29uT2JqLmRlcGVuZGVuY2llc1snQHdpbGxib29zdGVyL2p1ZGdlJ10gPSBgZ2l0QGdpdGh1Yi5jb206V2lsbEJvb3N0ZXJMYWIvanVkZ2UuZ2l0IyR7Y29tbWl0SGFzaH1gO1xuICB9XG4gIGlmIChwYWNrYWdlTmFtZXMuaGFzKCdAd2lsbGJvb3N0ZXIvbGxtLXByb3h5JykgJiYgIWlzV29ya3NwYWNlUGFja2FnZShqc29uT2JqLCAnQHdpbGxib29zdGVyL2xsbS1wcm94eScpKSB7XG4gICAgZGVsZXRlIGpzb25PYmouZGV2RGVwZW5kZW5jaWVzWydAd2lsbGJvb3N0ZXIvbGxtLXByb3h5J107XG4gICAgY29uc3QgY29tbWl0SGFzaCA9IGF3YWl0IGdldExhdGVzdENvbW1pdEhhc2goJ1dpbGxCb29zdGVyTGFiJywgJ2xsbS1wcm94eScpO1xuICAgIGpzb25PYmouZGVwZW5kZW5jaWVzWydAd2lsbGJvb3N0ZXIvbGxtLXByb3h5J10gPSBgZ2l0QGdpdGh1Yi5jb206V2lsbEJvb3N0ZXJMYWIvbGxtLXByb3h5LmdpdCMke2NvbW1pdEhhc2h9YDtcbiAgfVxufVxuXG5mdW5jdGlvbiBpc1dvcmtzcGFjZVBhY2thZ2UoanNvbk9iajogUGFja2FnZUpzb24sIHBhY2thZ2VOYW1lOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgcmV0dXJuIChqc29uT2JqLmRldkRlcGVuZGVuY2llcz8uW3BhY2thZ2VOYW1lXSB8fCBqc29uT2JqLmRlcGVuZGVuY2llcz8uW3BhY2thZ2VOYW1lXSB8fCAnJykuaW5jbHVkZXMoJ3dvcmtzcGFjZScpO1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHR5cGUgeyBQYWNrYWdlSnNvbiB9IGZyb20gJ3R5cGUtZmVzdCc7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuaW1wb3J0IHsgc3Bhd25TeW5jIH0gZnJvbSAnLi4vdXRpbHMvc3Bhd25VdGlsLmpzJztcblxuaW1wb3J0IHsgZ2VuZXJhdGVTY3JpcHRzIH0gZnJvbSAnLi9wYWNrYWdlSnNvbi5qcyc7XG5cbmNvbnN0IHNjcmlwdHMgPSB7XG4gIHByZUNvbW1pdDogJ25vZGUgbm9kZV9tb2R1bGVzLy5iaW4vbGludC1zdGFnZWQnLFxuICBwcmVQdXNoOiBgeWFybiB0eXBlY2hlY2tgLFxuICBwcmVQdXNoRm9yTGFiOiBgXG5pZiBbICQoZ2l0IGJyYW5jaCAtLXNob3ctY3VycmVudCkgPSBcIm1haW5cIiBdOyB0aGVuXG4gIGVjaG8gXCIqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcIlxuICBlY2hvIFwiKioqIERvbid0IHB1c2ggbWFpbiBicmFuY2ggZGlyZWN0bHkuIFVzZSBQUiEgKioqXCJcbiAgZWNobyBcIioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlwiXG4gIGV4aXQgMVxuZmlcblxueWFybiB0eXBlY2hlY2tcbmAudHJpbSgpLFxuICBwcmVQdXNoRm9yTGFiRXhjZXB0QWRtaW46IGBcbmlmIFsgJChnaXQgYnJhbmNoIC0tc2hvdy1jdXJyZW50KSA9IFwibWFpblwiIF0gJiYgWyAkKGdpdCBjb25maWcgdXNlci5lbWFpbCkgIT0gXCJleGthenV1QGdtYWlsLmNvbVwiIF07IHRoZW5cbiAgZWNobyBcIioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlwiXG4gIGVjaG8gXCIqKiogRG9uJ3QgcHVzaCBtYWluIGJyYW5jaCBkaXJlY3RseS4gVXNlIFBSISAqKipcIlxuICBlY2hvIFwiKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXCJcbiAgZXhpdCAxXG5maVxuXG55YXJuIHR5cGVjaGVja1xuYC50cmltKCksXG4gIHBvc3RNZXJnZTogYFxuY2hhbmdlZF9maWxlcz1cIiQoZ2l0IGRpZmYtdHJlZSAtciAtLW5hbWUtb25seSAtLW5vLWNvbW1pdC1pZCBPUklHX0hFQUQgSEVBRClcIlxuXG5ydW5faWZfY2hhbmdlZCgpIHtcbiAgaWYgZWNobyBcIiRjaGFuZ2VkX2ZpbGVzXCIgfCBncmVwIC0tcXVpZXQgLUUgXCIkMVwiOyB0aGVuXG4gICAgZXZhbCBcIiQyXCJcbiAgZmlcbn1cbmAudHJpbSgpLFxufTtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlSHVza3lyY1VwZGF0aW5nUGFja2FnZUpzb24oY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZ2VuZXJhdGVIdXNreXJjVXBkYXRpbmdQYWNrYWdlSnNvbicsIGFzeW5jICgpID0+IHtcbiAgICBhd2FpdCBjb3JlKGNvbmZpZyk7XG4gIH0pO1xufVxuXG5hc3luYyBmdW5jdGlvbiBjb3JlKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBwYWNrYWdlSnNvblBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICdwYWNrYWdlLmpzb24nKTtcbiAgY29uc3QganNvblRleHQgPSBhd2FpdCBmcy5wcm9taXNlcy5yZWFkRmlsZShwYWNrYWdlSnNvblBhdGgsICd1dGY4Jyk7XG4gIGNvbnN0IHBhY2thZ2VKc29uID0gSlNPTi5wYXJzZShqc29uVGV4dCkgYXMgUGFja2FnZUpzb247XG4gIHBhY2thZ2VKc29uLnNjcmlwdHMgPz89IHt9O1xuICBkZWxldGUgcGFja2FnZUpzb24uc2NyaXB0cy5wb3N0aW5zdGFsbDtcbiAgZGVsZXRlIHBhY2thZ2VKc29uLnNjcmlwdHMucG9zdHB1Ymxpc2g7XG4gIGRlbGV0ZSBwYWNrYWdlSnNvbi5zY3JpcHRzLnByZXBhcmU7XG4gIGRlbGV0ZSBwYWNrYWdlSnNvbi5zY3JpcHRzLnByZXB1Ymxpc2hPbmx5O1xuICBkZWxldGUgcGFja2FnZUpzb24uc2NyaXB0cy5wcmVwYWNrO1xuICBkZWxldGUgcGFja2FnZUpzb24uc2NyaXB0cy5wb3N0cGFjaztcblxuICBjb25zdCBkaXJQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnLmh1c2t5Jyk7XG4gIGF3YWl0IGZzLnByb21pc2VzLndyaXRlRmlsZShwYWNrYWdlSnNvblBhdGgsIEpTT04uc3RyaW5naWZ5KHBhY2thZ2VKc29uLCB1bmRlZmluZWQsIDIpKTtcbiAgaWYgKGNvbmZpZy5pc0J1bikge1xuICAgIGF3YWl0IGZzLnByb21pc2VzLnJtKGRpclBhdGgsIHsgZm9yY2U6IHRydWUsIHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgICBzcGF3blN5bmMoJ2dpdCcsIFsnY29uZmlnJywgJy0tdW5zZXQnLCAnY29yZS5ob29rc1BhdGgnXSwgY29uZmlnLmRpclBhdGgpO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIHNwYXduU3luYygneWFybicsIFsnZGx4JywgJ2h1c2t5JywgJ2luaXQnXSwgY29uZmlnLmRpclBhdGgpO1xuXG4gIGNvbnN0IHByZUNvbW1pdEZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKGRpclBhdGgsICdwcmUtY29tbWl0Jyk7XG5cbiAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzLnByb21pc2VzLnJtKHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJy5odXNreXJjLmpzb24nKSwgeyBmb3JjZTogdHJ1ZSB9KSk7XG4gIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiBmcy5wcm9taXNlcy53cml0ZUZpbGUocHJlQ29tbWl0RmlsZVBhdGgsIHNjcmlwdHMucHJlQ29tbWl0ICsgJ1xcbicpKTtcblxuICBjb25zdCB7IHR5cGVjaGVjayB9ID0gZ2VuZXJhdGVTY3JpcHRzKGNvbmZpZywge30pO1xuICBpZiAodHlwZWNoZWNrKSB7XG4gICAgbGV0IHByZVB1c2ggPSBjb25maWcucmVwb3NpdG9yeT8uc3RhcnRzV2l0aCgnZ2l0aHViOldpbGxCb29zdGVyTGFiLycpXG4gICAgICA/IGNvbmZpZy5yZXBvc2l0b3J5LnRvTG9jYWxlTG93ZXJDYXNlKCkuaW5jbHVkZXMoJ2V4ZXJjb2RlJylcbiAgICAgICAgPyBzY3JpcHRzLnByZVB1c2hGb3JMYWJcbiAgICAgICAgOiBzY3JpcHRzLnByZVB1c2hGb3JMYWJFeGNlcHRBZG1pblxuICAgICAgOiBzY3JpcHRzLnByZVB1c2g7XG4gICAgcHJlUHVzaCA9IHByZVB1c2gucmVwbGFjZShcbiAgICAgICd5YXJuIHR5cGVjaGVjaycsXG4gICAgICB0eXBlY2hlY2tcbiAgICAgICAgLnJlcGxhY2UoJ3RzYyAnLCAnbm9kZSBub2RlX21vZHVsZXMvLmJpbi90c2MgJylcbiAgICAgICAgLnJlcGxhY2UoJ3diICcsICdub2RlIG5vZGVfbW9kdWxlcy8uYmluL3diICcpXG4gICAgICAgIC8vIHB5cmlnaHQgaGFzIG5vIGFyZ3VtZW50c1xuICAgICAgICAucmVwbGFjZSgncHlyaWdodCcsICdub2RlIG5vZGVfbW9kdWxlcy8uYmluL3B5cmlnaHQnKVxuICAgICk7XG4gICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+XG4gICAgICBmcy5wcm9taXNlcy53cml0ZUZpbGUocGF0aC5yZXNvbHZlKGRpclBhdGgsICdwcmUtcHVzaCcpLCBwcmVQdXNoICsgJ1xcbicsIHtcbiAgICAgICAgbW9kZTogMG83NTUsXG4gICAgICB9KVxuICAgICk7XG4gIH1cbiAgY29uc3QgcG9zdE1lcmdlQ29tbWFuZCA9IGAke3NjcmlwdHMucG9zdE1lcmdlfVxcblxcbiR7Z2VuZXJhdGVQb3N0TWVyZ2VDb21tYW5kcyhjb25maWcpLmpvaW4oJ1xcbicpfVxcbmA7XG4gIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PlxuICAgIGZzLnByb21pc2VzLndyaXRlRmlsZShwYXRoLnJlc29sdmUoZGlyUGF0aCwgJ3Bvc3QtbWVyZ2UnKSwgcG9zdE1lcmdlQ29tbWFuZCwge1xuICAgICAgbW9kZTogMG83NTUsXG4gICAgfSlcbiAgKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdlbmVyYXRlUG9zdE1lcmdlQ29tbWFuZHMoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogc3RyaW5nW10ge1xuICBjb25zdCBwb3N0TWVyZ2VDb21tYW5kczogc3RyaW5nW10gPSBbXTtcbiAgaWYgKGNvbmZpZy52ZXJzaW9uc1RleHQpIHtcbiAgICBwb3N0TWVyZ2VDb21tYW5kcy5wdXNoKFxuICAgICAgU3RyaW5nLnJhd2BydW5faWZfY2hhbmdlZCBcIlxcLi4rLXZlcnNpb25cIiBcImF3ayAne3ByaW50IFxcJDF9JyAudG9vbC12ZXJzaW9ucyB8IHhhcmdzIC1Je30gYXNkZiBwbHVnaW4gYWRkIHt9XCJgLFxuICAgICAgU3RyaW5nLnJhd2BydW5faWZfY2hhbmdlZCBcIlxcLi4rLXZlcnNpb25cIiBcImFzZGYgcGx1Z2luIHVwZGF0ZSAtLWFsbFwiYFxuICAgICk7XG4gIH1cbiAgLy8gUHl0aG9u44GM44Gq44GE44Go44Kk44Oz44K544OI44O844Or44Gn44GN44Gq44GE5Yem55CG57O744GM5a2Y5Zyo44GZ44KL44Gf44KB44CB5by35Yi255qE44Gr5pyA5Yid44Gr44Kk44Oz44K544OI44O844Or44GZ44KL44CCXG4gIGlmIChjb25maWcudmVyc2lvbnNUZXh0Py5pbmNsdWRlcygncHl0aG9uICcpKSB7XG4gICAgcG9zdE1lcmdlQ29tbWFuZHMucHVzaChTdHJpbmcucmF3YHJ1bl9pZl9jaGFuZ2VkIFwiXFwuListdmVyc2lvblwiIFwiYXNkZiBpbnN0YWxsIHB5dGhvblwiYCk7XG4gIH1cbiAgaWYgKGNvbmZpZy52ZXJzaW9uc1RleHQpIHtcbiAgICBwb3N0TWVyZ2VDb21tYW5kcy5wdXNoKFN0cmluZy5yYXdgcnVuX2lmX2NoYW5nZWQgXCJcXC4uKy12ZXJzaW9uXCIgXCJhc2RmIGluc3RhbGxcImApO1xuICB9XG4gIGNvbnN0IGluc3RhbGxDb21tYW5kID0gY29uZmlnLmlzQnVuID8gJ2J1biBpbnN0YWxsJyA6ICd5YXJuJztcbiAgY29uc3Qgcm1OZXh0RGlyZWN0b3J5ID0gY29uZmlnLmRlcGVuZGluZy5ibGl0eiB8fCBjb25maWcuZGVwZW5kaW5nLm5leHQgPyAnICYmIHJtIC1SZiAubmV4dCcgOiAnJztcbiAgcG9zdE1lcmdlQ29tbWFuZHMucHVzaChTdHJpbmcucmF3YHJ1bl9pZl9jaGFuZ2VkIFwicGFja2FnZVxcLmpzb25cIiBcIiR7aW5zdGFsbENvbW1hbmR9JHtybU5leHREaXJlY3Rvcnl9XCJgKTtcbiAgaWYgKGNvbmZpZy5kb2VzQ29udGFpblBvZXRyeUxvY2spIHtcbiAgICBwb3N0TWVyZ2VDb21tYW5kcy5wdXNoKFN0cmluZy5yYXdgcnVuX2lmX2NoYW5nZWQgXCJwb2V0cnlcXC5sb2NrXCIgXCJwb2V0cnkgaW5zdGFsbFwiYCk7XG4gIH1cbiAgaWYgKGNvbmZpZy5kZXBlbmRpbmcuYmxpdHopIHtcbiAgICBwb3N0TWVyZ2VDb21tYW5kcy5wdXNoKFxuICAgICAgU3RyaW5nLnJhd2BydW5faWZfY2hhbmdlZCBcIi4qXFwucHJpc21hXCIgXCJub2RlIG5vZGVfbW9kdWxlcy8uYmluL2JsaXR6IHByaXNtYSBtaWdyYXRlIGRlcGxveVwiYCxcbiAgICAgIFN0cmluZy5yYXdgcnVuX2lmX2NoYW5nZWQgXCIuKlxcLnByaXNtYVwiIFwibm9kZSBub2RlX21vZHVsZXMvLmJpbi9ibGl0eiBwcmlzbWEgZ2VuZXJhdGVcImAsXG4gICAgICBTdHJpbmcucmF3YHJ1bl9pZl9jaGFuZ2VkIFwiLipcXC5wcmlzbWFcIiBcIm5vZGUgbm9kZV9tb2R1bGVzLy5iaW4vYmxpdHogY29kZWdlblwiYFxuICAgICk7XG4gIH0gZWxzZSBpZiAoY29uZmlnLmRlcGVuZGluZy5wcmlzbWEpIHtcbiAgICBwb3N0TWVyZ2VDb21tYW5kcy5wdXNoKFxuICAgICAgU3RyaW5nLnJhd2BydW5faWZfY2hhbmdlZCBcIi4qXFwucHJpc21hXCIgXCJub2RlIG5vZGVfbW9kdWxlcy8uYmluL2RvdGVudiAtYyBkZXZlbG9wbWVudCAtLSBub2RlIG5vZGVfbW9kdWxlcy8uYmluL3ByaXNtYSBtaWdyYXRlIGRlcGxveVwiYCxcbiAgICAgIFN0cmluZy5yYXdgcnVuX2lmX2NoYW5nZWQgXCIuKlxcLnByaXNtYVwiIFwibm9kZSBub2RlX21vZHVsZXMvLmJpbi9kb3RlbnYgLWMgZGV2ZWxvcG1lbnQgLS0gbm9kZSBub2RlX21vZHVsZXMvLmJpbi9wcmlzbWEgZ2VuZXJhdGVcImBcbiAgICApO1xuICB9XG4gIHJldHVybiBwb3N0TWVyZ2VDb21tYW5kcztcbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGV4dGVuc2lvbnMgfSBmcm9tICcuLi91dGlscy9leHRlbnNpb25zLmpzJztcbmltcG9ydCB7IGZzVXRpbCB9IGZyb20gJy4uL3V0aWxzL2ZzVXRpbC5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcblxuZnVuY3Rpb24gY3JlYXRlVGFza09wdGlvbnMocnVubmVyOiBzdHJpbmcsIGFyZ3M6IHN0cmluZywgbmFtZTogc3RyaW5nLCBleHRlbnNpb246IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiBgICAgIDxUYXNrT3B0aW9ucyBpc0VuYWJsZWQ9XCJ0cnVlXCI+XG4gICAgICA8b3B0aW9uIG5hbWU9XCJhcmd1bWVudHNcIiB2YWx1ZT1cIiR7YXJnc30gJEZpbGVQYXRoUmVsYXRpdmVUb1Byb2plY3RSb290JFwiIC8+XG4gICAgICA8b3B0aW9uIG5hbWU9XCJjaGVja1N5bnRheEVycm9yc1wiIHZhbHVlPVwiZmFsc2VcIiAvPlxuICAgICAgPG9wdGlvbiBuYW1lPVwiZGVzY3JpcHRpb25cIiAvPlxuICAgICAgPG9wdGlvbiBuYW1lPVwiZXhpdENvZGVCZWhhdmlvclwiIHZhbHVlPVwiRVJST1JcIiAvPlxuICAgICAgPG9wdGlvbiBuYW1lPVwiZmlsZUV4dGVuc2lvblwiIHZhbHVlPVwiJHtleHRlbnNpb259XCIgLz5cbiAgICAgIDxvcHRpb24gbmFtZT1cImltbWVkaWF0ZVN5bmNcIiB2YWx1ZT1cImZhbHNlXCIgLz5cbiAgICAgIDxvcHRpb24gbmFtZT1cIm5hbWVcIiB2YWx1ZT1cIiR7bmFtZX0gKC4ke2V4dGVuc2lvbn0pXCIgLz5cbiAgICAgIDxvcHRpb24gbmFtZT1cIm91dHB1dFwiIHZhbHVlPVwiJEZpbGVQYXRoUmVsYXRpdmVUb1Byb2plY3RSb290JFwiIC8+XG4gICAgICA8b3B0aW9uIG5hbWU9XCJvdXRwdXRGaWx0ZXJzXCI+XG4gICAgICAgIDxhcnJheSAvPlxuICAgICAgPC9vcHRpb24+XG4gICAgICA8b3B0aW9uIG5hbWU9XCJvdXRwdXRGcm9tU3Rkb3V0XCIgdmFsdWU9XCJmYWxzZVwiIC8+XG4gICAgICA8b3B0aW9uIG5hbWU9XCJwcm9ncmFtXCIgdmFsdWU9XCIke3J1bm5lcn1cIiAvPlxuICAgICAgPG9wdGlvbiBuYW1lPVwicnVuT25FeHRlcm5hbENoYW5nZXNcIiB2YWx1ZT1cImZhbHNlXCIgLz5cbiAgICAgIDxvcHRpb24gbmFtZT1cInNjb3BlTmFtZVwiIHZhbHVlPVwiUHJvamVjdCBGaWxlc1wiIC8+XG4gICAgICA8b3B0aW9uIG5hbWU9XCJ0cmFja09ubHlSb290XCIgdmFsdWU9XCJmYWxzZVwiIC8+XG4gICAgICA8b3B0aW9uIG5hbWU9XCJ3b3JraW5nRGlyXCIgdmFsdWU9XCIkUHJvamVjdEZpbGVEaXIkXCIgLz5cbiAgICAgIDxlbnZzIC8+XG4gICAgPC9UYXNrT3B0aW9ucz5cbmA7XG59XG5cbmNvbnN0IHByZXR0aWVyQ29udGVudCA9IGA8P3htbCB2ZXJzaW9uPVwiMS4wXCIgZW5jb2Rpbmc9XCJVVEYtOFwiPz5cbjxwcm9qZWN0IHZlcnNpb249XCI0XCI+XG4gIDxjb21wb25lbnQgbmFtZT1cIlByb2plY3RUYXNrc09wdGlvbnNcIj5cbiR7ZXh0ZW5zaW9ucy5wcmV0dGllci5tYXAoKGV4dCkgPT4gY3JlYXRlVGFza09wdGlvbnMoJ25vZGUnLCAnbm9kZV9tb2R1bGVzLy5iaW4vcHJldHRpZXIgLS1jYWNoZSAtLXdyaXRlJywgJ1ByZXR0aWVyJywgZXh0KSkuam9pbignJyl9XG4gIDwvY29tcG9uZW50PlxuPC9wcm9qZWN0PlxuYDtcblxuY29uc3QgYmlvbWVDb250ZW50ID0gYDw/eG1sIHZlcnNpb249XCIxLjBcIiBlbmNvZGluZz1cIlVURi04XCI/PlxuPHByb2plY3QgdmVyc2lvbj1cIjRcIj5cbiAgPGNvbXBvbmVudCBuYW1lPVwiUHJvamVjdFRhc2tzT3B0aW9uc1wiPlxuJHtleHRlbnNpb25zLnByZXR0aWVyLm1hcCgoZXh0KSA9PiBjcmVhdGVUYXNrT3B0aW9ucygnYnVuJywgJy0tYnVuIG5vZGVfbW9kdWxlcy8uYmluL2Jpb21lIGNoZWNrIC0tZml4IC0tbm8tZXJyb3JzLW9uLXVubWF0Y2hlZCAtLXNraXAtcGFyc2UtZXJyb3JzJywgJ0Jpb21lJywgZXh0KSkuam9pbignJyl9XG4gIDwvY29tcG9uZW50PlxuPC9wcm9qZWN0PlxuYDtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlSWRlYVNldHRpbmdzKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2dlbmVyYXRlSWRlYVNldHRpbmdzJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IGRpclBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICcuaWRlYScpO1xuICAgIGlmIChmcy5leGlzdHNTeW5jKGRpclBhdGgpKSB7XG4gICAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShkaXJQYXRoLCAnd2F0Y2hlclRhc2tzLnhtbCcpO1xuICAgICAgYXdhaXQgKGNvbmZpZy5kb2VzQ29udGFpbkphdmFTY3JpcHQgfHxcbiAgICAgIGNvbmZpZy5kb2VzQ29udGFpbkphdmFTY3JpcHRJblBhY2thZ2VzIHx8XG4gICAgICBjb25maWcuZG9lc0NvbnRhaW5UeXBlU2NyaXB0IHx8XG4gICAgICBjb25maWcuZG9lc0NvbnRhaW5UeXBlU2NyaXB0SW5QYWNrYWdlcyB8fFxuICAgICAgKGNvbmZpZy5kb2VzQ29udGFpblBhY2thZ2VKc29uICYmXG4gICAgICAgICFjb25maWcuZG9lc0NvbnRhaW5QdWJzcGVjWWFtbCAmJlxuICAgICAgICAhY29uZmlnLmRvZXNDb250YWluR2VtZmlsZSAmJlxuICAgICAgICAhY29uZmlnLmRvZXNDb250YWluR29Nb2QgJiZcbiAgICAgICAgIWNvbmZpZy5kb2VzQ29udGFpblBvbVhtbClcbiAgICAgICAgPyBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnNVdGlsLmdlbmVyYXRlRmlsZShmaWxlUGF0aCwgY29uZmlnLmlzQnVuID8gYmlvbWVDb250ZW50IDogcHJldHRpZXJDb250ZW50KSlcbiAgICAgICAgOiBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnMucHJvbWlzZXMucm0oZmlsZVBhdGgsIHsgZm9yY2U6IHRydWUgfSkpKTtcbiAgICB9XG4gIH0pO1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHlhbWwgZnJvbSAnanMteWFtbCc7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuXG5pbXBvcnQgeyBnZW5lcmF0ZVBvc3RNZXJnZUNvbW1hbmRzIH0gZnJvbSAnLi9odXNreXJjLmpzJztcbmltcG9ydCB7IGdlbmVyYXRlU2NyaXB0cyB9IGZyb20gJy4vcGFja2FnZUpzb24uanMnO1xuXG5jb25zdCBuZXdTZXR0aW5ncyA9IHtcbiAgJ3Bvc3QtbWVyZ2UnOiB7XG4gICAgc2NyaXB0czoge1xuICAgICAgJ3ByZXBhcmUuc2gnOiB7XG4gICAgICAgIHJ1bm5lcjogJ2Jhc2gnLFxuICAgICAgfSxcbiAgICB9LFxuICB9LFxuICAncHJlLWNvbW1pdCc6IHtcbiAgICBjb21tYW5kczoge1xuICAgICAgY2xlYW51cDoge1xuICAgICAgICBnbG9iOiAnKi57Y2pzLGNzcyxjdHMsaHRtLGh0bWwsanMsanNvbixqc29uNSxqc29uYyxqc3gsbWQsbWpzLG10cyxzY3NzLHRzLHRzeCx2dWUseWFtbCx5bWx9JyxcbiAgICAgICAgcnVuOiAnYnVuIC0tYnVuIHdiIGxpbnQgLS1maXggLS1mb3JtYXQge3N0YWdlZF9maWxlc30gJiYgZ2l0IGFkZCB7c3RhZ2VkX2ZpbGVzfScsXG4gICAgICB9LFxuICAgICAgJ2NoZWNrLW1pZ3JhdGlvbnMnOiB7XG4gICAgICAgIGdsb2I6ICcqKi9taWdyYXRpb24uc3FsJyxcbiAgICAgICAgcnVuOiBgXG5pZiBncmVwIC1xICdXYXJuaW5nczonIHtzdGFnZWRfZmlsZXN9OyB0aGVuXG4gIGVjaG8gXCJNaWdyYXRpb24gU1FMIGZpbGVzICh7c3RhZ2VkX2ZpbGVzfSkgY29udGFpbiB3YXJuaW5ncyEgUGxlYXNlIHNvbHZlIHRoZSB3YXJuaW5ncyBhbmQgY29tbWl0IGFnYWluLlwiXG4gIGV4aXQgMVxuZmlcbmAudHJpbSgpLFxuICAgICAgfSxcbiAgICB9LFxuICB9LFxuICAncHJlLXB1c2gnOiB7XG4gICAgc2NyaXB0czoge1xuICAgICAgJ2NoZWNrLnNoJzoge1xuICAgICAgICBydW5uZXI6ICdiYXNoJyxcbiAgICAgIH0sXG4gICAgfSxcbiAgfSxcbn07XG5cbmNvbnN0IHNjcmlwdHMgPSB7XG4gIHByZVB1c2g6IGBidW4gLS1idW4gbm9kZV9tb2R1bGVzLy5iaW4vd2IgdHlwZWNoZWNrYCxcbiAgcHJlUHVzaEZvckxhYjogYFxuIyEvYmluL2Jhc2hcblxuaWYgWyAkKGdpdCBicmFuY2ggLS1zaG93LWN1cnJlbnQpID0gXCJtYWluXCIgXSAmJiBbICQoZ2l0IGNvbmZpZyB1c2VyLmVtYWlsKSAhPSBcImV4a2F6dXVAZ21haWwuY29tXCIgXTsgdGhlblxuICBlY2hvIFwiKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXCJcbiAgZWNobyBcIioqKiBEb24ndCBwdXNoIG1haW4gYnJhbmNoIGRpcmVjdGx5LiBVc2UgUFIhICoqKlwiXG4gIGVjaG8gXCIqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcIlxuICBleGl0IDFcbmZpXG5cbmJ1biAtLWJ1biBub2RlX21vZHVsZXMvLmJpbi93YiB0eXBlY2hlY2tcbmAudHJpbSgpLFxuICBwb3N0TWVyZ2U6IGBcbiMhL2Jpbi9iYXNoXG5cbmNoYW5nZWRfZmlsZXM9XCIkKGdpdCBkaWZmLXRyZWUgLXIgLS1uYW1lLW9ubHkgLS1uby1jb21taXQtaWQgT1JJR19IRUFEIEhFQUQpXCJcblxucnVuX2lmX2NoYW5nZWQoKSB7XG4gIGlmIGVjaG8gXCIkY2hhbmdlZF9maWxlc1wiIHwgZ3JlcCAtLXF1aWV0IC1FIFwiJDFcIjsgdGhlblxuICAgIGV2YWwgXCIkMlwiXG4gIGZpXG59XG5gLnRyaW0oKSxcbn07XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZW5lcmF0ZUxlZnRob29rVXBkYXRpbmdQYWNrYWdlSnNvbihjb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdnZW5lcmF0ZUxlZnRob29rVXBkYXRpbmdQYWNrYWdlSnNvbicsIGFzeW5jICgpID0+IHtcbiAgICBhd2FpdCBjb3JlKGNvbmZpZyk7XG4gIH0pO1xufVxuXG5hc3luYyBmdW5jdGlvbiBjb3JlKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBkaXJQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnLmxlZnRob29rJyk7XG4gIGNvbnN0IHsgdHlwZWNoZWNrIH0gPSBnZW5lcmF0ZVNjcmlwdHMoY29uZmlnLCB7fSk7XG4gIGNvbnN0IHNldHRpbmdzOiBQYXJ0aWFsPHR5cGVvZiBuZXdTZXR0aW5ncz4gPSB7IC4uLm5ld1NldHRpbmdzIH07XG4gIGlmICghdHlwZWNoZWNrKSB7XG4gICAgZGVsZXRlIHNldHRpbmdzWydwcmUtcHVzaCddO1xuICB9XG4gIGF3YWl0IFByb21pc2UuYWxsKFtcbiAgICBmcy5wcm9taXNlcy53cml0ZUZpbGUoXG4gICAgICBwYXRoLmpvaW4oY29uZmlnLmRpclBhdGgsICdsZWZ0aG9vay55bWwnKSxcbiAgICAgIHlhbWwuZHVtcChzZXR0aW5ncywge1xuICAgICAgICBsaW5lV2lkdGg6IC0xLFxuICAgICAgICBub0NvbXBhdE1vZGU6IHRydWUsXG4gICAgICAgIHN0eWxlczoge1xuICAgICAgICAgICchIW51bGwnOiAnZW1wdHknLFxuICAgICAgICB9LFxuICAgICAgfSlcbiAgICApLFxuICAgIGZzLnByb21pc2VzLnJtKGRpclBhdGgsIHsgZm9yY2U6IHRydWUsIHJlY3Vyc2l2ZTogdHJ1ZSB9KSxcbiAgXSk7XG5cbiAgaWYgKHR5cGVjaGVjaykge1xuICAgIGNvbnN0IHByZVB1c2ggPSBjb25maWcucmVwb3NpdG9yeT8uc3RhcnRzV2l0aCgnZ2l0aHViOldpbGxCb29zdGVyTGFiLycpID8gc2NyaXB0cy5wcmVQdXNoRm9yTGFiIDogc2NyaXB0cy5wcmVQdXNoO1xuICAgIGZzLm1rZGlyU3luYyhwYXRoLmpvaW4oZGlyUGF0aCwgJ3ByZS1wdXNoJyksIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PlxuICAgICAgZnMucHJvbWlzZXMud3JpdGVGaWxlKHBhdGguam9pbihkaXJQYXRoLCAncHJlLXB1c2gnLCAnY2hlY2suc2gnKSwgcHJlUHVzaCArICdcXG4nLCB7XG4gICAgICAgIG1vZGU6IDBvNzU1LFxuICAgICAgfSlcbiAgICApO1xuICB9XG4gIGNvbnN0IHBvc3RNZXJnZUNvbW1hbmQgPSBgJHtzY3JpcHRzLnBvc3RNZXJnZX1cXG5cXG4ke2dlbmVyYXRlUG9zdE1lcmdlQ29tbWFuZHMoY29uZmlnKS5qb2luKCdcXG4nKX1cXG5gO1xuICBmcy5ta2RpclN5bmMocGF0aC5qb2luKGRpclBhdGgsICdwb3N0LW1lcmdlJyksIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT5cbiAgICBmcy5wcm9taXNlcy53cml0ZUZpbGUocGF0aC5yZXNvbHZlKGRpclBhdGgsICdwb3N0LW1lcmdlJywgJ3ByZXBhcmUuc2gnKSwgcG9zdE1lcmdlQ29tbWFuZCwge1xuICAgICAgbW9kZTogMG83NTUsXG4gICAgfSlcbiAgKTtcbn1cbiIsImltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuXG5jb25zdCBzcmNEaXJlY3RvcmllcyA9IHtcbiAgbm9kZTogWydzcmMnLCAndGVzdCcsICdzY3JpcHRzJ10udG9Tb3J0ZWQoKSxcbiAgYmxpdHo6IFsnc3JjJywgJ3Rlc3QnLCAnc2NyaXB0cycsICdkYicsICdpbnRlZ3JhdGlvbnMnLCAnbWFpbGVycyddLnRvU29ydGVkKCksXG59O1xuXG5leHBvcnQgZnVuY3Rpb24gZ2V0U3JjRGlycyhjb25maWc6IFBhY2thZ2VDb25maWcpOiBzdHJpbmdbXSB7XG4gIGlmIChjb25maWcuZGVwZW5kaW5nLmJsaXR6KSB7XG4gICAgcmV0dXJuIHNyY0RpcmVjdG9yaWVzLmJsaXR6O1xuICB9XG4gIHJldHVybiBzcmNEaXJlY3Rvcmllcy5ub2RlO1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgRXNsaW50VXRpbCB9IGZyb20gJy4uL3V0aWxzL2VzbGludFV0aWwuanMnO1xuaW1wb3J0IHsgZXh0ZW5zaW9ucyB9IGZyb20gJy4uL3V0aWxzL2V4dGVuc2lvbnMuanMnO1xuaW1wb3J0IHsgZnNVdGlsIH0gZnJvbSAnLi4vdXRpbHMvZnNVdGlsLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuaW1wb3J0IHsgZ2V0U3JjRGlycyB9IGZyb20gJy4uL3V0aWxzL3NyY0RpcmVjdG9yaWVzLmpzJztcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlTGludHN0YWdlZHJjKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2dlbmVyYXRlTGludHN0YWdlZHJjJywgYXN5bmMgKCkgPT4ge1xuICAgIGF3YWl0IGNvcmUoY29uZmlnKTtcbiAgfSk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGNvcmUoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnLmxpbnRzdGFnZWRyYy5janMnKTtcbiAgaWYgKGNvbmZpZy5pc0J1bikge1xuICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiBmcy5wcm9taXNlcy5ybShmaWxlUGF0aCwgeyBmb3JjZTogdHJ1ZSB9KSk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgY29uc3QgcGFja2FnZVByZWZpeCA9IGNvbmZpZy5pc1Jvb3QgPyAnbm9kZSBub2RlX21vZHVsZXMvLmJpbi8nIDogJ25vZGUgLi4vLi4vbm9kZV9tb2R1bGVzLy5iaW4vJztcbiAgY29uc3QgbGluZXM6IHN0cmluZ1tdID0gW107XG4gIGlmIChjb25maWcuZG9lc0NvbnRhaW5KYXZhU2NyaXB0IHx8IGNvbmZpZy5kb2VzQ29udGFpblR5cGVTY3JpcHQpIHtcbiAgICBjb25zdCBlc2xpbnQgPSBgXG4gICcke2dldEVzbGludEtleShjb25maWcpfSc6IFske0pTT04uc3RyaW5naWZ5KFxuICAgIGAke3BhY2thZ2VQcmVmaXh9ZXNsaW50IC0tZml4JHtFc2xpbnRVdGlsLmdldExpbnRGaXhTdWZmaXgoY29uZmlnKX1gXG4gICl9LCAnJHtwYWNrYWdlUHJlZml4fXByZXR0aWVyIC0tY2FjaGUgLS13cml0ZSddLGA7XG4gICAgbGluZXMucHVzaChlc2xpbnQpO1xuICB9XG4gIGNvbnN0IHBhY2thZ2VzRmlsdGVyID0gY29uZmlnLmlzUm9vdCA/IFwiICYmICFmaWxlLmluY2x1ZGVzKCcvcGFja2FnZXMvJylcIiA6ICcnO1xuICBsaW5lcy5wdXNoKGBcbiAgJy4vKiovKi57JHtleHRlbnNpb25zLnByZXR0aWVyLmpvaW4oJywnKX19JzogZmlsZXMgPT4ge1xuICAgIGxldCBmaWx0ZXJlZEZpbGVzID0gZmlsZXMuZmlsdGVyKGZpbGUgPT4gIWZpbGUuaW5jbHVkZXMoJy90ZXN0LWZpeHR1cmVzLycpICYmICFmaWxlLmluY2x1ZGVzKCcvdGVzdC9maXh0dXJlcy8nKSR7cGFja2FnZXNGaWx0ZXJ9KTske2dldEVzbGludEZpbHRlckZvclByZXR0aWVyKGNvbmZpZyl9XG4gICAgaWYgKGZpbHRlcmVkRmlsZXMubGVuZ3RoID09PSAwKSByZXR1cm4gW107XG4gICAgY29uc3QgY29tbWFuZHMgPSBbXFxgJHtwYWNrYWdlUHJlZml4fXByZXR0aWVyIC0tY2FjaGUgLS13cml0ZSBcXCR7ZmlsdGVyZWRGaWxlcy5qb2luKCcgJyl9XFxgXTtcbiAgICBpZiAoZmlsdGVyZWRGaWxlcy5zb21lKGZpbGUgPT4gZmlsZS5lbmRzV2l0aCgncGFja2FnZS5qc29uJykpKSB7XG4gICAgICBjb21tYW5kcy5wdXNoKCcke3BhY2thZ2VQcmVmaXh9c29ydC1wYWNrYWdlLWpzb24nKTtcbiAgICB9XG4gICAgcmV0dXJuIGNvbW1hbmRzO1xuICB9LFxuICAnLi8qKi9taWdyYXRpb24uc3FsJzogKGZpbGVzKSA9PiB7XG4gIGZvciAoY29uc3QgZmlsZSBvZiBmaWxlcykge1xuICAgIGNvbnN0IGNvbnRlbnQgPSBmcy5yZWFkRmlsZVN5bmMoZmlsZSwgJ3V0Zi04Jyk7XG4gICAgaWYgKGNvbnRlbnQuaW5jbHVkZXMoJ1dhcm5pbmdzOicpKSB7XG4gICAgICByZXR1cm4gW1xuICAgICAgICBcXGBlY2hvICchISEgTWlncmF0aW9uIFNRTCBmaWxlIChcXCR7cGF0aC5yZWxhdGl2ZSgnJywgZmlsZSl9KSBjb250YWlucyB3YXJuaW5ncyAhISEgU29sdmUgdGhlIHdhcm5pbmdzIGFuZCBjb21taXQgYWdhaW4uJ1xcYCxcbiAgICAgICAgJ2ZhbHNlJyxcbiAgICAgIF07XG4gICAgfVxuICB9XG4gIHJldHVybiBbXTtcbn0sYCk7XG4gIGlmIChjb25maWcuZG9lc0NvbnRhaW5QdWJzcGVjWWFtbCkge1xuICAgIGxpbmVzLnB1c2goYFxuICAnLi97bGliLHRlc3QsdGVzdF9kcml2ZXJ9LyoqLyouZGFydCc6IGZpbGVzID0+IHtcbiAgICBjb25zdCBmaWx0ZXJlZEZpbGVzID0gZmlsZXMuZmlsdGVyKGZpbGUgPT4gIWZpbGUuaW5jbHVkZXMoJ2dlbmVyYXRlZCcpKVxuICAgICAgLmZpbHRlcihmaWxlID0+ICFmaWxlLmVuZHNXaXRoKCcuZnJlZXplZC5kYXJ0JykgJiYgIWZpbGUuZW5kc1dpdGgoJy5nLmRhcnQnKSk7XG4gICAgaWYgKGZpbHRlcmVkRmlsZXMubGVuZ3RoID09PSAwKSByZXR1cm4gW107XG4gICAgcmV0dXJuIFtcXGBkYXJ0IGZvcm1hdCBcXCR7ZmlsdGVyZWRGaWxlcy5qb2luKCcgJyl9XFxgXTtcbiAgfSxgKTtcbiAgfVxuICBpZiAoY29uZmlnLmRvZXNDb250YWluUG9ldHJ5TG9jaykge1xuICAgIGxpbmVzLnB1c2goYFxuICAnLi8qKi8qLnB5JzogW1xuICAgICdwb2V0cnkgcnVuIGlzb3J0IC0tcHJvZmlsZSBibGFjayAtLWZpbHRlci1maWxlcycsXG4gICAgJ3BvZXRyeSBydW4gYmxhY2snLFxuICAgICdwb2V0cnkgcnVuIGZsYWtlOCdcbiAgXSxgKTtcbiAgfVxuXG4gIGNvbnN0IG5ld0NvbnRlbnQgPSBgY29uc3QgZnMgPSByZXF1aXJlKCdmcycpO1xuY29uc3QgcGF0aCA9IHJlcXVpcmUoJ3BhdGgnKTtcbiR7Y29uZmlnLmRvZXNDb250YWluSmF2YVNjcmlwdCB8fCBjb25maWcuZG9lc0NvbnRhaW5UeXBlU2NyaXB0ID8gXCJjb25zdCBtaWNyb21hdGNoID0gcmVxdWlyZSgnbWljcm9tYXRjaCcpO1xcblwiIDogJyd9XG5tb2R1bGUuZXhwb3J0cyA9IHske2xpbmVzLmpvaW4oJycpfVxufTtcbmA7XG5cbiAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzLnByb21pc2VzLnJtKHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJy5saW50c3RhZ2VkcmMuanMnKSwgeyBmb3JjZTogdHJ1ZSB9KSk7XG4gIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiBmcy5wcm9taXNlcy5ybShwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICcubGludHN0YWdlZHJjLmpzb24nKSwgeyBmb3JjZTogdHJ1ZSB9KSk7XG4gIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiBmc1V0aWwuZ2VuZXJhdGVGaWxlKGZpbGVQYXRoLCBuZXdDb250ZW50KSk7XG59XG5cbmZ1bmN0aW9uIGdldEVzbGludEtleShjb25maWc6IFBhY2thZ2VDb25maWcpOiBzdHJpbmcge1xuICBjb25zdCBkaXJzID0gZ2V0U3JjRGlycyhjb25maWcpLm1hcCgoZGlyKSA9PiBgJHtkaXJ9LyoqL2ApO1xuICByZXR1cm4gYHssJHtkaXJzLmpvaW4oJywnKX19Ki57JHtleHRlbnNpb25zLmVzbGludC5qb2luKCcsJyl9fWA7XG59XG5cbmZ1bmN0aW9uIGdldEVzbGludEZpbHRlckZvclByZXR0aWVyKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IHN0cmluZyB7XG4gIHJldHVybiBjb25maWcuZG9lc0NvbnRhaW5KYXZhU2NyaXB0IHx8IGNvbmZpZy5kb2VzQ29udGFpblR5cGVTY3JpcHRcbiAgICA/IGBcXG5cbiAgICBmaWx0ZXJlZEZpbGVzID0gZmlsdGVyZWRGaWxlcy5tYXAoKGZpbGUpID0+IHBhdGgucmVsYXRpdmUoJycsIGZpbGUpKTtcbiAgICBmaWx0ZXJlZEZpbGVzID0gbWljcm9tYXRjaC5ub3QoZmlsdGVyZWRGaWxlcywgJyR7Z2V0RXNsaW50S2V5KGNvbmZpZyl9Jyk7XG4gICAgZmlsdGVyZWRGaWxlcyA9IGZpbHRlcmVkRmlsZXMubWFwKChmaWxlKSA9PiBwYXRoLnJlc29sdmUoZmlsZSkpO2BcbiAgICA6ICcnO1xufVxuIiwiaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZnNVdGlsIH0gZnJvbSAnLi4vdXRpbHMvZnNVdGlsLmpzJztcbmltcG9ydCB7IGlnbm9yZUZpbGVVdGlsIH0gZnJvbSAnLi4vdXRpbHMvaWdub3JlRmlsZVV0aWwuanMnO1xuaW1wb3J0IHsgcHJvbWlzZVBvb2wgfSBmcm9tICcuLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5cbmNvbnN0IGNvbW1vbkNvbnRlbnQgPSBgXG4zcmQtcGFydHkvXG5hbmRyb2lkL1xuaW9zL1xubm8tZm9ybWF0L1xudGVzdC1maXh0dXJlcy9cbnRlc3QvZml4dHVyZXMvXG4qLmQudHNcbioubWluLmpzXG4ueWFybi9cbi5wbnAuanNcbmA7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZW5lcmF0ZVByZXR0aWVyaWdub3JlKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2dlbmVyYXRlUHJldHRpZXJpZ25vcmUnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICcucHJldHRpZXJpZ25vcmUnKTtcbiAgICBjb25zdCBjb250ZW50ID0gKGF3YWl0IGZzVXRpbC5yZWFkRmlsZUlnbm9yaW5nRXJyb3IoZmlsZVBhdGgpKSA/PyAnJztcbiAgICBjb25zdCBoZWFkVXNlckNvbnRlbnQgPSBpZ25vcmVGaWxlVXRpbC5nZXRIZWFkVXNlckNvbnRlbnQoY29udGVudCk7XG4gICAgY29uc3QgdGFpbFVzZXJDb250ZW50ID0gaWdub3JlRmlsZVV0aWwuZ2V0VGFpbFVzZXJDb250ZW50KGNvbnRlbnQpO1xuXG4gICAgY29uc3QgZ2l0aWdub3JlRmlsZVBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICcuZ2l0aWdub3JlJyk7XG4gICAgY29uc3QgZ2l0aWdub3JlQ29udGVudCA9IChhd2FpdCBpZ25vcmVGaWxlVXRpbC5yZWFkR2l0aWdub3JlV2l0aG91dFNlcGFyYXRvcnMoZ2l0aWdub3JlRmlsZVBhdGgpKSB8fCAnJztcblxuICAgIGxldCBhZGRpdGlvbmFsQ29udGVudCA9ICcnO1xuICAgIGlmIChjb25maWcuZG9lc0NvbnRhaW5QdWJzcGVjWWFtbCkge1xuICAgICAgYWRkaXRpb25hbENvbnRlbnQgPSBgXG5hbmRyb2lkL2FwcC9cbmlvcy9SdW5uZXIvQXNzZXRzLnhjYXNzZXRzL1xucHVic3BlYy55YW1sXG5gO1xuICAgIH1cblxuICAgIGNvbnN0IG5ld0NvbnRlbnQgPSBoZWFkVXNlckNvbnRlbnQgKyBjb21tb25Db250ZW50ICsgYWRkaXRpb25hbENvbnRlbnQgKyBnaXRpZ25vcmVDb250ZW50ICsgdGFpbFVzZXJDb250ZW50O1xuICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiBmc1V0aWwuZ2VuZXJhdGVGaWxlKGZpbGVQYXRoLCBuZXdDb250ZW50KSk7XG4gIH0pO1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IG1lcmdlIGZyb20gJ2RlZXBtZXJnZSc7XG5pbXBvcnQgY2xvbmVEZWVwIGZyb20gJ2xvZGFzaC5jbG9uZWRlZXAnO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBmc1V0aWwgfSBmcm9tICcuLi91dGlscy9mc1V0aWwuanMnO1xuaW1wb3J0IHsgb3ZlcndyaXRlTWVyZ2UgfSBmcm9tICcuLi91dGlscy9tZXJnZVV0aWwuanMnO1xuaW1wb3J0IHsgcHJvbWlzZVBvb2wgfSBmcm9tICcuLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5cbmNvbnN0IGpzb25PYmogPSB7XG4gIHZlbnZQYXRoOiAnLicsXG4gIHZlbnY6ICcudmVudicsXG59O1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVQeXJpZ2h0Q29uZmlnSnNvbihjb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdnZW5lcmF0ZVB5cmlnaHRDb25maWdKc29uJywgYXN5bmMgKCkgPT4ge1xuICAgIGxldCBuZXdTZXR0aW5nczogb2JqZWN0ID0gY2xvbmVEZWVwKGpzb25PYmopO1xuICAgIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAncHlyaWdodGNvbmZpZy5qc29uJyk7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IG9sZENvbnRlbnQgPSBhd2FpdCBmcy5wcm9taXNlcy5yZWFkRmlsZShmaWxlUGF0aCwgJ3V0ZjgnKTtcbiAgICAgIGNvbnN0IG9sZFNldHRpbmdzID0gSlNPTi5wYXJzZShvbGRDb250ZW50KSBhcyBvYmplY3Q7XG4gICAgICBuZXdTZXR0aW5ncyA9IG1lcmdlLmFsbChbbmV3U2V0dGluZ3MsIG9sZFNldHRpbmdzLCBuZXdTZXR0aW5nc10sIHsgYXJyYXlNZXJnZTogb3ZlcndyaXRlTWVyZ2UgfSk7XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBkbyBub3RoaW5nXG4gICAgfVxuICAgIGNvbnN0IG5ld0NvbnRlbnQgPSBKU09OLnN0cmluZ2lmeShuZXdTZXR0aW5ncyk7XG4gICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzVXRpbC5nZW5lcmF0ZUZpbGUoZmlsZVBhdGgsIG5ld0NvbnRlbnQpKTtcbiAgfSk7XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBmc1V0aWwgfSBmcm9tICcuLi91dGlscy9mc1V0aWwuanMnO1xuaW1wb3J0IHsgcHJvbWlzZVBvb2wgfSBmcm9tICcuLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5cbmNvbnN0IHNlbWFudGljUmVsZWFzZUJhZGdlID1cbiAgJ1shW3NlbWFudGljLXJlbGVhc2VdKGh0dHBzOi8vaW1nLnNoaWVsZHMuaW8vYmFkZ2UvJTIwJTIwJUYwJTlGJTkzJUE2JUYwJTlGJTlBJTgwLXNlbWFudGljLS1yZWxlYXNlLWUxMDA3OS5zdmcpXShodHRwczovL2dpdGh1Yi5jb20vc2VtYW50aWMtcmVsZWFzZS9zZW1hbnRpYy1yZWxlYXNlKSc7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZW5lcmF0ZVJlYWRtZShjb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdnZW5lcmF0ZVJlYWRtZScsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJ1JFQURNRS5tZCcpO1xuICAgIGxldCBuZXdDb250ZW50ID0gYXdhaXQgZnMucHJvbWlzZXMucmVhZEZpbGUoZmlsZVBhdGgsICd1dGY4Jyk7XG5cbiAgICBpZiAoZnMuZXhpc3RzU3luYyhwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICcucmVsZWFzZXJjLmpzb24nKSkpIHtcbiAgICAgIG5ld0NvbnRlbnQgPSBpbnNlcnRCYWRnZShuZXdDb250ZW50LCBzZW1hbnRpY1JlbGVhc2VCYWRnZSk7XG4gICAgfVxuXG4gICAgY29uc3QgcmVwb3NpdG9yeSA9IGNvbmZpZy5yZXBvc2l0b3J5Py5zbGljZShjb25maWcucmVwb3NpdG9yeS5pbmRleE9mKCc6JykgKyAxKTtcbiAgICBjb25zdCBmaWxlTmFtZXMgPSBmcy5yZWFkZGlyU3luYyhgJHtjb25maWcuZGlyUGF0aH0vLmdpdGh1Yi93b3JrZmxvd3NgKTtcbiAgICBmb3IgKGNvbnN0IGZpbGVOYW1lIG9mIGZpbGVOYW1lcykge1xuICAgICAgaWYgKCFmaWxlTmFtZS5zdGFydHNXaXRoKCd0ZXN0JykgJiYgIWZpbGVOYW1lLnN0YXJ0c1dpdGgoJ2RlcGxveScpKSBjb250aW51ZTtcblxuICAgICAgbGV0IGJhZGdlTmFtZSA9IGZpbGVOYW1lO1xuICAgICAgYmFkZ2VOYW1lID0gKGJhZGdlTmFtZVswXSB8fCAnJykudG9VcHBlckNhc2UoKSArIGJhZGdlTmFtZS5zbGljZSgxLCBiYWRnZU5hbWUuaW5kZXhPZignLicpKTtcbiAgICAgIGJhZGdlTmFtZSA9IGJhZGdlTmFtZS5yZXBsYWNlKCctJywgJyAnKTtcbiAgICAgIGNvbnN0IGJhZGdlID0gYFshWyR7YmFkZ2VOYW1lfV0oaHR0cHM6Ly9naXRodWIuY29tLyR7cmVwb3NpdG9yeX0vYWN0aW9ucy93b3JrZmxvd3MvJHtmaWxlTmFtZX0vYmFkZ2Uuc3ZnKV0oaHR0cHM6Ly9naXRodWIuY29tLyR7cmVwb3NpdG9yeX0vYWN0aW9ucy93b3JrZmxvd3MvJHtmaWxlTmFtZX0pYDtcbiAgICAgIGlmIChmcy5leGlzdHNTeW5jKHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgYC5naXRodWIvd29ya2Zsb3dzLyR7ZmlsZU5hbWV9YCkpKSB7XG4gICAgICAgIG5ld0NvbnRlbnQgPSBpbnNlcnRCYWRnZShuZXdDb250ZW50LCBiYWRnZSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzVXRpbC5nZW5lcmF0ZUZpbGUoZmlsZVBhdGgsIG5ld0NvbnRlbnQpKTtcbiAgfSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpbnNlcnRCYWRnZShyZWFkbWU6IHN0cmluZywgYmFkZ2U6IHN0cmluZyk6IHN0cmluZyB7XG4gIC8vIOaXouOBq2JhZGdl44GM44GC44KL5aC05ZCI44Gv5YmK6ZmkXG4gIHJlYWRtZSA9IHJlYWRtZS5yZXBsYWNlKGJhZGdlLCAnJykucmVwbGFjZUFsbCgvXFxuXFxuXFxuKy9nLCAnXFxuXFxuJyk7XG5cbiAgZm9yIChsZXQgaSA9IDA7IGkgPCByZWFkbWUubGVuZ3RoOyBpKyspIHtcbiAgICBpZiAocmVhZG1lW2kgLSAxXSA9PT0gJ1xcbicgJiYgcmVhZG1lW2ldID09PSAnXFxuJykge1xuICAgICAgY29uc3QgYmVmb3JlID0gcmVhZG1lLnNsaWNlKDAsIGkgKyAxKTtcbiAgICAgIGxldCBhZnRlciA9IHJlYWRtZS5zbGljZShpICsgMSk7XG4gICAgICBpZiAoIWFmdGVyLnN0YXJ0c1dpdGgoJ1snKSAmJiAhYWZ0ZXIuc3RhcnRzV2l0aCgnIScpKSB7XG4gICAgICAgIGFmdGVyID0gYFxcbiR7YWZ0ZXJ9YDtcbiAgICAgIH1cbiAgICAgIHJldHVybiBgJHtiZWZvcmV9JHtiYWRnZX1cXG4ke2FmdGVyfWA7XG4gICAgfVxuICB9XG4gIHJldHVybiBgJHtyZWFkbWV9XFxuJHtiYWRnZX1cXG5gO1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IG1lcmdlIGZyb20gJ2RlZXBtZXJnZSc7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGZzVXRpbCB9IGZyb20gJy4uL3V0aWxzL2ZzVXRpbC5qcyc7XG5pbXBvcnQgeyBvdmVyd3JpdGVNZXJnZSB9IGZyb20gJy4uL3V0aWxzL21lcmdlVXRpbC5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlUmVsZWFzZXJjKHJvb3RDb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdnZW5lcmF0ZVJlbGVhc2VyYycsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShyb290Q29uZmlnLmRpclBhdGgsICcucmVsZWFzZXJjLmpzb24nKTtcbiAgICBpZiAoIWZzLmV4aXN0c1N5bmMoZmlsZVBhdGgpKSByZXR1cm47XG5cbiAgICBjb25zdCBzZXR0aW5ncyA9IEpTT04ucGFyc2UoYXdhaXQgZnMucHJvbWlzZXMucmVhZEZpbGUoZmlsZVBhdGgsICd1dGY4JykpIGFzIHtcbiAgICAgIHBsdWdpbnM/OiAoc3RyaW5nIHwgW3N0cmluZywgdW5rbm93bl0pW107XG4gICAgfTtcbiAgICBjb25zdCBwbHVnaW5zID0gc2V0dGluZ3MucGx1Z2lucyA/PyBbXTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHBsdWdpbnMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNvbnN0IHBsdWdpbiA9IEFycmF5LmlzQXJyYXkocGx1Z2luc1tpXSkgPyBwbHVnaW5zW2ldPy5bMF0gOiBwbHVnaW5zW2ldO1xuICAgICAgY29uc3Qgb2xkQ29uZmlnID0gKEFycmF5LmlzQXJyYXkocGx1Z2luc1tpXSkgJiYgcGx1Z2luc1tpXT8uWzFdKSB8fCB7fTtcbiAgICAgIGlmIChwbHVnaW4gPT09ICdAc2VtYW50aWMtcmVsZWFzZS9jb21taXQtYW5hbHl6ZXInKSB7XG4gICAgICAgIHBsdWdpbnNbaV0gPSBbXG4gICAgICAgICAgJ0BzZW1hbnRpYy1yZWxlYXNlL2NvbW1pdC1hbmFseXplcicsXG4gICAgICAgICAgbWVyZ2UuYWxsKFxuICAgICAgICAgICAgW1xuICAgICAgICAgICAgICBvbGRDb25maWcsXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBwcmVzZXQ6ICdjb252ZW50aW9uYWxjb21taXRzJyxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICB7IGFycmF5TWVyZ2U6IG92ZXJ3cml0ZU1lcmdlIH1cbiAgICAgICAgICApLFxuICAgICAgICBdO1xuICAgICAgfSBlbHNlIGlmIChwbHVnaW4gPT09ICdAc2VtYW50aWMtcmVsZWFzZS9naXRodWInKSB7XG4gICAgICAgIC8vIFJlbW92ZSBkZXByZWNhdGVkIHN1Y2Nlc3NDb21tZW50IGFuZCBmYWlsQ29tbWVudCBwcm9wZXJ0aWVzIGZyb20gb2xkQ29uZmlnXG4gICAgICAgIGNvbnN0IHsgZmFpbENvbW1lbnQ6IF8xLCBzdWNjZXNzQ29tbWVudDogXzIsIC4uLmNsZWFuT2xkQ29uZmlnIH0gPSBvbGRDb25maWcgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gICAgICAgIHBsdWdpbnNbaV0gPSBbXG4gICAgICAgICAgJ0BzZW1hbnRpYy1yZWxlYXNlL2dpdGh1YicsXG4gICAgICAgICAgbWVyZ2UuYWxsKFxuICAgICAgICAgICAgW1xuICAgICAgICAgICAgICBjbGVhbk9sZENvbmZpZyxcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIC8vIGNmLiBodHRwczovL2dpdGh1Yi5jb20vc2VtYW50aWMtcmVsZWFzZS9zZW1hbnRpYy1yZWxlYXNlL2lzc3Vlcy8yMjA0I2lzc3VlY29tbWVudC0xNTA4NDE3NzA0XG4gICAgICAgICAgICAgICAgc3VjY2Vzc0NvbW1lbnRDb25kaXRpb246IGZhbHNlLFxuICAgICAgICAgICAgICAgIGZhaWxDb21tZW50Q29uZGl0aW9uOiBmYWxzZSxcbiAgICAgICAgICAgICAgICBsYWJlbHM6IFsncjogc2VtYW50aWMtcmVsZWFzZSddLFxuICAgICAgICAgICAgICAgIHJlbGVhc2VkTGFiZWxzOiBbJ3JlbGVhc2VkIDpib29rbWFyazonXSxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICB7IGFycmF5TWVyZ2U6IG92ZXJ3cml0ZU1lcmdlIH1cbiAgICAgICAgICApLFxuICAgICAgICBdO1xuICAgICAgfVxuICAgIH1cbiAgICBjb25zdCBuZXdDb250ZW50ID0gSlNPTi5zdHJpbmdpZnkoc2V0dGluZ3MpO1xuICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiBmc1V0aWwuZ2VuZXJhdGVGaWxlKGZpbGVQYXRoLCBuZXdDb250ZW50KSk7XG4gIH0pO1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IG1lcmdlIGZyb20gJ2RlZXBtZXJnZSc7XG5pbXBvcnQgY2xvbmVEZWVwIGZyb20gJ2xvZGFzaC5jbG9uZWRlZXAnO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBmc1V0aWwgfSBmcm9tICcuLi91dGlscy9mc1V0aWwuanMnO1xuaW1wb3J0IHsgb3ZlcndyaXRlTWVyZ2UgfSBmcm9tICcuLi91dGlscy9tZXJnZVV0aWwuanMnO1xuaW1wb3J0IHsgcHJvbWlzZVBvb2wgfSBmcm9tICcuLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5cbmNvbnN0IGpzb25PYmogPSB7XG4gICRzY2hlbWE6ICdodHRwczovL2RvY3MucmVub3ZhdGVib3QuY29tL3Jlbm92YXRlLXNjaGVtYS5qc29uJyxcbiAgZXh0ZW5kczogWydnaXRodWI+V2lsbEJvb3N0ZXIvd2lsbGJvb3N0ZXItY29uZmlnczpyZW5vdmF0ZS5qc29uNSddLFxufTtcblxudHlwZSBTZXR0aW5ncyA9IHR5cGVvZiBqc29uT2JqICYgeyBwYWNrYWdlUnVsZXM/OiB7IG1hdGNoUGFja2FnZU5hbWVzOiBzdHJpbmdbXTsgZW5hYmxlZD86IGJvb2xlYW4gfVtdIH07XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZW5lcmF0ZVJlbm92YXRlSnNvbihjb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdnZW5lcmF0ZVJlbm92YXRlSnNvbicsIGFzeW5jICgpID0+IHtcbiAgICBsZXQgbmV3U2V0dGluZ3MgPSBjbG9uZURlZXAoanNvbk9iaikgYXMgU2V0dGluZ3M7XG4gICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICdyZW5vdmF0ZS5qc29uJyk7XG4gICAgaWYgKGZzLmV4aXN0c1N5bmMoYCR7ZmlsZVBhdGh9NWApKSB7XG4gICAgICAvLyBTaW5jZSBpdCBpcyBkaWZmaWN1bHQgZm9yIHBhcnNpbmcgcmVub3ZhdGUuanNvbjUsIHdlIGRvIG5vdGhpbmdcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IG9sZENvbnRlbnQgPSBhd2FpdCBmcy5wcm9taXNlcy5yZWFkRmlsZShmaWxlUGF0aCwgJ3V0ZjgnKTtcbiAgICAgIGNvbnN0IG9sZFNldHRpbmdzID0gSlNPTi5wYXJzZShvbGRDb250ZW50KSBhcyBTZXR0aW5ncztcbiAgICAgIG5ld1NldHRpbmdzID0gbWVyZ2UuYWxsKFtuZXdTZXR0aW5ncywgb2xkU2V0dGluZ3MsIG5ld1NldHRpbmdzXSwge1xuICAgICAgICBhcnJheU1lcmdlOiBvdmVyd3JpdGVNZXJnZSxcbiAgICAgIH0pIGFzIFNldHRpbmdzO1xuICAgICAgbmV3U2V0dGluZ3MuZXh0ZW5kcyA9IG5ld1NldHRpbmdzLmV4dGVuZHMuZmlsdGVyKChpdGVtOiBzdHJpbmcpID0+IGl0ZW0gIT09ICdAd2lsbGJvb3N0ZXInKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIGRvIG5vdGhpbmdcbiAgICB9XG5cbiAgICAvLyBEb24ndCB1cGdyYWRlIE5leHQuanMgYXV0b21hdGljYWxseVxuICAgIGlmIChjb25maWcuZGVwZW5kaW5nLmJsaXR6KSB7XG4gICAgICBuZXdTZXR0aW5ncy5wYWNrYWdlUnVsZXMgPz89IFtdO1xuICAgICAgaWYgKFxuICAgICAgICAhbmV3U2V0dGluZ3MucGFja2FnZVJ1bGVzLnNvbWUoKHJ1bGU6IHsgbWF0Y2hQYWNrYWdlTmFtZXM/OiBzdHJpbmdbXSB9KSA9PlxuICAgICAgICAgIHJ1bGUubWF0Y2hQYWNrYWdlTmFtZXM/LmluY2x1ZGVzKCduZXh0JylcbiAgICAgICAgKVxuICAgICAgKSB7XG4gICAgICAgIG5ld1NldHRpbmdzLnBhY2thZ2VSdWxlcy5wdXNoKHsgbWF0Y2hQYWNrYWdlTmFtZXM6IFsnbmV4dCddLCBlbmFibGVkOiBmYWxzZSB9KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnMucHJvbWlzZXMucm0ocGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnLmRlcGVuZGFib3QnKSwgeyBmb3JjZTogdHJ1ZSB9KSk7XG4gICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzLnByb21pc2VzLnJtKHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJy5yZW5vdmF0ZXJjLmpzb24nKSwgeyBmb3JjZTogdHJ1ZSB9KSk7XG4gICAgY29uc3QgbmV3Q29udGVudCA9IEpTT04uc3RyaW5naWZ5KG5ld1NldHRpbmdzKTtcbiAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnNVdGlsLmdlbmVyYXRlRmlsZShmaWxlUGF0aCwgbmV3Q29udGVudCkpO1xuICB9KTtcbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCBtZXJnZSBmcm9tICdkZWVwbWVyZ2UnO1xuaW1wb3J0IGNsb25lRGVlcCBmcm9tICdsb2Rhc2guY2xvbmVkZWVwJztcbmltcG9ydCB0eXBlIHsgVHNDb25maWdKc29uIH0gZnJvbSAndHlwZS1mZXN0JztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZnNVdGlsIH0gZnJvbSAnLi4vdXRpbHMvZnNVdGlsLmpzJztcbmltcG9ydCB7IGNvbWJpbmVNZXJnZSB9IGZyb20gJy4uL3V0aWxzL21lcmdlVXRpbC5qcyc7XG5pbXBvcnQgeyBzb3J0S2V5cyB9IGZyb20gJy4uL3V0aWxzL29iamVjdFV0aWwuanMnO1xuaW1wb3J0IHsgcHJvbWlzZVBvb2wgfSBmcm9tICcuLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5cbmNvbnN0IHJvb3RKc29uT2JqID0ge1xuICBjb21waWxlck9wdGlvbnM6IHtcbiAgICB0YXJnZXQ6ICdFUzIwMjInLCAvLyBiZWNhdXNlIGRlY29yYXRvcnMgc2hvdWxkIGJlIHRyYW5zcGlsZWQgdG8gRVMyMDIyIG9uIE5vZGUuanNcbiAgICBtb2R1bGU6ICdFU05leHQnLFxuICAgIG1vZHVsZVJlc29sdXRpb246ICdOb2RlJyxcbiAgICBqc3g6ICdyZWFjdC1qc3gnLFxuICAgIGFsd2F5c1N0cmljdDogdHJ1ZSxcbiAgICBzdHJpY3Q6IHRydWUsXG4gICAgbm9VbmNoZWNrZWRJbmRleGVkQWNjZXNzOiB0cnVlLCAvLyBmb3IgQHR5cGVzY3JpcHQtZXNsaW50L3ByZWZlci1udWxsaXNoLWNvYWxlc2NpbmdcbiAgICBza2lwTGliQ2hlY2s6IHRydWUsIC8vIGJlY2F1c2UgbGlicmFyaWVzIG1heSBoYXZlIGJyb2tlbiB0eXBlc1xuICAgIGFsbG93U3ludGhldGljRGVmYXVsdEltcG9ydHM6IHRydWUsIC8vIGFsbG93IGBpbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnYFxuICAgIGVzTW9kdWxlSW50ZXJvcDogdHJ1ZSwgLy8gYWxsb3cgZGVmYXVsdCBpbXBvcnQgZnJvbSBDb21tb25KUy9BTUQvVU1EIG1vZHVsZXNcbiAgICByZXNvbHZlSnNvbk1vZHVsZTogdHJ1ZSwgLy8gYWxsb3cgdG8gaW1wb3J0IEpTT04gZmlsZXNcbiAgICBkZWNsYXJhdGlvbjogdHJ1ZSxcbiAgICBzb3VyY2VNYXA6IHRydWUsXG4gICAgaW1wb3J0SGVscGVyczogZmFsc2UsXG4gICAgZXJhc2FibGVTeW50YXhPbmx5OiB0cnVlLFxuICAgIG91dERpcjogJ2Rpc3QnLFxuICAgIHR5cGVSb290czogWycuL25vZGVfbW9kdWxlcy9AdHlwZXMnLCAnLi9AdHlwZXMnXSxcbiAgfSxcbiAgZXhjbHVkZTogWydwYWNrYWdlcy8qL3Rlc3QvZml4dHVyZXMnLCAndGVzdC9maXh0dXJlcyddLFxuICBpbmNsdWRlOiBbXG4gICAgJ3BhY2thZ2VzLyovc2NyaXB0cy8qKi8qJyxcbiAgICAncGFja2FnZXMvKi9zcmMvKiovKicsXG4gICAgJ3BhY2thZ2VzLyovdGVzdC8qKi8qJyxcbiAgICAnc2NyaXB0cy8qKi8qJyxcbiAgICAnc3JjLyoqLyonLFxuICAgICd0ZXN0LyoqLyonLFxuICBdLFxufTtcblxuY29uc3Qgc3ViSnNvbk9iaiA9IHtcbiAgY29tcGlsZXJPcHRpb25zOiB7XG4gICAgdGFyZ2V0OiAnRVMyMDIyJywgLy8gYmVjYXVzZSBkZWNvcmF0b3JzIHNob3VsZCBiZSB0cmFuc3BpbGVkIHRvIEVTMjAyMiBvbiBOb2RlLmpzXG4gICAgbW9kdWxlOiAnRVNOZXh0JyxcbiAgICBtb2R1bGVSZXNvbHV0aW9uOiAnTm9kZScsXG4gICAganN4OiAncmVhY3QtanN4JyxcbiAgICBhbHdheXNTdHJpY3Q6IHRydWUsXG4gICAgc3RyaWN0OiB0cnVlLFxuICAgIG5vVW5jaGVja2VkSW5kZXhlZEFjY2VzczogdHJ1ZSwgLy8gZm9yIEB0eXBlc2NyaXB0LWVzbGludC9wcmVmZXItbnVsbGlzaC1jb2FsZXNjaW5nXG4gICAgc2tpcExpYkNoZWNrOiB0cnVlLCAvLyBiZWNhdXNlIGxpYnJhcmllcyBtYXkgaGF2ZSBicm9rZW4gdHlwZXNcbiAgICBhbGxvd1N5bnRoZXRpY0RlZmF1bHRJbXBvcnRzOiB0cnVlLCAvLyBhbGxvdyBgaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0J2BcbiAgICBlc01vZHVsZUludGVyb3A6IHRydWUsIC8vIGFsbG93IGRlZmF1bHQgaW1wb3J0IGZyb20gQ29tbW9uSlMvQU1EL1VNRCBtb2R1bGVzXG4gICAgcmVzb2x2ZUpzb25Nb2R1bGU6IHRydWUsIC8vIGFsbG93IHRvIGltcG9ydCBKU09OIGZpbGVzXG4gICAgZGVjbGFyYXRpb246IHRydWUsXG4gICAgc291cmNlTWFwOiB0cnVlLFxuICAgIGltcG9ydEhlbHBlcnM6IGZhbHNlLFxuICAgIGVyYXNhYmxlU3ludGF4T25seTogdHJ1ZSxcbiAgICBvdXREaXI6ICdkaXN0JyxcbiAgICB0eXBlUm9vdHM6IFsnLi4vLi4vbm9kZV9tb2R1bGVzL0B0eXBlcycsICcuLi8uLi9AdHlwZXMnLCAnLi9AdHlwZXMnXSxcbiAgfSxcbiAgZXhjbHVkZTogWyd0ZXN0L2ZpeHR1cmVzJ10sXG4gIGluY2x1ZGU6IFsnc2NyaXB0cy8qKi8qJywgJ3NyYy8qKi8qJywgJ3Rlc3QvKiovKiddLFxufTtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlVHNjb25maWcoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZ2VuZXJhdGVUc2NvbmZpZycsIGFzeW5jICgpID0+IHtcbiAgICBpZiAoY29uZmlnLmRlcGVuZGluZy5ibGl0eiB8fCBjb25maWcuZGVwZW5kaW5nLm5leHQpIHJldHVybjtcblxuICAgIGxldCBuZXdTZXR0aW5ncyA9IGNsb25lRGVlcChjb25maWcuaXNSb290ID8gcm9vdEpzb25PYmogOiBzdWJKc29uT2JqKSBhcyBUc0NvbmZpZ0pzb247XG4gICAgaWYgKCFjb25maWcuZG9lc0NvbnRhaW5Kc3hPclRzeCAmJiAhY29uZmlnLmRvZXNDb250YWluSnN4T3JUc3hJblBhY2thZ2VzKSB7XG4gICAgICBkZWxldGUgbmV3U2V0dGluZ3MuY29tcGlsZXJPcHRpb25zPy5qc3g7XG4gICAgfVxuICAgIGlmIChjb25maWcuaXNSb290ICYmICFjb25maWcuZG9lc0NvbnRhaW5TdWJQYWNrYWdlSnNvbnMpIHtcbiAgICAgIG5ld1NldHRpbmdzLmluY2x1ZGUgPSBuZXdTZXR0aW5ncy5pbmNsdWRlPy5maWx0ZXIoKGRpclBhdGg6IHN0cmluZykgPT4gIWRpclBhdGguc3RhcnRzV2l0aCgncGFja2FnZXMvKi8nKSk7XG4gICAgICBuZXdTZXR0aW5ncy5leGNsdWRlID0gbmV3U2V0dGluZ3MuZXhjbHVkZT8uZmlsdGVyKChkaXJQYXRoOiBzdHJpbmcpID0+ICFkaXJQYXRoLnN0YXJ0c1dpdGgoJ3BhY2thZ2VzLyovJykpO1xuICAgIH1cbiAgICBpZiAoY29uZmlnLmlzRXNtUGFja2FnZSkge1xuICAgICAgbmV3U2V0dGluZ3MuY29tcGlsZXJPcHRpb25zID0ge1xuICAgICAgICAuLi5uZXdTZXR0aW5ncy5jb21waWxlck9wdGlvbnMsXG4gICAgICAgIG1vZHVsZTogJ05vZGVOZXh0JyxcbiAgICAgICAgbW9kdWxlUmVzb2x1dGlvbjogJ05vZGVOZXh0JyxcbiAgICAgIH07XG4gICAgfVxuXG4gICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICd0c2NvbmZpZy5qc29uJyk7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGV4aXN0aW5nQ29udGVudCA9IGF3YWl0IGZzLnByb21pc2VzLnJlYWRGaWxlKGZpbGVQYXRoLCAndXRmOCcpO1xuICAgICAgY29uc3Qgb2xkU2V0dGluZ3MgPSBKU09OLnBhcnNlKGV4aXN0aW5nQ29udGVudCkgYXMgVHNDb25maWdKc29uO1xuICAgICAgaWYgKG9sZFNldHRpbmdzLmV4dGVuZHMgPT09ICcuL25vZGVfbW9kdWxlcy9Ad2lsbGJvb3N0ZXIvdHNjb25maWcvdHNjb25maWcuanNvbicpIHtcbiAgICAgICAgZGVsZXRlIG9sZFNldHRpbmdzLmV4dGVuZHM7XG4gICAgICB9XG4gICAgICAvLyBEb24ndCBtb2RpZnkgXCJ0YXJnZXRcIiwgXCJtb2R1bGVcIiBhbmQgXCJtb2R1bGVSZXNvbHV0aW9uXCIuXG4gICAgICBkZWxldGUgbmV3U2V0dGluZ3MuY29tcGlsZXJPcHRpb25zPy50YXJnZXQ7XG4gICAgICBpZiAoIWNvbmZpZy5pc0VzbVBhY2thZ2UpIHtcbiAgICAgICAgZGVsZXRlIG5ld1NldHRpbmdzLmNvbXBpbGVyT3B0aW9ucz8ubW9kdWxlO1xuICAgICAgICBkZWxldGUgbmV3U2V0dGluZ3MuY29tcGlsZXJPcHRpb25zPy5tb2R1bGVSZXNvbHV0aW9uO1xuICAgICAgfVxuICAgICAgaWYgKG9sZFNldHRpbmdzLmNvbXBpbGVyT3B0aW9ucz8uanN4KSB7XG4gICAgICAgIGRlbGV0ZSBuZXdTZXR0aW5ncy5jb21waWxlck9wdGlvbnM/LmpzeDtcbiAgICAgIH1cbiAgICAgIG5ld1NldHRpbmdzID0gbWVyZ2UuYWxsKFtuZXdTZXR0aW5ncywgb2xkU2V0dGluZ3MsIG5ld1NldHRpbmdzXSwgeyBhcnJheU1lcmdlOiBjb21iaW5lTWVyZ2UgfSk7XG4gICAgICBuZXdTZXR0aW5ncy5pbmNsdWRlID0gbmV3U2V0dGluZ3MuaW5jbHVkZT8uZmlsdGVyKFxuICAgICAgICAoZGlyUGF0aDogc3RyaW5nKSA9PlxuICAgICAgICAgICFkaXJQYXRoLmluY2x1ZGVzKCdAdHlwZXMnKSAmJiAhZGlyUGF0aC5pbmNsdWRlcygnX190ZXN0c19fLycpICYmICFkaXJQYXRoLmluY2x1ZGVzKCd0ZXN0cy8nKVxuICAgICAgKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIGRvIG5vdGhpbmdcbiAgICB9XG4gICAgc29ydEtleXMobmV3U2V0dGluZ3MpO1xuICAgIG5ld1NldHRpbmdzLmluY2x1ZGU/LnNvcnQoKTtcbiAgICBjb25zdCBuZXdDb250ZW50ID0gSlNPTi5zdHJpbmdpZnkobmV3U2V0dGluZ3MpO1xuICAgIC8vIERvbid0IHVzZSBvbGQgZGVjb3JhdG9yXG4gICAgZGVsZXRlIG5ld1NldHRpbmdzLmNvbXBpbGVyT3B0aW9ucz8uZXhwZXJpbWVudGFsRGVjb3JhdG9ycztcbiAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnNVdGlsLmdlbmVyYXRlRmlsZShmaWxlUGF0aCwgbmV3Q29udGVudCkpO1xuICB9KTtcbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCBtZXJnZSBmcm9tICdkZWVwbWVyZ2UnO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBmc1V0aWwgfSBmcm9tICcuLi91dGlscy9mc1V0aWwuanMnO1xuaW1wb3J0IHsgc29ydEtleXMgfSBmcm9tICcuLi91dGlscy9vYmplY3RVdGlsLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuXG5jb25zdCBleGNsdWRlRmlsZVBhdHRlcm5zID0gW1xuICAnKiovLmdpdC9vYmplY3RzLyoqJyxcbiAgJyoqLy5naXQvc3VidHJlZS1jYWNoZS8qKicsXG4gICcqKi9ub2RlX21vZHVsZXMvKionLFxuICAnKiovdG1wLyoqJyxcbiAgJyoqL3RlbXAvKionLFxuICAnKiovZGlzdC8qKicsXG5dO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVWc2NvZGVTZXR0aW5ncyhjb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdnZW5lcmF0ZVZzY29kZVNldHRpbmdzJywgYXN5bmMgKCkgPT4ge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJy52c2NvZGUnLCAnc2V0dGluZ3MuanNvbicpO1xuICAgICAgY29uc3QgZXhpc3RpbmdDb250ZW50ID0gYXdhaXQgZnMucHJvbWlzZXMucmVhZEZpbGUoZmlsZVBhdGgsICd1dGY4Jyk7XG4gICAgICBsZXQgc2V0dGluZ3MgPSBKU09OLnBhcnNlKGV4aXN0aW5nQ29udGVudCkgYXMgb2JqZWN0O1xuICAgICAgZm9yIChjb25zdCBleGNsdWRlRmlsZVBhdHRlcm4gb2YgZXhjbHVkZUZpbGVQYXR0ZXJucykge1xuICAgICAgICBzZXR0aW5ncyA9IG1lcmdlLmFsbChbc2V0dGluZ3MsIGV4Y2x1ZGVTZXR0aW5nKGV4Y2x1ZGVGaWxlUGF0dGVybildKTtcbiAgICAgIH1cbiAgICAgIGlmIChjb25maWcuZG9lc0NvbnRhaW5Qb2V0cnlMb2NrKSB7XG4gICAgICAgIHNldHRpbmdzID0gbWVyZ2UuYWxsKFtzZXR0aW5ncywgZXhjbHVkZVNldHRpbmcoJyoqLy52ZW52LyoqJyldKTtcbiAgICAgIH1cbiAgICAgIGlmIChjb25maWcuZGVwZW5kaW5nLm5leHQpIHtcbiAgICAgICAgc2V0dGluZ3MgPSBtZXJnZS5hbGwoW3NldHRpbmdzLCBleGNsdWRlU2V0dGluZygnKiovLm5leHQvKionKV0pO1xuICAgICAgfVxuICAgICAgLy8gTExN44Gr44KI44KLdmliZSBjb2Rpbmfjgafjga/jgIHoh6rli5Xjg5Xjgqnjg7zjg57jg4Pjg4jjgoTjgrPjg7zjg4njgqLjgq/jgrfjg6fjg7PjgpLnhKHlirnljJbjgZnjgovjgZPjgajjgadcbiAgICAgIC8vIOeUn+aIkOOBleOCjOOBn+OCs+ODvOODieOBruWFg+OBruW9ouW8j+OCkue2reaMgeOBp+OBjeOCi1xuICAgICAgaWYgKCdlZGl0b3IuY29kZUFjdGlvbnNPblNhdmUnIGluIHNldHRpbmdzKSB7XG4gICAgICAgIGRlbGV0ZSBzZXR0aW5nc1snZWRpdG9yLmNvZGVBY3Rpb25zT25TYXZlJ107XG4gICAgICB9XG4gICAgICBpZiAoJ2VkaXRvci5mb3JtYXRPblNhdmUnIGluIHNldHRpbmdzKSB7XG4gICAgICAgIGRlbGV0ZSBzZXR0aW5nc1snZWRpdG9yLmZvcm1hdE9uU2F2ZSddO1xuICAgICAgfVxuICAgICAgc29ydEtleXMoc2V0dGluZ3MgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pO1xuICAgICAgY29uc3QgbmV3Q29udGVudCA9IEpTT04uc3RyaW5naWZ5KHNldHRpbmdzLCB1bmRlZmluZWQsIDIpO1xuICAgICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzVXRpbC5nZW5lcmF0ZUZpbGUoZmlsZVBhdGgsIG5ld0NvbnRlbnQpKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIGRvIG5vdGhpbmdcbiAgICB9XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBleGNsdWRlU2V0dGluZyhleGNsdWRlRmlsZVBhdHRlcm46IHN0cmluZyk6IG9iamVjdCB7XG4gIHJldHVybiB7XG4gICAgJ2ZpbGVzLndhdGNoZXJFeGNsdWRlJzoge1xuICAgICAgW2V4Y2x1ZGVGaWxlUGF0dGVybl06IHRydWUsXG4gICAgfSxcbiAgfTtcbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB0eXBlIHsgQ29uZmlndXJhdGlvblZhbHVlTWFwIH0gZnJvbSAnQHlhcm5wa2cvY29yZSc7XG5pbXBvcnQgeWFtbCBmcm9tICdqcy15YW1sJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgcHJvbWlzZVBvb2wgfSBmcm9tICcuLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5pbXBvcnQgeyBzcGF3blN5bmMsIHNwYXduU3luY1dpdGhTdHJpbmdSZXN1bHQgfSBmcm9tICcuLi91dGlscy9zcGF3blV0aWwuanMnO1xuXG50eXBlIFNldHRpbmdzID0ge1xuICBkZWZhdWx0U2VtdmVyUmFuZ2VQcmVmaXg6IHN0cmluZztcbiAgbm1Nb2RlOiBzdHJpbmc7XG4gIG5vZGVMaW5rZXI6IHN0cmluZztcbiAgbnBtTWluaW1hbEFnZUdhdGU/OiBzdHJpbmc7XG4gIG5wbVByZWFwcHJvdmVkUGFja2FnZXM/OiBzdHJpbmdbXTtcbiAgcGx1Z2lucz86IFBsdWdpbltdO1xufSAmIFBhcnRpYWw8Q29uZmlndXJhdGlvblZhbHVlTWFwPjtcblxuaW50ZXJmYWNlIFBsdWdpbiB7XG4gIGNoZWNrc3VtOiBzdHJpbmc7XG4gIHBhdGg6IHN0cmluZztcbiAgc3BlYzogc3RyaW5nO1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVZYXJucmNZbWwoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZ2VuZXJhdGVZYXJucmNZbWwnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgeWFybnJjWW1sUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJy55YXJucmMueW1sJyk7XG4gICAgaWYgKGNvbmZpZy5pc0J1bikge1xuICAgICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzLnByb21pc2VzLnJtKHlhcm5yY1ltbFBhdGgsIHsgZm9yY2U6IHRydWUgfSkpO1xuICAgICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+XG4gICAgICAgIGZzLnByb21pc2VzLnJtKHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJy55YXJuJyksIHsgZm9yY2U6IHRydWUsIHJlY3Vyc2l2ZTogdHJ1ZSB9KVxuICAgICAgKTtcbiAgICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PlxuICAgICAgICBmcy5wcm9taXNlcy5ybShwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICd5YXJuLmxvY2snKSwgeyBmb3JjZTogdHJ1ZSwgcmVjdXJzaXZlOiB0cnVlIH0pXG4gICAgICApO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGN1cnJlbnRWZXJzaW9uID0gc3Bhd25TeW5jV2l0aFN0cmluZ1Jlc3VsdCgneWFybicsIFsnLS12ZXJzaW9uJ10sIGNvbmZpZy5kaXJQYXRoKTtcbiAgICBjb25zdCBsYXRlc3RWZXJzaW9uID0gZ2V0TGF0ZXN0VmVyc2lvbignQHlhcm5wa2cvY2xpJywgY29uZmlnLmRpclBhdGgpO1xuICAgIGlmIChnZXRNYWpvck51bWJlcihjdXJyZW50VmVyc2lvbikgPD0gZ2V0TWFqb3JOdW1iZXIobGF0ZXN0VmVyc2lvbikgJiYgY3VycmVudFZlcnNpb24gIT09IGxhdGVzdFZlcnNpb24pIHtcbiAgICAgIHNwYXduU3luYygneWFybicsIFsnc2V0JywgJ3ZlcnNpb24nLCBsYXRlc3RWZXJzaW9uXSwgY29uZmlnLmRpclBhdGgsIDEpO1xuICAgIH1cblxuICAgIGNvbnN0IHJlbGVhc2VzUGF0aCA9IHBhdGguam9pbihjb25maWcuZGlyUGF0aCwgJy55YXJuJywgJ3JlbGVhc2VzJyk7XG4gICAgYXdhaXQgZnMucHJvbWlzZXMubWtkaXIocmVsZWFzZXNQYXRoLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgICBmb3IgKGNvbnN0IGZpbGUgb2YgYXdhaXQgZnMucHJvbWlzZXMucmVhZGRpcihyZWxlYXNlc1BhdGgpKSB7XG4gICAgICBpZiAoZmlsZS5zdGFydHNXaXRoKCd5YXJuLScpICYmICFmaWxlLnN0YXJ0c1dpdGgoYHlhcm4tJHtsYXRlc3RWZXJzaW9ufS5gKSkge1xuICAgICAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnMucHJvbWlzZXMucm0ocGF0aC5qb2luKHJlbGVhc2VzUGF0aCwgZmlsZSkpKTtcbiAgICAgICAgY29uc29sZS5sb2coJ1JlbW92ZWQnLCBwYXRoLmpvaW4ocmVsZWFzZXNQYXRoLCBmaWxlKSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgeWFybnJjUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJy55YXJucmMnKTtcbiAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnMucHJvbWlzZXMucm0oeWFybnJjUGF0aCwgeyBmb3JjZTogdHJ1ZSB9KSk7XG5cbiAgICBjb25zdCBzZXR0aW5ncyA9IHlhbWwubG9hZChhd2FpdCBmcy5wcm9taXNlcy5yZWFkRmlsZSh5YXJucmNZbWxQYXRoLCAndXRmOCcpKSBhcyBTZXR0aW5ncztcbiAgICBzZXR0aW5ncy5kZWZhdWx0U2VtdmVyUmFuZ2VQcmVmaXggPSAnJztcbiAgICBzZXR0aW5ncy5ub2RlTGlua2VyID0gJ25vZGUtbW9kdWxlcyc7XG4gICAgc2V0dGluZ3Mubm1Nb2RlID0gJ2hhcmRsaW5rcy1nbG9iYWwnO1xuICAgIHNldHRpbmdzLm5wbU1pbmltYWxBZ2VHYXRlID0gJzVkJztcbiAgICBzZXR0aW5ncy5ucG1QcmVhcHByb3ZlZFBhY2thZ2VzID0gW1xuICAgICAgJ0B3aWxsYm9vc3Rlci9iYWJlbC1jb25maWdzJyxcbiAgICAgICdAd2lsbGJvb3N0ZXIvYmlvbWUtY29uZmlnJyxcbiAgICAgICdAd2lsbGJvb3N0ZXIvZXNsaW50LWNvbmZpZy1qcycsXG4gICAgICAnQHdpbGxib29zdGVyL2VzbGludC1jb25maWctanMtcmVhY3QnLFxuICAgICAgJ0B3aWxsYm9vc3Rlci9lc2xpbnQtY29uZmlnLW5leHQnLFxuICAgICAgJ0B3aWxsYm9vc3Rlci9lc2xpbnQtY29uZmlnLXRzJyxcbiAgICAgICdAd2lsbGJvb3N0ZXIvZXNsaW50LWNvbmZpZy10cy1yZWFjdCcsXG4gICAgICAnQHdpbGxib29zdGVyL3ByZXR0aWVyLWNvbmZpZycsXG4gICAgICAnQHdpbGxib29zdGVyL3diJyxcbiAgICBdO1xuICAgIGRlbGV0ZSBzZXR0aW5ncy5jb21wcmVzc2lvbkxldmVsO1xuICAgIGlmIChzZXR0aW5ncy5pbmplY3RFbnZpcm9ubWVudEZpbGVzPy5sZW5ndGggPT09IDApIHtcbiAgICAgIGRlbGV0ZSBzZXR0aW5ncy5pbmplY3RFbnZpcm9ubWVudEZpbGVzO1xuICAgIH1cbiAgICAvLyBjZi4gaHR0cHM6Ly9naXRodWIuY29tL3lhcm5wa2cvYmVycnkvcHVsbC80Njk4XG4gICAgc2V0dGluZ3MuZW5hYmxlR2xvYmFsQ2FjaGUgPSB0cnVlO1xuICAgIGNvbnN0IG9yaWdpbmFsTGVuZ3RoID0gc2V0dGluZ3MucGx1Z2lucz8ubGVuZ3RoID8/IDA7XG4gICAgc2V0dGluZ3MucGx1Z2lucyA9IHNldHRpbmdzLnBsdWdpbnM/LmZpbHRlcigocCkgPT4gcC5wYXRoICE9PSAnLnlhcm4vcGx1Z2lucy91bmRlZmluZWQuY2pzJykgPz8gW107XG4gICAgaWYgKHNldHRpbmdzLnBsdWdpbnMubGVuZ3RoICE9PSBvcmlnaW5hbExlbmd0aCkge1xuICAgICAgY29uc3QgcGx1Z2luUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJy55YXJucmMnLCAndW5kZWZpbmVkLmNqcycpO1xuICAgICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzLnByb21pc2VzLnJtKHBsdWdpblBhdGgsIHsgZm9yY2U6IHRydWUgfSkpO1xuICAgIH1cbiAgICBpZiAoc2V0dGluZ3MucGx1Z2lucy5sZW5ndGggPT09IDApIHtcbiAgICAgIGRlbGV0ZSBzZXR0aW5ncy5wbHVnaW5zO1xuICAgIH1cbiAgICBhd2FpdCBmcy5wcm9taXNlcy53cml0ZUZpbGUoeWFybnJjWW1sUGF0aCwgeWFtbC5kdW1wKHNldHRpbmdzLCB7IGxpbmVXaWR0aDogLTEgfSkpO1xuXG4gICAgc3Bhd25TeW5jKCd5YXJuJywgWydkbHgnLCAneWFybi1wbHVnaW4tYXV0by1pbnN0YWxsJ10sIGNvbmZpZy5kaXJQYXRoKTtcbiAgfSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRMYXRlc3RWZXJzaW9uKHBhY2thZ2VOYW1lOiBzdHJpbmcsIGRpclBhdGg6IHN0cmluZyk6IHN0cmluZyB7XG4gIGNvbnN0IHZlcnNpb25zSnNvbiA9IHNwYXduU3luY1dpdGhTdHJpbmdSZXN1bHQoJ25wbScsIFsnc2hvdycsIHBhY2thZ2VOYW1lLCAndmVyc2lvbnMnLCAnLS1qc29uJ10sIGRpclBhdGgpO1xuICBjb25zdCB2ZXJzaW9ucyA9IEpTT04ucGFyc2UodmVyc2lvbnNKc29uKSBhcyBzdHJpbmdbXTtcbiAgcmV0dXJuIHZlcnNpb25zLmF0KC0xKSBhcyBzdHJpbmc7XG59XG5mdW5jdGlvbiBnZXRNYWpvck51bWJlcih2ZXJzaW9uOiBzdHJpbmcpOiBudW1iZXIge1xuICBjb25zdCBbbWFqb3JdID0gdmVyc2lvbi5zcGxpdCgnLicpO1xuICByZXR1cm4gTnVtYmVyKG1ham9yKTtcbn1cbiIsImltcG9ydCB0eXBlIHsgT2N0b2tpdCB9IGZyb20gJ0BvY3Rva2l0L2NvcmUnO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBnZXRPY3Rva2l0LCBnaXRIdWJVdGlsLCBoYXNHaXRIdWJUb2tlbiB9IGZyb20gJy4uL3V0aWxzL2dpdGh1YlV0aWwuanMnO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gc2V0dXBMYWJlbHMoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignc2V0dXBMYWJlbHMnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgW293bmVyLCByZXBvXSA9IGdpdEh1YlV0aWwuZ2V0T3JnQW5kTmFtZShjb25maWcucmVwb3NpdG9yeSA/PyAnJyk7XG4gICAgaWYgKCFvd25lciB8fCAhcmVwbykgcmV0dXJuO1xuICAgIGlmIChvd25lciAhPT0gJ1dpbGxCb29zdGVyJyAmJiBvd25lciAhPT0gJ1dpbGxCb29zdGVyTGFiJykgcmV0dXJuO1xuICAgIGlmICghaGFzR2l0SHViVG9rZW4ob3duZXIpKSByZXR1cm47XG5cbiAgICBjb25zdCBvY3Rva2l0ID0gZ2V0T2N0b2tpdChvd25lcik7XG5cbiAgICB0cnkge1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ2QxOiB4LWVhc3kgOmhlZGdlaG9nOicsICdFREU5RkUnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdkMjogZWFzeSA6cmFiYml0MjonLCAnRERENkZFJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAnZDM6IG1lZGl1bSA6b3g6JywgJ0M0QjVGRCcpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ2Q0OiBoYXJkIDpzcXVpZDonLCAnQTc4QkZBJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAnZDU6IHgtaGFyZCA6d2hhbGUyOicsICc4QjVDRjYnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdwMTogY3JpdGljYWwgOmZpcmU6OmZpcmU6OmZpcmU6JywgJ0VGNDQ0NCcpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ3AyOiB1cmdlbnQgOmZpcmU6OmZpcmU6JywgJ0Y4NzE3MScpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ3AzOiBpbXBvcnRhbnQgOmZpcmU6JywgJ0ZDQTVBNScpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ3A0OiBuaWNlIHRvIGhhdmUgOmRyb3BsZXQ6JywgJ0ZFQ0FDQScpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ3I6IGJsaXR6JywgJzUzMDBiYycpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ3I6IGZpcmViYXNlJywgJ2ZmY2EyOCcpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ3I6IHByaXNtYScsICcwYzM0NGInKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdyOiByZWFjdCcsICc2MWRhZmInKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdyOiBzdmVsdGUnLCAnZmYzZTAwJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAncjogc2VtYW50aWMtcmVsZWFzZScsICc0OTQ5NDknKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdyZWFkeSA6cm9ja2V0OicsICcyMkM1NUUnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdyZXZpZXcgcmVxdWVzdGVkIDptYWc6JywgJ0ZCQ0EwNCcpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ3JlbGVhc2VkIDpib29rbWFyazonLCAnNjM2NkYxJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAnczogMC41aCA6Y2xvY2sxMjMwOicsICdGM0Y0RjYnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdzOiAxaCA6Y2xvY2sxOicsICdFNUU3RUInKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdzOiAyaCA6Y2xvY2syOicsICdEMUQ1REInKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdzOiAzaCA6Y2xvY2szOicsICc5Q0EzQUYnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdzOiA1aCA6Y2xvY2s1OicsICc2QjcyODAnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdzOiA4aCA6Y2xvY2s4OicsICc0QjU1NjMnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdzOiAxM2ggOmNsb2NrMTonLCAnMzc0MTUxJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAndDogYnVpbGQgOmhhbW1lcjonLCAnQkZEQkZFJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAndDogY2hvcmUgOmJyb29tOicsICdCRkRCRkUnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICd0OiBjaSA6Y29uc3RydWN0aW9uX3dvcmtlcjonLCAnQkZEQkZFJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAndDogZG9jcyA6bWVtbzonLCAnQkZEQkZFJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAndDogZmVhdCA6c3BhcmtsZXM6JywgJ0JGREJGRScpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ3Q6IGZpeCA6YnVnOicsICdCRkRCRkUnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICd0OiBwZXJmIDp6YXA6JywgJ0JGREJGRScpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ3Q6IHJlZmFjdG9yIDpyZWN5Y2xlOicsICdCRkRCRkUnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICd0OiBzdHlsZSA6bGlwc3RpY2s6JywgJ0JGREJGRScpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ3Q6IHRlc3QgOnRlc3RfdHViZTonLCAnQkZEQkZFJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAncHJvamVjdCcsICcyNDI5MkYnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdmb2N1c2VkIDpkYXJ0OicsICcyMkM1NUUnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdnZW4tcHItYWxsIDpyb2JvdDonLCAnMDBCNEQ4Jyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAnZ2VuLXByLWNsYXVkZSA6cm9ib3Q6JywgJzAwQjREOCcpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ2dlbi1wci1jb2RleCA6cm9ib3Q6JywgJzAwQjREOCcpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ2dlbi1wci1nZW1pbmkgOnJvYm90OicsICcwMEI0RDgnKTtcblxuICAgICAgYXdhaXQgZGVsZXRlTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdidWcnKTtcbiAgICAgIGF3YWl0IGRlbGV0ZUxhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAnZG9jdW1lbnRhdGlvbicpO1xuICAgICAgYXdhaXQgZGVsZXRlTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdkdXBsaWNhdGUnKTtcbiAgICAgIGF3YWl0IGRlbGV0ZUxhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAnZW5oYW5jZW1lbnQnKTtcbiAgICAgIGF3YWl0IGRlbGV0ZUxhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAnZ29vZCBmaXJzdCBpc3N1ZScpO1xuICAgICAgYXdhaXQgZGVsZXRlTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdoZWxwIHdhbnRlZCcpO1xuICAgICAgYXdhaXQgZGVsZXRlTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdpbnZhbGlkJyk7XG4gICAgICBhd2FpdCBkZWxldGVMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ3F1ZXN0aW9uJyk7XG4gICAgICBhd2FpdCBkZWxldGVMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ3dvbnRmaXgnKTtcblxuICAgICAgYXdhaXQgZGVsZXRlTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdyZWFkeScpO1xuICAgICAgYXdhaXQgZGVsZXRlTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdyZXZpZXcgcmVxdWVzdGVkJyk7XG4gICAgICBhd2FpdCBkZWxldGVMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ3JlbGVhc2VkJyk7XG4gICAgICBhd2FpdCBkZWxldGVMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ3NlbWFudGljLXJlbGVhc2UnKTtcbiAgICAgIGF3YWl0IGRlbGV0ZUxhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAnbGxtLXByIDpyb2JvdDonKTtcbiAgICAgIGF3YWl0IGRlbGV0ZUxhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAnYWktcHIgOnJvYm90OicpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBjb25zb2xlLndhcm4oJ1NraXAgc2V0dXBMYWJlbHMgZHVlIHRvOicsIChlcnJvciBhcyBFcnJvciB8IHVuZGVmaW5lZCk/LnN0YWNrID8/IGVycm9yKTtcbiAgICB9XG4gIH0pO1xufVxuXG5hc3luYyBmdW5jdGlvbiBzZXR1cExhYmVsKG9jdG9raXQ6IE9jdG9raXQsIG93bmVyOiBzdHJpbmcsIHJlcG86IHN0cmluZywgbmFtZTogc3RyaW5nLCBjb2xvcjogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gIHRyeSB7XG4gICAgLy8gSXNzdWVzIHBlcm1pc3Npb25cbiAgICBhd2FpdCBvY3Rva2l0LnJlcXVlc3QoJ1BPU1QgL3JlcG9zL3tvd25lcn0ve3JlcG99L2xhYmVscycsIHtcbiAgICAgIG93bmVyLFxuICAgICAgcmVwbyxcbiAgICAgIG5hbWUsXG4gICAgICBjb2xvcixcbiAgICB9KTtcbiAgfSBjYXRjaCB7XG4gICAgLy8gSXNzdWVzIHBlcm1pc3Npb25cbiAgICBhd2FpdCBvY3Rva2l0LnJlcXVlc3QoJ1BBVENIIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9sYWJlbHMve25hbWV9Jywge1xuICAgICAgb3duZXIsXG4gICAgICByZXBvLFxuICAgICAgbmFtZSxcbiAgICAgIGNvbG9yLFxuICAgIH0pO1xuICB9XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGRlbGV0ZUxhYmVsKG9jdG9raXQ6IE9jdG9raXQsIG93bmVyOiBzdHJpbmcsIHJlcG86IHN0cmluZywgbmFtZTogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gIHRyeSB7XG4gICAgLy8gSXNzdWVzIHBlcm1pc3Npb25cbiAgICBhd2FpdCBvY3Rva2l0LnJlcXVlc3QoJ0RFTEVURSAvcmVwb3Mve293bmVyfS97cmVwb30vbGFiZWxzL3tuYW1lfScsIHtcbiAgICAgIG93bmVyLFxuICAgICAgcmVwbyxcbiAgICAgIG5hbWUsXG4gICAgfSk7XG4gIH0gY2F0Y2gge1xuICAgIC8vIGRvIG5vdGhpbmdcbiAgfVxufVxuIiwiLyogZXNsaW50LWRpc2FibGUgaW1wb3J0LXgvbm8tbmFtZWQtYXMtZGVmYXVsdC1tZW1iZXIgKi9cblxuaW1wb3J0IGRvdGVudiBmcm9tICdkb3RlbnYnO1xuaW1wb3J0IHNvZGl1bSBmcm9tICdsaWJzb2RpdW0td3JhcHBlcnMnO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHsgb3B0aW9ucyB9IGZyb20gJy4uL29wdGlvbnMuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBnZXRPY3Rva2l0LCBnaXRIdWJVdGlsLCBoYXNHaXRIdWJUb2tlbiB9IGZyb20gJy4uL3V0aWxzL2dpdGh1YlV0aWwuanMnO1xuXG5jb25zdCBERVBSRUNBVEVEX1NFQ1JFVF9OQU1FUyA9IFsnUkVBRFlfRElTQ09SRF9XRUJIT09LX1VSTCcsICdHSF9CT1RfUEFUJywgJ1BVQkxJQ19HSF9CT1RfUEFUJ107XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBzZXR1cFNlY3JldHMoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignc2V0dXBTZWNyZXRzJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IFtvd25lciwgcmVwb10gPSBnaXRIdWJVdGlsLmdldE9yZ0FuZE5hbWUoY29uZmlnLnJlcG9zaXRvcnkgPz8gJycpO1xuICAgIGlmICghb3duZXIgfHwgIXJlcG8gfHwgb3duZXIgIT09ICdXaWxsQm9vc3RlckxhYicpIHJldHVybjtcbiAgICBpZiAoIWhhc0dpdEh1YlRva2VuKG93bmVyKSB8fCAhb3B0aW9ucy5kb2VzVXBsb2FkRW52VmFycykgcmV0dXJuO1xuXG4gICAgY29uc3QgcGFyc2VkID0gZG90ZW52LmNvbmZpZygpLnBhcnNlZCA/PyB7fTtcbiAgICBpZiAoT2JqZWN0LmtleXMocGFyc2VkKS5sZW5ndGggPT09IDApIHJldHVybjtcblxuICAgIGNvbnN0IG9jdG9raXQgPSBnZXRPY3Rva2l0KG93bmVyKTtcblxuICAgIHRyeSB7XG4gICAgICBmb3IgKGNvbnN0IHNlY3JldE5hbWUgb2YgREVQUkVDQVRFRF9TRUNSRVRfTkFNRVMpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAvLyBSZXF1aXJlcyBTZWNyZXRzIHBlcm1pc3Npb25cbiAgICAgICAgICBhd2FpdCBvY3Rva2l0LnJlcXVlc3QoJ0RFTEVURSAvcmVwb3Mve293bmVyfS97cmVwb30vYWN0aW9ucy9zZWNyZXRzL3tzZWNyZXRfbmFtZX0nLCB7XG4gICAgICAgICAgICBvd25lcixcbiAgICAgICAgICAgIHJlcG8sXG4gICAgICAgICAgICBzZWNyZXRfbmFtZTogc2VjcmV0TmFtZSxcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgLy8gZG8gbm90aGluZ1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIFJlcXVpcmVzIFNlY3JldHMgcGVybWlzc2lvblxuICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBvY3Rva2l0LnJlcXVlc3QoJ0dFVCAvcmVwb3Mve293bmVyfS97cmVwb30vYWN0aW9ucy9zZWNyZXRzL3B1YmxpYy1rZXknLCB7XG4gICAgICAgIG93bmVyLFxuICAgICAgICByZXBvLFxuICAgICAgfSk7XG4gICAgICBjb25zdCB7IGtleSwga2V5X2lkOiBrZXlJZCB9ID0gcmVzcG9uc2UuZGF0YTtcblxuICAgICAgYXdhaXQgc29kaXVtLnJlYWR5O1xuXG4gICAgICBmb3IgKGNvbnN0IFtuYW1lLCBzZWNyZXRdIG9mIE9iamVjdC5lbnRyaWVzKHBhcnNlZCkpIHtcbiAgICAgICAgaWYgKFxuICAgICAgICAgIG5hbWUgPT09ICdHSF9CT1RfUEFUJyB8fFxuICAgICAgICAgIG5hbWUgPT09ICdHSF9CT1RfUEFUX0ZPUl9XSUxMQk9PU1RFUicgfHxcbiAgICAgICAgICBuYW1lID09PSAnR0hfQk9UX1BBVF9GT1JfV0lMTEJPT1NURVJMQUInXG4gICAgICAgICkge1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gQ29udmVydCBTZWNyZXQgJiBCYXNlNjQga2V5IHRvIFVpbnQ4QXJyYXkuXG4gICAgICAgIGNvbnN0IHJhd0tleSA9IHNvZGl1bS5mcm9tX2Jhc2U2NChrZXksIHNvZGl1bS5iYXNlNjRfdmFyaWFudHMuT1JJR0lOQUwpO1xuICAgICAgICBjb25zdCByYXdTZWMgPSBzb2RpdW0uZnJvbV9zdHJpbmcoc2VjcmV0KTtcblxuICAgICAgICAvLyBFbmNyeXB0IHRoZSBzZWNyZXQgdXNpbmcgTGliU29kaXVtXG4gICAgICAgIGNvbnN0IGVuY0J5dGVzID0gc29kaXVtLmNyeXB0b19ib3hfc2VhbChyYXdTZWMsIHJhd0tleSk7XG5cbiAgICAgICAgLy8gQ29udmVydCBlbmNyeXB0ZWQgVWludDhBcnJheSB0byBCYXNlNjRcbiAgICAgICAgY29uc3QgZW5jQmFzZTY0ID0gc29kaXVtLnRvX2Jhc2U2NChlbmNCeXRlcywgc29kaXVtLmJhc2U2NF92YXJpYW50cy5PUklHSU5BTCk7XG5cbiAgICAgICAgLy8gUmVxdWlyZXMgU2VjcmV0cyBwZXJtaXNzaW9uXG4gICAgICAgIGF3YWl0IG9jdG9raXQucmVxdWVzdCgnUFVUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9hY3Rpb25zL3NlY3JldHMve3NlY3JldF9uYW1lfScsIHtcbiAgICAgICAgICBvd25lcixcbiAgICAgICAgICByZXBvLFxuICAgICAgICAgIHNlY3JldF9uYW1lOiBuYW1lLFxuICAgICAgICAgIGVuY3J5cHRlZF92YWx1ZTogZW5jQmFzZTY0LFxuICAgICAgICAgIGtleV9pZDoga2V5SWQsXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBjb25zb2xlLndhcm4oJ1NraXAgc2V0dXBTZWNyZXRzIGR1ZSB0bzonLCAoZXJyb3IgYXMgRXJyb3IgfCB1bmRlZmluZWQpPy5zdGFjayA/PyBlcnJvcik7XG4gICAgfVxuICB9KTtcbn1cbiIsImltcG9ydCB7IHdpdGhSZXRyeSB9IGZyb20gJ0B3aWxsYm9vc3Rlci9zaGFyZWQtbGliJztcblxuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBnZXRPY3Rva2l0LCBnaXRIdWJVdGlsLCBoYXNHaXRIdWJUb2tlbiB9IGZyb20gJy4uL3V0aWxzL2dpdGh1YlV0aWwuanMnO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gc2V0dXBHaXRIdWJTZXR0aW5ncyhjb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgW293bmVyLCByZXBvXSA9IGdpdEh1YlV0aWwuZ2V0T3JnQW5kTmFtZShjb25maWcucmVwb3NpdG9yeSA/PyAnJyk7XG4gIGlmICghb3duZXIgfHwgIXJlcG8pIHJldHVybjtcbiAgaWYgKG93bmVyICE9PSAnV2lsbEJvb3N0ZXInICYmIG93bmVyICE9PSAnV2lsbEJvb3N0ZXJMYWInKSByZXR1cm47XG4gIGlmICghaGFzR2l0SHViVG9rZW4ob3duZXIpKSByZXR1cm47XG5cbiAgY29uc3Qgb2N0b2tpdCA9IGdldE9jdG9raXQob3duZXIpO1xuXG4gIC8vIEFkbWluaXN0cmF0aW9uIHBlcm1pc3Npb25cbiAgYXdhaXQgd2l0aFJldHJ5KCgpID0+XG4gICAgb2N0b2tpdC5yZXF1ZXN0KCdQQVRDSCAvcmVwb3Mve293bmVyfS97cmVwb30nLCB7XG4gICAgICBvd25lcixcbiAgICAgIHJlcG8sXG4gICAgICBhbGxvd19hdXRvX21lcmdlOiB0cnVlLFxuICAgICAgYWxsb3dfbWVyZ2VfY29tbWl0OiBmYWxzZSxcbiAgICAgIGFsbG93X3NxdWFzaF9tZXJnZTogdHJ1ZSxcbiAgICAgIGFsbG93X3JlYmFzZV9tZXJnZTogZmFsc2UsXG4gICAgICBhbGxvd191cGRhdGVfYnJhbmNoOiB0cnVlLFxuICAgICAgZGVsZXRlX2JyYW5jaF9vbl9tZXJnZTogdHJ1ZSxcbiAgICAgIHNxdWFzaF9tZXJnZV9jb21taXRfdGl0bGU6ICdQUl9USVRMRScsXG4gICAgICBzcXVhc2hfbWVyZ2VfY29tbWl0X21lc3NhZ2U6ICdCTEFOSycsXG4gICAgICBoZWFkZXJzOiB7XG4gICAgICAgICdYLUdpdEh1Yi1BcGktVmVyc2lvbic6ICcyMDIyLTExLTI4JyxcbiAgICAgIH0sXG4gICAgICAuLi4oY29uZmlnLnJlcG9zaXRvcnk/LnN0YXJ0c1dpdGgoJ2dpdGh1YjpXaWxsQm9vc3Rlci8nKSA/IHsgYWxsb3dfYXV0b19tZXJnZTogdHJ1ZSB9IDoge30pLFxuICAgIH0pXG4gICk7XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgeyBkaXN0YW5jZSB9IGZyb20gJ2Zhc3Rlc3QtbGV2ZW5zaHRlaW4nO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBmc1V0aWwgfSBmcm9tICcuLi91dGlscy9mc1V0aWwuanMnO1xuaW1wb3J0IHsgcHJvbWlzZVBvb2wgfSBmcm9tICcuLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5cbmNvbnN0IHRlbXBsYXRlcyA9IHtcbiAgJ3B1bGxfcmVxdWVzdF90ZW1wbGF0ZS5tZCc6IGBcbkNsb3NlICM8SXNzdWVOdW1iZXI+XG5cbiMjIFNlbGYgQ2hlY2tcblxuLSBbIF0gSSd2ZSBjb25maXJtZWQgXFxgQWxsIGNoZWNrcyBoYXZlIHBhc3NlZFxcYCBvbiB0aGlzIHBhZ2UuXG4gIC0gUFIgdGl0bGUgZm9sbG93cyBbQW5ndWxhcidzIGNvbW1pdCBtZXNzYWdlIGZvcm1hdF0oaHR0cHM6Ly9naXRodWIuY29tL2FuZ3VsYXIvYW5ndWxhci9ibG9iL21haW4vQ09OVFJJQlVUSU5HLm1kIy1jb21taXQtbWVzc2FnZS1mb3JtYXQpLlxuICAtIFBSIHRpdGxlIGRvZXNuJ3QgaGF2ZSBcXGBXSVA6XFxgLlxuICAtIFRoZSB0ZXN0IGNvbW1hbmQgKGUuZy4sIFxcYHlhcm4gdGVzdFxcYCkgcGFzc2VkLlxuICAtIFRoZSBsaW50IGNvbW1hbmQgKGUuZy4sIFxcYHlhcm4gbGludFxcYCkgcGFzc2VkLlxuICAtIFlvdSBtYXkgbGVhdmUgdGhpcyBib3ggdW5jaGVja2VkIGR1ZSB0byBsb25nIHdvcmtmbG93cy5cbi0gWyBdIEkndmUgcmV2aWV3ZWQgbXkgY2hhbmdlcyBvbiB0aGUgR2l0SHViIGRpZmYgdmlldy5cbi0gWyBdIEkndmUgd3JpdHRlbiB0aGUgc3RlcHMgdG8gdGVzdCBteSBjaGFuZ2VzLlxuLSBbIF0gSSd2ZSBhZGRlZCBzY3JlZW5zaG90cyAoaWYgdGhlIFVJIGNoYW5nZWQpLlxuICAtIFlvdSBtYXkgbGVhdmUgdGhpcyBib3ggdW5jaGVja2VkIGlmIHlvdSBkaWRuJ3QgbW9kaWZ5IHRoZSBVSS5cblxuPCEtLSBQbGVhc2UgYWRkIHNjcmVlbnNob3RzIGlmIHlvdSBtb2RpZnkgdGhlIFVJLlxufCBDdXJyZW50ICAgICAgICAgICAgICAgICAgfCBJbiBjb21pbmcgICAgICAgICAgICAgICAgfFxufCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfFxufCA8aW1nIHNyYz1cIlwiIHdpZHRoPVwiNDAwXCI+IHwgPGltZyBzcmM9XCJcIiB3aWR0aD1cIjQwMFwiPiB8XG4tLT5cblxuPCEtLSBQbGVhc2UgYWRkIHN0ZXBzIHRvIHRlc3QgeW91ciBjaGFuZ2VzLlxuIyMgU3RlcHMgdG8gVGVzdFxuXG4xLiBPcGVuIGh0dHA6Ly9sb2NhbGhvc3QtZXhlcmNvZGUud2lsbGJvb3N0ZXIubmV0OjMwMDAvamEtSlAvY291cnNlcy9fZXhhbXBsZS9sZXNzb25zL19leGFtcGxlX2FfcGx1c19iL3Byb2JsZW1zL19leGFtcGxlX2FfcGx1c19iIGFmdGVyIGxvZ2luLlxuMi4gU2VsZWN0IHRoZSBsYW5ndWFnZSBcXGBDXFxgLlxuMy4gV3JpdGUgdGhlIGZvbGxvd2luZyBjb2RlOlxuICAgXFxgXFxgXFxgY1xuICAgI2luY2x1ZGUgPHN0ZGlvLmg+XG5cbiAgIGludCBtYWluKHZvaWQpIHtcbiAgICAgaW50IGEsIGI7XG5cbiAgICAgc2NhbmYoXCIlZCAlZFwiLCAmYSwgJmIpO1xuICAgICBwcmludGYoXCIlZFwiLCBhICsgYik7XG4gICAgIHJldHVybiAwO1xuICAgfVxuICAgXFxgXFxgXFxgXG40LiBQdXNoIFxcYFN1Ym1pdFxcYCBidXR0b24uXG41LiAuLi5cbi0tPlxuYC50cmltKCksXG59O1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVHaXRIdWJUZW1wbGF0ZXMoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZ2VuZXJhdGVHaXRIdWJUZW1wbGF0ZXMnLCBhc3luYyAoKSA9PiB7XG4gICAgZm9yIChjb25zdCBbZmlsZU5hbWUsIG5ld0NvbnRlbnRdIG9mIE9iamVjdC5lbnRyaWVzKHRlbXBsYXRlcykpIHtcbiAgICAgIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnLmdpdGh1YicsIGZpbGVOYW1lKTtcbiAgICAgIGlmIChmcy5leGlzdHNTeW5jKGZpbGVQYXRoKSkge1xuICAgICAgICBjb25zdCBvbGRDb250ZW50ID0gYXdhaXQgZnMucHJvbWlzZXMucmVhZEZpbGUoZmlsZVBhdGgsICd1dGY4Jyk7XG4gICAgICAgIGlmIChkaXN0YW5jZShvbGRDb250ZW50LCBuZXdDb250ZW50KSA+IG5ld0NvbnRlbnQubGVuZ3RoIC8gMikge1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGF3YWl0IGZzLnByb21pc2VzLm1rZGlyKHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJy5naXRodWInKSwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gICAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnNVdGlsLmdlbmVyYXRlRmlsZShmaWxlUGF0aCwgbmV3Q29udGVudCkpO1xuICAgIH1cbiAgfSk7XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgZnNwIGZyb20gJ25vZGU6ZnMvcHJvbWlzZXMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IGZnIGZyb20gJ2Zhc3QtZ2xvYic7XG5pbXBvcnQgeyBzaW1wbGVHaXQgfSBmcm9tICdzaW1wbGUtZ2l0JztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUpzb24gfSBmcm9tICd0eXBlLWZlc3QnO1xuaW1wb3J0IHsgeiB9IGZyb20gJ3pvZCc7XG5cbmltcG9ydCB7IGdldE9jdG9raXQsIGdpdEh1YlV0aWwgfSBmcm9tICcuL3V0aWxzL2dpdGh1YlV0aWwuanMnO1xuaW1wb3J0IHsgZ2xvYklnbm9yZSB9IGZyb20gJy4vdXRpbHMvZ2xvYlV0aWwuanMnO1xuXG5leHBvcnQgaW50ZXJmYWNlIFBhY2thZ2VDb25maWcge1xuICBkaXJQYXRoOiBzdHJpbmc7XG4gIGRvY2tlcmZpbGU6IHN0cmluZztcbiAgaXNSb290OiBib29sZWFuO1xuICBpc1B1YmxpY1JlcG86IGJvb2xlYW47XG4gIGlzUmVmZXJyZWRCeU90aGVyUmVwbzogYm9vbGVhbjtcbiAgcmVwb3NpdG9yeT86IHN0cmluZztcbiAgaXNXaWxsQm9vc3RlclJlcG86IGJvb2xlYW47XG4gIGlzQnVuOiBib29sZWFuO1xuICBpc0VzbVBhY2thZ2U6IGJvb2xlYW47XG4gIGlzV2lsbEJvb3N0ZXJDb25maWdzOiBib29sZWFuO1xuICAvLyBkZXBlbmRlbmN5IGluZm9ybWF0aW9uXG4gIGRvZXNDb250YWluU3ViUGFja2FnZUpzb25zOiBib29sZWFuO1xuICBkb2VzQ29udGFpbkRvY2tlcmZpbGU6IGJvb2xlYW47XG4gIGRvZXNDb250YWluR2VtZmlsZTogYm9vbGVhbjtcbiAgZG9lc0NvbnRhaW5Hb01vZDogYm9vbGVhbjtcbiAgZG9lc0NvbnRhaW5QYWNrYWdlSnNvbjogYm9vbGVhbjtcbiAgZG9lc0NvbnRhaW5Qb2V0cnlMb2NrOiBib29sZWFuO1xuICBkb2VzQ29udGFpblBvbVhtbDogYm9vbGVhbjtcbiAgZG9lc0NvbnRhaW5QdWJzcGVjWWFtbDogYm9vbGVhbjtcbiAgZG9lc0NvbnRhaW5UZW1wbGF0ZVlhbWw6IGJvb2xlYW47XG4gIGRvZXNDb250YWluVnNjb2RlU2V0dGluZ3NKc29uOiBib29sZWFuO1xuICAvLyBzb3VyY2UgY29kZSBmaWxlc1xuICBkb2VzQ29udGFpbkphdmFTY3JpcHQ6IGJvb2xlYW47XG4gIGRvZXNDb250YWluVHlwZVNjcmlwdDogYm9vbGVhbjtcbiAgZG9lc0NvbnRhaW5Kc3hPclRzeDogYm9vbGVhbjtcbiAgZG9lc0NvbnRhaW5KYXZhU2NyaXB0SW5QYWNrYWdlczogYm9vbGVhbjtcbiAgZG9lc0NvbnRhaW5UeXBlU2NyaXB0SW5QYWNrYWdlczogYm9vbGVhbjtcbiAgZG9lc0NvbnRhaW5Kc3hPclRzeEluUGFja2FnZXM6IGJvb2xlYW47XG5cbiAgaGFzU3RhcnRUZXN0OiBib29sZWFuO1xuXG4gIGRlcGVuZGluZzoge1xuICAgIGJsaXR6OiBib29sZWFuO1xuICAgIGZpcmViYXNlOiBib29sZWFuO1xuICAgIGdlbkkxOG5UczogYm9vbGVhbjtcbiAgICBsaXRlc3RyZWFtOiBib29sZWFuO1xuICAgIG5leHQ6IGJvb2xlYW47XG4gICAgcGxheXdyaWdodFRlc3Q6IGJvb2xlYW47XG4gICAgcHJpc21hOiBib29sZWFuO1xuICAgIHB5cmlnaHQ6IGJvb2xlYW47XG4gICAgcmVhY3Q6IGJvb2xlYW47XG4gICAgcmVhY3ROYXRpdmU6IGJvb2xlYW47XG4gICAgc2VtYW50aWNSZWxlYXNlOiBib29sZWFuO1xuICAgIHN0b3J5Ym9vazogYm9vbGVhbjtcbiAgICB3YjogYm9vbGVhbjtcbiAgfTtcbiAgcmVsZWFzZToge1xuICAgIGJyYW5jaGVzOiBzdHJpbmdbXTtcbiAgICBnaXRodWI6IGJvb2xlYW47XG4gICAgbnBtOiBib29sZWFuO1xuICB9O1xuICBlc2xpbnRCYXNlPzogRXNsaW50RXh0ZW5zaW9uQmFzZTtcbiAgdmVyc2lvbnNUZXh0Pzogc3RyaW5nO1xuICBwYWNrYWdlSnNvbj86IFBhY2thZ2VKc29uO1xuICB3YmZ5SnNvbj86IFdiZnlKc29uO1xufVxuXG50eXBlIFdiZnlKc29uID0gei5pbmZlcjx0eXBlb2Ygd2JmeUpzb25TY2hlbWE+O1xuXG5jb25zdCB3YmZ5SnNvblNjaGVtYSA9IHoub2JqZWN0KHtcbiAgdHlwb3M6IHpcbiAgICAub2JqZWN0KHtcbiAgICAgIGFsbDogei5yZWNvcmQoei5zdHJpbmcoKSwgei5zdHJpbmcoKSkub3B0aW9uYWwoKSxcbiAgICAgIGRvYzogei5yZWNvcmQoei5zdHJpbmcoKSwgei5zdHJpbmcoKSkub3B0aW9uYWwoKSxcbiAgICAgIHRzOiB6LnJlY29yZCh6LnN0cmluZygpLCB6LnN0cmluZygpKS5vcHRpb25hbCgpLFxuICAgICAgdGV4dDogei5yZWNvcmQoei5zdHJpbmcoKSwgei5zdHJpbmcoKSkub3B0aW9uYWwoKSxcbiAgICB9KVxuICAgIC5vcHRpb25hbCgpLFxufSk7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZXRQYWNrYWdlQ29uZmlnKFxuICBkaXJQYXRoOiBzdHJpbmcsXG4gIHJvb3RDb25maWc/OiBQYWNrYWdlQ29uZmlnXG4pOiBQcm9taXNlPFBhY2thZ2VDb25maWcgfCB1bmRlZmluZWQ+IHtcbiAgY29uc3QgcGFja2FnZUpzb25QYXRoID0gcGF0aC5yZXNvbHZlKGRpclBhdGgsICdwYWNrYWdlLmpzb24nKTtcbiAgdHJ5IHtcbiAgICBjb25zdCBkb2VzQ29udGFpblBhY2thZ2VKc29uID0gZnMuZXhpc3RzU3luYyhwYWNrYWdlSnNvblBhdGgpO1xuICAgIGxldCBkZXBlbmRlbmNpZXM6IFBhY2thZ2VKc29uWydkZXBlbmRlbmNpZXMnXSA9IHt9O1xuICAgIGxldCBkZXZEZXBlbmRlbmNpZXM6IFBhY2thZ2VKc29uWydkZXZEZXBlbmRlbmNpZXMnXSA9IHt9O1xuICAgIGxldCBwYWNrYWdlSnNvbjogUGFja2FnZUpzb24gPSB7fTtcbiAgICBsZXQgZXNtUGFja2FnZSA9IGZhbHNlO1xuICAgIGlmIChkb2VzQ29udGFpblBhY2thZ2VKc29uKSB7XG4gICAgICBjb25zdCBwYWNrYWdlSnNvblRleHQgPSBmcy5yZWFkRmlsZVN5bmMocGFja2FnZUpzb25QYXRoLCAndXRmOCcpO1xuICAgICAgcGFja2FnZUpzb24gPSBKU09OLnBhcnNlKHBhY2thZ2VKc29uVGV4dCkgYXMgUGFja2FnZUpzb247XG4gICAgICBkZXBlbmRlbmNpZXMgPSBwYWNrYWdlSnNvbi5kZXBlbmRlbmNpZXMgPz8ge307XG4gICAgICBkZXZEZXBlbmRlbmNpZXMgPSBwYWNrYWdlSnNvbi5kZXZEZXBlbmRlbmNpZXMgPz8ge307XG4gICAgICBlc21QYWNrYWdlID0gcGFja2FnZUpzb24udHlwZSA9PT0gJ21vZHVsZSc7XG4gICAgfVxuXG4gICAgbGV0IHJlbGVhc2VCcmFuY2hlczogc3RyaW5nW10gPSBbXTtcbiAgICBsZXQgcmVsZWFzZVBsdWdpbnM6IHN0cmluZ1tdID0gW107XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJlbGVhc2VyY0pzb25QYXRoID0gcGF0aC5yZXNvbHZlKGRpclBhdGgsICcucmVsZWFzZXJjLmpzb24nKTtcbiAgICAgIGNvbnN0IGpzb24gPSBKU09OLnBhcnNlKGF3YWl0IGZzcC5yZWFkRmlsZShyZWxlYXNlcmNKc29uUGF0aCwgJ3V0ZjgnKSkgYXNcbiAgICAgICAgfCB7XG4gICAgICAgICAgICBicmFuY2hlczogc3RyaW5nW107XG4gICAgICAgICAgICBwbHVnaW5zPzogc3RyaW5nW11bXTtcbiAgICAgICAgICB9XG4gICAgICAgIHwgdW5kZWZpbmVkO1xuICAgICAgcmVsZWFzZUJyYW5jaGVzID0ganNvbj8uYnJhbmNoZXMgPz8gW107XG4gICAgICByZWxlYXNlUGx1Z2lucyA9IGpzb24/LnBsdWdpbnM/LmZsYXQoKSA/PyBbXTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIGRvIG5vdGhpbmdcbiAgICB9XG5cbiAgICBjb25zdCBpc1Jvb3QgPVxuICAgICAgcGF0aC5iYXNlbmFtZShwYXRoLnJlc29sdmUoZGlyUGF0aCwgJy4uJykpICE9PSAncGFja2FnZXMnIHx8XG4gICAgICAhZnMuZXhpc3RzU3luYyhwYXRoLnJlc29sdmUoZGlyUGF0aCwgJy4uJywgJy4uJywgJ3BhY2thZ2UuanNvbicpKTtcblxuICAgIGxldCByZXBvSW5mbzogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gfCB1bmRlZmluZWQ7XG4gICAgaWYgKGlzUm9vdCkge1xuICAgICAgcmVwb0luZm8gPSBhd2FpdCBmZXRjaFJlcG9JbmZvKGRpclBhdGgsIHBhY2thZ2VKc29uKTtcbiAgICB9XG5cbiAgICBsZXQgdmVyc2lvbnNUZXh0ID0gJyc7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGNvbnRlbnQgPSBhd2FpdCBmc3AucmVhZEZpbGUocGF0aC5yZXNvbHZlKGRpclBhdGgsICcudG9vbC12ZXJzaW9ucycpLCAndXRmOCcpO1xuICAgICAgdmVyc2lvbnNUZXh0ICs9IGNvbnRlbnQudHJpbSgpO1xuICAgIH0gY2F0Y2gge1xuICAgICAgLy8gZG8gbm90aGluZ1xuICAgIH1cbiAgICBmb3IgKGNvbnN0IFtwcmVmaXgsIG5hbWVdIG9mIFtcbiAgICAgIFsnamF2YScsICdqYXZhJ10sXG4gICAgICBbJ25vZGUnLCAnbm9kZWpzJ10sXG4gICAgICBbJ3B5dGhvbicsICdweXRob24nXSxcbiAgICBdKSB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBub2RlVmVyc2lvbkNvbnRlbnQgPSBhd2FpdCBmc3AucmVhZEZpbGUocGF0aC5yZXNvbHZlKGRpclBhdGgsIGAuJHtwcmVmaXh9LXZlcnNpb25gKSwgJ3V0ZjgnKTtcbiAgICAgICAgaWYgKHZlcnNpb25zVGV4dCkge1xuICAgICAgICAgIHZlcnNpb25zVGV4dCArPSAnXFxuJztcbiAgICAgICAgfVxuICAgICAgICB2ZXJzaW9uc1RleHQgKz0gYCR7bmFtZX0gJHtub2RlVmVyc2lvbkNvbnRlbnQudHJpbSgpfWA7XG4gICAgICB9IGNhdGNoIHtcbiAgICAgICAgLy8gZG8gbm90aGluZ1xuICAgICAgfVxuICAgIH1cblxuICAgIGxldCBkb2NrZXJmaWxlID0gJyc7XG4gICAgdHJ5IHtcbiAgICAgIGRvY2tlcmZpbGUgPSBhd2FpdCBmc3AucmVhZEZpbGUocGF0aC5yZXNvbHZlKGRpclBhdGgsICdEb2NrZXJmaWxlJyksICd1dGY4Jyk7XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBkbyBub3RoaW5nXG4gICAgfVxuXG4gICAgLy8gUmVhZCB3YmZ5Lmpzb25cbiAgICBjb25zdCB3YmZ5SnNvblBhdGggPSBwYXRoLnJlc29sdmUoZGlyUGF0aCwgJ3diZnkuanNvbicpO1xuICAgIGxldCB3YmZ5SnNvbjogV2JmeUpzb24gfCB1bmRlZmluZWQ7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHdiZnlKc29uVGV4dCA9IGF3YWl0IGZzcC5yZWFkRmlsZSh3YmZ5SnNvblBhdGgsICd1dGY4Jyk7XG4gICAgICB3YmZ5SnNvbiA9IHdiZnlKc29uU2NoZW1hLnBhcnNlKEpTT04ucGFyc2Uod2JmeUpzb25UZXh0KSk7XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBkbyBub3RoaW5nXG4gICAgfVxuXG4gICAgY29uc3QgcmVwb3NpdG9yeSA9IHJlcG9JbmZvPy5mdWxsX25hbWUgPyBgZ2l0aHViOiR7cmVwb0luZm8uZnVsbF9uYW1lIGFzIHN0cmluZ31gIDogdW5kZWZpbmVkO1xuICAgIGNvbnN0IGNvbmZpZzogUGFja2FnZUNvbmZpZyA9IHtcbiAgICAgIGRpclBhdGgsXG4gICAgICBkb2NrZXJmaWxlLFxuICAgICAgaXNSb290LFxuICAgICAgaXNQdWJsaWNSZXBvOiByZXBvSW5mbz8ucHJpdmF0ZSA9PT0gZmFsc2UsXG4gICAgICBpc1JlZmVycmVkQnlPdGhlclJlcG86ICEhcGFja2FnZUpzb24uZmlsZXMsXG4gICAgICByZXBvc2l0b3J5OiByZXBvSW5mbz8uZnVsbF9uYW1lID8gYGdpdGh1Yjoke3JlcG9JbmZvLmZ1bGxfbmFtZSBhcyBzdHJpbmd9YCA6IHVuZGVmaW5lZCxcbiAgICAgIGlzV2lsbEJvb3N0ZXJSZXBvOiBCb29sZWFuKFxuICAgICAgICByZXBvc2l0b3J5Py5zdGFydHNXaXRoKCdnaXRodWI6V2lsbEJvb3N0ZXIvJykgfHwgcmVwb3NpdG9yeT8uc3RhcnRzV2l0aCgnZ2l0aHViOldpbGxCb29zdGVyTGFiLycpXG4gICAgICApLFxuICAgICAgaXNCdW46IHJvb3RDb25maWc/LmlzQnVuIHx8IGZzLmV4aXN0c1N5bmMocGF0aC5qb2luKGRpclBhdGgsICdidW5maWcudG9tbCcpKSxcbiAgICAgIGlzRXNtUGFja2FnZTogZXNtUGFja2FnZSxcbiAgICAgIGlzV2lsbEJvb3N0ZXJDb25maWdzOiBwYWNrYWdlSnNvblBhdGguaW5jbHVkZXMoYCR7cGF0aC5zZXB9d2lsbGJvb3N0ZXItY29uZmlnc2ApLFxuICAgICAgZG9lc0NvbnRhaW5TdWJQYWNrYWdlSnNvbnM6IGNvbnRhaW5zQW55KCdwYWNrYWdlcy8qKi9wYWNrYWdlLmpzb24nLCBkaXJQYXRoKSxcbiAgICAgIGRvZXNDb250YWluRG9ja2VyZmlsZTogISFkb2NrZXJmaWxlIHx8IGZzLmV4aXN0c1N5bmMocGF0aC5yZXNvbHZlKGRpclBhdGgsICdkb2NrZXItY29tcG9zZS55bWwnKSksXG4gICAgICBkb2VzQ29udGFpbkdlbWZpbGU6IGZzLmV4aXN0c1N5bmMocGF0aC5yZXNvbHZlKGRpclBhdGgsICdHZW1maWxlJykpLFxuICAgICAgZG9lc0NvbnRhaW5Hb01vZDogZnMuZXhpc3RzU3luYyhwYXRoLnJlc29sdmUoZGlyUGF0aCwgJ2dvLm1vZCcpKSxcbiAgICAgIGRvZXNDb250YWluUGFja2FnZUpzb246IGZzLmV4aXN0c1N5bmMocGF0aC5yZXNvbHZlKGRpclBhdGgsICdwYWNrYWdlLmpzb24nKSksXG4gICAgICBkb2VzQ29udGFpblBvZXRyeUxvY2s6IGZzLmV4aXN0c1N5bmMocGF0aC5yZXNvbHZlKGRpclBhdGgsICdwb2V0cnkubG9jaycpKSxcbiAgICAgIGRvZXNDb250YWluUG9tWG1sOiBmcy5leGlzdHNTeW5jKHBhdGgucmVzb2x2ZShkaXJQYXRoLCAncG9tLnhtbCcpKSxcbiAgICAgIGRvZXNDb250YWluUHVic3BlY1lhbWw6IGZzLmV4aXN0c1N5bmMocGF0aC5yZXNvbHZlKGRpclBhdGgsICdwdWJzcGVjLnlhbWwnKSksXG4gICAgICBkb2VzQ29udGFpblRlbXBsYXRlWWFtbDogZnMuZXhpc3RzU3luYyhwYXRoLnJlc29sdmUoZGlyUGF0aCwgJ3RlbXBsYXRlLnlhbWwnKSksXG4gICAgICBkb2VzQ29udGFpblZzY29kZVNldHRpbmdzSnNvbjogZnMuZXhpc3RzU3luYyhwYXRoLnJlc29sdmUoZGlyUGF0aCwgJy52c2NvZGUnLCAnc2V0dGluZ3MuanNvbicpKSxcbiAgICAgIGRvZXNDb250YWluSmF2YVNjcmlwdDogY29udGFpbnNBbnkoJ3thcHAsc3JjLHRlc3Qsc2NyaXB0c30vKiovKi57Y2pzLG1qcyxqcyxqc3h9JywgZGlyUGF0aCksXG4gICAgICBkb2VzQ29udGFpblR5cGVTY3JpcHQ6IGNvbnRhaW5zQW55KCd7YXBwLHNyYyx0ZXN0LHNjcmlwdHN9LyoqLyoue2N0cyxtdHMsdHMsdHN4fScsIGRpclBhdGgpLFxuICAgICAgZG9lc0NvbnRhaW5Kc3hPclRzeDogY29udGFpbnNBbnkoJ3thcHAsc3JjLHRlc3R9LyoqLyoue3Qsan1zeCcsIGRpclBhdGgpLFxuICAgICAgZG9lc0NvbnRhaW5KYXZhU2NyaXB0SW5QYWNrYWdlczogY29udGFpbnNBbnkoJ3BhY2thZ2VzLyoqL3thcHAsc3JjLHRlc3Qsc2NyaXB0c30vKiovKi57Y2pzLG1qcyxqcyxqc3h9JywgZGlyUGF0aCksXG4gICAgICBkb2VzQ29udGFpblR5cGVTY3JpcHRJblBhY2thZ2VzOiBjb250YWluc0FueSgncGFja2FnZXMvKiove2FwcCxzcmMsdGVzdCxzY3JpcHRzfS8qKi8qLntjdHMsbXRzLHRzLHRzeH0nLCBkaXJQYXRoKSxcbiAgICAgIGRvZXNDb250YWluSnN4T3JUc3hJblBhY2thZ2VzOiBjb250YWluc0FueSgncGFja2FnZXMvKiove2FwcCxzcmMsdGVzdH0vKiovKi57dCxqfXN4JywgZGlyUGF0aCksXG4gICAgICBoYXNTdGFydFRlc3Q6ICEhcGFja2FnZUpzb24uc2NyaXB0cz8uWydzdGFydC10ZXN0J10sXG4gICAgICBkZXBlbmRpbmc6IHtcbiAgICAgICAgYmxpdHo6ICEhZGVwZW5kZW5jaWVzLmJsaXR6LFxuICAgICAgICBmaXJlYmFzZTogISFkZXZEZXBlbmRlbmNpZXNbJ2ZpcmViYXNlLXRvb2xzJ10sXG4gICAgICAgIGdlbkkxOG5UczogISFkZXZEZXBlbmRlbmNpZXNbJ2dlbi1pMThuLXRzJ10sXG4gICAgICAgIGxpdGVzdHJlYW06IGRvY2tlcmZpbGUuaW5jbHVkZXMoJ2luc3RhbGwtbGl0ZXN0cmVhbS5zaCcpLFxuICAgICAgICByZWFjdDogISFkZXBlbmRlbmNpZXMucmVhY3QsXG4gICAgICAgIG5leHQ6ICEhZGVwZW5kZW5jaWVzLm5leHQsXG4gICAgICAgIHBsYXl3cmlnaHRUZXN0OlxuICAgICAgICAgICEhZGVwZW5kZW5jaWVzWydAcGxheXdyaWdodC90ZXN0J10gfHwgISFkZXZEZXBlbmRlbmNpZXNbJ0BwbGF5d3JpZ2h0L3Rlc3QnXSB8fCAhIWRldkRlcGVuZGVuY2llcy5wbGF5d3JpZ2h0LFxuICAgICAgICBwcmlzbWE6ICEhZGVwZW5kZW5jaWVzWydAcHJpc21hL2NsaWVudCddIHx8ICEhZGV2RGVwZW5kZW5jaWVzLnByaXNtYSxcbiAgICAgICAgcHlyaWdodDogISFkZXZEZXBlbmRlbmNpZXMucHlyaWdodCxcbiAgICAgICAgcmVhY3ROYXRpdmU6ICEhZGVwZW5kZW5jaWVzWydyZWFjdC1uYXRpdmUnXSxcbiAgICAgICAgc2VtYW50aWNSZWxlYXNlOiAhIShcbiAgICAgICAgICBkZXZEZXBlbmRlbmNpZXNbJ3NlbWFudGljLXJlbGVhc2UnXSB8fFxuICAgICAgICAgIHJlbGVhc2VCcmFuY2hlcy5sZW5ndGggPiAwIHx8XG4gICAgICAgICAgcmVsZWFzZVBsdWdpbnMubGVuZ3RoID4gMFxuICAgICAgICApLFxuICAgICAgICBzdG9yeWJvb2s6ICEhZGV2RGVwZW5kZW5jaWVzWydAc3Rvcnlib29rL3JlYWN0J10sXG4gICAgICAgIHdiOiAhIWRlcGVuZGVuY2llc1snQHdpbGxib29zdGVyL3diJ10gfHwgISFkZXZEZXBlbmRlbmNpZXNbJ0B3aWxsYm9vc3Rlci93YiddLFxuICAgICAgfSxcbiAgICAgIHJlbGVhc2U6IHtcbiAgICAgICAgYnJhbmNoZXM6IHJlbGVhc2VCcmFuY2hlcyxcbiAgICAgICAgZ2l0aHViOiByZWxlYXNlUGx1Z2lucy5pbmNsdWRlcygnQHNlbWFudGljLXJlbGVhc2UvZ2l0aHViJyksXG4gICAgICAgIG5wbTogcmVsZWFzZVBsdWdpbnMuaW5jbHVkZXMoJ0BzZW1hbnRpYy1yZWxlYXNlL25wbScpLFxuICAgICAgfSxcbiAgICAgIHZlcnNpb25zVGV4dCxcbiAgICAgIHBhY2thZ2VKc29uLFxuICAgICAgd2JmeUpzb24sXG4gICAgfTtcbiAgICBpZiAoIWNvbmZpZy5pc0J1bikge1xuICAgICAgY29uZmlnLmVzbGludEJhc2UgPSBnZXRFc2xpbnRFeHRlbnNpb25CYXNlKGNvbmZpZyk7XG4gICAgfVxuICAgIGlmIChcbiAgICAgIGNvbmZpZy5kb2VzQ29udGFpbkdlbWZpbGUgfHxcbiAgICAgIGNvbmZpZy5kb2VzQ29udGFpbkdvTW9kIHx8XG4gICAgICBjb25maWcuZG9lc0NvbnRhaW5QYWNrYWdlSnNvbiB8fFxuICAgICAgY29uZmlnLmRvZXNDb250YWluUG9ldHJ5TG9jayB8fFxuICAgICAgY29uZmlnLmRvZXNDb250YWluUG9tWG1sIHx8XG4gICAgICBjb25maWcuZG9lc0NvbnRhaW5QdWJzcGVjWWFtbCB8fFxuICAgICAgY29uZmlnLmRvZXNDb250YWluVGVtcGxhdGVZYW1sXG4gICAgKSB7XG4gICAgICByZXR1cm4gY29uZmlnO1xuICAgIH1cbiAgfSBjYXRjaCB7XG4gICAgLy8gZG8gbm90aGluZ1xuICB9XG59XG5cbmZ1bmN0aW9uIGNvbnRhaW5zQW55KHBhdHRlcm46IHN0cmluZywgZGlyUGF0aDogc3RyaW5nKTogYm9vbGVhbiB7XG4gIHJldHVybiBmZy5nbG9iU3luYyhwYXR0ZXJuLCB7IGRvdDogdHJ1ZSwgY3dkOiBkaXJQYXRoLCBpZ25vcmU6IGdsb2JJZ25vcmUgfSkubGVuZ3RoID4gMDtcbn1cblxuZXhwb3J0IHR5cGUgRXNsaW50RXh0ZW5zaW9uQmFzZSA9XG4gIHwgJ0B3aWxsYm9vc3Rlci9lc2xpbnQtY29uZmlnLXRzLXJlYWN0J1xuICB8ICdAd2lsbGJvb3N0ZXIvZXNsaW50LWNvbmZpZy10cydcbiAgfCAnQHdpbGxib29zdGVyL2VzbGludC1jb25maWctanMtcmVhY3QnXG4gIHwgJ0B3aWxsYm9vc3Rlci9lc2xpbnQtY29uZmlnLWpzJ1xuICB8ICdAd2lsbGJvb3N0ZXIvZXNsaW50LWNvbmZpZy1uZXh0JztcblxuZnVuY3Rpb24gZ2V0RXNsaW50RXh0ZW5zaW9uQmFzZShjb25maWc6IFBhY2thZ2VDb25maWcpOiBFc2xpbnRFeHRlbnNpb25CYXNlIHwgdW5kZWZpbmVkIHtcbiAgaWYgKGNvbmZpZy5kZXBlbmRpbmcubmV4dCkge1xuICAgIHJldHVybiAnQHdpbGxib29zdGVyL2VzbGludC1jb25maWctbmV4dCc7XG4gIH0gZWxzZSBpZiAoY29uZmlnLmRvZXNDb250YWluVHlwZVNjcmlwdCkge1xuICAgIHJldHVybiBjb25maWcuZG9lc0NvbnRhaW5Kc3hPclRzeCA/ICdAd2lsbGJvb3N0ZXIvZXNsaW50LWNvbmZpZy10cy1yZWFjdCcgOiAnQHdpbGxib29zdGVyL2VzbGludC1jb25maWctdHMnO1xuICB9IGVsc2Uge1xuICAgIGlmIChjb25maWcuZG9lc0NvbnRhaW5Kc3hPclRzeCkge1xuICAgICAgcmV0dXJuICdAd2lsbGJvb3N0ZXIvZXNsaW50LWNvbmZpZy1qcy1yZWFjdCc7XG4gICAgfSBlbHNlIGlmIChjb25maWcuZG9lc0NvbnRhaW5KYXZhU2NyaXB0KSB7XG4gICAgICByZXR1cm4gJ0B3aWxsYm9vc3Rlci9lc2xpbnQtY29uZmlnLWpzJztcbiAgICB9XG4gIH1cbn1cblxuYXN5bmMgZnVuY3Rpb24gZmV0Y2hSZXBvSW5mbyhkaXJQYXRoOiBzdHJpbmcsIHBhY2thZ2VKc29uOiBQYWNrYWdlSnNvbik6IFByb21pc2U8UmVjb3JkPHN0cmluZywgdW5rbm93bj4gfCB1bmRlZmluZWQ+IHtcbiAgY29uc3QgZ2l0ID0gc2ltcGxlR2l0KGRpclBhdGgpO1xuICBjb25zdCByZW1vdGVzID0gYXdhaXQgZ2l0LmdldFJlbW90ZXModHJ1ZSk7XG4gIGNvbnN0IG9yaWdpbiA9IHJlbW90ZXMuZmluZCgocikgPT4gci5uYW1lID09PSAnb3JpZ2luJyk7XG4gIGNvbnN0IHJlbW90ZVVybCA9IG9yaWdpbj8ucmVmcy5mZXRjaCA/PyBvcmlnaW4/LnJlZnMucHVzaDtcbiAgaWYgKHR5cGVvZiByZW1vdGVVcmwgPT09ICdzdHJpbmcnKSB7XG4gICAgY29uc3QganNvbiA9IGF3YWl0IHJlcXVlc3RSZXBvSW5mbyhyZW1vdGVVcmwpO1xuICAgIGlmIChqc29uKSByZXR1cm4ganNvbjtcbiAgfVxuXG4gIGNvbnN0IHVybCA9IHR5cGVvZiBwYWNrYWdlSnNvbi5yZXBvc2l0b3J5ID09PSAnc3RyaW5nJyA/IHBhY2thZ2VKc29uLnJlcG9zaXRvcnkgOiBwYWNrYWdlSnNvbi5yZXBvc2l0b3J5Py51cmw7XG4gIGlmICh1cmwpIHtcbiAgICBjb25zdCBqc29uID0gYXdhaXQgcmVxdWVzdFJlcG9JbmZvKHVybCk7XG4gICAgaWYgKGpzb24gJiYganNvbi5tZXNzYWdlICE9PSAnTm90IEZvdW5kJykgcmV0dXJuIGpzb247XG4gIH1cbn1cblxuYXN5bmMgZnVuY3Rpb24gcmVxdWVzdFJlcG9JbmZvKHVybE9yRnVsbE5hbWU6IHN0cmluZyk6IFByb21pc2U8UmVjb3JkPHN0cmluZywgdW5rbm93bj4gfCB1bmRlZmluZWQ+IHtcbiAgY29uc3QgW29yZywgbmFtZV0gPSBnaXRIdWJVdGlsLmdldE9yZ0FuZE5hbWUodXJsT3JGdWxsTmFtZSk7XG4gIGlmICghb3JnIHx8ICFuYW1lKSByZXR1cm47XG5cbiAgY29uc3QgcmV0ID0geyBmdWxsX25hbWU6IGAke29yZ30vJHtuYW1lfWAgfTtcbiAgdHJ5IHtcbiAgICAvLyBNZXRhZGF0YSBwZXJtaXNzaW9uXG4gICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBnZXRPY3Rva2l0KCkucmVxdWVzdCgnR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfScsIHtcbiAgICAgIG93bmVyOiBvcmcsXG4gICAgICByZXBvOiBuYW1lLFxuICAgIH0pO1xuICAgIE9iamVjdC5hc3NpZ24ocmV0LCByZXNwb25zZS5kYXRhKTtcbiAgfSBjYXRjaCB7XG4gICAgLy8gZG8gbm90aGluZ1xuICB9XG4gIHJldHVybiByZXQ7XG59XG4iLCJpbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcblxuY29uc3QgRVNMSU5UX0NPTkZJR19QUkVGSVggPSAnQHdpbGxib29zdGVyL2VzbGludC1jb25maWctJztcblxuZXhwb3J0IGZ1bmN0aW9uIHNob3VsZFNraXBXaWxsYm9vc3RlckNvbmZpZ3NFc2xpbnRQYWNrYWdlKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IGJvb2xlYW4ge1xuICByZXR1cm4gY29uZmlnLmlzV2lsbEJvb3N0ZXJDb25maWdzICYmIGNvbmZpZy5wYWNrYWdlSnNvbj8ubmFtZT8uc3RhcnRzV2l0aChFU0xJTlRfQ09ORklHX1BSRUZJWCkgPT09IHRydWU7XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgeyBpZ25vcmVFcnJvckFzeW5jIH0gZnJvbSAnQHdpbGxib29zdGVyL3NoYXJlZC1saWInO1xuaW1wb3J0IGZnIGZyb20gJ2Zhc3QtZ2xvYic7XG5pbXBvcnQgeWFyZ3MgZnJvbSAneWFyZ3MnO1xuXG5pbXBvcnQgeyBmaXhEb2NrZXJmaWxlIH0gZnJvbSAnLi9maXhlcnMvZG9ja2VyZmlsZS5qcyc7XG5pbXBvcnQgeyBmaXhOZXh0Q29uZmlnSnNvbiB9IGZyb20gJy4vZml4ZXJzL25leHRDb25maWcuanMnO1xuaW1wb3J0IHsgZml4UGxheXdyaWdodENvbmZpZyB9IGZyb20gJy4vZml4ZXJzL3BsYXl3cmlnaHRDb25maWcuanMnO1xuaW1wb3J0IHsgZml4UHJpc21hRW52RmlsZXMgfSBmcm9tICcuL2ZpeGVycy9wcmlzbWEuanMnO1xuaW1wb3J0IHsgZml4VGVzdERpcmVjdG9yaWVzVXBkYXRpbmdQYWNrYWdlSnNvbiB9IGZyb20gJy4vZml4ZXJzL3Rlc3REaXJlY3RvcnkuanMnO1xuaW1wb3J0IHsgZml4VHlwZURlZmluaXRpb25zIH0gZnJvbSAnLi9maXhlcnMvdHlwZURlZmluaXRpb24uanMnO1xuaW1wb3J0IHsgZml4VHlwb3MgfSBmcm9tICcuL2ZpeGVycy90eXBvcy5qcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZUFnZW50SW5zdHJ1Y3Rpb25zIH0gZnJvbSAnLi9nZW5lcmF0b3JzL2FnZW50cy5qcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZVRvb2xWZXJzaW9ucyB9IGZyb20gJy4vZ2VuZXJhdG9ycy9hc2RmLmpzJztcbmltcG9ydCB7IGdlbmVyYXRlQmlvbWVKc29uYyB9IGZyb20gJy4vZ2VuZXJhdG9ycy9iaW9tZS5qcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZUJ1bmZpZ1RvbWwgfSBmcm9tICcuL2dlbmVyYXRvcnMvYnVuZmlnLmpzJztcbmltcG9ydCB7IGdlbmVyYXRlRG9ja2VyaWdub3JlIH0gZnJvbSAnLi9nZW5lcmF0b3JzL2RvY2tlcmlnbm9yZS5qcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZUVkaXRvcmNvbmZpZyB9IGZyb20gJy4vZ2VuZXJhdG9ycy9lZGl0b3Jjb25maWcuanMnO1xuaW1wb3J0IHsgZ2VuZXJhdGVFc2xpbnRyYyB9IGZyb20gJy4vZ2VuZXJhdG9ycy9lc2xpbnRDb25maWcuanMnO1xuaW1wb3J0IHsgZ2VuZXJhdGVHZW1pbmlDb25maWcgfSBmcm9tICcuL2dlbmVyYXRvcnMvZ2VtaW5pQ29uZmlnLmpzJztcbmltcG9ydCB7IHJlbW92ZUdlbWluaVNldHRpbmdzIH0gZnJvbSAnLi9nZW5lcmF0b3JzL2dlbWluaVNldHRpbmdzLmpzJztcbmltcG9ydCB7IGdlbmVyYXRlR2l0YXR0cmlidXRlcyB9IGZyb20gJy4vZ2VuZXJhdG9ycy9naXRhdHRyaWJ1dGVzLmpzJztcbmltcG9ydCB7IGdlbmVyYXRlR2l0aWdub3JlIH0gZnJvbSAnLi9nZW5lcmF0b3JzL2dpdGlnbm9yZS5qcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZUh1c2t5cmNVcGRhdGluZ1BhY2thZ2VKc29uIH0gZnJvbSAnLi9nZW5lcmF0b3JzL2h1c2t5cmMuanMnO1xuaW1wb3J0IHsgZ2VuZXJhdGVJZGVhU2V0dGluZ3MgfSBmcm9tICcuL2dlbmVyYXRvcnMvaWRlYS5qcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZUxlZnRob29rVXBkYXRpbmdQYWNrYWdlSnNvbiB9IGZyb20gJy4vZ2VuZXJhdG9ycy9sZWZ0aG9vay5qcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZUxpbnRzdGFnZWRyYyB9IGZyb20gJy4vZ2VuZXJhdG9ycy9saW50c3RhZ2VkcmMuanMnO1xuaW1wb3J0IHsgZ2VuZXJhdGVQYWNrYWdlSnNvbiB9IGZyb20gJy4vZ2VuZXJhdG9ycy9wYWNrYWdlSnNvbi5qcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZVByZXR0aWVyaWdub3JlIH0gZnJvbSAnLi9nZW5lcmF0b3JzL3ByZXR0aWVyaWdub3JlLmpzJztcbmltcG9ydCB7IGdlbmVyYXRlUHlyaWdodENvbmZpZ0pzb24gfSBmcm9tICcuL2dlbmVyYXRvcnMvcHlyaWdodENvbmZpZy5qcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZVJlYWRtZSB9IGZyb20gJy4vZ2VuZXJhdG9ycy9yZWFkbWUuanMnO1xuaW1wb3J0IHsgZ2VuZXJhdGVSZWxlYXNlcmMgfSBmcm9tICcuL2dlbmVyYXRvcnMvcmVsZWFzZXJjLmpzJztcbmltcG9ydCB7IGdlbmVyYXRlUmVub3ZhdGVKc29uIH0gZnJvbSAnLi9nZW5lcmF0b3JzL3Jlbm92YXRlSnNvbi5qcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZVRzY29uZmlnIH0gZnJvbSAnLi9nZW5lcmF0b3JzL3RzY29uZmlnLmpzJztcbmltcG9ydCB7IGdlbmVyYXRlVnNjb2RlU2V0dGluZ3MgfSBmcm9tICcuL2dlbmVyYXRvcnMvdnNjb2RlU2V0dGluZ3MuanMnO1xuaW1wb3J0IHsgZ2VuZXJhdGVXb3JrZmxvd3MsIGlzUmV1c2FibGVXb3JrZmxvd3NSZXBvIH0gZnJvbSAnLi9nZW5lcmF0b3JzL3dvcmtmbG93LmpzJztcbmltcG9ydCB7IGdlbmVyYXRlWWFybnJjWW1sIH0gZnJvbSAnLi9nZW5lcmF0b3JzL3lhcm5yYy5qcyc7XG5pbXBvcnQgeyBzZXR1cExhYmVscyB9IGZyb20gJy4vZ2l0aHViL2xhYmVsLmpzJztcbmltcG9ydCB7IHNldHVwU2VjcmV0cyB9IGZyb20gJy4vZ2l0aHViL3NlY3JldC5qcyc7XG5pbXBvcnQgeyBzZXR1cEdpdEh1YlNldHRpbmdzIH0gZnJvbSAnLi9naXRodWIvc2V0dGluZ3MuanMnO1xuaW1wb3J0IHsgZ2VuZXJhdGVHaXRIdWJUZW1wbGF0ZXMgfSBmcm9tICcuL2dpdGh1Yi90ZW1wbGF0ZS5qcyc7XG5pbXBvcnQgeyBvcHRpb25zIH0gZnJvbSAnLi9vcHRpb25zLmpzJztcbmltcG9ydCB7IGdldFBhY2thZ2VDb25maWcgfSBmcm9tICcuL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgcHJvbWlzZVBvb2wgfSBmcm9tICcuL3V0aWxzL3Byb21pc2VQb29sLmpzJztcbmltcG9ydCB7IHNwYXduU3luYyB9IGZyb20gJy4vdXRpbHMvc3Bhd25VdGlsLmpzJztcbmltcG9ydCB7IHNob3VsZFNraXBXaWxsYm9vc3RlckNvbmZpZ3NFc2xpbnRQYWNrYWdlIH0gZnJvbSAnLi91dGlscy93aWxsYm9vc3RlckNvbmZpZ3NVdGlsLmpzJztcblxuYXN5bmMgZnVuY3Rpb24gbWFpbigpOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgYXJndiA9IGF3YWl0IHlhcmdzKHByb2Nlc3MuYXJndi5zbGljZSgyKSlcbiAgICAuY29tbWFuZCgnJDAgW3BhdGhzLi5dJywgJ01ha2UgYSBnaXZlbiBwcm9qZWN0IGZvbGxvdyB0aGUgV2lsbEJvb3N0ZXIgc3RhbmRhcmQnLCAoeWFyZ3MpID0+IHtcbiAgICAgIHlhcmdzLnBvc2l0aW9uYWwoJ3BhdGhzJywge1xuICAgICAgICBkZXNjcmliZTogJ3Byb2plY3QgcGF0aHMgdG8gYmUgd2JmaWVkJyxcbiAgICAgICAgYXJyYXk6IHRydWUsXG4gICAgICAgIHR5cGU6ICdzdHJpbmcnLFxuICAgICAgICBkZWZhdWx0OiBbJy4nXSxcbiAgICAgIH0pO1xuICAgIH0pXG4gICAgLm9wdGlvbnMoe1xuICAgICAgZW52OiB7XG4gICAgICAgIGRlc2NyaXB0aW9uOiAnVXBsb2FkIGVudmlyb25tZW50IHZhcmlhYmxlcyBhcyBzZWNyZXRzIHRvIEdpdEh1YicsXG4gICAgICAgIHR5cGU6ICdib29sZWFuJyxcbiAgICAgICAgZGVmYXVsdDogZmFsc2UsXG4gICAgICAgIGFsaWFzOiAnZScsXG4gICAgICB9LFxuICAgICAgc2tpcERlcHM6IHtcbiAgICAgICAgZGVzY3JpcHRpb246ICdTa2lwIGRlcGVuZGVuY3kgaW5zdGFsbGF0aW9uJyxcbiAgICAgICAgdHlwZTogJ2Jvb2xlYW4nLFxuICAgICAgICBkZWZhdWx0OiBmYWxzZSxcbiAgICAgICAgYWxpYXM6ICdkJyxcbiAgICAgIH0sXG4gICAgICB2ZXJib3NlOiB7XG4gICAgICAgIGRlc2NyaXB0aW9uOiAnV2hldGhlciBvciBub3QgdG8gZW5hYmxlIHZlcmJvc2UgbW9kZScsXG4gICAgICAgIHR5cGU6ICdib29sZWFuJyxcbiAgICAgICAgZGVmYXVsdDogZmFsc2UsXG4gICAgICAgIGFsaWFzOiAndicsXG4gICAgICB9LFxuICAgIH0pXG4gICAgLnZlcnNpb24oZ2V0VmVyc2lvbigpKVxuICAgIC5zdHJpY3QoKS5hcmd2O1xuICBvcHRpb25zLmlzVmVyYm9zZSA9IGFyZ3YudmVyYm9zZTtcbiAgb3B0aW9ucy5kb2VzVXBsb2FkRW52VmFycyA9IGFyZ3YuZW52O1xuXG4gIGZvciAoY29uc3Qgcm9vdERpclBhdGggb2YgYXJndi5wYXRocyBhcyBzdHJpbmdbXSkge1xuICAgIC8vIENsZWFuIHVwIGxvY2sgZmlsZXMgYW5kIG5vZGVfbW9kdWxlcyBkaXJlY3Rvcmllc1xuICAgIGZzLnJtU3luYyhwYXRoLmpvaW4ocm9vdERpclBhdGgsICdidW4ubG9jaycpLCB7IGZvcmNlOiB0cnVlIH0pO1xuICAgIGZzLnJtU3luYyhwYXRoLmpvaW4ocm9vdERpclBhdGgsICd5YXJuLmxvY2snKSwgeyBmb3JjZTogdHJ1ZSB9KTtcbiAgICByZW1vdmVOb2RlTW9kdWxlc0RpcmVjdG9yaWVzKHJvb3REaXJQYXRoKTtcblxuICAgIGNvbnN0IHBhY2thZ2VzRGlyUGF0aCA9IHBhdGguam9pbihyb290RGlyUGF0aCwgJ3BhY2thZ2VzJyk7XG4gICAgY29uc3QgZGlyZW50cyA9IChhd2FpdCBpZ25vcmVFcnJvckFzeW5jKCgpID0+IGZzLnByb21pc2VzLnJlYWRkaXIocGFja2FnZXNEaXJQYXRoLCB7IHdpdGhGaWxlVHlwZXM6IHRydWUgfSkpKSA/PyBbXTtcbiAgICBjb25zdCBzdWJEaXJQYXRocyA9IGRpcmVudHMuZmlsdGVyKChkKSA9PiBkLmlzRGlyZWN0b3J5KCkpLm1hcCgoZCkgPT4gcGF0aC5qb2luKHBhY2thZ2VzRGlyUGF0aCwgZC5uYW1lKSk7XG5cbiAgICBhd2FpdCBmaXhUZXN0RGlyZWN0b3JpZXNVcGRhdGluZ1BhY2thZ2VKc29uKFtyb290RGlyUGF0aCwgLi4uc3ViRGlyUGF0aHNdKTtcblxuICAgIGNvbnN0IHJvb3RDb25maWcgPSBhd2FpdCBnZXRQYWNrYWdlQ29uZmlnKHJvb3REaXJQYXRoKTtcbiAgICBjb25zb2xlLmxvZygncm9vdENvbmZpZzonLCByb290Q29uZmlnKTtcbiAgICBpZiAoIXJvb3RDb25maWcpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoYHRoZXJlIGlzIG5vIHZhbGlkIHBhY2thZ2UuanNvbiBpbiAke3Jvb3REaXJQYXRofWApO1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGNvbnN0IGFiYnJldmlhdGlvblByb21pc2UgPSBmaXhUeXBvcyhyb290Q29uZmlnKTtcblxuICAgIGNvbnN0IG51bGxhYmxlU3ViUGFja2FnZUNvbmZpZ3MgPSBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgIHN1YkRpclBhdGhzLm1hcCgoc3ViRGlyUGF0aCkgPT4gZ2V0UGFja2FnZUNvbmZpZyhzdWJEaXJQYXRoLCByb290Q29uZmlnKSlcbiAgICApO1xuICAgIGNvbnN0IHN1YlBhY2thZ2VDb25maWdzID0gbnVsbGFibGVTdWJQYWNrYWdlQ29uZmlncy5maWx0ZXIoKGNvbmZpZykgPT4gISFjb25maWcpO1xuICAgIGNvbnN0IGFsbFBhY2thZ2VDb25maWdzID0gW3Jvb3RDb25maWcsIC4uLnN1YlBhY2thZ2VDb25maWdzXTtcblxuICAgIGlmIChvcHRpb25zLmlzVmVyYm9zZSkge1xuICAgICAgZm9yIChjb25zdCBjb25maWcgb2YgYWxsUGFja2FnZUNvbmZpZ3MpIHtcbiAgICAgICAgY29uc29sZS5pbmZvKGNvbmZpZyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gSW5zdGFsbCB0b29scyB2aWEgYXNkZiBhdCBmaXJzdFxuICAgIGF3YWl0IGdlbmVyYXRlVG9vbFZlcnNpb25zKHJvb3RDb25maWcpO1xuICAgIC8vIEluc3RhbGwgeWFybiBiZXJyeVxuICAgIGF3YWl0IGdlbmVyYXRlWWFybnJjWW1sKHJvb3RDb25maWcpO1xuICAgIGlmIChyb290Q29uZmlnLmlzQnVuKSB7XG4gICAgICBhd2FpdCBnZW5lcmF0ZUJ1bmZpZ1RvbWwocm9vdENvbmZpZyk7XG4gICAgfVxuXG4gICAgY29uc3Qgc2hvdWxkUnVuV29ya2Zsb3dzID1cbiAgICAgICFpc1JldXNhYmxlV29ya2Zsb3dzUmVwbyhyb290Q29uZmlnLnJlcG9zaXRvcnkpICYmXG4gICAgICAocm9vdENvbmZpZy5yZXBvc2l0b3J5Py5zdGFydHNXaXRoKCdnaXRodWI6V2lsbEJvb3N0ZXIvJykgfHxcbiAgICAgICAgcm9vdENvbmZpZy5yZXBvc2l0b3J5Py5zdGFydHNXaXRoKCdnaXRodWI6V2lsbEJvb3N0ZXJMYWIvJykpO1xuICAgIGF3YWl0IFByb21pc2UuYWxsKFtcbiAgICAgIGZpeERvY2tlcmZpbGUocm9vdENvbmZpZyksXG4gICAgICBmaXhQcmlzbWFFbnZGaWxlcyhyb290Q29uZmlnKSxcbiAgICAgIGFiYnJldmlhdGlvblByb21pc2UudGhlbigoKSA9PiBnZW5lcmF0ZVJlYWRtZShyb290Q29uZmlnKSksXG4gICAgICBnZW5lcmF0ZUFnZW50SW5zdHJ1Y3Rpb25zKHJvb3RDb25maWcsIGFsbFBhY2thZ2VDb25maWdzKSxcbiAgICAgIGdlbmVyYXRlRG9ja2VyaWdub3JlKHJvb3RDb25maWcpLFxuICAgICAgZ2VuZXJhdGVFZGl0b3Jjb25maWcocm9vdENvbmZpZyksXG4gICAgICBnZW5lcmF0ZUdlbWluaUNvbmZpZyhyb290Q29uZmlnKSxcbiAgICAgIHJlbW92ZUdlbWluaVNldHRpbmdzKHJvb3RDb25maWcpLFxuICAgICAgZ2VuZXJhdGVHaXRhdHRyaWJ1dGVzKHJvb3RDb25maWcpLFxuICAgICAgZ2VuZXJhdGVHaXRIdWJUZW1wbGF0ZXMocm9vdENvbmZpZyksXG4gICAgICBnZW5lcmF0ZUlkZWFTZXR0aW5ncyhyb290Q29uZmlnKSxcbiAgICAgIGdlbmVyYXRlUmVub3ZhdGVKc29uKHJvb3RDb25maWcpLFxuICAgICAgZ2VuZXJhdGVSZWxlYXNlcmMocm9vdENvbmZpZyksXG4gICAgICAuLi4oc2hvdWxkUnVuV29ya2Zsb3dzID8gW2dlbmVyYXRlV29ya2Zsb3dzKHJvb3RDb25maWcpXSA6IFtdKSxcbiAgICAgIHNldHVwTGFiZWxzKHJvb3RDb25maWcpLFxuICAgICAgc2V0dXBTZWNyZXRzKHJvb3RDb25maWcpLFxuICAgICAgc2V0dXBHaXRIdWJTZXR0aW5ncyhyb290Q29uZmlnKSxcbiAgICAgIHJvb3RDb25maWcuaXNCdW5cbiAgICAgICAgPyBnZW5lcmF0ZUh1c2t5cmNVcGRhdGluZ1BhY2thZ2VKc29uKHJvb3RDb25maWcpLnRoZW4oKCkgPT4gZ2VuZXJhdGVMZWZ0aG9va1VwZGF0aW5nUGFja2FnZUpzb24ocm9vdENvbmZpZykpXG4gICAgICAgIDogZ2VuZXJhdGVIdXNreXJjVXBkYXRpbmdQYWNrYWdlSnNvbihyb290Q29uZmlnKSxcbiAgICAgIGdlbmVyYXRlTGludHN0YWdlZHJjKHJvb3RDb25maWcpLFxuICAgIF0pO1xuICAgIGF3YWl0IHByb21pc2VQb29sLnByb21pc2VBbGwoKTtcblxuICAgIGNvbnN0IHByb21pc2VzOiBQcm9taXNlPHZvaWQ+W10gPSBbXTtcbiAgICBmb3IgKGNvbnN0IGNvbmZpZyBvZiBhbGxQYWNrYWdlQ29uZmlncykge1xuICAgICAgaWYgKHNob3VsZFNraXBXaWxsYm9vc3RlckNvbmZpZ3NFc2xpbnRQYWNrYWdlKGNvbmZpZykpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBpZiAoY29uZmlnLmRvZXNDb250YWluVHlwZVNjcmlwdCB8fCBjb25maWcuZG9lc0NvbnRhaW5UeXBlU2NyaXB0SW5QYWNrYWdlcykge1xuICAgICAgICBwcm9taXNlcy5wdXNoKGZpeFR5cGVEZWZpbml0aW9ucyhjb25maWcsIGNvbmZpZy5pc1Jvb3QgPyBhbGxQYWNrYWdlQ29uZmlncyA6IFtjb25maWddKSk7XG4gICAgICB9XG4gICAgICBpZiAoY29uZmlnLmRlcGVuZGluZy5wbGF5d3JpZ2h0VGVzdCkge1xuICAgICAgICBwcm9taXNlcy5wdXNoKGZpeFBsYXl3cmlnaHRDb25maWcoY29uZmlnKSk7XG4gICAgICB9XG4gICAgICBpZiAoY29uZmlnLmRlcGVuZGluZy5uZXh0KSB7XG4gICAgICAgIHByb21pc2VzLnB1c2goZml4TmV4dENvbmZpZ0pzb24oY29uZmlnKSk7XG4gICAgICB9XG4gICAgICBhd2FpdCBnZW5lcmF0ZUdpdGlnbm9yZShjb25maWcsIHJvb3RDb25maWcpO1xuICAgICAgYXdhaXQgcHJvbWlzZVBvb2wucHJvbWlzZUFsbCgpO1xuICAgICAgaWYgKCFjb25maWcuaXNSb290ICYmICFjb25maWcuZG9lc0NvbnRhaW5QYWNrYWdlSnNvbikge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGF3YWl0IGdlbmVyYXRlUHJldHRpZXJpZ25vcmUoY29uZmlnKTtcbiAgICAgIGF3YWl0IGdlbmVyYXRlUGFja2FnZUpzb24oY29uZmlnLCByb290Q29uZmlnLCBhcmd2LnNraXBEZXBzKTtcblxuICAgICAgcHJvbWlzZXMucHVzaChnZW5lcmF0ZUxpbnRzdGFnZWRyYyhjb25maWcpKTtcbiAgICAgIGlmIChjb25maWcuZG9lc0NvbnRhaW5Wc2NvZGVTZXR0aW5nc0pzb24gJiYgY29uZmlnLmRvZXNDb250YWluUGFja2FnZUpzb24pIHtcbiAgICAgICAgcHJvbWlzZXMucHVzaChnZW5lcmF0ZVZzY29kZVNldHRpbmdzKGNvbmZpZykpO1xuICAgICAgfVxuICAgICAgaWYgKGNvbmZpZy5kb2VzQ29udGFpblR5cGVTY3JpcHQgfHwgY29uZmlnLmRvZXNDb250YWluVHlwZVNjcmlwdEluUGFja2FnZXMpIHtcbiAgICAgICAgcHJvbWlzZXMucHVzaChnZW5lcmF0ZVRzY29uZmlnKGNvbmZpZykpO1xuICAgICAgfVxuICAgICAgaWYgKFxuICAgICAgICBjb25maWcuZG9lc0NvbnRhaW5KYXZhU2NyaXB0IHx8XG4gICAgICAgIGNvbmZpZy5kb2VzQ29udGFpbkphdmFTY3JpcHRJblBhY2thZ2VzIHx8XG4gICAgICAgIGNvbmZpZy5kb2VzQ29udGFpblR5cGVTY3JpcHQgfHxcbiAgICAgICAgY29uZmlnLmRvZXNDb250YWluVHlwZVNjcmlwdEluUGFja2FnZXNcbiAgICAgICkge1xuICAgICAgICBpZiAocm9vdENvbmZpZy5pc0J1bikge1xuICAgICAgICAgIHByb21pc2VzLnB1c2goZ2VuZXJhdGVCaW9tZUpzb25jKGNvbmZpZykpO1xuICAgICAgICB9XG4gICAgICAgIGlmICghcm9vdENvbmZpZy5pc1dpbGxCb29zdGVyQ29uZmlncykge1xuICAgICAgICAgIHByb21pc2VzLnB1c2goZ2VuZXJhdGVFc2xpbnRyYyhjb25maWcpKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKGNvbmZpZy5kZXBlbmRpbmcucHlyaWdodCkge1xuICAgICAgICBwcm9taXNlcy5wdXNoKGdlbmVyYXRlUHlyaWdodENvbmZpZ0pzb24oY29uZmlnKSk7XG4gICAgICB9XG4gICAgfVxuICAgIGF3YWl0IFByb21pc2UuYWxsKHByb21pc2VzKTtcbiAgICBhd2FpdCBwcm9taXNlUG9vbC5wcm9taXNlQWxsKCk7XG5cbiAgICBjb25zdCBwYWNrYWdlTWFuYWdlciA9IHJvb3RDb25maWcuaXNCdW4gPyAnYnVuJyA6ICd5YXJuJztcbiAgICAvLyBSZWZyZXNoIGxvY2sgZmlsZXNcbiAgICBpZiAocm9vdENvbmZpZy5pc0J1bikge1xuICAgICAgZnMucm1TeW5jKHBhdGguam9pbihyb290RGlyUGF0aCwgJ2J1bi5sb2NrJyksIHsgZm9yY2U6IHRydWUgfSk7XG4gICAgICBzcGF3blN5bmMocGFja2FnZU1hbmFnZXIsIFsndXBkYXRlJ10sIHJvb3REaXJQYXRoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgZnMucm1TeW5jKHBhdGguam9pbihyb290RGlyUGF0aCwgJ3lhcm4ubG9jaycpLCB7IGZvcmNlOiB0cnVlIH0pO1xuICAgICAgc3Bhd25TeW5jKHBhY2thZ2VNYW5hZ2VyLCBbJ2luc3RhbGwnLCAnLS1uby1pbW11dGFibGUnXSwgcm9vdERpclBhdGgpO1xuICAgIH1cbiAgICBzcGF3blN5bmMocGFja2FnZU1hbmFnZXIsIFsnY2xlYW51cCddLCByb290RGlyUGF0aCk7XG4gICAgLy8gJ3lhcm4gaW5zdGFsbCcgc2hvdWxkIGJlIGFmdGVyIGB5YXJuIGNsZWFudXBgIGJlY2F1c2UgeWFybiBiZXJyeSBnZW5lcmF0ZXMgeWFybi5sb2NrXG4gICAgLy8gY29ycmVzcG9uZGluZyB0byB0aGUgY29udGVudHMgb2YgZGVwZW5kYW50IHN1Yi1wYWNrYWdlIGluIG1vbm9yZXBvXG4gICAgaWYgKCFyb290Q29uZmlnLmlzQnVuKSB7XG4gICAgICBzcGF3blN5bmMocGFja2FnZU1hbmFnZXIsIFsnaW5zdGFsbCcsICctLW5vLWltbXV0YWJsZSddLCByb290RGlyUGF0aCk7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIHJlbW92ZU5vZGVNb2R1bGVzRGlyZWN0b3JpZXMoZGlyUGF0aDogc3RyaW5nKTogdm9pZCB7XG4gIGNvbnN0IG5vZGVNb2R1bGVzUGF0aHMgPSBuZXcgU2V0KFtwYXRoLmpvaW4oZGlyUGF0aCwgJ25vZGVfbW9kdWxlcycpXSk7XG4gIGNvbnN0IGdsb2JiZWRQYXRocyA9IGZnLmdsb2JTeW5jKCcqKi9ub2RlX21vZHVsZXMnLCB7XG4gICAgY3dkOiBkaXJQYXRoLFxuICAgIGRvdDogdHJ1ZSxcbiAgICBvbmx5RGlyZWN0b3JpZXM6IHRydWUsXG4gICAgZm9sbG93U3ltYm9saWNMaW5rczogZmFsc2UsXG4gIH0pO1xuICBmb3IgKGNvbnN0IG5vZGVNb2R1bGVzUGF0aCBvZiBnbG9iYmVkUGF0aHMpIHtcbiAgICBub2RlTW9kdWxlc1BhdGhzLmFkZChwYXRoLnJlc29sdmUoZGlyUGF0aCwgbm9kZU1vZHVsZXNQYXRoKSk7XG4gIH1cbiAgZm9yIChjb25zdCBub2RlTW9kdWxlc1BhdGggb2Ygbm9kZU1vZHVsZXNQYXRocykge1xuICAgIHRyeSB7XG4gICAgICBmcy5ybVN5bmMobm9kZU1vZHVsZXNQYXRoLCB7IHJlY3Vyc2l2ZTogdHJ1ZSwgZm9yY2U6IHRydWUgfSk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNvbnNvbGUud2FybihlcnJvcik7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGdldFZlcnNpb24oKTogc3RyaW5nIHtcbiAgbGV0IHBhY2thZ2VKc29uRGlyID0gcGF0aC5kaXJuYW1lKG5ldyBVUkwoaW1wb3J0Lm1ldGEudXJsKS5wYXRobmFtZSk7XG4gIHdoaWxlICghZnMuZXhpc3RzU3luYyhwYXRoLmpvaW4ocGFja2FnZUpzb25EaXIsICdwYWNrYWdlLmpzb24nKSkpIHtcbiAgICBwYWNrYWdlSnNvbkRpciA9IHBhdGguZGlybmFtZShwYWNrYWdlSnNvbkRpcik7XG4gIH1cbiAgY29uc3QgcGFja2FnZUpzb24gPSBKU09OLnBhcnNlKGZzLnJlYWRGaWxlU3luYyhwYXRoLmpvaW4ocGFja2FnZUpzb25EaXIsICdwYWNrYWdlLmpzb24nKSwgJ3V0ZjgnKSkgYXMge1xuICAgIHZlcnNpb246IHN0cmluZztcbiAgfTtcbiAgcmV0dXJuIHBhY2thZ2VKc29uLnZlcnNpb247XG59XG5cbmF3YWl0IG1haW4oKTtcbiJdLCJuYW1lcyI6WyJvcHRpb25zIiwiaXNWZXJib3NlIiwiZG9lc1VwbG9hZEVudlZhcnMiLCJsb2dnZXIiLCJmdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uIiwibmFtZSIsImZ1bmMiLCJjb25zb2xlIiwiaW5mbyIsImVycm9yIiwiRXJyb3IiLCJzdGFjayIsIlN0cmluZyIsImFzeW5jIiwiZml4RG9ja2VyZmlsZSIsImNvbmZpZyIsImRvZXNDb250YWluRG9ja2VyZmlsZSIsIm9sZENvbnRlbnQiLCJkb2NrZXJmaWxlIiwibmV3Q29udGVudCIsImZzIiwid3JpdGVGaWxlIiwicGF0aCIsImpvaW4iLCJkaXJQYXRoIiwiZnNVdGlsIiwicmVhZEZpbGVJZ25vcmluZ0Vycm9yIiwiZmlsZVBhdGgiLCJwcm9taXNlcyIsInJlYWRGaWxlIiwiZ2VuZXJhdGVGaWxlIiwiY29udGVudCIsIm1rZGlyIiwiZGlybmFtZSIsInJlY3Vyc2l2ZSIsIm5vcm1hbGl6ZWRDb250ZW50IiwicmVwbGFjZUFsbCIsInRyaW0iLCJwcm9taXNlUG9vbCIsIlByb21pc2VQb29sIiwiZml4TmV4dENvbmZpZ0pzb24iLCJtYXAiLCJleHQiLCJyZXNvbHZlIiwiZmluZCIsInAiLCJleGlzdHNTeW5jIiwicmVwbGFjZSIsIl8iLCJzZXR0aW5nc1RleHQiLCJpbmNsdWRlcyIsInJ1biIsImxpdGVyYWwiLCJ2YWx1ZSIsImtpbmQiLCJhc09iamVjdCIsImRlZmF1bHRDb25maWciLCJmb3JiaWRPbmx5IiwicmV0cmllcyIsInRpbWVvdXQiLCJ1c2UiLCJhY3Rpb25UaW1lb3V0IiwidHJhY2UiLCJzY3JlZW5zaG90IiwidmlkZW8iLCJ3b3JrZXJzIiwid2ViU2VydmVyIiwiY29tbWFuZCIsInVybCIsInJldXNlRXhpc3RpbmdTZXJ2ZXIiLCJzdGRvdXQiLCJzdGRlcnIiLCJlbnYiLCJncmFjZWZ1bFNodXRkb3duIiwiZml4UGxheXdyaWdodENvbmZpZyIsIm1hdGNoIiwiZXhlYyIsIm9iamVjdExpdGVyYWwiLCJwYXJzZWQiLCJzb3VyY2UiLCJ0cyIsImNyZWF0ZVNvdXJjZUZpbGUiLCJTY3JpcHRUYXJnZXQiLCJMYXRlc3QiLCJTY3JpcHRLaW5kIiwiVFMiLCJzdGF0ZW1lbnQiLCJzdGF0ZW1lbnRzIiwiaXNWYXJpYWJsZVN0YXRlbWVudCIsImRlY2xhcmF0aW9uIiwiZGVjbGFyYXRpb25MaXN0IiwiZGVjbGFyYXRpb25zIiwiaW5pdGlhbGl6ZXIiLCJpc09iamVjdExpdGVyYWxFeHByZXNzaW9uIiwicGFyc2VPYmplY3RMaXRlcmFsRXhwcmVzc2lvbiIsInBhcnNlT2JqZWN0TGl0ZXJhbCIsIm5ld09iamVjdExpdGVyYWwiLCJzdHJpbmdpZnlPYmplY3QiLCJtZXJnZSIsImFsbCIsInByb3BlcnR5IiwicHJvcGVydGllcyIsImlzUHJvcGVydHlBc3NpZ25tZW50IiwiaXNJZGVudGlmaWVyIiwiaXNTdHJpbmdMaXRlcmFsIiwicGFyc2VFeHByZXNzaW9uIiwidW5kZWZpbmVkIiwiZ2V0VGV4dCIsImV4cHJlc3Npb24iLCJwYXJzZWRPYmplY3QiLCJpc0FycmF5TGl0ZXJhbEV4cHJlc3Npb24iLCJlbGVtZW50cyIsImVsZW1lbnQiLCJzb21lIiwic3RyaW5naWZ5VmFsdWUiLCJsZXZlbCIsInZhbHVlcyIsImxlbmd0aCIsImluZGVudCIsInJlcGVhdCIsImxpbmVzIiwic3RyaW5naWZpZWQiLCJzcGxpdCIsImF0IiwiaW5kZXgiLCJjbG9zaW5nSW5kZW50Iiwic3RyaW5naWZ5QXJyYXkiLCJvYmplY3QiLCJPYmplY3QiLCJlbnRyaWVzIiwia2V5IiwiZ2xvYklnbm9yZSIsImZpeFByaXNtYUVudkZpbGVzIiwiZW52RmlsZXMiLCJmZyIsImdsb2IiLCJkb3QiLCJjd2QiLCJpZ25vcmUiLCJlbnZGaWxlIiwiZW52RmlsZVBhdGgiLCJmaXhUZXN0RGlyZWN0b3JpZXNVcGRhdGluZ1BhY2thZ2VKc29uIiwicGFja2FnZURpclBhdGhzIiwiUHJvbWlzZSIsIm5ld1Rlc3REaXJQYXRoIiwicGFja2FnZURpclBhdGgiLCJvbGRUZXN0RGlyTmFtZSIsIm9sZFRlc3REaXJQYXRoIiwicmVuYW1lIiwiZml4VHlwZURlZmluaXRpb25zIiwiY29uZmlnc0luY2x1ZGluZ0NoaWxkcmVuIiwibGliVHlwZURpclBhdGgiLCJzcmNUeXBlRGlyUGF0aCIsImlzUm9vdCIsImRvZXNDb250YWluU3ViUGFja2FnZUpzb25zIiwiZGlyZW50cyIsImlnbm9yZUVub2VudEFzeW5jIiwicmVhZGRpciIsIndpdGhGaWxlVHlwZXMiLCJkaXJlbnQiLCJkaXJOYW1lIiwic2xpY2UiLCJoYXNUeXBlRGVjbGFyYXRpb25FeHRlbnNpb24iLCJlbmRzV2l0aCIsInBhY2thZ2VOYW1lIiwiaGFzTGlicmFyeSIsInBhY2thZ2VKc29uIiwiZGVwZW5kZW5jaWVzIiwiZGV2RGVwZW5kZW5jaWVzIiwiaXNGaWxlIiwiaXNEaXJlY3RvcnkiLCJvdmVyd3JpdGVNZXJnZSIsImRlc3RpbmF0aW9uQXJyYXkiLCJzb3VyY2VBcnJheSIsImNvbWJpbmVNZXJnZSIsInRhcmdldCIsImRlc3RpbmF0aW9uIiwiaXRlbSIsImNsb25lVW5sZXNzT3RoZXJ3aXNlU3BlY2lmaWVkIiwiaXNNZXJnZWFibGVPYmplY3QiLCJwdXNoIiwic29ydEtleXMiLCJvYmoiLCJrZXlBbmRWYWx1ZXMiLCJ0b1NvcnRlZCIsImtleTEiLCJrZXkyIiwibG9jYWxlQ29tcGFyZSIsInB1YmxpY1JlcG9BdXRvZml4V29ya2Zsb3ciLCJvbiIsInB1bGxfcmVxdWVzdCIsImJyYW5jaGVzIiwicGVybWlzc2lvbnMiLCJjb250ZW50cyIsImNvbmN1cnJlbmN5IiwiZ3JvdXAiLCJqb2JzIiwiYXV0b2ZpeCIsInN0ZXBzIiwidXNlcyIsIndpdGgiLCJwcml2YXRlUmVwb0F1dG9maXhXb3JrZmxvdyIsInRlc3QiLCJ3b3JrZmxvd3MiLCJyZWxlYXNlIiwicHVsbF9yZXF1ZXN0X3RhcmdldCIsInR5cGVzIiwic3luYyIsImlzc3VlcyIsImlmIiwic2VjcmV0cyIsIkNMQVVERV9DT0RFX09BVVRIX1RPS0VOIiwiT1BFTkFJX0FQSV9LRVkiLCJHRU1JTklfQVBJX0tFWSIsImdlbmVyYXRlV29ya2Zsb3dzIiwicm9vdENvbmZpZyIsImZpbGVOYW1lc1RvQmVSZW1vdmVkIiwiaXNSZXVzYWJsZVdvcmtmbG93c1JlcG8iLCJyZXBvc2l0b3J5Iiwid29ya2Zsb3dzUGF0aCIsInNlbWFudGljWW1sUGF0aCIsInJtIiwiZm9yY2UiLCJmaWxlTmFtZVNldCIsIlNldCIsImZpbHRlciIsImRlcGVuZGluZyIsInNlbWFudGljUmVsZWFzZSIsImFkZCIsImRlbGV0ZSIsImZpbGVOYW1lIiwiYmFzZW5hbWUiLCJ3cml0ZVdvcmtmbG93WWFtbCIsImRlcHJlY2F0ZWRGaWxlTmFtZSIsIm5ld1NldHRpbmdzIiwiaXNQdWJsaWNSZXBvIiwiY2xvbmVEZWVwIiwicGFja2FnZU1hbmFnZXIiLCJpc0J1biIsInNjcmlwdFJ1bm5lciIsInNjcmlwdHMiLCJidWlsZCIsImF1dG9maXhXb3JrZmxvdyIsImdlbmVyYXRlQXV0b2ZpeFdvcmtmbG93IiwibWlncmF0ZVdvcmtmbG93Iiwid3JpdGVZYW1sIiwib2xkU2V0dGluZ3MiLCJ5YW1sIiwibG9hZCIsImFycmF5TWVyZ2UiLCJzdGFydHNXaXRoIiwibW92ZVRvQm90dG9tIiwiaXNSZXVzYWJsZVdvcmtmbG93Iiwiam9iIiwibm9ybWFsaXplSm9iIiwic2NoZWR1bGUiLCJicmFuY2giLCJwYXJhbXMiLCJzeW5jX3BhcmFtc193aXRob3V0X2Rlc3QiLCJ3b3JrZmxvd19kaXNwYXRjaCIsIk5QTV9UT0tFTiIsIkdIX1RPS0VOIiwiRklSRUJBU0VfVE9LRU4iLCJHQ1BfU0FfS0VZX0pTT05fRk9SX0ZJUkVCQVNFIiwiRElTQ09SRF9XRUJIT09LX1VSTCIsInNlcnZlcl91cmwiLCJkb3RfZW52X3BhdGgiLCJub25fc2VsZl9ob3N0ZWQiLCJub3RpZnlfZGlzY29yZCIsInJlcXVpcmVfZmx5IiwicmVxdWlyZV9nY2xvdWQiLCJsYWJlbCIsImxhYmVsT3BlcmF0b3IiLCJjaV9zaXplIiwiY2lfbGFiZWwiLCJtaWdyYXRlSm9iIiwiRkxZX0FQSV9UT0tFTiIsImRlcGxveV9jb21tYW5kIiwiZ2l0aHViX2hvc3RlZF9ydW5uZXIiLCJrZXlzIiwibmV3U2VjcmV0cyIsInlhbWxUZXh0IiwiZHVtcCIsImxpbmVXaWR0aCIsIm5vQ29tcGF0TW9kZSIsInN0eWxlcyIsImZpeFR5cG9zIiwicGFja2FnZUNvbmZpZyIsImRvY0ZpbGVzIiwibWRGaWxlIiwiZml4VHlwb3NJblRleHQiLCJyZXBsYWNlV2l0aENvbmZpZyIsInRzRmlsZXMiLCJ0c0ZpbGUiLCJmaXhUeXBvc0luQ29kZSIsInRleHRCYXNlZEZpbGVzIiwiZmlsZSIsInByb21pc2VBbGwiLCJwcm9wTmFtZSIsImJlZm9yZSIsImFmdGVyIiwid2JmeUpzb24iLCJ0eXBvcyIsImdlbmVyYXRlQWdlbnRJbnN0cnVjdGlvbnMiLCJhbGxDb25maWdzIiwiYWdlbnRzRXh0cmFQYXRoIiwiZXh0cmFDb250ZW50IiwidG9vbE5hbWUiLCJnZW5lcmF0ZUFnZW50SW5zdHJ1Y3Rpb24iLCJjdXJzb3JSdWxlc1BhdGgiLCJjdXJzb3JSdWxlc0NvbnRlbnQiLCJmcm9udG1hdHRlciIsImJvZHkiLCJnZW5lcmF0ZUN1cnNvckdlbmVyYWxNZGNDb250ZW50IiwiYmFzZUNvbnRlbnQiLCJkZXNjcmlwdGlvbiIsImMiLCJnZW5JMThuVHMiLCJpc1dpbGxCb29zdGVyUmVwbyIsImhhc1N0YXJ0VGVzdCIsInJlYWN0IiwibmV4dCIsInRyaW1FbmQiLCJnaXRIdWJVdGlsIiwiZ2V0T3JnQW5kTmFtZSIsInVybE9yRnVsbE5hbWUiLCJ1cmxXaXRob3V0UHJvdG9jb2wiLCJuYW1lcyIsIm9jdG9raXRDYWNoZSIsIk1hcCIsImdldE9jdG9raXQiLCJvd25lciIsImNhY2hlZCIsImdldCIsIm9jdG9raXQiLCJPY3Rva2l0IiwiYXV0aCIsImdldEdpdEh1YlRva2VuIiwic2V0IiwiaGFzR2l0SHViVG9rZW4iLCJwcm9jZXNzIiwiR0hfQk9UX1BBVF9GT1JfV0lMTEJPT1NURVIiLCJHSF9CT1RfUEFUX0ZPUl9XSUxMQk9PU1RFUkxBQiIsIkdJVEhVQl9UT0tFTiIsInNwYXduU3luYyIsImFyZ3MiLCJyZXRyeSIsIm5ld0NtZCIsIm5ld0FyZ3MiLCJnZXRTcGF3blN5bmNBcmdzIiwiY2hpbGRfcHJvY2VzcyIsInN0YXR1cyIsInNwYXduU3luY1dpdGhTdHJpbmdSZXN1bHQiLCJzdGRpbyIsInByb2MiLCJ0b1N0cmluZyIsInMiLCJQQVRIIiwiQkVSUllfQklOX0ZPTERFUiIsImFzZGZEaXIiLCJBU0RGX0RJUiIsIm9zIiwiaG9tZWRpciIsImFzZGZQYXRocyIsImN1cnJlbnRQYXRocyIsIkFTREZfTk9ERUpTX1ZFUlNJT04iLCJzaGVsbCIsImNvbnZlcnRWZXJzaW9uSW50b051bWJlciIsInZlcnNpb24iLCJudW1iZXJzIiwiTnVtYmVyIiwibnVtIiwiaXNOYU4iLCJ2ZXJzaW9uTnVtYmVyIiwiZGl2aXNvciIsIlBZVEhPTl9WRVJTSU9OIiwiSkFWQV9WRVJTSU9OIiwiZ2VuZXJhdGVUb29sVmVyc2lvbnMiLCJ2ZXJzaW9uc1RleHQiLCJkdXBsaWNhdGFibGVMaW5lcyIsImxpbmUiLCJDT1JFX1RPT0xTIiwiaGFzIiwiZG9lc0NvbnRhaW5Qb2V0cnlMb2NrIiwicmVzcG9uc2UiLCJmZXRjaCIsImpzb24iLCJwb2V0cnlWZXJzaW9uIiwidXBkYXRlVmVyc2lvbiIsImZpcmViYXNlIiwiZG9lc0NvbnRhaW5QYWNrYWdlSnNvbiIsImJ1blZlcnNpb24iLCJvcmdhbml6YXRpb24iLCJyZXF1ZXN0IiwicmVwbyIsImRhdGEiLCJ0YWdfbmFtZSIsImxhc3RJbmRleE9mIiwidmVyc2lvbk51bWJlclRleHQiLCJnZXRMYXRlc3RWZXJzaW9uRnJvbVRhZ09uR2l0SHViIiwicHJlZml4IiwiREVQUkVDQVRFRF9WRVJTSU9OX1BSRUZJWEVTIiwidmVyc2lvblBhdGgiLCJ0b29sVmVyc2lvbnNQYXRoIiwiY29yZSIsIm5ld1ZlcnNpb24iLCJoZWFkIiwiZmluZEluZGV4IiwibCIsIm5ld0xpbmUiLCJzcGxpY2UiLCJnZW5lcmF0ZUJpb21lSnNvbmMiLCJyb290IiwiJHNjaGVtYSIsImV4dGVuZHMiLCJKU09OIiwicGFyc2UiLCJzdHJpbmdpZnkiLCJnZW5lcmF0ZUJ1bmZpZ1RvbWwiLCJyZWFkRmlsZVN5bmMiLCJ1c2VyQ29udGVudEhlYWRlciIsInVzZXJDb250ZW50SGVhZGVyUmVnZXgiLCJzZXBhcmF0b3IiLCJkZWZhdWx0SGVhZFVzZXJDb250ZW50IiwiZGVmYXVsdFRhaWxVc2VyQ29udGVudCIsImlnbm9yZUZpbGVVdGlsIiwic2VwYXJhdG9yUHJlZml4IiwicmVhZEdpdGlnbm9yZVdpdGhvdXRTZXBhcmF0b3JzIiwibGFzdEhlYWRlckluZGV4IiwiZ2V0SW5kZXhPZlRhaWxVc2VyQ29udGVudEhlYWRlciIsImdldEhlYWRVc2VyQ29udGVudCIsImluZGV4T2YiLCJ0aGlzIiwiZ2V0VGFpbFVzZXJDb250ZW50IiwiaXNCZXJyeVplcm9JbnN0YWxsRW5hYmxlZCIsImxhc3RJbmRleCIsImdlbmVyYXRlRG9ja2VyaWdub3JlIiwiZXh0ZW5zaW9ucyIsImNvZGVXaXRoMkluZGVudFNpemUiLCJjb2RlV2l0aDRJbmRlbnRTaXplIiwibWFya2Rvd25MaWtlIiwiZXNsaW50IiwicHJldHRpZXIiLCJiaW9tZSIsImdlbmVyYXRlRXh0ZW5zaW9ucyIsImdlbmVyYXRlRWRpdG9yY29uZmlnIiwiZ2VuZXJhdGVFc2xpbnRyYyIsImVzbGludEJhc2UiLCJoYXZlX2Z1biIsImNvZGVfcmV2aWV3IiwiZGlzYWJsZSIsImNvbW1lbnRfc2V2ZXJpdHlfdGhyZXNob2xkIiwibWF4X3Jldmlld19jb21tZW50cyIsInB1bGxfcmVxdWVzdF9vcGVuZWQiLCJoZWxwIiwic3VtbWFyeSIsImlnbm9yZV9wYXR0ZXJucyIsImdlbmVyYXRlR2VtaW5pQ29uZmlnIiwiY29uZmlnRmlsZVBhdGgiLCJzdHlsZWd1aWRlRmlsZVBhdGgiLCJuZXdDb25maWciLCJvbGRDb25maWciLCJ5YW1sQ29udGVudCIsInJlbW92ZUdlbWluaVNldHRpbmdzIiwiZ2VuZXJhdGVHaXRhdHRyaWJ1dGVzIiwiZGVmYXVsdE5hbWVzIiwiZ2VuZXJhdGVHaXRpZ25vcmUiLCJoZWFkVXNlckNvbnRlbnQiLCJ0YWlsVXNlckNvbnRlbnQiLCJkb2VzQ29udGFpbkdlbWZpbGUiLCJkb2VzQ29udGFpbkdvTW9kIiwiZG9lc0NvbnRhaW5Qb21YbWwiLCJkb2VzQ29udGFpblB1YnNwZWNZYW1sIiwiZG9lc0NvbnRhaW5UZW1wbGF0ZVlhbWwiLCJibGl0eiIsInByaXNtYSIsInBsYXl3cmlnaHRUZXN0IiwicmVhY3ROYXRpdmUiLCJzdG9yeWJvb2siLCJsaXRlc3RyZWFtIiwiZ2VuZXJhdGVkIiwicmVhZENhY2hlIiwicmVzcG9uc2VUZXh0IiwidGV4dCIsIm9rIiwid3JpdGVDYWNoZSIsInN0YXQiLCJEYXRlIiwibm93IiwibXRpbWVNcyIsImdldExhdGVzdENvbW1pdEhhc2giLCJyZXBvVXJsIiwiY29tbWl0SGFzaCIsInJlamVjdCIsIkVzbGludFV0aWwiLCJnZXRMaW50Rml4U3VmZml4IiwiZG9lc0NvbnRhaW5Kc3hPclRzeCIsImpzQ29tbW9uRGVwcyIsInRzQ29tbW9uRGVwcyIsInJlYWN0Q29tbW9uRGVwcyIsImVzbGludERlcHMiLCJnZW5lcmF0ZVBhY2thZ2VKc29uIiwic2tpcEFkZGluZ0RlcHMiLCJqc29uVGV4dCIsImpzb25PYmoiLCJwZWVyRGVwZW5kZW5jaWVzIiwiYXV0aG9yIiwidHNsaWIiLCJsZXJuYSIsInBpbnN0IiwicmVtb3ZlRGVwcmVjYXRlZFN0dWZmIiwiZ2VuZXJhdGVTY3JpcHRzIiwicHJldHRpZnkiLCJleGlzdGluZ0NvbnRlbnQiLCJvcmlnaW5hbENvbnRlbnQiLCJnZW5lcmF0ZVByZXR0aWVyU3VmZml4IiwicG9ldHJ5RGV2RGVwZW5kZW5jaWVzIiwiaHVza3kiLCJwcmVwYXJlIiwicG9zdGluc3RhbGwiLCJpc1JlZmVycmVkQnlPdGhlclJlcG8iLCJwcmVwYWNrIiwicG9zdHBhY2siLCJhcnRpbGxlcnkiLCJwbGF5d3JpZ2h0Iiwid29ya3NwYWNlcyIsIkFycmF5IiwiaXNBcnJheSIsIndvcmtzcGFjZSIsImdsb2JTeW5jIiwid2IiLCJkb2VzQ29udGFpbkphdmFTY3JpcHQiLCJkb2VzQ29udGFpbkphdmFTY3JpcHRJblBhY2thZ2VzIiwiZG9lc0NvbnRhaW5UeXBlU2NyaXB0IiwiZG9lc0NvbnRhaW5UeXBlU2NyaXB0SW5QYWNrYWdlcyIsIm1pY3JvbWF0Y2giLCJpc1dpbGxCb29zdGVyQ29uZmlncyIsImRlcCIsInByaXZhdGUiLCJsaWNlbnNlIiwicHVibGlzaENvbmZpZyIsImFjY2VzcyIsIm1haW4iLCJyZXNvbHV0aW9ucyIsImxpbnQiLCJzY3JpcHROYW1lIiwic2NyaXB0IiwiZGlycyIsImRpciIsImZvcm1hdCIsInB5dGhvbkZpbGVzIiwiZGlyTmFtZVNldCIsInB5dGhvbkZpbGUiLCJmaXJzdCIsInNlY29uZCIsInNpemUiLCJkaXJOYW1lc1N0ciIsInBhY2thZ2VOYW1lcyIsImlzV29ya3NwYWNlUGFja2FnZSIsInVwZGF0ZVByaXZhdGVQYWNrYWdlcyIsIm5ld0pzb25UZXh0Iiwib2xkQW5kTmV3U2NyaXB0TmFtZXMiLCJvbGROYW1lIiwibmV3TmFtZSIsImZpbGVzIiwiZml4U2NyaXB0TmFtZXMiLCJvbGRTY3JpcHRzIiwiaGFzVHlwZWNoZWNrIiwiY2xlYW51cCIsInR5cGVjaGVjayIsIm9sZFRlc3QiLCJweXJpZ2h0IiwicHJlQ29tbWl0IiwicHJlUHVzaCIsInByZVB1c2hGb3JMYWIiLCJwcmVQdXNoRm9yTGFiRXhjZXB0QWRtaW4iLCJwb3N0TWVyZ2UiLCJnZW5lcmF0ZUh1c2t5cmNVcGRhdGluZ1BhY2thZ2VKc29uIiwicGFja2FnZUpzb25QYXRoIiwicG9zdHB1Ymxpc2giLCJwcmVwdWJsaXNoT25seSIsInByZUNvbW1pdEZpbGVQYXRoIiwidG9Mb2NhbGVMb3dlckNhc2UiLCJtb2RlIiwicG9zdE1lcmdlQ29tbWFuZCIsImdlbmVyYXRlUG9zdE1lcmdlQ29tbWFuZHMiLCJwb3N0TWVyZ2VDb21tYW5kcyIsInJhdyIsImluc3RhbGxDb21tYW5kIiwicm1OZXh0RGlyZWN0b3J5IiwiY3JlYXRlVGFza09wdGlvbnMiLCJydW5uZXIiLCJleHRlbnNpb24iLCJwcmV0dGllckNvbnRlbnQiLCJiaW9tZUNvbnRlbnQiLCJnZW5lcmF0ZUlkZWFTZXR0aW5ncyIsImNvbW1hbmRzIiwiZ2VuZXJhdGVMZWZ0aG9va1VwZGF0aW5nUGFja2FnZUpzb24iLCJzZXR0aW5ncyIsIm1rZGlyU3luYyIsInNyY0RpcmVjdG9yaWVzIiwibm9kZSIsImdlbmVyYXRlTGludHN0YWdlZHJjIiwicGFja2FnZVByZWZpeCIsImdldEVzbGludEtleSIsInBhY2thZ2VzRmlsdGVyIiwiZ2V0RXNsaW50RmlsdGVyRm9yUHJldHRpZXIiLCJnZXRTcmNEaXJzIiwiZ2VuZXJhdGVQcmV0dGllcmlnbm9yZSIsImdpdGlnbm9yZUZpbGVQYXRoIiwiZ2l0aWdub3JlQ29udGVudCIsImFkZGl0aW9uYWxDb250ZW50IiwidmVudlBhdGgiLCJ2ZW52IiwiZ2VuZXJhdGVQeXJpZ2h0Q29uZmlnSnNvbiIsImdlbmVyYXRlUmVhZG1lIiwiaW5zZXJ0QmFkZ2UiLCJmaWxlTmFtZXMiLCJyZWFkZGlyU3luYyIsImJhZGdlTmFtZSIsInRvVXBwZXJDYXNlIiwiYmFkZ2UiLCJyZWFkbWUiLCJpIiwiZ2VuZXJhdGVSZWxlYXNlcmMiLCJwbHVnaW5zIiwicGx1Z2luIiwicHJlc2V0IiwiZmFpbENvbW1lbnQiLCJfMSIsInN1Y2Nlc3NDb21tZW50IiwiXzIiLCJjbGVhbk9sZENvbmZpZyIsInN1Y2Nlc3NDb21tZW50Q29uZGl0aW9uIiwiZmFpbENvbW1lbnRDb25kaXRpb24iLCJsYWJlbHMiLCJyZWxlYXNlZExhYmVscyIsImdlbmVyYXRlUmVub3ZhdGVKc29uIiwicGFja2FnZVJ1bGVzIiwicnVsZSIsIm1hdGNoUGFja2FnZU5hbWVzIiwiZW5hYmxlZCIsInJvb3RKc29uT2JqIiwiY29tcGlsZXJPcHRpb25zIiwibW9kdWxlIiwibW9kdWxlUmVzb2x1dGlvbiIsImpzeCIsImFsd2F5c1N0cmljdCIsInN0cmljdCIsIm5vVW5jaGVja2VkSW5kZXhlZEFjY2VzcyIsInNraXBMaWJDaGVjayIsImFsbG93U3ludGhldGljRGVmYXVsdEltcG9ydHMiLCJlc01vZHVsZUludGVyb3AiLCJyZXNvbHZlSnNvbk1vZHVsZSIsInNvdXJjZU1hcCIsImltcG9ydEhlbHBlcnMiLCJlcmFzYWJsZVN5bnRheE9ubHkiLCJvdXREaXIiLCJ0eXBlUm9vdHMiLCJleGNsdWRlIiwiaW5jbHVkZSIsInN1Ykpzb25PYmoiLCJnZW5lcmF0ZVRzY29uZmlnIiwiZG9lc0NvbnRhaW5Kc3hPclRzeEluUGFja2FnZXMiLCJpc0VzbVBhY2thZ2UiLCJzb3J0IiwiZXhwZXJpbWVudGFsRGVjb3JhdG9ycyIsImV4Y2x1ZGVGaWxlUGF0dGVybnMiLCJnZW5lcmF0ZVZzY29kZVNldHRpbmdzIiwiZXhjbHVkZUZpbGVQYXR0ZXJuIiwiZXhjbHVkZVNldHRpbmciLCJnZW5lcmF0ZVlhcm5yY1ltbCIsInlhcm5yY1ltbFBhdGgiLCJjdXJyZW50VmVyc2lvbiIsImxhdGVzdFZlcnNpb24iLCJ2ZXJzaW9uc0pzb24iLCJnZXRMYXRlc3RWZXJzaW9uIiwiZ2V0TWFqb3JOdW1iZXIiLCJyZWxlYXNlc1BhdGgiLCJ5YXJucmNQYXRoIiwiZGVmYXVsdFNlbXZlclJhbmdlUHJlZml4Iiwibm9kZUxpbmtlciIsIm5tTW9kZSIsIm5wbU1pbmltYWxBZ2VHYXRlIiwibnBtUHJlYXBwcm92ZWRQYWNrYWdlcyIsImNvbXByZXNzaW9uTGV2ZWwiLCJpbmplY3RFbnZpcm9ubWVudEZpbGVzIiwiZW5hYmxlR2xvYmFsQ2FjaGUiLCJvcmlnaW5hbExlbmd0aCIsInBsdWdpblBhdGgiLCJtYWpvciIsInNldHVwTGFiZWxzIiwic2V0dXBMYWJlbCIsImRlbGV0ZUxhYmVsIiwid2FybiIsImNvbG9yIiwiREVQUkVDQVRFRF9TRUNSRVRfTkFNRVMiLCJzZXR1cFNlY3JldHMiLCJkb3RlbnYiLCJzZWNyZXROYW1lIiwic2VjcmV0X25hbWUiLCJrZXlfaWQiLCJrZXlJZCIsInNvZGl1bSIsInJlYWR5Iiwic2VjcmV0IiwicmF3S2V5IiwiZnJvbV9iYXNlNjQiLCJiYXNlNjRfdmFyaWFudHMiLCJPUklHSU5BTCIsInJhd1NlYyIsImZyb21fc3RyaW5nIiwiZW5jQnl0ZXMiLCJjcnlwdG9fYm94X3NlYWwiLCJlbmNCYXNlNjQiLCJ0b19iYXNlNjQiLCJlbmNyeXB0ZWRfdmFsdWUiLCJzZXR1cEdpdEh1YlNldHRpbmdzIiwid2l0aFJldHJ5IiwiYWxsb3dfYXV0b19tZXJnZSIsImFsbG93X21lcmdlX2NvbW1pdCIsImFsbG93X3NxdWFzaF9tZXJnZSIsImFsbG93X3JlYmFzZV9tZXJnZSIsImFsbG93X3VwZGF0ZV9icmFuY2giLCJkZWxldGVfYnJhbmNoX29uX21lcmdlIiwic3F1YXNoX21lcmdlX2NvbW1pdF90aXRsZSIsInNxdWFzaF9tZXJnZV9jb21taXRfbWVzc2FnZSIsImhlYWRlcnMiLCJ0ZW1wbGF0ZXMiLCJnZW5lcmF0ZUdpdEh1YlRlbXBsYXRlcyIsImRpc3RhbmNlIiwid2JmeUpzb25TY2hlbWEiLCJ6IiwicmVjb3JkIiwic3RyaW5nIiwib3B0aW9uYWwiLCJkb2MiLCJnZXRQYWNrYWdlQ29uZmlnIiwiZXNtUGFja2FnZSIsInBhY2thZ2VKc29uVGV4dCIsInR5cGUiLCJyZWxlYXNlQnJhbmNoZXMiLCJyZWxlYXNlUGx1Z2lucyIsInJlbGVhc2VyY0pzb25QYXRoIiwiZnNwIiwiZmxhdCIsInJlcG9JbmZvIiwiZ2l0Iiwic2ltcGxlR2l0Iiwib3JpZ2luIiwiZ2V0UmVtb3RlcyIsInIiLCJyZW1vdGVVcmwiLCJyZWZzIiwicmVxdWVzdFJlcG9JbmZvIiwibWVzc2FnZSIsImZldGNoUmVwb0luZm8iLCJub2RlVmVyc2lvbkNvbnRlbnQiLCJ3YmZ5SnNvblBhdGgiLCJ3YmZ5SnNvblRleHQiLCJmdWxsX25hbWUiLCJCb29sZWFuIiwic2VwIiwiY29udGFpbnNBbnkiLCJkb2VzQ29udGFpblZzY29kZVNldHRpbmdzSnNvbiIsImdpdGh1YiIsIm5wbSIsImdldEVzbGludEV4dGVuc2lvbkJhc2UiLCJwYXR0ZXJuIiwib3JnIiwicmV0IiwiYXNzaWduIiwic2hvdWxkU2tpcFdpbGxib29zdGVyQ29uZmlnc0VzbGludFBhY2thZ2UiLCJyZW1vdmVOb2RlTW9kdWxlc0RpcmVjdG9yaWVzIiwibm9kZU1vZHVsZXNQYXRocyIsImdsb2JiZWRQYXRocyIsIm9ubHlEaXJlY3RvcmllcyIsImZvbGxvd1N5bWJvbGljTGlua3MiLCJub2RlTW9kdWxlc1BhdGgiLCJybVN5bmMiLCJhcmd2IiwieWFyZ3MiLCJwb3NpdGlvbmFsIiwiZGVzY3JpYmUiLCJhcnJheSIsImRlZmF1bHQiLCJhbGlhcyIsInNraXBEZXBzIiwidmVyYm9zZSIsInBhY2thZ2VKc29uRGlyIiwiVVJMIiwicGF0aG5hbWUiLCJnZXRWZXJzaW9uIiwicm9vdERpclBhdGgiLCJwYXRocyIsInBhY2thZ2VzRGlyUGF0aCIsInN1YkRpclBhdGhzIiwiaWdub3JlRXJyb3JBc3luYyIsImQiLCJhYmJyZXZpYXRpb25Qcm9taXNlIiwic3ViUGFja2FnZUNvbmZpZ3MiLCJzdWJEaXJQYXRoIiwiYWxsUGFja2FnZUNvbmZpZ3MiLCJzaG91bGRSdW5Xb3JrZmxvd3MiLCJ0aGVuIl0sIm1hcHBpbmdzIjoibW9CQUtPLE1BQU1BLEVBQVUsSUFMdkIsTUFDRUMsV0FBWSxFQUNaQyxtQkFBb0IsR0NnQmYsTUFBTUMsRUFBUyxJQWhCdEIsTUFDRSwrQkFBTUMsQ0FBMEJDLEVBQWNDLEdBQ3hDTixFQUFRQyxXQUNWTSxRQUFRQyxLQUFLLGFBQWFILHFCQUU1QixVQUNRQyxHQUNSLENBQUUsTUFBT0csR0FDUEYsUUFBUUMsS0FBSyxxQkFBcUJILE1BQVNJLGFBQWlCQyxNQUFRRCxFQUFNRSxNQUFRQyxPQUFPSCxNQUMzRixDQUNJVCxFQUFRQyxXQUNWTSxRQUFRQyxLQUFLLGNBQWNILG1CQUUvQixHQ1RLUSxlQUFlQyxFQUFjQyxHQUNsQyxPQUFPWixFQUFPQywwQkFBMEIsZ0JBQWlCUyxVQUN2RCxJQUFLRSxFQUFPQyxzQkFBdUIsT0FFbkMsTUFBTUMsRUFBYUYsRUFBT0csV0FDcEJDLEVBQWFGLEVBRWZBLElBQWVFLFNBQ2JDLEVBQUdDLFVBQVVDLEVBQUtDLEtBQUtSLEVBQU9TLFFBQVMsY0FBZUwsSUFFaEUsQ0NiTyxNQUFNTSxFQUFTLENBQ3BCLDJCQUFNQyxDQUFzQkMsR0FDMUIsSUFDRSxhQUFhUCxFQUFHUSxTQUFTQyxTQUFTRixFQUFVLE9BQzlDLENBQUUsTUFDQSxDQUVKLEVBQ0Esa0JBQU1HLENBQWFILEVBQWtCSSxTQUM3QlgsRUFBR1EsU0FBU0ksTUFBTVYsRUFBS1csUUFBUU4sR0FBVyxDQUFFTyxXQUFXLElBQzdELElBQUlDLEVBQW9CSixFQUFRSyxXQUFXLE9BQVEsTUFBTUMsT0FDckRGLElBQ0ZBLEdBQXFCLFlBRWpCZixFQUFHUSxTQUFTUCxVQUFVTSxFQUFVUSxFQUV4QyxHQ2pCV0csRUFBYyxJQUFJQyxFQ014QjFCLGVBQWUyQixFQUFrQnpCLEdBQ3RDLE9BQU9aLEVBQU9DLDBCQUEwQixvQkFBcUJTLFVBQzNELE1BQU1jLEVBQVcsQ0FBQyxLQUFNLE1BQU8sT0FDNUJjLElBQUtDLEdBQVFwQixFQUFLcUIsUUFBUTVCLEVBQU9TLFFBQVMsZUFBZWtCLE1BQ3pERSxLQUFNQyxHQUFNekIsRUFBRzBCLFdBQVdELElBQzdCLElBQUtsQixFQUFVLE9BRWYsTUFFTVIsU0FGbUJDLEVBQUdRLFNBQVNDLFNBQVNGLEVBQVUsU0FFMUJvQixRQUFRLG1CQUFvQixDQUFDQyxFQUFHQyxLQUN2REEsRUFBYUMsU0FBUyxhQUN6QkQsR0FBZ0IseUNBRWJBLEVBQWFDLFNBQVMsaUJBQ3pCRCxHQUFnQiw0Q0FFWCxNQUFNQSxjQUVUWCxFQUFZYSxJQUFJLElBQU0xQixFQUFPSyxhQUFhSCxFQUFVUixLQUU5RCxDQ1hBLE1BQU1pQyxFQUFXQyxJQUFhLENBQXFCQyxLQUFNLFVBQVdELFVBRTlERSxFQUFZRixJQUFtQixDQUFxQkMsS0FBTSxTQUFVRCxVQUVwRUcsRUFBOEIsQ0FDbENDLFdBQVlMLEVBQVEsb0JBQ3BCTSxRQUFTTixFQUFRLG9EQUNqQk8sUUFBU1AsRUFBUSxXQUNqQlEsSUFBS0wsRUFBUyxDQUNaTSxjQUFlVCxFQUFRLFVBQ3ZCVSxNQUFPVixFQUFRLDJEQUNmVyxXQUFZWCxFQUFRLDBEQUNwQlksTUFBT1osRUFBUSxnRUFFakJhLFFBQVNiLEVBQVEsdUNBQ2pCYyxVQUFXWCxFQUFTLENBQ2xCWSxRQUFTZixFQUFRLDRCQUNqQmdCLElBQUtoQixFQUFRLG9DQUNiaUIsb0JBQXFCakIsRUFBUSxvQkFDN0JPLFFBQVNQLEVBQVEsV0FDakJrQixPQUFRbEIsRUFBUSxZQUNoQm1CLE9BQVFuQixFQUFRLFVBQ2hCb0IsSUFBS3BCLEVBQVEsbUZBSWJxQixpQkFBa0JyQixFQUFRLGtEQU92QnZDLGVBQWU2RCxFQUFvQjNELEdBQ3hDLE9BQU9aLEVBQU9DLDBCQUEwQixzQkFBdUJTLFVBQzdELE1BQU1jLEVBQVdMLEVBQUtxQixRQUFRNUIsRUFBT1MsUUFBUyx3QkFDOUMsSUFBS0osRUFBRzBCLFdBQVduQixHQUFXLE9BRTlCLE1BQU1WLFFBQW1CRyxFQUFHUSxTQUFTQyxTQUFTRixFQUFVLFFBQ2xEZ0QsRUFBUSwyQ0FBMkNDLEtBQUszRCxHQUN4RDRELEVBQWdCRixJQUFRLEdBQzlCLElBQUtFLEVBQWUsT0FFcEIsTUFBTUMsRUFXVixTQUE0QkQsR0FDMUIsTUFBTUUsRUFBU0MsRUFBR0MsaUJBQ2hCLHVCQUNBLGtCQUFrQkosS0FDbEJHLEVBQUdFLGFBQWFDLFFBQ2hCLEVBQ0FILEVBQUdJLFdBQVdDLElBRVZDLEVBQVlQLEVBQU9RLFdBQVcsR0FDcEMsSUFBS0QsSUFBY04sRUFBR1Esb0JBQW9CRixHQUFZLE9BQ3RELE1BQU1HLEVBQWNILEVBQVVJLGdCQUFnQkMsYUFBYSxHQUMzRCxJQUFLRixHQUFhRyxjQUFnQlosRUFBR2EsMEJBQTBCSixFQUFZRyxhQUFjLE9BQ3pGLE9BQU9FLEVBQTZCTCxFQUFZRyxZQUFhYixFQUMvRCxDQXhCbUJnQixDQUFtQmxCLEdBQ2xDLElBQUtDLEVBQVEsT0FFYixNQUNNa0IsRUFBbUJDLEVBRFZDLEVBQU1DLElBQWtCLENBQUMzQyxFQUFlc0IsRUFBUXRCLElBQ2QsR0FDM0NyQyxFQUFhRixFQUFXOEIsUUFBUThCLEVBQWVtQixTQUUvQzFELEVBQVlhLElBQUksSUFBTTFCLEVBQU9LLGFBQWFILEVBQVVSLEtBRTlELENBaUJBLFNBQVMyRSxFQUNQakIsRUFDQUUsR0FFQSxNQUFNRCxFQUF1QixDQUFBLEVBQzdCLElBQUssTUFBTXNCLEtBQVl2QixFQUFjd0IsV0FBWSxDQUMvQyxJQUFLckIsRUFBR3NCLHFCQUFxQkYsS0FBZXBCLEVBQUd1QixhQUFhSCxFQUFTL0YsUUFBVTJFLEVBQUd3QixnQkFBZ0JKLEVBQVMvRixNQUN6RyxPQUVGLE1BQU1nRCxFQUFRb0QsRUFBZ0JMLEVBQVNSLFlBQWFiLEdBQ3BELFFBQWMyQixJQUFWckQsRUFBcUIsT0FDekJ5QixFQUFPc0IsRUFBUy9GLEtBQUtzRyxRQUFRNUIsSUFBVzFCLENBQzFDLENBQ0EsT0FBT3lCLENBQ1QsQ0FFQSxTQUFTMkIsRUFBZ0JHLEVBQTJCN0IsR0FDbEQsR0FBSUMsRUFBR2EsMEJBQTBCZSxHQUFhLENBQzVDLE1BQU1DLEVBQWVmLEVBQTZCYyxFQUFZN0IsR0FDOUQsT0FBTzhCLEVBQWV0RCxFQUFTc0QsR0FBZ0J6RCxFQUFRd0QsRUFBV0QsUUFBUTVCLEdBQzVFLENBQ0EsR0FBSUMsRUFBRzhCLHlCQUF5QkYsR0FBYSxDQUMzQyxNQUFNRyxFQUFXSCxFQUFXRyxTQUFTdEUsSUFBS3VFLEdBQVlQLEVBQWdCTyxFQUFTakMsSUFDL0UsT0FBSWdDLEVBQVNFLEtBQU1ELFFBQThDTixJQUFaTSxHQUM1QzVELEVBQVF3RCxFQUFXRCxRQUFRNUIsSUE1RkgsQ0FBcUJ6QixLQUFNLFFBQVNELE1BOEZ0RDBELEVBQ2pCLENBQ0EsT0FBTzNELEVBQVF3RCxFQUFXRCxRQUFRNUIsR0FDcEMsQ0FFQSxTQUFTbUMsRUFBZTdELEVBQW9COEQsR0FDMUMsTUFBbUIsVUFBZjlELEVBQU1DLEtBT1osU0FBd0I4RCxFQUF1QkQsR0FDN0MsR0FBc0IsSUFBbEJDLEVBQU9DLE9BQWMsTUFBTyxLQUNoQyxNQUFNQyxFQUFTLEtBQUtDLE9BQU9KLEVBQVEsR0FDN0JLLEVBQVFKLEVBQU8zRSxJQUFLWSxJQUN4QixNQUFNb0UsRUFBY1AsRUFBZTdELEVBQU84RCxFQUFRLEdBQUdPLE1BQU0sTUFFM0QsR0FEQUQsRUFBWUEsRUFBWUosT0FBUyxHQUFLLEdBQUdJLEVBQVlFLFVBQ2xDLFlBQWZ0RSxFQUFNQyxLQUNSLElBQUssSUFBSXNFLEVBQVEsRUFBR0EsRUFBUUgsRUFBWUosT0FBUU8sR0FBUyxFQUN2REgsRUFBWUcsR0FBUyxHQUFHTixJQUFTRyxFQUFZRyxLQUlqRCxPQURBSCxFQUFZLEdBQUssR0FBR0gsSUFBU0csRUFBWSxLQUNsQ0EsRUFBWWxHLEtBQUssUUFFcEJzRyxFQUFnQixLQUFLTixPQUFPSixHQUNsQyxNQUFPLE1BQU1LLEVBQU1qRyxLQUFLLFVBQVVzRyxJQUNwQyxDQXRCV0MsQ0FBZXpFLEVBQU1BLE1BQU84RCxHQUVsQixZQUFmOUQsRUFBTUMsS0FBMkJELEVBQU1BLE1BQ3BDNEMsRUFBZ0I1QyxFQUFNQSxNQUFPOEQsRUFDdEMsQ0FvQkEsU0FBU2xCLEVBQWdCOEIsRUFBc0JaLEdBQzdDLE1BQU1HLEVBQVMsS0FBS0MsT0FBT0osRUFBUSxHQUM3QkssRUFBUVEsT0FBT0MsUUFBUUYsR0FBUXRGLElBQUksRUFBRXlGLEVBQUs3RSxNQUM5QyxNQUFNb0UsRUFBY1AsRUFBZTdELEVBQU84RCxFQUFRLEdBQUdPLE1BQU0sTUFFM0QsR0FEQUQsRUFBWUEsRUFBWUosT0FBUyxHQUFLLEdBQUdJLEVBQVlFLFVBQ2xDLFlBQWZ0RSxFQUFNQyxLQUNSLElBQUssSUFBSXNFLEVBQVEsRUFBR0EsRUFBUUgsRUFBWUosT0FBUU8sR0FBUyxFQUN2REgsRUFBWUcsR0FBUyxHQUFHTixJQUFTRyxFQUFZRyxLQUlqRCxPQURBSCxFQUFZLEdBQUssR0FBR0gsSUFBU1ksTUFBUVQsRUFBWSxLQUMxQ0EsRUFBWWxHLEtBQUssUUFFcEJzRyxFQUFnQixLQUFLTixPQUFPSixHQUNsQyxPQUFxQixJQUFqQkssRUFBTUgsT0FBcUIsTUFBTVEsS0FDOUIsTUFBTUwsRUFBTWpHLEtBQUssVUFBVXNHLElBQ3BDLENDL0pPLE1BQU1NLEVBQWEsQ0FDeEIscUJBQ0EsY0FDQSxzQkFDQSxzQkFDQSxhQUNBLGNBQ0EsZUFDQSxhQUNBLGFDQUt0SCxlQUFldUgsRUFBa0JySCxHQUN0QyxPQUFPWixFQUFPQywwQkFBMEIsb0JBQXFCUyxVQUMzRCxNQUFNd0gsUUFBaUJDLEVBQUdDLEtBQUssQ0FBQyxRQUFTLFdBQVksQ0FBRUMsS0FBSyxFQUFNQyxJQUFLMUgsRUFBT1MsUUFBU2tILE9BQVFQLElBQy9GLElBQUssTUFBTVEsS0FBV04sRUFBVSxDQUM5QixNQUFNTyxFQUFjdEgsRUFBS3FCLFFBQVE1QixFQUFPUyxRQUFTbUgsR0FFM0N4SCxTQURnQkMsRUFBR1MsU0FBUytHLEVBQWEsU0FDcEI3RixRQUN6QixzQ0FDQSxnREFFSTNCLEVBQUdDLFVBQVV1SCxFQUFhekgsRUFDbEMsR0FFSixDQ2pCT04sZUFBZWdJLEVBQXNDQyxHQUMxRCxPQUFPM0ksRUFBT0MsMEJBQTBCLHdDQUF5Q1MsZ0JBQ3pFa0ksUUFBUTVDLElBQ1oyQyxFQUFnQnJHLElBQUk1QixVQUNsQixNQUFNbUksRUFBaUIxSCxFQUFLQyxLQUFLMEgsRUFBZ0IsUUFDakQsSUFBSyxNQUFNQyxJQUFrQixDQUFDLFlBQWEsU0FBVSxDQUNuRCxNQUFNQyxFQUFpQjdILEVBQUtDLEtBQUswSCxFQUFnQkMsR0FDakQsVUFDUTlILEVBQUdRLFNBQVN3SCxPQUFPRCxFQUFnQkgsR0FDekMsTUFBTS9ILFFBQW1CRyxFQUFHUSxTQUFTQyxTQUFTUCxFQUFLQyxLQUFLMEgsRUFBZ0IsZ0JBQWlCLFFBQ25GOUgsRUFBYUYsRUFBV21CLFdBQVc4RyxFQUFnQixRQUN6RCxHQUFJakksSUFBZUUsRUFBWSxhQUV6QkMsRUFBR1EsU0FBU1AsVUFBVUMsRUFBS0MsS0FBSzBILEVBQWdCLGdCQUFpQjlILEVBQ3pFLENBQUUsTUFDQSxDQUVKLE1BSVIsQ0NqQk9OLGVBQWV3SSxFQUNwQnRJLEVBQ0F1SSxHQUVBLE9BQU9uSixFQUFPQywwQkFBMEIscUJBQXNCUyxVQUM1RCxNQUFNMEksRUFBaUJqSSxFQUFLcUIsUUFBUTVCLEVBQU9TLFFBQVMsVUFDOUNnSSxFQUNKekksRUFBTzBJLFFBQVUxSSxFQUFPMkksZ0NBQTZCaEQsRUFBWXBGLEVBQUtxQixRQUFRNUIsRUFBT1MsUUFBUyxNQUFPLFNBRWpHbUksUUFBZ0JDLEVBQWtCLElBQU14SSxFQUFHeUksUUFBUU4sRUFBZ0IsQ0FBRU8sZUFBZSxLQUMxRixHQUFLSCxFQUVMLElBQUssTUFBTUksS0FBVUosRUFBUyxDQUM1QixNQUFNSyxFQUFVRCxFQUFPMUosS0FBSzRKLE1BQU0sR0FBRyxHQUMvQkMsRUFBOEJILEVBQU8xSixLQUFLOEosU0FBUyxTQUN6RCxJQUFJQyxFQUFjRixFQUE4QkYsRUFBVUQsRUFBTzFKLEtBQzdEK0osRUFBWWxILFNBQVMsUUFDdkJrSCxFQUFjLElBQUlBLEVBQVlySCxRQUFRLEtBQU0sUUFFOUMsTUFBTXNILEVBQWFmLEVBQXlCckMsS0FDekNsRyxHQUNDQSxFQUFPdUosYUFBYUMsZUFBZUgsSUFBZ0JySixFQUFPdUosYUFBYUUsa0JBQWtCSixJQUd6RkwsRUFBT1UsVUFBWVAsRUFDakJHLFNBRUlqSixFQUFHWSxNQUFNVixFQUFLQyxLQUFLZ0ksRUFBZ0JTLFVBQ25DMUgsRUFBWWEsSUFBSSxJQUNwQi9CLEVBQUdnSSxPQUFPOUgsRUFBS0MsS0FBS2dJLEVBQWdCUSxFQUFPMUosTUFBT2lCLEVBQUtDLEtBQUtnSSxFQUFnQlMsRUFBUyxpQkFFOUVSLFVBRUhwSSxFQUFHWSxNQUFNd0gsRUFBZ0IsQ0FBRXRILFdBQVcsVUFDdENJLEVBQVlhLElBQUksSUFDcEIvQixFQUFHZ0ksT0FBTzlILEVBQUtDLEtBQUtnSSxFQUFnQlEsRUFBTzFKLE1BQU9pQixFQUFLQyxLQUFLaUksRUFBZ0JPLEVBQU8xSixTQUc5RTBKLEVBQU9XLGVBQWlCbEIsSUFBbUJhLFVBRTlDakosRUFBR1ksTUFBTXdILEVBQWdCLENBQUV0SCxXQUFXLFVBQ3RDSSxFQUFZYSxJQUFJLElBQ3BCeUcsRUFBa0IsSUFDaEJ4SSxFQUFHZ0ksT0FDRDlILEVBQUtDLEtBQUtnSSxFQUFnQlEsRUFBTzFKLEtBQU0sY0FDdkNpQixFQUFLQyxLQUFLaUksRUFBZ0IsR0FBR08sRUFBTzFKLGdCQUs5QyxHQUVKLENDekRPLFNBQVNzSyxFQUFrQkMsRUFBdUJDLEdBQ3ZELE9BQU9BLENBQ1QsQ0FHTyxTQUFTQyxFQUFhQyxFQUFrQmhHLEVBQWtCL0UsR0FDL0QsTUFBTWdMLEVBQWMsSUFBSUQsR0FFeEIsSUFBSyxNQUFPbkQsRUFBT3FELEtBQVNsRyxFQUFPa0QsZUFDTnZCLElBQXZCc0UsRUFBWXBELEdBQ2RvRCxFQUFZcEQsR0FBUzVILEVBQVFrTCw4QkFBOEJELEVBQU1qTCxHQUN4REEsRUFBUW1MLGtCQUFrQkYsR0FDbkNELEVBQVlwRCxHQUFTMUIsRUFBTTZFLEVBQU9uRCxHQUFrQnFELEVBQU1qTCxHQUNoRCtLLEVBQU83SCxTQUFTK0gsSUFDMUJELEVBQVlJLEtBQUtILEdBR3JCLE9BQU9ELENBQ1QsQ0NYTyxTQUFTSyxFQUE0Q0MsR0FDMUQsTUFBTUMsRUFBZXZELE9BQU9DLFFBQVFxRCxHQUFLRSxTQUFTLEVBQUVDLElBQVFDLEtBQVVELEVBQUtFLGNBQWNELElBQ3pGLElBQUssTUFBT3hELEVBQUs3RSxLQUFVa0ksU0FFbEJELEVBQUlwRCxHQUNWb0QsRUFBZ0NwRCxHQUFPN0UsRUFHbkIsaUJBQVZBLEdBQWdDLE9BQVZBLEdBQy9CZ0ksRUFBU2hJLEdBR2IsT0FBT2lJLENBQ1QsQ0MrQ0EsTUFBTU0sRUFBc0MsQ0FDMUN2TCxLQUFNLGFBQ053TCxHQUFJLENBQ0ZDLGFBQWMsS0FDZFYsS0FBTSxDQUNKVyxTQUFVLENBQUMsVUFHZkMsWUFBYSxDQUNYQyxTQUFVLFFBRVpDLFlBQWEsQ0FDWEMsTUFBTyxpQ0FDUCxzQkFBc0IsR0FFeEJDLEtBQU0sQ0FDSkMsUUFBUyxDQUNQLFVBQVcsZ0JBQ1hDLE1BQU8sQ0FDTCxDQUFFQyxLQUFNLHVCQUNSLENBQUVBLEtBQU0sd0JBQXlCQyxLQUFNLENBQUUsZ0JBQWdCLElBQ3pELENBQUVySixJQUFLLGdCQUNQLENBQUVBLElBQUssZ0JBQ1AsQ0FBRUEsSUFBSyxjQUNQLENBQUVvSixLQUFNLDRCQU1WRSxFQUF1QyxDQUMzQ3BNLEtBQU0seUJBQ053TCxHQUFJLENBQ0ZDLGFBQWMsTUFFaEJJLFlBQWEsQ0FDWEMsTUFBTywyQ0FDUCxzQkFBc0IsR0FFeEJDLEtBQU0sQ0FDSk0sS0FBTSxDQUNKSCxLQUFNLHVFQUtOSSxFQUFZLENBQ2hCRCxLQUFNLENBQ0pyTSxLQUFNLE9BQ053TCxHQUFJLENBQ0ZDLGFBQWMsS0FDZFYsS0FBTSxDQUNKVyxTQUFVLENBQUMsT0FBUSxVQUl2QkcsWUFBYSxDQUNYQyxNQUFPLDJDQUNQLHNCQUFzQixHQUV4QkgsWUFBYSxDQUVYQyxTQUFVLFNBRVpHLEtBQU0sQ0FDSk0sS0FBTSxDQUNKSCxLQUFNLG9FQUlaSyxRQUFTLENBQ1B2TSxLQUFNLFVBQ053TCxHQUFJLENBQ0ZULEtBQU0sQ0FDSlcsU0FBVSxLQUdkRyxZQUFhLENBQ1hDLE1BQU8seUJBQ1Asc0JBQXNCLEdBRXhCSCxZQUFhLENBRVgsV0FBWSxRQUVaQyxTQUFVLFNBRVpHLEtBQU0sQ0FDSlEsUUFBUyxDQUNQTCxLQUFNLHVFQUlaLGNBQWUsQ0FDYmxNLEtBQU0sZ0JBQ053TCxHQUFJLENBQ0ZnQixvQkFBcUIsQ0FDbkJDLE1BQU8sQ0FBQyxTQUFVLFNBQVUsaUJBR2hDVixLQUFNLENBQ0osY0FBZSxDQUNiRyxLQUFNLDJFQUlaUSxLQUFNLENBQ0oxTSxLQUFNLE9BQ053TCxHQUFJLENBQUEsRUFDSkcsWUFBYSxDQUVYQyxTQUFVLFNBRVpHLEtBQU0sQ0FDSlcsS0FBTSxDQUFFUixLQUFNLG9FQUdsQixnQkFBaUIsQ0FDZmxNLEtBQU0sb0JBQ053TCxHQUFJLENBQ0ZDLGFBQWMsQ0FDWmdCLE1BQU8sQ0FBQyxZQUdaVixLQUFNLENBQ0osZ0JBQWlCLENBQ2ZHLEtBQU0sNkVBSVosZ0JBQWlCLENBQ2ZsTSxLQUFNLCtCQUNOd0wsR0FBSSxDQUNGbUIsT0FBUSxDQUNORixNQUFPLENBQUMsWUFFVmhCLGFBQWMsQ0FDWmdCLE1BQU8sQ0FBQyxhQUdaVixLQUFNLENBQ0osU0FBVSxDQUNSYSxHQUFJLHdHQUNKVixLQUFNLG1FQUNOQyxLQUFNLENBQ0osY0FBZSxjQUNmLGVBQWdCLDBEQUNoQixlQUFnQiw2QkFFbEJVLFFBQVMsQ0FDUEMsd0JBQXlCLDZDQUtqQyxlQUFnQixDQUNkOU0sS0FBTSw2QkFDTndMLEdBQUksQ0FDRm1CLE9BQVEsQ0FDTkYsTUFBTyxDQUFDLFlBRVZoQixhQUFjLENBQ1pnQixNQUFPLENBQUMsYUFHWlYsS0FBTSxDQUNKLFNBQVUsQ0FDUmEsR0FBSSx1R0FDSlYsS0FBTSxtRUFDTkMsS0FBTSxDQUNKLGNBQWUsWUFDZixlQUFnQiwwREFDaEIsZUFBZ0IsNkJBRWxCVSxRQUFTLENBQ1BFLGVBQWdCLG9DQUt4QixnQkFBaUIsQ0FDZi9NLEtBQU0sOEJBQ053TCxHQUFJLENBQ0ZtQixPQUFRLENBQ05GLE1BQU8sQ0FBQyxZQUVWaEIsYUFBYyxDQUNaZ0IsTUFBTyxDQUFDLGFBR1pWLEtBQU0sQ0FDSixTQUFVLENBQ1JhLEdBQUksd0dBQ0pWLEtBQU0sbUVBQ05DLEtBQU0sQ0FDSixjQUFlLGFBQ2YsZUFBZ0IsMERBQ2hCLGVBQWdCLDZCQUVsQlUsUUFBUyxDQUNQRyxlQUFnQixxQ0FTbkJ4TSxlQUFleU0sRUFBa0JDLEdBQ3RDLE1BQU1DLEVBQXVCLENBQzNCLG1DQUNBLDJCQUNBLGlDQUNBLG1CQUNBLFdBQ0Esa0JBR0YsT0FBT3JOLEVBQU9DLDBCQUEwQixtQkFBb0JTLFVBQzFELEdBQUk0TSxFQUF3QkYsRUFBV0csWUFFckMsT0FHRixNQUFNQyxFQUFnQnJNLEVBQUtxQixRQUFRNEssRUFBVy9MLFFBQVMsVUFBVyxtQkFDNURKLEVBQUdRLFNBQVNJLE1BQU0yTCxFQUFlLENBQUV6TCxXQUFXLElBR3BELE1BQU0wTCxFQUFrQnRNLEVBQUtxQixRQUFRNEssRUFBVy9MLFFBQVMsVUFBVyxzQkFDOURjLEVBQVlhLElBQUksSUFBTS9CLEVBQUdRLFNBQVNpTSxHQUFHRCxFQUFpQixDQUFFRSxPQUFPLEVBQU01TCxXQUFXLEtBRXRGLE1BQU0rRixRQUFnQjdHLEVBQUdRLFNBQVNpSSxRQUFROEQsRUFBZSxDQUFFN0QsZUFBZSxJQUNwRWlFLEVBQWMsSUFBSUMsSUFBSSxDQUMxQixXQUNBLGNBQ0Esa0JBQ0Esb0JBQ0Esb0JBQ0EsbUJBQ0EsdUJBQ0cvRixFQUFRZ0csT0FBUWxFLEdBQVdBLEVBQU9VLFVBQVlWLEVBQU8xSixLQUFLOEosU0FBUyxTQUFTMUgsSUFBS3NILEdBQVdBLEVBQU8xSixRQUVwR2tOLEVBQVdXLFVBQVVDLGlCQUN2QkosRUFBWUssSUFBSSxlQUVsQkwsRUFBWU0sT0FBTyw0QkFDbkJOLEVBQVlNLE9BQU8sa0NBQ25CTixFQUFZTSxPQUFPLG9CQUVuQixJQUFLLE1BQU1DLEtBQVlQLEVBQWEsQ0FFbEMsTUFBTXpLLEVBQU9oQyxFQUFLaU4sU0FBU0QsRUFBVSxjQUMvQmhNLEVBQVlhLElBQUksSUFBTXFMLEVBQWtCakIsRUFBWUksRUFBZXJLLEdBQzNFLENBRUEsSUFBSyxNQUFNbUwsS0FBc0JqQixRQUN6QmxMLEVBQVlhLElBQUksSUFDcEIvQixFQUFHUSxTQUFTaU0sR0FBR3ZNLEVBQUtDLEtBQUtvTSxFQUFlYyxHQUFxQixDQUFFWCxPQUFPLEVBQU01TCxXQUFXLE1BSS9GLENBRU8sU0FBU3VMLEVBQXdCQyxHQUN0QyxPQUFPQSxHQUFZdkQsU0FBUyx5QkFBMEIsQ0FDeEQsQ0FFQXRKLGVBQWUyTixFQUFrQnpOLEVBQXVCNE0sRUFBdUJySyxHQUM3RSxNQUFNM0IsRUFBV0wsRUFBS0MsS0FBS29NLEVBQWUsR0FBR3JLLFNBRTdDLEdBQWEsWUFBVEEsRUFBb0IsQ0FDdEIsTUFBTW9MLEVBK0tWLFNBQWlDM04sR0FDL0IsSUFBS0EsRUFBTzROLGFBQ1YsT0FBT0MsRUFBVW5DLEdBR25CLE1BQU1vQyxFQUFpQjlOLEVBQU8rTixNQUFRLE1BQVEsT0FDeENDLEVBQWVoTyxFQUFPK04sTUFBUSxVQUFZLE9BQzFDeEMsRUFBZ0IsQ0FDcEIsQ0FBRUMsS0FBTSx1QkFDUixDQUFFQSxLQUFNLHdCQUF5QkMsS0FBTSxDQUFFLGdCQUFnQixPQUNyRHpMLEVBQU8rTixNQUFRLENBQUMsQ0FBRXZDLEtBQU0sdUJBQXdCQyxLQUFNLENBQUUsY0FBZSxZQUFnQixHQUMzRixDQUFFckosSUFBSyxHQUFHMEwsYUFDVixDQUFFMUwsSUFBSyxHQUFHNEwsY0FFUmhPLEVBQU91SixhQUFhMEUsU0FBU0MsT0FDL0IzQyxFQUFNbEIsS0FBSyxDQUFFakksSUFBSyxHQUFHNEwsWUFFdkJ6QyxFQUFNbEIsS0FBSyxDQUFFbUIsS0FBTSx5QkFFbkIsTUFBTTJDLEVBQWtCTixFQUFVaEQsR0FPbEMsT0FOQXNELEVBQWdCOUMsS0FBTyxDQUNyQkMsUUFBUyxDQUNQLFVBQVcsZ0JBQ1hDLFVBR0c0QyxDQUNULENBMU13QkMsQ0FBd0JwTyxHQUc1QyxPQUZBcU8sRUFBZ0JWLGNBQ1ZXLEVBQVVYLEVBQWEvTSxFQUUvQixDQUVBLElBQUkrTSxFQUFjRSxFQUFVdEwsS0FBUXFKLEVBQVlBLEVBQVVySixHQUFrQyxJQUU1RixLQUFNLFNBQVVvTCxHQUFjLE9BRTlCLElBQ0UsTUFBTXpOLFFBQW1CRyxFQUFHUSxTQUFTQyxTQUFTRixFQUFVLFFBQ2xEMk4sRUFBY0MsRUFBS0MsS0FBS3ZPLEdBQzlCeU4sRUFBY3hJLEVBQU1DLElBQUksQ0FBQ3VJLEVBQWFZLEVBQWFaLEdBQWMsQ0FBRWUsV0FBWTNFLEdBQ2pGLENBQUUsTUFDQSxDQUdFeEgsRUFBS29NLFdBQVcsWUFDbEJoQixFQUFjLElBQ1RBLEVBQ0h4QyxZQUFhLENBQ1hDLE1BQU8seUJBQ1Asc0JBQXNCLElEOVd2QixTQUNMYixFQUNBcEQsR0FFQSxNQUFNN0UsRUFBUWlJLEVBQUlwRCxVQUVYb0QsRUFBSXBELEdBQ1ZvRCxFQUE4QnBELEdBQU83RSxDQUV4QyxDQ3lXSXNNLENBQWFqQixFQUFhLFFBQ3RCQSxFQUFZN0MsSUFBSVQsT0FDbEJzRCxFQUFZN0MsR0FBR1QsS0FBSyxnQkFBa0IsSUFDakMsSUFBSTRDLElBQUksQ0FBQyxRQUFTLGdCQUFrQlUsRUFBWTdDLEdBQUdULEtBQUssaUJBQW1CLFFBS3BGLElBQUl3RSxHQUFxQixFQUN6QixJQUFLLE1BQU1DLEtBQU83SCxPQUFPWixPQUFPc0gsRUFBWXRDLE1BRXJDeUQsRUFBSXRELE1BQU1ySixTQUFTLDBCQUV4QjRNLEVBQWEvTyxFQUFROE8sRUFBS3ZNLEdBQzFCc00sR0FBcUIsR0FFdkIsR0FBS0EsRUFBTCxDQUVBLE9BQVF0TSxHQUNOLElBQUssVUFDSCxHQUFJb0wsRUFBWTdDLElBQUlrRSxnQkFDWHJCLEVBQVk3QyxHQUFHVCxTQUNqQixNQUFJc0QsRUFBWTdDLElBQUlULE1BQVFySyxFQUFPNkwsUUFBUWIsU0FBUzFFLE9BQVMsR0FLbEUsa0JBRE1qRyxFQUFHUSxTQUFTaU0sR0FBR3ZNLEVBQUtDLEtBQUtvTSxFQUFlLGVBQWdCLENBQUVHLE9BQU8sSUFIdkVZLEVBQVk3QyxHQUFHVCxLQUFLVyxTQUFXaEwsRUFBTzZMLFFBQVFiLFFBS2hELENBQ0EsTUFFRixJQUFLLE9BRUMyQyxFQUFZN0MsSUFBSUMscUJBQ1g0QyxFQUFZN0MsR0FBR0MsYUFBYSxnQkFFakM0QyxFQUFZN0MsSUFBSVQsY0FDWHNELEVBQVk3QyxHQUFHVCxLQUFLLGdCQUMzQnNELEVBQVk3QyxHQUFHVCxLQUFLVyxTQUFXMkMsRUFBWTdDLEdBQUdULEtBQUtXLFNBQVNrQyxPQUFRK0IsR0FBc0IsZ0JBQVhBLElBU3JGLEdBSEFaLEVBQWdCVixTQUNWVyxFQUFVWCxFQUFhL00sR0FFaEIsWUFBVDJCLFFBQ0lsQyxFQUFHUSxTQUFTaU0sR0FBR3ZNLEVBQUtDLEtBQUtvTSxFQUFlLHdCQUF5QixDQUFFRyxPQUFPLFNBQzNFLEdBQWEsU0FBVHhLLEVBQWlCLENBRTFCLFNBRE1sQyxFQUFHUSxTQUFTaU0sR0FBR3ZNLEVBQUtDLEtBQUtvTSxFQUFlLGlCQUFrQixDQUFFRyxPQUFPLEtBQ3BFWSxFQUFZdEMsS0FBS1csTUFBTVAsS0FBTSxPQUdsQ2tDLEVBQVl0QyxLQUFLLGNBQWdCc0MsRUFBWXRDLEtBQUtXLEtBQ2xELE1BQU1rRCxFQUFTdkIsRUFBWXRDLEtBQUtXLEtBQUtQLEtBQUswRCx5QkFDMUMsR0FBc0IsaUJBQVhELEVBQXFCLE9BRWhDdkIsRUFBWXRDLEtBQUtXLEtBQUtQLEtBQUswRCx5QkFBMkIsV0FBV0QsSUFDakV2QixFQUFZck8sS0FBTyxnQkFDbkJxTyxFQUFZN0MsR0FBSyxDQUFFc0Usa0JBQW1CLGFBQy9CekIsRUFBWXRDLEtBQUtXLFdBQ2xCc0MsRUFBVVgsRUFBYXBOLEVBQUtDLEtBQUtvTSxFQUFlLGtCQUN4RCxDQS9DeUIsQ0FnRDNCLENBRUEsU0FBU21DLEVBQWEvTyxFQUF1QjhPLEVBQVV2TSxHQStCckQsR0E5QkF1TSxFQUFJckQsT0FBUyxDQUFBLEVBQ2JxRCxFQUFJM0MsVUFBWSxDQUFBLFNBRVQyQyxFQUFJM0MsUUFBUWtELFVBR1IsU0FBVDlNLEdBQ1MsWUFBVEEsR0FDUyxrQkFBVEEsR0FDUyxpQkFBVEEsR0FDUyxrQkFBVEEsSUFFQXVNLEVBQUkzQyxRQUFRbUQsU0FBVywrQkFJWixrQkFBVC9NLEdBQXFDLGlCQUFUQSxHQUFvQyxrQkFBVEEsSUFDekR1TSxFQUFJckQsS0FBSyxnQkFBa0J6TCxFQUFPK04sTUFBUSwyQkFBNkIseUJBRXJFZSxFQUFJM0MsUUFBUW9ELGlCQUNkVCxFQUFJM0MsUUFBUXFELDZCQUErQixxREFDcENWLEVBQUkzQyxRQUFRb0QsaUJBR2xCVCxFQUFJM0MsUUFBUXNELHNCQUFpQyxZQUFUbE4sR0FBc0JBLEVBQUtvTSxXQUFXLFlBQzFFRyxFQUFJckQsS0FBS2lFLFlBQWNuTixFQUFLb00sV0FBVyxhQUV4Q0csRUFBSTNDLFFBQVFzRCxvQkFBc0Isa0RBR3ZCLFNBQVRsTixFQUFpQixDQUNuQixNQUFNMk0sRUFBU0osRUFBSXJELEtBQUswRCx5QkFDRixpQkFBWEQsSUFDVEosRUFBSXJELEtBQUswRCx5QkFBMkJELEVBQU9sTixRQUFRLFFBQVMsSUFFaEUsQ0FvQ0EsR0FsQ0loQyxFQUFPMk0sWUFBWWdDLFdBQVcsdUJBQ2hDRyxFQUFJdEQsS0FBT3NELEVBQUl0RCxNQUFNeEosUUFBUSxrQkFBbUIsZ0JBQ3ZDaEMsRUFBTzJNLFlBQVlnQyxXQUFXLDRCQUN2Q0csRUFBSXRELEtBQU9zRCxFQUFJdEQsTUFBTXhKLFFBQVEsZUFBZ0Isb0JBSWpCLFNBQTFCOE0sRUFBSXJELEtBQUtrRSxxQkFDSmIsRUFBSXJELEtBQUtrRSxhQTJFcEIsU0FBb0JiLEdBRWxCLElBQUtBLEVBQUlyRCxLQUFNLGNBQ1JxRCxFQUFJckQsS0FBS21FLHVCQUNUZCxFQUFJckQsS0FBS29FLHNCQUNUZixFQUFJckQsS0FBS3FFLG1CQUNUaEIsRUFBSXJELEtBQUtzRSxzQkFDVGpCLEVBQUlyRCxLQUFLdUUsYUFDVGxCLEVBQUlyRCxLQUFLd0UsY0FFWm5CLEVBQUlyRCxLQUFLeUUsVUFDWHBCLEVBQUlyRCxLQUFLMEUsU0FBV3JCLEVBQUlyRCxLQUFLeUUsZUFDdEJwQixFQUFJckQsS0FBS3lFLFFBRXBCLENBdEZFRSxDQUFXdEIsR0FHUHZNLEVBQUtvTSxXQUFXLFdBQWFHLEVBQUkzQyxRQUFRa0UsZUFBb0QsaUJBQTVCdkIsRUFBSXJELEtBQUs2RSxpQkFDNUV4QixFQUFJckQsS0FBSzZFLGVBQWlCeEIsRUFBSXJELEtBQUs2RSxlQUFldE8sUUFBUSxZQUFhLEtBRXJFaEMsRUFBT0Msd0JBQTBCNk8sRUFBSXJELEtBQUswRSxVQUFZNU4sRUFBS29NLFdBQVcsVUFDeEVHLEVBQUlyRCxLQUFLMEUsU0FBVyxTQUdULFlBQVQ1TixHQUErQixTQUFUQSxHQUFtQkEsRUFBS29NLFdBQVcsVUFDdkQzTyxFQUFPNE4sZUFDVGtCLEVBQUlyRCxLQUFLOEUsc0JBQXVCLFVBRzNCekIsRUFBSXJELEtBQUs4RSxxQkFHZHRKLE9BQU91SixLQUFLMUIsRUFBSXJELE1BQU1uRixPQUFTLEVBQ2pDZ0UsRUFBU3dFLEVBQUlyRCxhQUVOcUQsRUFBSXJELEtBRVR4RSxPQUFPdUosS0FBSzFCLEVBQUkzQyxTQUFTN0YsT0FBUyxFQUFHLENBRXZDLE1BQU1tSyxFQUFhbkcsRUFBU3dFLEVBQUkzQyxnQkFDekIyQyxFQUFJM0MsUUFDWDJDLEVBQUkzQyxRQUFVc0UsQ0FDaEIsYUFDUzNCLEVBQUkzQyxPQUVmLENBK0JBck0sZUFBZXdPLEVBQVVYLEVBQXVCL00sR0FDOUMsTUFBTThQLEVBQVdsQyxFQUFLbUMsS0FBS2hELEVBQWEsQ0FBRWlELFdBQVcsRUFBSUMsY0FBYyxFQUFNQyxPQUFRLENBQUUsU0FBVSxpQkFDM0Z6USxFQUFHUSxTQUFTUCxVQUFVTSxFQUFVOFAsRUFDeEMsQ0FFQSxTQUFTckMsRUFBZ0JWLFVBRWhCQSxFQUFZdEMsS0FBSyxpQkFDMUIsQ0M5aEJPdkwsZUFBZWlSLEVBQVNDLEdBQzdCLE9BQU81UixFQUFPQywwQkFBMEIsV0FBWVMsVUFDbEQsR0FBSTRNLEVBQXdCc0UsRUFBY3JFLFlBQWEsT0FFdkQsTUFBTWxNLEVBQVV1USxFQUFjdlEsUUFDeEJ3USxRQUFpQjFKLEVBQUdDLEtBQUssVUFBVyxDQUFFQyxLQUFLLEVBQU1DLElBQUtqSCxFQUFTa0gsT0FBUVAsSUFDekVuSSxFQUFRQyxXQUNWTSxRQUFRQyxLQUFLLFNBQVN3UixFQUFTM0ssNEJBQTRCN0YsS0FFN0QsSUFBSyxNQUFNeVEsS0FBVUQsRUFBVSxDQUM3QixNQUFNclEsRUFBV0wsRUFBS0MsS0FBS0MsRUFBU3lRLFNBQzlCM1AsRUFBWWEsSUFBSXRDLFVBQ3BCLE1BQU1rQixRQUFnQlgsRUFBR1EsU0FBU0MsU0FBU0YsRUFBVSxRQUNyRCxJQUFJUixFQUFhK1EsRUFBZW5RLEdBQ2hDWixFQUFhZ1IsR0FBa0JoUixFQUFZNFEsRUFBZSxPQUN0RGhRLElBQVlaLFNBQ1JNLEVBQU9LLGFBQWFILEVBQVVSLElBRzFDLENBRUEsTUFBTWlSLFFBQWdCOUosRUFBR0MsS0FDdkIsQ0FDRSw4REFDQSwyRUFFRixDQUFFQyxLQUFLLEVBQU1DLElBQUtqSCxFQUFTa0gsT0FBUVAsSUFFakNuSSxFQUFRQyxXQUNWTSxRQUFRQyxLQUFLLFNBQVM0UixFQUFRL0ssOEJBQThCN0YsS0FFOUQsSUFBSyxNQUFNNlEsS0FBVUQsRUFBUyxDQUM1QixNQUFNelEsRUFBV0wsRUFBS0MsS0FBS0MsRUFBUzZRLEdBQzlCcFIsUUFBbUJHLEVBQUdRLFNBQVNDLFNBQVNGLEVBQVUsUUFDeEQsSUFBSVIsRUFBYW1SLEVBQWVyUixHQUNoQ0UsRUFBYWdSLEdBQWtCaFIsRUFBWTRRLEVBQWUsTUFFdEQ5USxJQUFlRSxTQUNiTSxFQUFPSyxhQUFhSCxFQUFVUixFQUN0QyxDQUVBLE1BQU1vUixRQUF1QmpLLEVBQUdDLEtBQUssdUNBQXdDLENBQzNFQyxLQUFLLEVBQ0xDLElBQUtqSCxFQUNMa0gsT0FBUVAsSUFFTm5JLEVBQVFDLFdBQ1ZNLFFBQVFDLEtBQUssU0FBUytSLEVBQWVsTCw4QkFBOEI3RixLQUVyRSxJQUFLLE1BQU1nUixLQUFRRCxFQUFnQixDQUNqQyxNQUFNNVEsRUFBV0wsRUFBS0MsS0FBS0MsRUFBU2dSLEdBQzlCdlIsUUFBbUJHLEVBQUdRLFNBQVNDLFNBQVNGLEVBQVUsUUFDeEQsSUFBSVIsRUFBYStRLEVBQWVqUixHQUNoQ0UsRUFBYWdSLEdBQWtCaFIsRUFBWTRRLEVBQWUsUUFFdEQ5USxJQUFlRSxTQUNiTSxFQUFPSyxhQUFhSCxFQUFVUixFQUN0QyxPQUVNbUIsRUFBWW1RLGNBRXRCLENBRU8sU0FBU1AsRUFBZW5RLEdBQzdCLE9BQU9BLEVBQ0pLLFdBQVcsa0JBQW1CLFNBQzlCQSxXQUFXLGdCQUFpQixVQUM1QkEsV0FBVyxnQkFBaUIsU0FDakMsQ0FFQSxTQUFTa1EsRUFBZXZRLEdBQ3RCLE9BQU9BLEVBQ0pLLFdBQVcsa0JBQW1CLFdBQzlCQSxXQUFXLGdCQUFpQixZQUM1QkEsV0FBVyxnQkFBaUIsV0FDakMsQ0FFQSxTQUFTK1AsR0FBa0JoUixFQUFvQjRRLEVBQThCVyxHQUMzRSxJQUFLLE1BQU9DLEVBQVFDLEtBQVU1SyxPQUFPQyxRQUFROEosRUFBY2MsVUFBVUMsT0FBTzNNLEtBQU8sQ0FBQSxHQUNqRmhGLEVBQWFBLEVBQVdpQixXQUFXdVEsRUFBUUMsR0FFN0MsSUFBSyxNQUFPRCxFQUFRQyxLQUFVNUssT0FBT0MsUUFBUThKLEVBQWNjLFVBQVVDLFFBQVFKLElBQWEsQ0FBQSxHQUN4RnZSLEVBQWFBLEVBQVdpQixXQUFXdVEsRUFBUUMsR0FFN0MsT0FBT3pSLENBQ1QsQ0MzRk9OLGVBQWVrUyxHQUEwQnhGLEVBQTJCeUYsR0FDekUsT0FBTzdTLEVBQU9DLDBCQUEwQiw0QkFBNkJTLFVBQ25FLElBQUswTSxFQUFXOUQsT0FBUSxPQUd4QixNQUFNd0osRUFBa0IzUixFQUFLcUIsUUFBUTRLLEVBQVcvTCxRQUFTLG1CQUNuRDBSLFFBQXFCelIsRUFBT0Msc0JBQXNCdVIsR0FFeEQsSUFBSyxNQUFPM0UsRUFBVTZFLElBQWEsQ0FDakMsQ0FBQyxZQUFhLGFBQ2QsQ0FBQyxZQUFhLGVBQ2QsQ0FBQyxZQUFhLGVBQ0osQ0FDVixNQUFNcFIsRUFBVXFSLEdBQXlCN0YsRUFBWXlGLEVBQVlHLEVBQVVELEdBQ3JFdlIsRUFBV0wsRUFBS3FCLFFBQVE0SyxFQUFXL0wsUUFBUzhNLFNBQzVDaE0sRUFBWWEsSUFBSSxJQUFNMUIsRUFBT0ssYUFBYUgsRUFBVUksR0FDNUQsQ0FFQSxNQUFNc1IsRUFBa0IvUixFQUFLcUIsUUFBUTRLLEVBQVcvTCxRQUFTLDZCQUNuRDhSLEVBZ0VWLFNBQ0V2UyxFQUNBaVMsRUFDQUUsR0FFQSxNQUFNSyxFQUFjLHlFQUNkQyxFQUFPSixHQUF5QnJTLEVBQVFpUyxFQUFZLFNBQVVFLEdBQ3BFLE1BQU8sR0FBR0ssUUFBa0JDLEdBQzlCLENBeEUrQkMsQ0FBZ0NsRyxFQUFZeUYsRUFBWUUsU0FDN0U1USxFQUFZYSxJQUFJLElBQU0xQixFQUFPSyxhQUFhdVIsRUFBaUJDLEtBRXJFLENBRUEsU0FBU0YsR0FDUDdGLEVBQ0F5RixFQUNBRyxFQUNBRCxHQUVBLE1BQU1yRSxFQUFpQnRCLEVBQVd1QixNQUFRLE1BQVEsT0FDNUM0RSxFQUFjLHVDQUdabkcsRUFBV2pELGFBQWFqSyx3QkFDakJrTixFQUFXakQsYUFBYXFKLG1DQUNwQjlFLG1DQUtuQm1FLEVBQVcvTCxLQUFNMk0sR0FBTUEsRUFBRTFGLFVBQVUyRixXQUMvQix1U0FDQSw2RkFHK0JoRiw4RkFBMkdBLDRjQUk3RXRCLEVBQVd1RyxrQkFBb0IseUNBQXlDWCwrQkFBd0MsaUVBR2pMSCxFQUFXL0wsS0FBTTJNLEdBQU1BLEVBQUVHLGNBQ3JCLFdBQVdsRixzRUFDWCwwakJBV0ptRSxFQUFXL0wsS0FBTTJNLEdBQU1BLEVBQUUxRixVQUFVOEYsT0FBU0osRUFBRTFGLFVBQVUrRixNQUNwRCx1RUFDQSxPQUdKakIsRUFBVy9MLEtBQU0yTSxHQUFNQSxFQUFFMUYsVUFBVStGLE1BQy9CLGdJQUNBLE9BR0Q3UixXQUFXLFlBQWEsUUFDeEJBLFdBQVcsVUFBVyxRQUN0QkMsT0FFSCxPQUFPNlEsRUFBZVEsRUFBYyxLQUFPUixFQUFhZ0IsVUFBWVIsQ0FDdEUsQ0M3RU8sTUFBTVMsR0FBYSxJQVQxQixNQUNFQyxhQUFBQSxDQUFjQyxHQUNaLE1BQU1DLEVBQXFCRCxFQUFjM00sTUFBTSxLQUFLQyxPQUM5QzRNLEVBQVFELEdBQW9CNU0sTUFBTSxLQUd4QyxNQUFPLENBRks2TSxHQUFPNU0sSUFBRyxJQUFPLEdBQ2hCNE0sR0FBTzVNLElBQUcsSUFBSzVFLFFBQVEsUUFBUyxLQUFPLEdBRXRELEdBSUl5UixHQUFlLElBQUlDLElBRWxCLFNBQVNDLEdBQVdDLEdBQ3pCLE1BQU16TSxFQUFNeU0sR0FBUyxHQUNmQyxFQUFTSixHQUFhSyxJQUFJM00sR0FDaEMsR0FBSTBNLEVBQVEsT0FBT0EsRUFFbkIsTUFBTUUsRUFBVSxJQUFJQyxFQUFRLENBQzFCQyxLQUFNQyxHQUFlTixTQUFVak8sSUFHakMsT0FEQThOLEdBQWFVLElBQUloTixFQUFLNE0sR0FDZkEsQ0FDVCxDQUVPLFNBQVNLLEdBQWVSLEdBQzdCLFFBQVNNLEdBQWVOLEVBQzFCLENBRUEsU0FBU00sR0FBZU4sR0FDdEIsTUFBYyxnQkFBVkEsRUFDS1MsUUFBUTVRLElBQUk2USwyQkFFUCxtQkFBVlYsRUFDS1MsUUFBUTVRLElBQUk4USw4QkFHbkJGLFFBQVE1USxJQUFJNlEsNEJBQ1pELFFBQVE1USxJQUFJOFEsK0JBQ1pGLFFBQVE1USxJQUFJNkwsVUFDWitFLFFBQVE1USxJQUFJK1EsWUFFaEIsQ0N2Q08sU0FBU0MsR0FBVXJSLEVBQWlCc1IsRUFBZ0JoTixFQUFhaU4sRUFBUSxHQUM5RSxFQUFHLENBQ0QsTUFBT0MsRUFBUUMsRUFBUzVWLEdBQVc2VixHQUFpQjFSLEVBQVNzUixFQUFNaE4sR0FHbkUsR0FBbUIsSUFEUHFOLEVBQWNOLFVBQVVHLEVBQVFDLEVBQVM1VixHQUM3QytWLE9BQWMsS0FDeEIsU0FBV0wsR0FBUyxFQUN0QixDQUVPLFNBQVNNLEdBQTBCN1IsRUFBaUJzUixFQUFnQmhOLEdBQ3pFLE1BQU9rTixFQUFRQyxFQUFTNVYsR0FBVzZWLEdBQWlCMVIsRUFBU3NSLEVBQU1oTixHQUNuRXpJLEVBQVFpVyxNQUFRLE9BQ2hCLE1BQU1DLEVBQU9KLEVBQWNOLFVBQVVHLEVBQVFDLEVBQVM1VixHQUNoRFMsRUFBUXlWLEVBQUszUixPQUFPNFIsV0FBVzlULE9BTXJDLE9BTEk1QixHQUNGRixRQUFRRSxNQUNOLEdBQUdrVixNQUFXQyxFQUFRblQsSUFBSzJULEdBQU0sSUFBSUEsTUFBTTdVLEtBQUssb0RBQW9EZCxLQUdqR3lWLEVBQUs1UixPQUFPNlIsV0FBVzlULE1BQ2hDLENBRU8sU0FBU3dULEdBQWlCMVIsRUFBaUJzUixFQUFnQmhOLEdBQ2hFLE1BQU1qRSxFQUFNLElBQUs0USxRQUFRNVEsS0FFckJBLEVBQUk2UixNQUFRN1IsRUFBSThSLG1CQUNsQjlSLEVBQUk2UixLQUFPN1IsRUFBSTZSLEtBQUt0VCxRQUFRLEdBQUd5QixFQUFJOFIsb0JBQXFCLEtBRzFELE1BQU1DLEVBQVUvUixFQUFJZ1MsVUFBWSxHQUFHQyxFQUFHQyxrQkFDdEMsR0FBSUgsR0FBV25WLEVBQUcwQixXQUFXeVQsR0FBVSxDQUNyQyxNQUFNSSxFQUFZLENBQUMsR0FBR0osVUFBaUIsR0FBR0EsU0FDcENLLEVBQWVwUyxFQUFJNlIsS0FBTzdSLEVBQUk2UixLQUFLM08sTUFBTSxLQUFPLEdBQ3REbEQsRUFBSTZSLEtBQU8sSUFBSU0sS0FBY0MsRUFBYTNJLE9BQVFwTCxJQUFPOFQsRUFBVXpULFNBQVNMLEtBQUt0QixLQUFLLEtBQ3RGaUQsRUFBSWdTLFdBQWFELEVBQ2pCL1IsRUFBSXFTLHNCQUF3QixRQUM5QixDQU1BLE9BSklyUyxFQUFJZ1MsV0FDTmYsRUFBTyxDQUFDLEtBQU0sS0FBTSxHQUFHdFIsS0FBV3NSLEVBQUtsVSxLQUFLLFFBQzVDNEMsRUFBVSxRQUVMLENBQ0xBLEVBQ0FzUixFQUNBLENBQ0VoTixNQUNBakUsTUFDQXNTLE9BQU8sRUFDUGIsTUFBTyxXQUdiLENDekRPLFNBQVNjLEdBQXlCQyxHQUV2QyxNQUFNQyxFQUFVRCxFQUNidFAsTUFBTSxTQUNOakYsSUFBSXlVLFFBQ0pqSixPQUFRa0osSUFBU0QsT0FBT0UsTUFBTUQsSUFDakMsSUFBSUUsRUFBZ0IsRUFDaEJDLEVBQVUsRUFDZCxJQUFLLE1BQU1ILEtBQU9GLEVBQ2hCSSxHQUFpQkYsRUFBTUcsRUFDdkJBLEdBQVcsSUFFYixPQUFPRCxDQUNULENDYk8sTUFBTUUsR0FBaUIsU0FDakJDLEdBQWUsZ0JDVXJCM1csZUFBZTRXLEdBQXFCMVcsR0FDekMsT0FBT1osRUFBT0MsMEJBQTBCLHVCQUF3QlMsZ0JBUWxFQSxlQUFvQkUsR0FDbEIsSUFBS0EsRUFBTzJXLGFBQWMsT0FFMUIsTUFBTUMsRUFBb0I1VyxFQUFPMlcsYUFDOUJyVixPQUNBcUYsTUFBTSxNQUNOakYsSUFBS21WLElBQ0osTUFBT3ZYLEVBQU0yVyxHQUFXWSxFQUFLdlYsT0FBT3FGLE1BQU0sT0FFMUMsTUFBTyxHQUFHbVEsR0FBV0MsSUFBSXpYLEdBQVEsSUFBTSxJQUFNLEtBQUtBLEdBQVEsTUFBTTJXLEdBQVcsT0FFNUV4TCxXQUVBL0ksSUFBS21WLEdBQVNBLEVBQUt2VixRQUVuQjRMLE9BQVEySixJQUFVQSxFQUFLbEksV0FBVyxhQUMvQmxJLEVBQVEsSUFBSSxJQUFJd0csSUFBSTJKLElBRTFCLEdBQUk1VyxFQUFPZ1gsc0JBQXVCLENBQ2hDLE1BQU1DLFFBQWlCQyxNQUFNLHFDQUN2QkMsUUFBY0YsRUFBU0UsT0FDdkJDLEVBQWdCRCxHQUFNMVgsTUFBTXdXLFFBQzlCbUIsR0FDRkMsR0FBYzVRLEVBQU8sU0FBVTJRLEdBRWpDQyxHQUFjNVEsRUFBTyxTQUFVK1AsSUFBZ0IsRUFDakQsQ0FDSXhXLEVBQU9tTixVQUFVbUssVUFDbkJELEdBQWM1USxFQUFPLE9BQVFnUSxJQUFjLEdBRTdDLEdBQUl6VyxFQUFPdVgsdUJBQ1QsR0FBSXZYLEVBQU8rTixNQUFPLENBQ2hCLE1BQU15SixRQW1DWjFYLGVBQStDMlgsRUFBc0I5SyxHQUNuRSxJQUVFLE1BSU1zSixTQUppQnRDLEtBQWErRCxRQUFRLDRDQUE2QyxDQUN2RjlELE1BQU82RCxFQUNQRSxLQUFNaEwsS0FFaUJpTCxLQUFLQyxTQUN4QmhSLEVBQVFvUCxFQUFRNkIsWUFBWSxLQUM1QkMsR0FBK0IsSUFBWGxSLEVBQWVvUCxFQUFVQSxFQUFRL00sTUFBTXJDLEVBQVEsR0FFekUsTUFBTyxNQUFNOEUsS0FBS29NLEdBQXFCQSxPQUFvQnBTLENBQzdELENBQUUsTUFBT2pHLEdBRVAsWUFEQUYsUUFBUUUsTUFBTSxtQ0FBb0NBLEVBRXBELENBQ0YsQ0FuRCtCc1ksQ0FBZ0MsVUFBVyxPQUNoRVIsR0FBWUgsR0FBYzVRLEVBQU8sTUFBTytRLEVBQzlDLEtBQU8sQ0FDTCxNQUFNdkIsRUFBVWhCLEdBQTBCLE1BQU8sQ0FBQyxPQUFRLE9BQVEsV0FBWWpWLEVBQU9TLFNBQ3JGNFcsR0FBYzVRLEVBQU8sT0FBUXdQLEVBQy9CLENBR0YsSUFBSyxNQUFNZ0MsS0FBVUMsR0FBNkIsQ0FDaEQsTUFBTUMsRUFBYzVYLEVBQUtxQixRQUFRNUIsRUFBT1MsUUFBUyxJQUFJd1gsYUFDaEQ1WCxFQUFHUSxTQUFTaU0sR0FBR3FMLEVBQWEsQ0FBRXBMLE9BQU8sR0FDNUMsQ0FFQSxNQUFNcUwsRUFBbUI3WCxFQUFLcUIsUUFBUTVCLEVBQU9TLFFBQVMsd0JBQy9DZ0csRUFBTUgsT0FBUyxFQUNsQi9FLEVBQVlhLElBQUksSUFBTS9CLEVBQUdRLFNBQVNQLFVBQVU4WCxFQUFrQjNSLEVBQU1qRyxLQUFLLE1BQVEsT0FDakZlLEVBQVlhLElBQUksSUFBTS9CLEVBQUdRLFNBQVNpTSxHQUFHc0wsRUFBa0IsQ0FBRXJMLE9BQU8sWUFDOUR4TCxFQUFZbVEsYUFDbEIrQyxHQUFVLE9BQVEsQ0FBQyxTQUFVLFNBQVUsU0FBVXpVLEVBQU9TLFNBQ3hEZ1UsR0FBVSxPQUFRLENBQUMsV0FBWXpVLEVBQU9TLFFBQ3hDLENBM0RVNFgsQ0FBS3JZLElBRWYsQ0FFQSxNQUFNOFcsR0FBYSxJQUFJN0osSUFBSSxDQUFDLE9BQVEsU0FBVSxNQUFPLFdBQy9DaUwsR0FBOEIsQ0FBQyxPQUFRLE9BQVEsVUF3RHJELFNBQVNiLEdBQWM1USxFQUFpQjJMLEVBQWtCa0csRUFBb0JDLEdBQU8sR0FDbkYsTUFBTTFSLEVBQVFKLEVBQU0rUixVQUFXQyxHQUFNQSxFQUFFOVIsTUFBTSxPQUFPLEtBQU95TCxHQUNyRHNHLEVBQVUsR0FBR3RHLEtBQVlrRyxJQUMvQixJQUFjLElBQVZ6UixFQUNGSixFQUFNa1MsT0FBT0osRUFBTyxFQUFJOVIsRUFBTUgsT0FBUSxFQUFHb1MsT0FDcEMsQ0FDTCxNQUFNLENBQUd6QyxHQUFZeFAsRUFBTUksR0FBa0JGLE1BQU0sT0FDL0NxUCxHQUF5QnNDLEdBQWN0QyxHQUF5QkMsR0FBVyxNQUM3RXhQLEVBQU1JLEdBQVM2UixFQUVuQixDQUNGLENDMUVPNVksZUFBZThZLEdBQW1CNVksR0FDdkMsT0FBT1osRUFBT0MsMEJBQTBCLHFCQUFzQlMsVUFDNUQsSUFBSTZOLEVBQXNCLENBQ3hCa0wsS0FBTTdZLEVBQU8wSSxPQUNib1EsUUFBUywwREFDVEMsUUFBUyxDQUFDLDhCQUVaLE1BQU1uWSxFQUFXTCxFQUFLcUIsUUFBUTVCLEVBQU9TLFFBQVMsZUFDOUMsSUFDRSxNQUFNUCxRQUFtQkcsRUFBR1EsU0FBU0MsU0FBU0YsRUFBVSxRQUNsRDJOLEVBQWN5SyxLQUFLQyxNQUFNL1ksR0FDL0J5TixFQUFjeEksRUFBTUMsSUFBSSxDQUFDdUksRUFBYVksRUFBYVosR0FBYyxDQUFFZSxXQUFZOUUsR0FDakYsQ0FBRSxNQUNBLENBRUYsTUFBTXhKLEVBQWE0WSxLQUFLRSxVQUFVdkwsU0FDNUJwTSxFQUFZYSxJQUFJLElBQU0xQixFQUFPSyxhQUFhSCxFQUFVUixLQUU5RCxDQ3lCT04sZUFBZXFaLEdBQW1CblosR0FDdkMsT0FBT1osRUFBT0MsMEJBQTBCLHFCQUFzQlMsVUFDNUQsTUFBTWMsRUFBV0wsRUFBS3FCLFFBQVE1QixFQUFPUyxRQUFTLGVBQ3hDTyxFQUNKWCxFQUFHMEIsV0FBV25CLElBQWFQLEVBQUcrWSxhQUFheFksRUFBVSxRQUFRdUIsU0FBUyxpQkEzQjNDLDRmQXZCRCxpZ0JBcUR0QlosRUFBWWEsSUFBSSxJQUFNMUIsRUFBT0ssYUFBYUgsRUFBVUksS0FFOUQsQ0M3REEsTUFBTXFZLEdBQW9CLDhCQUNwQkMsR0FBeUIsd0NBQ3pCQyxHQUFZLHNCQUVaQyxHQUF5QixHQUFHSCxrQkFHaENFLE9BRUlFLEdBQXlCLEtBQzdCSixjQUdXSyxHQUFpQixDQUM1QkgsYUFDQUksZ0JBWnNCLGtCQWF0QkgsMEJBQ0FDLDBCQUNBLG9DQUFNRyxDQUErQmhaLEdBQ25DLElBQ0UsSUFBSUksUUFBZ0JYLEVBQUdRLFNBQVNDLFNBQVNGLEVBQVUsUUFDbkQsTUFBTWlaLEVBQWtCQyxHQUFnQzlZLEdBSXhELE9BSEk2WSxFQUFrQixJQUNwQjdZLEVBQVVBLEVBQVFrSSxNQUFNLEVBQUcyUSxFQUFrQixJQUc3QzdZLEVBQ0dLLFdBQVdpWSxHQUF3QixJQUNuQ2pZLFdBQVcsNEJBQTZCLElBQ3hDQSxXQUFXLHVCQUF3QixRQUNuQ0MsT0FBUyxJQUVoQixDQUFFLE1BQ0EsQ0FFSixFQUNBeVksa0JBQUFBLENBQW1CL1ksR0FDakIsTUFBTTZGLEVBQVE3RixFQUFRZ1osUUFBUUMsS0FBS04saUJBQ25DLE9BQWMsSUFBVjlTLEVBQ0s3RixFQUNKa0ksTUFBTSxFQUFHbEksRUFBUWdaLFFBQVEsS0FBTW5ULEdBQVMsR0FDeEN4RixXQUFXaVksR0FBd0IsR0FBR0QsZUFFcENHLEVBQ1QsRUFDQVUsa0JBQUFBLENBQW1CbFosR0FDakIsTUFBTTZZLEVBQWtCQyxHQUFnQzlZLEdBQ3hELE9BQUk2WSxFQUFrQixFQUNiN1ksRUFBUWtJLE1BQU0yUSxFQUFrQixHQUVsQ0osRUFDVCxFQUNBLCtCQUFNVSxDQUEwQnZaLEdBQzlCLElBRUUsYUFEc0JQLEVBQUdRLFNBQVNDLFNBQVNGLEVBQVUsU0FDdEN1QixTQUFTLGlCQUMxQixDQUFFLE1BQ0EsT0FBTyxDQUNULENBQ0YsR0FHRixTQUFTMlgsR0FBZ0M5WSxHQUN2QyxNQUFNNkYsRUFBUTdGLEVBQVFnWixRQUFRWCxJQUN4QmUsRUFBWXBaLEVBQVE4VyxZQUFZdUIsSUFDdEMsT0FBT2UsRUFBWXZULEVBQVF1VCxHQUFZLENBQ3pDLENDbkRPdGEsZUFBZXVhLEdBQXFCcmEsR0FDekMsT0FBT1osRUFBT0MsMEJBQTBCLHVCQUF3QlMsVUFDOUQsTUFBTWMsRUFBV0wsRUFBS3FCLFFBQVE1QixFQUFPUyxRQUFTLGlCQUM5QyxHQUFJVCxFQUFPQyxzQkFBdUIsQ0FDaEMsTUFBTWUsUUFBaUJOLEVBQU9DLHNCQUFzQkMsSUFBYyxHQUk1RFIsRUFIa0JzWixHQUFlSyxtQkFBbUIvWSxHQVoxQyxtRUFhUTBZLEdBQWVRLG1CQUFtQmxaLFNBR3BETyxFQUFZYSxJQUFJLElBQU0xQixFQUFPSyxhQUFhSCxFQUFVUixHQUM1RCxZQUNRQyxFQUFHUSxTQUFTaU0sR0FBR2xNLEVBQVUsQ0FBRW1NLE9BQU8sS0FHOUMsQ0MvQk8sTUFBTXVOLEdBQWEsQ0FDeEJDLG9CQUFxQixDQUNuQixNQUNBLE1BQ0EsS0FDQSxNQUNBLE1BQ0EsTUFDQSxLQUNBLE1BQ0EsT0FDQSxRQUNBLFFBQ0EsTUFDQSxPQUNBLE1BQ0EsT0FDQSxLQUNBLE9BQ0EsS0FDQSxNQUNBLE1BQ0EsT0FDQSxNQUNBLE1BQ0E5UCxXQUNGK1Asb0JBQXFCLENBQUMsS0FBTSxTQUFVLE9BQVEsTUFBTS9QLFdBQ3BEZ1EsYUFBYyxDQUFDLE1BQU1oUSxXQUNyQmlRLE9BQVEsQ0FBQyxNQUFPLE1BQU8sS0FBTSxNQUFPLE1BQU8sS0FBTSxNQUFPLE9BQU9qUSxXQUMvRGtRLFNBQVUsQ0FDUixNQUNBLE1BQ0EsT0FDQSxLQUNBLE1BQ0EsTUFDQSxNQUNBLEtBQ0EsTUFDQSxPQUNBLFFBQ0EsUUFDQSxNQUNBLE1BQ0EsT0FDQSxLQUNBLE9BQ0EsTUFDQSxPQUNBLE9BQ0FsUSxXQUVGbVEsTUFBTyxDQUNMLE1BQ0EsTUFDQSxLQUNBLE1BQ0EsTUFDQSxNQUNBLEtBQ0EsTUFDQSxPQUNBLFFBQ0EsUUFDQSxNQUNBLE9BQ0EsTUFDQSxTQUNBLFFBQ0EsTUFDQSxPQUNBLE1BQ0EsT0FDQW5RLFlDakVFckssR0FBYSwwSEFRakJ5YSxHQUFtQlAsR0FBV0Msa0VBSTlCTSxHQUFtQlAsR0FBV0Usa0VBSTlCSyxHQUFtQlAsR0FBV0csb0hBUXpCM2EsZUFBZWdiLEdBQXFCOWEsR0FDekMsT0FBT1osRUFBT0MsMEJBQTBCLHVCQUF3QlMsVUFDOUQsTUFBTWMsRUFBV0wsRUFBS3FCLFFBQVE1QixFQUFPUyxRQUFTLHVCQUN4Q2MsRUFBWWEsSUFBSSxJQUFNMUIsRUFBT0ssYUFBYUgsRUFBVVIsTUFFOUQsQ0FFQSxTQUFTeWEsR0FBbUJQLEdBQzFCLE9BQU9BLEVBQVdoVSxPQUFTLEVBQUksT0FBT2dVLEVBQVc5WixLQUFLLFNBQVcsTUFBTThaLEVBQVcsS0FDcEYsQ0NqQ094YSxlQUFlaWIsR0FBaUIvYSxHQUNyQyxPQUFPWixFQUFPQywwQkFBMEIsbUJBQW9CUyxnQkFFcER5QixFQUFZYSxJQUFJLElBQU0vQixFQUFHUSxTQUFTaU0sR0FBR3ZNLEVBQUtxQixRQUFRNUIsRUFBT1MsUUFBUyxrQkFBbUIsQ0FBRXNNLE9BQU8sV0FDOUZ4TCxFQUFZYSxJQUFJLElBQU0vQixFQUFHUSxTQUFTaU0sR0FBR3ZNLEVBQUtxQixRQUFRNUIsRUFBT1MsUUFBUyxpQkFBa0IsQ0FBRXNNLE9BQU8sV0FDN0Z4TCxFQUFZYSxJQUFJLElBQU0vQixFQUFHUSxTQUFTaU0sR0FBR3ZNLEVBQUtxQixRQUFRNUIsRUFBT1MsUUFBUyxvQkFBcUIsQ0FBRXNNLE9BQU8sS0FFdEcsTUFBTW5NLEVBQVdMLEVBQUtxQixRQUFRNUIsRUFBT1MsUUFBUyxxQkFDOUMsR0FBSVQsRUFBTytOLFlBQ0h4TSxFQUFZYSxJQUFJLElBQU0vQixFQUFHUSxTQUFTaU0sR0FBR2xNLEVBQVUsQ0FBRW1NLE9BQU8sVUFJaEUsR0FBSy9NLEVBQU9nYixXQUFaLENBRUEsSUFFRSxXQUR5QjNhLEVBQUdRLFNBQVNDLFNBQVNGLEVBQVUsU0FDeEN1QixTQUFTLHNCQUF1QixNQUNsRCxDQUFFLE1BQ0EsT0FHSVosRUFBWWEsSUFBSSxJQUFNMUIsRUFBT0ssYUFBYUgsRUFBVSw0QkFBNEJaLEVBQU9nYixnQkFUckUsR0FXNUIsQ0NuQkEsTUFBTXZZLEdBQWdCLENBQ3BCd1ksVUFBVSxFQUNWQyxZQUFhLENBQ1hDLFNBQVMsRUFDVEMsMkJBQTRCLFNBQzVCQyxxQkFBcUIsRUFDckJDLG9CQUFxQixDQUNuQkMsTUFBTSxFQUNOQyxTQUFTLEVBQ1ROLGFBQWEsSUFHakJPLGdCQUFpQixDQUFDLHFCQUdiM2IsZUFBZTRiLEdBQXFCMWIsR0FDekMsT0FBT1osRUFBT0MsMEJBQTBCLHVCQUF3QlMsVUFDOUQsSUFBS0UsRUFBTzBJLE9BQVEsT0FFcEIsTUFBTWpJLEVBQVVGLEVBQUtxQixRQUFRNUIsRUFBT1MsUUFBUyxXQUN2Q2tiLEVBQWlCcGIsRUFBS3FCLFFBQVFuQixFQUFTLGNBQ3ZDbWIsRUFBcUJyYixFQUFLcUIsUUFBUW5CLEVBQVMsaUJBRWpELElBQUlvYixFQUFvQmhPLEVBQVVwTCxJQUNsQyxJQUNFLE1BQU12QyxRQUFtQkcsRUFBR1EsU0FBU0MsU0FBUzZhLEVBQWdCLFFBQ3hERyxFQUFZdE4sRUFBS0MsS0FBS3ZPLEdBQzVCMmIsRUFBWTFXLEVBQU1DLElBQUksQ0FBQ3lXLEVBQVdDLEVBQVdELEdBQVksQ0FBRW5OLFdBQVk5RSxHQUN6RSxDQUFFLE1BQ0EsQ0FHRixNQUFNbVMsRUFBY3ZOLEVBQUttQyxLQUFLa0wsRUFBVyxDQUN2Q2pMLFdBQVcsRUFDWEMsY0FBYyxFQUNkQyxPQUFRLENBQ04sU0FBVSxXQU1SalEsRUFBVyxDQUFDVSxFQUFZYSxJQUFJLElBQU0xQixFQUFPSyxhQUFhNGEsRUFBZ0JJLEtBQ3ZFMWIsRUFBRzBCLFdBQVc2WixJQUNqQi9hLEVBQVN3SixLQUFLOUksRUFBWWEsSUFBSSxJQUFNMUIsRUFBT0ssYUFBYTZhLEVBSmhDLDJCQU1wQjVULFFBQVE1QyxJQUFJdkUsSUFFdEIsQ0N2RE9mLGVBQWVrYyxHQUFxQmhjLEdBQ3pDLE9BQU9aLEVBQU9DLDBCQUEwQix5QkFBMEJTLFVBQ2hFLElBQUtFLEVBQU8wSSxPQUFRLE9BRXBCLE1BQU1qSSxFQUFVRixFQUFLcUIsUUFBUTVCLEVBQU9TLFFBQVMsV0FDdkNHLEVBQVdMLEVBQUtxQixRQUFRbkIsRUFBUyx1QkFDakNKLEVBQUdRLFNBQVNpTSxHQUFHbE0sRUFBVSxDQUFFbU0sT0FBTyxLQUU1QyxDQ0xBLE1BQU0zTSxHQUFhLHVFQUtqQixJQUFJa2EsR0FBV0MsdUJBQXdCRCxHQUFXRSx1QkFBd0JGLEdBQVdHLGNBQ3BGL1ksSUFBS0MsR0FBUSxLQUFLQSxpQkFDbEJuQixLQUFLLDZDQUtEVixlQUFlbWMsR0FBc0JqYyxHQUMxQyxPQUFPWixFQUFPQywwQkFBMEIsd0JBQXlCUyxVQUMvRCxNQUFNYyxFQUFXTCxFQUFLcUIsUUFBUTVCLEVBQU9TLFFBQVMsd0JBQ3hDYyxFQUFZYSxJQUFJLElBQU0xQixFQUFPSyxhQUFhSCxFQUFVUixNQUU5RCxDQ2ZBLE1BQU04YixHQUFlLENBQUMsVUFBVyxRQUFTLFFBQVMsWUFBYSxtQkFBb0IsUUFBUyxNQUFPLFFBb0I3RnBjLGVBQWVxYyxHQUFrQm5jLEVBQXVCd00sR0FDN0QsT0FBT3BOLEVBQU9DLDBCQUEwQixvQkFBcUJTLFVBQzNELE1BQU1jLEVBQVdMLEVBQUtxQixRQUFRNUIsRUFBT1MsUUFBUyxjQUN4Q08sUUFBaUJOLEVBQU9DLHNCQUFzQkMsSUFBYyxHQUNsRSxJQUFJd2IsRUFBa0IxQyxHQUFlSyxtQkFBbUIvWSxHQXRCdEMsNk5BdUJsQixNQUFNcWIsRUFBa0IzQyxHQUFlUSxtQkFBbUJsWixHQUVwRHdTLEVBQVEsSUFBSTBJLElBQ2RsYyxFQUFPc2Msb0JBQ1Q5SSxFQUFNbkosS0FBSyxRQUVUckssRUFBT3VjLG1CQUNUL0ksRUFBTW5KLEtBQUssTUFDWCtSLEdBQW1CLEdBQUc3YixFQUFLaU4sU0FBU3hOLEVBQU9TLGNBR3pDVCxFQUFPdVgsd0JBQ1QvRCxFQUFNbkosS0FBSyxRQUVUckssRUFBT3djLG9CQUNUaEosRUFBTW5KLEtBQUssU0FDWCtSLEdBQW1CLGtDQUdqQnBjLEVBQU95Yyx5QkFDVGpKLEVBQU1uSixLQUFLLFVBQVcsZ0JBQWlCLFFBQ3ZDK1IsR0FBbUIscUdBTWpCcGMsRUFBTzBjLDBCQUNUTixHQUFtQiw4QkFLakJwYyxFQUFPZ1gsd0JBQ1R4RCxFQUFNbkosS0FBSyxVQUNYK1IsR0FBbUIsWUFJakJwYyxFQUFPbU4sVUFBVXdQLFFBQ25CUCxHQUFtQix1QkFJakJwYyxFQUFPbU4sVUFBVStGLE1BQ25CTSxFQUFNbkosS0FBSyxXQUVUbUMsRUFBV1csVUFBVW1LLFVBQVl0WCxFQUFPbU4sVUFBVW1LLFdBQ3BEOUQsRUFBTW5KLEtBQUssWUFFVHJLLEVBQU9tTixVQUFVeVAsU0FDbkJSLEdBQW1CLGdCQUdqQnBjLEVBQU9tTixVQUFVMFAsaUJBQ25CVCxHQUFtQix3Q0FJakI1UCxFQUFXVyxVQUFVMlAsYUFBZTljLEVBQU9tTixVQUFVMlAsZUFDdkR0SixFQUFNbkosS0FBSyxlQUNYK1IsR0FBbUIsd0RBSWpCcGMsRUFBT21OLFVBQVU0UCxXQUNuQnZKLEVBQU1uSixLQUFLLGVBRVRySyxFQUFPbU4sVUFBVTZQLGFBQ25CWixHQUFtQixxQkFJckIsSUFBSWEsRUFBWSxHQUNoQixJQUFLLE1BQU0zZCxLQUFRa1UsRUFBTyxDQUN4QixJQUFJeFMsUUFBaUJrYyxHQUFVNWQsSUFBVSxHQUN6QyxJQUFLMEIsRUFBUyxDQUNaLE1BQU1xQyxFQUFNLG1EQUFtRC9ELElBQ3pEMlgsUUFBaUJDLE1BQU03VCxHQUN2QjhaLFFBQXFCbEcsRUFBU21HLE9BQ3BDLElBQUtuRyxFQUFTb0csSUFBTUYsRUFBYWhiLFNBQVMsd0JBQTBCZ2IsRUFBYWhiLFNBQVMsV0FFeEYsWUFEQTNDLFFBQVFFLE1BQU0sbUJBQW1CMkQsS0FHbkNyQyxFQUFVbWMsRUFBYTdiLGFBQ2pCQyxFQUFZYSxJQUFJLElBQU1rYixHQUFXaGUsRUFBTTBCLElBQ3pDL0IsRUFBUUMsV0FDVk0sUUFBUUMsS0FBSyxXQUFXNEQsSUFFNUIsQ0FDSTRaLElBQVdBLEdBQWEsTUFDNUJBLEdBQWFqYyxFQUFVLElBQ3pCLE9BQ1kwWSxHQUFlUywwQkFBMEJ2WixLQUNuRHFjLEVBQVlBLEVBQVVqYixRQUFRLGVBQWdCLGtCQUFrQkEsUUFBUSxXQUFZLFlBRWxGaEMsRUFBT3djLG1CQUFxQnhjLEVBQU95YywwQkFDckNRLEVBQVlBLEVBQ1Q1YixXQUFXLHlCQUEwQixtQkFDckNBLFdBQVcsNEJBQTZCLHNCQUN4Q0EsV0FBVyxtQ0FBb0MsNkJBQy9DQSxXQUFXLDJCQUE0QixxQkFDdkNBLFdBQVcscUJBQXNCLGVBQ2pDQSxXQUFXLHVCQUF3QixpQkFDbkNBLFdBQVcsY0FBZSxTQUMxQkEsV0FBVyxjQUFlLFNBQ3pCckIsRUFBT3ljLHlCQUNUUSxFQUFZQSxFQUFVNWIsV0FBVyx5QkFBMEIseUJBRy9ENGIsRUFBWUEsRUFBVTViLFdBQVcsZUFBZ0IsWUFDN0NtTCxFQUFXVyxVQUFVMlAsYUFBZTljLEVBQU9tTixVQUFVMlAsYUFBZTljLEVBQU95YywwQkFDN0VRLEVBQVlBLEVBQVU1YixXQUFXLGtCQUFtQixtQkFFdEQsTUFBTWpCLEVBQWFnYyxFQUFrQixLQUFPYSxFQUFZWixRQUNsRDlhLEVBQVlhLElBQUksSUFBTTFCLEVBQU9LLGFBQWFILEVBQVVSLEtBRTlELENBRUEsTUFBTUssR0FBVUYsRUFBS0MsS0FBS2tWLEVBQUdDLFVBQVcsU0FBVSxPQUFRLGFBRTFEN1YsZUFBZXdkLEdBQVdoZSxFQUFjMEIsU0FDaENYLEVBQUdRLFNBQVNJLE1BQU1SLEdBQVMsQ0FBRVUsV0FBVyxVQUN4Q2QsRUFBR1EsU0FBU1AsVUFBVUMsRUFBS0MsS0FBS0MsR0FBU25CLEdBQU8wQixFQUN4RCxDQUVBbEIsZUFBZW9kLEdBQVU1ZCxHQUN2QixJQUNFLE1BQU1pZSxRQUFhbGQsRUFBR1EsU0FBUzBjLEtBQUtoZCxFQUFLQyxLQUFLQyxHQUFTbkIsSUFDdkQsR0FBSWtlLEtBQUtDLE1BQVFGLEVBQUtHLFFBQVUsTUFDOUIsT0FFRixhQUFhcmQsRUFBR1EsU0FBU0MsU0FBU1AsRUFBS0MsS0FBS0MsR0FBU25CLEdBQU8sT0FDOUQsQ0FBRSxNQUNBLENBRUosQ0MxS08sU0FBU3FlLEdBQW9CbEcsRUFBc0JFLEdBQ3hELElBQ0UsTUFBTWlHLEVBQVUsa0JBQWtCbkcsS0FBZ0JFLFFBRTVDa0csRUFEUzVJLEdBQTBCLE1BQU8sQ0FBQyxZQUFhMkksRUFBUyxRQUFTdkosUUFBUTNNLE9BQzlEZixNQUFNLE9BQU8sR0FDdkMsSUFBS2tYLEVBQ0gsTUFBTSxJQUFJbGUsTUFBTSx3QkFBd0I4WCxLQUFnQkUsS0FFMUQsT0FBTzNQLFFBQVFwRyxRQUFRaWMsRUFDekIsQ0FBRSxNQUFPbmUsR0FDUCxPQUFPc0ksUUFBUThWLE9BQU8sSUFBSW5lLE1BQU0sK0JBQStCOFgsS0FBZ0JFLE1BQVM5WCxPQUFPSCxNQUNqRyxDQUNGLENDWk8sTUFBTXFlLEdBQWEsQ0FDeEJDLGlCQUFpQmhlLEdBQ1JBLEVBQU9pZSxvQkFBc0IsK0NBQWlELElDZW5GQyxHQUFlLENBQ25CLFNBQ0EsK0JBQ0EseUJBQ0EseUJBQ0EsbUNBQ0Esc0NBQ0Esd0JBQ0EsK0JBQ0EsV0FHSUMsR0FBZSxJQUFJRCxHQUFjLG9CQUFxQixxQ0FFdERFLEdBQWtCLENBQUMsc0JBQXVCLDRCQUE2QixnQ0FFdkVDLEdBQW9ELENBQ3hELGdDQUFpQyxDQUFDLG1DQUFvQ0gsSUFDdEUsc0NBQXVDLENBQUMseUNBQTBDQSxNQUFpQkUsSUFDbkcsZ0NBQWlDLENBQUMsbUNBQW9DRCxJQUN0RSxzQ0FBdUMsQ0FBQyx5Q0FBMENBLE1BQWlCQyxJQUNuRyxrQ0FBbUMsQ0FDakMsa0NBQ0Esd0JBQ0dELE1BQ0FDLEtBSUF0ZSxlQUFld2UsR0FDcEJ0ZSxFQUNBd00sRUFDQStSLEdBRUEsT0FBT25mLEVBQU9DLDBCQUEwQixzQkFBdUJTLGdCQUtqRUEsZUFBb0JFLEVBQXVCd00sRUFBMkIrUixHQUNwRSxNQUFNM2QsRUFBV0wsRUFBS3FCLFFBQVE1QixFQUFPUyxRQUFTLGdCQUN4QytkLFFBQWlCbmUsRUFBR1EsU0FBU0MsU0FBU0YsRUFBVSxRQUNoRDZkLEVBQVV6RixLQUFLQyxNQUFNdUYsR0FDM0JDLEVBQVF4USxRQUFVd1EsRUFBUXhRLFNBQVcsQ0FBQSxFQUNyQ3dRLEVBQVFqVixhQUFlaVYsRUFBUWpWLGNBQWdCLENBQUEsRUFDL0NpVixFQUFRaFYsZ0JBQWtCZ1YsRUFBUWhWLGlCQUFtQixDQUFBLEVBQ3JEZ1YsRUFBUUMsaUJBQW1CRCxFQUFRQyxrQkFBb0IsQ0FBQSxFQUN2RCxNQUFNNVEsRUFBaUI5TixFQUFPK04sTUFBUSxNQUFRLGFBaVVoRGpPLGVBQ0UyZSxHQUV1QixvQkFBbkJBLEVBQVFFLFNBQ1ZGLEVBQVFFLE9BQVMsMkJBRVpGLEVBQVF4USxRQUFRLDRCQUNoQndRLEVBQVF4USxRQUFRLGdDQUNoQndRLEVBQVF4USxRQUFRLHlCQUNoQndRLEVBQVF4USxRQUFRLDZCQUNoQndRLEVBQVF4USxRQUFRLDRCQUNoQndRLEVBQVFqVixhQUFhb1YsYUFDckJILEVBQVFoVixnQkFBZ0IscUNBQ3hCZ1YsRUFBUWhWLGdCQUFnQiwyQ0FDeEJnVixFQUFRaFYsZ0JBQWdCLHVDQUN4QmdWLEVBQVFoVixnQkFBZ0IsZ0NBQ3hCZ1YsRUFBUWhWLGdCQUFnQixzQ0FDeEJnVixFQUFRaFYsZ0JBQWdCLGlDQUN4QmdWLEVBQVFoVixnQkFBZ0JvVixhQUV4QkosRUFBUWhWLGdCQUFnQnFWLGFBQ3hCTCxFQUFReFEsUUFBUSx5QkFDaEJ3USxFQUFReFEsUUFBUSx5QkFDaEJ3USxFQUFReFEsUUFBUSx3QkFDaEJ3USxFQUFReFEsUUFBUSx3QkFDaEJ3USxFQUFReFEsUUFBUTBNLGdCQUNoQjhELEVBQVF4USxRQUFRLG1CQUNqQjFNLEVBQVlhLElBQUksSUFBTS9CLEVBQUdRLFNBQVNpTSxHQUFHLGFBQWMsQ0FBRUMsT0FBTyxZQUczRDBSLEVBQVFoVixnQkFBZ0IsMkNBQ3hCZ1YsRUFBUWhWLGdCQUFnQixvQ0FDeEJnVixFQUFRaFYsZ0JBQWdCLHVCQUNqQyxDQWhXUXNWLENBQXNCTixHQUU1QixJQUFLLE1BQU90WCxFQUFLN0UsS0FBVTJFLE9BQU9DLFFBQVF1WCxFQUFReFEsU0FFM0MzTCxFQUFNSCxTQUFTLGVBQ2xCc2MsRUFBUXhRLFFBQVE5RyxHQUFPN0UsRUFBTU4sUUFBUSxlQUFnQixJQUFJQSxRQUFRLHlCQUEwQixLQUkvRnljLEVBQVF4USxRQUFVOUksRUFBTXNaLEVBQVF4USxRQUFTK1EsR0FBZ0JoZixFQUFReWUsRUFBUXhRLFVBRXJFLGlCQUFrQndRLEVBQVF4USxVQUN4QixhQUFjd1EsRUFBUXhRLFVBQ3hCd1EsRUFBUXhRLFFBQVEsZ0JBQWtCLEdBQUdILDZCQUEwQzJRLEVBQVF4USxRQUFRLG1CQUVqR3dRLEVBQVF4USxRQUFRLGdCQUFrQixHQUFHSCw0QkFBeUMyUSxFQUFReFEsUUFBUSxtQkFHNUZqTyxFQUFPK04sYUFDRjBRLEVBQVF4USxRQUFRZ1IsU0FFdkJSLEVBQVF4USxRQUFRZ1IsVUFBWVIsRUFBUXhRLFFBQVFnUixVQUFZLFVBZ1o1RG5mLGVBQXNDVyxHQUNwQyxNQUFNRyxFQUFXTCxFQUFLcUIsUUFBUW5CLEVBQVMsbUJBQ2pDeWUsUUFBd0I3ZSxFQUFHUSxTQUFTQyxTQUFTRixFQUFVLFFBQ3ZEaUcsRUFBUXFZLEVBQWdCbEYsUUFBUU4sR0FBZUMsaUJBQ3JELElBQWMsSUFBVjlTLEVBQWMsTUFBTyxHQUV6QixNQUFNc1ksRUFBa0JELEVBQWdCaFcsTUFBTSxFQUFHckMsR0FTakQsTUFBTyxHQVJPc1ksRUFDWHhZLE1BQU0sTUFDTmpGLElBQUttVixJQUNKLE1BQU02QixFQUFVN0IsRUFBS3ZWLE9BQ3JCLE9BQU9vWCxFQUFRdFAsU0FBUyxLQUFPc1AsRUFBUXhQLE1BQU0sR0FBRyxHQUFNd1AsSUFFdkR4TCxPQUFRdUwsR0FBTUEsSUFBTUEsRUFBRTlKLFdBQVcsT0FBUzhKLEVBQUV0VyxTQUFTLE1BRXhDVCxJQUFLbVYsR0FBUyxTQUFTQSxTQUFZclcsS0FBSyxhQUMxRCxDQWhheUU0ZSxDQUF1QnBmLEVBQU9TLFNBR3JHLElBQUssTUFBTzBHLEVBQUs3RSxLQUFVMkUsT0FBT0MsUUFBUXVYLEVBQVF4USxTQUMzQzNMLEdBQU9ILFNBQVMsNkJBRW5CRyxFQUFNSCxTQUFTLFVBQ2ZHLEVBQU1ILFNBQVMsZ0JBQ2ZHLEVBQU1ILFNBQVMsWUFDZkcsRUFBTUgsU0FBUyxnQkFHakJzYyxFQUFReFEsUUFBUTlHLEdBQU83RSxFQUFNTixRQUFRLDBCQUEyQixtQ0FHbEUsSUFBSXdILEVBQXlCLEdBQ3pCQyxFQUFrQixDQUFDLFdBQVkscUJBQ25DLE1BQU00VixFQUFrQyxHQUdyQ2hmLEVBQUcwQixXQUFXeEIsRUFBS0MsS0FBS2dNLEVBQVcvTCxRQUFTLHNCQUM1Q0osRUFBRzBCLFdBQVd4QixFQUFLQyxLQUFLUixFQUFPUyxRQUFTLHVCQUV6Q2dlLEVBQVE5RCxTQUFXLCtCQUNuQmxSLEVBQWdCWSxLQUFLLHVCQUF3QixpQ0FHM0NySyxFQUFPK04sYUFDRjBRLEVBQVFoVixnQkFBZ0IsZUFFL0JBLEVBQWdCWSxLQUFLLGVBR3ZCLEdBQUlySyxFQUFPMEksT0FBUSxDQWdDakIsR0EvQkkxSSxFQUFPK04sY0FDRjBRLEVBQVFoVixnQkFBZ0I2VixhQUN4QmIsRUFBUWhWLGdCQUFnQnFWLE1BQy9CTCxFQUFReFEsUUFBUXNSLFFBQVUsMkJBQzFCOVYsRUFBZ0JZLEtBQUssY0FHckJaLEVBQWdCWSxLQUFLLFNBRXJCb1UsRUFBUXhRLFFBQVFzUixRQUFVLGdCQUMxQmQsRUFBUXhRLFFBQVF1UixZQUFjLGlCQUMxQnhmLEVBQU80TixjQUFnQjVOLEVBQU95Zix5QkFHaENoVyxFQUFnQlksS0FBSyxTQUNyQm9VLEVBQVF4USxRQUFReVIsUUFBVSxrQkFDMUJqQixFQUFReFEsUUFBUTBSLFNBQVcsbUJBSTNCM2YsRUFBT21OLFVBQVVDLGtCQUVoQnFSLEVBQVFoVixnQkFBZ0IscUJBQ3hCZ1YsRUFBUWhWLGdCQUFnQiwyQkFDeEJnVixFQUFRaFYsZ0JBQWdCLGlDQUV6QkEsRUFBZ0JZLEtBQUssb0JBRXZCb1UsRUFBUXhJLFFBQVUsK0JBR2hCalcsRUFBT21OLFVBQVUwUCxlQUFnQixDQUVkNEIsRUFBUWpWLGFBQWFvVyxXQUFhbkIsRUFBUWhWLGdCQUFnQm1XLFdBRXpEbkIsRUFBUWpWLGFBQWEsc0JBQ3pDQyxFQUFnQlksS0FBSywyQkFDZG9VLEVBQVFqVixhQUFhLDRCQUV2QmlWLEVBQVFqVixhQUFhcVcsa0JBQ3JCcEIsRUFBUWhWLGdCQUFnQm9XLFVBQ2pDLENBRUk3ZixFQUFPMkksMkJBRVQ4VixFQUFRcUIsV0FBYUMsTUFBTUMsUUFBUXZCLEVBQVFxQixZQUN2QzNhLEVBQU1DLElBQUksQ0FBQ3FaLEVBQVFxQixXQUFZLENBQUMsZUFBZ0IsQ0FDOUNwUixXQUFZM0UsSUFFZCxDQUFDLGNBQ0lnVyxNQUFNQyxRQUFRdkIsRUFBUXFCLGNBQy9CckIsRUFBUXFCLFdBQWFyQixFQUFRcUIsV0FBVzVTLE9BQ3JDK1MsR0FDQzFZLEVBQUcyWSxTQUFTRCxFQUFXLENBQ3JCeFksS0FBSyxFQUNMQyxJQUFLMUgsRUFBT1MsUUFDWmtILE9BQVFQLElBQ1BkLE9BQVMsR0FFa0IsSUFBOUJtWSxFQUFRcUIsV0FBV3haLGVBQ2RtWSxFQUFRcUIsV0FHckIsQ0FFQSxHQUFJOWYsRUFBT21OLFVBQVVnVCxJQUFNbmdCLEVBQU8rTixNQUFPLENBQ25DMFEsRUFBUWpWLGFBQWEsbUJBQ3ZCQSxFQUFhYSxLQUNYb1UsRUFBUWpWLGFBQWEsbUJBQW1CbUYsV0FBVyxPQUFTLHlCQUEyQixtQkFHekZsRixFQUFnQlksS0FDZG9VLEVBQVFoVixnQkFBZ0Isb0JBQW9Ca0YsV0FBVyxPQUFTLHlCQUEyQixtQkFHL0YsSUFBSyxNQUFPeEgsRUFBSzdFLEtBQVUyRSxPQUFPQyxRQUFRdVgsRUFBUXhRLFNBQ2hEd1EsRUFBUXhRLFFBQVE5RyxHQUFPN0UsRUFBTU4sUUFBUSxVQUFXLFlBRXBELEVBR0VoQyxFQUFPb2dCLHVCQUNQcGdCLEVBQU9xZ0IsaUNBQ1ByZ0IsRUFBT3NnQix1QkFDUHRnQixFQUFPdWdCLG1DQUVIdmdCLEVBQU8rTixPQUNUdEUsRUFBZ0JZLEtBQUssaUJBQWtCLG9DQUNoQ29VLEVBQVFoVixnQkFBZ0JpUixjQUN4QitELEVBQVFoVixnQkFBZ0IrVyxrQkFDeEIvQixFQUFRaFYsZ0JBQWdCLHNCQUUvQkEsRUFBZ0JZLEtBQUssU0FBVSxnQkFJL0JySyxFQUFPc2dCLHVCQUF5QnRnQixFQUFPdWdCLG1DQUN6QzlXLEVBQWdCWSxLQUFLLGNBQ2pCckssRUFBTytOLE9BQ1R0RSxFQUFnQlksS0FBSyxlQUlyQnJLLEVBQU9nYixZQUNUdlIsRUFBZ0JZLFFBQVFnVSxHQUFXcmUsRUFBT2diLGFBR3hDaGIsRUFBT3lnQix1QkFDVGpYLEVBQWVBLEVBQWEwRCxPQUFRd1QsSUFBU0EsRUFBSXZlLFNBQVMsa0JBQzFEc0gsRUFBa0JBLEVBQWdCeUQsT0FBUXdULElBQVNBLEVBQUl2ZSxTQUFTLG1CQUc3RHNjLEVBQVFuZixPQUNYbWYsRUFBUW5mLEtBQU9pQixFQUFLaU4sU0FBU3hOLEVBQU9TLFVBR2xDVCxFQUFPMkksNkJBQ1Q4VixFQUFRa0MsU0FBVSxHQUVmbEMsRUFBUW1DLFVBQ1huQyxFQUFRbUMsUUFBVSxlQUVmbkMsRUFBUWtDLFNBQStCLGVBQXBCbEMsRUFBUW1DLFNBQTRCcFUsRUFBV29CLGVBQ3JFNlEsRUFBUW9DLGdCQUFrQixDQUFBLEVBQzFCcEMsRUFBUW9DLGNBQWNDLFNBQVcsVUFFbkMsTUFBT2xOLEdBQVNSLEdBQVdDLGNBQWNyVCxFQUFPMk0sWUFBYyxJQUNoRCxnQkFBVmlILEdBQXFDLG1CQUFWQSxJQUM3QjZLLEVBQVFFLE9BQVMsb0JBRWQzZSxFQUFPMEksU0FBVStWLEVBQVFrQyxTQUFZbEMsRUFBUXNDLE9BRWhEdEMsRUFBUXNDLEtBQU8sU0FNakIsVUFGT3RDLEVBQVF1QyxjQUFjLGNBRXhCaGhCLEVBQU8ySSwyQkFBNEIsQ0FDdEMsSUFBSzNJLEVBQU8rTixNQUNWLEdBQUsvTixFQUFPb2dCLHVCQUEwQnBnQixFQUFPc2dCLHNCQVMzQzdCLEVBQVF4USxRQUFRLGFBQWV3USxFQUFReFEsUUFBUSxhQUFlLElBQU04UCxHQUFXQyxpQkFBaUJoZSxPQVQ5QixRQUMzRHllLEVBQVF4USxRQUFRZ1QsWUFDaEJ4QyxFQUFReFEsUUFBUSxZQUN2QixJQUFLLE1BQU1pVCxJQUFjLENBQUMsVUFBVyxnQkFBaUIsQ0FDcEQsTUFBTUMsRUFBUzFDLEVBQVF4USxRQUFRaVQsR0FDMUJDLElBQ0wxQyxFQUFReFEsUUFBUWlULEdBQWNDLEVBQU9uZixRQUFRLG1DQUFvQyxJQUNuRixDQUNGLENBS0YsR0FBSWhDLEVBQU95Yyx1QkFBd0IsQ0FDakNnQyxFQUFReFEsUUFBUWdULEtBQU8sa0JBQ3ZCeEMsRUFBUXhRLFFBQVEsWUFBYyxZQUM5QixNQUFNbVQsRUFBTyxDQUFDLE1BQU8sT0FBUSxlQUFlbFUsT0FBUW1VLEdBQVFoaEIsRUFBRzBCLFdBQVd4QixFQUFLcUIsUUFBUTVCLEVBQU9TLFFBQVM0Z0IsS0FDbkdELEVBQUs5YSxPQUFTLElBQ2hCbVksRUFBUXhRLFFBQVEsZUFBaUIsc0JBQXNCbVQsRUFBSzVnQixLQUMxRCxvSEFFRmllLEVBQVF4USxRQUFRcVQsUUFBVTdDLEVBQVF4USxRQUFRcVQsUUFBVSxJQUFNLHVCQUU5RCxDQUVBLEdBQUl0aEIsRUFBT2dYLHNCQUF1QixDQUNJLG1CQUFoQ3lILEVBQVF4USxRQUFRdVIsb0JBQ1hmLEVBQVF4USxRQUFRdVIsWUFFekIsTUFBTStCLFFBQW9CaGEsRUFBR0MsS0FBSyxVQUFXLENBQzNDRSxJQUFLMUgsRUFBT1MsUUFDWmdILEtBQUssRUFDTEUsT0FBUVAsSUFFSm9hLEVBQWEsSUFBSXZVLElBQ3ZCLElBQUssTUFBTXdVLEtBQWNGLEVBQWEsQ0FDcEMsTUFBT0csRUFBT0MsR0FBVUYsRUFBVzlhLE1BQU0sU0FDckMrYSxHQUFTQyxHQUNYSCxFQUFXblUsSUFBSXFVLEVBRW5CLENBQ0EsR0FBSUYsRUFBV0ksS0FBTyxFQUFHLENBQ3ZCLE1BQU1DLEVBQWMsSUFBSUwsR0FBWWhoQixLQUFLLEtBQ3pDaWUsRUFBUXhRLFFBQVEsZUFDZCxvQ0FBb0M0VCx5QkFBbUNBLElBQ3JFcEQsRUFBUXhRLFFBQVFnVCxLQUNsQnhDLEVBQVF4USxRQUFRZ1QsS0FBTyxxQkFBcUJZLFFBQWtCcEQsRUFBUXhRLFFBQVFnVCxRQUU5RXhDLEVBQVF4USxRQUFRZ1QsS0FBTyxxQkFBcUJZLElBQzVDcEQsRUFBUXhRLFFBQVEsWUFBYyxhQUVoQ3dRLEVBQVF4USxRQUFRcVQsUUFBVTdDLEVBQVF4USxRQUFRcVQsUUFBVSxJQUFNLHVCQUMxRGpDLEVBQXNCaFYsS0FBSyxRQUFTLFFBQVMsU0FDL0MsQ0FDRixDQUVJckssRUFBTzJNLGFBQ1Q4UixFQUFROVIsV0FBYTNNLEVBQU8yTSxXQUVoQyxDQUVJM00sRUFBT21OLFVBQVV3UCxNQUNkOEIsRUFBUXhRLFFBQVEsYUFBYVUsV0FBVyxpQkFFakM4UCxFQUFReFEsUUFBUSxZQUFZOUwsU0FBUywyQkFDL0NzYyxFQUFReFEsUUFBUSxZQUFjd1EsRUFBUXhRLFFBQVEsWUFBWWpNLFFBQ3hELGdCQUNBLDJDQUpGeWMsRUFBUXhRLFFBQVEsWUFBYyxnQkFPdkJqTyxFQUFPbU4sVUFBVXlQLFNBQVc2QixFQUFReFEsUUFBUSxhQUFhVSxXQUFXLHFCQUM3RThQLEVBQVF4USxRQUFRLFlBQWMsbUJBRzNCd1EsRUFBUWpWLGFBQWFtUixpQkFFakI4RCxFQUFRaFYsZ0JBQWdCLG1CQUdnQixJQUE3Q3hDLE9BQU91SixLQUFLaU8sRUFBUWpWLGNBQWNsRCxlQUM3Qm1ZLEVBQVFqVixhQUVtQyxJQUFoRHZDLE9BQU91SixLQUFLaU8sRUFBUWhWLGlCQUFpQm5ELGVBQ2hDbVksRUFBUWhWLGdCQUVvQyxJQUFqRHhDLE9BQU91SixLQUFLaU8sRUFBUUMsa0JBQWtCcFksZUFDakNtWSxFQUFRQyx1QkFvTW5CNWUsZUFBcUMyZSxHQUNuQ0EsRUFBUWpWLGFBQWVpVixFQUFRalYsY0FBZ0IsQ0FBQSxFQUMvQ2lWLEVBQVFoVixnQkFBa0JnVixFQUFRaFYsaUJBQW1CLENBQUEsRUFDckQsTUFBTXFZLEVBQWUsSUFBSTdVLElBQUksSUFBSWhHLE9BQU91SixLQUFLaU8sRUFBUWpWLGlCQUFrQnZDLE9BQU91SixLQUFLaU8sRUFBUWhWLG1CQUMzRixHQUFJcVksRUFBYS9LLElBQUksdUJBQXlCZ0wsR0FBbUJ0RCxFQUFTLHFCQUFzQixRQUN2RkEsRUFBUWhWLGdCQUFnQixxQkFDL0IsTUFBTW9VLFFBQW1CRixHQUFvQixpQkFBa0IsUUFDL0RjLEVBQVFqVixhQUFhLHFCQUF1QiwwQ0FBMENxVSxHQUN4RixDQUNBLEdBQUlpRSxFQUFhL0ssSUFBSSx5QkFBMkJnTCxHQUFtQnRELEVBQVMsdUJBQXdCLFFBQzNGQSxFQUFRaFYsZ0JBQWdCLHVCQUMvQixNQUFNb1UsUUFBbUJGLEdBQW9CLGlCQUFrQixlQUMvRGMsRUFBUWpWLGFBQWEsdUJBQXlCLGlEQUFpRHFVLEdBQ2pHLENBRUEsR0FBSWlFLEVBQWEvSyxJQUFJLGdDQUFrQ2dMLEdBQW1CdEQsRUFBUyw4QkFBK0IsUUFDekdBLEVBQVFqVixhQUFhLDhCQUM1QixNQUFNcVUsUUFBbUJGLEdBQW9CLGlCQUFrQixpQkFDL0RjLEVBQVFoVixnQkFBZ0IsOEJBQ3RCLG1EQUFtRG9VLEdBQ3ZELENBQ0EsR0FBSWlFLEVBQWEvSyxJQUFJLHdCQUEwQmdMLEdBQW1CdEQsRUFBUyxzQkFBdUIsUUFDekZBLEVBQVFoVixnQkFBZ0Isc0JBQy9CLE1BQU1vVSxRQUFtQkYsR0FBb0IsaUJBQWtCLFNBQy9EYyxFQUFRalYsYUFBYSxzQkFBd0IsMkNBQTJDcVUsR0FDMUYsQ0FDQSxHQUFJaUUsRUFBYS9LLElBQUksNEJBQThCZ0wsR0FBbUJ0RCxFQUFTLDBCQUEyQixRQUNqR0EsRUFBUWhWLGdCQUFnQiwwQkFDL0IsTUFBTW9VLFFBQW1CRixHQUFvQixpQkFBa0IsYUFDL0RjLEVBQVFqVixhQUFhLDBCQUE0QiwrQ0FBK0NxVSxHQUNsRyxDQUNGLENBaE9RbUUsQ0FBc0J2RCxHQUV4QnplLEVBQU8rTixjQUFjMFEsRUFBUTNRLGVBQ2pDLElBQUltVSxFQUFjakosS0FBS0UsVUFBVXVGLEdBQ2pDd0QsUUF1SkZuaUIsZUFDRW1PLEVBQ0FnVSxFQUNBamlCLEdBRUEsTUFBTWtpQixFQUEyQyxHQUNqRCxJQUFLLE1BQU8vYSxLQUFRRixPQUFPdUosS0FBS3ZDLEdBQzFCOUcsSUFBUUEsRUFBSXdILFdBQVcsTUFBUXhILEVBQUloRixTQUFTLE1BQzlDK2YsRUFBcUI3WCxLQUFLLENBQUNsRCxFQUFLQSxFQUFJOUYsV0FBVyxJQUFLLE9BR3hELEdBQW9DLElBQWhDNmdCLEVBQXFCNWIsT0FBYyxPQUFPMmIsRUFFOUMsSUFBSyxNQUFPRSxFQUFTQyxLQUFZRixFQUMvQkQsRUFBY0EsRUFBWTVnQixXQUFXOGdCLEVBQVNDLEdBRWhELE1BQU1DLFFBQWM5YSxFQUFHQyxLQUFLLENBQUMsMENBQTJDLGlCQUFrQixDQUN4RkUsSUFBSzFILEVBQU9TLFFBQ1pnSCxLQUFLLEVBQ0xFLE9BQVFQLElBRVYsSUFBSyxNQUFNcUssS0FBUTRRLFFBQ1g5Z0IsRUFBWWEsSUFBSXRDLFVBQ3BCLE1BQU1jLEVBQVdMLEVBQUtDLEtBQUtSLEVBQU9TLFFBQVNnUixHQUNyQ3ZSLFFBQW1CRyxFQUFHUSxTQUFTQyxTQUFTRixFQUFVLFFBQ3hELElBQUlSLEVBQWFGLEVBQ2pCLElBQUssTUFBT2lpQixFQUFTQyxLQUFZRixFQUMvQjloQixFQUFhQSxFQUFXaUIsV0FBVzhnQixFQUFTQyxHQUUxQ2hpQixJQUFlRixTQUNYRyxFQUFHUSxTQUFTUCxVQUFVTSxFQUFVUixLQUs1QyxhQURNbUIsRUFBWW1RLGFBQ1h1USxDQUNULENBM0xzQkssQ0FBZTdELEVBQVF4USxRQUFTZ1UsRUFBYWppQixTQUMzREssRUFBR1EsU0FBU1AsVUFBVU0sRUFBVXFoQixHQUVqQzFELElBRUgvVSxFQUFlQSxFQUFhMEQsT0FBUXdULElBQVNqQyxFQUFRaFYsa0JBQWtCaVgsSUFDbkVsWCxFQUFhbEQsT0FBUyxJQUNwQnRHLEVBQU8rTixPQUNUMEcsR0FBVTNHLEVBQWdCLENBQUMsWUFBYSxJQUFJYixJQUFJekQsSUFBZ0J4SixFQUFPUyxTQUN2RWdVLEdBQVUzRyxFQUFnQixDQUFDLE1BQU8sYUFBYyxJQUFJYixJQUFJekQsSUFBZ0J4SixFQUFPUyxVQUUvRWdVLEdBQVUzRyxFQUFnQixDQUFDLFNBQVUsSUFBSWIsSUFBSXpELElBQWdCeEosRUFBT1MsVUFJeEVnSixFQUFrQkEsRUFBZ0J5RCxPQUFRd1QsSUFBU2pDLEVBQVFqVixlQUFla1gsSUFDdEVqWCxFQUFnQm5ELE9BQVMsSUFDdkJ0RyxFQUFPK04sT0FDVDBHLEdBQVUzRyxFQUFnQixDQUFDLFlBQWEsSUFBSWIsSUFBSXhELElBQW1CekosRUFBT1MsU0FDMUVnVSxHQUFVM0csRUFBZ0IsQ0FBQyxNQUFPLEtBQU0sYUFBYyxJQUFJYixJQUFJeEQsSUFBbUJ6SixFQUFPUyxVQUV4RmdVLEdBQVUzRyxFQUFnQixDQUFDLE1BQU8sUUFBUyxJQUFJYixJQUFJeEQsSUFBbUJ6SixFQUFPUyxVQUc3RTRlLEVBQXNCL1ksT0FBUyxHQUNqQ21PLEdBQVUsU0FBVSxDQUFDLE1BQU8sVUFBVyxTQUFVLElBQUl4SCxJQUFJb1MsSUFBeUJyZixFQUFPUyxTQUcvRixDQTFVVTRYLENBQUtyWSxFQUFRd00sRUFBWStSLElBRW5DLENBOFdPLFNBQVNTLEdBQWdCaGYsRUFBdUJ1aUIsR0FDckQsR0FBSXZpQixFQUFPK04sTUFBTyxDQUNoQixNQUFNeVUsRUFBZXhpQixFQUFPc2dCLHVCQUF5QnRnQixFQUFPdWdCLGdDQUN0RHRTLEVBQWtDLENBQ3RDLG1CQUFvQixnREFDcEIsZUFBZ0IsbUJBQWtCdVUsRUFBZSx3QkFBMEIsSUFDM0VDLFFBQVMsbUNBQ1RuQixPQUFRLDZCQUNSTCxLQUFNLG9CQUNOLFdBQVksMEJBQ1p0VixLQUFNLGNBQ04rVyxVQUFXLDBCQUtiLE9BSEtGLFVBQ0l2VSxFQUFReVUsVUFFVnpVLENBQ1QsQ0FBTyxDQUNMLE1BQU11VSxFQUFleGlCLEVBQU9zZ0IsdUJBQXlCdGdCLEVBQU91Z0IsZ0NBQ3REb0MsRUFBVUosRUFBVzVXLEtBQzNCLElBQUlzQyxFQUFrQyxDQUNwQyxtQkFBb0IsaUNBQ3BCLGVBQWdCLHlFQUNkdVUsRUFBZSxxQkFBdUIsSUFFeENDLFFBQVMsK0JBQ1RuQixPQUFRLHFDQUNSTCxLQUFNLGlCQUNOLFdBQVksa0JBQ1poQyxTQUFVLGlEQUFpRDNFLEdBQVdLLFNBQVNuYSxLQUFLLG9DQUNwRmtpQixVQUFXLHlCQWlDYixPQS9CSTFpQixFQUFPMkksMkJBQ1RzRixFQUFVOUksRUFDUixJQUFLOEksR0FDTCxDQUNFcVQsT0FBUSxzR0FDUkwsS0FBTSw4REFDTixXQUFZLGtFQUNaaEMsU0FBVSxpREFBaUQzRSxHQUFXSyxTQUFTbmEsS0FDN0Usc0RBSUZtTCxLQUFNLHNFQUNOK1csVUFBVyxxRUFHTjFpQixFQUFPbU4sVUFBVXlWLFVBQzFCM1UsRUFBUXlVLFVBQVl6VSxFQUFReVUsVUFBWSxHQUFHelUsRUFBUXlVLGdCQUFrQixHQUNyRXpVLEVBQVF5VSxXQUFhLFdBRW5CQyxHQUFTeGdCLFNBQVMsYUFDcEI4TCxFQUFRdEMsS0FBT2dYLEVBRWYxVSxFQUFRLHFCQUF1QkEsRUFBUSxxQkFBdUIsSUFBTSxhQUdqRXVVLEVBRU14aUIsRUFBT21OLFVBQVVnVCxLQUMxQmxTLEVBQVF5VSxVQUFZLHVCQUZielUsRUFBUXlVLFVBSVZ6VSxDQUNULENBQ0YsQ0EyRkEsU0FBUzhULEdBQW1CdEQsRUFBc0JwVixHQUNoRCxPQUFRb1YsRUFBUWhWLGtCQUFrQkosSUFBZ0JvVixFQUFRalYsZUFBZUgsSUFBZ0IsSUFBSWxILFNBQVMsWUFDeEcsQ0N4akJBLE1BQU04TCxHQUFVLENBQ2Q0VSxVQUFXLHFDQUNYQyxRQUFTLGlCQUNUQyxjQUFlLDJRQVNmemhCLE9BQ0EwaEIseUJBQTBCLGtVQVMxQjFoQixPQUNBMmhCLFVBQVcsMkxBUVgzaEIsUUFHS3hCLGVBQWVvakIsR0FBbUNsakIsR0FDdkQsT0FBT1osRUFBT0MsMEJBQTBCLHFDQUFzQ1MsZ0JBS2hGQSxlQUFvQkUsR0FDbEIsTUFBTW1qQixFQUFrQjVpQixFQUFLcUIsUUFBUTVCLEVBQU9TLFFBQVMsZ0JBQy9DK2QsUUFBaUJuZSxFQUFHUSxTQUFTQyxTQUFTcWlCLEVBQWlCLFFBQ3ZENVosRUFBY3lQLEtBQUtDLE1BQU11RixHQUMvQmpWLEVBQVkwRSxVQUFZLENBQUEsU0FDakIxRSxFQUFZMEUsUUFBUXVSLG1CQUNwQmpXLEVBQVkwRSxRQUFRbVYsbUJBQ3BCN1osRUFBWTBFLFFBQVFzUixlQUNwQmhXLEVBQVkwRSxRQUFRb1Ysc0JBQ3BCOVosRUFBWTBFLFFBQVF5UixlQUNwQm5XLEVBQVkwRSxRQUFRMFIsU0FFM0IsTUFBTWxmLEVBQVVGLEVBQUtxQixRQUFRNUIsRUFBT1MsUUFBUyxVQUU3QyxTQURNSixFQUFHUSxTQUFTUCxVQUFVNmlCLEVBQWlCbkssS0FBS0UsVUFBVTNQLE9BQWE1RCxFQUFXLElBQ2hGM0YsRUFBTytOLE1BR1QsYUFGTTFOLEVBQUdRLFNBQVNpTSxHQUFHck0sRUFBUyxDQUFFc00sT0FBTyxFQUFNNUwsV0FBVyxTQUN4RHNULEdBQVUsTUFBTyxDQUFDLFNBQVUsVUFBVyxrQkFBbUJ6VSxFQUFPUyxTQUluRWdVLEdBQVUsT0FBUSxDQUFDLE1BQU8sUUFBUyxRQUFTelUsRUFBT1MsU0FFbkQsTUFBTTZpQixFQUFvQi9pQixFQUFLcUIsUUFBUW5CLEVBQVMsb0JBRTFDYyxFQUFZYSxJQUFJLElBQU0vQixFQUFHUSxTQUFTaU0sR0FBR3ZNLEVBQUtxQixRQUFRNUIsRUFBT1MsUUFBUyxpQkFBa0IsQ0FBRXNNLE9BQU8sV0FDN0Z4TCxFQUFZYSxJQUFJLElBQU0vQixFQUFHUSxTQUFTUCxVQUFVZ2pCLEVBQW1CclYsR0FBUTRVLFVBQVksT0FFekYsTUFBTUgsVUFBRUEsR0FBYzFELEdBQWdCaGYsRUFBUSxJQUM5QyxHQUFJMGlCLEVBQVcsQ0FDYixJQUFJSSxFQUFVOWlCLEVBQU8yTSxZQUFZZ0MsV0FBVywwQkFDeEMzTyxFQUFPMk0sV0FBVzRXLG9CQUFvQnBoQixTQUFTLFlBQzdDOEwsR0FBUThVLGNBQ1I5VSxHQUFRK1UseUJBQ1YvVSxHQUFRNlUsUUFDWkEsRUFBVUEsRUFBUTlnQixRQUNoQixpQkFDQTBnQixFQUNHMWdCLFFBQVEsT0FBUSwrQkFDaEJBLFFBQVEsTUFBTyw4QkFFZkEsUUFBUSxVQUFXLHlDQUVsQlQsRUFBWWEsSUFBSSxJQUNwQi9CLEVBQUdRLFNBQVNQLFVBQVVDLEVBQUtxQixRQUFRbkIsRUFBUyxZQUFhcWlCLEVBQVUsS0FBTSxDQUN2RVUsS0FBTSxNQUdaLENBQ0EsTUFBTUMsRUFBbUIsR0FBR3hWLEdBQVFnVixnQkFBZ0JTLEdBQTBCMWpCLEdBQVFRLEtBQUssZ0JBQ3JGZSxFQUFZYSxJQUFJLElBQ3BCL0IsRUFBR1EsU0FBU1AsVUFBVUMsRUFBS3FCLFFBQVFuQixFQUFTLGNBQWVnakIsRUFBa0IsQ0FDM0VELEtBQU0sTUFHWixDQTFEVW5MLENBQUtyWSxJQUVmLENBMERPLFNBQVMwakIsR0FBMEIxakIsR0FDeEMsTUFBTTJqQixFQUE4QixHQUNoQzNqQixFQUFPMlcsY0FDVGdOLEVBQWtCdFosS0FDaEJ4SyxPQUFPK2pCLEdBQUcsbUdBQ1YvakIsT0FBTytqQixHQUFHLDREQUlWNWpCLEVBQU8yVyxjQUFjeFUsU0FBUyxZQUNoQ3doQixFQUFrQnRaLEtBQUt4SyxPQUFPK2pCLEdBQUcsdURBRS9CNWpCLEVBQU8yVyxjQUNUZ04sRUFBa0J0WixLQUFLeEssT0FBTytqQixHQUFHLGdEQUVuQyxNQUFNQyxFQUFpQjdqQixFQUFPK04sTUFBUSxjQUFnQixPQUNoRCtWLEVBQWtCOWpCLEVBQU9tTixVQUFVd1AsT0FBUzNjLEVBQU9tTixVQUFVK0YsS0FBTyxtQkFBcUIsR0FpQi9GLE9BaEJBeVEsRUFBa0J0WixLQUFLeEssT0FBTytqQixHQUFHLG1DQUFtQ0MsSUFBaUJDLE1BQ2pGOWpCLEVBQU9nWCx1QkFDVDJNLEVBQWtCdFosS0FBS3hLLE9BQU8rakIsR0FBRyxrREFFL0I1akIsRUFBT21OLFVBQVV3UCxNQUNuQmdILEVBQWtCdFosS0FDaEJ4SyxPQUFPK2pCLEdBQUcsbUZBQ1YvakIsT0FBTytqQixHQUFHLDZFQUNWL2pCLE9BQU8rakIsR0FBRyxzRUFFSDVqQixFQUFPbU4sVUFBVXlQLFFBQzFCK0csRUFBa0J0WixLQUNoQnhLLE9BQU8rakIsR0FBRyw2SEFDVi9qQixPQUFPK2pCLEdBQUcsd0hBR1BELENBQ1QsQ0NySUEsU0FBU0ksR0FBa0JDLEVBQWdCdFAsRUFBY3BWLEVBQWMya0IsR0FDckUsTUFBTyw2RUFDK0J2UCwwT0FJSXVQLGdHQUVUM2tCLE9BQVUya0Isd1BBTVBELG9SQVF0QyxDQUVBLE1BQU1FLEdBQWtCLDRHQUd0QjVKLEdBQVdLLFNBQVNqWixJQUFLQyxHQUFRb2lCLEdBQWtCLE9BQVEsNkNBQThDLFdBQVlwaUIsSUFBTW5CLEtBQUssb0NBSzVIMmpCLEdBQWUsNEdBR25CN0osR0FBV0ssU0FBU2paLElBQUtDLEdBQVFvaUIsR0FBa0IsTUFBTyx5RkFBMEYsUUFBU3BpQixJQUFNbkIsS0FBSyxvQ0FLbktWLGVBQWVza0IsR0FBcUJwa0IsR0FDekMsT0FBT1osRUFBT0MsMEJBQTBCLHVCQUF3QlMsVUFDOUQsTUFBTVcsRUFBVUYsRUFBS3FCLFFBQVE1QixFQUFPUyxRQUFTLFNBQzdDLEdBQUlKLEVBQUcwQixXQUFXdEIsR0FBVSxDQUMxQixNQUFNRyxFQUFXTCxFQUFLcUIsUUFBUW5CLEVBQVMsMEJBQ2hDVCxFQUFPb2dCLHVCQUNkcGdCLEVBQU9xZ0IsaUNBQ1ByZ0IsRUFBT3NnQix1QkFDUHRnQixFQUFPdWdCLGlDQUNOdmdCLEVBQU91WCx5QkFDTHZYLEVBQU95Yyx5QkFDUHpjLEVBQU9zYyxxQkFDUHRjLEVBQU91YyxtQkFDUHZjLEVBQU93YyxrQkFDTmpiLEVBQVlhLElBQUksSUFBTTFCLEVBQU9LLGFBQWFILEVBQVVaLEVBQU8rTixNQUFRb1csR0FBZUQsS0FDbEYzaUIsRUFBWWEsSUFBSSxJQUFNL0IsRUFBR1EsU0FBU2lNLEdBQUdsTSxFQUFVLENBQUVtTSxPQUFPLEtBQzlELEdBRUosQ0N2REEsTUFBTVksR0FBYyxDQUNsQixhQUFjLENBQ1pNLFFBQVMsQ0FDUCxhQUFjLENBQ1orVixPQUFRLFVBSWQsYUFBYyxDQUNaSyxTQUFVLENBQ1I1QixRQUFTLENBQ1BqYixLQUFNLHVGQUNOcEYsSUFBSyw2RUFFUCxtQkFBb0IsQ0FDbEJvRixLQUFNLG1CQUNOcEYsSUFBSywrS0FLWGQsVUFJQSxXQUFZLENBQ1YyTSxRQUFTLENBQ1AsV0FBWSxDQUNWK1YsT0FBUSxXQU1WL1YsR0FBVSxDQUNkNlUsUUFBUywyQ0FDVEMsY0FBZSwyV0FXZnpoQixPQUNBMmhCLFVBQVcsME1BVVgzaEIsUUFHS3hCLGVBQWV3a0IsR0FBb0N0a0IsR0FDeEQsT0FBT1osRUFBT0MsMEJBQTBCLHNDQUF1Q1MsZ0JBS2pGQSxlQUFvQkUsR0FDbEIsTUFBTVMsRUFBVUYsRUFBS3FCLFFBQVE1QixFQUFPUyxRQUFTLGNBQ3ZDaWlCLFVBQUVBLEdBQWMxRCxHQUFnQmhmLEVBQVEsSUFDeEN1a0IsRUFBd0MsSUFBSzVXLElBQzlDK1UsVUFDSTZCLEVBQVMsWUFnQmxCLFNBZE12YyxRQUFRNUMsSUFBSSxDQUNoQi9FLEVBQUdRLFNBQVNQLFVBQ1ZDLEVBQUtDLEtBQUtSLEVBQU9TLFFBQVMsZ0JBQzFCK04sRUFBS21DLEtBQUs0VCxFQUFVLENBQ2xCM1QsV0FBVyxFQUNYQyxjQUFjLEVBQ2RDLE9BQVEsQ0FDTixTQUFVLFlBSWhCelEsRUFBR1EsU0FBU2lNLEdBQUdyTSxFQUFTLENBQUVzTSxPQUFPLEVBQU01TCxXQUFXLE1BR2hEdWhCLEVBQVcsQ0FDYixNQUFNSSxFQUFVOWlCLEVBQU8yTSxZQUFZZ0MsV0FBVywwQkFBNEJWLEdBQVE4VSxjQUFnQjlVLEdBQVE2VSxRQUMxR3ppQixFQUFHbWtCLFVBQVVqa0IsRUFBS0MsS0FBS0MsRUFBUyxZQUFhLENBQUVVLFdBQVcsVUFDcERJLEVBQVlhLElBQUksSUFDcEIvQixFQUFHUSxTQUFTUCxVQUFVQyxFQUFLQyxLQUFLQyxFQUFTLFdBQVksWUFBYXFpQixFQUFVLEtBQU0sQ0FDaEZVLEtBQU0sTUFHWixDQUNBLE1BQU1DLEVBQW1CLEdBQUd4VixHQUFRZ1YsZ0JBQWdCUyxHQUEwQjFqQixHQUFRUSxLQUFLLFVBQzNGSCxFQUFHbWtCLFVBQVVqa0IsRUFBS0MsS0FBS0MsRUFBUyxjQUFlLENBQUVVLFdBQVcsVUFDdERJLEVBQVlhLElBQUksSUFDcEIvQixFQUFHUSxTQUFTUCxVQUFVQyxFQUFLcUIsUUFBUW5CLEVBQVMsYUFBYyxjQUFlZ2pCLEVBQWtCLENBQ3pGRCxLQUFNLE1BR1osQ0F6Q1VuTCxDQUFLclksSUFFZixDQzNFQSxNQUFNeWtCLEdBQWlCLENBQ3JCQyxLQUFNLENBQUMsTUFBTyxPQUFRLFdBQVdqYSxXQUNqQ2tTLE1BQU8sQ0FBQyxNQUFPLE9BQVEsVUFBVyxLQUFNLGVBQWdCLFdBQVdsUyxZQ085RDNLLGVBQWU2a0IsR0FBcUIza0IsR0FDekMsT0FBT1osRUFBT0MsMEJBQTBCLHVCQUF3QlMsZ0JBS2xFQSxlQUFvQkUsR0FDbEIsTUFBTVksRUFBV0wsRUFBS3FCLFFBQVE1QixFQUFPUyxRQUFTLHFCQUM5QyxHQUFJVCxFQUFPK04sTUFFVCxrQkFETXhNLEVBQVlhLElBQUksSUFBTS9CLEVBQUdRLFNBQVNpTSxHQUFHbE0sRUFBVSxDQUFFbU0sT0FBTyxLQUloRSxNQUFNNlgsRUFBZ0I1a0IsRUFBTzBJLE9BQVMsMEJBQTRCLGdDQUM1RGpDLEVBQWtCLEdBQ3hCLEdBQUl6RyxFQUFPb2dCLHVCQUF5QnBnQixFQUFPc2dCLHNCQUF1QixDQUNoRSxNQUFNNUYsRUFBUyxRQUNkbUssR0FBYTdrQixTQUFjZ1osS0FBS0UsVUFDakMsR0FBRzBMLGdCQUE0QjdHLEdBQVdDLGlCQUFpQmhlLFdBQ3RENGtCLCtCQUNMbmUsRUFBTTRELEtBQUtxUSxFQUNiLENBQ0EsTUFBTW9LLEVBQWlCOWtCLEVBQU8wSSxPQUFTLG1DQUFxQyxHQUM1RWpDLEVBQU00RCxLQUFLLGdCQUNBaVEsR0FBV0ssU0FBU25hLEtBQUssMElBQytFc2tCLE1BdURySCxTQUFvQzlrQixHQUNsQyxPQUFPQSxFQUFPb2dCLHVCQUF5QnBnQixFQUFPc2dCLHNCQUMxQyxxSUFFK0N1RSxHQUFhN2tCLDhFQUU1RCxFQUNOLENBOUR3SStrQixDQUEyQi9rQiwrRUFFekk0a0IseUpBRUhBLCthQWdCakI1a0IsRUFBT3ljLHdCQUNUaFcsRUFBTTRELEtBQUsseVVBUVRySyxFQUFPZ1gsdUJBQ1R2USxFQUFNNEQsS0FBSyxzSUFRYixNQUFNakssRUFBYSw2REFFbkJKLEVBQU9vZ0IsdUJBQXlCcGdCLEVBQU9zZ0Isc0JBQXdCLDhDQUFnRCx5QkFDN0Y3WixFQUFNakcsS0FBSyxrQkFJdkJlLEVBQVlhLElBQUksSUFBTS9CLEVBQUdRLFNBQVNpTSxHQUFHdk0sRUFBS3FCLFFBQVE1QixFQUFPUyxRQUFTLG9CQUFxQixDQUFFc00sT0FBTyxXQUNoR3hMLEVBQVlhLElBQUksSUFBTS9CLEVBQUdRLFNBQVNpTSxHQUFHdk0sRUFBS3FCLFFBQVE1QixFQUFPUyxRQUFTLHNCQUF1QixDQUFFc00sT0FBTyxXQUNsR3hMLEVBQVlhLElBQUksSUFBTTFCLEVBQU9LLGFBQWFILEVBQVVSLEdBQzVELENBdkVVaVksQ0FBS3JZLElBRWYsQ0F1RUEsU0FBUzZrQixHQUFhN2tCLEdBQ3BCLE1BQU1vaEIsRURoRkQsU0FBb0JwaEIsR0FDekIsT0FBSUEsRUFBT21OLFVBQVV3UCxNQUNaOEgsR0FBZTlILE1BRWpCOEgsR0FBZUMsSUFDeEIsQ0MyRWVNLENBQVdobEIsR0FBUTBCLElBQUsyZixHQUFRLEdBQUdBLFNBQ2hELE1BQU8sS0FBS0QsRUFBSzVnQixLQUFLLFdBQVc4WixHQUFXSSxPQUFPbGEsS0FBSyxPQUMxRCxDQ3BFT1YsZUFBZW1sQixHQUF1QmpsQixHQUMzQyxPQUFPWixFQUFPQywwQkFBMEIseUJBQTBCUyxVQUNoRSxNQUFNYyxFQUFXTCxFQUFLcUIsUUFBUTVCLEVBQU9TLFFBQVMsbUJBQ3hDTyxRQUFpQk4sRUFBT0Msc0JBQXNCQyxJQUFjLEdBQzVEd2IsRUFBa0IxQyxHQUFlSyxtQkFBbUIvWSxHQUNwRHFiLEVBQWtCM0MsR0FBZVEsbUJBQW1CbFosR0FFcERra0IsRUFBb0Iza0IsRUFBS3FCLFFBQVE1QixFQUFPUyxRQUFTLGNBQ2pEMGtCLFFBQTBCekwsR0FBZUUsK0JBQStCc0wsSUFBdUIsR0FFckcsSUFBSUUsRUFBb0IsR0FDcEJwbEIsRUFBT3ljLHlCQUNUMkksRUFBb0IsK0RBT3RCLE1BQU1obEIsRUFBYWdjLEVBaENELGdIQWdDbUNnSixFQUFvQkQsRUFBbUI5SSxRQUN0RjlhLEVBQVlhLElBQUksSUFBTTFCLEVBQU9LLGFBQWFILEVBQVVSLEtBRTlELENDL0JBLE1BQU1xZSxHQUFVLENBQ2Q0RyxTQUFVLElBQ1ZDLEtBQU0sU0FHRHhsQixlQUFleWxCLEdBQTBCdmxCLEdBQzlDLE9BQU9aLEVBQU9DLDBCQUEwQiw0QkFBNkJTLFVBQ25FLElBQUk2TixFQUFzQkUsRUFBVTRRLElBQ3BDLE1BQU03ZCxFQUFXTCxFQUFLcUIsUUFBUTVCLEVBQU9TLFFBQVMsc0JBQzlDLElBQ0UsTUFBTVAsUUFBbUJHLEVBQUdRLFNBQVNDLFNBQVNGLEVBQVUsUUFDbEQyTixFQUFjeUssS0FBS0MsTUFBTS9ZLEdBQy9CeU4sRUFBY3hJLEVBQU1DLElBQUksQ0FBQ3VJLEVBQWFZLEVBQWFaLEdBQWMsQ0FBRWUsV0FBWTlFLEdBQ2pGLENBQUUsTUFDQSxDQUVGLE1BQU14SixFQUFhNFksS0FBS0UsVUFBVXZMLFNBQzVCcE0sRUFBWWEsSUFBSSxJQUFNMUIsRUFBT0ssYUFBYUgsRUFBVVIsS0FFOUQsQ0NwQk9OLGVBQWUwbEIsR0FBZXhsQixHQUNuQyxPQUFPWixFQUFPQywwQkFBMEIsaUJBQWtCUyxVQUN4RCxNQUFNYyxFQUFXTCxFQUFLcUIsUUFBUTVCLEVBQU9TLFFBQVMsYUFDOUMsSUFBSUwsUUFBbUJDLEVBQUdRLFNBQVNDLFNBQVNGLEVBQVUsUUFFbERQLEVBQUcwQixXQUFXeEIsRUFBS3FCLFFBQVE1QixFQUFPUyxRQUFTLHNCQUM3Q0wsRUFBYXFsQixHQUFZcmxCLEVBUjdCLDBLQVdFLE1BQU11TSxFQUFhM00sRUFBTzJNLFlBQVl6RCxNQUFNbEosRUFBTzJNLFdBQVdxTixRQUFRLEtBQU8sR0FDdkUwTCxFQUFZcmxCLEVBQUdzbEIsWUFBWSxHQUFHM2xCLEVBQU9TLDZCQUMzQyxJQUFLLE1BQU04TSxLQUFZbVksRUFBVyxDQUNoQyxJQUFLblksRUFBU29CLFdBQVcsVUFBWXBCLEVBQVNvQixXQUFXLFVBQVcsU0FFcEUsSUFBSWlYLEVBQVlyWSxFQUNoQnFZLEdBQWFBLEVBQVUsSUFBTSxJQUFJQyxjQUFnQkQsRUFBVTFjLE1BQU0sRUFBRzBjLEVBQVU1TCxRQUFRLE1BQ3RGNEwsRUFBWUEsRUFBVTVqQixRQUFRLElBQUssS0FDbkMsTUFBTThqQixFQUFRLE1BQU1GLHlCQUFpQ2paLHVCQUFnQ1ksb0NBQTJDWix1QkFBZ0NZLEtBQzVKbE4sRUFBRzBCLFdBQVd4QixFQUFLcUIsUUFBUTVCLEVBQU9TLFFBQVMscUJBQXFCOE0sUUFDbEVuTixFQUFhcWxCLEdBQVlybEIsRUFBWTBsQixHQUV6QyxPQUVNdmtCLEVBQVlhLElBQUksSUFBTTFCLEVBQU9LLGFBQWFILEVBQVVSLEtBRTlELENBRU8sU0FBU3FsQixHQUFZTSxFQUFnQkQsR0FFMUNDLEVBQVNBLEVBQU8vakIsUUFBUThqQixFQUFPLElBQUl6a0IsV0FBVyxXQUFZLFFBRTFELElBQUssSUFBSTJrQixFQUFJLEVBQUdBLEVBQUlELEVBQU96ZixPQUFRMGYsSUFDakMsR0FBc0IsT0FBbEJELEVBQU9DLEVBQUksSUFBNkIsT0FBZEQsRUFBT0MsR0FBYSxDQUNoRCxNQUFNcFUsRUFBU21VLEVBQU83YyxNQUFNLEVBQUc4YyxFQUFJLEdBQ25DLElBQUluVSxFQUFRa1UsRUFBTzdjLE1BQU04YyxFQUFJLEdBSTdCLE9BSEtuVSxFQUFNbEQsV0FBVyxNQUFTa0QsRUFBTWxELFdBQVcsT0FDOUNrRCxFQUFRLEtBQUtBLEtBRVIsR0FBR0QsSUFBU2tVLE1BQVVqVSxHQUMvQixDQUVGLE1BQU8sR0FBR2tVLE1BQVdELEtBQ3ZCLENDMUNPaG1CLGVBQWVtbUIsR0FBa0J6WixHQUN0QyxPQUFPcE4sRUFBT0MsMEJBQTBCLG9CQUFxQlMsVUFDM0QsTUFBTWMsRUFBV0wsRUFBS3FCLFFBQVE0SyxFQUFXL0wsUUFBUyxtQkFDbEQsSUFBS0osRUFBRzBCLFdBQVduQixHQUFXLE9BRTlCLE1BQU0yakIsRUFBV3ZMLEtBQUtDLFlBQVk1WSxFQUFHUSxTQUFTQyxTQUFTRixFQUFVLFNBRzNEc2xCLEVBQVUzQixFQUFTMkIsU0FBVyxHQUNwQyxJQUFLLElBQUlGLEVBQUksRUFBR0EsRUFBSUUsRUFBUTVmLE9BQVEwZixJQUFLLENBQ3ZDLE1BQU1HLEVBQVNwRyxNQUFNQyxRQUFRa0csRUFBUUYsSUFBTUUsRUFBUUYsS0FBSyxHQUFLRSxFQUFRRixHQUMvRGxLLEVBQWFpRSxNQUFNQyxRQUFRa0csRUFBUUYsS0FBT0UsRUFBUUYsS0FBSyxJQUFPLENBQUEsRUFDcEUsR0FBZSxzQ0FBWEcsRUFDRkQsRUFBUUYsR0FBSyxDQUNYLG9DQUNBN2dCLEVBQU1DLElBQ0osQ0FDRTBXLEVBQ0EsQ0FDRXNLLE9BQVEsd0JBR1osQ0FBRTFYLFdBQVk5RSxVQUdiLEdBQWUsNkJBQVh1YyxFQUF1QyxDQUVoRCxNQUFRRSxZQUFhQyxFQUFJQyxlQUFnQkMsS0FBT0MsR0FBbUIzSyxFQUNuRW9LLEVBQVFGLEdBQUssQ0FDWCwyQkFDQTdnQixFQUFNQyxJQUNKLENBQ0VxaEIsRUFDQSxDQUVFQyx5QkFBeUIsRUFDekJDLHNCQUFzQixFQUN0QkMsT0FBUSxDQUFDLHVCQUNUQyxlQUFnQixDQUFDLHlCQUdyQixDQUFFblksV0FBWTlFLElBR3BCLENBQ0YsQ0FDQSxNQUFNeEosRUFBYTRZLEtBQUtFLFVBQVVxTCxTQUM1QmhqQixFQUFZYSxJQUFJLElBQU0xQixFQUFPSyxhQUFhSCxFQUFVUixLQUU5RCxDQ2hEQSxNQUFNcWUsR0FBVSxDQUNkM0YsUUFBUyxvREFDVEMsUUFBUyxDQUFDLDBEQUtMalosZUFBZWduQixHQUFxQjltQixHQUN6QyxPQUFPWixFQUFPQywwQkFBMEIsdUJBQXdCUyxVQUM5RCxJQUFJNk4sRUFBY0UsRUFBVTRRLElBQzVCLE1BQU03ZCxFQUFXTCxFQUFLcUIsUUFBUTVCLEVBQU9TLFFBQVMsaUJBQzlDLEdBQUlKLEVBQUcwQixXQUFXLEdBQUduQixNQUVuQixPQUVGLElBQ0UsTUFBTVYsUUFBbUJHLEVBQUdRLFNBQVNDLFNBQVNGLEVBQVUsUUFDbEQyTixFQUFjeUssS0FBS0MsTUFBTS9ZLEdBQy9CeU4sRUFBY3hJLEVBQU1DLElBQUksQ0FBQ3VJLEVBQWFZLEVBQWFaLEdBQWMsQ0FDL0RlLFdBQVk5RSxJQUVkK0QsRUFBWW9MLFFBQVVwTCxFQUFZb0wsUUFBUTdMLE9BQVFoRCxHQUEwQixpQkFBVEEsRUFDckUsQ0FBRSxNQUNBLENBSUVsSyxFQUFPbU4sVUFBVXdQLFFBQ25CaFAsRUFBWW9aLGVBQWlCLEdBRTFCcFosRUFBWW9aLGFBQWE3Z0IsS0FBTThnQixHQUM5QkEsRUFBS0MsbUJBQW1COWtCLFNBQVMsVUFHbkN3TCxFQUFZb1osYUFBYTFjLEtBQUssQ0FBRTRjLGtCQUFtQixDQUFDLFFBQVNDLFNBQVMsV0FJcEUzbEIsRUFBWWEsSUFBSSxJQUFNL0IsRUFBR1EsU0FBU2lNLEdBQUd2TSxFQUFLcUIsUUFBUTVCLEVBQU9TLFFBQVMsZUFBZ0IsQ0FBRXNNLE9BQU8sV0FDM0Z4TCxFQUFZYSxJQUFJLElBQU0vQixFQUFHUSxTQUFTaU0sR0FBR3ZNLEVBQUtxQixRQUFRNUIsRUFBT1MsUUFBUyxvQkFBcUIsQ0FBRXNNLE9BQU8sS0FDdEcsTUFBTTNNLEVBQWE0WSxLQUFLRSxVQUFVdkwsU0FDNUJwTSxFQUFZYSxJQUFJLElBQU0xQixFQUFPSyxhQUFhSCxFQUFVUixLQUU5RCxDQ3pDQSxNQUFNK21CLEdBQWMsQ0FDbEJDLGdCQUFpQixDQUNmcGQsT0FBUSxTQUNScWQsT0FBUSxTQUNSQyxpQkFBa0IsT0FDbEJDLElBQUssWUFDTEMsY0FBYyxFQUNkQyxRQUFRLEVBQ1JDLDBCQUEwQixFQUMxQkMsY0FBYyxFQUNkQyw4QkFBOEIsRUFDOUJDLGlCQUFpQixFQUNqQkMsbUJBQW1CLEVBQ25CcGpCLGFBQWEsRUFDYnFqQixXQUFXLEVBQ1hDLGVBQWUsRUFDZkMsb0JBQW9CLEVBQ3BCQyxPQUFRLE9BQ1JDLFVBQVcsQ0FBQyx3QkFBeUIsYUFFdkNDLFFBQVMsQ0FBQywyQkFBNEIsaUJBQ3RDQyxRQUFTLENBQ1AsMEJBQ0Esc0JBQ0EsdUJBQ0EsZUFDQSxXQUNBLGNBSUVDLEdBQWEsQ0FDakJsQixnQkFBaUIsQ0FDZnBkLE9BQVEsU0FDUnFkLE9BQVEsU0FDUkMsaUJBQWtCLE9BQ2xCQyxJQUFLLFlBQ0xDLGNBQWMsRUFDZEMsUUFBUSxFQUNSQywwQkFBMEIsRUFDMUJDLGNBQWMsRUFDZEMsOEJBQThCLEVBQzlCQyxpQkFBaUIsRUFDakJDLG1CQUFtQixFQUNuQnBqQixhQUFhLEVBQ2JxakIsV0FBVyxFQUNYQyxlQUFlLEVBQ2ZDLG9CQUFvQixFQUNwQkMsT0FBUSxPQUNSQyxVQUFXLENBQUMsNEJBQTZCLGVBQWdCLGFBRTNEQyxRQUFTLENBQUMsaUJBQ1ZDLFFBQVMsQ0FBQyxlQUFnQixXQUFZLGNBR2pDdm9CLGVBQWV5b0IsR0FBaUJ2b0IsR0FDckMsT0FBT1osRUFBT0MsMEJBQTBCLG1CQUFvQlMsVUFDMUQsR0FBSUUsRUFBT21OLFVBQVV3UCxPQUFTM2MsRUFBT21OLFVBQVUrRixLQUFNLE9BRXJELElBQUl2RixFQUFjRSxFQUFVN04sRUFBTzBJLE9BQVN5ZSxHQUFjbUIsSUFDckR0b0IsRUFBT2llLHFCQUF3QmplLEVBQU93b0Isc0NBQ2xDN2EsRUFBWXlaLGlCQUFpQkcsSUFFbEN2bkIsRUFBTzBJLFNBQVcxSSxFQUFPMkksNkJBQzNCZ0YsRUFBWTBhLFFBQVUxYSxFQUFZMGEsU0FBU25iLE9BQVF6TSxJQUFxQkEsRUFBUWtPLFdBQVcsZ0JBQzNGaEIsRUFBWXlhLFFBQVV6YSxFQUFZeWEsU0FBU2xiLE9BQVF6TSxJQUFxQkEsRUFBUWtPLFdBQVcsaUJBRXpGM08sRUFBT3lvQixlQUNUOWEsRUFBWXlaLGdCQUFrQixJQUN6QnpaLEVBQVl5WixnQkFDZkMsT0FBUSxXQUNSQyxpQkFBa0IsYUFJdEIsTUFBTTFtQixFQUFXTCxFQUFLcUIsUUFBUTVCLEVBQU9TLFFBQVMsaUJBQzlDLElBQ0UsTUFBTXllLFFBQXdCN2UsRUFBR1EsU0FBU0MsU0FBU0YsRUFBVSxRQUN2RDJOLEVBQWN5SyxLQUFLQyxNQUFNaUcsR0FDSCx1REFBeEIzUSxFQUFZd0ssZ0JBQ1B4SyxFQUFZd0ssZUFHZHBMLEVBQVl5WixpQkFBaUJwZCxPQUMvQmhLLEVBQU95b0Isc0JBQ0g5YSxFQUFZeVosaUJBQWlCQyxjQUM3QjFaLEVBQVl5WixpQkFBaUJFLGtCQUVsQy9ZLEVBQVk2WSxpQkFBaUJHLFlBQ3hCNVosRUFBWXlaLGlCQUFpQkcsSUFFdEM1WixFQUFjeEksRUFBTUMsSUFBSSxDQUFDdUksRUFBYVksRUFBYVosR0FBYyxDQUFFZSxXQUFZM0UsSUFDL0U0RCxFQUFZMGEsUUFBVTFhLEVBQVkwYSxTQUFTbmIsT0FDeEN6TSxJQUNFQSxFQUFRMEIsU0FBUyxZQUFjMUIsRUFBUTBCLFNBQVMsZ0JBQWtCMUIsRUFBUTBCLFNBQVMsVUFFMUYsQ0FBRSxNQUNBLENBRUZtSSxFQUFTcUQsR0FDVEEsRUFBWTBhLFNBQVNLLE9BQ3JCLE1BQU10b0IsRUFBYTRZLEtBQUtFLFVBQVV2TCxVQUUzQkEsRUFBWXlaLGlCQUFpQnVCLDZCQUM5QnBuQixFQUFZYSxJQUFJLElBQU0xQixFQUFPSyxhQUFhSCxFQUFVUixLQUU5RCxDQzdHQSxNQUFNd29CLEdBQXNCLENBQzFCLHFCQUNBLDJCQUNBLHFCQUNBLFlBQ0EsYUFDQSxjQUdLOW9CLGVBQWUrb0IsR0FBdUI3b0IsR0FDM0MsT0FBT1osRUFBT0MsMEJBQTBCLHlCQUEwQlMsVUFDaEUsSUFDRSxNQUFNYyxFQUFXTCxFQUFLcUIsUUFBUTVCLEVBQU9TLFFBQVMsVUFBVyxpQkFDbkR5ZSxRQUF3QjdlLEVBQUdRLFNBQVNDLFNBQVNGLEVBQVUsUUFDN0QsSUFBSTJqQixFQUFXdkwsS0FBS0MsTUFBTWlHLEdBQzFCLElBQUssTUFBTTRKLEtBQXNCRixHQUMvQnJFLEVBQVdwZixFQUFNQyxJQUFJLENBQUNtZixFQUFVd0UsR0FBZUQsS0FFN0M5b0IsRUFBT2dYLHdCQUNUdU4sRUFBV3BmLEVBQU1DLElBQUksQ0FBQ21mLEVBQVV3RSxHQUFlLGtCQUU3Qy9vQixFQUFPbU4sVUFBVStGLE9BQ25CcVIsRUFBV3BmLEVBQU1DLElBQUksQ0FBQ21mLEVBQVV3RSxHQUFlLGtCQUk3Qyw2QkFBOEJ4RSxVQUN6QkEsRUFBUyw0QkFFZCx3QkFBeUJBLFVBQ3BCQSxFQUFTLHVCQUVsQmphLEVBQVNpYSxHQUNULE1BQU1ua0IsRUFBYTRZLEtBQUtFLFVBQVVxTCxPQUFVNWUsRUFBVyxTQUNqRHBFLEVBQVlhLElBQUksSUFBTTFCLEVBQU9LLGFBQWFILEVBQVVSLEdBQzVELENBQUUsTUFDQSxHQUdOLENBRUEsU0FBUzJvQixHQUFlRCxHQUN0QixNQUFPLENBQ0wsdUJBQXdCLENBQ3RCQSxDQUFDQSxJQUFxQixHQUc1QixDQ2hDT2hwQixlQUFla3BCLEdBQWtCaHBCLEdBQ3RDLE9BQU9aLEVBQU9DLDBCQUEwQixvQkFBcUJTLFVBQzNELE1BQU1tcEIsRUFBZ0Ixb0IsRUFBS3FCLFFBQVE1QixFQUFPUyxRQUFTLGVBQ25ELEdBQUlULEVBQU8rTixNQVFULGFBUE14TSxFQUFZYSxJQUFJLElBQU0vQixFQUFHUSxTQUFTaU0sR0FBR21jLEVBQWUsQ0FBRWxjLE9BQU8sV0FDN0R4TCxFQUFZYSxJQUFJLElBQ3BCL0IsRUFBR1EsU0FBU2lNLEdBQUd2TSxFQUFLcUIsUUFBUTVCLEVBQU9TLFFBQVMsU0FBVSxDQUFFc00sT0FBTyxFQUFNNUwsV0FBVyxnQkFFNUVJLEVBQVlhLElBQUksSUFDcEIvQixFQUFHUSxTQUFTaU0sR0FBR3ZNLEVBQUtxQixRQUFRNUIsRUFBT1MsUUFBUyxhQUFjLENBQUVzTSxPQUFPLEVBQU01TCxXQUFXLEtBS3hGLE1BQU0rbkIsRUFBaUJqVSxHQUEwQixPQUFRLENBQUMsYUFBY2pWLEVBQU9TLFNBQ3pFMG9CLEVBc0RILFNBQTBCOWYsRUFBcUI1SSxHQUNwRCxNQUFNMm9CLEVBQWVuVSxHQUEwQixNQUFPLENBQUMsT0FBUTVMLEVBQWEsV0FBWSxVQUFXNUksR0FFbkcsT0FEaUJ1WSxLQUFLQyxNQUFNbVEsR0FDWnhpQixNQUNsQixDQTFEMEJ5aUIsQ0FBaUIsZUFBZ0JycEIsRUFBT1MsU0FDMUQ2b0IsR0FBZUosSUFBbUJJLEdBQWVILElBQWtCRCxJQUFtQkMsR0FDeEYxVSxHQUFVLE9BQVEsQ0FBQyxNQUFPLFVBQVcwVSxHQUFnQm5wQixFQUFPUyxRQUFTLEdBR3ZFLE1BQU04b0IsRUFBZWhwQixFQUFLQyxLQUFLUixFQUFPUyxRQUFTLFFBQVMsa0JBQ2xESixFQUFHUSxTQUFTSSxNQUFNc29CLEVBQWMsQ0FBRXBvQixXQUFXLElBQ25ELElBQUssTUFBTXNRLFdBQWNwUixFQUFHUSxTQUFTaUksUUFBUXlnQixHQUN2QzlYLEVBQUs5QyxXQUFXLFdBQWE4QyxFQUFLOUMsV0FBVyxRQUFRd2EsYUFDakQ1bkIsRUFBWWEsSUFBSSxJQUFNL0IsRUFBR1EsU0FBU2lNLEdBQUd2TSxFQUFLQyxLQUFLK29CLEVBQWM5WCxLQUt2RSxNQUFNK1gsRUFBYWpwQixFQUFLcUIsUUFBUTVCLEVBQU9TLFFBQVMsaUJBQzFDYyxFQUFZYSxJQUFJLElBQU0vQixFQUFHUSxTQUFTaU0sR0FBRzBjLEVBQVksQ0FBRXpjLE9BQU8sS0FFaEUsTUFBTXdYLEVBQVcvVixFQUFLQyxXQUFXcE8sRUFBR1EsU0FBU0MsU0FBU21vQixFQUFlLFNBQ3JFMUUsRUFBU2tGLHlCQUEyQixHQUNwQ2xGLEVBQVNtRixXQUFhLGVBQ3RCbkYsRUFBU29GLE9BQVMsbUJBQ2xCcEYsRUFBU3FGLGtCQUFvQixLQUM3QnJGLEVBQVNzRix1QkFBeUIsQ0FDaEMsNkJBQ0EsNEJBQ0EsZ0NBQ0Esc0NBQ0Esa0NBQ0EsZ0NBQ0Esc0NBQ0EsK0JBQ0EsMEJBRUt0RixFQUFTdUYsaUJBQ2dDLElBQTVDdkYsRUFBU3dGLHdCQUF3QnpqQixlQUM1QmllLEVBQVN3Rix1QkFHbEJ4RixFQUFTeUYsbUJBQW9CLEVBQzdCLE1BQU1DLEVBQWlCMUYsRUFBUzJCLFNBQVM1ZixRQUFVLEVBRW5ELEdBREFpZSxFQUFTMkIsUUFBVTNCLEVBQVMyQixTQUFTaFosT0FBUXBMLEdBQWlCLGdDQUFYQSxFQUFFdkIsT0FBMkMsR0FDNUZna0IsRUFBUzJCLFFBQVE1ZixTQUFXMmpCLEVBQWdCLENBQzlDLE1BQU1DLEVBQWEzcEIsRUFBS3FCLFFBQVE1QixFQUFPUyxRQUFTLFVBQVcsdUJBQ3JEYyxFQUFZYSxJQUFJLElBQU0vQixFQUFHUSxTQUFTaU0sR0FBR29kLEVBQVksQ0FBRW5kLE9BQU8sSUFDbEUsQ0FDZ0MsSUFBNUJ3WCxFQUFTMkIsUUFBUTVmLGVBQ1ppZSxFQUFTMkIsY0FFWjdsQixFQUFHUSxTQUFTUCxVQUFVMm9CLEVBQWV6YSxFQUFLbUMsS0FBSzRULEVBQVUsQ0FBRTNULFdBQVcsS0FFNUU2RCxHQUFVLE9BQVEsQ0FBQyxNQUFPLDRCQUE2QnpVLEVBQU9TLFVBRWxFLENBT0EsU0FBUzZvQixHQUFlclQsR0FDdEIsTUFBT2tVLEdBQVNsVSxFQUFRdFAsTUFBTSxLQUM5QixPQUFPd1AsT0FBT2dVLEVBQ2hCLENDakdPcnFCLGVBQWVzcUIsR0FBWXBxQixHQUNoQyxPQUFPWixFQUFPQywwQkFBMEIsY0FBZVMsVUFDckQsTUFBTzhULEVBQU8rRCxHQUFRdkUsR0FBV0MsY0FBY3JULEVBQU8yTSxZQUFjLElBQ3BFLElBQUtpSCxJQUFVK0QsRUFBTSxPQUNyQixHQUFjLGdCQUFWL0QsR0FBcUMsbUJBQVZBLEVBQTRCLE9BQzNELElBQUtRLEdBQWVSLEdBQVEsT0FFNUIsTUFBTUcsRUFBVUosR0FBV0MsR0FFM0IsVUFDUXlXLEdBQVd0VyxFQUFTSCxFQUFPK0QsRUFBTSx3QkFBeUIsZ0JBQzFEMFMsR0FBV3RXLEVBQVNILEVBQU8rRCxFQUFNLHFCQUFzQixnQkFDdkQwUyxHQUFXdFcsRUFBU0gsRUFBTytELEVBQU0sa0JBQW1CLGdCQUNwRDBTLEdBQVd0VyxFQUFTSCxFQUFPK0QsRUFBTSxtQkFBb0IsZ0JBQ3JEMFMsR0FBV3RXLEVBQVNILEVBQU8rRCxFQUFNLHNCQUF1QixnQkFDeEQwUyxHQUFXdFcsRUFBU0gsRUFBTytELEVBQU0sa0NBQW1DLGdCQUNwRTBTLEdBQVd0VyxFQUFTSCxFQUFPK0QsRUFBTSwwQkFBMkIsZ0JBQzVEMFMsR0FBV3RXLEVBQVNILEVBQU8rRCxFQUFNLHVCQUF3QixnQkFDekQwUyxHQUFXdFcsRUFBU0gsRUFBTytELEVBQU0sNkJBQThCLGdCQUMvRDBTLEdBQVd0VyxFQUFTSCxFQUFPK0QsRUFBTSxXQUFZLGdCQUM3QzBTLEdBQVd0VyxFQUFTSCxFQUFPK0QsRUFBTSxjQUFlLGdCQUNoRDBTLEdBQVd0VyxFQUFTSCxFQUFPK0QsRUFBTSxZQUFhLGdCQUM5QzBTLEdBQVd0VyxFQUFTSCxFQUFPK0QsRUFBTSxXQUFZLGdCQUM3QzBTLEdBQVd0VyxFQUFTSCxFQUFPK0QsRUFBTSxZQUFhLGdCQUM5QzBTLEdBQVd0VyxFQUFTSCxFQUFPK0QsRUFBTSxzQkFBdUIsZ0JBQ3hEMFMsR0FBV3RXLEVBQVNILEVBQU8rRCxFQUFNLGlCQUFrQixnQkFDbkQwUyxHQUFXdFcsRUFBU0gsRUFBTytELEVBQU0seUJBQTBCLGdCQUMzRDBTLEdBQVd0VyxFQUFTSCxFQUFPK0QsRUFBTSxzQkFBdUIsZ0JBQ3hEMFMsR0FBV3RXLEVBQVNILEVBQU8rRCxFQUFNLHNCQUF1QixnQkFDeEQwUyxHQUFXdFcsRUFBU0gsRUFBTytELEVBQU0saUJBQWtCLGdCQUNuRDBTLEdBQVd0VyxFQUFTSCxFQUFPK0QsRUFBTSxpQkFBa0IsZ0JBQ25EMFMsR0FBV3RXLEVBQVNILEVBQU8rRCxFQUFNLGlCQUFrQixnQkFDbkQwUyxHQUFXdFcsRUFBU0gsRUFBTytELEVBQU0saUJBQWtCLGdCQUNuRDBTLEdBQVd0VyxFQUFTSCxFQUFPK0QsRUFBTSxpQkFBa0IsZ0JBQ25EMFMsR0FBV3RXLEVBQVNILEVBQU8rRCxFQUFNLGtCQUFtQixnQkFDcEQwUyxHQUFXdFcsRUFBU0gsRUFBTytELEVBQU0sb0JBQXFCLGdCQUN0RDBTLEdBQVd0VyxFQUFTSCxFQUFPK0QsRUFBTSxtQkFBb0IsZ0JBQ3JEMFMsR0FBV3RXLEVBQVNILEVBQU8rRCxFQUFNLDhCQUErQixnQkFDaEUwUyxHQUFXdFcsRUFBU0gsRUFBTytELEVBQU0saUJBQWtCLGdCQUNuRDBTLEdBQVd0VyxFQUFTSCxFQUFPK0QsRUFBTSxxQkFBc0IsZ0JBQ3ZEMFMsR0FBV3RXLEVBQVNILEVBQU8rRCxFQUFNLGVBQWdCLGdCQUNqRDBTLEdBQVd0VyxFQUFTSCxFQUFPK0QsRUFBTSxnQkFBaUIsZ0JBQ2xEMFMsR0FBV3RXLEVBQVNILEVBQU8rRCxFQUFNLHdCQUF5QixnQkFDMUQwUyxHQUFXdFcsRUFBU0gsRUFBTytELEVBQU0sc0JBQXVCLGdCQUN4RDBTLEdBQVd0VyxFQUFTSCxFQUFPK0QsRUFBTSxzQkFBdUIsZ0JBQ3hEMFMsR0FBV3RXLEVBQVNILEVBQU8rRCxFQUFNLFVBQVcsZ0JBQzVDMFMsR0FBV3RXLEVBQVNILEVBQU8rRCxFQUFNLGlCQUFrQixnQkFDbkQwUyxHQUFXdFcsRUFBU0gsRUFBTytELEVBQU0scUJBQXNCLGdCQUN2RDBTLEdBQVd0VyxFQUFTSCxFQUFPK0QsRUFBTSx3QkFBeUIsZ0JBQzFEMFMsR0FBV3RXLEVBQVNILEVBQU8rRCxFQUFNLHVCQUF3QixnQkFDekQwUyxHQUFXdFcsRUFBU0gsRUFBTytELEVBQU0sd0JBQXlCLGdCQUUxRDJTLEdBQVl2VyxFQUFTSCxFQUFPK0QsRUFBTSxhQUNsQzJTLEdBQVl2VyxFQUFTSCxFQUFPK0QsRUFBTSx1QkFDbEMyUyxHQUFZdlcsRUFBU0gsRUFBTytELEVBQU0sbUJBQ2xDMlMsR0FBWXZXLEVBQVNILEVBQU8rRCxFQUFNLHFCQUNsQzJTLEdBQVl2VyxFQUFTSCxFQUFPK0QsRUFBTSwwQkFDbEMyUyxHQUFZdlcsRUFBU0gsRUFBTytELEVBQU0scUJBQ2xDMlMsR0FBWXZXLEVBQVNILEVBQU8rRCxFQUFNLGlCQUNsQzJTLEdBQVl2VyxFQUFTSCxFQUFPK0QsRUFBTSxrQkFDbEMyUyxHQUFZdlcsRUFBU0gsRUFBTytELEVBQU0saUJBRWxDMlMsR0FBWXZXLEVBQVNILEVBQU8rRCxFQUFNLGVBQ2xDMlMsR0FBWXZXLEVBQVNILEVBQU8rRCxFQUFNLDBCQUNsQzJTLEdBQVl2VyxFQUFTSCxFQUFPK0QsRUFBTSxrQkFDbEMyUyxHQUFZdlcsRUFBU0gsRUFBTytELEVBQU0sMEJBQ2xDMlMsR0FBWXZXLEVBQVNILEVBQU8rRCxFQUFNLHdCQUNsQzJTLEdBQVl2VyxFQUFTSCxFQUFPK0QsRUFBTSxnQkFDMUMsQ0FBRSxNQUFPalksR0FDUEYsUUFBUStxQixLQUFLLDJCQUE2QjdxQixHQUE2QkUsT0FBU0YsRUFDbEYsR0FFSixDQUVBSSxlQUFldXFCLEdBQVd0VyxFQUFrQkgsRUFBZStELEVBQWNyWSxFQUFja3JCLEdBQ3JGLFVBRVF6VyxFQUFRMkQsUUFBUSxvQ0FBcUMsQ0FDekQ5RCxRQUNBK0QsT0FDQXJZLE9BQ0FrckIsU0FFSixDQUFFLFlBRU16VyxFQUFRMkQsUUFBUSw0Q0FBNkMsQ0FDakU5RCxRQUNBK0QsT0FDQXJZLE9BQ0FrckIsU0FFSixDQUNGLENBRUExcUIsZUFBZXdxQixHQUFZdlcsRUFBa0JILEVBQWUrRCxFQUFjclksR0FDeEUsVUFFUXlVLEVBQVEyRCxRQUFRLDZDQUE4QyxDQUNsRTlELFFBQ0ErRCxPQUNBclksUUFFSixDQUFFLE1BQ0EsQ0FFSixDQ3JHQSxNQUFNbXJCLEdBQTBCLENBQUMsNEJBQTZCLGFBQWMscUJBRXJFM3FCLGVBQWU0cUIsR0FBYTFxQixHQUNqQyxPQUFPWixFQUFPQywwQkFBMEIsZUFBZ0JTLFVBQ3RELE1BQU84VCxFQUFPK0QsR0FBUXZFLEdBQVdDLGNBQWNyVCxFQUFPMk0sWUFBYyxJQUNwRSxJQUFLaUgsSUFBVStELEdBQWtCLG1CQUFWL0QsRUFBNEIsT0FDbkQsSUFBS1EsR0FBZVIsS0FBVzNVLEVBQVFFLGtCQUFtQixPQUUxRCxNQUFNNEUsRUFBUzRtQixFQUFPM3FCLFNBQVMrRCxRQUFVLENBQUEsRUFDekMsR0FBbUMsSUFBL0JrRCxPQUFPdUosS0FBS3pNLEdBQVF1QyxPQUFjLE9BRXRDLE1BQU15TixFQUFVSixHQUFXQyxHQUUzQixJQUNFLElBQUssTUFBTWdYLEtBQWNILEdBQ3ZCLFVBRVExVyxFQUFRMkQsUUFBUSw2REFBOEQsQ0FDbEY5RCxRQUNBK0QsT0FDQWtULFlBQWFELEdBRWpCLENBQUUsTUFDQSxDQUtKLE1BQU0zVCxRQUFpQmxELEVBQVEyRCxRQUFRLHVEQUF3RCxDQUM3RjlELFFBQ0ErRCxVQUVJeFEsSUFBRUEsRUFBSzJqQixPQUFRQyxHQUFVOVQsRUFBU1csV0FFbENvVCxFQUFPQyxNQUViLElBQUssTUFBTzNyQixFQUFNNHJCLEtBQVdqa0IsT0FBT0MsUUFBUW5ELEdBQVMsQ0FDbkQsR0FDVyxlQUFUekUsR0FDUywrQkFBVEEsR0FDUyxrQ0FBVEEsRUFFQSxTQUlGLE1BQU02ckIsRUFBU0gsRUFBT0ksWUFBWWprQixFQUFLNmpCLEVBQU9LLGdCQUFnQkMsVUFDeERDLEVBQVNQLEVBQU9RLFlBQVlOLEdBRzVCTyxFQUFXVCxFQUFPVSxnQkFBZ0JILEVBQVFKLEdBRzFDUSxFQUFZWCxFQUFPWSxVQUFVSCxFQUFVVCxFQUFPSyxnQkFBZ0JDLGdCQUc5RHZYLEVBQVEyRCxRQUFRLDBEQUEyRCxDQUMvRTlELFFBQ0ErRCxPQUNBa1QsWUFBYXZyQixFQUNidXNCLGdCQUFpQkYsRUFDakJiLE9BQVFDLEdBRVosQ0FDRixDQUFFLE1BQU9yckIsR0FDUEYsUUFBUStxQixLQUFLLDRCQUE4QjdxQixHQUE2QkUsT0FBU0YsRUFDbkYsR0FFSixDQ3pFT0ksZUFBZWdzQixHQUFvQjlyQixHQUN4QyxNQUFPNFQsRUFBTytELEdBQVF2RSxHQUFXQyxjQUFjclQsRUFBTzJNLFlBQWMsSUFDcEUsSUFBS2lILElBQVUrRCxFQUFNLE9BQ3JCLEdBQWMsZ0JBQVYvRCxHQUFxQyxtQkFBVkEsRUFBNEIsT0FDM0QsSUFBS1EsR0FBZVIsR0FBUSxPQUU1QixNQUFNRyxFQUFVSixHQUFXQyxTQUdyQm1ZLEVBQVUsSUFDZGhZLEVBQVEyRCxRQUFRLDhCQUErQixDQUM3QzlELFFBQ0ErRCxPQUNBcVUsa0JBQWtCLEVBQ2xCQyxvQkFBb0IsRUFDcEJDLG9CQUFvQixFQUNwQkMsb0JBQW9CLEVBQ3BCQyxxQkFBcUIsRUFDckJDLHdCQUF3QixFQUN4QkMsMEJBQTJCLFdBQzNCQyw0QkFBNkIsUUFDN0JDLFFBQVMsQ0FDUCx1QkFBd0IsaUJBRXRCeHNCLEVBQU8yTSxZQUFZZ0MsV0FBVyx1QkFBeUIsQ0FBRXFkLGtCQUFrQixHQUFTLENBQUEsSUFHOUYsQ0N0QkEsTUFBTVMsR0FBWSxDQUNoQiwyQkFBNEIsNDJDQTBDNUJuckIsUUFHS3hCLGVBQWU0c0IsR0FBd0Ixc0IsR0FDNUMsT0FBT1osRUFBT0MsMEJBQTBCLDBCQUEyQlMsVUFDakUsSUFBSyxNQUFPeU4sRUFBVW5OLEtBQWU2RyxPQUFPQyxRQUFRdWxCLElBQVksQ0FDOUQsTUFBTTdyQixFQUFXTCxFQUFLcUIsUUFBUTVCLEVBQU9TLFFBQVMsVUFBVzhNLEdBQ3pELEdBQUlsTixFQUFHMEIsV0FBV25CLEdBQVcsQ0FDM0IsTUFBTVYsUUFBbUJHLEVBQUdRLFNBQVNDLFNBQVNGLEVBQVUsUUFDeEQsR0FBSStyQixFQUFTenNCLEVBQVlFLEdBQWNBLEVBQVdrRyxPQUFTLEVBQ3pELFFBRUosT0FFTWpHLEVBQUdRLFNBQVNJLE1BQU1WLEVBQUtxQixRQUFRNUIsRUFBT1MsUUFBUyxXQUFZLENBQUVVLFdBQVcsVUFDeEVJLEVBQVlhLElBQUksSUFBTTFCLEVBQU9LLGFBQWFILEVBQVVSLEdBQzVELEdBRUosQ0NDQSxNQUFNd3NCLEdBQWlCQyxFQUFFN2xCLE9BQU8sQ0FDOUIrSyxNQUFPOGEsRUFDSjdsQixPQUFPLENBQ041QixJQUFLeW5CLEVBQUVDLE9BQU9ELEVBQUVFLFNBQVVGLEVBQUVFLFVBQVVDLFdBQ3RDQyxJQUFLSixFQUFFQyxPQUFPRCxFQUFFRSxTQUFVRixFQUFFRSxVQUFVQyxXQUN0Qy9vQixHQUFJNG9CLEVBQUVDLE9BQU9ELEVBQUVFLFNBQVVGLEVBQUVFLFVBQVVDLFdBQ3JDNVAsS0FBTXlQLEVBQUVDLE9BQU9ELEVBQUVFLFNBQVVGLEVBQUVFLFVBQVVDLGFBRXhDQSxhQUdFbHRCLGVBQWVvdEIsR0FDcEJ6c0IsRUFDQStMLEdBRUEsTUFBTTJXLEVBQWtCNWlCLEVBQUtxQixRQUFRbkIsRUFBUyxnQkFDOUMsSUFDRSxNQUFNOFcsRUFBeUJsWCxFQUFHMEIsV0FBV29oQixHQUM3QyxJQUFJM1osRUFBNEMsQ0FBQSxFQUM1Q0MsRUFBa0QsQ0FBQSxFQUNsREYsRUFBMkIsQ0FBQSxFQUMzQjRqQixHQUFhLEVBQ2pCLEdBQUk1VixFQUF3QixDQUMxQixNQUFNNlYsRUFBa0Ivc0IsRUFBRytZLGFBQWErSixFQUFpQixRQUN6RDVaLEVBQWN5UCxLQUFLQyxNQUFNbVUsR0FDekI1akIsRUFBZUQsRUFBWUMsY0FBZ0IsQ0FBQSxFQUMzQ0MsRUFBa0JGLEVBQVlFLGlCQUFtQixDQUFBLEVBQ2pEMGpCLEVBQWtDLFdBQXJCNWpCLEVBQVk4akIsSUFDM0IsQ0FFQSxJQUFJQyxFQUE0QixHQUM1QkMsRUFBMkIsR0FDL0IsSUFDRSxNQUFNQyxFQUFvQmp0QixFQUFLcUIsUUFBUW5CLEVBQVMsbUJBQzFDMFcsRUFBTzZCLEtBQUtDLFlBQVl3VSxFQUFJM3NCLFNBQVMwc0IsRUFBbUIsU0FNOURGLEVBQWtCblcsR0FBTW5NLFVBQVksR0FDcEN1aUIsRUFBaUJwVyxHQUFNK08sU0FBU3dILFFBQVUsRUFDNUMsQ0FBRSxNQUNBLENBR0YsTUFBTWhsQixFQUMyQyxhQUEvQ25JLEVBQUtpTixTQUFTak4sRUFBS3FCLFFBQVFuQixFQUFTLFNBQ25DSixFQUFHMEIsV0FBV3hCLEVBQUtxQixRQUFRbkIsRUFBUyxLQUFNLEtBQU0saUJBRW5ELElBQUlrdEIsRUFDQWpsQixJQUNGaWxCLFFBbUpON3RCLGVBQTZCVyxFQUFpQjhJLEdBQzVDLE1BQU1xa0IsRUFBTUMsRUFBVXB0QixHQUVoQnF0QixTQURnQkYsRUFBSUcsWUFBVyxJQUNkbHNCLEtBQU1tc0IsR0FBaUIsV0FBWEEsRUFBRTF1QixNQUMvQjJ1QixFQUFZSCxHQUFRSSxLQUFLaFgsT0FBUzRXLEdBQVFJLEtBQUs3akIsS0FDckQsR0FBeUIsaUJBQWQ0akIsRUFBd0IsQ0FDakMsTUFBTTlXLFFBQWFnWCxHQUFnQkYsR0FDbkMsR0FBSTlXLEVBQU0sT0FBT0EsQ0FDbkIsQ0FFQSxNQUFNOVQsRUFBd0MsaUJBQTNCa0csRUFBWW9ELFdBQTBCcEQsRUFBWW9ELFdBQWFwRCxFQUFZb0QsWUFBWXRKLElBQzFHLEdBQUlBLEVBQUssQ0FDUCxNQUFNOFQsUUFBYWdYLEdBQWdCOXFCLEdBQ25DLEdBQUk4VCxHQUF5QixjQUFqQkEsRUFBS2lYLFFBQXlCLE9BQU9qWCxDQUNuRCxDQUNGLENBbEt1QmtYLENBQWM1dEIsRUFBUzhJLElBRzFDLElBQUlvTixFQUFlLEdBQ25CLElBRUVBLFVBRHNCOFcsRUFBSTNzQixTQUFTUCxFQUFLcUIsUUFBUW5CLEVBQVMsa0JBQW1CLFNBQ3BEYSxNQUMxQixDQUFFLE1BQ0EsQ0FFRixJQUFLLE1BQU8yVyxFQUFRM1ksSUFBUyxDQUMzQixDQUFDLE9BQVEsUUFDVCxDQUFDLE9BQVEsVUFDVCxDQUFDLFNBQVUsV0FFWCxJQUNFLE1BQU1ndkIsUUFBMkJiLEVBQUkzc0IsU0FBU1AsRUFBS3FCLFFBQVFuQixFQUFTLElBQUl3WCxhQUFtQixRQUN2RnRCLElBQ0ZBLEdBQWdCLE1BRWxCQSxHQUFnQixHQUFHclgsS0FBUWd2QixFQUFtQmh0QixRQUNoRCxDQUFFLE1BQ0EsQ0FJSixJQUFJbkIsRUFBYSxHQUNqQixJQUNFQSxRQUFtQnN0QixFQUFJM3NCLFNBQVNQLEVBQUtxQixRQUFRbkIsRUFBUyxjQUFlLE9BQ3ZFLENBQUUsTUFDQSxDQUlGLE1BQU04dEIsRUFBZWh1QixFQUFLcUIsUUFBUW5CLEVBQVMsYUFDM0MsSUFBSXFSLEVBQ0osSUFDRSxNQUFNMGMsUUFBcUJmLEVBQUkzc0IsU0FBU3l0QixFQUFjLFFBQ3REemMsRUFBVzhhLEdBQWUzVCxNQUFNRCxLQUFLQyxNQUFNdVYsR0FDN0MsQ0FBRSxNQUNBLENBR0YsTUFBTTdoQixFQUFhZ2hCLEdBQVVjLFVBQVksVUFBVWQsRUFBU2MsaUJBQXdCOW9CLEVBQzlFM0YsRUFBd0IsQ0FDNUJTLFVBQ0FOLGFBQ0F1SSxTQUNBa0YsY0FBb0MsSUFBdEIrZixHQUFVaE4sUUFDeEJsQix3QkFBeUJsVyxFQUFZOFksTUFDckMxVixXQUFZZ2hCLEdBQVVjLFVBQVksVUFBVWQsRUFBU2MsaUJBQXdCOW9CLEVBQzdFb04sa0JBQW1CMmIsUUFDakIvaEIsR0FBWWdDLFdBQVcsd0JBQTBCaEMsR0FBWWdDLFdBQVcsMkJBRTFFWixNQUFPdkIsR0FBWXVCLE9BQVMxTixFQUFHMEIsV0FBV3hCLEVBQUtDLEtBQUtDLEVBQVMsZ0JBQzdEZ29CLGFBQWMwRSxFQUNkMU0scUJBQXNCMEMsRUFBZ0JoaEIsU0FBUyxHQUFHNUIsRUFBS291QiwwQkFDdkRobUIsMkJBQTRCaW1CLEdBQVksMkJBQTRCbnVCLEdBQ3BFUix3QkFBeUJFLEdBQWNFLEVBQUcwQixXQUFXeEIsRUFBS3FCLFFBQVFuQixFQUFTLHVCQUMzRTZiLG1CQUFvQmpjLEVBQUcwQixXQUFXeEIsRUFBS3FCLFFBQVFuQixFQUFTLFlBQ3hEOGIsaUJBQWtCbGMsRUFBRzBCLFdBQVd4QixFQUFLcUIsUUFBUW5CLEVBQVMsV0FDdEQ4Vyx1QkFBd0JsWCxFQUFHMEIsV0FBV3hCLEVBQUtxQixRQUFRbkIsRUFBUyxpQkFDNUR1VyxzQkFBdUIzVyxFQUFHMEIsV0FBV3hCLEVBQUtxQixRQUFRbkIsRUFBUyxnQkFDM0QrYixrQkFBbUJuYyxFQUFHMEIsV0FBV3hCLEVBQUtxQixRQUFRbkIsRUFBUyxZQUN2RGdjLHVCQUF3QnBjLEVBQUcwQixXQUFXeEIsRUFBS3FCLFFBQVFuQixFQUFTLGlCQUM1RGljLHdCQUF5QnJjLEVBQUcwQixXQUFXeEIsRUFBS3FCLFFBQVFuQixFQUFTLGtCQUM3RG91Qiw4QkFBK0J4dUIsRUFBRzBCLFdBQVd4QixFQUFLcUIsUUFBUW5CLEVBQVMsVUFBVyxrQkFDOUUyZixzQkFBdUJ3TyxHQUFZLCtDQUFnRG51QixHQUNuRjZmLHNCQUF1QnNPLEdBQVksK0NBQWdEbnVCLEdBQ25Gd2Qsb0JBQXFCMlEsR0FBWSw4QkFBK0JudUIsR0FDaEU0ZixnQ0FBaUN1TyxHQUFZLDJEQUE0RG51QixHQUN6RzhmLGdDQUFpQ3FPLEdBQVksMkRBQTREbnVCLEdBQ3pHK25CLDhCQUErQm9HLEdBQVksMENBQTJDbnVCLEdBQ3RGdVMsZUFBZ0J6SixFQUFZMEUsVUFBVSxjQUN0Q2QsVUFBVyxDQUNUd1AsUUFBU25ULEVBQWFtVCxNQUN0QnJGLFdBQVk3TixFQUFnQixrQkFDNUJxSixZQUFhckosRUFBZ0IsZUFDN0J1VCxXQUFZN2MsRUFBV2dDLFNBQVMseUJBQ2hDOFEsUUFBU3pKLEVBQWF5SixNQUN0QkMsT0FBUTFKLEVBQWEwSixLQUNyQjJKLGlCQUNJclQsRUFBYSx1QkFBeUJDLEVBQWdCLHVCQUF5QkEsRUFBZ0JvVyxXQUNuR2pELFNBQVVwVCxFQUFhLHFCQUF1QkMsRUFBZ0JtVCxPQUM5RGdHLFVBQVduWixFQUFnQm1aLFFBQzNCOUYsY0FBZXRULEVBQWEsZ0JBQzVCNEQsbUJBQ0UzRCxFQUFnQixxQkFDaEI2akIsRUFBZ0JobkIsT0FBUyxHQUN6QmluQixFQUFlam5CLE9BQVMsR0FFMUJ5VyxZQUFhdFQsRUFBZ0Isb0JBQzdCMFcsS0FBTTNXLEVBQWEsc0JBQXdCQyxFQUFnQixvQkFFN0RvQyxRQUFTLENBQ1BiLFNBQVVzaUIsRUFDVndCLE9BQVF2QixFQUFlcHJCLFNBQVMsNEJBQ2hDNHNCLElBQUt4QixFQUFlcHJCLFNBQVMsMEJBRS9Cd1UsZUFDQXBOLGNBQ0F1SSxZQUtGLEdBSEs5UixFQUFPK04sUUFDVi9OLEVBQU9nYixXQTZCYixTQUFnQ2hiLEdBQzlCLEdBQUlBLEVBQU9tTixVQUFVK0YsS0FDbkIsTUFBTyxrQ0FDRixHQUFJbFQsRUFBT3NnQixzQkFDaEIsT0FBT3RnQixFQUFPaWUsb0JBQXNCLHNDQUF3QyxnQ0FFNUUsR0FBSWplLEVBQU9pZSxvQkFDVCxNQUFPLHNDQUNGLEdBQUlqZSxFQUFPb2dCLHNCQUNoQixNQUFPLCtCQUdiLENBekMwQjRPLENBQXVCaHZCLElBRzNDQSxFQUFPc2Msb0JBQ1B0YyxFQUFPdWMsa0JBQ1B2YyxFQUFPdVgsd0JBQ1B2WCxFQUFPZ1gsdUJBQ1BoWCxFQUFPd2MsbUJBQ1B4YyxFQUFPeWMsd0JBQ1B6YyxFQUFPMGMsd0JBRVAsT0FBTzFjLENBRVgsQ0FBRSxNQUNBLENBRUosQ0FFQSxTQUFTNHVCLEdBQVlLLEVBQWlCeHVCLEdBQ3BDLE9BQU84RyxFQUFHMlksU0FBUytPLEVBQVMsQ0FBRXhuQixLQUFLLEVBQU1DLElBQUtqSCxFQUFTa0gsT0FBUVAsSUFBY2QsT0FBUyxDQUN4RixDQXdDQXhHLGVBQWVxdUIsR0FBZ0I3YSxHQUM3QixNQUFPNGIsRUFBSzV2QixHQUFROFQsR0FBV0MsY0FBY0MsR0FDN0MsSUFBSzRiLElBQVE1dkIsRUFBTSxPQUVuQixNQUFNNnZCLEVBQU0sQ0FBRVYsVUFBVyxHQUFHUyxLQUFPNXZCLEtBQ25DLElBRUUsTUFBTTJYLFFBQWlCdEQsS0FBYStELFFBQVEsNEJBQTZCLENBQ3ZFOUQsTUFBT3NiLEVBQ1B2WCxLQUFNclksSUFFUjJILE9BQU9tb0IsT0FBT0QsRUFBS2xZLEVBQVNXLEtBQzlCLENBQUUsTUFDQSxDQUVGLE9BQU91WCxDQUNULENDNVNPLFNBQVNFLEdBQTBDcnZCLEdBQ3hELE9BQU9BLEVBQU95Z0IsdUJBQXVGLElBQS9EemdCLEVBQU91SixhQUFhakssTUFBTXFQLFdBSHJDLDhCQUk3QixDQ3NOQSxTQUFTMmdCLEdBQTZCN3VCLEdBQ3BDLE1BQU04dUIsRUFBbUIsSUFBSXRpQixJQUFJLENBQUMxTSxFQUFLQyxLQUFLQyxFQUFTLGtCQUMvQyt1QixFQUFlam9CLEVBQUcyWSxTQUFTLGtCQUFtQixDQUNsRHhZLElBQUtqSCxFQUNMZ0gsS0FBSyxFQUNMZ29CLGlCQUFpQixFQUNqQkMscUJBQXFCLElBRXZCLElBQUssTUFBTUMsS0FBbUJILEVBQzVCRCxFQUFpQmxpQixJQUFJOU0sRUFBS3FCLFFBQVFuQixFQUFTa3ZCLElBRTdDLElBQUssTUFBTUEsS0FBbUJKLEVBQzVCLElBQ0VsdkIsRUFBR3V2QixPQUFPRCxFQUFpQixDQUFFeHVCLFdBQVcsRUFBTTRMLE9BQU8sR0FDdkQsQ0FBRSxNQUFPck4sR0FDUEYsUUFBUStxQixLQUFLN3FCLEVBQ2YsQ0FFSixPQTdMQUksaUJBQ0UsTUFBTSt2QixRQUFhQyxFQUFNemIsUUFBUXdiLEtBQUszbUIsTUFBTSxJQUN6QzlGLFFBQVEsZUFBZ0IsdURBQXlEMHNCLElBQ2hGQSxFQUFNQyxXQUFXLFFBQVMsQ0FDeEJDLFNBQVUsNkJBQ1ZDLE9BQU8sRUFDUDVDLEtBQU0sU0FDTjZDLFFBQVMsQ0FBQyxTQUdianhCLFFBQVEsQ0FDUHdFLElBQUssQ0FDSG1QLFlBQWEsb0RBQ2J5YSxLQUFNLFVBQ042QyxTQUFTLEVBQ1RDLE1BQU8sS0FFVEMsU0FBVSxDQUNSeGQsWUFBYSwrQkFDYnlhLEtBQU0sVUFDTjZDLFNBQVMsRUFDVEMsTUFBTyxLQUVURSxRQUFTLENBQ1B6ZCxZQUFhLHdDQUNieWEsS0FBTSxVQUNONkMsU0FBUyxFQUNUQyxNQUFPLE9BR1ZsYSxRQWlLTCxXQUNFLElBQUlxYSxFQUFpQi92QixFQUFLVyxRQUFRLElBQUlxdkIsZ0JBQWdCbHRCLEtBQUttdEIsVUFDM0QsTUFBUW53QixFQUFHMEIsV0FBV3hCLEVBQUtDLEtBQUs4dkIsRUFBZ0Isa0JBQzlDQSxFQUFpQi92QixFQUFLVyxRQUFRb3ZCLEdBS2hDLE9BSG9CdFgsS0FBS0MsTUFBTTVZLEVBQUcrWSxhQUFhN1ksRUFBS0MsS0FBSzh2QixFQUFnQixnQkFBaUIsU0FHdkVyYSxPQUNyQixDQTFLYXdhLElBQ1JoSixTQUFTb0ksS0FDWjV3QixFQUFRQyxVQUFZMndCLEVBQUtRLFFBQ3pCcHhCLEVBQVFFLGtCQUFvQjB3QixFQUFLcHNCLElBRWpDLElBQUssTUFBTWl0QixLQUFlYixFQUFLYyxNQUFtQixDQUVoRHR3QixFQUFHdXZCLE9BQU9ydkIsRUFBS0MsS0FBS2t3QixFQUFhLFlBQWEsQ0FBRTNqQixPQUFPLElBQ3ZEMU0sRUFBR3V2QixPQUFPcnZCLEVBQUtDLEtBQUtrd0IsRUFBYSxhQUFjLENBQUUzakIsT0FBTyxJQUN4RHVpQixHQUE2Qm9CLEdBRTdCLE1BQU1FLEVBQWtCcndCLEVBQUtDLEtBQUtrd0IsRUFBYSxZQUV6Q0csU0FEaUJDLEVBQWlCLElBQU16d0IsRUFBR1EsU0FBU2lJLFFBQVE4bkIsRUFBaUIsQ0FBRTduQixlQUFlLE1BQWEsSUFDckZtRSxPQUFRNmpCLEdBQU1BLEVBQUVwbkIsZUFBZWpJLElBQUtxdkIsR0FBTXh3QixFQUFLQyxLQUFLb3dCLEVBQWlCRyxFQUFFenhCLGFBRTdGd0ksRUFBc0MsQ0FBQzRvQixLQUFnQkcsSUFFN0QsTUFBTXJrQixRQUFtQjBnQixHQUFpQndELEdBRTFDLElBQUtsa0IsRUFBWSxDQUNmaE4sUUFBUUUsTUFBTSxxQ0FBcUNneEIsS0FDbkQsUUFDRixDQUNBLE1BQU1NLEVBQXNCamdCLEVBQVN2RSxHQUsvQnlrQixTQUhrQ2pwQixRQUFRNUMsSUFDOUN5ckIsRUFBWW52QixJQUFLd3ZCLEdBQWVoRSxHQUFpQmdFLEVBQVkxa0IsTUFFWFUsT0FBUWxOLEtBQWFBLEdBQ25FbXhCLEVBQW9CLENBQUMza0IsS0FBZXlrQixHQUUxQyxHQUFJaHlCLEVBQVFDLFVBQ1YsSUFBSyxNQUFNYyxLQUFVbXhCLEVBQ25CM3hCLFFBQVFDLEtBQUtPLFNBS1gwVyxHQUFxQmxLLFNBRXJCd2MsR0FBa0J4YyxHQUNwQkEsRUFBV3VCLGFBQ1BvTCxHQUFtQjNNLEdBRzNCLE1BQU00a0IsR0FDSDFrQixFQUF3QkYsRUFBV0csY0FDbkNILEVBQVdHLFlBQVlnQyxXQUFXLHdCQUNqQ25DLEVBQVdHLFlBQVlnQyxXQUFXLGlDQUNoQzNHLFFBQVE1QyxJQUFJLENBQ2hCckYsRUFBY3lNLEdBQ2RuRixFQUFrQm1GLEdBQ2xCd2tCLEVBQW9CSyxLQUFLLElBQU03TCxHQUFlaFosSUFDOUN3RixHQUEwQnhGLEVBQVkya0IsR0FDdEM5VyxHQUFxQjdOLEdBQ3JCc08sR0FBcUJ0TyxHQUNyQmtQLEdBQXFCbFAsR0FDckJ3UCxHQUFxQnhQLEdBQ3JCeVAsR0FBc0J6UCxHQUN0QmtnQixHQUF3QmxnQixHQUN4QjRYLEdBQXFCNVgsR0FDckJzYSxHQUFxQnRhLEdBQ3JCeVosR0FBa0J6WixNQUNkNGtCLEVBQXFCLENBQUM3a0IsRUFBa0JDLElBQWUsR0FDM0Q0ZCxHQUFZNWQsR0FDWmtlLEdBQWFsZSxHQUNic2YsR0FBb0J0ZixHQUNwQkEsRUFBV3VCLE1BQ1BtVixHQUFtQzFXLEdBQVk2a0IsS0FBSyxJQUFNL00sR0FBb0M5WCxJQUM5RjBXLEdBQW1DMVcsR0FDdkNtWSxHQUFxQm5ZLFdBRWpCakwsRUFBWW1RLGFBRWxCLE1BQU03USxFQUE0QixHQUNsQyxJQUFLLE1BQU1iLEtBQVVteEIsRUFDZjlCLEdBQTBDcnZCLE1BRzFDQSxFQUFPc2dCLHVCQUF5QnRnQixFQUFPdWdCLGtDQUN6QzFmLEVBQVN3SixLQUFLL0IsRUFBbUJ0SSxFQUFRQSxFQUFPMEksT0FBU3lvQixFQUFvQixDQUFDbnhCLEtBRTVFQSxFQUFPbU4sVUFBVTBQLGdCQUNuQmhjLEVBQVN3SixLQUFLMUcsRUFBb0IzRCxJQUVoQ0EsRUFBT21OLFVBQVUrRixNQUNuQnJTLEVBQVN3SixLQUFLNUksRUFBa0J6QixVQUU1Qm1jLEdBQWtCbmMsRUFBUXdNLFNBQzFCakwsRUFBWW1RLGNBQ2IxUixFQUFPMEksUUFBVzFJLEVBQU91WCxnQ0FHeEIwTixHQUF1QmpsQixTQUN2QnNlLEdBQW9CdGUsRUFBUXdNLEVBQVlxakIsRUFBS08sVUFFbkR2dkIsRUFBU3dKLEtBQUtzYSxHQUFxQjNrQixJQUMvQkEsRUFBTzZ1QiwrQkFBaUM3dUIsRUFBT3VYLHdCQUNqRDFXLEVBQVN3SixLQUFLd2UsR0FBdUI3b0IsS0FFbkNBLEVBQU9zZ0IsdUJBQXlCdGdCLEVBQU91Z0Isa0NBQ3pDMWYsRUFBU3dKLEtBQUtrZSxHQUFpQnZvQixLQUcvQkEsRUFBT29nQix1QkFDUHBnQixFQUFPcWdCLGlDQUNQcmdCLEVBQU9zZ0IsdUJBQ1B0Z0IsRUFBT3VnQixtQ0FFSC9ULEVBQVd1QixPQUNibE4sRUFBU3dKLEtBQUt1TyxHQUFtQjVZLElBRTlCd00sRUFBV2lVLHNCQUNkNWYsRUFBU3dKLEtBQUswUSxHQUFpQi9hLEtBRy9CQSxFQUFPbU4sVUFBVXlWLFNBQ25CL2hCLEVBQVN3SixLQUFLa2IsR0FBMEJ2bEIsWUFHdENnSSxRQUFRNUMsSUFBSXZFLFNBQ1pVLEVBQVltUSxhQUVsQixNQUFNNUQsRUFBaUJ0QixFQUFXdUIsTUFBUSxNQUFRLE9BRTlDdkIsRUFBV3VCLE9BQ2IxTixFQUFHdXZCLE9BQU9ydkIsRUFBS0MsS0FBS2t3QixFQUFhLFlBQWEsQ0FBRTNqQixPQUFPLElBQ3ZEMEgsR0FBVTNHLEVBQWdCLENBQUMsVUFBVzRpQixLQUV0Q3J3QixFQUFHdXZCLE9BQU9ydkIsRUFBS0MsS0FBS2t3QixFQUFhLGFBQWMsQ0FBRTNqQixPQUFPLElBQ3hEMEgsR0FBVTNHLEVBQWdCLENBQUMsVUFBVyxrQkFBbUI0aUIsSUFFM0RqYyxHQUFVM0csRUFBZ0IsQ0FBQyxXQUFZNGlCLEdBR2xDbGtCLEVBQVd1QixPQUNkMEcsR0FBVTNHLEVBQWdCLENBQUMsVUFBVyxrQkFBbUI0aUIsRUFFN0QsQ0FDRixDQWlDTTNQIn0=
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}),F=e=>({kind:"object",value:e}),C={forbidOnly:$("!!process.env.CI"),retries:$("process.env.PWDEBUG ? 0 : process.env.CI ? 5 : 1"),timeout:$("120_000"),use:F({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:F({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([C,a,C]),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?F(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={name:"autofix.ci",on:{pull_request:null,push:{branches:["main"]}},permissions:{contents:"read"},concurrency:{group:"autofix-${{ github.head_ref }}","cancel-in-progress":!0},jobs:{autofix:{"runs-on":"ubuntu-latest"}}},z={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"}}},U={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"}}},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 M(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(q(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("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(()=>H(n,i,s))}for(const n of s)await S.run(()=>e.promises.rm(t.join(i,n),{force:!0,recursive:!0}))})}function q(e){return e?.endsWith("/reusable-workflows")??!1}async function H(n,s,i){const o=t.join(s,`${i}.yml`);if("autofix"===i)return void await K(function(e){if(!e.isPublicRepo)return u(z);const t=e.isBun?"bun":"yarn",n=[{uses:"actions/checkout@v6"},{uses:"actions/setup-node@v6",with:{"check-latest":!0}},...e.isBun?[{uses:"oven-sh/setup-bun@v1",with:{"bun-version":"latest"}}]:[],{run:`${t} install`},{run:`${t} run cleanup`}];e.packageJson?.scripts?.build&&n.push({run:`${t} run build`});n.push({uses:"autofix-ci/action@v1"});const s=u(G),i=s.jobs.autofix??{"runs-on":"ubuntu-latest"};return s.jobs.autofix={...i,steps:n},s}(n),o);let r=u(i in U?U[i]:{});if(!("jobs"in r))return;try{const t=await e.promises.readFile(o,"utf8"),n=d.load(t);r=l.all([r,n,r],{arrayMerge:N})}catch{}i.startsWith("deploy")&&(r={...r,concurrency:{group:"${{ github.workflow }}","cancel-in-progress":!1}},function(e,t){const n=e[t];delete e[t],e[t]=n}(r,"jobs"),r.on?.push&&(r.on.push["paths-ignore"]=[...new Set(["**.md","**/docs/**",...r.on.push["paths-ignore"]??[]])]));let a=!1;for(const e of Object.values(r.jobs))e.uses?.includes("/reusable-workflows/")&&(Y(n,e,i),a=!0);if(a){switch(i){case"release":if(r.on?.schedule)delete r.on.push;else{if(!(r.on?.push&&n.release.branches.length>0))return void await e.promises.rm(t.join(s,"release.yml"),{force:!0});r.on.push.branches=n.release.branches}break;case"test":r.on?.pull_request&&delete r.on.pull_request["paths-ignore"],r.on?.push&&(delete r.on.push["paths-ignore"],r.on.push.branches=r.on.push.branches.filter(e=>"renovate/**"!==e))}if(function(e){delete e.jobs["add-to-project"]}(r),await K(r,o),"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}),!r.jobs.sync?.with)return;r.jobs["sync-force"]=r.jobs.sync;const n=r.jobs.sync.with.sync_params_without_dest;if("string"!=typeof n)return;r.jobs.sync.with.sync_params_without_dest=`--force ${n}`,r.name="Force to Sync",r.on={workflow_dispatch:null},delete r.jobs.sync,await K(r,t.join(s,"sync-force.yml"))}}}function Y(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 K(t,n){const s=d.dump(t,{lineWidth:-1,noCompatMode:!0,styles:{"!!null":"empty"}});await e.promises.writeFile(n,s)}async function V(n){return x.functionIgnoringException("fixTypos",async()=>{if(q(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=X(t);s=Z(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=Q(r);a=Z(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=X(r);a=Z(a,n,"text"),r!==a&&await j.generateFile(o,a)}await S.promiseAll()})}function X(e){return e.replaceAll(/\bc\.f\.([^$])/g,"cf.$1").replaceAll(/\beg\.([^$])/g,"e.g.$1").replaceAll(/\bie\.([^$])/g,"i.e.$1")}function Q(e){return e.replaceAll(/\/\/(.*)c\.f\./g,"//$1cf.").replaceAll(/\/\/(.*)eg\./g,"//$1e.g.").replaceAll(/\/\/(.*)ie\./g,"//$1i.e.")}function Z(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 ee(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=te(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=te(e,t,"Cursor",n);return`${s}\n\n${i}`}(e,n,i);await S.run(()=>j.generateFile(o,r))})}function te(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 ne=new class{getOrgAndName(e){const t=e.split(":").at(-1),n=t?.split("/");return[n?.at(-2)??"",n?.at(-1)?.replace(/.git$/,"")??""]}},se=new Map;function ie(e){const t=e??"",n=se.get(t);if(n)return n;const s=new m({auth:re(e)||void 0});return se.set(t,s),s}function oe(e){return!!re(e)}function re(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 ae(e,t,n,s=0){do{const[s,i,o]=le(e,t,n);if(0===f.spawnSync(s,i,o).status)break}while(--s>=0)}function ce(e,t,n){const[s,i,o]=le(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 le(t,n,s){const i={...process.env};i.PATH&&i.BERRY_BIN_FOLDER&&(i.PATH=i.PATH.replace(`${i.BERRY_BIN_FOLDER}:`,""));const o=i.ASDF_DIR??`${g.homedir()}/.asdf`;if(o&&e.existsSync(o)){const e=[`${o}/shims`,`${o}/bin`],t=i.PATH?i.PATH.split(":"):[];i.PATH=[...e,...t.filter(t=>!e.includes(t))].join(":"),i.ASDF_DIR??=o,i.ASDF_NODEJS_VERSION??="system"}return i.ASDF_DIR&&(n=["-l","-c",`${t} ${n.join(" ")}`],t="bash"),[t,n,{cwd:s,env:i,shell:!1,stdio:"inherit"}]}function pe(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 de="3.9.19",ue="zulu-11.74.15";async function me(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`${fe.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&&he(i,"poetry",n),he(i,"python",de,!0)}n.depending.firebase&&he(i,"java",ue,!0);if(n.doesContainPackageJson)if(n.isBun){const e=await async function(e,t){try{const n=(await ie().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&&he(i,"bun",e)}else{const e=ce("npm",["show","yarn","version"],n.dirPath);he(i,"yarn",e)}for(const s of ge){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(),ae("asdf",["plugin","update","--all"],n.dirPath),ae("asdf",["install"],n.dirPath)}(n)})}const fe=new Set(["java","nodejs","bun","python"]),ge=["java","node","python"];function he(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+/);pe(n)>pe(t??"")&&(e[i]=o)}}async function ye(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))})}const we='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 "next",\n "react",\n "react-dom"\n]\n\n[run]\nbun = true\n',be=we.replace("exact = true","exact = false");async function ve(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")?be:we;await S.run(()=>j.generateFile(s,i))})}const ke="# Project-specific settings",xe=/# Project-specific settings[^\n]*\n/gm,_e="# Generated by wbfy",je=`${ke} (head)\n\n\n${_e}\n`,Se=`\n${ke} (tail)\n`,Pe={separator:_e,separatorPrefix:"# Generated by ",defaultHeadUserContent:je,defaultTailUserContent:Se,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(xe,"").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(xe,`${ke} (head)\n`):je},getTailUserContent(e){const t=$e(e);return t>0?e.slice(t-1):Se},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(ke),n=e.lastIndexOf(ke);return n>t?n:-1}async function Fe(n){return x.functionIgnoringException("generateDockerignore",async()=>{const s=t.resolve(n.dirPath,".dockerignore");if(n.doesContainDockerfile){const e=await j.readFileIgnoringError(s)??"",t=Pe.getHeadUserContent(e)+"\n**/.idea\n**/*.sqlite3*\n**/.yarn/install-state.gz\n**/.venv\n"+Pe.getTailUserContent(e);await S.run(()=>j.generateFile(s,t))}else await e.promises.rm(s,{force:!0})})}const Ce={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()},Ee=`root = true\n\n[*]\ncharset = utf-8\nend_of_line = lf\ninsert_final_newline = true\ntrim_trailing_whitespace = true\n\n${Oe(Ce.codeWith2IndentSize)}\nindent_size = 2\nindent_style = space\n\n${Oe(Ce.codeWith4IndentSize)}\nindent_size = 4\nindent_style = space\n\n${Oe(Ce.markdownLike)}\nmax_line_length = off\ntrim_trailing_whitespace = false\n\n[{Makefile,*.mk}]\nindent_style = tab\n`;async function Be(e){return x.functionIgnoringException("generateEditorconfig",async()=>{const n=t.resolve(e.dirPath,".editorconfig");await S.run(()=>j.generateFile(n,Ee))})}function Oe(e){return e.length>1?`[*.{${e.join(",")}}]`:`[*.${e[0]}]`}async function Ie(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 Ae={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 Te(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(Ae);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 De(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 Re=`* text=auto\n\n*.lockb binary diff=lockb\n*.vcproj text eol=crlf\n\n${[...Ce.codeWith2IndentSize,...Ce.codeWith4IndentSize,...Ce.markdownLike].map(e=>`*.${e} text eol=lf`).join("\n")}\n\ndist/** linguist-generated=true\n`;async function We(e){return x.functionIgnoringException("generateGitattributes",async()=>{const n=t.resolve(e.dirPath,".gitattributes");await S.run(()=>j.generateFile(n,Re))})}const Le=["windows","macos","linux","jetbrains","visualstudiocode","emacs","vim","yarn"];async function Ne(e,n){return x.functionIgnoringException("generateGitignore",async()=>{const s=t.resolve(e.dirPath,".gitignore"),i=await j.readFileIgnoringError(s)??"";let o=Pe.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=Pe.getTailUserContent(i),a=[...Le];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 ze(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(()=>Ge(e,t)),k.isVerbose&&console.info(`Fetched ${n}`)}c&&(c+="\n"),c+=t+"\n"}await Pe.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 Je=t.join(g.homedir(),".cache","wbfy","gitignore");async function Ge(n,s){await e.promises.mkdir(Je,{recursive:!0}),await e.promises.writeFile(t.join(Je,n),s)}async function ze(n){try{const s=await e.promises.stat(t.join(Je,n));if(Date.now()-s.mtimeMs>216e5)return;return await e.promises.readFile(t.join(Je,n),"utf8")}catch{}}function Ue(e,t){try{const n=`git@github.com:${e}/${t}.git`,s=ce("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 Me={getLintFixSuffix:e=>e.doesContainJsxOrTsx?' --rule "{ react-hooks/exhaustive-deps: 0 }"':""},qe=["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"],He=[...qe,"typescript-eslint","eslint-import-resolver-typescript"],Ye=["eslint-plugin-react","eslint-plugin-react-hooks","eslint-plugin-react-compiler"],Ke={"@willbooster/eslint-config-js":["@willbooster/eslint-config-js",...qe],"@willbooster/eslint-config-js-react":["@willbooster/eslint-config-js-react",...qe,...Ye],"@willbooster/eslint-config-ts":["@willbooster/eslint-config-ts",...He],"@willbooster/eslint-config-ts-react":["@willbooster/eslint-config-ts-react",...He,...Ye],"@willbooster/eslint-config-next":["@willbooster/eslint-config-next","eslint-config-next",...He,...Ye]};async function Ve(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,Xe(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(Pe.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(...Ke[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]=ne.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"]??"")+Me.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")&&!Qe(e,"@willbooster/auth")){delete e.devDependencies["@willbooster/auth"];const t=await Ue("WillBoosterLab","auth");e.dependencies["@willbooster/auth"]=`git@github.com:WillBoosterLab/auth.git#${t}`}if(t.has("@discord-bot/shared")&&!Qe(e,"@discord-bot/shared")){delete e.devDependencies["@discord-bot/shared"];const t=await Ue("WillBoosterLab","discord-bot");e.dependencies["@discord-bot/shared"]=`git@github.com:WillBoosterLab/discord-bot.git#${t}`}if(t.has("@willbooster/code-analyzer")&&!Qe(e,"@willbooster/code-analyzer")){delete e.dependencies["@willbooster/code-analyzer"];const t=await Ue("WillBoosterLab","code-analyzer");e.devDependencies["@willbooster/code-analyzer"]=`git@github.com:WillBoosterLab/code-analyzer.git#${t}`}if(t.has("@willbooster/judge")&&!Qe(e,"@willbooster/judge")){delete e.devDependencies["@willbooster/judge"];const t=await Ue("WillBoosterLab","judge");e.dependencies["@willbooster/judge"]=`git@github.com:WillBoosterLab/judge.git#${t}`}if(t.has("@willbooster/llm-proxy")&&!Qe(e,"@willbooster/llm-proxy")){delete e.devDependencies["@willbooster/llm-proxy"];const t=await Ue("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?(ae(p,["remove",...new Set(d)],n.dirPath),ae(p,["add","--exact",...new Set(d)],n.dirPath)):ae(p,["add",...new Set(d)],n.dirPath)),u=u.filter(e=>!c.dependencies?.[e]),u.length>0&&(n.isBun?(ae(p,["remove",...new Set(u)],n.dirPath),ae(p,["add","-D","--exact",...new Set(u)],n.dirPath)):ae(p,["add","-D",...new Set(u)],n.dirPath)),m.length>0&&ae("poetry",["add","--group","dev",...new Set(m)],n.dirPath))}(n,s,i)})}function Xe(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 "**/{.*/,}*.{${Ce.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 "**/{.*/,}*.{${Ce.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 Qe(e,t){return(e.devDependencies?.[t]||e.dependencies?.[t]||"").includes("workspace")}const Ze={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 et(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 ae("git",["config","--unset","core.hooksPath"],n.dirPath);ae("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,Ze.preCommit+"\n"));const{typecheck:c}=Xe(n,{});if(c){let s=n.repository?.startsWith("github:WillBoosterLab/")?n.repository.toLocaleLowerCase().includes("exercode")?Ze.prePushForLab:Ze.prePushForLabExceptAdmin:Ze.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=`${Ze.postMerge}\n\n${tt(n).join("\n")}\n`;await S.run(()=>e.promises.writeFile(t.resolve(r,"post-merge"),l,{mode:493}))}(n)})}function tt(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 nt(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 st=`<?xml version="1.0" encoding="UTF-8"?>\n<project version="4">\n <component name="ProjectTasksOptions">\n${Ce.prettier.map(e=>nt("node","node_modules/.bin/prettier --cache --write","Prettier",e)).join("")}\n </component>\n</project>\n`,it=`<?xml version="1.0" encoding="UTF-8"?>\n<project version="4">\n <component name="ProjectTasksOptions">\n${Ce.prettier.map(e=>nt("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 ot(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?it:st)):S.run(()=>e.promises.rm(i,{force:!0})))}})}const rt={"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"}}}},at={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 ct(n){return x.functionIgnoringException("generateLefthookUpdatingPackageJson",async()=>{await async function(n){const s=t.resolve(n.dirPath,".lefthook"),{typecheck:i}=Xe(n,{}),o={...rt};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/")?at.prePushForLab:at.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=`${at.postMerge}\n\n${tt(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 lt={node:["src","test","scripts"].toSorted(),blitz:["src","test","scripts","db","integrations","mailers"].toSorted()};async function pt(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 '${dt(n)}': [${JSON.stringify(`${i}eslint --fix${Me.getLintFixSuffix(n)}`)}, '${i}prettier --cache --write'],`;o.push(e)}const r=n.isRoot?" && !file.includes('/packages/')":"";o.push(`\n './**/*.{${Ce.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, '${dt(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 dt(e){const t=function(e){return e.depending.blitz?lt.blitz:lt.node}(e).map(e=>`${e}/**/`);return`{,${t.join(",")}}*.{${Ce.eslint.join(",")}}`}async function ut(e){return x.functionIgnoringException("generatePrettierignore",async()=>{const n=t.resolve(e.dirPath,".prettierignore"),s=await j.readFileIgnoringError(n)??"",i=Pe.getHeadUserContent(s),o=Pe.getTailUserContent(s),r=t.resolve(e.dirPath,".gitignore"),a=await Pe.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 mt={venvPath:".",venv:".venv"};async function ft(n){return x.functionIgnoringException("generatePyrightConfigJson",async()=>{let s=u(mt);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 gt(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=ht(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=ht(i,a))}await S.run(()=>j.generateFile(s,i))})}function ht(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 yt(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 wt={$schema:"https://docs.renovatebot.com/renovate-schema.json",extends:["github>WillBooster/willbooster-configs:renovate.json5"]};async function bt(n){return x.functionIgnoringException("generateRenovateJson",async()=>{let s=u(wt);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 vt={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/**/*"]},kt={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 xt(n){return x.functionIgnoringException("generateTsconfig",async()=>{if(n.depending.blitz||n.depending.next)return;let s=u(n.isRoot?vt:kt);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 _t=["**/.git/objects/**","**/.git/subtree-cache/**","**/node_modules/**","**/tmp/**","**/temp/**","**/dist/**"];async function jt(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 _t)o=l.all([o,St(e)]);n.doesContainPoetryLock&&(o=l.all([o,St("**/.venv/**")])),n.depending.next&&(o=l.all([o,St("**/.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 St(e){return{"files.watcherExclude":{[e]:!0}}}async function Pt(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=ce("yarn",["--version"],n.dirPath),o=function(e,t){const n=ce("npm",["show",e,"versions","--json"],t);return JSON.parse(n).at(-1)}("@yarnpkg/cli",n.dirPath);$t(i)<=$t(o)&&i!==o&&ae("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","next","react","react-dom"],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})),ae("yarn",["dlx","yarn-plugin-auto-install"],n.dirPath)})}function $t(e){const[t]=e.split(".");return Number(t)}async function Ft(e){return x.functionIgnoringException("setupLabels",async()=>{const[t,n]=ne.getOrgAndName(e.repository??"");if(!t||!n)return;if("WillBooster"!==t&&"WillBoosterLab"!==t)return;if(!oe(t))return;const s=ie(t);try{await Ct(s,t,n,"d1: x-easy :hedgehog:","EDE9FE"),await Ct(s,t,n,"d2: easy :rabbit2:","DDD6FE"),await Ct(s,t,n,"d3: medium :ox:","C4B5FD"),await Ct(s,t,n,"d4: hard :squid:","A78BFA"),await Ct(s,t,n,"d5: x-hard :whale2:","8B5CF6"),await Ct(s,t,n,"p1: critical :fire::fire::fire:","EF4444"),await Ct(s,t,n,"p2: urgent :fire::fire:","F87171"),await Ct(s,t,n,"p3: important :fire:","FCA5A5"),await Ct(s,t,n,"p4: nice to have :droplet:","FECACA"),await Ct(s,t,n,"r: blitz","5300bc"),await Ct(s,t,n,"r: firebase","ffca28"),await Ct(s,t,n,"r: prisma","0c344b"),await Ct(s,t,n,"r: react","61dafb"),await Ct(s,t,n,"r: svelte","ff3e00"),await Ct(s,t,n,"r: semantic-release","494949"),await Ct(s,t,n,"ready :rocket:","22C55E"),await Ct(s,t,n,"review requested :mag:","FBCA04"),await Ct(s,t,n,"released :bookmark:","6366F1"),await Ct(s,t,n,"s: 0.5h :clock1230:","F3F4F6"),await Ct(s,t,n,"s: 1h :clock1:","E5E7EB"),await Ct(s,t,n,"s: 2h :clock2:","D1D5DB"),await Ct(s,t,n,"s: 3h :clock3:","9CA3AF"),await Ct(s,t,n,"s: 5h :clock5:","6B7280"),await Ct(s,t,n,"s: 8h :clock8:","4B5563"),await Ct(s,t,n,"s: 13h :clock1:","374151"),await Ct(s,t,n,"t: build :hammer:","BFDBFE"),await Ct(s,t,n,"t: chore :broom:","BFDBFE"),await Ct(s,t,n,"t: ci :construction_worker:","BFDBFE"),await Ct(s,t,n,"t: docs :memo:","BFDBFE"),await Ct(s,t,n,"t: feat :sparkles:","BFDBFE"),await Ct(s,t,n,"t: fix :bug:","BFDBFE"),await Ct(s,t,n,"t: perf :zap:","BFDBFE"),await Ct(s,t,n,"t: refactor :recycle:","BFDBFE"),await Ct(s,t,n,"t: style :lipstick:","BFDBFE"),await Ct(s,t,n,"t: test :test_tube:","BFDBFE"),await Ct(s,t,n,"project","24292F"),await Ct(s,t,n,"focused :dart:","22C55E"),await Ct(s,t,n,"gen-pr-all :robot:","00B4D8"),await Ct(s,t,n,"gen-pr-claude :robot:","00B4D8"),await Ct(s,t,n,"gen-pr-codex :robot:","00B4D8"),await Ct(s,t,n,"gen-pr-gemini :robot:","00B4D8"),await Et(s,t,n,"bug"),await Et(s,t,n,"documentation"),await Et(s,t,n,"duplicate"),await Et(s,t,n,"enhancement"),await Et(s,t,n,"good first issue"),await Et(s,t,n,"help wanted"),await Et(s,t,n,"invalid"),await Et(s,t,n,"question"),await Et(s,t,n,"wontfix"),await Et(s,t,n,"ready"),await Et(s,t,n,"review requested"),await Et(s,t,n,"released"),await Et(s,t,n,"semantic-release"),await Et(s,t,n,"llm-pr :robot:"),await Et(s,t,n,"ai-pr :robot:")}catch(e){console.warn("Skip setupLabels due to:",e?.stack??e)}})}async function Ct(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 Et(e,t,n,s){try{await e.request("DELETE /repos/{owner}/{repo}/labels/{name}",{owner:t,repo:n,name:s})}catch{}}const Bt=["READY_DISCORD_WEBHOOK_URL","GH_BOT_PAT","PUBLIC_GH_BOT_PAT"];async function Ot(e){return x.functionIgnoringException("setupSecrets",async()=>{const[t,n]=ne.getOrgAndName(e.repository??"");if(!t||!n||"WillBoosterLab"!==t)return;if(!oe(t)||!k.doesUploadEnvVars)return;const s=h.config().parsed??{};if(0===Object.keys(s).length)return;const i=ie(t);try{for(const e of Bt)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 It(e){const[t,n]=ne.getOrgAndName(e.repository??"");if(!t||!n)return;if("WillBooster"!==t&&"WillBoosterLab"!==t)return;if(!oe(t))return;const i=ie(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 At={"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 Tt(n){return x.functionIgnoringException("generateGitHubTemplates",async()=>{for(const[s,i]of Object.entries(At)){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 Dt=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 Rt(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 Lt(i);if(e)return e}const o="string"==typeof t.repository?t.repository:t.repository?.url;if(o){const e=await Lt(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=Dt.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:Wt("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:Wt("{app,src,test,scripts}/**/*.{cjs,mjs,js,jsx}",n),doesContainTypeScript:Wt("{app,src,test,scripts}/**/*.{cts,mts,ts,tsx}",n),doesContainJsxOrTsx:Wt("{app,src,test}/**/*.{t,j}sx",n),doesContainJavaScriptInPackages:Wt("packages/**/{app,src,test,scripts}/**/*.{cjs,mjs,js,jsx}",n),doesContainTypeScriptInPackages:Wt("packages/**/{app,src,test,scripts}/**/*.{cts,mts,ts,tsx}",n),doesContainJsxOrTsxInPackages:Wt("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 Wt(e,t){return o.globSync(e,{dot:!0,cwd:t,ignore:T}).length>0}async function Lt(e){const[t,n]=ne.getOrgAndName(e);if(!t||!n)return;const s={full_name:`${t}/${n}`};try{const e=await ie().request("GET /repos/{owner}/{repo}",{owner:t,repo:n});Object.assign(s,e.data)}catch{}return s}function Nt(e){return e.isWillBoosterConfigs&&!0===e.packageJson?.name?.startsWith("@willbooster/eslint-config-")}function Jt(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}),Jt(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 Rt(s);if(!a){console.error(`there is no valid package.json in ${s}`);continue}const c=V(a),l=(await Promise.all(r.map(e=>Rt(e,a)))).filter(e=>!!e),p=[a,...l];if(k.isVerbose)for(const e of p)console.info(e);await me(a),await Pt(a),a.isBun&&await ve(a);const d=!q(a.repository)&&(a.repository?.startsWith("github:WillBooster/")||a.repository?.startsWith("github:WillBoosterLab/"));await Promise.all([_(a),D(a),c.then(()=>gt(a)),ee(a,p),Fe(a),Be(a),Te(a),De(a),We(a),Tt(a),ot(a),bt(a),yt(a),...d?[M(a)]:[],Ft(a),Ot(a),It(a),a.isBun?et(a).then(()=>ct(a)):et(a),pt(a)]),await S.promiseAll();const u=[];for(const e of p)Nt(e)||((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 Ne(e,a),await S.promiseAll(),(e.isRoot||e.doesContainPackageJson)&&(await ut(e),await Ve(e,a,n.skipDeps),u.push(pt(e)),e.doesContainVscodeSettingsJson&&e.doesContainPackageJson&&u.push(jt(e)),(e.doesContainTypeScript||e.doesContainTypeScriptInPackages)&&u.push(xt(e)),(e.doesContainJavaScript||e.doesContainJavaScriptInPackages||e.doesContainTypeScript||e.doesContainTypeScriptInPackages)&&(a.isBun&&u.push(ye(e)),a.isWillBoosterConfigs||u.push(Ie(e))),e.depending.pyright&&u.push(ft(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}),ae(m,["update"],s)):(e.rmSync(t.join(s,"yarn.lock"),{force:!0}),ae(m,["install","--no-immutable"],s)),ae(m,["cleanup"],s),a.isBun||ae(m,["install","--no-immutable"],s)}}();
2
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VzIjpbIi4uL3NyYy9vcHRpb25zLnRzIiwiLi4vc3JjL2xvZ2dlci50cyIsIi4uL3NyYy9maXhlcnMvZG9ja2VyZmlsZS50cyIsIi4uL3NyYy91dGlscy9mc1V0aWwudHMiLCIuLi9zcmMvdXRpbHMvcHJvbWlzZVBvb2wudHMiLCIuLi9zcmMvZml4ZXJzL25leHRDb25maWcudHMiLCIuLi9zcmMvZml4ZXJzL3BsYXl3cmlnaHRDb25maWcudHMiLCIuLi9zcmMvdXRpbHMvZ2xvYlV0aWwudHMiLCIuLi9zcmMvZml4ZXJzL3ByaXNtYS50cyIsIi4uL3NyYy9maXhlcnMvdGVzdERpcmVjdG9yeS50cyIsIi4uL3NyYy9maXhlcnMvdHlwZURlZmluaXRpb24udHMiLCIuLi9zcmMvdXRpbHMvbWVyZ2VVdGlsLnRzIiwiLi4vc3JjL3V0aWxzL29iamVjdFV0aWwudHMiLCIuLi9zcmMvZ2VuZXJhdG9ycy93b3JrZmxvdy50cyIsIi4uL3NyYy9maXhlcnMvdHlwb3MudHMiLCIuLi9zcmMvZ2VuZXJhdG9ycy9hZ2VudHMudHMiLCIuLi9zcmMvdXRpbHMvZ2l0aHViVXRpbC50cyIsIi4uL3NyYy91dGlscy9zcGF3blV0aWwudHMiLCIuLi9zcmMvdXRpbHMvdmVyc2lvbi50cyIsIi4uL3NyYy91dGlscy92ZXJzaW9uQ29uc3RhbnRzLnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvYXNkZi50cyIsIi4uL3NyYy9nZW5lcmF0b3JzL2Jpb21lLnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvYnVuZmlnLnRzIiwiLi4vc3JjL3V0aWxzL2lnbm9yZUZpbGVVdGlsLnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvZG9ja2VyaWdub3JlLnRzIiwiLi4vc3JjL3V0aWxzL2V4dGVuc2lvbnMudHMiLCIuLi9zcmMvZ2VuZXJhdG9ycy9lZGl0b3Jjb25maWcudHMiLCIuLi9zcmMvZ2VuZXJhdG9ycy9lc2xpbnRDb25maWcudHMiLCIuLi9zcmMvZ2VuZXJhdG9ycy9nZW1pbmlDb25maWcudHMiLCIuLi9zcmMvZ2VuZXJhdG9ycy9nZW1pbmlTZXR0aW5ncy50cyIsIi4uL3NyYy9nZW5lcmF0b3JzL2dpdGF0dHJpYnV0ZXMudHMiLCIuLi9zcmMvZ2VuZXJhdG9ycy9naXRpZ25vcmUudHMiLCIuLi9zcmMvZ2l0aHViL2NvbW1pdC50cyIsIi4uL3NyYy91dGlscy9lc2xpbnRVdGlsLnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvcGFja2FnZUpzb24udHMiLCIuLi9zcmMvZ2VuZXJhdG9ycy9odXNreXJjLnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvaWRlYS50cyIsIi4uL3NyYy9nZW5lcmF0b3JzL2xlZnRob29rLnRzIiwiLi4vc3JjL3V0aWxzL3NyY0RpcmVjdG9yaWVzLnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvbGludHN0YWdlZHJjLnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvcHJldHRpZXJpZ25vcmUudHMiLCIuLi9zcmMvZ2VuZXJhdG9ycy9weXJpZ2h0Q29uZmlnLnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvcmVhZG1lLnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvcmVsZWFzZXJjLnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvcmVub3ZhdGVKc29uLnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvdHNjb25maWcudHMiLCIuLi9zcmMvZ2VuZXJhdG9ycy92c2NvZGVTZXR0aW5ncy50cyIsIi4uL3NyYy9nZW5lcmF0b3JzL3lhcm5yYy50cyIsIi4uL3NyYy9naXRodWIvbGFiZWwudHMiLCIuLi9zcmMvZ2l0aHViL3NlY3JldC50cyIsIi4uL3NyYy9naXRodWIvc2V0dGluZ3MudHMiLCIuLi9zcmMvZ2l0aHViL3RlbXBsYXRlLnRzIiwiLi4vc3JjL3BhY2thZ2VDb25maWcudHMiLCIuLi9zcmMvdXRpbHMvd2lsbGJvb3N0ZXJDb25maWdzVXRpbC50cyIsIi4uL3NyYy9pbmRleC50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJjbGFzcyBPcHRpb25zIHtcbiAgaXNWZXJib3NlID0gZmFsc2U7XG4gIGRvZXNVcGxvYWRFbnZWYXJzID0gZmFsc2U7XG59XG5cbmV4cG9ydCBjb25zdCBvcHRpb25zID0gbmV3IE9wdGlvbnMoKTtcbiIsImltcG9ydCB7IG9wdGlvbnMgfSBmcm9tICcuL29wdGlvbnMuanMnO1xuXG5jbGFzcyBMb2dnZXIge1xuICBhc3luYyBmdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKG5hbWU6IHN0cmluZywgZnVuYzogKCkgPT4gUHJvbWlzZTx2b2lkPik6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmIChvcHRpb25zLmlzVmVyYm9zZSkge1xuICAgICAgY29uc29sZS5pbmZvKGAtLS0tLS0tLS0gJHtuYW1lfSBzdGFydCAtLS0tLS0tLS1gKTtcbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IGZ1bmMoKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgY29uc29sZS5pbmZvKGBFcnJvciBvY2N1cnJlZCBpbiAke25hbWV9OiAke2Vycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5zdGFjayA6IFN0cmluZyhlcnJvcil9fWApO1xuICAgIH1cbiAgICBpZiAob3B0aW9ucy5pc1ZlcmJvc2UpIHtcbiAgICAgIGNvbnNvbGUuaW5mbyhgLS0tLS0tLS0tLSAke25hbWV9IGVuZCAtLS0tLS0tLS0tYCk7XG4gICAgfVxuICB9XG59XG5cbmV4cG9ydCBjb25zdCBsb2dnZXIgPSBuZXcgTG9nZ2VyKCk7XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcy9wcm9taXNlcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBmaXhEb2NrZXJmaWxlKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2ZpeERvY2tlcmZpbGUnLCBhc3luYyAoKSA9PiB7XG4gICAgaWYgKCFjb25maWcuZG9lc0NvbnRhaW5Eb2NrZXJmaWxlKSByZXR1cm47XG5cbiAgICBjb25zdCBvbGRDb250ZW50ID0gY29uZmlnLmRvY2tlcmZpbGU7XG4gICAgY29uc3QgbmV3Q29udGVudCA9IG9sZENvbnRlbnQ7XG5cbiAgICBpZiAob2xkQ29udGVudCA9PT0gbmV3Q29udGVudCkgcmV0dXJuO1xuICAgIGF3YWl0IGZzLndyaXRlRmlsZShwYXRoLmpvaW4oY29uZmlnLmRpclBhdGgsICdEb2NrZXJmaWxlJyksIG5ld0NvbnRlbnQpO1xuICB9KTtcbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmV4cG9ydCBjb25zdCBmc1V0aWwgPSB7XG4gIGFzeW5jIHJlYWRGaWxlSWdub3JpbmdFcnJvcihmaWxlUGF0aDogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmcgfCB1bmRlZmluZWQ+IHtcbiAgICB0cnkge1xuICAgICAgcmV0dXJuIGF3YWl0IGZzLnByb21pc2VzLnJlYWRGaWxlKGZpbGVQYXRoLCAndXRmOCcpO1xuICAgIH0gY2F0Y2gge1xuICAgICAgLy8gZG8gbm90aGluZ1xuICAgIH1cbiAgfSxcbiAgYXN5bmMgZ2VuZXJhdGVGaWxlKGZpbGVQYXRoOiBzdHJpbmcsIGNvbnRlbnQ6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgIGF3YWl0IGZzLnByb21pc2VzLm1rZGlyKHBhdGguZGlybmFtZShmaWxlUGF0aCksIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICAgIGxldCBub3JtYWxpemVkQ29udGVudCA9IGNvbnRlbnQucmVwbGFjZUFsbCgnXFxyXFxuJywgJ1xcbicpLnRyaW0oKTtcbiAgICBpZiAobm9ybWFsaXplZENvbnRlbnQpIHtcbiAgICAgIG5vcm1hbGl6ZWRDb250ZW50ICs9ICdcXG4nO1xuICAgIH1cbiAgICBhd2FpdCBmcy5wcm9taXNlcy53cml0ZUZpbGUoZmlsZVBhdGgsIG5vcm1hbGl6ZWRDb250ZW50KTtcbiAgICBjb25zb2xlLmxvZyhgR2VuZXJhdGVkL1VwZGF0ZWQgJHtmaWxlUGF0aH1gKTtcbiAgfSxcbn07XG4iLCJpbXBvcnQgeyBQcm9taXNlUG9vbCB9IGZyb20gJ21pbmltYWwtcHJvbWlzZS1wb29sJztcblxuZXhwb3J0IGNvbnN0IHByb21pc2VQb29sID0gbmV3IFByb21pc2VQb29sKCk7XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBmc1V0aWwgfSBmcm9tICcuLi91dGlscy9mc1V0aWwuanMnO1xuaW1wb3J0IHsgcHJvbWlzZVBvb2wgfSBmcm9tICcuLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBmaXhOZXh0Q29uZmlnSnNvbihjb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdmaXhOZXh0Q29uZmlnSnNvbicsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBmaWxlUGF0aCA9IFsnanMnLCAnbWpzJywgJ2NqcyddXG4gICAgICAubWFwKChleHQpID0+IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgYG5leHQuY29uZmlnLiR7ZXh0fWApKVxuICAgICAgLmZpbmQoKHApID0+IGZzLmV4aXN0c1N5bmMocCkpO1xuICAgIGlmICghZmlsZVBhdGgpIHJldHVybjtcblxuICAgIGNvbnN0IG9sZENvbnRlbnQgPSBhd2FpdCBmcy5wcm9taXNlcy5yZWFkRmlsZShmaWxlUGF0aCwgJ3V0ZjgnKTtcbiAgICAvLyBSZXBsYWNlIHRoZSBKU09OIG9iamVjdCBmcm9tIHRoZSBmaWxlXG4gICAgY29uc3QgbmV3Q29udGVudCA9IG9sZENvbnRlbnQucmVwbGFjZSgvPVxccyp7KFtcXFNcXHNdKil9Oy8sIChfLCBzZXR0aW5nc1RleHQ6IHN0cmluZykgPT4ge1xuICAgICAgaWYgKCFzZXR0aW5nc1RleHQuaW5jbHVkZXMoJ2VzbGludDonKSkge1xuICAgICAgICBzZXR0aW5nc1RleHQgKz0gJ2VzbGludDogeyBpZ25vcmVEdXJpbmdCdWlsZHM6IHRydWUgfSwnO1xuICAgICAgfVxuICAgICAgaWYgKCFzZXR0aW5nc1RleHQuaW5jbHVkZXMoJ3R5cGVzY3JpcHQ6JykpIHtcbiAgICAgICAgc2V0dGluZ3NUZXh0ICs9ICd0eXBlc2NyaXB0OiB7IGlnbm9yZUJ1aWxkRXJyb3JzOiB0cnVlIH0sJztcbiAgICAgIH1cbiAgICAgIHJldHVybiBgPSB7JHtzZXR0aW5nc1RleHR9fTtgO1xuICAgIH0pO1xuICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiBmc1V0aWwuZ2VuZXJhdGVGaWxlKGZpbGVQYXRoLCBuZXdDb250ZW50KSk7XG4gIH0pO1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IG1lcmdlIGZyb20gJ2RlZXBtZXJnZSc7XG5pbXBvcnQgdHMgZnJvbSAndHlwZXNjcmlwdCc7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGZzVXRpbCB9IGZyb20gJy4uL3V0aWxzL2ZzVXRpbC5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcblxudHlwZSBQYXJzZWRWYWx1ZSA9XG4gIHwgeyBraW5kOiAnYXJyYXknOyB2YWx1ZTogUGFyc2VkVmFsdWVbXSB9XG4gIHwgeyBraW5kOiAnbGl0ZXJhbCc7IHZhbHVlOiBzdHJpbmcgfVxuICB8IHsga2luZDogJ29iamVjdCc7IHZhbHVlOiBQYXJzZWRPYmplY3QgfTtcbnR5cGUgUGFyc2VkT2JqZWN0ID0gUmVjb3JkPHN0cmluZywgUGFyc2VkVmFsdWU+O1xuXG5jb25zdCBsaXRlcmFsID0gKHZhbHVlOiBzdHJpbmcpOiBQYXJzZWRWYWx1ZSA9PiAoeyBraW5kOiAnbGl0ZXJhbCcsIHZhbHVlIH0pO1xuY29uc3QgYXNBcnJheSA9ICh2YWx1ZTogUGFyc2VkVmFsdWVbXSk6IFBhcnNlZFZhbHVlID0+ICh7IGtpbmQ6ICdhcnJheScsIHZhbHVlIH0pO1xuY29uc3QgYXNPYmplY3QgPSAodmFsdWU6IFBhcnNlZE9iamVjdCk6IFBhcnNlZFZhbHVlID0+ICh7IGtpbmQ6ICdvYmplY3QnLCB2YWx1ZSB9KTtcblxuY29uc3QgZGVmYXVsdENvbmZpZzogUGFyc2VkT2JqZWN0ID0ge1xuICBmb3JiaWRPbmx5OiBsaXRlcmFsKCchIXByb2Nlc3MuZW52LkNJJyksXG4gIHJldHJpZXM6IGxpdGVyYWwoJ3Byb2Nlc3MuZW52LlBXREVCVUcgPyAwIDogcHJvY2Vzcy5lbnYuQ0kgPyA1IDogMScpLFxuICB0aW1lb3V0OiBsaXRlcmFsKCcxMjBfMDAwJyksXG4gIHVzZTogYXNPYmplY3Qoe1xuICAgIGFjdGlvblRpbWVvdXQ6IGxpdGVyYWwoJzEwXzAwMCcpLFxuICAgIHRyYWNlOiBsaXRlcmFsKFwicHJvY2Vzcy5lbnYuQ0kgPyAnb24tZmlyc3QtcmV0cnknIDogJ3JldGFpbi1vbi1mYWlsdXJlJ1wiKSxcbiAgICBzY3JlZW5zaG90OiBsaXRlcmFsKFwicHJvY2Vzcy5lbnYuQ0kgPyAnb25seS1vbi1mYWlsdXJlJyA6ICdvbmx5LW9uLWZhaWx1cmUnXCIpLFxuICAgIHZpZGVvOiBsaXRlcmFsKFwicHJvY2Vzcy5lbnYuQ0kgPyAncmV0YWluLW9uLWZhaWx1cmUnIDogJ3JldGFpbi1vbi1mYWlsdXJlJ1wiKSxcbiAgfSksXG4gIHdvcmtlcnM6IGxpdGVyYWwoJ3Byb2Nlc3MuZW52LlBXREVCVUcgPyAxIDogdW5kZWZpbmVkJyksXG4gIHdlYlNlcnZlcjogYXNPYmplY3Qoe1xuICAgIGNvbW1hbmQ6IGxpdGVyYWwoXCIneWFybiBzdGFydC10ZXN0LXNlcnZlcidcIiksXG4gICAgdXJsOiBsaXRlcmFsKCdwcm9jZXNzLmVudi5ORVhUX1BVQkxJQ19CQVNFX1VSTCcpLFxuICAgIHJldXNlRXhpc3RpbmdTZXJ2ZXI6IGxpdGVyYWwoJyEhcHJvY2Vzcy5lbnYuQ0knKSxcbiAgICB0aW1lb3V0OiBsaXRlcmFsKCczMDBfMDAwJyksXG4gICAgc3Rkb3V0OiBsaXRlcmFsKFwiJ2lnbm9yZSdcIiksXG4gICAgc3RkZXJyOiBsaXRlcmFsKFwiJ3BpcGUnXCIpLFxuICAgIGVudjogbGl0ZXJhbChge1xuICAuLi5wcm9jZXNzLmVudixcbiAgUFJJU01BX1VTRVJfQ09OU0VOVF9GT1JfREFOR0VST1VTX0FJX0FDVElPTjogJ3RydWUnLFxufWApLFxuICAgIGdyYWNlZnVsU2h1dGRvd246IGxpdGVyYWwoYHtcbiAgc2lnbmFsOiAnU0lHVEVSTScsXG4gIHRpbWVvdXQ6IDUwMCxcbn1gKSxcbiAgfSksXG59O1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZml4UGxheXdyaWdodENvbmZpZyhjb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdmaXhQbGF5d3JpZ2h0Q29uZmlnJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCBgcGxheXdyaWdodC5jb25maWcudHNgKTtcbiAgICBpZiAoIWZzLmV4aXN0c1N5bmMoZmlsZVBhdGgpKSByZXR1cm47XG5cbiAgICBjb25zdCBvbGRDb250ZW50ID0gYXdhaXQgZnMucHJvbWlzZXMucmVhZEZpbGUoZmlsZVBhdGgsICd1dGY4Jyk7XG4gICAgY29uc3QgbWF0Y2ggPSAvZGVmaW5lQ29uZmlnXFxzKlxcKFxccyooXFx7W1xcc1xcU10qP30pXFxzKlxcKTs/Ly5leGVjKG9sZENvbnRlbnQpO1xuICAgIGNvbnN0IG9iamVjdExpdGVyYWwgPSBtYXRjaD8uWzFdO1xuICAgIGlmICghb2JqZWN0TGl0ZXJhbCkgcmV0dXJuO1xuXG4gICAgY29uc3QgcGFyc2VkID0gcGFyc2VPYmplY3RMaXRlcmFsKG9iamVjdExpdGVyYWwpO1xuICAgIGlmICghcGFyc2VkKSByZXR1cm47XG5cbiAgICBjb25zdCBtZXJnZWQgPSBtZXJnZS5hbGw8UGFyc2VkT2JqZWN0PihbZGVmYXVsdENvbmZpZywgcGFyc2VkLCBkZWZhdWx0Q29uZmlnXSk7XG4gICAgY29uc3QgbmV3T2JqZWN0TGl0ZXJhbCA9IHN0cmluZ2lmeU9iamVjdChtZXJnZWQsIDApO1xuICAgIGNvbnN0IG5ld0NvbnRlbnQgPSBvbGRDb250ZW50LnJlcGxhY2Uob2JqZWN0TGl0ZXJhbCwgbmV3T2JqZWN0TGl0ZXJhbCk7XG5cbiAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnNVdGlsLmdlbmVyYXRlRmlsZShmaWxlUGF0aCwgbmV3Q29udGVudCkpO1xuICB9KTtcbn1cblxuZnVuY3Rpb24gcGFyc2VPYmplY3RMaXRlcmFsKG9iamVjdExpdGVyYWw6IHN0cmluZyk6IFBhcnNlZE9iamVjdCB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IHNvdXJjZSA9IHRzLmNyZWF0ZVNvdXJjZUZpbGUoXG4gICAgJ3BsYXl3cmlnaHQtY29uZmlnLnRzJyxcbiAgICBgY29uc3QgY29uZmlnID0gJHtvYmplY3RMaXRlcmFsfTtgLFxuICAgIHRzLlNjcmlwdFRhcmdldC5MYXRlc3QsXG4gICAgdHJ1ZSxcbiAgICB0cy5TY3JpcHRLaW5kLlRTXG4gICk7XG4gIGNvbnN0IHN0YXRlbWVudCA9IHNvdXJjZS5zdGF0ZW1lbnRzWzBdO1xuICBpZiAoIXN0YXRlbWVudCB8fCAhdHMuaXNWYXJpYWJsZVN0YXRlbWVudChzdGF0ZW1lbnQpKSByZXR1cm47XG4gIGNvbnN0IGRlY2xhcmF0aW9uID0gc3RhdGVtZW50LmRlY2xhcmF0aW9uTGlzdC5kZWNsYXJhdGlvbnNbMF07XG4gIGlmICghZGVjbGFyYXRpb24/LmluaXRpYWxpemVyIHx8ICF0cy5pc09iamVjdExpdGVyYWxFeHByZXNzaW9uKGRlY2xhcmF0aW9uLmluaXRpYWxpemVyKSkgcmV0dXJuO1xuICByZXR1cm4gcGFyc2VPYmplY3RMaXRlcmFsRXhwcmVzc2lvbihkZWNsYXJhdGlvbi5pbml0aWFsaXplciwgc291cmNlKTtcbn1cblxuZnVuY3Rpb24gcGFyc2VPYmplY3RMaXRlcmFsRXhwcmVzc2lvbihcbiAgb2JqZWN0TGl0ZXJhbDogdHMuT2JqZWN0TGl0ZXJhbEV4cHJlc3Npb24sXG4gIHNvdXJjZTogdHMuU291cmNlRmlsZVxuKTogUGFyc2VkT2JqZWN0IHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgcGFyc2VkOiBQYXJzZWRPYmplY3QgPSB7fTtcbiAgZm9yIChjb25zdCBwcm9wZXJ0eSBvZiBvYmplY3RMaXRlcmFsLnByb3BlcnRpZXMpIHtcbiAgICBpZiAoIXRzLmlzUHJvcGVydHlBc3NpZ25tZW50KHByb3BlcnR5KSB8fCAoIXRzLmlzSWRlbnRpZmllcihwcm9wZXJ0eS5uYW1lKSAmJiAhdHMuaXNTdHJpbmdMaXRlcmFsKHByb3BlcnR5Lm5hbWUpKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCB2YWx1ZSA9IHBhcnNlRXhwcmVzc2lvbihwcm9wZXJ0eS5pbml0aWFsaXplciwgc291cmNlKTtcbiAgICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCkgcmV0dXJuO1xuICAgIHBhcnNlZFtwcm9wZXJ0eS5uYW1lLmdldFRleHQoc291cmNlKV0gPSB2YWx1ZTtcbiAgfVxuICByZXR1cm4gcGFyc2VkO1xufVxuXG5mdW5jdGlvbiBwYXJzZUV4cHJlc3Npb24oZXhwcmVzc2lvbjogdHMuRXhwcmVzc2lvbiwgc291cmNlOiB0cy5Tb3VyY2VGaWxlKTogUGFyc2VkVmFsdWUgfCB1bmRlZmluZWQge1xuICBpZiAodHMuaXNPYmplY3RMaXRlcmFsRXhwcmVzc2lvbihleHByZXNzaW9uKSkge1xuICAgIGNvbnN0IHBhcnNlZE9iamVjdCA9IHBhcnNlT2JqZWN0TGl0ZXJhbEV4cHJlc3Npb24oZXhwcmVzc2lvbiwgc291cmNlKTtcbiAgICByZXR1cm4gcGFyc2VkT2JqZWN0ID8gYXNPYmplY3QocGFyc2VkT2JqZWN0KSA6IGxpdGVyYWwoZXhwcmVzc2lvbi5nZXRUZXh0KHNvdXJjZSkpO1xuICB9XG4gIGlmICh0cy5pc0FycmF5TGl0ZXJhbEV4cHJlc3Npb24oZXhwcmVzc2lvbikpIHtcbiAgICBjb25zdCBlbGVtZW50cyA9IGV4cHJlc3Npb24uZWxlbWVudHMubWFwKChlbGVtZW50KSA9PiBwYXJzZUV4cHJlc3Npb24oZWxlbWVudCwgc291cmNlKSk7XG4gICAgaWYgKGVsZW1lbnRzLnNvbWUoKGVsZW1lbnQpOiBlbGVtZW50IGlzIHVuZGVmaW5lZCA9PiBlbGVtZW50ID09PSB1bmRlZmluZWQpKSB7XG4gICAgICByZXR1cm4gbGl0ZXJhbChleHByZXNzaW9uLmdldFRleHQoc291cmNlKSk7XG4gICAgfVxuICAgIHJldHVybiBhc0FycmF5KGVsZW1lbnRzIGFzIFBhcnNlZFZhbHVlW10pO1xuICB9XG4gIHJldHVybiBsaXRlcmFsKGV4cHJlc3Npb24uZ2V0VGV4dChzb3VyY2UpKTtcbn1cblxuZnVuY3Rpb24gc3RyaW5naWZ5VmFsdWUodmFsdWU6IFBhcnNlZFZhbHVlLCBsZXZlbDogbnVtYmVyKTogc3RyaW5nIHtcbiAgaWYgKHZhbHVlLmtpbmQgPT09ICdhcnJheScpIHtcbiAgICByZXR1cm4gc3RyaW5naWZ5QXJyYXkodmFsdWUudmFsdWUsIGxldmVsKTtcbiAgfVxuICBpZiAodmFsdWUua2luZCA9PT0gJ2xpdGVyYWwnKSByZXR1cm4gdmFsdWUudmFsdWU7XG4gIHJldHVybiBzdHJpbmdpZnlPYmplY3QodmFsdWUudmFsdWUsIGxldmVsKTtcbn1cblxuZnVuY3Rpb24gc3RyaW5naWZ5QXJyYXkodmFsdWVzOiBQYXJzZWRWYWx1ZVtdLCBsZXZlbDogbnVtYmVyKTogc3RyaW5nIHtcbiAgaWYgKHZhbHVlcy5sZW5ndGggPT09IDApIHJldHVybiAnW10nO1xuICBjb25zdCBpbmRlbnQgPSAnICAnLnJlcGVhdChsZXZlbCArIDEpO1xuICBjb25zdCBsaW5lcyA9IHZhbHVlcy5tYXAoKHZhbHVlKSA9PiB7XG4gICAgY29uc3Qgc3RyaW5naWZpZWQgPSBzdHJpbmdpZnlWYWx1ZSh2YWx1ZSwgbGV2ZWwgKyAxKS5zcGxpdCgnXFxuJyk7XG4gICAgc3RyaW5naWZpZWRbc3RyaW5naWZpZWQubGVuZ3RoIC0gMV0gPSBgJHtzdHJpbmdpZmllZC5hdCgtMSl9LGA7XG4gICAgaWYgKHZhbHVlLmtpbmQgPT09ICdsaXRlcmFsJykge1xuICAgICAgZm9yIChsZXQgaW5kZXggPSAxOyBpbmRleCA8IHN0cmluZ2lmaWVkLmxlbmd0aDsgaW5kZXggKz0gMSkge1xuICAgICAgICBzdHJpbmdpZmllZFtpbmRleF0gPSBgJHtpbmRlbnR9JHtzdHJpbmdpZmllZFtpbmRleF19YDtcbiAgICAgIH1cbiAgICB9XG4gICAgc3RyaW5naWZpZWRbMF0gPSBgJHtpbmRlbnR9JHtzdHJpbmdpZmllZFswXX1gO1xuICAgIHJldHVybiBzdHJpbmdpZmllZC5qb2luKCdcXG4nKTtcbiAgfSk7XG4gIGNvbnN0IGNsb3NpbmdJbmRlbnQgPSAnICAnLnJlcGVhdChsZXZlbCk7XG4gIHJldHVybiBgW1xcbiR7bGluZXMuam9pbignXFxuJyl9XFxuJHtjbG9zaW5nSW5kZW50fV1gO1xufVxuXG5mdW5jdGlvbiBzdHJpbmdpZnlPYmplY3Qob2JqZWN0OiBQYXJzZWRPYmplY3QsIGxldmVsOiBudW1iZXIpOiBzdHJpbmcge1xuICBjb25zdCBpbmRlbnQgPSAnICAnLnJlcGVhdChsZXZlbCArIDEpO1xuICBjb25zdCBsaW5lcyA9IE9iamVjdC5lbnRyaWVzKG9iamVjdCkubWFwKChba2V5LCB2YWx1ZV0pID0+IHtcbiAgICBjb25zdCBzdHJpbmdpZmllZCA9IHN0cmluZ2lmeVZhbHVlKHZhbHVlLCBsZXZlbCArIDEpLnNwbGl0KCdcXG4nKTtcbiAgICBzdHJpbmdpZmllZFtzdHJpbmdpZmllZC5sZW5ndGggLSAxXSA9IGAke3N0cmluZ2lmaWVkLmF0KC0xKX0sYDtcbiAgICBpZiAodmFsdWUua2luZCA9PT0gJ2xpdGVyYWwnKSB7XG4gICAgICBmb3IgKGxldCBpbmRleCA9IDE7IGluZGV4IDwgc3RyaW5naWZpZWQubGVuZ3RoOyBpbmRleCArPSAxKSB7XG4gICAgICAgIHN0cmluZ2lmaWVkW2luZGV4XSA9IGAke2luZGVudH0ke3N0cmluZ2lmaWVkW2luZGV4XX1gO1xuICAgICAgfVxuICAgIH1cbiAgICBzdHJpbmdpZmllZFswXSA9IGAke2luZGVudH0ke2tleX06ICR7c3RyaW5naWZpZWRbMF19YDtcbiAgICByZXR1cm4gc3RyaW5naWZpZWQuam9pbignXFxuJyk7XG4gIH0pO1xuICBjb25zdCBjbG9zaW5nSW5kZW50ID0gJyAgJy5yZXBlYXQobGV2ZWwpO1xuICBpZiAobGluZXMubGVuZ3RoID09PSAwKSByZXR1cm4gYHtcXG4ke2Nsb3NpbmdJbmRlbnR9fWA7XG4gIHJldHVybiBge1xcbiR7bGluZXMuam9pbignXFxuJyl9XFxuJHtjbG9zaW5nSW5kZW50fX1gO1xufVxuIiwiZXhwb3J0IGNvbnN0IGdsb2JJZ25vcmUgPSBbXG4gICcqKi9ub2RlX21vZHVsZXMvKionLFxuICAnKiovLnZlbnYvKionLFxuICAnKiovdGVzdC1maXh0dXJlcy8qKicsXG4gICcqKi90ZXN0L2ZpeHR1cmVzLyoqJyxcbiAgJyoqL2Rpc3QvKionLFxuICAnKiovYnVpbGQvKionLFxuICAnKiovdGFyZ2V0LyoqJyxcbiAgJyoqL3RlbXAvKionLFxuICAnKiovdG1wLyoqJyxcbl07XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcy9wcm9taXNlcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgZmcgZnJvbSAnZmFzdC1nbG9iJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZ2xvYklnbm9yZSB9IGZyb20gJy4uL3V0aWxzL2dsb2JVdGlsLmpzJztcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGZpeFByaXNtYUVudkZpbGVzKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2ZpeFByaXNtYUVudkZpbGVzJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IGVudkZpbGVzID0gYXdhaXQgZmcuZ2xvYihbJyouZW52JywgJyouZW52LionXSwgeyBkb3Q6IHRydWUsIGN3ZDogY29uZmlnLmRpclBhdGgsIGlnbm9yZTogZ2xvYklnbm9yZSB9KTtcbiAgICBmb3IgKGNvbnN0IGVudkZpbGUgb2YgZW52RmlsZXMpIHtcbiAgICAgIGNvbnN0IGVudkZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCBlbnZGaWxlKTtcbiAgICAgIGNvbnN0IGNvbnRlbnQgPSBhd2FpdCBmcy5yZWFkRmlsZShlbnZGaWxlUGF0aCwgJ3V0ZjgnKTtcbiAgICAgIGNvbnN0IG5ld0NvbnRlbnQgPSBjb250ZW50LnJlcGxhY2UoXG4gICAgICAgIC9EQVRBQkFTRV9VUkw9XCI/KC4rXFwuc3FsaXRlMylcIj9bXFxuJF0vLFxuICAgICAgICAnREFUQUJBU0VfVVJMPVwiJDE/Y29ubmVjdGlvbl9saW1pdD0xXCJcXG4nXG4gICAgICApO1xuICAgICAgYXdhaXQgZnMud3JpdGVGaWxlKGVudkZpbGVQYXRoLCBuZXdDb250ZW50KTtcbiAgICB9XG4gIH0pO1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGZpeFRlc3REaXJlY3Rvcmllc1VwZGF0aW5nUGFja2FnZUpzb24ocGFja2FnZURpclBhdGhzOiBzdHJpbmdbXSk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2ZpeFRlc3REaXJlY3Rvcmllc1VwZGF0aW5nUGFja2FnZUpzb24nLCBhc3luYyAoKSA9PiB7XG4gICAgYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgICBwYWNrYWdlRGlyUGF0aHMubWFwKGFzeW5jIChwYWNrYWdlRGlyUGF0aCkgPT4ge1xuICAgICAgICBjb25zdCBuZXdUZXN0RGlyUGF0aCA9IHBhdGguam9pbihwYWNrYWdlRGlyUGF0aCwgJ3Rlc3QnKTtcbiAgICAgICAgZm9yIChjb25zdCBvbGRUZXN0RGlyTmFtZSBvZiBbJ19fdGVzdHNfXycsICd0ZXN0cyddKSB7XG4gICAgICAgICAgY29uc3Qgb2xkVGVzdERpclBhdGggPSBwYXRoLmpvaW4ocGFja2FnZURpclBhdGgsIG9sZFRlc3REaXJOYW1lKTtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgYXdhaXQgZnMucHJvbWlzZXMucmVuYW1lKG9sZFRlc3REaXJQYXRoLCBuZXdUZXN0RGlyUGF0aCk7XG4gICAgICAgICAgICBjb25zdCBvbGRDb250ZW50ID0gYXdhaXQgZnMucHJvbWlzZXMucmVhZEZpbGUocGF0aC5qb2luKHBhY2thZ2VEaXJQYXRoLCAncGFja2FnZS5qc29uJyksICd1dGY4Jyk7XG4gICAgICAgICAgICBjb25zdCBuZXdDb250ZW50ID0gb2xkQ29udGVudC5yZXBsYWNlQWxsKG9sZFRlc3REaXJOYW1lLCAndGVzdCcpO1xuICAgICAgICAgICAgaWYgKG9sZENvbnRlbnQgPT09IG5ld0NvbnRlbnQpIHJldHVybjtcblxuICAgICAgICAgICAgYXdhaXQgZnMucHJvbWlzZXMud3JpdGVGaWxlKHBhdGguam9pbihwYWNrYWdlRGlyUGF0aCwgJ3BhY2thZ2UuanNvbicpLCBuZXdDb250ZW50KTtcbiAgICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICAgIC8vIGRvIG5vdGhpbmdcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgKTtcbiAgfSk7XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcy9wcm9taXNlcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgeyBpZ25vcmVFbm9lbnRBc3luYyB9IGZyb20gJ0B3aWxsYm9vc3Rlci9zaGFyZWQtbGliJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgcHJvbWlzZVBvb2wgfSBmcm9tICcuLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBmaXhUeXBlRGVmaW5pdGlvbnMoXG4gIGNvbmZpZzogUGFja2FnZUNvbmZpZyxcbiAgY29uZmlnc0luY2x1ZGluZ0NoaWxkcmVuOiBQYWNrYWdlQ29uZmlnW11cbik6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2ZpeFR5cGVEZWZpbml0aW9ucycsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBsaWJUeXBlRGlyUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJ0B0eXBlcycpO1xuICAgIGNvbnN0IHNyY1R5cGVEaXJQYXRoID1cbiAgICAgIGNvbmZpZy5pc1Jvb3QgJiYgY29uZmlnLmRvZXNDb250YWluU3ViUGFja2FnZUpzb25zID8gdW5kZWZpbmVkIDogcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnc3JjJywgJ3R5cGVzJyk7XG5cbiAgICBjb25zdCBkaXJlbnRzID0gYXdhaXQgaWdub3JlRW5vZW50QXN5bmMoKCkgPT4gZnMucmVhZGRpcihsaWJUeXBlRGlyUGF0aCwgeyB3aXRoRmlsZVR5cGVzOiB0cnVlIH0pKTtcbiAgICBpZiAoIWRpcmVudHMpIHJldHVybjtcblxuICAgIGZvciAoY29uc3QgZGlyZW50IG9mIGRpcmVudHMpIHtcbiAgICAgIGNvbnN0IGRpck5hbWUgPSBkaXJlbnQubmFtZS5zbGljZSgwLCAtNSk7XG4gICAgICBjb25zdCBoYXNUeXBlRGVjbGFyYXRpb25FeHRlbnNpb24gPSBkaXJlbnQubmFtZS5lbmRzV2l0aCgnLmQudHMnKTtcbiAgICAgIGxldCBwYWNrYWdlTmFtZSA9IGhhc1R5cGVEZWNsYXJhdGlvbkV4dGVuc2lvbiA/IGRpck5hbWUgOiBkaXJlbnQubmFtZTtcbiAgICAgIGlmIChwYWNrYWdlTmFtZS5pbmNsdWRlcygnX18nKSkge1xuICAgICAgICBwYWNrYWdlTmFtZSA9IGBAJHtwYWNrYWdlTmFtZS5yZXBsYWNlKCdfXycsICcvJyl9YDtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGhhc0xpYnJhcnkgPSBjb25maWdzSW5jbHVkaW5nQ2hpbGRyZW4uc29tZShcbiAgICAgICAgKGNvbmZpZykgPT5cbiAgICAgICAgICBjb25maWcucGFja2FnZUpzb24/LmRlcGVuZGVuY2llcz8uW3BhY2thZ2VOYW1lXSB8fCBjb25maWcucGFja2FnZUpzb24/LmRldkRlcGVuZGVuY2llcz8uW3BhY2thZ2VOYW1lXVxuICAgICAgKTtcblxuICAgICAgaWYgKGRpcmVudC5pc0ZpbGUoKSAmJiBoYXNUeXBlRGVjbGFyYXRpb25FeHRlbnNpb24pIHtcbiAgICAgICAgaWYgKGhhc0xpYnJhcnkpIHtcbiAgICAgICAgICAvLyBNb3ZlIEB0eXBlcy88bmFtZT4vaW5kZXguZC50cyBpZiBpbnN0YWxsZWRcbiAgICAgICAgICBhd2FpdCBmcy5ta2RpcihwYXRoLmpvaW4obGliVHlwZURpclBhdGgsIGRpck5hbWUpKTtcbiAgICAgICAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT5cbiAgICAgICAgICAgIGZzLnJlbmFtZShwYXRoLmpvaW4obGliVHlwZURpclBhdGgsIGRpcmVudC5uYW1lKSwgcGF0aC5qb2luKGxpYlR5cGVEaXJQYXRoLCBkaXJOYW1lLCAnaW5kZXguZC50cycpKVxuICAgICAgICAgICk7XG4gICAgICAgIH0gZWxzZSBpZiAoc3JjVHlwZURpclBhdGgpIHtcbiAgICAgICAgICAvLyBNb3ZlIHNyYy90eXBlcy88bmFtZT4gaWYgbm90IGluc3RhbGxlZFxuICAgICAgICAgIGF3YWl0IGZzLm1rZGlyKHNyY1R5cGVEaXJQYXRoLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgICAgICAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT5cbiAgICAgICAgICAgIGZzLnJlbmFtZShwYXRoLmpvaW4obGliVHlwZURpclBhdGgsIGRpcmVudC5uYW1lKSwgcGF0aC5qb2luKHNyY1R5cGVEaXJQYXRoLCBkaXJlbnQubmFtZSkpXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChkaXJlbnQuaXNEaXJlY3RvcnkoKSAmJiBzcmNUeXBlRGlyUGF0aCAmJiAhaGFzTGlicmFyeSkge1xuICAgICAgICAvLyBNb3ZlIHNyYy90eXBlcy88bmFtZT4uZC50cyBpZiBub3QgaW5zdGFsbGVkXG4gICAgICAgIGF3YWl0IGZzLm1rZGlyKHNyY1R5cGVEaXJQYXRoLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgICAgICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+XG4gICAgICAgICAgaWdub3JlRW5vZW50QXN5bmMoKCkgPT5cbiAgICAgICAgICAgIGZzLnJlbmFtZShcbiAgICAgICAgICAgICAgcGF0aC5qb2luKGxpYlR5cGVEaXJQYXRoLCBkaXJlbnQubmFtZSwgJ2luZGV4LmQudHMnKSxcbiAgICAgICAgICAgICAgcGF0aC5qb2luKHNyY1R5cGVEaXJQYXRoLCBgJHtkaXJlbnQubmFtZX0uZC50c2ApXG4gICAgICAgICAgICApXG4gICAgICAgICAgKVxuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cbiAgfSk7XG59XG4iLCIvKiBlc2xpbnQtZGlzYWJsZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW5zYWZlLWFzc2lnbm1lbnQsIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnNhZmUtY2FsbCwgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVuc2FmZS1tZW1iZXItYWNjZXNzLCBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW5zYWZlLWFyZ3VtZW50ICovXG5cbmltcG9ydCBtZXJnZSBmcm9tICdkZWVwbWVyZ2UnO1xuXG5leHBvcnQgZnVuY3Rpb24gb3ZlcndyaXRlTWVyZ2U8VD4oZGVzdGluYXRpb25BcnJheTogVFtdLCBzb3VyY2VBcnJheTogVFtdKTogVFtdIHtcbiAgcmV0dXJuIHNvdXJjZUFycmF5O1xufVxuXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuZXhwb3J0IGZ1bmN0aW9uIGNvbWJpbmVNZXJnZSh0YXJnZXQ6IG9iamVjdFtdLCBzb3VyY2U6IG9iamVjdFtdLCBvcHRpb25zOiBhbnkpOiBvYmplY3RbXSB7XG4gIGNvbnN0IGRlc3RpbmF0aW9uID0gWy4uLnRhcmdldF07XG5cbiAgZm9yIChjb25zdCBbaW5kZXgsIGl0ZW1dIG9mIHNvdXJjZS5lbnRyaWVzKCkpIHtcbiAgICBpZiAoZGVzdGluYXRpb25baW5kZXhdID09PSB1bmRlZmluZWQpIHtcbiAgICAgIGRlc3RpbmF0aW9uW2luZGV4XSA9IG9wdGlvbnMuY2xvbmVVbmxlc3NPdGhlcndpc2VTcGVjaWZpZWQoaXRlbSwgb3B0aW9ucyk7XG4gICAgfSBlbHNlIGlmIChvcHRpb25zLmlzTWVyZ2VhYmxlT2JqZWN0KGl0ZW0pKSB7XG4gICAgICBkZXN0aW5hdGlvbltpbmRleF0gPSBtZXJnZSh0YXJnZXRbaW5kZXhdIGFzIG9iamVjdCwgaXRlbSwgb3B0aW9ucyk7XG4gICAgfSBlbHNlIGlmICghdGFyZ2V0LmluY2x1ZGVzKGl0ZW0pKSB7XG4gICAgICBkZXN0aW5hdGlvbi5wdXNoKGl0ZW0pO1xuICAgIH1cbiAgfVxuICByZXR1cm4gZGVzdGluYXRpb247XG59XG4iLCJleHBvcnQgZnVuY3Rpb24gbW92ZVRvQm90dG9tPFRPYmogZXh0ZW5kcyBSZWNvcmQ8VEtleSwgdW5rbm93bj4sIFRLZXkgZXh0ZW5kcyBzdHJpbmcgfCBudW1iZXIgfCBzeW1ib2w+KFxuICBvYmo6IFRPYmosXG4gIGtleTogVEtleVxuKTogVE9iaiB7XG4gIGNvbnN0IHZhbHVlID0gb2JqW2tleV07XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZHluYW1pYy1kZWxldGVcbiAgZGVsZXRlIG9ialtrZXldO1xuICAob2JqIGFzIFJlY29yZDxUS2V5LCB1bmtub3duPilba2V5XSA9IHZhbHVlO1xuICByZXR1cm4gb2JqO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gc29ydEtleXM8VCBleHRlbmRzIFJlY29yZDxzdHJpbmcsIHVua25vd24+PihvYmo6IFQpOiBUIHtcbiAgY29uc3Qga2V5QW5kVmFsdWVzID0gT2JqZWN0LmVudHJpZXMob2JqKS50b1NvcnRlZCgoW2tleTFdLCBba2V5Ml0pID0+IGtleTEubG9jYWxlQ29tcGFyZShrZXkyKSk7XG4gIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIGtleUFuZFZhbHVlcykge1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZHluYW1pYy1kZWxldGVcbiAgICBkZWxldGUgb2JqW2tleV07XG4gICAgKG9iaiBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPilba2V5XSA9IHZhbHVlO1xuXG4gICAgLy8gaWYgdmFsdWUgaXMgYW4gb2JqZWN0LCBzb3J0IHRoZSBrZXlzIG9mIHRoZSBvYmplY3RcbiAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJiB2YWx1ZSAhPT0gbnVsbCkge1xuICAgICAgc29ydEtleXModmFsdWUgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pO1xuICAgIH1cbiAgfVxuICByZXR1cm4gb2JqO1xufVxuIiwiLyogZXNsaW50LWRpc2FibGUgdW5pY29ybi9uby1udWxsICovXG5cbmltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCBtZXJnZSBmcm9tICdkZWVwbWVyZ2UnO1xuaW1wb3J0IHlhbWwgZnJvbSAnanMteWFtbCc7XG5pbXBvcnQgY2xvbmVEZWVwIGZyb20gJ2xvZGFzaC5jbG9uZWRlZXAnO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBjb21iaW5lTWVyZ2UgfSBmcm9tICcuLi91dGlscy9tZXJnZVV0aWwuanMnO1xuaW1wb3J0IHsgbW92ZVRvQm90dG9tLCBzb3J0S2V5cyB9IGZyb20gJy4uL3V0aWxzL29iamVjdFV0aWwuanMnO1xuaW1wb3J0IHsgcHJvbWlzZVBvb2wgfSBmcm9tICcuLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5cbmludGVyZmFjZSBXb3JrZmxvdyB7XG4gIG5hbWU/OiBzdHJpbmc7XG4gIG9uPzogT247XG4gIGNvbmN1cnJlbmN5PzogQ29uY3VycmVuY3k7XG4gIHBlcm1pc3Npb25zPzogUmVjb3JkPHN0cmluZywgc3RyaW5nPjtcbiAgam9iczogUmVjb3JkPHN0cmluZywgSm9iPjtcbn1cblxuaW50ZXJmYWNlIENvbmN1cnJlbmN5IHtcbiAgZ3JvdXA6IHN0cmluZztcbiAgJ2NhbmNlbC1pbi1wcm9ncmVzcyc6IGJvb2xlYW47XG59XG5cbmludGVyZmFjZSBPbiB7XG4gIGlzc3Vlcz86IFR5cGVzIHwgbnVsbDtcbiAgcHVsbF9yZXF1ZXN0PzogUHVsbFJlcXVlc3QgfCBudWxsO1xuICBwdWxsX3JlcXVlc3RfdGFyZ2V0PzogVHlwZXMgfCBudWxsO1xuICBwdXNoPzogUHVzaDtcbiAgc2NoZWR1bGU/OiBTY2hlZHVsZVtdO1xuICB3b3JrZmxvd19kaXNwYXRjaD86IG51bGw7XG59XG5cbmludGVyZmFjZSBQdWxsUmVxdWVzdCB7XG4gICdwYXRocy1pZ25vcmUnPzogc3RyaW5nW107XG4gIHR5cGVzPzogc3RyaW5nW107XG59XG5cbmludGVyZmFjZSBQdXNoIHtcbiAgYnJhbmNoZXM6IHN0cmluZ1tdO1xuICAncGF0aHMtaWdub3JlJz86IHN0cmluZ1tdO1xufVxuXG5pbnRlcmZhY2UgU2NoZWR1bGUge1xuICBjcm9uOiBzdHJpbmc7XG59XG5cbmludGVyZmFjZSBUeXBlcyB7XG4gIHR5cGVzOiBzdHJpbmdbXTtcbn1cblxuaW50ZXJmYWNlIEpvYiB7XG4gICdydW5zLW9uJz86IHN0cmluZztcbiAgcGVybWlzc2lvbnM/OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+O1xuICBzdGVwcz86IFN0ZXBbXTtcbiAgdXNlcz86IHN0cmluZztcbiAgaWY/OiBzdHJpbmc7XG4gIHNlY3JldHM/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgd2l0aD86IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xufVxuXG5pbnRlcmZhY2UgU3RlcCB7XG4gIHVzZXM/OiBzdHJpbmc7XG4gIHdpdGg/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgcnVuPzogc3RyaW5nO1xufVxuXG5jb25zdCBwdWJsaWNSZXBvQXV0b2ZpeFdvcmtmbG93OiBXb3JrZmxvdyA9IHtcbiAgbmFtZTogJ2F1dG9maXguY2knLFxuICBvbjoge1xuICAgIHB1bGxfcmVxdWVzdDogbnVsbCxcbiAgICBwdXNoOiB7XG4gICAgICBicmFuY2hlczogWydtYWluJ10sXG4gICAgfSxcbiAgfSxcbiAgcGVybWlzc2lvbnM6IHtcbiAgICBjb250ZW50czogJ3JlYWQnLFxuICB9LFxuICBjb25jdXJyZW5jeToge1xuICAgIGdyb3VwOiAnYXV0b2ZpeC0ke3sgZ2l0aHViLmhlYWRfcmVmIH19JyxcbiAgICAnY2FuY2VsLWluLXByb2dyZXNzJzogdHJ1ZSxcbiAgfSxcbiAgam9iczoge1xuICAgIGF1dG9maXg6IHsgJ3J1bnMtb24nOiAndWJ1bnR1LWxhdGVzdCcgfSxcbiAgfSxcbn07XG5cbmNvbnN0IHByaXZhdGVSZXBvQXV0b2ZpeFdvcmtmbG93OiBXb3JrZmxvdyA9IHtcbiAgbmFtZTogJ0ZpeCBjb2RlIGF1dG9tYXRpY2FsbHknLFxuICBvbjoge1xuICAgIHB1bGxfcmVxdWVzdDogbnVsbCxcbiAgfSxcbiAgY29uY3VycmVuY3k6IHtcbiAgICBncm91cDogJyR7eyBnaXRodWIud29ya2Zsb3cgfX0tJHt7IGdpdGh1Yi5yZWYgfX0nLFxuICAgICdjYW5jZWwtaW4tcHJvZ3Jlc3MnOiB0cnVlLFxuICB9LFxuICBqb2JzOiB7XG4gICAgdGVzdDoge1xuICAgICAgdXNlczogJ1dpbGxCb29zdGVyL3JldXNhYmxlLXdvcmtmbG93cy8uZ2l0aHViL3dvcmtmbG93cy9hdXRvZml4LnltbEBtYWluJyxcbiAgICB9LFxuICB9LFxufTtcblxuY29uc3Qgd29ya2Zsb3dzID0ge1xuICB0ZXN0OiB7XG4gICAgbmFtZTogJ1Rlc3QnLFxuICAgIG9uOiB7XG4gICAgICBwdWxsX3JlcXVlc3Q6IG51bGwsXG4gICAgICBwdXNoOiB7XG4gICAgICAgIGJyYW5jaGVzOiBbJ21haW4nLCAnd2JmeSddLFxuICAgICAgfSxcbiAgICB9LFxuICAgIC8vIGNmLiBodHRwczovL2RvY3MuZ2l0aHViLmNvbS9lbi9hY3Rpb25zL3VzaW5nLWpvYnMvdXNpbmctY29uY3VycmVuY3kjZXhhbXBsZS1vbmx5LWNhbmNlbC1pbi1wcm9ncmVzcy1qb2JzLW9yLXJ1bnMtZm9yLXRoZS1jdXJyZW50LXdvcmtmbG93XG4gICAgY29uY3VycmVuY3k6IHtcbiAgICAgIGdyb3VwOiAnJHt7IGdpdGh1Yi53b3JrZmxvdyB9fS0ke3sgZ2l0aHViLnJlZiB9fScsXG4gICAgICAnY2FuY2VsLWluLXByb2dyZXNzJzogdHJ1ZSxcbiAgICB9LFxuICAgIHBlcm1pc3Npb25zOiB7XG4gICAgICAvLyBmb3IgbGludGVyIGZpeFxuICAgICAgY29udGVudHM6ICd3cml0ZScsXG4gICAgfSxcbiAgICBqb2JzOiB7XG4gICAgICB0ZXN0OiB7XG4gICAgICAgIHVzZXM6ICdXaWxsQm9vc3Rlci9yZXVzYWJsZS13b3JrZmxvd3MvLmdpdGh1Yi93b3JrZmxvd3MvdGVzdC55bWxAbWFpbicsXG4gICAgICB9LFxuICAgIH0sXG4gIH0sXG4gIHJlbGVhc2U6IHtcbiAgICBuYW1lOiAnUmVsZWFzZScsXG4gICAgb246IHtcbiAgICAgIHB1c2g6IHtcbiAgICAgICAgYnJhbmNoZXM6IFtdLFxuICAgICAgfSxcbiAgICB9LFxuICAgIGNvbmN1cnJlbmN5OiB7XG4gICAgICBncm91cDogJyR7eyBnaXRodWIud29ya2Zsb3cgfX0nLFxuICAgICAgJ2NhbmNlbC1pbi1wcm9ncmVzcyc6IGZhbHNlLFxuICAgIH0sXG4gICAgcGVybWlzc2lvbnM6IHtcbiAgICAgIC8vIGh0dHBzOi8vZG9jcy5ucG1qcy5jb20vdHJ1c3RlZC1wdWJsaXNoZXJzI3N0ZXAtMi1jb25maWd1cmUteW91ci1jaWNkLXdvcmtmbG93XG4gICAgICAnaWQtdG9rZW4nOiAnd3JpdGUnLFxuICAgICAgLy8gZm9yIHNlbWFudGljLXJlbGVhc2VcbiAgICAgIGNvbnRlbnRzOiAnd3JpdGUnLFxuICAgIH0sXG4gICAgam9iczoge1xuICAgICAgcmVsZWFzZToge1xuICAgICAgICB1c2VzOiAnV2lsbEJvb3N0ZXIvcmV1c2FibGUtd29ya2Zsb3dzLy5naXRodWIvd29ya2Zsb3dzL3JlbGVhc2UueW1sQG1haW4nLFxuICAgICAgfSxcbiAgICB9LFxuICB9LFxuICAnc2VtYW50aWMtcHInOiB7XG4gICAgbmFtZTogJ0xpbnQgUFIgdGl0bGUnLFxuICAgIG9uOiB7XG4gICAgICBwdWxsX3JlcXVlc3RfdGFyZ2V0OiB7XG4gICAgICAgIHR5cGVzOiBbJ29wZW5lZCcsICdlZGl0ZWQnLCAnc3luY2hyb25pemUnXSxcbiAgICAgIH0sXG4gICAgfSxcbiAgICBqb2JzOiB7XG4gICAgICAnc2VtYW50aWMtcHInOiB7XG4gICAgICAgIHVzZXM6ICdXaWxsQm9vc3Rlci9yZXVzYWJsZS13b3JrZmxvd3MvLmdpdGh1Yi93b3JrZmxvd3Mvc2VtYW50aWMtcHIueW1sQG1haW4nLFxuICAgICAgfSxcbiAgICB9LFxuICB9LFxuICBzeW5jOiB7XG4gICAgbmFtZTogJ1N5bmMnLFxuICAgIG9uOiB7fSxcbiAgICBwZXJtaXNzaW9uczoge1xuICAgICAgLy8gZm9yIGNvbW1pdGluZyBjaGFuZ2VzXG4gICAgICBjb250ZW50czogJ3dyaXRlJyxcbiAgICB9LFxuICAgIGpvYnM6IHtcbiAgICAgIHN5bmM6IHsgdXNlczogJ1dpbGxCb29zdGVyL3JldXNhYmxlLXdvcmtmbG93cy8uZ2l0aHViL3dvcmtmbG93cy9zeW5jLnltbEBtYWluJyB9LFxuICAgIH0sXG4gIH0sXG4gICdjbG9zZS1jb21tZW50Jzoge1xuICAgIG5hbWU6ICdBZGQgY2xvc2UgY29tbWVudCcsXG4gICAgb246IHtcbiAgICAgIHB1bGxfcmVxdWVzdDoge1xuICAgICAgICB0eXBlczogWydvcGVuZWQnXSxcbiAgICAgIH0sXG4gICAgfSxcbiAgICBqb2JzOiB7XG4gICAgICAnY2xvc2UtY29tbWVudCc6IHtcbiAgICAgICAgdXNlczogJ1dpbGxCb29zdGVyL3JldXNhYmxlLXdvcmtmbG93cy8uZ2l0aHViL3dvcmtmbG93cy9jbG9zZS1jb21tZW50LnltbEBtYWluJyxcbiAgICAgIH0sXG4gICAgfSxcbiAgfSxcbiAgJ2dlbi1wci1jbGF1ZGUnOiB7XG4gICAgbmFtZTogJ0dlbmVyYXRlIFBSIHdpdGggQ2xhdWRlIENvZGUnLFxuICAgIG9uOiB7XG4gICAgICBpc3N1ZXM6IHtcbiAgICAgICAgdHlwZXM6IFsnbGFiZWxlZCddLFxuICAgICAgfSxcbiAgICAgIHB1bGxfcmVxdWVzdDoge1xuICAgICAgICB0eXBlczogWydsYWJlbGVkJ10sXG4gICAgICB9LFxuICAgIH0sXG4gICAgam9iczoge1xuICAgICAgJ2dlbi1wcic6IHtcbiAgICAgICAgaWY6IFwiY29udGFpbnMoZ2l0aHViLmV2ZW50LmxhYmVsLm5hbWUsICdnZW4tcHItYWxsJykgfHwgY29udGFpbnMoZ2l0aHViLmV2ZW50LmxhYmVsLm5hbWUsICdnZW4tcHItY2xhdWRlJylcIixcbiAgICAgICAgdXNlczogJ1dpbGxCb29zdGVyL3JldXNhYmxlLXdvcmtmbG93cy8uZ2l0aHViL3dvcmtmbG93cy9nZW4tcHIueW1sQG1haW4nLFxuICAgICAgICB3aXRoOiB7XG4gICAgICAgICAgJ2NvZGluZy10b29sJzogJ2NsYXVkZS1jb2RlJyxcbiAgICAgICAgICAnaXNzdWUtbnVtYmVyJzogJyR7eyBnaXRodWIuZXZlbnQuaXNzdWUubnVtYmVyIHx8IGdpdGh1Yi5ldmVudC5udW1iZXIgfX0nLFxuICAgICAgICAgICd0ZXN0LWNvbW1hbmQnOiAneWFybnxidW4gY2hlY2stYWxsLWZvci1haScsXG4gICAgICAgIH0sXG4gICAgICAgIHNlY3JldHM6IHtcbiAgICAgICAgICBDTEFVREVfQ09ERV9PQVVUSF9UT0tFTjogJyR7eyBzZWNyZXRzLkNMQVVERV9DT0RFX09BVVRIX1RPS0VOIH19JyxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgfSxcbiAgfSxcbiAgJ2dlbi1wci1jb2RleCc6IHtcbiAgICBuYW1lOiAnR2VuZXJhdGUgUFIgd2l0aCBDb2RleCBDTEknLFxuICAgIG9uOiB7XG4gICAgICBpc3N1ZXM6IHtcbiAgICAgICAgdHlwZXM6IFsnbGFiZWxlZCddLFxuICAgICAgfSxcbiAgICAgIHB1bGxfcmVxdWVzdDoge1xuICAgICAgICB0eXBlczogWydsYWJlbGVkJ10sXG4gICAgICB9LFxuICAgIH0sXG4gICAgam9iczoge1xuICAgICAgJ2dlbi1wcic6IHtcbiAgICAgICAgaWY6IFwiY29udGFpbnMoZ2l0aHViLmV2ZW50LmxhYmVsLm5hbWUsICdnZW4tcHItYWxsJykgfHwgY29udGFpbnMoZ2l0aHViLmV2ZW50LmxhYmVsLm5hbWUsICdnZW4tcHItY29kZXgnKVwiLFxuICAgICAgICB1c2VzOiAnV2lsbEJvb3N0ZXIvcmV1c2FibGUtd29ya2Zsb3dzLy5naXRodWIvd29ya2Zsb3dzL2dlbi1wci55bWxAbWFpbicsXG4gICAgICAgIHdpdGg6IHtcbiAgICAgICAgICAnY29kaW5nLXRvb2wnOiAnY29kZXgtY2xpJyxcbiAgICAgICAgICAnaXNzdWUtbnVtYmVyJzogJyR7eyBnaXRodWIuZXZlbnQuaXNzdWUubnVtYmVyIHx8IGdpdGh1Yi5ldmVudC5udW1iZXIgfX0nLFxuICAgICAgICAgICd0ZXN0LWNvbW1hbmQnOiAneWFybnxidW4gY2hlY2stYWxsLWZvci1haScsXG4gICAgICAgIH0sXG4gICAgICAgIHNlY3JldHM6IHtcbiAgICAgICAgICBPUEVOQUlfQVBJX0tFWTogJyR7eyBzZWNyZXRzLk9QRU5BSV9BUElfS0VZIH19JyxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgfSxcbiAgfSxcbiAgJ2dlbi1wci1nZW1pbmknOiB7XG4gICAgbmFtZTogJ0dlbmVyYXRlIFBSIHdpdGggR2VtaW5pIENMSScsXG4gICAgb246IHtcbiAgICAgIGlzc3Vlczoge1xuICAgICAgICB0eXBlczogWydsYWJlbGVkJ10sXG4gICAgICB9LFxuICAgICAgcHVsbF9yZXF1ZXN0OiB7XG4gICAgICAgIHR5cGVzOiBbJ2xhYmVsZWQnXSxcbiAgICAgIH0sXG4gICAgfSxcbiAgICBqb2JzOiB7XG4gICAgICAnZ2VuLXByJzoge1xuICAgICAgICBpZjogXCJjb250YWlucyhnaXRodWIuZXZlbnQubGFiZWwubmFtZSwgJ2dlbi1wci1hbGwnKSB8fCBjb250YWlucyhnaXRodWIuZXZlbnQubGFiZWwubmFtZSwgJ2dlbi1wci1nZW1pbmknKVwiLFxuICAgICAgICB1c2VzOiAnV2lsbEJvb3N0ZXIvcmV1c2FibGUtd29ya2Zsb3dzLy5naXRodWIvd29ya2Zsb3dzL2dlbi1wci55bWxAbWFpbicsXG4gICAgICAgIHdpdGg6IHtcbiAgICAgICAgICAnY29kaW5nLXRvb2wnOiAnZ2VtaW5pLWNsaScsXG4gICAgICAgICAgJ2lzc3VlLW51bWJlcic6ICcke3sgZ2l0aHViLmV2ZW50Lmlzc3VlLm51bWJlciB8fCBnaXRodWIuZXZlbnQubnVtYmVyIH19JyxcbiAgICAgICAgICAndGVzdC1jb21tYW5kJzogJ3lhcm58YnVuIGNoZWNrLWFsbC1mb3ItYWknLFxuICAgICAgICB9LFxuICAgICAgICBzZWNyZXRzOiB7XG4gICAgICAgICAgR0VNSU5JX0FQSV9LRVk6ICcke3sgc2VjcmV0cy5HRU1JTklfQVBJX0tFWSB9fScsXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgIH0sXG4gIH0sXG59IGFzIGNvbnN0O1xuXG50eXBlIEtub3duS2luZCA9IGtleW9mIHR5cGVvZiB3b3JrZmxvd3MgfCAnZGVwbG95JyB8ICdhdXRvZml4JztcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlV29ya2Zsb3dzKHJvb3RDb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgZmlsZU5hbWVzVG9CZVJlbW92ZWQgPSBbXG4gICAgJ2FkZC1mb2N1c2VkLWlzc3VlLXRvLXByb2plY3QueW1sJyxcbiAgICAnYWRkLWlzc3VlLXRvLXByb2plY3QueW1sJyxcbiAgICAnYWRkLXJlYWR5LWlzc3VlLXRvLXByb2plY3QueW1sJyxcbiAgICAnbm90aWZ5LXJlYWR5LnltbCcsXG4gICAgJ3diZnkueW1sJyxcbiAgICAnd2JmeS1tZXJnZS55bWwnLFxuICBdO1xuXG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZ2VuZXJhdGVXb3JrZmxvdycsIGFzeW5jICgpID0+IHtcbiAgICBpZiAoaXNSZXVzYWJsZVdvcmtmbG93c1JlcG8ocm9vdENvbmZpZy5yZXBvc2l0b3J5KSkge1xuICAgICAgLy8gRG9uJ3QgdG91Y2ggcmV1c2FibGUtd29ya2Zsb3dzIHJlcG8gYmVjYXVzZSBpdCBob3N0cyB1cHN0cmVhbSB3b3JrZmxvdyBkZWZpbml0aW9ucy5cbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCB3b3JrZmxvd3NQYXRoID0gcGF0aC5yZXNvbHZlKHJvb3RDb25maWcuZGlyUGF0aCwgJy5naXRodWInLCAnd29ya2Zsb3dzJyk7XG4gICAgYXdhaXQgZnMucHJvbWlzZXMubWtkaXIod29ya2Zsb3dzUGF0aCwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG5cbiAgICAvLyBSZW1vdmUgY29uZmlnIG9mIHNlbWFudGljIHB1bGwgcmVxdWVzdFxuICAgIGNvbnN0IHNlbWFudGljWW1sUGF0aCA9IHBhdGgucmVzb2x2ZShyb290Q29uZmlnLmRpclBhdGgsICcuZ2l0aHViJywgJ3NlbWFudGljLnltbCcpO1xuICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiBmcy5wcm9taXNlcy5ybShzZW1hbnRpY1ltbFBhdGgsIHsgZm9yY2U6IHRydWUsIHJlY3Vyc2l2ZTogdHJ1ZSB9KSk7XG5cbiAgICBjb25zdCBlbnRyaWVzID0gYXdhaXQgZnMucHJvbWlzZXMucmVhZGRpcih3b3JrZmxvd3NQYXRoLCB7IHdpdGhGaWxlVHlwZXM6IHRydWUgfSk7XG4gICAgY29uc3QgZmlsZU5hbWVTZXQgPSBuZXcgU2V0KFtcbiAgICAgICd0ZXN0LnltbCcsXG4gICAgICAnYXV0b2ZpeC55bWwnLFxuICAgICAgJ3NlbWFudGljLXByLnltbCcsXG4gICAgICAnY2xvc2UtY29tbWVudC55bWwnLFxuICAgICAgJ2dlbi1wci1jbGF1ZGUueW1sJyxcbiAgICAgICdnZW4tcHItY29kZXgueW1sJyxcbiAgICAgICdnZW4tcHItZ2VtaW5pLnltbCcsXG4gICAgICAuLi5lbnRyaWVzLmZpbHRlcigoZGlyZW50KSA9PiBkaXJlbnQuaXNGaWxlKCkgJiYgZGlyZW50Lm5hbWUuZW5kc1dpdGgoJy55bWwnKSkubWFwKChkaXJlbnQpID0+IGRpcmVudC5uYW1lKSxcbiAgICBdKTtcbiAgICBpZiAocm9vdENvbmZpZy5kZXBlbmRpbmcuc2VtYW50aWNSZWxlYXNlKSB7XG4gICAgICBmaWxlTmFtZVNldC5hZGQoJ3JlbGVhc2UueW1sJyk7XG4gICAgfVxuICAgIGZpbGVOYW1lU2V0LmRlbGV0ZSgnYWRkLWlzc3VlLXRvLXByb2plY3QueW1sJyk7XG4gICAgZmlsZU5hbWVTZXQuZGVsZXRlKCdhZGQtcmVhZHktaXNzdWUtdG8tcHJvamVjdC55bWwnKTtcbiAgICBmaWxlTmFtZVNldC5kZWxldGUoJ25vdGlmeS1yZWFkeS55bWwnKTtcblxuICAgIGZvciAoY29uc3QgZmlsZU5hbWUgb2YgZmlsZU5hbWVTZXQpIHtcbiAgICAgIC8vIOWun+mam+OBr0tub3duS2luZOS7peWkluOBruWApOOCguS7o+WFpeOBleOCjOOCi+OBk+OBqOOBq+azqOaEj1xuICAgICAgY29uc3Qga2luZCA9IHBhdGguYmFzZW5hbWUoZmlsZU5hbWUsICcueW1sJykgYXMgS25vd25LaW5kO1xuICAgICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IHdyaXRlV29ya2Zsb3dZYW1sKHJvb3RDb25maWcsIHdvcmtmbG93c1BhdGgsIGtpbmQpKTtcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IGRlcHJlY2F0ZWRGaWxlTmFtZSBvZiBmaWxlTmFtZXNUb0JlUmVtb3ZlZCkge1xuICAgICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+XG4gICAgICAgIGZzLnByb21pc2VzLnJtKHBhdGguam9pbih3b3JrZmxvd3NQYXRoLCBkZXByZWNhdGVkRmlsZU5hbWUpLCB7IGZvcmNlOiB0cnVlLCByZWN1cnNpdmU6IHRydWUgfSlcbiAgICAgICk7XG4gICAgfVxuICB9KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzUmV1c2FibGVXb3JrZmxvd3NSZXBvKHJlcG9zaXRvcnk/OiBzdHJpbmcpOiBib29sZWFuIHtcbiAgcmV0dXJuIHJlcG9zaXRvcnk/LmVuZHNXaXRoKCcvcmV1c2FibGUtd29ya2Zsb3dzJykgPz8gZmFsc2U7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHdyaXRlV29ya2Zsb3dZYW1sKGNvbmZpZzogUGFja2FnZUNvbmZpZywgd29ya2Zsb3dzUGF0aDogc3RyaW5nLCBraW5kOiBLbm93bktpbmQpOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgZmlsZVBhdGggPSBwYXRoLmpvaW4od29ya2Zsb3dzUGF0aCwgYCR7a2luZH0ueW1sYCk7XG5cbiAgaWYgKGtpbmQgPT09ICdhdXRvZml4Jykge1xuICAgIGF3YWl0IHdyaXRlWWFtbChnZW5lcmF0ZUF1dG9maXhXb3JrZmxvdyhjb25maWcpLCBmaWxlUGF0aCk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgbGV0IG5ld1NldHRpbmdzID0gY2xvbmVEZWVwKGtpbmQgaW4gd29ya2Zsb3dzID8gd29ya2Zsb3dzW2tpbmQgYXMga2V5b2YgdHlwZW9mIHdvcmtmbG93c10gOiB7fSkgYXMgV29ya2Zsb3c7XG4gIC8vIFNraXAgYSBicm9rZW4gd29ya2Zsb3dcbiAgaWYgKCEoJ2pvYnMnIGluIG5ld1NldHRpbmdzKSkgcmV0dXJuO1xuXG4gIHRyeSB7XG4gICAgY29uc3Qgb2xkQ29udGVudCA9IGF3YWl0IGZzLnByb21pc2VzLnJlYWRGaWxlKGZpbGVQYXRoLCAndXRmOCcpO1xuICAgIGNvbnN0IG9sZFNldHRpbmdzID0geWFtbC5sb2FkKG9sZENvbnRlbnQpIGFzIFdvcmtmbG93O1xuICAgIG5ld1NldHRpbmdzID0gbWVyZ2UuYWxsKFtuZXdTZXR0aW5ncywgb2xkU2V0dGluZ3MsIG5ld1NldHRpbmdzXSwgeyBhcnJheU1lcmdlOiBjb21iaW5lTWVyZ2UgfSkgYXMgV29ya2Zsb3c7XG4gIH0gY2F0Y2gge1xuICAgIC8vIGRvIG5vdGhpbmdcbiAgfVxuXG4gIGlmIChraW5kLnN0YXJ0c1dpdGgoJ2RlcGxveScpKSB7XG4gICAgbmV3U2V0dGluZ3MgPSB7XG4gICAgICAuLi5uZXdTZXR0aW5ncyxcbiAgICAgIGNvbmN1cnJlbmN5OiB7XG4gICAgICAgIGdyb3VwOiAnJHt7IGdpdGh1Yi53b3JrZmxvdyB9fScsXG4gICAgICAgICdjYW5jZWwtaW4tcHJvZ3Jlc3MnOiBmYWxzZSxcbiAgICAgIH0sXG4gICAgfTtcbiAgICAvLyBNb3ZlIGpvYnMgdG8gdGhlIGJvdHRvbVxuICAgIG1vdmVUb0JvdHRvbShuZXdTZXR0aW5ncywgJ2pvYnMnKTtcbiAgICBpZiAobmV3U2V0dGluZ3Mub24/LnB1c2gpIHtcbiAgICAgIG5ld1NldHRpbmdzLm9uLnB1c2hbJ3BhdGhzLWlnbm9yZSddID0gW1xuICAgICAgICAuLi5uZXcgU2V0KFsnKioubWQnLCAnKiovZG9jcy8qKicsIC4uLihuZXdTZXR0aW5ncy5vbi5wdXNoWydwYXRocy1pZ25vcmUnXSA/PyBbXSldKSxcbiAgICAgIF07XG4gICAgfVxuICB9XG5cbiAgbGV0IGlzUmV1c2FibGVXb3JrZmxvdyA9IGZhbHNlO1xuICBmb3IgKGNvbnN0IGpvYiBvZiBPYmplY3QudmFsdWVzKG5ld1NldHRpbmdzLmpvYnMpKSB7XG4gICAgLy8gSWdub3JlIG5vbi1yZXVzYWJsZSB3b3JrZmxvd3NcbiAgICBpZiAoIWpvYi51c2VzPy5pbmNsdWRlcygnL3JldXNhYmxlLXdvcmtmbG93cy8nKSkgY29udGludWU7XG5cbiAgICBub3JtYWxpemVKb2IoY29uZmlnLCBqb2IsIGtpbmQpO1xuICAgIGlzUmV1c2FibGVXb3JrZmxvdyA9IHRydWU7XG4gIH1cbiAgaWYgKCFpc1JldXNhYmxlV29ya2Zsb3cpIHJldHVybjtcblxuICBzd2l0Y2ggKGtpbmQpIHtcbiAgICBjYXNlICdyZWxlYXNlJzoge1xuICAgICAgaWYgKG5ld1NldHRpbmdzLm9uPy5zY2hlZHVsZSkge1xuICAgICAgICBkZWxldGUgbmV3U2V0dGluZ3Mub24ucHVzaDtcbiAgICAgIH0gZWxzZSBpZiAobmV3U2V0dGluZ3Mub24/LnB1c2ggJiYgY29uZmlnLnJlbGVhc2UuYnJhbmNoZXMubGVuZ3RoID4gMCkge1xuICAgICAgICBuZXdTZXR0aW5ncy5vbi5wdXNoLmJyYW5jaGVzID0gY29uZmlnLnJlbGVhc2UuYnJhbmNoZXM7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBEb24ndCB1c2UgcmVsZWFzZS55bWwgaWYgcmVsZWFzZSBicmFuY2ggaXMgbm90IHNwZWNpZmllZFxuICAgICAgICBhd2FpdCBmcy5wcm9taXNlcy5ybShwYXRoLmpvaW4od29ya2Zsb3dzUGF0aCwgJ3JlbGVhc2UueW1sJyksIHsgZm9yY2U6IHRydWUgfSk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgICBjYXNlICd0ZXN0Jzoge1xuICAgICAgLy8gRG9uJ3QgdXNlIGBwYXRocy1pZ25vcmVgIGZvciB0ZXN0IGJlY2F1c2UgR2l0SHViJ3MgQnJhbmNoIFByb3RlY3Rpb24gYW5kIFJ1bGVzZXRzIHJlcXVpcmUgam9iIHJ1bm5pbmcuXG4gICAgICBpZiAobmV3U2V0dGluZ3Mub24/LnB1bGxfcmVxdWVzdCkge1xuICAgICAgICBkZWxldGUgbmV3U2V0dGluZ3Mub24ucHVsbF9yZXF1ZXN0WydwYXRocy1pZ25vcmUnXTtcbiAgICAgIH1cbiAgICAgIGlmIChuZXdTZXR0aW5ncy5vbj8ucHVzaCkge1xuICAgICAgICBkZWxldGUgbmV3U2V0dGluZ3Mub24ucHVzaFsncGF0aHMtaWdub3JlJ107XG4gICAgICAgIG5ld1NldHRpbmdzLm9uLnB1c2guYnJhbmNoZXMgPSBuZXdTZXR0aW5ncy5vbi5wdXNoLmJyYW5jaGVzLmZpbHRlcigoYnJhbmNoKSA9PiBicmFuY2ggIT09ICdyZW5vdmF0ZS8qKicpO1xuICAgICAgfVxuICAgICAgYnJlYWs7XG4gICAgfVxuICAgIC8vIE5vIGRlZmF1bHRcbiAgfVxuICBtaWdyYXRlV29ya2Zsb3cobmV3U2V0dGluZ3MpO1xuICBhd2FpdCB3cml0ZVlhbWwobmV3U2V0dGluZ3MsIGZpbGVQYXRoKTtcblxuICBpZiAoa2luZCA9PT0gJ3JlbGVhc2UnKSB7XG4gICAgYXdhaXQgZnMucHJvbWlzZXMucm0ocGF0aC5qb2luKHdvcmtmbG93c1BhdGgsICdzZW1hbnRpYy1yZWxlYXNlLnltbCcpLCB7IGZvcmNlOiB0cnVlIH0pO1xuICB9IGVsc2UgaWYgKGtpbmQgPT09ICdzeW5jJykge1xuICAgIGF3YWl0IGZzLnByb21pc2VzLnJtKHBhdGguam9pbih3b3JrZmxvd3NQYXRoLCAnc3luYy1pbml0LnltbCcpLCB7IGZvcmNlOiB0cnVlIH0pO1xuICAgIGlmICghbmV3U2V0dGluZ3Muam9icy5zeW5jPy53aXRoKSByZXR1cm47XG5cbiAgICAvLyBHZW5lcmF0ZSBzeW5jLWZvcmNlLnltbCBiYXNlZCBvbiBzeW5jLnltbCBpZiBpdCBleGlzdHMuXG4gICAgbmV3U2V0dGluZ3Muam9ic1snc3luYy1mb3JjZSddID0gbmV3U2V0dGluZ3Muam9icy5zeW5jO1xuICAgIGNvbnN0IHBhcmFtcyA9IG5ld1NldHRpbmdzLmpvYnMuc3luYy53aXRoLnN5bmNfcGFyYW1zX3dpdGhvdXRfZGVzdDtcbiAgICBpZiAodHlwZW9mIHBhcmFtcyAhPT0gJ3N0cmluZycpIHJldHVybjtcblxuICAgIG5ld1NldHRpbmdzLmpvYnMuc3luYy53aXRoLnN5bmNfcGFyYW1zX3dpdGhvdXRfZGVzdCA9IGAtLWZvcmNlICR7cGFyYW1zfWA7XG4gICAgbmV3U2V0dGluZ3MubmFtZSA9ICdGb3JjZSB0byBTeW5jJztcbiAgICBuZXdTZXR0aW5ncy5vbiA9IHsgd29ya2Zsb3dfZGlzcGF0Y2g6IG51bGwgfTtcbiAgICBkZWxldGUgbmV3U2V0dGluZ3Muam9icy5zeW5jO1xuICAgIGF3YWl0IHdyaXRlWWFtbChuZXdTZXR0aW5ncywgcGF0aC5qb2luKHdvcmtmbG93c1BhdGgsICdzeW5jLWZvcmNlLnltbCcpKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBub3JtYWxpemVKb2IoY29uZmlnOiBQYWNrYWdlQ29uZmlnLCBqb2I6IEpvYiwga2luZDogS25vd25LaW5kKTogdm9pZCB7XG4gIGpvYi53aXRoID8/PSB7fTtcbiAgam9iLnNlY3JldHMgPz89IHt9O1xuICAvLyBVc2UgdHJ1c3RlZCBwdWJsaXNoaW5nIGluc3RlYWQgb2YgTlBNX1RPS0VOXG4gIGRlbGV0ZSBqb2Iuc2VjcmV0cy5OUE1fVE9LRU47XG5cbiAgaWYgKFxuICAgIGtpbmQgPT09ICd0ZXN0JyB8fFxuICAgIGtpbmQgPT09ICdyZWxlYXNlJyB8fFxuICAgIGtpbmQgPT09ICdnZW4tcHItY2xhdWRlJyB8fFxuICAgIGtpbmQgPT09ICdnZW4tcHItY29kZXgnIHx8XG4gICAga2luZCA9PT0gJ2dlbi1wci1nZW1pbmknXG4gICkge1xuICAgIGpvYi5zZWNyZXRzLkdIX1RPS0VOID0gJyR7eyBzZWNyZXRzLkdJVEhVQl9UT0tFTiB9fSc7XG4gIH1cblxuICAvLyBTZXQgdGVzdC1jb21tYW5kIGZvciBnZW4tcHIgd29ya2Zsb3dzIGJhc2VkIG9uIHBhY2thZ2UgbWFuYWdlclxuICBpZiAoa2luZCA9PT0gJ2dlbi1wci1jbGF1ZGUnIHx8IGtpbmQgPT09ICdnZW4tcHItY29kZXgnIHx8IGtpbmQgPT09ICdnZW4tcHItZ2VtaW5pJykge1xuICAgIGpvYi53aXRoWyd0ZXN0LWNvbW1hbmQnXSA9IGNvbmZpZy5pc0J1biA/ICdidW4gcnVuIGNoZWNrLWFsbC1mb3ItYWknIDogJ3lhcm4gY2hlY2stYWxsLWZvci1haSc7XG4gIH1cbiAgaWYgKGpvYi5zZWNyZXRzLkZJUkVCQVNFX1RPS0VOKSB7XG4gICAgam9iLnNlY3JldHMuR0NQX1NBX0tFWV9KU09OX0ZPUl9GSVJFQkFTRSA9ICcke3sgc2VjcmV0cy5HQ1BfU0FfS0VZX0pTT05fRk9SX0ZJUkVCQVNFIH19JztcbiAgICBkZWxldGUgam9iLnNlY3JldHMuRklSRUJBU0VfVE9LRU47XG4gIH1cbiAgaWYgKFxuICAgIChqb2Iuc2VjcmV0cy5ESVNDT1JEX1dFQkhPT0tfVVJMICYmIChraW5kID09PSAncmVsZWFzZScgfHwga2luZC5zdGFydHNXaXRoKCdkZXBsb3knKSkpIHx8XG4gICAgKGpvYi53aXRoLnNlcnZlcl91cmwgJiYga2luZC5zdGFydHNXaXRoKCdkZXBsb3knKSlcbiAgKSB7XG4gICAgam9iLnNlY3JldHMuRElTQ09SRF9XRUJIT09LX1VSTCA9ICcke3sgc2VjcmV0cy5ESVNDT1JEX1dFQkhPT0tfVVJMX0ZPUl9SRUxFQVNFIH19JztcbiAgfVxuXG4gIGlmIChraW5kID09PSAnc3luYycpIHtcbiAgICBjb25zdCBwYXJhbXMgPSBqb2Iud2l0aC5zeW5jX3BhcmFtc193aXRob3V0X2Rlc3Q7XG4gICAgaWYgKHR5cGVvZiBwYXJhbXMgPT09ICdzdHJpbmcnKSB7XG4gICAgICBqb2Iud2l0aC5zeW5jX3BhcmFtc193aXRob3V0X2Rlc3QgPSBwYXJhbXMucmVwbGFjZSgnc3luYyAnLCAnJyk7XG4gICAgfVxuICB9XG5cbiAgaWYgKGNvbmZpZy5yZXBvc2l0b3J5Py5zdGFydHNXaXRoKCdnaXRodWI6V2lsbEJvb3N0ZXIvJykpIHtcbiAgICBqb2IudXNlcyA9IGpvYi51c2VzPy5yZXBsYWNlKCdXaWxsQm9vc3RlckxhYi8nLCAnV2lsbEJvb3N0ZXIvJyk7XG4gIH0gZWxzZSBpZiAoY29uZmlnLnJlcG9zaXRvcnk/LnN0YXJ0c1dpdGgoJ2dpdGh1YjpXaWxsQm9vc3RlckxhYi8nKSkge1xuICAgIGpvYi51c2VzID0gam9iLnVzZXM/LnJlcGxhY2UoJ1dpbGxCb29zdGVyLycsICdXaWxsQm9vc3RlckxhYi8nKTtcbiAgfVxuXG4gIC8vIFJlbW92ZSByZWR1bmRhbnQgcGFyYW1ldGVyc1xuICBpZiAoam9iLndpdGguZG90X2Vudl9wYXRoID09PSAnLmVudicpIHtcbiAgICBkZWxldGUgam9iLndpdGguZG90X2Vudl9wYXRoO1xuICB9XG4gIC8vIFJlbW92ZSBkZXByZWNhdGVkIHBhcmFtZXRlcnNcbiAgbWlncmF0ZUpvYihqb2IpO1xuXG4gIC8vIERvbid0IHVzZSBgZmx5IGRlcGxveSAtLWpzb25gIHNpbmNlIGl0IGNhdXNlcyBhbiBlcnJvclxuICBpZiAoa2luZC5zdGFydHNXaXRoKCdkZXBsb3knKSAmJiBqb2Iuc2VjcmV0cy5GTFlfQVBJX1RPS0VOICYmIHR5cGVvZiBqb2Iud2l0aC5kZXBsb3lfY29tbWFuZCA9PT0gJ3N0cmluZycpIHtcbiAgICBqb2Iud2l0aC5kZXBsb3lfY29tbWFuZCA9IGpvYi53aXRoLmRlcGxveV9jb21tYW5kLnJlcGxhY2UoL1xccystLWpzb24vLCAnJyk7XG4gIH1cbiAgaWYgKGNvbmZpZy5kb2VzQ29udGFpbkRvY2tlcmZpbGUgJiYgIWpvYi53aXRoLmNpX2xhYmVsICYmIGtpbmQuc3RhcnRzV2l0aCgndGVzdCcpKSB7XG4gICAgam9iLndpdGguY2lfbGFiZWwgPSAnbGFyZ2UnO1xuICB9XG4gIC8vIEJlY2F1c2UgZ2l0aHViLmV2ZW50LnJlcG9zaXRvcnkucHJpdmF0ZSBpcyBhbHdheXMgdHJ1ZSBpZiBqb2IgaXMgc2NoZWR1bGVkXG4gIGlmIChraW5kID09PSAncmVsZWFzZScgfHwga2luZCA9PT0gJ3Rlc3QnIHx8IGtpbmQuc3RhcnRzV2l0aCgnZGVwbG95JykpIHtcbiAgICBpZiAoY29uZmlnLmlzUHVibGljUmVwbykge1xuICAgICAgam9iLndpdGguZ2l0aHViX2hvc3RlZF9ydW5uZXIgPSB0cnVlO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBkZWxldGUgam9iLndpdGguZ2l0aHViX2hvc3RlZF9ydW5uZXI7XG4gIH1cblxuICBpZiAoT2JqZWN0LmtleXMoam9iLndpdGgpLmxlbmd0aCA+IDApIHtcbiAgICBzb3J0S2V5cyhqb2Iud2l0aCk7XG4gIH0gZWxzZSB7XG4gICAgZGVsZXRlIGpvYi53aXRoO1xuICB9XG4gIGlmIChPYmplY3Qua2V5cyhqb2Iuc2VjcmV0cykubGVuZ3RoID4gMCkge1xuICAgIC8vIE1vdmUgc2VjcmV0cyBwcm9wIGFmdGVyIHdpdGggcHJvcFxuICAgIGNvbnN0IG5ld1NlY3JldHMgPSBzb3J0S2V5cyhqb2Iuc2VjcmV0cyk7XG4gICAgZGVsZXRlIGpvYi5zZWNyZXRzO1xuICAgIGpvYi5zZWNyZXRzID0gbmV3U2VjcmV0cztcbiAgfSBlbHNlIHtcbiAgICBkZWxldGUgam9iLnNlY3JldHM7XG4gIH1cbn1cblxuZnVuY3Rpb24gZ2VuZXJhdGVBdXRvZml4V29ya2Zsb3coY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogV29ya2Zsb3cge1xuICBpZiAoIWNvbmZpZy5pc1B1YmxpY1JlcG8pIHtcbiAgICByZXR1cm4gY2xvbmVEZWVwKHByaXZhdGVSZXBvQXV0b2ZpeFdvcmtmbG93KTtcbiAgfVxuXG4gIGNvbnN0IHBhY2thZ2VNYW5hZ2VyID0gY29uZmlnLmlzQnVuID8gJ2J1bicgOiAneWFybic7XG4gIGNvbnN0IHN0ZXBzOiBTdGVwW10gPSBbXG4gICAgeyB1c2VzOiAnYWN0aW9ucy9jaGVja291dEB2NicgfSxcbiAgICB7IHVzZXM6ICdhY3Rpb25zL3NldHVwLW5vZGVAdjYnLCB3aXRoOiB7ICdjaGVjay1sYXRlc3QnOiB0cnVlIH0gfSxcbiAgICAuLi4oY29uZmlnLmlzQnVuID8gW3sgdXNlczogJ292ZW4tc2gvc2V0dXAtYnVuQHYxJywgd2l0aDogeyAnYnVuLXZlcnNpb24nOiAnbGF0ZXN0JyB9IH1dIDogW10pLFxuICAgIHsgcnVuOiBgJHtwYWNrYWdlTWFuYWdlcn0gaW5zdGFsbGAgfSxcbiAgICB7IHJ1bjogYCR7cGFja2FnZU1hbmFnZXJ9IHJ1biBjbGVhbnVwYCB9LFxuICBdO1xuICBpZiAoY29uZmlnLnBhY2thZ2VKc29uPy5zY3JpcHRzPy5idWlsZCkge1xuICAgIHN0ZXBzLnB1c2goeyBydW46IGAke3BhY2thZ2VNYW5hZ2VyfSBydW4gYnVpbGRgIH0pO1xuICB9XG4gIHN0ZXBzLnB1c2goeyB1c2VzOiAnYXV0b2ZpeC1jaS9hY3Rpb25AdjEnIH0pO1xuXG4gIGNvbnN0IGF1dG9maXhXb3JrZmxvdyA9IGNsb25lRGVlcChwdWJsaWNSZXBvQXV0b2ZpeFdvcmtmbG93KTtcbiAgY29uc3QgYXV0b2ZpeEpvYiA9IGF1dG9maXhXb3JrZmxvdy5qb2JzLmF1dG9maXggPz8geyAncnVucy1vbic6ICd1YnVudHUtbGF0ZXN0JyB9O1xuICBhdXRvZml4V29ya2Zsb3cuam9icy5hdXRvZml4ID0geyAuLi5hdXRvZml4Sm9iLCBzdGVwcyB9O1xuICByZXR1cm4gYXV0b2ZpeFdvcmtmbG93O1xufVxuXG5hc3luYyBmdW5jdGlvbiB3cml0ZVlhbWwobmV3U2V0dGluZ3M6IFdvcmtmbG93LCBmaWxlUGF0aDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IHlhbWxUZXh0ID0geWFtbC5kdW1wKG5ld1NldHRpbmdzLCB7IGxpbmVXaWR0aDogLTEsIG5vQ29tcGF0TW9kZTogdHJ1ZSwgc3R5bGVzOiB7ICchIW51bGwnOiAnZW1wdHknIH0gfSk7XG4gIGF3YWl0IGZzLnByb21pc2VzLndyaXRlRmlsZShmaWxlUGF0aCwgeWFtbFRleHQpO1xufVxuXG5mdW5jdGlvbiBtaWdyYXRlV29ya2Zsb3cobmV3U2V0dGluZ3M6IFdvcmtmbG93KTogdm9pZCB7XG4gIC8vIFRPRE86IFJlbW92ZSB0aGVtIGFmdGVyIDIwMjMtMDMtMzFcbiAgZGVsZXRlIG5ld1NldHRpbmdzLmpvYnNbJ2FkZC10by1wcm9qZWN0J107XG59XG5cbmZ1bmN0aW9uIG1pZ3JhdGVKb2Ioam9iOiBKb2IpOiB2b2lkIHtcbiAgLy8gVE9ETzogUmVtb3ZlIHRoZW0gYWZ0ZXIgMjAyMy0wMy0zMVxuICBpZiAoIWpvYi53aXRoKSByZXR1cm47XG4gIGRlbGV0ZSBqb2Iud2l0aC5ub25fc2VsZl9ob3N0ZWQ7XG4gIGRlbGV0ZSBqb2Iud2l0aC5ub3RpZnlfZGlzY29yZDtcbiAgZGVsZXRlIGpvYi53aXRoLnJlcXVpcmVfZmx5O1xuICBkZWxldGUgam9iLndpdGgucmVxdWlyZV9nY2xvdWQ7XG4gIGRlbGV0ZSBqb2Iud2l0aC5sYWJlbDtcbiAgZGVsZXRlIGpvYi53aXRoLmxhYmVsT3BlcmF0b3I7XG4gIC8vIEFkZGVkIDIwMjUtMDgtMDZcbiAgaWYgKGpvYi53aXRoLmNpX3NpemUpIHtcbiAgICBqb2Iud2l0aC5jaV9sYWJlbCA9IGpvYi53aXRoLmNpX3NpemU7XG4gICAgZGVsZXRlIGpvYi53aXRoLmNpX3NpemU7XG4gIH1cbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCBmZyBmcm9tICdmYXN0LWdsb2InO1xuXG5pbXBvcnQgeyBpc1JldXNhYmxlV29ya2Zsb3dzUmVwbyB9IGZyb20gJy4uL2dlbmVyYXRvcnMvd29ya2Zsb3cuanMnO1xuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB7IG9wdGlvbnMgfSBmcm9tICcuLi9vcHRpb25zLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZnNVdGlsIH0gZnJvbSAnLi4vdXRpbHMvZnNVdGlsLmpzJztcbmltcG9ydCB7IGdsb2JJZ25vcmUgfSBmcm9tICcuLi91dGlscy9nbG9iVXRpbC5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGZpeFR5cG9zKHBhY2thZ2VDb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdmaXhUeXBvcycsIGFzeW5jICgpID0+IHtcbiAgICBpZiAoaXNSZXVzYWJsZVdvcmtmbG93c1JlcG8ocGFja2FnZUNvbmZpZy5yZXBvc2l0b3J5KSkgcmV0dXJuO1xuXG4gICAgY29uc3QgZGlyUGF0aCA9IHBhY2thZ2VDb25maWcuZGlyUGF0aDtcbiAgICBjb25zdCBkb2NGaWxlcyA9IGF3YWl0IGZnLmdsb2IoJyoqLyoubWQnLCB7IGRvdDogdHJ1ZSwgY3dkOiBkaXJQYXRoLCBpZ25vcmU6IGdsb2JJZ25vcmUgfSk7XG4gICAgaWYgKG9wdGlvbnMuaXNWZXJib3NlKSB7XG4gICAgICBjb25zb2xlLmluZm8oYEZvdW5kICR7ZG9jRmlsZXMubGVuZ3RofSBtYXJrZG93biBmaWxlcyBpbiAke2RpclBhdGh9YCk7XG4gICAgfVxuICAgIGZvciAoY29uc3QgbWRGaWxlIG9mIGRvY0ZpbGVzKSB7XG4gICAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGguam9pbihkaXJQYXRoLCBtZEZpbGUpO1xuICAgICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKGFzeW5jICgpID0+IHtcbiAgICAgICAgY29uc3QgY29udGVudCA9IGF3YWl0IGZzLnByb21pc2VzLnJlYWRGaWxlKGZpbGVQYXRoLCAndXRmOCcpO1xuICAgICAgICBsZXQgbmV3Q29udGVudCA9IGZpeFR5cG9zSW5UZXh0KGNvbnRlbnQpO1xuICAgICAgICBuZXdDb250ZW50ID0gcmVwbGFjZVdpdGhDb25maWcobmV3Q29udGVudCwgcGFja2FnZUNvbmZpZywgJ2RvYycpO1xuICAgICAgICBpZiAoY29udGVudCAhPT0gbmV3Q29udGVudCkge1xuICAgICAgICAgIGF3YWl0IGZzVXRpbC5nZW5lcmF0ZUZpbGUoZmlsZVBhdGgsIG5ld0NvbnRlbnQpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBjb25zdCB0c0ZpbGVzID0gYXdhaXQgZmcuZ2xvYihcbiAgICAgIFtcbiAgICAgICAgJ3thcHAsc3JjLHRlc3Qsc2NyaXB0c30vKiovKi57Y2pzLG1qcyxqcyxqc3gsY3RzLG10cyx0cyx0c3h9JyxcbiAgICAgICAgJ3BhY2thZ2VzLyoqL3thcHAsc3JjLHRlc3Qsc2NyaXB0c30vKiovKi57Y2pzLG1qcyxqcyxqc3gsY3RzLG10cyx0cyx0c3h9JyxcbiAgICAgIF0sXG4gICAgICB7IGRvdDogdHJ1ZSwgY3dkOiBkaXJQYXRoLCBpZ25vcmU6IGdsb2JJZ25vcmUgfVxuICAgICk7XG4gICAgaWYgKG9wdGlvbnMuaXNWZXJib3NlKSB7XG4gICAgICBjb25zb2xlLmluZm8oYEZvdW5kICR7dHNGaWxlcy5sZW5ndGh9IFR5cGVTY3JpcHQgZmlsZXMgaW4gJHtkaXJQYXRofWApO1xuICAgIH1cbiAgICBmb3IgKGNvbnN0IHRzRmlsZSBvZiB0c0ZpbGVzKSB7XG4gICAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGguam9pbihkaXJQYXRoLCB0c0ZpbGUpO1xuICAgICAgY29uc3Qgb2xkQ29udGVudCA9IGF3YWl0IGZzLnByb21pc2VzLnJlYWRGaWxlKGZpbGVQYXRoLCAndXRmOCcpO1xuICAgICAgbGV0IG5ld0NvbnRlbnQgPSBmaXhUeXBvc0luQ29kZShvbGRDb250ZW50KTtcbiAgICAgIG5ld0NvbnRlbnQgPSByZXBsYWNlV2l0aENvbmZpZyhuZXdDb250ZW50LCBwYWNrYWdlQ29uZmlnLCAndHMnKTtcblxuICAgICAgaWYgKG9sZENvbnRlbnQgPT09IG5ld0NvbnRlbnQpIGNvbnRpbnVlO1xuICAgICAgYXdhaXQgZnNVdGlsLmdlbmVyYXRlRmlsZShmaWxlUGF0aCwgbmV3Q29udGVudCk7XG4gICAgfVxuXG4gICAgY29uc3QgdGV4dEJhc2VkRmlsZXMgPSBhd2FpdCBmZy5nbG9iKCcqKi8qLntjc3YsaHRtLGh0bWwsdHN2LHhtbCx5YW1sLHltbH0nLCB7XG4gICAgICBkb3Q6IHRydWUsXG4gICAgICBjd2Q6IGRpclBhdGgsXG4gICAgICBpZ25vcmU6IGdsb2JJZ25vcmUsXG4gICAgfSk7XG4gICAgaWYgKG9wdGlvbnMuaXNWZXJib3NlKSB7XG4gICAgICBjb25zb2xlLmluZm8oYEZvdW5kICR7dGV4dEJhc2VkRmlsZXMubGVuZ3RofSB0ZXh0LWJhc2VkIGZpbGVzIGluICR7ZGlyUGF0aH1gKTtcbiAgICB9XG4gICAgZm9yIChjb25zdCBmaWxlIG9mIHRleHRCYXNlZEZpbGVzKSB7XG4gICAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGguam9pbihkaXJQYXRoLCBmaWxlKTtcbiAgICAgIGNvbnN0IG9sZENvbnRlbnQgPSBhd2FpdCBmcy5wcm9taXNlcy5yZWFkRmlsZShmaWxlUGF0aCwgJ3V0ZjgnKTtcbiAgICAgIGxldCBuZXdDb250ZW50ID0gZml4VHlwb3NJblRleHQob2xkQ29udGVudCk7XG4gICAgICBuZXdDb250ZW50ID0gcmVwbGFjZVdpdGhDb25maWcobmV3Q29udGVudCwgcGFja2FnZUNvbmZpZywgJ3RleHQnKTtcblxuICAgICAgaWYgKG9sZENvbnRlbnQgPT09IG5ld0NvbnRlbnQpIGNvbnRpbnVlO1xuICAgICAgYXdhaXQgZnNVdGlsLmdlbmVyYXRlRmlsZShmaWxlUGF0aCwgbmV3Q29udGVudCk7XG4gICAgfVxuXG4gICAgYXdhaXQgcHJvbWlzZVBvb2wucHJvbWlzZUFsbCgpO1xuICB9KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGZpeFR5cG9zSW5UZXh0KGNvbnRlbnQ6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiBjb250ZW50XG4gICAgLnJlcGxhY2VBbGwoL1xcYmNcXC5mXFwuKFteJF0pL2csICdjZi4kMScpXG4gICAgLnJlcGxhY2VBbGwoL1xcYmVnXFwuKFteJF0pL2csICdlLmcuJDEnKVxuICAgIC5yZXBsYWNlQWxsKC9cXGJpZVxcLihbXiRdKS9nLCAnaS5lLiQxJyk7XG59XG5cbmZ1bmN0aW9uIGZpeFR5cG9zSW5Db2RlKGNvbnRlbnQ6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiBjb250ZW50XG4gICAgLnJlcGxhY2VBbGwoL1xcL1xcLyguKiljXFwuZlxcLi9nLCAnLy8kMWNmLicpXG4gICAgLnJlcGxhY2VBbGwoL1xcL1xcLyguKillZ1xcLi9nLCAnLy8kMWUuZy4nKVxuICAgIC5yZXBsYWNlQWxsKC9cXC9cXC8oLiopaWVcXC4vZywgJy8vJDFpLmUuJyk7XG59XG5cbmZ1bmN0aW9uIHJlcGxhY2VXaXRoQ29uZmlnKG5ld0NvbnRlbnQ6IHN0cmluZywgcGFja2FnZUNvbmZpZzogUGFja2FnZUNvbmZpZywgcHJvcE5hbWU6ICdkb2MnIHwgJ3RzJyB8ICd0ZXh0Jyk6IHN0cmluZyB7XG4gIGZvciAoY29uc3QgW2JlZm9yZSwgYWZ0ZXJdIG9mIE9iamVjdC5lbnRyaWVzKHBhY2thZ2VDb25maWcud2JmeUpzb24/LnR5cG9zPy5hbGwgPz8ge30pKSB7XG4gICAgbmV3Q29udGVudCA9IG5ld0NvbnRlbnQucmVwbGFjZUFsbChiZWZvcmUsIGFmdGVyKTtcbiAgfVxuICBmb3IgKGNvbnN0IFtiZWZvcmUsIGFmdGVyXSBvZiBPYmplY3QuZW50cmllcyhwYWNrYWdlQ29uZmlnLndiZnlKc29uPy50eXBvcz8uW3Byb3BOYW1lXSA/PyB7fSkpIHtcbiAgICBuZXdDb250ZW50ID0gbmV3Q29udGVudC5yZXBsYWNlQWxsKGJlZm9yZSwgYWZ0ZXIpO1xuICB9XG4gIHJldHVybiBuZXdDb250ZW50O1xufVxuIiwiaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZnNVdGlsIH0gZnJvbSAnLi4vdXRpbHMvZnNVdGlsLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVBZ2VudEluc3RydWN0aW9ucyhyb290Q29uZmlnOiBQYWNrYWdlQ29uZmlnLCBhbGxDb25maWdzOiBQYWNrYWdlQ29uZmlnW10pOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdnZW5lcmF0ZUFnZW50SW5zdHJ1Y3Rpb25zJywgYXN5bmMgKCkgPT4ge1xuICAgIGlmICghcm9vdENvbmZpZy5pc1Jvb3QpIHJldHVybjtcblxuICAgIC8vIENoZWNrIGlmIEFHRU5UU19FWFRSQS5tZCBleGlzdHMgYW5kIHJlYWQgaXRzIGNvbnRlbnRcbiAgICBjb25zdCBhZ2VudHNFeHRyYVBhdGggPSBwYXRoLnJlc29sdmUocm9vdENvbmZpZy5kaXJQYXRoLCAnQUdFTlRTX0VYVFJBLm1kJyk7XG4gICAgY29uc3QgZXh0cmFDb250ZW50ID0gYXdhaXQgZnNVdGlsLnJlYWRGaWxlSWdub3JpbmdFcnJvcihhZ2VudHNFeHRyYVBhdGgpO1xuXG4gICAgZm9yIChjb25zdCBbZmlsZU5hbWUsIHRvb2xOYW1lXSBvZiBbXG4gICAgICBbJ0FHRU5UUy5tZCcsICdDb2RleCBDTEknXSxcbiAgICAgIFsnQ0xBVURFLm1kJywgJ0NsYXVkZSBDb2RlJ10sXG4gICAgICBbJ0dFTUlOSS5tZCcsICdHZW1pbmkgQ0xJJ10sXG4gICAgXSBhcyBjb25zdCkge1xuICAgICAgY29uc3QgY29udGVudCA9IGdlbmVyYXRlQWdlbnRJbnN0cnVjdGlvbihyb290Q29uZmlnLCBhbGxDb25maWdzLCB0b29sTmFtZSwgZXh0cmFDb250ZW50KTtcbiAgICAgIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKHJvb3RDb25maWcuZGlyUGF0aCwgZmlsZU5hbWUpO1xuICAgICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzVXRpbC5nZW5lcmF0ZUZpbGUoZmlsZVBhdGgsIGNvbnRlbnQpKTtcbiAgICB9XG5cbiAgICBjb25zdCBjdXJzb3JSdWxlc1BhdGggPSBwYXRoLnJlc29sdmUocm9vdENvbmZpZy5kaXJQYXRoLCAnLmN1cnNvci9ydWxlcy9nZW5lcmFsLm1kYycpO1xuICAgIGNvbnN0IGN1cnNvclJ1bGVzQ29udGVudCA9IGdlbmVyYXRlQ3Vyc29yR2VuZXJhbE1kY0NvbnRlbnQocm9vdENvbmZpZywgYWxsQ29uZmlncywgZXh0cmFDb250ZW50KTtcbiAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnNVdGlsLmdlbmVyYXRlRmlsZShjdXJzb3JSdWxlc1BhdGgsIGN1cnNvclJ1bGVzQ29udGVudCkpO1xuICB9KTtcbn1cblxuZnVuY3Rpb24gZ2VuZXJhdGVBZ2VudEluc3RydWN0aW9uKFxuICByb290Q29uZmlnOiBQYWNrYWdlQ29uZmlnLFxuICBhbGxDb25maWdzOiBQYWNrYWdlQ29uZmlnW10sXG4gIHRvb2xOYW1lOiBzdHJpbmcsXG4gIGV4dHJhQ29udGVudD86IHN0cmluZ1xuKTogc3RyaW5nIHtcbiAgY29uc3QgcGFja2FnZU1hbmFnZXIgPSByb290Q29uZmlnLmlzQnVuID8gJ2J1bicgOiAneWFybic7XG4gIGNvbnN0IGJhc2VDb250ZW50ID0gYFxuIyMgUHJvamVjdCBJbmZvcm1hdGlvblxuXG4tIE5hbWU6ICR7cm9vdENvbmZpZy5wYWNrYWdlSnNvbj8ubmFtZX1cbi0gRGVzY3JpcHRpb246ICR7cm9vdENvbmZpZy5wYWNrYWdlSnNvbj8uZGVzY3JpcHRpb259XG4tIFBhY2thZ2UgTWFuYWdlcjogJHtwYWNrYWdlTWFuYWdlcn1cblxuIyMgR2VuZXJhbCBJbnN0cnVjdGlvbnNcblxuJHtcbiAgYWxsQ29uZmlncy5zb21lKChjKSA9PiBjLmRlcGVuZGluZy5nZW5JMThuVHMpXG4gICAgPyBgLSBXaGVuIGludHJvZHVjaW5nIG5ldyBzdHJpbmcgbGl0ZXJhbHMgaW4gUmVhY3QgY29tcG9uZW50cywgdXBkYXRlIHRoZSBsYW5ndWFnZSByZXNvdXJjZSBmaWxlcyBpbiB0aGUgXFxgaTE4blxcYCBkaXJlY3RvcnkgKGUuZy4sIFxcYGkxOG4vamEtSlAuanNvblxcYCkuIFJlZmVyZW5jZSB0aGVzZSBzdHJpbmdzIHVzaW5nIHRoZSBcXGBpMThuXFxgIHV0aWxpdHkuIEZvciBleGFtcGxlLCB1c2UgXFxgaTE4bi5wYWdlcy5ob21lLnRpdGxlKClcXGAgZm9yIFxcYHsgXCJwYWdlc1wiOiB7IFwiaG9tZVwiOiB7IFwidGl0bGVcIjogXCJNeSBBcHBcIiB9IH0gfVxcYC5gXG4gICAgOiAnJ1xufVxuLSBEbyBub3Qgd3JpdGUgdGVzdHMgdW5sZXNzIGV4cGxpY2l0bHkgcmVxdWVzdGVkLlxuLSBBZnRlciBtYWtpbmcgY29kZSBjaGFuZ2VzLCBydW4gXFxgJHtwYWNrYWdlTWFuYWdlcn0gY2hlY2stYWxsLWZvci1haVxcYCB0byBleGVjdXRlIGFsbCB0ZXN0cyAobm90ZTogdGhpcyBtYXkgdGFrZSB1cCB0byAzMCBtaW51dGVzKSwgb3IgcnVuIFxcYCR7cGFja2FnZU1hbmFnZXJ9IGNoZWNrLWZvci1haVxcYCBmb3IgdHlwZSBjaGVja2luZyBhbmQgbGludGluZyBvbmx5LlxuICAtIElmIHlvdSBhcmUgY29uZmlkZW50IHlvdXIgY2hhbmdlcyB3aWxsIG5vdCBicmVhayBhbnkgdGVzdHMsIHlvdSBtYXkgdXNlIFxcYGNoZWNrLWZvci1haVxcYC5cbi0gT25jZSB5b3UgaGF2ZSB2ZXJpZmllZCB5b3VyIGNoYW5nZXMsIGNvbW1pdCB0aGVtIHRvIHRoZSBjdXJyZW50IGJyYW5jaCB1c2luZyB0aGUgXFxgLS1uby12ZXJpZnlcXGAgb3B0aW9uIGFuZCBwdXNoIHRvIHRoZSBjdXJyZW50IGJyYW5jaC5cbiAgLSBGb2xsb3cgY29udmVudGlvbmFsIGNvbW1pdHMsIGkuZS4sIHlvdXIgY29tbWl0IG1lc3NhZ2Ugc2hvdWxkIHN0YXJ0IHdpdGggXFxgZmVhdDpcXGAsIFxcYGZpeDpcXGAsIGV0Yy5cbiAgLSBNYWtlIHN1cmUgdG8gYWRkIGEgbmV3IGxpbmUgYXQgdGhlIGVuZCBvZiB5b3VyIGNvbW1pdCBtZXNzYWdlJHtyb290Q29uZmlnLmlzV2lsbEJvb3N0ZXJSZXBvID8gYCB3aXRoOiBcXGBDby1hdXRob3JlZC1ieTogV2lsbEJvb3N0ZXIgKCR7dG9vbE5hbWV9KSA8YWdlbnRAd2lsbGJvb3N0ZXIuY29tPlxcYGAgOiAnJ30uXG4gIC0gQWx3YXlzIGNyZWF0ZSBuZXcgY29tbWl0cy4gQXZvaWQgdXNpbmcgXFxgLS1hbWVuZFxcYC5cbiR7XG4gIGFsbENvbmZpZ3Muc29tZSgoYykgPT4gYy5oYXNTdGFydFRlc3QpXG4gICAgPyBgLSBVc2UgXFxgJHtwYWNrYWdlTWFuYWdlcn0gcnVuIHN0YXJ0LXRlc3RcXGAgdG8gbGF1bmNoIGEgd2ViIHNlcnZlciBmb3IgZGVidWdnaW5nIG9yIHRlc3RpbmcuYFxuICAgIDogJydcbn1cblxuIyMgQ29kaW5nIFN0eWxlXG5cbi0gV3JpdGUgY29tbWVudHMgdGhhdCBleHBsYWluIFwid2h5XCIgcmF0aGVyIHRoYW4gXCJ3aGF0XCIuIEF2b2lkIGV4cGxhbmF0aW9ucyB0aGF0IGNhbiBiZSB1bmRlcnN0b29kIGZyb20gdGhlIGNvZGUgaXRzZWxmLlxuLSBVc2Ugc3RkZXJyIGZvciBsb2dnaW5nIGRlYnVnIG1lc3NhZ2VzIHRlbXBvcmFyaWx5IHNpbmNlIHN0ZG91dCBvdXRwdXQgaXMgc29tZXRpbWVzIG9taXR0ZWQuXG4tIFdoZW4gYWRkaW5nIG5ldyBmdW5jdGlvbnMgb3IgY2xhc3NlcywgZGVmaW5lIHRoZW0gYmVsb3cgYW55IGZ1bmN0aW9ucyBvciBjbGFzc2VzIHRoYXQgY2FsbCB0aGVtIHRvIG1haW50YWluIGNsZWFyIGNhbGwgb3JkZXIuXG4tIFByZWZlciBcXGB1bmRlZmluZWRcXGAgb3ZlciBcXGBudWxsXFxgIHVubGVzcyBleHBsaWNpdGx5IGRlYWxpbmcgd2l0aCBBUElzIG9yIGxpYnJhcmllcyB0aGF0IHJlcXVpcmUgXFxgbnVsbFxcYC5cbi0gQWx3YXlzIHBlcmZvcm0gZXhpc3RlbmNlIGNoZWNrcyBvbiBhcnJheSBkdWUgdG8gXFxgbm9VbmNoZWNrZWRJbmRleGVkQWNjZXNzOiB0cnVlXFxgLlxuJHtcbiAgYWxsQ29uZmlncy5zb21lKChjKSA9PiBjLmRlcGVuZGluZy5yZWFjdCB8fCBjLmRlcGVuZGluZy5uZXh0KVxuICAgID8gYC0gUHJlZmVyIFxcYHVzZUltbWVyXFxgIGZvciBzdG9yaW5nIGFuIGFycmF5IG9yIGFuIG9iamVjdCB0byBcXGB1c2VTdGF0ZVxcYC5gXG4gICAgOiAnJ1xufVxuJHtcbiAgYWxsQ29uZmlncy5zb21lKChjKSA9PiBjLmRlcGVuZGluZy5uZXh0KVxuICAgID8gYC0gU2luY2UgdGhpcyBwcm9qZWN0IHVzZXMgdGhlIFJlYWN0IENvbXBpbGVyLCB5b3UgZG8gbm90IG5lZWQgdG8gdXNlIFxcYHVzZUNhbGxiYWNrXFxgIG9yIFxcYHVzZU1lbW9cXGAgZm9yIHBlcmZvcm1hbmNlIG9wdGltaXphdGlvbi5gXG4gICAgOiAnJ1xufVxuYFxuICAgIC5yZXBsYWNlQWxsKC9cXC5cXG5cXG4rLS9nLCAnLlxcbi0nKVxuICAgIC5yZXBsYWNlQWxsKC9cXG57Myx9L2csICdcXG5cXG4nKVxuICAgIC50cmltKCk7XG5cbiAgcmV0dXJuIGV4dHJhQ29udGVudCA/IGJhc2VDb250ZW50ICsgJ1xcbicgKyBleHRyYUNvbnRlbnQudHJpbUVuZCgpIDogYmFzZUNvbnRlbnQ7XG59XG5cbmZ1bmN0aW9uIGdlbmVyYXRlQ3Vyc29yR2VuZXJhbE1kY0NvbnRlbnQoXG4gIGNvbmZpZzogUGFja2FnZUNvbmZpZyxcbiAgYWxsQ29uZmlnczogUGFja2FnZUNvbmZpZ1tdLFxuICBleHRyYUNvbnRlbnQ/OiBzdHJpbmdcbik6IHN0cmluZyB7XG4gIGNvbnN0IGZyb250bWF0dGVyID0gYC0tLVxcbmRlc2NyaXB0aW9uOiBHZW5lcmFsIENvZGluZyBSdWxlc1xcbmdsb2JzOlxcbmFsd2F5c0FwcGx5OiB0cnVlXFxuLS0tYDtcbiAgY29uc3QgYm9keSA9IGdlbmVyYXRlQWdlbnRJbnN0cnVjdGlvbihjb25maWcsIGFsbENvbmZpZ3MsICdDdXJzb3InLCBleHRyYUNvbnRlbnQpO1xuICByZXR1cm4gYCR7ZnJvbnRtYXR0ZXJ9XFxuXFxuJHtib2R5fWA7XG59XG4iLCJpbXBvcnQgeyBPY3Rva2l0IH0gZnJvbSAnQG9jdG9raXQvY29yZSc7XG5cbmNsYXNzIEdpdEh1YlV0aWwge1xuICBnZXRPcmdBbmROYW1lKHVybE9yRnVsbE5hbWU6IHN0cmluZyk6IFtzdHJpbmcsIHN0cmluZ10ge1xuICAgIGNvbnN0IHVybFdpdGhvdXRQcm90b2NvbCA9IHVybE9yRnVsbE5hbWUuc3BsaXQoJzonKS5hdCgtMSk7XG4gICAgY29uc3QgbmFtZXMgPSB1cmxXaXRob3V0UHJvdG9jb2w/LnNwbGl0KCcvJyk7XG4gICAgY29uc3Qgb3JnID0gbmFtZXM/LmF0KC0yKSA/PyAnJztcbiAgICBjb25zdCBuYW1lID0gbmFtZXM/LmF0KC0xKT8ucmVwbGFjZSgvLmdpdCQvLCAnJykgPz8gJyc7XG4gICAgcmV0dXJuIFtvcmcsIG5hbWVdO1xuICB9XG59XG5leHBvcnQgY29uc3QgZ2l0SHViVXRpbCA9IG5ldyBHaXRIdWJVdGlsKCk7XG5cbmNvbnN0IG9jdG9raXRDYWNoZSA9IG5ldyBNYXA8c3RyaW5nLCBPY3Rva2l0PigpO1xuXG5leHBvcnQgZnVuY3Rpb24gZ2V0T2N0b2tpdChvd25lcj86IHN0cmluZyk6IE9jdG9raXQge1xuICBjb25zdCBrZXkgPSBvd25lciA/PyAnJztcbiAgY29uc3QgY2FjaGVkID0gb2N0b2tpdENhY2hlLmdldChrZXkpO1xuICBpZiAoY2FjaGVkKSByZXR1cm4gY2FjaGVkO1xuXG4gIGNvbnN0IG9jdG9raXQgPSBuZXcgT2N0b2tpdCh7XG4gICAgYXV0aDogZ2V0R2l0SHViVG9rZW4ob3duZXIpIHx8IHVuZGVmaW5lZCxcbiAgfSk7XG4gIG9jdG9raXRDYWNoZS5zZXQoa2V5LCBvY3Rva2l0KTtcbiAgcmV0dXJuIG9jdG9raXQ7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBoYXNHaXRIdWJUb2tlbihvd25lcjogc3RyaW5nKTogYm9vbGVhbiB7XG4gIHJldHVybiAhIWdldEdpdEh1YlRva2VuKG93bmVyKTtcbn1cblxuZnVuY3Rpb24gZ2V0R2l0SHViVG9rZW4ob3duZXI/OiBzdHJpbmcpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBpZiAob3duZXIgPT09ICdXaWxsQm9vc3RlcicpIHtcbiAgICByZXR1cm4gcHJvY2Vzcy5lbnYuR0hfQk9UX1BBVF9GT1JfV0lMTEJPT1NURVI7XG4gIH1cbiAgaWYgKG93bmVyID09PSAnV2lsbEJvb3N0ZXJMYWInKSB7XG4gICAgcmV0dXJuIHByb2Nlc3MuZW52LkdIX0JPVF9QQVRfRk9SX1dJTExCT09TVEVSTEFCO1xuICB9XG4gIHJldHVybiAoXG4gICAgcHJvY2Vzcy5lbnYuR0hfQk9UX1BBVF9GT1JfV0lMTEJPT1NURVIgfHxcbiAgICBwcm9jZXNzLmVudi5HSF9CT1RfUEFUX0ZPUl9XSUxMQk9PU1RFUkxBQiB8fFxuICAgIHByb2Nlc3MuZW52LkdIX1RPS0VOIHx8XG4gICAgcHJvY2Vzcy5lbnYuR0lUSFVCX1RPS0VOXG4gICk7XG59XG4iLCJpbXBvcnQgdHlwZSB7IFNwYXduU3luY09wdGlvbnMgfSBmcm9tICdub2RlOmNoaWxkX3Byb2Nlc3MnO1xuaW1wb3J0IGNoaWxkX3Byb2Nlc3MgZnJvbSAnbm9kZTpjaGlsZF9wcm9jZXNzJztcbmltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBvcyBmcm9tICdub2RlOm9zJztcblxuZXhwb3J0IGZ1bmN0aW9uIHNwYXduU3luYyhjb21tYW5kOiBzdHJpbmcsIGFyZ3M6IHN0cmluZ1tdLCBjd2Q6IHN0cmluZywgcmV0cnkgPSAwKTogdm9pZCB7XG4gIGRvIHtcbiAgICBjb25zdCBbbmV3Q21kLCBuZXdBcmdzLCBvcHRpb25zXSA9IGdldFNwYXduU3luY0FyZ3MoY29tbWFuZCwgYXJncywgY3dkKTtcbiAgICBjb25zb2xlLmxvZyhgJCAke25ld0NtZH0gJHtuZXdBcmdzLmpvaW4oJyAnKX0gYXQgJHtjd2R9YCk7XG4gICAgY29uc3QgcmV0ID0gY2hpbGRfcHJvY2Vzcy5zcGF3blN5bmMobmV3Q21kLCBuZXdBcmdzLCBvcHRpb25zKTtcbiAgICBpZiAocmV0LnN0YXR1cyA9PT0gMCkgYnJlYWs7XG4gIH0gd2hpbGUgKC0tcmV0cnkgPj0gMCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBzcGF3blN5bmNXaXRoU3RyaW5nUmVzdWx0KGNvbW1hbmQ6IHN0cmluZywgYXJnczogc3RyaW5nW10sIGN3ZDogc3RyaW5nKTogc3RyaW5nIHtcbiAgY29uc3QgW25ld0NtZCwgbmV3QXJncywgb3B0aW9uc10gPSBnZXRTcGF3blN5bmNBcmdzKGNvbW1hbmQsIGFyZ3MsIGN3ZCk7XG4gIG9wdGlvbnMuc3RkaW8gPSAncGlwZSc7XG4gIGNvbnN0IHByb2MgPSBjaGlsZF9wcm9jZXNzLnNwYXduU3luYyhuZXdDbWQsIG5ld0FyZ3MsIG9wdGlvbnMpO1xuICBjb25zdCBlcnJvciA9IHByb2Muc3RkZXJyLnRvU3RyaW5nKCkudHJpbSgpO1xuICBpZiAoZXJyb3IpIHtcbiAgICBjb25zb2xlLmVycm9yKFxuICAgICAgYCR7bmV3Q21kfSBbJHtuZXdBcmdzLm1hcCgocykgPT4gYFwiJHtzfVwiYCkuam9pbignLCAnKX1dIG91dHB1dHMgdGhlIGZvbGxvd2luZyBjb250ZW50IHRvIHN0ZGVycjpcXG4ke2Vycm9yfWBcbiAgICApO1xuICB9XG4gIHJldHVybiBwcm9jLnN0ZG91dC50b1N0cmluZygpLnRyaW0oKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldFNwYXduU3luY0FyZ3MoY29tbWFuZDogc3RyaW5nLCBhcmdzOiBzdHJpbmdbXSwgY3dkOiBzdHJpbmcpOiBbc3RyaW5nLCBzdHJpbmdbXSwgU3Bhd25TeW5jT3B0aW9uc10ge1xuICBjb25zdCBlbnYgPSB7IC4uLnByb2Nlc3MuZW52IH07XG4gIC8vIFJlbW92ZSBiZXJyeSBmcm9tIFBBVEhcbiAgaWYgKGVudi5QQVRIICYmIGVudi5CRVJSWV9CSU5fRk9MREVSKSB7XG4gICAgZW52LlBBVEggPSBlbnYuUEFUSC5yZXBsYWNlKGAke2Vudi5CRVJSWV9CSU5fRk9MREVSfTpgLCAnJyk7XG4gIH1cbiAgLy8gRW5zdXJlIGFzZGYgc2hpbXMvYmluIGFyZSBvbiBQQVRIIGV2ZW4gd2hlbiBwYXJlbnQgc2hlbGwgZG9lc24ndCBsb2FkIHRoZW1cbiAgY29uc3QgYXNkZkRpciA9IGVudi5BU0RGX0RJUiA/PyBgJHtvcy5ob21lZGlyKCl9Ly5hc2RmYDtcbiAgaWYgKGFzZGZEaXIgJiYgZnMuZXhpc3RzU3luYyhhc2RmRGlyKSkge1xuICAgIGNvbnN0IGFzZGZQYXRocyA9IFtgJHthc2RmRGlyfS9zaGltc2AsIGAke2FzZGZEaXJ9L2JpbmBdO1xuICAgIGNvbnN0IGN1cnJlbnRQYXRocyA9IGVudi5QQVRIID8gZW52LlBBVEguc3BsaXQoJzonKSA6IFtdO1xuICAgIGVudi5QQVRIID0gWy4uLmFzZGZQYXRocywgLi4uY3VycmVudFBhdGhzLmZpbHRlcigocCkgPT4gIWFzZGZQYXRocy5pbmNsdWRlcyhwKSldLmpvaW4oJzonKTtcbiAgICBlbnYuQVNERl9ESVIgPz89IGFzZGZEaXI7XG4gICAgZW52LkFTREZfTk9ERUpTX1ZFUlNJT04gPz89ICdzeXN0ZW0nO1xuICB9XG5cbiAgaWYgKGVudi5BU0RGX0RJUikge1xuICAgIGFyZ3MgPSBbJy1sJywgJy1jJywgYCR7Y29tbWFuZH0gJHthcmdzLmpvaW4oJyAnKX1gXTtcbiAgICBjb21tYW5kID0gJ2Jhc2gnO1xuICB9XG4gIHJldHVybiBbXG4gICAgY29tbWFuZCxcbiAgICBhcmdzLFxuICAgIHtcbiAgICAgIGN3ZCxcbiAgICAgIGVudixcbiAgICAgIHNoZWxsOiBmYWxzZSxcbiAgICAgIHN0ZGlvOiAnaW5oZXJpdCcsXG4gICAgfSxcbiAgXTtcbn1cbiIsImV4cG9ydCBmdW5jdGlvbiBjb252ZXJ0VmVyc2lvbkludG9OdW1iZXIodmVyc2lvbjogc3RyaW5nKTogbnVtYmVyIHtcbiAgLy8gZS5nLiBqYXZhIGFkb3B0b3Blbmpkay0xMS4wLjE3KzhcbiAgY29uc3QgbnVtYmVycyA9IHZlcnNpb25cbiAgICAuc3BsaXQoL1srLi1dLylcbiAgICAubWFwKE51bWJlcilcbiAgICAuZmlsdGVyKChudW0pID0+ICFOdW1iZXIuaXNOYU4obnVtKSk7XG4gIGxldCB2ZXJzaW9uTnVtYmVyID0gMDtcbiAgbGV0IGRpdmlzb3IgPSAxO1xuICBmb3IgKGNvbnN0IG51bSBvZiBudW1iZXJzKSB7XG4gICAgdmVyc2lvbk51bWJlciArPSBudW0gKiBkaXZpc29yO1xuICAgIGRpdmlzb3IgLz0gMTAwMDtcbiAgfVxuICByZXR1cm4gdmVyc2lvbk51bWJlcjtcbn1cbiIsImV4cG9ydCBjb25zdCBQWVRIT05fVkVSU0lPTiA9ICczLjkuMTknO1xuZXhwb3J0IGNvbnN0IEpBVkFfVkVSU0lPTiA9ICd6dWx1LTExLjc0LjE1JztcbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGdldE9jdG9raXQgfSBmcm9tICcuLi91dGlscy9naXRodWJVdGlsLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuaW1wb3J0IHsgc3Bhd25TeW5jLCBzcGF3blN5bmNXaXRoU3RyaW5nUmVzdWx0IH0gZnJvbSAnLi4vdXRpbHMvc3Bhd25VdGlsLmpzJztcbmltcG9ydCB7IGNvbnZlcnRWZXJzaW9uSW50b051bWJlciB9IGZyb20gJy4uL3V0aWxzL3ZlcnNpb24uanMnO1xuaW1wb3J0IHsgSkFWQV9WRVJTSU9OLCBQWVRIT05fVkVSU0lPTiB9IGZyb20gJy4uL3V0aWxzL3ZlcnNpb25Db25zdGFudHMuanMnO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVUb29sVmVyc2lvbnMoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZ2VuZXJhdGVUb29sVmVyc2lvbnMnLCBhc3luYyAoKSA9PiB7XG4gICAgYXdhaXQgY29yZShjb25maWcpO1xuICB9KTtcbn1cblxuY29uc3QgQ09SRV9UT09MUyA9IG5ldyBTZXQoWydqYXZhJywgJ25vZGVqcycsICdidW4nLCAncHl0aG9uJ10pO1xuY29uc3QgREVQUkVDQVRFRF9WRVJTSU9OX1BSRUZJWEVTID0gWydqYXZhJywgJ25vZGUnLCAncHl0aG9uJ107XG5cbmFzeW5jIGZ1bmN0aW9uIGNvcmUoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIGlmICghY29uZmlnLnZlcnNpb25zVGV4dCkgcmV0dXJuO1xuXG4gIGNvbnN0IGR1cGxpY2F0YWJsZUxpbmVzID0gY29uZmlnLnZlcnNpb25zVGV4dFxuICAgIC50cmltKClcbiAgICAuc3BsaXQoJ1xcbicpXG4gICAgLm1hcCgobGluZSkgPT4ge1xuICAgICAgY29uc3QgW25hbWUsIHZlcnNpb25dID0gbGluZS50cmltKCkuc3BsaXQoL1xccysvKTtcbiAgICAgIC8vIFRvIG1vdmUgdGhlIHRvcCBvZiB0aGUgc29ydGVkIGxpc3QsIHdlIG5lZWQgdG8gYWRkIGEgc3BhY2UuXG4gICAgICByZXR1cm4gYCR7Q09SRV9UT09MUy5oYXMobmFtZSA/PyAnJykgPyAnICcgOiAnJ30ke25hbWUgPz8gJyd9ICR7dmVyc2lvbiA/PyAnJ31gO1xuICAgIH0pXG4gICAgLnRvU29ydGVkKClcbiAgICAvLyBSZW1vdmUgYWRkZWQgc3BhY2VzLlxuICAgIC5tYXAoKGxpbmUpID0+IGxpbmUudHJpbSgpKVxuICAgIC8vIFRPRE86IHJlbW92ZSB0aGUgZm9sbG93aW5nIGxpbmUgYWZ0ZXIgbGVmdGhvb2sgaXMgaW5zdGFsbGVkIHZpYSBucG0uXG4gICAgLmZpbHRlcigobGluZSkgPT4gIWxpbmUuc3RhcnRzV2l0aCgnbGVmdGhvb2snKSk7XG4gIGNvbnN0IGxpbmVzID0gWy4uLm5ldyBTZXQoZHVwbGljYXRhYmxlTGluZXMpXTtcblxuICBpZiAoY29uZmlnLmRvZXNDb250YWluUG9ldHJ5TG9jaykge1xuICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2goJ2h0dHBzOi8vcHlwaS5vcmcvcHlwaS9wb2V0cnkvanNvbicpO1xuICAgIGNvbnN0IGpzb24gPSAoYXdhaXQgcmVzcG9uc2UuanNvbigpKSBhcyB7IGluZm8/OiB7IHZlcnNpb246IHN0cmluZyB9IH0gfCB1bmRlZmluZWQ7XG4gICAgY29uc3QgcG9ldHJ5VmVyc2lvbiA9IGpzb24/LmluZm8/LnZlcnNpb247XG4gICAgaWYgKHBvZXRyeVZlcnNpb24pIHtcbiAgICAgIHVwZGF0ZVZlcnNpb24obGluZXMsICdwb2V0cnknLCBwb2V0cnlWZXJzaW9uKTtcbiAgICB9XG4gICAgdXBkYXRlVmVyc2lvbihsaW5lcywgJ3B5dGhvbicsIFBZVEhPTl9WRVJTSU9OLCB0cnVlKTtcbiAgfVxuICBpZiAoY29uZmlnLmRlcGVuZGluZy5maXJlYmFzZSkge1xuICAgIHVwZGF0ZVZlcnNpb24obGluZXMsICdqYXZhJywgSkFWQV9WRVJTSU9OLCB0cnVlKTtcbiAgfVxuICBpZiAoY29uZmlnLmRvZXNDb250YWluUGFja2FnZUpzb24pIHtcbiAgICBpZiAoY29uZmlnLmlzQnVuKSB7XG4gICAgICBjb25zdCBidW5WZXJzaW9uID0gYXdhaXQgZ2V0TGF0ZXN0VmVyc2lvbkZyb21UYWdPbkdpdEh1Yignb3Zlbi1zaCcsICdidW4nKTtcbiAgICAgIGlmIChidW5WZXJzaW9uKSB1cGRhdGVWZXJzaW9uKGxpbmVzLCAnYnVuJywgYnVuVmVyc2lvbik7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IHZlcnNpb24gPSBzcGF3blN5bmNXaXRoU3RyaW5nUmVzdWx0KCducG0nLCBbJ3Nob3cnLCAneWFybicsICd2ZXJzaW9uJ10sIGNvbmZpZy5kaXJQYXRoKTtcbiAgICAgIHVwZGF0ZVZlcnNpb24obGluZXMsICd5YXJuJywgdmVyc2lvbik7XG4gICAgfVxuICB9XG5cbiAgZm9yIChjb25zdCBwcmVmaXggb2YgREVQUkVDQVRFRF9WRVJTSU9OX1BSRUZJWEVTKSB7XG4gICAgY29uc3QgdmVyc2lvblBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsIGAuJHtwcmVmaXh9LXZlcnNpb25gKTtcbiAgICB2b2lkIGZzLnByb21pc2VzLnJtKHZlcnNpb25QYXRoLCB7IGZvcmNlOiB0cnVlIH0pO1xuICB9XG5cbiAgY29uc3QgdG9vbFZlcnNpb25zUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJy50b29sLXZlcnNpb25zJyk7XG4gIGF3YWl0IChsaW5lcy5sZW5ndGggPiAwXG4gICAgPyBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnMucHJvbWlzZXMud3JpdGVGaWxlKHRvb2xWZXJzaW9uc1BhdGgsIGxpbmVzLmpvaW4oJ1xcbicpICsgJ1xcbicpKVxuICAgIDogcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzLnByb21pc2VzLnJtKHRvb2xWZXJzaW9uc1BhdGgsIHsgZm9yY2U6IHRydWUgfSkpKTtcbiAgYXdhaXQgcHJvbWlzZVBvb2wucHJvbWlzZUFsbCgpO1xuICBzcGF3blN5bmMoJ2FzZGYnLCBbJ3BsdWdpbicsICd1cGRhdGUnLCAnLS1hbGwnXSwgY29uZmlnLmRpclBhdGgpO1xuICBzcGF3blN5bmMoJ2FzZGYnLCBbJ2luc3RhbGwnXSwgY29uZmlnLmRpclBhdGgpO1xufVxuXG5mdW5jdGlvbiB1cGRhdGVWZXJzaW9uKGxpbmVzOiBzdHJpbmdbXSwgdG9vbE5hbWU6IHN0cmluZywgbmV3VmVyc2lvbjogc3RyaW5nLCBoZWFkID0gZmFsc2UpOiB2b2lkIHtcbiAgY29uc3QgaW5kZXggPSBsaW5lcy5maW5kSW5kZXgoKGwpID0+IGwuc3BsaXQoL1xccysvKVswXSA9PT0gdG9vbE5hbWUpO1xuICBjb25zdCBuZXdMaW5lID0gYCR7dG9vbE5hbWV9ICR7bmV3VmVyc2lvbn1gO1xuICBpZiAoaW5kZXggPT09IC0xKSB7XG4gICAgbGluZXMuc3BsaWNlKGhlYWQgPyAwIDogbGluZXMubGVuZ3RoLCAwLCBuZXdMaW5lKTtcbiAgfSBlbHNlIHtcbiAgICBjb25zdCBbLCB2ZXJzaW9uXSA9IChsaW5lc1tpbmRleF0gYXMgc3RyaW5nKS5zcGxpdCgvXFxzKy8pO1xuICAgIGlmIChjb252ZXJ0VmVyc2lvbkludG9OdW1iZXIobmV3VmVyc2lvbikgPiBjb252ZXJ0VmVyc2lvbkludG9OdW1iZXIodmVyc2lvbiA/PyAnJykpIHtcbiAgICAgIGxpbmVzW2luZGV4XSA9IG5ld0xpbmU7XG4gICAgfVxuICB9XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGdldExhdGVzdFZlcnNpb25Gcm9tVGFnT25HaXRIdWIob3JnYW5pemF0aW9uOiBzdHJpbmcsIHJlcG9zaXRvcnk6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nIHwgdW5kZWZpbmVkPiB7XG4gIHRyeSB7XG4gICAgLy8gRmV0Y2ggdGhlIGxhdGVzdCByZWxlYXNlIGZyb20gdGhlIHJlcG9zaXRvcnkgKG5vIHJlcXVpcmVkIHBlcm1pc3Npb25zKVxuICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZ2V0T2N0b2tpdCgpLnJlcXVlc3QoJ0dFVCAvcmVwb3Mve293bmVyfS97cmVwb30vcmVsZWFzZXMvbGF0ZXN0Jywge1xuICAgICAgb3duZXI6IG9yZ2FuaXphdGlvbixcbiAgICAgIHJlcG86IHJlcG9zaXRvcnksXG4gICAgfSk7XG4gICAgY29uc3QgdmVyc2lvbiA9IHJlc3BvbnNlLmRhdGEudGFnX25hbWU7XG4gICAgY29uc3QgaW5kZXggPSB2ZXJzaW9uLmxhc3RJbmRleE9mKCd2Jyk7XG4gICAgY29uc3QgdmVyc2lvbk51bWJlclRleHQgPSBpbmRleCA9PT0gLTEgPyB2ZXJzaW9uIDogdmVyc2lvbi5zbGljZShpbmRleCArIDEpO1xuICAgIC8vIENoZWNrIHRoZSBmaXJzdCBjaGFyYWN0ZXIgaXMgYSBudW1iZXJcbiAgICByZXR1cm4gL15cXGQvLnRlc3QodmVyc2lvbk51bWJlclRleHQpID8gdmVyc2lvbk51bWJlclRleHQgOiB1bmRlZmluZWQ7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgY29uc29sZS5lcnJvcignRmFpbGVkIHRvIGZldGNoIEJ1biB0YWdzIGR1ZSB0bzonLCBlcnJvcik7XG4gICAgcmV0dXJuO1xuICB9XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgbWVyZ2UgZnJvbSAnZGVlcG1lcmdlJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZnNVdGlsIH0gZnJvbSAnLi4vdXRpbHMvZnNVdGlsLmpzJztcbmltcG9ydCB7IG92ZXJ3cml0ZU1lcmdlIH0gZnJvbSAnLi4vdXRpbHMvbWVyZ2VVdGlsLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVCaW9tZUpzb25jKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2dlbmVyYXRlQmlvbWVKc29uYycsIGFzeW5jICgpID0+IHtcbiAgICBsZXQgbmV3U2V0dGluZ3M6IG9iamVjdCA9IHtcbiAgICAgIHJvb3Q6IGNvbmZpZy5pc1Jvb3QsXG4gICAgICAkc2NoZW1hOiAnLi9ub2RlX21vZHVsZXMvQGJpb21lanMvYmlvbWUvY29uZmlndXJhdGlvbl9zY2hlbWEuanNvbicsXG4gICAgICBleHRlbmRzOiBbJ0B3aWxsYm9vc3Rlci9iaW9tZS1jb25maWcnXSxcbiAgICB9O1xuICAgIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnYmlvbWUuanNvbmMnKTtcbiAgICB0cnkge1xuICAgICAgY29uc3Qgb2xkQ29udGVudCA9IGF3YWl0IGZzLnByb21pc2VzLnJlYWRGaWxlKGZpbGVQYXRoLCAndXRmOCcpO1xuICAgICAgY29uc3Qgb2xkU2V0dGluZ3MgPSBKU09OLnBhcnNlKG9sZENvbnRlbnQpIGFzIG9iamVjdDtcbiAgICAgIG5ld1NldHRpbmdzID0gbWVyZ2UuYWxsKFtuZXdTZXR0aW5ncywgb2xkU2V0dGluZ3MsIG5ld1NldHRpbmdzXSwgeyBhcnJheU1lcmdlOiBvdmVyd3JpdGVNZXJnZSB9KTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIGRvIG5vdGhpbmdcbiAgICB9XG4gICAgY29uc3QgbmV3Q29udGVudCA9IEpTT04uc3RyaW5naWZ5KG5ld1NldHRpbmdzKTtcbiAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnNVdGlsLmdlbmVyYXRlRmlsZShmaWxlUGF0aCwgbmV3Q29udGVudCkpO1xuICB9KTtcbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGZzVXRpbCB9IGZyb20gJy4uL3V0aWxzL2ZzVXRpbC5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcblxuY29uc3QgbmV3Q29udGVudFdpdGhFeGFjdFRydWUgPSBgZW52ID0gZmFsc2VcbnRlbGVtZXRyeSA9IGZhbHNlXG5cbltpbnN0YWxsXVxuZXhhY3QgPSB0cnVlXG5saW5rZXIgPSBcImhvaXN0ZWRcIlxubWluaW11bVJlbGVhc2VBZ2UgPSA0MzIwMDAgIyA1IGRheXNcbm1pbmltdW1SZWxlYXNlQWdlRXhjbHVkZXMgPSBbXG4gICAgXCJAd2lsbGJvb3N0ZXIvYmFiZWwtY29uZmlnc1wiLFxuICAgIFwiQHdpbGxib29zdGVyL2Jpb21lLWNvbmZpZ1wiLFxuICAgIFwiQHdpbGxib29zdGVyL2VzbGludC1jb25maWctanNcIixcbiAgICBcIkB3aWxsYm9vc3Rlci9lc2xpbnQtY29uZmlnLWpzLXJlYWN0XCIsXG4gICAgXCJAd2lsbGJvb3N0ZXIvZXNsaW50LWNvbmZpZy1uZXh0XCIsXG4gICAgXCJAd2lsbGJvb3N0ZXIvZXNsaW50LWNvbmZpZy10c1wiLFxuICAgIFwiQHdpbGxib29zdGVyL2VzbGludC1jb25maWctdHMtcmVhY3RcIixcbiAgICBcIkB3aWxsYm9vc3Rlci9wcmV0dGllci1jb25maWdcIixcbiAgICBcIkB3aWxsYm9vc3Rlci93YlwiLFxuICAgIFwibmV4dFwiLFxuICAgIFwicmVhY3RcIixcbiAgICBcInJlYWN0LWRvbVwiXG5dXG5cbltydW5dXG5idW4gPSB0cnVlXG5gO1xuXG5jb25zdCBuZXdDb250ZW50V2l0aEV4YWN0RmFsc2UgPSBuZXdDb250ZW50V2l0aEV4YWN0VHJ1ZS5yZXBsYWNlKCdleGFjdCA9IHRydWUnLCAnZXhhY3QgPSBmYWxzZScpO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVCdW5maWdUb21sKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2dlbmVyYXRlQnVuZmlnVG9tbCcsIGFzeW5jICgpID0+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+XG4gICAgICAgIGZzLnByb21pc2VzLnJtKHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJ3lhcm4ubG9jaycpLCB7IGZvcmNlOiB0cnVlLCByZWN1cnNpdmU6IHRydWUgfSlcbiAgICAgICk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgY3VycmVudFZlcnNpb24gPSBzcGF3blN5bmNXaXRoU3RyaW5nUmVzdWx0KCd5YXJuJywgWyctLXZlcnNpb24nXSwgY29uZmlnLmRpclBhdGgpO1xuICAgIGNvbnN0IGxhdGVzdFZlcnNpb24gPSBnZXRMYXRlc3RWZXJzaW9uKCdAeWFybnBrZy9jbGknLCBjb25maWcuZGlyUGF0aCk7XG4gICAgaWYgKGdldE1ham9yTnVtYmVyKGN1cnJlbnRWZXJzaW9uKSA8PSBnZXRNYWpvck51bWJlcihsYXRlc3RWZXJzaW9uKSAmJiBjdXJyZW50VmVyc2lvbiAhPT0gbGF0ZXN0VmVyc2lvbikge1xuICAgICAgc3Bhd25TeW5jKCd5YXJuJywgWydzZXQnLCAndmVyc2lvbicsIGxhdGVzdFZlcnNpb25dLCBjb25maWcuZGlyUGF0aCwgMSk7XG4gICAgfVxuXG4gICAgY29uc3QgcmVsZWFzZXNQYXRoID0gcGF0aC5qb2luKGNvbmZpZy5kaXJQYXRoLCAnLnlhcm4nLCAncmVsZWFzZXMnKTtcbiAgICBhd2FpdCBmcy5wcm9taXNlcy5ta2RpcihyZWxlYXNlc1BhdGgsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICAgIGZvciAoY29uc3QgZmlsZSBvZiBhd2FpdCBmcy5wcm9taXNlcy5yZWFkZGlyKHJlbGVhc2VzUGF0aCkpIHtcbiAgICAgIGlmIChmaWxlLnN0YXJ0c1dpdGgoJ3lhcm4tJykgJiYgIWZpbGUuc3RhcnRzV2l0aChgeWFybi0ke2xhdGVzdFZlcnNpb259LmApKSB7XG4gICAgICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiBmcy5wcm9taXNlcy5ybShwYXRoLmpvaW4ocmVsZWFzZXNQYXRoLCBmaWxlKSkpO1xuICAgICAgICBjb25zb2xlLmxvZygnUmVtb3ZlZCcsIHBhdGguam9pbihyZWxlYXNlc1BhdGgsIGZpbGUpKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCB5YXJucmNQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnLnlhcm5yYycpO1xuICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiBmcy5wcm9taXNlcy5ybSh5YXJucmNQYXRoLCB7IGZvcmNlOiB0cnVlIH0pKTtcblxuICAgIGNvbnN0IHNldHRpbmdzID0geWFtbC5sb2FkKGF3YWl0IGZzLnByb21pc2VzLnJlYWRGaWxlKHlhcm5yY1ltbFBhdGgsICd1dGY4JykpIGFzIFNldHRpbmdzO1xuICAgIHNldHRpbmdzLmRlZmF1bHRTZW12ZXJSYW5nZVByZWZpeCA9ICcnO1xuICAgIHNldHRpbmdzLm5vZGVMaW5rZXIgPSAnbm9kZS1tb2R1bGVzJztcbiAgICBzZXR0aW5ncy5ubU1vZGUgPSAnaGFyZGxpbmtzLWdsb2JhbCc7XG4gICAgc2V0dGluZ3MubnBtTWluaW1hbEFnZUdhdGUgPSAnNWQnO1xuICAgIHNldHRpbmdzLm5wbVByZWFwcHJvdmVkUGFja2FnZXMgPSBbXG4gICAgICAnQHdpbGxib29zdGVyL2JhYmVsLWNvbmZpZ3MnLFxuICAgICAgJ0B3aWxsYm9vc3Rlci9iaW9tZS1jb25maWcnLFxuICAgICAgJ0B3aWxsYm9vc3Rlci9lc2xpbnQtY29uZmlnLWpzJyxcbiAgICAgICdAd2lsbGJvb3N0ZXIvZXNsaW50LWNvbmZpZy1qcy1yZWFjdCcsXG4gICAgICAnQHdpbGxib29zdGVyL2VzbGludC1jb25maWctbmV4dCcsXG4gICAgICAnQHdpbGxib29zdGVyL2VzbGludC1jb25maWctdHMnLFxuICAgICAgJ0B3aWxsYm9vc3Rlci9lc2xpbnQtY29uZmlnLXRzLXJlYWN0JyxcbiAgICAgICdAd2lsbGJvb3N0ZXIvcHJldHRpZXItY29uZmlnJyxcbiAgICAgICdAd2lsbGJvb3N0ZXIvd2InLFxuICAgICAgLy8gVG8gZGVhbCB3aXRoIENWRSBsaWtlIGh0dHBzOi8vbmV4dGpzLm9yZy9ibG9nL0NWRS0yMDI1LTY2NDc4XG4gICAgICAnbmV4dCcsXG4gICAgICAncmVhY3QnLFxuICAgICAgJ3JlYWN0LWRvbScsXG4gICAgXTtcbiAgICBkZWxldGUgc2V0dGluZ3MuY29tcHJlc3Npb25MZXZlbDtcbiAgICBpZiAoc2V0dGluZ3MuaW5qZWN0RW52aXJvbm1lbnRGaWxlcz8ubGVuZ3RoID09PSAwKSB7XG4gICAgICBkZWxldGUgc2V0dGluZ3MuaW5qZWN0RW52aXJvbm1lbnRGaWxlcztcbiAgICB9XG4gICAgLy8gY2YuIGh0dHBzOi8vZ2l0aHViLmNvbS95YXJucGtnL2JlcnJ5L3B1bGwvNDY5OFxuICAgIHNldHRpbmdzLmVuYWJsZUdsb2JhbENhY2hlID0gdHJ1ZTtcbiAgICBjb25zdCBvcmlnaW5hbExlbmd0aCA9IHNldHRpbmdzLnBsdWdpbnM/Lmxlbmd0aCA/PyAwO1xuICAgIHNldHRpbmdzLnBsdWdpbnMgPSBzZXR0aW5ncy5wbHVnaW5zPy5maWx0ZXIoKHApID0+IHAucGF0aCAhPT0gJy55YXJuL3BsdWdpbnMvdW5kZWZpbmVkLmNqcycpID8/IFtdO1xuICAgIGlmIChzZXR0aW5ncy5wbHVnaW5zLmxlbmd0aCAhPT0gb3JpZ2luYWxMZW5ndGgpIHtcbiAgICAgIGNvbnN0IHBsdWdpblBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICcueWFybnJjJywgJ3VuZGVmaW5lZC5janMnKTtcbiAgICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiBmcy5wcm9taXNlcy5ybShwbHVnaW5QYXRoLCB7IGZvcmNlOiB0cnVlIH0pKTtcbiAgICB9XG4gICAgaWYgKHNldHRpbmdzLnBsdWdpbnMubGVuZ3RoID09PSAwKSB7XG4gICAgICBkZWxldGUgc2V0dGluZ3MucGx1Z2lucztcbiAgICB9XG4gICAgYXdhaXQgZnMucHJvbWlzZXMud3JpdGVGaWxlKHlhcm5yY1ltbFBhdGgsIHlhbWwuZHVtcChzZXR0aW5ncywgeyBsaW5lV2lkdGg6IC0xIH0pKTtcblxuICAgIHNwYXduU3luYygneWFybicsIFsnZGx4JywgJ3lhcm4tcGx1Z2luLWF1dG8taW5zdGFsbCddLCBjb25maWcuZGlyUGF0aCk7XG4gIH0pO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0TGF0ZXN0VmVyc2lvbihwYWNrYWdlTmFtZTogc3RyaW5nLCBkaXJQYXRoOiBzdHJpbmcpOiBzdHJpbmcge1xuICBjb25zdCB2ZXJzaW9uc0pzb24gPSBzcGF3blN5bmNXaXRoU3RyaW5nUmVzdWx0KCducG0nLCBbJ3Nob3cnLCBwYWNrYWdlTmFtZSwgJ3ZlcnNpb25zJywgJy0tanNvbiddLCBkaXJQYXRoKTtcbiAgY29uc3QgdmVyc2lvbnMgPSBKU09OLnBhcnNlKHZlcnNpb25zSnNvbikgYXMgc3RyaW5nW107XG4gIHJldHVybiB2ZXJzaW9ucy5hdCgtMSkgYXMgc3RyaW5nO1xufVxuZnVuY3Rpb24gZ2V0TWFqb3JOdW1iZXIodmVyc2lvbjogc3RyaW5nKTogbnVtYmVyIHtcbiAgY29uc3QgW21ham9yXSA9IHZlcnNpb24uc3BsaXQoJy4nKTtcbiAgcmV0dXJuIE51bWJlcihtYWpvcik7XG59XG4iLCJpbXBvcnQgdHlwZSB7IE9jdG9raXQgfSBmcm9tICdAb2N0b2tpdC9jb3JlJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZ2V0T2N0b2tpdCwgZ2l0SHViVXRpbCwgaGFzR2l0SHViVG9rZW4gfSBmcm9tICcuLi91dGlscy9naXRodWJVdGlsLmpzJztcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHNldHVwTGFiZWxzKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ3NldHVwTGFiZWxzJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IFtvd25lciwgcmVwb10gPSBnaXRIdWJVdGlsLmdldE9yZ0FuZE5hbWUoY29uZmlnLnJlcG9zaXRvcnkgPz8gJycpO1xuICAgIGlmICghb3duZXIgfHwgIXJlcG8pIHJldHVybjtcbiAgICBpZiAob3duZXIgIT09ICdXaWxsQm9vc3RlcicgJiYgb3duZXIgIT09ICdXaWxsQm9vc3RlckxhYicpIHJldHVybjtcbiAgICBpZiAoIWhhc0dpdEh1YlRva2VuKG93bmVyKSkgcmV0dXJuO1xuXG4gICAgY29uc3Qgb2N0b2tpdCA9IGdldE9jdG9raXQob3duZXIpO1xuXG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdkMTogeC1lYXN5IDpoZWRnZWhvZzonLCAnRURFOUZFJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAnZDI6IGVhc3kgOnJhYmJpdDI6JywgJ0RERDZGRScpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ2QzOiBtZWRpdW0gOm94OicsICdDNEI1RkQnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdkNDogaGFyZCA6c3F1aWQ6JywgJ0E3OEJGQScpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ2Q1OiB4LWhhcmQgOndoYWxlMjonLCAnOEI1Q0Y2Jyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAncDE6IGNyaXRpY2FsIDpmaXJlOjpmaXJlOjpmaXJlOicsICdFRjQ0NDQnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdwMjogdXJnZW50IDpmaXJlOjpmaXJlOicsICdGODcxNzEnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdwMzogaW1wb3J0YW50IDpmaXJlOicsICdGQ0E1QTUnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdwNDogbmljZSB0byBoYXZlIDpkcm9wbGV0OicsICdGRUNBQ0EnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdyOiBibGl0eicsICc1MzAwYmMnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdyOiBmaXJlYmFzZScsICdmZmNhMjgnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdyOiBwcmlzbWEnLCAnMGMzNDRiJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAncjogcmVhY3QnLCAnNjFkYWZiJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAncjogc3ZlbHRlJywgJ2ZmM2UwMCcpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ3I6IHNlbWFudGljLXJlbGVhc2UnLCAnNDk0OTQ5Jyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAncmVhZHkgOnJvY2tldDonLCAnMjJDNTVFJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAncmV2aWV3IHJlcXVlc3RlZCA6bWFnOicsICdGQkNBMDQnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdyZWxlYXNlZCA6Ym9va21hcms6JywgJzYzNjZGMScpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ3M6IDAuNWggOmNsb2NrMTIzMDonLCAnRjNGNEY2Jyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAnczogMWggOmNsb2NrMTonLCAnRTVFN0VCJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAnczogMmggOmNsb2NrMjonLCAnRDFENURCJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAnczogM2ggOmNsb2NrMzonLCAnOUNBM0FGJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAnczogNWggOmNsb2NrNTonLCAnNkI3MjgwJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAnczogOGggOmNsb2NrODonLCAnNEI1NTYzJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAnczogMTNoIDpjbG9jazE6JywgJzM3NDE1MScpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ3Q6IGJ1aWxkIDpoYW1tZXI6JywgJ0JGREJGRScpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ3Q6IGNob3JlIDpicm9vbTonLCAnQkZEQkZFJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAndDogY2kgOmNvbnN0cnVjdGlvbl93b3JrZXI6JywgJ0JGREJGRScpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ3Q6IGRvY3MgOm1lbW86JywgJ0JGREJGRScpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ3Q6IGZlYXQgOnNwYXJrbGVzOicsICdCRkRCRkUnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICd0OiBmaXggOmJ1ZzonLCAnQkZEQkZFJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAndDogcGVyZiA6emFwOicsICdCRkRCRkUnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICd0OiByZWZhY3RvciA6cmVjeWNsZTonLCAnQkZEQkZFJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAndDogc3R5bGUgOmxpcHN0aWNrOicsICdCRkRCRkUnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICd0OiB0ZXN0IDp0ZXN0X3R1YmU6JywgJ0JGREJGRScpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ3Byb2plY3QnLCAnMjQyOTJGJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAnZm9jdXNlZCA6ZGFydDonLCAnMjJDNTVFJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAnZ2VuLXByLWFsbCA6cm9ib3Q6JywgJzAwQjREOCcpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ2dlbi1wci1jbGF1ZGUgOnJvYm90OicsICcwMEI0RDgnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdnZW4tcHItY29kZXggOnJvYm90OicsICcwMEI0RDgnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdnZW4tcHItZ2VtaW5pIDpyb2JvdDonLCAnMDBCNEQ4Jyk7XG5cbiAgICAgIGF3YWl0IGRlbGV0ZUxhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAnYnVnJyk7XG4gICAgICBhd2FpdCBkZWxldGVMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ2RvY3VtZW50YXRpb24nKTtcbiAgICAgIGF3YWl0IGRlbGV0ZUxhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAnZHVwbGljYXRlJyk7XG4gICAgICBhd2FpdCBkZWxldGVMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ2VuaGFuY2VtZW50Jyk7XG4gICAgICBhd2FpdCBkZWxldGVMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ2dvb2QgZmlyc3QgaXNzdWUnKTtcbiAgICAgIGF3YWl0IGRlbGV0ZUxhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAnaGVscCB3YW50ZWQnKTtcbiAgICAgIGF3YWl0IGRlbGV0ZUxhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAnaW52YWxpZCcpO1xuICAgICAgYXdhaXQgZGVsZXRlTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdxdWVzdGlvbicpO1xuICAgICAgYXdhaXQgZGVsZXRlTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICd3b250Zml4Jyk7XG5cbiAgICAgIGF3YWl0IGRlbGV0ZUxhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAncmVhZHknKTtcbiAgICAgIGF3YWl0IGRlbGV0ZUxhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAncmV2aWV3IHJlcXVlc3RlZCcpO1xuICAgICAgYXdhaXQgZGVsZXRlTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdyZWxlYXNlZCcpO1xuICAgICAgYXdhaXQgZGVsZXRlTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdzZW1hbnRpYy1yZWxlYXNlJyk7XG4gICAgICBhd2FpdCBkZWxldGVMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ2xsbS1wciA6cm9ib3Q6Jyk7XG4gICAgICBhd2FpdCBkZWxldGVMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ2FpLXByIDpyb2JvdDonKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgY29uc29sZS53YXJuKCdTa2lwIHNldHVwTGFiZWxzIGR1ZSB0bzonLCAoZXJyb3IgYXMgRXJyb3IgfCB1bmRlZmluZWQpPy5zdGFjayA/PyBlcnJvcik7XG4gICAgfVxuICB9KTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gc2V0dXBMYWJlbChvY3Rva2l0OiBPY3Rva2l0LCBvd25lcjogc3RyaW5nLCByZXBvOiBzdHJpbmcsIG5hbWU6IHN0cmluZywgY29sb3I6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICB0cnkge1xuICAgIC8vIElzc3VlcyBwZXJtaXNzaW9uXG4gICAgYXdhaXQgb2N0b2tpdC5yZXF1ZXN0KCdQT1NUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9sYWJlbHMnLCB7XG4gICAgICBvd25lcixcbiAgICAgIHJlcG8sXG4gICAgICBuYW1lLFxuICAgICAgY29sb3IsXG4gICAgfSk7XG4gIH0gY2F0Y2gge1xuICAgIC8vIElzc3VlcyBwZXJtaXNzaW9uXG4gICAgYXdhaXQgb2N0b2tpdC5yZXF1ZXN0KCdQQVRDSCAvcmVwb3Mve293bmVyfS97cmVwb30vbGFiZWxzL3tuYW1lfScsIHtcbiAgICAgIG93bmVyLFxuICAgICAgcmVwbyxcbiAgICAgIG5hbWUsXG4gICAgICBjb2xvcixcbiAgICB9KTtcbiAgfVxufVxuXG5hc3luYyBmdW5jdGlvbiBkZWxldGVMYWJlbChvY3Rva2l0OiBPY3Rva2l0LCBvd25lcjogc3RyaW5nLCByZXBvOiBzdHJpbmcsIG5hbWU6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICB0cnkge1xuICAgIC8vIElzc3VlcyBwZXJtaXNzaW9uXG4gICAgYXdhaXQgb2N0b2tpdC5yZXF1ZXN0KCdERUxFVEUgL3JlcG9zL3tvd25lcn0ve3JlcG99L2xhYmVscy97bmFtZX0nLCB7XG4gICAgICBvd25lcixcbiAgICAgIHJlcG8sXG4gICAgICBuYW1lLFxuICAgIH0pO1xuICB9IGNhdGNoIHtcbiAgICAvLyBkbyBub3RoaW5nXG4gIH1cbn1cbiIsIi8qIGVzbGludC1kaXNhYmxlIGltcG9ydC14L25vLW5hbWVkLWFzLWRlZmF1bHQtbWVtYmVyICovXG5cbmltcG9ydCBkb3RlbnYgZnJvbSAnZG90ZW52JztcbmltcG9ydCBzb2RpdW0gZnJvbSAnbGlic29kaXVtLXdyYXBwZXJzJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB7IG9wdGlvbnMgfSBmcm9tICcuLi9vcHRpb25zLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZ2V0T2N0b2tpdCwgZ2l0SHViVXRpbCwgaGFzR2l0SHViVG9rZW4gfSBmcm9tICcuLi91dGlscy9naXRodWJVdGlsLmpzJztcblxuY29uc3QgREVQUkVDQVRFRF9TRUNSRVRfTkFNRVMgPSBbJ1JFQURZX0RJU0NPUkRfV0VCSE9PS19VUkwnLCAnR0hfQk9UX1BBVCcsICdQVUJMSUNfR0hfQk9UX1BBVCddO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gc2V0dXBTZWNyZXRzKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ3NldHVwU2VjcmV0cycsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBbb3duZXIsIHJlcG9dID0gZ2l0SHViVXRpbC5nZXRPcmdBbmROYW1lKGNvbmZpZy5yZXBvc2l0b3J5ID8/ICcnKTtcbiAgICBpZiAoIW93bmVyIHx8ICFyZXBvIHx8IG93bmVyICE9PSAnV2lsbEJvb3N0ZXJMYWInKSByZXR1cm47XG4gICAgaWYgKCFoYXNHaXRIdWJUb2tlbihvd25lcikgfHwgIW9wdGlvbnMuZG9lc1VwbG9hZEVudlZhcnMpIHJldHVybjtcblxuICAgIGNvbnN0IHBhcnNlZCA9IGRvdGVudi5jb25maWcoKS5wYXJzZWQgPz8ge307XG4gICAgaWYgKE9iamVjdC5rZXlzKHBhcnNlZCkubGVuZ3RoID09PSAwKSByZXR1cm47XG5cbiAgICBjb25zdCBvY3Rva2l0ID0gZ2V0T2N0b2tpdChvd25lcik7XG5cbiAgICB0cnkge1xuICAgICAgZm9yIChjb25zdCBzZWNyZXROYW1lIG9mIERFUFJFQ0FURURfU0VDUkVUX05BTUVTKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgLy8gUmVxdWlyZXMgU2VjcmV0cyBwZXJtaXNzaW9uXG4gICAgICAgICAgYXdhaXQgb2N0b2tpdC5yZXF1ZXN0KCdERUxFVEUgL3JlcG9zL3tvd25lcn0ve3JlcG99L2FjdGlvbnMvc2VjcmV0cy97c2VjcmV0X25hbWV9Jywge1xuICAgICAgICAgICAgb3duZXIsXG4gICAgICAgICAgICByZXBvLFxuICAgICAgICAgICAgc2VjcmV0X25hbWU6IHNlY3JldE5hbWUsXG4gICAgICAgICAgfSk7XG4gICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgIC8vIGRvIG5vdGhpbmdcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBSZXF1aXJlcyBTZWNyZXRzIHBlcm1pc3Npb25cbiAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgb2N0b2tpdC5yZXF1ZXN0KCdHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2FjdGlvbnMvc2VjcmV0cy9wdWJsaWMta2V5Jywge1xuICAgICAgICBvd25lcixcbiAgICAgICAgcmVwbyxcbiAgICAgIH0pO1xuICAgICAgY29uc3QgeyBrZXksIGtleV9pZDoga2V5SWQgfSA9IHJlc3BvbnNlLmRhdGE7XG5cbiAgICAgIGF3YWl0IHNvZGl1bS5yZWFkeTtcblxuICAgICAgZm9yIChjb25zdCBbbmFtZSwgc2VjcmV0XSBvZiBPYmplY3QuZW50cmllcyhwYXJzZWQpKSB7XG4gICAgICAgIGlmIChcbiAgICAgICAgICBuYW1lID09PSAnR0hfQk9UX1BBVCcgfHxcbiAgICAgICAgICBuYW1lID09PSAnR0hfQk9UX1BBVF9GT1JfV0lMTEJPT1NURVInIHx8XG4gICAgICAgICAgbmFtZSA9PT0gJ0dIX0JPVF9QQVRfRk9SX1dJTExCT09TVEVSTEFCJ1xuICAgICAgICApIHtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIENvbnZlcnQgU2VjcmV0ICYgQmFzZTY0IGtleSB0byBVaW50OEFycmF5LlxuICAgICAgICBjb25zdCByYXdLZXkgPSBzb2RpdW0uZnJvbV9iYXNlNjQoa2V5LCBzb2RpdW0uYmFzZTY0X3ZhcmlhbnRzLk9SSUdJTkFMKTtcbiAgICAgICAgY29uc3QgcmF3U2VjID0gc29kaXVtLmZyb21fc3RyaW5nKHNlY3JldCk7XG5cbiAgICAgICAgLy8gRW5jcnlwdCB0aGUgc2VjcmV0IHVzaW5nIExpYlNvZGl1bVxuICAgICAgICBjb25zdCBlbmNCeXRlcyA9IHNvZGl1bS5jcnlwdG9fYm94X3NlYWwocmF3U2VjLCByYXdLZXkpO1xuXG4gICAgICAgIC8vIENvbnZlcnQgZW5jcnlwdGVkIFVpbnQ4QXJyYXkgdG8gQmFzZTY0XG4gICAgICAgIGNvbnN0IGVuY0Jhc2U2NCA9IHNvZGl1bS50b19iYXNlNjQoZW5jQnl0ZXMsIHNvZGl1bS5iYXNlNjRfdmFyaWFudHMuT1JJR0lOQUwpO1xuXG4gICAgICAgIC8vIFJlcXVpcmVzIFNlY3JldHMgcGVybWlzc2lvblxuICAgICAgICBhd2FpdCBvY3Rva2l0LnJlcXVlc3QoJ1BVVCAvcmVwb3Mve293bmVyfS97cmVwb30vYWN0aW9ucy9zZWNyZXRzL3tzZWNyZXRfbmFtZX0nLCB7XG4gICAgICAgICAgb3duZXIsXG4gICAgICAgICAgcmVwbyxcbiAgICAgICAgICBzZWNyZXRfbmFtZTogbmFtZSxcbiAgICAgICAgICBlbmNyeXB0ZWRfdmFsdWU6IGVuY0Jhc2U2NCxcbiAgICAgICAgICBrZXlfaWQ6IGtleUlkLFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgY29uc29sZS53YXJuKCdTa2lwIHNldHVwU2VjcmV0cyBkdWUgdG86JywgKGVycm9yIGFzIEVycm9yIHwgdW5kZWZpbmVkKT8uc3RhY2sgPz8gZXJyb3IpO1xuICAgIH1cbiAgfSk7XG59XG4iLCJpbXBvcnQgeyB3aXRoUmV0cnkgfSBmcm9tICdAd2lsbGJvb3N0ZXIvc2hhcmVkLWxpYic7XG5cbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZ2V0T2N0b2tpdCwgZ2l0SHViVXRpbCwgaGFzR2l0SHViVG9rZW4gfSBmcm9tICcuLi91dGlscy9naXRodWJVdGlsLmpzJztcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHNldHVwR2l0SHViU2V0dGluZ3MoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IFtvd25lciwgcmVwb10gPSBnaXRIdWJVdGlsLmdldE9yZ0FuZE5hbWUoY29uZmlnLnJlcG9zaXRvcnkgPz8gJycpO1xuICBpZiAoIW93bmVyIHx8ICFyZXBvKSByZXR1cm47XG4gIGlmIChvd25lciAhPT0gJ1dpbGxCb29zdGVyJyAmJiBvd25lciAhPT0gJ1dpbGxCb29zdGVyTGFiJykgcmV0dXJuO1xuICBpZiAoIWhhc0dpdEh1YlRva2VuKG93bmVyKSkgcmV0dXJuO1xuXG4gIGNvbnN0IG9jdG9raXQgPSBnZXRPY3Rva2l0KG93bmVyKTtcblxuICAvLyBBZG1pbmlzdHJhdGlvbiBwZXJtaXNzaW9uXG4gIGF3YWl0IHdpdGhSZXRyeSgoKSA9PlxuICAgIG9jdG9raXQucmVxdWVzdCgnUEFUQ0ggL3JlcG9zL3tvd25lcn0ve3JlcG99Jywge1xuICAgICAgb3duZXIsXG4gICAgICByZXBvLFxuICAgICAgYWxsb3dfYXV0b19tZXJnZTogdHJ1ZSxcbiAgICAgIGFsbG93X21lcmdlX2NvbW1pdDogZmFsc2UsXG4gICAgICBhbGxvd19zcXVhc2hfbWVyZ2U6IHRydWUsXG4gICAgICBhbGxvd19yZWJhc2VfbWVyZ2U6IGZhbHNlLFxuICAgICAgYWxsb3dfdXBkYXRlX2JyYW5jaDogdHJ1ZSxcbiAgICAgIGRlbGV0ZV9icmFuY2hfb25fbWVyZ2U6IHRydWUsXG4gICAgICBzcXVhc2hfbWVyZ2VfY29tbWl0X3RpdGxlOiAnUFJfVElUTEUnLFxuICAgICAgc3F1YXNoX21lcmdlX2NvbW1pdF9tZXNzYWdlOiAnQkxBTksnLFxuICAgICAgaGVhZGVyczoge1xuICAgICAgICAnWC1HaXRIdWItQXBpLVZlcnNpb24nOiAnMjAyMi0xMS0yOCcsXG4gICAgICB9LFxuICAgICAgLi4uKGNvbmZpZy5yZXBvc2l0b3J5Py5zdGFydHNXaXRoKCdnaXRodWI6V2lsbEJvb3N0ZXIvJykgPyB7IGFsbG93X2F1dG9fbWVyZ2U6IHRydWUgfSA6IHt9KSxcbiAgICB9KVxuICApO1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHsgZGlzdGFuY2UgfSBmcm9tICdmYXN0ZXN0LWxldmVuc2h0ZWluJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZnNVdGlsIH0gZnJvbSAnLi4vdXRpbHMvZnNVdGlsLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuXG5jb25zdCB0ZW1wbGF0ZXMgPSB7XG4gICdwdWxsX3JlcXVlc3RfdGVtcGxhdGUubWQnOiBgXG5DbG9zZSAjPElzc3VlTnVtYmVyPlxuXG4jIyBTZWxmIENoZWNrXG5cbi0gWyBdIEkndmUgY29uZmlybWVkIFxcYEFsbCBjaGVja3MgaGF2ZSBwYXNzZWRcXGAgb24gdGhpcyBwYWdlLlxuICAtIFBSIHRpdGxlIGZvbGxvd3MgW0FuZ3VsYXIncyBjb21taXQgbWVzc2FnZSBmb3JtYXRdKGh0dHBzOi8vZ2l0aHViLmNvbS9hbmd1bGFyL2FuZ3VsYXIvYmxvYi9tYWluL0NPTlRSSUJVVElORy5tZCMtY29tbWl0LW1lc3NhZ2UtZm9ybWF0KS5cbiAgLSBQUiB0aXRsZSBkb2Vzbid0IGhhdmUgXFxgV0lQOlxcYC5cbiAgLSBUaGUgdGVzdCBjb21tYW5kIChlLmcuLCBcXGB5YXJuIHRlc3RcXGApIHBhc3NlZC5cbiAgLSBUaGUgbGludCBjb21tYW5kIChlLmcuLCBcXGB5YXJuIGxpbnRcXGApIHBhc3NlZC5cbiAgLSBZb3UgbWF5IGxlYXZlIHRoaXMgYm94IHVuY2hlY2tlZCBkdWUgdG8gbG9uZyB3b3JrZmxvd3MuXG4tIFsgXSBJJ3ZlIHJldmlld2VkIG15IGNoYW5nZXMgb24gdGhlIEdpdEh1YiBkaWZmIHZpZXcuXG4tIFsgXSBJJ3ZlIHdyaXR0ZW4gdGhlIHN0ZXBzIHRvIHRlc3QgbXkgY2hhbmdlcy5cbi0gWyBdIEkndmUgYWRkZWQgc2NyZWVuc2hvdHMgKGlmIHRoZSBVSSBjaGFuZ2VkKS5cbiAgLSBZb3UgbWF5IGxlYXZlIHRoaXMgYm94IHVuY2hlY2tlZCBpZiB5b3UgZGlkbid0IG1vZGlmeSB0aGUgVUkuXG5cbjwhLS0gUGxlYXNlIGFkZCBzY3JlZW5zaG90cyBpZiB5b3UgbW9kaWZ5IHRoZSBVSS5cbnwgQ3VycmVudCAgICAgICAgICAgICAgICAgIHwgSW4gY29taW5nICAgICAgICAgICAgICAgIHxcbnwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHxcbnwgPGltZyBzcmM9XCJcIiB3aWR0aD1cIjQwMFwiPiB8IDxpbWcgc3JjPVwiXCIgd2lkdGg9XCI0MDBcIj4gfFxuLS0+XG5cbjwhLS0gUGxlYXNlIGFkZCBzdGVwcyB0byB0ZXN0IHlvdXIgY2hhbmdlcy5cbiMjIFN0ZXBzIHRvIFRlc3RcblxuMS4gT3BlbiBodHRwOi8vbG9jYWxob3N0LWV4ZXJjb2RlLndpbGxib29zdGVyLm5ldDozMDAwL2phLUpQL2NvdXJzZXMvX2V4YW1wbGUvbGVzc29ucy9fZXhhbXBsZV9hX3BsdXNfYi9wcm9ibGVtcy9fZXhhbXBsZV9hX3BsdXNfYiBhZnRlciBsb2dpbi5cbjIuIFNlbGVjdCB0aGUgbGFuZ3VhZ2UgXFxgQ1xcYC5cbjMuIFdyaXRlIHRoZSBmb2xsb3dpbmcgY29kZTpcbiAgIFxcYFxcYFxcYGNcbiAgICNpbmNsdWRlIDxzdGRpby5oPlxuXG4gICBpbnQgbWFpbih2b2lkKSB7XG4gICAgIGludCBhLCBiO1xuXG4gICAgIHNjYW5mKFwiJWQgJWRcIiwgJmEsICZiKTtcbiAgICAgcHJpbnRmKFwiJWRcIiwgYSArIGIpO1xuICAgICByZXR1cm4gMDtcbiAgIH1cbiAgIFxcYFxcYFxcYFxuNC4gUHVzaCBcXGBTdWJtaXRcXGAgYnV0dG9uLlxuNS4gLi4uXG4tLT5cbmAudHJpbSgpLFxufTtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlR2l0SHViVGVtcGxhdGVzKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2dlbmVyYXRlR2l0SHViVGVtcGxhdGVzJywgYXN5bmMgKCkgPT4ge1xuICAgIGZvciAoY29uc3QgW2ZpbGVOYW1lLCBuZXdDb250ZW50XSBvZiBPYmplY3QuZW50cmllcyh0ZW1wbGF0ZXMpKSB7XG4gICAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJy5naXRodWInLCBmaWxlTmFtZSk7XG4gICAgICBpZiAoZnMuZXhpc3RzU3luYyhmaWxlUGF0aCkpIHtcbiAgICAgICAgY29uc3Qgb2xkQ29udGVudCA9IGF3YWl0IGZzLnByb21pc2VzLnJlYWRGaWxlKGZpbGVQYXRoLCAndXRmOCcpO1xuICAgICAgICBpZiAoZGlzdGFuY2Uob2xkQ29udGVudCwgbmV3Q29udGVudCkgPiBuZXdDb250ZW50Lmxlbmd0aCAvIDIpIHtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBhd2FpdCBmcy5wcm9taXNlcy5ta2RpcihwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICcuZ2l0aHViJyksIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICAgICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzVXRpbC5nZW5lcmF0ZUZpbGUoZmlsZVBhdGgsIG5ld0NvbnRlbnQpKTtcbiAgICB9XG4gIH0pO1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IGZzcCBmcm9tICdub2RlOmZzL3Byb21pc2VzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCBmZyBmcm9tICdmYXN0LWdsb2InO1xuaW1wb3J0IHsgc2ltcGxlR2l0IH0gZnJvbSAnc2ltcGxlLWdpdCc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VKc29uIH0gZnJvbSAndHlwZS1mZXN0JztcbmltcG9ydCB7IHogfSBmcm9tICd6b2QnO1xuXG5pbXBvcnQgeyBnZXRPY3Rva2l0LCBnaXRIdWJVdGlsIH0gZnJvbSAnLi91dGlscy9naXRodWJVdGlsLmpzJztcbmltcG9ydCB7IGdsb2JJZ25vcmUgfSBmcm9tICcuL3V0aWxzL2dsb2JVdGlsLmpzJztcblxuZXhwb3J0IGludGVyZmFjZSBQYWNrYWdlQ29uZmlnIHtcbiAgZGlyUGF0aDogc3RyaW5nO1xuICBkb2NrZXJmaWxlOiBzdHJpbmc7XG4gIGlzUm9vdDogYm9vbGVhbjtcbiAgaXNQdWJsaWNSZXBvOiBib29sZWFuO1xuICBpc1JlZmVycmVkQnlPdGhlclJlcG86IGJvb2xlYW47XG4gIHJlcG9zaXRvcnk/OiBzdHJpbmc7XG4gIGlzV2lsbEJvb3N0ZXJSZXBvOiBib29sZWFuO1xuICBpc0J1bjogYm9vbGVhbjtcbiAgaXNFc21QYWNrYWdlOiBib29sZWFuO1xuICBpc1dpbGxCb29zdGVyQ29uZmlnczogYm9vbGVhbjtcbiAgLy8gZGVwZW5kZW5jeSBpbmZvcm1hdGlvblxuICBkb2VzQ29udGFpblN1YlBhY2thZ2VKc29uczogYm9vbGVhbjtcbiAgZG9lc0NvbnRhaW5Eb2NrZXJmaWxlOiBib29sZWFuO1xuICBkb2VzQ29udGFpbkdlbWZpbGU6IGJvb2xlYW47XG4gIGRvZXNDb250YWluR29Nb2Q6IGJvb2xlYW47XG4gIGRvZXNDb250YWluUGFja2FnZUpzb246IGJvb2xlYW47XG4gIGRvZXNDb250YWluUG9ldHJ5TG9jazogYm9vbGVhbjtcbiAgZG9lc0NvbnRhaW5Qb21YbWw6IGJvb2xlYW47XG4gIGRvZXNDb250YWluUHVic3BlY1lhbWw6IGJvb2xlYW47XG4gIGRvZXNDb250YWluVGVtcGxhdGVZYW1sOiBib29sZWFuO1xuICBkb2VzQ29udGFpblZzY29kZVNldHRpbmdzSnNvbjogYm9vbGVhbjtcbiAgLy8gc291cmNlIGNvZGUgZmlsZXNcbiAgZG9lc0NvbnRhaW5KYXZhU2NyaXB0OiBib29sZWFuO1xuICBkb2VzQ29udGFpblR5cGVTY3JpcHQ6IGJvb2xlYW47XG4gIGRvZXNDb250YWluSnN4T3JUc3g6IGJvb2xlYW47XG4gIGRvZXNDb250YWluSmF2YVNjcmlwdEluUGFja2FnZXM6IGJvb2xlYW47XG4gIGRvZXNDb250YWluVHlwZVNjcmlwdEluUGFja2FnZXM6IGJvb2xlYW47XG4gIGRvZXNDb250YWluSnN4T3JUc3hJblBhY2thZ2VzOiBib29sZWFuO1xuXG4gIGhhc1N0YXJ0VGVzdDogYm9vbGVhbjtcblxuICBkZXBlbmRpbmc6IHtcbiAgICBibGl0ejogYm9vbGVhbjtcbiAgICBmaXJlYmFzZTogYm9vbGVhbjtcbiAgICBnZW5JMThuVHM6IGJvb2xlYW47XG4gICAgbGl0ZXN0cmVhbTogYm9vbGVhbjtcbiAgICBuZXh0OiBib29sZWFuO1xuICAgIHBsYXl3cmlnaHRUZXN0OiBib29sZWFuO1xuICAgIHByaXNtYTogYm9vbGVhbjtcbiAgICBweXJpZ2h0OiBib29sZWFuO1xuICAgIHJlYWN0OiBib29sZWFuO1xuICAgIHJlYWN0TmF0aXZlOiBib29sZWFuO1xuICAgIHNlbWFudGljUmVsZWFzZTogYm9vbGVhbjtcbiAgICBzdG9yeWJvb2s6IGJvb2xlYW47XG4gICAgd2I6IGJvb2xlYW47XG4gIH07XG4gIHJlbGVhc2U6IHtcbiAgICBicmFuY2hlczogc3RyaW5nW107XG4gICAgZ2l0aHViOiBib29sZWFuO1xuICAgIG5wbTogYm9vbGVhbjtcbiAgfTtcbiAgZXNsaW50QmFzZT86IEVzbGludEV4dGVuc2lvbkJhc2U7XG4gIHZlcnNpb25zVGV4dD86IHN0cmluZztcbiAgcGFja2FnZUpzb24/OiBQYWNrYWdlSnNvbjtcbiAgd2JmeUpzb24/OiBXYmZ5SnNvbjtcbn1cblxudHlwZSBXYmZ5SnNvbiA9IHouaW5mZXI8dHlwZW9mIHdiZnlKc29uU2NoZW1hPjtcblxuY29uc3Qgd2JmeUpzb25TY2hlbWEgPSB6Lm9iamVjdCh7XG4gIHR5cG9zOiB6XG4gICAgLm9iamVjdCh7XG4gICAgICBhbGw6IHoucmVjb3JkKHouc3RyaW5nKCksIHouc3RyaW5nKCkpLm9wdGlvbmFsKCksXG4gICAgICBkb2M6IHoucmVjb3JkKHouc3RyaW5nKCksIHouc3RyaW5nKCkpLm9wdGlvbmFsKCksXG4gICAgICB0czogei5yZWNvcmQoei5zdHJpbmcoKSwgei5zdHJpbmcoKSkub3B0aW9uYWwoKSxcbiAgICAgIHRleHQ6IHoucmVjb3JkKHouc3RyaW5nKCksIHouc3RyaW5nKCkpLm9wdGlvbmFsKCksXG4gICAgfSlcbiAgICAub3B0aW9uYWwoKSxcbn0pO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2V0UGFja2FnZUNvbmZpZyhcbiAgZGlyUGF0aDogc3RyaW5nLFxuICByb290Q29uZmlnPzogUGFja2FnZUNvbmZpZ1xuKTogUHJvbWlzZTxQYWNrYWdlQ29uZmlnIHwgdW5kZWZpbmVkPiB7XG4gIGNvbnN0IHBhY2thZ2VKc29uUGF0aCA9IHBhdGgucmVzb2x2ZShkaXJQYXRoLCAncGFja2FnZS5qc29uJyk7XG4gIHRyeSB7XG4gICAgY29uc3QgZG9lc0NvbnRhaW5QYWNrYWdlSnNvbiA9IGZzLmV4aXN0c1N5bmMocGFja2FnZUpzb25QYXRoKTtcbiAgICBsZXQgZGVwZW5kZW5jaWVzOiBQYWNrYWdlSnNvblsnZGVwZW5kZW5jaWVzJ10gPSB7fTtcbiAgICBsZXQgZGV2RGVwZW5kZW5jaWVzOiBQYWNrYWdlSnNvblsnZGV2RGVwZW5kZW5jaWVzJ10gPSB7fTtcbiAgICBsZXQgcGFja2FnZUpzb246IFBhY2thZ2VKc29uID0ge307XG4gICAgbGV0IGVzbVBhY2thZ2UgPSBmYWxzZTtcbiAgICBpZiAoZG9lc0NvbnRhaW5QYWNrYWdlSnNvbikge1xuICAgICAgY29uc3QgcGFja2FnZUpzb25UZXh0ID0gZnMucmVhZEZpbGVTeW5jKHBhY2thZ2VKc29uUGF0aCwgJ3V0ZjgnKTtcbiAgICAgIHBhY2thZ2VKc29uID0gSlNPTi5wYXJzZShwYWNrYWdlSnNvblRleHQpIGFzIFBhY2thZ2VKc29uO1xuICAgICAgZGVwZW5kZW5jaWVzID0gcGFja2FnZUpzb24uZGVwZW5kZW5jaWVzID8/IHt9O1xuICAgICAgZGV2RGVwZW5kZW5jaWVzID0gcGFja2FnZUpzb24uZGV2RGVwZW5kZW5jaWVzID8/IHt9O1xuICAgICAgZXNtUGFja2FnZSA9IHBhY2thZ2VKc29uLnR5cGUgPT09ICdtb2R1bGUnO1xuICAgIH1cblxuICAgIGxldCByZWxlYXNlQnJhbmNoZXM6IHN0cmluZ1tdID0gW107XG4gICAgbGV0IHJlbGVhc2VQbHVnaW5zOiBzdHJpbmdbXSA9IFtdO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCByZWxlYXNlcmNKc29uUGF0aCA9IHBhdGgucmVzb2x2ZShkaXJQYXRoLCAnLnJlbGVhc2VyYy5qc29uJyk7XG4gICAgICBjb25zdCBqc29uID0gSlNPTi5wYXJzZShhd2FpdCBmc3AucmVhZEZpbGUocmVsZWFzZXJjSnNvblBhdGgsICd1dGY4JykpIGFzXG4gICAgICAgIHwge1xuICAgICAgICAgICAgYnJhbmNoZXM6IHN0cmluZ1tdO1xuICAgICAgICAgICAgcGx1Z2lucz86IHN0cmluZ1tdW107XG4gICAgICAgICAgfVxuICAgICAgICB8IHVuZGVmaW5lZDtcbiAgICAgIHJlbGVhc2VCcmFuY2hlcyA9IGpzb24/LmJyYW5jaGVzID8/IFtdO1xuICAgICAgcmVsZWFzZVBsdWdpbnMgPSBqc29uPy5wbHVnaW5zPy5mbGF0KCkgPz8gW107XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBkbyBub3RoaW5nXG4gICAgfVxuXG4gICAgY29uc3QgaXNSb290ID1cbiAgICAgIHBhdGguYmFzZW5hbWUocGF0aC5yZXNvbHZlKGRpclBhdGgsICcuLicpKSAhPT0gJ3BhY2thZ2VzJyB8fFxuICAgICAgIWZzLmV4aXN0c1N5bmMocGF0aC5yZXNvbHZlKGRpclBhdGgsICcuLicsICcuLicsICdwYWNrYWdlLmpzb24nKSk7XG5cbiAgICBsZXQgcmVwb0luZm86IFJlY29yZDxzdHJpbmcsIHVua25vd24+IHwgdW5kZWZpbmVkO1xuICAgIGlmIChpc1Jvb3QpIHtcbiAgICAgIHJlcG9JbmZvID0gYXdhaXQgZmV0Y2hSZXBvSW5mbyhkaXJQYXRoLCBwYWNrYWdlSnNvbik7XG4gICAgfVxuXG4gICAgbGV0IHZlcnNpb25zVGV4dCA9ICcnO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBjb250ZW50ID0gYXdhaXQgZnNwLnJlYWRGaWxlKHBhdGgucmVzb2x2ZShkaXJQYXRoLCAnLnRvb2wtdmVyc2lvbnMnKSwgJ3V0ZjgnKTtcbiAgICAgIHZlcnNpb25zVGV4dCArPSBjb250ZW50LnRyaW0oKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIGRvIG5vdGhpbmdcbiAgICB9XG4gICAgZm9yIChjb25zdCBbcHJlZml4LCBuYW1lXSBvZiBbXG4gICAgICBbJ2phdmEnLCAnamF2YSddLFxuICAgICAgWydub2RlJywgJ25vZGVqcyddLFxuICAgICAgWydweXRob24nLCAncHl0aG9uJ10sXG4gICAgXSkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3Qgbm9kZVZlcnNpb25Db250ZW50ID0gYXdhaXQgZnNwLnJlYWRGaWxlKHBhdGgucmVzb2x2ZShkaXJQYXRoLCBgLiR7cHJlZml4fS12ZXJzaW9uYCksICd1dGY4Jyk7XG4gICAgICAgIGlmICh2ZXJzaW9uc1RleHQpIHtcbiAgICAgICAgICB2ZXJzaW9uc1RleHQgKz0gJ1xcbic7XG4gICAgICAgIH1cbiAgICAgICAgdmVyc2lvbnNUZXh0ICs9IGAke25hbWV9ICR7bm9kZVZlcnNpb25Db250ZW50LnRyaW0oKX1gO1xuICAgICAgfSBjYXRjaCB7XG4gICAgICAgIC8vIGRvIG5vdGhpbmdcbiAgICAgIH1cbiAgICB9XG5cbiAgICBsZXQgZG9ja2VyZmlsZSA9ICcnO1xuICAgIHRyeSB7XG4gICAgICBkb2NrZXJmaWxlID0gYXdhaXQgZnNwLnJlYWRGaWxlKHBhdGgucmVzb2x2ZShkaXJQYXRoLCAnRG9ja2VyZmlsZScpLCAndXRmOCcpO1xuICAgIH0gY2F0Y2gge1xuICAgICAgLy8gZG8gbm90aGluZ1xuICAgIH1cblxuICAgIC8vIFJlYWQgd2JmeS5qc29uXG4gICAgY29uc3Qgd2JmeUpzb25QYXRoID0gcGF0aC5yZXNvbHZlKGRpclBhdGgsICd3YmZ5Lmpzb24nKTtcbiAgICBsZXQgd2JmeUpzb246IFdiZnlKc29uIHwgdW5kZWZpbmVkO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCB3YmZ5SnNvblRleHQgPSBhd2FpdCBmc3AucmVhZEZpbGUod2JmeUpzb25QYXRoLCAndXRmOCcpO1xuICAgICAgd2JmeUpzb24gPSB3YmZ5SnNvblNjaGVtYS5wYXJzZShKU09OLnBhcnNlKHdiZnlKc29uVGV4dCkpO1xuICAgIH0gY2F0Y2gge1xuICAgICAgLy8gZG8gbm90aGluZ1xuICAgIH1cblxuICAgIGNvbnN0IHJlcG9zaXRvcnkgPSByZXBvSW5mbz8uZnVsbF9uYW1lID8gYGdpdGh1Yjoke3JlcG9JbmZvLmZ1bGxfbmFtZSBhcyBzdHJpbmd9YCA6IHVuZGVmaW5lZDtcbiAgICBjb25zdCBjb25maWc6IFBhY2thZ2VDb25maWcgPSB7XG4gICAgICBkaXJQYXRoLFxuICAgICAgZG9ja2VyZmlsZSxcbiAgICAgIGlzUm9vdCxcbiAgICAgIGlzUHVibGljUmVwbzogcmVwb0luZm8/LnByaXZhdGUgPT09IGZhbHNlLFxuICAgICAgaXNSZWZlcnJlZEJ5T3RoZXJSZXBvOiAhIXBhY2thZ2VKc29uLmZpbGVzLFxuICAgICAgcmVwb3NpdG9yeTogcmVwb0luZm8/LmZ1bGxfbmFtZSA/IGBnaXRodWI6JHtyZXBvSW5mby5mdWxsX25hbWUgYXMgc3RyaW5nfWAgOiB1bmRlZmluZWQsXG4gICAgICBpc1dpbGxCb29zdGVyUmVwbzogQm9vbGVhbihcbiAgICAgICAgcmVwb3NpdG9yeT8uc3RhcnRzV2l0aCgnZ2l0aHViOldpbGxCb29zdGVyLycpIHx8IHJlcG9zaXRvcnk/LnN0YXJ0c1dpdGgoJ2dpdGh1YjpXaWxsQm9vc3RlckxhYi8nKVxuICAgICAgKSxcbiAgICAgIGlzQnVuOiByb290Q29uZmlnPy5pc0J1biB8fCBmcy5leGlzdHNTeW5jKHBhdGguam9pbihkaXJQYXRoLCAnYnVuZmlnLnRvbWwnKSksXG4gICAgICBpc0VzbVBhY2thZ2U6IGVzbVBhY2thZ2UsXG4gICAgICBpc1dpbGxCb29zdGVyQ29uZmlnczogcGFja2FnZUpzb25QYXRoLmluY2x1ZGVzKGAke3BhdGguc2VwfXdpbGxib29zdGVyLWNvbmZpZ3NgKSxcbiAgICAgIGRvZXNDb250YWluU3ViUGFja2FnZUpzb25zOiBjb250YWluc0FueSgncGFja2FnZXMvKiovcGFja2FnZS5qc29uJywgZGlyUGF0aCksXG4gICAgICBkb2VzQ29udGFpbkRvY2tlcmZpbGU6ICEhZG9ja2VyZmlsZSB8fCBmcy5leGlzdHNTeW5jKHBhdGgucmVzb2x2ZShkaXJQYXRoLCAnZG9ja2VyLWNvbXBvc2UueW1sJykpLFxuICAgICAgZG9lc0NvbnRhaW5HZW1maWxlOiBmcy5leGlzdHNTeW5jKHBhdGgucmVzb2x2ZShkaXJQYXRoLCAnR2VtZmlsZScpKSxcbiAgICAgIGRvZXNDb250YWluR29Nb2Q6IGZzLmV4aXN0c1N5bmMocGF0aC5yZXNvbHZlKGRpclBhdGgsICdnby5tb2QnKSksXG4gICAgICBkb2VzQ29udGFpblBhY2thZ2VKc29uOiBmcy5leGlzdHNTeW5jKHBhdGgucmVzb2x2ZShkaXJQYXRoLCAncGFja2FnZS5qc29uJykpLFxuICAgICAgZG9lc0NvbnRhaW5Qb2V0cnlMb2NrOiBmcy5leGlzdHNTeW5jKHBhdGgucmVzb2x2ZShkaXJQYXRoLCAncG9ldHJ5LmxvY2snKSksXG4gICAgICBkb2VzQ29udGFpblBvbVhtbDogZnMuZXhpc3RzU3luYyhwYXRoLnJlc29sdmUoZGlyUGF0aCwgJ3BvbS54bWwnKSksXG4gICAgICBkb2VzQ29udGFpblB1YnNwZWNZYW1sOiBmcy5leGlzdHNTeW5jKHBhdGgucmVzb2x2ZShkaXJQYXRoLCAncHVic3BlYy55YW1sJykpLFxuICAgICAgZG9lc0NvbnRhaW5UZW1wbGF0ZVlhbWw6IGZzLmV4aXN0c1N5bmMocGF0aC5yZXNvbHZlKGRpclBhdGgsICd0ZW1wbGF0ZS55YW1sJykpLFxuICAgICAgZG9lc0NvbnRhaW5Wc2NvZGVTZXR0aW5nc0pzb246IGZzLmV4aXN0c1N5bmMocGF0aC5yZXNvbHZlKGRpclBhdGgsICcudnNjb2RlJywgJ3NldHRpbmdzLmpzb24nKSksXG4gICAgICBkb2VzQ29udGFpbkphdmFTY3JpcHQ6IGNvbnRhaW5zQW55KCd7YXBwLHNyYyx0ZXN0LHNjcmlwdHN9LyoqLyoue2NqcyxtanMsanMsanN4fScsIGRpclBhdGgpLFxuICAgICAgZG9lc0NvbnRhaW5UeXBlU2NyaXB0OiBjb250YWluc0FueSgne2FwcCxzcmMsdGVzdCxzY3JpcHRzfS8qKi8qLntjdHMsbXRzLHRzLHRzeH0nLCBkaXJQYXRoKSxcbiAgICAgIGRvZXNDb250YWluSnN4T3JUc3g6IGNvbnRhaW5zQW55KCd7YXBwLHNyYyx0ZXN0fS8qKi8qLnt0LGp9c3gnLCBkaXJQYXRoKSxcbiAgICAgIGRvZXNDb250YWluSmF2YVNjcmlwdEluUGFja2FnZXM6IGNvbnRhaW5zQW55KCdwYWNrYWdlcy8qKi97YXBwLHNyYyx0ZXN0LHNjcmlwdHN9LyoqLyoue2NqcyxtanMsanMsanN4fScsIGRpclBhdGgpLFxuICAgICAgZG9lc0NvbnRhaW5UeXBlU2NyaXB0SW5QYWNrYWdlczogY29udGFpbnNBbnkoJ3BhY2thZ2VzLyoqL3thcHAsc3JjLHRlc3Qsc2NyaXB0c30vKiovKi57Y3RzLG10cyx0cyx0c3h9JywgZGlyUGF0aCksXG4gICAgICBkb2VzQ29udGFpbkpzeE9yVHN4SW5QYWNrYWdlczogY29udGFpbnNBbnkoJ3BhY2thZ2VzLyoqL3thcHAsc3JjLHRlc3R9LyoqLyoue3Qsan1zeCcsIGRpclBhdGgpLFxuICAgICAgaGFzU3RhcnRUZXN0OiAhIXBhY2thZ2VKc29uLnNjcmlwdHM/Llsnc3RhcnQtdGVzdCddLFxuICAgICAgZGVwZW5kaW5nOiB7XG4gICAgICAgIGJsaXR6OiAhIWRlcGVuZGVuY2llcy5ibGl0eixcbiAgICAgICAgZmlyZWJhc2U6ICEhZGV2RGVwZW5kZW5jaWVzWydmaXJlYmFzZS10b29scyddLFxuICAgICAgICBnZW5JMThuVHM6ICEhZGV2RGVwZW5kZW5jaWVzWydnZW4taTE4bi10cyddLFxuICAgICAgICBsaXRlc3RyZWFtOiBkb2NrZXJmaWxlLmluY2x1ZGVzKCdpbnN0YWxsLWxpdGVzdHJlYW0uc2gnKSxcbiAgICAgICAgcmVhY3Q6ICEhZGVwZW5kZW5jaWVzLnJlYWN0LFxuICAgICAgICBuZXh0OiAhIWRlcGVuZGVuY2llcy5uZXh0LFxuICAgICAgICBwbGF5d3JpZ2h0VGVzdDpcbiAgICAgICAgICAhIWRlcGVuZGVuY2llc1snQHBsYXl3cmlnaHQvdGVzdCddIHx8ICEhZGV2RGVwZW5kZW5jaWVzWydAcGxheXdyaWdodC90ZXN0J10gfHwgISFkZXZEZXBlbmRlbmNpZXMucGxheXdyaWdodCxcbiAgICAgICAgcHJpc21hOiAhIWRlcGVuZGVuY2llc1snQHByaXNtYS9jbGllbnQnXSB8fCAhIWRldkRlcGVuZGVuY2llcy5wcmlzbWEsXG4gICAgICAgIHB5cmlnaHQ6ICEhZGV2RGVwZW5kZW5jaWVzLnB5cmlnaHQsXG4gICAgICAgIHJlYWN0TmF0aXZlOiAhIWRlcGVuZGVuY2llc1sncmVhY3QtbmF0aXZlJ10sXG4gICAgICAgIHNlbWFudGljUmVsZWFzZTogISEoXG4gICAgICAgICAgZGV2RGVwZW5kZW5jaWVzWydzZW1hbnRpYy1yZWxlYXNlJ10gfHxcbiAgICAgICAgICByZWxlYXNlQnJhbmNoZXMubGVuZ3RoID4gMCB8fFxuICAgICAgICAgIHJlbGVhc2VQbHVnaW5zLmxlbmd0aCA+IDBcbiAgICAgICAgKSxcbiAgICAgICAgc3Rvcnlib29rOiAhIWRldkRlcGVuZGVuY2llc1snQHN0b3J5Ym9vay9yZWFjdCddLFxuICAgICAgICB3YjogISFkZXBlbmRlbmNpZXNbJ0B3aWxsYm9vc3Rlci93YiddIHx8ICEhZGV2RGVwZW5kZW5jaWVzWydAd2lsbGJvb3N0ZXIvd2InXSxcbiAgICAgIH0sXG4gICAgICByZWxlYXNlOiB7XG4gICAgICAgIGJyYW5jaGVzOiByZWxlYXNlQnJhbmNoZXMsXG4gICAgICAgIGdpdGh1YjogcmVsZWFzZVBsdWdpbnMuaW5jbHVkZXMoJ0BzZW1hbnRpYy1yZWxlYXNlL2dpdGh1YicpLFxuICAgICAgICBucG06IHJlbGVhc2VQbHVnaW5zLmluY2x1ZGVzKCdAc2VtYW50aWMtcmVsZWFzZS9ucG0nKSxcbiAgICAgIH0sXG4gICAgICB2ZXJzaW9uc1RleHQsXG4gICAgICBwYWNrYWdlSnNvbixcbiAgICAgIHdiZnlKc29uLFxuICAgIH07XG4gICAgaWYgKCFjb25maWcuaXNCdW4pIHtcbiAgICAgIGNvbmZpZy5lc2xpbnRCYXNlID0gZ2V0RXNsaW50RXh0ZW5zaW9uQmFzZShjb25maWcpO1xuICAgIH1cbiAgICBpZiAoXG4gICAgICBjb25maWcuZG9lc0NvbnRhaW5HZW1maWxlIHx8XG4gICAgICBjb25maWcuZG9lc0NvbnRhaW5Hb01vZCB8fFxuICAgICAgY29uZmlnLmRvZXNDb250YWluUGFja2FnZUpzb24gfHxcbiAgICAgIGNvbmZpZy5kb2VzQ29udGFpblBvZXRyeUxvY2sgfHxcbiAgICAgIGNvbmZpZy5kb2VzQ29udGFpblBvbVhtbCB8fFxuICAgICAgY29uZmlnLmRvZXNDb250YWluUHVic3BlY1lhbWwgfHxcbiAgICAgIGNvbmZpZy5kb2VzQ29udGFpblRlbXBsYXRlWWFtbFxuICAgICkge1xuICAgICAgcmV0dXJuIGNvbmZpZztcbiAgICB9XG4gIH0gY2F0Y2gge1xuICAgIC8vIGRvIG5vdGhpbmdcbiAgfVxufVxuXG5mdW5jdGlvbiBjb250YWluc0FueShwYXR0ZXJuOiBzdHJpbmcsIGRpclBhdGg6IHN0cmluZyk6IGJvb2xlYW4ge1xuICByZXR1cm4gZmcuZ2xvYlN5bmMocGF0dGVybiwgeyBkb3Q6IHRydWUsIGN3ZDogZGlyUGF0aCwgaWdub3JlOiBnbG9iSWdub3JlIH0pLmxlbmd0aCA+IDA7XG59XG5cbmV4cG9ydCB0eXBlIEVzbGludEV4dGVuc2lvbkJhc2UgPVxuICB8ICdAd2lsbGJvb3N0ZXIvZXNsaW50LWNvbmZpZy10cy1yZWFjdCdcbiAgfCAnQHdpbGxib29zdGVyL2VzbGludC1jb25maWctdHMnXG4gIHwgJ0B3aWxsYm9vc3Rlci9lc2xpbnQtY29uZmlnLWpzLXJlYWN0J1xuICB8ICdAd2lsbGJvb3N0ZXIvZXNsaW50LWNvbmZpZy1qcydcbiAgfCAnQHdpbGxib29zdGVyL2VzbGludC1jb25maWctbmV4dCc7XG5cbmZ1bmN0aW9uIGdldEVzbGludEV4dGVuc2lvbkJhc2UoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogRXNsaW50RXh0ZW5zaW9uQmFzZSB8IHVuZGVmaW5lZCB7XG4gIGlmIChjb25maWcuZGVwZW5kaW5nLm5leHQpIHtcbiAgICByZXR1cm4gJ0B3aWxsYm9vc3Rlci9lc2xpbnQtY29uZmlnLW5leHQnO1xuICB9IGVsc2UgaWYgKGNvbmZpZy5kb2VzQ29udGFpblR5cGVTY3JpcHQpIHtcbiAgICByZXR1cm4gY29uZmlnLmRvZXNDb250YWluSnN4T3JUc3ggPyAnQHdpbGxib29zdGVyL2VzbGludC1jb25maWctdHMtcmVhY3QnIDogJ0B3aWxsYm9vc3Rlci9lc2xpbnQtY29uZmlnLXRzJztcbiAgfSBlbHNlIHtcbiAgICBpZiAoY29uZmlnLmRvZXNDb250YWluSnN4T3JUc3gpIHtcbiAgICAgIHJldHVybiAnQHdpbGxib29zdGVyL2VzbGludC1jb25maWctanMtcmVhY3QnO1xuICAgIH0gZWxzZSBpZiAoY29uZmlnLmRvZXNDb250YWluSmF2YVNjcmlwdCkge1xuICAgICAgcmV0dXJuICdAd2lsbGJvb3N0ZXIvZXNsaW50LWNvbmZpZy1qcyc7XG4gICAgfVxuICB9XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGZldGNoUmVwb0luZm8oZGlyUGF0aDogc3RyaW5nLCBwYWNrYWdlSnNvbjogUGFja2FnZUpzb24pOiBQcm9taXNlPFJlY29yZDxzdHJpbmcsIHVua25vd24+IHwgdW5kZWZpbmVkPiB7XG4gIGNvbnN0IGdpdCA9IHNpbXBsZUdpdChkaXJQYXRoKTtcbiAgY29uc3QgcmVtb3RlcyA9IGF3YWl0IGdpdC5nZXRSZW1vdGVzKHRydWUpO1xuICBjb25zdCBvcmlnaW4gPSByZW1vdGVzLmZpbmQoKHIpID0+IHIubmFtZSA9PT0gJ29yaWdpbicpO1xuICBjb25zdCByZW1vdGVVcmwgPSBvcmlnaW4/LnJlZnMuZmV0Y2ggPz8gb3JpZ2luPy5yZWZzLnB1c2g7XG4gIGlmICh0eXBlb2YgcmVtb3RlVXJsID09PSAnc3RyaW5nJykge1xuICAgIGNvbnN0IGpzb24gPSBhd2FpdCByZXF1ZXN0UmVwb0luZm8ocmVtb3RlVXJsKTtcbiAgICBpZiAoanNvbikgcmV0dXJuIGpzb247XG4gIH1cblxuICBjb25zdCB1cmwgPSB0eXBlb2YgcGFja2FnZUpzb24ucmVwb3NpdG9yeSA9PT0gJ3N0cmluZycgPyBwYWNrYWdlSnNvbi5yZXBvc2l0b3J5IDogcGFja2FnZUpzb24ucmVwb3NpdG9yeT8udXJsO1xuICBpZiAodXJsKSB7XG4gICAgY29uc3QganNvbiA9IGF3YWl0IHJlcXVlc3RSZXBvSW5mbyh1cmwpO1xuICAgIGlmIChqc29uICYmIGpzb24ubWVzc2FnZSAhPT0gJ05vdCBGb3VuZCcpIHJldHVybiBqc29uO1xuICB9XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHJlcXVlc3RSZXBvSW5mbyh1cmxPckZ1bGxOYW1lOiBzdHJpbmcpOiBQcm9taXNlPFJlY29yZDxzdHJpbmcsIHVua25vd24+IHwgdW5kZWZpbmVkPiB7XG4gIGNvbnN0IFtvcmcsIG5hbWVdID0gZ2l0SHViVXRpbC5nZXRPcmdBbmROYW1lKHVybE9yRnVsbE5hbWUpO1xuICBpZiAoIW9yZyB8fCAhbmFtZSkgcmV0dXJuO1xuXG4gIGNvbnN0IHJldCA9IHsgZnVsbF9uYW1lOiBgJHtvcmd9LyR7bmFtZX1gIH07XG4gIHRyeSB7XG4gICAgLy8gTWV0YWRhdGEgcGVybWlzc2lvblxuICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZ2V0T2N0b2tpdCgpLnJlcXVlc3QoJ0dFVCAvcmVwb3Mve293bmVyfS97cmVwb30nLCB7XG4gICAgICBvd25lcjogb3JnLFxuICAgICAgcmVwbzogbmFtZSxcbiAgICB9KTtcbiAgICBPYmplY3QuYXNzaWduKHJldCwgcmVzcG9uc2UuZGF0YSk7XG4gIH0gY2F0Y2gge1xuICAgIC8vIGRvIG5vdGhpbmdcbiAgfVxuICByZXR1cm4gcmV0O1xufVxuIiwiaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5cbmNvbnN0IEVTTElOVF9DT05GSUdfUFJFRklYID0gJ0B3aWxsYm9vc3Rlci9lc2xpbnQtY29uZmlnLSc7XG5cbmV4cG9ydCBmdW5jdGlvbiBzaG91bGRTa2lwV2lsbGJvb3N0ZXJDb25maWdzRXNsaW50UGFja2FnZShjb25maWc6IFBhY2thZ2VDb25maWcpOiBib29sZWFuIHtcbiAgcmV0dXJuIGNvbmZpZy5pc1dpbGxCb29zdGVyQ29uZmlncyAmJiBjb25maWcucGFja2FnZUpzb24/Lm5hbWU/LnN0YXJ0c1dpdGgoRVNMSU5UX0NPTkZJR19QUkVGSVgpID09PSB0cnVlO1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHsgaWdub3JlRXJyb3JBc3luYyB9IGZyb20gJ0B3aWxsYm9vc3Rlci9zaGFyZWQtbGliJztcbmltcG9ydCBmZyBmcm9tICdmYXN0LWdsb2InO1xuaW1wb3J0IHlhcmdzIGZyb20gJ3lhcmdzJztcblxuaW1wb3J0IHsgZml4RG9ja2VyZmlsZSB9IGZyb20gJy4vZml4ZXJzL2RvY2tlcmZpbGUuanMnO1xuaW1wb3J0IHsgZml4TmV4dENvbmZpZ0pzb24gfSBmcm9tICcuL2ZpeGVycy9uZXh0Q29uZmlnLmpzJztcbmltcG9ydCB7IGZpeFBsYXl3cmlnaHRDb25maWcgfSBmcm9tICcuL2ZpeGVycy9wbGF5d3JpZ2h0Q29uZmlnLmpzJztcbmltcG9ydCB7IGZpeFByaXNtYUVudkZpbGVzIH0gZnJvbSAnLi9maXhlcnMvcHJpc21hLmpzJztcbmltcG9ydCB7IGZpeFRlc3REaXJlY3Rvcmllc1VwZGF0aW5nUGFja2FnZUpzb24gfSBmcm9tICcuL2ZpeGVycy90ZXN0RGlyZWN0b3J5LmpzJztcbmltcG9ydCB7IGZpeFR5cGVEZWZpbml0aW9ucyB9IGZyb20gJy4vZml4ZXJzL3R5cGVEZWZpbml0aW9uLmpzJztcbmltcG9ydCB7IGZpeFR5cG9zIH0gZnJvbSAnLi9maXhlcnMvdHlwb3MuanMnO1xuaW1wb3J0IHsgZ2VuZXJhdGVBZ2VudEluc3RydWN0aW9ucyB9IGZyb20gJy4vZ2VuZXJhdG9ycy9hZ2VudHMuanMnO1xuaW1wb3J0IHsgZ2VuZXJhdGVUb29sVmVyc2lvbnMgfSBmcm9tICcuL2dlbmVyYXRvcnMvYXNkZi5qcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZUJpb21lSnNvbmMgfSBmcm9tICcuL2dlbmVyYXRvcnMvYmlvbWUuanMnO1xuaW1wb3J0IHsgZ2VuZXJhdGVCdW5maWdUb21sIH0gZnJvbSAnLi9nZW5lcmF0b3JzL2J1bmZpZy5qcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZURvY2tlcmlnbm9yZSB9IGZyb20gJy4vZ2VuZXJhdG9ycy9kb2NrZXJpZ25vcmUuanMnO1xuaW1wb3J0IHsgZ2VuZXJhdGVFZGl0b3Jjb25maWcgfSBmcm9tICcuL2dlbmVyYXRvcnMvZWRpdG9yY29uZmlnLmpzJztcbmltcG9ydCB7IGdlbmVyYXRlRXNsaW50cmMgfSBmcm9tICcuL2dlbmVyYXRvcnMvZXNsaW50Q29uZmlnLmpzJztcbmltcG9ydCB7IGdlbmVyYXRlR2VtaW5pQ29uZmlnIH0gZnJvbSAnLi9nZW5lcmF0b3JzL2dlbWluaUNvbmZpZy5qcyc7XG5pbXBvcnQgeyByZW1vdmVHZW1pbmlTZXR0aW5ncyB9IGZyb20gJy4vZ2VuZXJhdG9ycy9nZW1pbmlTZXR0aW5ncy5qcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZUdpdGF0dHJpYnV0ZXMgfSBmcm9tICcuL2dlbmVyYXRvcnMvZ2l0YXR0cmlidXRlcy5qcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZUdpdGlnbm9yZSB9IGZyb20gJy4vZ2VuZXJhdG9ycy9naXRpZ25vcmUuanMnO1xuaW1wb3J0IHsgZ2VuZXJhdGVIdXNreXJjVXBkYXRpbmdQYWNrYWdlSnNvbiB9IGZyb20gJy4vZ2VuZXJhdG9ycy9odXNreXJjLmpzJztcbmltcG9ydCB7IGdlbmVyYXRlSWRlYVNldHRpbmdzIH0gZnJvbSAnLi9nZW5lcmF0b3JzL2lkZWEuanMnO1xuaW1wb3J0IHsgZ2VuZXJhdGVMZWZ0aG9va1VwZGF0aW5nUGFja2FnZUpzb24gfSBmcm9tICcuL2dlbmVyYXRvcnMvbGVmdGhvb2suanMnO1xuaW1wb3J0IHsgZ2VuZXJhdGVMaW50c3RhZ2VkcmMgfSBmcm9tICcuL2dlbmVyYXRvcnMvbGludHN0YWdlZHJjLmpzJztcbmltcG9ydCB7IGdlbmVyYXRlUGFja2FnZUpzb24gfSBmcm9tICcuL2dlbmVyYXRvcnMvcGFja2FnZUpzb24uanMnO1xuaW1wb3J0IHsgZ2VuZXJhdGVQcmV0dGllcmlnbm9yZSB9IGZyb20gJy4vZ2VuZXJhdG9ycy9wcmV0dGllcmlnbm9yZS5qcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZVB5cmlnaHRDb25maWdKc29uIH0gZnJvbSAnLi9nZW5lcmF0b3JzL3B5cmlnaHRDb25maWcuanMnO1xuaW1wb3J0IHsgZ2VuZXJhdGVSZWFkbWUgfSBmcm9tICcuL2dlbmVyYXRvcnMvcmVhZG1lLmpzJztcbmltcG9ydCB7IGdlbmVyYXRlUmVsZWFzZXJjIH0gZnJvbSAnLi9nZW5lcmF0b3JzL3JlbGVhc2VyYy5qcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZVJlbm92YXRlSnNvbiB9IGZyb20gJy4vZ2VuZXJhdG9ycy9yZW5vdmF0ZUpzb24uanMnO1xuaW1wb3J0IHsgZ2VuZXJhdGVUc2NvbmZpZyB9IGZyb20gJy4vZ2VuZXJhdG9ycy90c2NvbmZpZy5qcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZVZzY29kZVNldHRpbmdzIH0gZnJvbSAnLi9nZW5lcmF0b3JzL3ZzY29kZVNldHRpbmdzLmpzJztcbmltcG9ydCB7IGdlbmVyYXRlV29ya2Zsb3dzLCBpc1JldXNhYmxlV29ya2Zsb3dzUmVwbyB9IGZyb20gJy4vZ2VuZXJhdG9ycy93b3JrZmxvdy5qcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZVlhcm5yY1ltbCB9IGZyb20gJy4vZ2VuZXJhdG9ycy95YXJucmMuanMnO1xuaW1wb3J0IHsgc2V0dXBMYWJlbHMgfSBmcm9tICcuL2dpdGh1Yi9sYWJlbC5qcyc7XG5pbXBvcnQgeyBzZXR1cFNlY3JldHMgfSBmcm9tICcuL2dpdGh1Yi9zZWNyZXQuanMnO1xuaW1wb3J0IHsgc2V0dXBHaXRIdWJTZXR0aW5ncyB9IGZyb20gJy4vZ2l0aHViL3NldHRpbmdzLmpzJztcbmltcG9ydCB7IGdlbmVyYXRlR2l0SHViVGVtcGxhdGVzIH0gZnJvbSAnLi9naXRodWIvdGVtcGxhdGUuanMnO1xuaW1wb3J0IHsgb3B0aW9ucyB9IGZyb20gJy4vb3B0aW9ucy5qcyc7XG5pbXBvcnQgeyBnZXRQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5pbXBvcnQgeyBzcGF3blN5bmMgfSBmcm9tICcuL3V0aWxzL3NwYXduVXRpbC5qcyc7XG5pbXBvcnQgeyBzaG91bGRTa2lwV2lsbGJvb3N0ZXJDb25maWdzRXNsaW50UGFja2FnZSB9IGZyb20gJy4vdXRpbHMvd2lsbGJvb3N0ZXJDb25maWdzVXRpbC5qcyc7XG5cbmFzeW5jIGZ1bmN0aW9uIG1haW4oKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IGFyZ3YgPSBhd2FpdCB5YXJncyhwcm9jZXNzLmFyZ3Yuc2xpY2UoMikpXG4gICAgLmNvbW1hbmQoJyQwIFtwYXRocy4uXScsICdNYWtlIGEgZ2l2ZW4gcHJvamVjdCBmb2xsb3cgdGhlIFdpbGxCb29zdGVyIHN0YW5kYXJkJywgKHlhcmdzKSA9PiB7XG4gICAgICB5YXJncy5wb3NpdGlvbmFsKCdwYXRocycsIHtcbiAgICAgICAgZGVzY3JpYmU6ICdwcm9qZWN0IHBhdGhzIHRvIGJlIHdiZmllZCcsXG4gICAgICAgIGFycmF5OiB0cnVlLFxuICAgICAgICB0eXBlOiAnc3RyaW5nJyxcbiAgICAgICAgZGVmYXVsdDogWycuJ10sXG4gICAgICB9KTtcbiAgICB9KVxuICAgIC5vcHRpb25zKHtcbiAgICAgIGVudjoge1xuICAgICAgICBkZXNjcmlwdGlvbjogJ1VwbG9hZCBlbnZpcm9ubWVudCB2YXJpYWJsZXMgYXMgc2VjcmV0cyB0byBHaXRIdWInLFxuICAgICAgICB0eXBlOiAnYm9vbGVhbicsXG4gICAgICAgIGRlZmF1bHQ6IGZhbHNlLFxuICAgICAgICBhbGlhczogJ2UnLFxuICAgICAgfSxcbiAgICAgIHNraXBEZXBzOiB7XG4gICAgICAgIGRlc2NyaXB0aW9uOiAnU2tpcCBkZXBlbmRlbmN5IGluc3RhbGxhdGlvbicsXG4gICAgICAgIHR5cGU6ICdib29sZWFuJyxcbiAgICAgICAgZGVmYXVsdDogZmFsc2UsXG4gICAgICAgIGFsaWFzOiAnZCcsXG4gICAgICB9LFxuICAgICAgdmVyYm9zZToge1xuICAgICAgICBkZXNjcmlwdGlvbjogJ1doZXRoZXIgb3Igbm90IHRvIGVuYWJsZSB2ZXJib3NlIG1vZGUnLFxuICAgICAgICB0eXBlOiAnYm9vbGVhbicsXG4gICAgICAgIGRlZmF1bHQ6IGZhbHNlLFxuICAgICAgICBhbGlhczogJ3YnLFxuICAgICAgfSxcbiAgICB9KVxuICAgIC52ZXJzaW9uKGdldFZlcnNpb24oKSlcbiAgICAuc3RyaWN0KCkuYXJndjtcbiAgb3B0aW9ucy5pc1ZlcmJvc2UgPSBhcmd2LnZlcmJvc2U7XG4gIG9wdGlvbnMuZG9lc1VwbG9hZEVudlZhcnMgPSBhcmd2LmVudjtcblxuICBmb3IgKGNvbnN0IHJvb3REaXJQYXRoIG9mIGFyZ3YucGF0aHMgYXMgc3RyaW5nW10pIHtcbiAgICAvLyBDbGVhbiB1cCBsb2NrIGZpbGVzIGFuZCBub2RlX21vZHVsZXMgZGlyZWN0b3JpZXNcbiAgICBmcy5ybVN5bmMocGF0aC5qb2luKHJvb3REaXJQYXRoLCAnYnVuLmxvY2snKSwgeyBmb3JjZTogdHJ1ZSB9KTtcbiAgICBmcy5ybVN5bmMocGF0aC5qb2luKHJvb3REaXJQYXRoLCAneWFybi5sb2NrJyksIHsgZm9yY2U6IHRydWUgfSk7XG4gICAgcmVtb3ZlTm9kZU1vZHVsZXNEaXJlY3Rvcmllcyhyb290RGlyUGF0aCk7XG5cbiAgICBjb25zdCBwYWNrYWdlc0RpclBhdGggPSBwYXRoLmpvaW4ocm9vdERpclBhdGgsICdwYWNrYWdlcycpO1xuICAgIGNvbnN0IGRpcmVudHMgPSAoYXdhaXQgaWdub3JlRXJyb3JBc3luYygoKSA9PiBmcy5wcm9taXNlcy5yZWFkZGlyKHBhY2thZ2VzRGlyUGF0aCwgeyB3aXRoRmlsZVR5cGVzOiB0cnVlIH0pKSkgPz8gW107XG4gICAgY29uc3Qgc3ViRGlyUGF0aHMgPSBkaXJlbnRzLmZpbHRlcigoZCkgPT4gZC5pc0RpcmVjdG9yeSgpKS5tYXAoKGQpID0+IHBhdGguam9pbihwYWNrYWdlc0RpclBhdGgsIGQubmFtZSkpO1xuXG4gICAgYXdhaXQgZml4VGVzdERpcmVjdG9yaWVzVXBkYXRpbmdQYWNrYWdlSnNvbihbcm9vdERpclBhdGgsIC4uLnN1YkRpclBhdGhzXSk7XG5cbiAgICBjb25zdCByb290Q29uZmlnID0gYXdhaXQgZ2V0UGFja2FnZUNvbmZpZyhyb290RGlyUGF0aCk7XG4gICAgY29uc29sZS5sb2coJ3Jvb3RDb25maWc6Jywgcm9vdENvbmZpZyk7XG4gICAgaWYgKCFyb290Q29uZmlnKSB7XG4gICAgICBjb25zb2xlLmVycm9yKGB0aGVyZSBpcyBubyB2YWxpZCBwYWNrYWdlLmpzb24gaW4gJHtyb290RGlyUGF0aH1gKTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBjb25zdCBhYmJyZXZpYXRpb25Qcm9taXNlID0gZml4VHlwb3Mocm9vdENvbmZpZyk7XG5cbiAgICBjb25zdCBudWxsYWJsZVN1YlBhY2thZ2VDb25maWdzID0gYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgICBzdWJEaXJQYXRocy5tYXAoKHN1YkRpclBhdGgpID0+IGdldFBhY2thZ2VDb25maWcoc3ViRGlyUGF0aCwgcm9vdENvbmZpZykpXG4gICAgKTtcbiAgICBjb25zdCBzdWJQYWNrYWdlQ29uZmlncyA9IG51bGxhYmxlU3ViUGFja2FnZUNvbmZpZ3MuZmlsdGVyKChjb25maWcpID0+ICEhY29uZmlnKTtcbiAgICBjb25zdCBhbGxQYWNrYWdlQ29uZmlncyA9IFtyb290Q29uZmlnLCAuLi5zdWJQYWNrYWdlQ29uZmlnc107XG5cbiAgICBpZiAob3B0aW9ucy5pc1ZlcmJvc2UpIHtcbiAgICAgIGZvciAoY29uc3QgY29uZmlnIG9mIGFsbFBhY2thZ2VDb25maWdzKSB7XG4gICAgICAgIGNvbnNvbGUuaW5mbyhjb25maWcpO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIEluc3RhbGwgdG9vbHMgdmlhIGFzZGYgYXQgZmlyc3RcbiAgICBhd2FpdCBnZW5lcmF0ZVRvb2xWZXJzaW9ucyhyb290Q29uZmlnKTtcbiAgICAvLyBJbnN0YWxsIHlhcm4gYmVycnlcbiAgICBhd2FpdCBnZW5lcmF0ZVlhcm5yY1ltbChyb290Q29uZmlnKTtcbiAgICBpZiAocm9vdENvbmZpZy5pc0J1bikge1xuICAgICAgYXdhaXQgZ2VuZXJhdGVCdW5maWdUb21sKHJvb3RDb25maWcpO1xuICAgIH1cblxuICAgIGNvbnN0IHNob3VsZFJ1bldvcmtmbG93cyA9XG4gICAgICAhaXNSZXVzYWJsZVdvcmtmbG93c1JlcG8ocm9vdENvbmZpZy5yZXBvc2l0b3J5KSAmJlxuICAgICAgKHJvb3RDb25maWcucmVwb3NpdG9yeT8uc3RhcnRzV2l0aCgnZ2l0aHViOldpbGxCb29zdGVyLycpIHx8XG4gICAgICAgIHJvb3RDb25maWcucmVwb3NpdG9yeT8uc3RhcnRzV2l0aCgnZ2l0aHViOldpbGxCb29zdGVyTGFiLycpKTtcbiAgICBhd2FpdCBQcm9taXNlLmFsbChbXG4gICAgICBmaXhEb2NrZXJmaWxlKHJvb3RDb25maWcpLFxuICAgICAgZml4UHJpc21hRW52RmlsZXMocm9vdENvbmZpZyksXG4gICAgICBhYmJyZXZpYXRpb25Qcm9taXNlLnRoZW4oKCkgPT4gZ2VuZXJhdGVSZWFkbWUocm9vdENvbmZpZykpLFxuICAgICAgZ2VuZXJhdGVBZ2VudEluc3RydWN0aW9ucyhyb290Q29uZmlnLCBhbGxQYWNrYWdlQ29uZmlncyksXG4gICAgICBnZW5lcmF0ZURvY2tlcmlnbm9yZShyb290Q29uZmlnKSxcbiAgICAgIGdlbmVyYXRlRWRpdG9yY29uZmlnKHJvb3RDb25maWcpLFxuICAgICAgZ2VuZXJhdGVHZW1pbmlDb25maWcocm9vdENvbmZpZyksXG4gICAgICByZW1vdmVHZW1pbmlTZXR0aW5ncyhyb290Q29uZmlnKSxcbiAgICAgIGdlbmVyYXRlR2l0YXR0cmlidXRlcyhyb290Q29uZmlnKSxcbiAgICAgIGdlbmVyYXRlR2l0SHViVGVtcGxhdGVzKHJvb3RDb25maWcpLFxuICAgICAgZ2VuZXJhdGVJZGVhU2V0dGluZ3Mocm9vdENvbmZpZyksXG4gICAgICBnZW5lcmF0ZVJlbm92YXRlSnNvbihyb290Q29uZmlnKSxcbiAgICAgIGdlbmVyYXRlUmVsZWFzZXJjKHJvb3RDb25maWcpLFxuICAgICAgLi4uKHNob3VsZFJ1bldvcmtmbG93cyA/IFtnZW5lcmF0ZVdvcmtmbG93cyhyb290Q29uZmlnKV0gOiBbXSksXG4gICAgICBzZXR1cExhYmVscyhyb290Q29uZmlnKSxcbiAgICAgIHNldHVwU2VjcmV0cyhyb290Q29uZmlnKSxcbiAgICAgIHNldHVwR2l0SHViU2V0dGluZ3Mocm9vdENvbmZpZyksXG4gICAgICByb290Q29uZmlnLmlzQnVuXG4gICAgICAgID8gZ2VuZXJhdGVIdXNreXJjVXBkYXRpbmdQYWNrYWdlSnNvbihyb290Q29uZmlnKS50aGVuKCgpID0+IGdlbmVyYXRlTGVmdGhvb2tVcGRhdGluZ1BhY2thZ2VKc29uKHJvb3RDb25maWcpKVxuICAgICAgICA6IGdlbmVyYXRlSHVza3lyY1VwZGF0aW5nUGFja2FnZUpzb24ocm9vdENvbmZpZyksXG4gICAgICBnZW5lcmF0ZUxpbnRzdGFnZWRyYyhyb290Q29uZmlnKSxcbiAgICBdKTtcbiAgICBhd2FpdCBwcm9taXNlUG9vbC5wcm9taXNlQWxsKCk7XG5cbiAgICBjb25zdCBwcm9taXNlczogUHJvbWlzZTx2b2lkPltdID0gW107XG4gICAgZm9yIChjb25zdCBjb25maWcgb2YgYWxsUGFja2FnZUNvbmZpZ3MpIHtcbiAgICAgIGlmIChzaG91bGRTa2lwV2lsbGJvb3N0ZXJDb25maWdzRXNsaW50UGFja2FnZShjb25maWcpKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgaWYgKGNvbmZpZy5kb2VzQ29udGFpblR5cGVTY3JpcHQgfHwgY29uZmlnLmRvZXNDb250YWluVHlwZVNjcmlwdEluUGFja2FnZXMpIHtcbiAgICAgICAgcHJvbWlzZXMucHVzaChmaXhUeXBlRGVmaW5pdGlvbnMoY29uZmlnLCBjb25maWcuaXNSb290ID8gYWxsUGFja2FnZUNvbmZpZ3MgOiBbY29uZmlnXSkpO1xuICAgICAgfVxuICAgICAgaWYgKGNvbmZpZy5kZXBlbmRpbmcucGxheXdyaWdodFRlc3QpIHtcbiAgICAgICAgcHJvbWlzZXMucHVzaChmaXhQbGF5d3JpZ2h0Q29uZmlnKGNvbmZpZykpO1xuICAgICAgfVxuICAgICAgaWYgKGNvbmZpZy5kZXBlbmRpbmcubmV4dCkge1xuICAgICAgICBwcm9taXNlcy5wdXNoKGZpeE5leHRDb25maWdKc29uKGNvbmZpZykpO1xuICAgICAgfVxuICAgICAgYXdhaXQgZ2VuZXJhdGVHaXRpZ25vcmUoY29uZmlnLCByb290Q29uZmlnKTtcbiAgICAgIGF3YWl0IHByb21pc2VQb29sLnByb21pc2VBbGwoKTtcbiAgICAgIGlmICghY29uZmlnLmlzUm9vdCAmJiAhY29uZmlnLmRvZXNDb250YWluUGFja2FnZUpzb24pIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBhd2FpdCBnZW5lcmF0ZVByZXR0aWVyaWdub3JlKGNvbmZpZyk7XG4gICAgICBhd2FpdCBnZW5lcmF0ZVBhY2thZ2VKc29uKGNvbmZpZywgcm9vdENvbmZpZywgYXJndi5za2lwRGVwcyk7XG5cbiAgICAgIHByb21pc2VzLnB1c2goZ2VuZXJhdGVMaW50c3RhZ2VkcmMoY29uZmlnKSk7XG4gICAgICBpZiAoY29uZmlnLmRvZXNDb250YWluVnNjb2RlU2V0dGluZ3NKc29uICYmIGNvbmZpZy5kb2VzQ29udGFpblBhY2thZ2VKc29uKSB7XG4gICAgICAgIHByb21pc2VzLnB1c2goZ2VuZXJhdGVWc2NvZGVTZXR0aW5ncyhjb25maWcpKTtcbiAgICAgIH1cbiAgICAgIGlmIChjb25maWcuZG9lc0NvbnRhaW5UeXBlU2NyaXB0IHx8IGNvbmZpZy5kb2VzQ29udGFpblR5cGVTY3JpcHRJblBhY2thZ2VzKSB7XG4gICAgICAgIHByb21pc2VzLnB1c2goZ2VuZXJhdGVUc2NvbmZpZyhjb25maWcpKTtcbiAgICAgIH1cbiAgICAgIGlmIChcbiAgICAgICAgY29uZmlnLmRvZXNDb250YWluSmF2YVNjcmlwdCB8fFxuICAgICAgICBjb25maWcuZG9lc0NvbnRhaW5KYXZhU2NyaXB0SW5QYWNrYWdlcyB8fFxuICAgICAgICBjb25maWcuZG9lc0NvbnRhaW5UeXBlU2NyaXB0IHx8XG4gICAgICAgIGNvbmZpZy5kb2VzQ29udGFpblR5cGVTY3JpcHRJblBhY2thZ2VzXG4gICAgICApIHtcbiAgICAgICAgaWYgKHJvb3RDb25maWcuaXNCdW4pIHtcbiAgICAgICAgICBwcm9taXNlcy5wdXNoKGdlbmVyYXRlQmlvbWVKc29uYyhjb25maWcpKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIXJvb3RDb25maWcuaXNXaWxsQm9vc3RlckNvbmZpZ3MpIHtcbiAgICAgICAgICBwcm9taXNlcy5wdXNoKGdlbmVyYXRlRXNsaW50cmMoY29uZmlnKSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChjb25maWcuZGVwZW5kaW5nLnB5cmlnaHQpIHtcbiAgICAgICAgcHJvbWlzZXMucHVzaChnZW5lcmF0ZVB5cmlnaHRDb25maWdKc29uKGNvbmZpZykpO1xuICAgICAgfVxuICAgIH1cbiAgICBhd2FpdCBQcm9taXNlLmFsbChwcm9taXNlcyk7XG4gICAgYXdhaXQgcHJvbWlzZVBvb2wucHJvbWlzZUFsbCgpO1xuXG4gICAgY29uc3QgcGFja2FnZU1hbmFnZXIgPSByb290Q29uZmlnLmlzQnVuID8gJ2J1bicgOiAneWFybic7XG4gICAgLy8gUmVmcmVzaCBsb2NrIGZpbGVzXG4gICAgaWYgKHJvb3RDb25maWcuaXNCdW4pIHtcbiAgICAgIGZzLnJtU3luYyhwYXRoLmpvaW4ocm9vdERpclBhdGgsICdidW4ubG9jaycpLCB7IGZvcmNlOiB0cnVlIH0pO1xuICAgICAgc3Bhd25TeW5jKHBhY2thZ2VNYW5hZ2VyLCBbJ3VwZGF0ZSddLCByb290RGlyUGF0aCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGZzLnJtU3luYyhwYXRoLmpvaW4ocm9vdERpclBhdGgsICd5YXJuLmxvY2snKSwgeyBmb3JjZTogdHJ1ZSB9KTtcbiAgICAgIHNwYXduU3luYyhwYWNrYWdlTWFuYWdlciwgWydpbnN0YWxsJywgJy0tbm8taW1tdXRhYmxlJ10sIHJvb3REaXJQYXRoKTtcbiAgICB9XG4gICAgc3Bhd25TeW5jKHBhY2thZ2VNYW5hZ2VyLCBbJ2NsZWFudXAnXSwgcm9vdERpclBhdGgpO1xuICAgIC8vICd5YXJuIGluc3RhbGwnIHNob3VsZCBiZSBhZnRlciBgeWFybiBjbGVhbnVwYCBiZWNhdXNlIHlhcm4gYmVycnkgZ2VuZXJhdGVzIHlhcm4ubG9ja1xuICAgIC8vIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGNvbnRlbnRzIG9mIGRlcGVuZGFudCBzdWItcGFja2FnZSBpbiBtb25vcmVwb1xuICAgIGlmICghcm9vdENvbmZpZy5pc0J1bikge1xuICAgICAgc3Bhd25TeW5jKHBhY2thZ2VNYW5hZ2VyLCBbJ2luc3RhbGwnLCAnLS1uby1pbW11dGFibGUnXSwgcm9vdERpclBhdGgpO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiByZW1vdmVOb2RlTW9kdWxlc0RpcmVjdG9yaWVzKGRpclBhdGg6IHN0cmluZyk6IHZvaWQge1xuICBjb25zdCBub2RlTW9kdWxlc1BhdGhzID0gbmV3IFNldChbcGF0aC5qb2luKGRpclBhdGgsICdub2RlX21vZHVsZXMnKV0pO1xuICBjb25zdCBnbG9iYmVkUGF0aHMgPSBmZy5nbG9iU3luYygnKiovbm9kZV9tb2R1bGVzJywge1xuICAgIGN3ZDogZGlyUGF0aCxcbiAgICBkb3Q6IHRydWUsXG4gICAgb25seURpcmVjdG9yaWVzOiB0cnVlLFxuICAgIGZvbGxvd1N5bWJvbGljTGlua3M6IGZhbHNlLFxuICB9KTtcbiAgZm9yIChjb25zdCBub2RlTW9kdWxlc1BhdGggb2YgZ2xvYmJlZFBhdGhzKSB7XG4gICAgbm9kZU1vZHVsZXNQYXRocy5hZGQocGF0aC5yZXNvbHZlKGRpclBhdGgsIG5vZGVNb2R1bGVzUGF0aCkpO1xuICB9XG4gIGZvciAoY29uc3Qgbm9kZU1vZHVsZXNQYXRoIG9mIG5vZGVNb2R1bGVzUGF0aHMpIHtcbiAgICB0cnkge1xuICAgICAgZnMucm1TeW5jKG5vZGVNb2R1bGVzUGF0aCwgeyByZWN1cnNpdmU6IHRydWUsIGZvcmNlOiB0cnVlIH0pO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBjb25zb2xlLndhcm4oZXJyb3IpO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBnZXRWZXJzaW9uKCk6IHN0cmluZyB7XG4gIGxldCBwYWNrYWdlSnNvbkRpciA9IHBhdGguZGlybmFtZShuZXcgVVJMKGltcG9ydC5tZXRhLnVybCkucGF0aG5hbWUpO1xuICB3aGlsZSAoIWZzLmV4aXN0c1N5bmMocGF0aC5qb2luKHBhY2thZ2VKc29uRGlyLCAncGFja2FnZS5qc29uJykpKSB7XG4gICAgcGFja2FnZUpzb25EaXIgPSBwYXRoLmRpcm5hbWUocGFja2FnZUpzb25EaXIpO1xuICB9XG4gIGNvbnN0IHBhY2thZ2VKc29uID0gSlNPTi5wYXJzZShmcy5yZWFkRmlsZVN5bmMocGF0aC5qb2luKHBhY2thZ2VKc29uRGlyLCAncGFja2FnZS5qc29uJyksICd1dGY4JykpIGFzIHtcbiAgICB2ZXJzaW9uOiBzdHJpbmc7XG4gIH07XG4gIHJldHVybiBwYWNrYWdlSnNvbi52ZXJzaW9uO1xufVxuXG5hd2FpdCBtYWluKCk7XG4iXSwibmFtZXMiOlsib3B0aW9ucyIsImlzVmVyYm9zZSIsImRvZXNVcGxvYWRFbnZWYXJzIiwibG9nZ2VyIiwiZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbiIsIm5hbWUiLCJmdW5jIiwiY29uc29sZSIsImluZm8iLCJlcnJvciIsIkVycm9yIiwic3RhY2siLCJTdHJpbmciLCJhc3luYyIsImZpeERvY2tlcmZpbGUiLCJjb25maWciLCJkb2VzQ29udGFpbkRvY2tlcmZpbGUiLCJvbGRDb250ZW50IiwiZG9ja2VyZmlsZSIsIm5ld0NvbnRlbnQiLCJmcyIsIndyaXRlRmlsZSIsInBhdGgiLCJqb2luIiwiZGlyUGF0aCIsImZzVXRpbCIsInJlYWRGaWxlSWdub3JpbmdFcnJvciIsImZpbGVQYXRoIiwicHJvbWlzZXMiLCJyZWFkRmlsZSIsImdlbmVyYXRlRmlsZSIsImNvbnRlbnQiLCJta2RpciIsImRpcm5hbWUiLCJyZWN1cnNpdmUiLCJub3JtYWxpemVkQ29udGVudCIsInJlcGxhY2VBbGwiLCJ0cmltIiwicHJvbWlzZVBvb2wiLCJQcm9taXNlUG9vbCIsImZpeE5leHRDb25maWdKc29uIiwibWFwIiwiZXh0IiwicmVzb2x2ZSIsImZpbmQiLCJwIiwiZXhpc3RzU3luYyIsInJlcGxhY2UiLCJfIiwic2V0dGluZ3NUZXh0IiwiaW5jbHVkZXMiLCJydW4iLCJsaXRlcmFsIiwidmFsdWUiLCJraW5kIiwiYXNPYmplY3QiLCJkZWZhdWx0Q29uZmlnIiwiZm9yYmlkT25seSIsInJldHJpZXMiLCJ0aW1lb3V0IiwidXNlIiwiYWN0aW9uVGltZW91dCIsInRyYWNlIiwic2NyZWVuc2hvdCIsInZpZGVvIiwid29ya2VycyIsIndlYlNlcnZlciIsImNvbW1hbmQiLCJ1cmwiLCJyZXVzZUV4aXN0aW5nU2VydmVyIiwic3Rkb3V0Iiwic3RkZXJyIiwiZW52IiwiZ3JhY2VmdWxTaHV0ZG93biIsImZpeFBsYXl3cmlnaHRDb25maWciLCJtYXRjaCIsImV4ZWMiLCJvYmplY3RMaXRlcmFsIiwicGFyc2VkIiwic291cmNlIiwidHMiLCJjcmVhdGVTb3VyY2VGaWxlIiwiU2NyaXB0VGFyZ2V0IiwiTGF0ZXN0IiwiU2NyaXB0S2luZCIsIlRTIiwic3RhdGVtZW50Iiwic3RhdGVtZW50cyIsImlzVmFyaWFibGVTdGF0ZW1lbnQiLCJkZWNsYXJhdGlvbiIsImRlY2xhcmF0aW9uTGlzdCIsImRlY2xhcmF0aW9ucyIsImluaXRpYWxpemVyIiwiaXNPYmplY3RMaXRlcmFsRXhwcmVzc2lvbiIsInBhcnNlT2JqZWN0TGl0ZXJhbEV4cHJlc3Npb24iLCJwYXJzZU9iamVjdExpdGVyYWwiLCJuZXdPYmplY3RMaXRlcmFsIiwic3RyaW5naWZ5T2JqZWN0IiwibWVyZ2UiLCJhbGwiLCJwcm9wZXJ0eSIsInByb3BlcnRpZXMiLCJpc1Byb3BlcnR5QXNzaWdubWVudCIsImlzSWRlbnRpZmllciIsImlzU3RyaW5nTGl0ZXJhbCIsInBhcnNlRXhwcmVzc2lvbiIsInVuZGVmaW5lZCIsImdldFRleHQiLCJleHByZXNzaW9uIiwicGFyc2VkT2JqZWN0IiwiaXNBcnJheUxpdGVyYWxFeHByZXNzaW9uIiwiZWxlbWVudHMiLCJlbGVtZW50Iiwic29tZSIsInN0cmluZ2lmeVZhbHVlIiwibGV2ZWwiLCJ2YWx1ZXMiLCJsZW5ndGgiLCJpbmRlbnQiLCJyZXBlYXQiLCJsaW5lcyIsInN0cmluZ2lmaWVkIiwic3BsaXQiLCJhdCIsImluZGV4IiwiY2xvc2luZ0luZGVudCIsInN0cmluZ2lmeUFycmF5Iiwib2JqZWN0IiwiT2JqZWN0IiwiZW50cmllcyIsImtleSIsImdsb2JJZ25vcmUiLCJmaXhQcmlzbWFFbnZGaWxlcyIsImVudkZpbGVzIiwiZmciLCJnbG9iIiwiZG90IiwiY3dkIiwiaWdub3JlIiwiZW52RmlsZSIsImVudkZpbGVQYXRoIiwiZml4VGVzdERpcmVjdG9yaWVzVXBkYXRpbmdQYWNrYWdlSnNvbiIsInBhY2thZ2VEaXJQYXRocyIsIlByb21pc2UiLCJuZXdUZXN0RGlyUGF0aCIsInBhY2thZ2VEaXJQYXRoIiwib2xkVGVzdERpck5hbWUiLCJvbGRUZXN0RGlyUGF0aCIsInJlbmFtZSIsImZpeFR5cGVEZWZpbml0aW9ucyIsImNvbmZpZ3NJbmNsdWRpbmdDaGlsZHJlbiIsImxpYlR5cGVEaXJQYXRoIiwic3JjVHlwZURpclBhdGgiLCJpc1Jvb3QiLCJkb2VzQ29udGFpblN1YlBhY2thZ2VKc29ucyIsImRpcmVudHMiLCJpZ25vcmVFbm9lbnRBc3luYyIsInJlYWRkaXIiLCJ3aXRoRmlsZVR5cGVzIiwiZGlyZW50IiwiZGlyTmFtZSIsInNsaWNlIiwiaGFzVHlwZURlY2xhcmF0aW9uRXh0ZW5zaW9uIiwiZW5kc1dpdGgiLCJwYWNrYWdlTmFtZSIsImhhc0xpYnJhcnkiLCJwYWNrYWdlSnNvbiIsImRlcGVuZGVuY2llcyIsImRldkRlcGVuZGVuY2llcyIsImlzRmlsZSIsImlzRGlyZWN0b3J5Iiwib3ZlcndyaXRlTWVyZ2UiLCJkZXN0aW5hdGlvbkFycmF5Iiwic291cmNlQXJyYXkiLCJjb21iaW5lTWVyZ2UiLCJ0YXJnZXQiLCJkZXN0aW5hdGlvbiIsIml0ZW0iLCJjbG9uZVVubGVzc090aGVyd2lzZVNwZWNpZmllZCIsImlzTWVyZ2VhYmxlT2JqZWN0IiwicHVzaCIsInNvcnRLZXlzIiwib2JqIiwia2V5QW5kVmFsdWVzIiwidG9Tb3J0ZWQiLCJrZXkxIiwia2V5MiIsImxvY2FsZUNvbXBhcmUiLCJwdWJsaWNSZXBvQXV0b2ZpeFdvcmtmbG93Iiwib24iLCJwdWxsX3JlcXVlc3QiLCJicmFuY2hlcyIsInBlcm1pc3Npb25zIiwiY29udGVudHMiLCJjb25jdXJyZW5jeSIsImdyb3VwIiwiam9icyIsImF1dG9maXgiLCJwcml2YXRlUmVwb0F1dG9maXhXb3JrZmxvdyIsInRlc3QiLCJ1c2VzIiwid29ya2Zsb3dzIiwicmVsZWFzZSIsInB1bGxfcmVxdWVzdF90YXJnZXQiLCJ0eXBlcyIsInN5bmMiLCJpc3N1ZXMiLCJpZiIsIndpdGgiLCJzZWNyZXRzIiwiQ0xBVURFX0NPREVfT0FVVEhfVE9LRU4iLCJPUEVOQUlfQVBJX0tFWSIsIkdFTUlOSV9BUElfS0VZIiwiZ2VuZXJhdGVXb3JrZmxvd3MiLCJyb290Q29uZmlnIiwiZmlsZU5hbWVzVG9CZVJlbW92ZWQiLCJpc1JldXNhYmxlV29ya2Zsb3dzUmVwbyIsInJlcG9zaXRvcnkiLCJ3b3JrZmxvd3NQYXRoIiwic2VtYW50aWNZbWxQYXRoIiwicm0iLCJmb3JjZSIsImZpbGVOYW1lU2V0IiwiU2V0IiwiZmlsdGVyIiwiZGVwZW5kaW5nIiwic2VtYW50aWNSZWxlYXNlIiwiYWRkIiwiZGVsZXRlIiwiZmlsZU5hbWUiLCJiYXNlbmFtZSIsIndyaXRlV29ya2Zsb3dZYW1sIiwiZGVwcmVjYXRlZEZpbGVOYW1lIiwid3JpdGVZYW1sIiwiaXNQdWJsaWNSZXBvIiwiY2xvbmVEZWVwIiwicGFja2FnZU1hbmFnZXIiLCJpc0J1biIsInN0ZXBzIiwic2NyaXB0cyIsImJ1aWxkIiwiYXV0b2ZpeFdvcmtmbG93IiwiYXV0b2ZpeEpvYiIsImdlbmVyYXRlQXV0b2ZpeFdvcmtmbG93IiwibmV3U2V0dGluZ3MiLCJvbGRTZXR0aW5ncyIsInlhbWwiLCJsb2FkIiwiYXJyYXlNZXJnZSIsInN0YXJ0c1dpdGgiLCJtb3ZlVG9Cb3R0b20iLCJpc1JldXNhYmxlV29ya2Zsb3ciLCJqb2IiLCJub3JtYWxpemVKb2IiLCJzY2hlZHVsZSIsImJyYW5jaCIsIm1pZ3JhdGVXb3JrZmxvdyIsInBhcmFtcyIsInN5bmNfcGFyYW1zX3dpdGhvdXRfZGVzdCIsIndvcmtmbG93X2Rpc3BhdGNoIiwiTlBNX1RPS0VOIiwiR0hfVE9LRU4iLCJGSVJFQkFTRV9UT0tFTiIsIkdDUF9TQV9LRVlfSlNPTl9GT1JfRklSRUJBU0UiLCJESVNDT1JEX1dFQkhPT0tfVVJMIiwic2VydmVyX3VybCIsImRvdF9lbnZfcGF0aCIsIm5vbl9zZWxmX2hvc3RlZCIsIm5vdGlmeV9kaXNjb3JkIiwicmVxdWlyZV9mbHkiLCJyZXF1aXJlX2djbG91ZCIsImxhYmVsIiwibGFiZWxPcGVyYXRvciIsImNpX3NpemUiLCJjaV9sYWJlbCIsIm1pZ3JhdGVKb2IiLCJGTFlfQVBJX1RPS0VOIiwiZGVwbG95X2NvbW1hbmQiLCJnaXRodWJfaG9zdGVkX3J1bm5lciIsImtleXMiLCJuZXdTZWNyZXRzIiwieWFtbFRleHQiLCJkdW1wIiwibGluZVdpZHRoIiwibm9Db21wYXRNb2RlIiwic3R5bGVzIiwiZml4VHlwb3MiLCJwYWNrYWdlQ29uZmlnIiwiZG9jRmlsZXMiLCJtZEZpbGUiLCJmaXhUeXBvc0luVGV4dCIsInJlcGxhY2VXaXRoQ29uZmlnIiwidHNGaWxlcyIsInRzRmlsZSIsImZpeFR5cG9zSW5Db2RlIiwidGV4dEJhc2VkRmlsZXMiLCJmaWxlIiwicHJvbWlzZUFsbCIsInByb3BOYW1lIiwiYmVmb3JlIiwiYWZ0ZXIiLCJ3YmZ5SnNvbiIsInR5cG9zIiwiZ2VuZXJhdGVBZ2VudEluc3RydWN0aW9ucyIsImFsbENvbmZpZ3MiLCJhZ2VudHNFeHRyYVBhdGgiLCJleHRyYUNvbnRlbnQiLCJ0b29sTmFtZSIsImdlbmVyYXRlQWdlbnRJbnN0cnVjdGlvbiIsImN1cnNvclJ1bGVzUGF0aCIsImN1cnNvclJ1bGVzQ29udGVudCIsImZyb250bWF0dGVyIiwiYm9keSIsImdlbmVyYXRlQ3Vyc29yR2VuZXJhbE1kY0NvbnRlbnQiLCJiYXNlQ29udGVudCIsImRlc2NyaXB0aW9uIiwiYyIsImdlbkkxOG5UcyIsImlzV2lsbEJvb3N0ZXJSZXBvIiwiaGFzU3RhcnRUZXN0IiwicmVhY3QiLCJuZXh0IiwidHJpbUVuZCIsImdpdEh1YlV0aWwiLCJnZXRPcmdBbmROYW1lIiwidXJsT3JGdWxsTmFtZSIsInVybFdpdGhvdXRQcm90b2NvbCIsIm5hbWVzIiwib2N0b2tpdENhY2hlIiwiTWFwIiwiZ2V0T2N0b2tpdCIsIm93bmVyIiwiY2FjaGVkIiwiZ2V0Iiwib2N0b2tpdCIsIk9jdG9raXQiLCJhdXRoIiwiZ2V0R2l0SHViVG9rZW4iLCJzZXQiLCJoYXNHaXRIdWJUb2tlbiIsInByb2Nlc3MiLCJHSF9CT1RfUEFUX0ZPUl9XSUxMQk9PU1RFUiIsIkdIX0JPVF9QQVRfRk9SX1dJTExCT09TVEVSTEFCIiwiR0lUSFVCX1RPS0VOIiwic3Bhd25TeW5jIiwiYXJncyIsInJldHJ5IiwibmV3Q21kIiwibmV3QXJncyIsImdldFNwYXduU3luY0FyZ3MiLCJjaGlsZF9wcm9jZXNzIiwic3RhdHVzIiwic3Bhd25TeW5jV2l0aFN0cmluZ1Jlc3VsdCIsInN0ZGlvIiwicHJvYyIsInRvU3RyaW5nIiwicyIsIlBBVEgiLCJCRVJSWV9CSU5fRk9MREVSIiwiYXNkZkRpciIsIkFTREZfRElSIiwib3MiLCJob21lZGlyIiwiYXNkZlBhdGhzIiwiY3VycmVudFBhdGhzIiwiQVNERl9OT0RFSlNfVkVSU0lPTiIsInNoZWxsIiwiY29udmVydFZlcnNpb25JbnRvTnVtYmVyIiwidmVyc2lvbiIsIm51bWJlcnMiLCJOdW1iZXIiLCJudW0iLCJpc05hTiIsInZlcnNpb25OdW1iZXIiLCJkaXZpc29yIiwiUFlUSE9OX1ZFUlNJT04iLCJKQVZBX1ZFUlNJT04iLCJnZW5lcmF0ZVRvb2xWZXJzaW9ucyIsInZlcnNpb25zVGV4dCIsImR1cGxpY2F0YWJsZUxpbmVzIiwibGluZSIsIkNPUkVfVE9PTFMiLCJoYXMiLCJkb2VzQ29udGFpblBvZXRyeUxvY2siLCJyZXNwb25zZSIsImZldGNoIiwianNvbiIsInBvZXRyeVZlcnNpb24iLCJ1cGRhdGVWZXJzaW9uIiwiZmlyZWJhc2UiLCJkb2VzQ29udGFpblBhY2thZ2VKc29uIiwiYnVuVmVyc2lvbiIsIm9yZ2FuaXphdGlvbiIsInJlcXVlc3QiLCJyZXBvIiwiZGF0YSIsInRhZ19uYW1lIiwibGFzdEluZGV4T2YiLCJ2ZXJzaW9uTnVtYmVyVGV4dCIsImdldExhdGVzdFZlcnNpb25Gcm9tVGFnT25HaXRIdWIiLCJwcmVmaXgiLCJERVBSRUNBVEVEX1ZFUlNJT05fUFJFRklYRVMiLCJ2ZXJzaW9uUGF0aCIsInRvb2xWZXJzaW9uc1BhdGgiLCJjb3JlIiwibmV3VmVyc2lvbiIsImhlYWQiLCJmaW5kSW5kZXgiLCJsIiwibmV3TGluZSIsInNwbGljZSIsImdlbmVyYXRlQmlvbWVKc29uYyIsInJvb3QiLCIkc2NoZW1hIiwiZXh0ZW5kcyIsIkpTT04iLCJwYXJzZSIsInN0cmluZ2lmeSIsIm5ld0NvbnRlbnRXaXRoRXhhY3RUcnVlIiwibmV3Q29udGVudFdpdGhFeGFjdEZhbHNlIiwiZ2VuZXJhdGVCdW5maWdUb21sIiwicmVhZEZpbGVTeW5jIiwidXNlckNvbnRlbnRIZWFkZXIiLCJ1c2VyQ29udGVudEhlYWRlclJlZ2V4Iiwic2VwYXJhdG9yIiwiZGVmYXVsdEhlYWRVc2VyQ29udGVudCIsImRlZmF1bHRUYWlsVXNlckNvbnRlbnQiLCJpZ25vcmVGaWxlVXRpbCIsInNlcGFyYXRvclByZWZpeCIsInJlYWRHaXRpZ25vcmVXaXRob3V0U2VwYXJhdG9ycyIsImxhc3RIZWFkZXJJbmRleCIsImdldEluZGV4T2ZUYWlsVXNlckNvbnRlbnRIZWFkZXIiLCJnZXRIZWFkVXNlckNvbnRlbnQiLCJpbmRleE9mIiwidGhpcyIsImdldFRhaWxVc2VyQ29udGVudCIsImlzQmVycnlaZXJvSW5zdGFsbEVuYWJsZWQiLCJsYXN0SW5kZXgiLCJnZW5lcmF0ZURvY2tlcmlnbm9yZSIsImV4dGVuc2lvbnMiLCJjb2RlV2l0aDJJbmRlbnRTaXplIiwiY29kZVdpdGg0SW5kZW50U2l6ZSIsIm1hcmtkb3duTGlrZSIsImVzbGludCIsInByZXR0aWVyIiwiYmlvbWUiLCJnZW5lcmF0ZUV4dGVuc2lvbnMiLCJnZW5lcmF0ZUVkaXRvcmNvbmZpZyIsImdlbmVyYXRlRXNsaW50cmMiLCJlc2xpbnRCYXNlIiwiaGF2ZV9mdW4iLCJjb2RlX3JldmlldyIsImRpc2FibGUiLCJjb21tZW50X3NldmVyaXR5X3RocmVzaG9sZCIsIm1heF9yZXZpZXdfY29tbWVudHMiLCJwdWxsX3JlcXVlc3Rfb3BlbmVkIiwiaGVscCIsInN1bW1hcnkiLCJpZ25vcmVfcGF0dGVybnMiLCJnZW5lcmF0ZUdlbWluaUNvbmZpZyIsImNvbmZpZ0ZpbGVQYXRoIiwic3R5bGVndWlkZUZpbGVQYXRoIiwibmV3Q29uZmlnIiwib2xkQ29uZmlnIiwieWFtbENvbnRlbnQiLCJyZW1vdmVHZW1pbmlTZXR0aW5ncyIsImdlbmVyYXRlR2l0YXR0cmlidXRlcyIsImRlZmF1bHROYW1lcyIsImdlbmVyYXRlR2l0aWdub3JlIiwiaGVhZFVzZXJDb250ZW50IiwidGFpbFVzZXJDb250ZW50IiwiZG9lc0NvbnRhaW5HZW1maWxlIiwiZG9lc0NvbnRhaW5Hb01vZCIsImRvZXNDb250YWluUG9tWG1sIiwiZG9lc0NvbnRhaW5QdWJzcGVjWWFtbCIsImRvZXNDb250YWluVGVtcGxhdGVZYW1sIiwiYmxpdHoiLCJwcmlzbWEiLCJwbGF5d3JpZ2h0VGVzdCIsInJlYWN0TmF0aXZlIiwic3Rvcnlib29rIiwibGl0ZXN0cmVhbSIsImdlbmVyYXRlZCIsInJlYWRDYWNoZSIsInJlc3BvbnNlVGV4dCIsInRleHQiLCJvayIsIndyaXRlQ2FjaGUiLCJzdGF0IiwiRGF0ZSIsIm5vdyIsIm10aW1lTXMiLCJnZXRMYXRlc3RDb21taXRIYXNoIiwicmVwb1VybCIsImNvbW1pdEhhc2giLCJyZWplY3QiLCJFc2xpbnRVdGlsIiwiZ2V0TGludEZpeFN1ZmZpeCIsImRvZXNDb250YWluSnN4T3JUc3giLCJqc0NvbW1vbkRlcHMiLCJ0c0NvbW1vbkRlcHMiLCJyZWFjdENvbW1vbkRlcHMiLCJlc2xpbnREZXBzIiwiZ2VuZXJhdGVQYWNrYWdlSnNvbiIsInNraXBBZGRpbmdEZXBzIiwianNvblRleHQiLCJqc29uT2JqIiwicGVlckRlcGVuZGVuY2llcyIsImF1dGhvciIsInRzbGliIiwibGVybmEiLCJwaW5zdCIsInJlbW92ZURlcHJlY2F0ZWRTdHVmZiIsImdlbmVyYXRlU2NyaXB0cyIsInByZXR0aWZ5IiwiZXhpc3RpbmdDb250ZW50Iiwib3JpZ2luYWxDb250ZW50IiwiZ2VuZXJhdGVQcmV0dGllclN1ZmZpeCIsInBvZXRyeURldkRlcGVuZGVuY2llcyIsImh1c2t5IiwicHJlcGFyZSIsInBvc3RpbnN0YWxsIiwiaXNSZWZlcnJlZEJ5T3RoZXJSZXBvIiwicHJlcGFjayIsInBvc3RwYWNrIiwiYXJ0aWxsZXJ5IiwicGxheXdyaWdodCIsIndvcmtzcGFjZXMiLCJBcnJheSIsImlzQXJyYXkiLCJ3b3Jrc3BhY2UiLCJnbG9iU3luYyIsIndiIiwiZG9lc0NvbnRhaW5KYXZhU2NyaXB0IiwiZG9lc0NvbnRhaW5KYXZhU2NyaXB0SW5QYWNrYWdlcyIsImRvZXNDb250YWluVHlwZVNjcmlwdCIsImRvZXNDb250YWluVHlwZVNjcmlwdEluUGFja2FnZXMiLCJtaWNyb21hdGNoIiwiaXNXaWxsQm9vc3RlckNvbmZpZ3MiLCJkZXAiLCJwcml2YXRlIiwibGljZW5zZSIsInB1Ymxpc2hDb25maWciLCJhY2Nlc3MiLCJtYWluIiwicmVzb2x1dGlvbnMiLCJsaW50Iiwic2NyaXB0TmFtZSIsInNjcmlwdCIsImRpcnMiLCJkaXIiLCJmb3JtYXQiLCJweXRob25GaWxlcyIsImRpck5hbWVTZXQiLCJweXRob25GaWxlIiwiZmlyc3QiLCJzZWNvbmQiLCJzaXplIiwiZGlyTmFtZXNTdHIiLCJwYWNrYWdlTmFtZXMiLCJpc1dvcmtzcGFjZVBhY2thZ2UiLCJ1cGRhdGVQcml2YXRlUGFja2FnZXMiLCJuZXdKc29uVGV4dCIsIm9sZEFuZE5ld1NjcmlwdE5hbWVzIiwib2xkTmFtZSIsIm5ld05hbWUiLCJmaWxlcyIsImZpeFNjcmlwdE5hbWVzIiwib2xkU2NyaXB0cyIsImhhc1R5cGVjaGVjayIsImNsZWFudXAiLCJ0eXBlY2hlY2siLCJvbGRUZXN0IiwicHlyaWdodCIsInByZUNvbW1pdCIsInByZVB1c2giLCJwcmVQdXNoRm9yTGFiIiwicHJlUHVzaEZvckxhYkV4Y2VwdEFkbWluIiwicG9zdE1lcmdlIiwiZ2VuZXJhdGVIdXNreXJjVXBkYXRpbmdQYWNrYWdlSnNvbiIsInBhY2thZ2VKc29uUGF0aCIsInBvc3RwdWJsaXNoIiwicHJlcHVibGlzaE9ubHkiLCJwcmVDb21taXRGaWxlUGF0aCIsInRvTG9jYWxlTG93ZXJDYXNlIiwibW9kZSIsInBvc3RNZXJnZUNvbW1hbmQiLCJnZW5lcmF0ZVBvc3RNZXJnZUNvbW1hbmRzIiwicG9zdE1lcmdlQ29tbWFuZHMiLCJyYXciLCJpbnN0YWxsQ29tbWFuZCIsInJtTmV4dERpcmVjdG9yeSIsImNyZWF0ZVRhc2tPcHRpb25zIiwicnVubmVyIiwiZXh0ZW5zaW9uIiwicHJldHRpZXJDb250ZW50IiwiYmlvbWVDb250ZW50IiwiZ2VuZXJhdGVJZGVhU2V0dGluZ3MiLCJjb21tYW5kcyIsImdlbmVyYXRlTGVmdGhvb2tVcGRhdGluZ1BhY2thZ2VKc29uIiwic2V0dGluZ3MiLCJta2RpclN5bmMiLCJzcmNEaXJlY3RvcmllcyIsIm5vZGUiLCJnZW5lcmF0ZUxpbnRzdGFnZWRyYyIsInBhY2thZ2VQcmVmaXgiLCJnZXRFc2xpbnRLZXkiLCJwYWNrYWdlc0ZpbHRlciIsImdldEVzbGludEZpbHRlckZvclByZXR0aWVyIiwiZ2V0U3JjRGlycyIsImdlbmVyYXRlUHJldHRpZXJpZ25vcmUiLCJnaXRpZ25vcmVGaWxlUGF0aCIsImdpdGlnbm9yZUNvbnRlbnQiLCJhZGRpdGlvbmFsQ29udGVudCIsInZlbnZQYXRoIiwidmVudiIsImdlbmVyYXRlUHlyaWdodENvbmZpZ0pzb24iLCJnZW5lcmF0ZVJlYWRtZSIsImluc2VydEJhZGdlIiwiZmlsZU5hbWVzIiwicmVhZGRpclN5bmMiLCJiYWRnZU5hbWUiLCJ0b1VwcGVyQ2FzZSIsImJhZGdlIiwicmVhZG1lIiwiaSIsImdlbmVyYXRlUmVsZWFzZXJjIiwicGx1Z2lucyIsInBsdWdpbiIsInByZXNldCIsImZhaWxDb21tZW50IiwiXzEiLCJzdWNjZXNzQ29tbWVudCIsIl8yIiwiY2xlYW5PbGRDb25maWciLCJzdWNjZXNzQ29tbWVudENvbmRpdGlvbiIsImZhaWxDb21tZW50Q29uZGl0aW9uIiwibGFiZWxzIiwicmVsZWFzZWRMYWJlbHMiLCJnZW5lcmF0ZVJlbm92YXRlSnNvbiIsInBhY2thZ2VSdWxlcyIsInJ1bGUiLCJtYXRjaFBhY2thZ2VOYW1lcyIsImVuYWJsZWQiLCJyb290SnNvbk9iaiIsImNvbXBpbGVyT3B0aW9ucyIsIm1vZHVsZSIsIm1vZHVsZVJlc29sdXRpb24iLCJqc3giLCJhbHdheXNTdHJpY3QiLCJzdHJpY3QiLCJub1VuY2hlY2tlZEluZGV4ZWRBY2Nlc3MiLCJza2lwTGliQ2hlY2siLCJhbGxvd1N5bnRoZXRpY0RlZmF1bHRJbXBvcnRzIiwiZXNNb2R1bGVJbnRlcm9wIiwicmVzb2x2ZUpzb25Nb2R1bGUiLCJzb3VyY2VNYXAiLCJpbXBvcnRIZWxwZXJzIiwiZXJhc2FibGVTeW50YXhPbmx5Iiwib3V0RGlyIiwidHlwZVJvb3RzIiwiZXhjbHVkZSIsImluY2x1ZGUiLCJzdWJKc29uT2JqIiwiZ2VuZXJhdGVUc2NvbmZpZyIsImRvZXNDb250YWluSnN4T3JUc3hJblBhY2thZ2VzIiwiaXNFc21QYWNrYWdlIiwic29ydCIsImV4cGVyaW1lbnRhbERlY29yYXRvcnMiLCJleGNsdWRlRmlsZVBhdHRlcm5zIiwiZ2VuZXJhdGVWc2NvZGVTZXR0aW5ncyIsImV4Y2x1ZGVGaWxlUGF0dGVybiIsImV4Y2x1ZGVTZXR0aW5nIiwiZ2VuZXJhdGVZYXJucmNZbWwiLCJ5YXJucmNZbWxQYXRoIiwiY3VycmVudFZlcnNpb24iLCJsYXRlc3RWZXJzaW9uIiwidmVyc2lvbnNKc29uIiwiZ2V0TGF0ZXN0VmVyc2lvbiIsImdldE1ham9yTnVtYmVyIiwicmVsZWFzZXNQYXRoIiwieWFybnJjUGF0aCIsImRlZmF1bHRTZW12ZXJSYW5nZVByZWZpeCIsIm5vZGVMaW5rZXIiLCJubU1vZGUiLCJucG1NaW5pbWFsQWdlR2F0ZSIsIm5wbVByZWFwcHJvdmVkUGFja2FnZXMiLCJjb21wcmVzc2lvbkxldmVsIiwiaW5qZWN0RW52aXJvbm1lbnRGaWxlcyIsImVuYWJsZUdsb2JhbENhY2hlIiwib3JpZ2luYWxMZW5ndGgiLCJwbHVnaW5QYXRoIiwibWFqb3IiLCJzZXR1cExhYmVscyIsInNldHVwTGFiZWwiLCJkZWxldGVMYWJlbCIsIndhcm4iLCJjb2xvciIsIkRFUFJFQ0FURURfU0VDUkVUX05BTUVTIiwic2V0dXBTZWNyZXRzIiwiZG90ZW52Iiwic2VjcmV0TmFtZSIsInNlY3JldF9uYW1lIiwia2V5X2lkIiwia2V5SWQiLCJzb2RpdW0iLCJyZWFkeSIsInNlY3JldCIsInJhd0tleSIsImZyb21fYmFzZTY0IiwiYmFzZTY0X3ZhcmlhbnRzIiwiT1JJR0lOQUwiLCJyYXdTZWMiLCJmcm9tX3N0cmluZyIsImVuY0J5dGVzIiwiY3J5cHRvX2JveF9zZWFsIiwiZW5jQmFzZTY0IiwidG9fYmFzZTY0IiwiZW5jcnlwdGVkX3ZhbHVlIiwic2V0dXBHaXRIdWJTZXR0aW5ncyIsIndpdGhSZXRyeSIsImFsbG93X2F1dG9fbWVyZ2UiLCJhbGxvd19tZXJnZV9jb21taXQiLCJhbGxvd19zcXVhc2hfbWVyZ2UiLCJhbGxvd19yZWJhc2VfbWVyZ2UiLCJhbGxvd191cGRhdGVfYnJhbmNoIiwiZGVsZXRlX2JyYW5jaF9vbl9tZXJnZSIsInNxdWFzaF9tZXJnZV9jb21taXRfdGl0bGUiLCJzcXVhc2hfbWVyZ2VfY29tbWl0X21lc3NhZ2UiLCJoZWFkZXJzIiwidGVtcGxhdGVzIiwiZ2VuZXJhdGVHaXRIdWJUZW1wbGF0ZXMiLCJkaXN0YW5jZSIsIndiZnlKc29uU2NoZW1hIiwieiIsInJlY29yZCIsInN0cmluZyIsIm9wdGlvbmFsIiwiZG9jIiwiZ2V0UGFja2FnZUNvbmZpZyIsImVzbVBhY2thZ2UiLCJwYWNrYWdlSnNvblRleHQiLCJ0eXBlIiwicmVsZWFzZUJyYW5jaGVzIiwicmVsZWFzZVBsdWdpbnMiLCJyZWxlYXNlcmNKc29uUGF0aCIsImZzcCIsImZsYXQiLCJyZXBvSW5mbyIsImdpdCIsInNpbXBsZUdpdCIsIm9yaWdpbiIsImdldFJlbW90ZXMiLCJyIiwicmVtb3RlVXJsIiwicmVmcyIsInJlcXVlc3RSZXBvSW5mbyIsIm1lc3NhZ2UiLCJmZXRjaFJlcG9JbmZvIiwibm9kZVZlcnNpb25Db250ZW50Iiwid2JmeUpzb25QYXRoIiwid2JmeUpzb25UZXh0IiwiZnVsbF9uYW1lIiwiQm9vbGVhbiIsInNlcCIsImNvbnRhaW5zQW55IiwiZG9lc0NvbnRhaW5Wc2NvZGVTZXR0aW5nc0pzb24iLCJnaXRodWIiLCJucG0iLCJnZXRFc2xpbnRFeHRlbnNpb25CYXNlIiwicGF0dGVybiIsIm9yZyIsInJldCIsImFzc2lnbiIsInNob3VsZFNraXBXaWxsYm9vc3RlckNvbmZpZ3NFc2xpbnRQYWNrYWdlIiwicmVtb3ZlTm9kZU1vZHVsZXNEaXJlY3RvcmllcyIsIm5vZGVNb2R1bGVzUGF0aHMiLCJnbG9iYmVkUGF0aHMiLCJvbmx5RGlyZWN0b3JpZXMiLCJmb2xsb3dTeW1ib2xpY0xpbmtzIiwibm9kZU1vZHVsZXNQYXRoIiwicm1TeW5jIiwiYXJndiIsInlhcmdzIiwicG9zaXRpb25hbCIsImRlc2NyaWJlIiwiYXJyYXkiLCJkZWZhdWx0IiwiYWxpYXMiLCJza2lwRGVwcyIsInZlcmJvc2UiLCJwYWNrYWdlSnNvbkRpciIsIlVSTCIsInBhdGhuYW1lIiwiZ2V0VmVyc2lvbiIsInJvb3REaXJQYXRoIiwicGF0aHMiLCJwYWNrYWdlc0RpclBhdGgiLCJzdWJEaXJQYXRocyIsImlnbm9yZUVycm9yQXN5bmMiLCJkIiwiYWJicmV2aWF0aW9uUHJvbWlzZSIsInN1YlBhY2thZ2VDb25maWdzIiwic3ViRGlyUGF0aCIsImFsbFBhY2thZ2VDb25maWdzIiwic2hvdWxkUnVuV29ya2Zsb3dzIiwidGhlbiJdLCJtYXBwaW5ncyI6Im1vQkFLTyxNQUFNQSxFQUFVLElBTHZCLE1BQ0VDLFdBQVksRUFDWkMsbUJBQW9CLEdDZ0JmLE1B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