@willbooster/wbfy 1.4.18 → 1.4.20
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.js +2 -2
- package/package.json +1 -1
package/dist/index.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import e from"node:fs";import t from"node:path";import n from"yargs";import i from"typescript";import{PromisePool as r}from"minimal-promise-pool";import s from"node:fs/promises";import o from"fast-glob";import a from"semver/functions/compare.js";import c from"semver/ranges/min-version.js";import l from"deepmerge";import p from"js-yaml";import{parse as d}from"smol-toml";import u from"node:os";import m from"node:child_process";import{Octokit as f}from"@octokit/core";import g from"semver";import{createRequire as y}from"node:module";import h from"dotenv";import{distance as w}from"fastest-levenshtein";import{simpleGit as b}from"simple-git";import{z as v}from"zod";async function k(e){return new Promise(t=>setTimeout(t,e))}async function x(e){try{return await e()}catch{}}async function j(e){try{return await e()}catch(e){if("object"==typeof e&&e&&"code"in e&&"ENOENT"===e.code)return;throw e}}const _=new class{isVerbose=!1;doesUploadEnvVars=!1};const S=new class{async functionIgnoringException(e,t){_.isVerbose&&console.info(`--------- ${e} start ---------`);try{await t()}catch(t){console.info(`Error occurred in ${e}: ${t instanceof Error?t.stack:String(t)}}`)}_.isVerbose&&console.info(`---------- ${e} end ----------`)}},$={async readFileIgnoringError(t){try{return await e.promises.readFile(t,"utf8")}catch{}},async generateFile(n,i){await e.promises.mkdir(t.dirname(n),{recursive:!0});let r=i.trim();r&&(r+="\n"),await e.promises.writeFile(n,r)}},P=new r;async function O(n){return S.functionIgnoringException("fixNextConfigJson",async()=>{const r=["js","mjs","cjs"].map(e=>t.resolve(n.dirPath,`next.config.${e}`)).find(t=>e.existsSync(t));if(!r)return;const s=await e.promises.readFile(r,"utf8"),o=function(e){const t=i.createSourceFile("next.config.js",e,i.ScriptTarget.Latest,!0,i.ScriptKind.JS);let n;const r=e=>{n||(i.isExportAssignment(e)&&i.isObjectLiteralExpression(e.expression)?n=e.expression:i.isBinaryExpression(e)&&e.operatorToken.kind===i.SyntaxKind.EqualsToken&&"module.exports"===e.left.getText(t)&&i.isObjectLiteralExpression(e.right)?n=e.right:i.forEachChild(e,r))};return r(t),n}(s);if(!o)return;const a=[];if(new Set(o.properties.map(e=>e.name?.getText())).has("typescript")||a.push("typescript: { ignoreBuildErrors: true }"),0===a.length)return;const c=o.getEnd()-1,l=o.properties.at(-1),p=!!l&&s.slice(l.getEnd(),c).includes(","),d=o.properties.length>0&&!p?", ":"",u=`${s.slice(0,c)}${d}${a.join(", ")}${s.slice(c)}`;await P.run(()=>$.generateFile(r,u))})}const E=e=>({kind:"literal",value:e}),C=(e,t=[])=>({kind:"object",value:B(e,t)}),A=B({forbidOnly:E("!!process.env.CI"),retries:E("process.env.PWDEBUG ? 0 : process.env.CI ? 5 : 1"),use:C({baseURL:E("process.env.NEXT_PUBLIC_BASE_URL"),trace:E("process.env.CI ? 'on-first-retry' : 'retain-on-failure'"),screenshot:E("process.env.CI ? 'only-on-failure' : 'only-on-failure'"),video:E("process.env.CI ? 'retain-on-failure' : 'retain-on-failure'")}),webServer:C({command:E("'yarn start-test-server'"),url:E("process.env.NEXT_PUBLIC_BASE_URL"),reuseExistingServer:E("!!process.env.CI"),timeout:E("300_000"),stdout:E("'pipe'"),stderr:E("'pipe'"),env:E("{\n ...process.env,\n PRISMA_USER_CONSENT_FOR_DANGEROUS_AI_ACTION: 'true',\n}"),gracefulShutdown:E("{\n signal: 'SIGTERM',\n timeout: 500,\n}")})});function B(e,t=[]){return{extraMembers:t,memberOrder:[...Object.keys(e).map(e=>({kind:"property",key:e})),...t.map((e,t)=>({kind:"extra",index:t}))],properties:e}}async function F(n){const r=t.resolve(n.dirPath,"playwright.config.ts");if(e.existsSync(r))return S.functionIgnoringException("fixPlaywrightConfig",async()=>{await async function(n){for(const i of function(n){const i=[".env",".env.test",".env.example","mise.toml","mise.test.toml"],r=[];for(let s=t.resolve(n);r.push(...i.map(e=>t.resolve(s,e))),!e.existsSync(t.resolve(s,".git"));s=t.dirname(s)){if(t.dirname(s)===s)break}return r}(n))try{const t=await e.promises.readFile(i,"utf8");if(/NEXT_PUBLIC_BASE_URL\s*=/m.test(t))return}catch{}throw new Error("NEXT_PUBLIC_BASE_URL is required for Playwright. Define NEXT_PUBLIC_BASE_URL in the target repo.")}(n.dirPath);const s=await e.promises.readFile(r,"utf8"),o=function(e){const t=i.createSourceFile("playwright.config.ts",e,i.ScriptTarget.Latest,!0,i.ScriptKind.TS);let n;const r=e=>{if(!n){if(i.isCallExpression(e)&&"defineConfig"===e.expression.getText(t)){const t=e.arguments[0];if(t&&i.isObjectLiteralExpression(t))return void(n=t)}i.forEachChild(e,r)}};return r(t),n?{source:t,node:n}:void 0}(s);if(!o)return;const a=T(o.node,o.source);if(!a)return;const c=I(A,a),l=Boolean(n.packageJson?.scripts?.["start-test-server"]),p=Boolean(a.properties.webServer);l||p||delete c.properties.webServer,function(e,t){const n=t.properties.webServer;if("object"!==n?.kind)return;n.value.properties.command=E(e.isBun?"'bun start-test-server'":"'yarn start-test-server'")}(n,c);const d=W({kind:"object",value:c},0),u=o.node.getStart(o.source),m=o.node.getEnd(),f=`${s.slice(0,u)}${d}${s.slice(m)}`;await P.run(()=>$.generateFile(r,f))})}function I(e,t){const n=new Set(Object.keys(t.properties)),i=[...e.extraMembers,...t.extraMembers],r=[...e.memberOrder.filter(e=>"property"!==e.kind||!n.has(e.key)),...t.memberOrder.map(t=>"property"===t.kind?t:{kind:"extra",index:e.extraMembers.length+t.index})],s={...e.properties};for(const[e,n]of Object.entries(t.properties))s[e]=D(s[e],n);return{extraMembers:i,memberOrder:r,properties:s}}function D(e,t){return"object"===e?.kind&&"object"===t.kind?{kind:"object",value:I(e.value,t.value)}:t}function R(e,t){if(i.isObjectLiteralExpression(e)){const n=T(e,t);return n?{kind:"object",value:n}:E(e.getText(t))}if(i.isArrayLiteralExpression(e)){const n=e.elements.map(e=>R(e,t));return n.some(e=>void 0===e)?E(e.getText(t)):{kind:"array",value:n}}return E(e.getText(t))}function T(e,t){const n={extraMembers:[],memberOrder:[],properties:{}};for(const r of e.properties){if(i.isShorthandPropertyAssignment(r)){const e=r.name.getText(t);n.properties[e]=E(e),n.memberOrder.push({kind:"property",key:e});continue}if(!i.isPropertyAssignment(r)||!i.isIdentifier(r.name)&&!i.isStringLiteral(r.name)){const e=n.extraMembers.push(r.getText(t))-1;n.memberOrder.push({kind:"extra",index:e});continue}const e=R(r.initializer,t);if(void 0===e)return;const s=r.name.getText(t);n.properties[s]=e,n.memberOrder.push({kind:"property",key:s})}return n}function W(e,t){const n=" ".repeat(t);if("array"===e.kind){if(0===e.value.length)return"[]";const i=" ".repeat(t+1);return`[\n${e.value.map(e=>{const n=W(e,t+1).split("\n");if(n[n.length-1]=`${n.at(-1)},`,"literal"===e.kind)for(let e=1;e<n.length;e+=1)n[e]=`${i}${n[e]}`;return n[0]=`${i}${n[0]}`,n.join("\n")}).join("\n")}\n${n}]`}if("literal"===e.kind)return e.value;const i=" ".repeat(t+1),r=new Set,s=function(e){const t=new Map;for(const[n,i]of e.entries())"property"===i.kind&&t.set(i.key,n);return t}(e.value.memberOrder),o=e.value.memberOrder.flatMap((n,o)=>{if("extra"===n.kind)return[N(e.value.extraMembers[n.index]??"",i)];if(s.get(n.key)!==o)return[];const a=e.value.properties[n.key];return!a||r.has(n.key)?[]:(r.add(n.key),[L(n.key,a,t,i)])});return o.push(...Object.entries(e.value.properties).filter(([e])=>!r.has(e)).map(([e,n])=>L(e,n,t,i))),0===o.length?`{\n${n}}`:`{\n${o.join("\n")}\n${n}}`}function L(e,t,n,i){const r=W(t,n+1).split("\n");if(r[r.length-1]=`${r.at(-1)},`,"literal"===t.kind)for(let e=1;e<r.length;e+=1)r[e]=`${i}${r[e]}`;return r[0]=`${i}${e}: ${r[0]}`,r.join("\n")}function N(e,t){const n=e.split("\n");n[n.length-1]=`${n.at(-1)},`;for(const[e,i]of n.entries())n[e]=`${t}${i}`;return n.join("\n")}const J=["**/node_modules/**","**/.venv/**","**/test-fixtures/**","**/test/fixtures/**","**/dist/**","**/build/**","**/target/**","**/temp/**","**/tmp/**"];async function U(e){return S.functionIgnoringException("fixPrismaEnvFiles",async()=>{const n=await o.glob(["*.env","*.env.*"],{dot:!0,cwd:e.dirPath,ignore:J});for(const i of n){const n=t.resolve(e.dirPath,i),r=(await s.readFile(n,"utf8")).replaceAll(/DATABASE_URL\s*=\s*"?([^"#\n]+?\.sqlite3[^"#\n]*)"?/g,(e,t)=>{if(t.includes("connection_limit=1"))return e;const n=t.includes("?")?"&":"?";return`DATABASE_URL="${t}${n}connection_limit=1"`});await s.writeFile(n,r)}})}const M=(e,t)=>Object.prototype.hasOwnProperty.call(e,t);function G(e,t){let n,i,r;"function"==typeof t?i=t:n=t;const s={},o=[...n??[],...Object.keys(e).sort(i)];for(r of o)M(e,r)&&(s[r]=e[r]);return s}const q=/^(?:( )+|\t+)/,z="space";function H(e,t,n){return e&&t===z&&1===n}function Y(e,t){const n=new Map;let i,r,s=0;for(const o of e.split(/\n/g)){if(!o)continue;const e=o.match(q);if(null===e)s=0,i="";else{const o=e[0].length,a=e[1]?z:"tab";if(H(t,a,o))continue;a!==i&&(s=0),i=a;let c=1,l=0;const p=o-s;if(s=o,0===p)c=0,l=1;else{const e=Math.abs(p);if(H(t,a,e))continue;r=K(a,e)}const d=n.get(r);n.set(r,void 0===d?[1,0]:[d[0]+c,d[1]+l])}}return n}function K(e,t){return(e===z?"s":"t")+String(t)}function V(e){if("string"!=typeof e)throw new TypeError("Expected a string");let t=Y(e,!0);0===t.size&&(t=Y(e,!1));const n=function(e){let t,n=0,i=0;for(const[r,[s,o]]of e)(s>n||s===n&&o>i)&&(n=s,i=o,t=r);return t}(t);let i,r=0,s="";var o;return void 0!==n&&(({type:i,amount:r}={type:"s"===(o=n)[0]?z:"tab",amount:Number(o.slice(1))}),s=function(e,t){return(e===z?" ":"\t").repeat(t)}(i,r)),{amount:r,type:i,indent:s}}function X(e){return"string"==typeof e&&function(e){if("string"!=typeof e)throw new TypeError("Expected a string");const t=e.match(/(?:\r?\n)/g)||[];if(0===t.length)return;const n=t.filter(e=>"\r\n"===e).length;return n>t.length-n?"\r\n":"\n"}(e)||"\n"}const Z=e=>(t,...n)=>e.reduce((e,t)=>t(e,...n),t),Q=e=>t=>Array.isArray(t)?e(t):t,ee=e=>t=>Array.isArray(t)&&t.every(e=>"string"==typeof e)?e(t):t,te=ee(e=>[...new Set(e)]),ne=ee(e=>e.toSorted()),ie=Z([te,ne]),re=e=>(t,...n)=>function(e){if("object"!=typeof e||null===e)return!1;const t=Object.getPrototypeOf(e);return!(null!==t&&t!==Object.prototype&&null!==Object.getPrototypeOf(t)||Symbol.toStringTag in e||Symbol.iterator in e)}(t)?e(t,...n):t,se=(e,t)=>{const n=re(i=>(t&&(i=Object.fromEntries(Object.entries(i).map(([e,t])=>[e,n(t)]))),G(i,e)));return n},oe=Object.groupBy||((e,t)=>{const n=Object.create(null);for(const i of e){const e=t(i);n[e]?n[e].push(i):n[e]=[i]}return n}),ae=se(),ce=se(["type","url"]),le=se(["name","email","url"]),pe=se(["lib","bin","man","doc","example","test"]),de=(e,t)=>re((n,...i)=>Object.hasOwn(n,e)?{...n,[e]:t(n[e],...i)}:n),ue=se(["applypatch-msg","pre-applypatch","post-applypatch","pre-commit","pre-merge-commit","prepare-commit-msg","commit-msg","post-commit","pre-rebase","post-checkout","post-merge","pre-push","pre-receive","update","proc-receive","post-receive","post-update","reference-transaction","push-to-checkout","pre-auto-gc","post-rewrite","sendemail-validate","fsmonitor-watchman","p4-changelist","p4-prepare-changelist","p4-post-changelist","p4-pre-submit","post-index-change"]),me=e=>{const[t]=e.split(">"),n=[...t.matchAll("@")];if(!n.length||1===n.length&&0===n[0].index)return{name:e};const i=n.pop().index;return{name:t.substring(0,i),range:t.substring(i+1)}},fe=se((e,t)=>{const{name:n,range:i}=me(e),{name:r,range:s}=me(t);return n!==r?n.localeCompare(r,"en"):i?s?a(c(i),c(s)):1:-1}),ge=e=>{const t=e.indexOf("@",e.startsWith("@")?1:0);return-1===t?e:e.slice(0,t)},ye=new Map;function he(t){return"string"==typeof t.packageManager?t.packageManager.startsWith("npm@"):t.devEngines?.packageManager?.name?"npm"===t.devEngines.packageManager.name:!t.pnpm&&(!!t.engines?.npm||!(()=>{const t=process.cwd();return ye.has(t)||ye.set(t,e.existsSync("yarn.lock")||e.existsSync(".yarn/")||e.existsSync(".yarnrc.yml")||e.existsSync("pnpm-lock.yaml")||e.existsSync("pnpm-workspace.yaml")),ye.get(t)})())}const we=re((e,t)=>Object.keys(e).length<2?e:he(t)?G(e,(e,t)=>e.localeCompare(t,"en")):G(e)),be=Z([se(["packages","catalog"]),de("packages",ie),de("catalog",we)]),ve=Z([se(["files","excludedFiles","env","parser","parserOptions","settings","plugins","extends","rules","overrides","globals","processor","noInlineConfig","reportUnusedDisableDirectives"]),de("env",ae),de("globals",ae),de("overrides",Q(e=>e.map(ve))),de("parserOptions",ae),de("rules",se((e,t)=>e.split("/").length-t.split("/").length||e.localeCompare(t))),de("settings",ae)]),ke=se(["description","url","href"]),xe=Z([re(e=>G(e,[...Object.keys(e).filter(e=>"overrides"!==e).sort(),"overrides"])),de("overrides",Q(e=>e.map(Z([ae,de("options",ae)]))))]),je=se(["node","npm","yarn"]),_e=de("packageManager",se(["name","version","onFail"])),Se=Z([se(["peerDependencyRules","neverBuiltDependencies","onlyBuiltDependencies","onlyBuiltDependenciesFile","allowedDeprecatedVersions","allowNonAppliedPatches","updateConfig","auditConfig","requiredScripts","supportedArchitectures","overrides","patchedDependencies","packageExtensions"],!0),de("overrides",fe)]),$e=new Set(["install","pack","prepare","publish","restart","shrinkwrap","start","stop","test","uninstall","version"]),Pe=(e,t)=>Object.hasOwn(t,"devDependencies")&&Object.hasOwn(t.devDependencies,e),Oe=/(?<=^|[\s&;<>|(])(?:run-s|npm-run-all2? .*(?:--sequential|--serial|-s))(?=$|[\s&;<>|)])/,Ee=e=>{if(!Pe("npm-run-all",e)&&!Pe("npm-run-all2",e))return!1;return["scripts","betterScripts"].flatMap(t=>e[t]?Object.values(e[t]):[]).some(e=>{return(t=e).includes("*")&&Oe.test(t);var t})};function Ce(e,t=""){const n=new Map;for(const i of e){const e=(t?i.slice(t.length+1):i).indexOf(":");if(e>0){const r=i.slice(0,(t?t.length+1:0)+e);n.has(r)||n.set(r,[]),n.get(r).push(i)}else n.has(i)||n.set(i,[]),n.get(i).push(i)}return Array.from(n.keys()).sort().flatMap(e=>{const t=n.get(e);if(t.length>1&&t.some(t=>t!==e&&t.startsWith(e+":"))){return[...t.filter(t=>t===e||!t.startsWith(e+":")).sort(),...Ce(t.filter(t=>t.startsWith(e+":")),e)]}return t.sort()})}const Ae=re((e,t)=>{let n=Object.keys(e);const i=new Set;return n=n.map(e=>{const t=e.replace(/^(?:pre|post)/,"");return $e.has(t)||n.includes(t)?(i.add(t),t):e}),Ee(t)||(n=Ce(n)),n=n.flatMap(e=>i.has(e)?[`pre${e}`,e,`post${e}`]:[e]),G(e,n)}),Be=e=>{const{defaultConditions:t=[],restConditions:n=[]}=oe(e,e=>"default"===e?"defaultConditions":"restConditions");return[...n,...t]},Fe=re(e=>{const{paths:t=[],conditions:n=[]}=oe(Object.keys(e),e=>e.startsWith(".")?"paths":"conditions");return Object.fromEntries([...t,...Be(n)].map(t=>[t,Fe(e[t])]))}),Ie=[{key:"$schema"},{key:"name"},{key:"displayName"},{key:"version"},{key:"stableVersion"},{key:"private"},{key:"description"},{key:"categories",over:te},{key:"keywords",over:te},{key:"homepage"},{key:"bugs",over:se(["url","email"])},{key:"repository",over:ce},{key:"funding",over:ce},{key:"license",over:ce},{key:"qna"},{key:"author",over:le},{key:"maintainers",over:Q(e=>e.map(le))},{key:"contributors",over:Q(e=>e.map(le))},{key:"publisher"},{key:"sideEffects"},{key:"type"},{key:"imports"},{key:"exports",over:Fe},{key:"main"},{key:"svelte"},{key:"umd:main"},{key:"jsdelivr"},{key:"unpkg"},{key:"module"},{key:"source"},{key:"jsnext:main"},{key:"browser"},{key:"react-native"},{key:"types"},{key:"typesVersions"},{key:"typings"},{key:"style"},{key:"example"},{key:"examplestyle"},{key:"assets"},{key:"bin",over:ae},{key:"man"},{key:"directories",over:pe},{key:"files",over:te},{key:"workspaces",over:be},{key:"binary",over:se(["module_name","module_path","remote_path","package_name","host"])},{key:"scripts",over:Ae},{key:"betterScripts",over:Ae},{key:"l10n"},{key:"contributes",over:ae},{key:"activationEvents",over:te},{key:"husky",over:de("hooks",ue)},{key:"simple-git-hooks",over:ue},{key:"pre-commit"},{key:"commitlint",over:ae},{key:"lint-staged"},{key:"nano-staged"},{key:"config",over:ae},{key:"nodemonConfig",over:ae},{key:"browserify",over:ae},{key:"babel",over:ae},{key:"browserslist"},{key:"xo",over:ae},{key:"prettier",over:xe},{key:"eslintConfig",over:ve},{key:"eslintIgnore"},{key:"npmpkgjsonlint",over:ae},{key:"npmPackageJsonLintConfig",over:ae},{key:"npmpackagejsonlint",over:ae},{key:"release",over:ae},{key:"remarkConfig",over:ae},{key:"stylelint"},{key:"ava",over:ae},{key:"jest",over:ae},{key:"jest-junit",over:ae},{key:"jest-stare",over:ae},{key:"mocha",over:ae},{key:"nyc",over:ae},{key:"c8",over:ae},{key:"tap",over:ae},{key:"oclif",over:se(void 0,!0)},{key:"resolutions",over:ae},{key:"overrides",over:we},{key:"dependencies",over:we},{key:"devDependencies",over:we},{key:"dependenciesMeta",over:se((e,t)=>{const n=ge(e),i=ge(t);return n<i?-1:n>i?1:0},!0)},{key:"peerDependencies",over:we},{key:"peerDependenciesMeta",over:se(void 0,!0)},{key:"optionalDependencies",over:we},{key:"bundledDependencies",over:ie},{key:"bundleDependencies",over:ie},{key:"extensionPack",over:ie},{key:"extensionDependencies",over:ie},{key:"flat"},{key:"packageManager"},{key:"engines",over:ae},{key:"engineStrict",over:ae},{key:"devEngines",over:_e},{key:"volta",over:je},{key:"languageName"},{key:"os"},{key:"cpu"},{key:"preferGlobal",over:ae},{key:"publishConfig",over:ae},{key:"icon"},{key:"badges",over:Q(e=>e.map(ke))},{key:"galleryBanner",over:ae},{key:"preview"},{key:"markdown"},{key:"pnpm",over:Se}],De=Ie.map(({key:e})=>e),Re=Z(Ie.map(({key:e,over:t})=>t?de(e,t):void 0).filter(Boolean));function Te(e,t={}){return function(e,t){if("string"==typeof e){const{indent:n,type:i}=V(e),r="\n"===e.slice(-1)?"\n":"",s=X(e);e=JSON.parse(e);let o=JSON.stringify(t(e),null,"tab"===i?"\t":n)+r;return"\r\n"===s&&(o=o.replace(/\n/g,s)),o}return t(e)}(e,re(e=>{let n=t.sortOrder||De;if(Array.isArray(n)){const t=Object.keys(e),{privateKeys:i=[],publicKeys:r=[]}=oe(t,e=>"_"===e[0]?"privateKeys":"publicKeys");n=[...n,...De,...r.sort(),...i.sort()]}return Re(G(e,n),e)}))}async function We(n){return S.functionIgnoringException("fixTestDirectoriesUpdatingPackageJson",async()=>{await Promise.all(n.map(async n=>{const i=t.join(n,"package.json");if(!e.existsSync(i))return;const r=t.join(n,"test");for(const s of["__tests__","tests"]){const o=t.join(n,s);try{await Le(o,r);const t=JSON.parse(await e.promises.readFile(i,"utf8"));let n=!1;const a=t.scripts??{};for(const[e,t]of Object.entries(a)){const i=t.replaceAll(s,"test");t!==i&&(a[e]=i,n=!0)}if(t.scripts=a,!n)return;await $.generateFile(i,JSON.stringify(Te(t),void 0,2))}catch{}}}))})}async function Le(n,i){if(!e.existsSync(i))return void await e.promises.rename(n,i);const r=await e.promises.readdir(n,{withFileTypes:!0});await Promise.all(r.map(async r=>{const s=t.join(n,r.name),o=t.join(i,r.name),a=e.existsSync(o)?await e.promises.stat(o):void 0;r.isDirectory()&&a?.isDirectory()?await Le(s,o):await e.promises.rename(s,o)})),await e.promises.rm(n,{recursive:!0})}async function Ne(e,n){return S.functionIgnoringException("fixTypeDefinitions",async()=>{const i=t.resolve(e.dirPath,"@types"),r=e.isRoot&&e.doesContainSubPackageJsons?void 0:t.resolve(e.dirPath,"src","types"),o=await j(()=>s.readdir(i,{withFileTypes:!0}));if(o)for(const e of o){const o=e.name.slice(0,-5),a=e.name.endsWith(".d.ts");let c=a?o:e.name;c.includes("__")&&(c=`@${c.replace("__","/")}`);const l=n.some(e=>e.packageJson?.dependencies?.[c]||e.packageJson?.devDependencies?.[c]);e.isFile()&&a?l?(await s.mkdir(t.join(i,o),{recursive:!0}),await P.run(()=>s.rename(t.join(i,e.name),t.join(i,o,"index.d.ts")))):r&&(await s.mkdir(r,{recursive:!0}),await P.run(()=>s.rename(t.join(i,e.name),t.join(r,e.name)))):e.isDirectory()&&r&&!l&&(await s.mkdir(r,{recursive:!0}),await P.run(()=>j(()=>s.rename(t.join(i,e.name,"index.d.ts"),t.join(r,`${e.name}.d.ts`)))))}})}function Je(e,t){return t}function Ue(e,t,n){const i=[...e];for(const[r,s]of t.entries())void 0===i[r]?i[r]=Me(s,n):Ge(e[r],n)&&Ge(s,n)?i[r]=l(e[r],s,n):e.includes(s)||i.push(s);return i}function Me(e,t){return Ge(e,t)?t.cloneUnlessOtherwiseSpecified(e,t):e}function Ge(e,t){return!!e&&"object"==typeof e&&t.isMergeableObject(e)}function qe(e){const t=Object.entries(e).toSorted(([e],[t])=>e.localeCompare(t));for(const[n,i]of t)delete e[n],e[n]=i,i&&"object"==typeof i&&!Array.isArray(i)&&qe(i);return e}const ze={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"}}},He={name:"Fix code automatically",on:{pull_request:null},concurrency:{group:"${{ github.workflow }}-${{ github.ref }}","cancel-in-progress":!0},jobs:{autofix:{uses:"WillBooster/reusable-workflows/.github/workflows/autofix.yml@main"}}},Ye={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 Ke(n){return S.functionIgnoringException("generateWorkflow",async()=>{if(Ve(n.repository))return;const i=t.resolve(n.dirPath,".github","workflows");await e.promises.mkdir(i,{recursive:!0});const r=t.resolve(n.dirPath,".github","semantic.yml");await P.run(()=>e.promises.rm(r,{force:!0,recursive:!0}));const s=await e.promises.readdir(i,{withFileTypes:!0}),o=new Set(["test.yml","autofix.yml","semantic-pr.yml","close-comment.yml","gen-pr-claude.yml","gen-pr-codex.yml","gen-pr-gemini.yml",...s.filter(e=>e.isFile()&&e.name.endsWith(".yml")).map(e=>e.name)]);n.depending.semanticRelease&&o.add("release.yml");for(const e of o){const r=t.basename(e,".yml");await P.run(()=>Xe(n,i,r))}})}function Ve(e){return e?.endsWith("/reusable-workflows")??!1}async function Xe(n,i,r){const s=t.join(i,`${r}.yml`),o=e.existsSync(t.join(i,"deploy-production.yml"));if("autofix"===r)return void await Qe(function(e){if(!e.isPublicRepo)return structuredClone(He);const t=e.isBun?"bun":"yarn",n=[{uses:"actions/checkout@v6"},{uses:"actions/setup-node@v6",with:{"check-latest":!0,"node-version":"lts/*"}},...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 i=structuredClone(ze),r=i.jobs.autofix??{"runs-on":"ubuntu-latest"};return i.jobs.autofix={...r,steps:n},i}(n),s);let a=structuredClone(r in Ye?Ye[r]:{});try{const t=await e.promises.readFile(s,"utf8"),n=p.load(t);a=l.all([a,n,a],{arrayMerge:Ue})}catch{}if(!("jobs"in a))return;r.startsWith("deploy")&&(a={...a,concurrency:{group:"${{ github.workflow }}","cancel-in-progress":!1}},function(e,t){const n=e[t];delete e[t],e[t]=n}(a,"jobs"),a.on?.push&&(a.on.push["paths-ignore"]=[...new Set(["**.md","**/docs/**",...a.on.push["paths-ignore"]??[]])])),"release"===r&&a.jobs.release&&o&&(a.permissions??={},a.permissions.actions="write",a.jobs.release.with??={},a.jobs.release.with.trigger_deploy_workflow="deploy-production.yml");let c=!1;for(const e of Object.values(a.jobs))e.uses?.includes("/reusable-workflows/")&&(Ze(n,e,r),c=!0);if(c){switch(r){case"release":if(a.on?.schedule)delete a.on.push;else{if(!(a.on?.push&&n.release.branches.length>0))return void await e.promises.rm(t.join(i,"release.yml"),{force:!0});a.on.push.branches=n.release.branches}n.isPublicRepo?(a.permissions??={},a.permissions["id-token"]="write"):delete a.permissions?.["id-token"];break;case"test":a.on?.pull_request&&delete a.on.pull_request["paths-ignore"],a.on?.push&&(delete a.on.push["paths-ignore"],a.on.push.branches=a.on.push.branches.filter(e=>"renovate/**"!==e))}if(await Qe(a,s),"sync"===r){if(await e.promises.rm(t.join(i,"sync-init.yml"),{force:!0}),!a.jobs.sync?.with)return;a.jobs["sync-force"]=a.jobs.sync;const n=a.jobs.sync.with.sync_params_without_dest;if("string"!=typeof n)return;a.jobs.sync.with.sync_params_without_dest=`--force ${n}`,a.name="Force to Sync",a.on={workflow_dispatch:null},delete a.jobs.sync,await Qe(a,t.join(i,"sync-force.yml"))}}}function Ze(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,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?qe(t.with):delete t.with,Object.keys(t.secrets).length>0){const e=qe(t.secrets);delete t.secrets,t.secrets=e}else delete t.secrets}async function Qe(t,n){const i=p.dump(t,{lineWidth:-1,noCompatMode:!0,styles:{"!!null":"empty"}}).replaceAll(/[ \t]+$/gm,"");await e.promises.writeFile(n,i)}async function et(n){return S.functionIgnoringException("fixTypos",async()=>{if(Ve(n.repository))return;const i=n.dirPath,r=await o.glob("**/*.md",{dot:!0,cwd:i,ignore:J});_.isVerbose&&console.info(`Found ${r.length} markdown files in ${i}`);for(const s of r){const r=t.join(i,s);P.run(async()=>{const t=await e.promises.readFile(r,"utf8");let i=tt(t);i=nt(i,n,"doc"),t!==i&&await $.generateFile(r,i)})}const s=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:i,ignore:J});_.isVerbose&&console.info(`Found ${s.length} TypeScript files in ${i}`);for(const r of s){const s=t.join(i,r);P.run(async()=>{const t=await e.promises.readFile(s,"utf8");let i=t.replaceAll(/\/\*[\s\S]*?\*\//g,e=>tt(e)).replaceAll(/(^|\s)\/\/(.*?)c\.f\./g,"$1//$2cf.").replaceAll(/(^|\s)\/\/(.*?)eg\./g,"$1//$2e.g.").replaceAll(/(^|\s)\/\/(.*?)ie\./g,"$1//$2i.e.");i=nt(i,n,"ts"),t!==i&&await $.generateFile(s,i)})}const a=await o.glob("**/*.{csv,htm,html,tsv,xml,yaml,yml}",{dot:!0,cwd:i,ignore:J});_.isVerbose&&console.info(`Found ${a.length} text-based files in ${i}`);for(const r of a){const s=t.join(i,r);P.run(async()=>{const t=await e.promises.readFile(s,"utf8");let i=tt(t);i=nt(i,n,"text"),t!==i&&await $.generateFile(s,i)})}await P.promiseAll()})}function tt(e){return e.replaceAll(/\bc\.f\.(?=\s|$)/g,"cf.").replaceAll(/\beg\.(?=\s|$)/g,"e.g.").replaceAll(/\bie\.(?=\s)/g,"i.e.")}function nt(e,t,n){for(const[n,i]of Object.entries(t.wbfyJson?.typos?.all??{}))e=e.replaceAll(n,i);for(const[i,r]of Object.entries(t.wbfyJson?.typos?.[n]??{}))e=e.replaceAll(i,r);return e}async function it(e,n){return S.functionIgnoringException("generateAgentInstructions",async()=>{if(!e.isRoot)return;const i=t.resolve(e.dirPath,"AGENTS_EXTRA.md"),r=await $.readFileIgnoringError(i);for(const[i,s]of[["AGENTS.md","Codex CLI"],["CLAUDE.md","Claude Code"],["GEMINI.md","Gemini CLI"]]){const o=rt(e,n,s,r),a=t.resolve(e.dirPath,i);await P.run(()=>$.generateFile(a,o))}const s=t.resolve(e.dirPath,".cursor/rules/general.mdc"),o=function(e,t,n){const i="---\ndescription: General Coding Rules\nglobs:\nalwaysApply: true\n---",r=rt(e,t,"Cursor",n);return`${i}\n\n${r}`}(e,n,r);await P.run(()=>$.generateFile(s,o))})}function rt(e,t,n,i){const r=e.isBun?"bun":"yarn",s=`\n## Project Information\n\n- Name: \`${e.packageJson?.name||"unknown"}\`\n- Description: ${e.packageJson?.description}\n- Package Manager: ${r}\n\n## General Instructions\n\n- Create a new branch if the current branch is \`main\`.\n- Run any \`git\` commands sequentially.\n- Write tests ONLY if explicitly requested. If requested, follow these rules:\n - Continue modifying the tests and code until all tests pass.\n - Ensure tests reset any related persistent data, as our test infrastructure does not clear it automatically.\n - Prefer actual API calls over mocks. Use mocks when actual calls are impractical, have unintended side effects, or are explicitly requested.\n- When fixing issues, follow these rules:\n - Investigate the root cause first (e.g., by gathering debug logs, taking screenshots, etc.).\n - Fix the actual root cause instead of applying workarounds.\n- After making code changes, run \`${r} check-all-for-ai\` to execute all tests (takes up to 1 hour), or \`${r} check-for-ai\` for only type checking and linting (takes up to 10 minutes).\n - If you are confident that your changes will not break any tests, you may use \`check-for-ai\`.\n - Use \`oxlint\` ignore comments with reasons (e.g., \`// oxlint-disable-next-line <rule> -- <reason>\`) if lint errors or warnings cannot be fixed.\n- Once you have verified your changes, commit and push them to the current (non-main) branch, then create a PR via \`gh\`.\n - Follow the conventional commits; your commit message should start with \`feat:\`, \`fix:\`, etc.\n - If not specified, 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.hasStartTestServer)?`- Use \`${r} run start-test-server\` to launch a web server for debugging or testing.`:""}\n\n${st(t)}\n`.replaceAll(/\.\n\n+-/g,".\n-").replaceAll(/\n{3,}/g,"\n\n").trim(),o=i?.trim().startsWith("#");return s+(i?o?"\n\n"+i.trim():"\n"+i:"")}function st(e){return`\n## Coding Style\n\n- Use camelCase for JavaScript and TypeScript files (or PascalCase for React components).\n- Simplify code as much as possible to eliminate redundancy.\n- Design each module with high cohesion, grouping related functionality together.\n - Refactor existing large modules into smaller, focused modules when necessary.\n - Create well-organized directory structures with low coupling and high cohesion.\n- Place calling functions in the file above the functions they call to maintain a clear top-down order.\n - e.g. \`function caller() { callee(); } function callee() { ... }\`\n- Write comments that explain "why" rather than "what". Avoid stating what can be understood from the code itself.\n- Prefer \`undefined\` over \`null\` unless explicitly required by APIs or libraries.\n- Prefer using a single template literal for prompts instead of \`join()\` with an array of strings.\n${e.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${e.some(e=>e.depending.react||e.depending.next)?"- Prefer `useImmer` for storing an array or an object to `useState`.":""}\n${e.some(e=>e.depending.next)?"\n- Since this project uses the React Compiler, you do not need to use `useCallback` or `useMemo` for performance optimization.\n- Assume there is only a single server instance.\n":""}\n`.replaceAll(/\.\n\n+-/g,".\n-").replaceAll(/\n{3,}/g,"\n\n").trim()}const ot=["@exercode/problem-utils","@willbooster/agent-skills","@willbooster/babel-configs","@willbooster/monaco-loader","@willbooster/monaco-react","@willbooster/oxfmt-config","@willbooster/oxlint-config","@willbooster/prettier-config","@willbooster/renovate-config","@willbooster/shared-lib","@willbooster/shared-lib-blitz-next","@willbooster/shared-lib-next","@willbooster/shared-lib-node","@willbooster/shared-lib-react","@willbooster/wb","agent-runtime-kit","at-decorators","build-ts","gen-i18n-ts","one-way-git-sync","@typescript/native-preview","@typescript/native-preview-darwin-arm64","@typescript/native-preview-darwin-x64","@typescript/native-preview-linux-arm","@typescript/native-preview-linux-arm64","@typescript/native-preview-linux-x64","@typescript/native-preview-win32-arm64","@typescript/native-preview-win32-x64","oxfmt","@oxfmt/binding-android-arm-eabi","@oxfmt/binding-android-arm64","@oxfmt/binding-darwin-arm64","@oxfmt/binding-darwin-x64","@oxfmt/binding-freebsd-x64","@oxfmt/binding-linux-arm-gnueabihf","@oxfmt/binding-linux-arm-musleabihf","@oxfmt/binding-linux-arm64-gnu","@oxfmt/binding-linux-arm64-musl","@oxfmt/binding-linux-ppc64-gnu","@oxfmt/binding-linux-riscv64-gnu","@oxfmt/binding-linux-riscv64-musl","@oxfmt/binding-linux-s390x-gnu","@oxfmt/binding-linux-x64-gnu","@oxfmt/binding-linux-x64-musl","@oxfmt/binding-openharmony-arm64","@oxfmt/binding-win32-arm64-msvc","@oxfmt/binding-win32-ia32-msvc","@oxfmt/binding-win32-x64-msvc","oxlint","@oxlint/binding-android-arm-eabi","@oxlint/binding-android-arm64","@oxlint/binding-darwin-arm64","@oxlint/binding-darwin-x64","@oxlint/binding-freebsd-x64","@oxlint/binding-linux-arm-gnueabihf","@oxlint/binding-linux-arm-musleabihf","@oxlint/binding-linux-arm64-gnu","@oxlint/binding-linux-arm64-musl","@oxlint/binding-linux-ppc64-gnu","@oxlint/binding-linux-riscv64-gnu","@oxlint/binding-linux-riscv64-musl","@oxlint/binding-linux-s390x-gnu","@oxlint/binding-linux-x64-gnu","@oxlint/binding-linux-x64-musl","@oxlint/binding-openharmony-arm64","@oxlint/binding-win32-arm64-msvc","@oxlint/binding-win32-ia32-msvc","@oxlint/binding-win32-x64-msvc","oxlint-tsgolint","@oxlint-tsgolint/darwin-arm64","@oxlint-tsgolint/darwin-x64","@oxlint-tsgolint/linux-arm64","@oxlint-tsgolint/linux-x64","@oxlint-tsgolint/win32-arm64","@oxlint-tsgolint/win32-x64","@next/env","@next/font","@next/rspack-binding-linux-arm64-gnu","@next/rspack-binding-linux-arm64-musl","@next/rspack-binding-linux-x64-gnu","@next/rspack-binding-linux-x64-musl","@next/swc-android-arm-eabi","@next/swc-android-arm64","@next/swc-darwin-arm64","@next/swc-darwin-x64","@next/swc-freebsd-x64","@next/swc-linux-arm-gnueabihf","@next/swc-linux-arm64-gnu","@next/swc-linux-arm64-musl","@next/swc-linux-x64-gnu","@next/swc-linux-x64-musl","@next/swc-wasm-nodejs","@next/swc-wasm-web","@next/third-parties","next","react","react-dom"];async function at(n){return S.functionIgnoringException("generateBunfigToml",async()=>{const i=t.resolve(n.dirPath,"bunfig.toml"),r=e.existsSync(i)?e.readFileSync(i,"utf8"):void 0,s=ct(r);await P.run(()=>$.generateFile(i,s))})}const ct=e=>{const t=function(e){if(!e)return;try{return d(e)}catch{return}}(e);return`env = false\ntelemetry = false\n\n${function(e){return"boolean"==typeof e?.run?.bun?`[run]\nbun = ${e.run.bun}\n`:""}(t)}\n[install]\nexact = ${!1===t?.install?.exact?"false":"true"}\nlinker = "hoisted"\nminimumReleaseAge = 432000 # 5 days\nminimumReleaseAgeExcludes = [\n${ot.map(e=>` "${e}",`).join("\n")}\n]\n`};const lt="# Project-specific settings",pt=/# Project-specific settings[^\n]*\n/gm,dt="# Generated by wbfy",ut=`${lt} (head)\n\n\n${dt}\n`,mt=`\n${lt} (tail)\n`,ft={separator:dt,separatorPrefix:"# Generated by ",defaultHeadUserContent:ut,defaultTailUserContent:mt,async readGitignoreWithoutSeparators(t){try{let n=await e.promises.readFile(t,"utf8");const i=gt(n);return i>0&&(n=n.slice(0,i-1)),n.replaceAll(pt,"").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(pt,`${lt} (head)\n`):ut},getTailUserContent(e){const t=gt(e);return t>0?e.slice(t-1):mt},async isBerryZeroInstallEnabled(t){try{return(await e.promises.readFile(t,"utf8")).includes("\n!.yarn/cache")}catch{return!1}}};function gt(e){const t=e.indexOf(lt),n=e.lastIndexOf(lt);return n>t?n:-1}async function yt(n){return S.functionIgnoringException("generateDockerignore",async()=>{const i=t.resolve(n.dirPath,".dockerignore");if(n.doesContainDockerfile){const e=await $.readFileIgnoringError(i)??"",t=ft.getHeadUserContent(e)+"\n**/.idea\n**/*.sqlite3*\n**/.yarn/install-state.gz\n**/.venv\n"+ft.getTailUserContent(e);await P.run(()=>$.generateFile(i,t))}else await e.promises.rm(i,{force:!0})})}const ht={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(),oxlint:["astro","cjs","cts","js","jsx","mjs","mts","svelte","ts","tsx","vue"].toSorted(),oxfmt:["astro","cjs","css","cts","gql","graphql","hbs","htm","html","js","json","json5","jsonc","jsx","less","md","mdx","mjs","mts","scss","svelte","toml","ts","tsx","vue","yaml","yml"].toSorted(),prettierOnly:["java"].toSorted()},wt=`root = true\n\n[*]\ncharset = utf-8\nend_of_line = lf\ninsert_final_newline = true\ntrim_trailing_whitespace = true\n\n${vt(ht.codeWith2IndentSize)}\nindent_size = 2\nindent_style = space\n\n${vt(ht.codeWith4IndentSize)}\nindent_size = 4\nindent_style = space\n\n${vt(ht.markdownLike)}\nmax_line_length = off\ntrim_trailing_whitespace = false\n\n[{Makefile,*.mk}]\nindent_style = tab\n`;async function bt(e){return S.functionIgnoringException("generateEditorconfig",async()=>{const n=t.resolve(e.dirPath,".editorconfig");await P.run(()=>$.generateFile(n,wt))})}function vt(e){return e.length>1?`[*.{${e.join(",")}}]`:`[*.${e[0]}]`}const kt={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 xt(n,i){return S.functionIgnoringException("generateGeminiConfig",async()=>{if(!n.isRoot)return;const r=t.resolve(n.dirPath,".gemini"),s=t.resolve(r,"config.yml"),o=t.resolve(r,"styleguide.md"),a=t.resolve(n.dirPath,"AGENTS_EXTRA.md");let c=structuredClone(kt);try{const t=await e.promises.readFile(s,"utf8"),n=p.load(t);c=l.all([c,n,c],{arrayMerge:Je})}catch{}const d=p.dump(c,{lineWidth:-1,noCompatMode:!0,styles:{"!!null":"empty"}}),u=await $.readFileIgnoringError(a),m=u?.trimStart().startsWith("#")?void 0:u,f=`${n.isPublicRepo?"Review in English based on the following coding standards.":"以下のコーディング規約を踏まえて、日本語でレビューしてください。"}\n\n${st(i)}${m?`\n${m.trimEnd()}`:""}`,g=[P.run(()=>$.generateFile(s,d)),P.run(()=>$.generateFile(o,f))];await Promise.all(g)})}async function jt(n){return S.functionIgnoringException("generateGeminiSettings",async()=>{if(!n.isRoot)return;const i=t.resolve(n.dirPath,".gemini"),r=t.resolve(i,"settings.json");await e.promises.rm(r,{force:!0})})}const _t=`* text=auto\n\n*.lockb binary diff=lockb\n*.vcproj text eol=crlf\n\n${[...ht.codeWith2IndentSize,...ht.codeWith4IndentSize,...ht.markdownLike].map(e=>`*.${e} text eol=lf`).join("\n")}\n\ndist/** linguist-generated=true\n`;async function St(e){return S.functionIgnoringException("generateGitattributes",async()=>{const n=t.resolve(e.dirPath,".gitattributes");await P.run(()=>$.generateFile(n,_t))})}const $t=["windows","macos","linux","jetbrains","visualstudiocode","emacs","vim","yarn"];async function Pt(e,n){return S.functionIgnoringException("generateGitignore",async()=>{const i=t.resolve(e.dirPath,".gitignore"),r=await $.readFileIgnoringError(i)??"";let s=ft.getHeadUserContent(r)+"\n!.keep\n.aider*\n.env.production\n*/mount/*.hash\n.devcontainer/\n.idea/AugmentWebviewStateStore.xml\n.idea/copilot.*\n.idea/copilot/chatSessions/\n.playwright-cli/\n.serena/\n.tmp/\n__generated__/\n@willbooster/\ndist/\ntemp/\ntmp/\n";const o=ft.getTailUserContent(r),a=[...$t];e.doesContainGemfile&&a.push("ruby"),e.doesContainGoMod&&(a.push("go"),s+=`${t.basename(e.dirPath)}\n`),e.doesContainPackageJson&&a.push("node"),e.doesContainPomXml&&(a.push("maven"),s+=".idea/google-java-format.xml\n"),e.doesContainPubspecYaml&&(a.push("flutter","AndroidStudio","ruby"),s+=".flutter-plugins-dependencies\nandroid/key.properties\nios/.bundle\n.idea/runConfigurations.xml\n"),e.doesContainTemplateYaml&&(s+=".aws-sam/\npackaged.yaml\n"),(e.doesContainPoetryLock||e.doesContainUvLock)&&(a.push("python"),s+=".venv/\n"),e.depending.blitz&&(s+=".blitz/\n.blitz**\n"),e.depending.next&&a.push("nextjs"),(n.depending.firebase||e.depending.firebase)&&a.push("firebase"),e.depending.prisma&&(s+="*.sqlite3*\n"),e.depending.playwrightTest&&(s+="playwright-report/\ntest-results/\n"),(n.depending.reactNative||e.depending.reactNative)&&(a.push("reactnative"),s+="google-services.json\nandroid/app/src/main/assets/\n"),e.depending.storybook&&a.push("storybookjs"),e.depending.litestream&&(s+="gcp-sa-key.json\n");let c="";for(const e of a){let t=await Ct(e)??"";if(!t){const n=`https://www.toptal.com/developers/gitignore/api/${e}`,i=await fetch(n),r=await i.text();if(!i.ok||r.includes("Attention Required!")||r.includes("<title>"))return void console.error(`Failed to fetch ${n}`);t=r.trim(),await P.run(()=>Et(e,t)),_.isVerbose&&console.info(`Fetched ${n}`)}c&&(c+="\n"),c+=t+"\n"}await ft.isBerryZeroInstallEnabled(i)||(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=s+"\n"+c+o;await P.run(()=>$.generateFile(i,l))})}const Ot=t.join(u.homedir(),".cache","wbfy","gitignore");async function Et(n,i){await e.promises.mkdir(Ot,{recursive:!0}),await e.promises.writeFile(t.join(Ot,n),i)}async function Ct(n){try{const i=await e.promises.stat(t.join(Ot,n));if(Date.now()-i.mtimeMs>216e5)return;return await e.promises.readFile(t.join(Ot,n),"utf8")}catch{}}function At(e){return e.doesContainJavaScript||e.doesContainJavaScriptInPackages||e.doesContainTypeScript||e.doesContainTypeScriptInPackages}function Bt(e){return e.doesContainJava||e.doesContainJavaInPackages}async function Ft(n){return S.functionIgnoringException("generateIdeaSettings",async()=>{const i=t.resolve(n.dirPath,".idea");if(e.existsSync(i)){const r=t.resolve(i,"watcherTasks.xml");await(At(n)||Bt(n)?P.run(()=>$.generateFile(r,function(e){return`<?xml version="1.0" encoding="UTF-8"?>\n<project version="4">\n <component name="ProjectTasksOptions">\n${At(e)?ht.oxfmt.map(e=>It("node","node_modules/.bin/oxfmt --write --no-error-on-unmatched-pattern","Oxfmt",e)).join(""):""}\n${Bt(e)?ht.prettierOnly.map(e=>It("node","node_modules/.bin/prettier --cache --write","Prettier",e)).join(""):""}\n </component>\n</project>\n`}(n))):P.run(()=>e.promises.rm(r,{force:!0})))}})}function It(e,t,n,i){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="${i}" />\n <option name="immediateSync" value="false" />\n <option name="name" value="${n} (.${i})" />\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`}function Dt(e,t){if(e.depending.genI18nTs&&t?.["gen-i18n-ts"])return(e.isBun?"bun":"yarn")+" run gen-i18n-ts > /dev/null"}function Rt(e,t,n,i=0){Tt(e,t,n,i)}function Tt(e,t,n,i=0){do{const[r,s,o]=Lt(e,t,n),a=m.spawnSync(r,s,o).status??1;if(0===a)break;if(i<=0)return a}while(--i>=0);return 0}function Wt(e,t,n){const[i,r,s]=Lt(e,t,n);s.stdio="pipe";const o=m.spawnSync(i,r,s),a=o.stderr??"",c="string"==typeof a?a.trim():a.toString().trim();o.error?console.error(`${i} [${r.map(e=>`"${e}"`).join(", ")}] failed with: ${o.error.message}`):c&&console.error(`${i} [${r.map(e=>`"${e}"`).join(", ")}] outputs the following content to stderr:\n${c}`);const l=o.stdout??"";return"string"==typeof l?l.trim():l.toString().trim()}function Lt(e,t,n){const i={...process.env};return i.PATH&&i.BERRY_BIN_FOLDER&&(i.PATH=i.PATH.split(":").filter(e=>e!==i.BERRY_BIN_FOLDER).join(":")),[e,t,{cwd:n,env:i,encoding:"utf8",shell:!1,stdio:"inherit"}]}const Nt=new class{getOrgAndName(e){const t=e.split(":").at(-1),n=t?.split("/");return[n?.at(-2)??"",n?.at(-1)?.replace(/.git$/,"")??""]}},Jt=new Map;function Ut(e){const t=e??"",n=Jt.get(t);if(n)return n;const i=new f({auth:Gt(e)||void 0});return Jt.set(t,i),i}function Mt(e){return!!Gt(e)}function Gt(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 qt(e){return e.isWillBoosterConfigs&&!e.isRoot&&!0!==e.packageJson?.private&&Array.isArray(e.packageJson?.files)&&e.packageJson.files.length>0}const zt=["@willbooster/oxfmt-config","@willbooster/oxlint-config","oxfmt","oxlint","oxlint-tsgolint"],Ht="@typescript/native-preview",Yt="@willbooster/wb",Kt="build-ts",Vt=["@biomejs/biome","@eslint-react/eslint-plugin","@eslint/js","@next/eslint-plugin-next","@types/eslint","@types/micromatch","@typescript-eslint/eslint-plugin","@typescript-eslint/parser","@willbooster/biome-config","@willbooster/eslint-config","@willbooster/eslint-config-blitz-next","@willbooster/eslint-config-js","@willbooster/eslint-config-js-react","@willbooster/eslint-config-next","@willbooster/eslint-config-react","@willbooster/eslint-config-ts","@willbooster/eslint-config-ts-react","biome","eslint","eslint-config-flat-gitignore","eslint-config-prettier","eslint-import-resolver-node","eslint-import-resolver-typescript","eslint-plugin-import","eslint-plugin-import-x","eslint-plugin-perfectionist","eslint-plugin-prettier","eslint-plugin-react-compiler","eslint-plugin-sort-class-members","eslint-plugin-sort-destructure-keys","eslint-plugin-storybook","eslint-plugin-unicorn","eslint-plugin-unused-imports","globals","micromatch","typescript-eslint"],Xt=new Set(["micromatch","@types/micromatch"]),Zt=/\bfrom\s+['"]micromatch['"]|\brequire\(\s*['"]micromatch['"]\s*\)|\bimport\(\s*['"]micromatch['"]\s*\)/u,Qt=new Map;async function en(n,i,r){return S.functionIgnoringException("generatePackageJson",async()=>{await async function(n,i,r){const s=t.resolve(n.dirPath,"package.json"),a=await async function(t){const n=await e.promises.readFile(t,"utf8"),i=JSON.parse(n);return i.scripts=i.scripts??{},i.dependencies=i.dependencies??{},i.devDependencies=i.devDependencies??{},i.peerDependencies=i.peerDependencies??{},i}(s),c=n.isBun?"bun":"yarn";await async function(n,i){"WillBooster LLC"===i.author&&(i.author="WillBooster Inc.");delete i.scripts["sort-package-json"],delete i.scripts["sort-all-package-json"],delete i.scripts["typecheck/warn"],delete i.scripts["typecheck:gen-code"],delete i.scripts["typecheck:codegen"],delete i.dependencies.tslib,delete i.devDependencies["@willbooster/renovate-config"],delete i.devDependencies["@willbooster/tsconfig"],delete i.devDependencies.typescript,delete i.devDependencies.lerna,delete i.devDependencies.pinst,delete i.scripts["flutter-format"],delete i.scripts["format-flutter"],delete i.scripts["python-format"],delete i.scripts["format-python"],delete i.scripts.prettier,delete i.scripts["check-all"],await P.run(()=>e.promises.rm(t.resolve(n.dirPath,"lerna.json"),{force:!0})),function(n,i){const r=function(n){return n.isWillBoosterConfigs&&!n.isRoot||function(n){const i=o.globSync("src/**/*.{js,jsx,mjs,cjs,ts,tsx,mts,cts}",{cwd:n,dot:!0,ignore:J});return i.some(i=>{try{return Zt.test(e.readFileSync(t.resolve(n,i),"utf8"))}catch{return!1}})}(n.dirPath)}(i);for(const e of Vt)r&&Xt.has(e)||an(n,i,e)||(delete n.dependencies[e],delete n.devDependencies[e],delete n.peerDependencies[e])}(i,n)}(n,a),await async function(n,i,r){(function(e){for(const[t,n]of Object.entries(e))"string"==typeof n&&(n.includes("git clone")||(e[t]=n.replaceAll(/yarn\s*(?:install\s*)?&&\s*/gu,"")))})(i.scripts),i.scripts={...i.scripts,...dn(n,i.scripts)},function(e,t){if(!e.depending.playwrightTest||!e.depending.wb||t.scripts?.["start-test-server"])return;t.scripts??={},t.scripts["start-test-server"]="wb start --mode test"}(n,i),function(e,t){if(!("check-for-ai"in e))return;"gen-code"in e&&(e["check-for-ai"]=`${t} gen-code > /dev/null && ${e["check-for-ai"]}`);e["check-for-ai"]=`${t} install > /dev/null && ${e["check-for-ai"]}`}(i.scripts,r);const s=i.scripts;n.isBun||!Bt(n)?delete s.prettify:s.prettify=(s.prettify??"")+await async function(n){const i=t.resolve(n,".prettierignore"),r=await e.promises.readFile(i,"utf8").catch(()=>""),s=r.indexOf(ft.separatorPrefix);if(-1===s)return"";const o=r.slice(0,s);return`${o.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);!function(e){for(const[t,n]of Object.entries(e))n?.includes("yarn workspaces foreach")&&(e[t]=n.replaceAll(/yarn workspaces foreach(?!\s+(?:-A|-R|--(?:all|recursive|since|worktree|from|include|exclude|public|private)))/gu,"yarn workspaces foreach --all"))}(s)}(n,a,c),function(e){for(const t of[Yt,Kt])e.dependencies[t]&&(e.devDependencies[t]??=e.dependencies[t],delete e.dependencies[t])}(a);const p=function(n,i,r){const s=[],a=["sort-package-json"],c=[],p=Bt(n);!p||e.existsSync(t.join(i.dirPath,".prettierrc.json"))||e.existsSync(t.join(n.dirPath,".prettierrc.json"))||(r.prettier="@willbooster/prettier-config",a.push("prettier-plugin-java","@willbooster/prettier-config"));p?a.push("prettier"):function(e){delete e.prettier;const t=[e.dependencies,e.devDependencies,e.peerDependencies];for(const e of t)e&&(delete e.prettier,delete e["prettier-plugin-java"],delete e["@willbooster/prettier-config"],delete e["@types/prettier"])}(r);if(delete r.devDependencies["lint-staged"],delete r["lint-staged"],n.isRoot){if(delete r.devDependencies.husky,delete r.scripts.postinstall,delete r.scripts.postpublish,delete r.scripts.prepublishOnly,delete r.scripts.prepack,delete r.scripts.postpack,r.scripts.prepare="lefthook install || true",a.push("lefthook"),n.depending.semanticRelease&&(r.devDependencies["semantic-release"]||r.devDependencies["multi-semantic-release"]||r.devDependencies["@qiwi/multi-semantic-release"]||a.push("semantic-release"),r.version="0.0.0-semantically-released"),n.depending.playwrightTest){r.dependencies.artillery||r.devDependencies.artillery||r.dependencies["@playwright/test"]||a.push("@playwright/test"),delete r.dependencies.playwright,delete r.devDependencies.playwright}n.doesContainSubPackageJsons?r.workspaces=Array.isArray(r.workspaces)?l.all([r.workspaces,["packages/*"]],{arrayMerge:Ue}):["packages/*"]:Array.isArray(r.workspaces)&&(r.workspaces=r.workspaces.filter(e=>o.globSync(e,{dot:!0,cwd:n.dirPath,ignore:J}).length>0),0===r.workspaces.length&&delete r.workspaces)}if(n.depending.wb||n.isBun){a.push(Yt);for(const[e,t]of Object.entries(r.scripts))"string"==typeof t&&(r.scripts[e]=t.replaceAll(/wb\s+db/gu,"wb prisma"))}(r.dependencies[Kt]||r.devDependencies[Kt]||Object.values(r.scripts).some(e=>e?.includes(Kt)))&&a.push(Kt);At(n)&&a.push(...zt);At(n)&&a.push(...function(e){return e.isBun?["@tsconfig/bun"]:e.depending.reactNative?["@tsconfig/react-native"]:["@tsconfig/node-lts","@tsconfig/node-ts"]}(n));(n.doesContainTypeScript||n.doesContainTypeScriptInPackages)&&(a.push(Ht),n.isBun?a.push("@types/bun"):n.depending.reactNative||a.push("@types/node"),(r.dependencies.jest||r.devDependencies.jest||r.dependencies["@jest/globals"]||r.devDependencies["@jest/globals"]||r.dependencies["ts-jest"]||r.devDependencies["ts-jest"])&&a.push("@types/jest"));if(n.isWillBoosterConfigs)return{dependencies:s.filter(e=>!e.includes("@willbooster/")),devDependencies:a.filter(e=>!e.includes("@willbooster/")),pythonDevDependencies:c};return{dependencies:s,devDependencies:a,pythonDevDependencies:c}}(n,i,a);await async function(n,i,r,s){r.name||(r.name=t.basename(n.dirPath));n.doesContainSubPackageJsons&&(r.private=!0);r.license||(r.license="UNLICENSED");!r.private&&"UNLICENSED"!==r.license&&i.isPublicRepo&&(r.publishConfig??={},r.publishConfig.access??="public");const[a]=Nt.getOrgAndName(n.repository??"");"WillBooster"!==a&&"WillBoosterLab"!==a||(r.author="WillBooster Inc.");await async function(n,i){if(!qt(n))return;const r=t.resolve(n.dirPath,"config.mjs");if(!e.existsSync(r))return;i.type="module";const s=t.resolve(n.dirPath,"config.d.ts");if(!e.existsSync(s))return;i.files=[...new Set([...i.files??[],"config.d.mts"])],await P.run(()=>$.generateFile(t.resolve(n.dirPath,"config.d.mts"),tn))}(n,r),n.isRoot||!r.private||r.main||(r.main="./src");if(delete r.resolutions?.["npm/chalk"],!n.doesContainSubPackageJsons){if(!n.isBun)if(n.doesContainJavaScript||n.doesContainTypeScript)r.scripts["lint-fix"]=r.scripts["lint-fix"]??"yarn lint --fix";else{delete r.scripts.lint,delete r.scripts["lint-fix"];for(const e of["cleanup","check-for-ai"]){const t=r.scripts[e];t&&(r.scripts[e]=t.replace(/ ?&& ?yarn lint-fix(?: --quiet)?/,""))}}if(n.doesContainPubspecYaml){r.scripts.lint="flutter analyze",r.scripts["lint-fix"]="yarn lint";const i=["lib","test","test_driver"].filter(i=>e.existsSync(t.resolve(n.dirPath,i)));i.length>0&&(r.scripts["format-code"]=`dart format $(find ${i.join(" ")} -name generated -prune -o -name '*.freezed.dart' -prune -o -name '*.g.dart' -prune -o -name '*.dart' -print)`,r.scripts.format=(r.scripts.format??"")+" && yarn format-code")}const i=nn(n);if(i){"poetry install"===r.scripts.postinstall&&delete r.scripts.postinstall,r.scripts["common/ci-setup"]=`yarn setup-${i}`,delete r.scripts["setup-"+("poetry"===i?"uv":"poetry")],delete r.scripts["setup-poetry-asdf"],r.scripts[`setup-${i}`]="uv"===i?"uv sync --frozen":"poetry config virtualenvs.in-project true && poetry env use $(mise current python) && poetry run pip install --upgrade pip && poetry install";const e=await o.glob("**/*.py",{cwd:n.dirPath,dot:!0,ignore:J}),t=new Set;for(const n of e){const[e,i]=n.split("/");e&&i&&t.add(e)}if(t.size>0){const e=[...t].join(" "),n=`${i} run`;r.scripts["format-code"]=`${n} isort --profile black ${e} && ${n} black ${e}`,r.scripts.lint?r.scripts.lint=`${n} flake8 ${e} && ${r.scripts.lint}`:(r.scripts.lint=`${n} flake8 ${e}`,r.scripts["lint-fix"]="yarn lint"),r.scripts.format=(r.scripts.format??"")+" && yarn format-code",s.pythonDevDependencies.push("black","isort","flake8")}}}(n.repository||r.repository)&&(r.repository=function(e,t){const n=ln(e);if(n)return pn(n,e,t);const i=ln(t);if(i)return pn(i,t);return e}(n.repository??r.repository,r.repository));n.depending.blitz?r.scripts["gen-code"]?.startsWith("blitz codegen")?r.scripts["gen-code"].includes("blitz prisma generate")||(r.scripts["gen-code"]=r.scripts["gen-code"].replace("blitz codegen","blitz codegen && blitz prisma generate")):r.scripts["gen-code"]="blitz codegen":n.depending.prisma&&!r.scripts["gen-code"]?.startsWith("prisma generate")&&(r.scripts["gen-code"]="prisma generate");(function(e,t){const n=Dt(e,t.scripts);if(!n)return;const i=t.scripts.postinstall;i?i.includes(n)||(t.scripts.postinstall=`${i} && ${n}`):t.scripts.postinstall=n})(n,r),r.dependencies.prettier||delete r.devDependencies["@types/prettier"]}(n,i,a,p),function(e,t){const n=e.dependencies,i=e.devDependencies;t.dependencies=sn(n,t.dependencies),t.devDependencies=t.devDependencies.filter(e=>!n[e]),t.devDependencies=sn(i,t.devDependencies)}(a,p),await async function(e){const t=new Set([...Object.keys(e.dependencies),...Object.keys(e.devDependencies)]),n=[{packageName:"@willbooster/auth",repo:"auth",target:"dependencies"},{packageName:"@discord-bot/shared",repo:"discord-bot",target:"dependencies"},{packageName:"@willbooster/code-analyzer",repo:"code-analyzer",target:"devDependencies"},{packageName:"@willbooster/judge",repo:"judge",target:"dependencies"},{packageName:"@willbooster/llm-proxy",repo:"llm-proxy",target:"dependencies"}];await Promise.all(n.map(async({packageName:n,repo:i,target:r})=>{if(!t.has(n)||function(e,t){return(e.devDependencies?.[t]||e.dependencies?.[t]||"").includes("workspace")}(e,n))return;const s="dependencies"===r?"devDependencies":"dependencies";Reflect.deleteProperty(e[s],n),e[r][n]=await async function(e){const t=await function(e,t){try{const n=Wt("git",["ls-remote",`git@github.com:${e}/${t}.git`,"HEAD"],process.cwd()).split(/\s+/)[0];if(!n)throw new Error(`No commits found for ${e}/${t}`);return Promise.resolve(n)}catch(n){return Promise.reject(new Error(`Failed to fetch commits for ${e}/${t}: ${String(n)}`))}}("WillBoosterLab",e);return`git@github.com:WillBoosterLab/${e}.git#${t}`}(i)}))}(a),function(e){for(const t of["dependencies","devDependencies","peerDependencies"]){const n=e[t];n&&0===Object.keys(n).length&&Reflect.deleteProperty(e,t)}}(a),n.isBun&&delete a.packageManager;await $.generateFile(s,JSON.stringify(Te(a),void 0,2)),r||(!function(e,t,n,i){const r=n.dependencies.filter(e=>!t.devDependencies?.[e]);rn(e,i,r,!1);const s=n.devDependencies.filter(e=>!t.dependencies?.[e]);rn(e,i,s,!0);const o=nn(e);if(o&&n.pythonDevDependencies.length>0){const t=[...new Set(n.pythonDevDependencies)];"poetry"===o?Rt("poetry",["add","--group","dev",...t],e.dirPath):Rt("uv",["add","--dev",...t],e.dirPath)}}(n,a,p,c),await $.generateFile(s,Te(await e.promises.readFile(s,"utf8"))))}(n,i,r)})}const tn="export { default } from './config.js';\n";function nn(e){return e.doesContainUvLock?"uv":e.doesContainPoetryLock?"poetry":void 0}function rn(e,t,n,i){if(0===n.length)return;const r=[...new Set(n)];e.isBun?Rt(t,["add",...i?["-D"]:[],"--exact",...r],e.dirPath):Rt(t,["add",...i?["-D"]:[],...r],e.dirPath)}function sn(e,t){const n=[];for(const i of new Set(t)){const t=cn(i,e[i]);t&&n.push(i),e[i]&&!t&&"*"!==e[i]||(e[i]=on(i))}return n}function on(e){const t=Qt.get(e);if(t)return t;const n=Wt("npm",["show",e,"version","--workspaces=false"],process.cwd())||"*";return Qt.set(e,n),n}function an(e,t,n){return!!qt(t)&&(!!e.peerDependencies[n]||"@types/eslint"===n&&!!e.peerDependencies.eslint)}function cn(e,t){return!t||("*"===t||("@willbooster/wb"===e||e===Kt||"@willbooster/oxlint-config"===e||"oxlint"===e||e===Ht))}function ln(e){if("string"==typeof e){if(!e.startsWith("github:"))return;const[t,n]=Nt.getOrgAndName(e);if(!t||!n)return;return`git+https://github.com/${t}/${n}.git`}const t=e?.url;if("string"!=typeof t)return;const n=/^(?:git\+)?https:\/\/github\.com\/([^/]+)\/([^/]+?)(?:\.git)?$/u.exec(t);if(!n)return;const[,i,r]=n;return`git+https://github.com/${i}/${r}.git`}function pn(e,t,n){return{..."object"==typeof t?t:"object"==typeof n?n:void 0,type:"git",url:e}}function dn(e,t){if(e.isBun){const t={"check-all-for-ai":"bun run check-for-ai && bun run test","check-for-ai":"bun run cleanup",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 e.doesContainTypeScript||e.doesContainTypeScriptInPackages?e.depending.pyright&&(t.typecheck+=" && pyright"):delete t.typecheck,t}{const n=e.doesContainTypeScript||e.doesContainTypeScriptInPackages,i=At(e),r=Bt(e),s=t.test;let o={"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",cleanup:"yarn format && yarn lint-fix",format:un(i,r),lint:"oxlint --no-error-on-unmatched-pattern .","lint-fix":"yarn lint --fix","format-code":"oxfmt --write --no-error-on-unmatched-pattern .",typecheck:"tsgo --noEmit"};return r&&(o.prettify=`prettier --cache --color --no-error-on-unmatched-pattern --write "**/{.*/,}*.{${ht.prettierOnly.join(",")}}" "!**/test{-,/}fixtures/**"`),e.doesContainSubPackageJsons?(o=l({...o},{format:`${o.format} && 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",test:"CI=1 FORCE_COLOR=3 yarn workspaces foreach --all --verbose run test",typecheck:"yarn workspaces foreach --all --parallel --verbose run typecheck"}),r&&(o.prettify=`prettier --cache --color --no-error-on-unmatched-pattern --write "**/{.*/,}*.{${ht.prettierOnly.join(",")}}" "!**/packages/**" "!**/test{-,/}fixtures/**"`)):e.depending.pyright&&(o.typecheck=o.typecheck?`${o.typecheck} && `:"",o.typecheck+="pyright"),s?.includes("wb test")&&(o.test=s),i||(delete o["format-code"],delete o.lint,delete o["lint-fix"]),n?e.depending.wb&&(o.typecheck="wb typecheck"):delete o.typecheck,o}}function un(e,t){const n=["sort-package-json"];return e&&n.push("yarn format-code"),t&&n.push("yarn prettify"),n.join(" && ")}const mn={glob_matcher:"doublestar","post-merge":{jobs:[{name:"prepare",script:"prepare.sh",runner:"bash"}]},"pre-push":{jobs:[{name:"check",script:"check.sh",runner:"bash"}]}},fn={jobs:[{name:"cleanup",glob:"",run:"",stage_fixed:!0},{name:"check-migrations",glob:"**/migration.sql",run:'\nfailed=0\n# Lefthook expands {staged_files} as shell-escaped args, so paths with spaces stay intact.\nfor file in {staged_files}; do\n if grep -q \'Warnings:\' "$file"; then\n echo "Migration SQL file ($file) contains warnings! Please solve the warnings and commit again."\n failed=1\n fi\ndone\nexit "$failed"\n'.trim()}]},gn='\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 yn(n){return S.functionIgnoringException("generateLefthookUpdatingPackageJson",async()=>{await async function(n){const i=t.resolve(n.dirPath,".lefthook"),r=t.resolve(n.dirPath,".husky"),s=e.existsSync(r),{lint:o}=dn(n,{}),a={...mn,"pre-commit":{jobs:hn(n)}};o||delete a["pre-push"];await Promise.all([e.promises.writeFile(t.join(n.dirPath,"lefthook.yml"),p.dump(a,{lineWidth:-1,noCompatMode:!0,styles:{"!!null":"empty"}})),e.promises.rm(i,{force:!0,recursive:!0})]),s&&(await Promise.all([e.promises.rm(r,{force:!0,recursive:!0}),e.promises.rm(t.resolve(n.dirPath,".huskyrc.json"),{force:!0})]),Rt("git",["config","--unset","core.hooksPath"],n.dirPath));if(o){const r=function(e){let t;t=e.isBun?e.depending.wb?"bun --bun wb lint":"bun run lint":e.depending.wb?"yarn wb lint":"yarn run lint";const n=`${t} --quiet`;if(e.repository?.startsWith("github:WillBoosterLab/"))return`\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\n${n}\n`.trim();return n}(n);e.mkdirSync(t.join(i,"pre-push"),{recursive:!0}),await e.promises.writeFile(t.join(i,"pre-push","check.sh"),r+"\n",{mode:493})}const c=`${gn}\n\n${function(e){const t=[];if(e.hasVersionSettings){const e=String.raw`(mise\.toml|\.mise\.toml|\.tool-versions|\..+-version)`;t.push(String.raw`run_if_changed "${e}" "mise install"`)}const n=e.isBun?"bun install":"yarn",i=e.depending.blitz||e.depending.next?" && rm -Rf .next":"";t.push(String.raw`run_if_changed "package\.json" "${n}${i}"`),e.doesContainPoetryLock&&t.push(String.raw`run_if_changed "poetry\.lock" "poetry install"`);e.doesContainUvLock&&t.push(String.raw`run_if_changed "uv\.lock" "uv sync --frozen"`);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"`);const r=Dt(e,e.packageJson?.scripts);r&&t.push(String.raw`run_if_changed "(^|/)i18n/.*\.json$" "${r}"`);return t}(n).join("\n")}\n`;e.mkdirSync(t.join(i,"post-merge"),{recursive:!0}),await e.promises.writeFile(t.resolve(i,"post-merge","prepare.sh"),c,{mode:493})}(n)})}function hn(e){return fn.jobs.map(t=>"cleanup"===t.name?{...t,glob:wn(e),run:bn(e)}:t)}function wn(e){const t=e.isBun||e.depending.wb||Bt(e)?[...ht.prettierOnly]:[];At(e)&&t.push(...ht.oxfmt,...ht.oxlint),(e.doesContainPoetryLock||e.doesContainUvLock)&&t.push("py"),e.doesContainPubspecYaml&&t.push("dart");return`**/*.{${[...new Set(t)].toSorted().join(",")}}`}function bn(n){if(function(n){if(!n.isRoot)return!1;const i=t.resolve(n.dirPath,"packages","wb","package.json");if(!e.existsSync(i))return!1;try{return"@willbooster/wb"===JSON.parse(e.readFileSync(i,"utf8")).name}catch{return!1}}(n))return String.raw`
|
|
1
|
+
import e from"node:fs";import t from"node:path";import n from"yargs";import i from"typescript";import{PromisePool as r}from"minimal-promise-pool";import s from"node:fs/promises";import o from"fast-glob";import a from"semver/functions/compare.js";import c from"semver/ranges/min-version.js";import l from"deepmerge";import p from"js-yaml";import{parse as d}from"smol-toml";import u from"node:os";import m from"node:child_process";import{Octokit as f}from"@octokit/core";import g from"semver";import{createRequire as y}from"node:module";import h from"dotenv";import{distance as w}from"fastest-levenshtein";import{simpleGit as b}from"simple-git";import{z as v}from"zod";async function k(e){return new Promise(t=>setTimeout(t,e))}async function x(e){try{return await e()}catch{}}async function j(e){try{return await e()}catch(e){if("object"==typeof e&&e&&"code"in e&&"ENOENT"===e.code)return;throw e}}const _=new class{isVerbose=!1;doesUploadEnvVars=!1};const S=new class{async functionIgnoringException(e,t){_.isVerbose&&console.info(`--------- ${e} start ---------`);try{await t()}catch(t){console.info(`Error occurred in ${e}: ${t instanceof Error?t.stack:String(t)}}`)}_.isVerbose&&console.info(`---------- ${e} end ----------`)}},$={async readFileIgnoringError(t){try{return await e.promises.readFile(t,"utf8")}catch{}},async generateFile(n,i){await e.promises.mkdir(t.dirname(n),{recursive:!0});let r=i.trim();r&&(r+="\n"),await e.promises.writeFile(n,r)}},P=new r;async function O(n){return S.functionIgnoringException("fixNextConfigJson",async()=>{const r=["js","mjs","cjs"].map(e=>t.resolve(n.dirPath,`next.config.${e}`)).find(t=>e.existsSync(t));if(!r)return;const s=await e.promises.readFile(r,"utf8"),o=function(e){const t=i.createSourceFile("next.config.js",e,i.ScriptTarget.Latest,!0,i.ScriptKind.JS);let n;const r=e=>{n||(i.isExportAssignment(e)&&i.isObjectLiteralExpression(e.expression)?n=e.expression:i.isBinaryExpression(e)&&e.operatorToken.kind===i.SyntaxKind.EqualsToken&&"module.exports"===e.left.getText(t)&&i.isObjectLiteralExpression(e.right)?n=e.right:i.forEachChild(e,r))};return r(t),n}(s);if(!o)return;const a=[];if(new Set(o.properties.map(e=>e.name?.getText())).has("typescript")||a.push("typescript: { ignoreBuildErrors: true }"),0===a.length)return;const c=o.getEnd()-1,l=o.properties.at(-1),p=!!l&&s.slice(l.getEnd(),c).includes(","),d=o.properties.length>0&&!p?", ":"",u=`${s.slice(0,c)}${d}${a.join(", ")}${s.slice(c)}`;await P.run(()=>$.generateFile(r,u))})}const E=e=>({kind:"literal",value:e}),C=(e,t=[])=>({kind:"object",value:B(e,t)}),A=B({forbidOnly:E("!!process.env.CI"),retries:E("process.env.PWDEBUG ? 0 : process.env.CI ? 5 : 1"),use:C({baseURL:E("process.env.NEXT_PUBLIC_BASE_URL"),trace:E("process.env.CI ? 'on-first-retry' : 'retain-on-failure'"),screenshot:E("process.env.CI ? 'only-on-failure' : 'only-on-failure'"),video:E("process.env.CI ? 'retain-on-failure' : 'retain-on-failure'")}),webServer:C({command:E("'yarn start-test-server'"),url:E("process.env.NEXT_PUBLIC_BASE_URL"),reuseExistingServer:E("!!process.env.CI"),timeout:E("300_000"),stdout:E("'pipe'"),stderr:E("'pipe'"),env:E("{\n ...process.env,\n PRISMA_USER_CONSENT_FOR_DANGEROUS_AI_ACTION: 'true',\n}"),gracefulShutdown:E("{\n signal: 'SIGTERM',\n timeout: 500,\n}")})});function B(e,t=[]){return{extraMembers:t,memberOrder:[...Object.keys(e).map(e=>({kind:"property",key:e})),...t.map((e,t)=>({kind:"extra",index:t}))],properties:e}}async function F(n){const r=t.resolve(n.dirPath,"playwright.config.ts");if(e.existsSync(r))return S.functionIgnoringException("fixPlaywrightConfig",async()=>{await async function(n){for(const i of function(n){const i=[".env",".env.test",".env.example","mise.toml","mise.test.toml"],r=[];for(let s=t.resolve(n);r.push(...i.map(e=>t.resolve(s,e))),!e.existsSync(t.resolve(s,".git"));s=t.dirname(s)){if(t.dirname(s)===s)break}return r}(n))try{const t=await e.promises.readFile(i,"utf8");if(/NEXT_PUBLIC_BASE_URL\s*=/m.test(t))return}catch{}throw new Error("NEXT_PUBLIC_BASE_URL is required for Playwright. Define NEXT_PUBLIC_BASE_URL in the target repo.")}(n.dirPath);const s=await e.promises.readFile(r,"utf8"),o=function(e){const t=i.createSourceFile("playwright.config.ts",e,i.ScriptTarget.Latest,!0,i.ScriptKind.TS);let n;const r=e=>{if(!n){if(i.isCallExpression(e)&&"defineConfig"===e.expression.getText(t)){const t=e.arguments[0];if(t&&i.isObjectLiteralExpression(t))return void(n=t)}i.forEachChild(e,r)}};return r(t),n?{source:t,node:n}:void 0}(s);if(!o)return;const a=T(o.node,o.source);if(!a)return;const c=I(A,a),l=Boolean(n.packageJson?.scripts?.["start-test-server"]),p=Boolean(a.properties.webServer);l||p||delete c.properties.webServer,function(e,t){const n=t.properties.webServer;if("object"!==n?.kind)return;n.value.properties.command=E(e.isBun?"'bun start-test-server'":"'yarn start-test-server'")}(n,c);const d=W({kind:"object",value:c},0),u=o.node.getStart(o.source),m=o.node.getEnd(),f=`${s.slice(0,u)}${d}${s.slice(m)}`;await P.run(()=>$.generateFile(r,f))})}function I(e,t){const n=new Set(Object.keys(t.properties)),i=[...e.extraMembers,...t.extraMembers],r=[...e.memberOrder.filter(e=>"property"!==e.kind||!n.has(e.key)),...t.memberOrder.map(t=>"property"===t.kind?t:{kind:"extra",index:e.extraMembers.length+t.index})],s={...e.properties};for(const[e,n]of Object.entries(t.properties))s[e]=D(s[e],n);return{extraMembers:i,memberOrder:r,properties:s}}function D(e,t){return"object"===e?.kind&&"object"===t.kind?{kind:"object",value:I(e.value,t.value)}:t}function R(e,t){if(i.isObjectLiteralExpression(e)){const n=T(e,t);return n?{kind:"object",value:n}:E(e.getText(t))}if(i.isArrayLiteralExpression(e)){const n=e.elements.map(e=>R(e,t));return n.some(e=>void 0===e)?E(e.getText(t)):{kind:"array",value:n}}return E(e.getText(t))}function T(e,t){const n={extraMembers:[],memberOrder:[],properties:{}};for(const r of e.properties){if(i.isShorthandPropertyAssignment(r)){const e=r.name.getText(t);n.properties[e]=E(e),n.memberOrder.push({kind:"property",key:e});continue}if(!i.isPropertyAssignment(r)||!i.isIdentifier(r.name)&&!i.isStringLiteral(r.name)){const e=n.extraMembers.push(r.getText(t))-1;n.memberOrder.push({kind:"extra",index:e});continue}const e=R(r.initializer,t);if(void 0===e)return;const s=r.name.getText(t);n.properties[s]=e,n.memberOrder.push({kind:"property",key:s})}return n}function W(e,t){const n=" ".repeat(t);if("array"===e.kind){if(0===e.value.length)return"[]";const i=" ".repeat(t+1);return`[\n${e.value.map(e=>{const n=W(e,t+1).split("\n");if(n[n.length-1]=`${n.at(-1)},`,"literal"===e.kind)for(let e=1;e<n.length;e+=1)n[e]=`${i}${n[e]}`;return n[0]=`${i}${n[0]}`,n.join("\n")}).join("\n")}\n${n}]`}if("literal"===e.kind)return e.value;const i=" ".repeat(t+1),r=new Set,s=function(e){const t=new Map;for(const[n,i]of e.entries())"property"===i.kind&&t.set(i.key,n);return t}(e.value.memberOrder),o=e.value.memberOrder.flatMap((n,o)=>{if("extra"===n.kind)return[N(e.value.extraMembers[n.index]??"",i)];if(s.get(n.key)!==o)return[];const a=e.value.properties[n.key];return!a||r.has(n.key)?[]:(r.add(n.key),[L(n.key,a,t,i)])});return o.push(...Object.entries(e.value.properties).filter(([e])=>!r.has(e)).map(([e,n])=>L(e,n,t,i))),0===o.length?`{\n${n}}`:`{\n${o.join("\n")}\n${n}}`}function L(e,t,n,i){const r=W(t,n+1).split("\n");if(r[r.length-1]=`${r.at(-1)},`,"literal"===t.kind)for(let e=1;e<r.length;e+=1)r[e]=`${i}${r[e]}`;return r[0]=`${i}${e}: ${r[0]}`,r.join("\n")}function N(e,t){const n=e.split("\n");n[n.length-1]=`${n.at(-1)},`;for(const[e,i]of n.entries())n[e]=`${t}${i}`;return n.join("\n")}const J=["**/node_modules/**","**/.venv/**","**/test-fixtures/**","**/test/fixtures/**","**/dist/**","**/build/**","**/target/**","**/temp/**","**/tmp/**"];async function U(e){return S.functionIgnoringException("fixPrismaEnvFiles",async()=>{const n=await o.glob(["*.env","*.env.*"],{dot:!0,cwd:e.dirPath,ignore:J});for(const i of n){const n=t.resolve(e.dirPath,i),r=(await s.readFile(n,"utf8")).replaceAll(/DATABASE_URL\s*=\s*"?([^"#\n]+?\.sqlite3[^"#\n]*)"?/g,(e,t)=>{if(t.includes("connection_limit=1"))return e;const n=t.includes("?")?"&":"?";return`DATABASE_URL="${t}${n}connection_limit=1"`});await s.writeFile(n,r)}})}const M=(e,t)=>Object.prototype.hasOwnProperty.call(e,t);function G(e,t){let n,i,r;"function"==typeof t?i=t:n=t;const s={},o=[...n??[],...Object.keys(e).sort(i)];for(r of o)M(e,r)&&(s[r]=e[r]);return s}const q=/^(?:( )+|\t+)/,z="space";function H(e,t,n){return e&&t===z&&1===n}function Y(e,t){const n=new Map;let i,r,s=0;for(const o of e.split(/\n/g)){if(!o)continue;const e=o.match(q);if(null===e)s=0,i="";else{const o=e[0].length,a=e[1]?z:"tab";if(H(t,a,o))continue;a!==i&&(s=0),i=a;let c=1,l=0;const p=o-s;if(s=o,0===p)c=0,l=1;else{const e=Math.abs(p);if(H(t,a,e))continue;r=K(a,e)}const d=n.get(r);n.set(r,void 0===d?[1,0]:[d[0]+c,d[1]+l])}}return n}function K(e,t){return(e===z?"s":"t")+String(t)}function V(e){if("string"!=typeof e)throw new TypeError("Expected a string");let t=Y(e,!0);0===t.size&&(t=Y(e,!1));const n=function(e){let t,n=0,i=0;for(const[r,[s,o]]of e)(s>n||s===n&&o>i)&&(n=s,i=o,t=r);return t}(t);let i,r=0,s="";var o;return void 0!==n&&(({type:i,amount:r}={type:"s"===(o=n)[0]?z:"tab",amount:Number(o.slice(1))}),s=function(e,t){return(e===z?" ":"\t").repeat(t)}(i,r)),{amount:r,type:i,indent:s}}function X(e){return"string"==typeof e&&function(e){if("string"!=typeof e)throw new TypeError("Expected a string");const t=e.match(/(?:\r?\n)/g)||[];if(0===t.length)return;const n=t.filter(e=>"\r\n"===e).length;return n>t.length-n?"\r\n":"\n"}(e)||"\n"}const Z=e=>(t,...n)=>e.reduce((e,t)=>t(e,...n),t),Q=e=>t=>Array.isArray(t)?e(t):t,ee=e=>t=>Array.isArray(t)&&t.every(e=>"string"==typeof e)?e(t):t,te=ee(e=>[...new Set(e)]),ne=ee(e=>e.toSorted()),ie=Z([te,ne]),re=e=>(t,...n)=>function(e){if("object"!=typeof e||null===e)return!1;const t=Object.getPrototypeOf(e);return!(null!==t&&t!==Object.prototype&&null!==Object.getPrototypeOf(t)||Symbol.toStringTag in e||Symbol.iterator in e)}(t)?e(t,...n):t,se=(e,t)=>{const n=re(i=>(t&&(i=Object.fromEntries(Object.entries(i).map(([e,t])=>[e,n(t)]))),G(i,e)));return n},oe=Object.groupBy||((e,t)=>{const n=Object.create(null);for(const i of e){const e=t(i);n[e]?n[e].push(i):n[e]=[i]}return n}),ae=se(),ce=se(["type","url"]),le=se(["name","email","url"]),pe=se(["lib","bin","man","doc","example","test"]),de=(e,t)=>re((n,...i)=>Object.hasOwn(n,e)?{...n,[e]:t(n[e],...i)}:n),ue=se(["applypatch-msg","pre-applypatch","post-applypatch","pre-commit","pre-merge-commit","prepare-commit-msg","commit-msg","post-commit","pre-rebase","post-checkout","post-merge","pre-push","pre-receive","update","proc-receive","post-receive","post-update","reference-transaction","push-to-checkout","pre-auto-gc","post-rewrite","sendemail-validate","fsmonitor-watchman","p4-changelist","p4-prepare-changelist","p4-post-changelist","p4-pre-submit","post-index-change"]),me=e=>{const[t]=e.split(">"),n=[...t.matchAll("@")];if(!n.length||1===n.length&&0===n[0].index)return{name:e};const i=n.pop().index;return{name:t.substring(0,i),range:t.substring(i+1)}},fe=se((e,t)=>{const{name:n,range:i}=me(e),{name:r,range:s}=me(t);return n!==r?n.localeCompare(r,"en"):i?s?a(c(i),c(s)):1:-1}),ge=e=>{const t=e.indexOf("@",e.startsWith("@")?1:0);return-1===t?e:e.slice(0,t)},ye=new Map;function he(t){return"string"==typeof t.packageManager?t.packageManager.startsWith("npm@"):t.devEngines?.packageManager?.name?"npm"===t.devEngines.packageManager.name:!t.pnpm&&(!!t.engines?.npm||!(()=>{const t=process.cwd();return ye.has(t)||ye.set(t,e.existsSync("yarn.lock")||e.existsSync(".yarn/")||e.existsSync(".yarnrc.yml")||e.existsSync("pnpm-lock.yaml")||e.existsSync("pnpm-workspace.yaml")),ye.get(t)})())}const we=re((e,t)=>Object.keys(e).length<2?e:he(t)?G(e,(e,t)=>e.localeCompare(t,"en")):G(e)),be=Z([se(["packages","catalog"]),de("packages",ie),de("catalog",we)]),ve=Z([se(["files","excludedFiles","env","parser","parserOptions","settings","plugins","extends","rules","overrides","globals","processor","noInlineConfig","reportUnusedDisableDirectives"]),de("env",ae),de("globals",ae),de("overrides",Q(e=>e.map(ve))),de("parserOptions",ae),de("rules",se((e,t)=>e.split("/").length-t.split("/").length||e.localeCompare(t))),de("settings",ae)]),ke=se(["description","url","href"]),xe=Z([re(e=>G(e,[...Object.keys(e).filter(e=>"overrides"!==e).sort(),"overrides"])),de("overrides",Q(e=>e.map(Z([ae,de("options",ae)]))))]),je=se(["node","npm","yarn"]),_e=de("packageManager",se(["name","version","onFail"])),Se=Z([se(["peerDependencyRules","neverBuiltDependencies","onlyBuiltDependencies","onlyBuiltDependenciesFile","allowedDeprecatedVersions","allowNonAppliedPatches","updateConfig","auditConfig","requiredScripts","supportedArchitectures","overrides","patchedDependencies","packageExtensions"],!0),de("overrides",fe)]),$e=new Set(["install","pack","prepare","publish","restart","shrinkwrap","start","stop","test","uninstall","version"]),Pe=(e,t)=>Object.hasOwn(t,"devDependencies")&&Object.hasOwn(t.devDependencies,e),Oe=/(?<=^|[\s&;<>|(])(?:run-s|npm-run-all2? .*(?:--sequential|--serial|-s))(?=$|[\s&;<>|)])/,Ee=e=>{if(!Pe("npm-run-all",e)&&!Pe("npm-run-all2",e))return!1;return["scripts","betterScripts"].flatMap(t=>e[t]?Object.values(e[t]):[]).some(e=>{return(t=e).includes("*")&&Oe.test(t);var t})};function Ce(e,t=""){const n=new Map;for(const i of e){const e=(t?i.slice(t.length+1):i).indexOf(":");if(e>0){const r=i.slice(0,(t?t.length+1:0)+e);n.has(r)||n.set(r,[]),n.get(r).push(i)}else n.has(i)||n.set(i,[]),n.get(i).push(i)}return Array.from(n.keys()).sort().flatMap(e=>{const t=n.get(e);if(t.length>1&&t.some(t=>t!==e&&t.startsWith(e+":"))){return[...t.filter(t=>t===e||!t.startsWith(e+":")).sort(),...Ce(t.filter(t=>t.startsWith(e+":")),e)]}return t.sort()})}const Ae=re((e,t)=>{let n=Object.keys(e);const i=new Set;return n=n.map(e=>{const t=e.replace(/^(?:pre|post)/,"");return $e.has(t)||n.includes(t)?(i.add(t),t):e}),Ee(t)||(n=Ce(n)),n=n.flatMap(e=>i.has(e)?[`pre${e}`,e,`post${e}`]:[e]),G(e,n)}),Be=e=>{const{defaultConditions:t=[],restConditions:n=[]}=oe(e,e=>"default"===e?"defaultConditions":"restConditions");return[...n,...t]},Fe=re(e=>{const{paths:t=[],conditions:n=[]}=oe(Object.keys(e),e=>e.startsWith(".")?"paths":"conditions");return Object.fromEntries([...t,...Be(n)].map(t=>[t,Fe(e[t])]))}),Ie=[{key:"$schema"},{key:"name"},{key:"displayName"},{key:"version"},{key:"stableVersion"},{key:"private"},{key:"description"},{key:"categories",over:te},{key:"keywords",over:te},{key:"homepage"},{key:"bugs",over:se(["url","email"])},{key:"repository",over:ce},{key:"funding",over:ce},{key:"license",over:ce},{key:"qna"},{key:"author",over:le},{key:"maintainers",over:Q(e=>e.map(le))},{key:"contributors",over:Q(e=>e.map(le))},{key:"publisher"},{key:"sideEffects"},{key:"type"},{key:"imports"},{key:"exports",over:Fe},{key:"main"},{key:"svelte"},{key:"umd:main"},{key:"jsdelivr"},{key:"unpkg"},{key:"module"},{key:"source"},{key:"jsnext:main"},{key:"browser"},{key:"react-native"},{key:"types"},{key:"typesVersions"},{key:"typings"},{key:"style"},{key:"example"},{key:"examplestyle"},{key:"assets"},{key:"bin",over:ae},{key:"man"},{key:"directories",over:pe},{key:"files",over:te},{key:"workspaces",over:be},{key:"binary",over:se(["module_name","module_path","remote_path","package_name","host"])},{key:"scripts",over:Ae},{key:"betterScripts",over:Ae},{key:"l10n"},{key:"contributes",over:ae},{key:"activationEvents",over:te},{key:"husky",over:de("hooks",ue)},{key:"simple-git-hooks",over:ue},{key:"pre-commit"},{key:"commitlint",over:ae},{key:"lint-staged"},{key:"nano-staged"},{key:"config",over:ae},{key:"nodemonConfig",over:ae},{key:"browserify",over:ae},{key:"babel",over:ae},{key:"browserslist"},{key:"xo",over:ae},{key:"prettier",over:xe},{key:"eslintConfig",over:ve},{key:"eslintIgnore"},{key:"npmpkgjsonlint",over:ae},{key:"npmPackageJsonLintConfig",over:ae},{key:"npmpackagejsonlint",over:ae},{key:"release",over:ae},{key:"remarkConfig",over:ae},{key:"stylelint"},{key:"ava",over:ae},{key:"jest",over:ae},{key:"jest-junit",over:ae},{key:"jest-stare",over:ae},{key:"mocha",over:ae},{key:"nyc",over:ae},{key:"c8",over:ae},{key:"tap",over:ae},{key:"oclif",over:se(void 0,!0)},{key:"resolutions",over:ae},{key:"overrides",over:we},{key:"dependencies",over:we},{key:"devDependencies",over:we},{key:"dependenciesMeta",over:se((e,t)=>{const n=ge(e),i=ge(t);return n<i?-1:n>i?1:0},!0)},{key:"peerDependencies",over:we},{key:"peerDependenciesMeta",over:se(void 0,!0)},{key:"optionalDependencies",over:we},{key:"bundledDependencies",over:ie},{key:"bundleDependencies",over:ie},{key:"extensionPack",over:ie},{key:"extensionDependencies",over:ie},{key:"flat"},{key:"packageManager"},{key:"engines",over:ae},{key:"engineStrict",over:ae},{key:"devEngines",over:_e},{key:"volta",over:je},{key:"languageName"},{key:"os"},{key:"cpu"},{key:"preferGlobal",over:ae},{key:"publishConfig",over:ae},{key:"icon"},{key:"badges",over:Q(e=>e.map(ke))},{key:"galleryBanner",over:ae},{key:"preview"},{key:"markdown"},{key:"pnpm",over:Se}],De=Ie.map(({key:e})=>e),Re=Z(Ie.map(({key:e,over:t})=>t?de(e,t):void 0).filter(Boolean));function Te(e,t={}){return function(e,t){if("string"==typeof e){const{indent:n,type:i}=V(e),r="\n"===e.slice(-1)?"\n":"",s=X(e);e=JSON.parse(e);let o=JSON.stringify(t(e),null,"tab"===i?"\t":n)+r;return"\r\n"===s&&(o=o.replace(/\n/g,s)),o}return t(e)}(e,re(e=>{let n=t.sortOrder||De;if(Array.isArray(n)){const t=Object.keys(e),{privateKeys:i=[],publicKeys:r=[]}=oe(t,e=>"_"===e[0]?"privateKeys":"publicKeys");n=[...n,...De,...r.sort(),...i.sort()]}return Re(G(e,n),e)}))}async function We(n){return S.functionIgnoringException("fixTestDirectoriesUpdatingPackageJson",async()=>{await Promise.all(n.map(async n=>{const i=t.join(n,"package.json");if(!e.existsSync(i))return;const r=t.join(n,"test");for(const s of["__tests__","tests"]){const o=t.join(n,s);try{await Le(o,r);const t=JSON.parse(await e.promises.readFile(i,"utf8"));let n=!1;const a=t.scripts??{};for(const[e,t]of Object.entries(a)){const i=t.replaceAll(s,"test");t!==i&&(a[e]=i,n=!0)}if(t.scripts=a,!n)return;await $.generateFile(i,JSON.stringify(Te(t),void 0,2))}catch{}}}))})}async function Le(n,i){if(!e.existsSync(i))return void await e.promises.rename(n,i);const r=await e.promises.readdir(n,{withFileTypes:!0});await Promise.all(r.map(async r=>{const s=t.join(n,r.name),o=t.join(i,r.name),a=e.existsSync(o)?await e.promises.stat(o):void 0;r.isDirectory()&&a?.isDirectory()?await Le(s,o):await e.promises.rename(s,o)})),await e.promises.rm(n,{recursive:!0})}async function Ne(e,n){return S.functionIgnoringException("fixTypeDefinitions",async()=>{const i=t.resolve(e.dirPath,"@types"),r=e.isRoot&&e.doesContainSubPackageJsons?void 0:t.resolve(e.dirPath,"src","types"),o=await j(()=>s.readdir(i,{withFileTypes:!0}));if(o)for(const e of o){const o=e.name.slice(0,-5),a=e.name.endsWith(".d.ts");let c=a?o:e.name;c.includes("__")&&(c=`@${c.replace("__","/")}`);const l=n.some(e=>e.packageJson?.dependencies?.[c]||e.packageJson?.devDependencies?.[c]);e.isFile()&&a?l?(await s.mkdir(t.join(i,o),{recursive:!0}),await P.run(()=>s.rename(t.join(i,e.name),t.join(i,o,"index.d.ts")))):r&&(await s.mkdir(r,{recursive:!0}),await P.run(()=>s.rename(t.join(i,e.name),t.join(r,e.name)))):e.isDirectory()&&r&&!l&&(await s.mkdir(r,{recursive:!0}),await P.run(()=>j(()=>s.rename(t.join(i,e.name,"index.d.ts"),t.join(r,`${e.name}.d.ts`)))))}})}function Je(e,t){return t}function Ue(e,t,n){const i=[...e];for(const[r,s]of t.entries())void 0===i[r]?i[r]=Me(s,n):Ge(e[r],n)&&Ge(s,n)?i[r]=l(e[r],s,n):e.includes(s)||i.push(s);return i}function Me(e,t){return Ge(e,t)?t.cloneUnlessOtherwiseSpecified(e,t):e}function Ge(e,t){return!!e&&"object"==typeof e&&t.isMergeableObject(e)}function qe(e){const t=Object.entries(e).toSorted(([e],[t])=>e.localeCompare(t));for(const[n,i]of t)delete e[n],e[n]=i,i&&"object"==typeof i&&!Array.isArray(i)&&qe(i);return e}const ze={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"}}},He={name:"Fix code automatically",on:{pull_request:null},concurrency:{group:"${{ github.workflow }}-${{ github.ref }}","cancel-in-progress":!0},jobs:{autofix:{uses:"WillBooster/reusable-workflows/.github/workflows/autofix.yml@main"}}},Ye={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 Ke(n){return S.functionIgnoringException("generateWorkflow",async()=>{if(Ve(n.repository))return;const i=t.resolve(n.dirPath,".github","workflows");await e.promises.mkdir(i,{recursive:!0});const r=t.resolve(n.dirPath,".github","semantic.yml");await P.run(()=>e.promises.rm(r,{force:!0,recursive:!0}));const s=await e.promises.readdir(i,{withFileTypes:!0}),o=new Set(["test.yml","autofix.yml","semantic-pr.yml","close-comment.yml","gen-pr-claude.yml","gen-pr-codex.yml","gen-pr-gemini.yml",...s.filter(e=>e.isFile()&&e.name.endsWith(".yml")).map(e=>e.name)]);n.depending.semanticRelease&&o.add("release.yml");for(const e of o){const r=t.basename(e,".yml");await P.run(()=>Xe(n,i,r))}})}function Ve(e){return e?.endsWith("/reusable-workflows")??!1}async function Xe(n,i,r){const s=t.join(i,`${r}.yml`),o=e.existsSync(t.join(i,"deploy-production.yml"));if("autofix"===r)return void await Qe(function(e){if(!e.isPublicRepo)return structuredClone(He);const t=e.isBun?"bun":"yarn",n=[{uses:"actions/checkout@v6"},{uses:"actions/setup-node@v6",with:{"check-latest":!0,"node-version":"lts/*"}},...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 i=structuredClone(ze),r=i.jobs.autofix??{"runs-on":"ubuntu-latest"};return i.jobs.autofix={...r,steps:n},i}(n),s);let a=structuredClone(r in Ye?Ye[r]:{});try{const t=await e.promises.readFile(s,"utf8"),n=p.load(t);a=l.all([a,n,a],{arrayMerge:Ue})}catch{}if(!("jobs"in a))return;r.startsWith("deploy")&&(a={...a,concurrency:{group:"${{ github.workflow }}","cancel-in-progress":!1}},function(e,t){const n=e[t];delete e[t],e[t]=n}(a,"jobs"),a.on?.push&&(a.on.push["paths-ignore"]=[...new Set(["**.md","**/docs/**",...a.on.push["paths-ignore"]??[]])])),"release"===r&&a.jobs.release&&o&&(a.permissions??={},a.permissions.actions="write",a.jobs.release.with??={},a.jobs.release.with.trigger_deploy_workflow="deploy-production.yml");let c=!1;for(const e of Object.values(a.jobs))e.uses?.includes("/reusable-workflows/")&&(Ze(n,e,r),c=!0);if(c){switch(r){case"release":if(a.on?.schedule)delete a.on.push;else{if(!(a.on?.push&&n.release.branches.length>0))return void await e.promises.rm(t.join(i,"release.yml"),{force:!0});a.on.push.branches=n.release.branches}n.isPublicRepo?(a.permissions??={},a.permissions["id-token"]="write"):delete a.permissions?.["id-token"];break;case"test":a.on?.pull_request&&delete a.on.pull_request["paths-ignore"],a.on?.push&&(delete a.on.push["paths-ignore"],a.on.push.branches=a.on.push.branches.filter(e=>"renovate/**"!==e))}if(await Qe(a,s),"sync"===r){if(await e.promises.rm(t.join(i,"sync-init.yml"),{force:!0}),!a.jobs.sync?.with)return;a.jobs["sync-force"]=a.jobs.sync;const n=a.jobs.sync.with.sync_params_without_dest;if("string"!=typeof n)return;a.jobs.sync.with.sync_params_without_dest=`--force ${n}`,a.name="Force to Sync",a.on={workflow_dispatch:null},delete a.jobs.sync,await Qe(a,t.join(i,"sync-force.yml"))}}}function Ze(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,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?qe(t.with):delete t.with,Object.keys(t.secrets).length>0){const e=qe(t.secrets);delete t.secrets,t.secrets=e}else delete t.secrets}async function Qe(t,n){const i=p.dump(t,{lineWidth:-1,noCompatMode:!0,styles:{"!!null":"empty"}}).replaceAll(/[ \t]+$/gm,"");await e.promises.writeFile(n,i)}async function et(n){return S.functionIgnoringException("fixTypos",async()=>{if(Ve(n.repository))return;const i=n.dirPath,r=await o.glob("**/*.md",{dot:!0,cwd:i,ignore:J});_.isVerbose&&console.info(`Found ${r.length} markdown files in ${i}`);for(const s of r){const r=t.join(i,s);P.run(async()=>{const t=await e.promises.readFile(r,"utf8");let i=tt(t);i=nt(i,n,"doc"),t!==i&&await $.generateFile(r,i)})}const s=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:i,ignore:J});_.isVerbose&&console.info(`Found ${s.length} TypeScript files in ${i}`);for(const r of s){const s=t.join(i,r);P.run(async()=>{const t=await e.promises.readFile(s,"utf8");let i=t.replaceAll(/\/\*[\s\S]*?\*\//g,e=>tt(e)).replaceAll(/(^|\s)\/\/(.*?)c\.f\./g,"$1//$2cf.").replaceAll(/(^|\s)\/\/(.*?)eg\./g,"$1//$2e.g.").replaceAll(/(^|\s)\/\/(.*?)ie\./g,"$1//$2i.e.");i=nt(i,n,"ts"),t!==i&&await $.generateFile(s,i)})}const a=await o.glob("**/*.{csv,htm,html,tsv,xml,yaml,yml}",{dot:!0,cwd:i,ignore:J});_.isVerbose&&console.info(`Found ${a.length} text-based files in ${i}`);for(const r of a){const s=t.join(i,r);P.run(async()=>{const t=await e.promises.readFile(s,"utf8");let i=tt(t);i=nt(i,n,"text"),t!==i&&await $.generateFile(s,i)})}await P.promiseAll()})}function tt(e){return e.replaceAll(/\bc\.f\.(?=\s|$)/g,"cf.").replaceAll(/\beg\.(?=\s|$)/g,"e.g.").replaceAll(/\bie\.(?=\s)/g,"i.e.")}function nt(e,t,n){for(const[n,i]of Object.entries(t.wbfyJson?.typos?.all??{}))e=e.replaceAll(n,i);for(const[i,r]of Object.entries(t.wbfyJson?.typos?.[n]??{}))e=e.replaceAll(i,r);return e}async function it(e,n){return S.functionIgnoringException("generateAgentInstructions",async()=>{if(!e.isRoot)return;const i=t.resolve(e.dirPath,"AGENTS_EXTRA.md"),r=await $.readFileIgnoringError(i);for(const[i,s]of[["AGENTS.md","Codex CLI"],["CLAUDE.md","Claude Code"],["GEMINI.md","Gemini CLI"]]){const o=rt(e,n,s,r),a=t.resolve(e.dirPath,i);await P.run(()=>$.generateFile(a,o))}const s=t.resolve(e.dirPath,".cursor/rules/general.mdc"),o=function(e,t,n){const i="---\ndescription: General Coding Rules\nglobs:\nalwaysApply: true\n---",r=rt(e,t,"Cursor",n);return`${i}\n\n${r}`}(e,n,r);await P.run(()=>$.generateFile(s,o))})}function rt(e,t,n,i){const r=e.isBun?"bun":"yarn",s=`\n## Project Information\n\n- Name: \`${e.packageJson?.name||"unknown"}\`\n- Description: ${e.packageJson?.description}\n- Package Manager: ${r}\n\n## General Instructions\n\n- Create a new branch if the current branch is \`main\`.\n- Run any \`git\` commands sequentially.\n- Write tests ONLY if explicitly requested. If requested, follow these rules:\n - Continue modifying the tests and code until all tests pass.\n - Ensure tests reset any related persistent data, as our test infrastructure does not clear it automatically.\n - Prefer actual API calls over mocks. Use mocks when actual calls are impractical, have unintended side effects, or are explicitly requested.\n - Always investigate the root cause of a test failure before fixing it.\n - Avoid adding wait functions in E2E tests unless you are confident they are necessary.\n- When fixing issues, follow these rules:\n - Investigate the root cause first (e.g., by gathering debug logs, taking screenshots, etc.).\n - Fix the actual root cause instead of applying workarounds.\n- After making code changes, run \`${r} check-all-for-ai\` to execute all tests (takes up to 1 hour), or \`${r} check-for-ai\` for only type checking and linting (takes up to 10 minutes).\n - If you are confident that your changes will not break any tests, you may use \`check-for-ai\`.\n - Use \`oxlint\` ignore comments with reasons (e.g., \`// oxlint-disable-next-line <rule> -- <reason>\`) if lint errors or warnings cannot be fixed.\n- Once you have verified your changes, commit and push them to the current (non-main) branch, then create a PR via \`gh\`.\n - Follow the conventional commits; your commit message should start with \`feat:\`, \`fix:\`, etc.\n - If not specified, 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- Always use heredoc syntax when passing multi-line content to any command.\n${t.some(e=>e.hasStartTestServer)?`- Use \`${r} run start-test-server\` to launch a web server for debugging or testing.`:""}\n\n${st(t)}\n`.replaceAll(/\.\n\n+-/g,".\n-").replaceAll(/\n{3,}/g,"\n\n").trim(),o=i?.trim().startsWith("#");return s+(i?o?"\n\n"+i.trim():"\n"+i:"")}function st(e){return`\n## Coding Style\n\n- Use camelCase for JavaScript and TypeScript files (or PascalCase for React components).\n- Simplify code as much as possible to eliminate redundancy.\n- Design each module with high cohesion, grouping related functionality together.\n - Refactor existing large modules into smaller, focused modules when necessary.\n - Create well-organized directory structures with low coupling and high cohesion.\n- Place calling functions in the file above the functions they call to maintain a clear top-down order.\n - e.g. \`function caller() { callee(); } function callee() { ... }\`\n- Write comments that explain "why" rather than "what". Avoid stating what can be understood from the code itself.\n- Prefer \`undefined\` over \`null\` unless explicitly required by APIs or libraries.\n- Prefer using a single template literal for prompts instead of \`join()\` with an array of strings.\n${e.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${e.some(e=>e.depending.react||e.depending.next)?"- Prefer `useImmer` for storing an array or an object to `useState`.":""}\n${e.some(e=>e.depending.next)?"\n- Since this project uses the React Compiler, you do not need to use `useCallback` or `useMemo` for performance optimization.\n- Assume there is only a single server instance.\n":""}\n`.replaceAll(/\.\n\n+-/g,".\n-").replaceAll(/\n{3,}/g,"\n\n").trim()}const ot=["@exercode/problem-utils","@willbooster/agent-skills","@willbooster/babel-configs","@willbooster/monaco-loader","@willbooster/monaco-react","@willbooster/oxfmt-config","@willbooster/oxlint-config","@willbooster/prettier-config","@willbooster/renovate-config","@willbooster/shared-lib","@willbooster/shared-lib-blitz-next","@willbooster/shared-lib-next","@willbooster/shared-lib-node","@willbooster/shared-lib-react","@willbooster/wb","agent-runtime-kit","at-decorators","build-ts","gen-i18n-ts","one-way-git-sync","@typescript/native-preview","@typescript/native-preview-darwin-arm64","@typescript/native-preview-darwin-x64","@typescript/native-preview-linux-arm","@typescript/native-preview-linux-arm64","@typescript/native-preview-linux-x64","@typescript/native-preview-win32-arm64","@typescript/native-preview-win32-x64","oxfmt","@oxfmt/binding-android-arm-eabi","@oxfmt/binding-android-arm64","@oxfmt/binding-darwin-arm64","@oxfmt/binding-darwin-x64","@oxfmt/binding-freebsd-x64","@oxfmt/binding-linux-arm-gnueabihf","@oxfmt/binding-linux-arm-musleabihf","@oxfmt/binding-linux-arm64-gnu","@oxfmt/binding-linux-arm64-musl","@oxfmt/binding-linux-ppc64-gnu","@oxfmt/binding-linux-riscv64-gnu","@oxfmt/binding-linux-riscv64-musl","@oxfmt/binding-linux-s390x-gnu","@oxfmt/binding-linux-x64-gnu","@oxfmt/binding-linux-x64-musl","@oxfmt/binding-openharmony-arm64","@oxfmt/binding-win32-arm64-msvc","@oxfmt/binding-win32-ia32-msvc","@oxfmt/binding-win32-x64-msvc","oxlint","@oxlint/binding-android-arm-eabi","@oxlint/binding-android-arm64","@oxlint/binding-darwin-arm64","@oxlint/binding-darwin-x64","@oxlint/binding-freebsd-x64","@oxlint/binding-linux-arm-gnueabihf","@oxlint/binding-linux-arm-musleabihf","@oxlint/binding-linux-arm64-gnu","@oxlint/binding-linux-arm64-musl","@oxlint/binding-linux-ppc64-gnu","@oxlint/binding-linux-riscv64-gnu","@oxlint/binding-linux-riscv64-musl","@oxlint/binding-linux-s390x-gnu","@oxlint/binding-linux-x64-gnu","@oxlint/binding-linux-x64-musl","@oxlint/binding-openharmony-arm64","@oxlint/binding-win32-arm64-msvc","@oxlint/binding-win32-ia32-msvc","@oxlint/binding-win32-x64-msvc","oxlint-tsgolint","@oxlint-tsgolint/darwin-arm64","@oxlint-tsgolint/darwin-x64","@oxlint-tsgolint/linux-arm64","@oxlint-tsgolint/linux-x64","@oxlint-tsgolint/win32-arm64","@oxlint-tsgolint/win32-x64","@next/env","@next/font","@next/rspack-binding-linux-arm64-gnu","@next/rspack-binding-linux-arm64-musl","@next/rspack-binding-linux-x64-gnu","@next/rspack-binding-linux-x64-musl","@next/swc-android-arm-eabi","@next/swc-android-arm64","@next/swc-darwin-arm64","@next/swc-darwin-x64","@next/swc-freebsd-x64","@next/swc-linux-arm-gnueabihf","@next/swc-linux-arm64-gnu","@next/swc-linux-arm64-musl","@next/swc-linux-x64-gnu","@next/swc-linux-x64-musl","@next/swc-wasm-nodejs","@next/swc-wasm-web","@next/third-parties","next","react","react-dom"];async function at(n){return S.functionIgnoringException("generateBunfigToml",async()=>{const i=t.resolve(n.dirPath,"bunfig.toml"),r=e.existsSync(i)?e.readFileSync(i,"utf8"):void 0,s=ct(r);await P.run(()=>$.generateFile(i,s))})}const ct=e=>{const t=function(e){if(!e)return;try{return d(e)}catch{return}}(e);return`env = false\ntelemetry = false\n\n${function(e){return"boolean"==typeof e?.run?.bun?`[run]\nbun = ${e.run.bun}\n`:""}(t)}\n[install]\nexact = ${!1===t?.install?.exact?"false":"true"}\nlinker = "hoisted"\nminimumReleaseAge = 432000 # 5 days\nminimumReleaseAgeExcludes = [\n${ot.map(e=>` "${e}",`).join("\n")}\n]\n`};const lt="# Project-specific settings",pt=/# Project-specific settings[^\n]*\n/gm,dt="# Generated by wbfy",ut=`${lt} (head)\n\n\n${dt}\n`,mt=`\n${lt} (tail)\n`,ft={separator:dt,separatorPrefix:"# Generated by ",defaultHeadUserContent:ut,defaultTailUserContent:mt,async readGitignoreWithoutSeparators(t){try{let n=await e.promises.readFile(t,"utf8");const i=gt(n);return i>0&&(n=n.slice(0,i-1)),n.replaceAll(pt,"").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(pt,`${lt} (head)\n`):ut},getTailUserContent(e){const t=gt(e);return t>0?e.slice(t-1):mt},async isBerryZeroInstallEnabled(t){try{return(await e.promises.readFile(t,"utf8")).includes("\n!.yarn/cache")}catch{return!1}}};function gt(e){const t=e.indexOf(lt),n=e.lastIndexOf(lt);return n>t?n:-1}async function yt(n){return S.functionIgnoringException("generateDockerignore",async()=>{const i=t.resolve(n.dirPath,".dockerignore");if(n.doesContainDockerfile){const e=await $.readFileIgnoringError(i)??"",t=ft.getHeadUserContent(e)+"\n**/.idea\n**/*.sqlite3*\n**/.yarn/install-state.gz\n**/.venv\n"+ft.getTailUserContent(e);await P.run(()=>$.generateFile(i,t))}else await e.promises.rm(i,{force:!0})})}const ht={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(),oxlint:["astro","cjs","cts","js","jsx","mjs","mts","svelte","ts","tsx","vue"].toSorted(),oxfmt:["astro","cjs","css","cts","gql","graphql","hbs","htm","html","js","json","json5","jsonc","jsx","less","md","mdx","mjs","mts","scss","svelte","toml","ts","tsx","vue","yaml","yml"].toSorted(),prettierOnly:["java"].toSorted()},wt=`root = true\n\n[*]\ncharset = utf-8\nend_of_line = lf\ninsert_final_newline = true\ntrim_trailing_whitespace = true\n\n${vt(ht.codeWith2IndentSize)}\nindent_size = 2\nindent_style = space\n\n${vt(ht.codeWith4IndentSize)}\nindent_size = 4\nindent_style = space\n\n${vt(ht.markdownLike)}\nmax_line_length = off\ntrim_trailing_whitespace = false\n\n[{Makefile,*.mk}]\nindent_style = tab\n`;async function bt(e){return S.functionIgnoringException("generateEditorconfig",async()=>{const n=t.resolve(e.dirPath,".editorconfig");await P.run(()=>$.generateFile(n,wt))})}function vt(e){return e.length>1?`[*.{${e.join(",")}}]`:`[*.${e[0]}]`}const kt={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 xt(n,i){return S.functionIgnoringException("generateGeminiConfig",async()=>{if(!n.isRoot)return;const r=t.resolve(n.dirPath,".gemini"),s=t.resolve(r,"config.yml"),o=t.resolve(r,"styleguide.md"),a=t.resolve(n.dirPath,"AGENTS_EXTRA.md");let c=structuredClone(kt);try{const t=await e.promises.readFile(s,"utf8"),n=p.load(t);c=l.all([c,n,c],{arrayMerge:Je})}catch{}const d=p.dump(c,{lineWidth:-1,noCompatMode:!0,styles:{"!!null":"empty"}}),u=await $.readFileIgnoringError(a),m=u?.trimStart().startsWith("#")?void 0:u,f=`${n.isPublicRepo?"Review in English based on the following coding standards.":"以下のコーディング規約を踏まえて、日本語でレビューしてください。"}\n\n${st(i)}${m?`\n${m.trimEnd()}`:""}`,g=[P.run(()=>$.generateFile(s,d)),P.run(()=>$.generateFile(o,f))];await Promise.all(g)})}async function jt(n){return S.functionIgnoringException("generateGeminiSettings",async()=>{if(!n.isRoot)return;const i=t.resolve(n.dirPath,".gemini"),r=t.resolve(i,"settings.json");await e.promises.rm(r,{force:!0})})}const _t=`* text=auto\n\n*.lockb binary diff=lockb\n*.vcproj text eol=crlf\n\n${[...ht.codeWith2IndentSize,...ht.codeWith4IndentSize,...ht.markdownLike].map(e=>`*.${e} text eol=lf`).join("\n")}\n\ndist/** linguist-generated=true\n`;async function St(e){return S.functionIgnoringException("generateGitattributes",async()=>{const n=t.resolve(e.dirPath,".gitattributes");await P.run(()=>$.generateFile(n,_t))})}const $t=["windows","macos","linux","jetbrains","visualstudiocode","emacs","vim","yarn"];async function Pt(e,n){return S.functionIgnoringException("generateGitignore",async()=>{const i=t.resolve(e.dirPath,".gitignore"),r=await $.readFileIgnoringError(i)??"";let s=ft.getHeadUserContent(r)+"\n!.keep\n.aider*\n.env.production\n*/mount/*.hash\n.devcontainer/\n.idea/AugmentWebviewStateStore.xml\n.idea/copilot.*\n.idea/copilot/chatSessions/\n.playwright-cli/\n.serena/\n.tmp/\n__generated__/\n@willbooster/\ndist/\ntemp/\ntmp/\n";const o=ft.getTailUserContent(r),a=[...$t];e.doesContainGemfile&&a.push("ruby"),e.doesContainGoMod&&(a.push("go"),s+=`${t.basename(e.dirPath)}\n`),e.doesContainPackageJson&&a.push("node"),e.doesContainPomXml&&(a.push("maven"),s+=".idea/google-java-format.xml\n"),e.doesContainPubspecYaml&&(a.push("flutter","AndroidStudio","ruby"),s+=".flutter-plugins-dependencies\nandroid/key.properties\nios/.bundle\n.idea/runConfigurations.xml\n"),e.doesContainTemplateYaml&&(s+=".aws-sam/\npackaged.yaml\n"),(e.doesContainPoetryLock||e.doesContainUvLock)&&(a.push("python"),s+=".venv/\n"),e.depending.blitz&&(s+=".blitz/\n.blitz**\n"),e.depending.next&&a.push("nextjs"),(n.depending.firebase||e.depending.firebase)&&a.push("firebase"),e.depending.prisma&&(s+="*.sqlite3*\n"),e.depending.playwrightTest&&(s+="playwright-report/\ntest-results/\n"),(n.depending.reactNative||e.depending.reactNative)&&(a.push("reactnative"),s+="google-services.json\nandroid/app/src/main/assets/\n"),e.depending.storybook&&a.push("storybookjs"),e.depending.litestream&&(s+="gcp-sa-key.json\n");let c="";for(const e of a){let t=await Ct(e)??"";if(!t){const n=`https://www.toptal.com/developers/gitignore/api/${e}`,i=await fetch(n),r=await i.text();if(!i.ok||r.includes("Attention Required!")||r.includes("<title>"))return void console.error(`Failed to fetch ${n}`);t=r.trim(),await P.run(()=>Et(e,t)),_.isVerbose&&console.info(`Fetched ${n}`)}c&&(c+="\n"),c+=t+"\n"}await ft.isBerryZeroInstallEnabled(i)||(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=s+"\n"+c+o;await P.run(()=>$.generateFile(i,l))})}const Ot=t.join(u.homedir(),".cache","wbfy","gitignore");async function Et(n,i){await e.promises.mkdir(Ot,{recursive:!0}),await e.promises.writeFile(t.join(Ot,n),i)}async function Ct(n){try{const i=await e.promises.stat(t.join(Ot,n));if(Date.now()-i.mtimeMs>216e5)return;return await e.promises.readFile(t.join(Ot,n),"utf8")}catch{}}function At(e){return e.doesContainJavaScript||e.doesContainJavaScriptInPackages||e.doesContainTypeScript||e.doesContainTypeScriptInPackages}function Bt(e){return e.doesContainJava||e.doesContainJavaInPackages}async function Ft(n){return S.functionIgnoringException("generateIdeaSettings",async()=>{const i=t.resolve(n.dirPath,".idea");if(e.existsSync(i)){const r=t.resolve(i,"watcherTasks.xml");await(At(n)||Bt(n)?P.run(()=>$.generateFile(r,function(e){return`<?xml version="1.0" encoding="UTF-8"?>\n<project version="4">\n <component name="ProjectTasksOptions">\n${At(e)?ht.oxfmt.map(e=>It("node","node_modules/.bin/oxfmt --write --no-error-on-unmatched-pattern","Oxfmt",e)).join(""):""}\n${Bt(e)?ht.prettierOnly.map(e=>It("node","node_modules/.bin/prettier --cache --write","Prettier",e)).join(""):""}\n </component>\n</project>\n`}(n))):P.run(()=>e.promises.rm(r,{force:!0})))}})}function It(e,t,n,i){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="${i}" />\n <option name="immediateSync" value="false" />\n <option name="name" value="${n} (.${i})" />\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`}function Dt(e,t){if(e.depending.genI18nTs&&t?.["gen-i18n-ts"])return(e.isBun?"bun":"yarn")+" run gen-i18n-ts > /dev/null"}function Rt(e,t,n,i=0){Tt(e,t,n,i)}function Tt(e,t,n,i=0){do{const[r,s,o]=Lt(e,t,n),a=m.spawnSync(r,s,o).status??1;if(0===a)break;if(i<=0)return a}while(--i>=0);return 0}function Wt(e,t,n){const[i,r,s]=Lt(e,t,n);s.stdio="pipe";const o=m.spawnSync(i,r,s),a=o.stderr??"",c="string"==typeof a?a.trim():a.toString().trim();o.error?console.error(`${i} [${r.map(e=>`"${e}"`).join(", ")}] failed with: ${o.error.message}`):c&&console.error(`${i} [${r.map(e=>`"${e}"`).join(", ")}] outputs the following content to stderr:\n${c}`);const l=o.stdout??"";return"string"==typeof l?l.trim():l.toString().trim()}function Lt(e,t,n){const i={...process.env};return i.PATH&&i.BERRY_BIN_FOLDER&&(i.PATH=i.PATH.split(":").filter(e=>e!==i.BERRY_BIN_FOLDER).join(":")),[e,t,{cwd:n,env:i,encoding:"utf8",shell:!1,stdio:"inherit"}]}const Nt=new class{getOrgAndName(e){const t=e.split(":").at(-1),n=t?.split("/");return[n?.at(-2)??"",n?.at(-1)?.replace(/.git$/,"")??""]}},Jt=new Map;function Ut(e){const t=e??"",n=Jt.get(t);if(n)return n;const i=new f({auth:Gt(e)||void 0});return Jt.set(t,i),i}function Mt(e){return!!Gt(e)}function Gt(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 qt(e){return e.isWillBoosterConfigs&&!e.isRoot&&!0!==e.packageJson?.private&&Array.isArray(e.packageJson?.files)&&e.packageJson.files.length>0}const zt=["@willbooster/oxfmt-config","@willbooster/oxlint-config","oxfmt","oxlint","oxlint-tsgolint"],Ht="@typescript/native-preview",Yt="@willbooster/wb",Kt="build-ts",Vt=["@biomejs/biome","@eslint-react/eslint-plugin","@eslint/js","@next/eslint-plugin-next","@types/eslint","@types/micromatch","@typescript-eslint/eslint-plugin","@typescript-eslint/parser","@willbooster/biome-config","@willbooster/eslint-config","@willbooster/eslint-config-blitz-next","@willbooster/eslint-config-js","@willbooster/eslint-config-js-react","@willbooster/eslint-config-next","@willbooster/eslint-config-react","@willbooster/eslint-config-ts","@willbooster/eslint-config-ts-react","biome","eslint","eslint-config-flat-gitignore","eslint-config-prettier","eslint-import-resolver-node","eslint-import-resolver-typescript","eslint-plugin-import","eslint-plugin-import-x","eslint-plugin-perfectionist","eslint-plugin-prettier","eslint-plugin-react-compiler","eslint-plugin-sort-class-members","eslint-plugin-sort-destructure-keys","eslint-plugin-storybook","eslint-plugin-unicorn","eslint-plugin-unused-imports","globals","micromatch","typescript-eslint"],Xt=new Set(["micromatch","@types/micromatch"]),Zt=/\bfrom\s+['"]micromatch['"]|\brequire\(\s*['"]micromatch['"]\s*\)|\bimport\(\s*['"]micromatch['"]\s*\)/u,Qt=new Map;async function en(n,i,r){return S.functionIgnoringException("generatePackageJson",async()=>{await async function(n,i,r){const s=t.resolve(n.dirPath,"package.json"),a=await async function(t){const n=await e.promises.readFile(t,"utf8"),i=JSON.parse(n);return i.scripts=i.scripts??{},i.dependencies=i.dependencies??{},i.devDependencies=i.devDependencies??{},i.peerDependencies=i.peerDependencies??{},i}(s),c=n.isBun?"bun":"yarn";await async function(n,i){"WillBooster LLC"===i.author&&(i.author="WillBooster Inc.");delete i.scripts["sort-package-json"],delete i.scripts["sort-all-package-json"],delete i.scripts["typecheck/warn"],delete i.scripts["typecheck:gen-code"],delete i.scripts["typecheck:codegen"],delete i.dependencies.tslib,delete i.devDependencies["@willbooster/renovate-config"],delete i.devDependencies["@willbooster/tsconfig"],delete i.devDependencies.typescript,delete i.devDependencies.lerna,delete i.devDependencies.pinst,delete i.scripts["flutter-format"],delete i.scripts["format-flutter"],delete i.scripts["python-format"],delete i.scripts["format-python"],delete i.scripts.prettier,delete i.scripts["check-all"],await P.run(()=>e.promises.rm(t.resolve(n.dirPath,"lerna.json"),{force:!0})),function(n,i){const r=function(n){return n.isWillBoosterConfigs&&!n.isRoot||function(n){const i=o.globSync("src/**/*.{js,jsx,mjs,cjs,ts,tsx,mts,cts}",{cwd:n,dot:!0,ignore:J});return i.some(i=>{try{return Zt.test(e.readFileSync(t.resolve(n,i),"utf8"))}catch{return!1}})}(n.dirPath)}(i);for(const e of Vt)r&&Xt.has(e)||an(n,i,e)||(delete n.dependencies[e],delete n.devDependencies[e],delete n.peerDependencies[e])}(i,n)}(n,a),await async function(n,i,r){(function(e){for(const[t,n]of Object.entries(e))"string"==typeof n&&(n.includes("git clone")||(e[t]=n.replaceAll(/yarn\s*(?:install\s*)?&&\s*/gu,"")))})(i.scripts),i.scripts={...i.scripts,...dn(n,i.scripts)},function(e,t){if(!e.depending.playwrightTest||!e.depending.wb||t.scripts?.["start-test-server"])return;t.scripts??={},t.scripts["start-test-server"]="wb start --mode test"}(n,i),function(e,t){if(!("check-for-ai"in e))return;"gen-code"in e&&(e["check-for-ai"]=`${t} gen-code > /dev/null && ${e["check-for-ai"]}`);e["check-for-ai"]=`${t} install > /dev/null && ${e["check-for-ai"]}`}(i.scripts,r);const s=i.scripts;n.isBun||!Bt(n)?delete s.prettify:s.prettify=(s.prettify??"")+await async function(n){const i=t.resolve(n,".prettierignore"),r=await e.promises.readFile(i,"utf8").catch(()=>""),s=r.indexOf(ft.separatorPrefix);if(-1===s)return"";const o=r.slice(0,s);return`${o.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);!function(e){for(const[t,n]of Object.entries(e))n?.includes("yarn workspaces foreach")&&(e[t]=n.replaceAll(/yarn workspaces foreach(?!\s+(?:-A|-R|--(?:all|recursive|since|worktree|from|include|exclude|public|private)))/gu,"yarn workspaces foreach --all"))}(s)}(n,a,c),function(e){for(const t of[Yt,Kt])e.dependencies[t]&&(e.devDependencies[t]??=e.dependencies[t],delete e.dependencies[t])}(a);const p=function(n,i,r){const s=[],a=["sort-package-json"],c=[],p=Bt(n);!p||e.existsSync(t.join(i.dirPath,".prettierrc.json"))||e.existsSync(t.join(n.dirPath,".prettierrc.json"))||(r.prettier="@willbooster/prettier-config",a.push("prettier-plugin-java","@willbooster/prettier-config"));p?a.push("prettier"):function(e){delete e.prettier;const t=[e.dependencies,e.devDependencies,e.peerDependencies];for(const e of t)e&&(delete e.prettier,delete e["prettier-plugin-java"],delete e["@willbooster/prettier-config"],delete e["@types/prettier"])}(r);if(delete r.devDependencies["lint-staged"],delete r["lint-staged"],n.isRoot){if(delete r.devDependencies.husky,delete r.scripts.postinstall,delete r.scripts.postpublish,delete r.scripts.prepublishOnly,delete r.scripts.prepack,delete r.scripts.postpack,r.scripts.prepare="lefthook install || true",a.push("lefthook"),n.depending.semanticRelease&&(r.devDependencies["semantic-release"]||r.devDependencies["multi-semantic-release"]||r.devDependencies["@qiwi/multi-semantic-release"]||a.push("semantic-release"),r.version="0.0.0-semantically-released"),n.depending.playwrightTest){r.dependencies.artillery||r.devDependencies.artillery||r.dependencies["@playwright/test"]||a.push("@playwright/test"),delete r.dependencies.playwright,delete r.devDependencies.playwright}n.doesContainSubPackageJsons?r.workspaces=Array.isArray(r.workspaces)?l.all([r.workspaces,["packages/*"]],{arrayMerge:Ue}):["packages/*"]:Array.isArray(r.workspaces)&&(r.workspaces=r.workspaces.filter(e=>o.globSync(e,{dot:!0,cwd:n.dirPath,ignore:J}).length>0),0===r.workspaces.length&&delete r.workspaces)}if(n.depending.wb||n.isBun){a.push(Yt);for(const[e,t]of Object.entries(r.scripts))"string"==typeof t&&(r.scripts[e]=t.replaceAll(/wb\s+db/gu,"wb prisma"))}(r.dependencies[Kt]||r.devDependencies[Kt]||Object.values(r.scripts).some(e=>e?.includes(Kt)))&&a.push(Kt);At(n)&&a.push(...zt);At(n)&&a.push(...function(e){return e.isBun?["@tsconfig/bun"]:e.depending.reactNative?["@tsconfig/react-native"]:["@tsconfig/node-lts","@tsconfig/node-ts"]}(n));(n.doesContainTypeScript||n.doesContainTypeScriptInPackages)&&(a.push(Ht),n.isBun?a.push("@types/bun"):n.depending.reactNative||a.push("@types/node"),(r.dependencies.jest||r.devDependencies.jest||r.dependencies["@jest/globals"]||r.devDependencies["@jest/globals"]||r.dependencies["ts-jest"]||r.devDependencies["ts-jest"])&&a.push("@types/jest"));if(n.isWillBoosterConfigs)return{dependencies:s.filter(e=>!e.includes("@willbooster/")),devDependencies:a.filter(e=>!e.includes("@willbooster/")),pythonDevDependencies:c};return{dependencies:s,devDependencies:a,pythonDevDependencies:c}}(n,i,a);await async function(n,i,r,s){r.name||(r.name=t.basename(n.dirPath));n.doesContainSubPackageJsons&&(r.private=!0);r.license||(r.license="UNLICENSED");!r.private&&"UNLICENSED"!==r.license&&i.isPublicRepo&&(r.publishConfig??={},r.publishConfig.access??="public");const[a]=Nt.getOrgAndName(n.repository??"");"WillBooster"!==a&&"WillBoosterLab"!==a||(r.author="WillBooster Inc.");await async function(n,i){if(!qt(n))return;const r=t.resolve(n.dirPath,"config.mjs");if(!e.existsSync(r))return;i.type="module";const s=t.resolve(n.dirPath,"config.d.ts");if(!e.existsSync(s))return;i.files=[...new Set([...i.files??[],"config.d.mts"])],await P.run(()=>$.generateFile(t.resolve(n.dirPath,"config.d.mts"),tn))}(n,r),n.isRoot||!r.private||r.main||(r.main="./src");if(delete r.resolutions?.["npm/chalk"],!n.doesContainSubPackageJsons){if(!n.isBun)if(n.doesContainJavaScript||n.doesContainTypeScript)r.scripts["lint-fix"]=r.scripts["lint-fix"]??"yarn lint --fix";else{delete r.scripts.lint,delete r.scripts["lint-fix"];for(const e of["cleanup","check-for-ai"]){const t=r.scripts[e];t&&(r.scripts[e]=t.replace(/ ?&& ?yarn lint-fix(?: --quiet)?/,""))}}if(n.doesContainPubspecYaml){r.scripts.lint="flutter analyze",r.scripts["lint-fix"]="yarn lint";const i=["lib","test","test_driver"].filter(i=>e.existsSync(t.resolve(n.dirPath,i)));i.length>0&&(r.scripts["format-code"]=`dart format $(find ${i.join(" ")} -name generated -prune -o -name '*.freezed.dart' -prune -o -name '*.g.dart' -prune -o -name '*.dart' -print)`,r.scripts.format=(r.scripts.format??"")+" && yarn format-code")}const i=nn(n);if(i){"poetry install"===r.scripts.postinstall&&delete r.scripts.postinstall,r.scripts["common/ci-setup"]=`yarn setup-${i}`,delete r.scripts["setup-"+("poetry"===i?"uv":"poetry")],delete r.scripts["setup-poetry-asdf"],r.scripts[`setup-${i}`]="uv"===i?"uv sync --frozen":"poetry config virtualenvs.in-project true && poetry env use $(mise current python) && poetry run pip install --upgrade pip && poetry install";const e=await o.glob("**/*.py",{cwd:n.dirPath,dot:!0,ignore:J}),t=new Set;for(const n of e){const[e,i]=n.split("/");e&&i&&t.add(e)}if(t.size>0){const e=[...t].join(" "),n=`${i} run`;r.scripts["format-code"]=`${n} isort --profile black ${e} && ${n} black ${e}`,r.scripts.lint?r.scripts.lint=`${n} flake8 ${e} && ${r.scripts.lint}`:(r.scripts.lint=`${n} flake8 ${e}`,r.scripts["lint-fix"]="yarn lint"),r.scripts.format=(r.scripts.format??"")+" && yarn format-code",s.pythonDevDependencies.push("black","isort","flake8")}}}(n.repository||r.repository)&&(r.repository=function(e,t){const n=ln(e);if(n)return pn(n,e,t);const i=ln(t);if(i)return pn(i,t);return e}(n.repository??r.repository,r.repository));n.depending.blitz?r.scripts["gen-code"]?.startsWith("blitz codegen")?r.scripts["gen-code"].includes("blitz prisma generate")||(r.scripts["gen-code"]=r.scripts["gen-code"].replace("blitz codegen","blitz codegen && blitz prisma generate")):r.scripts["gen-code"]="blitz codegen":n.depending.prisma&&!r.scripts["gen-code"]?.startsWith("prisma generate")&&(r.scripts["gen-code"]="prisma generate");(function(e,t){const n=Dt(e,t.scripts);if(!n)return;const i=t.scripts.postinstall;i?i.includes(n)||(t.scripts.postinstall=`${i} && ${n}`):t.scripts.postinstall=n})(n,r),r.dependencies.prettier||delete r.devDependencies["@types/prettier"]}(n,i,a,p),function(e,t){const n=e.dependencies,i=e.devDependencies;t.dependencies=sn(n,t.dependencies),t.devDependencies=t.devDependencies.filter(e=>!n[e]),t.devDependencies=sn(i,t.devDependencies)}(a,p),await async function(e){const t=new Set([...Object.keys(e.dependencies),...Object.keys(e.devDependencies)]),n=[{packageName:"@willbooster/auth",repo:"auth",target:"dependencies"},{packageName:"@discord-bot/shared",repo:"discord-bot",target:"dependencies"},{packageName:"@willbooster/code-analyzer",repo:"code-analyzer",target:"devDependencies"},{packageName:"@willbooster/judge",repo:"judge",target:"dependencies"},{packageName:"@willbooster/llm-proxy",repo:"llm-proxy",target:"dependencies"}];await Promise.all(n.map(async({packageName:n,repo:i,target:r})=>{if(!t.has(n)||function(e,t){return(e.devDependencies?.[t]||e.dependencies?.[t]||"").includes("workspace")}(e,n))return;const s="dependencies"===r?"devDependencies":"dependencies";Reflect.deleteProperty(e[s],n),e[r][n]=await async function(e){const t=await function(e,t){try{const n=Wt("git",["ls-remote",`git@github.com:${e}/${t}.git`,"HEAD"],process.cwd()).split(/\s+/)[0];if(!n)throw new Error(`No commits found for ${e}/${t}`);return Promise.resolve(n)}catch(n){return Promise.reject(new Error(`Failed to fetch commits for ${e}/${t}: ${String(n)}`))}}("WillBoosterLab",e);return`git@github.com:WillBoosterLab/${e}.git#${t}`}(i)}))}(a),function(e){for(const t of["dependencies","devDependencies","peerDependencies"]){const n=e[t];n&&0===Object.keys(n).length&&Reflect.deleteProperty(e,t)}}(a),n.isBun&&delete a.packageManager;await $.generateFile(s,function(e){return JSON.stringify(Te(e),void 0,2)}(a)),r||(function(e,t,n,i){const r=n.dependencies.filter(e=>!t.devDependencies?.[e]);rn(e,i,r,!1);const s=n.devDependencies.filter(e=>!t.dependencies?.[e]);rn(e,i,s,!0);const o=nn(e);if(o&&n.pythonDevDependencies.length>0){const t=[...new Set(n.pythonDevDependencies)];"poetry"===o?Rt("poetry",["add","--group","dev",...t],e.dirPath):Rt("uv",["add","--dev",...t],e.dirPath)}}(n,a,p,c),function(e,n,i){const r=t.relative(e.dirPath,i);if(!r)return;Rt("bun"===n?"bunx":n,["sort-package-json",r],e.dirPath)}(n,c,s))}(n,i,r)})}const tn="export { default } from './config.js';\n";function nn(e){return e.doesContainUvLock?"uv":e.doesContainPoetryLock?"poetry":void 0}function rn(e,t,n,i){if(0===n.length)return;const r=[...new Set(n)];e.isBun?Rt(t,["add",...i?["-D"]:[],"--exact",...r],e.dirPath):Rt(t,["add",...i?["-D"]:[],...r],e.dirPath)}function sn(e,t){const n=[];for(const i of new Set(t)){const t=cn(i,e[i]);t&&n.push(i),e[i]&&!t&&"*"!==e[i]||(e[i]=on(i))}return n}function on(e){const t=Qt.get(e);if(t)return t;const n=Wt("npm",["show",e,"version","--workspaces=false"],process.cwd())||"*";return Qt.set(e,n),n}function an(e,t,n){return!!qt(t)&&(!!e.peerDependencies[n]||"@types/eslint"===n&&!!e.peerDependencies.eslint)}function cn(e,t){return!t||("*"===t||("@willbooster/wb"===e||e===Kt||"@willbooster/oxlint-config"===e||"oxlint"===e||e===Ht))}function ln(e){if("string"==typeof e){if(!e.startsWith("github:"))return;const[t,n]=Nt.getOrgAndName(e);if(!t||!n)return;return`git+https://github.com/${t}/${n}.git`}const t=e?.url;if("string"!=typeof t)return;const n=/^(?:git\+)?https:\/\/github\.com\/([^/]+)\/([^/]+?)(?:\.git)?$/u.exec(t);if(!n)return;const[,i,r]=n;return`git+https://github.com/${i}/${r}.git`}function pn(e,t,n){return{..."object"==typeof t?t:"object"==typeof n?n:void 0,type:"git",url:e}}function dn(e,t){if(e.isBun){const t={"check-all-for-ai":"bun run check-for-ai && bun run test","check-for-ai":"bun run cleanup",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 e.doesContainTypeScript||e.doesContainTypeScriptInPackages?e.depending.pyright&&(t.typecheck+=" && pyright"):delete t.typecheck,t}{const n=e.doesContainTypeScript||e.doesContainTypeScriptInPackages,i=At(e),r=Bt(e),s=t.test;let o={"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",cleanup:"yarn format && yarn lint-fix",format:un(i,r),lint:"oxlint --no-error-on-unmatched-pattern .","lint-fix":"yarn lint --fix","format-code":"oxfmt --write --no-error-on-unmatched-pattern .",typecheck:"tsgo --noEmit"};return r&&(o.prettify=`prettier --cache --color --no-error-on-unmatched-pattern --write "**/{.*/,}*.{${ht.prettierOnly.join(",")}}" "!**/test{-,/}fixtures/**"`),e.doesContainSubPackageJsons?(o=l({...o},{format:`${o.format} && 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",test:"CI=1 FORCE_COLOR=3 yarn workspaces foreach --all --verbose run test",typecheck:"yarn workspaces foreach --all --parallel --verbose run typecheck"}),r&&(o.prettify=`prettier --cache --color --no-error-on-unmatched-pattern --write "**/{.*/,}*.{${ht.prettierOnly.join(",")}}" "!**/packages/**" "!**/test{-,/}fixtures/**"`)):e.depending.pyright&&(o.typecheck=o.typecheck?`${o.typecheck} && `:"",o.typecheck+="pyright"),s?.includes("wb test")&&(o.test=s),i||(delete o["format-code"],delete o.lint,delete o["lint-fix"]),n?e.depending.wb&&(o.typecheck="wb typecheck"):delete o.typecheck,o}}function un(e,t){const n=["sort-package-json"];return e&&n.push("yarn format-code"),t&&n.push("yarn prettify"),n.join(" && ")}const mn={glob_matcher:"doublestar","post-merge":{jobs:[{name:"prepare",script:"prepare.sh",runner:"bash"}]},"pre-push":{jobs:[{name:"check",script:"check.sh",runner:"bash"}]}},fn={jobs:[{name:"cleanup",glob:"",run:"",stage_fixed:!0},{name:"check-migrations",glob:"**/migration.sql",run:'\nfailed=0\n# Lefthook expands {staged_files} as shell-escaped args, so paths with spaces stay intact.\nfor file in {staged_files}; do\n if grep -q \'Warnings:\' "$file"; then\n echo "Migration SQL file ($file) contains warnings! Please solve the warnings and commit again."\n failed=1\n fi\ndone\nexit "$failed"\n'.trim()}]},gn='\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 yn(n){return S.functionIgnoringException("generateLefthookUpdatingPackageJson",async()=>{await async function(n){const i=t.resolve(n.dirPath,".lefthook"),r=t.resolve(n.dirPath,".husky"),s=e.existsSync(r),{lint:o}=dn(n,{}),a={...mn,"pre-commit":{jobs:hn(n)}};o||delete a["pre-push"];await Promise.all([e.promises.writeFile(t.join(n.dirPath,"lefthook.yml"),p.dump(a,{lineWidth:-1,noCompatMode:!0,styles:{"!!null":"empty"}})),e.promises.rm(i,{force:!0,recursive:!0})]),s&&(await Promise.all([e.promises.rm(r,{force:!0,recursive:!0}),e.promises.rm(t.resolve(n.dirPath,".huskyrc.json"),{force:!0})]),Rt("git",["config","--unset","core.hooksPath"],n.dirPath));if(o){const r=function(e){let t;t=e.isBun?e.depending.wb?"bun --bun wb lint":"bun run lint":e.depending.wb?"yarn wb lint":"yarn run lint";const n=`${t} --quiet`;if(e.repository?.startsWith("github:WillBoosterLab/"))return`\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\n${n}\n`.trim();return n}(n);e.mkdirSync(t.join(i,"pre-push"),{recursive:!0}),await e.promises.writeFile(t.join(i,"pre-push","check.sh"),r+"\n",{mode:493})}const c=`${gn}\n\n${function(e){const t=[];if(e.hasVersionSettings){const e=String.raw`(mise\.toml|\.mise\.toml|\.tool-versions|\..+-version)`;t.push(String.raw`run_if_changed "${e}" "mise install"`)}const n=e.isBun?"bun install":"yarn",i=e.depending.blitz||e.depending.next?" && rm -Rf .next":"";t.push(String.raw`run_if_changed "package\.json" "${n}${i}"`),e.doesContainPoetryLock&&t.push(String.raw`run_if_changed "poetry\.lock" "poetry install"`);e.doesContainUvLock&&t.push(String.raw`run_if_changed "uv\.lock" "uv sync --frozen"`);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"`);const r=Dt(e,e.packageJson?.scripts);r&&t.push(String.raw`run_if_changed "(^|/)i18n/.*\.json$" "${r}"`);return t}(n).join("\n")}\n`;e.mkdirSync(t.join(i,"post-merge"),{recursive:!0}),await e.promises.writeFile(t.resolve(i,"post-merge","prepare.sh"),c,{mode:493})}(n)})}function hn(e){return fn.jobs.map(t=>"cleanup"===t.name?{...t,glob:wn(e),run:bn(e)}:t)}function wn(e){const t=e.isBun||e.depending.wb||Bt(e)?[...ht.prettierOnly]:[];At(e)&&t.push(...ht.oxfmt,...ht.oxlint),(e.doesContainPoetryLock||e.doesContainUvLock)&&t.push("py"),e.doesContainPubspecYaml&&t.push("dart");return`**/*.{${[...new Set(t)].toSorted().join(",")}}`}function bn(n){if(function(n){if(!n.isRoot)return!1;const i=t.resolve(n.dirPath,"packages","wb","package.json");if(!e.existsSync(i))return!1;try{return"@willbooster/wb"===JSON.parse(e.readFileSync(i,"utf8")).name}catch{return!1}}(n))return String.raw`
|
|
2
2
|
# Lefthook expands {staged_files} as shell-escaped args, so paths with spaces stay intact.
|
|
3
3
|
yarn workspace @willbooster/wb start --working-dir "$(git rev-parse --show-toplevel)" lint --fix --format -- {staged_files}
|
|
4
4
|
`.trim();if(n.isBun||n.depending.wb){const e=n.isBun?"bun":"yarn";return n.depending.wb?`\n# Lefthook expands {staged_files} as shell-escaped args, so paths with spaces stay intact.\n${n.isBun?"bun --bun wb":"yarn wb"} lint --fix --format -- {staged_files}\n`.trim():`${e} run format && ${e} run lint-fix`}const i=ht.oxlint.map(e=>String.raw`\.${e}$`).join("|"),r=ht.oxfmt.map(e=>String.raw`\.${e}$`).join("|"),s=ht.prettierOnly.map(e=>String.raw`\.${e}$`).join("|"),o=At(n),a=Bt(n);return String.raw`
|
|
@@ -29,4 +29,4 @@ fi
|
|
|
29
29
|
${vn(n)?`if [ -n "$python_files" ]; then\n ${kn(n)} isort --profile black --filter-files $python_files\n ${kn(n)} black $python_files\n ${kn(n)} flake8 $python_files\nfi`:""}
|
|
30
30
|
${n.doesContainPubspecYaml?'if [ -n "$dart_files" ]; then\n dart format $dart_files\nfi':""}
|
|
31
31
|
`.trim()}function vn(e){return e.doesContainPoetryLock||e.doesContainUvLock}function kn(e){return e.doesContainUvLock?"uv run":"poetry run"}async function xn(t){return S.functionIgnoringException("generateLintstagedrc",async()=>{await Promise.all([P.run(()=>e.promises.rm(`${t.dirPath}/.lintstagedrc.cjs`,{force:!0})),P.run(()=>e.promises.rm(`${t.dirPath}/.lintstagedrc.js`,{force:!0})),P.run(()=>e.promises.rm(`${t.dirPath}/.lintstagedrc.json`,{force:!0}))])})}async function jn(n){return S.functionIgnoringException("generateOxfmtConfig",async()=>{const i=t.resolve(n.dirPath,".oxfmtrc.json"),r=t.resolve(n.dirPath,"oxfmt.config.ts");await P.run(()=>e.promises.rm(i,{force:!0})),e.existsSync(r)||await P.run(()=>$.generateFile(r,_n))})}const _n="import config from '@willbooster/oxfmt-config';\n\nexport default config;\n";async function Sn(n,i){return S.functionIgnoringException("generateOxlintConfig",async()=>{const i=qt(n),r=t.resolve(n.dirPath,"oxlint.config.ts"),s=e.existsSync(r)?e.readFileSync(r,"utf8"):void 0,o=[];i||o.push(P.run(()=>e.promises.rm(t.resolve(n.dirPath,".oxlintrc.json"),{force:!0})),P.run(()=>e.promises.rm(t.resolve(n.dirPath,"biome.json"),{force:!0})),P.run(()=>e.promises.rm(t.resolve(n.dirPath,"biome.jsonc"),{force:!0})),P.run(()=>e.promises.rm(t.resolve(n.dirPath,".eslintrc"),{force:!0})),P.run(()=>e.promises.rm(t.resolve(n.dirPath,".eslintrc.cjs"),{force:!0})),P.run(()=>e.promises.rm(t.resolve(n.dirPath,".eslintrc.js"),{force:!0})),P.run(()=>e.promises.rm(t.resolve(n.dirPath,".eslintrc.json"),{force:!0})),P.run(()=>e.promises.rm(t.resolve(n.dirPath,".eslintrc.yaml"),{force:!0})),P.run(()=>e.promises.rm(t.resolve(n.dirPath,".eslintrc.yml"),{force:!0})),P.run(()=>e.promises.rm(t.resolve(n.dirPath,"eslint.config.cjs"),{force:!0})),P.run(()=>e.promises.rm(t.resolve(n.dirPath,"eslint.config.js"),{force:!0})),P.run(()=>e.promises.rm(t.resolve(n.dirPath,"eslint.config.mjs"),{force:!0})),P.run(()=>e.promises.rm(t.resolve(n.dirPath,"eslint.config.ts"),{force:!0}))),s||o.push(P.run(()=>$.generateFile(r,$n))),await Promise.all(o)})}const $n="import config from '@willbooster/oxlint-config';\n\nexport default config;\n";async function Pn(n){return S.functionIgnoringException("generatePrettierignore",async()=>{const i=t.resolve(n.dirPath,".prettierignore");if(!Bt(n))return void await P.run(()=>e.promises.rm(i,{force:!0}));const r=await $.readFileIgnoringError(i)??"",s=ft.getHeadUserContent(r),o=ft.getTailUserContent(r),a=t.resolve(n.dirPath,".gitignore"),c=await ft.readGitignoreWithoutSeparators(a)||"";let l="";n.doesContainPubspecYaml&&(l="\nandroid/app/\nios/Runner/Assets.xcassets/\npubspec.yaml\n");const p=s+"\n3rd-party/\nandroid/\nios/\nno-format/\ntest-fixtures/\ntest/fixtures/\n*.d.ts\n*.min.js\n.yarn/\n.pnp.js\n"+l+c+o;await P.run(()=>$.generateFile(i,p))})}const On={venvPath:".",venv:".venv"};async function En(n){return S.functionIgnoringException("generatePyrightConfigJson",async()=>{let i=structuredClone(On);const r=t.resolve(n.dirPath,"pyrightconfig.json");try{const t=await e.promises.readFile(r,"utf8"),n=JSON.parse(t);i=l.all([i,n,i],{arrayMerge:Je})}catch{}const s=JSON.stringify(i,void 0,2);await P.run(()=>$.generateFile(r,s))})}async function Cn(n){return S.functionIgnoringException("generateReadme",async()=>{const i=t.resolve(n.dirPath,"README.md");let r=await e.promises.readFile(i,"utf8");e.existsSync(t.resolve(n.dirPath,".releaserc.json"))&&(r=An(r,"[](https://github.com/semantic-release/semantic-release)"));const s=n.repository?.slice(n.repository.indexOf(":")+1),o=e.readdirSync(`${n.dirPath}/.github/workflows`);for(const i of o){if(!i.startsWith("test")&&!i.startsWith("deploy"))continue;let o=i;if(o=(o[0]||"").toUpperCase()+o.slice(1,o.indexOf(".")),o=o.replace("-"," "),!s)continue;const a=`[](https://github.com/${s}/actions/workflows/${i})`;e.existsSync(t.resolve(n.dirPath,`.github/workflows/${i}`))&&(r=An(r,a))}await P.run(()=>$.generateFile(i,r))})}function An(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 i=e.slice(0,n+1);let r=e.slice(n+1);return r.startsWith("[")||r.startsWith("!")||(r=`\n${r}`),`${i}${t}\n${r}`}return`${e}\n${t}\n`}async function Bn(n){return S.functionIgnoringException("generateReleaserc",async()=>{const i=t.resolve(n.dirPath,".releaserc.json");if(!e.existsSync(i))return;const r=JSON.parse(await e.promises.readFile(i,"utf8")),s=r.plugins??[];for(let e=0;e<s.length;e++){const t=s[e],n=Array.isArray(t),i=n?t[0]:t,r=n&&t[1]||{};"@semantic-release/commit-analyzer"===i?s[e]=["@semantic-release/commit-analyzer",l.all([r,{preset:"conventionalcommits"}],{arrayMerge:Je})]:"@semantic-release/github"===i&&(s[e]=["@semantic-release/github",l.all([r,{successCommentCondition:!1,failCommentCondition:!1,labels:["r: semantic-release"],releasedLabels:["released :bookmark:"]}],{arrayMerge:Je})])}const o=JSON.stringify(r,void 0,2);await P.run(()=>$.generateFile(i,o))})}const Fn={$schema:"https://docs.renovatebot.com/renovate-schema.json",extends:["github>WillBooster/willbooster-configs:renovate.json5"]};async function In(n){return S.functionIgnoringException("generateRenovateJson",async()=>{let i=structuredClone(Fn);const r=t.resolve(n.dirPath,"renovate.json");if(e.existsSync(`${r}5`))return;try{const t=await e.promises.readFile(r,"utf8"),n=JSON.parse(t);i=l.all([i,n,i],{arrayMerge:Je}),i.extends=i.extends.filter(e=>"@willbooster"!==e)}catch{}n.depending.blitz&&(i.packageRules??=[],i.packageRules.some(e=>e.matchPackageNames?.includes("next"))||i.packageRules.push({matchPackageNames:["next"],enabled:!1})),await P.run(()=>e.promises.rm(t.resolve(n.dirPath,".dependabot"),{force:!0})),await P.run(()=>e.promises.rm(t.resolve(n.dirPath,".renovaterc.json"),{force:!0}));const s=JSON.stringify(i,void 0,2);await P.run(()=>$.generateFile(r,s))})}async function Dn(e){return S.functionIgnoringException("installAgentSkills",async()=>{await Promise.all([s.rm(t.resolve(e.dirPath,".agents"),{force:!0,recursive:!0}),s.rm(t.resolve(e.dirPath,".claude"),{force:!0,recursive:!0}),s.rm(t.resolve(e.dirPath,"skills-lock.json"),{force:!0})])})}const Rn={compilerOptions:{alwaysStrict:!0,noUncheckedIndexedAccess:!0,allowSyntheticDefaultImports:!0,esModuleInterop:!0,resolveJsonModule:!0,importHelpers:!1,noEmit:!0},exclude:["packages/*/test/fixtures","test/fixtures"],include:["*.config.ts","packages/*/*.config.ts","packages/*/scripts/**/*","packages/*/src/**/*","packages/*/test/**/*","scripts/**/*","src/**/*","test/**/*"]},Tn={compilerOptions:{alwaysStrict:!0,noUncheckedIndexedAccess:!0,allowSyntheticDefaultImports:!0,esModuleInterop:!0,resolveJsonModule:!0,importHelpers:!1,noEmit:!0},exclude:["test/fixtures"],include:["*.config.ts","scripts/**/*","src/**/*","test/**/*"]};async function Wn(n){return S.functionIgnoringException("generateTsconfig",async()=>{if(n.depending.blitz||n.depending.next)return void await async function(n){const i=t.resolve(n.dirPath,"tsconfig.json");try{const t=JSON.parse(await e.promises.readFile(i,"utf8"));!function(e){if(!e)return;"node"!==e.moduleResolution&&"Node"!==e.moduleResolution&&"node10"!==e.moduleResolution&&void 0!==e.moduleResolution||(e.moduleResolution="bundler")}(t.compilerOptions),await P.run(()=>$.generateFile(i,JSON.stringify(t,void 0,2)))}catch{}}(n);let i=structuredClone(n.isRoot?Rn:Tn);const r=function(e){const t=new Set,n={...e.packageJson?.dependencies,...e.packageJson?.devDependencies};e.isBun?t.add("bun"):e.depending.reactNative||t.add("node");(n.jest||n["@jest/globals"]||n["jest-environment-jsdom"]||n["ts-jest"])&&t.add("jest");n.vitest&&t.add("vitest/globals");n.mocha&&t.add("mocha");n.cypress&&t.add("cypress");return[...t]}(n);i.extends=function(e){return e.isBun?"@tsconfig/bun/tsconfig.json":e.depending.reactNative?"@tsconfig/react-native/tsconfig.json":["@tsconfig/node-lts/tsconfig.json","@tsconfig/node-ts/tsconfig.json"]}(n),i.compilerOptions??={},i.compilerOptions.rootDir=function(n){return n.isRoot?".":e.existsSync(t.resolve(n.dirPath,"..","..","package.json"))?"../..":"."}(n),r.length>0&&(i.compilerOptions={...i.compilerOptions,types:r}),n.doesContainJsxOrTsx||n.doesContainJsxOrTsxInPackages?n.isBun||n.depending.reactNative||(i.compilerOptions={...i.compilerOptions,jsx:"react-jsx"}):delete i.compilerOptions?.jsx,n.isRoot&&!n.doesContainSubPackageJsons&&(i.include=i.include?.filter(e=>!e.startsWith("packages/*/")),i.exclude=i.exclude?.filter(e=>!e.startsWith("packages/*/"))),n.depending.prisma&&function(e,t){e.include??=[],e.include.includes(t)||e.include.push(t)}(i,"prisma/**/*");const s=t.resolve(n.dirPath,"tsconfig.json");try{const t=await e.promises.readFile(s,"utf8"),n=JSON.parse(t),a=(o=n.compilerOptions?.types,"string"==typeof o?[o]:Array.isArray(o)?o.filter(e=>"string"==typeof e):[]),c=function(e){const t={};for(const n of["declaration","declarationMap","sourceMap"]){const i=e?.[n];void 0!==i&&(t[n]=i)}return t}(n.compilerOptions);i.extends=function(e,t){const n=[...Ln(e),...Ln(t)],i=[...new Set(n)];return 0===i.length?void 0:1===i.length?i[0]:i}(i.extends,n.extends),delete n.extends,delete n.compilerOptions?.jsx,i=l.all([i,n,i],{arrayMerge:Ue}),i.include=i.include?.filter(e=>!e.includes("@types")&&!e.includes("__tests__/")&&!e.includes("tests/")),i.compilerOptions??={},i.compilerOptions={...i.compilerOptions,...c},function(e){if(!e)return;if(!1!==e.noEmit||!0===e.emitDeclarationOnly)return;e.rewriteRelativeImportExtensions=!0}(i.compilerOptions);const p=[...new Set([...Nn(a,r),...r])];p.length>0?i.compilerOptions.types=p:delete i.compilerOptions.types,r.some(e=>"cypress"===e||e.includes("/"))&&delete i.compilerOptions.typeRoots}catch{}var o;qe(i),i.include?.sort(),delete i.compilerOptions?.experimentalDecorators,delete i.compilerOptions?.baseUrl,function(e,t){if(!e)return;"node"!==e.moduleResolution&&"Node"!==e.moduleResolution&&"node10"!==e.moduleResolution||delete e.moduleResolution;if(t.isBun||t.depending.reactNative||"ESNext"!==e.module)return;delete e.module}(i.compilerOptions,n),n.depending.reactNative&&delete i.compilerOptions?.verbatimModuleSyntax;const a=JSON.stringify(i,void 0,2);await P.run(()=>$.generateFile(s,a))})}function Ln(e){return e?Array.isArray(e)?e:[e]:[]}function Nn(e,t){const n=new Set(t);return e.filter(e=>!(function(e){return"cypress"===e||"jest"===e||"mocha"===e||"vitest/globals"===e}(e)&&!n.has(e)))}const Jn=["**/.git/objects/**","**/.git/subtree-cache/**","**/node_modules/**","**/tmp/**","**/temp/**","**/dist/**"];async function Un(n){return S.functionIgnoringException("generateVscodeSettings",async()=>{try{const i=t.resolve(n.dirPath,".vscode","settings.json"),r=await e.promises.readFile(i,"utf8");let s=JSON.parse(r);for(const e of Jn)s=l.all([s,Mn(e)]);(n.doesContainPoetryLock||n.doesContainUvLock)&&(s=l.all([s,Mn("**/.venv/**")])),n.depending.next&&(s=l.all([s,Mn("**/.next/**")])),"editor.codeActionsOnSave"in s&&delete s["editor.codeActionsOnSave"],"editor.formatOnSave"in s&&delete s["editor.formatOnSave"],qe(s);const o=JSON.stringify(s,void 0,2);await P.run(()=>$.generateFile(i,o))}catch{}})}function Mn(e){return{"files.watcherExclude":{[e]:!0}}}async function Gn(n){return S.functionIgnoringException("generateYarnrcYml",async()=>{const i=t.resolve(n.dirPath,".yarnrc.yml");if(n.isBun)return await P.run(()=>e.promises.rm(i,{force:!0})),await P.run(()=>e.promises.rm(t.resolve(n.dirPath,".yarn"),{force:!0,recursive:!0})),void await P.run(()=>e.promises.rm(t.resolve(n.dirPath,"yarn.lock"),{force:!0,recursive:!0}));const r=Wt("yarn",["--version"],n.dirPath),s=function(e,t){return Wt("npm",["show",e,"version"],t)||"0.0.0"}("@yarnpkg/cli",n.dirPath);(function(e,t){const n=g.valid(e);return!!n&&g.gt(n,g.valid(t)??"0.0.0")})(s,r)&&Rt("yarn",["set","version",s],n.dirPath,1);const o=t.join(n.dirPath,".yarn","releases");await e.promises.mkdir(o,{recursive:!0});for(const n of await e.promises.readdir(o))n.startsWith("yarn-")&&!n.startsWith(`yarn-${s}.`)&&await P.run(()=>e.promises.rm(t.join(o,n)));const a=t.resolve(n.dirPath,".yarnrc");await P.run(()=>e.promises.rm(a,{force:!0}));let c={};try{c=p.load(await e.promises.readFile(i,"utf8"))??c}catch{}c.defaultSemverRangePrefix="",c.nodeLinker="node-modules",c.nmMode="hardlinks-global",c.npmMinimalAgeGate="5d",c.approvedGitRepositories=["https://github.com/WillBoosterLab/*.git","ssh://git@github.com/WillBoosterLab/*.git"],c.npmPreapprovedPackages=["@exercode/*","@willbooster/*","agent-runtime-kit","at-decorators","build-ts","gen-i18n-ts","one-way-git-sync","next","@next/*","@typescript/*","@oxfmt/*","@oxlint/*","@oxlint-tsgolint/*","oxfmt","oxlint","oxlint-tsgolint","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 i=t.resolve(n.dirPath,".yarn","plugins","undefined.cjs");await P.run(()=>e.promises.rm(i,{force:!0}))}0===c.plugins.length&&delete c.plugins,await e.promises.writeFile(i,p.dump(c,{lineWidth:-1})),Rt("yarn",["dlx","yarn-plugin-auto-install"],n.dirPath),Rt("yarn",function(e,n){return["dlx","prettier","--no-config","--write",t.relative(e,n)]}(n.dirPath,i),n.dirPath)})}async function qn(e){return S.functionIgnoringException("setupLabels",async()=>{const[t,n]=Nt.getOrgAndName(e.repository??"");if(!t||!n)return;if("WillBooster"!==t&&"WillBoosterLab"!==t)return;if(!Mt(t))return;const i=Ut(t);try{await zn(i,t,n,"d1: x-easy :hedgehog:","EDE9FE"),await zn(i,t,n,"d2: easy :rabbit2:","DDD6FE"),await zn(i,t,n,"d3: medium :ox:","C4B5FD"),await zn(i,t,n,"d4: hard :squid:","A78BFA"),await zn(i,t,n,"d5: x-hard :whale2:","8B5CF6"),await zn(i,t,n,"p1: critical :fire::fire::fire:","EF4444"),await zn(i,t,n,"p2: urgent :fire::fire:","F87171"),await zn(i,t,n,"p3: important :fire:","FCA5A5"),await zn(i,t,n,"p4: nice to have :droplet:","FECACA"),await zn(i,t,n,"r: blitz","5300bc"),await zn(i,t,n,"r: firebase","ffca28"),await zn(i,t,n,"r: prisma","0c344b"),await zn(i,t,n,"r: react","61dafb"),await zn(i,t,n,"r: svelte","ff3e00"),await zn(i,t,n,"r: semantic-release","494949"),await zn(i,t,n,"ready :rocket:","22C55E"),await zn(i,t,n,"review requested :mag:","FBCA04"),await zn(i,t,n,"released :bookmark:","6366F1"),await zn(i,t,n,"s: 0.5h :clock1230:","F3F4F6"),await zn(i,t,n,"s: 1h :clock1:","E5E7EB"),await zn(i,t,n,"s: 2h :clock2:","D1D5DB"),await zn(i,t,n,"s: 3h :clock3:","9CA3AF"),await zn(i,t,n,"s: 5h :clock5:","6B7280"),await zn(i,t,n,"s: 8h :clock8:","4B5563"),await zn(i,t,n,"s: 13h :clock1:","374151"),await zn(i,t,n,"t: build :hammer:","BFDBFE"),await zn(i,t,n,"t: chore :broom:","BFDBFE"),await zn(i,t,n,"t: ci :construction_worker:","BFDBFE"),await zn(i,t,n,"t: docs :memo:","BFDBFE"),await zn(i,t,n,"t: feat :sparkles:","BFDBFE"),await zn(i,t,n,"t: fix :bug:","BFDBFE"),await zn(i,t,n,"t: perf :zap:","BFDBFE"),await zn(i,t,n,"t: refactor :recycle:","BFDBFE"),await zn(i,t,n,"t: style :lipstick:","BFDBFE"),await zn(i,t,n,"t: test :test_tube:","BFDBFE"),await zn(i,t,n,"project","24292F"),await zn(i,t,n,"focused :dart:","22C55E"),await zn(i,t,n,"gen-pr-all :robot:","00B4D8"),await zn(i,t,n,"gen-pr-claude :robot:","00B4D8"),await zn(i,t,n,"gen-pr-codex :robot:","00B4D8"),await zn(i,t,n,"gen-pr-gemini :robot:","00B4D8"),await Hn(i,t,n,"bug"),await Hn(i,t,n,"documentation"),await Hn(i,t,n,"duplicate"),await Hn(i,t,n,"enhancement"),await Hn(i,t,n,"good first issue"),await Hn(i,t,n,"help wanted"),await Hn(i,t,n,"invalid"),await Hn(i,t,n,"question"),await Hn(i,t,n,"wontfix"),await Hn(i,t,n,"ready"),await Hn(i,t,n,"review requested"),await Hn(i,t,n,"released"),await Hn(i,t,n,"semantic-release"),await Hn(i,t,n,"llm-pr :robot:"),await Hn(i,t,n,"ai-pr :robot:")}catch(e){console.warn("Skip setupLabels due to:",e?.stack??e)}})}async function zn(e,t,n,i,r){try{await e.request("POST /repos/{owner}/{repo}/labels",{owner:t,repo:n,name:i,color:r})}catch{await e.request("PATCH /repos/{owner}/{repo}/labels/{name}",{owner:t,repo:n,name:i,color:r})}}async function Hn(e,t,n,i){try{await e.request("DELETE /repos/{owner}/{repo}/labels/{name}",{owner:t,repo:n,name:i})}catch{}}const Yn=["READY_DISCORD_WEBHOOK_URL","GH_BOT_PAT","PUBLIC_GH_BOT_PAT"],Kn=y(import.meta.url);async function Vn(e){return S.functionIgnoringException("setupSecrets",async()=>{const[n,i]=Nt.getOrgAndName(e.repository??"");if(!n||!i||"WillBoosterLab"!==n)return;if(!Mt(n)||!_.doesUploadEnvVars)return;const r=h.config({path:t.resolve(e.dirPath,".env")}).parsed??{};if(0===Object.keys(r).length)return;const s=Ut(n);try{for(const e of Yn)try{await s.request("DELETE /repos/{owner}/{repo}/actions/secrets/{secret_name}",{owner:n,repo:i,secret_name:e})}catch{}const e=await s.request("GET /repos/{owner}/{repo}/actions/secrets/public-key",{owner:n,repo:i}),{key:t,key_id:o}=e.data,a=Kn("libsodium-wrappers");await a.ready;for(const[e,c]of Object.entries(r)){if("GH_BOT_PAT"===e||"GH_BOT_PAT_FOR_WILLBOOSTER"===e||"GH_BOT_PAT_FOR_WILLBOOSTERLAB"===e)continue;const r=a.from_base64(t,a.base64_variants.ORIGINAL),l=a.from_string(c),p=a.crypto_box_seal(l,r),d=a.to_base64(p,a.base64_variants.ORIGINAL);await s.request("PUT /repos/{owner}/{repo}/actions/secrets/{secret_name}",{owner:n,repo:i,secret_name:e,encrypted_value:d,key_id:o})}}catch(e){console.warn("Skip setupSecrets due to:",e?.stack??e)}})}async function Xn(e){const[t,n]=Nt.getOrgAndName(e.repository??"");if(!t||!n)return;if("WillBooster"!==t&&"WillBoosterLab"!==t)return;if(!Mt(t))return;const i=Ut(t);await async function(e,{beforeRetry:t,handleError:n,retryCount:i=3,retryLogger:r,shouldRetry:s,sleepMilliseconds:o=0,updateSleepMilliseconds:a}={}){let c=0;for(;;)try{return await e(c)}catch(e){if(await(n?.(e)),c++,c>=i)throw e;if(s&&!s(e))throw e;o>0&&await k(o),a&&(o=a(o)),r?.(`Retry due to: ${e}\n${e instanceof Error?"---\n"+(e.stack??""):""}`),await(t?.(e))}}(()=>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 Zn="__PM_RUN__",Qn={"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., \`${Zn} test\`) passed.\n - The lint command (e.g., \`${Zn} 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 ei(n){return S.functionIgnoringException("generateGitHubTemplates",async()=>{for(const[i,r]of Object.entries(Qn)){const s=ti(r,n),o=t.resolve(n.dirPath,".github",i);if(e.existsSync(o)){const t=await e.promises.readFile(o,"utf8");if(w(t,s)>s.length/2)continue}await e.promises.mkdir(t.resolve(n.dirPath,".github"),{recursive:!0}),await P.run(()=>$.generateFile(o,s))}})}function ti(e,t){const n=t.isBun?"bun run":"yarn";return e.replaceAll(Zn,n)}const ni=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 ii(n,i){const r=t.resolve(n,"package.json");try{const o=e.existsSync(r);let a={},c={},l={},p=!1;if(o){const t=e.readFileSync(r,"utf8");l=JSON.parse(t),a=l.dependencies??{},c=l.devDependencies??{},p="module"===l.type}let d=[],u=[];try{const e=t.resolve(n,".releaserc.json"),i=JSON.parse(await s.readFile(e,"utf8"));d=i?.branches??[],u=i?.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),i=(await n.getRemotes(!0)).find(e=>"origin"===e.name),r=i?.refs.fetch??i?.refs.push;if("string"==typeof r){const e=await si(r);if(e)return e}const s="string"==typeof t.repository?t.repository:t.repository?.url;if(s){const e=await si(s);if(e&&"Not Found"!==e.message)return e}}(n,l));let g=function(n){const i=t.resolve(n);return e.existsSync(t.join(i,"mise.toml"))||e.existsSync(t.join(i,".mise.toml"))||e.existsSync(t.join(i,".tool-versions"))}(n);for(const i of["java","node","python"])if(e.existsSync(t.resolve(n,`.${i}-version`))){g=!0;break}let y="";try{y=await s.readFile(t.resolve(n,"Dockerfile"),"utf8")}catch{}const h=t.resolve(n,"wbfy.json");let w;try{const e=await s.readFile(h,"utf8");w=ni.parse(JSON.parse(e))}catch{}const v="string"==typeof f?.full_name?f.full_name:void 0;let k,x;if(v){const e=v.split("/");e.length>=2&&(k=e[0],x=e[1])}const j=v?`github:${v}`:void 0,_={dirPath:n,dockerfile:y,isRoot:m,isPublicRepo:!1===f?.private,isReferredByOtherRepo:!!l.files,repository:j,repoAuthor:k,repoName:x,isWillBoosterRepo:Boolean(j?.startsWith("github:WillBooster/")||j?.startsWith("github:WillBoosterLab/")),isBun:i?.isBun||e.existsSync(t.join(n,"bun.lock")),isEsmPackage:p,isWillBoosterConfigs:r.includes("/willbooster-configs"),doesContainSubPackageJsons:ri("packages/**/package.json",n),doesContainDockerfile:!!y||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")),doesContainUvLock:e.existsSync(t.resolve(n,"uv.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:ri("{app,src,test,scripts}/**/*.{cjs,mjs,js,jsx}",n),doesContainTypeScript:ri("{app,src,test,scripts}/**/*.{cts,mts,ts,tsx}",n),doesContainJsxOrTsx:ri("{app,src,test}/**/*.{t,j}sx",n),doesContainJava:ri("**/*.java",n),doesContainJavaScriptInPackages:ri("packages/**/{app,src,test,scripts}/**/*.{cjs,mjs,js,jsx}",n),doesContainTypeScriptInPackages:ri("packages/**/{app,src,test,scripts}/**/*.{cts,mts,ts,tsx}",n),doesContainJsxOrTsxInPackages:ri("packages/**/{app,src,test}/**/*.{t,j}sx",n),doesContainJavaInPackages:ri("packages/**/*.java",n),hasStartTestServer:!!l.scripts?.["start-test-server"],depending:{blitz:!!a.blitz,firebase:!!c["firebase-tools"],genI18nTs:!!a["gen-i18n-ts"]||!!c["gen-i18n-ts"],litestream:y.includes("install-litestream.sh"),react:!!a.react,next:!!a.next,playwrightTest:!!a["@playwright/test"]||!!c["@playwright/test"]||!!c.playwright,prisma:!!a["@prisma/client"]||!!c.prisma,pyright:!!c.pyright,reactNative:!!a["react-native"],semanticRelease:!!(c["semantic-release"]||d.length>0||u.length>0),storybook:!!c["@storybook/react"],wb:!!a["@willbooster/wb"]||!!c["@willbooster/wb"]},release:{branches:d,github:u.includes("@semantic-release/github"),npm:u.includes("@semantic-release/npm")},hasVersionSettings:g,packageJson:l,wbfyJson:w};if(_.doesContainGemfile||_.doesContainGoMod||_.doesContainPackageJson||_.doesContainPoetryLock||_.doesContainUvLock||_.doesContainPomXml||_.doesContainPubspecYaml||_.doesContainTemplateYaml)return _}catch{}}function ri(e,t){return o.globSync(e,{dot:!0,cwd:t,ignore:J}).length>0}async function si(e){const[t,n]=Nt.getOrgAndName(e);if(!t||!n)return;const i={full_name:`${t}/${n}`};try{const e=await Ut().request("GET /repos/{owner}/{repo}",{owner:t,repo:n});Object.assign(i,e.data)}catch(e){const t=function(e){if(!e||"object"!=typeof e)return;const t="response"in e?e.response:void 0,n=t?.status??e.status;if(301!==n&&302!==n)return;const i=t?.headers?.location;if("string"!=typeof i)return;const[r,s]=Nt.getOrgAndName(i);if(!r||!s)return;return`${r}/${s}`}(e);t&&(i.full_name=t)}return i}function oi(e){const t=Tt("bun",["install"],e);if(0!==t)throw new Error(`Failed to refresh Bun lockfile: bun install exited with status ${t}`)}await async function(){const i=await n(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;_.isVerbose=i.verbose,_.doesUploadEnvVars=i.env;let r=!1;for(const n of i.paths){const s=t.join(n,"packages"),o=(await x(()=>e.promises.readdir(s,{withFileTypes:!0}))??[]).filter(e=>e.isDirectory()).map(e=>t.join(s,e.name));await We([n,...o]);const a=await ii(n);if(_.isVerbose,!a){console.error(`there is no valid package.json in ${n}`),r=!0;continue}const c=et(a),l=(await Promise.all(o.map(e=>ii(e,a)))).filter(e=>!!e),p=[a,...l];if(_.isVerbose)for(const e of p)console.info(e);await Gn(a),a.isBun&&await at(a);const d=!Ve(a.repository)&&(a.repository?.startsWith("github:WillBooster/")||a.repository?.startsWith("github:WillBoosterLab/"));await Promise.all([U(a),c.then(()=>Cn(a)),it(a,p),yt(a),bt(a),xt(a,p),jt(a),St(a),ei(a),Ft(a),In(a),Bn(a),...d?[Ke(a)]:[],qn(a),Vn(a),Xn(a),yn(a),xn(a)]),await P.promiseAll();const u=[];for(const e of p)(e.doesContainTypeScript||e.doesContainTypeScriptInPackages)&&u.push(Ne(e,e.isRoot?p:[e])),e.depending.playwrightTest&&u.push(F(e)),e.depending.next&&u.push(O(e)),await Pt(e,a),await P.promiseAll(),(e.isRoot||e.doesContainPackageJson)&&(await Pn(e),await en(e,a,i.skipDeps),u.push(xn(e)),e.doesContainVscodeSettingsJson&&e.doesContainPackageJson&&u.push(Un(e)),(e.doesContainTypeScript||e.doesContainTypeScriptInPackages)&&u.push(Wn(e)),At(e)&&(u.push(jn(e)),u.push(Sn(e))),e.depending.pyright&&u.push(En(e)));await Promise.all(u),await P.promiseAll();const m=a.isBun?"bun":"yarn";a.isBun?await S.functionIgnoringException("refreshBunLock",async()=>{await Promise.resolve(),oi(n)}):Rt(m,["install","--no-immutable"],n),Rt(m,["cleanup"],n),await Dn(a)}r&&(process.exitCode=1)}();
|
|
32
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VzIjpbIi4uLy4uL3NoYXJlZC1saWIvc3JjL3NsZWVwLnRzIiwiLi4vLi4vc2hhcmVkLWxpYi9zcmMvZXJyb3IudHMiLCIuLi9zcmMvb3B0aW9ucy50cyIsIi4uL3NyYy9sb2dnZXIudHMiLCIuLi9zcmMvdXRpbHMvZnNVdGlsLnRzIiwiLi4vc3JjL3V0aWxzL3Byb21pc2VQb29sLnRzIiwiLi4vc3JjL2ZpeGVycy9uZXh0Q29uZmlnLnRzIiwiLi4vc3JjL2ZpeGVycy9wbGF5d3JpZ2h0Q29uZmlnLnRzIiwiLi4vc3JjL3V0aWxzL2dsb2JVdGlsLnRzIiwiLi4vc3JjL2ZpeGVycy9wcmlzbWEudHMiLCIuLi8uLi8uLi9ub2RlX21vZHVsZXMvc29ydC1vYmplY3Qta2V5cy9pbmRleC5qcyIsIi4uLy4uLy4uL25vZGVfbW9kdWxlcy9kZXRlY3QtaW5kZW50L2luZGV4LmpzIiwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2RldGVjdC1uZXdsaW5lL2luZGV4LmpzIiwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3NvcnQtcGFja2FnZS1qc29uL2luZGV4LmpzIiwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2lzLXBsYWluLW9iai9pbmRleC5qcyIsIi4uL3NyYy9maXhlcnMvdGVzdERpcmVjdG9yeS50cyIsIi4uL3NyYy9maXhlcnMvdHlwZURlZmluaXRpb24udHMiLCIuLi9zcmMvdXRpbHMvbWVyZ2VVdGlsLnRzIiwiLi4vc3JjL3V0aWxzL29iamVjdFV0aWwudHMiLCIuLi9zcmMvZ2VuZXJhdG9ycy93b3JrZmxvdy50cyIsIi4uL3NyYy9maXhlcnMvdHlwb3MudHMiLCIuLi9zcmMvZ2VuZXJhdG9ycy9hZ2VudHMudHMiLCIuLi9zcmMvZ2VuZXJhdG9ycy9idW5maWcudHMiLCIuLi9zcmMvdXRpbHMvaWdub3JlRmlsZVV0aWwudHMiLCIuLi9zcmMvZ2VuZXJhdG9ycy9kb2NrZXJpZ25vcmUudHMiLCIuLi9zcmMvdXRpbHMvZXh0ZW5zaW9ucy50cyIsIi4uL3NyYy9nZW5lcmF0b3JzL2VkaXRvcmNvbmZpZy50cyIsIi4uL3NyYy9nZW5lcmF0b3JzL2dlbWluaUNvbmZpZy50cyIsIi4uL3NyYy9nZW5lcmF0b3JzL2dlbWluaVNldHRpbmdzLnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvZ2l0YXR0cmlidXRlcy50cyIsIi4uL3NyYy9nZW5lcmF0b3JzL2dpdGlnbm9yZS50cyIsIi4uL3NyYy91dGlscy9wYWNrYWdlQ2FwYWJpbGl0aWVzLnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvaWRlYS50cyIsIi4uL3NyYy91dGlscy9nZW5JMThuVHMudHMiLCIuLi9zcmMvdXRpbHMvc3Bhd25VdGlsLnRzIiwiLi4vc3JjL3V0aWxzL2dpdGh1YlV0aWwudHMiLCIuLi9zcmMvdXRpbHMvd2lsbGJvb3N0ZXJDb25maWdzVXRpbC50cyIsIi4uL3NyYy9nZW5lcmF0b3JzL3BhY2thZ2VKc29uLnRzIiwiLi4vc3JjL3V0aWxzL3RzY29uZmlnQmFzZS50cyIsIi4uL3NyYy9naXRodWIvY29tbWl0LnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvbGVmdGhvb2sudHMiLCIuLi9zcmMvZ2VuZXJhdG9ycy9saW50c3RhZ2VkcmMudHMiLCIuLi9zcmMvZ2VuZXJhdG9ycy9veGZtdENvbmZpZy50cyIsIi4uL3NyYy9nZW5lcmF0b3JzL294bGludENvbmZpZy50cyIsIi4uL3NyYy9nZW5lcmF0b3JzL3ByZXR0aWVyaWdub3JlLnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvcHlyaWdodENvbmZpZy50cyIsIi4uL3NyYy9nZW5lcmF0b3JzL3JlYWRtZS50cyIsIi4uL3NyYy9nZW5lcmF0b3JzL3JlbGVhc2VyYy50cyIsIi4uL3NyYy9nZW5lcmF0b3JzL3Jlbm92YXRlSnNvbi50cyIsIi4uL3NyYy9nZW5lcmF0b3JzL3NraWxscy50cyIsIi4uL3NyYy9nZW5lcmF0b3JzL3RzY29uZmlnLnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvdnNjb2RlU2V0dGluZ3MudHMiLCIuLi9zcmMvZ2VuZXJhdG9ycy95YXJucmMudHMiLCIuLi9zcmMvZ2l0aHViL2xhYmVsLnRzIiwiLi4vc3JjL2dpdGh1Yi9zZWNyZXQudHMiLCIuLi9zcmMvZ2l0aHViL3NldHRpbmdzLnRzIiwiLi4vc3JjL2dpdGh1Yi90ZW1wbGF0ZS50cyIsIi4uL3NyYy9wYWNrYWdlQ29uZmlnLnRzIiwiLi4vc3JjL2luZGV4LnRzIl0sInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCBhc3luYyBmdW5jdGlvbiBzbGVlcChtaWxsaXNlY29uZHM6IG51bWJlcik6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHNldFRpbWVvdXQocmVzb2x2ZSwgbWlsbGlzZWNvbmRzKSk7XG59XG4iLCJpbXBvcnQgeyBzbGVlcCB9IGZyb20gJy4vc2xlZXAuanMnO1xuXG4vKipcbiAqIENvbnZlcnQgYW4gb2JqZWN0IHRvIGFuIGVycm9yLlxuICogQHBhcmFtIG9iaiBUaGUgb2JqZWN0IHRvIGNvbnZlcnQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBlcnJvcmlmeShvYmo6IHVua25vd24pOiBFcnJvciB7XG4gIGlmIChvYmogaW5zdGFuY2VvZiBFcnJvcikgcmV0dXJuIG9iajtcbiAgaWYgKHR5cGVvZiBvYmogPT09ICdzdHJpbmcnKSByZXR1cm4gbmV3IEVycm9yKG9iaik7XG4gIHRyeSB7XG4gICAgcmV0dXJuIG5ldyBFcnJvcihKU09OLnN0cmluZ2lmeShvYmopKTtcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIG5ldyBFcnJvcihTdHJpbmcob2JqKSk7XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlnbm9yZUVycm9yPFQ+KGZuOiAoKSA9PiBUKTogVCB8IHVuZGVmaW5lZCB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIGZuKCk7XG4gIH0gY2F0Y2gge1xuICAgIC8vIGRvIG5vdGhpbmdcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gaWdub3JlRW5vZW50PFQ+KGZuOiAoKSA9PiBUKTogVCB8IHVuZGVmaW5lZCB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIGZuKCk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgaWYgKHR5cGVvZiBlcnJvciA9PT0gJ29iamVjdCcgJiYgZXJyb3IgJiYgJ2NvZGUnIGluIGVycm9yICYmIGVycm9yLmNvZGUgPT09ICdFTk9FTlQnKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRocm93IGVycm9yO1xuICB9XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBpZ25vcmVFcnJvckFzeW5jPFQ+KGZuOiAoKSA9PiBQcm9taXNlPFQ+KTogUHJvbWlzZTxUIHwgdW5kZWZpbmVkPiB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIGF3YWl0IGZuKCk7XG4gIH0gY2F0Y2gge1xuICAgIC8vIGRvIG5vdGhpbmdcbiAgfVxufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gaWdub3JlRW5vZW50QXN5bmM8VD4oZm46ICgpID0+IFByb21pc2U8VD4pOiBQcm9taXNlPFQgfCB1bmRlZmluZWQ+IHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gYXdhaXQgZm4oKTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBpZiAodHlwZW9mIGVycm9yID09PSAnb2JqZWN0JyAmJiBlcnJvciAmJiAnY29kZScgaW4gZXJyb3IgJiYgZXJyb3IuY29kZSA9PT0gJ0VOT0VOVCcpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhyb3cgZXJyb3I7XG4gIH1cbn1cblxuZXhwb3J0IGludGVyZmFjZSBSZXRyeU9wdGlvbnMge1xuICBiZWZvcmVSZXRyeT86IChlcnJvcjogdW5rbm93bikgPT4gUHJvbWlzZTx2b2lkPjtcbiAgaGFuZGxlRXJyb3I/OiAoZXJyb3I6IHVua25vd24pID0+IFByb21pc2U8dm9pZD47XG4gIHJldHJ5Q291bnQ/OiBudW1iZXI7XG4gIHJldHJ5TG9nZ2VyPzogKG1lc3NhZ2U6IHN0cmluZykgPT4gdm9pZDtcbiAgc2hvdWxkUmV0cnk/OiAoZXJyb3I6IHVua25vd24pID0+IGJvb2xlYW47XG4gIHNsZWVwTWlsbGlzZWNvbmRzPzogbnVtYmVyO1xuICB1cGRhdGVTbGVlcE1pbGxpc2Vjb25kcz86IChzbGVlcE1pbGxpc2Vjb25kczogbnVtYmVyKSA9PiBudW1iZXI7XG59XG5cbi8qKlxuICogUmV0cnkgdGhlIGdpdmVuIGZ1bmN0aW9uLlxuICogQHBhcmFtIGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIHJldHJ5LlxuICogQHBhcmFtIGJlZm9yZVJldHJ5IFRoZSBmdW5jdGlvbiB0byBjYWxsIGltbWVkaWF0ZWx5IGJlZm9yZSByZXRyeWluZy5cbiAqIEBwYXJhbSBoYW5kbGVFcnJvciBUaGUgZnVuY3Rpb24gdG8gY2FsbCB3aGVuIGFuIGVycm9yIG9jY3Vycy5cbiAqIEBwYXJhbSByZXRyeUNvdW50IFRoZSBtYXhpbXVtIG51bWJlciBvZiByZXRyaWVzLlxuICogQHBhcmFtIHJldHJ5TG9nZ2VyIFRoZSBmdW5jdGlvbiB0byBsb2cgcmV0cnlpbmcuXG4gKiBAcGFyYW0gc2xlZXBNaWxsaXNlY29uZHMgVGhlIG51bWJlciBvZiBtaWxsaXNlY29uZHMgdG8gc2xlZXAgYmVmb3JlIHJldHJ5aW5nLlxuICogQHBhcmFtIHVwZGF0ZVNsZWVwTWlsbGlzZWNvbmRzIFRoZSBmdW5jdGlvbiB0byB1cGRhdGUgc2xlZXAgbWlsbGlzZWNvbmRzIGFmdGVyIGVhY2ggcmV0cnkuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiB3aXRoUmV0cnk8VD4oXG4gIGZ1bmM6IChmYWlsZWRDb3VudDogbnVtYmVyKSA9PiBUIHwgUHJvbWlzZTxUPixcbiAge1xuICAgIGJlZm9yZVJldHJ5LFxuICAgIGhhbmRsZUVycm9yLFxuICAgIHJldHJ5Q291bnQgPSAzLFxuICAgIHJldHJ5TG9nZ2VyLFxuICAgIHNob3VsZFJldHJ5LFxuICAgIHNsZWVwTWlsbGlzZWNvbmRzID0gMCxcbiAgICB1cGRhdGVTbGVlcE1pbGxpc2Vjb25kcyxcbiAgfTogUmV0cnlPcHRpb25zID0ge31cbik6IFByb21pc2U8VD4ge1xuICBsZXQgZmFpbGVkQ291bnQgPSAwO1xuICBmb3IgKDs7KSB7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiBhd2FpdCBmdW5jKGZhaWxlZENvdW50KTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgYXdhaXQgaGFuZGxlRXJyb3I/LihlcnJvcik7XG4gICAgICBmYWlsZWRDb3VudCsrO1xuICAgICAgaWYgKGZhaWxlZENvdW50ID49IHJldHJ5Q291bnQpIHtcbiAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICB9XG4gICAgICBpZiAoc2hvdWxkUmV0cnkgJiYgIXNob3VsZFJldHJ5KGVycm9yKSkge1xuICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgIH1cbiAgICAgIGlmIChzbGVlcE1pbGxpc2Vjb25kcyA+IDApIHtcbiAgICAgICAgYXdhaXQgc2xlZXAoc2xlZXBNaWxsaXNlY29uZHMpO1xuICAgICAgfVxuICAgICAgaWYgKHVwZGF0ZVNsZWVwTWlsbGlzZWNvbmRzKSB7XG4gICAgICAgIHNsZWVwTWlsbGlzZWNvbmRzID0gdXBkYXRlU2xlZXBNaWxsaXNlY29uZHMoc2xlZXBNaWxsaXNlY29uZHMpO1xuICAgICAgfVxuICAgICAgcmV0cnlMb2dnZXI/LihgUmV0cnkgZHVlIHRvOiAke2Vycm9yfVxuJHtlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gJy0tLVxcbicgKyAoZXJyb3Iuc3RhY2sgPz8gJycpIDogJyd9YCk7XG4gICAgICBhd2FpdCBiZWZvcmVSZXRyeT8uKGVycm9yKTtcbiAgICB9XG4gIH1cbn1cbiIsImNsYXNzIE9wdGlvbnMge1xuICBpc1ZlcmJvc2UgPSBmYWxzZTtcbiAgZG9lc1VwbG9hZEVudlZhcnMgPSBmYWxzZTtcbn1cblxuZXhwb3J0IGNvbnN0IG9wdGlvbnMgPSBuZXcgT3B0aW9ucygpO1xuIiwiaW1wb3J0IHsgb3B0aW9ucyB9IGZyb20gJy4vb3B0aW9ucy5qcyc7XG5cbmNsYXNzIExvZ2dlciB7XG4gIGFzeW5jIGZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24obmFtZTogc3RyaW5nLCBmdW5jOiAoKSA9PiBQcm9taXNlPHZvaWQ+KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKG9wdGlvbnMuaXNWZXJib3NlKSB7XG4gICAgICBjb25zb2xlLmluZm8oYC0tLS0tLS0tLSAke25hbWV9IHN0YXJ0IC0tLS0tLS0tLWApO1xuICAgIH1cbiAgICB0cnkge1xuICAgICAgYXdhaXQgZnVuYygpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBjb25zb2xlLmluZm8oYEVycm9yIG9jY3VycmVkIGluICR7bmFtZX06ICR7ZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLnN0YWNrIDogU3RyaW5nKGVycm9yKX19YCk7XG4gICAgfVxuICAgIGlmIChvcHRpb25zLmlzVmVyYm9zZSkge1xuICAgICAgY29uc29sZS5pbmZvKGAtLS0tLS0tLS0tICR7bmFtZX0gZW5kIC0tLS0tLS0tLS1gKTtcbiAgICB9XG4gIH1cbn1cblxuZXhwb3J0IGNvbnN0IGxvZ2dlciA9IG5ldyBMb2dnZXIoKTtcbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmV4cG9ydCBjb25zdCBmc1V0aWwgPSB7XG4gIGFzeW5jIHJlYWRGaWxlSWdub3JpbmdFcnJvcihmaWxlUGF0aDogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmcgfCB1bmRlZmluZWQ+IHtcbiAgICB0cnkge1xuICAgICAgcmV0dXJuIGF3YWl0IGZzLnByb21pc2VzLnJlYWRGaWxlKGZpbGVQYXRoLCAndXRmOCcpO1xuICAgIH0gY2F0Y2gge1xuICAgICAgLy8gZG8gbm90aGluZ1xuICAgIH1cbiAgfSxcbiAgYXN5bmMgZ2VuZXJhdGVGaWxlKGZpbGVQYXRoOiBzdHJpbmcsIGNvbnRlbnQ6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgIGF3YWl0IGZzLnByb21pc2VzLm1rZGlyKHBhdGguZGlybmFtZShmaWxlUGF0aCksIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICAgIGxldCBub3JtYWxpemVkQ29udGVudCA9IGNvbnRlbnQudHJpbSgpO1xuICAgIGlmIChub3JtYWxpemVkQ29udGVudCkge1xuICAgICAgbm9ybWFsaXplZENvbnRlbnQgKz0gJ1xcbic7XG4gICAgfVxuICAgIGF3YWl0IGZzLnByb21pc2VzLndyaXRlRmlsZShmaWxlUGF0aCwgbm9ybWFsaXplZENvbnRlbnQpO1xuICAgIGNvbnNvbGUubG9nKGBHZW5lcmF0ZWQvVXBkYXRlZCAke2ZpbGVQYXRofWApO1xuICB9LFxufTtcbiIsImltcG9ydCB7IFByb21pc2VQb29sIH0gZnJvbSAnbWluaW1hbC1wcm9taXNlLXBvb2wnO1xuXG5leHBvcnQgY29uc3QgcHJvbWlzZVBvb2wgPSBuZXcgUHJvbWlzZVBvb2woKTtcbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB0cyBmcm9tICd0eXBlc2NyaXB0JztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZnNVdGlsIH0gZnJvbSAnLi4vdXRpbHMvZnNVdGlsLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZml4TmV4dENvbmZpZ0pzb24oY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZml4TmV4dENvbmZpZ0pzb24nLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgZmlsZVBhdGggPSBbJ2pzJywgJ21qcycsICdjanMnXVxuICAgICAgLm1hcCgoZXh0KSA9PiBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsIGBuZXh0LmNvbmZpZy4ke2V4dH1gKSlcbiAgICAgIC5maW5kKChwKSA9PiBmcy5leGlzdHNTeW5jKHApKTtcbiAgICBpZiAoIWZpbGVQYXRoKSByZXR1cm47XG5cbiAgICBjb25zdCBvbGRDb250ZW50ID0gYXdhaXQgZnMucHJvbWlzZXMucmVhZEZpbGUoZmlsZVBhdGgsICd1dGY4Jyk7XG4gICAgY29uc3Qgb2JqZWN0TGl0ZXJhbCA9IGdldE5leHRDb25maWdPYmplY3RMaXRlcmFsKG9sZENvbnRlbnQpO1xuICAgIGlmICghb2JqZWN0TGl0ZXJhbCkgcmV0dXJuO1xuXG4gICAgY29uc3QgZXhpc3RpbmdQcm9wZXJ0aWVzID0gbmV3IFNldChvYmplY3RMaXRlcmFsLnByb3BlcnRpZXMubWFwKChwcm9wZXJ0eSkgPT4gcHJvcGVydHkubmFtZT8uZ2V0VGV4dCgpKSk7XG4gICAgY29uc3QgcHJvcGVydHlUZXh0czogc3RyaW5nW10gPSBbXTtcbiAgICBpZiAoIWV4aXN0aW5nUHJvcGVydGllcy5oYXMoJ3R5cGVzY3JpcHQnKSkge1xuICAgICAgcHJvcGVydHlUZXh0cy5wdXNoKCd0eXBlc2NyaXB0OiB7IGlnbm9yZUJ1aWxkRXJyb3JzOiB0cnVlIH0nKTtcbiAgICB9XG4gICAgaWYgKHByb3BlcnR5VGV4dHMubGVuZ3RoID09PSAwKSByZXR1cm47XG5cbiAgICBjb25zdCBpbnNlcnRpb25Qb2ludCA9IG9iamVjdExpdGVyYWwuZ2V0RW5kKCkgLSAxO1xuICAgIGNvbnN0IGxhc3RQcm9wZXJ0eSA9IG9iamVjdExpdGVyYWwucHJvcGVydGllcy5hdCgtMSk7XG4gICAgY29uc3QgaGFzVHJhaWxpbmdDb21tYSA9IGxhc3RQcm9wZXJ0eVxuICAgICAgPyBvbGRDb250ZW50LnNsaWNlKGxhc3RQcm9wZXJ0eS5nZXRFbmQoKSwgaW5zZXJ0aW9uUG9pbnQpLmluY2x1ZGVzKCcsJylcbiAgICAgIDogZmFsc2U7XG4gICAgY29uc3QgcHJlZml4ID0gb2JqZWN0TGl0ZXJhbC5wcm9wZXJ0aWVzLmxlbmd0aCA+IDAgJiYgIWhhc1RyYWlsaW5nQ29tbWEgPyAnLCAnIDogJyc7XG4gICAgY29uc3QgbmV3Q29udGVudCA9IGAke29sZENvbnRlbnQuc2xpY2UoMCwgaW5zZXJ0aW9uUG9pbnQpfSR7cHJlZml4fSR7cHJvcGVydHlUZXh0cy5qb2luKCcsICcpfSR7b2xkQ29udGVudC5zbGljZShcbiAgICAgIGluc2VydGlvblBvaW50XG4gICAgKX1gO1xuICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiBmc1V0aWwuZ2VuZXJhdGVGaWxlKGZpbGVQYXRoLCBuZXdDb250ZW50KSk7XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBnZXROZXh0Q29uZmlnT2JqZWN0TGl0ZXJhbChjb250ZW50OiBzdHJpbmcpOiB0cy5PYmplY3RMaXRlcmFsRXhwcmVzc2lvbiB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IHNvdXJjZSA9IHRzLmNyZWF0ZVNvdXJjZUZpbGUoJ25leHQuY29uZmlnLmpzJywgY29udGVudCwgdHMuU2NyaXB0VGFyZ2V0LkxhdGVzdCwgdHJ1ZSwgdHMuU2NyaXB0S2luZC5KUyk7XG4gIGxldCBvYmplY3RMaXRlcmFsOiB0cy5PYmplY3RMaXRlcmFsRXhwcmVzc2lvbiB8IHVuZGVmaW5lZDtcbiAgY29uc3QgdmlzaXQgPSAobm9kZTogdHMuTm9kZSk6IHZvaWQgPT4ge1xuICAgIGlmIChvYmplY3RMaXRlcmFsKSByZXR1cm47XG4gICAgaWYgKHRzLmlzRXhwb3J0QXNzaWdubWVudChub2RlKSAmJiB0cy5pc09iamVjdExpdGVyYWxFeHByZXNzaW9uKG5vZGUuZXhwcmVzc2lvbikpIHtcbiAgICAgIG9iamVjdExpdGVyYWwgPSBub2RlLmV4cHJlc3Npb247XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmIChcbiAgICAgIHRzLmlzQmluYXJ5RXhwcmVzc2lvbihub2RlKSAmJlxuICAgICAgbm9kZS5vcGVyYXRvclRva2VuLmtpbmQgPT09IHRzLlN5bnRheEtpbmQuRXF1YWxzVG9rZW4gJiZcbiAgICAgIG5vZGUubGVmdC5nZXRUZXh0KHNvdXJjZSkgPT09ICdtb2R1bGUuZXhwb3J0cycgJiZcbiAgICAgIHRzLmlzT2JqZWN0TGl0ZXJhbEV4cHJlc3Npb24obm9kZS5yaWdodClcbiAgICApIHtcbiAgICAgIG9iamVjdExpdGVyYWwgPSBub2RlLnJpZ2h0O1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0cy5mb3JFYWNoQ2hpbGQobm9kZSwgdmlzaXQpO1xuICB9O1xuICB2aXNpdChzb3VyY2UpO1xuICByZXR1cm4gb2JqZWN0TGl0ZXJhbDtcbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB0cyBmcm9tICd0eXBlc2NyaXB0JztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZnNVdGlsIH0gZnJvbSAnLi4vdXRpbHMvZnNVdGlsLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuXG50eXBlIFBhcnNlZFZhbHVlID1cbiAgfCB7IGtpbmQ6ICdhcnJheSc7IHZhbHVlOiBQYXJzZWRWYWx1ZVtdIH1cbiAgfCB7IGtpbmQ6ICdsaXRlcmFsJzsgdmFsdWU6IHN0cmluZyB9XG4gIHwgeyBraW5kOiAnb2JqZWN0JzsgdmFsdWU6IFBhcnNlZE9iamVjdCB9O1xudHlwZSBPYmplY3RNZW1iZXIgPSB7IGtpbmQ6ICdleHRyYSc7IGluZGV4OiBudW1iZXIgfSB8IHsga2luZDogJ3Byb3BlcnR5Jzsga2V5OiBzdHJpbmcgfTtcbmludGVyZmFjZSBQYXJzZWRPYmplY3Qge1xuICBleHRyYU1lbWJlcnM6IHN0cmluZ1tdO1xuICBtZW1iZXJPcmRlcjogT2JqZWN0TWVtYmVyW107XG4gIHByb3BlcnRpZXM6IFJlY29yZDxzdHJpbmcsIFBhcnNlZFZhbHVlPjtcbn1cbmludGVyZmFjZSBFeHRyYWN0ZWRPYmplY3RMaXRlcmFsIHtcbiAgc291cmNlOiB0cy5Tb3VyY2VGaWxlO1xuICBub2RlOiB0cy5PYmplY3RMaXRlcmFsRXhwcmVzc2lvbjtcbn1cblxuY29uc3QgbGl0ZXJhbCA9ICh2YWx1ZTogc3RyaW5nKTogUGFyc2VkVmFsdWUgPT4gKHsga2luZDogJ2xpdGVyYWwnLCB2YWx1ZSB9KTtcbmNvbnN0IGFzQXJyYXkgPSAodmFsdWU6IFBhcnNlZFZhbHVlW10pOiBQYXJzZWRWYWx1ZSA9PiAoeyBraW5kOiAnYXJyYXknLCB2YWx1ZSB9KTtcbmNvbnN0IGFzT2JqZWN0ID0gKHByb3BlcnRpZXM6IFJlY29yZDxzdHJpbmcsIFBhcnNlZFZhbHVlPiwgZXh0cmFNZW1iZXJzOiBzdHJpbmdbXSA9IFtdKTogUGFyc2VkVmFsdWUgPT4gKHtcbiAga2luZDogJ29iamVjdCcsXG4gIHZhbHVlOiB0b1BhcnNlZE9iamVjdChwcm9wZXJ0aWVzLCBleHRyYU1lbWJlcnMpLFxufSk7XG5cbmNvbnN0IGRlZmF1bHRDb25maWcgPSB0b1BhcnNlZE9iamVjdCh7XG4gIGZvcmJpZE9ubHk6IGxpdGVyYWwoJyEhcHJvY2Vzcy5lbnYuQ0knKSxcbiAgcmV0cmllczogbGl0ZXJhbCgncHJvY2Vzcy5lbnYuUFdERUJVRyA/IDAgOiBwcm9jZXNzLmVudi5DSSA/IDUgOiAxJyksXG4gIHVzZTogYXNPYmplY3Qoe1xuICAgIGJhc2VVUkw6IGxpdGVyYWwoJ3Byb2Nlc3MuZW52Lk5FWFRfUFVCTElDX0JBU0VfVVJMJyksXG4gICAgdHJhY2U6IGxpdGVyYWwoXCJwcm9jZXNzLmVudi5DSSA/ICdvbi1maXJzdC1yZXRyeScgOiAncmV0YWluLW9uLWZhaWx1cmUnXCIpLFxuICAgIHNjcmVlbnNob3Q6IGxpdGVyYWwoXCJwcm9jZXNzLmVudi5DSSA/ICdvbmx5LW9uLWZhaWx1cmUnIDogJ29ubHktb24tZmFpbHVyZSdcIiksXG4gICAgdmlkZW86IGxpdGVyYWwoXCJwcm9jZXNzLmVudi5DSSA/ICdyZXRhaW4tb24tZmFpbHVyZScgOiAncmV0YWluLW9uLWZhaWx1cmUnXCIpLFxuICB9KSxcbiAgd2ViU2VydmVyOiBhc09iamVjdCh7XG4gICAgY29tbWFuZDogbGl0ZXJhbChcIid5YXJuIHN0YXJ0LXRlc3Qtc2VydmVyJ1wiKSxcbiAgICB1cmw6IGxpdGVyYWwoJ3Byb2Nlc3MuZW52Lk5FWFRfUFVCTElDX0JBU0VfVVJMJyksXG4gICAgcmV1c2VFeGlzdGluZ1NlcnZlcjogbGl0ZXJhbCgnISFwcm9jZXNzLmVudi5DSScpLFxuICAgIHRpbWVvdXQ6IGxpdGVyYWwoJzMwMF8wMDAnKSxcbiAgICBzdGRvdXQ6IGxpdGVyYWwoXCIncGlwZSdcIiksXG4gICAgc3RkZXJyOiBsaXRlcmFsKFwiJ3BpcGUnXCIpLFxuICAgIGVudjogbGl0ZXJhbChge1xuICAuLi5wcm9jZXNzLmVudixcbiAgUFJJU01BX1VTRVJfQ09OU0VOVF9GT1JfREFOR0VST1VTX0FJX0FDVElPTjogJ3RydWUnLFxufWApLFxuICAgIGdyYWNlZnVsU2h1dGRvd246IGxpdGVyYWwoYHtcbiAgc2lnbmFsOiAnU0lHVEVSTScsXG4gIHRpbWVvdXQ6IDUwMCxcbn1gKSxcbiAgfSksXG59KTtcblxuZnVuY3Rpb24gdG9QYXJzZWRPYmplY3QocHJvcGVydGllczogUmVjb3JkPHN0cmluZywgUGFyc2VkVmFsdWU+LCBleHRyYU1lbWJlcnM6IHN0cmluZ1tdID0gW10pOiBQYXJzZWRPYmplY3Qge1xuICByZXR1cm4ge1xuICAgIGV4dHJhTWVtYmVycyxcbiAgICBtZW1iZXJPcmRlcjogW1xuICAgICAgLi4uT2JqZWN0LmtleXMocHJvcGVydGllcykubWFwKChrZXkpOiBPYmplY3RNZW1iZXIgPT4gKHsga2luZDogJ3Byb3BlcnR5Jywga2V5IH0pKSxcbiAgICAgIC4uLmV4dHJhTWVtYmVycy5tYXAoKF8sIGluZGV4KTogT2JqZWN0TWVtYmVyID0+ICh7IGtpbmQ6ICdleHRyYScsIGluZGV4IH0pKSxcbiAgICBdLFxuICAgIHByb3BlcnRpZXMsXG4gIH07XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBmaXhQbGF5d3JpZ2h0Q29uZmlnKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBmaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgYHBsYXl3cmlnaHQuY29uZmlnLnRzYCk7XG4gIGlmICghZnMuZXhpc3RzU3luYyhmaWxlUGF0aCkpIHJldHVybjtcblxuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2ZpeFBsYXl3cmlnaHRDb25maWcnLCBhc3luYyAoKSA9PiB7XG4gICAgYXdhaXQgYXNzZXJ0TmV4dFB1YmxpY0Jhc2VVcmwoY29uZmlnLmRpclBhdGgpO1xuXG4gICAgY29uc3Qgb2xkQ29udGVudCA9IGF3YWl0IGZzLnByb21pc2VzLnJlYWRGaWxlKGZpbGVQYXRoLCAndXRmOCcpO1xuICAgIGNvbnN0IGV4dHJhY3RlZE9iamVjdExpdGVyYWwgPSBleHRyYWN0RGVmaW5lQ29uZmlnT2JqZWN0TGl0ZXJhbChvbGRDb250ZW50KTtcbiAgICBpZiAoIWV4dHJhY3RlZE9iamVjdExpdGVyYWwpIHJldHVybjtcblxuICAgIGNvbnN0IHBhcnNlZCA9IHBhcnNlT2JqZWN0TGl0ZXJhbEV4cHJlc3Npb24oZXh0cmFjdGVkT2JqZWN0TGl0ZXJhbC5ub2RlLCBleHRyYWN0ZWRPYmplY3RMaXRlcmFsLnNvdXJjZSk7XG4gICAgaWYgKCFwYXJzZWQpIHJldHVybjtcblxuICAgIC8vIEtlZXAgZmlsbGluZyBtaXNzaW5nIGRlZmF1bHRzLCBidXQgZG9uJ3Qgb3ZlcndyaXRlIGxvY2FsIGFkanVzdG1lbnRzIG9uIGV2ZXJ5IHJlZ2VuZXJhdGlvbi5cbiAgICBjb25zdCBtZXJnZWQgPSBtZXJnZVBhcnNlZE9iamVjdHMoZGVmYXVsdENvbmZpZywgcGFyc2VkKTtcbiAgICBjb25zdCBoYXNTdGFydFRlc3RTZXJ2ZXIgPSBCb29sZWFuKGNvbmZpZy5wYWNrYWdlSnNvbj8uc2NyaXB0cz8uWydzdGFydC10ZXN0LXNlcnZlciddKTtcbiAgICBjb25zdCBoYXNFeGlzdGluZ1dlYlNlcnZlciA9IEJvb2xlYW4ocGFyc2VkLnByb3BlcnRpZXMud2ViU2VydmVyKTtcbiAgICAvLyBPbmx5IGRyb3Agd2JmeSdzIGRlZmF1bHQgc2VydmVyIGNvbW1hbmQuIFJlcG9zIHdpdGggY3VzdG9tIFBsYXl3cmlnaHRcbiAgICAvLyBzZXJ2ZXIgc2V0dXAgc3RpbGwgbmVlZCBpdCBldmVuIHdoZW4gdGhleSBkbyBub3QgZXhwb3NlIHN0YXJ0LXRlc3Qtc2VydmVyLlxuICAgIGlmICghaGFzU3RhcnRUZXN0U2VydmVyICYmICFoYXNFeGlzdGluZ1dlYlNlcnZlcikge1xuICAgICAgZGVsZXRlIG1lcmdlZC5wcm9wZXJ0aWVzLndlYlNlcnZlcjtcbiAgICB9XG4gICAgc2V0V2ViU2VydmVyQ29tbWFuZChjb25maWcsIG1lcmdlZCk7XG5cbiAgICBjb25zdCBuZXdPYmplY3RMaXRlcmFsID0gc3RyaW5naWZ5VmFsdWUoeyBraW5kOiAnb2JqZWN0JywgdmFsdWU6IG1lcmdlZCB9LCAwKTtcbiAgICBjb25zdCBzdGFydCA9IGV4dHJhY3RlZE9iamVjdExpdGVyYWwubm9kZS5nZXRTdGFydChleHRyYWN0ZWRPYmplY3RMaXRlcmFsLnNvdXJjZSk7XG4gICAgY29uc3QgZW5kID0gZXh0cmFjdGVkT2JqZWN0TGl0ZXJhbC5ub2RlLmdldEVuZCgpO1xuICAgIGNvbnN0IG5ld0NvbnRlbnQgPSBgJHtvbGRDb250ZW50LnNsaWNlKDAsIHN0YXJ0KX0ke25ld09iamVjdExpdGVyYWx9JHtvbGRDb250ZW50LnNsaWNlKGVuZCl9YDtcblxuICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiBmc1V0aWwuZ2VuZXJhdGVGaWxlKGZpbGVQYXRoLCBuZXdDb250ZW50KSk7XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBtZXJnZVBhcnNlZE9iamVjdHMoYmFzZTogUGFyc2VkT2JqZWN0LCBvdmVycmlkZTogUGFyc2VkT2JqZWN0KTogUGFyc2VkT2JqZWN0IHtcbiAgY29uc3Qgb3ZlcnJpZGVQcm9wZXJ0eUtleXMgPSBuZXcgU2V0KE9iamVjdC5rZXlzKG92ZXJyaWRlLnByb3BlcnRpZXMpKTtcbiAgY29uc3QgZXh0cmFNZW1iZXJzID0gWy4uLmJhc2UuZXh0cmFNZW1iZXJzLCAuLi5vdmVycmlkZS5leHRyYU1lbWJlcnNdO1xuICAvLyBLZWVwIGRlZmF1bHQtb25seSBtZW1iZXJzIGJlZm9yZSBwYXJzZWQgbWVtYmVycyBzbyBzcHJlYWRzIGFuZCBleHBsaWNpdCBsb2NhbCBwcm9wZXJ0aWVzIHJldGFpbiBwcmVjZWRlbmNlLlxuICBjb25zdCBtZW1iZXJPcmRlciA9IFtcbiAgICAuLi5iYXNlLm1lbWJlck9yZGVyLmZpbHRlcigobWVtYmVyKSA9PiBtZW1iZXIua2luZCAhPT0gJ3Byb3BlcnR5JyB8fCAhb3ZlcnJpZGVQcm9wZXJ0eUtleXMuaGFzKG1lbWJlci5rZXkpKSxcbiAgICAuLi5vdmVycmlkZS5tZW1iZXJPcmRlci5tYXAoKG1lbWJlcik6IE9iamVjdE1lbWJlciA9PiB7XG4gICAgICBpZiAobWVtYmVyLmtpbmQgPT09ICdwcm9wZXJ0eScpIHJldHVybiBtZW1iZXI7XG4gICAgICByZXR1cm4geyBraW5kOiAnZXh0cmEnLCBpbmRleDogYmFzZS5leHRyYU1lbWJlcnMubGVuZ3RoICsgbWVtYmVyLmluZGV4IH07XG4gICAgfSksXG4gIF07XG4gIGNvbnN0IHByb3BlcnRpZXMgPSB7IC4uLmJhc2UucHJvcGVydGllcyB9O1xuICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhvdmVycmlkZS5wcm9wZXJ0aWVzKSkge1xuICAgIHByb3BlcnRpZXNba2V5XSA9IG1lcmdlUGFyc2VkVmFsdWUocHJvcGVydGllc1trZXldLCB2YWx1ZSk7XG4gIH1cbiAgcmV0dXJuIHsgZXh0cmFNZW1iZXJzLCBtZW1iZXJPcmRlciwgcHJvcGVydGllcyB9O1xufVxuXG5mdW5jdGlvbiBtZXJnZVBhcnNlZFZhbHVlKGJhc2U6IFBhcnNlZFZhbHVlIHwgdW5kZWZpbmVkLCBvdmVycmlkZTogUGFyc2VkVmFsdWUpOiBQYXJzZWRWYWx1ZSB7XG4gIGlmIChiYXNlPy5raW5kID09PSAnb2JqZWN0JyAmJiBvdmVycmlkZS5raW5kID09PSAnb2JqZWN0Jykge1xuICAgIHJldHVybiB7IGtpbmQ6ICdvYmplY3QnLCB2YWx1ZTogbWVyZ2VQYXJzZWRPYmplY3RzKGJhc2UudmFsdWUsIG92ZXJyaWRlLnZhbHVlKSB9O1xuICB9XG4gIHJldHVybiBvdmVycmlkZTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gYXNzZXJ0TmV4dFB1YmxpY0Jhc2VVcmwoZGlyUGF0aDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gIGZvciAoY29uc3QgZW52RmlsZVBhdGggb2YgZ2V0RW52RmlsZVBhdGhzKGRpclBhdGgpKSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGNvbnRlbnQgPSBhd2FpdCBmcy5wcm9taXNlcy5yZWFkRmlsZShlbnZGaWxlUGF0aCwgJ3V0ZjgnKTtcbiAgICAgIGlmICgvTkVYVF9QVUJMSUNfQkFTRV9VUkxcXHMqPS9tLnRlc3QoY29udGVudCkpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgIH0gY2F0Y2gge1xuICAgICAgLy8gTWlzc2luZyBlbnYgZmlsZXMgYXJlIGV4cGVjdGVkIGluIHNvbWUgcmVwb3MuXG4gICAgfVxuICB9XG5cbiAgdGhyb3cgbmV3IEVycm9yKCdORVhUX1BVQkxJQ19CQVNFX1VSTCBpcyByZXF1aXJlZCBmb3IgUGxheXdyaWdodC4gRGVmaW5lIE5FWFRfUFVCTElDX0JBU0VfVVJMIGluIHRoZSB0YXJnZXQgcmVwby4nKTtcbn1cblxuZnVuY3Rpb24gZ2V0RW52RmlsZVBhdGhzKGRpclBhdGg6IHN0cmluZyk6IHN0cmluZ1tdIHtcbiAgY29uc3QgZW52RmlsZU5hbWVzID0gWycuZW52JywgJy5lbnYudGVzdCcsICcuZW52LmV4YW1wbGUnLCAnbWlzZS50b21sJywgJ21pc2UudGVzdC50b21sJ107XG4gIGNvbnN0IGVudkZpbGVQYXRoczogc3RyaW5nW10gPSBbXTtcblxuICBmb3IgKGxldCBjdXJyZW50RGlyUGF0aCA9IHBhdGgucmVzb2x2ZShkaXJQYXRoKTsgOyBjdXJyZW50RGlyUGF0aCA9IHBhdGguZGlybmFtZShjdXJyZW50RGlyUGF0aCkpIHtcbiAgICBlbnZGaWxlUGF0aHMucHVzaCguLi5lbnZGaWxlTmFtZXMubWFwKChmaWxlTmFtZSkgPT4gcGF0aC5yZXNvbHZlKGN1cnJlbnREaXJQYXRoLCBmaWxlTmFtZSkpKTtcblxuICAgIC8vIFBsYXl3cmlnaHQgY29uZmlncyBvZnRlbiBsaXZlIGluIHBhY2thZ2VzLyogd2hpbGUgc2hhcmVkIGVudiBmaWxlcyBsaXZlIGF0IHRoZVxuICAgIC8vIHJlcG9zaXRvcnkgcm9vdCwgc28gd2FsayB1cHdhcmQgdW50aWwgdGhlIHRhcmdldCByZXBvIGJvdW5kYXJ5LlxuICAgIGlmIChmcy5leGlzdHNTeW5jKHBhdGgucmVzb2x2ZShjdXJyZW50RGlyUGF0aCwgJy5naXQnKSkpIGJyZWFrO1xuXG4gICAgY29uc3QgcGFyZW50RGlyUGF0aCA9IHBhdGguZGlybmFtZShjdXJyZW50RGlyUGF0aCk7XG4gICAgaWYgKHBhcmVudERpclBhdGggPT09IGN1cnJlbnREaXJQYXRoKSBicmVhaztcbiAgfVxuXG4gIHJldHVybiBlbnZGaWxlUGF0aHM7XG59XG5cbmZ1bmN0aW9uIHNldFdlYlNlcnZlckNvbW1hbmQoY29uZmlnOiBQYWNrYWdlQ29uZmlnLCBvYmplY3Q6IFBhcnNlZE9iamVjdCk6IHZvaWQge1xuICBjb25zdCB3ZWJTZXJ2ZXIgPSBvYmplY3QucHJvcGVydGllcy53ZWJTZXJ2ZXI7XG4gIGlmICh3ZWJTZXJ2ZXI/LmtpbmQgIT09ICdvYmplY3QnKSByZXR1cm47XG5cbiAgLy8gd2JmeSBvd25zIHRoZSBwYWNrYWdlIHNjcmlwdCwgc28gUGxheXdyaWdodCBzaG91bGQgY29uc2lzdGVudGx5IGNhbGwgdGhhdFxuICAvLyBzY3JpcHQgd2hpbGUgcHJlc2VydmluZyB0aGUgcmVzdCBvZiBlYWNoIHJlcG9zaXRvcnkncyB3ZWJTZXJ2ZXIgc2V0dGluZ3MuXG4gIHdlYlNlcnZlci52YWx1ZS5wcm9wZXJ0aWVzLmNvbW1hbmQgPSBsaXRlcmFsKGNvbmZpZy5pc0J1biA/IFwiJ2J1biBzdGFydC10ZXN0LXNlcnZlcidcIiA6IFwiJ3lhcm4gc3RhcnQtdGVzdC1zZXJ2ZXInXCIpO1xufVxuXG5mdW5jdGlvbiBleHRyYWN0RGVmaW5lQ29uZmlnT2JqZWN0TGl0ZXJhbChjb250ZW50OiBzdHJpbmcpOiBFeHRyYWN0ZWRPYmplY3RMaXRlcmFsIHwgdW5kZWZpbmVkIHtcbiAgY29uc3Qgc291cmNlID0gdHMuY3JlYXRlU291cmNlRmlsZSgncGxheXdyaWdodC5jb25maWcudHMnLCBjb250ZW50LCB0cy5TY3JpcHRUYXJnZXQuTGF0ZXN0LCB0cnVlLCB0cy5TY3JpcHRLaW5kLlRTKTtcblxuICAvLyBUeXBlU2NyaXB0IGFscmVhZHkgdW5kZXJzdGFuZHMgbmVzdGVkIG9iamVjdCBsaXRlcmFscyBhbmQgdGVtcGxhdGUgc3RyaW5ncywgc28gdXNlXG4gIC8vIGl0cyBBU1QgcmFuZ2VzIGluc3RlYWQgb2YgYSByZWdleCB0aGF0IGNhbiBzdG9wIGF0IHRoZSBmaXJzdCBpbm5lciBjbG9zaW5nIGJyYWNlLlxuICBsZXQgZm91bmQ6IHRzLk9iamVjdExpdGVyYWxFeHByZXNzaW9uIHwgdW5kZWZpbmVkO1xuICBjb25zdCB2aXNpdCA9IChub2RlOiB0cy5Ob2RlKTogdm9pZCA9PiB7XG4gICAgaWYgKGZvdW5kKSByZXR1cm47XG4gICAgaWYgKHRzLmlzQ2FsbEV4cHJlc3Npb24obm9kZSkgJiYgbm9kZS5leHByZXNzaW9uLmdldFRleHQoc291cmNlKSA9PT0gJ2RlZmluZUNvbmZpZycpIHtcbiAgICAgIGNvbnN0IGZpcnN0QXJndW1lbnQgPSBub2RlLmFyZ3VtZW50c1swXTtcbiAgICAgIGlmIChmaXJzdEFyZ3VtZW50ICYmIHRzLmlzT2JqZWN0TGl0ZXJhbEV4cHJlc3Npb24oZmlyc3RBcmd1bWVudCkpIHtcbiAgICAgICAgZm91bmQgPSBmaXJzdEFyZ3VtZW50O1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgfVxuICAgIHRzLmZvckVhY2hDaGlsZChub2RlLCB2aXNpdCk7XG4gIH07XG4gIHZpc2l0KHNvdXJjZSk7XG5cbiAgcmV0dXJuIGZvdW5kID8geyBzb3VyY2UsIG5vZGU6IGZvdW5kIH0gOiB1bmRlZmluZWQ7XG59XG5cbmZ1bmN0aW9uIHBhcnNlRXhwcmVzc2lvbihleHByZXNzaW9uOiB0cy5FeHByZXNzaW9uLCBzb3VyY2U6IHRzLlNvdXJjZUZpbGUpOiBQYXJzZWRWYWx1ZSB8IHVuZGVmaW5lZCB7XG4gIGlmICh0cy5pc09iamVjdExpdGVyYWxFeHByZXNzaW9uKGV4cHJlc3Npb24pKSB7XG4gICAgY29uc3QgcGFyc2VkT2JqZWN0ID0gcGFyc2VPYmplY3RMaXRlcmFsRXhwcmVzc2lvbihleHByZXNzaW9uLCBzb3VyY2UpO1xuICAgIHJldHVybiBwYXJzZWRPYmplY3QgPyB7IGtpbmQ6ICdvYmplY3QnLCB2YWx1ZTogcGFyc2VkT2JqZWN0IH0gOiBsaXRlcmFsKGV4cHJlc3Npb24uZ2V0VGV4dChzb3VyY2UpKTtcbiAgfVxuICBpZiAodHMuaXNBcnJheUxpdGVyYWxFeHByZXNzaW9uKGV4cHJlc3Npb24pKSB7XG4gICAgY29uc3QgZWxlbWVudHMgPSBleHByZXNzaW9uLmVsZW1lbnRzLm1hcCgoZWxlbWVudCkgPT4gcGFyc2VFeHByZXNzaW9uKGVsZW1lbnQsIHNvdXJjZSkpO1xuICAgIGlmIChlbGVtZW50cy5zb21lKChlbGVtZW50KTogZWxlbWVudCBpcyB1bmRlZmluZWQgPT4gZWxlbWVudCA9PT0gdW5kZWZpbmVkKSkge1xuICAgICAgcmV0dXJuIGxpdGVyYWwoZXhwcmVzc2lvbi5nZXRUZXh0KHNvdXJjZSkpO1xuICAgIH1cbiAgICByZXR1cm4gYXNBcnJheShlbGVtZW50cyBhcyBQYXJzZWRWYWx1ZVtdKTtcbiAgfVxuICByZXR1cm4gbGl0ZXJhbChleHByZXNzaW9uLmdldFRleHQoc291cmNlKSk7XG59XG5cbmZ1bmN0aW9uIHBhcnNlT2JqZWN0TGl0ZXJhbEV4cHJlc3Npb24oXG4gIG9iamVjdExpdGVyYWw6IHRzLk9iamVjdExpdGVyYWxFeHByZXNzaW9uLFxuICBzb3VyY2U6IHRzLlNvdXJjZUZpbGVcbik6IFBhcnNlZE9iamVjdCB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IHBhcnNlZDogUGFyc2VkT2JqZWN0ID0geyBleHRyYU1lbWJlcnM6IFtdLCBtZW1iZXJPcmRlcjogW10sIHByb3BlcnRpZXM6IHt9IH07XG4gIGZvciAoY29uc3QgcHJvcGVydHkgb2Ygb2JqZWN0TGl0ZXJhbC5wcm9wZXJ0aWVzKSB7XG4gICAgaWYgKHRzLmlzU2hvcnRoYW5kUHJvcGVydHlBc3NpZ25tZW50KHByb3BlcnR5KSkge1xuICAgICAgY29uc3Qga2V5ID0gcHJvcGVydHkubmFtZS5nZXRUZXh0KHNvdXJjZSk7XG4gICAgICBwYXJzZWQucHJvcGVydGllc1trZXldID0gbGl0ZXJhbChrZXkpO1xuICAgICAgcGFyc2VkLm1lbWJlck9yZGVyLnB1c2goeyBraW5kOiAncHJvcGVydHknLCBrZXkgfSk7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgaWYgKCF0cy5pc1Byb3BlcnR5QXNzaWdubWVudChwcm9wZXJ0eSkgfHwgKCF0cy5pc0lkZW50aWZpZXIocHJvcGVydHkubmFtZSkgJiYgIXRzLmlzU3RyaW5nTGl0ZXJhbChwcm9wZXJ0eS5uYW1lKSkpIHtcbiAgICAgIGNvbnN0IGluZGV4ID0gcGFyc2VkLmV4dHJhTWVtYmVycy5wdXNoKHByb3BlcnR5LmdldFRleHQoc291cmNlKSkgLSAxO1xuICAgICAgcGFyc2VkLm1lbWJlck9yZGVyLnB1c2goeyBraW5kOiAnZXh0cmEnLCBpbmRleCB9KTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBjb25zdCB2YWx1ZSA9IHBhcnNlRXhwcmVzc2lvbihwcm9wZXJ0eS5pbml0aWFsaXplciwgc291cmNlKTtcbiAgICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCkgcmV0dXJuO1xuICAgIGNvbnN0IGtleSA9IHByb3BlcnR5Lm5hbWUuZ2V0VGV4dChzb3VyY2UpO1xuICAgIHBhcnNlZC5wcm9wZXJ0aWVzW2tleV0gPSB2YWx1ZTtcbiAgICBwYXJzZWQubWVtYmVyT3JkZXIucHVzaCh7IGtpbmQ6ICdwcm9wZXJ0eScsIGtleSB9KTtcbiAgfVxuICByZXR1cm4gcGFyc2VkO1xufVxuXG5mdW5jdGlvbiBzdHJpbmdpZnlWYWx1ZSh2YWx1ZTogUGFyc2VkVmFsdWUsIGxldmVsOiBudW1iZXIpOiBzdHJpbmcge1xuICBjb25zdCBjbG9zaW5nSW5kZW50ID0gJyAgJy5yZXBlYXQobGV2ZWwpO1xuICBpZiAodmFsdWUua2luZCA9PT0gJ2FycmF5Jykge1xuICAgIGlmICh2YWx1ZS52YWx1ZS5sZW5ndGggPT09IDApIHJldHVybiAnW10nO1xuICAgIGNvbnN0IGluZGVudCA9ICcgICcucmVwZWF0KGxldmVsICsgMSk7XG4gICAgY29uc3QgbGluZXMgPSB2YWx1ZS52YWx1ZS5tYXAoKGl0ZW0pID0+IHtcbiAgICAgIGNvbnN0IHN0cmluZ2lmaWVkID0gc3RyaW5naWZ5VmFsdWUoaXRlbSwgbGV2ZWwgKyAxKS5zcGxpdCgnXFxuJyk7XG4gICAgICBzdHJpbmdpZmllZFtzdHJpbmdpZmllZC5sZW5ndGggLSAxXSA9IGAke3N0cmluZ2lmaWVkLmF0KC0xKX0sYDtcbiAgICAgIGlmIChpdGVtLmtpbmQgPT09ICdsaXRlcmFsJykge1xuICAgICAgICBmb3IgKGxldCBpbmRleCA9IDE7IGluZGV4IDwgc3RyaW5naWZpZWQubGVuZ3RoOyBpbmRleCArPSAxKSB7XG4gICAgICAgICAgc3RyaW5naWZpZWRbaW5kZXhdID0gYCR7aW5kZW50fSR7c3RyaW5naWZpZWRbaW5kZXhdfWA7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHN0cmluZ2lmaWVkWzBdID0gYCR7aW5kZW50fSR7c3RyaW5naWZpZWRbMF19YDtcbiAgICAgIHJldHVybiBzdHJpbmdpZmllZC5qb2luKCdcXG4nKTtcbiAgICB9KTtcbiAgICByZXR1cm4gYFtcXG4ke2xpbmVzLmpvaW4oJ1xcbicpfVxcbiR7Y2xvc2luZ0luZGVudH1dYDtcbiAgfVxuICBpZiAodmFsdWUua2luZCA9PT0gJ2xpdGVyYWwnKSByZXR1cm4gdmFsdWUudmFsdWU7XG5cbiAgY29uc3QgaW5kZW50ID0gJyAgJy5yZXBlYXQobGV2ZWwgKyAxKTtcbiAgY29uc3QgZW1pdHRlZFByb3BlcnRpZXMgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgY29uc3QgbGFzdFByb3BlcnR5SW5kZXhCeUtleSA9IGdldExhc3RQcm9wZXJ0eUluZGV4QnlLZXkodmFsdWUudmFsdWUubWVtYmVyT3JkZXIpO1xuICBjb25zdCBsaW5lcyA9IHZhbHVlLnZhbHVlLm1lbWJlck9yZGVyLmZsYXRNYXAoKG1lbWJlciwgaW5kZXgpID0+IHtcbiAgICBpZiAobWVtYmVyLmtpbmQgPT09ICdleHRyYScpIHtcbiAgICAgIHJldHVybiBbc3RyaW5naWZ5T2JqZWN0TWVtYmVyKHZhbHVlLnZhbHVlLmV4dHJhTWVtYmVyc1ttZW1iZXIuaW5kZXhdID8/ICcnLCBpbmRlbnQpXTtcbiAgICB9XG5cbiAgICBpZiAobGFzdFByb3BlcnR5SW5kZXhCeUtleS5nZXQobWVtYmVyLmtleSkgIT09IGluZGV4KSByZXR1cm4gW107XG4gICAgY29uc3QgaXRlbSA9IHZhbHVlLnZhbHVlLnByb3BlcnRpZXNbbWVtYmVyLmtleV07XG4gICAgaWYgKCFpdGVtIHx8IGVtaXR0ZWRQcm9wZXJ0aWVzLmhhcyhtZW1iZXIua2V5KSkgcmV0dXJuIFtdO1xuICAgIGVtaXR0ZWRQcm9wZXJ0aWVzLmFkZChtZW1iZXIua2V5KTtcbiAgICByZXR1cm4gW3N0cmluZ2lmeU9iamVjdFByb3BlcnR5KG1lbWJlci5rZXksIGl0ZW0sIGxldmVsLCBpbmRlbnQpXTtcbiAgfSk7XG4gIGxpbmVzLnB1c2goXG4gICAgLi4uT2JqZWN0LmVudHJpZXModmFsdWUudmFsdWUucHJvcGVydGllcylcbiAgICAgIC5maWx0ZXIoKFtrZXldKSA9PiAhZW1pdHRlZFByb3BlcnRpZXMuaGFzKGtleSkpXG4gICAgICAubWFwKChba2V5LCBpdGVtXSkgPT4gc3RyaW5naWZ5T2JqZWN0UHJvcGVydHkoa2V5LCBpdGVtLCBsZXZlbCwgaW5kZW50KSlcbiAgKTtcbiAgaWYgKGxpbmVzLmxlbmd0aCA9PT0gMCkgcmV0dXJuIGB7XFxuJHtjbG9zaW5nSW5kZW50fX1gO1xuICByZXR1cm4gYHtcXG4ke2xpbmVzLmpvaW4oJ1xcbicpfVxcbiR7Y2xvc2luZ0luZGVudH19YDtcbn1cblxuZnVuY3Rpb24gZ2V0TGFzdFByb3BlcnR5SW5kZXhCeUtleShtZW1iZXJPcmRlcjogT2JqZWN0TWVtYmVyW10pOiBNYXA8c3RyaW5nLCBudW1iZXI+IHtcbiAgY29uc3QgbGFzdFByb3BlcnR5SW5kZXhCeUtleSA9IG5ldyBNYXA8c3RyaW5nLCBudW1iZXI+KCk7XG4gIGZvciAoY29uc3QgW2luZGV4LCBtZW1iZXJdIG9mIG1lbWJlck9yZGVyLmVudHJpZXMoKSkge1xuICAgIGlmIChtZW1iZXIua2luZCA9PT0gJ3Byb3BlcnR5Jykge1xuICAgICAgbGFzdFByb3BlcnR5SW5kZXhCeUtleS5zZXQobWVtYmVyLmtleSwgaW5kZXgpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gbGFzdFByb3BlcnR5SW5kZXhCeUtleTtcbn1cblxuZnVuY3Rpb24gc3RyaW5naWZ5T2JqZWN0UHJvcGVydHkoa2V5OiBzdHJpbmcsIGl0ZW06IFBhcnNlZFZhbHVlLCBsZXZlbDogbnVtYmVyLCBpbmRlbnQ6IHN0cmluZyk6IHN0cmluZyB7XG4gIGNvbnN0IHN0cmluZ2lmaWVkID0gc3RyaW5naWZ5VmFsdWUoaXRlbSwgbGV2ZWwgKyAxKS5zcGxpdCgnXFxuJyk7XG4gIHN0cmluZ2lmaWVkW3N0cmluZ2lmaWVkLmxlbmd0aCAtIDFdID0gYCR7c3RyaW5naWZpZWQuYXQoLTEpfSxgO1xuICBpZiAoaXRlbS5raW5kID09PSAnbGl0ZXJhbCcpIHtcbiAgICBmb3IgKGxldCBpbmRleCA9IDE7IGluZGV4IDwgc3RyaW5naWZpZWQubGVuZ3RoOyBpbmRleCArPSAxKSB7XG4gICAgICBzdHJpbmdpZmllZFtpbmRleF0gPSBgJHtpbmRlbnR9JHtzdHJpbmdpZmllZFtpbmRleF19YDtcbiAgICB9XG4gIH1cbiAgc3RyaW5naWZpZWRbMF0gPSBgJHtpbmRlbnR9JHtrZXl9OiAke3N0cmluZ2lmaWVkWzBdfWA7XG4gIHJldHVybiBzdHJpbmdpZmllZC5qb2luKCdcXG4nKTtcbn1cblxuZnVuY3Rpb24gc3RyaW5naWZ5T2JqZWN0TWVtYmVyKG1lbWJlcjogc3RyaW5nLCBpbmRlbnQ6IHN0cmluZyk6IHN0cmluZyB7XG4gIGNvbnN0IHN0cmluZ2lmaWVkID0gbWVtYmVyLnNwbGl0KCdcXG4nKTtcbiAgc3RyaW5naWZpZWRbc3RyaW5naWZpZWQubGVuZ3RoIC0gMV0gPSBgJHtzdHJpbmdpZmllZC5hdCgtMSl9LGA7XG4gIGZvciAoY29uc3QgW2luZGV4LCBsaW5lXSBvZiBzdHJpbmdpZmllZC5lbnRyaWVzKCkpIHtcbiAgICBzdHJpbmdpZmllZFtpbmRleF0gPSBgJHtpbmRlbnR9JHtsaW5lfWA7XG4gIH1cbiAgcmV0dXJuIHN0cmluZ2lmaWVkLmpvaW4oJ1xcbicpO1xufVxuIiwiZXhwb3J0IGNvbnN0IGdsb2JJZ25vcmUgPSBbXG4gICcqKi9ub2RlX21vZHVsZXMvKionLFxuICAnKiovLnZlbnYvKionLFxuICAnKiovdGVzdC1maXh0dXJlcy8qKicsXG4gICcqKi90ZXN0L2ZpeHR1cmVzLyoqJyxcbiAgJyoqL2Rpc3QvKionLFxuICAnKiovYnVpbGQvKionLFxuICAnKiovdGFyZ2V0LyoqJyxcbiAgJyoqL3RlbXAvKionLFxuICAnKiovdG1wLyoqJyxcbl07XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcy9wcm9taXNlcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgZmcgZnJvbSAnZmFzdC1nbG9iJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZ2xvYklnbm9yZSB9IGZyb20gJy4uL3V0aWxzL2dsb2JVdGlsLmpzJztcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGZpeFByaXNtYUVudkZpbGVzKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2ZpeFByaXNtYUVudkZpbGVzJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IGVudkZpbGVzID0gYXdhaXQgZmcuZ2xvYihbJyouZW52JywgJyouZW52LionXSwgeyBkb3Q6IHRydWUsIGN3ZDogY29uZmlnLmRpclBhdGgsIGlnbm9yZTogZ2xvYklnbm9yZSB9KTtcbiAgICBmb3IgKGNvbnN0IGVudkZpbGUgb2YgZW52RmlsZXMpIHtcbiAgICAgIGNvbnN0IGVudkZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCBlbnZGaWxlKTtcbiAgICAgIGNvbnN0IGNvbnRlbnQgPSBhd2FpdCBmcy5yZWFkRmlsZShlbnZGaWxlUGF0aCwgJ3V0ZjgnKTtcbiAgICAgIGNvbnN0IG5ld0NvbnRlbnQgPSBjb250ZW50LnJlcGxhY2VBbGwoXG4gICAgICAgIC9EQVRBQkFTRV9VUkxcXHMqPVxccypcIj8oW15cIiNcXG5dKz9cXC5zcWxpdGUzW15cIiNcXG5dKilcIj8vZyxcbiAgICAgICAgKG1hdGNoLCB1cmw6IHN0cmluZykgPT4ge1xuICAgICAgICAgIGlmICh1cmwuaW5jbHVkZXMoJ2Nvbm5lY3Rpb25fbGltaXQ9MScpKSByZXR1cm4gbWF0Y2g7XG4gICAgICAgICAgY29uc3Qgc2VwYXJhdG9yID0gdXJsLmluY2x1ZGVzKCc/JykgPyAnJicgOiAnPyc7XG4gICAgICAgICAgcmV0dXJuIGBEQVRBQkFTRV9VUkw9XCIke3VybH0ke3NlcGFyYXRvcn1jb25uZWN0aW9uX2xpbWl0PTFcImA7XG4gICAgICAgIH1cbiAgICAgICk7XG4gICAgICBhd2FpdCBmcy53cml0ZUZpbGUoZW52RmlsZVBhdGgsIG5ld0NvbnRlbnQpO1xuICAgIH1cbiAgfSk7XG59XG4iLCJjb25zdCBoYXMgPSAob2JqZWN0LCBrZXkpID0+IE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmplY3QsIGtleSlcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gc29ydE9iamVjdEJ5S2V5TmFtZUxpc3Qob2JqZWN0LCBzb3J0V2l0aCkge1xuICBsZXQga2V5cywgc29ydEZuLCBrZXlcblxuICBpZiAodHlwZW9mIHNvcnRXaXRoID09PSAnZnVuY3Rpb24nKSB7XG4gICAgc29ydEZuID0gc29ydFdpdGhcbiAgfSBlbHNlIHtcbiAgICBrZXlzID0gc29ydFdpdGhcbiAgfVxuXG4gIGNvbnN0IHRvdGFsID0ge31cbiAgY29uc3Qgb2JqZWN0S2V5cyA9IFsuLi4oa2V5cyA/PyBbXSksIC4uLk9iamVjdC5rZXlzKG9iamVjdCkuc29ydChzb3J0Rm4pXVxuXG4gIGZvciAoa2V5IG9mIG9iamVjdEtleXMpIHtcbiAgICBpZiAoaGFzKG9iamVjdCwga2V5KSkge1xuICAgICAgdG90YWxba2V5XSA9IG9iamVjdFtrZXldXG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHRvdGFsXG59XG4iLCIvLyBEZXRlY3QgZWl0aGVyIHNwYWNlcyBvciB0YWJzIGJ1dCBub3QgYm90aCB0byBwcm9wZXJseSBoYW5kbGUgdGFicyBmb3IgaW5kZW50YXRpb24gYW5kIHNwYWNlcyBmb3IgYWxpZ25tZW50XG5jb25zdCBJTkRFTlRfUkVHRVggPSAvXig/OiggKSt8XFx0KykvO1xuXG5jb25zdCBJTkRFTlRfVFlQRV9TUEFDRSA9ICdzcGFjZSc7XG5jb25zdCBJTkRFTlRfVFlQRV9UQUIgPSAndGFiJztcblxuLy8gSGVscGVyIGZ1bmN0aW9uIHRvIGNoZWNrIGlmIHdlIHNob3VsZCBpZ25vcmUgc2luZ2xlIHNwYWNlIHBhdHRlcm5zXG5mdW5jdGlvbiBzaG91bGRJZ25vcmVTaW5nbGVTcGFjZShpZ25vcmVTaW5nbGVTcGFjZXMsIGluZGVudFR5cGUsIHZhbHVlKSB7XG5cdHJldHVybiBpZ25vcmVTaW5nbGVTcGFjZXMgJiYgaW5kZW50VHlwZSA9PT0gSU5ERU5UX1RZUEVfU1BBQ0UgJiYgdmFsdWUgPT09IDE7XG59XG5cbi8qKlxuTWFrZSBhIE1hcCB0aGF0IGNvdW50cyBob3cgbWFueSBpbmRlbnRzL3VuaW5kZW50cyBoYXZlIG9jY3VycmVkIGZvciBhIGdpdmVuIHNpemUgYW5kIGhvdyBtYW55IGxpbmVzIGZvbGxvdyBhIGdpdmVuIGluZGVudGF0aW9uLlxuXG5UaGUga2V5IGlzIGEgY29uY2F0ZW5hdGlvbiBvZiB0aGUgaW5kZW50YXRpb24gdHlwZSAocyA9IHNwYWNlIGFuZCB0ID0gdGFiKSBhbmQgdGhlIHNpemUgb2YgdGhlIGluZGVudHMvdW5pbmRlbnRzLlxuXG5gYGBcbmluZGVudHMgPSB7XG5cdHQzOiBbMSwgMF0sXG5cdHQ0OiBbMSwgNV0sXG5cdHM1OiBbMSwgMF0sXG5cdHMxMjogWzEsIDBdLFxufVxuYGBgXG4qL1xuZnVuY3Rpb24gbWFrZUluZGVudHNNYXAoc3RyaW5nLCBpZ25vcmVTaW5nbGVTcGFjZXMpIHtcblx0Y29uc3QgaW5kZW50cyA9IG5ldyBNYXAoKTtcblxuXHQvLyBSZW1lbWJlciB0aGUgc2l6ZSBvZiBwcmV2aW91cyBsaW5lJ3MgaW5kZW50YXRpb25cblx0bGV0IHByZXZpb3VzU2l6ZSA9IDA7XG5cdGxldCBwcmV2aW91c0luZGVudFR5cGU7XG5cblx0Ly8gSW5kZW50cyBrZXkgKGlkZW50IHR5cGUgKyBzaXplIG9mIHRoZSBpbmRlbnRzL3VuaW5kZW50cylcblx0bGV0IGtleTtcblxuXHRmb3IgKGNvbnN0IGxpbmUgb2Ygc3RyaW5nLnNwbGl0KC9cXG4vZykpIHtcblx0XHRpZiAoIWxpbmUpIHtcblx0XHRcdC8vIElnbm9yZSBlbXB0eSBsaW5lc1xuXHRcdFx0Y29udGludWU7XG5cdFx0fVxuXG5cdFx0Y29uc3QgbWF0Y2hlcyA9IGxpbmUubWF0Y2goSU5ERU5UX1JFR0VYKTtcblxuXHRcdGlmIChtYXRjaGVzID09PSBudWxsKSB7XG5cdFx0XHRwcmV2aW91c1NpemUgPSAwO1xuXHRcdFx0cHJldmlvdXNJbmRlbnRUeXBlID0gJyc7XG5cdFx0fSBlbHNlIHtcblx0XHRcdGNvbnN0IGluZGVudCA9IG1hdGNoZXNbMF0ubGVuZ3RoO1xuXHRcdFx0Y29uc3QgaW5kZW50VHlwZSA9IG1hdGNoZXNbMV0gPyBJTkRFTlRfVFlQRV9TUEFDRSA6IElOREVOVF9UWVBFX1RBQjtcblxuXHRcdFx0Ly8gSWdub3JlIHNpbmdsZSBzcGFjZSB1bmxlc3MgaXQncyB0aGUgb25seSBpbmRlbnQgZGV0ZWN0ZWQgdG8gcHJldmVudCBjb21tb24gZmFsc2UgcG9zaXRpdmVzXG5cdFx0XHRpZiAoc2hvdWxkSWdub3JlU2luZ2xlU3BhY2UoaWdub3JlU2luZ2xlU3BhY2VzLCBpbmRlbnRUeXBlLCBpbmRlbnQpKSB7XG5cdFx0XHRcdGNvbnRpbnVlO1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAoaW5kZW50VHlwZSAhPT0gcHJldmlvdXNJbmRlbnRUeXBlKSB7XG5cdFx0XHRcdHByZXZpb3VzU2l6ZSA9IDA7XG5cdFx0XHR9XG5cblx0XHRcdHByZXZpb3VzSW5kZW50VHlwZSA9IGluZGVudFR5cGU7XG5cblx0XHRcdGxldCB1c2UgPSAxO1xuXHRcdFx0bGV0IHdlaWdodCA9IDA7XG5cblx0XHRcdGNvbnN0IGluZGVudERpZmZlcmVuY2UgPSBpbmRlbnQgLSBwcmV2aW91c1NpemU7XG5cdFx0XHRwcmV2aW91c1NpemUgPSBpbmRlbnQ7XG5cblx0XHRcdC8vIFByZXZpb3VzIGxpbmUgaGF2ZSBzYW1lIGluZGVudD9cblx0XHRcdGlmIChpbmRlbnREaWZmZXJlbmNlID09PSAwKSB7XG5cdFx0XHRcdC8vIE5vdCBhIG5ldyBcInVzZVwiIG9mIHRoZSBjdXJyZW50IGluZGVudDpcblx0XHRcdFx0dXNlID0gMDtcblx0XHRcdFx0Ly8gQnV0IGRvIGFkZCBhIGJpdCB0byBpdCBmb3IgYnJlYWtpbmcgdGllczpcblx0XHRcdFx0d2VpZ2h0ID0gMTtcblx0XHRcdFx0Ly8gV2UgdXNlIHRoZSBrZXkgZnJvbSBwcmV2aW91cyBsb29wXG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRjb25zdCBhYnNvbHV0ZUluZGVudERpZmZlcmVuY2UgPSBNYXRoLmFicyhpbmRlbnREaWZmZXJlbmNlKTtcblxuXHRcdFx0XHQvLyBJZ25vcmUgc2luZ2xlIHNwYWNlIGNoYW5nZXMgd2hlbiBpZ25vcmVTaW5nbGVTcGFjZXMgaXMgdHJ1ZVxuXHRcdFx0XHQvLyBUaGlzIHByZXZlbnRzIGNvbW1vbiBmYWxzZSBwb3NpdGl2ZXMgZnJvbSB0aGluZ3MgbGlrZSBhbGlnbmVkIGNvbW1lbnRzXG5cdFx0XHRcdGlmIChzaG91bGRJZ25vcmVTaW5nbGVTcGFjZShpZ25vcmVTaW5nbGVTcGFjZXMsIGluZGVudFR5cGUsIGFic29sdXRlSW5kZW50RGlmZmVyZW5jZSkpIHtcblx0XHRcdFx0XHRjb250aW51ZTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdGtleSA9IGVuY29kZUluZGVudHNLZXkoaW5kZW50VHlwZSwgYWJzb2x1dGVJbmRlbnREaWZmZXJlbmNlKTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gVXBkYXRlIHRoZSBzdGF0c1xuXHRcdFx0Y29uc3QgZW50cnkgPSBpbmRlbnRzLmdldChrZXkpO1xuXHRcdFx0aW5kZW50cy5zZXQoa2V5LCBlbnRyeSA9PT0gdW5kZWZpbmVkID8gWzEsIDBdIDogW2VudHJ5WzBdICsgdXNlLCBlbnRyeVsxXSArIHdlaWdodF0pO1xuXHRcdH1cblx0fVxuXG5cdHJldHVybiBpbmRlbnRzO1xufVxuXG4vLyBFbmNvZGUgdGhlIGluZGVudCB0eXBlIGFuZCBhbW91bnQgYXMgYSBzdHJpbmcgKGUuZy4gJ3M0JykgZm9yIHVzZSBhcyBhIGNvbXBvdW5kIGtleSBpbiB0aGUgaW5kZW50cyBNYXAuXG5mdW5jdGlvbiBlbmNvZGVJbmRlbnRzS2V5KGluZGVudFR5cGUsIGluZGVudEFtb3VudCkge1xuXHRjb25zdCB0eXBlQ2hhcmFjdGVyID0gaW5kZW50VHlwZSA9PT0gSU5ERU5UX1RZUEVfU1BBQ0UgPyAncycgOiAndCc7XG5cdHJldHVybiB0eXBlQ2hhcmFjdGVyICsgU3RyaW5nKGluZGVudEFtb3VudCk7XG59XG5cbi8vIEV4dHJhY3QgdGhlIGluZGVudCB0eXBlIGFuZCBhbW91bnQgZnJvbSBhIGtleSBvZiB0aGUgaW5kZW50cyBNYXAuXG5mdW5jdGlvbiBkZWNvZGVJbmRlbnRzS2V5KGluZGVudHNLZXkpIHtcblx0Y29uc3Qga2V5SGFzVHlwZVNwYWNlID0gaW5kZW50c0tleVswXSA9PT0gJ3MnO1xuXHRjb25zdCB0eXBlID0ga2V5SGFzVHlwZVNwYWNlID8gSU5ERU5UX1RZUEVfU1BBQ0UgOiBJTkRFTlRfVFlQRV9UQUI7XG5cblx0Y29uc3QgYW1vdW50ID0gTnVtYmVyKGluZGVudHNLZXkuc2xpY2UoMSkpO1xuXG5cdHJldHVybiB7dHlwZSwgYW1vdW50fTtcbn1cblxuLy8gUmV0dXJuIHRoZSBrZXkgKGUuZy4gJ3M0JykgZnJvbSB0aGUgaW5kZW50cyBNYXAgdGhhdCByZXByZXNlbnRzIHRoZSBtb3N0IGNvbW1vbiBpbmRlbnQsXG4vLyBvciByZXR1cm4gdW5kZWZpbmVkIGlmIHRoZXJlIGFyZSBubyBpbmRlbnRzLlxuZnVuY3Rpb24gZ2V0TW9zdFVzZWRLZXkoaW5kZW50cykge1xuXHRsZXQgcmVzdWx0O1xuXHRsZXQgbWF4VXNlZCA9IDA7XG5cdGxldCBtYXhXZWlnaHQgPSAwO1xuXG5cdGZvciAoY29uc3QgW2tleSwgW3VzZWRDb3VudCwgd2VpZ2h0XV0gb2YgaW5kZW50cykge1xuXHRcdGlmICh1c2VkQ291bnQgPiBtYXhVc2VkIHx8ICh1c2VkQ291bnQgPT09IG1heFVzZWQgJiYgd2VpZ2h0ID4gbWF4V2VpZ2h0KSkge1xuXHRcdFx0bWF4VXNlZCA9IHVzZWRDb3VudDtcblx0XHRcdG1heFdlaWdodCA9IHdlaWdodDtcblx0XHRcdHJlc3VsdCA9IGtleTtcblx0XHR9XG5cdH1cblxuXHRyZXR1cm4gcmVzdWx0O1xufVxuXG5mdW5jdGlvbiBtYWtlSW5kZW50U3RyaW5nKHR5cGUsIGFtb3VudCkge1xuXHRjb25zdCBpbmRlbnRDaGFyYWN0ZXIgPSB0eXBlID09PSBJTkRFTlRfVFlQRV9TUEFDRSA/ICcgJyA6ICdcXHQnO1xuXHRyZXR1cm4gaW5kZW50Q2hhcmFjdGVyLnJlcGVhdChhbW91bnQpO1xufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBkZXRlY3RJbmRlbnQoc3RyaW5nKSB7XG5cdGlmICh0eXBlb2Ygc3RyaW5nICE9PSAnc3RyaW5nJykge1xuXHRcdHRocm93IG5ldyBUeXBlRXJyb3IoJ0V4cGVjdGVkIGEgc3RyaW5nJyk7XG5cdH1cblxuXHQvLyBJZGVudGlmeSBpbmRlbnRzIHdoaWxlIHNraXBwaW5nIHNpbmdsZSBzcGFjZSBpbmRlbnRzIHRvIGF2b2lkIGNvbW1vbiBlZGdlIGNhc2VzIChlLmcuIGNvZGUgY29tbWVudHMpXG5cdC8vIElmIG5vIGluZGVudHMgYXJlIGlkZW50aWZpZWQsIHJ1biBhZ2FpbiBhbmQgaW5jbHVkZSBhbGwgaW5kZW50cyBmb3IgY29tcHJlaGVuc2l2ZSBkZXRlY3Rpb25cblx0bGV0IGluZGVudHMgPSBtYWtlSW5kZW50c01hcChzdHJpbmcsIHRydWUpO1xuXHRpZiAoaW5kZW50cy5zaXplID09PSAwKSB7XG5cdFx0aW5kZW50cyA9IG1ha2VJbmRlbnRzTWFwKHN0cmluZywgZmFsc2UpO1xuXHR9XG5cblx0Y29uc3Qga2V5T2ZNb3N0VXNlZEluZGVudCA9IGdldE1vc3RVc2VkS2V5KGluZGVudHMpO1xuXG5cdGxldCB0eXBlO1xuXHRsZXQgYW1vdW50ID0gMDtcblx0bGV0IGluZGVudCA9ICcnO1xuXG5cdGlmIChrZXlPZk1vc3RVc2VkSW5kZW50ICE9PSB1bmRlZmluZWQpIHtcblx0XHQoe3R5cGUsIGFtb3VudH0gPSBkZWNvZGVJbmRlbnRzS2V5KGtleU9mTW9zdFVzZWRJbmRlbnQpKTtcblx0XHRpbmRlbnQgPSBtYWtlSW5kZW50U3RyaW5nKHR5cGUsIGFtb3VudCk7XG5cdH1cblxuXHRyZXR1cm4ge1xuXHRcdGFtb3VudCxcblx0XHR0eXBlLFxuXHRcdGluZGVudCxcblx0fTtcbn1cbiIsImV4cG9ydCBmdW5jdGlvbiBkZXRlY3ROZXdsaW5lKHN0cmluZykge1xuXHRpZiAodHlwZW9mIHN0cmluZyAhPT0gJ3N0cmluZycpIHtcblx0XHR0aHJvdyBuZXcgVHlwZUVycm9yKCdFeHBlY3RlZCBhIHN0cmluZycpO1xuXHR9XG5cblx0Y29uc3QgbmV3bGluZXMgPSBzdHJpbmcubWF0Y2goLyg/Olxccj9cXG4pL2cpIHx8IFtdO1xuXG5cdGlmIChuZXdsaW5lcy5sZW5ndGggPT09IDApIHtcblx0XHRyZXR1cm47XG5cdH1cblxuXHRjb25zdCBjcmxmID0gbmV3bGluZXMuZmlsdGVyKG5ld2xpbmUgPT4gbmV3bGluZSA9PT0gJ1xcclxcbicpLmxlbmd0aDtcblx0Y29uc3QgbGYgPSBuZXdsaW5lcy5sZW5ndGggLSBjcmxmO1xuXG5cdHJldHVybiBjcmxmID4gbGYgPyAnXFxyXFxuJyA6ICdcXG4nO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZGV0ZWN0TmV3bGluZUdyYWNlZnVsKHN0cmluZykge1xuXHRyZXR1cm4gKHR5cGVvZiBzdHJpbmcgPT09ICdzdHJpbmcnICYmIGRldGVjdE5ld2xpbmUoc3RyaW5nKSkgfHwgJ1xcbic7XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcydcbmltcG9ydCBzb3J0T2JqZWN0S2V5cyBmcm9tICdzb3J0LW9iamVjdC1rZXlzJ1xuaW1wb3J0IGRldGVjdEluZGVudCBmcm9tICdkZXRlY3QtaW5kZW50J1xuaW1wb3J0IHsgZGV0ZWN0TmV3bGluZUdyYWNlZnVsIGFzIGRldGVjdE5ld2xpbmUgfSBmcm9tICdkZXRlY3QtbmV3bGluZSdcbmltcG9ydCBnaXRIb29rcyBmcm9tICdnaXQtaG9va3MtbGlzdCdcbmltcG9ydCBpc1BsYWluT2JqZWN0IGZyb20gJ2lzLXBsYWluLW9iaidcbmltcG9ydCBzZW12ZXJDb21wYXJlIGZyb20gJ3NlbXZlci9mdW5jdGlvbnMvY29tcGFyZS5qcydcbmltcG9ydCBzZW12ZXJNaW5WZXJzaW9uIGZyb20gJ3NlbXZlci9yYW5nZXMvbWluLXZlcnNpb24uanMnXG5cbmNvbnN0IHBpcGUgPVxuICAoZm5zKSA9PlxuICAoeCwgLi4uYXJncykgPT5cbiAgICBmbnMucmVkdWNlKChyZXN1bHQsIGZuKSA9PiBmbihyZXN1bHQsIC4uLmFyZ3MpLCB4KVxuY29uc3Qgb25BcnJheSA9IChmbikgPT4gKHgpID0+IChBcnJheS5pc0FycmF5KHgpID8gZm4oeCkgOiB4KVxuY29uc3Qgb25TdHJpbmdBcnJheSA9IChmbikgPT4gKHgpID0+XG4gIEFycmF5LmlzQXJyYXkoeCkgJiYgeC5ldmVyeSgoaXRlbSkgPT4gdHlwZW9mIGl0ZW0gPT09ICdzdHJpbmcnKSA/IGZuKHgpIDogeFxuY29uc3QgdW5pcSA9IG9uU3RyaW5nQXJyYXkoKHhzKSA9PiBbLi4ubmV3IFNldCh4cyldKVxuY29uc3Qgc29ydEFycmF5ID0gb25TdHJpbmdBcnJheSgoYXJyYXkpID0+IGFycmF5LnRvU29ydGVkKCkpXG5jb25zdCB1bmlxQW5kU29ydEFycmF5ID0gcGlwZShbdW5pcSwgc29ydEFycmF5XSlcbmNvbnN0IG9uT2JqZWN0ID1cbiAgKGZuKSA9PlxuICAoeCwgLi4uYXJncykgPT5cbiAgICBpc1BsYWluT2JqZWN0KHgpID8gZm4oeCwgLi4uYXJncykgOiB4XG5jb25zdCBzb3J0T2JqZWN0QnkgPSAoY29tcGFyYXRvciwgZGVlcCkgPT4ge1xuICBjb25zdCBvdmVyID0gb25PYmplY3QoKG9iamVjdCkgPT4ge1xuICAgIGlmIChkZWVwKSB7XG4gICAgICBvYmplY3QgPSBPYmplY3QuZnJvbUVudHJpZXMoXG4gICAgICAgIE9iamVjdC5lbnRyaWVzKG9iamVjdCkubWFwKChba2V5LCB2YWx1ZV0pID0+IFtrZXksIG92ZXIodmFsdWUpXSksXG4gICAgICApXG4gICAgfVxuXG4gICAgcmV0dXJuIHNvcnRPYmplY3RLZXlzKG9iamVjdCwgY29tcGFyYXRvcilcbiAgfSlcblxuICByZXR1cm4gb3ZlclxufVxuY29uc3Qgb2JqZWN0R3JvdXBCeSA9XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuL25vLXVuc3VwcG9ydGVkLWZlYXR1cmVzL2VzLWJ1aWx0aW5zLCBuL25vLXVuc3VwcG9ydGVkLWZlYXR1cmVzL2VzLXN5bnRheCAtLSBTYWZlXG4gIE9iamVjdC5ncm91cEJ5IHx8XG4gIC8vIFJlbW92ZSB0aGlzIHdoZW4gd2UgZHJvcCBzdXBwb3J0IGZvciBOb2RlLmpzIDIwXG4gICgoYXJyYXksIGNhbGxiYWNrKSA9PiB7XG4gICAgY29uc3QgcmVzdWx0ID0gT2JqZWN0LmNyZWF0ZShudWxsKVxuICAgIGZvciAoY29uc3QgdmFsdWUgb2YgYXJyYXkpIHtcbiAgICAgIGNvbnN0IGtleSA9IGNhbGxiYWNrKHZhbHVlKVxuICAgICAgaWYgKHJlc3VsdFtrZXldKSB7XG4gICAgICAgIHJlc3VsdFtrZXldLnB1c2godmFsdWUpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXN1bHRba2V5XSA9IFt2YWx1ZV1cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdFxuICB9KVxuY29uc3Qgc29ydE9iamVjdCA9IHNvcnRPYmplY3RCeSgpXG5jb25zdCBzb3J0VVJMT2JqZWN0ID0gc29ydE9iamVjdEJ5KFsndHlwZScsICd1cmwnXSlcbmNvbnN0IHNvcnRQZW9wbGVPYmplY3QgPSBzb3J0T2JqZWN0QnkoWyduYW1lJywgJ2VtYWlsJywgJ3VybCddKVxuY29uc3Qgc29ydERpcmVjdG9yaWVzID0gc29ydE9iamVjdEJ5KFtcbiAgJ2xpYicsXG4gICdiaW4nLFxuICAnbWFuJyxcbiAgJ2RvYycsXG4gICdleGFtcGxlJyxcbiAgJ3Rlc3QnLFxuXSlcbmNvbnN0IG92ZXJQcm9wZXJ0eSA9IChwcm9wZXJ0eSwgb3ZlcikgPT5cbiAgb25PYmplY3QoKG9iamVjdCwgLi4uYXJncykgPT5cbiAgICBPYmplY3QuaGFzT3duKG9iamVjdCwgcHJvcGVydHkpXG4gICAgICA/IHsgLi4ub2JqZWN0LCBbcHJvcGVydHldOiBvdmVyKG9iamVjdFtwcm9wZXJ0eV0sIC4uLmFyZ3MpIH1cbiAgICAgIDogb2JqZWN0LFxuICApXG5jb25zdCBzb3J0R2l0SG9va3MgPSBzb3J0T2JqZWN0QnkoZ2l0SG9va3MpXG5cbmNvbnN0IHBhcnNlTmFtZUFuZFZlcnNpb25SYW5nZSA9IChzcGVjaWZpZXIpID0+IHtcbiAgLy8gSWdub3JlIGFueXRoaW5nIGFmdGVyID4gJiByZWx5IG9uIGZhbGxiYWNrIGFscGhhbnVtZXJpYyBzb3J0aW5nIGZvciB0aGF0XG4gIGNvbnN0IFtuYW1lQW5kVmVyc2lvbl0gPSBzcGVjaWZpZXIuc3BsaXQoJz4nKVxuICBjb25zdCBhdE1hdGNoZXMgPSBbLi4ubmFtZUFuZFZlcnNpb24ubWF0Y2hBbGwoJ0AnKV1cbiAgaWYgKFxuICAgICFhdE1hdGNoZXMubGVuZ3RoIHx8XG4gICAgKGF0TWF0Y2hlcy5sZW5ndGggPT09IDEgJiYgYXRNYXRjaGVzWzBdLmluZGV4ID09PSAwKVxuICApIHtcbiAgICByZXR1cm4geyBuYW1lOiBzcGVjaWZpZXIgfVxuICB9XG4gIGNvbnN0IHNwbGl0SW5kZXggPSBhdE1hdGNoZXMucG9wKCkuaW5kZXhcbiAgcmV0dXJuIHtcbiAgICBuYW1lOiBuYW1lQW5kVmVyc2lvbi5zdWJzdHJpbmcoMCwgc3BsaXRJbmRleCksXG4gICAgcmFuZ2U6IG5hbWVBbmRWZXJzaW9uLnN1YnN0cmluZyhzcGxpdEluZGV4ICsgMSksXG4gIH1cbn1cblxuY29uc3Qgc29ydE9iamVjdEJ5U2VtdmVyID0gc29ydE9iamVjdEJ5KChhLCBiKSA9PiB7XG4gIGNvbnN0IHsgbmFtZTogYU5hbWUsIHJhbmdlOiBhUmFuZ2UgfSA9IHBhcnNlTmFtZUFuZFZlcnNpb25SYW5nZShhKVxuICBjb25zdCB7IG5hbWU6IGJOYW1lLCByYW5nZTogYlJhbmdlIH0gPSBwYXJzZU5hbWVBbmRWZXJzaW9uUmFuZ2UoYilcblxuICBpZiAoYU5hbWUgIT09IGJOYW1lKSB7XG4gICAgcmV0dXJuIGFOYW1lLmxvY2FsZUNvbXBhcmUoYk5hbWUsICdlbicpXG4gIH1cbiAgaWYgKCFhUmFuZ2UpIHtcbiAgICByZXR1cm4gLTFcbiAgfVxuICBpZiAoIWJSYW5nZSkge1xuICAgIHJldHVybiAxXG4gIH1cbiAgcmV0dXJuIHNlbXZlckNvbXBhcmUoc2VtdmVyTWluVmVyc2lvbihhUmFuZ2UpLCBzZW12ZXJNaW5WZXJzaW9uKGJSYW5nZSkpXG59KVxuXG5jb25zdCBnZXRQYWNrYWdlTmFtZSA9IChpZGVudCkgPT4ge1xuICBjb25zdCBpbmRleCA9IGlkZW50LmluZGV4T2YoJ0AnLCBpZGVudC5zdGFydHNXaXRoKCdAJykgPyAxIDogMClcbiAgLy8gVGhpcyBzaG91bGQgbm90IGhhcHBlbiwgdW5sZXNzIHVzZXIgbWFudWFsbHkgZWRpdCB0aGUgcGFja2FnZS5qc29uIGZpbGVcbiAgcmV0dXJuIGluZGV4ID09PSAtMSA/IGlkZW50IDogaWRlbnQuc2xpY2UoMCwgaW5kZXgpXG59XG5cbmNvbnN0IHNvcnRPYmplY3RCeUlkZW50ID0gKGEsIGIpID0+IHtcbiAgY29uc3QgcGFja2FnZU5hbWVBID0gZ2V0UGFja2FnZU5hbWUoYSlcbiAgY29uc3QgcGFja2FnZU5hbWVCID0gZ2V0UGFja2FnZU5hbWUoYilcblxuICBpZiAocGFja2FnZU5hbWVBIDwgcGFja2FnZU5hbWVCKSByZXR1cm4gLTFcbiAgaWYgKHBhY2thZ2VOYW1lQSA+IHBhY2thZ2VOYW1lQikgcmV0dXJuIDFcbiAgcmV0dXJuIDBcbn1cblxuLy8gQ2FjaGUgYnkgYHByb2Nlc3MuY3dkKClgIGluc3RlYWQgb2YgYSB2YXJpYWJsZSB0byBhbGxvdyB1c2VyIGNhbGwgYHByb2Nlc3MuY2hkaXIoKWBcbmNvbnN0IGNhY2hlID0gbmV3IE1hcCgpXG5jb25zdCBoYXNZYXJuT3JQbnBtRmlsZXMgPSAoKSA9PiB7XG4gIGNvbnN0IGN3ZCA9IHByb2Nlc3MuY3dkKClcbiAgaWYgKCFjYWNoZS5oYXMoY3dkKSkge1xuICAgIGNhY2hlLnNldChcbiAgICAgIGN3ZCxcbiAgICAgIGZzLmV4aXN0c1N5bmMoJ3lhcm4ubG9jaycpIHx8XG4gICAgICAgIGZzLmV4aXN0c1N5bmMoJy55YXJuLycpIHx8XG4gICAgICAgIGZzLmV4aXN0c1N5bmMoJy55YXJucmMueW1sJykgfHxcbiAgICAgICAgZnMuZXhpc3RzU3luYygncG5wbS1sb2NrLnlhbWwnKSB8fFxuICAgICAgICBmcy5leGlzdHNTeW5jKCdwbnBtLXdvcmtzcGFjZS55YW1sJyksXG4gICAgKVxuICB9XG4gIHJldHVybiBjYWNoZS5nZXQoY3dkKVxufVxuXG4vKipcbiAqIERldGVjdHMgdGhlIHBhY2thZ2UgbWFuYWdlciBmcm9tIHBhY2thZ2UuanNvbiBhbmQgbG9jayBmaWxlc1xuICogQHBhcmFtIHtvYmplY3R9IHBhY2thZ2VKc29uIC0gVGhlIHBhcnNlZCBwYWNrYWdlLmpzb24gb2JqZWN0XG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gLSBUaGUgZGV0ZWN0ZWQgcGFja2FnZSBtYW5hZ2VyLiBEZWZhdWx0IHRvIG5wbSBpZiBub3QgZGV0ZWN0ZWQuXG4gKi9cbmZ1bmN0aW9uIHNob3VsZFNvcnREZXBlbmRlbmNpZXNMaWtlTnBtKHBhY2thZ2VKc29uKSB7XG4gIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9ub2RlanMvY29yZXBhY2tcbiAgaWYgKHR5cGVvZiBwYWNrYWdlSnNvbi5wYWNrYWdlTWFuYWdlciA9PT0gJ3N0cmluZycpIHtcbiAgICByZXR1cm4gcGFja2FnZUpzb24ucGFja2FnZU1hbmFnZXIuc3RhcnRzV2l0aCgnbnBtQCcpXG4gIH1cblxuICBpZiAocGFja2FnZUpzb24uZGV2RW5naW5lcz8ucGFja2FnZU1hbmFnZXI/Lm5hbWUpIHtcbiAgICByZXR1cm4gcGFja2FnZUpzb24uZGV2RW5naW5lcy5wYWNrYWdlTWFuYWdlci5uYW1lID09PSAnbnBtJ1xuICB9XG5cbiAgaWYgKHBhY2thZ2VKc29uLnBucG0pIHtcbiAgICByZXR1cm4gZmFsc2VcbiAgfVxuXG4gIC8vIE9wdGltaXNhdGlvbjogQ2hlY2sgaWYgbnBtIGlzIGV4cGxpY2l0IGJlZm9yZSByZWFkaW5nIEZTLlxuICBpZiAocGFja2FnZUpzb24uZW5naW5lcz8ubnBtKSB7XG4gICAgcmV0dXJuIHRydWVcbiAgfVxuXG4gIGlmIChoYXNZYXJuT3JQbnBtRmlsZXMoKSkge1xuICAgIHJldHVybiBmYWxzZVxuICB9XG5cbiAgcmV0dXJuIHRydWVcbn1cblxuLyoqXG4gKiBTb3J0IGRlcGVuZGVuY2llcyBhbHBoYWJldGljYWxseSwgZGV0ZWN0aW5nIHBhY2thZ2UgbWFuYWdlciB0byB1c2UgdGhlXG4gKiBhcHByb3ByaWF0ZSBjb21wYXJpc29uLiBucG0gdXNlcyBsb2NhbGUtYXdhcmUgY29tcGFyaXNvbiwgeWFybiBhbmQgcG5wbSB1c2VcbiAqIHNpbXBsZSBzdHJpbmcgY29tcGFyaXNvblxuICovXG5jb25zdCBzb3J0RGVwZW5kZW5jaWVzID0gb25PYmplY3QoKGRlcGVuZGVuY2llcywgcGFja2FnZUpzb24pID0+IHtcbiAgLy8gQXZvaWQgZmlsZSBhY2Nlc3NcbiAgaWYgKE9iamVjdC5rZXlzKGRlcGVuZGVuY2llcykubGVuZ3RoIDwgMikge1xuICAgIHJldHVybiBkZXBlbmRlbmNpZXNcbiAgfVxuXG4gIC8vIHNvcnQgZGVwcyBsaWtlIHRoZSBucG0gQ0xJIGRvZXMgKHZpYSB0aGUgcGFja2FnZSBAbnBtY2xpL3BhY2thZ2UtanNvbilcbiAgLy8gaHR0cHM6Ly9naXRodWIuY29tL25wbS9wYWNrYWdlLWpzb24vYmxvYi9iNjQ2NWY0NGM3MjdkNjUxM2RiNjg5OGM3Y2JlNDFkZDM1NWNlYmU4L2xpYi91cGRhdGUtZGVwZW5kZW5jaWVzLmpzI0w4LUwyMVxuICBpZiAoc2hvdWxkU29ydERlcGVuZGVuY2llc0xpa2VOcG0ocGFja2FnZUpzb24pKSB7XG4gICAgcmV0dXJuIHNvcnRPYmplY3RLZXlzKGRlcGVuZGVuY2llcywgKGEsIGIpID0+IGEubG9jYWxlQ29tcGFyZShiLCAnZW4nKSlcbiAgfVxuXG4gIHJldHVybiBzb3J0T2JqZWN0S2V5cyhkZXBlbmRlbmNpZXMpXG59KVxuXG4vKipcbiAqIFwid29ya3NwYWNlc1wiIGNhbiBiZSBhbiBhcnJheSAobnBtIG9yIHlhcm4gY2xhc3NpYykgb3IgYW4gb2JqZWN0IChwbnBtL2J1bikuXG4gKiBJbiB0aGUgY2FzZSBvZiBhbiBhcnJheSwgd2UgZG8gbm90IHdhbnQgdG8gYWxwaGFiZXRpY2FsbHkgc29ydCBpdCBpbiBjYXNlXG4gKiBzY3JpcHRzIG5lZWQgdG8gcnVuIGluIGEgc3BlY2lmaWMgb3JkZXIuXG4gKlxuICogQHNlZSBodHRwczovL2RvY3MubnBtanMuY29tL2NsaS92Ny91c2luZy1ucG0vd29ya3NwYWNlcz92PXRydWUjcnVubmluZy1jb21tYW5kcy1pbi10aGUtY29udGV4dC1vZi13b3Jrc3BhY2VzXG4gKi9cbmNvbnN0IHNvcnRXb3Jrc3BhY2VzID0gcGlwZShbXG4gIHNvcnRPYmplY3RCeShbJ3BhY2thZ2VzJywgJ2NhdGFsb2cnXSksXG4gIG92ZXJQcm9wZXJ0eSgncGFja2FnZXMnLCB1bmlxQW5kU29ydEFycmF5KSxcbiAgb3ZlclByb3BlcnR5KCdjYXRhbG9nJywgc29ydERlcGVuZGVuY2llcyksXG5dKVxuXG4vLyBodHRwczovL2dpdGh1Yi5jb20vZXNsaW50L2VzbGludC9ibG9iL2FjYzBlNDc1NzJhOTM5MDI5MmI0ZTMxM2I0YTRiZjM2MGQyMzYzNTgvY29uZi9jb25maWctc2NoZW1hLmpzXG5jb25zdCBlc2xpbnRCYXNlQ29uZmlnUHJvcGVydGllcyA9IFtcbiAgLy8gYGZpbGVzYCBhbmQgYGV4Y2x1ZGVkRmlsZXNgIGFyZSBvbmx5IG9uIGBvdmVycmlkZXNbXWBcbiAgLy8gZm9yIGVhc2llciBzb3J0IGBvdmVycmlkZXNbXWAsXG4gIC8vIGFkZCB0aGVtIHRvIGhlcmUsIHNvIHdlIGRvbid0IG5lZWQgc29ydCBgb3ZlcnJpZGVzW11gIHR3aWNlXG4gICdmaWxlcycsXG4gICdleGNsdWRlZEZpbGVzJyxcbiAgLy8gYmFzZUNvbmZpZ1xuICAnZW52JyxcbiAgJ3BhcnNlcicsXG4gICdwYXJzZXJPcHRpb25zJyxcbiAgJ3NldHRpbmdzJyxcbiAgJ3BsdWdpbnMnLFxuICAnZXh0ZW5kcycsXG4gICdydWxlcycsXG4gICdvdmVycmlkZXMnLFxuICAnZ2xvYmFscycsXG4gICdwcm9jZXNzb3InLFxuICAnbm9JbmxpbmVDb25maWcnLFxuICAncmVwb3J0VW51c2VkRGlzYWJsZURpcmVjdGl2ZXMnLFxuXVxuY29uc3Qgc29ydEVzbGludENvbmZpZyA9IHBpcGUoW1xuICBzb3J0T2JqZWN0QnkoZXNsaW50QmFzZUNvbmZpZ1Byb3BlcnRpZXMpLFxuICBvdmVyUHJvcGVydHkoJ2VudicsIHNvcnRPYmplY3QpLFxuICBvdmVyUHJvcGVydHkoJ2dsb2JhbHMnLCBzb3J0T2JqZWN0KSxcbiAgb3ZlclByb3BlcnR5KFxuICAgICdvdmVycmlkZXMnLFxuICAgIG9uQXJyYXkoKG92ZXJyaWRlcykgPT4gb3ZlcnJpZGVzLm1hcChzb3J0RXNsaW50Q29uZmlnKSksXG4gICksXG4gIG92ZXJQcm9wZXJ0eSgncGFyc2VyT3B0aW9ucycsIHNvcnRPYmplY3QpLFxuICBvdmVyUHJvcGVydHkoXG4gICAgJ3J1bGVzJyxcbiAgICBzb3J0T2JqZWN0QnkoXG4gICAgICAocnVsZTEsIHJ1bGUyKSA9PlxuICAgICAgICBydWxlMS5zcGxpdCgnLycpLmxlbmd0aCAtIHJ1bGUyLnNwbGl0KCcvJykubGVuZ3RoIHx8XG4gICAgICAgIHJ1bGUxLmxvY2FsZUNvbXBhcmUocnVsZTIpLFxuICAgICksXG4gICksXG4gIG92ZXJQcm9wZXJ0eSgnc2V0dGluZ3MnLCBzb3J0T2JqZWN0KSxcbl0pXG5jb25zdCBzb3J0VlNDb2RlQmFkZ2VPYmplY3QgPSBzb3J0T2JqZWN0QnkoWydkZXNjcmlwdGlvbicsICd1cmwnLCAnaHJlZiddKVxuXG5jb25zdCBzb3J0UHJldHRpZXJDb25maWcgPSBwaXBlKFtcbiAgLy8gc29ydCBrZXlzIGFscGhhYmV0aWNhbGx5LCBidXQgcHV0IGBvdmVycmlkZXNgIGF0IGJvdHRvbVxuICBvbk9iamVjdCgoY29uZmlnKSA9PlxuICAgIHNvcnRPYmplY3RLZXlzKGNvbmZpZywgW1xuICAgICAgLi4uT2JqZWN0LmtleXMoY29uZmlnKVxuICAgICAgICAuZmlsdGVyKChrZXkpID0+IGtleSAhPT0gJ292ZXJyaWRlcycpXG4gICAgICAgIC5zb3J0KCksXG4gICAgICAnb3ZlcnJpZGVzJyxcbiAgICBdKSxcbiAgKSxcbiAgLy8gaWYgYGNvbmZpZy5vdmVycmlkZXNgIGV4aXN0c1xuICBvdmVyUHJvcGVydHkoXG4gICAgJ292ZXJyaWRlcycsXG4gICAgLy8gYW5kIGBjb25maWcub3ZlcnJpZGVzYCBpcyBhbiBhcnJheVxuICAgIG9uQXJyYXkoKG92ZXJyaWRlcykgPT5cbiAgICAgIG92ZXJyaWRlcy5tYXAoXG4gICAgICAgIHBpcGUoW1xuICAgICAgICAgIC8vIHNvcnQgYGNvbmZpZy5vdmVycmlkZXNbXWAgYWxwaGFiZXRpY2FsbHlcbiAgICAgICAgICBzb3J0T2JqZWN0LFxuICAgICAgICAgIC8vIHNvcnQgYGNvbmZpZy5vdmVycmlkZXNbXS5vcHRpb25zYCBhbHBoYWJldGljYWxseVxuICAgICAgICAgIG92ZXJQcm9wZXJ0eSgnb3B0aW9ucycsIHNvcnRPYmplY3QpLFxuICAgICAgICBdKSxcbiAgICAgICksXG4gICAgKSxcbiAgKSxcbl0pXG5cbmNvbnN0IHNvcnRWb2x0YSA9IHNvcnRPYmplY3RCeShbJ25vZGUnLCAnbnBtJywgJ3lhcm4nXSlcbmNvbnN0IHNvcnREZXZFbmdpbmVzID0gb3ZlclByb3BlcnR5KFxuICAncGFja2FnZU1hbmFnZXInLFxuICBzb3J0T2JqZWN0QnkoWyduYW1lJywgJ3ZlcnNpb24nLCAnb25GYWlsJ10pLFxuKVxuXG5jb25zdCBwbnBtQmFzZUNvbmZpZ1Byb3BlcnRpZXMgPSBbXG4gICdwZWVyRGVwZW5kZW5jeVJ1bGVzJyxcbiAgJ25ldmVyQnVpbHREZXBlbmRlbmNpZXMnLFxuICAnb25seUJ1aWx0RGVwZW5kZW5jaWVzJyxcbiAgJ29ubHlCdWlsdERlcGVuZGVuY2llc0ZpbGUnLFxuICAnYWxsb3dlZERlcHJlY2F0ZWRWZXJzaW9ucycsXG4gICdhbGxvd05vbkFwcGxpZWRQYXRjaGVzJyxcbiAgJ3VwZGF0ZUNvbmZpZycsXG4gICdhdWRpdENvbmZpZycsXG4gICdyZXF1aXJlZFNjcmlwdHMnLFxuICAnc3VwcG9ydGVkQXJjaGl0ZWN0dXJlcycsXG4gICdvdmVycmlkZXMnLFxuICAncGF0Y2hlZERlcGVuZGVuY2llcycsXG4gICdwYWNrYWdlRXh0ZW5zaW9ucycsXG5dXG5cbmNvbnN0IHNvcnRQbnBtQ29uZmlnID0gcGlwZShbXG4gIHNvcnRPYmplY3RCeShwbnBtQmFzZUNvbmZpZ1Byb3BlcnRpZXMsIHRydWUpLFxuICBvdmVyUHJvcGVydHkoJ292ZXJyaWRlcycsIHNvcnRPYmplY3RCeVNlbXZlciksXG5dKVxuXG4vLyBTZWUgaHR0cHM6Ly9kb2NzLm5wbWpzLmNvbS9taXNjL3NjcmlwdHNcbmNvbnN0IGRlZmF1bHROcG1TY3JpcHRzID0gbmV3IFNldChbXG4gICdpbnN0YWxsJyxcbiAgJ3BhY2snLFxuICAncHJlcGFyZScsXG4gICdwdWJsaXNoJyxcbiAgJ3Jlc3RhcnQnLFxuICAnc2hyaW5rd3JhcCcsXG4gICdzdGFydCcsXG4gICdzdG9wJyxcbiAgJ3Rlc3QnLFxuICAndW5pbnN0YWxsJyxcbiAgJ3ZlcnNpb24nLFxuXSlcblxuY29uc3QgaGFzRGV2RGVwZW5kZW5jeSA9IChkZXBlbmRlbmN5LCBwYWNrYWdlSnNvbikgPT4ge1xuICByZXR1cm4gKFxuICAgIE9iamVjdC5oYXNPd24ocGFja2FnZUpzb24sICdkZXZEZXBlbmRlbmNpZXMnKSAmJlxuICAgIE9iamVjdC5oYXNPd24ocGFja2FnZUpzb24uZGV2RGVwZW5kZW5jaWVzLCBkZXBlbmRlbmN5KVxuICApXG59XG5cbmNvbnN0IHJ1blNSZWdFeHAgPVxuICAvKD88PV58W1xccyY7PD58KF0pKD86cnVuLXN8bnBtLXJ1bi1hbGwyPyAuKig/Oi0tc2VxdWVudGlhbHwtLXNlcmlhbHwtcykpKD89JHxbXFxzJjs8PnwpXSkvXG5cbmNvbnN0IGlzU2VxdWVudGlhbFNjcmlwdCA9IChjb21tYW5kKSA9PlxuICBjb21tYW5kLmluY2x1ZGVzKCcqJykgJiYgcnVuU1JlZ0V4cC50ZXN0KGNvbW1hbmQpXG5cbmNvbnN0IGhhc1NlcXVlbnRpYWxTY3JpcHQgPSAocGFja2FnZUpzb24pID0+IHtcbiAgaWYgKFxuICAgICFoYXNEZXZEZXBlbmRlbmN5KCducG0tcnVuLWFsbCcsIHBhY2thZ2VKc29uKSAmJlxuICAgICFoYXNEZXZEZXBlbmRlbmN5KCducG0tcnVuLWFsbDInLCBwYWNrYWdlSnNvbilcbiAgKSB7XG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cbiAgY29uc3Qgc2NyaXB0cyA9IFsnc2NyaXB0cycsICdiZXR0ZXJTY3JpcHRzJ10uZmxhdE1hcCgoZmllbGQpID0+XG4gICAgcGFja2FnZUpzb25bZmllbGRdID8gT2JqZWN0LnZhbHVlcyhwYWNrYWdlSnNvbltmaWVsZF0pIDogW10sXG4gIClcbiAgcmV0dXJuIHNjcmlwdHMuc29tZSgoc2NyaXB0KSA9PiBpc1NlcXVlbnRpYWxTY3JpcHQoc2NyaXB0KSlcbn1cblxuZnVuY3Rpb24gc29ydFNjcmlwdE5hbWVzKGtleXMsIHByZWZpeCA9ICcnKSB7XG4gIGNvbnN0IGdyb3VwTWFwID0gbmV3IE1hcCgpXG4gIGZvciAoY29uc3Qga2V5IG9mIGtleXMpIHtcbiAgICBjb25zdCByZXN0ID0gcHJlZml4ID8ga2V5LnNsaWNlKHByZWZpeC5sZW5ndGggKyAxKSA6IGtleVxuICAgIGNvbnN0IGlkeCA9IHJlc3QuaW5kZXhPZignOicpXG4gICAgaWYgKGlkeCA+IDApIHtcbiAgICAgIGNvbnN0IGJhc2UgPSBrZXkuc2xpY2UoMCwgKHByZWZpeCA/IHByZWZpeC5sZW5ndGggKyAxIDogMCkgKyBpZHgpXG4gICAgICBpZiAoIWdyb3VwTWFwLmhhcyhiYXNlKSkgZ3JvdXBNYXAuc2V0KGJhc2UsIFtdKVxuICAgICAgZ3JvdXBNYXAuZ2V0KGJhc2UpLnB1c2goa2V5KVxuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoIWdyb3VwTWFwLmhhcyhrZXkpKSBncm91cE1hcC5zZXQoa2V5LCBbXSlcbiAgICAgIGdyb3VwTWFwLmdldChrZXkpLnB1c2goa2V5KVxuICAgIH1cbiAgfVxuICByZXR1cm4gQXJyYXkuZnJvbShncm91cE1hcC5rZXlzKCkpXG4gICAgLnNvcnQoKVxuICAgIC5mbGF0TWFwKChncm91cEtleSkgPT4ge1xuICAgICAgY29uc3QgY2hpbGRyZW4gPSBncm91cE1hcC5nZXQoZ3JvdXBLZXkpXG4gICAgICBpZiAoXG4gICAgICAgIGNoaWxkcmVuLmxlbmd0aCA+IDEgJiZcbiAgICAgICAgY2hpbGRyZW4uc29tZSgoaykgPT4gayAhPT0gZ3JvdXBLZXkgJiYgay5zdGFydHNXaXRoKGdyb3VwS2V5ICsgJzonKSlcbiAgICAgICkge1xuICAgICAgICBjb25zdCBkaXJlY3QgPSBjaGlsZHJlblxuICAgICAgICAgIC5maWx0ZXIoKGspID0+IGsgPT09IGdyb3VwS2V5IHx8ICFrLnN0YXJ0c1dpdGgoZ3JvdXBLZXkgKyAnOicpKVxuICAgICAgICAgIC5zb3J0KClcbiAgICAgICAgY29uc3QgbmVzdGVkID0gY2hpbGRyZW4uZmlsdGVyKChrKSA9PiBrLnN0YXJ0c1dpdGgoZ3JvdXBLZXkgKyAnOicpKVxuICAgICAgICByZXR1cm4gWy4uLmRpcmVjdCwgLi4uc29ydFNjcmlwdE5hbWVzKG5lc3RlZCwgZ3JvdXBLZXkpXVxuICAgICAgfVxuICAgICAgcmV0dXJuIGNoaWxkcmVuLnNvcnQoKVxuICAgIH0pXG59XG5cbmNvbnN0IHNvcnRTY3JpcHRzID0gb25PYmplY3QoKHNjcmlwdHMsIHBhY2thZ2VKc29uKSA9PiB7XG4gIGxldCBuYW1lcyA9IE9iamVjdC5rZXlzKHNjcmlwdHMpXG4gIGNvbnN0IHByZWZpeGFibGUgPSBuZXcgU2V0KClcblxuICBuYW1lcyA9IG5hbWVzLm1hcCgobmFtZSkgPT4ge1xuICAgIGNvbnN0IG9taXR0ZWQgPSBuYW1lLnJlcGxhY2UoL14oPzpwcmV8cG9zdCkvLCAnJylcbiAgICBpZiAoZGVmYXVsdE5wbVNjcmlwdHMuaGFzKG9taXR0ZWQpIHx8IG5hbWVzLmluY2x1ZGVzKG9taXR0ZWQpKSB7XG4gICAgICBwcmVmaXhhYmxlLmFkZChvbWl0dGVkKVxuICAgICAgcmV0dXJuIG9taXR0ZWRcbiAgICB9XG4gICAgcmV0dXJuIG5hbWVcbiAgfSlcblxuICBpZiAoIWhhc1NlcXVlbnRpYWxTY3JpcHQocGFja2FnZUpzb24pKSB7XG4gICAgbmFtZXMgPSBzb3J0U2NyaXB0TmFtZXMobmFtZXMpXG4gIH1cbiAgbmFtZXMgPSBuYW1lcy5mbGF0TWFwKChrZXkpID0+XG4gICAgcHJlZml4YWJsZS5oYXMoa2V5KSA/IFtgcHJlJHtrZXl9YCwga2V5LCBgcG9zdCR7a2V5fWBdIDogW2tleV0sXG4gIClcbiAgcmV0dXJuIHNvcnRPYmplY3RLZXlzKHNjcmlwdHMsIG5hbWVzKVxufSlcblxuLypcbi0gTW92ZSBgZGVmYXVsdGAgY29uZGl0aW9uIHRvIGJvdHRvbVxuKi9cbmNvbnN0IHNvcnRDb25kaXRpb25zID0gKGNvbmRpdGlvbnMpID0+IHtcbiAgY29uc3QgeyBkZWZhdWx0Q29uZGl0aW9ucyA9IFtdLCByZXN0Q29uZGl0aW9ucyA9IFtdIH0gPSBvYmplY3RHcm91cEJ5KFxuICAgIGNvbmRpdGlvbnMsXG4gICAgKGNvbmRpdGlvbikgPT4ge1xuICAgICAgaWYgKGNvbmRpdGlvbiA9PT0gJ2RlZmF1bHQnKSB7XG4gICAgICAgIHJldHVybiAnZGVmYXVsdENvbmRpdGlvbnMnXG4gICAgICB9XG5cbiAgICAgIHJldHVybiAncmVzdENvbmRpdGlvbnMnXG4gICAgfSxcbiAgKVxuXG4gIHJldHVybiBbLi4ucmVzdENvbmRpdGlvbnMsIC4uLmRlZmF1bHRDb25kaXRpb25zXVxufVxuXG5jb25zdCBzb3J0RXhwb3J0cyA9IG9uT2JqZWN0KChleHBvcnRzKSA9PiB7XG4gIGNvbnN0IHsgcGF0aHMgPSBbXSwgY29uZGl0aW9ucyA9IFtdIH0gPSBvYmplY3RHcm91cEJ5KFxuICAgIE9iamVjdC5rZXlzKGV4cG9ydHMpLFxuICAgIChrZXkpID0+IChrZXkuc3RhcnRzV2l0aCgnLicpID8gJ3BhdGhzJyA6ICdjb25kaXRpb25zJyksXG4gIClcblxuICByZXR1cm4gT2JqZWN0LmZyb21FbnRyaWVzKFxuICAgIFsuLi5wYXRocywgLi4uc29ydENvbmRpdGlvbnMoY29uZGl0aW9ucyldLm1hcCgoa2V5KSA9PiBbXG4gICAgICBrZXksXG4gICAgICBzb3J0RXhwb3J0cyhleHBvcnRzW2tleV0pLFxuICAgIF0pLFxuICApXG59KVxuXG4vLyBmaWVsZHMgbWFya2VkIGB2c2NvZGVgIGFyZSBmb3IgYFZpc3VhbCBTdHVkaW8gQ29kZSBleHRlbnNpb24gbWFuaWZlc3RgIG9ubHlcbi8vIGh0dHBzOi8vY29kZS52aXN1YWxzdHVkaW8uY29tL2FwaS9yZWZlcmVuY2VzL2V4dGVuc2lvbi1tYW5pZmVzdFxuLy8gU3VwcG9ydGVkIGZpZWxkczpcbi8vIHB1Ymxpc2hlciwgZGlzcGxheU5hbWUsIGNhdGVnb3JpZXMsIGdhbGxlcnlCYW5uZXIsIHByZXZpZXcsIGNvbnRyaWJ1dGVzLFxuLy8gYWN0aXZhdGlvbkV2ZW50cywgYmFkZ2VzLCBtYXJrZG93biwgcW5hLCBleHRlbnNpb25QYWNrLFxuLy8gZXh0ZW5zaW9uRGVwZW5kZW5jaWVzLCBpY29uXG5cbi8vIGZpZWxkLmtleXtzdHJpbmd9OiBmaWVsZCBuYW1lXG4vLyBmaWVsZC5vdmVye2Z1bmN0aW9ufTogc29ydCBmaWVsZCBzdWJLZXlcbmNvbnN0IGZpZWxkcyA9IFtcbiAgeyBrZXk6ICckc2NoZW1hJyB9LFxuICB7IGtleTogJ25hbWUnIH0sXG4gIC8qIHZzY29kZSAqLyB7IGtleTogJ2Rpc3BsYXlOYW1lJyB9LFxuICB7IGtleTogJ3ZlcnNpb24nIH0sXG4gIC8qIHlhcm4gKi8geyBrZXk6ICdzdGFibGVWZXJzaW9uJyB9LFxuICB7IGtleTogJ3ByaXZhdGUnIH0sXG4gIHsga2V5OiAnZGVzY3JpcHRpb24nIH0sXG4gIC8qIHZzY29kZSAqLyB7IGtleTogJ2NhdGVnb3JpZXMnLCBvdmVyOiB1bmlxIH0sXG4gIHsga2V5OiAna2V5d29yZHMnLCBvdmVyOiB1bmlxIH0sXG4gIHsga2V5OiAnaG9tZXBhZ2UnIH0sXG4gIHsga2V5OiAnYnVncycsIG92ZXI6IHNvcnRPYmplY3RCeShbJ3VybCcsICdlbWFpbCddKSB9LFxuICB7IGtleTogJ3JlcG9zaXRvcnknLCBvdmVyOiBzb3J0VVJMT2JqZWN0IH0sXG4gIHsga2V5OiAnZnVuZGluZycsIG92ZXI6IHNvcnRVUkxPYmplY3QgfSxcbiAgeyBrZXk6ICdsaWNlbnNlJywgb3Zlcjogc29ydFVSTE9iamVjdCB9LFxuICAvKiB2c2NvZGUgKi8geyBrZXk6ICdxbmEnIH0sXG4gIHsga2V5OiAnYXV0aG9yJywgb3Zlcjogc29ydFBlb3BsZU9iamVjdCB9LFxuICB7XG4gICAga2V5OiAnbWFpbnRhaW5lcnMnLFxuICAgIG92ZXI6IG9uQXJyYXkoKG1haW50YWluZXJzKSA9PiBtYWludGFpbmVycy5tYXAoc29ydFBlb3BsZU9iamVjdCkpLFxuICB9LFxuICB7XG4gICAga2V5OiAnY29udHJpYnV0b3JzJyxcbiAgICBvdmVyOiBvbkFycmF5KChjb250cmlidXRvcnMpID0+IGNvbnRyaWJ1dG9ycy5tYXAoc29ydFBlb3BsZU9iamVjdCkpLFxuICB9LFxuICAvKiB2c2NvZGUgKi8geyBrZXk6ICdwdWJsaXNoZXInIH0sXG4gIHsga2V5OiAnc2lkZUVmZmVjdHMnIH0sXG4gIHsga2V5OiAndHlwZScgfSxcbiAgeyBrZXk6ICdpbXBvcnRzJyB9LFxuICB7IGtleTogJ2V4cG9ydHMnLCBvdmVyOiBzb3J0RXhwb3J0cyB9LFxuICB7IGtleTogJ21haW4nIH0sXG4gIHsga2V5OiAnc3ZlbHRlJyB9LFxuICB7IGtleTogJ3VtZDptYWluJyB9LFxuICB7IGtleTogJ2pzZGVsaXZyJyB9LFxuICB7IGtleTogJ3VucGtnJyB9LFxuICB7IGtleTogJ21vZHVsZScgfSxcbiAgeyBrZXk6ICdzb3VyY2UnIH0sXG4gIHsga2V5OiAnanNuZXh0Om1haW4nIH0sXG4gIHsga2V5OiAnYnJvd3NlcicgfSxcbiAgeyBrZXk6ICdyZWFjdC1uYXRpdmUnIH0sXG4gIHsga2V5OiAndHlwZXMnIH0sXG4gIHsga2V5OiAndHlwZXNWZXJzaW9ucycgfSxcbiAgeyBrZXk6ICd0eXBpbmdzJyB9LFxuICB7IGtleTogJ3N0eWxlJyB9LFxuICB7IGtleTogJ2V4YW1wbGUnIH0sXG4gIHsga2V5OiAnZXhhbXBsZXN0eWxlJyB9LFxuICB7IGtleTogJ2Fzc2V0cycgfSxcbiAgeyBrZXk6ICdiaW4nLCBvdmVyOiBzb3J0T2JqZWN0IH0sXG4gIHsga2V5OiAnbWFuJyB9LFxuICB7IGtleTogJ2RpcmVjdG9yaWVzJywgb3Zlcjogc29ydERpcmVjdG9yaWVzIH0sXG4gIHsga2V5OiAnZmlsZXMnLCBvdmVyOiB1bmlxIH0sXG4gIHsga2V5OiAnd29ya3NwYWNlcycsIG92ZXI6IHNvcnRXb3Jrc3BhY2VzIH0sXG4gIC8vIG5vZGUtcHJlLWd5cCBodHRwczovL3d3dy5ucG1qcy5jb20vcGFja2FnZS9ub2RlLXByZS1neXAjMS1hZGQtbmV3LWVudHJpZXMtdG8teW91ci1wYWNrYWdlanNvblxuICB7XG4gICAga2V5OiAnYmluYXJ5JyxcbiAgICBvdmVyOiBzb3J0T2JqZWN0QnkoW1xuICAgICAgJ21vZHVsZV9uYW1lJyxcbiAgICAgICdtb2R1bGVfcGF0aCcsXG4gICAgICAncmVtb3RlX3BhdGgnLFxuICAgICAgJ3BhY2thZ2VfbmFtZScsXG4gICAgICAnaG9zdCcsXG4gICAgXSksXG4gIH0sXG4gIHsga2V5OiAnc2NyaXB0cycsIG92ZXI6IHNvcnRTY3JpcHRzIH0sXG4gIHsga2V5OiAnYmV0dGVyU2NyaXB0cycsIG92ZXI6IHNvcnRTY3JpcHRzIH0sXG4gIC8qIHZzY29kZSAqLyB7IGtleTogJ2wxMG4nIH0sXG4gIC8qIHZzY29kZSAqLyB7IGtleTogJ2NvbnRyaWJ1dGVzJywgb3Zlcjogc29ydE9iamVjdCB9LFxuICAvKiB2c2NvZGUgKi8geyBrZXk6ICdhY3RpdmF0aW9uRXZlbnRzJywgb3ZlcjogdW5pcSB9LFxuICB7IGtleTogJ2h1c2t5Jywgb3Zlcjogb3ZlclByb3BlcnR5KCdob29rcycsIHNvcnRHaXRIb29rcykgfSxcbiAgeyBrZXk6ICdzaW1wbGUtZ2l0LWhvb2tzJywgb3Zlcjogc29ydEdpdEhvb2tzIH0sXG4gIHsga2V5OiAncHJlLWNvbW1pdCcgfSxcbiAgeyBrZXk6ICdjb21taXRsaW50Jywgb3Zlcjogc29ydE9iamVjdCB9LFxuICB7IGtleTogJ2xpbnQtc3RhZ2VkJyB9LFxuICB7IGtleTogJ25hbm8tc3RhZ2VkJyB9LFxuICB7IGtleTogJ2NvbmZpZycsIG92ZXI6IHNvcnRPYmplY3QgfSxcbiAgeyBrZXk6ICdub2RlbW9uQ29uZmlnJywgb3Zlcjogc29ydE9iamVjdCB9LFxuICB7IGtleTogJ2Jyb3dzZXJpZnknLCBvdmVyOiBzb3J0T2JqZWN0IH0sXG4gIHsga2V5OiAnYmFiZWwnLCBvdmVyOiBzb3J0T2JqZWN0IH0sXG4gIHsga2V5OiAnYnJvd3NlcnNsaXN0JyB9LFxuICB7IGtleTogJ3hvJywgb3Zlcjogc29ydE9iamVjdCB9LFxuICB7IGtleTogJ3ByZXR0aWVyJywgb3Zlcjogc29ydFByZXR0aWVyQ29uZmlnIH0sXG4gIHsga2V5OiAnZXNsaW50Q29uZmlnJywgb3Zlcjogc29ydEVzbGludENvbmZpZyB9LFxuICB7IGtleTogJ2VzbGludElnbm9yZScgfSxcbiAgeyBrZXk6ICducG1wa2dqc29ubGludCcsIG92ZXI6IHNvcnRPYmplY3QgfSxcbiAgeyBrZXk6ICducG1QYWNrYWdlSnNvbkxpbnRDb25maWcnLCBvdmVyOiBzb3J0T2JqZWN0IH0sXG4gIHsga2V5OiAnbnBtcGFja2FnZWpzb25saW50Jywgb3Zlcjogc29ydE9iamVjdCB9LFxuICB7IGtleTogJ3JlbGVhc2UnLCBvdmVyOiBzb3J0T2JqZWN0IH0sXG4gIHsga2V5OiAncmVtYXJrQ29uZmlnJywgb3Zlcjogc29ydE9iamVjdCB9LFxuICB7IGtleTogJ3N0eWxlbGludCcgfSxcbiAgeyBrZXk6ICdhdmEnLCBvdmVyOiBzb3J0T2JqZWN0IH0sXG4gIHsga2V5OiAnamVzdCcsIG92ZXI6IHNvcnRPYmplY3QgfSxcbiAgeyBrZXk6ICdqZXN0LWp1bml0Jywgb3Zlcjogc29ydE9iamVjdCB9LFxuICB7IGtleTogJ2plc3Qtc3RhcmUnLCBvdmVyOiBzb3J0T2JqZWN0IH0sXG4gIHsga2V5OiAnbW9jaGEnLCBvdmVyOiBzb3J0T2JqZWN0IH0sXG4gIHsga2V5OiAnbnljJywgb3Zlcjogc29ydE9iamVjdCB9LFxuICB7IGtleTogJ2M4Jywgb3Zlcjogc29ydE9iamVjdCB9LFxuICB7IGtleTogJ3RhcCcsIG92ZXI6IHNvcnRPYmplY3QgfSxcbiAgeyBrZXk6ICdvY2xpZicsIG92ZXI6IHNvcnRPYmplY3RCeSh1bmRlZmluZWQsIHRydWUpIH0sXG4gIHsga2V5OiAncmVzb2x1dGlvbnMnLCBvdmVyOiBzb3J0T2JqZWN0IH0sXG4gIHsga2V5OiAnb3ZlcnJpZGVzJywgb3Zlcjogc29ydERlcGVuZGVuY2llcyB9LFxuICB7IGtleTogJ2RlcGVuZGVuY2llcycsIG92ZXI6IHNvcnREZXBlbmRlbmNpZXMgfSxcbiAgeyBrZXk6ICdkZXZEZXBlbmRlbmNpZXMnLCBvdmVyOiBzb3J0RGVwZW5kZW5jaWVzIH0sXG4gIHsga2V5OiAnZGVwZW5kZW5jaWVzTWV0YScsIG92ZXI6IHNvcnRPYmplY3RCeShzb3J0T2JqZWN0QnlJZGVudCwgdHJ1ZSkgfSxcbiAgeyBrZXk6ICdwZWVyRGVwZW5kZW5jaWVzJywgb3Zlcjogc29ydERlcGVuZGVuY2llcyB9LFxuICAvLyBUT0RPOiBvbmx5IHNvcnQgZGVwdGggPSAyXG4gIHsga2V5OiAncGVlckRlcGVuZGVuY2llc01ldGEnLCBvdmVyOiBzb3J0T2JqZWN0QnkodW5kZWZpbmVkLCB0cnVlKSB9LFxuICB7IGtleTogJ29wdGlvbmFsRGVwZW5kZW5jaWVzJywgb3Zlcjogc29ydERlcGVuZGVuY2llcyB9LFxuICB7IGtleTogJ2J1bmRsZWREZXBlbmRlbmNpZXMnLCBvdmVyOiB1bmlxQW5kU29ydEFycmF5IH0sXG4gIHsga2V5OiAnYnVuZGxlRGVwZW5kZW5jaWVzJywgb3ZlcjogdW5pcUFuZFNvcnRBcnJheSB9LFxuICAvKiB2c2NvZGUgKi8geyBrZXk6ICdleHRlbnNpb25QYWNrJywgb3ZlcjogdW5pcUFuZFNvcnRBcnJheSB9LFxuICAvKiB2c2NvZGUgKi8geyBrZXk6ICdleHRlbnNpb25EZXBlbmRlbmNpZXMnLCBvdmVyOiB1bmlxQW5kU29ydEFycmF5IH0sXG4gIHsga2V5OiAnZmxhdCcgfSxcbiAgeyBrZXk6ICdwYWNrYWdlTWFuYWdlcicgfSxcbiAgeyBrZXk6ICdlbmdpbmVzJywgb3Zlcjogc29ydE9iamVjdCB9LFxuICB7IGtleTogJ2VuZ2luZVN0cmljdCcsIG92ZXI6IHNvcnRPYmplY3QgfSxcbiAgeyBrZXk6ICdkZXZFbmdpbmVzJywgb3Zlcjogc29ydERldkVuZ2luZXMgfSxcbiAgeyBrZXk6ICd2b2x0YScsIG92ZXI6IHNvcnRWb2x0YSB9LFxuICB7IGtleTogJ2xhbmd1YWdlTmFtZScgfSxcbiAgeyBrZXk6ICdvcycgfSxcbiAgeyBrZXk6ICdjcHUnIH0sXG4gIHsga2V5OiAncHJlZmVyR2xvYmFsJywgb3Zlcjogc29ydE9iamVjdCB9LFxuICB7IGtleTogJ3B1Ymxpc2hDb25maWcnLCBvdmVyOiBzb3J0T2JqZWN0IH0sXG4gIC8qIHZzY29kZSAqLyB7IGtleTogJ2ljb24nIH0sXG4gIC8qIHZzY29kZSAqLyB7XG4gICAga2V5OiAnYmFkZ2VzJyxcbiAgICBvdmVyOiBvbkFycmF5KChiYWRnZSkgPT4gYmFkZ2UubWFwKHNvcnRWU0NvZGVCYWRnZU9iamVjdCkpLFxuICB9LFxuICAvKiB2c2NvZGUgKi8geyBrZXk6ICdnYWxsZXJ5QmFubmVyJywgb3Zlcjogc29ydE9iamVjdCB9LFxuICAvKiB2c2NvZGUgKi8geyBrZXk6ICdwcmV2aWV3JyB9LFxuICAvKiB2c2NvZGUgKi8geyBrZXk6ICdtYXJrZG93bicgfSxcbiAgeyBrZXk6ICdwbnBtJywgb3Zlcjogc29ydFBucG1Db25maWcgfSxcbl1cblxuY29uc3QgZGVmYXVsdFNvcnRPcmRlciA9IGZpZWxkcy5tYXAoKHsga2V5IH0pID0+IGtleSlcbmNvbnN0IG92ZXJGaWVsZHMgPSBwaXBlKFxuICBmaWVsZHNcbiAgICAubWFwKCh7IGtleSwgb3ZlciB9KSA9PiAob3ZlciA/IG92ZXJQcm9wZXJ0eShrZXksIG92ZXIpIDogdW5kZWZpbmVkKSlcbiAgICAuZmlsdGVyKEJvb2xlYW4pLFxuKVxuXG5mdW5jdGlvbiBlZGl0U3RyaW5nSlNPTihqc29uLCBvdmVyKSB7XG4gIGlmICh0eXBlb2YganNvbiA9PT0gJ3N0cmluZycpIHtcbiAgICBjb25zdCB7IGluZGVudCwgdHlwZSB9ID0gZGV0ZWN0SW5kZW50KGpzb24pXG4gICAgY29uc3QgZW5kQ2hhcmFjdGVycyA9IGpzb24uc2xpY2UoLTEpID09PSAnXFxuJyA/ICdcXG4nIDogJydcbiAgICBjb25zdCBuZXdsaW5lID0gZGV0ZWN0TmV3bGluZShqc29uKVxuICAgIGpzb24gPSBKU09OLnBhcnNlKGpzb24pXG5cbiAgICBsZXQgcmVzdWx0ID1cbiAgICAgIEpTT04uc3RyaW5naWZ5KG92ZXIoanNvbiksIG51bGwsIHR5cGUgPT09ICd0YWInID8gJ1xcdCcgOiBpbmRlbnQpICtcbiAgICAgIGVuZENoYXJhY3RlcnNcbiAgICBpZiAobmV3bGluZSA9PT0gJ1xcclxcbicpIHtcbiAgICAgIHJlc3VsdCA9IHJlc3VsdC5yZXBsYWNlKC9cXG4vZywgbmV3bGluZSlcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdFxuICB9XG5cbiAgcmV0dXJuIG92ZXIoanNvbilcbn1cblxuZnVuY3Rpb24gc29ydFBhY2thZ2VKc29uKGpzb25Jc2gsIG9wdGlvbnMgPSB7fSkge1xuICByZXR1cm4gZWRpdFN0cmluZ0pTT04oXG4gICAganNvbklzaCxcbiAgICBvbk9iamVjdCgoanNvbikgPT4ge1xuICAgICAgbGV0IHNvcnRPcmRlciA9IG9wdGlvbnMuc29ydE9yZGVyIHx8IGRlZmF1bHRTb3J0T3JkZXJcblxuICAgICAgaWYgKEFycmF5LmlzQXJyYXkoc29ydE9yZGVyKSkge1xuICAgICAgICBjb25zdCBrZXlzID0gT2JqZWN0LmtleXMoanNvbilcbiAgICAgICAgY29uc3QgeyBwcml2YXRlS2V5cyA9IFtdLCBwdWJsaWNLZXlzID0gW10gfSA9IG9iamVjdEdyb3VwQnkoXG4gICAgICAgICAga2V5cyxcbiAgICAgICAgICAoa2V5KSA9PiAoa2V5WzBdID09PSAnXycgPyAncHJpdmF0ZUtleXMnIDogJ3B1YmxpY0tleXMnKSxcbiAgICAgICAgKVxuICAgICAgICBzb3J0T3JkZXIgPSBbXG4gICAgICAgICAgLi4uc29ydE9yZGVyLFxuICAgICAgICAgIC4uLmRlZmF1bHRTb3J0T3JkZXIsXG4gICAgICAgICAgLi4ucHVibGljS2V5cy5zb3J0KCksXG4gICAgICAgICAgLi4ucHJpdmF0ZUtleXMuc29ydCgpLFxuICAgICAgICBdXG4gICAgICB9XG5cbiAgICAgIHJldHVybiBvdmVyRmllbGRzKHNvcnRPYmplY3RLZXlzKGpzb24sIHNvcnRPcmRlciksIGpzb24pXG4gICAgfSksXG4gIClcbn1cblxuZXhwb3J0IGRlZmF1bHQgc29ydFBhY2thZ2VKc29uXG5leHBvcnQgeyBzb3J0UGFja2FnZUpzb24sIGRlZmF1bHRTb3J0T3JkZXIgYXMgc29ydE9yZGVyIH1cbiIsImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGlzUGxhaW5PYmplY3QodmFsdWUpIHtcblx0aWYgKHR5cGVvZiB2YWx1ZSAhPT0gJ29iamVjdCcgfHwgdmFsdWUgPT09IG51bGwpIHtcblx0XHRyZXR1cm4gZmFsc2U7XG5cdH1cblxuXHRjb25zdCBwcm90b3R5cGUgPSBPYmplY3QuZ2V0UHJvdG90eXBlT2YodmFsdWUpO1xuXHRyZXR1cm4gKHByb3RvdHlwZSA9PT0gbnVsbCB8fCBwcm90b3R5cGUgPT09IE9iamVjdC5wcm90b3R5cGUgfHwgT2JqZWN0LmdldFByb3RvdHlwZU9mKHByb3RvdHlwZSkgPT09IG51bGwpICYmICEoU3ltYm9sLnRvU3RyaW5nVGFnIGluIHZhbHVlKSAmJiAhKFN5bWJvbC5pdGVyYXRvciBpbiB2YWx1ZSk7XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgeyBzb3J0UGFja2FnZUpzb24gfSBmcm9tICdzb3J0LXBhY2thZ2UtanNvbic7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgeyBmc1V0aWwgfSBmcm9tICcuLi91dGlscy9mc1V0aWwuanMnO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZml4VGVzdERpcmVjdG9yaWVzVXBkYXRpbmdQYWNrYWdlSnNvbihwYWNrYWdlRGlyUGF0aHM6IHN0cmluZ1tdKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZml4VGVzdERpcmVjdG9yaWVzVXBkYXRpbmdQYWNrYWdlSnNvbicsIGFzeW5jICgpID0+IHtcbiAgICBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgIHBhY2thZ2VEaXJQYXRocy5tYXAoYXN5bmMgKHBhY2thZ2VEaXJQYXRoKSA9PiB7XG4gICAgICAgIGNvbnN0IHBhY2thZ2VKc29uUGF0aCA9IHBhdGguam9pbihwYWNrYWdlRGlyUGF0aCwgJ3BhY2thZ2UuanNvbicpO1xuICAgICAgICBpZiAoIWZzLmV4aXN0c1N5bmMocGFja2FnZUpzb25QYXRoKSkgcmV0dXJuO1xuXG4gICAgICAgIGNvbnN0IG5ld1Rlc3REaXJQYXRoID0gcGF0aC5qb2luKHBhY2thZ2VEaXJQYXRoLCAndGVzdCcpO1xuICAgICAgICBmb3IgKGNvbnN0IG9sZFRlc3REaXJOYW1lIG9mIFsnX190ZXN0c19fJywgJ3Rlc3RzJ10pIHtcbiAgICAgICAgICBjb25zdCBvbGRUZXN0RGlyUGF0aCA9IHBhdGguam9pbihwYWNrYWdlRGlyUGF0aCwgb2xkVGVzdERpck5hbWUpO1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBhd2FpdCBtb3ZlVGVzdERpcmVjdG9yeShvbGRUZXN0RGlyUGF0aCwgbmV3VGVzdERpclBhdGgpO1xuICAgICAgICAgICAgY29uc3QgcGFja2FnZUpzb24gPSBKU09OLnBhcnNlKGF3YWl0IGZzLnByb21pc2VzLnJlYWRGaWxlKHBhY2thZ2VKc29uUGF0aCwgJ3V0ZjgnKSkgYXMge1xuICAgICAgICAgICAgICBzY3JpcHRzPzogUmVjb3JkPHN0cmluZywgc3RyaW5nPjtcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBsZXQgZGlkVXBkYXRlU2NyaXB0ID0gZmFsc2U7XG4gICAgICAgICAgICBjb25zdCBzY3JpcHRzID0gcGFja2FnZUpzb24uc2NyaXB0cyA/PyB7fTtcbiAgICAgICAgICAgIGZvciAoY29uc3QgW3NjcmlwdE5hbWUsIHNjcmlwdF0gb2YgT2JqZWN0LmVudHJpZXMoc2NyaXB0cykpIHtcbiAgICAgICAgICAgICAgY29uc3QgbmV3U2NyaXB0ID0gc2NyaXB0LnJlcGxhY2VBbGwob2xkVGVzdERpck5hbWUsICd0ZXN0Jyk7XG4gICAgICAgICAgICAgIGlmIChzY3JpcHQgIT09IG5ld1NjcmlwdCkge1xuICAgICAgICAgICAgICAgIHNjcmlwdHNbc2NyaXB0TmFtZV0gPSBuZXdTY3JpcHQ7XG4gICAgICAgICAgICAgICAgZGlkVXBkYXRlU2NyaXB0ID0gdHJ1ZTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcGFja2FnZUpzb24uc2NyaXB0cyA9IHNjcmlwdHM7XG4gICAgICAgICAgICBpZiAoIWRpZFVwZGF0ZVNjcmlwdCkgcmV0dXJuO1xuXG4gICAgICAgICAgICBhd2FpdCBmc1V0aWwuZ2VuZXJhdGVGaWxlKHBhY2thZ2VKc29uUGF0aCwgSlNPTi5zdHJpbmdpZnkoc29ydFBhY2thZ2VKc29uKHBhY2thZ2VKc29uKSwgdW5kZWZpbmVkLCAyKSk7XG4gICAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgICAvLyBkbyBub3RoaW5nXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9KVxuICAgICk7XG4gIH0pO1xufVxuXG5hc3luYyBmdW5jdGlvbiBtb3ZlVGVzdERpcmVjdG9yeShvbGRUZXN0RGlyUGF0aDogc3RyaW5nLCBuZXdUZXN0RGlyUGF0aDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gIGlmICghZnMuZXhpc3RzU3luYyhuZXdUZXN0RGlyUGF0aCkpIHtcbiAgICBhd2FpdCBmcy5wcm9taXNlcy5yZW5hbWUob2xkVGVzdERpclBhdGgsIG5ld1Rlc3REaXJQYXRoKTtcbiAgICByZXR1cm47XG4gIH1cblxuICBjb25zdCBkaXJlbnRzID0gYXdhaXQgZnMucHJvbWlzZXMucmVhZGRpcihvbGRUZXN0RGlyUGF0aCwgeyB3aXRoRmlsZVR5cGVzOiB0cnVlIH0pO1xuICBhd2FpdCBQcm9taXNlLmFsbChcbiAgICBkaXJlbnRzLm1hcChhc3luYyAoZGlyZW50KSA9PiB7XG4gICAgICBjb25zdCBvbGRQYXRoID0gcGF0aC5qb2luKG9sZFRlc3REaXJQYXRoLCBkaXJlbnQubmFtZSk7XG4gICAgICBjb25zdCBuZXdQYXRoID0gcGF0aC5qb2luKG5ld1Rlc3REaXJQYXRoLCBkaXJlbnQubmFtZSk7XG4gICAgICBjb25zdCBuZXdQYXRoU3RhdCA9IGZzLmV4aXN0c1N5bmMobmV3UGF0aCkgPyBhd2FpdCBmcy5wcm9taXNlcy5zdGF0KG5ld1BhdGgpIDogdW5kZWZpbmVkO1xuICAgICAgaWYgKGRpcmVudC5pc0RpcmVjdG9yeSgpICYmIG5ld1BhdGhTdGF0Py5pc0RpcmVjdG9yeSgpKSB7XG4gICAgICAgIGF3YWl0IG1vdmVUZXN0RGlyZWN0b3J5KG9sZFBhdGgsIG5ld1BhdGgpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBhd2FpdCBmcy5wcm9taXNlcy5yZW5hbWUob2xkUGF0aCwgbmV3UGF0aCk7XG4gICAgfSlcbiAgKTtcbiAgYXdhaXQgZnMucHJvbWlzZXMucm0ob2xkVGVzdERpclBhdGgsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMvcHJvbWlzZXMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHsgaWdub3JlRW5vZW50QXN5bmMgfSBmcm9tICdAd2lsbGJvb3N0ZXIvc2hhcmVkLWxpYi9zcmMnO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGZpeFR5cGVEZWZpbml0aW9ucyhcbiAgY29uZmlnOiBQYWNrYWdlQ29uZmlnLFxuICBjb25maWdzSW5jbHVkaW5nQ2hpbGRyZW46IFBhY2thZ2VDb25maWdbXVxuKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZml4VHlwZURlZmluaXRpb25zJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IGxpYlR5cGVEaXJQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnQHR5cGVzJyk7XG4gICAgY29uc3Qgc3JjVHlwZURpclBhdGggPVxuICAgICAgY29uZmlnLmlzUm9vdCAmJiBjb25maWcuZG9lc0NvbnRhaW5TdWJQYWNrYWdlSnNvbnMgPyB1bmRlZmluZWQgOiBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICdzcmMnLCAndHlwZXMnKTtcblxuICAgIGNvbnN0IGRpcmVudHMgPSBhd2FpdCBpZ25vcmVFbm9lbnRBc3luYygoKSA9PiBmcy5yZWFkZGlyKGxpYlR5cGVEaXJQYXRoLCB7IHdpdGhGaWxlVHlwZXM6IHRydWUgfSkpO1xuICAgIGlmICghZGlyZW50cykgcmV0dXJuO1xuXG4gICAgZm9yIChjb25zdCBkaXJlbnQgb2YgZGlyZW50cykge1xuICAgICAgY29uc3QgZGlyTmFtZSA9IGRpcmVudC5uYW1lLnNsaWNlKDAsIC01KTtcbiAgICAgIGNvbnN0IGhhc1R5cGVEZWNsYXJhdGlvbkV4dGVuc2lvbiA9IGRpcmVudC5uYW1lLmVuZHNXaXRoKCcuZC50cycpO1xuICAgICAgbGV0IHBhY2thZ2VOYW1lID0gaGFzVHlwZURlY2xhcmF0aW9uRXh0ZW5zaW9uID8gZGlyTmFtZSA6IGRpcmVudC5uYW1lO1xuICAgICAgaWYgKHBhY2thZ2VOYW1lLmluY2x1ZGVzKCdfXycpKSB7XG4gICAgICAgIHBhY2thZ2VOYW1lID0gYEAke3BhY2thZ2VOYW1lLnJlcGxhY2UoJ19fJywgJy8nKX1gO1xuICAgICAgfVxuICAgICAgY29uc3QgaGFzTGlicmFyeSA9IGNvbmZpZ3NJbmNsdWRpbmdDaGlsZHJlbi5zb21lKFxuICAgICAgICAoY29uZmlnKSA9PlxuICAgICAgICAgIGNvbmZpZy5wYWNrYWdlSnNvbj8uZGVwZW5kZW5jaWVzPy5bcGFja2FnZU5hbWVdIHx8IGNvbmZpZy5wYWNrYWdlSnNvbj8uZGV2RGVwZW5kZW5jaWVzPy5bcGFja2FnZU5hbWVdXG4gICAgICApO1xuXG4gICAgICBpZiAoZGlyZW50LmlzRmlsZSgpICYmIGhhc1R5cGVEZWNsYXJhdGlvbkV4dGVuc2lvbikge1xuICAgICAgICBpZiAoaGFzTGlicmFyeSkge1xuICAgICAgICAgIC8vIE1vdmUgQHR5cGVzLzxuYW1lPi9pbmRleC5kLnRzIGlmIGluc3RhbGxlZFxuICAgICAgICAgIGF3YWl0IGZzLm1rZGlyKHBhdGguam9pbihsaWJUeXBlRGlyUGF0aCwgZGlyTmFtZSksIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICAgICAgICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PlxuICAgICAgICAgICAgZnMucmVuYW1lKHBhdGguam9pbihsaWJUeXBlRGlyUGF0aCwgZGlyZW50Lm5hbWUpLCBwYXRoLmpvaW4obGliVHlwZURpclBhdGgsIGRpck5hbWUsICdpbmRleC5kLnRzJykpXG4gICAgICAgICAgKTtcbiAgICAgICAgfSBlbHNlIGlmIChzcmNUeXBlRGlyUGF0aCkge1xuICAgICAgICAgIC8vIE1vdmUgc3JjL3R5cGVzLzxuYW1lPiBpZiBub3QgaW5zdGFsbGVkXG4gICAgICAgICAgYXdhaXQgZnMubWtkaXIoc3JjVHlwZURpclBhdGgsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICAgICAgICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PlxuICAgICAgICAgICAgZnMucmVuYW1lKHBhdGguam9pbihsaWJUeXBlRGlyUGF0aCwgZGlyZW50Lm5hbWUpLCBwYXRoLmpvaW4oc3JjVHlwZURpclBhdGgsIGRpcmVudC5uYW1lKSlcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKGRpcmVudC5pc0RpcmVjdG9yeSgpICYmIHNyY1R5cGVEaXJQYXRoICYmICFoYXNMaWJyYXJ5KSB7XG4gICAgICAgIC8vIE1vdmUgc3JjL3R5cGVzLzxuYW1lPi5kLnRzIGlmIG5vdCBpbnN0YWxsZWRcbiAgICAgICAgYXdhaXQgZnMubWtkaXIoc3JjVHlwZURpclBhdGgsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICAgICAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT5cbiAgICAgICAgICBpZ25vcmVFbm9lbnRBc3luYygoKSA9PlxuICAgICAgICAgICAgZnMucmVuYW1lKFxuICAgICAgICAgICAgICBwYXRoLmpvaW4obGliVHlwZURpclBhdGgsIGRpcmVudC5uYW1lLCAnaW5kZXguZC50cycpLFxuICAgICAgICAgICAgICBwYXRoLmpvaW4oc3JjVHlwZURpclBhdGgsIGAke2RpcmVudC5uYW1lfS5kLnRzYClcbiAgICAgICAgICAgIClcbiAgICAgICAgICApXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuICB9KTtcbn1cbiIsImltcG9ydCBtZXJnZSBmcm9tICdkZWVwbWVyZ2UnO1xuXG5leHBvcnQgZnVuY3Rpb24gb3ZlcndyaXRlTWVyZ2U8VD4oZGVzdGluYXRpb25BcnJheTogVFtdLCBzb3VyY2VBcnJheTogVFtdKTogVFtdIHtcbiAgcmV0dXJuIHNvdXJjZUFycmF5O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY29tYmluZU1lcmdlKHRhcmdldDogdW5rbm93bltdLCBzb3VyY2U6IHVua25vd25bXSwgb3B0aW9uczogbWVyZ2UuQXJyYXlNZXJnZU9wdGlvbnMpOiB1bmtub3duW10ge1xuICBjb25zdCBkZXN0aW5hdGlvbiA9IFsuLi50YXJnZXRdO1xuXG4gIGZvciAoY29uc3QgW2luZGV4LCBpdGVtXSBvZiBzb3VyY2UuZW50cmllcygpKSB7XG4gICAgaWYgKGRlc3RpbmF0aW9uW2luZGV4XSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBkZXN0aW5hdGlvbltpbmRleF0gPSBjbG9uZVVubGVzc090aGVyd2lzZVNwZWNpZmllZChpdGVtLCBvcHRpb25zKTtcbiAgICB9IGVsc2UgaWYgKGlzTWVyZ2VhYmxlT2JqZWN0KHRhcmdldFtpbmRleF0sIG9wdGlvbnMpICYmIGlzTWVyZ2VhYmxlT2JqZWN0KGl0ZW0sIG9wdGlvbnMpKSB7XG4gICAgICBkZXN0aW5hdGlvbltpbmRleF0gPSBtZXJnZSh0YXJnZXRbaW5kZXhdLCBpdGVtLCBvcHRpb25zKTtcbiAgICB9IGVsc2UgaWYgKCF0YXJnZXQuaW5jbHVkZXMoaXRlbSkpIHtcbiAgICAgIGRlc3RpbmF0aW9uLnB1c2goaXRlbSk7XG4gICAgfVxuICB9XG4gIHJldHVybiBkZXN0aW5hdGlvbjtcbn1cblxuZnVuY3Rpb24gY2xvbmVVbmxlc3NPdGhlcndpc2VTcGVjaWZpZWQodmFsdWU6IHVua25vd24sIG9wdGlvbnM6IG1lcmdlLkFycmF5TWVyZ2VPcHRpb25zKTogdW5rbm93biB7XG4gIHJldHVybiBpc01lcmdlYWJsZU9iamVjdCh2YWx1ZSwgb3B0aW9ucykgPyBvcHRpb25zLmNsb25lVW5sZXNzT3RoZXJ3aXNlU3BlY2lmaWVkKHZhbHVlLCBvcHRpb25zKSA6IHZhbHVlO1xufVxuXG5mdW5jdGlvbiBpc01lcmdlYWJsZU9iamVjdCh2YWx1ZTogdW5rbm93biwgb3B0aW9uczogbWVyZ2UuQXJyYXlNZXJnZU9wdGlvbnMpOiB2YWx1ZSBpcyBvYmplY3Qge1xuICByZXR1cm4gISF2YWx1ZSAmJiB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnICYmIG9wdGlvbnMuaXNNZXJnZWFibGVPYmplY3QodmFsdWUpO1xufVxuIiwiZXhwb3J0IGZ1bmN0aW9uIG1vdmVUb0JvdHRvbTxUT2JqIGV4dGVuZHMgUmVjb3JkPFRLZXksIHVua25vd24+LCBUS2V5IGV4dGVuZHMgc3RyaW5nIHwgbnVtYmVyIHwgc3ltYm9sPihcbiAgb2JqOiBUT2JqLFxuICBrZXk6IFRLZXlcbik6IFRPYmoge1xuICBjb25zdCB2YWx1ZSA9IG9ialtrZXldO1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWR5bmFtaWMtZGVsZXRlXG4gIGRlbGV0ZSBvYmpba2V5XTtcbiAgKG9iaiBhcyBSZWNvcmQ8VEtleSwgdW5rbm93bj4pW2tleV0gPSB2YWx1ZTtcbiAgcmV0dXJuIG9iajtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHNvcnRLZXlzPFQgZXh0ZW5kcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj4ob2JqOiBUKTogVCB7XG4gIGNvbnN0IGtleUFuZFZhbHVlcyA9IE9iamVjdC5lbnRyaWVzKG9iaikudG9Tb3J0ZWQoKFtrZXkxXSwgW2tleTJdKSA9PiBrZXkxLmxvY2FsZUNvbXBhcmUoa2V5MikpO1xuICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBrZXlBbmRWYWx1ZXMpIHtcbiAgICAvLyBwYWNrYWdlLmpzb24tc3R5bGUga2V5cyBhcmUgbm9uLWFycmF5LWluZGV4IGtleXMsIHNvIEpTT04uc3RyaW5naWZ5IHByZXNlcnZlcyB0aGlzIGluc2VydGlvbiBvcmRlci5cbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWR5bmFtaWMtZGVsZXRlXG4gICAgZGVsZXRlIG9ialtrZXldO1xuICAgIChvYmogYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pW2tleV0gPSB2YWx1ZTtcblxuICAgIC8vIGlmIHZhbHVlIGlzIGFuIG9iamVjdCwgc29ydCB0aGUga2V5cyBvZiB0aGUgb2JqZWN0XG4gICAgaWYgKHZhbHVlICYmIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiYgIUFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgICBzb3J0S2V5cyh2YWx1ZSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPik7XG4gICAgfVxuICB9XG4gIHJldHVybiBvYmo7XG59XG4iLCIvLyBHaXRIdWIgQWN0aW9ucyB2YWx1ZWxlc3MgZXZlbnRzIHN1Y2ggYXMgYHB1bGxfcmVxdWVzdDpgIHJlcXVpcmUgWUFNTCBudWxsIHZhbHVlcy5cbi8vIG94bGludC1kaXNhYmxlIGVzbGludC1wbHVnaW4taW1wb3J0L25vLW5hbWVkLWFzLWRlZmF1bHQtbWVtYmVyIC0tIE5hbWVzcGFjZSBZQU1MIGNhbGxzIG1ha2UgbG9hZC9kdW1wIHVzYWdlIGNsZWFyZXIuXG4vKiBlc2xpbnQtZGlzYWJsZSB1bmljb3JuL25vLW51bGwgKi9cblxuaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IG1lcmdlIGZyb20gJ2RlZXBtZXJnZSc7XG5pbXBvcnQgeWFtbCBmcm9tICdqcy15YW1sJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgY29tYmluZU1lcmdlIH0gZnJvbSAnLi4vdXRpbHMvbWVyZ2VVdGlsLmpzJztcbmltcG9ydCB7IG1vdmVUb0JvdHRvbSwgc29ydEtleXMgfSBmcm9tICcuLi91dGlscy9vYmplY3RVdGlsLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuXG5pbnRlcmZhY2UgV29ya2Zsb3cge1xuICBuYW1lPzogc3RyaW5nO1xuICBvbj86IE9uO1xuICBjb25jdXJyZW5jeT86IENvbmN1cnJlbmN5O1xuICBwZXJtaXNzaW9ucz86IFJlY29yZDxzdHJpbmcsIHN0cmluZz47XG4gIGpvYnM6IFJlY29yZDxzdHJpbmcsIEpvYj47XG59XG5cbmludGVyZmFjZSBDb25jdXJyZW5jeSB7XG4gIGdyb3VwOiBzdHJpbmc7XG4gICdjYW5jZWwtaW4tcHJvZ3Jlc3MnOiBib29sZWFuO1xufVxuXG5pbnRlcmZhY2UgT24ge1xuICAvLyBHaXRIdWIgQWN0aW9ucyB0cmVhdHMgYGV2ZW50OiBudWxsYCBhcyBhIHZhbHVlbGVzcyBldmVudCBtYXBwaW5nLCBlLmcuXG4gIC8vIGBwdWxsX3JlcXVlc3Q6YC4gYHVuZGVmaW5lZGAgd291bGQgb21pdCB0aGUgZXZlbnQgZW50aXJlbHkgd2hlbiBkdW1waW5nIFlBTUwuXG4gIGlzc3Vlcz86IFR5cGVzIHwgbnVsbDtcbiAgcHVsbF9yZXF1ZXN0PzogUHVsbFJlcXVlc3QgfCBudWxsO1xuICBwdWxsX3JlcXVlc3RfdGFyZ2V0PzogVHlwZXMgfCBudWxsO1xuICBwdXNoPzogUHVzaDtcbiAgc2NoZWR1bGU/OiBTY2hlZHVsZVtdO1xuICB3b3JrZmxvd19kaXNwYXRjaD86IG51bGw7XG59XG5cbmludGVyZmFjZSBQdWxsUmVxdWVzdCB7XG4gICdwYXRocy1pZ25vcmUnPzogc3RyaW5nW107XG4gIHR5cGVzPzogc3RyaW5nW107XG59XG5cbmludGVyZmFjZSBQdXNoIHtcbiAgYnJhbmNoZXM6IHN0cmluZ1tdO1xuICAncGF0aHMtaWdub3JlJz86IHN0cmluZ1tdO1xufVxuXG5pbnRlcmZhY2UgU2NoZWR1bGUge1xuICBjcm9uOiBzdHJpbmc7XG59XG5cbmludGVyZmFjZSBUeXBlcyB7XG4gIHR5cGVzOiBzdHJpbmdbXTtcbn1cblxuaW50ZXJmYWNlIEpvYiB7XG4gICdydW5zLW9uJz86IHN0cmluZztcbiAgcGVybWlzc2lvbnM/OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+O1xuICBzdGVwcz86IFN0ZXBbXTtcbiAgdXNlcz86IHN0cmluZztcbiAgaWY/OiBzdHJpbmc7XG4gIHNlY3JldHM/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgd2l0aD86IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xufVxuXG5pbnRlcmZhY2UgU3RlcCB7XG4gIHVzZXM/OiBzdHJpbmc7XG4gIHdpdGg/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgcnVuPzogc3RyaW5nO1xufVxuXG5jb25zdCBwdWJsaWNSZXBvQXV0b2ZpeFdvcmtmbG93OiBXb3JrZmxvdyA9IHtcbiAgbmFtZTogJ2F1dG9maXguY2knLFxuICBvbjoge1xuICAgIHB1bGxfcmVxdWVzdDogbnVsbCxcbiAgICBwdXNoOiB7XG4gICAgICBicmFuY2hlczogWydtYWluJ10sXG4gICAgfSxcbiAgfSxcbiAgcGVybWlzc2lvbnM6IHtcbiAgICBjb250ZW50czogJ3JlYWQnLFxuICB9LFxuICBjb25jdXJyZW5jeToge1xuICAgIGdyb3VwOiAnYXV0b2ZpeC0ke3sgZ2l0aHViLmhlYWRfcmVmIH19JyxcbiAgICAnY2FuY2VsLWluLXByb2dyZXNzJzogdHJ1ZSxcbiAgfSxcbiAgam9iczoge1xuICAgIGF1dG9maXg6IHsgJ3J1bnMtb24nOiAndWJ1bnR1LWxhdGVzdCcgfSxcbiAgfSxcbn07XG5cbmNvbnN0IHByaXZhdGVSZXBvQXV0b2ZpeFdvcmtmbG93OiBXb3JrZmxvdyA9IHtcbiAgbmFtZTogJ0ZpeCBjb2RlIGF1dG9tYXRpY2FsbHknLFxuICBvbjoge1xuICAgIHB1bGxfcmVxdWVzdDogbnVsbCxcbiAgfSxcbiAgY29uY3VycmVuY3k6IHtcbiAgICBncm91cDogJyR7eyBnaXRodWIud29ya2Zsb3cgfX0tJHt7IGdpdGh1Yi5yZWYgfX0nLFxuICAgICdjYW5jZWwtaW4tcHJvZ3Jlc3MnOiB0cnVlLFxuICB9LFxuICBqb2JzOiB7XG4gICAgYXV0b2ZpeDoge1xuICAgICAgdXNlczogJ1dpbGxCb29zdGVyL3JldXNhYmxlLXdvcmtmbG93cy8uZ2l0aHViL3dvcmtmbG93cy9hdXRvZml4LnltbEBtYWluJyxcbiAgICB9LFxuICB9LFxufTtcblxuY29uc3Qgd29ya2Zsb3dzID0ge1xuICB0ZXN0OiB7XG4gICAgbmFtZTogJ1Rlc3QnLFxuICAgIG9uOiB7XG4gICAgICBwdWxsX3JlcXVlc3Q6IG51bGwsXG4gICAgICBwdXNoOiB7XG4gICAgICAgIGJyYW5jaGVzOiBbJ21haW4nLCAnd2JmeSddLFxuICAgICAgfSxcbiAgICB9LFxuICAgIC8vIGNmLiBodHRwczovL2RvY3MuZ2l0aHViLmNvbS9lbi9hY3Rpb25zL3VzaW5nLWpvYnMvdXNpbmctY29uY3VycmVuY3kjZXhhbXBsZS1vbmx5LWNhbmNlbC1pbi1wcm9ncmVzcy1qb2JzLW9yLXJ1bnMtZm9yLXRoZS1jdXJyZW50LXdvcmtmbG93XG4gICAgY29uY3VycmVuY3k6IHtcbiAgICAgIGdyb3VwOiAnJHt7IGdpdGh1Yi53b3JrZmxvdyB9fS0ke3sgZ2l0aHViLnJlZiB9fScsXG4gICAgICAnY2FuY2VsLWluLXByb2dyZXNzJzogdHJ1ZSxcbiAgICB9LFxuICAgIHBlcm1pc3Npb25zOiB7XG4gICAgICAvLyBmb3IgbGludGVyIGZpeFxuICAgICAgY29udGVudHM6ICd3cml0ZScsXG4gICAgfSxcbiAgICBqb2JzOiB7XG4gICAgICB0ZXN0OiB7XG4gICAgICAgIHVzZXM6ICdXaWxsQm9vc3Rlci9yZXVzYWJsZS13b3JrZmxvd3MvLmdpdGh1Yi93b3JrZmxvd3MvdGVzdC55bWxAbWFpbicsXG4gICAgICB9LFxuICAgIH0sXG4gIH0sXG4gIHJlbGVhc2U6IHtcbiAgICBuYW1lOiAnUmVsZWFzZScsXG4gICAgb246IHtcbiAgICAgIHB1c2g6IHtcbiAgICAgICAgYnJhbmNoZXM6IFtdLFxuICAgICAgfSxcbiAgICB9LFxuICAgIGNvbmN1cnJlbmN5OiB7XG4gICAgICBncm91cDogJyR7eyBnaXRodWIud29ya2Zsb3cgfX0nLFxuICAgICAgJ2NhbmNlbC1pbi1wcm9ncmVzcyc6IGZhbHNlLFxuICAgIH0sXG4gICAgcGVybWlzc2lvbnM6IHtcbiAgICAgIC8vIGh0dHBzOi8vZG9jcy5ucG1qcy5jb20vdHJ1c3RlZC1wdWJsaXNoZXJzI3N0ZXAtMi1jb25maWd1cmUteW91ci1jaWNkLXdvcmtmbG93XG4gICAgICAnaWQtdG9rZW4nOiAnd3JpdGUnLFxuICAgICAgLy8gZm9yIHNlbWFudGljLXJlbGVhc2VcbiAgICAgIGNvbnRlbnRzOiAnd3JpdGUnLFxuICAgIH0sXG4gICAgam9iczoge1xuICAgICAgcmVsZWFzZToge1xuICAgICAgICB1c2VzOiAnV2lsbEJvb3N0ZXIvcmV1c2FibGUtd29ya2Zsb3dzLy5naXRodWIvd29ya2Zsb3dzL3JlbGVhc2UueW1sQG1haW4nLFxuICAgICAgfSxcbiAgICB9LFxuICB9LFxuICAnc2VtYW50aWMtcHInOiB7XG4gICAgbmFtZTogJ0xpbnQgUFIgdGl0bGUnLFxuICAgIG9uOiB7XG4gICAgICBwdWxsX3JlcXVlc3RfdGFyZ2V0OiB7XG4gICAgICAgIHR5cGVzOiBbJ29wZW5lZCcsICdlZGl0ZWQnLCAnc3luY2hyb25pemUnXSxcbiAgICAgIH0sXG4gICAgfSxcbiAgICBqb2JzOiB7XG4gICAgICAnc2VtYW50aWMtcHInOiB7XG4gICAgICAgIHVzZXM6ICdXaWxsQm9vc3Rlci9yZXVzYWJsZS13b3JrZmxvd3MvLmdpdGh1Yi93b3JrZmxvd3Mvc2VtYW50aWMtcHIueW1sQG1haW4nLFxuICAgICAgfSxcbiAgICB9LFxuICB9LFxuICBzeW5jOiB7XG4gICAgbmFtZTogJ1N5bmMnLFxuICAgIG9uOiB7fSxcbiAgICBwZXJtaXNzaW9uczoge1xuICAgICAgLy8gZm9yIGNvbW1pdGluZyBjaGFuZ2VzXG4gICAgICBjb250ZW50czogJ3dyaXRlJyxcbiAgICB9LFxuICAgIGpvYnM6IHtcbiAgICAgIHN5bmM6IHsgdXNlczogJ1dpbGxCb29zdGVyL3JldXNhYmxlLXdvcmtmbG93cy8uZ2l0aHViL3dvcmtmbG93cy9zeW5jLnltbEBtYWluJyB9LFxuICAgIH0sXG4gIH0sXG4gICdjbG9zZS1jb21tZW50Jzoge1xuICAgIG5hbWU6ICdBZGQgY2xvc2UgY29tbWVudCcsXG4gICAgb246IHtcbiAgICAgIHB1bGxfcmVxdWVzdDoge1xuICAgICAgICB0eXBlczogWydvcGVuZWQnXSxcbiAgICAgIH0sXG4gICAgfSxcbiAgICBqb2JzOiB7XG4gICAgICAnY2xvc2UtY29tbWVudCc6IHtcbiAgICAgICAgdXNlczogJ1dpbGxCb29zdGVyL3JldXNhYmxlLXdvcmtmbG93cy8uZ2l0aHViL3dvcmtmbG93cy9jbG9zZS1jb21tZW50LnltbEBtYWluJyxcbiAgICAgIH0sXG4gICAgfSxcbiAgfSxcbiAgJ2dlbi1wci1jbGF1ZGUnOiB7XG4gICAgbmFtZTogJ0dlbmVyYXRlIFBSIHdpdGggQ2xhdWRlIENvZGUnLFxuICAgIG9uOiB7XG4gICAgICBpc3N1ZXM6IHtcbiAgICAgICAgdHlwZXM6IFsnbGFiZWxlZCddLFxuICAgICAgfSxcbiAgICAgIHB1bGxfcmVxdWVzdDoge1xuICAgICAgICB0eXBlczogWydsYWJlbGVkJ10sXG4gICAgICB9LFxuICAgIH0sXG4gICAgam9iczoge1xuICAgICAgJ2dlbi1wcic6IHtcbiAgICAgICAgaWY6IFwiY29udGFpbnMoZ2l0aHViLmV2ZW50LmxhYmVsLm5hbWUsICdnZW4tcHItYWxsJykgfHwgY29udGFpbnMoZ2l0aHViLmV2ZW50LmxhYmVsLm5hbWUsICdnZW4tcHItY2xhdWRlJylcIixcbiAgICAgICAgdXNlczogJ1dpbGxCb29zdGVyL3JldXNhYmxlLXdvcmtmbG93cy8uZ2l0aHViL3dvcmtmbG93cy9nZW4tcHIueW1sQG1haW4nLFxuICAgICAgICB3aXRoOiB7XG4gICAgICAgICAgJ2NvZGluZy10b29sJzogJ2NsYXVkZS1jb2RlJyxcbiAgICAgICAgICAnaXNzdWUtbnVtYmVyJzogJyR7eyBnaXRodWIuZXZlbnQuaXNzdWUubnVtYmVyIHx8IGdpdGh1Yi5ldmVudC5udW1iZXIgfX0nLFxuICAgICAgICAgICd0ZXN0LWNvbW1hbmQnOiAneWFybnxidW4gY2hlY2stYWxsLWZvci1haScsXG4gICAgICAgIH0sXG4gICAgICAgIHNlY3JldHM6IHtcbiAgICAgICAgICBDTEFVREVfQ09ERV9PQVVUSF9UT0tFTjogJyR7eyBzZWNyZXRzLkNMQVVERV9DT0RFX09BVVRIX1RPS0VOIH19JyxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgfSxcbiAgfSxcbiAgJ2dlbi1wci1jb2RleCc6IHtcbiAgICBuYW1lOiAnR2VuZXJhdGUgUFIgd2l0aCBDb2RleCBDTEknLFxuICAgIG9uOiB7XG4gICAgICBpc3N1ZXM6IHtcbiAgICAgICAgdHlwZXM6IFsnbGFiZWxlZCddLFxuICAgICAgfSxcbiAgICAgIHB1bGxfcmVxdWVzdDoge1xuICAgICAgICB0eXBlczogWydsYWJlbGVkJ10sXG4gICAgICB9LFxuICAgIH0sXG4gICAgam9iczoge1xuICAgICAgJ2dlbi1wcic6IHtcbiAgICAgICAgaWY6IFwiY29udGFpbnMoZ2l0aHViLmV2ZW50LmxhYmVsLm5hbWUsICdnZW4tcHItYWxsJykgfHwgY29udGFpbnMoZ2l0aHViLmV2ZW50LmxhYmVsLm5hbWUsICdnZW4tcHItY29kZXgnKVwiLFxuICAgICAgICB1c2VzOiAnV2lsbEJvb3N0ZXIvcmV1c2FibGUtd29ya2Zsb3dzLy5naXRodWIvd29ya2Zsb3dzL2dlbi1wci55bWxAbWFpbicsXG4gICAgICAgIHdpdGg6IHtcbiAgICAgICAgICAnY29kaW5nLXRvb2wnOiAnY29kZXgtY2xpJyxcbiAgICAgICAgICAnaXNzdWUtbnVtYmVyJzogJyR7eyBnaXRodWIuZXZlbnQuaXNzdWUubnVtYmVyIHx8IGdpdGh1Yi5ldmVudC5udW1iZXIgfX0nLFxuICAgICAgICAgICd0ZXN0LWNvbW1hbmQnOiAneWFybnxidW4gY2hlY2stYWxsLWZvci1haScsXG4gICAgICAgIH0sXG4gICAgICAgIHNlY3JldHM6IHtcbiAgICAgICAgICBPUEVOQUlfQVBJX0tFWTogJyR7eyBzZWNyZXRzLk9QRU5BSV9BUElfS0VZIH19JyxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgfSxcbiAgfSxcbiAgJ2dlbi1wci1nZW1pbmknOiB7XG4gICAgbmFtZTogJ0dlbmVyYXRlIFBSIHdpdGggR2VtaW5pIENMSScsXG4gICAgb246IHtcbiAgICAgIGlzc3Vlczoge1xuICAgICAgICB0eXBlczogWydsYWJlbGVkJ10sXG4gICAgICB9LFxuICAgICAgcHVsbF9yZXF1ZXN0OiB7XG4gICAgICAgIHR5cGVzOiBbJ2xhYmVsZWQnXSxcbiAgICAgIH0sXG4gICAgfSxcbiAgICBqb2JzOiB7XG4gICAgICAnZ2VuLXByJzoge1xuICAgICAgICBpZjogXCJjb250YWlucyhnaXRodWIuZXZlbnQubGFiZWwubmFtZSwgJ2dlbi1wci1hbGwnKSB8fCBjb250YWlucyhnaXRodWIuZXZlbnQubGFiZWwubmFtZSwgJ2dlbi1wci1nZW1pbmknKVwiLFxuICAgICAgICB1c2VzOiAnV2lsbEJvb3N0ZXIvcmV1c2FibGUtd29ya2Zsb3dzLy5naXRodWIvd29ya2Zsb3dzL2dlbi1wci55bWxAbWFpbicsXG4gICAgICAgIHdpdGg6IHtcbiAgICAgICAgICAnY29kaW5nLXRvb2wnOiAnZ2VtaW5pLWNsaScsXG4gICAgICAgICAgJ2lzc3VlLW51bWJlcic6ICcke3sgZ2l0aHViLmV2ZW50Lmlzc3VlLm51bWJlciB8fCBnaXRodWIuZXZlbnQubnVtYmVyIH19JyxcbiAgICAgICAgICAndGVzdC1jb21tYW5kJzogJ3lhcm58YnVuIGNoZWNrLWFsbC1mb3ItYWknLFxuICAgICAgICB9LFxuICAgICAgICBzZWNyZXRzOiB7XG4gICAgICAgICAgR0VNSU5JX0FQSV9LRVk6ICcke3sgc2VjcmV0cy5HRU1JTklfQVBJX0tFWSB9fScsXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgIH0sXG4gIH0sXG59IGFzIGNvbnN0O1xuXG50eXBlIEtub3duS2luZCA9IGtleW9mIHR5cGVvZiB3b3JrZmxvd3MgfCAnZGVwbG95JyB8ICdhdXRvZml4JztcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlV29ya2Zsb3dzKHJvb3RDb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdnZW5lcmF0ZVdvcmtmbG93JywgYXN5bmMgKCkgPT4ge1xuICAgIGlmIChpc1JldXNhYmxlV29ya2Zsb3dzUmVwbyhyb290Q29uZmlnLnJlcG9zaXRvcnkpKSB7XG4gICAgICAvLyBEb24ndCB0b3VjaCByZXVzYWJsZS13b3JrZmxvd3MgcmVwbyBiZWNhdXNlIGl0IGhvc3RzIHVwc3RyZWFtIHdvcmtmbG93IGRlZmluaXRpb25zLlxuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHdvcmtmbG93c1BhdGggPSBwYXRoLnJlc29sdmUocm9vdENvbmZpZy5kaXJQYXRoLCAnLmdpdGh1YicsICd3b3JrZmxvd3MnKTtcbiAgICBhd2FpdCBmcy5wcm9taXNlcy5ta2Rpcih3b3JrZmxvd3NQYXRoLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcblxuICAgIC8vIFJlbW92ZSBjb25maWcgb2Ygc2VtYW50aWMgcHVsbCByZXF1ZXN0XG4gICAgY29uc3Qgc2VtYW50aWNZbWxQYXRoID0gcGF0aC5yZXNvbHZlKHJvb3RDb25maWcuZGlyUGF0aCwgJy5naXRodWInLCAnc2VtYW50aWMueW1sJyk7XG4gICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzLnByb21pc2VzLnJtKHNlbWFudGljWW1sUGF0aCwgeyBmb3JjZTogdHJ1ZSwgcmVjdXJzaXZlOiB0cnVlIH0pKTtcblxuICAgIGNvbnN0IGVudHJpZXMgPSBhd2FpdCBmcy5wcm9taXNlcy5yZWFkZGlyKHdvcmtmbG93c1BhdGgsIHsgd2l0aEZpbGVUeXBlczogdHJ1ZSB9KTtcbiAgICBjb25zdCBmaWxlTmFtZVNldCA9IG5ldyBTZXQoW1xuICAgICAgJ3Rlc3QueW1sJyxcbiAgICAgICdhdXRvZml4LnltbCcsXG4gICAgICAnc2VtYW50aWMtcHIueW1sJyxcbiAgICAgICdjbG9zZS1jb21tZW50LnltbCcsXG4gICAgICAnZ2VuLXByLWNsYXVkZS55bWwnLFxuICAgICAgJ2dlbi1wci1jb2RleC55bWwnLFxuICAgICAgJ2dlbi1wci1nZW1pbmkueW1sJyxcbiAgICAgIC4uLmVudHJpZXMuZmlsdGVyKChkaXJlbnQpID0+IGRpcmVudC5pc0ZpbGUoKSAmJiBkaXJlbnQubmFtZS5lbmRzV2l0aCgnLnltbCcpKS5tYXAoKGRpcmVudCkgPT4gZGlyZW50Lm5hbWUpLFxuICAgIF0pO1xuICAgIGlmIChyb290Q29uZmlnLmRlcGVuZGluZy5zZW1hbnRpY1JlbGVhc2UpIHtcbiAgICAgIGZpbGVOYW1lU2V0LmFkZCgncmVsZWFzZS55bWwnKTtcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IGZpbGVOYW1lIG9mIGZpbGVOYW1lU2V0KSB7XG4gICAgICAvLyDlrp/pmpvjga9Lbm93bktpbmTku6XlpJbjga7lgKTjgoLku6PlhaXjgZXjgozjgovjgZPjgajjgavms6jmhI9cbiAgICAgIGNvbnN0IGtpbmQgPSBwYXRoLmJhc2VuYW1lKGZpbGVOYW1lLCAnLnltbCcpIGFzIEtub3duS2luZDtcbiAgICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiB3cml0ZVdvcmtmbG93WWFtbChyb290Q29uZmlnLCB3b3JrZmxvd3NQYXRoLCBraW5kKSk7XG4gICAgfVxuICB9KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzUmV1c2FibGVXb3JrZmxvd3NSZXBvKHJlcG9zaXRvcnk/OiBzdHJpbmcpOiBib29sZWFuIHtcbiAgcmV0dXJuIHJlcG9zaXRvcnk/LmVuZHNXaXRoKCcvcmV1c2FibGUtd29ya2Zsb3dzJykgPz8gZmFsc2U7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHdyaXRlV29ya2Zsb3dZYW1sKGNvbmZpZzogUGFja2FnZUNvbmZpZywgd29ya2Zsb3dzUGF0aDogc3RyaW5nLCBraW5kOiBLbm93bktpbmQpOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgZmlsZVBhdGggPSBwYXRoLmpvaW4od29ya2Zsb3dzUGF0aCwgYCR7a2luZH0ueW1sYCk7XG4gIGNvbnN0IGRlcGxveVByb2R1Y3Rpb25Xb3JrZmxvd0V4aXN0cyA9IGZzLmV4aXN0c1N5bmMocGF0aC5qb2luKHdvcmtmbG93c1BhdGgsICdkZXBsb3ktcHJvZHVjdGlvbi55bWwnKSk7XG5cbiAgaWYgKGtpbmQgPT09ICdhdXRvZml4Jykge1xuICAgIGF3YWl0IHdyaXRlWWFtbChnZW5lcmF0ZUF1dG9maXhXb3JrZmxvdyhjb25maWcpLCBmaWxlUGF0aCk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgbGV0IG5ld1NldHRpbmdzID0gc3RydWN0dXJlZENsb25lKGtpbmQgaW4gd29ya2Zsb3dzID8gd29ya2Zsb3dzW2tpbmQgYXMga2V5b2YgdHlwZW9mIHdvcmtmbG93c10gOiB7fSkgYXMgV29ya2Zsb3c7XG5cbiAgdHJ5IHtcbiAgICBjb25zdCBvbGRDb250ZW50ID0gYXdhaXQgZnMucHJvbWlzZXMucmVhZEZpbGUoZmlsZVBhdGgsICd1dGY4Jyk7XG4gICAgY29uc3Qgb2xkU2V0dGluZ3MgPSB5YW1sLmxvYWQob2xkQ29udGVudCkgYXMgV29ya2Zsb3c7XG4gICAgbmV3U2V0dGluZ3MgPSBtZXJnZS5hbGwoW25ld1NldHRpbmdzLCBvbGRTZXR0aW5ncywgbmV3U2V0dGluZ3NdLCB7IGFycmF5TWVyZ2U6IGNvbWJpbmVNZXJnZSB9KSBhcyBXb3JrZmxvdztcbiAgfSBjYXRjaCB7XG4gICAgLy8gZG8gbm90aGluZ1xuICB9XG5cbiAgLy8gU2tpcCBhIGJyb2tlbiB3b3JrZmxvd1xuICBpZiAoISgnam9icycgaW4gbmV3U2V0dGluZ3MpKSByZXR1cm47XG5cbiAgaWYgKGtpbmQuc3RhcnRzV2l0aCgnZGVwbG95JykpIHtcbiAgICBuZXdTZXR0aW5ncyA9IHtcbiAgICAgIC4uLm5ld1NldHRpbmdzLFxuICAgICAgY29uY3VycmVuY3k6IHtcbiAgICAgICAgZ3JvdXA6ICcke3sgZ2l0aHViLndvcmtmbG93IH19JyxcbiAgICAgICAgJ2NhbmNlbC1pbi1wcm9ncmVzcyc6IGZhbHNlLFxuICAgICAgfSxcbiAgICB9O1xuICAgIC8vIE1vdmUgam9icyB0byB0aGUgYm90dG9tXG4gICAgbW92ZVRvQm90dG9tKG5ld1NldHRpbmdzLCAnam9icycpO1xuICAgIGlmIChuZXdTZXR0aW5ncy5vbj8ucHVzaCkge1xuICAgICAgbmV3U2V0dGluZ3Mub24ucHVzaFsncGF0aHMtaWdub3JlJ10gPSBbXG4gICAgICAgIC4uLm5ldyBTZXQoWycqKi5tZCcsICcqKi9kb2NzLyoqJywgLi4uKG5ld1NldHRpbmdzLm9uLnB1c2hbJ3BhdGhzLWlnbm9yZSddID8/IFtdKV0pLFxuICAgICAgXTtcbiAgICB9XG4gIH1cblxuICBpZiAoa2luZCA9PT0gJ3JlbGVhc2UnICYmIG5ld1NldHRpbmdzLmpvYnMucmVsZWFzZSAmJiBkZXBsb3lQcm9kdWN0aW9uV29ya2Zsb3dFeGlzdHMpIHtcbiAgICBuZXdTZXR0aW5ncy5wZXJtaXNzaW9ucyA/Pz0ge307XG4gICAgbmV3U2V0dGluZ3MucGVybWlzc2lvbnMuYWN0aW9ucyA9ICd3cml0ZSc7XG4gICAgbmV3U2V0dGluZ3Muam9icy5yZWxlYXNlLndpdGggPz89IHt9O1xuICAgIG5ld1NldHRpbmdzLmpvYnMucmVsZWFzZS53aXRoLnRyaWdnZXJfZGVwbG95X3dvcmtmbG93ID0gJ2RlcGxveS1wcm9kdWN0aW9uLnltbCc7XG4gIH1cblxuICBsZXQgaXNSZXVzYWJsZVdvcmtmbG93ID0gZmFsc2U7XG4gIGZvciAoY29uc3Qgam9iIG9mIE9iamVjdC52YWx1ZXMobmV3U2V0dGluZ3Muam9icykpIHtcbiAgICAvLyBJZ25vcmUgbm9uLXJldXNhYmxlIHdvcmtmbG93c1xuICAgIGlmICgham9iLnVzZXM/LmluY2x1ZGVzKCcvcmV1c2FibGUtd29ya2Zsb3dzLycpKSBjb250aW51ZTtcblxuICAgIG5vcm1hbGl6ZUpvYihjb25maWcsIGpvYiwga2luZCk7XG4gICAgaXNSZXVzYWJsZVdvcmtmbG93ID0gdHJ1ZTtcbiAgfVxuICBpZiAoIWlzUmV1c2FibGVXb3JrZmxvdykgcmV0dXJuO1xuXG4gIHN3aXRjaCAoa2luZCkge1xuICAgIGNhc2UgJ3JlbGVhc2UnOiB7XG4gICAgICBpZiAobmV3U2V0dGluZ3Mub24/LnNjaGVkdWxlKSB7XG4gICAgICAgIGRlbGV0ZSBuZXdTZXR0aW5ncy5vbi5wdXNoO1xuICAgICAgfSBlbHNlIGlmIChuZXdTZXR0aW5ncy5vbj8ucHVzaCAmJiBjb25maWcucmVsZWFzZS5icmFuY2hlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgIG5ld1NldHRpbmdzLm9uLnB1c2guYnJhbmNoZXMgPSBjb25maWcucmVsZWFzZS5icmFuY2hlcztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIERvbid0IHVzZSByZWxlYXNlLnltbCBpZiByZWxlYXNlIGJyYW5jaCBpcyBub3Qgc3BlY2lmaWVkXG4gICAgICAgIGF3YWl0IGZzLnByb21pc2VzLnJtKHBhdGguam9pbih3b3JrZmxvd3NQYXRoLCAncmVsZWFzZS55bWwnKSwgeyBmb3JjZTogdHJ1ZSB9KTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgaWYgKGNvbmZpZy5pc1B1YmxpY1JlcG8pIHtcbiAgICAgICAgbmV3U2V0dGluZ3MucGVybWlzc2lvbnMgPz89IHt9O1xuICAgICAgICBuZXdTZXR0aW5ncy5wZXJtaXNzaW9uc1snaWQtdG9rZW4nXSA9ICd3cml0ZSc7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBkZWxldGUgbmV3U2V0dGluZ3MucGVybWlzc2lvbnM/LlsnaWQtdG9rZW4nXTtcbiAgICAgIH1cbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgICBjYXNlICd0ZXN0Jzoge1xuICAgICAgLy8gRG9uJ3QgdXNlIGBwYXRocy1pZ25vcmVgIGZvciB0ZXN0IGJlY2F1c2UgR2l0SHViJ3MgQnJhbmNoIFByb3RlY3Rpb24gYW5kIFJ1bGVzZXRzIHJlcXVpcmUgam9iIHJ1bm5pbmcuXG4gICAgICBpZiAobmV3U2V0dGluZ3Mub24/LnB1bGxfcmVxdWVzdCkge1xuICAgICAgICBkZWxldGUgbmV3U2V0dGluZ3Mub24ucHVsbF9yZXF1ZXN0WydwYXRocy1pZ25vcmUnXTtcbiAgICAgIH1cbiAgICAgIGlmIChuZXdTZXR0aW5ncy5vbj8ucHVzaCkge1xuICAgICAgICBkZWxldGUgbmV3U2V0dGluZ3Mub24ucHVzaFsncGF0aHMtaWdub3JlJ107XG4gICAgICAgIG5ld1NldHRpbmdzLm9uLnB1c2guYnJhbmNoZXMgPSBuZXdTZXR0aW5ncy5vbi5wdXNoLmJyYW5jaGVzLmZpbHRlcigoYnJhbmNoKSA9PiBicmFuY2ggIT09ICdyZW5vdmF0ZS8qKicpO1xuICAgICAgfVxuICAgICAgYnJlYWs7XG4gICAgfVxuICAgIC8vIE5vIGRlZmF1bHRcbiAgfVxuICBhd2FpdCB3cml0ZVlhbWwobmV3U2V0dGluZ3MsIGZpbGVQYXRoKTtcblxuICBpZiAoa2luZCA9PT0gJ3N5bmMnKSB7XG4gICAgYXdhaXQgZnMucHJvbWlzZXMucm0ocGF0aC5qb2luKHdvcmtmbG93c1BhdGgsICdzeW5jLWluaXQueW1sJyksIHsgZm9yY2U6IHRydWUgfSk7XG4gICAgaWYgKCFuZXdTZXR0aW5ncy5qb2JzLnN5bmM/LndpdGgpIHJldHVybjtcblxuICAgIC8vIEdlbmVyYXRlIHN5bmMtZm9yY2UueW1sIGJhc2VkIG9uIHN5bmMueW1sIGlmIGl0IGV4aXN0cy5cbiAgICBuZXdTZXR0aW5ncy5qb2JzWydzeW5jLWZvcmNlJ10gPSBuZXdTZXR0aW5ncy5qb2JzLnN5bmM7XG4gICAgY29uc3QgcGFyYW1zID0gbmV3U2V0dGluZ3Muam9icy5zeW5jLndpdGguc3luY19wYXJhbXNfd2l0aG91dF9kZXN0O1xuICAgIGlmICh0eXBlb2YgcGFyYW1zICE9PSAnc3RyaW5nJykgcmV0dXJuO1xuXG4gICAgbmV3U2V0dGluZ3Muam9icy5zeW5jLndpdGguc3luY19wYXJhbXNfd2l0aG91dF9kZXN0ID0gYC0tZm9yY2UgJHtwYXJhbXN9YDtcbiAgICBuZXdTZXR0aW5ncy5uYW1lID0gJ0ZvcmNlIHRvIFN5bmMnO1xuICAgIG5ld1NldHRpbmdzLm9uID0geyB3b3JrZmxvd19kaXNwYXRjaDogbnVsbCB9O1xuICAgIGRlbGV0ZSBuZXdTZXR0aW5ncy5qb2JzLnN5bmM7XG4gICAgYXdhaXQgd3JpdGVZYW1sKG5ld1NldHRpbmdzLCBwYXRoLmpvaW4od29ya2Zsb3dzUGF0aCwgJ3N5bmMtZm9yY2UueW1sJykpO1xuICB9XG59XG5cbmZ1bmN0aW9uIG5vcm1hbGl6ZUpvYihjb25maWc6IFBhY2thZ2VDb25maWcsIGpvYjogSm9iLCBraW5kOiBLbm93bktpbmQpOiB2b2lkIHtcbiAgam9iLndpdGggPz89IHt9O1xuICBqb2Iuc2VjcmV0cyA/Pz0ge307XG4gIC8vIFVzZSB0cnVzdGVkIHB1Ymxpc2hpbmcgaW5zdGVhZCBvZiBOUE1fVE9LRU5cbiAgZGVsZXRlIGpvYi5zZWNyZXRzLk5QTV9UT0tFTjtcblxuICBpZiAoXG4gICAga2luZCA9PT0gJ3Rlc3QnIHx8XG4gICAga2luZCA9PT0gJ3JlbGVhc2UnIHx8XG4gICAga2luZCA9PT0gJ2dlbi1wci1jbGF1ZGUnIHx8XG4gICAga2luZCA9PT0gJ2dlbi1wci1jb2RleCcgfHxcbiAgICBraW5kID09PSAnZ2VuLXByLWdlbWluaSdcbiAgKSB7XG4gICAgam9iLnNlY3JldHMuR0hfVE9LRU4gPSAnJHt7IHNlY3JldHMuR0lUSFVCX1RPS0VOIH19JztcbiAgfVxuXG4gIC8vIFNldCB0ZXN0LWNvbW1hbmQgZm9yIGdlbi1wciB3b3JrZmxvd3MgYmFzZWQgb24gcGFja2FnZSBtYW5hZ2VyXG4gIGlmIChraW5kID09PSAnZ2VuLXByLWNsYXVkZScgfHwga2luZCA9PT0gJ2dlbi1wci1jb2RleCcgfHwga2luZCA9PT0gJ2dlbi1wci1nZW1pbmknKSB7XG4gICAgam9iLndpdGhbJ3Rlc3QtY29tbWFuZCddID0gY29uZmlnLmlzQnVuID8gJ2J1biBydW4gY2hlY2stYWxsLWZvci1haScgOiAneWFybiBjaGVjay1hbGwtZm9yLWFpJztcbiAgfVxuICBpZiAoam9iLnNlY3JldHMuRklSRUJBU0VfVE9LRU4pIHtcbiAgICBqb2Iuc2VjcmV0cy5HQ1BfU0FfS0VZX0pTT05fRk9SX0ZJUkVCQVNFID0gJyR7eyBzZWNyZXRzLkdDUF9TQV9LRVlfSlNPTl9GT1JfRklSRUJBU0UgfX0nO1xuICAgIGRlbGV0ZSBqb2Iuc2VjcmV0cy5GSVJFQkFTRV9UT0tFTjtcbiAgfVxuICBpZiAoXG4gICAgKGpvYi5zZWNyZXRzLkRJU0NPUkRfV0VCSE9PS19VUkwgJiYgKGtpbmQgPT09ICdyZWxlYXNlJyB8fCBraW5kLnN0YXJ0c1dpdGgoJ2RlcGxveScpKSkgfHxcbiAgICAoam9iLndpdGguc2VydmVyX3VybCAmJiBraW5kLnN0YXJ0c1dpdGgoJ2RlcGxveScpKVxuICApIHtcbiAgICBqb2Iuc2VjcmV0cy5ESVNDT1JEX1dFQkhPT0tfVVJMID0gJyR7eyBzZWNyZXRzLkRJU0NPUkRfV0VCSE9PS19VUkxfRk9SX1JFTEVBU0UgfX0nO1xuICB9XG5cbiAgaWYgKGtpbmQgPT09ICdzeW5jJykge1xuICAgIGNvbnN0IHBhcmFtcyA9IGpvYi53aXRoLnN5bmNfcGFyYW1zX3dpdGhvdXRfZGVzdDtcbiAgICBpZiAodHlwZW9mIHBhcmFtcyA9PT0gJ3N0cmluZycpIHtcbiAgICAgIGpvYi53aXRoLnN5bmNfcGFyYW1zX3dpdGhvdXRfZGVzdCA9IHBhcmFtcy5yZXBsYWNlKCdzeW5jICcsICcnKTtcbiAgICB9XG4gIH1cblxuICBpZiAoY29uZmlnLnJlcG9zaXRvcnk/LnN0YXJ0c1dpdGgoJ2dpdGh1YjpXaWxsQm9vc3Rlci8nKSkge1xuICAgIGpvYi51c2VzID0gam9iLnVzZXM/LnJlcGxhY2UoJ1dpbGxCb29zdGVyTGFiLycsICdXaWxsQm9vc3Rlci8nKTtcbiAgfSBlbHNlIGlmIChjb25maWcucmVwb3NpdG9yeT8uc3RhcnRzV2l0aCgnZ2l0aHViOldpbGxCb29zdGVyTGFiLycpKSB7XG4gICAgam9iLnVzZXMgPSBqb2IudXNlcz8ucmVwbGFjZSgnV2lsbEJvb3N0ZXIvJywgJ1dpbGxCb29zdGVyTGFiLycpO1xuICB9XG5cbiAgLy8gUmVtb3ZlIHJlZHVuZGFudCBwYXJhbWV0ZXJzXG4gIGlmIChqb2Iud2l0aC5kb3RfZW52X3BhdGggPT09ICcuZW52Jykge1xuICAgIGRlbGV0ZSBqb2Iud2l0aC5kb3RfZW52X3BhdGg7XG4gIH1cblxuICAvLyBEb24ndCB1c2UgYGZseSBkZXBsb3kgLS1qc29uYCBzaW5jZSBpdCBjYXVzZXMgYW4gZXJyb3JcbiAgaWYgKGtpbmQuc3RhcnRzV2l0aCgnZGVwbG95JykgJiYgam9iLnNlY3JldHMuRkxZX0FQSV9UT0tFTiAmJiB0eXBlb2Ygam9iLndpdGguZGVwbG95X2NvbW1hbmQgPT09ICdzdHJpbmcnKSB7XG4gICAgam9iLndpdGguZGVwbG95X2NvbW1hbmQgPSBqb2Iud2l0aC5kZXBsb3lfY29tbWFuZC5yZXBsYWNlKC9cXHMrLS1qc29uLywgJycpO1xuICB9XG4gIGlmIChjb25maWcuZG9lc0NvbnRhaW5Eb2NrZXJmaWxlICYmICFqb2Iud2l0aC5jaV9sYWJlbCAmJiBraW5kLnN0YXJ0c1dpdGgoJ3Rlc3QnKSkge1xuICAgIGpvYi53aXRoLmNpX2xhYmVsID0gJ2xhcmdlJztcbiAgfVxuICAvLyBCZWNhdXNlIGdpdGh1Yi5ldmVudC5yZXBvc2l0b3J5LnByaXZhdGUgaXMgYWx3YXlzIHRydWUgaWYgam9iIGlzIHNjaGVkdWxlZFxuICBpZiAoa2luZCA9PT0gJ3JlbGVhc2UnIHx8IGtpbmQgPT09ICd0ZXN0JyB8fCBraW5kLnN0YXJ0c1dpdGgoJ2RlcGxveScpKSB7XG4gICAgaWYgKGNvbmZpZy5pc1B1YmxpY1JlcG8pIHtcbiAgICAgIGpvYi53aXRoLmdpdGh1Yl9ob3N0ZWRfcnVubmVyID0gdHJ1ZTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgZGVsZXRlIGpvYi53aXRoLmdpdGh1Yl9ob3N0ZWRfcnVubmVyO1xuICB9XG5cbiAgaWYgKE9iamVjdC5rZXlzKGpvYi53aXRoKS5sZW5ndGggPiAwKSB7XG4gICAgc29ydEtleXMoam9iLndpdGgpO1xuICB9IGVsc2Uge1xuICAgIGRlbGV0ZSBqb2Iud2l0aDtcbiAgfVxuICBpZiAoT2JqZWN0LmtleXMoam9iLnNlY3JldHMpLmxlbmd0aCA+IDApIHtcbiAgICAvLyBNb3ZlIHNlY3JldHMgcHJvcCBhZnRlciB3aXRoIHByb3BcbiAgICBjb25zdCBuZXdTZWNyZXRzID0gc29ydEtleXMoam9iLnNlY3JldHMpO1xuICAgIGRlbGV0ZSBqb2Iuc2VjcmV0cztcbiAgICBqb2Iuc2VjcmV0cyA9IG5ld1NlY3JldHM7XG4gIH0gZWxzZSB7XG4gICAgZGVsZXRlIGpvYi5zZWNyZXRzO1xuICB9XG59XG5cbmZ1bmN0aW9uIGdlbmVyYXRlQXV0b2ZpeFdvcmtmbG93KGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFdvcmtmbG93IHtcbiAgaWYgKCFjb25maWcuaXNQdWJsaWNSZXBvKSB7XG4gICAgcmV0dXJuIHN0cnVjdHVyZWRDbG9uZShwcml2YXRlUmVwb0F1dG9maXhXb3JrZmxvdyk7XG4gIH1cblxuICBjb25zdCBwYWNrYWdlTWFuYWdlciA9IGNvbmZpZy5pc0J1biA/ICdidW4nIDogJ3lhcm4nO1xuICBjb25zdCBzdGVwczogU3RlcFtdID0gW1xuICAgIHsgdXNlczogJ2FjdGlvbnMvY2hlY2tvdXRAdjYnIH0sXG4gICAgeyB1c2VzOiAnYWN0aW9ucy9zZXR1cC1ub2RlQHY2Jywgd2l0aDogeyAnY2hlY2stbGF0ZXN0JzogdHJ1ZSwgJ25vZGUtdmVyc2lvbic6ICdsdHMvKicgfSB9LFxuICAgIC4uLihjb25maWcuaXNCdW4gPyBbeyB1c2VzOiAnb3Zlbi1zaC9zZXR1cC1idW5AdjEnLCB3aXRoOiB7ICdidW4tdmVyc2lvbic6ICdsYXRlc3QnIH0gfV0gOiBbXSksXG4gICAgeyBydW46IGAke3BhY2thZ2VNYW5hZ2VyfSBpbnN0YWxsYCB9LFxuICAgIHsgcnVuOiBgJHtwYWNrYWdlTWFuYWdlcn0gcnVuIGNsZWFudXBgIH0sXG4gIF07XG4gIGlmIChjb25maWcucGFja2FnZUpzb24/LnNjcmlwdHM/LmJ1aWxkKSB7XG4gICAgc3RlcHMucHVzaCh7IHJ1bjogYCR7cGFja2FnZU1hbmFnZXJ9IHJ1biBidWlsZGAgfSk7XG4gIH1cbiAgc3RlcHMucHVzaCh7IHVzZXM6ICdhdXRvZml4LWNpL2FjdGlvbkB2MScgfSk7XG5cbiAgY29uc3QgYXV0b2ZpeFdvcmtmbG93ID0gc3RydWN0dXJlZENsb25lKHB1YmxpY1JlcG9BdXRvZml4V29ya2Zsb3cpO1xuICBjb25zdCBhdXRvZml4Sm9iID0gYXV0b2ZpeFdvcmtmbG93LmpvYnMuYXV0b2ZpeCA/PyB7ICdydW5zLW9uJzogJ3VidW50dS1sYXRlc3QnIH07XG4gIGF1dG9maXhXb3JrZmxvdy5qb2JzLmF1dG9maXggPSB7IC4uLmF1dG9maXhKb2IsIHN0ZXBzIH07XG4gIHJldHVybiBhdXRvZml4V29ya2Zsb3c7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHdyaXRlWWFtbChuZXdTZXR0aW5nczogV29ya2Zsb3csIGZpbGVQYXRoOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgeWFtbFRleHQgPSByZW1vdmVUcmFpbGluZ1NwYWNlcyhcbiAgICB5YW1sLmR1bXAobmV3U2V0dGluZ3MsIHsgbGluZVdpZHRoOiAtMSwgbm9Db21wYXRNb2RlOiB0cnVlLCBzdHlsZXM6IHsgJyEhbnVsbCc6ICdlbXB0eScgfSB9KVxuICApO1xuICBhd2FpdCBmcy5wcm9taXNlcy53cml0ZUZpbGUoZmlsZVBhdGgsIHlhbWxUZXh0KTtcbn1cblxuZnVuY3Rpb24gcmVtb3ZlVHJhaWxpbmdTcGFjZXModGV4dDogc3RyaW5nKTogc3RyaW5nIHtcbiAgLy8ganMteWFtbCBlbWl0cyB2YWx1ZWxlc3MgR2l0SHViIEFjdGlvbnMgZXZlbnRzIGFzIGBldmVudDogYCB3aGVuIHVzaW5nIHRoZSBlbXB0eSBudWxsIHN0eWxlLlxuICByZXR1cm4gdGV4dC5yZXBsYWNlQWxsKC9bIFxcdF0rJC9nbSwgJycpO1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IGZnIGZyb20gJ2Zhc3QtZ2xvYic7XG5cbmltcG9ydCB7IGlzUmV1c2FibGVXb3JrZmxvd3NSZXBvIH0gZnJvbSAnLi4vZ2VuZXJhdG9ycy93b3JrZmxvdy5qcyc7XG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHsgb3B0aW9ucyB9IGZyb20gJy4uL29wdGlvbnMuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBmc1V0aWwgfSBmcm9tICcuLi91dGlscy9mc1V0aWwuanMnO1xuaW1wb3J0IHsgZ2xvYklnbm9yZSB9IGZyb20gJy4uL3V0aWxzL2dsb2JVdGlsLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZml4VHlwb3MocGFja2FnZUNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2ZpeFR5cG9zJywgYXN5bmMgKCkgPT4ge1xuICAgIGlmIChpc1JldXNhYmxlV29ya2Zsb3dzUmVwbyhwYWNrYWdlQ29uZmlnLnJlcG9zaXRvcnkpKSByZXR1cm47XG5cbiAgICBjb25zdCBkaXJQYXRoID0gcGFja2FnZUNvbmZpZy5kaXJQYXRoO1xuICAgIGNvbnN0IGRvY0ZpbGVzID0gYXdhaXQgZmcuZ2xvYignKiovKi5tZCcsIHsgZG90OiB0cnVlLCBjd2Q6IGRpclBhdGgsIGlnbm9yZTogZ2xvYklnbm9yZSB9KTtcbiAgICBpZiAob3B0aW9ucy5pc1ZlcmJvc2UpIHtcbiAgICAgIGNvbnNvbGUuaW5mbyhgRm91bmQgJHtkb2NGaWxlcy5sZW5ndGh9IG1hcmtkb3duIGZpbGVzIGluICR7ZGlyUGF0aH1gKTtcbiAgICB9XG4gICAgZm9yIChjb25zdCBtZEZpbGUgb2YgZG9jRmlsZXMpIHtcbiAgICAgIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5qb2luKGRpclBhdGgsIG1kRmlsZSk7XG4gICAgICB2b2lkIHByb21pc2VQb29sLnJ1bihhc3luYyAoKSA9PiB7XG4gICAgICAgIGNvbnN0IGNvbnRlbnQgPSBhd2FpdCBmcy5wcm9taXNlcy5yZWFkRmlsZShmaWxlUGF0aCwgJ3V0ZjgnKTtcbiAgICAgICAgbGV0IG5ld0NvbnRlbnQgPSBmaXhUeXBvc0luVGV4dChjb250ZW50KTtcbiAgICAgICAgbmV3Q29udGVudCA9IHJlcGxhY2VXaXRoQ29uZmlnKG5ld0NvbnRlbnQsIHBhY2thZ2VDb25maWcsICdkb2MnKTtcbiAgICAgICAgaWYgKGNvbnRlbnQgIT09IG5ld0NvbnRlbnQpIHtcbiAgICAgICAgICBhd2FpdCBmc1V0aWwuZ2VuZXJhdGVGaWxlKGZpbGVQYXRoLCBuZXdDb250ZW50KTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgY29uc3QgdHNGaWxlcyA9IGF3YWl0IGZnLmdsb2IoXG4gICAgICBbXG4gICAgICAgICd7YXBwLHNyYyx0ZXN0LHNjcmlwdHN9LyoqLyoue2NqcyxtanMsanMsanN4LGN0cyxtdHMsdHMsdHN4fScsXG4gICAgICAgICdwYWNrYWdlcy8qKi97YXBwLHNyYyx0ZXN0LHNjcmlwdHN9LyoqLyoue2NqcyxtanMsanMsanN4LGN0cyxtdHMsdHMsdHN4fScsXG4gICAgICBdLFxuICAgICAgeyBkb3Q6IHRydWUsIGN3ZDogZGlyUGF0aCwgaWdub3JlOiBnbG9iSWdub3JlIH1cbiAgICApO1xuICAgIGlmIChvcHRpb25zLmlzVmVyYm9zZSkge1xuICAgICAgY29uc29sZS5pbmZvKGBGb3VuZCAke3RzRmlsZXMubGVuZ3RofSBUeXBlU2NyaXB0IGZpbGVzIGluICR7ZGlyUGF0aH1gKTtcbiAgICB9XG4gICAgZm9yIChjb25zdCB0c0ZpbGUgb2YgdHNGaWxlcykge1xuICAgICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLmpvaW4oZGlyUGF0aCwgdHNGaWxlKTtcbiAgICAgIHZvaWQgcHJvbWlzZVBvb2wucnVuKGFzeW5jICgpID0+IHtcbiAgICAgICAgY29uc3Qgb2xkQ29udGVudCA9IGF3YWl0IGZzLnByb21pc2VzLnJlYWRGaWxlKGZpbGVQYXRoLCAndXRmOCcpO1xuICAgICAgICBsZXQgbmV3Q29udGVudCA9IGZpeFR5cG9zSW5Db2RlKG9sZENvbnRlbnQpO1xuICAgICAgICBuZXdDb250ZW50ID0gcmVwbGFjZVdpdGhDb25maWcobmV3Q29udGVudCwgcGFja2FnZUNvbmZpZywgJ3RzJyk7XG5cbiAgICAgICAgaWYgKG9sZENvbnRlbnQgIT09IG5ld0NvbnRlbnQpIHtcbiAgICAgICAgICBhd2FpdCBmc1V0aWwuZ2VuZXJhdGVGaWxlKGZpbGVQYXRoLCBuZXdDb250ZW50KTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgY29uc3QgdGV4dEJhc2VkRmlsZXMgPSBhd2FpdCBmZy5nbG9iKCcqKi8qLntjc3YsaHRtLGh0bWwsdHN2LHhtbCx5YW1sLHltbH0nLCB7XG4gICAgICBkb3Q6IHRydWUsXG4gICAgICBjd2Q6IGRpclBhdGgsXG4gICAgICBpZ25vcmU6IGdsb2JJZ25vcmUsXG4gICAgfSk7XG4gICAgaWYgKG9wdGlvbnMuaXNWZXJib3NlKSB7XG4gICAgICBjb25zb2xlLmluZm8oYEZvdW5kICR7dGV4dEJhc2VkRmlsZXMubGVuZ3RofSB0ZXh0LWJhc2VkIGZpbGVzIGluICR7ZGlyUGF0aH1gKTtcbiAgICB9XG4gICAgZm9yIChjb25zdCBmaWxlIG9mIHRleHRCYXNlZEZpbGVzKSB7XG4gICAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGguam9pbihkaXJQYXRoLCBmaWxlKTtcbiAgICAgIHZvaWQgcHJvbWlzZVBvb2wucnVuKGFzeW5jICgpID0+IHtcbiAgICAgICAgY29uc3Qgb2xkQ29udGVudCA9IGF3YWl0IGZzLnByb21pc2VzLnJlYWRGaWxlKGZpbGVQYXRoLCAndXRmOCcpO1xuICAgICAgICBsZXQgbmV3Q29udGVudCA9IGZpeFR5cG9zSW5UZXh0KG9sZENvbnRlbnQpO1xuICAgICAgICBuZXdDb250ZW50ID0gcmVwbGFjZVdpdGhDb25maWcobmV3Q29udGVudCwgcGFja2FnZUNvbmZpZywgJ3RleHQnKTtcblxuICAgICAgICBpZiAob2xkQ29udGVudCAhPT0gbmV3Q29udGVudCkge1xuICAgICAgICAgIGF3YWl0IGZzVXRpbC5nZW5lcmF0ZUZpbGUoZmlsZVBhdGgsIG5ld0NvbnRlbnQpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBhd2FpdCBwcm9taXNlUG9vbC5wcm9taXNlQWxsKCk7XG4gIH0pO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZml4VHlwb3NJblRleHQoY29udGVudDogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIGNvbnRlbnRcbiAgICAucmVwbGFjZUFsbCgvXFxiY1xcLmZcXC4oPz1cXHN8JCkvZywgJ2NmLicpXG4gICAgLnJlcGxhY2VBbGwoL1xcYmVnXFwuKD89XFxzfCQpL2csICdlLmcuJylcbiAgICAucmVwbGFjZUFsbCgvXFxiaWVcXC4oPz1cXHMpL2csICdpLmUuJyk7XG59XG5cbmZ1bmN0aW9uIGZpeFR5cG9zSW5Db2RlKGNvbnRlbnQ6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiBjb250ZW50XG4gICAgLnJlcGxhY2VBbGwoL1xcL1xcKltcXHNcXFNdKj9cXCpcXC8vZywgKGNvbW1lbnQpID0+IGZpeFR5cG9zSW5UZXh0KGNvbW1lbnQpKVxuICAgIC5yZXBsYWNlQWxsKC8oXnxcXHMpXFwvXFwvKC4qPyljXFwuZlxcLi9nLCAnJDEvLyQyY2YuJylcbiAgICAucmVwbGFjZUFsbCgvKF58XFxzKVxcL1xcLyguKj8pZWdcXC4vZywgJyQxLy8kMmUuZy4nKVxuICAgIC5yZXBsYWNlQWxsKC8oXnxcXHMpXFwvXFwvKC4qPylpZVxcLi9nLCAnJDEvLyQyaS5lLicpO1xufVxuXG5mdW5jdGlvbiByZXBsYWNlV2l0aENvbmZpZyhuZXdDb250ZW50OiBzdHJpbmcsIHBhY2thZ2VDb25maWc6IFBhY2thZ2VDb25maWcsIHByb3BOYW1lOiAnZG9jJyB8ICd0cycgfCAndGV4dCcpOiBzdHJpbmcge1xuICBmb3IgKGNvbnN0IFtiZWZvcmUsIGFmdGVyXSBvZiBPYmplY3QuZW50cmllcyhwYWNrYWdlQ29uZmlnLndiZnlKc29uPy50eXBvcz8uYWxsID8/IHt9KSkge1xuICAgIG5ld0NvbnRlbnQgPSBuZXdDb250ZW50LnJlcGxhY2VBbGwoYmVmb3JlLCBhZnRlcik7XG4gIH1cbiAgZm9yIChjb25zdCBbYmVmb3JlLCBhZnRlcl0gb2YgT2JqZWN0LmVudHJpZXMocGFja2FnZUNvbmZpZy53YmZ5SnNvbj8udHlwb3M/Lltwcm9wTmFtZV0gPz8ge30pKSB7XG4gICAgbmV3Q29udGVudCA9IG5ld0NvbnRlbnQucmVwbGFjZUFsbChiZWZvcmUsIGFmdGVyKTtcbiAgfVxuICByZXR1cm4gbmV3Q29udGVudDtcbn1cbiIsImltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGZzVXRpbCB9IGZyb20gJy4uL3V0aWxzL2ZzVXRpbC5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlQWdlbnRJbnN0cnVjdGlvbnMocm9vdENvbmZpZzogUGFja2FnZUNvbmZpZywgYWxsQ29uZmlnczogUGFja2FnZUNvbmZpZ1tdKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZ2VuZXJhdGVBZ2VudEluc3RydWN0aW9ucycsIGFzeW5jICgpID0+IHtcbiAgICBpZiAoIXJvb3RDb25maWcuaXNSb290KSByZXR1cm47XG5cbiAgICAvLyBDaGVjayBpZiBBR0VOVFNfRVhUUkEubWQgZXhpc3RzIGFuZCByZWFkIGl0cyBjb250ZW50XG4gICAgY29uc3QgYWdlbnRzRXh0cmFQYXRoID0gcGF0aC5yZXNvbHZlKHJvb3RDb25maWcuZGlyUGF0aCwgJ0FHRU5UU19FWFRSQS5tZCcpO1xuICAgIGNvbnN0IGV4dHJhQ29udGVudCA9IGF3YWl0IGZzVXRpbC5yZWFkRmlsZUlnbm9yaW5nRXJyb3IoYWdlbnRzRXh0cmFQYXRoKTtcblxuICAgIGZvciAoY29uc3QgW2ZpbGVOYW1lLCB0b29sTmFtZV0gb2YgW1xuICAgICAgWydBR0VOVFMubWQnLCAnQ29kZXggQ0xJJ10sXG4gICAgICBbJ0NMQVVERS5tZCcsICdDbGF1ZGUgQ29kZSddLFxuICAgICAgWydHRU1JTkkubWQnLCAnR2VtaW5pIENMSSddLFxuICAgIF0gYXMgY29uc3QpIHtcbiAgICAgIGNvbnN0IGNvbnRlbnQgPSBnZW5lcmF0ZUFnZW50SW5zdHJ1Y3Rpb24ocm9vdENvbmZpZywgYWxsQ29uZmlncywgdG9vbE5hbWUsIGV4dHJhQ29udGVudCk7XG4gICAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShyb290Q29uZmlnLmRpclBhdGgsIGZpbGVOYW1lKTtcbiAgICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiBmc1V0aWwuZ2VuZXJhdGVGaWxlKGZpbGVQYXRoLCBjb250ZW50KSk7XG4gICAgfVxuXG4gICAgY29uc3QgY3Vyc29yUnVsZXNQYXRoID0gcGF0aC5yZXNvbHZlKHJvb3RDb25maWcuZGlyUGF0aCwgJy5jdXJzb3IvcnVsZXMvZ2VuZXJhbC5tZGMnKTtcbiAgICBjb25zdCBjdXJzb3JSdWxlc0NvbnRlbnQgPSBnZW5lcmF0ZUN1cnNvckdlbmVyYWxNZGNDb250ZW50KHJvb3RDb25maWcsIGFsbENvbmZpZ3MsIGV4dHJhQ29udGVudCk7XG4gICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzVXRpbC5nZW5lcmF0ZUZpbGUoY3Vyc29yUnVsZXNQYXRoLCBjdXJzb3JSdWxlc0NvbnRlbnQpKTtcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIGdlbmVyYXRlQ3Vyc29yR2VuZXJhbE1kY0NvbnRlbnQoXG4gIGNvbmZpZzogUGFja2FnZUNvbmZpZyxcbiAgYWxsQ29uZmlnczogUGFja2FnZUNvbmZpZ1tdLFxuICBleHRyYUNvbnRlbnQ/OiBzdHJpbmdcbik6IHN0cmluZyB7XG4gIGNvbnN0IGZyb250bWF0dGVyID0gYC0tLVxcbmRlc2NyaXB0aW9uOiBHZW5lcmFsIENvZGluZyBSdWxlc1xcbmdsb2JzOlxcbmFsd2F5c0FwcGx5OiB0cnVlXFxuLS0tYDtcbiAgY29uc3QgYm9keSA9IGdlbmVyYXRlQWdlbnRJbnN0cnVjdGlvbihjb25maWcsIGFsbENvbmZpZ3MsICdDdXJzb3InLCBleHRyYUNvbnRlbnQpO1xuICByZXR1cm4gYCR7ZnJvbnRtYXR0ZXJ9XFxuXFxuJHtib2R5fWA7XG59XG5cbmZ1bmN0aW9uIGdlbmVyYXRlQWdlbnRJbnN0cnVjdGlvbihcbiAgcm9vdENvbmZpZzogUGFja2FnZUNvbmZpZyxcbiAgYWxsQ29uZmlnczogUGFja2FnZUNvbmZpZ1tdLFxuICB0b29sTmFtZTogc3RyaW5nLFxuICBleHRyYUNvbnRlbnQ/OiBzdHJpbmdcbik6IHN0cmluZyB7XG4gIGNvbnN0IHBhY2thZ2VNYW5hZ2VyID0gcm9vdENvbmZpZy5pc0J1biA/ICdidW4nIDogJ3lhcm4nO1xuICBjb25zdCBiYXNlQ29udGVudCA9IGBcbiMjIFByb2plY3QgSW5mb3JtYXRpb25cblxuLSBOYW1lOiBcXGAke3Jvb3RDb25maWcucGFja2FnZUpzb24/Lm5hbWUgfHwgJ3Vua25vd24nfVxcYFxuLSBEZXNjcmlwdGlvbjogJHtyb290Q29uZmlnLnBhY2thZ2VKc29uPy5kZXNjcmlwdGlvbn1cbi0gUGFja2FnZSBNYW5hZ2VyOiAke3BhY2thZ2VNYW5hZ2VyfVxuXG4jIyBHZW5lcmFsIEluc3RydWN0aW9uc1xuXG4tIENyZWF0ZSBhIG5ldyBicmFuY2ggaWYgdGhlIGN1cnJlbnQgYnJhbmNoIGlzIFxcYG1haW5cXGAuXG4tIFJ1biBhbnkgXFxgZ2l0XFxgIGNvbW1hbmRzIHNlcXVlbnRpYWxseS5cbi0gV3JpdGUgdGVzdHMgT05MWSBpZiBleHBsaWNpdGx5IHJlcXVlc3RlZC4gSWYgcmVxdWVzdGVkLCBmb2xsb3cgdGhlc2UgcnVsZXM6XG4gIC0gQ29udGludWUgbW9kaWZ5aW5nIHRoZSB0ZXN0cyBhbmQgY29kZSB1bnRpbCBhbGwgdGVzdHMgcGFzcy5cbiAgLSBFbnN1cmUgdGVzdHMgcmVzZXQgYW55IHJlbGF0ZWQgcGVyc2lzdGVudCBkYXRhLCBhcyBvdXIgdGVzdCBpbmZyYXN0cnVjdHVyZSBkb2VzIG5vdCBjbGVhciBpdCBhdXRvbWF0aWNhbGx5LlxuICAtIFByZWZlciBhY3R1YWwgQVBJIGNhbGxzIG92ZXIgbW9ja3MuIFVzZSBtb2NrcyB3aGVuIGFjdHVhbCBjYWxscyBhcmUgaW1wcmFjdGljYWwsIGhhdmUgdW5pbnRlbmRlZCBzaWRlIGVmZmVjdHMsIG9yIGFyZSBleHBsaWNpdGx5IHJlcXVlc3RlZC5cbi0gV2hlbiBmaXhpbmcgaXNzdWVzLCBmb2xsb3cgdGhlc2UgcnVsZXM6XG4gIC0gSW52ZXN0aWdhdGUgdGhlIHJvb3QgY2F1c2UgZmlyc3QgKGUuZy4sIGJ5IGdhdGhlcmluZyBkZWJ1ZyBsb2dzLCB0YWtpbmcgc2NyZWVuc2hvdHMsIGV0Yy4pLlxuICAtIEZpeCB0aGUgYWN0dWFsIHJvb3QgY2F1c2UgaW5zdGVhZCBvZiBhcHBseWluZyB3b3JrYXJvdW5kcy5cbi0gQWZ0ZXIgbWFraW5nIGNvZGUgY2hhbmdlcywgcnVuIFxcYCR7cGFja2FnZU1hbmFnZXJ9IGNoZWNrLWFsbC1mb3ItYWlcXGAgdG8gZXhlY3V0ZSBhbGwgdGVzdHMgKHRha2VzIHVwIHRvIDEgaG91ciksIG9yIFxcYCR7cGFja2FnZU1hbmFnZXJ9IGNoZWNrLWZvci1haVxcYCBmb3Igb25seSB0eXBlIGNoZWNraW5nIGFuZCBsaW50aW5nICh0YWtlcyB1cCB0byAxMCBtaW51dGVzKS5cbiAgLSBJZiB5b3UgYXJlIGNvbmZpZGVudCB0aGF0IHlvdXIgY2hhbmdlcyB3aWxsIG5vdCBicmVhayBhbnkgdGVzdHMsIHlvdSBtYXkgdXNlIFxcYGNoZWNrLWZvci1haVxcYC5cbiAgLSBVc2UgXFxgb3hsaW50XFxgIGlnbm9yZSBjb21tZW50cyB3aXRoIHJlYXNvbnMgKGUuZy4sIFxcYC8vIG94bGludC1kaXNhYmxlLW5leHQtbGluZSA8cnVsZT4gLS0gPHJlYXNvbj5cXGApIGlmIGxpbnQgZXJyb3JzIG9yIHdhcm5pbmdzIGNhbm5vdCBiZSBmaXhlZC5cbi0gT25jZSB5b3UgaGF2ZSB2ZXJpZmllZCB5b3VyIGNoYW5nZXMsIGNvbW1pdCBhbmQgcHVzaCB0aGVtIHRvIHRoZSBjdXJyZW50IChub24tbWFpbikgYnJhbmNoLCB0aGVuIGNyZWF0ZSBhIFBSIHZpYSBcXGBnaFxcYC5cbiAgLSBGb2xsb3cgdGhlIGNvbnZlbnRpb25hbCBjb21taXRzOyB5b3VyIGNvbW1pdCBtZXNzYWdlIHNob3VsZCBzdGFydCB3aXRoIFxcYGZlYXQ6XFxgLCBcXGBmaXg6XFxgLCBldGMuXG4gIC0gSWYgbm90IHNwZWNpZmllZCwgbWFrZSBzdXJlIHRvIGFkZCBhIG5ldyBsaW5lIGF0IHRoZSBlbmQgb2YgeW91ciBjb21taXQgbWVzc2FnZSR7cm9vdENvbmZpZy5pc1dpbGxCb29zdGVyUmVwbyA/IGAgd2l0aDogXFxgQ28tYXV0aG9yZWQtYnk6IFdpbGxCb29zdGVyICgke3Rvb2xOYW1lfSkgPGFnZW50QHdpbGxib29zdGVyLmNvbT5cXGBgIDogJyd9LlxuICAtIEFsd2F5cyBjcmVhdGUgbmV3IGNvbW1pdHMuIEF2b2lkIHVzaW5nIFxcYC0tYW1lbmRcXGAuXG4ke1xuICBhbGxDb25maWdzLnNvbWUoKGMpID0+IGMuaGFzU3RhcnRUZXN0U2VydmVyKVxuICAgID8gYC0gVXNlIFxcYCR7cGFja2FnZU1hbmFnZXJ9IHJ1biBzdGFydC10ZXN0LXNlcnZlclxcYCB0byBsYXVuY2ggYSB3ZWIgc2VydmVyIGZvciBkZWJ1Z2dpbmcgb3IgdGVzdGluZy5gXG4gICAgOiAnJ1xufVxuXG4ke2dlbmVyYXRlQWdlbnRDb2RpbmdTdHlsZShhbGxDb25maWdzKX1cbmBcbiAgICAucmVwbGFjZUFsbCgvXFwuXFxuXFxuKy0vZywgJy5cXG4tJylcbiAgICAucmVwbGFjZUFsbCgvXFxuezMsfS9nLCAnXFxuXFxuJylcbiAgICAudHJpbSgpO1xuXG4gIGNvbnN0IGhhc05ld1NlY3Rpb24gPSBleHRyYUNvbnRlbnQ/LnRyaW0oKS5zdGFydHNXaXRoKCcjJyk7XG4gIGNvbnN0IG5vcm1hbGl6ZWRFeHRyYUNvbnRlbnQgPSBleHRyYUNvbnRlbnRcbiAgICA/IGhhc05ld1NlY3Rpb25cbiAgICAgID8gJ1xcblxcbicgKyBleHRyYUNvbnRlbnQudHJpbSgpXG4gICAgICA6ICdcXG4nICsgZXh0cmFDb250ZW50XG4gICAgOiAnJztcbiAgcmV0dXJuIGJhc2VDb250ZW50ICsgbm9ybWFsaXplZEV4dHJhQ29udGVudDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdlbmVyYXRlQWdlbnRDb2RpbmdTdHlsZShhbGxDb25maWdzOiBQYWNrYWdlQ29uZmlnW10pOiBzdHJpbmcge1xuICAvLyBLZWVwIHRvcC1kb3duIG9yZGVyaW5nIGd1aWRhbmNlIGZ1bmN0aW9uLW9ubHkgYmVjYXVzZSBjbGFzc2VzIGFyZSBub3QgaG9pc3RlZCBhbmQgY2FuIGZhaWwgd2hlbiBpbmhlcml0YW5jZSBvciB0b3AtbGV2ZWwgaW5zdGFudGlhdGlvbiBkZXBlbmRzIG9uIGRlY2xhcmF0aW9uIG9yZGVyLlxuICByZXR1cm4gYFxuIyMgQ29kaW5nIFN0eWxlXG5cbi0gVXNlIGNhbWVsQ2FzZSBmb3IgSmF2YVNjcmlwdCBhbmQgVHlwZVNjcmlwdCBmaWxlcyAob3IgUGFzY2FsQ2FzZSBmb3IgUmVhY3QgY29tcG9uZW50cykuXG4tIFNpbXBsaWZ5IGNvZGUgYXMgbXVjaCBhcyBwb3NzaWJsZSB0byBlbGltaW5hdGUgcmVkdW5kYW5jeS5cbi0gRGVzaWduIGVhY2ggbW9kdWxlIHdpdGggaGlnaCBjb2hlc2lvbiwgZ3JvdXBpbmcgcmVsYXRlZCBmdW5jdGlvbmFsaXR5IHRvZ2V0aGVyLlxuICAtIFJlZmFjdG9yIGV4aXN0aW5nIGxhcmdlIG1vZHVsZXMgaW50byBzbWFsbGVyLCBmb2N1c2VkIG1vZHVsZXMgd2hlbiBuZWNlc3NhcnkuXG4gIC0gQ3JlYXRlIHdlbGwtb3JnYW5pemVkIGRpcmVjdG9yeSBzdHJ1Y3R1cmVzIHdpdGggbG93IGNvdXBsaW5nIGFuZCBoaWdoIGNvaGVzaW9uLlxuLSBQbGFjZSBjYWxsaW5nIGZ1bmN0aW9ucyBpbiB0aGUgZmlsZSBhYm92ZSB0aGUgZnVuY3Rpb25zIHRoZXkgY2FsbCB0byBtYWludGFpbiBhIGNsZWFyIHRvcC1kb3duIG9yZGVyLlxuICAtIGUuZy4gXFxgZnVuY3Rpb24gY2FsbGVyKCkgeyBjYWxsZWUoKTsgfSBmdW5jdGlvbiBjYWxsZWUoKSB7IC4uLiB9XFxgXG4tIFdyaXRlIGNvbW1lbnRzIHRoYXQgZXhwbGFpbiBcIndoeVwiIHJhdGhlciB0aGFuIFwid2hhdFwiLiBBdm9pZCBzdGF0aW5nIHdoYXQgY2FuIGJlIHVuZGVyc3Rvb2QgZnJvbSB0aGUgY29kZSBpdHNlbGYuXG4tIFByZWZlciBcXGB1bmRlZmluZWRcXGAgb3ZlciBcXGBudWxsXFxgIHVubGVzcyBleHBsaWNpdGx5IHJlcXVpcmVkIGJ5IEFQSXMgb3IgbGlicmFyaWVzLlxuLSBQcmVmZXIgdXNpbmcgYSBzaW5nbGUgdGVtcGxhdGUgbGl0ZXJhbCBmb3IgcHJvbXB0cyBpbnN0ZWFkIG9mIFxcYGpvaW4oKVxcYCB3aXRoIGFuIGFycmF5IG9mIHN0cmluZ3MuXG4ke1xuICBhbGxDb25maWdzLnNvbWUoKGMpID0+IGMuZGVwZW5kaW5nLmdlbkkxOG5UcylcbiAgICA/IGAtIFdoZW4gaW50cm9kdWNpbmcgbmV3IHN0cmluZyBsaXRlcmFscyBpbiBSZWFjdCBjb21wb25lbnRzLCB1cGRhdGUgdGhlIGxhbmd1YWdlIHJlc291cmNlIGZpbGVzIGluIHRoZSBcXGBpMThuXFxgIGRpcmVjdG9yeSAoZS5nLiwgXFxgaTE4bi9qYS1KUC5qc29uXFxgKS4gUmVmZXJlbmNlIHRoZXNlIHN0cmluZ3MgdXNpbmcgdGhlIFxcYGkxOG5cXGAgdXRpbGl0eS4gRm9yIGV4YW1wbGUsIHVzZSBcXGBpMThuLnBhZ2VzLmhvbWUudGl0bGUoKVxcYCBmb3IgXFxgeyBcInBhZ2VzXCI6IHsgXCJob21lXCI6IHsgXCJ0aXRsZVwiOiBcIk15IEFwcFwiIH0gfSB9XFxgLmBcbiAgICA6ICcnXG59XG4ke1xuICBhbGxDb25maWdzLnNvbWUoKGMpID0+IGMuZGVwZW5kaW5nLnJlYWN0IHx8IGMuZGVwZW5kaW5nLm5leHQpXG4gICAgPyBgLSBQcmVmZXIgXFxgdXNlSW1tZXJcXGAgZm9yIHN0b3JpbmcgYW4gYXJyYXkgb3IgYW4gb2JqZWN0IHRvIFxcYHVzZVN0YXRlXFxgLmBcbiAgICA6ICcnXG59XG4ke1xuICBhbGxDb25maWdzLnNvbWUoKGMpID0+IGMuZGVwZW5kaW5nLm5leHQpXG4gICAgPyBgXG4tIFNpbmNlIHRoaXMgcHJvamVjdCB1c2VzIHRoZSBSZWFjdCBDb21waWxlciwgeW91IGRvIG5vdCBuZWVkIHRvIHVzZSBcXGB1c2VDYWxsYmFja1xcYCBvciBcXGB1c2VNZW1vXFxgIGZvciBwZXJmb3JtYW5jZSBvcHRpbWl6YXRpb24uXG4tIEFzc3VtZSB0aGVyZSBpcyBvbmx5IGEgc2luZ2xlIHNlcnZlciBpbnN0YW5jZS5cbmBcbiAgICA6ICcnXG59XG5gXG4gICAgLnJlcGxhY2VBbGwoL1xcLlxcblxcbistL2csICcuXFxuLScpXG4gICAgLnJlcGxhY2VBbGwoL1xcbnszLH0vZywgJ1xcblxcbicpXG4gICAgLnRyaW0oKTtcbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB7IHBhcnNlIH0gZnJvbSAnc21vbC10b21sJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZnNVdGlsIH0gZnJvbSAnLi4vdXRpbHMvZnNVdGlsLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuXG5pbnRlcmZhY2UgQnVuZmlnVG9tbCB7XG4gIGluc3RhbGw/OiB7XG4gICAgZXhhY3Q/OiBib29sZWFuO1xuICB9O1xuICBydW4/OiB7XG4gICAgYnVuPzogYm9vbGVhbjtcbiAgfTtcbn1cblxuY29uc3QgbWluaW11bVJlbGVhc2VBZ2VFeGNsdWRlcyA9IFtcbiAgLy8gLS0tLS0tLS0tLSBTVEFSVDogV2UgYmVsaWV2ZSBvdXIgcGFja2FnZXMgYXJlIHNhZmUgLS0tLS0tLS0tLVxuICAnQGV4ZXJjb2RlL3Byb2JsZW0tdXRpbHMnLFxuICAnQHdpbGxib29zdGVyL2FnZW50LXNraWxscycsXG4gICdAd2lsbGJvb3N0ZXIvYmFiZWwtY29uZmlncycsXG4gICdAd2lsbGJvb3N0ZXIvbW9uYWNvLWxvYWRlcicsXG4gICdAd2lsbGJvb3N0ZXIvbW9uYWNvLXJlYWN0JyxcbiAgJ0B3aWxsYm9vc3Rlci9veGZtdC1jb25maWcnLFxuICAnQHdpbGxib29zdGVyL294bGludC1jb25maWcnLFxuICAnQHdpbGxib29zdGVyL3ByZXR0aWVyLWNvbmZpZycsXG4gICdAd2lsbGJvb3N0ZXIvcmVub3ZhdGUtY29uZmlnJyxcbiAgJ0B3aWxsYm9vc3Rlci9zaGFyZWQtbGliJyxcbiAgJ0B3aWxsYm9vc3Rlci9zaGFyZWQtbGliLWJsaXR6LW5leHQnLFxuICAnQHdpbGxib29zdGVyL3NoYXJlZC1saWItbmV4dCcsXG4gICdAd2lsbGJvb3N0ZXIvc2hhcmVkLWxpYi1ub2RlJyxcbiAgJ0B3aWxsYm9vc3Rlci9zaGFyZWQtbGliLXJlYWN0JyxcbiAgJ0B3aWxsYm9vc3Rlci93YicsXG4gICdhZ2VudC1ydW50aW1lLWtpdCcsXG4gICdhdC1kZWNvcmF0b3JzJyxcbiAgJ2J1aWxkLXRzJyxcbiAgJ2dlbi1pMThuLXRzJyxcbiAgJ29uZS13YXktZ2l0LXN5bmMnLFxuICAvLyAtLS0tLS0tLS0tIEVORDogV2UgYmVsaWV2ZSBvdXIgcGFja2FnZXMgYXJlIHNhZmUgLS0tLS0tLS0tLVxuXG4gIC8vIHdiZnkgcGlucyB0aGVzZSB0b29saW5nIHBhY2thZ2VzIGFuZCBtYXkgYXBwbHkgdGhlbSBpbW1lZGlhdGVseSBhZnRlciBhXG4gIC8vIHJlbGVhc2UsIGJlZm9yZSB0aGUgZ2xvYmFsIG1pbmltdW0tcmVsZWFzZS1hZ2Ugd2luZG93IGhhcyBlbGFwc2VkLlxuICAnQHR5cGVzY3JpcHQvbmF0aXZlLXByZXZpZXcnLFxuICAnQHR5cGVzY3JpcHQvbmF0aXZlLXByZXZpZXctZGFyd2luLWFybTY0JyxcbiAgJ0B0eXBlc2NyaXB0L25hdGl2ZS1wcmV2aWV3LWRhcndpbi14NjQnLFxuICAnQHR5cGVzY3JpcHQvbmF0aXZlLXByZXZpZXctbGludXgtYXJtJyxcbiAgJ0B0eXBlc2NyaXB0L25hdGl2ZS1wcmV2aWV3LWxpbnV4LWFybTY0JyxcbiAgJ0B0eXBlc2NyaXB0L25hdGl2ZS1wcmV2aWV3LWxpbnV4LXg2NCcsXG4gICdAdHlwZXNjcmlwdC9uYXRpdmUtcHJldmlldy13aW4zMi1hcm02NCcsXG4gICdAdHlwZXNjcmlwdC9uYXRpdmUtcHJldmlldy13aW4zMi14NjQnLFxuICAnb3hmbXQnLFxuICAnQG94Zm10L2JpbmRpbmctYW5kcm9pZC1hcm0tZWFiaScsXG4gICdAb3hmbXQvYmluZGluZy1hbmRyb2lkLWFybTY0JyxcbiAgJ0BveGZtdC9iaW5kaW5nLWRhcndpbi1hcm02NCcsXG4gICdAb3hmbXQvYmluZGluZy1kYXJ3aW4teDY0JyxcbiAgJ0BveGZtdC9iaW5kaW5nLWZyZWVic2QteDY0JyxcbiAgJ0BveGZtdC9iaW5kaW5nLWxpbnV4LWFybS1nbnVlYWJpaGYnLFxuICAnQG94Zm10L2JpbmRpbmctbGludXgtYXJtLW11c2xlYWJpaGYnLFxuICAnQG94Zm10L2JpbmRpbmctbGludXgtYXJtNjQtZ251JyxcbiAgJ0BveGZtdC9iaW5kaW5nLWxpbnV4LWFybTY0LW11c2wnLFxuICAnQG94Zm10L2JpbmRpbmctbGludXgtcHBjNjQtZ251JyxcbiAgJ0BveGZtdC9iaW5kaW5nLWxpbnV4LXJpc2N2NjQtZ251JyxcbiAgJ0BveGZtdC9iaW5kaW5nLWxpbnV4LXJpc2N2NjQtbXVzbCcsXG4gICdAb3hmbXQvYmluZGluZy1saW51eC1zMzkweC1nbnUnLFxuICAnQG94Zm10L2JpbmRpbmctbGludXgteDY0LWdudScsXG4gICdAb3hmbXQvYmluZGluZy1saW51eC14NjQtbXVzbCcsXG4gICdAb3hmbXQvYmluZGluZy1vcGVuaGFybW9ueS1hcm02NCcsXG4gICdAb3hmbXQvYmluZGluZy13aW4zMi1hcm02NC1tc3ZjJyxcbiAgJ0BveGZtdC9iaW5kaW5nLXdpbjMyLWlhMzItbXN2YycsXG4gICdAb3hmbXQvYmluZGluZy13aW4zMi14NjQtbXN2YycsXG4gICdveGxpbnQnLFxuICAnQG94bGludC9iaW5kaW5nLWFuZHJvaWQtYXJtLWVhYmknLFxuICAnQG94bGludC9iaW5kaW5nLWFuZHJvaWQtYXJtNjQnLFxuICAnQG94bGludC9iaW5kaW5nLWRhcndpbi1hcm02NCcsXG4gICdAb3hsaW50L2JpbmRpbmctZGFyd2luLXg2NCcsXG4gICdAb3hsaW50L2JpbmRpbmctZnJlZWJzZC14NjQnLFxuICAnQG94bGludC9iaW5kaW5nLWxpbnV4LWFybS1nbnVlYWJpaGYnLFxuICAnQG94bGludC9iaW5kaW5nLWxpbnV4LWFybS1tdXNsZWFiaWhmJyxcbiAgJ0BveGxpbnQvYmluZGluZy1saW51eC1hcm02NC1nbnUnLFxuICAnQG94bGludC9iaW5kaW5nLWxpbnV4LWFybTY0LW11c2wnLFxuICAnQG94bGludC9iaW5kaW5nLWxpbnV4LXBwYzY0LWdudScsXG4gICdAb3hsaW50L2JpbmRpbmctbGludXgtcmlzY3Y2NC1nbnUnLFxuICAnQG94bGludC9iaW5kaW5nLWxpbnV4LXJpc2N2NjQtbXVzbCcsXG4gICdAb3hsaW50L2JpbmRpbmctbGludXgtczM5MHgtZ251JyxcbiAgJ0BveGxpbnQvYmluZGluZy1saW51eC14NjQtZ251JyxcbiAgJ0BveGxpbnQvYmluZGluZy1saW51eC14NjQtbXVzbCcsXG4gICdAb3hsaW50L2JpbmRpbmctb3Blbmhhcm1vbnktYXJtNjQnLFxuICAnQG94bGludC9iaW5kaW5nLXdpbjMyLWFybTY0LW1zdmMnLFxuICAnQG94bGludC9iaW5kaW5nLXdpbjMyLWlhMzItbXN2YycsXG4gICdAb3hsaW50L2JpbmRpbmctd2luMzIteDY0LW1zdmMnLFxuICAnb3hsaW50LXRzZ29saW50JyxcbiAgJ0BveGxpbnQtdHNnb2xpbnQvZGFyd2luLWFybTY0JyxcbiAgJ0BveGxpbnQtdHNnb2xpbnQvZGFyd2luLXg2NCcsXG4gICdAb3hsaW50LXRzZ29saW50L2xpbnV4LWFybTY0JyxcbiAgJ0BveGxpbnQtdHNnb2xpbnQvbGludXgteDY0JyxcbiAgJ0BveGxpbnQtdHNnb2xpbnQvd2luMzItYXJtNjQnLFxuICAnQG94bGludC10c2dvbGludC93aW4zMi14NjQnLFxuICAnQG5leHQvZW52JyxcbiAgJ0BuZXh0L2ZvbnQnLFxuICAnQG5leHQvcnNwYWNrLWJpbmRpbmctbGludXgtYXJtNjQtZ251JyxcbiAgJ0BuZXh0L3JzcGFjay1iaW5kaW5nLWxpbnV4LWFybTY0LW11c2wnLFxuICAnQG5leHQvcnNwYWNrLWJpbmRpbmctbGludXgteDY0LWdudScsXG4gICdAbmV4dC9yc3BhY2stYmluZGluZy1saW51eC14NjQtbXVzbCcsXG4gICdAbmV4dC9zd2MtYW5kcm9pZC1hcm0tZWFiaScsXG4gICdAbmV4dC9zd2MtYW5kcm9pZC1hcm02NCcsXG4gICdAbmV4dC9zd2MtZGFyd2luLWFybTY0JyxcbiAgJ0BuZXh0L3N3Yy1kYXJ3aW4teDY0JyxcbiAgJ0BuZXh0L3N3Yy1mcmVlYnNkLXg2NCcsXG4gICdAbmV4dC9zd2MtbGludXgtYXJtLWdudWVhYmloZicsXG4gICdAbmV4dC9zd2MtbGludXgtYXJtNjQtZ251JyxcbiAgJ0BuZXh0L3N3Yy1saW51eC1hcm02NC1tdXNsJyxcbiAgJ0BuZXh0L3N3Yy1saW51eC14NjQtZ251JyxcbiAgJ0BuZXh0L3N3Yy1saW51eC14NjQtbXVzbCcsXG4gICdAbmV4dC9zd2Mtd2FzbS1ub2RlanMnLFxuICAnQG5leHQvc3djLXdhc20td2ViJyxcbiAgJ0BuZXh0L3RoaXJkLXBhcnRpZXMnLFxuICAnbmV4dCcsXG4gICdyZWFjdCcsXG4gICdyZWFjdC1kb20nLFxuXTtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlQnVuZmlnVG9tbChjb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdnZW5lcmF0ZUJ1bmZpZ1RvbWwnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICdidW5maWcudG9tbCcpO1xuICAgIGNvbnN0IGV4aXN0aW5nQ29udGVudCA9IGZzLmV4aXN0c1N5bmMoZmlsZVBhdGgpID8gZnMucmVhZEZpbGVTeW5jKGZpbGVQYXRoLCAndXRmOCcpIDogdW5kZWZpbmVkO1xuICAgIGNvbnN0IGNvbnRlbnQgPSBuZXdDb250ZW50KGV4aXN0aW5nQ29udGVudCk7XG4gICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzVXRpbC5nZW5lcmF0ZUZpbGUoZmlsZVBhdGgsIGNvbnRlbnQpKTtcbiAgfSk7XG59XG5cbmNvbnN0IG5ld0NvbnRlbnQgPSAoZXhpc3RpbmdDb250ZW50OiBzdHJpbmcgfCB1bmRlZmluZWQpOiBzdHJpbmcgPT4ge1xuICBjb25zdCBidW5maWdUb21sID0gcGFyc2VCdW5maWdUb21sKGV4aXN0aW5nQ29udGVudCk7XG4gIHJldHVybiBgZW52ID0gZmFsc2VcbnRlbGVtZXRyeSA9IGZhbHNlXG5cbiR7Z2VuZXJhdGVSdW5TZWN0aW9uKGJ1bmZpZ1RvbWwpfVxuW2luc3RhbGxdXG5leGFjdCA9ICR7YnVuZmlnVG9tbD8uaW5zdGFsbD8uZXhhY3QgPT09IGZhbHNlID8gJ2ZhbHNlJyA6ICd0cnVlJ31cbmxpbmtlciA9IFwiaG9pc3RlZFwiXG5taW5pbXVtUmVsZWFzZUFnZSA9IDQzMjAwMCAjIDUgZGF5c1xubWluaW11bVJlbGVhc2VBZ2VFeGNsdWRlcyA9IFtcbiR7bWluaW11bVJlbGVhc2VBZ2VFeGNsdWRlcy5tYXAoKHBhY2thZ2VOYW1lKSA9PiBgICAgIFwiJHtwYWNrYWdlTmFtZX1cIixgKS5qb2luKCdcXG4nKX1cbl1cbmA7XG59O1xuXG5mdW5jdGlvbiBwYXJzZUJ1bmZpZ1RvbWwoY29udGVudDogc3RyaW5nIHwgdW5kZWZpbmVkKTogQnVuZmlnVG9tbCB8IHVuZGVmaW5lZCB7XG4gIGlmICghY29udGVudCkge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cbiAgdHJ5IHtcbiAgICByZXR1cm4gcGFyc2UoY29udGVudCkgYXMgQnVuZmlnVG9tbDtcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxufVxuXG5mdW5jdGlvbiBnZW5lcmF0ZVJ1blNlY3Rpb24oYnVuZmlnVG9tbDogQnVuZmlnVG9tbCB8IHVuZGVmaW5lZCk6IHN0cmluZyB7XG4gIHJldHVybiB0eXBlb2YgYnVuZmlnVG9tbD8ucnVuPy5idW4gPT09ICdib29sZWFuJyA/IGBbcnVuXVxcbmJ1biA9ICR7YnVuZmlnVG9tbC5ydW4uYnVufVxcbmAgOiAnJztcbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcblxuY29uc3QgdXNlckNvbnRlbnRIZWFkZXIgPSAnIyBQcm9qZWN0LXNwZWNpZmljIHNldHRpbmdzJztcbmNvbnN0IHVzZXJDb250ZW50SGVhZGVyUmVnZXggPSAvIyBQcm9qZWN0LXNwZWNpZmljIHNldHRpbmdzW15cXG5dKlxcbi9nbTtcbmNvbnN0IHNlcGFyYXRvciA9ICcjIEdlbmVyYXRlZCBieSB3YmZ5JztcbmNvbnN0IHNlcGFyYXRvclByZWZpeCA9ICcjIEdlbmVyYXRlZCBieSAnO1xuY29uc3QgZGVmYXVsdEhlYWRVc2VyQ29udGVudCA9IGAke3VzZXJDb250ZW50SGVhZGVyfSAoaGVhZClcblxuXG4ke3NlcGFyYXRvcn1cbmA7XG5jb25zdCBkZWZhdWx0VGFpbFVzZXJDb250ZW50ID0gYFxuJHt1c2VyQ29udGVudEhlYWRlcn0gKHRhaWwpXG5gO1xuXG5leHBvcnQgY29uc3QgaWdub3JlRmlsZVV0aWwgPSB7XG4gIHNlcGFyYXRvcixcbiAgc2VwYXJhdG9yUHJlZml4LFxuICBkZWZhdWx0SGVhZFVzZXJDb250ZW50LFxuICBkZWZhdWx0VGFpbFVzZXJDb250ZW50LFxuICBhc3luYyByZWFkR2l0aWdub3JlV2l0aG91dFNlcGFyYXRvcnMoZmlsZVBhdGg6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nIHwgdW5kZWZpbmVkPiB7XG4gICAgdHJ5IHtcbiAgICAgIGxldCBjb250ZW50ID0gYXdhaXQgZnMucHJvbWlzZXMucmVhZEZpbGUoZmlsZVBhdGgsICd1dGY4Jyk7XG4gICAgICBjb25zdCBsYXN0SGVhZGVySW5kZXggPSBnZXRJbmRleE9mVGFpbFVzZXJDb250ZW50SGVhZGVyKGNvbnRlbnQpO1xuICAgICAgaWYgKGxhc3RIZWFkZXJJbmRleCA+IDApIHtcbiAgICAgICAgY29udGVudCA9IGNvbnRlbnQuc2xpY2UoMCwgbGFzdEhlYWRlckluZGV4IC0gMSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gKFxuICAgICAgICBjb250ZW50XG4gICAgICAgICAgLnJlcGxhY2VBbGwodXNlckNvbnRlbnRIZWFkZXJSZWdleCwgJycpXG4gICAgICAgICAgLnJlcGxhY2VBbGwoLyMgR2VuZXJhdGVkIGJ5IFteXFxuXSpcXG4vZ20sICcnKVxuICAgICAgICAgIC5yZXBsYWNlQWxsKC9cXHI/XFxuXFxyP1xcbihcXHI/XFxuKSsvZ20sICdcXG5cXG4nKVxuICAgICAgICAgIC50cmltKCkgKyAnXFxuJ1xuICAgICAgKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIGRvIG5vdGhpbmdcbiAgICB9XG4gIH0sXG4gIGdldEhlYWRVc2VyQ29udGVudChjb250ZW50OiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGNvbnN0IGluZGV4ID0gY29udGVudC5pbmRleE9mKHRoaXMuc2VwYXJhdG9yUHJlZml4KTtcbiAgICBpZiAoaW5kZXggIT09IC0xKSB7XG4gICAgICByZXR1cm4gY29udGVudFxuICAgICAgICAuc2xpY2UoMCwgY29udGVudC5pbmRleE9mKCdcXG4nLCBpbmRleCkgKyAxKVxuICAgICAgICAucmVwbGFjZUFsbCh1c2VyQ29udGVudEhlYWRlclJlZ2V4LCBgJHt1c2VyQ29udGVudEhlYWRlcn0gKGhlYWQpXFxuYCk7XG4gICAgfVxuICAgIHJldHVybiBkZWZhdWx0SGVhZFVzZXJDb250ZW50O1xuICB9LFxuICBnZXRUYWlsVXNlckNvbnRlbnQoY29udGVudDogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBjb25zdCBsYXN0SGVhZGVySW5kZXggPSBnZXRJbmRleE9mVGFpbFVzZXJDb250ZW50SGVhZGVyKGNvbnRlbnQpO1xuICAgIGlmIChsYXN0SGVhZGVySW5kZXggPiAwKSB7XG4gICAgICByZXR1cm4gY29udGVudC5zbGljZShsYXN0SGVhZGVySW5kZXggLSAxKTtcbiAgICB9XG4gICAgcmV0dXJuIGRlZmF1bHRUYWlsVXNlckNvbnRlbnQ7XG4gIH0sXG4gIGFzeW5jIGlzQmVycnlaZXJvSW5zdGFsbEVuYWJsZWQoZmlsZVBhdGg6IHN0cmluZyk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBjb250ZW50ID0gYXdhaXQgZnMucHJvbWlzZXMucmVhZEZpbGUoZmlsZVBhdGgsICd1dGY4Jyk7XG4gICAgICByZXR1cm4gY29udGVudC5pbmNsdWRlcygnXFxuIS55YXJuL2NhY2hlJyk7XG4gICAgfSBjYXRjaCB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9LFxufTtcblxuZnVuY3Rpb24gZ2V0SW5kZXhPZlRhaWxVc2VyQ29udGVudEhlYWRlcihjb250ZW50OiBzdHJpbmcpOiBudW1iZXIge1xuICBjb25zdCBpbmRleCA9IGNvbnRlbnQuaW5kZXhPZih1c2VyQ29udGVudEhlYWRlcik7XG4gIGNvbnN0IGxhc3RJbmRleCA9IGNvbnRlbnQubGFzdEluZGV4T2YodXNlckNvbnRlbnRIZWFkZXIpO1xuICByZXR1cm4gbGFzdEluZGV4ID4gaW5kZXggPyBsYXN0SW5kZXggOiAtMTtcbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGZzVXRpbCB9IGZyb20gJy4uL3V0aWxzL2ZzVXRpbC5qcyc7XG5pbXBvcnQgeyBpZ25vcmVGaWxlVXRpbCB9IGZyb20gJy4uL3V0aWxzL2lnbm9yZUZpbGVVdGlsLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuXG4vLyBFeGVyY29kZeOBp+OBr25vZGVfbW9kdWxlc+OCkkNPUFnjgZnjgovlv4XopoHjgYzjgYLjgovjgZ/jgoHjgIFub2RlX21vZHVsZXPjgpLpmaTlpJbjgZfjgabjga/jgYTjgZHjgarjgYTjgIJcbmNvbnN0IGNvbW1vbkNvbnRlbnQgPSBgXG4qKi8uaWRlYVxuKiovKi5zcWxpdGUzKlxuKiovLnlhcm4vaW5zdGFsbC1zdGF0ZS5nelxuKiovLnZlbnZcbmA7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZW5lcmF0ZURvY2tlcmlnbm9yZShjb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdnZW5lcmF0ZURvY2tlcmlnbm9yZScsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJy5kb2NrZXJpZ25vcmUnKTtcbiAgICBpZiAoY29uZmlnLmRvZXNDb250YWluRG9ja2VyZmlsZSkge1xuICAgICAgY29uc3QgY29udGVudCA9IChhd2FpdCBmc1V0aWwucmVhZEZpbGVJZ25vcmluZ0Vycm9yKGZpbGVQYXRoKSkgPz8gJyc7XG4gICAgICBjb25zdCBoZWFkVXNlckNvbnRlbnQgPSBpZ25vcmVGaWxlVXRpbC5nZXRIZWFkVXNlckNvbnRlbnQoY29udGVudCk7XG4gICAgICBjb25zdCB0YWlsVXNlckNvbnRlbnQgPSBpZ25vcmVGaWxlVXRpbC5nZXRUYWlsVXNlckNvbnRlbnQoY29udGVudCk7XG5cbiAgICAgIGNvbnN0IG5ld0NvbnRlbnQgPSBoZWFkVXNlckNvbnRlbnQgKyBjb21tb25Db250ZW50ICsgdGFpbFVzZXJDb250ZW50O1xuICAgICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzVXRpbC5nZW5lcmF0ZUZpbGUoZmlsZVBhdGgsIG5ld0NvbnRlbnQpKTtcbiAgICB9IGVsc2Uge1xuICAgICAgYXdhaXQgZnMucHJvbWlzZXMucm0oZmlsZVBhdGgsIHsgZm9yY2U6IHRydWUgfSk7XG4gICAgfVxuICB9KTtcbn1cbiIsImV4cG9ydCBjb25zdCBleHRlbnNpb25zID0ge1xuICBjb2RlV2l0aDJJbmRlbnRTaXplOiBbXG4gICAgJ2NqcycsXG4gICAgJ21qcycsXG4gICAgJ2pzJyxcbiAgICAnanN4JyxcbiAgICAnY3RzJyxcbiAgICAnbXRzJyxcbiAgICAndHMnLFxuICAgICd0c3gnLFxuICAgICdqc29uJyxcbiAgICAnanNvbjUnLFxuICAgICdqc29uYycsXG4gICAgJ2NwcCcsXG4gICAgJ2RhcnQnLFxuICAgICdodG0nLFxuICAgICdodG1sJyxcbiAgICAncHUnLFxuICAgICdwdW1sJyxcbiAgICAncmInLFxuICAgICd2dWUnLFxuICAgICd4bWwnLFxuICAgICd5YW1sJyxcbiAgICAneW1sJyxcbiAgICAnc2gnLFxuICBdLnRvU29ydGVkKCksXG4gIGNvZGVXaXRoNEluZGVudFNpemU6IFsnZ28nLCAnZ3JhZGxlJywgJ2phdmEnLCAncHknXS50b1NvcnRlZCgpLFxuICBtYXJrZG93bkxpa2U6IFsnbWQnXS50b1NvcnRlZCgpLFxuICBveGxpbnQ6IFsnYXN0cm8nLCAnY2pzJywgJ2N0cycsICdqcycsICdqc3gnLCAnbWpzJywgJ210cycsICdzdmVsdGUnLCAndHMnLCAndHN4JywgJ3Z1ZSddLnRvU29ydGVkKCksXG4gIG94Zm10OiBbXG4gICAgJ2FzdHJvJyxcbiAgICAnY2pzJyxcbiAgICAnY3NzJyxcbiAgICAnY3RzJyxcbiAgICAnZ3FsJyxcbiAgICAnZ3JhcGhxbCcsXG4gICAgJ2hicycsXG4gICAgJ2h0bScsXG4gICAgJ2h0bWwnLFxuICAgICdqcycsXG4gICAgJ2pzb24nLFxuICAgICdqc29uNScsXG4gICAgJ2pzb25jJyxcbiAgICAnanN4JyxcbiAgICAnbGVzcycsXG4gICAgJ21kJyxcbiAgICAnbWR4JyxcbiAgICAnbWpzJyxcbiAgICAnbXRzJyxcbiAgICAnc2NzcycsXG4gICAgJ3N2ZWx0ZScsXG4gICAgJ3RvbWwnLFxuICAgICd0cycsXG4gICAgJ3RzeCcsXG4gICAgJ3Z1ZScsXG4gICAgJ3lhbWwnLFxuICAgICd5bWwnLFxuICBdLnRvU29ydGVkKCksXG4gIHByZXR0aWVyT25seTogWydqYXZhJ10udG9Tb3J0ZWQoKSxcbn07XG4iLCJpbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBleHRlbnNpb25zIH0gZnJvbSAnLi4vdXRpbHMvZXh0ZW5zaW9ucy5qcyc7XG5pbXBvcnQgeyBmc1V0aWwgfSBmcm9tICcuLi91dGlscy9mc1V0aWwuanMnO1xuaW1wb3J0IHsgcHJvbWlzZVBvb2wgfSBmcm9tICcuLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5cbmNvbnN0IG5ld0NvbnRlbnQgPSBgcm9vdCA9IHRydWVcblxuWypdXG5jaGFyc2V0ID0gdXRmLThcbmVuZF9vZl9saW5lID0gbGZcbmluc2VydF9maW5hbF9uZXdsaW5lID0gdHJ1ZVxudHJpbV90cmFpbGluZ193aGl0ZXNwYWNlID0gdHJ1ZVxuXG4ke2dlbmVyYXRlRXh0ZW5zaW9ucyhleHRlbnNpb25zLmNvZGVXaXRoMkluZGVudFNpemUpfVxuaW5kZW50X3NpemUgPSAyXG5pbmRlbnRfc3R5bGUgPSBzcGFjZVxuXG4ke2dlbmVyYXRlRXh0ZW5zaW9ucyhleHRlbnNpb25zLmNvZGVXaXRoNEluZGVudFNpemUpfVxuaW5kZW50X3NpemUgPSA0XG5pbmRlbnRfc3R5bGUgPSBzcGFjZVxuXG4ke2dlbmVyYXRlRXh0ZW5zaW9ucyhleHRlbnNpb25zLm1hcmtkb3duTGlrZSl9XG5tYXhfbGluZV9sZW5ndGggPSBvZmZcbnRyaW1fdHJhaWxpbmdfd2hpdGVzcGFjZSA9IGZhbHNlXG5cblt7TWFrZWZpbGUsKi5ta31dXG5pbmRlbnRfc3R5bGUgPSB0YWJcbmA7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZW5lcmF0ZUVkaXRvcmNvbmZpZyhjb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdnZW5lcmF0ZUVkaXRvcmNvbmZpZycsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJy5lZGl0b3Jjb25maWcnKTtcbiAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnNVdGlsLmdlbmVyYXRlRmlsZShmaWxlUGF0aCwgbmV3Q29udGVudCkpO1xuICB9KTtcbn1cblxuZnVuY3Rpb24gZ2VuZXJhdGVFeHRlbnNpb25zKGV4dGVuc2lvbnM6IHN0cmluZ1tdKTogc3RyaW5nIHtcbiAgcmV0dXJuIGV4dGVuc2lvbnMubGVuZ3RoID4gMSA/IGBbKi57JHtleHRlbnNpb25zLmpvaW4oJywnKX19XWAgOiBgWyouJHtleHRlbnNpb25zWzBdfV1gO1xufVxuIiwiLy8gb3hsaW50LWRpc2FibGUgZXNsaW50LXBsdWdpbi1pbXBvcnQvbm8tbmFtZWQtYXMtZGVmYXVsdC1tZW1iZXIgLS0gTmFtZXNwYWNlIFlBTUwgY2FsbHMgbWFrZSBsb2FkL2R1bXAgdXNhZ2UgY2xlYXJlci5cbmltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCBtZXJnZSBmcm9tICdkZWVwbWVyZ2UnO1xuaW1wb3J0IHlhbWwgZnJvbSAnanMteWFtbCc7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGZzVXRpbCB9IGZyb20gJy4uL3V0aWxzL2ZzVXRpbC5qcyc7XG5pbXBvcnQgeyBvdmVyd3JpdGVNZXJnZSB9IGZyb20gJy4uL3V0aWxzL21lcmdlVXRpbC5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcblxuaW1wb3J0IHsgZ2VuZXJhdGVBZ2VudENvZGluZ1N0eWxlIH0gZnJvbSAnLi9hZ2VudHMuanMnO1xuXG5jb25zdCBkZWZhdWx0Q29uZmlnID0ge1xuICBoYXZlX2Z1bjogdHJ1ZSxcbiAgY29kZV9yZXZpZXc6IHtcbiAgICBkaXNhYmxlOiBmYWxzZSxcbiAgICBjb21tZW50X3NldmVyaXR5X3RocmVzaG9sZDogJ01FRElVTScsXG4gICAgbWF4X3Jldmlld19jb21tZW50czogLTEsXG4gICAgcHVsbF9yZXF1ZXN0X29wZW5lZDoge1xuICAgICAgaGVscDogZmFsc2UsXG4gICAgICBzdW1tYXJ5OiB0cnVlLFxuICAgICAgY29kZV9yZXZpZXc6IHRydWUsXG4gICAgfSxcbiAgfSxcbiAgaWdub3JlX3BhdHRlcm5zOiBbJyoqL19fZ2VuZXJhdGVkX18nXSxcbn07XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZW5lcmF0ZUdlbWluaUNvbmZpZyhjb25maWc6IFBhY2thZ2VDb25maWcsIGFsbENvbmZpZ3M6IFBhY2thZ2VDb25maWdbXSk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2dlbmVyYXRlR2VtaW5pQ29uZmlnJywgYXN5bmMgKCkgPT4ge1xuICAgIGlmICghY29uZmlnLmlzUm9vdCkgcmV0dXJuO1xuXG4gICAgY29uc3QgZGlyUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJy5nZW1pbmknKTtcbiAgICBjb25zdCBjb25maWdGaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShkaXJQYXRoLCAnY29uZmlnLnltbCcpO1xuICAgIGNvbnN0IHN0eWxlZ3VpZGVGaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShkaXJQYXRoLCAnc3R5bGVndWlkZS5tZCcpO1xuICAgIGNvbnN0IGFnZW50c0V4dHJhUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJ0FHRU5UU19FWFRSQS5tZCcpO1xuXG4gICAgbGV0IG5ld0NvbmZpZzogb2JqZWN0ID0gc3RydWN0dXJlZENsb25lKGRlZmF1bHRDb25maWcpO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBvbGRDb250ZW50ID0gYXdhaXQgZnMucHJvbWlzZXMucmVhZEZpbGUoY29uZmlnRmlsZVBhdGgsICd1dGY4Jyk7XG4gICAgICBjb25zdCBvbGRDb25maWcgPSB5YW1sLmxvYWQob2xkQ29udGVudCkgYXMgb2JqZWN0O1xuICAgICAgbmV3Q29uZmlnID0gbWVyZ2UuYWxsKFtuZXdDb25maWcsIG9sZENvbmZpZywgbmV3Q29uZmlnXSwgeyBhcnJheU1lcmdlOiBvdmVyd3JpdGVNZXJnZSB9KTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIGRvIG5vdGhpbmcgLSBmaWxlIGRvZXNuJ3QgZXhpc3Qgb3IgY2FuJ3QgYmUgcGFyc2VkXG4gICAgfVxuXG4gICAgY29uc3QgeWFtbENvbnRlbnQgPSB5YW1sLmR1bXAobmV3Q29uZmlnLCB7XG4gICAgICBsaW5lV2lkdGg6IC0xLFxuICAgICAgbm9Db21wYXRNb2RlOiB0cnVlLFxuICAgICAgc3R5bGVzOiB7XG4gICAgICAgICchIW51bGwnOiAnZW1wdHknLFxuICAgICAgfSxcbiAgICB9KTtcblxuICAgIGNvbnN0IGV4dHJhQ29udGVudCA9IGF3YWl0IGZzVXRpbC5yZWFkRmlsZUlnbm9yaW5nRXJyb3IoYWdlbnRzRXh0cmFQYXRoKTtcbiAgICBjb25zdCBjb2RpbmdSdWxlRXh0cmFDb250ZW50ID0gZXh0cmFDb250ZW50Py50cmltU3RhcnQoKS5zdGFydHNXaXRoKCcjJykgPyB1bmRlZmluZWQgOiBleHRyYUNvbnRlbnQ7XG4gICAgY29uc3QgcmV2aWV3TGFuZ3VhZ2VJbnN0cnVjdGlvbiA9IGNvbmZpZy5pc1B1YmxpY1JlcG9cbiAgICAgID8gJ1JldmlldyBpbiBFbmdsaXNoIGJhc2VkIG9uIHRoZSBmb2xsb3dpbmcgY29kaW5nIHN0YW5kYXJkcy4nXG4gICAgICA6ICfku6XkuIvjga7jgrPjg7zjg4fjgqPjg7PjgrDopo/ntITjgpLouI/jgb7jgYjjgabjgIHml6XmnKzoqp7jgafjg6zjg5Pjg6Xjg7zjgZfjgabjgY/jgaDjgZXjgYTjgIInO1xuICAgIGNvbnN0IHN0eWxlZ3VpZGVDb250ZW50ID0gYCR7cmV2aWV3TGFuZ3VhZ2VJbnN0cnVjdGlvbn1cXG5cXG4ke2dlbmVyYXRlQWdlbnRDb2RpbmdTdHlsZShhbGxDb25maWdzKX0ke1xuICAgICAgY29kaW5nUnVsZUV4dHJhQ29udGVudCA/IGBcXG4ke2NvZGluZ1J1bGVFeHRyYUNvbnRlbnQudHJpbUVuZCgpfWAgOiAnJ1xuICAgIH1gO1xuXG4gICAgY29uc3QgcHJvbWlzZXMgPSBbXG4gICAgICBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnNVdGlsLmdlbmVyYXRlRmlsZShjb25maWdGaWxlUGF0aCwgeWFtbENvbnRlbnQpKSxcbiAgICAgIHByb21pc2VQb29sLnJ1bigoKSA9PiBmc1V0aWwuZ2VuZXJhdGVGaWxlKHN0eWxlZ3VpZGVGaWxlUGF0aCwgc3R5bGVndWlkZUNvbnRlbnQpKSxcbiAgICBdO1xuICAgIGF3YWl0IFByb21pc2UuYWxsKHByb21pc2VzKTtcbiAgfSk7XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiByZW1vdmVHZW1pbmlTZXR0aW5ncyhjb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdnZW5lcmF0ZUdlbWluaVNldHRpbmdzJywgYXN5bmMgKCkgPT4ge1xuICAgIGlmICghY29uZmlnLmlzUm9vdCkgcmV0dXJuO1xuXG4gICAgY29uc3QgZGlyUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJy5nZW1pbmknKTtcbiAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShkaXJQYXRoLCAnc2V0dGluZ3MuanNvbicpO1xuICAgIGF3YWl0IGZzLnByb21pc2VzLnJtKGZpbGVQYXRoLCB7IGZvcmNlOiB0cnVlIH0pO1xuICB9KTtcbn1cbiIsImltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGV4dGVuc2lvbnMgfSBmcm9tICcuLi91dGlscy9leHRlbnNpb25zLmpzJztcbmltcG9ydCB7IGZzVXRpbCB9IGZyb20gJy4uL3V0aWxzL2ZzVXRpbC5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcblxuLy8gY2YuIGh0dHBzOi8vYnVuLnNoL2d1aWRlcy9pbnN0YWxsL2dpdC1kaWZmLWJ1bi1sb2NrZmlsZVxuY29uc3QgbmV3Q29udGVudCA9IGAqIHRleHQ9YXV0b1xuXG4qLmxvY2tiIGJpbmFyeSBkaWZmPWxvY2tiXG4qLnZjcHJvaiB0ZXh0IGVvbD1jcmxmXG5cbiR7Wy4uLmV4dGVuc2lvbnMuY29kZVdpdGgySW5kZW50U2l6ZSwgLi4uZXh0ZW5zaW9ucy5jb2RlV2l0aDRJbmRlbnRTaXplLCAuLi5leHRlbnNpb25zLm1hcmtkb3duTGlrZV1cbiAgLm1hcCgoZXh0KSA9PiBgKi4ke2V4dH0gdGV4dCBlb2w9bGZgKVxuICAuam9pbignXFxuJyl9XG5cbmRpc3QvKiogbGluZ3Vpc3QtZ2VuZXJhdGVkPXRydWVcbmA7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZW5lcmF0ZUdpdGF0dHJpYnV0ZXMoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZ2VuZXJhdGVHaXRhdHRyaWJ1dGVzJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnLmdpdGF0dHJpYnV0ZXMnKTtcbiAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnNVdGlsLmdlbmVyYXRlRmlsZShmaWxlUGF0aCwgbmV3Q29udGVudCkpO1xuICB9KTtcbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBvcyBmcm9tICdub2RlOm9zJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgeyBvcHRpb25zIH0gZnJvbSAnLi4vb3B0aW9ucy5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGZzVXRpbCB9IGZyb20gJy4uL3V0aWxzL2ZzVXRpbC5qcyc7XG5pbXBvcnQgeyBpZ25vcmVGaWxlVXRpbCB9IGZyb20gJy4uL3V0aWxzL2lnbm9yZUZpbGVVdGlsLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuXG4vLyBEbyBub3QgcmVtb3ZlIGB3aW5kb3dzYDogZ2VuZXJhdGVkIC5naXRpZ25vcmUgZmlsZXMgbXVzdCBrZWVwIGlnbm9yaW5nIFdpbmRvd3MtY3JlYXRlZCBsb2NhbCBhcnRpZmFjdHMuXG5jb25zdCBkZWZhdWx0TmFtZXMgPSBbJ3dpbmRvd3MnLCAnbWFjb3MnLCAnbGludXgnLCAnamV0YnJhaW5zJywgJ3Zpc3VhbHN0dWRpb2NvZGUnLCAnZW1hY3MnLCAndmltJywgJ3lhcm4nXTtcblxuY29uc3QgY29tbW9uQ29udGVudCA9IGBcbiEua2VlcFxuLmFpZGVyKlxuLmVudi5wcm9kdWN0aW9uXG4qL21vdW50LyouaGFzaFxuLmRldmNvbnRhaW5lci9cbi5pZGVhL0F1Z21lbnRXZWJ2aWV3U3RhdGVTdG9yZS54bWxcbi5pZGVhL2NvcGlsb3QuKlxuLmlkZWEvY29waWxvdC9jaGF0U2Vzc2lvbnMvXG4ucGxheXdyaWdodC1jbGkvXG4uc2VyZW5hL1xuLnRtcC9cbl9fZ2VuZXJhdGVkX18vXG5Ad2lsbGJvb3N0ZXIvXG5kaXN0L1xudGVtcC9cbnRtcC9cbmA7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZW5lcmF0ZUdpdGlnbm9yZShjb25maWc6IFBhY2thZ2VDb25maWcsIHJvb3RDb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdnZW5lcmF0ZUdpdGlnbm9yZScsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJy5naXRpZ25vcmUnKTtcbiAgICBjb25zdCBjb250ZW50ID0gKGF3YWl0IGZzVXRpbC5yZWFkRmlsZUlnbm9yaW5nRXJyb3IoZmlsZVBhdGgpKSA/PyAnJztcbiAgICBsZXQgaGVhZFVzZXJDb250ZW50ID0gaWdub3JlRmlsZVV0aWwuZ2V0SGVhZFVzZXJDb250ZW50KGNvbnRlbnQpICsgY29tbW9uQ29udGVudDtcbiAgICBjb25zdCB0YWlsVXNlckNvbnRlbnQgPSBpZ25vcmVGaWxlVXRpbC5nZXRUYWlsVXNlckNvbnRlbnQoY29udGVudCk7XG5cbiAgICBjb25zdCBuYW1lcyA9IFsuLi5kZWZhdWx0TmFtZXNdO1xuICAgIGlmIChjb25maWcuZG9lc0NvbnRhaW5HZW1maWxlKSB7XG4gICAgICBuYW1lcy5wdXNoKCdydWJ5Jyk7XG4gICAgfVxuICAgIGlmIChjb25maWcuZG9lc0NvbnRhaW5Hb01vZCkge1xuICAgICAgbmFtZXMucHVzaCgnZ28nKTtcbiAgICAgIGhlYWRVc2VyQ29udGVudCArPSBgJHtwYXRoLmJhc2VuYW1lKGNvbmZpZy5kaXJQYXRoKX1cbmA7XG4gICAgfVxuICAgIGlmIChjb25maWcuZG9lc0NvbnRhaW5QYWNrYWdlSnNvbikge1xuICAgICAgbmFtZXMucHVzaCgnbm9kZScpO1xuICAgIH1cbiAgICBpZiAoY29uZmlnLmRvZXNDb250YWluUG9tWG1sKSB7XG4gICAgICBuYW1lcy5wdXNoKCdtYXZlbicpO1xuICAgICAgaGVhZFVzZXJDb250ZW50ICs9IGAuaWRlYS9nb29nbGUtamF2YS1mb3JtYXQueG1sXG5gO1xuICAgIH1cbiAgICBpZiAoY29uZmlnLmRvZXNDb250YWluUHVic3BlY1lhbWwpIHtcbiAgICAgIG5hbWVzLnB1c2goJ2ZsdXR0ZXInLCAnQW5kcm9pZFN0dWRpbycsICdydWJ5Jyk7XG4gICAgICBoZWFkVXNlckNvbnRlbnQgKz0gYC5mbHV0dGVyLXBsdWdpbnMtZGVwZW5kZW5jaWVzXG5hbmRyb2lkL2tleS5wcm9wZXJ0aWVzXG5pb3MvLmJ1bmRsZVxuLmlkZWEvcnVuQ29uZmlndXJhdGlvbnMueG1sXG5gO1xuICAgIH1cbiAgICBpZiAoY29uZmlnLmRvZXNDb250YWluVGVtcGxhdGVZYW1sKSB7XG4gICAgICBoZWFkVXNlckNvbnRlbnQgKz0gYC5hd3Mtc2FtL1xucGFja2FnZWQueWFtbFxuYDtcbiAgICB9XG4gICAgLy8gQmVjYXVzZSAudmVudiBzaG91bGQgYmUgaWdub3JlZCBvbiByb290IGRpcmVjdG9yeVxuICAgIGlmIChjb25maWcuZG9lc0NvbnRhaW5Qb2V0cnlMb2NrIHx8IGNvbmZpZy5kb2VzQ29udGFpblV2TG9jaykge1xuICAgICAgbmFtZXMucHVzaCgncHl0aG9uJyk7XG4gICAgICBoZWFkVXNlckNvbnRlbnQgKz0gYC52ZW52L1xuYDtcbiAgICB9XG5cbiAgICBpZiAoY29uZmlnLmRlcGVuZGluZy5ibGl0eikge1xuICAgICAgaGVhZFVzZXJDb250ZW50ICs9IGAuYmxpdHovXG4uYmxpdHoqKlxuYDtcbiAgICB9XG4gICAgaWYgKGNvbmZpZy5kZXBlbmRpbmcubmV4dCkge1xuICAgICAgbmFtZXMucHVzaCgnbmV4dGpzJyk7XG4gICAgfVxuICAgIGlmIChyb290Q29uZmlnLmRlcGVuZGluZy5maXJlYmFzZSB8fCBjb25maWcuZGVwZW5kaW5nLmZpcmViYXNlKSB7XG4gICAgICBuYW1lcy5wdXNoKCdmaXJlYmFzZScpO1xuICAgIH1cbiAgICBpZiAoY29uZmlnLmRlcGVuZGluZy5wcmlzbWEpIHtcbiAgICAgIGhlYWRVc2VyQ29udGVudCArPSBgKi5zcWxpdGUzKlxuYDtcbiAgICB9XG4gICAgaWYgKGNvbmZpZy5kZXBlbmRpbmcucGxheXdyaWdodFRlc3QpIHtcbiAgICAgIGhlYWRVc2VyQ29udGVudCArPSBgcGxheXdyaWdodC1yZXBvcnQvXG50ZXN0LXJlc3VsdHMvXG5gO1xuICAgIH1cbiAgICBpZiAocm9vdENvbmZpZy5kZXBlbmRpbmcucmVhY3ROYXRpdmUgfHwgY29uZmlnLmRlcGVuZGluZy5yZWFjdE5hdGl2ZSkge1xuICAgICAgbmFtZXMucHVzaCgncmVhY3RuYXRpdmUnKTtcbiAgICAgIGhlYWRVc2VyQ29udGVudCArPSBgZ29vZ2xlLXNlcnZpY2VzLmpzb25cbmFuZHJvaWQvYXBwL3NyYy9tYWluL2Fzc2V0cy9cbmA7XG4gICAgfVxuICAgIGlmIChjb25maWcuZGVwZW5kaW5nLnN0b3J5Ym9vaykge1xuICAgICAgbmFtZXMucHVzaCgnc3Rvcnlib29ranMnKTtcbiAgICB9XG4gICAgaWYgKGNvbmZpZy5kZXBlbmRpbmcubGl0ZXN0cmVhbSkge1xuICAgICAgaGVhZFVzZXJDb250ZW50ICs9IGBnY3Atc2Eta2V5Lmpzb25cbmA7XG4gICAgfVxuXG4gICAgbGV0IGdlbmVyYXRlZCA9ICcnO1xuICAgIGZvciAoY29uc3QgbmFtZSBvZiBuYW1lcykge1xuICAgICAgbGV0IGNvbnRlbnQgPSAoYXdhaXQgcmVhZENhY2hlKG5hbWUpKSA/PyAnJztcbiAgICAgIGlmICghY29udGVudCkge1xuICAgICAgICBjb25zdCB1cmwgPSBgaHR0cHM6Ly93d3cudG9wdGFsLmNvbS9kZXZlbG9wZXJzL2dpdGlnbm9yZS9hcGkvJHtuYW1lfWA7XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2godXJsKTtcbiAgICAgICAgY29uc3QgcmVzcG9uc2VUZXh0ID0gYXdhaXQgcmVzcG9uc2UudGV4dCgpO1xuICAgICAgICBpZiAoIXJlc3BvbnNlLm9rIHx8IHJlc3BvbnNlVGV4dC5pbmNsdWRlcygnQXR0ZW50aW9uIFJlcXVpcmVkIScpIHx8IHJlc3BvbnNlVGV4dC5pbmNsdWRlcygnPHRpdGxlPicpKSB7XG4gICAgICAgICAgY29uc29sZS5lcnJvcihgRmFpbGVkIHRvIGZldGNoICR7dXJsfWApO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb250ZW50ID0gcmVzcG9uc2VUZXh0LnRyaW0oKTtcbiAgICAgICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IHdyaXRlQ2FjaGUobmFtZSwgY29udGVudCkpO1xuICAgICAgICBpZiAob3B0aW9ucy5pc1ZlcmJvc2UpIHtcbiAgICAgICAgICBjb25zb2xlLmluZm8oYEZldGNoZWQgJHt1cmx9YCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChnZW5lcmF0ZWQpIGdlbmVyYXRlZCArPSAnXFxuJztcbiAgICAgIGdlbmVyYXRlZCArPSBjb250ZW50ICsgJ1xcbic7XG4gICAgfVxuICAgIGlmICghKGF3YWl0IGlnbm9yZUZpbGVVdGlsLmlzQmVycnlaZXJvSW5zdGFsbEVuYWJsZWQoZmlsZVBhdGgpKSkge1xuICAgICAgZ2VuZXJhdGVkID0gZ2VuZXJhdGVkLnJlcGxhY2UoJyEueWFybi9jYWNoZScsICcjICEueWFybi9jYWNoZScpLnJlcGxhY2UoJyMgLnBucC4qJywgJy5wbnAuKicpO1xuICAgIH1cbiAgICBpZiAoY29uZmlnLmRvZXNDb250YWluUG9tWG1sIHx8IGNvbmZpZy5kb2VzQ29udGFpblB1YnNwZWNZYW1sKSB7XG4gICAgICBnZW5lcmF0ZWQgPSBnZW5lcmF0ZWRcbiAgICAgICAgLnJlcGxhY2VBbGwoL14jIC5pZGVhXFwvYXJ0aWZhY3RzJC9nbSwgJy5pZGVhL2FydGlmYWN0cycpXG4gICAgICAgIC5yZXBsYWNlQWxsKC9eIyAuaWRlYVxcL2NvbXBpbGVyLnhtbCQvZ20sICcuaWRlYS9jb21waWxlci54bWwnKVxuICAgICAgICAucmVwbGFjZUFsbCgvXiMgLmlkZWFcXC9qYXJSZXBvc2l0b3JpZXMueG1sJC9nbSwgJy5pZGVhL2phclJlcG9zaXRvcmllcy54bWwnKVxuICAgICAgICAucmVwbGFjZUFsbCgvXiMgLmlkZWFcXC9tb2R1bGVzLnhtbCQvZ20sICcuaWRlYS9tb2R1bGVzLnhtbCcpXG4gICAgICAgIC5yZXBsYWNlQWxsKC9eIyAuaWRlYVxcLyouaW1sJC9nbSwgJy5pZGVhLyouaW1sJylcbiAgICAgICAgLnJlcGxhY2VBbGwoL14jIC5pZGVhXFwvbW9kdWxlcyQvZ20sICcuaWRlYS9tb2R1bGVzJylcbiAgICAgICAgLnJlcGxhY2VBbGwoL14jICouaW1sJC9nbSwgJyouaW1sJylcbiAgICAgICAgLnJlcGxhY2VBbGwoL14jICouaXByJC9nbSwgJyouaXByJyk7XG4gICAgICBpZiAoY29uZmlnLmRvZXNDb250YWluUHVic3BlY1lhbWwpIHtcbiAgICAgICAgZ2VuZXJhdGVkID0gZ2VuZXJhdGVkLnJlcGxhY2VBbGwoL14uaWRlYVxcL21vZHVsZXMueG1sJC9nbSwgJyMgLmlkZWEvbW9kdWxlcy54bWwnKTtcbiAgICAgIH1cbiAgICB9XG4gICAgZ2VuZXJhdGVkID0gZ2VuZXJhdGVkLnJlcGxhY2VBbGwoL14uaWRlYVxcLz8kL2dtLCAnIyAuaWRlYScpO1xuICAgIGlmIChyb290Q29uZmlnLmRlcGVuZGluZy5yZWFjdE5hdGl2ZSB8fCBjb25maWcuZGVwZW5kaW5nLnJlYWN0TmF0aXZlIHx8IGNvbmZpZy5kb2VzQ29udGFpblB1YnNwZWNZYW1sKSB7XG4gICAgICBnZW5lcmF0ZWQgPSBnZW5lcmF0ZWQucmVwbGFjZUFsbCgvXiguaWRlYVxcLy4rKSQvZ20sICckMVxcbmFuZHJvaWQvJDEnKTtcbiAgICB9XG4gICAgY29uc3QgbmV3Q29udGVudCA9IGhlYWRVc2VyQ29udGVudCArICdcXG4nICsgZ2VuZXJhdGVkICsgdGFpbFVzZXJDb250ZW50O1xuICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiBmc1V0aWwuZ2VuZXJhdGVGaWxlKGZpbGVQYXRoLCBuZXdDb250ZW50KSk7XG4gIH0pO1xufVxuXG5jb25zdCBkaXJQYXRoID0gcGF0aC5qb2luKG9zLmhvbWVkaXIoKSwgJy5jYWNoZScsICd3YmZ5JywgJ2dpdGlnbm9yZScpO1xuXG5hc3luYyBmdW5jdGlvbiB3cml0ZUNhY2hlKG5hbWU6IHN0cmluZywgY29udGVudDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gIGF3YWl0IGZzLnByb21pc2VzLm1rZGlyKGRpclBhdGgsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICBhd2FpdCBmcy5wcm9taXNlcy53cml0ZUZpbGUocGF0aC5qb2luKGRpclBhdGgsIG5hbWUpLCBjb250ZW50KTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gcmVhZENhY2hlKG5hbWU6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nIHwgdW5kZWZpbmVkPiB7XG4gIHRyeSB7XG4gICAgY29uc3Qgc3RhdCA9IGF3YWl0IGZzLnByb21pc2VzLnN0YXQocGF0aC5qb2luKGRpclBhdGgsIG5hbWUpKTtcbiAgICBpZiAoRGF0ZS5ub3coKSAtIHN0YXQubXRpbWVNcyA+IDYgKiA2MCAqIDYwICogMTAwMCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICByZXR1cm4gYXdhaXQgZnMucHJvbWlzZXMucmVhZEZpbGUocGF0aC5qb2luKGRpclBhdGgsIG5hbWUpLCAndXRmOCcpO1xuICB9IGNhdGNoIHtcbiAgICAvLyBkbyBub3RoaW5nXG4gIH1cbn1cbiIsImltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuXG5leHBvcnQgZnVuY3Rpb24gZG9lc0NvbnRhaW5Kc09yVHMoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogYm9vbGVhbiB7XG4gIHJldHVybiAoXG4gICAgY29uZmlnLmRvZXNDb250YWluSmF2YVNjcmlwdCB8fFxuICAgIGNvbmZpZy5kb2VzQ29udGFpbkphdmFTY3JpcHRJblBhY2thZ2VzIHx8XG4gICAgY29uZmlnLmRvZXNDb250YWluVHlwZVNjcmlwdCB8fFxuICAgIGNvbmZpZy5kb2VzQ29udGFpblR5cGVTY3JpcHRJblBhY2thZ2VzXG4gICk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBkb2VzQ29udGFpbkphdmEoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogYm9vbGVhbiB7XG4gIHJldHVybiBjb25maWcuZG9lc0NvbnRhaW5KYXZhIHx8IGNvbmZpZy5kb2VzQ29udGFpbkphdmFJblBhY2thZ2VzO1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZXh0ZW5zaW9ucyB9IGZyb20gJy4uL3V0aWxzL2V4dGVuc2lvbnMuanMnO1xuaW1wb3J0IHsgZnNVdGlsIH0gZnJvbSAnLi4vdXRpbHMvZnNVdGlsLmpzJztcbmltcG9ydCB7IGRvZXNDb250YWluSmF2YSwgZG9lc0NvbnRhaW5Kc09yVHMgfSBmcm9tICcuLi91dGlscy9wYWNrYWdlQ2FwYWJpbGl0aWVzLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVJZGVhU2V0dGluZ3MoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZ2VuZXJhdGVJZGVhU2V0dGluZ3MnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgZGlyUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJy5pZGVhJyk7XG4gICAgaWYgKGZzLmV4aXN0c1N5bmMoZGlyUGF0aCkpIHtcbiAgICAgIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKGRpclBhdGgsICd3YXRjaGVyVGFza3MueG1sJyk7XG4gICAgICBhd2FpdCAoZG9lc0NvbnRhaW5Kc09yVHMoY29uZmlnKSB8fCBkb2VzQ29udGFpbkphdmEoY29uZmlnKVxuICAgICAgICA/IHByb21pc2VQb29sLnJ1bigoKSA9PiBmc1V0aWwuZ2VuZXJhdGVGaWxlKGZpbGVQYXRoLCBnZXRXYXRjaGVyVGFza3NDb250ZW50KGNvbmZpZykpKVxuICAgICAgICA6IHByb21pc2VQb29sLnJ1bigoKSA9PiBmcy5wcm9taXNlcy5ybShmaWxlUGF0aCwgeyBmb3JjZTogdHJ1ZSB9KSkpO1xuICAgIH1cbiAgfSk7XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZVRhc2tPcHRpb25zKHJ1bm5lcjogc3RyaW5nLCBhcmdzOiBzdHJpbmcsIG5hbWU6IHN0cmluZywgZXh0ZW5zaW9uOiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gYCAgICA8VGFza09wdGlvbnMgaXNFbmFibGVkPVwidHJ1ZVwiPlxuICAgICAgPG9wdGlvbiBuYW1lPVwiYXJndW1lbnRzXCIgdmFsdWU9XCIke2FyZ3N9ICRGaWxlUGF0aFJlbGF0aXZlVG9Qcm9qZWN0Um9vdCRcIiAvPlxuICAgICAgPG9wdGlvbiBuYW1lPVwiY2hlY2tTeW50YXhFcnJvcnNcIiB2YWx1ZT1cImZhbHNlXCIgLz5cbiAgICAgIDxvcHRpb24gbmFtZT1cImRlc2NyaXB0aW9uXCIgLz5cbiAgICAgIDxvcHRpb24gbmFtZT1cImV4aXRDb2RlQmVoYXZpb3JcIiB2YWx1ZT1cIkVSUk9SXCIgLz5cbiAgICAgIDxvcHRpb24gbmFtZT1cImZpbGVFeHRlbnNpb25cIiB2YWx1ZT1cIiR7ZXh0ZW5zaW9ufVwiIC8+XG4gICAgICA8b3B0aW9uIG5hbWU9XCJpbW1lZGlhdGVTeW5jXCIgdmFsdWU9XCJmYWxzZVwiIC8+XG4gICAgICA8b3B0aW9uIG5hbWU9XCJuYW1lXCIgdmFsdWU9XCIke25hbWV9ICguJHtleHRlbnNpb259KVwiIC8+XG4gICAgICA8b3B0aW9uIG5hbWU9XCJvdXRwdXRcIiB2YWx1ZT1cIiRGaWxlUGF0aFJlbGF0aXZlVG9Qcm9qZWN0Um9vdCRcIiAvPlxuICAgICAgPG9wdGlvbiBuYW1lPVwib3V0cHV0RmlsdGVyc1wiPlxuICAgICAgICA8YXJyYXkgLz5cbiAgICAgIDwvb3B0aW9uPlxuICAgICAgPG9wdGlvbiBuYW1lPVwib3V0cHV0RnJvbVN0ZG91dFwiIHZhbHVlPVwiZmFsc2VcIiAvPlxuICAgICAgPG9wdGlvbiBuYW1lPVwicHJvZ3JhbVwiIHZhbHVlPVwiJHtydW5uZXJ9XCIgLz5cbiAgICAgIDxvcHRpb24gbmFtZT1cInJ1bk9uRXh0ZXJuYWxDaGFuZ2VzXCIgdmFsdWU9XCJmYWxzZVwiIC8+XG4gICAgICA8b3B0aW9uIG5hbWU9XCJzY29wZU5hbWVcIiB2YWx1ZT1cIlByb2plY3QgRmlsZXNcIiAvPlxuICAgICAgPG9wdGlvbiBuYW1lPVwidHJhY2tPbmx5Um9vdFwiIHZhbHVlPVwiZmFsc2VcIiAvPlxuICAgICAgPG9wdGlvbiBuYW1lPVwid29ya2luZ0RpclwiIHZhbHVlPVwiJFByb2plY3RGaWxlRGlyJFwiIC8+XG4gICAgICA8ZW52cyAvPlxuICAgIDwvVGFza09wdGlvbnM+XG5gO1xufVxuXG5mdW5jdGlvbiBnZXRXYXRjaGVyVGFza3NDb250ZW50KGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IHN0cmluZyB7XG4gIHJldHVybiBgPD94bWwgdmVyc2lvbj1cIjEuMFwiIGVuY29kaW5nPVwiVVRGLThcIj8+XG48cHJvamVjdCB2ZXJzaW9uPVwiNFwiPlxuICA8Y29tcG9uZW50IG5hbWU9XCJQcm9qZWN0VGFza3NPcHRpb25zXCI+XG4ke2RvZXNDb250YWluSnNPclRzKGNvbmZpZykgPyBleHRlbnNpb25zLm94Zm10Lm1hcCgoZXh0KSA9PiBjcmVhdGVUYXNrT3B0aW9ucygnbm9kZScsICdub2RlX21vZHVsZXMvLmJpbi9veGZtdCAtLXdyaXRlIC0tbm8tZXJyb3Itb24tdW5tYXRjaGVkLXBhdHRlcm4nLCAnT3hmbXQnLCBleHQpKS5qb2luKCcnKSA6ICcnfVxuJHtkb2VzQ29udGFpbkphdmEoY29uZmlnKSA/IGV4dGVuc2lvbnMucHJldHRpZXJPbmx5Lm1hcCgoZXh0KSA9PiBjcmVhdGVUYXNrT3B0aW9ucygnbm9kZScsICdub2RlX21vZHVsZXMvLmJpbi9wcmV0dGllciAtLWNhY2hlIC0td3JpdGUnLCAnUHJldHRpZXInLCBleHQpKS5qb2luKCcnKSA6ICcnfVxuICA8L2NvbXBvbmVudD5cbjwvcHJvamVjdD5cbmA7XG59XG4iLCJpbXBvcnQgdHlwZSB7IFBhY2thZ2VKc29uIH0gZnJvbSAndHlwZS1mZXN0JztcblxuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRHZW5JMThuVHNDb21tYW5kKFxuICBjb25maWc6IFBpY2s8UGFja2FnZUNvbmZpZywgJ2RlcGVuZGluZycgfCAnaXNCdW4nPixcbiAgc2NyaXB0czogUGFja2FnZUpzb24uU2NyaXB0cyB8IHVuZGVmaW5lZFxuKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgaWYgKCFjb25maWcuZGVwZW5kaW5nLmdlbkkxOG5UcyB8fCAhc2NyaXB0cz8uWydnZW4taTE4bi10cyddKSByZXR1cm4gdW5kZWZpbmVkO1xuICByZXR1cm4gYCR7Y29uZmlnLmlzQnVuID8gJ2J1bicgOiAneWFybid9IHJ1biBnZW4taTE4bi10cyA+IC9kZXYvbnVsbGA7XG59XG4iLCJpbXBvcnQgdHlwZSB7IFNwYXduU3luY09wdGlvbnMgfSBmcm9tICdub2RlOmNoaWxkX3Byb2Nlc3MnO1xuaW1wb3J0IGNoaWxkX3Byb2Nlc3MgZnJvbSAnbm9kZTpjaGlsZF9wcm9jZXNzJztcblxuZXhwb3J0IGZ1bmN0aW9uIHNwYXduU3luYyhjb21tYW5kOiBzdHJpbmcsIGFyZ3M6IHN0cmluZ1tdLCBjd2Q6IHN0cmluZywgcmV0cnkgPSAwKTogdm9pZCB7XG4gIHNwYXduU3luY0FuZFJldHVyblN0YXR1cyhjb21tYW5kLCBhcmdzLCBjd2QsIHJldHJ5KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHNwYXduU3luY0FuZFJldHVyblN0YXR1cyhjb21tYW5kOiBzdHJpbmcsIGFyZ3M6IHN0cmluZ1tdLCBjd2Q6IHN0cmluZywgcmV0cnkgPSAwKTogbnVtYmVyIHtcbiAgZG8ge1xuICAgIGNvbnN0IFtuZXdDbWQsIG5ld0FyZ3MsIG9wdGlvbnNdID0gZ2V0U3Bhd25TeW5jQXJncyhjb21tYW5kLCBhcmdzLCBjd2QpO1xuICAgIGNvbnNvbGUubG9nKGAkICR7bmV3Q21kfSAke25ld0FyZ3Muam9pbignICcpfSBhdCAke2N3ZH1gKTtcbiAgICBjb25zdCByZXQgPSBjaGlsZF9wcm9jZXNzLnNwYXduU3luYyhuZXdDbWQsIG5ld0FyZ3MsIG9wdGlvbnMpO1xuICAgIGNvbnN0IHN0YXR1cyA9IHJldC5zdGF0dXMgPz8gMTtcbiAgICBpZiAoc3RhdHVzID09PSAwKSBicmVhaztcbiAgICBpZiAocmV0cnkgPD0gMCkgcmV0dXJuIHN0YXR1cztcbiAgfSB3aGlsZSAoLS1yZXRyeSA+PSAwKTtcbiAgcmV0dXJuIDA7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBzcGF3blN5bmNBbmRSZXR1cm5TdGRvdXQoY29tbWFuZDogc3RyaW5nLCBhcmdzOiBzdHJpbmdbXSwgY3dkOiBzdHJpbmcpOiBzdHJpbmcge1xuICBjb25zdCBbbmV3Q21kLCBuZXdBcmdzLCBvcHRpb25zXSA9IGdldFNwYXduU3luY0FyZ3MoY29tbWFuZCwgYXJncywgY3dkKTtcbiAgb3B0aW9ucy5zdGRpbyA9ICdwaXBlJztcbiAgY29uc3QgcHJvYyA9IGNoaWxkX3Byb2Nlc3Muc3Bhd25TeW5jKG5ld0NtZCwgbmV3QXJncywgb3B0aW9ucyk7XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW5uZWNlc3NhcnktY29uZGl0aW9uIC0tIHNwYXduU3luYyByZXR1cm5zIG51bGwgc3RkZXJyIG9uIEVOT0VOVC5cbiAgY29uc3Qgc3RkZXJyID0gcHJvYy5zdGRlcnIgPz8gJyc7XG4gIGNvbnN0IGVycm9yID0gdHlwZW9mIHN0ZGVyciA9PT0gJ3N0cmluZycgPyBzdGRlcnIudHJpbSgpIDogc3RkZXJyLnRvU3RyaW5nKCkudHJpbSgpO1xuICBpZiAocHJvYy5lcnJvcikge1xuICAgIGNvbnNvbGUuZXJyb3IoYCR7bmV3Q21kfSBbJHtuZXdBcmdzLm1hcCgocykgPT4gYFwiJHtzfVwiYCkuam9pbignLCAnKX1dIGZhaWxlZCB3aXRoOiAke3Byb2MuZXJyb3IubWVzc2FnZX1gKTtcbiAgfSBlbHNlIGlmIChlcnJvcikge1xuICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICBgJHtuZXdDbWR9IFske25ld0FyZ3MubWFwKChzKSA9PiBgXCIke3N9XCJgKS5qb2luKCcsICcpfV0gb3V0cHV0cyB0aGUgZm9sbG93aW5nIGNvbnRlbnQgdG8gc3RkZXJyOlxcbiR7ZXJyb3J9YFxuICAgICk7XG4gIH1cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bm5lY2Vzc2FyeS1jb25kaXRpb24gLS0gc3Bhd25TeW5jIHJldHVybnMgbnVsbCBzdGRvdXQgb24gRU5PRU5ULlxuICBjb25zdCBzdGRvdXQgPSBwcm9jLnN0ZG91dCA/PyAnJztcbiAgcmV0dXJuIHR5cGVvZiBzdGRvdXQgPT09ICdzdHJpbmcnID8gc3Rkb3V0LnRyaW0oKSA6IHN0ZG91dC50b1N0cmluZygpLnRyaW0oKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldFNwYXduU3luY0FyZ3MoY29tbWFuZDogc3RyaW5nLCBhcmdzOiBzdHJpbmdbXSwgY3dkOiBzdHJpbmcpOiBbc3RyaW5nLCBzdHJpbmdbXSwgU3Bhd25TeW5jT3B0aW9uc10ge1xuICBjb25zdCBlbnYgPSB7IC4uLnByb2Nlc3MuZW52IH07XG4gIC8vIFJlbW92ZSBiZXJyeSBmcm9tIFBBVEhcbiAgaWYgKGVudi5QQVRIICYmIGVudi5CRVJSWV9CSU5fRk9MREVSKSB7XG4gICAgZW52LlBBVEggPSBlbnYuUEFUSC5zcGxpdCgnOicpXG4gICAgICAuZmlsdGVyKChwKSA9PiBwICE9PSBlbnYuQkVSUllfQklOX0ZPTERFUilcbiAgICAgIC5qb2luKCc6Jyk7XG4gIH1cblxuICByZXR1cm4gW1xuICAgIGNvbW1hbmQsXG4gICAgYXJncyxcbiAgICB7XG4gICAgICBjd2QsXG4gICAgICBlbnYsXG4gICAgICBlbmNvZGluZzogJ3V0ZjgnLFxuICAgICAgc2hlbGw6IGZhbHNlLFxuICAgICAgc3RkaW86ICdpbmhlcml0JyxcbiAgICB9LFxuICBdO1xufVxuIiwiaW1wb3J0IHsgT2N0b2tpdCB9IGZyb20gJ0BvY3Rva2l0L2NvcmUnO1xuXG5jbGFzcyBHaXRIdWJVdGlsIHtcbiAgZ2V0T3JnQW5kTmFtZSh1cmxPckZ1bGxOYW1lOiBzdHJpbmcpOiBbc3RyaW5nLCBzdHJpbmddIHtcbiAgICBjb25zdCB1cmxXaXRob3V0UHJvdG9jb2wgPSB1cmxPckZ1bGxOYW1lLnNwbGl0KCc6JykuYXQoLTEpO1xuICAgIGNvbnN0IG5hbWVzID0gdXJsV2l0aG91dFByb3RvY29sPy5zcGxpdCgnLycpO1xuICAgIGNvbnN0IG9yZyA9IG5hbWVzPy5hdCgtMikgPz8gJyc7XG4gICAgY29uc3QgbmFtZSA9IG5hbWVzPy5hdCgtMSk/LnJlcGxhY2UoLy5naXQkLywgJycpID8/ICcnO1xuICAgIHJldHVybiBbb3JnLCBuYW1lXTtcbiAgfVxufVxuZXhwb3J0IGNvbnN0IGdpdEh1YlV0aWwgPSBuZXcgR2l0SHViVXRpbCgpO1xuXG5jb25zdCBvY3Rva2l0Q2FjaGUgPSBuZXcgTWFwPHN0cmluZywgT2N0b2tpdD4oKTtcblxuZXhwb3J0IGZ1bmN0aW9uIGdldE9jdG9raXQob3duZXI/OiBzdHJpbmcpOiBPY3Rva2l0IHtcbiAgY29uc3Qga2V5ID0gb3duZXIgPz8gJyc7XG4gIGNvbnN0IGNhY2hlZCA9IG9jdG9raXRDYWNoZS5nZXQoa2V5KTtcbiAgaWYgKGNhY2hlZCkgcmV0dXJuIGNhY2hlZDtcblxuICBjb25zdCBvY3Rva2l0ID0gbmV3IE9jdG9raXQoe1xuICAgIGF1dGg6IGdldEdpdEh1YlRva2VuKG93bmVyKSB8fCB1bmRlZmluZWQsXG4gIH0pO1xuICBvY3Rva2l0Q2FjaGUuc2V0KGtleSwgb2N0b2tpdCk7XG4gIHJldHVybiBvY3Rva2l0O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaGFzR2l0SHViVG9rZW4ob3duZXI6IHN0cmluZyk6IGJvb2xlYW4ge1xuICByZXR1cm4gISFnZXRHaXRIdWJUb2tlbihvd25lcik7XG59XG5cbmZ1bmN0aW9uIGdldEdpdEh1YlRva2VuKG93bmVyPzogc3RyaW5nKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgaWYgKG93bmVyID09PSAnV2lsbEJvb3N0ZXInKSB7XG4gICAgcmV0dXJuIHByb2Nlc3MuZW52LkdIX0JPVF9QQVRfRk9SX1dJTExCT09TVEVSO1xuICB9XG4gIGlmIChvd25lciA9PT0gJ1dpbGxCb29zdGVyTGFiJykge1xuICAgIHJldHVybiBwcm9jZXNzLmVudi5HSF9CT1RfUEFUX0ZPUl9XSUxMQk9PU1RFUkxBQjtcbiAgfVxuICByZXR1cm4gKFxuICAgIHByb2Nlc3MuZW52LkdIX0JPVF9QQVRfRk9SX1dJTExCT09TVEVSIHx8XG4gICAgcHJvY2Vzcy5lbnYuR0hfQk9UX1BBVF9GT1JfV0lMTEJPT1NURVJMQUIgfHxcbiAgICBwcm9jZXNzLmVudi5HSF9UT0tFTiB8fFxuICAgIHByb2Nlc3MuZW52LkdJVEhVQl9UT0tFTlxuICApO1xufVxuIiwiaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5cbmV4cG9ydCBmdW5jdGlvbiBpc1B1Ymxpc2hlZFdpbGxib29zdGVyQ29uZmlnc1BhY2thZ2UoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogYm9vbGVhbiB7XG4gIHJldHVybiAoXG4gICAgY29uZmlnLmlzV2lsbEJvb3N0ZXJDb25maWdzICYmXG4gICAgIWNvbmZpZy5pc1Jvb3QgJiZcbiAgICBjb25maWcucGFja2FnZUpzb24/LnByaXZhdGUgIT09IHRydWUgJiZcbiAgICBBcnJheS5pc0FycmF5KGNvbmZpZy5wYWNrYWdlSnNvbj8uZmlsZXMpICYmXG4gICAgY29uZmlnLnBhY2thZ2VKc29uLmZpbGVzLmxlbmd0aCA+IDBcbiAgKTtcbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCBtZXJnZSBmcm9tICdkZWVwbWVyZ2UnO1xuaW1wb3J0IGZnIGZyb20gJ2Zhc3QtZ2xvYic7XG5pbXBvcnQgeyBzb3J0UGFja2FnZUpzb24gfSBmcm9tICdzb3J0LXBhY2thZ2UtanNvbic7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VKc29uLCBTZXRSZXF1aXJlZCB9IGZyb20gJ3R5cGUtZmVzdCc7XG5cbmltcG9ydCB7IGdldExhdGVzdENvbW1pdEhhc2ggfSBmcm9tICcuLi9naXRodWIvY29tbWl0LmpzJztcbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGV4dGVuc2lvbnMgfSBmcm9tICcuLi91dGlscy9leHRlbnNpb25zLmpzJztcbmltcG9ydCB7IGZzVXRpbCB9IGZyb20gJy4uL3V0aWxzL2ZzVXRpbC5qcyc7XG5pbXBvcnQgeyBnZXRHZW5JMThuVHNDb21tYW5kIH0gZnJvbSAnLi4vdXRpbHMvZ2VuSTE4blRzLmpzJztcbmltcG9ydCB7IGdpdEh1YlV0aWwgfSBmcm9tICcuLi91dGlscy9naXRodWJVdGlsLmpzJztcbmltcG9ydCB7IGdsb2JJZ25vcmUgfSBmcm9tICcuLi91dGlscy9nbG9iVXRpbC5qcyc7XG5pbXBvcnQgeyBpZ25vcmVGaWxlVXRpbCB9IGZyb20gJy4uL3V0aWxzL2lnbm9yZUZpbGVVdGlsLmpzJztcbmltcG9ydCB7IGNvbWJpbmVNZXJnZSB9IGZyb20gJy4uL3V0aWxzL21lcmdlVXRpbC5qcyc7XG5pbXBvcnQgeyBkb2VzQ29udGFpbkphdmEsIGRvZXNDb250YWluSnNPclRzIH0gZnJvbSAnLi4vdXRpbHMvcGFja2FnZUNhcGFiaWxpdGllcy5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcbmltcG9ydCB7IHNwYXduU3luYywgc3Bhd25TeW5jQW5kUmV0dXJuU3Rkb3V0IH0gZnJvbSAnLi4vdXRpbHMvc3Bhd25VdGlsLmpzJztcbmltcG9ydCB7IGdldFRzY29uZmlnQmFzZURlcGVuZGVuY2llcyB9IGZyb20gJy4uL3V0aWxzL3RzY29uZmlnQmFzZS5qcyc7XG5pbXBvcnQgeyBpc1B1Ymxpc2hlZFdpbGxib29zdGVyQ29uZmlnc1BhY2thZ2UgfSBmcm9tICcuLi91dGlscy93aWxsYm9vc3RlckNvbmZpZ3NVdGlsLmpzJztcblxuY29uc3Qgb3hsaW50RGVwcyA9IFsnQHdpbGxib29zdGVyL294Zm10LWNvbmZpZycsICdAd2lsbGJvb3N0ZXIvb3hsaW50LWNvbmZpZycsICdveGZtdCcsICdveGxpbnQnLCAnb3hsaW50LXRzZ29saW50J107XG5jb25zdCB0eXBlc2NyaXB0R29EZXBlbmRlbmN5ID0gJ0B0eXBlc2NyaXB0L25hdGl2ZS1wcmV2aWV3JztcbmNvbnN0IHdiRGVwZW5kZW5jeSA9ICdAd2lsbGJvb3N0ZXIvd2InO1xuY29uc3QgYnVpbGRUc0RlcGVuZGVuY3kgPSAnYnVpbGQtdHMnO1xuY29uc3Qgb2Jzb2xldGVMaW50RGVwZW5kZW5jaWVzID0gW1xuICAnQGJpb21lanMvYmlvbWUnLFxuICAnQGVzbGludC1yZWFjdC9lc2xpbnQtcGx1Z2luJyxcbiAgJ0Blc2xpbnQvanMnLFxuICAnQG5leHQvZXNsaW50LXBsdWdpbi1uZXh0JyxcbiAgJ0B0eXBlcy9lc2xpbnQnLFxuICAnQHR5cGVzL21pY3JvbWF0Y2gnLFxuICAnQHR5cGVzY3JpcHQtZXNsaW50L2VzbGludC1wbHVnaW4nLFxuICAnQHR5cGVzY3JpcHQtZXNsaW50L3BhcnNlcicsXG4gICdAd2lsbGJvb3N0ZXIvYmlvbWUtY29uZmlnJyxcbiAgJ0B3aWxsYm9vc3Rlci9lc2xpbnQtY29uZmlnJyxcbiAgJ0B3aWxsYm9vc3Rlci9lc2xpbnQtY29uZmlnLWJsaXR6LW5leHQnLFxuICAnQHdpbGxib29zdGVyL2VzbGludC1jb25maWctanMnLFxuICAnQHdpbGxib29zdGVyL2VzbGludC1jb25maWctanMtcmVhY3QnLFxuICAnQHdpbGxib29zdGVyL2VzbGludC1jb25maWctbmV4dCcsXG4gICdAd2lsbGJvb3N0ZXIvZXNsaW50LWNvbmZpZy1yZWFjdCcsXG4gICdAd2lsbGJvb3N0ZXIvZXNsaW50LWNvbmZpZy10cycsXG4gICdAd2lsbGJvb3N0ZXIvZXNsaW50LWNvbmZpZy10cy1yZWFjdCcsXG4gICdiaW9tZScsXG4gICdlc2xpbnQnLFxuICAnZXNsaW50LWNvbmZpZy1mbGF0LWdpdGlnbm9yZScsXG4gICdlc2xpbnQtY29uZmlnLXByZXR0aWVyJyxcbiAgJ2VzbGludC1pbXBvcnQtcmVzb2x2ZXItbm9kZScsXG4gICdlc2xpbnQtaW1wb3J0LXJlc29sdmVyLXR5cGVzY3JpcHQnLFxuICAnZXNsaW50LXBsdWdpbi1pbXBvcnQnLFxuICAnZXNsaW50LXBsdWdpbi1pbXBvcnQteCcsXG4gICdlc2xpbnQtcGx1Z2luLXBlcmZlY3Rpb25pc3QnLFxuICAnZXNsaW50LXBsdWdpbi1wcmV0dGllcicsXG4gICdlc2xpbnQtcGx1Z2luLXJlYWN0LWNvbXBpbGVyJyxcbiAgJ2VzbGludC1wbHVnaW4tc29ydC1jbGFzcy1tZW1iZXJzJyxcbiAgJ2VzbGludC1wbHVnaW4tc29ydC1kZXN0cnVjdHVyZS1rZXlzJyxcbiAgJ2VzbGludC1wbHVnaW4tc3Rvcnlib29rJyxcbiAgJ2VzbGludC1wbHVnaW4tdW5pY29ybicsXG4gICdlc2xpbnQtcGx1Z2luLXVudXNlZC1pbXBvcnRzJyxcbiAgJ2dsb2JhbHMnLFxuICAnbWljcm9tYXRjaCcsXG4gICd0eXBlc2NyaXB0LWVzbGludCcsXG5dO1xuY29uc3QgbWljcm9tYXRjaFBhY2thZ2VOYW1lcyA9IG5ldyBTZXQoWydtaWNyb21hdGNoJywgJ0B0eXBlcy9taWNyb21hdGNoJ10pO1xuY29uc3QgbWljcm9tYXRjaEltcG9ydFBhdHRlcm4gPVxuICAvXFxiZnJvbVxccytbJ1wiXW1pY3JvbWF0Y2hbJ1wiXXxcXGJyZXF1aXJlXFwoXFxzKlsnXCJdbWljcm9tYXRjaFsnXCJdXFxzKlxcKXxcXGJpbXBvcnRcXChcXHMqWydcIl1taWNyb21hdGNoWydcIl1cXHMqXFwpL3U7XG5cbmNvbnN0IGxhdGVzdERlcGVuZGVuY3lWZXJzaW9uQ2FjaGUgPSBuZXcgTWFwPHN0cmluZywgc3RyaW5nPigpO1xuXG50eXBlIFdyaXRhYmxlUGFja2FnZUpzb24gPSBTZXRSZXF1aXJlZDxcbiAgUGFja2FnZUpzb24sXG4gICdzY3JpcHRzJyB8ICdkZXBlbmRlbmNpZXMnIHwgJ2RldkRlcGVuZGVuY2llcycgfCAncGVlckRlcGVuZGVuY2llcydcbj47XG5cbmludGVyZmFjZSBEZXBlbmRlbmN5VXBkYXRlcyB7XG4gIGRlcGVuZGVuY2llczogc3RyaW5nW107XG4gIGRldkRlcGVuZGVuY2llczogc3RyaW5nW107XG4gIHB5dGhvbkRldkRlcGVuZGVuY2llczogc3RyaW5nW107XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZW5lcmF0ZVBhY2thZ2VKc29uKFxuICBjb25maWc6IFBhY2thZ2VDb25maWcsXG4gIHJvb3RDb25maWc6IFBhY2thZ2VDb25maWcsXG4gIHNraXBBZGRpbmdEZXBzOiBib29sZWFuXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdnZW5lcmF0ZVBhY2thZ2VKc29uJywgYXN5bmMgKCkgPT4ge1xuICAgIGF3YWl0IGNvcmUoY29uZmlnLCByb290Q29uZmlnLCBza2lwQWRkaW5nRGVwcyk7XG4gIH0pO1xufVxuXG5hc3luYyBmdW5jdGlvbiBjb3JlKGNvbmZpZzogUGFja2FnZUNvbmZpZywgcm9vdENvbmZpZzogUGFja2FnZUNvbmZpZywgc2tpcEFkZGluZ0RlcHM6IGJvb2xlYW4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgZmlsZVBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICdwYWNrYWdlLmpzb24nKTtcbiAgY29uc3QganNvbk9iaiA9IGF3YWl0IHJlYWRQYWNrYWdlSnNvbihmaWxlUGF0aCk7XG4gIGNvbnN0IHBhY2thZ2VNYW5hZ2VyID0gY29uZmlnLmlzQnVuID8gJ2J1bicgOiAneWFybic7XG5cbiAgYXdhaXQgcmVtb3ZlRGVwcmVjYXRlZFN0dWZmKGNvbmZpZywganNvbk9iaik7XG4gIGF3YWl0IHVwZGF0ZVNjcmlwdHMoY29uZmlnLCBqc29uT2JqLCBwYWNrYWdlTWFuYWdlcik7XG4gIG1vdmVNYW5hZ2VkVG9vbERlcGVuZGVuY2llc1RvRGV2RGVwZW5kZW5jaWVzKGpzb25PYmopO1xuICBjb25zdCBkZXBlbmRlbmN5VXBkYXRlcyA9IGFwcGx5UGFja2FnZUpzb25Db252ZW50aW9ucyhjb25maWcsIHJvb3RDb25maWcsIGpzb25PYmopO1xuICBhd2FpdCBub3JtYWxpemVQYWNrYWdlTWV0YWRhdGEoY29uZmlnLCByb290Q29uZmlnLCBqc29uT2JqLCBkZXBlbmRlbmN5VXBkYXRlcyk7XG4gIGFkZERlcGVuZGVuY3lWZXJzaW9uc1RvUGFja2FnZUpzb24oanNvbk9iaiwgZGVwZW5kZW5jeVVwZGF0ZXMpO1xuICBhd2FpdCB1cGRhdGVQcml2YXRlUGFja2FnZXMoanNvbk9iaik7XG4gIHJlbW92ZUVtcHR5RGVwZW5kZW5jeVNlY3Rpb25zKGpzb25PYmopO1xuXG4gIGlmIChjb25maWcuaXNCdW4pIGRlbGV0ZSBqc29uT2JqLnBhY2thZ2VNYW5hZ2VyO1xuICAvLyBZYXJuIHJlYWRzIHBhY2thZ2UuanNvbiBmcm9tIGRpc2sgYmVmb3JlIGRlY2lkaW5nIHdoZXRoZXIgYHlhcm4gYWRkIC1EYFxuICAvLyBjb25mbGljdHMgd2l0aCBhbiBleGlzdGluZyByZWd1bGFyIGRlcGVuZGVuY3ksIHNvIHRoaXMgd3JpdGUgbXVzdCBmaW5pc2hcbiAgLy8gYmVmb3JlIGluc3RhbGxpbmcgdGhlIG1hbmFnZWQgZGVwZW5kZW5jeSB1cGRhdGVzIGJlbG93LlxuICBhd2FpdCBmc1V0aWwuZ2VuZXJhdGVGaWxlKGZpbGVQYXRoLCBKU09OLnN0cmluZ2lmeShzb3J0UGFja2FnZUpzb24oanNvbk9iaiksIHVuZGVmaW5lZCwgMikpO1xuXG4gIGlmICghc2tpcEFkZGluZ0RlcHMpIHtcbiAgICBpbnN0YWxsRGVwZW5kZW5jeVVwZGF0ZXMoY29uZmlnLCBqc29uT2JqLCBkZXBlbmRlbmN5VXBkYXRlcywgcGFja2FnZU1hbmFnZXIpO1xuICAgIGF3YWl0IGZzVXRpbC5nZW5lcmF0ZUZpbGUoZmlsZVBhdGgsIHNvcnRQYWNrYWdlSnNvbihhd2FpdCBmcy5wcm9taXNlcy5yZWFkRmlsZShmaWxlUGF0aCwgJ3V0ZjgnKSkpO1xuICB9XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHJlYWRQYWNrYWdlSnNvbihmaWxlUGF0aDogc3RyaW5nKTogUHJvbWlzZTxXcml0YWJsZVBhY2thZ2VKc29uPiB7XG4gIGNvbnN0IGpzb25UZXh0ID0gYXdhaXQgZnMucHJvbWlzZXMucmVhZEZpbGUoZmlsZVBhdGgsICd1dGY4Jyk7XG4gIGNvbnN0IGpzb25PYmogPSBKU09OLnBhcnNlKGpzb25UZXh0KSBhcyBQYWNrYWdlSnNvbjtcbiAganNvbk9iai5zY3JpcHRzID0ganNvbk9iai5zY3JpcHRzID8/IHt9O1xuICBqc29uT2JqLmRlcGVuZGVuY2llcyA9IGpzb25PYmouZGVwZW5kZW5jaWVzID8/IHt9O1xuICBqc29uT2JqLmRldkRlcGVuZGVuY2llcyA9IGpzb25PYmouZGV2RGVwZW5kZW5jaWVzID8/IHt9O1xuICBqc29uT2JqLnBlZXJEZXBlbmRlbmNpZXMgPSBqc29uT2JqLnBlZXJEZXBlbmRlbmNpZXMgPz8ge307XG4gIHJldHVybiBqc29uT2JqIGFzIFdyaXRhYmxlUGFja2FnZUpzb247XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHVwZGF0ZVNjcmlwdHMoXG4gIGNvbmZpZzogUGFja2FnZUNvbmZpZyxcbiAganNvbk9iajogV3JpdGFibGVQYWNrYWdlSnNvbixcbiAgcGFja2FnZU1hbmFnZXI6ICdidW4nIHwgJ3lhcm4nXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmVtb3ZlTGVnYWN5SW5zdGFsbENvbW1hbmRzKGpzb25PYmouc2NyaXB0cyk7XG5cbiAganNvbk9iai5zY3JpcHRzID0geyAuLi5qc29uT2JqLnNjcmlwdHMsIC4uLmdlbmVyYXRlU2NyaXB0cyhjb25maWcsIGpzb25PYmouc2NyaXB0cykgfTtcbiAgYWRkU3RhcnRUZXN0U2VydmVyU2NyaXB0SWZOZWVkZWQoY29uZmlnLCBqc29uT2JqKTtcbiAgYWRkSW5zdGFsbFN0ZXBUb0NoZWNrRm9yQWkoanNvbk9iai5zY3JpcHRzLCBwYWNrYWdlTWFuYWdlcik7XG5cbiAgY29uc3Qgc2NyaXB0cyA9IGpzb25PYmouc2NyaXB0cztcbiAgaWYgKGNvbmZpZy5pc0J1biB8fCAhZG9lc0NvbnRhaW5KYXZhKGNvbmZpZykpIHtcbiAgICBkZWxldGUgc2NyaXB0cy5wcmV0dGlmeTtcbiAgfSBlbHNlIHtcbiAgICBzY3JpcHRzLnByZXR0aWZ5ID0gKHNjcmlwdHMucHJldHRpZnkgPz8gJycpICsgKGF3YWl0IGdlbmVyYXRlUHJldHRpZXJTdWZmaXgoY29uZmlnLmRpclBhdGgpKTtcbiAgfVxuICBub3JtYWxpemVZYXJuV29ya3NwYWNlRm9yZWFjaFNjcmlwdHMoc2NyaXB0cyk7XG59XG5cbmZ1bmN0aW9uIHJlbW92ZUxlZ2FjeUluc3RhbGxDb21tYW5kcyhzY3JpcHRzOiBQYWNrYWdlSnNvbi5TY3JpcHRzKTogdm9pZCB7XG4gIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKHNjcmlwdHMpKSB7XG4gICAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gJ3N0cmluZycpIGNvbnRpbnVlO1xuICAgIC8vIEZyZXNoIHJlcG9zIHN0aWxsIHJlcXVpcmUgc3RhbmRhbG9uZSBgeWFybiBpbnN0YWxsYDsgb25seSByZW1vdmUgbGVnYWN5IGluc3RhbGwgcHJlZml4ZXMgYmVmb3JlIGFub3RoZXIgY29tbWFuZC5cbiAgICBpZiAoIXZhbHVlLmluY2x1ZGVzKCdnaXQgY2xvbmUnKSkge1xuICAgICAgc2NyaXB0c1trZXldID0gdmFsdWUucmVwbGFjZUFsbCgveWFyblxccyooPzppbnN0YWxsXFxzKik/JiZcXHMqL2d1LCAnJyk7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGFkZEluc3RhbGxTdGVwVG9DaGVja0ZvckFpKHNjcmlwdHM6IFBhY2thZ2VKc29uLlNjcmlwdHMsIHBhY2thZ2VNYW5hZ2VyOiAnYnVuJyB8ICd5YXJuJyk6IHZvaWQge1xuICBpZiAoISgnY2hlY2stZm9yLWFpJyBpbiBzY3JpcHRzKSkgcmV0dXJuO1xuXG4gIGlmICgnZ2VuLWNvZGUnIGluIHNjcmlwdHMpIHtcbiAgICBzY3JpcHRzWydjaGVjay1mb3ItYWknXSA9IGAke3BhY2thZ2VNYW5hZ2VyfSBnZW4tY29kZSA+IC9kZXYvbnVsbCAmJiAke3NjcmlwdHNbJ2NoZWNrLWZvci1haSddfWA7XG4gIH1cbiAgc2NyaXB0c1snY2hlY2stZm9yLWFpJ10gPSBgJHtwYWNrYWdlTWFuYWdlcn0gaW5zdGFsbCA+IC9kZXYvbnVsbCAmJiAke3NjcmlwdHNbJ2NoZWNrLWZvci1haSddfWA7XG59XG5cbmZ1bmN0aW9uIG5vcm1hbGl6ZVlhcm5Xb3Jrc3BhY2VGb3JlYWNoU2NyaXB0cyhzY3JpcHRzOiBQYWNrYWdlSnNvbi5TY3JpcHRzKTogdm9pZCB7XG4gIC8vIERlYWwgd2l0aCBicmVha2luZyBjaGFuZ2VzIGluIHlhcm4gYmVycnkgNC4wLjAtcmMuNDlcbiAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMoc2NyaXB0cykpIHtcbiAgICBpZiAoIXZhbHVlPy5pbmNsdWRlcygneWFybiB3b3Jrc3BhY2VzIGZvcmVhY2gnKSkgY29udGludWU7XG4gICAgc2NyaXB0c1trZXldID0gdmFsdWUucmVwbGFjZUFsbChcbiAgICAgIC95YXJuIHdvcmtzcGFjZXMgZm9yZWFjaCg/IVxccysoPzotQXwtUnwtLSg/OmFsbHxyZWN1cnNpdmV8c2luY2V8d29ya3RyZWV8ZnJvbXxpbmNsdWRlfGV4Y2x1ZGV8cHVibGljfHByaXZhdGUpKSkvZ3UsXG4gICAgICAneWFybiB3b3Jrc3BhY2VzIGZvcmVhY2ggLS1hbGwnXG4gICAgKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBhcHBseVBhY2thZ2VKc29uQ29udmVudGlvbnMoXG4gIGNvbmZpZzogUGFja2FnZUNvbmZpZyxcbiAgcm9vdENvbmZpZzogUGFja2FnZUNvbmZpZyxcbiAganNvbk9iajogV3JpdGFibGVQYWNrYWdlSnNvblxuKTogRGVwZW5kZW5jeVVwZGF0ZXMge1xuICBjb25zdCBkZXBlbmRlbmNpZXM6IHN0cmluZ1tdID0gW107XG4gIGNvbnN0IGRldkRlcGVuZGVuY2llcyA9IFsnc29ydC1wYWNrYWdlLWpzb24nXTtcbiAgY29uc3QgcHl0aG9uRGV2RGVwZW5kZW5jaWVzOiBzdHJpbmdbXSA9IFtdO1xuICBjb25zdCBoYXNKYXZhID0gZG9lc0NvbnRhaW5KYXZhKGNvbmZpZyk7XG5cbiAgaWYgKFxuICAgIGhhc0phdmEgJiZcbiAgICAhZnMuZXhpc3RzU3luYyhwYXRoLmpvaW4ocm9vdENvbmZpZy5kaXJQYXRoLCAnLnByZXR0aWVycmMuanNvbicpKSAmJlxuICAgICFmcy5leGlzdHNTeW5jKHBhdGguam9pbihjb25maWcuZGlyUGF0aCwgJy5wcmV0dGllcnJjLmpzb24nKSlcbiAgKSB7XG4gICAganNvbk9iai5wcmV0dGllciA9ICdAd2lsbGJvb3N0ZXIvcHJldHRpZXItY29uZmlnJztcbiAgICBkZXZEZXBlbmRlbmNpZXMucHVzaCgncHJldHRpZXItcGx1Z2luLWphdmEnLCAnQHdpbGxib29zdGVyL3ByZXR0aWVyLWNvbmZpZycpO1xuICB9XG4gIGlmIChoYXNKYXZhKSB7XG4gICAgZGV2RGVwZW5kZW5jaWVzLnB1c2goJ3ByZXR0aWVyJyk7XG4gIH0gZWxzZSB7XG4gICAgcmVtb3ZlUHJldHRpZXJBcnRpZmFjdHMoanNvbk9iaik7XG4gIH1cblxuICBkZWxldGUganNvbk9iai5kZXZEZXBlbmRlbmNpZXNbJ2xpbnQtc3RhZ2VkJ107XG4gIGRlbGV0ZSAoanNvbk9iaiBhcyBQYWNrYWdlSnNvbiAmIHsgJ2xpbnQtc3RhZ2VkJz86IHVua25vd24gfSlbJ2xpbnQtc3RhZ2VkJ107XG5cbiAgaWYgKGNvbmZpZy5pc1Jvb3QpIHtcbiAgICBkZWxldGUganNvbk9iai5kZXZEZXBlbmRlbmNpZXMuaHVza3k7XG4gICAgZGVsZXRlIGpzb25PYmouc2NyaXB0cy5wb3N0aW5zdGFsbDtcbiAgICBkZWxldGUganNvbk9iai5zY3JpcHRzLnBvc3RwdWJsaXNoO1xuICAgIGRlbGV0ZSBqc29uT2JqLnNjcmlwdHMucHJlcHVibGlzaE9ubHk7XG4gICAgZGVsZXRlIGpzb25PYmouc2NyaXB0cy5wcmVwYWNrO1xuICAgIGRlbGV0ZSBqc29uT2JqLnNjcmlwdHMucG9zdHBhY2s7XG4gICAganNvbk9iai5zY3JpcHRzLnByZXBhcmUgPSAnbGVmdGhvb2sgaW5zdGFsbCB8fCB0cnVlJztcbiAgICBkZXZEZXBlbmRlbmNpZXMucHVzaCgnbGVmdGhvb2snKTtcblxuICAgIGlmIChjb25maWcuZGVwZW5kaW5nLnNlbWFudGljUmVsZWFzZSkge1xuICAgICAgaWYgKFxuICAgICAgICAhanNvbk9iai5kZXZEZXBlbmRlbmNpZXNbJ3NlbWFudGljLXJlbGVhc2UnXSAmJlxuICAgICAgICAhanNvbk9iai5kZXZEZXBlbmRlbmNpZXNbJ211bHRpLXNlbWFudGljLXJlbGVhc2UnXSAmJlxuICAgICAgICAhanNvbk9iai5kZXZEZXBlbmRlbmNpZXNbJ0BxaXdpL211bHRpLXNlbWFudGljLXJlbGVhc2UnXVxuICAgICAgKSB7XG4gICAgICAgIGRldkRlcGVuZGVuY2llcy5wdXNoKCdzZW1hbnRpYy1yZWxlYXNlJyk7XG4gICAgICB9XG4gICAgICBqc29uT2JqLnZlcnNpb24gPSAnMC4wLjAtc2VtYW50aWNhbGx5LXJlbGVhc2VkJztcbiAgICB9XG5cbiAgICBpZiAoY29uZmlnLmRlcGVuZGluZy5wbGF5d3JpZ2h0VGVzdCkge1xuICAgICAgLy8gU2luY2UgYXJ0aWxsZXJ5IHJlcXVpcmVzIGEgc3BlY2lmaWMgdmVyc2lvbiBvZiBAcGxheXdyaWdodC90ZXN0XG4gICAgICBjb25zdCBoYXNBcnRpbGxlcnkgPSBqc29uT2JqLmRlcGVuZGVuY2llcy5hcnRpbGxlcnkgfHwganNvbk9iai5kZXZEZXBlbmRlbmNpZXMuYXJ0aWxsZXJ5O1xuICAgICAgLy8gU2luY2UgbGxtLXRvb2xib3ggcmVxdWlyZXMgQHBsYXl3cmlnaHQvdGVzdCBpbiBkZXBlbmRlbmNpZXNcbiAgICAgIGlmICghaGFzQXJ0aWxsZXJ5ICYmICFqc29uT2JqLmRlcGVuZGVuY2llc1snQHBsYXl3cmlnaHQvdGVzdCddKSB7XG4gICAgICAgIGRldkRlcGVuZGVuY2llcy5wdXNoKCdAcGxheXdyaWdodC90ZXN0Jyk7XG4gICAgICB9XG4gICAgICBkZWxldGUganNvbk9iai5kZXBlbmRlbmNpZXMucGxheXdyaWdodDtcbiAgICAgIGRlbGV0ZSBqc29uT2JqLmRldkRlcGVuZGVuY2llcy5wbGF5d3JpZ2h0O1xuICAgIH1cblxuICAgIGlmIChjb25maWcuZG9lc0NvbnRhaW5TdWJQYWNrYWdlSnNvbnMpIHtcbiAgICAgIC8vIFdlIGRvbid0IGFsbG93IG5vbi1hcnJheSB3b3Jrc3BhY2VzIGluIG1vbm9yZXBvLlxuICAgICAganNvbk9iai53b3Jrc3BhY2VzID0gQXJyYXkuaXNBcnJheShqc29uT2JqLndvcmtzcGFjZXMpXG4gICAgICAgID8gbWVyZ2UuYWxsKFtqc29uT2JqLndvcmtzcGFjZXMsIFsncGFja2FnZXMvKiddXSwge1xuICAgICAgICAgICAgYXJyYXlNZXJnZTogY29tYmluZU1lcmdlLFxuICAgICAgICAgIH0pXG4gICAgICAgIDogWydwYWNrYWdlcy8qJ107XG4gICAgfSBlbHNlIGlmIChBcnJheS5pc0FycmF5KGpzb25PYmoud29ya3NwYWNlcykpIHtcbiAgICAgIGpzb25PYmoud29ya3NwYWNlcyA9IGpzb25PYmoud29ya3NwYWNlcy5maWx0ZXIoXG4gICAgICAgICh3b3Jrc3BhY2UpID0+XG4gICAgICAgICAgZmcuZ2xvYlN5bmMod29ya3NwYWNlLCB7XG4gICAgICAgICAgICBkb3Q6IHRydWUsXG4gICAgICAgICAgICBjd2Q6IGNvbmZpZy5kaXJQYXRoLFxuICAgICAgICAgICAgaWdub3JlOiBnbG9iSWdub3JlLFxuICAgICAgICAgIH0pLmxlbmd0aCA+IDBcbiAgICAgICk7XG4gICAgICBpZiAoanNvbk9iai53b3Jrc3BhY2VzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICBkZWxldGUganNvbk9iai53b3Jrc3BhY2VzO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGlmIChjb25maWcuZGVwZW5kaW5nLndiIHx8IGNvbmZpZy5pc0J1bikge1xuICAgIGRldkRlcGVuZGVuY2llcy5wdXNoKHdiRGVwZW5kZW5jeSk7XG4gICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMoanNvbk9iai5zY3JpcHRzKSkge1xuICAgICAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gJ3N0cmluZycpIGNvbnRpbnVlO1xuICAgICAganNvbk9iai5zY3JpcHRzW2tleV0gPSB2YWx1ZS5yZXBsYWNlQWxsKC93YlxccytkYi9ndSwgJ3diIHByaXNtYScpO1xuICAgIH1cbiAgfVxuXG4gIC8vIGJ1aWxkLXRzIG93bnMgVHlwZVNjcmlwdCBleGVjdXRpb24gYW5kIGRlY2xhcmF0aW9uIGVtaXQuIHdiZnkgbXVzdCBhbHdheXNcbiAgLy8ga2VlcCBleGlzdGluZyBidWlsZC10cyB1c2VycyBjdXJyZW50IGJlY2F1c2Ugb2xkZXIgcmVsZWFzZXMgY2FuIGVtaXQgLmQudHNcbiAgLy8gZmlsZXMgYXQgcGF0aHMgdGhhdCBubyBsb25nZXIgbWF0Y2ggcGFja2FnZSBleHBvcnRzLlxuICBpZiAoXG4gICAganNvbk9iai5kZXBlbmRlbmNpZXNbYnVpbGRUc0RlcGVuZGVuY3ldIHx8XG4gICAganNvbk9iai5kZXZEZXBlbmRlbmNpZXNbYnVpbGRUc0RlcGVuZGVuY3ldIHx8XG4gICAgT2JqZWN0LnZhbHVlcyhqc29uT2JqLnNjcmlwdHMpLnNvbWUoKHNjcmlwdCkgPT4gc2NyaXB0Py5pbmNsdWRlcyhidWlsZFRzRGVwZW5kZW5jeSkpXG4gICkge1xuICAgIGRldkRlcGVuZGVuY2llcy5wdXNoKGJ1aWxkVHNEZXBlbmRlbmN5KTtcbiAgfVxuICBpZiAoZG9lc0NvbnRhaW5Kc09yVHMoY29uZmlnKSkge1xuICAgIGRldkRlcGVuZGVuY2llcy5wdXNoKC4uLm94bGludERlcHMpO1xuICB9XG5cbiAgaWYgKGRvZXNDb250YWluSnNPclRzKGNvbmZpZykpIHtcbiAgICBkZXZEZXBlbmRlbmNpZXMucHVzaCguLi5nZXRUc2NvbmZpZ0Jhc2VEZXBlbmRlbmNpZXMoY29uZmlnKSk7XG4gIH1cblxuICBpZiAoY29uZmlnLmRvZXNDb250YWluVHlwZVNjcmlwdCB8fCBjb25maWcuZG9lc0NvbnRhaW5UeXBlU2NyaXB0SW5QYWNrYWdlcykge1xuICAgIGRldkRlcGVuZGVuY2llcy5wdXNoKHR5cGVzY3JpcHRHb0RlcGVuZGVuY3kpO1xuICAgIGlmIChjb25maWcuaXNCdW4pIHtcbiAgICAgIGRldkRlcGVuZGVuY2llcy5wdXNoKCdAdHlwZXMvYnVuJyk7XG4gICAgfSBlbHNlIGlmICghY29uZmlnLmRlcGVuZGluZy5yZWFjdE5hdGl2ZSkge1xuICAgICAgZGV2RGVwZW5kZW5jaWVzLnB1c2goJ0B0eXBlcy9ub2RlJyk7XG4gICAgfVxuICAgIGlmIChcbiAgICAgIGpzb25PYmouZGVwZW5kZW5jaWVzLmplc3QgfHxcbiAgICAgIGpzb25PYmouZGV2RGVwZW5kZW5jaWVzLmplc3QgfHxcbiAgICAgIGpzb25PYmouZGVwZW5kZW5jaWVzWydAamVzdC9nbG9iYWxzJ10gfHxcbiAgICAgIGpzb25PYmouZGV2RGVwZW5kZW5jaWVzWydAamVzdC9nbG9iYWxzJ10gfHxcbiAgICAgIGpzb25PYmouZGVwZW5kZW5jaWVzWyd0cy1qZXN0J10gfHxcbiAgICAgIGpzb25PYmouZGV2RGVwZW5kZW5jaWVzWyd0cy1qZXN0J11cbiAgICApIHtcbiAgICAgIGRldkRlcGVuZGVuY2llcy5wdXNoKCdAdHlwZXMvamVzdCcpO1xuICAgIH1cbiAgfVxuXG4gIGlmIChjb25maWcuaXNXaWxsQm9vc3RlckNvbmZpZ3MpIHtcbiAgICByZXR1cm4ge1xuICAgICAgZGVwZW5kZW5jaWVzOiBkZXBlbmRlbmNpZXMuZmlsdGVyKChkZXApID0+ICFkZXAuaW5jbHVkZXMoJ0B3aWxsYm9vc3Rlci8nKSksXG4gICAgICBkZXZEZXBlbmRlbmNpZXM6IGRldkRlcGVuZGVuY2llcy5maWx0ZXIoKGRlcCkgPT4gIWRlcC5pbmNsdWRlcygnQHdpbGxib29zdGVyLycpKSxcbiAgICAgIHB5dGhvbkRldkRlcGVuZGVuY2llcyxcbiAgICB9O1xuICB9XG5cbiAgcmV0dXJuIHsgZGVwZW5kZW5jaWVzLCBkZXZEZXBlbmRlbmNpZXMsIHB5dGhvbkRldkRlcGVuZGVuY2llcyB9O1xufVxuXG5mdW5jdGlvbiBtb3ZlTWFuYWdlZFRvb2xEZXBlbmRlbmNpZXNUb0RldkRlcGVuZGVuY2llcyhqc29uT2JqOiBXcml0YWJsZVBhY2thZ2VKc29uKTogdm9pZCB7XG4gIGZvciAoY29uc3QgZGVwZW5kZW5jeSBvZiBbd2JEZXBlbmRlbmN5LCBidWlsZFRzRGVwZW5kZW5jeV0pIHtcbiAgICBpZiAoIWpzb25PYmouZGVwZW5kZW5jaWVzW2RlcGVuZGVuY3ldKSBjb250aW51ZTtcbiAgICBqc29uT2JqLmRldkRlcGVuZGVuY2llc1tkZXBlbmRlbmN5XSA/Pz0ganNvbk9iai5kZXBlbmRlbmNpZXNbZGVwZW5kZW5jeV07XG4gICAgZGVsZXRlIGpzb25PYmouZGVwZW5kZW5jaWVzW2RlcGVuZGVuY3ldO1xuICB9XG59XG5cbmFzeW5jIGZ1bmN0aW9uIG5vcm1hbGl6ZVBhY2thZ2VNZXRhZGF0YShcbiAgY29uZmlnOiBQYWNrYWdlQ29uZmlnLFxuICByb290Q29uZmlnOiBQYWNrYWdlQ29uZmlnLFxuICBqc29uT2JqOiBXcml0YWJsZVBhY2thZ2VKc29uLFxuICBkZXBlbmRlbmN5VXBkYXRlczogRGVwZW5kZW5jeVVwZGF0ZXNcbik6IFByb21pc2U8dm9pZD4ge1xuICBpZiAoIWpzb25PYmoubmFtZSkge1xuICAgIGpzb25PYmoubmFtZSA9IHBhdGguYmFzZW5hbWUoY29uZmlnLmRpclBhdGgpO1xuICB9XG5cbiAgaWYgKGNvbmZpZy5kb2VzQ29udGFpblN1YlBhY2thZ2VKc29ucykge1xuICAgIGpzb25PYmoucHJpdmF0ZSA9IHRydWU7XG4gIH1cbiAgaWYgKCFqc29uT2JqLmxpY2Vuc2UpIHtcbiAgICBqc29uT2JqLmxpY2Vuc2UgPSAnVU5MSUNFTlNFRCc7XG4gIH1cbiAgaWYgKCFqc29uT2JqLnByaXZhdGUgJiYganNvbk9iai5saWNlbnNlICE9PSAnVU5MSUNFTlNFRCcgJiYgcm9vdENvbmZpZy5pc1B1YmxpY1JlcG8pIHtcbiAgICBqc29uT2JqLnB1Ymxpc2hDb25maWcgPz89IHt9O1xuICAgIGpzb25PYmoucHVibGlzaENvbmZpZy5hY2Nlc3MgPz89ICdwdWJsaWMnO1xuICB9XG4gIGNvbnN0IFtvd25lcl0gPSBnaXRIdWJVdGlsLmdldE9yZ0FuZE5hbWUoY29uZmlnLnJlcG9zaXRvcnkgPz8gJycpO1xuICBpZiAob3duZXIgPT09ICdXaWxsQm9vc3RlcicgfHwgb3duZXIgPT09ICdXaWxsQm9vc3RlckxhYicpIHtcbiAgICBqc29uT2JqLmF1dGhvciA9ICdXaWxsQm9vc3RlciBJbmMuJztcbiAgfVxuICBhd2FpdCBub3JtYWxpemVQdWJsaXNoZWRDb25maWdQYWNrYWdlTWV0YWRhdGEoY29uZmlnLCBqc29uT2JqKTtcbiAgaWYgKCFjb25maWcuaXNSb290ICYmIGpzb25PYmoucHJpdmF0ZSAmJiAhanNvbk9iai5tYWluKSB7XG4gICAgLy8gTWFrZSBWU0NvZGUgcG9zc2libGUgdG8gcmVmYWN0b3IgY29kZSBhY3Jvc3Mgc3VicGFja2FnZXMuXG4gICAganNvbk9iai5tYWluID0gJy4vc3JjJztcbiAgfVxuXG4gIC8vIFlhcm4gdHJlYXRzIHRoZSBsZWdhY3kgbnBtL2NoYWxrIHJlc29sdXRpb24gYWxpYXMgYXMgYW4gaW52YWxpZCBwYWNrYWdlIHRva2VuLlxuICBkZWxldGUganNvbk9iai5yZXNvbHV0aW9ucz8uWyducG0vY2hhbGsnXTtcblxuICBpZiAoIWNvbmZpZy5kb2VzQ29udGFpblN1YlBhY2thZ2VKc29ucykge1xuICAgIGlmICghY29uZmlnLmlzQnVuKSB7XG4gICAgICBpZiAoIWNvbmZpZy5kb2VzQ29udGFpbkphdmFTY3JpcHQgJiYgIWNvbmZpZy5kb2VzQ29udGFpblR5cGVTY3JpcHQpIHtcbiAgICAgICAgZGVsZXRlIGpzb25PYmouc2NyaXB0cy5saW50O1xuICAgICAgICBkZWxldGUganNvbk9iai5zY3JpcHRzWydsaW50LWZpeCddO1xuICAgICAgICBmb3IgKGNvbnN0IHNjcmlwdE5hbWUgb2YgWydjbGVhbnVwJywgJ2NoZWNrLWZvci1haSddKSB7XG4gICAgICAgICAgY29uc3Qgc2NyaXB0ID0ganNvbk9iai5zY3JpcHRzW3NjcmlwdE5hbWVdO1xuICAgICAgICAgIGlmICghc2NyaXB0KSBjb250aW51ZTtcbiAgICAgICAgICBqc29uT2JqLnNjcmlwdHNbc2NyaXB0TmFtZV0gPSBzY3JpcHQucmVwbGFjZSgvID8mJiA/eWFybiBsaW50LWZpeCg/OiAtLXF1aWV0KT8vLCAnJyk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGpzb25PYmouc2NyaXB0c1snbGludC1maXgnXSA9IGpzb25PYmouc2NyaXB0c1snbGludC1maXgnXSA/PyAneWFybiBsaW50IC0tZml4JztcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoY29uZmlnLmRvZXNDb250YWluUHVic3BlY1lhbWwpIHtcbiAgICAgIGpzb25PYmouc2NyaXB0cy5saW50ID0gJ2ZsdXR0ZXIgYW5hbHl6ZSc7XG4gICAgICBqc29uT2JqLnNjcmlwdHNbJ2xpbnQtZml4J10gPSAneWFybiBsaW50JztcbiAgICAgIGNvbnN0IGRpcnMgPSBbJ2xpYicsICd0ZXN0JywgJ3Rlc3RfZHJpdmVyJ10uZmlsdGVyKChkaXIpID0+IGZzLmV4aXN0c1N5bmMocGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCBkaXIpKSk7XG4gICAgICBpZiAoZGlycy5sZW5ndGggPiAwKSB7XG4gICAgICAgIGpzb25PYmouc2NyaXB0c1snZm9ybWF0LWNvZGUnXSA9IGBkYXJ0IGZvcm1hdCAkKGZpbmQgJHtkaXJzLmpvaW4oXG4gICAgICAgICAgJyAnXG4gICAgICAgICl9IC1uYW1lIGdlbmVyYXRlZCAtcHJ1bmUgLW8gLW5hbWUgJyouZnJlZXplZC5kYXJ0JyAtcHJ1bmUgLW8gLW5hbWUgJyouZy5kYXJ0JyAtcHJ1bmUgLW8gLW5hbWUgJyouZGFydCcgLXByaW50KWA7XG4gICAgICAgIGpzb25PYmouc2NyaXB0cy5mb3JtYXQgPSAoanNvbk9iai5zY3JpcHRzLmZvcm1hdCA/PyAnJykgKyBgICYmIHlhcm4gZm9ybWF0LWNvZGVgO1xuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IHB5dGhvblBhY2thZ2VNYW5hZ2VyID0gZ2V0UHl0aG9uUGFja2FnZU1hbmFnZXIoY29uZmlnKTtcbiAgICBpZiAocHl0aG9uUGFja2FnZU1hbmFnZXIpIHtcbiAgICAgIGlmIChqc29uT2JqLnNjcmlwdHMucG9zdGluc3RhbGwgPT09ICdwb2V0cnkgaW5zdGFsbCcpIHtcbiAgICAgICAgZGVsZXRlIGpzb25PYmouc2NyaXB0cy5wb3N0aW5zdGFsbDtcbiAgICAgIH1cbiAgICAgIGpzb25PYmouc2NyaXB0c1snY29tbW9uL2NpLXNldHVwJ10gPSBgeWFybiBzZXR1cC0ke3B5dGhvblBhY2thZ2VNYW5hZ2VyfWA7XG4gICAgICBkZWxldGUganNvbk9iai5zY3JpcHRzW2BzZXR1cC0ke3B5dGhvblBhY2thZ2VNYW5hZ2VyID09PSAncG9ldHJ5JyA/ICd1dicgOiAncG9ldHJ5J31gXTtcbiAgICAgIGRlbGV0ZSBqc29uT2JqLnNjcmlwdHNbJ3NldHVwLXBvZXRyeS1hc2RmJ107XG4gICAgICBqc29uT2JqLnNjcmlwdHNbYHNldHVwLSR7cHl0aG9uUGFja2FnZU1hbmFnZXJ9YF0gPSBnZXRQeXRob25TZXR1cENvbW1hbmQocHl0aG9uUGFja2FnZU1hbmFnZXIpO1xuICAgICAgY29uc3QgcHl0aG9uRmlsZXMgPSBhd2FpdCBmZy5nbG9iKCcqKi8qLnB5Jywge1xuICAgICAgICBjd2Q6IGNvbmZpZy5kaXJQYXRoLFxuICAgICAgICBkb3Q6IHRydWUsXG4gICAgICAgIGlnbm9yZTogZ2xvYklnbm9yZSxcbiAgICAgIH0pO1xuICAgICAgY29uc3QgZGlyTmFtZVNldCA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICAgICAgZm9yIChjb25zdCBweXRob25GaWxlIG9mIHB5dGhvbkZpbGVzKSB7XG4gICAgICAgIGNvbnN0IFtmaXJzdCwgc2Vjb25kXSA9IHB5dGhvbkZpbGUuc3BsaXQoJy8nKTtcbiAgICAgICAgaWYgKGZpcnN0ICYmIHNlY29uZCkge1xuICAgICAgICAgIGRpck5hbWVTZXQuYWRkKGZpcnN0KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKGRpck5hbWVTZXQuc2l6ZSA+IDApIHtcbiAgICAgICAgY29uc3QgZGlyTmFtZXNTdHIgPSBbLi4uZGlyTmFtZVNldF0uam9pbignICcpO1xuICAgICAgICBjb25zdCBweXRob25SdW5uZXIgPSBgJHtweXRob25QYWNrYWdlTWFuYWdlcn0gcnVuYDtcbiAgICAgICAganNvbk9iai5zY3JpcHRzWydmb3JtYXQtY29kZSddID1cbiAgICAgICAgICBgJHtweXRob25SdW5uZXJ9IGlzb3J0IC0tcHJvZmlsZSBibGFjayAke2Rpck5hbWVzU3RyfSAmJiAke3B5dGhvblJ1bm5lcn0gYmxhY2sgJHtkaXJOYW1lc1N0cn1gO1xuICAgICAgICBpZiAoanNvbk9iai5zY3JpcHRzLmxpbnQpIHtcbiAgICAgICAgICBqc29uT2JqLnNjcmlwdHMubGludCA9IGAke3B5dGhvblJ1bm5lcn0gZmxha2U4ICR7ZGlyTmFtZXNTdHJ9ICYmICR7anNvbk9iai5zY3JpcHRzLmxpbnR9YDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBqc29uT2JqLnNjcmlwdHMubGludCA9IGAke3B5dGhvblJ1bm5lcn0gZmxha2U4ICR7ZGlyTmFtZXNTdHJ9YDtcbiAgICAgICAgICBqc29uT2JqLnNjcmlwdHNbJ2xpbnQtZml4J10gPSAneWFybiBsaW50JztcbiAgICAgICAgfVxuICAgICAgICBqc29uT2JqLnNjcmlwdHMuZm9ybWF0ID0gKGpzb25PYmouc2NyaXB0cy5mb3JtYXQgPz8gJycpICsgYCAmJiB5YXJuIGZvcm1hdC1jb2RlYDtcbiAgICAgICAgZGVwZW5kZW5jeVVwZGF0ZXMucHl0aG9uRGV2RGVwZW5kZW5jaWVzLnB1c2goJ2JsYWNrJywgJ2lzb3J0JywgJ2ZsYWtlOCcpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGlmIChjb25maWcucmVwb3NpdG9yeSB8fCBqc29uT2JqLnJlcG9zaXRvcnkpIHtcbiAgICBqc29uT2JqLnJlcG9zaXRvcnkgPSBmb3JtYXRSZXBvc2l0b3J5Rm9yUGFja2FnZUpzb24oY29uZmlnLnJlcG9zaXRvcnkgPz8ganNvbk9iai5yZXBvc2l0b3J5LCBqc29uT2JqLnJlcG9zaXRvcnkpO1xuICB9XG5cbiAgaWYgKGNvbmZpZy5kZXBlbmRpbmcuYmxpdHopIHtcbiAgICBpZiAoIWpzb25PYmouc2NyaXB0c1snZ2VuLWNvZGUnXT8uc3RhcnRzV2l0aCgnYmxpdHogY29kZWdlbicpKSB7XG4gICAgICBqc29uT2JqLnNjcmlwdHNbJ2dlbi1jb2RlJ10gPSAnYmxpdHogY29kZWdlbic7XG4gICAgfSBlbHNlIGlmICghanNvbk9iai5zY3JpcHRzWydnZW4tY29kZSddLmluY2x1ZGVzKCdibGl0eiBwcmlzbWEgZ2VuZXJhdGUnKSkge1xuICAgICAganNvbk9iai5zY3JpcHRzWydnZW4tY29kZSddID0ganNvbk9iai5zY3JpcHRzWydnZW4tY29kZSddLnJlcGxhY2UoXG4gICAgICAgICdibGl0eiBjb2RlZ2VuJyxcbiAgICAgICAgJ2JsaXR6IGNvZGVnZW4gJiYgYmxpdHogcHJpc21hIGdlbmVyYXRlJ1xuICAgICAgKTtcbiAgICB9XG4gIH0gZWxzZSBpZiAoY29uZmlnLmRlcGVuZGluZy5wcmlzbWEgJiYgIWpzb25PYmouc2NyaXB0c1snZ2VuLWNvZGUnXT8uc3RhcnRzV2l0aCgncHJpc21hIGdlbmVyYXRlJykpIHtcbiAgICBqc29uT2JqLnNjcmlwdHNbJ2dlbi1jb2RlJ10gPSAncHJpc21hIGdlbmVyYXRlJztcbiAgfVxuICBhZGRHZW5JMThuVHNQb3N0aW5zdGFsbFNjcmlwdChjb25maWcsIGpzb25PYmopO1xuXG4gIGlmICghanNvbk9iai5kZXBlbmRlbmNpZXMucHJldHRpZXIpIHtcbiAgICAvLyBCZWNhdXNlIEB0eXBlcy9wcmV0dGllciBibG9ja3MgcHJldHRpZXIgZXhlY3V0aW9uLlxuICAgIGRlbGV0ZSBqc29uT2JqLmRldkRlcGVuZGVuY2llc1snQHR5cGVzL3ByZXR0aWVyJ107XG4gIH1cbn1cblxuZnVuY3Rpb24gYWRkR2VuSTE4blRzUG9zdGluc3RhbGxTY3JpcHQoY29uZmlnOiBQYWNrYWdlQ29uZmlnLCBqc29uT2JqOiBXcml0YWJsZVBhY2thZ2VKc29uKTogdm9pZCB7XG4gIGNvbnN0IGNvbW1hbmQgPSBnZXRHZW5JMThuVHNDb21tYW5kKGNvbmZpZywganNvbk9iai5zY3JpcHRzKTtcbiAgaWYgKCFjb21tYW5kKSByZXR1cm47XG5cbiAgY29uc3QgcG9zdGluc3RhbGwgPSBqc29uT2JqLnNjcmlwdHMucG9zdGluc3RhbGw7XG4gIGlmICghcG9zdGluc3RhbGwpIHtcbiAgICBqc29uT2JqLnNjcmlwdHMucG9zdGluc3RhbGwgPSBjb21tYW5kO1xuICB9IGVsc2UgaWYgKCFwb3N0aW5zdGFsbC5pbmNsdWRlcyhjb21tYW5kKSkge1xuICAgIGpzb25PYmouc2NyaXB0cy5wb3N0aW5zdGFsbCA9IGAke3Bvc3RpbnN0YWxsfSAmJiAke2NvbW1hbmR9YDtcbiAgfVxufVxuXG5hc3luYyBmdW5jdGlvbiBub3JtYWxpemVQdWJsaXNoZWRDb25maWdQYWNrYWdlTWV0YWRhdGEoXG4gIGNvbmZpZzogUGFja2FnZUNvbmZpZyxcbiAganNvbk9iajogV3JpdGFibGVQYWNrYWdlSnNvblxuKTogUHJvbWlzZTx2b2lkPiB7XG4gIGlmICghaXNQdWJsaXNoZWRXaWxsYm9vc3RlckNvbmZpZ3NQYWNrYWdlKGNvbmZpZykpIHJldHVybjtcblxuICBjb25zdCBjb25maWdNanNQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnY29uZmlnLm1qcycpO1xuICBpZiAoIWZzLmV4aXN0c1N5bmMoY29uZmlnTWpzUGF0aCkpIHJldHVybjtcblxuICBqc29uT2JqLnR5cGUgPSAnbW9kdWxlJztcblxuICBjb25zdCBjb25maWdEdHNQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnY29uZmlnLmQudHMnKTtcbiAgaWYgKCFmcy5leGlzdHNTeW5jKGNvbmZpZ0R0c1BhdGgpKSByZXR1cm47XG5cbiAganNvbk9iai5maWxlcyA9IFsuLi5uZXcgU2V0KFsuLi4oanNvbk9iai5maWxlcyA/PyBbXSksICdjb25maWcuZC5tdHMnXSldO1xuICAvLyBOb2RlTmV4dCByZXNvbHZlcyBhIHJlbGF0aXZlIGAuL2NvbmZpZy5tanNgIGltcG9ydCB0byBgY29uZmlnLmQubXRzYCwgbm90XG4gIC8vIHRoZSBwYWNrYWdlLWxldmVsIGB0eXBlc2AgZmllbGQuIEtlZXAgdGhlIHB1Ymxpc2hlZCBjb25maWcgaW1wb3J0YWJsZSBmcm9tXG4gIC8vIHBhY2thZ2UtbG9jYWwgVHlwZVNjcmlwdCBsaW50ZXIgc2V0dGluZ3MuXG4gIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiBmc1V0aWwuZ2VuZXJhdGVGaWxlKHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJ2NvbmZpZy5kLm10cycpLCBjb25maWdEbXRzQ29udGVudCkpO1xufVxuXG5jb25zdCBjb25maWdEbXRzQ29udGVudCA9IGBleHBvcnQgeyBkZWZhdWx0IH0gZnJvbSAnLi9jb25maWcuanMnO1xuYDtcblxuZnVuY3Rpb24gYWRkRGVwZW5kZW5jeVZlcnNpb25zVG9QYWNrYWdlSnNvbihqc29uT2JqOiBXcml0YWJsZVBhY2thZ2VKc29uLCBkZXBlbmRlbmN5VXBkYXRlczogRGVwZW5kZW5jeVVwZGF0ZXMpOiB2b2lkIHtcbiAgY29uc3QgcGFja2FnZUpzb25EZXBlbmRlbmNpZXMgPSBqc29uT2JqLmRlcGVuZGVuY2llcztcbiAgY29uc3QgcGFja2FnZUpzb25EZXZEZXBlbmRlbmNpZXMgPSBqc29uT2JqLmRldkRlcGVuZGVuY2llcztcbiAgZGVwZW5kZW5jeVVwZGF0ZXMuZGVwZW5kZW5jaWVzID0gYWRkUGFja2FnZUpzb25EZXBlbmRlbmNpZXMocGFja2FnZUpzb25EZXBlbmRlbmNpZXMsIGRlcGVuZGVuY3lVcGRhdGVzLmRlcGVuZGVuY2llcyk7XG4gIGRlcGVuZGVuY3lVcGRhdGVzLmRldkRlcGVuZGVuY2llcyA9IGRlcGVuZGVuY3lVcGRhdGVzLmRldkRlcGVuZGVuY2llcy5maWx0ZXIoKGRlcCkgPT4gIXBhY2thZ2VKc29uRGVwZW5kZW5jaWVzW2RlcF0pO1xuICBkZXBlbmRlbmN5VXBkYXRlcy5kZXZEZXBlbmRlbmNpZXMgPSBhZGRQYWNrYWdlSnNvbkRlcGVuZGVuY2llcyhcbiAgICBwYWNrYWdlSnNvbkRldkRlcGVuZGVuY2llcyxcbiAgICBkZXBlbmRlbmN5VXBkYXRlcy5kZXZEZXBlbmRlbmNpZXNcbiAgKTtcbn1cblxuZnVuY3Rpb24gcmVtb3ZlRW1wdHlEZXBlbmRlbmN5U2VjdGlvbnMoanNvbk9iajogUGFja2FnZUpzb24pOiB2b2lkIHtcbiAgZm9yIChjb25zdCBrZXkgb2YgWydkZXBlbmRlbmNpZXMnLCAnZGV2RGVwZW5kZW5jaWVzJywgJ3BlZXJEZXBlbmRlbmNpZXMnXSBhcyBjb25zdCkge1xuICAgIGNvbnN0IHNlY3Rpb24gPSBqc29uT2JqW2tleV07XG4gICAgaWYgKHNlY3Rpb24gJiYgT2JqZWN0LmtleXMoc2VjdGlvbikubGVuZ3RoID09PSAwKSB7XG4gICAgICBSZWZsZWN0LmRlbGV0ZVByb3BlcnR5KGpzb25PYmosIGtleSk7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGluc3RhbGxEZXBlbmRlbmN5VXBkYXRlcyhcbiAgY29uZmlnOiBQYWNrYWdlQ29uZmlnLFxuICBqc29uT2JqOiBQYWNrYWdlSnNvbixcbiAgZGVwZW5kZW5jeVVwZGF0ZXM6IERlcGVuZGVuY3lVcGRhdGVzLFxuICBwYWNrYWdlTWFuYWdlcjogJ2J1bicgfCAneWFybidcbik6IHZvaWQge1xuICBjb25zdCBkZXBlbmRlbmNpZXMgPSBkZXBlbmRlbmN5VXBkYXRlcy5kZXBlbmRlbmNpZXMuZmlsdGVyKChkZXApID0+ICFqc29uT2JqLmRldkRlcGVuZGVuY2llcz8uW2RlcF0pO1xuICBpbnN0YWxsTnBtRGVwZW5kZW5jaWVzKGNvbmZpZywgcGFja2FnZU1hbmFnZXIsIGRlcGVuZGVuY2llcywgZmFsc2UpO1xuXG4gIGNvbnN0IGRldkRlcGVuZGVuY2llcyA9IGRlcGVuZGVuY3lVcGRhdGVzLmRldkRlcGVuZGVuY2llcy5maWx0ZXIoKGRlcCkgPT4gIWpzb25PYmouZGVwZW5kZW5jaWVzPy5bZGVwXSk7XG4gIGluc3RhbGxOcG1EZXBlbmRlbmNpZXMoY29uZmlnLCBwYWNrYWdlTWFuYWdlciwgZGV2RGVwZW5kZW5jaWVzLCB0cnVlKTtcblxuICBjb25zdCBweXRob25QYWNrYWdlTWFuYWdlciA9IGdldFB5dGhvblBhY2thZ2VNYW5hZ2VyKGNvbmZpZyk7XG4gIGlmIChweXRob25QYWNrYWdlTWFuYWdlciAmJiBkZXBlbmRlbmN5VXBkYXRlcy5weXRob25EZXZEZXBlbmRlbmNpZXMubGVuZ3RoID4gMCkge1xuICAgIGNvbnN0IGRlcGVuZGVuY2llcyA9IFsuLi5uZXcgU2V0KGRlcGVuZGVuY3lVcGRhdGVzLnB5dGhvbkRldkRlcGVuZGVuY2llcyldO1xuICAgIGlmIChweXRob25QYWNrYWdlTWFuYWdlciA9PT0gJ3BvZXRyeScpIHtcbiAgICAgIHNwYXduU3luYygncG9ldHJ5JywgWydhZGQnLCAnLS1ncm91cCcsICdkZXYnLCAuLi5kZXBlbmRlbmNpZXNdLCBjb25maWcuZGlyUGF0aCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHNwYXduU3luYygndXYnLCBbJ2FkZCcsICctLWRldicsIC4uLmRlcGVuZGVuY2llc10sIGNvbmZpZy5kaXJQYXRoKTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gZ2V0UHl0aG9uUGFja2FnZU1hbmFnZXIoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogJ3BvZXRyeScgfCAndXYnIHwgdW5kZWZpbmVkIHtcbiAgaWYgKGNvbmZpZy5kb2VzQ29udGFpblV2TG9jaykgcmV0dXJuICd1dic7XG4gIGlmIChjb25maWcuZG9lc0NvbnRhaW5Qb2V0cnlMb2NrKSByZXR1cm4gJ3BvZXRyeSc7XG59XG5cbmZ1bmN0aW9uIGdldFB5dGhvblNldHVwQ29tbWFuZChwYWNrYWdlTWFuYWdlcjogJ3BvZXRyeScgfCAndXYnKTogc3RyaW5nIHtcbiAgaWYgKHBhY2thZ2VNYW5hZ2VyID09PSAndXYnKSByZXR1cm4gJ3V2IHN5bmMgLS1mcm96ZW4nO1xuICByZXR1cm4gJ3BvZXRyeSBjb25maWcgdmlydHVhbGVudnMuaW4tcHJvamVjdCB0cnVlICYmIHBvZXRyeSBlbnYgdXNlICQobWlzZSBjdXJyZW50IHB5dGhvbikgJiYgcG9ldHJ5IHJ1biBwaXAgaW5zdGFsbCAtLXVwZ3JhZGUgcGlwICYmIHBvZXRyeSBpbnN0YWxsJztcbn1cblxuZnVuY3Rpb24gaW5zdGFsbE5wbURlcGVuZGVuY2llcyhcbiAgY29uZmlnOiBQYWNrYWdlQ29uZmlnLFxuICBwYWNrYWdlTWFuYWdlcjogJ2J1bicgfCAneWFybicsXG4gIGRlcGVuZGVuY2llczogc3RyaW5nW10sXG4gIGRldjogYm9vbGVhblxuKTogdm9pZCB7XG4gIGlmIChkZXBlbmRlbmNpZXMubGVuZ3RoID09PSAwKSByZXR1cm47XG5cbiAgY29uc3QgZGVwZW5kZW5jeVNwZWNpZmllcnMgPSBbLi4ubmV3IFNldChkZXBlbmRlbmNpZXMpXTtcbiAgaWYgKGNvbmZpZy5pc0J1bikge1xuICAgIHNwYXduU3luYyhwYWNrYWdlTWFuYWdlciwgWydhZGQnLCAuLi4oZGV2ID8gWyctRCddIDogW10pLCAnLS1leGFjdCcsIC4uLmRlcGVuZGVuY3lTcGVjaWZpZXJzXSwgY29uZmlnLmRpclBhdGgpO1xuICB9IGVsc2Uge1xuICAgIC8vIEludGVudGlvbmFsbHkgb21pdCB2ZXJzaW9ucyB0byB1cGRhdGUgZGVwZW5kZW5jaWVzIHRvIHRoZSBsYXRlc3QgdmVyc2lvbnMgd2l0aCBZYXJuLlxuICAgIHNwYXduU3luYyhwYWNrYWdlTWFuYWdlciwgWydhZGQnLCAuLi4oZGV2ID8gWyctRCddIDogW10pLCAuLi5kZXBlbmRlbmN5U3BlY2lmaWVyc10sIGNvbmZpZy5kaXJQYXRoKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBhZGRQYWNrYWdlSnNvbkRlcGVuZGVuY2llcyhcbiAgcGFja2FnZUpzb25EZXBlbmRlbmNpZXM6IFBhcnRpYWw8UmVjb3JkPHN0cmluZywgc3RyaW5nPj4sXG4gIGRlcGVuZGVuY2llczogc3RyaW5nW11cbik6IHN0cmluZ1tdIHtcbiAgY29uc3QgZGVwZW5kZW5jaWVzVG9JbnN0YWxsOiBzdHJpbmdbXSA9IFtdO1xuICBmb3IgKGNvbnN0IGRlcGVuZGVuY3kgb2YgbmV3IFNldChkZXBlbmRlbmNpZXMpKSB7XG4gICAgY29uc3Qgc2hvdWxkVXBkYXRlRXhpc3RpbmdEZXBlbmRlbmN5ID0gc2hvdWxkVXBkYXRlRXhpc3RpbmdNYW5hZ2VkRGVwZW5kZW5jeShcbiAgICAgIGRlcGVuZGVuY3ksXG4gICAgICBwYWNrYWdlSnNvbkRlcGVuZGVuY2llc1tkZXBlbmRlbmN5XVxuICAgICk7XG4gICAgaWYgKHNob3VsZFVwZGF0ZUV4aXN0aW5nRGVwZW5kZW5jeSkge1xuICAgICAgZGVwZW5kZW5jaWVzVG9JbnN0YWxsLnB1c2goZGVwZW5kZW5jeSk7XG4gICAgfVxuICAgIGlmIChcbiAgICAgIHBhY2thZ2VKc29uRGVwZW5kZW5jaWVzW2RlcGVuZGVuY3ldICYmXG4gICAgICAhc2hvdWxkVXBkYXRlRXhpc3RpbmdEZXBlbmRlbmN5ICYmXG4gICAgICBwYWNrYWdlSnNvbkRlcGVuZGVuY2llc1tkZXBlbmRlbmN5XSAhPT0gJyonXG4gICAgKVxuICAgICAgY29udGludWU7XG4gICAgcGFja2FnZUpzb25EZXBlbmRlbmNpZXNbZGVwZW5kZW5jeV0gPSBnZXRMYXRlc3REZXBlbmRlbmN5VmVyc2lvbihkZXBlbmRlbmN5KTtcbiAgfVxuICByZXR1cm4gZGVwZW5kZW5jaWVzVG9JbnN0YWxsO1xufVxuXG5mdW5jdGlvbiBnZXRMYXRlc3REZXBlbmRlbmN5VmVyc2lvbihkZXBlbmRlbmN5OiBzdHJpbmcpOiBzdHJpbmcge1xuICBjb25zdCBjYWNoZWRWZXJzaW9uID0gbGF0ZXN0RGVwZW5kZW5jeVZlcnNpb25DYWNoZS5nZXQoZGVwZW5kZW5jeSk7XG4gIGlmIChjYWNoZWRWZXJzaW9uKSByZXR1cm4gY2FjaGVkVmVyc2lvbjtcblxuICBjb25zdCB2ZXJzaW9uID1cbiAgICBzcGF3blN5bmNBbmRSZXR1cm5TdGRvdXQoJ25wbScsIFsnc2hvdycsIGRlcGVuZGVuY3ksICd2ZXJzaW9uJywgJy0td29ya3NwYWNlcz1mYWxzZSddLCBwcm9jZXNzLmN3ZCgpKSB8fCAnKic7XG4gIGxhdGVzdERlcGVuZGVuY3lWZXJzaW9uQ2FjaGUuc2V0KGRlcGVuZGVuY3ksIHZlcnNpb24pO1xuICByZXR1cm4gdmVyc2lvbjtcbn1cblxuLy8gVE9ETzogcmVtb3ZlIHRoZSBmb2xsb3dpbmcgbWlncmF0aW9uIGNvZGUgaW4gZnV0dXJlXG5hc3luYyBmdW5jdGlvbiByZW1vdmVEZXByZWNhdGVkU3R1ZmYoXG4gIGNvbmZpZzogUGFja2FnZUNvbmZpZyxcbiAganNvbk9iajogU2V0UmVxdWlyZWQ8UGFja2FnZUpzb24sICdzY3JpcHRzJyB8ICdkZXBlbmRlbmNpZXMnIHwgJ2RldkRlcGVuZGVuY2llcycgfCAncGVlckRlcGVuZGVuY2llcyc+XG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgaWYgKGpzb25PYmouYXV0aG9yID09PSAnV2lsbEJvb3N0ZXIgTExDJykge1xuICAgIGpzb25PYmouYXV0aG9yID0gJ1dpbGxCb29zdGVyIEluYy4nO1xuICB9XG4gIGRlbGV0ZSBqc29uT2JqLnNjcmlwdHNbJ3NvcnQtcGFja2FnZS1qc29uJ107XG4gIGRlbGV0ZSBqc29uT2JqLnNjcmlwdHNbJ3NvcnQtYWxsLXBhY2thZ2UtanNvbiddO1xuICBkZWxldGUganNvbk9iai5zY3JpcHRzWyd0eXBlY2hlY2svd2FybiddO1xuICBkZWxldGUganNvbk9iai5zY3JpcHRzWyd0eXBlY2hlY2s6Z2VuLWNvZGUnXTtcbiAgZGVsZXRlIGpzb25PYmouc2NyaXB0c1sndHlwZWNoZWNrOmNvZGVnZW4nXTtcbiAgZGVsZXRlIGpzb25PYmouZGVwZW5kZW5jaWVzLnRzbGliO1xuICBkZWxldGUganNvbk9iai5kZXZEZXBlbmRlbmNpZXNbJ0B3aWxsYm9vc3Rlci9yZW5vdmF0ZS1jb25maWcnXTtcbiAgZGVsZXRlIGpzb25PYmouZGV2RGVwZW5kZW5jaWVzWydAd2lsbGJvb3N0ZXIvdHNjb25maWcnXTtcbiAgZGVsZXRlIGpzb25PYmouZGV2RGVwZW5kZW5jaWVzLnR5cGVzY3JpcHQ7XG4gIGRlbGV0ZSBqc29uT2JqLmRldkRlcGVuZGVuY2llcy5sZXJuYTtcbiAgLy8gVG8gaW5zdGFsbCB0aGUgbGF0ZXN0IHBpbnN0XG4gIGRlbGV0ZSBqc29uT2JqLmRldkRlcGVuZGVuY2llcy5waW5zdDtcbiAgZGVsZXRlIGpzb25PYmouc2NyaXB0c1snZmx1dHRlci1mb3JtYXQnXTtcbiAgZGVsZXRlIGpzb25PYmouc2NyaXB0c1snZm9ybWF0LWZsdXR0ZXInXTtcbiAgZGVsZXRlIGpzb25PYmouc2NyaXB0c1sncHl0aG9uLWZvcm1hdCddO1xuICBkZWxldGUganNvbk9iai5zY3JpcHRzWydmb3JtYXQtcHl0aG9uJ107XG4gIGRlbGV0ZSBqc29uT2JqLnNjcmlwdHMucHJldHRpZXI7XG4gIGRlbGV0ZSBqc29uT2JqLnNjcmlwdHNbJ2NoZWNrLWFsbCddO1xuICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnMucHJvbWlzZXMucm0ocGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnbGVybmEuanNvbicpLCB7IGZvcmNlOiB0cnVlIH0pKTtcblxuICByZW1vdmVPYnNvbGV0ZUxpbnREZXBlbmRlbmNpZXMoanNvbk9iaiwgY29uZmlnKTtcbn1cblxuZnVuY3Rpb24gcmVtb3ZlT2Jzb2xldGVMaW50RGVwZW5kZW5jaWVzKFxuICBqc29uT2JqOiBTZXRSZXF1aXJlZDxQYWNrYWdlSnNvbiwgJ2RlcGVuZGVuY2llcycgfCAnZGV2RGVwZW5kZW5jaWVzJyB8ICdwZWVyRGVwZW5kZW5jaWVzJz4sXG4gIGNvbmZpZzogUGFja2FnZUNvbmZpZ1xuKTogdm9pZCB7XG4gIGNvbnN0IHByZXNlcnZlTWljcm9tYXRjaCA9IHNob3VsZFByZXNlcnZlTWljcm9tYXRjaChjb25maWcpO1xuICBmb3IgKGNvbnN0IGRlcGVuZGVuY3kgb2Ygb2Jzb2xldGVMaW50RGVwZW5kZW5jaWVzKSB7XG4gICAgaWYgKHByZXNlcnZlTWljcm9tYXRjaCAmJiBtaWNyb21hdGNoUGFja2FnZU5hbWVzLmhhcyhkZXBlbmRlbmN5KSkgY29udGludWU7XG4gICAgaWYgKHNob3VsZFByZXNlcnZlQ29uZmlnUGFja2FnZUxpbnREZXBlbmRlbmN5KGpzb25PYmosIGNvbmZpZywgZGVwZW5kZW5jeSkpIGNvbnRpbnVlO1xuICAgIGRlbGV0ZSBqc29uT2JqLmRlcGVuZGVuY2llc1tkZXBlbmRlbmN5XTtcbiAgICBkZWxldGUganNvbk9iai5kZXZEZXBlbmRlbmNpZXNbZGVwZW5kZW5jeV07XG4gICAgZGVsZXRlIGpzb25PYmoucGVlckRlcGVuZGVuY2llc1tkZXBlbmRlbmN5XTtcbiAgfVxufVxuXG5mdW5jdGlvbiBzaG91bGRQcmVzZXJ2ZUNvbmZpZ1BhY2thZ2VMaW50RGVwZW5kZW5jeShcbiAganNvbk9iajogU2V0UmVxdWlyZWQ8UGFja2FnZUpzb24sICdkZXBlbmRlbmNpZXMnIHwgJ2RldkRlcGVuZGVuY2llcycgfCAncGVlckRlcGVuZGVuY2llcyc+LFxuICBjb25maWc6IFBhY2thZ2VDb25maWcsXG4gIGRlcGVuZGVuY3k6IHN0cmluZ1xuKTogYm9vbGVhbiB7XG4gIGlmICghaXNQdWJsaXNoZWRXaWxsYm9vc3RlckNvbmZpZ3NQYWNrYWdlKGNvbmZpZykpIHJldHVybiBmYWxzZTtcbiAgaWYgKGpzb25PYmoucGVlckRlcGVuZGVuY2llc1tkZXBlbmRlbmN5XSkgcmV0dXJuIHRydWU7XG5cbiAgLy8gUHVibGlzaGVkIGNvbmZpZyBwYWNrYWdlcyBuZWVkIGxvY2FsIHR5cGUtb25seSBkZXBzIHRvIHZhbGlkYXRlIHRoZVxuICAvLyBwYWNrYWdlLXByb3ZpZGVkIGNvbmZpZyBkZWNsYXJhdGlvbnMgdW5kZXIgWWFybiBQblAuXG4gIHJldHVybiBkZXBlbmRlbmN5ID09PSAnQHR5cGVzL2VzbGludCcgJiYgISFqc29uT2JqLnBlZXJEZXBlbmRlbmNpZXMuZXNsaW50O1xufVxuXG5mdW5jdGlvbiBzaG91bGRQcmVzZXJ2ZU1pY3JvbWF0Y2goY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogYm9vbGVhbiB7XG4gIC8vIHdpbGxib29zdGVyLWNvbmZpZ3Mgc3VicGFja2FnZXMgcHVibGlzaCBjb25maWcgZmlsZXMgYXMgdGhlaXIgcHJvZHVjdCwgc29cbiAgLy8gbWljcm9tYXRjaCBpcyBwYWNrYWdlIGRhdGEgdGhlcmUuIE90aGVyIHJlcG9zIGtlZXAgbWljcm9tYXRjaCBvbmx5IHdoZW5cbiAgLy8gcHJvZHVjdCBjb2RlIGltcG9ydHMgaXQ7IG90aGVyd2lzZSBpdCBpcyB0cmVhdGVkIGFzIG9ic29sZXRlIEVTTGludC1lcmFcbiAgLy8gdG9vbGluZy5cbiAgcmV0dXJuIChjb25maWcuaXNXaWxsQm9vc3RlckNvbmZpZ3MgJiYgIWNvbmZpZy5pc1Jvb3QpIHx8IGRvZXNQcm9kdWN0Q29kZUltcG9ydE1pY3JvbWF0Y2goY29uZmlnLmRpclBhdGgpO1xufVxuXG5mdW5jdGlvbiBkb2VzUHJvZHVjdENvZGVJbXBvcnRNaWNyb21hdGNoKGRpclBhdGg6IHN0cmluZyk6IGJvb2xlYW4ge1xuICBjb25zdCBmaWxlUGF0aHMgPSBmZy5nbG9iU3luYygnc3JjLyoqLyoue2pzLGpzeCxtanMsY2pzLHRzLHRzeCxtdHMsY3RzfScsIHtcbiAgICBjd2Q6IGRpclBhdGgsXG4gICAgZG90OiB0cnVlLFxuICAgIGlnbm9yZTogZ2xvYklnbm9yZSxcbiAgfSk7XG4gIHJldHVybiBmaWxlUGF0aHMuc29tZSgoZmlsZVBhdGgpID0+IHtcbiAgICB0cnkge1xuICAgICAgcmV0dXJuIG1pY3JvbWF0Y2hJbXBvcnRQYXR0ZXJuLnRlc3QoZnMucmVhZEZpbGVTeW5jKHBhdGgucmVzb2x2ZShkaXJQYXRoLCBmaWxlUGF0aCksICd1dGY4JykpO1xuICAgIH0gY2F0Y2gge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfSk7XG59XG5cbmZ1bmN0aW9uIHNob3VsZFVwZGF0ZUV4aXN0aW5nTWFuYWdlZERlcGVuZGVuY3koZGVwZW5kZW5jeTogc3RyaW5nLCBjdXJyZW50VmVyc2lvbjogc3RyaW5nIHwgdW5kZWZpbmVkKTogYm9vbGVhbiB7XG4gIGlmICghY3VycmVudFZlcnNpb24pIHJldHVybiB0cnVlO1xuICBpZiAoY3VycmVudFZlcnNpb24gPT09ICcqJykgcmV0dXJuIHRydWU7XG4gIC8vIHdiZnktbWFuYWdlZCB0b29scyBtdXN0IGJlIGtlcHQgY3VycmVudCBldmVuIHdoZW4gdGhlIHBhY2thZ2UgYWxyZWFkeSBwaW5zXG4gIC8vIGEgY29uY3JldGUgdmVyc2lvbi4gSW4gcGFydGljdWxhciwgYnVpbGQtdHMgb3ducyBkZWNsYXJhdGlvbiBvdXRwdXQgcGF0aHMuXG4gIHJldHVybiAoXG4gICAgZGVwZW5kZW5jeSA9PT0gJ0B3aWxsYm9vc3Rlci93YicgfHxcbiAgICBkZXBlbmRlbmN5ID09PSBidWlsZFRzRGVwZW5kZW5jeSB8fFxuICAgIGRlcGVuZGVuY3kgPT09ICdAd2lsbGJvb3N0ZXIvb3hsaW50LWNvbmZpZycgfHxcbiAgICBkZXBlbmRlbmN5ID09PSAnb3hsaW50JyB8fFxuICAgIGRlcGVuZGVuY3kgPT09IHR5cGVzY3JpcHRHb0RlcGVuZGVuY3lcbiAgKTtcbn1cblxuZnVuY3Rpb24gYWRkU3RhcnRUZXN0U2VydmVyU2NyaXB0SWZOZWVkZWQoY29uZmlnOiBQYWNrYWdlQ29uZmlnLCBqc29uT2JqOiBQYWNrYWdlSnNvbik6IHZvaWQge1xuICBpZiAoIWNvbmZpZy5kZXBlbmRpbmcucGxheXdyaWdodFRlc3QgfHwgIWNvbmZpZy5kZXBlbmRpbmcud2IgfHwganNvbk9iai5zY3JpcHRzPy5bJ3N0YXJ0LXRlc3Qtc2VydmVyJ10pIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBqc29uT2JqLnNjcmlwdHMgPz89IHt9O1xuICBqc29uT2JqLnNjcmlwdHNbJ3N0YXJ0LXRlc3Qtc2VydmVyJ10gPSAnd2Igc3RhcnQgLS1tb2RlIHRlc3QnO1xufVxuXG5mdW5jdGlvbiBmb3JtYXRSZXBvc2l0b3J5Rm9yUGFja2FnZUpzb24oXG4gIHJlcG9zaXRvcnk6IFBhY2thZ2VKc29uWydyZXBvc2l0b3J5J10sXG4gIGV4aXN0aW5nUmVwb3NpdG9yeT86IFBhY2thZ2VKc29uWydyZXBvc2l0b3J5J11cbik6IFBhY2thZ2VKc29uWydyZXBvc2l0b3J5J10ge1xuICBjb25zdCBub3JtYWxpemVkUmVwb3NpdG9yeSA9IG5vcm1hbGl6ZVJlcG9zaXRvcnlVcmxGb3JQYWNrYWdlSnNvbihyZXBvc2l0b3J5KTtcbiAgaWYgKG5vcm1hbGl6ZWRSZXBvc2l0b3J5KSB7XG4gICAgcmV0dXJuIGJ1aWxkTm9ybWFsaXplZFJlcG9zaXRvcnlGb3JQYWNrYWdlSnNvbihub3JtYWxpemVkUmVwb3NpdG9yeSwgcmVwb3NpdG9yeSwgZXhpc3RpbmdSZXBvc2l0b3J5KTtcbiAgfVxuXG4gIGNvbnN0IG5vcm1hbGl6ZWRFeGlzdGluZ1JlcG9zaXRvcnkgPSBub3JtYWxpemVSZXBvc2l0b3J5VXJsRm9yUGFja2FnZUpzb24oZXhpc3RpbmdSZXBvc2l0b3J5KTtcbiAgaWYgKG5vcm1hbGl6ZWRFeGlzdGluZ1JlcG9zaXRvcnkpIHtcbiAgICByZXR1cm4gYnVpbGROb3JtYWxpemVkUmVwb3NpdG9yeUZvclBhY2thZ2VKc29uKG5vcm1hbGl6ZWRFeGlzdGluZ1JlcG9zaXRvcnksIGV4aXN0aW5nUmVwb3NpdG9yeSk7XG4gIH1cblxuICByZXR1cm4gcmVwb3NpdG9yeTtcbn1cblxuZnVuY3Rpb24gbm9ybWFsaXplUmVwb3NpdG9yeVVybEZvclBhY2thZ2VKc29uKHJlcG9zaXRvcnk6IFBhY2thZ2VKc29uWydyZXBvc2l0b3J5J10pOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBpZiAodHlwZW9mIHJlcG9zaXRvcnkgPT09ICdzdHJpbmcnKSB7XG4gICAgaWYgKCFyZXBvc2l0b3J5LnN0YXJ0c1dpdGgoJ2dpdGh1YjonKSkgcmV0dXJuO1xuXG4gICAgY29uc3QgW293bmVyLCByZXBvXSA9IGdpdEh1YlV0aWwuZ2V0T3JnQW5kTmFtZShyZXBvc2l0b3J5KTtcbiAgICBpZiAoIW93bmVyIHx8ICFyZXBvKSByZXR1cm47XG4gICAgcmV0dXJuIGBnaXQraHR0cHM6Ly9naXRodWIuY29tLyR7b3duZXJ9LyR7cmVwb30uZ2l0YDtcbiAgfVxuXG4gIGNvbnN0IHJlcG9zaXRvcnlVcmwgPSByZXBvc2l0b3J5Py51cmw7XG4gIGlmICh0eXBlb2YgcmVwb3NpdG9yeVVybCAhPT0gJ3N0cmluZycpIHJldHVybjtcblxuICBjb25zdCBtYXRjaGVkID0gL14oPzpnaXRcXCspP2h0dHBzOlxcL1xcL2dpdGh1YlxcLmNvbVxcLyhbXi9dKylcXC8oW14vXSs/KSg/OlxcLmdpdCk/JC91LmV4ZWMocmVwb3NpdG9yeVVybCk7XG4gIGlmICghbWF0Y2hlZCkgcmV0dXJuO1xuXG4gIGNvbnN0IFssIG93bmVyLCByZXBvXSA9IG1hdGNoZWQ7XG4gIHJldHVybiBgZ2l0K2h0dHBzOi8vZ2l0aHViLmNvbS8ke293bmVyfS8ke3JlcG99LmdpdGA7XG59XG5cbmZ1bmN0aW9uIGJ1aWxkTm9ybWFsaXplZFJlcG9zaXRvcnlGb3JQYWNrYWdlSnNvbihcbiAgbm9ybWFsaXplZFVybDogc3RyaW5nLFxuICByZXBvc2l0b3J5OiBQYWNrYWdlSnNvblsncmVwb3NpdG9yeSddLFxuICBleGlzdGluZ1JlcG9zaXRvcnk/OiBQYWNrYWdlSnNvblsncmVwb3NpdG9yeSddXG4pOiBQYWNrYWdlSnNvblsncmVwb3NpdG9yeSddIHtcbiAgY29uc3QgcmVwb3NpdG9yeU9iaiA9XG4gICAgdHlwZW9mIHJlcG9zaXRvcnkgPT09ICdvYmplY3QnXG4gICAgICA/IHJlcG9zaXRvcnlcbiAgICAgIDogdHlwZW9mIGV4aXN0aW5nUmVwb3NpdG9yeSA9PT0gJ29iamVjdCdcbiAgICAgICAgPyBleGlzdGluZ1JlcG9zaXRvcnlcbiAgICAgICAgOiB1bmRlZmluZWQ7XG5cbiAgcmV0dXJuIHtcbiAgICAuLi5yZXBvc2l0b3J5T2JqLFxuICAgIHR5cGU6ICdnaXQnLFxuICAgIHVybDogbm9ybWFsaXplZFVybCxcbiAgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdlbmVyYXRlU2NyaXB0cyhjb25maWc6IFBhY2thZ2VDb25maWcsIG9sZFNjcmlwdHM6IFBhY2thZ2VKc29uLlNjcmlwdHMpOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+IHtcbiAgaWYgKGNvbmZpZy5pc0J1bikge1xuICAgIGNvbnN0IGhhc1R5cGVjaGVjayA9IGNvbmZpZy5kb2VzQ29udGFpblR5cGVTY3JpcHQgfHwgY29uZmlnLmRvZXNDb250YWluVHlwZVNjcmlwdEluUGFja2FnZXM7XG4gICAgY29uc3Qgc2NyaXB0czogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHtcbiAgICAgICdjaGVjay1hbGwtZm9yLWFpJzogJ2J1biBydW4gY2hlY2stZm9yLWFpICYmIGJ1biBydW4gdGVzdCcsXG4gICAgICAnY2hlY2stZm9yLWFpJzogJ2J1biBydW4gY2xlYW51cCcsXG4gICAgICBjbGVhbnVwOiAnYnVuIC0tYnVuIHdiIGxpbnQgLS1maXggLS1mb3JtYXQnLFxuICAgICAgZm9ybWF0OiBgYnVuIC0tYnVuIHdiIGxpbnQgLS1mb3JtYXRgLFxuICAgICAgbGludDogYGJ1biAtLWJ1biB3YiBsaW50YCxcbiAgICAgICdsaW50LWZpeCc6ICdidW4gLS1idW4gd2IgbGludCAtLWZpeCcsXG4gICAgICB0ZXN0OiAnYnVuIHdiIHRlc3QnLFxuICAgICAgdHlwZWNoZWNrOiAnYnVuIC0tYnVuIHdiIHR5cGVjaGVjaycsXG4gICAgfTtcbiAgICBpZiAoIWhhc1R5cGVjaGVjaykge1xuICAgICAgZGVsZXRlIHNjcmlwdHMudHlwZWNoZWNrO1xuICAgIH0gZWxzZSBpZiAoY29uZmlnLmRlcGVuZGluZy5weXJpZ2h0KSB7XG4gICAgICBzY3JpcHRzLnR5cGVjaGVjayArPSAnICYmIHB5cmlnaHQnO1xuICAgIH1cbiAgICByZXR1cm4gc2NyaXB0cztcbiAgfSBlbHNlIHtcbiAgICBjb25zdCBoYXNUeXBlY2hlY2sgPSBjb25maWcuZG9lc0NvbnRhaW5UeXBlU2NyaXB0IHx8IGNvbmZpZy5kb2VzQ29udGFpblR5cGVTY3JpcHRJblBhY2thZ2VzO1xuICAgIGNvbnN0IGhhc0pzT3JUcyA9IGRvZXNDb250YWluSnNPclRzKGNvbmZpZyk7XG4gICAgY29uc3QgaGFzSmF2YSA9IGRvZXNDb250YWluSmF2YShjb25maWcpO1xuICAgIGNvbnN0IG9sZFRlc3QgPSBvbGRTY3JpcHRzLnRlc3Q7XG4gICAgbGV0IHNjcmlwdHM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7XG4gICAgICAnY2hlY2stYWxsLWZvci1haSc6ICd5YXJuIGNoZWNrLWZvci1haSAmJiB5YXJuIHRlc3QnLFxuICAgICAgJ2NoZWNrLWZvci1haSc6IGB5YXJuIGZvcm1hdCA+IC9kZXYvbnVsbCAyPiAvZGV2L251bGwgfHwgdHJ1ZSAmJiB5YXJuIGxpbnQtZml4IC0tcXVpZXRgLFxuICAgICAgY2xlYW51cDogJ3lhcm4gZm9ybWF0ICYmIHlhcm4gbGludC1maXgnLFxuICAgICAgZm9ybWF0OiBnZW5lcmF0ZUZvcm1hdFNjcmlwdChoYXNKc09yVHMsIGhhc0phdmEpLFxuICAgICAgbGludDogYG94bGludCAtLW5vLWVycm9yLW9uLXVubWF0Y2hlZC1wYXR0ZXJuIC5gLFxuICAgICAgJ2xpbnQtZml4JzogJ3lhcm4gbGludCAtLWZpeCcsXG4gICAgICAnZm9ybWF0LWNvZGUnOiBgb3hmbXQgLS13cml0ZSAtLW5vLWVycm9yLW9uLXVubWF0Y2hlZC1wYXR0ZXJuIC5gLFxuICAgICAgdHlwZWNoZWNrOiAndHNnbyAtLW5vRW1pdCcsXG4gICAgfTtcbiAgICBpZiAoaGFzSmF2YSkge1xuICAgICAgc2NyaXB0cy5wcmV0dGlmeSA9IGBwcmV0dGllciAtLWNhY2hlIC0tY29sb3IgLS1uby1lcnJvci1vbi11bm1hdGNoZWQtcGF0dGVybiAtLXdyaXRlIFwiKiovey4qLyx9Ki57JHtleHRlbnNpb25zLnByZXR0aWVyT25seS5qb2luKCcsJyl9fVwiIFwiISoqL3Rlc3R7LSwvfWZpeHR1cmVzLyoqXCJgO1xuICAgIH1cbiAgICBpZiAoY29uZmlnLmRvZXNDb250YWluU3ViUGFja2FnZUpzb25zKSB7XG4gICAgICBzY3JpcHRzID0gbWVyZ2UoXG4gICAgICAgIHsgLi4uc2NyaXB0cyB9LFxuICAgICAgICB7XG4gICAgICAgICAgZm9ybWF0OiBgJHtzY3JpcHRzLmZvcm1hdH0gJiYgeWFybiB3b3Jrc3BhY2VzIGZvcmVhY2ggLS1hbGwgLS1wYXJhbGxlbCAtLXZlcmJvc2UgcnVuIGZvcm1hdGAsXG4gICAgICAgICAgbGludDogYHlhcm4gd29ya3NwYWNlcyBmb3JlYWNoIC0tYWxsIC0tcGFyYWxsZWwgLS12ZXJib3NlIHJ1biBsaW50YCxcbiAgICAgICAgICAnbGludC1maXgnOiAneWFybiB3b3Jrc3BhY2VzIGZvcmVhY2ggLS1hbGwgLS1wYXJhbGxlbCAtLXZlcmJvc2UgcnVuIGxpbnQtZml4JyxcbiAgICAgICAgICAvLyBDST0xIHByZXZlbnRzIHZpdGVzdCBmcm9tIGVuYWJsaW5nIHdhdGNoLlxuICAgICAgICAgIC8vIEZPUkNFX0NPTE9SPTMgbWFrZSB3YiBlbmFibGUgY29sb3Igb3V0cHV0LlxuICAgICAgICAgIHRlc3Q6ICdDST0xIEZPUkNFX0NPTE9SPTMgeWFybiB3b3Jrc3BhY2VzIGZvcmVhY2ggLS1hbGwgLS12ZXJib3NlIHJ1biB0ZXN0JyxcbiAgICAgICAgICB0eXBlY2hlY2s6ICd5YXJuIHdvcmtzcGFjZXMgZm9yZWFjaCAtLWFsbCAtLXBhcmFsbGVsIC0tdmVyYm9zZSBydW4gdHlwZWNoZWNrJyxcbiAgICAgICAgfVxuICAgICAgKTtcbiAgICAgIGlmIChoYXNKYXZhKSB7XG4gICAgICAgIHNjcmlwdHMucHJldHRpZnkgPSBgcHJldHRpZXIgLS1jYWNoZSAtLWNvbG9yIC0tbm8tZXJyb3Itb24tdW5tYXRjaGVkLXBhdHRlcm4gLS13cml0ZSBcIioqL3suKi8sfSoueyR7ZXh0ZW5zaW9ucy5wcmV0dGllck9ubHkuam9pbihcbiAgICAgICAgICAnLCdcbiAgICAgICAgKX19XCIgXCIhKiovcGFja2FnZXMvKipcIiBcIiEqKi90ZXN0ey0sL31maXh0dXJlcy8qKlwiYDtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKGNvbmZpZy5kZXBlbmRpbmcucHlyaWdodCkge1xuICAgICAgc2NyaXB0cy50eXBlY2hlY2sgPSBzY3JpcHRzLnR5cGVjaGVjayA/IGAke3NjcmlwdHMudHlwZWNoZWNrfSAmJiBgIDogJyc7XG4gICAgICBzY3JpcHRzLnR5cGVjaGVjayArPSAncHlyaWdodCc7XG4gICAgfVxuICAgIGlmIChvbGRUZXN0Py5pbmNsdWRlcygnd2IgdGVzdCcpKSB7XG4gICAgICBzY3JpcHRzLnRlc3QgPSBvbGRUZXN0O1xuICAgIH1cbiAgICBpZiAoIWhhc0pzT3JUcykge1xuICAgICAgZGVsZXRlIHNjcmlwdHNbJ2Zvcm1hdC1jb2RlJ107XG4gICAgICBkZWxldGUgc2NyaXB0cy5saW50O1xuICAgICAgZGVsZXRlIHNjcmlwdHNbJ2xpbnQtZml4J107XG4gICAgfVxuICAgIGlmICghaGFzVHlwZWNoZWNrKSB7XG4gICAgICBkZWxldGUgc2NyaXB0cy50eXBlY2hlY2s7XG4gICAgfSBlbHNlIGlmIChjb25maWcuZGVwZW5kaW5nLndiKSB7XG4gICAgICBzY3JpcHRzLnR5cGVjaGVjayA9ICd3YiB0eXBlY2hlY2snO1xuICAgIH1cbiAgICByZXR1cm4gc2NyaXB0cztcbiAgfVxufVxuXG5mdW5jdGlvbiBnZW5lcmF0ZUZvcm1hdFNjcmlwdChoYXNKc09yVHM6IGJvb2xlYW4sIGhhc0phdmE6IGJvb2xlYW4pOiBzdHJpbmcge1xuICBjb25zdCBjb21tYW5kcyA9IFsnc29ydC1wYWNrYWdlLWpzb24nXTtcbiAgaWYgKGhhc0pzT3JUcykge1xuICAgIGNvbW1hbmRzLnB1c2goJ3lhcm4gZm9ybWF0LWNvZGUnKTtcbiAgfVxuICBpZiAoaGFzSmF2YSkge1xuICAgIGNvbW1hbmRzLnB1c2goJ3lhcm4gcHJldHRpZnknKTtcbiAgfVxuICByZXR1cm4gY29tbWFuZHMuam9pbignICYmICcpO1xufVxuXG5hc3luYyBmdW5jdGlvbiBnZW5lcmF0ZVByZXR0aWVyU3VmZml4KGRpclBhdGg6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nPiB7XG4gIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKGRpclBhdGgsICcucHJldHRpZXJpZ25vcmUnKTtcbiAgY29uc3QgZXhpc3RpbmdDb250ZW50ID0gYXdhaXQgZnMucHJvbWlzZXMucmVhZEZpbGUoZmlsZVBhdGgsICd1dGY4JykuY2F0Y2goKCkgPT4gJycpO1xuICBjb25zdCBpbmRleCA9IGV4aXN0aW5nQ29udGVudC5pbmRleE9mKGlnbm9yZUZpbGVVdGlsLnNlcGFyYXRvclByZWZpeCk7XG4gIGlmIChpbmRleCA9PT0gLTEpIHJldHVybiAnJztcblxuICBjb25zdCBvcmlnaW5hbENvbnRlbnQgPSBleGlzdGluZ0NvbnRlbnQuc2xpY2UoMCwgaW5kZXgpO1xuICBjb25zdCBsaW5lcyA9IG9yaWdpbmFsQ29udGVudFxuICAgIC5zcGxpdCgnXFxuJylcbiAgICAubWFwKChsaW5lKSA9PiB7XG4gICAgICBjb25zdCBuZXdMaW5lID0gbGluZS50cmltKCk7XG4gICAgICByZXR1cm4gbmV3TGluZS5lbmRzV2l0aCgnLycpID8gbmV3TGluZS5zbGljZSgwLCAtMSkgOiBuZXdMaW5lO1xuICAgIH0pXG4gICAgLmZpbHRlcigobCkgPT4gbCAmJiAhbC5zdGFydHNXaXRoKCcjJykgJiYgIWwuaW5jbHVkZXMoJy8nKSk7XG5cbiAgcmV0dXJuIGAke2xpbmVzLm1hcCgobGluZSkgPT4gYCBcIiEqKi8ke2xpbmV9LyoqXCJgKS5qb2luKCcnKX0gfHwgdHJ1ZWA7XG59XG5cbmZ1bmN0aW9uIHJlbW92ZVByZXR0aWVyQXJ0aWZhY3RzKGpzb25PYmo6IFdyaXRhYmxlUGFja2FnZUpzb24pOiB2b2lkIHtcbiAgZGVsZXRlIGpzb25PYmoucHJldHRpZXI7XG4gIGNvbnN0IGRlcGVuZGVuY3lTZWN0aW9uczogQXJyYXk8UGFydGlhbDxSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+PiB8IHVuZGVmaW5lZD4gPSBbXG4gICAganNvbk9iai5kZXBlbmRlbmNpZXMsXG4gICAganNvbk9iai5kZXZEZXBlbmRlbmNpZXMsXG4gICAganNvbk9iai5wZWVyRGVwZW5kZW5jaWVzLFxuICBdO1xuICBmb3IgKGNvbnN0IHNlY3Rpb24gb2YgZGVwZW5kZW5jeVNlY3Rpb25zKSB7XG4gICAgaWYgKCFzZWN0aW9uKSBjb250aW51ZTtcbiAgICBkZWxldGUgc2VjdGlvbi5wcmV0dGllcjtcbiAgICBkZWxldGUgc2VjdGlvblsncHJldHRpZXItcGx1Z2luLWphdmEnXTtcbiAgICBkZWxldGUgc2VjdGlvblsnQHdpbGxib29zdGVyL3ByZXR0aWVyLWNvbmZpZyddO1xuICAgIGRlbGV0ZSBzZWN0aW9uWydAdHlwZXMvcHJldHRpZXInXTtcbiAgfVxufVxuXG5hc3luYyBmdW5jdGlvbiB1cGRhdGVQcml2YXRlUGFja2FnZXMoanNvbk9iajogV3JpdGFibGVQYWNrYWdlSnNvbik6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBwYWNrYWdlTmFtZXMgPSBuZXcgU2V0KFsuLi5PYmplY3Qua2V5cyhqc29uT2JqLmRlcGVuZGVuY2llcyksIC4uLk9iamVjdC5rZXlzKGpzb25PYmouZGV2RGVwZW5kZW5jaWVzKV0pO1xuICBjb25zdCBwcml2YXRlUGFja2FnZXM6IHtcbiAgICBwYWNrYWdlTmFtZTogc3RyaW5nO1xuICAgIHJlcG86IHN0cmluZztcbiAgICB0YXJnZXQ6ICdkZXBlbmRlbmNpZXMnIHwgJ2RldkRlcGVuZGVuY2llcyc7XG4gIH1bXSA9IFtcbiAgICB7IHBhY2thZ2VOYW1lOiAnQHdpbGxib29zdGVyL2F1dGgnLCByZXBvOiAnYXV0aCcsIHRhcmdldDogJ2RlcGVuZGVuY2llcycgfSxcbiAgICB7IHBhY2thZ2VOYW1lOiAnQGRpc2NvcmQtYm90L3NoYXJlZCcsIHJlcG86ICdkaXNjb3JkLWJvdCcsIHRhcmdldDogJ2RlcGVuZGVuY2llcycgfSxcbiAgICB7IHBhY2thZ2VOYW1lOiAnQHdpbGxib29zdGVyL2NvZGUtYW5hbHl6ZXInLCByZXBvOiAnY29kZS1hbmFseXplcicsIHRhcmdldDogJ2RldkRlcGVuZGVuY2llcycgfSxcbiAgICB7IHBhY2thZ2VOYW1lOiAnQHdpbGxib29zdGVyL2p1ZGdlJywgcmVwbzogJ2p1ZGdlJywgdGFyZ2V0OiAnZGVwZW5kZW5jaWVzJyB9LFxuICAgIHsgcGFja2FnZU5hbWU6ICdAd2lsbGJvb3N0ZXIvbGxtLXByb3h5JywgcmVwbzogJ2xsbS1wcm94eScsIHRhcmdldDogJ2RlcGVuZGVuY2llcycgfSxcbiAgXTtcblxuICBhd2FpdCBQcm9taXNlLmFsbChcbiAgICBwcml2YXRlUGFja2FnZXMubWFwKGFzeW5jICh7IHBhY2thZ2VOYW1lLCByZXBvLCB0YXJnZXQgfSkgPT4ge1xuICAgICAgaWYgKCFwYWNrYWdlTmFtZXMuaGFzKHBhY2thZ2VOYW1lKSB8fCBpc1dvcmtzcGFjZVBhY2thZ2UoanNvbk9iaiwgcGFja2FnZU5hbWUpKSByZXR1cm47XG5cbiAgICAgIGNvbnN0IG90aGVyVGFyZ2V0ID0gdGFyZ2V0ID09PSAnZGVwZW5kZW5jaWVzJyA/ICdkZXZEZXBlbmRlbmNpZXMnIDogJ2RlcGVuZGVuY2llcyc7XG4gICAgICAvLyBUaGUgbGludCBydWxlIGRpc2FsbG93cyBgZGVsZXRlYCB3aXRoIGNvbXB1dGVkIHBhY2thZ2UgbmFtZXM7IFJlZmxlY3QgaGFzIHRoZSBzYW1lIGRlbGV0aW9uIHNlbWFudGljcyBoZXJlLlxuICAgICAgUmVmbGVjdC5kZWxldGVQcm9wZXJ0eShqc29uT2JqW290aGVyVGFyZ2V0XSwgcGFja2FnZU5hbWUpO1xuICAgICAganNvbk9ialt0YXJnZXRdW3BhY2thZ2VOYW1lXSA9IGF3YWl0IGdldExhdGVzdFByaXZhdGVQYWNrYWdlU3BlY2lmaWVyKHJlcG8pO1xuICAgIH0pXG4gICk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGdldExhdGVzdFByaXZhdGVQYWNrYWdlU3BlY2lmaWVyKHJlcG86IHN0cmluZyk6IFByb21pc2U8c3RyaW5nPiB7XG4gIGNvbnN0IGNvbW1pdEhhc2ggPSBhd2FpdCBnZXRMYXRlc3RDb21taXRIYXNoKCdXaWxsQm9vc3RlckxhYicsIHJlcG8pO1xuICByZXR1cm4gYGdpdEBnaXRodWIuY29tOldpbGxCb29zdGVyTGFiLyR7cmVwb30uZ2l0IyR7Y29tbWl0SGFzaH1gO1xufVxuXG5mdW5jdGlvbiBpc1dvcmtzcGFjZVBhY2thZ2UoanNvbk9iajogUGFja2FnZUpzb24sIHBhY2thZ2VOYW1lOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgcmV0dXJuIChqc29uT2JqLmRldkRlcGVuZGVuY2llcz8uW3BhY2thZ2VOYW1lXSB8fCBqc29uT2JqLmRlcGVuZGVuY2llcz8uW3BhY2thZ2VOYW1lXSB8fCAnJykuaW5jbHVkZXMoJ3dvcmtzcGFjZScpO1xufVxuIiwiaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRUc2NvbmZpZ0V4dGVuZHMoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogc3RyaW5nIHwgc3RyaW5nW10ge1xuICBpZiAoY29uZmlnLmlzQnVuKSB7XG4gICAgcmV0dXJuICdAdHNjb25maWcvYnVuL3RzY29uZmlnLmpzb24nO1xuICB9XG4gIGlmIChjb25maWcuZGVwZW5kaW5nLnJlYWN0TmF0aXZlKSB7XG4gICAgcmV0dXJuICdAdHNjb25maWcvcmVhY3QtbmF0aXZlL3RzY29uZmlnLmpzb24nO1xuICB9XG4gIHJldHVybiBbJ0B0c2NvbmZpZy9ub2RlLWx0cy90c2NvbmZpZy5qc29uJywgJ0B0c2NvbmZpZy9ub2RlLXRzL3RzY29uZmlnLmpzb24nXTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldFRzY29uZmlnQmFzZURlcGVuZGVuY2llcyhjb25maWc6IFBhY2thZ2VDb25maWcpOiBzdHJpbmdbXSB7XG4gIGlmIChjb25maWcuaXNCdW4pIHtcbiAgICByZXR1cm4gWydAdHNjb25maWcvYnVuJ107XG4gIH1cbiAgaWYgKGNvbmZpZy5kZXBlbmRpbmcucmVhY3ROYXRpdmUpIHtcbiAgICByZXR1cm4gWydAdHNjb25maWcvcmVhY3QtbmF0aXZlJ107XG4gIH1cbiAgcmV0dXJuIFsnQHRzY29uZmlnL25vZGUtbHRzJywgJ0B0c2NvbmZpZy9ub2RlLXRzJ107XG59XG4iLCJpbXBvcnQgeyBzcGF3blN5bmNBbmRSZXR1cm5TdGRvdXQgfSBmcm9tICcuLi91dGlscy9zcGF3blV0aWwuanMnO1xuXG5leHBvcnQgZnVuY3Rpb24gZ2V0TGF0ZXN0Q29tbWl0SGFzaChvcmdhbml6YXRpb246IHN0cmluZywgcmVwbzogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgdHJ5IHtcbiAgICBjb25zdCByZXBvVXJsID0gYGdpdEBnaXRodWIuY29tOiR7b3JnYW5pemF0aW9ufS8ke3JlcG99LmdpdGA7XG4gICAgY29uc3Qgb3V0cHV0ID0gc3Bhd25TeW5jQW5kUmV0dXJuU3Rkb3V0KCdnaXQnLCBbJ2xzLXJlbW90ZScsIHJlcG9VcmwsICdIRUFEJ10sIHByb2Nlc3MuY3dkKCkpO1xuICAgIGNvbnN0IGNvbW1pdEhhc2ggPSBvdXRwdXQuc3BsaXQoL1xccysvKVswXTtcbiAgICBpZiAoIWNvbW1pdEhhc2gpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgTm8gY29tbWl0cyBmb3VuZCBmb3IgJHtvcmdhbml6YXRpb259LyR7cmVwb31gKTtcbiAgICB9XG4gICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShjb21taXRIYXNoKTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IEVycm9yKGBGYWlsZWQgdG8gZmV0Y2ggY29tbWl0cyBmb3IgJHtvcmdhbml6YXRpb259LyR7cmVwb306ICR7U3RyaW5nKGVycm9yKX1gKSk7XG4gIH1cbn1cbiIsIi8vIG94bGludC1kaXNhYmxlIGVzbGludC1wbHVnaW4taW1wb3J0L25vLW5hbWVkLWFzLWRlZmF1bHQtbWVtYmVyIC0tIE5hbWVzcGFjZSBZQU1MIGNhbGxzIG1ha2UgZHVtcCB1c2FnZSBjbGVhcmVyLlxuaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHlhbWwgZnJvbSAnanMteWFtbCc7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGV4dGVuc2lvbnMgfSBmcm9tICcuLi91dGlscy9leHRlbnNpb25zLmpzJztcbmltcG9ydCB7IGdldEdlbkkxOG5Uc0NvbW1hbmQgfSBmcm9tICcuLi91dGlscy9nZW5JMThuVHMuanMnO1xuaW1wb3J0IHsgZG9lc0NvbnRhaW5KYXZhLCBkb2VzQ29udGFpbkpzT3JUcyB9IGZyb20gJy4uL3V0aWxzL3BhY2thZ2VDYXBhYmlsaXRpZXMuanMnO1xuaW1wb3J0IHsgc3Bhd25TeW5jIH0gZnJvbSAnLi4vdXRpbHMvc3Bhd25VdGlsLmpzJztcblxuaW1wb3J0IHsgZ2VuZXJhdGVTY3JpcHRzIH0gZnJvbSAnLi9wYWNrYWdlSnNvbi5qcyc7XG5cbmludGVyZmFjZSBMZWZ0aG9va1NldHRpbmdzIHtcbiAgZ2xvYl9tYXRjaGVyOiAnZG91Ymxlc3Rhcic7XG4gICdwb3N0LW1lcmdlJzoge1xuICAgIGpvYnM6IExlZnRob29rSm9iW107XG4gIH07XG4gICdwcmUtY29tbWl0Jzoge1xuICAgIGpvYnM6IExlZnRob29rSm9iW107XG4gIH07XG4gICdwcmUtcHVzaCc6IHtcbiAgICBqb2JzOiBMZWZ0aG9va0pvYltdO1xuICB9O1xufVxuXG5pbnRlcmZhY2UgTGVmdGhvb2tKb2Ige1xuICBuYW1lOiBzdHJpbmc7XG4gIGdsb2I/OiBzdHJpbmc7XG4gIHJ1bj86IHN0cmluZztcbiAgc2NyaXB0Pzogc3RyaW5nO1xuICBydW5uZXI/OiAnYmFzaCc7XG4gIHN0YWdlX2ZpeGVkPzogdHJ1ZTtcbn1cblxuY29uc3QgYmFzZVNldHRpbmdzOiBPbWl0PExlZnRob29rU2V0dGluZ3MsICdwcmUtY29tbWl0Jz4gPSB7XG4gIGdsb2JfbWF0Y2hlcjogJ2RvdWJsZXN0YXInLFxuICAncG9zdC1tZXJnZSc6IHtcbiAgICBqb2JzOiBbXG4gICAgICB7XG4gICAgICAgIG5hbWU6ICdwcmVwYXJlJyxcbiAgICAgICAgc2NyaXB0OiAncHJlcGFyZS5zaCcsXG4gICAgICAgIHJ1bm5lcjogJ2Jhc2gnLFxuICAgICAgfSxcbiAgICBdLFxuICB9LFxuICAncHJlLXB1c2gnOiB7XG4gICAgam9iczogW1xuICAgICAge1xuICAgICAgICBuYW1lOiAnY2hlY2snLFxuICAgICAgICBzY3JpcHQ6ICdjaGVjay5zaCcsXG4gICAgICAgIHJ1bm5lcjogJ2Jhc2gnLFxuICAgICAgfSxcbiAgICBdLFxuICB9LFxufTtcblxuY29uc3QgcHJlQ29tbWl0U2V0dGluZ3M6IExlZnRob29rU2V0dGluZ3NbJ3ByZS1jb21taXQnXSA9IHtcbiAgam9iczogW1xuICAgIHtcbiAgICAgIG5hbWU6ICdjbGVhbnVwJyxcbiAgICAgIGdsb2I6ICcnLFxuICAgICAgcnVuOiAnJyxcbiAgICAgIHN0YWdlX2ZpeGVkOiB0cnVlLFxuICAgIH0sXG4gICAge1xuICAgICAgbmFtZTogJ2NoZWNrLW1pZ3JhdGlvbnMnLFxuICAgICAgZ2xvYjogJyoqL21pZ3JhdGlvbi5zcWwnLFxuICAgICAgcnVuOiBgXG5mYWlsZWQ9MFxuIyBMZWZ0aG9vayBleHBhbmRzIHtzdGFnZWRfZmlsZXN9IGFzIHNoZWxsLWVzY2FwZWQgYXJncywgc28gcGF0aHMgd2l0aCBzcGFjZXMgc3RheSBpbnRhY3QuXG5mb3IgZmlsZSBpbiB7c3RhZ2VkX2ZpbGVzfTsgZG9cbiAgaWYgZ3JlcCAtcSAnV2FybmluZ3M6JyBcIiRmaWxlXCI7IHRoZW5cbiAgICBlY2hvIFwiTWlncmF0aW9uIFNRTCBmaWxlICgkZmlsZSkgY29udGFpbnMgd2FybmluZ3MhIFBsZWFzZSBzb2x2ZSB0aGUgd2FybmluZ3MgYW5kIGNvbW1pdCBhZ2Fpbi5cIlxuICAgIGZhaWxlZD0xXG4gIGZpXG5kb25lXG5leGl0IFwiJGZhaWxlZFwiXG5gLnRyaW0oKSxcbiAgICB9LFxuICBdLFxufTtcblxuY29uc3Qgc2NyaXB0cyA9IHtcbiAgcG9zdE1lcmdlOiBgXG4jIS9iaW4vYmFzaFxuXG5jaGFuZ2VkX2ZpbGVzPVwiJChnaXQgZGlmZi10cmVlIC1yIC0tbmFtZS1vbmx5IC0tbm8tY29tbWl0LWlkIE9SSUdfSEVBRCBIRUFEKVwiXG5cbnJ1bl9pZl9jaGFuZ2VkKCkge1xuICBpZiBlY2hvIFwiJGNoYW5nZWRfZmlsZXNcIiB8IGdyZXAgLS1xdWlldCAtRSBcIiQxXCI7IHRoZW5cbiAgICBldmFsIFwiJDJcIlxuICBmaVxufVxuYC50cmltKCksXG59O1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVMZWZ0aG9va1VwZGF0aW5nUGFja2FnZUpzb24oY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZ2VuZXJhdGVMZWZ0aG9va1VwZGF0aW5nUGFja2FnZUpzb24nLCBhc3luYyAoKSA9PiB7XG4gICAgYXdhaXQgY29yZShjb25maWcpO1xuICB9KTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gY29yZShjb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgZGlyUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJy5sZWZ0aG9vaycpO1xuICBjb25zdCBodXNreURpclBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICcuaHVza3knKTtcbiAgY29uc3QgaGFzSHVza3lEaXIgPSBmcy5leGlzdHNTeW5jKGh1c2t5RGlyUGF0aCk7XG4gIGNvbnN0IHsgbGludCB9ID0gZ2VuZXJhdGVTY3JpcHRzKGNvbmZpZywge30pO1xuICBjb25zdCBzZXR0aW5nczogUGFydGlhbDxMZWZ0aG9va1NldHRpbmdzPiA9IHtcbiAgICAuLi5iYXNlU2V0dGluZ3MsXG4gICAgJ3ByZS1jb21taXQnOiB7XG4gICAgICBqb2JzOiBnZXRQcmVDb21taXRKb2JzKGNvbmZpZyksXG4gICAgfSxcbiAgfTtcbiAgaWYgKCFsaW50KSB7XG4gICAgZGVsZXRlIHNldHRpbmdzWydwcmUtcHVzaCddO1xuICB9XG4gIGF3YWl0IFByb21pc2UuYWxsKFtcbiAgICBmcy5wcm9taXNlcy53cml0ZUZpbGUoXG4gICAgICBwYXRoLmpvaW4oY29uZmlnLmRpclBhdGgsICdsZWZ0aG9vay55bWwnKSxcbiAgICAgIHlhbWwuZHVtcChzZXR0aW5ncywge1xuICAgICAgICBsaW5lV2lkdGg6IC0xLFxuICAgICAgICBub0NvbXBhdE1vZGU6IHRydWUsXG4gICAgICAgIHN0eWxlczoge1xuICAgICAgICAgICchIW51bGwnOiAnZW1wdHknLFxuICAgICAgICB9LFxuICAgICAgfSlcbiAgICApLFxuICAgIGZzLnByb21pc2VzLnJtKGRpclBhdGgsIHsgZm9yY2U6IHRydWUsIHJlY3Vyc2l2ZTogdHJ1ZSB9KSxcbiAgXSk7XG4gIGlmIChoYXNIdXNreURpcikge1xuICAgIGF3YWl0IFByb21pc2UuYWxsKFtcbiAgICAgIGZzLnByb21pc2VzLnJtKGh1c2t5RGlyUGF0aCwgeyBmb3JjZTogdHJ1ZSwgcmVjdXJzaXZlOiB0cnVlIH0pLFxuICAgICAgZnMucHJvbWlzZXMucm0ocGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnLmh1c2t5cmMuanNvbicpLCB7IGZvcmNlOiB0cnVlIH0pLFxuICAgIF0pO1xuICAgIHNwYXduU3luYygnZ2l0JywgWydjb25maWcnLCAnLS11bnNldCcsICdjb3JlLmhvb2tzUGF0aCddLCBjb25maWcuZGlyUGF0aCk7XG4gIH1cblxuICBpZiAobGludCkge1xuICAgIGNvbnN0IHByZVB1c2ggPSBnZXRQcmVQdXNoU2NyaXB0KGNvbmZpZyk7XG4gICAgZnMubWtkaXJTeW5jKHBhdGguam9pbihkaXJQYXRoLCAncHJlLXB1c2gnKSwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gICAgYXdhaXQgZnMucHJvbWlzZXMud3JpdGVGaWxlKHBhdGguam9pbihkaXJQYXRoLCAncHJlLXB1c2gnLCAnY2hlY2suc2gnKSwgcHJlUHVzaCArICdcXG4nLCB7XG4gICAgICBtb2RlOiAwbzc1NSxcbiAgICB9KTtcbiAgfVxuICBjb25zdCBwb3N0TWVyZ2VDb21tYW5kID0gYCR7c2NyaXB0cy5wb3N0TWVyZ2V9XFxuXFxuJHtnZW5lcmF0ZVBvc3RNZXJnZUNvbW1hbmRzKGNvbmZpZykuam9pbignXFxuJyl9XFxuYDtcbiAgZnMubWtkaXJTeW5jKHBhdGguam9pbihkaXJQYXRoLCAncG9zdC1tZXJnZScpLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgYXdhaXQgZnMucHJvbWlzZXMud3JpdGVGaWxlKHBhdGgucmVzb2x2ZShkaXJQYXRoLCAncG9zdC1tZXJnZScsICdwcmVwYXJlLnNoJyksIHBvc3RNZXJnZUNvbW1hbmQsIHtcbiAgICBtb2RlOiAwbzc1NSxcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIGdldFByZVB1c2hTY3JpcHQoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogc3RyaW5nIHtcbiAgbGV0IGxpbnRDb21tYW5kOiBzdHJpbmc7XG4gIGlmIChjb25maWcuaXNCdW4pIHtcbiAgICBsaW50Q29tbWFuZCA9IGNvbmZpZy5kZXBlbmRpbmcud2IgPyAnYnVuIC0tYnVuIHdiIGxpbnQnIDogJ2J1biBydW4gbGludCc7XG4gIH0gZWxzZSB7XG4gICAgbGludENvbW1hbmQgPSBjb25maWcuZGVwZW5kaW5nLndiID8gJ3lhcm4gd2IgbGludCcgOiAneWFybiBydW4gbGludCc7XG4gIH1cbiAgY29uc3QgcXVpZXRMaW50Q29tbWFuZCA9IGAke2xpbnRDb21tYW5kfSAtLXF1aWV0YDtcbiAgLy8gTm8gc2VwYXJhdGUgdHlwZWNoZWNrIHN0ZXAgbmVlZGVkIOKAlCB0aGUgbGludCBjb21tYW5kIGFscmVhZHkgaW5jbHVkZXMgdHlwZWNoZWNraW5nLlxuICBpZiAoY29uZmlnLnJlcG9zaXRvcnk/LnN0YXJ0c1dpdGgoJ2dpdGh1YjpXaWxsQm9vc3RlckxhYi8nKSkge1xuICAgIHJldHVybiBgXG4jIS9iaW4vYmFzaFxuXG5pZiBbICQoZ2l0IGJyYW5jaCAtLXNob3ctY3VycmVudCkgPSBcIm1haW5cIiBdICYmIFsgJChnaXQgY29uZmlnIHVzZXIuZW1haWwpICE9IFwiZXhrYXp1dUBnbWFpbC5jb21cIiBdOyB0aGVuXG4gIGVjaG8gXCIqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcIlxuICBlY2hvIFwiKioqIERvbid0IHB1c2ggbWFpbiBicmFuY2ggZGlyZWN0bHkuIFVzZSBQUiEgKioqXCJcbiAgZWNobyBcIioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlwiXG4gIGV4aXQgMVxuZmlcblxuJHtxdWlldExpbnRDb21tYW5kfVxuYC50cmltKCk7XG4gIH1cbiAgcmV0dXJuIHF1aWV0TGludENvbW1hbmQ7XG59XG5cbmZ1bmN0aW9uIGdldFByZUNvbW1pdEpvYnMoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogTGVmdGhvb2tKb2JbXSB7XG4gIHJldHVybiBwcmVDb21taXRTZXR0aW5ncy5qb2JzLm1hcCgoam9iKSA9PlxuICAgIGpvYi5uYW1lID09PSAnY2xlYW51cCdcbiAgICAgID8ge1xuICAgICAgICAgIC4uLmpvYixcbiAgICAgICAgICBnbG9iOiBnZXRDbGVhbnVwR2xvYnMoY29uZmlnKSxcbiAgICAgICAgICBydW46IGdldENsZWFudXBDb21tYW5kKGNvbmZpZyksXG4gICAgICAgIH1cbiAgICAgIDogam9iXG4gICk7XG59XG5cbmZ1bmN0aW9uIGdldENsZWFudXBHbG9icyhjb25maWc6IFBhY2thZ2VDb25maWcpOiBzdHJpbmcge1xuICAvLyBMZXQgYHdiIGxpbnQgLS1mb3JtYXRgIGRlY2lkZSB3aGV0aGVyIFByZXR0aWVyIGlzIGF2YWlsYWJsZTsgdGhlIGhvb2tcbiAgLy8gc3RpbGwgbmVlZHMgdG8gdHJpZ2dlciB3aGVuIGFkZGluZyB0aGUgZmlyc3QgcHJldHRpZXItb25seSBmaWxlLlxuICBjb25zdCBzdXBwb3J0ZWRFeHRlbnNpb25zID1cbiAgICBjb25maWcuaXNCdW4gfHwgY29uZmlnLmRlcGVuZGluZy53YiB8fCBkb2VzQ29udGFpbkphdmEoY29uZmlnKSA/IFsuLi5leHRlbnNpb25zLnByZXR0aWVyT25seV0gOiBbXTtcbiAgaWYgKGRvZXNDb250YWluSnNPclRzKGNvbmZpZykpIHtcbiAgICBzdXBwb3J0ZWRFeHRlbnNpb25zLnB1c2goLi4uZXh0ZW5zaW9ucy5veGZtdCwgLi4uZXh0ZW5zaW9ucy5veGxpbnQpO1xuICB9XG4gIGlmIChjb25maWcuZG9lc0NvbnRhaW5Qb2V0cnlMb2NrIHx8IGNvbmZpZy5kb2VzQ29udGFpblV2TG9jaykge1xuICAgIHN1cHBvcnRlZEV4dGVuc2lvbnMucHVzaCgncHknKTtcbiAgfVxuICBpZiAoY29uZmlnLmRvZXNDb250YWluUHVic3BlY1lhbWwpIHtcbiAgICBzdXBwb3J0ZWRFeHRlbnNpb25zLnB1c2goJ2RhcnQnKTtcbiAgfVxuICBjb25zdCBmaWx0ZXJlZEV4dGVuc2lvbnMgPSBbLi4ubmV3IFNldChzdXBwb3J0ZWRFeHRlbnNpb25zKV0udG9Tb3J0ZWQoKTtcbiAgcmV0dXJuIGAqKi8qLnske2ZpbHRlcmVkRXh0ZW5zaW9ucy5qb2luKCcsJyl9fWA7XG59XG5cbmZ1bmN0aW9uIGdldENsZWFudXBDb21tYW5kKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IHN0cmluZyB7XG4gIGlmIChoYXNMb2NhbFdiV29ya3NwYWNlKGNvbmZpZykpIHtcbiAgICByZXR1cm4gU3RyaW5nLnJhd2BcbiMgTGVmdGhvb2sgZXhwYW5kcyB7c3RhZ2VkX2ZpbGVzfSBhcyBzaGVsbC1lc2NhcGVkIGFyZ3MsIHNvIHBhdGhzIHdpdGggc3BhY2VzIHN0YXkgaW50YWN0LlxueWFybiB3b3Jrc3BhY2UgQHdpbGxib29zdGVyL3diIHN0YXJ0IC0td29ya2luZy1kaXIgXCIkKGdpdCByZXYtcGFyc2UgLS1zaG93LXRvcGxldmVsKVwiIGxpbnQgLS1maXggLS1mb3JtYXQgLS0ge3N0YWdlZF9maWxlc31cbmAudHJpbSgpO1xuICB9XG4gIGlmIChjb25maWcuaXNCdW4gfHwgY29uZmlnLmRlcGVuZGluZy53Yikge1xuICAgIGNvbnN0IHBhY2thZ2VNYW5hZ2VyID0gY29uZmlnLmlzQnVuID8gJ2J1bicgOiAneWFybic7XG4gICAgcmV0dXJuIGNvbmZpZy5kZXBlbmRpbmcud2JcbiAgICAgID8gYFxuIyBMZWZ0aG9vayBleHBhbmRzIHtzdGFnZWRfZmlsZXN9IGFzIHNoZWxsLWVzY2FwZWQgYXJncywgc28gcGF0aHMgd2l0aCBzcGFjZXMgc3RheSBpbnRhY3QuXG4ke2NvbmZpZy5pc0J1biA/ICdidW4gLS1idW4gd2InIDogJ3lhcm4gd2InfSBsaW50IC0tZml4IC0tZm9ybWF0IC0tIHtzdGFnZWRfZmlsZXN9XG5gLnRyaW0oKVxuICAgICAgOiBgJHtwYWNrYWdlTWFuYWdlcn0gcnVuIGZvcm1hdCAmJiAke3BhY2thZ2VNYW5hZ2VyfSBydW4gbGludC1maXhgO1xuICB9XG5cbiAgY29uc3Qgb3hsaW50UGF0dGVybiA9IGV4dGVuc2lvbnMub3hsaW50Lm1hcCgoZXh0ZW5zaW9uKSA9PiBTdHJpbmcucmF3YFxcLiR7ZXh0ZW5zaW9ufSRgKS5qb2luKCd8Jyk7XG4gIGNvbnN0IG94Zm10UGF0dGVybiA9IGV4dGVuc2lvbnMub3hmbXQubWFwKChleHRlbnNpb24pID0+IFN0cmluZy5yYXdgXFwuJHtleHRlbnNpb259JGApLmpvaW4oJ3wnKTtcbiAgY29uc3QgcHJldHRpZXJQYXR0ZXJuID0gZXh0ZW5zaW9ucy5wcmV0dGllck9ubHkubWFwKChleHRlbnNpb24pID0+IFN0cmluZy5yYXdgXFwuJHtleHRlbnNpb259JGApLmpvaW4oJ3wnKTtcbiAgY29uc3QgaGFzSnNPclRzID0gZG9lc0NvbnRhaW5Kc09yVHMoY29uZmlnKTtcbiAgY29uc3QgaGFzSmF2YSA9IGRvZXNDb250YWluSmF2YShjb25maWcpO1xuXG4gIHJldHVybiBTdHJpbmcucmF3YFxuIyBMZWZ0aG9vayBleHBhbmRzIHtzdGFnZWRfZmlsZXN9IGFzIHNoZWxsLWVzY2FwZWQgYXJncywgc28gcGF0aHMgd2l0aCBzcGFjZXMgc3RheSBpbnRhY3QuXG4ke2hhc0pzT3JUcyA/IFN0cmluZy5yYXdgb3hsaW50X2ZpbGVzPVwiJChwcmludGYgJyVzXFxuJyB7c3RhZ2VkX2ZpbGVzfSB8IGdyZXAgLUUgJygke294bGludFBhdHRlcm59KScgfHwgdHJ1ZSlcImAgOiAnJ31cbiR7aGFzSnNPclRzID8gU3RyaW5nLnJhd2BveGZtdF9maWxlcz1cIiQocHJpbnRmICclc1xcbicge3N0YWdlZF9maWxlc30gfCBncmVwIC1FICcoJHtveGZtdFBhdHRlcm59KScgfHwgdHJ1ZSlcImAgOiAnJ31cbiR7aGFzSmF2YSA/IFN0cmluZy5yYXdgcHJldHRpZXJfZmlsZXM9XCIkKHByaW50ZiAnJXNcXG4nIHtzdGFnZWRfZmlsZXN9IHwgZ3JlcCAtRSAnKCR7cHJldHRpZXJQYXR0ZXJufSknIHx8IHRydWUpXCJgIDogJyd9XG5wYWNrYWdlX2pzb25fZmlsZXM9XCIkKHByaW50ZiAnJXNcXG4nIHtzdGFnZWRfZmlsZXN9IHwgZ3JlcCAtRSAnKF58LylwYWNrYWdlXFwuanNvbiQnIHx8IHRydWUpXCJcbiR7aGFzUHl0aG9uUGFja2FnZU1hbmFnZXIoY29uZmlnKSA/IFN0cmluZy5yYXdgcHl0aG9uX2ZpbGVzPVwiJChwcmludGYgJyVzXFxuJyB7c3RhZ2VkX2ZpbGVzfSB8IGdyZXAgLUUgJ1xcLnB5JCcgfHwgdHJ1ZSlcImAgOiAnJ31cbiR7Y29uZmlnLmRvZXNDb250YWluUHVic3BlY1lhbWwgPyBTdHJpbmcucmF3YGRhcnRfZmlsZXM9XCIkKHByaW50ZiAnJXNcXG4nIHtzdGFnZWRfZmlsZXN9IHwgZ3JlcCAtRSAnXFwuZGFydCQnIHwgZ3JlcCAtdiAnZ2VuZXJhdGVkJyB8IGdyZXAgLXYgJ1xcLmZyZWV6ZWRcXC5kYXJ0JCcgfCBncmVwIC12ICdcXC5nXFwuZGFydCQnIHx8IHRydWUpXCJgIDogJyd9XG5cbiR7XG4gIGhhc0pzT3JUc1xuICAgID8gU3RyaW5nLnJhd2BcbmlmIFsgLW4gXCIkb3hmbXRfZmlsZXNcIiBdOyB0aGVuXG4gIG5vZGUgbm9kZV9tb2R1bGVzLy5iaW4vb3hmbXQgLS13cml0ZSAtLW5vLWVycm9yLW9uLXVubWF0Y2hlZC1wYXR0ZXJuICRveGZtdF9maWxlc1xuZmlcbmBcbiAgICA6ICcnXG59XG4ke1xuICBoYXNKYXZhXG4gICAgPyBTdHJpbmcucmF3YGlmIFsgLW4gXCIkcHJldHRpZXJfZmlsZXNcIiBdOyB0aGVuXG4gIG5vZGUgbm9kZV9tb2R1bGVzLy5iaW4vcHJldHRpZXIgLS1jYWNoZSAtLXdyaXRlIC0taWdub3JlLXVua25vd24gLS0gJHByZXR0aWVyX2ZpbGVzXG5maWBcbiAgICA6ICcnXG59XG4ke1xuICBoYXNKc09yVHNcbiAgICA/IFN0cmluZy5yYXdgXG5pZiBbIC1uIFwiJG94bGludF9maWxlc1wiIF07IHRoZW5cbiAgbm9kZSBub2RlX21vZHVsZXMvLmJpbi9veGxpbnQgLS1maXggJG94bGludF9maWxlc1xuZmlcbmBcbiAgICA6ICcnXG59XG5pZiBbIC1uIFwiJHBhY2thZ2VfanNvbl9maWxlc1wiIF07IHRoZW5cbiAgbm9kZSBub2RlX21vZHVsZXMvLmJpbi9zb3J0LXBhY2thZ2UtanNvbiAtLSAkcGFja2FnZV9qc29uX2ZpbGVzXG5maVxuJHtcbiAgaGFzUHl0aG9uUGFja2FnZU1hbmFnZXIoY29uZmlnKVxuICAgID8gYGlmIFsgLW4gXCIkcHl0aG9uX2ZpbGVzXCIgXTsgdGhlblxuICAke2dldFB5dGhvblJ1bm5lcihjb25maWcpfSBpc29ydCAtLXByb2ZpbGUgYmxhY2sgLS1maWx0ZXItZmlsZXMgJHB5dGhvbl9maWxlc1xuICAke2dldFB5dGhvblJ1bm5lcihjb25maWcpfSBibGFjayAkcHl0aG9uX2ZpbGVzXG4gICR7Z2V0UHl0aG9uUnVubmVyKGNvbmZpZyl9IGZsYWtlOCAkcHl0aG9uX2ZpbGVzXG5maWBcbiAgICA6ICcnXG59XG4ke1xuICBjb25maWcuZG9lc0NvbnRhaW5QdWJzcGVjWWFtbFxuICAgID8gYGlmIFsgLW4gXCIkZGFydF9maWxlc1wiIF07IHRoZW5cbiAgZGFydCBmb3JtYXQgJGRhcnRfZmlsZXNcbmZpYFxuICAgIDogJydcbn1cbmAudHJpbSgpO1xufVxuXG5mdW5jdGlvbiBoYXNMb2NhbFdiV29ya3NwYWNlKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IGJvb2xlYW4ge1xuICBpZiAoIWNvbmZpZy5pc1Jvb3QpIHJldHVybiBmYWxzZTtcblxuICBjb25zdCBsb2NhbFdiUGFja2FnZUpzb25QYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAncGFja2FnZXMnLCAnd2InLCAncGFja2FnZS5qc29uJyk7XG4gIGlmICghZnMuZXhpc3RzU3luYyhsb2NhbFdiUGFja2FnZUpzb25QYXRoKSkgcmV0dXJuIGZhbHNlO1xuXG4gIHRyeSB7XG4gICAgY29uc3QgcGFja2FnZUpzb24gPSBKU09OLnBhcnNlKGZzLnJlYWRGaWxlU3luYyhsb2NhbFdiUGFja2FnZUpzb25QYXRoLCAndXRmOCcpKSBhcyB7IG5hbWU/OiBzdHJpbmcgfTtcbiAgICByZXR1cm4gcGFja2FnZUpzb24ubmFtZSA9PT0gJ0B3aWxsYm9vc3Rlci93Yic7XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxufVxuXG5mdW5jdGlvbiBnZW5lcmF0ZVBvc3RNZXJnZUNvbW1hbmRzKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IHN0cmluZ1tdIHtcbiAgY29uc3QgcG9zdE1lcmdlQ29tbWFuZHM6IHN0cmluZ1tdID0gW107XG4gIGlmIChjb25maWcuaGFzVmVyc2lvblNldHRpbmdzKSB7XG4gICAgY29uc3QgdG9vbHNDaGFuZ2VkUGF0dGVybiA9IFN0cmluZy5yYXdgKG1pc2VcXC50b21sfFxcLm1pc2VcXC50b21sfFxcLnRvb2wtdmVyc2lvbnN8XFwuListdmVyc2lvbilgO1xuICAgIHBvc3RNZXJnZUNvbW1hbmRzLnB1c2goU3RyaW5nLnJhd2BydW5faWZfY2hhbmdlZCBcIiR7dG9vbHNDaGFuZ2VkUGF0dGVybn1cIiBcIm1pc2UgaW5zdGFsbFwiYCk7XG4gIH1cbiAgY29uc3QgaW5zdGFsbENvbW1hbmQgPSBjb25maWcuaXNCdW4gPyAnYnVuIGluc3RhbGwnIDogJ3lhcm4nO1xuICBjb25zdCBybU5leHREaXJlY3RvcnkgPSBjb25maWcuZGVwZW5kaW5nLmJsaXR6IHx8IGNvbmZpZy5kZXBlbmRpbmcubmV4dCA/ICcgJiYgcm0gLVJmIC5uZXh0JyA6ICcnO1xuICBwb3N0TWVyZ2VDb21tYW5kcy5wdXNoKFN0cmluZy5yYXdgcnVuX2lmX2NoYW5nZWQgXCJwYWNrYWdlXFwuanNvblwiIFwiJHtpbnN0YWxsQ29tbWFuZH0ke3JtTmV4dERpcmVjdG9yeX1cImApO1xuICBpZiAoY29uZmlnLmRvZXNDb250YWluUG9ldHJ5TG9jaykge1xuICAgIHBvc3RNZXJnZUNvbW1hbmRzLnB1c2goU3RyaW5nLnJhd2BydW5faWZfY2hhbmdlZCBcInBvZXRyeVxcLmxvY2tcIiBcInBvZXRyeSBpbnN0YWxsXCJgKTtcbiAgfVxuICBpZiAoY29uZmlnLmRvZXNDb250YWluVXZMb2NrKSB7XG4gICAgcG9zdE1lcmdlQ29tbWFuZHMucHVzaChTdHJpbmcucmF3YHJ1bl9pZl9jaGFuZ2VkIFwidXZcXC5sb2NrXCIgXCJ1diBzeW5jIC0tZnJvemVuXCJgKTtcbiAgfVxuICBpZiAoY29uZmlnLmRlcGVuZGluZy5ibGl0eikge1xuICAgIHBvc3RNZXJnZUNvbW1hbmRzLnB1c2goXG4gICAgICBTdHJpbmcucmF3YHJ1bl9pZl9jaGFuZ2VkIFwiLipcXC5wcmlzbWFcIiBcIm5vZGUgbm9kZV9tb2R1bGVzLy5iaW4vYmxpdHogcHJpc21hIG1pZ3JhdGUgZGVwbG95XCJgLFxuICAgICAgU3RyaW5nLnJhd2BydW5faWZfY2hhbmdlZCBcIi4qXFwucHJpc21hXCIgXCJub2RlIG5vZGVfbW9kdWxlcy8uYmluL2JsaXR6IHByaXNtYSBnZW5lcmF0ZVwiYCxcbiAgICAgIFN0cmluZy5yYXdgcnVuX2lmX2NoYW5nZWQgXCIuKlxcLnByaXNtYVwiIFwibm9kZSBub2RlX21vZHVsZXMvLmJpbi9ibGl0eiBjb2RlZ2VuXCJgXG4gICAgKTtcbiAgfSBlbHNlIGlmIChjb25maWcuZGVwZW5kaW5nLnByaXNtYSkge1xuICAgIHBvc3RNZXJnZUNvbW1hbmRzLnB1c2goXG4gICAgICBTdHJpbmcucmF3YHJ1bl9pZl9jaGFuZ2VkIFwiLipcXC5wcmlzbWFcIiBcIm5vZGUgbm9kZV9tb2R1bGVzLy5iaW4vZG90ZW52IC1jIGRldmVsb3BtZW50IC0tIG5vZGUgbm9kZV9tb2R1bGVzLy5iaW4vcHJpc21hIG1pZ3JhdGUgZGVwbG95XCJgLFxuICAgICAgU3RyaW5nLnJhd2BydW5faWZfY2hhbmdlZCBcIi4qXFwucHJpc21hXCIgXCJub2RlIG5vZGVfbW9kdWxlcy8uYmluL2RvdGVudiAtYyBkZXZlbG9wbWVudCAtLSBub2RlIG5vZGVfbW9kdWxlcy8uYmluL3ByaXNtYSBnZW5lcmF0ZVwiYFxuICAgICk7XG4gIH1cbiAgY29uc3QgZ2VuSTE4blRzQ29tbWFuZCA9IGdldEdlbkkxOG5Uc0NvbW1hbmQoY29uZmlnLCBjb25maWcucGFja2FnZUpzb24/LnNjcmlwdHMpO1xuICBpZiAoZ2VuSTE4blRzQ29tbWFuZCkge1xuICAgIC8vIGdlbi1pMThuLXRzIG91dHB1dHMgYXJlIGNvbW1vbmx5IGlnbm9yZWQsIHNvIHBvc3QtbWVyZ2UgcmVnZW5lcmF0ZXMgdGhlbSBhZnRlciBwdWxsZWQgcmVzb3VyY2UgY2hhbmdlcy5cbiAgICBwb3N0TWVyZ2VDb21tYW5kcy5wdXNoKFN0cmluZy5yYXdgcnVuX2lmX2NoYW5nZWQgXCIoXnwvKWkxOG4vLipcXC5qc29uJFwiIFwiJHtnZW5JMThuVHNDb21tYW5kfVwiYCk7XG4gIH1cbiAgcmV0dXJuIHBvc3RNZXJnZUNvbW1hbmRzO1xufVxuXG5mdW5jdGlvbiBoYXNQeXRob25QYWNrYWdlTWFuYWdlcihjb25maWc6IFBhY2thZ2VDb25maWcpOiBib29sZWFuIHtcbiAgcmV0dXJuIGNvbmZpZy5kb2VzQ29udGFpblBvZXRyeUxvY2sgfHwgY29uZmlnLmRvZXNDb250YWluVXZMb2NrO1xufVxuXG5mdW5jdGlvbiBnZXRQeXRob25SdW5uZXIoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogJ3BvZXRyeSBydW4nIHwgJ3V2IHJ1bicge1xuICByZXR1cm4gY29uZmlnLmRvZXNDb250YWluVXZMb2NrID8gJ3V2IHJ1bicgOiAncG9ldHJ5IHJ1bic7XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVMaW50c3RhZ2VkcmMoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZ2VuZXJhdGVMaW50c3RhZ2VkcmMnLCBhc3luYyAoKSA9PiB7XG4gICAgYXdhaXQgUHJvbWlzZS5hbGwoW1xuICAgICAgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzLnByb21pc2VzLnJtKGAke2NvbmZpZy5kaXJQYXRofS8ubGludHN0YWdlZHJjLmNqc2AsIHsgZm9yY2U6IHRydWUgfSkpLFxuICAgICAgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzLnByb21pc2VzLnJtKGAke2NvbmZpZy5kaXJQYXRofS8ubGludHN0YWdlZHJjLmpzYCwgeyBmb3JjZTogdHJ1ZSB9KSksXG4gICAgICBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnMucHJvbWlzZXMucm0oYCR7Y29uZmlnLmRpclBhdGh9Ly5saW50c3RhZ2VkcmMuanNvbmAsIHsgZm9yY2U6IHRydWUgfSkpLFxuICAgIF0pO1xuICB9KTtcbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGZzVXRpbCB9IGZyb20gJy4uL3V0aWxzL2ZzVXRpbC5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlT3hmbXRDb25maWcoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZ2VuZXJhdGVPeGZtdENvbmZpZycsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBsZWdhY3lDb25maWdQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnLm94Zm10cmMuanNvbicpO1xuICAgIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnb3hmbXQuY29uZmlnLnRzJyk7XG4gICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzLnByb21pc2VzLnJtKGxlZ2FjeUNvbmZpZ1BhdGgsIHsgZm9yY2U6IHRydWUgfSkpO1xuICAgIGlmIChmcy5leGlzdHNTeW5jKGZpbGVQYXRoKSkgcmV0dXJuO1xuICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiBmc1V0aWwuZ2VuZXJhdGVGaWxlKGZpbGVQYXRoLCBjb25maWdDb250ZW50KSk7XG4gIH0pO1xufVxuXG5jb25zdCBjb25maWdDb250ZW50ID0gYGltcG9ydCBjb25maWcgZnJvbSAnQHdpbGxib29zdGVyL294Zm10LWNvbmZpZyc7XG5cbmV4cG9ydCBkZWZhdWx0IGNvbmZpZztcbmA7XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBmc1V0aWwgfSBmcm9tICcuLi91dGlscy9mc1V0aWwuanMnO1xuaW1wb3J0IHsgcHJvbWlzZVBvb2wgfSBmcm9tICcuLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5pbXBvcnQgeyBpc1B1Ymxpc2hlZFdpbGxib29zdGVyQ29uZmlnc1BhY2thZ2UgfSBmcm9tICcuLi91dGlscy93aWxsYm9vc3RlckNvbmZpZ3NVdGlsLmpzJztcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlT3hsaW50Q29uZmlnKGNvbmZpZzogUGFja2FnZUNvbmZpZywgX3Jvb3RDb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdnZW5lcmF0ZU94bGludENvbmZpZycsIGFzeW5jICgpID0+IHtcbiAgICAvLyB3aWxsYm9vc3Rlci1jb25maWdzIHB1Ymxpc2hlcyBjb25maWcgZmlsZXMgYXMgcHJvZHVjdCBjb2RlLCBzbyBtaWdyYXRpb25cbiAgICAvLyBtdXN0IG5vdCByZW1vdmUgcGFja2FnZS1wcm92aWRlZCBsaW50ZXIgc2V0dGluZ3MuXG4gICAgY29uc3Qgc2hvdWxkUHJlc2VydmVQdWJsaXNoZWRMaW50ZXJDb25maWcgPSBpc1B1Ymxpc2hlZFdpbGxib29zdGVyQ29uZmlnc1BhY2thZ2UoY29uZmlnKTtcbiAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJ294bGludC5jb25maWcudHMnKTtcbiAgICBjb25zdCBleGlzdGluZ0NvbnRlbnQgPSBmcy5leGlzdHNTeW5jKGZpbGVQYXRoKSA/IGZzLnJlYWRGaWxlU3luYyhmaWxlUGF0aCwgJ3V0ZjgnKSA6IHVuZGVmaW5lZDtcblxuICAgIGNvbnN0IHByb21pc2VzOiBQcm9taXNlPHZvaWQ+W10gPSBbXTtcbiAgICBpZiAoIXNob3VsZFByZXNlcnZlUHVibGlzaGVkTGludGVyQ29uZmlnKSB7XG4gICAgICBwcm9taXNlcy5wdXNoKFxuICAgICAgICBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnMucHJvbWlzZXMucm0ocGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnLm94bGludHJjLmpzb24nKSwgeyBmb3JjZTogdHJ1ZSB9KSksXG4gICAgICAgIHByb21pc2VQb29sLnJ1bigoKSA9PiBmcy5wcm9taXNlcy5ybShwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICdiaW9tZS5qc29uJyksIHsgZm9yY2U6IHRydWUgfSkpLFxuICAgICAgICBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnMucHJvbWlzZXMucm0ocGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnYmlvbWUuanNvbmMnKSwgeyBmb3JjZTogdHJ1ZSB9KSksXG4gICAgICAgIHByb21pc2VQb29sLnJ1bigoKSA9PiBmcy5wcm9taXNlcy5ybShwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICcuZXNsaW50cmMnKSwgeyBmb3JjZTogdHJ1ZSB9KSksXG4gICAgICAgIHByb21pc2VQb29sLnJ1bigoKSA9PiBmcy5wcm9taXNlcy5ybShwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICcuZXNsaW50cmMuY2pzJyksIHsgZm9yY2U6IHRydWUgfSkpLFxuICAgICAgICBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnMucHJvbWlzZXMucm0ocGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnLmVzbGludHJjLmpzJyksIHsgZm9yY2U6IHRydWUgfSkpLFxuICAgICAgICBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnMucHJvbWlzZXMucm0ocGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnLmVzbGludHJjLmpzb24nKSwgeyBmb3JjZTogdHJ1ZSB9KSksXG4gICAgICAgIHByb21pc2VQb29sLnJ1bigoKSA9PiBmcy5wcm9taXNlcy5ybShwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICcuZXNsaW50cmMueWFtbCcpLCB7IGZvcmNlOiB0cnVlIH0pKSxcbiAgICAgICAgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzLnByb21pc2VzLnJtKHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJy5lc2xpbnRyYy55bWwnKSwgeyBmb3JjZTogdHJ1ZSB9KSksXG4gICAgICAgIHByb21pc2VQb29sLnJ1bigoKSA9PiBmcy5wcm9taXNlcy5ybShwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICdlc2xpbnQuY29uZmlnLmNqcycpLCB7IGZvcmNlOiB0cnVlIH0pKSxcbiAgICAgICAgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzLnByb21pc2VzLnJtKHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJ2VzbGludC5jb25maWcuanMnKSwgeyBmb3JjZTogdHJ1ZSB9KSksXG4gICAgICAgIHByb21pc2VQb29sLnJ1bigoKSA9PiBmcy5wcm9taXNlcy5ybShwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICdlc2xpbnQuY29uZmlnLm1qcycpLCB7IGZvcmNlOiB0cnVlIH0pKSxcbiAgICAgICAgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzLnByb21pc2VzLnJtKHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJ2VzbGludC5jb25maWcudHMnKSwgeyBmb3JjZTogdHJ1ZSB9KSlcbiAgICAgICk7XG4gICAgfVxuICAgIGlmICghZXhpc3RpbmdDb250ZW50KSB7XG4gICAgICBwcm9taXNlcy5wdXNoKHByb21pc2VQb29sLnJ1bigoKSA9PiBmc1V0aWwuZ2VuZXJhdGVGaWxlKGZpbGVQYXRoLCBjb25maWdDb250ZW50KSkpO1xuICAgIH1cbiAgICBhd2FpdCBQcm9taXNlLmFsbChwcm9taXNlcyk7XG4gIH0pO1xufVxuXG5jb25zdCBjb25maWdDb250ZW50ID0gYGltcG9ydCBjb25maWcgZnJvbSAnQHdpbGxib29zdGVyL294bGludC1jb25maWcnO1xuXG5leHBvcnQgZGVmYXVsdCBjb25maWc7XG5gO1xuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZnNVdGlsIH0gZnJvbSAnLi4vdXRpbHMvZnNVdGlsLmpzJztcbmltcG9ydCB7IGlnbm9yZUZpbGVVdGlsIH0gZnJvbSAnLi4vdXRpbHMvaWdub3JlRmlsZVV0aWwuanMnO1xuaW1wb3J0IHsgZG9lc0NvbnRhaW5KYXZhIH0gZnJvbSAnLi4vdXRpbHMvcGFja2FnZUNhcGFiaWxpdGllcy5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcblxuY29uc3QgY29tbW9uQ29udGVudCA9IGBcbjNyZC1wYXJ0eS9cbmFuZHJvaWQvXG5pb3MvXG5uby1mb3JtYXQvXG50ZXN0LWZpeHR1cmVzL1xudGVzdC9maXh0dXJlcy9cbiouZC50c1xuKi5taW4uanNcbi55YXJuL1xuLnBucC5qc1xuYDtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlUHJldHRpZXJpZ25vcmUoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZ2VuZXJhdGVQcmV0dGllcmlnbm9yZScsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJy5wcmV0dGllcmlnbm9yZScpO1xuICAgIGlmICghZG9lc0NvbnRhaW5KYXZhKGNvbmZpZykpIHtcbiAgICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiBmcy5wcm9taXNlcy5ybShmaWxlUGF0aCwgeyBmb3JjZTogdHJ1ZSB9KSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IGNvbnRlbnQgPSAoYXdhaXQgZnNVdGlsLnJlYWRGaWxlSWdub3JpbmdFcnJvcihmaWxlUGF0aCkpID8/ICcnO1xuICAgIGNvbnN0IGhlYWRVc2VyQ29udGVudCA9IGlnbm9yZUZpbGVVdGlsLmdldEhlYWRVc2VyQ29udGVudChjb250ZW50KTtcbiAgICBjb25zdCB0YWlsVXNlckNvbnRlbnQgPSBpZ25vcmVGaWxlVXRpbC5nZXRUYWlsVXNlckNvbnRlbnQoY29udGVudCk7XG5cbiAgICBjb25zdCBnaXRpZ25vcmVGaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJy5naXRpZ25vcmUnKTtcbiAgICBjb25zdCBnaXRpZ25vcmVDb250ZW50ID0gKGF3YWl0IGlnbm9yZUZpbGVVdGlsLnJlYWRHaXRpZ25vcmVXaXRob3V0U2VwYXJhdG9ycyhnaXRpZ25vcmVGaWxlUGF0aCkpIHx8ICcnO1xuXG4gICAgbGV0IGFkZGl0aW9uYWxDb250ZW50ID0gJyc7XG4gICAgaWYgKGNvbmZpZy5kb2VzQ29udGFpblB1YnNwZWNZYW1sKSB7XG4gICAgICBhZGRpdGlvbmFsQ29udGVudCA9IGBcbmFuZHJvaWQvYXBwL1xuaW9zL1J1bm5lci9Bc3NldHMueGNhc3NldHMvXG5wdWJzcGVjLnlhbWxcbmA7XG4gICAgfVxuXG4gICAgY29uc3QgbmV3Q29udGVudCA9IGhlYWRVc2VyQ29udGVudCArIGNvbW1vbkNvbnRlbnQgKyBhZGRpdGlvbmFsQ29udGVudCArIGdpdGlnbm9yZUNvbnRlbnQgKyB0YWlsVXNlckNvbnRlbnQ7XG4gICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzVXRpbC5nZW5lcmF0ZUZpbGUoZmlsZVBhdGgsIG5ld0NvbnRlbnQpKTtcbiAgfSk7XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgbWVyZ2UgZnJvbSAnZGVlcG1lcmdlJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZnNVdGlsIH0gZnJvbSAnLi4vdXRpbHMvZnNVdGlsLmpzJztcbmltcG9ydCB7IG92ZXJ3cml0ZU1lcmdlIH0gZnJvbSAnLi4vdXRpbHMvbWVyZ2VVdGlsLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuXG5jb25zdCBqc29uT2JqID0ge1xuICB2ZW52UGF0aDogJy4nLFxuICB2ZW52OiAnLnZlbnYnLFxufTtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlUHlyaWdodENvbmZpZ0pzb24oY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZ2VuZXJhdGVQeXJpZ2h0Q29uZmlnSnNvbicsIGFzeW5jICgpID0+IHtcbiAgICBsZXQgbmV3U2V0dGluZ3M6IG9iamVjdCA9IHN0cnVjdHVyZWRDbG9uZShqc29uT2JqKTtcbiAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJ3B5cmlnaHRjb25maWcuanNvbicpO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBvbGRDb250ZW50ID0gYXdhaXQgZnMucHJvbWlzZXMucmVhZEZpbGUoZmlsZVBhdGgsICd1dGY4Jyk7XG4gICAgICBjb25zdCBvbGRTZXR0aW5ncyA9IEpTT04ucGFyc2Uob2xkQ29udGVudCkgYXMgb2JqZWN0O1xuICAgICAgbmV3U2V0dGluZ3MgPSBtZXJnZS5hbGwoW25ld1NldHRpbmdzLCBvbGRTZXR0aW5ncywgbmV3U2V0dGluZ3NdLCB7IGFycmF5TWVyZ2U6IG92ZXJ3cml0ZU1lcmdlIH0pO1xuICAgIH0gY2F0Y2gge1xuICAgICAgLy8gZG8gbm90aGluZ1xuICAgIH1cbiAgICBjb25zdCBuZXdDb250ZW50ID0gSlNPTi5zdHJpbmdpZnkobmV3U2V0dGluZ3MsIHVuZGVmaW5lZCwgMik7XG4gICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzVXRpbC5nZW5lcmF0ZUZpbGUoZmlsZVBhdGgsIG5ld0NvbnRlbnQpKTtcbiAgfSk7XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBmc1V0aWwgfSBmcm9tICcuLi91dGlscy9mc1V0aWwuanMnO1xuaW1wb3J0IHsgcHJvbWlzZVBvb2wgfSBmcm9tICcuLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5cbmNvbnN0IHNlbWFudGljUmVsZWFzZUJhZGdlID1cbiAgJ1shW3NlbWFudGljLXJlbGVhc2VdKGh0dHBzOi8vaW1nLnNoaWVsZHMuaW8vYmFkZ2UvJTIwJTIwJUYwJTlGJTkzJUE2JUYwJTlGJTlBJTgwLXNlbWFudGljLS1yZWxlYXNlLWUxMDA3OS5zdmcpXShodHRwczovL2dpdGh1Yi5jb20vc2VtYW50aWMtcmVsZWFzZS9zZW1hbnRpYy1yZWxlYXNlKSc7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZW5lcmF0ZVJlYWRtZShjb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdnZW5lcmF0ZVJlYWRtZScsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJ1JFQURNRS5tZCcpO1xuICAgIGxldCBuZXdDb250ZW50ID0gYXdhaXQgZnMucHJvbWlzZXMucmVhZEZpbGUoZmlsZVBhdGgsICd1dGY4Jyk7XG5cbiAgICBpZiAoZnMuZXhpc3RzU3luYyhwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICcucmVsZWFzZXJjLmpzb24nKSkpIHtcbiAgICAgIG5ld0NvbnRlbnQgPSBpbnNlcnRCYWRnZShuZXdDb250ZW50LCBzZW1hbnRpY1JlbGVhc2VCYWRnZSk7XG4gICAgfVxuXG4gICAgY29uc3QgcmVwb3NpdG9yeSA9IGNvbmZpZy5yZXBvc2l0b3J5Py5zbGljZShjb25maWcucmVwb3NpdG9yeS5pbmRleE9mKCc6JykgKyAxKTtcbiAgICBjb25zdCBmaWxlTmFtZXMgPSBmcy5yZWFkZGlyU3luYyhgJHtjb25maWcuZGlyUGF0aH0vLmdpdGh1Yi93b3JrZmxvd3NgKTtcbiAgICBmb3IgKGNvbnN0IGZpbGVOYW1lIG9mIGZpbGVOYW1lcykge1xuICAgICAgaWYgKCFmaWxlTmFtZS5zdGFydHNXaXRoKCd0ZXN0JykgJiYgIWZpbGVOYW1lLnN0YXJ0c1dpdGgoJ2RlcGxveScpKSBjb250aW51ZTtcblxuICAgICAgbGV0IGJhZGdlTmFtZSA9IGZpbGVOYW1lO1xuICAgICAgYmFkZ2VOYW1lID0gKGJhZGdlTmFtZVswXSB8fCAnJykudG9VcHBlckNhc2UoKSArIGJhZGdlTmFtZS5zbGljZSgxLCBiYWRnZU5hbWUuaW5kZXhPZignLicpKTtcbiAgICAgIGJhZGdlTmFtZSA9IGJhZGdlTmFtZS5yZXBsYWNlKCctJywgJyAnKTtcbiAgICAgIGlmICghcmVwb3NpdG9yeSkgY29udGludWU7XG4gICAgICBjb25zdCBiYWRnZSA9IGBbIVske2JhZGdlTmFtZX1dKGh0dHBzOi8vZ2l0aHViLmNvbS8ke3JlcG9zaXRvcnl9L2FjdGlvbnMvd29ya2Zsb3dzLyR7ZmlsZU5hbWV9L2JhZGdlLnN2ZyldKGh0dHBzOi8vZ2l0aHViLmNvbS8ke3JlcG9zaXRvcnl9L2FjdGlvbnMvd29ya2Zsb3dzLyR7ZmlsZU5hbWV9KWA7XG4gICAgICBpZiAoZnMuZXhpc3RzU3luYyhwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsIGAuZ2l0aHViL3dvcmtmbG93cy8ke2ZpbGVOYW1lfWApKSkge1xuICAgICAgICBuZXdDb250ZW50ID0gaW5zZXJ0QmFkZ2UobmV3Q29udGVudCwgYmFkZ2UpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiBmc1V0aWwuZ2VuZXJhdGVGaWxlKGZpbGVQYXRoLCBuZXdDb250ZW50KSk7XG4gIH0pO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaW5zZXJ0QmFkZ2UocmVhZG1lOiBzdHJpbmcsIGJhZGdlOiBzdHJpbmcpOiBzdHJpbmcge1xuICAvLyDml6LjgatiYWRnZeOBjOOBguOCi+WgtOWQiOOBr+WJiumZpFxuICByZWFkbWUgPSByZWFkbWUucmVwbGFjZShiYWRnZSwgJycpLnJlcGxhY2VBbGwoL1xcblxcblxcbisvZywgJ1xcblxcbicpO1xuXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgcmVhZG1lLmxlbmd0aDsgaSsrKSB7XG4gICAgaWYgKHJlYWRtZVtpIC0gMV0gPT09ICdcXG4nICYmIHJlYWRtZVtpXSA9PT0gJ1xcbicpIHtcbiAgICAgIGNvbnN0IGJlZm9yZSA9IHJlYWRtZS5zbGljZSgwLCBpICsgMSk7XG4gICAgICBsZXQgYWZ0ZXIgPSByZWFkbWUuc2xpY2UoaSArIDEpO1xuICAgICAgaWYgKCFhZnRlci5zdGFydHNXaXRoKCdbJykgJiYgIWFmdGVyLnN0YXJ0c1dpdGgoJyEnKSkge1xuICAgICAgICBhZnRlciA9IGBcXG4ke2FmdGVyfWA7XG4gICAgICB9XG4gICAgICByZXR1cm4gYCR7YmVmb3JlfSR7YmFkZ2V9XFxuJHthZnRlcn1gO1xuICAgIH1cbiAgfVxuICByZXR1cm4gYCR7cmVhZG1lfVxcbiR7YmFkZ2V9XFxuYDtcbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCBtZXJnZSBmcm9tICdkZWVwbWVyZ2UnO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBmc1V0aWwgfSBmcm9tICcuLi91dGlscy9mc1V0aWwuanMnO1xuaW1wb3J0IHsgb3ZlcndyaXRlTWVyZ2UgfSBmcm9tICcuLi91dGlscy9tZXJnZVV0aWwuanMnO1xuaW1wb3J0IHsgcHJvbWlzZVBvb2wgfSBmcm9tICcuLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZW5lcmF0ZVJlbGVhc2VyYyhyb290Q29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZ2VuZXJhdGVSZWxlYXNlcmMnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLnJlc29sdmUocm9vdENvbmZpZy5kaXJQYXRoLCAnLnJlbGVhc2VyYy5qc29uJyk7XG4gICAgaWYgKCFmcy5leGlzdHNTeW5jKGZpbGVQYXRoKSkgcmV0dXJuO1xuXG4gICAgY29uc3Qgc2V0dGluZ3MgPSBKU09OLnBhcnNlKGF3YWl0IGZzLnByb21pc2VzLnJlYWRGaWxlKGZpbGVQYXRoLCAndXRmOCcpKSBhcyB7XG4gICAgICBwbHVnaW5zPzogKHN0cmluZyB8IFtzdHJpbmcsIHVua25vd25dKVtdO1xuICAgIH07XG4gICAgY29uc3QgcGx1Z2lucyA9IHNldHRpbmdzLnBsdWdpbnMgPz8gW107XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwbHVnaW5zLmxlbmd0aDsgaSsrKSB7XG4gICAgICBjb25zdCBwbHVnaW5FbnRyeSA9IHBsdWdpbnNbaV07XG4gICAgICBjb25zdCBpc0FycmF5ID0gQXJyYXkuaXNBcnJheShwbHVnaW5FbnRyeSk7XG4gICAgICBjb25zdCBwbHVnaW4gPSBpc0FycmF5ID8gcGx1Z2luRW50cnlbMF0gOiBwbHVnaW5FbnRyeTtcbiAgICAgIGNvbnN0IG9sZENvbmZpZyA9IChpc0FycmF5ICYmIHBsdWdpbkVudHJ5WzFdKSB8fCB7fTtcbiAgICAgIGlmIChwbHVnaW4gPT09ICdAc2VtYW50aWMtcmVsZWFzZS9jb21taXQtYW5hbHl6ZXInKSB7XG4gICAgICAgIHBsdWdpbnNbaV0gPSBbXG4gICAgICAgICAgJ0BzZW1hbnRpYy1yZWxlYXNlL2NvbW1pdC1hbmFseXplcicsXG4gICAgICAgICAgbWVyZ2UuYWxsKFxuICAgICAgICAgICAgW1xuICAgICAgICAgICAgICBvbGRDb25maWcsXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBwcmVzZXQ6ICdjb252ZW50aW9uYWxjb21taXRzJyxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICB7IGFycmF5TWVyZ2U6IG92ZXJ3cml0ZU1lcmdlIH1cbiAgICAgICAgICApLFxuICAgICAgICBdO1xuICAgICAgfSBlbHNlIGlmIChwbHVnaW4gPT09ICdAc2VtYW50aWMtcmVsZWFzZS9naXRodWInKSB7XG4gICAgICAgIHBsdWdpbnNbaV0gPSBbXG4gICAgICAgICAgJ0BzZW1hbnRpYy1yZWxlYXNlL2dpdGh1YicsXG4gICAgICAgICAgbWVyZ2UuYWxsKFxuICAgICAgICAgICAgW1xuICAgICAgICAgICAgICBvbGRDb25maWcsXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAvLyBjZi4gaHR0cHM6Ly9naXRodWIuY29tL3NlbWFudGljLXJlbGVhc2Uvc2VtYW50aWMtcmVsZWFzZS9pc3N1ZXMvMjIwNCNpc3N1ZWNvbW1lbnQtMTUwODQxNzcwNFxuICAgICAgICAgICAgICAgIHN1Y2Nlc3NDb21tZW50Q29uZGl0aW9uOiBmYWxzZSxcbiAgICAgICAgICAgICAgICBmYWlsQ29tbWVudENvbmRpdGlvbjogZmFsc2UsXG4gICAgICAgICAgICAgICAgbGFiZWxzOiBbJ3I6IHNlbWFudGljLXJlbGVhc2UnXSxcbiAgICAgICAgICAgICAgICByZWxlYXNlZExhYmVsczogWydyZWxlYXNlZCA6Ym9va21hcms6J10sXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgeyBhcnJheU1lcmdlOiBvdmVyd3JpdGVNZXJnZSB9XG4gICAgICAgICAgKSxcbiAgICAgICAgXTtcbiAgICAgIH1cbiAgICB9XG4gICAgY29uc3QgbmV3Q29udGVudCA9IEpTT04uc3RyaW5naWZ5KHNldHRpbmdzLCB1bmRlZmluZWQsIDIpO1xuICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiBmc1V0aWwuZ2VuZXJhdGVGaWxlKGZpbGVQYXRoLCBuZXdDb250ZW50KSk7XG4gIH0pO1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IG1lcmdlIGZyb20gJ2RlZXBtZXJnZSc7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGZzVXRpbCB9IGZyb20gJy4uL3V0aWxzL2ZzVXRpbC5qcyc7XG5pbXBvcnQgeyBvdmVyd3JpdGVNZXJnZSB9IGZyb20gJy4uL3V0aWxzL21lcmdlVXRpbC5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcblxuY29uc3QganNvbk9iaiA9IHtcbiAgJHNjaGVtYTogJ2h0dHBzOi8vZG9jcy5yZW5vdmF0ZWJvdC5jb20vcmVub3ZhdGUtc2NoZW1hLmpzb24nLFxuICBleHRlbmRzOiBbJ2dpdGh1Yj5XaWxsQm9vc3Rlci93aWxsYm9vc3Rlci1jb25maWdzOnJlbm92YXRlLmpzb241J10sXG59O1xuXG50eXBlIFNldHRpbmdzID0gdHlwZW9mIGpzb25PYmogJiB7IHBhY2thZ2VSdWxlcz86IHsgbWF0Y2hQYWNrYWdlTmFtZXM6IHN0cmluZ1tdOyBlbmFibGVkPzogYm9vbGVhbiB9W10gfTtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlUmVub3ZhdGVKc29uKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2dlbmVyYXRlUmVub3ZhdGVKc29uJywgYXN5bmMgKCkgPT4ge1xuICAgIGxldCBuZXdTZXR0aW5ncyA9IHN0cnVjdHVyZWRDbG9uZShqc29uT2JqKSBhcyBTZXR0aW5ncztcbiAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJ3Jlbm92YXRlLmpzb24nKTtcbiAgICBpZiAoZnMuZXhpc3RzU3luYyhgJHtmaWxlUGF0aH01YCkpIHtcbiAgICAgIC8vIFNpbmNlIGl0IGlzIGRpZmZpY3VsdCBmb3IgcGFyc2luZyByZW5vdmF0ZS5qc29uNSwgd2UgZG8gbm90aGluZ1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0cnkge1xuICAgICAgY29uc3Qgb2xkQ29udGVudCA9IGF3YWl0IGZzLnByb21pc2VzLnJlYWRGaWxlKGZpbGVQYXRoLCAndXRmOCcpO1xuICAgICAgY29uc3Qgb2xkU2V0dGluZ3MgPSBKU09OLnBhcnNlKG9sZENvbnRlbnQpIGFzIFNldHRpbmdzO1xuICAgICAgbmV3U2V0dGluZ3MgPSBtZXJnZS5hbGwoW25ld1NldHRpbmdzLCBvbGRTZXR0aW5ncywgbmV3U2V0dGluZ3NdLCB7XG4gICAgICAgIGFycmF5TWVyZ2U6IG92ZXJ3cml0ZU1lcmdlLFxuICAgICAgfSkgYXMgU2V0dGluZ3M7XG4gICAgICBuZXdTZXR0aW5ncy5leHRlbmRzID0gbmV3U2V0dGluZ3MuZXh0ZW5kcy5maWx0ZXIoKGl0ZW06IHN0cmluZykgPT4gaXRlbSAhPT0gJ0B3aWxsYm9vc3RlcicpO1xuICAgIH0gY2F0Y2gge1xuICAgICAgLy8gZG8gbm90aGluZ1xuICAgIH1cblxuICAgIC8vIERvbid0IHVwZ3JhZGUgTmV4dC5qcyBhdXRvbWF0aWNhbGx5XG4gICAgaWYgKGNvbmZpZy5kZXBlbmRpbmcuYmxpdHopIHtcbiAgICAgIG5ld1NldHRpbmdzLnBhY2thZ2VSdWxlcyA/Pz0gW107XG4gICAgICBpZiAoXG4gICAgICAgICFuZXdTZXR0aW5ncy5wYWNrYWdlUnVsZXMuc29tZSgocnVsZTogeyBtYXRjaFBhY2thZ2VOYW1lcz86IHN0cmluZ1tdIH0pID0+XG4gICAgICAgICAgcnVsZS5tYXRjaFBhY2thZ2VOYW1lcz8uaW5jbHVkZXMoJ25leHQnKVxuICAgICAgICApXG4gICAgICApIHtcbiAgICAgICAgbmV3U2V0dGluZ3MucGFja2FnZVJ1bGVzLnB1c2goeyBtYXRjaFBhY2thZ2VOYW1lczogWyduZXh0J10sIGVuYWJsZWQ6IGZhbHNlIH0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiBmcy5wcm9taXNlcy5ybShwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICcuZGVwZW5kYWJvdCcpLCB7IGZvcmNlOiB0cnVlIH0pKTtcbiAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnMucHJvbWlzZXMucm0ocGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnLnJlbm92YXRlcmMuanNvbicpLCB7IGZvcmNlOiB0cnVlIH0pKTtcbiAgICBjb25zdCBuZXdDb250ZW50ID0gSlNPTi5zdHJpbmdpZnkobmV3U2V0dGluZ3MsIHVuZGVmaW5lZCwgMik7XG4gICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzVXRpbC5nZW5lcmF0ZUZpbGUoZmlsZVBhdGgsIG5ld0NvbnRlbnQpKTtcbiAgfSk7XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcy9wcm9taXNlcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBpbnN0YWxsQWdlbnRTa2lsbHMocm9vdENvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2luc3RhbGxBZ2VudFNraWxscycsIGFzeW5jICgpID0+IHtcbiAgICAvLyBUT0RPOiBXZSBhcmUgdGVtcG9yYXJpbHkgcmVtb3ZpbmcgYWdlbnQgc2tpbGxzIGZyb20gdGhlIHJlcG9cbiAgICAvLyBhd2FpdCBydW5JbnN0YWxsQWdlbnRTa2lsbHMocm9vdENvbmZpZyk7XG4gICAgYXdhaXQgUHJvbWlzZS5hbGwoW1xuICAgICAgZnMucm0ocGF0aC5yZXNvbHZlKHJvb3RDb25maWcuZGlyUGF0aCwgJy5hZ2VudHMnKSwge1xuICAgICAgICBmb3JjZTogdHJ1ZSxcbiAgICAgICAgcmVjdXJzaXZlOiB0cnVlLFxuICAgICAgfSksXG4gICAgICBmcy5ybShwYXRoLnJlc29sdmUocm9vdENvbmZpZy5kaXJQYXRoLCAnLmNsYXVkZScpLCB7XG4gICAgICAgIGZvcmNlOiB0cnVlLFxuICAgICAgICByZWN1cnNpdmU6IHRydWUsXG4gICAgICB9KSxcbiAgICAgIGZzLnJtKHBhdGgucmVzb2x2ZShyb290Q29uZmlnLmRpclBhdGgsICdza2lsbHMtbG9jay5qc29uJyksIHtcbiAgICAgICAgZm9yY2U6IHRydWUsXG4gICAgICB9KSxcbiAgICBdKTtcbiAgfSk7XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgbWVyZ2UgZnJvbSAnZGVlcG1lcmdlJztcbmltcG9ydCB0eXBlIHsgVHNDb25maWdKc29uIH0gZnJvbSAndHlwZS1mZXN0JztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZnNVdGlsIH0gZnJvbSAnLi4vdXRpbHMvZnNVdGlsLmpzJztcbmltcG9ydCB7IGNvbWJpbmVNZXJnZSB9IGZyb20gJy4uL3V0aWxzL21lcmdlVXRpbC5qcyc7XG5pbXBvcnQgeyBzb3J0S2V5cyB9IGZyb20gJy4uL3V0aWxzL29iamVjdFV0aWwuanMnO1xuaW1wb3J0IHsgcHJvbWlzZVBvb2wgfSBmcm9tICcuLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5pbXBvcnQgeyBnZXRUc2NvbmZpZ0V4dGVuZHMgfSBmcm9tICcuLi91dGlscy90c2NvbmZpZ0Jhc2UuanMnO1xuXG5jb25zdCByb290SnNvbk9iaiA9IHtcbiAgY29tcGlsZXJPcHRpb25zOiB7XG4gICAgYWx3YXlzU3RyaWN0OiB0cnVlLFxuICAgIG5vVW5jaGVja2VkSW5kZXhlZEFjY2VzczogdHJ1ZSwgLy8gZm9yIEB0eXBlc2NyaXB0LWVzbGludC9wcmVmZXItbnVsbGlzaC1jb2FsZXNjaW5nXG4gICAgYWxsb3dTeW50aGV0aWNEZWZhdWx0SW1wb3J0czogdHJ1ZSwgLy8gYWxsb3cgYGltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCdgXG4gICAgZXNNb2R1bGVJbnRlcm9wOiB0cnVlLCAvLyBhbGxvdyBkZWZhdWx0IGltcG9ydCBmcm9tIENvbW1vbkpTL0FNRC9VTUQgbW9kdWxlc1xuICAgIHJlc29sdmVKc29uTW9kdWxlOiB0cnVlLCAvLyBhbGxvdyB0byBpbXBvcnQgSlNPTiBmaWxlc1xuICAgIGltcG9ydEhlbHBlcnM6IGZhbHNlLFxuICAgIG5vRW1pdDogdHJ1ZSxcbiAgfSxcbiAgZXhjbHVkZTogWydwYWNrYWdlcy8qL3Rlc3QvZml4dHVyZXMnLCAndGVzdC9maXh0dXJlcyddLFxuICBpbmNsdWRlOiBbXG4gICAgJyouY29uZmlnLnRzJyxcbiAgICAncGFja2FnZXMvKi8qLmNvbmZpZy50cycsXG4gICAgJ3BhY2thZ2VzLyovc2NyaXB0cy8qKi8qJyxcbiAgICAncGFja2FnZXMvKi9zcmMvKiovKicsXG4gICAgJ3BhY2thZ2VzLyovdGVzdC8qKi8qJyxcbiAgICAnc2NyaXB0cy8qKi8qJyxcbiAgICAnc3JjLyoqLyonLFxuICAgICd0ZXN0LyoqLyonLFxuICBdLFxufTtcblxuY29uc3Qgc3ViSnNvbk9iaiA9IHtcbiAgY29tcGlsZXJPcHRpb25zOiB7XG4gICAgYWx3YXlzU3RyaWN0OiB0cnVlLFxuICAgIG5vVW5jaGVja2VkSW5kZXhlZEFjY2VzczogdHJ1ZSwgLy8gZm9yIEB0eXBlc2NyaXB0LWVzbGludC9wcmVmZXItbnVsbGlzaC1jb2FsZXNjaW5nXG4gICAgYWxsb3dTeW50aGV0aWNEZWZhdWx0SW1wb3J0czogdHJ1ZSwgLy8gYWxsb3cgYGltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCdgXG4gICAgZXNNb2R1bGVJbnRlcm9wOiB0cnVlLCAvLyBhbGxvdyBkZWZhdWx0IGltcG9ydCBmcm9tIENvbW1vbkpTL0FNRC9VTUQgbW9kdWxlc1xuICAgIHJlc29sdmVKc29uTW9kdWxlOiB0cnVlLCAvLyBhbGxvdyB0byBpbXBvcnQgSlNPTiBmaWxlc1xuICAgIGltcG9ydEhlbHBlcnM6IGZhbHNlLFxuICAgIG5vRW1pdDogdHJ1ZSxcbiAgfSxcbiAgZXhjbHVkZTogWyd0ZXN0L2ZpeHR1cmVzJ10sXG4gIC8vIHdiZnkgZ2VuZXJhdGVzIHJvb3QtbGV2ZWwgdG9vbCBjb25maWdzIHN1Y2ggYXMgcGxheXdyaWdodC5jb25maWcudHMsIGFuZFxuICAvLyB0eXBlLWF3YXJlIGxpbnRpbmcgbmVlZHMgdGhvc2UgZmlsZXMgaW4gdGhlIHByb2plY3QgdG8gc2VlIE5vZGUvQnVuIGdsb2JhbHMuXG4gIGluY2x1ZGU6IFsnKi5jb25maWcudHMnLCAnc2NyaXB0cy8qKi8qJywgJ3NyYy8qKi8qJywgJ3Rlc3QvKiovKiddLFxufTtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlVHNjb25maWcoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZ2VuZXJhdGVUc2NvbmZpZycsIGFzeW5jICgpID0+IHtcbiAgICBpZiAoY29uZmlnLmRlcGVuZGluZy5ibGl0eiB8fCBjb25maWcuZGVwZW5kaW5nLm5leHQpIHtcbiAgICAgIGF3YWl0IGNsZWFudXBMZWdhY3lUc2NvbmZpZ01vZHVsZVNldHRpbmdzKGNvbmZpZyk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgbGV0IG5ld1NldHRpbmdzID0gc3RydWN0dXJlZENsb25lKGNvbmZpZy5pc1Jvb3QgPyByb290SnNvbk9iaiA6IHN1Ykpzb25PYmopIGFzIFRzQ29uZmlnSnNvbjtcbiAgICBjb25zdCBnZW5lcmF0ZWRUeXBlcyA9IGdldEdlbmVyYXRlZFR5cGVzKGNvbmZpZyk7XG4gICAgbmV3U2V0dGluZ3MuZXh0ZW5kcyA9IGdldFRzY29uZmlnRXh0ZW5kcyhjb25maWcpO1xuICAgIG5ld1NldHRpbmdzLmNvbXBpbGVyT3B0aW9ucyA/Pz0ge307XG4gICAgbmV3U2V0dGluZ3MuY29tcGlsZXJPcHRpb25zLnJvb3REaXIgPSBnZXRSb290RGlyKGNvbmZpZyk7XG4gICAgaWYgKGdlbmVyYXRlZFR5cGVzLmxlbmd0aCA+IDApIHtcbiAgICAgIG5ld1NldHRpbmdzLmNvbXBpbGVyT3B0aW9ucyA9IHsgLi4ubmV3U2V0dGluZ3MuY29tcGlsZXJPcHRpb25zLCB0eXBlczogZ2VuZXJhdGVkVHlwZXMgfTtcbiAgICB9XG4gICAgaWYgKCFjb25maWcuZG9lc0NvbnRhaW5Kc3hPclRzeCAmJiAhY29uZmlnLmRvZXNDb250YWluSnN4T3JUc3hJblBhY2thZ2VzKSB7XG4gICAgICBkZWxldGUgbmV3U2V0dGluZ3MuY29tcGlsZXJPcHRpb25zPy5qc3g7XG4gICAgfSBlbHNlIGlmICghY29uZmlnLmlzQnVuICYmICFjb25maWcuZGVwZW5kaW5nLnJlYWN0TmF0aXZlKSB7XG4gICAgICBuZXdTZXR0aW5ncy5jb21waWxlck9wdGlvbnMgPSB7IC4uLm5ld1NldHRpbmdzLmNvbXBpbGVyT3B0aW9ucywganN4OiAncmVhY3QtanN4JyB9O1xuICAgIH1cbiAgICBpZiAoY29uZmlnLmlzUm9vdCAmJiAhY29uZmlnLmRvZXNDb250YWluU3ViUGFja2FnZUpzb25zKSB7XG4gICAgICBuZXdTZXR0aW5ncy5pbmNsdWRlID0gbmV3U2V0dGluZ3MuaW5jbHVkZT8uZmlsdGVyKChkaXJQYXRoOiBzdHJpbmcpID0+ICFkaXJQYXRoLnN0YXJ0c1dpdGgoJ3BhY2thZ2VzLyovJykpO1xuICAgICAgbmV3U2V0dGluZ3MuZXhjbHVkZSA9IG5ld1NldHRpbmdzLmV4Y2x1ZGU/LmZpbHRlcigoZGlyUGF0aDogc3RyaW5nKSA9PiAhZGlyUGF0aC5zdGFydHNXaXRoKCdwYWNrYWdlcy8qLycpKTtcbiAgICB9XG4gICAgaWYgKGNvbmZpZy5kZXBlbmRpbmcucHJpc21hKSB7XG4gICAgICAvLyBQcmlzbWEgc2VlZHMgYW5kIG1pZ3JhdGlvbiBoZWxwZXIgc2NyaXB0cyBvZnRlbiBsaXZlIG91dHNpZGUgc3JjLCBidXRcbiAgICAgIC8vIHR5cGUtYXdhcmUgbGludGluZyBzdGlsbCBuZWVkcyB0aGVtIGNvdmVyZWQgYnkgdGhlIHByb2plY3QgY29uZmlnLlxuICAgICAgYWRkSW5jbHVkZVBhdGgobmV3U2V0dGluZ3MsICdwcmlzbWEvKiovKicpO1xuICAgIH1cblxuICAgIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAndHNjb25maWcuanNvbicpO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBleGlzdGluZ0NvbnRlbnQgPSBhd2FpdCBmcy5wcm9taXNlcy5yZWFkRmlsZShmaWxlUGF0aCwgJ3V0ZjgnKTtcbiAgICAgIGNvbnN0IG9sZFNldHRpbmdzID0gSlNPTi5wYXJzZShleGlzdGluZ0NvbnRlbnQpIGFzIFRzQ29uZmlnSnNvbjtcbiAgICAgIGNvbnN0IGV4aXN0aW5nVHlwZXMgPSBub3JtYWxpemVTdHJpbmdBcnJheShvbGRTZXR0aW5ncy5jb21waWxlck9wdGlvbnM/LnR5cGVzKTtcbiAgICAgIGNvbnN0IGV4aXN0aW5nRW1pdE1ldGFkYXRhID0gcGlja0V4aXN0aW5nRW1pdE1ldGFkYXRhKG9sZFNldHRpbmdzLmNvbXBpbGVyT3B0aW9ucyk7XG4gICAgICBuZXdTZXR0aW5ncy5leHRlbmRzID0gbWVyZ2VUc2NvbmZpZ0V4dGVuZHMobmV3U2V0dGluZ3MuZXh0ZW5kcywgb2xkU2V0dGluZ3MuZXh0ZW5kcyk7XG4gICAgICBkZWxldGUgb2xkU2V0dGluZ3MuZXh0ZW5kcztcbiAgICAgIGRlbGV0ZSBvbGRTZXR0aW5ncy5jb21waWxlck9wdGlvbnM/LmpzeDtcbiAgICAgIG5ld1NldHRpbmdzID0gbWVyZ2UuYWxsKFtuZXdTZXR0aW5ncywgb2xkU2V0dGluZ3MsIG5ld1NldHRpbmdzXSwgeyBhcnJheU1lcmdlOiBjb21iaW5lTWVyZ2UgfSk7XG4gICAgICBuZXdTZXR0aW5ncy5pbmNsdWRlID0gbmV3U2V0dGluZ3MuaW5jbHVkZT8uZmlsdGVyKFxuICAgICAgICAoZGlyUGF0aDogc3RyaW5nKSA9PlxuICAgICAgICAgICFkaXJQYXRoLmluY2x1ZGVzKCdAdHlwZXMnKSAmJiAhZGlyUGF0aC5pbmNsdWRlcygnX190ZXN0c19fLycpICYmICFkaXJQYXRoLmluY2x1ZGVzKCd0ZXN0cy8nKVxuICAgICAgKTtcbiAgICAgIG5ld1NldHRpbmdzLmNvbXBpbGVyT3B0aW9ucyA/Pz0ge307XG4gICAgICAvLyB3YmZ5LWdlbmVyYXRlZCB0c2NvbmZpZy5qc29uIGlzIGEgbGludC90eXBlY2hlY2sgcHJvamVjdCwgbm90IHRoZSBlbWl0XG4gICAgICAvLyBjb250cmFjdC4gSXQgbXVzdCBrZWVwIHJvb3REaXIgYnJvYWQgZW5vdWdoIGZvciByb290IGNvbmZpZyBmaWxlcyxcbiAgICAgIC8vIHNjcmlwdHMsIHNyYywgYW5kIHRlc3RzLiBidWlsZC10cyBvd25zIGVtaXQgYW5kIGNyZWF0ZXMgYSB0ZW1wb3JhcnlcbiAgICAgIC8vIHNyYy1vbmx5IHRzY29uZmlnIHdpdGggbm9FbWl0PWZhbHNlLCBlbWl0RGVjbGFyYXRpb25Pbmx5PXRydWUsXG4gICAgICAvLyByb290RGlyPVwic3JjXCIsIGFuZCBpbmNsdWRlPVtcInNyYy8qKi8qXCJdLCBzbyBwcmVzZXJ2aW5nIG5vRW1pdD1mYWxzZSBvclxuICAgICAgLy8gcm9vdERpcj1cInNyY1wiIGhlcmUgd291bGQgb25seSBicmVhayBub24tc3JjIHR5cGUtYXdhcmUgbGludCBjb3ZlcmFnZS5cbiAgICAgIG5ld1NldHRpbmdzLmNvbXBpbGVyT3B0aW9ucyA9IHsgLi4ubmV3U2V0dGluZ3MuY29tcGlsZXJPcHRpb25zLCAuLi5leGlzdGluZ0VtaXRNZXRhZGF0YSB9O1xuICAgICAgZW5zdXJlVHNFeHRlbnNpb25FbWl0Q29tcGF0aWJpbGl0eShuZXdTZXR0aW5ncy5jb21waWxlck9wdGlvbnMpO1xuXG4gICAgICBjb25zdCBtZXJnZWRUeXBlcyA9IFsuLi5uZXcgU2V0KFsuLi5maWx0ZXJFeGlzdGluZ1R5cGVzKGV4aXN0aW5nVHlwZXMsIGdlbmVyYXRlZFR5cGVzKSwgLi4uZ2VuZXJhdGVkVHlwZXNdKV07XG4gICAgICBpZiAobWVyZ2VkVHlwZXMubGVuZ3RoID4gMCkge1xuICAgICAgICBuZXdTZXR0aW5ncy5jb21waWxlck9wdGlvbnMudHlwZXMgPSBtZXJnZWRUeXBlcztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGRlbGV0ZSBuZXdTZXR0aW5ncy5jb21waWxlck9wdGlvbnMudHlwZXM7XG4gICAgICB9XG4gICAgICBpZiAoc2hvdWxkRGVsZXRlVHlwZVJvb3RzKGdlbmVyYXRlZFR5cGVzKSkge1xuICAgICAgICBkZWxldGUgbmV3U2V0dGluZ3MuY29tcGlsZXJPcHRpb25zLnR5cGVSb290cztcbiAgICAgIH1cbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIGRvIG5vdGhpbmdcbiAgICB9XG4gICAgc29ydEtleXMobmV3U2V0dGluZ3MpO1xuICAgIG5ld1NldHRpbmdzLmluY2x1ZGU/LnNvcnQoKTtcbiAgICAvLyBEb24ndCB1c2Ugb2xkIGRlY29yYXRvclxuICAgIGRlbGV0ZSBuZXdTZXR0aW5ncy5jb21waWxlck9wdGlvbnM/LmV4cGVyaW1lbnRhbERlY29yYXRvcnM7XG4gICAgLy8gUGFja2FnZSBpbXBvcnRzIHNob3VsZCByZXNvbHZlIHRocm91Z2ggcGFja2FnZSBleHBvcnRzIGluc3RlYWQgb2YgYmFzZVVybC5cbiAgICAvLyBwYXRocyBpcyBpbnRlbnRpb25hbGx5IHByZXNlcnZlZCBzbyByZXBvLWxvY2FsIHRvb2xpbmcgY2FuIGtlZXAgZXhwbGljaXRcbiAgICAvLyBhbGlhc2VzIHdpdGhvdXQgcmVseWluZyBvbiBiYXNlVXJsJ3MgYnJvYWQgZmFsbGJhY2sgcmVzb2x1dGlvbi5cbiAgICBkZWxldGUgbmV3U2V0dGluZ3MuY29tcGlsZXJPcHRpb25zPy5iYXNlVXJsO1xuICAgIGRlbGV0ZUxlZ2FjeU1vZHVsZVNldHRpbmdzKG5ld1NldHRpbmdzLmNvbXBpbGVyT3B0aW9ucywgY29uZmlnKTtcbiAgICBpZiAoY29uZmlnLmRlcGVuZGluZy5yZWFjdE5hdGl2ZSkge1xuICAgICAgZGVsZXRlIG5ld1NldHRpbmdzLmNvbXBpbGVyT3B0aW9ucz8udmVyYmF0aW1Nb2R1bGVTeW50YXg7XG4gICAgfVxuICAgIGNvbnN0IG5ld0NvbnRlbnQgPSBKU09OLnN0cmluZ2lmeShuZXdTZXR0aW5ncywgdW5kZWZpbmVkLCAyKTtcbiAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnNVdGlsLmdlbmVyYXRlRmlsZShmaWxlUGF0aCwgbmV3Q29udGVudCkpO1xuICB9KTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gY2xlYW51cExlZ2FjeVRzY29uZmlnTW9kdWxlU2V0dGluZ3MoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAndHNjb25maWcuanNvbicpO1xuICB0cnkge1xuICAgIGNvbnN0IHNldHRpbmdzID0gSlNPTi5wYXJzZShhd2FpdCBmcy5wcm9taXNlcy5yZWFkRmlsZShmaWxlUGF0aCwgJ3V0ZjgnKSkgYXMgVHNDb25maWdKc29uO1xuICAgIG5vcm1hbGl6ZU5leHRUc2NvbmZpZ01vZHVsZVNldHRpbmdzKHNldHRpbmdzLmNvbXBpbGVyT3B0aW9ucyk7XG4gICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzVXRpbC5nZW5lcmF0ZUZpbGUoZmlsZVBhdGgsIEpTT04uc3RyaW5naWZ5KHNldHRpbmdzLCB1bmRlZmluZWQsIDIpKSk7XG4gIH0gY2F0Y2gge1xuICAgIC8vIE5leHQvQmxpdHogb3duIHRoZWlyIHRzY29uZmlnIHNoYXBlLCBidXQgVHlwZVNjcmlwdCA2IG5vIGxvbmdlciBhY2NlcHRzXG4gICAgLy8gbm9kZTEwIHJlc29sdmVyIHNwZWxsaW5ncyB0aGF0IG9sZGVyIHByb2plY3RzIGNvbW1vbmx5IGluaGVyaXRlZC5cbiAgfVxufVxuXG5mdW5jdGlvbiBub3JtYWxpemVOZXh0VHNjb25maWdNb2R1bGVTZXR0aW5ncyhjb21waWxlck9wdGlvbnM6IFRzQ29uZmlnSnNvbi5Db21waWxlck9wdGlvbnMgfCB1bmRlZmluZWQpOiB2b2lkIHtcbiAgaWYgKCFjb21waWxlck9wdGlvbnMpIHJldHVybjtcbiAgaWYgKFxuICAgIGNvbXBpbGVyT3B0aW9ucy5tb2R1bGVSZXNvbHV0aW9uID09PSAnbm9kZScgfHxcbiAgICBjb21waWxlck9wdGlvbnMubW9kdWxlUmVzb2x1dGlvbiA9PT0gJ05vZGUnIHx8XG4gICAgY29tcGlsZXJPcHRpb25zLm1vZHVsZVJlc29sdXRpb24gPT09ICdub2RlMTAnIHx8XG4gICAgY29tcGlsZXJPcHRpb25zLm1vZHVsZVJlc29sdXRpb24gPT09IHVuZGVmaW5lZFxuICApIHtcbiAgICAvLyBOZXh0LmpzIHdyaXRlcyBcIm5vZGVcIiBkdXJpbmcgYnVpbGQgd2hlbiB0aGlzIG9wdGlvbiBpcyBtaXNzaW5nLCBidXRcbiAgICAvLyB0c2dvbGludCB0cmVhdHMgdGhhdCBzcGVsbGluZyBhcyB0aGUgcmVtb3ZlZCBub2RlMTAgcmVzb2x2ZXIuXG4gICAgY29tcGlsZXJPcHRpb25zLm1vZHVsZVJlc29sdXRpb24gPSAnYnVuZGxlcic7XG4gIH1cbn1cblxuZnVuY3Rpb24gZ2V0Um9vdERpcihjb25maWc6IFBhY2thZ2VDb25maWcpOiBzdHJpbmcge1xuICBpZiAoY29uZmlnLmlzUm9vdCkgcmV0dXJuICcuJztcbiAgcmV0dXJuIGZzLmV4aXN0c1N5bmMocGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnLi4nLCAnLi4nLCAncGFja2FnZS5qc29uJykpID8gJy4uLy4uJyA6ICcuJztcbn1cblxuZnVuY3Rpb24gbWVyZ2VUc2NvbmZpZ0V4dGVuZHMoXG4gIGdlbmVyYXRlZEV4dGVuZHM6IFRzQ29uZmlnSnNvblsnZXh0ZW5kcyddLFxuICBleGlzdGluZ0V4dGVuZHM6IFRzQ29uZmlnSnNvblsnZXh0ZW5kcyddXG4pOiBUc0NvbmZpZ0pzb25bJ2V4dGVuZHMnXSB7XG4gIGNvbnN0IG1lcmdlZEV4dGVuZHMgPSBbLi4ubm9ybWFsaXplRXh0ZW5kcyhnZW5lcmF0ZWRFeHRlbmRzKSwgLi4ubm9ybWFsaXplRXh0ZW5kcyhleGlzdGluZ0V4dGVuZHMpXTtcbiAgY29uc3QgdW5pcXVlRXh0ZW5kcyA9IFsuLi5uZXcgU2V0KG1lcmdlZEV4dGVuZHMpXTtcbiAgaWYgKHVuaXF1ZUV4dGVuZHMubGVuZ3RoID09PSAwKSByZXR1cm4gdW5kZWZpbmVkO1xuICBpZiAodW5pcXVlRXh0ZW5kcy5sZW5ndGggPT09IDEpIHJldHVybiB1bmlxdWVFeHRlbmRzWzBdO1xuICByZXR1cm4gdW5pcXVlRXh0ZW5kcztcbn1cblxuZnVuY3Rpb24gYWRkSW5jbHVkZVBhdGgoc2V0dGluZ3M6IFRzQ29uZmlnSnNvbiwgZGlyUGF0aDogc3RyaW5nKTogdm9pZCB7XG4gIHNldHRpbmdzLmluY2x1ZGUgPz89IFtdO1xuICBpZiAoIXNldHRpbmdzLmluY2x1ZGUuaW5jbHVkZXMoZGlyUGF0aCkpIHtcbiAgICBzZXR0aW5ncy5pbmNsdWRlLnB1c2goZGlyUGF0aCk7XG4gIH1cbn1cblxuZnVuY3Rpb24gbm9ybWFsaXplRXh0ZW5kcyh2YWx1ZTogVHNDb25maWdKc29uWydleHRlbmRzJ10pOiBzdHJpbmdbXSB7XG4gIGlmICghdmFsdWUpIHJldHVybiBbXTtcbiAgcmV0dXJuIEFycmF5LmlzQXJyYXkodmFsdWUpID8gdmFsdWUgOiBbdmFsdWVdO1xufVxuXG5mdW5jdGlvbiBub3JtYWxpemVTdHJpbmdBcnJheSh2YWx1ZTogdW5rbm93bik6IHN0cmluZ1tdIHtcbiAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycpIHJldHVybiBbdmFsdWVdO1xuICBpZiAoIUFycmF5LmlzQXJyYXkodmFsdWUpKSByZXR1cm4gW107XG4gIHJldHVybiB2YWx1ZS5maWx0ZXIoKGl0ZW0pOiBpdGVtIGlzIHN0cmluZyA9PiB0eXBlb2YgaXRlbSA9PT0gJ3N0cmluZycpO1xufVxuXG5mdW5jdGlvbiBzaG91bGREZWxldGVUeXBlUm9vdHModHlwZU5hbWVzOiBzdHJpbmdbXSk6IGJvb2xlYW4ge1xuICAvLyBPbmx5IGdlbmVyYXRlZCBwYWNrYWdlLW93bmVkIHRlc3QgdHlwZXMgc2hvdWxkIHRyaWdnZXIgdGhpcy4gVXNlci1kZWZpbmVkIHNsYXNoLWJhc2VkXG4gIC8vIGVudHJpZXMgbWF5IGludGVudGlvbmFsbHkgcmVseSBvbiBjdXN0b20gdHlwZVJvb3RzIGFuZCBzaG91bGQgYmUgcHJlc2VydmVkIGFzLWlzLlxuICByZXR1cm4gdHlwZU5hbWVzLnNvbWUoKHR5cGVOYW1lKSA9PiB0eXBlTmFtZSA9PT0gJ2N5cHJlc3MnIHx8IHR5cGVOYW1lLmluY2x1ZGVzKCcvJykpO1xufVxuXG5mdW5jdGlvbiBmaWx0ZXJFeGlzdGluZ1R5cGVzKGV4aXN0aW5nVHlwZXM6IHN0cmluZ1tdLCBnZW5lcmF0ZWRUeXBlczogc3RyaW5nW10pOiBzdHJpbmdbXSB7XG4gIGNvbnN0IGdlbmVyYXRlZFR5cGVTZXQgPSBuZXcgU2V0KGdlbmVyYXRlZFR5cGVzKTtcbiAgcmV0dXJuIGV4aXN0aW5nVHlwZXMuZmlsdGVyKCh0eXBlTmFtZSkgPT4ge1xuICAgIC8vIHdiZnkgb3ducyB0aGVzZSBwYWNrYWdlLXByb3ZpZGVkIHRlc3QgZ2xvYmFscy4gRHJvcCBzdGFsZSBlbnRyaWVzIHdoZW4gdGhlXG4gICAgLy8gY29ycmVzcG9uZGluZyBkZXBlbmRlbmN5IGlzIG5vIGxvbmdlciBwcmVzZW50IHNvIFR5cGVTY3JpcHQgd29uJ3QgcmVxdWlyZVxuICAgIC8vIG1pc3NpbmcgcGFja2FnZXMgc3VjaCBhcyB2aXRlc3QuXG4gICAgaWYgKGlzR2VuZXJhdGVkVGVzdEdsb2JhbFR5cGUodHlwZU5hbWUpICYmICFnZW5lcmF0ZWRUeXBlU2V0Lmhhcyh0eXBlTmFtZSkpIHJldHVybiBmYWxzZTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIGlzR2VuZXJhdGVkVGVzdEdsb2JhbFR5cGUodHlwZU5hbWU6IHN0cmluZyk6IGJvb2xlYW4ge1xuICByZXR1cm4gdHlwZU5hbWUgPT09ICdjeXByZXNzJyB8fCB0eXBlTmFtZSA9PT0gJ2plc3QnIHx8IHR5cGVOYW1lID09PSAnbW9jaGEnIHx8IHR5cGVOYW1lID09PSAndml0ZXN0L2dsb2JhbHMnO1xufVxuXG5mdW5jdGlvbiBlbnN1cmVUc0V4dGVuc2lvbkVtaXRDb21wYXRpYmlsaXR5KGNvbXBpbGVyT3B0aW9uczogVHNDb25maWdKc29uLkNvbXBpbGVyT3B0aW9ucyB8IHVuZGVmaW5lZCk6IHZvaWQge1xuICBpZiAoIWNvbXBpbGVyT3B0aW9ucykgcmV0dXJuO1xuICBpZiAoY29tcGlsZXJPcHRpb25zLm5vRW1pdCAhPT0gZmFsc2UgfHwgY29tcGlsZXJPcHRpb25zLmVtaXREZWNsYXJhdGlvbk9ubHkgPT09IHRydWUpIHJldHVybjtcblxuICAvLyBAdHNjb25maWcvYnVuIGVuYWJsZXMgYWxsb3dJbXBvcnRpbmdUc0V4dGVuc2lvbnMsIHdoaWNoIFR5cGVTY3JpcHQgcGVybWl0c1xuICAvLyBkdXJpbmcgZW1pdCBvbmx5IHdoZW4gcmVsYXRpdmUgVFMgZXh0ZW5zaW9ucyBhcmUgcmV3cml0dGVuLlxuICBjb21waWxlck9wdGlvbnMucmV3cml0ZVJlbGF0aXZlSW1wb3J0RXh0ZW5zaW9ucyA9IHRydWU7XG59XG5cbmZ1bmN0aW9uIGRlbGV0ZUxlZ2FjeU1vZHVsZVNldHRpbmdzKFxuICBjb21waWxlck9wdGlvbnM6IFRzQ29uZmlnSnNvbi5Db21waWxlck9wdGlvbnMgfCB1bmRlZmluZWQsXG4gIGNvbmZpZzogUGFja2FnZUNvbmZpZ1xuKTogdm9pZCB7XG4gIGlmICghY29tcGlsZXJPcHRpb25zKSByZXR1cm47XG5cbiAgLy8gVHlwZVNjcmlwdCA2IHJlbW92ZWQgdGhlIG9sZCBub2RlMTAgcmVzb2x2ZXIgc3BlbGxpbmcsIHNvIGluaGVyaXRlZCBiYXNlIGNvbmZpZ3NcbiAgLy8gc2hvdWxkIGNob29zZSB0aGUgcmVzb2x2ZXIgdW5sZXNzIGEgcHJvamVjdCBhbHJlYWR5IG9wdGVkIGludG8gYSBtb2Rlcm4gb25lLlxuICBpZiAoXG4gICAgY29tcGlsZXJPcHRpb25zLm1vZHVsZVJlc29sdXRpb24gPT09ICdub2RlJyB8fFxuICAgIGNvbXBpbGVyT3B0aW9ucy5tb2R1bGVSZXNvbHV0aW9uID09PSAnTm9kZScgfHxcbiAgICBjb21waWxlck9wdGlvbnMubW9kdWxlUmVzb2x1dGlvbiA9PT0gJ25vZGUxMCdcbiAgKSB7XG4gICAgZGVsZXRlIGNvbXBpbGVyT3B0aW9ucy5tb2R1bGVSZXNvbHV0aW9uO1xuICB9XG4gIGlmIChjb25maWcuaXNCdW4gfHwgY29uZmlnLmRlcGVuZGluZy5yZWFjdE5hdGl2ZSB8fCBjb21waWxlck9wdGlvbnMubW9kdWxlICE9PSAnRVNOZXh0JykgcmV0dXJuO1xuXG4gIC8vIE5vZGUgYmFzZSBjb25maWdzIG5vdyBwYWlyIHRoZWlyIHJlc29sdmVyIHdpdGggYSBtYXRjaGluZyBtb2R1bGUga2luZC4gS2VlcGluZ1xuICAvLyBvbGRlciBFU05leHQgb3ZlcnJpZGVzIGNyZWF0ZXMgaW52YWxpZCBnZW5lcmF0ZWQgY29uZmlncyBmb3IgVFMgNi5cbiAgZGVsZXRlIGNvbXBpbGVyT3B0aW9ucy5tb2R1bGU7XG59XG5cbmZ1bmN0aW9uIHBpY2tFeGlzdGluZ0VtaXRNZXRhZGF0YShcbiAgY29tcGlsZXJPcHRpb25zOiBUc0NvbmZpZ0pzb25bJ2NvbXBpbGVyT3B0aW9ucyddXG4pOiBQaWNrPE5vbk51bGxhYmxlPFRzQ29uZmlnSnNvblsnY29tcGlsZXJPcHRpb25zJ10+LCAnZGVjbGFyYXRpb24nIHwgJ2RlY2xhcmF0aW9uTWFwJyB8ICdzb3VyY2VNYXAnPiB7XG4gIGNvbnN0IGVtaXRPcHRpb25zID0ge30gYXMgUGljazxcbiAgICBOb25OdWxsYWJsZTxUc0NvbmZpZ0pzb25bJ2NvbXBpbGVyT3B0aW9ucyddPixcbiAgICAnZGVjbGFyYXRpb24nIHwgJ2RlY2xhcmF0aW9uTWFwJyB8ICdzb3VyY2VNYXAnXG4gID47XG4gIGZvciAoY29uc3Qga2V5IG9mIFsnZGVjbGFyYXRpb24nLCAnZGVjbGFyYXRpb25NYXAnLCAnc291cmNlTWFwJ10gYXMgY29uc3QpIHtcbiAgICBjb25zdCB2YWx1ZSA9IGNvbXBpbGVyT3B0aW9ucz8uW2tleV07XG4gICAgaWYgKHZhbHVlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGVtaXRPcHRpb25zW2tleV0gPSB2YWx1ZSBhcyBuZXZlcjtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGVtaXRPcHRpb25zO1xufVxuXG5mdW5jdGlvbiBnZXRHZW5lcmF0ZWRUeXBlcyhjb25maWc6IFBhY2thZ2VDb25maWcpOiBzdHJpbmdbXSB7XG4gIGNvbnN0IHR5cGVOYW1lcyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICBjb25zdCBkZXBlbmRlbmNpZXMgPSB7XG4gICAgLi4uY29uZmlnLnBhY2thZ2VKc29uPy5kZXBlbmRlbmNpZXMsXG4gICAgLi4uY29uZmlnLnBhY2thZ2VKc29uPy5kZXZEZXBlbmRlbmNpZXMsXG4gIH07XG5cbiAgaWYgKGNvbmZpZy5pc0J1bikge1xuICAgIHR5cGVOYW1lcy5hZGQoJ2J1bicpO1xuICB9IGVsc2UgaWYgKCFjb25maWcuZGVwZW5kaW5nLnJlYWN0TmF0aXZlKSB7XG4gICAgdHlwZU5hbWVzLmFkZCgnbm9kZScpO1xuICB9XG4gIGlmIChcbiAgICBkZXBlbmRlbmNpZXMuamVzdCB8fFxuICAgIGRlcGVuZGVuY2llc1snQGplc3QvZ2xvYmFscyddIHx8XG4gICAgZGVwZW5kZW5jaWVzWydqZXN0LWVudmlyb25tZW50LWpzZG9tJ10gfHxcbiAgICBkZXBlbmRlbmNpZXNbJ3RzLWplc3QnXVxuICApIHtcbiAgICB0eXBlTmFtZXMuYWRkKCdqZXN0Jyk7XG4gIH1cbiAgaWYgKGRlcGVuZGVuY2llcy52aXRlc3QpIHtcbiAgICB0eXBlTmFtZXMuYWRkKCd2aXRlc3QvZ2xvYmFscycpO1xuICB9XG4gIGlmIChkZXBlbmRlbmNpZXMubW9jaGEpIHtcbiAgICB0eXBlTmFtZXMuYWRkKCdtb2NoYScpO1xuICB9XG4gIGlmIChkZXBlbmRlbmNpZXMuY3lwcmVzcykge1xuICAgIHR5cGVOYW1lcy5hZGQoJ2N5cHJlc3MnKTtcbiAgfVxuXG4gIHJldHVybiBbLi4udHlwZU5hbWVzXTtcbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCBtZXJnZSBmcm9tICdkZWVwbWVyZ2UnO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBmc1V0aWwgfSBmcm9tICcuLi91dGlscy9mc1V0aWwuanMnO1xuaW1wb3J0IHsgc29ydEtleXMgfSBmcm9tICcuLi91dGlscy9vYmplY3RVdGlsLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuXG5jb25zdCBleGNsdWRlRmlsZVBhdHRlcm5zID0gW1xuICAnKiovLmdpdC9vYmplY3RzLyoqJyxcbiAgJyoqLy5naXQvc3VidHJlZS1jYWNoZS8qKicsXG4gICcqKi9ub2RlX21vZHVsZXMvKionLFxuICAnKiovdG1wLyoqJyxcbiAgJyoqL3RlbXAvKionLFxuICAnKiovZGlzdC8qKicsXG5dO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVWc2NvZGVTZXR0aW5ncyhjb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdnZW5lcmF0ZVZzY29kZVNldHRpbmdzJywgYXN5bmMgKCkgPT4ge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJy52c2NvZGUnLCAnc2V0dGluZ3MuanNvbicpO1xuICAgICAgY29uc3QgZXhpc3RpbmdDb250ZW50ID0gYXdhaXQgZnMucHJvbWlzZXMucmVhZEZpbGUoZmlsZVBhdGgsICd1dGY4Jyk7XG4gICAgICBsZXQgc2V0dGluZ3MgPSBKU09OLnBhcnNlKGV4aXN0aW5nQ29udGVudCkgYXMgb2JqZWN0O1xuICAgICAgZm9yIChjb25zdCBleGNsdWRlRmlsZVBhdHRlcm4gb2YgZXhjbHVkZUZpbGVQYXR0ZXJucykge1xuICAgICAgICBzZXR0aW5ncyA9IG1lcmdlLmFsbChbc2V0dGluZ3MsIGV4Y2x1ZGVTZXR0aW5nKGV4Y2x1ZGVGaWxlUGF0dGVybildKTtcbiAgICAgIH1cbiAgICAgIGlmIChjb25maWcuZG9lc0NvbnRhaW5Qb2V0cnlMb2NrIHx8IGNvbmZpZy5kb2VzQ29udGFpblV2TG9jaykge1xuICAgICAgICBzZXR0aW5ncyA9IG1lcmdlLmFsbChbc2V0dGluZ3MsIGV4Y2x1ZGVTZXR0aW5nKCcqKi8udmVudi8qKicpXSk7XG4gICAgICB9XG4gICAgICBpZiAoY29uZmlnLmRlcGVuZGluZy5uZXh0KSB7XG4gICAgICAgIHNldHRpbmdzID0gbWVyZ2UuYWxsKFtzZXR0aW5ncywgZXhjbHVkZVNldHRpbmcoJyoqLy5uZXh0LyoqJyldKTtcbiAgICAgIH1cbiAgICAgIC8vIExMTeOBq+OCiOOCi3ZpYmUgY29kaW5n44Gn44Gv44CB6Ieq5YuV44OV44Kp44O844Oe44OD44OI44KE44Kz44O844OJ44Ki44Kv44K344On44Oz44KS54Sh5Yq55YyW44GZ44KL44GT44Go44GnXG4gICAgICAvLyDnlJ/miJDjgZXjgozjgZ/jgrPjg7zjg4njga7lhYPjga7lvaLlvI/jgpLntq3mjIHjgafjgY3jgotcbiAgICAgIGlmICgnZWRpdG9yLmNvZGVBY3Rpb25zT25TYXZlJyBpbiBzZXR0aW5ncykge1xuICAgICAgICBkZWxldGUgc2V0dGluZ3NbJ2VkaXRvci5jb2RlQWN0aW9uc09uU2F2ZSddO1xuICAgICAgfVxuICAgICAgaWYgKCdlZGl0b3IuZm9ybWF0T25TYXZlJyBpbiBzZXR0aW5ncykge1xuICAgICAgICBkZWxldGUgc2V0dGluZ3NbJ2VkaXRvci5mb3JtYXRPblNhdmUnXTtcbiAgICAgIH1cbiAgICAgIHNvcnRLZXlzKHNldHRpbmdzIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KTtcbiAgICAgIGNvbnN0IG5ld0NvbnRlbnQgPSBKU09OLnN0cmluZ2lmeShzZXR0aW5ncywgdW5kZWZpbmVkLCAyKTtcbiAgICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiBmc1V0aWwuZ2VuZXJhdGVGaWxlKGZpbGVQYXRoLCBuZXdDb250ZW50KSk7XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBkbyBub3RoaW5nXG4gICAgfVxuICB9KTtcbn1cblxuZnVuY3Rpb24gZXhjbHVkZVNldHRpbmcoZXhjbHVkZUZpbGVQYXR0ZXJuOiBzdHJpbmcpOiBvYmplY3Qge1xuICByZXR1cm4ge1xuICAgICdmaWxlcy53YXRjaGVyRXhjbHVkZSc6IHtcbiAgICAgIFtleGNsdWRlRmlsZVBhdHRlcm5dOiB0cnVlLFxuICAgIH0sXG4gIH07XG59XG4iLCIvLyBveGxpbnQtZGlzYWJsZSBlc2xpbnQtcGx1Z2luLWltcG9ydC9uby1uYW1lZC1hcy1kZWZhdWx0LW1lbWJlciAtLSBOYW1lc3BhY2UgWUFNTCBjYWxscyBtYWtlIGxvYWQvZHVtcCB1c2FnZSBjbGVhcmVyLlxuaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHR5cGUgeyBDb25maWd1cmF0aW9uVmFsdWVNYXAgfSBmcm9tICdAeWFybnBrZy9jb3JlJztcbmltcG9ydCB5YW1sIGZyb20gJ2pzLXlhbWwnO1xuaW1wb3J0IHNlbXZlciBmcm9tICdzZW12ZXInO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcbmltcG9ydCB7IHNwYXduU3luYywgc3Bhd25TeW5jQW5kUmV0dXJuU3Rkb3V0IH0gZnJvbSAnLi4vdXRpbHMvc3Bhd25VdGlsLmpzJztcblxudHlwZSBTZXR0aW5ncyA9IHtcbiAgYXBwcm92ZWRHaXRSZXBvc2l0b3JpZXM/OiBzdHJpbmdbXTtcbiAgZGVmYXVsdFNlbXZlclJhbmdlUHJlZml4OiBzdHJpbmc7XG4gIG5tTW9kZTogc3RyaW5nO1xuICBub2RlTGlua2VyOiBzdHJpbmc7XG4gIG5wbU1pbmltYWxBZ2VHYXRlPzogc3RyaW5nO1xuICBucG1QcmVhcHByb3ZlZFBhY2thZ2VzPzogc3RyaW5nW107XG4gIHBsdWdpbnM/OiBQbHVnaW5bXTtcbn0gJiBQYXJ0aWFsPENvbmZpZ3VyYXRpb25WYWx1ZU1hcD47XG5cbmludGVyZmFjZSBQbHVnaW4ge1xuICBjaGVja3N1bTogc3RyaW5nO1xuICBwYXRoOiBzdHJpbmc7XG4gIHNwZWM6IHN0cmluZztcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlWWFybnJjWW1sKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2dlbmVyYXRlWWFybnJjWW1sJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IHlhcm5yY1ltbFBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICcueWFybnJjLnltbCcpO1xuICAgIGlmIChjb25maWcuaXNCdW4pIHtcbiAgICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiBmcy5wcm9taXNlcy5ybSh5YXJucmNZbWxQYXRoLCB7IGZvcmNlOiB0cnVlIH0pKTtcbiAgICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PlxuICAgICAgICBmcy5wcm9taXNlcy5ybShwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICcueWFybicpLCB7IGZvcmNlOiB0cnVlLCByZWN1cnNpdmU6IHRydWUgfSlcbiAgICAgICk7XG4gICAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT5cbiAgICAgICAgZnMucHJvbWlzZXMucm0ocGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAneWFybi5sb2NrJyksIHsgZm9yY2U6IHRydWUsIHJlY3Vyc2l2ZTogdHJ1ZSB9KVxuICAgICAgKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBjdXJyZW50VmVyc2lvbiA9IHNwYXduU3luY0FuZFJldHVyblN0ZG91dCgneWFybicsIFsnLS12ZXJzaW9uJ10sIGNvbmZpZy5kaXJQYXRoKTtcbiAgICBjb25zdCBsYXRlc3RWZXJzaW9uID0gZ2V0TGF0ZXN0VmVyc2lvbignQHlhcm5wa2cvY2xpJywgY29uZmlnLmRpclBhdGgpO1xuICAgIGlmIChpc05ld2VyVmVyc2lvbihsYXRlc3RWZXJzaW9uLCBjdXJyZW50VmVyc2lvbikpIHtcbiAgICAgIHNwYXduU3luYygneWFybicsIFsnc2V0JywgJ3ZlcnNpb24nLCBsYXRlc3RWZXJzaW9uXSwgY29uZmlnLmRpclBhdGgsIDEpO1xuICAgIH1cblxuICAgIGNvbnN0IHJlbGVhc2VzUGF0aCA9IHBhdGguam9pbihjb25maWcuZGlyUGF0aCwgJy55YXJuJywgJ3JlbGVhc2VzJyk7XG4gICAgYXdhaXQgZnMucHJvbWlzZXMubWtkaXIocmVsZWFzZXNQYXRoLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgICBmb3IgKGNvbnN0IGZpbGUgb2YgYXdhaXQgZnMucHJvbWlzZXMucmVhZGRpcihyZWxlYXNlc1BhdGgpKSB7XG4gICAgICBpZiAoZmlsZS5zdGFydHNXaXRoKCd5YXJuLScpICYmICFmaWxlLnN0YXJ0c1dpdGgoYHlhcm4tJHtsYXRlc3RWZXJzaW9ufS5gKSkge1xuICAgICAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnMucHJvbWlzZXMucm0ocGF0aC5qb2luKHJlbGVhc2VzUGF0aCwgZmlsZSkpKTtcbiAgICAgICAgY29uc29sZS5sb2coJ1JlbW92ZWQnLCBwYXRoLmpvaW4ocmVsZWFzZXNQYXRoLCBmaWxlKSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgeWFybnJjUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJy55YXJucmMnKTtcbiAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnMucHJvbWlzZXMucm0oeWFybnJjUGF0aCwgeyBmb3JjZTogdHJ1ZSB9KSk7XG5cbiAgICBsZXQgc2V0dGluZ3MgPSB7fSBhcyBTZXR0aW5ncztcbiAgICB0cnkge1xuICAgICAgc2V0dGluZ3MgPSAoeWFtbC5sb2FkKGF3YWl0IGZzLnByb21pc2VzLnJlYWRGaWxlKHlhcm5yY1ltbFBhdGgsICd1dGY4JykpIGFzIFNldHRpbmdzIHwgdW5kZWZpbmVkKSA/PyBzZXR0aW5ncztcbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIGRvIG5vdGhpbmdcbiAgICB9XG4gICAgc2V0dGluZ3MuZGVmYXVsdFNlbXZlclJhbmdlUHJlZml4ID0gJyc7XG4gICAgc2V0dGluZ3Mubm9kZUxpbmtlciA9ICdub2RlLW1vZHVsZXMnO1xuICAgIHNldHRpbmdzLm5tTW9kZSA9ICdoYXJkbGlua3MtZ2xvYmFsJztcbiAgICBzZXR0aW5ncy5ucG1NaW5pbWFsQWdlR2F0ZSA9ICc1ZCc7XG4gICAgc2V0dGluZ3MuYXBwcm92ZWRHaXRSZXBvc2l0b3JpZXMgPSBbXG4gICAgICAvLyBZYXJuIDQuMTQgYmxvY2tzIGdpdCBkZXBlbmRlbmNpZXMgdW5sZXNzIHRoZSByZXBvc2l0b3J5IFVSTCBpcyBleHBsaWNpdGx5IGFsbG93ZWQuXG4gICAgICAnaHR0cHM6Ly9naXRodWIuY29tL1dpbGxCb29zdGVyTGFiLyouZ2l0JyxcbiAgICAgICdzc2g6Ly9naXRAZ2l0aHViLmNvbS9XaWxsQm9vc3RlckxhYi8qLmdpdCcsXG4gICAgXTtcbiAgICBzZXR0aW5ncy5ucG1QcmVhcHByb3ZlZFBhY2thZ2VzID0gW1xuICAgICAgLy8gLS0tLS0tLS0tLSBTVEFSVDogV2UgYmVsaWV2ZSBvdXIgcGFja2FnZXMgYXJlIHNhZmUgLS0tLS0tLS0tLVxuICAgICAgJ0BleGVyY29kZS8qJyxcbiAgICAgICdAd2lsbGJvb3N0ZXIvKicsXG4gICAgICAnYWdlbnQtcnVudGltZS1raXQnLFxuICAgICAgJ2F0LWRlY29yYXRvcnMnLFxuICAgICAgJ2J1aWxkLXRzJyxcbiAgICAgICdnZW4taTE4bi10cycsXG4gICAgICAnb25lLXdheS1naXQtc3luYycsXG4gICAgICAvLyAtLS0tLS0tLS0tIEVORDogV2UgYmVsaWV2ZSBvdXIgcGFja2FnZXMgYXJlIHNhZmUgLS0tLS0tLS0tLVxuXG4gICAgICAvLyBUbyBkZWFsIHdpdGggQ1ZFIGxpa2UgaHR0cHM6Ly9uZXh0anMub3JnL2Jsb2cvQ1ZFLTIwMjUtNjY0NzhcbiAgICAgICduZXh0JyxcbiAgICAgICdAbmV4dC8qJyxcbiAgICAgICdAdHlwZXNjcmlwdC8qJyxcbiAgICAgICdAb3hmbXQvKicsXG4gICAgICAnQG94bGludC8qJyxcbiAgICAgICdAb3hsaW50LXRzZ29saW50LyonLFxuICAgICAgJ294Zm10JyxcbiAgICAgICdveGxpbnQnLFxuICAgICAgJ294bGludC10c2dvbGludCcsXG4gICAgICAncmVhY3QnLFxuICAgICAgJ3JlYWN0LWRvbScsXG4gICAgXTtcbiAgICBkZWxldGUgc2V0dGluZ3MuY29tcHJlc3Npb25MZXZlbDtcbiAgICBpZiAoc2V0dGluZ3MuaW5qZWN0RW52aXJvbm1lbnRGaWxlcz8ubGVuZ3RoID09PSAwKSB7XG4gICAgICBkZWxldGUgc2V0dGluZ3MuaW5qZWN0RW52aXJvbm1lbnRGaWxlcztcbiAgICB9XG4gICAgLy8gY2YuIGh0dHBzOi8vZ2l0aHViLmNvbS95YXJucGtnL2JlcnJ5L3B1bGwvNDY5OFxuICAgIHNldHRpbmdzLmVuYWJsZUdsb2JhbENhY2hlID0gdHJ1ZTtcbiAgICBjb25zdCBvcmlnaW5hbExlbmd0aCA9IHNldHRpbmdzLnBsdWdpbnM/Lmxlbmd0aCA/PyAwO1xuICAgIHNldHRpbmdzLnBsdWdpbnMgPSBzZXR0aW5ncy5wbHVnaW5zPy5maWx0ZXIoKHApID0+IHAucGF0aCAhPT0gJy55YXJuL3BsdWdpbnMvdW5kZWZpbmVkLmNqcycpID8/IFtdO1xuICAgIGlmIChzZXR0aW5ncy5wbHVnaW5zLmxlbmd0aCAhPT0gb3JpZ2luYWxMZW5ndGgpIHtcbiAgICAgIGNvbnN0IHBsdWdpblBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICcueWFybicsICdwbHVnaW5zJywgJ3VuZGVmaW5lZC5janMnKTtcbiAgICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiBmcy5wcm9taXNlcy5ybShwbHVnaW5QYXRoLCB7IGZvcmNlOiB0cnVlIH0pKTtcbiAgICB9XG4gICAgaWYgKHNldHRpbmdzLnBsdWdpbnMubGVuZ3RoID09PSAwKSB7XG4gICAgICBkZWxldGUgc2V0dGluZ3MucGx1Z2lucztcbiAgICB9XG4gICAgYXdhaXQgZnMucHJvbWlzZXMud3JpdGVGaWxlKHlhcm5yY1ltbFBhdGgsIHlhbWwuZHVtcChzZXR0aW5ncywgeyBsaW5lV2lkdGg6IC0xIH0pKTtcblxuICAgIHNwYXduU3luYygneWFybicsIFsnZGx4JywgJ3lhcm4tcGx1Z2luLWF1dG8taW5zdGFsbCddLCBjb25maWcuZGlyUGF0aCk7XG4gICAgLy8gVGhlIHRhcmdldCByZXBvIG1heSBub3QgaGF2ZSBwcmV0dGllciBpbnN0YWxsZWQgeWV0LCBhbmQgeWFybi1wbHVnaW4tYXV0by1pbnN0YWxsIGVkaXRzIHRoaXMgZmlsZSBhZnRlciBqcy15YW1sLlxuICAgIHNwYXduU3luYygneWFybicsIGdldFlhcm5yY1ByZXR0aWVyQXJncyhjb25maWcuZGlyUGF0aCwgeWFybnJjWW1sUGF0aCksIGNvbmZpZy5kaXJQYXRoKTtcbiAgfSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRZYXJucmNQcmV0dGllckFyZ3MoZGlyUGF0aDogc3RyaW5nLCB5YXJucmNZbWxQYXRoOiBzdHJpbmcpOiBzdHJpbmdbXSB7XG4gIHJldHVybiBbJ2RseCcsICdwcmV0dGllcicsICctLW5vLWNvbmZpZycsICctLXdyaXRlJywgcGF0aC5yZWxhdGl2ZShkaXJQYXRoLCB5YXJucmNZbWxQYXRoKV07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRMYXRlc3RWZXJzaW9uKHBhY2thZ2VOYW1lOiBzdHJpbmcsIGRpclBhdGg6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiBzcGF3blN5bmNBbmRSZXR1cm5TdGRvdXQoJ25wbScsIFsnc2hvdycsIHBhY2thZ2VOYW1lLCAndmVyc2lvbiddLCBkaXJQYXRoKSB8fCAnMC4wLjAnO1xufVxuXG5mdW5jdGlvbiBpc05ld2VyVmVyc2lvbihuZXdWZXJzaW9uOiBzdHJpbmcsIG9sZFZlcnNpb246IHN0cmluZyk6IGJvb2xlYW4ge1xuICBjb25zdCB2YWxpZE5ld1ZlcnNpb24gPSBzZW12ZXIudmFsaWQobmV3VmVyc2lvbik7XG4gIGlmICghdmFsaWROZXdWZXJzaW9uKSByZXR1cm4gZmFsc2U7XG5cbiAgcmV0dXJuIHNlbXZlci5ndCh2YWxpZE5ld1ZlcnNpb24sIHNlbXZlci52YWxpZChvbGRWZXJzaW9uKSA/PyAnMC4wLjAnKTtcbn1cbiIsImltcG9ydCB0eXBlIHsgT2N0b2tpdCB9IGZyb20gJ0BvY3Rva2l0L2NvcmUnO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBnZXRPY3Rva2l0LCBnaXRIdWJVdGlsLCBoYXNHaXRIdWJUb2tlbiB9IGZyb20gJy4uL3V0aWxzL2dpdGh1YlV0aWwuanMnO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gc2V0dXBMYWJlbHMoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignc2V0dXBMYWJlbHMnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgW293bmVyLCByZXBvXSA9IGdpdEh1YlV0aWwuZ2V0T3JnQW5kTmFtZShjb25maWcucmVwb3NpdG9yeSA/PyAnJyk7XG4gICAgaWYgKCFvd25lciB8fCAhcmVwbykgcmV0dXJuO1xuICAgIGlmIChvd25lciAhPT0gJ1dpbGxCb29zdGVyJyAmJiBvd25lciAhPT0gJ1dpbGxCb29zdGVyTGFiJykgcmV0dXJuO1xuICAgIGlmICghaGFzR2l0SHViVG9rZW4ob3duZXIpKSByZXR1cm47XG5cbiAgICBjb25zdCBvY3Rva2l0ID0gZ2V0T2N0b2tpdChvd25lcik7XG5cbiAgICB0cnkge1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ2QxOiB4LWVhc3kgOmhlZGdlaG9nOicsICdFREU5RkUnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdkMjogZWFzeSA6cmFiYml0MjonLCAnRERENkZFJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAnZDM6IG1lZGl1bSA6b3g6JywgJ0M0QjVGRCcpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ2Q0OiBoYXJkIDpzcXVpZDonLCAnQTc4QkZBJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAnZDU6IHgtaGFyZCA6d2hhbGUyOicsICc4QjVDRjYnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdwMTogY3JpdGljYWwgOmZpcmU6OmZpcmU6OmZpcmU6JywgJ0VGNDQ0NCcpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ3AyOiB1cmdlbnQgOmZpcmU6OmZpcmU6JywgJ0Y4NzE3MScpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ3AzOiBpbXBvcnRhbnQgOmZpcmU6JywgJ0ZDQTVBNScpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ3A0OiBuaWNlIHRvIGhhdmUgOmRyb3BsZXQ6JywgJ0ZFQ0FDQScpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ3I6IGJsaXR6JywgJzUzMDBiYycpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ3I6IGZpcmViYXNlJywgJ2ZmY2EyOCcpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ3I6IHByaXNtYScsICcwYzM0NGInKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdyOiByZWFjdCcsICc2MWRhZmInKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdyOiBzdmVsdGUnLCAnZmYzZTAwJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAncjogc2VtYW50aWMtcmVsZWFzZScsICc0OTQ5NDknKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdyZWFkeSA6cm9ja2V0OicsICcyMkM1NUUnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdyZXZpZXcgcmVxdWVzdGVkIDptYWc6JywgJ0ZCQ0EwNCcpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ3JlbGVhc2VkIDpib29rbWFyazonLCAnNjM2NkYxJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAnczogMC41aCA6Y2xvY2sxMjMwOicsICdGM0Y0RjYnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdzOiAxaCA6Y2xvY2sxOicsICdFNUU3RUInKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdzOiAyaCA6Y2xvY2syOicsICdEMUQ1REInKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdzOiAzaCA6Y2xvY2szOicsICc5Q0EzQUYnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdzOiA1aCA6Y2xvY2s1OicsICc2QjcyODAnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdzOiA4aCA6Y2xvY2s4OicsICc0QjU1NjMnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdzOiAxM2ggOmNsb2NrMTonLCAnMzc0MTUxJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAndDogYnVpbGQgOmhhbW1lcjonLCAnQkZEQkZFJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAndDogY2hvcmUgOmJyb29tOicsICdCRkRCRkUnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICd0OiBjaSA6Y29uc3RydWN0aW9uX3dvcmtlcjonLCAnQkZEQkZFJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAndDogZG9jcyA6bWVtbzonLCAnQkZEQkZFJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAndDogZmVhdCA6c3BhcmtsZXM6JywgJ0JGREJGRScpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ3Q6IGZpeCA6YnVnOicsICdCRkRCRkUnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICd0OiBwZXJmIDp6YXA6JywgJ0JGREJGRScpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ3Q6IHJlZmFjdG9yIDpyZWN5Y2xlOicsICdCRkRCRkUnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICd0OiBzdHlsZSA6bGlwc3RpY2s6JywgJ0JGREJGRScpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ3Q6IHRlc3QgOnRlc3RfdHViZTonLCAnQkZEQkZFJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAncHJvamVjdCcsICcyNDI5MkYnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdmb2N1c2VkIDpkYXJ0OicsICcyMkM1NUUnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdnZW4tcHItYWxsIDpyb2JvdDonLCAnMDBCNEQ4Jyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAnZ2VuLXByLWNsYXVkZSA6cm9ib3Q6JywgJzAwQjREOCcpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ2dlbi1wci1jb2RleCA6cm9ib3Q6JywgJzAwQjREOCcpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ2dlbi1wci1nZW1pbmkgOnJvYm90OicsICcwMEI0RDgnKTtcblxuICAgICAgYXdhaXQgZGVsZXRlTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdidWcnKTtcbiAgICAgIGF3YWl0IGRlbGV0ZUxhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAnZG9jdW1lbnRhdGlvbicpO1xuICAgICAgYXdhaXQgZGVsZXRlTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdkdXBsaWNhdGUnKTtcbiAgICAgIGF3YWl0IGRlbGV0ZUxhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAnZW5oYW5jZW1lbnQnKTtcbiAgICAgIGF3YWl0IGRlbGV0ZUxhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAnZ29vZCBmaXJzdCBpc3N1ZScpO1xuICAgICAgYXdhaXQgZGVsZXRlTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdoZWxwIHdhbnRlZCcpO1xuICAgICAgYXdhaXQgZGVsZXRlTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdpbnZhbGlkJyk7XG4gICAgICBhd2FpdCBkZWxldGVMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ3F1ZXN0aW9uJyk7XG4gICAgICBhd2FpdCBkZWxldGVMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ3dvbnRmaXgnKTtcblxuICAgICAgYXdhaXQgZGVsZXRlTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdyZWFkeScpO1xuICAgICAgYXdhaXQgZGVsZXRlTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdyZXZpZXcgcmVxdWVzdGVkJyk7XG4gICAgICBhd2FpdCBkZWxldGVMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ3JlbGVhc2VkJyk7XG4gICAgICBhd2FpdCBkZWxldGVMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ3NlbWFudGljLXJlbGVhc2UnKTtcbiAgICAgIGF3YWl0IGRlbGV0ZUxhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAnbGxtLXByIDpyb2JvdDonKTtcbiAgICAgIGF3YWl0IGRlbGV0ZUxhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAnYWktcHIgOnJvYm90OicpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBjb25zb2xlLndhcm4oJ1NraXAgc2V0dXBMYWJlbHMgZHVlIHRvOicsIChlcnJvciBhcyBFcnJvciB8IHVuZGVmaW5lZCk/LnN0YWNrID8/IGVycm9yKTtcbiAgICB9XG4gIH0pO1xufVxuXG5hc3luYyBmdW5jdGlvbiBzZXR1cExhYmVsKG9jdG9raXQ6IE9jdG9raXQsIG93bmVyOiBzdHJpbmcsIHJlcG86IHN0cmluZywgbmFtZTogc3RyaW5nLCBjb2xvcjogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gIHRyeSB7XG4gICAgLy8gSXNzdWVzIHBlcm1pc3Npb25cbiAgICBhd2FpdCBvY3Rva2l0LnJlcXVlc3QoJ1BPU1QgL3JlcG9zL3tvd25lcn0ve3JlcG99L2xhYmVscycsIHtcbiAgICAgIG93bmVyLFxuICAgICAgcmVwbyxcbiAgICAgIG5hbWUsXG4gICAgICBjb2xvcixcbiAgICB9KTtcbiAgfSBjYXRjaCB7XG4gICAgLy8gSXNzdWVzIHBlcm1pc3Npb25cbiAgICBhd2FpdCBvY3Rva2l0LnJlcXVlc3QoJ1BBVENIIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9sYWJlbHMve25hbWV9Jywge1xuICAgICAgb3duZXIsXG4gICAgICByZXBvLFxuICAgICAgbmFtZSxcbiAgICAgIGNvbG9yLFxuICAgIH0pO1xuICB9XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGRlbGV0ZUxhYmVsKG9jdG9raXQ6IE9jdG9raXQsIG93bmVyOiBzdHJpbmcsIHJlcG86IHN0cmluZywgbmFtZTogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gIHRyeSB7XG4gICAgLy8gSXNzdWVzIHBlcm1pc3Npb25cbiAgICBhd2FpdCBvY3Rva2l0LnJlcXVlc3QoJ0RFTEVURSAvcmVwb3Mve293bmVyfS97cmVwb30vbGFiZWxzL3tuYW1lfScsIHtcbiAgICAgIG93bmVyLFxuICAgICAgcmVwbyxcbiAgICAgIG5hbWUsXG4gICAgfSk7XG4gIH0gY2F0Y2gge1xuICAgIC8vIGRvIG5vdGhpbmdcbiAgfVxufVxuIiwiaW1wb3J0IHsgY3JlYXRlUmVxdWlyZSB9IGZyb20gJ25vZGU6bW9kdWxlJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCBkb3RlbnYgZnJvbSAnZG90ZW52JztcbmltcG9ydCB0eXBlIHNvZGl1bU1vZHVsZSBmcm9tICdsaWJzb2RpdW0td3JhcHBlcnMnO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHsgb3B0aW9ucyB9IGZyb20gJy4uL29wdGlvbnMuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBnZXRPY3Rva2l0LCBnaXRIdWJVdGlsLCBoYXNHaXRIdWJUb2tlbiB9IGZyb20gJy4uL3V0aWxzL2dpdGh1YlV0aWwuanMnO1xuXG5jb25zdCBERVBSRUNBVEVEX1NFQ1JFVF9OQU1FUyA9IFsnUkVBRFlfRElTQ09SRF9XRUJIT09LX1VSTCcsICdHSF9CT1RfUEFUJywgJ1BVQkxJQ19HSF9CT1RfUEFUJ107XG5jb25zdCByZXF1aXJlID0gY3JlYXRlUmVxdWlyZShpbXBvcnQubWV0YS51cmwpO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gc2V0dXBTZWNyZXRzKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ3NldHVwU2VjcmV0cycsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBbb3duZXIsIHJlcG9dID0gZ2l0SHViVXRpbC5nZXRPcmdBbmROYW1lKGNvbmZpZy5yZXBvc2l0b3J5ID8/ICcnKTtcbiAgICBpZiAoIW93bmVyIHx8ICFyZXBvIHx8IG93bmVyICE9PSAnV2lsbEJvb3N0ZXJMYWInKSByZXR1cm47XG4gICAgaWYgKCFoYXNHaXRIdWJUb2tlbihvd25lcikgfHwgIW9wdGlvbnMuZG9lc1VwbG9hZEVudlZhcnMpIHJldHVybjtcblxuICAgIGNvbnN0IHBhcnNlZCA9IGRvdGVudi5jb25maWcoeyBwYXRoOiBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICcuZW52JykgfSkucGFyc2VkID8/IHt9O1xuICAgIGlmIChPYmplY3Qua2V5cyhwYXJzZWQpLmxlbmd0aCA9PT0gMCkgcmV0dXJuO1xuXG4gICAgY29uc3Qgb2N0b2tpdCA9IGdldE9jdG9raXQob3duZXIpO1xuXG4gICAgdHJ5IHtcbiAgICAgIGZvciAoY29uc3Qgc2VjcmV0TmFtZSBvZiBERVBSRUNBVEVEX1NFQ1JFVF9OQU1FUykge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIC8vIFJlcXVpcmVzIFNlY3JldHMgcGVybWlzc2lvblxuICAgICAgICAgIGF3YWl0IG9jdG9raXQucmVxdWVzdCgnREVMRVRFIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9hY3Rpb25zL3NlY3JldHMve3NlY3JldF9uYW1lfScsIHtcbiAgICAgICAgICAgIG93bmVyLFxuICAgICAgICAgICAgcmVwbyxcbiAgICAgICAgICAgIHNlY3JldF9uYW1lOiBzZWNyZXROYW1lLFxuICAgICAgICAgIH0pO1xuICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICAvLyBkbyBub3RoaW5nXG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gUmVxdWlyZXMgU2VjcmV0cyBwZXJtaXNzaW9uXG4gICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IG9jdG9raXQucmVxdWVzdCgnR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9hY3Rpb25zL3NlY3JldHMvcHVibGljLWtleScsIHtcbiAgICAgICAgb3duZXIsXG4gICAgICAgIHJlcG8sXG4gICAgICB9KTtcbiAgICAgIGNvbnN0IHsga2V5LCBrZXlfaWQ6IGtleUlkIH0gPSByZXNwb25zZS5kYXRhO1xuXG4gICAgICBjb25zdCBzb2RpdW0gPSBnZXRTb2RpdW0oKTtcbiAgICAgIGF3YWl0IHNvZGl1bS5yZWFkeTtcblxuICAgICAgZm9yIChjb25zdCBbbmFtZSwgc2VjcmV0XSBvZiBPYmplY3QuZW50cmllcyhwYXJzZWQpKSB7XG4gICAgICAgIGlmIChcbiAgICAgICAgICBuYW1lID09PSAnR0hfQk9UX1BBVCcgfHxcbiAgICAgICAgICBuYW1lID09PSAnR0hfQk9UX1BBVF9GT1JfV0lMTEJPT1NURVInIHx8XG4gICAgICAgICAgbmFtZSA9PT0gJ0dIX0JPVF9QQVRfRk9SX1dJTExCT09TVEVSTEFCJ1xuICAgICAgICApIHtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIENvbnZlcnQgU2VjcmV0ICYgQmFzZTY0IGtleSB0byBVaW50OEFycmF5LlxuICAgICAgICBjb25zdCByYXdLZXkgPSBzb2RpdW0uZnJvbV9iYXNlNjQoa2V5LCBzb2RpdW0uYmFzZTY0X3ZhcmlhbnRzLk9SSUdJTkFMKTtcbiAgICAgICAgY29uc3QgcmF3U2VjID0gc29kaXVtLmZyb21fc3RyaW5nKHNlY3JldCk7XG5cbiAgICAgICAgLy8gRW5jcnlwdCB0aGUgc2VjcmV0IHVzaW5nIExpYlNvZGl1bVxuICAgICAgICBjb25zdCBlbmNCeXRlcyA9IHNvZGl1bS5jcnlwdG9fYm94X3NlYWwocmF3U2VjLCByYXdLZXkpO1xuXG4gICAgICAgIC8vIENvbnZlcnQgZW5jcnlwdGVkIFVpbnQ4QXJyYXkgdG8gQmFzZTY0XG4gICAgICAgIGNvbnN0IGVuY0Jhc2U2NCA9IHNvZGl1bS50b19iYXNlNjQoZW5jQnl0ZXMsIHNvZGl1bS5iYXNlNjRfdmFyaWFudHMuT1JJR0lOQUwpO1xuXG4gICAgICAgIC8vIFJlcXVpcmVzIFNlY3JldHMgcGVybWlzc2lvblxuICAgICAgICBhd2FpdCBvY3Rva2l0LnJlcXVlc3QoJ1BVVCAvcmVwb3Mve293bmVyfS97cmVwb30vYWN0aW9ucy9zZWNyZXRzL3tzZWNyZXRfbmFtZX0nLCB7XG4gICAgICAgICAgb3duZXIsXG4gICAgICAgICAgcmVwbyxcbiAgICAgICAgICBzZWNyZXRfbmFtZTogbmFtZSxcbiAgICAgICAgICBlbmNyeXB0ZWRfdmFsdWU6IGVuY0Jhc2U2NCxcbiAgICAgICAgICBrZXlfaWQ6IGtleUlkLFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgY29uc29sZS53YXJuKCdTa2lwIHNldHVwU2VjcmV0cyBkdWUgdG86JywgKGVycm9yIGFzIEVycm9yIHwgdW5kZWZpbmVkKT8uc3RhY2sgPz8gZXJyb3IpO1xuICAgIH1cbiAgfSk7XG59XG5cbmZ1bmN0aW9uIGdldFNvZGl1bSgpOiB0eXBlb2Ygc29kaXVtTW9kdWxlIHtcbiAgLy8gbGlic29kaXVtLXdyYXBwZXJzJyBFU00gZW50cnkgY2FuIGJpbmQgdG8gbGlic29kaXVtQDAuOC4zLCB3aG9zZSBkZWZhdWx0XG4gIC8vIGV4cG9ydCBubyBsb25nZXIgZXhwb3NlcyByZWFkeS4gVGhlIENvbW1vbkpTIGVudHJ5IGtlZXBzIHRoZSBBUEkgc2hhcGUuXG4gIHJldHVybiByZXF1aXJlKCdsaWJzb2RpdW0td3JhcHBlcnMnKSBhcyB0eXBlb2Ygc29kaXVtTW9kdWxlO1xufVxuIiwiaW1wb3J0IHsgd2l0aFJldHJ5IH0gZnJvbSAnQHdpbGxib29zdGVyL3NoYXJlZC1saWIvc3JjJztcblxuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBnZXRPY3Rva2l0LCBnaXRIdWJVdGlsLCBoYXNHaXRIdWJUb2tlbiB9IGZyb20gJy4uL3V0aWxzL2dpdGh1YlV0aWwuanMnO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gc2V0dXBHaXRIdWJTZXR0aW5ncyhjb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgW293bmVyLCByZXBvXSA9IGdpdEh1YlV0aWwuZ2V0T3JnQW5kTmFtZShjb25maWcucmVwb3NpdG9yeSA/PyAnJyk7XG4gIGlmICghb3duZXIgfHwgIXJlcG8pIHJldHVybjtcbiAgaWYgKG93bmVyICE9PSAnV2lsbEJvb3N0ZXInICYmIG93bmVyICE9PSAnV2lsbEJvb3N0ZXJMYWInKSByZXR1cm47XG4gIGlmICghaGFzR2l0SHViVG9rZW4ob3duZXIpKSByZXR1cm47XG5cbiAgY29uc3Qgb2N0b2tpdCA9IGdldE9jdG9raXQob3duZXIpO1xuXG4gIC8vIEFkbWluaXN0cmF0aW9uIHBlcm1pc3Npb25cbiAgYXdhaXQgd2l0aFJldHJ5KCgpID0+XG4gICAgb2N0b2tpdC5yZXF1ZXN0KCdQQVRDSCAvcmVwb3Mve293bmVyfS97cmVwb30nLCB7XG4gICAgICBvd25lcixcbiAgICAgIHJlcG8sXG4gICAgICBhbGxvd19hdXRvX21lcmdlOiB0cnVlLFxuICAgICAgYWxsb3dfbWVyZ2VfY29tbWl0OiBmYWxzZSxcbiAgICAgIGFsbG93X3NxdWFzaF9tZXJnZTogdHJ1ZSxcbiAgICAgIGFsbG93X3JlYmFzZV9tZXJnZTogZmFsc2UsXG4gICAgICBhbGxvd191cGRhdGVfYnJhbmNoOiB0cnVlLFxuICAgICAgZGVsZXRlX2JyYW5jaF9vbl9tZXJnZTogdHJ1ZSxcbiAgICAgIHNxdWFzaF9tZXJnZV9jb21taXRfdGl0bGU6ICdQUl9USVRMRScsXG4gICAgICBzcXVhc2hfbWVyZ2VfY29tbWl0X21lc3NhZ2U6ICdCTEFOSycsXG4gICAgICBoZWFkZXJzOiB7XG4gICAgICAgICdYLUdpdEh1Yi1BcGktVmVyc2lvbic6ICcyMDIyLTExLTI4JyxcbiAgICAgIH0sXG4gICAgICAuLi4oY29uZmlnLnJlcG9zaXRvcnk/LnN0YXJ0c1dpdGgoJ2dpdGh1YjpXaWxsQm9vc3Rlci8nKSA/IHsgYWxsb3dfYXV0b19tZXJnZTogdHJ1ZSB9IDoge30pLFxuICAgIH0pXG4gICk7XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgeyBkaXN0YW5jZSB9IGZyb20gJ2Zhc3Rlc3QtbGV2ZW5zaHRlaW4nO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBmc1V0aWwgfSBmcm9tICcuLi91dGlscy9mc1V0aWwuanMnO1xuaW1wb3J0IHsgcHJvbWlzZVBvb2wgfSBmcm9tICcuLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5cbmNvbnN0IHBhY2thZ2VNYW5hZ2VyUnVuUGxhY2Vob2xkZXIgPSAnX19QTV9SVU5fXyc7XG5cbmNvbnN0IHRlbXBsYXRlcyA9IHtcbiAgJ3B1bGxfcmVxdWVzdF90ZW1wbGF0ZS5tZCc6IGBcbkNsb3NlICM8SXNzdWVOdW1iZXI+XG5cbiMjIFNlbGYgQ2hlY2tcblxuLSBbIF0gSSd2ZSBjb25maXJtZWQgXFxgQWxsIGNoZWNrcyBoYXZlIHBhc3NlZFxcYCBvbiB0aGlzIHBhZ2UuXG4gIC0gUFIgdGl0bGUgZm9sbG93cyBbQW5ndWxhcidzIGNvbW1pdCBtZXNzYWdlIGZvcm1hdF0oaHR0cHM6Ly9naXRodWIuY29tL2FuZ3VsYXIvYW5ndWxhci9ibG9iL21haW4vQ09OVFJJQlVUSU5HLm1kIy1jb21taXQtbWVzc2FnZS1mb3JtYXQpLlxuICAtIFBSIHRpdGxlIGRvZXNuJ3QgaGF2ZSBcXGBXSVA6XFxgLlxuICAtIFRoZSB0ZXN0IGNvbW1hbmQgKGUuZy4sIFxcYCR7cGFja2FnZU1hbmFnZXJSdW5QbGFjZWhvbGRlcn0gdGVzdFxcYCkgcGFzc2VkLlxuICAtIFRoZSBsaW50IGNvbW1hbmQgKGUuZy4sIFxcYCR7cGFja2FnZU1hbmFnZXJSdW5QbGFjZWhvbGRlcn0gbGludFxcYCkgcGFzc2VkLlxuICAtIFlvdSBtYXkgbGVhdmUgdGhpcyBib3ggdW5jaGVja2VkIGR1ZSB0byBsb25nIHdvcmtmbG93cy5cbi0gWyBdIEkndmUgcmV2aWV3ZWQgbXkgY2hhbmdlcyBvbiB0aGUgR2l0SHViIGRpZmYgdmlldy5cbi0gWyBdIEkndmUgd3JpdHRlbiB0aGUgc3RlcHMgdG8gdGVzdCBteSBjaGFuZ2VzLlxuLSBbIF0gSSd2ZSBhZGRlZCBzY3JlZW5zaG90cyAoaWYgdGhlIFVJIGNoYW5nZWQpLlxuICAtIFlvdSBtYXkgbGVhdmUgdGhpcyBib3ggdW5jaGVja2VkIGlmIHlvdSBkaWRuJ3QgbW9kaWZ5IHRoZSBVSS5cblxuPCEtLSBQbGVhc2UgYWRkIHNjcmVlbnNob3RzIGlmIHlvdSBtb2RpZnkgdGhlIFVJLlxufCBDdXJyZW50ICAgICAgICAgICAgICAgICAgfCBJbiBjb21pbmcgICAgICAgICAgICAgICAgfFxufCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfFxufCA8aW1nIHNyYz1cIlwiIHdpZHRoPVwiNDAwXCI+IHwgPGltZyBzcmM9XCJcIiB3aWR0aD1cIjQwMFwiPiB8XG4tLT5cblxuPCEtLSBQbGVhc2UgYWRkIHN0ZXBzIHRvIHRlc3QgeW91ciBjaGFuZ2VzLlxuIyMgU3RlcHMgdG8gVGVzdFxuXG4xLiBPcGVuIGh0dHA6Ly9sb2NhbGhvc3QtZXhlcmNvZGUud2lsbGJvb3N0ZXIubmV0OjMwMDAvamEtSlAvY291cnNlcy9fZXhhbXBsZS9sZXNzb25zL19leGFtcGxlX2FfcGx1c19iL3Byb2JsZW1zL19leGFtcGxlX2FfcGx1c19iIGFmdGVyIGxvZ2luLlxuMi4gU2VsZWN0IHRoZSBsYW5ndWFnZSBcXGBDXFxgLlxuMy4gV3JpdGUgdGhlIGZvbGxvd2luZyBjb2RlOlxuICAgXFxgXFxgXFxgY1xuICAgI2luY2x1ZGUgPHN0ZGlvLmg+XG5cbiAgIGludCBtYWluKHZvaWQpIHtcbiAgICAgaW50IGEsIGI7XG5cbiAgICAgc2NhbmYoXCIlZCAlZFwiLCAmYSwgJmIpO1xuICAgICBwcmludGYoXCIlZFwiLCBhICsgYik7XG4gICAgIHJldHVybiAwO1xuICAgfVxuICAgXFxgXFxgXFxgXG40LiBQdXNoIFxcYFN1Ym1pdFxcYCBidXR0b24uXG41LiAuLi5cbi0tPlxuYC50cmltKCksXG59O1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVHaXRIdWJUZW1wbGF0ZXMoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZ2VuZXJhdGVHaXRIdWJUZW1wbGF0ZXMnLCBhc3luYyAoKSA9PiB7XG4gICAgZm9yIChjb25zdCBbZmlsZU5hbWUsIG5ld0NvbnRlbnRdIG9mIE9iamVjdC5lbnRyaWVzKHRlbXBsYXRlcykpIHtcbiAgICAgIGNvbnN0IGNvbnRlbnQgPSBhcHBseVBhY2thZ2VNYW5hZ2VyVGVtcGxhdGUobmV3Q29udGVudCwgY29uZmlnKTtcbiAgICAgIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnLmdpdGh1YicsIGZpbGVOYW1lKTtcbiAgICAgIGlmIChmcy5leGlzdHNTeW5jKGZpbGVQYXRoKSkge1xuICAgICAgICBjb25zdCBvbGRDb250ZW50ID0gYXdhaXQgZnMucHJvbWlzZXMucmVhZEZpbGUoZmlsZVBhdGgsICd1dGY4Jyk7XG4gICAgICAgIGlmIChkaXN0YW5jZShvbGRDb250ZW50LCBjb250ZW50KSA+IGNvbnRlbnQubGVuZ3RoIC8gMikge1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGF3YWl0IGZzLnByb21pc2VzLm1rZGlyKHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJy5naXRodWInKSwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gICAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnNVdGlsLmdlbmVyYXRlRmlsZShmaWxlUGF0aCwgY29udGVudCkpO1xuICAgIH1cbiAgfSk7XG59XG5cbmZ1bmN0aW9uIGFwcGx5UGFja2FnZU1hbmFnZXJUZW1wbGF0ZSh0ZW1wbGF0ZTogc3RyaW5nLCBjb25maWc6IFBhY2thZ2VDb25maWcpOiBzdHJpbmcge1xuICBjb25zdCBwYWNrYWdlTWFuYWdlckNvbW1hbmQgPSBjb25maWcuaXNCdW4gPyAnYnVuIHJ1bicgOiAneWFybic7XG4gIHJldHVybiB0ZW1wbGF0ZS5yZXBsYWNlQWxsKHBhY2thZ2VNYW5hZ2VyUnVuUGxhY2Vob2xkZXIsIHBhY2thZ2VNYW5hZ2VyQ29tbWFuZCk7XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgZnNwIGZyb20gJ25vZGU6ZnMvcHJvbWlzZXMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IGZnIGZyb20gJ2Zhc3QtZ2xvYic7XG5pbXBvcnQgeyBzaW1wbGVHaXQgfSBmcm9tICdzaW1wbGUtZ2l0JztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUpzb24gfSBmcm9tICd0eXBlLWZlc3QnO1xuaW1wb3J0IHsgeiB9IGZyb20gJ3pvZCc7XG5cbmltcG9ydCB7IGdldE9jdG9raXQsIGdpdEh1YlV0aWwgfSBmcm9tICcuL3V0aWxzL2dpdGh1YlV0aWwuanMnO1xuaW1wb3J0IHsgZ2xvYklnbm9yZSB9IGZyb20gJy4vdXRpbHMvZ2xvYlV0aWwuanMnO1xuXG5leHBvcnQgaW50ZXJmYWNlIFBhY2thZ2VDb25maWcge1xuICBkaXJQYXRoOiBzdHJpbmc7XG4gIGRvY2tlcmZpbGU6IHN0cmluZztcbiAgaXNSb290OiBib29sZWFuO1xuICBpc1B1YmxpY1JlcG86IGJvb2xlYW47XG4gIGlzUmVmZXJyZWRCeU90aGVyUmVwbzogYm9vbGVhbjtcbiAgcmVwb3NpdG9yeT86IHN0cmluZztcbiAgcmVwb0F1dGhvcj86IHN0cmluZztcbiAgcmVwb05hbWU/OiBzdHJpbmc7XG4gIGlzV2lsbEJvb3N0ZXJSZXBvOiBib29sZWFuO1xuICBpc0J1bjogYm9vbGVhbjtcbiAgaXNFc21QYWNrYWdlOiBib29sZWFuO1xuICBpc1dpbGxCb29zdGVyQ29uZmlnczogYm9vbGVhbjtcbiAgLy8gZGVwZW5kZW5jeSBpbmZvcm1hdGlvblxuICBkb2VzQ29udGFpblN1YlBhY2thZ2VKc29uczogYm9vbGVhbjtcbiAgZG9lc0NvbnRhaW5Eb2NrZXJmaWxlOiBib29sZWFuO1xuICBkb2VzQ29udGFpbkdlbWZpbGU6IGJvb2xlYW47XG4gIGRvZXNDb250YWluR29Nb2Q6IGJvb2xlYW47XG4gIGRvZXNDb250YWluUGFja2FnZUpzb246IGJvb2xlYW47XG4gIGRvZXNDb250YWluUG9ldHJ5TG9jazogYm9vbGVhbjtcbiAgZG9lc0NvbnRhaW5VdkxvY2s6IGJvb2xlYW47XG4gIGRvZXNDb250YWluUG9tWG1sOiBib29sZWFuO1xuICBkb2VzQ29udGFpblB1YnNwZWNZYW1sOiBib29sZWFuO1xuICBkb2VzQ29udGFpblRlbXBsYXRlWWFtbDogYm9vbGVhbjtcbiAgZG9lc0NvbnRhaW5Wc2NvZGVTZXR0aW5nc0pzb246IGJvb2xlYW47XG4gIC8vIHNvdXJjZSBjb2RlIGZpbGVzXG4gIGRvZXNDb250YWluSmF2YVNjcmlwdDogYm9vbGVhbjtcbiAgZG9lc0NvbnRhaW5UeXBlU2NyaXB0OiBib29sZWFuO1xuICBkb2VzQ29udGFpbkpzeE9yVHN4OiBib29sZWFuO1xuICBkb2VzQ29udGFpbkphdmE6IGJvb2xlYW47XG4gIGRvZXNDb250YWluSmF2YVNjcmlwdEluUGFja2FnZXM6IGJvb2xlYW47XG4gIGRvZXNDb250YWluVHlwZVNjcmlwdEluUGFja2FnZXM6IGJvb2xlYW47XG4gIGRvZXNDb250YWluSnN4T3JUc3hJblBhY2thZ2VzOiBib29sZWFuO1xuICBkb2VzQ29udGFpbkphdmFJblBhY2thZ2VzOiBib29sZWFuO1xuXG4gIGhhc1N0YXJ0VGVzdFNlcnZlcjogYm9vbGVhbjtcblxuICBkZXBlbmRpbmc6IHtcbiAgICBibGl0ejogYm9vbGVhbjtcbiAgICBmaXJlYmFzZTogYm9vbGVhbjtcbiAgICBnZW5JMThuVHM6IGJvb2xlYW47XG4gICAgbGl0ZXN0cmVhbTogYm9vbGVhbjtcbiAgICBuZXh0OiBib29sZWFuO1xuICAgIHBsYXl3cmlnaHRUZXN0OiBib29sZWFuO1xuICAgIHByaXNtYTogYm9vbGVhbjtcbiAgICBweXJpZ2h0OiBib29sZWFuO1xuICAgIHJlYWN0OiBib29sZWFuO1xuICAgIHJlYWN0TmF0aXZlOiBib29sZWFuO1xuICAgIHNlbWFudGljUmVsZWFzZTogYm9vbGVhbjtcbiAgICBzdG9yeWJvb2s6IGJvb2xlYW47XG4gICAgd2I6IGJvb2xlYW47XG4gIH07XG4gIHJlbGVhc2U6IHtcbiAgICBicmFuY2hlczogc3RyaW5nW107XG4gICAgZ2l0aHViOiBib29sZWFuO1xuICAgIG5wbTogYm9vbGVhbjtcbiAgfTtcbiAgaGFzVmVyc2lvblNldHRpbmdzOiBib29sZWFuO1xuICBwYWNrYWdlSnNvbj86IFBhY2thZ2VKc29uO1xuICB3YmZ5SnNvbj86IFdiZnlKc29uO1xufVxuXG50eXBlIFdiZnlKc29uID0gei5pbmZlcjx0eXBlb2Ygd2JmeUpzb25TY2hlbWE+O1xuXG5jb25zdCB3YmZ5SnNvblNjaGVtYSA9IHoub2JqZWN0KHtcbiAgdHlwb3M6IHpcbiAgICAub2JqZWN0KHtcbiAgICAgIGFsbDogei5yZWNvcmQoei5zdHJpbmcoKSwgei5zdHJpbmcoKSkub3B0aW9uYWwoKSxcbiAgICAgIGRvYzogei5yZWNvcmQoei5zdHJpbmcoKSwgei5zdHJpbmcoKSkub3B0aW9uYWwoKSxcbiAgICAgIHRzOiB6LnJlY29yZCh6LnN0cmluZygpLCB6LnN0cmluZygpKS5vcHRpb25hbCgpLFxuICAgICAgdGV4dDogei5yZWNvcmQoei5zdHJpbmcoKSwgei5zdHJpbmcoKSkub3B0aW9uYWwoKSxcbiAgICB9KVxuICAgIC5vcHRpb25hbCgpLFxufSk7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZXRQYWNrYWdlQ29uZmlnKFxuICBkaXJQYXRoOiBzdHJpbmcsXG4gIHJvb3RDb25maWc/OiBQYWNrYWdlQ29uZmlnXG4pOiBQcm9taXNlPFBhY2thZ2VDb25maWcgfCB1bmRlZmluZWQ+IHtcbiAgY29uc3QgcGFja2FnZUpzb25QYXRoID0gcGF0aC5yZXNvbHZlKGRpclBhdGgsICdwYWNrYWdlLmpzb24nKTtcbiAgdHJ5IHtcbiAgICBjb25zdCBkb2VzQ29udGFpblBhY2thZ2VKc29uID0gZnMuZXhpc3RzU3luYyhwYWNrYWdlSnNvblBhdGgpO1xuICAgIGxldCBkZXBlbmRlbmNpZXM6IFBhY2thZ2VKc29uWydkZXBlbmRlbmNpZXMnXSA9IHt9O1xuICAgIGxldCBkZXZEZXBlbmRlbmNpZXM6IFBhY2thZ2VKc29uWydkZXZEZXBlbmRlbmNpZXMnXSA9IHt9O1xuICAgIGxldCBwYWNrYWdlSnNvbjogUGFja2FnZUpzb24gPSB7fTtcbiAgICBsZXQgZXNtUGFja2FnZSA9IGZhbHNlO1xuICAgIGlmIChkb2VzQ29udGFpblBhY2thZ2VKc29uKSB7XG4gICAgICBjb25zdCBwYWNrYWdlSnNvblRleHQgPSBmcy5yZWFkRmlsZVN5bmMocGFja2FnZUpzb25QYXRoLCAndXRmOCcpO1xuICAgICAgcGFja2FnZUpzb24gPSBKU09OLnBhcnNlKHBhY2thZ2VKc29uVGV4dCkgYXMgUGFja2FnZUpzb247XG4gICAgICBkZXBlbmRlbmNpZXMgPSBwYWNrYWdlSnNvbi5kZXBlbmRlbmNpZXMgPz8ge307XG4gICAgICBkZXZEZXBlbmRlbmNpZXMgPSBwYWNrYWdlSnNvbi5kZXZEZXBlbmRlbmNpZXMgPz8ge307XG4gICAgICBlc21QYWNrYWdlID0gcGFja2FnZUpzb24udHlwZSA9PT0gJ21vZHVsZSc7XG4gICAgfVxuXG4gICAgbGV0IHJlbGVhc2VCcmFuY2hlczogc3RyaW5nW10gPSBbXTtcbiAgICBsZXQgcmVsZWFzZVBsdWdpbnM6IHN0cmluZ1tdID0gW107XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJlbGVhc2VyY0pzb25QYXRoID0gcGF0aC5yZXNvbHZlKGRpclBhdGgsICcucmVsZWFzZXJjLmpzb24nKTtcbiAgICAgIGNvbnN0IGpzb24gPSBKU09OLnBhcnNlKGF3YWl0IGZzcC5yZWFkRmlsZShyZWxlYXNlcmNKc29uUGF0aCwgJ3V0ZjgnKSkgYXNcbiAgICAgICAgfCB7XG4gICAgICAgICAgICBicmFuY2hlczogc3RyaW5nW107XG4gICAgICAgICAgICBwbHVnaW5zPzogc3RyaW5nW11bXTtcbiAgICAgICAgICB9XG4gICAgICAgIHwgdW5kZWZpbmVkO1xuICAgICAgcmVsZWFzZUJyYW5jaGVzID0ganNvbj8uYnJhbmNoZXMgPz8gW107XG4gICAgICByZWxlYXNlUGx1Z2lucyA9IGpzb24/LnBsdWdpbnM/LmZsYXQoKSA/PyBbXTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIGRvIG5vdGhpbmdcbiAgICB9XG5cbiAgICBjb25zdCBpc1Jvb3QgPVxuICAgICAgcGF0aC5iYXNlbmFtZShwYXRoLnJlc29sdmUoZGlyUGF0aCwgJy4uJykpICE9PSAncGFja2FnZXMnIHx8XG4gICAgICAhZnMuZXhpc3RzU3luYyhwYXRoLnJlc29sdmUoZGlyUGF0aCwgJy4uJywgJy4uJywgJ3BhY2thZ2UuanNvbicpKTtcblxuICAgIGxldCByZXBvSW5mbzogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gfCB1bmRlZmluZWQ7XG4gICAgaWYgKGlzUm9vdCkge1xuICAgICAgcmVwb0luZm8gPSBhd2FpdCBmZXRjaFJlcG9JbmZvKGRpclBhdGgsIHBhY2thZ2VKc29uKTtcbiAgICB9XG5cbiAgICBsZXQgaGFzVmVyc2lvblNldHRpbmdzID0gaGFzVmVyc2lvblNldHRpbmdzRmlsZShkaXJQYXRoKTtcbiAgICBmb3IgKGNvbnN0IHByZWZpeCBvZiBbJ2phdmEnLCAnbm9kZScsICdweXRob24nXSkge1xuICAgICAgaWYgKGZzLmV4aXN0c1N5bmMocGF0aC5yZXNvbHZlKGRpclBhdGgsIGAuJHtwcmVmaXh9LXZlcnNpb25gKSkpIHtcbiAgICAgICAgaGFzVmVyc2lvblNldHRpbmdzID0gdHJ1ZTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuXG4gICAgbGV0IGRvY2tlcmZpbGUgPSAnJztcbiAgICB0cnkge1xuICAgICAgZG9ja2VyZmlsZSA9IGF3YWl0IGZzcC5yZWFkRmlsZShwYXRoLnJlc29sdmUoZGlyUGF0aCwgJ0RvY2tlcmZpbGUnKSwgJ3V0ZjgnKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIGRvIG5vdGhpbmdcbiAgICB9XG5cbiAgICAvLyBSZWFkIHdiZnkuanNvblxuICAgIGNvbnN0IHdiZnlKc29uUGF0aCA9IHBhdGgucmVzb2x2ZShkaXJQYXRoLCAnd2JmeS5qc29uJyk7XG4gICAgbGV0IHdiZnlKc29uOiBXYmZ5SnNvbiB8IHVuZGVmaW5lZDtcbiAgICB0cnkge1xuICAgICAgY29uc3Qgd2JmeUpzb25UZXh0ID0gYXdhaXQgZnNwLnJlYWRGaWxlKHdiZnlKc29uUGF0aCwgJ3V0ZjgnKTtcbiAgICAgIHdiZnlKc29uID0gd2JmeUpzb25TY2hlbWEucGFyc2UoSlNPTi5wYXJzZSh3YmZ5SnNvblRleHQpKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIGRvIG5vdGhpbmdcbiAgICB9XG5cbiAgICBjb25zdCByZXBvRnVsbE5hbWUgPSB0eXBlb2YgcmVwb0luZm8/LmZ1bGxfbmFtZSA9PT0gJ3N0cmluZycgPyByZXBvSW5mby5mdWxsX25hbWUgOiB1bmRlZmluZWQ7XG4gICAgbGV0IHJlcG9BdXRob3I6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgICBsZXQgcmVwb05hbWU6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgICBpZiAocmVwb0Z1bGxOYW1lKSB7XG4gICAgICBjb25zdCByZXBvUGFydHMgPSByZXBvRnVsbE5hbWUuc3BsaXQoJy8nKTtcbiAgICAgIGlmIChyZXBvUGFydHMubGVuZ3RoID49IDIpIHtcbiAgICAgICAgcmVwb0F1dGhvciA9IHJlcG9QYXJ0c1swXTtcbiAgICAgICAgcmVwb05hbWUgPSByZXBvUGFydHNbMV07XG4gICAgICB9XG4gICAgfVxuICAgIGNvbnN0IHJlcG9zaXRvcnkgPSByZXBvRnVsbE5hbWUgPyBgZ2l0aHViOiR7cmVwb0Z1bGxOYW1lfWAgOiB1bmRlZmluZWQ7XG4gICAgY29uc3QgY29uZmlnOiBQYWNrYWdlQ29uZmlnID0ge1xuICAgICAgZGlyUGF0aCxcbiAgICAgIGRvY2tlcmZpbGUsXG4gICAgICBpc1Jvb3QsXG4gICAgICBpc1B1YmxpY1JlcG86IHJlcG9JbmZvPy5wcml2YXRlID09PSBmYWxzZSxcbiAgICAgIGlzUmVmZXJyZWRCeU90aGVyUmVwbzogISFwYWNrYWdlSnNvbi5maWxlcyxcbiAgICAgIHJlcG9zaXRvcnksXG4gICAgICByZXBvQXV0aG9yLFxuICAgICAgcmVwb05hbWUsXG4gICAgICBpc1dpbGxCb29zdGVyUmVwbzogQm9vbGVhbihcbiAgICAgICAgcmVwb3NpdG9yeT8uc3RhcnRzV2l0aCgnZ2l0aHViOldpbGxCb29zdGVyLycpIHx8IHJlcG9zaXRvcnk/LnN0YXJ0c1dpdGgoJ2dpdGh1YjpXaWxsQm9vc3RlckxhYi8nKVxuICAgICAgKSxcbiAgICAgIGlzQnVuOiByb290Q29uZmlnPy5pc0J1biB8fCBmcy5leGlzdHNTeW5jKHBhdGguam9pbihkaXJQYXRoLCAnYnVuLmxvY2snKSksXG4gICAgICBpc0VzbVBhY2thZ2U6IGVzbVBhY2thZ2UsXG4gICAgICBpc1dpbGxCb29zdGVyQ29uZmlnczogcGFja2FnZUpzb25QYXRoLmluY2x1ZGVzKCcvd2lsbGJvb3N0ZXItY29uZmlncycpLFxuICAgICAgZG9lc0NvbnRhaW5TdWJQYWNrYWdlSnNvbnM6IGNvbnRhaW5zQW55KCdwYWNrYWdlcy8qKi9wYWNrYWdlLmpzb24nLCBkaXJQYXRoKSxcbiAgICAgIGRvZXNDb250YWluRG9ja2VyZmlsZTogISFkb2NrZXJmaWxlIHx8IGZzLmV4aXN0c1N5bmMocGF0aC5yZXNvbHZlKGRpclBhdGgsICdkb2NrZXItY29tcG9zZS55bWwnKSksXG4gICAgICBkb2VzQ29udGFpbkdlbWZpbGU6IGZzLmV4aXN0c1N5bmMocGF0aC5yZXNvbHZlKGRpclBhdGgsICdHZW1maWxlJykpLFxuICAgICAgZG9lc0NvbnRhaW5Hb01vZDogZnMuZXhpc3RzU3luYyhwYXRoLnJlc29sdmUoZGlyUGF0aCwgJ2dvLm1vZCcpKSxcbiAgICAgIGRvZXNDb250YWluUGFja2FnZUpzb246IGZzLmV4aXN0c1N5bmMocGF0aC5yZXNvbHZlKGRpclBhdGgsICdwYWNrYWdlLmpzb24nKSksXG4gICAgICBkb2VzQ29udGFpblBvZXRyeUxvY2s6IGZzLmV4aXN0c1N5bmMocGF0aC5yZXNvbHZlKGRpclBhdGgsICdwb2V0cnkubG9jaycpKSxcbiAgICAgIGRvZXNDb250YWluVXZMb2NrOiBmcy5leGlzdHNTeW5jKHBhdGgucmVzb2x2ZShkaXJQYXRoLCAndXYubG9jaycpKSxcbiAgICAgIGRvZXNDb250YWluUG9tWG1sOiBmcy5leGlzdHNTeW5jKHBhdGgucmVzb2x2ZShkaXJQYXRoLCAncG9tLnhtbCcpKSxcbiAgICAgIGRvZXNDb250YWluUHVic3BlY1lhbWw6IGZzLmV4aXN0c1N5bmMocGF0aC5yZXNvbHZlKGRpclBhdGgsICdwdWJzcGVjLnlhbWwnKSksXG4gICAgICBkb2VzQ29udGFpblRlbXBsYXRlWWFtbDogZnMuZXhpc3RzU3luYyhwYXRoLnJlc29sdmUoZGlyUGF0aCwgJ3RlbXBsYXRlLnlhbWwnKSksXG4gICAgICBkb2VzQ29udGFpblZzY29kZVNldHRpbmdzSnNvbjogZnMuZXhpc3RzU3luYyhwYXRoLnJlc29sdmUoZGlyUGF0aCwgJy52c2NvZGUnLCAnc2V0dGluZ3MuanNvbicpKSxcbiAgICAgIGRvZXNDb250YWluSmF2YVNjcmlwdDogY29udGFpbnNBbnkoJ3thcHAsc3JjLHRlc3Qsc2NyaXB0c30vKiovKi57Y2pzLG1qcyxqcyxqc3h9JywgZGlyUGF0aCksXG4gICAgICBkb2VzQ29udGFpblR5cGVTY3JpcHQ6IGNvbnRhaW5zQW55KCd7YXBwLHNyYyx0ZXN0LHNjcmlwdHN9LyoqLyoue2N0cyxtdHMsdHMsdHN4fScsIGRpclBhdGgpLFxuICAgICAgZG9lc0NvbnRhaW5Kc3hPclRzeDogY29udGFpbnNBbnkoJ3thcHAsc3JjLHRlc3R9LyoqLyoue3Qsan1zeCcsIGRpclBhdGgpLFxuICAgICAgZG9lc0NvbnRhaW5KYXZhOiBjb250YWluc0FueSgnKiovKi5qYXZhJywgZGlyUGF0aCksXG4gICAgICBkb2VzQ29udGFpbkphdmFTY3JpcHRJblBhY2thZ2VzOiBjb250YWluc0FueSgncGFja2FnZXMvKiove2FwcCxzcmMsdGVzdCxzY3JpcHRzfS8qKi8qLntjanMsbWpzLGpzLGpzeH0nLCBkaXJQYXRoKSxcbiAgICAgIGRvZXNDb250YWluVHlwZVNjcmlwdEluUGFja2FnZXM6IGNvbnRhaW5zQW55KCdwYWNrYWdlcy8qKi97YXBwLHNyYyx0ZXN0LHNjcmlwdHN9LyoqLyoue2N0cyxtdHMsdHMsdHN4fScsIGRpclBhdGgpLFxuICAgICAgZG9lc0NvbnRhaW5Kc3hPclRzeEluUGFja2FnZXM6IGNvbnRhaW5zQW55KCdwYWNrYWdlcy8qKi97YXBwLHNyYyx0ZXN0fS8qKi8qLnt0LGp9c3gnLCBkaXJQYXRoKSxcbiAgICAgIGRvZXNDb250YWluSmF2YUluUGFja2FnZXM6IGNvbnRhaW5zQW55KCdwYWNrYWdlcy8qKi8qLmphdmEnLCBkaXJQYXRoKSxcbiAgICAgIGhhc1N0YXJ0VGVzdFNlcnZlcjogISFwYWNrYWdlSnNvbi5zY3JpcHRzPy5bJ3N0YXJ0LXRlc3Qtc2VydmVyJ10sXG4gICAgICBkZXBlbmRpbmc6IHtcbiAgICAgICAgYmxpdHo6ICEhZGVwZW5kZW5jaWVzLmJsaXR6LFxuICAgICAgICBmaXJlYmFzZTogISFkZXZEZXBlbmRlbmNpZXNbJ2ZpcmViYXNlLXRvb2xzJ10sXG4gICAgICAgIGdlbkkxOG5UczogISFkZXBlbmRlbmNpZXNbJ2dlbi1pMThuLXRzJ10gfHwgISFkZXZEZXBlbmRlbmNpZXNbJ2dlbi1pMThuLXRzJ10sXG4gICAgICAgIGxpdGVzdHJlYW06IGRvY2tlcmZpbGUuaW5jbHVkZXMoJ2luc3RhbGwtbGl0ZXN0cmVhbS5zaCcpLFxuICAgICAgICByZWFjdDogISFkZXBlbmRlbmNpZXMucmVhY3QsXG4gICAgICAgIG5leHQ6ICEhZGVwZW5kZW5jaWVzLm5leHQsXG4gICAgICAgIHBsYXl3cmlnaHRUZXN0OlxuICAgICAgICAgICEhZGVwZW5kZW5jaWVzWydAcGxheXdyaWdodC90ZXN0J10gfHwgISFkZXZEZXBlbmRlbmNpZXNbJ0BwbGF5d3JpZ2h0L3Rlc3QnXSB8fCAhIWRldkRlcGVuZGVuY2llcy5wbGF5d3JpZ2h0LFxuICAgICAgICBwcmlzbWE6ICEhZGVwZW5kZW5jaWVzWydAcHJpc21hL2NsaWVudCddIHx8ICEhZGV2RGVwZW5kZW5jaWVzLnByaXNtYSxcbiAgICAgICAgcHlyaWdodDogISFkZXZEZXBlbmRlbmNpZXMucHlyaWdodCxcbiAgICAgICAgcmVhY3ROYXRpdmU6ICEhZGVwZW5kZW5jaWVzWydyZWFjdC1uYXRpdmUnXSxcbiAgICAgICAgc2VtYW50aWNSZWxlYXNlOiAhIShcbiAgICAgICAgICBkZXZEZXBlbmRlbmNpZXNbJ3NlbWFudGljLXJlbGVhc2UnXSB8fFxuICAgICAgICAgIHJlbGVhc2VCcmFuY2hlcy5sZW5ndGggPiAwIHx8XG4gICAgICAgICAgcmVsZWFzZVBsdWdpbnMubGVuZ3RoID4gMFxuICAgICAgICApLFxuICAgICAgICBzdG9yeWJvb2s6ICEhZGV2RGVwZW5kZW5jaWVzWydAc3Rvcnlib29rL3JlYWN0J10sXG4gICAgICAgIHdiOiAhIWRlcGVuZGVuY2llc1snQHdpbGxib29zdGVyL3diJ10gfHwgISFkZXZEZXBlbmRlbmNpZXNbJ0B3aWxsYm9vc3Rlci93YiddLFxuICAgICAgfSxcbiAgICAgIHJlbGVhc2U6IHtcbiAgICAgICAgYnJhbmNoZXM6IHJlbGVhc2VCcmFuY2hlcyxcbiAgICAgICAgZ2l0aHViOiByZWxlYXNlUGx1Z2lucy5pbmNsdWRlcygnQHNlbWFudGljLXJlbGVhc2UvZ2l0aHViJyksXG4gICAgICAgIG5wbTogcmVsZWFzZVBsdWdpbnMuaW5jbHVkZXMoJ0BzZW1hbnRpYy1yZWxlYXNlL25wbScpLFxuICAgICAgfSxcbiAgICAgIGhhc1ZlcnNpb25TZXR0aW5ncyxcbiAgICAgIHBhY2thZ2VKc29uLFxuICAgICAgd2JmeUpzb24sXG4gICAgfTtcbiAgICBpZiAoXG4gICAgICBjb25maWcuZG9lc0NvbnRhaW5HZW1maWxlIHx8XG4gICAgICBjb25maWcuZG9lc0NvbnRhaW5Hb01vZCB8fFxuICAgICAgY29uZmlnLmRvZXNDb250YWluUGFja2FnZUpzb24gfHxcbiAgICAgIGNvbmZpZy5kb2VzQ29udGFpblBvZXRyeUxvY2sgfHxcbiAgICAgIGNvbmZpZy5kb2VzQ29udGFpblV2TG9jayB8fFxuICAgICAgY29uZmlnLmRvZXNDb250YWluUG9tWG1sIHx8XG4gICAgICBjb25maWcuZG9lc0NvbnRhaW5QdWJzcGVjWWFtbCB8fFxuICAgICAgY29uZmlnLmRvZXNDb250YWluVGVtcGxhdGVZYW1sXG4gICAgKSB7XG4gICAgICByZXR1cm4gY29uZmlnO1xuICAgIH1cbiAgfSBjYXRjaCB7XG4gICAgLy8gZG8gbm90aGluZ1xuICB9XG59XG5cbmZ1bmN0aW9uIGhhc1ZlcnNpb25TZXR0aW5nc0ZpbGUoZGlyUGF0aDogc3RyaW5nKTogYm9vbGVhbiB7XG4gIGNvbnN0IGN1cnJlbnQgPSBwYXRoLnJlc29sdmUoZGlyUGF0aCk7XG4gIHJldHVybiAoXG4gICAgZnMuZXhpc3RzU3luYyhwYXRoLmpvaW4oY3VycmVudCwgJ21pc2UudG9tbCcpKSB8fFxuICAgIGZzLmV4aXN0c1N5bmMocGF0aC5qb2luKGN1cnJlbnQsICcubWlzZS50b21sJykpIHx8XG4gICAgZnMuZXhpc3RzU3luYyhwYXRoLmpvaW4oY3VycmVudCwgJy50b29sLXZlcnNpb25zJykpXG4gICk7XG59XG5cbmZ1bmN0aW9uIGNvbnRhaW5zQW55KHBhdHRlcm46IHN0cmluZywgZGlyUGF0aDogc3RyaW5nKTogYm9vbGVhbiB7XG4gIHJldHVybiBmZy5nbG9iU3luYyhwYXR0ZXJuLCB7IGRvdDogdHJ1ZSwgY3dkOiBkaXJQYXRoLCBpZ25vcmU6IGdsb2JJZ25vcmUgfSkubGVuZ3RoID4gMDtcbn1cblxuYXN5bmMgZnVuY3Rpb24gZmV0Y2hSZXBvSW5mbyhkaXJQYXRoOiBzdHJpbmcsIHBhY2thZ2VKc29uOiBQYWNrYWdlSnNvbik6IFByb21pc2U8UmVjb3JkPHN0cmluZywgdW5rbm93bj4gfCB1bmRlZmluZWQ+IHtcbiAgY29uc3QgZ2l0ID0gc2ltcGxlR2l0KGRpclBhdGgpO1xuICBjb25zdCByZW1vdGVzID0gYXdhaXQgZ2l0LmdldFJlbW90ZXModHJ1ZSk7XG4gIGNvbnN0IG9yaWdpbiA9IHJlbW90ZXMuZmluZCgocikgPT4gci5uYW1lID09PSAnb3JpZ2luJyk7XG4gIGNvbnN0IHJlbW90ZVVybCA9IG9yaWdpbj8ucmVmcy5mZXRjaCA/PyBvcmlnaW4/LnJlZnMucHVzaDtcbiAgaWYgKHR5cGVvZiByZW1vdGVVcmwgPT09ICdzdHJpbmcnKSB7XG4gICAgY29uc3QganNvbiA9IGF3YWl0IHJlcXVlc3RSZXBvSW5mbyhyZW1vdGVVcmwpO1xuICAgIGlmIChqc29uKSByZXR1cm4ganNvbjtcbiAgfVxuXG4gIGNvbnN0IHVybCA9IHR5cGVvZiBwYWNrYWdlSnNvbi5yZXBvc2l0b3J5ID09PSAnc3RyaW5nJyA/IHBhY2thZ2VKc29uLnJlcG9zaXRvcnkgOiBwYWNrYWdlSnNvbi5yZXBvc2l0b3J5Py51cmw7XG4gIGlmICh1cmwpIHtcbiAgICBjb25zdCBqc29uID0gYXdhaXQgcmVxdWVzdFJlcG9JbmZvKHVybCk7XG4gICAgaWYgKGpzb24gJiYganNvbi5tZXNzYWdlICE9PSAnTm90IEZvdW5kJykgcmV0dXJuIGpzb247XG4gIH1cbn1cblxuYXN5bmMgZnVuY3Rpb24gcmVxdWVzdFJlcG9JbmZvKHVybE9yRnVsbE5hbWU6IHN0cmluZyk6IFByb21pc2U8UmVjb3JkPHN0cmluZywgdW5rbm93bj4gfCB1bmRlZmluZWQ+IHtcbiAgY29uc3QgW29yZywgbmFtZV0gPSBnaXRIdWJVdGlsLmdldE9yZ0FuZE5hbWUodXJsT3JGdWxsTmFtZSk7XG4gIGlmICghb3JnIHx8ICFuYW1lKSByZXR1cm47XG5cbiAgY29uc3QgcmV0ID0geyBmdWxsX25hbWU6IGAke29yZ30vJHtuYW1lfWAgfTtcbiAgdHJ5IHtcbiAgICAvLyBNZXRhZGF0YSBwZXJtaXNzaW9uXG4gICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBnZXRPY3Rva2l0KCkucmVxdWVzdCgnR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfScsIHtcbiAgICAgIG93bmVyOiBvcmcsXG4gICAgICByZXBvOiBuYW1lLFxuICAgIH0pO1xuICAgIE9iamVjdC5hc3NpZ24ocmV0LCByZXNwb25zZS5kYXRhKTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBjb25zdCByZWRpcmVjdGVkRnVsbE5hbWUgPSBnZXRSZWRpcmVjdGVkUmVwb0Z1bGxOYW1lKGVycm9yKTtcbiAgICBpZiAocmVkaXJlY3RlZEZ1bGxOYW1lKSB7XG4gICAgICByZXQuZnVsbF9uYW1lID0gcmVkaXJlY3RlZEZ1bGxOYW1lO1xuICAgIH1cbiAgfVxuICByZXR1cm4gcmV0O1xufVxuXG5mdW5jdGlvbiBnZXRSZWRpcmVjdGVkUmVwb0Z1bGxOYW1lKGVycm9yOiB1bmtub3duKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgaWYgKCFlcnJvciB8fCB0eXBlb2YgZXJyb3IgIT09ICdvYmplY3QnKSByZXR1cm47XG5cbiAgY29uc3QgcmVzcG9uc2UgPVxuICAgICdyZXNwb25zZScgaW4gZXJyb3JcbiAgICAgID8gKGVycm9yIGFzIHsgcmVzcG9uc2U/OiB7IHN0YXR1cz86IG51bWJlcjsgaGVhZGVycz86IFJlY29yZDxzdHJpbmcsIHN0cmluZyB8IHVuZGVmaW5lZD4gfSB9KS5yZXNwb25zZVxuICAgICAgOiB1bmRlZmluZWQ7XG4gIGNvbnN0IHN0YXR1cyA9IHJlc3BvbnNlPy5zdGF0dXMgPz8gKGVycm9yIGFzIHsgc3RhdHVzPzogbnVtYmVyIH0pLnN0YXR1cztcbiAgaWYgKHN0YXR1cyAhPT0gMzAxICYmIHN0YXR1cyAhPT0gMzAyKSByZXR1cm47XG5cbiAgY29uc3QgbG9jYXRpb24gPSByZXNwb25zZT8uaGVhZGVycz8ubG9jYXRpb247XG4gIGlmICh0eXBlb2YgbG9jYXRpb24gIT09ICdzdHJpbmcnKSByZXR1cm47XG5cbiAgY29uc3QgW29yZywgbmFtZV0gPSBnaXRIdWJVdGlsLmdldE9yZ0FuZE5hbWUobG9jYXRpb24pO1xuICBpZiAoIW9yZyB8fCAhbmFtZSkgcmV0dXJuO1xuXG4gIHJldHVybiBgJHtvcmd9LyR7bmFtZX1gO1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHsgaWdub3JlRXJyb3JBc3luYyB9IGZyb20gJ0B3aWxsYm9vc3Rlci9zaGFyZWQtbGliL3NyYyc7XG5pbXBvcnQgeWFyZ3MgZnJvbSAneWFyZ3MnO1xuXG5pbXBvcnQgeyBmaXhOZXh0Q29uZmlnSnNvbiB9IGZyb20gJy4vZml4ZXJzL25leHRDb25maWcuanMnO1xuaW1wb3J0IHsgZml4UGxheXdyaWdodENvbmZpZyB9IGZyb20gJy4vZml4ZXJzL3BsYXl3cmlnaHRDb25maWcuanMnO1xuaW1wb3J0IHsgZml4UHJpc21hRW52RmlsZXMgfSBmcm9tICcuL2ZpeGVycy9wcmlzbWEuanMnO1xuaW1wb3J0IHsgZml4VGVzdERpcmVjdG9yaWVzVXBkYXRpbmdQYWNrYWdlSnNvbiB9IGZyb20gJy4vZml4ZXJzL3Rlc3REaXJlY3RvcnkuanMnO1xuaW1wb3J0IHsgZml4VHlwZURlZmluaXRpb25zIH0gZnJvbSAnLi9maXhlcnMvdHlwZURlZmluaXRpb24uanMnO1xuaW1wb3J0IHsgZml4VHlwb3MgfSBmcm9tICcuL2ZpeGVycy90eXBvcy5qcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZUFnZW50SW5zdHJ1Y3Rpb25zIH0gZnJvbSAnLi9nZW5lcmF0b3JzL2FnZW50cy5qcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZUJ1bmZpZ1RvbWwgfSBmcm9tICcuL2dlbmVyYXRvcnMvYnVuZmlnLmpzJztcbmltcG9ydCB7IGdlbmVyYXRlRG9ja2VyaWdub3JlIH0gZnJvbSAnLi9nZW5lcmF0b3JzL2RvY2tlcmlnbm9yZS5qcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZUVkaXRvcmNvbmZpZyB9IGZyb20gJy4vZ2VuZXJhdG9ycy9lZGl0b3Jjb25maWcuanMnO1xuaW1wb3J0IHsgZ2VuZXJhdGVHZW1pbmlDb25maWcgfSBmcm9tICcuL2dlbmVyYXRvcnMvZ2VtaW5pQ29uZmlnLmpzJztcbmltcG9ydCB7IHJlbW92ZUdlbWluaVNldHRpbmdzIH0gZnJvbSAnLi9nZW5lcmF0b3JzL2dlbWluaVNldHRpbmdzLmpzJztcbmltcG9ydCB7IGdlbmVyYXRlR2l0YXR0cmlidXRlcyB9IGZyb20gJy4vZ2VuZXJhdG9ycy9naXRhdHRyaWJ1dGVzLmpzJztcbmltcG9ydCB7IGdlbmVyYXRlR2l0aWdub3JlIH0gZnJvbSAnLi9nZW5lcmF0b3JzL2dpdGlnbm9yZS5qcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZUlkZWFTZXR0aW5ncyB9IGZyb20gJy4vZ2VuZXJhdG9ycy9pZGVhLmpzJztcbmltcG9ydCB7IGdlbmVyYXRlTGVmdGhvb2tVcGRhdGluZ1BhY2thZ2VKc29uIH0gZnJvbSAnLi9nZW5lcmF0b3JzL2xlZnRob29rLmpzJztcbmltcG9ydCB7IGdlbmVyYXRlTGludHN0YWdlZHJjIH0gZnJvbSAnLi9nZW5lcmF0b3JzL2xpbnRzdGFnZWRyYy5qcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZVBhY2thZ2VKc29uIH0gZnJvbSAnLi9nZW5lcmF0b3JzL3BhY2thZ2VKc29uLmpzJztcbmltcG9ydCB7IGdlbmVyYXRlT3hmbXRDb25maWcgfSBmcm9tICcuL2dlbmVyYXRvcnMvb3hmbXRDb25maWcuanMnO1xuaW1wb3J0IHsgZ2VuZXJhdGVPeGxpbnRDb25maWcgfSBmcm9tICcuL2dlbmVyYXRvcnMvb3hsaW50Q29uZmlnLmpzJztcbmltcG9ydCB7IGdlbmVyYXRlUHJldHRpZXJpZ25vcmUgfSBmcm9tICcuL2dlbmVyYXRvcnMvcHJldHRpZXJpZ25vcmUuanMnO1xuaW1wb3J0IHsgZ2VuZXJhdGVQeXJpZ2h0Q29uZmlnSnNvbiB9IGZyb20gJy4vZ2VuZXJhdG9ycy9weXJpZ2h0Q29uZmlnLmpzJztcbmltcG9ydCB7IGdlbmVyYXRlUmVhZG1lIH0gZnJvbSAnLi9nZW5lcmF0b3JzL3JlYWRtZS5qcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZVJlbGVhc2VyYyB9IGZyb20gJy4vZ2VuZXJhdG9ycy9yZWxlYXNlcmMuanMnO1xuaW1wb3J0IHsgZ2VuZXJhdGVSZW5vdmF0ZUpzb24gfSBmcm9tICcuL2dlbmVyYXRvcnMvcmVub3ZhdGVKc29uLmpzJztcbmltcG9ydCB7IGluc3RhbGxBZ2VudFNraWxscyB9IGZyb20gJy4vZ2VuZXJhdG9ycy9za2lsbHMuanMnO1xuaW1wb3J0IHsgZ2VuZXJhdGVUc2NvbmZpZyB9IGZyb20gJy4vZ2VuZXJhdG9ycy90c2NvbmZpZy5qcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZVZzY29kZVNldHRpbmdzIH0gZnJvbSAnLi9nZW5lcmF0b3JzL3ZzY29kZVNldHRpbmdzLmpzJztcbmltcG9ydCB7IGdlbmVyYXRlV29ya2Zsb3dzLCBpc1JldXNhYmxlV29ya2Zsb3dzUmVwbyB9IGZyb20gJy4vZ2VuZXJhdG9ycy93b3JrZmxvdy5qcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZVlhcm5yY1ltbCB9IGZyb20gJy4vZ2VuZXJhdG9ycy95YXJucmMuanMnO1xuaW1wb3J0IHsgc2V0dXBMYWJlbHMgfSBmcm9tICcuL2dpdGh1Yi9sYWJlbC5qcyc7XG5pbXBvcnQgeyBzZXR1cFNlY3JldHMgfSBmcm9tICcuL2dpdGh1Yi9zZWNyZXQuanMnO1xuaW1wb3J0IHsgc2V0dXBHaXRIdWJTZXR0aW5ncyB9IGZyb20gJy4vZ2l0aHViL3NldHRpbmdzLmpzJztcbmltcG9ydCB7IGdlbmVyYXRlR2l0SHViVGVtcGxhdGVzIH0gZnJvbSAnLi9naXRodWIvdGVtcGxhdGUuanMnO1xuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi9sb2dnZXIuanMnO1xuaW1wb3J0IHsgb3B0aW9ucyB9IGZyb20gJy4vb3B0aW9ucy5qcyc7XG5pbXBvcnQgeyBnZXRQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGRvZXNDb250YWluSnNPclRzIH0gZnJvbSAnLi91dGlscy9wYWNrYWdlQ2FwYWJpbGl0aWVzLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5pbXBvcnQgeyBzcGF3blN5bmMsIHNwYXduU3luY0FuZFJldHVyblN0YXR1cyB9IGZyb20gJy4vdXRpbHMvc3Bhd25VdGlsLmpzJztcblxuYXN5bmMgZnVuY3Rpb24gbWFpbigpOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgYXJndiA9IGF3YWl0IHlhcmdzKHByb2Nlc3MuYXJndi5zbGljZSgyKSlcbiAgICAuY29tbWFuZCgnJDAgW3BhdGhzLi5dJywgJ01ha2UgYSBnaXZlbiBwcm9qZWN0IGZvbGxvdyB0aGUgV2lsbEJvb3N0ZXIgc3RhbmRhcmQnLCAoeWFyZ3MpID0+IHtcbiAgICAgIHlhcmdzLnBvc2l0aW9uYWwoJ3BhdGhzJywge1xuICAgICAgICBkZXNjcmliZTogJ3Byb2plY3QgcGF0aHMgdG8gYmUgd2JmaWVkJyxcbiAgICAgICAgYXJyYXk6IHRydWUsXG4gICAgICAgIHR5cGU6ICdzdHJpbmcnLFxuICAgICAgICBkZWZhdWx0OiBbJy4nXSxcbiAgICAgIH0pO1xuICAgIH0pXG4gICAgLm9wdGlvbnMoe1xuICAgICAgZW52OiB7XG4gICAgICAgIGRlc2NyaXB0aW9uOiAnVXBsb2FkIGVudmlyb25tZW50IHZhcmlhYmxlcyBhcyBzZWNyZXRzIHRvIEdpdEh1YicsXG4gICAgICAgIHR5cGU6ICdib29sZWFuJyxcbiAgICAgICAgZGVmYXVsdDogZmFsc2UsXG4gICAgICAgIGFsaWFzOiAnZScsXG4gICAgICB9LFxuICAgICAgc2tpcERlcHM6IHtcbiAgICAgICAgZGVzY3JpcHRpb246ICdTa2lwIGRlcGVuZGVuY3kgaW5zdGFsbGF0aW9uJyxcbiAgICAgICAgdHlwZTogJ2Jvb2xlYW4nLFxuICAgICAgICBkZWZhdWx0OiBmYWxzZSxcbiAgICAgICAgYWxpYXM6ICdkJyxcbiAgICAgIH0sXG4gICAgICB2ZXJib3NlOiB7XG4gICAgICAgIGRlc2NyaXB0aW9uOiAnV2hldGhlciBvciBub3QgdG8gZW5hYmxlIHZlcmJvc2UgbW9kZScsXG4gICAgICAgIHR5cGU6ICdib29sZWFuJyxcbiAgICAgICAgZGVmYXVsdDogZmFsc2UsXG4gICAgICAgIGFsaWFzOiAndicsXG4gICAgICB9LFxuICAgIH0pXG4gICAgLnZlcnNpb24oZ2V0VmVyc2lvbigpKVxuICAgIC5zdHJpY3QoKS5hcmd2O1xuICBvcHRpb25zLmlzVmVyYm9zZSA9IGFyZ3YudmVyYm9zZTtcbiAgb3B0aW9ucy5kb2VzVXBsb2FkRW52VmFycyA9IGFyZ3YuZW52O1xuXG4gIGxldCBoYXNJbnZhbGlkUGFja2FnZUNvbmZpZyA9IGZhbHNlO1xuICBmb3IgKGNvbnN0IHJvb3REaXJQYXRoIG9mIGFyZ3YucGF0aHMgYXMgc3RyaW5nW10pIHtcbiAgICBjb25zdCBwYWNrYWdlc0RpclBhdGggPSBwYXRoLmpvaW4ocm9vdERpclBhdGgsICdwYWNrYWdlcycpO1xuICAgIGNvbnN0IGRpcmVudHMgPSAoYXdhaXQgaWdub3JlRXJyb3JBc3luYygoKSA9PiBmcy5wcm9taXNlcy5yZWFkZGlyKHBhY2thZ2VzRGlyUGF0aCwgeyB3aXRoRmlsZVR5cGVzOiB0cnVlIH0pKSkgPz8gW107XG4gICAgY29uc3Qgc3ViRGlyUGF0aHMgPSBkaXJlbnRzLmZpbHRlcigoZCkgPT4gZC5pc0RpcmVjdG9yeSgpKS5tYXAoKGQpID0+IHBhdGguam9pbihwYWNrYWdlc0RpclBhdGgsIGQubmFtZSkpO1xuXG4gICAgYXdhaXQgZml4VGVzdERpcmVjdG9yaWVzVXBkYXRpbmdQYWNrYWdlSnNvbihbcm9vdERpclBhdGgsIC4uLnN1YkRpclBhdGhzXSk7XG5cbiAgICBjb25zdCByb290Q29uZmlnID0gYXdhaXQgZ2V0UGFja2FnZUNvbmZpZyhyb290RGlyUGF0aCk7XG4gICAgaWYgKG9wdGlvbnMuaXNWZXJib3NlKSB7XG4gICAgICBjb25zb2xlLmxvZygncm9vdENvbmZpZzonLCByb290Q29uZmlnKTtcbiAgICB9XG4gICAgaWYgKCFyb290Q29uZmlnKSB7XG4gICAgICBjb25zb2xlLmVycm9yKGB0aGVyZSBpcyBubyB2YWxpZCBwYWNrYWdlLmpzb24gaW4gJHtyb290RGlyUGF0aH1gKTtcbiAgICAgIGhhc0ludmFsaWRQYWNrYWdlQ29uZmlnID0gdHJ1ZTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBjb25zdCBhYmJyZXZpYXRpb25Qcm9taXNlID0gZml4VHlwb3Mocm9vdENvbmZpZyk7XG5cbiAgICBjb25zdCBudWxsYWJsZVN1YlBhY2thZ2VDb25maWdzID0gYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgICBzdWJEaXJQYXRocy5tYXAoKHN1YkRpclBhdGgpID0+IGdldFBhY2thZ2VDb25maWcoc3ViRGlyUGF0aCwgcm9vdENvbmZpZykpXG4gICAgKTtcbiAgICBjb25zdCBzdWJQYWNrYWdlQ29uZmlncyA9IG51bGxhYmxlU3ViUGFja2FnZUNvbmZpZ3MuZmlsdGVyKChjb25maWcpID0+ICEhY29uZmlnKTtcbiAgICBjb25zdCBhbGxQYWNrYWdlQ29uZmlncyA9IFtyb290Q29uZmlnLCAuLi5zdWJQYWNrYWdlQ29uZmlnc107XG5cbiAgICBpZiAob3B0aW9ucy5pc1ZlcmJvc2UpIHtcbiAgICAgIGZvciAoY29uc3QgY29uZmlnIG9mIGFsbFBhY2thZ2VDb25maWdzKSB7XG4gICAgICAgIGNvbnNvbGUuaW5mbyhjb25maWcpO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIEluc3RhbGwgeWFybiBiZXJyeVxuICAgIGF3YWl0IGdlbmVyYXRlWWFybnJjWW1sKHJvb3RDb25maWcpO1xuICAgIGlmIChyb290Q29uZmlnLmlzQnVuKSB7XG4gICAgICBhd2FpdCBnZW5lcmF0ZUJ1bmZpZ1RvbWwocm9vdENvbmZpZyk7XG4gICAgfVxuXG4gICAgY29uc3Qgc2hvdWxkUnVuV29ya2Zsb3dzID1cbiAgICAgICFpc1JldXNhYmxlV29ya2Zsb3dzUmVwbyhyb290Q29uZmlnLnJlcG9zaXRvcnkpICYmXG4gICAgICAocm9vdENvbmZpZy5yZXBvc2l0b3J5Py5zdGFydHNXaXRoKCdnaXRodWI6V2lsbEJvb3N0ZXIvJykgfHxcbiAgICAgICAgcm9vdENvbmZpZy5yZXBvc2l0b3J5Py5zdGFydHNXaXRoKCdnaXRodWI6V2lsbEJvb3N0ZXJMYWIvJykpO1xuICAgIGF3YWl0IFByb21pc2UuYWxsKFtcbiAgICAgIGZpeFByaXNtYUVudkZpbGVzKHJvb3RDb25maWcpLFxuICAgICAgYWJicmV2aWF0aW9uUHJvbWlzZS50aGVuKCgpID0+IGdlbmVyYXRlUmVhZG1lKHJvb3RDb25maWcpKSxcbiAgICAgIGdlbmVyYXRlQWdlbnRJbnN0cnVjdGlvbnMocm9vdENvbmZpZywgYWxsUGFja2FnZUNvbmZpZ3MpLFxuICAgICAgZ2VuZXJhdGVEb2NrZXJpZ25vcmUocm9vdENvbmZpZyksXG4gICAgICBnZW5lcmF0ZUVkaXRvcmNvbmZpZyhyb290Q29uZmlnKSxcbiAgICAgIGdlbmVyYXRlR2VtaW5pQ29uZmlnKHJvb3RDb25maWcsIGFsbFBhY2thZ2VDb25maWdzKSxcbiAgICAgIHJlbW92ZUdlbWluaVNldHRpbmdzKHJvb3RDb25maWcpLFxuICAgICAgZ2VuZXJhdGVHaXRhdHRyaWJ1dGVzKHJvb3RDb25maWcpLFxuICAgICAgZ2VuZXJhdGVHaXRIdWJUZW1wbGF0ZXMocm9vdENvbmZpZyksXG4gICAgICBnZW5lcmF0ZUlkZWFTZXR0aW5ncyhyb290Q29uZmlnKSxcbiAgICAgIGdlbmVyYXRlUmVub3ZhdGVKc29uKHJvb3RDb25maWcpLFxuICAgICAgZ2VuZXJhdGVSZWxlYXNlcmMocm9vdENvbmZpZyksXG4gICAgICAuLi4oc2hvdWxkUnVuV29ya2Zsb3dzID8gW2dlbmVyYXRlV29ya2Zsb3dzKHJvb3RDb25maWcpXSA6IFtdKSxcbiAgICAgIHNldHVwTGFiZWxzKHJvb3RDb25maWcpLFxuICAgICAgc2V0dXBTZWNyZXRzKHJvb3RDb25maWcpLFxuICAgICAgc2V0dXBHaXRIdWJTZXR0aW5ncyhyb290Q29uZmlnKSxcbiAgICAgIGdlbmVyYXRlTGVmdGhvb2tVcGRhdGluZ1BhY2thZ2VKc29uKHJvb3RDb25maWcpLFxuICAgICAgZ2VuZXJhdGVMaW50c3RhZ2VkcmMocm9vdENvbmZpZyksXG4gICAgXSk7XG4gICAgYXdhaXQgcHJvbWlzZVBvb2wucHJvbWlzZUFsbCgpO1xuXG4gICAgY29uc3QgcHJvbWlzZXM6IFByb21pc2U8dm9pZD5bXSA9IFtdO1xuICAgIGZvciAoY29uc3QgY29uZmlnIG9mIGFsbFBhY2thZ2VDb25maWdzKSB7XG4gICAgICBpZiAoY29uZmlnLmRvZXNDb250YWluVHlwZVNjcmlwdCB8fCBjb25maWcuZG9lc0NvbnRhaW5UeXBlU2NyaXB0SW5QYWNrYWdlcykge1xuICAgICAgICBwcm9taXNlcy5wdXNoKGZpeFR5cGVEZWZpbml0aW9ucyhjb25maWcsIGNvbmZpZy5pc1Jvb3QgPyBhbGxQYWNrYWdlQ29uZmlncyA6IFtjb25maWddKSk7XG4gICAgICB9XG4gICAgICBpZiAoY29uZmlnLmRlcGVuZGluZy5wbGF5d3JpZ2h0VGVzdCkge1xuICAgICAgICBwcm9taXNlcy5wdXNoKGZpeFBsYXl3cmlnaHRDb25maWcoY29uZmlnKSk7XG4gICAgICB9XG4gICAgICBpZiAoY29uZmlnLmRlcGVuZGluZy5uZXh0KSB7XG4gICAgICAgIHByb21pc2VzLnB1c2goZml4TmV4dENvbmZpZ0pzb24oY29uZmlnKSk7XG4gICAgICB9XG4gICAgICBhd2FpdCBnZW5lcmF0ZUdpdGlnbm9yZShjb25maWcsIHJvb3RDb25maWcpO1xuICAgICAgYXdhaXQgcHJvbWlzZVBvb2wucHJvbWlzZUFsbCgpO1xuICAgICAgaWYgKCFjb25maWcuaXNSb290ICYmICFjb25maWcuZG9lc0NvbnRhaW5QYWNrYWdlSnNvbikge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGF3YWl0IGdlbmVyYXRlUHJldHRpZXJpZ25vcmUoY29uZmlnKTtcbiAgICAgIGF3YWl0IGdlbmVyYXRlUGFja2FnZUpzb24oY29uZmlnLCByb290Q29uZmlnLCBhcmd2LnNraXBEZXBzKTtcblxuICAgICAgcHJvbWlzZXMucHVzaChnZW5lcmF0ZUxpbnRzdGFnZWRyYyhjb25maWcpKTtcbiAgICAgIGlmIChjb25maWcuZG9lc0NvbnRhaW5Wc2NvZGVTZXR0aW5nc0pzb24gJiYgY29uZmlnLmRvZXNDb250YWluUGFja2FnZUpzb24pIHtcbiAgICAgICAgcHJvbWlzZXMucHVzaChnZW5lcmF0ZVZzY29kZVNldHRpbmdzKGNvbmZpZykpO1xuICAgICAgfVxuICAgICAgaWYgKGNvbmZpZy5kb2VzQ29udGFpblR5cGVTY3JpcHQgfHwgY29uZmlnLmRvZXNDb250YWluVHlwZVNjcmlwdEluUGFja2FnZXMpIHtcbiAgICAgICAgcHJvbWlzZXMucHVzaChnZW5lcmF0ZVRzY29uZmlnKGNvbmZpZykpO1xuICAgICAgfVxuICAgICAgaWYgKGRvZXNDb250YWluSnNPclRzKGNvbmZpZykpIHtcbiAgICAgICAgcHJvbWlzZXMucHVzaChnZW5lcmF0ZU94Zm10Q29uZmlnKGNvbmZpZykpO1xuICAgICAgICBwcm9taXNlcy5wdXNoKGdlbmVyYXRlT3hsaW50Q29uZmlnKGNvbmZpZywgcm9vdENvbmZpZykpO1xuICAgICAgfVxuICAgICAgaWYgKGNvbmZpZy5kZXBlbmRpbmcucHlyaWdodCkge1xuICAgICAgICBwcm9taXNlcy5wdXNoKGdlbmVyYXRlUHlyaWdodENvbmZpZ0pzb24oY29uZmlnKSk7XG4gICAgICB9XG4gICAgfVxuICAgIGF3YWl0IFByb21pc2UuYWxsKHByb21pc2VzKTtcbiAgICBhd2FpdCBwcm9taXNlUG9vbC5wcm9taXNlQWxsKCk7XG5cbiAgICBjb25zdCBwYWNrYWdlTWFuYWdlciA9IHJvb3RDb25maWcuaXNCdW4gPyAnYnVuJyA6ICd5YXJuJztcbiAgICAvLyBSZWZyZXNoIGxvY2sgZmlsZXNcbiAgICBpZiAocm9vdENvbmZpZy5pc0J1bikge1xuICAgICAgYXdhaXQgbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ3JlZnJlc2hCdW5Mb2NrJywgYXN5bmMgKCkgPT4ge1xuICAgICAgICBhd2FpdCBQcm9taXNlLnJlc29sdmUoKTtcbiAgICAgICAgcmVmcmVzaEJ1bkxvY2socm9vdERpclBhdGgpO1xuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHNwYXduU3luYyhwYWNrYWdlTWFuYWdlciwgWydpbnN0YWxsJywgJy0tbm8taW1tdXRhYmxlJ10sIHJvb3REaXJQYXRoKTtcbiAgICB9XG4gICAgc3Bhd25TeW5jKHBhY2thZ2VNYW5hZ2VyLCBbJ2NsZWFudXAnXSwgcm9vdERpclBhdGgpO1xuXG4gICAgYXdhaXQgaW5zdGFsbEFnZW50U2tpbGxzKHJvb3RDb25maWcpO1xuICB9XG4gIGlmIChoYXNJbnZhbGlkUGFja2FnZUNvbmZpZykge1xuICAgIHByb2Nlc3MuZXhpdENvZGUgPSAxO1xuICB9XG59XG5cbmZ1bmN0aW9uIHJlZnJlc2hCdW5Mb2NrKHJvb3REaXJQYXRoOiBzdHJpbmcpOiB2b2lkIHtcbiAgLy8gd2JmeSBzaG91bGQgdXBkYXRlIG9ubHkgdGhlIHBhY2thZ2VzIGl0IGV4cGxpY2l0bHkgbWFuYWdlcyB0aHJvdWdoIGJ1biBhZGQuXG4gIC8vIFJ1bm5pbmcgYnVuIHVwZGF0ZSBoZXJlIHJlZnJlc2hlcyB1bnJlbGF0ZWQgYXBwbGljYXRpb24gZGVwZW5kZW5jaWVzIGFuZFxuICAvLyBjYW4gY2hhbmdlIHByb2R1Y3QgYmVoYXZpb3IsIHNvIGtlZXAgdGhlIGV4aXN0aW5nIGxvY2sgYW5kIHJlY29uY2lsZSBpdC5cbiAgY29uc3Qgc3RhdHVzID0gc3Bhd25TeW5jQW5kUmV0dXJuU3RhdHVzKCdidW4nLCBbJ2luc3RhbGwnXSwgcm9vdERpclBhdGgpO1xuICBpZiAoc3RhdHVzICE9PSAwKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBGYWlsZWQgdG8gcmVmcmVzaCBCdW4gbG9ja2ZpbGU6IGJ1biBpbnN0YWxsIGV4aXRlZCB3aXRoIHN0YXR1cyAke3N0YXR1c31gKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBnZXRWZXJzaW9uKCk6IHN0cmluZyB7XG4gIGxldCBwYWNrYWdlSnNvbkRpciA9IHBhdGguZGlybmFtZShuZXcgVVJMKGltcG9ydC5tZXRhLnVybCkucGF0aG5hbWUpO1xuICB3aGlsZSAoIWZzLmV4aXN0c1N5bmMocGF0aC5qb2luKHBhY2thZ2VKc29uRGlyLCAncGFja2FnZS5qc29uJykpKSB7XG4gICAgcGFja2FnZUpzb25EaXIgPSBwYXRoLmRpcm5hbWUocGFja2FnZUpzb25EaXIpO1xuICB9XG4gIGNvbnN0IHBhY2thZ2VKc29uID0gSlNPTi5wYXJzZShmcy5yZWFkRmlsZVN5bmMocGF0aC5qb2luKHBhY2thZ2VKc29uRGlyLCAncGFja2FnZS5qc29uJyksICd1dGY4JykpIGFzIHtcbiAgICB2ZXJzaW9uOiBzdHJpbmc7XG4gIH07XG4gIHJldHVybiBwYWNrYWdlSnNvbi52ZXJzaW9uO1xufVxuXG5hd2FpdCBtYWluKCk7XG4iXSwibmFtZXMiOlsiYXN5bmMiLCJzbGVlcCIsIm1pbGxpc2Vjb25kcyIsIlByb21pc2UiLCJyZXNvbHZlIiwic2V0VGltZW91dCIsImlnbm9yZUVycm9yQXN5bmMiLCJmbiIsImlnbm9yZUVub2VudEFzeW5jIiwiZXJyb3IiLCJjb2RlIiwib3B0aW9ucyIsImlzVmVyYm9zZSIsImRvZXNVcGxvYWRFbnZWYXJzIiwibG9nZ2VyIiwiZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbiIsIm5hbWUiLCJmdW5jIiwiY29uc29sZSIsImluZm8iLCJFcnJvciIsInN0YWNrIiwiU3RyaW5nIiwiZnNVdGlsIiwicmVhZEZpbGVJZ25vcmluZ0Vycm9yIiwiZmlsZVBhdGgiLCJmcyIsInByb21pc2VzIiwicmVhZEZpbGUiLCJnZW5lcmF0ZUZpbGUiLCJjb250ZW50IiwibWtkaXIiLCJwYXRoIiwiZGlybmFtZSIsInJlY3Vyc2l2ZSIsIm5vcm1hbGl6ZWRDb250ZW50IiwidHJpbSIsIndyaXRlRmlsZSIsInByb21pc2VQb29sIiwiUHJvbWlzZVBvb2wiLCJmaXhOZXh0Q29uZmlnSnNvbiIsImNvbmZpZyIsIm1hcCIsImV4dCIsImRpclBhdGgiLCJmaW5kIiwicCIsImV4aXN0c1N5bmMiLCJvbGRDb250ZW50Iiwib2JqZWN0TGl0ZXJhbCIsInNvdXJjZSIsInRzIiwiY3JlYXRlU291cmNlRmlsZSIsIlNjcmlwdFRhcmdldCIsIkxhdGVzdCIsIlNjcmlwdEtpbmQiLCJKUyIsInZpc2l0Iiwibm9kZSIsImlzRXhwb3J0QXNzaWdubWVudCIsImlzT2JqZWN0TGl0ZXJhbEV4cHJlc3Npb24iLCJleHByZXNzaW9uIiwiaXNCaW5hcnlFeHByZXNzaW9uIiwib3BlcmF0b3JUb2tlbiIsImtpbmQiLCJTeW50YXhLaW5kIiwiRXF1YWxzVG9rZW4iLCJsZWZ0IiwiZ2V0VGV4dCIsInJpZ2h0IiwiZm9yRWFjaENoaWxkIiwiZ2V0TmV4dENvbmZpZ09iamVjdExpdGVyYWwiLCJwcm9wZXJ0eVRleHRzIiwiU2V0IiwicHJvcGVydGllcyIsInByb3BlcnR5IiwiaGFzIiwicHVzaCIsImxlbmd0aCIsImluc2VydGlvblBvaW50IiwiZ2V0RW5kIiwibGFzdFByb3BlcnR5IiwiYXQiLCJoYXNUcmFpbGluZ0NvbW1hIiwic2xpY2UiLCJpbmNsdWRlcyIsInByZWZpeCIsIm5ld0NvbnRlbnQiLCJqb2luIiwicnVuIiwibGl0ZXJhbCIsInZhbHVlIiwiYXNPYmplY3QiLCJleHRyYU1lbWJlcnMiLCJ0b1BhcnNlZE9iamVjdCIsImRlZmF1bHRDb25maWciLCJmb3JiaWRPbmx5IiwicmV0cmllcyIsInVzZSIsImJhc2VVUkwiLCJ0cmFjZSIsInNjcmVlbnNob3QiLCJ2aWRlbyIsIndlYlNlcnZlciIsImNvbW1hbmQiLCJ1cmwiLCJyZXVzZUV4aXN0aW5nU2VydmVyIiwidGltZW91dCIsInN0ZG91dCIsInN0ZGVyciIsImVudiIsImdyYWNlZnVsU2h1dGRvd24iLCJtZW1iZXJPcmRlciIsIk9iamVjdCIsImtleXMiLCJrZXkiLCJfIiwiaW5kZXgiLCJmaXhQbGF5d3JpZ2h0Q29uZmlnIiwiZW52RmlsZVBhdGgiLCJlbnZGaWxlTmFtZXMiLCJlbnZGaWxlUGF0aHMiLCJjdXJyZW50RGlyUGF0aCIsImZpbGVOYW1lIiwiZ2V0RW52RmlsZVBhdGhzIiwidGVzdCIsImFzc2VydE5leHRQdWJsaWNCYXNlVXJsIiwiZXh0cmFjdGVkT2JqZWN0TGl0ZXJhbCIsIlRTIiwiZm91bmQiLCJpc0NhbGxFeHByZXNzaW9uIiwiZmlyc3RBcmd1bWVudCIsImFyZ3VtZW50cyIsInVuZGVmaW5lZCIsImV4dHJhY3REZWZpbmVDb25maWdPYmplY3RMaXRlcmFsIiwicGFyc2VkIiwicGFyc2VPYmplY3RMaXRlcmFsRXhwcmVzc2lvbiIsIm1lcmdlZCIsIm1lcmdlUGFyc2VkT2JqZWN0cyIsImhhc1N0YXJ0VGVzdFNlcnZlciIsIkJvb2xlYW4iLCJwYWNrYWdlSnNvbiIsInNjcmlwdHMiLCJoYXNFeGlzdGluZ1dlYlNlcnZlciIsIm9iamVjdCIsImlzQnVuIiwic2V0V2ViU2VydmVyQ29tbWFuZCIsIm5ld09iamVjdExpdGVyYWwiLCJzdHJpbmdpZnlWYWx1ZSIsInN0YXJ0IiwiZ2V0U3RhcnQiLCJlbmQiLCJiYXNlIiwib3ZlcnJpZGUiLCJvdmVycmlkZVByb3BlcnR5S2V5cyIsImZpbHRlciIsIm1lbWJlciIsImVudHJpZXMiLCJtZXJnZVBhcnNlZFZhbHVlIiwicGFyc2VFeHByZXNzaW9uIiwicGFyc2VkT2JqZWN0IiwiaXNBcnJheUxpdGVyYWxFeHByZXNzaW9uIiwiZWxlbWVudHMiLCJlbGVtZW50Iiwic29tZSIsImlzU2hvcnRoYW5kUHJvcGVydHlBc3NpZ25tZW50IiwiaXNQcm9wZXJ0eUFzc2lnbm1lbnQiLCJpc0lkZW50aWZpZXIiLCJpc1N0cmluZ0xpdGVyYWwiLCJpbml0aWFsaXplciIsImxldmVsIiwiY2xvc2luZ0luZGVudCIsInJlcGVhdCIsImluZGVudCIsIml0ZW0iLCJzdHJpbmdpZmllZCIsInNwbGl0IiwiZW1pdHRlZFByb3BlcnRpZXMiLCJsYXN0UHJvcGVydHlJbmRleEJ5S2V5IiwiTWFwIiwic2V0IiwiZ2V0TGFzdFByb3BlcnR5SW5kZXhCeUtleSIsImxpbmVzIiwiZmxhdE1hcCIsInN0cmluZ2lmeU9iamVjdE1lbWJlciIsImdldCIsImFkZCIsInN0cmluZ2lmeU9iamVjdFByb3BlcnR5IiwibGluZSIsImdsb2JJZ25vcmUiLCJmaXhQcmlzbWFFbnZGaWxlcyIsImVudkZpbGVzIiwiZmciLCJnbG9iIiwiZG90IiwiY3dkIiwiaWdub3JlIiwiZW52RmlsZSIsInJlcGxhY2VBbGwiLCJtYXRjaCIsInNlcGFyYXRvciIsInByb3RvdHlwZSIsImhhc093blByb3BlcnR5IiwiY2FsbCIsInNvcnRPYmplY3RCeUtleU5hbWVMaXN0Iiwic29ydFdpdGgiLCJzb3J0Rm4iLCJ0b3RhbCIsIm9iamVjdEtleXMiLCJzb3J0IiwiSU5ERU5UX1JFR0VYIiwiSU5ERU5UX1RZUEVfU1BBQ0UiLCJzaG91bGRJZ25vcmVTaW5nbGVTcGFjZSIsImlnbm9yZVNpbmdsZVNwYWNlcyIsImluZGVudFR5cGUiLCJtYWtlSW5kZW50c01hcCIsInN0cmluZyIsImluZGVudHMiLCJwcmV2aW91c0luZGVudFR5cGUiLCJwcmV2aW91c1NpemUiLCJtYXRjaGVzIiwid2VpZ2h0IiwiaW5kZW50RGlmZmVyZW5jZSIsImFic29sdXRlSW5kZW50RGlmZmVyZW5jZSIsIk1hdGgiLCJhYnMiLCJlbmNvZGVJbmRlbnRzS2V5IiwiZW50cnkiLCJpbmRlbnRBbW91bnQiLCJkZXRlY3RJbmRlbnQiLCJUeXBlRXJyb3IiLCJzaXplIiwia2V5T2ZNb3N0VXNlZEluZGVudCIsInJlc3VsdCIsIm1heFVzZWQiLCJtYXhXZWlnaHQiLCJ1c2VkQ291bnQiLCJnZXRNb3N0VXNlZEtleSIsInR5cGUiLCJhbW91bnQiLCJpbmRlbnRzS2V5IiwiTnVtYmVyIiwibWFrZUluZGVudFN0cmluZyIsImRldGVjdE5ld2xpbmVHcmFjZWZ1bCIsIm5ld2xpbmVzIiwiY3JsZiIsIm5ld2xpbmUiLCJkZXRlY3ROZXdsaW5lIiwicGlwZSIsImZucyIsIngiLCJhcmdzIiwicmVkdWNlIiwib25BcnJheSIsIkFycmF5IiwiaXNBcnJheSIsIm9uU3RyaW5nQXJyYXkiLCJldmVyeSIsInVuaXEiLCJ4cyIsInNvcnRBcnJheSIsImFycmF5IiwidG9Tb3J0ZWQiLCJ1bmlxQW5kU29ydEFycmF5Iiwib25PYmplY3QiLCJnZXRQcm90b3R5cGVPZiIsIlN5bWJvbCIsInRvU3RyaW5nVGFnIiwiaXRlcmF0b3IiLCJpc1BsYWluT2JqZWN0Iiwic29ydE9iamVjdEJ5IiwiY29tcGFyYXRvciIsImRlZXAiLCJvdmVyIiwiZnJvbUVudHJpZXMiLCJzb3J0T2JqZWN0S2V5cyIsIm9iamVjdEdyb3VwQnkiLCJncm91cEJ5IiwiY2FsbGJhY2siLCJjcmVhdGUiLCJzb3J0T2JqZWN0Iiwic29ydFVSTE9iamVjdCIsInNvcnRQZW9wbGVPYmplY3QiLCJzb3J0RGlyZWN0b3JpZXMiLCJvdmVyUHJvcGVydHkiLCJoYXNPd24iLCJzb3J0R2l0SG9va3MiLCJwYXJzZU5hbWVBbmRWZXJzaW9uUmFuZ2UiLCJzcGVjaWZpZXIiLCJuYW1lQW5kVmVyc2lvbiIsImF0TWF0Y2hlcyIsIm1hdGNoQWxsIiwic3BsaXRJbmRleCIsInBvcCIsInN1YnN0cmluZyIsInJhbmdlIiwic29ydE9iamVjdEJ5U2VtdmVyIiwiYSIsImIiLCJhTmFtZSIsImFSYW5nZSIsImJOYW1lIiwiYlJhbmdlIiwibG9jYWxlQ29tcGFyZSIsInNlbXZlckNvbXBhcmUiLCJzZW12ZXJNaW5WZXJzaW9uIiwiZ2V0UGFja2FnZU5hbWUiLCJpZGVudCIsImluZGV4T2YiLCJzdGFydHNXaXRoIiwiY2FjaGUiLCJzaG91bGRTb3J0RGVwZW5kZW5jaWVzTGlrZU5wbSIsInBhY2thZ2VNYW5hZ2VyIiwiZGV2RW5naW5lcyIsInBucG0iLCJlbmdpbmVzIiwibnBtIiwicHJvY2VzcyIsImhhc1lhcm5PclBucG1GaWxlcyIsInNvcnREZXBlbmRlbmNpZXMiLCJkZXBlbmRlbmNpZXMiLCJzb3J0V29ya3NwYWNlcyIsInNvcnRFc2xpbnRDb25maWciLCJvdmVycmlkZXMiLCJydWxlMSIsInJ1bGUyIiwic29ydFZTQ29kZUJhZGdlT2JqZWN0Iiwic29ydFByZXR0aWVyQ29uZmlnIiwic29ydFZvbHRhIiwic29ydERldkVuZ2luZXMiLCJzb3J0UG5wbUNvbmZpZyIsImRlZmF1bHROcG1TY3JpcHRzIiwiaGFzRGV2RGVwZW5kZW5jeSIsImRlcGVuZGVuY3kiLCJkZXZEZXBlbmRlbmNpZXMiLCJydW5TUmVnRXhwIiwiaGFzU2VxdWVudGlhbFNjcmlwdCIsImZpZWxkIiwidmFsdWVzIiwic2NyaXB0IiwiaXNTZXF1ZW50aWFsU2NyaXB0Iiwic29ydFNjcmlwdE5hbWVzIiwiZ3JvdXBNYXAiLCJpZHgiLCJmcm9tIiwiZ3JvdXBLZXkiLCJjaGlsZHJlbiIsImsiLCJzb3J0U2NyaXB0cyIsIm5hbWVzIiwicHJlZml4YWJsZSIsIm9taXR0ZWQiLCJyZXBsYWNlIiwic29ydENvbmRpdGlvbnMiLCJjb25kaXRpb25zIiwiZGVmYXVsdENvbmRpdGlvbnMiLCJyZXN0Q29uZGl0aW9ucyIsImNvbmRpdGlvbiIsInNvcnRFeHBvcnRzIiwiZXhwb3J0cyIsInBhdGhzIiwiZmllbGRzIiwibWFpbnRhaW5lcnMiLCJjb250cmlidXRvcnMiLCJwYWNrYWdlTmFtZUEiLCJwYWNrYWdlTmFtZUIiLCJiYWRnZSIsImRlZmF1bHRTb3J0T3JkZXIiLCJvdmVyRmllbGRzIiwic29ydFBhY2thZ2VKc29uIiwianNvbklzaCIsImpzb24iLCJlbmRDaGFyYWN0ZXJzIiwiSlNPTiIsInBhcnNlIiwic3RyaW5naWZ5IiwiZWRpdFN0cmluZ0pTT04iLCJzb3J0T3JkZXIiLCJwcml2YXRlS2V5cyIsInB1YmxpY0tleXMiLCJmaXhUZXN0RGlyZWN0b3JpZXNVcGRhdGluZ1BhY2thZ2VKc29uIiwicGFja2FnZURpclBhdGhzIiwiYWxsIiwicGFja2FnZUpzb25QYXRoIiwicGFja2FnZURpclBhdGgiLCJuZXdUZXN0RGlyUGF0aCIsIm9sZFRlc3REaXJOYW1lIiwib2xkVGVzdERpclBhdGgiLCJtb3ZlVGVzdERpcmVjdG9yeSIsImRpZFVwZGF0ZVNjcmlwdCIsInNjcmlwdE5hbWUiLCJuZXdTY3JpcHQiLCJyZW5hbWUiLCJkaXJlbnRzIiwicmVhZGRpciIsIndpdGhGaWxlVHlwZXMiLCJvbGRQYXRoIiwiZGlyZW50IiwibmV3UGF0aCIsIm5ld1BhdGhTdGF0Iiwic3RhdCIsImlzRGlyZWN0b3J5Iiwicm0iLCJmaXhUeXBlRGVmaW5pdGlvbnMiLCJjb25maWdzSW5jbHVkaW5nQ2hpbGRyZW4iLCJsaWJUeXBlRGlyUGF0aCIsInNyY1R5cGVEaXJQYXRoIiwiaXNSb290IiwiZG9lc0NvbnRhaW5TdWJQYWNrYWdlSnNvbnMiLCJkaXJOYW1lIiwiaGFzVHlwZURlY2xhcmF0aW9uRXh0ZW5zaW9uIiwiZW5kc1dpdGgiLCJwYWNrYWdlTmFtZSIsImhhc0xpYnJhcnkiLCJpc0ZpbGUiLCJvdmVyd3JpdGVNZXJnZSIsImRlc3RpbmF0aW9uQXJyYXkiLCJzb3VyY2VBcnJheSIsImNvbWJpbmVNZXJnZSIsInRhcmdldCIsImRlc3RpbmF0aW9uIiwiY2xvbmVVbmxlc3NPdGhlcndpc2VTcGVjaWZpZWQiLCJpc01lcmdlYWJsZU9iamVjdCIsIm1lcmdlIiwic29ydEtleXMiLCJvYmoiLCJrZXlBbmRWYWx1ZXMiLCJrZXkxIiwia2V5MiIsInB1YmxpY1JlcG9BdXRvZml4V29ya2Zsb3ciLCJvbiIsInB1bGxfcmVxdWVzdCIsImJyYW5jaGVzIiwicGVybWlzc2lvbnMiLCJjb250ZW50cyIsImNvbmN1cnJlbmN5IiwiZ3JvdXAiLCJqb2JzIiwiYXV0b2ZpeCIsInByaXZhdGVSZXBvQXV0b2ZpeFdvcmtmbG93IiwidXNlcyIsIndvcmtmbG93cyIsInJlbGVhc2UiLCJwdWxsX3JlcXVlc3RfdGFyZ2V0IiwidHlwZXMiLCJzeW5jIiwiaXNzdWVzIiwiaWYiLCJ3aXRoIiwic2VjcmV0cyIsIkNMQVVERV9DT0RFX09BVVRIX1RPS0VOIiwiT1BFTkFJX0FQSV9LRVkiLCJHRU1JTklfQVBJX0tFWSIsImdlbmVyYXRlV29ya2Zsb3dzIiwicm9vdENvbmZpZyIsImlzUmV1c2FibGVXb3JrZmxvd3NSZXBvIiwicmVwb3NpdG9yeSIsIndvcmtmbG93c1BhdGgiLCJzZW1hbnRpY1ltbFBhdGgiLCJmb3JjZSIsImZpbGVOYW1lU2V0IiwiZGVwZW5kaW5nIiwic2VtYW50aWNSZWxlYXNlIiwiYmFzZW5hbWUiLCJ3cml0ZVdvcmtmbG93WWFtbCIsImRlcGxveVByb2R1Y3Rpb25Xb3JrZmxvd0V4aXN0cyIsIndyaXRlWWFtbCIsImlzUHVibGljUmVwbyIsInN0cnVjdHVyZWRDbG9uZSIsInN0ZXBzIiwiYnVpbGQiLCJhdXRvZml4V29ya2Zsb3ciLCJhdXRvZml4Sm9iIiwiZ2VuZXJhdGVBdXRvZml4V29ya2Zsb3ciLCJuZXdTZXR0aW5ncyIsIm9sZFNldHRpbmdzIiwieWFtbCIsImxvYWQiLCJhcnJheU1lcmdlIiwibW92ZVRvQm90dG9tIiwiYWN0aW9ucyIsInRyaWdnZXJfZGVwbG95X3dvcmtmbG93IiwiaXNSZXVzYWJsZVdvcmtmbG93Iiwiam9iIiwibm9ybWFsaXplSm9iIiwic2NoZWR1bGUiLCJicmFuY2giLCJwYXJhbXMiLCJzeW5jX3BhcmFtc193aXRob3V0X2Rlc3QiLCJ3b3JrZmxvd19kaXNwYXRjaCIsIk5QTV9UT0tFTiIsIkdIX1RPS0VOIiwiRklSRUJBU0VfVE9LRU4iLCJHQ1BfU0FfS0VZX0pTT05fRk9SX0ZJUkVCQVNFIiwiRElTQ09SRF9XRUJIT09LX1VSTCIsInNlcnZlcl91cmwiLCJkb3RfZW52X3BhdGgiLCJGTFlfQVBJX1RPS0VOIiwiZGVwbG95X2NvbW1hbmQiLCJkb2VzQ29udGFpbkRvY2tlcmZpbGUiLCJjaV9sYWJlbCIsImdpdGh1Yl9ob3N0ZWRfcnVubmVyIiwibmV3U2VjcmV0cyIsInlhbWxUZXh0IiwiZHVtcCIsImxpbmVXaWR0aCIsIm5vQ29tcGF0TW9kZSIsInN0eWxlcyIsImZpeFR5cG9zIiwicGFja2FnZUNvbmZpZyIsImRvY0ZpbGVzIiwibWRGaWxlIiwiZml4VHlwb3NJblRleHQiLCJyZXBsYWNlV2l0aENvbmZpZyIsInRzRmlsZXMiLCJ0c0ZpbGUiLCJjb21tZW50IiwidGV4dEJhc2VkRmlsZXMiLCJmaWxlIiwicHJvbWlzZUFsbCIsInByb3BOYW1lIiwiYmVmb3JlIiwiYWZ0ZXIiLCJ3YmZ5SnNvbiIsInR5cG9zIiwiZ2VuZXJhdGVBZ2VudEluc3RydWN0aW9ucyIsImFsbENvbmZpZ3MiLCJhZ2VudHNFeHRyYVBhdGgiLCJleHRyYUNvbnRlbnQiLCJ0b29sTmFtZSIsImdlbmVyYXRlQWdlbnRJbnN0cnVjdGlvbiIsImN1cnNvclJ1bGVzUGF0aCIsImN1cnNvclJ1bGVzQ29udGVudCIsImZyb250bWF0dGVyIiwiYm9keSIsImdlbmVyYXRlQ3Vyc29yR2VuZXJhbE1kY0NvbnRlbnQiLCJiYXNlQ29udGVudCIsImRlc2NyaXB0aW9uIiwiaXNXaWxsQm9vc3RlclJlcG8iLCJjIiwiZ2VuZXJhdGVBZ2VudENvZGluZ1N0eWxlIiwiaGFzTmV3U2VjdGlvbiIsImdlbkkxOG5UcyIsInJlYWN0IiwibmV4dCIsIm1pbmltdW1SZWxlYXNlQWdlRXhjbHVkZXMiLCJnZW5lcmF0ZUJ1bmZpZ1RvbWwiLCJleGlzdGluZ0NvbnRlbnQiLCJyZWFkRmlsZVN5bmMiLCJidW5maWdUb21sIiwicGFyc2VCdW5maWdUb21sIiwiYnVuIiwiZ2VuZXJhdGVSdW5TZWN0aW9uIiwiaW5zdGFsbCIsImV4YWN0IiwidXNlckNvbnRlbnRIZWFkZXIiLCJ1c2VyQ29udGVudEhlYWRlclJlZ2V4IiwiZGVmYXVsdEhlYWRVc2VyQ29udGVudCIsImRlZmF1bHRUYWlsVXNlckNvbnRlbnQiLCJpZ25vcmVGaWxlVXRpbCIsInNlcGFyYXRvclByZWZpeCIsInJlYWRHaXRpZ25vcmVXaXRob3V0U2VwYXJhdG9ycyIsImxhc3RIZWFkZXJJbmRleCIsImdldEluZGV4T2ZUYWlsVXNlckNvbnRlbnRIZWFkZXIiLCJnZXRIZWFkVXNlckNvbnRlbnQiLCJ0aGlzIiwiZ2V0VGFpbFVzZXJDb250ZW50IiwiaXNCZXJyeVplcm9JbnN0YWxsRW5hYmxlZCIsImxhc3RJbmRleCIsImxhc3RJbmRleE9mIiwiZ2VuZXJhdGVEb2NrZXJpZ25vcmUiLCJleHRlbnNpb25zIiwiY29kZVdpdGgySW5kZW50U2l6ZSIsImNvZGVXaXRoNEluZGVudFNpemUiLCJtYXJrZG93bkxpa2UiLCJveGxpbnQiLCJveGZtdCIsInByZXR0aWVyT25seSIsImdlbmVyYXRlRXh0ZW5zaW9ucyIsImdlbmVyYXRlRWRpdG9yY29uZmlnIiwiaGF2ZV9mdW4iLCJjb2RlX3JldmlldyIsImRpc2FibGUiLCJjb21tZW50X3NldmVyaXR5X3RocmVzaG9sZCIsIm1heF9yZXZpZXdfY29tbWVudHMiLCJwdWxsX3JlcXVlc3Rfb3BlbmVkIiwiaGVscCIsInN1bW1hcnkiLCJpZ25vcmVfcGF0dGVybnMiLCJnZW5lcmF0ZUdlbWluaUNvbmZpZyIsImNvbmZpZ0ZpbGVQYXRoIiwic3R5bGVndWlkZUZpbGVQYXRoIiwibmV3Q29uZmlnIiwib2xkQ29uZmlnIiwieWFtbENvbnRlbnQiLCJjb2RpbmdSdWxlRXh0cmFDb250ZW50IiwidHJpbVN0YXJ0Iiwic3R5bGVndWlkZUNvbnRlbnQiLCJ0cmltRW5kIiwicmVtb3ZlR2VtaW5pU2V0dGluZ3MiLCJnZW5lcmF0ZUdpdGF0dHJpYnV0ZXMiLCJkZWZhdWx0TmFtZXMiLCJnZW5lcmF0ZUdpdGlnbm9yZSIsImhlYWRVc2VyQ29udGVudCIsInRhaWxVc2VyQ29udGVudCIsImRvZXNDb250YWluR2VtZmlsZSIsImRvZXNDb250YWluR29Nb2QiLCJkb2VzQ29udGFpblBhY2thZ2VKc29uIiwiZG9lc0NvbnRhaW5Qb21YbWwiLCJkb2VzQ29udGFpblB1YnNwZWNZYW1sIiwiZG9lc0NvbnRhaW5UZW1wbGF0ZVlhbWwiLCJkb2VzQ29udGFpblBvZXRyeUxvY2siLCJkb2VzQ29udGFpblV2TG9jayIsImJsaXR6IiwiZmlyZWJhc2UiLCJwcmlzbWEiLCJwbGF5d3JpZ2h0VGVzdCIsInJlYWN0TmF0aXZlIiwic3Rvcnlib29rIiwibGl0ZXN0cmVhbSIsImdlbmVyYXRlZCIsInJlYWRDYWNoZSIsInJlc3BvbnNlIiwiZmV0Y2giLCJyZXNwb25zZVRleHQiLCJ0ZXh0Iiwib2siLCJ3cml0ZUNhY2hlIiwib3MiLCJob21lZGlyIiwiRGF0ZSIsIm5vdyIsIm10aW1lTXMiLCJkb2VzQ29udGFpbkpzT3JUcyIsImRvZXNDb250YWluSmF2YVNjcmlwdCIsImRvZXNDb250YWluSmF2YVNjcmlwdEluUGFja2FnZXMiLCJkb2VzQ29udGFpblR5cGVTY3JpcHQiLCJkb2VzQ29udGFpblR5cGVTY3JpcHRJblBhY2thZ2VzIiwiZG9lc0NvbnRhaW5KYXZhIiwiZG9lc0NvbnRhaW5KYXZhSW5QYWNrYWdlcyIsImdlbmVyYXRlSWRlYVNldHRpbmdzIiwiY3JlYXRlVGFza09wdGlvbnMiLCJnZXRXYXRjaGVyVGFza3NDb250ZW50IiwicnVubmVyIiwiZXh0ZW5zaW9uIiwiZ2V0R2VuSTE4blRzQ29tbWFuZCIsInNwYXduU3luYyIsInJldHJ5Iiwic3Bhd25TeW5jQW5kUmV0dXJuU3RhdHVzIiwibmV3Q21kIiwibmV3QXJncyIsImdldFNwYXduU3luY0FyZ3MiLCJzdGF0dXMiLCJjaGlsZF9wcm9jZXNzIiwic3Bhd25TeW5jQW5kUmV0dXJuU3Rkb3V0Iiwic3RkaW8iLCJwcm9jIiwidG9TdHJpbmciLCJzIiwibWVzc2FnZSIsIlBBVEgiLCJCRVJSWV9CSU5fRk9MREVSIiwiZW5jb2RpbmciLCJzaGVsbCIsImdpdEh1YlV0aWwiLCJnZXRPcmdBbmROYW1lIiwidXJsT3JGdWxsTmFtZSIsInVybFdpdGhvdXRQcm90b2NvbCIsIm9jdG9raXRDYWNoZSIsImdldE9jdG9raXQiLCJvd25lciIsImNhY2hlZCIsIm9jdG9raXQiLCJPY3Rva2l0IiwiYXV0aCIsImdldEdpdEh1YlRva2VuIiwiaGFzR2l0SHViVG9rZW4iLCJHSF9CT1RfUEFUX0ZPUl9XSUxMQk9PU1RFUiIsIkdIX0JPVF9QQVRfRk9SX1dJTExCT09TVEVSTEFCIiwiR0lUSFVCX1RPS0VOIiwiaXNQdWJsaXNoZWRXaWxsYm9vc3RlckNvbmZpZ3NQYWNrYWdlIiwiaXNXaWxsQm9vc3RlckNvbmZpZ3MiLCJwcml2YXRlIiwiZmlsZXMiLCJveGxpbnREZXBzIiwidHlwZXNjcmlwdEdvRGVwZW5kZW5jeSIsIndiRGVwZW5kZW5jeSIsImJ1aWxkVHNEZXBlbmRlbmN5Iiwib2Jzb2xldGVMaW50RGVwZW5kZW5jaWVzIiwibWljcm9tYXRjaFBhY2thZ2VOYW1lcyIsIm1pY3JvbWF0Y2hJbXBvcnRQYXR0ZXJuIiwibGF0ZXN0RGVwZW5kZW5jeVZlcnNpb25DYWNoZSIsImdlbmVyYXRlUGFja2FnZUpzb24iLCJza2lwQWRkaW5nRGVwcyIsImpzb25PYmoiLCJqc29uVGV4dCIsInBlZXJEZXBlbmRlbmNpZXMiLCJyZWFkUGFja2FnZUpzb24iLCJhdXRob3IiLCJ0c2xpYiIsInR5cGVzY3JpcHQiLCJsZXJuYSIsInBpbnN0IiwicHJldHRpZXIiLCJwcmVzZXJ2ZU1pY3JvbWF0Y2giLCJmaWxlUGF0aHMiLCJnbG9iU3luYyIsImRvZXNQcm9kdWN0Q29kZUltcG9ydE1pY3JvbWF0Y2giLCJzaG91bGRQcmVzZXJ2ZU1pY3JvbWF0Y2giLCJzaG91bGRQcmVzZXJ2ZUNvbmZpZ1BhY2thZ2VMaW50RGVwZW5kZW5jeSIsInJlbW92ZU9ic29sZXRlTGludERlcGVuZGVuY2llcyIsInJlbW92ZURlcHJlY2F0ZWRTdHVmZiIsInJlbW92ZUxlZ2FjeUluc3RhbGxDb21tYW5kcyIsImdlbmVyYXRlU2NyaXB0cyIsIndiIiwiYWRkU3RhcnRUZXN0U2VydmVyU2NyaXB0SWZOZWVkZWQiLCJhZGRJbnN0YWxsU3RlcFRvQ2hlY2tGb3JBaSIsInByZXR0aWZ5IiwiY2F0Y2giLCJvcmlnaW5hbENvbnRlbnQiLCJuZXdMaW5lIiwibCIsImdlbmVyYXRlUHJldHRpZXJTdWZmaXgiLCJub3JtYWxpemVZYXJuV29ya3NwYWNlRm9yZWFjaFNjcmlwdHMiLCJ1cGRhdGVTY3JpcHRzIiwibW92ZU1hbmFnZWRUb29sRGVwZW5kZW5jaWVzVG9EZXZEZXBlbmRlbmNpZXMiLCJkZXBlbmRlbmN5VXBkYXRlcyIsInB5dGhvbkRldkRlcGVuZGVuY2llcyIsImhhc0phdmEiLCJkZXBlbmRlbmN5U2VjdGlvbnMiLCJzZWN0aW9uIiwicmVtb3ZlUHJldHRpZXJBcnRpZmFjdHMiLCJodXNreSIsInBvc3RpbnN0YWxsIiwicG9zdHB1Ymxpc2giLCJwcmVwdWJsaXNoT25seSIsInByZXBhY2siLCJwb3N0cGFjayIsInByZXBhcmUiLCJ2ZXJzaW9uIiwiYXJ0aWxsZXJ5IiwicGxheXdyaWdodCIsIndvcmtzcGFjZXMiLCJ3b3Jrc3BhY2UiLCJnZXRUc2NvbmZpZ0Jhc2VEZXBlbmRlbmNpZXMiLCJqZXN0IiwiZGVwIiwiYXBwbHlQYWNrYWdlSnNvbkNvbnZlbnRpb25zIiwibGljZW5zZSIsInB1Ymxpc2hDb25maWciLCJhY2Nlc3MiLCJjb25maWdNanNQYXRoIiwiY29uZmlnRHRzUGF0aCIsImNvbmZpZ0RtdHNDb250ZW50Iiwibm9ybWFsaXplUHVibGlzaGVkQ29uZmlnUGFja2FnZU1ldGFkYXRhIiwibWFpbiIsInJlc29sdXRpb25zIiwibGludCIsImRpcnMiLCJkaXIiLCJmb3JtYXQiLCJweXRob25QYWNrYWdlTWFuYWdlciIsImdldFB5dGhvblBhY2thZ2VNYW5hZ2VyIiwicHl0aG9uRmlsZXMiLCJkaXJOYW1lU2V0IiwicHl0aG9uRmlsZSIsImZpcnN0Iiwic2Vjb25kIiwiZGlyTmFtZXNTdHIiLCJweXRob25SdW5uZXIiLCJleGlzdGluZ1JlcG9zaXRvcnkiLCJub3JtYWxpemVkUmVwb3NpdG9yeSIsIm5vcm1hbGl6ZVJlcG9zaXRvcnlVcmxGb3JQYWNrYWdlSnNvbiIsImJ1aWxkTm9ybWFsaXplZFJlcG9zaXRvcnlGb3JQYWNrYWdlSnNvbiIsIm5vcm1hbGl6ZWRFeGlzdGluZ1JlcG9zaXRvcnkiLCJmb3JtYXRSZXBvc2l0b3J5Rm9yUGFja2FnZUpzb24iLCJhZGRHZW5JMThuVHNQb3N0aW5zdGFsbFNjcmlwdCIsIm5vcm1hbGl6ZVBhY2thZ2VNZXRhZGF0YSIsInBhY2thZ2VKc29uRGVwZW5kZW5jaWVzIiwicGFja2FnZUpzb25EZXZEZXBlbmRlbmNpZXMiLCJhZGRQYWNrYWdlSnNvbkRlcGVuZGVuY2llcyIsImFkZERlcGVuZGVuY3lWZXJzaW9uc1RvUGFja2FnZUpzb24iLCJwYWNrYWdlTmFtZXMiLCJwcml2YXRlUGFja2FnZXMiLCJyZXBvIiwiaXNXb3Jrc3BhY2VQYWNrYWdlIiwib3RoZXJUYXJnZXQiLCJSZWZsZWN0IiwiZGVsZXRlUHJvcGVydHkiLCJjb21taXRIYXNoIiwib3JnYW5pemF0aW9uIiwicmVqZWN0IiwiZ2V0TGF0ZXN0Q29tbWl0SGFzaCIsImdldExhdGVzdFByaXZhdGVQYWNrYWdlU3BlY2lmaWVyIiwidXBkYXRlUHJpdmF0ZVBhY2thZ2VzIiwicmVtb3ZlRW1wdHlEZXBlbmRlbmN5U2VjdGlvbnMiLCJpbnN0YWxsTnBtRGVwZW5kZW5jaWVzIiwiaW5zdGFsbERlcGVuZGVuY3lVcGRhdGVzIiwiY29yZSIsImRldiIsImRlcGVuZGVuY3lTcGVjaWZpZXJzIiwiZGVwZW5kZW5jaWVzVG9JbnN0YWxsIiwic2hvdWxkVXBkYXRlRXhpc3RpbmdEZXBlbmRlbmN5Iiwic2hvdWxkVXBkYXRlRXhpc3RpbmdNYW5hZ2VkRGVwZW5kZW5jeSIsImdldExhdGVzdERlcGVuZGVuY3lWZXJzaW9uIiwiY2FjaGVkVmVyc2lvbiIsImVzbGludCIsImN1cnJlbnRWZXJzaW9uIiwicmVwb3NpdG9yeVVybCIsIm1hdGNoZWQiLCJleGVjIiwibm9ybWFsaXplZFVybCIsIm9sZFNjcmlwdHMiLCJjbGVhbnVwIiwidHlwZWNoZWNrIiwicHlyaWdodCIsImhhc1R5cGVjaGVjayIsImhhc0pzT3JUcyIsIm9sZFRlc3QiLCJnZW5lcmF0ZUZvcm1hdFNjcmlwdCIsImNvbW1hbmRzIiwiYmFzZVNldHRpbmdzIiwiZ2xvYl9tYXRjaGVyIiwicHJlQ29tbWl0U2V0dGluZ3MiLCJzdGFnZV9maXhlZCIsImdlbmVyYXRlTGVmdGhvb2tVcGRhdGluZ1BhY2thZ2VKc29uIiwiaHVza3lEaXJQYXRoIiwiaGFzSHVza3lEaXIiLCJzZXR0aW5ncyIsImdldFByZUNvbW1pdEpvYnMiLCJwcmVQdXNoIiwibGludENvbW1hbmQiLCJxdWlldExpbnRDb21tYW5kIiwiZ2V0UHJlUHVzaFNjcmlwdCIsIm1rZGlyU3luYyIsIm1vZGUiLCJwb3N0TWVyZ2VDb21tYW5kIiwicG9zdE1lcmdlQ29tbWFuZHMiLCJoYXNWZXJzaW9uU2V0dGluZ3MiLCJ0b29sc0NoYW5nZWRQYXR0ZXJuIiwicmF3IiwiaW5zdGFsbENvbW1hbmQiLCJybU5leHREaXJlY3RvcnkiLCJnZW5JMThuVHNDb21tYW5kIiwiZ2VuZXJhdGVQb3N0TWVyZ2VDb21tYW5kcyIsImdldENsZWFudXBHbG9icyIsImdldENsZWFudXBDb21tYW5kIiwic3VwcG9ydGVkRXh0ZW5zaW9ucyIsImxvY2FsV2JQYWNrYWdlSnNvblBhdGgiLCJoYXNMb2NhbFdiV29ya3NwYWNlIiwib3hsaW50UGF0dGVybiIsIm94Zm10UGF0dGVybiIsInByZXR0aWVyUGF0dGVybiIsImhhc1B5dGhvblBhY2thZ2VNYW5hZ2VyIiwiZ2V0UHl0aG9uUnVubmVyIiwiZ2VuZXJhdGVMaW50c3RhZ2VkcmMiLCJnZW5lcmF0ZU94Zm10Q29uZmlnIiwibGVnYWN5Q29uZmlnUGF0aCIsImNvbmZpZ0NvbnRlbnQiLCJnZW5lcmF0ZU94bGludENvbmZpZyIsIl9yb290Q29uZmlnIiwic2hvdWxkUHJlc2VydmVQdWJsaXNoZWRMaW50ZXJDb25maWciLCJnZW5lcmF0ZVByZXR0aWVyaWdub3JlIiwiZ2l0aWdub3JlRmlsZVBhdGgiLCJnaXRpZ25vcmVDb250ZW50IiwiYWRkaXRpb25hbENvbnRlbnQiLCJ2ZW52UGF0aCIsInZlbnYiLCJnZW5lcmF0ZVB5cmlnaHRDb25maWdKc29uIiwiZ2VuZXJhdGVSZWFkbWUiLCJpbnNlcnRCYWRnZSIsImZpbGVOYW1lcyIsInJlYWRkaXJTeW5jIiwiYmFkZ2VOYW1lIiwidG9VcHBlckNhc2UiLCJyZWFkbWUiLCJpIiwiZ2VuZXJhdGVSZWxlYXNlcmMiLCJwbHVnaW5zIiwicGx1Z2luRW50cnkiLCJwbHVnaW4iLCJwcmVzZXQiLCJzdWNjZXNzQ29tbWVudENvbmRpdGlvbiIsImZhaWxDb21tZW50Q29uZGl0aW9uIiwibGFiZWxzIiwicmVsZWFzZWRMYWJlbHMiLCIkc2NoZW1hIiwiZXh0ZW5kcyIsImdlbmVyYXRlUmVub3ZhdGVKc29uIiwicGFja2FnZVJ1bGVzIiwicnVsZSIsIm1hdGNoUGFja2FnZU5hbWVzIiwiZW5hYmxlZCIsImluc3RhbGxBZ2VudFNraWxscyIsInJvb3RKc29uT2JqIiwiY29tcGlsZXJPcHRpb25zIiwiYWx3YXlzU3RyaWN0Iiwibm9VbmNoZWNrZWRJbmRleGVkQWNjZXNzIiwiYWxsb3dTeW50aGV0aWNEZWZhdWx0SW1wb3J0cyIsImVzTW9kdWxlSW50ZXJvcCIsInJlc29sdmVKc29uTW9kdWxlIiwiaW1wb3J0SGVscGVycyIsIm5vRW1pdCIsImV4Y2x1ZGUiLCJpbmNsdWRlIiwic3ViSnNvbk9iaiIsImdlbmVyYXRlVHNjb25maWciLCJtb2R1bGVSZXNvbHV0aW9uIiwibm9ybWFsaXplTmV4dFRzY29uZmlnTW9kdWxlU2V0dGluZ3MiLCJjbGVhbnVwTGVnYWN5VHNjb25maWdNb2R1bGVTZXR0aW5ncyIsImdlbmVyYXRlZFR5cGVzIiwidHlwZU5hbWVzIiwidml0ZXN0IiwibW9jaGEiLCJjeXByZXNzIiwiZ2V0R2VuZXJhdGVkVHlwZXMiLCJnZXRUc2NvbmZpZ0V4dGVuZHMiLCJyb290RGlyIiwiZ2V0Um9vdERpciIsImRvZXNDb250YWluSnN4T3JUc3giLCJkb2VzQ29udGFpbkpzeE9yVHN4SW5QYWNrYWdlcyIsImpzeCIsImFkZEluY2x1ZGVQYXRoIiwiZXhpc3RpbmdUeXBlcyIsImV4aXN0aW5nRW1pdE1ldGFkYXRhIiwiZW1pdE9wdGlvbnMiLCJwaWNrRXhpc3RpbmdFbWl0TWV0YWRhdGEiLCJnZW5lcmF0ZWRFeHRlbmRzIiwiZXhpc3RpbmdFeHRlbmRzIiwibWVyZ2VkRXh0ZW5kcyIsIm5vcm1hbGl6ZUV4dGVuZHMiLCJ1bmlxdWVFeHRlbmRzIiwibWVyZ2VUc2NvbmZpZ0V4dGVuZHMiLCJlbWl0RGVjbGFyYXRpb25Pbmx5IiwicmV3cml0ZVJlbGF0aXZlSW1wb3J0RXh0ZW5zaW9ucyIsImVuc3VyZVRzRXh0ZW5zaW9uRW1pdENvbXBhdGliaWxpdHkiLCJtZXJnZWRUeXBlcyIsImZpbHRlckV4aXN0aW5nVHlwZXMiLCJ0eXBlTmFtZSIsInR5cGVSb290cyIsImV4cGVyaW1lbnRhbERlY29yYXRvcnMiLCJiYXNlVXJsIiwibW9kdWxlIiwiZGVsZXRlTGVnYWN5TW9kdWxlU2V0dGluZ3MiLCJ2ZXJiYXRpbU1vZHVsZVN5bnRheCIsImdlbmVyYXRlZFR5cGVTZXQiLCJpc0dlbmVyYXRlZFRlc3RHbG9iYWxUeXBlIiwiZXhjbHVkZUZpbGVQYXR0ZXJucyIsImdlbmVyYXRlVnNjb2RlU2V0dGluZ3MiLCJleGNsdWRlRmlsZVBhdHRlcm4iLCJleGNsdWRlU2V0dGluZyIsImdlbmVyYXRlWWFybnJjWW1sIiwieWFybnJjWW1sUGF0aCIsImxhdGVzdFZlcnNpb24iLCJnZXRMYXRlc3RWZXJzaW9uIiwibmV3VmVyc2lvbiIsIm9sZFZlcnNpb24iLCJ2YWxpZE5ld1ZlcnNpb24iLCJzZW12ZXIiLCJ2YWxpZCIsImd0IiwiaXNOZXdlclZlcnNpb24iLCJyZWxlYXNlc1BhdGgiLCJ5YXJucmNQYXRoIiwiZGVmYXVsdFNlbXZlclJhbmdlUHJlZml4Iiwibm9kZUxpbmtlciIsIm5tTW9kZSIsIm5wbU1pbmltYWxBZ2VHYXRlIiwiYXBwcm92ZWRHaXRSZXBvc2l0b3JpZXMiLCJucG1QcmVhcHByb3ZlZFBhY2thZ2VzIiwiY29tcHJlc3Npb25MZXZlbCIsImluamVjdEVudmlyb25tZW50RmlsZXMiLCJlbmFibGVHbG9iYWxDYWNoZSIsIm9yaWdpbmFsTGVuZ3RoIiwicGx1Z2luUGF0aCIsInJlbGF0aXZlIiwiZ2V0WWFybnJjUHJldHRpZXJBcmdzIiwic2V0dXBMYWJlbHMiLCJzZXR1cExhYmVsIiwiZGVsZXRlTGFiZWwiLCJ3YXJuIiwiY29sb3IiLCJyZXF1ZXN0IiwiREVQUkVDQVRFRF9TRUNSRVRfTkFNRVMiLCJyZXF1aXJlIiwiY3JlYXRlUmVxdWlyZSIsInNldHVwU2VjcmV0cyIsImRvdGVudiIsInNlY3JldE5hbWUiLCJzZWNyZXRfbmFtZSIsImtleV9pZCIsImtleUlkIiwiZGF0YSIsInNvZGl1bSIsInJlYWR5Iiwic2VjcmV0IiwicmF3S2V5IiwiZnJvbV9iYXNlNjQiLCJiYXNlNjRfdmFyaWFudHMiLCJPUklHSU5BTCIsInJhd1NlYyIsImZyb21fc3RyaW5nIiwiZW5jQnl0ZXMiLCJjcnlwdG9fYm94X3NlYWwiLCJlbmNCYXNlNjQiLCJ0b19iYXNlNjQiLCJlbmNyeXB0ZWRfdmFsdWUiLCJzZXR1cEdpdEh1YlNldHRpbmdzIiwiYmVmb3JlUmV0cnkiLCJoYW5kbGVFcnJvciIsInJldHJ5Q291bnQiLCJyZXRyeUxvZ2dlciIsInNob3VsZFJldHJ5Iiwic2xlZXBNaWxsaXNlY29uZHMiLCJ1cGRhdGVTbGVlcE1pbGxpc2Vjb25kcyIsImZhaWxlZENvdW50Iiwid2l0aFJldHJ5IiwiYWxsb3dfYXV0b19tZXJnZSIsImFsbG93X21lcmdlX2NvbW1pdCIsImFsbG93X3NxdWFzaF9tZXJnZSIsImFsbG93X3JlYmFzZV9tZXJnZSIsImFsbG93X3VwZGF0ZV9icmFuY2giLCJkZWxldGVfYnJhbmNoX29uX21lcmdlIiwic3F1YXNoX21lcmdlX2NvbW1pdF90aXRsZSIsInNxdWFzaF9tZXJnZV9jb21taXRfbWVzc2FnZSIsImhlYWRlcnMiLCJwYWNrYWdlTWFuYWdlclJ1blBsYWNlaG9sZGVyIiwidGVtcGxhdGVzIiwiZ2VuZXJhdGVHaXRIdWJUZW1wbGF0ZXMiLCJhcHBseVBhY2thZ2VNYW5hZ2VyVGVtcGxhdGUiLCJkaXN0YW5jZSIsInRlbXBsYXRlIiwicGFja2FnZU1hbmFnZXJDb21tYW5kIiwid2JmeUpzb25TY2hlbWEiLCJ6IiwicmVjb3JkIiwib3B0aW9uYWwiLCJkb2MiLCJnZXRQYWNrYWdlQ29uZmlnIiwiZXNtUGFja2FnZSIsInBhY2thZ2VKc29uVGV4dCIsInJlbGVhc2VCcmFuY2hlcyIsInJlbGVhc2VQbHVnaW5zIiwicmVsZWFzZXJjSnNvblBhdGgiLCJmc3AiLCJmbGF0IiwicmVwb0luZm8iLCJnaXQiLCJzaW1wbGVHaXQiLCJvcmlnaW4iLCJnZXRSZW1vdGVzIiwiciIsInJlbW90ZVVybCIsInJlZnMiLCJyZXF1ZXN0UmVwb0luZm8iLCJmZXRjaFJlcG9JbmZvIiwiY3VycmVudCIsImhhc1ZlcnNpb25TZXR0aW5nc0ZpbGUiLCJkb2NrZXJmaWxlIiwid2JmeUpzb25QYXRoIiwid2JmeUpzb25UZXh0IiwicmVwb0Z1bGxOYW1lIiwiZnVsbF9uYW1lIiwicmVwb0F1dGhvciIsInJlcG9OYW1lIiwicmVwb1BhcnRzIiwiaXNSZWZlcnJlZEJ5T3RoZXJSZXBvIiwiaXNFc21QYWNrYWdlIiwiY29udGFpbnNBbnkiLCJkb2VzQ29udGFpblZzY29kZVNldHRpbmdzSnNvbiIsImdpdGh1YiIsInBhdHRlcm4iLCJvcmciLCJyZXQiLCJhc3NpZ24iLCJyZWRpcmVjdGVkRnVsbE5hbWUiLCJsb2NhdGlvbiIsImdldFJlZGlyZWN0ZWRSZXBvRnVsbE5hbWUiLCJyZWZyZXNoQnVuTG9jayIsInJvb3REaXJQYXRoIiwiYXJndiIsInlhcmdzIiwicG9zaXRpb25hbCIsImRlc2NyaWJlIiwiZGVmYXVsdCIsImFsaWFzIiwic2tpcERlcHMiLCJ2ZXJib3NlIiwicGFja2FnZUpzb25EaXIiLCJVUkwiLCJwYXRobmFtZSIsImdldFZlcnNpb24iLCJzdHJpY3QiLCJoYXNJbnZhbGlkUGFja2FnZUNvbmZpZyIsInBhY2thZ2VzRGlyUGF0aCIsInN1YkRpclBhdGhzIiwiZCIsImFiYnJldmlhdGlvblByb21pc2UiLCJzdWJQYWNrYWdlQ29uZmlncyIsInN1YkRpclBhdGgiLCJhbGxQYWNrYWdlQ29uZmlncyIsInNob3VsZFJ1bldvcmtmbG93cyIsInRoZW4iLCJleGl0Q29kZSJdLCJtYXBwaW5ncyI6IjJwQkFBT0EsZUFBZUMsRUFBTUMsR0FDMUIsT0FBTyxJQUFJQyxRQUFTQyxHQUFZQyxXQUFXRCxFQUFTRixHQUN0RCxDQ2lDT0YsZUFBZU0sRUFBb0JDLEdBQ3hDLElBQ0UsYUFBYUEsR0FDZixDQUFFLE1BQ0EsQ0FFSixDQUVPUCxlQUFlUSxFQUFxQkQsR0FDekMsSUFDRSxhQUFhQSxHQUNmLENBQUUsTUFBT0UsR0FDUCxHQUFxQixpQkFBVkEsR0FBc0JBLEdBQVMsU0FBVUEsR0FBd0IsV0FBZkEsRUFBTUMsS0FDakUsT0FFRixNQUFNRCxDQUNSLENBQ0YsQ0MvQ08sTUFBTUUsRUFBVSxJQUx2QixNQUNFQyxXQUFZLEVBQ1pDLG1CQUFvQixHQ2dCZixNQUFNQyxFQUFTLElBaEJ0QixNQUNFLCtCQUFNQyxDQUEwQkMsRUFBY0MsR0FDeENOLEVBQVFDLFdBQ1ZNLFFBQVFDLEtBQUssYUFBYUgscUJBRTVCLFVBQ1FDLEdBQ1IsQ0FBRSxNQUFPUixHQUNQUyxRQUFRQyxLQUFLLHFCQUFxQkgsTUFBU1AsYUFBaUJXLE1BQVFYLEVBQU1ZLE1BQVFDLE9BQU9iLE1BQzNGLENBQ0lFLEVBQVFDLFdBQ1ZNLFFBQVFDLEtBQUssY0FBY0gsbUJBRS9CLEdDWldPLEVBQVMsQ0FDcEIsMkJBQU1DLENBQXNCQyxHQUMxQixJQUNFLGFBQWFDLEVBQUdDLFNBQVNDLFNBQVNILEVBQVUsT0FDOUMsQ0FBRSxNQUNBLENB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QUFxQmpKLEdBQ3JCa0osR0FBc0JsSixHQUN0QjhqQixHQUF3QjlqQixHQUN4QjBMLEdBQXFCMUwsR0FDckJrYixHQUFxQmxiLEdBQ3JCdWEsR0FBa0J2YSxNQUNkdW9CLEVBQXFCLENBQUN4b0IsR0FBa0JDLElBQWUsR0FDM0QyZ0IsR0FBWTNnQixHQUNab2hCLEdBQWFwaEIsR0FDYnlpQixHQUFvQnppQixHQUNwQm1YLEdBQW9DblgsR0FDcENpWixHQUFxQmpaLFdBRWpCaGEsRUFBWWllLGFBRWxCLE1BQU01ZSxFQUE0QixHQUNsQyxJQUFLLE1BQU1jLEtBQVVtaUMsR0FDZm5pQyxFQUFPbWxCLHVCQUF5Qm5sQixFQUFPb2xCLGtDQUN6Q2xtQixFQUFTa0QsS0FBS3NVLEdBQW1CMVcsRUFBUUEsRUFBTzhXLE9BQVNxckIsRUFBb0IsQ0FBQ25pQyxLQUU1RUEsRUFBT29hLFVBQVUySixnQkFDbkI3a0IsRUFBU2tELEtBQUt5QyxFQUFvQjdFLElBRWhDQSxFQUFPb2EsVUFBVW1GLE1BQ25CcmdCLEVBQVNrRCxLQUFLckMsRUFBa0JDLFVBRTVCaWpCLEdBQWtCampCLEVBQVE2WixTQUMxQmhhLEVBQVlpZSxjQUNiOWQsRUFBTzhXLFFBQVc5VyxFQUFPc2pCLGdDQUd4QitQLEdBQXVCcnpCLFNBQ3ZCMm9CLEdBQW9CM29CLEVBQVE2WixFQUFZa25CLEVBQUtNLFVBRW5EbmlDLEVBQVNrRCxLQUFLMHdCLEdBQXFCOXlCLElBQy9CQSxFQUFPb2dDLCtCQUFpQ3BnQyxFQUFPc2pCLHdCQUNqRHBrQixFQUFTa0QsS0FBS3UyQixHQUF1QjM0QixLQUVuQ0EsRUFBT21sQix1QkFBeUJubEIsRUFBT29sQixrQ0FDekNsbUIsRUFBU2tELEtBQUs2ekIsR0FBaUJqMkIsSUFFN0JnbEIsR0FBa0JobEIsS0FDcEJkLEVBQVNrRCxLQUFLMndCLEdBQW9CL3lCLElBQ2xDZCxFQUFTa0QsS0FBSzh3QixHQUFxQmx6QixLQUVqQ0EsRUFBT29hLFVBQVVrVyxTQUNuQnB4QixFQUFTa0QsS0FBS3V4QixHQUEwQjN6QixXQUd0Q3RDLFFBQVEyWCxJQUFJblcsU0FDWlcsRUFBWWllLGFBRWxCLE1BQU0vTSxFQUFpQjhJLEVBQVdyVCxNQUFRLE1BQVEsT0FFOUNxVCxFQUFXclQsWUFDUG5JLEVBQU9DLDBCQUEwQixpQkFBa0JmLGdCQUNqREcsUUFBUUMsVUFDZGtqQyxHQUFlQyxLQUdqQmpiLEdBQVU5VSxFQUFnQixDQUFDLFVBQVcsa0JBQW1CK3ZCLEdBRTNEamIsR0FBVTlVLEVBQWdCLENBQUMsV0FBWSt2QixTQUVqQzFMLEdBQW1CdmIsRUFDM0IsQ0FDSStuQixJQUNGeHdCLFFBQVFreEIsU0FBVyxFQUV2QixDQXVCTTVWIiwieF9nb29nbGVfaWdub3JlTGlzdCI6WzEwLDExLDEyLDEzLDE0XX0=
|
|
32
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VzIjpbIi4uLy4uL3NoYXJlZC1saWIvc3JjL3NsZWVwLnRzIiwiLi4vLi4vc2hhcmVkLWxpYi9zcmMvZXJyb3IudHMiLCIuLi9zcmMvb3B0aW9ucy50cyIsIi4uL3NyYy9sb2dnZXIudHMiLCIuLi9zcmMvdXRpbHMvZnNVdGlsLnRzIiwiLi4vc3JjL3V0aWxzL3Byb21pc2VQb29sLnRzIiwiLi4vc3JjL2ZpeGVycy9uZXh0Q29uZmlnLnRzIiwiLi4vc3JjL2ZpeGVycy9wbGF5d3JpZ2h0Q29uZmlnLnRzIiwiLi4vc3JjL3V0aWxzL2dsb2JVdGlsLnRzIiwiLi4vc3JjL2ZpeGVycy9wcmlzbWEudHMiLCIuLi8uLi8uLi9ub2RlX21vZHVsZXMvc29ydC1vYmplY3Qta2V5cy9pbmRleC5qcyIsIi4uLy4uLy4uL25vZGVfbW9kdWxlcy9kZXRlY3QtaW5kZW50L2luZGV4LmpzIiwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2RldGVjdC1uZXdsaW5lL2luZGV4LmpzIiwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3NvcnQtcGFja2FnZS1qc29uL2luZGV4LmpzIiwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2lzLXBsYWluLW9iai9pbmRleC5qcyIsIi4uL3NyYy9maXhlcnMvdGVzdERpcmVjdG9yeS50cyIsIi4uL3NyYy9maXhlcnMvdHlwZURlZmluaXRpb24udHMiLCIuLi9zcmMvdXRpbHMvbWVyZ2VVdGlsLnRzIiwiLi4vc3JjL3V0aWxzL29iamVjdFV0aWwudHMiLCIuLi9zcmMvZ2VuZXJhdG9ycy93b3JrZmxvdy50cyIsIi4uL3NyYy9maXhlcnMvdHlwb3MudHMiLCIuLi9zcmMvZ2VuZXJhdG9ycy9hZ2VudHMudHMiLCIuLi9zcmMvZ2VuZXJhdG9ycy9idW5maWcudHMiLCIuLi9zcmMvdXRpbHMvaWdub3JlRmlsZVV0aWwudHMiLCIuLi9zcmMvZ2VuZXJhdG9ycy9kb2NrZXJpZ25vcmUudHMiLCIuLi9zcmMvdXRpbHMvZXh0ZW5zaW9ucy50cyIsIi4uL3NyYy9nZW5lcmF0b3JzL2VkaXRvcmNvbmZpZy50cyIsIi4uL3NyYy9nZW5lcmF0b3JzL2dlbWluaUNvbmZpZy50cyIsIi4uL3NyYy9nZW5lcmF0b3JzL2dlbWluaVNldHRpbmdzLnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvZ2l0YXR0cmlidXRlcy50cyIsIi4uL3NyYy9nZW5lcmF0b3JzL2dpdGlnbm9yZS50cyIsIi4uL3NyYy91dGlscy9wYWNrYWdlQ2FwYWJpbGl0aWVzLnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvaWRlYS50cyIsIi4uL3NyYy91dGlscy9nZW5JMThuVHMudHMiLCIuLi9zcmMvdXRpbHMvc3Bhd25VdGlsLnRzIiwiLi4vc3JjL3V0aWxzL2dpdGh1YlV0aWwudHMiLCIuLi9zcmMvdXRpbHMvd2lsbGJvb3N0ZXJDb25maWdzVXRpbC50cyIsIi4uL3NyYy9nZW5lcmF0b3JzL3BhY2thZ2VKc29uLnRzIiwiLi4vc3JjL3V0aWxzL3RzY29uZmlnQmFzZS50cyIsIi4uL3NyYy9naXRodWIvY29tbWl0LnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvbGVmdGhvb2sudHMiLCIuLi9zcmMvZ2VuZXJhdG9ycy9saW50c3RhZ2VkcmMudHMiLCIuLi9zcmMvZ2VuZXJhdG9ycy9veGZtdENvbmZpZy50cyIsIi4uL3NyYy9nZW5lcmF0b3JzL294bGludENvbmZpZy50cyIsIi4uL3NyYy9nZW5lcmF0b3JzL3ByZXR0aWVyaWdub3JlLnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvcHlyaWdodENvbmZpZy50cyIsIi4uL3NyYy9nZW5lcmF0b3JzL3JlYWRtZS50cyIsIi4uL3NyYy9nZW5lcmF0b3JzL3JlbGVhc2VyYy50cyIsIi4uL3NyYy9nZW5lcmF0b3JzL3Jlbm92YXRlSnNvbi50cyIsIi4uL3NyYy9nZW5lcmF0b3JzL3NraWxscy50cyIsIi4uL3NyYy9nZW5lcmF0b3JzL3RzY29uZmlnLnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvdnNjb2RlU2V0dGluZ3MudHMiLCIuLi9zcmMvZ2VuZXJhdG9ycy95YXJucmMudHMiLCIuLi9zcmMvZ2l0aHViL2xhYmVsLnRzIiwiLi4vc3JjL2dpdGh1Yi9zZWNyZXQudHMiLCIuLi9zcmMvZ2l0aHViL3NldHRpbmdzLnRzIiwiLi4vc3JjL2dpdGh1Yi90ZW1wbGF0ZS50cyIsIi4uL3NyYy9wYWNrYWdlQ29uZmlnLnRzIiwiLi4vc3JjL2luZGV4LnRzIl0sInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCBhc3luYyBmdW5jdGlvbiBzbGVlcChtaWxsaXNlY29uZHM6IG51bWJlcik6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHNldFRpbWVvdXQocmVzb2x2ZSwgbWlsbGlzZWNvbmRzKSk7XG59XG4iLCJpbXBvcnQgeyBzbGVlcCB9IGZyb20gJy4vc2xlZXAuanMnO1xuXG4vKipcbiAqIENvbnZlcnQgYW4gb2JqZWN0IHRvIGFuIGVycm9yLlxuICogQHBhcmFtIG9iaiBUaGUgb2JqZWN0IHRvIGNvbnZlcnQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBlcnJvcmlmeShvYmo6IHVua25vd24pOiBFcnJvciB7XG4gIGlmIChvYmogaW5zdGFuY2VvZiBFcnJvcikgcmV0dXJuIG9iajtcbiAgaWYgKHR5cGVvZiBvYmogPT09ICdzdHJpbmcnKSByZXR1cm4gbmV3IEVycm9yKG9iaik7XG4gIHRyeSB7XG4gICAgcmV0dXJuIG5ldyBFcnJvcihKU09OLnN0cmluZ2lmeShvYmopKTtcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIG5ldyBFcnJvcihTdHJpbmcob2JqKSk7XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlnbm9yZUVycm9yPFQ+KGZuOiAoKSA9PiBUKTogVCB8IHVuZGVmaW5lZCB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIGZuKCk7XG4gIH0gY2F0Y2gge1xuICAgIC8vIGRvIG5vdGhpbmdcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gaWdub3JlRW5vZW50PFQ+KGZuOiAoKSA9PiBUKTogVCB8IHVuZGVmaW5lZCB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIGZuKCk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgaWYgKHR5cGVvZiBlcnJvciA9PT0gJ29iamVjdCcgJiYgZXJyb3IgJiYgJ2NvZGUnIGluIGVycm9yICYmIGVycm9yLmNvZGUgPT09ICdFTk9FTlQnKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRocm93IGVycm9yO1xuICB9XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBpZ25vcmVFcnJvckFzeW5jPFQ+KGZuOiAoKSA9PiBQcm9taXNlPFQ+KTogUHJvbWlzZTxUIHwgdW5kZWZpbmVkPiB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIGF3YWl0IGZuKCk7XG4gIH0gY2F0Y2gge1xuICAgIC8vIGRvIG5vdGhpbmdcbiAgfVxufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gaWdub3JlRW5vZW50QXN5bmM8VD4oZm46ICgpID0+IFByb21pc2U8VD4pOiBQcm9taXNlPFQgfCB1bmRlZmluZWQ+IHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gYXdhaXQgZm4oKTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBpZiAodHlwZW9mIGVycm9yID09PSAnb2JqZWN0JyAmJiBlcnJvciAmJiAnY29kZScgaW4gZXJyb3IgJiYgZXJyb3IuY29kZSA9PT0gJ0VOT0VOVCcpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhyb3cgZXJyb3I7XG4gIH1cbn1cblxuZXhwb3J0IGludGVyZmFjZSBSZXRyeU9wdGlvbnMge1xuICBiZWZvcmVSZXRyeT86IChlcnJvcjogdW5rbm93bikgPT4gUHJvbWlzZTx2b2lkPjtcbiAgaGFuZGxlRXJyb3I/OiAoZXJyb3I6IHVua25vd24pID0+IFByb21pc2U8dm9pZD47XG4gIHJldHJ5Q291bnQ/OiBudW1iZXI7XG4gIHJldHJ5TG9nZ2VyPzogKG1lc3NhZ2U6IHN0cmluZykgPT4gdm9pZDtcbiAgc2hvdWxkUmV0cnk/OiAoZXJyb3I6IHVua25vd24pID0+IGJvb2xlYW47XG4gIHNsZWVwTWlsbGlzZWNvbmRzPzogbnVtYmVyO1xuICB1cGRhdGVTbGVlcE1pbGxpc2Vjb25kcz86IChzbGVlcE1pbGxpc2Vjb25kczogbnVtYmVyKSA9PiBudW1iZXI7XG59XG5cbi8qKlxuICogUmV0cnkgdGhlIGdpdmVuIGZ1bmN0aW9uLlxuICogQHBhcmFtIGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIHJldHJ5LlxuICogQHBhcmFtIGJlZm9yZVJldHJ5IFRoZSBmdW5jdGlvbiB0byBjYWxsIGltbWVkaWF0ZWx5IGJlZm9yZSByZXRyeWluZy5cbiAqIEBwYXJhbSBoYW5kbGVFcnJvciBUaGUgZnVuY3Rpb24gdG8gY2FsbCB3aGVuIGFuIGVycm9yIG9jY3Vycy5cbiAqIEBwYXJhbSByZXRyeUNvdW50IFRoZSBtYXhpbXVtIG51bWJlciBvZiByZXRyaWVzLlxuICogQHBhcmFtIHJldHJ5TG9nZ2VyIFRoZSBmdW5jdGlvbiB0byBsb2cgcmV0cnlpbmcuXG4gKiBAcGFyYW0gc2xlZXBNaWxsaXNlY29uZHMgVGhlIG51bWJlciBvZiBtaWxsaXNlY29uZHMgdG8gc2xlZXAgYmVmb3JlIHJldHJ5aW5nLlxuICogQHBhcmFtIHVwZGF0ZVNsZWVwTWlsbGlzZWNvbmRzIFRoZSBmdW5jdGlvbiB0byB1cGRhdGUgc2xlZXAgbWlsbGlzZWNvbmRzIGFmdGVyIGVhY2ggcmV0cnkuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiB3aXRoUmV0cnk8VD4oXG4gIGZ1bmM6IChmYWlsZWRDb3VudDogbnVtYmVyKSA9PiBUIHwgUHJvbWlzZTxUPixcbiAge1xuICAgIGJlZm9yZVJldHJ5LFxuICAgIGhhbmRsZUVycm9yLFxuICAgIHJldHJ5Q291bnQgPSAzLFxuICAgIHJldHJ5TG9nZ2VyLFxuICAgIHNob3VsZFJldHJ5LFxuICAgIHNsZWVwTWlsbGlzZWNvbmRzID0gMCxcbiAgICB1cGRhdGVTbGVlcE1pbGxpc2Vjb25kcyxcbiAgfTogUmV0cnlPcHRpb25zID0ge31cbik6IFByb21pc2U8VD4ge1xuICBsZXQgZmFpbGVkQ291bnQgPSAwO1xuICBmb3IgKDs7KSB7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiBhd2FpdCBmdW5jKGZhaWxlZENvdW50KTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgYXdhaXQgaGFuZGxlRXJyb3I/LihlcnJvcik7XG4gICAgICBmYWlsZWRDb3VudCsrO1xuICAgICAgaWYgKGZhaWxlZENvdW50ID49IHJldHJ5Q291bnQpIHtcbiAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICB9XG4gICAgICBpZiAoc2hvdWxkUmV0cnkgJiYgIXNob3VsZFJldHJ5KGVycm9yKSkge1xuICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgIH1cbiAgICAgIGlmIChzbGVlcE1pbGxpc2Vjb25kcyA+IDApIHtcbiAgICAgICAgYXdhaXQgc2xlZXAoc2xlZXBNaWxsaXNlY29uZHMpO1xuICAgICAgfVxuICAgICAgaWYgKHVwZGF0ZVNsZWVwTWlsbGlzZWNvbmRzKSB7XG4gICAgICAgIHNsZWVwTWlsbGlzZWNvbmRzID0gdXBkYXRlU2xlZXBNaWxsaXNlY29uZHMoc2xlZXBNaWxsaXNlY29uZHMpO1xuICAgICAgfVxuICAgICAgcmV0cnlMb2dnZXI/LihgUmV0cnkgZHVlIHRvOiAke2Vycm9yfVxuJHtlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gJy0tLVxcbicgKyAoZXJyb3Iuc3RhY2sgPz8gJycpIDogJyd9YCk7XG4gICAgICBhd2FpdCBiZWZvcmVSZXRyeT8uKGVycm9yKTtcbiAgICB9XG4gIH1cbn1cbiIsImNsYXNzIE9wdGlvbnMge1xuICBpc1ZlcmJvc2UgPSBmYWxzZTtcbiAgZG9lc1VwbG9hZEVudlZhcnMgPSBmYWxzZTtcbn1cblxuZXhwb3J0IGNvbnN0IG9wdGlvbnMgPSBuZXcgT3B0aW9ucygpO1xuIiwiaW1wb3J0IHsgb3B0aW9ucyB9IGZyb20gJy4vb3B0aW9ucy5qcyc7XG5cbmNsYXNzIExvZ2dlciB7XG4gIGFzeW5jIGZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24obmFtZTogc3RyaW5nLCBmdW5jOiAoKSA9PiBQcm9taXNlPHZvaWQ+KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKG9wdGlvbnMuaXNWZXJib3NlKSB7XG4gICAgICBjb25zb2xlLmluZm8oYC0tLS0tLS0tLSAke25hbWV9IHN0YXJ0IC0tLS0tLS0tLWApO1xuICAgIH1cbiAgICB0cnkge1xuICAgICAgYXdhaXQgZnVuYygpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBjb25zb2xlLmluZm8oYEVycm9yIG9jY3VycmVkIGluICR7bmFtZX06ICR7ZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLnN0YWNrIDogU3RyaW5nKGVycm9yKX19YCk7XG4gICAgfVxuICAgIGlmIChvcHRpb25zLmlzVmVyYm9zZSkge1xuICAgICAgY29uc29sZS5pbmZvKGAtLS0tLS0tLS0tICR7bmFtZX0gZW5kIC0tLS0tLS0tLS1gKTtcbiAgICB9XG4gIH1cbn1cblxuZXhwb3J0IGNvbnN0IGxvZ2dlciA9IG5ldyBMb2dnZXIoKTtcbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmV4cG9ydCBjb25zdCBmc1V0aWwgPSB7XG4gIGFzeW5jIHJlYWRGaWxlSWdub3JpbmdFcnJvcihmaWxlUGF0aDogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmcgfCB1bmRlZmluZWQ+IHtcbiAgICB0cnkge1xuICAgICAgcmV0dXJuIGF3YWl0IGZzLnByb21pc2VzLnJlYWRGaWxlKGZpbGVQYXRoLCAndXRmOCcpO1xuICAgIH0gY2F0Y2gge1xuICAgICAgLy8gZG8gbm90aGluZ1xuICAgIH1cbiAgfSxcbiAgYXN5bmMgZ2VuZXJhdGVGaWxlKGZpbGVQYXRoOiBzdHJpbmcsIGNvbnRlbnQ6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgIGF3YWl0IGZzLnByb21pc2VzLm1rZGlyKHBhdGguZGlybmFtZShmaWxlUGF0aCksIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICAgIGxldCBub3JtYWxpemVkQ29udGVudCA9IGNvbnRlbnQudHJpbSgpO1xuICAgIGlmIChub3JtYWxpemVkQ29udGVudCkge1xuICAgICAgbm9ybWFsaXplZENvbnRlbnQgKz0gJ1xcbic7XG4gICAgfVxuICAgIGF3YWl0IGZzLnByb21pc2VzLndyaXRlRmlsZShmaWxlUGF0aCwgbm9ybWFsaXplZENvbnRlbnQpO1xuICAgIGNvbnNvbGUubG9nKGBHZW5lcmF0ZWQvVXBkYXRlZCAke2ZpbGVQYXRofWApO1xuICB9LFxufTtcbiIsImltcG9ydCB7IFByb21pc2VQb29sIH0gZnJvbSAnbWluaW1hbC1wcm9taXNlLXBvb2wnO1xuXG5leHBvcnQgY29uc3QgcHJvbWlzZVBvb2wgPSBuZXcgUHJvbWlzZVBvb2woKTtcbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB0cyBmcm9tICd0eXBlc2NyaXB0JztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZnNVdGlsIH0gZnJvbSAnLi4vdXRpbHMvZnNVdGlsLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZml4TmV4dENvbmZpZ0pzb24oY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZml4TmV4dENvbmZpZ0pzb24nLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgZmlsZVBhdGggPSBbJ2pzJywgJ21qcycsICdjanMnXVxuICAgICAgLm1hcCgoZXh0KSA9PiBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsIGBuZXh0LmNvbmZpZy4ke2V4dH1gKSlcbiAgICAgIC5maW5kKChwKSA9PiBmcy5leGlzdHNTeW5jKHApKTtcbiAgICBpZiAoIWZpbGVQYXRoKSByZXR1cm47XG5cbiAgICBjb25zdCBvbGRDb250ZW50ID0gYXdhaXQgZnMucHJvbWlzZXMucmVhZEZpbGUoZmlsZVBhdGgsICd1dGY4Jyk7XG4gICAgY29uc3Qgb2JqZWN0TGl0ZXJhbCA9IGdldE5leHRDb25maWdPYmplY3RMaXRlcmFsKG9sZENvbnRlbnQpO1xuICAgIGlmICghb2JqZWN0TGl0ZXJhbCkgcmV0dXJuO1xuXG4gICAgY29uc3QgZXhpc3RpbmdQcm9wZXJ0aWVzID0gbmV3IFNldChvYmplY3RMaXRlcmFsLnByb3BlcnRpZXMubWFwKChwcm9wZXJ0eSkgPT4gcHJvcGVydHkubmFtZT8uZ2V0VGV4dCgpKSk7XG4gICAgY29uc3QgcHJvcGVydHlUZXh0czogc3RyaW5nW10gPSBbXTtcbiAgICBpZiAoIWV4aXN0aW5nUHJvcGVydGllcy5oYXMoJ3R5cGVzY3JpcHQnKSkge1xuICAgICAgcHJvcGVydHlUZXh0cy5wdXNoKCd0eXBlc2NyaXB0OiB7IGlnbm9yZUJ1aWxkRXJyb3JzOiB0cnVlIH0nKTtcbiAgICB9XG4gICAgaWYgKHByb3BlcnR5VGV4dHMubGVuZ3RoID09PSAwKSByZXR1cm47XG5cbiAgICBjb25zdCBpbnNlcnRpb25Qb2ludCA9IG9iamVjdExpdGVyYWwuZ2V0RW5kKCkgLSAxO1xuICAgIGNvbnN0IGxhc3RQcm9wZXJ0eSA9IG9iamVjdExpdGVyYWwucHJvcGVydGllcy5hdCgtMSk7XG4gICAgY29uc3QgaGFzVHJhaWxpbmdDb21tYSA9IGxhc3RQcm9wZXJ0eVxuICAgICAgPyBvbGRDb250ZW50LnNsaWNlKGxhc3RQcm9wZXJ0eS5nZXRFbmQoKSwgaW5zZXJ0aW9uUG9pbnQpLmluY2x1ZGVzKCcsJylcbiAgICAgIDogZmFsc2U7XG4gICAgY29uc3QgcHJlZml4ID0gb2JqZWN0TGl0ZXJhbC5wcm9wZXJ0aWVzLmxlbmd0aCA+IDAgJiYgIWhhc1RyYWlsaW5nQ29tbWEgPyAnLCAnIDogJyc7XG4gICAgY29uc3QgbmV3Q29udGVudCA9IGAke29sZENvbnRlbnQuc2xpY2UoMCwgaW5zZXJ0aW9uUG9pbnQpfSR7cHJlZml4fSR7cHJvcGVydHlUZXh0cy5qb2luKCcsICcpfSR7b2xkQ29udGVudC5zbGljZShcbiAgICAgIGluc2VydGlvblBvaW50XG4gICAgKX1gO1xuICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiBmc1V0aWwuZ2VuZXJhdGVGaWxlKGZpbGVQYXRoLCBuZXdDb250ZW50KSk7XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBnZXROZXh0Q29uZmlnT2JqZWN0TGl0ZXJhbChjb250ZW50OiBzdHJpbmcpOiB0cy5PYmplY3RMaXRlcmFsRXhwcmVzc2lvbiB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IHNvdXJjZSA9IHRzLmNyZWF0ZVNvdXJjZUZpbGUoJ25leHQuY29uZmlnLmpzJywgY29udGVudCwgdHMuU2NyaXB0VGFyZ2V0LkxhdGVzdCwgdHJ1ZSwgdHMuU2NyaXB0S2luZC5KUyk7XG4gIGxldCBvYmplY3RMaXRlcmFsOiB0cy5PYmplY3RMaXRlcmFsRXhwcmVzc2lvbiB8IHVuZGVmaW5lZDtcbiAgY29uc3QgdmlzaXQgPSAobm9kZTogdHMuTm9kZSk6IHZvaWQgPT4ge1xuICAgIGlmIChvYmplY3RMaXRlcmFsKSByZXR1cm47XG4gICAgaWYgKHRzLmlzRXhwb3J0QXNzaWdubWVudChub2RlKSAmJiB0cy5pc09iamVjdExpdGVyYWxFeHByZXNzaW9uKG5vZGUuZXhwcmVzc2lvbikpIHtcbiAgICAgIG9iamVjdExpdGVyYWwgPSBub2RlLmV4cHJlc3Npb247XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmIChcbiAgICAgIHRzLmlzQmluYXJ5RXhwcmVzc2lvbihub2RlKSAmJlxuICAgICAgbm9kZS5vcGVyYXRvclRva2VuLmtpbmQgPT09IHRzLlN5bnRheEtpbmQuRXF1YWxzVG9rZW4gJiZcbiAgICAgIG5vZGUubGVmdC5nZXRUZXh0KHNvdXJjZSkgPT09ICdtb2R1bGUuZXhwb3J0cycgJiZcbiAgICAgIHRzLmlzT2JqZWN0TGl0ZXJhbEV4cHJlc3Npb24obm9kZS5yaWdodClcbiAgICApIHtcbiAgICAgIG9iamVjdExpdGVyYWwgPSBub2RlLnJpZ2h0O1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0cy5mb3JFYWNoQ2hpbGQobm9kZSwgdmlzaXQpO1xuICB9O1xuICB2aXNpdChzb3VyY2UpO1xuICByZXR1cm4gb2JqZWN0TGl0ZXJhbDtcbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB0cyBmcm9tICd0eXBlc2NyaXB0JztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZnNVdGlsIH0gZnJvbSAnLi4vdXRpbHMvZnNVdGlsLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuXG50eXBlIFBhcnNlZFZhbHVlID1cbiAgfCB7IGtpbmQ6ICdhcnJheSc7IHZhbHVlOiBQYXJzZWRWYWx1ZVtdIH1cbiAgfCB7IGtpbmQ6ICdsaXRlcmFsJzsgdmFsdWU6IHN0cmluZyB9XG4gIHwgeyBraW5kOiAnb2JqZWN0JzsgdmFsdWU6IFBhcnNlZE9iamVjdCB9O1xudHlwZSBPYmplY3RNZW1iZXIgPSB7IGtpbmQ6ICdleHRyYSc7IGluZGV4OiBudW1iZXIgfSB8IHsga2luZDogJ3Byb3BlcnR5Jzsga2V5OiBzdHJpbmcgfTtcbmludGVyZmFjZSBQYXJzZWRPYmplY3Qge1xuICBleHRyYU1lbWJlcnM6IHN0cmluZ1tdO1xuICBtZW1iZXJPcmRlcjogT2JqZWN0TWVtYmVyW107XG4gIHByb3BlcnRpZXM6IFJlY29yZDxzdHJpbmcsIFBhcnNlZFZhbHVlPjtcbn1cbmludGVyZmFjZSBFeHRyYWN0ZWRPYmplY3RMaXRlcmFsIHtcbiAgc291cmNlOiB0cy5Tb3VyY2VGaWxlO1xuICBub2RlOiB0cy5PYmplY3RMaXRlcmFsRXhwcmVzc2lvbjtcbn1cblxuY29uc3QgbGl0ZXJhbCA9ICh2YWx1ZTogc3RyaW5nKTogUGFyc2VkVmFsdWUgPT4gKHsga2luZDogJ2xpdGVyYWwnLCB2YWx1ZSB9KTtcbmNvbnN0IGFzQXJyYXkgPSAodmFsdWU6IFBhcnNlZFZhbHVlW10pOiBQYXJzZWRWYWx1ZSA9PiAoeyBraW5kOiAnYXJyYXknLCB2YWx1ZSB9KTtcbmNvbnN0IGFzT2JqZWN0ID0gKHByb3BlcnRpZXM6IFJlY29yZDxzdHJpbmcsIFBhcnNlZFZhbHVlPiwgZXh0cmFNZW1iZXJzOiBzdHJpbmdbXSA9IFtdKTogUGFyc2VkVmFsdWUgPT4gKHtcbiAga2luZDogJ29iamVjdCcsXG4gIHZhbHVlOiB0b1BhcnNlZE9iamVjdChwcm9wZXJ0aWVzLCBleHRyYU1lbWJlcnMpLFxufSk7XG5cbmNvbnN0IGRlZmF1bHRDb25maWcgPSB0b1BhcnNlZE9iamVjdCh7XG4gIGZvcmJpZE9ubHk6IGxpdGVyYWwoJyEhcHJvY2Vzcy5lbnYuQ0knKSxcbiAgcmV0cmllczogbGl0ZXJhbCgncHJvY2Vzcy5lbnYuUFdERUJVRyA/IDAgOiBwcm9jZXNzLmVudi5DSSA/IDUgOiAxJyksXG4gIHVzZTogYXNPYmplY3Qoe1xuICAgIGJhc2VVUkw6IGxpdGVyYWwoJ3Byb2Nlc3MuZW52Lk5FWFRfUFVCTElDX0JBU0VfVVJMJyksXG4gICAgdHJhY2U6IGxpdGVyYWwoXCJwcm9jZXNzLmVudi5DSSA/ICdvbi1maXJzdC1yZXRyeScgOiAncmV0YWluLW9uLWZhaWx1cmUnXCIpLFxuICAgIHNjcmVlbnNob3Q6IGxpdGVyYWwoXCJwcm9jZXNzLmVudi5DSSA/ICdvbmx5LW9uLWZhaWx1cmUnIDogJ29ubHktb24tZmFpbHVyZSdcIiksXG4gICAgdmlkZW86IGxpdGVyYWwoXCJwcm9jZXNzLmVudi5DSSA/ICdyZXRhaW4tb24tZmFpbHVyZScgOiAncmV0YWluLW9uLWZhaWx1cmUnXCIpLFxuICB9KSxcbiAgd2ViU2VydmVyOiBhc09iamVjdCh7XG4gICAgY29tbWFuZDogbGl0ZXJhbChcIid5YXJuIHN0YXJ0LXRlc3Qtc2VydmVyJ1wiKSxcbiAgICB1cmw6IGxpdGVyYWwoJ3Byb2Nlc3MuZW52Lk5FWFRfUFVCTElDX0JBU0VfVVJMJyksXG4gICAgcmV1c2VFeGlzdGluZ1NlcnZlcjogbGl0ZXJhbCgnISFwcm9jZXNzLmVudi5DSScpLFxuICAgIHRpbWVvdXQ6IGxpdGVyYWwoJzMwMF8wMDAnKSxcbiAgICBzdGRvdXQ6IGxpdGVyYWwoXCIncGlwZSdcIiksXG4gICAgc3RkZXJyOiBsaXRlcmFsKFwiJ3BpcGUnXCIpLFxuICAgIGVudjogbGl0ZXJhbChge1xuICAuLi5wcm9jZXNzLmVudixcbiAgUFJJU01BX1VTRVJfQ09OU0VOVF9GT1JfREFOR0VST1VTX0FJX0FDVElPTjogJ3RydWUnLFxufWApLFxuICAgIGdyYWNlZnVsU2h1dGRvd246IGxpdGVyYWwoYHtcbiAgc2lnbmFsOiAnU0lHVEVSTScsXG4gIHRpbWVvdXQ6IDUwMCxcbn1gKSxcbiAgfSksXG59KTtcblxuZnVuY3Rpb24gdG9QYXJzZWRPYmplY3QocHJvcGVydGllczogUmVjb3JkPHN0cmluZywgUGFyc2VkVmFsdWU+LCBleHRyYU1lbWJlcnM6IHN0cmluZ1tdID0gW10pOiBQYXJzZWRPYmplY3Qge1xuICByZXR1cm4ge1xuICAgIGV4dHJhTWVtYmVycyxcbiAgICBtZW1iZXJPcmRlcjogW1xuICAgICAgLi4uT2JqZWN0LmtleXMocHJvcGVydGllcykubWFwKChrZXkpOiBPYmplY3RNZW1iZXIgPT4gKHsga2luZDogJ3Byb3BlcnR5Jywga2V5IH0pKSxcbiAgICAgIC4uLmV4dHJhTWVtYmVycy5tYXAoKF8sIGluZGV4KTogT2JqZWN0TWVtYmVyID0+ICh7IGtpbmQ6ICdleHRyYScsIGluZGV4IH0pKSxcbiAgICBdLFxuICAgIHByb3BlcnRpZXMsXG4gIH07XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBmaXhQbGF5d3JpZ2h0Q29uZmlnKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBmaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgYHBsYXl3cmlnaHQuY29uZmlnLnRzYCk7XG4gIGlmICghZnMuZXhpc3RzU3luYyhmaWxlUGF0aCkpIHJldHVybjtcblxuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2ZpeFBsYXl3cmlnaHRDb25maWcnLCBhc3luYyAoKSA9PiB7XG4gICAgYXdhaXQgYXNzZXJ0TmV4dFB1YmxpY0Jhc2VVcmwoY29uZmlnLmRpclBhdGgpO1xuXG4gICAgY29uc3Qgb2xkQ29udGVudCA9IGF3YWl0IGZzLnByb21pc2VzLnJlYWRGaWxlKGZpbGVQYXRoLCAndXRmOCcpO1xuICAgIGNvbnN0IGV4dHJhY3RlZE9iamVjdExpdGVyYWwgPSBleHRyYWN0RGVmaW5lQ29uZmlnT2JqZWN0TGl0ZXJhbChvbGRDb250ZW50KTtcbiAgICBpZiAoIWV4dHJhY3RlZE9iamVjdExpdGVyYWwpIHJldHVybjtcblxuICAgIGNvbnN0IHBhcnNlZCA9IHBhcnNlT2JqZWN0TGl0ZXJhbEV4cHJlc3Npb24oZXh0cmFjdGVkT2JqZWN0TGl0ZXJhbC5ub2RlLCBleHRyYWN0ZWRPYmplY3RMaXRlcmFsLnNvdXJjZSk7XG4gICAgaWYgKCFwYXJzZWQpIHJldHVybjtcblxuICAgIC8vIEtlZXAgZmlsbGluZyBtaXNzaW5nIGRlZmF1bHRzLCBidXQgZG9uJ3Qgb3ZlcndyaXRlIGxvY2FsIGFkanVzdG1lbnRzIG9uIGV2ZXJ5IHJlZ2VuZXJhdGlvbi5cbiAgICBjb25zdCBtZXJnZWQgPSBtZXJnZVBhcnNlZE9iamVjdHMoZGVmYXVsdENvbmZpZywgcGFyc2VkKTtcbiAgICBjb25zdCBoYXNTdGFydFRlc3RTZXJ2ZXIgPSBCb29sZWFuKGNvbmZpZy5wYWNrYWdlSnNvbj8uc2NyaXB0cz8uWydzdGFydC10ZXN0LXNlcnZlciddKTtcbiAgICBjb25zdCBoYXNFeGlzdGluZ1dlYlNlcnZlciA9IEJvb2xlYW4ocGFyc2VkLnByb3BlcnRpZXMud2ViU2VydmVyKTtcbiAgICAvLyBPbmx5IGRyb3Agd2JmeSdzIGRlZmF1bHQgc2VydmVyIGNvbW1hbmQuIFJlcG9zIHdpdGggY3VzdG9tIFBsYXl3cmlnaHRcbiAgICAvLyBzZXJ2ZXIgc2V0dXAgc3RpbGwgbmVlZCBpdCBldmVuIHdoZW4gdGhleSBkbyBub3QgZXhwb3NlIHN0YXJ0LXRlc3Qtc2VydmVyLlxuICAgIGlmICghaGFzU3RhcnRUZXN0U2VydmVyICYmICFoYXNFeGlzdGluZ1dlYlNlcnZlcikge1xuICAgICAgZGVsZXRlIG1lcmdlZC5wcm9wZXJ0aWVzLndlYlNlcnZlcjtcbiAgICB9XG4gICAgc2V0V2ViU2VydmVyQ29tbWFuZChjb25maWcsIG1lcmdlZCk7XG5cbiAgICBjb25zdCBuZXdPYmplY3RMaXRlcmFsID0gc3RyaW5naWZ5VmFsdWUoeyBraW5kOiAnb2JqZWN0JywgdmFsdWU6IG1lcmdlZCB9LCAwKTtcbiAgICBjb25zdCBzdGFydCA9IGV4dHJhY3RlZE9iamVjdExpdGVyYWwubm9kZS5nZXRTdGFydChleHRyYWN0ZWRPYmplY3RMaXRlcmFsLnNvdXJjZSk7XG4gICAgY29uc3QgZW5kID0gZXh0cmFjdGVkT2JqZWN0TGl0ZXJhbC5ub2RlLmdldEVuZCgpO1xuICAgIGNvbnN0IG5ld0NvbnRlbnQgPSBgJHtvbGRDb250ZW50LnNsaWNlKDAsIHN0YXJ0KX0ke25ld09iamVjdExpdGVyYWx9JHtvbGRDb250ZW50LnNsaWNlKGVuZCl9YDtcblxuICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiBmc1V0aWwuZ2VuZXJhdGVGaWxlKGZpbGVQYXRoLCBuZXdDb250ZW50KSk7XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBtZXJnZVBhcnNlZE9iamVjdHMoYmFzZTogUGFyc2VkT2JqZWN0LCBvdmVycmlkZTogUGFyc2VkT2JqZWN0KTogUGFyc2VkT2JqZWN0IHtcbiAgY29uc3Qgb3ZlcnJpZGVQcm9wZXJ0eUtleXMgPSBuZXcgU2V0KE9iamVjdC5rZXlzKG92ZXJyaWRlLnByb3BlcnRpZXMpKTtcbiAgY29uc3QgZXh0cmFNZW1iZXJzID0gWy4uLmJhc2UuZXh0cmFNZW1iZXJzLCAuLi5vdmVycmlkZS5leHRyYU1lbWJlcnNdO1xuICAvLyBLZWVwIGRlZmF1bHQtb25seSBtZW1iZXJzIGJlZm9yZSBwYXJzZWQgbWVtYmVycyBzbyBzcHJlYWRzIGFuZCBleHBsaWNpdCBsb2NhbCBwcm9wZXJ0aWVzIHJldGFpbiBwcmVjZWRlbmNlLlxuICBjb25zdCBtZW1iZXJPcmRlciA9IFtcbiAgICAuLi5iYXNlLm1lbWJlck9yZGVyLmZpbHRlcigobWVtYmVyKSA9PiBtZW1iZXIua2luZCAhPT0gJ3Byb3BlcnR5JyB8fCAhb3ZlcnJpZGVQcm9wZXJ0eUtleXMuaGFzKG1lbWJlci5rZXkpKSxcbiAgICAuLi5vdmVycmlkZS5tZW1iZXJPcmRlci5tYXAoKG1lbWJlcik6IE9iamVjdE1lbWJlciA9PiB7XG4gICAgICBpZiAobWVtYmVyLmtpbmQgPT09ICdwcm9wZXJ0eScpIHJldHVybiBtZW1iZXI7XG4gICAgICByZXR1cm4geyBraW5kOiAnZXh0cmEnLCBpbmRleDogYmFzZS5leHRyYU1lbWJlcnMubGVuZ3RoICsgbWVtYmVyLmluZGV4IH07XG4gICAgfSksXG4gIF07XG4gIGNvbnN0IHByb3BlcnRpZXMgPSB7IC4uLmJhc2UucHJvcGVydGllcyB9O1xuICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhvdmVycmlkZS5wcm9wZXJ0aWVzKSkge1xuICAgIHByb3BlcnRpZXNba2V5XSA9IG1lcmdlUGFyc2VkVmFsdWUocHJvcGVydGllc1trZXldLCB2YWx1ZSk7XG4gIH1cbiAgcmV0dXJuIHsgZXh0cmFNZW1iZXJzLCBtZW1iZXJPcmRlciwgcHJvcGVydGllcyB9O1xufVxuXG5mdW5jdGlvbiBtZXJnZVBhcnNlZFZhbHVlKGJhc2U6IFBhcnNlZFZhbHVlIHwgdW5kZWZpbmVkLCBvdmVycmlkZTogUGFyc2VkVmFsdWUpOiBQYXJzZWRWYWx1ZSB7XG4gIGlmIChiYXNlPy5raW5kID09PSAnb2JqZWN0JyAmJiBvdmVycmlkZS5raW5kID09PSAnb2JqZWN0Jykge1xuICAgIHJldHVybiB7IGtpbmQ6ICdvYmplY3QnLCB2YWx1ZTogbWVyZ2VQYXJzZWRPYmplY3RzKGJhc2UudmFsdWUsIG92ZXJyaWRlLnZhbHVlKSB9O1xuICB9XG4gIHJldHVybiBvdmVycmlkZTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gYXNzZXJ0TmV4dFB1YmxpY0Jhc2VVcmwoZGlyUGF0aDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gIGZvciAoY29uc3QgZW52RmlsZVBhdGggb2YgZ2V0RW52RmlsZVBhdGhzKGRpclBhdGgpKSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGNvbnRlbnQgPSBhd2FpdCBmcy5wcm9taXNlcy5yZWFkRmlsZShlbnZGaWxlUGF0aCwgJ3V0ZjgnKTtcbiAgICAgIGlmICgvTkVYVF9QVUJMSUNfQkFTRV9VUkxcXHMqPS9tLnRlc3QoY29udGVudCkpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgIH0gY2F0Y2gge1xuICAgICAgLy8gTWlzc2luZyBlbnYgZmlsZXMgYXJlIGV4cGVjdGVkIGluIHNvbWUgcmVwb3MuXG4gICAgfVxuICB9XG5cbiAgdGhyb3cgbmV3IEVycm9yKCdORVhUX1BVQkxJQ19CQVNFX1VSTCBpcyByZXF1aXJlZCBmb3IgUGxheXdyaWdodC4gRGVmaW5lIE5FWFRfUFVCTElDX0JBU0VfVVJMIGluIHRoZSB0YXJnZXQgcmVwby4nKTtcbn1cblxuZnVuY3Rpb24gZ2V0RW52RmlsZVBhdGhzKGRpclBhdGg6IHN0cmluZyk6IHN0cmluZ1tdIHtcbiAgY29uc3QgZW52RmlsZU5hbWVzID0gWycuZW52JywgJy5lbnYudGVzdCcsICcuZW52LmV4YW1wbGUnLCAnbWlzZS50b21sJywgJ21pc2UudGVzdC50b21sJ107XG4gIGNvbnN0IGVudkZpbGVQYXRoczogc3RyaW5nW10gPSBbXTtcblxuICBmb3IgKGxldCBjdXJyZW50RGlyUGF0aCA9IHBhdGgucmVzb2x2ZShkaXJQYXRoKTsgOyBjdXJyZW50RGlyUGF0aCA9IHBhdGguZGlybmFtZShjdXJyZW50RGlyUGF0aCkpIHtcbiAgICBlbnZGaWxlUGF0aHMucHVzaCguLi5lbnZGaWxlTmFtZXMubWFwKChmaWxlTmFtZSkgPT4gcGF0aC5yZXNvbHZlKGN1cnJlbnREaXJQYXRoLCBmaWxlTmFtZSkpKTtcblxuICAgIC8vIFBsYXl3cmlnaHQgY29uZmlncyBvZnRlbiBsaXZlIGluIHBhY2thZ2VzLyogd2hpbGUgc2hhcmVkIGVudiBmaWxlcyBsaXZlIGF0IHRoZVxuICAgIC8vIHJlcG9zaXRvcnkgcm9vdCwgc28gd2FsayB1cHdhcmQgdW50aWwgdGhlIHRhcmdldCByZXBvIGJvdW5kYXJ5LlxuICAgIGlmIChmcy5leGlzdHNTeW5jKHBhdGgucmVzb2x2ZShjdXJyZW50RGlyUGF0aCwgJy5naXQnKSkpIGJyZWFrO1xuXG4gICAgY29uc3QgcGFyZW50RGlyUGF0aCA9IHBhdGguZGlybmFtZShjdXJyZW50RGlyUGF0aCk7XG4gICAgaWYgKHBhcmVudERpclBhdGggPT09IGN1cnJlbnREaXJQYXRoKSBicmVhaztcbiAgfVxuXG4gIHJldHVybiBlbnZGaWxlUGF0aHM7XG59XG5cbmZ1bmN0aW9uIHNldFdlYlNlcnZlckNvbW1hbmQoY29uZmlnOiBQYWNrYWdlQ29uZmlnLCBvYmplY3Q6IFBhcnNlZE9iamVjdCk6IHZvaWQge1xuICBjb25zdCB3ZWJTZXJ2ZXIgPSBvYmplY3QucHJvcGVydGllcy53ZWJTZXJ2ZXI7XG4gIGlmICh3ZWJTZXJ2ZXI/LmtpbmQgIT09ICdvYmplY3QnKSByZXR1cm47XG5cbiAgLy8gd2JmeSBvd25zIHRoZSBwYWNrYWdlIHNjcmlwdCwgc28gUGxheXdyaWdodCBzaG91bGQgY29uc2lzdGVudGx5IGNhbGwgdGhhdFxuICAvLyBzY3JpcHQgd2hpbGUgcHJlc2VydmluZyB0aGUgcmVzdCBvZiBlYWNoIHJlcG9zaXRvcnkncyB3ZWJTZXJ2ZXIgc2V0dGluZ3MuXG4gIHdlYlNlcnZlci52YWx1ZS5wcm9wZXJ0aWVzLmNvbW1hbmQgPSBsaXRlcmFsKGNvbmZpZy5pc0J1biA/IFwiJ2J1biBzdGFydC10ZXN0LXNlcnZlcidcIiA6IFwiJ3lhcm4gc3RhcnQtdGVzdC1zZXJ2ZXInXCIpO1xufVxuXG5mdW5jdGlvbiBleHRyYWN0RGVmaW5lQ29uZmlnT2JqZWN0TGl0ZXJhbChjb250ZW50OiBzdHJpbmcpOiBFeHRyYWN0ZWRPYmplY3RMaXRlcmFsIHwgdW5kZWZpbmVkIHtcbiAgY29uc3Qgc291cmNlID0gdHMuY3JlYXRlU291cmNlRmlsZSgncGxheXdyaWdodC5jb25maWcudHMnLCBjb250ZW50LCB0cy5TY3JpcHRUYXJnZXQuTGF0ZXN0LCB0cnVlLCB0cy5TY3JpcHRLaW5kLlRTKTtcblxuICAvLyBUeXBlU2NyaXB0IGFscmVhZHkgdW5kZXJzdGFuZHMgbmVzdGVkIG9iamVjdCBsaXRlcmFscyBhbmQgdGVtcGxhdGUgc3RyaW5ncywgc28gdXNlXG4gIC8vIGl0cyBBU1QgcmFuZ2VzIGluc3RlYWQgb2YgYSByZWdleCB0aGF0IGNhbiBzdG9wIGF0IHRoZSBmaXJzdCBpbm5lciBjbG9zaW5nIGJyYWNlLlxuICBsZXQgZm91bmQ6IHRzLk9iamVjdExpdGVyYWxFeHByZXNzaW9uIHwgdW5kZWZpbmVkO1xuICBjb25zdCB2aXNpdCA9IChub2RlOiB0cy5Ob2RlKTogdm9pZCA9PiB7XG4gICAgaWYgKGZvdW5kKSByZXR1cm47XG4gICAgaWYgKHRzLmlzQ2FsbEV4cHJlc3Npb24obm9kZSkgJiYgbm9kZS5leHByZXNzaW9uLmdldFRleHQoc291cmNlKSA9PT0gJ2RlZmluZUNvbmZpZycpIHtcbiAgICAgIGNvbnN0IGZpcnN0QXJndW1lbnQgPSBub2RlLmFyZ3VtZW50c1swXTtcbiAgICAgIGlmIChmaXJzdEFyZ3VtZW50ICYmIHRzLmlzT2JqZWN0TGl0ZXJhbEV4cHJlc3Npb24oZmlyc3RBcmd1bWVudCkpIHtcbiAgICAgICAgZm91bmQgPSBmaXJzdEFyZ3VtZW50O1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgfVxuICAgIHRzLmZvckVhY2hDaGlsZChub2RlLCB2aXNpdCk7XG4gIH07XG4gIHZpc2l0KHNvdXJjZSk7XG5cbiAgcmV0dXJuIGZvdW5kID8geyBzb3VyY2UsIG5vZGU6IGZvdW5kIH0gOiB1bmRlZmluZWQ7XG59XG5cbmZ1bmN0aW9uIHBhcnNlRXhwcmVzc2lvbihleHByZXNzaW9uOiB0cy5FeHByZXNzaW9uLCBzb3VyY2U6IHRzLlNvdXJjZUZpbGUpOiBQYXJzZWRWYWx1ZSB8IHVuZGVmaW5lZCB7XG4gIGlmICh0cy5pc09iamVjdExpdGVyYWxFeHByZXNzaW9uKGV4cHJlc3Npb24pKSB7XG4gICAgY29uc3QgcGFyc2VkT2JqZWN0ID0gcGFyc2VPYmplY3RMaXRlcmFsRXhwcmVzc2lvbihleHByZXNzaW9uLCBzb3VyY2UpO1xuICAgIHJldHVybiBwYXJzZWRPYmplY3QgPyB7IGtpbmQ6ICdvYmplY3QnLCB2YWx1ZTogcGFyc2VkT2JqZWN0IH0gOiBsaXRlcmFsKGV4cHJlc3Npb24uZ2V0VGV4dChzb3VyY2UpKTtcbiAgfVxuICBpZiAodHMuaXNBcnJheUxpdGVyYWxFeHByZXNzaW9uKGV4cHJlc3Npb24pKSB7XG4gICAgY29uc3QgZWxlbWVudHMgPSBleHByZXNzaW9uLmVsZW1lbnRzLm1hcCgoZWxlbWVudCkgPT4gcGFyc2VFeHByZXNzaW9uKGVsZW1lbnQsIHNvdXJjZSkpO1xuICAgIGlmIChlbGVtZW50cy5zb21lKChlbGVtZW50KTogZWxlbWVudCBpcyB1bmRlZmluZWQgPT4gZWxlbWVudCA9PT0gdW5kZWZpbmVkKSkge1xuICAgICAgcmV0dXJuIGxpdGVyYWwoZXhwcmVzc2lvbi5nZXRUZXh0KHNvdXJjZSkpO1xuICAgIH1cbiAgICByZXR1cm4gYXNBcnJheShlbGVtZW50cyBhcyBQYXJzZWRWYWx1ZVtdKTtcbiAgfVxuICByZXR1cm4gbGl0ZXJhbChleHByZXNzaW9uLmdldFRleHQoc291cmNlKSk7XG59XG5cbmZ1bmN0aW9uIHBhcnNlT2JqZWN0TGl0ZXJhbEV4cHJlc3Npb24oXG4gIG9iamVjdExpdGVyYWw6IHRzLk9iamVjdExpdGVyYWxFeHByZXNzaW9uLFxuICBzb3VyY2U6IHRzLlNvdXJjZUZpbGVcbik6IFBhcnNlZE9iamVjdCB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IHBhcnNlZDogUGFyc2VkT2JqZWN0ID0geyBleHRyYU1lbWJlcnM6IFtdLCBtZW1iZXJPcmRlcjogW10sIHByb3BlcnRpZXM6IHt9IH07XG4gIGZvciAoY29uc3QgcHJvcGVydHkgb2Ygb2JqZWN0TGl0ZXJhbC5wcm9wZXJ0aWVzKSB7XG4gICAgaWYgKHRzLmlzU2hvcnRoYW5kUHJvcGVydHlBc3NpZ25tZW50KHByb3BlcnR5KSkge1xuICAgICAgY29uc3Qga2V5ID0gcHJvcGVydHkubmFtZS5nZXRUZXh0KHNvdXJjZSk7XG4gICAgICBwYXJzZWQucHJvcGVydGllc1trZXldID0gbGl0ZXJhbChrZXkpO1xuICAgICAgcGFyc2VkLm1lbWJlck9yZGVyLnB1c2goeyBraW5kOiAncHJvcGVydHknLCBrZXkgfSk7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgaWYgKCF0cy5pc1Byb3BlcnR5QXNzaWdubWVudChwcm9wZXJ0eSkgfHwgKCF0cy5pc0lkZW50aWZpZXIocHJvcGVydHkubmFtZSkgJiYgIXRzLmlzU3RyaW5nTGl0ZXJhbChwcm9wZXJ0eS5uYW1lKSkpIHtcbiAgICAgIGNvbnN0IGluZGV4ID0gcGFyc2VkLmV4dHJhTWVtYmVycy5wdXNoKHByb3BlcnR5LmdldFRleHQoc291cmNlKSkgLSAxO1xuICAgICAgcGFyc2VkLm1lbWJlck9yZGVyLnB1c2goeyBraW5kOiAnZXh0cmEnLCBpbmRleCB9KTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBjb25zdCB2YWx1ZSA9IHBhcnNlRXhwcmVzc2lvbihwcm9wZXJ0eS5pbml0aWFsaXplciwgc291cmNlKTtcbiAgICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCkgcmV0dXJuO1xuICAgIGNvbnN0IGtleSA9IHByb3BlcnR5Lm5hbWUuZ2V0VGV4dChzb3VyY2UpO1xuICAgIHBhcnNlZC5wcm9wZXJ0aWVzW2tleV0gPSB2YWx1ZTtcbiAgICBwYXJzZWQubWVtYmVyT3JkZXIucHVzaCh7IGtpbmQ6ICdwcm9wZXJ0eScsIGtleSB9KTtcbiAgfVxuICByZXR1cm4gcGFyc2VkO1xufVxuXG5mdW5jdGlvbiBzdHJpbmdpZnlWYWx1ZSh2YWx1ZTogUGFyc2VkVmFsdWUsIGxldmVsOiBudW1iZXIpOiBzdHJpbmcge1xuICBjb25zdCBjbG9zaW5nSW5kZW50ID0gJyAgJy5yZXBlYXQobGV2ZWwpO1xuICBpZiAodmFsdWUua2luZCA9PT0gJ2FycmF5Jykge1xuICAgIGlmICh2YWx1ZS52YWx1ZS5sZW5ndGggPT09IDApIHJldHVybiAnW10nO1xuICAgIGNvbnN0IGluZGVudCA9ICcgICcucmVwZWF0KGxldmVsICsgMSk7XG4gICAgY29uc3QgbGluZXMgPSB2YWx1ZS52YWx1ZS5tYXAoKGl0ZW0pID0+IHtcbiAgICAgIGNvbnN0IHN0cmluZ2lmaWVkID0gc3RyaW5naWZ5VmFsdWUoaXRlbSwgbGV2ZWwgKyAxKS5zcGxpdCgnXFxuJyk7XG4gICAgICBzdHJpbmdpZmllZFtzdHJpbmdpZmllZC5sZW5ndGggLSAxXSA9IGAke3N0cmluZ2lmaWVkLmF0KC0xKX0sYDtcbiAgICAgIGlmIChpdGVtLmtpbmQgPT09ICdsaXRlcmFsJykge1xuICAgICAgICBmb3IgKGxldCBpbmRleCA9IDE7IGluZGV4IDwgc3RyaW5naWZpZWQubGVuZ3RoOyBpbmRleCArPSAxKSB7XG4gICAgICAgICAgc3RyaW5naWZpZWRbaW5kZXhdID0gYCR7aW5kZW50fSR7c3RyaW5naWZpZWRbaW5kZXhdfWA7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHN0cmluZ2lmaWVkWzBdID0gYCR7aW5kZW50fSR7c3RyaW5naWZpZWRbMF19YDtcbiAgICAgIHJldHVybiBzdHJpbmdpZmllZC5qb2luKCdcXG4nKTtcbiAgICB9KTtcbiAgICByZXR1cm4gYFtcXG4ke2xpbmVzLmpvaW4oJ1xcbicpfVxcbiR7Y2xvc2luZ0luZGVudH1dYDtcbiAgfVxuICBpZiAodmFsdWUua2luZCA9PT0gJ2xpdGVyYWwnKSByZXR1cm4gdmFsdWUudmFsdWU7XG5cbiAgY29uc3QgaW5kZW50ID0gJyAgJy5yZXBlYXQobGV2ZWwgKyAxKTtcbiAgY29uc3QgZW1pdHRlZFByb3BlcnRpZXMgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgY29uc3QgbGFzdFByb3BlcnR5SW5kZXhCeUtleSA9IGdldExhc3RQcm9wZXJ0eUluZGV4QnlLZXkodmFsdWUudmFsdWUubWVtYmVyT3JkZXIpO1xuICBjb25zdCBsaW5lcyA9IHZhbHVlLnZhbHVlLm1lbWJlck9yZGVyLmZsYXRNYXAoKG1lbWJlciwgaW5kZXgpID0+IHtcbiAgICBpZiAobWVtYmVyLmtpbmQgPT09ICdleHRyYScpIHtcbiAgICAgIHJldHVybiBbc3RyaW5naWZ5T2JqZWN0TWVtYmVyKHZhbHVlLnZhbHVlLmV4dHJhTWVtYmVyc1ttZW1iZXIuaW5kZXhdID8/ICcnLCBpbmRlbnQpXTtcbiAgICB9XG5cbiAgICBpZiAobGFzdFByb3BlcnR5SW5kZXhCeUtleS5nZXQobWVtYmVyLmtleSkgIT09IGluZGV4KSByZXR1cm4gW107XG4gICAgY29uc3QgaXRlbSA9IHZhbHVlLnZhbHVlLnByb3BlcnRpZXNbbWVtYmVyLmtleV07XG4gICAgaWYgKCFpdGVtIHx8IGVtaXR0ZWRQcm9wZXJ0aWVzLmhhcyhtZW1iZXIua2V5KSkgcmV0dXJuIFtdO1xuICAgIGVtaXR0ZWRQcm9wZXJ0aWVzLmFkZChtZW1iZXIua2V5KTtcbiAgICByZXR1cm4gW3N0cmluZ2lmeU9iamVjdFByb3BlcnR5KG1lbWJlci5rZXksIGl0ZW0sIGxldmVsLCBpbmRlbnQpXTtcbiAgfSk7XG4gIGxpbmVzLnB1c2goXG4gICAgLi4uT2JqZWN0LmVudHJpZXModmFsdWUudmFsdWUucHJvcGVydGllcylcbiAgICAgIC5maWx0ZXIoKFtrZXldKSA9PiAhZW1pdHRlZFByb3BlcnRpZXMuaGFzKGtleSkpXG4gICAgICAubWFwKChba2V5LCBpdGVtXSkgPT4gc3RyaW5naWZ5T2JqZWN0UHJvcGVydHkoa2V5LCBpdGVtLCBsZXZlbCwgaW5kZW50KSlcbiAgKTtcbiAgaWYgKGxpbmVzLmxlbmd0aCA9PT0gMCkgcmV0dXJuIGB7XFxuJHtjbG9zaW5nSW5kZW50fX1gO1xuICByZXR1cm4gYHtcXG4ke2xpbmVzLmpvaW4oJ1xcbicpfVxcbiR7Y2xvc2luZ0luZGVudH19YDtcbn1cblxuZnVuY3Rpb24gZ2V0TGFzdFByb3BlcnR5SW5kZXhCeUtleShtZW1iZXJPcmRlcjogT2JqZWN0TWVtYmVyW10pOiBNYXA8c3RyaW5nLCBudW1iZXI+IHtcbiAgY29uc3QgbGFzdFByb3BlcnR5SW5kZXhCeUtleSA9IG5ldyBNYXA8c3RyaW5nLCBudW1iZXI+KCk7XG4gIGZvciAoY29uc3QgW2luZGV4LCBtZW1iZXJdIG9mIG1lbWJlck9yZGVyLmVudHJpZXMoKSkge1xuICAgIGlmIChtZW1iZXIua2luZCA9PT0gJ3Byb3BlcnR5Jykge1xuICAgICAgbGFzdFByb3BlcnR5SW5kZXhCeUtleS5zZXQobWVtYmVyLmtleSwgaW5kZXgpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gbGFzdFByb3BlcnR5SW5kZXhCeUtleTtcbn1cblxuZnVuY3Rpb24gc3RyaW5naWZ5T2JqZWN0UHJvcGVydHkoa2V5OiBzdHJpbmcsIGl0ZW06IFBhcnNlZFZhbHVlLCBsZXZlbDogbnVtYmVyLCBpbmRlbnQ6IHN0cmluZyk6IHN0cmluZyB7XG4gIGNvbnN0IHN0cmluZ2lmaWVkID0gc3RyaW5naWZ5VmFsdWUoaXRlbSwgbGV2ZWwgKyAxKS5zcGxpdCgnXFxuJyk7XG4gIHN0cmluZ2lmaWVkW3N0cmluZ2lmaWVkLmxlbmd0aCAtIDFdID0gYCR7c3RyaW5naWZpZWQuYXQoLTEpfSxgO1xuICBpZiAoaXRlbS5raW5kID09PSAnbGl0ZXJhbCcpIHtcbiAgICBmb3IgKGxldCBpbmRleCA9IDE7IGluZGV4IDwgc3RyaW5naWZpZWQubGVuZ3RoOyBpbmRleCArPSAxKSB7XG4gICAgICBzdHJpbmdpZmllZFtpbmRleF0gPSBgJHtpbmRlbnR9JHtzdHJpbmdpZmllZFtpbmRleF19YDtcbiAgICB9XG4gIH1cbiAgc3RyaW5naWZpZWRbMF0gPSBgJHtpbmRlbnR9JHtrZXl9OiAke3N0cmluZ2lmaWVkWzBdfWA7XG4gIHJldHVybiBzdHJpbmdpZmllZC5qb2luKCdcXG4nKTtcbn1cblxuZnVuY3Rpb24gc3RyaW5naWZ5T2JqZWN0TWVtYmVyKG1lbWJlcjogc3RyaW5nLCBpbmRlbnQ6IHN0cmluZyk6IHN0cmluZyB7XG4gIGNvbnN0IHN0cmluZ2lmaWVkID0gbWVtYmVyLnNwbGl0KCdcXG4nKTtcbiAgc3RyaW5naWZpZWRbc3RyaW5naWZpZWQubGVuZ3RoIC0gMV0gPSBgJHtzdHJpbmdpZmllZC5hdCgtMSl9LGA7XG4gIGZvciAoY29uc3QgW2luZGV4LCBsaW5lXSBvZiBzdHJpbmdpZmllZC5lbnRyaWVzKCkpIHtcbiAgICBzdHJpbmdpZmllZFtpbmRleF0gPSBgJHtpbmRlbnR9JHtsaW5lfWA7XG4gIH1cbiAgcmV0dXJuIHN0cmluZ2lmaWVkLmpvaW4oJ1xcbicpO1xufVxuIiwiZXhwb3J0IGNvbnN0IGdsb2JJZ25vcmUgPSBbXG4gICcqKi9ub2RlX21vZHVsZXMvKionLFxuICAnKiovLnZlbnYvKionLFxuICAnKiovdGVzdC1maXh0dXJlcy8qKicsXG4gICcqKi90ZXN0L2ZpeHR1cmVzLyoqJyxcbiAgJyoqL2Rpc3QvKionLFxuICAnKiovYnVpbGQvKionLFxuICAnKiovdGFyZ2V0LyoqJyxcbiAgJyoqL3RlbXAvKionLFxuICAnKiovdG1wLyoqJyxcbl07XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcy9wcm9taXNlcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgZmcgZnJvbSAnZmFzdC1nbG9iJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZ2xvYklnbm9yZSB9IGZyb20gJy4uL3V0aWxzL2dsb2JVdGlsLmpzJztcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGZpeFByaXNtYUVudkZpbGVzKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2ZpeFByaXNtYUVudkZpbGVzJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IGVudkZpbGVzID0gYXdhaXQgZmcuZ2xvYihbJyouZW52JywgJyouZW52LionXSwgeyBkb3Q6IHRydWUsIGN3ZDogY29uZmlnLmRpclBhdGgsIGlnbm9yZTogZ2xvYklnbm9yZSB9KTtcbiAgICBmb3IgKGNvbnN0IGVudkZpbGUgb2YgZW52RmlsZXMpIHtcbiAgICAgIGNvbnN0IGVudkZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCBlbnZGaWxlKTtcbiAgICAgIGNvbnN0IGNvbnRlbnQgPSBhd2FpdCBmcy5yZWFkRmlsZShlbnZGaWxlUGF0aCwgJ3V0ZjgnKTtcbiAgICAgIGNvbnN0IG5ld0NvbnRlbnQgPSBjb250ZW50LnJlcGxhY2VBbGwoXG4gICAgICAgIC9EQVRBQkFTRV9VUkxcXHMqPVxccypcIj8oW15cIiNcXG5dKz9cXC5zcWxpdGUzW15cIiNcXG5dKilcIj8vZyxcbiAgICAgICAgKG1hdGNoLCB1cmw6IHN0cmluZykgPT4ge1xuICAgICAgICAgIGlmICh1cmwuaW5jbHVkZXMoJ2Nvbm5lY3Rpb25fbGltaXQ9MScpKSByZXR1cm4gbWF0Y2g7XG4gICAgICAgICAgY29uc3Qgc2VwYXJhdG9yID0gdXJsLmluY2x1ZGVzKCc/JykgPyAnJicgOiAnPyc7XG4gICAgICAgICAgcmV0dXJuIGBEQVRBQkFTRV9VUkw9XCIke3VybH0ke3NlcGFyYXRvcn1jb25uZWN0aW9uX2xpbWl0PTFcImA7XG4gICAgICAgIH1cbiAgICAgICk7XG4gICAgICBhd2FpdCBmcy53cml0ZUZpbGUoZW52RmlsZVBhdGgsIG5ld0NvbnRlbnQpO1xuICAgIH1cbiAgfSk7XG59XG4iLCJjb25zdCBoYXMgPSAob2JqZWN0LCBrZXkpID0+IE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmplY3QsIGtleSlcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gc29ydE9iamVjdEJ5S2V5TmFtZUxpc3Qob2JqZWN0LCBzb3J0V2l0aCkge1xuICBsZXQga2V5cywgc29ydEZuLCBrZXlcblxuICBpZiAodHlwZW9mIHNvcnRXaXRoID09PSAnZnVuY3Rpb24nKSB7XG4gICAgc29ydEZuID0gc29ydFdpdGhcbiAgfSBlbHNlIHtcbiAgICBrZXlzID0gc29ydFdpdGhcbiAgfVxuXG4gIGNvbnN0IHRvdGFsID0ge31cbiAgY29uc3Qgb2JqZWN0S2V5cyA9IFsuLi4oa2V5cyA/PyBbXSksIC4uLk9iamVjdC5rZXlzKG9iamVjdCkuc29ydChzb3J0Rm4pXVxuXG4gIGZvciAoa2V5IG9mIG9iamVjdEtleXMpIHtcbiAgICBpZiAoaGFzKG9iamVjdCwga2V5KSkge1xuICAgICAgdG90YWxba2V5XSA9IG9iamVjdFtrZXldXG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHRvdGFsXG59XG4iLCIvLyBEZXRlY3QgZWl0aGVyIHNwYWNlcyBvciB0YWJzIGJ1dCBub3QgYm90aCB0byBwcm9wZXJseSBoYW5kbGUgdGFicyBmb3IgaW5kZW50YXRpb24gYW5kIHNwYWNlcyBmb3IgYWxpZ25tZW50XG5jb25zdCBJTkRFTlRfUkVHRVggPSAvXig/OiggKSt8XFx0KykvO1xuXG5jb25zdCBJTkRFTlRfVFlQRV9TUEFDRSA9ICdzcGFjZSc7XG5jb25zdCBJTkRFTlRfVFlQRV9UQUIgPSAndGFiJztcblxuLy8gSGVscGVyIGZ1bmN0aW9uIHRvIGNoZWNrIGlmIHdlIHNob3VsZCBpZ25vcmUgc2luZ2xlIHNwYWNlIHBhdHRlcm5zXG5mdW5jdGlvbiBzaG91bGRJZ25vcmVTaW5nbGVTcGFjZShpZ25vcmVTaW5nbGVTcGFjZXMsIGluZGVudFR5cGUsIHZhbHVlKSB7XG5cdHJldHVybiBpZ25vcmVTaW5nbGVTcGFjZXMgJiYgaW5kZW50VHlwZSA9PT0gSU5ERU5UX1RZUEVfU1BBQ0UgJiYgdmFsdWUgPT09IDE7XG59XG5cbi8qKlxuTWFrZSBhIE1hcCB0aGF0IGNvdW50cyBob3cgbWFueSBpbmRlbnRzL3VuaW5kZW50cyBoYXZlIG9jY3VycmVkIGZvciBhIGdpdmVuIHNpemUgYW5kIGhvdyBtYW55IGxpbmVzIGZvbGxvdyBhIGdpdmVuIGluZGVudGF0aW9uLlxuXG5UaGUga2V5IGlzIGEgY29uY2F0ZW5hdGlvbiBvZiB0aGUgaW5kZW50YXRpb24gdHlwZSAocyA9IHNwYWNlIGFuZCB0ID0gdGFiKSBhbmQgdGhlIHNpemUgb2YgdGhlIGluZGVudHMvdW5pbmRlbnRzLlxuXG5gYGBcbmluZGVudHMgPSB7XG5cdHQzOiBbMSwgMF0sXG5cdHQ0OiBbMSwgNV0sXG5cdHM1OiBbMSwgMF0sXG5cdHMxMjogWzEsIDBdLFxufVxuYGBgXG4qL1xuZnVuY3Rpb24gbWFrZUluZGVudHNNYXAoc3RyaW5nLCBpZ25vcmVTaW5nbGVTcGFjZXMpIHtcblx0Y29uc3QgaW5kZW50cyA9IG5ldyBNYXAoKTtcblxuXHQvLyBSZW1lbWJlciB0aGUgc2l6ZSBvZiBwcmV2aW91cyBsaW5lJ3MgaW5kZW50YXRpb25cblx0bGV0IHByZXZpb3VzU2l6ZSA9IDA7XG5cdGxldCBwcmV2aW91c0luZGVudFR5cGU7XG5cblx0Ly8gSW5kZW50cyBrZXkgKGlkZW50IHR5cGUgKyBzaXplIG9mIHRoZSBpbmRlbnRzL3VuaW5kZW50cylcblx0bGV0IGtleTtcblxuXHRmb3IgKGNvbnN0IGxpbmUgb2Ygc3RyaW5nLnNwbGl0KC9cXG4vZykpIHtcblx0XHRpZiAoIWxpbmUpIHtcblx0XHRcdC8vIElnbm9yZSBlbXB0eSBsaW5lc1xuXHRcdFx0Y29udGludWU7XG5cdFx0fVxuXG5cdFx0Y29uc3QgbWF0Y2hlcyA9IGxpbmUubWF0Y2goSU5ERU5UX1JFR0VYKTtcblxuXHRcdGlmIChtYXRjaGVzID09PSBudWxsKSB7XG5cdFx0XHRwcmV2aW91c1NpemUgPSAwO1xuXHRcdFx0cHJldmlvdXNJbmRlbnRUeXBlID0gJyc7XG5cdFx0fSBlbHNlIHtcblx0XHRcdGNvbnN0IGluZGVudCA9IG1hdGNoZXNbMF0ubGVuZ3RoO1xuXHRcdFx0Y29uc3QgaW5kZW50VHlwZSA9IG1hdGNoZXNbMV0gPyBJTkRFTlRfVFlQRV9TUEFDRSA6IElOREVOVF9UWVBFX1RBQjtcblxuXHRcdFx0Ly8gSWdub3JlIHNpbmdsZSBzcGFjZSB1bmxlc3MgaXQncyB0aGUgb25seSBpbmRlbnQgZGV0ZWN0ZWQgdG8gcHJldmVudCBjb21tb24gZmFsc2UgcG9zaXRpdmVzXG5cdFx0XHRpZiAoc2hvdWxkSWdub3JlU2luZ2xlU3BhY2UoaWdub3JlU2luZ2xlU3BhY2VzLCBpbmRlbnRUeXBlLCBpbmRlbnQpKSB7XG5cdFx0XHRcdGNvbnRpbnVlO1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAoaW5kZW50VHlwZSAhPT0gcHJldmlvdXNJbmRlbnRUeXBlKSB7XG5cdFx0XHRcdHByZXZpb3VzU2l6ZSA9IDA7XG5cdFx0XHR9XG5cblx0XHRcdHByZXZpb3VzSW5kZW50VHlwZSA9IGluZGVudFR5cGU7XG5cblx0XHRcdGxldCB1c2UgPSAxO1xuXHRcdFx0bGV0IHdlaWdodCA9IDA7XG5cblx0XHRcdGNvbnN0IGluZGVudERpZmZlcmVuY2UgPSBpbmRlbnQgLSBwcmV2aW91c1NpemU7XG5cdFx0XHRwcmV2aW91c1NpemUgPSBpbmRlbnQ7XG5cblx0XHRcdC8vIFByZXZpb3VzIGxpbmUgaGF2ZSBzYW1lIGluZGVudD9cblx0XHRcdGlmIChpbmRlbnREaWZmZXJlbmNlID09PSAwKSB7XG5cdFx0XHRcdC8vIE5vdCBhIG5ldyBcInVzZVwiIG9mIHRoZSBjdXJyZW50IGluZGVudDpcblx0XHRcdFx0dXNlID0gMDtcblx0XHRcdFx0Ly8gQnV0IGRvIGFkZCBhIGJpdCB0byBpdCBmb3IgYnJlYWtpbmcgdGllczpcblx0XHRcdFx0d2VpZ2h0ID0gMTtcblx0XHRcdFx0Ly8gV2UgdXNlIHRoZSBrZXkgZnJvbSBwcmV2aW91cyBsb29wXG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRjb25zdCBhYnNvbHV0ZUluZGVudERpZmZlcmVuY2UgPSBNYXRoLmFicyhpbmRlbnREaWZmZXJlbmNlKTtcblxuXHRcdFx0XHQvLyBJZ25vcmUgc2luZ2xlIHNwYWNlIGNoYW5nZXMgd2hlbiBpZ25vcmVTaW5nbGVTcGFjZXMgaXMgdHJ1ZVxuXHRcdFx0XHQvLyBUaGlzIHByZXZlbnRzIGNvbW1vbiBmYWxzZSBwb3NpdGl2ZXMgZnJvbSB0aGluZ3MgbGlrZSBhbGlnbmVkIGNvbW1lbnRzXG5cdFx0XHRcdGlmIChzaG91bGRJZ25vcmVTaW5nbGVTcGFjZShpZ25vcmVTaW5nbGVTcGFjZXMsIGluZGVudFR5cGUsIGFic29sdXRlSW5kZW50RGlmZmVyZW5jZSkpIHtcblx0XHRcdFx0XHRjb250aW51ZTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdGtleSA9IGVuY29kZUluZGVudHNLZXkoaW5kZW50VHlwZSwgYWJzb2x1dGVJbmRlbnREaWZmZXJlbmNlKTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gVXBkYXRlIHRoZSBzdGF0c1xuXHRcdFx0Y29uc3QgZW50cnkgPSBpbmRlbnRzLmdldChrZXkpO1xuXHRcdFx0aW5kZW50cy5zZXQoa2V5LCBlbnRyeSA9PT0gdW5kZWZpbmVkID8gWzEsIDBdIDogW2VudHJ5WzBdICsgdXNlLCBlbnRyeVsxXSArIHdlaWdodF0pO1xuXHRcdH1cblx0fVxuXG5cdHJldHVybiBpbmRlbnRzO1xufVxuXG4vLyBFbmNvZGUgdGhlIGluZGVudCB0eXBlIGFuZCBhbW91bnQgYXMgYSBzdHJpbmcgKGUuZy4gJ3M0JykgZm9yIHVzZSBhcyBhIGNvbXBvdW5kIGtleSBpbiB0aGUgaW5kZW50cyBNYXAuXG5mdW5jdGlvbiBlbmNvZGVJbmRlbnRzS2V5KGluZGVudFR5cGUsIGluZGVudEFtb3VudCkge1xuXHRjb25zdCB0eXBlQ2hhcmFjdGVyID0gaW5kZW50VHlwZSA9PT0gSU5ERU5UX1RZUEVfU1BBQ0UgPyAncycgOiAndCc7XG5cdHJldHVybiB0eXBlQ2hhcmFjdGVyICsgU3RyaW5nKGluZGVudEFtb3VudCk7XG59XG5cbi8vIEV4dHJhY3QgdGhlIGluZGVudCB0eXBlIGFuZCBhbW91bnQgZnJvbSBhIGtleSBvZiB0aGUgaW5kZW50cyBNYXAuXG5mdW5jdGlvbiBkZWNvZGVJbmRlbnRzS2V5KGluZGVudHNLZXkpIHtcblx0Y29uc3Qga2V5SGFzVHlwZVNwYWNlID0gaW5kZW50c0tleVswXSA9PT0gJ3MnO1xuXHRjb25zdCB0eXBlID0ga2V5SGFzVHlwZVNwYWNlID8gSU5ERU5UX1RZUEVfU1BBQ0UgOiBJTkRFTlRfVFlQRV9UQUI7XG5cblx0Y29uc3QgYW1vdW50ID0gTnVtYmVyKGluZGVudHNLZXkuc2xpY2UoMSkpO1xuXG5cdHJldHVybiB7dHlwZSwgYW1vdW50fTtcbn1cblxuLy8gUmV0dXJuIHRoZSBrZXkgKGUuZy4gJ3M0JykgZnJvbSB0aGUgaW5kZW50cyBNYXAgdGhhdCByZXByZXNlbnRzIHRoZSBtb3N0IGNvbW1vbiBpbmRlbnQsXG4vLyBvciByZXR1cm4gdW5kZWZpbmVkIGlmIHRoZXJlIGFyZSBubyBpbmRlbnRzLlxuZnVuY3Rpb24gZ2V0TW9zdFVzZWRLZXkoaW5kZW50cykge1xuXHRsZXQgcmVzdWx0O1xuXHRsZXQgbWF4VXNlZCA9IDA7XG5cdGxldCBtYXhXZWlnaHQgPSAwO1xuXG5cdGZvciAoY29uc3QgW2tleSwgW3VzZWRDb3VudCwgd2VpZ2h0XV0gb2YgaW5kZW50cykge1xuXHRcdGlmICh1c2VkQ291bnQgPiBtYXhVc2VkIHx8ICh1c2VkQ291bnQgPT09IG1heFVzZWQgJiYgd2VpZ2h0ID4gbWF4V2VpZ2h0KSkge1xuXHRcdFx0bWF4VXNlZCA9IHVzZWRDb3VudDtcblx0XHRcdG1heFdlaWdodCA9IHdlaWdodDtcblx0XHRcdHJlc3VsdCA9IGtleTtcblx0XHR9XG5cdH1cblxuXHRyZXR1cm4gcmVzdWx0O1xufVxuXG5mdW5jdGlvbiBtYWtlSW5kZW50U3RyaW5nKHR5cGUsIGFtb3VudCkge1xuXHRjb25zdCBpbmRlbnRDaGFyYWN0ZXIgPSB0eXBlID09PSBJTkRFTlRfVFlQRV9TUEFDRSA/ICcgJyA6ICdcXHQnO1xuXHRyZXR1cm4gaW5kZW50Q2hhcmFjdGVyLnJlcGVhdChhbW91bnQpO1xufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBkZXRlY3RJbmRlbnQoc3RyaW5nKSB7XG5cdGlmICh0eXBlb2Ygc3RyaW5nICE9PSAnc3RyaW5nJykge1xuXHRcdHRocm93IG5ldyBUeXBlRXJyb3IoJ0V4cGVjdGVkIGEgc3RyaW5nJyk7XG5cdH1cblxuXHQvLyBJZGVudGlmeSBpbmRlbnRzIHdoaWxlIHNraXBwaW5nIHNpbmdsZSBzcGFjZSBpbmRlbnRzIHRvIGF2b2lkIGNvbW1vbiBlZGdlIGNhc2VzIChlLmcuIGNvZGUgY29tbWVudHMpXG5cdC8vIElmIG5vIGluZGVudHMgYXJlIGlkZW50aWZpZWQsIHJ1biBhZ2FpbiBhbmQgaW5jbHVkZSBhbGwgaW5kZW50cyBmb3IgY29tcHJlaGVuc2l2ZSBkZXRlY3Rpb25cblx0bGV0IGluZGVudHMgPSBtYWtlSW5kZW50c01hcChzdHJpbmcsIHRydWUpO1xuXHRpZiAoaW5kZW50cy5zaXplID09PSAwKSB7XG5cdFx0aW5kZW50cyA9IG1ha2VJbmRlbnRzTWFwKHN0cmluZywgZmFsc2UpO1xuXHR9XG5cblx0Y29uc3Qga2V5T2ZNb3N0VXNlZEluZGVudCA9IGdldE1vc3RVc2VkS2V5KGluZGVudHMpO1xuXG5cdGxldCB0eXBlO1xuXHRsZXQgYW1vdW50ID0gMDtcblx0bGV0IGluZGVudCA9ICcnO1xuXG5cdGlmIChrZXlPZk1vc3RVc2VkSW5kZW50ICE9PSB1bmRlZmluZWQpIHtcblx0XHQoe3R5cGUsIGFtb3VudH0gPSBkZWNvZGVJbmRlbnRzS2V5KGtleU9mTW9zdFVzZWRJbmRlbnQpKTtcblx0XHRpbmRlbnQgPSBtYWtlSW5kZW50U3RyaW5nKHR5cGUsIGFtb3VudCk7XG5cdH1cblxuXHRyZXR1cm4ge1xuXHRcdGFtb3VudCxcblx0XHR0eXBlLFxuXHRcdGluZGVudCxcblx0fTtcbn1cbiIsImV4cG9ydCBmdW5jdGlvbiBkZXRlY3ROZXdsaW5lKHN0cmluZykge1xuXHRpZiAodHlwZW9mIHN0cmluZyAhPT0gJ3N0cmluZycpIHtcblx0XHR0aHJvdyBuZXcgVHlwZUVycm9yKCdFeHBlY3RlZCBhIHN0cmluZycpO1xuXHR9XG5cblx0Y29uc3QgbmV3bGluZXMgPSBzdHJpbmcubWF0Y2goLyg/Olxccj9cXG4pL2cpIHx8IFtdO1xuXG5cdGlmIChuZXdsaW5lcy5sZW5ndGggPT09IDApIHtcblx0XHRyZXR1cm47XG5cdH1cblxuXHRjb25zdCBjcmxmID0gbmV3bGluZXMuZmlsdGVyKG5ld2xpbmUgPT4gbmV3bGluZSA9PT0gJ1xcclxcbicpLmxlbmd0aDtcblx0Y29uc3QgbGYgPSBuZXdsaW5lcy5sZW5ndGggLSBjcmxmO1xuXG5cdHJldHVybiBjcmxmID4gbGYgPyAnXFxyXFxuJyA6ICdcXG4nO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZGV0ZWN0TmV3bGluZUdyYWNlZnVsKHN0cmluZykge1xuXHRyZXR1cm4gKHR5cGVvZiBzdHJpbmcgPT09ICdzdHJpbmcnICYmIGRldGVjdE5ld2xpbmUoc3RyaW5nKSkgfHwgJ1xcbic7XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcydcbmltcG9ydCBzb3J0T2JqZWN0S2V5cyBmcm9tICdzb3J0LW9iamVjdC1rZXlzJ1xuaW1wb3J0IGRldGVjdEluZGVudCBmcm9tICdkZXRlY3QtaW5kZW50J1xuaW1wb3J0IHsgZGV0ZWN0TmV3bGluZUdyYWNlZnVsIGFzIGRldGVjdE5ld2xpbmUgfSBmcm9tICdkZXRlY3QtbmV3bGluZSdcbmltcG9ydCBnaXRIb29rcyBmcm9tICdnaXQtaG9va3MtbGlzdCdcbmltcG9ydCBpc1BsYWluT2JqZWN0IGZyb20gJ2lzLXBsYWluLW9iaidcbmltcG9ydCBzZW12ZXJDb21wYXJlIGZyb20gJ3NlbXZlci9mdW5jdGlvbnMvY29tcGFyZS5qcydcbmltcG9ydCBzZW12ZXJNaW5WZXJzaW9uIGZyb20gJ3NlbXZlci9yYW5nZXMvbWluLXZlcnNpb24uanMnXG5cbmNvbnN0IHBpcGUgPVxuICAoZm5zKSA9PlxuICAoeCwgLi4uYXJncykgPT5cbiAgICBmbnMucmVkdWNlKChyZXN1bHQsIGZuKSA9PiBmbihyZXN1bHQsIC4uLmFyZ3MpLCB4KVxuY29uc3Qgb25BcnJheSA9IChmbikgPT4gKHgpID0+IChBcnJheS5pc0FycmF5KHgpID8gZm4oeCkgOiB4KVxuY29uc3Qgb25TdHJpbmdBcnJheSA9IChmbikgPT4gKHgpID0+XG4gIEFycmF5LmlzQXJyYXkoeCkgJiYgeC5ldmVyeSgoaXRlbSkgPT4gdHlwZW9mIGl0ZW0gPT09ICdzdHJpbmcnKSA/IGZuKHgpIDogeFxuY29uc3QgdW5pcSA9IG9uU3RyaW5nQXJyYXkoKHhzKSA9PiBbLi4ubmV3IFNldCh4cyldKVxuY29uc3Qgc29ydEFycmF5ID0gb25TdHJpbmdBcnJheSgoYXJyYXkpID0+IGFycmF5LnRvU29ydGVkKCkpXG5jb25zdCB1bmlxQW5kU29ydEFycmF5ID0gcGlwZShbdW5pcSwgc29ydEFycmF5XSlcbmNvbnN0IG9uT2JqZWN0ID1cbiAgKGZuKSA9PlxuICAoeCwgLi4uYXJncykgPT5cbiAgICBpc1BsYWluT2JqZWN0KHgpID8gZm4oeCwgLi4uYXJncykgOiB4XG5jb25zdCBzb3J0T2JqZWN0QnkgPSAoY29tcGFyYXRvciwgZGVlcCkgPT4ge1xuICBjb25zdCBvdmVyID0gb25PYmplY3QoKG9iamVjdCkgPT4ge1xuICAgIGlmIChkZWVwKSB7XG4gICAgICBvYmplY3QgPSBPYmplY3QuZnJvbUVudHJpZXMoXG4gICAgICAgIE9iamVjdC5lbnRyaWVzKG9iamVjdCkubWFwKChba2V5LCB2YWx1ZV0pID0+IFtrZXksIG92ZXIodmFsdWUpXSksXG4gICAgICApXG4gICAgfVxuXG4gICAgcmV0dXJuIHNvcnRPYmplY3RLZXlzKG9iamVjdCwgY29tcGFyYXRvcilcbiAgfSlcblxuICByZXR1cm4gb3ZlclxufVxuY29uc3Qgb2JqZWN0R3JvdXBCeSA9XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuL25vLXVuc3VwcG9ydGVkLWZlYXR1cmVzL2VzLWJ1aWx0aW5zLCBuL25vLXVuc3VwcG9ydGVkLWZlYXR1cmVzL2VzLXN5bnRheCAtLSBTYWZlXG4gIE9iamVjdC5ncm91cEJ5IHx8XG4gIC8vIFJlbW92ZSB0aGlzIHdoZW4gd2UgZHJvcCBzdXBwb3J0IGZvciBOb2RlLmpzIDIwXG4gICgoYXJyYXksIGNhbGxiYWNrKSA9PiB7XG4gICAgY29uc3QgcmVzdWx0ID0gT2JqZWN0LmNyZWF0ZShudWxsKVxuICAgIGZvciAoY29uc3QgdmFsdWUgb2YgYXJyYXkpIHtcbiAgICAgIGNvbnN0IGtleSA9IGNhbGxiYWNrKHZhbHVlKVxuICAgICAgaWYgKHJlc3VsdFtrZXldKSB7XG4gICAgICAgIHJlc3VsdFtrZXldLnB1c2godmFsdWUpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXN1bHRba2V5XSA9IFt2YWx1ZV1cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdFxuICB9KVxuY29uc3Qgc29ydE9iamVjdCA9IHNvcnRPYmplY3RCeSgpXG5jb25zdCBzb3J0VVJMT2JqZWN0ID0gc29ydE9iamVjdEJ5KFsndHlwZScsICd1cmwnXSlcbmNvbnN0IHNvcnRQZW9wbGVPYmplY3QgPSBzb3J0T2JqZWN0QnkoWyduYW1lJywgJ2VtYWlsJywgJ3VybCddKVxuY29uc3Qgc29ydERpcmVjdG9yaWVzID0gc29ydE9iamVjdEJ5KFtcbiAgJ2xpYicsXG4gICdiaW4nLFxuICAnbWFuJyxcbiAgJ2RvYycsXG4gICdleGFtcGxlJyxcbiAgJ3Rlc3QnLFxuXSlcbmNvbnN0IG92ZXJQcm9wZXJ0eSA9IChwcm9wZXJ0eSwgb3ZlcikgPT5cbiAgb25PYmplY3QoKG9iamVjdCwgLi4uYXJncykgPT5cbiAgICBPYmplY3QuaGFzT3duKG9iamVjdCwgcHJvcGVydHkpXG4gICAgICA/IHsgLi4ub2JqZWN0LCBbcHJvcGVydHldOiBvdmVyKG9iamVjdFtwcm9wZXJ0eV0sIC4uLmFyZ3MpIH1cbiAgICAgIDogb2JqZWN0LFxuICApXG5jb25zdCBzb3J0R2l0SG9va3MgPSBzb3J0T2JqZWN0QnkoZ2l0SG9va3MpXG5cbmNvbnN0IHBhcnNlTmFtZUFuZFZlcnNpb25SYW5nZSA9IChzcGVjaWZpZXIpID0+IHtcbiAgLy8gSWdub3JlIGFueXRoaW5nIGFmdGVyID4gJiByZWx5IG9uIGZhbGxiYWNrIGFscGhhbnVtZXJpYyBzb3J0aW5nIGZvciB0aGF0XG4gIGNvbnN0IFtuYW1lQW5kVmVyc2lvbl0gPSBzcGVjaWZpZXIuc3BsaXQoJz4nKVxuICBjb25zdCBhdE1hdGNoZXMgPSBbLi4ubmFtZUFuZFZlcnNpb24ubWF0Y2hBbGwoJ0AnKV1cbiAgaWYgKFxuICAgICFhdE1hdGNoZXMubGVuZ3RoIHx8XG4gICAgKGF0TWF0Y2hlcy5sZW5ndGggPT09IDEgJiYgYXRNYXRjaGVzWzBdLmluZGV4ID09PSAwKVxuICApIHtcbiAgICByZXR1cm4geyBuYW1lOiBzcGVjaWZpZXIgfVxuICB9XG4gIGNvbnN0IHNwbGl0SW5kZXggPSBhdE1hdGNoZXMucG9wKCkuaW5kZXhcbiAgcmV0dXJuIHtcbiAgICBuYW1lOiBuYW1lQW5kVmVyc2lvbi5zdWJzdHJpbmcoMCwgc3BsaXRJbmRleCksXG4gICAgcmFuZ2U6IG5hbWVBbmRWZXJzaW9uLnN1YnN0cmluZyhzcGxpdEluZGV4ICsgMSksXG4gIH1cbn1cblxuY29uc3Qgc29ydE9iamVjdEJ5U2VtdmVyID0gc29ydE9iamVjdEJ5KChhLCBiKSA9PiB7XG4gIGNvbnN0IHsgbmFtZTogYU5hbWUsIHJhbmdlOiBhUmFuZ2UgfSA9IHBhcnNlTmFtZUFuZFZlcnNpb25SYW5nZShhKVxuICBjb25zdCB7IG5hbWU6IGJOYW1lLCByYW5nZTogYlJhbmdlIH0gPSBwYXJzZU5hbWVBbmRWZXJzaW9uUmFuZ2UoYilcblxuICBpZiAoYU5hbWUgIT09IGJOYW1lKSB7XG4gICAgcmV0dXJuIGFOYW1lLmxvY2FsZUNvbXBhcmUoYk5hbWUsICdlbicpXG4gIH1cbiAgaWYgKCFhUmFuZ2UpIHtcbiAgICByZXR1cm4gLTFcbiAgfVxuICBpZiAoIWJSYW5nZSkge1xuICAgIHJldHVybiAxXG4gIH1cbiAgcmV0dXJuIHNlbXZlckNvbXBhcmUoc2VtdmVyTWluVmVyc2lvbihhUmFuZ2UpLCBzZW12ZXJNaW5WZXJzaW9uKGJSYW5nZSkpXG59KVxuXG5jb25zdCBnZXRQYWNrYWdlTmFtZSA9IChpZGVudCkgPT4ge1xuICBjb25zdCBpbmRleCA9IGlkZW50LmluZGV4T2YoJ0AnLCBpZGVudC5zdGFydHNXaXRoKCdAJykgPyAxIDogMClcbiAgLy8gVGhpcyBzaG91bGQgbm90IGhhcHBlbiwgdW5sZXNzIHVzZXIgbWFudWFsbHkgZWRpdCB0aGUgcGFja2FnZS5qc29uIGZpbGVcbiAgcmV0dXJuIGluZGV4ID09PSAtMSA/IGlkZW50IDogaWRlbnQuc2xpY2UoMCwgaW5kZXgpXG59XG5cbmNvbnN0IHNvcnRPYmplY3RCeUlkZW50ID0gKGEsIGIpID0+IHtcbiAgY29uc3QgcGFja2FnZU5hbWVBID0gZ2V0UGFja2FnZU5hbWUoYSlcbiAgY29uc3QgcGFja2FnZU5hbWVCID0gZ2V0UGFja2FnZU5hbWUoYilcblxuICBpZiAocGFja2FnZU5hbWVBIDwgcGFja2FnZU5hbWVCKSByZXR1cm4gLTFcbiAgaWYgKHBhY2thZ2VOYW1lQSA+IHBhY2thZ2VOYW1lQikgcmV0dXJuIDFcbiAgcmV0dXJuIDBcbn1cblxuLy8gQ2FjaGUgYnkgYHByb2Nlc3MuY3dkKClgIGluc3RlYWQgb2YgYSB2YXJpYWJsZSB0byBhbGxvdyB1c2VyIGNhbGwgYHByb2Nlc3MuY2hkaXIoKWBcbmNvbnN0IGNhY2hlID0gbmV3IE1hcCgpXG5jb25zdCBoYXNZYXJuT3JQbnBtRmlsZXMgPSAoKSA9PiB7XG4gIGNvbnN0IGN3ZCA9IHByb2Nlc3MuY3dkKClcbiAgaWYgKCFjYWNoZS5oYXMoY3dkKSkge1xuICAgIGNhY2hlLnNldChcbiAgICAgIGN3ZCxcbiAgICAgIGZzLmV4aXN0c1N5bmMoJ3lhcm4ubG9jaycpIHx8XG4gICAgICAgIGZzLmV4aXN0c1N5bmMoJy55YXJuLycpIHx8XG4gICAgICAgIGZzLmV4aXN0c1N5bmMoJy55YXJucmMueW1sJykgfHxcbiAgICAgICAgZnMuZXhpc3RzU3luYygncG5wbS1sb2NrLnlhbWwnKSB8fFxuICAgICAgICBmcy5leGlzdHNTeW5jKCdwbnBtLXdvcmtzcGFjZS55YW1sJyksXG4gICAgKVxuICB9XG4gIHJldHVybiBjYWNoZS5nZXQoY3dkKVxufVxuXG4vKipcbiAqIERldGVjdHMgdGhlIHBhY2thZ2UgbWFuYWdlciBmcm9tIHBhY2thZ2UuanNvbiBhbmQgbG9jayBmaWxlc1xuICogQHBhcmFtIHtvYmplY3R9IHBhY2thZ2VKc29uIC0gVGhlIHBhcnNlZCBwYWNrYWdlLmpzb24gb2JqZWN0XG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gLSBUaGUgZGV0ZWN0ZWQgcGFja2FnZSBtYW5hZ2VyLiBEZWZhdWx0IHRvIG5wbSBpZiBub3QgZGV0ZWN0ZWQuXG4gKi9cbmZ1bmN0aW9uIHNob3VsZFNvcnREZXBlbmRlbmNpZXNMaWtlTnBtKHBhY2thZ2VKc29uKSB7XG4gIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9ub2RlanMvY29yZXBhY2tcbiAgaWYgKHR5cGVvZiBwYWNrYWdlSnNvbi5wYWNrYWdlTWFuYWdlciA9PT0gJ3N0cmluZycpIHtcbiAgICByZXR1cm4gcGFja2FnZUpzb24ucGFja2FnZU1hbmFnZXIuc3RhcnRzV2l0aCgnbnBtQCcpXG4gIH1cblxuICBpZiAocGFja2FnZUpzb24uZGV2RW5naW5lcz8ucGFja2FnZU1hbmFnZXI/Lm5hbWUpIHtcbiAgICByZXR1cm4gcGFja2FnZUpzb24uZGV2RW5naW5lcy5wYWNrYWdlTWFuYWdlci5uYW1lID09PSAnbnBtJ1xuICB9XG5cbiAgaWYgKHBhY2thZ2VKc29uLnBucG0pIHtcbiAgICByZXR1cm4gZmFsc2VcbiAgfVxuXG4gIC8vIE9wdGltaXNhdGlvbjogQ2hlY2sgaWYgbnBtIGlzIGV4cGxpY2l0IGJlZm9yZSByZWFkaW5nIEZTLlxuICBpZiAocGFja2FnZUpzb24uZW5naW5lcz8ubnBtKSB7XG4gICAgcmV0dXJuIHRydWVcbiAgfVxuXG4gIGlmIChoYXNZYXJuT3JQbnBtRmlsZXMoKSkge1xuICAgIHJldHVybiBmYWxzZVxuICB9XG5cbiAgcmV0dXJuIHRydWVcbn1cblxuLyoqXG4gKiBTb3J0IGRlcGVuZGVuY2llcyBhbHBoYWJldGljYWxseSwgZGV0ZWN0aW5nIHBhY2thZ2UgbWFuYWdlciB0byB1c2UgdGhlXG4gKiBhcHByb3ByaWF0ZSBjb21wYXJpc29uLiBucG0gdXNlcyBsb2NhbGUtYXdhcmUgY29tcGFyaXNvbiwgeWFybiBhbmQgcG5wbSB1c2VcbiAqIHNpbXBsZSBzdHJpbmcgY29tcGFyaXNvblxuICovXG5jb25zdCBzb3J0RGVwZW5kZW5jaWVzID0gb25PYmplY3QoKGRlcGVuZGVuY2llcywgcGFja2FnZUpzb24pID0+IHtcbiAgLy8gQXZvaWQgZmlsZSBhY2Nlc3NcbiAgaWYgKE9iamVjdC5rZXlzKGRlcGVuZGVuY2llcykubGVuZ3RoIDwgMikge1xuICAgIHJldHVybiBkZXBlbmRlbmNpZXNcbiAgfVxuXG4gIC8vIHNvcnQgZGVwcyBsaWtlIHRoZSBucG0gQ0xJIGRvZXMgKHZpYSB0aGUgcGFja2FnZSBAbnBtY2xpL3BhY2thZ2UtanNvbilcbiAgLy8gaHR0cHM6Ly9naXRodWIuY29tL25wbS9wYWNrYWdlLWpzb24vYmxvYi9iNjQ2NWY0NGM3MjdkNjUxM2RiNjg5OGM3Y2JlNDFkZDM1NWNlYmU4L2xpYi91cGRhdGUtZGVwZW5kZW5jaWVzLmpzI0w4LUwyMVxuICBpZiAoc2hvdWxkU29ydERlcGVuZGVuY2llc0xpa2VOcG0ocGFja2FnZUpzb24pKSB7XG4gICAgcmV0dXJuIHNvcnRPYmplY3RLZXlzKGRlcGVuZGVuY2llcywgKGEsIGIpID0+IGEubG9jYWxlQ29tcGFyZShiLCAnZW4nKSlcbiAgfVxuXG4gIHJldHVybiBzb3J0T2JqZWN0S2V5cyhkZXBlbmRlbmNpZXMpXG59KVxuXG4vKipcbiAqIFwid29ya3NwYWNlc1wiIGNhbiBiZSBhbiBhcnJheSAobnBtIG9yIHlhcm4gY2xhc3NpYykgb3IgYW4gb2JqZWN0IChwbnBtL2J1bikuXG4gKiBJbiB0aGUgY2FzZSBvZiBhbiBhcnJheSwgd2UgZG8gbm90IHdhbnQgdG8gYWxwaGFiZXRpY2FsbHkgc29ydCBpdCBpbiBjYXNlXG4gKiBzY3JpcHRzIG5lZWQgdG8gcnVuIGluIGEgc3BlY2lmaWMgb3JkZXIuXG4gKlxuICogQHNlZSBodHRwczovL2RvY3MubnBtanMuY29tL2NsaS92Ny91c2luZy1ucG0vd29ya3NwYWNlcz92PXRydWUjcnVubmluZy1jb21tYW5kcy1pbi10aGUtY29udGV4dC1vZi13b3Jrc3BhY2VzXG4gKi9cbmNvbnN0IHNvcnRXb3Jrc3BhY2VzID0gcGlwZShbXG4gIHNvcnRPYmplY3RCeShbJ3BhY2thZ2VzJywgJ2NhdGFsb2cnXSksXG4gIG92ZXJQcm9wZXJ0eSgncGFja2FnZXMnLCB1bmlxQW5kU29ydEFycmF5KSxcbiAgb3ZlclByb3BlcnR5KCdjYXRhbG9nJywgc29ydERlcGVuZGVuY2llcyksXG5dKVxuXG4vLyBodHRwczovL2dpdGh1Yi5jb20vZXNsaW50L2VzbGludC9ibG9iL2FjYzBlNDc1NzJhOTM5MDI5MmI0ZTMxM2I0YTRiZjM2MGQyMzYzNTgvY29uZi9jb25maWctc2NoZW1hLmpzXG5jb25zdCBlc2xpbnRCYXNlQ29uZmlnUHJvcGVydGllcyA9IFtcbiAgLy8gYGZpbGVzYCBhbmQgYGV4Y2x1ZGVkRmlsZXNgIGFyZSBvbmx5IG9uIGBvdmVycmlkZXNbXWBcbiAgLy8gZm9yIGVhc2llciBzb3J0IGBvdmVycmlkZXNbXWAsXG4gIC8vIGFkZCB0aGVtIHRvIGhlcmUsIHNvIHdlIGRvbid0IG5lZWQgc29ydCBgb3ZlcnJpZGVzW11gIHR3aWNlXG4gICdmaWxlcycsXG4gICdleGNsdWRlZEZpbGVzJyxcbiAgLy8gYmFzZUNvbmZpZ1xuICAnZW52JyxcbiAgJ3BhcnNlcicsXG4gICdwYXJzZXJPcHRpb25zJyxcbiAgJ3NldHRpbmdzJyxcbiAgJ3BsdWdpbnMnLFxuICAnZXh0ZW5kcycsXG4gICdydWxlcycsXG4gICdvdmVycmlkZXMnLFxuICAnZ2xvYmFscycsXG4gICdwcm9jZXNzb3InLFxuICAnbm9JbmxpbmVDb25maWcnLFxuICAncmVwb3J0VW51c2VkRGlzYWJsZURpcmVjdGl2ZXMnLFxuXVxuY29uc3Qgc29ydEVzbGludENvbmZpZyA9IHBpcGUoW1xuICBzb3J0T2JqZWN0QnkoZXNsaW50QmFzZUNvbmZpZ1Byb3BlcnRpZXMpLFxuICBvdmVyUHJvcGVydHkoJ2VudicsIHNvcnRPYmplY3QpLFxuICBvdmVyUHJvcGVydHkoJ2dsb2JhbHMnLCBzb3J0T2JqZWN0KSxcbiAgb3ZlclByb3BlcnR5KFxuICAgICdvdmVycmlkZXMnLFxuICAgIG9uQXJyYXkoKG92ZXJyaWRlcykgPT4gb3ZlcnJpZGVzLm1hcChzb3J0RXNsaW50Q29uZmlnKSksXG4gICksXG4gIG92ZXJQcm9wZXJ0eSgncGFyc2VyT3B0aW9ucycsIHNvcnRPYmplY3QpLFxuICBvdmVyUHJvcGVydHkoXG4gICAgJ3J1bGVzJyxcbiAgICBzb3J0T2JqZWN0QnkoXG4gICAgICAocnVsZTEsIHJ1bGUyKSA9PlxuICAgICAgICBydWxlMS5zcGxpdCgnLycpLmxlbmd0aCAtIHJ1bGUyLnNwbGl0KCcvJykubGVuZ3RoIHx8XG4gICAgICAgIHJ1bGUxLmxvY2FsZUNvbXBhcmUocnVsZTIpLFxuICAgICksXG4gICksXG4gIG92ZXJQcm9wZXJ0eSgnc2V0dGluZ3MnLCBzb3J0T2JqZWN0KSxcbl0pXG5jb25zdCBzb3J0VlNDb2RlQmFkZ2VPYmplY3QgPSBzb3J0T2JqZWN0QnkoWydkZXNjcmlwdGlvbicsICd1cmwnLCAnaHJlZiddKVxuXG5jb25zdCBzb3J0UHJldHRpZXJDb25maWcgPSBwaXBlKFtcbiAgLy8gc29ydCBrZXlzIGFscGhhYmV0aWNhbGx5LCBidXQgcHV0IGBvdmVycmlkZXNgIGF0IGJvdHRvbVxuICBvbk9iamVjdCgoY29uZmlnKSA9PlxuICAgIHNvcnRPYmplY3RLZXlzKGNvbmZpZywgW1xuICAgICAgLi4uT2JqZWN0LmtleXMoY29uZmlnKVxuICAgICAgICAuZmlsdGVyKChrZXkpID0+IGtleSAhPT0gJ292ZXJyaWRlcycpXG4gICAgICAgIC5zb3J0KCksXG4gICAgICAnb3ZlcnJpZGVzJyxcbiAgICBdKSxcbiAgKSxcbiAgLy8gaWYgYGNvbmZpZy5vdmVycmlkZXNgIGV4aXN0c1xuICBvdmVyUHJvcGVydHkoXG4gICAgJ292ZXJyaWRlcycsXG4gICAgLy8gYW5kIGBjb25maWcub3ZlcnJpZGVzYCBpcyBhbiBhcnJheVxuICAgIG9uQXJyYXkoKG92ZXJyaWRlcykgPT5cbiAgICAgIG92ZXJyaWRlcy5tYXAoXG4gICAgICAgIHBpcGUoW1xuICAgICAgICAgIC8vIHNvcnQgYGNvbmZpZy5vdmVycmlkZXNbXWAgYWxwaGFiZXRpY2FsbHlcbiAgICAgICAgICBzb3J0T2JqZWN0LFxuICAgICAgICAgIC8vIHNvcnQgYGNvbmZpZy5vdmVycmlkZXNbXS5vcHRpb25zYCBhbHBoYWJldGljYWxseVxuICAgICAgICAgIG92ZXJQcm9wZXJ0eSgnb3B0aW9ucycsIHNvcnRPYmplY3QpLFxuICAgICAgICBdKSxcbiAgICAgICksXG4gICAgKSxcbiAgKSxcbl0pXG5cbmNvbnN0IHNvcnRWb2x0YSA9IHNvcnRPYmplY3RCeShbJ25vZGUnLCAnbnBtJywgJ3lhcm4nXSlcbmNvbnN0IHNvcnREZXZFbmdpbmVzID0gb3ZlclByb3BlcnR5KFxuICAncGFja2FnZU1hbmFnZXInLFxuICBzb3J0T2JqZWN0QnkoWyduYW1lJywgJ3ZlcnNpb24nLCAnb25GYWlsJ10pLFxuKVxuXG5jb25zdCBwbnBtQmFzZUNvbmZpZ1Byb3BlcnRpZXMgPSBbXG4gICdwZWVyRGVwZW5kZW5jeVJ1bGVzJyxcbiAgJ25ldmVyQnVpbHREZXBlbmRlbmNpZXMnLFxuICAnb25seUJ1aWx0RGVwZW5kZW5jaWVzJyxcbiAgJ29ubHlCdWlsdERlcGVuZGVuY2llc0ZpbGUnLFxuICAnYWxsb3dlZERlcHJlY2F0ZWRWZXJzaW9ucycsXG4gICdhbGxvd05vbkFwcGxpZWRQYXRjaGVzJyxcbiAgJ3VwZGF0ZUNvbmZpZycsXG4gICdhdWRpdENvbmZpZycsXG4gICdyZXF1aXJlZFNjcmlwdHMnLFxuICAnc3VwcG9ydGVkQXJjaGl0ZWN0dXJlcycsXG4gICdvdmVycmlkZXMnLFxuICAncGF0Y2hlZERlcGVuZGVuY2llcycsXG4gICdwYWNrYWdlRXh0ZW5zaW9ucycsXG5dXG5cbmNvbnN0IHNvcnRQbnBtQ29uZmlnID0gcGlwZShbXG4gIHNvcnRPYmplY3RCeShwbnBtQmFzZUNvbmZpZ1Byb3BlcnRpZXMsIHRydWUpLFxuICBvdmVyUHJvcGVydHkoJ292ZXJyaWRlcycsIHNvcnRPYmplY3RCeVNlbXZlciksXG5dKVxuXG4vLyBTZWUgaHR0cHM6Ly9kb2NzLm5wbWpzLmNvbS9taXNjL3NjcmlwdHNcbmNvbnN0IGRlZmF1bHROcG1TY3JpcHRzID0gbmV3IFNldChbXG4gICdpbnN0YWxsJyxcbiAgJ3BhY2snLFxuICAncHJlcGFyZScsXG4gICdwdWJsaXNoJyxcbiAgJ3Jlc3RhcnQnLFxuICAnc2hyaW5rd3JhcCcsXG4gICdzdGFydCcsXG4gICdzdG9wJyxcbiAgJ3Rlc3QnLFxuICAndW5pbnN0YWxsJyxcbiAgJ3ZlcnNpb24nLFxuXSlcblxuY29uc3QgaGFzRGV2RGVwZW5kZW5jeSA9IChkZXBlbmRlbmN5LCBwYWNrYWdlSnNvbikgPT4ge1xuICByZXR1cm4gKFxuICAgIE9iamVjdC5oYXNPd24ocGFja2FnZUpzb24sICdkZXZEZXBlbmRlbmNpZXMnKSAmJlxuICAgIE9iamVjdC5oYXNPd24ocGFja2FnZUpzb24uZGV2RGVwZW5kZW5jaWVzLCBkZXBlbmRlbmN5KVxuICApXG59XG5cbmNvbnN0IHJ1blNSZWdFeHAgPVxuICAvKD88PV58W1xccyY7PD58KF0pKD86cnVuLXN8bnBtLXJ1bi1hbGwyPyAuKig/Oi0tc2VxdWVudGlhbHwtLXNlcmlhbHwtcykpKD89JHxbXFxzJjs8PnwpXSkvXG5cbmNvbnN0IGlzU2VxdWVudGlhbFNjcmlwdCA9IChjb21tYW5kKSA9PlxuICBjb21tYW5kLmluY2x1ZGVzKCcqJykgJiYgcnVuU1JlZ0V4cC50ZXN0KGNvbW1hbmQpXG5cbmNvbnN0IGhhc1NlcXVlbnRpYWxTY3JpcHQgPSAocGFja2FnZUpzb24pID0+IHtcbiAgaWYgKFxuICAgICFoYXNEZXZEZXBlbmRlbmN5KCducG0tcnVuLWFsbCcsIHBhY2thZ2VKc29uKSAmJlxuICAgICFoYXNEZXZEZXBlbmRlbmN5KCducG0tcnVuLWFsbDInLCBwYWNrYWdlSnNvbilcbiAgKSB7XG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cbiAgY29uc3Qgc2NyaXB0cyA9IFsnc2NyaXB0cycsICdiZXR0ZXJTY3JpcHRzJ10uZmxhdE1hcCgoZmllbGQpID0+XG4gICAgcGFja2FnZUpzb25bZmllbGRdID8gT2JqZWN0LnZhbHVlcyhwYWNrYWdlSnNvbltmaWVsZF0pIDogW10sXG4gIClcbiAgcmV0dXJuIHNjcmlwdHMuc29tZSgoc2NyaXB0KSA9PiBpc1NlcXVlbnRpYWxTY3JpcHQoc2NyaXB0KSlcbn1cblxuZnVuY3Rpb24gc29ydFNjcmlwdE5hbWVzKGtleXMsIHByZWZpeCA9ICcnKSB7XG4gIGNvbnN0IGdyb3VwTWFwID0gbmV3IE1hcCgpXG4gIGZvciAoY29uc3Qga2V5IG9mIGtleXMpIHtcbiAgICBjb25zdCByZXN0ID0gcHJlZml4ID8ga2V5LnNsaWNlKHByZWZpeC5sZW5ndGggKyAxKSA6IGtleVxuICAgIGNvbnN0IGlkeCA9IHJlc3QuaW5kZXhPZignOicpXG4gICAgaWYgKGlkeCA+IDApIHtcbiAgICAgIGNvbnN0IGJhc2UgPSBrZXkuc2xpY2UoMCwgKHByZWZpeCA/IHByZWZpeC5sZW5ndGggKyAxIDogMCkgKyBpZHgpXG4gICAgICBpZiAoIWdyb3VwTWFwLmhhcyhiYXNlKSkgZ3JvdXBNYXAuc2V0KGJhc2UsIFtdKVxuICAgICAgZ3JvdXBNYXAuZ2V0KGJhc2UpLnB1c2goa2V5KVxuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoIWdyb3VwTWFwLmhhcyhrZXkpKSBncm91cE1hcC5zZXQoa2V5LCBbXSlcbiAgICAgIGdyb3VwTWFwLmdldChrZXkpLnB1c2goa2V5KVxuICAgIH1cbiAgfVxuICByZXR1cm4gQXJyYXkuZnJvbShncm91cE1hcC5rZXlzKCkpXG4gICAgLnNvcnQoKVxuICAgIC5mbGF0TWFwKChncm91cEtleSkgPT4ge1xuICAgICAgY29uc3QgY2hpbGRyZW4gPSBncm91cE1hcC5nZXQoZ3JvdXBLZXkpXG4gICAgICBpZiAoXG4gICAgICAgIGNoaWxkcmVuLmxlbmd0aCA+IDEgJiZcbiAgICAgICAgY2hpbGRyZW4uc29tZSgoaykgPT4gayAhPT0gZ3JvdXBLZXkgJiYgay5zdGFydHNXaXRoKGdyb3VwS2V5ICsgJzonKSlcbiAgICAgICkge1xuICAgICAgICBjb25zdCBkaXJlY3QgPSBjaGlsZHJlblxuICAgICAgICAgIC5maWx0ZXIoKGspID0+IGsgPT09IGdyb3VwS2V5IHx8ICFrLnN0YXJ0c1dpdGgoZ3JvdXBLZXkgKyAnOicpKVxuICAgICAgICAgIC5zb3J0KClcbiAgICAgICAgY29uc3QgbmVzdGVkID0gY2hpbGRyZW4uZmlsdGVyKChrKSA9PiBrLnN0YXJ0c1dpdGgoZ3JvdXBLZXkgKyAnOicpKVxuICAgICAgICByZXR1cm4gWy4uLmRpcmVjdCwgLi4uc29ydFNjcmlwdE5hbWVzKG5lc3RlZCwgZ3JvdXBLZXkpXVxuICAgICAgfVxuICAgICAgcmV0dXJuIGNoaWxkcmVuLnNvcnQoKVxuICAgIH0pXG59XG5cbmNvbnN0IHNvcnRTY3JpcHRzID0gb25PYmplY3QoKHNjcmlwdHMsIHBhY2thZ2VKc29uKSA9PiB7XG4gIGxldCBuYW1lcyA9IE9iamVjdC5rZXlzKHNjcmlwdHMpXG4gIGNvbnN0IHByZWZpeGFibGUgPSBuZXcgU2V0KClcblxuICBuYW1lcyA9IG5hbWVzLm1hcCgobmFtZSkgPT4ge1xuICAgIGNvbnN0IG9taXR0ZWQgPSBuYW1lLnJlcGxhY2UoL14oPzpwcmV8cG9zdCkvLCAnJylcbiAgICBpZiAoZGVmYXVsdE5wbVNjcmlwdHMuaGFzKG9taXR0ZWQpIHx8IG5hbWVzLmluY2x1ZGVzKG9taXR0ZWQpKSB7XG4gICAgICBwcmVmaXhhYmxlLmFkZChvbWl0dGVkKVxuICAgICAgcmV0dXJuIG9taXR0ZWRcbiAgICB9XG4gICAgcmV0dXJuIG5hbWVcbiAgfSlcblxuICBpZiAoIWhhc1NlcXVlbnRpYWxTY3JpcHQocGFja2FnZUpzb24pKSB7XG4gICAgbmFtZXMgPSBzb3J0U2NyaXB0TmFtZXMobmFtZXMpXG4gIH1cbiAgbmFtZXMgPSBuYW1lcy5mbGF0TWFwKChrZXkpID0+XG4gICAgcHJlZml4YWJsZS5oYXMoa2V5KSA/IFtgcHJlJHtrZXl9YCwga2V5LCBgcG9zdCR7a2V5fWBdIDogW2tleV0sXG4gIClcbiAgcmV0dXJuIHNvcnRPYmplY3RLZXlzKHNjcmlwdHMsIG5hbWVzKVxufSlcblxuLypcbi0gTW92ZSBgZGVmYXVsdGAgY29uZGl0aW9uIHRvIGJvdHRvbVxuKi9cbmNvbnN0IHNvcnRDb25kaXRpb25zID0gKGNvbmRpdGlvbnMpID0+IHtcbiAgY29uc3QgeyBkZWZhdWx0Q29uZGl0aW9ucyA9IFtdLCByZXN0Q29uZGl0aW9ucyA9IFtdIH0gPSBvYmplY3RHcm91cEJ5KFxuICAgIGNvbmRpdGlvbnMsXG4gICAgKGNvbmRpdGlvbikgPT4ge1xuICAgICAgaWYgKGNvbmRpdGlvbiA9PT0gJ2RlZmF1bHQnKSB7XG4gICAgICAgIHJldHVybiAnZGVmYXVsdENvbmRpdGlvbnMnXG4gICAgICB9XG5cbiAgICAgIHJldHVybiAncmVzdENvbmRpdGlvbnMnXG4gICAgfSxcbiAgKVxuXG4gIHJldHVybiBbLi4ucmVzdENvbmRpdGlvbnMsIC4uLmRlZmF1bHRDb25kaXRpb25zXVxufVxuXG5jb25zdCBzb3J0RXhwb3J0cyA9IG9uT2JqZWN0KChleHBvcnRzKSA9PiB7XG4gIGNvbnN0IHsgcGF0aHMgPSBbXSwgY29uZGl0aW9ucyA9IFtdIH0gPSBvYmplY3RHcm91cEJ5KFxuICAgIE9iamVjdC5rZXlzKGV4cG9ydHMpLFxuICAgIChrZXkpID0+IChrZXkuc3RhcnRzV2l0aCgnLicpID8gJ3BhdGhzJyA6ICdjb25kaXRpb25zJyksXG4gIClcblxuICByZXR1cm4gT2JqZWN0LmZyb21FbnRyaWVzKFxuICAgIFsuLi5wYXRocywgLi4uc29ydENvbmRpdGlvbnMoY29uZGl0aW9ucyldLm1hcCgoa2V5KSA9PiBbXG4gICAgICBrZXksXG4gICAgICBzb3J0RXhwb3J0cyhleHBvcnRzW2tleV0pLFxuICAgIF0pLFxuICApXG59KVxuXG4vLyBmaWVsZHMgbWFya2VkIGB2c2NvZGVgIGFyZSBmb3IgYFZpc3VhbCBTdHVkaW8gQ29kZSBleHRlbnNpb24gbWFuaWZlc3RgIG9ubHlcbi8vIGh0dHBzOi8vY29kZS52aXN1YWxzdHVkaW8uY29tL2FwaS9yZWZlcmVuY2VzL2V4dGVuc2lvbi1tYW5pZmVzdFxuLy8gU3VwcG9ydGVkIGZpZWxkczpcbi8vIHB1Ymxpc2hlciwgZGlzcGxheU5hbWUsIGNhdGVnb3JpZXMsIGdhbGxlcnlCYW5uZXIsIHByZXZpZXcsIGNvbnRyaWJ1dGVzLFxuLy8gYWN0aXZhdGlvbkV2ZW50cywgYmFkZ2VzLCBtYXJrZG93biwgcW5hLCBleHRlbnNpb25QYWNrLFxuLy8gZXh0ZW5zaW9uRGVwZW5kZW5jaWVzLCBpY29uXG5cbi8vIGZpZWxkLmtleXtzdHJpbmd9OiBmaWVsZCBuYW1lXG4vLyBmaWVsZC5vdmVye2Z1bmN0aW9ufTogc29ydCBmaWVsZCBzdWJLZXlcbmNvbnN0IGZpZWxkcyA9IFtcbiAgeyBrZXk6ICckc2NoZW1hJyB9LFxuICB7IGtleTogJ25hbWUnIH0sXG4gIC8qIHZzY29kZSAqLyB7IGtleTogJ2Rpc3BsYXlOYW1lJyB9LFxuICB7IGtleTogJ3ZlcnNpb24nIH0sXG4gIC8qIHlhcm4gKi8geyBrZXk6ICdzdGFibGVWZXJzaW9uJyB9LFxuICB7IGtleTogJ3ByaXZhdGUnIH0sXG4gIHsga2V5OiAnZGVzY3JpcHRpb24nIH0sXG4gIC8qIHZzY29kZSAqLyB7IGtleTogJ2NhdGVnb3JpZXMnLCBvdmVyOiB1bmlxIH0sXG4gIHsga2V5OiAna2V5d29yZHMnLCBvdmVyOiB1bmlxIH0sXG4gIHsga2V5OiAnaG9tZXBhZ2UnIH0sXG4gIHsga2V5OiAnYnVncycsIG92ZXI6IHNvcnRPYmplY3RCeShbJ3VybCcsICdlbWFpbCddKSB9LFxuICB7IGtleTogJ3JlcG9zaXRvcnknLCBvdmVyOiBzb3J0VVJMT2JqZWN0IH0sXG4gIHsga2V5OiAnZnVuZGluZycsIG92ZXI6IHNvcnRVUkxPYmplY3QgfSxcbiAgeyBrZXk6ICdsaWNlbnNlJywgb3Zlcjogc29ydFVSTE9iamVjdCB9LFxuICAvKiB2c2NvZGUgKi8geyBrZXk6ICdxbmEnIH0sXG4gIHsga2V5OiAnYXV0aG9yJywgb3Zlcjogc29ydFBlb3BsZU9iamVjdCB9LFxuICB7XG4gICAga2V5OiAnbWFpbnRhaW5lcnMnLFxuICAgIG92ZXI6IG9uQXJyYXkoKG1haW50YWluZXJzKSA9PiBtYWludGFpbmVycy5tYXAoc29ydFBlb3BsZU9iamVjdCkpLFxuICB9LFxuICB7XG4gICAga2V5OiAnY29udHJpYnV0b3JzJyxcbiAgICBvdmVyOiBvbkFycmF5KChjb250cmlidXRvcnMpID0+IGNvbnRyaWJ1dG9ycy5tYXAoc29ydFBlb3BsZU9iamVjdCkpLFxuICB9LFxuICAvKiB2c2NvZGUgKi8geyBrZXk6ICdwdWJsaXNoZXInIH0sXG4gIHsga2V5OiAnc2lkZUVmZmVjdHMnIH0sXG4gIHsga2V5OiAndHlwZScgfSxcbiAgeyBrZXk6ICdpbXBvcnRzJyB9LFxuICB7IGtleTogJ2V4cG9ydHMnLCBvdmVyOiBzb3J0RXhwb3J0cyB9LFxuICB7IGtleTogJ21haW4nIH0sXG4gIHsga2V5OiAnc3ZlbHRlJyB9LFxuICB7IGtleTogJ3VtZDptYWluJyB9LFxuICB7IGtleTogJ2pzZGVsaXZyJyB9LFxuICB7IGtleTogJ3VucGtnJyB9LFxuICB7IGtleTogJ21vZHVsZScgfSxcbiAgeyBrZXk6ICdzb3VyY2UnIH0sXG4gIHsga2V5OiAnanNuZXh0Om1haW4nIH0sXG4gIHsga2V5OiAnYnJvd3NlcicgfSxcbiAgeyBrZXk6ICdyZWFjdC1uYXRpdmUnIH0sXG4gIHsga2V5OiAndHlwZXMnIH0sXG4gIHsga2V5OiAndHlwZXNWZXJzaW9ucycgfSxcbiAgeyBrZXk6ICd0eXBpbmdzJyB9LFxuICB7IGtleTogJ3N0eWxlJyB9LFxuICB7IGtleTogJ2V4YW1wbGUnIH0sXG4gIHsga2V5OiAnZXhhbXBsZXN0eWxlJyB9LFxuICB7IGtleTogJ2Fzc2V0cycgfSxcbiAgeyBrZXk6ICdiaW4nLCBvdmVyOiBzb3J0T2JqZWN0IH0sXG4gIHsga2V5OiAnbWFuJyB9LFxuICB7IGtleTogJ2RpcmVjdG9yaWVzJywgb3Zlcjogc29ydERpcmVjdG9yaWVzIH0sXG4gIHsga2V5OiAnZmlsZXMnLCBvdmVyOiB1bmlxIH0sXG4gIHsga2V5OiAnd29ya3NwYWNlcycsIG92ZXI6IHNvcnRXb3Jrc3BhY2VzIH0sXG4gIC8vIG5vZGUtcHJlLWd5cCBodHRwczovL3d3dy5ucG1qcy5jb20vcGFja2FnZS9ub2RlLXByZS1neXAjMS1hZGQtbmV3LWVudHJpZXMtdG8teW91ci1wYWNrYWdlanNvblxuICB7XG4gICAga2V5OiAnYmluYXJ5JyxcbiAgICBvdmVyOiBzb3J0T2JqZWN0QnkoW1xuICAgICAgJ21vZHVsZV9uYW1lJyxcbiAgICAgICdtb2R1bGVfcGF0aCcsXG4gICAgICAncmVtb3RlX3BhdGgnLFxuICAgICAgJ3BhY2thZ2VfbmFtZScsXG4gICAgICAnaG9zdCcsXG4gICAgXSksXG4gIH0sXG4gIHsga2V5OiAnc2NyaXB0cycsIG92ZXI6IHNvcnRTY3JpcHRzIH0sXG4gIHsga2V5OiAnYmV0dGVyU2NyaXB0cycsIG92ZXI6IHNvcnRTY3JpcHRzIH0sXG4gIC8qIHZzY29kZSAqLyB7IGtleTogJ2wxMG4nIH0sXG4gIC8qIHZzY29kZSAqLyB7IGtleTogJ2NvbnRyaWJ1dGVzJywgb3Zlcjogc29ydE9iamVjdCB9LFxuICAvKiB2c2NvZGUgKi8geyBrZXk6ICdhY3RpdmF0aW9uRXZlbnRzJywgb3ZlcjogdW5pcSB9LFxuICB7IGtleTogJ2h1c2t5Jywgb3Zlcjogb3ZlclByb3BlcnR5KCdob29rcycsIHNvcnRHaXRIb29rcykgfSxcbiAgeyBrZXk6ICdzaW1wbGUtZ2l0LWhvb2tzJywgb3Zlcjogc29ydEdpdEhvb2tzIH0sXG4gIHsga2V5OiAncHJlLWNvbW1pdCcgfSxcbiAgeyBrZXk6ICdjb21taXRsaW50Jywgb3Zlcjogc29ydE9iamVjdCB9LFxuICB7IGtleTogJ2xpbnQtc3RhZ2VkJyB9LFxuICB7IGtleTogJ25hbm8tc3RhZ2VkJyB9LFxuICB7IGtleTogJ2NvbmZpZycsIG92ZXI6IHNvcnRPYmplY3QgfSxcbiAgeyBrZXk6ICdub2RlbW9uQ29uZmlnJywgb3Zlcjogc29ydE9iamVjdCB9LFxuICB7IGtleTogJ2Jyb3dzZXJpZnknLCBvdmVyOiBzb3J0T2JqZWN0IH0sXG4gIHsga2V5OiAnYmFiZWwnLCBvdmVyOiBzb3J0T2JqZWN0IH0sXG4gIHsga2V5OiAnYnJvd3NlcnNsaXN0JyB9LFxuICB7IGtleTogJ3hvJywgb3Zlcjogc29ydE9iamVjdCB9LFxuICB7IGtleTogJ3ByZXR0aWVyJywgb3Zlcjogc29ydFByZXR0aWVyQ29uZmlnIH0sXG4gIHsga2V5OiAnZXNsaW50Q29uZmlnJywgb3Zlcjogc29ydEVzbGludENvbmZpZyB9LFxuICB7IGtleTogJ2VzbGludElnbm9yZScgfSxcbiAgeyBrZXk6ICducG1wa2dqc29ubGludCcsIG92ZXI6IHNvcnRPYmplY3QgfSxcbiAgeyBrZXk6ICducG1QYWNrYWdlSnNvbkxpbnRDb25maWcnLCBvdmVyOiBzb3J0T2JqZWN0IH0sXG4gIHsga2V5OiAnbnBtcGFja2FnZWpzb25saW50Jywgb3Zlcjogc29ydE9iamVjdCB9LFxuICB7IGtleTogJ3JlbGVhc2UnLCBvdmVyOiBzb3J0T2JqZWN0IH0sXG4gIHsga2V5OiAncmVtYXJrQ29uZmlnJywgb3Zlcjogc29ydE9iamVjdCB9LFxuICB7IGtleTogJ3N0eWxlbGludCcgfSxcbiAgeyBrZXk6ICdhdmEnLCBvdmVyOiBzb3J0T2JqZWN0IH0sXG4gIHsga2V5OiAnamVzdCcsIG92ZXI6IHNvcnRPYmplY3QgfSxcbiAgeyBrZXk6ICdqZXN0LWp1bml0Jywgb3Zlcjogc29ydE9iamVjdCB9LFxuICB7IGtleTogJ2plc3Qtc3RhcmUnLCBvdmVyOiBzb3J0T2JqZWN0IH0sXG4gIHsga2V5OiAnbW9jaGEnLCBvdmVyOiBzb3J0T2JqZWN0IH0sXG4gIHsga2V5OiAnbnljJywgb3Zlcjogc29ydE9iamVjdCB9LFxuICB7IGtleTogJ2M4Jywgb3Zlcjogc29ydE9iamVjdCB9LFxuICB7IGtleTogJ3RhcCcsIG92ZXI6IHNvcnRPYmplY3QgfSxcbiAgeyBrZXk6ICdvY2xpZicsIG92ZXI6IHNvcnRPYmplY3RCeSh1bmRlZmluZWQsIHRydWUpIH0sXG4gIHsga2V5OiAncmVzb2x1dGlvbnMnLCBvdmVyOiBzb3J0T2JqZWN0IH0sXG4gIHsga2V5OiAnb3ZlcnJpZGVzJywgb3Zlcjogc29ydERlcGVuZGVuY2llcyB9LFxuICB7IGtleTogJ2RlcGVuZGVuY2llcycsIG92ZXI6IHNvcnREZXBlbmRlbmNpZXMgfSxcbiAgeyBrZXk6ICdkZXZEZXBlbmRlbmNpZXMnLCBvdmVyOiBzb3J0RGVwZW5kZW5jaWVzIH0sXG4gIHsga2V5OiAnZGVwZW5kZW5jaWVzTWV0YScsIG92ZXI6IHNvcnRPYmplY3RCeShzb3J0T2JqZWN0QnlJZGVudCwgdHJ1ZSkgfSxcbiAgeyBrZXk6ICdwZWVyRGVwZW5kZW5jaWVzJywgb3Zlcjogc29ydERlcGVuZGVuY2llcyB9LFxuICAvLyBUT0RPOiBvbmx5IHNvcnQgZGVwdGggPSAyXG4gIHsga2V5OiAncGVlckRlcGVuZGVuY2llc01ldGEnLCBvdmVyOiBzb3J0T2JqZWN0QnkodW5kZWZpbmVkLCB0cnVlKSB9LFxuICB7IGtleTogJ29wdGlvbmFsRGVwZW5kZW5jaWVzJywgb3Zlcjogc29ydERlcGVuZGVuY2llcyB9LFxuICB7IGtleTogJ2J1bmRsZWREZXBlbmRlbmNpZXMnLCBvdmVyOiB1bmlxQW5kU29ydEFycmF5IH0sXG4gIHsga2V5OiAnYnVuZGxlRGVwZW5kZW5jaWVzJywgb3ZlcjogdW5pcUFuZFNvcnRBcnJheSB9LFxuICAvKiB2c2NvZGUgKi8geyBrZXk6ICdleHRlbnNpb25QYWNrJywgb3ZlcjogdW5pcUFuZFNvcnRBcnJheSB9LFxuICAvKiB2c2NvZGUgKi8geyBrZXk6ICdleHRlbnNpb25EZXBlbmRlbmNpZXMnLCBvdmVyOiB1bmlxQW5kU29ydEFycmF5IH0sXG4gIHsga2V5OiAnZmxhdCcgfSxcbiAgeyBrZXk6ICdwYWNrYWdlTWFuYWdlcicgfSxcbiAgeyBrZXk6ICdlbmdpbmVzJywgb3Zlcjogc29ydE9iamVjdCB9LFxuICB7IGtleTogJ2VuZ2luZVN0cmljdCcsIG92ZXI6IHNvcnRPYmplY3QgfSxcbiAgeyBrZXk6ICdkZXZFbmdpbmVzJywgb3Zlcjogc29ydERldkVuZ2luZXMgfSxcbiAgeyBrZXk6ICd2b2x0YScsIG92ZXI6IHNvcnRWb2x0YSB9LFxuICB7IGtleTogJ2xhbmd1YWdlTmFtZScgfSxcbiAgeyBrZXk6ICdvcycgfSxcbiAgeyBrZXk6ICdjcHUnIH0sXG4gIHsga2V5OiAncHJlZmVyR2xvYmFsJywgb3Zlcjogc29ydE9iamVjdCB9LFxuICB7IGtleTogJ3B1Ymxpc2hDb25maWcnLCBvdmVyOiBzb3J0T2JqZWN0IH0sXG4gIC8qIHZzY29kZSAqLyB7IGtleTogJ2ljb24nIH0sXG4gIC8qIHZzY29kZSAqLyB7XG4gICAga2V5OiAnYmFkZ2VzJyxcbiAgICBvdmVyOiBvbkFycmF5KChiYWRnZSkgPT4gYmFkZ2UubWFwKHNvcnRWU0NvZGVCYWRnZU9iamVjdCkpLFxuICB9LFxuICAvKiB2c2NvZGUgKi8geyBrZXk6ICdnYWxsZXJ5QmFubmVyJywgb3Zlcjogc29ydE9iamVjdCB9LFxuICAvKiB2c2NvZGUgKi8geyBrZXk6ICdwcmV2aWV3JyB9LFxuICAvKiB2c2NvZGUgKi8geyBrZXk6ICdtYXJrZG93bicgfSxcbiAgeyBrZXk6ICdwbnBtJywgb3Zlcjogc29ydFBucG1Db25maWcgfSxcbl1cblxuY29uc3QgZGVmYXVsdFNvcnRPcmRlciA9IGZpZWxkcy5tYXAoKHsga2V5IH0pID0+IGtleSlcbmNvbnN0IG92ZXJGaWVsZHMgPSBwaXBlKFxuICBmaWVsZHNcbiAgICAubWFwKCh7IGtleSwgb3ZlciB9KSA9PiAob3ZlciA/IG92ZXJQcm9wZXJ0eShrZXksIG92ZXIpIDogdW5kZWZpbmVkKSlcbiAgICAuZmlsdGVyKEJvb2xlYW4pLFxuKVxuXG5mdW5jdGlvbiBlZGl0U3RyaW5nSlNPTihqc29uLCBvdmVyKSB7XG4gIGlmICh0eXBlb2YganNvbiA9PT0gJ3N0cmluZycpIHtcbiAgICBjb25zdCB7IGluZGVudCwgdHlwZSB9ID0gZGV0ZWN0SW5kZW50KGpzb24pXG4gICAgY29uc3QgZW5kQ2hhcmFjdGVycyA9IGpzb24uc2xpY2UoLTEpID09PSAnXFxuJyA/ICdcXG4nIDogJydcbiAgICBjb25zdCBuZXdsaW5lID0gZGV0ZWN0TmV3bGluZShqc29uKVxuICAgIGpzb24gPSBKU09OLnBhcnNlKGpzb24pXG5cbiAgICBsZXQgcmVzdWx0ID1cbiAgICAgIEpTT04uc3RyaW5naWZ5KG92ZXIoanNvbiksIG51bGwsIHR5cGUgPT09ICd0YWInID8gJ1xcdCcgOiBpbmRlbnQpICtcbiAgICAgIGVuZENoYXJhY3RlcnNcbiAgICBpZiAobmV3bGluZSA9PT0gJ1xcclxcbicpIHtcbiAgICAgIHJlc3VsdCA9IHJlc3VsdC5yZXBsYWNlKC9cXG4vZywgbmV3bGluZSlcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdFxuICB9XG5cbiAgcmV0dXJuIG92ZXIoanNvbilcbn1cblxuZnVuY3Rpb24gc29ydFBhY2thZ2VKc29uKGpzb25Jc2gsIG9wdGlvbnMgPSB7fSkge1xuICByZXR1cm4gZWRpdFN0cmluZ0pTT04oXG4gICAganNvbklzaCxcbiAgICBvbk9iamVjdCgoanNvbikgPT4ge1xuICAgICAgbGV0IHNvcnRPcmRlciA9IG9wdGlvbnMuc29ydE9yZGVyIHx8IGRlZmF1bHRTb3J0T3JkZXJcblxuICAgICAgaWYgKEFycmF5LmlzQXJyYXkoc29ydE9yZGVyKSkge1xuICAgICAgICBjb25zdCBrZXlzID0gT2JqZWN0LmtleXMoanNvbilcbiAgICAgICAgY29uc3QgeyBwcml2YXRlS2V5cyA9IFtdLCBwdWJsaWNLZXlzID0gW10gfSA9IG9iamVjdEdyb3VwQnkoXG4gICAgICAgICAga2V5cyxcbiAgICAgICAgICAoa2V5KSA9PiAoa2V5WzBdID09PSAnXycgPyAncHJpdmF0ZUtleXMnIDogJ3B1YmxpY0tleXMnKSxcbiAgICAgICAgKVxuICAgICAgICBzb3J0T3JkZXIgPSBbXG4gICAgICAgICAgLi4uc29ydE9yZGVyLFxuICAgICAgICAgIC4uLmRlZmF1bHRTb3J0T3JkZXIsXG4gICAgICAgICAgLi4ucHVibGljS2V5cy5zb3J0KCksXG4gICAgICAgICAgLi4ucHJpdmF0ZUtleXMuc29ydCgpLFxuICAgICAgICBdXG4gICAgICB9XG5cbiAgICAgIHJldHVybiBvdmVyRmllbGRzKHNvcnRPYmplY3RLZXlzKGpzb24sIHNvcnRPcmRlciksIGpzb24pXG4gICAgfSksXG4gIClcbn1cblxuZXhwb3J0IGRlZmF1bHQgc29ydFBhY2thZ2VKc29uXG5leHBvcnQgeyBzb3J0UGFja2FnZUpzb24sIGRlZmF1bHRTb3J0T3JkZXIgYXMgc29ydE9yZGVyIH1cbiIsImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGlzUGxhaW5PYmplY3QodmFsdWUpIHtcblx0aWYgKHR5cGVvZiB2YWx1ZSAhPT0gJ29iamVjdCcgfHwgdmFsdWUgPT09IG51bGwpIHtcblx0XHRyZXR1cm4gZmFsc2U7XG5cdH1cblxuXHRjb25zdCBwcm90b3R5cGUgPSBPYmplY3QuZ2V0UHJvdG90eXBlT2YodmFsdWUpO1xuXHRyZXR1cm4gKHByb3RvdHlwZSA9PT0gbnVsbCB8fCBwcm90b3R5cGUgPT09IE9iamVjdC5wcm90b3R5cGUgfHwgT2JqZWN0LmdldFByb3RvdHlwZU9mKHByb3RvdHlwZSkgPT09IG51bGwpICYmICEoU3ltYm9sLnRvU3RyaW5nVGFnIGluIHZhbHVlKSAmJiAhKFN5bWJvbC5pdGVyYXRvciBpbiB2YWx1ZSk7XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgeyBzb3J0UGFja2FnZUpzb24gfSBmcm9tICdzb3J0LXBhY2thZ2UtanNvbic7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgeyBmc1V0aWwgfSBmcm9tICcuLi91dGlscy9mc1V0aWwuanMnO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZml4VGVzdERpcmVjdG9yaWVzVXBkYXRpbmdQYWNrYWdlSnNvbihwYWNrYWdlRGlyUGF0aHM6IHN0cmluZ1tdKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZml4VGVzdERpcmVjdG9yaWVzVXBkYXRpbmdQYWNrYWdlSnNvbicsIGFzeW5jICgpID0+IHtcbiAgICBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgIHBhY2thZ2VEaXJQYXRocy5tYXAoYXN5bmMgKHBhY2thZ2VEaXJQYXRoKSA9PiB7XG4gICAgICAgIGNvbnN0IHBhY2thZ2VKc29uUGF0aCA9IHBhdGguam9pbihwYWNrYWdlRGlyUGF0aCwgJ3BhY2thZ2UuanNvbicpO1xuICAgICAgICBpZiAoIWZzLmV4aXN0c1N5bmMocGFja2FnZUpzb25QYXRoKSkgcmV0dXJuO1xuXG4gICAgICAgIGNvbnN0IG5ld1Rlc3REaXJQYXRoID0gcGF0aC5qb2luKHBhY2thZ2VEaXJQYXRoLCAndGVzdCcpO1xuICAgICAgICBmb3IgKGNvbnN0IG9sZFRlc3REaXJOYW1lIG9mIFsnX190ZXN0c19fJywgJ3Rlc3RzJ10pIHtcbiAgICAgICAgICBjb25zdCBvbGRUZXN0RGlyUGF0aCA9IHBhdGguam9pbihwYWNrYWdlRGlyUGF0aCwgb2xkVGVzdERpck5hbWUpO1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBhd2FpdCBtb3ZlVGVzdERpcmVjdG9yeShvbGRUZXN0RGlyUGF0aCwgbmV3VGVzdERpclBhdGgpO1xuICAgICAgICAgICAgY29uc3QgcGFja2FnZUpzb24gPSBKU09OLnBhcnNlKGF3YWl0IGZzLnByb21pc2VzLnJlYWRGaWxlKHBhY2thZ2VKc29uUGF0aCwgJ3V0ZjgnKSkgYXMge1xuICAgICAgICAgICAgICBzY3JpcHRzPzogUmVjb3JkPHN0cmluZywgc3RyaW5nPjtcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBsZXQgZGlkVXBkYXRlU2NyaXB0ID0gZmFsc2U7XG4gICAgICAgICAgICBjb25zdCBzY3JpcHRzID0gcGFja2FnZUpzb24uc2NyaXB0cyA/PyB7fTtcbiAgICAgICAgICAgIGZvciAoY29uc3QgW3NjcmlwdE5hbWUsIHNjcmlwdF0gb2YgT2JqZWN0LmVudHJpZXMoc2NyaXB0cykpIHtcbiAgICAgICAgICAgICAgY29uc3QgbmV3U2NyaXB0ID0gc2NyaXB0LnJlcGxhY2VBbGwob2xkVGVzdERpck5hbWUsICd0ZXN0Jyk7XG4gICAgICAgICAgICAgIGlmIChzY3JpcHQgIT09IG5ld1NjcmlwdCkge1xuICAgICAgICAgICAgICAgIHNjcmlwdHNbc2NyaXB0TmFtZV0gPSBuZXdTY3JpcHQ7XG4gICAgICAgICAgICAgICAgZGlkVXBkYXRlU2NyaXB0ID0gdHJ1ZTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcGFja2FnZUpzb24uc2NyaXB0cyA9IHNjcmlwdHM7XG4gICAgICAgICAgICBpZiAoIWRpZFVwZGF0ZVNjcmlwdCkgcmV0dXJuO1xuXG4gICAgICAgICAgICBhd2FpdCBmc1V0aWwuZ2VuZXJhdGVGaWxlKHBhY2thZ2VKc29uUGF0aCwgSlNPTi5zdHJpbmdpZnkoc29ydFBhY2thZ2VKc29uKHBhY2thZ2VKc29uKSwgdW5kZWZpbmVkLCAyKSk7XG4gICAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgICAvLyBkbyBub3RoaW5nXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9KVxuICAgICk7XG4gIH0pO1xufVxuXG5hc3luYyBmdW5jdGlvbiBtb3ZlVGVzdERpcmVjdG9yeShvbGRUZXN0RGlyUGF0aDogc3RyaW5nLCBuZXdUZXN0RGlyUGF0aDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gIGlmICghZnMuZXhpc3RzU3luYyhuZXdUZXN0RGlyUGF0aCkpIHtcbiAgICBhd2FpdCBmcy5wcm9taXNlcy5yZW5hbWUob2xkVGVzdERpclBhdGgsIG5ld1Rlc3REaXJQYXRoKTtcbiAgICByZXR1cm47XG4gIH1cblxuICBjb25zdCBkaXJlbnRzID0gYXdhaXQgZnMucHJvbWlzZXMucmVhZGRpcihvbGRUZXN0RGlyUGF0aCwgeyB3aXRoRmlsZVR5cGVzOiB0cnVlIH0pO1xuICBhd2FpdCBQcm9taXNlLmFsbChcbiAgICBkaXJlbnRzLm1hcChhc3luYyAoZGlyZW50KSA9PiB7XG4gICAgICBjb25zdCBvbGRQYXRoID0gcGF0aC5qb2luKG9sZFRlc3REaXJQYXRoLCBkaXJlbnQubmFtZSk7XG4gICAgICBjb25zdCBuZXdQYXRoID0gcGF0aC5qb2luKG5ld1Rlc3REaXJQYXRoLCBkaXJlbnQubmFtZSk7XG4gICAgICBjb25zdCBuZXdQYXRoU3RhdCA9IGZzLmV4aXN0c1N5bmMobmV3UGF0aCkgPyBhd2FpdCBmcy5wcm9taXNlcy5zdGF0KG5ld1BhdGgpIDogdW5kZWZpbmVkO1xuICAgICAgaWYgKGRpcmVudC5pc0RpcmVjdG9yeSgpICYmIG5ld1BhdGhTdGF0Py5pc0RpcmVjdG9yeSgpKSB7XG4gICAgICAgIGF3YWl0IG1vdmVUZXN0RGlyZWN0b3J5KG9sZFBhdGgsIG5ld1BhdGgpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBhd2FpdCBmcy5wcm9taXNlcy5yZW5hbWUob2xkUGF0aCwgbmV3UGF0aCk7XG4gICAgfSlcbiAgKTtcbiAgYXdhaXQgZnMucHJvbWlzZXMucm0ob2xkVGVzdERpclBhdGgsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMvcHJvbWlzZXMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHsgaWdub3JlRW5vZW50QXN5bmMgfSBmcm9tICdAd2lsbGJvb3N0ZXIvc2hhcmVkLWxpYi9zcmMnO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGZpeFR5cGVEZWZpbml0aW9ucyhcbiAgY29uZmlnOiBQYWNrYWdlQ29uZmlnLFxuICBjb25maWdzSW5jbHVkaW5nQ2hpbGRyZW46IFBhY2thZ2VDb25maWdbXVxuKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZml4VHlwZURlZmluaXRpb25zJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IGxpYlR5cGVEaXJQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnQHR5cGVzJyk7XG4gICAgY29uc3Qgc3JjVHlwZURpclBhdGggPVxuICAgICAgY29uZmlnLmlzUm9vdCAmJiBjb25maWcuZG9lc0NvbnRhaW5TdWJQYWNrYWdlSnNvbnMgPyB1bmRlZmluZWQgOiBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICdzcmMnLCAndHlwZXMnKTtcblxuICAgIGNvbnN0IGRpcmVudHMgPSBhd2FpdCBpZ25vcmVFbm9lbnRBc3luYygoKSA9PiBmcy5yZWFkZGlyKGxpYlR5cGVEaXJQYXRoLCB7IHdpdGhGaWxlVHlwZXM6IHRydWUgfSkpO1xuICAgIGlmICghZGlyZW50cykgcmV0dXJuO1xuXG4gICAgZm9yIChjb25zdCBkaXJlbnQgb2YgZGlyZW50cykge1xuICAgICAgY29uc3QgZGlyTmFtZSA9IGRpcmVudC5uYW1lLnNsaWNlKDAsIC01KTtcbiAgICAgIGNvbnN0IGhhc1R5cGVEZWNsYXJhdGlvbkV4dGVuc2lvbiA9IGRpcmVudC5uYW1lLmVuZHNXaXRoKCcuZC50cycpO1xuICAgICAgbGV0IHBhY2thZ2VOYW1lID0gaGFzVHlwZURlY2xhcmF0aW9uRXh0ZW5zaW9uID8gZGlyTmFtZSA6IGRpcmVudC5uYW1lO1xuICAgICAgaWYgKHBhY2thZ2VOYW1lLmluY2x1ZGVzKCdfXycpKSB7XG4gICAgICAgIHBhY2thZ2VOYW1lID0gYEAke3BhY2thZ2VOYW1lLnJlcGxhY2UoJ19fJywgJy8nKX1gO1xuICAgICAgfVxuICAgICAgY29uc3QgaGFzTGlicmFyeSA9IGNvbmZpZ3NJbmNsdWRpbmdDaGlsZHJlbi5zb21lKFxuICAgICAgICAoY29uZmlnKSA9PlxuICAgICAgICAgIGNvbmZpZy5wYWNrYWdlSnNvbj8uZGVwZW5kZW5jaWVzPy5bcGFja2FnZU5hbWVdIHx8IGNvbmZpZy5wYWNrYWdlSnNvbj8uZGV2RGVwZW5kZW5jaWVzPy5bcGFja2FnZU5hbWVdXG4gICAgICApO1xuXG4gICAgICBpZiAoZGlyZW50LmlzRmlsZSgpICYmIGhhc1R5cGVEZWNsYXJhdGlvbkV4dGVuc2lvbikge1xuICAgICAgICBpZiAoaGFzTGlicmFyeSkge1xuICAgICAgICAgIC8vIE1vdmUgQHR5cGVzLzxuYW1lPi9pbmRleC5kLnRzIGlmIGluc3RhbGxlZFxuICAgICAgICAgIGF3YWl0IGZzLm1rZGlyKHBhdGguam9pbihsaWJUeXBlRGlyUGF0aCwgZGlyTmFtZSksIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICAgICAgICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PlxuICAgICAgICAgICAgZnMucmVuYW1lKHBhdGguam9pbihsaWJUeXBlRGlyUGF0aCwgZGlyZW50Lm5hbWUpLCBwYXRoLmpvaW4obGliVHlwZURpclBhdGgsIGRpck5hbWUsICdpbmRleC5kLnRzJykpXG4gICAgICAgICAgKTtcbiAgICAgICAgfSBlbHNlIGlmIChzcmNUeXBlRGlyUGF0aCkge1xuICAgICAgICAgIC8vIE1vdmUgc3JjL3R5cGVzLzxuYW1lPiBpZiBub3QgaW5zdGFsbGVkXG4gICAgICAgICAgYXdhaXQgZnMubWtkaXIoc3JjVHlwZURpclBhdGgsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICAgICAgICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PlxuICAgICAgICAgICAgZnMucmVuYW1lKHBhdGguam9pbihsaWJUeXBlRGlyUGF0aCwgZGlyZW50Lm5hbWUpLCBwYXRoLmpvaW4oc3JjVHlwZURpclBhdGgsIGRpcmVudC5uYW1lKSlcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKGRpcmVudC5pc0RpcmVjdG9yeSgpICYmIHNyY1R5cGVEaXJQYXRoICYmICFoYXNMaWJyYXJ5KSB7XG4gICAgICAgIC8vIE1vdmUgc3JjL3R5cGVzLzxuYW1lPi5kLnRzIGlmIG5vdCBpbnN0YWxsZWRcbiAgICAgICAgYXdhaXQgZnMubWtkaXIoc3JjVHlwZURpclBhdGgsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICAgICAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT5cbiAgICAgICAgICBpZ25vcmVFbm9lbnRBc3luYygoKSA9PlxuICAgICAgICAgICAgZnMucmVuYW1lKFxuICAgICAgICAgICAgICBwYXRoLmpvaW4obGliVHlwZURpclBhdGgsIGRpcmVudC5uYW1lLCAnaW5kZXguZC50cycpLFxuICAgICAgICAgICAgICBwYXRoLmpvaW4oc3JjVHlwZURpclBhdGgsIGAke2RpcmVudC5uYW1lfS5kLnRzYClcbiAgICAgICAgICAgIClcbiAgICAgICAgICApXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuICB9KTtcbn1cbiIsImltcG9ydCBtZXJnZSBmcm9tICdkZWVwbWVyZ2UnO1xuXG5leHBvcnQgZnVuY3Rpb24gb3ZlcndyaXRlTWVyZ2U8VD4oZGVzdGluYXRpb25BcnJheTogVFtdLCBzb3VyY2VBcnJheTogVFtdKTogVFtdIHtcbiAgcmV0dXJuIHNvdXJjZUFycmF5O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY29tYmluZU1lcmdlKHRhcmdldDogdW5rbm93bltdLCBzb3VyY2U6IHVua25vd25bXSwgb3B0aW9uczogbWVyZ2UuQXJyYXlNZXJnZU9wdGlvbnMpOiB1bmtub3duW10ge1xuICBjb25zdCBkZXN0aW5hdGlvbiA9IFsuLi50YXJnZXRdO1xuXG4gIGZvciAoY29uc3QgW2luZGV4LCBpdGVtXSBvZiBzb3VyY2UuZW50cmllcygpKSB7XG4gICAgaWYgKGRlc3RpbmF0aW9uW2luZGV4XSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBkZXN0aW5hdGlvbltpbmRleF0gPSBjbG9uZVVubGVzc090aGVyd2lzZVNwZWNpZmllZChpdGVtLCBvcHRpb25zKTtcbiAgICB9IGVsc2UgaWYgKGlzTWVyZ2VhYmxlT2JqZWN0KHRhcmdldFtpbmRleF0sIG9wdGlvbnMpICYmIGlzTWVyZ2VhYmxlT2JqZWN0KGl0ZW0sIG9wdGlvbnMpKSB7XG4gICAgICBkZXN0aW5hdGlvbltpbmRleF0gPSBtZXJnZSh0YXJnZXRbaW5kZXhdLCBpdGVtLCBvcHRpb25zKTtcbiAgICB9IGVsc2UgaWYgKCF0YXJnZXQuaW5jbHVkZXMoaXRlbSkpIHtcbiAgICAgIGRlc3RpbmF0aW9uLnB1c2goaXRlbSk7XG4gICAgfVxuICB9XG4gIHJldHVybiBkZXN0aW5hdGlvbjtcbn1cblxuZnVuY3Rpb24gY2xvbmVVbmxlc3NPdGhlcndpc2VTcGVjaWZpZWQodmFsdWU6IHVua25vd24sIG9wdGlvbnM6IG1lcmdlLkFycmF5TWVyZ2VPcHRpb25zKTogdW5rbm93biB7XG4gIHJldHVybiBpc01lcmdlYWJsZU9iamVjdCh2YWx1ZSwgb3B0aW9ucykgPyBvcHRpb25zLmNsb25lVW5sZXNzT3RoZXJ3aXNlU3BlY2lmaWVkKHZhbHVlLCBvcHRpb25zKSA6IHZhbHVlO1xufVxuXG5mdW5jdGlvbiBpc01lcmdlYWJsZU9iamVjdCh2YWx1ZTogdW5rbm93biwgb3B0aW9uczogbWVyZ2UuQXJyYXlNZXJnZU9wdGlvbnMpOiB2YWx1ZSBpcyBvYmplY3Qge1xuICByZXR1cm4gISF2YWx1ZSAmJiB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnICYmIG9wdGlvbnMuaXNNZXJnZWFibGVPYmplY3QodmFsdWUpO1xufVxuIiwiZXhwb3J0IGZ1bmN0aW9uIG1vdmVUb0JvdHRvbTxUT2JqIGV4dGVuZHMgUmVjb3JkPFRLZXksIHVua25vd24+LCBUS2V5IGV4dGVuZHMgc3RyaW5nIHwgbnVtYmVyIHwgc3ltYm9sPihcbiAgb2JqOiBUT2JqLFxuICBrZXk6IFRLZXlcbik6IFRPYmoge1xuICBjb25zdCB2YWx1ZSA9IG9ialtrZXldO1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWR5bmFtaWMtZGVsZXRlXG4gIGRlbGV0ZSBvYmpba2V5XTtcbiAgKG9iaiBhcyBSZWNvcmQ8VEtleSwgdW5rbm93bj4pW2tleV0gPSB2YWx1ZTtcbiAgcmV0dXJuIG9iajtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHNvcnRLZXlzPFQgZXh0ZW5kcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj4ob2JqOiBUKTogVCB7XG4gIGNvbnN0IGtleUFuZFZhbHVlcyA9IE9iamVjdC5lbnRyaWVzKG9iaikudG9Tb3J0ZWQoKFtrZXkxXSwgW2tleTJdKSA9PiBrZXkxLmxvY2FsZUNvbXBhcmUoa2V5MikpO1xuICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBrZXlBbmRWYWx1ZXMpIHtcbiAgICAvLyBwYWNrYWdlLmpzb24tc3R5bGUga2V5cyBhcmUgbm9uLWFycmF5LWluZGV4IGtleXMsIHNvIEpTT04uc3RyaW5naWZ5IHByZXNlcnZlcyB0aGlzIGluc2VydGlvbiBvcmRlci5cbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWR5bmFtaWMtZGVsZXRlXG4gICAgZGVsZXRlIG9ialtrZXldO1xuICAgIChvYmogYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pW2tleV0gPSB2YWx1ZTtcblxuICAgIC8vIGlmIHZhbHVlIGlzIGFuIG9iamVjdCwgc29ydCB0aGUga2V5cyBvZiB0aGUgb2JqZWN0XG4gICAgaWYgKHZhbHVlICYmIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiYgIUFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgICBzb3J0S2V5cyh2YWx1ZSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPik7XG4gICAgfVxuICB9XG4gIHJldHVybiBvYmo7XG59XG4iLCIvLyBHaXRIdWIgQWN0aW9ucyB2YWx1ZWxlc3MgZXZlbnRzIHN1Y2ggYXMgYHB1bGxfcmVxdWVzdDpgIHJlcXVpcmUgWUFNTCBudWxsIHZhbHVlcy5cbi8vIG94bGludC1kaXNhYmxlIGVzbGludC1wbHVnaW4taW1wb3J0L25vLW5hbWVkLWFzLWRlZmF1bHQtbWVtYmVyIC0tIE5hbWVzcGFjZSBZQU1MIGNhbGxzIG1ha2UgbG9hZC9kdW1wIHVzYWdlIGNsZWFyZXIuXG4vKiBlc2xpbnQtZGlzYWJsZSB1bmljb3JuL25vLW51bGwgKi9cblxuaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IG1lcmdlIGZyb20gJ2RlZXBtZXJnZSc7XG5pbXBvcnQgeWFtbCBmcm9tICdqcy15YW1sJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgY29tYmluZU1lcmdlIH0gZnJvbSAnLi4vdXRpbHMvbWVyZ2VVdGlsLmpzJztcbmltcG9ydCB7IG1vdmVUb0JvdHRvbSwgc29ydEtleXMgfSBmcm9tICcuLi91dGlscy9vYmplY3RVdGlsLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuXG5pbnRlcmZhY2UgV29ya2Zsb3cge1xuICBuYW1lPzogc3RyaW5nO1xuICBvbj86IE9uO1xuICBjb25jdXJyZW5jeT86IENvbmN1cnJlbmN5O1xuICBwZXJtaXNzaW9ucz86IFJlY29yZDxzdHJpbmcsIHN0cmluZz47XG4gIGpvYnM6IFJlY29yZDxzdHJpbmcsIEpvYj47XG59XG5cbmludGVyZmFjZSBDb25jdXJyZW5jeSB7XG4gIGdyb3VwOiBzdHJpbmc7XG4gICdjYW5jZWwtaW4tcHJvZ3Jlc3MnOiBib29sZWFuO1xufVxuXG5pbnRlcmZhY2UgT24ge1xuICAvLyBHaXRIdWIgQWN0aW9ucyB0cmVhdHMgYGV2ZW50OiBudWxsYCBhcyBhIHZhbHVlbGVzcyBldmVudCBtYXBwaW5nLCBlLmcuXG4gIC8vIGBwdWxsX3JlcXVlc3Q6YC4gYHVuZGVmaW5lZGAgd291bGQgb21pdCB0aGUgZXZlbnQgZW50aXJlbHkgd2hlbiBkdW1waW5nIFlBTUwuXG4gIGlzc3Vlcz86IFR5cGVzIHwgbnVsbDtcbiAgcHVsbF9yZXF1ZXN0PzogUHVsbFJlcXVlc3QgfCBudWxsO1xuICBwdWxsX3JlcXVlc3RfdGFyZ2V0PzogVHlwZXMgfCBudWxsO1xuICBwdXNoPzogUHVzaDtcbiAgc2NoZWR1bGU/OiBTY2hlZHVsZVtdO1xuICB3b3JrZmxvd19kaXNwYXRjaD86IG51bGw7XG59XG5cbmludGVyZmFjZSBQdWxsUmVxdWVzdCB7XG4gICdwYXRocy1pZ25vcmUnPzogc3RyaW5nW107XG4gIHR5cGVzPzogc3RyaW5nW107XG59XG5cbmludGVyZmFjZSBQdXNoIHtcbiAgYnJhbmNoZXM6IHN0cmluZ1tdO1xuICAncGF0aHMtaWdub3JlJz86IHN0cmluZ1tdO1xufVxuXG5pbnRlcmZhY2UgU2NoZWR1bGUge1xuICBjcm9uOiBzdHJpbmc7XG59XG5cbmludGVyZmFjZSBUeXBlcyB7XG4gIHR5cGVzOiBzdHJpbmdbXTtcbn1cblxuaW50ZXJmYWNlIEpvYiB7XG4gICdydW5zLW9uJz86IHN0cmluZztcbiAgcGVybWlzc2lvbnM/OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+O1xuICBzdGVwcz86IFN0ZXBbXTtcbiAgdXNlcz86IHN0cmluZztcbiAgaWY/OiBzdHJpbmc7XG4gIHNlY3JldHM/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgd2l0aD86IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xufVxuXG5pbnRlcmZhY2UgU3RlcCB7XG4gIHVzZXM/OiBzdHJpbmc7XG4gIHdpdGg/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgcnVuPzogc3RyaW5nO1xufVxuXG5jb25zdCBwdWJsaWNSZXBvQXV0b2ZpeFdvcmtmbG93OiBXb3JrZmxvdyA9IHtcbiAgbmFtZTogJ2F1dG9maXguY2knLFxuICBvbjoge1xuICAgIHB1bGxfcmVxdWVzdDogbnVsbCxcbiAgICBwdXNoOiB7XG4gICAgICBicmFuY2hlczogWydtYWluJ10sXG4gICAgfSxcbiAgfSxcbiAgcGVybWlzc2lvbnM6IHtcbiAgICBjb250ZW50czogJ3JlYWQnLFxuICB9LFxuICBjb25jdXJyZW5jeToge1xuICAgIGdyb3VwOiAnYXV0b2ZpeC0ke3sgZ2l0aHViLmhlYWRfcmVmIH19JyxcbiAgICAnY2FuY2VsLWluLXByb2dyZXNzJzogdHJ1ZSxcbiAgfSxcbiAgam9iczoge1xuICAgIGF1dG9maXg6IHsgJ3J1bnMtb24nOiAndWJ1bnR1LWxhdGVzdCcgfSxcbiAgfSxcbn07XG5cbmNvbnN0IHByaXZhdGVSZXBvQXV0b2ZpeFdvcmtmbG93OiBXb3JrZmxvdyA9IHtcbiAgbmFtZTogJ0ZpeCBjb2RlIGF1dG9tYXRpY2FsbHknLFxuICBvbjoge1xuICAgIHB1bGxfcmVxdWVzdDogbnVsbCxcbiAgfSxcbiAgY29uY3VycmVuY3k6IHtcbiAgICBncm91cDogJyR7eyBnaXRodWIud29ya2Zsb3cgfX0tJHt7IGdpdGh1Yi5yZWYgfX0nLFxuICAgICdjYW5jZWwtaW4tcHJvZ3Jlc3MnOiB0cnVlLFxuICB9LFxuICBqb2JzOiB7XG4gICAgYXV0b2ZpeDoge1xuICAgICAgdXNlczogJ1dpbGxCb29zdGVyL3JldXNhYmxlLXdvcmtmbG93cy8uZ2l0aHViL3dvcmtmbG93cy9hdXRvZml4LnltbEBtYWluJyxcbiAgICB9LFxuICB9LFxufTtcblxuY29uc3Qgd29ya2Zsb3dzID0ge1xuICB0ZXN0OiB7XG4gICAgbmFtZTogJ1Rlc3QnLFxuICAgIG9uOiB7XG4gICAgICBwdWxsX3JlcXVlc3Q6IG51bGwsXG4gICAgICBwdXNoOiB7XG4gICAgICAgIGJyYW5jaGVzOiBbJ21haW4nLCAnd2JmeSddLFxuICAgICAgfSxcbiAgICB9LFxuICAgIC8vIGNmLiBodHRwczovL2RvY3MuZ2l0aHViLmNvbS9lbi9hY3Rpb25zL3VzaW5nLWpvYnMvdXNpbmctY29uY3VycmVuY3kjZXhhbXBsZS1vbmx5LWNhbmNlbC1pbi1wcm9ncmVzcy1qb2JzLW9yLXJ1bnMtZm9yLXRoZS1jdXJyZW50LXdvcmtmbG93XG4gICAgY29uY3VycmVuY3k6IHtcbiAgICAgIGdyb3VwOiAnJHt7IGdpdGh1Yi53b3JrZmxvdyB9fS0ke3sgZ2l0aHViLnJlZiB9fScsXG4gICAgICAnY2FuY2VsLWluLXByb2dyZXNzJzogdHJ1ZSxcbiAgICB9LFxuICAgIHBlcm1pc3Npb25zOiB7XG4gICAgICAvLyBmb3IgbGludGVyIGZpeFxuICAgICAgY29udGVudHM6ICd3cml0ZScsXG4gICAgfSxcbiAgICBqb2JzOiB7XG4gICAgICB0ZXN0OiB7XG4gICAgICAgIHVzZXM6ICdXaWxsQm9vc3Rlci9yZXVzYWJsZS13b3JrZmxvd3MvLmdpdGh1Yi93b3JrZmxvd3MvdGVzdC55bWxAbWFpbicsXG4gICAgICB9LFxuICAgIH0sXG4gIH0sXG4gIHJlbGVhc2U6IHtcbiAgICBuYW1lOiAnUmVsZWFzZScsXG4gICAgb246IHtcbiAgICAgIHB1c2g6IHtcbiAgICAgICAgYnJhbmNoZXM6IFtdLFxuICAgICAgfSxcbiAgICB9LFxuICAgIGNvbmN1cnJlbmN5OiB7XG4gICAgICBncm91cDogJyR7eyBnaXRodWIud29ya2Zsb3cgfX0nLFxuICAgICAgJ2NhbmNlbC1pbi1wcm9ncmVzcyc6IGZhbHNlLFxuICAgIH0sXG4gICAgcGVybWlzc2lvbnM6IHtcbiAgICAgIC8vIGh0dHBzOi8vZG9jcy5ucG1qcy5jb20vdHJ1c3RlZC1wdWJsaXNoZXJzI3N0ZXAtMi1jb25maWd1cmUteW91ci1jaWNkLXdvcmtmbG93XG4gICAgICAnaWQtdG9rZW4nOiAnd3JpdGUnLFxuICAgICAgLy8gZm9yIHNlbWFudGljLXJlbGVhc2VcbiAgICAgIGNvbnRlbnRzOiAnd3JpdGUnLFxuICAgIH0sXG4gICAgam9iczoge1xuICAgICAgcmVsZWFzZToge1xuICAgICAgICB1c2VzOiAnV2lsbEJvb3N0ZXIvcmV1c2FibGUtd29ya2Zsb3dzLy5naXRodWIvd29ya2Zsb3dzL3JlbGVhc2UueW1sQG1haW4nLFxuICAgICAgfSxcbiAgICB9LFxuICB9LFxuICAnc2VtYW50aWMtcHInOiB7XG4gICAgbmFtZTogJ0xpbnQgUFIgdGl0bGUnLFxuICAgIG9uOiB7XG4gICAgICBwdWxsX3JlcXVlc3RfdGFyZ2V0OiB7XG4gICAgICAgIHR5cGVzOiBbJ29wZW5lZCcsICdlZGl0ZWQnLCAnc3luY2hyb25pemUnXSxcbiAgICAgIH0sXG4gICAgfSxcbiAgICBqb2JzOiB7XG4gICAgICAnc2VtYW50aWMtcHInOiB7XG4gICAgICAgIHVzZXM6ICdXaWxsQm9vc3Rlci9yZXVzYWJsZS13b3JrZmxvd3MvLmdpdGh1Yi93b3JrZmxvd3Mvc2VtYW50aWMtcHIueW1sQG1haW4nLFxuICAgICAgfSxcbiAgICB9LFxuICB9LFxuICBzeW5jOiB7XG4gICAgbmFtZTogJ1N5bmMnLFxuICAgIG9uOiB7fSxcbiAgICBwZXJtaXNzaW9uczoge1xuICAgICAgLy8gZm9yIGNvbW1pdGluZyBjaGFuZ2VzXG4gICAgICBjb250ZW50czogJ3dyaXRlJyxcbiAgICB9LFxuICAgIGpvYnM6IHtcbiAgICAgIHN5bmM6IHsgdXNlczogJ1dpbGxCb29zdGVyL3JldXNhYmxlLXdvcmtmbG93cy8uZ2l0aHViL3dvcmtmbG93cy9zeW5jLnltbEBtYWluJyB9LFxuICAgIH0sXG4gIH0sXG4gICdjbG9zZS1jb21tZW50Jzoge1xuICAgIG5hbWU6ICdBZGQgY2xvc2UgY29tbWVudCcsXG4gICAgb246IHtcbiAgICAgIHB1bGxfcmVxdWVzdDoge1xuICAgICAgICB0eXBlczogWydvcGVuZWQnXSxcbiAgICAgIH0sXG4gICAgfSxcbiAgICBqb2JzOiB7XG4gICAgICAnY2xvc2UtY29tbWVudCc6IHtcbiAgICAgICAgdXNlczogJ1dpbGxCb29zdGVyL3JldXNhYmxlLXdvcmtmbG93cy8uZ2l0aHViL3dvcmtmbG93cy9jbG9zZS1jb21tZW50LnltbEBtYWluJyxcbiAgICAgIH0sXG4gICAgfSxcbiAgfSxcbiAgJ2dlbi1wci1jbGF1ZGUnOiB7XG4gICAgbmFtZTogJ0dlbmVyYXRlIFBSIHdpdGggQ2xhdWRlIENvZGUnLFxuICAgIG9uOiB7XG4gICAgICBpc3N1ZXM6IHtcbiAgICAgICAgdHlwZXM6IFsnbGFiZWxlZCddLFxuICAgICAgfSxcbiAgICAgIHB1bGxfcmVxdWVzdDoge1xuICAgICAgICB0eXBlczogWydsYWJlbGVkJ10sXG4gICAgICB9LFxuICAgIH0sXG4gICAgam9iczoge1xuICAgICAgJ2dlbi1wcic6IHtcbiAgICAgICAgaWY6IFwiY29udGFpbnMoZ2l0aHViLmV2ZW50LmxhYmVsLm5hbWUsICdnZW4tcHItYWxsJykgfHwgY29udGFpbnMoZ2l0aHViLmV2ZW50LmxhYmVsLm5hbWUsICdnZW4tcHItY2xhdWRlJylcIixcbiAgICAgICAgdXNlczogJ1dpbGxCb29zdGVyL3JldXNhYmxlLXdvcmtmbG93cy8uZ2l0aHViL3dvcmtmbG93cy9nZW4tcHIueW1sQG1haW4nLFxuICAgICAgICB3aXRoOiB7XG4gICAgICAgICAgJ2NvZGluZy10b29sJzogJ2NsYXVkZS1jb2RlJyxcbiAgICAgICAgICAnaXNzdWUtbnVtYmVyJzogJyR7eyBnaXRodWIuZXZlbnQuaXNzdWUubnVtYmVyIHx8IGdpdGh1Yi5ldmVudC5udW1iZXIgfX0nLFxuICAgICAgICAgICd0ZXN0LWNvbW1hbmQnOiAneWFybnxidW4gY2hlY2stYWxsLWZvci1haScsXG4gICAgICAgIH0sXG4gICAgICAgIHNlY3JldHM6IHtcbiAgICAgICAgICBDTEFVREVfQ09ERV9PQVVUSF9UT0tFTjogJyR7eyBzZWNyZXRzLkNMQVVERV9DT0RFX09BVVRIX1RPS0VOIH19JyxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgfSxcbiAgfSxcbiAgJ2dlbi1wci1jb2RleCc6IHtcbiAgICBuYW1lOiAnR2VuZXJhdGUgUFIgd2l0aCBDb2RleCBDTEknLFxuICAgIG9uOiB7XG4gICAgICBpc3N1ZXM6IHtcbiAgICAgICAgdHlwZXM6IFsnbGFiZWxlZCddLFxuICAgICAgfSxcbiAgICAgIHB1bGxfcmVxdWVzdDoge1xuICAgICAgICB0eXBlczogWydsYWJlbGVkJ10sXG4gICAgICB9LFxuICAgIH0sXG4gICAgam9iczoge1xuICAgICAgJ2dlbi1wcic6IHtcbiAgICAgICAgaWY6IFwiY29udGFpbnMoZ2l0aHViLmV2ZW50LmxhYmVsLm5hbWUsICdnZW4tcHItYWxsJykgfHwgY29udGFpbnMoZ2l0aHViLmV2ZW50LmxhYmVsLm5hbWUsICdnZW4tcHItY29kZXgnKVwiLFxuICAgICAgICB1c2VzOiAnV2lsbEJvb3N0ZXIvcmV1c2FibGUtd29ya2Zsb3dzLy5naXRodWIvd29ya2Zsb3dzL2dlbi1wci55bWxAbWFpbicsXG4gICAgICAgIHdpdGg6IHtcbiAgICAgICAgICAnY29kaW5nLXRvb2wnOiAnY29kZXgtY2xpJyxcbiAgICAgICAgICAnaXNzdWUtbnVtYmVyJzogJyR7eyBnaXRodWIuZXZlbnQuaXNzdWUubnVtYmVyIHx8IGdpdGh1Yi5ldmVudC5udW1iZXIgfX0nLFxuICAgICAgICAgICd0ZXN0LWNvbW1hbmQnOiAneWFybnxidW4gY2hlY2stYWxsLWZvci1haScsXG4gICAgICAgIH0sXG4gICAgICAgIHNlY3JldHM6IHtcbiAgICAgICAgICBPUEVOQUlfQVBJX0tFWTogJyR7eyBzZWNyZXRzLk9QRU5BSV9BUElfS0VZIH19JyxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgfSxcbiAgfSxcbiAgJ2dlbi1wci1nZW1pbmknOiB7XG4gICAgbmFtZTogJ0dlbmVyYXRlIFBSIHdpdGggR2VtaW5pIENMSScsXG4gICAgb246IHtcbiAgICAgIGlzc3Vlczoge1xuICAgICAgICB0eXBlczogWydsYWJlbGVkJ10sXG4gICAgICB9LFxuICAgICAgcHVsbF9yZXF1ZXN0OiB7XG4gICAgICAgIHR5cGVzOiBbJ2xhYmVsZWQnXSxcbiAgICAgIH0sXG4gICAgfSxcbiAgICBqb2JzOiB7XG4gICAgICAnZ2VuLXByJzoge1xuICAgICAgICBpZjogXCJjb250YWlucyhnaXRodWIuZXZlbnQubGFiZWwubmFtZSwgJ2dlbi1wci1hbGwnKSB8fCBjb250YWlucyhnaXRodWIuZXZlbnQubGFiZWwubmFtZSwgJ2dlbi1wci1nZW1pbmknKVwiLFxuICAgICAgICB1c2VzOiAnV2lsbEJvb3N0ZXIvcmV1c2FibGUtd29ya2Zsb3dzLy5naXRodWIvd29ya2Zsb3dzL2dlbi1wci55bWxAbWFpbicsXG4gICAgICAgIHdpdGg6IHtcbiAgICAgICAgICAnY29kaW5nLXRvb2wnOiAnZ2VtaW5pLWNsaScsXG4gICAgICAgICAgJ2lzc3VlLW51bWJlcic6ICcke3sgZ2l0aHViLmV2ZW50Lmlzc3VlLm51bWJlciB8fCBnaXRodWIuZXZlbnQubnVtYmVyIH19JyxcbiAgICAgICAgICAndGVzdC1jb21tYW5kJzogJ3lhcm58YnVuIGNoZWNrLWFsbC1mb3ItYWknLFxuICAgICAgICB9LFxuICAgICAgICBzZWNyZXRzOiB7XG4gICAgICAgICAgR0VNSU5JX0FQSV9LRVk6ICcke3sgc2VjcmV0cy5HRU1JTklfQVBJX0tFWSB9fScsXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgIH0sXG4gIH0sXG59IGFzIGNvbnN0O1xuXG50eXBlIEtub3duS2luZCA9IGtleW9mIHR5cGVvZiB3b3JrZmxvd3MgfCAnZGVwbG95JyB8ICdhdXRvZml4JztcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlV29ya2Zsb3dzKHJvb3RDb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdnZW5lcmF0ZVdvcmtmbG93JywgYXN5bmMgKCkgPT4ge1xuICAgIGlmIChpc1JldXNhYmxlV29ya2Zsb3dzUmVwbyhyb290Q29uZmlnLnJlcG9zaXRvcnkpKSB7XG4gICAgICAvLyBEb24ndCB0b3VjaCByZXVzYWJsZS13b3JrZmxvd3MgcmVwbyBiZWNhdXNlIGl0IGhvc3RzIHVwc3RyZWFtIHdvcmtmbG93IGRlZmluaXRpb25zLlxuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHdvcmtmbG93c1BhdGggPSBwYXRoLnJlc29sdmUocm9vdENvbmZpZy5kaXJQYXRoLCAnLmdpdGh1YicsICd3b3JrZmxvd3MnKTtcbiAgICBhd2FpdCBmcy5wcm9taXNlcy5ta2Rpcih3b3JrZmxvd3NQYXRoLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcblxuICAgIC8vIFJlbW92ZSBjb25maWcgb2Ygc2VtYW50aWMgcHVsbCByZXF1ZXN0XG4gICAgY29uc3Qgc2VtYW50aWNZbWxQYXRoID0gcGF0aC5yZXNvbHZlKHJvb3RDb25maWcuZGlyUGF0aCwgJy5naXRodWInLCAnc2VtYW50aWMueW1sJyk7XG4gICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzLnByb21pc2VzLnJtKHNlbWFudGljWW1sUGF0aCwgeyBmb3JjZTogdHJ1ZSwgcmVjdXJzaXZlOiB0cnVlIH0pKTtcblxuICAgIGNvbnN0IGVudHJpZXMgPSBhd2FpdCBmcy5wcm9taXNlcy5yZWFkZGlyKHdvcmtmbG93c1BhdGgsIHsgd2l0aEZpbGVUeXBlczogdHJ1ZSB9KTtcbiAgICBjb25zdCBmaWxlTmFtZVNldCA9IG5ldyBTZXQoW1xuICAgICAgJ3Rlc3QueW1sJyxcbiAgICAgICdhdXRvZml4LnltbCcsXG4gICAgICAnc2VtYW50aWMtcHIueW1sJyxcbiAgICAgICdjbG9zZS1jb21tZW50LnltbCcsXG4gICAgICAnZ2VuLXByLWNsYXVkZS55bWwnLFxuICAgICAgJ2dlbi1wci1jb2RleC55bWwnLFxuICAgICAgJ2dlbi1wci1nZW1pbmkueW1sJyxcbiAgICAgIC4uLmVudHJpZXMuZmlsdGVyKChkaXJlbnQpID0+IGRpcmVudC5pc0ZpbGUoKSAmJiBkaXJlbnQubmFtZS5lbmRzV2l0aCgnLnltbCcpKS5tYXAoKGRpcmVudCkgPT4gZGlyZW50Lm5hbWUpLFxuICAgIF0pO1xuICAgIGlmIChyb290Q29uZmlnLmRlcGVuZGluZy5zZW1hbnRpY1JlbGVhc2UpIHtcbiAgICAgIGZpbGVOYW1lU2V0LmFkZCgncmVsZWFzZS55bWwnKTtcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IGZpbGVOYW1lIG9mIGZpbGVOYW1lU2V0KSB7XG4gICAgICAvLyDlrp/pmpvjga9Lbm93bktpbmTku6XlpJbjga7lgKTjgoLku6PlhaXjgZXjgozjgovjgZPjgajjgavms6jmhI9cbiAgICAgIGNvbnN0IGtpbmQgPSBwYXRoLmJhc2VuYW1lKGZpbGVOYW1lLCAnLnltbCcpIGFzIEtub3duS2luZDtcbiAgICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiB3cml0ZVdvcmtmbG93WWFtbChyb290Q29uZmlnLCB3b3JrZmxvd3NQYXRoLCBraW5kKSk7XG4gICAgfVxuICB9KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzUmV1c2FibGVXb3JrZmxvd3NSZXBvKHJlcG9zaXRvcnk/OiBzdHJpbmcpOiBib29sZWFuIHtcbiAgcmV0dXJuIHJlcG9zaXRvcnk/LmVuZHNXaXRoKCcvcmV1c2FibGUtd29ya2Zsb3dzJykgPz8gZmFsc2U7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHdyaXRlV29ya2Zsb3dZYW1sKGNvbmZpZzogUGFja2FnZUNvbmZpZywgd29ya2Zsb3dzUGF0aDogc3RyaW5nLCBraW5kOiBLbm93bktpbmQpOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgZmlsZVBhdGggPSBwYXRoLmpvaW4od29ya2Zsb3dzUGF0aCwgYCR7a2luZH0ueW1sYCk7XG4gIGNvbnN0IGRlcGxveVByb2R1Y3Rpb25Xb3JrZmxvd0V4aXN0cyA9IGZzLmV4aXN0c1N5bmMocGF0aC5qb2luKHdvcmtmbG93c1BhdGgsICdkZXBsb3ktcHJvZHVjdGlvbi55bWwnKSk7XG5cbiAgaWYgKGtpbmQgPT09ICdhdXRvZml4Jykge1xuICAgIGF3YWl0IHdyaXRlWWFtbChnZW5lcmF0ZUF1dG9maXhXb3JrZmxvdyhjb25maWcpLCBmaWxlUGF0aCk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgbGV0IG5ld1NldHRpbmdzID0gc3RydWN0dXJlZENsb25lKGtpbmQgaW4gd29ya2Zsb3dzID8gd29ya2Zsb3dzW2tpbmQgYXMga2V5b2YgdHlwZW9mIHdvcmtmbG93c10gOiB7fSkgYXMgV29ya2Zsb3c7XG5cbiAgdHJ5IHtcbiAgICBjb25zdCBvbGRDb250ZW50ID0gYXdhaXQgZnMucHJvbWlzZXMucmVhZEZpbGUoZmlsZVBhdGgsICd1dGY4Jyk7XG4gICAgY29uc3Qgb2xkU2V0dGluZ3MgPSB5YW1sLmxvYWQob2xkQ29udGVudCkgYXMgV29ya2Zsb3c7XG4gICAgbmV3U2V0dGluZ3MgPSBtZXJnZS5hbGwoW25ld1NldHRpbmdzLCBvbGRTZXR0aW5ncywgbmV3U2V0dGluZ3NdLCB7IGFycmF5TWVyZ2U6IGNvbWJpbmVNZXJnZSB9KSBhcyBXb3JrZmxvdztcbiAgfSBjYXRjaCB7XG4gICAgLy8gZG8gbm90aGluZ1xuICB9XG5cbiAgLy8gU2tpcCBhIGJyb2tlbiB3b3JrZmxvd1xuICBpZiAoISgnam9icycgaW4gbmV3U2V0dGluZ3MpKSByZXR1cm47XG5cbiAgaWYgKGtpbmQuc3RhcnRzV2l0aCgnZGVwbG95JykpIHtcbiAgICBuZXdTZXR0aW5ncyA9IHtcbiAgICAgIC4uLm5ld1NldHRpbmdzLFxuICAgICAgY29uY3VycmVuY3k6IHtcbiAgICAgICAgZ3JvdXA6ICcke3sgZ2l0aHViLndvcmtmbG93IH19JyxcbiAgICAgICAgJ2NhbmNlbC1pbi1wcm9ncmVzcyc6IGZhbHNlLFxuICAgICAgfSxcbiAgICB9O1xuICAgIC8vIE1vdmUgam9icyB0byB0aGUgYm90dG9tXG4gICAgbW92ZVRvQm90dG9tKG5ld1NldHRpbmdzLCAnam9icycpO1xuICAgIGlmIChuZXdTZXR0aW5ncy5vbj8ucHVzaCkge1xuICAgICAgbmV3U2V0dGluZ3Mub24ucHVzaFsncGF0aHMtaWdub3JlJ10gPSBbXG4gICAgICAgIC4uLm5ldyBTZXQoWycqKi5tZCcsICcqKi9kb2NzLyoqJywgLi4uKG5ld1NldHRpbmdzLm9uLnB1c2hbJ3BhdGhzLWlnbm9yZSddID8/IFtdKV0pLFxuICAgICAgXTtcbiAgICB9XG4gIH1cblxuICBpZiAoa2luZCA9PT0gJ3JlbGVhc2UnICYmIG5ld1NldHRpbmdzLmpvYnMucmVsZWFzZSAmJiBkZXBsb3lQcm9kdWN0aW9uV29ya2Zsb3dFeGlzdHMpIHtcbiAgICBuZXdTZXR0aW5ncy5wZXJtaXNzaW9ucyA/Pz0ge307XG4gICAgbmV3U2V0dGluZ3MucGVybWlzc2lvbnMuYWN0aW9ucyA9ICd3cml0ZSc7XG4gICAgbmV3U2V0dGluZ3Muam9icy5yZWxlYXNlLndpdGggPz89IHt9O1xuICAgIG5ld1NldHRpbmdzLmpvYnMucmVsZWFzZS53aXRoLnRyaWdnZXJfZGVwbG95X3dvcmtmbG93ID0gJ2RlcGxveS1wcm9kdWN0aW9uLnltbCc7XG4gIH1cblxuICBsZXQgaXNSZXVzYWJsZVdvcmtmbG93ID0gZmFsc2U7XG4gIGZvciAoY29uc3Qgam9iIG9mIE9iamVjdC52YWx1ZXMobmV3U2V0dGluZ3Muam9icykpIHtcbiAgICAvLyBJZ25vcmUgbm9uLXJldXNhYmxlIHdvcmtmbG93c1xuICAgIGlmICgham9iLnVzZXM/LmluY2x1ZGVzKCcvcmV1c2FibGUtd29ya2Zsb3dzLycpKSBjb250aW51ZTtcblxuICAgIG5vcm1hbGl6ZUpvYihjb25maWcsIGpvYiwga2luZCk7XG4gICAgaXNSZXVzYWJsZVdvcmtmbG93ID0gdHJ1ZTtcbiAgfVxuICBpZiAoIWlzUmV1c2FibGVXb3JrZmxvdykgcmV0dXJuO1xuXG4gIHN3aXRjaCAoa2luZCkge1xuICAgIGNhc2UgJ3JlbGVhc2UnOiB7XG4gICAgICBpZiAobmV3U2V0dGluZ3Mub24/LnNjaGVkdWxlKSB7XG4gICAgICAgIGRlbGV0ZSBuZXdTZXR0aW5ncy5vbi5wdXNoO1xuICAgICAgfSBlbHNlIGlmIChuZXdTZXR0aW5ncy5vbj8ucHVzaCAmJiBjb25maWcucmVsZWFzZS5icmFuY2hlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgIG5ld1NldHRpbmdzLm9uLnB1c2guYnJhbmNoZXMgPSBjb25maWcucmVsZWFzZS5icmFuY2hlcztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIERvbid0IHVzZSByZWxlYXNlLnltbCBpZiByZWxlYXNlIGJyYW5jaCBpcyBub3Qgc3BlY2lmaWVkXG4gICAgICAgIGF3YWl0IGZzLnByb21pc2VzLnJtKHBhdGguam9pbih3b3JrZmxvd3NQYXRoLCAncmVsZWFzZS55bWwnKSwgeyBmb3JjZTogdHJ1ZSB9KTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgaWYgKGNvbmZpZy5pc1B1YmxpY1JlcG8pIHtcbiAgICAgICAgbmV3U2V0dGluZ3MucGVybWlzc2lvbnMgPz89IHt9O1xuICAgICAgICBuZXdTZXR0aW5ncy5wZXJtaXNzaW9uc1snaWQtdG9rZW4nXSA9ICd3cml0ZSc7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBkZWxldGUgbmV3U2V0dGluZ3MucGVybWlzc2lvbnM/LlsnaWQtdG9rZW4nXTtcbiAgICAgIH1cbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgICBjYXNlICd0ZXN0Jzoge1xuICAgICAgLy8gRG9uJ3QgdXNlIGBwYXRocy1pZ25vcmVgIGZvciB0ZXN0IGJlY2F1c2UgR2l0SHViJ3MgQnJhbmNoIFByb3RlY3Rpb24gYW5kIFJ1bGVzZXRzIHJlcXVpcmUgam9iIHJ1bm5pbmcuXG4gICAgICBpZiAobmV3U2V0dGluZ3Mub24/LnB1bGxfcmVxdWVzdCkge1xuICAgICAgICBkZWxldGUgbmV3U2V0dGluZ3Mub24ucHVsbF9yZXF1ZXN0WydwYXRocy1pZ25vcmUnXTtcbiAgICAgIH1cbiAgICAgIGlmIChuZXdTZXR0aW5ncy5vbj8ucHVzaCkge1xuICAgICAgICBkZWxldGUgbmV3U2V0dGluZ3Mub24ucHVzaFsncGF0aHMtaWdub3JlJ107XG4gICAgICAgIG5ld1NldHRpbmdzLm9uLnB1c2guYnJhbmNoZXMgPSBuZXdTZXR0aW5ncy5vbi5wdXNoLmJyYW5jaGVzLmZpbHRlcigoYnJhbmNoKSA9PiBicmFuY2ggIT09ICdyZW5vdmF0ZS8qKicpO1xuICAgICAgfVxuICAgICAgYnJlYWs7XG4gICAgfVxuICAgIC8vIE5vIGRlZmF1bHRcbiAgfVxuICBhd2FpdCB3cml0ZVlhbWwobmV3U2V0dGluZ3MsIGZpbGVQYXRoKTtcblxuICBpZiAoa2luZCA9PT0gJ3N5bmMnKSB7XG4gICAgYXdhaXQgZnMucHJvbWlzZXMucm0ocGF0aC5qb2luKHdvcmtmbG93c1BhdGgsICdzeW5jLWluaXQueW1sJyksIHsgZm9yY2U6IHRydWUgfSk7XG4gICAgaWYgKCFuZXdTZXR0aW5ncy5qb2JzLnN5bmM/LndpdGgpIHJldHVybjtcblxuICAgIC8vIEdlbmVyYXRlIHN5bmMtZm9yY2UueW1sIGJhc2VkIG9uIHN5bmMueW1sIGlmIGl0IGV4aXN0cy5cbiAgICBuZXdTZXR0aW5ncy5qb2JzWydzeW5jLWZvcmNlJ10gPSBuZXdTZXR0aW5ncy5qb2JzLnN5bmM7XG4gICAgY29uc3QgcGFyYW1zID0gbmV3U2V0dGluZ3Muam9icy5zeW5jLndpdGguc3luY19wYXJhbXNfd2l0aG91dF9kZXN0O1xuICAgIGlmICh0eXBlb2YgcGFyYW1zICE9PSAnc3RyaW5nJykgcmV0dXJuO1xuXG4gICAgbmV3U2V0dGluZ3Muam9icy5zeW5jLndpdGguc3luY19wYXJhbXNfd2l0aG91dF9kZXN0ID0gYC0tZm9yY2UgJHtwYXJhbXN9YDtcbiAgICBuZXdTZXR0aW5ncy5uYW1lID0gJ0ZvcmNlIHRvIFN5bmMnO1xuICAgIG5ld1NldHRpbmdzLm9uID0geyB3b3JrZmxvd19kaXNwYXRjaDogbnVsbCB9O1xuICAgIGRlbGV0ZSBuZXdTZXR0aW5ncy5qb2JzLnN5bmM7XG4gICAgYXdhaXQgd3JpdGVZYW1sKG5ld1NldHRpbmdzLCBwYXRoLmpvaW4od29ya2Zsb3dzUGF0aCwgJ3N5bmMtZm9yY2UueW1sJykpO1xuICB9XG59XG5cbmZ1bmN0aW9uIG5vcm1hbGl6ZUpvYihjb25maWc6IFBhY2thZ2VDb25maWcsIGpvYjogSm9iLCBraW5kOiBLbm93bktpbmQpOiB2b2lkIHtcbiAgam9iLndpdGggPz89IHt9O1xuICBqb2Iuc2VjcmV0cyA/Pz0ge307XG4gIC8vIFVzZSB0cnVzdGVkIHB1Ymxpc2hpbmcgaW5zdGVhZCBvZiBOUE1fVE9LRU5cbiAgZGVsZXRlIGpvYi5zZWNyZXRzLk5QTV9UT0tFTjtcblxuICBpZiAoXG4gICAga2luZCA9PT0gJ3Rlc3QnIHx8XG4gICAga2luZCA9PT0gJ3JlbGVhc2UnIHx8XG4gICAga2luZCA9PT0gJ2dlbi1wci1jbGF1ZGUnIHx8XG4gICAga2luZCA9PT0gJ2dlbi1wci1jb2RleCcgfHxcbiAgICBraW5kID09PSAnZ2VuLXByLWdlbWluaSdcbiAgKSB7XG4gICAgam9iLnNlY3JldHMuR0hfVE9LRU4gPSAnJHt7IHNlY3JldHMuR0lUSFVCX1RPS0VOIH19JztcbiAgfVxuXG4gIC8vIFNldCB0ZXN0LWNvbW1hbmQgZm9yIGdlbi1wciB3b3JrZmxvd3MgYmFzZWQgb24gcGFja2FnZSBtYW5hZ2VyXG4gIGlmIChraW5kID09PSAnZ2VuLXByLWNsYXVkZScgfHwga2luZCA9PT0gJ2dlbi1wci1jb2RleCcgfHwga2luZCA9PT0gJ2dlbi1wci1nZW1pbmknKSB7XG4gICAgam9iLndpdGhbJ3Rlc3QtY29tbWFuZCddID0gY29uZmlnLmlzQnVuID8gJ2J1biBydW4gY2hlY2stYWxsLWZvci1haScgOiAneWFybiBjaGVjay1hbGwtZm9yLWFpJztcbiAgfVxuICBpZiAoam9iLnNlY3JldHMuRklSRUJBU0VfVE9LRU4pIHtcbiAgICBqb2Iuc2VjcmV0cy5HQ1BfU0FfS0VZX0pTT05fRk9SX0ZJUkVCQVNFID0gJyR7eyBzZWNyZXRzLkdDUF9TQV9LRVlfSlNPTl9GT1JfRklSRUJBU0UgfX0nO1xuICAgIGRlbGV0ZSBqb2Iuc2VjcmV0cy5GSVJFQkFTRV9UT0tFTjtcbiAgfVxuICBpZiAoXG4gICAgKGpvYi5zZWNyZXRzLkRJU0NPUkRfV0VCSE9PS19VUkwgJiYgKGtpbmQgPT09ICdyZWxlYXNlJyB8fCBraW5kLnN0YXJ0c1dpdGgoJ2RlcGxveScpKSkgfHxcbiAgICAoam9iLndpdGguc2VydmVyX3VybCAmJiBraW5kLnN0YXJ0c1dpdGgoJ2RlcGxveScpKVxuICApIHtcbiAgICBqb2Iuc2VjcmV0cy5ESVNDT1JEX1dFQkhPT0tfVVJMID0gJyR7eyBzZWNyZXRzLkRJU0NPUkRfV0VCSE9PS19VUkxfRk9SX1JFTEVBU0UgfX0nO1xuICB9XG5cbiAgaWYgKGtpbmQgPT09ICdzeW5jJykge1xuICAgIGNvbnN0IHBhcmFtcyA9IGpvYi53aXRoLnN5bmNfcGFyYW1zX3dpdGhvdXRfZGVzdDtcbiAgICBpZiAodHlwZW9mIHBhcmFtcyA9PT0gJ3N0cmluZycpIHtcbiAgICAgIGpvYi53aXRoLnN5bmNfcGFyYW1zX3dpdGhvdXRfZGVzdCA9IHBhcmFtcy5yZXBsYWNlKCdzeW5jICcsICcnKTtcbiAgICB9XG4gIH1cblxuICBpZiAoY29uZmlnLnJlcG9zaXRvcnk/LnN0YXJ0c1dpdGgoJ2dpdGh1YjpXaWxsQm9vc3Rlci8nKSkge1xuICAgIGpvYi51c2VzID0gam9iLnVzZXM/LnJlcGxhY2UoJ1dpbGxCb29zdGVyTGFiLycsICdXaWxsQm9vc3Rlci8nKTtcbiAgfSBlbHNlIGlmIChjb25maWcucmVwb3NpdG9yeT8uc3RhcnRzV2l0aCgnZ2l0aHViOldpbGxCb29zdGVyTGFiLycpKSB7XG4gICAgam9iLnVzZXMgPSBqb2IudXNlcz8ucmVwbGFjZSgnV2lsbEJvb3N0ZXIvJywgJ1dpbGxCb29zdGVyTGFiLycpO1xuICB9XG5cbiAgLy8gUmVtb3ZlIHJlZHVuZGFudCBwYXJhbWV0ZXJzXG4gIGlmIChqb2Iud2l0aC5kb3RfZW52X3BhdGggPT09ICcuZW52Jykge1xuICAgIGRlbGV0ZSBqb2Iud2l0aC5kb3RfZW52X3BhdGg7XG4gIH1cblxuICAvLyBEb24ndCB1c2UgYGZseSBkZXBsb3kgLS1qc29uYCBzaW5jZSBpdCBjYXVzZXMgYW4gZXJyb3JcbiAgaWYgKGtpbmQuc3RhcnRzV2l0aCgnZGVwbG95JykgJiYgam9iLnNlY3JldHMuRkxZX0FQSV9UT0tFTiAmJiB0eXBlb2Ygam9iLndpdGguZGVwbG95X2NvbW1hbmQgPT09ICdzdHJpbmcnKSB7XG4gICAgam9iLndpdGguZGVwbG95X2NvbW1hbmQgPSBqb2Iud2l0aC5kZXBsb3lfY29tbWFuZC5yZXBsYWNlKC9cXHMrLS1qc29uLywgJycpO1xuICB9XG4gIGlmIChjb25maWcuZG9lc0NvbnRhaW5Eb2NrZXJmaWxlICYmICFqb2Iud2l0aC5jaV9sYWJlbCAmJiBraW5kLnN0YXJ0c1dpdGgoJ3Rlc3QnKSkge1xuICAgIGpvYi53aXRoLmNpX2xhYmVsID0gJ2xhcmdlJztcbiAgfVxuICAvLyBCZWNhdXNlIGdpdGh1Yi5ldmVudC5yZXBvc2l0b3J5LnByaXZhdGUgaXMgYWx3YXlzIHRydWUgaWYgam9iIGlzIHNjaGVkdWxlZFxuICBpZiAoa2luZCA9PT0gJ3JlbGVhc2UnIHx8IGtpbmQgPT09ICd0ZXN0JyB8fCBraW5kLnN0YXJ0c1dpdGgoJ2RlcGxveScpKSB7XG4gICAgaWYgKGNvbmZpZy5pc1B1YmxpY1JlcG8pIHtcbiAgICAgIGpvYi53aXRoLmdpdGh1Yl9ob3N0ZWRfcnVubmVyID0gdHJ1ZTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgZGVsZXRlIGpvYi53aXRoLmdpdGh1Yl9ob3N0ZWRfcnVubmVyO1xuICB9XG5cbiAgaWYgKE9iamVjdC5rZXlzKGpvYi53aXRoKS5sZW5ndGggPiAwKSB7XG4gICAgc29ydEtleXMoam9iLndpdGgpO1xuICB9IGVsc2Uge1xuICAgIGRlbGV0ZSBqb2Iud2l0aDtcbiAgfVxuICBpZiAoT2JqZWN0LmtleXMoam9iLnNlY3JldHMpLmxlbmd0aCA+IDApIHtcbiAgICAvLyBNb3ZlIHNlY3JldHMgcHJvcCBhZnRlciB3aXRoIHByb3BcbiAgICBjb25zdCBuZXdTZWNyZXRzID0gc29ydEtleXMoam9iLnNlY3JldHMpO1xuICAgIGRlbGV0ZSBqb2Iuc2VjcmV0cztcbiAgICBqb2Iuc2VjcmV0cyA9IG5ld1NlY3JldHM7XG4gIH0gZWxzZSB7XG4gICAgZGVsZXRlIGpvYi5zZWNyZXRzO1xuICB9XG59XG5cbmZ1bmN0aW9uIGdlbmVyYXRlQXV0b2ZpeFdvcmtmbG93KGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFdvcmtmbG93IHtcbiAgaWYgKCFjb25maWcuaXNQdWJsaWNSZXBvKSB7XG4gICAgcmV0dXJuIHN0cnVjdHVyZWRDbG9uZShwcml2YXRlUmVwb0F1dG9maXhXb3JrZmxvdyk7XG4gIH1cblxuICBjb25zdCBwYWNrYWdlTWFuYWdlciA9IGNvbmZpZy5pc0J1biA/ICdidW4nIDogJ3lhcm4nO1xuICBjb25zdCBzdGVwczogU3RlcFtdID0gW1xuICAgIHsgdXNlczogJ2FjdGlvbnMvY2hlY2tvdXRAdjYnIH0sXG4gICAgeyB1c2VzOiAnYWN0aW9ucy9zZXR1cC1ub2RlQHY2Jywgd2l0aDogeyAnY2hlY2stbGF0ZXN0JzogdHJ1ZSwgJ25vZGUtdmVyc2lvbic6ICdsdHMvKicgfSB9LFxuICAgIC4uLihjb25maWcuaXNCdW4gPyBbeyB1c2VzOiAnb3Zlbi1zaC9zZXR1cC1idW5AdjEnLCB3aXRoOiB7ICdidW4tdmVyc2lvbic6ICdsYXRlc3QnIH0gfV0gOiBbXSksXG4gICAgeyBydW46IGAke3BhY2thZ2VNYW5hZ2VyfSBpbnN0YWxsYCB9LFxuICAgIHsgcnVuOiBgJHtwYWNrYWdlTWFuYWdlcn0gcnVuIGNsZWFudXBgIH0sXG4gIF07XG4gIGlmIChjb25maWcucGFja2FnZUpzb24/LnNjcmlwdHM/LmJ1aWxkKSB7XG4gICAgc3RlcHMucHVzaCh7IHJ1bjogYCR7cGFja2FnZU1hbmFnZXJ9IHJ1biBidWlsZGAgfSk7XG4gIH1cbiAgc3RlcHMucHVzaCh7IHVzZXM6ICdhdXRvZml4LWNpL2FjdGlvbkB2MScgfSk7XG5cbiAgY29uc3QgYXV0b2ZpeFdvcmtmbG93ID0gc3RydWN0dXJlZENsb25lKHB1YmxpY1JlcG9BdXRvZml4V29ya2Zsb3cpO1xuICBjb25zdCBhdXRvZml4Sm9iID0gYXV0b2ZpeFdvcmtmbG93LmpvYnMuYXV0b2ZpeCA/PyB7ICdydW5zLW9uJzogJ3VidW50dS1sYXRlc3QnIH07XG4gIGF1dG9maXhXb3JrZmxvdy5qb2JzLmF1dG9maXggPSB7IC4uLmF1dG9maXhKb2IsIHN0ZXBzIH07XG4gIHJldHVybiBhdXRvZml4V29ya2Zsb3c7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHdyaXRlWWFtbChuZXdTZXR0aW5nczogV29ya2Zsb3csIGZpbGVQYXRoOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgeWFtbFRleHQgPSByZW1vdmVUcmFpbGluZ1NwYWNlcyhcbiAgICB5YW1sLmR1bXAobmV3U2V0dGluZ3MsIHsgbGluZVdpZHRoOiAtMSwgbm9Db21wYXRNb2RlOiB0cnVlLCBzdHlsZXM6IHsgJyEhbnVsbCc6ICdlbXB0eScgfSB9KVxuICApO1xuICBhd2FpdCBmcy5wcm9taXNlcy53cml0ZUZpbGUoZmlsZVBhdGgsIHlhbWxUZXh0KTtcbn1cblxuZnVuY3Rpb24gcmVtb3ZlVHJhaWxpbmdTcGFjZXModGV4dDogc3RyaW5nKTogc3RyaW5nIHtcbiAgLy8ganMteWFtbCBlbWl0cyB2YWx1ZWxlc3MgR2l0SHViIEFjdGlvbnMgZXZlbnRzIGFzIGBldmVudDogYCB3aGVuIHVzaW5nIHRoZSBlbXB0eSBudWxsIHN0eWxlLlxuICByZXR1cm4gdGV4dC5yZXBsYWNlQWxsKC9bIFxcdF0rJC9nbSwgJycpO1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IGZnIGZyb20gJ2Zhc3QtZ2xvYic7XG5cbmltcG9ydCB7IGlzUmV1c2FibGVXb3JrZmxvd3NSZXBvIH0gZnJvbSAnLi4vZ2VuZXJhdG9ycy93b3JrZmxvdy5qcyc7XG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHsgb3B0aW9ucyB9IGZyb20gJy4uL29wdGlvbnMuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBmc1V0aWwgfSBmcm9tICcuLi91dGlscy9mc1V0aWwuanMnO1xuaW1wb3J0IHsgZ2xvYklnbm9yZSB9IGZyb20gJy4uL3V0aWxzL2dsb2JVdGlsLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZml4VHlwb3MocGFja2FnZUNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2ZpeFR5cG9zJywgYXN5bmMgKCkgPT4ge1xuICAgIGlmIChpc1JldXNhYmxlV29ya2Zsb3dzUmVwbyhwYWNrYWdlQ29uZmlnLnJlcG9zaXRvcnkpKSByZXR1cm47XG5cbiAgICBjb25zdCBkaXJQYXRoID0gcGFja2FnZUNvbmZpZy5kaXJQYXRoO1xuICAgIGNvbnN0IGRvY0ZpbGVzID0gYXdhaXQgZmcuZ2xvYignKiovKi5tZCcsIHsgZG90OiB0cnVlLCBjd2Q6IGRpclBhdGgsIGlnbm9yZTogZ2xvYklnbm9yZSB9KTtcbiAgICBpZiAob3B0aW9ucy5pc1ZlcmJvc2UpIHtcbiAgICAgIGNvbnNvbGUuaW5mbyhgRm91bmQgJHtkb2NGaWxlcy5sZW5ndGh9IG1hcmtkb3duIGZpbGVzIGluICR7ZGlyUGF0aH1gKTtcbiAgICB9XG4gICAgZm9yIChjb25zdCBtZEZpbGUgb2YgZG9jRmlsZXMpIHtcbiAgICAgIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5qb2luKGRpclBhdGgsIG1kRmlsZSk7XG4gICAgICB2b2lkIHByb21pc2VQb29sLnJ1bihhc3luYyAoKSA9PiB7XG4gICAgICAgIGNvbnN0IGNvbnRlbnQgPSBhd2FpdCBmcy5wcm9taXNlcy5yZWFkRmlsZShmaWxlUGF0aCwgJ3V0ZjgnKTtcbiAgICAgICAgbGV0IG5ld0NvbnRlbnQgPSBmaXhUeXBvc0luVGV4dChjb250ZW50KTtcbiAgICAgICAgbmV3Q29udGVudCA9IHJlcGxhY2VXaXRoQ29uZmlnKG5ld0NvbnRlbnQsIHBhY2thZ2VDb25maWcsICdkb2MnKTtcbiAgICAgICAgaWYgKGNvbnRlbnQgIT09IG5ld0NvbnRlbnQpIHtcbiAgICAgICAgICBhd2FpdCBmc1V0aWwuZ2VuZXJhdGVGaWxlKGZpbGVQYXRoLCBuZXdDb250ZW50KTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgY29uc3QgdHNGaWxlcyA9IGF3YWl0IGZnLmdsb2IoXG4gICAgICBbXG4gICAgICAgICd7YXBwLHNyYyx0ZXN0LHNjcmlwdHN9LyoqLyoue2NqcyxtanMsanMsanN4LGN0cyxtdHMsdHMsdHN4fScsXG4gICAgICAgICdwYWNrYWdlcy8qKi97YXBwLHNyYyx0ZXN0LHNjcmlwdHN9LyoqLyoue2NqcyxtanMsanMsanN4LGN0cyxtdHMsdHMsdHN4fScsXG4gICAgICBdLFxuICAgICAgeyBkb3Q6IHRydWUsIGN3ZDogZGlyUGF0aCwgaWdub3JlOiBnbG9iSWdub3JlIH1cbiAgICApO1xuICAgIGlmIChvcHRpb25zLmlzVmVyYm9zZSkge1xuICAgICAgY29uc29sZS5pbmZvKGBGb3VuZCAke3RzRmlsZXMubGVuZ3RofSBUeXBlU2NyaXB0IGZpbGVzIGluICR7ZGlyUGF0aH1gKTtcbiAgICB9XG4gICAgZm9yIChjb25zdCB0c0ZpbGUgb2YgdHNGaWxlcykge1xuICAgICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLmpvaW4oZGlyUGF0aCwgdHNGaWxlKTtcbiAgICAgIHZvaWQgcHJvbWlzZVBvb2wucnVuKGFzeW5jICgpID0+IHtcbiAgICAgICAgY29uc3Qgb2xkQ29udGVudCA9IGF3YWl0IGZzLnByb21pc2VzLnJlYWRGaWxlKGZpbGVQYXRoLCAndXRmOCcpO1xuICAgICAgICBsZXQgbmV3Q29udGVudCA9IGZpeFR5cG9zSW5Db2RlKG9sZENvbnRlbnQpO1xuICAgICAgICBuZXdDb250ZW50ID0gcmVwbGFjZVdpdGhDb25maWcobmV3Q29udGVudCwgcGFja2FnZUNvbmZpZywgJ3RzJyk7XG5cbiAgICAgICAgaWYgKG9sZENvbnRlbnQgIT09IG5ld0NvbnRlbnQpIHtcbiAgICAgICAgICBhd2FpdCBmc1V0aWwuZ2VuZXJhdGVGaWxlKGZpbGVQYXRoLCBuZXdDb250ZW50KTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgY29uc3QgdGV4dEJhc2VkRmlsZXMgPSBhd2FpdCBmZy5nbG9iKCcqKi8qLntjc3YsaHRtLGh0bWwsdHN2LHhtbCx5YW1sLHltbH0nLCB7XG4gICAgICBkb3Q6IHRydWUsXG4gICAgICBjd2Q6IGRpclBhdGgsXG4gICAgICBpZ25vcmU6IGdsb2JJZ25vcmUsXG4gICAgfSk7XG4gICAgaWYgKG9wdGlvbnMuaXNWZXJib3NlKSB7XG4gICAgICBjb25zb2xlLmluZm8oYEZvdW5kICR7dGV4dEJhc2VkRmlsZXMubGVuZ3RofSB0ZXh0LWJhc2VkIGZpbGVzIGluICR7ZGlyUGF0aH1gKTtcbiAgICB9XG4gICAgZm9yIChjb25zdCBmaWxlIG9mIHRleHRCYXNlZEZpbGVzKSB7XG4gICAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGguam9pbihkaXJQYXRoLCBmaWxlKTtcbiAgICAgIHZvaWQgcHJvbWlzZVBvb2wucnVuKGFzeW5jICgpID0+IHtcbiAgICAgICAgY29uc3Qgb2xkQ29udGVudCA9IGF3YWl0IGZzLnByb21pc2VzLnJlYWRGaWxlKGZpbGVQYXRoLCAndXRmOCcpO1xuICAgICAgICBsZXQgbmV3Q29udGVudCA9IGZpeFR5cG9zSW5UZXh0KG9sZENvbnRlbnQpO1xuICAgICAgICBuZXdDb250ZW50ID0gcmVwbGFjZVdpdGhDb25maWcobmV3Q29udGVudCwgcGFja2FnZUNvbmZpZywgJ3RleHQnKTtcblxuICAgICAgICBpZiAob2xkQ29udGVudCAhPT0gbmV3Q29udGVudCkge1xuICAgICAgICAgIGF3YWl0IGZzVXRpbC5nZW5lcmF0ZUZpbGUoZmlsZVBhdGgsIG5ld0NvbnRlbnQpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBhd2FpdCBwcm9taXNlUG9vbC5wcm9taXNlQWxsKCk7XG4gIH0pO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZml4VHlwb3NJblRleHQoY29udGVudDogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIGNvbnRlbnRcbiAgICAucmVwbGFjZUFsbCgvXFxiY1xcLmZcXC4oPz1cXHN8JCkvZywgJ2NmLicpXG4gICAgLnJlcGxhY2VBbGwoL1xcYmVnXFwuKD89XFxzfCQpL2csICdlLmcuJylcbiAgICAucmVwbGFjZUFsbCgvXFxiaWVcXC4oPz1cXHMpL2csICdpLmUuJyk7XG59XG5cbmZ1bmN0aW9uIGZpeFR5cG9zSW5Db2RlKGNvbnRlbnQ6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiBjb250ZW50XG4gICAgLnJlcGxhY2VBbGwoL1xcL1xcKltcXHNcXFNdKj9cXCpcXC8vZywgKGNvbW1lbnQpID0+IGZpeFR5cG9zSW5UZXh0KGNvbW1lbnQpKVxuICAgIC5yZXBsYWNlQWxsKC8oXnxcXHMpXFwvXFwvKC4qPyljXFwuZlxcLi9nLCAnJDEvLyQyY2YuJylcbiAgICAucmVwbGFjZUFsbCgvKF58XFxzKVxcL1xcLyguKj8pZWdcXC4vZywgJyQxLy8kMmUuZy4nKVxuICAgIC5yZXBsYWNlQWxsKC8oXnxcXHMpXFwvXFwvKC4qPylpZVxcLi9nLCAnJDEvLyQyaS5lLicpO1xufVxuXG5mdW5jdGlvbiByZXBsYWNlV2l0aENvbmZpZyhuZXdDb250ZW50OiBzdHJpbmcsIHBhY2thZ2VDb25maWc6IFBhY2thZ2VDb25maWcsIHByb3BOYW1lOiAnZG9jJyB8ICd0cycgfCAndGV4dCcpOiBzdHJpbmcge1xuICBmb3IgKGNvbnN0IFtiZWZvcmUsIGFmdGVyXSBvZiBPYmplY3QuZW50cmllcyhwYWNrYWdlQ29uZmlnLndiZnlKc29uPy50eXBvcz8uYWxsID8/IHt9KSkge1xuICAgIG5ld0NvbnRlbnQgPSBuZXdDb250ZW50LnJlcGxhY2VBbGwoYmVmb3JlLCBhZnRlcik7XG4gIH1cbiAgZm9yIChjb25zdCBbYmVmb3JlLCBhZnRlcl0gb2YgT2JqZWN0LmVudHJpZXMocGFja2FnZUNvbmZpZy53YmZ5SnNvbj8udHlwb3M/Lltwcm9wTmFtZV0gPz8ge30pKSB7XG4gICAgbmV3Q29udGVudCA9IG5ld0NvbnRlbnQucmVwbGFjZUFsbChiZWZvcmUsIGFmdGVyKTtcbiAgfVxuICByZXR1cm4gbmV3Q29udGVudDtcbn1cbiIsImltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGZzVXRpbCB9IGZyb20gJy4uL3V0aWxzL2ZzVXRpbC5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlQWdlbnRJbnN0cnVjdGlvbnMocm9vdENvbmZpZzogUGFja2FnZUNvbmZpZywgYWxsQ29uZmlnczogUGFja2FnZUNvbmZpZ1tdKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZ2VuZXJhdGVBZ2VudEluc3RydWN0aW9ucycsIGFzeW5jICgpID0+IHtcbiAgICBpZiAoIXJvb3RDb25maWcuaXNSb290KSByZXR1cm47XG5cbiAgICAvLyBDaGVjayBpZiBBR0VOVFNfRVhUUkEubWQgZXhpc3RzIGFuZCByZWFkIGl0cyBjb250ZW50XG4gICAgY29uc3QgYWdlbnRzRXh0cmFQYXRoID0gcGF0aC5yZXNvbHZlKHJvb3RDb25maWcuZGlyUGF0aCwgJ0FHRU5UU19FWFRSQS5tZCcpO1xuICAgIGNvbnN0IGV4dHJhQ29udGVudCA9IGF3YWl0IGZzVXRpbC5yZWFkRmlsZUlnbm9yaW5nRXJyb3IoYWdlbnRzRXh0cmFQYXRoKTtcblxuICAgIGZvciAoY29uc3QgW2ZpbGVOYW1lLCB0b29sTmFtZV0gb2YgW1xuICAgICAgWydBR0VOVFMubWQnLCAnQ29kZXggQ0xJJ10sXG4gICAgICBbJ0NMQVVERS5tZCcsICdDbGF1ZGUgQ29kZSddLFxuICAgICAgWydHRU1JTkkubWQnLCAnR2VtaW5pIENMSSddLFxuICAgIF0gYXMgY29uc3QpIHtcbiAgICAgIGNvbnN0IGNvbnRlbnQgPSBnZW5lcmF0ZUFnZW50SW5zdHJ1Y3Rpb24ocm9vdENvbmZpZywgYWxsQ29uZmlncywgdG9vbE5hbWUsIGV4dHJhQ29udGVudCk7XG4gICAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShyb290Q29uZmlnLmRpclBhdGgsIGZpbGVOYW1lKTtcbiAgICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiBmc1V0aWwuZ2VuZXJhdGVGaWxlKGZpbGVQYXRoLCBjb250ZW50KSk7XG4gICAgfVxuXG4gICAgY29uc3QgY3Vyc29yUnVsZXNQYXRoID0gcGF0aC5yZXNvbHZlKHJvb3RDb25maWcuZGlyUGF0aCwgJy5jdXJzb3IvcnVsZXMvZ2VuZXJhbC5tZGMnKTtcbiAgICBjb25zdCBjdXJzb3JSdWxlc0NvbnRlbnQgPSBnZW5lcmF0ZUN1cnNvckdlbmVyYWxNZGNDb250ZW50KHJvb3RDb25maWcsIGFsbENvbmZpZ3MsIGV4dHJhQ29udGVudCk7XG4gICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzVXRpbC5nZW5lcmF0ZUZpbGUoY3Vyc29yUnVsZXNQYXRoLCBjdXJzb3JSdWxlc0NvbnRlbnQpKTtcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIGdlbmVyYXRlQ3Vyc29yR2VuZXJhbE1kY0NvbnRlbnQoXG4gIGNvbmZpZzogUGFja2FnZUNvbmZpZyxcbiAgYWxsQ29uZmlnczogUGFja2FnZUNvbmZpZ1tdLFxuICBleHRyYUNvbnRlbnQ/OiBzdHJpbmdcbik6IHN0cmluZyB7XG4gIGNvbnN0IGZyb250bWF0dGVyID0gYC0tLVxcbmRlc2NyaXB0aW9uOiBHZW5lcmFsIENvZGluZyBSdWxlc1xcbmdsb2JzOlxcbmFsd2F5c0FwcGx5OiB0cnVlXFxuLS0tYDtcbiAgY29uc3QgYm9keSA9IGdlbmVyYXRlQWdlbnRJbnN0cnVjdGlvbihjb25maWcsIGFsbENvbmZpZ3MsICdDdXJzb3InLCBleHRyYUNvbnRlbnQpO1xuICByZXR1cm4gYCR7ZnJvbnRtYXR0ZXJ9XFxuXFxuJHtib2R5fWA7XG59XG5cbmZ1bmN0aW9uIGdlbmVyYXRlQWdlbnRJbnN0cnVjdGlvbihcbiAgcm9vdENvbmZpZzogUGFja2FnZUNvbmZpZyxcbiAgYWxsQ29uZmlnczogUGFja2FnZUNvbmZpZ1tdLFxuICB0b29sTmFtZTogc3RyaW5nLFxuICBleHRyYUNvbnRlbnQ/OiBzdHJpbmdcbik6IHN0cmluZyB7XG4gIGNvbnN0IHBhY2thZ2VNYW5hZ2VyID0gcm9vdENvbmZpZy5pc0J1biA/ICdidW4nIDogJ3lhcm4nO1xuICBjb25zdCBiYXNlQ29udGVudCA9IGBcbiMjIFByb2plY3QgSW5mb3JtYXRpb25cblxuLSBOYW1lOiBcXGAke3Jvb3RDb25maWcucGFja2FnZUpzb24/Lm5hbWUgfHwgJ3Vua25vd24nfVxcYFxuLSBEZXNjcmlwdGlvbjogJHtyb290Q29uZmlnLnBhY2thZ2VKc29uPy5kZXNjcmlwdGlvbn1cbi0gUGFja2FnZSBNYW5hZ2VyOiAke3BhY2thZ2VNYW5hZ2VyfVxuXG4jIyBHZW5lcmFsIEluc3RydWN0aW9uc1xuXG4tIENyZWF0ZSBhIG5ldyBicmFuY2ggaWYgdGhlIGN1cnJlbnQgYnJhbmNoIGlzIFxcYG1haW5cXGAuXG4tIFJ1biBhbnkgXFxgZ2l0XFxgIGNvbW1hbmRzIHNlcXVlbnRpYWxseS5cbi0gV3JpdGUgdGVzdHMgT05MWSBpZiBleHBsaWNpdGx5IHJlcXVlc3RlZC4gSWYgcmVxdWVzdGVkLCBmb2xsb3cgdGhlc2UgcnVsZXM6XG4gIC0gQ29udGludWUgbW9kaWZ5aW5nIHRoZSB0ZXN0cyBhbmQgY29kZSB1bnRpbCBhbGwgdGVzdHMgcGFzcy5cbiAgLSBFbnN1cmUgdGVzdHMgcmVzZXQgYW55IHJlbGF0ZWQgcGVyc2lzdGVudCBkYXRhLCBhcyBvdXIgdGVzdCBpbmZyYXN0cnVjdHVyZSBkb2VzIG5vdCBjbGVhciBpdCBhdXRvbWF0aWNhbGx5LlxuICAtIFByZWZlciBhY3R1YWwgQVBJIGNhbGxzIG92ZXIgbW9ja3MuIFVzZSBtb2NrcyB3aGVuIGFjdHVhbCBjYWxscyBhcmUgaW1wcmFjdGljYWwsIGhhdmUgdW5pbnRlbmRlZCBzaWRlIGVmZmVjdHMsIG9yIGFyZSBleHBsaWNpdGx5IHJlcXVlc3RlZC5cbiAgLSBBbHdheXMgaW52ZXN0aWdhdGUgdGhlIHJvb3QgY2F1c2Ugb2YgYSB0ZXN0IGZhaWx1cmUgYmVmb3JlIGZpeGluZyBpdC5cbiAgLSBBdm9pZCBhZGRpbmcgd2FpdCBmdW5jdGlvbnMgaW4gRTJFIHRlc3RzIHVubGVzcyB5b3UgYXJlIGNvbmZpZGVudCB0aGV5IGFyZSBuZWNlc3NhcnkuXG4tIFdoZW4gZml4aW5nIGlzc3VlcywgZm9sbG93IHRoZXNlIHJ1bGVzOlxuICAtIEludmVzdGlnYXRlIHRoZSByb290IGNhdXNlIGZpcnN0IChlLmcuLCBieSBnYXRoZXJpbmcgZGVidWcgbG9ncywgdGFraW5nIHNjcmVlbnNob3RzLCBldGMuKS5cbiAgLSBGaXggdGhlIGFjdHVhbCByb290IGNhdXNlIGluc3RlYWQgb2YgYXBwbHlpbmcgd29ya2Fyb3VuZHMuXG4tIEFmdGVyIG1ha2luZyBjb2RlIGNoYW5nZXMsIHJ1biBcXGAke3BhY2thZ2VNYW5hZ2VyfSBjaGVjay1hbGwtZm9yLWFpXFxgIHRvIGV4ZWN1dGUgYWxsIHRlc3RzICh0YWtlcyB1cCB0byAxIGhvdXIpLCBvciBcXGAke3BhY2thZ2VNYW5hZ2VyfSBjaGVjay1mb3ItYWlcXGAgZm9yIG9ubHkgdHlwZSBjaGVja2luZyBhbmQgbGludGluZyAodGFrZXMgdXAgdG8gMTAgbWludXRlcykuXG4gIC0gSWYgeW91IGFyZSBjb25maWRlbnQgdGhhdCB5b3VyIGNoYW5nZXMgd2lsbCBub3QgYnJlYWsgYW55IHRlc3RzLCB5b3UgbWF5IHVzZSBcXGBjaGVjay1mb3ItYWlcXGAuXG4gIC0gVXNlIFxcYG94bGludFxcYCBpZ25vcmUgY29tbWVudHMgd2l0aCByZWFzb25zIChlLmcuLCBcXGAvLyBveGxpbnQtZGlzYWJsZS1uZXh0LWxpbmUgPHJ1bGU+IC0tIDxyZWFzb24+XFxgKSBpZiBsaW50IGVycm9ycyBvciB3YXJuaW5ncyBjYW5ub3QgYmUgZml4ZWQuXG4tIE9uY2UgeW91IGhhdmUgdmVyaWZpZWQgeW91ciBjaGFuZ2VzLCBjb21taXQgYW5kIHB1c2ggdGhlbSB0byB0aGUgY3VycmVudCAobm9uLW1haW4pIGJyYW5jaCwgdGhlbiBjcmVhdGUgYSBQUiB2aWEgXFxgZ2hcXGAuXG4gIC0gRm9sbG93IHRoZSBjb252ZW50aW9uYWwgY29tbWl0czsgeW91ciBjb21taXQgbWVzc2FnZSBzaG91bGQgc3RhcnQgd2l0aCBcXGBmZWF0OlxcYCwgXFxgZml4OlxcYCwgZXRjLlxuICAtIElmIG5vdCBzcGVjaWZpZWQsIG1ha2Ugc3VyZSB0byBhZGQgYSBuZXcgbGluZSBhdCB0aGUgZW5kIG9mIHlvdXIgY29tbWl0IG1lc3NhZ2Uke3Jvb3RDb25maWcuaXNXaWxsQm9vc3RlclJlcG8gPyBgIHdpdGg6IFxcYENvLWF1dGhvcmVkLWJ5OiBXaWxsQm9vc3RlciAoJHt0b29sTmFtZX0pIDxhZ2VudEB3aWxsYm9vc3Rlci5jb20+XFxgYCA6ICcnfS5cbiAgLSBBbHdheXMgY3JlYXRlIG5ldyBjb21taXRzLiBBdm9pZCB1c2luZyBcXGAtLWFtZW5kXFxgLlxuLSBBbHdheXMgdXNlIGhlcmVkb2Mgc3ludGF4IHdoZW4gcGFzc2luZyBtdWx0aS1saW5lIGNvbnRlbnQgdG8gYW55IGNvbW1hbmQuXG4ke1xuICBhbGxDb25maWdzLnNvbWUoKGMpID0+IGMuaGFzU3RhcnRUZXN0U2VydmVyKVxuICAgID8gYC0gVXNlIFxcYCR7cGFja2FnZU1hbmFnZXJ9IHJ1biBzdGFydC10ZXN0LXNlcnZlclxcYCB0byBsYXVuY2ggYSB3ZWIgc2VydmVyIGZvciBkZWJ1Z2dpbmcgb3IgdGVzdGluZy5gXG4gICAgOiAnJ1xufVxuXG4ke2dlbmVyYXRlQWdlbnRDb2RpbmdTdHlsZShhbGxDb25maWdzKX1cbmBcbiAgICAucmVwbGFjZUFsbCgvXFwuXFxuXFxuKy0vZywgJy5cXG4tJylcbiAgICAucmVwbGFjZUFsbCgvXFxuezMsfS9nLCAnXFxuXFxuJylcbiAgICAudHJpbSgpO1xuXG4gIGNvbnN0IGhhc05ld1NlY3Rpb24gPSBleHRyYUNvbnRlbnQ/LnRyaW0oKS5zdGFydHNXaXRoKCcjJyk7XG4gIGNvbnN0IG5vcm1hbGl6ZWRFeHRyYUNvbnRlbnQgPSBleHRyYUNvbnRlbnRcbiAgICA/IGhhc05ld1NlY3Rpb25cbiAgICAgID8gJ1xcblxcbicgKyBleHRyYUNvbnRlbnQudHJpbSgpXG4gICAgICA6ICdcXG4nICsgZXh0cmFDb250ZW50XG4gICAgOiAnJztcbiAgcmV0dXJuIGJhc2VDb250ZW50ICsgbm9ybWFsaXplZEV4dHJhQ29udGVudDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdlbmVyYXRlQWdlbnRDb2RpbmdTdHlsZShhbGxDb25maWdzOiBQYWNrYWdlQ29uZmlnW10pOiBzdHJpbmcge1xuICAvLyBLZWVwIHRvcC1kb3duIG9yZGVyaW5nIGd1aWRhbmNlIGZ1bmN0aW9uLW9ubHkgYmVjYXVzZSBjbGFzc2VzIGFyZSBub3QgaG9pc3RlZCBhbmQgY2FuIGZhaWwgd2hlbiBpbmhlcml0YW5jZSBvciB0b3AtbGV2ZWwgaW5zdGFudGlhdGlvbiBkZXBlbmRzIG9uIGRlY2xhcmF0aW9uIG9yZGVyLlxuICByZXR1cm4gYFxuIyMgQ29kaW5nIFN0eWxlXG5cbi0gVXNlIGNhbWVsQ2FzZSBmb3IgSmF2YVNjcmlwdCBhbmQgVHlwZVNjcmlwdCBmaWxlcyAob3IgUGFzY2FsQ2FzZSBmb3IgUmVhY3QgY29tcG9uZW50cykuXG4tIFNpbXBsaWZ5IGNvZGUgYXMgbXVjaCBhcyBwb3NzaWJsZSB0byBlbGltaW5hdGUgcmVkdW5kYW5jeS5cbi0gRGVzaWduIGVhY2ggbW9kdWxlIHdpdGggaGlnaCBjb2hlc2lvbiwgZ3JvdXBpbmcgcmVsYXRlZCBmdW5jdGlvbmFsaXR5IHRvZ2V0aGVyLlxuICAtIFJlZmFjdG9yIGV4aXN0aW5nIGxhcmdlIG1vZHVsZXMgaW50byBzbWFsbGVyLCBmb2N1c2VkIG1vZHVsZXMgd2hlbiBuZWNlc3NhcnkuXG4gIC0gQ3JlYXRlIHdlbGwtb3JnYW5pemVkIGRpcmVjdG9yeSBzdHJ1Y3R1cmVzIHdpdGggbG93IGNvdXBsaW5nIGFuZCBoaWdoIGNvaGVzaW9uLlxuLSBQbGFjZSBjYWxsaW5nIGZ1bmN0aW9ucyBpbiB0aGUgZmlsZSBhYm92ZSB0aGUgZnVuY3Rpb25zIHRoZXkgY2FsbCB0byBtYWludGFpbiBhIGNsZWFyIHRvcC1kb3duIG9yZGVyLlxuICAtIGUuZy4gXFxgZnVuY3Rpb24gY2FsbGVyKCkgeyBjYWxsZWUoKTsgfSBmdW5jdGlvbiBjYWxsZWUoKSB7IC4uLiB9XFxgXG4tIFdyaXRlIGNvbW1lbnRzIHRoYXQgZXhwbGFpbiBcIndoeVwiIHJhdGhlciB0aGFuIFwid2hhdFwiLiBBdm9pZCBzdGF0aW5nIHdoYXQgY2FuIGJlIHVuZGVyc3Rvb2QgZnJvbSB0aGUgY29kZSBpdHNlbGYuXG4tIFByZWZlciBcXGB1bmRlZmluZWRcXGAgb3ZlciBcXGBudWxsXFxgIHVubGVzcyBleHBsaWNpdGx5IHJlcXVpcmVkIGJ5IEFQSXMgb3IgbGlicmFyaWVzLlxuLSBQcmVmZXIgdXNpbmcgYSBzaW5nbGUgdGVtcGxhdGUgbGl0ZXJhbCBmb3IgcHJvbXB0cyBpbnN0ZWFkIG9mIFxcYGpvaW4oKVxcYCB3aXRoIGFuIGFycmF5IG9mIHN0cmluZ3MuXG4ke1xuICBhbGxDb25maWdzLnNvbWUoKGMpID0+IGMuZGVwZW5kaW5nLmdlbkkxOG5UcylcbiAgICA/IGAtIFdoZW4gaW50cm9kdWNpbmcgbmV3IHN0cmluZyBsaXRlcmFscyBpbiBSZWFjdCBjb21wb25lbnRzLCB1cGRhdGUgdGhlIGxhbmd1YWdlIHJlc291cmNlIGZpbGVzIGluIHRoZSBcXGBpMThuXFxgIGRpcmVjdG9yeSAoZS5nLiwgXFxgaTE4bi9qYS1KUC5qc29uXFxgKS4gUmVmZXJlbmNlIHRoZXNlIHN0cmluZ3MgdXNpbmcgdGhlIFxcYGkxOG5cXGAgdXRpbGl0eS4gRm9yIGV4YW1wbGUsIHVzZSBcXGBpMThuLnBhZ2VzLmhvbWUudGl0bGUoKVxcYCBmb3IgXFxgeyBcInBhZ2VzXCI6IHsgXCJob21lXCI6IHsgXCJ0aXRsZVwiOiBcIk15IEFwcFwiIH0gfSB9XFxgLmBcbiAgICA6ICcnXG59XG4ke1xuICBhbGxDb25maWdzLnNvbWUoKGMpID0+IGMuZGVwZW5kaW5nLnJlYWN0IHx8IGMuZGVwZW5kaW5nLm5leHQpXG4gICAgPyBgLSBQcmVmZXIgXFxgdXNlSW1tZXJcXGAgZm9yIHN0b3JpbmcgYW4gYXJyYXkgb3IgYW4gb2JqZWN0IHRvIFxcYHVzZVN0YXRlXFxgLmBcbiAgICA6ICcnXG59XG4ke1xuICBhbGxDb25maWdzLnNvbWUoKGMpID0+IGMuZGVwZW5kaW5nLm5leHQpXG4gICAgPyBgXG4tIFNpbmNlIHRoaXMgcHJvamVjdCB1c2VzIHRoZSBSZWFjdCBDb21waWxlciwgeW91IGRvIG5vdCBuZWVkIHRvIHVzZSBcXGB1c2VDYWxsYmFja1xcYCBvciBcXGB1c2VNZW1vXFxgIGZvciBwZXJmb3JtYW5jZSBvcHRpbWl6YXRpb24uXG4tIEFzc3VtZSB0aGVyZSBpcyBvbmx5IGEgc2luZ2xlIHNlcnZlciBpbnN0YW5jZS5cbmBcbiAgICA6ICcnXG59XG5gXG4gICAgLnJlcGxhY2VBbGwoL1xcLlxcblxcbistL2csICcuXFxuLScpXG4gICAgLnJlcGxhY2VBbGwoL1xcbnszLH0vZywgJ1xcblxcbicpXG4gICAgLnRyaW0oKTtcbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB7IHBhcnNlIH0gZnJvbSAnc21vbC10b21sJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZnNVdGlsIH0gZnJvbSAnLi4vdXRpbHMvZnNVdGlsLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuXG5pbnRlcmZhY2UgQnVuZmlnVG9tbCB7XG4gIGluc3RhbGw/OiB7XG4gICAgZXhhY3Q/OiBib29sZWFuO1xuICB9O1xuICBydW4/OiB7XG4gICAgYnVuPzogYm9vbGVhbjtcbiAgfTtcbn1cblxuY29uc3QgbWluaW11bVJlbGVhc2VBZ2VFeGNsdWRlcyA9IFtcbiAgLy8gLS0tLS0tLS0tLSBTVEFSVDogV2UgYmVsaWV2ZSBvdXIgcGFja2FnZXMgYXJlIHNhZmUgLS0tLS0tLS0tLVxuICAnQGV4ZXJjb2RlL3Byb2JsZW0tdXRpbHMnLFxuICAnQHdpbGxib29zdGVyL2FnZW50LXNraWxscycsXG4gICdAd2lsbGJvb3N0ZXIvYmFiZWwtY29uZmlncycsXG4gICdAd2lsbGJvb3N0ZXIvbW9uYWNvLWxvYWRlcicsXG4gICdAd2lsbGJvb3N0ZXIvbW9uYWNvLXJlYWN0JyxcbiAgJ0B3aWxsYm9vc3Rlci9veGZtdC1jb25maWcnLFxuICAnQHdpbGxib29zdGVyL294bGludC1jb25maWcnLFxuICAnQHdpbGxib29zdGVyL3ByZXR0aWVyLWNvbmZpZycsXG4gICdAd2lsbGJvb3N0ZXIvcmVub3ZhdGUtY29uZmlnJyxcbiAgJ0B3aWxsYm9vc3Rlci9zaGFyZWQtbGliJyxcbiAgJ0B3aWxsYm9vc3Rlci9zaGFyZWQtbGliLWJsaXR6LW5leHQnLFxuICAnQHdpbGxib29zdGVyL3NoYXJlZC1saWItbmV4dCcsXG4gICdAd2lsbGJvb3N0ZXIvc2hhcmVkLWxpYi1ub2RlJyxcbiAgJ0B3aWxsYm9vc3Rlci9zaGFyZWQtbGliLXJlYWN0JyxcbiAgJ0B3aWxsYm9vc3Rlci93YicsXG4gICdhZ2VudC1ydW50aW1lLWtpdCcsXG4gICdhdC1kZWNvcmF0b3JzJyxcbiAgJ2J1aWxkLXRzJyxcbiAgJ2dlbi1pMThuLXRzJyxcbiAgJ29uZS13YXktZ2l0LXN5bmMnLFxuICAvLyAtLS0tLS0tLS0tIEVORDogV2UgYmVsaWV2ZSBvdXIgcGFja2FnZXMgYXJlIHNhZmUgLS0tLS0tLS0tLVxuXG4gIC8vIHdiZnkgcGlucyB0aGVzZSB0b29saW5nIHBhY2thZ2VzIGFuZCBtYXkgYXBwbHkgdGhlbSBpbW1lZGlhdGVseSBhZnRlciBhXG4gIC8vIHJlbGVhc2UsIGJlZm9yZSB0aGUgZ2xvYmFsIG1pbmltdW0tcmVsZWFzZS1hZ2Ugd2luZG93IGhhcyBlbGFwc2VkLlxuICAnQHR5cGVzY3JpcHQvbmF0aXZlLXByZXZpZXcnLFxuICAnQHR5cGVzY3JpcHQvbmF0aXZlLXByZXZpZXctZGFyd2luLWFybTY0JyxcbiAgJ0B0eXBlc2NyaXB0L25hdGl2ZS1wcmV2aWV3LWRhcndpbi14NjQnLFxuICAnQHR5cGVzY3JpcHQvbmF0aXZlLXByZXZpZXctbGludXgtYXJtJyxcbiAgJ0B0eXBlc2NyaXB0L25hdGl2ZS1wcmV2aWV3LWxpbnV4LWFybTY0JyxcbiAgJ0B0eXBlc2NyaXB0L25hdGl2ZS1wcmV2aWV3LWxpbnV4LXg2NCcsXG4gICdAdHlwZXNjcmlwdC9uYXRpdmUtcHJldmlldy13aW4zMi1hcm02NCcsXG4gICdAdHlwZXNjcmlwdC9uYXRpdmUtcHJldmlldy13aW4zMi14NjQnLFxuICAnb3hmbXQnLFxuICAnQG94Zm10L2JpbmRpbmctYW5kcm9pZC1hcm0tZWFiaScsXG4gICdAb3hmbXQvYmluZGluZy1hbmRyb2lkLWFybTY0JyxcbiAgJ0BveGZtdC9iaW5kaW5nLWRhcndpbi1hcm02NCcsXG4gICdAb3hmbXQvYmluZGluZy1kYXJ3aW4teDY0JyxcbiAgJ0BveGZtdC9iaW5kaW5nLWZyZWVic2QteDY0JyxcbiAgJ0BveGZtdC9iaW5kaW5nLWxpbnV4LWFybS1nbnVlYWJpaGYnLFxuICAnQG94Zm10L2JpbmRpbmctbGludXgtYXJtLW11c2xlYWJpaGYnLFxuICAnQG94Zm10L2JpbmRpbmctbGludXgtYXJtNjQtZ251JyxcbiAgJ0BveGZtdC9iaW5kaW5nLWxpbnV4LWFybTY0LW11c2wnLFxuICAnQG94Zm10L2JpbmRpbmctbGludXgtcHBjNjQtZ251JyxcbiAgJ0BveGZtdC9iaW5kaW5nLWxpbnV4LXJpc2N2NjQtZ251JyxcbiAgJ0BveGZtdC9iaW5kaW5nLWxpbnV4LXJpc2N2NjQtbXVzbCcsXG4gICdAb3hmbXQvYmluZGluZy1saW51eC1zMzkweC1nbnUnLFxuICAnQG94Zm10L2JpbmRpbmctbGludXgteDY0LWdudScsXG4gICdAb3hmbXQvYmluZGluZy1saW51eC14NjQtbXVzbCcsXG4gICdAb3hmbXQvYmluZGluZy1vcGVuaGFybW9ueS1hcm02NCcsXG4gICdAb3hmbXQvYmluZGluZy13aW4zMi1hcm02NC1tc3ZjJyxcbiAgJ0BveGZtdC9iaW5kaW5nLXdpbjMyLWlhMzItbXN2YycsXG4gICdAb3hmbXQvYmluZGluZy13aW4zMi14NjQtbXN2YycsXG4gICdveGxpbnQnLFxuICAnQG94bGludC9iaW5kaW5nLWFuZHJvaWQtYXJtLWVhYmknLFxuICAnQG94bGludC9iaW5kaW5nLWFuZHJvaWQtYXJtNjQnLFxuICAnQG94bGludC9iaW5kaW5nLWRhcndpbi1hcm02NCcsXG4gICdAb3hsaW50L2JpbmRpbmctZGFyd2luLXg2NCcsXG4gICdAb3hsaW50L2JpbmRpbmctZnJlZWJzZC14NjQnLFxuICAnQG94bGludC9iaW5kaW5nLWxpbnV4LWFybS1nbnVlYWJpaGYnLFxuICAnQG94bGludC9iaW5kaW5nLWxpbnV4LWFybS1tdXNsZWFiaWhmJyxcbiAgJ0BveGxpbnQvYmluZGluZy1saW51eC1hcm02NC1nbnUnLFxuICAnQG94bGludC9iaW5kaW5nLWxpbnV4LWFybTY0LW11c2wnLFxuICAnQG94bGludC9iaW5kaW5nLWxpbnV4LXBwYzY0LWdudScsXG4gICdAb3hsaW50L2JpbmRpbmctbGludXgtcmlzY3Y2NC1nbnUnLFxuICAnQG94bGludC9iaW5kaW5nLWxpbnV4LXJpc2N2NjQtbXVzbCcsXG4gICdAb3hsaW50L2JpbmRpbmctbGludXgtczM5MHgtZ251JyxcbiAgJ0BveGxpbnQvYmluZGluZy1saW51eC14NjQtZ251JyxcbiAgJ0BveGxpbnQvYmluZGluZy1saW51eC14NjQtbXVzbCcsXG4gICdAb3hsaW50L2JpbmRpbmctb3Blbmhhcm1vbnktYXJtNjQnLFxuICAnQG94bGludC9iaW5kaW5nLXdpbjMyLWFybTY0LW1zdmMnLFxuICAnQG94bGludC9iaW5kaW5nLXdpbjMyLWlhMzItbXN2YycsXG4gICdAb3hsaW50L2JpbmRpbmctd2luMzIteDY0LW1zdmMnLFxuICAnb3hsaW50LXRzZ29saW50JyxcbiAgJ0BveGxpbnQtdHNnb2xpbnQvZGFyd2luLWFybTY0JyxcbiAgJ0BveGxpbnQtdHNnb2xpbnQvZGFyd2luLXg2NCcsXG4gICdAb3hsaW50LXRzZ29saW50L2xpbnV4LWFybTY0JyxcbiAgJ0BveGxpbnQtdHNnb2xpbnQvbGludXgteDY0JyxcbiAgJ0BveGxpbnQtdHNnb2xpbnQvd2luMzItYXJtNjQnLFxuICAnQG94bGludC10c2dvbGludC93aW4zMi14NjQnLFxuICAnQG5leHQvZW52JyxcbiAgJ0BuZXh0L2ZvbnQnLFxuICAnQG5leHQvcnNwYWNrLWJpbmRpbmctbGludXgtYXJtNjQtZ251JyxcbiAgJ0BuZXh0L3JzcGFjay1iaW5kaW5nLWxpbnV4LWFybTY0LW11c2wnLFxuICAnQG5leHQvcnNwYWNrLWJpbmRpbmctbGludXgteDY0LWdudScsXG4gICdAbmV4dC9yc3BhY2stYmluZGluZy1saW51eC14NjQtbXVzbCcsXG4gICdAbmV4dC9zd2MtYW5kcm9pZC1hcm0tZWFiaScsXG4gICdAbmV4dC9zd2MtYW5kcm9pZC1hcm02NCcsXG4gICdAbmV4dC9zd2MtZGFyd2luLWFybTY0JyxcbiAgJ0BuZXh0L3N3Yy1kYXJ3aW4teDY0JyxcbiAgJ0BuZXh0L3N3Yy1mcmVlYnNkLXg2NCcsXG4gICdAbmV4dC9zd2MtbGludXgtYXJtLWdudWVhYmloZicsXG4gICdAbmV4dC9zd2MtbGludXgtYXJtNjQtZ251JyxcbiAgJ0BuZXh0L3N3Yy1saW51eC1hcm02NC1tdXNsJyxcbiAgJ0BuZXh0L3N3Yy1saW51eC14NjQtZ251JyxcbiAgJ0BuZXh0L3N3Yy1saW51eC14NjQtbXVzbCcsXG4gICdAbmV4dC9zd2Mtd2FzbS1ub2RlanMnLFxuICAnQG5leHQvc3djLXdhc20td2ViJyxcbiAgJ0BuZXh0L3RoaXJkLXBhcnRpZXMnLFxuICAnbmV4dCcsXG4gICdyZWFjdCcsXG4gICdyZWFjdC1kb20nLFxuXTtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlQnVuZmlnVG9tbChjb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdnZW5lcmF0ZUJ1bmZpZ1RvbWwnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICdidW5maWcudG9tbCcpO1xuICAgIGNvbnN0IGV4aXN0aW5nQ29udGVudCA9IGZzLmV4aXN0c1N5bmMoZmlsZVBhdGgpID8gZnMucmVhZEZpbGVTeW5jKGZpbGVQYXRoLCAndXRmOCcpIDogdW5kZWZpbmVkO1xuICAgIGNvbnN0IGNvbnRlbnQgPSBuZXdDb250ZW50KGV4aXN0aW5nQ29udGVudCk7XG4gICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzVXRpbC5nZW5lcmF0ZUZpbGUoZmlsZVBhdGgsIGNvbnRlbnQpKTtcbiAgfSk7XG59XG5cbmNvbnN0IG5ld0NvbnRlbnQgPSAoZXhpc3RpbmdDb250ZW50OiBzdHJpbmcgfCB1bmRlZmluZWQpOiBzdHJpbmcgPT4ge1xuICBjb25zdCBidW5maWdUb21sID0gcGFyc2VCdW5maWdUb21sKGV4aXN0aW5nQ29udGVudCk7XG4gIHJldHVybiBgZW52ID0gZmFsc2VcbnRlbGVtZXRyeSA9IGZhbHNlXG5cbiR7Z2VuZXJhdGVSdW5TZWN0aW9uKGJ1bmZpZ1RvbWwpfVxuW2luc3RhbGxdXG5leGFjdCA9ICR7YnVuZmlnVG9tbD8uaW5zdGFsbD8uZXhhY3QgPT09IGZhbHNlID8gJ2ZhbHNlJyA6ICd0cnVlJ31cbmxpbmtlciA9IFwiaG9pc3RlZFwiXG5taW5pbXVtUmVsZWFzZUFnZSA9IDQzMjAwMCAjIDUgZGF5c1xubWluaW11bVJlbGVhc2VBZ2VFeGNsdWRlcyA9IFtcbiR7bWluaW11bVJlbGVhc2VBZ2VFeGNsdWRlcy5tYXAoKHBhY2thZ2VOYW1lKSA9PiBgICAgIFwiJHtwYWNrYWdlTmFtZX1cIixgKS5qb2luKCdcXG4nKX1cbl1cbmA7XG59O1xuXG5mdW5jdGlvbiBwYXJzZUJ1bmZpZ1RvbWwoY29udGVudDogc3RyaW5nIHwgdW5kZWZpbmVkKTogQnVuZmlnVG9tbCB8IHVuZGVmaW5lZCB7XG4gIGlmICghY29udGVudCkge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cbiAgdHJ5IHtcbiAgICByZXR1cm4gcGFyc2UoY29udGVudCkgYXMgQnVuZmlnVG9tbDtcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxufVxuXG5mdW5jdGlvbiBnZW5lcmF0ZVJ1blNlY3Rpb24oYnVuZmlnVG9tbDogQnVuZmlnVG9tbCB8IHVuZGVmaW5lZCk6IHN0cmluZyB7XG4gIHJldHVybiB0eXBlb2YgYnVuZmlnVG9tbD8ucnVuPy5idW4gPT09ICdib29sZWFuJyA/IGBbcnVuXVxcbmJ1biA9ICR7YnVuZmlnVG9tbC5ydW4uYnVufVxcbmAgOiAnJztcbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcblxuY29uc3QgdXNlckNvbnRlbnRIZWFkZXIgPSAnIyBQcm9qZWN0LXNwZWNpZmljIHNldHRpbmdzJztcbmNvbnN0IHVzZXJDb250ZW50SGVhZGVyUmVnZXggPSAvIyBQcm9qZWN0LXNwZWNpZmljIHNldHRpbmdzW15cXG5dKlxcbi9nbTtcbmNvbnN0IHNlcGFyYXRvciA9ICcjIEdlbmVyYXRlZCBieSB3YmZ5JztcbmNvbnN0IHNlcGFyYXRvclByZWZpeCA9ICcjIEdlbmVyYXRlZCBieSAnO1xuY29uc3QgZGVmYXVsdEhlYWRVc2VyQ29udGVudCA9IGAke3VzZXJDb250ZW50SGVhZGVyfSAoaGVhZClcblxuXG4ke3NlcGFyYXRvcn1cbmA7XG5jb25zdCBkZWZhdWx0VGFpbFVzZXJDb250ZW50ID0gYFxuJHt1c2VyQ29udGVudEhlYWRlcn0gKHRhaWwpXG5gO1xuXG5leHBvcnQgY29uc3QgaWdub3JlRmlsZVV0aWwgPSB7XG4gIHNlcGFyYXRvcixcbiAgc2VwYXJhdG9yUHJlZml4LFxuICBkZWZhdWx0SGVhZFVzZXJDb250ZW50LFxuICBkZWZhdWx0VGFpbFVzZXJDb250ZW50LFxuICBhc3luYyByZWFkR2l0aWdub3JlV2l0aG91dFNlcGFyYXRvcnMoZmlsZVBhdGg6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nIHwgdW5kZWZpbmVkPiB7XG4gICAgdHJ5IHtcbiAgICAgIGxldCBjb250ZW50ID0gYXdhaXQgZnMucHJvbWlzZXMucmVhZEZpbGUoZmlsZVBhdGgsICd1dGY4Jyk7XG4gICAgICBjb25zdCBsYXN0SGVhZGVySW5kZXggPSBnZXRJbmRleE9mVGFpbFVzZXJDb250ZW50SGVhZGVyKGNvbnRlbnQpO1xuICAgICAgaWYgKGxhc3RIZWFkZXJJbmRleCA+IDApIHtcbiAgICAgICAgY29udGVudCA9IGNvbnRlbnQuc2xpY2UoMCwgbGFzdEhlYWRlckluZGV4IC0gMSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gKFxuICAgICAgICBjb250ZW50XG4gICAgICAgICAgLnJlcGxhY2VBbGwodXNlckNvbnRlbnRIZWFkZXJSZWdleCwgJycpXG4gICAgICAgICAgLnJlcGxhY2VBbGwoLyMgR2VuZXJhdGVkIGJ5IFteXFxuXSpcXG4vZ20sICcnKVxuICAgICAgICAgIC5yZXBsYWNlQWxsKC9cXHI/XFxuXFxyP1xcbihcXHI/XFxuKSsvZ20sICdcXG5cXG4nKVxuICAgICAgICAgIC50cmltKCkgKyAnXFxuJ1xuICAgICAgKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIGRvIG5vdGhpbmdcbiAgICB9XG4gIH0sXG4gIGdldEhlYWRVc2VyQ29udGVudChjb250ZW50OiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGNvbnN0IGluZGV4ID0gY29udGVudC5pbmRleE9mKHRoaXMuc2VwYXJhdG9yUHJlZml4KTtcbiAgICBpZiAoaW5kZXggIT09IC0xKSB7XG4gICAgICByZXR1cm4gY29udGVudFxuICAgICAgICAuc2xpY2UoMCwgY29udGVudC5pbmRleE9mKCdcXG4nLCBpbmRleCkgKyAxKVxuICAgICAgICAucmVwbGFjZUFsbCh1c2VyQ29udGVudEhlYWRlclJlZ2V4LCBgJHt1c2VyQ29udGVudEhlYWRlcn0gKGhlYWQpXFxuYCk7XG4gICAgfVxuICAgIHJldHVybiBkZWZhdWx0SGVhZFVzZXJDb250ZW50O1xuICB9LFxuICBnZXRUYWlsVXNlckNvbnRlbnQoY29udGVudDogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBjb25zdCBsYXN0SGVhZGVySW5kZXggPSBnZXRJbmRleE9mVGFpbFVzZXJDb250ZW50SGVhZGVyKGNvbnRlbnQpO1xuICAgIGlmIChsYXN0SGVhZGVySW5kZXggPiAwKSB7XG4gICAgICByZXR1cm4gY29udGVudC5zbGljZShsYXN0SGVhZGVySW5kZXggLSAxKTtcbiAgICB9XG4gICAgcmV0dXJuIGRlZmF1bHRUYWlsVXNlckNvbnRlbnQ7XG4gIH0sXG4gIGFzeW5jIGlzQmVycnlaZXJvSW5zdGFsbEVuYWJsZWQoZmlsZVBhdGg6IHN0cmluZyk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBjb250ZW50ID0gYXdhaXQgZnMucHJvbWlzZXMucmVhZEZpbGUoZmlsZVBhdGgsICd1dGY4Jyk7XG4gICAgICByZXR1cm4gY29udGVudC5pbmNsdWRlcygnXFxuIS55YXJuL2NhY2hlJyk7XG4gICAgfSBjYXRjaCB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9LFxufTtcblxuZnVuY3Rpb24gZ2V0SW5kZXhPZlRhaWxVc2VyQ29udGVudEhlYWRlcihjb250ZW50OiBzdHJpbmcpOiBudW1iZXIge1xuICBjb25zdCBpbmRleCA9IGNvbnRlbnQuaW5kZXhPZih1c2VyQ29udGVudEhlYWRlcik7XG4gIGNvbnN0IGxhc3RJbmRleCA9IGNvbnRlbnQubGFzdEluZGV4T2YodXNlckNvbnRlbnRIZWFkZXIpO1xuICByZXR1cm4gbGFzdEluZGV4ID4gaW5kZXggPyBsYXN0SW5kZXggOiAtMTtcbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGZzVXRpbCB9IGZyb20gJy4uL3V0aWxzL2ZzVXRpbC5qcyc7XG5pbXBvcnQgeyBpZ25vcmVGaWxlVXRpbCB9IGZyb20gJy4uL3V0aWxzL2lnbm9yZUZpbGVVdGlsLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuXG4vLyBFeGVyY29kZeOBp+OBr25vZGVfbW9kdWxlc+OCkkNPUFnjgZnjgovlv4XopoHjgYzjgYLjgovjgZ/jgoHjgIFub2RlX21vZHVsZXPjgpLpmaTlpJbjgZfjgabjga/jgYTjgZHjgarjgYTjgIJcbmNvbnN0IGNvbW1vbkNvbnRlbnQgPSBgXG4qKi8uaWRlYVxuKiovKi5zcWxpdGUzKlxuKiovLnlhcm4vaW5zdGFsbC1zdGF0ZS5nelxuKiovLnZlbnZcbmA7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZW5lcmF0ZURvY2tlcmlnbm9yZShjb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdnZW5lcmF0ZURvY2tlcmlnbm9yZScsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJy5kb2NrZXJpZ25vcmUnKTtcbiAgICBpZiAoY29uZmlnLmRvZXNDb250YWluRG9ja2VyZmlsZSkge1xuICAgICAgY29uc3QgY29udGVudCA9IChhd2FpdCBmc1V0aWwucmVhZEZpbGVJZ25vcmluZ0Vycm9yKGZpbGVQYXRoKSkgPz8gJyc7XG4gICAgICBjb25zdCBoZWFkVXNlckNvbnRlbnQgPSBpZ25vcmVGaWxlVXRpbC5nZXRIZWFkVXNlckNvbnRlbnQoY29udGVudCk7XG4gICAgICBjb25zdCB0YWlsVXNlckNvbnRlbnQgPSBpZ25vcmVGaWxlVXRpbC5nZXRUYWlsVXNlckNvbnRlbnQoY29udGVudCk7XG5cbiAgICAgIGNvbnN0IG5ld0NvbnRlbnQgPSBoZWFkVXNlckNvbnRlbnQgKyBjb21tb25Db250ZW50ICsgdGFpbFVzZXJDb250ZW50O1xuICAgICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzVXRpbC5nZW5lcmF0ZUZpbGUoZmlsZVBhdGgsIG5ld0NvbnRlbnQpKTtcbiAgICB9IGVsc2Uge1xuICAgICAgYXdhaXQgZnMucHJvbWlzZXMucm0oZmlsZVBhdGgsIHsgZm9yY2U6IHRydWUgfSk7XG4gICAgfVxuICB9KTtcbn1cbiIsImV4cG9ydCBjb25zdCBleHRlbnNpb25zID0ge1xuICBjb2RlV2l0aDJJbmRlbnRTaXplOiBbXG4gICAgJ2NqcycsXG4gICAgJ21qcycsXG4gICAgJ2pzJyxcbiAgICAnanN4JyxcbiAgICAnY3RzJyxcbiAgICAnbXRzJyxcbiAgICAndHMnLFxuICAgICd0c3gnLFxuICAgICdqc29uJyxcbiAgICAnanNvbjUnLFxuICAgICdqc29uYycsXG4gICAgJ2NwcCcsXG4gICAgJ2RhcnQnLFxuICAgICdodG0nLFxuICAgICdodG1sJyxcbiAgICAncHUnLFxuICAgICdwdW1sJyxcbiAgICAncmInLFxuICAgICd2dWUnLFxuICAgICd4bWwnLFxuICAgICd5YW1sJyxcbiAgICAneW1sJyxcbiAgICAnc2gnLFxuICBdLnRvU29ydGVkKCksXG4gIGNvZGVXaXRoNEluZGVudFNpemU6IFsnZ28nLCAnZ3JhZGxlJywgJ2phdmEnLCAncHknXS50b1NvcnRlZCgpLFxuICBtYXJrZG93bkxpa2U6IFsnbWQnXS50b1NvcnRlZCgpLFxuICBveGxpbnQ6IFsnYXN0cm8nLCAnY2pzJywgJ2N0cycsICdqcycsICdqc3gnLCAnbWpzJywgJ210cycsICdzdmVsdGUnLCAndHMnLCAndHN4JywgJ3Z1ZSddLnRvU29ydGVkKCksXG4gIG94Zm10OiBbXG4gICAgJ2FzdHJvJyxcbiAgICAnY2pzJyxcbiAgICAnY3NzJyxcbiAgICAnY3RzJyxcbiAgICAnZ3FsJyxcbiAgICAnZ3JhcGhxbCcsXG4gICAgJ2hicycsXG4gICAgJ2h0bScsXG4gICAgJ2h0bWwnLFxuICAgICdqcycsXG4gICAgJ2pzb24nLFxuICAgICdqc29uNScsXG4gICAgJ2pzb25jJyxcbiAgICAnanN4JyxcbiAgICAnbGVzcycsXG4gICAgJ21kJyxcbiAgICAnbWR4JyxcbiAgICAnbWpzJyxcbiAgICAnbXRzJyxcbiAgICAnc2NzcycsXG4gICAgJ3N2ZWx0ZScsXG4gICAgJ3RvbWwnLFxuICAgICd0cycsXG4gICAgJ3RzeCcsXG4gICAgJ3Z1ZScsXG4gICAgJ3lhbWwnLFxuICAgICd5bWwnLFxuICBdLnRvU29ydGVkKCksXG4gIHByZXR0aWVyT25seTogWydqYXZhJ10udG9Tb3J0ZWQoKSxcbn07XG4iLCJpbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBleHRlbnNpb25zIH0gZnJvbSAnLi4vdXRpbHMvZXh0ZW5zaW9ucy5qcyc7XG5pbXBvcnQgeyBmc1V0aWwgfSBmcm9tICcuLi91dGlscy9mc1V0aWwuanMnO1xuaW1wb3J0IHsgcHJvbWlzZVBvb2wgfSBmcm9tICcuLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5cbmNvbnN0IG5ld0NvbnRlbnQgPSBgcm9vdCA9IHRydWVcblxuWypdXG5jaGFyc2V0ID0gdXRmLThcbmVuZF9vZl9saW5lID0gbGZcbmluc2VydF9maW5hbF9uZXdsaW5lID0gdHJ1ZVxudHJpbV90cmFpbGluZ193aGl0ZXNwYWNlID0gdHJ1ZVxuXG4ke2dlbmVyYXRlRXh0ZW5zaW9ucyhleHRlbnNpb25zLmNvZGVXaXRoMkluZGVudFNpemUpfVxuaW5kZW50X3NpemUgPSAyXG5pbmRlbnRfc3R5bGUgPSBzcGFjZVxuXG4ke2dlbmVyYXRlRXh0ZW5zaW9ucyhleHRlbnNpb25zLmNvZGVXaXRoNEluZGVudFNpemUpfVxuaW5kZW50X3NpemUgPSA0XG5pbmRlbnRfc3R5bGUgPSBzcGFjZVxuXG4ke2dlbmVyYXRlRXh0ZW5zaW9ucyhleHRlbnNpb25zLm1hcmtkb3duTGlrZSl9XG5tYXhfbGluZV9sZW5ndGggPSBvZmZcbnRyaW1fdHJhaWxpbmdfd2hpdGVzcGFjZSA9IGZhbHNlXG5cblt7TWFrZWZpbGUsKi5ta31dXG5pbmRlbnRfc3R5bGUgPSB0YWJcbmA7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZW5lcmF0ZUVkaXRvcmNvbmZpZyhjb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdnZW5lcmF0ZUVkaXRvcmNvbmZpZycsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJy5lZGl0b3Jjb25maWcnKTtcbiAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnNVdGlsLmdlbmVyYXRlRmlsZShmaWxlUGF0aCwgbmV3Q29udGVudCkpO1xuICB9KTtcbn1cblxuZnVuY3Rpb24gZ2VuZXJhdGVFeHRlbnNpb25zKGV4dGVuc2lvbnM6IHN0cmluZ1tdKTogc3RyaW5nIHtcbiAgcmV0dXJuIGV4dGVuc2lvbnMubGVuZ3RoID4gMSA/IGBbKi57JHtleHRlbnNpb25zLmpvaW4oJywnKX19XWAgOiBgWyouJHtleHRlbnNpb25zWzBdfV1gO1xufVxuIiwiLy8gb3hsaW50LWRpc2FibGUgZXNsaW50LXBsdWdpbi1pbXBvcnQvbm8tbmFtZWQtYXMtZGVmYXVsdC1tZW1iZXIgLS0gTmFtZXNwYWNlIFlBTUwgY2FsbHMgbWFrZSBsb2FkL2R1bXAgdXNhZ2UgY2xlYXJlci5cbmltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCBtZXJnZSBmcm9tICdkZWVwbWVyZ2UnO1xuaW1wb3J0IHlhbWwgZnJvbSAnanMteWFtbCc7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGZzVXRpbCB9IGZyb20gJy4uL3V0aWxzL2ZzVXRpbC5qcyc7XG5pbXBvcnQgeyBvdmVyd3JpdGVNZXJnZSB9IGZyb20gJy4uL3V0aWxzL21lcmdlVXRpbC5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcblxuaW1wb3J0IHsgZ2VuZXJhdGVBZ2VudENvZGluZ1N0eWxlIH0gZnJvbSAnLi9hZ2VudHMuanMnO1xuXG5jb25zdCBkZWZhdWx0Q29uZmlnID0ge1xuICBoYXZlX2Z1bjogdHJ1ZSxcbiAgY29kZV9yZXZpZXc6IHtcbiAgICBkaXNhYmxlOiBmYWxzZSxcbiAgICBjb21tZW50X3NldmVyaXR5X3RocmVzaG9sZDogJ01FRElVTScsXG4gICAgbWF4X3Jldmlld19jb21tZW50czogLTEsXG4gICAgcHVsbF9yZXF1ZXN0X29wZW5lZDoge1xuICAgICAgaGVscDogZmFsc2UsXG4gICAgICBzdW1tYXJ5OiB0cnVlLFxuICAgICAgY29kZV9yZXZpZXc6IHRydWUsXG4gICAgfSxcbiAgfSxcbiAgaWdub3JlX3BhdHRlcm5zOiBbJyoqL19fZ2VuZXJhdGVkX18nXSxcbn07XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZW5lcmF0ZUdlbWluaUNvbmZpZyhjb25maWc6IFBhY2thZ2VDb25maWcsIGFsbENvbmZpZ3M6IFBhY2thZ2VDb25maWdbXSk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2dlbmVyYXRlR2VtaW5pQ29uZmlnJywgYXN5bmMgKCkgPT4ge1xuICAgIGlmICghY29uZmlnLmlzUm9vdCkgcmV0dXJuO1xuXG4gICAgY29uc3QgZGlyUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJy5nZW1pbmknKTtcbiAgICBjb25zdCBjb25maWdGaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShkaXJQYXRoLCAnY29uZmlnLnltbCcpO1xuICAgIGNvbnN0IHN0eWxlZ3VpZGVGaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShkaXJQYXRoLCAnc3R5bGVndWlkZS5tZCcpO1xuICAgIGNvbnN0IGFnZW50c0V4dHJhUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJ0FHRU5UU19FWFRSQS5tZCcpO1xuXG4gICAgbGV0IG5ld0NvbmZpZzogb2JqZWN0ID0gc3RydWN0dXJlZENsb25lKGRlZmF1bHRDb25maWcpO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBvbGRDb250ZW50ID0gYXdhaXQgZnMucHJvbWlzZXMucmVhZEZpbGUoY29uZmlnRmlsZVBhdGgsICd1dGY4Jyk7XG4gICAgICBjb25zdCBvbGRDb25maWcgPSB5YW1sLmxvYWQob2xkQ29udGVudCkgYXMgb2JqZWN0O1xuICAgICAgbmV3Q29uZmlnID0gbWVyZ2UuYWxsKFtuZXdDb25maWcsIG9sZENvbmZpZywgbmV3Q29uZmlnXSwgeyBhcnJheU1lcmdlOiBvdmVyd3JpdGVNZXJnZSB9KTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIGRvIG5vdGhpbmcgLSBmaWxlIGRvZXNuJ3QgZXhpc3Qgb3IgY2FuJ3QgYmUgcGFyc2VkXG4gICAgfVxuXG4gICAgY29uc3QgeWFtbENvbnRlbnQgPSB5YW1sLmR1bXAobmV3Q29uZmlnLCB7XG4gICAgICBsaW5lV2lkdGg6IC0xLFxuICAgICAgbm9Db21wYXRNb2RlOiB0cnVlLFxuICAgICAgc3R5bGVzOiB7XG4gICAgICAgICchIW51bGwnOiAnZW1wdHknLFxuICAgICAgfSxcbiAgICB9KTtcblxuICAgIGNvbnN0IGV4dHJhQ29udGVudCA9IGF3YWl0IGZzVXRpbC5yZWFkRmlsZUlnbm9yaW5nRXJyb3IoYWdlbnRzRXh0cmFQYXRoKTtcbiAgICBjb25zdCBjb2RpbmdSdWxlRXh0cmFDb250ZW50ID0gZXh0cmFDb250ZW50Py50cmltU3RhcnQoKS5zdGFydHNXaXRoKCcjJykgPyB1bmRlZmluZWQgOiBleHRyYUNvbnRlbnQ7XG4gICAgY29uc3QgcmV2aWV3TGFuZ3VhZ2VJbnN0cnVjdGlvbiA9IGNvbmZpZy5pc1B1YmxpY1JlcG9cbiAgICAgID8gJ1JldmlldyBpbiBFbmdsaXNoIGJhc2VkIG9uIHRoZSBmb2xsb3dpbmcgY29kaW5nIHN0YW5kYXJkcy4nXG4gICAgICA6ICfku6XkuIvjga7jgrPjg7zjg4fjgqPjg7PjgrDopo/ntITjgpLouI/jgb7jgYjjgabjgIHml6XmnKzoqp7jgafjg6zjg5Pjg6Xjg7zjgZfjgabjgY/jgaDjgZXjgYTjgIInO1xuICAgIGNvbnN0IHN0eWxlZ3VpZGVDb250ZW50ID0gYCR7cmV2aWV3TGFuZ3VhZ2VJbnN0cnVjdGlvbn1cXG5cXG4ke2dlbmVyYXRlQWdlbnRDb2RpbmdTdHlsZShhbGxDb25maWdzKX0ke1xuICAgICAgY29kaW5nUnVsZUV4dHJhQ29udGVudCA/IGBcXG4ke2NvZGluZ1J1bGVFeHRyYUNvbnRlbnQudHJpbUVuZCgpfWAgOiAnJ1xuICAgIH1gO1xuXG4gICAgY29uc3QgcHJvbWlzZXMgPSBbXG4gICAgICBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnNVdGlsLmdlbmVyYXRlRmlsZShjb25maWdGaWxlUGF0aCwgeWFtbENvbnRlbnQpKSxcbiAgICAgIHByb21pc2VQb29sLnJ1bigoKSA9PiBmc1V0aWwuZ2VuZXJhdGVGaWxlKHN0eWxlZ3VpZGVGaWxlUGF0aCwgc3R5bGVndWlkZUNvbnRlbnQpKSxcbiAgICBdO1xuICAgIGF3YWl0IFByb21pc2UuYWxsKHByb21pc2VzKTtcbiAgfSk7XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiByZW1vdmVHZW1pbmlTZXR0aW5ncyhjb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdnZW5lcmF0ZUdlbWluaVNldHRpbmdzJywgYXN5bmMgKCkgPT4ge1xuICAgIGlmICghY29uZmlnLmlzUm9vdCkgcmV0dXJuO1xuXG4gICAgY29uc3QgZGlyUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJy5nZW1pbmknKTtcbiAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShkaXJQYXRoLCAnc2V0dGluZ3MuanNvbicpO1xuICAgIGF3YWl0IGZzLnByb21pc2VzLnJtKGZpbGVQYXRoLCB7IGZvcmNlOiB0cnVlIH0pO1xuICB9KTtcbn1cbiIsImltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGV4dGVuc2lvbnMgfSBmcm9tICcuLi91dGlscy9leHRlbnNpb25zLmpzJztcbmltcG9ydCB7IGZzVXRpbCB9IGZyb20gJy4uL3V0aWxzL2ZzVXRpbC5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcblxuLy8gY2YuIGh0dHBzOi8vYnVuLnNoL2d1aWRlcy9pbnN0YWxsL2dpdC1kaWZmLWJ1bi1sb2NrZmlsZVxuY29uc3QgbmV3Q29udGVudCA9IGAqIHRleHQ9YXV0b1xuXG4qLmxvY2tiIGJpbmFyeSBkaWZmPWxvY2tiXG4qLnZjcHJvaiB0ZXh0IGVvbD1jcmxmXG5cbiR7Wy4uLmV4dGVuc2lvbnMuY29kZVdpdGgySW5kZW50U2l6ZSwgLi4uZXh0ZW5zaW9ucy5jb2RlV2l0aDRJbmRlbnRTaXplLCAuLi5leHRlbnNpb25zLm1hcmtkb3duTGlrZV1cbiAgLm1hcCgoZXh0KSA9PiBgKi4ke2V4dH0gdGV4dCBlb2w9bGZgKVxuICAuam9pbignXFxuJyl9XG5cbmRpc3QvKiogbGluZ3Vpc3QtZ2VuZXJhdGVkPXRydWVcbmA7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZW5lcmF0ZUdpdGF0dHJpYnV0ZXMoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZ2VuZXJhdGVHaXRhdHRyaWJ1dGVzJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnLmdpdGF0dHJpYnV0ZXMnKTtcbiAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnNVdGlsLmdlbmVyYXRlRmlsZShmaWxlUGF0aCwgbmV3Q29udGVudCkpO1xuICB9KTtcbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBvcyBmcm9tICdub2RlOm9zJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgeyBvcHRpb25zIH0gZnJvbSAnLi4vb3B0aW9ucy5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGZzVXRpbCB9IGZyb20gJy4uL3V0aWxzL2ZzVXRpbC5qcyc7XG5pbXBvcnQgeyBpZ25vcmVGaWxlVXRpbCB9IGZyb20gJy4uL3V0aWxzL2lnbm9yZUZpbGVVdGlsLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuXG4vLyBEbyBub3QgcmVtb3ZlIGB3aW5kb3dzYDogZ2VuZXJhdGVkIC5naXRpZ25vcmUgZmlsZXMgbXVzdCBrZWVwIGlnbm9yaW5nIFdpbmRvd3MtY3JlYXRlZCBsb2NhbCBhcnRpZmFjdHMuXG5jb25zdCBkZWZhdWx0TmFtZXMgPSBbJ3dpbmRvd3MnLCAnbWFjb3MnLCAnbGludXgnLCAnamV0YnJhaW5zJywgJ3Zpc3VhbHN0dWRpb2NvZGUnLCAnZW1hY3MnLCAndmltJywgJ3lhcm4nXTtcblxuY29uc3QgY29tbW9uQ29udGVudCA9IGBcbiEua2VlcFxuLmFpZGVyKlxuLmVudi5wcm9kdWN0aW9uXG4qL21vdW50LyouaGFzaFxuLmRldmNvbnRhaW5lci9cbi5pZGVhL0F1Z21lbnRXZWJ2aWV3U3RhdGVTdG9yZS54bWxcbi5pZGVhL2NvcGlsb3QuKlxuLmlkZWEvY29waWxvdC9jaGF0U2Vzc2lvbnMvXG4ucGxheXdyaWdodC1jbGkvXG4uc2VyZW5hL1xuLnRtcC9cbl9fZ2VuZXJhdGVkX18vXG5Ad2lsbGJvb3N0ZXIvXG5kaXN0L1xudGVtcC9cbnRtcC9cbmA7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZW5lcmF0ZUdpdGlnbm9yZShjb25maWc6IFBhY2thZ2VDb25maWcsIHJvb3RDb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdnZW5lcmF0ZUdpdGlnbm9yZScsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJy5naXRpZ25vcmUnKTtcbiAgICBjb25zdCBjb250ZW50ID0gKGF3YWl0IGZzVXRpbC5yZWFkRmlsZUlnbm9yaW5nRXJyb3IoZmlsZVBhdGgpKSA/PyAnJztcbiAgICBsZXQgaGVhZFVzZXJDb250ZW50ID0gaWdub3JlRmlsZVV0aWwuZ2V0SGVhZFVzZXJDb250ZW50KGNvbnRlbnQpICsgY29tbW9uQ29udGVudDtcbiAgICBjb25zdCB0YWlsVXNlckNvbnRlbnQgPSBpZ25vcmVGaWxlVXRpbC5nZXRUYWlsVXNlckNvbnRlbnQoY29udGVudCk7XG5cbiAgICBjb25zdCBuYW1lcyA9IFsuLi5kZWZhdWx0TmFtZXNdO1xuICAgIGlmIChjb25maWcuZG9lc0NvbnRhaW5HZW1maWxlKSB7XG4gICAgICBuYW1lcy5wdXNoKCdydWJ5Jyk7XG4gICAgfVxuICAgIGlmIChjb25maWcuZG9lc0NvbnRhaW5Hb01vZCkge1xuICAgICAgbmFtZXMucHVzaCgnZ28nKTtcbiAgICAgIGhlYWRVc2VyQ29udGVudCArPSBgJHtwYXRoLmJhc2VuYW1lKGNvbmZpZy5kaXJQYXRoKX1cbmA7XG4gICAgfVxuICAgIGlmIChjb25maWcuZG9lc0NvbnRhaW5QYWNrYWdlSnNvbikge1xuICAgICAgbmFtZXMucHVzaCgnbm9kZScpO1xuICAgIH1cbiAgICBpZiAoY29uZmlnLmRvZXNDb250YWluUG9tWG1sKSB7XG4gICAgICBuYW1lcy5wdXNoKCdtYXZlbicpO1xuICAgICAgaGVhZFVzZXJDb250ZW50ICs9IGAuaWRlYS9nb29nbGUtamF2YS1mb3JtYXQueG1sXG5gO1xuICAgIH1cbiAgICBpZiAoY29uZmlnLmRvZXNDb250YWluUHVic3BlY1lhbWwpIHtcbiAgICAgIG5hbWVzLnB1c2goJ2ZsdXR0ZXInLCAnQW5kcm9pZFN0dWRpbycsICdydWJ5Jyk7XG4gICAgICBoZWFkVXNlckNvbnRlbnQgKz0gYC5mbHV0dGVyLXBsdWdpbnMtZGVwZW5kZW5jaWVzXG5hbmRyb2lkL2tleS5wcm9wZXJ0aWVzXG5pb3MvLmJ1bmRsZVxuLmlkZWEvcnVuQ29uZmlndXJhdGlvbnMueG1sXG5gO1xuICAgIH1cbiAgICBpZiAoY29uZmlnLmRvZXNDb250YWluVGVtcGxhdGVZYW1sKSB7XG4gICAgICBoZWFkVXNlckNvbnRlbnQgKz0gYC5hd3Mtc2FtL1xucGFja2FnZWQueWFtbFxuYDtcbiAgICB9XG4gICAgLy8gQmVjYXVzZSAudmVudiBzaG91bGQgYmUgaWdub3JlZCBvbiByb290IGRpcmVjdG9yeVxuICAgIGlmIChjb25maWcuZG9lc0NvbnRhaW5Qb2V0cnlMb2NrIHx8IGNvbmZpZy5kb2VzQ29udGFpblV2TG9jaykge1xuICAgICAgbmFtZXMucHVzaCgncHl0aG9uJyk7XG4gICAgICBoZWFkVXNlckNvbnRlbnQgKz0gYC52ZW52L1xuYDtcbiAgICB9XG5cbiAgICBpZiAoY29uZmlnLmRlcGVuZGluZy5ibGl0eikge1xuICAgICAgaGVhZFVzZXJDb250ZW50ICs9IGAuYmxpdHovXG4uYmxpdHoqKlxuYDtcbiAgICB9XG4gICAgaWYgKGNvbmZpZy5kZXBlbmRpbmcubmV4dCkge1xuICAgICAgbmFtZXMucHVzaCgnbmV4dGpzJyk7XG4gICAgfVxuICAgIGlmIChyb290Q29uZmlnLmRlcGVuZGluZy5maXJlYmFzZSB8fCBjb25maWcuZGVwZW5kaW5nLmZpcmViYXNlKSB7XG4gICAgICBuYW1lcy5wdXNoKCdmaXJlYmFzZScpO1xuICAgIH1cbiAgICBpZiAoY29uZmlnLmRlcGVuZGluZy5wcmlzbWEpIHtcbiAgICAgIGhlYWRVc2VyQ29udGVudCArPSBgKi5zcWxpdGUzKlxuYDtcbiAgICB9XG4gICAgaWYgKGNvbmZpZy5kZXBlbmRpbmcucGxheXdyaWdodFRlc3QpIHtcbiAgICAgIGhlYWRVc2VyQ29udGVudCArPSBgcGxheXdyaWdodC1yZXBvcnQvXG50ZXN0LXJlc3VsdHMvXG5gO1xuICAgIH1cbiAgICBpZiAocm9vdENvbmZpZy5kZXBlbmRpbmcucmVhY3ROYXRpdmUgfHwgY29uZmlnLmRlcGVuZGluZy5yZWFjdE5hdGl2ZSkge1xuICAgICAgbmFtZXMucHVzaCgncmVhY3RuYXRpdmUnKTtcbiAgICAgIGhlYWRVc2VyQ29udGVudCArPSBgZ29vZ2xlLXNlcnZpY2VzLmpzb25cbmFuZHJvaWQvYXBwL3NyYy9tYWluL2Fzc2V0cy9cbmA7XG4gICAgfVxuICAgIGlmIChjb25maWcuZGVwZW5kaW5nLnN0b3J5Ym9vaykge1xuICAgICAgbmFtZXMucHVzaCgnc3Rvcnlib29ranMnKTtcbiAgICB9XG4gICAgaWYgKGNvbmZpZy5kZXBlbmRpbmcubGl0ZXN0cmVhbSkge1xuICAgICAgaGVhZFVzZXJDb250ZW50ICs9IGBnY3Atc2Eta2V5Lmpzb25cbmA7XG4gICAgfVxuXG4gICAgbGV0IGdlbmVyYXRlZCA9ICcnO1xuICAgIGZvciAoY29uc3QgbmFtZSBvZiBuYW1lcykge1xuICAgICAgbGV0IGNvbnRlbnQgPSAoYXdhaXQgcmVhZENhY2hlKG5hbWUpKSA/PyAnJztcbiAgICAgIGlmICghY29udGVudCkge1xuICAgICAgICBjb25zdCB1cmwgPSBgaHR0cHM6Ly93d3cudG9wdGFsLmNvbS9kZXZlbG9wZXJzL2dpdGlnbm9yZS9hcGkvJHtuYW1lfWA7XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2godXJsKTtcbiAgICAgICAgY29uc3QgcmVzcG9uc2VUZXh0ID0gYXdhaXQgcmVzcG9uc2UudGV4dCgpO1xuICAgICAgICBpZiAoIXJlc3BvbnNlLm9rIHx8IHJlc3BvbnNlVGV4dC5pbmNsdWRlcygnQXR0ZW50aW9uIFJlcXVpcmVkIScpIHx8IHJlc3BvbnNlVGV4dC5pbmNsdWRlcygnPHRpdGxlPicpKSB7XG4gICAgICAgICAgY29uc29sZS5lcnJvcihgRmFpbGVkIHRvIGZldGNoICR7dXJsfWApO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb250ZW50ID0gcmVzcG9uc2VUZXh0LnRyaW0oKTtcbiAgICAgICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IHdyaXRlQ2FjaGUobmFtZSwgY29udGVudCkpO1xuICAgICAgICBpZiAob3B0aW9ucy5pc1ZlcmJvc2UpIHtcbiAgICAgICAgICBjb25zb2xlLmluZm8oYEZldGNoZWQgJHt1cmx9YCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChnZW5lcmF0ZWQpIGdlbmVyYXRlZCArPSAnXFxuJztcbiAgICAgIGdlbmVyYXRlZCArPSBjb250ZW50ICsgJ1xcbic7XG4gICAgfVxuICAgIGlmICghKGF3YWl0IGlnbm9yZUZpbGVVdGlsLmlzQmVycnlaZXJvSW5zdGFsbEVuYWJsZWQoZmlsZVBhdGgpKSkge1xuICAgICAgZ2VuZXJhdGVkID0gZ2VuZXJhdGVkLnJlcGxhY2UoJyEueWFybi9jYWNoZScsICcjICEueWFybi9jYWNoZScpLnJlcGxhY2UoJyMgLnBucC4qJywgJy5wbnAuKicpO1xuICAgIH1cbiAgICBpZiAoY29uZmlnLmRvZXNDb250YWluUG9tWG1sIHx8IGNvbmZpZy5kb2VzQ29udGFpblB1YnNwZWNZYW1sKSB7XG4gICAgICBnZW5lcmF0ZWQgPSBnZW5lcmF0ZWRcbiAgICAgICAgLnJlcGxhY2VBbGwoL14jIC5pZGVhXFwvYXJ0aWZhY3RzJC9nbSwgJy5pZGVhL2FydGlmYWN0cycpXG4gICAgICAgIC5yZXBsYWNlQWxsKC9eIyAuaWRlYVxcL2NvbXBpbGVyLnhtbCQvZ20sICcuaWRlYS9jb21waWxlci54bWwnKVxuICAgICAgICAucmVwbGFjZUFsbCgvXiMgLmlkZWFcXC9qYXJSZXBvc2l0b3JpZXMueG1sJC9nbSwgJy5pZGVhL2phclJlcG9zaXRvcmllcy54bWwnKVxuICAgICAgICAucmVwbGFjZUFsbCgvXiMgLmlkZWFcXC9tb2R1bGVzLnhtbCQvZ20sICcuaWRlYS9tb2R1bGVzLnhtbCcpXG4gICAgICAgIC5yZXBsYWNlQWxsKC9eIyAuaWRlYVxcLyouaW1sJC9nbSwgJy5pZGVhLyouaW1sJylcbiAgICAgICAgLnJlcGxhY2VBbGwoL14jIC5pZGVhXFwvbW9kdWxlcyQvZ20sICcuaWRlYS9tb2R1bGVzJylcbiAgICAgICAgLnJlcGxhY2VBbGwoL14jICouaW1sJC9nbSwgJyouaW1sJylcbiAgICAgICAgLnJlcGxhY2VBbGwoL14jICouaXByJC9nbSwgJyouaXByJyk7XG4gICAgICBpZiAoY29uZmlnLmRvZXNDb250YWluUHVic3BlY1lhbWwpIHtcbiAgICAgICAgZ2VuZXJhdGVkID0gZ2VuZXJhdGVkLnJlcGxhY2VBbGwoL14uaWRlYVxcL21vZHVsZXMueG1sJC9nbSwgJyMgLmlkZWEvbW9kdWxlcy54bWwnKTtcbiAgICAgIH1cbiAgICB9XG4gICAgZ2VuZXJhdGVkID0gZ2VuZXJhdGVkLnJlcGxhY2VBbGwoL14uaWRlYVxcLz8kL2dtLCAnIyAuaWRlYScpO1xuICAgIGlmIChyb290Q29uZmlnLmRlcGVuZGluZy5yZWFjdE5hdGl2ZSB8fCBjb25maWcuZGVwZW5kaW5nLnJlYWN0TmF0aXZlIHx8IGNvbmZpZy5kb2VzQ29udGFpblB1YnNwZWNZYW1sKSB7XG4gICAgICBnZW5lcmF0ZWQgPSBnZW5lcmF0ZWQucmVwbGFjZUFsbCgvXiguaWRlYVxcLy4rKSQvZ20sICckMVxcbmFuZHJvaWQvJDEnKTtcbiAgICB9XG4gICAgY29uc3QgbmV3Q29udGVudCA9IGhlYWRVc2VyQ29udGVudCArICdcXG4nICsgZ2VuZXJhdGVkICsgdGFpbFVzZXJDb250ZW50O1xuICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiBmc1V0aWwuZ2VuZXJhdGVGaWxlKGZpbGVQYXRoLCBuZXdDb250ZW50KSk7XG4gIH0pO1xufVxuXG5jb25zdCBkaXJQYXRoID0gcGF0aC5qb2luKG9zLmhvbWVkaXIoKSwgJy5jYWNoZScsICd3YmZ5JywgJ2dpdGlnbm9yZScpO1xuXG5hc3luYyBmdW5jdGlvbiB3cml0ZUNhY2hlKG5hbWU6IHN0cmluZywgY29udGVudDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gIGF3YWl0IGZzLnByb21pc2VzLm1rZGlyKGRpclBhdGgsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICBhd2FpdCBmcy5wcm9taXNlcy53cml0ZUZpbGUocGF0aC5qb2luKGRpclBhdGgsIG5hbWUpLCBjb250ZW50KTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gcmVhZENhY2hlKG5hbWU6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nIHwgdW5kZWZpbmVkPiB7XG4gIHRyeSB7XG4gICAgY29uc3Qgc3RhdCA9IGF3YWl0IGZzLnByb21pc2VzLnN0YXQocGF0aC5qb2luKGRpclBhdGgsIG5hbWUpKTtcbiAgICBpZiAoRGF0ZS5ub3coKSAtIHN0YXQubXRpbWVNcyA+IDYgKiA2MCAqIDYwICogMTAwMCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICByZXR1cm4gYXdhaXQgZnMucHJvbWlzZXMucmVhZEZpbGUocGF0aC5qb2luKGRpclBhdGgsIG5hbWUpLCAndXRmOCcpO1xuICB9IGNhdGNoIHtcbiAgICAvLyBkbyBub3RoaW5nXG4gIH1cbn1cbiIsImltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuXG5leHBvcnQgZnVuY3Rpb24gZG9lc0NvbnRhaW5Kc09yVHMoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogYm9vbGVhbiB7XG4gIHJldHVybiAoXG4gICAgY29uZmlnLmRvZXNDb250YWluSmF2YVNjcmlwdCB8fFxuICAgIGNvbmZpZy5kb2VzQ29udGFpbkphdmFTY3JpcHRJblBhY2thZ2VzIHx8XG4gICAgY29uZmlnLmRvZXNDb250YWluVHlwZVNjcmlwdCB8fFxuICAgIGNvbmZpZy5kb2VzQ29udGFpblR5cGVTY3JpcHRJblBhY2thZ2VzXG4gICk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBkb2VzQ29udGFpbkphdmEoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogYm9vbGVhbiB7XG4gIHJldHVybiBjb25maWcuZG9lc0NvbnRhaW5KYXZhIHx8IGNvbmZpZy5kb2VzQ29udGFpbkphdmFJblBhY2thZ2VzO1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZXh0ZW5zaW9ucyB9IGZyb20gJy4uL3V0aWxzL2V4dGVuc2lvbnMuanMnO1xuaW1wb3J0IHsgZnNVdGlsIH0gZnJvbSAnLi4vdXRpbHMvZnNVdGlsLmpzJztcbmltcG9ydCB7IGRvZXNDb250YWluSmF2YSwgZG9lc0NvbnRhaW5Kc09yVHMgfSBmcm9tICcuLi91dGlscy9wYWNrYWdlQ2FwYWJpbGl0aWVzLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVJZGVhU2V0dGluZ3MoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZ2VuZXJhdGVJZGVhU2V0dGluZ3MnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgZGlyUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJy5pZGVhJyk7XG4gICAgaWYgKGZzLmV4aXN0c1N5bmMoZGlyUGF0aCkpIHtcbiAgICAgIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKGRpclBhdGgsICd3YXRjaGVyVGFza3MueG1sJyk7XG4gICAgICBhd2FpdCAoZG9lc0NvbnRhaW5Kc09yVHMoY29uZmlnKSB8fCBkb2VzQ29udGFpbkphdmEoY29uZmlnKVxuICAgICAgICA/IHByb21pc2VQb29sLnJ1bigoKSA9PiBmc1V0aWwuZ2VuZXJhdGVGaWxlKGZpbGVQYXRoLCBnZXRXYXRjaGVyVGFza3NDb250ZW50KGNvbmZpZykpKVxuICAgICAgICA6IHByb21pc2VQb29sLnJ1bigoKSA9PiBmcy5wcm9taXNlcy5ybShmaWxlUGF0aCwgeyBmb3JjZTogdHJ1ZSB9KSkpO1xuICAgIH1cbiAgfSk7XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZVRhc2tPcHRpb25zKHJ1bm5lcjogc3RyaW5nLCBhcmdzOiBzdHJpbmcsIG5hbWU6IHN0cmluZywgZXh0ZW5zaW9uOiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gYCAgICA8VGFza09wdGlvbnMgaXNFbmFibGVkPVwidHJ1ZVwiPlxuICAgICAgPG9wdGlvbiBuYW1lPVwiYXJndW1lbnRzXCIgdmFsdWU9XCIke2FyZ3N9ICRGaWxlUGF0aFJlbGF0aXZlVG9Qcm9qZWN0Um9vdCRcIiAvPlxuICAgICAgPG9wdGlvbiBuYW1lPVwiY2hlY2tTeW50YXhFcnJvcnNcIiB2YWx1ZT1cImZhbHNlXCIgLz5cbiAgICAgIDxvcHRpb24gbmFtZT1cImRlc2NyaXB0aW9uXCIgLz5cbiAgICAgIDxvcHRpb24gbmFtZT1cImV4aXRDb2RlQmVoYXZpb3JcIiB2YWx1ZT1cIkVSUk9SXCIgLz5cbiAgICAgIDxvcHRpb24gbmFtZT1cImZpbGVFeHRlbnNpb25cIiB2YWx1ZT1cIiR7ZXh0ZW5zaW9ufVwiIC8+XG4gICAgICA8b3B0aW9uIG5hbWU9XCJpbW1lZGlhdGVTeW5jXCIgdmFsdWU9XCJmYWxzZVwiIC8+XG4gICAgICA8b3B0aW9uIG5hbWU9XCJuYW1lXCIgdmFsdWU9XCIke25hbWV9ICguJHtleHRlbnNpb259KVwiIC8+XG4gICAgICA8b3B0aW9uIG5hbWU9XCJvdXRwdXRcIiB2YWx1ZT1cIiRGaWxlUGF0aFJlbGF0aXZlVG9Qcm9qZWN0Um9vdCRcIiAvPlxuICAgICAgPG9wdGlvbiBuYW1lPVwib3V0cHV0RmlsdGVyc1wiPlxuICAgICAgICA8YXJyYXkgLz5cbiAgICAgIDwvb3B0aW9uPlxuICAgICAgPG9wdGlvbiBuYW1lPVwib3V0cHV0RnJvbVN0ZG91dFwiIHZhbHVlPVwiZmFsc2VcIiAvPlxuICAgICAgPG9wdGlvbiBuYW1lPVwicHJvZ3JhbVwiIHZhbHVlPVwiJHtydW5uZXJ9XCIgLz5cbiAgICAgIDxvcHRpb24gbmFtZT1cInJ1bk9uRXh0ZXJuYWxDaGFuZ2VzXCIgdmFsdWU9XCJmYWxzZVwiIC8+XG4gICAgICA8b3B0aW9uIG5hbWU9XCJzY29wZU5hbWVcIiB2YWx1ZT1cIlByb2plY3QgRmlsZXNcIiAvPlxuICAgICAgPG9wdGlvbiBuYW1lPVwidHJhY2tPbmx5Um9vdFwiIHZhbHVlPVwiZmFsc2VcIiAvPlxuICAgICAgPG9wdGlvbiBuYW1lPVwid29ya2luZ0RpclwiIHZhbHVlPVwiJFByb2plY3RGaWxlRGlyJFwiIC8+XG4gICAgICA8ZW52cyAvPlxuICAgIDwvVGFza09wdGlvbnM+XG5gO1xufVxuXG5mdW5jdGlvbiBnZXRXYXRjaGVyVGFza3NDb250ZW50KGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IHN0cmluZyB7XG4gIHJldHVybiBgPD94bWwgdmVyc2lvbj1cIjEuMFwiIGVuY29kaW5nPVwiVVRGLThcIj8+XG48cHJvamVjdCB2ZXJzaW9uPVwiNFwiPlxuICA8Y29tcG9uZW50IG5hbWU9XCJQcm9qZWN0VGFza3NPcHRpb25zXCI+XG4ke2RvZXNDb250YWluSnNPclRzKGNvbmZpZykgPyBleHRlbnNpb25zLm94Zm10Lm1hcCgoZXh0KSA9PiBjcmVhdGVUYXNrT3B0aW9ucygnbm9kZScsICdub2RlX21vZHVsZXMvLmJpbi9veGZtdCAtLXdyaXRlIC0tbm8tZXJyb3Itb24tdW5tYXRjaGVkLXBhdHRlcm4nLCAnT3hmbXQnLCBleHQpKS5qb2luKCcnKSA6ICcnfVxuJHtkb2VzQ29udGFpbkphdmEoY29uZmlnKSA/IGV4dGVuc2lvbnMucHJldHRpZXJPbmx5Lm1hcCgoZXh0KSA9PiBjcmVhdGVUYXNrT3B0aW9ucygnbm9kZScsICdub2RlX21vZHVsZXMvLmJpbi9wcmV0dGllciAtLWNhY2hlIC0td3JpdGUnLCAnUHJldHRpZXInLCBleHQpKS5qb2luKCcnKSA6ICcnfVxuICA8L2NvbXBvbmVudD5cbjwvcHJvamVjdD5cbmA7XG59XG4iLCJpbXBvcnQgdHlwZSB7IFBhY2thZ2VKc29uIH0gZnJvbSAndHlwZS1mZXN0JztcblxuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRHZW5JMThuVHNDb21tYW5kKFxuICBjb25maWc6IFBpY2s8UGFja2FnZUNvbmZpZywgJ2RlcGVuZGluZycgfCAnaXNCdW4nPixcbiAgc2NyaXB0czogUGFja2FnZUpzb24uU2NyaXB0cyB8IHVuZGVmaW5lZFxuKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgaWYgKCFjb25maWcuZGVwZW5kaW5nLmdlbkkxOG5UcyB8fCAhc2NyaXB0cz8uWydnZW4taTE4bi10cyddKSByZXR1cm4gdW5kZWZpbmVkO1xuICByZXR1cm4gYCR7Y29uZmlnLmlzQnVuID8gJ2J1bicgOiAneWFybid9IHJ1biBnZW4taTE4bi10cyA+IC9kZXYvbnVsbGA7XG59XG4iLCJpbXBvcnQgdHlwZSB7IFNwYXduU3luY09wdGlvbnMgfSBmcm9tICdub2RlOmNoaWxkX3Byb2Nlc3MnO1xuaW1wb3J0IGNoaWxkX3Byb2Nlc3MgZnJvbSAnbm9kZTpjaGlsZF9wcm9jZXNzJztcblxuZXhwb3J0IGZ1bmN0aW9uIHNwYXduU3luYyhjb21tYW5kOiBzdHJpbmcsIGFyZ3M6IHN0cmluZ1tdLCBjd2Q6IHN0cmluZywgcmV0cnkgPSAwKTogdm9pZCB7XG4gIHNwYXduU3luY0FuZFJldHVyblN0YXR1cyhjb21tYW5kLCBhcmdzLCBjd2QsIHJldHJ5KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHNwYXduU3luY0FuZFJldHVyblN0YXR1cyhjb21tYW5kOiBzdHJpbmcsIGFyZ3M6IHN0cmluZ1tdLCBjd2Q6IHN0cmluZywgcmV0cnkgPSAwKTogbnVtYmVyIHtcbiAgZG8ge1xuICAgIGNvbnN0IFtuZXdDbWQsIG5ld0FyZ3MsIG9wdGlvbnNdID0gZ2V0U3Bhd25TeW5jQXJncyhjb21tYW5kLCBhcmdzLCBjd2QpO1xuICAgIGNvbnNvbGUubG9nKGAkICR7bmV3Q21kfSAke25ld0FyZ3Muam9pbignICcpfSBhdCAke2N3ZH1gKTtcbiAgICBjb25zdCByZXQgPSBjaGlsZF9wcm9jZXNzLnNwYXduU3luYyhuZXdDbWQsIG5ld0FyZ3MsIG9wdGlvbnMpO1xuICAgIGNvbnN0IHN0YXR1cyA9IHJldC5zdGF0dXMgPz8gMTtcbiAgICBpZiAoc3RhdHVzID09PSAwKSBicmVhaztcbiAgICBpZiAocmV0cnkgPD0gMCkgcmV0dXJuIHN0YXR1cztcbiAgfSB3aGlsZSAoLS1yZXRyeSA+PSAwKTtcbiAgcmV0dXJuIDA7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBzcGF3blN5bmNBbmRSZXR1cm5TdGRvdXQoY29tbWFuZDogc3RyaW5nLCBhcmdzOiBzdHJpbmdbXSwgY3dkOiBzdHJpbmcpOiBzdHJpbmcge1xuICBjb25zdCBbbmV3Q21kLCBuZXdBcmdzLCBvcHRpb25zXSA9IGdldFNwYXduU3luY0FyZ3MoY29tbWFuZCwgYXJncywgY3dkKTtcbiAgb3B0aW9ucy5zdGRpbyA9ICdwaXBlJztcbiAgY29uc3QgcHJvYyA9IGNoaWxkX3Byb2Nlc3Muc3Bhd25TeW5jKG5ld0NtZCwgbmV3QXJncywgb3B0aW9ucyk7XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW5uZWNlc3NhcnktY29uZGl0aW9uIC0tIHNwYXduU3luYyByZXR1cm5zIG51bGwgc3RkZXJyIG9uIEVOT0VOVC5cbiAgY29uc3Qgc3RkZXJyID0gcHJvYy5zdGRlcnIgPz8gJyc7XG4gIGNvbnN0IGVycm9yID0gdHlwZW9mIHN0ZGVyciA9PT0gJ3N0cmluZycgPyBzdGRlcnIudHJpbSgpIDogc3RkZXJyLnRvU3RyaW5nKCkudHJpbSgpO1xuICBpZiAocHJvYy5lcnJvcikge1xuICAgIGNvbnNvbGUuZXJyb3IoYCR7bmV3Q21kfSBbJHtuZXdBcmdzLm1hcCgocykgPT4gYFwiJHtzfVwiYCkuam9pbignLCAnKX1dIGZhaWxlZCB3aXRoOiAke3Byb2MuZXJyb3IubWVzc2FnZX1gKTtcbiAgfSBlbHNlIGlmIChlcnJvcikge1xuICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICBgJHtuZXdDbWR9IFske25ld0FyZ3MubWFwKChzKSA9PiBgXCIke3N9XCJgKS5qb2luKCcsICcpfV0gb3V0cHV0cyB0aGUgZm9sbG93aW5nIGNvbnRlbnQgdG8gc3RkZXJyOlxcbiR7ZXJyb3J9YFxuICAgICk7XG4gIH1cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bm5lY2Vzc2FyeS1jb25kaXRpb24gLS0gc3Bhd25TeW5jIHJldHVybnMgbnVsbCBzdGRvdXQgb24gRU5PRU5ULlxuICBjb25zdCBzdGRvdXQgPSBwcm9jLnN0ZG91dCA/PyAnJztcbiAgcmV0dXJuIHR5cGVvZiBzdGRvdXQgPT09ICdzdHJpbmcnID8gc3Rkb3V0LnRyaW0oKSA6IHN0ZG91dC50b1N0cmluZygpLnRyaW0oKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldFNwYXduU3luY0FyZ3MoY29tbWFuZDogc3RyaW5nLCBhcmdzOiBzdHJpbmdbXSwgY3dkOiBzdHJpbmcpOiBbc3RyaW5nLCBzdHJpbmdbXSwgU3Bhd25TeW5jT3B0aW9uc10ge1xuICBjb25zdCBlbnYgPSB7IC4uLnByb2Nlc3MuZW52IH07XG4gIC8vIFJlbW92ZSBiZXJyeSBmcm9tIFBBVEhcbiAgaWYgKGVudi5QQVRIICYmIGVudi5CRVJSWV9CSU5fRk9MREVSKSB7XG4gICAgZW52LlBBVEggPSBlbnYuUEFUSC5zcGxpdCgnOicpXG4gICAgICAuZmlsdGVyKChwKSA9PiBwICE9PSBlbnYuQkVSUllfQklOX0ZPTERFUilcbiAgICAgIC5qb2luKCc6Jyk7XG4gIH1cblxuICByZXR1cm4gW1xuICAgIGNvbW1hbmQsXG4gICAgYXJncyxcbiAgICB7XG4gICAgICBjd2QsXG4gICAgICBlbnYsXG4gICAgICBlbmNvZGluZzogJ3V0ZjgnLFxuICAgICAgc2hlbGw6IGZhbHNlLFxuICAgICAgc3RkaW86ICdpbmhlcml0JyxcbiAgICB9LFxuICBdO1xufVxuIiwiaW1wb3J0IHsgT2N0b2tpdCB9IGZyb20gJ0BvY3Rva2l0L2NvcmUnO1xuXG5jbGFzcyBHaXRIdWJVdGlsIHtcbiAgZ2V0T3JnQW5kTmFtZSh1cmxPckZ1bGxOYW1lOiBzdHJpbmcpOiBbc3RyaW5nLCBzdHJpbmddIHtcbiAgICBjb25zdCB1cmxXaXRob3V0UHJvdG9jb2wgPSB1cmxPckZ1bGxOYW1lLnNwbGl0KCc6JykuYXQoLTEpO1xuICAgIGNvbnN0IG5hbWVzID0gdXJsV2l0aG91dFByb3RvY29sPy5zcGxpdCgnLycpO1xuICAgIGNvbnN0IG9yZyA9IG5hbWVzPy5hdCgtMikgPz8gJyc7XG4gICAgY29uc3QgbmFtZSA9IG5hbWVzPy5hdCgtMSk/LnJlcGxhY2UoLy5naXQkLywgJycpID8/ICcnO1xuICAgIHJldHVybiBbb3JnLCBuYW1lXTtcbiAgfVxufVxuZXhwb3J0IGNvbnN0IGdpdEh1YlV0aWwgPSBuZXcgR2l0SHViVXRpbCgpO1xuXG5jb25zdCBvY3Rva2l0Q2FjaGUgPSBuZXcgTWFwPHN0cmluZywgT2N0b2tpdD4oKTtcblxuZXhwb3J0IGZ1bmN0aW9uIGdldE9jdG9raXQob3duZXI/OiBzdHJpbmcpOiBPY3Rva2l0IHtcbiAgY29uc3Qga2V5ID0gb3duZXIgPz8gJyc7XG4gIGNvbnN0IGNhY2hlZCA9IG9jdG9raXRDYWNoZS5nZXQoa2V5KTtcbiAgaWYgKGNhY2hlZCkgcmV0dXJuIGNhY2hlZDtcblxuICBjb25zdCBvY3Rva2l0ID0gbmV3IE9jdG9raXQoe1xuICAgIGF1dGg6IGdldEdpdEh1YlRva2VuKG93bmVyKSB8fCB1bmRlZmluZWQsXG4gIH0pO1xuICBvY3Rva2l0Q2FjaGUuc2V0KGtleSwgb2N0b2tpdCk7XG4gIHJldHVybiBvY3Rva2l0O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaGFzR2l0SHViVG9rZW4ob3duZXI6IHN0cmluZyk6IGJvb2xlYW4ge1xuICByZXR1cm4gISFnZXRHaXRIdWJUb2tlbihvd25lcik7XG59XG5cbmZ1bmN0aW9uIGdldEdpdEh1YlRva2VuKG93bmVyPzogc3RyaW5nKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgaWYgKG93bmVyID09PSAnV2lsbEJvb3N0ZXInKSB7XG4gICAgcmV0dXJuIHByb2Nlc3MuZW52LkdIX0JPVF9QQVRfRk9SX1dJTExCT09TVEVSO1xuICB9XG4gIGlmIChvd25lciA9PT0gJ1dpbGxCb29zdGVyTGFiJykge1xuICAgIHJldHVybiBwcm9jZXNzLmVudi5HSF9CT1RfUEFUX0ZPUl9XSUxMQk9PU1RFUkxBQjtcbiAgfVxuICByZXR1cm4gKFxuICAgIHByb2Nlc3MuZW52LkdIX0JPVF9QQVRfRk9SX1dJTExCT09TVEVSIHx8XG4gICAgcHJvY2Vzcy5lbnYuR0hfQk9UX1BBVF9GT1JfV0lMTEJPT1NURVJMQUIgfHxcbiAgICBwcm9jZXNzLmVudi5HSF9UT0tFTiB8fFxuICAgIHByb2Nlc3MuZW52LkdJVEhVQl9UT0tFTlxuICApO1xufVxuIiwiaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5cbmV4cG9ydCBmdW5jdGlvbiBpc1B1Ymxpc2hlZFdpbGxib29zdGVyQ29uZmlnc1BhY2thZ2UoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogYm9vbGVhbiB7XG4gIHJldHVybiAoXG4gICAgY29uZmlnLmlzV2lsbEJvb3N0ZXJDb25maWdzICYmXG4gICAgIWNvbmZpZy5pc1Jvb3QgJiZcbiAgICBjb25maWcucGFja2FnZUpzb24/LnByaXZhdGUgIT09IHRydWUgJiZcbiAgICBBcnJheS5pc0FycmF5KGNvbmZpZy5wYWNrYWdlSnNvbj8uZmlsZXMpICYmXG4gICAgY29uZmlnLnBhY2thZ2VKc29uLmZpbGVzLmxlbmd0aCA+IDBcbiAgKTtcbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCBtZXJnZSBmcm9tICdkZWVwbWVyZ2UnO1xuaW1wb3J0IGZnIGZyb20gJ2Zhc3QtZ2xvYic7XG5pbXBvcnQgeyBzb3J0UGFja2FnZUpzb24gfSBmcm9tICdzb3J0LXBhY2thZ2UtanNvbic7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VKc29uLCBTZXRSZXF1aXJlZCB9IGZyb20gJ3R5cGUtZmVzdCc7XG5cbmltcG9ydCB7IGdldExhdGVzdENvbW1pdEhhc2ggfSBmcm9tICcuLi9naXRodWIvY29tbWl0LmpzJztcbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGV4dGVuc2lvbnMgfSBmcm9tICcuLi91dGlscy9leHRlbnNpb25zLmpzJztcbmltcG9ydCB7IGZzVXRpbCB9IGZyb20gJy4uL3V0aWxzL2ZzVXRpbC5qcyc7XG5pbXBvcnQgeyBnZXRHZW5JMThuVHNDb21tYW5kIH0gZnJvbSAnLi4vdXRpbHMvZ2VuSTE4blRzLmpzJztcbmltcG9ydCB7IGdpdEh1YlV0aWwgfSBmcm9tICcuLi91dGlscy9naXRodWJVdGlsLmpzJztcbmltcG9ydCB7IGdsb2JJZ25vcmUgfSBmcm9tICcuLi91dGlscy9nbG9iVXRpbC5qcyc7XG5pbXBvcnQgeyBpZ25vcmVGaWxlVXRpbCB9IGZyb20gJy4uL3V0aWxzL2lnbm9yZUZpbGVVdGlsLmpzJztcbmltcG9ydCB7IGNvbWJpbmVNZXJnZSB9IGZyb20gJy4uL3V0aWxzL21lcmdlVXRpbC5qcyc7XG5pbXBvcnQgeyBkb2VzQ29udGFpbkphdmEsIGRvZXNDb250YWluSnNPclRzIH0gZnJvbSAnLi4vdXRpbHMvcGFja2FnZUNhcGFiaWxpdGllcy5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcbmltcG9ydCB7IHNwYXduU3luYywgc3Bhd25TeW5jQW5kUmV0dXJuU3Rkb3V0IH0gZnJvbSAnLi4vdXRpbHMvc3Bhd25VdGlsLmpzJztcbmltcG9ydCB7IGdldFRzY29uZmlnQmFzZURlcGVuZGVuY2llcyB9IGZyb20gJy4uL3V0aWxzL3RzY29uZmlnQmFzZS5qcyc7XG5pbXBvcnQgeyBpc1B1Ymxpc2hlZFdpbGxib29zdGVyQ29uZmlnc1BhY2thZ2UgfSBmcm9tICcuLi91dGlscy93aWxsYm9vc3RlckNvbmZpZ3NVdGlsLmpzJztcblxuY29uc3Qgb3hsaW50RGVwcyA9IFsnQHdpbGxib29zdGVyL294Zm10LWNvbmZpZycsICdAd2lsbGJvb3N0ZXIvb3hsaW50LWNvbmZpZycsICdveGZtdCcsICdveGxpbnQnLCAnb3hsaW50LXRzZ29saW50J107XG5jb25zdCB0eXBlc2NyaXB0R29EZXBlbmRlbmN5ID0gJ0B0eXBlc2NyaXB0L25hdGl2ZS1wcmV2aWV3JztcbmNvbnN0IHdiRGVwZW5kZW5jeSA9ICdAd2lsbGJvb3N0ZXIvd2InO1xuY29uc3QgYnVpbGRUc0RlcGVuZGVuY3kgPSAnYnVpbGQtdHMnO1xuY29uc3Qgb2Jzb2xldGVMaW50RGVwZW5kZW5jaWVzID0gW1xuICAnQGJpb21lanMvYmlvbWUnLFxuICAnQGVzbGludC1yZWFjdC9lc2xpbnQtcGx1Z2luJyxcbiAgJ0Blc2xpbnQvanMnLFxuICAnQG5leHQvZXNsaW50LXBsdWdpbi1uZXh0JyxcbiAgJ0B0eXBlcy9lc2xpbnQnLFxuICAnQHR5cGVzL21pY3JvbWF0Y2gnLFxuICAnQHR5cGVzY3JpcHQtZXNsaW50L2VzbGludC1wbHVnaW4nLFxuICAnQHR5cGVzY3JpcHQtZXNsaW50L3BhcnNlcicsXG4gICdAd2lsbGJvb3N0ZXIvYmlvbWUtY29uZmlnJyxcbiAgJ0B3aWxsYm9vc3Rlci9lc2xpbnQtY29uZmlnJyxcbiAgJ0B3aWxsYm9vc3Rlci9lc2xpbnQtY29uZmlnLWJsaXR6LW5leHQnLFxuICAnQHdpbGxib29zdGVyL2VzbGludC1jb25maWctanMnLFxuICAnQHdpbGxib29zdGVyL2VzbGludC1jb25maWctanMtcmVhY3QnLFxuICAnQHdpbGxib29zdGVyL2VzbGludC1jb25maWctbmV4dCcsXG4gICdAd2lsbGJvb3N0ZXIvZXNsaW50LWNvbmZpZy1yZWFjdCcsXG4gICdAd2lsbGJvb3N0ZXIvZXNsaW50LWNvbmZpZy10cycsXG4gICdAd2lsbGJvb3N0ZXIvZXNsaW50LWNvbmZpZy10cy1yZWFjdCcsXG4gICdiaW9tZScsXG4gICdlc2xpbnQnLFxuICAnZXNsaW50LWNvbmZpZy1mbGF0LWdpdGlnbm9yZScsXG4gICdlc2xpbnQtY29uZmlnLXByZXR0aWVyJyxcbiAgJ2VzbGludC1pbXBvcnQtcmVzb2x2ZXItbm9kZScsXG4gICdlc2xpbnQtaW1wb3J0LXJlc29sdmVyLXR5cGVzY3JpcHQnLFxuICAnZXNsaW50LXBsdWdpbi1pbXBvcnQnLFxuICAnZXNsaW50LXBsdWdpbi1pbXBvcnQteCcsXG4gICdlc2xpbnQtcGx1Z2luLXBlcmZlY3Rpb25pc3QnLFxuICAnZXNsaW50LXBsdWdpbi1wcmV0dGllcicsXG4gICdlc2xpbnQtcGx1Z2luLXJlYWN0LWNvbXBpbGVyJyxcbiAgJ2VzbGludC1wbHVnaW4tc29ydC1jbGFzcy1tZW1iZXJzJyxcbiAgJ2VzbGludC1wbHVnaW4tc29ydC1kZXN0cnVjdHVyZS1rZXlzJyxcbiAgJ2VzbGludC1wbHVnaW4tc3Rvcnlib29rJyxcbiAgJ2VzbGludC1wbHVnaW4tdW5pY29ybicsXG4gICdlc2xpbnQtcGx1Z2luLXVudXNlZC1pbXBvcnRzJyxcbiAgJ2dsb2JhbHMnLFxuICAnbWljcm9tYXRjaCcsXG4gICd0eXBlc2NyaXB0LWVzbGludCcsXG5dO1xuY29uc3QgbWljcm9tYXRjaFBhY2thZ2VOYW1lcyA9IG5ldyBTZXQoWydtaWNyb21hdGNoJywgJ0B0eXBlcy9taWNyb21hdGNoJ10pO1xuY29uc3QgbWljcm9tYXRjaEltcG9ydFBhdHRlcm4gPVxuICAvXFxiZnJvbVxccytbJ1wiXW1pY3JvbWF0Y2hbJ1wiXXxcXGJyZXF1aXJlXFwoXFxzKlsnXCJdbWljcm9tYXRjaFsnXCJdXFxzKlxcKXxcXGJpbXBvcnRcXChcXHMqWydcIl1taWNyb21hdGNoWydcIl1cXHMqXFwpL3U7XG5cbmNvbnN0IGxhdGVzdERlcGVuZGVuY3lWZXJzaW9uQ2FjaGUgPSBuZXcgTWFwPHN0cmluZywgc3RyaW5nPigpO1xuXG50eXBlIFdyaXRhYmxlUGFja2FnZUpzb24gPSBTZXRSZXF1aXJlZDxcbiAgUGFja2FnZUpzb24sXG4gICdzY3JpcHRzJyB8ICdkZXBlbmRlbmNpZXMnIHwgJ2RldkRlcGVuZGVuY2llcycgfCAncGVlckRlcGVuZGVuY2llcydcbj47XG5cbmludGVyZmFjZSBEZXBlbmRlbmN5VXBkYXRlcyB7XG4gIGRlcGVuZGVuY2llczogc3RyaW5nW107XG4gIGRldkRlcGVuZGVuY2llczogc3RyaW5nW107XG4gIHB5dGhvbkRldkRlcGVuZGVuY2llczogc3RyaW5nW107XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZW5lcmF0ZVBhY2thZ2VKc29uKFxuICBjb25maWc6IFBhY2thZ2VDb25maWcsXG4gIHJvb3RDb25maWc6IFBhY2thZ2VDb25maWcsXG4gIHNraXBBZGRpbmdEZXBzOiBib29sZWFuXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdnZW5lcmF0ZVBhY2thZ2VKc29uJywgYXN5bmMgKCkgPT4ge1xuICAgIGF3YWl0IGNvcmUoY29uZmlnLCByb290Q29uZmlnLCBza2lwQWRkaW5nRGVwcyk7XG4gIH0pO1xufVxuXG5hc3luYyBmdW5jdGlvbiBjb3JlKGNvbmZpZzogUGFja2FnZUNvbmZpZywgcm9vdENvbmZpZzogUGFja2FnZUNvbmZpZywgc2tpcEFkZGluZ0RlcHM6IGJvb2xlYW4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgZmlsZVBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICdwYWNrYWdlLmpzb24nKTtcbiAgY29uc3QganNvbk9iaiA9IGF3YWl0IHJlYWRQYWNrYWdlSnNvbihmaWxlUGF0aCk7XG4gIGNvbnN0IHBhY2thZ2VNYW5hZ2VyID0gY29uZmlnLmlzQnVuID8gJ2J1bicgOiAneWFybic7XG5cbiAgYXdhaXQgcmVtb3ZlRGVwcmVjYXRlZFN0dWZmKGNvbmZpZywganNvbk9iaik7XG4gIGF3YWl0IHVwZGF0ZVNjcmlwdHMoY29uZmlnLCBqc29uT2JqLCBwYWNrYWdlTWFuYWdlcik7XG4gIG1vdmVNYW5hZ2VkVG9vbERlcGVuZGVuY2llc1RvRGV2RGVwZW5kZW5jaWVzKGpzb25PYmopO1xuICBjb25zdCBkZXBlbmRlbmN5VXBkYXRlcyA9IGFwcGx5UGFja2FnZUpzb25Db252ZW50aW9ucyhjb25maWcsIHJvb3RDb25maWcsIGpzb25PYmopO1xuICBhd2FpdCBub3JtYWxpemVQYWNrYWdlTWV0YWRhdGEoY29uZmlnLCByb290Q29uZmlnLCBqc29uT2JqLCBkZXBlbmRlbmN5VXBkYXRlcyk7XG4gIGFkZERlcGVuZGVuY3lWZXJzaW9uc1RvUGFja2FnZUpzb24oanNvbk9iaiwgZGVwZW5kZW5jeVVwZGF0ZXMpO1xuICBhd2FpdCB1cGRhdGVQcml2YXRlUGFja2FnZXMoanNvbk9iaik7XG4gIHJlbW92ZUVtcHR5RGVwZW5kZW5jeVNlY3Rpb25zKGpzb25PYmopO1xuXG4gIGlmIChjb25maWcuaXNCdW4pIGRlbGV0ZSBqc29uT2JqLnBhY2thZ2VNYW5hZ2VyO1xuICAvLyBZYXJuIHJlYWRzIHBhY2thZ2UuanNvbiBmcm9tIGRpc2sgYmVmb3JlIGRlY2lkaW5nIHdoZXRoZXIgYHlhcm4gYWRkIC1EYFxuICAvLyBjb25mbGljdHMgd2l0aCBhbiBleGlzdGluZyByZWd1bGFyIGRlcGVuZGVuY3ksIHNvIHRoaXMgd3JpdGUgbXVzdCBmaW5pc2hcbiAgLy8gYmVmb3JlIGluc3RhbGxpbmcgdGhlIG1hbmFnZWQgZGVwZW5kZW5jeSB1cGRhdGVzIGJlbG93LiBLZWVwIHRoaXMgYmFzZWxpbmVcbiAgLy8gZmlsZSBzb3J0ZWQgZXZlbiB3aGVuIHdlIGxhdGVyIHJ1biB0aGUgdGFyZ2V0IHJlcG9zaXRvcnkncyBmb3JtYXR0ZXIgc28gYVxuICAvLyBtaWQtcnVuIGludGVycnVwdGlvbiBuZXZlciBsZWF2ZXMgcGFja2FnZS5qc29uIGluIGEgcGFydGlhbGx5IG1hbmFnZWQgb3JkZXIuXG4gIGF3YWl0IGZzVXRpbC5nZW5lcmF0ZUZpbGUoZmlsZVBhdGgsIHNlcmlhbGl6ZVBhY2thZ2VKc29uKGpzb25PYmopKTtcblxuICBpZiAoIXNraXBBZGRpbmdEZXBzKSB7XG4gICAgaW5zdGFsbERlcGVuZGVuY3lVcGRhdGVzKGNvbmZpZywganNvbk9iaiwgZGVwZW5kZW5jeVVwZGF0ZXMsIHBhY2thZ2VNYW5hZ2VyKTtcbiAgICBmb3JtYXRQYWNrYWdlSnNvbldpdGhQcm9qZWN0Rm9ybWF0dGVyKGNvbmZpZywgcGFja2FnZU1hbmFnZXIsIGZpbGVQYXRoKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBzZXJpYWxpemVQYWNrYWdlSnNvbihqc29uT2JqOiBXcml0YWJsZVBhY2thZ2VKc29uKTogc3RyaW5nIHtcbiAgLy8gZnNVdGlsLmdlbmVyYXRlRmlsZSgpIG5vcm1hbGl6ZXMgdGhlIHRyYWlsaW5nIG5ld2xpbmUsIHNvIGtlZXAgdGhlIHNlcmlhbGl6ZXJcbiAgLy8gZm9jdXNlZCBvbiB0aGUgSlNPTiBwYXlsb2FkIGl0c2VsZi5cbiAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KHNvcnRQYWNrYWdlSnNvbihqc29uT2JqKSwgdW5kZWZpbmVkLCAyKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gcmVhZFBhY2thZ2VKc29uKGZpbGVQYXRoOiBzdHJpbmcpOiBQcm9taXNlPFdyaXRhYmxlUGFja2FnZUpzb24+IHtcbiAgY29uc3QganNvblRleHQgPSBhd2FpdCBmcy5wcm9taXNlcy5yZWFkRmlsZShmaWxlUGF0aCwgJ3V0ZjgnKTtcbiAgY29uc3QganNvbk9iaiA9IEpTT04ucGFyc2UoanNvblRleHQpIGFzIFBhY2thZ2VKc29uO1xuICBqc29uT2JqLnNjcmlwdHMgPSBqc29uT2JqLnNjcmlwdHMgPz8ge307XG4gIGpzb25PYmouZGVwZW5kZW5jaWVzID0ganNvbk9iai5kZXBlbmRlbmNpZXMgPz8ge307XG4gIGpzb25PYmouZGV2RGVwZW5kZW5jaWVzID0ganNvbk9iai5kZXZEZXBlbmRlbmNpZXMgPz8ge307XG4gIGpzb25PYmoucGVlckRlcGVuZGVuY2llcyA9IGpzb25PYmoucGVlckRlcGVuZGVuY2llcyA/PyB7fTtcbiAgcmV0dXJuIGpzb25PYmogYXMgV3JpdGFibGVQYWNrYWdlSnNvbjtcbn1cblxuYXN5bmMgZnVuY3Rpb24gdXBkYXRlU2NyaXB0cyhcbiAgY29uZmlnOiBQYWNrYWdlQ29uZmlnLFxuICBqc29uT2JqOiBXcml0YWJsZVBhY2thZ2VKc29uLFxuICBwYWNrYWdlTWFuYWdlcjogJ2J1bicgfCAneWFybidcbik6IFByb21pc2U8dm9pZD4ge1xuICByZW1vdmVMZWdhY3lJbnN0YWxsQ29tbWFuZHMoanNvbk9iai5zY3JpcHRzKTtcblxuICBqc29uT2JqLnNjcmlwdHMgPSB7IC4uLmpzb25PYmouc2NyaXB0cywgLi4uZ2VuZXJhdGVTY3JpcHRzKGNvbmZpZywganNvbk9iai5zY3JpcHRzKSB9O1xuICBhZGRTdGFydFRlc3RTZXJ2ZXJTY3JpcHRJZk5lZWRlZChjb25maWcsIGpzb25PYmopO1xuICBhZGRJbnN0YWxsU3RlcFRvQ2hlY2tGb3JBaShqc29uT2JqLnNjcmlwdHMsIHBhY2thZ2VNYW5hZ2VyKTtcblxuICBjb25zdCBzY3JpcHRzID0ganNvbk9iai5zY3JpcHRzO1xuICBpZiAoY29uZmlnLmlzQnVuIHx8ICFkb2VzQ29udGFpbkphdmEoY29uZmlnKSkge1xuICAgIGRlbGV0ZSBzY3JpcHRzLnByZXR0aWZ5O1xuICB9IGVsc2Uge1xuICAgIHNjcmlwdHMucHJldHRpZnkgPSAoc2NyaXB0cy5wcmV0dGlmeSA/PyAnJykgKyAoYXdhaXQgZ2VuZXJhdGVQcmV0dGllclN1ZmZpeChjb25maWcuZGlyUGF0aCkpO1xuICB9XG4gIG5vcm1hbGl6ZVlhcm5Xb3Jrc3BhY2VGb3JlYWNoU2NyaXB0cyhzY3JpcHRzKTtcbn1cblxuZnVuY3Rpb24gcmVtb3ZlTGVnYWN5SW5zdGFsbENvbW1hbmRzKHNjcmlwdHM6IFBhY2thZ2VKc29uLlNjcmlwdHMpOiB2b2lkIHtcbiAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMoc2NyaXB0cykpIHtcbiAgICBpZiAodHlwZW9mIHZhbHVlICE9PSAnc3RyaW5nJykgY29udGludWU7XG4gICAgLy8gRnJlc2ggcmVwb3Mgc3RpbGwgcmVxdWlyZSBzdGFuZGFsb25lIGB5YXJuIGluc3RhbGxgOyBvbmx5IHJlbW92ZSBsZWdhY3kgaW5zdGFsbCBwcmVmaXhlcyBiZWZvcmUgYW5vdGhlciBjb21tYW5kLlxuICAgIGlmICghdmFsdWUuaW5jbHVkZXMoJ2dpdCBjbG9uZScpKSB7XG4gICAgICBzY3JpcHRzW2tleV0gPSB2YWx1ZS5yZXBsYWNlQWxsKC95YXJuXFxzKig/Omluc3RhbGxcXHMqKT8mJlxccyovZ3UsICcnKTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gYWRkSW5zdGFsbFN0ZXBUb0NoZWNrRm9yQWkoc2NyaXB0czogUGFja2FnZUpzb24uU2NyaXB0cywgcGFja2FnZU1hbmFnZXI6ICdidW4nIHwgJ3lhcm4nKTogdm9pZCB7XG4gIGlmICghKCdjaGVjay1mb3ItYWknIGluIHNjcmlwdHMpKSByZXR1cm47XG5cbiAgaWYgKCdnZW4tY29kZScgaW4gc2NyaXB0cykge1xuICAgIHNjcmlwdHNbJ2NoZWNrLWZvci1haSddID0gYCR7cGFja2FnZU1hbmFnZXJ9IGdlbi1jb2RlID4gL2Rldi9udWxsICYmICR7c2NyaXB0c1snY2hlY2stZm9yLWFpJ119YDtcbiAgfVxuICBzY3JpcHRzWydjaGVjay1mb3ItYWknXSA9IGAke3BhY2thZ2VNYW5hZ2VyfSBpbnN0YWxsID4gL2Rldi9udWxsICYmICR7c2NyaXB0c1snY2hlY2stZm9yLWFpJ119YDtcbn1cblxuZnVuY3Rpb24gbm9ybWFsaXplWWFybldvcmtzcGFjZUZvcmVhY2hTY3JpcHRzKHNjcmlwdHM6IFBhY2thZ2VKc29uLlNjcmlwdHMpOiB2b2lkIHtcbiAgLy8gRGVhbCB3aXRoIGJyZWFraW5nIGNoYW5nZXMgaW4geWFybiBiZXJyeSA0LjAuMC1yYy40OVxuICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhzY3JpcHRzKSkge1xuICAgIGlmICghdmFsdWU/LmluY2x1ZGVzKCd5YXJuIHdvcmtzcGFjZXMgZm9yZWFjaCcpKSBjb250aW51ZTtcbiAgICBzY3JpcHRzW2tleV0gPSB2YWx1ZS5yZXBsYWNlQWxsKFxuICAgICAgL3lhcm4gd29ya3NwYWNlcyBmb3JlYWNoKD8hXFxzKyg/Oi1BfC1SfC0tKD86YWxsfHJlY3Vyc2l2ZXxzaW5jZXx3b3JrdHJlZXxmcm9tfGluY2x1ZGV8ZXhjbHVkZXxwdWJsaWN8cHJpdmF0ZSkpKS9ndSxcbiAgICAgICd5YXJuIHdvcmtzcGFjZXMgZm9yZWFjaCAtLWFsbCdcbiAgICApO1xuICB9XG59XG5cbmZ1bmN0aW9uIGFwcGx5UGFja2FnZUpzb25Db252ZW50aW9ucyhcbiAgY29uZmlnOiBQYWNrYWdlQ29uZmlnLFxuICByb290Q29uZmlnOiBQYWNrYWdlQ29uZmlnLFxuICBqc29uT2JqOiBXcml0YWJsZVBhY2thZ2VKc29uXG4pOiBEZXBlbmRlbmN5VXBkYXRlcyB7XG4gIGNvbnN0IGRlcGVuZGVuY2llczogc3RyaW5nW10gPSBbXTtcbiAgY29uc3QgZGV2RGVwZW5kZW5jaWVzID0gWydzb3J0LXBhY2thZ2UtanNvbiddO1xuICBjb25zdCBweXRob25EZXZEZXBlbmRlbmNpZXM6IHN0cmluZ1tdID0gW107XG4gIGNvbnN0IGhhc0phdmEgPSBkb2VzQ29udGFpbkphdmEoY29uZmlnKTtcblxuICBpZiAoXG4gICAgaGFzSmF2YSAmJlxuICAgICFmcy5leGlzdHNTeW5jKHBhdGguam9pbihyb290Q29uZmlnLmRpclBhdGgsICcucHJldHRpZXJyYy5qc29uJykpICYmXG4gICAgIWZzLmV4aXN0c1N5bmMocGF0aC5qb2luKGNvbmZpZy5kaXJQYXRoLCAnLnByZXR0aWVycmMuanNvbicpKVxuICApIHtcbiAgICBqc29uT2JqLnByZXR0aWVyID0gJ0B3aWxsYm9vc3Rlci9wcmV0dGllci1jb25maWcnO1xuICAgIGRldkRlcGVuZGVuY2llcy5wdXNoKCdwcmV0dGllci1wbHVnaW4tamF2YScsICdAd2lsbGJvb3N0ZXIvcHJldHRpZXItY29uZmlnJyk7XG4gIH1cbiAgaWYgKGhhc0phdmEpIHtcbiAgICBkZXZEZXBlbmRlbmNpZXMucHVzaCgncHJldHRpZXInKTtcbiAgfSBlbHNlIHtcbiAgICByZW1vdmVQcmV0dGllckFydGlmYWN0cyhqc29uT2JqKTtcbiAgfVxuXG4gIGRlbGV0ZSBqc29uT2JqLmRldkRlcGVuZGVuY2llc1snbGludC1zdGFnZWQnXTtcbiAgZGVsZXRlIChqc29uT2JqIGFzIFBhY2thZ2VKc29uICYgeyAnbGludC1zdGFnZWQnPzogdW5rbm93biB9KVsnbGludC1zdGFnZWQnXTtcblxuICBpZiAoY29uZmlnLmlzUm9vdCkge1xuICAgIGRlbGV0ZSBqc29uT2JqLmRldkRlcGVuZGVuY2llcy5odXNreTtcbiAgICBkZWxldGUganNvbk9iai5zY3JpcHRzLnBvc3RpbnN0YWxsO1xuICAgIGRlbGV0ZSBqc29uT2JqLnNjcmlwdHMucG9zdHB1Ymxpc2g7XG4gICAgZGVsZXRlIGpzb25PYmouc2NyaXB0cy5wcmVwdWJsaXNoT25seTtcbiAgICBkZWxldGUganNvbk9iai5zY3JpcHRzLnByZXBhY2s7XG4gICAgZGVsZXRlIGpzb25PYmouc2NyaXB0cy5wb3N0cGFjaztcbiAgICBqc29uT2JqLnNjcmlwdHMucHJlcGFyZSA9ICdsZWZ0aG9vayBpbnN0YWxsIHx8IHRydWUnO1xuICAgIGRldkRlcGVuZGVuY2llcy5wdXNoKCdsZWZ0aG9vaycpO1xuXG4gICAgaWYgKGNvbmZpZy5kZXBlbmRpbmcuc2VtYW50aWNSZWxlYXNlKSB7XG4gICAgICBpZiAoXG4gICAgICAgICFqc29uT2JqLmRldkRlcGVuZGVuY2llc1snc2VtYW50aWMtcmVsZWFzZSddICYmXG4gICAgICAgICFqc29uT2JqLmRldkRlcGVuZGVuY2llc1snbXVsdGktc2VtYW50aWMtcmVsZWFzZSddICYmXG4gICAgICAgICFqc29uT2JqLmRldkRlcGVuZGVuY2llc1snQHFpd2kvbXVsdGktc2VtYW50aWMtcmVsZWFzZSddXG4gICAgICApIHtcbiAgICAgICAgZGV2RGVwZW5kZW5jaWVzLnB1c2goJ3NlbWFudGljLXJlbGVhc2UnKTtcbiAgICAgIH1cbiAgICAgIGpzb25PYmoudmVyc2lvbiA9ICcwLjAuMC1zZW1hbnRpY2FsbHktcmVsZWFzZWQnO1xuICAgIH1cblxuICAgIGlmIChjb25maWcuZGVwZW5kaW5nLnBsYXl3cmlnaHRUZXN0KSB7XG4gICAgICAvLyBTaW5jZSBhcnRpbGxlcnkgcmVxdWlyZXMgYSBzcGVjaWZpYyB2ZXJzaW9uIG9mIEBwbGF5d3JpZ2h0L3Rlc3RcbiAgICAgIGNvbnN0IGhhc0FydGlsbGVyeSA9IGpzb25PYmouZGVwZW5kZW5jaWVzLmFydGlsbGVyeSB8fCBqc29uT2JqLmRldkRlcGVuZGVuY2llcy5hcnRpbGxlcnk7XG4gICAgICAvLyBTaW5jZSBsbG0tdG9vbGJveCByZXF1aXJlcyBAcGxheXdyaWdodC90ZXN0IGluIGRlcGVuZGVuY2llc1xuICAgICAgaWYgKCFoYXNBcnRpbGxlcnkgJiYgIWpzb25PYmouZGVwZW5kZW5jaWVzWydAcGxheXdyaWdodC90ZXN0J10pIHtcbiAgICAgICAgZGV2RGVwZW5kZW5jaWVzLnB1c2goJ0BwbGF5d3JpZ2h0L3Rlc3QnKTtcbiAgICAgIH1cbiAgICAgIGRlbGV0ZSBqc29uT2JqLmRlcGVuZGVuY2llcy5wbGF5d3JpZ2h0O1xuICAgICAgZGVsZXRlIGpzb25PYmouZGV2RGVwZW5kZW5jaWVzLnBsYXl3cmlnaHQ7XG4gICAgfVxuXG4gICAgaWYgKGNvbmZpZy5kb2VzQ29udGFpblN1YlBhY2thZ2VKc29ucykge1xuICAgICAgLy8gV2UgZG9uJ3QgYWxsb3cgbm9uLWFycmF5IHdvcmtzcGFjZXMgaW4gbW9ub3JlcG8uXG4gICAgICBqc29uT2JqLndvcmtzcGFjZXMgPSBBcnJheS5pc0FycmF5KGpzb25PYmoud29ya3NwYWNlcylcbiAgICAgICAgPyBtZXJnZS5hbGwoW2pzb25PYmoud29ya3NwYWNlcywgWydwYWNrYWdlcy8qJ11dLCB7XG4gICAgICAgICAgICBhcnJheU1lcmdlOiBjb21iaW5lTWVyZ2UsXG4gICAgICAgICAgfSlcbiAgICAgICAgOiBbJ3BhY2thZ2VzLyonXTtcbiAgICB9IGVsc2UgaWYgKEFycmF5LmlzQXJyYXkoanNvbk9iai53b3Jrc3BhY2VzKSkge1xuICAgICAganNvbk9iai53b3Jrc3BhY2VzID0ganNvbk9iai53b3Jrc3BhY2VzLmZpbHRlcihcbiAgICAgICAgKHdvcmtzcGFjZSkgPT5cbiAgICAgICAgICBmZy5nbG9iU3luYyh3b3Jrc3BhY2UsIHtcbiAgICAgICAgICAgIGRvdDogdHJ1ZSxcbiAgICAgICAgICAgIGN3ZDogY29uZmlnLmRpclBhdGgsXG4gICAgICAgICAgICBpZ25vcmU6IGdsb2JJZ25vcmUsXG4gICAgICAgICAgfSkubGVuZ3RoID4gMFxuICAgICAgKTtcbiAgICAgIGlmIChqc29uT2JqLndvcmtzcGFjZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIGRlbGV0ZSBqc29uT2JqLndvcmtzcGFjZXM7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgaWYgKGNvbmZpZy5kZXBlbmRpbmcud2IgfHwgY29uZmlnLmlzQnVuKSB7XG4gICAgZGV2RGVwZW5kZW5jaWVzLnB1c2god2JEZXBlbmRlbmN5KTtcbiAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhqc29uT2JqLnNjcmlwdHMpKSB7XG4gICAgICBpZiAodHlwZW9mIHZhbHVlICE9PSAnc3RyaW5nJykgY29udGludWU7XG4gICAgICBqc29uT2JqLnNjcmlwdHNba2V5XSA9IHZhbHVlLnJlcGxhY2VBbGwoL3diXFxzK2RiL2d1LCAnd2IgcHJpc21hJyk7XG4gICAgfVxuICB9XG5cbiAgLy8gYnVpbGQtdHMgb3ducyBUeXBlU2NyaXB0IGV4ZWN1dGlvbiBhbmQgZGVjbGFyYXRpb24gZW1pdC4gd2JmeSBtdXN0IGFsd2F5c1xuICAvLyBrZWVwIGV4aXN0aW5nIGJ1aWxkLXRzIHVzZXJzIGN1cnJlbnQgYmVjYXVzZSBvbGRlciByZWxlYXNlcyBjYW4gZW1pdCAuZC50c1xuICAvLyBmaWxlcyBhdCBwYXRocyB0aGF0IG5vIGxvbmdlciBtYXRjaCBwYWNrYWdlIGV4cG9ydHMuXG4gIGlmIChcbiAgICBqc29uT2JqLmRlcGVuZGVuY2llc1tidWlsZFRzRGVwZW5kZW5jeV0gfHxcbiAgICBqc29uT2JqLmRldkRlcGVuZGVuY2llc1tidWlsZFRzRGVwZW5kZW5jeV0gfHxcbiAgICBPYmplY3QudmFsdWVzKGpzb25PYmouc2NyaXB0cykuc29tZSgoc2NyaXB0KSA9PiBzY3JpcHQ/LmluY2x1ZGVzKGJ1aWxkVHNEZXBlbmRlbmN5KSlcbiAgKSB7XG4gICAgZGV2RGVwZW5kZW5jaWVzLnB1c2goYnVpbGRUc0RlcGVuZGVuY3kpO1xuICB9XG4gIGlmIChkb2VzQ29udGFpbkpzT3JUcyhjb25maWcpKSB7XG4gICAgZGV2RGVwZW5kZW5jaWVzLnB1c2goLi4ub3hsaW50RGVwcyk7XG4gIH1cblxuICBpZiAoZG9lc0NvbnRhaW5Kc09yVHMoY29uZmlnKSkge1xuICAgIGRldkRlcGVuZGVuY2llcy5wdXNoKC4uLmdldFRzY29uZmlnQmFzZURlcGVuZGVuY2llcyhjb25maWcpKTtcbiAgfVxuXG4gIGlmIChjb25maWcuZG9lc0NvbnRhaW5UeXBlU2NyaXB0IHx8IGNvbmZpZy5kb2VzQ29udGFpblR5cGVTY3JpcHRJblBhY2thZ2VzKSB7XG4gICAgZGV2RGVwZW5kZW5jaWVzLnB1c2godHlwZXNjcmlwdEdvRGVwZW5kZW5jeSk7XG4gICAgaWYgKGNvbmZpZy5pc0J1bikge1xuICAgICAgZGV2RGVwZW5kZW5jaWVzLnB1c2goJ0B0eXBlcy9idW4nKTtcbiAgICB9IGVsc2UgaWYgKCFjb25maWcuZGVwZW5kaW5nLnJlYWN0TmF0aXZlKSB7XG4gICAgICBkZXZEZXBlbmRlbmNpZXMucHVzaCgnQHR5cGVzL25vZGUnKTtcbiAgICB9XG4gICAgaWYgKFxuICAgICAganNvbk9iai5kZXBlbmRlbmNpZXMuamVzdCB8fFxuICAgICAganNvbk9iai5kZXZEZXBlbmRlbmNpZXMuamVzdCB8fFxuICAgICAganNvbk9iai5kZXBlbmRlbmNpZXNbJ0BqZXN0L2dsb2JhbHMnXSB8fFxuICAgICAganNvbk9iai5kZXZEZXBlbmRlbmNpZXNbJ0BqZXN0L2dsb2JhbHMnXSB8fFxuICAgICAganNvbk9iai5kZXBlbmRlbmNpZXNbJ3RzLWplc3QnXSB8fFxuICAgICAganNvbk9iai5kZXZEZXBlbmRlbmNpZXNbJ3RzLWplc3QnXVxuICAgICkge1xuICAgICAgZGV2RGVwZW5kZW5jaWVzLnB1c2goJ0B0eXBlcy9qZXN0Jyk7XG4gICAgfVxuICB9XG5cbiAgaWYgKGNvbmZpZy5pc1dpbGxCb29zdGVyQ29uZmlncykge1xuICAgIHJldHVybiB7XG4gICAgICBkZXBlbmRlbmNpZXM6IGRlcGVuZGVuY2llcy5maWx0ZXIoKGRlcCkgPT4gIWRlcC5pbmNsdWRlcygnQHdpbGxib29zdGVyLycpKSxcbiAgICAgIGRldkRlcGVuZGVuY2llczogZGV2RGVwZW5kZW5jaWVzLmZpbHRlcigoZGVwKSA9PiAhZGVwLmluY2x1ZGVzKCdAd2lsbGJvb3N0ZXIvJykpLFxuICAgICAgcHl0aG9uRGV2RGVwZW5kZW5jaWVzLFxuICAgIH07XG4gIH1cblxuICByZXR1cm4geyBkZXBlbmRlbmNpZXMsIGRldkRlcGVuZGVuY2llcywgcHl0aG9uRGV2RGVwZW5kZW5jaWVzIH07XG59XG5cbmZ1bmN0aW9uIG1vdmVNYW5hZ2VkVG9vbERlcGVuZGVuY2llc1RvRGV2RGVwZW5kZW5jaWVzKGpzb25PYmo6IFdyaXRhYmxlUGFja2FnZUpzb24pOiB2b2lkIHtcbiAgZm9yIChjb25zdCBkZXBlbmRlbmN5IG9mIFt3YkRlcGVuZGVuY3ksIGJ1aWxkVHNEZXBlbmRlbmN5XSkge1xuICAgIGlmICghanNvbk9iai5kZXBlbmRlbmNpZXNbZGVwZW5kZW5jeV0pIGNvbnRpbnVlO1xuICAgIGpzb25PYmouZGV2RGVwZW5kZW5jaWVzW2RlcGVuZGVuY3ldID8/PSBqc29uT2JqLmRlcGVuZGVuY2llc1tkZXBlbmRlbmN5XTtcbiAgICBkZWxldGUganNvbk9iai5kZXBlbmRlbmNpZXNbZGVwZW5kZW5jeV07XG4gIH1cbn1cblxuYXN5bmMgZnVuY3Rpb24gbm9ybWFsaXplUGFja2FnZU1ldGFkYXRhKFxuICBjb25maWc6IFBhY2thZ2VDb25maWcsXG4gIHJvb3RDb25maWc6IFBhY2thZ2VDb25maWcsXG4gIGpzb25PYmo6IFdyaXRhYmxlUGFja2FnZUpzb24sXG4gIGRlcGVuZGVuY3lVcGRhdGVzOiBEZXBlbmRlbmN5VXBkYXRlc1xuKTogUHJvbWlzZTx2b2lkPiB7XG4gIGlmICghanNvbk9iai5uYW1lKSB7XG4gICAganNvbk9iai5uYW1lID0gcGF0aC5iYXNlbmFtZShjb25maWcuZGlyUGF0aCk7XG4gIH1cblxuICBpZiAoY29uZmlnLmRvZXNDb250YWluU3ViUGFja2FnZUpzb25zKSB7XG4gICAganNvbk9iai5wcml2YXRlID0gdHJ1ZTtcbiAgfVxuICBpZiAoIWpzb25PYmoubGljZW5zZSkge1xuICAgIGpzb25PYmoubGljZW5zZSA9ICdVTkxJQ0VOU0VEJztcbiAgfVxuICBpZiAoIWpzb25PYmoucHJpdmF0ZSAmJiBqc29uT2JqLmxpY2Vuc2UgIT09ICdVTkxJQ0VOU0VEJyAmJiByb290Q29uZmlnLmlzUHVibGljUmVwbykge1xuICAgIGpzb25PYmoucHVibGlzaENvbmZpZyA/Pz0ge307XG4gICAganNvbk9iai5wdWJsaXNoQ29uZmlnLmFjY2VzcyA/Pz0gJ3B1YmxpYyc7XG4gIH1cbiAgY29uc3QgW293bmVyXSA9IGdpdEh1YlV0aWwuZ2V0T3JnQW5kTmFtZShjb25maWcucmVwb3NpdG9yeSA/PyAnJyk7XG4gIGlmIChvd25lciA9PT0gJ1dpbGxCb29zdGVyJyB8fCBvd25lciA9PT0gJ1dpbGxCb29zdGVyTGFiJykge1xuICAgIGpzb25PYmouYXV0aG9yID0gJ1dpbGxCb29zdGVyIEluYy4nO1xuICB9XG4gIGF3YWl0IG5vcm1hbGl6ZVB1Ymxpc2hlZENvbmZpZ1BhY2thZ2VNZXRhZGF0YShjb25maWcsIGpzb25PYmopO1xuICBpZiAoIWNvbmZpZy5pc1Jvb3QgJiYganNvbk9iai5wcml2YXRlICYmICFqc29uT2JqLm1haW4pIHtcbiAgICAvLyBNYWtlIFZTQ29kZSBwb3NzaWJsZSB0byByZWZhY3RvciBjb2RlIGFjcm9zcyBzdWJwYWNrYWdlcy5cbiAgICBqc29uT2JqLm1haW4gPSAnLi9zcmMnO1xuICB9XG5cbiAgLy8gWWFybiB0cmVhdHMgdGhlIGxlZ2FjeSBucG0vY2hhbGsgcmVzb2x1dGlvbiBhbGlhcyBhcyBhbiBpbnZhbGlkIHBhY2thZ2UgdG9rZW4uXG4gIGRlbGV0ZSBqc29uT2JqLnJlc29sdXRpb25zPy5bJ25wbS9jaGFsayddO1xuXG4gIGlmICghY29uZmlnLmRvZXNDb250YWluU3ViUGFja2FnZUpzb25zKSB7XG4gICAgaWYgKCFjb25maWcuaXNCdW4pIHtcbiAgICAgIGlmICghY29uZmlnLmRvZXNDb250YWluSmF2YVNjcmlwdCAmJiAhY29uZmlnLmRvZXNDb250YWluVHlwZVNjcmlwdCkge1xuICAgICAgICBkZWxldGUganNvbk9iai5zY3JpcHRzLmxpbnQ7XG4gICAgICAgIGRlbGV0ZSBqc29uT2JqLnNjcmlwdHNbJ2xpbnQtZml4J107XG4gICAgICAgIGZvciAoY29uc3Qgc2NyaXB0TmFtZSBvZiBbJ2NsZWFudXAnLCAnY2hlY2stZm9yLWFpJ10pIHtcbiAgICAgICAgICBjb25zdCBzY3JpcHQgPSBqc29uT2JqLnNjcmlwdHNbc2NyaXB0TmFtZV07XG4gICAgICAgICAgaWYgKCFzY3JpcHQpIGNvbnRpbnVlO1xuICAgICAgICAgIGpzb25PYmouc2NyaXB0c1tzY3JpcHROYW1lXSA9IHNjcmlwdC5yZXBsYWNlKC8gPyYmID95YXJuIGxpbnQtZml4KD86IC0tcXVpZXQpPy8sICcnKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAganNvbk9iai5zY3JpcHRzWydsaW50LWZpeCddID0ganNvbk9iai5zY3JpcHRzWydsaW50LWZpeCddID8/ICd5YXJuIGxpbnQgLS1maXgnO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChjb25maWcuZG9lc0NvbnRhaW5QdWJzcGVjWWFtbCkge1xuICAgICAganNvbk9iai5zY3JpcHRzLmxpbnQgPSAnZmx1dHRlciBhbmFseXplJztcbiAgICAgIGpzb25PYmouc2NyaXB0c1snbGludC1maXgnXSA9ICd5YXJuIGxpbnQnO1xuICAgICAgY29uc3QgZGlycyA9IFsnbGliJywgJ3Rlc3QnLCAndGVzdF9kcml2ZXInXS5maWx0ZXIoKGRpcikgPT4gZnMuZXhpc3RzU3luYyhwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsIGRpcikpKTtcbiAgICAgIGlmIChkaXJzLmxlbmd0aCA+IDApIHtcbiAgICAgICAganNvbk9iai5zY3JpcHRzWydmb3JtYXQtY29kZSddID0gYGRhcnQgZm9ybWF0ICQoZmluZCAke2RpcnMuam9pbihcbiAgICAgICAgICAnICdcbiAgICAgICAgKX0gLW5hbWUgZ2VuZXJhdGVkIC1wcnVuZSAtbyAtbmFtZSAnKi5mcmVlemVkLmRhcnQnIC1wcnVuZSAtbyAtbmFtZSAnKi5nLmRhcnQnIC1wcnVuZSAtbyAtbmFtZSAnKi5kYXJ0JyAtcHJpbnQpYDtcbiAgICAgICAganNvbk9iai5zY3JpcHRzLmZvcm1hdCA9IChqc29uT2JqLnNjcmlwdHMuZm9ybWF0ID8/ICcnKSArIGAgJiYgeWFybiBmb3JtYXQtY29kZWA7XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgcHl0aG9uUGFja2FnZU1hbmFnZXIgPSBnZXRQeXRob25QYWNrYWdlTWFuYWdlcihjb25maWcpO1xuICAgIGlmIChweXRob25QYWNrYWdlTWFuYWdlcikge1xuICAgICAgaWYgKGpzb25PYmouc2NyaXB0cy5wb3N0aW5zdGFsbCA9PT0gJ3BvZXRyeSBpbnN0YWxsJykge1xuICAgICAgICBkZWxldGUganNvbk9iai5zY3JpcHRzLnBvc3RpbnN0YWxsO1xuICAgICAgfVxuICAgICAganNvbk9iai5zY3JpcHRzWydjb21tb24vY2ktc2V0dXAnXSA9IGB5YXJuIHNldHVwLSR7cHl0aG9uUGFja2FnZU1hbmFnZXJ9YDtcbiAgICAgIGRlbGV0ZSBqc29uT2JqLnNjcmlwdHNbYHNldHVwLSR7cHl0aG9uUGFja2FnZU1hbmFnZXIgPT09ICdwb2V0cnknID8gJ3V2JyA6ICdwb2V0cnknfWBdO1xuICAgICAgZGVsZXRlIGpzb25PYmouc2NyaXB0c1snc2V0dXAtcG9ldHJ5LWFzZGYnXTtcbiAgICAgIGpzb25PYmouc2NyaXB0c1tgc2V0dXAtJHtweXRob25QYWNrYWdlTWFuYWdlcn1gXSA9IGdldFB5dGhvblNldHVwQ29tbWFuZChweXRob25QYWNrYWdlTWFuYWdlcik7XG4gICAgICBjb25zdCBweXRob25GaWxlcyA9IGF3YWl0IGZnLmdsb2IoJyoqLyoucHknLCB7XG4gICAgICAgIGN3ZDogY29uZmlnLmRpclBhdGgsXG4gICAgICAgIGRvdDogdHJ1ZSxcbiAgICAgICAgaWdub3JlOiBnbG9iSWdub3JlLFxuICAgICAgfSk7XG4gICAgICBjb25zdCBkaXJOYW1lU2V0ID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gICAgICBmb3IgKGNvbnN0IHB5dGhvbkZpbGUgb2YgcHl0aG9uRmlsZXMpIHtcbiAgICAgICAgY29uc3QgW2ZpcnN0LCBzZWNvbmRdID0gcHl0aG9uRmlsZS5zcGxpdCgnLycpO1xuICAgICAgICBpZiAoZmlyc3QgJiYgc2Vjb25kKSB7XG4gICAgICAgICAgZGlyTmFtZVNldC5hZGQoZmlyc3QpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAoZGlyTmFtZVNldC5zaXplID4gMCkge1xuICAgICAgICBjb25zdCBkaXJOYW1lc1N0ciA9IFsuLi5kaXJOYW1lU2V0XS5qb2luKCcgJyk7XG4gICAgICAgIGNvbnN0IHB5dGhvblJ1bm5lciA9IGAke3B5dGhvblBhY2thZ2VNYW5hZ2VyfSBydW5gO1xuICAgICAgICBqc29uT2JqLnNjcmlwdHNbJ2Zvcm1hdC1jb2RlJ10gPVxuICAgICAgICAgIGAke3B5dGhvblJ1bm5lcn0gaXNvcnQgLS1wcm9maWxlIGJsYWNrICR7ZGlyTmFtZXNTdHJ9ICYmICR7cHl0aG9uUnVubmVyfSBibGFjayAke2Rpck5hbWVzU3RyfWA7XG4gICAgICAgIGlmIChqc29uT2JqLnNjcmlwdHMubGludCkge1xuICAgICAgICAgIGpzb25PYmouc2NyaXB0cy5saW50ID0gYCR7cHl0aG9uUnVubmVyfSBmbGFrZTggJHtkaXJOYW1lc1N0cn0gJiYgJHtqc29uT2JqLnNjcmlwdHMubGludH1gO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGpzb25PYmouc2NyaXB0cy5saW50ID0gYCR7cHl0aG9uUnVubmVyfSBmbGFrZTggJHtkaXJOYW1lc1N0cn1gO1xuICAgICAgICAgIGpzb25PYmouc2NyaXB0c1snbGludC1maXgnXSA9ICd5YXJuIGxpbnQnO1xuICAgICAgICB9XG4gICAgICAgIGpzb25PYmouc2NyaXB0cy5mb3JtYXQgPSAoanNvbk9iai5zY3JpcHRzLmZvcm1hdCA/PyAnJykgKyBgICYmIHlhcm4gZm9ybWF0LWNvZGVgO1xuICAgICAgICBkZXBlbmRlbmN5VXBkYXRlcy5weXRob25EZXZEZXBlbmRlbmNpZXMucHVzaCgnYmxhY2snLCAnaXNvcnQnLCAnZmxha2U4Jyk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgaWYgKGNvbmZpZy5yZXBvc2l0b3J5IHx8IGpzb25PYmoucmVwb3NpdG9yeSkge1xuICAgIGpzb25PYmoucmVwb3NpdG9yeSA9IGZvcm1hdFJlcG9zaXRvcnlGb3JQYWNrYWdlSnNvbihjb25maWcucmVwb3NpdG9yeSA/PyBqc29uT2JqLnJlcG9zaXRvcnksIGpzb25PYmoucmVwb3NpdG9yeSk7XG4gIH1cblxuICBpZiAoY29uZmlnLmRlcGVuZGluZy5ibGl0eikge1xuICAgIGlmICghanNvbk9iai5zY3JpcHRzWydnZW4tY29kZSddPy5zdGFydHNXaXRoKCdibGl0eiBjb2RlZ2VuJykpIHtcbiAgICAgIGpzb25PYmouc2NyaXB0c1snZ2VuLWNvZGUnXSA9ICdibGl0eiBjb2RlZ2VuJztcbiAgICB9IGVsc2UgaWYgKCFqc29uT2JqLnNjcmlwdHNbJ2dlbi1jb2RlJ10uaW5jbHVkZXMoJ2JsaXR6IHByaXNtYSBnZW5lcmF0ZScpKSB7XG4gICAgICBqc29uT2JqLnNjcmlwdHNbJ2dlbi1jb2RlJ10gPSBqc29uT2JqLnNjcmlwdHNbJ2dlbi1jb2RlJ10ucmVwbGFjZShcbiAgICAgICAgJ2JsaXR6IGNvZGVnZW4nLFxuICAgICAgICAnYmxpdHogY29kZWdlbiAmJiBibGl0eiBwcmlzbWEgZ2VuZXJhdGUnXG4gICAgICApO1xuICAgIH1cbiAgfSBlbHNlIGlmIChjb25maWcuZGVwZW5kaW5nLnByaXNtYSAmJiAhanNvbk9iai5zY3JpcHRzWydnZW4tY29kZSddPy5zdGFydHNXaXRoKCdwcmlzbWEgZ2VuZXJhdGUnKSkge1xuICAgIGpzb25PYmouc2NyaXB0c1snZ2VuLWNvZGUnXSA9ICdwcmlzbWEgZ2VuZXJhdGUnO1xuICB9XG4gIGFkZEdlbkkxOG5Uc1Bvc3RpbnN0YWxsU2NyaXB0KGNvbmZpZywganNvbk9iaik7XG5cbiAgaWYgKCFqc29uT2JqLmRlcGVuZGVuY2llcy5wcmV0dGllcikge1xuICAgIC8vIEJlY2F1c2UgQHR5cGVzL3ByZXR0aWVyIGJsb2NrcyBwcmV0dGllciBleGVjdXRpb24uXG4gICAgZGVsZXRlIGpzb25PYmouZGV2RGVwZW5kZW5jaWVzWydAdHlwZXMvcHJldHRpZXInXTtcbiAgfVxufVxuXG5mdW5jdGlvbiBhZGRHZW5JMThuVHNQb3N0aW5zdGFsbFNjcmlwdChjb25maWc6IFBhY2thZ2VDb25maWcsIGpzb25PYmo6IFdyaXRhYmxlUGFja2FnZUpzb24pOiB2b2lkIHtcbiAgY29uc3QgY29tbWFuZCA9IGdldEdlbkkxOG5Uc0NvbW1hbmQoY29uZmlnLCBqc29uT2JqLnNjcmlwdHMpO1xuICBpZiAoIWNvbW1hbmQpIHJldHVybjtcblxuICBjb25zdCBwb3N0aW5zdGFsbCA9IGpzb25PYmouc2NyaXB0cy5wb3N0aW5zdGFsbDtcbiAgaWYgKCFwb3N0aW5zdGFsbCkge1xuICAgIGpzb25PYmouc2NyaXB0cy5wb3N0aW5zdGFsbCA9IGNvbW1hbmQ7XG4gIH0gZWxzZSBpZiAoIXBvc3RpbnN0YWxsLmluY2x1ZGVzKGNvbW1hbmQpKSB7XG4gICAganNvbk9iai5zY3JpcHRzLnBvc3RpbnN0YWxsID0gYCR7cG9zdGluc3RhbGx9ICYmICR7Y29tbWFuZH1gO1xuICB9XG59XG5cbmFzeW5jIGZ1bmN0aW9uIG5vcm1hbGl6ZVB1Ymxpc2hlZENvbmZpZ1BhY2thZ2VNZXRhZGF0YShcbiAgY29uZmlnOiBQYWNrYWdlQ29uZmlnLFxuICBqc29uT2JqOiBXcml0YWJsZVBhY2thZ2VKc29uXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgaWYgKCFpc1B1Ymxpc2hlZFdpbGxib29zdGVyQ29uZmlnc1BhY2thZ2UoY29uZmlnKSkgcmV0dXJuO1xuXG4gIGNvbnN0IGNvbmZpZ01qc1BhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICdjb25maWcubWpzJyk7XG4gIGlmICghZnMuZXhpc3RzU3luYyhjb25maWdNanNQYXRoKSkgcmV0dXJuO1xuXG4gIGpzb25PYmoudHlwZSA9ICdtb2R1bGUnO1xuXG4gIGNvbnN0IGNvbmZpZ0R0c1BhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICdjb25maWcuZC50cycpO1xuICBpZiAoIWZzLmV4aXN0c1N5bmMoY29uZmlnRHRzUGF0aCkpIHJldHVybjtcblxuICBqc29uT2JqLmZpbGVzID0gWy4uLm5ldyBTZXQoWy4uLihqc29uT2JqLmZpbGVzID8/IFtdKSwgJ2NvbmZpZy5kLm10cyddKV07XG4gIC8vIE5vZGVOZXh0IHJlc29sdmVzIGEgcmVsYXRpdmUgYC4vY29uZmlnLm1qc2AgaW1wb3J0IHRvIGBjb25maWcuZC5tdHNgLCBub3RcbiAgLy8gdGhlIHBhY2thZ2UtbGV2ZWwgYHR5cGVzYCBmaWVsZC4gS2VlcCB0aGUgcHVibGlzaGVkIGNvbmZpZyBpbXBvcnRhYmxlIGZyb21cbiAgLy8gcGFja2FnZS1sb2NhbCBUeXBlU2NyaXB0IGxpbnRlciBzZXR0aW5ncy5cbiAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzVXRpbC5nZW5lcmF0ZUZpbGUocGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnY29uZmlnLmQubXRzJyksIGNvbmZpZ0RtdHNDb250ZW50KSk7XG59XG5cbmNvbnN0IGNvbmZpZ0RtdHNDb250ZW50ID0gYGV4cG9ydCB7IGRlZmF1bHQgfSBmcm9tICcuL2NvbmZpZy5qcyc7XG5gO1xuXG5mdW5jdGlvbiBhZGREZXBlbmRlbmN5VmVyc2lvbnNUb1BhY2thZ2VKc29uKGpzb25PYmo6IFdyaXRhYmxlUGFja2FnZUpzb24sIGRlcGVuZGVuY3lVcGRhdGVzOiBEZXBlbmRlbmN5VXBkYXRlcyk6IHZvaWQge1xuICBjb25zdCBwYWNrYWdlSnNvbkRlcGVuZGVuY2llcyA9IGpzb25PYmouZGVwZW5kZW5jaWVzO1xuICBjb25zdCBwYWNrYWdlSnNvbkRldkRlcGVuZGVuY2llcyA9IGpzb25PYmouZGV2RGVwZW5kZW5jaWVzO1xuICBkZXBlbmRlbmN5VXBkYXRlcy5kZXBlbmRlbmNpZXMgPSBhZGRQYWNrYWdlSnNvbkRlcGVuZGVuY2llcyhwYWNrYWdlSnNvbkRlcGVuZGVuY2llcywgZGVwZW5kZW5jeVVwZGF0ZXMuZGVwZW5kZW5jaWVzKTtcbiAgZGVwZW5kZW5jeVVwZGF0ZXMuZGV2RGVwZW5kZW5jaWVzID0gZGVwZW5kZW5jeVVwZGF0ZXMuZGV2RGVwZW5kZW5jaWVzLmZpbHRlcigoZGVwKSA9PiAhcGFja2FnZUpzb25EZXBlbmRlbmNpZXNbZGVwXSk7XG4gIGRlcGVuZGVuY3lVcGRhdGVzLmRldkRlcGVuZGVuY2llcyA9IGFkZFBhY2thZ2VKc29uRGVwZW5kZW5jaWVzKFxuICAgIHBhY2thZ2VKc29uRGV2RGVwZW5kZW5jaWVzLFxuICAgIGRlcGVuZGVuY3lVcGRhdGVzLmRldkRlcGVuZGVuY2llc1xuICApO1xufVxuXG5mdW5jdGlvbiByZW1vdmVFbXB0eURlcGVuZGVuY3lTZWN0aW9ucyhqc29uT2JqOiBQYWNrYWdlSnNvbik6IHZvaWQge1xuICBmb3IgKGNvbnN0IGtleSBvZiBbJ2RlcGVuZGVuY2llcycsICdkZXZEZXBlbmRlbmNpZXMnLCAncGVlckRlcGVuZGVuY2llcyddIGFzIGNvbnN0KSB7XG4gICAgY29uc3Qgc2VjdGlvbiA9IGpzb25PYmpba2V5XTtcbiAgICBpZiAoc2VjdGlvbiAmJiBPYmplY3Qua2V5cyhzZWN0aW9uKS5sZW5ndGggPT09IDApIHtcbiAgICAgIFJlZmxlY3QuZGVsZXRlUHJvcGVydHkoanNvbk9iaiwga2V5KTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gaW5zdGFsbERlcGVuZGVuY3lVcGRhdGVzKFxuICBjb25maWc6IFBhY2thZ2VDb25maWcsXG4gIGpzb25PYmo6IFBhY2thZ2VKc29uLFxuICBkZXBlbmRlbmN5VXBkYXRlczogRGVwZW5kZW5jeVVwZGF0ZXMsXG4gIHBhY2thZ2VNYW5hZ2VyOiAnYnVuJyB8ICd5YXJuJ1xuKTogdm9pZCB7XG4gIGNvbnN0IGRlcGVuZGVuY2llcyA9IGRlcGVuZGVuY3lVcGRhdGVzLmRlcGVuZGVuY2llcy5maWx0ZXIoKGRlcCkgPT4gIWpzb25PYmouZGV2RGVwZW5kZW5jaWVzPy5bZGVwXSk7XG4gIGluc3RhbGxOcG1EZXBlbmRlbmNpZXMoY29uZmlnLCBwYWNrYWdlTWFuYWdlciwgZGVwZW5kZW5jaWVzLCBmYWxzZSk7XG5cbiAgY29uc3QgZGV2RGVwZW5kZW5jaWVzID0gZGVwZW5kZW5jeVVwZGF0ZXMuZGV2RGVwZW5kZW5jaWVzLmZpbHRlcigoZGVwKSA9PiAhanNvbk9iai5kZXBlbmRlbmNpZXM/LltkZXBdKTtcbiAgaW5zdGFsbE5wbURlcGVuZGVuY2llcyhjb25maWcsIHBhY2thZ2VNYW5hZ2VyLCBkZXZEZXBlbmRlbmNpZXMsIHRydWUpO1xuXG4gIGNvbnN0IHB5dGhvblBhY2thZ2VNYW5hZ2VyID0gZ2V0UHl0aG9uUGFja2FnZU1hbmFnZXIoY29uZmlnKTtcbiAgaWYgKHB5dGhvblBhY2thZ2VNYW5hZ2VyICYmIGRlcGVuZGVuY3lVcGRhdGVzLnB5dGhvbkRldkRlcGVuZGVuY2llcy5sZW5ndGggPiAwKSB7XG4gICAgY29uc3QgZGVwZW5kZW5jaWVzID0gWy4uLm5ldyBTZXQoZGVwZW5kZW5jeVVwZGF0ZXMucHl0aG9uRGV2RGVwZW5kZW5jaWVzKV07XG4gICAgaWYgKHB5dGhvblBhY2thZ2VNYW5hZ2VyID09PSAncG9ldHJ5Jykge1xuICAgICAgc3Bhd25TeW5jKCdwb2V0cnknLCBbJ2FkZCcsICctLWdyb3VwJywgJ2RldicsIC4uLmRlcGVuZGVuY2llc10sIGNvbmZpZy5kaXJQYXRoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgc3Bhd25TeW5jKCd1dicsIFsnYWRkJywgJy0tZGV2JywgLi4uZGVwZW5kZW5jaWVzXSwgY29uZmlnLmRpclBhdGgpO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBnZXRQeXRob25QYWNrYWdlTWFuYWdlcihjb25maWc6IFBhY2thZ2VDb25maWcpOiAncG9ldHJ5JyB8ICd1dicgfCB1bmRlZmluZWQge1xuICBpZiAoY29uZmlnLmRvZXNDb250YWluVXZMb2NrKSByZXR1cm4gJ3V2JztcbiAgaWYgKGNvbmZpZy5kb2VzQ29udGFpblBvZXRyeUxvY2spIHJldHVybiAncG9ldHJ5Jztcbn1cblxuZnVuY3Rpb24gZ2V0UHl0aG9uU2V0dXBDb21tYW5kKHBhY2thZ2VNYW5hZ2VyOiAncG9ldHJ5JyB8ICd1dicpOiBzdHJpbmcge1xuICBpZiAocGFja2FnZU1hbmFnZXIgPT09ICd1dicpIHJldHVybiAndXYgc3luYyAtLWZyb3plbic7XG4gIHJldHVybiAncG9ldHJ5IGNvbmZpZyB2aXJ0dWFsZW52cy5pbi1wcm9qZWN0IHRydWUgJiYgcG9ldHJ5IGVudiB1c2UgJChtaXNlIGN1cnJlbnQgcHl0aG9uKSAmJiBwb2V0cnkgcnVuIHBpcCBpbnN0YWxsIC0tdXBncmFkZSBwaXAgJiYgcG9ldHJ5IGluc3RhbGwnO1xufVxuXG5mdW5jdGlvbiBpbnN0YWxsTnBtRGVwZW5kZW5jaWVzKFxuICBjb25maWc6IFBhY2thZ2VDb25maWcsXG4gIHBhY2thZ2VNYW5hZ2VyOiAnYnVuJyB8ICd5YXJuJyxcbiAgZGVwZW5kZW5jaWVzOiBzdHJpbmdbXSxcbiAgZGV2OiBib29sZWFuXG4pOiB2b2lkIHtcbiAgaWYgKGRlcGVuZGVuY2llcy5sZW5ndGggPT09IDApIHJldHVybjtcblxuICBjb25zdCBkZXBlbmRlbmN5U3BlY2lmaWVycyA9IFsuLi5uZXcgU2V0KGRlcGVuZGVuY2llcyldO1xuICBpZiAoY29uZmlnLmlzQnVuKSB7XG4gICAgc3Bhd25TeW5jKHBhY2thZ2VNYW5hZ2VyLCBbJ2FkZCcsIC4uLihkZXYgPyBbJy1EJ10gOiBbXSksICctLWV4YWN0JywgLi4uZGVwZW5kZW5jeVNwZWNpZmllcnNdLCBjb25maWcuZGlyUGF0aCk7XG4gIH0gZWxzZSB7XG4gICAgLy8gSW50ZW50aW9uYWxseSBvbWl0IHZlcnNpb25zIHRvIHVwZGF0ZSBkZXBlbmRlbmNpZXMgdG8gdGhlIGxhdGVzdCB2ZXJzaW9ucyB3aXRoIFlhcm4uXG4gICAgc3Bhd25TeW5jKHBhY2thZ2VNYW5hZ2VyLCBbJ2FkZCcsIC4uLihkZXYgPyBbJy1EJ10gOiBbXSksIC4uLmRlcGVuZGVuY3lTcGVjaWZpZXJzXSwgY29uZmlnLmRpclBhdGgpO1xuICB9XG59XG5cbmZ1bmN0aW9uIGFkZFBhY2thZ2VKc29uRGVwZW5kZW5jaWVzKFxuICBwYWNrYWdlSnNvbkRlcGVuZGVuY2llczogUGFydGlhbDxSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+PixcbiAgZGVwZW5kZW5jaWVzOiBzdHJpbmdbXVxuKTogc3RyaW5nW10ge1xuICBjb25zdCBkZXBlbmRlbmNpZXNUb0luc3RhbGw6IHN0cmluZ1tdID0gW107XG4gIGZvciAoY29uc3QgZGVwZW5kZW5jeSBvZiBuZXcgU2V0KGRlcGVuZGVuY2llcykpIHtcbiAgICBjb25zdCBzaG91bGRVcGRhdGVFeGlzdGluZ0RlcGVuZGVuY3kgPSBzaG91bGRVcGRhdGVFeGlzdGluZ01hbmFnZWREZXBlbmRlbmN5KFxuICAgICAgZGVwZW5kZW5jeSxcbiAgICAgIHBhY2thZ2VKc29uRGVwZW5kZW5jaWVzW2RlcGVuZGVuY3ldXG4gICAgKTtcbiAgICBpZiAoc2hvdWxkVXBkYXRlRXhpc3RpbmdEZXBlbmRlbmN5KSB7XG4gICAgICBkZXBlbmRlbmNpZXNUb0luc3RhbGwucHVzaChkZXBlbmRlbmN5KTtcbiAgICB9XG4gICAgaWYgKFxuICAgICAgcGFja2FnZUpzb25EZXBlbmRlbmNpZXNbZGVwZW5kZW5jeV0gJiZcbiAgICAgICFzaG91bGRVcGRhdGVFeGlzdGluZ0RlcGVuZGVuY3kgJiZcbiAgICAgIHBhY2thZ2VKc29uRGVwZW5kZW5jaWVzW2RlcGVuZGVuY3ldICE9PSAnKidcbiAgICApXG4gICAgICBjb250aW51ZTtcbiAgICBwYWNrYWdlSnNvbkRlcGVuZGVuY2llc1tkZXBlbmRlbmN5XSA9IGdldExhdGVzdERlcGVuZGVuY3lWZXJzaW9uKGRlcGVuZGVuY3kpO1xuICB9XG4gIHJldHVybiBkZXBlbmRlbmNpZXNUb0luc3RhbGw7XG59XG5cbmZ1bmN0aW9uIGZvcm1hdFBhY2thZ2VKc29uV2l0aFByb2plY3RGb3JtYXR0ZXIoXG4gIGNvbmZpZzogUGFja2FnZUNvbmZpZyxcbiAgcGFja2FnZU1hbmFnZXI6ICdidW4nIHwgJ3lhcm4nLFxuICBmaWxlUGF0aDogc3RyaW5nXG4pOiB2b2lkIHtcbiAgY29uc3QgcmVsYXRpdmVGaWxlUGF0aCA9IHBhdGgucmVsYXRpdmUoY29uZmlnLmRpclBhdGgsIGZpbGVQYXRoKTtcbiAgaWYgKCFyZWxhdGl2ZUZpbGVQYXRoKSByZXR1cm47XG5cbiAgLy8gUmV1c2UgdGhlIHRhcmdldCByZXBvc2l0b3J5J3Mgb3duIGZvcm1hdHRlciBhZnRlciBkZXBlbmRlbmN5IGluc3RhbGxhdGlvbiBzb1xuICAvLyBwYWNrYWdlLmpzb24gbWF0Y2hlcyB3aGF0ZXZlciBpdHMgY3VycmVudCBzb3J0LXBhY2thZ2UtanNvbiB2ZXJzaW9uIGV4cGVjdHMuXG4gIC8vIFRoaXMgYXZvaWRzIGZvbGxvdy11cCBhdXRvZml4IGNvbW1pdHMgY2F1c2VkIG9ubHkgYnkgZm9ybWF0dGVyIHZlcnNpb24gZHJpZnRcbiAgLy8gYmV0d2VlbiB3YmZ5IGFuZCB0aGUgcHJvamVjdCBiZWluZyB1cGRhdGVkLlxuICBpZiAocGFja2FnZU1hbmFnZXIgPT09ICdidW4nKSB7XG4gICAgc3Bhd25TeW5jKCdidW54JywgWydzb3J0LXBhY2thZ2UtanNvbicsIHJlbGF0aXZlRmlsZVBhdGhdLCBjb25maWcuZGlyUGF0aCk7XG4gIH0gZWxzZSB7XG4gICAgc3Bhd25TeW5jKHBhY2thZ2VNYW5hZ2VyLCBbJ3NvcnQtcGFja2FnZS1qc29uJywgcmVsYXRpdmVGaWxlUGF0aF0sIGNvbmZpZy5kaXJQYXRoKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBnZXRMYXRlc3REZXBlbmRlbmN5VmVyc2lvbihkZXBlbmRlbmN5OiBzdHJpbmcpOiBzdHJpbmcge1xuICBjb25zdCBjYWNoZWRWZXJzaW9uID0gbGF0ZXN0RGVwZW5kZW5jeVZlcnNpb25DYWNoZS5nZXQoZGVwZW5kZW5jeSk7XG4gIGlmIChjYWNoZWRWZXJzaW9uKSByZXR1cm4gY2FjaGVkVmVyc2lvbjtcblxuICBjb25zdCB2ZXJzaW9uID1cbiAgICBzcGF3blN5bmNBbmRSZXR1cm5TdGRvdXQoJ25wbScsIFsnc2hvdycsIGRlcGVuZGVuY3ksICd2ZXJzaW9uJywgJy0td29ya3NwYWNlcz1mYWxzZSddLCBwcm9jZXNzLmN3ZCgpKSB8fCAnKic7XG4gIGxhdGVzdERlcGVuZGVuY3lWZXJzaW9uQ2FjaGUuc2V0KGRlcGVuZGVuY3ksIHZlcnNpb24pO1xuICByZXR1cm4gdmVyc2lvbjtcbn1cblxuLy8gVE9ETzogcmVtb3ZlIHRoZSBmb2xsb3dpbmcgbWlncmF0aW9uIGNvZGUgaW4gZnV0dXJlXG5hc3luYyBmdW5jdGlvbiByZW1vdmVEZXByZWNhdGVkU3R1ZmYoXG4gIGNvbmZpZzogUGFja2FnZUNvbmZpZyxcbiAganNvbk9iajogU2V0UmVxdWlyZWQ8UGFja2FnZUpzb24sICdzY3JpcHRzJyB8ICdkZXBlbmRlbmNpZXMnIHwgJ2RldkRlcGVuZGVuY2llcycgfCAncGVlckRlcGVuZGVuY2llcyc+XG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgaWYgKGpzb25PYmouYXV0aG9yID09PSAnV2lsbEJvb3N0ZXIgTExDJykge1xuICAgIGpzb25PYmouYXV0aG9yID0gJ1dpbGxCb29zdGVyIEluYy4nO1xuICB9XG4gIGRlbGV0ZSBqc29uT2JqLnNjcmlwdHNbJ3NvcnQtcGFja2FnZS1qc29uJ107XG4gIGRlbGV0ZSBqc29uT2JqLnNjcmlwdHNbJ3NvcnQtYWxsLXBhY2thZ2UtanNvbiddO1xuICBkZWxldGUganNvbk9iai5zY3JpcHRzWyd0eXBlY2hlY2svd2FybiddO1xuICBkZWxldGUganNvbk9iai5zY3JpcHRzWyd0eXBlY2hlY2s6Z2VuLWNvZGUnXTtcbiAgZGVsZXRlIGpzb25PYmouc2NyaXB0c1sndHlwZWNoZWNrOmNvZGVnZW4nXTtcbiAgZGVsZXRlIGpzb25PYmouZGVwZW5kZW5jaWVzLnRzbGliO1xuICBkZWxldGUganNvbk9iai5kZXZEZXBlbmRlbmNpZXNbJ0B3aWxsYm9vc3Rlci9yZW5vdmF0ZS1jb25maWcnXTtcbiAgZGVsZXRlIGpzb25PYmouZGV2RGVwZW5kZW5jaWVzWydAd2lsbGJvb3N0ZXIvdHNjb25maWcnXTtcbiAgZGVsZXRlIGpzb25PYmouZGV2RGVwZW5kZW5jaWVzLnR5cGVzY3JpcHQ7XG4gIGRlbGV0ZSBqc29uT2JqLmRldkRlcGVuZGVuY2llcy5sZXJuYTtcbiAgLy8gVG8gaW5zdGFsbCB0aGUgbGF0ZXN0IHBpbnN0XG4gIGRlbGV0ZSBqc29uT2JqLmRldkRlcGVuZGVuY2llcy5waW5zdDtcbiAgZGVsZXRlIGpzb25PYmouc2NyaXB0c1snZmx1dHRlci1mb3JtYXQnXTtcbiAgZGVsZXRlIGpzb25PYmouc2NyaXB0c1snZm9ybWF0LWZsdXR0ZXInXTtcbiAgZGVsZXRlIGpzb25PYmouc2NyaXB0c1sncHl0aG9uLWZvcm1hdCddO1xuICBkZWxldGUganNvbk9iai5zY3JpcHRzWydmb3JtYXQtcHl0aG9uJ107XG4gIGRlbGV0ZSBqc29uT2JqLnNjcmlwdHMucHJldHRpZXI7XG4gIGRlbGV0ZSBqc29uT2JqLnNjcmlwdHNbJ2NoZWNrLWFsbCddO1xuICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnMucHJvbWlzZXMucm0ocGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnbGVybmEuanNvbicpLCB7IGZvcmNlOiB0cnVlIH0pKTtcblxuICByZW1vdmVPYnNvbGV0ZUxpbnREZXBlbmRlbmNpZXMoanNvbk9iaiwgY29uZmlnKTtcbn1cblxuZnVuY3Rpb24gcmVtb3ZlT2Jzb2xldGVMaW50RGVwZW5kZW5jaWVzKFxuICBqc29uT2JqOiBTZXRSZXF1aXJlZDxQYWNrYWdlSnNvbiwgJ2RlcGVuZGVuY2llcycgfCAnZGV2RGVwZW5kZW5jaWVzJyB8ICdwZWVyRGVwZW5kZW5jaWVzJz4sXG4gIGNvbmZpZzogUGFja2FnZUNvbmZpZ1xuKTogdm9pZCB7XG4gIGNvbnN0IHByZXNlcnZlTWljcm9tYXRjaCA9IHNob3VsZFByZXNlcnZlTWljcm9tYXRjaChjb25maWcpO1xuICBmb3IgKGNvbnN0IGRlcGVuZGVuY3kgb2Ygb2Jzb2xldGVMaW50RGVwZW5kZW5jaWVzKSB7XG4gICAgaWYgKHByZXNlcnZlTWljcm9tYXRjaCAmJiBtaWNyb21hdGNoUGFja2FnZU5hbWVzLmhhcyhkZXBlbmRlbmN5KSkgY29udGludWU7XG4gICAgaWYgKHNob3VsZFByZXNlcnZlQ29uZmlnUGFja2FnZUxpbnREZXBlbmRlbmN5KGpzb25PYmosIGNvbmZpZywgZGVwZW5kZW5jeSkpIGNvbnRpbnVlO1xuICAgIGRlbGV0ZSBqc29uT2JqLmRlcGVuZGVuY2llc1tkZXBlbmRlbmN5XTtcbiAgICBkZWxldGUganNvbk9iai5kZXZEZXBlbmRlbmNpZXNbZGVwZW5kZW5jeV07XG4gICAgZGVsZXRlIGpzb25PYmoucGVlckRlcGVuZGVuY2llc1tkZXBlbmRlbmN5XTtcbiAgfVxufVxuXG5mdW5jdGlvbiBzaG91bGRQcmVzZXJ2ZUNvbmZpZ1BhY2thZ2VMaW50RGVwZW5kZW5jeShcbiAganNvbk9iajogU2V0UmVxdWlyZWQ8UGFja2FnZUpzb24sICdkZXBlbmRlbmNpZXMnIHwgJ2RldkRlcGVuZGVuY2llcycgfCAncGVlckRlcGVuZGVuY2llcyc+LFxuICBjb25maWc6IFBhY2thZ2VDb25maWcsXG4gIGRlcGVuZGVuY3k6IHN0cmluZ1xuKTogYm9vbGVhbiB7XG4gIGlmICghaXNQdWJsaXNoZWRXaWxsYm9vc3RlckNvbmZpZ3NQYWNrYWdlKGNvbmZpZykpIHJldHVybiBmYWxzZTtcbiAgaWYgKGpzb25PYmoucGVlckRlcGVuZGVuY2llc1tkZXBlbmRlbmN5XSkgcmV0dXJuIHRydWU7XG5cbiAgLy8gUHVibGlzaGVkIGNvbmZpZyBwYWNrYWdlcyBuZWVkIGxvY2FsIHR5cGUtb25seSBkZXBzIHRvIHZhbGlkYXRlIHRoZVxuICAvLyBwYWNrYWdlLXByb3ZpZGVkIGNvbmZpZyBkZWNsYXJhdGlvbnMgdW5kZXIgWWFybiBQblAuXG4gIHJldHVybiBkZXBlbmRlbmN5ID09PSAnQHR5cGVzL2VzbGludCcgJiYgISFqc29uT2JqLnBlZXJEZXBlbmRlbmNpZXMuZXNsaW50O1xufVxuXG5mdW5jdGlvbiBzaG91bGRQcmVzZXJ2ZU1pY3JvbWF0Y2goY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogYm9vbGVhbiB7XG4gIC8vIHdpbGxib29zdGVyLWNvbmZpZ3Mgc3VicGFja2FnZXMgcHVibGlzaCBjb25maWcgZmlsZXMgYXMgdGhlaXIgcHJvZHVjdCwgc29cbiAgLy8gbWljcm9tYXRjaCBpcyBwYWNrYWdlIGRhdGEgdGhlcmUuIE90aGVyIHJlcG9zIGtlZXAgbWljcm9tYXRjaCBvbmx5IHdoZW5cbiAgLy8gcHJvZHVjdCBjb2RlIGltcG9ydHMgaXQ7IG90aGVyd2lzZSBpdCBpcyB0cmVhdGVkIGFzIG9ic29sZXRlIEVTTGludC1lcmFcbiAgLy8gdG9vbGluZy5cbiAgcmV0dXJuIChjb25maWcuaXNXaWxsQm9vc3RlckNvbmZpZ3MgJiYgIWNvbmZpZy5pc1Jvb3QpIHx8IGRvZXNQcm9kdWN0Q29kZUltcG9ydE1pY3JvbWF0Y2goY29uZmlnLmRpclBhdGgpO1xufVxuXG5mdW5jdGlvbiBkb2VzUHJvZHVjdENvZGVJbXBvcnRNaWNyb21hdGNoKGRpclBhdGg6IHN0cmluZyk6IGJvb2xlYW4ge1xuICBjb25zdCBmaWxlUGF0aHMgPSBmZy5nbG9iU3luYygnc3JjLyoqLyoue2pzLGpzeCxtanMsY2pzLHRzLHRzeCxtdHMsY3RzfScsIHtcbiAgICBjd2Q6IGRpclBhdGgsXG4gICAgZG90OiB0cnVlLFxuICAgIGlnbm9yZTogZ2xvYklnbm9yZSxcbiAgfSk7XG4gIHJldHVybiBmaWxlUGF0aHMuc29tZSgoZmlsZVBhdGgpID0+IHtcbiAgICB0cnkge1xuICAgICAgcmV0dXJuIG1pY3JvbWF0Y2hJbXBvcnRQYXR0ZXJuLnRlc3QoZnMucmVhZEZpbGVTeW5jKHBhdGgucmVzb2x2ZShkaXJQYXRoLCBmaWxlUGF0aCksICd1dGY4JykpO1xuICAgIH0gY2F0Y2gge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfSk7XG59XG5cbmZ1bmN0aW9uIHNob3VsZFVwZGF0ZUV4aXN0aW5nTWFuYWdlZERlcGVuZGVuY3koZGVwZW5kZW5jeTogc3RyaW5nLCBjdXJyZW50VmVyc2lvbjogc3RyaW5nIHwgdW5kZWZpbmVkKTogYm9vbGVhbiB7XG4gIGlmICghY3VycmVudFZlcnNpb24pIHJldHVybiB0cnVlO1xuICBpZiAoY3VycmVudFZlcnNpb24gPT09ICcqJykgcmV0dXJuIHRydWU7XG4gIC8vIHdiZnktbWFuYWdlZCB0b29scyBtdXN0IGJlIGtlcHQgY3VycmVudCBldmVuIHdoZW4gdGhlIHBhY2thZ2UgYWxyZWFkeSBwaW5zXG4gIC8vIGEgY29uY3JldGUgdmVyc2lvbi4gSW4gcGFydGljdWxhciwgYnVpbGQtdHMgb3ducyBkZWNsYXJhdGlvbiBvdXRwdXQgcGF0aHMuXG4gIHJldHVybiAoXG4gICAgZGVwZW5kZW5jeSA9PT0gJ0B3aWxsYm9vc3Rlci93YicgfHxcbiAgICBkZXBlbmRlbmN5ID09PSBidWlsZFRzRGVwZW5kZW5jeSB8fFxuICAgIGRlcGVuZGVuY3kgPT09ICdAd2lsbGJvb3N0ZXIvb3hsaW50LWNvbmZpZycgfHxcbiAgICBkZXBlbmRlbmN5ID09PSAnb3hsaW50JyB8fFxuICAgIGRlcGVuZGVuY3kgPT09IHR5cGVzY3JpcHRHb0RlcGVuZGVuY3lcbiAgKTtcbn1cblxuZnVuY3Rpb24gYWRkU3RhcnRUZXN0U2VydmVyU2NyaXB0SWZOZWVkZWQoY29uZmlnOiBQYWNrYWdlQ29uZmlnLCBqc29uT2JqOiBQYWNrYWdlSnNvbik6IHZvaWQge1xuICBpZiAoIWNvbmZpZy5kZXBlbmRpbmcucGxheXdyaWdodFRlc3QgfHwgIWNvbmZpZy5kZXBlbmRpbmcud2IgfHwganNvbk9iai5zY3JpcHRzPy5bJ3N0YXJ0LXRlc3Qtc2VydmVyJ10pIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBqc29uT2JqLnNjcmlwdHMgPz89IHt9O1xuICBqc29uT2JqLnNjcmlwdHNbJ3N0YXJ0LXRlc3Qtc2VydmVyJ10gPSAnd2Igc3RhcnQgLS1tb2RlIHRlc3QnO1xufVxuXG5mdW5jdGlvbiBmb3JtYXRSZXBvc2l0b3J5Rm9yUGFja2FnZUpzb24oXG4gIHJlcG9zaXRvcnk6IFBhY2thZ2VKc29uWydyZXBvc2l0b3J5J10sXG4gIGV4aXN0aW5nUmVwb3NpdG9yeT86IFBhY2thZ2VKc29uWydyZXBvc2l0b3J5J11cbik6IFBhY2thZ2VKc29uWydyZXBvc2l0b3J5J10ge1xuICBjb25zdCBub3JtYWxpemVkUmVwb3NpdG9yeSA9IG5vcm1hbGl6ZVJlcG9zaXRvcnlVcmxGb3JQYWNrYWdlSnNvbihyZXBvc2l0b3J5KTtcbiAgaWYgKG5vcm1hbGl6ZWRSZXBvc2l0b3J5KSB7XG4gICAgcmV0dXJuIGJ1aWxkTm9ybWFsaXplZFJlcG9zaXRvcnlGb3JQYWNrYWdlSnNvbihub3JtYWxpemVkUmVwb3NpdG9yeSwgcmVwb3NpdG9yeSwgZXhpc3RpbmdSZXBvc2l0b3J5KTtcbiAgfVxuXG4gIGNvbnN0IG5vcm1hbGl6ZWRFeGlzdGluZ1JlcG9zaXRvcnkgPSBub3JtYWxpemVSZXBvc2l0b3J5VXJsRm9yUGFja2FnZUpzb24oZXhpc3RpbmdSZXBvc2l0b3J5KTtcbiAgaWYgKG5vcm1hbGl6ZWRFeGlzdGluZ1JlcG9zaXRvcnkpIHtcbiAgICByZXR1cm4gYnVpbGROb3JtYWxpemVkUmVwb3NpdG9yeUZvclBhY2thZ2VKc29uKG5vcm1hbGl6ZWRFeGlzdGluZ1JlcG9zaXRvcnksIGV4aXN0aW5nUmVwb3NpdG9yeSk7XG4gIH1cblxuICByZXR1cm4gcmVwb3NpdG9yeTtcbn1cblxuZnVuY3Rpb24gbm9ybWFsaXplUmVwb3NpdG9yeVVybEZvclBhY2thZ2VKc29uKHJlcG9zaXRvcnk6IFBhY2thZ2VKc29uWydyZXBvc2l0b3J5J10pOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBpZiAodHlwZW9mIHJlcG9zaXRvcnkgPT09ICdzdHJpbmcnKSB7XG4gICAgaWYgKCFyZXBvc2l0b3J5LnN0YXJ0c1dpdGgoJ2dpdGh1YjonKSkgcmV0dXJuO1xuXG4gICAgY29uc3QgW293bmVyLCByZXBvXSA9IGdpdEh1YlV0aWwuZ2V0T3JnQW5kTmFtZShyZXBvc2l0b3J5KTtcbiAgICBpZiAoIW93bmVyIHx8ICFyZXBvKSByZXR1cm47XG4gICAgcmV0dXJuIGBnaXQraHR0cHM6Ly9naXRodWIuY29tLyR7b3duZXJ9LyR7cmVwb30uZ2l0YDtcbiAgfVxuXG4gIGNvbnN0IHJlcG9zaXRvcnlVcmwgPSByZXBvc2l0b3J5Py51cmw7XG4gIGlmICh0eXBlb2YgcmVwb3NpdG9yeVVybCAhPT0gJ3N0cmluZycpIHJldHVybjtcblxuICBjb25zdCBtYXRjaGVkID0gL14oPzpnaXRcXCspP2h0dHBzOlxcL1xcL2dpdGh1YlxcLmNvbVxcLyhbXi9dKylcXC8oW14vXSs/KSg/OlxcLmdpdCk/JC91LmV4ZWMocmVwb3NpdG9yeVVybCk7XG4gIGlmICghbWF0Y2hlZCkgcmV0dXJuO1xuXG4gIGNvbnN0IFssIG93bmVyLCByZXBvXSA9IG1hdGNoZWQ7XG4gIHJldHVybiBgZ2l0K2h0dHBzOi8vZ2l0aHViLmNvbS8ke293bmVyfS8ke3JlcG99LmdpdGA7XG59XG5cbmZ1bmN0aW9uIGJ1aWxkTm9ybWFsaXplZFJlcG9zaXRvcnlGb3JQYWNrYWdlSnNvbihcbiAgbm9ybWFsaXplZFVybDogc3RyaW5nLFxuICByZXBvc2l0b3J5OiBQYWNrYWdlSnNvblsncmVwb3NpdG9yeSddLFxuICBleGlzdGluZ1JlcG9zaXRvcnk/OiBQYWNrYWdlSnNvblsncmVwb3NpdG9yeSddXG4pOiBQYWNrYWdlSnNvblsncmVwb3NpdG9yeSddIHtcbiAgY29uc3QgcmVwb3NpdG9yeU9iaiA9XG4gICAgdHlwZW9mIHJlcG9zaXRvcnkgPT09ICdvYmplY3QnXG4gICAgICA/IHJlcG9zaXRvcnlcbiAgICAgIDogdHlwZW9mIGV4aXN0aW5nUmVwb3NpdG9yeSA9PT0gJ29iamVjdCdcbiAgICAgICAgPyBleGlzdGluZ1JlcG9zaXRvcnlcbiAgICAgICAgOiB1bmRlZmluZWQ7XG5cbiAgcmV0dXJuIHtcbiAgICAuLi5yZXBvc2l0b3J5T2JqLFxuICAgIHR5cGU6ICdnaXQnLFxuICAgIHVybDogbm9ybWFsaXplZFVybCxcbiAgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdlbmVyYXRlU2NyaXB0cyhjb25maWc6IFBhY2thZ2VDb25maWcsIG9sZFNjcmlwdHM6IFBhY2thZ2VKc29uLlNjcmlwdHMpOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+IHtcbiAgaWYgKGNvbmZpZy5pc0J1bikge1xuICAgIGNvbnN0IGhhc1R5cGVjaGVjayA9IGNvbmZpZy5kb2VzQ29udGFpblR5cGVTY3JpcHQgfHwgY29uZmlnLmRvZXNDb250YWluVHlwZVNjcmlwdEluUGFja2FnZXM7XG4gICAgY29uc3Qgc2NyaXB0czogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHtcbiAgICAgICdjaGVjay1hbGwtZm9yLWFpJzogJ2J1biBydW4gY2hlY2stZm9yLWFpICYmIGJ1biBydW4gdGVzdCcsXG4gICAgICAnY2hlY2stZm9yLWFpJzogJ2J1biBydW4gY2xlYW51cCcsXG4gICAgICBjbGVhbnVwOiAnYnVuIC0tYnVuIHdiIGxpbnQgLS1maXggLS1mb3JtYXQnLFxuICAgICAgZm9ybWF0OiBgYnVuIC0tYnVuIHdiIGxpbnQgLS1mb3JtYXRgLFxuICAgICAgbGludDogYGJ1biAtLWJ1biB3YiBsaW50YCxcbiAgICAgICdsaW50LWZpeCc6ICdidW4gLS1idW4gd2IgbGludCAtLWZpeCcsXG4gICAgICB0ZXN0OiAnYnVuIHdiIHRlc3QnLFxuICAgICAgdHlwZWNoZWNrOiAnYnVuIC0tYnVuIHdiIHR5cGVjaGVjaycsXG4gICAgfTtcbiAgICBpZiAoIWhhc1R5cGVjaGVjaykge1xuICAgICAgZGVsZXRlIHNjcmlwdHMudHlwZWNoZWNrO1xuICAgIH0gZWxzZSBpZiAoY29uZmlnLmRlcGVuZGluZy5weXJpZ2h0KSB7XG4gICAgICBzY3JpcHRzLnR5cGVjaGVjayArPSAnICYmIHB5cmlnaHQnO1xuICAgIH1cbiAgICByZXR1cm4gc2NyaXB0cztcbiAgfSBlbHNlIHtcbiAgICBjb25zdCBoYXNUeXBlY2hlY2sgPSBjb25maWcuZG9lc0NvbnRhaW5UeXBlU2NyaXB0IHx8IGNvbmZpZy5kb2VzQ29udGFpblR5cGVTY3JpcHRJblBhY2thZ2VzO1xuICAgIGNvbnN0IGhhc0pzT3JUcyA9IGRvZXNDb250YWluSnNPclRzKGNvbmZpZyk7XG4gICAgY29uc3QgaGFzSmF2YSA9IGRvZXNDb250YWluSmF2YShjb25maWcpO1xuICAgIGNvbnN0IG9sZFRlc3QgPSBvbGRTY3JpcHRzLnRlc3Q7XG4gICAgbGV0IHNjcmlwdHM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7XG4gICAgICAnY2hlY2stYWxsLWZvci1haSc6ICd5YXJuIGNoZWNrLWZvci1haSAmJiB5YXJuIHRlc3QnLFxuICAgICAgJ2NoZWNrLWZvci1haSc6IGB5YXJuIGZvcm1hdCA+IC9kZXYvbnVsbCAyPiAvZGV2L251bGwgfHwgdHJ1ZSAmJiB5YXJuIGxpbnQtZml4IC0tcXVpZXRgLFxuICAgICAgY2xlYW51cDogJ3lhcm4gZm9ybWF0ICYmIHlhcm4gbGludC1maXgnLFxuICAgICAgZm9ybWF0OiBnZW5lcmF0ZUZvcm1hdFNjcmlwdChoYXNKc09yVHMsIGhhc0phdmEpLFxuICAgICAgbGludDogYG94bGludCAtLW5vLWVycm9yLW9uLXVubWF0Y2hlZC1wYXR0ZXJuIC5gLFxuICAgICAgJ2xpbnQtZml4JzogJ3lhcm4gbGludCAtLWZpeCcsXG4gICAgICAnZm9ybWF0LWNvZGUnOiBgb3hmbXQgLS13cml0ZSAtLW5vLWVycm9yLW9uLXVubWF0Y2hlZC1wYXR0ZXJuIC5gLFxuICAgICAgdHlwZWNoZWNrOiAndHNnbyAtLW5vRW1pdCcsXG4gICAgfTtcbiAgICBpZiAoaGFzSmF2YSkge1xuICAgICAgc2NyaXB0cy5wcmV0dGlmeSA9IGBwcmV0dGllciAtLWNhY2hlIC0tY29sb3IgLS1uby1lcnJvci1vbi11bm1hdGNoZWQtcGF0dGVybiAtLXdyaXRlIFwiKiovey4qLyx9Ki57JHtleHRlbnNpb25zLnByZXR0aWVyT25seS5qb2luKCcsJyl9fVwiIFwiISoqL3Rlc3R7LSwvfWZpeHR1cmVzLyoqXCJgO1xuICAgIH1cbiAgICBpZiAoY29uZmlnLmRvZXNDb250YWluU3ViUGFja2FnZUpzb25zKSB7XG4gICAgICBzY3JpcHRzID0gbWVyZ2UoXG4gICAgICAgIHsgLi4uc2NyaXB0cyB9LFxuICAgICAgICB7XG4gICAgICAgICAgZm9ybWF0OiBgJHtzY3JpcHRzLmZvcm1hdH0gJiYgeWFybiB3b3Jrc3BhY2VzIGZvcmVhY2ggLS1hbGwgLS1wYXJhbGxlbCAtLXZlcmJvc2UgcnVuIGZvcm1hdGAsXG4gICAgICAgICAgbGludDogYHlhcm4gd29ya3NwYWNlcyBmb3JlYWNoIC0tYWxsIC0tcGFyYWxsZWwgLS12ZXJib3NlIHJ1biBsaW50YCxcbiAgICAgICAgICAnbGludC1maXgnOiAneWFybiB3b3Jrc3BhY2VzIGZvcmVhY2ggLS1hbGwgLS1wYXJhbGxlbCAtLXZlcmJvc2UgcnVuIGxpbnQtZml4JyxcbiAgICAgICAgICAvLyBDST0xIHByZXZlbnRzIHZpdGVzdCBmcm9tIGVuYWJsaW5nIHdhdGNoLlxuICAgICAgICAgIC8vIEZPUkNFX0NPTE9SPTMgbWFrZSB3YiBlbmFibGUgY29sb3Igb3V0cHV0LlxuICAgICAgICAgIHRlc3Q6ICdDST0xIEZPUkNFX0NPTE9SPTMgeWFybiB3b3Jrc3BhY2VzIGZvcmVhY2ggLS1hbGwgLS12ZXJib3NlIHJ1biB0ZXN0JyxcbiAgICAgICAgICB0eXBlY2hlY2s6ICd5YXJuIHdvcmtzcGFjZXMgZm9yZWFjaCAtLWFsbCAtLXBhcmFsbGVsIC0tdmVyYm9zZSBydW4gdHlwZWNoZWNrJyxcbiAgICAgICAgfVxuICAgICAgKTtcbiAgICAgIGlmIChoYXNKYXZhKSB7XG4gICAgICAgIHNjcmlwdHMucHJldHRpZnkgPSBgcHJldHRpZXIgLS1jYWNoZSAtLWNvbG9yIC0tbm8tZXJyb3Itb24tdW5tYXRjaGVkLXBhdHRlcm4gLS13cml0ZSBcIioqL3suKi8sfSoueyR7ZXh0ZW5zaW9ucy5wcmV0dGllck9ubHkuam9pbihcbiAgICAgICAgICAnLCdcbiAgICAgICAgKX19XCIgXCIhKiovcGFja2FnZXMvKipcIiBcIiEqKi90ZXN0ey0sL31maXh0dXJlcy8qKlwiYDtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKGNvbmZpZy5kZXBlbmRpbmcucHlyaWdodCkge1xuICAgICAgc2NyaXB0cy50eXBlY2hlY2sgPSBzY3JpcHRzLnR5cGVjaGVjayA/IGAke3NjcmlwdHMudHlwZWNoZWNrfSAmJiBgIDogJyc7XG4gICAgICBzY3JpcHRzLnR5cGVjaGVjayArPSAncHlyaWdodCc7XG4gICAgfVxuICAgIGlmIChvbGRUZXN0Py5pbmNsdWRlcygnd2IgdGVzdCcpKSB7XG4gICAgICBzY3JpcHRzLnRlc3QgPSBvbGRUZXN0O1xuICAgIH1cbiAgICBpZiAoIWhhc0pzT3JUcykge1xuICAgICAgZGVsZXRlIHNjcmlwdHNbJ2Zvcm1hdC1jb2RlJ107XG4gICAgICBkZWxldGUgc2NyaXB0cy5saW50O1xuICAgICAgZGVsZXRlIHNjcmlwdHNbJ2xpbnQtZml4J107XG4gICAgfVxuICAgIGlmICghaGFzVHlwZWNoZWNrKSB7XG4gICAgICBkZWxldGUgc2NyaXB0cy50eXBlY2hlY2s7XG4gICAgfSBlbHNlIGlmIChjb25maWcuZGVwZW5kaW5nLndiKSB7XG4gICAgICBzY3JpcHRzLnR5cGVjaGVjayA9ICd3YiB0eXBlY2hlY2snO1xuICAgIH1cbiAgICByZXR1cm4gc2NyaXB0cztcbiAgfVxufVxuXG5mdW5jdGlvbiBnZW5lcmF0ZUZvcm1hdFNjcmlwdChoYXNKc09yVHM6IGJvb2xlYW4sIGhhc0phdmE6IGJvb2xlYW4pOiBzdHJpbmcge1xuICBjb25zdCBjb21tYW5kcyA9IFsnc29ydC1wYWNrYWdlLWpzb24nXTtcbiAgaWYgKGhhc0pzT3JUcykge1xuICAgIGNvbW1hbmRzLnB1c2goJ3lhcm4gZm9ybWF0LWNvZGUnKTtcbiAgfVxuICBpZiAoaGFzSmF2YSkge1xuICAgIGNvbW1hbmRzLnB1c2goJ3lhcm4gcHJldHRpZnknKTtcbiAgfVxuICByZXR1cm4gY29tbWFuZHMuam9pbignICYmICcpO1xufVxuXG5hc3luYyBmdW5jdGlvbiBnZW5lcmF0ZVByZXR0aWVyU3VmZml4KGRpclBhdGg6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nPiB7XG4gIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKGRpclBhdGgsICcucHJldHRpZXJpZ25vcmUnKTtcbiAgY29uc3QgZXhpc3RpbmdDb250ZW50ID0gYXdhaXQgZnMucHJvbWlzZXMucmVhZEZpbGUoZmlsZVBhdGgsICd1dGY4JykuY2F0Y2goKCkgPT4gJycpO1xuICBjb25zdCBpbmRleCA9IGV4aXN0aW5nQ29udGVudC5pbmRleE9mKGlnbm9yZUZpbGVVdGlsLnNlcGFyYXRvclByZWZpeCk7XG4gIGlmIChpbmRleCA9PT0gLTEpIHJldHVybiAnJztcblxuICBjb25zdCBvcmlnaW5hbENvbnRlbnQgPSBleGlzdGluZ0NvbnRlbnQuc2xpY2UoMCwgaW5kZXgpO1xuICBjb25zdCBsaW5lcyA9IG9yaWdpbmFsQ29udGVudFxuICAgIC5zcGxpdCgnXFxuJylcbiAgICAubWFwKChsaW5lKSA9PiB7XG4gICAgICBjb25zdCBuZXdMaW5lID0gbGluZS50cmltKCk7XG4gICAgICByZXR1cm4gbmV3TGluZS5lbmRzV2l0aCgnLycpID8gbmV3TGluZS5zbGljZSgwLCAtMSkgOiBuZXdMaW5lO1xuICAgIH0pXG4gICAgLmZpbHRlcigobCkgPT4gbCAmJiAhbC5zdGFydHNXaXRoKCcjJykgJiYgIWwuaW5jbHVkZXMoJy8nKSk7XG5cbiAgcmV0dXJuIGAke2xpbmVzLm1hcCgobGluZSkgPT4gYCBcIiEqKi8ke2xpbmV9LyoqXCJgKS5qb2luKCcnKX0gfHwgdHJ1ZWA7XG59XG5cbmZ1bmN0aW9uIHJlbW92ZVByZXR0aWVyQXJ0aWZhY3RzKGpzb25PYmo6IFdyaXRhYmxlUGFja2FnZUpzb24pOiB2b2lkIHtcbiAgZGVsZXRlIGpzb25PYmoucHJldHRpZXI7XG4gIGNvbnN0IGRlcGVuZGVuY3lTZWN0aW9uczogQXJyYXk8UGFydGlhbDxSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+PiB8IHVuZGVmaW5lZD4gPSBbXG4gICAganNvbk9iai5kZXBlbmRlbmNpZXMsXG4gICAganNvbk9iai5kZXZEZXBlbmRlbmNpZXMsXG4gICAganNvbk9iai5wZWVyRGVwZW5kZW5jaWVzLFxuICBdO1xuICBmb3IgKGNvbnN0IHNlY3Rpb24gb2YgZGVwZW5kZW5jeVNlY3Rpb25zKSB7XG4gICAgaWYgKCFzZWN0aW9uKSBjb250aW51ZTtcbiAgICBkZWxldGUgc2VjdGlvbi5wcmV0dGllcjtcbiAgICBkZWxldGUgc2VjdGlvblsncHJldHRpZXItcGx1Z2luLWphdmEnXTtcbiAgICBkZWxldGUgc2VjdGlvblsnQHdpbGxib29zdGVyL3ByZXR0aWVyLWNvbmZpZyddO1xuICAgIGRlbGV0ZSBzZWN0aW9uWydAdHlwZXMvcHJldHRpZXInXTtcbiAgfVxufVxuXG5hc3luYyBmdW5jdGlvbiB1cGRhdGVQcml2YXRlUGFja2FnZXMoanNvbk9iajogV3JpdGFibGVQYWNrYWdlSnNvbik6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBwYWNrYWdlTmFtZXMgPSBuZXcgU2V0KFsuLi5PYmplY3Qua2V5cyhqc29uT2JqLmRlcGVuZGVuY2llcyksIC4uLk9iamVjdC5rZXlzKGpzb25PYmouZGV2RGVwZW5kZW5jaWVzKV0pO1xuICBjb25zdCBwcml2YXRlUGFja2FnZXM6IHtcbiAgICBwYWNrYWdlTmFtZTogc3RyaW5nO1xuICAgIHJlcG86IHN0cmluZztcbiAgICB0YXJnZXQ6ICdkZXBlbmRlbmNpZXMnIHwgJ2RldkRlcGVuZGVuY2llcyc7XG4gIH1bXSA9IFtcbiAgICB7IHBhY2thZ2VOYW1lOiAnQHdpbGxib29zdGVyL2F1dGgnLCByZXBvOiAnYXV0aCcsIHRhcmdldDogJ2RlcGVuZGVuY2llcycgfSxcbiAgICB7IHBhY2thZ2VOYW1lOiAnQGRpc2NvcmQtYm90L3NoYXJlZCcsIHJlcG86ICdkaXNjb3JkLWJvdCcsIHRhcmdldDogJ2RlcGVuZGVuY2llcycgfSxcbiAgICB7IHBhY2thZ2VOYW1lOiAnQHdpbGxib29zdGVyL2NvZGUtYW5hbHl6ZXInLCByZXBvOiAnY29kZS1hbmFseXplcicsIHRhcmdldDogJ2RldkRlcGVuZGVuY2llcycgfSxcbiAgICB7IHBhY2thZ2VOYW1lOiAnQHdpbGxib29zdGVyL2p1ZGdlJywgcmVwbzogJ2p1ZGdlJywgdGFyZ2V0OiAnZGVwZW5kZW5jaWVzJyB9LFxuICAgIHsgcGFja2FnZU5hbWU6ICdAd2lsbGJvb3N0ZXIvbGxtLXByb3h5JywgcmVwbzogJ2xsbS1wcm94eScsIHRhcmdldDogJ2RlcGVuZGVuY2llcycgfSxcbiAgXTtcblxuICBhd2FpdCBQcm9taXNlLmFsbChcbiAgICBwcml2YXRlUGFja2FnZXMubWFwKGFzeW5jICh7IHBhY2thZ2VOYW1lLCByZXBvLCB0YXJnZXQgfSkgPT4ge1xuICAgICAgaWYgKCFwYWNrYWdlTmFtZXMuaGFzKHBhY2thZ2VOYW1lKSB8fCBpc1dvcmtzcGFjZVBhY2thZ2UoanNvbk9iaiwgcGFja2FnZU5hbWUpKSByZXR1cm47XG5cbiAgICAgIGNvbnN0IG90aGVyVGFyZ2V0ID0gdGFyZ2V0ID09PSAnZGVwZW5kZW5jaWVzJyA/ICdkZXZEZXBlbmRlbmNpZXMnIDogJ2RlcGVuZGVuY2llcyc7XG4gICAgICAvLyBUaGUgbGludCBydWxlIGRpc2FsbG93cyBgZGVsZXRlYCB3aXRoIGNvbXB1dGVkIHBhY2thZ2UgbmFtZXM7IFJlZmxlY3QgaGFzIHRoZSBzYW1lIGRlbGV0aW9uIHNlbWFudGljcyBoZXJlLlxuICAgICAgUmVmbGVjdC5kZWxldGVQcm9wZXJ0eShqc29uT2JqW290aGVyVGFyZ2V0XSwgcGFja2FnZU5hbWUpO1xuICAgICAganNvbk9ialt0YXJnZXRdW3BhY2thZ2VOYW1lXSA9IGF3YWl0IGdldExhdGVzdFByaXZhdGVQYWNrYWdlU3BlY2lmaWVyKHJlcG8pO1xuICAgIH0pXG4gICk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGdldExhdGVzdFByaXZhdGVQYWNrYWdlU3BlY2lmaWVyKHJlcG86IHN0cmluZyk6IFByb21pc2U8c3RyaW5nPiB7XG4gIGNvbnN0IGNvbW1pdEhhc2ggPSBhd2FpdCBnZXRMYXRlc3RDb21taXRIYXNoKCdXaWxsQm9vc3RlckxhYicsIHJlcG8pO1xuICByZXR1cm4gYGdpdEBnaXRodWIuY29tOldpbGxCb29zdGVyTGFiLyR7cmVwb30uZ2l0IyR7Y29tbWl0SGFzaH1gO1xufVxuXG5mdW5jdGlvbiBpc1dvcmtzcGFjZVBhY2thZ2UoanNvbk9iajogUGFja2FnZUpzb24sIHBhY2thZ2VOYW1lOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgcmV0dXJuIChqc29uT2JqLmRldkRlcGVuZGVuY2llcz8uW3BhY2thZ2VOYW1lXSB8fCBqc29uT2JqLmRlcGVuZGVuY2llcz8uW3BhY2thZ2VOYW1lXSB8fCAnJykuaW5jbHVkZXMoJ3dvcmtzcGFjZScpO1xufVxuIiwiaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRUc2NvbmZpZ0V4dGVuZHMoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogc3RyaW5nIHwgc3RyaW5nW10ge1xuICBpZiAoY29uZmlnLmlzQnVuKSB7XG4gICAgcmV0dXJuICdAdHNjb25maWcvYnVuL3RzY29uZmlnLmpzb24nO1xuICB9XG4gIGlmIChjb25maWcuZGVwZW5kaW5nLnJlYWN0TmF0aXZlKSB7XG4gICAgcmV0dXJuICdAdHNjb25maWcvcmVhY3QtbmF0aXZlL3RzY29uZmlnLmpzb24nO1xuICB9XG4gIHJldHVybiBbJ0B0c2NvbmZpZy9ub2RlLWx0cy90c2NvbmZpZy5qc29uJywgJ0B0c2NvbmZpZy9ub2RlLXRzL3RzY29uZmlnLmpzb24nXTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldFRzY29uZmlnQmFzZURlcGVuZGVuY2llcyhjb25maWc6IFBhY2thZ2VDb25maWcpOiBzdHJpbmdbXSB7XG4gIGlmIChjb25maWcuaXNCdW4pIHtcbiAgICByZXR1cm4gWydAdHNjb25maWcvYnVuJ107XG4gIH1cbiAgaWYgKGNvbmZpZy5kZXBlbmRpbmcucmVhY3ROYXRpdmUpIHtcbiAgICByZXR1cm4gWydAdHNjb25maWcvcmVhY3QtbmF0aXZlJ107XG4gIH1cbiAgcmV0dXJuIFsnQHRzY29uZmlnL25vZGUtbHRzJywgJ0B0c2NvbmZpZy9ub2RlLXRzJ107XG59XG4iLCJpbXBvcnQgeyBzcGF3blN5bmNBbmRSZXR1cm5TdGRvdXQgfSBmcm9tICcuLi91dGlscy9zcGF3blV0aWwuanMnO1xuXG5leHBvcnQgZnVuY3Rpb24gZ2V0TGF0ZXN0Q29tbWl0SGFzaChvcmdhbml6YXRpb246IHN0cmluZywgcmVwbzogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgdHJ5IHtcbiAgICBjb25zdCByZXBvVXJsID0gYGdpdEBnaXRodWIuY29tOiR7b3JnYW5pemF0aW9ufS8ke3JlcG99LmdpdGA7XG4gICAgY29uc3Qgb3V0cHV0ID0gc3Bhd25TeW5jQW5kUmV0dXJuU3Rkb3V0KCdnaXQnLCBbJ2xzLXJlbW90ZScsIHJlcG9VcmwsICdIRUFEJ10sIHByb2Nlc3MuY3dkKCkpO1xuICAgIGNvbnN0IGNvbW1pdEhhc2ggPSBvdXRwdXQuc3BsaXQoL1xccysvKVswXTtcbiAgICBpZiAoIWNvbW1pdEhhc2gpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgTm8gY29tbWl0cyBmb3VuZCBmb3IgJHtvcmdhbml6YXRpb259LyR7cmVwb31gKTtcbiAgICB9XG4gICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShjb21taXRIYXNoKTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IEVycm9yKGBGYWlsZWQgdG8gZmV0Y2ggY29tbWl0cyBmb3IgJHtvcmdhbml6YXRpb259LyR7cmVwb306ICR7U3RyaW5nKGVycm9yKX1gKSk7XG4gIH1cbn1cbiIsIi8vIG94bGludC1kaXNhYmxlIGVzbGludC1wbHVnaW4taW1wb3J0L25vLW5hbWVkLWFzLWRlZmF1bHQtbWVtYmVyIC0tIE5hbWVzcGFjZSBZQU1MIGNhbGxzIG1ha2UgZHVtcCB1c2FnZSBjbGVhcmVyLlxuaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHlhbWwgZnJvbSAnanMteWFtbCc7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGV4dGVuc2lvbnMgfSBmcm9tICcuLi91dGlscy9leHRlbnNpb25zLmpzJztcbmltcG9ydCB7IGdldEdlbkkxOG5Uc0NvbW1hbmQgfSBmcm9tICcuLi91dGlscy9nZW5JMThuVHMuanMnO1xuaW1wb3J0IHsgZG9lc0NvbnRhaW5KYXZhLCBkb2VzQ29udGFpbkpzT3JUcyB9IGZyb20gJy4uL3V0aWxzL3BhY2thZ2VDYXBhYmlsaXRpZXMuanMnO1xuaW1wb3J0IHsgc3Bhd25TeW5jIH0gZnJvbSAnLi4vdXRpbHMvc3Bhd25VdGlsLmpzJztcblxuaW1wb3J0IHsgZ2VuZXJhdGVTY3JpcHRzIH0gZnJvbSAnLi9wYWNrYWdlSnNvbi5qcyc7XG5cbmludGVyZmFjZSBMZWZ0aG9va1NldHRpbmdzIHtcbiAgZ2xvYl9tYXRjaGVyOiAnZG91Ymxlc3Rhcic7XG4gICdwb3N0LW1lcmdlJzoge1xuICAgIGpvYnM6IExlZnRob29rSm9iW107XG4gIH07XG4gICdwcmUtY29tbWl0Jzoge1xuICAgIGpvYnM6IExlZnRob29rSm9iW107XG4gIH07XG4gICdwcmUtcHVzaCc6IHtcbiAgICBqb2JzOiBMZWZ0aG9va0pvYltdO1xuICB9O1xufVxuXG5pbnRlcmZhY2UgTGVmdGhvb2tKb2Ige1xuICBuYW1lOiBzdHJpbmc7XG4gIGdsb2I/OiBzdHJpbmc7XG4gIHJ1bj86IHN0cmluZztcbiAgc2NyaXB0Pzogc3RyaW5nO1xuICBydW5uZXI/OiAnYmFzaCc7XG4gIHN0YWdlX2ZpeGVkPzogdHJ1ZTtcbn1cblxuY29uc3QgYmFzZVNldHRpbmdzOiBPbWl0PExlZnRob29rU2V0dGluZ3MsICdwcmUtY29tbWl0Jz4gPSB7XG4gIGdsb2JfbWF0Y2hlcjogJ2RvdWJsZXN0YXInLFxuICAncG9zdC1tZXJnZSc6IHtcbiAgICBqb2JzOiBbXG4gICAgICB7XG4gICAgICAgIG5hbWU6ICdwcmVwYXJlJyxcbiAgICAgICAgc2NyaXB0OiAncHJlcGFyZS5zaCcsXG4gICAgICAgIHJ1bm5lcjogJ2Jhc2gnLFxuICAgICAgfSxcbiAgICBdLFxuICB9LFxuICAncHJlLXB1c2gnOiB7XG4gICAgam9iczogW1xuICAgICAge1xuICAgICAgICBuYW1lOiAnY2hlY2snLFxuICAgICAgICBzY3JpcHQ6ICdjaGVjay5zaCcsXG4gICAgICAgIHJ1bm5lcjogJ2Jhc2gnLFxuICAgICAgfSxcbiAgICBdLFxuICB9LFxufTtcblxuY29uc3QgcHJlQ29tbWl0U2V0dGluZ3M6IExlZnRob29rU2V0dGluZ3NbJ3ByZS1jb21taXQnXSA9IHtcbiAgam9iczogW1xuICAgIHtcbiAgICAgIG5hbWU6ICdjbGVhbnVwJyxcbiAgICAgIGdsb2I6ICcnLFxuICAgICAgcnVuOiAnJyxcbiAgICAgIHN0YWdlX2ZpeGVkOiB0cnVlLFxuICAgIH0sXG4gICAge1xuICAgICAgbmFtZTogJ2NoZWNrLW1pZ3JhdGlvbnMnLFxuICAgICAgZ2xvYjogJyoqL21pZ3JhdGlvbi5zcWwnLFxuICAgICAgcnVuOiBgXG5mYWlsZWQ9MFxuIyBMZWZ0aG9vayBleHBhbmRzIHtzdGFnZWRfZmlsZXN9IGFzIHNoZWxsLWVzY2FwZWQgYXJncywgc28gcGF0aHMgd2l0aCBzcGFjZXMgc3RheSBpbnRhY3QuXG5mb3IgZmlsZSBpbiB7c3RhZ2VkX2ZpbGVzfTsgZG9cbiAgaWYgZ3JlcCAtcSAnV2FybmluZ3M6JyBcIiRmaWxlXCI7IHRoZW5cbiAgICBlY2hvIFwiTWlncmF0aW9uIFNRTCBmaWxlICgkZmlsZSkgY29udGFpbnMgd2FybmluZ3MhIFBsZWFzZSBzb2x2ZSB0aGUgd2FybmluZ3MgYW5kIGNvbW1pdCBhZ2Fpbi5cIlxuICAgIGZhaWxlZD0xXG4gIGZpXG5kb25lXG5leGl0IFwiJGZhaWxlZFwiXG5gLnRyaW0oKSxcbiAgICB9LFxuICBdLFxufTtcblxuY29uc3Qgc2NyaXB0cyA9IHtcbiAgcG9zdE1lcmdlOiBgXG4jIS9iaW4vYmFzaFxuXG5jaGFuZ2VkX2ZpbGVzPVwiJChnaXQgZGlmZi10cmVlIC1yIC0tbmFtZS1vbmx5IC0tbm8tY29tbWl0LWlkIE9SSUdfSEVBRCBIRUFEKVwiXG5cbnJ1bl9pZl9jaGFuZ2VkKCkge1xuICBpZiBlY2hvIFwiJGNoYW5nZWRfZmlsZXNcIiB8IGdyZXAgLS1xdWlldCAtRSBcIiQxXCI7IHRoZW5cbiAgICBldmFsIFwiJDJcIlxuICBmaVxufVxuYC50cmltKCksXG59O1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVMZWZ0aG9va1VwZGF0aW5nUGFja2FnZUpzb24oY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZ2VuZXJhdGVMZWZ0aG9va1VwZGF0aW5nUGFja2FnZUpzb24nLCBhc3luYyAoKSA9PiB7XG4gICAgYXdhaXQgY29yZShjb25maWcpO1xuICB9KTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gY29yZShjb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgZGlyUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJy5sZWZ0aG9vaycpO1xuICBjb25zdCBodXNreURpclBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICcuaHVza3knKTtcbiAgY29uc3QgaGFzSHVza3lEaXIgPSBmcy5leGlzdHNTeW5jKGh1c2t5RGlyUGF0aCk7XG4gIGNvbnN0IHsgbGludCB9ID0gZ2VuZXJhdGVTY3JpcHRzKGNvbmZpZywge30pO1xuICBjb25zdCBzZXR0aW5nczogUGFydGlhbDxMZWZ0aG9va1NldHRpbmdzPiA9IHtcbiAgICAuLi5iYXNlU2V0dGluZ3MsXG4gICAgJ3ByZS1jb21taXQnOiB7XG4gICAgICBqb2JzOiBnZXRQcmVDb21taXRKb2JzKGNvbmZpZyksXG4gICAgfSxcbiAgfTtcbiAgaWYgKCFsaW50KSB7XG4gICAgZGVsZXRlIHNldHRpbmdzWydwcmUtcHVzaCddO1xuICB9XG4gIGF3YWl0IFByb21pc2UuYWxsKFtcbiAgICBmcy5wcm9taXNlcy53cml0ZUZpbGUoXG4gICAgICBwYXRoLmpvaW4oY29uZmlnLmRpclBhdGgsICdsZWZ0aG9vay55bWwnKSxcbiAgICAgIHlhbWwuZHVtcChzZXR0aW5ncywge1xuICAgICAgICBsaW5lV2lkdGg6IC0xLFxuICAgICAgICBub0NvbXBhdE1vZGU6IHRydWUsXG4gICAgICAgIHN0eWxlczoge1xuICAgICAgICAgICchIW51bGwnOiAnZW1wdHknLFxuICAgICAgICB9LFxuICAgICAgfSlcbiAgICApLFxuICAgIGZzLnByb21pc2VzLnJtKGRpclBhdGgsIHsgZm9yY2U6IHRydWUsIHJlY3Vyc2l2ZTogdHJ1ZSB9KSxcbiAgXSk7XG4gIGlmIChoYXNIdXNreURpcikge1xuICAgIGF3YWl0IFByb21pc2UuYWxsKFtcbiAgICAgIGZzLnByb21pc2VzLnJtKGh1c2t5RGlyUGF0aCwgeyBmb3JjZTogdHJ1ZSwgcmVjdXJzaXZlOiB0cnVlIH0pLFxuICAgICAgZnMucHJvbWlzZXMucm0ocGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnLmh1c2t5cmMuanNvbicpLCB7IGZvcmNlOiB0cnVlIH0pLFxuICAgIF0pO1xuICAgIHNwYXduU3luYygnZ2l0JywgWydjb25maWcnLCAnLS11bnNldCcsICdjb3JlLmhvb2tzUGF0aCddLCBjb25maWcuZGlyUGF0aCk7XG4gIH1cblxuICBpZiAobGludCkge1xuICAgIGNvbnN0IHByZVB1c2ggPSBnZXRQcmVQdXNoU2NyaXB0KGNvbmZpZyk7XG4gICAgZnMubWtkaXJTeW5jKHBhdGguam9pbihkaXJQYXRoLCAncHJlLXB1c2gnKSwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gICAgYXdhaXQgZnMucHJvbWlzZXMud3JpdGVGaWxlKHBhdGguam9pbihkaXJQYXRoLCAncHJlLXB1c2gnLCAnY2hlY2suc2gnKSwgcHJlUHVzaCArICdcXG4nLCB7XG4gICAgICBtb2RlOiAwbzc1NSxcbiAgICB9KTtcbiAgfVxuICBjb25zdCBwb3N0TWVyZ2VDb21tYW5kID0gYCR7c2NyaXB0cy5wb3N0TWVyZ2V9XFxuXFxuJHtnZW5lcmF0ZVBvc3RNZXJnZUNvbW1hbmRzKGNvbmZpZykuam9pbignXFxuJyl9XFxuYDtcbiAgZnMubWtkaXJTeW5jKHBhdGguam9pbihkaXJQYXRoLCAncG9zdC1tZXJnZScpLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgYXdhaXQgZnMucHJvbWlzZXMud3JpdGVGaWxlKHBhdGgucmVzb2x2ZShkaXJQYXRoLCAncG9zdC1tZXJnZScsICdwcmVwYXJlLnNoJyksIHBvc3RNZXJnZUNvbW1hbmQsIHtcbiAgICBtb2RlOiAwbzc1NSxcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIGdldFByZVB1c2hTY3JpcHQoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogc3RyaW5nIHtcbiAgbGV0IGxpbnRDb21tYW5kOiBzdHJpbmc7XG4gIGlmIChjb25maWcuaXNCdW4pIHtcbiAgICBsaW50Q29tbWFuZCA9IGNvbmZpZy5kZXBlbmRpbmcud2IgPyAnYnVuIC0tYnVuIHdiIGxpbnQnIDogJ2J1biBydW4gbGludCc7XG4gIH0gZWxzZSB7XG4gICAgbGludENvbW1hbmQgPSBjb25maWcuZGVwZW5kaW5nLndiID8gJ3lhcm4gd2IgbGludCcgOiAneWFybiBydW4gbGludCc7XG4gIH1cbiAgY29uc3QgcXVpZXRMaW50Q29tbWFuZCA9IGAke2xpbnRDb21tYW5kfSAtLXF1aWV0YDtcbiAgLy8gTm8gc2VwYXJhdGUgdHlwZWNoZWNrIHN0ZXAgbmVlZGVkIOKAlCB0aGUgbGludCBjb21tYW5kIGFscmVhZHkgaW5jbHVkZXMgdHlwZWNoZWNraW5nLlxuICBpZiAoY29uZmlnLnJlcG9zaXRvcnk/LnN0YXJ0c1dpdGgoJ2dpdGh1YjpXaWxsQm9vc3RlckxhYi8nKSkge1xuICAgIHJldHVybiBgXG4jIS9iaW4vYmFzaFxuXG5pZiBbICQoZ2l0IGJyYW5jaCAtLXNob3ctY3VycmVudCkgPSBcIm1haW5cIiBdICYmIFsgJChnaXQgY29uZmlnIHVzZXIuZW1haWwpICE9IFwiZXhrYXp1dUBnbWFpbC5jb21cIiBdOyB0aGVuXG4gIGVjaG8gXCIqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcIlxuICBlY2hvIFwiKioqIERvbid0IHB1c2ggbWFpbiBicmFuY2ggZGlyZWN0bHkuIFVzZSBQUiEgKioqXCJcbiAgZWNobyBcIioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlwiXG4gIGV4aXQgMVxuZmlcblxuJHtxdWlldExpbnRDb21tYW5kfVxuYC50cmltKCk7XG4gIH1cbiAgcmV0dXJuIHF1aWV0TGludENvbW1hbmQ7XG59XG5cbmZ1bmN0aW9uIGdldFByZUNvbW1pdEpvYnMoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogTGVmdGhvb2tKb2JbXSB7XG4gIHJldHVybiBwcmVDb21taXRTZXR0aW5ncy5qb2JzLm1hcCgoam9iKSA9PlxuICAgIGpvYi5uYW1lID09PSAnY2xlYW51cCdcbiAgICAgID8ge1xuICAgICAgICAgIC4uLmpvYixcbiAgICAgICAgICBnbG9iOiBnZXRDbGVhbnVwR2xvYnMoY29uZmlnKSxcbiAgICAgICAgICBydW46IGdldENsZWFudXBDb21tYW5kKGNvbmZpZyksXG4gICAgICAgIH1cbiAgICAgIDogam9iXG4gICk7XG59XG5cbmZ1bmN0aW9uIGdldENsZWFudXBHbG9icyhjb25maWc6IFBhY2thZ2VDb25maWcpOiBzdHJpbmcge1xuICAvLyBMZXQgYHdiIGxpbnQgLS1mb3JtYXRgIGRlY2lkZSB3aGV0aGVyIFByZXR0aWVyIGlzIGF2YWlsYWJsZTsgdGhlIGhvb2tcbiAgLy8gc3RpbGwgbmVlZHMgdG8gdHJpZ2dlciB3aGVuIGFkZGluZyB0aGUgZmlyc3QgcHJldHRpZXItb25seSBmaWxlLlxuICBjb25zdCBzdXBwb3J0ZWRFeHRlbnNpb25zID1cbiAgICBjb25maWcuaXNCdW4gfHwgY29uZmlnLmRlcGVuZGluZy53YiB8fCBkb2VzQ29udGFpbkphdmEoY29uZmlnKSA/IFsuLi5leHRlbnNpb25zLnByZXR0aWVyT25seV0gOiBbXTtcbiAgaWYgKGRvZXNDb250YWluSnNPclRzKGNvbmZpZykpIHtcbiAgICBzdXBwb3J0ZWRFeHRlbnNpb25zLnB1c2goLi4uZXh0ZW5zaW9ucy5veGZtdCwgLi4uZXh0ZW5zaW9ucy5veGxpbnQpO1xuICB9XG4gIGlmIChjb25maWcuZG9lc0NvbnRhaW5Qb2V0cnlMb2NrIHx8IGNvbmZpZy5kb2VzQ29udGFpblV2TG9jaykge1xuICAgIHN1cHBvcnRlZEV4dGVuc2lvbnMucHVzaCgncHknKTtcbiAgfVxuICBpZiAoY29uZmlnLmRvZXNDb250YWluUHVic3BlY1lhbWwpIHtcbiAgICBzdXBwb3J0ZWRFeHRlbnNpb25zLnB1c2goJ2RhcnQnKTtcbiAgfVxuICBjb25zdCBmaWx0ZXJlZEV4dGVuc2lvbnMgPSBbLi4ubmV3IFNldChzdXBwb3J0ZWRFeHRlbnNpb25zKV0udG9Tb3J0ZWQoKTtcbiAgcmV0dXJuIGAqKi8qLnske2ZpbHRlcmVkRXh0ZW5zaW9ucy5qb2luKCcsJyl9fWA7XG59XG5cbmZ1bmN0aW9uIGdldENsZWFudXBDb21tYW5kKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IHN0cmluZyB7XG4gIGlmIChoYXNMb2NhbFdiV29ya3NwYWNlKGNvbmZpZykpIHtcbiAgICByZXR1cm4gU3RyaW5nLnJhd2BcbiMgTGVmdGhvb2sgZXhwYW5kcyB7c3RhZ2VkX2ZpbGVzfSBhcyBzaGVsbC1lc2NhcGVkIGFyZ3MsIHNvIHBhdGhzIHdpdGggc3BhY2VzIHN0YXkgaW50YWN0LlxueWFybiB3b3Jrc3BhY2UgQHdpbGxib29zdGVyL3diIHN0YXJ0IC0td29ya2luZy1kaXIgXCIkKGdpdCByZXYtcGFyc2UgLS1zaG93LXRvcGxldmVsKVwiIGxpbnQgLS1maXggLS1mb3JtYXQgLS0ge3N0YWdlZF9maWxlc31cbmAudHJpbSgpO1xuICB9XG4gIGlmIChjb25maWcuaXNCdW4gfHwgY29uZmlnLmRlcGVuZGluZy53Yikge1xuICAgIGNvbnN0IHBhY2thZ2VNYW5hZ2VyID0gY29uZmlnLmlzQnVuID8gJ2J1bicgOiAneWFybic7XG4gICAgcmV0dXJuIGNvbmZpZy5kZXBlbmRpbmcud2JcbiAgICAgID8gYFxuIyBMZWZ0aG9vayBleHBhbmRzIHtzdGFnZWRfZmlsZXN9IGFzIHNoZWxsLWVzY2FwZWQgYXJncywgc28gcGF0aHMgd2l0aCBzcGFjZXMgc3RheSBpbnRhY3QuXG4ke2NvbmZpZy5pc0J1biA/ICdidW4gLS1idW4gd2InIDogJ3lhcm4gd2InfSBsaW50IC0tZml4IC0tZm9ybWF0IC0tIHtzdGFnZWRfZmlsZXN9XG5gLnRyaW0oKVxuICAgICAgOiBgJHtwYWNrYWdlTWFuYWdlcn0gcnVuIGZvcm1hdCAmJiAke3BhY2thZ2VNYW5hZ2VyfSBydW4gbGludC1maXhgO1xuICB9XG5cbiAgY29uc3Qgb3hsaW50UGF0dGVybiA9IGV4dGVuc2lvbnMub3hsaW50Lm1hcCgoZXh0ZW5zaW9uKSA9PiBTdHJpbmcucmF3YFxcLiR7ZXh0ZW5zaW9ufSRgKS5qb2luKCd8Jyk7XG4gIGNvbnN0IG94Zm10UGF0dGVybiA9IGV4dGVuc2lvbnMub3hmbXQubWFwKChleHRlbnNpb24pID0+IFN0cmluZy5yYXdgXFwuJHtleHRlbnNpb259JGApLmpvaW4oJ3wnKTtcbiAgY29uc3QgcHJldHRpZXJQYXR0ZXJuID0gZXh0ZW5zaW9ucy5wcmV0dGllck9ubHkubWFwKChleHRlbnNpb24pID0+IFN0cmluZy5yYXdgXFwuJHtleHRlbnNpb259JGApLmpvaW4oJ3wnKTtcbiAgY29uc3QgaGFzSnNPclRzID0gZG9lc0NvbnRhaW5Kc09yVHMoY29uZmlnKTtcbiAgY29uc3QgaGFzSmF2YSA9IGRvZXNDb250YWluSmF2YShjb25maWcpO1xuXG4gIHJldHVybiBTdHJpbmcucmF3YFxuIyBMZWZ0aG9vayBleHBhbmRzIHtzdGFnZWRfZmlsZXN9IGFzIHNoZWxsLWVzY2FwZWQgYXJncywgc28gcGF0aHMgd2l0aCBzcGFjZXMgc3RheSBpbnRhY3QuXG4ke2hhc0pzT3JUcyA/IFN0cmluZy5yYXdgb3hsaW50X2ZpbGVzPVwiJChwcmludGYgJyVzXFxuJyB7c3RhZ2VkX2ZpbGVzfSB8IGdyZXAgLUUgJygke294bGludFBhdHRlcm59KScgfHwgdHJ1ZSlcImAgOiAnJ31cbiR7aGFzSnNPclRzID8gU3RyaW5nLnJhd2BveGZtdF9maWxlcz1cIiQocHJpbnRmICclc1xcbicge3N0YWdlZF9maWxlc30gfCBncmVwIC1FICcoJHtveGZtdFBhdHRlcm59KScgfHwgdHJ1ZSlcImAgOiAnJ31cbiR7aGFzSmF2YSA/IFN0cmluZy5yYXdgcHJldHRpZXJfZmlsZXM9XCIkKHByaW50ZiAnJXNcXG4nIHtzdGFnZWRfZmlsZXN9IHwgZ3JlcCAtRSAnKCR7cHJldHRpZXJQYXR0ZXJufSknIHx8IHRydWUpXCJgIDogJyd9XG5wYWNrYWdlX2pzb25fZmlsZXM9XCIkKHByaW50ZiAnJXNcXG4nIHtzdGFnZWRfZmlsZXN9IHwgZ3JlcCAtRSAnKF58LylwYWNrYWdlXFwuanNvbiQnIHx8IHRydWUpXCJcbiR7aGFzUHl0aG9uUGFja2FnZU1hbmFnZXIoY29uZmlnKSA/IFN0cmluZy5yYXdgcHl0aG9uX2ZpbGVzPVwiJChwcmludGYgJyVzXFxuJyB7c3RhZ2VkX2ZpbGVzfSB8IGdyZXAgLUUgJ1xcLnB5JCcgfHwgdHJ1ZSlcImAgOiAnJ31cbiR7Y29uZmlnLmRvZXNDb250YWluUHVic3BlY1lhbWwgPyBTdHJpbmcucmF3YGRhcnRfZmlsZXM9XCIkKHByaW50ZiAnJXNcXG4nIHtzdGFnZWRfZmlsZXN9IHwgZ3JlcCAtRSAnXFwuZGFydCQnIHwgZ3JlcCAtdiAnZ2VuZXJhdGVkJyB8IGdyZXAgLXYgJ1xcLmZyZWV6ZWRcXC5kYXJ0JCcgfCBncmVwIC12ICdcXC5nXFwuZGFydCQnIHx8IHRydWUpXCJgIDogJyd9XG5cbiR7XG4gIGhhc0pzT3JUc1xuICAgID8gU3RyaW5nLnJhd2BcbmlmIFsgLW4gXCIkb3hmbXRfZmlsZXNcIiBdOyB0aGVuXG4gIG5vZGUgbm9kZV9tb2R1bGVzLy5iaW4vb3hmbXQgLS13cml0ZSAtLW5vLWVycm9yLW9uLXVubWF0Y2hlZC1wYXR0ZXJuICRveGZtdF9maWxlc1xuZmlcbmBcbiAgICA6ICcnXG59XG4ke1xuICBoYXNKYXZhXG4gICAgPyBTdHJpbmcucmF3YGlmIFsgLW4gXCIkcHJldHRpZXJfZmlsZXNcIiBdOyB0aGVuXG4gIG5vZGUgbm9kZV9tb2R1bGVzLy5iaW4vcHJldHRpZXIgLS1jYWNoZSAtLXdyaXRlIC0taWdub3JlLXVua25vd24gLS0gJHByZXR0aWVyX2ZpbGVzXG5maWBcbiAgICA6ICcnXG59XG4ke1xuICBoYXNKc09yVHNcbiAgICA/IFN0cmluZy5yYXdgXG5pZiBbIC1uIFwiJG94bGludF9maWxlc1wiIF07IHRoZW5cbiAgbm9kZSBub2RlX21vZHVsZXMvLmJpbi9veGxpbnQgLS1maXggJG94bGludF9maWxlc1xuZmlcbmBcbiAgICA6ICcnXG59XG5pZiBbIC1uIFwiJHBhY2thZ2VfanNvbl9maWxlc1wiIF07IHRoZW5cbiAgbm9kZSBub2RlX21vZHVsZXMvLmJpbi9zb3J0LXBhY2thZ2UtanNvbiAtLSAkcGFja2FnZV9qc29uX2ZpbGVzXG5maVxuJHtcbiAgaGFzUHl0aG9uUGFja2FnZU1hbmFnZXIoY29uZmlnKVxuICAgID8gYGlmIFsgLW4gXCIkcHl0aG9uX2ZpbGVzXCIgXTsgdGhlblxuICAke2dldFB5dGhvblJ1bm5lcihjb25maWcpfSBpc29ydCAtLXByb2ZpbGUgYmxhY2sgLS1maWx0ZXItZmlsZXMgJHB5dGhvbl9maWxlc1xuICAke2dldFB5dGhvblJ1bm5lcihjb25maWcpfSBibGFjayAkcHl0aG9uX2ZpbGVzXG4gICR7Z2V0UHl0aG9uUnVubmVyKGNvbmZpZyl9IGZsYWtlOCAkcHl0aG9uX2ZpbGVzXG5maWBcbiAgICA6ICcnXG59XG4ke1xuICBjb25maWcuZG9lc0NvbnRhaW5QdWJzcGVjWWFtbFxuICAgID8gYGlmIFsgLW4gXCIkZGFydF9maWxlc1wiIF07IHRoZW5cbiAgZGFydCBmb3JtYXQgJGRhcnRfZmlsZXNcbmZpYFxuICAgIDogJydcbn1cbmAudHJpbSgpO1xufVxuXG5mdW5jdGlvbiBoYXNMb2NhbFdiV29ya3NwYWNlKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IGJvb2xlYW4ge1xuICBpZiAoIWNvbmZpZy5pc1Jvb3QpIHJldHVybiBmYWxzZTtcblxuICBjb25zdCBsb2NhbFdiUGFja2FnZUpzb25QYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAncGFja2FnZXMnLCAnd2InLCAncGFja2FnZS5qc29uJyk7XG4gIGlmICghZnMuZXhpc3RzU3luYyhsb2NhbFdiUGFja2FnZUpzb25QYXRoKSkgcmV0dXJuIGZhbHNlO1xuXG4gIHRyeSB7XG4gICAgY29uc3QgcGFja2FnZUpzb24gPSBKU09OLnBhcnNlKGZzLnJlYWRGaWxlU3luYyhsb2NhbFdiUGFja2FnZUpzb25QYXRoLCAndXRmOCcpKSBhcyB7IG5hbWU/OiBzdHJpbmcgfTtcbiAgICByZXR1cm4gcGFja2FnZUpzb24ubmFtZSA9PT0gJ0B3aWxsYm9vc3Rlci93Yic7XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxufVxuXG5mdW5jdGlvbiBnZW5lcmF0ZVBvc3RNZXJnZUNvbW1hbmRzKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IHN0cmluZ1tdIHtcbiAgY29uc3QgcG9zdE1lcmdlQ29tbWFuZHM6IHN0cmluZ1tdID0gW107XG4gIGlmIChjb25maWcuaGFzVmVyc2lvblNldHRpbmdzKSB7XG4gICAgY29uc3QgdG9vbHNDaGFuZ2VkUGF0dGVybiA9IFN0cmluZy5yYXdgKG1pc2VcXC50b21sfFxcLm1pc2VcXC50b21sfFxcLnRvb2wtdmVyc2lvbnN8XFwuListdmVyc2lvbilgO1xuICAgIHBvc3RNZXJnZUNvbW1hbmRzLnB1c2goU3RyaW5nLnJhd2BydW5faWZfY2hhbmdlZCBcIiR7dG9vbHNDaGFuZ2VkUGF0dGVybn1cIiBcIm1pc2UgaW5zdGFsbFwiYCk7XG4gIH1cbiAgY29uc3QgaW5zdGFsbENvbW1hbmQgPSBjb25maWcuaXNCdW4gPyAnYnVuIGluc3RhbGwnIDogJ3lhcm4nO1xuICBjb25zdCBybU5leHREaXJlY3RvcnkgPSBjb25maWcuZGVwZW5kaW5nLmJsaXR6IHx8IGNvbmZpZy5kZXBlbmRpbmcubmV4dCA/ICcgJiYgcm0gLVJmIC5uZXh0JyA6ICcnO1xuICBwb3N0TWVyZ2VDb21tYW5kcy5wdXNoKFN0cmluZy5yYXdgcnVuX2lmX2NoYW5nZWQgXCJwYWNrYWdlXFwuanNvblwiIFwiJHtpbnN0YWxsQ29tbWFuZH0ke3JtTmV4dERpcmVjdG9yeX1cImApO1xuICBpZiAoY29uZmlnLmRvZXNDb250YWluUG9ldHJ5TG9jaykge1xuICAgIHBvc3RNZXJnZUNvbW1hbmRzLnB1c2goU3RyaW5nLnJhd2BydW5faWZfY2hhbmdlZCBcInBvZXRyeVxcLmxvY2tcIiBcInBvZXRyeSBpbnN0YWxsXCJgKTtcbiAgfVxuICBpZiAoY29uZmlnLmRvZXNDb250YWluVXZMb2NrKSB7XG4gICAgcG9zdE1lcmdlQ29tbWFuZHMucHVzaChTdHJpbmcucmF3YHJ1bl9pZl9jaGFuZ2VkIFwidXZcXC5sb2NrXCIgXCJ1diBzeW5jIC0tZnJvemVuXCJgKTtcbiAgfVxuICBpZiAoY29uZmlnLmRlcGVuZGluZy5ibGl0eikge1xuICAgIHBvc3RNZXJnZUNvbW1hbmRzLnB1c2goXG4gICAgICBTdHJpbmcucmF3YHJ1bl9pZl9jaGFuZ2VkIFwiLipcXC5wcmlzbWFcIiBcIm5vZGUgbm9kZV9tb2R1bGVzLy5iaW4vYmxpdHogcHJpc21hIG1pZ3JhdGUgZGVwbG95XCJgLFxuICAgICAgU3RyaW5nLnJhd2BydW5faWZfY2hhbmdlZCBcIi4qXFwucHJpc21hXCIgXCJub2RlIG5vZGVfbW9kdWxlcy8uYmluL2JsaXR6IHByaXNtYSBnZW5lcmF0ZVwiYCxcbiAgICAgIFN0cmluZy5yYXdgcnVuX2lmX2NoYW5nZWQgXCIuKlxcLnByaXNtYVwiIFwibm9kZSBub2RlX21vZHVsZXMvLmJpbi9ibGl0eiBjb2RlZ2VuXCJgXG4gICAgKTtcbiAgfSBlbHNlIGlmIChjb25maWcuZGVwZW5kaW5nLnByaXNtYSkge1xuICAgIHBvc3RNZXJnZUNvbW1hbmRzLnB1c2goXG4gICAgICBTdHJpbmcucmF3YHJ1bl9pZl9jaGFuZ2VkIFwiLipcXC5wcmlzbWFcIiBcIm5vZGUgbm9kZV9tb2R1bGVzLy5iaW4vZG90ZW52IC1jIGRldmVsb3BtZW50IC0tIG5vZGUgbm9kZV9tb2R1bGVzLy5iaW4vcHJpc21hIG1pZ3JhdGUgZGVwbG95XCJgLFxuICAgICAgU3RyaW5nLnJhd2BydW5faWZfY2hhbmdlZCBcIi4qXFwucHJpc21hXCIgXCJub2RlIG5vZGVfbW9kdWxlcy8uYmluL2RvdGVudiAtYyBkZXZlbG9wbWVudCAtLSBub2RlIG5vZGVfbW9kdWxlcy8uYmluL3ByaXNtYSBnZW5lcmF0ZVwiYFxuICAgICk7XG4gIH1cbiAgY29uc3QgZ2VuSTE4blRzQ29tbWFuZCA9IGdldEdlbkkxOG5Uc0NvbW1hbmQoY29uZmlnLCBjb25maWcucGFja2FnZUpzb24/LnNjcmlwdHMpO1xuICBpZiAoZ2VuSTE4blRzQ29tbWFuZCkge1xuICAgIC8vIGdlbi1pMThuLXRzIG91dHB1dHMgYXJlIGNvbW1vbmx5IGlnbm9yZWQsIHNvIHBvc3QtbWVyZ2UgcmVnZW5lcmF0ZXMgdGhlbSBhZnRlciBwdWxsZWQgcmVzb3VyY2UgY2hhbmdlcy5cbiAgICBwb3N0TWVyZ2VDb21tYW5kcy5wdXNoKFN0cmluZy5yYXdgcnVuX2lmX2NoYW5nZWQgXCIoXnwvKWkxOG4vLipcXC5qc29uJFwiIFwiJHtnZW5JMThuVHNDb21tYW5kfVwiYCk7XG4gIH1cbiAgcmV0dXJuIHBvc3RNZXJnZUNvbW1hbmRzO1xufVxuXG5mdW5jdGlvbiBoYXNQeXRob25QYWNrYWdlTWFuYWdlcihjb25maWc6IFBhY2thZ2VDb25maWcpOiBib29sZWFuIHtcbiAgcmV0dXJuIGNvbmZpZy5kb2VzQ29udGFpblBvZXRyeUxvY2sgfHwgY29uZmlnLmRvZXNDb250YWluVXZMb2NrO1xufVxuXG5mdW5jdGlvbiBnZXRQeXRob25SdW5uZXIoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogJ3BvZXRyeSBydW4nIHwgJ3V2IHJ1bicge1xuICByZXR1cm4gY29uZmlnLmRvZXNDb250YWluVXZMb2NrID8gJ3V2IHJ1bicgOiAncG9ldHJ5IHJ1bic7XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVMaW50c3RhZ2VkcmMoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZ2VuZXJhdGVMaW50c3RhZ2VkcmMnLCBhc3luYyAoKSA9PiB7XG4gICAgYXdhaXQgUHJvbWlzZS5hbGwoW1xuICAgICAgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzLnByb21pc2VzLnJtKGAke2NvbmZpZy5kaXJQYXRofS8ubGludHN0YWdlZHJjLmNqc2AsIHsgZm9yY2U6IHRydWUgfSkpLFxuICAgICAgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzLnByb21pc2VzLnJtKGAke2NvbmZpZy5kaXJQYXRofS8ubGludHN0YWdlZHJjLmpzYCwgeyBmb3JjZTogdHJ1ZSB9KSksXG4gICAgICBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnMucHJvbWlzZXMucm0oYCR7Y29uZmlnLmRpclBhdGh9Ly5saW50c3RhZ2VkcmMuanNvbmAsIHsgZm9yY2U6IHRydWUgfSkpLFxuICAgIF0pO1xuICB9KTtcbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGZzVXRpbCB9IGZyb20gJy4uL3V0aWxzL2ZzVXRpbC5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlT3hmbXRDb25maWcoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZ2VuZXJhdGVPeGZtdENvbmZpZycsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBsZWdhY3lDb25maWdQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnLm94Zm10cmMuanNvbicpO1xuICAgIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnb3hmbXQuY29uZmlnLnRzJyk7XG4gICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzLnByb21pc2VzLnJtKGxlZ2FjeUNvbmZpZ1BhdGgsIHsgZm9yY2U6IHRydWUgfSkpO1xuICAgIGlmIChmcy5leGlzdHNTeW5jKGZpbGVQYXRoKSkgcmV0dXJuO1xuICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiBmc1V0aWwuZ2VuZXJhdGVGaWxlKGZpbGVQYXRoLCBjb25maWdDb250ZW50KSk7XG4gIH0pO1xufVxuXG5jb25zdCBjb25maWdDb250ZW50ID0gYGltcG9ydCBjb25maWcgZnJvbSAnQHdpbGxib29zdGVyL294Zm10LWNvbmZpZyc7XG5cbmV4cG9ydCBkZWZhdWx0IGNvbmZpZztcbmA7XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBmc1V0aWwgfSBmcm9tICcuLi91dGlscy9mc1V0aWwuanMnO1xuaW1wb3J0IHsgcHJvbWlzZVBvb2wgfSBmcm9tICcuLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5pbXBvcnQgeyBpc1B1Ymxpc2hlZFdpbGxib29zdGVyQ29uZmlnc1BhY2thZ2UgfSBmcm9tICcuLi91dGlscy93aWxsYm9vc3RlckNvbmZpZ3NVdGlsLmpzJztcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlT3hsaW50Q29uZmlnKGNvbmZpZzogUGFja2FnZUNvbmZpZywgX3Jvb3RDb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdnZW5lcmF0ZU94bGludENvbmZpZycsIGFzeW5jICgpID0+IHtcbiAgICAvLyB3aWxsYm9vc3Rlci1jb25maWdzIHB1Ymxpc2hlcyBjb25maWcgZmlsZXMgYXMgcHJvZHVjdCBjb2RlLCBzbyBtaWdyYXRpb25cbiAgICAvLyBtdXN0IG5vdCByZW1vdmUgcGFja2FnZS1wcm92aWRlZCBsaW50ZXIgc2V0dGluZ3MuXG4gICAgY29uc3Qgc2hvdWxkUHJlc2VydmVQdWJsaXNoZWRMaW50ZXJDb25maWcgPSBpc1B1Ymxpc2hlZFdpbGxib29zdGVyQ29uZmlnc1BhY2thZ2UoY29uZmlnKTtcbiAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJ294bGludC5jb25maWcudHMnKTtcbiAgICBjb25zdCBleGlzdGluZ0NvbnRlbnQgPSBmcy5leGlzdHNTeW5jKGZpbGVQYXRoKSA/IGZzLnJlYWRGaWxlU3luYyhmaWxlUGF0aCwgJ3V0ZjgnKSA6IHVuZGVmaW5lZDtcblxuICAgIGNvbnN0IHByb21pc2VzOiBQcm9taXNlPHZvaWQ+W10gPSBbXTtcbiAgICBpZiAoIXNob3VsZFByZXNlcnZlUHVibGlzaGVkTGludGVyQ29uZmlnKSB7XG4gICAgICBwcm9taXNlcy5wdXNoKFxuICAgICAgICBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnMucHJvbWlzZXMucm0ocGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnLm94bGludHJjLmpzb24nKSwgeyBmb3JjZTogdHJ1ZSB9KSksXG4gICAgICAgIHByb21pc2VQb29sLnJ1bigoKSA9PiBmcy5wcm9taXNlcy5ybShwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICdiaW9tZS5qc29uJyksIHsgZm9yY2U6IHRydWUgfSkpLFxuICAgICAgICBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnMucHJvbWlzZXMucm0ocGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnYmlvbWUuanNvbmMnKSwgeyBmb3JjZTogdHJ1ZSB9KSksXG4gICAgICAgIHByb21pc2VQb29sLnJ1bigoKSA9PiBmcy5wcm9taXNlcy5ybShwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICcuZXNsaW50cmMnKSwgeyBmb3JjZTogdHJ1ZSB9KSksXG4gICAgICAgIHByb21pc2VQb29sLnJ1bigoKSA9PiBmcy5wcm9taXNlcy5ybShwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICcuZXNsaW50cmMuY2pzJyksIHsgZm9yY2U6IHRydWUgfSkpLFxuICAgICAgICBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnMucHJvbWlzZXMucm0ocGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnLmVzbGludHJjLmpzJyksIHsgZm9yY2U6IHRydWUgfSkpLFxuICAgICAgICBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnMucHJvbWlzZXMucm0ocGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnLmVzbGludHJjLmpzb24nKSwgeyBmb3JjZTogdHJ1ZSB9KSksXG4gICAgICAgIHByb21pc2VQb29sLnJ1bigoKSA9PiBmcy5wcm9taXNlcy5ybShwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICcuZXNsaW50cmMueWFtbCcpLCB7IGZvcmNlOiB0cnVlIH0pKSxcbiAgICAgICAgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzLnByb21pc2VzLnJtKHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJy5lc2xpbnRyYy55bWwnKSwgeyBmb3JjZTogdHJ1ZSB9KSksXG4gICAgICAgIHByb21pc2VQb29sLnJ1bigoKSA9PiBmcy5wcm9taXNlcy5ybShwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICdlc2xpbnQuY29uZmlnLmNqcycpLCB7IGZvcmNlOiB0cnVlIH0pKSxcbiAgICAgICAgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzLnByb21pc2VzLnJtKHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJ2VzbGludC5jb25maWcuanMnKSwgeyBmb3JjZTogdHJ1ZSB9KSksXG4gICAgICAgIHByb21pc2VQb29sLnJ1bigoKSA9PiBmcy5wcm9taXNlcy5ybShwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICdlc2xpbnQuY29uZmlnLm1qcycpLCB7IGZvcmNlOiB0cnVlIH0pKSxcbiAgICAgICAgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzLnByb21pc2VzLnJtKHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJ2VzbGludC5jb25maWcudHMnKSwgeyBmb3JjZTogdHJ1ZSB9KSlcbiAgICAgICk7XG4gICAgfVxuICAgIGlmICghZXhpc3RpbmdDb250ZW50KSB7XG4gICAgICBwcm9taXNlcy5wdXNoKHByb21pc2VQb29sLnJ1bigoKSA9PiBmc1V0aWwuZ2VuZXJhdGVGaWxlKGZpbGVQYXRoLCBjb25maWdDb250ZW50KSkpO1xuICAgIH1cbiAgICBhd2FpdCBQcm9taXNlLmFsbChwcm9taXNlcyk7XG4gIH0pO1xufVxuXG5jb25zdCBjb25maWdDb250ZW50ID0gYGltcG9ydCBjb25maWcgZnJvbSAnQHdpbGxib29zdGVyL294bGludC1jb25maWcnO1xuXG5leHBvcnQgZGVmYXVsdCBjb25maWc7XG5gO1xuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZnNVdGlsIH0gZnJvbSAnLi4vdXRpbHMvZnNVdGlsLmpzJztcbmltcG9ydCB7IGlnbm9yZUZpbGVVdGlsIH0gZnJvbSAnLi4vdXRpbHMvaWdub3JlRmlsZVV0aWwuanMnO1xuaW1wb3J0IHsgZG9lc0NvbnRhaW5KYXZhIH0gZnJvbSAnLi4vdXRpbHMvcGFja2FnZUNhcGFiaWxpdGllcy5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcblxuY29uc3QgY29tbW9uQ29udGVudCA9IGBcbjNyZC1wYXJ0eS9cbmFuZHJvaWQvXG5pb3MvXG5uby1mb3JtYXQvXG50ZXN0LWZpeHR1cmVzL1xudGVzdC9maXh0dXJlcy9cbiouZC50c1xuKi5taW4uanNcbi55YXJuL1xuLnBucC5qc1xuYDtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlUHJldHRpZXJpZ25vcmUoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZ2VuZXJhdGVQcmV0dGllcmlnbm9yZScsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJy5wcmV0dGllcmlnbm9yZScpO1xuICAgIGlmICghZG9lc0NvbnRhaW5KYXZhKGNvbmZpZykpIHtcbiAgICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiBmcy5wcm9taXNlcy5ybShmaWxlUGF0aCwgeyBmb3JjZTogdHJ1ZSB9KSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IGNvbnRlbnQgPSAoYXdhaXQgZnNVdGlsLnJlYWRGaWxlSWdub3JpbmdFcnJvcihmaWxlUGF0aCkpID8/ICcnO1xuICAgIGNvbnN0IGhlYWRVc2VyQ29udGVudCA9IGlnbm9yZUZpbGVVdGlsLmdldEhlYWRVc2VyQ29udGVudChjb250ZW50KTtcbiAgICBjb25zdCB0YWlsVXNlckNvbnRlbnQgPSBpZ25vcmVGaWxlVXRpbC5nZXRUYWlsVXNlckNvbnRlbnQoY29udGVudCk7XG5cbiAgICBjb25zdCBnaXRpZ25vcmVGaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJy5naXRpZ25vcmUnKTtcbiAgICBjb25zdCBnaXRpZ25vcmVDb250ZW50ID0gKGF3YWl0IGlnbm9yZUZpbGVVdGlsLnJlYWRHaXRpZ25vcmVXaXRob3V0U2VwYXJhdG9ycyhnaXRpZ25vcmVGaWxlUGF0aCkpIHx8ICcnO1xuXG4gICAgbGV0IGFkZGl0aW9uYWxDb250ZW50ID0gJyc7XG4gICAgaWYgKGNvbmZpZy5kb2VzQ29udGFpblB1YnNwZWNZYW1sKSB7XG4gICAgICBhZGRpdGlvbmFsQ29udGVudCA9IGBcbmFuZHJvaWQvYXBwL1xuaW9zL1J1bm5lci9Bc3NldHMueGNhc3NldHMvXG5wdWJzcGVjLnlhbWxcbmA7XG4gICAgfVxuXG4gICAgY29uc3QgbmV3Q29udGVudCA9IGhlYWRVc2VyQ29udGVudCArIGNvbW1vbkNvbnRlbnQgKyBhZGRpdGlvbmFsQ29udGVudCArIGdpdGlnbm9yZUNvbnRlbnQgKyB0YWlsVXNlckNvbnRlbnQ7XG4gICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzVXRpbC5nZW5lcmF0ZUZpbGUoZmlsZVBhdGgsIG5ld0NvbnRlbnQpKTtcbiAgfSk7XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgbWVyZ2UgZnJvbSAnZGVlcG1lcmdlJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZnNVdGlsIH0gZnJvbSAnLi4vdXRpbHMvZnNVdGlsLmpzJztcbmltcG9ydCB7IG92ZXJ3cml0ZU1lcmdlIH0gZnJvbSAnLi4vdXRpbHMvbWVyZ2VVdGlsLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuXG5jb25zdCBqc29uT2JqID0ge1xuICB2ZW52UGF0aDogJy4nLFxuICB2ZW52OiAnLnZlbnYnLFxufTtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlUHlyaWdodENvbmZpZ0pzb24oY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZ2VuZXJhdGVQeXJpZ2h0Q29uZmlnSnNvbicsIGFzeW5jICgpID0+IHtcbiAgICBsZXQgbmV3U2V0dGluZ3M6IG9iamVjdCA9IHN0cnVjdHVyZWRDbG9uZShqc29uT2JqKTtcbiAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJ3B5cmlnaHRjb25maWcuanNvbicpO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBvbGRDb250ZW50ID0gYXdhaXQgZnMucHJvbWlzZXMucmVhZEZpbGUoZmlsZVBhdGgsICd1dGY4Jyk7XG4gICAgICBjb25zdCBvbGRTZXR0aW5ncyA9IEpTT04ucGFyc2Uob2xkQ29udGVudCkgYXMgb2JqZWN0O1xuICAgICAgbmV3U2V0dGluZ3MgPSBtZXJnZS5hbGwoW25ld1NldHRpbmdzLCBvbGRTZXR0aW5ncywgbmV3U2V0dGluZ3NdLCB7IGFycmF5TWVyZ2U6IG92ZXJ3cml0ZU1lcmdlIH0pO1xuICAgIH0gY2F0Y2gge1xuICAgICAgLy8gZG8gbm90aGluZ1xuICAgIH1cbiAgICBjb25zdCBuZXdDb250ZW50ID0gSlNPTi5zdHJpbmdpZnkobmV3U2V0dGluZ3MsIHVuZGVmaW5lZCwgMik7XG4gICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzVXRpbC5nZW5lcmF0ZUZpbGUoZmlsZVBhdGgsIG5ld0NvbnRlbnQpKTtcbiAgfSk7XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBmc1V0aWwgfSBmcm9tICcuLi91dGlscy9mc1V0aWwuanMnO1xuaW1wb3J0IHsgcHJvbWlzZVBvb2wgfSBmcm9tICcuLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5cbmNvbnN0IHNlbWFudGljUmVsZWFzZUJhZGdlID1cbiAgJ1shW3NlbWFudGljLXJlbGVhc2VdKGh0dHBzOi8vaW1nLnNoaWVsZHMuaW8vYmFkZ2UvJTIwJTIwJUYwJTlGJTkzJUE2JUYwJTlGJTlBJTgwLXNlbWFudGljLS1yZWxlYXNlLWUxMDA3OS5zdmcpXShodHRwczovL2dpdGh1Yi5jb20vc2VtYW50aWMtcmVsZWFzZS9zZW1hbnRpYy1yZWxlYXNlKSc7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZW5lcmF0ZVJlYWRtZShjb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdnZW5lcmF0ZVJlYWRtZScsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJ1JFQURNRS5tZCcpO1xuICAgIGxldCBuZXdDb250ZW50ID0gYXdhaXQgZnMucHJvbWlzZXMucmVhZEZpbGUoZmlsZVBhdGgsICd1dGY4Jyk7XG5cbiAgICBpZiAoZnMuZXhpc3RzU3luYyhwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICcucmVsZWFzZXJjLmpzb24nKSkpIHtcbiAgICAgIG5ld0NvbnRlbnQgPSBpbnNlcnRCYWRnZShuZXdDb250ZW50LCBzZW1hbnRpY1JlbGVhc2VCYWRnZSk7XG4gICAgfVxuXG4gICAgY29uc3QgcmVwb3NpdG9yeSA9IGNvbmZpZy5yZXBvc2l0b3J5Py5zbGljZShjb25maWcucmVwb3NpdG9yeS5pbmRleE9mKCc6JykgKyAxKTtcbiAgICBjb25zdCBmaWxlTmFtZXMgPSBmcy5yZWFkZGlyU3luYyhgJHtjb25maWcuZGlyUGF0aH0vLmdpdGh1Yi93b3JrZmxvd3NgKTtcbiAgICBmb3IgKGNvbnN0IGZpbGVOYW1lIG9mIGZpbGVOYW1lcykge1xuICAgICAgaWYgKCFmaWxlTmFtZS5zdGFydHNXaXRoKCd0ZXN0JykgJiYgIWZpbGVOYW1lLnN0YXJ0c1dpdGgoJ2RlcGxveScpKSBjb250aW51ZTtcblxuICAgICAgbGV0IGJhZGdlTmFtZSA9IGZpbGVOYW1lO1xuICAgICAgYmFkZ2VOYW1lID0gKGJhZGdlTmFtZVswXSB8fCAnJykudG9VcHBlckNhc2UoKSArIGJhZGdlTmFtZS5zbGljZSgxLCBiYWRnZU5hbWUuaW5kZXhPZignLicpKTtcbiAgICAgIGJhZGdlTmFtZSA9IGJhZGdlTmFtZS5yZXBsYWNlKCctJywgJyAnKTtcbiAgICAgIGlmICghcmVwb3NpdG9yeSkgY29udGludWU7XG4gICAgICBjb25zdCBiYWRnZSA9IGBbIVske2JhZGdlTmFtZX1dKGh0dHBzOi8vZ2l0aHViLmNvbS8ke3JlcG9zaXRvcnl9L2FjdGlvbnMvd29ya2Zsb3dzLyR7ZmlsZU5hbWV9L2JhZGdlLnN2ZyldKGh0dHBzOi8vZ2l0aHViLmNvbS8ke3JlcG9zaXRvcnl9L2FjdGlvbnMvd29ya2Zsb3dzLyR7ZmlsZU5hbWV9KWA7XG4gICAgICBpZiAoZnMuZXhpc3RzU3luYyhwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsIGAuZ2l0aHViL3dvcmtmbG93cy8ke2ZpbGVOYW1lfWApKSkge1xuICAgICAgICBuZXdDb250ZW50ID0gaW5zZXJ0QmFkZ2UobmV3Q29udGVudCwgYmFkZ2UpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiBmc1V0aWwuZ2VuZXJhdGVGaWxlKGZpbGVQYXRoLCBuZXdDb250ZW50KSk7XG4gIH0pO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaW5zZXJ0QmFkZ2UocmVhZG1lOiBzdHJpbmcsIGJhZGdlOiBzdHJpbmcpOiBzdHJpbmcge1xuICAvLyDml6LjgatiYWRnZeOBjOOBguOCi+WgtOWQiOOBr+WJiumZpFxuICByZWFkbWUgPSByZWFkbWUucmVwbGFjZShiYWRnZSwgJycpLnJlcGxhY2VBbGwoL1xcblxcblxcbisvZywgJ1xcblxcbicpO1xuXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgcmVhZG1lLmxlbmd0aDsgaSsrKSB7XG4gICAgaWYgKHJlYWRtZVtpIC0gMV0gPT09ICdcXG4nICYmIHJlYWRtZVtpXSA9PT0gJ1xcbicpIHtcbiAgICAgIGNvbnN0IGJlZm9yZSA9IHJlYWRtZS5zbGljZSgwLCBpICsgMSk7XG4gICAgICBsZXQgYWZ0ZXIgPSByZWFkbWUuc2xpY2UoaSArIDEpO1xuICAgICAgaWYgKCFhZnRlci5zdGFydHNXaXRoKCdbJykgJiYgIWFmdGVyLnN0YXJ0c1dpdGgoJyEnKSkge1xuICAgICAgICBhZnRlciA9IGBcXG4ke2FmdGVyfWA7XG4gICAgICB9XG4gICAgICByZXR1cm4gYCR7YmVmb3JlfSR7YmFkZ2V9XFxuJHthZnRlcn1gO1xuICAgIH1cbiAgfVxuICByZXR1cm4gYCR7cmVhZG1lfVxcbiR7YmFkZ2V9XFxuYDtcbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCBtZXJnZSBmcm9tICdkZWVwbWVyZ2UnO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBmc1V0aWwgfSBmcm9tICcuLi91dGlscy9mc1V0aWwuanMnO1xuaW1wb3J0IHsgb3ZlcndyaXRlTWVyZ2UgfSBmcm9tICcuLi91dGlscy9tZXJnZVV0aWwuanMnO1xuaW1wb3J0IHsgcHJvbWlzZVBvb2wgfSBmcm9tICcuLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZW5lcmF0ZVJlbGVhc2VyYyhyb290Q29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZ2VuZXJhdGVSZWxlYXNlcmMnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLnJlc29sdmUocm9vdENvbmZpZy5kaXJQYXRoLCAnLnJlbGVhc2VyYy5qc29uJyk7XG4gICAgaWYgKCFmcy5leGlzdHNTeW5jKGZpbGVQYXRoKSkgcmV0dXJuO1xuXG4gICAgY29uc3Qgc2V0dGluZ3MgPSBKU09OLnBhcnNlKGF3YWl0IGZzLnByb21pc2VzLnJlYWRGaWxlKGZpbGVQYXRoLCAndXRmOCcpKSBhcyB7XG4gICAgICBwbHVnaW5zPzogKHN0cmluZyB8IFtzdHJpbmcsIHVua25vd25dKVtdO1xuICAgIH07XG4gICAgY29uc3QgcGx1Z2lucyA9IHNldHRpbmdzLnBsdWdpbnMgPz8gW107XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwbHVnaW5zLmxlbmd0aDsgaSsrKSB7XG4gICAgICBjb25zdCBwbHVnaW5FbnRyeSA9IHBsdWdpbnNbaV07XG4gICAgICBjb25zdCBpc0FycmF5ID0gQXJyYXkuaXNBcnJheShwbHVnaW5FbnRyeSk7XG4gICAgICBjb25zdCBwbHVnaW4gPSBpc0FycmF5ID8gcGx1Z2luRW50cnlbMF0gOiBwbHVnaW5FbnRyeTtcbiAgICAgIGNvbnN0IG9sZENvbmZpZyA9IChpc0FycmF5ICYmIHBsdWdpbkVudHJ5WzFdKSB8fCB7fTtcbiAgICAgIGlmIChwbHVnaW4gPT09ICdAc2VtYW50aWMtcmVsZWFzZS9jb21taXQtYW5hbHl6ZXInKSB7XG4gICAgICAgIHBsdWdpbnNbaV0gPSBbXG4gICAgICAgICAgJ0BzZW1hbnRpYy1yZWxlYXNlL2NvbW1pdC1hbmFseXplcicsXG4gICAgICAgICAgbWVyZ2UuYWxsKFxuICAgICAgICAgICAgW1xuICAgICAgICAgICAgICBvbGRDb25maWcsXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBwcmVzZXQ6ICdjb252ZW50aW9uYWxjb21taXRzJyxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICB7IGFycmF5TWVyZ2U6IG92ZXJ3cml0ZU1lcmdlIH1cbiAgICAgICAgICApLFxuICAgICAgICBdO1xuICAgICAgfSBlbHNlIGlmIChwbHVnaW4gPT09ICdAc2VtYW50aWMtcmVsZWFzZS9naXRodWInKSB7XG4gICAgICAgIHBsdWdpbnNbaV0gPSBbXG4gICAgICAgICAgJ0BzZW1hbnRpYy1yZWxlYXNlL2dpdGh1YicsXG4gICAgICAgICAgbWVyZ2UuYWxsKFxuICAgICAgICAgICAgW1xuICAgICAgICAgICAgICBvbGRDb25maWcsXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAvLyBjZi4gaHR0cHM6Ly9naXRodWIuY29tL3NlbWFudGljLXJlbGVhc2Uvc2VtYW50aWMtcmVsZWFzZS9pc3N1ZXMvMjIwNCNpc3N1ZWNvbW1lbnQtMTUwODQxNzcwNFxuICAgICAgICAgICAgICAgIHN1Y2Nlc3NDb21tZW50Q29uZGl0aW9uOiBmYWxzZSxcbiAgICAgICAgICAgICAgICBmYWlsQ29tbWVudENvbmRpdGlvbjogZmFsc2UsXG4gICAgICAgICAgICAgICAgbGFiZWxzOiBbJ3I6IHNlbWFudGljLXJlbGVhc2UnXSxcbiAgICAgICAgICAgICAgICByZWxlYXNlZExhYmVsczogWydyZWxlYXNlZCA6Ym9va21hcms6J10sXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgeyBhcnJheU1lcmdlOiBvdmVyd3JpdGVNZXJnZSB9XG4gICAgICAgICAgKSxcbiAgICAgICAgXTtcbiAgICAgIH1cbiAgICB9XG4gICAgY29uc3QgbmV3Q29udGVudCA9IEpTT04uc3RyaW5naWZ5KHNldHRpbmdzLCB1bmRlZmluZWQsIDIpO1xuICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiBmc1V0aWwuZ2VuZXJhdGVGaWxlKGZpbGVQYXRoLCBuZXdDb250ZW50KSk7XG4gIH0pO1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IG1lcmdlIGZyb20gJ2RlZXBtZXJnZSc7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGZzVXRpbCB9IGZyb20gJy4uL3V0aWxzL2ZzVXRpbC5qcyc7XG5pbXBvcnQgeyBvdmVyd3JpdGVNZXJnZSB9IGZyb20gJy4uL3V0aWxzL21lcmdlVXRpbC5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcblxuY29uc3QganNvbk9iaiA9IHtcbiAgJHNjaGVtYTogJ2h0dHBzOi8vZG9jcy5yZW5vdmF0ZWJvdC5jb20vcmVub3ZhdGUtc2NoZW1hLmpzb24nLFxuICBleHRlbmRzOiBbJ2dpdGh1Yj5XaWxsQm9vc3Rlci93aWxsYm9vc3Rlci1jb25maWdzOnJlbm92YXRlLmpzb241J10sXG59O1xuXG50eXBlIFNldHRpbmdzID0gdHlwZW9mIGpzb25PYmogJiB7IHBhY2thZ2VSdWxlcz86IHsgbWF0Y2hQYWNrYWdlTmFtZXM6IHN0cmluZ1tdOyBlbmFibGVkPzogYm9vbGVhbiB9W10gfTtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlUmVub3ZhdGVKc29uKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2dlbmVyYXRlUmVub3ZhdGVKc29uJywgYXN5bmMgKCkgPT4ge1xuICAgIGxldCBuZXdTZXR0aW5ncyA9IHN0cnVjdHVyZWRDbG9uZShqc29uT2JqKSBhcyBTZXR0aW5ncztcbiAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJ3Jlbm92YXRlLmpzb24nKTtcbiAgICBpZiAoZnMuZXhpc3RzU3luYyhgJHtmaWxlUGF0aH01YCkpIHtcbiAgICAgIC8vIFNpbmNlIGl0IGlzIGRpZmZpY3VsdCBmb3IgcGFyc2luZyByZW5vdmF0ZS5qc29uNSwgd2UgZG8gbm90aGluZ1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0cnkge1xuICAgICAgY29uc3Qgb2xkQ29udGVudCA9IGF3YWl0IGZzLnByb21pc2VzLnJlYWRGaWxlKGZpbGVQYXRoLCAndXRmOCcpO1xuICAgICAgY29uc3Qgb2xkU2V0dGluZ3MgPSBKU09OLnBhcnNlKG9sZENvbnRlbnQpIGFzIFNldHRpbmdzO1xuICAgICAgbmV3U2V0dGluZ3MgPSBtZXJnZS5hbGwoW25ld1NldHRpbmdzLCBvbGRTZXR0aW5ncywgbmV3U2V0dGluZ3NdLCB7XG4gICAgICAgIGFycmF5TWVyZ2U6IG92ZXJ3cml0ZU1lcmdlLFxuICAgICAgfSkgYXMgU2V0dGluZ3M7XG4gICAgICBuZXdTZXR0aW5ncy5leHRlbmRzID0gbmV3U2V0dGluZ3MuZXh0ZW5kcy5maWx0ZXIoKGl0ZW06IHN0cmluZykgPT4gaXRlbSAhPT0gJ0B3aWxsYm9vc3RlcicpO1xuICAgIH0gY2F0Y2gge1xuICAgICAgLy8gZG8gbm90aGluZ1xuICAgIH1cblxuICAgIC8vIERvbid0IHVwZ3JhZGUgTmV4dC5qcyBhdXRvbWF0aWNhbGx5XG4gICAgaWYgKGNvbmZpZy5kZXBlbmRpbmcuYmxpdHopIHtcbiAgICAgIG5ld1NldHRpbmdzLnBhY2thZ2VSdWxlcyA/Pz0gW107XG4gICAgICBpZiAoXG4gICAgICAgICFuZXdTZXR0aW5ncy5wYWNrYWdlUnVsZXMuc29tZSgocnVsZTogeyBtYXRjaFBhY2thZ2VOYW1lcz86IHN0cmluZ1tdIH0pID0+XG4gICAgICAgICAgcnVsZS5tYXRjaFBhY2thZ2VOYW1lcz8uaW5jbHVkZXMoJ25leHQnKVxuICAgICAgICApXG4gICAgICApIHtcbiAgICAgICAgbmV3U2V0dGluZ3MucGFja2FnZVJ1bGVzLnB1c2goeyBtYXRjaFBhY2thZ2VOYW1lczogWyduZXh0J10sIGVuYWJsZWQ6IGZhbHNlIH0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiBmcy5wcm9taXNlcy5ybShwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICcuZGVwZW5kYWJvdCcpLCB7IGZvcmNlOiB0cnVlIH0pKTtcbiAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnMucHJvbWlzZXMucm0ocGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnLnJlbm92YXRlcmMuanNvbicpLCB7IGZvcmNlOiB0cnVlIH0pKTtcbiAgICBjb25zdCBuZXdDb250ZW50ID0gSlNPTi5zdHJpbmdpZnkobmV3U2V0dGluZ3MsIHVuZGVmaW5lZCwgMik7XG4gICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzVXRpbC5nZW5lcmF0ZUZpbGUoZmlsZVBhdGgsIG5ld0NvbnRlbnQpKTtcbiAgfSk7XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcy9wcm9taXNlcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBpbnN0YWxsQWdlbnRTa2lsbHMocm9vdENvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2luc3RhbGxBZ2VudFNraWxscycsIGFzeW5jICgpID0+IHtcbiAgICAvLyBUT0RPOiBXZSBhcmUgdGVtcG9yYXJpbHkgcmVtb3ZpbmcgYWdlbnQgc2tpbGxzIGZyb20gdGhlIHJlcG9cbiAgICAvLyBhd2FpdCBydW5JbnN0YWxsQWdlbnRTa2lsbHMocm9vdENvbmZpZyk7XG4gICAgYXdhaXQgUHJvbWlzZS5hbGwoW1xuICAgICAgZnMucm0ocGF0aC5yZXNvbHZlKHJvb3RDb25maWcuZGlyUGF0aCwgJy5hZ2VudHMnKSwge1xuICAgICAgICBmb3JjZTogdHJ1ZSxcbiAgICAgICAgcmVjdXJzaXZlOiB0cnVlLFxuICAgICAgfSksXG4gICAgICBmcy5ybShwYXRoLnJlc29sdmUocm9vdENvbmZpZy5kaXJQYXRoLCAnLmNsYXVkZScpLCB7XG4gICAgICAgIGZvcmNlOiB0cnVlLFxuICAgICAgICByZWN1cnNpdmU6IHRydWUsXG4gICAgICB9KSxcbiAgICAgIGZzLnJtKHBhdGgucmVzb2x2ZShyb290Q29uZmlnLmRpclBhdGgsICdza2lsbHMtbG9jay5qc29uJyksIHtcbiAgICAgICAgZm9yY2U6IHRydWUsXG4gICAgICB9KSxcbiAgICBdKTtcbiAgfSk7XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgbWVyZ2UgZnJvbSAnZGVlcG1lcmdlJztcbmltcG9ydCB0eXBlIHsgVHNDb25maWdKc29uIH0gZnJvbSAndHlwZS1mZXN0JztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZnNVdGlsIH0gZnJvbSAnLi4vdXRpbHMvZnNVdGlsLmpzJztcbmltcG9ydCB7IGNvbWJpbmVNZXJnZSB9IGZyb20gJy4uL3V0aWxzL21lcmdlVXRpbC5qcyc7XG5pbXBvcnQgeyBzb3J0S2V5cyB9IGZyb20gJy4uL3V0aWxzL29iamVjdFV0aWwuanMnO1xuaW1wb3J0IHsgcHJvbWlzZVBvb2wgfSBmcm9tICcuLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5pbXBvcnQgeyBnZXRUc2NvbmZpZ0V4dGVuZHMgfSBmcm9tICcuLi91dGlscy90c2NvbmZpZ0Jhc2UuanMnO1xuXG5jb25zdCByb290SnNvbk9iaiA9IHtcbiAgY29tcGlsZXJPcHRpb25zOiB7XG4gICAgYWx3YXlzU3RyaWN0OiB0cnVlLFxuICAgIG5vVW5jaGVja2VkSW5kZXhlZEFjY2VzczogdHJ1ZSwgLy8gZm9yIEB0eXBlc2NyaXB0LWVzbGludC9wcmVmZXItbnVsbGlzaC1jb2FsZXNjaW5nXG4gICAgYWxsb3dTeW50aGV0aWNEZWZhdWx0SW1wb3J0czogdHJ1ZSwgLy8gYWxsb3cgYGltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCdgXG4gICAgZXNNb2R1bGVJbnRlcm9wOiB0cnVlLCAvLyBhbGxvdyBkZWZhdWx0IGltcG9ydCBmcm9tIENvbW1vbkpTL0FNRC9VTUQgbW9kdWxlc1xuICAgIHJlc29sdmVKc29uTW9kdWxlOiB0cnVlLCAvLyBhbGxvdyB0byBpbXBvcnQgSlNPTiBmaWxlc1xuICAgIGltcG9ydEhlbHBlcnM6IGZhbHNlLFxuICAgIG5vRW1pdDogdHJ1ZSxcbiAgfSxcbiAgZXhjbHVkZTogWydwYWNrYWdlcy8qL3Rlc3QvZml4dHVyZXMnLCAndGVzdC9maXh0dXJlcyddLFxuICBpbmNsdWRlOiBbXG4gICAgJyouY29uZmlnLnRzJyxcbiAgICAncGFja2FnZXMvKi8qLmNvbmZpZy50cycsXG4gICAgJ3BhY2thZ2VzLyovc2NyaXB0cy8qKi8qJyxcbiAgICAncGFja2FnZXMvKi9zcmMvKiovKicsXG4gICAgJ3BhY2thZ2VzLyovdGVzdC8qKi8qJyxcbiAgICAnc2NyaXB0cy8qKi8qJyxcbiAgICAnc3JjLyoqLyonLFxuICAgICd0ZXN0LyoqLyonLFxuICBdLFxufTtcblxuY29uc3Qgc3ViSnNvbk9iaiA9IHtcbiAgY29tcGlsZXJPcHRpb25zOiB7XG4gICAgYWx3YXlzU3RyaWN0OiB0cnVlLFxuICAgIG5vVW5jaGVja2VkSW5kZXhlZEFjY2VzczogdHJ1ZSwgLy8gZm9yIEB0eXBlc2NyaXB0LWVzbGludC9wcmVmZXItbnVsbGlzaC1jb2FsZXNjaW5nXG4gICAgYWxsb3dTeW50aGV0aWNEZWZhdWx0SW1wb3J0czogdHJ1ZSwgLy8gYWxsb3cgYGltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCdgXG4gICAgZXNNb2R1bGVJbnRlcm9wOiB0cnVlLCAvLyBhbGxvdyBkZWZhdWx0IGltcG9ydCBmcm9tIENvbW1vbkpTL0FNRC9VTUQgbW9kdWxlc1xuICAgIHJlc29sdmVKc29uTW9kdWxlOiB0cnVlLCAvLyBhbGxvdyB0byBpbXBvcnQgSlNPTiBmaWxlc1xuICAgIGltcG9ydEhlbHBlcnM6IGZhbHNlLFxuICAgIG5vRW1pdDogdHJ1ZSxcbiAgfSxcbiAgZXhjbHVkZTogWyd0ZXN0L2ZpeHR1cmVzJ10sXG4gIC8vIHdiZnkgZ2VuZXJhdGVzIHJvb3QtbGV2ZWwgdG9vbCBjb25maWdzIHN1Y2ggYXMgcGxheXdyaWdodC5jb25maWcudHMsIGFuZFxuICAvLyB0eXBlLWF3YXJlIGxpbnRpbmcgbmVlZHMgdGhvc2UgZmlsZXMgaW4gdGhlIHByb2plY3QgdG8gc2VlIE5vZGUvQnVuIGdsb2JhbHMuXG4gIGluY2x1ZGU6IFsnKi5jb25maWcudHMnLCAnc2NyaXB0cy8qKi8qJywgJ3NyYy8qKi8qJywgJ3Rlc3QvKiovKiddLFxufTtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlVHNjb25maWcoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZ2VuZXJhdGVUc2NvbmZpZycsIGFzeW5jICgpID0+IHtcbiAgICBpZiAoY29uZmlnLmRlcGVuZGluZy5ibGl0eiB8fCBjb25maWcuZGVwZW5kaW5nLm5leHQpIHtcbiAgICAgIGF3YWl0IGNsZWFudXBMZWdhY3lUc2NvbmZpZ01vZHVsZVNldHRpbmdzKGNvbmZpZyk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgbGV0IG5ld1NldHRpbmdzID0gc3RydWN0dXJlZENsb25lKGNvbmZpZy5pc1Jvb3QgPyByb290SnNvbk9iaiA6IHN1Ykpzb25PYmopIGFzIFRzQ29uZmlnSnNvbjtcbiAgICBjb25zdCBnZW5lcmF0ZWRUeXBlcyA9IGdldEdlbmVyYXRlZFR5cGVzKGNvbmZpZyk7XG4gICAgbmV3U2V0dGluZ3MuZXh0ZW5kcyA9IGdldFRzY29uZmlnRXh0ZW5kcyhjb25maWcpO1xuICAgIG5ld1NldHRpbmdzLmNvbXBpbGVyT3B0aW9ucyA/Pz0ge307XG4gICAgbmV3U2V0dGluZ3MuY29tcGlsZXJPcHRpb25zLnJvb3REaXIgPSBnZXRSb290RGlyKGNvbmZpZyk7XG4gICAgaWYgKGdlbmVyYXRlZFR5cGVzLmxlbmd0aCA+IDApIHtcbiAgICAgIG5ld1NldHRpbmdzLmNvbXBpbGVyT3B0aW9ucyA9IHsgLi4ubmV3U2V0dGluZ3MuY29tcGlsZXJPcHRpb25zLCB0eXBlczogZ2VuZXJhdGVkVHlwZXMgfTtcbiAgICB9XG4gICAgaWYgKCFjb25maWcuZG9lc0NvbnRhaW5Kc3hPclRzeCAmJiAhY29uZmlnLmRvZXNDb250YWluSnN4T3JUc3hJblBhY2thZ2VzKSB7XG4gICAgICBkZWxldGUgbmV3U2V0dGluZ3MuY29tcGlsZXJPcHRpb25zPy5qc3g7XG4gICAgfSBlbHNlIGlmICghY29uZmlnLmlzQnVuICYmICFjb25maWcuZGVwZW5kaW5nLnJlYWN0TmF0aXZlKSB7XG4gICAgICBuZXdTZXR0aW5ncy5jb21waWxlck9wdGlvbnMgPSB7IC4uLm5ld1NldHRpbmdzLmNvbXBpbGVyT3B0aW9ucywganN4OiAncmVhY3QtanN4JyB9O1xuICAgIH1cbiAgICBpZiAoY29uZmlnLmlzUm9vdCAmJiAhY29uZmlnLmRvZXNDb250YWluU3ViUGFja2FnZUpzb25zKSB7XG4gICAgICBuZXdTZXR0aW5ncy5pbmNsdWRlID0gbmV3U2V0dGluZ3MuaW5jbHVkZT8uZmlsdGVyKChkaXJQYXRoOiBzdHJpbmcpID0+ICFkaXJQYXRoLnN0YXJ0c1dpdGgoJ3BhY2thZ2VzLyovJykpO1xuICAgICAgbmV3U2V0dGluZ3MuZXhjbHVkZSA9IG5ld1NldHRpbmdzLmV4Y2x1ZGU/LmZpbHRlcigoZGlyUGF0aDogc3RyaW5nKSA9PiAhZGlyUGF0aC5zdGFydHNXaXRoKCdwYWNrYWdlcy8qLycpKTtcbiAgICB9XG4gICAgaWYgKGNvbmZpZy5kZXBlbmRpbmcucHJpc21hKSB7XG4gICAgICAvLyBQcmlzbWEgc2VlZHMgYW5kIG1pZ3JhdGlvbiBoZWxwZXIgc2NyaXB0cyBvZnRlbiBsaXZlIG91dHNpZGUgc3JjLCBidXRcbiAgICAgIC8vIHR5cGUtYXdhcmUgbGludGluZyBzdGlsbCBuZWVkcyB0aGVtIGNvdmVyZWQgYnkgdGhlIHByb2plY3QgY29uZmlnLlxuICAgICAgYWRkSW5jbHVkZVBhdGgobmV3U2V0dGluZ3MsICdwcmlzbWEvKiovKicpO1xuICAgIH1cblxuICAgIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAndHNjb25maWcuanNvbicpO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBleGlzdGluZ0NvbnRlbnQgPSBhd2FpdCBmcy5wcm9taXNlcy5yZWFkRmlsZShmaWxlUGF0aCwgJ3V0ZjgnKTtcbiAgICAgIGNvbnN0IG9sZFNldHRpbmdzID0gSlNPTi5wYXJzZShleGlzdGluZ0NvbnRlbnQpIGFzIFRzQ29uZmlnSnNvbjtcbiAgICAgIGNvbnN0IGV4aXN0aW5nVHlwZXMgPSBub3JtYWxpemVTdHJpbmdBcnJheShvbGRTZXR0aW5ncy5jb21waWxlck9wdGlvbnM/LnR5cGVzKTtcbiAgICAgIGNvbnN0IGV4aXN0aW5nRW1pdE1ldGFkYXRhID0gcGlja0V4aXN0aW5nRW1pdE1ldGFkYXRhKG9sZFNldHRpbmdzLmNvbXBpbGVyT3B0aW9ucyk7XG4gICAgICBuZXdTZXR0aW5ncy5leHRlbmRzID0gbWVyZ2VUc2NvbmZpZ0V4dGVuZHMobmV3U2V0dGluZ3MuZXh0ZW5kcywgb2xkU2V0dGluZ3MuZXh0ZW5kcyk7XG4gICAgICBkZWxldGUgb2xkU2V0dGluZ3MuZXh0ZW5kcztcbiAgICAgIGRlbGV0ZSBvbGRTZXR0aW5ncy5jb21waWxlck9wdGlvbnM/LmpzeDtcbiAgICAgIG5ld1NldHRpbmdzID0gbWVyZ2UuYWxsKFtuZXdTZXR0aW5ncywgb2xkU2V0dGluZ3MsIG5ld1NldHRpbmdzXSwgeyBhcnJheU1lcmdlOiBjb21iaW5lTWVyZ2UgfSk7XG4gICAgICBuZXdTZXR0aW5ncy5pbmNsdWRlID0gbmV3U2V0dGluZ3MuaW5jbHVkZT8uZmlsdGVyKFxuICAgICAgICAoZGlyUGF0aDogc3RyaW5nKSA9PlxuICAgICAgICAgICFkaXJQYXRoLmluY2x1ZGVzKCdAdHlwZXMnKSAmJiAhZGlyUGF0aC5pbmNsdWRlcygnX190ZXN0c19fLycpICYmICFkaXJQYXRoLmluY2x1ZGVzKCd0ZXN0cy8nKVxuICAgICAgKTtcbiAgICAgIG5ld1NldHRpbmdzLmNvbXBpbGVyT3B0aW9ucyA/Pz0ge307XG4gICAgICAvLyB3YmZ5LWdlbmVyYXRlZCB0c2NvbmZpZy5qc29uIGlzIGEgbGludC90eXBlY2hlY2sgcHJvamVjdCwgbm90IHRoZSBlbWl0XG4gICAgICAvLyBjb250cmFjdC4gSXQgbXVzdCBrZWVwIHJvb3REaXIgYnJvYWQgZW5vdWdoIGZvciByb290IGNvbmZpZyBmaWxlcyxcbiAgICAgIC8vIHNjcmlwdHMsIHNyYywgYW5kIHRlc3RzLiBidWlsZC10cyBvd25zIGVtaXQgYW5kIGNyZWF0ZXMgYSB0ZW1wb3JhcnlcbiAgICAgIC8vIHNyYy1vbmx5IHRzY29uZmlnIHdpdGggbm9FbWl0PWZhbHNlLCBlbWl0RGVjbGFyYXRpb25Pbmx5PXRydWUsXG4gICAgICAvLyByb290RGlyPVwic3JjXCIsIGFuZCBpbmNsdWRlPVtcInNyYy8qKi8qXCJdLCBzbyBwcmVzZXJ2aW5nIG5vRW1pdD1mYWxzZSBvclxuICAgICAgLy8gcm9vdERpcj1cInNyY1wiIGhlcmUgd291bGQgb25seSBicmVhayBub24tc3JjIHR5cGUtYXdhcmUgbGludCBjb3ZlcmFnZS5cbiAgICAgIG5ld1NldHRpbmdzLmNvbXBpbGVyT3B0aW9ucyA9IHsgLi4ubmV3U2V0dGluZ3MuY29tcGlsZXJPcHRpb25zLCAuLi5leGlzdGluZ0VtaXRNZXRhZGF0YSB9O1xuICAgICAgZW5zdXJlVHNFeHRlbnNpb25FbWl0Q29tcGF0aWJpbGl0eShuZXdTZXR0aW5ncy5jb21waWxlck9wdGlvbnMpO1xuXG4gICAgICBjb25zdCBtZXJnZWRUeXBlcyA9IFsuLi5uZXcgU2V0KFsuLi5maWx0ZXJFeGlzdGluZ1R5cGVzKGV4aXN0aW5nVHlwZXMsIGdlbmVyYXRlZFR5cGVzKSwgLi4uZ2VuZXJhdGVkVHlwZXNdKV07XG4gICAgICBpZiAobWVyZ2VkVHlwZXMubGVuZ3RoID4gMCkge1xuICAgICAgICBuZXdTZXR0aW5ncy5jb21waWxlck9wdGlvbnMudHlwZXMgPSBtZXJnZWRUeXBlcztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGRlbGV0ZSBuZXdTZXR0aW5ncy5jb21waWxlck9wdGlvbnMudHlwZXM7XG4gICAgICB9XG4gICAgICBpZiAoc2hvdWxkRGVsZXRlVHlwZVJvb3RzKGdlbmVyYXRlZFR5cGVzKSkge1xuICAgICAgICBkZWxldGUgbmV3U2V0dGluZ3MuY29tcGlsZXJPcHRpb25zLnR5cGVSb290cztcbiAgICAgIH1cbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIGRvIG5vdGhpbmdcbiAgICB9XG4gICAgc29ydEtleXMobmV3U2V0dGluZ3MpO1xuICAgIG5ld1NldHRpbmdzLmluY2x1ZGU/LnNvcnQoKTtcbiAgICAvLyBEb24ndCB1c2Ugb2xkIGRlY29yYXRvclxuICAgIGRlbGV0ZSBuZXdTZXR0aW5ncy5jb21waWxlck9wdGlvbnM/LmV4cGVyaW1lbnRhbERlY29yYXRvcnM7XG4gICAgLy8gUGFja2FnZSBpbXBvcnRzIHNob3VsZCByZXNvbHZlIHRocm91Z2ggcGFja2FnZSBleHBvcnRzIGluc3RlYWQgb2YgYmFzZVVybC5cbiAgICAvLyBwYXRocyBpcyBpbnRlbnRpb25hbGx5IHByZXNlcnZlZCBzbyByZXBvLWxvY2FsIHRvb2xpbmcgY2FuIGtlZXAgZXhwbGljaXRcbiAgICAvLyBhbGlhc2VzIHdpdGhvdXQgcmVseWluZyBvbiBiYXNlVXJsJ3MgYnJvYWQgZmFsbGJhY2sgcmVzb2x1dGlvbi5cbiAgICBkZWxldGUgbmV3U2V0dGluZ3MuY29tcGlsZXJPcHRpb25zPy5iYXNlVXJsO1xuICAgIGRlbGV0ZUxlZ2FjeU1vZHVsZVNldHRpbmdzKG5ld1NldHRpbmdzLmNvbXBpbGVyT3B0aW9ucywgY29uZmlnKTtcbiAgICBpZiAoY29uZmlnLmRlcGVuZGluZy5yZWFjdE5hdGl2ZSkge1xuICAgICAgZGVsZXRlIG5ld1NldHRpbmdzLmNvbXBpbGVyT3B0aW9ucz8udmVyYmF0aW1Nb2R1bGVTeW50YXg7XG4gICAgfVxuICAgIGNvbnN0IG5ld0NvbnRlbnQgPSBKU09OLnN0cmluZ2lmeShuZXdTZXR0aW5ncywgdW5kZWZpbmVkLCAyKTtcbiAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnNVdGlsLmdlbmVyYXRlRmlsZShmaWxlUGF0aCwgbmV3Q29udGVudCkpO1xuICB9KTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gY2xlYW51cExlZ2FjeVRzY29uZmlnTW9kdWxlU2V0dGluZ3MoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAndHNjb25maWcuanNvbicpO1xuICB0cnkge1xuICAgIGNvbnN0IHNldHRpbmdzID0gSlNPTi5wYXJzZShhd2FpdCBmcy5wcm9taXNlcy5yZWFkRmlsZShmaWxlUGF0aCwgJ3V0ZjgnKSkgYXMgVHNDb25maWdKc29uO1xuICAgIG5vcm1hbGl6ZU5leHRUc2NvbmZpZ01vZHVsZVNldHRpbmdzKHNldHRpbmdzLmNvbXBpbGVyT3B0aW9ucyk7XG4gICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzVXRpbC5nZW5lcmF0ZUZpbGUoZmlsZVBhdGgsIEpTT04uc3RyaW5naWZ5KHNldHRpbmdzLCB1bmRlZmluZWQsIDIpKSk7XG4gIH0gY2F0Y2gge1xuICAgIC8vIE5leHQvQmxpdHogb3duIHRoZWlyIHRzY29uZmlnIHNoYXBlLCBidXQgVHlwZVNjcmlwdCA2IG5vIGxvbmdlciBhY2NlcHRzXG4gICAgLy8gbm9kZTEwIHJlc29sdmVyIHNwZWxsaW5ncyB0aGF0IG9sZGVyIHByb2plY3RzIGNvbW1vbmx5IGluaGVyaXRlZC5cbiAgfVxufVxuXG5mdW5jdGlvbiBub3JtYWxpemVOZXh0VHNjb25maWdNb2R1bGVTZXR0aW5ncyhjb21waWxlck9wdGlvbnM6IFRzQ29uZmlnSnNvbi5Db21waWxlck9wdGlvbnMgfCB1bmRlZmluZWQpOiB2b2lkIHtcbiAgaWYgKCFjb21waWxlck9wdGlvbnMpIHJldHVybjtcbiAgaWYgKFxuICAgIGNvbXBpbGVyT3B0aW9ucy5tb2R1bGVSZXNvbHV0aW9uID09PSAnbm9kZScgfHxcbiAgICBjb21waWxlck9wdGlvbnMubW9kdWxlUmVzb2x1dGlvbiA9PT0gJ05vZGUnIHx8XG4gICAgY29tcGlsZXJPcHRpb25zLm1vZHVsZVJlc29sdXRpb24gPT09ICdub2RlMTAnIHx8XG4gICAgY29tcGlsZXJPcHRpb25zLm1vZHVsZVJlc29sdXRpb24gPT09IHVuZGVmaW5lZFxuICApIHtcbiAgICAvLyBOZXh0LmpzIHdyaXRlcyBcIm5vZGVcIiBkdXJpbmcgYnVpbGQgd2hlbiB0aGlzIG9wdGlvbiBpcyBtaXNzaW5nLCBidXRcbiAgICAvLyB0c2dvbGludCB0cmVhdHMgdGhhdCBzcGVsbGluZyBhcyB0aGUgcmVtb3ZlZCBub2RlMTAgcmVzb2x2ZXIuXG4gICAgY29tcGlsZXJPcHRpb25zLm1vZHVsZVJlc29sdXRpb24gPSAnYnVuZGxlcic7XG4gIH1cbn1cblxuZnVuY3Rpb24gZ2V0Um9vdERpcihjb25maWc6IFBhY2thZ2VDb25maWcpOiBzdHJpbmcge1xuICBpZiAoY29uZmlnLmlzUm9vdCkgcmV0dXJuICcuJztcbiAgcmV0dXJuIGZzLmV4aXN0c1N5bmMocGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnLi4nLCAnLi4nLCAncGFja2FnZS5qc29uJykpID8gJy4uLy4uJyA6ICcuJztcbn1cblxuZnVuY3Rpb24gbWVyZ2VUc2NvbmZpZ0V4dGVuZHMoXG4gIGdlbmVyYXRlZEV4dGVuZHM6IFRzQ29uZmlnSnNvblsnZXh0ZW5kcyddLFxuICBleGlzdGluZ0V4dGVuZHM6IFRzQ29uZmlnSnNvblsnZXh0ZW5kcyddXG4pOiBUc0NvbmZpZ0pzb25bJ2V4dGVuZHMnXSB7XG4gIGNvbnN0IG1lcmdlZEV4dGVuZHMgPSBbLi4ubm9ybWFsaXplRXh0ZW5kcyhnZW5lcmF0ZWRFeHRlbmRzKSwgLi4ubm9ybWFsaXplRXh0ZW5kcyhleGlzdGluZ0V4dGVuZHMpXTtcbiAgY29uc3QgdW5pcXVlRXh0ZW5kcyA9IFsuLi5uZXcgU2V0KG1lcmdlZEV4dGVuZHMpXTtcbiAgaWYgKHVuaXF1ZUV4dGVuZHMubGVuZ3RoID09PSAwKSByZXR1cm4gdW5kZWZpbmVkO1xuICBpZiAodW5pcXVlRXh0ZW5kcy5sZW5ndGggPT09IDEpIHJldHVybiB1bmlxdWVFeHRlbmRzWzBdO1xuICByZXR1cm4gdW5pcXVlRXh0ZW5kcztcbn1cblxuZnVuY3Rpb24gYWRkSW5jbHVkZVBhdGgoc2V0dGluZ3M6IFRzQ29uZmlnSnNvbiwgZGlyUGF0aDogc3RyaW5nKTogdm9pZCB7XG4gIHNldHRpbmdzLmluY2x1ZGUgPz89IFtdO1xuICBpZiAoIXNldHRpbmdzLmluY2x1ZGUuaW5jbHVkZXMoZGlyUGF0aCkpIHtcbiAgICBzZXR0aW5ncy5pbmNsdWRlLnB1c2goZGlyUGF0aCk7XG4gIH1cbn1cblxuZnVuY3Rpb24gbm9ybWFsaXplRXh0ZW5kcyh2YWx1ZTogVHNDb25maWdKc29uWydleHRlbmRzJ10pOiBzdHJpbmdbXSB7XG4gIGlmICghdmFsdWUpIHJldHVybiBbXTtcbiAgcmV0dXJuIEFycmF5LmlzQXJyYXkodmFsdWUpID8gdmFsdWUgOiBbdmFsdWVdO1xufVxuXG5mdW5jdGlvbiBub3JtYWxpemVTdHJpbmdBcnJheSh2YWx1ZTogdW5rbm93bik6IHN0cmluZ1tdIHtcbiAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycpIHJldHVybiBbdmFsdWVdO1xuICBpZiAoIUFycmF5LmlzQXJyYXkodmFsdWUpKSByZXR1cm4gW107XG4gIHJldHVybiB2YWx1ZS5maWx0ZXIoKGl0ZW0pOiBpdGVtIGlzIHN0cmluZyA9PiB0eXBlb2YgaXRlbSA9PT0gJ3N0cmluZycpO1xufVxuXG5mdW5jdGlvbiBzaG91bGREZWxldGVUeXBlUm9vdHModHlwZU5hbWVzOiBzdHJpbmdbXSk6IGJvb2xlYW4ge1xuICAvLyBPbmx5IGdlbmVyYXRlZCBwYWNrYWdlLW93bmVkIHRlc3QgdHlwZXMgc2hvdWxkIHRyaWdnZXIgdGhpcy4gVXNlci1kZWZpbmVkIHNsYXNoLWJhc2VkXG4gIC8vIGVudHJpZXMgbWF5IGludGVudGlvbmFsbHkgcmVseSBvbiBjdXN0b20gdHlwZVJvb3RzIGFuZCBzaG91bGQgYmUgcHJlc2VydmVkIGFzLWlzLlxuICByZXR1cm4gdHlwZU5hbWVzLnNvbWUoKHR5cGVOYW1lKSA9PiB0eXBlTmFtZSA9PT0gJ2N5cHJlc3MnIHx8IHR5cGVOYW1lLmluY2x1ZGVzKCcvJykpO1xufVxuXG5mdW5jdGlvbiBmaWx0ZXJFeGlzdGluZ1R5cGVzKGV4aXN0aW5nVHlwZXM6IHN0cmluZ1tdLCBnZW5lcmF0ZWRUeXBlczogc3RyaW5nW10pOiBzdHJpbmdbXSB7XG4gIGNvbnN0IGdlbmVyYXRlZFR5cGVTZXQgPSBuZXcgU2V0KGdlbmVyYXRlZFR5cGVzKTtcbiAgcmV0dXJuIGV4aXN0aW5nVHlwZXMuZmlsdGVyKCh0eXBlTmFtZSkgPT4ge1xuICAgIC8vIHdiZnkgb3ducyB0aGVzZSBwYWNrYWdlLXByb3ZpZGVkIHRlc3QgZ2xvYmFscy4gRHJvcCBzdGFsZSBlbnRyaWVzIHdoZW4gdGhlXG4gICAgLy8gY29ycmVzcG9uZGluZyBkZXBlbmRlbmN5IGlzIG5vIGxvbmdlciBwcmVzZW50IHNvIFR5cGVTY3JpcHQgd29uJ3QgcmVxdWlyZVxuICAgIC8vIG1pc3NpbmcgcGFja2FnZXMgc3VjaCBhcyB2aXRlc3QuXG4gICAgaWYgKGlzR2VuZXJhdGVkVGVzdEdsb2JhbFR5cGUodHlwZU5hbWUpICYmICFnZW5lcmF0ZWRUeXBlU2V0Lmhhcyh0eXBlTmFtZSkpIHJldHVybiBmYWxzZTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIGlzR2VuZXJhdGVkVGVzdEdsb2JhbFR5cGUodHlwZU5hbWU6IHN0cmluZyk6IGJvb2xlYW4ge1xuICByZXR1cm4gdHlwZU5hbWUgPT09ICdjeXByZXNzJyB8fCB0eXBlTmFtZSA9PT0gJ2plc3QnIHx8IHR5cGVOYW1lID09PSAnbW9jaGEnIHx8IHR5cGVOYW1lID09PSAndml0ZXN0L2dsb2JhbHMnO1xufVxuXG5mdW5jdGlvbiBlbnN1cmVUc0V4dGVuc2lvbkVtaXRDb21wYXRpYmlsaXR5KGNvbXBpbGVyT3B0aW9uczogVHNDb25maWdKc29uLkNvbXBpbGVyT3B0aW9ucyB8IHVuZGVmaW5lZCk6IHZvaWQge1xuICBpZiAoIWNvbXBpbGVyT3B0aW9ucykgcmV0dXJuO1xuICBpZiAoY29tcGlsZXJPcHRpb25zLm5vRW1pdCAhPT0gZmFsc2UgfHwgY29tcGlsZXJPcHRpb25zLmVtaXREZWNsYXJhdGlvbk9ubHkgPT09IHRydWUpIHJldHVybjtcblxuICAvLyBAdHNjb25maWcvYnVuIGVuYWJsZXMgYWxsb3dJbXBvcnRpbmdUc0V4dGVuc2lvbnMsIHdoaWNoIFR5cGVTY3JpcHQgcGVybWl0c1xuICAvLyBkdXJpbmcgZW1pdCBvbmx5IHdoZW4gcmVsYXRpdmUgVFMgZXh0ZW5zaW9ucyBhcmUgcmV3cml0dGVuLlxuICBjb21waWxlck9wdGlvbnMucmV3cml0ZVJlbGF0aXZlSW1wb3J0RXh0ZW5zaW9ucyA9IHRydWU7XG59XG5cbmZ1bmN0aW9uIGRlbGV0ZUxlZ2FjeU1vZHVsZVNldHRpbmdzKFxuICBjb21waWxlck9wdGlvbnM6IFRzQ29uZmlnSnNvbi5Db21waWxlck9wdGlvbnMgfCB1bmRlZmluZWQsXG4gIGNvbmZpZzogUGFja2FnZUNvbmZpZ1xuKTogdm9pZCB7XG4gIGlmICghY29tcGlsZXJPcHRpb25zKSByZXR1cm47XG5cbiAgLy8gVHlwZVNjcmlwdCA2IHJlbW92ZWQgdGhlIG9sZCBub2RlMTAgcmVzb2x2ZXIgc3BlbGxpbmcsIHNvIGluaGVyaXRlZCBiYXNlIGNvbmZpZ3NcbiAgLy8gc2hvdWxkIGNob29zZSB0aGUgcmVzb2x2ZXIgdW5sZXNzIGEgcHJvamVjdCBhbHJlYWR5IG9wdGVkIGludG8gYSBtb2Rlcm4gb25lLlxuICBpZiAoXG4gICAgY29tcGlsZXJPcHRpb25zLm1vZHVsZVJlc29sdXRpb24gPT09ICdub2RlJyB8fFxuICAgIGNvbXBpbGVyT3B0aW9ucy5tb2R1bGVSZXNvbHV0aW9uID09PSAnTm9kZScgfHxcbiAgICBjb21waWxlck9wdGlvbnMubW9kdWxlUmVzb2x1dGlvbiA9PT0gJ25vZGUxMCdcbiAgKSB7XG4gICAgZGVsZXRlIGNvbXBpbGVyT3B0aW9ucy5tb2R1bGVSZXNvbHV0aW9uO1xuICB9XG4gIGlmIChjb25maWcuaXNCdW4gfHwgY29uZmlnLmRlcGVuZGluZy5yZWFjdE5hdGl2ZSB8fCBjb21waWxlck9wdGlvbnMubW9kdWxlICE9PSAnRVNOZXh0JykgcmV0dXJuO1xuXG4gIC8vIE5vZGUgYmFzZSBjb25maWdzIG5vdyBwYWlyIHRoZWlyIHJlc29sdmVyIHdpdGggYSBtYXRjaGluZyBtb2R1bGUga2luZC4gS2VlcGluZ1xuICAvLyBvbGRlciBFU05leHQgb3ZlcnJpZGVzIGNyZWF0ZXMgaW52YWxpZCBnZW5lcmF0ZWQgY29uZmlncyBmb3IgVFMgNi5cbiAgZGVsZXRlIGNvbXBpbGVyT3B0aW9ucy5tb2R1bGU7XG59XG5cbmZ1bmN0aW9uIHBpY2tFeGlzdGluZ0VtaXRNZXRhZGF0YShcbiAgY29tcGlsZXJPcHRpb25zOiBUc0NvbmZpZ0pzb25bJ2NvbXBpbGVyT3B0aW9ucyddXG4pOiBQaWNrPE5vbk51bGxhYmxlPFRzQ29uZmlnSnNvblsnY29tcGlsZXJPcHRpb25zJ10+LCAnZGVjbGFyYXRpb24nIHwgJ2RlY2xhcmF0aW9uTWFwJyB8ICdzb3VyY2VNYXAnPiB7XG4gIGNvbnN0IGVtaXRPcHRpb25zID0ge30gYXMgUGljazxcbiAgICBOb25OdWxsYWJsZTxUc0NvbmZpZ0pzb25bJ2NvbXBpbGVyT3B0aW9ucyddPixcbiAgICAnZGVjbGFyYXRpb24nIHwgJ2RlY2xhcmF0aW9uTWFwJyB8ICdzb3VyY2VNYXAnXG4gID47XG4gIGZvciAoY29uc3Qga2V5IG9mIFsnZGVjbGFyYXRpb24nLCAnZGVjbGFyYXRpb25NYXAnLCAnc291cmNlTWFwJ10gYXMgY29uc3QpIHtcbiAgICBjb25zdCB2YWx1ZSA9IGNvbXBpbGVyT3B0aW9ucz8uW2tleV07XG4gICAgaWYgKHZhbHVlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGVtaXRPcHRpb25zW2tleV0gPSB2YWx1ZSBhcyBuZXZlcjtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGVtaXRPcHRpb25zO1xufVxuXG5mdW5jdGlvbiBnZXRHZW5lcmF0ZWRUeXBlcyhjb25maWc6IFBhY2thZ2VDb25maWcpOiBzdHJpbmdbXSB7XG4gIGNvbnN0IHR5cGVOYW1lcyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICBjb25zdCBkZXBlbmRlbmNpZXMgPSB7XG4gICAgLi4uY29uZmlnLnBhY2thZ2VKc29uPy5kZXBlbmRlbmNpZXMsXG4gICAgLi4uY29uZmlnLnBhY2thZ2VKc29uPy5kZXZEZXBlbmRlbmNpZXMsXG4gIH07XG5cbiAgaWYgKGNvbmZpZy5pc0J1bikge1xuICAgIHR5cGVOYW1lcy5hZGQoJ2J1bicpO1xuICB9IGVsc2UgaWYgKCFjb25maWcuZGVwZW5kaW5nLnJlYWN0TmF0aXZlKSB7XG4gICAgdHlwZU5hbWVzLmFkZCgnbm9kZScpO1xuICB9XG4gIGlmIChcbiAgICBkZXBlbmRlbmNpZXMuamVzdCB8fFxuICAgIGRlcGVuZGVuY2llc1snQGplc3QvZ2xvYmFscyddIHx8XG4gICAgZGVwZW5kZW5jaWVzWydqZXN0LWVudmlyb25tZW50LWpzZG9tJ10gfHxcbiAgICBkZXBlbmRlbmNpZXNbJ3RzLWplc3QnXVxuICApIHtcbiAgICB0eXBlTmFtZXMuYWRkKCdqZXN0Jyk7XG4gIH1cbiAgaWYgKGRlcGVuZGVuY2llcy52aXRlc3QpIHtcbiAgICB0eXBlTmFtZXMuYWRkKCd2aXRlc3QvZ2xvYmFscycpO1xuICB9XG4gIGlmIChkZXBlbmRlbmNpZXMubW9jaGEpIHtcbiAgICB0eXBlTmFtZXMuYWRkKCdtb2NoYScpO1xuICB9XG4gIGlmIChkZXBlbmRlbmNpZXMuY3lwcmVzcykge1xuICAgIHR5cGVOYW1lcy5hZGQoJ2N5cHJlc3MnKTtcbiAgfVxuXG4gIHJldHVybiBbLi4udHlwZU5hbWVzXTtcbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCBtZXJnZSBmcm9tICdkZWVwbWVyZ2UnO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBmc1V0aWwgfSBmcm9tICcuLi91dGlscy9mc1V0aWwuanMnO1xuaW1wb3J0IHsgc29ydEtleXMgfSBmcm9tICcuLi91dGlscy9vYmplY3RVdGlsLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuXG5jb25zdCBleGNsdWRlRmlsZVBhdHRlcm5zID0gW1xuICAnKiovLmdpdC9vYmplY3RzLyoqJyxcbiAgJyoqLy5naXQvc3VidHJlZS1jYWNoZS8qKicsXG4gICcqKi9ub2RlX21vZHVsZXMvKionLFxuICAnKiovdG1wLyoqJyxcbiAgJyoqL3RlbXAvKionLFxuICAnKiovZGlzdC8qKicsXG5dO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVWc2NvZGVTZXR0aW5ncyhjb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdnZW5lcmF0ZVZzY29kZVNldHRpbmdzJywgYXN5bmMgKCkgPT4ge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJy52c2NvZGUnLCAnc2V0dGluZ3MuanNvbicpO1xuICAgICAgY29uc3QgZXhpc3RpbmdDb250ZW50ID0gYXdhaXQgZnMucHJvbWlzZXMucmVhZEZpbGUoZmlsZVBhdGgsICd1dGY4Jyk7XG4gICAgICBsZXQgc2V0dGluZ3MgPSBKU09OLnBhcnNlKGV4aXN0aW5nQ29udGVudCkgYXMgb2JqZWN0O1xuICAgICAgZm9yIChjb25zdCBleGNsdWRlRmlsZVBhdHRlcm4gb2YgZXhjbHVkZUZpbGVQYXR0ZXJucykge1xuICAgICAgICBzZXR0aW5ncyA9IG1lcmdlLmFsbChbc2V0dGluZ3MsIGV4Y2x1ZGVTZXR0aW5nKGV4Y2x1ZGVGaWxlUGF0dGVybildKTtcbiAgICAgIH1cbiAgICAgIGlmIChjb25maWcuZG9lc0NvbnRhaW5Qb2V0cnlMb2NrIHx8IGNvbmZpZy5kb2VzQ29udGFpblV2TG9jaykge1xuICAgICAgICBzZXR0aW5ncyA9IG1lcmdlLmFsbChbc2V0dGluZ3MsIGV4Y2x1ZGVTZXR0aW5nKCcqKi8udmVudi8qKicpXSk7XG4gICAgICB9XG4gICAgICBpZiAoY29uZmlnLmRlcGVuZGluZy5uZXh0KSB7XG4gICAgICAgIHNldHRpbmdzID0gbWVyZ2UuYWxsKFtzZXR0aW5ncywgZXhjbHVkZVNldHRpbmcoJyoqLy5uZXh0LyoqJyldKTtcbiAgICAgIH1cbiAgICAgIC8vIExMTeOBq+OCiOOCi3ZpYmUgY29kaW5n44Gn44Gv44CB6Ieq5YuV44OV44Kp44O844Oe44OD44OI44KE44Kz44O844OJ44Ki44Kv44K344On44Oz44KS54Sh5Yq55YyW44GZ44KL44GT44Go44GnXG4gICAgICAvLyDnlJ/miJDjgZXjgozjgZ/jgrPjg7zjg4njga7lhYPjga7lvaLlvI/jgpLntq3mjIHjgafjgY3jgotcbiAgICAgIGlmICgnZWRpdG9yLmNvZGVBY3Rpb25zT25TYXZlJyBpbiBzZXR0aW5ncykge1xuICAgICAgICBkZWxldGUgc2V0dGluZ3NbJ2VkaXRvci5jb2RlQWN0aW9uc09uU2F2ZSddO1xuICAgICAgfVxuICAgICAgaWYgKCdlZGl0b3IuZm9ybWF0T25TYXZlJyBpbiBzZXR0aW5ncykge1xuICAgICAgICBkZWxldGUgc2V0dGluZ3NbJ2VkaXRvci5mb3JtYXRPblNhdmUnXTtcbiAgICAgIH1cbiAgICAgIHNvcnRLZXlzKHNldHRpbmdzIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KTtcbiAgICAgIGNvbnN0IG5ld0NvbnRlbnQgPSBKU09OLnN0cmluZ2lmeShzZXR0aW5ncywgdW5kZWZpbmVkLCAyKTtcbiAgICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiBmc1V0aWwuZ2VuZXJhdGVGaWxlKGZpbGVQYXRoLCBuZXdDb250ZW50KSk7XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBkbyBub3RoaW5nXG4gICAgfVxuICB9KTtcbn1cblxuZnVuY3Rpb24gZXhjbHVkZVNldHRpbmcoZXhjbHVkZUZpbGVQYXR0ZXJuOiBzdHJpbmcpOiBvYmplY3Qge1xuICByZXR1cm4ge1xuICAgICdmaWxlcy53YXRjaGVyRXhjbHVkZSc6IHtcbiAgICAgIFtleGNsdWRlRmlsZVBhdHRlcm5dOiB0cnVlLFxuICAgIH0sXG4gIH07XG59XG4iLCIvLyBveGxpbnQtZGlzYWJsZSBlc2xpbnQtcGx1Z2luLWltcG9ydC9uby1uYW1lZC1hcy1kZWZhdWx0LW1lbWJlciAtLSBOYW1lc3BhY2UgWUFNTCBjYWxscyBtYWtlIGxvYWQvZHVtcCB1c2FnZSBjbGVhcmVyLlxuaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHR5cGUgeyBDb25maWd1cmF0aW9uVmFsdWVNYXAgfSBmcm9tICdAeWFybnBrZy9jb3JlJztcbmltcG9ydCB5YW1sIGZyb20gJ2pzLXlhbWwnO1xuaW1wb3J0IHNlbXZlciBmcm9tICdzZW12ZXInO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcbmltcG9ydCB7IHNwYXduU3luYywgc3Bhd25TeW5jQW5kUmV0dXJuU3Rkb3V0IH0gZnJvbSAnLi4vdXRpbHMvc3Bhd25VdGlsLmpzJztcblxudHlwZSBTZXR0aW5ncyA9IHtcbiAgYXBwcm92ZWRHaXRSZXBvc2l0b3JpZXM/OiBzdHJpbmdbXTtcbiAgZGVmYXVsdFNlbXZlclJhbmdlUHJlZml4OiBzdHJpbmc7XG4gIG5tTW9kZTogc3RyaW5nO1xuICBub2RlTGlua2VyOiBzdHJpbmc7XG4gIG5wbU1pbmltYWxBZ2VHYXRlPzogc3RyaW5nO1xuICBucG1QcmVhcHByb3ZlZFBhY2thZ2VzPzogc3RyaW5nW107XG4gIHBsdWdpbnM/OiBQbHVnaW5bXTtcbn0gJiBQYXJ0aWFsPENvbmZpZ3VyYXRpb25WYWx1ZU1hcD47XG5cbmludGVyZmFjZSBQbHVnaW4ge1xuICBjaGVja3N1bTogc3RyaW5nO1xuICBwYXRoOiBzdHJpbmc7XG4gIHNwZWM6IHN0cmluZztcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlWWFybnJjWW1sKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2dlbmVyYXRlWWFybnJjWW1sJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IHlhcm5yY1ltbFBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICcueWFybnJjLnltbCcpO1xuICAgIGlmIChjb25maWcuaXNCdW4pIHtcbiAgICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiBmcy5wcm9taXNlcy5ybSh5YXJucmNZbWxQYXRoLCB7IGZvcmNlOiB0cnVlIH0pKTtcbiAgICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PlxuICAgICAgICBmcy5wcm9taXNlcy5ybShwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICcueWFybicpLCB7IGZvcmNlOiB0cnVlLCByZWN1cnNpdmU6IHRydWUgfSlcbiAgICAgICk7XG4gICAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT5cbiAgICAgICAgZnMucHJvbWlzZXMucm0ocGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAneWFybi5sb2NrJyksIHsgZm9yY2U6IHRydWUsIHJlY3Vyc2l2ZTogdHJ1ZSB9KVxuICAgICAgKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBjdXJyZW50VmVyc2lvbiA9IHNwYXduU3luY0FuZFJldHVyblN0ZG91dCgneWFybicsIFsnLS12ZXJzaW9uJ10sIGNvbmZpZy5kaXJQYXRoKTtcbiAgICBjb25zdCBsYXRlc3RWZXJzaW9uID0gZ2V0TGF0ZXN0VmVyc2lvbignQHlhcm5wa2cvY2xpJywgY29uZmlnLmRpclBhdGgpO1xuICAgIGlmIChpc05ld2VyVmVyc2lvbihsYXRlc3RWZXJzaW9uLCBjdXJyZW50VmVyc2lvbikpIHtcbiAgICAgIHNwYXduU3luYygneWFybicsIFsnc2V0JywgJ3ZlcnNpb24nLCBsYXRlc3RWZXJzaW9uXSwgY29uZmlnLmRpclBhdGgsIDEpO1xuICAgIH1cblxuICAgIGNvbnN0IHJlbGVhc2VzUGF0aCA9IHBhdGguam9pbihjb25maWcuZGlyUGF0aCwgJy55YXJuJywgJ3JlbGVhc2VzJyk7XG4gICAgYXdhaXQgZnMucHJvbWlzZXMubWtkaXIocmVsZWFzZXNQYXRoLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgICBmb3IgKGNvbnN0IGZpbGUgb2YgYXdhaXQgZnMucHJvbWlzZXMucmVhZGRpcihyZWxlYXNlc1BhdGgpKSB7XG4gICAgICBpZiAoZmlsZS5zdGFydHNXaXRoKCd5YXJuLScpICYmICFmaWxlLnN0YXJ0c1dpdGgoYHlhcm4tJHtsYXRlc3RWZXJzaW9ufS5gKSkge1xuICAgICAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnMucHJvbWlzZXMucm0ocGF0aC5qb2luKHJlbGVhc2VzUGF0aCwgZmlsZSkpKTtcbiAgICAgICAgY29uc29sZS5sb2coJ1JlbW92ZWQnLCBwYXRoLmpvaW4ocmVsZWFzZXNQYXRoLCBmaWxlKSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgeWFybnJjUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJy55YXJucmMnKTtcbiAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnMucHJvbWlzZXMucm0oeWFybnJjUGF0aCwgeyBmb3JjZTogdHJ1ZSB9KSk7XG5cbiAgICBsZXQgc2V0dGluZ3MgPSB7fSBhcyBTZXR0aW5ncztcbiAgICB0cnkge1xuICAgICAgc2V0dGluZ3MgPSAoeWFtbC5sb2FkKGF3YWl0IGZzLnByb21pc2VzLnJlYWRGaWxlKHlhcm5yY1ltbFBhdGgsICd1dGY4JykpIGFzIFNldHRpbmdzIHwgdW5kZWZpbmVkKSA/PyBzZXR0aW5ncztcbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIGRvIG5vdGhpbmdcbiAgICB9XG4gICAgc2V0dGluZ3MuZGVmYXVsdFNlbXZlclJhbmdlUHJlZml4ID0gJyc7XG4gICAgc2V0dGluZ3Mubm9kZUxpbmtlciA9ICdub2RlLW1vZHVsZXMnO1xuICAgIHNldHRpbmdzLm5tTW9kZSA9ICdoYXJkbGlua3MtZ2xvYmFsJztcbiAgICBzZXR0aW5ncy5ucG1NaW5pbWFsQWdlR2F0ZSA9ICc1ZCc7XG4gICAgc2V0dGluZ3MuYXBwcm92ZWRHaXRSZXBvc2l0b3JpZXMgPSBbXG4gICAgICAvLyBZYXJuIDQuMTQgYmxvY2tzIGdpdCBkZXBlbmRlbmNpZXMgdW5sZXNzIHRoZSByZXBvc2l0b3J5IFVSTCBpcyBleHBsaWNpdGx5IGFsbG93ZWQuXG4gICAgICAnaHR0cHM6Ly9naXRodWIuY29tL1dpbGxCb29zdGVyTGFiLyouZ2l0JyxcbiAgICAgICdzc2g6Ly9naXRAZ2l0aHViLmNvbS9XaWxsQm9vc3RlckxhYi8qLmdpdCcsXG4gICAgXTtcbiAgICBzZXR0aW5ncy5ucG1QcmVhcHByb3ZlZFBhY2thZ2VzID0gW1xuICAgICAgLy8gLS0tLS0tLS0tLSBTVEFSVDogV2UgYmVsaWV2ZSBvdXIgcGFja2FnZXMgYXJlIHNhZmUgLS0tLS0tLS0tLVxuICAgICAgJ0BleGVyY29kZS8qJyxcbiAgICAgICdAd2lsbGJvb3N0ZXIvKicsXG4gICAgICAnYWdlbnQtcnVudGltZS1raXQnLFxuICAgICAgJ2F0LWRlY29yYXRvcnMnLFxuICAgICAgJ2J1aWxkLXRzJyxcbiAgICAgICdnZW4taTE4bi10cycsXG4gICAgICAnb25lLXdheS1naXQtc3luYycsXG4gICAgICAvLyAtLS0tLS0tLS0tIEVORDogV2UgYmVsaWV2ZSBvdXIgcGFja2FnZXMgYXJlIHNhZmUgLS0tLS0tLS0tLVxuXG4gICAgICAvLyBUbyBkZWFsIHdpdGggQ1ZFIGxpa2UgaHR0cHM6Ly9uZXh0anMub3JnL2Jsb2cvQ1ZFLTIwMjUtNjY0NzhcbiAgICAgICduZXh0JyxcbiAgICAgICdAbmV4dC8qJyxcbiAgICAgICdAdHlwZXNjcmlwdC8qJyxcbiAgICAgICdAb3hmbXQvKicsXG4gICAgICAnQG94bGludC8qJyxcbiAgICAgICdAb3hsaW50LXRzZ29saW50LyonLFxuICAgICAgJ294Zm10JyxcbiAgICAgICdveGxpbnQnLFxuICAgICAgJ294bGludC10c2dvbGludCcsXG4gICAgICAncmVhY3QnLFxuICAgICAgJ3JlYWN0LWRvbScsXG4gICAgXTtcbiAgICBkZWxldGUgc2V0dGluZ3MuY29tcHJlc3Npb25MZXZlbDtcbiAgICBpZiAoc2V0dGluZ3MuaW5qZWN0RW52aXJvbm1lbnRGaWxlcz8ubGVuZ3RoID09PSAwKSB7XG4gICAgICBkZWxldGUgc2V0dGluZ3MuaW5qZWN0RW52aXJvbm1lbnRGaWxlcztcbiAgICB9XG4gICAgLy8gY2YuIGh0dHBzOi8vZ2l0aHViLmNvbS95YXJucGtnL2JlcnJ5L3B1bGwvNDY5OFxuICAgIHNldHRpbmdzLmVuYWJsZUdsb2JhbENhY2hlID0gdHJ1ZTtcbiAgICBjb25zdCBvcmlnaW5hbExlbmd0aCA9IHNldHRpbmdzLnBsdWdpbnM/Lmxlbmd0aCA/PyAwO1xuICAgIHNldHRpbmdzLnBsdWdpbnMgPSBzZXR0aW5ncy5wbHVnaW5zPy5maWx0ZXIoKHApID0+IHAucGF0aCAhPT0gJy55YXJuL3BsdWdpbnMvdW5kZWZpbmVkLmNqcycpID8/IFtdO1xuICAgIGlmIChzZXR0aW5ncy5wbHVnaW5zLmxlbmd0aCAhPT0gb3JpZ2luYWxMZW5ndGgpIHtcbiAgICAgIGNvbnN0IHBsdWdpblBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICcueWFybicsICdwbHVnaW5zJywgJ3VuZGVmaW5lZC5janMnKTtcbiAgICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiBmcy5wcm9taXNlcy5ybShwbHVnaW5QYXRoLCB7IGZvcmNlOiB0cnVlIH0pKTtcbiAgICB9XG4gICAgaWYgKHNldHRpbmdzLnBsdWdpbnMubGVuZ3RoID09PSAwKSB7XG4gICAgICBkZWxldGUgc2V0dGluZ3MucGx1Z2lucztcbiAgICB9XG4gICAgYXdhaXQgZnMucHJvbWlzZXMud3JpdGVGaWxlKHlhcm5yY1ltbFBhdGgsIHlhbWwuZHVtcChzZXR0aW5ncywgeyBsaW5lV2lkdGg6IC0xIH0pKTtcblxuICAgIHNwYXduU3luYygneWFybicsIFsnZGx4JywgJ3lhcm4tcGx1Z2luLWF1dG8taW5zdGFsbCddLCBjb25maWcuZGlyUGF0aCk7XG4gICAgLy8gVGhlIHRhcmdldCByZXBvIG1heSBub3QgaGF2ZSBwcmV0dGllciBpbnN0YWxsZWQgeWV0LCBhbmQgeWFybi1wbHVnaW4tYXV0by1pbnN0YWxsIGVkaXRzIHRoaXMgZmlsZSBhZnRlciBqcy15YW1sLlxuICAgIHNwYXduU3luYygneWFybicsIGdldFlhcm5yY1ByZXR0aWVyQXJncyhjb25maWcuZGlyUGF0aCwgeWFybnJjWW1sUGF0aCksIGNvbmZpZy5kaXJQYXRoKTtcbiAgfSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRZYXJucmNQcmV0dGllckFyZ3MoZGlyUGF0aDogc3RyaW5nLCB5YXJucmNZbWxQYXRoOiBzdHJpbmcpOiBzdHJpbmdbXSB7XG4gIHJldHVybiBbJ2RseCcsICdwcmV0dGllcicsICctLW5vLWNvbmZpZycsICctLXdyaXRlJywgcGF0aC5yZWxhdGl2ZShkaXJQYXRoLCB5YXJucmNZbWxQYXRoKV07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRMYXRlc3RWZXJzaW9uKHBhY2thZ2VOYW1lOiBzdHJpbmcsIGRpclBhdGg6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiBzcGF3blN5bmNBbmRSZXR1cm5TdGRvdXQoJ25wbScsIFsnc2hvdycsIHBhY2thZ2VOYW1lLCAndmVyc2lvbiddLCBkaXJQYXRoKSB8fCAnMC4wLjAnO1xufVxuXG5mdW5jdGlvbiBpc05ld2VyVmVyc2lvbihuZXdWZXJzaW9uOiBzdHJpbmcsIG9sZFZlcnNpb246IHN0cmluZyk6IGJvb2xlYW4ge1xuICBjb25zdCB2YWxpZE5ld1ZlcnNpb24gPSBzZW12ZXIudmFsaWQobmV3VmVyc2lvbik7XG4gIGlmICghdmFsaWROZXdWZXJzaW9uKSByZXR1cm4gZmFsc2U7XG5cbiAgcmV0dXJuIHNlbXZlci5ndCh2YWxpZE5ld1ZlcnNpb24sIHNlbXZlci52YWxpZChvbGRWZXJzaW9uKSA/PyAnMC4wLjAnKTtcbn1cbiIsImltcG9ydCB0eXBlIHsgT2N0b2tpdCB9IGZyb20gJ0BvY3Rva2l0L2NvcmUnO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBnZXRPY3Rva2l0LCBnaXRIdWJVdGlsLCBoYXNHaXRIdWJUb2tlbiB9IGZyb20gJy4uL3V0aWxzL2dpdGh1YlV0aWwuanMnO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gc2V0dXBMYWJlbHMoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignc2V0dXBMYWJlbHMnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgW293bmVyLCByZXBvXSA9IGdpdEh1YlV0aWwuZ2V0T3JnQW5kTmFtZShjb25maWcucmVwb3NpdG9yeSA/PyAnJyk7XG4gICAgaWYgKCFvd25lciB8fCAhcmVwbykgcmV0dXJuO1xuICAgIGlmIChvd25lciAhPT0gJ1dpbGxCb29zdGVyJyAmJiBvd25lciAhPT0gJ1dpbGxCb29zdGVyTGFiJykgcmV0dXJuO1xuICAgIGlmICghaGFzR2l0SHViVG9rZW4ob3duZXIpKSByZXR1cm47XG5cbiAgICBjb25zdCBvY3Rva2l0ID0gZ2V0T2N0b2tpdChvd25lcik7XG5cbiAgICB0cnkge1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ2QxOiB4LWVhc3kgOmhlZGdlaG9nOicsICdFREU5RkUnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdkMjogZWFzeSA6cmFiYml0MjonLCAnRERENkZFJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAnZDM6IG1lZGl1bSA6b3g6JywgJ0M0QjVGRCcpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ2Q0OiBoYXJkIDpzcXVpZDonLCAnQTc4QkZBJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAnZDU6IHgtaGFyZCA6d2hhbGUyOicsICc4QjVDRjYnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdwMTogY3JpdGljYWwgOmZpcmU6OmZpcmU6OmZpcmU6JywgJ0VGNDQ0NCcpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ3AyOiB1cmdlbnQgOmZpcmU6OmZpcmU6JywgJ0Y4NzE3MScpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ3AzOiBpbXBvcnRhbnQgOmZpcmU6JywgJ0ZDQTVBNScpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ3A0OiBuaWNlIHRvIGhhdmUgOmRyb3BsZXQ6JywgJ0ZFQ0FDQScpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ3I6IGJsaXR6JywgJzUzMDBiYycpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ3I6IGZpcmViYXNlJywgJ2ZmY2EyOCcpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ3I6IHByaXNtYScsICcwYzM0NGInKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdyOiByZWFjdCcsICc2MWRhZmInKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdyOiBzdmVsdGUnLCAnZmYzZTAwJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAncjogc2VtYW50aWMtcmVsZWFzZScsICc0OTQ5NDknKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdyZWFkeSA6cm9ja2V0OicsICcyMkM1NUUnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdyZXZpZXcgcmVxdWVzdGVkIDptYWc6JywgJ0ZCQ0EwNCcpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ3JlbGVhc2VkIDpib29rbWFyazonLCAnNjM2NkYxJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAnczogMC41aCA6Y2xvY2sxMjMwOicsICdGM0Y0RjYnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdzOiAxaCA6Y2xvY2sxOicsICdFNUU3RUInKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdzOiAyaCA6Y2xvY2syOicsICdEMUQ1REInKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdzOiAzaCA6Y2xvY2szOicsICc5Q0EzQUYnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdzOiA1aCA6Y2xvY2s1OicsICc2QjcyODAnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdzOiA4aCA6Y2xvY2s4OicsICc0QjU1NjMnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdzOiAxM2ggOmNsb2NrMTonLCAnMzc0MTUxJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAndDogYnVpbGQgOmhhbW1lcjonLCAnQkZEQkZFJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAndDogY2hvcmUgOmJyb29tOicsICdCRkRCRkUnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICd0OiBjaSA6Y29uc3RydWN0aW9uX3dvcmtlcjonLCAnQkZEQkZFJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAndDogZG9jcyA6bWVtbzonLCAnQkZEQkZFJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAndDogZmVhdCA6c3BhcmtsZXM6JywgJ0JGREJGRScpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ3Q6IGZpeCA6YnVnOicsICdCRkRCRkUnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICd0OiBwZXJmIDp6YXA6JywgJ0JGREJGRScpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ3Q6IHJlZmFjdG9yIDpyZWN5Y2xlOicsICdCRkRCRkUnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICd0OiBzdHlsZSA6bGlwc3RpY2s6JywgJ0JGREJGRScpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ3Q6IHRlc3QgOnRlc3RfdHViZTonLCAnQkZEQkZFJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAncHJvamVjdCcsICcyNDI5MkYnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdmb2N1c2VkIDpkYXJ0OicsICcyMkM1NUUnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdnZW4tcHItYWxsIDpyb2JvdDonLCAnMDBCNEQ4Jyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAnZ2VuLXByLWNsYXVkZSA6cm9ib3Q6JywgJzAwQjREOCcpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ2dlbi1wci1jb2RleCA6cm9ib3Q6JywgJzAwQjREOCcpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ2dlbi1wci1nZW1pbmkgOnJvYm90OicsICcwMEI0RDgnKTtcblxuICAgICAgYXdhaXQgZGVsZXRlTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdidWcnKTtcbiAgICAgIGF3YWl0IGRlbGV0ZUxhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAnZG9jdW1lbnRhdGlvbicpO1xuICAgICAgYXdhaXQgZGVsZXRlTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdkdXBsaWNhdGUnKTtcbiAgICAgIGF3YWl0IGRlbGV0ZUxhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAnZW5oYW5jZW1lbnQnKTtcbiAgICAgIGF3YWl0IGRlbGV0ZUxhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAnZ29vZCBmaXJzdCBpc3N1ZScpO1xuICAgICAgYXdhaXQgZGVsZXRlTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdoZWxwIHdhbnRlZCcpO1xuICAgICAgYXdhaXQgZGVsZXRlTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdpbnZhbGlkJyk7XG4gICAgICBhd2FpdCBkZWxldGVMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ3F1ZXN0aW9uJyk7XG4gICAgICBhd2FpdCBkZWxldGVMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ3dvbnRmaXgnKTtcblxuICAgICAgYXdhaXQgZGVsZXRlTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdyZWFkeScpO1xuICAgICAgYXdhaXQgZGVsZXRlTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdyZXZpZXcgcmVxdWVzdGVkJyk7XG4gICAgICBhd2FpdCBkZWxldGVMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ3JlbGVhc2VkJyk7XG4gICAgICBhd2FpdCBkZWxldGVMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ3NlbWFudGljLXJlbGVhc2UnKTtcbiAgICAgIGF3YWl0IGRlbGV0ZUxhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAnbGxtLXByIDpyb2JvdDonKTtcbiAgICAgIGF3YWl0IGRlbGV0ZUxhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAnYWktcHIgOnJvYm90OicpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBjb25zb2xlLndhcm4oJ1NraXAgc2V0dXBMYWJlbHMgZHVlIHRvOicsIChlcnJvciBhcyBFcnJvciB8IHVuZGVmaW5lZCk/LnN0YWNrID8/IGVycm9yKTtcbiAgICB9XG4gIH0pO1xufVxuXG5hc3luYyBmdW5jdGlvbiBzZXR1cExhYmVsKG9jdG9raXQ6IE9jdG9raXQsIG93bmVyOiBzdHJpbmcsIHJlcG86IHN0cmluZywgbmFtZTogc3RyaW5nLCBjb2xvcjogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gIHRyeSB7XG4gICAgLy8gSXNzdWVzIHBlcm1pc3Npb25cbiAgICBhd2FpdCBvY3Rva2l0LnJlcXVlc3QoJ1BPU1QgL3JlcG9zL3tvd25lcn0ve3JlcG99L2xhYmVscycsIHtcbiAgICAgIG93bmVyLFxuICAgICAgcmVwbyxcbiAgICAgIG5hbWUsXG4gICAgICBjb2xvcixcbiAgICB9KTtcbiAgfSBjYXRjaCB7XG4gICAgLy8gSXNzdWVzIHBlcm1pc3Npb25cbiAgICBhd2FpdCBvY3Rva2l0LnJlcXVlc3QoJ1BBVENIIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9sYWJlbHMve25hbWV9Jywge1xuICAgICAgb3duZXIsXG4gICAgICByZXBvLFxuICAgICAgbmFtZSxcbiAgICAgIGNvbG9yLFxuICAgIH0pO1xuICB9XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGRlbGV0ZUxhYmVsKG9jdG9raXQ6IE9jdG9raXQsIG93bmVyOiBzdHJpbmcsIHJlcG86IHN0cmluZywgbmFtZTogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gIHRyeSB7XG4gICAgLy8gSXNzdWVzIHBlcm1pc3Npb25cbiAgICBhd2FpdCBvY3Rva2l0LnJlcXVlc3QoJ0RFTEVURSAvcmVwb3Mve293bmVyfS97cmVwb30vbGFiZWxzL3tuYW1lfScsIHtcbiAgICAgIG93bmVyLFxuICAgICAgcmVwbyxcbiAgICAgIG5hbWUsXG4gICAgfSk7XG4gIH0gY2F0Y2gge1xuICAgIC8vIGRvIG5vdGhpbmdcbiAgfVxufVxuIiwiaW1wb3J0IHsgY3JlYXRlUmVxdWlyZSB9IGZyb20gJ25vZGU6bW9kdWxlJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCBkb3RlbnYgZnJvbSAnZG90ZW52JztcbmltcG9ydCB0eXBlIHNvZGl1bU1vZHVsZSBmcm9tICdsaWJzb2RpdW0td3JhcHBlcnMnO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHsgb3B0aW9ucyB9IGZyb20gJy4uL29wdGlvbnMuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBnZXRPY3Rva2l0LCBnaXRIdWJVdGlsLCBoYXNHaXRIdWJUb2tlbiB9IGZyb20gJy4uL3V0aWxzL2dpdGh1YlV0aWwuanMnO1xuXG5jb25zdCBERVBSRUNBVEVEX1NFQ1JFVF9OQU1FUyA9IFsnUkVBRFlfRElTQ09SRF9XRUJIT09LX1VSTCcsICdHSF9CT1RfUEFUJywgJ1BVQkxJQ19HSF9CT1RfUEFUJ107XG5jb25zdCByZXF1aXJlID0gY3JlYXRlUmVxdWlyZShpbXBvcnQubWV0YS51cmwpO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gc2V0dXBTZWNyZXRzKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ3NldHVwU2VjcmV0cycsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBbb3duZXIsIHJlcG9dID0gZ2l0SHViVXRpbC5nZXRPcmdBbmROYW1lKGNvbmZpZy5yZXBvc2l0b3J5ID8/ICcnKTtcbiAgICBpZiAoIW93bmVyIHx8ICFyZXBvIHx8IG93bmVyICE9PSAnV2lsbEJvb3N0ZXJMYWInKSByZXR1cm47XG4gICAgaWYgKCFoYXNHaXRIdWJUb2tlbihvd25lcikgfHwgIW9wdGlvbnMuZG9lc1VwbG9hZEVudlZhcnMpIHJldHVybjtcblxuICAgIGNvbnN0IHBhcnNlZCA9IGRvdGVudi5jb25maWcoeyBwYXRoOiBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICcuZW52JykgfSkucGFyc2VkID8/IHt9O1xuICAgIGlmIChPYmplY3Qua2V5cyhwYXJzZWQpLmxlbmd0aCA9PT0gMCkgcmV0dXJuO1xuXG4gICAgY29uc3Qgb2N0b2tpdCA9IGdldE9jdG9raXQob3duZXIpO1xuXG4gICAgdHJ5IHtcbiAgICAgIGZvciAoY29uc3Qgc2VjcmV0TmFtZSBvZiBERVBSRUNBVEVEX1NFQ1JFVF9OQU1FUykge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIC8vIFJlcXVpcmVzIFNlY3JldHMgcGVybWlzc2lvblxuICAgICAgICAgIGF3YWl0IG9jdG9raXQucmVxdWVzdCgnREVMRVRFIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9hY3Rpb25zL3NlY3JldHMve3NlY3JldF9uYW1lfScsIHtcbiAgICAgICAgICAgIG93bmVyLFxuICAgICAgICAgICAgcmVwbyxcbiAgICAgICAgICAgIHNlY3JldF9uYW1lOiBzZWNyZXROYW1lLFxuICAgICAgICAgIH0pO1xuICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICAvLyBkbyBub3RoaW5nXG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gUmVxdWlyZXMgU2VjcmV0cyBwZXJtaXNzaW9uXG4gICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IG9jdG9raXQucmVxdWVzdCgnR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9hY3Rpb25zL3NlY3JldHMvcHVibGljLWtleScsIHtcbiAgICAgICAgb3duZXIsXG4gICAgICAgIHJlcG8sXG4gICAgICB9KTtcbiAgICAgIGNvbnN0IHsga2V5LCBrZXlfaWQ6IGtleUlkIH0gPSByZXNwb25zZS5kYXRhO1xuXG4gICAgICBjb25zdCBzb2RpdW0gPSBnZXRTb2RpdW0oKTtcbiAgICAgIGF3YWl0IHNvZGl1bS5yZWFkeTtcblxuICAgICAgZm9yIChjb25zdCBbbmFtZSwgc2VjcmV0XSBvZiBPYmplY3QuZW50cmllcyhwYXJzZWQpKSB7XG4gICAgICAgIGlmIChcbiAgICAgICAgICBuYW1lID09PSAnR0hfQk9UX1BBVCcgfHxcbiAgICAgICAgICBuYW1lID09PSAnR0hfQk9UX1BBVF9GT1JfV0lMTEJPT1NURVInIHx8XG4gICAgICAgICAgbmFtZSA9PT0gJ0dIX0JPVF9QQVRfRk9SX1dJTExCT09TVEVSTEFCJ1xuICAgICAgICApIHtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIENvbnZlcnQgU2VjcmV0ICYgQmFzZTY0IGtleSB0byBVaW50OEFycmF5LlxuICAgICAgICBjb25zdCByYXdLZXkgPSBzb2RpdW0uZnJvbV9iYXNlNjQoa2V5LCBzb2RpdW0uYmFzZTY0X3ZhcmlhbnRzLk9SSUdJTkFMKTtcbiAgICAgICAgY29uc3QgcmF3U2VjID0gc29kaXVtLmZyb21fc3RyaW5nKHNlY3JldCk7XG5cbiAgICAgICAgLy8gRW5jcnlwdCB0aGUgc2VjcmV0IHVzaW5nIExpYlNvZGl1bVxuICAgICAgICBjb25zdCBlbmNCeXRlcyA9IHNvZGl1bS5jcnlwdG9fYm94X3NlYWwocmF3U2VjLCByYXdLZXkpO1xuXG4gICAgICAgIC8vIENvbnZlcnQgZW5jcnlwdGVkIFVpbnQ4QXJyYXkgdG8gQmFzZTY0XG4gICAgICAgIGNvbnN0IGVuY0Jhc2U2NCA9IHNvZGl1bS50b19iYXNlNjQoZW5jQnl0ZXMsIHNvZGl1bS5iYXNlNjRfdmFyaWFudHMuT1JJR0lOQUwpO1xuXG4gICAgICAgIC8vIFJlcXVpcmVzIFNlY3JldHMgcGVybWlzc2lvblxuICAgICAgICBhd2FpdCBvY3Rva2l0LnJlcXVlc3QoJ1BVVCAvcmVwb3Mve293bmVyfS97cmVwb30vYWN0aW9ucy9zZWNyZXRzL3tzZWNyZXRfbmFtZX0nLCB7XG4gICAgICAgICAgb3duZXIsXG4gICAgICAgICAgcmVwbyxcbiAgICAgICAgICBzZWNyZXRfbmFtZTogbmFtZSxcbiAgICAgICAgICBlbmNyeXB0ZWRfdmFsdWU6IGVuY0Jhc2U2NCxcbiAgICAgICAgICBrZXlfaWQ6IGtleUlkLFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgY29uc29sZS53YXJuKCdTa2lwIHNldHVwU2VjcmV0cyBkdWUgdG86JywgKGVycm9yIGFzIEVycm9yIHwgdW5kZWZpbmVkKT8uc3RhY2sgPz8gZXJyb3IpO1xuICAgIH1cbiAgfSk7XG59XG5cbmZ1bmN0aW9uIGdldFNvZGl1bSgpOiB0eXBlb2Ygc29kaXVtTW9kdWxlIHtcbiAgLy8gbGlic29kaXVtLXdyYXBwZXJzJyBFU00gZW50cnkgY2FuIGJpbmQgdG8gbGlic29kaXVtQDAuOC4zLCB3aG9zZSBkZWZhdWx0XG4gIC8vIGV4cG9ydCBubyBsb25nZXIgZXhwb3NlcyByZWFkeS4gVGhlIENvbW1vbkpTIGVudHJ5IGtlZXBzIHRoZSBBUEkgc2hhcGUuXG4gIHJldHVybiByZXF1aXJlKCdsaWJzb2RpdW0td3JhcHBlcnMnKSBhcyB0eXBlb2Ygc29kaXVtTW9kdWxlO1xufVxuIiwiaW1wb3J0IHsgd2l0aFJldHJ5IH0gZnJvbSAnQHdpbGxib29zdGVyL3NoYXJlZC1saWIvc3JjJztcblxuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBnZXRPY3Rva2l0LCBnaXRIdWJVdGlsLCBoYXNHaXRIdWJUb2tlbiB9IGZyb20gJy4uL3V0aWxzL2dpdGh1YlV0aWwuanMnO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gc2V0dXBHaXRIdWJTZXR0aW5ncyhjb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgW293bmVyLCByZXBvXSA9IGdpdEh1YlV0aWwuZ2V0T3JnQW5kTmFtZShjb25maWcucmVwb3NpdG9yeSA/PyAnJyk7XG4gIGlmICghb3duZXIgfHwgIXJlcG8pIHJldHVybjtcbiAgaWYgKG93bmVyICE9PSAnV2lsbEJvb3N0ZXInICYmIG93bmVyICE9PSAnV2lsbEJvb3N0ZXJMYWInKSByZXR1cm47XG4gIGlmICghaGFzR2l0SHViVG9rZW4ob3duZXIpKSByZXR1cm47XG5cbiAgY29uc3Qgb2N0b2tpdCA9IGdldE9jdG9raXQob3duZXIpO1xuXG4gIC8vIEFkbWluaXN0cmF0aW9uIHBlcm1pc3Npb25cbiAgYXdhaXQgd2l0aFJldHJ5KCgpID0+XG4gICAgb2N0b2tpdC5yZXF1ZXN0KCdQQVRDSCAvcmVwb3Mve293bmVyfS97cmVwb30nLCB7XG4gICAgICBvd25lcixcbiAgICAgIHJlcG8sXG4gICAgICBhbGxvd19hdXRvX21lcmdlOiB0cnVlLFxuICAgICAgYWxsb3dfbWVyZ2VfY29tbWl0OiBmYWxzZSxcbiAgICAgIGFsbG93X3NxdWFzaF9tZXJnZTogdHJ1ZSxcbiAgICAgIGFsbG93X3JlYmFzZV9tZXJnZTogZmFsc2UsXG4gICAgICBhbGxvd191cGRhdGVfYnJhbmNoOiB0cnVlLFxuICAgICAgZGVsZXRlX2JyYW5jaF9vbl9tZXJnZTogdHJ1ZSxcbiAgICAgIHNxdWFzaF9tZXJnZV9jb21taXRfdGl0bGU6ICdQUl9USVRMRScsXG4gICAgICBzcXVhc2hfbWVyZ2VfY29tbWl0X21lc3NhZ2U6ICdCTEFOSycsXG4gICAgICBoZWFkZXJzOiB7XG4gICAgICAgICdYLUdpdEh1Yi1BcGktVmVyc2lvbic6ICcyMDIyLTExLTI4JyxcbiAgICAgIH0sXG4gICAgICAuLi4oY29uZmlnLnJlcG9zaXRvcnk/LnN0YXJ0c1dpdGgoJ2dpdGh1YjpXaWxsQm9vc3Rlci8nKSA/IHsgYWxsb3dfYXV0b19tZXJnZTogdHJ1ZSB9IDoge30pLFxuICAgIH0pXG4gICk7XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgeyBkaXN0YW5jZSB9IGZyb20gJ2Zhc3Rlc3QtbGV2ZW5zaHRlaW4nO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBmc1V0aWwgfSBmcm9tICcuLi91dGlscy9mc1V0aWwuanMnO1xuaW1wb3J0IHsgcHJvbWlzZVBvb2wgfSBmcm9tICcuLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5cbmNvbnN0IHBhY2thZ2VNYW5hZ2VyUnVuUGxhY2Vob2xkZXIgPSAnX19QTV9SVU5fXyc7XG5cbmNvbnN0IHRlbXBsYXRlcyA9IHtcbiAgJ3B1bGxfcmVxdWVzdF90ZW1wbGF0ZS5tZCc6IGBcbkNsb3NlICM8SXNzdWVOdW1iZXI+XG5cbiMjIFNlbGYgQ2hlY2tcblxuLSBbIF0gSSd2ZSBjb25maXJtZWQgXFxgQWxsIGNoZWNrcyBoYXZlIHBhc3NlZFxcYCBvbiB0aGlzIHBhZ2UuXG4gIC0gUFIgdGl0bGUgZm9sbG93cyBbQW5ndWxhcidzIGNvbW1pdCBtZXNzYWdlIGZvcm1hdF0oaHR0cHM6Ly9naXRodWIuY29tL2FuZ3VsYXIvYW5ndWxhci9ibG9iL21haW4vQ09OVFJJQlVUSU5HLm1kIy1jb21taXQtbWVzc2FnZS1mb3JtYXQpLlxuICAtIFBSIHRpdGxlIGRvZXNuJ3QgaGF2ZSBcXGBXSVA6XFxgLlxuICAtIFRoZSB0ZXN0IGNvbW1hbmQgKGUuZy4sIFxcYCR7cGFja2FnZU1hbmFnZXJSdW5QbGFjZWhvbGRlcn0gdGVzdFxcYCkgcGFzc2VkLlxuICAtIFRoZSBsaW50IGNvbW1hbmQgKGUuZy4sIFxcYCR7cGFja2FnZU1hbmFnZXJSdW5QbGFjZWhvbGRlcn0gbGludFxcYCkgcGFzc2VkLlxuICAtIFlvdSBtYXkgbGVhdmUgdGhpcyBib3ggdW5jaGVja2VkIGR1ZSB0byBsb25nIHdvcmtmbG93cy5cbi0gWyBdIEkndmUgcmV2aWV3ZWQgbXkgY2hhbmdlcyBvbiB0aGUgR2l0SHViIGRpZmYgdmlldy5cbi0gWyBdIEkndmUgd3JpdHRlbiB0aGUgc3RlcHMgdG8gdGVzdCBteSBjaGFuZ2VzLlxuLSBbIF0gSSd2ZSBhZGRlZCBzY3JlZW5zaG90cyAoaWYgdGhlIFVJIGNoYW5nZWQpLlxuICAtIFlvdSBtYXkgbGVhdmUgdGhpcyBib3ggdW5jaGVja2VkIGlmIHlvdSBkaWRuJ3QgbW9kaWZ5IHRoZSBVSS5cblxuPCEtLSBQbGVhc2UgYWRkIHNjcmVlbnNob3RzIGlmIHlvdSBtb2RpZnkgdGhlIFVJLlxufCBDdXJyZW50ICAgICAgICAgICAgICAgICAgfCBJbiBjb21pbmcgICAgICAgICAgICAgICAgfFxufCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfFxufCA8aW1nIHNyYz1cIlwiIHdpZHRoPVwiNDAwXCI+IHwgPGltZyBzcmM9XCJcIiB3aWR0aD1cIjQwMFwiPiB8XG4tLT5cblxuPCEtLSBQbGVhc2UgYWRkIHN0ZXBzIHRvIHRlc3QgeW91ciBjaGFuZ2VzLlxuIyMgU3RlcHMgdG8gVGVzdFxuXG4xLiBPcGVuIGh0dHA6Ly9sb2NhbGhvc3QtZXhlcmNvZGUud2lsbGJvb3N0ZXIubmV0OjMwMDAvamEtSlAvY291cnNlcy9fZXhhbXBsZS9sZXNzb25zL19leGFtcGxlX2FfcGx1c19iL3Byb2JsZW1zL19leGFtcGxlX2FfcGx1c19iIGFmdGVyIGxvZ2luLlxuMi4gU2VsZWN0IHRoZSBsYW5ndWFnZSBcXGBDXFxgLlxuMy4gV3JpdGUgdGhlIGZvbGxvd2luZyBjb2RlOlxuICAgXFxgXFxgXFxgY1xuICAgI2luY2x1ZGUgPHN0ZGlvLmg+XG5cbiAgIGludCBtYWluKHZvaWQpIHtcbiAgICAgaW50IGEsIGI7XG5cbiAgICAgc2NhbmYoXCIlZCAlZFwiLCAmYSwgJmIpO1xuICAgICBwcmludGYoXCIlZFwiLCBhICsgYik7XG4gICAgIHJldHVybiAwO1xuICAgfVxuICAgXFxgXFxgXFxgXG40LiBQdXNoIFxcYFN1Ym1pdFxcYCBidXR0b24uXG41LiAuLi5cbi0tPlxuYC50cmltKCksXG59O1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVHaXRIdWJUZW1wbGF0ZXMoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZ2VuZXJhdGVHaXRIdWJUZW1wbGF0ZXMnLCBhc3luYyAoKSA9PiB7XG4gICAgZm9yIChjb25zdCBbZmlsZU5hbWUsIG5ld0NvbnRlbnRdIG9mIE9iamVjdC5lbnRyaWVzKHRlbXBsYXRlcykpIHtcbiAgICAgIGNvbnN0IGNvbnRlbnQgPSBhcHBseVBhY2thZ2VNYW5hZ2VyVGVtcGxhdGUobmV3Q29udGVudCwgY29uZmlnKTtcbiAgICAgIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnLmdpdGh1YicsIGZpbGVOYW1lKTtcbiAgICAgIGlmIChmcy5leGlzdHNTeW5jKGZpbGVQYXRoKSkge1xuICAgICAgICBjb25zdCBvbGRDb250ZW50ID0gYXdhaXQgZnMucHJvbWlzZXMucmVhZEZpbGUoZmlsZVBhdGgsICd1dGY4Jyk7XG4gICAgICAgIGlmIChkaXN0YW5jZShvbGRDb250ZW50LCBjb250ZW50KSA+IGNvbnRlbnQubGVuZ3RoIC8gMikge1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGF3YWl0IGZzLnByb21pc2VzLm1rZGlyKHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJy5naXRodWInKSwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gICAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnNVdGlsLmdlbmVyYXRlRmlsZShmaWxlUGF0aCwgY29udGVudCkpO1xuICAgIH1cbiAgfSk7XG59XG5cbmZ1bmN0aW9uIGFwcGx5UGFja2FnZU1hbmFnZXJUZW1wbGF0ZSh0ZW1wbGF0ZTogc3RyaW5nLCBjb25maWc6IFBhY2thZ2VDb25maWcpOiBzdHJpbmcge1xuICBjb25zdCBwYWNrYWdlTWFuYWdlckNvbW1hbmQgPSBjb25maWcuaXNCdW4gPyAnYnVuIHJ1bicgOiAneWFybic7XG4gIHJldHVybiB0ZW1wbGF0ZS5yZXBsYWNlQWxsKHBhY2thZ2VNYW5hZ2VyUnVuUGxhY2Vob2xkZXIsIHBhY2thZ2VNYW5hZ2VyQ29tbWFuZCk7XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgZnNwIGZyb20gJ25vZGU6ZnMvcHJvbWlzZXMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IGZnIGZyb20gJ2Zhc3QtZ2xvYic7XG5pbXBvcnQgeyBzaW1wbGVHaXQgfSBmcm9tICdzaW1wbGUtZ2l0JztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUpzb24gfSBmcm9tICd0eXBlLWZlc3QnO1xuaW1wb3J0IHsgeiB9IGZyb20gJ3pvZCc7XG5cbmltcG9ydCB7IGdldE9jdG9raXQsIGdpdEh1YlV0aWwgfSBmcm9tICcuL3V0aWxzL2dpdGh1YlV0aWwuanMnO1xuaW1wb3J0IHsgZ2xvYklnbm9yZSB9IGZyb20gJy4vdXRpbHMvZ2xvYlV0aWwuanMnO1xuXG5leHBvcnQgaW50ZXJmYWNlIFBhY2thZ2VDb25maWcge1xuICBkaXJQYXRoOiBzdHJpbmc7XG4gIGRvY2tlcmZpbGU6IHN0cmluZztcbiAgaXNSb290OiBib29sZWFuO1xuICBpc1B1YmxpY1JlcG86IGJvb2xlYW47XG4gIGlzUmVmZXJyZWRCeU90aGVyUmVwbzogYm9vbGVhbjtcbiAgcmVwb3NpdG9yeT86IHN0cmluZztcbiAgcmVwb0F1dGhvcj86IHN0cmluZztcbiAgcmVwb05hbWU/OiBzdHJpbmc7XG4gIGlzV2lsbEJvb3N0ZXJSZXBvOiBib29sZWFuO1xuICBpc0J1bjogYm9vbGVhbjtcbiAgaXNFc21QYWNrYWdlOiBib29sZWFuO1xuICBpc1dpbGxCb29zdGVyQ29uZmlnczogYm9vbGVhbjtcbiAgLy8gZGVwZW5kZW5jeSBpbmZvcm1hdGlvblxuICBkb2VzQ29udGFpblN1YlBhY2thZ2VKc29uczogYm9vbGVhbjtcbiAgZG9lc0NvbnRhaW5Eb2NrZXJmaWxlOiBib29sZWFuO1xuICBkb2VzQ29udGFpbkdlbWZpbGU6IGJvb2xlYW47XG4gIGRvZXNDb250YWluR29Nb2Q6IGJvb2xlYW47XG4gIGRvZXNDb250YWluUGFja2FnZUpzb246IGJvb2xlYW47XG4gIGRvZXNDb250YWluUG9ldHJ5TG9jazogYm9vbGVhbjtcbiAgZG9lc0NvbnRhaW5VdkxvY2s6IGJvb2xlYW47XG4gIGRvZXNDb250YWluUG9tWG1sOiBib29sZWFuO1xuICBkb2VzQ29udGFpblB1YnNwZWNZYW1sOiBib29sZWFuO1xuICBkb2VzQ29udGFpblRlbXBsYXRlWWFtbDogYm9vbGVhbjtcbiAgZG9lc0NvbnRhaW5Wc2NvZGVTZXR0aW5nc0pzb246IGJvb2xlYW47XG4gIC8vIHNvdXJjZSBjb2RlIGZpbGVzXG4gIGRvZXNDb250YWluSmF2YVNjcmlwdDogYm9vbGVhbjtcbiAgZG9lc0NvbnRhaW5UeXBlU2NyaXB0OiBib29sZWFuO1xuICBkb2VzQ29udGFpbkpzeE9yVHN4OiBib29sZWFuO1xuICBkb2VzQ29udGFpbkphdmE6IGJvb2xlYW47XG4gIGRvZXNDb250YWluSmF2YVNjcmlwdEluUGFja2FnZXM6IGJvb2xlYW47XG4gIGRvZXNDb250YWluVHlwZVNjcmlwdEluUGFja2FnZXM6IGJvb2xlYW47XG4gIGRvZXNDb250YWluSnN4T3JUc3hJblBhY2thZ2VzOiBib29sZWFuO1xuICBkb2VzQ29udGFpbkphdmFJblBhY2thZ2VzOiBib29sZWFuO1xuXG4gIGhhc1N0YXJ0VGVzdFNlcnZlcjogYm9vbGVhbjtcblxuICBkZXBlbmRpbmc6IHtcbiAgICBibGl0ejogYm9vbGVhbjtcbiAgICBmaXJlYmFzZTogYm9vbGVhbjtcbiAgICBnZW5JMThuVHM6IGJvb2xlYW47XG4gICAgbGl0ZXN0cmVhbTogYm9vbGVhbjtcbiAgICBuZXh0OiBib29sZWFuO1xuICAgIHBsYXl3cmlnaHRUZXN0OiBib29sZWFuO1xuICAgIHByaXNtYTogYm9vbGVhbjtcbiAgICBweXJpZ2h0OiBib29sZWFuO1xuICAgIHJlYWN0OiBib29sZWFuO1xuICAgIHJlYWN0TmF0aXZlOiBib29sZWFuO1xuICAgIHNlbWFudGljUmVsZWFzZTogYm9vbGVhbjtcbiAgICBzdG9yeWJvb2s6IGJvb2xlYW47XG4gICAgd2I6IGJvb2xlYW47XG4gIH07XG4gIHJlbGVhc2U6IHtcbiAgICBicmFuY2hlczogc3RyaW5nW107XG4gICAgZ2l0aHViOiBib29sZWFuO1xuICAgIG5wbTogYm9vbGVhbjtcbiAgfTtcbiAgaGFzVmVyc2lvblNldHRpbmdzOiBib29sZWFuO1xuICBwYWNrYWdlSnNvbj86IFBhY2thZ2VKc29uO1xuICB3YmZ5SnNvbj86IFdiZnlKc29uO1xufVxuXG50eXBlIFdiZnlKc29uID0gei5pbmZlcjx0eXBlb2Ygd2JmeUpzb25TY2hlbWE+O1xuXG5jb25zdCB3YmZ5SnNvblNjaGVtYSA9IHoub2JqZWN0KHtcbiAgdHlwb3M6IHpcbiAgICAub2JqZWN0KHtcbiAgICAgIGFsbDogei5yZWNvcmQoei5zdHJpbmcoKSwgei5zdHJpbmcoKSkub3B0aW9uYWwoKSxcbiAgICAgIGRvYzogei5yZWNvcmQoei5zdHJpbmcoKSwgei5zdHJpbmcoKSkub3B0aW9uYWwoKSxcbiAgICAgIHRzOiB6LnJlY29yZCh6LnN0cmluZygpLCB6LnN0cmluZygpKS5vcHRpb25hbCgpLFxuICAgICAgdGV4dDogei5yZWNvcmQoei5zdHJpbmcoKSwgei5zdHJpbmcoKSkub3B0aW9uYWwoKSxcbiAgICB9KVxuICAgIC5vcHRpb25hbCgpLFxufSk7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZXRQYWNrYWdlQ29uZmlnKFxuICBkaXJQYXRoOiBzdHJpbmcsXG4gIHJvb3RDb25maWc/OiBQYWNrYWdlQ29uZmlnXG4pOiBQcm9taXNlPFBhY2thZ2VDb25maWcgfCB1bmRlZmluZWQ+IHtcbiAgY29uc3QgcGFja2FnZUpzb25QYXRoID0gcGF0aC5yZXNvbHZlKGRpclBhdGgsICdwYWNrYWdlLmpzb24nKTtcbiAgdHJ5IHtcbiAgICBjb25zdCBkb2VzQ29udGFpblBhY2thZ2VKc29uID0gZnMuZXhpc3RzU3luYyhwYWNrYWdlSnNvblBhdGgpO1xuICAgIGxldCBkZXBlbmRlbmNpZXM6IFBhY2thZ2VKc29uWydkZXBlbmRlbmNpZXMnXSA9IHt9O1xuICAgIGxldCBkZXZEZXBlbmRlbmNpZXM6IFBhY2thZ2VKc29uWydkZXZEZXBlbmRlbmNpZXMnXSA9IHt9O1xuICAgIGxldCBwYWNrYWdlSnNvbjogUGFja2FnZUpzb24gPSB7fTtcbiAgICBsZXQgZXNtUGFja2FnZSA9IGZhbHNlO1xuICAgIGlmIChkb2VzQ29udGFpblBhY2thZ2VKc29uKSB7XG4gICAgICBjb25zdCBwYWNrYWdlSnNvblRleHQgPSBmcy5yZWFkRmlsZVN5bmMocGFja2FnZUpzb25QYXRoLCAndXRmOCcpO1xuICAgICAgcGFja2FnZUpzb24gPSBKU09OLnBhcnNlKHBhY2thZ2VKc29uVGV4dCkgYXMgUGFja2FnZUpzb247XG4gICAgICBkZXBlbmRlbmNpZXMgPSBwYWNrYWdlSnNvbi5kZXBlbmRlbmNpZXMgPz8ge307XG4gICAgICBkZXZEZXBlbmRlbmNpZXMgPSBwYWNrYWdlSnNvbi5kZXZEZXBlbmRlbmNpZXMgPz8ge307XG4gICAgICBlc21QYWNrYWdlID0gcGFja2FnZUpzb24udHlwZSA9PT0gJ21vZHVsZSc7XG4gICAgfVxuXG4gICAgbGV0IHJlbGVhc2VCcmFuY2hlczogc3RyaW5nW10gPSBbXTtcbiAgICBsZXQgcmVsZWFzZVBsdWdpbnM6IHN0cmluZ1tdID0gW107XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJlbGVhc2VyY0pzb25QYXRoID0gcGF0aC5yZXNvbHZlKGRpclBhdGgsICcucmVsZWFzZXJjLmpzb24nKTtcbiAgICAgIGNvbnN0IGpzb24gPSBKU09OLnBhcnNlKGF3YWl0IGZzcC5yZWFkRmlsZShyZWxlYXNlcmNKc29uUGF0aCwgJ3V0ZjgnKSkgYXNcbiAgICAgICAgfCB7XG4gICAgICAgICAgICBicmFuY2hlczogc3RyaW5nW107XG4gICAgICAgICAgICBwbHVnaW5zPzogc3RyaW5nW11bXTtcbiAgICAgICAgICB9XG4gICAgICAgIHwgdW5kZWZpbmVkO1xuICAgICAgcmVsZWFzZUJyYW5jaGVzID0ganNvbj8uYnJhbmNoZXMgPz8gW107XG4gICAgICByZWxlYXNlUGx1Z2lucyA9IGpzb24/LnBsdWdpbnM/LmZsYXQoKSA/PyBbXTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIGRvIG5vdGhpbmdcbiAgICB9XG5cbiAgICBjb25zdCBpc1Jvb3QgPVxuICAgICAgcGF0aC5iYXNlbmFtZShwYXRoLnJlc29sdmUoZGlyUGF0aCwgJy4uJykpICE9PSAncGFja2FnZXMnIHx8XG4gICAgICAhZnMuZXhpc3RzU3luYyhwYXRoLnJlc29sdmUoZGlyUGF0aCwgJy4uJywgJy4uJywgJ3BhY2thZ2UuanNvbicpKTtcblxuICAgIGxldCByZXBvSW5mbzogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gfCB1bmRlZmluZWQ7XG4gICAgaWYgKGlzUm9vdCkge1xuICAgICAgcmVwb0luZm8gPSBhd2FpdCBmZXRjaFJlcG9JbmZvKGRpclBhdGgsIHBhY2thZ2VKc29uKTtcbiAgICB9XG5cbiAgICBsZXQgaGFzVmVyc2lvblNldHRpbmdzID0gaGFzVmVyc2lvblNldHRpbmdzRmlsZShkaXJQYXRoKTtcbiAgICBmb3IgKGNvbnN0IHByZWZpeCBvZiBbJ2phdmEnLCAnbm9kZScsICdweXRob24nXSkge1xuICAgICAgaWYgKGZzLmV4aXN0c1N5bmMocGF0aC5yZXNvbHZlKGRpclBhdGgsIGAuJHtwcmVmaXh9LXZlcnNpb25gKSkpIHtcbiAgICAgICAgaGFzVmVyc2lvblNldHRpbmdzID0gdHJ1ZTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuXG4gICAgbGV0IGRvY2tlcmZpbGUgPSAnJztcbiAgICB0cnkge1xuICAgICAgZG9ja2VyZmlsZSA9IGF3YWl0IGZzcC5yZWFkRmlsZShwYXRoLnJlc29sdmUoZGlyUGF0aCwgJ0RvY2tlcmZpbGUnKSwgJ3V0ZjgnKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIGRvIG5vdGhpbmdcbiAgICB9XG5cbiAgICAvLyBSZWFkIHdiZnkuanNvblxuICAgIGNvbnN0IHdiZnlKc29uUGF0aCA9IHBhdGgucmVzb2x2ZShkaXJQYXRoLCAnd2JmeS5qc29uJyk7XG4gICAgbGV0IHdiZnlKc29uOiBXYmZ5SnNvbiB8IHVuZGVmaW5lZDtcbiAgICB0cnkge1xuICAgICAgY29uc3Qgd2JmeUpzb25UZXh0ID0gYXdhaXQgZnNwLnJlYWRGaWxlKHdiZnlKc29uUGF0aCwgJ3V0ZjgnKTtcbiAgICAgIHdiZnlKc29uID0gd2JmeUpzb25TY2hlbWEucGFyc2UoSlNPTi5wYXJzZSh3YmZ5SnNvblRleHQpKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIGRvIG5vdGhpbmdcbiAgICB9XG5cbiAgICBjb25zdCByZXBvRnVsbE5hbWUgPSB0eXBlb2YgcmVwb0luZm8/LmZ1bGxfbmFtZSA9PT0gJ3N0cmluZycgPyByZXBvSW5mby5mdWxsX25hbWUgOiB1bmRlZmluZWQ7XG4gICAgbGV0IHJlcG9BdXRob3I6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgICBsZXQgcmVwb05hbWU6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgICBpZiAocmVwb0Z1bGxOYW1lKSB7XG4gICAgICBjb25zdCByZXBvUGFydHMgPSByZXBvRnVsbE5hbWUuc3BsaXQoJy8nKTtcbiAgICAgIGlmIChyZXBvUGFydHMubGVuZ3RoID49IDIpIHtcbiAgICAgICAgcmVwb0F1dGhvciA9IHJlcG9QYXJ0c1swXTtcbiAgICAgICAgcmVwb05hbWUgPSByZXBvUGFydHNbMV07XG4gICAgICB9XG4gICAgfVxuICAgIGNvbnN0IHJlcG9zaXRvcnkgPSByZXBvRnVsbE5hbWUgPyBgZ2l0aHViOiR7cmVwb0Z1bGxOYW1lfWAgOiB1bmRlZmluZWQ7XG4gICAgY29uc3QgY29uZmlnOiBQYWNrYWdlQ29uZmlnID0ge1xuICAgICAgZGlyUGF0aCxcbiAgICAgIGRvY2tlcmZpbGUsXG4gICAgICBpc1Jvb3QsXG4gICAgICBpc1B1YmxpY1JlcG86IHJlcG9JbmZvPy5wcml2YXRlID09PSBmYWxzZSxcbiAgICAgIGlzUmVmZXJyZWRCeU90aGVyUmVwbzogISFwYWNrYWdlSnNvbi5maWxlcyxcbiAgICAgIHJlcG9zaXRvcnksXG4gICAgICByZXBvQXV0aG9yLFxuICAgICAgcmVwb05hbWUsXG4gICAgICBpc1dpbGxCb29zdGVyUmVwbzogQm9vbGVhbihcbiAgICAgICAgcmVwb3NpdG9yeT8uc3RhcnRzV2l0aCgnZ2l0aHViOldpbGxCb29zdGVyLycpIHx8IHJlcG9zaXRvcnk/LnN0YXJ0c1dpdGgoJ2dpdGh1YjpXaWxsQm9vc3RlckxhYi8nKVxuICAgICAgKSxcbiAgICAgIGlzQnVuOiByb290Q29uZmlnPy5pc0J1biB8fCBmcy5leGlzdHNTeW5jKHBhdGguam9pbihkaXJQYXRoLCAnYnVuLmxvY2snKSksXG4gICAgICBpc0VzbVBhY2thZ2U6IGVzbVBhY2thZ2UsXG4gICAgICBpc1dpbGxCb29zdGVyQ29uZmlnczogcGFja2FnZUpzb25QYXRoLmluY2x1ZGVzKCcvd2lsbGJvb3N0ZXItY29uZmlncycpLFxuICAgICAgZG9lc0NvbnRhaW5TdWJQYWNrYWdlSnNvbnM6IGNvbnRhaW5zQW55KCdwYWNrYWdlcy8qKi9wYWNrYWdlLmpzb24nLCBkaXJQYXRoKSxcbiAgICAgIGRvZXNDb250YWluRG9ja2VyZmlsZTogISFkb2NrZXJmaWxlIHx8IGZzLmV4aXN0c1N5bmMocGF0aC5yZXNvbHZlKGRpclBhdGgsICdkb2NrZXItY29tcG9zZS55bWwnKSksXG4gICAgICBkb2VzQ29udGFpbkdlbWZpbGU6IGZzLmV4aXN0c1N5bmMocGF0aC5yZXNvbHZlKGRpclBhdGgsICdHZW1maWxlJykpLFxuICAgICAgZG9lc0NvbnRhaW5Hb01vZDogZnMuZXhpc3RzU3luYyhwYXRoLnJlc29sdmUoZGlyUGF0aCwgJ2dvLm1vZCcpKSxcbiAgICAgIGRvZXNDb250YWluUGFja2FnZUpzb246IGZzLmV4aXN0c1N5bmMocGF0aC5yZXNvbHZlKGRpclBhdGgsICdwYWNrYWdlLmpzb24nKSksXG4gICAgICBkb2VzQ29udGFpblBvZXRyeUxvY2s6IGZzLmV4aXN0c1N5bmMocGF0aC5yZXNvbHZlKGRpclBhdGgsICdwb2V0cnkubG9jaycpKSxcbiAgICAgIGRvZXNDb250YWluVXZMb2NrOiBmcy5leGlzdHNTeW5jKHBhdGgucmVzb2x2ZShkaXJQYXRoLCAndXYubG9jaycpKSxcbiAgICAgIGRvZXNDb250YWluUG9tWG1sOiBmcy5leGlzdHNTeW5jKHBhdGgucmVzb2x2ZShkaXJQYXRoLCAncG9tLnhtbCcpKSxcbiAgICAgIGRvZXNDb250YWluUHVic3BlY1lhbWw6IGZzLmV4aXN0c1N5bmMocGF0aC5yZXNvbHZlKGRpclBhdGgsICdwdWJzcGVjLnlhbWwnKSksXG4gICAgICBkb2VzQ29udGFpblRlbXBsYXRlWWFtbDogZnMuZXhpc3RzU3luYyhwYXRoLnJlc29sdmUoZGlyUGF0aCwgJ3RlbXBsYXRlLnlhbWwnKSksXG4gICAgICBkb2VzQ29udGFpblZzY29kZVNldHRpbmdzSnNvbjogZnMuZXhpc3RzU3luYyhwYXRoLnJlc29sdmUoZGlyUGF0aCwgJy52c2NvZGUnLCAnc2V0dGluZ3MuanNvbicpKSxcbiAgICAgIGRvZXNDb250YWluSmF2YVNjcmlwdDogY29udGFpbnNBbnkoJ3thcHAsc3JjLHRlc3Qsc2NyaXB0c30vKiovKi57Y2pzLG1qcyxqcyxqc3h9JywgZGlyUGF0aCksXG4gICAgICBkb2VzQ29udGFpblR5cGVTY3JpcHQ6IGNvbnRhaW5zQW55KCd7YXBwLHNyYyx0ZXN0LHNjcmlwdHN9LyoqLyoue2N0cyxtdHMsdHMsdHN4fScsIGRpclBhdGgpLFxuICAgICAgZG9lc0NvbnRhaW5Kc3hPclRzeDogY29udGFpbnNBbnkoJ3thcHAsc3JjLHRlc3R9LyoqLyoue3Qsan1zeCcsIGRpclBhdGgpLFxuICAgICAgZG9lc0NvbnRhaW5KYXZhOiBjb250YWluc0FueSgnKiovKi5qYXZhJywgZGlyUGF0aCksXG4gICAgICBkb2VzQ29udGFpbkphdmFTY3JpcHRJblBhY2thZ2VzOiBjb250YWluc0FueSgncGFja2FnZXMvKiove2FwcCxzcmMsdGVzdCxzY3JpcHRzfS8qKi8qLntjanMsbWpzLGpzLGpzeH0nLCBkaXJQYXRoKSxcbiAgICAgIGRvZXNDb250YWluVHlwZVNjcmlwdEluUGFja2FnZXM6IGNvbnRhaW5zQW55KCdwYWNrYWdlcy8qKi97YXBwLHNyYyx0ZXN0LHNjcmlwdHN9LyoqLyoue2N0cyxtdHMsdHMsdHN4fScsIGRpclBhdGgpLFxuICAgICAgZG9lc0NvbnRhaW5Kc3hPclRzeEluUGFja2FnZXM6IGNvbnRhaW5zQW55KCdwYWNrYWdlcy8qKi97YXBwLHNyYyx0ZXN0fS8qKi8qLnt0LGp9c3gnLCBkaXJQYXRoKSxcbiAgICAgIGRvZXNDb250YWluSmF2YUluUGFja2FnZXM6IGNvbnRhaW5zQW55KCdwYWNrYWdlcy8qKi8qLmphdmEnLCBkaXJQYXRoKSxcbiAgICAgIGhhc1N0YXJ0VGVzdFNlcnZlcjogISFwYWNrYWdlSnNvbi5zY3JpcHRzPy5bJ3N0YXJ0LXRlc3Qtc2VydmVyJ10sXG4gICAgICBkZXBlbmRpbmc6IHtcbiAgICAgICAgYmxpdHo6ICEhZGVwZW5kZW5jaWVzLmJsaXR6LFxuICAgICAgICBmaXJlYmFzZTogISFkZXZEZXBlbmRlbmNpZXNbJ2ZpcmViYXNlLXRvb2xzJ10sXG4gICAgICAgIGdlbkkxOG5UczogISFkZXBlbmRlbmNpZXNbJ2dlbi1pMThuLXRzJ10gfHwgISFkZXZEZXBlbmRlbmNpZXNbJ2dlbi1pMThuLXRzJ10sXG4gICAgICAgIGxpdGVzdHJlYW06IGRvY2tlcmZpbGUuaW5jbHVkZXMoJ2luc3RhbGwtbGl0ZXN0cmVhbS5zaCcpLFxuICAgICAgICByZWFjdDogISFkZXBlbmRlbmNpZXMucmVhY3QsXG4gICAgICAgIG5leHQ6ICEhZGVwZW5kZW5jaWVzLm5leHQsXG4gICAgICAgIHBsYXl3cmlnaHRUZXN0OlxuICAgICAgICAgICEhZGVwZW5kZW5jaWVzWydAcGxheXdyaWdodC90ZXN0J10gfHwgISFkZXZEZXBlbmRlbmNpZXNbJ0BwbGF5d3JpZ2h0L3Rlc3QnXSB8fCAhIWRldkRlcGVuZGVuY2llcy5wbGF5d3JpZ2h0LFxuICAgICAgICBwcmlzbWE6ICEhZGVwZW5kZW5jaWVzWydAcHJpc21hL2NsaWVudCddIHx8ICEhZGV2RGVwZW5kZW5jaWVzLnByaXNtYSxcbiAgICAgICAgcHlyaWdodDogISFkZXZEZXBlbmRlbmNpZXMucHlyaWdodCxcbiAgICAgICAgcmVhY3ROYXRpdmU6ICEhZGVwZW5kZW5jaWVzWydyZWFjdC1uYXRpdmUnXSxcbiAgICAgICAgc2VtYW50aWNSZWxlYXNlOiAhIShcbiAgICAgICAgICBkZXZEZXBlbmRlbmNpZXNbJ3NlbWFudGljLXJlbGVhc2UnXSB8fFxuICAgICAgICAgIHJlbGVhc2VCcmFuY2hlcy5sZW5ndGggPiAwIHx8XG4gICAgICAgICAgcmVsZWFzZVBsdWdpbnMubGVuZ3RoID4gMFxuICAgICAgICApLFxuICAgICAgICBzdG9yeWJvb2s6ICEhZGV2RGVwZW5kZW5jaWVzWydAc3Rvcnlib29rL3JlYWN0J10sXG4gICAgICAgIHdiOiAhIWRlcGVuZGVuY2llc1snQHdpbGxib29zdGVyL3diJ10gfHwgISFkZXZEZXBlbmRlbmNpZXNbJ0B3aWxsYm9vc3Rlci93YiddLFxuICAgICAgfSxcbiAgICAgIHJlbGVhc2U6IHtcbiAgICAgICAgYnJhbmNoZXM6IHJlbGVhc2VCcmFuY2hlcyxcbiAgICAgICAgZ2l0aHViOiByZWxlYXNlUGx1Z2lucy5pbmNsdWRlcygnQHNlbWFudGljLXJlbGVhc2UvZ2l0aHViJyksXG4gICAgICAgIG5wbTogcmVsZWFzZVBsdWdpbnMuaW5jbHVkZXMoJ0BzZW1hbnRpYy1yZWxlYXNlL25wbScpLFxuICAgICAgfSxcbiAgICAgIGhhc1ZlcnNpb25TZXR0aW5ncyxcbiAgICAgIHBhY2thZ2VKc29uLFxuICAgICAgd2JmeUpzb24sXG4gICAgfTtcbiAgICBpZiAoXG4gICAgICBjb25maWcuZG9lc0NvbnRhaW5HZW1maWxlIHx8XG4gICAgICBjb25maWcuZG9lc0NvbnRhaW5Hb01vZCB8fFxuICAgICAgY29uZmlnLmRvZXNDb250YWluUGFja2FnZUpzb24gfHxcbiAgICAgIGNvbmZpZy5kb2VzQ29udGFpblBvZXRyeUxvY2sgfHxcbiAgICAgIGNvbmZpZy5kb2VzQ29udGFpblV2TG9jayB8fFxuICAgICAgY29uZmlnLmRvZXNDb250YWluUG9tWG1sIHx8XG4gICAgICBjb25maWcuZG9lc0NvbnRhaW5QdWJzcGVjWWFtbCB8fFxuICAgICAgY29uZmlnLmRvZXNDb250YWluVGVtcGxhdGVZYW1sXG4gICAgKSB7XG4gICAgICByZXR1cm4gY29uZmlnO1xuICAgIH1cbiAgfSBjYXRjaCB7XG4gICAgLy8gZG8gbm90aGluZ1xuICB9XG59XG5cbmZ1bmN0aW9uIGhhc1ZlcnNpb25TZXR0aW5nc0ZpbGUoZGlyUGF0aDogc3RyaW5nKTogYm9vbGVhbiB7XG4gIGNvbnN0IGN1cnJlbnQgPSBwYXRoLnJlc29sdmUoZGlyUGF0aCk7XG4gIHJldHVybiAoXG4gICAgZnMuZXhpc3RzU3luYyhwYXRoLmpvaW4oY3VycmVudCwgJ21pc2UudG9tbCcpKSB8fFxuICAgIGZzLmV4aXN0c1N5bmMocGF0aC5qb2luKGN1cnJlbnQsICcubWlzZS50b21sJykpIHx8XG4gICAgZnMuZXhpc3RzU3luYyhwYXRoLmpvaW4oY3VycmVudCwgJy50b29sLXZlcnNpb25zJykpXG4gICk7XG59XG5cbmZ1bmN0aW9uIGNvbnRhaW5zQW55KHBhdHRlcm46IHN0cmluZywgZGlyUGF0aDogc3RyaW5nKTogYm9vbGVhbiB7XG4gIHJldHVybiBmZy5nbG9iU3luYyhwYXR0ZXJuLCB7IGRvdDogdHJ1ZSwgY3dkOiBkaXJQYXRoLCBpZ25vcmU6IGdsb2JJZ25vcmUgfSkubGVuZ3RoID4gMDtcbn1cblxuYXN5bmMgZnVuY3Rpb24gZmV0Y2hSZXBvSW5mbyhkaXJQYXRoOiBzdHJpbmcsIHBhY2thZ2VKc29uOiBQYWNrYWdlSnNvbik6IFByb21pc2U8UmVjb3JkPHN0cmluZywgdW5rbm93bj4gfCB1bmRlZmluZWQ+IHtcbiAgY29uc3QgZ2l0ID0gc2ltcGxlR2l0KGRpclBhdGgpO1xuICBjb25zdCByZW1vdGVzID0gYXdhaXQgZ2l0LmdldFJlbW90ZXModHJ1ZSk7XG4gIGNvbnN0IG9yaWdpbiA9IHJlbW90ZXMuZmluZCgocikgPT4gci5uYW1lID09PSAnb3JpZ2luJyk7XG4gIGNvbnN0IHJlbW90ZVVybCA9IG9yaWdpbj8ucmVmcy5mZXRjaCA/PyBvcmlnaW4/LnJlZnMucHVzaDtcbiAgaWYgKHR5cGVvZiByZW1vdGVVcmwgPT09ICdzdHJpbmcnKSB7XG4gICAgY29uc3QganNvbiA9IGF3YWl0IHJlcXVlc3RSZXBvSW5mbyhyZW1vdGVVcmwpO1xuICAgIGlmIChqc29uKSByZXR1cm4ganNvbjtcbiAgfVxuXG4gIGNvbnN0IHVybCA9IHR5cGVvZiBwYWNrYWdlSnNvbi5yZXBvc2l0b3J5ID09PSAnc3RyaW5nJyA/IHBhY2thZ2VKc29uLnJlcG9zaXRvcnkgOiBwYWNrYWdlSnNvbi5yZXBvc2l0b3J5Py51cmw7XG4gIGlmICh1cmwpIHtcbiAgICBjb25zdCBqc29uID0gYXdhaXQgcmVxdWVzdFJlcG9JbmZvKHVybCk7XG4gICAgaWYgKGpzb24gJiYganNvbi5tZXNzYWdlICE9PSAnTm90IEZvdW5kJykgcmV0dXJuIGpzb247XG4gIH1cbn1cblxuYXN5bmMgZnVuY3Rpb24gcmVxdWVzdFJlcG9JbmZvKHVybE9yRnVsbE5hbWU6IHN0cmluZyk6IFByb21pc2U8UmVjb3JkPHN0cmluZywgdW5rbm93bj4gfCB1bmRlZmluZWQ+IHtcbiAgY29uc3QgW29yZywgbmFtZV0gPSBnaXRIdWJVdGlsLmdldE9yZ0FuZE5hbWUodXJsT3JGdWxsTmFtZSk7XG4gIGlmICghb3JnIHx8ICFuYW1lKSByZXR1cm47XG5cbiAgY29uc3QgcmV0ID0geyBmdWxsX25hbWU6IGAke29yZ30vJHtuYW1lfWAgfTtcbiAgdHJ5IHtcbiAgICAvLyBNZXRhZGF0YSBwZXJtaXNzaW9uXG4gICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBnZXRPY3Rva2l0KCkucmVxdWVzdCgnR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfScsIHtcbiAgICAgIG93bmVyOiBvcmcsXG4gICAgICByZXBvOiBuYW1lLFxuICAgIH0pO1xuICAgIE9iamVjdC5hc3NpZ24ocmV0LCByZXNwb25zZS5kYXRhKTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBjb25zdCByZWRpcmVjdGVkRnVsbE5hbWUgPSBnZXRSZWRpcmVjdGVkUmVwb0Z1bGxOYW1lKGVycm9yKTtcbiAgICBpZiAocmVkaXJlY3RlZEZ1bGxOYW1lKSB7XG4gICAgICByZXQuZnVsbF9uYW1lID0gcmVkaXJlY3RlZEZ1bGxOYW1lO1xuICAgIH1cbiAgfVxuICByZXR1cm4gcmV0O1xufVxuXG5mdW5jdGlvbiBnZXRSZWRpcmVjdGVkUmVwb0Z1bGxOYW1lKGVycm9yOiB1bmtub3duKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgaWYgKCFlcnJvciB8fCB0eXBlb2YgZXJyb3IgIT09ICdvYmplY3QnKSByZXR1cm47XG5cbiAgY29uc3QgcmVzcG9uc2UgPVxuICAgICdyZXNwb25zZScgaW4gZXJyb3JcbiAgICAgID8gKGVycm9yIGFzIHsgcmVzcG9uc2U/OiB7IHN0YXR1cz86IG51bWJlcjsgaGVhZGVycz86IFJlY29yZDxzdHJpbmcsIHN0cmluZyB8IHVuZGVmaW5lZD4gfSB9KS5yZXNwb25zZVxuICAgICAgOiB1bmRlZmluZWQ7XG4gIGNvbnN0IHN0YXR1cyA9IHJlc3BvbnNlPy5zdGF0dXMgPz8gKGVycm9yIGFzIHsgc3RhdHVzPzogbnVtYmVyIH0pLnN0YXR1cztcbiAgaWYgKHN0YXR1cyAhPT0gMzAxICYmIHN0YXR1cyAhPT0gMzAyKSByZXR1cm47XG5cbiAgY29uc3QgbG9jYXRpb24gPSByZXNwb25zZT8uaGVhZGVycz8ubG9jYXRpb247XG4gIGlmICh0eXBlb2YgbG9jYXRpb24gIT09ICdzdHJpbmcnKSByZXR1cm47XG5cbiAgY29uc3QgW29yZywgbmFtZV0gPSBnaXRIdWJVdGlsLmdldE9yZ0FuZE5hbWUobG9jYXRpb24pO1xuICBpZiAoIW9yZyB8fCAhbmFtZSkgcmV0dXJuO1xuXG4gIHJldHVybiBgJHtvcmd9LyR7bmFtZX1gO1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHsgaWdub3JlRXJyb3JBc3luYyB9IGZyb20gJ0B3aWxsYm9vc3Rlci9zaGFyZWQtbGliL3NyYyc7XG5pbXBvcnQgeWFyZ3MgZnJvbSAneWFyZ3MnO1xuXG5pbXBvcnQgeyBmaXhOZXh0Q29uZmlnSnNvbiB9IGZyb20gJy4vZml4ZXJzL25leHRDb25maWcuanMnO1xuaW1wb3J0IHsgZml4UGxheXdyaWdodENvbmZpZyB9IGZyb20gJy4vZml4ZXJzL3BsYXl3cmlnaHRDb25maWcuanMnO1xuaW1wb3J0IHsgZml4UHJpc21hRW52RmlsZXMgfSBmcm9tICcuL2ZpeGVycy9wcmlzbWEuanMnO1xuaW1wb3J0IHsgZml4VGVzdERpcmVjdG9yaWVzVXBkYXRpbmdQYWNrYWdlSnNvbiB9IGZyb20gJy4vZml4ZXJzL3Rlc3REaXJlY3RvcnkuanMnO1xuaW1wb3J0IHsgZml4VHlwZURlZmluaXRpb25zIH0gZnJvbSAnLi9maXhlcnMvdHlwZURlZmluaXRpb24uanMnO1xuaW1wb3J0IHsgZml4VHlwb3MgfSBmcm9tICcuL2ZpeGVycy90eXBvcy5qcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZUFnZW50SW5zdHJ1Y3Rpb25zIH0gZnJvbSAnLi9nZW5lcmF0b3JzL2FnZW50cy5qcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZUJ1bmZpZ1RvbWwgfSBmcm9tICcuL2dlbmVyYXRvcnMvYnVuZmlnLmpzJztcbmltcG9ydCB7IGdlbmVyYXRlRG9ja2VyaWdub3JlIH0gZnJvbSAnLi9nZW5lcmF0b3JzL2RvY2tlcmlnbm9yZS5qcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZUVkaXRvcmNvbmZpZyB9IGZyb20gJy4vZ2VuZXJhdG9ycy9lZGl0b3Jjb25maWcuanMnO1xuaW1wb3J0IHsgZ2VuZXJhdGVHZW1pbmlDb25maWcgfSBmcm9tICcuL2dlbmVyYXRvcnMvZ2VtaW5pQ29uZmlnLmpzJztcbmltcG9ydCB7IHJlbW92ZUdlbWluaVNldHRpbmdzIH0gZnJvbSAnLi9nZW5lcmF0b3JzL2dlbWluaVNldHRpbmdzLmpzJztcbmltcG9ydCB7IGdlbmVyYXRlR2l0YXR0cmlidXRlcyB9IGZyb20gJy4vZ2VuZXJhdG9ycy9naXRhdHRyaWJ1dGVzLmpzJztcbmltcG9ydCB7IGdlbmVyYXRlR2l0aWdub3JlIH0gZnJvbSAnLi9nZW5lcmF0b3JzL2dpdGlnbm9yZS5qcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZUlkZWFTZXR0aW5ncyB9IGZyb20gJy4vZ2VuZXJhdG9ycy9pZGVhLmpzJztcbmltcG9ydCB7IGdlbmVyYXRlTGVmdGhvb2tVcGRhdGluZ1BhY2thZ2VKc29uIH0gZnJvbSAnLi9nZW5lcmF0b3JzL2xlZnRob29rLmpzJztcbmltcG9ydCB7IGdlbmVyYXRlTGludHN0YWdlZHJjIH0gZnJvbSAnLi9nZW5lcmF0b3JzL2xpbnRzdGFnZWRyYy5qcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZVBhY2thZ2VKc29uIH0gZnJvbSAnLi9nZW5lcmF0b3JzL3BhY2thZ2VKc29uLmpzJztcbmltcG9ydCB7IGdlbmVyYXRlT3hmbXRDb25maWcgfSBmcm9tICcuL2dlbmVyYXRvcnMvb3hmbXRDb25maWcuanMnO1xuaW1wb3J0IHsgZ2VuZXJhdGVPeGxpbnRDb25maWcgfSBmcm9tICcuL2dlbmVyYXRvcnMvb3hsaW50Q29uZmlnLmpzJztcbmltcG9ydCB7IGdlbmVyYXRlUHJldHRpZXJpZ25vcmUgfSBmcm9tICcuL2dlbmVyYXRvcnMvcHJldHRpZXJpZ25vcmUuanMnO1xuaW1wb3J0IHsgZ2VuZXJhdGVQeXJpZ2h0Q29uZmlnSnNvbiB9IGZyb20gJy4vZ2VuZXJhdG9ycy9weXJpZ2h0Q29uZmlnLmpzJztcbmltcG9ydCB7IGdlbmVyYXRlUmVhZG1lIH0gZnJvbSAnLi9nZW5lcmF0b3JzL3JlYWRtZS5qcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZVJlbGVhc2VyYyB9IGZyb20gJy4vZ2VuZXJhdG9ycy9yZWxlYXNlcmMuanMnO1xuaW1wb3J0IHsgZ2VuZXJhdGVSZW5vdmF0ZUpzb24gfSBmcm9tICcuL2dlbmVyYXRvcnMvcmVub3ZhdGVKc29uLmpzJztcbmltcG9ydCB7IGluc3RhbGxBZ2VudFNraWxscyB9IGZyb20gJy4vZ2VuZXJhdG9ycy9za2lsbHMuanMnO1xuaW1wb3J0IHsgZ2VuZXJhdGVUc2NvbmZpZyB9IGZyb20gJy4vZ2VuZXJhdG9ycy90c2NvbmZpZy5qcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZVZzY29kZVNldHRpbmdzIH0gZnJvbSAnLi9nZW5lcmF0b3JzL3ZzY29kZVNldHRpbmdzLmpzJztcbmltcG9ydCB7IGdlbmVyYXRlV29ya2Zsb3dzLCBpc1JldXNhYmxlV29ya2Zsb3dzUmVwbyB9IGZyb20gJy4vZ2VuZXJhdG9ycy93b3JrZmxvdy5qcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZVlhcm5yY1ltbCB9IGZyb20gJy4vZ2VuZXJhdG9ycy95YXJucmMuanMnO1xuaW1wb3J0IHsgc2V0dXBMYWJlbHMgfSBmcm9tICcuL2dpdGh1Yi9sYWJlbC5qcyc7XG5pbXBvcnQgeyBzZXR1cFNlY3JldHMgfSBmcm9tICcuL2dpdGh1Yi9zZWNyZXQuanMnO1xuaW1wb3J0IHsgc2V0dXBHaXRIdWJTZXR0aW5ncyB9IGZyb20gJy4vZ2l0aHViL3NldHRpbmdzLmpzJztcbmltcG9ydCB7IGdlbmVyYXRlR2l0SHViVGVtcGxhdGVzIH0gZnJvbSAnLi9naXRodWIvdGVtcGxhdGUuanMnO1xuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi9sb2dnZXIuanMnO1xuaW1wb3J0IHsgb3B0aW9ucyB9IGZyb20gJy4vb3B0aW9ucy5qcyc7XG5pbXBvcnQgeyBnZXRQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGRvZXNDb250YWluSnNPclRzIH0gZnJvbSAnLi91dGlscy9wYWNrYWdlQ2FwYWJpbGl0aWVzLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5pbXBvcnQgeyBzcGF3blN5bmMsIHNwYXduU3luY0FuZFJldHVyblN0YXR1cyB9IGZyb20gJy4vdXRpbHMvc3Bhd25VdGlsLmpzJztcblxuYXN5bmMgZnVuY3Rpb24gbWFpbigpOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgYXJndiA9IGF3YWl0IHlhcmdzKHByb2Nlc3MuYXJndi5zbGljZSgyKSlcbiAgICAuY29tbWFuZCgnJDAgW3BhdGhzLi5dJywgJ01ha2UgYSBnaXZlbiBwcm9qZWN0IGZvbGxvdyB0aGUgV2lsbEJvb3N0ZXIgc3RhbmRhcmQnLCAoeWFyZ3MpID0+IHtcbiAgICAgIHlhcmdzLnBvc2l0aW9uYWwoJ3BhdGhzJywge1xuICAgICAgICBkZXNjcmliZTogJ3Byb2plY3QgcGF0aHMgdG8gYmUgd2JmaWVkJyxcbiAgICAgICAgYXJyYXk6IHRydWUsXG4gICAgICAgIHR5cGU6ICdzdHJpbmcnLFxuICAgICAgICBkZWZhdWx0OiBbJy4nXSxcbiAgICAgIH0pO1xuICAgIH0pXG4gICAgLm9wdGlvbnMoe1xuICAgICAgZW52OiB7XG4gICAgICAgIGRlc2NyaXB0aW9uOiAnVXBsb2FkIGVudmlyb25tZW50IHZhcmlhYmxlcyBhcyBzZWNyZXRzIHRvIEdpdEh1YicsXG4gICAgICAgIHR5cGU6ICdib29sZWFuJyxcbiAgICAgICAgZGVmYXVsdDogZmFsc2UsXG4gICAgICAgIGFsaWFzOiAnZScsXG4gICAgICB9LFxuICAgICAgc2tpcERlcHM6IHtcbiAgICAgICAgZGVzY3JpcHRpb246ICdTa2lwIGRlcGVuZGVuY3kgaW5zdGFsbGF0aW9uJyxcbiAgICAgICAgdHlwZTogJ2Jvb2xlYW4nLFxuICAgICAgICBkZWZhdWx0OiBmYWxzZSxcbiAgICAgICAgYWxpYXM6ICdkJyxcbiAgICAgIH0sXG4gICAgICB2ZXJib3NlOiB7XG4gICAgICAgIGRlc2NyaXB0aW9uOiAnV2hldGhlciBvciBub3QgdG8gZW5hYmxlIHZlcmJvc2UgbW9kZScsXG4gICAgICAgIHR5cGU6ICdib29sZWFuJyxcbiAgICAgICAgZGVmYXVsdDogZmFsc2UsXG4gICAgICAgIGFsaWFzOiAndicsXG4gICAgICB9LFxuICAgIH0pXG4gICAgLnZlcnNpb24oZ2V0VmVyc2lvbigpKVxuICAgIC5zdHJpY3QoKS5hcmd2O1xuICBvcHRpb25zLmlzVmVyYm9zZSA9IGFyZ3YudmVyYm9zZTtcbiAgb3B0aW9ucy5kb2VzVXBsb2FkRW52VmFycyA9IGFyZ3YuZW52O1xuXG4gIGxldCBoYXNJbnZhbGlkUGFja2FnZUNvbmZpZyA9IGZhbHNlO1xuICBmb3IgKGNvbnN0IHJvb3REaXJQYXRoIG9mIGFyZ3YucGF0aHMgYXMgc3RyaW5nW10pIHtcbiAgICBjb25zdCBwYWNrYWdlc0RpclBhdGggPSBwYXRoLmpvaW4ocm9vdERpclBhdGgsICdwYWNrYWdlcycpO1xuICAgIGNvbnN0IGRpcmVudHMgPSAoYXdhaXQgaWdub3JlRXJyb3JBc3luYygoKSA9PiBmcy5wcm9taXNlcy5yZWFkZGlyKHBhY2thZ2VzRGlyUGF0aCwgeyB3aXRoRmlsZVR5cGVzOiB0cnVlIH0pKSkgPz8gW107XG4gICAgY29uc3Qgc3ViRGlyUGF0aHMgPSBkaXJlbnRzLmZpbHRlcigoZCkgPT4gZC5pc0RpcmVjdG9yeSgpKS5tYXAoKGQpID0+IHBhdGguam9pbihwYWNrYWdlc0RpclBhdGgsIGQubmFtZSkpO1xuXG4gICAgYXdhaXQgZml4VGVzdERpcmVjdG9yaWVzVXBkYXRpbmdQYWNrYWdlSnNvbihbcm9vdERpclBhdGgsIC4uLnN1YkRpclBhdGhzXSk7XG5cbiAgICBjb25zdCByb290Q29uZmlnID0gYXdhaXQgZ2V0UGFja2FnZUNvbmZpZyhyb290RGlyUGF0aCk7XG4gICAgaWYgKG9wdGlvbnMuaXNWZXJib3NlKSB7XG4gICAgICBjb25zb2xlLmxvZygncm9vdENvbmZpZzonLCByb290Q29uZmlnKTtcbiAgICB9XG4gICAgaWYgKCFyb290Q29uZmlnKSB7XG4gICAgICBjb25zb2xlLmVycm9yKGB0aGVyZSBpcyBubyB2YWxpZCBwYWNrYWdlLmpzb24gaW4gJHtyb290RGlyUGF0aH1gKTtcbiAgICAgIGhhc0ludmFsaWRQYWNrYWdlQ29uZmlnID0gdHJ1ZTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBjb25zdCBhYmJyZXZpYXRpb25Qcm9taXNlID0gZml4VHlwb3Mocm9vdENvbmZpZyk7XG5cbiAgICBjb25zdCBudWxsYWJsZVN1YlBhY2thZ2VDb25maWdzID0gYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgICBzdWJEaXJQYXRocy5tYXAoKHN1YkRpclBhdGgpID0+IGdldFBhY2thZ2VDb25maWcoc3ViRGlyUGF0aCwgcm9vdENvbmZpZykpXG4gICAgKTtcbiAgICBjb25zdCBzdWJQYWNrYWdlQ29uZmlncyA9IG51bGxhYmxlU3ViUGFja2FnZUNvbmZpZ3MuZmlsdGVyKChjb25maWcpID0+ICEhY29uZmlnKTtcbiAgICBjb25zdCBhbGxQYWNrYWdlQ29uZmlncyA9IFtyb290Q29uZmlnLCAuLi5zdWJQYWNrYWdlQ29uZmlnc107XG5cbiAgICBpZiAob3B0aW9ucy5pc1ZlcmJvc2UpIHtcbiAgICAgIGZvciAoY29uc3QgY29uZmlnIG9mIGFsbFBhY2thZ2VDb25maWdzKSB7XG4gICAgICAgIGNvbnNvbGUuaW5mbyhjb25maWcpO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIEluc3RhbGwgeWFybiBiZXJyeVxuICAgIGF3YWl0IGdlbmVyYXRlWWFybnJjWW1sKHJvb3RDb25maWcpO1xuICAgIGlmIChyb290Q29uZmlnLmlzQnVuKSB7XG4gICAgICBhd2FpdCBnZW5lcmF0ZUJ1bmZpZ1RvbWwocm9vdENvbmZpZyk7XG4gICAgfVxuXG4gICAgY29uc3Qgc2hvdWxkUnVuV29ya2Zsb3dzID1cbiAgICAgICFpc1JldXNhYmxlV29ya2Zsb3dzUmVwbyhyb290Q29uZmlnLnJlcG9zaXRvcnkpICYmXG4gICAgICAocm9vdENvbmZpZy5yZXBvc2l0b3J5Py5zdGFydHNXaXRoKCdnaXRodWI6V2lsbEJvb3N0ZXIvJykgfHxcbiAgICAgICAgcm9vdENvbmZpZy5yZXBvc2l0b3J5Py5zdGFydHNXaXRoKCdnaXRodWI6V2lsbEJvb3N0ZXJMYWIvJykpO1xuICAgIGF3YWl0IFByb21pc2UuYWxsKFtcbiAgICAgIGZpeFByaXNtYUVudkZpbGVzKHJvb3RDb25maWcpLFxuICAgICAgYWJicmV2aWF0aW9uUHJvbWlzZS50aGVuKCgpID0+IGdlbmVyYXRlUmVhZG1lKHJvb3RDb25maWcpKSxcbiAgICAgIGdlbmVyYXRlQWdlbnRJbnN0cnVjdGlvbnMocm9vdENvbmZpZywgYWxsUGFja2FnZUNvbmZpZ3MpLFxuICAgICAgZ2VuZXJhdGVEb2NrZXJpZ25vcmUocm9vdENvbmZpZyksXG4gICAgICBnZW5lcmF0ZUVkaXRvcmNvbmZpZyhyb290Q29uZmlnKSxcbiAgICAgIGdlbmVyYXRlR2VtaW5pQ29uZmlnKHJvb3RDb25maWcsIGFsbFBhY2thZ2VDb25maWdzKSxcbiAgICAgIHJlbW92ZUdlbWluaVNldHRpbmdzKHJvb3RDb25maWcpLFxuICAgICAgZ2VuZXJhdGVHaXRhdHRyaWJ1dGVzKHJvb3RDb25maWcpLFxuICAgICAgZ2VuZXJhdGVHaXRIdWJUZW1wbGF0ZXMocm9vdENvbmZpZyksXG4gICAgICBnZW5lcmF0ZUlkZWFTZXR0aW5ncyhyb290Q29uZmlnKSxcbiAgICAgIGdlbmVyYXRlUmVub3ZhdGVKc29uKHJvb3RDb25maWcpLFxuICAgICAgZ2VuZXJhdGVSZWxlYXNlcmMocm9vdENvbmZpZyksXG4gICAgICAuLi4oc2hvdWxkUnVuV29ya2Zsb3dzID8gW2dlbmVyYXRlV29ya2Zsb3dzKHJvb3RDb25maWcpXSA6IFtdKSxcbiAgICAgIHNldHVwTGFiZWxzKHJvb3RDb25maWcpLFxuICAgICAgc2V0dXBTZWNyZXRzKHJvb3RDb25maWcpLFxuICAgICAgc2V0dXBHaXRIdWJTZXR0aW5ncyhyb290Q29uZmlnKSxcbiAgICAgIGdlbmVyYXRlTGVmdGhvb2tVcGRhdGluZ1BhY2thZ2VKc29uKHJvb3RDb25maWcpLFxuICAgICAgZ2VuZXJhdGVMaW50c3RhZ2VkcmMocm9vdENvbmZpZyksXG4gICAgXSk7XG4gICAgYXdhaXQgcHJvbWlzZVBvb2wucHJvbWlzZUFsbCgpO1xuXG4gICAgY29uc3QgcHJvbWlzZXM6IFByb21pc2U8dm9pZD5bXSA9IFtdO1xuICAgIGZvciAoY29uc3QgY29uZmlnIG9mIGFsbFBhY2thZ2VDb25maWdzKSB7XG4gICAgICBpZiAoY29uZmlnLmRvZXNDb250YWluVHlwZVNjcmlwdCB8fCBjb25maWcuZG9lc0NvbnRhaW5UeXBlU2NyaXB0SW5QYWNrYWdlcykge1xuICAgICAgICBwcm9taXNlcy5wdXNoKGZpeFR5cGVEZWZpbml0aW9ucyhjb25maWcsIGNvbmZpZy5pc1Jvb3QgPyBhbGxQYWNrYWdlQ29uZmlncyA6IFtjb25maWddKSk7XG4gICAgICB9XG4gICAgICBpZiAoY29uZmlnLmRlcGVuZGluZy5wbGF5d3JpZ2h0VGVzdCkge1xuICAgICAgICBwcm9taXNlcy5wdXNoKGZpeFBsYXl3cmlnaHRDb25maWcoY29uZmlnKSk7XG4gICAgICB9XG4gICAgICBpZiAoY29uZmlnLmRlcGVuZGluZy5uZXh0KSB7XG4gICAgICAgIHByb21pc2VzLnB1c2goZml4TmV4dENvbmZpZ0pzb24oY29uZmlnKSk7XG4gICAgICB9XG4gICAgICBhd2FpdCBnZW5lcmF0ZUdpdGlnbm9yZShjb25maWcsIHJvb3RDb25maWcpO1xuICAgICAgYXdhaXQgcHJvbWlzZVBvb2wucHJvbWlzZUFsbCgpO1xuICAgICAgaWYgKCFjb25maWcuaXNSb290ICYmICFjb25maWcuZG9lc0NvbnRhaW5QYWNrYWdlSnNvbikge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGF3YWl0IGdlbmVyYXRlUHJldHRpZXJpZ25vcmUoY29uZmlnKTtcbiAgICAgIGF3YWl0IGdlbmVyYXRlUGFja2FnZUpzb24oY29uZmlnLCByb290Q29uZmlnLCBhcmd2LnNraXBEZXBzKTtcblxuICAgICAgcHJvbWlzZXMucHVzaChnZW5lcmF0ZUxpbnRzdGFnZWRyYyhjb25maWcpKTtcbiAgICAgIGlmIChjb25maWcuZG9lc0NvbnRhaW5Wc2NvZGVTZXR0aW5nc0pzb24gJiYgY29uZmlnLmRvZXNDb250YWluUGFja2FnZUpzb24pIHtcbiAgICAgICAgcHJvbWlzZXMucHVzaChnZW5lcmF0ZVZzY29kZVNldHRpbmdzKGNvbmZpZykpO1xuICAgICAgfVxuICAgICAgaWYgKGNvbmZpZy5kb2VzQ29udGFpblR5cGVTY3JpcHQgfHwgY29uZmlnLmRvZXNDb250YWluVHlwZVNjcmlwdEluUGFja2FnZXMpIHtcbiAgICAgICAgcHJvbWlzZXMucHVzaChnZW5lcmF0ZVRzY29uZmlnKGNvbmZpZykpO1xuICAgICAgfVxuICAgICAgaWYgKGRvZXNDb250YWluSnNPclRzKGNvbmZpZykpIHtcbiAgICAgICAgcHJvbWlzZXMucHVzaChnZW5lcmF0ZU94Zm10Q29uZmlnKGNvbmZpZykpO1xuICAgICAgICBwcm9taXNlcy5wdXNoKGdlbmVyYXRlT3hsaW50Q29uZmlnKGNvbmZpZywgcm9vdENvbmZpZykpO1xuICAgICAgfVxuICAgICAgaWYgKGNvbmZpZy5kZXBlbmRpbmcucHlyaWdodCkge1xuICAgICAgICBwcm9taXNlcy5wdXNoKGdlbmVyYXRlUHlyaWdodENvbmZpZ0pzb24oY29uZmlnKSk7XG4gICAgICB9XG4gICAgfVxuICAgIGF3YWl0IFByb21pc2UuYWxsKHByb21pc2VzKTtcbiAgICBhd2FpdCBwcm9taXNlUG9vbC5wcm9taXNlQWxsKCk7XG5cbiAgICBjb25zdCBwYWNrYWdlTWFuYWdlciA9IHJvb3RDb25maWcuaXNCdW4gPyAnYnVuJyA6ICd5YXJuJztcbiAgICAvLyBSZWZyZXNoIGxvY2sgZmlsZXNcbiAgICBpZiAocm9vdENvbmZpZy5pc0J1bikge1xuICAgICAgYXdhaXQgbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ3JlZnJlc2hCdW5Mb2NrJywgYXN5bmMgKCkgPT4ge1xuICAgICAgICBhd2FpdCBQcm9taXNlLnJlc29sdmUoKTtcbiAgICAgICAgcmVmcmVzaEJ1bkxvY2socm9vdERpclBhdGgpO1xuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHNwYXduU3luYyhwYWNrYWdlTWFuYWdlciwgWydpbnN0YWxsJywgJy0tbm8taW1tdXRhYmxlJ10sIHJvb3REaXJQYXRoKTtcbiAgICB9XG4gICAgc3Bhd25TeW5jKHBhY2thZ2VNYW5hZ2VyLCBbJ2NsZWFudXAnXSwgcm9vdERpclBhdGgpO1xuXG4gICAgYXdhaXQgaW5zdGFsbEFnZW50U2tpbGxzKHJvb3RDb25maWcpO1xuICB9XG4gIGlmIChoYXNJbnZhbGlkUGFja2FnZUNvbmZpZykge1xuICAgIHByb2Nlc3MuZXhpdENvZGUgPSAxO1xuICB9XG59XG5cbmZ1bmN0aW9uIHJlZnJlc2hCdW5Mb2NrKHJvb3REaXJQYXRoOiBzdHJpbmcpOiB2b2lkIHtcbiAgLy8gd2JmeSBzaG91bGQgdXBkYXRlIG9ubHkgdGhlIHBhY2thZ2VzIGl0IGV4cGxpY2l0bHkgbWFuYWdlcyB0aHJvdWdoIGJ1biBhZGQuXG4gIC8vIFJ1bm5pbmcgYnVuIHVwZGF0ZSBoZXJlIHJlZnJlc2hlcyB1bnJlbGF0ZWQgYXBwbGljYXRpb24gZGVwZW5kZW5jaWVzIGFuZFxuICAvLyBjYW4gY2hhbmdlIHByb2R1Y3QgYmVoYXZpb3IsIHNvIGtlZXAgdGhlIGV4aXN0aW5nIGxvY2sgYW5kIHJlY29uY2lsZSBpdC5cbiAgY29uc3Qgc3RhdHVzID0gc3Bhd25TeW5jQW5kUmV0dXJuU3RhdHVzKCdidW4nLCBbJ2luc3RhbGwnXSwgcm9vdERpclBhdGgpO1xuICBpZiAoc3RhdHVzICE9PSAwKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBGYWlsZWQgdG8gcmVmcmVzaCBCdW4gbG9ja2ZpbGU6IGJ1biBpbnN0YWxsIGV4aXRlZCB3aXRoIHN0YXR1cyAke3N0YXR1c31gKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBnZXRWZXJzaW9uKCk6IHN0cmluZyB7XG4gIGxldCBwYWNrYWdlSnNvbkRpciA9IHBhdGguZGlybmFtZShuZXcgVVJMKGltcG9ydC5tZXRhLnVybCkucGF0aG5hbWUpO1xuICB3aGlsZSAoIWZzLmV4aXN0c1N5bmMocGF0aC5qb2luKHBhY2thZ2VKc29uRGlyLCAncGFja2FnZS5qc29uJykpKSB7XG4gICAgcGFja2FnZUpzb25EaXIgPSBwYXRoLmRpcm5hbWUocGFja2FnZUpzb25EaXIpO1xuICB9XG4gIGNvbnN0IHBhY2thZ2VKc29uID0gSlNPTi5wYXJzZShmcy5yZWFkRmlsZVN5bmMocGF0aC5qb2luKHBhY2thZ2VKc29uRGlyLCAncGFja2FnZS5qc29uJyksICd1dGY4JykpIGFzIHtcbiAgICB2ZXJzaW9uOiBzdHJpbmc7XG4gIH07XG4gIHJldHVybiBwYWNrYWdlSnNvbi52ZXJzaW9uO1xufVxuXG5hd2FpdCBtYWluKCk7XG4iXSwibmFtZXMiOlsiYXN5bmMiLCJzbGVlcCIsIm1pbGxpc2Vjb25kcyIsIlByb21pc2UiLCJyZXNvbHZlIiwic2V0VGltZW91dCIsImlnbm9yZUVycm9yQXN5bmMiLCJmbiIsImlnbm9yZUVub2VudEFzeW5jIiwiZXJyb3IiLCJjb2RlIiwib3B0aW9ucyIsImlzVmVyYm9zZSIsImRvZXNVcGxvYWRFbnZWYXJzIiwibG9nZ2VyIiwiZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbiIsIm5hbWUiLCJmdW5jIiwiY29uc29sZSIsImluZm8iLCJFcnJvciIsInN0YWNrIiwiU3RyaW5nIiwiZnNVdGlsIiwicmVhZEZpbGVJZ25vcmluZ0Vycm9yIiwiZmlsZVBhdGgiLCJmcyIsInByb21pc2VzIiwicmVhZEZpbGUiLCJnZW5lcmF0ZUZpbGUiLCJjb250ZW50IiwibWtkaXIiLCJwYXRoIiwiZGlybmFtZSIsInJlY3Vyc2l2ZSIsIm5vcm1hbGl6ZWRDb250ZW50IiwidHJpbSIsIndyaXRlRmlsZSIsInByb21pc2VQb29sIiwiUHJvbWlzZVBvb2wiLCJmaXhOZXh0Q29uZmlnSnNvbiIsImNvbmZpZyIsIm1hcCIsImV4dCIsImRpclBhdGgiLCJmaW5kIiwicCIsImV4aXN0c1N5bmMiLCJvbGRDb250ZW50Iiwib2JqZWN0TGl0ZXJhbCIsInNvdXJjZSIsInRzIiwiY3JlYXRlU291cmNlRmlsZSIsIlNjcmlwdFRhcmdldCIsIkxhdGVzdCIsIlNjcmlwdEtpbmQiLCJKUyIsInZpc2l0Iiwibm9kZSIsImlzRXhwb3J0QXNzaWdubWVudCIsImlzT2JqZWN0TGl0ZXJhbEV4cHJlc3Npb24iLCJleHByZXNzaW9uIiwiaXNCaW5hcnlFeHByZXNzaW9uIiwib3BlcmF0b3JUb2tlbiIsImtpbmQiLCJTeW50YXhLaW5kIiwiRXF1YWxzVG9rZW4iLCJsZWZ0IiwiZ2V0VGV4dCIsInJpZ2h0IiwiZm9yRWFjaENoaWxkIiwiZ2V0TmV4dENvbmZpZ09iamVjdExpdGVyYWwiLCJwcm9wZXJ0eVRleHRzIiwiU2V0IiwicHJvcGVydGllcyIsInByb3BlcnR5IiwiaGFzIiwicHVzaCIsImxlbmd0aCIsImluc2VydGlvblBvaW50IiwiZ2V0RW5kIiwibGFzdFByb3BlcnR5IiwiYXQiLCJoYXNUcmFpbGluZ0NvbW1hIiwic2xpY2UiLCJpbmNsdWRlcyIsInByZWZpeCIsIm5ld0NvbnRlbnQiLCJqb2luIiwicnVuIiwibGl0ZXJhbCIsInZhbHVlIiwiYXNPYmplY3QiLCJleHRyYU1lbWJlcnMiLCJ0b1BhcnNlZE9iamVjdCIsImRlZmF1bHRDb25maWciLCJmb3JiaWRPbmx5IiwicmV0cmllcyIsInVzZSIsImJhc2VVUkwiLCJ0cmFjZSIsInNjcmVlbnNob3QiLCJ2aWRlbyIsIndlYlNlcnZlciIsImNvbW1hbmQiLCJ1cmwiLCJyZXVzZUV4aXN0aW5nU2VydmVyIiwidGltZW91dCIsInN0ZG91dCIsInN0ZGVyciIsImVudiIsImdyYWNlZnVsU2h1dGRvd24iLCJtZW1iZXJPcmRlciIsIk9iamVjdCIsImtleXMiLCJrZXkiLCJfIiwiaW5kZXgiLCJmaXhQbGF5d3JpZ2h0Q29uZmlnIiwiZW52RmlsZVBhdGgiLCJlbnZGaWxlTmFtZXMiLCJlbnZGaWxlUGF0aHMiLCJjdXJyZW50RGlyUGF0aCIsImZpbGVOYW1lIiwiZ2V0RW52RmlsZVBhdGhzIiwidGVzdCIsImFzc2VydE5leHRQdWJsaWNCYXNlVXJsIiwiZXh0cmFjdGVkT2JqZWN0TGl0ZXJhbCIsIlRTIiwiZm91bmQiLCJpc0NhbGxFeHByZXNzaW9uIiwiZmlyc3RBcmd1bWVudCIsImFyZ3VtZW50cyIsInVuZGVmaW5lZCIsImV4dHJhY3REZWZpbmVDb25maWdPYmplY3RMaXRlcmFsIiwicGFyc2VkIiwicGFyc2VPYmplY3RMaXRlcmFsRXhwcmVzc2lvbiIsIm1lcmdlZCIsIm1lcmdlUGFyc2VkT2JqZWN0cyIsImhhc1N0YXJ0VGVzdFNlcnZlciIsIkJvb2xlYW4iLCJwYWNrYWdlSnNvbiIsInNjcmlwdHMiLCJoYXNFeGlzdGluZ1dlYlNlcnZlciIsIm9iamVjdCIsImlzQnVuIiwic2V0V2ViU2VydmVyQ29tbWFuZCIsIm5ld09iamVjdExpdGVyYWwiLCJzdHJpbmdpZnlWYWx1ZSIsInN0YXJ0IiwiZ2V0U3RhcnQiLCJlbmQiLCJiYXNlIiwib3ZlcnJpZGUiLCJvdmVycmlkZVByb3BlcnR5S2V5cyIsImZpbHRlciIsIm1lbWJlciIsImVudHJpZXMiLCJtZXJnZVBhcnNlZFZhbHVlIiwicGFyc2VFeHByZXNzaW9uIiwicGFyc2VkT2JqZWN0IiwiaXNBcnJheUxpdGVyYWxFeHByZXNzaW9uIiwiZWxlbWVudHMiLCJlbGVtZW50Iiwic29tZSIsImlzU2hvcnRoYW5kUHJvcGVydHlBc3NpZ25tZW50IiwiaXNQcm9wZXJ0eUFzc2lnbm1lbnQiLCJpc0lkZW50aWZpZXIiLCJpc1N0cmluZ0xpdGVyYWwiLCJpbml0aWFsaXplciIsImxldmVsIiwiY2xvc2luZ0luZGVudCIsInJlcGVhdCIsImluZGVudCIsIml0ZW0iLCJzdHJpbmdpZmllZCIsInNwbGl0IiwiZW1pdHRlZFByb3BlcnRpZXMiLCJsYXN0UHJvcGVydHlJbmRleEJ5S2V5IiwiTWFwIiwic2V0IiwiZ2V0TGFzdFByb3BlcnR5SW5kZXhCeUtleSIsImxpbmVzIiwiZmxhdE1hcCIsInN0cmluZ2lmeU9iamVjdE1lbWJlciIsImdldCIsImFkZCIsInN0cmluZ2lmeU9iamVjdFByb3BlcnR5IiwibGluZSIsImdsb2JJZ25vcmUiLCJmaXhQcmlzbWFFbnZGaWxlcyIsImVudkZpbGVzIiwiZmciLCJnbG9iIiwiZG90IiwiY3dkIiwiaWdub3JlIiwiZW52RmlsZSIsInJlcGxhY2VBbGwiLCJtYXRjaCIsInNlcGFyYXRvciIsInByb3RvdHlwZSIsImhhc093blByb3BlcnR5IiwiY2FsbCIsInNvcnRPYmplY3RCeUtleU5hbWVMaXN0Iiwic29ydFdpdGgiLCJzb3J0Rm4iLCJ0b3RhbCIsIm9iamVjdEtleXMiLCJzb3J0IiwiSU5ERU5UX1JFR0VYIiwiSU5ERU5UX1RZUEVfU1BBQ0UiLCJzaG91bGRJZ25vcmVTaW5nbGVTcGFjZSIsImlnbm9yZVNpbmdsZVNwYWNlcyIsImluZGVudFR5cGUiLCJtYWtlSW5kZW50c01hcCIsInN0cmluZyIsImluZGVudHMiLCJwcmV2aW91c0luZGVudFR5cGUiLCJwcmV2aW91c1NpemUiLCJtYXRjaGVzIiwid2VpZ2h0IiwiaW5kZW50RGlmZmVyZW5jZSIsImFic29sdXRlSW5kZW50RGlmZmVyZW5jZSIsIk1hdGgiLCJhYnMiLCJlbmNvZGVJbmRlbnRzS2V5IiwiZW50cnkiLCJpbmRlbnRBbW91bnQiLCJkZXRlY3RJbmRlbnQiLCJUeXBlRXJyb3IiLCJzaXplIiwia2V5T2ZNb3N0VXNlZEluZGVudCIsInJlc3VsdCIsIm1heFVzZWQiLCJtYXhXZWlnaHQiLCJ1c2VkQ291bnQiLCJnZXRNb3N0VXNlZEtleSIsInR5cGUiLCJhbW91bnQiLCJpbmRlbnRzS2V5IiwiTnVtYmVyIiwibWFrZUluZGVudFN0cmluZyIsImRldGVjdE5ld2xpbmVHcmFjZWZ1bCIsIm5ld2xpbmVzIiwiY3JsZiIsIm5ld2xpbmUiLCJkZXRlY3ROZXdsaW5lIiwicGlwZSIsImZucyIsIngiLCJhcmdzIiwicmVkdWNlIiwib25BcnJheSIsIkFycmF5IiwiaXNBcnJheSIsIm9uU3RyaW5nQXJyYXkiLCJldmVyeSIsInVuaXEiLCJ4cyIsInNvcnRBcnJheSIsImFycmF5IiwidG9Tb3J0ZWQiLCJ1bmlxQW5kU29ydEFycmF5Iiwib25PYmplY3QiLCJnZXRQcm90b3R5cGVPZiIsIlN5bWJvbCIsInRvU3RyaW5nVGFnIiwiaXRlcmF0b3IiLCJpc1BsYWluT2JqZWN0Iiwic29ydE9iamVjdEJ5IiwiY29tcGFyYXRvciIsImRlZXAiLCJvdmVyIiwiZnJvbUVudHJpZXMiLCJzb3J0T2JqZWN0S2V5cyIsIm9iamVjdEdyb3VwQnkiLCJncm91cEJ5IiwiY2FsbGJhY2siLCJjcmVhdGUiLCJzb3J0T2JqZWN0Iiwic29ydFVSTE9iamVjdCIsInNvcnRQZW9wbGVPYmplY3QiLCJzb3J0RGlyZWN0b3JpZXMiLCJvdmVyUHJvcGVydHkiLCJoYXNPd24iLCJzb3J0R2l0SG9va3MiLCJwYXJzZU5hbWVBbmRWZXJzaW9uUmFuZ2UiLCJzcGVjaWZpZXIiLCJuYW1lQW5kVmVyc2lvbiIsImF0TWF0Y2hlcyIsIm1hdGNoQWxsIiwic3BsaXRJbmRleCIsInBvcCIsInN1YnN0cmluZyIsInJhbmdlIiwic29ydE9iamVjdEJ5U2VtdmVyIiwiYSIsImIiLCJhTmFtZSIsImFSYW5nZSIsImJOYW1lIiwiYlJhbmdlIiwibG9jYWxlQ29tcGFyZSIsInNlbXZlckNvbXBhcmUiLCJzZW12ZXJNaW5WZXJzaW9uIiwiZ2V0UGFja2FnZU5hbWUiLCJpZGVudCIsImluZGV4T2YiLCJzdGFydHNXaXRoIiwiY2FjaGUiLCJzaG91bGRTb3J0RGVwZW5kZW5jaWVzTGlrZU5wbSIsInBhY2thZ2VNYW5hZ2VyIiwiZGV2RW5naW5lcyIsInBucG0iLCJlbmdpbmVzIiwibnBtIiwicHJvY2VzcyIsImhhc1lhcm5PclBucG1GaWxlcyIsInNvcnREZXBlbmRlbmNpZXMiLCJkZXBlbmRlbmNpZXMiLCJzb3J0V29ya3NwYWNlcyIsInNvcnRFc2xpbnRDb25maWciLCJvdmVycmlkZXMiLCJydWxlMSIsInJ1bGUyIiwic29ydFZTQ29kZUJhZGdlT2JqZWN0Iiwic29ydFByZXR0aWVyQ29uZmlnIiwic29ydFZvbHRhIiwic29ydERldkVuZ2luZXMiLCJzb3J0UG5wbUNvbmZpZyIsImRlZmF1bHROcG1TY3JpcHRzIiwiaGFzRGV2RGVwZW5kZW5jeSIsImRlcGVuZGVuY3kiLCJkZXZEZXBlbmRlbmNpZXMiLCJydW5TUmVnRXhwIiwiaGFzU2VxdWVudGlhbFNjcmlwdCIsImZpZWxkIiwidmFsdWVzIiwic2NyaXB0IiwiaXNTZXF1ZW50aWFsU2NyaXB0Iiwic29ydFNjcmlwdE5hbWVzIiwiZ3JvdXBNYXAiLCJpZHgiLCJmcm9tIiwiZ3JvdXBLZXkiLCJjaGlsZHJlbiIsImsiLCJzb3J0U2NyaXB0cyIsIm5hbWVzIiwicHJlZml4YWJsZSIsIm9taXR0ZWQiLCJyZXBsYWNlIiwic29ydENvbmRpdGlvbnMiLCJjb25kaXRpb25zIiwiZGVmYXVsdENvbmRpdGlvbnMiLCJyZXN0Q29uZGl0aW9ucyIsImNvbmRpdGlvbiIsInNvcnRFeHBvcnRzIiwiZXhwb3J0cyIsInBhdGhzIiwiZmllbGRzIiwibWFpbnRhaW5lcnMiLCJjb250cmlidXRvcnMiLCJwYWNrYWdlTmFtZUEiLCJwYWNrYWdlTmFtZUIiLCJiYWRnZSIsImRlZmF1bHRTb3J0T3JkZXIiLCJvdmVyRmllbGRzIiwic29ydFBhY2thZ2VKc29uIiwianNvbklzaCIsImpzb24iLCJlbmRDaGFyYWN0ZXJzIiwiSlNPTiIsInBhcnNlIiwic3RyaW5naWZ5IiwiZWRpdFN0cmluZ0pTT04iLCJzb3J0T3JkZXIiLCJwcml2YXRlS2V5cyIsInB1YmxpY0tleXMiLCJmaXhUZXN0RGlyZWN0b3JpZXNVcGRhdGluZ1BhY2thZ2VKc29uIiwicGFja2FnZURpclBhdGhzIiwiYWxsIiwicGFja2FnZUpzb25QYXRoIiwicGFja2FnZURpclBhdGgiLCJuZXdUZXN0RGlyUGF0aCIsIm9sZFRlc3REaXJOYW1lIiwib2xkVGVzdERpclBhdGgiLCJtb3ZlVGVzdERpcmVjdG9yeSIsImRpZFVwZGF0ZVNjcmlwdCIsInNjcmlwdE5hbWUiLCJuZXdTY3JpcHQiLCJyZW5hbWUiLCJkaXJlbnRzIiwicmVhZGRpciIsIndpdGhGaWxlVHlwZXMiLCJvbGRQYXRoIiwiZGlyZW50IiwibmV3UGF0aCIsIm5ld1BhdGhTdGF0Iiwic3RhdCIsImlzRGlyZWN0b3J5Iiwicm0iLCJmaXhUeXBlRGVmaW5pdGlvbnMiLCJjb25maWdzSW5jbHVkaW5nQ2hpbGRyZW4iLCJsaWJUeXBlRGlyUGF0aCIsInNyY1R5cGVEaXJQYXRoIiwiaXNSb290IiwiZG9lc0NvbnRhaW5TdWJQYWNrYWdlSnNvbnMiLCJkaXJOYW1lIiwiaGFzVHlwZURlY2xhcmF0aW9uRXh0ZW5zaW9uIiwiZW5kc1dpdGgiLCJwYWNrYWdlTmFtZSIsImhhc0xpYnJhcnkiLCJpc0ZpbGUiLCJvdmVyd3JpdGVNZXJnZSIsImRlc3RpbmF0aW9uQXJyYXkiLCJzb3VyY2VBcnJheSIsImNvbWJpbmVNZXJnZSIsInRhcmdldCIsImRlc3RpbmF0aW9uIiwiY2xvbmVVbmxlc3NPdGhlcndpc2VTcGVjaWZpZWQiLCJpc01lcmdlYWJsZU9iamVjdCIsIm1lcmdlIiwic29ydEtleXMiLCJvYmoiLCJrZXlBbmRWYWx1ZXMiLCJrZXkxIiwia2V5MiIsInB1YmxpY1JlcG9BdXRvZml4V29ya2Zsb3ciLCJvbiIsInB1bGxfcmVxdWVzdCIsImJyYW5jaGVzIiwicGVybWlzc2lvbnMiLCJjb250ZW50cyIsImNvbmN1cnJlbmN5IiwiZ3JvdXAiLCJqb2JzIiwiYXV0b2ZpeCIsInByaXZhdGVSZXBvQXV0b2ZpeFdvcmtmbG93IiwidXNlcyIsIndvcmtmbG93cyIsInJlbGVhc2UiLCJwdWxsX3JlcXVlc3RfdGFyZ2V0IiwidHlwZXMiLCJzeW5jIiwiaXNzdWVzIiwiaWYiLCJ3aXRoIiwic2VjcmV0cyIsIkNMQVVERV9DT0RFX09BVVRIX1RPS0VOIiwiT1BFTkFJX0FQSV9LRVkiLCJHRU1JTklfQVBJX0tFWSIsImdlbmVyYXRlV29ya2Zsb3dzIiwicm9vdENvbmZpZyIsImlzUmV1c2FibGVXb3JrZmxvd3NSZXBvIiwicmVwb3NpdG9yeSIsIndvcmtmbG93c1BhdGgiLCJzZW1hbnRpY1ltbFBhdGgiLCJmb3JjZSIsImZpbGVOYW1lU2V0IiwiZGVwZW5kaW5nIiwic2VtYW50aWNSZWxlYXNlIiwiYmFzZW5hbWUiLCJ3cml0ZVdvcmtmbG93WWFtbCIsImRlcGxveVByb2R1Y3Rpb25Xb3JrZmxvd0V4aXN0cyIsIndyaXRlWWFtbCIsImlzUHVibGljUmVwbyIsInN0cnVjdHVyZWRDbG9uZSIsInN0ZXBzIiwiYnVpbGQiLCJhdXRvZml4V29ya2Zsb3ciLCJhdXRvZml4Sm9iIiwiZ2VuZXJhdGVBdXRvZml4V29ya2Zsb3ciLCJuZXdTZXR0aW5ncyIsIm9sZFNldHRpbmdzIiwieWFtbCIsImxvYWQiLCJhcnJheU1lcmdlIiwibW92ZVRvQm90dG9tIiwiYWN0aW9ucyIsInRyaWdnZXJfZGVwbG95X3dvcmtmbG93IiwiaXNSZXVzYWJsZVdvcmtmbG93Iiwiam9iIiwibm9ybWFsaXplSm9iIiwic2NoZWR1bGUiLCJicmFuY2giLCJwYXJhbXMiLCJzeW5jX3BhcmFtc193aXRob3V0X2Rlc3QiLCJ3b3JrZmxvd19kaXNwYXRjaCIsIk5QTV9UT0tFTiIsIkdIX1RPS0VOIiwiRklSRUJBU0VfVE9LRU4iLCJHQ1BfU0FfS0VZX0pTT05fRk9SX0ZJUkVCQVNFIiwiRElTQ09SRF9XRUJIT09LX1VSTCIsInNlcnZlcl91cmwiLCJkb3RfZW52X3BhdGgiLCJGTFlfQVBJX1RPS0VOIiwiZGVwbG95X2NvbW1hbmQiLCJkb2VzQ29udGFpbkRvY2tlcmZpbGUiLCJjaV9sYWJlbCIsImdpdGh1Yl9ob3N0ZWRfcnVubmVyIiwibmV3U2VjcmV0cyIsInlhbWxUZXh0IiwiZHVtcCIsImxpbmVXaWR0aCIsIm5vQ29tcGF0TW9kZSIsInN0eWxlcyIsImZpeFR5cG9zIiwicGFja2FnZUNvbmZpZyIsImRvY0ZpbGVzIiwibWRGaWxlIiwiZml4VHlwb3NJblRleHQiLCJyZXBsYWNlV2l0aENvbmZpZyIsInRzRmlsZXMiLCJ0c0ZpbGUiLCJjb21tZW50IiwidGV4dEJhc2VkRmlsZXMiLCJmaWxlIiwicHJvbWlzZUFsbCIsInByb3BOYW1lIiwiYmVmb3JlIiwiYWZ0ZXIiLCJ3YmZ5SnNvbiIsInR5cG9zIiwiZ2VuZXJhdGVBZ2VudEluc3RydWN0aW9ucyIsImFsbENvbmZpZ3MiLCJhZ2VudHNFeHRyYVBhdGgiLCJleHRyYUNvbnRlbnQiLCJ0b29sTmFtZSIsImdlbmVyYXRlQWdlbnRJbnN0cnVjdGlvbiIsImN1cnNvclJ1bGVzUGF0aCIsImN1cnNvclJ1bGVzQ29udGVudCIsImZyb250bWF0dGVyIiwiYm9keSIsImdlbmVyYXRlQ3Vyc29yR2VuZXJhbE1kY0NvbnRlbnQiLCJiYXNlQ29udGVudCIsImRlc2NyaXB0aW9uIiwiaXNXaWxsQm9vc3RlclJlcG8iLCJjIiwiZ2VuZXJhdGVBZ2VudENvZGluZ1N0eWxlIiwiaGFzTmV3U2VjdGlvbiIsImdlbkkxOG5UcyIsInJlYWN0IiwibmV4dCIsIm1pbmltdW1SZWxlYXNlQWdlRXhjbHVkZXMiLCJnZW5lcmF0ZUJ1bmZpZ1RvbWwiLCJleGlzdGluZ0NvbnRlbnQiLCJyZWFkRmlsZVN5bmMiLCJidW5maWdUb21sIiwicGFyc2VCdW5maWdUb21sIiwiYnVuIiwiZ2VuZXJhdGVSdW5TZWN0aW9uIiwiaW5zdGFsbCIsImV4YWN0IiwidXNlckNvbnRlbnRIZWFkZXIiLCJ1c2VyQ29udGVudEhlYWRlclJlZ2V4IiwiZGVmYXVsdEhlYWRVc2VyQ29udGVudCIsImRlZmF1bHRUYWlsVXNlckNvbnRlbnQiLCJpZ25vcmVGaWxlVXRpbCIsInNlcGFyYXRvclByZWZpeCIsInJlYWRHaXRpZ25vcmVXaXRob3V0U2VwYXJhdG9ycyIsImxhc3RIZWFkZXJJbmRleCIsImdldEluZGV4T2ZUYWlsVXNlckNvbnRlbnRIZWFkZXIiLCJnZXRIZWFkVXNlckNvbnRlbnQiLCJ0aGlzIiwiZ2V0VGFpbFVzZXJDb250ZW50IiwiaXNCZXJyeVplcm9JbnN0YWxsRW5hYmxlZCIsImxhc3RJbmRleCIsImxhc3RJbmRleE9mIiwiZ2VuZXJhdGVEb2NrZXJpZ25vcmUiLCJleHRlbnNpb25zIiwiY29kZVdpdGgySW5kZW50U2l6ZSIsImNvZGVXaXRoNEluZGVudFNpemUiLCJtYXJrZG93bkxpa2UiLCJveGxpbnQiLCJveGZtdCIsInByZXR0aWVyT25seSIsImdlbmVyYXRlRXh0ZW5zaW9ucyIsImdlbmVyYXRlRWRpdG9yY29uZmlnIiwiaGF2ZV9mdW4iLCJjb2RlX3JldmlldyIsImRpc2FibGUiLCJjb21tZW50X3NldmVyaXR5X3RocmVzaG9sZCIsIm1heF9yZXZpZXdfY29tbWVudHMiLCJwdWxsX3JlcXVlc3Rfb3BlbmVkIiwiaGVscCIsInN1bW1hcnkiLCJpZ25vcmVfcGF0dGVybnMiLCJnZW5lcmF0ZUdlbWluaUNvbmZpZyIsImNvbmZpZ0ZpbGVQYXRoIiwic3R5bGVndWlkZUZpbGVQYXRoIiwibmV3Q29uZmlnIiwib2xkQ29uZmlnIiwieWFtbENvbnRlbnQiLCJjb2RpbmdSdWxlRXh0cmFDb250ZW50IiwidHJpbVN0YXJ0Iiwic3R5bGVndWlkZUNvbnRlbnQiLCJ0cmltRW5kIiwicmVtb3ZlR2VtaW5pU2V0dGluZ3MiLCJnZW5lcmF0ZUdpdGF0dHJpYnV0ZXMiLCJkZWZhdWx0TmFtZXMiLCJnZW5lcmF0ZUdpdGlnbm9yZSIsImhlYWRVc2VyQ29udGVudCIsInRhaWxVc2VyQ29udGVudCIsImRvZXNDb250YWluR2VtZmlsZSIsImRvZXNDb250YWluR29Nb2QiLCJkb2VzQ29udGFpblBhY2thZ2VKc29uIiwiZG9lc0NvbnRhaW5Qb21YbWwiLCJkb2VzQ29udGFpblB1YnNwZWNZYW1sIiwiZG9lc0NvbnRhaW5UZW1wbGF0ZVlhbWwiLCJkb2VzQ29udGFpblBvZXRyeUxvY2siLCJkb2VzQ29udGFpblV2TG9jayIsImJsaXR6IiwiZmlyZWJhc2UiLCJwcmlzbWEiLCJwbGF5d3JpZ2h0VGVzdCIsInJlYWN0TmF0aXZlIiwic3Rvcnlib29rIiwibGl0ZXN0cmVhbSIsImdlbmVyYXRlZCIsInJlYWRDYWNoZSIsInJlc3BvbnNlIiwiZmV0Y2giLCJyZXNwb25zZVRleHQiLCJ0ZXh0Iiwib2siLCJ3cml0ZUNhY2hlIiwib3MiLCJob21lZGlyIiwiRGF0ZSIsIm5vdyIsIm10aW1lTXMiLCJkb2VzQ29udGFpbkpzT3JUcyIsImRvZXNDb250YWluSmF2YVNjcmlwdCIsImRvZXNDb250YWluSmF2YVNjcmlwdEluUGFja2FnZXMiLCJkb2VzQ29udGFpblR5cGVTY3JpcHQiLCJkb2VzQ29udGFpblR5cGVTY3JpcHRJblBhY2thZ2VzIiwiZG9lc0NvbnRhaW5KYXZhIiwiZG9lc0NvbnRhaW5KYXZhSW5QYWNrYWdlcyIsImdlbmVyYXRlSWRlYVNldHRpbmdzIiwiY3JlYXRlVGFza09wdGlvbnMiLCJnZXRXYXRjaGVyVGFza3NDb250ZW50IiwicnVubmVyIiwiZXh0ZW5zaW9uIiwiZ2V0R2VuSTE4blRzQ29tbWFuZCIsInNwYXduU3luYyIsInJldHJ5Iiwic3Bhd25TeW5jQW5kUmV0dXJuU3RhdHVzIiwibmV3Q21kIiwibmV3QXJncyIsImdldFNwYXduU3luY0FyZ3MiLCJzdGF0dXMiLCJjaGlsZF9wcm9jZXNzIiwic3Bhd25TeW5jQW5kUmV0dXJuU3Rkb3V0Iiwic3RkaW8iLCJwcm9jIiwidG9TdHJpbmciLCJzIiwibWVzc2FnZSIsIlBBVEgiLCJCRVJSWV9CSU5fRk9MREVSIiwiZW5jb2RpbmciLCJzaGVsbCIsImdpdEh1YlV0aWwiLCJnZXRPcmdBbmROYW1lIiwidXJsT3JGdWxsTmFtZSIsInVybFdpdGhvdXRQcm90b2NvbCIsIm9jdG9raXRDYWNoZSIsImdldE9jdG9raXQiLCJvd25lciIsImNhY2hlZCIsIm9jdG9raXQiLCJPY3Rva2l0IiwiYXV0aCIsImdldEdpdEh1YlRva2VuIiwiaGFzR2l0SHViVG9rZW4iLCJHSF9CT1RfUEFUX0ZPUl9XSUxMQk9PU1RFUiIsIkdIX0JPVF9QQVRfRk9SX1dJTExCT09TVEVSTEFCIiwiR0lUSFVCX1RPS0VOIiwiaXNQdWJsaXNoZWRXaWxsYm9vc3RlckNvbmZpZ3NQYWNrYWdlIiwiaXNXaWxsQm9vc3RlckNvbmZpZ3MiLCJwcml2YXRlIiwiZmlsZXMiLCJveGxpbnREZXBzIiwidHlwZXNjcmlwdEdvRGVwZW5kZW5jeSIsIndiRGVwZW5kZW5jeSIsImJ1aWxkVHNEZXBlbmRlbmN5Iiwib2Jzb2xldGVMaW50RGVwZW5kZW5jaWVzIiwibWljcm9tYXRjaFBhY2thZ2VOYW1lcyIsIm1pY3JvbWF0Y2hJbXBvcnRQYXR0ZXJuIiwibGF0ZXN0RGVwZW5kZW5jeVZlcnNpb25DYWNoZSIsImdlbmVyYXRlUGFja2FnZUpzb24iLCJza2lwQWRkaW5nRGVwcyIsImpzb25PYmoiLCJqc29uVGV4dCIsInBlZXJEZXBlbmRlbmNpZXMiLCJyZWFkUGFja2FnZUpzb24iLCJhdXRob3IiLCJ0c2xpYiIsInR5cGVzY3JpcHQiLCJsZXJuYSIsInBpbnN0IiwicHJldHRpZXIiLCJwcmVzZXJ2ZU1pY3JvbWF0Y2giLCJmaWxlUGF0aHMiLCJnbG9iU3luYyIsImRvZXNQcm9kdWN0Q29kZUltcG9ydE1pY3JvbWF0Y2giLCJzaG91bGRQcmVzZXJ2ZU1pY3JvbWF0Y2giLCJzaG91bGRQcmVzZXJ2ZUNvbmZpZ1BhY2thZ2VMaW50RGVwZW5kZW5jeSIsInJlbW92ZU9ic29sZXRlTGludERlcGVuZGVuY2llcyIsInJlbW92ZURlcHJlY2F0ZWRTdHVmZiIsInJlbW92ZUxlZ2FjeUluc3RhbGxDb21tYW5kcyIsImdlbmVyYXRlU2NyaXB0cyIsIndiIiwiYWRkU3RhcnRUZXN0U2VydmVyU2NyaXB0SWZOZWVkZWQiLCJhZGRJbnN0YWxsU3RlcFRvQ2hlY2tGb3JBaSIsInByZXR0aWZ5IiwiY2F0Y2giLCJvcmlnaW5hbENvbnRlbnQiLCJuZXdMaW5lIiwibCIsImdlbmVyYXRlUHJldHRpZXJTdWZmaXgiLCJub3JtYWxpemVZYXJuV29ya3NwYWNlRm9yZWFjaFNjcmlwdHMiLCJ1cGRhdGVTY3JpcHRzIiwibW92ZU1hbmFnZWRUb29sRGVwZW5kZW5jaWVzVG9EZXZEZXBlbmRlbmNpZXMiLCJkZXBlbmRlbmN5VXBkYXRlcyIsInB5dGhvbkRldkRlcGVuZGVuY2llcyIsImhhc0phdmEiLCJkZXBlbmRlbmN5U2VjdGlvbnMiLCJzZWN0aW9uIiwicmVtb3ZlUHJldHRpZXJBcnRpZmFjdHMiLCJodXNreSIsInBvc3RpbnN0YWxsIiwicG9zdHB1Ymxpc2giLCJwcmVwdWJsaXNoT25seSIsInByZXBhY2siLCJwb3N0cGFjayIsInByZXBhcmUiLCJ2ZXJzaW9uIiwiYXJ0aWxsZXJ5IiwicGxheXdyaWdodCIsIndvcmtzcGFjZXMiLCJ3b3Jrc3BhY2UiLCJnZXRUc2NvbmZpZ0Jhc2VEZXBlbmRlbmNpZXMiLCJqZXN0IiwiZGVwIiwiYXBwbHlQYWNrYWdlSnNvbkNvbnZlbnRpb25zIiwibGljZW5zZSIsInB1Ymxpc2hDb25maWciLCJhY2Nlc3MiLCJjb25maWdNanNQYXRoIiwiY29uZmlnRHRzUGF0aCIsImNvbmZpZ0RtdHNDb250ZW50Iiwibm9ybWFsaXplUHVibGlzaGVkQ29uZmlnUGFja2FnZU1ldGFkYXRhIiwibWFpbiIsInJlc29sdXRpb25zIiwibGludCIsImRpcnMiLCJkaXIiLCJmb3JtYXQiLCJweXRob25QYWNrYWdlTWFuYWdlciIsImdldFB5dGhvblBhY2thZ2VNYW5hZ2VyIiwicHl0aG9uRmlsZXMiLCJkaXJOYW1lU2V0IiwicHl0aG9uRmlsZSIsImZpcnN0Iiwic2Vjb25kIiwiZGlyTmFtZXNTdHIiLCJweXRob25SdW5uZXIiLCJleGlzdGluZ1JlcG9zaXRvcnkiLCJub3JtYWxpemVkUmVwb3NpdG9yeSIsIm5vcm1hbGl6ZVJlcG9zaXRvcnlVcmxGb3JQYWNrYWdlSnNvbiIsImJ1aWxkTm9ybWFsaXplZFJlcG9zaXRvcnlGb3JQYWNrYWdlSnNvbiIsIm5vcm1hbGl6ZWRFeGlzdGluZ1JlcG9zaXRvcnkiLCJmb3JtYXRSZXBvc2l0b3J5Rm9yUGFja2FnZUpzb24iLCJhZGRHZW5JMThuVHNQb3N0aW5zdGFsbFNjcmlwdCIsIm5vcm1hbGl6ZVBhY2thZ2VNZXRhZGF0YSIsInBhY2thZ2VKc29uRGVwZW5kZW5jaWVzIiwicGFja2FnZUpzb25EZXZEZXBlbmRlbmNpZXMiLCJhZGRQYWNrYWdlSnNvbkRlcGVuZGVuY2llcyIsImFkZERlcGVuZGVuY3lWZXJzaW9uc1RvUGFja2FnZUpzb24iLCJwYWNrYWdlTmFtZXMiLCJwcml2YXRlUGFja2FnZXMiLCJyZXBvIiwiaXNXb3Jrc3BhY2VQYWNrYWdlIiwib3RoZXJUYXJnZXQiLCJSZWZsZWN0IiwiZGVsZXRlUHJvcGVydHkiLCJjb21taXRIYXNoIiwib3JnYW5pemF0aW9uIiwicmVqZWN0IiwiZ2V0TGF0ZXN0Q29tbWl0SGFzaCIsImdldExhdGVzdFByaXZhdGVQYWNrYWdlU3BlY2lmaWVyIiwidXBkYXRlUHJpdmF0ZVBhY2thZ2VzIiwicmVtb3ZlRW1wdHlEZXBlbmRlbmN5U2VjdGlvbnMiLCJzZXJpYWxpemVQYWNrYWdlSnNvbiIsImluc3RhbGxOcG1EZXBlbmRlbmNpZXMiLCJpbnN0YWxsRGVwZW5kZW5jeVVwZGF0ZXMiLCJyZWxhdGl2ZUZpbGVQYXRoIiwicmVsYXRpdmUiLCJmb3JtYXRQYWNrYWdlSnNvbldpdGhQcm9qZWN0Rm9ybWF0dGVyIiwiY29yZSIsImRldiIsImRlcGVuZGVuY3lTcGVjaWZpZXJzIiwiZGVwZW5kZW5jaWVzVG9JbnN0YWxsIiwic2hvdWxkVXBkYXRlRXhpc3RpbmdEZXBlbmRlbmN5Iiwic2hvdWxkVXBkYXRlRXhpc3RpbmdNYW5hZ2VkRGVwZW5kZW5jeSIsImdldExhdGVzdERlcGVuZGVuY3lWZXJzaW9uIiwiY2FjaGVkVmVyc2lvbiIsImVzbGludCIsImN1cnJlbnRWZXJzaW9uIiwicmVwb3NpdG9yeVVybCIsIm1hdGNoZWQiLCJleGVjIiwibm9ybWFsaXplZFVybCIsIm9sZFNjcmlwdHMiLCJjbGVhbnVwIiwidHlwZWNoZWNrIiwicHlyaWdodCIsImhhc1R5cGVjaGVjayIsImhhc0pzT3JUcyIsIm9sZFRlc3QiLCJnZW5lcmF0ZUZvcm1hdFNjcmlwdCIsImNvbW1hbmRzIiwiYmFzZVNldHRpbmdzIiwiZ2xvYl9tYXRjaGVyIiwicHJlQ29tbWl0U2V0dGluZ3MiLCJzdGFnZV9maXhlZCIsImdlbmVyYXRlTGVmdGhvb2tVcGRhdGluZ1BhY2thZ2VKc29uIiwiaHVza3lEaXJQYXRoIiwiaGFzSHVza3lEaXIiLCJzZXR0aW5ncyIsImdldFByZUNvbW1pdEpvYnMiLCJwcmVQdXNoIiwibGludENvbW1hbmQiLCJxdWlldExpbnRDb21tYW5kIiwiZ2V0UHJlUHVzaFNjcmlwdCIsIm1rZGlyU3luYyIsIm1vZGUiLCJwb3N0TWVyZ2VDb21tYW5kIiwicG9zdE1lcmdlQ29tbWFuZHMiLCJoYXNWZXJzaW9uU2V0dGluZ3MiLCJ0b29sc0NoYW5nZWRQYXR0ZXJuIiwicmF3IiwiaW5zdGFsbENvbW1hbmQiLCJybU5leHREaXJlY3RvcnkiLCJnZW5JMThuVHNDb21tYW5kIiwiZ2VuZXJhdGVQb3N0TWVyZ2VDb21tYW5kcyIsImdldENsZWFudXBHbG9icyIsImdldENsZWFudXBDb21tYW5kIiwic3VwcG9ydGVkRXh0ZW5zaW9ucyIsImxvY2FsV2JQYWNrYWdlSnNvblBhdGgiLCJoYXNMb2NhbFdiV29ya3NwYWNlIiwib3hsaW50UGF0dGVybiIsIm94Zm10UGF0dGVybiIsInByZXR0aWVyUGF0dGVybiIsImhhc1B5dGhvblBhY2thZ2VNYW5hZ2VyIiwiZ2V0UHl0aG9uUnVubmVyIiwiZ2VuZXJhdGVMaW50c3RhZ2VkcmMiLCJnZW5lcmF0ZU94Zm10Q29uZmlnIiwibGVnYWN5Q29uZmlnUGF0aCIsImNvbmZpZ0NvbnRlbnQiLCJnZW5lcmF0ZU94bGludENvbmZpZyIsIl9yb290Q29uZmlnIiwic2hvdWxkUHJlc2VydmVQdWJsaXNoZWRMaW50ZXJDb25maWciLCJnZW5lcmF0ZVByZXR0aWVyaWdub3JlIiwiZ2l0aWdub3JlRmlsZVBhdGgiLCJnaXRpZ25vcmVDb250ZW50IiwiYWRkaXRpb25hbENvbnRlbnQiLCJ2ZW52UGF0aCIsInZlbnYiLCJnZW5lcmF0ZVB5cmlnaHRDb25maWdKc29uIiwiZ2VuZXJhdGVSZWFkbWUiLCJpbnNlcnRCYWRnZSIsImZpbGVOYW1lcyIsInJlYWRkaXJTeW5jIiwiYmFkZ2VOYW1lIiwidG9VcHBlckNhc2UiLCJyZWFkbWUiLCJpIiwiZ2VuZXJhdGVSZWxlYXNlcmMiLCJwbHVnaW5zIiwicGx1Z2luRW50cnkiLCJwbHVnaW4iLCJwcmVzZXQiLCJzdWNjZXNzQ29tbWVudENvbmRpdGlvbiIsImZhaWxDb21tZW50Q29uZGl0aW9uIiwibGFiZWxzIiwicmVsZWFzZWRMYWJlbHMiLCIkc2NoZW1hIiwiZXh0ZW5kcyIsImdlbmVyYXRlUmVub3ZhdGVKc29uIiwicGFja2FnZVJ1bGVzIiwicnVsZSIsIm1hdGNoUGFja2FnZU5hbWVzIiwiZW5hYmxlZCIsImluc3RhbGxBZ2VudFNraWxscyIsInJvb3RKc29uT2JqIiwiY29tcGlsZXJPcHRpb25zIiwiYWx3YXlzU3RyaWN0Iiwibm9VbmNoZWNrZWRJbmRleGVkQWNjZXNzIiwiYWxsb3dTeW50aGV0aWNEZWZhdWx0SW1wb3J0cyIsImVzTW9kdWxlSW50ZXJvcCIsInJlc29sdmVKc29uTW9kdWxlIiwiaW1wb3J0SGVscGVycyIsIm5vRW1pdCIsImV4Y2x1ZGUiLCJpbmNsdWRlIiwic3ViSnNvbk9iaiIsImdlbmVyYXRlVHNjb25maWciLCJtb2R1bGVSZXNvbHV0aW9uIiwibm9ybWFsaXplTmV4dFRzY29uZmlnTW9kdWxlU2V0dGluZ3MiLCJjbGVhbnVwTGVnYWN5VHNjb25maWdNb2R1bGVTZXR0aW5ncyIsImdlbmVyYXRlZFR5cGVzIiwidHlwZU5hbWVzIiwidml0ZXN0IiwibW9jaGEiLCJjeXByZXNzIiwiZ2V0R2VuZXJhdGVkVHlwZXMiLCJnZXRUc2NvbmZpZ0V4dGVuZHMiLCJyb290RGlyIiwiZ2V0Um9vdERpciIsImRvZXNDb250YWluSnN4T3JUc3giLCJkb2VzQ29udGFpbkpzeE9yVHN4SW5QYWNrYWdlcyIsImpzeCIsImFkZEluY2x1ZGVQYXRoIiwiZXhpc3RpbmdUeXBlcyIsImV4aXN0aW5nRW1pdE1ldGFkYXRhIiwiZW1pdE9wdGlvbnMiLCJwaWNrRXhpc3RpbmdFbWl0TWV0YWRhdGEiLCJnZW5lcmF0ZWRFeHRlbmRzIiwiZXhpc3RpbmdFeHRlbmRzIiwibWVyZ2VkRXh0ZW5kcyIsIm5vcm1hbGl6ZUV4dGVuZHMiLCJ1bmlxdWVFeHRlbmRzIiwibWVyZ2VUc2NvbmZpZ0V4dGVuZHMiLCJlbWl0RGVjbGFyYXRpb25Pbmx5IiwicmV3cml0ZVJlbGF0aXZlSW1wb3J0RXh0ZW5zaW9ucyIsImVuc3VyZVRzRXh0ZW5zaW9uRW1pdENvbXBhdGliaWxpdHkiLCJtZXJnZWRUeXBlcyIsImZpbHRlckV4aXN0aW5nVHlwZXMiLCJ0eXBlTmFtZSIsInR5cGVSb290cyIsImV4cGVyaW1lbnRhbERlY29yYXRvcnMiLCJiYXNlVXJsIiwibW9kdWxlIiwiZGVsZXRlTGVnYWN5TW9kdWxlU2V0dGluZ3MiLCJ2ZXJiYXRpbU1vZHVsZVN5bnRheCIsImdlbmVyYXRlZFR5cGVTZXQiLCJpc0dlbmVyYXRlZFRlc3RHbG9iYWxUeXBlIiwiZXhjbHVkZUZpbGVQYXR0ZXJucyIsImdlbmVyYXRlVnNjb2RlU2V0dGluZ3MiLCJleGNsdWRlRmlsZVBhdHRlcm4iLCJleGNsdWRlU2V0dGluZyIsImdlbmVyYXRlWWFybnJjWW1sIiwieWFybnJjWW1sUGF0aCIsImxhdGVzdFZlcnNpb24iLCJnZXRMYXRlc3RWZXJzaW9uIiwibmV3VmVyc2lvbiIsIm9sZFZlcnNpb24iLCJ2YWxpZE5ld1ZlcnNpb24iLCJzZW12ZXIiLCJ2YWxpZCIsImd0IiwiaXNOZXdlclZlcnNpb24iLCJyZWxlYXNlc1BhdGgiLCJ5YXJucmNQYXRoIiwiZGVmYXVsdFNlbXZlclJhbmdlUHJlZml4Iiwibm9kZUxpbmtlciIsIm5tTW9kZSIsIm5wbU1pbmltYWxBZ2VHYXRlIiwiYXBwcm92ZWRHaXRSZXBvc2l0b3JpZXMiLCJucG1QcmVhcHByb3ZlZFBhY2thZ2VzIiwiY29tcHJlc3Npb25MZXZlbCIsImluamVjdEVudmlyb25tZW50RmlsZXMiLCJlbmFibGVHbG9iYWxDYWNoZSIsIm9yaWdpbmFsTGVuZ3RoIiwicGx1Z2luUGF0aCIsImdldFlhcm5yY1ByZXR0aWVyQXJncyIsInNldHVwTGFiZWxzIiwic2V0dXBMYWJlbCIsImRlbGV0ZUxhYmVsIiwid2FybiIsImNvbG9yIiwicmVxdWVzdCIsIkRFUFJFQ0FURURfU0VDUkVUX05BTUVTIiwicmVxdWlyZSIsImNyZWF0ZVJlcXVpcmUiLCJzZXR1cFNlY3JldHMiLCJkb3RlbnYiLCJzZWNyZXROYW1lIiwic2VjcmV0X25hbWUiLCJrZXlfaWQiLCJrZXlJZCIsImRhdGEiLCJzb2RpdW0iLCJyZWFkeSIsInNlY3JldCIsInJhd0tleSIsImZyb21fYmFzZTY0IiwiYmFzZTY0X3ZhcmlhbnRzIiwiT1JJR0lOQUwiLCJyYXdTZWMiLCJmcm9tX3N0cmluZyIsImVuY0J5dGVzIiwiY3J5cHRvX2JveF9zZWFsIiwiZW5jQmFzZTY0IiwidG9fYmFzZTY0IiwiZW5jcnlwdGVkX3ZhbHVlIiwic2V0dXBHaXRIdWJTZXR0aW5ncyIsImJlZm9yZVJldHJ5IiwiaGFuZGxlRXJyb3IiLCJyZXRyeUNvdW50IiwicmV0cnlMb2dnZXIiLCJzaG91bGRSZXRyeSIsInNsZWVwTWlsbGlzZWNvbmRzIiwidXBkYXRlU2xlZXBNaWxsaXNlY29uZHMiLCJmYWlsZWRDb3VudCIsIndpdGhSZXRyeSIsImFsbG93X2F1dG9fbWVyZ2UiLCJhbGxvd19tZXJnZV9jb21taXQiLCJhbGxvd19zcXVhc2hfbWVyZ2UiLCJhbGxvd19yZWJhc2VfbWVyZ2UiLCJhbGxvd191cGRhdGVfYnJhbmNoIiwiZGVsZXRlX2JyYW5jaF9vbl9tZXJnZSIsInNxdWFzaF9tZXJnZV9jb21taXRfdGl0bGUiLCJzcXVhc2hfbWVyZ2VfY29tbWl0X21lc3NhZ2UiLCJoZWFkZXJzIiwicGFja2FnZU1hbmFnZXJSdW5QbGFjZWhvbGRlciIsInRlbXBsYXRlcyIsImdlbmVyYXRlR2l0SHViVGVtcGxhdGVzIiwiYXBwbHlQYWNrYWdlTWFuYWdlclRlbXBsYXRlIiwiZGlzdGFuY2UiLCJ0ZW1wbGF0ZSIsInBhY2thZ2VNYW5hZ2VyQ29tbWFuZCIsIndiZnlKc29uU2NoZW1hIiwieiIsInJlY29yZCIsIm9wdGlvbmFsIiwiZG9jIiwiZ2V0UGFja2FnZUNvbmZpZyIsImVzbVBhY2thZ2UiLCJwYWNrYWdlSnNvblRleHQiLCJyZWxlYXNlQnJhbmNoZXMiLCJyZWxlYXNlUGx1Z2lucyIsInJlbGVhc2VyY0pzb25QYXRoIiwiZnNwIiwiZmxhdCIsInJlcG9JbmZvIiwiZ2l0Iiwic2ltcGxlR2l0Iiwib3JpZ2luIiwiZ2V0UmVtb3RlcyIsInIiLCJyZW1vdGVVcmwiLCJyZWZzIiwicmVxdWVzdFJlcG9JbmZvIiwiZmV0Y2hSZXBvSW5mbyIsImN1cnJlbnQiLCJoYXNWZXJzaW9uU2V0dGluZ3NGaWxlIiwiZG9ja2VyZmlsZSIsIndiZnlKc29uUGF0aCIsIndiZnlKc29uVGV4dCIsInJlcG9GdWxsTmFtZSIsImZ1bGxfbmFtZSIsInJlcG9BdXRob3IiLCJyZXBvTmFtZSIsInJlcG9QYXJ0cyIsImlzUmVmZXJyZWRCeU90aGVyUmVwbyIsImlzRXNtUGFja2FnZSIsImNvbnRhaW5zQW55IiwiZG9lc0NvbnRhaW5Wc2NvZGVTZXR0aW5nc0pzb24iLCJnaXRodWIiLCJwYXR0ZXJuIiwib3JnIiwicmV0IiwiYXNzaWduIiwicmVkaXJlY3RlZEZ1bGxOYW1lIiwibG9jYXRpb24iLCJnZXRSZWRpcmVjdGVkUmVwb0Z1bGxOYW1lIiwicmVmcmVzaEJ1bkxvY2siLCJyb290RGlyUGF0aCIsImFyZ3YiLCJ5YXJncyIsInBvc2l0aW9uYWwiLCJkZXNjcmliZSIsImRlZmF1bHQiLCJhbGlhcyIsInNraXBEZXBzIiwidmVyYm9zZSIsInBhY2thZ2VKc29uRGlyIiwiVVJMIiwicGF0aG5hbWUiLCJnZXRWZXJzaW9uIiwic3RyaWN0IiwiaGFzSW52YWxpZFBhY2thZ2VDb25maWciLCJwYWNrYWdlc0RpclBhdGgiLCJzdWJEaXJQYXRocyIsImQiLCJhYmJyZXZpYXRpb25Qcm9taXNlIiwic3ViUGFja2FnZUNvbmZpZ3MiLCJzdWJEaXJQYXRoIiwiYWxsUGFja2FnZUNvbmZpZ3MiLCJzaG91bGRSdW5Xb3JrZmxvd3MiLCJ0aGVuIiwiZXhpdENvZGUiXSwibWFwcGluZ3MiOiIycEJBQU9BLGVBQWVDLEVBQU1DLEdB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QixHQUFrQkMsSUFBZSxHQUMzRDhnQixHQUFZOWdCLEdBQ1p1aEIsR0FBYXZoQixHQUNiNGlCLEdBQW9CNWlCLEdBQ3BCdVgsR0FBb0N2WCxHQUNwQ3FaLEdBQXFCclosV0FFakJoYSxFQUFZaWUsYUFFbEIsTUFBTTVlLEVBQTRCLEdBQ2xDLElBQUssTUFBTWMsS0FBVXNpQyxHQUNmdGlDLEVBQU9tbEIsdUJBQXlCbmxCLEVBQU9vbEIsa0NBQ3pDbG1CLEVBQVNrRCxLQUFLc1UsR0FBbUIxVyxFQUFRQSxFQUFPOFcsT0FBU3dyQixFQUFvQixDQUFDdGlDLEtBRTVFQSxFQUFPb2EsVUFBVTJKLGdCQUNuQjdrQixFQUFTa0QsS0FBS3lDLEVBQW9CN0UsSUFFaENBLEVBQU9vYSxVQUFVbUYsTUFDbkJyZ0IsRUFBU2tELEtBQUtyQyxFQUFrQkMsVUFFNUJpakIsR0FBa0JqakIsRUFBUTZaLFNBQzFCaGEsRUFBWWllLGNBQ2I5ZCxFQUFPOFcsUUFBVzlXLEVBQU9zakIsZ0NBR3hCbVEsR0FBdUJ6ekIsU0FDdkIyb0IsR0FBb0Izb0IsRUFBUTZaLEVBQVlxbkIsRUFBS00sVUFFbkR0aUMsRUFBU2tELEtBQUs4d0IsR0FBcUJsekIsSUFDL0JBLEVBQU91Z0MsK0JBQWlDdmdDLEVBQU9zakIsd0JBQ2pEcGtCLEVBQVNrRCxLQUFLMjJCLEdBQXVCLzRCLEtBRW5DQSxFQUFPbWxCLHVCQUF5Qm5sQixFQUFPb2xCLGtDQUN6Q2xtQixFQUFTa0QsS0FBS2kwQixHQUFpQnIyQixJQUU3QmdsQixHQUFrQmhsQixLQUNwQmQsRUFBU2tELEtBQUsrd0IsR0FBb0JuekIsSUFDbENkLEVBQVNrRCxLQUFLa3hCLEdBQXFCdHpCLEtBRWpDQSxFQUFPb2EsVUFBVXNXLFNBQ25CeHhCLEVBQVNrRCxLQUFLMnhCLEdBQTBCL3pCLFdBR3RDdEMsUUFBUTJYLElBQUluVyxTQUNaVyxFQUFZaWUsYUFFbEIsTUFBTS9NLEVBQWlCOEksRUFBV3JULE1BQVEsTUFBUSxPQUU5Q3FULEVBQVdyVCxZQUNQbkksRUFBT0MsMEJBQTBCLGlCQUFrQmYsZ0JBQ2pERyxRQUFRQyxVQUNkcWpDLEdBQWVDLEtBR2pCcGIsR0FBVTlVLEVBQWdCLENBQUMsVUFBVyxrQkFBbUJrd0IsR0FFM0RwYixHQUFVOVUsRUFBZ0IsQ0FBQyxXQUFZa3dCLFNBRWpDekwsR0FBbUIzYixFQUMzQixDQUNJa29CLElBQ0Yzd0IsUUFBUXF4QixTQUFXLEVBRXZCLENBdUJNL1YiLCJ4X2dvb2dsZV9pZ25vcmVMaXN0IjpbMTAsMTEsMTIsMTMsMTRdfQ==
|