@willbooster/wbfy 0.0.0-semantically-released → 1.0.0
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 +18 -0
- package/package.json +3 -3
package/dist/index.js
ADDED
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import e from"node:fs";import t from"node:path";import n from"yargs";import s from"typescript";import{PromisePool as r}from"minimal-promise-pool";import i 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 d from"lodash.clonedeep";import{parse as u}from"smol-toml";import m from"node:os";import f from"node:child_process";import{Octokit as g}from"@octokit/core";import y from"semver";import h from"dotenv";import w from"libsodium-wrappers";import{distance as b}from"fastest-levenshtein";import{simpleGit as v}from"simple-git";import{z as k}from"zod";async function x(e){return new Promise(t=>setTimeout(t,e))}async function j(e){try{return await e()}catch{}}async function _(e){try{return await e()}catch(e){if("object"==typeof e&&e&&"code"in e&&"ENOENT"===e.code)return;throw e}}const S=new class{isVerbose=!1;doesUploadEnvVars=!1};const $=new class{async functionIgnoringException(e,t){S.isVerbose&&console.info(`--------- ${e} start ---------`);try{await t()}catch(t){console.info(`Error occurred in ${e}: ${t instanceof Error?t.stack:String(t)}}`)}S.isVerbose&&console.info(`---------- ${e} end ----------`)}},P={async readFileIgnoringError(t){try{return await e.promises.readFile(t,"utf8")}catch{}},async generateFile(n,s){await e.promises.mkdir(t.dirname(n),{recursive:!0});let r=s.trim();r&&(r+="\n"),await e.promises.writeFile(n,r)}},O=new r;async function E(n){return $.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 i=await e.promises.readFile(r,"utf8"),o=function(e){const t=s.createSourceFile("next.config.js",e,s.ScriptTarget.Latest,!0,s.ScriptKind.JS);let n;const r=e=>{n||(s.isExportAssignment(e)&&s.isObjectLiteralExpression(e.expression)?n=e.expression:s.isBinaryExpression(e)&&e.operatorToken.kind===s.SyntaxKind.EqualsToken&&"module.exports"===e.left.getText(t)&&s.isObjectLiteralExpression(e.right)?n=e.right:s.forEachChild(e,r))};return r(t),n}(i);if(!o)return;const a=new Set(o.properties.map(e=>e.name?.getText())),c=[];if(a.has("eslint")||c.push("eslint: { ignoreDuringBuilds: true }"),a.has("typescript")||c.push("typescript: { ignoreBuildErrors: true }"),0===c.length)return;const l=o.getEnd()-1,p=o.properties.at(-1),d=!!p&&i.slice(p.getEnd(),l).includes(","),u=o.properties.length>0&&!d?", ":"",m=`${i.slice(0,l)}${u}${c.join(", ")}${i.slice(l)}`;await O.run(()=>P.generateFile(r,m))})}const C=e=>({kind:"literal",value:e}),B=(e,t=[])=>({kind:"object",value:F(e,t)}),A=F({forbidOnly:C("!!process.env.CI"),retries:C("process.env.PWDEBUG ? 0 : process.env.CI ? 5 : 1"),use:B({baseURL:C("process.env.NEXT_PUBLIC_BASE_URL"),trace:C("process.env.CI ? 'on-first-retry' : 'retain-on-failure'"),screenshot:C("process.env.CI ? 'only-on-failure' : 'only-on-failure'"),video:C("process.env.CI ? 'retain-on-failure' : 'retain-on-failure'")}),webServer:B({command:C("'yarn start-test-server'"),url:C("process.env.NEXT_PUBLIC_BASE_URL"),reuseExistingServer:C("!!process.env.CI"),timeout:C("300_000"),stdout:C("'pipe'"),stderr:C("'pipe'"),env:C("{\n ...process.env,\n PRISMA_USER_CONSENT_FOR_DANGEROUS_AI_ACTION: 'true',\n}"),gracefulShutdown:C("{\n signal: 'SIGTERM',\n timeout: 500,\n}")})});function F(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 I(n){const r=t.resolve(n.dirPath,"playwright.config.ts");if(e.existsSync(r))return $.functionIgnoringException("fixPlaywrightConfig",async()=>{await async function(n){const s=[t.resolve(n,".env"),t.resolve(n,".env.test"),t.resolve(n,"mise.toml"),t.resolve(n,"mise.test.toml")];for(const t of s)try{const n=await e.promises.readFile(t,"utf8");if(/NEXT_PUBLIC_BASE_URL\s*=/m.test(n))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 i=await e.promises.readFile(r,"utf8"),o=function(e){const t=s.createSourceFile("playwright.config.ts",e,s.ScriptTarget.Latest,!0,s.ScriptKind.TS);let n;const r=e=>{if(!n){if(s.isCallExpression(e)&&"defineConfig"===e.expression.getText(t)){const t=e.arguments[0];if(t&&s.isObjectLiteralExpression(t))return void(n=t)}s.forEachChild(e,r)}};return r(t),n?{source:t,node:n}:void 0}(i);if(!o)return;const a=W(o.node,o.source);if(!a)return;const c=D(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=C(e.isBun?"'bun start-test-server'":"'yarn start-test-server'")}(n,c);const d=N({kind:"object",value:c},0),u=o.node.getStart(o.source),m=o.node.getEnd(),f=`${i.slice(0,u)}${d}${i.slice(m)}`;await O.run(()=>P.generateFile(r,f))})}function D(e,t){const n=new Set(Object.keys(t.properties)),s=[...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})],i={...e.properties};for(const[e,n]of Object.entries(t.properties))i[e]=T(i[e],n);return{extraMembers:s,memberOrder:r,properties:i}}function T(e,t){return"object"===e?.kind&&"object"===t.kind?{kind:"object",value:D(e.value,t.value)}:t}function R(e,t){if(s.isObjectLiteralExpression(e)){const n=W(e,t);return n?{kind:"object",value:n}:C(e.getText(t))}if(s.isArrayLiteralExpression(e)){const n=e.elements.map(e=>R(e,t));return n.some(e=>void 0===e)?C(e.getText(t)):{kind:"array",value:n}}return C(e.getText(t))}function W(e,t){const n={extraMembers:[],memberOrder:[],properties:{}};for(const r of e.properties){if(s.isShorthandPropertyAssignment(r)){const e=r.name.getText(t);n.properties[e]=C(e),n.memberOrder.push({kind:"property",key:e});continue}if(!s.isPropertyAssignment(r)||!s.isIdentifier(r.name)&&!s.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 i=r.name.getText(t);n.properties[i]=e,n.memberOrder.push({kind:"property",key:i})}return n}function N(e,t){const n=" ".repeat(t);if("array"===e.kind){if(0===e.value.length)return"[]";const s=" ".repeat(t+1);return`[\n${e.value.map(e=>{const n=N(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]=`${s}${n[e]}`;return n[0]=`${s}${n[0]}`,n.join("\n")}).join("\n")}\n${n}]`}if("literal"===e.kind)return e.value;const s=" ".repeat(t+1),r=new Set,i=function(e){const t=new Map;for(const[n,s]of e.entries())"property"===s.kind&&t.set(s.key,n);return t}(e.value.memberOrder),o=e.value.memberOrder.flatMap((n,o)=>{if("extra"===n.kind)return[J(e.value.extraMembers[n.index]??"",s)];if(i.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,s)])});return o.push(...Object.entries(e.value.properties).filter(([e])=>!r.has(e)).map(([e,n])=>L(e,n,t,s))),0===o.length?`{\n${n}}`:`{\n${o.join("\n")}\n${n}}`}function L(e,t,n,s){const r=N(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]=`${s}${r[e]}`;return r[0]=`${s}${e}: ${r[0]}`,r.join("\n")}function J(e,t){const n=e.split("\n");n[n.length-1]=`${n.at(-1)},`;for(const[e,s]of n.entries())n[e]=`${t}${s}`;return n.join("\n")}const M=["**/node_modules/**","**/.venv/**","**/test-fixtures/**","**/test/fixtures/**","**/dist/**","**/build/**","**/target/**","**/temp/**","**/tmp/**"];async function U(e){return $.functionIgnoringException("fixPrismaEnvFiles",async()=>{const n=await o.glob(["*.env","*.env.*"],{dot:!0,cwd:e.dirPath,ignore:M});for(const s of n){const n=t.resolve(e.dirPath,s),r=(await i.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 i.writeFile(n,r)}})}const G=(e,t)=>Object.prototype.hasOwnProperty.call(e,t);function z(e,t){let n,s,r;"function"==typeof t?s=t:n=t;const i={},o=[...n??[],...Object.keys(e).sort(s)];for(r of o)G(e,r)&&(i[r]=e[r]);return i}const q=/^(?:( )+|\t+)/,H="space";function Y(e,t,n){return e&&t===H&&1===n}function K(e,t){const n=new Map;let s,r,i=0;for(const o of e.split(/\n/g)){if(!o)continue;const e=o.match(q);if(null===e)i=0,s="";else{const o=e[0].length,a=e[1]?H:"tab";if(Y(t,a,o))continue;a!==s&&(i=0),s=a;let c=1,l=0;const p=o-i;if(i=o,0===p)c=0,l=1;else{const e=Math.abs(p);if(Y(t,a,e))continue;r=V(a,e)}const d=n.get(r);n.set(r,void 0===d?[1,0]:[d[0]+c,d[1]+l])}}return n}function V(e,t){return(e===H?"s":"t")+String(t)}function X(e){if("string"!=typeof e)throw new TypeError("Expected a string");let t=K(e,!0);0===t.size&&(t=K(e,!1));const n=function(e){let t,n=0,s=0;for(const[r,[i,o]]of e)(i>n||i===n&&o>s)&&(n=i,s=o,t=r);return t}(t);let s,r=0,i="";var o;return void 0!==n&&(({type:s,amount:r}={type:"s"===(o=n)[0]?H:"tab",amount:Number(o.slice(1))}),i=function(e,t){return(e===H?" ":"\t").repeat(t)}(s,r)),{amount:r,type:s,indent:i}}function Z(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 Q=e=>(t,...n)=>e.reduce((e,t)=>t(e,...n),t),ee=e=>t=>Array.isArray(t)?e(t):t,te=e=>t=>Array.isArray(t)&&t.every(e=>"string"==typeof e)?e(t):t,ne=te(e=>[...new Set(e)]),se=te(e=>e.toSorted()),re=Q([ne,se]),ie=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,oe=(e,t)=>{const n=ie(s=>(t&&(s=Object.fromEntries(Object.entries(s).map(([e,t])=>[e,n(t)]))),z(s,e)));return n},ae=Object.groupBy||((e,t)=>{const n=Object.create(null);for(const s of e){const e=t(s);n[e]?n[e].push(s):n[e]=[s]}return n}),ce=oe(),le=oe(["type","url"]),pe=oe(["name","email","url"]),de=oe(["lib","bin","man","doc","example","test"]),ue=(e,t)=>ie((n,...s)=>Object.hasOwn(n,e)?{...n,[e]:t(n[e],...s)}:n),me=oe(["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"]),fe=e=>{const[t]=e.split(">"),n=[...t.matchAll("@")];if(!n.length||1===n.length&&0===n[0].index)return{name:e};const s=n.pop().index;return{name:t.substring(0,s),range:t.substring(s+1)}},ge=oe((e,t)=>{const{name:n,range:s}=fe(e),{name:r,range:i}=fe(t);return n!==r?n.localeCompare(r,"en"):s?i?a(c(s),c(i)):1:-1}),ye=e=>{const t=e.indexOf("@",e.startsWith("@")?1:0);return-1===t?e:e.slice(0,t)},he=new Map;function we(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 he.has(t)||he.set(t,e.existsSync("yarn.lock")||e.existsSync(".yarn/")||e.existsSync(".yarnrc.yml")||e.existsSync("pnpm-lock.yaml")||e.existsSync("pnpm-workspace.yaml")),he.get(t)})())}const be=ie((e,t)=>Object.keys(e).length<2?e:we(t)?z(e,(e,t)=>e.localeCompare(t,"en")):z(e)),ve=Q([oe(["packages","catalog"]),ue("packages",re),ue("catalog",be)]),ke=Q([oe(["files","excludedFiles","env","parser","parserOptions","settings","plugins","extends","rules","overrides","globals","processor","noInlineConfig","reportUnusedDisableDirectives"]),ue("env",ce),ue("globals",ce),ue("overrides",ee(e=>e.map(ke))),ue("parserOptions",ce),ue("rules",oe((e,t)=>e.split("/").length-t.split("/").length||e.localeCompare(t))),ue("settings",ce)]),xe=oe(["description","url","href"]),je=Q([ie(e=>z(e,[...Object.keys(e).filter(e=>"overrides"!==e).sort(),"overrides"])),ue("overrides",ee(e=>e.map(Q([ce,ue("options",ce)]))))]),_e=oe(["node","npm","yarn"]),Se=ue("packageManager",oe(["name","version","onFail"])),$e=Q([oe(["peerDependencyRules","neverBuiltDependencies","onlyBuiltDependencies","onlyBuiltDependenciesFile","allowedDeprecatedVersions","allowNonAppliedPatches","updateConfig","auditConfig","requiredScripts","supportedArchitectures","overrides","patchedDependencies","packageExtensions"],!0),ue("overrides",ge)]),Pe=new Set(["install","pack","prepare","publish","restart","shrinkwrap","start","stop","test","uninstall","version"]),Oe=(e,t)=>Object.hasOwn(t,"devDependencies")&&Object.hasOwn(t.devDependencies,e),Ee=/(?<=^|[\s&;<>|(])(?:run-s|npm-run-all2? .*(?:--sequential|--serial|-s))(?=$|[\s&;<>|)])/,Ce=e=>{if(!Oe("npm-run-all",e)&&!Oe("npm-run-all2",e))return!1;return["scripts","betterScripts"].flatMap(t=>e[t]?Object.values(e[t]):[]).some(e=>{return(t=e).includes("*")&&Ee.test(t);var t})};function Be(e,t=""){const n=new Map;for(const s of e){const e=(t?s.slice(t.length+1):s).indexOf(":");if(e>0){const r=s.slice(0,(t?t.length+1:0)+e);n.has(r)||n.set(r,[]),n.get(r).push(s)}else n.has(s)||n.set(s,[]),n.get(s).push(s)}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(),...Be(t.filter(t=>t.startsWith(e+":")),e)]}return t.sort()})}const Ae=ie((e,t)=>{let n=Object.keys(e);const s=new Set;return n=n.map(e=>{const t=e.replace(/^(?:pre|post)/,"");return Pe.has(t)||n.includes(t)?(s.add(t),t):e}),Ce(t)||(n=Be(n)),n=n.flatMap(e=>s.has(e)?[`pre${e}`,e,`post${e}`]:[e]),z(e,n)}),Fe=e=>{const{defaultConditions:t=[],restConditions:n=[]}=ae(e,e=>"default"===e?"defaultConditions":"restConditions");return[...n,...t]},Ie=ie(e=>{const{paths:t=[],conditions:n=[]}=ae(Object.keys(e),e=>e.startsWith(".")?"paths":"conditions");return Object.fromEntries([...t,...Fe(n)].map(t=>[t,Ie(e[t])]))}),De=[{key:"$schema"},{key:"name"},{key:"displayName"},{key:"version"},{key:"stableVersion"},{key:"private"},{key:"description"},{key:"categories",over:ne},{key:"keywords",over:ne},{key:"homepage"},{key:"bugs",over:oe(["url","email"])},{key:"repository",over:le},{key:"funding",over:le},{key:"license",over:le},{key:"qna"},{key:"author",over:pe},{key:"maintainers",over:ee(e=>e.map(pe))},{key:"contributors",over:ee(e=>e.map(pe))},{key:"publisher"},{key:"sideEffects"},{key:"type"},{key:"imports"},{key:"exports",over:Ie},{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:ce},{key:"man"},{key:"directories",over:de},{key:"files",over:ne},{key:"workspaces",over:ve},{key:"binary",over:oe(["module_name","module_path","remote_path","package_name","host"])},{key:"scripts",over:Ae},{key:"betterScripts",over:Ae},{key:"l10n"},{key:"contributes",over:ce},{key:"activationEvents",over:ne},{key:"husky",over:ue("hooks",me)},{key:"simple-git-hooks",over:me},{key:"pre-commit"},{key:"commitlint",over:ce},{key:"lint-staged"},{key:"nano-staged"},{key:"config",over:ce},{key:"nodemonConfig",over:ce},{key:"browserify",over:ce},{key:"babel",over:ce},{key:"browserslist"},{key:"xo",over:ce},{key:"prettier",over:je},{key:"eslintConfig",over:ke},{key:"eslintIgnore"},{key:"npmpkgjsonlint",over:ce},{key:"npmPackageJsonLintConfig",over:ce},{key:"npmpackagejsonlint",over:ce},{key:"release",over:ce},{key:"remarkConfig",over:ce},{key:"stylelint"},{key:"ava",over:ce},{key:"jest",over:ce},{key:"jest-junit",over:ce},{key:"jest-stare",over:ce},{key:"mocha",over:ce},{key:"nyc",over:ce},{key:"c8",over:ce},{key:"tap",over:ce},{key:"oclif",over:oe(void 0,!0)},{key:"resolutions",over:ce},{key:"overrides",over:be},{key:"dependencies",over:be},{key:"devDependencies",over:be},{key:"dependenciesMeta",over:oe((e,t)=>{const n=ye(e),s=ye(t);return n<s?-1:n>s?1:0},!0)},{key:"peerDependencies",over:be},{key:"peerDependenciesMeta",over:oe(void 0,!0)},{key:"optionalDependencies",over:be},{key:"bundledDependencies",over:re},{key:"bundleDependencies",over:re},{key:"extensionPack",over:re},{key:"extensionDependencies",over:re},{key:"flat"},{key:"packageManager"},{key:"engines",over:ce},{key:"engineStrict",over:ce},{key:"devEngines",over:Se},{key:"volta",over:_e},{key:"languageName"},{key:"os"},{key:"cpu"},{key:"preferGlobal",over:ce},{key:"publishConfig",over:ce},{key:"icon"},{key:"badges",over:ee(e=>e.map(xe))},{key:"galleryBanner",over:ce},{key:"preview"},{key:"markdown"},{key:"pnpm",over:$e}],Te=De.map(({key:e})=>e),Re=Q(De.map(({key:e,over:t})=>t?ue(e,t):void 0).filter(Boolean));function We(e,t={}){return function(e,t){if("string"==typeof e){const{indent:n,type:s}=X(e),r="\n"===e.slice(-1)?"\n":"",i=Z(e);e=JSON.parse(e);let o=JSON.stringify(t(e),null,"tab"===s?"\t":n)+r;return"\r\n"===i&&(o=o.replace(/\n/g,i)),o}return t(e)}(e,ie(e=>{let n=t.sortOrder||Te;if(Array.isArray(n)){const t=Object.keys(e),{privateKeys:s=[],publicKeys:r=[]}=ae(t,e=>"_"===e[0]?"privateKeys":"publicKeys");n=[...n,...Te,...r.sort(),...s.sort()]}return Re(z(e,n),e)}))}async function Ne(n){return $.functionIgnoringException("fixTestDirectoriesUpdatingPackageJson",async()=>{await Promise.all(n.map(async n=>{const s=t.join(n,"package.json");if(!e.existsSync(s))return;const r=t.join(n,"test");for(const i of["__tests__","tests"]){const o=t.join(n,i);try{await Le(o,r);const t=JSON.parse(await e.promises.readFile(s,"utf8"));let n=!1;const a=t.scripts??{};for(const[e,t]of Object.entries(a)){const s=t.replaceAll(i,"test");t!==s&&(a[e]=s,n=!0)}if(t.scripts=a,!n)return;await P.generateFile(s,JSON.stringify(We(t),void 0,2))}catch{}}}))})}async function Le(n,s){if(!e.existsSync(s))return void await e.promises.rename(n,s);const r=await e.promises.readdir(n,{withFileTypes:!0});await Promise.all(r.map(async r=>{const i=t.join(n,r.name),o=t.join(s,r.name),a=e.existsSync(o)?await e.promises.stat(o):void 0;r.isDirectory()&&a?.isDirectory()?await Le(i,o):await e.promises.rename(i,o)})),await e.promises.rm(n,{recursive:!0})}async function Je(e,n){return $.functionIgnoringException("fixTypeDefinitions",async()=>{const s=t.resolve(e.dirPath,"@types"),r=e.isRoot&&e.doesContainSubPackageJsons?void 0:t.resolve(e.dirPath,"src","types"),o=await _(()=>i.readdir(s,{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 i.mkdir(t.join(s,o),{recursive:!0}),await O.run(()=>i.rename(t.join(s,e.name),t.join(s,o,"index.d.ts")))):r&&(await i.mkdir(r,{recursive:!0}),await O.run(()=>i.rename(t.join(s,e.name),t.join(r,e.name)))):e.isDirectory()&&r&&!l&&(await i.mkdir(r,{recursive:!0}),await O.run(()=>_(()=>i.rename(t.join(s,e.name,"index.d.ts"),t.join(r,`${e.name}.d.ts`)))))}})}function Me(e,t){return t}function Ue(e,t,n){const s=[...e];for(const[r,i]of t.entries())void 0===s[r]?s[r]=Ge(i,n):ze(e[r],n)&&ze(i,n)?s[r]=l(e[r],i,n):e.includes(i)||s.push(i);return s}function Ge(e,t){return ze(e,t)?t.cloneUnlessOtherwiseSpecified(e,t):e}function ze(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,s]of t)delete e[n],e[n]=s,s&&"object"==typeof s&&!Array.isArray(s)&&qe(s);return e}const He={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"}}},Ye={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"}}},Ke={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 Ve(n){return $.functionIgnoringException("generateWorkflow",async()=>{if(Xe(n.repository))return;const s=t.resolve(n.dirPath,".github","workflows");await e.promises.mkdir(s,{recursive:!0});const r=t.resolve(n.dirPath,".github","semantic.yml");await O.run(()=>e.promises.rm(r,{force:!0,recursive:!0}));const i=await e.promises.readdir(s,{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",...i.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 O.run(()=>Ze(n,s,r))}})}function Xe(e){return e?.endsWith("/reusable-workflows")??!1}async function Ze(n,s,r){const i=t.join(s,`${r}.yml`),o=e.existsSync(t.join(s,"deploy-production.yml"));if("autofix"===r)return void await et(function(e){if(!e.isPublicRepo)return d(Ye);const t=e.isBun?"bun":"yarn",n=[{uses:"actions/checkout@v6"},{uses:"actions/setup-node@v6",with:{"check-latest":!0}},...e.isBun?[{uses:"oven-sh/setup-bun@v1",with:{"bun-version":"latest"}}]:[],{run:`${t} install`},{run:`${t} run cleanup`}];e.packageJson?.scripts?.build&&n.push({run:`${t} run build`});n.push({uses:"autofix-ci/action@v1"});const s=d(He),r=s.jobs.autofix??{"runs-on":"ubuntu-latest"};return s.jobs.autofix={...r,steps:n},s}(n),i);let a=d(r in Ke?Ke[r]:{});try{const t=await e.promises.readFile(i,"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/")&&(Qe(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(s,"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 et(a,i),"sync"===r){if(await e.promises.rm(t.join(s,"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 et(a,t.join(s,"sync-force.yml"))}}}function Qe(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 et(t,n){const s=p.dump(t,{lineWidth:-1,noCompatMode:!0,styles:{"!!null":"empty"}});await e.promises.writeFile(n,s)}async function tt(n){return $.functionIgnoringException("fixTypos",async()=>{if(Xe(n.repository))return;const s=n.dirPath,r=await o.glob("**/*.md",{dot:!0,cwd:s,ignore:M});S.isVerbose&&console.info(`Found ${r.length} markdown files in ${s}`);for(const i of r){const r=t.join(s,i);O.run(async()=>{const t=await e.promises.readFile(r,"utf8");let s=nt(t);s=st(s,n,"doc"),t!==s&&await P.generateFile(r,s)})}const i=await o.glob(["{app,src,test,scripts}/**/*.{cjs,mjs,js,jsx,cts,mts,ts,tsx}","packages/**/{app,src,test,scripts}/**/*.{cjs,mjs,js,jsx,cts,mts,ts,tsx}"],{dot:!0,cwd:s,ignore:M});S.isVerbose&&console.info(`Found ${i.length} TypeScript files in ${s}`);for(const r of i){const i=t.join(s,r);O.run(async()=>{const t=await e.promises.readFile(i,"utf8");let s=t.replaceAll(/\/\*[\s\S]*?\*\//g,e=>nt(e)).replaceAll(/(^|\s)\/\/(.*?)c\.f\./g,"$1//$2cf.").replaceAll(/(^|\s)\/\/(.*?)eg\./g,"$1//$2e.g.").replaceAll(/(^|\s)\/\/(.*?)ie\./g,"$1//$2i.e.");s=st(s,n,"ts"),t!==s&&await P.generateFile(i,s)})}const a=await o.glob("**/*.{csv,htm,html,tsv,xml,yaml,yml}",{dot:!0,cwd:s,ignore:M});S.isVerbose&&console.info(`Found ${a.length} text-based files in ${s}`);for(const r of a){const i=t.join(s,r);O.run(async()=>{const t=await e.promises.readFile(i,"utf8");let s=nt(t);s=st(s,n,"text"),t!==s&&await P.generateFile(i,s)})}await O.promiseAll()})}function nt(e){return e.replaceAll(/\bc\.f\.(?=\s|$)/g,"cf.").replaceAll(/\beg\.(?=\s|$)/g,"e.g.").replaceAll(/\bie\.(?=\s)/g,"i.e.")}function st(e,t,n){for(const[n,s]of Object.entries(t.wbfyJson?.typos?.all??{}))e=e.replaceAll(n,s);for(const[s,r]of Object.entries(t.wbfyJson?.typos?.[n]??{}))e=e.replaceAll(s,r);return e}async function rt(e,n){return $.functionIgnoringException("generateAgentInstructions",async()=>{if(!e.isRoot)return;const s=t.resolve(e.dirPath,"AGENTS_EXTRA.md"),r=await P.readFileIgnoringError(s);for(const[s,i]of[["AGENTS.md","Codex CLI"],["CLAUDE.md","Claude Code"],["GEMINI.md","Gemini CLI"]]){const o=it(e,n,i,r),a=t.resolve(e.dirPath,s);await O.run(()=>P.generateFile(a,o))}const i=t.resolve(e.dirPath,".cursor/rules/general.mdc"),o=function(e,t,n){const s="---\ndescription: General Coding Rules\nglobs:\nalwaysApply: true\n---",r=it(e,t,"Cursor",n);return`${s}\n\n${r}`}(e,n,r);await O.run(()=>P.generateFile(i,o))})}function it(e,t,n,s){const r=e.isBun?"bun":"yarn",i=`\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- Before fixing issues, always investigate the root cause first (e.g., by gathering debug logs, taking screenshots, etc.).\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 type checking and linting only (takes up to 10 minutes).\n - If you are confident your changes will not break any tests, you may use \`check-for-ai\`.\n- Once you have verified your changes, commit 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${ot(t)}\n`.replaceAll(/\.\n\n+-/g,".\n-").replaceAll(/\n{3,}/g,"\n\n").trim(),o=s?.trim().startsWith("#");return i+(s?o?"\n\n"+s.trim():"\n"+s:"")}function ot(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()}async function at(n){return $.functionIgnoringException("generateBiomeJsonc",async()=>{let s={root:n.isRoot,$schema:"./node_modules/@biomejs/biome/configuration_schema.json",extends:["@willbooster/biome-config"]};const r=t.resolve(n.dirPath,"biome.jsonc");try{const t=await e.promises.readFile(r,"utf8"),n=JSON.parse(t);s=l.all([s,n,s],{arrayMerge:Me})}catch{}const i=JSON.stringify(s,void 0,2);await O.run(()=>P.generateFile(r,i))})}const ct=["@exercode/problem-utils","@next/env","@next/eslint-plugin-next","@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","@willbooster/agent-skills","@willbooster/babel-configs","@willbooster/biome-config","@willbooster/eslint-config-blitz-next","@willbooster/eslint-config-js","@willbooster/eslint-config-js-react","@willbooster/eslint-config-next","@willbooster/eslint-config-ts","@willbooster/eslint-config-ts-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","next","react","react-dom"];async function lt(n){return $.functionIgnoringException("generateBunfigToml",async()=>{const s=t.resolve(n.dirPath,"bunfig.toml"),r=e.existsSync(s)?e.readFileSync(s,"utf8"):void 0,i=pt(r);await O.run(()=>P.generateFile(s,i))})}const pt=e=>{const t=function(e){if(!e)return;try{return u(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${ct.map(e=>` "${e}",`).join("\n")}\n]\n`};const dt="# Project-specific settings",ut=/# Project-specific settings[^\n]*\n/gm,mt="# Generated by wbfy",ft=`${dt} (head)\n\n\n${mt}\n`,gt=`\n${dt} (tail)\n`,yt={separator:mt,separatorPrefix:"# Generated by ",defaultHeadUserContent:ft,defaultTailUserContent:gt,async readGitignoreWithoutSeparators(t){try{let n=await e.promises.readFile(t,"utf8");const s=ht(n);return s>0&&(n=n.slice(0,s-1)),n.replaceAll(ut,"").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(ut,`${dt} (head)\n`):ft},getTailUserContent(e){const t=ht(e);return t>0?e.slice(t-1):gt},async isBerryZeroInstallEnabled(t){try{return(await e.promises.readFile(t,"utf8")).includes("\n!.yarn/cache")}catch{return!1}}};function ht(e){const t=e.indexOf(dt),n=e.lastIndexOf(dt);return n>t?n:-1}async function wt(n){return $.functionIgnoringException("generateDockerignore",async()=>{const s=t.resolve(n.dirPath,".dockerignore");if(n.doesContainDockerfile){const e=await P.readFileIgnoringError(s)??"",t=yt.getHeadUserContent(e)+"\n**/.idea\n**/*.sqlite3*\n**/.yarn/install-state.gz\n**/.venv\n"+yt.getTailUserContent(e);await O.run(()=>P.generateFile(s,t))}else await e.promises.rm(s,{force:!0})})}const bt={codeWith2IndentSize:["cjs","mjs","js","jsx","cts","mts","ts","tsx","json","json5","jsonc","cpp","dart","htm","html","pu","puml","rb","vue","xml","yaml","yml","sh"].toSorted(),codeWith4IndentSize:["go","gradle","java","py"].toSorted(),markdownLike:["md"].toSorted(),eslint:["cjs","mjs","js","cts","mts","ts","tsx","jsx"].toSorted(),prettier:["cjs","mjs","java","js","jsx","cts","mts","ts","tsx","json","json5","jsonc","css","htm","html","md","scss","vue","yaml","yml"].toSorted(),biome:["cjs","mjs","js","jsx","cts","mts","ts","tsx","json","json5","jsonc","htm","html","vue","svelte","astro","css","yaml","yml","gql"].toSorted()},vt=`root = true\n\n[*]\ncharset = utf-8\nend_of_line = lf\ninsert_final_newline = true\ntrim_trailing_whitespace = true\n\n${xt(bt.codeWith2IndentSize)}\nindent_size = 2\nindent_style = space\n\n${xt(bt.codeWith4IndentSize)}\nindent_size = 4\nindent_style = space\n\n${xt(bt.markdownLike)}\nmax_line_length = off\ntrim_trailing_whitespace = false\n\n[{Makefile,*.mk}]\nindent_style = tab\n`;async function kt(e){return $.functionIgnoringException("generateEditorconfig",async()=>{const n=t.resolve(e.dirPath,".editorconfig");await O.run(()=>P.generateFile(n,vt))})}function xt(e){return e.length>1?`[*.{${e.join(",")}}]`:`[*.${e[0]}]`}async function jt(n){return $.functionIgnoringException("generateEslintrc",async()=>{const s=t.resolve(n.dirPath,"eslint.config.mjs");if(n.isBun)await O.run(()=>e.promises.rm(s,{force:!0}));else if(n.eslintBase){try{if(!(await e.promises.readFile(s,"utf8")).includes("export { default }"))return}catch{}await O.run(()=>P.generateFile(s,`export { default } from '${n.eslintBase}';`))}})}const _t={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 St(n,s){return $.functionIgnoringException("generateGeminiConfig",async()=>{if(!n.isRoot)return;const r=t.resolve(n.dirPath,".gemini"),i=t.resolve(r,"config.yml"),o=t.resolve(r,"styleguide.md"),a=t.resolve(n.dirPath,"AGENTS_EXTRA.md");let c=d(_t);try{const t=await e.promises.readFile(i,"utf8"),n=p.load(t);c=l.all([c,n,c],{arrayMerge:Me})}catch{}const u=p.dump(c,{lineWidth:-1,noCompatMode:!0,styles:{"!!null":"empty"}}),m=await P.readFileIgnoringError(a),f=m?.trimStart().startsWith("#")?void 0:m,g=`以下のコーディング規約を踏まえて、日本語でレビューしてください。\n\n${ot(s)}${f?`\n${f.trimEnd()}`:""}`,y=[O.run(()=>P.generateFile(i,u)),O.run(()=>P.generateFile(o,g))];await Promise.all(y)})}async function $t(n){return $.functionIgnoringException("generateGeminiSettings",async()=>{if(!n.isRoot)return;const s=t.resolve(n.dirPath,".gemini"),r=t.resolve(s,"settings.json");await e.promises.rm(r,{force:!0})})}const Pt=`* text=auto\n\n*.lockb binary diff=lockb\n\n${[...bt.codeWith2IndentSize,...bt.codeWith4IndentSize,...bt.markdownLike].map(e=>`*.${e} text eol=lf`).join("\n")}\n\ndist/** linguist-generated=true\n`;async function Ot(e){return $.functionIgnoringException("generateGitattributes",async()=>{const n=t.resolve(e.dirPath,".gitattributes");await O.run(()=>P.generateFile(n,Pt))})}const Et=["macos","linux","jetbrains","visualstudiocode","emacs","vim","yarn"];async function Ct(e,n){return $.functionIgnoringException("generateGitignore",async()=>{const s=t.resolve(e.dirPath,".gitignore"),r=await P.readFileIgnoringError(s)??"";let i=yt.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=yt.getTailUserContent(r),a=[...Et];e.doesContainGemfile&&a.push("ruby"),e.doesContainGoMod&&(a.push("go"),i+=`${t.basename(e.dirPath)}\n`),e.doesContainPackageJson&&a.push("node"),e.doesContainPomXml&&(a.push("maven"),i+=".idea/google-java-format.xml\n"),e.doesContainPubspecYaml&&(a.push("flutter","AndroidStudio","ruby"),i+=".flutter-plugins-dependencies\nandroid/key.properties\nios/.bundle\n.idea/runConfigurations.xml\n"),e.doesContainTemplateYaml&&(i+=".aws-sam/\npackaged.yaml\n"),e.doesContainPoetryLock&&(a.push("python"),i+=".venv/\n"),e.depending.blitz&&(i+=".blitz/\n.blitz**\n"),e.depending.next&&a.push("nextjs"),(n.depending.firebase||e.depending.firebase)&&a.push("firebase"),e.depending.prisma&&(i+="*.sqlite3*\n"),e.depending.playwrightTest&&(i+="playwright-report/\ntest-results/\n"),(n.depending.reactNative||e.depending.reactNative)&&(a.push("reactnative"),i+="google-services.json\nandroid/app/src/main/assets/\n"),e.depending.storybook&&a.push("storybookjs"),e.depending.litestream&&(i+="gcp-sa-key.json\n");let c="";for(const e of a){let t=await Ft(e)??"";if(!t){const n=`https://www.toptal.com/developers/gitignore/api/${e}`,s=await fetch(n),r=await s.text();if(!s.ok||r.includes("Attention Required!")||r.includes("<title>"))return void console.error(`Failed to fetch ${n}`);t=r.trim(),await O.run(()=>At(e,t)),S.isVerbose&&console.info(`Fetched ${n}`)}c&&(c+="\n"),c+=t+"\n"}await yt.isBerryZeroInstallEnabled(s)||(c=c.replace("!.yarn/cache","# !.yarn/cache").replace("# .pnp.*",".pnp.*")),(e.doesContainPomXml||e.doesContainPubspecYaml)&&(c=c.replaceAll(/^# .idea\/artifacts$/gm,".idea/artifacts").replaceAll(/^# .idea\/compiler.xml$/gm,".idea/compiler.xml").replaceAll(/^# .idea\/jarRepositories.xml$/gm,".idea/jarRepositories.xml").replaceAll(/^# .idea\/modules.xml$/gm,".idea/modules.xml").replaceAll(/^# .idea\/*.iml$/gm,".idea/*.iml").replaceAll(/^# .idea\/modules$/gm,".idea/modules").replaceAll(/^# *.iml$/gm,"*.iml").replaceAll(/^# *.ipr$/gm,"*.ipr"),e.doesContainPubspecYaml&&(c=c.replaceAll(/^.idea\/modules.xml$/gm,"# .idea/modules.xml"))),c=c.replaceAll(/^.idea\/?$/gm,"# .idea"),(n.depending.reactNative||e.depending.reactNative||e.doesContainPubspecYaml)&&(c=c.replaceAll(/^(.idea\/.+)$/gm,"$1\nandroid/$1"));const l=i+"\n"+c+o;await O.run(()=>P.generateFile(s,l))})}const Bt=t.join(m.homedir(),".cache","wbfy","gitignore");async function At(n,s){await e.promises.mkdir(Bt,{recursive:!0}),await e.promises.writeFile(t.join(Bt,n),s)}async function Ft(n){try{const s=await e.promises.stat(t.join(Bt,n));if(Date.now()-s.mtimeMs>216e5)return;return await e.promises.readFile(t.join(Bt,n),"utf8")}catch{}}async function It(n){return $.functionIgnoringException("generateIdeaSettings",async()=>{const s=t.resolve(n.dirPath,".idea");if(e.existsSync(s)){const r=t.resolve(s,"watcherTasks.xml");await(n.doesContainJavaScript||n.doesContainJavaScriptInPackages||n.doesContainTypeScript||n.doesContainTypeScriptInPackages||n.doesContainPackageJson&&!n.doesContainPubspecYaml&&!n.doesContainGemfile&&!n.doesContainGoMod&&!n.doesContainPomXml?O.run(()=>P.generateFile(r,n.isBun?Rt:Tt)):O.run(()=>e.promises.rm(r,{force:!0})))}})}function Dt(e,t,n,s){return` <TaskOptions isEnabled="true">\n <option name="arguments" value="${t} $FilePathRelativeToProjectRoot$" />\n <option name="checkSyntaxErrors" value="false" />\n <option name="description" />\n <option name="exitCodeBehavior" value="ERROR" />\n <option name="fileExtension" value="${s}" />\n <option name="immediateSync" value="false" />\n <option name="name" value="${n} (.${s})" />\n <option name="output" value="$FilePathRelativeToProjectRoot$" />\n <option name="outputFilters">\n <array />\n </option>\n <option name="outputFromStdout" value="false" />\n <option name="program" value="${e}" />\n <option name="runOnExternalChanges" value="false" />\n <option name="scopeName" value="Project Files" />\n <option name="trackOnlyRoot" value="false" />\n <option name="workingDir" value="$ProjectFileDir$" />\n <envs />\n </TaskOptions>\n`}const Tt=`<?xml version="1.0" encoding="UTF-8"?>\n<project version="4">\n <component name="ProjectTasksOptions">\n${bt.prettier.map(e=>Dt("node","node_modules/.bin/prettier --cache --write","Prettier",e)).join("")}\n </component>\n</project>\n`,Rt=`<?xml version="1.0" encoding="UTF-8"?>\n<project version="4">\n <component name="ProjectTasksOptions">\n${bt.prettier.map(e=>Dt("bun","--bun node_modules/.bin/biome check --fix --no-errors-on-unmatched --skip-parse-errors","Biome",e)).join("")}\n </component>\n</project>\n`;function Wt(e,t,n,s=0){Nt(e,t,n,s)}function Nt(e,t,n,s=0){let r=1;do{const[s,i,o]=Jt(e,t,n);if(r=f.spawnSync(s,i,o).status??1,0===r)break}while(--s>=0);return r}function Lt(e,t,n){const[s,r,i]=Jt(e,t,n);i.stdio="pipe";const o=f.spawnSync(s,r,i),a=o.stderr??"",c="string"==typeof a?a.trim():a.toString().trim();o.error?console.error(`${s} [${r.map(e=>`"${e}"`).join(", ")}] failed with: ${o.error.message}`):c&&console.error(`${s} [${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 Jt(e,t,n){const s={...process.env};return s.PATH&&s.BERRY_BIN_FOLDER&&(s.PATH=s.PATH.split(":").filter(e=>e!==s.BERRY_BIN_FOLDER).join(":")),[e,t,{cwd:n,env:s,encoding:"utf8",shell:!1,stdio:"inherit"}]}const Mt={getLintFixSuffix:e=>e.doesContainJsxOrTsx?' --rule "{ react-hooks/exhaustive-deps: 0 }"':""};const Ut=new class{getOrgAndName(e){const t=e.split(":").at(-1),n=t?.split("/");return[n?.at(-2)??"",n?.at(-1)?.replace(/.git$/,"")??""]}},Gt=new Map;function zt(e){const t=e??"",n=Gt.get(t);if(n)return n;const s=new g({auth:Ht(e)||void 0});return Gt.set(t,s),s}function qt(e){return!!Ht(e)}function Ht(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}const Yt={"@eslint/js":"^9.39.4",eslint:"^9.39.4",typescript:"^5.9.3"};function Kt(e){return e.isWillBoosterConfigs&&!0===e.packageJson?.name?.startsWith("@willbooster/eslint-config-")}const Vt=["@eslint/js","eslint","eslint-config-flat-gitignore","eslint-config-prettier","eslint-plugin-import-x","eslint-plugin-sort-class-members","eslint-plugin-sort-destructure-keys","eslint-plugin-unicorn","eslint-plugin-unused-imports","globals"],Xt=[...Vt,"typescript-eslint","eslint-import-resolver-typescript"],Zt=["eslint-plugin-react","eslint-plugin-react-hooks","eslint-plugin-react-compiler"],Qt={"@willbooster/eslint-config-js":["@willbooster/eslint-config-js",...Vt],"@willbooster/eslint-config-js-react":["@willbooster/eslint-config-js-react",...Vt,...Zt],"@willbooster/eslint-config-ts":["@willbooster/eslint-config-ts",...Xt],"@willbooster/eslint-config-ts-react":["@willbooster/eslint-config-ts-react",...Xt,...Zt],"@willbooster/eslint-config-next":["@willbooster/eslint-config-next","@next/eslint-plugin-next",...Xt,...Zt]};async function en(n,s,r){return $.functionIgnoringException("generatePackageJson",async()=>{await async function(n,s,r){const i=t.resolve(n.dirPath,"package.json"),a=await async function(t){const n=await e.promises.readFile(t,"utf8"),s=JSON.parse(n);return s.scripts=s.scripts??{},s.dependencies=s.dependencies??{},s.devDependencies=s.devDependencies??{},s.peerDependencies=s.peerDependencies??{},s}(i),c=n.isBun?"bun":"yarn";await async function(n,s){"WillBooster LLC"===n.author&&(n.author="WillBooster Inc.");delete n.scripts["sort-package-json"],delete n.scripts["sort-all-package-json"],delete n.scripts["typecheck/warn"],delete n.scripts["typecheck:gen-code"],delete n.scripts["typecheck:codegen"],delete n.dependencies.tslib,delete n.devDependencies["@willbooster/eslint-config"],delete n.devDependencies["@willbooster/eslint-config-react"],delete n.devDependencies["@willbooster/renovate-config"],delete n.devDependencies["@willbooster/tsconfig"],delete n.devDependencies["eslint-import-resolver-node"],delete n.devDependencies["eslint-plugin-prettier"],delete n.devDependencies.lerna,delete n.devDependencies.pinst,delete n.scripts["flutter-format"],delete n.scripts["format-flutter"],delete n.scripts["python-format"],delete n.scripts["format-python"],delete n.scripts.prettier,delete n.scripts["check-all"],await O.run(()=>e.promises.rm(t.resolve(s,"lerna.json"),{force:!0})),delete n.devDependencies["@typescript-eslint/eslint-plugin"],delete n.devDependencies["@typescript-eslint/parser"],delete n.devDependencies["eslint-plugin-import"]}(a,n.dirPath),await async function(n,s,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,"")))})(s.scripts),s.scripts={...s.scripts,...cn(n,s.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,s),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"]}`}(s.scripts,r),n.isBun?delete s.scripts.prettify:s.scripts.prettify=(s.scripts.prettify??"")+await async function(n){const s=t.resolve(n,".prettierignore"),r=await e.promises.readFile(s,"utf8"),i=r.indexOf(yt.separatorPrefix);if(-1===i)return"";const o=r.slice(0,i);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.scripts)}(n,a,c);const p=function(n,s,r){const i=[],a=["prettier","sort-package-json"],c=[];e.existsSync(t.join(s.dirPath,".prettierrc.json"))||e.existsSync(t.join(n.dirPath,".prettierrc.json"))||(r.prettier="@willbooster/prettier-config",a.push("prettier-plugin-java","@willbooster/prettier-config"));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:M}).length>0),0===r.workspaces.length&&delete r.workspaces)}if(n.depending.wb||n.isBun){r.dependencies["@willbooster/wb"]?i.push("@willbooster/wb"):a.push("@willbooster/wb");for(const[e,t]of Object.entries(r.scripts))"string"==typeof t&&(r.scripts[e]=t.replaceAll(/wb\s+db/gu,"wb prisma"))}const p=n.doesContainJavaScript||n.doesContainJavaScriptInPackages||n.doesContainTypeScript||n.doesContainTypeScriptInPackages;p&&(n.isBun?(a.push("@biomejs/biome","@willbooster/biome-config"),delete r.devDependencies.eslint,delete r.devDependencies.micromatch,delete r.devDependencies["typescript-eslint"]):a.push("eslint","micromatch"));p&&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("typescript"),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"));n.eslintBase&&a.push(...Qt[n.eslintBase]);if(n.isWillBoosterConfigs)return{dependencies:i.filter(e=>!e.includes("@willbooster/")),devDependencies:a.filter(e=>!e.includes("@willbooster/")),poetryDevDependencies:c};return{dependencies:i,devDependencies:a,poetryDevDependencies:c}}(n,s,a);await async function(n,s,r,i){r.name||(r.name=t.basename(n.dirPath));n.doesContainSubPackageJsons&&(r.private=!0);r.license||(r.license="UNLICENSED");!r.private&&"UNLICENSED"!==r.license&&s.isPublicRepo&&(r.publishConfig??={},r.publishConfig.access??="public");const[a]=Ut.getOrgAndName(n.repository??"");"WillBooster"!==a&&"WillBoosterLab"!==a||(r.author="WillBooster Inc.");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"]??"")+Mt.getLintFixSuffix(n);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 s=["lib","test","test_driver"].filter(s=>e.existsSync(t.resolve(n.dirPath,s)));s.length>0&&(r.scripts["format-code"]=`dart format $(find ${s.join(" ")} -name generated -prune -o -name '*.freezed.dart' -prune -o -name '*.g.dart' -prune -o -name '*.dart' -print)`,r.scripts.format=(r.scripts.format??"")+" && yarn format-code")}if(n.doesContainPoetryLock){"poetry install"===r.scripts.postinstall&&delete r.scripts.postinstall;const e=await o.glob("**/*.py",{cwd:n.dirPath,dot:!0,ignore:M}),t=new Set;for(const n of e){const[e,s]=n.split("/");e&&s&&t.add(e)}if(t.size>0){const e=[...t].join(" ");r.scripts["format-code"]=`poetry run isort --profile black ${e} && poetry run black ${e}`,r.scripts.lint?r.scripts.lint=`poetry run flake8 ${e} && ${r.scripts.lint}`:(r.scripts.lint=`poetry run flake8 ${e}`,r.scripts["lint-fix"]="yarn lint"),r.scripts.format=(r.scripts.format??"")+" && yarn format-code",i.poetryDevDependencies.push("black","isort","flake8")}}}(n.repository||r.repository)&&(r.repository=function(e,t){const n=on(e);if(n)return an(n,e,t);const s=on(t);if(s)return an(s,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");r.dependencies.prettier||delete r.devDependencies["@types/prettier"]}(n,s,a,p),function(e,t){const n=e.dependencies,s=e.devDependencies;t.dependencies=nn(n,t.dependencies),t.devDependencies=t.devDependencies.filter(e=>!n[e]),t.devDependencies=nn(s,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:s,target:r})=>{if(!t.has(n)||function(e,t){return(e.devDependencies?.[t]||e.dependencies?.[t]||"").includes("workspace")}(e,n))return;const i="dependencies"===r?"devDependencies":"dependencies";Reflect.deleteProperty(e[i],n),e[r][n]=await async function(e){const t=await function(e,t){try{const n=Lt("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}`}(s)}))}(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 async function(n,s){const r=[];for(const e of Object.keys(n))e&&!e.startsWith(":")&&e.includes(":")&&r.push([e,e.replaceAll(":","-")]);if(0===r.length)return;for(const[e,t]of r){const s=n[e];s&&(n[t]=ln(s,r)),delete n[e]}for(const[e,t]of Object.entries(n))t&&(n[e]=ln(t,r));const i=await o.glob(["**/*.{md,cjs,mjs,js,jsx,cts,mts,ts,tsx}","**/Dockerfile"],{cwd:s.dirPath,dot:!0,ignore:M});for(const n of i)await O.run(async()=>{const i=t.join(s.dirPath,n),o=await e.promises.readFile(i,"utf8"),a=ln(o,r);a!==o&&await e.promises.writeFile(i,a)});await O.promiseAll()}(a.scripts,n),await O.run(()=>P.generateFile(i,JSON.stringify(We(a),void 0,2))),r||function(e,t,n,s){const r=n.dependencies.filter(e=>!t.devDependencies?.[e]);tn(e,s,r,!1);const i=n.devDependencies.filter(e=>!t.dependencies?.[e]);tn(e,s,i,!0),n.poetryDevDependencies.length>0&&Wt("poetry",["add","--group","dev",...new Set(n.poetryDevDependencies)],e.dirPath)}(n,a,p,c)}(n,s,r)})}function tn(e,t,n,s){if(0===n.length)return;const r=[...new Set(n)].map(e=>rn(e));e.isBun?Wt(t,["add",...s?["-D"]:[],"--exact",...r],e.dirPath):Wt(t,["add",...s?["-D"]:[],...r],e.dirPath)}function nn(e,t){const n=[...new Set(t)].filter(t=>!e[t]);for(const t of n)e[t]=sn(t);return n}function sn(e){const t=rn(e),n=t.lastIndexOf("@");return n>0?t.slice(n+1):"*"}function rn(e){return function(e){for(const[t,n]of Object.entries(Yt))if(t===e)return`${t}@${n}`}(e)??e}function on(e){if("string"==typeof e){if(!e.startsWith("github:"))return;const[t,n]=Ut.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[,s,r]=n;return`git+https://github.com/${s}/${r}.git`}function an(e,t,n){return{..."object"==typeof t?t:"object"==typeof n?n:void 0,type:"git",url:e}}function cn(e,t){if(e.isBun){const t=e.doesContainTypeScript||e.doesContainTypeScriptInPackages,n={"check-all-for-ai":"bun run check-for-ai && bun run test","check-for-ai":"bun run cleanup"+(t?" && bun run typecheck":""),cleanup:"bun --bun wb lint --fix --format",format:"bun --bun wb lint --format",lint:"bun --bun wb lint","lint-fix":"bun --bun wb lint --fix",test:"bun wb test",typecheck:"bun --bun wb typecheck"};return t||delete n.typecheck,n}{const n=e.doesContainTypeScript||e.doesContainTypeScriptInPackages,s=t.test;let r={"check-all-for-ai":"yarn check-for-ai && yarn test","check-for-ai":`yarn format > /dev/null 2> /dev/null || true${n?" && yarn typecheck":""} && yarn lint-fix --quiet`,cleanup:"yarn format && yarn lint-fix",format:"sort-package-json && yarn prettify",lint:"eslint --color","lint-fix":"yarn lint --fix",prettify:`prettier --cache --color --write "**/{.*/,}*.{${bt.prettier.join(",")}}" "!**/test{-,/}fixtures/**"`,typecheck:"tsc --noEmit"};return e.doesContainSubPackageJsons?r=l({...r},{format:"sort-package-json && yarn prettify && yarn workspaces foreach --all --parallel --verbose run format",lint:"yarn workspaces foreach --all --parallel --verbose run lint","lint-fix":"yarn workspaces foreach --all --parallel --verbose run lint-fix",prettify:`prettier --cache --color --write "**/{.*/,}*.{${bt.prettier.join(",")}}" "!**/packages/**" "!**/test{-,/}fixtures/**"`,test:"CI=1 FORCE_COLOR=3 yarn workspaces foreach --all --verbose run test",typecheck:"yarn workspaces foreach --all --parallel --verbose run typecheck"}):e.depending.pyright&&(r.typecheck=r.typecheck?`${r.typecheck} && `:"",r.typecheck+="pyright"),s?.includes("wb test")&&(r.test=s),n?e.depending.wb&&(r.typecheck="wb typecheck"):delete r.typecheck,r}}function ln(e,t){let n=e;for(const[e,s]of t)n=n.replaceAll(new RegExp(String.raw`(?<![\w-])${pn(e)}(?![\w-])`,"gu"),s);return n}function pn(e){return e.replaceAll(/[.*+?^${}()|[\]\\]/gu,String.raw`\$&`)}const dn={"post-merge":{scripts:{"prepare.sh":{runner:"bash"}}},"pre-push":{scripts:{"check.sh":{runner:"bash"}}}},un={commands:{cleanup:{glob:"",run:""},"check-migrations":{glob:"**/migration.sql",run:"\nif grep -q 'Warnings:' {staged_files}; then\n echo \"Migration SQL files ({staged_files}) contain warnings! Please solve the warnings and commit again.\"\n exit 1\nfi\n".trim()}}},mn='\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 fn(n){return $.functionIgnoringException("generateLefthookUpdatingPackageJson",async()=>{await async function(n){const s=t.resolve(n.dirPath,".lefthook"),r=t.resolve(n.dirPath,".husky"),i=e.existsSync(r),{typecheck:o}=cn(n,{}),a={...dn,"pre-commit":{...un,commands:{...un.commands,cleanup:{...un.commands.cleanup,glob:gn(n),run:yn(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(s,{force:!0,recursive:!0})]),i&&(await Promise.all([e.promises.rm(r,{force:!0,recursive:!0}),e.promises.rm(t.resolve(n.dirPath,".huskyrc.json"),{force:!0})]),Wt("git",["config","--unset","core.hooksPath"],n.dirPath));if(o){const r=function(e){let t;t=e.isBun?e.depending.wb?"bun --bun wb typecheck":"bun run typecheck":e.depending.wb?"yarn wb typecheck":"yarn run typecheck";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${t}\n`.trim();return t}(n);e.mkdirSync(t.join(s,"pre-push"),{recursive:!0}),await O.run(()=>e.promises.writeFile(t.join(s,"pre-push","check.sh"),r+"\n",{mode:493}))}const c=`${mn}\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",s=e.depending.blitz||e.depending.next?" && rm -Rf .next":"";t.push(String.raw`run_if_changed "package\.json" "${n}${s}"`),e.doesContainPoetryLock&&t.push(String.raw`run_if_changed "poetry\.lock" "poetry install"`);e.depending.blitz?t.push(String.raw`run_if_changed ".*\.prisma" "node node_modules/.bin/blitz prisma migrate deploy"`,String.raw`run_if_changed ".*\.prisma" "node node_modules/.bin/blitz prisma generate"`,String.raw`run_if_changed ".*\.prisma" "node node_modules/.bin/blitz codegen"`):e.depending.prisma&&t.push(String.raw`run_if_changed ".*\.prisma" "node node_modules/.bin/dotenv -c development -- node node_modules/.bin/prisma migrate deploy"`,String.raw`run_if_changed ".*\.prisma" "node node_modules/.bin/dotenv -c development -- node node_modules/.bin/prisma generate"`);return t}(n).join("\n")}\n`;e.mkdirSync(t.join(s,"post-merge"),{recursive:!0}),await O.run(()=>e.promises.writeFile(t.resolve(s,"post-merge","prepare.sh"),c,{mode:493}))}(n)})}function gn(e){const t=[...bt.prettier,...bt.eslint,...e.depending.wb||e.isBun?bt.biome:[]];e.doesContainPoetryLock&&t.push("py"),e.doesContainPubspecYaml&&t.push("dart");return`**/*.{${[...new Set(t)].filter(t=>e.isBun||!["astro","gql","svelte"].includes(t)).toSorted().join(",")}}`}function yn(n){if(function(n){if(!n.isRoot)return!1;const s=t.resolve(n.dirPath,"packages","wb","package.json");if(!e.existsSync(s))return!1;try{return"@willbooster/wb"===JSON.parse(e.readFileSync(s,"utf8")).name}catch{return!1}}(n))return'yarn workspace @willbooster/wb start --working-dir "$(git rev-parse --show-toplevel)" lint --fix --format -- {staged_files} && git add -- {staged_files}';if(n.isBun||n.depending.wb){const e=n.isBun?"bun":"yarn";return`${n.depending.wb?(n.isBun?"bun --bun wb":"yarn wb")+" lint --fix --format -- {staged_files}":`${e} run format && ${e} run lint-fix`} && git add -- {staged_files}`}const s=n.doesContainJsxOrTsx||n.doesContainJsxOrTsxInPackages?' --rule "{ react-hooks/exhaustive-deps: 0 }"':"",r=bt.eslint.map(e=>String.raw`\.${e}$`).join("|");return String.raw`
|
|
2
|
+
eslint_files="$(printf '%s\n' {staged_files} | grep -E '(${r})' || true)"
|
|
3
|
+
package_json_files="$(printf '%s\n' {staged_files} | grep -E '(^|/)package\.json$' || true)"
|
|
4
|
+
${n.doesContainPoetryLock?String.raw`python_files="$(printf '%s\n' {staged_files} | grep -E '\.py$' || true)"`:""}
|
|
5
|
+
${n.doesContainPubspecYaml?String.raw`dart_files="$(printf '%s\n' {staged_files} | grep -E '\.dart$' | grep -v 'generated' | grep -v '\.freezed\.dart$' | grep -v '\.g\.dart$' || true)"`:""}
|
|
6
|
+
|
|
7
|
+
node node_modules/.bin/prettier --cache --write --ignore-unknown -- {staged_files}
|
|
8
|
+
if [ -n "$eslint_files" ]; then
|
|
9
|
+
node node_modules/.bin/eslint --color --fix${s} -- $eslint_files
|
|
10
|
+
fi
|
|
11
|
+
if [ -n "$package_json_files" ]; then
|
|
12
|
+
node node_modules/.bin/sort-package-json -- $package_json_files
|
|
13
|
+
fi
|
|
14
|
+
${n.doesContainPoetryLock?'if [ -n "$python_files" ]; then\n poetry run isort --profile black --filter-files $python_files\n poetry run black $python_files\n poetry run flake8 $python_files\nfi':""}
|
|
15
|
+
${n.doesContainPubspecYaml?'if [ -n "$dart_files" ]; then\n dart format $dart_files\nfi':""}
|
|
16
|
+
git add -- {staged_files}
|
|
17
|
+
`.trim()}async function hn(t){return $.functionIgnoringException("generateLintstagedrc",async()=>{await Promise.all([O.run(()=>e.promises.rm(`${t.dirPath}/.lintstagedrc.cjs`,{force:!0})),O.run(()=>e.promises.rm(`${t.dirPath}/.lintstagedrc.js`,{force:!0})),O.run(()=>e.promises.rm(`${t.dirPath}/.lintstagedrc.json`,{force:!0}))])})}async function wn(e){return $.functionIgnoringException("generatePrettierignore",async()=>{const n=t.resolve(e.dirPath,".prettierignore"),s=await P.readFileIgnoringError(n)??"",r=yt.getHeadUserContent(s),i=yt.getTailUserContent(s),o=t.resolve(e.dirPath,".gitignore"),a=await yt.readGitignoreWithoutSeparators(o)||"";let c="";e.doesContainPubspecYaml&&(c="\nandroid/app/\nios/Runner/Assets.xcassets/\npubspec.yaml\n");const l=r+"\n3rd-party/\nandroid/\nios/\nno-format/\ntest-fixtures/\ntest/fixtures/\n*.d.ts\n*.min.js\n.yarn/\n.pnp.js\n"+c+a+i;await O.run(()=>P.generateFile(n,l))})}const bn={venvPath:".",venv:".venv"};async function vn(n){return $.functionIgnoringException("generatePyrightConfigJson",async()=>{let s=d(bn);const r=t.resolve(n.dirPath,"pyrightconfig.json");try{const t=await e.promises.readFile(r,"utf8"),n=JSON.parse(t);s=l.all([s,n,s],{arrayMerge:Me})}catch{}const i=JSON.stringify(s,void 0,2);await O.run(()=>P.generateFile(r,i))})}async function kn(n){return $.functionIgnoringException("generateReadme",async()=>{const s=t.resolve(n.dirPath,"README.md");let r=await e.promises.readFile(s,"utf8");e.existsSync(t.resolve(n.dirPath,".releaserc.json"))&&(r=xn(r,"[](https://github.com/semantic-release/semantic-release)"));const i=n.repository?.slice(n.repository.indexOf(":")+1),o=e.readdirSync(`${n.dirPath}/.github/workflows`);for(const s of o){if(!s.startsWith("test")&&!s.startsWith("deploy"))continue;let o=s;if(o=(o[0]||"").toUpperCase()+o.slice(1,o.indexOf(".")),o=o.replace("-"," "),!i)continue;const a=`[](https://github.com/${i}/actions/workflows/${s})`;e.existsSync(t.resolve(n.dirPath,`.github/workflows/${s}`))&&(r=xn(r,a))}await O.run(()=>P.generateFile(s,r))})}function xn(e,t){e=e.replace(t,"").replaceAll(/\n\n\n+/g,"\n\n");for(let n=0;n<e.length;n++)if("\n"===e[n-1]&&"\n"===e[n]){const s=e.slice(0,n+1);let r=e.slice(n+1);return r.startsWith("[")||r.startsWith("!")||(r=`\n${r}`),`${s}${t}\n${r}`}return`${e}\n${t}\n`}async function jn(n){return $.functionIgnoringException("generateReleaserc",async()=>{const s=t.resolve(n.dirPath,".releaserc.json");if(!e.existsSync(s))return;const r=JSON.parse(await e.promises.readFile(s,"utf8")),i=r.plugins??[];for(let e=0;e<i.length;e++){const t=i[e],n=Array.isArray(t),s=n?t[0]:t,r=n&&t[1]||{};"@semantic-release/commit-analyzer"===s?i[e]=["@semantic-release/commit-analyzer",l.all([r,{preset:"conventionalcommits"}],{arrayMerge:Me})]:"@semantic-release/github"===s&&(i[e]=["@semantic-release/github",l.all([r,{successCommentCondition:!1,failCommentCondition:!1,labels:["r: semantic-release"],releasedLabels:["released :bookmark:"]}],{arrayMerge:Me})])}const o=JSON.stringify(r,void 0,2);await O.run(()=>P.generateFile(s,o))})}const _n={$schema:"https://docs.renovatebot.com/renovate-schema.json",extends:["github>WillBooster/willbooster-configs:renovate.json5"]};async function Sn(n){return $.functionIgnoringException("generateRenovateJson",async()=>{let s=d(_n);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);s=l.all([s,n,s],{arrayMerge:Me}),s.extends=s.extends.filter(e=>"@willbooster"!==e)}catch{}n.depending.blitz&&(s.packageRules??=[],s.packageRules.some(e=>e.matchPackageNames?.includes("next"))||s.packageRules.push({matchPackageNames:["next"],enabled:!1})),await O.run(()=>e.promises.rm(t.resolve(n.dirPath,".dependabot"),{force:!0})),await O.run(()=>e.promises.rm(t.resolve(n.dirPath,".renovaterc.json"),{force:!0}));const i=JSON.stringify(s,void 0,2);await O.run(()=>P.generateFile(r,i))})}async function $n(e){return $.functionIgnoringException("installAgentSkills",async()=>{await Promise.all([i.rm(t.resolve(e.dirPath,".agents"),{force:!0,recursive:!0}),i.rm(t.resolve(e.dirPath,".claude"),{force:!0,recursive:!0}),i.rm(t.resolve(e.dirPath,"skills-lock.json"),{force:!0})])})}const Pn={node:["src","test","scripts"].toSorted(),blitz:["src","test","scripts","db","integrations","mailers"].toSorted()};function On(e){return e.depending.blitz?Pn.blitz:Pn.node}const En={compilerOptions:{alwaysStrict:!0,noUncheckedIndexedAccess:!0,allowSyntheticDefaultImports:!0,esModuleInterop:!0,resolveJsonModule:!0,declaration:!0,sourceMap:!0,importHelpers:!1,noEmit:!1,outDir:"dist"},exclude:["packages/*/test/fixtures","test/fixtures"],include:["packages/*/scripts/**/*","packages/*/src/**/*","packages/*/test/**/*","scripts/**/*","src/**/*","test/**/*"]},Cn={compilerOptions:{alwaysStrict:!0,noUncheckedIndexedAccess:!0,allowSyntheticDefaultImports:!0,esModuleInterop:!0,resolveJsonModule:!0,declaration:!0,sourceMap:!0,importHelpers:!1,noEmit:!1,outDir:"dist"},exclude:["test/fixtures"],include:["scripts/**/*","src/**/*","test/**/*"]};async function Bn(n){return $.functionIgnoringException("generateTsconfig",async()=>{if(n.depending.blitz||n.depending.next)return;let s=d(n.isRoot?En:Cn);const r=function(n){const s=function(e){return On(e).filter(e=>"scripts"!==e&&"test"!==e)}(n),r=On(n).filter(s=>e.existsSync(t.resolve(n.dirPath,s))),i=r.filter(e=>s.includes(e));if(n.isRoot&&n.doesContainSubPackageJsons)return;if(1===r.length&&1===i.length)return`./${i[0]}`}(n),i=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);s.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),r&&(s.compilerOptions={...s.compilerOptions,rootDir:r}),i.length>0&&(s.compilerOptions={...s.compilerOptions,types:i}),n.doesContainJsxOrTsx||n.doesContainJsxOrTsxInPackages?n.isBun||n.depending.reactNative||(s.compilerOptions={...s.compilerOptions,jsx:"react-jsx"}):delete s.compilerOptions?.jsx,n.isRoot&&!n.doesContainSubPackageJsons&&(s.include=s.include?.filter(e=>!e.startsWith("packages/*/")),s.exclude=s.exclude?.filter(e=>!e.startsWith("packages/*/")));const o=t.resolve(n.dirPath,"tsconfig.json");try{const t=await e.promises.readFile(o,"utf8"),n=JSON.parse(t),c=n.compilerOptions?.rootDir,p=(a=n.compilerOptions?.types,"string"==typeof a?[a]:Array.isArray(a)?a.filter(e=>"string"==typeof e):[]);s.extends=function(e,t){const n=[...An(e),...An(t)],s=[...new Set(n)];return 0===s.length?void 0:1===s.length?s[0]:s}(s.extends,n.extends),delete n.extends,delete n.compilerOptions?.jsx,s=l.all([s,n,s],{arrayMerge:Ue}),s.include=s.include?.filter(e=>!e.includes("@types")&&!e.includes("__tests__/")&&!e.includes("tests/")),s.compilerOptions??={},c&&!function(e,t){return void 0===t||"."===e&&"."!==t}(c,r)?s.compilerOptions.rootDir=c:r?s.compilerOptions.rootDir=r:delete s.compilerOptions.rootDir;const d=[...new Set([...p,...i])];d.length>0?s.compilerOptions.types=d:delete s.compilerOptions.types,i.some(e=>"cypress"===e||e.includes("/"))&&delete s.compilerOptions.typeRoots}catch{}var a;qe(s),s.include?.sort(),delete s.compilerOptions?.experimentalDecorators,n.depending.reactNative&&delete s.compilerOptions?.verbatimModuleSyntax;const c=JSON.stringify(s,void 0,2);await O.run(()=>P.generateFile(o,c))})}function An(e){return e?Array.isArray(e)?e:[e]:[]}const Fn=["**/.git/objects/**","**/.git/subtree-cache/**","**/node_modules/**","**/tmp/**","**/temp/**","**/dist/**"];async function In(n){return $.functionIgnoringException("generateVscodeSettings",async()=>{try{const s=t.resolve(n.dirPath,".vscode","settings.json"),r=await e.promises.readFile(s,"utf8");let i=JSON.parse(r);for(const e of Fn)i=l.all([i,Dn(e)]);n.doesContainPoetryLock&&(i=l.all([i,Dn("**/.venv/**")])),n.depending.next&&(i=l.all([i,Dn("**/.next/**")])),"editor.codeActionsOnSave"in i&&delete i["editor.codeActionsOnSave"],"editor.formatOnSave"in i&&delete i["editor.formatOnSave"],qe(i);const o=JSON.stringify(i,void 0,2);await O.run(()=>P.generateFile(s,o))}catch{}})}function Dn(e){return{"files.watcherExclude":{[e]:!0}}}async function Tn(n){return $.functionIgnoringException("generateYarnrcYml",async()=>{const s=t.resolve(n.dirPath,".yarnrc.yml");if(n.isBun)return await O.run(()=>e.promises.rm(s,{force:!0})),await O.run(()=>e.promises.rm(t.resolve(n.dirPath,".yarn"),{force:!0,recursive:!0})),void await O.run(()=>e.promises.rm(t.resolve(n.dirPath,"yarn.lock"),{force:!0,recursive:!0}));const r=Lt("yarn",["--version"],n.dirPath),i=function(e,t){return Lt("npm",["show",e,"version"],t)||"0.0.0"}("@yarnpkg/cli",n.dirPath);(function(e,t){const n=y.valid(e);return!!n&&y.gt(n,y.valid(t)??"0.0.0")})(i,r)&&Wt("yarn",["set","version",i],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-${i}.`)&&await O.run(()=>e.promises.rm(t.join(o,n)));const a=t.resolve(n.dirPath,".yarnrc");await O.run(()=>e.promises.rm(a,{force:!0}));let c={};try{c=p.load(await e.promises.readFile(s,"utf8"))??c}catch{}c.defaultSemverRangePrefix="",c.nodeLinker="node-modules",c.nmMode="hardlinks-global",c.npmMinimalAgeGate="5d",c.npmPreapprovedPackages=["@exercode/*","@willbooster/*","agent-runtime-kit","next","@next/*","react","react-dom"],delete c.compressionLevel,0===c.injectEnvironmentFiles?.length&&delete c.injectEnvironmentFiles,c.enableGlobalCache=!0;const l=c.plugins?.length??0;if(c.plugins=c.plugins?.filter(e=>".yarn/plugins/undefined.cjs"!==e.path)??[],c.plugins.length!==l){const s=t.resolve(n.dirPath,".yarn","plugins","undefined.cjs");await O.run(()=>e.promises.rm(s,{force:!0}))}0===c.plugins.length&&delete c.plugins,await e.promises.writeFile(s,p.dump(c,{lineWidth:-1})),Wt("yarn",["dlx","yarn-plugin-auto-install"],n.dirPath)})}async function Rn(e){return $.functionIgnoringException("setupLabels",async()=>{const[t,n]=Ut.getOrgAndName(e.repository??"");if(!t||!n)return;if("WillBooster"!==t&&"WillBoosterLab"!==t)return;if(!qt(t))return;const s=zt(t);try{await Wn(s,t,n,"d1: x-easy :hedgehog:","EDE9FE"),await Wn(s,t,n,"d2: easy :rabbit2:","DDD6FE"),await Wn(s,t,n,"d3: medium :ox:","C4B5FD"),await Wn(s,t,n,"d4: hard :squid:","A78BFA"),await Wn(s,t,n,"d5: x-hard :whale2:","8B5CF6"),await Wn(s,t,n,"p1: critical :fire::fire::fire:","EF4444"),await Wn(s,t,n,"p2: urgent :fire::fire:","F87171"),await Wn(s,t,n,"p3: important :fire:","FCA5A5"),await Wn(s,t,n,"p4: nice to have :droplet:","FECACA"),await Wn(s,t,n,"r: blitz","5300bc"),await Wn(s,t,n,"r: firebase","ffca28"),await Wn(s,t,n,"r: prisma","0c344b"),await Wn(s,t,n,"r: react","61dafb"),await Wn(s,t,n,"r: svelte","ff3e00"),await Wn(s,t,n,"r: semantic-release","494949"),await Wn(s,t,n,"ready :rocket:","22C55E"),await Wn(s,t,n,"review requested :mag:","FBCA04"),await Wn(s,t,n,"released :bookmark:","6366F1"),await Wn(s,t,n,"s: 0.5h :clock1230:","F3F4F6"),await Wn(s,t,n,"s: 1h :clock1:","E5E7EB"),await Wn(s,t,n,"s: 2h :clock2:","D1D5DB"),await Wn(s,t,n,"s: 3h :clock3:","9CA3AF"),await Wn(s,t,n,"s: 5h :clock5:","6B7280"),await Wn(s,t,n,"s: 8h :clock8:","4B5563"),await Wn(s,t,n,"s: 13h :clock1:","374151"),await Wn(s,t,n,"t: build :hammer:","BFDBFE"),await Wn(s,t,n,"t: chore :broom:","BFDBFE"),await Wn(s,t,n,"t: ci :construction_worker:","BFDBFE"),await Wn(s,t,n,"t: docs :memo:","BFDBFE"),await Wn(s,t,n,"t: feat :sparkles:","BFDBFE"),await Wn(s,t,n,"t: fix :bug:","BFDBFE"),await Wn(s,t,n,"t: perf :zap:","BFDBFE"),await Wn(s,t,n,"t: refactor :recycle:","BFDBFE"),await Wn(s,t,n,"t: style :lipstick:","BFDBFE"),await Wn(s,t,n,"t: test :test_tube:","BFDBFE"),await Wn(s,t,n,"project","24292F"),await Wn(s,t,n,"focused :dart:","22C55E"),await Wn(s,t,n,"gen-pr-all :robot:","00B4D8"),await Wn(s,t,n,"gen-pr-claude :robot:","00B4D8"),await Wn(s,t,n,"gen-pr-codex :robot:","00B4D8"),await Wn(s,t,n,"gen-pr-gemini :robot:","00B4D8"),await Nn(s,t,n,"bug"),await Nn(s,t,n,"documentation"),await Nn(s,t,n,"duplicate"),await Nn(s,t,n,"enhancement"),await Nn(s,t,n,"good first issue"),await Nn(s,t,n,"help wanted"),await Nn(s,t,n,"invalid"),await Nn(s,t,n,"question"),await Nn(s,t,n,"wontfix"),await Nn(s,t,n,"ready"),await Nn(s,t,n,"review requested"),await Nn(s,t,n,"released"),await Nn(s,t,n,"semantic-release"),await Nn(s,t,n,"llm-pr :robot:"),await Nn(s,t,n,"ai-pr :robot:")}catch(e){console.warn("Skip setupLabels due to:",e?.stack??e)}})}async function Wn(e,t,n,s,r){try{await e.request("POST /repos/{owner}/{repo}/labels",{owner:t,repo:n,name:s,color:r})}catch{await e.request("PATCH /repos/{owner}/{repo}/labels/{name}",{owner:t,repo:n,name:s,color:r})}}async function Nn(e,t,n,s){try{await e.request("DELETE /repos/{owner}/{repo}/labels/{name}",{owner:t,repo:n,name:s})}catch{}}const Ln=["READY_DISCORD_WEBHOOK_URL","GH_BOT_PAT","PUBLIC_GH_BOT_PAT"];async function Jn(e){return $.functionIgnoringException("setupSecrets",async()=>{const[n,s]=Ut.getOrgAndName(e.repository??"");if(!n||!s||"WillBoosterLab"!==n)return;if(!qt(n)||!S.doesUploadEnvVars)return;const r=h.config({path:t.resolve(e.dirPath,".env")}).parsed??{};if(0===Object.keys(r).length)return;const i=zt(n);try{for(const e of Ln)try{await i.request("DELETE /repos/{owner}/{repo}/actions/secrets/{secret_name}",{owner:n,repo:s,secret_name:e})}catch{}const e=await i.request("GET /repos/{owner}/{repo}/actions/secrets/public-key",{owner:n,repo:s}),{key:t,key_id:o}=e.data;await w.ready;for(const[e,a]of Object.entries(r)){if("GH_BOT_PAT"===e||"GH_BOT_PAT_FOR_WILLBOOSTER"===e||"GH_BOT_PAT_FOR_WILLBOOSTERLAB"===e)continue;const r=w.from_base64(t,w.base64_variants.ORIGINAL),c=w.from_string(a),l=w.crypto_box_seal(c,r),p=w.to_base64(l,w.base64_variants.ORIGINAL);await i.request("PUT /repos/{owner}/{repo}/actions/secrets/{secret_name}",{owner:n,repo:s,secret_name:e,encrypted_value:p,key_id:o})}}catch(e){console.warn("Skip setupSecrets due to:",e?.stack??e)}})}async function Mn(e){const[t,n]=Ut.getOrgAndName(e.repository??"");if(!t||!n)return;if("WillBooster"!==t&&"WillBoosterLab"!==t)return;if(!qt(t))return;const s=zt(t);await async function(e,{beforeRetry:t,handleError:n,retryCount:s=3,retryLogger:r,shouldRetry:i,sleepMilliseconds:o=0,updateSleepMilliseconds:a}={}){let c=0;for(;;)try{return await e(c)}catch(e){if(await(n?.(e)),c++,c>=s)throw e;if(i&&!i(e))throw e;o>0&&await x(o),a&&(o=a(o)),r?.(`Retry due to: ${e}\n${e instanceof Error?"---\n"+(e.stack??""):""}`),await(t?.(e))}}(()=>s.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 Un="__PM_RUN__",Gn={"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., \`${Un} test\`) passed.\n - The lint command (e.g., \`${Un} 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 zn(n){return $.functionIgnoringException("generateGitHubTemplates",async()=>{for(const[s,r]of Object.entries(Gn)){const i=qn(r,n),o=t.resolve(n.dirPath,".github",s);if(e.existsSync(o)){const t=await e.promises.readFile(o,"utf8");if(b(t,i)>i.length/2)continue}await e.promises.mkdir(t.resolve(n.dirPath,".github"),{recursive:!0}),await O.run(()=>P.generateFile(o,i))}})}function qn(e,t){const n=t.isBun?"bun run":"yarn";return e.replaceAll(Un,n)}const Hn=k.object({typos:k.object({all:k.record(k.string(),k.string()).optional(),doc:k.record(k.string(),k.string()).optional(),ts:k.record(k.string(),k.string()).optional(),text:k.record(k.string(),k.string()).optional()}).optional()});async function Yn(n,s){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"),s=JSON.parse(await i.readFile(e,"utf8"));d=s?.branches??[],u=s?.plugins?.flat()??[]}catch{}const m="packages"!==t.basename(t.resolve(n,".."))||!e.existsSync(t.resolve(n,"..","..","package.json"));let f;m&&(f=await async function(e,t){const n=v(e),s=(await n.getRemotes(!0)).find(e=>"origin"===e.name),r=s?.refs.fetch??s?.refs.push;if("string"==typeof r){const e=await Vn(r);if(e)return e}const i="string"==typeof t.repository?t.repository:t.repository?.url;if(i){const e=await Vn(i);if(e&&"Not Found"!==e.message)return e}}(n,l));let g=function(n){const s=t.resolve(n);return e.existsSync(t.join(s,"mise.toml"))||e.existsSync(t.join(s,".mise.toml"))||e.existsSync(t.join(s,".tool-versions"))}(n);for(const s of["java","node","python"])if(e.existsSync(t.resolve(n,`.${s}-version`))){g=!0;break}let y="";try{y=await i.readFile(t.resolve(n,"Dockerfile"),"utf8")}catch{}const h=t.resolve(n,"wbfy.json");let w;try{const e=await i.readFile(h,"utf8");w=Hn.parse(JSON.parse(e))}catch{}const b="string"==typeof f?.full_name?f.full_name:void 0;let k,x;if(b){const e=b.split("/");e.length>=2&&(k=e[0],x=e[1])}const j=b?`github:${b}`: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:s?.isBun||e.existsSync(t.join(n,"bun.lock")),isEsmPackage:p,isWillBoosterConfigs:r.includes("/willbooster-configs"),doesContainSubPackageJsons:Kn("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")),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:Kn("{app,src,test,scripts}/**/*.{cjs,mjs,js,jsx}",n),doesContainTypeScript:Kn("{app,src,test,scripts}/**/*.{cts,mts,ts,tsx}",n),doesContainJsxOrTsx:Kn("{app,src,test}/**/*.{t,j}sx",n),doesContainJavaScriptInPackages:Kn("packages/**/{app,src,test,scripts}/**/*.{cjs,mjs,js,jsx}",n),doesContainTypeScriptInPackages:Kn("packages/**/{app,src,test,scripts}/**/*.{cts,mts,ts,tsx}",n),doesContainJsxOrTsxInPackages:Kn("packages/**/{app,src,test}/**/*.{t,j}sx",n),hasStartTestServer:!!l.scripts?.["start-test-server"],depending:{blitz:!!a.blitz,firebase:!!c["firebase-tools"],genI18nTs:!!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(_.isBun||(_.eslintBase=function(e){if(e.depending.next)return"@willbooster/eslint-config-next";if(e.doesContainTypeScript)return e.doesContainJsxOrTsx?"@willbooster/eslint-config-ts-react":"@willbooster/eslint-config-ts";if(e.doesContainJsxOrTsx)return"@willbooster/eslint-config-js-react";if(e.doesContainJavaScript)return"@willbooster/eslint-config-js"}(_)),_.doesContainGemfile||_.doesContainGoMod||_.doesContainPackageJson||_.doesContainPoetryLock||_.doesContainPomXml||_.doesContainPubspecYaml||_.doesContainTemplateYaml)return _}catch{}}function Kn(e,t){return o.globSync(e,{dot:!0,cwd:t,ignore:M}).length>0}async function Vn(e){const[t,n]=Ut.getOrgAndName(e);if(!t||!n)return;const s={full_name:`${t}/${n}`};try{const e=await zt().request("GET /repos/{owner}/{repo}",{owner:t,repo:n});Object.assign(s,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 s=t?.headers?.location;if("string"!=typeof s)return;const[r,i]=Ut.getOrgAndName(s);if(!r||!i)return;return`${r}/${i}`}(e);t&&(s.full_name=t)}return s}function Xn(n){const s=t.join(n,"bun.lock"),r=t.join(n,".bun.lock.wbfy-backup");e.rmSync(r,{force:!0}),e.existsSync(s)&&(e.copyFileSync(s,r),e.rmSync(s,{force:!0}));const i=Nt("bun",["update"],n);if(0!==i||!e.existsSync(s))throw e.existsSync(r)&&(e.copyFileSync(r,s),e.rmSync(r,{force:!0})),new Error(`Failed to regenerate ${s}: bun update exited with status ${i}`);e.rmSync(r,{force:!0})}await async function(){const s=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;S.isVerbose=s.verbose,S.doesUploadEnvVars=s.env;for(const n of s.paths){const r=t.join(n,"packages"),i=(await j(()=>e.promises.readdir(r,{withFileTypes:!0}))??[]).filter(e=>e.isDirectory()).map(e=>t.join(r,e.name));await Ne([n,...i]);const o=await Yn(n);if(S.isVerbose,!o){console.error(`there is no valid package.json in ${n}`);continue}const a=tt(o),c=(await Promise.all(i.map(e=>Yn(e,o)))).filter(e=>!!e),l=[o,...c];if(S.isVerbose)for(const e of l)console.info(e);await Tn(o),o.isBun&&await lt(o);const p=!Xe(o.repository)&&(o.repository?.startsWith("github:WillBooster/")||o.repository?.startsWith("github:WillBoosterLab/"));await Promise.all([U(o),a.then(()=>kn(o)),rt(o,l),wt(o),kt(o),St(o,l),$t(o),Ot(o),zn(o),It(o),Sn(o),jn(o),...p?[Ve(o)]:[],Rn(o),Jn(o),Mn(o),fn(o),hn(o)]),await O.promiseAll();const d=[];for(const e of l)Kt(e)||((e.doesContainTypeScript||e.doesContainTypeScriptInPackages)&&d.push(Je(e,e.isRoot?l:[e])),e.depending.playwrightTest&&d.push(I(e)),e.depending.next&&d.push(E(e)),await Ct(e,o),await O.promiseAll(),(e.isRoot||e.doesContainPackageJson)&&(await wn(e),await en(e,o,s.skipDeps),d.push(hn(e)),e.doesContainVscodeSettingsJson&&e.doesContainPackageJson&&d.push(In(e)),(e.doesContainTypeScript||e.doesContainTypeScriptInPackages)&&d.push(Bn(e)),(e.doesContainJavaScript||e.doesContainJavaScriptInPackages||e.doesContainTypeScript||e.doesContainTypeScriptInPackages)&&(o.isBun&&d.push(at(e)),o.isWillBoosterConfigs||d.push(jt(e))),e.depending.pyright&&d.push(vn(e))));await Promise.all(d),await O.promiseAll();const u=o.isBun?"bun":"yarn";o.isBun?await $.functionIgnoringException("refreshBunLock",async()=>{await Promise.resolve(),Xn(n)}):Wt(u,["install","--no-immutable"],n),Wt(u,["cleanup"],n),await $n(o)}}();
|
|
18
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VzIjpbIi4uLy4uL3NoYXJlZC1saWIvc3JjL3NsZWVwLnRzIiwiLi4vLi4vc2hhcmVkLWxpYi9zcmMvZXJyb3IudHMiLCIuLi9zcmMvb3B0aW9ucy50cyIsIi4uL3NyYy9sb2dnZXIudHMiLCIuLi9zcmMvdXRpbHMvZnNVdGlsLnRzIiwiLi4vc3JjL3V0aWxzL3Byb21pc2VQb29sLnRzIiwiLi4vc3JjL2ZpeGVycy9uZXh0Q29uZmlnLnRzIiwiLi4vc3JjL2ZpeGVycy9wbGF5d3JpZ2h0Q29uZmlnLnRzIiwiLi4vc3JjL3V0aWxzL2dsb2JVdGlsLnRzIiwiLi4vc3JjL2ZpeGVycy9wcmlzbWEudHMiLCIuLi8uLi8uLi9ub2RlX21vZHVsZXMvc29ydC1vYmplY3Qta2V5cy9pbmRleC5qcyIsIi4uLy4uLy4uL25vZGVfbW9kdWxlcy9kZXRlY3QtaW5kZW50L2luZGV4LmpzIiwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2RldGVjdC1uZXdsaW5lL2luZGV4LmpzIiwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3NvcnQtcGFja2FnZS1qc29uL2luZGV4LmpzIiwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2lzLXBsYWluLW9iai9pbmRleC5qcyIsIi4uL3NyYy9maXhlcnMvdGVzdERpcmVjdG9yeS50cyIsIi4uL3NyYy9maXhlcnMvdHlwZURlZmluaXRpb24udHMiLCIuLi9zcmMvdXRpbHMvbWVyZ2VVdGlsLnRzIiwiLi4vc3JjL3V0aWxzL29iamVjdFV0aWwudHMiLCIuLi9zcmMvZ2VuZXJhdG9ycy93b3JrZmxvdy50cyIsIi4uL3NyYy9maXhlcnMvdHlwb3MudHMiLCIuLi9zcmMvZ2VuZXJhdG9ycy9hZ2VudHMudHMiLCIuLi9zcmMvZ2VuZXJhdG9ycy9iaW9tZS50cyIsIi4uL3NyYy9nZW5lcmF0b3JzL2J1bmZpZy50cyIsIi4uL3NyYy91dGlscy9pZ25vcmVGaWxlVXRpbC50cyIsIi4uL3NyYy9nZW5lcmF0b3JzL2RvY2tlcmlnbm9yZS50cyIsIi4uL3NyYy91dGlscy9leHRlbnNpb25zLnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvZWRpdG9yY29uZmlnLnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvZXNsaW50Q29uZmlnLnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvZ2VtaW5pQ29uZmlnLnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvZ2VtaW5pU2V0dGluZ3MudHMiLCIuLi9zcmMvZ2VuZXJhdG9ycy9naXRhdHRyaWJ1dGVzLnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvZ2l0aWdub3JlLnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvaWRlYS50cyIsIi4uL3NyYy91dGlscy9zcGF3blV0aWwudHMiLCIuLi9zcmMvdXRpbHMvZXNsaW50VXRpbC50cyIsIi4uL3NyYy91dGlscy9naXRodWJVdGlsLnRzIiwiLi4vc3JjL3V0aWxzL3dpbGxib29zdGVyQ29uZmlnc1V0aWwudHMiLCIuLi9zcmMvZ2VuZXJhdG9ycy9wYWNrYWdlSnNvbi50cyIsIi4uL3NyYy91dGlscy90c2NvbmZpZ0Jhc2UudHMiLCIuLi9zcmMvZ2l0aHViL2NvbW1pdC50cyIsIi4uL3NyYy9nZW5lcmF0b3JzL2xlZnRob29rLnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvbGludHN0YWdlZHJjLnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvcHJldHRpZXJpZ25vcmUudHMiLCIuLi9zcmMvZ2VuZXJhdG9ycy9weXJpZ2h0Q29uZmlnLnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvcmVhZG1lLnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvcmVsZWFzZXJjLnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvcmVub3ZhdGVKc29uLnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvc2tpbGxzLnRzIiwiLi4vc3JjL3V0aWxzL3NyY0RpcmVjdG9yaWVzLnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvdHNjb25maWcudHMiLCIuLi9zcmMvZ2VuZXJhdG9ycy92c2NvZGVTZXR0aW5ncy50cyIsIi4uL3NyYy9nZW5lcmF0b3JzL3lhcm5yYy50cyIsIi4uL3NyYy9naXRodWIvbGFiZWwudHMiLCIuLi9zcmMvZ2l0aHViL3NlY3JldC50cyIsIi4uL3NyYy9naXRodWIvc2V0dGluZ3MudHMiLCIuLi9zcmMvZ2l0aHViL3RlbXBsYXRlLnRzIiwiLi4vc3JjL3BhY2thZ2VDb25maWcudHMiLCIuLi9zcmMvaW5kZXgudHMiXSwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHNsZWVwKG1pbGxpc2Vjb25kczogbnVtYmVyKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBuZXcgUHJvbWlzZSgocikgPT4gc2V0VGltZW91dChyLCBtaWxsaXNlY29uZHMpKTtcbn1cbiIsImltcG9ydCB7IHNsZWVwIH0gZnJvbSAnLi9zbGVlcC5qcyc7XG5cbi8qKlxuICogQ29udmVydCBhbiBvYmplY3QgdG8gYW4gZXJyb3IuXG4gKiBAcGFyYW0gb2JqIFRoZSBvYmplY3QgdG8gY29udmVydC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGVycm9yaWZ5KG9iajogdW5rbm93bik6IEVycm9yIHtcbiAgaWYgKG9iaiBpbnN0YW5jZW9mIEVycm9yKSByZXR1cm4gb2JqO1xuICBpZiAodHlwZW9mIG9iaiA9PT0gJ3N0cmluZycpIHJldHVybiBuZXcgRXJyb3Iob2JqKTtcbiAgdHJ5IHtcbiAgICByZXR1cm4gbmV3IEVycm9yKEpTT04uc3RyaW5naWZ5KG9iaikpO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gbmV3IEVycm9yKFN0cmluZyhvYmopKTtcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gaWdub3JlRXJyb3I8VD4oZm46ICgpID0+IFQpOiBUIHwgdW5kZWZpbmVkIHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gZm4oKTtcbiAgfSBjYXRjaCB7XG4gICAgLy8gZG8gbm90aGluZ1xuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpZ25vcmVFbm9lbnQ8VD4oZm46ICgpID0+IFQpOiBUIHwgdW5kZWZpbmVkIHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gZm4oKTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBpZiAodHlwZW9mIGVycm9yID09PSAnb2JqZWN0JyAmJiBlcnJvciAmJiAnY29kZScgaW4gZXJyb3IgJiYgZXJyb3IuY29kZSA9PT0gJ0VOT0VOVCcpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhyb3cgZXJyb3I7XG4gIH1cbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGlnbm9yZUVycm9yQXN5bmM8VD4oZm46ICgpID0+IFByb21pc2U8VD4pOiBQcm9taXNlPFQgfCB1bmRlZmluZWQ+IHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gYXdhaXQgZm4oKTtcbiAgfSBjYXRjaCB7XG4gICAgLy8gZG8gbm90aGluZ1xuICB9XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBpZ25vcmVFbm9lbnRBc3luYzxUPihmbjogKCkgPT4gUHJvbWlzZTxUPik6IFByb21pc2U8VCB8IHVuZGVmaW5lZD4ge1xuICB0cnkge1xuICAgIHJldHVybiBhd2FpdCBmbigpO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGlmICh0eXBlb2YgZXJyb3IgPT09ICdvYmplY3QnICYmIGVycm9yICYmICdjb2RlJyBpbiBlcnJvciAmJiBlcnJvci5jb2RlID09PSAnRU5PRU5UJykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aHJvdyBlcnJvcjtcbiAgfVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIFJldHJ5T3B0aW9ucyB7XG4gIGJlZm9yZVJldHJ5PzogKGVycm9yOiB1bmtub3duKSA9PiBQcm9taXNlPHZvaWQ+O1xuICBoYW5kbGVFcnJvcj86IChlcnJvcjogdW5rbm93bikgPT4gUHJvbWlzZTx2b2lkPjtcbiAgcmV0cnlDb3VudD86IG51bWJlcjtcbiAgcmV0cnlMb2dnZXI/OiAobWVzc2FnZTogc3RyaW5nKSA9PiB2b2lkO1xuICBzaG91bGRSZXRyeT86IChlcnJvcjogdW5rbm93bikgPT4gYm9vbGVhbjtcbiAgc2xlZXBNaWxsaXNlY29uZHM/OiBudW1iZXI7XG4gIHVwZGF0ZVNsZWVwTWlsbGlzZWNvbmRzPzogKHNsZWVwTWlsbGlzZWNvbmRzOiBudW1iZXIpID0+IG51bWJlcjtcbn1cblxuLyoqXG4gKiBSZXRyeSB0aGUgZ2l2ZW4gZnVuY3Rpb24uXG4gKiBAcGFyYW0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gcmV0cnkuXG4gKiBAcGFyYW0gYmVmb3JlUmV0cnkgVGhlIGZ1bmN0aW9uIHRvIGNhbGwgaW1tZWRpYXRlbHkgYmVmb3JlIHJldHJ5aW5nLlxuICogQHBhcmFtIGhhbmRsZUVycm9yIFRoZSBmdW5jdGlvbiB0byBjYWxsIHdoZW4gYW4gZXJyb3Igb2NjdXJzLlxuICogQHBhcmFtIHJldHJ5Q291bnQgVGhlIG1heGltdW0gbnVtYmVyIG9mIHJldHJpZXMuXG4gKiBAcGFyYW0gcmV0cnlMb2dnZXIgVGhlIGZ1bmN0aW9uIHRvIGxvZyByZXRyeWluZy5cbiAqIEBwYXJhbSBzbGVlcE1pbGxpc2Vjb25kcyBUaGUgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcyB0byBzbGVlcCBiZWZvcmUgcmV0cnlpbmcuXG4gKiBAcGFyYW0gdXBkYXRlU2xlZXBNaWxsaXNlY29uZHMgVGhlIGZ1bmN0aW9uIHRvIHVwZGF0ZSBzbGVlcCBtaWxsaXNlY29uZHMgYWZ0ZXIgZWFjaCByZXRyeS5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHdpdGhSZXRyeTxUPihcbiAgZnVuYzogKGZhaWxlZENvdW50OiBudW1iZXIpID0+IFQgfCBQcm9taXNlPFQ+LFxuICB7XG4gICAgYmVmb3JlUmV0cnksXG4gICAgaGFuZGxlRXJyb3IsXG4gICAgcmV0cnlDb3VudCA9IDMsXG4gICAgcmV0cnlMb2dnZXIsXG4gICAgc2hvdWxkUmV0cnksXG4gICAgc2xlZXBNaWxsaXNlY29uZHMgPSAwLFxuICAgIHVwZGF0ZVNsZWVwTWlsbGlzZWNvbmRzLFxuICB9OiBSZXRyeU9wdGlvbnMgPSB7fVxuKTogUHJvbWlzZTxUPiB7XG4gIGxldCBmYWlsZWRDb3VudCA9IDA7XG4gIGZvciAoOzspIHtcbiAgICB0cnkge1xuICAgICAgcmV0dXJuIGF3YWl0IGZ1bmMoZmFpbGVkQ291bnQpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBhd2FpdCBoYW5kbGVFcnJvcj8uKGVycm9yKTtcbiAgICAgIGZhaWxlZENvdW50Kys7XG4gICAgICBpZiAoZmFpbGVkQ291bnQgPj0gcmV0cnlDb3VudCkge1xuICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgIH1cbiAgICAgIGlmIChzaG91bGRSZXRyeSAmJiAhc2hvdWxkUmV0cnkoZXJyb3IpKSB7XG4gICAgICAgIHRocm93IGVycm9yO1xuICAgICAgfVxuICAgICAgaWYgKHNsZWVwTWlsbGlzZWNvbmRzID4gMCkge1xuICAgICAgICBhd2FpdCBzbGVlcChzbGVlcE1pbGxpc2Vjb25kcyk7XG4gICAgICB9XG4gICAgICBpZiAodXBkYXRlU2xlZXBNaWxsaXNlY29uZHMpIHtcbiAgICAgICAgc2xlZXBNaWxsaXNlY29uZHMgPSB1cGRhdGVTbGVlcE1pbGxpc2Vjb25kcyhzbGVlcE1pbGxpc2Vjb25kcyk7XG4gICAgICB9XG4gICAgICByZXRyeUxvZ2dlcj8uKGBSZXRyeSBkdWUgdG86ICR7ZXJyb3J9XG4ke2Vycm9yIGluc3RhbmNlb2YgRXJyb3IgPyAnLS0tXFxuJyArIChlcnJvci5zdGFjayA/PyAnJykgOiAnJ31gKTtcbiAgICAgIGF3YWl0IGJlZm9yZVJldHJ5Py4oZXJyb3IpO1xuICAgIH1cbiAgfVxufVxuIiwiY2xhc3MgT3B0aW9ucyB7XG4gIGlzVmVyYm9zZSA9IGZhbHNlO1xuICBkb2VzVXBsb2FkRW52VmFycyA9IGZhbHNlO1xufVxuXG5leHBvcnQgY29uc3Qgb3B0aW9ucyA9IG5ldyBPcHRpb25zKCk7XG4iLCJpbXBvcnQgeyBvcHRpb25zIH0gZnJvbSAnLi9vcHRpb25zLmpzJztcblxuY2xhc3MgTG9nZ2VyIHtcbiAgYXN5bmMgZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbihuYW1lOiBzdHJpbmcsIGZ1bmM6ICgpID0+IFByb21pc2U8dm9pZD4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAob3B0aW9ucy5pc1ZlcmJvc2UpIHtcbiAgICAgIGNvbnNvbGUuaW5mbyhgLS0tLS0tLS0tICR7bmFtZX0gc3RhcnQgLS0tLS0tLS0tYCk7XG4gICAgfVxuICAgIHRyeSB7XG4gICAgICBhd2FpdCBmdW5jKCk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNvbnNvbGUuaW5mbyhgRXJyb3Igb2NjdXJyZWQgaW4gJHtuYW1lfTogJHtlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3Iuc3RhY2sgOiBTdHJpbmcoZXJyb3IpfX1gKTtcbiAgICB9XG4gICAgaWYgKG9wdGlvbnMuaXNWZXJib3NlKSB7XG4gICAgICBjb25zb2xlLmluZm8oYC0tLS0tLS0tLS0gJHtuYW1lfSBlbmQgLS0tLS0tLS0tLWApO1xuICAgIH1cbiAgfVxufVxuXG5leHBvcnQgY29uc3QgbG9nZ2VyID0gbmV3IExvZ2dlcigpO1xuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuZXhwb3J0IGNvbnN0IGZzVXRpbCA9IHtcbiAgYXN5bmMgcmVhZEZpbGVJZ25vcmluZ0Vycm9yKGZpbGVQYXRoOiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZyB8IHVuZGVmaW5lZD4ge1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gYXdhaXQgZnMucHJvbWlzZXMucmVhZEZpbGUoZmlsZVBhdGgsICd1dGY4Jyk7XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBkbyBub3RoaW5nXG4gICAgfVxuICB9LFxuICBhc3luYyBnZW5lcmF0ZUZpbGUoZmlsZVBhdGg6IHN0cmluZywgY29udGVudDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgYXdhaXQgZnMucHJvbWlzZXMubWtkaXIocGF0aC5kaXJuYW1lKGZpbGVQYXRoKSwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gICAgbGV0IG5vcm1hbGl6ZWRDb250ZW50ID0gY29udGVudC50cmltKCk7XG4gICAgaWYgKG5vcm1hbGl6ZWRDb250ZW50KSB7XG4gICAgICBub3JtYWxpemVkQ29udGVudCArPSAnXFxuJztcbiAgICB9XG4gICAgYXdhaXQgZnMucHJvbWlzZXMud3JpdGVGaWxlKGZpbGVQYXRoLCBub3JtYWxpemVkQ29udGVudCk7XG4gICAgY29uc29sZS5sb2coYEdlbmVyYXRlZC9VcGRhdGVkICR7ZmlsZVBhdGh9YCk7XG4gIH0sXG59O1xuIiwiaW1wb3J0IHsgUHJvbWlzZVBvb2wgfSBmcm9tICdtaW5pbWFsLXByb21pc2UtcG9vbCc7XG5cbmV4cG9ydCBjb25zdCBwcm9taXNlUG9vbCA9IG5ldyBQcm9taXNlUG9vbCgpO1xuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHRzIGZyb20gJ3R5cGVzY3JpcHQnO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBmc1V0aWwgfSBmcm9tICcuLi91dGlscy9mc1V0aWwuanMnO1xuaW1wb3J0IHsgcHJvbWlzZVBvb2wgfSBmcm9tICcuLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBmaXhOZXh0Q29uZmlnSnNvbihjb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdmaXhOZXh0Q29uZmlnSnNvbicsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBmaWxlUGF0aCA9IFsnanMnLCAnbWpzJywgJ2NqcyddXG4gICAgICAubWFwKChleHQpID0+IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgYG5leHQuY29uZmlnLiR7ZXh0fWApKVxuICAgICAgLmZpbmQoKHApID0+IGZzLmV4aXN0c1N5bmMocCkpO1xuICAgIGlmICghZmlsZVBhdGgpIHJldHVybjtcblxuICAgIGNvbnN0IG9sZENvbnRlbnQgPSBhd2FpdCBmcy5wcm9taXNlcy5yZWFkRmlsZShmaWxlUGF0aCwgJ3V0ZjgnKTtcbiAgICBjb25zdCBvYmplY3RMaXRlcmFsID0gZ2V0TmV4dENvbmZpZ09iamVjdExpdGVyYWwob2xkQ29udGVudCk7XG4gICAgaWYgKCFvYmplY3RMaXRlcmFsKSByZXR1cm47XG5cbiAgICBjb25zdCBleGlzdGluZ1Byb3BlcnRpZXMgPSBuZXcgU2V0KG9iamVjdExpdGVyYWwucHJvcGVydGllcy5tYXAoKHByb3BlcnR5KSA9PiBwcm9wZXJ0eS5uYW1lPy5nZXRUZXh0KCkpKTtcbiAgICBjb25zdCBwcm9wZXJ0eVRleHRzOiBzdHJpbmdbXSA9IFtdO1xuICAgIGlmICghZXhpc3RpbmdQcm9wZXJ0aWVzLmhhcygnZXNsaW50JykpIHtcbiAgICAgIHByb3BlcnR5VGV4dHMucHVzaCgnZXNsaW50OiB7IGlnbm9yZUR1cmluZ0J1aWxkczogdHJ1ZSB9Jyk7XG4gICAgfVxuICAgIGlmICghZXhpc3RpbmdQcm9wZXJ0aWVzLmhhcygndHlwZXNjcmlwdCcpKSB7XG4gICAgICBwcm9wZXJ0eVRleHRzLnB1c2goJ3R5cGVzY3JpcHQ6IHsgaWdub3JlQnVpbGRFcnJvcnM6IHRydWUgfScpO1xuICAgIH1cbiAgICBpZiAocHJvcGVydHlUZXh0cy5sZW5ndGggPT09IDApIHJldHVybjtcblxuICAgIGNvbnN0IGluc2VydGlvblBvaW50ID0gb2JqZWN0TGl0ZXJhbC5nZXRFbmQoKSAtIDE7XG4gICAgY29uc3QgbGFzdFByb3BlcnR5ID0gb2JqZWN0TGl0ZXJhbC5wcm9wZXJ0aWVzLmF0KC0xKTtcbiAgICBjb25zdCBoYXNUcmFpbGluZ0NvbW1hID0gbGFzdFByb3BlcnR5XG4gICAgICA/IG9sZENvbnRlbnQuc2xpY2UobGFzdFByb3BlcnR5LmdldEVuZCgpLCBpbnNlcnRpb25Qb2ludCkuaW5jbHVkZXMoJywnKVxuICAgICAgOiBmYWxzZTtcbiAgICBjb25zdCBwcmVmaXggPSBvYmplY3RMaXRlcmFsLnByb3BlcnRpZXMubGVuZ3RoID4gMCAmJiAhaGFzVHJhaWxpbmdDb21tYSA/ICcsICcgOiAnJztcbiAgICBjb25zdCBuZXdDb250ZW50ID0gYCR7b2xkQ29udGVudC5zbGljZSgwLCBpbnNlcnRpb25Qb2ludCl9JHtwcmVmaXh9JHtwcm9wZXJ0eVRleHRzLmpvaW4oJywgJyl9JHtvbGRDb250ZW50LnNsaWNlKFxuICAgICAgaW5zZXJ0aW9uUG9pbnRcbiAgICApfWA7XG4gICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzVXRpbC5nZW5lcmF0ZUZpbGUoZmlsZVBhdGgsIG5ld0NvbnRlbnQpKTtcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIGdldE5leHRDb25maWdPYmplY3RMaXRlcmFsKGNvbnRlbnQ6IHN0cmluZyk6IHRzLk9iamVjdExpdGVyYWxFeHByZXNzaW9uIHwgdW5kZWZpbmVkIHtcbiAgY29uc3Qgc291cmNlID0gdHMuY3JlYXRlU291cmNlRmlsZSgnbmV4dC5jb25maWcuanMnLCBjb250ZW50LCB0cy5TY3JpcHRUYXJnZXQuTGF0ZXN0LCB0cnVlLCB0cy5TY3JpcHRLaW5kLkpTKTtcbiAgbGV0IG9iamVjdExpdGVyYWw6IHRzLk9iamVjdExpdGVyYWxFeHByZXNzaW9uIHwgdW5kZWZpbmVkO1xuICBjb25zdCB2aXNpdCA9IChub2RlOiB0cy5Ob2RlKTogdm9pZCA9PiB7XG4gICAgaWYgKG9iamVjdExpdGVyYWwpIHJldHVybjtcbiAgICBpZiAodHMuaXNFeHBvcnRBc3NpZ25tZW50KG5vZGUpICYmIHRzLmlzT2JqZWN0TGl0ZXJhbEV4cHJlc3Npb24obm9kZS5leHByZXNzaW9uKSkge1xuICAgICAgb2JqZWN0TGl0ZXJhbCA9IG5vZGUuZXhwcmVzc2lvbjtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKFxuICAgICAgdHMuaXNCaW5hcnlFeHByZXNzaW9uKG5vZGUpICYmXG4gICAgICBub2RlLm9wZXJhdG9yVG9rZW4ua2luZCA9PT0gdHMuU3ludGF4S2luZC5FcXVhbHNUb2tlbiAmJlxuICAgICAgbm9kZS5sZWZ0LmdldFRleHQoc291cmNlKSA9PT0gJ21vZHVsZS5leHBvcnRzJyAmJlxuICAgICAgdHMuaXNPYmplY3RMaXRlcmFsRXhwcmVzc2lvbihub2RlLnJpZ2h0KVxuICAgICkge1xuICAgICAgb2JqZWN0TGl0ZXJhbCA9IG5vZGUucmlnaHQ7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRzLmZvckVhY2hDaGlsZChub2RlLCB2aXNpdCk7XG4gIH07XG4gIHZpc2l0KHNvdXJjZSk7XG4gIHJldHVybiBvYmplY3RMaXRlcmFsO1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHRzIGZyb20gJ3R5cGVzY3JpcHQnO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBmc1V0aWwgfSBmcm9tICcuLi91dGlscy9mc1V0aWwuanMnO1xuaW1wb3J0IHsgcHJvbWlzZVBvb2wgfSBmcm9tICcuLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5cbnR5cGUgUGFyc2VkVmFsdWUgPVxuICB8IHsga2luZDogJ2FycmF5JzsgdmFsdWU6IFBhcnNlZFZhbHVlW10gfVxuICB8IHsga2luZDogJ2xpdGVyYWwnOyB2YWx1ZTogc3RyaW5nIH1cbiAgfCB7IGtpbmQ6ICdvYmplY3QnOyB2YWx1ZTogUGFyc2VkT2JqZWN0IH07XG50eXBlIE9iamVjdE1lbWJlciA9IHsga2luZDogJ2V4dHJhJzsgaW5kZXg6IG51bWJlciB9IHwgeyBraW5kOiAncHJvcGVydHknOyBrZXk6IHN0cmluZyB9O1xuaW50ZXJmYWNlIFBhcnNlZE9iamVjdCB7XG4gIGV4dHJhTWVtYmVyczogc3RyaW5nW107XG4gIG1lbWJlck9yZGVyOiBPYmplY3RNZW1iZXJbXTtcbiAgcHJvcGVydGllczogUmVjb3JkPHN0cmluZywgUGFyc2VkVmFsdWU+O1xufVxuaW50ZXJmYWNlIEV4dHJhY3RlZE9iamVjdExpdGVyYWwge1xuICBzb3VyY2U6IHRzLlNvdXJjZUZpbGU7XG4gIG5vZGU6IHRzLk9iamVjdExpdGVyYWxFeHByZXNzaW9uO1xufVxuXG5jb25zdCBsaXRlcmFsID0gKHZhbHVlOiBzdHJpbmcpOiBQYXJzZWRWYWx1ZSA9PiAoeyBraW5kOiAnbGl0ZXJhbCcsIHZhbHVlIH0pO1xuY29uc3QgYXNBcnJheSA9ICh2YWx1ZTogUGFyc2VkVmFsdWVbXSk6IFBhcnNlZFZhbHVlID0+ICh7IGtpbmQ6ICdhcnJheScsIHZhbHVlIH0pO1xuY29uc3QgYXNPYmplY3QgPSAocHJvcGVydGllczogUmVjb3JkPHN0cmluZywgUGFyc2VkVmFsdWU+LCBleHRyYU1lbWJlcnM6IHN0cmluZ1tdID0gW10pOiBQYXJzZWRWYWx1ZSA9PiAoe1xuICBraW5kOiAnb2JqZWN0JyxcbiAgdmFsdWU6IHRvUGFyc2VkT2JqZWN0KHByb3BlcnRpZXMsIGV4dHJhTWVtYmVycyksXG59KTtcblxuY29uc3QgZGVmYXVsdENvbmZpZyA9IHRvUGFyc2VkT2JqZWN0KHtcbiAgZm9yYmlkT25seTogbGl0ZXJhbCgnISFwcm9jZXNzLmVudi5DSScpLFxuICByZXRyaWVzOiBsaXRlcmFsKCdwcm9jZXNzLmVudi5QV0RFQlVHID8gMCA6IHByb2Nlc3MuZW52LkNJID8gNSA6IDEnKSxcbiAgdXNlOiBhc09iamVjdCh7XG4gICAgYmFzZVVSTDogbGl0ZXJhbCgncHJvY2Vzcy5lbnYuTkVYVF9QVUJMSUNfQkFTRV9VUkwnKSxcbiAgICB0cmFjZTogbGl0ZXJhbChcInByb2Nlc3MuZW52LkNJID8gJ29uLWZpcnN0LXJldHJ5JyA6ICdyZXRhaW4tb24tZmFpbHVyZSdcIiksXG4gICAgc2NyZWVuc2hvdDogbGl0ZXJhbChcInByb2Nlc3MuZW52LkNJID8gJ29ubHktb24tZmFpbHVyZScgOiAnb25seS1vbi1mYWlsdXJlJ1wiKSxcbiAgICB2aWRlbzogbGl0ZXJhbChcInByb2Nlc3MuZW52LkNJID8gJ3JldGFpbi1vbi1mYWlsdXJlJyA6ICdyZXRhaW4tb24tZmFpbHVyZSdcIiksXG4gIH0pLFxuICB3ZWJTZXJ2ZXI6IGFzT2JqZWN0KHtcbiAgICBjb21tYW5kOiBsaXRlcmFsKFwiJ3lhcm4gc3RhcnQtdGVzdC1zZXJ2ZXInXCIpLFxuICAgIHVybDogbGl0ZXJhbCgncHJvY2Vzcy5lbnYuTkVYVF9QVUJMSUNfQkFTRV9VUkwnKSxcbiAgICByZXVzZUV4aXN0aW5nU2VydmVyOiBsaXRlcmFsKCchIXByb2Nlc3MuZW52LkNJJyksXG4gICAgdGltZW91dDogbGl0ZXJhbCgnMzAwXzAwMCcpLFxuICAgIHN0ZG91dDogbGl0ZXJhbChcIidwaXBlJ1wiKSxcbiAgICBzdGRlcnI6IGxpdGVyYWwoXCIncGlwZSdcIiksXG4gICAgZW52OiBsaXRlcmFsKGB7XG4gIC4uLnByb2Nlc3MuZW52LFxuICBQUklTTUFfVVNFUl9DT05TRU5UX0ZPUl9EQU5HRVJPVVNfQUlfQUNUSU9OOiAndHJ1ZScsXG59YCksXG4gICAgZ3JhY2VmdWxTaHV0ZG93bjogbGl0ZXJhbChge1xuICBzaWduYWw6ICdTSUdURVJNJyxcbiAgdGltZW91dDogNTAwLFxufWApLFxuICB9KSxcbn0pO1xuXG5mdW5jdGlvbiB0b1BhcnNlZE9iamVjdChwcm9wZXJ0aWVzOiBSZWNvcmQ8c3RyaW5nLCBQYXJzZWRWYWx1ZT4sIGV4dHJhTWVtYmVyczogc3RyaW5nW10gPSBbXSk6IFBhcnNlZE9iamVjdCB7XG4gIHJldHVybiB7XG4gICAgZXh0cmFNZW1iZXJzLFxuICAgIG1lbWJlck9yZGVyOiBbXG4gICAgICAuLi5PYmplY3Qua2V5cyhwcm9wZXJ0aWVzKS5tYXAoKGtleSk6IE9iamVjdE1lbWJlciA9PiAoeyBraW5kOiAncHJvcGVydHknLCBrZXkgfSkpLFxuICAgICAgLi4uZXh0cmFNZW1iZXJzLm1hcCgoXywgaW5kZXgpOiBPYmplY3RNZW1iZXIgPT4gKHsga2luZDogJ2V4dHJhJywgaW5kZXggfSkpLFxuICAgIF0sXG4gICAgcHJvcGVydGllcyxcbiAgfTtcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGZpeFBsYXl3cmlnaHRDb25maWcoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCBgcGxheXdyaWdodC5jb25maWcudHNgKTtcbiAgaWYgKCFmcy5leGlzdHNTeW5jKGZpbGVQYXRoKSkgcmV0dXJuO1xuXG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZml4UGxheXdyaWdodENvbmZpZycsIGFzeW5jICgpID0+IHtcbiAgICBhd2FpdCBhc3NlcnROZXh0UHVibGljQmFzZVVybChjb25maWcuZGlyUGF0aCk7XG5cbiAgICBjb25zdCBvbGRDb250ZW50ID0gYXdhaXQgZnMucHJvbWlzZXMucmVhZEZpbGUoZmlsZVBhdGgsICd1dGY4Jyk7XG4gICAgY29uc3QgZXh0cmFjdGVkT2JqZWN0TGl0ZXJhbCA9IGV4dHJhY3REZWZpbmVDb25maWdPYmplY3RMaXRlcmFsKG9sZENvbnRlbnQpO1xuICAgIGlmICghZXh0cmFjdGVkT2JqZWN0TGl0ZXJhbCkgcmV0dXJuO1xuXG4gICAgY29uc3QgcGFyc2VkID0gcGFyc2VPYmplY3RMaXRlcmFsRXhwcmVzc2lvbihleHRyYWN0ZWRPYmplY3RMaXRlcmFsLm5vZGUsIGV4dHJhY3RlZE9iamVjdExpdGVyYWwuc291cmNlKTtcbiAgICBpZiAoIXBhcnNlZCkgcmV0dXJuO1xuXG4gICAgLy8gS2VlcCBmaWxsaW5nIG1pc3NpbmcgZGVmYXVsdHMsIGJ1dCBkb24ndCBvdmVyd3JpdGUgbG9jYWwgYWRqdXN0bWVudHMgb24gZXZlcnkgcmVnZW5lcmF0aW9uLlxuICAgIGNvbnN0IG1lcmdlZCA9IG1lcmdlUGFyc2VkT2JqZWN0cyhkZWZhdWx0Q29uZmlnLCBwYXJzZWQpO1xuICAgIGNvbnN0IGhhc1N0YXJ0VGVzdFNlcnZlciA9IEJvb2xlYW4oY29uZmlnLnBhY2thZ2VKc29uPy5zY3JpcHRzPy5bJ3N0YXJ0LXRlc3Qtc2VydmVyJ10pO1xuICAgIGNvbnN0IGhhc0V4aXN0aW5nV2ViU2VydmVyID0gQm9vbGVhbihwYXJzZWQucHJvcGVydGllcy53ZWJTZXJ2ZXIpO1xuICAgIC8vIE9ubHkgZHJvcCB3YmZ5J3MgZGVmYXVsdCBzZXJ2ZXIgY29tbWFuZC4gUmVwb3Mgd2l0aCBjdXN0b20gUGxheXdyaWdodFxuICAgIC8vIHNlcnZlciBzZXR1cCBzdGlsbCBuZWVkIGl0IGV2ZW4gd2hlbiB0aGV5IGRvIG5vdCBleHBvc2Ugc3RhcnQtdGVzdC1zZXJ2ZXIuXG4gICAgaWYgKCFoYXNTdGFydFRlc3RTZXJ2ZXIgJiYgIWhhc0V4aXN0aW5nV2ViU2VydmVyKSB7XG4gICAgICBkZWxldGUgbWVyZ2VkLnByb3BlcnRpZXMud2ViU2VydmVyO1xuICAgIH1cbiAgICBzZXRXZWJTZXJ2ZXJDb21tYW5kKGNvbmZpZywgbWVyZ2VkKTtcblxuICAgIGNvbnN0IG5ld09iamVjdExpdGVyYWwgPSBzdHJpbmdpZnlWYWx1ZSh7IGtpbmQ6ICdvYmplY3QnLCB2YWx1ZTogbWVyZ2VkIH0sIDApO1xuICAgIGNvbnN0IHN0YXJ0ID0gZXh0cmFjdGVkT2JqZWN0TGl0ZXJhbC5ub2RlLmdldFN0YXJ0KGV4dHJhY3RlZE9iamVjdExpdGVyYWwuc291cmNlKTtcbiAgICBjb25zdCBlbmQgPSBleHRyYWN0ZWRPYmplY3RMaXRlcmFsLm5vZGUuZ2V0RW5kKCk7XG4gICAgY29uc3QgbmV3Q29udGVudCA9IGAke29sZENvbnRlbnQuc2xpY2UoMCwgc3RhcnQpfSR7bmV3T2JqZWN0TGl0ZXJhbH0ke29sZENvbnRlbnQuc2xpY2UoZW5kKX1gO1xuXG4gICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzVXRpbC5nZW5lcmF0ZUZpbGUoZmlsZVBhdGgsIG5ld0NvbnRlbnQpKTtcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIG1lcmdlUGFyc2VkT2JqZWN0cyhiYXNlOiBQYXJzZWRPYmplY3QsIG92ZXJyaWRlOiBQYXJzZWRPYmplY3QpOiBQYXJzZWRPYmplY3Qge1xuICBjb25zdCBvdmVycmlkZVByb3BlcnR5S2V5cyA9IG5ldyBTZXQoT2JqZWN0LmtleXMob3ZlcnJpZGUucHJvcGVydGllcykpO1xuICBjb25zdCBleHRyYU1lbWJlcnMgPSBbLi4uYmFzZS5leHRyYU1lbWJlcnMsIC4uLm92ZXJyaWRlLmV4dHJhTWVtYmVyc107XG4gIC8vIEtlZXAgZGVmYXVsdC1vbmx5IG1lbWJlcnMgYmVmb3JlIHBhcnNlZCBtZW1iZXJzIHNvIHNwcmVhZHMgYW5kIGV4cGxpY2l0IGxvY2FsIHByb3BlcnRpZXMgcmV0YWluIHByZWNlZGVuY2UuXG4gIGNvbnN0IG1lbWJlck9yZGVyID0gW1xuICAgIC4uLmJhc2UubWVtYmVyT3JkZXIuZmlsdGVyKChtZW1iZXIpID0+IG1lbWJlci5raW5kICE9PSAncHJvcGVydHknIHx8ICFvdmVycmlkZVByb3BlcnR5S2V5cy5oYXMobWVtYmVyLmtleSkpLFxuICAgIC4uLm92ZXJyaWRlLm1lbWJlck9yZGVyLm1hcCgobWVtYmVyKTogT2JqZWN0TWVtYmVyID0+IHtcbiAgICAgIGlmIChtZW1iZXIua2luZCA9PT0gJ3Byb3BlcnR5JykgcmV0dXJuIG1lbWJlcjtcbiAgICAgIHJldHVybiB7IGtpbmQ6ICdleHRyYScsIGluZGV4OiBiYXNlLmV4dHJhTWVtYmVycy5sZW5ndGggKyBtZW1iZXIuaW5kZXggfTtcbiAgICB9KSxcbiAgXTtcbiAgY29uc3QgcHJvcGVydGllcyA9IHsgLi4uYmFzZS5wcm9wZXJ0aWVzIH07XG4gIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKG92ZXJyaWRlLnByb3BlcnRpZXMpKSB7XG4gICAgcHJvcGVydGllc1trZXldID0gbWVyZ2VQYXJzZWRWYWx1ZShwcm9wZXJ0aWVzW2tleV0sIHZhbHVlKTtcbiAgfVxuICByZXR1cm4geyBleHRyYU1lbWJlcnMsIG1lbWJlck9yZGVyLCBwcm9wZXJ0aWVzIH07XG59XG5cbmZ1bmN0aW9uIG1lcmdlUGFyc2VkVmFsdWUoYmFzZTogUGFyc2VkVmFsdWUgfCB1bmRlZmluZWQsIG92ZXJyaWRlOiBQYXJzZWRWYWx1ZSk6IFBhcnNlZFZhbHVlIHtcbiAgaWYgKGJhc2U/LmtpbmQgPT09ICdvYmplY3QnICYmIG92ZXJyaWRlLmtpbmQgPT09ICdvYmplY3QnKSB7XG4gICAgcmV0dXJuIHsga2luZDogJ29iamVjdCcsIHZhbHVlOiBtZXJnZVBhcnNlZE9iamVjdHMoYmFzZS52YWx1ZSwgb3ZlcnJpZGUudmFsdWUpIH07XG4gIH1cbiAgcmV0dXJuIG92ZXJyaWRlO1xufVxuXG5hc3luYyBmdW5jdGlvbiBhc3NlcnROZXh0UHVibGljQmFzZVVybChkaXJQYXRoOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgZW52RmlsZVBhdGhzID0gW1xuICAgIHBhdGgucmVzb2x2ZShkaXJQYXRoLCAnLmVudicpLFxuICAgIHBhdGgucmVzb2x2ZShkaXJQYXRoLCAnLmVudi50ZXN0JyksXG4gICAgcGF0aC5yZXNvbHZlKGRpclBhdGgsICdtaXNlLnRvbWwnKSxcbiAgICBwYXRoLnJlc29sdmUoZGlyUGF0aCwgJ21pc2UudGVzdC50b21sJyksXG4gIF07XG4gIGZvciAoY29uc3QgZW52RmlsZVBhdGggb2YgZW52RmlsZVBhdGhzKSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGNvbnRlbnQgPSBhd2FpdCBmcy5wcm9taXNlcy5yZWFkRmlsZShlbnZGaWxlUGF0aCwgJ3V0ZjgnKTtcbiAgICAgIGlmICgvTkVYVF9QVUJMSUNfQkFTRV9VUkxcXHMqPS9tLnRlc3QoY29udGVudCkpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgIH0gY2F0Y2gge1xuICAgICAgLy8gTWlzc2luZyBlbnYgZmlsZXMgYXJlIGV4cGVjdGVkIGluIHNvbWUgcmVwb3MuXG4gICAgfVxuICB9XG5cbiAgdGhyb3cgbmV3IEVycm9yKCdORVhUX1BVQkxJQ19CQVNFX1VSTCBpcyByZXF1aXJlZCBmb3IgUGxheXdyaWdodC4gRGVmaW5lIE5FWFRfUFVCTElDX0JBU0VfVVJMIGluIHRoZSB0YXJnZXQgcmVwby4nKTtcbn1cblxuZnVuY3Rpb24gc2V0V2ViU2VydmVyQ29tbWFuZChjb25maWc6IFBhY2thZ2VDb25maWcsIG9iamVjdDogUGFyc2VkT2JqZWN0KTogdm9pZCB7XG4gIGNvbnN0IHdlYlNlcnZlciA9IG9iamVjdC5wcm9wZXJ0aWVzLndlYlNlcnZlcjtcbiAgaWYgKHdlYlNlcnZlcj8ua2luZCAhPT0gJ29iamVjdCcpIHJldHVybjtcblxuICAvLyB3YmZ5IG93bnMgdGhlIHBhY2thZ2Ugc2NyaXB0LCBzbyBQbGF5d3JpZ2h0IHNob3VsZCBjb25zaXN0ZW50bHkgY2FsbCB0aGF0XG4gIC8vIHNjcmlwdCB3aGlsZSBwcmVzZXJ2aW5nIHRoZSByZXN0IG9mIGVhY2ggcmVwb3NpdG9yeSdzIHdlYlNlcnZlciBzZXR0aW5ncy5cbiAgd2ViU2VydmVyLnZhbHVlLnByb3BlcnRpZXMuY29tbWFuZCA9IGxpdGVyYWwoY29uZmlnLmlzQnVuID8gXCInYnVuIHN0YXJ0LXRlc3Qtc2VydmVyJ1wiIDogXCIneWFybiBzdGFydC10ZXN0LXNlcnZlcidcIik7XG59XG5cbmZ1bmN0aW9uIGV4dHJhY3REZWZpbmVDb25maWdPYmplY3RMaXRlcmFsKGNvbnRlbnQ6IHN0cmluZyk6IEV4dHJhY3RlZE9iamVjdExpdGVyYWwgfCB1bmRlZmluZWQge1xuICBjb25zdCBzb3VyY2UgPSB0cy5jcmVhdGVTb3VyY2VGaWxlKCdwbGF5d3JpZ2h0LmNvbmZpZy50cycsIGNvbnRlbnQsIHRzLlNjcmlwdFRhcmdldC5MYXRlc3QsIHRydWUsIHRzLlNjcmlwdEtpbmQuVFMpO1xuXG4gIC8vIFR5cGVTY3JpcHQgYWxyZWFkeSB1bmRlcnN0YW5kcyBuZXN0ZWQgb2JqZWN0IGxpdGVyYWxzIGFuZCB0ZW1wbGF0ZSBzdHJpbmdzLCBzbyB1c2VcbiAgLy8gaXRzIEFTVCByYW5nZXMgaW5zdGVhZCBvZiBhIHJlZ2V4IHRoYXQgY2FuIHN0b3AgYXQgdGhlIGZpcnN0IGlubmVyIGNsb3NpbmcgYnJhY2UuXG4gIGxldCBmb3VuZDogdHMuT2JqZWN0TGl0ZXJhbEV4cHJlc3Npb24gfCB1bmRlZmluZWQ7XG4gIGNvbnN0IHZpc2l0ID0gKG5vZGU6IHRzLk5vZGUpOiB2b2lkID0+IHtcbiAgICBpZiAoZm91bmQpIHJldHVybjtcbiAgICBpZiAodHMuaXNDYWxsRXhwcmVzc2lvbihub2RlKSAmJiBub2RlLmV4cHJlc3Npb24uZ2V0VGV4dChzb3VyY2UpID09PSAnZGVmaW5lQ29uZmlnJykge1xuICAgICAgY29uc3QgZmlyc3RBcmd1bWVudCA9IG5vZGUuYXJndW1lbnRzWzBdO1xuICAgICAgaWYgKGZpcnN0QXJndW1lbnQgJiYgdHMuaXNPYmplY3RMaXRlcmFsRXhwcmVzc2lvbihmaXJzdEFyZ3VtZW50KSkge1xuICAgICAgICBmb3VuZCA9IGZpcnN0QXJndW1lbnQ7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICB9XG4gICAgdHMuZm9yRWFjaENoaWxkKG5vZGUsIHZpc2l0KTtcbiAgfTtcbiAgdmlzaXQoc291cmNlKTtcblxuICByZXR1cm4gZm91bmQgPyB7IHNvdXJjZSwgbm9kZTogZm91bmQgfSA6IHVuZGVmaW5lZDtcbn1cblxuZnVuY3Rpb24gcGFyc2VFeHByZXNzaW9uKGV4cHJlc3Npb246IHRzLkV4cHJlc3Npb24sIHNvdXJjZTogdHMuU291cmNlRmlsZSk6IFBhcnNlZFZhbHVlIHwgdW5kZWZpbmVkIHtcbiAgaWYgKHRzLmlzT2JqZWN0TGl0ZXJhbEV4cHJlc3Npb24oZXhwcmVzc2lvbikpIHtcbiAgICBjb25zdCBwYXJzZWRPYmplY3QgPSBwYXJzZU9iamVjdExpdGVyYWxFeHByZXNzaW9uKGV4cHJlc3Npb24sIHNvdXJjZSk7XG4gICAgcmV0dXJuIHBhcnNlZE9iamVjdCA/IHsga2luZDogJ29iamVjdCcsIHZhbHVlOiBwYXJzZWRPYmplY3QgfSA6IGxpdGVyYWwoZXhwcmVzc2lvbi5nZXRUZXh0KHNvdXJjZSkpO1xuICB9XG4gIGlmICh0cy5pc0FycmF5TGl0ZXJhbEV4cHJlc3Npb24oZXhwcmVzc2lvbikpIHtcbiAgICBjb25zdCBlbGVtZW50cyA9IGV4cHJlc3Npb24uZWxlbWVudHMubWFwKChlbGVtZW50KSA9PiBwYXJzZUV4cHJlc3Npb24oZWxlbWVudCwgc291cmNlKSk7XG4gICAgaWYgKGVsZW1lbnRzLnNvbWUoKGVsZW1lbnQpOiBlbGVtZW50IGlzIHVuZGVmaW5lZCA9PiBlbGVtZW50ID09PSB1bmRlZmluZWQpKSB7XG4gICAgICByZXR1cm4gbGl0ZXJhbChleHByZXNzaW9uLmdldFRleHQoc291cmNlKSk7XG4gICAgfVxuICAgIHJldHVybiBhc0FycmF5KGVsZW1lbnRzIGFzIFBhcnNlZFZhbHVlW10pO1xuICB9XG4gIHJldHVybiBsaXRlcmFsKGV4cHJlc3Npb24uZ2V0VGV4dChzb3VyY2UpKTtcbn1cblxuZnVuY3Rpb24gcGFyc2VPYmplY3RMaXRlcmFsRXhwcmVzc2lvbihcbiAgb2JqZWN0TGl0ZXJhbDogdHMuT2JqZWN0TGl0ZXJhbEV4cHJlc3Npb24sXG4gIHNvdXJjZTogdHMuU291cmNlRmlsZVxuKTogUGFyc2VkT2JqZWN0IHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgcGFyc2VkOiBQYXJzZWRPYmplY3QgPSB7IGV4dHJhTWVtYmVyczogW10sIG1lbWJlck9yZGVyOiBbXSwgcHJvcGVydGllczoge30gfTtcbiAgZm9yIChjb25zdCBwcm9wZXJ0eSBvZiBvYmplY3RMaXRlcmFsLnByb3BlcnRpZXMpIHtcbiAgICBpZiAodHMuaXNTaG9ydGhhbmRQcm9wZXJ0eUFzc2lnbm1lbnQocHJvcGVydHkpKSB7XG4gICAgICBjb25zdCBrZXkgPSBwcm9wZXJ0eS5uYW1lLmdldFRleHQoc291cmNlKTtcbiAgICAgIHBhcnNlZC5wcm9wZXJ0aWVzW2tleV0gPSBsaXRlcmFsKGtleSk7XG4gICAgICBwYXJzZWQubWVtYmVyT3JkZXIucHVzaCh7IGtpbmQ6ICdwcm9wZXJ0eScsIGtleSB9KTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBpZiAoIXRzLmlzUHJvcGVydHlBc3NpZ25tZW50KHByb3BlcnR5KSB8fCAoIXRzLmlzSWRlbnRpZmllcihwcm9wZXJ0eS5uYW1lKSAmJiAhdHMuaXNTdHJpbmdMaXRlcmFsKHByb3BlcnR5Lm5hbWUpKSkge1xuICAgICAgY29uc3QgaW5kZXggPSBwYXJzZWQuZXh0cmFNZW1iZXJzLnB1c2gocHJvcGVydHkuZ2V0VGV4dChzb3VyY2UpKSAtIDE7XG4gICAgICBwYXJzZWQubWVtYmVyT3JkZXIucHVzaCh7IGtpbmQ6ICdleHRyYScsIGluZGV4IH0pO1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGNvbnN0IHZhbHVlID0gcGFyc2VFeHByZXNzaW9uKHByb3BlcnR5LmluaXRpYWxpemVyLCBzb3VyY2UpO1xuICAgIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkKSByZXR1cm47XG4gICAgY29uc3Qga2V5ID0gcHJvcGVydHkubmFtZS5nZXRUZXh0KHNvdXJjZSk7XG4gICAgcGFyc2VkLnByb3BlcnRpZXNba2V5XSA9IHZhbHVlO1xuICAgIHBhcnNlZC5tZW1iZXJPcmRlci5wdXNoKHsga2luZDogJ3Byb3BlcnR5Jywga2V5IH0pO1xuICB9XG4gIHJldHVybiBwYXJzZWQ7XG59XG5cbmZ1bmN0aW9uIHN0cmluZ2lmeVZhbHVlKHZhbHVlOiBQYXJzZWRWYWx1ZSwgbGV2ZWw6IG51bWJlcik6IHN0cmluZyB7XG4gIGNvbnN0IGNsb3NpbmdJbmRlbnQgPSAnICAnLnJlcGVhdChsZXZlbCk7XG4gIGlmICh2YWx1ZS5raW5kID09PSAnYXJyYXknKSB7XG4gICAgaWYgKHZhbHVlLnZhbHVlLmxlbmd0aCA9PT0gMCkgcmV0dXJuICdbXSc7XG4gICAgY29uc3QgaW5kZW50ID0gJyAgJy5yZXBlYXQobGV2ZWwgKyAxKTtcbiAgICBjb25zdCBsaW5lcyA9IHZhbHVlLnZhbHVlLm1hcCgoaXRlbSkgPT4ge1xuICAgICAgY29uc3Qgc3RyaW5naWZpZWQgPSBzdHJpbmdpZnlWYWx1ZShpdGVtLCBsZXZlbCArIDEpLnNwbGl0KCdcXG4nKTtcbiAgICAgIHN0cmluZ2lmaWVkW3N0cmluZ2lmaWVkLmxlbmd0aCAtIDFdID0gYCR7c3RyaW5naWZpZWQuYXQoLTEpfSxgO1xuICAgICAgaWYgKGl0ZW0ua2luZCA9PT0gJ2xpdGVyYWwnKSB7XG4gICAgICAgIGZvciAobGV0IGluZGV4ID0gMTsgaW5kZXggPCBzdHJpbmdpZmllZC5sZW5ndGg7IGluZGV4ICs9IDEpIHtcbiAgICAgICAgICBzdHJpbmdpZmllZFtpbmRleF0gPSBgJHtpbmRlbnR9JHtzdHJpbmdpZmllZFtpbmRleF19YDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgc3RyaW5naWZpZWRbMF0gPSBgJHtpbmRlbnR9JHtzdHJpbmdpZmllZFswXX1gO1xuICAgICAgcmV0dXJuIHN0cmluZ2lmaWVkLmpvaW4oJ1xcbicpO1xuICAgIH0pO1xuICAgIHJldHVybiBgW1xcbiR7bGluZXMuam9pbignXFxuJyl9XFxuJHtjbG9zaW5nSW5kZW50fV1gO1xuICB9XG4gIGlmICh2YWx1ZS5raW5kID09PSAnbGl0ZXJhbCcpIHJldHVybiB2YWx1ZS52YWx1ZTtcblxuICBjb25zdCBpbmRlbnQgPSAnICAnLnJlcGVhdChsZXZlbCArIDEpO1xuICBjb25zdCBlbWl0dGVkUHJvcGVydGllcyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICBjb25zdCBsYXN0UHJvcGVydHlJbmRleEJ5S2V5ID0gZ2V0TGFzdFByb3BlcnR5SW5kZXhCeUtleSh2YWx1ZS52YWx1ZS5tZW1iZXJPcmRlcik7XG4gIGNvbnN0IGxpbmVzID0gdmFsdWUudmFsdWUubWVtYmVyT3JkZXIuZmxhdE1hcCgobWVtYmVyLCBpbmRleCkgPT4ge1xuICAgIGlmIChtZW1iZXIua2luZCA9PT0gJ2V4dHJhJykge1xuICAgICAgcmV0dXJuIFtzdHJpbmdpZnlPYmplY3RNZW1iZXIodmFsdWUudmFsdWUuZXh0cmFNZW1iZXJzW21lbWJlci5pbmRleF0gPz8gJycsIGluZGVudCldO1xuICAgIH1cblxuICAgIGlmIChsYXN0UHJvcGVydHlJbmRleEJ5S2V5LmdldChtZW1iZXIua2V5KSAhPT0gaW5kZXgpIHJldHVybiBbXTtcbiAgICBjb25zdCBpdGVtID0gdmFsdWUudmFsdWUucHJvcGVydGllc1ttZW1iZXIua2V5XTtcbiAgICBpZiAoIWl0ZW0gfHwgZW1pdHRlZFByb3BlcnRpZXMuaGFzKG1lbWJlci5rZXkpKSByZXR1cm4gW107XG4gICAgZW1pdHRlZFByb3BlcnRpZXMuYWRkKG1lbWJlci5rZXkpO1xuICAgIHJldHVybiBbc3RyaW5naWZ5T2JqZWN0UHJvcGVydHkobWVtYmVyLmtleSwgaXRlbSwgbGV2ZWwsIGluZGVudCldO1xuICB9KTtcbiAgbGluZXMucHVzaChcbiAgICAuLi5PYmplY3QuZW50cmllcyh2YWx1ZS52YWx1ZS5wcm9wZXJ0aWVzKVxuICAgICAgLmZpbHRlcigoW2tleV0pID0+ICFlbWl0dGVkUHJvcGVydGllcy5oYXMoa2V5KSlcbiAgICAgIC5tYXAoKFtrZXksIGl0ZW1dKSA9PiBzdHJpbmdpZnlPYmplY3RQcm9wZXJ0eShrZXksIGl0ZW0sIGxldmVsLCBpbmRlbnQpKVxuICApO1xuICBpZiAobGluZXMubGVuZ3RoID09PSAwKSByZXR1cm4gYHtcXG4ke2Nsb3NpbmdJbmRlbnR9fWA7XG4gIHJldHVybiBge1xcbiR7bGluZXMuam9pbignXFxuJyl9XFxuJHtjbG9zaW5nSW5kZW50fX1gO1xufVxuXG5mdW5jdGlvbiBnZXRMYXN0UHJvcGVydHlJbmRleEJ5S2V5KG1lbWJlck9yZGVyOiBPYmplY3RNZW1iZXJbXSk6IE1hcDxzdHJpbmcsIG51bWJlcj4ge1xuICBjb25zdCBsYXN0UHJvcGVydHlJbmRleEJ5S2V5ID0gbmV3IE1hcDxzdHJpbmcsIG51bWJlcj4oKTtcbiAgZm9yIChjb25zdCBbaW5kZXgsIG1lbWJlcl0gb2YgbWVtYmVyT3JkZXIuZW50cmllcygpKSB7XG4gICAgaWYgKG1lbWJlci5raW5kID09PSAncHJvcGVydHknKSB7XG4gICAgICBsYXN0UHJvcGVydHlJbmRleEJ5S2V5LnNldChtZW1iZXIua2V5LCBpbmRleCk7XG4gICAgfVxuICB9XG4gIHJldHVybiBsYXN0UHJvcGVydHlJbmRleEJ5S2V5O1xufVxuXG5mdW5jdGlvbiBzdHJpbmdpZnlPYmplY3RQcm9wZXJ0eShrZXk6IHN0cmluZywgaXRlbTogUGFyc2VkVmFsdWUsIGxldmVsOiBudW1iZXIsIGluZGVudDogc3RyaW5nKTogc3RyaW5nIHtcbiAgY29uc3Qgc3RyaW5naWZpZWQgPSBzdHJpbmdpZnlWYWx1ZShpdGVtLCBsZXZlbCArIDEpLnNwbGl0KCdcXG4nKTtcbiAgc3RyaW5naWZpZWRbc3RyaW5naWZpZWQubGVuZ3RoIC0gMV0gPSBgJHtzdHJpbmdpZmllZC5hdCgtMSl9LGA7XG4gIGlmIChpdGVtLmtpbmQgPT09ICdsaXRlcmFsJykge1xuICAgIGZvciAobGV0IGluZGV4ID0gMTsgaW5kZXggPCBzdHJpbmdpZmllZC5sZW5ndGg7IGluZGV4ICs9IDEpIHtcbiAgICAgIHN0cmluZ2lmaWVkW2luZGV4XSA9IGAke2luZGVudH0ke3N0cmluZ2lmaWVkW2luZGV4XX1gO1xuICAgIH1cbiAgfVxuICBzdHJpbmdpZmllZFswXSA9IGAke2luZGVudH0ke2tleX06ICR7c3RyaW5naWZpZWRbMF19YDtcbiAgcmV0dXJuIHN0cmluZ2lmaWVkLmpvaW4oJ1xcbicpO1xufVxuXG5mdW5jdGlvbiBzdHJpbmdpZnlPYmplY3RNZW1iZXIobWVtYmVyOiBzdHJpbmcsIGluZGVudDogc3RyaW5nKTogc3RyaW5nIHtcbiAgY29uc3Qgc3RyaW5naWZpZWQgPSBtZW1iZXIuc3BsaXQoJ1xcbicpO1xuICBzdHJpbmdpZmllZFtzdHJpbmdpZmllZC5sZW5ndGggLSAxXSA9IGAke3N0cmluZ2lmaWVkLmF0KC0xKX0sYDtcbiAgZm9yIChjb25zdCBbaW5kZXgsIGxpbmVdIG9mIHN0cmluZ2lmaWVkLmVudHJpZXMoKSkge1xuICAgIHN0cmluZ2lmaWVkW2luZGV4XSA9IGAke2luZGVudH0ke2xpbmV9YDtcbiAgfVxuICByZXR1cm4gc3RyaW5naWZpZWQuam9pbignXFxuJyk7XG59XG4iLCJleHBvcnQgY29uc3QgZ2xvYklnbm9yZSA9IFtcbiAgJyoqL25vZGVfbW9kdWxlcy8qKicsXG4gICcqKi8udmVudi8qKicsXG4gICcqKi90ZXN0LWZpeHR1cmVzLyoqJyxcbiAgJyoqL3Rlc3QvZml4dHVyZXMvKionLFxuICAnKiovZGlzdC8qKicsXG4gICcqKi9idWlsZC8qKicsXG4gICcqKi90YXJnZXQvKionLFxuICAnKiovdGVtcC8qKicsXG4gICcqKi90bXAvKionLFxuXTtcbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzL3Byb21pc2VzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCBmZyBmcm9tICdmYXN0LWdsb2InO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBnbG9iSWdub3JlIH0gZnJvbSAnLi4vdXRpbHMvZ2xvYlV0aWwuanMnO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZml4UHJpc21hRW52RmlsZXMoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZml4UHJpc21hRW52RmlsZXMnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgZW52RmlsZXMgPSBhd2FpdCBmZy5nbG9iKFsnKi5lbnYnLCAnKi5lbnYuKiddLCB7IGRvdDogdHJ1ZSwgY3dkOiBjb25maWcuZGlyUGF0aCwgaWdub3JlOiBnbG9iSWdub3JlIH0pO1xuICAgIGZvciAoY29uc3QgZW52RmlsZSBvZiBlbnZGaWxlcykge1xuICAgICAgY29uc3QgZW52RmlsZVBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsIGVudkZpbGUpO1xuICAgICAgY29uc3QgY29udGVudCA9IGF3YWl0IGZzLnJlYWRGaWxlKGVudkZpbGVQYXRoLCAndXRmOCcpO1xuICAgICAgY29uc3QgbmV3Q29udGVudCA9IGNvbnRlbnQucmVwbGFjZUFsbChcbiAgICAgICAgL0RBVEFCQVNFX1VSTFxccyo9XFxzKlwiPyhbXlwiI1xcbl0rP1xcLnNxbGl0ZTNbXlwiI1xcbl0qKVwiPy9nLFxuICAgICAgICAobWF0Y2gsIHVybDogc3RyaW5nKSA9PiB7XG4gICAgICAgICAgaWYgKHVybC5pbmNsdWRlcygnY29ubmVjdGlvbl9saW1pdD0xJykpIHJldHVybiBtYXRjaDtcbiAgICAgICAgICBjb25zdCBzZXBhcmF0b3IgPSB1cmwuaW5jbHVkZXMoJz8nKSA/ICcmJyA6ICc/JztcbiAgICAgICAgICByZXR1cm4gYERBVEFCQVNFX1VSTD1cIiR7dXJsfSR7c2VwYXJhdG9yfWNvbm5lY3Rpb25fbGltaXQ9MVwiYDtcbiAgICAgICAgfVxuICAgICAgKTtcbiAgICAgIGF3YWl0IGZzLndyaXRlRmlsZShlbnZGaWxlUGF0aCwgbmV3Q29udGVudCk7XG4gICAgfVxuICB9KTtcbn1cbiIsImNvbnN0IGhhcyA9IChvYmplY3QsIGtleSkgPT4gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iamVjdCwga2V5KVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBzb3J0T2JqZWN0QnlLZXlOYW1lTGlzdChvYmplY3QsIHNvcnRXaXRoKSB7XG4gIGxldCBrZXlzLCBzb3J0Rm4sIGtleVxuXG4gIGlmICh0eXBlb2Ygc29ydFdpdGggPT09ICdmdW5jdGlvbicpIHtcbiAgICBzb3J0Rm4gPSBzb3J0V2l0aFxuICB9IGVsc2Uge1xuICAgIGtleXMgPSBzb3J0V2l0aFxuICB9XG5cbiAgY29uc3QgdG90YWwgPSB7fVxuICBjb25zdCBvYmplY3RLZXlzID0gWy4uLihrZXlzID8/IFtdKSwgLi4uT2JqZWN0LmtleXMob2JqZWN0KS5zb3J0KHNvcnRGbildXG5cbiAgZm9yIChrZXkgb2Ygb2JqZWN0S2V5cykge1xuICAgIGlmIChoYXMob2JqZWN0LCBrZXkpKSB7XG4gICAgICB0b3RhbFtrZXldID0gb2JqZWN0W2tleV1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gdG90YWxcbn1cbiIsIi8vIERldGVjdCBlaXRoZXIgc3BhY2VzIG9yIHRhYnMgYnV0IG5vdCBib3RoIHRvIHByb3Blcmx5IGhhbmRsZSB0YWJzIGZvciBpbmRlbnRhdGlvbiBhbmQgc3BhY2VzIGZvciBhbGlnbm1lbnRcbmNvbnN0IElOREVOVF9SRUdFWCA9IC9eKD86KCApK3xcXHQrKS87XG5cbmNvbnN0IElOREVOVF9UWVBFX1NQQUNFID0gJ3NwYWNlJztcbmNvbnN0IElOREVOVF9UWVBFX1RBQiA9ICd0YWInO1xuXG4vLyBIZWxwZXIgZnVuY3Rpb24gdG8gY2hlY2sgaWYgd2Ugc2hvdWxkIGlnbm9yZSBzaW5nbGUgc3BhY2UgcGF0dGVybnNcbmZ1bmN0aW9uIHNob3VsZElnbm9yZVNpbmdsZVNwYWNlKGlnbm9yZVNpbmdsZVNwYWNlcywgaW5kZW50VHlwZSwgdmFsdWUpIHtcblx0cmV0dXJuIGlnbm9yZVNpbmdsZVNwYWNlcyAmJiBpbmRlbnRUeXBlID09PSBJTkRFTlRfVFlQRV9TUEFDRSAmJiB2YWx1ZSA9PT0gMTtcbn1cblxuLyoqXG5NYWtlIGEgTWFwIHRoYXQgY291bnRzIGhvdyBtYW55IGluZGVudHMvdW5pbmRlbnRzIGhhdmUgb2NjdXJyZWQgZm9yIGEgZ2l2ZW4gc2l6ZSBhbmQgaG93IG1hbnkgbGluZXMgZm9sbG93IGEgZ2l2ZW4gaW5kZW50YXRpb24uXG5cblRoZSBrZXkgaXMgYSBjb25jYXRlbmF0aW9uIG9mIHRoZSBpbmRlbnRhdGlvbiB0eXBlIChzID0gc3BhY2UgYW5kIHQgPSB0YWIpIGFuZCB0aGUgc2l6ZSBvZiB0aGUgaW5kZW50cy91bmluZGVudHMuXG5cbmBgYFxuaW5kZW50cyA9IHtcblx0dDM6IFsxLCAwXSxcblx0dDQ6IFsxLCA1XSxcblx0czU6IFsxLCAwXSxcblx0czEyOiBbMSwgMF0sXG59XG5gYGBcbiovXG5mdW5jdGlvbiBtYWtlSW5kZW50c01hcChzdHJpbmcsIGlnbm9yZVNpbmdsZVNwYWNlcykge1xuXHRjb25zdCBpbmRlbnRzID0gbmV3IE1hcCgpO1xuXG5cdC8vIFJlbWVtYmVyIHRoZSBzaXplIG9mIHByZXZpb3VzIGxpbmUncyBpbmRlbnRhdGlvblxuXHRsZXQgcHJldmlvdXNTaXplID0gMDtcblx0bGV0IHByZXZpb3VzSW5kZW50VHlwZTtcblxuXHQvLyBJbmRlbnRzIGtleSAoaWRlbnQgdHlwZSArIHNpemUgb2YgdGhlIGluZGVudHMvdW5pbmRlbnRzKVxuXHRsZXQga2V5O1xuXG5cdGZvciAoY29uc3QgbGluZSBvZiBzdHJpbmcuc3BsaXQoL1xcbi9nKSkge1xuXHRcdGlmICghbGluZSkge1xuXHRcdFx0Ly8gSWdub3JlIGVtcHR5IGxpbmVzXG5cdFx0XHRjb250aW51ZTtcblx0XHR9XG5cblx0XHRjb25zdCBtYXRjaGVzID0gbGluZS5tYXRjaChJTkRFTlRfUkVHRVgpO1xuXG5cdFx0aWYgKG1hdGNoZXMgPT09IG51bGwpIHtcblx0XHRcdHByZXZpb3VzU2l6ZSA9IDA7XG5cdFx0XHRwcmV2aW91c0luZGVudFR5cGUgPSAnJztcblx0XHR9IGVsc2Uge1xuXHRcdFx0Y29uc3QgaW5kZW50ID0gbWF0Y2hlc1swXS5sZW5ndGg7XG5cdFx0XHRjb25zdCBpbmRlbnRUeXBlID0gbWF0Y2hlc1sxXSA/IElOREVOVF9UWVBFX1NQQUNFIDogSU5ERU5UX1RZUEVfVEFCO1xuXG5cdFx0XHQvLyBJZ25vcmUgc2luZ2xlIHNwYWNlIHVubGVzcyBpdCdzIHRoZSBvbmx5IGluZGVudCBkZXRlY3RlZCB0byBwcmV2ZW50IGNvbW1vbiBmYWxzZSBwb3NpdGl2ZXNcblx0XHRcdGlmIChzaG91bGRJZ25vcmVTaW5nbGVTcGFjZShpZ25vcmVTaW5nbGVTcGFjZXMsIGluZGVudFR5cGUsIGluZGVudCkpIHtcblx0XHRcdFx0Y29udGludWU7XG5cdFx0XHR9XG5cblx0XHRcdGlmIChpbmRlbnRUeXBlICE9PSBwcmV2aW91c0luZGVudFR5cGUpIHtcblx0XHRcdFx0cHJldmlvdXNTaXplID0gMDtcblx0XHRcdH1cblxuXHRcdFx0cHJldmlvdXNJbmRlbnRUeXBlID0gaW5kZW50VHlwZTtcblxuXHRcdFx0bGV0IHVzZSA9IDE7XG5cdFx0XHRsZXQgd2VpZ2h0ID0gMDtcblxuXHRcdFx0Y29uc3QgaW5kZW50RGlmZmVyZW5jZSA9IGluZGVudCAtIHByZXZpb3VzU2l6ZTtcblx0XHRcdHByZXZpb3VzU2l6ZSA9IGluZGVudDtcblxuXHRcdFx0Ly8gUHJldmlvdXMgbGluZSBoYXZlIHNhbWUgaW5kZW50P1xuXHRcdFx0aWYgKGluZGVudERpZmZlcmVuY2UgPT09IDApIHtcblx0XHRcdFx0Ly8gTm90IGEgbmV3IFwidXNlXCIgb2YgdGhlIGN1cnJlbnQgaW5kZW50OlxuXHRcdFx0XHR1c2UgPSAwO1xuXHRcdFx0XHQvLyBCdXQgZG8gYWRkIGEgYml0IHRvIGl0IGZvciBicmVha2luZyB0aWVzOlxuXHRcdFx0XHR3ZWlnaHQgPSAxO1xuXHRcdFx0XHQvLyBXZSB1c2UgdGhlIGtleSBmcm9tIHByZXZpb3VzIGxvb3Bcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGNvbnN0IGFic29sdXRlSW5kZW50RGlmZmVyZW5jZSA9IE1hdGguYWJzKGluZGVudERpZmZlcmVuY2UpO1xuXG5cdFx0XHRcdC8vIElnbm9yZSBzaW5nbGUgc3BhY2UgY2hhbmdlcyB3aGVuIGlnbm9yZVNpbmdsZVNwYWNlcyBpcyB0cnVlXG5cdFx0XHRcdC8vIFRoaXMgcHJldmVudHMgY29tbW9uIGZhbHNlIHBvc2l0aXZlcyBmcm9tIHRoaW5ncyBsaWtlIGFsaWduZWQgY29tbWVudHNcblx0XHRcdFx0aWYgKHNob3VsZElnbm9yZVNpbmdsZVNwYWNlKGlnbm9yZVNpbmdsZVNwYWNlcywgaW5kZW50VHlwZSwgYWJzb2x1dGVJbmRlbnREaWZmZXJlbmNlKSkge1xuXHRcdFx0XHRcdGNvbnRpbnVlO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0a2V5ID0gZW5jb2RlSW5kZW50c0tleShpbmRlbnRUeXBlLCBhYnNvbHV0ZUluZGVudERpZmZlcmVuY2UpO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBVcGRhdGUgdGhlIHN0YXRzXG5cdFx0XHRjb25zdCBlbnRyeSA9IGluZGVudHMuZ2V0KGtleSk7XG5cdFx0XHRpbmRlbnRzLnNldChrZXksIGVudHJ5ID09PSB1bmRlZmluZWQgPyBbMSwgMF0gOiBbZW50cnlbMF0gKyB1c2UsIGVudHJ5WzFdICsgd2VpZ2h0XSk7XG5cdFx0fVxuXHR9XG5cblx0cmV0dXJuIGluZGVudHM7XG59XG5cbi8vIEVuY29kZSB0aGUgaW5kZW50IHR5cGUgYW5kIGFtb3VudCBhcyBhIHN0cmluZyAoZS5nLiAnczQnKSBmb3IgdXNlIGFzIGEgY29tcG91bmQga2V5IGluIHRoZSBpbmRlbnRzIE1hcC5cbmZ1bmN0aW9uIGVuY29kZUluZGVudHNLZXkoaW5kZW50VHlwZSwgaW5kZW50QW1vdW50KSB7XG5cdGNvbnN0IHR5cGVDaGFyYWN0ZXIgPSBpbmRlbnRUeXBlID09PSBJTkRFTlRfVFlQRV9TUEFDRSA/ICdzJyA6ICd0Jztcblx0cmV0dXJuIHR5cGVDaGFyYWN0ZXIgKyBTdHJpbmcoaW5kZW50QW1vdW50KTtcbn1cblxuLy8gRXh0cmFjdCB0aGUgaW5kZW50IHR5cGUgYW5kIGFtb3VudCBmcm9tIGEga2V5IG9mIHRoZSBpbmRlbnRzIE1hcC5cbmZ1bmN0aW9uIGRlY29kZUluZGVudHNLZXkoaW5kZW50c0tleSkge1xuXHRjb25zdCBrZXlIYXNUeXBlU3BhY2UgPSBpbmRlbnRzS2V5WzBdID09PSAncyc7XG5cdGNvbnN0IHR5cGUgPSBrZXlIYXNUeXBlU3BhY2UgPyBJTkRFTlRfVFlQRV9TUEFDRSA6IElOREVOVF9UWVBFX1RBQjtcblxuXHRjb25zdCBhbW91bnQgPSBOdW1iZXIoaW5kZW50c0tleS5zbGljZSgxKSk7XG5cblx0cmV0dXJuIHt0eXBlLCBhbW91bnR9O1xufVxuXG4vLyBSZXR1cm4gdGhlIGtleSAoZS5nLiAnczQnKSBmcm9tIHRoZSBpbmRlbnRzIE1hcCB0aGF0IHJlcHJlc2VudHMgdGhlIG1vc3QgY29tbW9uIGluZGVudCxcbi8vIG9yIHJldHVybiB1bmRlZmluZWQgaWYgdGhlcmUgYXJlIG5vIGluZGVudHMuXG5mdW5jdGlvbiBnZXRNb3N0VXNlZEtleShpbmRlbnRzKSB7XG5cdGxldCByZXN1bHQ7XG5cdGxldCBtYXhVc2VkID0gMDtcblx0bGV0IG1heFdlaWdodCA9IDA7XG5cblx0Zm9yIChjb25zdCBba2V5LCBbdXNlZENvdW50LCB3ZWlnaHRdXSBvZiBpbmRlbnRzKSB7XG5cdFx0aWYgKHVzZWRDb3VudCA+IG1heFVzZWQgfHwgKHVzZWRDb3VudCA9PT0gbWF4VXNlZCAmJiB3ZWlnaHQgPiBtYXhXZWlnaHQpKSB7XG5cdFx0XHRtYXhVc2VkID0gdXNlZENvdW50O1xuXHRcdFx0bWF4V2VpZ2h0ID0gd2VpZ2h0O1xuXHRcdFx0cmVzdWx0ID0ga2V5O1xuXHRcdH1cblx0fVxuXG5cdHJldHVybiByZXN1bHQ7XG59XG5cbmZ1bmN0aW9uIG1ha2VJbmRlbnRTdHJpbmcodHlwZSwgYW1vdW50KSB7XG5cdGNvbnN0IGluZGVudENoYXJhY3RlciA9IHR5cGUgPT09IElOREVOVF9UWVBFX1NQQUNFID8gJyAnIDogJ1xcdCc7XG5cdHJldHVybiBpbmRlbnRDaGFyYWN0ZXIucmVwZWF0KGFtb3VudCk7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGRldGVjdEluZGVudChzdHJpbmcpIHtcblx0aWYgKHR5cGVvZiBzdHJpbmcgIT09ICdzdHJpbmcnKSB7XG5cdFx0dGhyb3cgbmV3IFR5cGVFcnJvcignRXhwZWN0ZWQgYSBzdHJpbmcnKTtcblx0fVxuXG5cdC8vIElkZW50aWZ5IGluZGVudHMgd2hpbGUgc2tpcHBpbmcgc2luZ2xlIHNwYWNlIGluZGVudHMgdG8gYXZvaWQgY29tbW9uIGVkZ2UgY2FzZXMgKGUuZy4gY29kZSBjb21tZW50cylcblx0Ly8gSWYgbm8gaW5kZW50cyBhcmUgaWRlbnRpZmllZCwgcnVuIGFnYWluIGFuZCBpbmNsdWRlIGFsbCBpbmRlbnRzIGZvciBjb21wcmVoZW5zaXZlIGRldGVjdGlvblxuXHRsZXQgaW5kZW50cyA9IG1ha2VJbmRlbnRzTWFwKHN0cmluZywgdHJ1ZSk7XG5cdGlmIChpbmRlbnRzLnNpemUgPT09IDApIHtcblx0XHRpbmRlbnRzID0gbWFrZUluZGVudHNNYXAoc3RyaW5nLCBmYWxzZSk7XG5cdH1cblxuXHRjb25zdCBrZXlPZk1vc3RVc2VkSW5kZW50ID0gZ2V0TW9zdFVzZWRLZXkoaW5kZW50cyk7XG5cblx0bGV0IHR5cGU7XG5cdGxldCBhbW91bnQgPSAwO1xuXHRsZXQgaW5kZW50ID0gJyc7XG5cblx0aWYgKGtleU9mTW9zdFVzZWRJbmRlbnQgIT09IHVuZGVmaW5lZCkge1xuXHRcdCh7dHlwZSwgYW1vdW50fSA9IGRlY29kZUluZGVudHNLZXkoa2V5T2ZNb3N0VXNlZEluZGVudCkpO1xuXHRcdGluZGVudCA9IG1ha2VJbmRlbnRTdHJpbmcodHlwZSwgYW1vdW50KTtcblx0fVxuXG5cdHJldHVybiB7XG5cdFx0YW1vdW50LFxuXHRcdHR5cGUsXG5cdFx0aW5kZW50LFxuXHR9O1xufVxuIiwiZXhwb3J0IGZ1bmN0aW9uIGRldGVjdE5ld2xpbmUoc3RyaW5nKSB7XG5cdGlmICh0eXBlb2Ygc3RyaW5nICE9PSAnc3RyaW5nJykge1xuXHRcdHRocm93IG5ldyBUeXBlRXJyb3IoJ0V4cGVjdGVkIGEgc3RyaW5nJyk7XG5cdH1cblxuXHRjb25zdCBuZXdsaW5lcyA9IHN0cmluZy5tYXRjaCgvKD86XFxyP1xcbikvZykgfHwgW107XG5cblx0aWYgKG5ld2xpbmVzLmxlbmd0aCA9PT0gMCkge1xuXHRcdHJldHVybjtcblx0fVxuXG5cdGNvbnN0IGNybGYgPSBuZXdsaW5lcy5maWx0ZXIobmV3bGluZSA9PiBuZXdsaW5lID09PSAnXFxyXFxuJykubGVuZ3RoO1xuXHRjb25zdCBsZiA9IG5ld2xpbmVzLmxlbmd0aCAtIGNybGY7XG5cblx0cmV0dXJuIGNybGYgPiBsZiA/ICdcXHJcXG4nIDogJ1xcbic7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBkZXRlY3ROZXdsaW5lR3JhY2VmdWwoc3RyaW5nKSB7XG5cdHJldHVybiAodHlwZW9mIHN0cmluZyA9PT0gJ3N0cmluZycgJiYgZGV0ZWN0TmV3bGluZShzdHJpbmcpKSB8fCAnXFxuJztcbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJ1xuaW1wb3J0IHNvcnRPYmplY3RLZXlzIGZyb20gJ3NvcnQtb2JqZWN0LWtleXMnXG5pbXBvcnQgZGV0ZWN0SW5kZW50IGZyb20gJ2RldGVjdC1pbmRlbnQnXG5pbXBvcnQgeyBkZXRlY3ROZXdsaW5lR3JhY2VmdWwgYXMgZGV0ZWN0TmV3bGluZSB9IGZyb20gJ2RldGVjdC1uZXdsaW5lJ1xuaW1wb3J0IGdpdEhvb2tzIGZyb20gJ2dpdC1ob29rcy1saXN0J1xuaW1wb3J0IGlzUGxhaW5PYmplY3QgZnJvbSAnaXMtcGxhaW4tb2JqJ1xuaW1wb3J0IHNlbXZlckNvbXBhcmUgZnJvbSAnc2VtdmVyL2Z1bmN0aW9ucy9jb21wYXJlLmpzJ1xuaW1wb3J0IHNlbXZlck1pblZlcnNpb24gZnJvbSAnc2VtdmVyL3Jhbmdlcy9taW4tdmVyc2lvbi5qcydcblxuY29uc3QgcGlwZSA9XG4gIChmbnMpID0+XG4gICh4LCAuLi5hcmdzKSA9PlxuICAgIGZucy5yZWR1Y2UoKHJlc3VsdCwgZm4pID0+IGZuKHJlc3VsdCwgLi4uYXJncyksIHgpXG5jb25zdCBvbkFycmF5ID0gKGZuKSA9PiAoeCkgPT4gKEFycmF5LmlzQXJyYXkoeCkgPyBmbih4KSA6IHgpXG5jb25zdCBvblN0cmluZ0FycmF5ID0gKGZuKSA9PiAoeCkgPT5cbiAgQXJyYXkuaXNBcnJheSh4KSAmJiB4LmV2ZXJ5KChpdGVtKSA9PiB0eXBlb2YgaXRlbSA9PT0gJ3N0cmluZycpID8gZm4oeCkgOiB4XG5jb25zdCB1bmlxID0gb25TdHJpbmdBcnJheSgoeHMpID0+IFsuLi5uZXcgU2V0KHhzKV0pXG5jb25zdCBzb3J0QXJyYXkgPSBvblN0cmluZ0FycmF5KChhcnJheSkgPT4gYXJyYXkudG9Tb3J0ZWQoKSlcbmNvbnN0IHVuaXFBbmRTb3J0QXJyYXkgPSBwaXBlKFt1bmlxLCBzb3J0QXJyYXldKVxuY29uc3Qgb25PYmplY3QgPVxuICAoZm4pID0+XG4gICh4LCAuLi5hcmdzKSA9PlxuICAgIGlzUGxhaW5PYmplY3QoeCkgPyBmbih4LCAuLi5hcmdzKSA6IHhcbmNvbnN0IHNvcnRPYmplY3RCeSA9IChjb21wYXJhdG9yLCBkZWVwKSA9PiB7XG4gIGNvbnN0IG92ZXIgPSBvbk9iamVjdCgob2JqZWN0KSA9PiB7XG4gICAgaWYgKGRlZXApIHtcbiAgICAgIG9iamVjdCA9IE9iamVjdC5mcm9tRW50cmllcyhcbiAgICAgICAgT2JqZWN0LmVudHJpZXMob2JqZWN0KS5tYXAoKFtrZXksIHZhbHVlXSkgPT4gW2tleSwgb3Zlcih2YWx1ZSldKSxcbiAgICAgIClcbiAgICB9XG5cbiAgICByZXR1cm4gc29ydE9iamVjdEtleXMob2JqZWN0LCBjb21wYXJhdG9yKVxuICB9KVxuXG4gIHJldHVybiBvdmVyXG59XG5jb25zdCBvYmplY3RHcm91cEJ5ID1cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG4vbm8tdW5zdXBwb3J0ZWQtZmVhdHVyZXMvZXMtYnVpbHRpbnMsIG4vbm8tdW5zdXBwb3J0ZWQtZmVhdHVyZXMvZXMtc3ludGF4IC0tIFNhZmVcbiAgT2JqZWN0Lmdyb3VwQnkgfHxcbiAgLy8gUmVtb3ZlIHRoaXMgd2hlbiB3ZSBkcm9wIHN1cHBvcnQgZm9yIE5vZGUuanMgMjBcbiAgKChhcnJheSwgY2FsbGJhY2spID0+IHtcbiAgICBjb25zdCByZXN1bHQgPSBPYmplY3QuY3JlYXRlKG51bGwpXG4gICAgZm9yIChjb25zdCB2YWx1ZSBvZiBhcnJheSkge1xuICAgICAgY29uc3Qga2V5ID0gY2FsbGJhY2sodmFsdWUpXG4gICAgICBpZiAocmVzdWx0W2tleV0pIHtcbiAgICAgICAgcmVzdWx0W2tleV0ucHVzaCh2YWx1ZSlcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJlc3VsdFtrZXldID0gW3ZhbHVlXVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0XG4gIH0pXG5jb25zdCBzb3J0T2JqZWN0ID0gc29ydE9iamVjdEJ5KClcbmNvbnN0IHNvcnRVUkxPYmplY3QgPSBzb3J0T2JqZWN0QnkoWyd0eXBlJywgJ3VybCddKVxuY29uc3Qgc29ydFBlb3BsZU9iamVjdCA9IHNvcnRPYmplY3RCeShbJ25hbWUnLCAnZW1haWwnLCAndXJsJ10pXG5jb25zdCBzb3J0RGlyZWN0b3JpZXMgPSBzb3J0T2JqZWN0QnkoW1xuICAnbGliJyxcbiAgJ2JpbicsXG4gICdtYW4nLFxuICAnZG9jJyxcbiAgJ2V4YW1wbGUnLFxuICAndGVzdCcsXG5dKVxuY29uc3Qgb3ZlclByb3BlcnR5ID0gKHByb3BlcnR5LCBvdmVyKSA9PlxuICBvbk9iamVjdCgob2JqZWN0LCAuLi5hcmdzKSA9PlxuICAgIE9iamVjdC5oYXNPd24ob2JqZWN0LCBwcm9wZXJ0eSlcbiAgICAgID8geyAuLi5vYmplY3QsIFtwcm9wZXJ0eV06IG92ZXIob2JqZWN0W3Byb3BlcnR5XSwgLi4uYXJncykgfVxuICAgICAgOiBvYmplY3QsXG4gIClcbmNvbnN0IHNvcnRHaXRIb29rcyA9IHNvcnRPYmplY3RCeShnaXRIb29rcylcblxuY29uc3QgcGFyc2VOYW1lQW5kVmVyc2lvblJhbmdlID0gKHNwZWNpZmllcikgPT4ge1xuICAvLyBJZ25vcmUgYW55dGhpbmcgYWZ0ZXIgPiAmIHJlbHkgb24gZmFsbGJhY2sgYWxwaGFudW1lcmljIHNvcnRpbmcgZm9yIHRoYXRcbiAgY29uc3QgW25hbWVBbmRWZXJzaW9uXSA9IHNwZWNpZmllci5zcGxpdCgnPicpXG4gIGNvbnN0IGF0TWF0Y2hlcyA9IFsuLi5uYW1lQW5kVmVyc2lvbi5tYXRjaEFsbCgnQCcpXVxuICBpZiAoXG4gICAgIWF0TWF0Y2hlcy5sZW5ndGggfHxcbiAgICAoYXRNYXRjaGVzLmxlbmd0aCA9PT0gMSAmJiBhdE1hdGNoZXNbMF0uaW5kZXggPT09IDApXG4gICkge1xuICAgIHJldHVybiB7IG5hbWU6IHNwZWNpZmllciB9XG4gIH1cbiAgY29uc3Qgc3BsaXRJbmRleCA9IGF0TWF0Y2hlcy5wb3AoKS5pbmRleFxuICByZXR1cm4ge1xuICAgIG5hbWU6IG5hbWVBbmRWZXJzaW9uLnN1YnN0cmluZygwLCBzcGxpdEluZGV4KSxcbiAgICByYW5nZTogbmFtZUFuZFZlcnNpb24uc3Vic3RyaW5nKHNwbGl0SW5kZXggKyAxKSxcbiAgfVxufVxuXG5jb25zdCBzb3J0T2JqZWN0QnlTZW12ZXIgPSBzb3J0T2JqZWN0QnkoKGEsIGIpID0+IHtcbiAgY29uc3QgeyBuYW1lOiBhTmFtZSwgcmFuZ2U6IGFSYW5nZSB9ID0gcGFyc2VOYW1lQW5kVmVyc2lvblJhbmdlKGEpXG4gIGNvbnN0IHsgbmFtZTogYk5hbWUsIHJhbmdlOiBiUmFuZ2UgfSA9IHBhcnNlTmFtZUFuZFZlcnNpb25SYW5nZShiKVxuXG4gIGlmIChhTmFtZSAhPT0gYk5hbWUpIHtcbiAgICByZXR1cm4gYU5hbWUubG9jYWxlQ29tcGFyZShiTmFtZSwgJ2VuJylcbiAgfVxuICBpZiAoIWFSYW5nZSkge1xuICAgIHJldHVybiAtMVxuICB9XG4gIGlmICghYlJhbmdlKSB7XG4gICAgcmV0dXJuIDFcbiAgfVxuICByZXR1cm4gc2VtdmVyQ29tcGFyZShzZW12ZXJNaW5WZXJzaW9uKGFSYW5nZSksIHNlbXZlck1pblZlcnNpb24oYlJhbmdlKSlcbn0pXG5cbmNvbnN0IGdldFBhY2thZ2VOYW1lID0gKGlkZW50KSA9PiB7XG4gIGNvbnN0IGluZGV4ID0gaWRlbnQuaW5kZXhPZignQCcsIGlkZW50LnN0YXJ0c1dpdGgoJ0AnKSA/IDEgOiAwKVxuICAvLyBUaGlzIHNob3VsZCBub3QgaGFwcGVuLCB1bmxlc3MgdXNlciBtYW51YWxseSBlZGl0IHRoZSBwYWNrYWdlLmpzb24gZmlsZVxuICByZXR1cm4gaW5kZXggPT09IC0xID8gaWRlbnQgOiBpZGVudC5zbGljZSgwLCBpbmRleClcbn1cblxuY29uc3Qgc29ydE9iamVjdEJ5SWRlbnQgPSAoYSwgYikgPT4ge1xuICBjb25zdCBwYWNrYWdlTmFtZUEgPSBnZXRQYWNrYWdlTmFtZShhKVxuICBjb25zdCBwYWNrYWdlTmFtZUIgPSBnZXRQYWNrYWdlTmFtZShiKVxuXG4gIGlmIChwYWNrYWdlTmFtZUEgPCBwYWNrYWdlTmFtZUIpIHJldHVybiAtMVxuICBpZiAocGFja2FnZU5hbWVBID4gcGFja2FnZU5hbWVCKSByZXR1cm4gMVxuICByZXR1cm4gMFxufVxuXG4vLyBDYWNoZSBieSBgcHJvY2Vzcy5jd2QoKWAgaW5zdGVhZCBvZiBhIHZhcmlhYmxlIHRvIGFsbG93IHVzZXIgY2FsbCBgcHJvY2Vzcy5jaGRpcigpYFxuY29uc3QgY2FjaGUgPSBuZXcgTWFwKClcbmNvbnN0IGhhc1lhcm5PclBucG1GaWxlcyA9ICgpID0+IHtcbiAgY29uc3QgY3dkID0gcHJvY2Vzcy5jd2QoKVxuICBpZiAoIWNhY2hlLmhhcyhjd2QpKSB7XG4gICAgY2FjaGUuc2V0KFxuICAgICAgY3dkLFxuICAgICAgZnMuZXhpc3RzU3luYygneWFybi5sb2NrJykgfHxcbiAgICAgICAgZnMuZXhpc3RzU3luYygnLnlhcm4vJykgfHxcbiAgICAgICAgZnMuZXhpc3RzU3luYygnLnlhcm5yYy55bWwnKSB8fFxuICAgICAgICBmcy5leGlzdHNTeW5jKCdwbnBtLWxvY2sueWFtbCcpIHx8XG4gICAgICAgIGZzLmV4aXN0c1N5bmMoJ3BucG0td29ya3NwYWNlLnlhbWwnKSxcbiAgICApXG4gIH1cbiAgcmV0dXJuIGNhY2hlLmdldChjd2QpXG59XG5cbi8qKlxuICogRGV0ZWN0cyB0aGUgcGFja2FnZSBtYW5hZ2VyIGZyb20gcGFja2FnZS5qc29uIGFuZCBsb2NrIGZpbGVzXG4gKiBAcGFyYW0ge29iamVjdH0gcGFja2FnZUpzb24gLSBUaGUgcGFyc2VkIHBhY2thZ2UuanNvbiBvYmplY3RcbiAqIEByZXR1cm5zIHtib29sZWFufSAtIFRoZSBkZXRlY3RlZCBwYWNrYWdlIG1hbmFnZXIuIERlZmF1bHQgdG8gbnBtIGlmIG5vdCBkZXRlY3RlZC5cbiAqL1xuZnVuY3Rpb24gc2hvdWxkU29ydERlcGVuZGVuY2llc0xpa2VOcG0ocGFja2FnZUpzb24pIHtcbiAgLy8gaHR0cHM6Ly9naXRodWIuY29tL25vZGVqcy9jb3JlcGFja1xuICBpZiAodHlwZW9mIHBhY2thZ2VKc29uLnBhY2thZ2VNYW5hZ2VyID09PSAnc3RyaW5nJykge1xuICAgIHJldHVybiBwYWNrYWdlSnNvbi5wYWNrYWdlTWFuYWdlci5zdGFydHNXaXRoKCducG1AJylcbiAgfVxuXG4gIGlmIChwYWNrYWdlSnNvbi5kZXZFbmdpbmVzPy5wYWNrYWdlTWFuYWdlcj8ubmFtZSkge1xuICAgIHJldHVybiBwYWNrYWdlSnNvbi5kZXZFbmdpbmVzLnBhY2thZ2VNYW5hZ2VyLm5hbWUgPT09ICducG0nXG4gIH1cblxuICBpZiAocGFja2FnZUpzb24ucG5wbSkge1xuICAgIHJldHVybiBmYWxzZVxuICB9XG5cbiAgLy8gT3B0aW1pc2F0aW9uOiBDaGVjayBpZiBucG0gaXMgZXhwbGljaXQgYmVmb3JlIHJlYWRpbmcgRlMuXG4gIGlmIChwYWNrYWdlSnNvbi5lbmdpbmVzPy5ucG0pIHtcbiAgICByZXR1cm4gdHJ1ZVxuICB9XG5cbiAgaWYgKGhhc1lhcm5PclBucG1GaWxlcygpKSB7XG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cblxuICByZXR1cm4gdHJ1ZVxufVxuXG4vKipcbiAqIFNvcnQgZGVwZW5kZW5jaWVzIGFscGhhYmV0aWNhbGx5LCBkZXRlY3RpbmcgcGFja2FnZSBtYW5hZ2VyIHRvIHVzZSB0aGVcbiAqIGFwcHJvcHJpYXRlIGNvbXBhcmlzb24uIG5wbSB1c2VzIGxvY2FsZS1hd2FyZSBjb21wYXJpc29uLCB5YXJuIGFuZCBwbnBtIHVzZVxuICogc2ltcGxlIHN0cmluZyBjb21wYXJpc29uXG4gKi9cbmNvbnN0IHNvcnREZXBlbmRlbmNpZXMgPSBvbk9iamVjdCgoZGVwZW5kZW5jaWVzLCBwYWNrYWdlSnNvbikgPT4ge1xuICAvLyBBdm9pZCBmaWxlIGFjY2Vzc1xuICBpZiAoT2JqZWN0LmtleXMoZGVwZW5kZW5jaWVzKS5sZW5ndGggPCAyKSB7XG4gICAgcmV0dXJuIGRlcGVuZGVuY2llc1xuICB9XG5cbiAgLy8gc29ydCBkZXBzIGxpa2UgdGhlIG5wbSBDTEkgZG9lcyAodmlhIHRoZSBwYWNrYWdlIEBucG1jbGkvcGFja2FnZS1qc29uKVxuICAvLyBodHRwczovL2dpdGh1Yi5jb20vbnBtL3BhY2thZ2UtanNvbi9ibG9iL2I2NDY1ZjQ0YzcyN2Q2NTEzZGI2ODk4YzdjYmU0MWRkMzU1Y2ViZTgvbGliL3VwZGF0ZS1kZXBlbmRlbmNpZXMuanMjTDgtTDIxXG4gIGlmIChzaG91bGRTb3J0RGVwZW5kZW5jaWVzTGlrZU5wbShwYWNrYWdlSnNvbikpIHtcbiAgICByZXR1cm4gc29ydE9iamVjdEtleXMoZGVwZW5kZW5jaWVzLCAoYSwgYikgPT4gYS5sb2NhbGVDb21wYXJlKGIsICdlbicpKVxuICB9XG5cbiAgcmV0dXJuIHNvcnRPYmplY3RLZXlzKGRlcGVuZGVuY2llcylcbn0pXG5cbi8qKlxuICogXCJ3b3Jrc3BhY2VzXCIgY2FuIGJlIGFuIGFycmF5IChucG0gb3IgeWFybiBjbGFzc2ljKSBvciBhbiBvYmplY3QgKHBucG0vYnVuKS5cbiAqIEluIHRoZSBjYXNlIG9mIGFuIGFycmF5LCB3ZSBkbyBub3Qgd2FudCB0byBhbHBoYWJldGljYWxseSBzb3J0IGl0IGluIGNhc2VcbiAqIHNjcmlwdHMgbmVlZCB0byBydW4gaW4gYSBzcGVjaWZpYyBvcmRlci5cbiAqXG4gKiBAc2VlIGh0dHBzOi8vZG9jcy5ucG1qcy5jb20vY2xpL3Y3L3VzaW5nLW5wbS93b3Jrc3BhY2VzP3Y9dHJ1ZSNydW5uaW5nLWNvbW1hbmRzLWluLXRoZS1jb250ZXh0LW9mLXdvcmtzcGFjZXNcbiAqL1xuY29uc3Qgc29ydFdvcmtzcGFjZXMgPSBwaXBlKFtcbiAgc29ydE9iamVjdEJ5KFsncGFja2FnZXMnLCAnY2F0YWxvZyddKSxcbiAgb3ZlclByb3BlcnR5KCdwYWNrYWdlcycsIHVuaXFBbmRTb3J0QXJyYXkpLFxuICBvdmVyUHJvcGVydHkoJ2NhdGFsb2cnLCBzb3J0RGVwZW5kZW5jaWVzKSxcbl0pXG5cbi8vIGh0dHBzOi8vZ2l0aHViLmNvbS9lc2xpbnQvZXNsaW50L2Jsb2IvYWNjMGU0NzU3MmE5MzkwMjkyYjRlMzEzYjRhNGJmMzYwZDIzNjM1OC9jb25mL2NvbmZpZy1zY2hlbWEuanNcbmNvbnN0IGVzbGludEJhc2VDb25maWdQcm9wZXJ0aWVzID0gW1xuICAvLyBgZmlsZXNgIGFuZCBgZXhjbHVkZWRGaWxlc2AgYXJlIG9ubHkgb24gYG92ZXJyaWRlc1tdYFxuICAvLyBmb3IgZWFzaWVyIHNvcnQgYG92ZXJyaWRlc1tdYCxcbiAgLy8gYWRkIHRoZW0gdG8gaGVyZSwgc28gd2UgZG9uJ3QgbmVlZCBzb3J0IGBvdmVycmlkZXNbXWAgdHdpY2VcbiAgJ2ZpbGVzJyxcbiAgJ2V4Y2x1ZGVkRmlsZXMnLFxuICAvLyBiYXNlQ29uZmlnXG4gICdlbnYnLFxuICAncGFyc2VyJyxcbiAgJ3BhcnNlck9wdGlvbnMnLFxuICAnc2V0dGluZ3MnLFxuICAncGx1Z2lucycsXG4gICdleHRlbmRzJyxcbiAgJ3J1bGVzJyxcbiAgJ292ZXJyaWRlcycsXG4gICdnbG9iYWxzJyxcbiAgJ3Byb2Nlc3NvcicsXG4gICdub0lubGluZUNvbmZpZycsXG4gICdyZXBvcnRVbnVzZWREaXNhYmxlRGlyZWN0aXZlcycsXG5dXG5jb25zdCBzb3J0RXNsaW50Q29uZmlnID0gcGlwZShbXG4gIHNvcnRPYmplY3RCeShlc2xpbnRCYXNlQ29uZmlnUHJvcGVydGllcyksXG4gIG92ZXJQcm9wZXJ0eSgnZW52Jywgc29ydE9iamVjdCksXG4gIG92ZXJQcm9wZXJ0eSgnZ2xvYmFscycsIHNvcnRPYmplY3QpLFxuICBvdmVyUHJvcGVydHkoXG4gICAgJ292ZXJyaWRlcycsXG4gICAgb25BcnJheSgob3ZlcnJpZGVzKSA9PiBvdmVycmlkZXMubWFwKHNvcnRFc2xpbnRDb25maWcpKSxcbiAgKSxcbiAgb3ZlclByb3BlcnR5KCdwYXJzZXJPcHRpb25zJywgc29ydE9iamVjdCksXG4gIG92ZXJQcm9wZXJ0eShcbiAgICAncnVsZXMnLFxuICAgIHNvcnRPYmplY3RCeShcbiAgICAgIChydWxlMSwgcnVsZTIpID0+XG4gICAgICAgIHJ1bGUxLnNwbGl0KCcvJykubGVuZ3RoIC0gcnVsZTIuc3BsaXQoJy8nKS5sZW5ndGggfHxcbiAgICAgICAgcnVsZTEubG9jYWxlQ29tcGFyZShydWxlMiksXG4gICAgKSxcbiAgKSxcbiAgb3ZlclByb3BlcnR5KCdzZXR0aW5ncycsIHNvcnRPYmplY3QpLFxuXSlcbmNvbnN0IHNvcnRWU0NvZGVCYWRnZU9iamVjdCA9IHNvcnRPYmplY3RCeShbJ2Rlc2NyaXB0aW9uJywgJ3VybCcsICdocmVmJ10pXG5cbmNvbnN0IHNvcnRQcmV0dGllckNvbmZpZyA9IHBpcGUoW1xuICAvLyBzb3J0IGtleXMgYWxwaGFiZXRpY2FsbHksIGJ1dCBwdXQgYG92ZXJyaWRlc2AgYXQgYm90dG9tXG4gIG9uT2JqZWN0KChjb25maWcpID0+XG4gICAgc29ydE9iamVjdEtleXMoY29uZmlnLCBbXG4gICAgICAuLi5PYmplY3Qua2V5cyhjb25maWcpXG4gICAgICAgIC5maWx0ZXIoKGtleSkgPT4ga2V5ICE9PSAnb3ZlcnJpZGVzJylcbiAgICAgICAgLnNvcnQoKSxcbiAgICAgICdvdmVycmlkZXMnLFxuICAgIF0pLFxuICApLFxuICAvLyBpZiBgY29uZmlnLm92ZXJyaWRlc2AgZXhpc3RzXG4gIG92ZXJQcm9wZXJ0eShcbiAgICAnb3ZlcnJpZGVzJyxcbiAgICAvLyBhbmQgYGNvbmZpZy5vdmVycmlkZXNgIGlzIGFuIGFycmF5XG4gICAgb25BcnJheSgob3ZlcnJpZGVzKSA9PlxuICAgICAgb3ZlcnJpZGVzLm1hcChcbiAgICAgICAgcGlwZShbXG4gICAgICAgICAgLy8gc29ydCBgY29uZmlnLm92ZXJyaWRlc1tdYCBhbHBoYWJldGljYWxseVxuICAgICAgICAgIHNvcnRPYmplY3QsXG4gICAgICAgICAgLy8gc29ydCBgY29uZmlnLm92ZXJyaWRlc1tdLm9wdGlvbnNgIGFscGhhYmV0aWNhbGx5XG4gICAgICAgICAgb3ZlclByb3BlcnR5KCdvcHRpb25zJywgc29ydE9iamVjdCksXG4gICAgICAgIF0pLFxuICAgICAgKSxcbiAgICApLFxuICApLFxuXSlcblxuY29uc3Qgc29ydFZvbHRhID0gc29ydE9iamVjdEJ5KFsnbm9kZScsICducG0nLCAneWFybiddKVxuY29uc3Qgc29ydERldkVuZ2luZXMgPSBvdmVyUHJvcGVydHkoXG4gICdwYWNrYWdlTWFuYWdlcicsXG4gIHNvcnRPYmplY3RCeShbJ25hbWUnLCAndmVyc2lvbicsICdvbkZhaWwnXSksXG4pXG5cbmNvbnN0IHBucG1CYXNlQ29uZmlnUHJvcGVydGllcyA9IFtcbiAgJ3BlZXJEZXBlbmRlbmN5UnVsZXMnLFxuICAnbmV2ZXJCdWlsdERlcGVuZGVuY2llcycsXG4gICdvbmx5QnVpbHREZXBlbmRlbmNpZXMnLFxuICAnb25seUJ1aWx0RGVwZW5kZW5jaWVzRmlsZScsXG4gICdhbGxvd2VkRGVwcmVjYXRlZFZlcnNpb25zJyxcbiAgJ2FsbG93Tm9uQXBwbGllZFBhdGNoZXMnLFxuICAndXBkYXRlQ29uZmlnJyxcbiAgJ2F1ZGl0Q29uZmlnJyxcbiAgJ3JlcXVpcmVkU2NyaXB0cycsXG4gICdzdXBwb3J0ZWRBcmNoaXRlY3R1cmVzJyxcbiAgJ292ZXJyaWRlcycsXG4gICdwYXRjaGVkRGVwZW5kZW5jaWVzJyxcbiAgJ3BhY2thZ2VFeHRlbnNpb25zJyxcbl1cblxuY29uc3Qgc29ydFBucG1Db25maWcgPSBwaXBlKFtcbiAgc29ydE9iamVjdEJ5KHBucG1CYXNlQ29uZmlnUHJvcGVydGllcywgdHJ1ZSksXG4gIG92ZXJQcm9wZXJ0eSgnb3ZlcnJpZGVzJywgc29ydE9iamVjdEJ5U2VtdmVyKSxcbl0pXG5cbi8vIFNlZSBodHRwczovL2RvY3MubnBtanMuY29tL21pc2Mvc2NyaXB0c1xuY29uc3QgZGVmYXVsdE5wbVNjcmlwdHMgPSBuZXcgU2V0KFtcbiAgJ2luc3RhbGwnLFxuICAncGFjaycsXG4gICdwcmVwYXJlJyxcbiAgJ3B1Ymxpc2gnLFxuICAncmVzdGFydCcsXG4gICdzaHJpbmt3cmFwJyxcbiAgJ3N0YXJ0JyxcbiAgJ3N0b3AnLFxuICAndGVzdCcsXG4gICd1bmluc3RhbGwnLFxuICAndmVyc2lvbicsXG5dKVxuXG5jb25zdCBoYXNEZXZEZXBlbmRlbmN5ID0gKGRlcGVuZGVuY3ksIHBhY2thZ2VKc29uKSA9PiB7XG4gIHJldHVybiAoXG4gICAgT2JqZWN0Lmhhc093bihwYWNrYWdlSnNvbiwgJ2RldkRlcGVuZGVuY2llcycpICYmXG4gICAgT2JqZWN0Lmhhc093bihwYWNrYWdlSnNvbi5kZXZEZXBlbmRlbmNpZXMsIGRlcGVuZGVuY3kpXG4gIClcbn1cblxuY29uc3QgcnVuU1JlZ0V4cCA9XG4gIC8oPzw9XnxbXFxzJjs8PnwoXSkoPzpydW4tc3xucG0tcnVuLWFsbDI/IC4qKD86LS1zZXF1ZW50aWFsfC0tc2VyaWFsfC1zKSkoPz0kfFtcXHMmOzw+fCldKS9cblxuY29uc3QgaXNTZXF1ZW50aWFsU2NyaXB0ID0gKGNvbW1hbmQpID0+XG4gIGNvbW1hbmQuaW5jbHVkZXMoJyonKSAmJiBydW5TUmVnRXhwLnRlc3QoY29tbWFuZClcblxuY29uc3QgaGFzU2VxdWVudGlhbFNjcmlwdCA9IChwYWNrYWdlSnNvbikgPT4ge1xuICBpZiAoXG4gICAgIWhhc0RldkRlcGVuZGVuY3koJ25wbS1ydW4tYWxsJywgcGFja2FnZUpzb24pICYmXG4gICAgIWhhc0RldkRlcGVuZGVuY3koJ25wbS1ydW4tYWxsMicsIHBhY2thZ2VKc29uKVxuICApIHtcbiAgICByZXR1cm4gZmFsc2VcbiAgfVxuICBjb25zdCBzY3JpcHRzID0gWydzY3JpcHRzJywgJ2JldHRlclNjcmlwdHMnXS5mbGF0TWFwKChmaWVsZCkgPT5cbiAgICBwYWNrYWdlSnNvbltmaWVsZF0gPyBPYmplY3QudmFsdWVzKHBhY2thZ2VKc29uW2ZpZWxkXSkgOiBbXSxcbiAgKVxuICByZXR1cm4gc2NyaXB0cy5zb21lKChzY3JpcHQpID0+IGlzU2VxdWVudGlhbFNjcmlwdChzY3JpcHQpKVxufVxuXG5mdW5jdGlvbiBzb3J0U2NyaXB0TmFtZXMoa2V5cywgcHJlZml4ID0gJycpIHtcbiAgY29uc3QgZ3JvdXBNYXAgPSBuZXcgTWFwKClcbiAgZm9yIChjb25zdCBrZXkgb2Yga2V5cykge1xuICAgIGNvbnN0IHJlc3QgPSBwcmVmaXggPyBrZXkuc2xpY2UocHJlZml4Lmxlbmd0aCArIDEpIDoga2V5XG4gICAgY29uc3QgaWR4ID0gcmVzdC5pbmRleE9mKCc6JylcbiAgICBpZiAoaWR4ID4gMCkge1xuICAgICAgY29uc3QgYmFzZSA9IGtleS5zbGljZSgwLCAocHJlZml4ID8gcHJlZml4Lmxlbmd0aCArIDEgOiAwKSArIGlkeClcbiAgICAgIGlmICghZ3JvdXBNYXAuaGFzKGJhc2UpKSBncm91cE1hcC5zZXQoYmFzZSwgW10pXG4gICAgICBncm91cE1hcC5nZXQoYmFzZSkucHVzaChrZXkpXG4gICAgfSBlbHNlIHtcbiAgICAgIGlmICghZ3JvdXBNYXAuaGFzKGtleSkpIGdyb3VwTWFwLnNldChrZXksIFtdKVxuICAgICAgZ3JvdXBNYXAuZ2V0KGtleSkucHVzaChrZXkpXG4gICAgfVxuICB9XG4gIHJldHVybiBBcnJheS5mcm9tKGdyb3VwTWFwLmtleXMoKSlcbiAgICAuc29ydCgpXG4gICAgLmZsYXRNYXAoKGdyb3VwS2V5KSA9PiB7XG4gICAgICBjb25zdCBjaGlsZHJlbiA9IGdyb3VwTWFwLmdldChncm91cEtleSlcbiAgICAgIGlmIChcbiAgICAgICAgY2hpbGRyZW4ubGVuZ3RoID4gMSAmJlxuICAgICAgICBjaGlsZHJlbi5zb21lKChrKSA9PiBrICE9PSBncm91cEtleSAmJiBrLnN0YXJ0c1dpdGgoZ3JvdXBLZXkgKyAnOicpKVxuICAgICAgKSB7XG4gICAgICAgIGNvbnN0IGRpcmVjdCA9IGNoaWxkcmVuXG4gICAgICAgICAgLmZpbHRlcigoaykgPT4gayA9PT0gZ3JvdXBLZXkgfHwgIWsuc3RhcnRzV2l0aChncm91cEtleSArICc6JykpXG4gICAgICAgICAgLnNvcnQoKVxuICAgICAgICBjb25zdCBuZXN0ZWQgPSBjaGlsZHJlbi5maWx0ZXIoKGspID0+IGsuc3RhcnRzV2l0aChncm91cEtleSArICc6JykpXG4gICAgICAgIHJldHVybiBbLi4uZGlyZWN0LCAuLi5zb3J0U2NyaXB0TmFtZXMobmVzdGVkLCBncm91cEtleSldXG4gICAgICB9XG4gICAgICByZXR1cm4gY2hpbGRyZW4uc29ydCgpXG4gICAgfSlcbn1cblxuY29uc3Qgc29ydFNjcmlwdHMgPSBvbk9iamVjdCgoc2NyaXB0cywgcGFja2FnZUpzb24pID0+IHtcbiAgbGV0IG5hbWVzID0gT2JqZWN0LmtleXMoc2NyaXB0cylcbiAgY29uc3QgcHJlZml4YWJsZSA9IG5ldyBTZXQoKVxuXG4gIG5hbWVzID0gbmFtZXMubWFwKChuYW1lKSA9PiB7XG4gICAgY29uc3Qgb21pdHRlZCA9IG5hbWUucmVwbGFjZSgvXig/OnByZXxwb3N0KS8sICcnKVxuICAgIGlmIChkZWZhdWx0TnBtU2NyaXB0cy5oYXMob21pdHRlZCkgfHwgbmFtZXMuaW5jbHVkZXMob21pdHRlZCkpIHtcbiAgICAgIHByZWZpeGFibGUuYWRkKG9taXR0ZWQpXG4gICAgICByZXR1cm4gb21pdHRlZFxuICAgIH1cbiAgICByZXR1cm4gbmFtZVxuICB9KVxuXG4gIGlmICghaGFzU2VxdWVudGlhbFNjcmlwdChwYWNrYWdlSnNvbikpIHtcbiAgICBuYW1lcyA9IHNvcnRTY3JpcHROYW1lcyhuYW1lcylcbiAgfVxuICBuYW1lcyA9IG5hbWVzLmZsYXRNYXAoKGtleSkgPT5cbiAgICBwcmVmaXhhYmxlLmhhcyhrZXkpID8gW2BwcmUke2tleX1gLCBrZXksIGBwb3N0JHtrZXl9YF0gOiBba2V5XSxcbiAgKVxuICByZXR1cm4gc29ydE9iamVjdEtleXMoc2NyaXB0cywgbmFtZXMpXG59KVxuXG4vKlxuLSBNb3ZlIGBkZWZhdWx0YCBjb25kaXRpb24gdG8gYm90dG9tXG4qL1xuY29uc3Qgc29ydENvbmRpdGlvbnMgPSAoY29uZGl0aW9ucykgPT4ge1xuICBjb25zdCB7IGRlZmF1bHRDb25kaXRpb25zID0gW10sIHJlc3RDb25kaXRpb25zID0gW10gfSA9IG9iamVjdEdyb3VwQnkoXG4gICAgY29uZGl0aW9ucyxcbiAgICAoY29uZGl0aW9uKSA9PiB7XG4gICAgICBpZiAoY29uZGl0aW9uID09PSAnZGVmYXVsdCcpIHtcbiAgICAgICAgcmV0dXJuICdkZWZhdWx0Q29uZGl0aW9ucydcbiAgICAgIH1cblxuICAgICAgcmV0dXJuICdyZXN0Q29uZGl0aW9ucydcbiAgICB9LFxuICApXG5cbiAgcmV0dXJuIFsuLi5yZXN0Q29uZGl0aW9ucywgLi4uZGVmYXVsdENvbmRpdGlvbnNdXG59XG5cbmNvbnN0IHNvcnRFeHBvcnRzID0gb25PYmplY3QoKGV4cG9ydHMpID0+IHtcbiAgY29uc3QgeyBwYXRocyA9IFtdLCBjb25kaXRpb25zID0gW10gfSA9IG9iamVjdEdyb3VwQnkoXG4gICAgT2JqZWN0LmtleXMoZXhwb3J0cyksXG4gICAgKGtleSkgPT4gKGtleS5zdGFydHNXaXRoKCcuJykgPyAncGF0aHMnIDogJ2NvbmRpdGlvbnMnKSxcbiAgKVxuXG4gIHJldHVybiBPYmplY3QuZnJvbUVudHJpZXMoXG4gICAgWy4uLnBhdGhzLCAuLi5zb3J0Q29uZGl0aW9ucyhjb25kaXRpb25zKV0ubWFwKChrZXkpID0+IFtcbiAgICAgIGtleSxcbiAgICAgIHNvcnRFeHBvcnRzKGV4cG9ydHNba2V5XSksXG4gICAgXSksXG4gIClcbn0pXG5cbi8vIGZpZWxkcyBtYXJrZWQgYHZzY29kZWAgYXJlIGZvciBgVmlzdWFsIFN0dWRpbyBDb2RlIGV4dGVuc2lvbiBtYW5pZmVzdGAgb25seVxuLy8gaHR0cHM6Ly9jb2RlLnZpc3VhbHN0dWRpby5jb20vYXBpL3JlZmVyZW5jZXMvZXh0ZW5zaW9uLW1hbmlmZXN0XG4vLyBTdXBwb3J0ZWQgZmllbGRzOlxuLy8gcHVibGlzaGVyLCBkaXNwbGF5TmFtZSwgY2F0ZWdvcmllcywgZ2FsbGVyeUJhbm5lciwgcHJldmlldywgY29udHJpYnV0ZXMsXG4vLyBhY3RpdmF0aW9uRXZlbnRzLCBiYWRnZXMsIG1hcmtkb3duLCBxbmEsIGV4dGVuc2lvblBhY2ssXG4vLyBleHRlbnNpb25EZXBlbmRlbmNpZXMsIGljb25cblxuLy8gZmllbGQua2V5e3N0cmluZ306IGZpZWxkIG5hbWVcbi8vIGZpZWxkLm92ZXJ7ZnVuY3Rpb259OiBzb3J0IGZpZWxkIHN1YktleVxuY29uc3QgZmllbGRzID0gW1xuICB7IGtleTogJyRzY2hlbWEnIH0sXG4gIHsga2V5OiAnbmFtZScgfSxcbiAgLyogdnNjb2RlICovIHsga2V5OiAnZGlzcGxheU5hbWUnIH0sXG4gIHsga2V5OiAndmVyc2lvbicgfSxcbiAgLyogeWFybiAqLyB7IGtleTogJ3N0YWJsZVZlcnNpb24nIH0sXG4gIHsga2V5OiAncHJpdmF0ZScgfSxcbiAgeyBrZXk6ICdkZXNjcmlwdGlvbicgfSxcbiAgLyogdnNjb2RlICovIHsga2V5OiAnY2F0ZWdvcmllcycsIG92ZXI6IHVuaXEgfSxcbiAgeyBrZXk6ICdrZXl3b3JkcycsIG92ZXI6IHVuaXEgfSxcbiAgeyBrZXk6ICdob21lcGFnZScgfSxcbiAgeyBrZXk6ICdidWdzJywgb3Zlcjogc29ydE9iamVjdEJ5KFsndXJsJywgJ2VtYWlsJ10pIH0sXG4gIHsga2V5OiAncmVwb3NpdG9yeScsIG92ZXI6IHNvcnRVUkxPYmplY3QgfSxcbiAgeyBrZXk6ICdmdW5kaW5nJywgb3Zlcjogc29ydFVSTE9iamVjdCB9LFxuICB7IGtleTogJ2xpY2Vuc2UnLCBvdmVyOiBzb3J0VVJMT2JqZWN0IH0sXG4gIC8qIHZzY29kZSAqLyB7IGtleTogJ3FuYScgfSxcbiAgeyBrZXk6ICdhdXRob3InLCBvdmVyOiBzb3J0UGVvcGxlT2JqZWN0IH0sXG4gIHtcbiAgICBrZXk6ICdtYWludGFpbmVycycsXG4gICAgb3Zlcjogb25BcnJheSgobWFpbnRhaW5lcnMpID0+IG1haW50YWluZXJzLm1hcChzb3J0UGVvcGxlT2JqZWN0KSksXG4gIH0sXG4gIHtcbiAgICBrZXk6ICdjb250cmlidXRvcnMnLFxuICAgIG92ZXI6IG9uQXJyYXkoKGNvbnRyaWJ1dG9ycykgPT4gY29udHJpYnV0b3JzLm1hcChzb3J0UGVvcGxlT2JqZWN0KSksXG4gIH0sXG4gIC8qIHZzY29kZSAqLyB7IGtleTogJ3B1Ymxpc2hlcicgfSxcbiAgeyBrZXk6ICdzaWRlRWZmZWN0cycgfSxcbiAgeyBrZXk6ICd0eXBlJyB9LFxuICB7IGtleTogJ2ltcG9ydHMnIH0sXG4gIHsga2V5OiAnZXhwb3J0cycsIG92ZXI6IHNvcnRFeHBvcnRzIH0sXG4gIHsga2V5OiAnbWFpbicgfSxcbiAgeyBrZXk6ICdzdmVsdGUnIH0sXG4gIHsga2V5OiAndW1kOm1haW4nIH0sXG4gIHsga2V5OiAnanNkZWxpdnInIH0sXG4gIHsga2V5OiAndW5wa2cnIH0sXG4gIHsga2V5OiAnbW9kdWxlJyB9LFxuICB7IGtleTogJ3NvdXJjZScgfSxcbiAgeyBrZXk6ICdqc25leHQ6bWFpbicgfSxcbiAgeyBrZXk6ICdicm93c2VyJyB9LFxuICB7IGtleTogJ3JlYWN0LW5hdGl2ZScgfSxcbiAgeyBrZXk6ICd0eXBlcycgfSxcbiAgeyBrZXk6ICd0eXBlc1ZlcnNpb25zJyB9LFxuICB7IGtleTogJ3R5cGluZ3MnIH0sXG4gIHsga2V5OiAnc3R5bGUnIH0sXG4gIHsga2V5OiAnZXhhbXBsZScgfSxcbiAgeyBrZXk6ICdleGFtcGxlc3R5bGUnIH0sXG4gIHsga2V5OiAnYXNzZXRzJyB9LFxuICB7IGtleTogJ2JpbicsIG92ZXI6IHNvcnRPYmplY3QgfSxcbiAgeyBrZXk6ICdtYW4nIH0sXG4gIHsga2V5OiAnZGlyZWN0b3JpZXMnLCBvdmVyOiBzb3J0RGlyZWN0b3JpZXMgfSxcbiAgeyBrZXk6ICdmaWxlcycsIG92ZXI6IHVuaXEgfSxcbiAgeyBrZXk6ICd3b3Jrc3BhY2VzJywgb3Zlcjogc29ydFdvcmtzcGFjZXMgfSxcbiAgLy8gbm9kZS1wcmUtZ3lwIGh0dHBzOi8vd3d3Lm5wbWpzLmNvbS9wYWNrYWdlL25vZGUtcHJlLWd5cCMxLWFkZC1uZXctZW50cmllcy10by15b3VyLXBhY2thZ2Vqc29uXG4gIHtcbiAgICBrZXk6ICdiaW5hcnknLFxuICAgIG92ZXI6IHNvcnRPYmplY3RCeShbXG4gICAgICAnbW9kdWxlX25hbWUnLFxuICAgICAgJ21vZHVsZV9wYXRoJyxcbiAgICAgICdyZW1vdGVfcGF0aCcsXG4gICAgICAncGFja2FnZV9uYW1lJyxcbiAgICAgICdob3N0JyxcbiAgICBdKSxcbiAgfSxcbiAgeyBrZXk6ICdzY3JpcHRzJywgb3Zlcjogc29ydFNjcmlwdHMgfSxcbiAgeyBrZXk6ICdiZXR0ZXJTY3JpcHRzJywgb3Zlcjogc29ydFNjcmlwdHMgfSxcbiAgLyogdnNjb2RlICovIHsga2V5OiAnbDEwbicgfSxcbiAgLyogdnNjb2RlICovIHsga2V5OiAnY29udHJpYnV0ZXMnLCBvdmVyOiBzb3J0T2JqZWN0IH0sXG4gIC8qIHZzY29kZSAqLyB7IGtleTogJ2FjdGl2YXRpb25FdmVudHMnLCBvdmVyOiB1bmlxIH0sXG4gIHsga2V5OiAnaHVza3knLCBvdmVyOiBvdmVyUHJvcGVydHkoJ2hvb2tzJywgc29ydEdpdEhvb2tzKSB9LFxuICB7IGtleTogJ3NpbXBsZS1naXQtaG9va3MnLCBvdmVyOiBzb3J0R2l0SG9va3MgfSxcbiAgeyBrZXk6ICdwcmUtY29tbWl0JyB9LFxuICB7IGtleTogJ2NvbW1pdGxpbnQnLCBvdmVyOiBzb3J0T2JqZWN0IH0sXG4gIHsga2V5OiAnbGludC1zdGFnZWQnIH0sXG4gIHsga2V5OiAnbmFuby1zdGFnZWQnIH0sXG4gIHsga2V5OiAnY29uZmlnJywgb3Zlcjogc29ydE9iamVjdCB9LFxuICB7IGtleTogJ25vZGVtb25Db25maWcnLCBvdmVyOiBzb3J0T2JqZWN0IH0sXG4gIHsga2V5OiAnYnJvd3NlcmlmeScsIG92ZXI6IHNvcnRPYmplY3QgfSxcbiAgeyBrZXk6ICdiYWJlbCcsIG92ZXI6IHNvcnRPYmplY3QgfSxcbiAgeyBrZXk6ICdicm93c2Vyc2xpc3QnIH0sXG4gIHsga2V5OiAneG8nLCBvdmVyOiBzb3J0T2JqZWN0IH0sXG4gIHsga2V5OiAncHJldHRpZXInLCBvdmVyOiBzb3J0UHJldHRpZXJDb25maWcgfSxcbiAgeyBrZXk6ICdlc2xpbnRDb25maWcnLCBvdmVyOiBzb3J0RXNsaW50Q29uZmlnIH0sXG4gIHsga2V5OiAnZXNsaW50SWdub3JlJyB9LFxuICB7IGtleTogJ25wbXBrZ2pzb25saW50Jywgb3Zlcjogc29ydE9iamVjdCB9LFxuICB7IGtleTogJ25wbVBhY2thZ2VKc29uTGludENvbmZpZycsIG92ZXI6IHNvcnRPYmplY3QgfSxcbiAgeyBrZXk6ICducG1wYWNrYWdlanNvbmxpbnQnLCBvdmVyOiBzb3J0T2JqZWN0IH0sXG4gIHsga2V5OiAncmVsZWFzZScsIG92ZXI6IHNvcnRPYmplY3QgfSxcbiAgeyBrZXk6ICdyZW1hcmtDb25maWcnLCBvdmVyOiBzb3J0T2JqZWN0IH0sXG4gIHsga2V5OiAnc3R5bGVsaW50JyB9LFxuICB7IGtleTogJ2F2YScsIG92ZXI6IHNvcnRPYmplY3QgfSxcbiAgeyBrZXk6ICdqZXN0Jywgb3Zlcjogc29ydE9iamVjdCB9LFxuICB7IGtleTogJ2plc3QtanVuaXQnLCBvdmVyOiBzb3J0T2JqZWN0IH0sXG4gIHsga2V5OiAnamVzdC1zdGFyZScsIG92ZXI6IHNvcnRPYmplY3QgfSxcbiAgeyBrZXk6ICdtb2NoYScsIG92ZXI6IHNvcnRPYmplY3QgfSxcbiAgeyBrZXk6ICdueWMnLCBvdmVyOiBzb3J0T2JqZWN0IH0sXG4gIHsga2V5OiAnYzgnLCBvdmVyOiBzb3J0T2JqZWN0IH0sXG4gIHsga2V5OiAndGFwJywgb3Zlcjogc29ydE9iamVjdCB9LFxuICB7IGtleTogJ29jbGlmJywgb3Zlcjogc29ydE9iamVjdEJ5KHVuZGVmaW5lZCwgdHJ1ZSkgfSxcbiAgeyBrZXk6ICdyZXNvbHV0aW9ucycsIG92ZXI6IHNvcnRPYmplY3QgfSxcbiAgeyBrZXk6ICdvdmVycmlkZXMnLCBvdmVyOiBzb3J0RGVwZW5kZW5jaWVzIH0sXG4gIHsga2V5OiAnZGVwZW5kZW5jaWVzJywgb3Zlcjogc29ydERlcGVuZGVuY2llcyB9LFxuICB7IGtleTogJ2RldkRlcGVuZGVuY2llcycsIG92ZXI6IHNvcnREZXBlbmRlbmNpZXMgfSxcbiAgeyBrZXk6ICdkZXBlbmRlbmNpZXNNZXRhJywgb3Zlcjogc29ydE9iamVjdEJ5KHNvcnRPYmplY3RCeUlkZW50LCB0cnVlKSB9LFxuICB7IGtleTogJ3BlZXJEZXBlbmRlbmNpZXMnLCBvdmVyOiBzb3J0RGVwZW5kZW5jaWVzIH0sXG4gIC8vIFRPRE86IG9ubHkgc29ydCBkZXB0aCA9IDJcbiAgeyBrZXk6ICdwZWVyRGVwZW5kZW5jaWVzTWV0YScsIG92ZXI6IHNvcnRPYmplY3RCeSh1bmRlZmluZWQsIHRydWUpIH0sXG4gIHsga2V5OiAnb3B0aW9uYWxEZXBlbmRlbmNpZXMnLCBvdmVyOiBzb3J0RGVwZW5kZW5jaWVzIH0sXG4gIHsga2V5OiAnYnVuZGxlZERlcGVuZGVuY2llcycsIG92ZXI6IHVuaXFBbmRTb3J0QXJyYXkgfSxcbiAgeyBrZXk6ICdidW5kbGVEZXBlbmRlbmNpZXMnLCBvdmVyOiB1bmlxQW5kU29ydEFycmF5IH0sXG4gIC8qIHZzY29kZSAqLyB7IGtleTogJ2V4dGVuc2lvblBhY2snLCBvdmVyOiB1bmlxQW5kU29ydEFycmF5IH0sXG4gIC8qIHZzY29kZSAqLyB7IGtleTogJ2V4dGVuc2lvbkRlcGVuZGVuY2llcycsIG92ZXI6IHVuaXFBbmRTb3J0QXJyYXkgfSxcbiAgeyBrZXk6ICdmbGF0JyB9LFxuICB7IGtleTogJ3BhY2thZ2VNYW5hZ2VyJyB9LFxuICB7IGtleTogJ2VuZ2luZXMnLCBvdmVyOiBzb3J0T2JqZWN0IH0sXG4gIHsga2V5OiAnZW5naW5lU3RyaWN0Jywgb3Zlcjogc29ydE9iamVjdCB9LFxuICB7IGtleTogJ2RldkVuZ2luZXMnLCBvdmVyOiBzb3J0RGV2RW5naW5lcyB9LFxuICB7IGtleTogJ3ZvbHRhJywgb3Zlcjogc29ydFZvbHRhIH0sXG4gIHsga2V5OiAnbGFuZ3VhZ2VOYW1lJyB9LFxuICB7IGtleTogJ29zJyB9LFxuICB7IGtleTogJ2NwdScgfSxcbiAgeyBrZXk6ICdwcmVmZXJHbG9iYWwnLCBvdmVyOiBzb3J0T2JqZWN0IH0sXG4gIHsga2V5OiAncHVibGlzaENvbmZpZycsIG92ZXI6IHNvcnRPYmplY3QgfSxcbiAgLyogdnNjb2RlICovIHsga2V5OiAnaWNvbicgfSxcbiAgLyogdnNjb2RlICovIHtcbiAgICBrZXk6ICdiYWRnZXMnLFxuICAgIG92ZXI6IG9uQXJyYXkoKGJhZGdlKSA9PiBiYWRnZS5tYXAoc29ydFZTQ29kZUJhZGdlT2JqZWN0KSksXG4gIH0sXG4gIC8qIHZzY29kZSAqLyB7IGtleTogJ2dhbGxlcnlCYW5uZXInLCBvdmVyOiBzb3J0T2JqZWN0IH0sXG4gIC8qIHZzY29kZSAqLyB7IGtleTogJ3ByZXZpZXcnIH0sXG4gIC8qIHZzY29kZSAqLyB7IGtleTogJ21hcmtkb3duJyB9LFxuICB7IGtleTogJ3BucG0nLCBvdmVyOiBzb3J0UG5wbUNvbmZpZyB9LFxuXVxuXG5jb25zdCBkZWZhdWx0U29ydE9yZGVyID0gZmllbGRzLm1hcCgoeyBrZXkgfSkgPT4ga2V5KVxuY29uc3Qgb3ZlckZpZWxkcyA9IHBpcGUoXG4gIGZpZWxkc1xuICAgIC5tYXAoKHsga2V5LCBvdmVyIH0pID0+IChvdmVyID8gb3ZlclByb3BlcnR5KGtleSwgb3ZlcikgOiB1bmRlZmluZWQpKVxuICAgIC5maWx0ZXIoQm9vbGVhbiksXG4pXG5cbmZ1bmN0aW9uIGVkaXRTdHJpbmdKU09OKGpzb24sIG92ZXIpIHtcbiAgaWYgKHR5cGVvZiBqc29uID09PSAnc3RyaW5nJykge1xuICAgIGNvbnN0IHsgaW5kZW50LCB0eXBlIH0gPSBkZXRlY3RJbmRlbnQoanNvbilcbiAgICBjb25zdCBlbmRDaGFyYWN0ZXJzID0ganNvbi5zbGljZSgtMSkgPT09ICdcXG4nID8gJ1xcbicgOiAnJ1xuICAgIGNvbnN0IG5ld2xpbmUgPSBkZXRlY3ROZXdsaW5lKGpzb24pXG4gICAganNvbiA9IEpTT04ucGFyc2UoanNvbilcblxuICAgIGxldCByZXN1bHQgPVxuICAgICAgSlNPTi5zdHJpbmdpZnkob3Zlcihqc29uKSwgbnVsbCwgdHlwZSA9PT0gJ3RhYicgPyAnXFx0JyA6IGluZGVudCkgK1xuICAgICAgZW5kQ2hhcmFjdGVyc1xuICAgIGlmIChuZXdsaW5lID09PSAnXFxyXFxuJykge1xuICAgICAgcmVzdWx0ID0gcmVzdWx0LnJlcGxhY2UoL1xcbi9nLCBuZXdsaW5lKVxuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0XG4gIH1cblxuICByZXR1cm4gb3Zlcihqc29uKVxufVxuXG5mdW5jdGlvbiBzb3J0UGFja2FnZUpzb24oanNvbklzaCwgb3B0aW9ucyA9IHt9KSB7XG4gIHJldHVybiBlZGl0U3RyaW5nSlNPTihcbiAgICBqc29uSXNoLFxuICAgIG9uT2JqZWN0KChqc29uKSA9PiB7XG4gICAgICBsZXQgc29ydE9yZGVyID0gb3B0aW9ucy5zb3J0T3JkZXIgfHwgZGVmYXVsdFNvcnRPcmRlclxuXG4gICAgICBpZiAoQXJyYXkuaXNBcnJheShzb3J0T3JkZXIpKSB7XG4gICAgICAgIGNvbnN0IGtleXMgPSBPYmplY3Qua2V5cyhqc29uKVxuICAgICAgICBjb25zdCB7IHByaXZhdGVLZXlzID0gW10sIHB1YmxpY0tleXMgPSBbXSB9ID0gb2JqZWN0R3JvdXBCeShcbiAgICAgICAgICBrZXlzLFxuICAgICAgICAgIChrZXkpID0+IChrZXlbMF0gPT09ICdfJyA/ICdwcml2YXRlS2V5cycgOiAncHVibGljS2V5cycpLFxuICAgICAgICApXG4gICAgICAgIHNvcnRPcmRlciA9IFtcbiAgICAgICAgICAuLi5zb3J0T3JkZXIsXG4gICAgICAgICAgLi4uZGVmYXVsdFNvcnRPcmRlcixcbiAgICAgICAgICAuLi5wdWJsaWNLZXlzLnNvcnQoKSxcbiAgICAgICAgICAuLi5wcml2YXRlS2V5cy5zb3J0KCksXG4gICAgICAgIF1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIG92ZXJGaWVsZHMoc29ydE9iamVjdEtleXMoanNvbiwgc29ydE9yZGVyKSwganNvbilcbiAgICB9KSxcbiAgKVxufVxuXG5leHBvcnQgZGVmYXVsdCBzb3J0UGFja2FnZUpzb25cbmV4cG9ydCB7IHNvcnRQYWNrYWdlSnNvbiwgZGVmYXVsdFNvcnRPcmRlciBhcyBzb3J0T3JkZXIgfVxuIiwiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gaXNQbGFpbk9iamVjdCh2YWx1ZSkge1xuXHRpZiAodHlwZW9mIHZhbHVlICE9PSAnb2JqZWN0JyB8fCB2YWx1ZSA9PT0gbnVsbCkge1xuXHRcdHJldHVybiBmYWxzZTtcblx0fVxuXG5cdGNvbnN0IHByb3RvdHlwZSA9IE9iamVjdC5nZXRQcm90b3R5cGVPZih2YWx1ZSk7XG5cdHJldHVybiAocHJvdG90eXBlID09PSBudWxsIHx8IHByb3RvdHlwZSA9PT0gT2JqZWN0LnByb3RvdHlwZSB8fCBPYmplY3QuZ2V0UHJvdG90eXBlT2YocHJvdG90eXBlKSA9PT0gbnVsbCkgJiYgIShTeW1ib2wudG9TdHJpbmdUYWcgaW4gdmFsdWUpICYmICEoU3ltYm9sLml0ZXJhdG9yIGluIHZhbHVlKTtcbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB7IHNvcnRQYWNrYWdlSnNvbiB9IGZyb20gJ3NvcnQtcGFja2FnZS1qc29uJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB7IGZzVXRpbCB9IGZyb20gJy4uL3V0aWxzL2ZzVXRpbC5qcyc7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBmaXhUZXN0RGlyZWN0b3JpZXNVcGRhdGluZ1BhY2thZ2VKc29uKHBhY2thZ2VEaXJQYXRoczogc3RyaW5nW10pOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdmaXhUZXN0RGlyZWN0b3JpZXNVcGRhdGluZ1BhY2thZ2VKc29uJywgYXN5bmMgKCkgPT4ge1xuICAgIGF3YWl0IFByb21pc2UuYWxsKFxuICAgICAgcGFja2FnZURpclBhdGhzLm1hcChhc3luYyAocGFja2FnZURpclBhdGgpID0+IHtcbiAgICAgICAgY29uc3QgcGFja2FnZUpzb25QYXRoID0gcGF0aC5qb2luKHBhY2thZ2VEaXJQYXRoLCAncGFja2FnZS5qc29uJyk7XG4gICAgICAgIGlmICghZnMuZXhpc3RzU3luYyhwYWNrYWdlSnNvblBhdGgpKSByZXR1cm47XG5cbiAgICAgICAgY29uc3QgbmV3VGVzdERpclBhdGggPSBwYXRoLmpvaW4ocGFja2FnZURpclBhdGgsICd0ZXN0Jyk7XG4gICAgICAgIGZvciAoY29uc3Qgb2xkVGVzdERpck5hbWUgb2YgWydfX3Rlc3RzX18nLCAndGVzdHMnXSkge1xuICAgICAgICAgIGNvbnN0IG9sZFRlc3REaXJQYXRoID0gcGF0aC5qb2luKHBhY2thZ2VEaXJQYXRoLCBvbGRUZXN0RGlyTmFtZSk7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGF3YWl0IG1vdmVUZXN0RGlyZWN0b3J5KG9sZFRlc3REaXJQYXRoLCBuZXdUZXN0RGlyUGF0aCk7XG4gICAgICAgICAgICBjb25zdCBwYWNrYWdlSnNvbiA9IEpTT04ucGFyc2UoYXdhaXQgZnMucHJvbWlzZXMucmVhZEZpbGUocGFja2FnZUpzb25QYXRoLCAndXRmOCcpKSBhcyB7XG4gICAgICAgICAgICAgIHNjcmlwdHM/OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+O1xuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIGxldCBkaWRVcGRhdGVTY3JpcHQgPSBmYWxzZTtcbiAgICAgICAgICAgIGNvbnN0IHNjcmlwdHMgPSBwYWNrYWdlSnNvbi5zY3JpcHRzID8/IHt9O1xuICAgICAgICAgICAgZm9yIChjb25zdCBbc2NyaXB0TmFtZSwgc2NyaXB0XSBvZiBPYmplY3QuZW50cmllcyhzY3JpcHRzKSkge1xuICAgICAgICAgICAgICBjb25zdCBuZXdTY3JpcHQgPSBzY3JpcHQucmVwbGFjZUFsbChvbGRUZXN0RGlyTmFtZSwgJ3Rlc3QnKTtcbiAgICAgICAgICAgICAgaWYgKHNjcmlwdCAhPT0gbmV3U2NyaXB0KSB7XG4gICAgICAgICAgICAgICAgc2NyaXB0c1tzY3JpcHROYW1lXSA9IG5ld1NjcmlwdDtcbiAgICAgICAgICAgICAgICBkaWRVcGRhdGVTY3JpcHQgPSB0cnVlO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBwYWNrYWdlSnNvbi5zY3JpcHRzID0gc2NyaXB0cztcbiAgICAgICAgICAgIGlmICghZGlkVXBkYXRlU2NyaXB0KSByZXR1cm47XG5cbiAgICAgICAgICAgIGF3YWl0IGZzVXRpbC5nZW5lcmF0ZUZpbGUocGFja2FnZUpzb25QYXRoLCBKU09OLnN0cmluZ2lmeShzb3J0UGFja2FnZUpzb24ocGFja2FnZUpzb24pLCB1bmRlZmluZWQsIDIpKTtcbiAgICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICAgIC8vIGRvIG5vdGhpbmdcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgKTtcbiAgfSk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIG1vdmVUZXN0RGlyZWN0b3J5KG9sZFRlc3REaXJQYXRoOiBzdHJpbmcsIG5ld1Rlc3REaXJQYXRoOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgaWYgKCFmcy5leGlzdHNTeW5jKG5ld1Rlc3REaXJQYXRoKSkge1xuICAgIGF3YWl0IGZzLnByb21pc2VzLnJlbmFtZShvbGRUZXN0RGlyUGF0aCwgbmV3VGVzdERpclBhdGgpO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGNvbnN0IGRpcmVudHMgPSBhd2FpdCBmcy5wcm9taXNlcy5yZWFkZGlyKG9sZFRlc3REaXJQYXRoLCB7IHdpdGhGaWxlVHlwZXM6IHRydWUgfSk7XG4gIGF3YWl0IFByb21pc2UuYWxsKFxuICAgIGRpcmVudHMubWFwKGFzeW5jIChkaXJlbnQpID0+IHtcbiAgICAgIGNvbnN0IG9sZFBhdGggPSBwYXRoLmpvaW4ob2xkVGVzdERpclBhdGgsIGRpcmVudC5uYW1lKTtcbiAgICAgIGNvbnN0IG5ld1BhdGggPSBwYXRoLmpvaW4obmV3VGVzdERpclBhdGgsIGRpcmVudC5uYW1lKTtcbiAgICAgIGNvbnN0IG5ld1BhdGhTdGF0ID0gZnMuZXhpc3RzU3luYyhuZXdQYXRoKSA/IGF3YWl0IGZzLnByb21pc2VzLnN0YXQobmV3UGF0aCkgOiB1bmRlZmluZWQ7XG4gICAgICBpZiAoZGlyZW50LmlzRGlyZWN0b3J5KCkgJiYgbmV3UGF0aFN0YXQ/LmlzRGlyZWN0b3J5KCkpIHtcbiAgICAgICAgYXdhaXQgbW92ZVRlc3REaXJlY3Rvcnkob2xkUGF0aCwgbmV3UGF0aCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGF3YWl0IGZzLnByb21pc2VzLnJlbmFtZShvbGRQYXRoLCBuZXdQYXRoKTtcbiAgICB9KVxuICApO1xuICBhd2FpdCBmcy5wcm9taXNlcy5ybShvbGRUZXN0RGlyUGF0aCwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcy9wcm9taXNlcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgeyBpZ25vcmVFbm9lbnRBc3luYyB9IGZyb20gJ0B3aWxsYm9vc3Rlci9zaGFyZWQtbGliL3NyYyc7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZml4VHlwZURlZmluaXRpb25zKFxuICBjb25maWc6IFBhY2thZ2VDb25maWcsXG4gIGNvbmZpZ3NJbmNsdWRpbmdDaGlsZHJlbjogUGFja2FnZUNvbmZpZ1tdXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdmaXhUeXBlRGVmaW5pdGlvbnMnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgbGliVHlwZURpclBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICdAdHlwZXMnKTtcbiAgICBjb25zdCBzcmNUeXBlRGlyUGF0aCA9XG4gICAgICBjb25maWcuaXNSb290ICYmIGNvbmZpZy5kb2VzQ29udGFpblN1YlBhY2thZ2VKc29ucyA/IHVuZGVmaW5lZCA6IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJ3NyYycsICd0eXBlcycpO1xuXG4gICAgY29uc3QgZGlyZW50cyA9IGF3YWl0IGlnbm9yZUVub2VudEFzeW5jKCgpID0+IGZzLnJlYWRkaXIobGliVHlwZURpclBhdGgsIHsgd2l0aEZpbGVUeXBlczogdHJ1ZSB9KSk7XG4gICAgaWYgKCFkaXJlbnRzKSByZXR1cm47XG5cbiAgICBmb3IgKGNvbnN0IGRpcmVudCBvZiBkaXJlbnRzKSB7XG4gICAgICBjb25zdCBkaXJOYW1lID0gZGlyZW50Lm5hbWUuc2xpY2UoMCwgLTUpO1xuICAgICAgY29uc3QgaGFzVHlwZURlY2xhcmF0aW9uRXh0ZW5zaW9uID0gZGlyZW50Lm5hbWUuZW5kc1dpdGgoJy5kLnRzJyk7XG4gICAgICBsZXQgcGFja2FnZU5hbWUgPSBoYXNUeXBlRGVjbGFyYXRpb25FeHRlbnNpb24gPyBkaXJOYW1lIDogZGlyZW50Lm5hbWU7XG4gICAgICBpZiAocGFja2FnZU5hbWUuaW5jbHVkZXMoJ19fJykpIHtcbiAgICAgICAgcGFja2FnZU5hbWUgPSBgQCR7cGFja2FnZU5hbWUucmVwbGFjZSgnX18nLCAnLycpfWA7XG4gICAgICB9XG4gICAgICBjb25zdCBoYXNMaWJyYXJ5ID0gY29uZmlnc0luY2x1ZGluZ0NoaWxkcmVuLnNvbWUoXG4gICAgICAgIChjb25maWcpID0+XG4gICAgICAgICAgY29uZmlnLnBhY2thZ2VKc29uPy5kZXBlbmRlbmNpZXM/LltwYWNrYWdlTmFtZV0gfHwgY29uZmlnLnBhY2thZ2VKc29uPy5kZXZEZXBlbmRlbmNpZXM/LltwYWNrYWdlTmFtZV1cbiAgICAgICk7XG5cbiAgICAgIGlmIChkaXJlbnQuaXNGaWxlKCkgJiYgaGFzVHlwZURlY2xhcmF0aW9uRXh0ZW5zaW9uKSB7XG4gICAgICAgIGlmIChoYXNMaWJyYXJ5KSB7XG4gICAgICAgICAgLy8gTW92ZSBAdHlwZXMvPG5hbWU+L2luZGV4LmQudHMgaWYgaW5zdGFsbGVkXG4gICAgICAgICAgYXdhaXQgZnMubWtkaXIocGF0aC5qb2luKGxpYlR5cGVEaXJQYXRoLCBkaXJOYW1lKSwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gICAgICAgICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+XG4gICAgICAgICAgICBmcy5yZW5hbWUocGF0aC5qb2luKGxpYlR5cGVEaXJQYXRoLCBkaXJlbnQubmFtZSksIHBhdGguam9pbihsaWJUeXBlRGlyUGF0aCwgZGlyTmFtZSwgJ2luZGV4LmQudHMnKSlcbiAgICAgICAgICApO1xuICAgICAgICB9IGVsc2UgaWYgKHNyY1R5cGVEaXJQYXRoKSB7XG4gICAgICAgICAgLy8gTW92ZSBzcmMvdHlwZXMvPG5hbWU+IGlmIG5vdCBpbnN0YWxsZWRcbiAgICAgICAgICBhd2FpdCBmcy5ta2RpcihzcmNUeXBlRGlyUGF0aCwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gICAgICAgICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+XG4gICAgICAgICAgICBmcy5yZW5hbWUocGF0aC5qb2luKGxpYlR5cGVEaXJQYXRoLCBkaXJlbnQubmFtZSksIHBhdGguam9pbihzcmNUeXBlRGlyUGF0aCwgZGlyZW50Lm5hbWUpKVxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoZGlyZW50LmlzRGlyZWN0b3J5KCkgJiYgc3JjVHlwZURpclBhdGggJiYgIWhhc0xpYnJhcnkpIHtcbiAgICAgICAgLy8gTW92ZSBzcmMvdHlwZXMvPG5hbWU+LmQudHMgaWYgbm90IGluc3RhbGxlZFxuICAgICAgICBhd2FpdCBmcy5ta2RpcihzcmNUeXBlRGlyUGF0aCwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gICAgICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PlxuICAgICAgICAgIGlnbm9yZUVub2VudEFzeW5jKCgpID0+XG4gICAgICAgICAgICBmcy5yZW5hbWUoXG4gICAgICAgICAgICAgIHBhdGguam9pbihsaWJUeXBlRGlyUGF0aCwgZGlyZW50Lm5hbWUsICdpbmRleC5kLnRzJyksXG4gICAgICAgICAgICAgIHBhdGguam9pbihzcmNUeXBlRGlyUGF0aCwgYCR7ZGlyZW50Lm5hbWV9LmQudHNgKVxuICAgICAgICAgICAgKVxuICAgICAgICAgIClcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG4gIH0pO1xufVxuIiwiaW1wb3J0IG1lcmdlIGZyb20gJ2RlZXBtZXJnZSc7XG5cbmV4cG9ydCBmdW5jdGlvbiBvdmVyd3JpdGVNZXJnZTxUPihkZXN0aW5hdGlvbkFycmF5OiBUW10sIHNvdXJjZUFycmF5OiBUW10pOiBUW10ge1xuICByZXR1cm4gc291cmNlQXJyYXk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjb21iaW5lTWVyZ2UodGFyZ2V0OiB1bmtub3duW10sIHNvdXJjZTogdW5rbm93bltdLCBvcHRpb25zOiBtZXJnZS5BcnJheU1lcmdlT3B0aW9ucyk6IHVua25vd25bXSB7XG4gIGNvbnN0IGRlc3RpbmF0aW9uID0gWy4uLnRhcmdldF07XG5cbiAgZm9yIChjb25zdCBbaW5kZXgsIGl0ZW1dIG9mIHNvdXJjZS5lbnRyaWVzKCkpIHtcbiAgICBpZiAoZGVzdGluYXRpb25baW5kZXhdID09PSB1bmRlZmluZWQpIHtcbiAgICAgIGRlc3RpbmF0aW9uW2luZGV4XSA9IGNsb25lVW5sZXNzT3RoZXJ3aXNlU3BlY2lmaWVkKGl0ZW0sIG9wdGlvbnMpO1xuICAgIH0gZWxzZSBpZiAoaXNNZXJnZWFibGVPYmplY3QodGFyZ2V0W2luZGV4XSwgb3B0aW9ucykgJiYgaXNNZXJnZWFibGVPYmplY3QoaXRlbSwgb3B0aW9ucykpIHtcbiAgICAgIGRlc3RpbmF0aW9uW2luZGV4XSA9IG1lcmdlKHRhcmdldFtpbmRleF0sIGl0ZW0sIG9wdGlvbnMpO1xuICAgIH0gZWxzZSBpZiAoIXRhcmdldC5pbmNsdWRlcyhpdGVtKSkge1xuICAgICAgZGVzdGluYXRpb24ucHVzaChpdGVtKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGRlc3RpbmF0aW9uO1xufVxuXG5mdW5jdGlvbiBjbG9uZVVubGVzc090aGVyd2lzZVNwZWNpZmllZCh2YWx1ZTogdW5rbm93biwgb3B0aW9uczogbWVyZ2UuQXJyYXlNZXJnZU9wdGlvbnMpOiB1bmtub3duIHtcbiAgcmV0dXJuIGlzTWVyZ2VhYmxlT2JqZWN0KHZhbHVlLCBvcHRpb25zKSA/IG9wdGlvbnMuY2xvbmVVbmxlc3NPdGhlcndpc2VTcGVjaWZpZWQodmFsdWUsIG9wdGlvbnMpIDogdmFsdWU7XG59XG5cbmZ1bmN0aW9uIGlzTWVyZ2VhYmxlT2JqZWN0KHZhbHVlOiB1bmtub3duLCBvcHRpb25zOiBtZXJnZS5BcnJheU1lcmdlT3B0aW9ucyk6IHZhbHVlIGlzIG9iamVjdCB7XG4gIHJldHVybiAhIXZhbHVlICYmIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiYgb3B0aW9ucy5pc01lcmdlYWJsZU9iamVjdCh2YWx1ZSk7XG59XG4iLCJleHBvcnQgZnVuY3Rpb24gbW92ZVRvQm90dG9tPFRPYmogZXh0ZW5kcyBSZWNvcmQ8VEtleSwgdW5rbm93bj4sIFRLZXkgZXh0ZW5kcyBzdHJpbmcgfCBudW1iZXIgfCBzeW1ib2w+KFxuICBvYmo6IFRPYmosXG4gIGtleTogVEtleVxuKTogVE9iaiB7XG4gIGNvbnN0IHZhbHVlID0gb2JqW2tleV07XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZHluYW1pYy1kZWxldGVcbiAgZGVsZXRlIG9ialtrZXldO1xuICAob2JqIGFzIFJlY29yZDxUS2V5LCB1bmtub3duPilba2V5XSA9IHZhbHVlO1xuICByZXR1cm4gb2JqO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gc29ydEtleXM8VCBleHRlbmRzIFJlY29yZDxzdHJpbmcsIHVua25vd24+PihvYmo6IFQpOiBUIHtcbiAgY29uc3Qga2V5QW5kVmFsdWVzID0gT2JqZWN0LmVudHJpZXMob2JqKS50b1NvcnRlZCgoW2tleTFdLCBba2V5Ml0pID0+IGtleTEubG9jYWxlQ29tcGFyZShrZXkyKSk7XG4gIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIGtleUFuZFZhbHVlcykge1xuICAgIC8vIHBhY2thZ2UuanNvbi1zdHlsZSBrZXlzIGFyZSBub24tYXJyYXktaW5kZXgga2V5cywgc28gSlNPTi5zdHJpbmdpZnkgcHJlc2VydmVzIHRoaXMgaW5zZXJ0aW9uIG9yZGVyLlxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZHluYW1pYy1kZWxldGVcbiAgICBkZWxldGUgb2JqW2tleV07XG4gICAgKG9iaiBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPilba2V5XSA9IHZhbHVlO1xuXG4gICAgLy8gaWYgdmFsdWUgaXMgYW4gb2JqZWN0LCBzb3J0IHRoZSBrZXlzIG9mIHRoZSBvYmplY3RcbiAgICBpZiAodmFsdWUgJiYgdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJiAhQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgIHNvcnRLZXlzKHZhbHVlIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIG9iajtcbn1cbiIsIi8vIEdpdEh1YiBBY3Rpb25zIHZhbHVlbGVzcyBldmVudHMgc3VjaCBhcyBgcHVsbF9yZXF1ZXN0OmAgcmVxdWlyZSBZQU1MIG51bGwgdmFsdWVzLlxuLyogZXNsaW50LWRpc2FibGUgdW5pY29ybi9uby1udWxsICovXG5cbmltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCBtZXJnZSBmcm9tICdkZWVwbWVyZ2UnO1xuaW1wb3J0IHlhbWwgZnJvbSAnanMteWFtbCc7XG5pbXBvcnQgY2xvbmVEZWVwIGZyb20gJ2xvZGFzaC5jbG9uZWRlZXAnO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBjb21iaW5lTWVyZ2UgfSBmcm9tICcuLi91dGlscy9tZXJnZVV0aWwuanMnO1xuaW1wb3J0IHsgbW92ZVRvQm90dG9tLCBzb3J0S2V5cyB9IGZyb20gJy4uL3V0aWxzL29iamVjdFV0aWwuanMnO1xuaW1wb3J0IHsgcHJvbWlzZVBvb2wgfSBmcm9tICcuLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5cbmludGVyZmFjZSBXb3JrZmxvdyB7XG4gIG5hbWU/OiBzdHJpbmc7XG4gIG9uPzogT247XG4gIGNvbmN1cnJlbmN5PzogQ29uY3VycmVuY3k7XG4gIHBlcm1pc3Npb25zPzogUmVjb3JkPHN0cmluZywgc3RyaW5nPjtcbiAgam9iczogUmVjb3JkPHN0cmluZywgSm9iPjtcbn1cblxuaW50ZXJmYWNlIENvbmN1cnJlbmN5IHtcbiAgZ3JvdXA6IHN0cmluZztcbiAgJ2NhbmNlbC1pbi1wcm9ncmVzcyc6IGJvb2xlYW47XG59XG5cbmludGVyZmFjZSBPbiB7XG4gIC8vIEdpdEh1YiBBY3Rpb25zIHRyZWF0cyBgZXZlbnQ6IG51bGxgIGFzIGEgdmFsdWVsZXNzIGV2ZW50IG1hcHBpbmcsIGUuZy5cbiAgLy8gYHB1bGxfcmVxdWVzdDpgLiBgdW5kZWZpbmVkYCB3b3VsZCBvbWl0IHRoZSBldmVudCBlbnRpcmVseSB3aGVuIGR1bXBpbmcgWUFNTC5cbiAgaXNzdWVzPzogVHlwZXMgfCBudWxsO1xuICBwdWxsX3JlcXVlc3Q/OiBQdWxsUmVxdWVzdCB8IG51bGw7XG4gIHB1bGxfcmVxdWVzdF90YXJnZXQ/OiBUeXBlcyB8IG51bGw7XG4gIHB1c2g/OiBQdXNoO1xuICBzY2hlZHVsZT86IFNjaGVkdWxlW107XG4gIHdvcmtmbG93X2Rpc3BhdGNoPzogbnVsbDtcbn1cblxuaW50ZXJmYWNlIFB1bGxSZXF1ZXN0IHtcbiAgJ3BhdGhzLWlnbm9yZSc/OiBzdHJpbmdbXTtcbiAgdHlwZXM/OiBzdHJpbmdbXTtcbn1cblxuaW50ZXJmYWNlIFB1c2gge1xuICBicmFuY2hlczogc3RyaW5nW107XG4gICdwYXRocy1pZ25vcmUnPzogc3RyaW5nW107XG59XG5cbmludGVyZmFjZSBTY2hlZHVsZSB7XG4gIGNyb246IHN0cmluZztcbn1cblxuaW50ZXJmYWNlIFR5cGVzIHtcbiAgdHlwZXM6IHN0cmluZ1tdO1xufVxuXG5pbnRlcmZhY2UgSm9iIHtcbiAgJ3J1bnMtb24nPzogc3RyaW5nO1xuICBwZXJtaXNzaW9ucz86IFJlY29yZDxzdHJpbmcsIHN0cmluZz47XG4gIHN0ZXBzPzogU3RlcFtdO1xuICB1c2VzPzogc3RyaW5nO1xuICBpZj86IHN0cmluZztcbiAgc2VjcmV0cz86IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICB3aXRoPzogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG59XG5cbmludGVyZmFjZSBTdGVwIHtcbiAgdXNlcz86IHN0cmluZztcbiAgd2l0aD86IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICBydW4/OiBzdHJpbmc7XG59XG5cbmNvbnN0IHB1YmxpY1JlcG9BdXRvZml4V29ya2Zsb3c6IFdvcmtmbG93ID0ge1xuICBuYW1lOiAnYXV0b2ZpeC5jaScsXG4gIG9uOiB7XG4gICAgcHVsbF9yZXF1ZXN0OiBudWxsLFxuICAgIHB1c2g6IHtcbiAgICAgIGJyYW5jaGVzOiBbJ21haW4nXSxcbiAgICB9LFxuICB9LFxuICBwZXJtaXNzaW9uczoge1xuICAgIGNvbnRlbnRzOiAncmVhZCcsXG4gIH0sXG4gIGNvbmN1cnJlbmN5OiB7XG4gICAgZ3JvdXA6ICdhdXRvZml4LSR7eyBnaXRodWIuaGVhZF9yZWYgfX0nLFxuICAgICdjYW5jZWwtaW4tcHJvZ3Jlc3MnOiB0cnVlLFxuICB9LFxuICBqb2JzOiB7XG4gICAgYXV0b2ZpeDogeyAncnVucy1vbic6ICd1YnVudHUtbGF0ZXN0JyB9LFxuICB9LFxufTtcblxuY29uc3QgcHJpdmF0ZVJlcG9BdXRvZml4V29ya2Zsb3c6IFdvcmtmbG93ID0ge1xuICBuYW1lOiAnRml4IGNvZGUgYXV0b21hdGljYWxseScsXG4gIG9uOiB7XG4gICAgcHVsbF9yZXF1ZXN0OiBudWxsLFxuICB9LFxuICBjb25jdXJyZW5jeToge1xuICAgIGdyb3VwOiAnJHt7IGdpdGh1Yi53b3JrZmxvdyB9fS0ke3sgZ2l0aHViLnJlZiB9fScsXG4gICAgJ2NhbmNlbC1pbi1wcm9ncmVzcyc6IHRydWUsXG4gIH0sXG4gIGpvYnM6IHtcbiAgICBhdXRvZml4OiB7XG4gICAgICB1c2VzOiAnV2lsbEJvb3N0ZXIvcmV1c2FibGUtd29ya2Zsb3dzLy5naXRodWIvd29ya2Zsb3dzL2F1dG9maXgueW1sQG1haW4nLFxuICAgIH0sXG4gIH0sXG59O1xuXG5jb25zdCB3b3JrZmxvd3MgPSB7XG4gIHRlc3Q6IHtcbiAgICBuYW1lOiAnVGVzdCcsXG4gICAgb246IHtcbiAgICAgIHB1bGxfcmVxdWVzdDogbnVsbCxcbiAgICAgIHB1c2g6IHtcbiAgICAgICAgYnJhbmNoZXM6IFsnbWFpbicsICd3YmZ5J10sXG4gICAgICB9LFxuICAgIH0sXG4gICAgLy8gY2YuIGh0dHBzOi8vZG9jcy5naXRodWIuY29tL2VuL2FjdGlvbnMvdXNpbmctam9icy91c2luZy1jb25jdXJyZW5jeSNleGFtcGxlLW9ubHktY2FuY2VsLWluLXByb2dyZXNzLWpvYnMtb3ItcnVucy1mb3ItdGhlLWN1cnJlbnQtd29ya2Zsb3dcbiAgICBjb25jdXJyZW5jeToge1xuICAgICAgZ3JvdXA6ICcke3sgZ2l0aHViLndvcmtmbG93IH19LSR7eyBnaXRodWIucmVmIH19JyxcbiAgICAgICdjYW5jZWwtaW4tcHJvZ3Jlc3MnOiB0cnVlLFxuICAgIH0sXG4gICAgcGVybWlzc2lvbnM6IHtcbiAgICAgIC8vIGZvciBsaW50ZXIgZml4XG4gICAgICBjb250ZW50czogJ3dyaXRlJyxcbiAgICB9LFxuICAgIGpvYnM6IHtcbiAgICAgIHRlc3Q6IHtcbiAgICAgICAgdXNlczogJ1dpbGxCb29zdGVyL3JldXNhYmxlLXdvcmtmbG93cy8uZ2l0aHViL3dvcmtmbG93cy90ZXN0LnltbEBtYWluJyxcbiAgICAgIH0sXG4gICAgfSxcbiAgfSxcbiAgcmVsZWFzZToge1xuICAgIG5hbWU6ICdSZWxlYXNlJyxcbiAgICBvbjoge1xuICAgICAgcHVzaDoge1xuICAgICAgICBicmFuY2hlczogW10sXG4gICAgICB9LFxuICAgIH0sXG4gICAgY29uY3VycmVuY3k6IHtcbiAgICAgIGdyb3VwOiAnJHt7IGdpdGh1Yi53b3JrZmxvdyB9fScsXG4gICAgICAnY2FuY2VsLWluLXByb2dyZXNzJzogZmFsc2UsXG4gICAgfSxcbiAgICBwZXJtaXNzaW9uczoge1xuICAgICAgLy8gaHR0cHM6Ly9kb2NzLm5wbWpzLmNvbS90cnVzdGVkLXB1Ymxpc2hlcnMjc3RlcC0yLWNvbmZpZ3VyZS15b3VyLWNpY2Qtd29ya2Zsb3dcbiAgICAgICdpZC10b2tlbic6ICd3cml0ZScsXG4gICAgICAvLyBmb3Igc2VtYW50aWMtcmVsZWFzZVxuICAgICAgY29udGVudHM6ICd3cml0ZScsXG4gICAgfSxcbiAgICBqb2JzOiB7XG4gICAgICByZWxlYXNlOiB7XG4gICAgICAgIHVzZXM6ICdXaWxsQm9vc3Rlci9yZXVzYWJsZS13b3JrZmxvd3MvLmdpdGh1Yi93b3JrZmxvd3MvcmVsZWFzZS55bWxAbWFpbicsXG4gICAgICB9LFxuICAgIH0sXG4gIH0sXG4gICdzZW1hbnRpYy1wcic6IHtcbiAgICBuYW1lOiAnTGludCBQUiB0aXRsZScsXG4gICAgb246IHtcbiAgICAgIHB1bGxfcmVxdWVzdF90YXJnZXQ6IHtcbiAgICAgICAgdHlwZXM6IFsnb3BlbmVkJywgJ2VkaXRlZCcsICdzeW5jaHJvbml6ZSddLFxuICAgICAgfSxcbiAgICB9LFxuICAgIGpvYnM6IHtcbiAgICAgICdzZW1hbnRpYy1wcic6IHtcbiAgICAgICAgdXNlczogJ1dpbGxCb29zdGVyL3JldXNhYmxlLXdvcmtmbG93cy8uZ2l0aHViL3dvcmtmbG93cy9zZW1hbnRpYy1wci55bWxAbWFpbicsXG4gICAgICB9LFxuICAgIH0sXG4gIH0sXG4gIHN5bmM6IHtcbiAgICBuYW1lOiAnU3luYycsXG4gICAgb246IHt9LFxuICAgIHBlcm1pc3Npb25zOiB7XG4gICAgICAvLyBmb3IgY29tbWl0aW5nIGNoYW5nZXNcbiAgICAgIGNvbnRlbnRzOiAnd3JpdGUnLFxuICAgIH0sXG4gICAgam9iczoge1xuICAgICAgc3luYzogeyB1c2VzOiAnV2lsbEJvb3N0ZXIvcmV1c2FibGUtd29ya2Zsb3dzLy5naXRodWIvd29ya2Zsb3dzL3N5bmMueW1sQG1haW4nIH0sXG4gICAgfSxcbiAgfSxcbiAgJ2Nsb3NlLWNvbW1lbnQnOiB7XG4gICAgbmFtZTogJ0FkZCBjbG9zZSBjb21tZW50JyxcbiAgICBvbjoge1xuICAgICAgcHVsbF9yZXF1ZXN0OiB7XG4gICAgICAgIHR5cGVzOiBbJ29wZW5lZCddLFxuICAgICAgfSxcbiAgICB9LFxuICAgIGpvYnM6IHtcbiAgICAgICdjbG9zZS1jb21tZW50Jzoge1xuICAgICAgICB1c2VzOiAnV2lsbEJvb3N0ZXIvcmV1c2FibGUtd29ya2Zsb3dzLy5naXRodWIvd29ya2Zsb3dzL2Nsb3NlLWNvbW1lbnQueW1sQG1haW4nLFxuICAgICAgfSxcbiAgICB9LFxuICB9LFxuICAnZ2VuLXByLWNsYXVkZSc6IHtcbiAgICBuYW1lOiAnR2VuZXJhdGUgUFIgd2l0aCBDbGF1ZGUgQ29kZScsXG4gICAgb246IHtcbiAgICAgIGlzc3Vlczoge1xuICAgICAgICB0eXBlczogWydsYWJlbGVkJ10sXG4gICAgICB9LFxuICAgICAgcHVsbF9yZXF1ZXN0OiB7XG4gICAgICAgIHR5cGVzOiBbJ2xhYmVsZWQnXSxcbiAgICAgIH0sXG4gICAgfSxcbiAgICBqb2JzOiB7XG4gICAgICAnZ2VuLXByJzoge1xuICAgICAgICBpZjogXCJjb250YWlucyhnaXRodWIuZXZlbnQubGFiZWwubmFtZSwgJ2dlbi1wci1hbGwnKSB8fCBjb250YWlucyhnaXRodWIuZXZlbnQubGFiZWwubmFtZSwgJ2dlbi1wci1jbGF1ZGUnKVwiLFxuICAgICAgICB1c2VzOiAnV2lsbEJvb3N0ZXIvcmV1c2FibGUtd29ya2Zsb3dzLy5naXRodWIvd29ya2Zsb3dzL2dlbi1wci55bWxAbWFpbicsXG4gICAgICAgIHdpdGg6IHtcbiAgICAgICAgICAnY29kaW5nLXRvb2wnOiAnY2xhdWRlLWNvZGUnLFxuICAgICAgICAgICdpc3N1ZS1udW1iZXInOiAnJHt7IGdpdGh1Yi5ldmVudC5pc3N1ZS5udW1iZXIgfHwgZ2l0aHViLmV2ZW50Lm51bWJlciB9fScsXG4gICAgICAgICAgJ3Rlc3QtY29tbWFuZCc6ICd5YXJufGJ1biBjaGVjay1hbGwtZm9yLWFpJyxcbiAgICAgICAgfSxcbiAgICAgICAgc2VjcmV0czoge1xuICAgICAgICAgIENMQVVERV9DT0RFX09BVVRIX1RPS0VOOiAnJHt7IHNlY3JldHMuQ0xBVURFX0NPREVfT0FVVEhfVE9LRU4gfX0nLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICB9LFxuICB9LFxuICAnZ2VuLXByLWNvZGV4Jzoge1xuICAgIG5hbWU6ICdHZW5lcmF0ZSBQUiB3aXRoIENvZGV4IENMSScsXG4gICAgb246IHtcbiAgICAgIGlzc3Vlczoge1xuICAgICAgICB0eXBlczogWydsYWJlbGVkJ10sXG4gICAgICB9LFxuICAgICAgcHVsbF9yZXF1ZXN0OiB7XG4gICAgICAgIHR5cGVzOiBbJ2xhYmVsZWQnXSxcbiAgICAgIH0sXG4gICAgfSxcbiAgICBqb2JzOiB7XG4gICAgICAnZ2VuLXByJzoge1xuICAgICAgICBpZjogXCJjb250YWlucyhnaXRodWIuZXZlbnQubGFiZWwubmFtZSwgJ2dlbi1wci1hbGwnKSB8fCBjb250YWlucyhnaXRodWIuZXZlbnQubGFiZWwubmFtZSwgJ2dlbi1wci1jb2RleCcpXCIsXG4gICAgICAgIHVzZXM6ICdXaWxsQm9vc3Rlci9yZXVzYWJsZS13b3JrZmxvd3MvLmdpdGh1Yi93b3JrZmxvd3MvZ2VuLXByLnltbEBtYWluJyxcbiAgICAgICAgd2l0aDoge1xuICAgICAgICAgICdjb2RpbmctdG9vbCc6ICdjb2RleC1jbGknLFxuICAgICAgICAgICdpc3N1ZS1udW1iZXInOiAnJHt7IGdpdGh1Yi5ldmVudC5pc3N1ZS5udW1iZXIgfHwgZ2l0aHViLmV2ZW50Lm51bWJlciB9fScsXG4gICAgICAgICAgJ3Rlc3QtY29tbWFuZCc6ICd5YXJufGJ1biBjaGVjay1hbGwtZm9yLWFpJyxcbiAgICAgICAgfSxcbiAgICAgICAgc2VjcmV0czoge1xuICAgICAgICAgIE9QRU5BSV9BUElfS0VZOiAnJHt7IHNlY3JldHMuT1BFTkFJX0FQSV9LRVkgfX0nLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICB9LFxuICB9LFxuICAnZ2VuLXByLWdlbWluaSc6IHtcbiAgICBuYW1lOiAnR2VuZXJhdGUgUFIgd2l0aCBHZW1pbmkgQ0xJJyxcbiAgICBvbjoge1xuICAgICAgaXNzdWVzOiB7XG4gICAgICAgIHR5cGVzOiBbJ2xhYmVsZWQnXSxcbiAgICAgIH0sXG4gICAgICBwdWxsX3JlcXVlc3Q6IHtcbiAgICAgICAgdHlwZXM6IFsnbGFiZWxlZCddLFxuICAgICAgfSxcbiAgICB9LFxuICAgIGpvYnM6IHtcbiAgICAgICdnZW4tcHInOiB7XG4gICAgICAgIGlmOiBcImNvbnRhaW5zKGdpdGh1Yi5ldmVudC5sYWJlbC5uYW1lLCAnZ2VuLXByLWFsbCcpIHx8IGNvbnRhaW5zKGdpdGh1Yi5ldmVudC5sYWJlbC5uYW1lLCAnZ2VuLXByLWdlbWluaScpXCIsXG4gICAgICAgIHVzZXM6ICdXaWxsQm9vc3Rlci9yZXVzYWJsZS13b3JrZmxvd3MvLmdpdGh1Yi93b3JrZmxvd3MvZ2VuLXByLnltbEBtYWluJyxcbiAgICAgICAgd2l0aDoge1xuICAgICAgICAgICdjb2RpbmctdG9vbCc6ICdnZW1pbmktY2xpJyxcbiAgICAgICAgICAnaXNzdWUtbnVtYmVyJzogJyR7eyBnaXRodWIuZXZlbnQuaXNzdWUubnVtYmVyIHx8IGdpdGh1Yi5ldmVudC5udW1iZXIgfX0nLFxuICAgICAgICAgICd0ZXN0LWNvbW1hbmQnOiAneWFybnxidW4gY2hlY2stYWxsLWZvci1haScsXG4gICAgICAgIH0sXG4gICAgICAgIHNlY3JldHM6IHtcbiAgICAgICAgICBHRU1JTklfQVBJX0tFWTogJyR7eyBzZWNyZXRzLkdFTUlOSV9BUElfS0VZIH19JyxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgfSxcbiAgfSxcbn0gYXMgY29uc3Q7XG5cbnR5cGUgS25vd25LaW5kID0ga2V5b2YgdHlwZW9mIHdvcmtmbG93cyB8ICdkZXBsb3knIHwgJ2F1dG9maXgnO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVXb3JrZmxvd3Mocm9vdENvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2dlbmVyYXRlV29ya2Zsb3cnLCBhc3luYyAoKSA9PiB7XG4gICAgaWYgKGlzUmV1c2FibGVXb3JrZmxvd3NSZXBvKHJvb3RDb25maWcucmVwb3NpdG9yeSkpIHtcbiAgICAgIC8vIERvbid0IHRvdWNoIHJldXNhYmxlLXdvcmtmbG93cyByZXBvIGJlY2F1c2UgaXQgaG9zdHMgdXBzdHJlYW0gd29ya2Zsb3cgZGVmaW5pdGlvbnMuXG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3Qgd29ya2Zsb3dzUGF0aCA9IHBhdGgucmVzb2x2ZShyb290Q29uZmlnLmRpclBhdGgsICcuZ2l0aHViJywgJ3dvcmtmbG93cycpO1xuICAgIGF3YWl0IGZzLnByb21pc2VzLm1rZGlyKHdvcmtmbG93c1BhdGgsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuXG4gICAgLy8gUmVtb3ZlIGNvbmZpZyBvZiBzZW1hbnRpYyBwdWxsIHJlcXVlc3RcbiAgICBjb25zdCBzZW1hbnRpY1ltbFBhdGggPSBwYXRoLnJlc29sdmUocm9vdENvbmZpZy5kaXJQYXRoLCAnLmdpdGh1YicsICdzZW1hbnRpYy55bWwnKTtcbiAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnMucHJvbWlzZXMucm0oc2VtYW50aWNZbWxQYXRoLCB7IGZvcmNlOiB0cnVlLCByZWN1cnNpdmU6IHRydWUgfSkpO1xuXG4gICAgY29uc3QgZW50cmllcyA9IGF3YWl0IGZzLnByb21pc2VzLnJlYWRkaXIod29ya2Zsb3dzUGF0aCwgeyB3aXRoRmlsZVR5cGVzOiB0cnVlIH0pO1xuICAgIGNvbnN0IGZpbGVOYW1lU2V0ID0gbmV3IFNldChbXG4gICAgICAndGVzdC55bWwnLFxuICAgICAgJ2F1dG9maXgueW1sJyxcbiAgICAgICdzZW1hbnRpYy1wci55bWwnLFxuICAgICAgJ2Nsb3NlLWNvbW1lbnQueW1sJyxcbiAgICAgICdnZW4tcHItY2xhdWRlLnltbCcsXG4gICAgICAnZ2VuLXByLWNvZGV4LnltbCcsXG4gICAgICAnZ2VuLXByLWdlbWluaS55bWwnLFxuICAgICAgLi4uZW50cmllcy5maWx0ZXIoKGRpcmVudCkgPT4gZGlyZW50LmlzRmlsZSgpICYmIGRpcmVudC5uYW1lLmVuZHNXaXRoKCcueW1sJykpLm1hcCgoZGlyZW50KSA9PiBkaXJlbnQubmFtZSksXG4gICAgXSk7XG4gICAgaWYgKHJvb3RDb25maWcuZGVwZW5kaW5nLnNlbWFudGljUmVsZWFzZSkge1xuICAgICAgZmlsZU5hbWVTZXQuYWRkKCdyZWxlYXNlLnltbCcpO1xuICAgIH1cblxuICAgIGZvciAoY29uc3QgZmlsZU5hbWUgb2YgZmlsZU5hbWVTZXQpIHtcbiAgICAgIC8vIOWun+mam+OBr0tub3duS2luZOS7peWkluOBruWApOOCguS7o+WFpeOBleOCjOOCi+OBk+OBqOOBq+azqOaEj1xuICAgICAgY29uc3Qga2luZCA9IHBhdGguYmFzZW5hbWUoZmlsZU5hbWUsICcueW1sJykgYXMgS25vd25LaW5kO1xuICAgICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IHdyaXRlV29ya2Zsb3dZYW1sKHJvb3RDb25maWcsIHdvcmtmbG93c1BhdGgsIGtpbmQpKTtcbiAgICB9XG4gIH0pO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNSZXVzYWJsZVdvcmtmbG93c1JlcG8ocmVwb3NpdG9yeT86IHN0cmluZyk6IGJvb2xlYW4ge1xuICByZXR1cm4gcmVwb3NpdG9yeT8uZW5kc1dpdGgoJy9yZXVzYWJsZS13b3JrZmxvd3MnKSA/PyBmYWxzZTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gd3JpdGVXb3JrZmxvd1lhbWwoY29uZmlnOiBQYWNrYWdlQ29uZmlnLCB3b3JrZmxvd3NQYXRoOiBzdHJpbmcsIGtpbmQ6IEtub3duS2luZCk6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBmaWxlUGF0aCA9IHBhdGguam9pbih3b3JrZmxvd3NQYXRoLCBgJHtraW5kfS55bWxgKTtcbiAgY29uc3QgZGVwbG95UHJvZHVjdGlvbldvcmtmbG93RXhpc3RzID0gZnMuZXhpc3RzU3luYyhwYXRoLmpvaW4od29ya2Zsb3dzUGF0aCwgJ2RlcGxveS1wcm9kdWN0aW9uLnltbCcpKTtcblxuICBpZiAoa2luZCA9PT0gJ2F1dG9maXgnKSB7XG4gICAgYXdhaXQgd3JpdGVZYW1sKGdlbmVyYXRlQXV0b2ZpeFdvcmtmbG93KGNvbmZpZyksIGZpbGVQYXRoKTtcbiAgICByZXR1cm47XG4gIH1cblxuICBsZXQgbmV3U2V0dGluZ3MgPSBjbG9uZURlZXAoa2luZCBpbiB3b3JrZmxvd3MgPyB3b3JrZmxvd3Nba2luZCBhcyBrZXlvZiB0eXBlb2Ygd29ya2Zsb3dzXSA6IHt9KSBhcyBXb3JrZmxvdztcblxuICB0cnkge1xuICAgIGNvbnN0IG9sZENvbnRlbnQgPSBhd2FpdCBmcy5wcm9taXNlcy5yZWFkRmlsZShmaWxlUGF0aCwgJ3V0ZjgnKTtcbiAgICBjb25zdCBvbGRTZXR0aW5ncyA9IHlhbWwubG9hZChvbGRDb250ZW50KSBhcyBXb3JrZmxvdztcbiAgICBuZXdTZXR0aW5ncyA9IG1lcmdlLmFsbChbbmV3U2V0dGluZ3MsIG9sZFNldHRpbmdzLCBuZXdTZXR0aW5nc10sIHsgYXJyYXlNZXJnZTogY29tYmluZU1lcmdlIH0pIGFzIFdvcmtmbG93O1xuICB9IGNhdGNoIHtcbiAgICAvLyBkbyBub3RoaW5nXG4gIH1cblxuICAvLyBTa2lwIGEgYnJva2VuIHdvcmtmbG93XG4gIGlmICghKCdqb2JzJyBpbiBuZXdTZXR0aW5ncykpIHJldHVybjtcblxuICBpZiAoa2luZC5zdGFydHNXaXRoKCdkZXBsb3knKSkge1xuICAgIG5ld1NldHRpbmdzID0ge1xuICAgICAgLi4ubmV3U2V0dGluZ3MsXG4gICAgICBjb25jdXJyZW5jeToge1xuICAgICAgICBncm91cDogJyR7eyBnaXRodWIud29ya2Zsb3cgfX0nLFxuICAgICAgICAnY2FuY2VsLWluLXByb2dyZXNzJzogZmFsc2UsXG4gICAgICB9LFxuICAgIH07XG4gICAgLy8gTW92ZSBqb2JzIHRvIHRoZSBib3R0b21cbiAgICBtb3ZlVG9Cb3R0b20obmV3U2V0dGluZ3MsICdqb2JzJyk7XG4gICAgaWYgKG5ld1NldHRpbmdzLm9uPy5wdXNoKSB7XG4gICAgICBuZXdTZXR0aW5ncy5vbi5wdXNoWydwYXRocy1pZ25vcmUnXSA9IFtcbiAgICAgICAgLi4ubmV3IFNldChbJyoqLm1kJywgJyoqL2RvY3MvKionLCAuLi4obmV3U2V0dGluZ3Mub24ucHVzaFsncGF0aHMtaWdub3JlJ10gPz8gW10pXSksXG4gICAgICBdO1xuICAgIH1cbiAgfVxuXG4gIGlmIChraW5kID09PSAncmVsZWFzZScgJiYgbmV3U2V0dGluZ3Muam9icy5yZWxlYXNlICYmIGRlcGxveVByb2R1Y3Rpb25Xb3JrZmxvd0V4aXN0cykge1xuICAgIG5ld1NldHRpbmdzLnBlcm1pc3Npb25zID8/PSB7fTtcbiAgICBuZXdTZXR0aW5ncy5wZXJtaXNzaW9ucy5hY3Rpb25zID0gJ3dyaXRlJztcbiAgICBuZXdTZXR0aW5ncy5qb2JzLnJlbGVhc2Uud2l0aCA/Pz0ge307XG4gICAgbmV3U2V0dGluZ3Muam9icy5yZWxlYXNlLndpdGgudHJpZ2dlcl9kZXBsb3lfd29ya2Zsb3cgPSAnZGVwbG95LXByb2R1Y3Rpb24ueW1sJztcbiAgfVxuXG4gIGxldCBpc1JldXNhYmxlV29ya2Zsb3cgPSBmYWxzZTtcbiAgZm9yIChjb25zdCBqb2Igb2YgT2JqZWN0LnZhbHVlcyhuZXdTZXR0aW5ncy5qb2JzKSkge1xuICAgIC8vIElnbm9yZSBub24tcmV1c2FibGUgd29ya2Zsb3dzXG4gICAgaWYgKCFqb2IudXNlcz8uaW5jbHVkZXMoJy9yZXVzYWJsZS13b3JrZmxvd3MvJykpIGNvbnRpbnVlO1xuXG4gICAgbm9ybWFsaXplSm9iKGNvbmZpZywgam9iLCBraW5kKTtcbiAgICBpc1JldXNhYmxlV29ya2Zsb3cgPSB0cnVlO1xuICB9XG4gIGlmICghaXNSZXVzYWJsZVdvcmtmbG93KSByZXR1cm47XG5cbiAgc3dpdGNoIChraW5kKSB7XG4gICAgY2FzZSAncmVsZWFzZSc6IHtcbiAgICAgIGlmIChuZXdTZXR0aW5ncy5vbj8uc2NoZWR1bGUpIHtcbiAgICAgICAgZGVsZXRlIG5ld1NldHRpbmdzLm9uLnB1c2g7XG4gICAgICB9IGVsc2UgaWYgKG5ld1NldHRpbmdzLm9uPy5wdXNoICYmIGNvbmZpZy5yZWxlYXNlLmJyYW5jaGVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgbmV3U2V0dGluZ3Mub24ucHVzaC5icmFuY2hlcyA9IGNvbmZpZy5yZWxlYXNlLmJyYW5jaGVzO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gRG9uJ3QgdXNlIHJlbGVhc2UueW1sIGlmIHJlbGVhc2UgYnJhbmNoIGlzIG5vdCBzcGVjaWZpZWRcbiAgICAgICAgYXdhaXQgZnMucHJvbWlzZXMucm0ocGF0aC5qb2luKHdvcmtmbG93c1BhdGgsICdyZWxlYXNlLnltbCcpLCB7IGZvcmNlOiB0cnVlIH0pO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBpZiAoY29uZmlnLmlzUHVibGljUmVwbykge1xuICAgICAgICBuZXdTZXR0aW5ncy5wZXJtaXNzaW9ucyA/Pz0ge307XG4gICAgICAgIG5ld1NldHRpbmdzLnBlcm1pc3Npb25zWydpZC10b2tlbiddID0gJ3dyaXRlJztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGRlbGV0ZSBuZXdTZXR0aW5ncy5wZXJtaXNzaW9ucz8uWydpZC10b2tlbiddO1xuICAgICAgfVxuICAgICAgYnJlYWs7XG4gICAgfVxuICAgIGNhc2UgJ3Rlc3QnOiB7XG4gICAgICAvLyBEb24ndCB1c2UgYHBhdGhzLWlnbm9yZWAgZm9yIHRlc3QgYmVjYXVzZSBHaXRIdWIncyBCcmFuY2ggUHJvdGVjdGlvbiBhbmQgUnVsZXNldHMgcmVxdWlyZSBqb2IgcnVubmluZy5cbiAgICAgIGlmIChuZXdTZXR0aW5ncy5vbj8ucHVsbF9yZXF1ZXN0KSB7XG4gICAgICAgIGRlbGV0ZSBuZXdTZXR0aW5ncy5vbi5wdWxsX3JlcXVlc3RbJ3BhdGhzLWlnbm9yZSddO1xuICAgICAgfVxuICAgICAgaWYgKG5ld1NldHRpbmdzLm9uPy5wdXNoKSB7XG4gICAgICAgIGRlbGV0ZSBuZXdTZXR0aW5ncy5vbi5wdXNoWydwYXRocy1pZ25vcmUnXTtcbiAgICAgICAgbmV3U2V0dGluZ3Mub24ucHVzaC5icmFuY2hlcyA9IG5ld1NldHRpbmdzLm9uLnB1c2guYnJhbmNoZXMuZmlsdGVyKChicmFuY2gpID0+IGJyYW5jaCAhPT0gJ3Jlbm92YXRlLyoqJyk7XG4gICAgICB9XG4gICAgICBicmVhaztcbiAgICB9XG4gICAgLy8gTm8gZGVmYXVsdFxuICB9XG4gIGF3YWl0IHdyaXRlWWFtbChuZXdTZXR0aW5ncywgZmlsZVBhdGgpO1xuXG4gIGlmIChraW5kID09PSAnc3luYycpIHtcbiAgICBhd2FpdCBmcy5wcm9taXNlcy5ybShwYXRoLmpvaW4od29ya2Zsb3dzUGF0aCwgJ3N5bmMtaW5pdC55bWwnKSwgeyBmb3JjZTogdHJ1ZSB9KTtcbiAgICBpZiAoIW5ld1NldHRpbmdzLmpvYnMuc3luYz8ud2l0aCkgcmV0dXJuO1xuXG4gICAgLy8gR2VuZXJhdGUgc3luYy1mb3JjZS55bWwgYmFzZWQgb24gc3luYy55bWwgaWYgaXQgZXhpc3RzLlxuICAgIG5ld1NldHRpbmdzLmpvYnNbJ3N5bmMtZm9yY2UnXSA9IG5ld1NldHRpbmdzLmpvYnMuc3luYztcbiAgICBjb25zdCBwYXJhbXMgPSBuZXdTZXR0aW5ncy5qb2JzLnN5bmMud2l0aC5zeW5jX3BhcmFtc193aXRob3V0X2Rlc3Q7XG4gICAgaWYgKHR5cGVvZiBwYXJhbXMgIT09ICdzdHJpbmcnKSByZXR1cm47XG5cbiAgICBuZXdTZXR0aW5ncy5qb2JzLnN5bmMud2l0aC5zeW5jX3BhcmFtc193aXRob3V0X2Rlc3QgPSBgLS1mb3JjZSAke3BhcmFtc31gO1xuICAgIG5ld1NldHRpbmdzLm5hbWUgPSAnRm9yY2UgdG8gU3luYyc7XG4gICAgbmV3U2V0dGluZ3Mub24gPSB7IHdvcmtmbG93X2Rpc3BhdGNoOiBudWxsIH07XG4gICAgZGVsZXRlIG5ld1NldHRpbmdzLmpvYnMuc3luYztcbiAgICBhd2FpdCB3cml0ZVlhbWwobmV3U2V0dGluZ3MsIHBhdGguam9pbih3b3JrZmxvd3NQYXRoLCAnc3luYy1mb3JjZS55bWwnKSk7XG4gIH1cbn1cblxuZnVuY3Rpb24gbm9ybWFsaXplSm9iKGNvbmZpZzogUGFja2FnZUNvbmZpZywgam9iOiBKb2IsIGtpbmQ6IEtub3duS2luZCk6IHZvaWQge1xuICBqb2Iud2l0aCA/Pz0ge307XG4gIGpvYi5zZWNyZXRzID8/PSB7fTtcbiAgLy8gVXNlIHRydXN0ZWQgcHVibGlzaGluZyBpbnN0ZWFkIG9mIE5QTV9UT0tFTlxuICBkZWxldGUgam9iLnNlY3JldHMuTlBNX1RPS0VOO1xuXG4gIGlmIChcbiAgICBraW5kID09PSAndGVzdCcgfHxcbiAgICBraW5kID09PSAncmVsZWFzZScgfHxcbiAgICBraW5kID09PSAnZ2VuLXByLWNsYXVkZScgfHxcbiAgICBraW5kID09PSAnZ2VuLXByLWNvZGV4JyB8fFxuICAgIGtpbmQgPT09ICdnZW4tcHItZ2VtaW5pJ1xuICApIHtcbiAgICBqb2Iuc2VjcmV0cy5HSF9UT0tFTiA9ICcke3sgc2VjcmV0cy5HSVRIVUJfVE9LRU4gfX0nO1xuICB9XG5cbiAgLy8gU2V0IHRlc3QtY29tbWFuZCBmb3IgZ2VuLXByIHdvcmtmbG93cyBiYXNlZCBvbiBwYWNrYWdlIG1hbmFnZXJcbiAgaWYgKGtpbmQgPT09ICdnZW4tcHItY2xhdWRlJyB8fCBraW5kID09PSAnZ2VuLXByLWNvZGV4JyB8fCBraW5kID09PSAnZ2VuLXByLWdlbWluaScpIHtcbiAgICBqb2Iud2l0aFsndGVzdC1jb21tYW5kJ10gPSBjb25maWcuaXNCdW4gPyAnYnVuIHJ1biBjaGVjay1hbGwtZm9yLWFpJyA6ICd5YXJuIGNoZWNrLWFsbC1mb3ItYWknO1xuICB9XG4gIGlmIChqb2Iuc2VjcmV0cy5GSVJFQkFTRV9UT0tFTikge1xuICAgIGpvYi5zZWNyZXRzLkdDUF9TQV9LRVlfSlNPTl9GT1JfRklSRUJBU0UgPSAnJHt7IHNlY3JldHMuR0NQX1NBX0tFWV9KU09OX0ZPUl9GSVJFQkFTRSB9fSc7XG4gICAgZGVsZXRlIGpvYi5zZWNyZXRzLkZJUkVCQVNFX1RPS0VOO1xuICB9XG4gIGlmIChcbiAgICAoam9iLnNlY3JldHMuRElTQ09SRF9XRUJIT09LX1VSTCAmJiAoa2luZCA9PT0gJ3JlbGVhc2UnIHx8IGtpbmQuc3RhcnRzV2l0aCgnZGVwbG95JykpKSB8fFxuICAgIChqb2Iud2l0aC5zZXJ2ZXJfdXJsICYmIGtpbmQuc3RhcnRzV2l0aCgnZGVwbG95JykpXG4gICkge1xuICAgIGpvYi5zZWNyZXRzLkRJU0NPUkRfV0VCSE9PS19VUkwgPSAnJHt7IHNlY3JldHMuRElTQ09SRF9XRUJIT09LX1VSTF9GT1JfUkVMRUFTRSB9fSc7XG4gIH1cblxuICBpZiAoa2luZCA9PT0gJ3N5bmMnKSB7XG4gICAgY29uc3QgcGFyYW1zID0gam9iLndpdGguc3luY19wYXJhbXNfd2l0aG91dF9kZXN0O1xuICAgIGlmICh0eXBlb2YgcGFyYW1zID09PSAnc3RyaW5nJykge1xuICAgICAgam9iLndpdGguc3luY19wYXJhbXNfd2l0aG91dF9kZXN0ID0gcGFyYW1zLnJlcGxhY2UoJ3N5bmMgJywgJycpO1xuICAgIH1cbiAgfVxuXG4gIGlmIChjb25maWcucmVwb3NpdG9yeT8uc3RhcnRzV2l0aCgnZ2l0aHViOldpbGxCb29zdGVyLycpKSB7XG4gICAgam9iLnVzZXMgPSBqb2IudXNlcz8ucmVwbGFjZSgnV2lsbEJvb3N0ZXJMYWIvJywgJ1dpbGxCb29zdGVyLycpO1xuICB9IGVsc2UgaWYgKGNvbmZpZy5yZXBvc2l0b3J5Py5zdGFydHNXaXRoKCdnaXRodWI6V2lsbEJvb3N0ZXJMYWIvJykpIHtcbiAgICBqb2IudXNlcyA9IGpvYi51c2VzPy5yZXBsYWNlKCdXaWxsQm9vc3Rlci8nLCAnV2lsbEJvb3N0ZXJMYWIvJyk7XG4gIH1cblxuICAvLyBSZW1vdmUgcmVkdW5kYW50IHBhcmFtZXRlcnNcbiAgaWYgKGpvYi53aXRoLmRvdF9lbnZfcGF0aCA9PT0gJy5lbnYnKSB7XG4gICAgZGVsZXRlIGpvYi53aXRoLmRvdF9lbnZfcGF0aDtcbiAgfVxuXG4gIC8vIERvbid0IHVzZSBgZmx5IGRlcGxveSAtLWpzb25gIHNpbmNlIGl0IGNhdXNlcyBhbiBlcnJvclxuICBpZiAoa2luZC5zdGFydHNXaXRoKCdkZXBsb3knKSAmJiBqb2Iuc2VjcmV0cy5GTFlfQVBJX1RPS0VOICYmIHR5cGVvZiBqb2Iud2l0aC5kZXBsb3lfY29tbWFuZCA9PT0gJ3N0cmluZycpIHtcbiAgICBqb2Iud2l0aC5kZXBsb3lfY29tbWFuZCA9IGpvYi53aXRoLmRlcGxveV9jb21tYW5kLnJlcGxhY2UoL1xccystLWpzb24vLCAnJyk7XG4gIH1cbiAgaWYgKGNvbmZpZy5kb2VzQ29udGFpbkRvY2tlcmZpbGUgJiYgIWpvYi53aXRoLmNpX2xhYmVsICYmIGtpbmQuc3RhcnRzV2l0aCgndGVzdCcpKSB7XG4gICAgam9iLndpdGguY2lfbGFiZWwgPSAnbGFyZ2UnO1xuICB9XG4gIC8vIEJlY2F1c2UgZ2l0aHViLmV2ZW50LnJlcG9zaXRvcnkucHJpdmF0ZSBpcyBhbHdheXMgdHJ1ZSBpZiBqb2IgaXMgc2NoZWR1bGVkXG4gIGlmIChraW5kID09PSAncmVsZWFzZScgfHwga2luZCA9PT0gJ3Rlc3QnIHx8IGtpbmQuc3RhcnRzV2l0aCgnZGVwbG95JykpIHtcbiAgICBpZiAoY29uZmlnLmlzUHVibGljUmVwbykge1xuICAgICAgam9iLndpdGguZ2l0aHViX2hvc3RlZF9ydW5uZXIgPSB0cnVlO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBkZWxldGUgam9iLndpdGguZ2l0aHViX2hvc3RlZF9ydW5uZXI7XG4gIH1cblxuICBpZiAoT2JqZWN0LmtleXMoam9iLndpdGgpLmxlbmd0aCA+IDApIHtcbiAgICBzb3J0S2V5cyhqb2Iud2l0aCk7XG4gIH0gZWxzZSB7XG4gICAgZGVsZXRlIGpvYi53aXRoO1xuICB9XG4gIGlmIChPYmplY3Qua2V5cyhqb2Iuc2VjcmV0cykubGVuZ3RoID4gMCkge1xuICAgIC8vIE1vdmUgc2VjcmV0cyBwcm9wIGFmdGVyIHdpdGggcHJvcFxuICAgIGNvbnN0IG5ld1NlY3JldHMgPSBzb3J0S2V5cyhqb2Iuc2VjcmV0cyk7XG4gICAgZGVsZXRlIGpvYi5zZWNyZXRzO1xuICAgIGpvYi5zZWNyZXRzID0gbmV3U2VjcmV0cztcbiAgfSBlbHNlIHtcbiAgICBkZWxldGUgam9iLnNlY3JldHM7XG4gIH1cbn1cblxuZnVuY3Rpb24gZ2VuZXJhdGVBdXRvZml4V29ya2Zsb3coY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogV29ya2Zsb3cge1xuICBpZiAoIWNvbmZpZy5pc1B1YmxpY1JlcG8pIHtcbiAgICByZXR1cm4gY2xvbmVEZWVwKHByaXZhdGVSZXBvQXV0b2ZpeFdvcmtmbG93KTtcbiAgfVxuXG4gIGNvbnN0IHBhY2thZ2VNYW5hZ2VyID0gY29uZmlnLmlzQnVuID8gJ2J1bicgOiAneWFybic7XG4gIGNvbnN0IHN0ZXBzOiBTdGVwW10gPSBbXG4gICAgeyB1c2VzOiAnYWN0aW9ucy9jaGVja291dEB2NicgfSxcbiAgICB7IHVzZXM6ICdhY3Rpb25zL3NldHVwLW5vZGVAdjYnLCB3aXRoOiB7ICdjaGVjay1sYXRlc3QnOiB0cnVlIH0gfSxcbiAgICAuLi4oY29uZmlnLmlzQnVuID8gW3sgdXNlczogJ292ZW4tc2gvc2V0dXAtYnVuQHYxJywgd2l0aDogeyAnYnVuLXZlcnNpb24nOiAnbGF0ZXN0JyB9IH1dIDogW10pLFxuICAgIHsgcnVuOiBgJHtwYWNrYWdlTWFuYWdlcn0gaW5zdGFsbGAgfSxcbiAgICB7IHJ1bjogYCR7cGFja2FnZU1hbmFnZXJ9IHJ1biBjbGVhbnVwYCB9LFxuICBdO1xuICBpZiAoY29uZmlnLnBhY2thZ2VKc29uPy5zY3JpcHRzPy5idWlsZCkge1xuICAgIHN0ZXBzLnB1c2goeyBydW46IGAke3BhY2thZ2VNYW5hZ2VyfSBydW4gYnVpbGRgIH0pO1xuICB9XG4gIHN0ZXBzLnB1c2goeyB1c2VzOiAnYXV0b2ZpeC1jaS9hY3Rpb25AdjEnIH0pO1xuXG4gIGNvbnN0IGF1dG9maXhXb3JrZmxvdyA9IGNsb25lRGVlcChwdWJsaWNSZXBvQXV0b2ZpeFdvcmtmbG93KTtcbiAgY29uc3QgYXV0b2ZpeEpvYiA9IGF1dG9maXhXb3JrZmxvdy5qb2JzLmF1dG9maXggPz8geyAncnVucy1vbic6ICd1YnVudHUtbGF0ZXN0JyB9O1xuICBhdXRvZml4V29ya2Zsb3cuam9icy5hdXRvZml4ID0geyAuLi5hdXRvZml4Sm9iLCBzdGVwcyB9O1xuICByZXR1cm4gYXV0b2ZpeFdvcmtmbG93O1xufVxuXG5hc3luYyBmdW5jdGlvbiB3cml0ZVlhbWwobmV3U2V0dGluZ3M6IFdvcmtmbG93LCBmaWxlUGF0aDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IHlhbWxUZXh0ID0geWFtbC5kdW1wKG5ld1NldHRpbmdzLCB7IGxpbmVXaWR0aDogLTEsIG5vQ29tcGF0TW9kZTogdHJ1ZSwgc3R5bGVzOiB7ICchIW51bGwnOiAnZW1wdHknIH0gfSk7XG4gIGF3YWl0IGZzLnByb21pc2VzLndyaXRlRmlsZShmaWxlUGF0aCwgeWFtbFRleHQpO1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IGZnIGZyb20gJ2Zhc3QtZ2xvYic7XG5cbmltcG9ydCB7IGlzUmV1c2FibGVXb3JrZmxvd3NSZXBvIH0gZnJvbSAnLi4vZ2VuZXJhdG9ycy93b3JrZmxvdy5qcyc7XG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHsgb3B0aW9ucyB9IGZyb20gJy4uL29wdGlvbnMuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBmc1V0aWwgfSBmcm9tICcuLi91dGlscy9mc1V0aWwuanMnO1xuaW1wb3J0IHsgZ2xvYklnbm9yZSB9IGZyb20gJy4uL3V0aWxzL2dsb2JVdGlsLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZml4VHlwb3MocGFja2FnZUNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2ZpeFR5cG9zJywgYXN5bmMgKCkgPT4ge1xuICAgIGlmIChpc1JldXNhYmxlV29ya2Zsb3dzUmVwbyhwYWNrYWdlQ29uZmlnLnJlcG9zaXRvcnkpKSByZXR1cm47XG5cbiAgICBjb25zdCBkaXJQYXRoID0gcGFja2FnZUNvbmZpZy5kaXJQYXRoO1xuICAgIGNvbnN0IGRvY0ZpbGVzID0gYXdhaXQgZmcuZ2xvYignKiovKi5tZCcsIHsgZG90OiB0cnVlLCBjd2Q6IGRpclBhdGgsIGlnbm9yZTogZ2xvYklnbm9yZSB9KTtcbiAgICBpZiAob3B0aW9ucy5pc1ZlcmJvc2UpIHtcbiAgICAgIGNvbnNvbGUuaW5mbyhgRm91bmQgJHtkb2NGaWxlcy5sZW5ndGh9IG1hcmtkb3duIGZpbGVzIGluICR7ZGlyUGF0aH1gKTtcbiAgICB9XG4gICAgZm9yIChjb25zdCBtZEZpbGUgb2YgZG9jRmlsZXMpIHtcbiAgICAgIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5qb2luKGRpclBhdGgsIG1kRmlsZSk7XG4gICAgICB2b2lkIHByb21pc2VQb29sLnJ1bihhc3luYyAoKSA9PiB7XG4gICAgICAgIGNvbnN0IGNvbnRlbnQgPSBhd2FpdCBmcy5wcm9taXNlcy5yZWFkRmlsZShmaWxlUGF0aCwgJ3V0ZjgnKTtcbiAgICAgICAgbGV0IG5ld0NvbnRlbnQgPSBmaXhUeXBvc0luVGV4dChjb250ZW50KTtcbiAgICAgICAgbmV3Q29udGVudCA9IHJlcGxhY2VXaXRoQ29uZmlnKG5ld0NvbnRlbnQsIHBhY2thZ2VDb25maWcsICdkb2MnKTtcbiAgICAgICAgaWYgKGNvbnRlbnQgIT09IG5ld0NvbnRlbnQpIHtcbiAgICAgICAgICBhd2FpdCBmc1V0aWwuZ2VuZXJhdGVGaWxlKGZpbGVQYXRoLCBuZXdDb250ZW50KTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgY29uc3QgdHNGaWxlcyA9IGF3YWl0IGZnLmdsb2IoXG4gICAgICBbXG4gICAgICAgICd7YXBwLHNyYyx0ZXN0LHNjcmlwdHN9LyoqLyoue2NqcyxtanMsanMsanN4LGN0cyxtdHMsdHMsdHN4fScsXG4gICAgICAgICdwYWNrYWdlcy8qKi97YXBwLHNyYyx0ZXN0LHNjcmlwdHN9LyoqLyoue2NqcyxtanMsanMsanN4LGN0cyxtdHMsdHMsdHN4fScsXG4gICAgICBdLFxuICAgICAgeyBkb3Q6IHRydWUsIGN3ZDogZGlyUGF0aCwgaWdub3JlOiBnbG9iSWdub3JlIH1cbiAgICApO1xuICAgIGlmIChvcHRpb25zLmlzVmVyYm9zZSkge1xuICAgICAgY29uc29sZS5pbmZvKGBGb3VuZCAke3RzRmlsZXMubGVuZ3RofSBUeXBlU2NyaXB0IGZpbGVzIGluICR7ZGlyUGF0aH1gKTtcbiAgICB9XG4gICAgZm9yIChjb25zdCB0c0ZpbGUgb2YgdHNGaWxlcykge1xuICAgICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLmpvaW4oZGlyUGF0aCwgdHNGaWxlKTtcbiAgICAgIHZvaWQgcHJvbWlzZVBvb2wucnVuKGFzeW5jICgpID0+IHtcbiAgICAgICAgY29uc3Qgb2xkQ29udGVudCA9IGF3YWl0IGZzLnByb21pc2VzLnJlYWRGaWxlKGZpbGVQYXRoLCAndXRmOCcpO1xuICAgICAgICBsZXQgbmV3Q29udGVudCA9IGZpeFR5cG9zSW5Db2RlKG9sZENvbnRlbnQpO1xuICAgICAgICBuZXdDb250ZW50ID0gcmVwbGFjZVdpdGhDb25maWcobmV3Q29udGVudCwgcGFja2FnZUNvbmZpZywgJ3RzJyk7XG5cbiAgICAgICAgaWYgKG9sZENvbnRlbnQgIT09IG5ld0NvbnRlbnQpIHtcbiAgICAgICAgICBhd2FpdCBmc1V0aWwuZ2VuZXJhdGVGaWxlKGZpbGVQYXRoLCBuZXdDb250ZW50KTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgY29uc3QgdGV4dEJhc2VkRmlsZXMgPSBhd2FpdCBmZy5nbG9iKCcqKi8qLntjc3YsaHRtLGh0bWwsdHN2LHhtbCx5YW1sLHltbH0nLCB7XG4gICAgICBkb3Q6IHRydWUsXG4gICAgICBjd2Q6IGRpclBhdGgsXG4gICAgICBpZ25vcmU6IGdsb2JJZ25vcmUsXG4gICAgfSk7XG4gICAgaWYgKG9wdGlvbnMuaXNWZXJib3NlKSB7XG4gICAgICBjb25zb2xlLmluZm8oYEZvdW5kICR7dGV4dEJhc2VkRmlsZXMubGVuZ3RofSB0ZXh0LWJhc2VkIGZpbGVzIGluICR7ZGlyUGF0aH1gKTtcbiAgICB9XG4gICAgZm9yIChjb25zdCBmaWxlIG9mIHRleHRCYXNlZEZpbGVzKSB7XG4gICAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGguam9pbihkaXJQYXRoLCBmaWxlKTtcbiAgICAgIHZvaWQgcHJvbWlzZVBvb2wucnVuKGFzeW5jICgpID0+IHtcbiAgICAgICAgY29uc3Qgb2xkQ29udGVudCA9IGF3YWl0IGZzLnByb21pc2VzLnJlYWRGaWxlKGZpbGVQYXRoLCAndXRmOCcpO1xuICAgICAgICBsZXQgbmV3Q29udGVudCA9IGZpeFR5cG9zSW5UZXh0KG9sZENvbnRlbnQpO1xuICAgICAgICBuZXdDb250ZW50ID0gcmVwbGFjZVdpdGhDb25maWcobmV3Q29udGVudCwgcGFja2FnZUNvbmZpZywgJ3RleHQnKTtcblxuICAgICAgICBpZiAob2xkQ29udGVudCAhPT0gbmV3Q29udGVudCkge1xuICAgICAgICAgIGF3YWl0IGZzVXRpbC5nZW5lcmF0ZUZpbGUoZmlsZVBhdGgsIG5ld0NvbnRlbnQpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBhd2FpdCBwcm9taXNlUG9vbC5wcm9taXNlQWxsKCk7XG4gIH0pO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZml4VHlwb3NJblRleHQoY29udGVudDogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIGNvbnRlbnRcbiAgICAucmVwbGFjZUFsbCgvXFxiY1xcLmZcXC4oPz1cXHN8JCkvZywgJ2NmLicpXG4gICAgLnJlcGxhY2VBbGwoL1xcYmVnXFwuKD89XFxzfCQpL2csICdlLmcuJylcbiAgICAucmVwbGFjZUFsbCgvXFxiaWVcXC4oPz1cXHMpL2csICdpLmUuJyk7XG59XG5cbmZ1bmN0aW9uIGZpeFR5cG9zSW5Db2RlKGNvbnRlbnQ6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiBjb250ZW50XG4gICAgLnJlcGxhY2VBbGwoL1xcL1xcKltcXHNcXFNdKj9cXCpcXC8vZywgKGNvbW1lbnQpID0+IGZpeFR5cG9zSW5UZXh0KGNvbW1lbnQpKVxuICAgIC5yZXBsYWNlQWxsKC8oXnxcXHMpXFwvXFwvKC4qPyljXFwuZlxcLi9nLCAnJDEvLyQyY2YuJylcbiAgICAucmVwbGFjZUFsbCgvKF58XFxzKVxcL1xcLyguKj8pZWdcXC4vZywgJyQxLy8kMmUuZy4nKVxuICAgIC5yZXBsYWNlQWxsKC8oXnxcXHMpXFwvXFwvKC4qPylpZVxcLi9nLCAnJDEvLyQyaS5lLicpO1xufVxuXG5mdW5jdGlvbiByZXBsYWNlV2l0aENvbmZpZyhuZXdDb250ZW50OiBzdHJpbmcsIHBhY2thZ2VDb25maWc6IFBhY2thZ2VDb25maWcsIHByb3BOYW1lOiAnZG9jJyB8ICd0cycgfCAndGV4dCcpOiBzdHJpbmcge1xuICBmb3IgKGNvbnN0IFtiZWZvcmUsIGFmdGVyXSBvZiBPYmplY3QuZW50cmllcyhwYWNrYWdlQ29uZmlnLndiZnlKc29uPy50eXBvcz8uYWxsID8/IHt9KSkge1xuICAgIG5ld0NvbnRlbnQgPSBuZXdDb250ZW50LnJlcGxhY2VBbGwoYmVmb3JlLCBhZnRlcik7XG4gIH1cbiAgZm9yIChjb25zdCBbYmVmb3JlLCBhZnRlcl0gb2YgT2JqZWN0LmVudHJpZXMocGFja2FnZUNvbmZpZy53YmZ5SnNvbj8udHlwb3M/Lltwcm9wTmFtZV0gPz8ge30pKSB7XG4gICAgbmV3Q29udGVudCA9IG5ld0NvbnRlbnQucmVwbGFjZUFsbChiZWZvcmUsIGFmdGVyKTtcbiAgfVxuICByZXR1cm4gbmV3Q29udGVudDtcbn1cbiIsImltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGZzVXRpbCB9IGZyb20gJy4uL3V0aWxzL2ZzVXRpbC5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlQWdlbnRJbnN0cnVjdGlvbnMocm9vdENvbmZpZzogUGFja2FnZUNvbmZpZywgYWxsQ29uZmlnczogUGFja2FnZUNvbmZpZ1tdKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZ2VuZXJhdGVBZ2VudEluc3RydWN0aW9ucycsIGFzeW5jICgpID0+IHtcbiAgICBpZiAoIXJvb3RDb25maWcuaXNSb290KSByZXR1cm47XG5cbiAgICAvLyBDaGVjayBpZiBBR0VOVFNfRVhUUkEubWQgZXhpc3RzIGFuZCByZWFkIGl0cyBjb250ZW50XG4gICAgY29uc3QgYWdlbnRzRXh0cmFQYXRoID0gcGF0aC5yZXNvbHZlKHJvb3RDb25maWcuZGlyUGF0aCwgJ0FHRU5UU19FWFRSQS5tZCcpO1xuICAgIGNvbnN0IGV4dHJhQ29udGVudCA9IGF3YWl0IGZzVXRpbC5yZWFkRmlsZUlnbm9yaW5nRXJyb3IoYWdlbnRzRXh0cmFQYXRoKTtcblxuICAgIGZvciAoY29uc3QgW2ZpbGVOYW1lLCB0b29sTmFtZV0gb2YgW1xuICAgICAgWydBR0VOVFMubWQnLCAnQ29kZXggQ0xJJ10sXG4gICAgICBbJ0NMQVVERS5tZCcsICdDbGF1ZGUgQ29kZSddLFxuICAgICAgWydHRU1JTkkubWQnLCAnR2VtaW5pIENMSSddLFxuICAgIF0gYXMgY29uc3QpIHtcbiAgICAgIGNvbnN0IGNvbnRlbnQgPSBnZW5lcmF0ZUFnZW50SW5zdHJ1Y3Rpb24ocm9vdENvbmZpZywgYWxsQ29uZmlncywgdG9vbE5hbWUsIGV4dHJhQ29udGVudCk7XG4gICAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShyb290Q29uZmlnLmRpclBhdGgsIGZpbGVOYW1lKTtcbiAgICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiBmc1V0aWwuZ2VuZXJhdGVGaWxlKGZpbGVQYXRoLCBjb250ZW50KSk7XG4gICAgfVxuXG4gICAgY29uc3QgY3Vyc29yUnVsZXNQYXRoID0gcGF0aC5yZXNvbHZlKHJvb3RDb25maWcuZGlyUGF0aCwgJy5jdXJzb3IvcnVsZXMvZ2VuZXJhbC5tZGMnKTtcbiAgICBjb25zdCBjdXJzb3JSdWxlc0NvbnRlbnQgPSBnZW5lcmF0ZUN1cnNvckdlbmVyYWxNZGNDb250ZW50KHJvb3RDb25maWcsIGFsbENvbmZpZ3MsIGV4dHJhQ29udGVudCk7XG4gICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzVXRpbC5nZW5lcmF0ZUZpbGUoY3Vyc29yUnVsZXNQYXRoLCBjdXJzb3JSdWxlc0NvbnRlbnQpKTtcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIGdlbmVyYXRlQ3Vyc29yR2VuZXJhbE1kY0NvbnRlbnQoXG4gIGNvbmZpZzogUGFja2FnZUNvbmZpZyxcbiAgYWxsQ29uZmlnczogUGFja2FnZUNvbmZpZ1tdLFxuICBleHRyYUNvbnRlbnQ/OiBzdHJpbmdcbik6IHN0cmluZyB7XG4gIGNvbnN0IGZyb250bWF0dGVyID0gYC0tLVxcbmRlc2NyaXB0aW9uOiBHZW5lcmFsIENvZGluZyBSdWxlc1xcbmdsb2JzOlxcbmFsd2F5c0FwcGx5OiB0cnVlXFxuLS0tYDtcbiAgY29uc3QgYm9keSA9IGdlbmVyYXRlQWdlbnRJbnN0cnVjdGlvbihjb25maWcsIGFsbENvbmZpZ3MsICdDdXJzb3InLCBleHRyYUNvbnRlbnQpO1xuICByZXR1cm4gYCR7ZnJvbnRtYXR0ZXJ9XFxuXFxuJHtib2R5fWA7XG59XG5cbmZ1bmN0aW9uIGdlbmVyYXRlQWdlbnRJbnN0cnVjdGlvbihcbiAgcm9vdENvbmZpZzogUGFja2FnZUNvbmZpZyxcbiAgYWxsQ29uZmlnczogUGFja2FnZUNvbmZpZ1tdLFxuICB0b29sTmFtZTogc3RyaW5nLFxuICBleHRyYUNvbnRlbnQ/OiBzdHJpbmdcbik6IHN0cmluZyB7XG4gIGNvbnN0IHBhY2thZ2VNYW5hZ2VyID0gcm9vdENvbmZpZy5pc0J1biA/ICdidW4nIDogJ3lhcm4nO1xuICBjb25zdCBiYXNlQ29udGVudCA9IGBcbiMjIFByb2plY3QgSW5mb3JtYXRpb25cblxuLSBOYW1lOiBcXGAke3Jvb3RDb25maWcucGFja2FnZUpzb24/Lm5hbWUgfHwgJ3Vua25vd24nfVxcYFxuLSBEZXNjcmlwdGlvbjogJHtyb290Q29uZmlnLnBhY2thZ2VKc29uPy5kZXNjcmlwdGlvbn1cbi0gUGFja2FnZSBNYW5hZ2VyOiAke3BhY2thZ2VNYW5hZ2VyfVxuXG4jIyBHZW5lcmFsIEluc3RydWN0aW9uc1xuXG4tIENyZWF0ZSBhIG5ldyBicmFuY2ggaWYgdGhlIGN1cnJlbnQgYnJhbmNoIGlzIFxcYG1haW5cXGAuXG4tIFJ1biBhbnkgXFxgZ2l0XFxgIGNvbW1hbmRzIHNlcXVlbnRpYWxseS5cbi0gV3JpdGUgdGVzdHMgT05MWSBpZiBleHBsaWNpdGx5IHJlcXVlc3RlZC4gSWYgcmVxdWVzdGVkLCBmb2xsb3cgdGhlc2UgcnVsZXM6XG4gIC0gQ29udGludWUgbW9kaWZ5aW5nIHRoZSB0ZXN0cyBhbmQgY29kZSB1bnRpbCBhbGwgdGVzdHMgcGFzcy5cbiAgLSBFbnN1cmUgdGVzdHMgcmVzZXQgYW55IHJlbGF0ZWQgcGVyc2lzdGVudCBkYXRhLCBhcyBvdXIgdGVzdCBpbmZyYXN0cnVjdHVyZSBkb2VzIG5vdCBjbGVhciBpdCBhdXRvbWF0aWNhbGx5LlxuICAtIFByZWZlciBhY3R1YWwgQVBJIGNhbGxzIG92ZXIgbW9ja3MuIFVzZSBtb2NrcyB3aGVuIGFjdHVhbCBjYWxscyBhcmUgaW1wcmFjdGljYWwsIGhhdmUgdW5pbnRlbmRlZCBzaWRlIGVmZmVjdHMsIG9yIGFyZSBleHBsaWNpdGx5IHJlcXVlc3RlZC5cbi0gQmVmb3JlIGZpeGluZyBpc3N1ZXMsIGFsd2F5cyBpbnZlc3RpZ2F0ZSB0aGUgcm9vdCBjYXVzZSBmaXJzdCAoZS5nLiwgYnkgZ2F0aGVyaW5nIGRlYnVnIGxvZ3MsIHRha2luZyBzY3JlZW5zaG90cywgZXRjLikuXG4tIEFmdGVyIG1ha2luZyBjb2RlIGNoYW5nZXMsIHJ1biBcXGAke3BhY2thZ2VNYW5hZ2VyfSBjaGVjay1hbGwtZm9yLWFpXFxgIHRvIGV4ZWN1dGUgYWxsIHRlc3RzICh0YWtlcyB1cCB0byAxIGhvdXIpIG9yIFxcYCR7cGFja2FnZU1hbmFnZXJ9IGNoZWNrLWZvci1haVxcYCBmb3IgdHlwZSBjaGVja2luZyBhbmQgbGludGluZyBvbmx5ICh0YWtlcyB1cCB0byAxMCBtaW51dGVzKS5cbiAgLSBJZiB5b3UgYXJlIGNvbmZpZGVudCB5b3VyIGNoYW5nZXMgd2lsbCBub3QgYnJlYWsgYW55IHRlc3RzLCB5b3UgbWF5IHVzZSBcXGBjaGVjay1mb3ItYWlcXGAuXG4tIE9uY2UgeW91IGhhdmUgdmVyaWZpZWQgeW91ciBjaGFuZ2VzLCBjb21taXQgYW5kIHB1c2ggdGhlbSB0byB0aGUgY3VycmVudCAobm9uLW1haW4pIGJyYW5jaCB0aGVuIGNyZWF0ZSBhIFBSIHZpYSBcXGBnaFxcYC5cbiAgLSBGb2xsb3cgdGhlIGNvbnZlbnRpb25hbCBjb21taXRzOyB5b3VyIGNvbW1pdCBtZXNzYWdlIHNob3VsZCBzdGFydCB3aXRoIFxcYGZlYXQ6XFxgLCBcXGBmaXg6XFxgLCBldGMuXG4gIC0gSWYgbm90IHNwZWNpZmllZCwgbWFrZSBzdXJlIHRvIGFkZCBhIG5ldyBsaW5lIGF0IHRoZSBlbmQgb2YgeW91ciBjb21taXQgbWVzc2FnZSR7cm9vdENvbmZpZy5pc1dpbGxCb29zdGVyUmVwbyA/IGAgd2l0aDogXFxgQ28tYXV0aG9yZWQtYnk6IFdpbGxCb29zdGVyICgke3Rvb2xOYW1lfSkgPGFnZW50QHdpbGxib29zdGVyLmNvbT5cXGBgIDogJyd9LlxuICAtIEFsd2F5cyBjcmVhdGUgbmV3IGNvbW1pdHMuIEF2b2lkIHVzaW5nIFxcYC0tYW1lbmRcXGAuXG4ke1xuICBhbGxDb25maWdzLnNvbWUoKGMpID0+IGMuaGFzU3RhcnRUZXN0U2VydmVyKVxuICAgID8gYC0gVXNlIFxcYCR7cGFja2FnZU1hbmFnZXJ9IHJ1biBzdGFydC10ZXN0LXNlcnZlclxcYCB0byBsYXVuY2ggYSB3ZWIgc2VydmVyIGZvciBkZWJ1Z2dpbmcgb3IgdGVzdGluZy5gXG4gICAgOiAnJ1xufVxuXG4ke2dlbmVyYXRlQWdlbnRDb2RpbmdTdHlsZShhbGxDb25maWdzKX1cbmBcbiAgICAucmVwbGFjZUFsbCgvXFwuXFxuXFxuKy0vZywgJy5cXG4tJylcbiAgICAucmVwbGFjZUFsbCgvXFxuezMsfS9nLCAnXFxuXFxuJylcbiAgICAudHJpbSgpO1xuXG4gIGNvbnN0IGhhc05ld1NlY3Rpb24gPSBleHRyYUNvbnRlbnQ/LnRyaW0oKS5zdGFydHNXaXRoKCcjJyk7XG4gIGNvbnN0IG5vcm1hbGl6ZWRFeHRyYUNvbnRlbnQgPSBleHRyYUNvbnRlbnRcbiAgICA/IGhhc05ld1NlY3Rpb25cbiAgICAgID8gJ1xcblxcbicgKyBleHRyYUNvbnRlbnQudHJpbSgpXG4gICAgICA6ICdcXG4nICsgZXh0cmFDb250ZW50XG4gICAgOiAnJztcbiAgcmV0dXJuIGJhc2VDb250ZW50ICsgbm9ybWFsaXplZEV4dHJhQ29udGVudDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdlbmVyYXRlQWdlbnRDb2RpbmdTdHlsZShhbGxDb25maWdzOiBQYWNrYWdlQ29uZmlnW10pOiBzdHJpbmcge1xuICAvLyBLZWVwIHRvcC1kb3duIG9yZGVyaW5nIGd1aWRhbmNlIGZ1bmN0aW9uLW9ubHkgYmVjYXVzZSBjbGFzc2VzIGFyZSBub3QgaG9pc3RlZCBhbmQgY2FuIGZhaWwgd2hlbiBpbmhlcml0YW5jZSBvciB0b3AtbGV2ZWwgaW5zdGFudGlhdGlvbiBkZXBlbmRzIG9uIGRlY2xhcmF0aW9uIG9yZGVyLlxuICByZXR1cm4gYFxuIyMgQ29kaW5nIFN0eWxlXG5cbi0gVXNlIGNhbWVsQ2FzZSBmb3IgSmF2YVNjcmlwdCBhbmQgVHlwZVNjcmlwdCBmaWxlcyAob3IgUGFzY2FsQ2FzZSBmb3IgUmVhY3QgY29tcG9uZW50cykuXG4tIFNpbXBsaWZ5IGNvZGUgYXMgbXVjaCBhcyBwb3NzaWJsZSB0byBlbGltaW5hdGUgcmVkdW5kYW5jeS5cbi0gRGVzaWduIGVhY2ggbW9kdWxlIHdpdGggaGlnaCBjb2hlc2lvbiwgZ3JvdXBpbmcgcmVsYXRlZCBmdW5jdGlvbmFsaXR5IHRvZ2V0aGVyLlxuICAtIFJlZmFjdG9yIGV4aXN0aW5nIGxhcmdlIG1vZHVsZXMgaW50byBzbWFsbGVyLCBmb2N1c2VkIG1vZHVsZXMgd2hlbiBuZWNlc3NhcnkuXG4gIC0gQ3JlYXRlIHdlbGwtb3JnYW5pemVkIGRpcmVjdG9yeSBzdHJ1Y3R1cmVzIHdpdGggbG93IGNvdXBsaW5nIGFuZCBoaWdoIGNvaGVzaW9uLlxuLSBQbGFjZSBjYWxsaW5nIGZ1bmN0aW9ucyBpbiB0aGUgZmlsZSBhYm92ZSB0aGUgZnVuY3Rpb25zIHRoZXkgY2FsbCB0byBtYWludGFpbiBhIGNsZWFyIHRvcC1kb3duIG9yZGVyLlxuICAtIGUuZy4gXFxgZnVuY3Rpb24gY2FsbGVyKCkgeyBjYWxsZWUoKTsgfSBmdW5jdGlvbiBjYWxsZWUoKSB7IC4uLiB9XFxgXG4tIFdyaXRlIGNvbW1lbnRzIHRoYXQgZXhwbGFpbiBcIndoeVwiIHJhdGhlciB0aGFuIFwid2hhdFwiLiBBdm9pZCBzdGF0aW5nIHdoYXQgY2FuIGJlIHVuZGVyc3Rvb2QgZnJvbSB0aGUgY29kZSBpdHNlbGYuXG4tIFByZWZlciBcXGB1bmRlZmluZWRcXGAgb3ZlciBcXGBudWxsXFxgIHVubGVzcyBleHBsaWNpdGx5IHJlcXVpcmVkIGJ5IEFQSXMgb3IgbGlicmFyaWVzLlxuLSBQcmVmZXIgdXNpbmcgYSBzaW5nbGUgdGVtcGxhdGUgbGl0ZXJhbCBmb3IgcHJvbXB0cyBpbnN0ZWFkIG9mIFxcYGpvaW4oKVxcYCB3aXRoIGFuIGFycmF5IG9mIHN0cmluZ3MuXG4ke1xuICBhbGxDb25maWdzLnNvbWUoKGMpID0+IGMuZGVwZW5kaW5nLmdlbkkxOG5UcylcbiAgICA/IGAtIFdoZW4gaW50cm9kdWNpbmcgbmV3IHN0cmluZyBsaXRlcmFscyBpbiBSZWFjdCBjb21wb25lbnRzLCB1cGRhdGUgdGhlIGxhbmd1YWdlIHJlc291cmNlIGZpbGVzIGluIHRoZSBcXGBpMThuXFxgIGRpcmVjdG9yeSAoZS5nLiwgXFxgaTE4bi9qYS1KUC5qc29uXFxgKS4gUmVmZXJlbmNlIHRoZXNlIHN0cmluZ3MgdXNpbmcgdGhlIFxcYGkxOG5cXGAgdXRpbGl0eS4gRm9yIGV4YW1wbGUsIHVzZSBcXGBpMThuLnBhZ2VzLmhvbWUudGl0bGUoKVxcYCBmb3IgXFxgeyBcInBhZ2VzXCI6IHsgXCJob21lXCI6IHsgXCJ0aXRsZVwiOiBcIk15IEFwcFwiIH0gfSB9XFxgLmBcbiAgICA6ICcnXG59XG4ke1xuICBhbGxDb25maWdzLnNvbWUoKGMpID0+IGMuZGVwZW5kaW5nLnJlYWN0IHx8IGMuZGVwZW5kaW5nLm5leHQpXG4gICAgPyBgLSBQcmVmZXIgXFxgdXNlSW1tZXJcXGAgZm9yIHN0b3JpbmcgYW4gYXJyYXkgb3IgYW4gb2JqZWN0IHRvIFxcYHVzZVN0YXRlXFxgLmBcbiAgICA6ICcnXG59XG4ke1xuICBhbGxDb25maWdzLnNvbWUoKGMpID0+IGMuZGVwZW5kaW5nLm5leHQpXG4gICAgPyBgXG4tIFNpbmNlIHRoaXMgcHJvamVjdCB1c2VzIHRoZSBSZWFjdCBDb21waWxlciwgeW91IGRvIG5vdCBuZWVkIHRvIHVzZSBcXGB1c2VDYWxsYmFja1xcYCBvciBcXGB1c2VNZW1vXFxgIGZvciBwZXJmb3JtYW5jZSBvcHRpbWl6YXRpb24uXG4tIEFzc3VtZSB0aGVyZSBpcyBvbmx5IGEgc2luZ2xlIHNlcnZlciBpbnN0YW5jZS5cbmBcbiAgICA6ICcnXG59XG5gXG4gICAgLnJlcGxhY2VBbGwoL1xcLlxcblxcbistL2csICcuXFxuLScpXG4gICAgLnJlcGxhY2VBbGwoL1xcbnszLH0vZywgJ1xcblxcbicpXG4gICAgLnRyaW0oKTtcbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCBtZXJnZSBmcm9tICdkZWVwbWVyZ2UnO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBmc1V0aWwgfSBmcm9tICcuLi91dGlscy9mc1V0aWwuanMnO1xuaW1wb3J0IHsgb3ZlcndyaXRlTWVyZ2UgfSBmcm9tICcuLi91dGlscy9tZXJnZVV0aWwuanMnO1xuaW1wb3J0IHsgcHJvbWlzZVBvb2wgfSBmcm9tICcuLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZW5lcmF0ZUJpb21lSnNvbmMoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZ2VuZXJhdGVCaW9tZUpzb25jJywgYXN5bmMgKCkgPT4ge1xuICAgIGxldCBuZXdTZXR0aW5nczogb2JqZWN0ID0ge1xuICAgICAgcm9vdDogY29uZmlnLmlzUm9vdCxcbiAgICAgICRzY2hlbWE6ICcuL25vZGVfbW9kdWxlcy9AYmlvbWVqcy9iaW9tZS9jb25maWd1cmF0aW9uX3NjaGVtYS5qc29uJyxcbiAgICAgIGV4dGVuZHM6IFsnQHdpbGxib29zdGVyL2Jpb21lLWNvbmZpZyddLFxuICAgIH07XG4gICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICdiaW9tZS5qc29uYycpO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBvbGRDb250ZW50ID0gYXdhaXQgZnMucHJvbWlzZXMucmVhZEZpbGUoZmlsZVBhdGgsICd1dGY4Jyk7XG4gICAgICBjb25zdCBvbGRTZXR0aW5ncyA9IEpTT04ucGFyc2Uob2xkQ29udGVudCkgYXMgb2JqZWN0O1xuICAgICAgbmV3U2V0dGluZ3MgPSBtZXJnZS5hbGwoW25ld1NldHRpbmdzLCBvbGRTZXR0aW5ncywgbmV3U2V0dGluZ3NdLCB7IGFycmF5TWVyZ2U6IG92ZXJ3cml0ZU1lcmdlIH0pO1xuICAgIH0gY2F0Y2gge1xuICAgICAgLy8gZG8gbm90aGluZ1xuICAgIH1cbiAgICBjb25zdCBuZXdDb250ZW50ID0gSlNPTi5zdHJpbmdpZnkobmV3U2V0dGluZ3MsIHVuZGVmaW5lZCwgMik7XG4gICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzVXRpbC5nZW5lcmF0ZUZpbGUoZmlsZVBhdGgsIG5ld0NvbnRlbnQpKTtcbiAgfSk7XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgeyBwYXJzZSB9IGZyb20gJ3Ntb2wtdG9tbCc7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGZzVXRpbCB9IGZyb20gJy4uL3V0aWxzL2ZzVXRpbC5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcblxuaW50ZXJmYWNlIEJ1bmZpZ1RvbWwge1xuICBpbnN0YWxsPzoge1xuICAgIGV4YWN0PzogYm9vbGVhbjtcbiAgfTtcbiAgcnVuPzoge1xuICAgIGJ1bj86IGJvb2xlYW47XG4gIH07XG59XG5cbmNvbnN0IG1pbmltdW1SZWxlYXNlQWdlRXhjbHVkZXMgPSBbXG4gICdAZXhlcmNvZGUvcHJvYmxlbS11dGlscycsXG4gICdAbmV4dC9lbnYnLFxuICAnQG5leHQvZXNsaW50LXBsdWdpbi1uZXh0JyxcbiAgJ0BuZXh0L2ZvbnQnLFxuICAnQG5leHQvcnNwYWNrLWJpbmRpbmctbGludXgtYXJtNjQtZ251JyxcbiAgJ0BuZXh0L3JzcGFjay1iaW5kaW5nLWxpbnV4LWFybTY0LW11c2wnLFxuICAnQG5leHQvcnNwYWNrLWJpbmRpbmctbGludXgteDY0LWdudScsXG4gICdAbmV4dC9yc3BhY2stYmluZGluZy1saW51eC14NjQtbXVzbCcsXG4gICdAbmV4dC9zd2MtYW5kcm9pZC1hcm0tZWFiaScsXG4gICdAbmV4dC9zd2MtYW5kcm9pZC1hcm02NCcsXG4gICdAbmV4dC9zd2MtZGFyd2luLWFybTY0JyxcbiAgJ0BuZXh0L3N3Yy1kYXJ3aW4teDY0JyxcbiAgJ0BuZXh0L3N3Yy1mcmVlYnNkLXg2NCcsXG4gICdAbmV4dC9zd2MtbGludXgtYXJtLWdudWVhYmloZicsXG4gICdAbmV4dC9zd2MtbGludXgtYXJtNjQtZ251JyxcbiAgJ0BuZXh0L3N3Yy1saW51eC1hcm02NC1tdXNsJyxcbiAgJ0BuZXh0L3N3Yy1saW51eC14NjQtZ251JyxcbiAgJ0BuZXh0L3N3Yy1saW51eC14NjQtbXVzbCcsXG4gICdAbmV4dC9zd2Mtd2FzbS1ub2RlanMnLFxuICAnQG5leHQvc3djLXdhc20td2ViJyxcbiAgJ0BuZXh0L3RoaXJkLXBhcnRpZXMnLFxuICAnQHdpbGxib29zdGVyL2FnZW50LXNraWxscycsXG4gICdAd2lsbGJvb3N0ZXIvYmFiZWwtY29uZmlncycsXG4gICdAd2lsbGJvb3N0ZXIvYmlvbWUtY29uZmlnJyxcbiAgJ0B3aWxsYm9vc3Rlci9lc2xpbnQtY29uZmlnLWJsaXR6LW5leHQnLFxuICAnQHdpbGxib29zdGVyL2VzbGludC1jb25maWctanMnLFxuICAnQHdpbGxib29zdGVyL2VzbGludC1jb25maWctanMtcmVhY3QnLFxuICAnQHdpbGxib29zdGVyL2VzbGludC1jb25maWctbmV4dCcsXG4gICdAd2lsbGJvb3N0ZXIvZXNsaW50LWNvbmZpZy10cycsXG4gICdAd2lsbGJvb3N0ZXIvZXNsaW50LWNvbmZpZy10cy1yZWFjdCcsXG4gICdAd2lsbGJvb3N0ZXIvb3hmbXQtY29uZmlnJyxcbiAgJ0B3aWxsYm9vc3Rlci9veGxpbnQtY29uZmlnJyxcbiAgJ0B3aWxsYm9vc3Rlci9wcmV0dGllci1jb25maWcnLFxuICAnQHdpbGxib29zdGVyL3Jlbm92YXRlLWNvbmZpZycsXG4gICdAd2lsbGJvb3N0ZXIvc2hhcmVkLWxpYicsXG4gICdAd2lsbGJvb3N0ZXIvc2hhcmVkLWxpYi1ibGl0ei1uZXh0JyxcbiAgJ0B3aWxsYm9vc3Rlci9zaGFyZWQtbGliLW5leHQnLFxuICAnQHdpbGxib29zdGVyL3NoYXJlZC1saWItbm9kZScsXG4gICdAd2lsbGJvb3N0ZXIvc2hhcmVkLWxpYi1yZWFjdCcsXG4gICdAd2lsbGJvb3N0ZXIvd2InLFxuICAnYWdlbnQtcnVudGltZS1raXQnLFxuICAnbmV4dCcsXG4gICdyZWFjdCcsXG4gICdyZWFjdC1kb20nLFxuXTtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlQnVuZmlnVG9tbChjb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdnZW5lcmF0ZUJ1bmZpZ1RvbWwnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICdidW5maWcudG9tbCcpO1xuICAgIGNvbnN0IGV4aXN0aW5nQ29udGVudCA9IGZzLmV4aXN0c1N5bmMoZmlsZVBhdGgpID8gZnMucmVhZEZpbGVTeW5jKGZpbGVQYXRoLCAndXRmOCcpIDogdW5kZWZpbmVkO1xuICAgIGNvbnN0IGNvbnRlbnQgPSBuZXdDb250ZW50KGV4aXN0aW5nQ29udGVudCk7XG4gICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzVXRpbC5nZW5lcmF0ZUZpbGUoZmlsZVBhdGgsIGNvbnRlbnQpKTtcbiAgfSk7XG59XG5cbmNvbnN0IG5ld0NvbnRlbnQgPSAoZXhpc3RpbmdDb250ZW50OiBzdHJpbmcgfCB1bmRlZmluZWQpOiBzdHJpbmcgPT4ge1xuICBjb25zdCBidW5maWdUb21sID0gcGFyc2VCdW5maWdUb21sKGV4aXN0aW5nQ29udGVudCk7XG4gIHJldHVybiBgZW52ID0gZmFsc2VcbnRlbGVtZXRyeSA9IGZhbHNlXG5cbiR7Z2VuZXJhdGVSdW5TZWN0aW9uKGJ1bmZpZ1RvbWwpfVxuW2luc3RhbGxdXG5leGFjdCA9ICR7YnVuZmlnVG9tbD8uaW5zdGFsbD8uZXhhY3QgPT09IGZhbHNlID8gJ2ZhbHNlJyA6ICd0cnVlJ31cbmxpbmtlciA9IFwiaG9pc3RlZFwiXG5taW5pbXVtUmVsZWFzZUFnZSA9IDQzMjAwMCAjIDUgZGF5c1xubWluaW11bVJlbGVhc2VBZ2VFeGNsdWRlcyA9IFtcbiR7bWluaW11bVJlbGVhc2VBZ2VFeGNsdWRlcy5tYXAoKHBhY2thZ2VOYW1lKSA9PiBgICAgIFwiJHtwYWNrYWdlTmFtZX1cIixgKS5qb2luKCdcXG4nKX1cbl1cbmA7XG59O1xuXG5mdW5jdGlvbiBwYXJzZUJ1bmZpZ1RvbWwoY29udGVudDogc3RyaW5nIHwgdW5kZWZpbmVkKTogQnVuZmlnVG9tbCB8IHVuZGVmaW5lZCB7XG4gIGlmICghY29udGVudCkge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cbiAgdHJ5IHtcbiAgICByZXR1cm4gcGFyc2UoY29udGVudCkgYXMgQnVuZmlnVG9tbDtcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxufVxuXG5mdW5jdGlvbiBnZW5lcmF0ZVJ1blNlY3Rpb24oYnVuZmlnVG9tbDogQnVuZmlnVG9tbCB8IHVuZGVmaW5lZCk6IHN0cmluZyB7XG4gIHJldHVybiB0eXBlb2YgYnVuZmlnVG9tbD8ucnVuPy5idW4gPT09ICdib29sZWFuJyA/IGBbcnVuXVxcbmJ1biA9ICR7YnVuZmlnVG9tbC5ydW4uYnVufVxcbmAgOiAnJztcbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcblxuY29uc3QgdXNlckNvbnRlbnRIZWFkZXIgPSAnIyBQcm9qZWN0LXNwZWNpZmljIHNldHRpbmdzJztcbmNvbnN0IHVzZXJDb250ZW50SGVhZGVyUmVnZXggPSAvIyBQcm9qZWN0LXNwZWNpZmljIHNldHRpbmdzW15cXG5dKlxcbi9nbTtcbmNvbnN0IHNlcGFyYXRvciA9ICcjIEdlbmVyYXRlZCBieSB3YmZ5JztcbmNvbnN0IHNlcGFyYXRvclByZWZpeCA9ICcjIEdlbmVyYXRlZCBieSAnO1xuY29uc3QgZGVmYXVsdEhlYWRVc2VyQ29udGVudCA9IGAke3VzZXJDb250ZW50SGVhZGVyfSAoaGVhZClcblxuXG4ke3NlcGFyYXRvcn1cbmA7XG5jb25zdCBkZWZhdWx0VGFpbFVzZXJDb250ZW50ID0gYFxuJHt1c2VyQ29udGVudEhlYWRlcn0gKHRhaWwpXG5gO1xuXG5leHBvcnQgY29uc3QgaWdub3JlRmlsZVV0aWwgPSB7XG4gIHNlcGFyYXRvcixcbiAgc2VwYXJhdG9yUHJlZml4LFxuICBkZWZhdWx0SGVhZFVzZXJDb250ZW50LFxuICBkZWZhdWx0VGFpbFVzZXJDb250ZW50LFxuICBhc3luYyByZWFkR2l0aWdub3JlV2l0aG91dFNlcGFyYXRvcnMoZmlsZVBhdGg6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nIHwgdW5kZWZpbmVkPiB7XG4gICAgdHJ5IHtcbiAgICAgIGxldCBjb250ZW50ID0gYXdhaXQgZnMucHJvbWlzZXMucmVhZEZpbGUoZmlsZVBhdGgsICd1dGY4Jyk7XG4gICAgICBjb25zdCBsYXN0SGVhZGVySW5kZXggPSBnZXRJbmRleE9mVGFpbFVzZXJDb250ZW50SGVhZGVyKGNvbnRlbnQpO1xuICAgICAgaWYgKGxhc3RIZWFkZXJJbmRleCA+IDApIHtcbiAgICAgICAgY29udGVudCA9IGNvbnRlbnQuc2xpY2UoMCwgbGFzdEhlYWRlckluZGV4IC0gMSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gKFxuICAgICAgICBjb250ZW50XG4gICAgICAgICAgLnJlcGxhY2VBbGwodXNlckNvbnRlbnRIZWFkZXJSZWdleCwgJycpXG4gICAgICAgICAgLnJlcGxhY2VBbGwoLyMgR2VuZXJhdGVkIGJ5IFteXFxuXSpcXG4vZ20sICcnKVxuICAgICAgICAgIC5yZXBsYWNlQWxsKC9cXHI/XFxuXFxyP1xcbihcXHI/XFxuKSsvZ20sICdcXG5cXG4nKVxuICAgICAgICAgIC50cmltKCkgKyAnXFxuJ1xuICAgICAgKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIGRvIG5vdGhpbmdcbiAgICB9XG4gIH0sXG4gIGdldEhlYWRVc2VyQ29udGVudChjb250ZW50OiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGNvbnN0IGluZGV4ID0gY29udGVudC5pbmRleE9mKHRoaXMuc2VwYXJhdG9yUHJlZml4KTtcbiAgICBpZiAoaW5kZXggIT09IC0xKSB7XG4gICAgICByZXR1cm4gY29udGVudFxuICAgICAgICAuc2xpY2UoMCwgY29udGVudC5pbmRleE9mKCdcXG4nLCBpbmRleCkgKyAxKVxuICAgICAgICAucmVwbGFjZUFsbCh1c2VyQ29udGVudEhlYWRlclJlZ2V4LCBgJHt1c2VyQ29udGVudEhlYWRlcn0gKGhlYWQpXFxuYCk7XG4gICAgfVxuICAgIHJldHVybiBkZWZhdWx0SGVhZFVzZXJDb250ZW50O1xuICB9LFxuICBnZXRUYWlsVXNlckNvbnRlbnQoY29udGVudDogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBjb25zdCBsYXN0SGVhZGVySW5kZXggPSBnZXRJbmRleE9mVGFpbFVzZXJDb250ZW50SGVhZGVyKGNvbnRlbnQpO1xuICAgIGlmIChsYXN0SGVhZGVySW5kZXggPiAwKSB7XG4gICAgICByZXR1cm4gY29udGVudC5zbGljZShsYXN0SGVhZGVySW5kZXggLSAxKTtcbiAgICB9XG4gICAgcmV0dXJuIGRlZmF1bHRUYWlsVXNlckNvbnRlbnQ7XG4gIH0sXG4gIGFzeW5jIGlzQmVycnlaZXJvSW5zdGFsbEVuYWJsZWQoZmlsZVBhdGg6IHN0cmluZyk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBjb250ZW50ID0gYXdhaXQgZnMucHJvbWlzZXMucmVhZEZpbGUoZmlsZVBhdGgsICd1dGY4Jyk7XG4gICAgICByZXR1cm4gY29udGVudC5pbmNsdWRlcygnXFxuIS55YXJuL2NhY2hlJyk7XG4gICAgfSBjYXRjaCB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9LFxufTtcblxuZnVuY3Rpb24gZ2V0SW5kZXhPZlRhaWxVc2VyQ29udGVudEhlYWRlcihjb250ZW50OiBzdHJpbmcpOiBudW1iZXIge1xuICBjb25zdCBpbmRleCA9IGNvbnRlbnQuaW5kZXhPZih1c2VyQ29udGVudEhlYWRlcik7XG4gIGNvbnN0IGxhc3RJbmRleCA9IGNvbnRlbnQubGFzdEluZGV4T2YodXNlckNvbnRlbnRIZWFkZXIpO1xuICByZXR1cm4gbGFzdEluZGV4ID4gaW5kZXggPyBsYXN0SW5kZXggOiAtMTtcbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGZzVXRpbCB9IGZyb20gJy4uL3V0aWxzL2ZzVXRpbC5qcyc7XG5pbXBvcnQgeyBpZ25vcmVGaWxlVXRpbCB9IGZyb20gJy4uL3V0aWxzL2lnbm9yZUZpbGVVdGlsLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuXG4vLyBFeGVyY29kZeOBp+OBr25vZGVfbW9kdWxlc+OCkkNPUFnjgZnjgovlv4XopoHjgYzjgYLjgovjgZ/jgoHjgIFub2RlX21vZHVsZXPjgpLpmaTlpJbjgZfjgabjga/jgYTjgZHjgarjgYTjgIJcbmNvbnN0IGNvbW1vbkNvbnRlbnQgPSBgXG4qKi8uaWRlYVxuKiovKi5zcWxpdGUzKlxuKiovLnlhcm4vaW5zdGFsbC1zdGF0ZS5nelxuKiovLnZlbnZcbmA7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZW5lcmF0ZURvY2tlcmlnbm9yZShjb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdnZW5lcmF0ZURvY2tlcmlnbm9yZScsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJy5kb2NrZXJpZ25vcmUnKTtcbiAgICBpZiAoY29uZmlnLmRvZXNDb250YWluRG9ja2VyZmlsZSkge1xuICAgICAgY29uc3QgY29udGVudCA9IChhd2FpdCBmc1V0aWwucmVhZEZpbGVJZ25vcmluZ0Vycm9yKGZpbGVQYXRoKSkgPz8gJyc7XG4gICAgICBjb25zdCBoZWFkVXNlckNvbnRlbnQgPSBpZ25vcmVGaWxlVXRpbC5nZXRIZWFkVXNlckNvbnRlbnQoY29udGVudCk7XG4gICAgICBjb25zdCB0YWlsVXNlckNvbnRlbnQgPSBpZ25vcmVGaWxlVXRpbC5nZXRUYWlsVXNlckNvbnRlbnQoY29udGVudCk7XG5cbiAgICAgIGNvbnN0IG5ld0NvbnRlbnQgPSBoZWFkVXNlckNvbnRlbnQgKyBjb21tb25Db250ZW50ICsgdGFpbFVzZXJDb250ZW50O1xuICAgICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzVXRpbC5nZW5lcmF0ZUZpbGUoZmlsZVBhdGgsIG5ld0NvbnRlbnQpKTtcbiAgICB9IGVsc2Uge1xuICAgICAgYXdhaXQgZnMucHJvbWlzZXMucm0oZmlsZVBhdGgsIHsgZm9yY2U6IHRydWUgfSk7XG4gICAgfVxuICB9KTtcbn1cbiIsImV4cG9ydCBjb25zdCBleHRlbnNpb25zID0ge1xuICBjb2RlV2l0aDJJbmRlbnRTaXplOiBbXG4gICAgJ2NqcycsXG4gICAgJ21qcycsXG4gICAgJ2pzJyxcbiAgICAnanN4JyxcbiAgICAnY3RzJyxcbiAgICAnbXRzJyxcbiAgICAndHMnLFxuICAgICd0c3gnLFxuICAgICdqc29uJyxcbiAgICAnanNvbjUnLFxuICAgICdqc29uYycsXG4gICAgJ2NwcCcsXG4gICAgJ2RhcnQnLFxuICAgICdodG0nLFxuICAgICdodG1sJyxcbiAgICAncHUnLFxuICAgICdwdW1sJyxcbiAgICAncmInLFxuICAgICd2dWUnLFxuICAgICd4bWwnLFxuICAgICd5YW1sJyxcbiAgICAneW1sJyxcbiAgICAnc2gnLFxuICBdLnRvU29ydGVkKCksXG4gIGNvZGVXaXRoNEluZGVudFNpemU6IFsnZ28nLCAnZ3JhZGxlJywgJ2phdmEnLCAncHknXS50b1NvcnRlZCgpLFxuICBtYXJrZG93bkxpa2U6IFsnbWQnXS50b1NvcnRlZCgpLFxuICBlc2xpbnQ6IFsnY2pzJywgJ21qcycsICdqcycsICdjdHMnLCAnbXRzJywgJ3RzJywgJ3RzeCcsICdqc3gnXS50b1NvcnRlZCgpLFxuICBwcmV0dGllcjogW1xuICAgICdjanMnLFxuICAgICdtanMnLFxuICAgICdqYXZhJyxcbiAgICAnanMnLFxuICAgICdqc3gnLFxuICAgICdjdHMnLFxuICAgICdtdHMnLFxuICAgICd0cycsXG4gICAgJ3RzeCcsXG4gICAgJ2pzb24nLFxuICAgICdqc29uNScsXG4gICAgJ2pzb25jJyxcbiAgICAnY3NzJyxcbiAgICAnaHRtJyxcbiAgICAnaHRtbCcsXG4gICAgJ21kJyxcbiAgICAnc2NzcycsXG4gICAgJ3Z1ZScsXG4gICAgJ3lhbWwnLFxuICAgICd5bWwnLFxuICBdLnRvU29ydGVkKCksXG4gIC8vIGNmLiBodHRwczovL2Jpb21lanMuZGV2L2ludGVybmFscy9sYW5ndWFnZS1zdXBwb3J0L1xuICBiaW9tZTogW1xuICAgICdjanMnLFxuICAgICdtanMnLFxuICAgICdqcycsXG4gICAgJ2pzeCcsXG4gICAgJ2N0cycsXG4gICAgJ210cycsXG4gICAgJ3RzJyxcbiAgICAndHN4JyxcbiAgICAnanNvbicsXG4gICAgJ2pzb241JyxcbiAgICAnanNvbmMnLFxuICAgICdodG0nLFxuICAgICdodG1sJyxcbiAgICAndnVlJyxcbiAgICAnc3ZlbHRlJyxcbiAgICAnYXN0cm8nLFxuICAgICdjc3MnLFxuICAgICd5YW1sJyxcbiAgICAneW1sJyxcbiAgICAnZ3FsJyxcbiAgXS50b1NvcnRlZCgpLFxufTtcbiIsImltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGV4dGVuc2lvbnMgfSBmcm9tICcuLi91dGlscy9leHRlbnNpb25zLmpzJztcbmltcG9ydCB7IGZzVXRpbCB9IGZyb20gJy4uL3V0aWxzL2ZzVXRpbC5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcblxuY29uc3QgbmV3Q29udGVudCA9IGByb290ID0gdHJ1ZVxuXG5bKl1cbmNoYXJzZXQgPSB1dGYtOFxuZW5kX29mX2xpbmUgPSBsZlxuaW5zZXJ0X2ZpbmFsX25ld2xpbmUgPSB0cnVlXG50cmltX3RyYWlsaW5nX3doaXRlc3BhY2UgPSB0cnVlXG5cbiR7Z2VuZXJhdGVFeHRlbnNpb25zKGV4dGVuc2lvbnMuY29kZVdpdGgySW5kZW50U2l6ZSl9XG5pbmRlbnRfc2l6ZSA9IDJcbmluZGVudF9zdHlsZSA9IHNwYWNlXG5cbiR7Z2VuZXJhdGVFeHRlbnNpb25zKGV4dGVuc2lvbnMuY29kZVdpdGg0SW5kZW50U2l6ZSl9XG5pbmRlbnRfc2l6ZSA9IDRcbmluZGVudF9zdHlsZSA9IHNwYWNlXG5cbiR7Z2VuZXJhdGVFeHRlbnNpb25zKGV4dGVuc2lvbnMubWFya2Rvd25MaWtlKX1cbm1heF9saW5lX2xlbmd0aCA9IG9mZlxudHJpbV90cmFpbGluZ193aGl0ZXNwYWNlID0gZmFsc2VcblxuW3tNYWtlZmlsZSwqLm1rfV1cbmluZGVudF9zdHlsZSA9IHRhYlxuYDtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlRWRpdG9yY29uZmlnKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2dlbmVyYXRlRWRpdG9yY29uZmlnJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnLmVkaXRvcmNvbmZpZycpO1xuICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiBmc1V0aWwuZ2VuZXJhdGVGaWxlKGZpbGVQYXRoLCBuZXdDb250ZW50KSk7XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBnZW5lcmF0ZUV4dGVuc2lvbnMoZXh0ZW5zaW9uczogc3RyaW5nW10pOiBzdHJpbmcge1xuICByZXR1cm4gZXh0ZW5zaW9ucy5sZW5ndGggPiAxID8gYFsqLnske2V4dGVuc2lvbnMuam9pbignLCcpfX1dYCA6IGBbKi4ke2V4dGVuc2lvbnNbMF19XWA7XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBmc1V0aWwgfSBmcm9tICcuLi91dGlscy9mc1V0aWwuanMnO1xuaW1wb3J0IHsgcHJvbWlzZVBvb2wgfSBmcm9tICcuLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZW5lcmF0ZUVzbGludHJjKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2dlbmVyYXRlRXNsaW50cmMnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICdlc2xpbnQuY29uZmlnLm1qcycpO1xuICAgIGlmIChjb25maWcuaXNCdW4pIHtcbiAgICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiBmcy5wcm9taXNlcy5ybShmaWxlUGF0aCwgeyBmb3JjZTogdHJ1ZSB9KSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKCFjb25maWcuZXNsaW50QmFzZSkgcmV0dXJuO1xuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IG9sZENvbnRlbnQgPSBhd2FpdCBmcy5wcm9taXNlcy5yZWFkRmlsZShmaWxlUGF0aCwgJ3V0ZjgnKTtcbiAgICAgIGlmICghb2xkQ29udGVudC5pbmNsdWRlcygnZXhwb3J0IHsgZGVmYXVsdCB9JykpIHJldHVybjtcbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIGRvIG5vdGhpbmdcbiAgICB9XG5cbiAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnNVdGlsLmdlbmVyYXRlRmlsZShmaWxlUGF0aCwgYGV4cG9ydCB7IGRlZmF1bHQgfSBmcm9tICcke2NvbmZpZy5lc2xpbnRCYXNlfSc7YCkpO1xuICB9KTtcbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCBtZXJnZSBmcm9tICdkZWVwbWVyZ2UnO1xuaW1wb3J0IHlhbWwgZnJvbSAnanMteWFtbCc7XG5pbXBvcnQgY2xvbmVEZWVwIGZyb20gJ2xvZGFzaC5jbG9uZWRlZXAnO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBmc1V0aWwgfSBmcm9tICcuLi91dGlscy9mc1V0aWwuanMnO1xuaW1wb3J0IHsgb3ZlcndyaXRlTWVyZ2UgfSBmcm9tICcuLi91dGlscy9tZXJnZVV0aWwuanMnO1xuaW1wb3J0IHsgcHJvbWlzZVBvb2wgfSBmcm9tICcuLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5cbmltcG9ydCB7IGdlbmVyYXRlQWdlbnRDb2RpbmdTdHlsZSB9IGZyb20gJy4vYWdlbnRzLmpzJztcblxuY29uc3QgZGVmYXVsdENvbmZpZyA9IHtcbiAgaGF2ZV9mdW46IHRydWUsXG4gIGNvZGVfcmV2aWV3OiB7XG4gICAgZGlzYWJsZTogZmFsc2UsXG4gICAgY29tbWVudF9zZXZlcml0eV90aHJlc2hvbGQ6ICdNRURJVU0nLFxuICAgIG1heF9yZXZpZXdfY29tbWVudHM6IC0xLFxuICAgIHB1bGxfcmVxdWVzdF9vcGVuZWQ6IHtcbiAgICAgIGhlbHA6IGZhbHNlLFxuICAgICAgc3VtbWFyeTogdHJ1ZSxcbiAgICAgIGNvZGVfcmV2aWV3OiB0cnVlLFxuICAgIH0sXG4gIH0sXG4gIGlnbm9yZV9wYXR0ZXJuczogWycqKi9fX2dlbmVyYXRlZF9fJ10sXG59O1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVHZW1pbmlDb25maWcoY29uZmlnOiBQYWNrYWdlQ29uZmlnLCBhbGxDb25maWdzOiBQYWNrYWdlQ29uZmlnW10pOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdnZW5lcmF0ZUdlbWluaUNvbmZpZycsIGFzeW5jICgpID0+IHtcbiAgICBpZiAoIWNvbmZpZy5pc1Jvb3QpIHJldHVybjtcblxuICAgIGNvbnN0IGRpclBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICcuZ2VtaW5pJyk7XG4gICAgY29uc3QgY29uZmlnRmlsZVBhdGggPSBwYXRoLnJlc29sdmUoZGlyUGF0aCwgJ2NvbmZpZy55bWwnKTtcbiAgICBjb25zdCBzdHlsZWd1aWRlRmlsZVBhdGggPSBwYXRoLnJlc29sdmUoZGlyUGF0aCwgJ3N0eWxlZ3VpZGUubWQnKTtcbiAgICBjb25zdCBhZ2VudHNFeHRyYVBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICdBR0VOVFNfRVhUUkEubWQnKTtcblxuICAgIGxldCBuZXdDb25maWc6IG9iamVjdCA9IGNsb25lRGVlcChkZWZhdWx0Q29uZmlnKTtcbiAgICB0cnkge1xuICAgICAgY29uc3Qgb2xkQ29udGVudCA9IGF3YWl0IGZzLnByb21pc2VzLnJlYWRGaWxlKGNvbmZpZ0ZpbGVQYXRoLCAndXRmOCcpO1xuICAgICAgY29uc3Qgb2xkQ29uZmlnID0geWFtbC5sb2FkKG9sZENvbnRlbnQpIGFzIG9iamVjdDtcbiAgICAgIG5ld0NvbmZpZyA9IG1lcmdlLmFsbChbbmV3Q29uZmlnLCBvbGRDb25maWcsIG5ld0NvbmZpZ10sIHsgYXJyYXlNZXJnZTogb3ZlcndyaXRlTWVyZ2UgfSk7XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBkbyBub3RoaW5nIC0gZmlsZSBkb2Vzbid0IGV4aXN0IG9yIGNhbid0IGJlIHBhcnNlZFxuICAgIH1cblxuICAgIGNvbnN0IHlhbWxDb250ZW50ID0geWFtbC5kdW1wKG5ld0NvbmZpZywge1xuICAgICAgbGluZVdpZHRoOiAtMSxcbiAgICAgIG5vQ29tcGF0TW9kZTogdHJ1ZSxcbiAgICAgIHN0eWxlczoge1xuICAgICAgICAnISFudWxsJzogJ2VtcHR5JyxcbiAgICAgIH0sXG4gICAgfSk7XG5cbiAgICBjb25zdCBleHRyYUNvbnRlbnQgPSBhd2FpdCBmc1V0aWwucmVhZEZpbGVJZ25vcmluZ0Vycm9yKGFnZW50c0V4dHJhUGF0aCk7XG4gICAgY29uc3QgY29kaW5nUnVsZUV4dHJhQ29udGVudCA9IGV4dHJhQ29udGVudD8udHJpbVN0YXJ0KCkuc3RhcnRzV2l0aCgnIycpID8gdW5kZWZpbmVkIDogZXh0cmFDb250ZW50O1xuICAgIGNvbnN0IHN0eWxlZ3VpZGVDb250ZW50ID0gYOS7peS4i+OBruOCs+ODvOODh+OCo+ODs+OCsOimj+e0hOOCkui4j+OBvuOBiOOBpuOAgeaXpeacrOiqnuOBp+ODrOODk+ODpeODvOOBl+OBpuOBj+OBoOOBleOBhOOAglxcblxcbiR7Z2VuZXJhdGVBZ2VudENvZGluZ1N0eWxlKGFsbENvbmZpZ3MpfSR7XG4gICAgICBjb2RpbmdSdWxlRXh0cmFDb250ZW50ID8gYFxcbiR7Y29kaW5nUnVsZUV4dHJhQ29udGVudC50cmltRW5kKCl9YCA6ICcnXG4gICAgfWA7XG5cbiAgICBjb25zdCBwcm9taXNlcyA9IFtcbiAgICAgIHByb21pc2VQb29sLnJ1bigoKSA9PiBmc1V0aWwuZ2VuZXJhdGVGaWxlKGNvbmZpZ0ZpbGVQYXRoLCB5YW1sQ29udGVudCkpLFxuICAgICAgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzVXRpbC5nZW5lcmF0ZUZpbGUoc3R5bGVndWlkZUZpbGVQYXRoLCBzdHlsZWd1aWRlQ29udGVudCkpLFxuICAgIF07XG4gICAgYXdhaXQgUHJvbWlzZS5hbGwocHJvbWlzZXMpO1xuICB9KTtcbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJlbW92ZUdlbWluaVNldHRpbmdzKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2dlbmVyYXRlR2VtaW5pU2V0dGluZ3MnLCBhc3luYyAoKSA9PiB7XG4gICAgaWYgKCFjb25maWcuaXNSb290KSByZXR1cm47XG5cbiAgICBjb25zdCBkaXJQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnLmdlbWluaScpO1xuICAgIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKGRpclBhdGgsICdzZXR0aW5ncy5qc29uJyk7XG4gICAgYXdhaXQgZnMucHJvbWlzZXMucm0oZmlsZVBhdGgsIHsgZm9yY2U6IHRydWUgfSk7XG4gIH0pO1xufVxuIiwiaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZXh0ZW5zaW9ucyB9IGZyb20gJy4uL3V0aWxzL2V4dGVuc2lvbnMuanMnO1xuaW1wb3J0IHsgZnNVdGlsIH0gZnJvbSAnLi4vdXRpbHMvZnNVdGlsLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuXG4vLyBjZi4gaHR0cHM6Ly9idW4uc2gvZ3VpZGVzL2luc3RhbGwvZ2l0LWRpZmYtYnVuLWxvY2tmaWxlXG5jb25zdCBuZXdDb250ZW50ID0gYCogdGV4dD1hdXRvXG5cbioubG9ja2IgYmluYXJ5IGRpZmY9bG9ja2JcblxuJHtbLi4uZXh0ZW5zaW9ucy5jb2RlV2l0aDJJbmRlbnRTaXplLCAuLi5leHRlbnNpb25zLmNvZGVXaXRoNEluZGVudFNpemUsIC4uLmV4dGVuc2lvbnMubWFya2Rvd25MaWtlXVxuICAubWFwKChleHQpID0+IGAqLiR7ZXh0fSB0ZXh0IGVvbD1sZmApXG4gIC5qb2luKCdcXG4nKX1cblxuZGlzdC8qKiBsaW5ndWlzdC1nZW5lcmF0ZWQ9dHJ1ZVxuYDtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlR2l0YXR0cmlidXRlcyhjb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdnZW5lcmF0ZUdpdGF0dHJpYnV0ZXMnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICcuZ2l0YXR0cmlidXRlcycpO1xuICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiBmc1V0aWwuZ2VuZXJhdGVGaWxlKGZpbGVQYXRoLCBuZXdDb250ZW50KSk7XG4gIH0pO1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IG9zIGZyb20gJ25vZGU6b3MnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB7IG9wdGlvbnMgfSBmcm9tICcuLi9vcHRpb25zLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZnNVdGlsIH0gZnJvbSAnLi4vdXRpbHMvZnNVdGlsLmpzJztcbmltcG9ydCB7IGlnbm9yZUZpbGVVdGlsIH0gZnJvbSAnLi4vdXRpbHMvaWdub3JlRmlsZVV0aWwuanMnO1xuaW1wb3J0IHsgcHJvbWlzZVBvb2wgfSBmcm9tICcuLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5cbmNvbnN0IGRlZmF1bHROYW1lcyA9IFsnbWFjb3MnLCAnbGludXgnLCAnamV0YnJhaW5zJywgJ3Zpc3VhbHN0dWRpb2NvZGUnLCAnZW1hY3MnLCAndmltJywgJ3lhcm4nXTtcblxuY29uc3QgY29tbW9uQ29udGVudCA9IGBcbiEua2VlcFxuLmFpZGVyKlxuLmVudi5wcm9kdWN0aW9uXG4qL21vdW50LyouaGFzaFxuLmRldmNvbnRhaW5lci9cbi5pZGVhL0F1Z21lbnRXZWJ2aWV3U3RhdGVTdG9yZS54bWxcbi5pZGVhL2NvcGlsb3QuKlxuLmlkZWEvY29waWxvdC9jaGF0U2Vzc2lvbnMvXG4ucGxheXdyaWdodC1jbGkvXG4uc2VyZW5hL1xuLnRtcC9cbl9fZ2VuZXJhdGVkX18vXG5Ad2lsbGJvb3N0ZXIvXG5kaXN0L1xudGVtcC9cbnRtcC9cbmA7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZW5lcmF0ZUdpdGlnbm9yZShjb25maWc6IFBhY2thZ2VDb25maWcsIHJvb3RDb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdnZW5lcmF0ZUdpdGlnbm9yZScsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJy5naXRpZ25vcmUnKTtcbiAgICBjb25zdCBjb250ZW50ID0gKGF3YWl0IGZzVXRpbC5yZWFkRmlsZUlnbm9yaW5nRXJyb3IoZmlsZVBhdGgpKSA/PyAnJztcbiAgICBsZXQgaGVhZFVzZXJDb250ZW50ID0gaWdub3JlRmlsZVV0aWwuZ2V0SGVhZFVzZXJDb250ZW50KGNvbnRlbnQpICsgY29tbW9uQ29udGVudDtcbiAgICBjb25zdCB0YWlsVXNlckNvbnRlbnQgPSBpZ25vcmVGaWxlVXRpbC5nZXRUYWlsVXNlckNvbnRlbnQoY29udGVudCk7XG5cbiAgICBjb25zdCBuYW1lcyA9IFsuLi5kZWZhdWx0TmFtZXNdO1xuICAgIGlmIChjb25maWcuZG9lc0NvbnRhaW5HZW1maWxlKSB7XG4gICAgICBuYW1lcy5wdXNoKCdydWJ5Jyk7XG4gICAgfVxuICAgIGlmIChjb25maWcuZG9lc0NvbnRhaW5Hb01vZCkge1xuICAgICAgbmFtZXMucHVzaCgnZ28nKTtcbiAgICAgIGhlYWRVc2VyQ29udGVudCArPSBgJHtwYXRoLmJhc2VuYW1lKGNvbmZpZy5kaXJQYXRoKX1cbmA7XG4gICAgfVxuICAgIGlmIChjb25maWcuZG9lc0NvbnRhaW5QYWNrYWdlSnNvbikge1xuICAgICAgbmFtZXMucHVzaCgnbm9kZScpO1xuICAgIH1cbiAgICBpZiAoY29uZmlnLmRvZXNDb250YWluUG9tWG1sKSB7XG4gICAgICBuYW1lcy5wdXNoKCdtYXZlbicpO1xuICAgICAgaGVhZFVzZXJDb250ZW50ICs9IGAuaWRlYS9nb29nbGUtamF2YS1mb3JtYXQueG1sXG5gO1xuICAgIH1cbiAgICBpZiAoY29uZmlnLmRvZXNDb250YWluUHVic3BlY1lhbWwpIHtcbiAgICAgIG5hbWVzLnB1c2goJ2ZsdXR0ZXInLCAnQW5kcm9pZFN0dWRpbycsICdydWJ5Jyk7XG4gICAgICBoZWFkVXNlckNvbnRlbnQgKz0gYC5mbHV0dGVyLXBsdWdpbnMtZGVwZW5kZW5jaWVzXG5hbmRyb2lkL2tleS5wcm9wZXJ0aWVzXG5pb3MvLmJ1bmRsZVxuLmlkZWEvcnVuQ29uZmlndXJhdGlvbnMueG1sXG5gO1xuICAgIH1cbiAgICBpZiAoY29uZmlnLmRvZXNDb250YWluVGVtcGxhdGVZYW1sKSB7XG4gICAgICBoZWFkVXNlckNvbnRlbnQgKz0gYC5hd3Mtc2FtL1xucGFja2FnZWQueWFtbFxuYDtcbiAgICB9XG4gICAgLy8gQmVjYXVzZSAudmVudiBzaG91bGQgYmUgaWdub3JlZCBvbiByb290IGRpcmVjdG9yeVxuICAgIGlmIChjb25maWcuZG9lc0NvbnRhaW5Qb2V0cnlMb2NrKSB7XG4gICAgICBuYW1lcy5wdXNoKCdweXRob24nKTtcbiAgICAgIGhlYWRVc2VyQ29udGVudCArPSBgLnZlbnYvXG5gO1xuICAgIH1cblxuICAgIGlmIChjb25maWcuZGVwZW5kaW5nLmJsaXR6KSB7XG4gICAgICBoZWFkVXNlckNvbnRlbnQgKz0gYC5ibGl0ei9cbi5ibGl0eioqXG5gO1xuICAgIH1cbiAgICBpZiAoY29uZmlnLmRlcGVuZGluZy5uZXh0KSB7XG4gICAgICBuYW1lcy5wdXNoKCduZXh0anMnKTtcbiAgICB9XG4gICAgaWYgKHJvb3RDb25maWcuZGVwZW5kaW5nLmZpcmViYXNlIHx8IGNvbmZpZy5kZXBlbmRpbmcuZmlyZWJhc2UpIHtcbiAgICAgIG5hbWVzLnB1c2goJ2ZpcmViYXNlJyk7XG4gICAgfVxuICAgIGlmIChjb25maWcuZGVwZW5kaW5nLnByaXNtYSkge1xuICAgICAgaGVhZFVzZXJDb250ZW50ICs9IGAqLnNxbGl0ZTMqXG5gO1xuICAgIH1cbiAgICBpZiAoY29uZmlnLmRlcGVuZGluZy5wbGF5d3JpZ2h0VGVzdCkge1xuICAgICAgaGVhZFVzZXJDb250ZW50ICs9IGBwbGF5d3JpZ2h0LXJlcG9ydC9cbnRlc3QtcmVzdWx0cy9cbmA7XG4gICAgfVxuICAgIGlmIChyb290Q29uZmlnLmRlcGVuZGluZy5yZWFjdE5hdGl2ZSB8fCBjb25maWcuZGVwZW5kaW5nLnJlYWN0TmF0aXZlKSB7XG4gICAgICBuYW1lcy5wdXNoKCdyZWFjdG5hdGl2ZScpO1xuICAgICAgaGVhZFVzZXJDb250ZW50ICs9IGBnb29nbGUtc2VydmljZXMuanNvblxuYW5kcm9pZC9hcHAvc3JjL21haW4vYXNzZXRzL1xuYDtcbiAgICB9XG4gICAgaWYgKGNvbmZpZy5kZXBlbmRpbmcuc3Rvcnlib29rKSB7XG4gICAgICBuYW1lcy5wdXNoKCdzdG9yeWJvb2tqcycpO1xuICAgIH1cbiAgICBpZiAoY29uZmlnLmRlcGVuZGluZy5saXRlc3RyZWFtKSB7XG4gICAgICBoZWFkVXNlckNvbnRlbnQgKz0gYGdjcC1zYS1rZXkuanNvblxuYDtcbiAgICB9XG5cbiAgICBsZXQgZ2VuZXJhdGVkID0gJyc7XG4gICAgZm9yIChjb25zdCBuYW1lIG9mIG5hbWVzKSB7XG4gICAgICBsZXQgY29udGVudCA9IChhd2FpdCByZWFkQ2FjaGUobmFtZSkpID8/ICcnO1xuICAgICAgaWYgKCFjb250ZW50KSB7XG4gICAgICAgIGNvbnN0IHVybCA9IGBodHRwczovL3d3dy50b3B0YWwuY29tL2RldmVsb3BlcnMvZ2l0aWdub3JlL2FwaS8ke25hbWV9YDtcbiAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaCh1cmwpO1xuICAgICAgICBjb25zdCByZXNwb25zZVRleHQgPSBhd2FpdCByZXNwb25zZS50ZXh0KCk7XG4gICAgICAgIGlmICghcmVzcG9uc2Uub2sgfHwgcmVzcG9uc2VUZXh0LmluY2x1ZGVzKCdBdHRlbnRpb24gUmVxdWlyZWQhJykgfHwgcmVzcG9uc2VUZXh0LmluY2x1ZGVzKCc8dGl0bGU+JykpIHtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKGBGYWlsZWQgdG8gZmV0Y2ggJHt1cmx9YCk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNvbnRlbnQgPSByZXNwb25zZVRleHQudHJpbSgpO1xuICAgICAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT4gd3JpdGVDYWNoZShuYW1lLCBjb250ZW50KSk7XG4gICAgICAgIGlmIChvcHRpb25zLmlzVmVyYm9zZSkge1xuICAgICAgICAgIGNvbnNvbGUuaW5mbyhgRmV0Y2hlZCAke3VybH1gKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKGdlbmVyYXRlZCkgZ2VuZXJhdGVkICs9ICdcXG4nO1xuICAgICAgZ2VuZXJhdGVkICs9IGNvbnRlbnQgKyAnXFxuJztcbiAgICB9XG4gICAgaWYgKCEoYXdhaXQgaWdub3JlRmlsZVV0aWwuaXNCZXJyeVplcm9JbnN0YWxsRW5hYmxlZChmaWxlUGF0aCkpKSB7XG4gICAgICBnZW5lcmF0ZWQgPSBnZW5lcmF0ZWQucmVwbGFjZSgnIS55YXJuL2NhY2hlJywgJyMgIS55YXJuL2NhY2hlJykucmVwbGFjZSgnIyAucG5wLionLCAnLnBucC4qJyk7XG4gICAgfVxuICAgIGlmIChjb25maWcuZG9lc0NvbnRhaW5Qb21YbWwgfHwgY29uZmlnLmRvZXNDb250YWluUHVic3BlY1lhbWwpIHtcbiAgICAgIGdlbmVyYXRlZCA9IGdlbmVyYXRlZFxuICAgICAgICAucmVwbGFjZUFsbCgvXiMgLmlkZWFcXC9hcnRpZmFjdHMkL2dtLCAnLmlkZWEvYXJ0aWZhY3RzJylcbiAgICAgICAgLnJlcGxhY2VBbGwoL14jIC5pZGVhXFwvY29tcGlsZXIueG1sJC9nbSwgJy5pZGVhL2NvbXBpbGVyLnhtbCcpXG4gICAgICAgIC5yZXBsYWNlQWxsKC9eIyAuaWRlYVxcL2phclJlcG9zaXRvcmllcy54bWwkL2dtLCAnLmlkZWEvamFyUmVwb3NpdG9yaWVzLnhtbCcpXG4gICAgICAgIC5yZXBsYWNlQWxsKC9eIyAuaWRlYVxcL21vZHVsZXMueG1sJC9nbSwgJy5pZGVhL21vZHVsZXMueG1sJylcbiAgICAgICAgLnJlcGxhY2VBbGwoL14jIC5pZGVhXFwvKi5pbWwkL2dtLCAnLmlkZWEvKi5pbWwnKVxuICAgICAgICAucmVwbGFjZUFsbCgvXiMgLmlkZWFcXC9tb2R1bGVzJC9nbSwgJy5pZGVhL21vZHVsZXMnKVxuICAgICAgICAucmVwbGFjZUFsbCgvXiMgKi5pbWwkL2dtLCAnKi5pbWwnKVxuICAgICAgICAucmVwbGFjZUFsbCgvXiMgKi5pcHIkL2dtLCAnKi5pcHInKTtcbiAgICAgIGlmIChjb25maWcuZG9lc0NvbnRhaW5QdWJzcGVjWWFtbCkge1xuICAgICAgICBnZW5lcmF0ZWQgPSBnZW5lcmF0ZWQucmVwbGFjZUFsbCgvXi5pZGVhXFwvbW9kdWxlcy54bWwkL2dtLCAnIyAuaWRlYS9tb2R1bGVzLnhtbCcpO1xuICAgICAgfVxuICAgIH1cbiAgICBnZW5lcmF0ZWQgPSBnZW5lcmF0ZWQucmVwbGFjZUFsbCgvXi5pZGVhXFwvPyQvZ20sICcjIC5pZGVhJyk7XG4gICAgaWYgKHJvb3RDb25maWcuZGVwZW5kaW5nLnJlYWN0TmF0aXZlIHx8IGNvbmZpZy5kZXBlbmRpbmcucmVhY3ROYXRpdmUgfHwgY29uZmlnLmRvZXNDb250YWluUHVic3BlY1lhbWwpIHtcbiAgICAgIGdlbmVyYXRlZCA9IGdlbmVyYXRlZC5yZXBsYWNlQWxsKC9eKC5pZGVhXFwvLispJC9nbSwgJyQxXFxuYW5kcm9pZC8kMScpO1xuICAgIH1cbiAgICBjb25zdCBuZXdDb250ZW50ID0gaGVhZFVzZXJDb250ZW50ICsgJ1xcbicgKyBnZW5lcmF0ZWQgKyB0YWlsVXNlckNvbnRlbnQ7XG4gICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzVXRpbC5nZW5lcmF0ZUZpbGUoZmlsZVBhdGgsIG5ld0NvbnRlbnQpKTtcbiAgfSk7XG59XG5cbmNvbnN0IGRpclBhdGggPSBwYXRoLmpvaW4ob3MuaG9tZWRpcigpLCAnLmNhY2hlJywgJ3diZnknLCAnZ2l0aWdub3JlJyk7XG5cbmFzeW5jIGZ1bmN0aW9uIHdyaXRlQ2FjaGUobmFtZTogc3RyaW5nLCBjb250ZW50OiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgYXdhaXQgZnMucHJvbWlzZXMubWtkaXIoZGlyUGF0aCwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gIGF3YWl0IGZzLnByb21pc2VzLndyaXRlRmlsZShwYXRoLmpvaW4oZGlyUGF0aCwgbmFtZSksIGNvbnRlbnQpO1xufVxuXG5hc3luYyBmdW5jdGlvbiByZWFkQ2FjaGUobmFtZTogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmcgfCB1bmRlZmluZWQ+IHtcbiAgdHJ5IHtcbiAgICBjb25zdCBzdGF0ID0gYXdhaXQgZnMucHJvbWlzZXMuc3RhdChwYXRoLmpvaW4oZGlyUGF0aCwgbmFtZSkpO1xuICAgIGlmIChEYXRlLm5vdygpIC0gc3RhdC5tdGltZU1zID4gNiAqIDYwICogNjAgKiAxMDAwKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHJldHVybiBhd2FpdCBmcy5wcm9taXNlcy5yZWFkRmlsZShwYXRoLmpvaW4oZGlyUGF0aCwgbmFtZSksICd1dGY4Jyk7XG4gIH0gY2F0Y2gge1xuICAgIC8vIGRvIG5vdGhpbmdcbiAgfVxufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZXh0ZW5zaW9ucyB9IGZyb20gJy4uL3V0aWxzL2V4dGVuc2lvbnMuanMnO1xuaW1wb3J0IHsgZnNVdGlsIH0gZnJvbSAnLi4vdXRpbHMvZnNVdGlsLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVJZGVhU2V0dGluZ3MoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZ2VuZXJhdGVJZGVhU2V0dGluZ3MnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgZGlyUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJy5pZGVhJyk7XG4gICAgaWYgKGZzLmV4aXN0c1N5bmMoZGlyUGF0aCkpIHtcbiAgICAgIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKGRpclBhdGgsICd3YXRjaGVyVGFza3MueG1sJyk7XG4gICAgICBhd2FpdCAoY29uZmlnLmRvZXNDb250YWluSmF2YVNjcmlwdCB8fFxuICAgICAgY29uZmlnLmRvZXNDb250YWluSmF2YVNjcmlwdEluUGFja2FnZXMgfHxcbiAgICAgIGNvbmZpZy5kb2VzQ29udGFpblR5cGVTY3JpcHQgfHxcbiAgICAgIGNvbmZpZy5kb2VzQ29udGFpblR5cGVTY3JpcHRJblBhY2thZ2VzIHx8XG4gICAgICAoY29uZmlnLmRvZXNDb250YWluUGFja2FnZUpzb24gJiZcbiAgICAgICAgIWNvbmZpZy5kb2VzQ29udGFpblB1YnNwZWNZYW1sICYmXG4gICAgICAgICFjb25maWcuZG9lc0NvbnRhaW5HZW1maWxlICYmXG4gICAgICAgICFjb25maWcuZG9lc0NvbnRhaW5Hb01vZCAmJlxuICAgICAgICAhY29uZmlnLmRvZXNDb250YWluUG9tWG1sKVxuICAgICAgICA/IHByb21pc2VQb29sLnJ1bigoKSA9PiBmc1V0aWwuZ2VuZXJhdGVGaWxlKGZpbGVQYXRoLCBjb25maWcuaXNCdW4gPyBiaW9tZUNvbnRlbnQgOiBwcmV0dGllckNvbnRlbnQpKVxuICAgICAgICA6IHByb21pc2VQb29sLnJ1bigoKSA9PiBmcy5wcm9taXNlcy5ybShmaWxlUGF0aCwgeyBmb3JjZTogdHJ1ZSB9KSkpO1xuICAgIH1cbiAgfSk7XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZVRhc2tPcHRpb25zKHJ1bm5lcjogc3RyaW5nLCBhcmdzOiBzdHJpbmcsIG5hbWU6IHN0cmluZywgZXh0ZW5zaW9uOiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gYCAgICA8VGFza09wdGlvbnMgaXNFbmFibGVkPVwidHJ1ZVwiPlxuICAgICAgPG9wdGlvbiBuYW1lPVwiYXJndW1lbnRzXCIgdmFsdWU9XCIke2FyZ3N9ICRGaWxlUGF0aFJlbGF0aXZlVG9Qcm9qZWN0Um9vdCRcIiAvPlxuICAgICAgPG9wdGlvbiBuYW1lPVwiY2hlY2tTeW50YXhFcnJvcnNcIiB2YWx1ZT1cImZhbHNlXCIgLz5cbiAgICAgIDxvcHRpb24gbmFtZT1cImRlc2NyaXB0aW9uXCIgLz5cbiAgICAgIDxvcHRpb24gbmFtZT1cImV4aXRDb2RlQmVoYXZpb3JcIiB2YWx1ZT1cIkVSUk9SXCIgLz5cbiAgICAgIDxvcHRpb24gbmFtZT1cImZpbGVFeHRlbnNpb25cIiB2YWx1ZT1cIiR7ZXh0ZW5zaW9ufVwiIC8+XG4gICAgICA8b3B0aW9uIG5hbWU9XCJpbW1lZGlhdGVTeW5jXCIgdmFsdWU9XCJmYWxzZVwiIC8+XG4gICAgICA8b3B0aW9uIG5hbWU9XCJuYW1lXCIgdmFsdWU9XCIke25hbWV9ICguJHtleHRlbnNpb259KVwiIC8+XG4gICAgICA8b3B0aW9uIG5hbWU9XCJvdXRwdXRcIiB2YWx1ZT1cIiRGaWxlUGF0aFJlbGF0aXZlVG9Qcm9qZWN0Um9vdCRcIiAvPlxuICAgICAgPG9wdGlvbiBuYW1lPVwib3V0cHV0RmlsdGVyc1wiPlxuICAgICAgICA8YXJyYXkgLz5cbiAgICAgIDwvb3B0aW9uPlxuICAgICAgPG9wdGlvbiBuYW1lPVwib3V0cHV0RnJvbVN0ZG91dFwiIHZhbHVlPVwiZmFsc2VcIiAvPlxuICAgICAgPG9wdGlvbiBuYW1lPVwicHJvZ3JhbVwiIHZhbHVlPVwiJHtydW5uZXJ9XCIgLz5cbiAgICAgIDxvcHRpb24gbmFtZT1cInJ1bk9uRXh0ZXJuYWxDaGFuZ2VzXCIgdmFsdWU9XCJmYWxzZVwiIC8+XG4gICAgICA8b3B0aW9uIG5hbWU9XCJzY29wZU5hbWVcIiB2YWx1ZT1cIlByb2plY3QgRmlsZXNcIiAvPlxuICAgICAgPG9wdGlvbiBuYW1lPVwidHJhY2tPbmx5Um9vdFwiIHZhbHVlPVwiZmFsc2VcIiAvPlxuICAgICAgPG9wdGlvbiBuYW1lPVwid29ya2luZ0RpclwiIHZhbHVlPVwiJFByb2plY3RGaWxlRGlyJFwiIC8+XG4gICAgICA8ZW52cyAvPlxuICAgIDwvVGFza09wdGlvbnM+XG5gO1xufVxuXG5jb25zdCBwcmV0dGllckNvbnRlbnQgPSBgPD94bWwgdmVyc2lvbj1cIjEuMFwiIGVuY29kaW5nPVwiVVRGLThcIj8+XG48cHJvamVjdCB2ZXJzaW9uPVwiNFwiPlxuICA8Y29tcG9uZW50IG5hbWU9XCJQcm9qZWN0VGFza3NPcHRpb25zXCI+XG4ke2V4dGVuc2lvbnMucHJldHRpZXIubWFwKChleHQpID0+IGNyZWF0ZVRhc2tPcHRpb25zKCdub2RlJywgJ25vZGVfbW9kdWxlcy8uYmluL3ByZXR0aWVyIC0tY2FjaGUgLS13cml0ZScsICdQcmV0dGllcicsIGV4dCkpLmpvaW4oJycpfVxuICA8L2NvbXBvbmVudD5cbjwvcHJvamVjdD5cbmA7XG5cbmNvbnN0IGJpb21lQ29udGVudCA9IGA8P3htbCB2ZXJzaW9uPVwiMS4wXCIgZW5jb2Rpbmc9XCJVVEYtOFwiPz5cbjxwcm9qZWN0IHZlcnNpb249XCI0XCI+XG4gIDxjb21wb25lbnQgbmFtZT1cIlByb2plY3RUYXNrc09wdGlvbnNcIj5cbiR7ZXh0ZW5zaW9ucy5wcmV0dGllci5tYXAoKGV4dCkgPT4gY3JlYXRlVGFza09wdGlvbnMoJ2J1bicsICctLWJ1biBub2RlX21vZHVsZXMvLmJpbi9iaW9tZSBjaGVjayAtLWZpeCAtLW5vLWVycm9ycy1vbi11bm1hdGNoZWQgLS1za2lwLXBhcnNlLWVycm9ycycsICdCaW9tZScsIGV4dCkpLmpvaW4oJycpfVxuICA8L2NvbXBvbmVudD5cbjwvcHJvamVjdD5cbmA7XG4iLCJpbXBvcnQgdHlwZSB7IFNwYXduU3luY09wdGlvbnMgfSBmcm9tICdub2RlOmNoaWxkX3Byb2Nlc3MnO1xuaW1wb3J0IGNoaWxkX3Byb2Nlc3MgZnJvbSAnbm9kZTpjaGlsZF9wcm9jZXNzJztcblxuZXhwb3J0IGZ1bmN0aW9uIHNwYXduU3luYyhjb21tYW5kOiBzdHJpbmcsIGFyZ3M6IHN0cmluZ1tdLCBjd2Q6IHN0cmluZywgcmV0cnkgPSAwKTogdm9pZCB7XG4gIHNwYXduU3luY0FuZFJldHVyblN0YXR1cyhjb21tYW5kLCBhcmdzLCBjd2QsIHJldHJ5KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHNwYXduU3luY0FuZFJldHVyblN0YXR1cyhjb21tYW5kOiBzdHJpbmcsIGFyZ3M6IHN0cmluZ1tdLCBjd2Q6IHN0cmluZywgcmV0cnkgPSAwKTogbnVtYmVyIHtcbiAgbGV0IHN0YXR1cyA9IDE7XG4gIGRvIHtcbiAgICBjb25zdCBbbmV3Q21kLCBuZXdBcmdzLCBvcHRpb25zXSA9IGdldFNwYXduU3luY0FyZ3MoY29tbWFuZCwgYXJncywgY3dkKTtcbiAgICBjb25zb2xlLmxvZyhgJCAke25ld0NtZH0gJHtuZXdBcmdzLmpvaW4oJyAnKX0gYXQgJHtjd2R9YCk7XG4gICAgY29uc3QgcmV0ID0gY2hpbGRfcHJvY2Vzcy5zcGF3blN5bmMobmV3Q21kLCBuZXdBcmdzLCBvcHRpb25zKTtcbiAgICBzdGF0dXMgPSByZXQuc3RhdHVzID8/IDE7XG4gICAgaWYgKHN0YXR1cyA9PT0gMCkgYnJlYWs7XG4gIH0gd2hpbGUgKC0tcmV0cnkgPj0gMCk7XG4gIHJldHVybiBzdGF0dXM7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBzcGF3blN5bmNBbmRSZXR1cm5TdGRvdXQoY29tbWFuZDogc3RyaW5nLCBhcmdzOiBzdHJpbmdbXSwgY3dkOiBzdHJpbmcpOiBzdHJpbmcge1xuICBjb25zdCBbbmV3Q21kLCBuZXdBcmdzLCBvcHRpb25zXSA9IGdldFNwYXduU3luY0FyZ3MoY29tbWFuZCwgYXJncywgY3dkKTtcbiAgb3B0aW9ucy5zdGRpbyA9ICdwaXBlJztcbiAgY29uc3QgcHJvYyA9IGNoaWxkX3Byb2Nlc3Muc3Bhd25TeW5jKG5ld0NtZCwgbmV3QXJncywgb3B0aW9ucyk7XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW5uZWNlc3NhcnktY29uZGl0aW9uIC0tIHNwYXduU3luYyByZXR1cm5zIG51bGwgc3RkZXJyIG9uIEVOT0VOVC5cbiAgY29uc3Qgc3RkZXJyID0gcHJvYy5zdGRlcnIgPz8gJyc7XG4gIGNvbnN0IGVycm9yID0gdHlwZW9mIHN0ZGVyciA9PT0gJ3N0cmluZycgPyBzdGRlcnIudHJpbSgpIDogc3RkZXJyLnRvU3RyaW5nKCkudHJpbSgpO1xuICBpZiAocHJvYy5lcnJvcikge1xuICAgIGNvbnNvbGUuZXJyb3IoYCR7bmV3Q21kfSBbJHtuZXdBcmdzLm1hcCgocykgPT4gYFwiJHtzfVwiYCkuam9pbignLCAnKX1dIGZhaWxlZCB3aXRoOiAke3Byb2MuZXJyb3IubWVzc2FnZX1gKTtcbiAgfSBlbHNlIGlmIChlcnJvcikge1xuICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICBgJHtuZXdDbWR9IFske25ld0FyZ3MubWFwKChzKSA9PiBgXCIke3N9XCJgKS5qb2luKCcsICcpfV0gb3V0cHV0cyB0aGUgZm9sbG93aW5nIGNvbnRlbnQgdG8gc3RkZXJyOlxcbiR7ZXJyb3J9YFxuICAgICk7XG4gIH1cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bm5lY2Vzc2FyeS1jb25kaXRpb24gLS0gc3Bhd25TeW5jIHJldHVybnMgbnVsbCBzdGRvdXQgb24gRU5PRU5ULlxuICBjb25zdCBzdGRvdXQgPSBwcm9jLnN0ZG91dCA/PyAnJztcbiAgcmV0dXJuIHR5cGVvZiBzdGRvdXQgPT09ICdzdHJpbmcnID8gc3Rkb3V0LnRyaW0oKSA6IHN0ZG91dC50b1N0cmluZygpLnRyaW0oKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldFNwYXduU3luY0FyZ3MoY29tbWFuZDogc3RyaW5nLCBhcmdzOiBzdHJpbmdbXSwgY3dkOiBzdHJpbmcpOiBbc3RyaW5nLCBzdHJpbmdbXSwgU3Bhd25TeW5jT3B0aW9uc10ge1xuICBjb25zdCBlbnYgPSB7IC4uLnByb2Nlc3MuZW52IH07XG4gIC8vIFJlbW92ZSBiZXJyeSBmcm9tIFBBVEhcbiAgaWYgKGVudi5QQVRIICYmIGVudi5CRVJSWV9CSU5fRk9MREVSKSB7XG4gICAgZW52LlBBVEggPSBlbnYuUEFUSC5zcGxpdCgnOicpXG4gICAgICAuZmlsdGVyKChwKSA9PiBwICE9PSBlbnYuQkVSUllfQklOX0ZPTERFUilcbiAgICAgIC5qb2luKCc6Jyk7XG4gIH1cblxuICByZXR1cm4gW1xuICAgIGNvbW1hbmQsXG4gICAgYXJncyxcbiAgICB7XG4gICAgICBjd2QsXG4gICAgICBlbnYsXG4gICAgICBlbmNvZGluZzogJ3V0ZjgnLFxuICAgICAgc2hlbGw6IGZhbHNlLFxuICAgICAgc3RkaW86ICdpbmhlcml0JyxcbiAgICB9LFxuICBdO1xufVxuIiwiaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5cbmV4cG9ydCBjb25zdCBFc2xpbnRVdGlsID0ge1xuICBnZXRMaW50Rml4U3VmZml4KGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGNvbmZpZy5kb2VzQ29udGFpbkpzeE9yVHN4ID8gJyAtLXJ1bGUgXCJ7IHJlYWN0LWhvb2tzL2V4aGF1c3RpdmUtZGVwczogMCB9XCInIDogJyc7XG4gIH0sXG59O1xuIiwiaW1wb3J0IHsgT2N0b2tpdCB9IGZyb20gJ0BvY3Rva2l0L2NvcmUnO1xuXG5jbGFzcyBHaXRIdWJVdGlsIHtcbiAgZ2V0T3JnQW5kTmFtZSh1cmxPckZ1bGxOYW1lOiBzdHJpbmcpOiBbc3RyaW5nLCBzdHJpbmddIHtcbiAgICBjb25zdCB1cmxXaXRob3V0UHJvdG9jb2wgPSB1cmxPckZ1bGxOYW1lLnNwbGl0KCc6JykuYXQoLTEpO1xuICAgIGNvbnN0IG5hbWVzID0gdXJsV2l0aG91dFByb3RvY29sPy5zcGxpdCgnLycpO1xuICAgIGNvbnN0IG9yZyA9IG5hbWVzPy5hdCgtMikgPz8gJyc7XG4gICAgY29uc3QgbmFtZSA9IG5hbWVzPy5hdCgtMSk/LnJlcGxhY2UoLy5naXQkLywgJycpID8/ICcnO1xuICAgIHJldHVybiBbb3JnLCBuYW1lXTtcbiAgfVxufVxuZXhwb3J0IGNvbnN0IGdpdEh1YlV0aWwgPSBuZXcgR2l0SHViVXRpbCgpO1xuXG5jb25zdCBvY3Rva2l0Q2FjaGUgPSBuZXcgTWFwPHN0cmluZywgT2N0b2tpdD4oKTtcblxuZXhwb3J0IGZ1bmN0aW9uIGdldE9jdG9raXQob3duZXI/OiBzdHJpbmcpOiBPY3Rva2l0IHtcbiAgY29uc3Qga2V5ID0gb3duZXIgPz8gJyc7XG4gIGNvbnN0IGNhY2hlZCA9IG9jdG9raXRDYWNoZS5nZXQoa2V5KTtcbiAgaWYgKGNhY2hlZCkgcmV0dXJuIGNhY2hlZDtcblxuICBjb25zdCBvY3Rva2l0ID0gbmV3IE9jdG9raXQoe1xuICAgIGF1dGg6IGdldEdpdEh1YlRva2VuKG93bmVyKSB8fCB1bmRlZmluZWQsXG4gIH0pO1xuICBvY3Rva2l0Q2FjaGUuc2V0KGtleSwgb2N0b2tpdCk7XG4gIHJldHVybiBvY3Rva2l0O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaGFzR2l0SHViVG9rZW4ob3duZXI6IHN0cmluZyk6IGJvb2xlYW4ge1xuICByZXR1cm4gISFnZXRHaXRIdWJUb2tlbihvd25lcik7XG59XG5cbmZ1bmN0aW9uIGdldEdpdEh1YlRva2VuKG93bmVyPzogc3RyaW5nKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgaWYgKG93bmVyID09PSAnV2lsbEJvb3N0ZXInKSB7XG4gICAgcmV0dXJuIHByb2Nlc3MuZW52LkdIX0JPVF9QQVRfRk9SX1dJTExCT09TVEVSO1xuICB9XG4gIGlmIChvd25lciA9PT0gJ1dpbGxCb29zdGVyTGFiJykge1xuICAgIHJldHVybiBwcm9jZXNzLmVudi5HSF9CT1RfUEFUX0ZPUl9XSUxMQk9PU1RFUkxBQjtcbiAgfVxuICByZXR1cm4gKFxuICAgIHByb2Nlc3MuZW52LkdIX0JPVF9QQVRfRk9SX1dJTExCT09TVEVSIHx8XG4gICAgcHJvY2Vzcy5lbnYuR0hfQk9UX1BBVF9GT1JfV0lMTEJPT1NURVJMQUIgfHxcbiAgICBwcm9jZXNzLmVudi5HSF9UT0tFTiB8fFxuICAgIHByb2Nlc3MuZW52LkdJVEhVQl9UT0tFTlxuICApO1xufVxuIiwiaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5cbmNvbnN0IEVTTElOVF9DT05GSUdfUFJFRklYID0gJ0B3aWxsYm9vc3Rlci9lc2xpbnQtY29uZmlnLSc7XG5jb25zdCBwaW5uZWREZXBlbmRlbmN5U3BlY2lmaWVycyA9IHtcbiAgJ0Blc2xpbnQvanMnOiAnXjkuMzkuNCcsXG4gIGVzbGludDogJ145LjM5LjQnLFxuICB0eXBlc2NyaXB0OiAnXjUuOS4zJyxcbn0gYXMgY29uc3Q7XG5cbmV4cG9ydCBmdW5jdGlvbiBzaG91bGRTa2lwV2lsbGJvb3N0ZXJDb25maWdzRXNsaW50UGFja2FnZShjb25maWc6IFBhY2thZ2VDb25maWcpOiBib29sZWFuIHtcbiAgcmV0dXJuIGNvbmZpZy5pc1dpbGxCb29zdGVyQ29uZmlncyAmJiBjb25maWcucGFja2FnZUpzb24/Lm5hbWU/LnN0YXJ0c1dpdGgoRVNMSU5UX0NPTkZJR19QUkVGSVgpID09PSB0cnVlO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0UGlubmVkRGVwZW5kZW5jeVNwZWNpZmllcihkZXBlbmRlbmN5OiBzdHJpbmcpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhwaW5uZWREZXBlbmRlbmN5U3BlY2lmaWVycykpIHtcbiAgICBpZiAoa2V5ID09PSBkZXBlbmRlbmN5KSB7XG4gICAgICByZXR1cm4gYCR7a2V5fUAke3ZhbHVlfWA7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHVuZGVmaW5lZDtcbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCBtZXJnZSBmcm9tICdkZWVwbWVyZ2UnO1xuaW1wb3J0IGZnIGZyb20gJ2Zhc3QtZ2xvYic7XG5pbXBvcnQgeyBzb3J0UGFja2FnZUpzb24gfSBmcm9tICdzb3J0LXBhY2thZ2UtanNvbic7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VKc29uLCBTZXRSZXF1aXJlZCB9IGZyb20gJ3R5cGUtZmVzdCc7XG5cbmltcG9ydCB7IGdldExhdGVzdENvbW1pdEhhc2ggfSBmcm9tICcuLi9naXRodWIvY29tbWl0LmpzJztcbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IEVzbGludEV4dGVuc2lvbkJhc2UsIFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IEVzbGludFV0aWwgfSBmcm9tICcuLi91dGlscy9lc2xpbnRVdGlsLmpzJztcbmltcG9ydCB7IGV4dGVuc2lvbnMgfSBmcm9tICcuLi91dGlscy9leHRlbnNpb25zLmpzJztcbmltcG9ydCB7IGZzVXRpbCB9IGZyb20gJy4uL3V0aWxzL2ZzVXRpbC5qcyc7XG5pbXBvcnQgeyBnaXRIdWJVdGlsIH0gZnJvbSAnLi4vdXRpbHMvZ2l0aHViVXRpbC5qcyc7XG5pbXBvcnQgeyBnbG9iSWdub3JlIH0gZnJvbSAnLi4vdXRpbHMvZ2xvYlV0aWwuanMnO1xuaW1wb3J0IHsgaWdub3JlRmlsZVV0aWwgfSBmcm9tICcuLi91dGlscy9pZ25vcmVGaWxlVXRpbC5qcyc7XG5pbXBvcnQgeyBjb21iaW5lTWVyZ2UgfSBmcm9tICcuLi91dGlscy9tZXJnZVV0aWwuanMnO1xuaW1wb3J0IHsgcHJvbWlzZVBvb2wgfSBmcm9tICcuLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5pbXBvcnQgeyBzcGF3blN5bmMgfSBmcm9tICcuLi91dGlscy9zcGF3blV0aWwuanMnO1xuaW1wb3J0IHsgZ2V0VHNjb25maWdCYXNlRGVwZW5kZW5jaWVzIH0gZnJvbSAnLi4vdXRpbHMvdHNjb25maWdCYXNlLmpzJztcbmltcG9ydCB7IGdldFBpbm5lZERlcGVuZGVuY3lTcGVjaWZpZXIgfSBmcm9tICcuLi91dGlscy93aWxsYm9vc3RlckNvbmZpZ3NVdGlsLmpzJztcblxuY29uc3QganNDb21tb25EZXBzID0gW1xuICAnQGVzbGludC9qcycsXG4gICdlc2xpbnQnLFxuICAnZXNsaW50LWNvbmZpZy1mbGF0LWdpdGlnbm9yZScsXG4gICdlc2xpbnQtY29uZmlnLXByZXR0aWVyJyxcbiAgJ2VzbGludC1wbHVnaW4taW1wb3J0LXgnLFxuICAnZXNsaW50LXBsdWdpbi1zb3J0LWNsYXNzLW1lbWJlcnMnLFxuICAnZXNsaW50LXBsdWdpbi1zb3J0LWRlc3RydWN0dXJlLWtleXMnLFxuICAnZXNsaW50LXBsdWdpbi11bmljb3JuJyxcbiAgJ2VzbGludC1wbHVnaW4tdW51c2VkLWltcG9ydHMnLFxuICAnZ2xvYmFscycsXG5dO1xuXG5jb25zdCB0c0NvbW1vbkRlcHMgPSBbLi4uanNDb21tb25EZXBzLCAndHlwZXNjcmlwdC1lc2xpbnQnLCAnZXNsaW50LWltcG9ydC1yZXNvbHZlci10eXBlc2NyaXB0J107XG5cbmNvbnN0IHJlYWN0Q29tbW9uRGVwcyA9IFsnZXNsaW50LXBsdWdpbi1yZWFjdCcsICdlc2xpbnQtcGx1Z2luLXJlYWN0LWhvb2tzJywgJ2VzbGludC1wbHVnaW4tcmVhY3QtY29tcGlsZXInXTtcblxuY29uc3QgZXNsaW50RGVwczogUmVjb3JkPEVzbGludEV4dGVuc2lvbkJhc2UsIHN0cmluZ1tdPiA9IHtcbiAgJ0B3aWxsYm9vc3Rlci9lc2xpbnQtY29uZmlnLWpzJzogWydAd2lsbGJvb3N0ZXIvZXNsaW50LWNvbmZpZy1qcycsIC4uLmpzQ29tbW9uRGVwc10sXG4gICdAd2lsbGJvb3N0ZXIvZXNsaW50LWNvbmZpZy1qcy1yZWFjdCc6IFsnQHdpbGxib29zdGVyL2VzbGludC1jb25maWctanMtcmVhY3QnLCAuLi5qc0NvbW1vbkRlcHMsIC4uLnJlYWN0Q29tbW9uRGVwc10sXG4gICdAd2lsbGJvb3N0ZXIvZXNsaW50LWNvbmZpZy10cyc6IFsnQHdpbGxib29zdGVyL2VzbGludC1jb25maWctdHMnLCAuLi50c0NvbW1vbkRlcHNdLFxuICAnQHdpbGxib29zdGVyL2VzbGludC1jb25maWctdHMtcmVhY3QnOiBbJ0B3aWxsYm9vc3Rlci9lc2xpbnQtY29uZmlnLXRzLXJlYWN0JywgLi4udHNDb21tb25EZXBzLCAuLi5yZWFjdENvbW1vbkRlcHNdLFxuICAnQHdpbGxib29zdGVyL2VzbGludC1jb25maWctbmV4dCc6IFtcbiAgICAnQHdpbGxib29zdGVyL2VzbGludC1jb25maWctbmV4dCcsXG4gICAgJ0BuZXh0L2VzbGludC1wbHVnaW4tbmV4dCcsXG4gICAgLi4udHNDb21tb25EZXBzLFxuICAgIC4uLnJlYWN0Q29tbW9uRGVwcyxcbiAgXSxcbn07XG5cbnR5cGUgV3JpdGFibGVQYWNrYWdlSnNvbiA9IFNldFJlcXVpcmVkPFxuICBQYWNrYWdlSnNvbixcbiAgJ3NjcmlwdHMnIHwgJ2RlcGVuZGVuY2llcycgfCAnZGV2RGVwZW5kZW5jaWVzJyB8ICdwZWVyRGVwZW5kZW5jaWVzJ1xuPjtcblxuaW50ZXJmYWNlIERlcGVuZGVuY3lVcGRhdGVzIHtcbiAgZGVwZW5kZW5jaWVzOiBzdHJpbmdbXTtcbiAgZGV2RGVwZW5kZW5jaWVzOiBzdHJpbmdbXTtcbiAgcG9ldHJ5RGV2RGVwZW5kZW5jaWVzOiBzdHJpbmdbXTtcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlUGFja2FnZUpzb24oXG4gIGNvbmZpZzogUGFja2FnZUNvbmZpZyxcbiAgcm9vdENvbmZpZzogUGFja2FnZUNvbmZpZyxcbiAgc2tpcEFkZGluZ0RlcHM6IGJvb2xlYW5cbik6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2dlbmVyYXRlUGFja2FnZUpzb24nLCBhc3luYyAoKSA9PiB7XG4gICAgYXdhaXQgY29yZShjb25maWcsIHJvb3RDb25maWcsIHNraXBBZGRpbmdEZXBzKTtcbiAgfSk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGNvcmUoY29uZmlnOiBQYWNrYWdlQ29uZmlnLCByb290Q29uZmlnOiBQYWNrYWdlQ29uZmlnLCBza2lwQWRkaW5nRGVwczogYm9vbGVhbik6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBmaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJ3BhY2thZ2UuanNvbicpO1xuICBjb25zdCBqc29uT2JqID0gYXdhaXQgcmVhZFBhY2thZ2VKc29uKGZpbGVQYXRoKTtcbiAgY29uc3QgcGFja2FnZU1hbmFnZXIgPSBjb25maWcuaXNCdW4gPyAnYnVuJyA6ICd5YXJuJztcblxuICBhd2FpdCByZW1vdmVEZXByZWNhdGVkU3R1ZmYoanNvbk9iaiwgY29uZmlnLmRpclBhdGgpO1xuICBhd2FpdCB1cGRhdGVTY3JpcHRzKGNvbmZpZywganNvbk9iaiwgcGFja2FnZU1hbmFnZXIpO1xuICBjb25zdCBkZXBlbmRlbmN5VXBkYXRlcyA9IGFwcGx5UGFja2FnZUpzb25Db252ZW50aW9ucyhjb25maWcsIHJvb3RDb25maWcsIGpzb25PYmopO1xuICBhd2FpdCBub3JtYWxpemVQYWNrYWdlTWV0YWRhdGEoY29uZmlnLCByb290Q29uZmlnLCBqc29uT2JqLCBkZXBlbmRlbmN5VXBkYXRlcyk7XG4gIGFkZERlcGVuZGVuY3lWZXJzaW9uc1RvUGFja2FnZUpzb24oanNvbk9iaiwgZGVwZW5kZW5jeVVwZGF0ZXMpO1xuICBhd2FpdCB1cGRhdGVQcml2YXRlUGFja2FnZXMoanNvbk9iaik7XG4gIHJlbW92ZUVtcHR5RGVwZW5kZW5jeVNlY3Rpb25zKGpzb25PYmopO1xuXG4gIGlmIChjb25maWcuaXNCdW4pIGRlbGV0ZSBqc29uT2JqLnBhY2thZ2VNYW5hZ2VyO1xuICBhd2FpdCBmaXhTY3JpcHROYW1lcyhqc29uT2JqLnNjcmlwdHMsIGNvbmZpZyk7XG4gIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiBmc1V0aWwuZ2VuZXJhdGVGaWxlKGZpbGVQYXRoLCBKU09OLnN0cmluZ2lmeShzb3J0UGFja2FnZUpzb24oanNvbk9iaiksIHVuZGVmaW5lZCwgMikpKTtcblxuICBpZiAoIXNraXBBZGRpbmdEZXBzKSB7XG4gICAgaW5zdGFsbERlcGVuZGVuY3lVcGRhdGVzKGNvbmZpZywganNvbk9iaiwgZGVwZW5kZW5jeVVwZGF0ZXMsIHBhY2thZ2VNYW5hZ2VyKTtcbiAgfVxufVxuXG5hc3luYyBmdW5jdGlvbiByZWFkUGFja2FnZUpzb24oZmlsZVBhdGg6IHN0cmluZyk6IFByb21pc2U8V3JpdGFibGVQYWNrYWdlSnNvbj4ge1xuICBjb25zdCBqc29uVGV4dCA9IGF3YWl0IGZzLnByb21pc2VzLnJlYWRGaWxlKGZpbGVQYXRoLCAndXRmOCcpO1xuICBjb25zdCBqc29uT2JqID0gSlNPTi5wYXJzZShqc29uVGV4dCkgYXMgUGFja2FnZUpzb247XG4gIGpzb25PYmouc2NyaXB0cyA9IGpzb25PYmouc2NyaXB0cyA/PyB7fTtcbiAganNvbk9iai5kZXBlbmRlbmNpZXMgPSBqc29uT2JqLmRlcGVuZGVuY2llcyA/PyB7fTtcbiAganNvbk9iai5kZXZEZXBlbmRlbmNpZXMgPSBqc29uT2JqLmRldkRlcGVuZGVuY2llcyA/PyB7fTtcbiAganNvbk9iai5wZWVyRGVwZW5kZW5jaWVzID0ganNvbk9iai5wZWVyRGVwZW5kZW5jaWVzID8/IHt9O1xuICByZXR1cm4ganNvbk9iaiBhcyBXcml0YWJsZVBhY2thZ2VKc29uO1xufVxuXG5hc3luYyBmdW5jdGlvbiB1cGRhdGVTY3JpcHRzKFxuICBjb25maWc6IFBhY2thZ2VDb25maWcsXG4gIGpzb25PYmo6IFdyaXRhYmxlUGFja2FnZUpzb24sXG4gIHBhY2thZ2VNYW5hZ2VyOiAnYnVuJyB8ICd5YXJuJ1xuKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJlbW92ZUxlZ2FjeUluc3RhbGxDb21tYW5kcyhqc29uT2JqLnNjcmlwdHMpO1xuXG4gIGpzb25PYmouc2NyaXB0cyA9IHsgLi4uanNvbk9iai5zY3JpcHRzLCAuLi5nZW5lcmF0ZVNjcmlwdHMoY29uZmlnLCBqc29uT2JqLnNjcmlwdHMpIH07XG4gIGFkZFN0YXJ0VGVzdFNlcnZlclNjcmlwdElmTmVlZGVkKGNvbmZpZywganNvbk9iaik7XG4gIGFkZEluc3RhbGxTdGVwVG9DaGVja0ZvckFpKGpzb25PYmouc2NyaXB0cywgcGFja2FnZU1hbmFnZXIpO1xuXG4gIGlmIChjb25maWcuaXNCdW4pIHtcbiAgICBkZWxldGUganNvbk9iai5zY3JpcHRzLnByZXR0aWZ5O1xuICB9IGVsc2Uge1xuICAgIGpzb25PYmouc2NyaXB0cy5wcmV0dGlmeSA9IChqc29uT2JqLnNjcmlwdHMucHJldHRpZnkgPz8gJycpICsgKGF3YWl0IGdlbmVyYXRlUHJldHRpZXJTdWZmaXgoY29uZmlnLmRpclBhdGgpKTtcbiAgfVxuICBub3JtYWxpemVZYXJuV29ya3NwYWNlRm9yZWFjaFNjcmlwdHMoanNvbk9iai5zY3JpcHRzKTtcbn1cblxuZnVuY3Rpb24gcmVtb3ZlTGVnYWN5SW5zdGFsbENvbW1hbmRzKHNjcmlwdHM6IFBhY2thZ2VKc29uLlNjcmlwdHMpOiB2b2lkIHtcbiAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMoc2NyaXB0cykpIHtcbiAgICBpZiAodHlwZW9mIHZhbHVlICE9PSAnc3RyaW5nJykgY29udGludWU7XG4gICAgLy8gRnJlc2ggcmVwb3Mgc3RpbGwgcmVxdWlyZSBzdGFuZGFsb25lIGB5YXJuIGluc3RhbGxgOyBvbmx5IHJlbW92ZSBsZWdhY3kgaW5zdGFsbCBwcmVmaXhlcyBiZWZvcmUgYW5vdGhlciBjb21tYW5kLlxuICAgIGlmICghdmFsdWUuaW5jbHVkZXMoJ2dpdCBjbG9uZScpKSB7XG4gICAgICBzY3JpcHRzW2tleV0gPSB2YWx1ZS5yZXBsYWNlQWxsKC95YXJuXFxzKig/Omluc3RhbGxcXHMqKT8mJlxccyovZ3UsICcnKTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gYWRkSW5zdGFsbFN0ZXBUb0NoZWNrRm9yQWkoc2NyaXB0czogUGFja2FnZUpzb24uU2NyaXB0cywgcGFja2FnZU1hbmFnZXI6ICdidW4nIHwgJ3lhcm4nKTogdm9pZCB7XG4gIGlmICghKCdjaGVjay1mb3ItYWknIGluIHNjcmlwdHMpKSByZXR1cm47XG5cbiAgaWYgKCdnZW4tY29kZScgaW4gc2NyaXB0cykge1xuICAgIHNjcmlwdHNbJ2NoZWNrLWZvci1haSddID0gYCR7cGFja2FnZU1hbmFnZXJ9IGdlbi1jb2RlID4gL2Rldi9udWxsICYmICR7c2NyaXB0c1snY2hlY2stZm9yLWFpJ119YDtcbiAgfVxuICBzY3JpcHRzWydjaGVjay1mb3ItYWknXSA9IGAke3BhY2thZ2VNYW5hZ2VyfSBpbnN0YWxsID4gL2Rldi9udWxsICYmICR7c2NyaXB0c1snY2hlY2stZm9yLWFpJ119YDtcbn1cblxuZnVuY3Rpb24gbm9ybWFsaXplWWFybldvcmtzcGFjZUZvcmVhY2hTY3JpcHRzKHNjcmlwdHM6IFBhY2thZ2VKc29uLlNjcmlwdHMpOiB2b2lkIHtcbiAgLy8gRGVhbCB3aXRoIGJyZWFraW5nIGNoYW5nZXMgaW4geWFybiBiZXJyeSA0LjAuMC1yYy40OVxuICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhzY3JpcHRzKSkge1xuICAgIGlmICghdmFsdWU/LmluY2x1ZGVzKCd5YXJuIHdvcmtzcGFjZXMgZm9yZWFjaCcpKSBjb250aW51ZTtcbiAgICBzY3JpcHRzW2tleV0gPSB2YWx1ZS5yZXBsYWNlQWxsKFxuICAgICAgL3lhcm4gd29ya3NwYWNlcyBmb3JlYWNoKD8hXFxzKyg/Oi1BfC1SfC0tKD86YWxsfHJlY3Vyc2l2ZXxzaW5jZXx3b3JrdHJlZXxmcm9tfGluY2x1ZGV8ZXhjbHVkZXxwdWJsaWN8cHJpdmF0ZSkpKS9ndSxcbiAgICAgICd5YXJuIHdvcmtzcGFjZXMgZm9yZWFjaCAtLWFsbCdcbiAgICApO1xuICB9XG59XG5cbmZ1bmN0aW9uIGFwcGx5UGFja2FnZUpzb25Db252ZW50aW9ucyhcbiAgY29uZmlnOiBQYWNrYWdlQ29uZmlnLFxuICByb290Q29uZmlnOiBQYWNrYWdlQ29uZmlnLFxuICBqc29uT2JqOiBXcml0YWJsZVBhY2thZ2VKc29uXG4pOiBEZXBlbmRlbmN5VXBkYXRlcyB7XG4gIGNvbnN0IGRlcGVuZGVuY2llczogc3RyaW5nW10gPSBbXTtcbiAgY29uc3QgZGV2RGVwZW5kZW5jaWVzID0gWydwcmV0dGllcicsICdzb3J0LXBhY2thZ2UtanNvbiddO1xuICBjb25zdCBwb2V0cnlEZXZEZXBlbmRlbmNpZXM6IHN0cmluZ1tdID0gW107XG5cbiAgaWYgKFxuICAgICFmcy5leGlzdHNTeW5jKHBhdGguam9pbihyb290Q29uZmlnLmRpclBhdGgsICcucHJldHRpZXJyYy5qc29uJykpICYmXG4gICAgIWZzLmV4aXN0c1N5bmMocGF0aC5qb2luKGNvbmZpZy5kaXJQYXRoLCAnLnByZXR0aWVycmMuanNvbicpKVxuICApIHtcbiAgICBqc29uT2JqLnByZXR0aWVyID0gJ0B3aWxsYm9vc3Rlci9wcmV0dGllci1jb25maWcnO1xuICAgIGRldkRlcGVuZGVuY2llcy5wdXNoKCdwcmV0dGllci1wbHVnaW4tamF2YScsICdAd2lsbGJvb3N0ZXIvcHJldHRpZXItY29uZmlnJyk7XG4gIH1cblxuICBkZWxldGUganNvbk9iai5kZXZEZXBlbmRlbmNpZXNbJ2xpbnQtc3RhZ2VkJ107XG4gIGRlbGV0ZSAoanNvbk9iaiBhcyBQYWNrYWdlSnNvbiAmIHsgJ2xpbnQtc3RhZ2VkJz86IHVua25vd24gfSlbJ2xpbnQtc3RhZ2VkJ107XG5cbiAgaWYgKGNvbmZpZy5pc1Jvb3QpIHtcbiAgICBkZWxldGUganNvbk9iai5kZXZEZXBlbmRlbmNpZXMuaHVza3k7XG4gICAgZGVsZXRlIGpzb25PYmouc2NyaXB0cy5wb3N0aW5zdGFsbDtcbiAgICBkZWxldGUganNvbk9iai5zY3JpcHRzLnBvc3RwdWJsaXNoO1xuICAgIGRlbGV0ZSBqc29uT2JqLnNjcmlwdHMucHJlcHVibGlzaE9ubHk7XG4gICAgZGVsZXRlIGpzb25PYmouc2NyaXB0cy5wcmVwYWNrO1xuICAgIGRlbGV0ZSBqc29uT2JqLnNjcmlwdHMucG9zdHBhY2s7XG4gICAganNvbk9iai5zY3JpcHRzLnByZXBhcmUgPSAnbGVmdGhvb2sgaW5zdGFsbCB8fCB0cnVlJztcbiAgICBkZXZEZXBlbmRlbmNpZXMucHVzaCgnbGVmdGhvb2snKTtcblxuICAgIGlmIChjb25maWcuZGVwZW5kaW5nLnNlbWFudGljUmVsZWFzZSkge1xuICAgICAgaWYgKFxuICAgICAgICAhanNvbk9iai5kZXZEZXBlbmRlbmNpZXNbJ3NlbWFudGljLXJlbGVhc2UnXSAmJlxuICAgICAgICAhanNvbk9iai5kZXZEZXBlbmRlbmNpZXNbJ211bHRpLXNlbWFudGljLXJlbGVhc2UnXSAmJlxuICAgICAgICAhanNvbk9iai5kZXZEZXBlbmRlbmNpZXNbJ0BxaXdpL211bHRpLXNlbWFudGljLXJlbGVhc2UnXVxuICAgICAgKSB7XG4gICAgICAgIGRldkRlcGVuZGVuY2llcy5wdXNoKCdzZW1hbnRpYy1yZWxlYXNlJyk7XG4gICAgICB9XG4gICAgICBqc29uT2JqLnZlcnNpb24gPSAnMC4wLjAtc2VtYW50aWNhbGx5LXJlbGVhc2VkJztcbiAgICB9XG5cbiAgICBpZiAoY29uZmlnLmRlcGVuZGluZy5wbGF5d3JpZ2h0VGVzdCkge1xuICAgICAgLy8gU2luY2UgYXJ0aWxsZXJ5IHJlcXVpcmVzIGEgc3BlY2lmaWMgdmVyc2lvbiBvZiBAcGxheXdyaWdodC90ZXN0XG4gICAgICBjb25zdCBoYXNBcnRpbGxlcnkgPSBqc29uT2JqLmRlcGVuZGVuY2llcy5hcnRpbGxlcnkgfHwganNvbk9iai5kZXZEZXBlbmRlbmNpZXMuYXJ0aWxsZXJ5O1xuICAgICAgLy8gU2luY2UgbGxtLXRvb2xib3ggcmVxdWlyZXMgQHBsYXl3cmlnaHQvdGVzdCBpbiBkZXBlbmRlbmNpZXNcbiAgICAgIGlmICghaGFzQXJ0aWxsZXJ5ICYmICFqc29uT2JqLmRlcGVuZGVuY2llc1snQHBsYXl3cmlnaHQvdGVzdCddKSB7XG4gICAgICAgIGRldkRlcGVuZGVuY2llcy5wdXNoKCdAcGxheXdyaWdodC90ZXN0Jyk7XG4gICAgICB9XG4gICAgICBkZWxldGUganNvbk9iai5kZXBlbmRlbmNpZXMucGxheXdyaWdodDtcbiAgICAgIGRlbGV0ZSBqc29uT2JqLmRldkRlcGVuZGVuY2llcy5wbGF5d3JpZ2h0O1xuICAgIH1cblxuICAgIGlmIChjb25maWcuZG9lc0NvbnRhaW5TdWJQYWNrYWdlSnNvbnMpIHtcbiAgICAgIC8vIFdlIGRvbid0IGFsbG93IG5vbi1hcnJheSB3b3Jrc3BhY2VzIGluIG1vbm9yZXBvLlxuICAgICAganNvbk9iai53b3Jrc3BhY2VzID0gQXJyYXkuaXNBcnJheShqc29uT2JqLndvcmtzcGFjZXMpXG4gICAgICAgID8gbWVyZ2UuYWxsKFtqc29uT2JqLndvcmtzcGFjZXMsIFsncGFja2FnZXMvKiddXSwge1xuICAgICAgICAgICAgYXJyYXlNZXJnZTogY29tYmluZU1lcmdlLFxuICAgICAgICAgIH0pXG4gICAgICAgIDogWydwYWNrYWdlcy8qJ107XG4gICAgfSBlbHNlIGlmIChBcnJheS5pc0FycmF5KGpzb25PYmoud29ya3NwYWNlcykpIHtcbiAgICAgIGpzb25PYmoud29ya3NwYWNlcyA9IGpzb25PYmoud29ya3NwYWNlcy5maWx0ZXIoXG4gICAgICAgICh3b3Jrc3BhY2UpID0+XG4gICAgICAgICAgZmcuZ2xvYlN5bmMod29ya3NwYWNlLCB7XG4gICAgICAgICAgICBkb3Q6IHRydWUsXG4gICAgICAgICAgICBjd2Q6IGNvbmZpZy5kaXJQYXRoLFxuICAgICAgICAgICAgaWdub3JlOiBnbG9iSWdub3JlLFxuICAgICAgICAgIH0pLmxlbmd0aCA+IDBcbiAgICAgICk7XG4gICAgICBpZiAoanNvbk9iai53b3Jrc3BhY2VzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICBkZWxldGUganNvbk9iai53b3Jrc3BhY2VzO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGlmIChjb25maWcuZGVwZW5kaW5nLndiIHx8IGNvbmZpZy5pc0J1bikge1xuICAgIGlmIChqc29uT2JqLmRlcGVuZGVuY2llc1snQHdpbGxib29zdGVyL3diJ10pIHtcbiAgICAgIGRlcGVuZGVuY2llcy5wdXNoKCdAd2lsbGJvb3N0ZXIvd2InKTtcbiAgICB9IGVsc2Uge1xuICAgICAgZGV2RGVwZW5kZW5jaWVzLnB1c2goJ0B3aWxsYm9vc3Rlci93YicpO1xuICAgIH1cbiAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhqc29uT2JqLnNjcmlwdHMpKSB7XG4gICAgICBpZiAodHlwZW9mIHZhbHVlICE9PSAnc3RyaW5nJykgY29udGludWU7XG4gICAgICBqc29uT2JqLnNjcmlwdHNba2V5XSA9IHZhbHVlLnJlcGxhY2VBbGwoL3diXFxzK2RiL2d1LCAnd2IgcHJpc21hJyk7XG4gICAgfVxuICB9XG5cbiAgY29uc3QgZG9lc0NvbnRhaW5Kc09yVHMgPVxuICAgIGNvbmZpZy5kb2VzQ29udGFpbkphdmFTY3JpcHQgfHxcbiAgICBjb25maWcuZG9lc0NvbnRhaW5KYXZhU2NyaXB0SW5QYWNrYWdlcyB8fFxuICAgIGNvbmZpZy5kb2VzQ29udGFpblR5cGVTY3JpcHQgfHxcbiAgICBjb25maWcuZG9lc0NvbnRhaW5UeXBlU2NyaXB0SW5QYWNrYWdlcztcbiAgaWYgKGRvZXNDb250YWluSnNPclRzKSB7XG4gICAgaWYgKGNvbmZpZy5pc0J1bikge1xuICAgICAgZGV2RGVwZW5kZW5jaWVzLnB1c2goJ0BiaW9tZWpzL2Jpb21lJywgJ0B3aWxsYm9vc3Rlci9iaW9tZS1jb25maWcnKTtcbiAgICAgIGRlbGV0ZSBqc29uT2JqLmRldkRlcGVuZGVuY2llcy5lc2xpbnQ7XG4gICAgICBkZWxldGUganNvbk9iai5kZXZEZXBlbmRlbmNpZXMubWljcm9tYXRjaDtcbiAgICAgIGRlbGV0ZSBqc29uT2JqLmRldkRlcGVuZGVuY2llc1sndHlwZXNjcmlwdC1lc2xpbnQnXTtcbiAgICB9IGVsc2Uge1xuICAgICAgZGV2RGVwZW5kZW5jaWVzLnB1c2goJ2VzbGludCcsICdtaWNyb21hdGNoJyk7XG4gICAgfVxuICB9XG5cbiAgaWYgKGRvZXNDb250YWluSnNPclRzKSB7XG4gICAgZGV2RGVwZW5kZW5jaWVzLnB1c2goLi4uZ2V0VHNjb25maWdCYXNlRGVwZW5kZW5jaWVzKGNvbmZpZykpO1xuICB9XG5cbiAgaWYgKGNvbmZpZy5kb2VzQ29udGFpblR5cGVTY3JpcHQgfHwgY29uZmlnLmRvZXNDb250YWluVHlwZVNjcmlwdEluUGFja2FnZXMpIHtcbiAgICBkZXZEZXBlbmRlbmNpZXMucHVzaCgndHlwZXNjcmlwdCcpO1xuICAgIGlmIChjb25maWcuaXNCdW4pIHtcbiAgICAgIGRldkRlcGVuZGVuY2llcy5wdXNoKCdAdHlwZXMvYnVuJyk7XG4gICAgfSBlbHNlIGlmICghY29uZmlnLmRlcGVuZGluZy5yZWFjdE5hdGl2ZSkge1xuICAgICAgZGV2RGVwZW5kZW5jaWVzLnB1c2goJ0B0eXBlcy9ub2RlJyk7XG4gICAgfVxuICAgIGlmIChcbiAgICAgIGpzb25PYmouZGVwZW5kZW5jaWVzLmplc3QgfHxcbiAgICAgIGpzb25PYmouZGV2RGVwZW5kZW5jaWVzLmplc3QgfHxcbiAgICAgIGpzb25PYmouZGVwZW5kZW5jaWVzWydAamVzdC9nbG9iYWxzJ10gfHxcbiAgICAgIGpzb25PYmouZGV2RGVwZW5kZW5jaWVzWydAamVzdC9nbG9iYWxzJ10gfHxcbiAgICAgIGpzb25PYmouZGVwZW5kZW5jaWVzWyd0cy1qZXN0J10gfHxcbiAgICAgIGpzb25PYmouZGV2RGVwZW5kZW5jaWVzWyd0cy1qZXN0J11cbiAgICApIHtcbiAgICAgIGRldkRlcGVuZGVuY2llcy5wdXNoKCdAdHlwZXMvamVzdCcpO1xuICAgIH1cbiAgfVxuXG4gIGlmIChjb25maWcuZXNsaW50QmFzZSkge1xuICAgIGRldkRlcGVuZGVuY2llcy5wdXNoKC4uLmVzbGludERlcHNbY29uZmlnLmVzbGludEJhc2VdKTtcbiAgfVxuXG4gIGlmIChjb25maWcuaXNXaWxsQm9vc3RlckNvbmZpZ3MpIHtcbiAgICByZXR1cm4ge1xuICAgICAgZGVwZW5kZW5jaWVzOiBkZXBlbmRlbmNpZXMuZmlsdGVyKChkZXApID0+ICFkZXAuaW5jbHVkZXMoJ0B3aWxsYm9vc3Rlci8nKSksXG4gICAgICBkZXZEZXBlbmRlbmNpZXM6IGRldkRlcGVuZGVuY2llcy5maWx0ZXIoKGRlcCkgPT4gIWRlcC5pbmNsdWRlcygnQHdpbGxib29zdGVyLycpKSxcbiAgICAgIHBvZXRyeURldkRlcGVuZGVuY2llcyxcbiAgICB9O1xuICB9XG5cbiAgcmV0dXJuIHsgZGVwZW5kZW5jaWVzLCBkZXZEZXBlbmRlbmNpZXMsIHBvZXRyeURldkRlcGVuZGVuY2llcyB9O1xufVxuXG5hc3luYyBmdW5jdGlvbiBub3JtYWxpemVQYWNrYWdlTWV0YWRhdGEoXG4gIGNvbmZpZzogUGFja2FnZUNvbmZpZyxcbiAgcm9vdENvbmZpZzogUGFja2FnZUNvbmZpZyxcbiAganNvbk9iajogV3JpdGFibGVQYWNrYWdlSnNvbixcbiAgZGVwZW5kZW5jeVVwZGF0ZXM6IERlcGVuZGVuY3lVcGRhdGVzXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgaWYgKCFqc29uT2JqLm5hbWUpIHtcbiAgICBqc29uT2JqLm5hbWUgPSBwYXRoLmJhc2VuYW1lKGNvbmZpZy5kaXJQYXRoKTtcbiAgfVxuXG4gIGlmIChjb25maWcuZG9lc0NvbnRhaW5TdWJQYWNrYWdlSnNvbnMpIHtcbiAgICBqc29uT2JqLnByaXZhdGUgPSB0cnVlO1xuICB9XG4gIGlmICghanNvbk9iai5saWNlbnNlKSB7XG4gICAganNvbk9iai5saWNlbnNlID0gJ1VOTElDRU5TRUQnO1xuICB9XG4gIGlmICghanNvbk9iai5wcml2YXRlICYmIGpzb25PYmoubGljZW5zZSAhPT0gJ1VOTElDRU5TRUQnICYmIHJvb3RDb25maWcuaXNQdWJsaWNSZXBvKSB7XG4gICAganNvbk9iai5wdWJsaXNoQ29uZmlnID8/PSB7fTtcbiAgICBqc29uT2JqLnB1Ymxpc2hDb25maWcuYWNjZXNzID8/PSAncHVibGljJztcbiAgfVxuICBjb25zdCBbb3duZXJdID0gZ2l0SHViVXRpbC5nZXRPcmdBbmROYW1lKGNvbmZpZy5yZXBvc2l0b3J5ID8/ICcnKTtcbiAgaWYgKG93bmVyID09PSAnV2lsbEJvb3N0ZXInIHx8IG93bmVyID09PSAnV2lsbEJvb3N0ZXJMYWInKSB7XG4gICAganNvbk9iai5hdXRob3IgPSAnV2lsbEJvb3N0ZXIgSW5jLic7XG4gIH1cbiAgaWYgKCFjb25maWcuaXNSb290ICYmIGpzb25PYmoucHJpdmF0ZSAmJiAhanNvbk9iai5tYWluKSB7XG4gICAgLy8gTWFrZSBWU0NvZGUgcG9zc2libGUgdG8gcmVmYWN0b3IgY29kZSBhY3Jvc3Mgc3VicGFja2FnZXMuXG4gICAganNvbk9iai5tYWluID0gJy4vc3JjJztcbiAgfVxuXG4gIC8vIFlhcm4gdHJlYXRzIHRoZSBsZWdhY3kgbnBtL2NoYWxrIHJlc29sdXRpb24gYWxpYXMgYXMgYW4gaW52YWxpZCBwYWNrYWdlIHRva2VuLlxuICBkZWxldGUganNvbk9iai5yZXNvbHV0aW9ucz8uWyducG0vY2hhbGsnXTtcblxuICBpZiAoIWNvbmZpZy5kb2VzQ29udGFpblN1YlBhY2thZ2VKc29ucykge1xuICAgIGlmICghY29uZmlnLmlzQnVuKSB7XG4gICAgICBpZiAoIWNvbmZpZy5kb2VzQ29udGFpbkphdmFTY3JpcHQgJiYgIWNvbmZpZy5kb2VzQ29udGFpblR5cGVTY3JpcHQpIHtcbiAgICAgICAgZGVsZXRlIGpzb25PYmouc2NyaXB0cy5saW50O1xuICAgICAgICBkZWxldGUganNvbk9iai5zY3JpcHRzWydsaW50LWZpeCddO1xuICAgICAgICBmb3IgKGNvbnN0IHNjcmlwdE5hbWUgb2YgWydjbGVhbnVwJywgJ2NoZWNrLWZvci1haSddKSB7XG4gICAgICAgICAgY29uc3Qgc2NyaXB0ID0ganNvbk9iai5zY3JpcHRzW3NjcmlwdE5hbWVdO1xuICAgICAgICAgIGlmICghc2NyaXB0KSBjb250aW51ZTtcbiAgICAgICAgICBqc29uT2JqLnNjcmlwdHNbc2NyaXB0TmFtZV0gPSBzY3JpcHQucmVwbGFjZSgvID8mJiA/eWFybiBsaW50LWZpeCg/OiAtLXF1aWV0KT8vLCAnJyk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGpzb25PYmouc2NyaXB0c1snbGludC1maXgnXSA9IChqc29uT2JqLnNjcmlwdHNbJ2xpbnQtZml4J10gPz8gJycpICsgRXNsaW50VXRpbC5nZXRMaW50Rml4U3VmZml4KGNvbmZpZyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGNvbmZpZy5kb2VzQ29udGFpblB1YnNwZWNZYW1sKSB7XG4gICAgICBqc29uT2JqLnNjcmlwdHMubGludCA9ICdmbHV0dGVyIGFuYWx5emUnO1xuICAgICAganNvbk9iai5zY3JpcHRzWydsaW50LWZpeCddID0gJ3lhcm4gbGludCc7XG4gICAgICBjb25zdCBkaXJzID0gWydsaWInLCAndGVzdCcsICd0ZXN0X2RyaXZlciddLmZpbHRlcigoZGlyKSA9PiBmcy5leGlzdHNTeW5jKHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgZGlyKSkpO1xuICAgICAgaWYgKGRpcnMubGVuZ3RoID4gMCkge1xuICAgICAgICBqc29uT2JqLnNjcmlwdHNbJ2Zvcm1hdC1jb2RlJ10gPSBgZGFydCBmb3JtYXQgJChmaW5kICR7ZGlycy5qb2luKFxuICAgICAgICAgICcgJ1xuICAgICAgICApfSAtbmFtZSBnZW5lcmF0ZWQgLXBydW5lIC1vIC1uYW1lICcqLmZyZWV6ZWQuZGFydCcgLXBydW5lIC1vIC1uYW1lICcqLmcuZGFydCcgLXBydW5lIC1vIC1uYW1lICcqLmRhcnQnIC1wcmludClgO1xuICAgICAgICBqc29uT2JqLnNjcmlwdHMuZm9ybWF0ID0gKGpzb25PYmouc2NyaXB0cy5mb3JtYXQgPz8gJycpICsgYCAmJiB5YXJuIGZvcm1hdC1jb2RlYDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoY29uZmlnLmRvZXNDb250YWluUG9ldHJ5TG9jaykge1xuICAgICAgaWYgKGpzb25PYmouc2NyaXB0cy5wb3N0aW5zdGFsbCA9PT0gJ3BvZXRyeSBpbnN0YWxsJykge1xuICAgICAgICBkZWxldGUganNvbk9iai5zY3JpcHRzLnBvc3RpbnN0YWxsO1xuICAgICAgfVxuICAgICAgY29uc3QgcHl0aG9uRmlsZXMgPSBhd2FpdCBmZy5nbG9iKCcqKi8qLnB5Jywge1xuICAgICAgICBjd2Q6IGNvbmZpZy5kaXJQYXRoLFxuICAgICAgICBkb3Q6IHRydWUsXG4gICAgICAgIGlnbm9yZTogZ2xvYklnbm9yZSxcbiAgICAgIH0pO1xuICAgICAgY29uc3QgZGlyTmFtZVNldCA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICAgICAgZm9yIChjb25zdCBweXRob25GaWxlIG9mIHB5dGhvbkZpbGVzKSB7XG4gICAgICAgIGNvbnN0IFtmaXJzdCwgc2Vjb25kXSA9IHB5dGhvbkZpbGUuc3BsaXQoJy8nKTtcbiAgICAgICAgaWYgKGZpcnN0ICYmIHNlY29uZCkge1xuICAgICAgICAgIGRpck5hbWVTZXQuYWRkKGZpcnN0KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKGRpck5hbWVTZXQuc2l6ZSA+IDApIHtcbiAgICAgICAgY29uc3QgZGlyTmFtZXNTdHIgPSBbLi4uZGlyTmFtZVNldF0uam9pbignICcpO1xuICAgICAgICBqc29uT2JqLnNjcmlwdHNbJ2Zvcm1hdC1jb2RlJ10gPVxuICAgICAgICAgIGBwb2V0cnkgcnVuIGlzb3J0IC0tcHJvZmlsZSBibGFjayAke2Rpck5hbWVzU3RyfSAmJiBwb2V0cnkgcnVuIGJsYWNrICR7ZGlyTmFtZXNTdHJ9YDtcbiAgICAgICAgaWYgKGpzb25PYmouc2NyaXB0cy5saW50KSB7XG4gICAgICAgICAganNvbk9iai5zY3JpcHRzLmxpbnQgPSBgcG9ldHJ5IHJ1biBmbGFrZTggJHtkaXJOYW1lc1N0cn0gJiYgJHtqc29uT2JqLnNjcmlwdHMubGludH1gO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGpzb25PYmouc2NyaXB0cy5saW50ID0gYHBvZXRyeSBydW4gZmxha2U4ICR7ZGlyTmFtZXNTdHJ9YDtcbiAgICAgICAgICBqc29uT2JqLnNjcmlwdHNbJ2xpbnQtZml4J10gPSAneWFybiBsaW50JztcbiAgICAgICAgfVxuICAgICAgICBqc29uT2JqLnNjcmlwdHMuZm9ybWF0ID0gKGpzb25PYmouc2NyaXB0cy5mb3JtYXQgPz8gJycpICsgYCAmJiB5YXJuIGZvcm1hdC1jb2RlYDtcbiAgICAgICAgZGVwZW5kZW5jeVVwZGF0ZXMucG9ldHJ5RGV2RGVwZW5kZW5jaWVzLnB1c2goJ2JsYWNrJywgJ2lzb3J0JywgJ2ZsYWtlOCcpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGlmIChjb25maWcucmVwb3NpdG9yeSB8fCBqc29uT2JqLnJlcG9zaXRvcnkpIHtcbiAgICBqc29uT2JqLnJlcG9zaXRvcnkgPSBmb3JtYXRSZXBvc2l0b3J5Rm9yUGFja2FnZUpzb24oY29uZmlnLnJlcG9zaXRvcnkgPz8ganNvbk9iai5yZXBvc2l0b3J5LCBqc29uT2JqLnJlcG9zaXRvcnkpO1xuICB9XG5cbiAgaWYgKGNvbmZpZy5kZXBlbmRpbmcuYmxpdHopIHtcbiAgICBpZiAoIWpzb25PYmouc2NyaXB0c1snZ2VuLWNvZGUnXT8uc3RhcnRzV2l0aCgnYmxpdHogY29kZWdlbicpKSB7XG4gICAgICBqc29uT2JqLnNjcmlwdHNbJ2dlbi1jb2RlJ10gPSAnYmxpdHogY29kZWdlbic7XG4gICAgfSBlbHNlIGlmICghanNvbk9iai5zY3JpcHRzWydnZW4tY29kZSddLmluY2x1ZGVzKCdibGl0eiBwcmlzbWEgZ2VuZXJhdGUnKSkge1xuICAgICAganNvbk9iai5zY3JpcHRzWydnZW4tY29kZSddID0ganNvbk9iai5zY3JpcHRzWydnZW4tY29kZSddLnJlcGxhY2UoXG4gICAgICAgICdibGl0eiBjb2RlZ2VuJyxcbiAgICAgICAgJ2JsaXR6IGNvZGVnZW4gJiYgYmxpdHogcHJpc21hIGdlbmVyYXRlJ1xuICAgICAgKTtcbiAgICB9XG4gIH0gZWxzZSBpZiAoY29uZmlnLmRlcGVuZGluZy5wcmlzbWEgJiYgIWpzb25PYmouc2NyaXB0c1snZ2VuLWNvZGUnXT8uc3RhcnRzV2l0aCgncHJpc21hIGdlbmVyYXRlJykpIHtcbiAgICBqc29uT2JqLnNjcmlwdHNbJ2dlbi1jb2RlJ10gPSAncHJpc21hIGdlbmVyYXRlJztcbiAgfVxuXG4gIGlmICghanNvbk9iai5kZXBlbmRlbmNpZXMucHJldHRpZXIpIHtcbiAgICAvLyBCZWNhdXNlIEB0eXBlcy9wcmV0dGllciBibG9ja3MgcHJldHRpZXIgZXhlY3V0aW9uLlxuICAgIGRlbGV0ZSBqc29uT2JqLmRldkRlcGVuZGVuY2llc1snQHR5cGVzL3ByZXR0aWVyJ107XG4gIH1cbn1cblxuZnVuY3Rpb24gYWRkRGVwZW5kZW5jeVZlcnNpb25zVG9QYWNrYWdlSnNvbihqc29uT2JqOiBXcml0YWJsZVBhY2thZ2VKc29uLCBkZXBlbmRlbmN5VXBkYXRlczogRGVwZW5kZW5jeVVwZGF0ZXMpOiB2b2lkIHtcbiAgY29uc3QgcGFja2FnZUpzb25EZXBlbmRlbmNpZXMgPSBqc29uT2JqLmRlcGVuZGVuY2llcztcbiAgY29uc3QgcGFja2FnZUpzb25EZXZEZXBlbmRlbmNpZXMgPSBqc29uT2JqLmRldkRlcGVuZGVuY2llcztcbiAgZGVwZW5kZW5jeVVwZGF0ZXMuZGVwZW5kZW5jaWVzID0gYWRkUGFja2FnZUpzb25EZXBlbmRlbmNpZXMocGFja2FnZUpzb25EZXBlbmRlbmNpZXMsIGRlcGVuZGVuY3lVcGRhdGVzLmRlcGVuZGVuY2llcyk7XG4gIGRlcGVuZGVuY3lVcGRhdGVzLmRldkRlcGVuZGVuY2llcyA9IGRlcGVuZGVuY3lVcGRhdGVzLmRldkRlcGVuZGVuY2llcy5maWx0ZXIoKGRlcCkgPT4gIXBhY2thZ2VKc29uRGVwZW5kZW5jaWVzW2RlcF0pO1xuICBkZXBlbmRlbmN5VXBkYXRlcy5kZXZEZXBlbmRlbmNpZXMgPSBhZGRQYWNrYWdlSnNvbkRlcGVuZGVuY2llcyhcbiAgICBwYWNrYWdlSnNvbkRldkRlcGVuZGVuY2llcyxcbiAgICBkZXBlbmRlbmN5VXBkYXRlcy5kZXZEZXBlbmRlbmNpZXNcbiAgKTtcbn1cblxuZnVuY3Rpb24gcmVtb3ZlRW1wdHlEZXBlbmRlbmN5U2VjdGlvbnMoanNvbk9iajogUGFja2FnZUpzb24pOiB2b2lkIHtcbiAgZm9yIChjb25zdCBrZXkgb2YgWydkZXBlbmRlbmNpZXMnLCAnZGV2RGVwZW5kZW5jaWVzJywgJ3BlZXJEZXBlbmRlbmNpZXMnXSBhcyBjb25zdCkge1xuICAgIGNvbnN0IHNlY3Rpb24gPSBqc29uT2JqW2tleV07XG4gICAgaWYgKHNlY3Rpb24gJiYgT2JqZWN0LmtleXMoc2VjdGlvbikubGVuZ3RoID09PSAwKSB7XG4gICAgICBSZWZsZWN0LmRlbGV0ZVByb3BlcnR5KGpzb25PYmosIGtleSk7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGluc3RhbGxEZXBlbmRlbmN5VXBkYXRlcyhcbiAgY29uZmlnOiBQYWNrYWdlQ29uZmlnLFxuICBqc29uT2JqOiBQYWNrYWdlSnNvbixcbiAgZGVwZW5kZW5jeVVwZGF0ZXM6IERlcGVuZGVuY3lVcGRhdGVzLFxuICBwYWNrYWdlTWFuYWdlcjogJ2J1bicgfCAneWFybidcbik6IHZvaWQge1xuICBjb25zdCBkZXBlbmRlbmNpZXMgPSBkZXBlbmRlbmN5VXBkYXRlcy5kZXBlbmRlbmNpZXMuZmlsdGVyKChkZXApID0+ICFqc29uT2JqLmRldkRlcGVuZGVuY2llcz8uW2RlcF0pO1xuICBpbnN0YWxsTnBtRGVwZW5kZW5jaWVzKGNvbmZpZywgcGFja2FnZU1hbmFnZXIsIGRlcGVuZGVuY2llcywgZmFsc2UpO1xuXG4gIGNvbnN0IGRldkRlcGVuZGVuY2llcyA9IGRlcGVuZGVuY3lVcGRhdGVzLmRldkRlcGVuZGVuY2llcy5maWx0ZXIoKGRlcCkgPT4gIWpzb25PYmouZGVwZW5kZW5jaWVzPy5bZGVwXSk7XG4gIGluc3RhbGxOcG1EZXBlbmRlbmNpZXMoY29uZmlnLCBwYWNrYWdlTWFuYWdlciwgZGV2RGVwZW5kZW5jaWVzLCB0cnVlKTtcblxuICBpZiAoZGVwZW5kZW5jeVVwZGF0ZXMucG9ldHJ5RGV2RGVwZW5kZW5jaWVzLmxlbmd0aCA+IDApIHtcbiAgICBzcGF3blN5bmMoJ3BvZXRyeScsIFsnYWRkJywgJy0tZ3JvdXAnLCAnZGV2JywgLi4ubmV3IFNldChkZXBlbmRlbmN5VXBkYXRlcy5wb2V0cnlEZXZEZXBlbmRlbmNpZXMpXSwgY29uZmlnLmRpclBhdGgpO1xuICB9XG59XG5cbmZ1bmN0aW9uIGluc3RhbGxOcG1EZXBlbmRlbmNpZXMoXG4gIGNvbmZpZzogUGFja2FnZUNvbmZpZyxcbiAgcGFja2FnZU1hbmFnZXI6ICdidW4nIHwgJ3lhcm4nLFxuICBkZXBlbmRlbmNpZXM6IHN0cmluZ1tdLFxuICBkZXY6IGJvb2xlYW5cbik6IHZvaWQge1xuICBpZiAoZGVwZW5kZW5jaWVzLmxlbmd0aCA9PT0gMCkgcmV0dXJuO1xuXG4gIGNvbnN0IGRlcGVuZGVuY3lTcGVjaWZpZXJzID0gWy4uLm5ldyBTZXQoZGVwZW5kZW5jaWVzKV0ubWFwKChkZXBlbmRlbmN5KSA9PiBnZXREZXBlbmRlbmN5U3BlY2lmaWVyKGRlcGVuZGVuY3kpKTtcbiAgaWYgKGNvbmZpZy5pc0J1bikge1xuICAgIHNwYXduU3luYyhwYWNrYWdlTWFuYWdlciwgWydhZGQnLCAuLi4oZGV2ID8gWyctRCddIDogW10pLCAnLS1leGFjdCcsIC4uLmRlcGVuZGVuY3lTcGVjaWZpZXJzXSwgY29uZmlnLmRpclBhdGgpO1xuICB9IGVsc2Uge1xuICAgIC8vIEludGVudGlvbmFsbHkgb21pdCB2ZXJzaW9ucyB0byB1cGRhdGUgZGVwZW5kZW5jaWVzIHRvIHRoZSBsYXRlc3QgdmVyc2lvbnMgd2l0aCBZYXJuLlxuICAgIHNwYXduU3luYyhwYWNrYWdlTWFuYWdlciwgWydhZGQnLCAuLi4oZGV2ID8gWyctRCddIDogW10pLCAuLi5kZXBlbmRlbmN5U3BlY2lmaWVyc10sIGNvbmZpZy5kaXJQYXRoKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBhZGRQYWNrYWdlSnNvbkRlcGVuZGVuY2llcyhcbiAgcGFja2FnZUpzb25EZXBlbmRlbmNpZXM6IFBhcnRpYWw8UmVjb3JkPHN0cmluZywgc3RyaW5nPj4sXG4gIGRlcGVuZGVuY2llczogc3RyaW5nW11cbik6IHN0cmluZ1tdIHtcbiAgY29uc3QgdW5pcXVlRGVwZW5kZW5jaWVzID0gWy4uLm5ldyBTZXQoZGVwZW5kZW5jaWVzKV0uZmlsdGVyKChkZXApID0+ICFwYWNrYWdlSnNvbkRlcGVuZGVuY2llc1tkZXBdKTtcbiAgZm9yIChjb25zdCBkZXBlbmRlbmN5IG9mIHVuaXF1ZURlcGVuZGVuY2llcykge1xuICAgIHBhY2thZ2VKc29uRGVwZW5kZW5jaWVzW2RlcGVuZGVuY3ldID0gZ2V0UGFja2FnZUpzb25EZXBlbmRlbmN5VmVyc2lvbihkZXBlbmRlbmN5KTtcbiAgfVxuICByZXR1cm4gdW5pcXVlRGVwZW5kZW5jaWVzO1xufVxuXG5mdW5jdGlvbiBnZXRQYWNrYWdlSnNvbkRlcGVuZGVuY3lWZXJzaW9uKGRlcGVuZGVuY3k6IHN0cmluZyk6IHN0cmluZyB7XG4gIGNvbnN0IGRlcGVuZGVuY3lTcGVjaWZpZXIgPSBnZXREZXBlbmRlbmN5U3BlY2lmaWVyKGRlcGVuZGVuY3kpO1xuICBjb25zdCB2ZXJzaW9uU2VwYXJhdG9ySW5kZXggPSBkZXBlbmRlbmN5U3BlY2lmaWVyLmxhc3RJbmRleE9mKCdAJyk7XG4gIHJldHVybiB2ZXJzaW9uU2VwYXJhdG9ySW5kZXggPiAwID8gZGVwZW5kZW5jeVNwZWNpZmllci5zbGljZSh2ZXJzaW9uU2VwYXJhdG9ySW5kZXggKyAxKSA6ICcqJztcbn1cblxuLy8gVE9ETzogcmVtb3ZlIHRoZSBmb2xsb3dpbmcgbWlncmF0aW9uIGNvZGUgaW4gZnV0dXJlXG5hc3luYyBmdW5jdGlvbiByZW1vdmVEZXByZWNhdGVkU3R1ZmYoXG4gIGpzb25PYmo6IFNldFJlcXVpcmVkPFBhY2thZ2VKc29uLCAnc2NyaXB0cycgfCAnZGVwZW5kZW5jaWVzJyB8ICdkZXZEZXBlbmRlbmNpZXMnPixcbiAgZGlyUGF0aDogc3RyaW5nXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgaWYgKGpzb25PYmouYXV0aG9yID09PSAnV2lsbEJvb3N0ZXIgTExDJykge1xuICAgIGpzb25PYmouYXV0aG9yID0gJ1dpbGxCb29zdGVyIEluYy4nO1xuICB9XG4gIGRlbGV0ZSBqc29uT2JqLnNjcmlwdHNbJ3NvcnQtcGFja2FnZS1qc29uJ107XG4gIGRlbGV0ZSBqc29uT2JqLnNjcmlwdHNbJ3NvcnQtYWxsLXBhY2thZ2UtanNvbiddO1xuICBkZWxldGUganNvbk9iai5zY3JpcHRzWyd0eXBlY2hlY2svd2FybiddO1xuICBkZWxldGUganNvbk9iai5zY3JpcHRzWyd0eXBlY2hlY2s6Z2VuLWNvZGUnXTtcbiAgZGVsZXRlIGpzb25PYmouc2NyaXB0c1sndHlwZWNoZWNrOmNvZGVnZW4nXTtcbiAgZGVsZXRlIGpzb25PYmouZGVwZW5kZW5jaWVzLnRzbGliO1xuICBkZWxldGUganNvbk9iai5kZXZEZXBlbmRlbmNpZXNbJ0B3aWxsYm9vc3Rlci9lc2xpbnQtY29uZmlnJ107XG4gIGRlbGV0ZSBqc29uT2JqLmRldkRlcGVuZGVuY2llc1snQHdpbGxib29zdGVyL2VzbGludC1jb25maWctcmVhY3QnXTtcbiAgZGVsZXRlIGpzb25PYmouZGV2RGVwZW5kZW5jaWVzWydAd2lsbGJvb3N0ZXIvcmVub3ZhdGUtY29uZmlnJ107XG4gIGRlbGV0ZSBqc29uT2JqLmRldkRlcGVuZGVuY2llc1snQHdpbGxib29zdGVyL3RzY29uZmlnJ107XG4gIGRlbGV0ZSBqc29uT2JqLmRldkRlcGVuZGVuY2llc1snZXNsaW50LWltcG9ydC1yZXNvbHZlci1ub2RlJ107XG4gIGRlbGV0ZSBqc29uT2JqLmRldkRlcGVuZGVuY2llc1snZXNsaW50LXBsdWdpbi1wcmV0dGllciddO1xuICBkZWxldGUganNvbk9iai5kZXZEZXBlbmRlbmNpZXMubGVybmE7XG4gIC8vIFRvIGluc3RhbGwgdGhlIGxhdGVzdCBwaW5zdFxuICBkZWxldGUganNvbk9iai5kZXZEZXBlbmRlbmNpZXMucGluc3Q7XG4gIGRlbGV0ZSBqc29uT2JqLnNjcmlwdHNbJ2ZsdXR0ZXItZm9ybWF0J107XG4gIGRlbGV0ZSBqc29uT2JqLnNjcmlwdHNbJ2Zvcm1hdC1mbHV0dGVyJ107XG4gIGRlbGV0ZSBqc29uT2JqLnNjcmlwdHNbJ3B5dGhvbi1mb3JtYXQnXTtcbiAgZGVsZXRlIGpzb25PYmouc2NyaXB0c1snZm9ybWF0LXB5dGhvbiddO1xuICBkZWxldGUganNvbk9iai5zY3JpcHRzLnByZXR0aWVyO1xuICBkZWxldGUganNvbk9iai5zY3JpcHRzWydjaGVjay1hbGwnXTtcbiAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzLnByb21pc2VzLnJtKHBhdGgucmVzb2x2ZShkaXJQYXRoLCAnbGVybmEuanNvbicpLCB7IGZvcmNlOiB0cnVlIH0pKTtcblxuICAvLyBNaWdyYXRlIGZyb20gRVNMaW50IGxlZ2FjeSBjb25maWdzIHRvIGZsYXQgY29uZmlncyxcbiAgZGVsZXRlIGpzb25PYmouZGV2RGVwZW5kZW5jaWVzWydAdHlwZXNjcmlwdC1lc2xpbnQvZXNsaW50LXBsdWdpbiddO1xuICBkZWxldGUganNvbk9iai5kZXZEZXBlbmRlbmNpZXNbJ0B0eXBlc2NyaXB0LWVzbGludC9wYXJzZXInXTtcbiAgZGVsZXRlIGpzb25PYmouZGV2RGVwZW5kZW5jaWVzWydlc2xpbnQtcGx1Z2luLWltcG9ydCddO1xufVxuXG5mdW5jdGlvbiBnZXREZXBlbmRlbmN5U3BlY2lmaWVyKGRlcGVuZGVuY3k6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiBnZXRQaW5uZWREZXBlbmRlbmN5U3BlY2lmaWVyKGRlcGVuZGVuY3kpID8/IGRlcGVuZGVuY3k7XG59XG5cbmZ1bmN0aW9uIGFkZFN0YXJ0VGVzdFNlcnZlclNjcmlwdElmTmVlZGVkKGNvbmZpZzogUGFja2FnZUNvbmZpZywganNvbk9iajogUGFja2FnZUpzb24pOiB2b2lkIHtcbiAgaWYgKCFjb25maWcuZGVwZW5kaW5nLnBsYXl3cmlnaHRUZXN0IHx8ICFjb25maWcuZGVwZW5kaW5nLndiIHx8IGpzb25PYmouc2NyaXB0cz8uWydzdGFydC10ZXN0LXNlcnZlciddKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAganNvbk9iai5zY3JpcHRzID8/PSB7fTtcbiAganNvbk9iai5zY3JpcHRzWydzdGFydC10ZXN0LXNlcnZlciddID0gJ3diIHN0YXJ0IC0tbW9kZSB0ZXN0Jztcbn1cblxuZnVuY3Rpb24gZm9ybWF0UmVwb3NpdG9yeUZvclBhY2thZ2VKc29uKFxuICByZXBvc2l0b3J5OiBQYWNrYWdlSnNvblsncmVwb3NpdG9yeSddLFxuICBleGlzdGluZ1JlcG9zaXRvcnk/OiBQYWNrYWdlSnNvblsncmVwb3NpdG9yeSddXG4pOiBQYWNrYWdlSnNvblsncmVwb3NpdG9yeSddIHtcbiAgY29uc3Qgbm9ybWFsaXplZFJlcG9zaXRvcnkgPSBub3JtYWxpemVSZXBvc2l0b3J5VXJsRm9yUGFja2FnZUpzb24ocmVwb3NpdG9yeSk7XG4gIGlmIChub3JtYWxpemVkUmVwb3NpdG9yeSkge1xuICAgIHJldHVybiBidWlsZE5vcm1hbGl6ZWRSZXBvc2l0b3J5Rm9yUGFja2FnZUpzb24obm9ybWFsaXplZFJlcG9zaXRvcnksIHJlcG9zaXRvcnksIGV4aXN0aW5nUmVwb3NpdG9yeSk7XG4gIH1cblxuICBjb25zdCBub3JtYWxpemVkRXhpc3RpbmdSZXBvc2l0b3J5ID0gbm9ybWFsaXplUmVwb3NpdG9yeVVybEZvclBhY2thZ2VKc29uKGV4aXN0aW5nUmVwb3NpdG9yeSk7XG4gIGlmIChub3JtYWxpemVkRXhpc3RpbmdSZXBvc2l0b3J5KSB7XG4gICAgcmV0dXJuIGJ1aWxkTm9ybWFsaXplZFJlcG9zaXRvcnlGb3JQYWNrYWdlSnNvbihub3JtYWxpemVkRXhpc3RpbmdSZXBvc2l0b3J5LCBleGlzdGluZ1JlcG9zaXRvcnkpO1xuICB9XG5cbiAgcmV0dXJuIHJlcG9zaXRvcnk7XG59XG5cbmZ1bmN0aW9uIG5vcm1hbGl6ZVJlcG9zaXRvcnlVcmxGb3JQYWNrYWdlSnNvbihyZXBvc2l0b3J5OiBQYWNrYWdlSnNvblsncmVwb3NpdG9yeSddKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgaWYgKHR5cGVvZiByZXBvc2l0b3J5ID09PSAnc3RyaW5nJykge1xuICAgIGlmICghcmVwb3NpdG9yeS5zdGFydHNXaXRoKCdnaXRodWI6JykpIHJldHVybjtcblxuICAgIGNvbnN0IFtvd25lciwgcmVwb10gPSBnaXRIdWJVdGlsLmdldE9yZ0FuZE5hbWUocmVwb3NpdG9yeSk7XG4gICAgaWYgKCFvd25lciB8fCAhcmVwbykgcmV0dXJuO1xuICAgIHJldHVybiBgZ2l0K2h0dHBzOi8vZ2l0aHViLmNvbS8ke293bmVyfS8ke3JlcG99LmdpdGA7XG4gIH1cblxuICBjb25zdCByZXBvc2l0b3J5VXJsID0gcmVwb3NpdG9yeT8udXJsO1xuICBpZiAodHlwZW9mIHJlcG9zaXRvcnlVcmwgIT09ICdzdHJpbmcnKSByZXR1cm47XG5cbiAgY29uc3QgbWF0Y2hlZCA9IC9eKD86Z2l0XFwrKT9odHRwczpcXC9cXC9naXRodWJcXC5jb21cXC8oW14vXSspXFwvKFteL10rPykoPzpcXC5naXQpPyQvdS5leGVjKHJlcG9zaXRvcnlVcmwpO1xuICBpZiAoIW1hdGNoZWQpIHJldHVybjtcblxuICBjb25zdCBbLCBvd25lciwgcmVwb10gPSBtYXRjaGVkO1xuICByZXR1cm4gYGdpdCtodHRwczovL2dpdGh1Yi5jb20vJHtvd25lcn0vJHtyZXBvfS5naXRgO1xufVxuXG5mdW5jdGlvbiBidWlsZE5vcm1hbGl6ZWRSZXBvc2l0b3J5Rm9yUGFja2FnZUpzb24oXG4gIG5vcm1hbGl6ZWRVcmw6IHN0cmluZyxcbiAgcmVwb3NpdG9yeTogUGFja2FnZUpzb25bJ3JlcG9zaXRvcnknXSxcbiAgZXhpc3RpbmdSZXBvc2l0b3J5PzogUGFja2FnZUpzb25bJ3JlcG9zaXRvcnknXVxuKTogUGFja2FnZUpzb25bJ3JlcG9zaXRvcnknXSB7XG4gIGNvbnN0IHJlcG9zaXRvcnlPYmogPVxuICAgIHR5cGVvZiByZXBvc2l0b3J5ID09PSAnb2JqZWN0J1xuICAgICAgPyByZXBvc2l0b3J5XG4gICAgICA6IHR5cGVvZiBleGlzdGluZ1JlcG9zaXRvcnkgPT09ICdvYmplY3QnXG4gICAgICAgID8gZXhpc3RpbmdSZXBvc2l0b3J5XG4gICAgICAgIDogdW5kZWZpbmVkO1xuXG4gIHJldHVybiB7XG4gICAgLi4ucmVwb3NpdG9yeU9iaixcbiAgICB0eXBlOiAnZ2l0JyxcbiAgICB1cmw6IG5vcm1hbGl6ZWRVcmwsXG4gIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZW5lcmF0ZVNjcmlwdHMoY29uZmlnOiBQYWNrYWdlQ29uZmlnLCBvbGRTY3JpcHRzOiBQYWNrYWdlSnNvbi5TY3JpcHRzKTogUmVjb3JkPHN0cmluZywgc3RyaW5nPiB7XG4gIGlmIChjb25maWcuaXNCdW4pIHtcbiAgICBjb25zdCBoYXNUeXBlY2hlY2sgPSBjb25maWcuZG9lc0NvbnRhaW5UeXBlU2NyaXB0IHx8IGNvbmZpZy5kb2VzQ29udGFpblR5cGVTY3JpcHRJblBhY2thZ2VzO1xuICAgIGNvbnN0IHNjcmlwdHM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7XG4gICAgICAnY2hlY2stYWxsLWZvci1haSc6ICdidW4gcnVuIGNoZWNrLWZvci1haSAmJiBidW4gcnVuIHRlc3QnLFxuICAgICAgJ2NoZWNrLWZvci1haSc6IGBidW4gcnVuIGNsZWFudXAke2hhc1R5cGVjaGVjayA/ICcgJiYgYnVuIHJ1biB0eXBlY2hlY2snIDogJyd9YCxcbiAgICAgIGNsZWFudXA6ICdidW4gLS1idW4gd2IgbGludCAtLWZpeCAtLWZvcm1hdCcsXG4gICAgICBmb3JtYXQ6IGBidW4gLS1idW4gd2IgbGludCAtLWZvcm1hdGAsXG4gICAgICBsaW50OiBgYnVuIC0tYnVuIHdiIGxpbnRgLFxuICAgICAgJ2xpbnQtZml4JzogJ2J1biAtLWJ1biB3YiBsaW50IC0tZml4JyxcbiAgICAgIHRlc3Q6ICdidW4gd2IgdGVzdCcsXG4gICAgICB0eXBlY2hlY2s6ICdidW4gLS1idW4gd2IgdHlwZWNoZWNrJyxcbiAgICB9O1xuICAgIGlmICghaGFzVHlwZWNoZWNrKSB7XG4gICAgICBkZWxldGUgc2NyaXB0cy50eXBlY2hlY2s7XG4gICAgfVxuICAgIHJldHVybiBzY3JpcHRzO1xuICB9IGVsc2Uge1xuICAgIGNvbnN0IGhhc1R5cGVjaGVjayA9IGNvbmZpZy5kb2VzQ29udGFpblR5cGVTY3JpcHQgfHwgY29uZmlnLmRvZXNDb250YWluVHlwZVNjcmlwdEluUGFja2FnZXM7XG4gICAgY29uc3Qgb2xkVGVzdCA9IG9sZFNjcmlwdHMudGVzdDtcbiAgICBsZXQgc2NyaXB0czogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHtcbiAgICAgICdjaGVjay1hbGwtZm9yLWFpJzogJ3lhcm4gY2hlY2stZm9yLWFpICYmIHlhcm4gdGVzdCcsXG4gICAgICAnY2hlY2stZm9yLWFpJzogYHlhcm4gZm9ybWF0ID4gL2Rldi9udWxsIDI+IC9kZXYvbnVsbCB8fCB0cnVlJHtcbiAgICAgICAgaGFzVHlwZWNoZWNrID8gJyAmJiB5YXJuIHR5cGVjaGVjaycgOiAnJ1xuICAgICAgfSAmJiB5YXJuIGxpbnQtZml4IC0tcXVpZXRgLFxuICAgICAgY2xlYW51cDogJ3lhcm4gZm9ybWF0ICYmIHlhcm4gbGludC1maXgnLFxuICAgICAgZm9ybWF0OiBgc29ydC1wYWNrYWdlLWpzb24gJiYgeWFybiBwcmV0dGlmeWAsXG4gICAgICBsaW50OiBgZXNsaW50IC0tY29sb3JgLFxuICAgICAgJ2xpbnQtZml4JzogJ3lhcm4gbGludCAtLWZpeCcsXG4gICAgICBwcmV0dGlmeTogYHByZXR0aWVyIC0tY2FjaGUgLS1jb2xvciAtLXdyaXRlIFwiKiovey4qLyx9Ki57JHtleHRlbnNpb25zLnByZXR0aWVyLmpvaW4oJywnKX19XCIgXCIhKiovdGVzdHstLC99Zml4dHVyZXMvKipcImAsXG4gICAgICB0eXBlY2hlY2s6ICd0c2MgLS1ub0VtaXQnLFxuICAgIH07XG4gICAgaWYgKGNvbmZpZy5kb2VzQ29udGFpblN1YlBhY2thZ2VKc29ucykge1xuICAgICAgc2NyaXB0cyA9IG1lcmdlKFxuICAgICAgICB7IC4uLnNjcmlwdHMgfSxcbiAgICAgICAge1xuICAgICAgICAgIGZvcm1hdDogYHNvcnQtcGFja2FnZS1qc29uICYmIHlhcm4gcHJldHRpZnkgJiYgeWFybiB3b3Jrc3BhY2VzIGZvcmVhY2ggLS1hbGwgLS1wYXJhbGxlbCAtLXZlcmJvc2UgcnVuIGZvcm1hdGAsXG4gICAgICAgICAgbGludDogYHlhcm4gd29ya3NwYWNlcyBmb3JlYWNoIC0tYWxsIC0tcGFyYWxsZWwgLS12ZXJib3NlIHJ1biBsaW50YCxcbiAgICAgICAgICAnbGludC1maXgnOiAneWFybiB3b3Jrc3BhY2VzIGZvcmVhY2ggLS1hbGwgLS1wYXJhbGxlbCAtLXZlcmJvc2UgcnVuIGxpbnQtZml4JyxcbiAgICAgICAgICBwcmV0dGlmeTogYHByZXR0aWVyIC0tY2FjaGUgLS1jb2xvciAtLXdyaXRlIFwiKiovey4qLyx9Ki57JHtleHRlbnNpb25zLnByZXR0aWVyLmpvaW4oXG4gICAgICAgICAgICAnLCdcbiAgICAgICAgICApfX1cIiBcIiEqKi9wYWNrYWdlcy8qKlwiIFwiISoqL3Rlc3R7LSwvfWZpeHR1cmVzLyoqXCJgLFxuICAgICAgICAgIC8vIENJPTEgcHJldmVudHMgdml0ZXN0IGZyb20gZW5hYmxpbmcgd2F0Y2guXG4gICAgICAgICAgLy8gRk9SQ0VfQ09MT1I9MyBtYWtlIHdiIGVuYWJsZSBjb2xvciBvdXRwdXQuXG4gICAgICAgICAgdGVzdDogJ0NJPTEgRk9SQ0VfQ09MT1I9MyB5YXJuIHdvcmtzcGFjZXMgZm9yZWFjaCAtLWFsbCAtLXZlcmJvc2UgcnVuIHRlc3QnLFxuICAgICAgICAgIHR5cGVjaGVjazogJ3lhcm4gd29ya3NwYWNlcyBmb3JlYWNoIC0tYWxsIC0tcGFyYWxsZWwgLS12ZXJib3NlIHJ1biB0eXBlY2hlY2snLFxuICAgICAgICB9XG4gICAgICApO1xuICAgIH0gZWxzZSBpZiAoY29uZmlnLmRlcGVuZGluZy5weXJpZ2h0KSB7XG4gICAgICBzY3JpcHRzLnR5cGVjaGVjayA9IHNjcmlwdHMudHlwZWNoZWNrID8gYCR7c2NyaXB0cy50eXBlY2hlY2t9ICYmIGAgOiAnJztcbiAgICAgIHNjcmlwdHMudHlwZWNoZWNrICs9ICdweXJpZ2h0JztcbiAgICB9XG4gICAgaWYgKG9sZFRlc3Q/LmluY2x1ZGVzKCd3YiB0ZXN0JykpIHtcbiAgICAgIHNjcmlwdHMudGVzdCA9IG9sZFRlc3Q7XG4gICAgfVxuXG4gICAgaWYgKCFoYXNUeXBlY2hlY2spIHtcbiAgICAgIGRlbGV0ZSBzY3JpcHRzLnR5cGVjaGVjaztcbiAgICB9IGVsc2UgaWYgKGNvbmZpZy5kZXBlbmRpbmcud2IpIHtcbiAgICAgIHNjcmlwdHMudHlwZWNoZWNrID0gJ3diIHR5cGVjaGVjayc7XG4gICAgfVxuICAgIHJldHVybiBzY3JpcHRzO1xuICB9XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlUHJldHRpZXJTdWZmaXgoZGlyUGF0aDogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgY29uc3QgZmlsZVBhdGggPSBwYXRoLnJlc29sdmUoZGlyUGF0aCwgJy5wcmV0dGllcmlnbm9yZScpO1xuICBjb25zdCBleGlzdGluZ0NvbnRlbnQgPSBhd2FpdCBmcy5wcm9taXNlcy5yZWFkRmlsZShmaWxlUGF0aCwgJ3V0ZjgnKTtcbiAgY29uc3QgaW5kZXggPSBleGlzdGluZ0NvbnRlbnQuaW5kZXhPZihpZ25vcmVGaWxlVXRpbC5zZXBhcmF0b3JQcmVmaXgpO1xuICBpZiAoaW5kZXggPT09IC0xKSByZXR1cm4gJyc7XG5cbiAgY29uc3Qgb3JpZ2luYWxDb250ZW50ID0gZXhpc3RpbmdDb250ZW50LnNsaWNlKDAsIGluZGV4KTtcbiAgY29uc3QgbGluZXMgPSBvcmlnaW5hbENvbnRlbnRcbiAgICAuc3BsaXQoJ1xcbicpXG4gICAgLm1hcCgobGluZSkgPT4ge1xuICAgICAgY29uc3QgbmV3TGluZSA9IGxpbmUudHJpbSgpO1xuICAgICAgcmV0dXJuIG5ld0xpbmUuZW5kc1dpdGgoJy8nKSA/IG5ld0xpbmUuc2xpY2UoMCwgLTEpIDogbmV3TGluZTtcbiAgICB9KVxuICAgIC5maWx0ZXIoKGwpID0+IGwgJiYgIWwuc3RhcnRzV2l0aCgnIycpICYmICFsLmluY2x1ZGVzKCcvJykpO1xuXG4gIHJldHVybiBgJHtsaW5lcy5tYXAoKGxpbmUpID0+IGAgXCIhKiovJHtsaW5lfS8qKlwiYCkuam9pbignJyl9IHx8IHRydWVgO1xufVxuXG5hc3luYyBmdW5jdGlvbiBmaXhTY3JpcHROYW1lcyhzY3JpcHRzOiBQYWNrYWdlSnNvbi5TY3JpcHRzLCBjb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3Qgb2xkQW5kTmV3U2NyaXB0TmFtZXM6IFtzdHJpbmcsIHN0cmluZ11bXSA9IFtdO1xuICBmb3IgKGNvbnN0IGtleSBvZiBPYmplY3Qua2V5cyhzY3JpcHRzKSkge1xuICAgIGlmIChrZXkgJiYgIWtleS5zdGFydHNXaXRoKCc6JykgJiYga2V5LmluY2x1ZGVzKCc6JykpIHtcbiAgICAgIG9sZEFuZE5ld1NjcmlwdE5hbWVzLnB1c2goW2tleSwga2V5LnJlcGxhY2VBbGwoJzonLCAnLScpXSk7XG4gICAgfVxuICB9XG4gIGlmIChvbGRBbmROZXdTY3JpcHROYW1lcy5sZW5ndGggPT09IDApIHJldHVybjtcblxuICBmb3IgKGNvbnN0IFtvbGROYW1lLCBuZXdOYW1lXSBvZiBvbGRBbmROZXdTY3JpcHROYW1lcykge1xuICAgIGNvbnN0IG9sZFNjcmlwdCA9IHNjcmlwdHNbb2xkTmFtZV07XG4gICAgaWYgKG9sZFNjcmlwdCkge1xuICAgICAgc2NyaXB0c1tuZXdOYW1lXSA9IHJlcGxhY2VTY3JpcHROYW1lc0luVGV4dChvbGRTY3JpcHQsIG9sZEFuZE5ld1NjcmlwdE5hbWVzKTtcbiAgICB9XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1keW5hbWljLWRlbGV0ZVxuICAgIGRlbGV0ZSBzY3JpcHRzW29sZE5hbWVdO1xuICB9XG4gIGZvciAoY29uc3QgW3NjcmlwdE5hbWUsIHNjcmlwdF0gb2YgT2JqZWN0LmVudHJpZXMoc2NyaXB0cykpIHtcbiAgICBpZiAoIXNjcmlwdCkgY29udGludWU7XG4gICAgc2NyaXB0c1tzY3JpcHROYW1lXSA9IHJlcGxhY2VTY3JpcHROYW1lc0luVGV4dChzY3JpcHQsIG9sZEFuZE5ld1NjcmlwdE5hbWVzKTtcbiAgfVxuXG4gIGNvbnN0IGZpbGVzID0gYXdhaXQgZmcuZ2xvYihbJyoqLyoue21kLGNqcyxtanMsanMsanN4LGN0cyxtdHMsdHMsdHN4fScsICcqKi9Eb2NrZXJmaWxlJ10sIHtcbiAgICBjd2Q6IGNvbmZpZy5kaXJQYXRoLFxuICAgIGRvdDogdHJ1ZSxcbiAgICBpZ25vcmU6IGdsb2JJZ25vcmUsXG4gIH0pO1xuICBmb3IgKGNvbnN0IGZpbGUgb2YgZmlsZXMpIHtcbiAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLmpvaW4oY29uZmlnLmRpclBhdGgsIGZpbGUpO1xuICAgICAgY29uc3Qgb2xkQ29udGVudCA9IGF3YWl0IGZzLnByb21pc2VzLnJlYWRGaWxlKGZpbGVQYXRoLCAndXRmOCcpO1xuICAgICAgY29uc3QgbmV3Q29udGVudCA9IHJlcGxhY2VTY3JpcHROYW1lc0luVGV4dChvbGRDb250ZW50LCBvbGRBbmROZXdTY3JpcHROYW1lcyk7XG4gICAgICBpZiAobmV3Q29udGVudCAhPT0gb2xkQ29udGVudCkge1xuICAgICAgICBhd2FpdCBmcy5wcm9taXNlcy53cml0ZUZpbGUoZmlsZVBhdGgsIG5ld0NvbnRlbnQpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG4gIGF3YWl0IHByb21pc2VQb29sLnByb21pc2VBbGwoKTtcbn1cblxuZnVuY3Rpb24gcmVwbGFjZVNjcmlwdE5hbWVzSW5UZXh0KHRleHQ6IHN0cmluZywgb2xkQW5kTmV3U2NyaXB0TmFtZXM6IFtzdHJpbmcsIHN0cmluZ11bXSk6IHN0cmluZyB7XG4gIGxldCBuZXdUZXh0ID0gdGV4dDtcbiAgZm9yIChjb25zdCBbb2xkTmFtZSwgbmV3TmFtZV0gb2Ygb2xkQW5kTmV3U2NyaXB0TmFtZXMpIHtcbiAgICBuZXdUZXh0ID0gbmV3VGV4dC5yZXBsYWNlQWxsKG5ldyBSZWdFeHAoU3RyaW5nLnJhd2AoPzwhW1xcdy1dKSR7ZXNjYXBlUmVnRXhwKG9sZE5hbWUpfSg/IVtcXHctXSlgLCAnZ3UnKSwgbmV3TmFtZSk7XG4gIH1cbiAgcmV0dXJuIG5ld1RleHQ7XG59XG5cbmZ1bmN0aW9uIGVzY2FwZVJlZ0V4cCh0ZXh0OiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gdGV4dC5yZXBsYWNlQWxsKC9bLiorP14ke30oKXxbXFxdXFxcXF0vZ3UsIFN0cmluZy5yYXdgXFwkJmApO1xufVxuXG5hc3luYyBmdW5jdGlvbiB1cGRhdGVQcml2YXRlUGFja2FnZXMoanNvbk9iajogV3JpdGFibGVQYWNrYWdlSnNvbik6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBwYWNrYWdlTmFtZXMgPSBuZXcgU2V0KFsuLi5PYmplY3Qua2V5cyhqc29uT2JqLmRlcGVuZGVuY2llcyksIC4uLk9iamVjdC5rZXlzKGpzb25PYmouZGV2RGVwZW5kZW5jaWVzKV0pO1xuICBjb25zdCBwcml2YXRlUGFja2FnZXM6IHtcbiAgICBwYWNrYWdlTmFtZTogc3RyaW5nO1xuICAgIHJlcG86IHN0cmluZztcbiAgICB0YXJnZXQ6ICdkZXBlbmRlbmNpZXMnIHwgJ2RldkRlcGVuZGVuY2llcyc7XG4gIH1bXSA9IFtcbiAgICB7IHBhY2thZ2VOYW1lOiAnQHdpbGxib29zdGVyL2F1dGgnLCByZXBvOiAnYXV0aCcsIHRhcmdldDogJ2RlcGVuZGVuY2llcycgfSxcbiAgICB7IHBhY2thZ2VOYW1lOiAnQGRpc2NvcmQtYm90L3NoYXJlZCcsIHJlcG86ICdkaXNjb3JkLWJvdCcsIHRhcmdldDogJ2RlcGVuZGVuY2llcycgfSxcbiAgICB7IHBhY2thZ2VOYW1lOiAnQHdpbGxib29zdGVyL2NvZGUtYW5hbHl6ZXInLCByZXBvOiAnY29kZS1hbmFseXplcicsIHRhcmdldDogJ2RldkRlcGVuZGVuY2llcycgfSxcbiAgICB7IHBhY2thZ2VOYW1lOiAnQHdpbGxib29zdGVyL2p1ZGdlJywgcmVwbzogJ2p1ZGdlJywgdGFyZ2V0OiAnZGVwZW5kZW5jaWVzJyB9LFxuICAgIHsgcGFja2FnZU5hbWU6ICdAd2lsbGJvb3N0ZXIvbGxtLXByb3h5JywgcmVwbzogJ2xsbS1wcm94eScsIHRhcmdldDogJ2RlcGVuZGVuY2llcycgfSxcbiAgXTtcblxuICBhd2FpdCBQcm9taXNlLmFsbChcbiAgICBwcml2YXRlUGFja2FnZXMubWFwKGFzeW5jICh7IHBhY2thZ2VOYW1lLCByZXBvLCB0YXJnZXQgfSkgPT4ge1xuICAgICAgaWYgKCFwYWNrYWdlTmFtZXMuaGFzKHBhY2thZ2VOYW1lKSB8fCBpc1dvcmtzcGFjZVBhY2thZ2UoanNvbk9iaiwgcGFja2FnZU5hbWUpKSByZXR1cm47XG5cbiAgICAgIGNvbnN0IG90aGVyVGFyZ2V0ID0gdGFyZ2V0ID09PSAnZGVwZW5kZW5jaWVzJyA/ICdkZXZEZXBlbmRlbmNpZXMnIDogJ2RlcGVuZGVuY2llcyc7XG4gICAgICAvLyBUaGUgbGludCBydWxlIGRpc2FsbG93cyBgZGVsZXRlYCB3aXRoIGNvbXB1dGVkIHBhY2thZ2UgbmFtZXM7IFJlZmxlY3QgaGFzIHRoZSBzYW1lIGRlbGV0aW9uIHNlbWFudGljcyBoZXJlLlxuICAgICAgUmVmbGVjdC5kZWxldGVQcm9wZXJ0eShqc29uT2JqW290aGVyVGFyZ2V0XSwgcGFja2FnZU5hbWUpO1xuICAgICAganNvbk9ialt0YXJnZXRdW3BhY2thZ2VOYW1lXSA9IGF3YWl0IGdldExhdGVzdFByaXZhdGVQYWNrYWdlU3BlY2lmaWVyKHJlcG8pO1xuICAgIH0pXG4gICk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGdldExhdGVzdFByaXZhdGVQYWNrYWdlU3BlY2lmaWVyKHJlcG86IHN0cmluZyk6IFByb21pc2U8c3RyaW5nPiB7XG4gIGNvbnN0IGNvbW1pdEhhc2ggPSBhd2FpdCBnZXRMYXRlc3RDb21taXRIYXNoKCdXaWxsQm9vc3RlckxhYicsIHJlcG8pO1xuICByZXR1cm4gYGdpdEBnaXRodWIuY29tOldpbGxCb29zdGVyTGFiLyR7cmVwb30uZ2l0IyR7Y29tbWl0SGFzaH1gO1xufVxuXG5mdW5jdGlvbiBpc1dvcmtzcGFjZVBhY2thZ2UoanNvbk9iajogUGFja2FnZUpzb24sIHBhY2thZ2VOYW1lOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgcmV0dXJuIChqc29uT2JqLmRldkRlcGVuZGVuY2llcz8uW3BhY2thZ2VOYW1lXSB8fCBqc29uT2JqLmRlcGVuZGVuY2llcz8uW3BhY2thZ2VOYW1lXSB8fCAnJykuaW5jbHVkZXMoJ3dvcmtzcGFjZScpO1xufVxuIiwiaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRUc2NvbmZpZ0V4dGVuZHMoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogc3RyaW5nIHwgc3RyaW5nW10ge1xuICBpZiAoY29uZmlnLmlzQnVuKSB7XG4gICAgcmV0dXJuICdAdHNjb25maWcvYnVuL3RzY29uZmlnLmpzb24nO1xuICB9XG4gIGlmIChjb25maWcuZGVwZW5kaW5nLnJlYWN0TmF0aXZlKSB7XG4gICAgcmV0dXJuICdAdHNjb25maWcvcmVhY3QtbmF0aXZlL3RzY29uZmlnLmpzb24nO1xuICB9XG4gIHJldHVybiBbJ0B0c2NvbmZpZy9ub2RlLWx0cy90c2NvbmZpZy5qc29uJywgJ0B0c2NvbmZpZy9ub2RlLXRzL3RzY29uZmlnLmpzb24nXTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldFRzY29uZmlnQmFzZURlcGVuZGVuY2llcyhjb25maWc6IFBhY2thZ2VDb25maWcpOiBzdHJpbmdbXSB7XG4gIGlmIChjb25maWcuaXNCdW4pIHtcbiAgICByZXR1cm4gWydAdHNjb25maWcvYnVuJ107XG4gIH1cbiAgaWYgKGNvbmZpZy5kZXBlbmRpbmcucmVhY3ROYXRpdmUpIHtcbiAgICByZXR1cm4gWydAdHNjb25maWcvcmVhY3QtbmF0aXZlJ107XG4gIH1cbiAgcmV0dXJuIFsnQHRzY29uZmlnL25vZGUtbHRzJywgJ0B0c2NvbmZpZy9ub2RlLXRzJ107XG59XG4iLCJpbXBvcnQgeyBzcGF3blN5bmNBbmRSZXR1cm5TdGRvdXQgfSBmcm9tICcuLi91dGlscy9zcGF3blV0aWwuanMnO1xuXG5leHBvcnQgZnVuY3Rpb24gZ2V0TGF0ZXN0Q29tbWl0SGFzaChvcmdhbml6YXRpb246IHN0cmluZywgcmVwbzogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgdHJ5IHtcbiAgICBjb25zdCByZXBvVXJsID0gYGdpdEBnaXRodWIuY29tOiR7b3JnYW5pemF0aW9ufS8ke3JlcG99LmdpdGA7XG4gICAgY29uc3Qgb3V0cHV0ID0gc3Bhd25TeW5jQW5kUmV0dXJuU3Rkb3V0KCdnaXQnLCBbJ2xzLXJlbW90ZScsIHJlcG9VcmwsICdIRUFEJ10sIHByb2Nlc3MuY3dkKCkpO1xuICAgIGNvbnN0IGNvbW1pdEhhc2ggPSBvdXRwdXQuc3BsaXQoL1xccysvKVswXTtcbiAgICBpZiAoIWNvbW1pdEhhc2gpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgTm8gY29tbWl0cyBmb3VuZCBmb3IgJHtvcmdhbml6YXRpb259LyR7cmVwb31gKTtcbiAgICB9XG4gICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShjb21taXRIYXNoKTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IEVycm9yKGBGYWlsZWQgdG8gZmV0Y2ggY29tbWl0cyBmb3IgJHtvcmdhbml6YXRpb259LyR7cmVwb306ICR7U3RyaW5nKGVycm9yKX1gKSk7XG4gIH1cbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB5YW1sIGZyb20gJ2pzLXlhbWwnO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBleHRlbnNpb25zIH0gZnJvbSAnLi4vdXRpbHMvZXh0ZW5zaW9ucy5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcbmltcG9ydCB7IHNwYXduU3luYyB9IGZyb20gJy4uL3V0aWxzL3NwYXduVXRpbC5qcyc7XG5cbmltcG9ydCB7IGdlbmVyYXRlU2NyaXB0cyB9IGZyb20gJy4vcGFja2FnZUpzb24uanMnO1xuXG5pbnRlcmZhY2UgTGVmdGhvb2tTZXR0aW5ncyB7XG4gICdwb3N0LW1lcmdlJzoge1xuICAgIHNjcmlwdHM6IHtcbiAgICAgICdwcmVwYXJlLnNoJzoge1xuICAgICAgICBydW5uZXI6ICdiYXNoJztcbiAgICAgIH07XG4gICAgfTtcbiAgfTtcbiAgJ3ByZS1jb21taXQnOiB7XG4gICAgY29tbWFuZHM6IHtcbiAgICAgIGNsZWFudXA6IHtcbiAgICAgICAgZ2xvYjogc3RyaW5nO1xuICAgICAgICBydW46IHN0cmluZztcbiAgICAgIH07XG4gICAgICAnY2hlY2stbWlncmF0aW9ucyc6IHtcbiAgICAgICAgZ2xvYjogc3RyaW5nO1xuICAgICAgICBydW46IHN0cmluZztcbiAgICAgIH07XG4gICAgfTtcbiAgfTtcbiAgJ3ByZS1wdXNoJzoge1xuICAgIHNjcmlwdHM6IHtcbiAgICAgICdjaGVjay5zaCc6IHtcbiAgICAgICAgcnVubmVyOiAnYmFzaCc7XG4gICAgICB9O1xuICAgIH07XG4gIH07XG59XG5cbmNvbnN0IGJhc2VTZXR0aW5nczogT21pdDxMZWZ0aG9va1NldHRpbmdzLCAncHJlLWNvbW1pdCc+ID0ge1xuICAncG9zdC1tZXJnZSc6IHtcbiAgICBzY3JpcHRzOiB7XG4gICAgICAncHJlcGFyZS5zaCc6IHtcbiAgICAgICAgcnVubmVyOiAnYmFzaCcsXG4gICAgICB9LFxuICAgIH0sXG4gIH0sXG4gICdwcmUtcHVzaCc6IHtcbiAgICBzY3JpcHRzOiB7XG4gICAgICAnY2hlY2suc2gnOiB7XG4gICAgICAgIHJ1bm5lcjogJ2Jhc2gnLFxuICAgICAgfSxcbiAgICB9LFxuICB9LFxufTtcblxuY29uc3QgcHJlQ29tbWl0U2V0dGluZ3M6IExlZnRob29rU2V0dGluZ3NbJ3ByZS1jb21taXQnXSA9IHtcbiAgY29tbWFuZHM6IHtcbiAgICBjbGVhbnVwOiB7XG4gICAgICBnbG9iOiAnJyxcbiAgICAgIHJ1bjogJycsXG4gICAgfSxcbiAgICAnY2hlY2stbWlncmF0aW9ucyc6IHtcbiAgICAgIGdsb2I6ICcqKi9taWdyYXRpb24uc3FsJyxcbiAgICAgIHJ1bjogYFxuaWYgZ3JlcCAtcSAnV2FybmluZ3M6JyB7c3RhZ2VkX2ZpbGVzfTsgdGhlblxuICBlY2hvIFwiTWlncmF0aW9uIFNRTCBmaWxlcyAoe3N0YWdlZF9maWxlc30pIGNvbnRhaW4gd2FybmluZ3MhIFBsZWFzZSBzb2x2ZSB0aGUgd2FybmluZ3MgYW5kIGNvbW1pdCBhZ2Fpbi5cIlxuICBleGl0IDFcbmZpXG5gLnRyaW0oKSxcbiAgICB9LFxuICB9LFxufTtcblxuY29uc3Qgc2NyaXB0cyA9IHtcbiAgcG9zdE1lcmdlOiBgXG4jIS9iaW4vYmFzaFxuXG5jaGFuZ2VkX2ZpbGVzPVwiJChnaXQgZGlmZi10cmVlIC1yIC0tbmFtZS1vbmx5IC0tbm8tY29tbWl0LWlkIE9SSUdfSEVBRCBIRUFEKVwiXG5cbnJ1bl9pZl9jaGFuZ2VkKCkge1xuICBpZiBlY2hvIFwiJGNoYW5nZWRfZmlsZXNcIiB8IGdyZXAgLS1xdWlldCAtRSBcIiQxXCI7IHRoZW5cbiAgICBldmFsIFwiJDJcIlxuICBmaVxufVxuYC50cmltKCksXG59O1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVMZWZ0aG9va1VwZGF0aW5nUGFja2FnZUpzb24oY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZ2VuZXJhdGVMZWZ0aG9va1VwZGF0aW5nUGFja2FnZUpzb24nLCBhc3luYyAoKSA9PiB7XG4gICAgYXdhaXQgY29yZShjb25maWcpO1xuICB9KTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gY29yZShjb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgZGlyUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJy5sZWZ0aG9vaycpO1xuICBjb25zdCBodXNreURpclBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICcuaHVza3knKTtcbiAgY29uc3QgaGFzSHVza3lEaXIgPSBmcy5leGlzdHNTeW5jKGh1c2t5RGlyUGF0aCk7XG4gIGNvbnN0IHsgdHlwZWNoZWNrIH0gPSBnZW5lcmF0ZVNjcmlwdHMoY29uZmlnLCB7fSk7XG4gIGNvbnN0IHNldHRpbmdzOiBQYXJ0aWFsPExlZnRob29rU2V0dGluZ3M+ID0ge1xuICAgIC4uLmJhc2VTZXR0aW5ncyxcbiAgICAncHJlLWNvbW1pdCc6IHtcbiAgICAgIC4uLnByZUNvbW1pdFNldHRpbmdzLFxuICAgICAgY29tbWFuZHM6IHtcbiAgICAgICAgLi4ucHJlQ29tbWl0U2V0dGluZ3MuY29tbWFuZHMsXG4gICAgICAgIGNsZWFudXA6IHtcbiAgICAgICAgICAuLi5wcmVDb21taXRTZXR0aW5ncy5jb21tYW5kcy5jbGVhbnVwLFxuICAgICAgICAgIGdsb2I6IGdldENsZWFudXBHbG9icyhjb25maWcpLFxuICAgICAgICAgIHJ1bjogZ2V0Q2xlYW51cENvbW1hbmQoY29uZmlnKSxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgfSxcbiAgfTtcbiAgaWYgKCF0eXBlY2hlY2spIHtcbiAgICBkZWxldGUgc2V0dGluZ3NbJ3ByZS1wdXNoJ107XG4gIH1cbiAgYXdhaXQgUHJvbWlzZS5hbGwoW1xuICAgIGZzLnByb21pc2VzLndyaXRlRmlsZShcbiAgICAgIHBhdGguam9pbihjb25maWcuZGlyUGF0aCwgJ2xlZnRob29rLnltbCcpLFxuICAgICAgeWFtbC5kdW1wKHNldHRpbmdzLCB7XG4gICAgICAgIGxpbmVXaWR0aDogLTEsXG4gICAgICAgIG5vQ29tcGF0TW9kZTogdHJ1ZSxcbiAgICAgICAgc3R5bGVzOiB7XG4gICAgICAgICAgJyEhbnVsbCc6ICdlbXB0eScsXG4gICAgICAgIH0sXG4gICAgICB9KVxuICAgICksXG4gICAgZnMucHJvbWlzZXMucm0oZGlyUGF0aCwgeyBmb3JjZTogdHJ1ZSwgcmVjdXJzaXZlOiB0cnVlIH0pLFxuICBdKTtcbiAgaWYgKGhhc0h1c2t5RGlyKSB7XG4gICAgYXdhaXQgUHJvbWlzZS5hbGwoW1xuICAgICAgZnMucHJvbWlzZXMucm0oaHVza3lEaXJQYXRoLCB7IGZvcmNlOiB0cnVlLCByZWN1cnNpdmU6IHRydWUgfSksXG4gICAgICBmcy5wcm9taXNlcy5ybShwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICcuaHVza3lyYy5qc29uJyksIHsgZm9yY2U6IHRydWUgfSksXG4gICAgXSk7XG4gICAgc3Bhd25TeW5jKCdnaXQnLCBbJ2NvbmZpZycsICctLXVuc2V0JywgJ2NvcmUuaG9va3NQYXRoJ10sIGNvbmZpZy5kaXJQYXRoKTtcbiAgfVxuXG4gIGlmICh0eXBlY2hlY2spIHtcbiAgICBjb25zdCBwcmVQdXNoID0gZ2V0UHJlUHVzaFNjcmlwdChjb25maWcpO1xuICAgIGZzLm1rZGlyU3luYyhwYXRoLmpvaW4oZGlyUGF0aCwgJ3ByZS1wdXNoJyksIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PlxuICAgICAgZnMucHJvbWlzZXMud3JpdGVGaWxlKHBhdGguam9pbihkaXJQYXRoLCAncHJlLXB1c2gnLCAnY2hlY2suc2gnKSwgcHJlUHVzaCArICdcXG4nLCB7XG4gICAgICAgIG1vZGU6IDBvNzU1LFxuICAgICAgfSlcbiAgICApO1xuICB9XG4gIGNvbnN0IHBvc3RNZXJnZUNvbW1hbmQgPSBgJHtzY3JpcHRzLnBvc3RNZXJnZX1cXG5cXG4ke2dlbmVyYXRlUG9zdE1lcmdlQ29tbWFuZHMoY29uZmlnKS5qb2luKCdcXG4nKX1cXG5gO1xuICBmcy5ta2RpclN5bmMocGF0aC5qb2luKGRpclBhdGgsICdwb3N0LW1lcmdlJyksIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT5cbiAgICBmcy5wcm9taXNlcy53cml0ZUZpbGUocGF0aC5yZXNvbHZlKGRpclBhdGgsICdwb3N0LW1lcmdlJywgJ3ByZXBhcmUuc2gnKSwgcG9zdE1lcmdlQ29tbWFuZCwge1xuICAgICAgbW9kZTogMG83NTUsXG4gICAgfSlcbiAgKTtcbn1cblxuZnVuY3Rpb24gZ2V0UHJlUHVzaFNjcmlwdChjb25maWc6IFBhY2thZ2VDb25maWcpOiBzdHJpbmcge1xuICBsZXQgdHlwZWNoZWNrQ29tbWFuZDogc3RyaW5nO1xuICBpZiAoY29uZmlnLmlzQnVuKSB7XG4gICAgdHlwZWNoZWNrQ29tbWFuZCA9IGNvbmZpZy5kZXBlbmRpbmcud2IgPyAnYnVuIC0tYnVuIHdiIHR5cGVjaGVjaycgOiAnYnVuIHJ1biB0eXBlY2hlY2snO1xuICB9IGVsc2Uge1xuICAgIHR5cGVjaGVja0NvbW1hbmQgPSBjb25maWcuZGVwZW5kaW5nLndiID8gJ3lhcm4gd2IgdHlwZWNoZWNrJyA6ICd5YXJuIHJ1biB0eXBlY2hlY2snO1xuICB9XG4gIGlmIChjb25maWcucmVwb3NpdG9yeT8uc3RhcnRzV2l0aCgnZ2l0aHViOldpbGxCb29zdGVyTGFiLycpKSB7XG4gICAgcmV0dXJuIGBcbiMhL2Jpbi9iYXNoXG5cbmlmIFsgJChnaXQgYnJhbmNoIC0tc2hvdy1jdXJyZW50KSA9IFwibWFpblwiIF0gJiYgWyAkKGdpdCBjb25maWcgdXNlci5lbWFpbCkgIT0gXCJleGthenV1QGdtYWlsLmNvbVwiIF07IHRoZW5cbiAgZWNobyBcIioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlwiXG4gIGVjaG8gXCIqKiogRG9uJ3QgcHVzaCBtYWluIGJyYW5jaCBkaXJlY3RseS4gVXNlIFBSISAqKipcIlxuICBlY2hvIFwiKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXCJcbiAgZXhpdCAxXG5maVxuXG4ke3R5cGVjaGVja0NvbW1hbmR9XG5gLnRyaW0oKTtcbiAgfVxuICByZXR1cm4gdHlwZWNoZWNrQ29tbWFuZDtcbn1cblxuZnVuY3Rpb24gZ2V0Q2xlYW51cEdsb2JzKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IHN0cmluZyB7XG4gIGNvbnN0IHN1cHBvcnRlZEV4dGVuc2lvbnMgPSBbXG4gICAgLi4uZXh0ZW5zaW9ucy5wcmV0dGllcixcbiAgICAuLi5leHRlbnNpb25zLmVzbGludCxcbiAgICAuLi4oY29uZmlnLmRlcGVuZGluZy53YiB8fCBjb25maWcuaXNCdW4gPyBleHRlbnNpb25zLmJpb21lIDogW10pLFxuICBdO1xuICBpZiAoY29uZmlnLmRvZXNDb250YWluUG9ldHJ5TG9jaykge1xuICAgIHN1cHBvcnRlZEV4dGVuc2lvbnMucHVzaCgncHknKTtcbiAgfVxuICBpZiAoY29uZmlnLmRvZXNDb250YWluUHVic3BlY1lhbWwpIHtcbiAgICBzdXBwb3J0ZWRFeHRlbnNpb25zLnB1c2goJ2RhcnQnKTtcbiAgfVxuICBjb25zdCBmaWx0ZXJlZEV4dGVuc2lvbnMgPSBbLi4ubmV3IFNldChzdXBwb3J0ZWRFeHRlbnNpb25zKV1cbiAgICAuZmlsdGVyKChleHRlbnNpb24pID0+IGNvbmZpZy5pc0J1biB8fCAhWydhc3RybycsICdncWwnLCAnc3ZlbHRlJ10uaW5jbHVkZXMoZXh0ZW5zaW9uKSlcbiAgICAudG9Tb3J0ZWQoKTtcbiAgcmV0dXJuIGAqKi8qLnske2ZpbHRlcmVkRXh0ZW5zaW9ucy5qb2luKCcsJyl9fWA7XG59XG5cbmZ1bmN0aW9uIGdldENsZWFudXBDb21tYW5kKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IHN0cmluZyB7XG4gIGlmIChoYXNMb2NhbFdiV29ya3NwYWNlKGNvbmZpZykpIHtcbiAgICByZXR1cm4gJ3lhcm4gd29ya3NwYWNlIEB3aWxsYm9vc3Rlci93YiBzdGFydCAtLXdvcmtpbmctZGlyIFwiJChnaXQgcmV2LXBhcnNlIC0tc2hvdy10b3BsZXZlbClcIiBsaW50IC0tZml4IC0tZm9ybWF0IC0tIHtzdGFnZWRfZmlsZXN9ICYmIGdpdCBhZGQgLS0ge3N0YWdlZF9maWxlc30nO1xuICB9XG4gIGlmIChjb25maWcuaXNCdW4gfHwgY29uZmlnLmRlcGVuZGluZy53Yikge1xuICAgIGNvbnN0IHBhY2thZ2VNYW5hZ2VyID0gY29uZmlnLmlzQnVuID8gJ2J1bicgOiAneWFybic7XG4gICAgY29uc3QgY29tbWFuZCA9IGNvbmZpZy5kZXBlbmRpbmcud2JcbiAgICAgID8gYCR7Y29uZmlnLmlzQnVuID8gJ2J1biAtLWJ1biB3YicgOiAneWFybiB3Yid9IGxpbnQgLS1maXggLS1mb3JtYXQgLS0ge3N0YWdlZF9maWxlc31gXG4gICAgICA6IGAke3BhY2thZ2VNYW5hZ2VyfSBydW4gZm9ybWF0ICYmICR7cGFja2FnZU1hbmFnZXJ9IHJ1biBsaW50LWZpeGA7XG4gICAgcmV0dXJuIGAke2NvbW1hbmR9ICYmIGdpdCBhZGQgLS0ge3N0YWdlZF9maWxlc31gO1xuICB9XG5cbiAgY29uc3QgZXNsaW50UnVsZVN1ZmZpeCA9XG4gICAgY29uZmlnLmRvZXNDb250YWluSnN4T3JUc3ggfHwgY29uZmlnLmRvZXNDb250YWluSnN4T3JUc3hJblBhY2thZ2VzXG4gICAgICA/ICcgLS1ydWxlIFwieyByZWFjdC1ob29rcy9leGhhdXN0aXZlLWRlcHM6IDAgfVwiJ1xuICAgICAgOiAnJztcbiAgY29uc3QgZXNsaW50UGF0dGVybiA9IGV4dGVuc2lvbnMuZXNsaW50Lm1hcCgoZXh0ZW5zaW9uKSA9PiBTdHJpbmcucmF3YFxcLiR7ZXh0ZW5zaW9ufSRgKS5qb2luKCd8Jyk7XG5cbiAgcmV0dXJuIFN0cmluZy5yYXdgXG5lc2xpbnRfZmlsZXM9XCIkKHByaW50ZiAnJXNcXG4nIHtzdGFnZWRfZmlsZXN9IHwgZ3JlcCAtRSAnKCR7ZXNsaW50UGF0dGVybn0pJyB8fCB0cnVlKVwiXG5wYWNrYWdlX2pzb25fZmlsZXM9XCIkKHByaW50ZiAnJXNcXG4nIHtzdGFnZWRfZmlsZXN9IHwgZ3JlcCAtRSAnKF58LylwYWNrYWdlXFwuanNvbiQnIHx8IHRydWUpXCJcbiR7Y29uZmlnLmRvZXNDb250YWluUG9ldHJ5TG9jayA/IFN0cmluZy5yYXdgcHl0aG9uX2ZpbGVzPVwiJChwcmludGYgJyVzXFxuJyB7c3RhZ2VkX2ZpbGVzfSB8IGdyZXAgLUUgJ1xcLnB5JCcgfHwgdHJ1ZSlcImAgOiAnJ31cbiR7Y29uZmlnLmRvZXNDb250YWluUHVic3BlY1lhbWwgPyBTdHJpbmcucmF3YGRhcnRfZmlsZXM9XCIkKHByaW50ZiAnJXNcXG4nIHtzdGFnZWRfZmlsZXN9IHwgZ3JlcCAtRSAnXFwuZGFydCQnIHwgZ3JlcCAtdiAnZ2VuZXJhdGVkJyB8IGdyZXAgLXYgJ1xcLmZyZWV6ZWRcXC5kYXJ0JCcgfCBncmVwIC12ICdcXC5nXFwuZGFydCQnIHx8IHRydWUpXCJgIDogJyd9XG5cbm5vZGUgbm9kZV9tb2R1bGVzLy5iaW4vcHJldHRpZXIgLS1jYWNoZSAtLXdyaXRlIC0taWdub3JlLXVua25vd24gLS0ge3N0YWdlZF9maWxlc31cbmlmIFsgLW4gXCIkZXNsaW50X2ZpbGVzXCIgXTsgdGhlblxuICBub2RlIG5vZGVfbW9kdWxlcy8uYmluL2VzbGludCAtLWNvbG9yIC0tZml4JHtlc2xpbnRSdWxlU3VmZml4fSAtLSAkZXNsaW50X2ZpbGVzXG5maVxuaWYgWyAtbiBcIiRwYWNrYWdlX2pzb25fZmlsZXNcIiBdOyB0aGVuXG4gIG5vZGUgbm9kZV9tb2R1bGVzLy5iaW4vc29ydC1wYWNrYWdlLWpzb24gLS0gJHBhY2thZ2VfanNvbl9maWxlc1xuZmlcbiR7XG4gIGNvbmZpZy5kb2VzQ29udGFpblBvZXRyeUxvY2tcbiAgICA/IGBpZiBbIC1uIFwiJHB5dGhvbl9maWxlc1wiIF07IHRoZW5cbiAgcG9ldHJ5IHJ1biBpc29ydCAtLXByb2ZpbGUgYmxhY2sgLS1maWx0ZXItZmlsZXMgJHB5dGhvbl9maWxlc1xuICBwb2V0cnkgcnVuIGJsYWNrICRweXRob25fZmlsZXNcbiAgcG9ldHJ5IHJ1biBmbGFrZTggJHB5dGhvbl9maWxlc1xuZmlgXG4gICAgOiAnJ1xufVxuJHtcbiAgY29uZmlnLmRvZXNDb250YWluUHVic3BlY1lhbWxcbiAgICA/IGBpZiBbIC1uIFwiJGRhcnRfZmlsZXNcIiBdOyB0aGVuXG4gIGRhcnQgZm9ybWF0ICRkYXJ0X2ZpbGVzXG5maWBcbiAgICA6ICcnXG59XG5naXQgYWRkIC0tIHtzdGFnZWRfZmlsZXN9XG5gLnRyaW0oKTtcbn1cblxuZnVuY3Rpb24gaGFzTG9jYWxXYldvcmtzcGFjZShjb25maWc6IFBhY2thZ2VDb25maWcpOiBib29sZWFuIHtcbiAgaWYgKCFjb25maWcuaXNSb290KSByZXR1cm4gZmFsc2U7XG5cbiAgY29uc3QgbG9jYWxXYlBhY2thZ2VKc29uUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJ3BhY2thZ2VzJywgJ3diJywgJ3BhY2thZ2UuanNvbicpO1xuICBpZiAoIWZzLmV4aXN0c1N5bmMobG9jYWxXYlBhY2thZ2VKc29uUGF0aCkpIHJldHVybiBmYWxzZTtcblxuICB0cnkge1xuICAgIGNvbnN0IHBhY2thZ2VKc29uID0gSlNPTi5wYXJzZShmcy5yZWFkRmlsZVN5bmMobG9jYWxXYlBhY2thZ2VKc29uUGF0aCwgJ3V0ZjgnKSkgYXMgeyBuYW1lPzogc3RyaW5nIH07XG4gICAgcmV0dXJuIHBhY2thZ2VKc29uLm5hbWUgPT09ICdAd2lsbGJvb3N0ZXIvd2InO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn1cblxuZnVuY3Rpb24gZ2VuZXJhdGVQb3N0TWVyZ2VDb21tYW5kcyhjb25maWc6IFBhY2thZ2VDb25maWcpOiBzdHJpbmdbXSB7XG4gIGNvbnN0IHBvc3RNZXJnZUNvbW1hbmRzOiBzdHJpbmdbXSA9IFtdO1xuICBpZiAoY29uZmlnLmhhc1ZlcnNpb25TZXR0aW5ncykge1xuICAgIGNvbnN0IHRvb2xzQ2hhbmdlZFBhdHRlcm4gPSBTdHJpbmcucmF3YChtaXNlXFwudG9tbHxcXC5taXNlXFwudG9tbHxcXC50b29sLXZlcnNpb25zfFxcLi4rLXZlcnNpb24pYDtcbiAgICBwb3N0TWVyZ2VDb21tYW5kcy5wdXNoKFN0cmluZy5yYXdgcnVuX2lmX2NoYW5nZWQgXCIke3Rvb2xzQ2hhbmdlZFBhdHRlcm59XCIgXCJtaXNlIGluc3RhbGxcImApO1xuICB9XG4gIGNvbnN0IGluc3RhbGxDb21tYW5kID0gY29uZmlnLmlzQnVuID8gJ2J1biBpbnN0YWxsJyA6ICd5YXJuJztcbiAgY29uc3Qgcm1OZXh0RGlyZWN0b3J5ID0gY29uZmlnLmRlcGVuZGluZy5ibGl0eiB8fCBjb25maWcuZGVwZW5kaW5nLm5leHQgPyAnICYmIHJtIC1SZiAubmV4dCcgOiAnJztcbiAgcG9zdE1lcmdlQ29tbWFuZHMucHVzaChTdHJpbmcucmF3YHJ1bl9pZl9jaGFuZ2VkIFwicGFja2FnZVxcLmpzb25cIiBcIiR7aW5zdGFsbENvbW1hbmR9JHtybU5leHREaXJlY3Rvcnl9XCJgKTtcbiAgaWYgKGNvbmZpZy5kb2VzQ29udGFpblBvZXRyeUxvY2spIHtcbiAgICBwb3N0TWVyZ2VDb21tYW5kcy5wdXNoKFN0cmluZy5yYXdgcnVuX2lmX2NoYW5nZWQgXCJwb2V0cnlcXC5sb2NrXCIgXCJwb2V0cnkgaW5zdGFsbFwiYCk7XG4gIH1cbiAgaWYgKGNvbmZpZy5kZXBlbmRpbmcuYmxpdHopIHtcbiAgICBwb3N0TWVyZ2VDb21tYW5kcy5wdXNoKFxuICAgICAgU3RyaW5nLnJhd2BydW5faWZfY2hhbmdlZCBcIi4qXFwucHJpc21hXCIgXCJub2RlIG5vZGVfbW9kdWxlcy8uYmluL2JsaXR6IHByaXNtYSBtaWdyYXRlIGRlcGxveVwiYCxcbiAgICAgIFN0cmluZy5yYXdgcnVuX2lmX2NoYW5nZWQgXCIuKlxcLnByaXNtYVwiIFwibm9kZSBub2RlX21vZHVsZXMvLmJpbi9ibGl0eiBwcmlzbWEgZ2VuZXJhdGVcImAsXG4gICAgICBTdHJpbmcucmF3YHJ1bl9pZl9jaGFuZ2VkIFwiLipcXC5wcmlzbWFcIiBcIm5vZGUgbm9kZV9tb2R1bGVzLy5iaW4vYmxpdHogY29kZWdlblwiYFxuICAgICk7XG4gIH0gZWxzZSBpZiAoY29uZmlnLmRlcGVuZGluZy5wcmlzbWEpIHtcbiAgICBwb3N0TWVyZ2VDb21tYW5kcy5wdXNoKFxuICAgICAgU3RyaW5nLnJhd2BydW5faWZfY2hhbmdlZCBcIi4qXFwucHJpc21hXCIgXCJub2RlIG5vZGVfbW9kdWxlcy8uYmluL2RvdGVudiAtYyBkZXZlbG9wbWVudCAtLSBub2RlIG5vZGVfbW9kdWxlcy8uYmluL3ByaXNtYSBtaWdyYXRlIGRlcGxveVwiYCxcbiAgICAgIFN0cmluZy5yYXdgcnVuX2lmX2NoYW5nZWQgXCIuKlxcLnByaXNtYVwiIFwibm9kZSBub2RlX21vZHVsZXMvLmJpbi9kb3RlbnYgLWMgZGV2ZWxvcG1lbnQgLS0gbm9kZSBub2RlX21vZHVsZXMvLmJpbi9wcmlzbWEgZ2VuZXJhdGVcImBcbiAgICApO1xuICB9XG4gIHJldHVybiBwb3N0TWVyZ2VDb21tYW5kcztcbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgcHJvbWlzZVBvb2wgfSBmcm9tICcuLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZW5lcmF0ZUxpbnRzdGFnZWRyYyhjb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdnZW5lcmF0ZUxpbnRzdGFnZWRyYycsIGFzeW5jICgpID0+IHtcbiAgICBhd2FpdCBQcm9taXNlLmFsbChbXG4gICAgICBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnMucHJvbWlzZXMucm0oYCR7Y29uZmlnLmRpclBhdGh9Ly5saW50c3RhZ2VkcmMuY2pzYCwgeyBmb3JjZTogdHJ1ZSB9KSksXG4gICAgICBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnMucHJvbWlzZXMucm0oYCR7Y29uZmlnLmRpclBhdGh9Ly5saW50c3RhZ2VkcmMuanNgLCB7IGZvcmNlOiB0cnVlIH0pKSxcbiAgICAgIHByb21pc2VQb29sLnJ1bigoKSA9PiBmcy5wcm9taXNlcy5ybShgJHtjb25maWcuZGlyUGF0aH0vLmxpbnRzdGFnZWRyYy5qc29uYCwgeyBmb3JjZTogdHJ1ZSB9KSksXG4gICAgXSk7XG4gIH0pO1xufVxuIiwiaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZnNVdGlsIH0gZnJvbSAnLi4vdXRpbHMvZnNVdGlsLmpzJztcbmltcG9ydCB7IGlnbm9yZUZpbGVVdGlsIH0gZnJvbSAnLi4vdXRpbHMvaWdub3JlRmlsZVV0aWwuanMnO1xuaW1wb3J0IHsgcHJvbWlzZVBvb2wgfSBmcm9tICcuLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5cbmNvbnN0IGNvbW1vbkNvbnRlbnQgPSBgXG4zcmQtcGFydHkvXG5hbmRyb2lkL1xuaW9zL1xubm8tZm9ybWF0L1xudGVzdC1maXh0dXJlcy9cbnRlc3QvZml4dHVyZXMvXG4qLmQudHNcbioubWluLmpzXG4ueWFybi9cbi5wbnAuanNcbmA7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZW5lcmF0ZVByZXR0aWVyaWdub3JlKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2dlbmVyYXRlUHJldHRpZXJpZ25vcmUnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICcucHJldHRpZXJpZ25vcmUnKTtcbiAgICBjb25zdCBjb250ZW50ID0gKGF3YWl0IGZzVXRpbC5yZWFkRmlsZUlnbm9yaW5nRXJyb3IoZmlsZVBhdGgpKSA/PyAnJztcbiAgICBjb25zdCBoZWFkVXNlckNvbnRlbnQgPSBpZ25vcmVGaWxlVXRpbC5nZXRIZWFkVXNlckNvbnRlbnQoY29udGVudCk7XG4gICAgY29uc3QgdGFpbFVzZXJDb250ZW50ID0gaWdub3JlRmlsZVV0aWwuZ2V0VGFpbFVzZXJDb250ZW50KGNvbnRlbnQpO1xuXG4gICAgY29uc3QgZ2l0aWdub3JlRmlsZVBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICcuZ2l0aWdub3JlJyk7XG4gICAgY29uc3QgZ2l0aWdub3JlQ29udGVudCA9IChhd2FpdCBpZ25vcmVGaWxlVXRpbC5yZWFkR2l0aWdub3JlV2l0aG91dFNlcGFyYXRvcnMoZ2l0aWdub3JlRmlsZVBhdGgpKSB8fCAnJztcblxuICAgIGxldCBhZGRpdGlvbmFsQ29udGVudCA9ICcnO1xuICAgIGlmIChjb25maWcuZG9lc0NvbnRhaW5QdWJzcGVjWWFtbCkge1xuICAgICAgYWRkaXRpb25hbENvbnRlbnQgPSBgXG5hbmRyb2lkL2FwcC9cbmlvcy9SdW5uZXIvQXNzZXRzLnhjYXNzZXRzL1xucHVic3BlYy55YW1sXG5gO1xuICAgIH1cblxuICAgIGNvbnN0IG5ld0NvbnRlbnQgPSBoZWFkVXNlckNvbnRlbnQgKyBjb21tb25Db250ZW50ICsgYWRkaXRpb25hbENvbnRlbnQgKyBnaXRpZ25vcmVDb250ZW50ICsgdGFpbFVzZXJDb250ZW50O1xuICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiBmc1V0aWwuZ2VuZXJhdGVGaWxlKGZpbGVQYXRoLCBuZXdDb250ZW50KSk7XG4gIH0pO1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IG1lcmdlIGZyb20gJ2RlZXBtZXJnZSc7XG5pbXBvcnQgY2xvbmVEZWVwIGZyb20gJ2xvZGFzaC5jbG9uZWRlZXAnO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBmc1V0aWwgfSBmcm9tICcuLi91dGlscy9mc1V0aWwuanMnO1xuaW1wb3J0IHsgb3ZlcndyaXRlTWVyZ2UgfSBmcm9tICcuLi91dGlscy9tZXJnZVV0aWwuanMnO1xuaW1wb3J0IHsgcHJvbWlzZVBvb2wgfSBmcm9tICcuLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5cbmNvbnN0IGpzb25PYmogPSB7XG4gIHZlbnZQYXRoOiAnLicsXG4gIHZlbnY6ICcudmVudicsXG59O1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVQeXJpZ2h0Q29uZmlnSnNvbihjb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdnZW5lcmF0ZVB5cmlnaHRDb25maWdKc29uJywgYXN5bmMgKCkgPT4ge1xuICAgIGxldCBuZXdTZXR0aW5nczogb2JqZWN0ID0gY2xvbmVEZWVwKGpzb25PYmopO1xuICAgIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAncHlyaWdodGNvbmZpZy5qc29uJyk7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IG9sZENvbnRlbnQgPSBhd2FpdCBmcy5wcm9taXNlcy5yZWFkRmlsZShmaWxlUGF0aCwgJ3V0ZjgnKTtcbiAgICAgIGNvbnN0IG9sZFNldHRpbmdzID0gSlNPTi5wYXJzZShvbGRDb250ZW50KSBhcyBvYmplY3Q7XG4gICAgICBuZXdTZXR0aW5ncyA9IG1lcmdlLmFsbChbbmV3U2V0dGluZ3MsIG9sZFNldHRpbmdzLCBuZXdTZXR0aW5nc10sIHsgYXJyYXlNZXJnZTogb3ZlcndyaXRlTWVyZ2UgfSk7XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBkbyBub3RoaW5nXG4gICAgfVxuICAgIGNvbnN0IG5ld0NvbnRlbnQgPSBKU09OLnN0cmluZ2lmeShuZXdTZXR0aW5ncywgdW5kZWZpbmVkLCAyKTtcbiAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnNVdGlsLmdlbmVyYXRlRmlsZShmaWxlUGF0aCwgbmV3Q29udGVudCkpO1xuICB9KTtcbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGZzVXRpbCB9IGZyb20gJy4uL3V0aWxzL2ZzVXRpbC5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcblxuY29uc3Qgc2VtYW50aWNSZWxlYXNlQmFkZ2UgPVxuICAnWyFbc2VtYW50aWMtcmVsZWFzZV0oaHR0cHM6Ly9pbWcuc2hpZWxkcy5pby9iYWRnZS8lMjAlMjAlRjAlOUYlOTMlQTYlRjAlOUYlOUElODAtc2VtYW50aWMtLXJlbGVhc2UtZTEwMDc5LnN2ZyldKGh0dHBzOi8vZ2l0aHViLmNvbS9zZW1hbnRpYy1yZWxlYXNlL3NlbWFudGljLXJlbGVhc2UpJztcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlUmVhZG1lKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2dlbmVyYXRlUmVhZG1lJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnUkVBRE1FLm1kJyk7XG4gICAgbGV0IG5ld0NvbnRlbnQgPSBhd2FpdCBmcy5wcm9taXNlcy5yZWFkRmlsZShmaWxlUGF0aCwgJ3V0ZjgnKTtcblxuICAgIGlmIChmcy5leGlzdHNTeW5jKHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJy5yZWxlYXNlcmMuanNvbicpKSkge1xuICAgICAgbmV3Q29udGVudCA9IGluc2VydEJhZGdlKG5ld0NvbnRlbnQsIHNlbWFudGljUmVsZWFzZUJhZGdlKTtcbiAgICB9XG5cbiAgICBjb25zdCByZXBvc2l0b3J5ID0gY29uZmlnLnJlcG9zaXRvcnk/LnNsaWNlKGNvbmZpZy5yZXBvc2l0b3J5LmluZGV4T2YoJzonKSArIDEpO1xuICAgIGNvbnN0IGZpbGVOYW1lcyA9IGZzLnJlYWRkaXJTeW5jKGAke2NvbmZpZy5kaXJQYXRofS8uZ2l0aHViL3dvcmtmbG93c2ApO1xuICAgIGZvciAoY29uc3QgZmlsZU5hbWUgb2YgZmlsZU5hbWVzKSB7XG4gICAgICBpZiAoIWZpbGVOYW1lLnN0YXJ0c1dpdGgoJ3Rlc3QnKSAmJiAhZmlsZU5hbWUuc3RhcnRzV2l0aCgnZGVwbG95JykpIGNvbnRpbnVlO1xuXG4gICAgICBsZXQgYmFkZ2VOYW1lID0gZmlsZU5hbWU7XG4gICAgICBiYWRnZU5hbWUgPSAoYmFkZ2VOYW1lWzBdIHx8ICcnKS50b1VwcGVyQ2FzZSgpICsgYmFkZ2VOYW1lLnNsaWNlKDEsIGJhZGdlTmFtZS5pbmRleE9mKCcuJykpO1xuICAgICAgYmFkZ2VOYW1lID0gYmFkZ2VOYW1lLnJlcGxhY2UoJy0nLCAnICcpO1xuICAgICAgaWYgKCFyZXBvc2l0b3J5KSBjb250aW51ZTtcbiAgICAgIGNvbnN0IGJhZGdlID0gYFshWyR7YmFkZ2VOYW1lfV0oaHR0cHM6Ly9naXRodWIuY29tLyR7cmVwb3NpdG9yeX0vYWN0aW9ucy93b3JrZmxvd3MvJHtmaWxlTmFtZX0vYmFkZ2Uuc3ZnKV0oaHR0cHM6Ly9naXRodWIuY29tLyR7cmVwb3NpdG9yeX0vYWN0aW9ucy93b3JrZmxvd3MvJHtmaWxlTmFtZX0pYDtcbiAgICAgIGlmIChmcy5leGlzdHNTeW5jKHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgYC5naXRodWIvd29ya2Zsb3dzLyR7ZmlsZU5hbWV9YCkpKSB7XG4gICAgICAgIG5ld0NvbnRlbnQgPSBpbnNlcnRCYWRnZShuZXdDb250ZW50LCBiYWRnZSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzVXRpbC5nZW5lcmF0ZUZpbGUoZmlsZVBhdGgsIG5ld0NvbnRlbnQpKTtcbiAgfSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpbnNlcnRCYWRnZShyZWFkbWU6IHN0cmluZywgYmFkZ2U6IHN0cmluZyk6IHN0cmluZyB7XG4gIC8vIOaXouOBq2JhZGdl44GM44GC44KL5aC05ZCI44Gv5YmK6ZmkXG4gIHJlYWRtZSA9IHJlYWRtZS5yZXBsYWNlKGJhZGdlLCAnJykucmVwbGFjZUFsbCgvXFxuXFxuXFxuKy9nLCAnXFxuXFxuJyk7XG5cbiAgZm9yIChsZXQgaSA9IDA7IGkgPCByZWFkbWUubGVuZ3RoOyBpKyspIHtcbiAgICBpZiAocmVhZG1lW2kgLSAxXSA9PT0gJ1xcbicgJiYgcmVhZG1lW2ldID09PSAnXFxuJykge1xuICAgICAgY29uc3QgYmVmb3JlID0gcmVhZG1lLnNsaWNlKDAsIGkgKyAxKTtcbiAgICAgIGxldCBhZnRlciA9IHJlYWRtZS5zbGljZShpICsgMSk7XG4gICAgICBpZiAoIWFmdGVyLnN0YXJ0c1dpdGgoJ1snKSAmJiAhYWZ0ZXIuc3RhcnRzV2l0aCgnIScpKSB7XG4gICAgICAgIGFmdGVyID0gYFxcbiR7YWZ0ZXJ9YDtcbiAgICAgIH1cbiAgICAgIHJldHVybiBgJHtiZWZvcmV9JHtiYWRnZX1cXG4ke2FmdGVyfWA7XG4gICAgfVxuICB9XG4gIHJldHVybiBgJHtyZWFkbWV9XFxuJHtiYWRnZX1cXG5gO1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IG1lcmdlIGZyb20gJ2RlZXBtZXJnZSc7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGZzVXRpbCB9IGZyb20gJy4uL3V0aWxzL2ZzVXRpbC5qcyc7XG5pbXBvcnQgeyBvdmVyd3JpdGVNZXJnZSB9IGZyb20gJy4uL3V0aWxzL21lcmdlVXRpbC5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlUmVsZWFzZXJjKHJvb3RDb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdnZW5lcmF0ZVJlbGVhc2VyYycsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShyb290Q29uZmlnLmRpclBhdGgsICcucmVsZWFzZXJjLmpzb24nKTtcbiAgICBpZiAoIWZzLmV4aXN0c1N5bmMoZmlsZVBhdGgpKSByZXR1cm47XG5cbiAgICBjb25zdCBzZXR0aW5ncyA9IEpTT04ucGFyc2UoYXdhaXQgZnMucHJvbWlzZXMucmVhZEZpbGUoZmlsZVBhdGgsICd1dGY4JykpIGFzIHtcbiAgICAgIHBsdWdpbnM/OiAoc3RyaW5nIHwgW3N0cmluZywgdW5rbm93bl0pW107XG4gICAgfTtcbiAgICBjb25zdCBwbHVnaW5zID0gc2V0dGluZ3MucGx1Z2lucyA/PyBbXTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHBsdWdpbnMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNvbnN0IHBsdWdpbkVudHJ5ID0gcGx1Z2luc1tpXTtcbiAgICAgIGNvbnN0IGlzQXJyYXkgPSBBcnJheS5pc0FycmF5KHBsdWdpbkVudHJ5KTtcbiAgICAgIGNvbnN0IHBsdWdpbiA9IGlzQXJyYXkgPyBwbHVnaW5FbnRyeVswXSA6IHBsdWdpbkVudHJ5O1xuICAgICAgY29uc3Qgb2xkQ29uZmlnID0gKGlzQXJyYXkgJiYgcGx1Z2luRW50cnlbMV0pIHx8IHt9O1xuICAgICAgaWYgKHBsdWdpbiA9PT0gJ0BzZW1hbnRpYy1yZWxlYXNlL2NvbW1pdC1hbmFseXplcicpIHtcbiAgICAgICAgcGx1Z2luc1tpXSA9IFtcbiAgICAgICAgICAnQHNlbWFudGljLXJlbGVhc2UvY29tbWl0LWFuYWx5emVyJyxcbiAgICAgICAgICBtZXJnZS5hbGwoXG4gICAgICAgICAgICBbXG4gICAgICAgICAgICAgIG9sZENvbmZpZyxcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHByZXNldDogJ2NvbnZlbnRpb25hbGNvbW1pdHMnLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIHsgYXJyYXlNZXJnZTogb3ZlcndyaXRlTWVyZ2UgfVxuICAgICAgICAgICksXG4gICAgICAgIF07XG4gICAgICB9IGVsc2UgaWYgKHBsdWdpbiA9PT0gJ0BzZW1hbnRpYy1yZWxlYXNlL2dpdGh1YicpIHtcbiAgICAgICAgcGx1Z2luc1tpXSA9IFtcbiAgICAgICAgICAnQHNlbWFudGljLXJlbGVhc2UvZ2l0aHViJyxcbiAgICAgICAgICBtZXJnZS5hbGwoXG4gICAgICAgICAgICBbXG4gICAgICAgICAgICAgIG9sZENvbmZpZyxcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIC8vIGNmLiBodHRwczovL2dpdGh1Yi5jb20vc2VtYW50aWMtcmVsZWFzZS9zZW1hbnRpYy1yZWxlYXNlL2lzc3Vlcy8yMjA0I2lzc3VlY29tbWVudC0xNTA4NDE3NzA0XG4gICAgICAgICAgICAgICAgc3VjY2Vzc0NvbW1lbnRDb25kaXRpb246IGZhbHNlLFxuICAgICAgICAgICAgICAgIGZhaWxDb21tZW50Q29uZGl0aW9uOiBmYWxzZSxcbiAgICAgICAgICAgICAgICBsYWJlbHM6IFsncjogc2VtYW50aWMtcmVsZWFzZSddLFxuICAgICAgICAgICAgICAgIHJlbGVhc2VkTGFiZWxzOiBbJ3JlbGVhc2VkIDpib29rbWFyazonXSxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICB7IGFycmF5TWVyZ2U6IG92ZXJ3cml0ZU1lcmdlIH1cbiAgICAgICAgICApLFxuICAgICAgICBdO1xuICAgICAgfVxuICAgIH1cbiAgICBjb25zdCBuZXdDb250ZW50ID0gSlNPTi5zdHJpbmdpZnkoc2V0dGluZ3MsIHVuZGVmaW5lZCwgMik7XG4gICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzVXRpbC5nZW5lcmF0ZUZpbGUoZmlsZVBhdGgsIG5ld0NvbnRlbnQpKTtcbiAgfSk7XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgbWVyZ2UgZnJvbSAnZGVlcG1lcmdlJztcbmltcG9ydCBjbG9uZURlZXAgZnJvbSAnbG9kYXNoLmNsb25lZGVlcCc7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGZzVXRpbCB9IGZyb20gJy4uL3V0aWxzL2ZzVXRpbC5qcyc7XG5pbXBvcnQgeyBvdmVyd3JpdGVNZXJnZSB9IGZyb20gJy4uL3V0aWxzL21lcmdlVXRpbC5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcblxuY29uc3QganNvbk9iaiA9IHtcbiAgJHNjaGVtYTogJ2h0dHBzOi8vZG9jcy5yZW5vdmF0ZWJvdC5jb20vcmVub3ZhdGUtc2NoZW1hLmpzb24nLFxuICBleHRlbmRzOiBbJ2dpdGh1Yj5XaWxsQm9vc3Rlci93aWxsYm9vc3Rlci1jb25maWdzOnJlbm92YXRlLmpzb241J10sXG59O1xuXG50eXBlIFNldHRpbmdzID0gdHlwZW9mIGpzb25PYmogJiB7IHBhY2thZ2VSdWxlcz86IHsgbWF0Y2hQYWNrYWdlTmFtZXM6IHN0cmluZ1tdOyBlbmFibGVkPzogYm9vbGVhbiB9W10gfTtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlUmVub3ZhdGVKc29uKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2dlbmVyYXRlUmVub3ZhdGVKc29uJywgYXN5bmMgKCkgPT4ge1xuICAgIGxldCBuZXdTZXR0aW5ncyA9IGNsb25lRGVlcChqc29uT2JqKSBhcyBTZXR0aW5ncztcbiAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJ3Jlbm92YXRlLmpzb24nKTtcbiAgICBpZiAoZnMuZXhpc3RzU3luYyhgJHtmaWxlUGF0aH01YCkpIHtcbiAgICAgIC8vIFNpbmNlIGl0IGlzIGRpZmZpY3VsdCBmb3IgcGFyc2luZyByZW5vdmF0ZS5qc29uNSwgd2UgZG8gbm90aGluZ1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0cnkge1xuICAgICAgY29uc3Qgb2xkQ29udGVudCA9IGF3YWl0IGZzLnByb21pc2VzLnJlYWRGaWxlKGZpbGVQYXRoLCAndXRmOCcpO1xuICAgICAgY29uc3Qgb2xkU2V0dGluZ3MgPSBKU09OLnBhcnNlKG9sZENvbnRlbnQpIGFzIFNldHRpbmdzO1xuICAgICAgbmV3U2V0dGluZ3MgPSBtZXJnZS5hbGwoW25ld1NldHRpbmdzLCBvbGRTZXR0aW5ncywgbmV3U2V0dGluZ3NdLCB7XG4gICAgICAgIGFycmF5TWVyZ2U6IG92ZXJ3cml0ZU1lcmdlLFxuICAgICAgfSkgYXMgU2V0dGluZ3M7XG4gICAgICBuZXdTZXR0aW5ncy5leHRlbmRzID0gbmV3U2V0dGluZ3MuZXh0ZW5kcy5maWx0ZXIoKGl0ZW06IHN0cmluZykgPT4gaXRlbSAhPT0gJ0B3aWxsYm9vc3RlcicpO1xuICAgIH0gY2F0Y2gge1xuICAgICAgLy8gZG8gbm90aGluZ1xuICAgIH1cblxuICAgIC8vIERvbid0IHVwZ3JhZGUgTmV4dC5qcyBhdXRvbWF0aWNhbGx5XG4gICAgaWYgKGNvbmZpZy5kZXBlbmRpbmcuYmxpdHopIHtcbiAgICAgIG5ld1NldHRpbmdzLnBhY2thZ2VSdWxlcyA/Pz0gW107XG4gICAgICBpZiAoXG4gICAgICAgICFuZXdTZXR0aW5ncy5wYWNrYWdlUnVsZXMuc29tZSgocnVsZTogeyBtYXRjaFBhY2thZ2VOYW1lcz86IHN0cmluZ1tdIH0pID0+XG4gICAgICAgICAgcnVsZS5tYXRjaFBhY2thZ2VOYW1lcz8uaW5jbHVkZXMoJ25leHQnKVxuICAgICAgICApXG4gICAgICApIHtcbiAgICAgICAgbmV3U2V0dGluZ3MucGFja2FnZVJ1bGVzLnB1c2goeyBtYXRjaFBhY2thZ2VOYW1lczogWyduZXh0J10sIGVuYWJsZWQ6IGZhbHNlIH0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiBmcy5wcm9taXNlcy5ybShwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICcuZGVwZW5kYWJvdCcpLCB7IGZvcmNlOiB0cnVlIH0pKTtcbiAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnMucHJvbWlzZXMucm0ocGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnLnJlbm92YXRlcmMuanNvbicpLCB7IGZvcmNlOiB0cnVlIH0pKTtcbiAgICBjb25zdCBuZXdDb250ZW50ID0gSlNPTi5zdHJpbmdpZnkobmV3U2V0dGluZ3MsIHVuZGVmaW5lZCwgMik7XG4gICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzVXRpbC5nZW5lcmF0ZUZpbGUoZmlsZVBhdGgsIG5ld0NvbnRlbnQpKTtcbiAgfSk7XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcy9wcm9taXNlcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBpbnN0YWxsQWdlbnRTa2lsbHMocm9vdENvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2luc3RhbGxBZ2VudFNraWxscycsIGFzeW5jICgpID0+IHtcbiAgICAvLyBUT0RPOiBXZSBhcmUgdGVtcG9yYXJpbHkgcmVtb3ZpbmcgYWdlbnQgc2tpbGxzIGZyb20gdGhlIHJlcG9cbiAgICAvLyBhd2FpdCBydW5JbnN0YWxsQWdlbnRTa2lsbHMocm9vdENvbmZpZyk7XG4gICAgYXdhaXQgUHJvbWlzZS5hbGwoW1xuICAgICAgZnMucm0ocGF0aC5yZXNvbHZlKHJvb3RDb25maWcuZGlyUGF0aCwgJy5hZ2VudHMnKSwge1xuICAgICAgICBmb3JjZTogdHJ1ZSxcbiAgICAgICAgcmVjdXJzaXZlOiB0cnVlLFxuICAgICAgfSksXG4gICAgICBmcy5ybShwYXRoLnJlc29sdmUocm9vdENvbmZpZy5kaXJQYXRoLCAnLmNsYXVkZScpLCB7XG4gICAgICAgIGZvcmNlOiB0cnVlLFxuICAgICAgICByZWN1cnNpdmU6IHRydWUsXG4gICAgICB9KSxcbiAgICAgIGZzLnJtKHBhdGgucmVzb2x2ZShyb290Q29uZmlnLmRpclBhdGgsICdza2lsbHMtbG9jay5qc29uJyksIHtcbiAgICAgICAgZm9yY2U6IHRydWUsXG4gICAgICB9KSxcbiAgICBdKTtcbiAgfSk7XG59XG4iLCJpbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcblxuY29uc3Qgc3JjRGlyZWN0b3JpZXMgPSB7XG4gIG5vZGU6IFsnc3JjJywgJ3Rlc3QnLCAnc2NyaXB0cyddLnRvU29ydGVkKCksXG4gIGJsaXR6OiBbJ3NyYycsICd0ZXN0JywgJ3NjcmlwdHMnLCAnZGInLCAnaW50ZWdyYXRpb25zJywgJ21haWxlcnMnXS50b1NvcnRlZCgpLFxufTtcblxuZXhwb3J0IGZ1bmN0aW9uIGdldFNyY0RpcnMoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogc3RyaW5nW10ge1xuICBpZiAoY29uZmlnLmRlcGVuZGluZy5ibGl0eikge1xuICAgIHJldHVybiBzcmNEaXJlY3Rvcmllcy5ibGl0ejtcbiAgfVxuICByZXR1cm4gc3JjRGlyZWN0b3JpZXMubm9kZTtcbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCBtZXJnZSBmcm9tICdkZWVwbWVyZ2UnO1xuaW1wb3J0IGNsb25lRGVlcCBmcm9tICdsb2Rhc2guY2xvbmVkZWVwJztcbmltcG9ydCB0eXBlIHsgVHNDb25maWdKc29uIH0gZnJvbSAndHlwZS1mZXN0JztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZnNVdGlsIH0gZnJvbSAnLi4vdXRpbHMvZnNVdGlsLmpzJztcbmltcG9ydCB7IGNvbWJpbmVNZXJnZSB9IGZyb20gJy4uL3V0aWxzL21lcmdlVXRpbC5qcyc7XG5pbXBvcnQgeyBzb3J0S2V5cyB9IGZyb20gJy4uL3V0aWxzL29iamVjdFV0aWwuanMnO1xuaW1wb3J0IHsgcHJvbWlzZVBvb2wgfSBmcm9tICcuLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5pbXBvcnQgeyBnZXRTcmNEaXJzIH0gZnJvbSAnLi4vdXRpbHMvc3JjRGlyZWN0b3JpZXMuanMnO1xuaW1wb3J0IHsgZ2V0VHNjb25maWdFeHRlbmRzIH0gZnJvbSAnLi4vdXRpbHMvdHNjb25maWdCYXNlLmpzJztcblxuY29uc3Qgcm9vdEpzb25PYmogPSB7XG4gIGNvbXBpbGVyT3B0aW9uczoge1xuICAgIGFsd2F5c1N0cmljdDogdHJ1ZSxcbiAgICBub1VuY2hlY2tlZEluZGV4ZWRBY2Nlc3M6IHRydWUsIC8vIGZvciBAdHlwZXNjcmlwdC1lc2xpbnQvcHJlZmVyLW51bGxpc2gtY29hbGVzY2luZ1xuICAgIGFsbG93U3ludGhldGljRGVmYXVsdEltcG9ydHM6IHRydWUsIC8vIGFsbG93IGBpbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnYFxuICAgIGVzTW9kdWxlSW50ZXJvcDogdHJ1ZSwgLy8gYWxsb3cgZGVmYXVsdCBpbXBvcnQgZnJvbSBDb21tb25KUy9BTUQvVU1EIG1vZHVsZXNcbiAgICByZXNvbHZlSnNvbk1vZHVsZTogdHJ1ZSwgLy8gYWxsb3cgdG8gaW1wb3J0IEpTT04gZmlsZXNcbiAgICBkZWNsYXJhdGlvbjogdHJ1ZSxcbiAgICBzb3VyY2VNYXA6IHRydWUsXG4gICAgaW1wb3J0SGVscGVyczogZmFsc2UsXG4gICAgbm9FbWl0OiBmYWxzZSxcbiAgICBvdXREaXI6ICdkaXN0JyxcbiAgfSxcbiAgZXhjbHVkZTogWydwYWNrYWdlcy8qL3Rlc3QvZml4dHVyZXMnLCAndGVzdC9maXh0dXJlcyddLFxuICBpbmNsdWRlOiBbXG4gICAgJ3BhY2thZ2VzLyovc2NyaXB0cy8qKi8qJyxcbiAgICAncGFja2FnZXMvKi9zcmMvKiovKicsXG4gICAgJ3BhY2thZ2VzLyovdGVzdC8qKi8qJyxcbiAgICAnc2NyaXB0cy8qKi8qJyxcbiAgICAnc3JjLyoqLyonLFxuICAgICd0ZXN0LyoqLyonLFxuICBdLFxufTtcblxuY29uc3Qgc3ViSnNvbk9iaiA9IHtcbiAgY29tcGlsZXJPcHRpb25zOiB7XG4gICAgYWx3YXlzU3RyaWN0OiB0cnVlLFxuICAgIG5vVW5jaGVja2VkSW5kZXhlZEFjY2VzczogdHJ1ZSwgLy8gZm9yIEB0eXBlc2NyaXB0LWVzbGludC9wcmVmZXItbnVsbGlzaC1jb2FsZXNjaW5nXG4gICAgYWxsb3dTeW50aGV0aWNEZWZhdWx0SW1wb3J0czogdHJ1ZSwgLy8gYWxsb3cgYGltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCdgXG4gICAgZXNNb2R1bGVJbnRlcm9wOiB0cnVlLCAvLyBhbGxvdyBkZWZhdWx0IGltcG9ydCBmcm9tIENvbW1vbkpTL0FNRC9VTUQgbW9kdWxlc1xuICAgIHJlc29sdmVKc29uTW9kdWxlOiB0cnVlLCAvLyBhbGxvdyB0byBpbXBvcnQgSlNPTiBmaWxlc1xuICAgIGRlY2xhcmF0aW9uOiB0cnVlLFxuICAgIHNvdXJjZU1hcDogdHJ1ZSxcbiAgICBpbXBvcnRIZWxwZXJzOiBmYWxzZSxcbiAgICBub0VtaXQ6IGZhbHNlLFxuICAgIG91dERpcjogJ2Rpc3QnLFxuICB9LFxuICBleGNsdWRlOiBbJ3Rlc3QvZml4dHVyZXMnXSxcbiAgaW5jbHVkZTogWydzY3JpcHRzLyoqLyonLCAnc3JjLyoqLyonLCAndGVzdC8qKi8qJ10sXG59O1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVUc2NvbmZpZyhjb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdnZW5lcmF0ZVRzY29uZmlnJywgYXN5bmMgKCkgPT4ge1xuICAgIGlmIChjb25maWcuZGVwZW5kaW5nLmJsaXR6IHx8IGNvbmZpZy5kZXBlbmRpbmcubmV4dCkgcmV0dXJuO1xuXG4gICAgbGV0IG5ld1NldHRpbmdzID0gY2xvbmVEZWVwKGNvbmZpZy5pc1Jvb3QgPyByb290SnNvbk9iaiA6IHN1Ykpzb25PYmopIGFzIFRzQ29uZmlnSnNvbjtcbiAgICBjb25zdCBnZW5lcmF0ZWRSb290RGlyID0gZ2V0R2VuZXJhdGVkUm9vdERpcihjb25maWcpO1xuICAgIGNvbnN0IGdlbmVyYXRlZFR5cGVzID0gZ2V0R2VuZXJhdGVkVHlwZXMoY29uZmlnKTtcbiAgICBuZXdTZXR0aW5ncy5leHRlbmRzID0gZ2V0VHNjb25maWdFeHRlbmRzKGNvbmZpZyk7XG4gICAgaWYgKGdlbmVyYXRlZFJvb3REaXIpIHtcbiAgICAgIG5ld1NldHRpbmdzLmNvbXBpbGVyT3B0aW9ucyA9IHsgLi4ubmV3U2V0dGluZ3MuY29tcGlsZXJPcHRpb25zLCByb290RGlyOiBnZW5lcmF0ZWRSb290RGlyIH07XG4gICAgfVxuICAgIGlmIChnZW5lcmF0ZWRUeXBlcy5sZW5ndGggPiAwKSB7XG4gICAgICBuZXdTZXR0aW5ncy5jb21waWxlck9wdGlvbnMgPSB7IC4uLm5ld1NldHRpbmdzLmNvbXBpbGVyT3B0aW9ucywgdHlwZXM6IGdlbmVyYXRlZFR5cGVzIH07XG4gICAgfVxuICAgIGlmICghY29uZmlnLmRvZXNDb250YWluSnN4T3JUc3ggJiYgIWNvbmZpZy5kb2VzQ29udGFpbkpzeE9yVHN4SW5QYWNrYWdlcykge1xuICAgICAgZGVsZXRlIG5ld1NldHRpbmdzLmNvbXBpbGVyT3B0aW9ucz8uanN4O1xuICAgIH0gZWxzZSBpZiAoIWNvbmZpZy5pc0J1biAmJiAhY29uZmlnLmRlcGVuZGluZy5yZWFjdE5hdGl2ZSkge1xuICAgICAgbmV3U2V0dGluZ3MuY29tcGlsZXJPcHRpb25zID0geyAuLi5uZXdTZXR0aW5ncy5jb21waWxlck9wdGlvbnMsIGpzeDogJ3JlYWN0LWpzeCcgfTtcbiAgICB9XG4gICAgaWYgKGNvbmZpZy5pc1Jvb3QgJiYgIWNvbmZpZy5kb2VzQ29udGFpblN1YlBhY2thZ2VKc29ucykge1xuICAgICAgbmV3U2V0dGluZ3MuaW5jbHVkZSA9IG5ld1NldHRpbmdzLmluY2x1ZGU/LmZpbHRlcigoZGlyUGF0aDogc3RyaW5nKSA9PiAhZGlyUGF0aC5zdGFydHNXaXRoKCdwYWNrYWdlcy8qLycpKTtcbiAgICAgIG5ld1NldHRpbmdzLmV4Y2x1ZGUgPSBuZXdTZXR0aW5ncy5leGNsdWRlPy5maWx0ZXIoKGRpclBhdGg6IHN0cmluZykgPT4gIWRpclBhdGguc3RhcnRzV2l0aCgncGFja2FnZXMvKi8nKSk7XG4gICAgfVxuXG4gICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICd0c2NvbmZpZy5qc29uJyk7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGV4aXN0aW5nQ29udGVudCA9IGF3YWl0IGZzLnByb21pc2VzLnJlYWRGaWxlKGZpbGVQYXRoLCAndXRmOCcpO1xuICAgICAgY29uc3Qgb2xkU2V0dGluZ3MgPSBKU09OLnBhcnNlKGV4aXN0aW5nQ29udGVudCkgYXMgVHNDb25maWdKc29uO1xuICAgICAgY29uc3QgZXhpc3RpbmdSb290RGlyID0gb2xkU2V0dGluZ3MuY29tcGlsZXJPcHRpb25zPy5yb290RGlyO1xuICAgICAgY29uc3QgZXhpc3RpbmdUeXBlcyA9IG5vcm1hbGl6ZVN0cmluZ0FycmF5KG9sZFNldHRpbmdzLmNvbXBpbGVyT3B0aW9ucz8udHlwZXMpO1xuICAgICAgbmV3U2V0dGluZ3MuZXh0ZW5kcyA9IG1lcmdlVHNjb25maWdFeHRlbmRzKG5ld1NldHRpbmdzLmV4dGVuZHMsIG9sZFNldHRpbmdzLmV4dGVuZHMpO1xuICAgICAgZGVsZXRlIG9sZFNldHRpbmdzLmV4dGVuZHM7XG4gICAgICBkZWxldGUgb2xkU2V0dGluZ3MuY29tcGlsZXJPcHRpb25zPy5qc3g7XG4gICAgICBuZXdTZXR0aW5ncyA9IG1lcmdlLmFsbChbbmV3U2V0dGluZ3MsIG9sZFNldHRpbmdzLCBuZXdTZXR0aW5nc10sIHsgYXJyYXlNZXJnZTogY29tYmluZU1lcmdlIH0pO1xuICAgICAgbmV3U2V0dGluZ3MuaW5jbHVkZSA9IG5ld1NldHRpbmdzLmluY2x1ZGU/LmZpbHRlcihcbiAgICAgICAgKGRpclBhdGg6IHN0cmluZykgPT5cbiAgICAgICAgICAhZGlyUGF0aC5pbmNsdWRlcygnQHR5cGVzJykgJiYgIWRpclBhdGguaW5jbHVkZXMoJ19fdGVzdHNfXy8nKSAmJiAhZGlyUGF0aC5pbmNsdWRlcygndGVzdHMvJylcbiAgICAgICk7XG4gICAgICBuZXdTZXR0aW5ncy5jb21waWxlck9wdGlvbnMgPz89IHt9O1xuICAgICAgaWYgKGV4aXN0aW5nUm9vdERpciAmJiAhc2hvdWxkUmVwbGFjZUV4aXN0aW5nUm9vdERpcihleGlzdGluZ1Jvb3REaXIsIGdlbmVyYXRlZFJvb3REaXIpKSB7XG4gICAgICAgIG5ld1NldHRpbmdzLmNvbXBpbGVyT3B0aW9ucy5yb290RGlyID0gZXhpc3RpbmdSb290RGlyO1xuICAgICAgfSBlbHNlIGlmIChnZW5lcmF0ZWRSb290RGlyKSB7XG4gICAgICAgIG5ld1NldHRpbmdzLmNvbXBpbGVyT3B0aW9ucy5yb290RGlyID0gZ2VuZXJhdGVkUm9vdERpcjtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGRlbGV0ZSBuZXdTZXR0aW5ncy5jb21waWxlck9wdGlvbnMucm9vdERpcjtcbiAgICAgIH1cblxuICAgICAgY29uc3QgbWVyZ2VkVHlwZXMgPSBbLi4ubmV3IFNldChbLi4uZXhpc3RpbmdUeXBlcywgLi4uZ2VuZXJhdGVkVHlwZXNdKV07XG4gICAgICBpZiAobWVyZ2VkVHlwZXMubGVuZ3RoID4gMCkge1xuICAgICAgICBuZXdTZXR0aW5ncy5jb21waWxlck9wdGlvbnMudHlwZXMgPSBtZXJnZWRUeXBlcztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGRlbGV0ZSBuZXdTZXR0aW5ncy5jb21waWxlck9wdGlvbnMudHlwZXM7XG4gICAgICB9XG4gICAgICBpZiAoc2hvdWxkRGVsZXRlVHlwZVJvb3RzKGdlbmVyYXRlZFR5cGVzKSkge1xuICAgICAgICBkZWxldGUgbmV3U2V0dGluZ3MuY29tcGlsZXJPcHRpb25zLnR5cGVSb290cztcbiAgICAgIH1cbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIGRvIG5vdGhpbmdcbiAgICB9XG4gICAgc29ydEtleXMobmV3U2V0dGluZ3MpO1xuICAgIG5ld1NldHRpbmdzLmluY2x1ZGU/LnNvcnQoKTtcbiAgICAvLyBEb24ndCB1c2Ugb2xkIGRlY29yYXRvclxuICAgIGRlbGV0ZSBuZXdTZXR0aW5ncy5jb21waWxlck9wdGlvbnM/LmV4cGVyaW1lbnRhbERlY29yYXRvcnM7XG4gICAgaWYgKGNvbmZpZy5kZXBlbmRpbmcucmVhY3ROYXRpdmUpIHtcbiAgICAgIGRlbGV0ZSBuZXdTZXR0aW5ncy5jb21waWxlck9wdGlvbnM/LnZlcmJhdGltTW9kdWxlU3ludGF4O1xuICAgIH1cbiAgICBjb25zdCBuZXdDb250ZW50ID0gSlNPTi5zdHJpbmdpZnkobmV3U2V0dGluZ3MsIHVuZGVmaW5lZCwgMik7XG4gICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzVXRpbC5nZW5lcmF0ZUZpbGUoZmlsZVBhdGgsIG5ld0NvbnRlbnQpKTtcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIG1lcmdlVHNjb25maWdFeHRlbmRzKFxuICBnZW5lcmF0ZWRFeHRlbmRzOiBUc0NvbmZpZ0pzb25bJ2V4dGVuZHMnXSxcbiAgZXhpc3RpbmdFeHRlbmRzOiBUc0NvbmZpZ0pzb25bJ2V4dGVuZHMnXVxuKTogVHNDb25maWdKc29uWydleHRlbmRzJ10ge1xuICBjb25zdCBtZXJnZWRFeHRlbmRzID0gWy4uLm5vcm1hbGl6ZUV4dGVuZHMoZ2VuZXJhdGVkRXh0ZW5kcyksIC4uLm5vcm1hbGl6ZUV4dGVuZHMoZXhpc3RpbmdFeHRlbmRzKV07XG4gIGNvbnN0IHVuaXF1ZUV4dGVuZHMgPSBbLi4ubmV3IFNldChtZXJnZWRFeHRlbmRzKV07XG4gIGlmICh1bmlxdWVFeHRlbmRzLmxlbmd0aCA9PT0gMCkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgaWYgKHVuaXF1ZUV4dGVuZHMubGVuZ3RoID09PSAxKSByZXR1cm4gdW5pcXVlRXh0ZW5kc1swXTtcbiAgcmV0dXJuIHVuaXF1ZUV4dGVuZHM7XG59XG5cbmZ1bmN0aW9uIG5vcm1hbGl6ZUV4dGVuZHModmFsdWU6IFRzQ29uZmlnSnNvblsnZXh0ZW5kcyddKTogc3RyaW5nW10ge1xuICBpZiAoIXZhbHVlKSByZXR1cm4gW107XG4gIHJldHVybiBBcnJheS5pc0FycmF5KHZhbHVlKSA/IHZhbHVlIDogW3ZhbHVlXTtcbn1cblxuZnVuY3Rpb24gbm9ybWFsaXplU3RyaW5nQXJyYXkodmFsdWU6IHVua25vd24pOiBzdHJpbmdbXSB7XG4gIGlmICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnKSByZXR1cm4gW3ZhbHVlXTtcbiAgaWYgKCFBcnJheS5pc0FycmF5KHZhbHVlKSkgcmV0dXJuIFtdO1xuICByZXR1cm4gdmFsdWUuZmlsdGVyKChpdGVtKTogaXRlbSBpcyBzdHJpbmcgPT4gdHlwZW9mIGl0ZW0gPT09ICdzdHJpbmcnKTtcbn1cblxuZnVuY3Rpb24gc2hvdWxkRGVsZXRlVHlwZVJvb3RzKHR5cGVOYW1lczogc3RyaW5nW10pOiBib29sZWFuIHtcbiAgLy8gT25seSBnZW5lcmF0ZWQgcGFja2FnZS1vd25lZCB0ZXN0IHR5cGVzIHNob3VsZCB0cmlnZ2VyIHRoaXMuIFVzZXItZGVmaW5lZCBzbGFzaC1iYXNlZFxuICAvLyBlbnRyaWVzIG1heSBpbnRlbnRpb25hbGx5IHJlbHkgb24gY3VzdG9tIHR5cGVSb290cyBhbmQgc2hvdWxkIGJlIHByZXNlcnZlZCBhcy1pcy5cbiAgcmV0dXJuIHR5cGVOYW1lcy5zb21lKCh0eXBlTmFtZSkgPT4gdHlwZU5hbWUgPT09ICdjeXByZXNzJyB8fCB0eXBlTmFtZS5pbmNsdWRlcygnLycpKTtcbn1cblxuZnVuY3Rpb24gZ2V0R2VuZXJhdGVkUm9vdERpcihjb25maWc6IFBhY2thZ2VDb25maWcpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBjb25zdCByb290RGlyQ2FuZGlkYXRlcyA9IGdldFJvb3REaXJDYW5kaWRhdGVzKGNvbmZpZyk7XG4gIC8vIEtlZXAgdGVzdCBhbmQgc2NyaXB0cyBpbiB0aGlzIGxpc3Qgc28gbWl4ZWQgdHNjb25maWdzIG9taXQgcm9vdERpciBpbnN0ZWFkIG9mXG4gIC8vIGdlbmVyYXRpbmcgYSBzcmMtb25seSByb290RGlyIHRoYXQgY29uZmxpY3RzIHdpdGggdGhlIGdlbmVyYXRlZCBpbmNsdWRlIGdsb2JzLlxuICBjb25zdCBleGlzdGluZ0luY2x1ZGVkRGlycyA9IGdldFNyY0RpcnMoY29uZmlnKS5maWx0ZXIoKGRpck5hbWUpID0+XG4gICAgZnMuZXhpc3RzU3luYyhwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsIGRpck5hbWUpKVxuICApO1xuICBjb25zdCBleGlzdGluZ1Jvb3RTb3VyY2VEaXJzID0gZXhpc3RpbmdJbmNsdWRlZERpcnMuZmlsdGVyKChkaXJOYW1lKSA9PiByb290RGlyQ2FuZGlkYXRlcy5pbmNsdWRlcyhkaXJOYW1lKSk7XG5cbiAgLy8gU3VicGFja2FnZSB0c2NvbmZpZ3MgaW5oZXJpdCByb290IG9wdGlvbnMsIHNvIGEgbW9ub3JlcG8gcm9vdERpciB3b3VsZCBzaGlmdFxuICAvLyBnZW5lcmF0ZWQgcGFja2FnZSBkZWNsYXJhdGlvbnMgaW50byBuZXN0ZWQgcGF0aHMgc3VjaCBhcyBkaXN0L3NoYXJlZC9zaGFyZWQvc3JjLlxuICBpZiAoY29uZmlnLmlzUm9vdCAmJiBjb25maWcuZG9lc0NvbnRhaW5TdWJQYWNrYWdlSnNvbnMpIHJldHVybiB1bmRlZmluZWQ7XG5cbiAgaWYgKGV4aXN0aW5nSW5jbHVkZWREaXJzLmxlbmd0aCA9PT0gMSAmJiBleGlzdGluZ1Jvb3RTb3VyY2VEaXJzLmxlbmd0aCA9PT0gMSkge1xuICAgIHJldHVybiBgLi8ke2V4aXN0aW5nUm9vdFNvdXJjZURpcnNbMF19YDtcbiAgfVxufVxuXG5mdW5jdGlvbiBnZXRSb290RGlyQ2FuZGlkYXRlcyhjb25maWc6IFBhY2thZ2VDb25maWcpOiBzdHJpbmdbXSB7XG4gIHJldHVybiBnZXRTcmNEaXJzKGNvbmZpZykuZmlsdGVyKChkaXJOYW1lKSA9PiBkaXJOYW1lICE9PSAnc2NyaXB0cycgJiYgZGlyTmFtZSAhPT0gJ3Rlc3QnKTtcbn1cblxuZnVuY3Rpb24gc2hvdWxkUmVwbGFjZUV4aXN0aW5nUm9vdERpcihleGlzdGluZ1Jvb3REaXI6IHN0cmluZywgZ2VuZXJhdGVkUm9vdERpcjogc3RyaW5nIHwgdW5kZWZpbmVkKTogYm9vbGVhbiB7XG4gIC8vIE1peGVkIHNvdXJjZS90ZXN0IHRzY29uZmlncyBtdXN0IG9taXQgcm9vdERpcjsgb3RoZXJ3aXNlIHNyYy1vbmx5IHJvb3REaXIgYnJlYWtzIHR5cGVjaGVjayxcbiAgLy8gd2hpbGUgXCIuXCIgY2hhbmdlcyBsaWJyYXJ5IGRlY2xhcmF0aW9uIG91dHB1dCBmcm9tIGRpc3QvKi5kLnRzIHRvIGRpc3Qvc3JjLyouZC50cy5cbiAgcmV0dXJuIGdlbmVyYXRlZFJvb3REaXIgPT09IHVuZGVmaW5lZCB8fCAoZXhpc3RpbmdSb290RGlyID09PSAnLicgJiYgZ2VuZXJhdGVkUm9vdERpciAhPT0gJy4nKTtcbn1cblxuZnVuY3Rpb24gZ2V0R2VuZXJhdGVkVHlwZXMoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogc3RyaW5nW10ge1xuICBjb25zdCB0eXBlTmFtZXMgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgY29uc3QgZGVwZW5kZW5jaWVzID0ge1xuICAgIC4uLmNvbmZpZy5wYWNrYWdlSnNvbj8uZGVwZW5kZW5jaWVzLFxuICAgIC4uLmNvbmZpZy5wYWNrYWdlSnNvbj8uZGV2RGVwZW5kZW5jaWVzLFxuICB9O1xuXG4gIGlmIChjb25maWcuaXNCdW4pIHtcbiAgICB0eXBlTmFtZXMuYWRkKCdidW4nKTtcbiAgfSBlbHNlIGlmICghY29uZmlnLmRlcGVuZGluZy5yZWFjdE5hdGl2ZSkge1xuICAgIHR5cGVOYW1lcy5hZGQoJ25vZGUnKTtcbiAgfVxuICBpZiAoXG4gICAgZGVwZW5kZW5jaWVzLmplc3QgfHxcbiAgICBkZXBlbmRlbmNpZXNbJ0BqZXN0L2dsb2JhbHMnXSB8fFxuICAgIGRlcGVuZGVuY2llc1snamVzdC1lbnZpcm9ubWVudC1qc2RvbSddIHx8XG4gICAgZGVwZW5kZW5jaWVzWyd0cy1qZXN0J11cbiAgKSB7XG4gICAgdHlwZU5hbWVzLmFkZCgnamVzdCcpO1xuICB9XG4gIGlmIChkZXBlbmRlbmNpZXMudml0ZXN0KSB7XG4gICAgdHlwZU5hbWVzLmFkZCgndml0ZXN0L2dsb2JhbHMnKTtcbiAgfVxuICBpZiAoZGVwZW5kZW5jaWVzLm1vY2hhKSB7XG4gICAgdHlwZU5hbWVzLmFkZCgnbW9jaGEnKTtcbiAgfVxuICBpZiAoZGVwZW5kZW5jaWVzLmN5cHJlc3MpIHtcbiAgICB0eXBlTmFtZXMuYWRkKCdjeXByZXNzJyk7XG4gIH1cblxuICByZXR1cm4gWy4uLnR5cGVOYW1lc107XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgbWVyZ2UgZnJvbSAnZGVlcG1lcmdlJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZnNVdGlsIH0gZnJvbSAnLi4vdXRpbHMvZnNVdGlsLmpzJztcbmltcG9ydCB7IHNvcnRLZXlzIH0gZnJvbSAnLi4vdXRpbHMvb2JqZWN0VXRpbC5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcblxuY29uc3QgZXhjbHVkZUZpbGVQYXR0ZXJucyA9IFtcbiAgJyoqLy5naXQvb2JqZWN0cy8qKicsXG4gICcqKi8uZ2l0L3N1YnRyZWUtY2FjaGUvKionLFxuICAnKiovbm9kZV9tb2R1bGVzLyoqJyxcbiAgJyoqL3RtcC8qKicsXG4gICcqKi90ZW1wLyoqJyxcbiAgJyoqL2Rpc3QvKionLFxuXTtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlVnNjb2RlU2V0dGluZ3MoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZ2VuZXJhdGVWc2NvZGVTZXR0aW5ncycsIGFzeW5jICgpID0+IHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICcudnNjb2RlJywgJ3NldHRpbmdzLmpzb24nKTtcbiAgICAgIGNvbnN0IGV4aXN0aW5nQ29udGVudCA9IGF3YWl0IGZzLnByb21pc2VzLnJlYWRGaWxlKGZpbGVQYXRoLCAndXRmOCcpO1xuICAgICAgbGV0IHNldHRpbmdzID0gSlNPTi5wYXJzZShleGlzdGluZ0NvbnRlbnQpIGFzIG9iamVjdDtcbiAgICAgIGZvciAoY29uc3QgZXhjbHVkZUZpbGVQYXR0ZXJuIG9mIGV4Y2x1ZGVGaWxlUGF0dGVybnMpIHtcbiAgICAgICAgc2V0dGluZ3MgPSBtZXJnZS5hbGwoW3NldHRpbmdzLCBleGNsdWRlU2V0dGluZyhleGNsdWRlRmlsZVBhdHRlcm4pXSk7XG4gICAgICB9XG4gICAgICBpZiAoY29uZmlnLmRvZXNDb250YWluUG9ldHJ5TG9jaykge1xuICAgICAgICBzZXR0aW5ncyA9IG1lcmdlLmFsbChbc2V0dGluZ3MsIGV4Y2x1ZGVTZXR0aW5nKCcqKi8udmVudi8qKicpXSk7XG4gICAgICB9XG4gICAgICBpZiAoY29uZmlnLmRlcGVuZGluZy5uZXh0KSB7XG4gICAgICAgIHNldHRpbmdzID0gbWVyZ2UuYWxsKFtzZXR0aW5ncywgZXhjbHVkZVNldHRpbmcoJyoqLy5uZXh0LyoqJyldKTtcbiAgICAgIH1cbiAgICAgIC8vIExMTeOBq+OCiOOCi3ZpYmUgY29kaW5n44Gn44Gv44CB6Ieq5YuV44OV44Kp44O844Oe44OD44OI44KE44Kz44O844OJ44Ki44Kv44K344On44Oz44KS54Sh5Yq55YyW44GZ44KL44GT44Go44GnXG4gICAgICAvLyDnlJ/miJDjgZXjgozjgZ/jgrPjg7zjg4njga7lhYPjga7lvaLlvI/jgpLntq3mjIHjgafjgY3jgotcbiAgICAgIGlmICgnZWRpdG9yLmNvZGVBY3Rpb25zT25TYXZlJyBpbiBzZXR0aW5ncykge1xuICAgICAgICBkZWxldGUgc2V0dGluZ3NbJ2VkaXRvci5jb2RlQWN0aW9uc09uU2F2ZSddO1xuICAgICAgfVxuICAgICAgaWYgKCdlZGl0b3IuZm9ybWF0T25TYXZlJyBpbiBzZXR0aW5ncykge1xuICAgICAgICBkZWxldGUgc2V0dGluZ3NbJ2VkaXRvci5mb3JtYXRPblNhdmUnXTtcbiAgICAgIH1cbiAgICAgIHNvcnRLZXlzKHNldHRpbmdzIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KTtcbiAgICAgIGNvbnN0IG5ld0NvbnRlbnQgPSBKU09OLnN0cmluZ2lmeShzZXR0aW5ncywgdW5kZWZpbmVkLCAyKTtcbiAgICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiBmc1V0aWwuZ2VuZXJhdGVGaWxlKGZpbGVQYXRoLCBuZXdDb250ZW50KSk7XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBkbyBub3RoaW5nXG4gICAgfVxuICB9KTtcbn1cblxuZnVuY3Rpb24gZXhjbHVkZVNldHRpbmcoZXhjbHVkZUZpbGVQYXR0ZXJuOiBzdHJpbmcpOiBvYmplY3Qge1xuICByZXR1cm4ge1xuICAgICdmaWxlcy53YXRjaGVyRXhjbHVkZSc6IHtcbiAgICAgIFtleGNsdWRlRmlsZVBhdHRlcm5dOiB0cnVlLFxuICAgIH0sXG4gIH07XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgdHlwZSB7IENvbmZpZ3VyYXRpb25WYWx1ZU1hcCB9IGZyb20gJ0B5YXJucGtnL2NvcmUnO1xuaW1wb3J0IHlhbWwgZnJvbSAnanMteWFtbCc7XG5pbXBvcnQgc2VtdmVyIGZyb20gJ3NlbXZlcic7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuaW1wb3J0IHsgc3Bhd25TeW5jLCBzcGF3blN5bmNBbmRSZXR1cm5TdGRvdXQgfSBmcm9tICcuLi91dGlscy9zcGF3blV0aWwuanMnO1xuXG50eXBlIFNldHRpbmdzID0ge1xuICBkZWZhdWx0U2VtdmVyUmFuZ2VQcmVmaXg6IHN0cmluZztcbiAgbm1Nb2RlOiBzdHJpbmc7XG4gIG5vZGVMaW5rZXI6IHN0cmluZztcbiAgbnBtTWluaW1hbEFnZUdhdGU/OiBzdHJpbmc7XG4gIG5wbVByZWFwcHJvdmVkUGFja2FnZXM/OiBzdHJpbmdbXTtcbiAgcGx1Z2lucz86IFBsdWdpbltdO1xufSAmIFBhcnRpYWw8Q29uZmlndXJhdGlvblZhbHVlTWFwPjtcblxuaW50ZXJmYWNlIFBsdWdpbiB7XG4gIGNoZWNrc3VtOiBzdHJpbmc7XG4gIHBhdGg6IHN0cmluZztcbiAgc3BlYzogc3RyaW5nO1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVZYXJucmNZbWwoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZ2VuZXJhdGVZYXJucmNZbWwnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgeWFybnJjWW1sUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJy55YXJucmMueW1sJyk7XG4gICAgaWYgKGNvbmZpZy5pc0J1bikge1xuICAgICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzLnByb21pc2VzLnJtKHlhcm5yY1ltbFBhdGgsIHsgZm9yY2U6IHRydWUgfSkpO1xuICAgICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+XG4gICAgICAgIGZzLnByb21pc2VzLnJtKHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJy55YXJuJyksIHsgZm9yY2U6IHRydWUsIHJlY3Vyc2l2ZTogdHJ1ZSB9KVxuICAgICAgKTtcbiAgICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PlxuICAgICAgICBmcy5wcm9taXNlcy5ybShwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICd5YXJuLmxvY2snKSwgeyBmb3JjZTogdHJ1ZSwgcmVjdXJzaXZlOiB0cnVlIH0pXG4gICAgICApO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGN1cnJlbnRWZXJzaW9uID0gc3Bhd25TeW5jQW5kUmV0dXJuU3Rkb3V0KCd5YXJuJywgWyctLXZlcnNpb24nXSwgY29uZmlnLmRpclBhdGgpO1xuICAgIGNvbnN0IGxhdGVzdFZlcnNpb24gPSBnZXRMYXRlc3RWZXJzaW9uKCdAeWFybnBrZy9jbGknLCBjb25maWcuZGlyUGF0aCk7XG4gICAgaWYgKGlzTmV3ZXJWZXJzaW9uKGxhdGVzdFZlcnNpb24sIGN1cnJlbnRWZXJzaW9uKSkge1xuICAgICAgc3Bhd25TeW5jKCd5YXJuJywgWydzZXQnLCAndmVyc2lvbicsIGxhdGVzdFZlcnNpb25dLCBjb25maWcuZGlyUGF0aCwgMSk7XG4gICAgfVxuXG4gICAgY29uc3QgcmVsZWFzZXNQYXRoID0gcGF0aC5qb2luKGNvbmZpZy5kaXJQYXRoLCAnLnlhcm4nLCAncmVsZWFzZXMnKTtcbiAgICBhd2FpdCBmcy5wcm9taXNlcy5ta2RpcihyZWxlYXNlc1BhdGgsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICAgIGZvciAoY29uc3QgZmlsZSBvZiBhd2FpdCBmcy5wcm9taXNlcy5yZWFkZGlyKHJlbGVhc2VzUGF0aCkpIHtcbiAgICAgIGlmIChmaWxlLnN0YXJ0c1dpdGgoJ3lhcm4tJykgJiYgIWZpbGUuc3RhcnRzV2l0aChgeWFybi0ke2xhdGVzdFZlcnNpb259LmApKSB7XG4gICAgICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiBmcy5wcm9taXNlcy5ybShwYXRoLmpvaW4ocmVsZWFzZXNQYXRoLCBmaWxlKSkpO1xuICAgICAgICBjb25zb2xlLmxvZygnUmVtb3ZlZCcsIHBhdGguam9pbihyZWxlYXNlc1BhdGgsIGZpbGUpKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCB5YXJucmNQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnLnlhcm5yYycpO1xuICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiBmcy5wcm9taXNlcy5ybSh5YXJucmNQYXRoLCB7IGZvcmNlOiB0cnVlIH0pKTtcblxuICAgIGxldCBzZXR0aW5ncyA9IHt9IGFzIFNldHRpbmdzO1xuICAgIHRyeSB7XG4gICAgICBzZXR0aW5ncyA9ICh5YW1sLmxvYWQoYXdhaXQgZnMucHJvbWlzZXMucmVhZEZpbGUoeWFybnJjWW1sUGF0aCwgJ3V0ZjgnKSkgYXMgU2V0dGluZ3MgfCB1bmRlZmluZWQpID8/IHNldHRpbmdzO1xuICAgIH0gY2F0Y2gge1xuICAgICAgLy8gZG8gbm90aGluZ1xuICAgIH1cbiAgICBzZXR0aW5ncy5kZWZhdWx0U2VtdmVyUmFuZ2VQcmVmaXggPSAnJztcbiAgICBzZXR0aW5ncy5ub2RlTGlua2VyID0gJ25vZGUtbW9kdWxlcyc7XG4gICAgc2V0dGluZ3Mubm1Nb2RlID0gJ2hhcmRsaW5rcy1nbG9iYWwnO1xuICAgIHNldHRpbmdzLm5wbU1pbmltYWxBZ2VHYXRlID0gJzVkJztcbiAgICBzZXR0aW5ncy5ucG1QcmVhcHByb3ZlZFBhY2thZ2VzID0gW1xuICAgICAgLy8gV2UgYmVsaWV2ZSB3ZSBhcmUgc2FmZVxuICAgICAgJ0BleGVyY29kZS8qJyxcbiAgICAgICdAd2lsbGJvb3N0ZXIvKicsXG4gICAgICAnYWdlbnQtcnVudGltZS1raXQnLFxuICAgICAgLy8gVG8gZGVhbCB3aXRoIENWRSBsaWtlIGh0dHBzOi8vbmV4dGpzLm9yZy9ibG9nL0NWRS0yMDI1LTY2NDc4XG4gICAgICAnbmV4dCcsXG4gICAgICAnQG5leHQvKicsXG4gICAgICAncmVhY3QnLFxuICAgICAgJ3JlYWN0LWRvbScsXG4gICAgXTtcbiAgICBkZWxldGUgc2V0dGluZ3MuY29tcHJlc3Npb25MZXZlbDtcbiAgICBpZiAoc2V0dGluZ3MuaW5qZWN0RW52aXJvbm1lbnRGaWxlcz8ubGVuZ3RoID09PSAwKSB7XG4gICAgICBkZWxldGUgc2V0dGluZ3MuaW5qZWN0RW52aXJvbm1lbnRGaWxlcztcbiAgICB9XG4gICAgLy8gY2YuIGh0dHBzOi8vZ2l0aHViLmNvbS95YXJucGtnL2JlcnJ5L3B1bGwvNDY5OFxuICAgIHNldHRpbmdzLmVuYWJsZUdsb2JhbENhY2hlID0gdHJ1ZTtcbiAgICBjb25zdCBvcmlnaW5hbExlbmd0aCA9IHNldHRpbmdzLnBsdWdpbnM/Lmxlbmd0aCA/PyAwO1xuICAgIHNldHRpbmdzLnBsdWdpbnMgPSBzZXR0aW5ncy5wbHVnaW5zPy5maWx0ZXIoKHApID0+IHAucGF0aCAhPT0gJy55YXJuL3BsdWdpbnMvdW5kZWZpbmVkLmNqcycpID8/IFtdO1xuICAgIGlmIChzZXR0aW5ncy5wbHVnaW5zLmxlbmd0aCAhPT0gb3JpZ2luYWxMZW5ndGgpIHtcbiAgICAgIGNvbnN0IHBsdWdpblBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICcueWFybicsICdwbHVnaW5zJywgJ3VuZGVmaW5lZC5janMnKTtcbiAgICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiBmcy5wcm9taXNlcy5ybShwbHVnaW5QYXRoLCB7IGZvcmNlOiB0cnVlIH0pKTtcbiAgICB9XG4gICAgaWYgKHNldHRpbmdzLnBsdWdpbnMubGVuZ3RoID09PSAwKSB7XG4gICAgICBkZWxldGUgc2V0dGluZ3MucGx1Z2lucztcbiAgICB9XG4gICAgYXdhaXQgZnMucHJvbWlzZXMud3JpdGVGaWxlKHlhcm5yY1ltbFBhdGgsIHlhbWwuZHVtcChzZXR0aW5ncywgeyBsaW5lV2lkdGg6IC0xIH0pKTtcblxuICAgIHNwYXduU3luYygneWFybicsIFsnZGx4JywgJ3lhcm4tcGx1Z2luLWF1dG8taW5zdGFsbCddLCBjb25maWcuZGlyUGF0aCk7XG4gIH0pO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0TGF0ZXN0VmVyc2lvbihwYWNrYWdlTmFtZTogc3RyaW5nLCBkaXJQYXRoOiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gc3Bhd25TeW5jQW5kUmV0dXJuU3Rkb3V0KCducG0nLCBbJ3Nob3cnLCBwYWNrYWdlTmFtZSwgJ3ZlcnNpb24nXSwgZGlyUGF0aCkgfHwgJzAuMC4wJztcbn1cblxuZnVuY3Rpb24gaXNOZXdlclZlcnNpb24obmV3VmVyc2lvbjogc3RyaW5nLCBvbGRWZXJzaW9uOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgY29uc3QgdmFsaWROZXdWZXJzaW9uID0gc2VtdmVyLnZhbGlkKG5ld1ZlcnNpb24pO1xuICBpZiAoIXZhbGlkTmV3VmVyc2lvbikgcmV0dXJuIGZhbHNlO1xuXG4gIHJldHVybiBzZW12ZXIuZ3QodmFsaWROZXdWZXJzaW9uLCBzZW12ZXIudmFsaWQob2xkVmVyc2lvbikgPz8gJzAuMC4wJyk7XG59XG4iLCJpbXBvcnQgdHlwZSB7IE9jdG9raXQgfSBmcm9tICdAb2N0b2tpdC9jb3JlJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZ2V0T2N0b2tpdCwgZ2l0SHViVXRpbCwgaGFzR2l0SHViVG9rZW4gfSBmcm9tICcuLi91dGlscy9naXRodWJVdGlsLmpzJztcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHNldHVwTGFiZWxzKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ3NldHVwTGFiZWxzJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IFtvd25lciwgcmVwb10gPSBnaXRIdWJVdGlsLmdldE9yZ0FuZE5hbWUoY29uZmlnLnJlcG9zaXRvcnkgPz8gJycpO1xuICAgIGlmICghb3duZXIgfHwgIXJlcG8pIHJldHVybjtcbiAgICBpZiAob3duZXIgIT09ICdXaWxsQm9vc3RlcicgJiYgb3duZXIgIT09ICdXaWxsQm9vc3RlckxhYicpIHJldHVybjtcbiAgICBpZiAoIWhhc0dpdEh1YlRva2VuKG93bmVyKSkgcmV0dXJuO1xuXG4gICAgY29uc3Qgb2N0b2tpdCA9IGdldE9jdG9raXQob3duZXIpO1xuXG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdkMTogeC1lYXN5IDpoZWRnZWhvZzonLCAnRURFOUZFJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAnZDI6IGVhc3kgOnJhYmJpdDI6JywgJ0RERDZGRScpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ2QzOiBtZWRpdW0gOm94OicsICdDNEI1RkQnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdkNDogaGFyZCA6c3F1aWQ6JywgJ0E3OEJGQScpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ2Q1OiB4LWhhcmQgOndoYWxlMjonLCAnOEI1Q0Y2Jyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAncDE6IGNyaXRpY2FsIDpmaXJlOjpmaXJlOjpmaXJlOicsICdFRjQ0NDQnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdwMjogdXJnZW50IDpmaXJlOjpmaXJlOicsICdGODcxNzEnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdwMzogaW1wb3J0YW50IDpmaXJlOicsICdGQ0E1QTUnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdwNDogbmljZSB0byBoYXZlIDpkcm9wbGV0OicsICdGRUNBQ0EnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdyOiBibGl0eicsICc1MzAwYmMnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdyOiBmaXJlYmFzZScsICdmZmNhMjgnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdyOiBwcmlzbWEnLCAnMGMzNDRiJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAncjogcmVhY3QnLCAnNjFkYWZiJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAncjogc3ZlbHRlJywgJ2ZmM2UwMCcpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ3I6IHNlbWFudGljLXJlbGVhc2UnLCAnNDk0OTQ5Jyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAncmVhZHkgOnJvY2tldDonLCAnMjJDNTVFJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAncmV2aWV3IHJlcXVlc3RlZCA6bWFnOicsICdGQkNBMDQnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdyZWxlYXNlZCA6Ym9va21hcms6JywgJzYzNjZGMScpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ3M6IDAuNWggOmNsb2NrMTIzMDonLCAnRjNGNEY2Jyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAnczogMWggOmNsb2NrMTonLCAnRTVFN0VCJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAnczogMmggOmNsb2NrMjonLCAnRDFENURCJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAnczogM2ggOmNsb2NrMzonLCAnOUNBM0FGJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAnczogNWggOmNsb2NrNTonLCAnNkI3MjgwJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAnczogOGggOmNsb2NrODonLCAnNEI1NTYzJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAnczogMTNoIDpjbG9jazE6JywgJzM3NDE1MScpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ3Q6IGJ1aWxkIDpoYW1tZXI6JywgJ0JGREJGRScpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ3Q6IGNob3JlIDpicm9vbTonLCAnQkZEQkZFJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAndDogY2kgOmNvbnN0cnVjdGlvbl93b3JrZXI6JywgJ0JGREJGRScpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ3Q6IGRvY3MgOm1lbW86JywgJ0JGREJGRScpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ3Q6IGZlYXQgOnNwYXJrbGVzOicsICdCRkRCRkUnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICd0OiBmaXggOmJ1ZzonLCAnQkZEQkZFJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAndDogcGVyZiA6emFwOicsICdCRkRCRkUnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICd0OiByZWZhY3RvciA6cmVjeWNsZTonLCAnQkZEQkZFJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAndDogc3R5bGUgOmxpcHN0aWNrOicsICdCRkRCRkUnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICd0OiB0ZXN0IDp0ZXN0X3R1YmU6JywgJ0JGREJGRScpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ3Byb2plY3QnLCAnMjQyOTJGJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAnZm9jdXNlZCA6ZGFydDonLCAnMjJDNTVFJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAnZ2VuLXByLWFsbCA6cm9ib3Q6JywgJzAwQjREOCcpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ2dlbi1wci1jbGF1ZGUgOnJvYm90OicsICcwMEI0RDgnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdnZW4tcHItY29kZXggOnJvYm90OicsICcwMEI0RDgnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdnZW4tcHItZ2VtaW5pIDpyb2JvdDonLCAnMDBCNEQ4Jyk7XG5cbiAgICAgIGF3YWl0IGRlbGV0ZUxhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAnYnVnJyk7XG4gICAgICBhd2FpdCBkZWxldGVMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ2RvY3VtZW50YXRpb24nKTtcbiAgICAgIGF3YWl0IGRlbGV0ZUxhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAnZHVwbGljYXRlJyk7XG4gICAgICBhd2FpdCBkZWxldGVMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ2VuaGFuY2VtZW50Jyk7XG4gICAgICBhd2FpdCBkZWxldGVMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ2dvb2QgZmlyc3QgaXNzdWUnKTtcbiAgICAgIGF3YWl0IGRlbGV0ZUxhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAnaGVscCB3YW50ZWQnKTtcbiAgICAgIGF3YWl0IGRlbGV0ZUxhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAnaW52YWxpZCcpO1xuICAgICAgYXdhaXQgZGVsZXRlTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdxdWVzdGlvbicpO1xuICAgICAgYXdhaXQgZGVsZXRlTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICd3b250Zml4Jyk7XG5cbiAgICAgIGF3YWl0IGRlbGV0ZUxhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAncmVhZHknKTtcbiAgICAgIGF3YWl0IGRlbGV0ZUxhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAncmV2aWV3IHJlcXVlc3RlZCcpO1xuICAgICAgYXdhaXQgZGVsZXRlTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdyZWxlYXNlZCcpO1xuICAgICAgYXdhaXQgZGVsZXRlTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdzZW1hbnRpYy1yZWxlYXNlJyk7XG4gICAgICBhd2FpdCBkZWxldGVMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ2xsbS1wciA6cm9ib3Q6Jyk7XG4gICAgICBhd2FpdCBkZWxldGVMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ2FpLXByIDpyb2JvdDonKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgY29uc29sZS53YXJuKCdTa2lwIHNldHVwTGFiZWxzIGR1ZSB0bzonLCAoZXJyb3IgYXMgRXJyb3IgfCB1bmRlZmluZWQpPy5zdGFjayA/PyBlcnJvcik7XG4gICAgfVxuICB9KTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gc2V0dXBMYWJlbChvY3Rva2l0OiBPY3Rva2l0LCBvd25lcjogc3RyaW5nLCByZXBvOiBzdHJpbmcsIG5hbWU6IHN0cmluZywgY29sb3I6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICB0cnkge1xuICAgIC8vIElzc3VlcyBwZXJtaXNzaW9uXG4gICAgYXdhaXQgb2N0b2tpdC5yZXF1ZXN0KCdQT1NUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9sYWJlbHMnLCB7XG4gICAgICBvd25lcixcbiAgICAgIHJlcG8sXG4gICAgICBuYW1lLFxuICAgICAgY29sb3IsXG4gICAgfSk7XG4gIH0gY2F0Y2gge1xuICAgIC8vIElzc3VlcyBwZXJtaXNzaW9uXG4gICAgYXdhaXQgb2N0b2tpdC5yZXF1ZXN0KCdQQVRDSCAvcmVwb3Mve293bmVyfS97cmVwb30vbGFiZWxzL3tuYW1lfScsIHtcbiAgICAgIG93bmVyLFxuICAgICAgcmVwbyxcbiAgICAgIG5hbWUsXG4gICAgICBjb2xvcixcbiAgICB9KTtcbiAgfVxufVxuXG5hc3luYyBmdW5jdGlvbiBkZWxldGVMYWJlbChvY3Rva2l0OiBPY3Rva2l0LCBvd25lcjogc3RyaW5nLCByZXBvOiBzdHJpbmcsIG5hbWU6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICB0cnkge1xuICAgIC8vIElzc3VlcyBwZXJtaXNzaW9uXG4gICAgYXdhaXQgb2N0b2tpdC5yZXF1ZXN0KCdERUxFVEUgL3JlcG9zL3tvd25lcn0ve3JlcG99L2xhYmVscy97bmFtZX0nLCB7XG4gICAgICBvd25lcixcbiAgICAgIHJlcG8sXG4gICAgICBuYW1lLFxuICAgIH0pO1xuICB9IGNhdGNoIHtcbiAgICAvLyBkbyBub3RoaW5nXG4gIH1cbn1cbiIsImltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCBkb3RlbnYgZnJvbSAnZG90ZW52JztcbmltcG9ydCBzb2RpdW0gZnJvbSAnbGlic29kaXVtLXdyYXBwZXJzJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB7IG9wdGlvbnMgfSBmcm9tICcuLi9vcHRpb25zLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZ2V0T2N0b2tpdCwgZ2l0SHViVXRpbCwgaGFzR2l0SHViVG9rZW4gfSBmcm9tICcuLi91dGlscy9naXRodWJVdGlsLmpzJztcblxuY29uc3QgREVQUkVDQVRFRF9TRUNSRVRfTkFNRVMgPSBbJ1JFQURZX0RJU0NPUkRfV0VCSE9PS19VUkwnLCAnR0hfQk9UX1BBVCcsICdQVUJMSUNfR0hfQk9UX1BBVCddO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gc2V0dXBTZWNyZXRzKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ3NldHVwU2VjcmV0cycsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBbb3duZXIsIHJlcG9dID0gZ2l0SHViVXRpbC5nZXRPcmdBbmROYW1lKGNvbmZpZy5yZXBvc2l0b3J5ID8/ICcnKTtcbiAgICBpZiAoIW93bmVyIHx8ICFyZXBvIHx8IG93bmVyICE9PSAnV2lsbEJvb3N0ZXJMYWInKSByZXR1cm47XG4gICAgaWYgKCFoYXNHaXRIdWJUb2tlbihvd25lcikgfHwgIW9wdGlvbnMuZG9lc1VwbG9hZEVudlZhcnMpIHJldHVybjtcblxuICAgIGNvbnN0IHBhcnNlZCA9IGRvdGVudi5jb25maWcoeyBwYXRoOiBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICcuZW52JykgfSkucGFyc2VkID8/IHt9O1xuICAgIGlmIChPYmplY3Qua2V5cyhwYXJzZWQpLmxlbmd0aCA9PT0gMCkgcmV0dXJuO1xuXG4gICAgY29uc3Qgb2N0b2tpdCA9IGdldE9jdG9raXQob3duZXIpO1xuXG4gICAgdHJ5IHtcbiAgICAgIGZvciAoY29uc3Qgc2VjcmV0TmFtZSBvZiBERVBSRUNBVEVEX1NFQ1JFVF9OQU1FUykge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIC8vIFJlcXVpcmVzIFNlY3JldHMgcGVybWlzc2lvblxuICAgICAgICAgIGF3YWl0IG9jdG9raXQucmVxdWVzdCgnREVMRVRFIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9hY3Rpb25zL3NlY3JldHMve3NlY3JldF9uYW1lfScsIHtcbiAgICAgICAgICAgIG93bmVyLFxuICAgICAgICAgICAgcmVwbyxcbiAgICAgICAgICAgIHNlY3JldF9uYW1lOiBzZWNyZXROYW1lLFxuICAgICAgICAgIH0pO1xuICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICAvLyBkbyBub3RoaW5nXG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gUmVxdWlyZXMgU2VjcmV0cyBwZXJtaXNzaW9uXG4gICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IG9jdG9raXQucmVxdWVzdCgnR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9hY3Rpb25zL3NlY3JldHMvcHVibGljLWtleScsIHtcbiAgICAgICAgb3duZXIsXG4gICAgICAgIHJlcG8sXG4gICAgICB9KTtcbiAgICAgIGNvbnN0IHsga2V5LCBrZXlfaWQ6IGtleUlkIH0gPSByZXNwb25zZS5kYXRhO1xuXG4gICAgICBhd2FpdCBzb2RpdW0ucmVhZHk7XG5cbiAgICAgIGZvciAoY29uc3QgW25hbWUsIHNlY3JldF0gb2YgT2JqZWN0LmVudHJpZXMocGFyc2VkKSkge1xuICAgICAgICBpZiAoXG4gICAgICAgICAgbmFtZSA9PT0gJ0dIX0JPVF9QQVQnIHx8XG4gICAgICAgICAgbmFtZSA9PT0gJ0dIX0JPVF9QQVRfRk9SX1dJTExCT09TVEVSJyB8fFxuICAgICAgICAgIG5hbWUgPT09ICdHSF9CT1RfUEFUX0ZPUl9XSUxMQk9PU1RFUkxBQidcbiAgICAgICAgKSB7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBDb252ZXJ0IFNlY3JldCAmIEJhc2U2NCBrZXkgdG8gVWludDhBcnJheS5cbiAgICAgICAgY29uc3QgcmF3S2V5ID0gc29kaXVtLmZyb21fYmFzZTY0KGtleSwgc29kaXVtLmJhc2U2NF92YXJpYW50cy5PUklHSU5BTCk7XG4gICAgICAgIGNvbnN0IHJhd1NlYyA9IHNvZGl1bS5mcm9tX3N0cmluZyhzZWNyZXQpO1xuXG4gICAgICAgIC8vIEVuY3J5cHQgdGhlIHNlY3JldCB1c2luZyBMaWJTb2RpdW1cbiAgICAgICAgY29uc3QgZW5jQnl0ZXMgPSBzb2RpdW0uY3J5cHRvX2JveF9zZWFsKHJhd1NlYywgcmF3S2V5KTtcblxuICAgICAgICAvLyBDb252ZXJ0IGVuY3J5cHRlZCBVaW50OEFycmF5IHRvIEJhc2U2NFxuICAgICAgICBjb25zdCBlbmNCYXNlNjQgPSBzb2RpdW0udG9fYmFzZTY0KGVuY0J5dGVzLCBzb2RpdW0uYmFzZTY0X3ZhcmlhbnRzLk9SSUdJTkFMKTtcblxuICAgICAgICAvLyBSZXF1aXJlcyBTZWNyZXRzIHBlcm1pc3Npb25cbiAgICAgICAgYXdhaXQgb2N0b2tpdC5yZXF1ZXN0KCdQVVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2FjdGlvbnMvc2VjcmV0cy97c2VjcmV0X25hbWV9Jywge1xuICAgICAgICAgIG93bmVyLFxuICAgICAgICAgIHJlcG8sXG4gICAgICAgICAgc2VjcmV0X25hbWU6IG5hbWUsXG4gICAgICAgICAgZW5jcnlwdGVkX3ZhbHVlOiBlbmNCYXNlNjQsXG4gICAgICAgICAga2V5X2lkOiBrZXlJZCxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNvbnNvbGUud2FybignU2tpcCBzZXR1cFNlY3JldHMgZHVlIHRvOicsIChlcnJvciBhcyBFcnJvciB8IHVuZGVmaW5lZCk/LnN0YWNrID8/IGVycm9yKTtcbiAgICB9XG4gIH0pO1xufVxuIiwiaW1wb3J0IHsgd2l0aFJldHJ5IH0gZnJvbSAnQHdpbGxib29zdGVyL3NoYXJlZC1saWIvc3JjJztcblxuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBnZXRPY3Rva2l0LCBnaXRIdWJVdGlsLCBoYXNHaXRIdWJUb2tlbiB9IGZyb20gJy4uL3V0aWxzL2dpdGh1YlV0aWwuanMnO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gc2V0dXBHaXRIdWJTZXR0aW5ncyhjb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgW293bmVyLCByZXBvXSA9IGdpdEh1YlV0aWwuZ2V0T3JnQW5kTmFtZShjb25maWcucmVwb3NpdG9yeSA/PyAnJyk7XG4gIGlmICghb3duZXIgfHwgIXJlcG8pIHJldHVybjtcbiAgaWYgKG93bmVyICE9PSAnV2lsbEJvb3N0ZXInICYmIG93bmVyICE9PSAnV2lsbEJvb3N0ZXJMYWInKSByZXR1cm47XG4gIGlmICghaGFzR2l0SHViVG9rZW4ob3duZXIpKSByZXR1cm47XG5cbiAgY29uc3Qgb2N0b2tpdCA9IGdldE9jdG9raXQob3duZXIpO1xuXG4gIC8vIEFkbWluaXN0cmF0aW9uIHBlcm1pc3Npb25cbiAgYXdhaXQgd2l0aFJldHJ5KCgpID0+XG4gICAgb2N0b2tpdC5yZXF1ZXN0KCdQQVRDSCAvcmVwb3Mve293bmVyfS97cmVwb30nLCB7XG4gICAgICBvd25lcixcbiAgICAgIHJlcG8sXG4gICAgICBhbGxvd19hdXRvX21lcmdlOiB0cnVlLFxuICAgICAgYWxsb3dfbWVyZ2VfY29tbWl0OiBmYWxzZSxcbiAgICAgIGFsbG93X3NxdWFzaF9tZXJnZTogdHJ1ZSxcbiAgICAgIGFsbG93X3JlYmFzZV9tZXJnZTogZmFsc2UsXG4gICAgICBhbGxvd191cGRhdGVfYnJhbmNoOiB0cnVlLFxuICAgICAgZGVsZXRlX2JyYW5jaF9vbl9tZXJnZTogdHJ1ZSxcbiAgICAgIHNxdWFzaF9tZXJnZV9jb21taXRfdGl0bGU6ICdQUl9USVRMRScsXG4gICAgICBzcXVhc2hfbWVyZ2VfY29tbWl0X21lc3NhZ2U6ICdCTEFOSycsXG4gICAgICBoZWFkZXJzOiB7XG4gICAgICAgICdYLUdpdEh1Yi1BcGktVmVyc2lvbic6ICcyMDIyLTExLTI4JyxcbiAgICAgIH0sXG4gICAgICAuLi4oY29uZmlnLnJlcG9zaXRvcnk/LnN0YXJ0c1dpdGgoJ2dpdGh1YjpXaWxsQm9vc3Rlci8nKSA/IHsgYWxsb3dfYXV0b19tZXJnZTogdHJ1ZSB9IDoge30pLFxuICAgIH0pXG4gICk7XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgeyBkaXN0YW5jZSB9IGZyb20gJ2Zhc3Rlc3QtbGV2ZW5zaHRlaW4nO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBmc1V0aWwgfSBmcm9tICcuLi91dGlscy9mc1V0aWwuanMnO1xuaW1wb3J0IHsgcHJvbWlzZVBvb2wgfSBmcm9tICcuLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5cbmNvbnN0IHBhY2thZ2VNYW5hZ2VyUnVuUGxhY2Vob2xkZXIgPSAnX19QTV9SVU5fXyc7XG5cbmNvbnN0IHRlbXBsYXRlcyA9IHtcbiAgJ3B1bGxfcmVxdWVzdF90ZW1wbGF0ZS5tZCc6IGBcbkNsb3NlICM8SXNzdWVOdW1iZXI+XG5cbiMjIFNlbGYgQ2hlY2tcblxuLSBbIF0gSSd2ZSBjb25maXJtZWQgXFxgQWxsIGNoZWNrcyBoYXZlIHBhc3NlZFxcYCBvbiB0aGlzIHBhZ2UuXG4gIC0gUFIgdGl0bGUgZm9sbG93cyBbQW5ndWxhcidzIGNvbW1pdCBtZXNzYWdlIGZvcm1hdF0oaHR0cHM6Ly9naXRodWIuY29tL2FuZ3VsYXIvYW5ndWxhci9ibG9iL21haW4vQ09OVFJJQlVUSU5HLm1kIy1jb21taXQtbWVzc2FnZS1mb3JtYXQpLlxuICAtIFBSIHRpdGxlIGRvZXNuJ3QgaGF2ZSBcXGBXSVA6XFxgLlxuICAtIFRoZSB0ZXN0IGNvbW1hbmQgKGUuZy4sIFxcYCR7cGFja2FnZU1hbmFnZXJSdW5QbGFjZWhvbGRlcn0gdGVzdFxcYCkgcGFzc2VkLlxuICAtIFRoZSBsaW50IGNvbW1hbmQgKGUuZy4sIFxcYCR7cGFja2FnZU1hbmFnZXJSdW5QbGFjZWhvbGRlcn0gbGludFxcYCkgcGFzc2VkLlxuICAtIFlvdSBtYXkgbGVhdmUgdGhpcyBib3ggdW5jaGVja2VkIGR1ZSB0byBsb25nIHdvcmtmbG93cy5cbi0gWyBdIEkndmUgcmV2aWV3ZWQgbXkgY2hhbmdlcyBvbiB0aGUgR2l0SHViIGRpZmYgdmlldy5cbi0gWyBdIEkndmUgd3JpdHRlbiB0aGUgc3RlcHMgdG8gdGVzdCBteSBjaGFuZ2VzLlxuLSBbIF0gSSd2ZSBhZGRlZCBzY3JlZW5zaG90cyAoaWYgdGhlIFVJIGNoYW5nZWQpLlxuICAtIFlvdSBtYXkgbGVhdmUgdGhpcyBib3ggdW5jaGVja2VkIGlmIHlvdSBkaWRuJ3QgbW9kaWZ5IHRoZSBVSS5cblxuPCEtLSBQbGVhc2UgYWRkIHNjcmVlbnNob3RzIGlmIHlvdSBtb2RpZnkgdGhlIFVJLlxufCBDdXJyZW50ICAgICAgICAgICAgICAgICAgfCBJbiBjb21pbmcgICAgICAgICAgICAgICAgfFxufCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfFxufCA8aW1nIHNyYz1cIlwiIHdpZHRoPVwiNDAwXCI+IHwgPGltZyBzcmM9XCJcIiB3aWR0aD1cIjQwMFwiPiB8XG4tLT5cblxuPCEtLSBQbGVhc2UgYWRkIHN0ZXBzIHRvIHRlc3QgeW91ciBjaGFuZ2VzLlxuIyMgU3RlcHMgdG8gVGVzdFxuXG4xLiBPcGVuIGh0dHA6Ly9sb2NhbGhvc3QtZXhlcmNvZGUud2lsbGJvb3N0ZXIubmV0OjMwMDAvamEtSlAvY291cnNlcy9fZXhhbXBsZS9sZXNzb25zL19leGFtcGxlX2FfcGx1c19iL3Byb2JsZW1zL19leGFtcGxlX2FfcGx1c19iIGFmdGVyIGxvZ2luLlxuMi4gU2VsZWN0IHRoZSBsYW5ndWFnZSBcXGBDXFxgLlxuMy4gV3JpdGUgdGhlIGZvbGxvd2luZyBjb2RlOlxuICAgXFxgXFxgXFxgY1xuICAgI2luY2x1ZGUgPHN0ZGlvLmg+XG5cbiAgIGludCBtYWluKHZvaWQpIHtcbiAgICAgaW50IGEsIGI7XG5cbiAgICAgc2NhbmYoXCIlZCAlZFwiLCAmYSwgJmIpO1xuICAgICBwcmludGYoXCIlZFwiLCBhICsgYik7XG4gICAgIHJldHVybiAwO1xuICAgfVxuICAgXFxgXFxgXFxgXG40LiBQdXNoIFxcYFN1Ym1pdFxcYCBidXR0b24uXG41LiAuLi5cbi0tPlxuYC50cmltKCksXG59O1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVHaXRIdWJUZW1wbGF0ZXMoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZ2VuZXJhdGVHaXRIdWJUZW1wbGF0ZXMnLCBhc3luYyAoKSA9PiB7XG4gICAgZm9yIChjb25zdCBbZmlsZU5hbWUsIG5ld0NvbnRlbnRdIG9mIE9iamVjdC5lbnRyaWVzKHRlbXBsYXRlcykpIHtcbiAgICAgIGNvbnN0IGNvbnRlbnQgPSBhcHBseVBhY2thZ2VNYW5hZ2VyVGVtcGxhdGUobmV3Q29udGVudCwgY29uZmlnKTtcbiAgICAgIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnLmdpdGh1YicsIGZpbGVOYW1lKTtcbiAgICAgIGlmIChmcy5leGlzdHNTeW5jKGZpbGVQYXRoKSkge1xuICAgICAgICBjb25zdCBvbGRDb250ZW50ID0gYXdhaXQgZnMucHJvbWlzZXMucmVhZEZpbGUoZmlsZVBhdGgsICd1dGY4Jyk7XG4gICAgICAgIGlmIChkaXN0YW5jZShvbGRDb250ZW50LCBjb250ZW50KSA+IGNvbnRlbnQubGVuZ3RoIC8gMikge1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGF3YWl0IGZzLnByb21pc2VzLm1rZGlyKHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJy5naXRodWInKSwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gICAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnNVdGlsLmdlbmVyYXRlRmlsZShmaWxlUGF0aCwgY29udGVudCkpO1xuICAgIH1cbiAgfSk7XG59XG5cbmZ1bmN0aW9uIGFwcGx5UGFja2FnZU1hbmFnZXJUZW1wbGF0ZSh0ZW1wbGF0ZTogc3RyaW5nLCBjb25maWc6IFBhY2thZ2VDb25maWcpOiBzdHJpbmcge1xuICBjb25zdCBwYWNrYWdlTWFuYWdlckNvbW1hbmQgPSBjb25maWcuaXNCdW4gPyAnYnVuIHJ1bicgOiAneWFybic7XG4gIHJldHVybiB0ZW1wbGF0ZS5yZXBsYWNlQWxsKHBhY2thZ2VNYW5hZ2VyUnVuUGxhY2Vob2xkZXIsIHBhY2thZ2VNYW5hZ2VyQ29tbWFuZCk7XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgZnNwIGZyb20gJ25vZGU6ZnMvcHJvbWlzZXMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IGZnIGZyb20gJ2Zhc3QtZ2xvYic7XG5pbXBvcnQgeyBzaW1wbGVHaXQgfSBmcm9tICdzaW1wbGUtZ2l0JztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUpzb24gfSBmcm9tICd0eXBlLWZlc3QnO1xuaW1wb3J0IHsgeiB9IGZyb20gJ3pvZCc7XG5cbmltcG9ydCB7IGdldE9jdG9raXQsIGdpdEh1YlV0aWwgfSBmcm9tICcuL3V0aWxzL2dpdGh1YlV0aWwuanMnO1xuaW1wb3J0IHsgZ2xvYklnbm9yZSB9IGZyb20gJy4vdXRpbHMvZ2xvYlV0aWwuanMnO1xuXG5leHBvcnQgaW50ZXJmYWNlIFBhY2thZ2VDb25maWcge1xuICBkaXJQYXRoOiBzdHJpbmc7XG4gIGRvY2tlcmZpbGU6IHN0cmluZztcbiAgaXNSb290OiBib29sZWFuO1xuICBpc1B1YmxpY1JlcG86IGJvb2xlYW47XG4gIGlzUmVmZXJyZWRCeU90aGVyUmVwbzogYm9vbGVhbjtcbiAgcmVwb3NpdG9yeT86IHN0cmluZztcbiAgcmVwb0F1dGhvcj86IHN0cmluZztcbiAgcmVwb05hbWU/OiBzdHJpbmc7XG4gIGlzV2lsbEJvb3N0ZXJSZXBvOiBib29sZWFuO1xuICBpc0J1bjogYm9vbGVhbjtcbiAgaXNFc21QYWNrYWdlOiBib29sZWFuO1xuICBpc1dpbGxCb29zdGVyQ29uZmlnczogYm9vbGVhbjtcbiAgLy8gZGVwZW5kZW5jeSBpbmZvcm1hdGlvblxuICBkb2VzQ29udGFpblN1YlBhY2thZ2VKc29uczogYm9vbGVhbjtcbiAgZG9lc0NvbnRhaW5Eb2NrZXJmaWxlOiBib29sZWFuO1xuICBkb2VzQ29udGFpbkdlbWZpbGU6IGJvb2xlYW47XG4gIGRvZXNDb250YWluR29Nb2Q6IGJvb2xlYW47XG4gIGRvZXNDb250YWluUGFja2FnZUpzb246IGJvb2xlYW47XG4gIGRvZXNDb250YWluUG9ldHJ5TG9jazogYm9vbGVhbjtcbiAgZG9lc0NvbnRhaW5Qb21YbWw6IGJvb2xlYW47XG4gIGRvZXNDb250YWluUHVic3BlY1lhbWw6IGJvb2xlYW47XG4gIGRvZXNDb250YWluVGVtcGxhdGVZYW1sOiBib29sZWFuO1xuICBkb2VzQ29udGFpblZzY29kZVNldHRpbmdzSnNvbjogYm9vbGVhbjtcbiAgLy8gc291cmNlIGNvZGUgZmlsZXNcbiAgZG9lc0NvbnRhaW5KYXZhU2NyaXB0OiBib29sZWFuO1xuICBkb2VzQ29udGFpblR5cGVTY3JpcHQ6IGJvb2xlYW47XG4gIGRvZXNDb250YWluSnN4T3JUc3g6IGJvb2xlYW47XG4gIGRvZXNDb250YWluSmF2YVNjcmlwdEluUGFja2FnZXM6IGJvb2xlYW47XG4gIGRvZXNDb250YWluVHlwZVNjcmlwdEluUGFja2FnZXM6IGJvb2xlYW47XG4gIGRvZXNDb250YWluSnN4T3JUc3hJblBhY2thZ2VzOiBib29sZWFuO1xuXG4gIGhhc1N0YXJ0VGVzdFNlcnZlcjogYm9vbGVhbjtcblxuICBkZXBlbmRpbmc6IHtcbiAgICBibGl0ejogYm9vbGVhbjtcbiAgICBmaXJlYmFzZTogYm9vbGVhbjtcbiAgICBnZW5JMThuVHM6IGJvb2xlYW47XG4gICAgbGl0ZXN0cmVhbTogYm9vbGVhbjtcbiAgICBuZXh0OiBib29sZWFuO1xuICAgIHBsYXl3cmlnaHRUZXN0OiBib29sZWFuO1xuICAgIHByaXNtYTogYm9vbGVhbjtcbiAgICBweXJpZ2h0OiBib29sZWFuO1xuICAgIHJlYWN0OiBib29sZWFuO1xuICAgIHJlYWN0TmF0aXZlOiBib29sZWFuO1xuICAgIHNlbWFudGljUmVsZWFzZTogYm9vbGVhbjtcbiAgICBzdG9yeWJvb2s6IGJvb2xlYW47XG4gICAgd2I6IGJvb2xlYW47XG4gIH07XG4gIHJlbGVhc2U6IHtcbiAgICBicmFuY2hlczogc3RyaW5nW107XG4gICAgZ2l0aHViOiBib29sZWFuO1xuICAgIG5wbTogYm9vbGVhbjtcbiAgfTtcbiAgZXNsaW50QmFzZT86IEVzbGludEV4dGVuc2lvbkJhc2U7XG4gIGhhc1ZlcnNpb25TZXR0aW5nczogYm9vbGVhbjtcbiAgcGFja2FnZUpzb24/OiBQYWNrYWdlSnNvbjtcbiAgd2JmeUpzb24/OiBXYmZ5SnNvbjtcbn1cblxudHlwZSBXYmZ5SnNvbiA9IHouaW5mZXI8dHlwZW9mIHdiZnlKc29uU2NoZW1hPjtcblxuY29uc3Qgd2JmeUpzb25TY2hlbWEgPSB6Lm9iamVjdCh7XG4gIHR5cG9zOiB6XG4gICAgLm9iamVjdCh7XG4gICAgICBhbGw6IHoucmVjb3JkKHouc3RyaW5nKCksIHouc3RyaW5nKCkpLm9wdGlvbmFsKCksXG4gICAgICBkb2M6IHoucmVjb3JkKHouc3RyaW5nKCksIHouc3RyaW5nKCkpLm9wdGlvbmFsKCksXG4gICAgICB0czogei5yZWNvcmQoei5zdHJpbmcoKSwgei5zdHJpbmcoKSkub3B0aW9uYWwoKSxcbiAgICAgIHRleHQ6IHoucmVjb3JkKHouc3RyaW5nKCksIHouc3RyaW5nKCkpLm9wdGlvbmFsKCksXG4gICAgfSlcbiAgICAub3B0aW9uYWwoKSxcbn0pO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2V0UGFja2FnZUNvbmZpZyhcbiAgZGlyUGF0aDogc3RyaW5nLFxuICByb290Q29uZmlnPzogUGFja2FnZUNvbmZpZ1xuKTogUHJvbWlzZTxQYWNrYWdlQ29uZmlnIHwgdW5kZWZpbmVkPiB7XG4gIGNvbnN0IHBhY2thZ2VKc29uUGF0aCA9IHBhdGgucmVzb2x2ZShkaXJQYXRoLCAncGFja2FnZS5qc29uJyk7XG4gIHRyeSB7XG4gICAgY29uc3QgZG9lc0NvbnRhaW5QYWNrYWdlSnNvbiA9IGZzLmV4aXN0c1N5bmMocGFja2FnZUpzb25QYXRoKTtcbiAgICBsZXQgZGVwZW5kZW5jaWVzOiBQYWNrYWdlSnNvblsnZGVwZW5kZW5jaWVzJ10gPSB7fTtcbiAgICBsZXQgZGV2RGVwZW5kZW5jaWVzOiBQYWNrYWdlSnNvblsnZGV2RGVwZW5kZW5jaWVzJ10gPSB7fTtcbiAgICBsZXQgcGFja2FnZUpzb246IFBhY2thZ2VKc29uID0ge307XG4gICAgbGV0IGVzbVBhY2thZ2UgPSBmYWxzZTtcbiAgICBpZiAoZG9lc0NvbnRhaW5QYWNrYWdlSnNvbikge1xuICAgICAgY29uc3QgcGFja2FnZUpzb25UZXh0ID0gZnMucmVhZEZpbGVTeW5jKHBhY2thZ2VKc29uUGF0aCwgJ3V0ZjgnKTtcbiAgICAgIHBhY2thZ2VKc29uID0gSlNPTi5wYXJzZShwYWNrYWdlSnNvblRleHQpIGFzIFBhY2thZ2VKc29uO1xuICAgICAgZGVwZW5kZW5jaWVzID0gcGFja2FnZUpzb24uZGVwZW5kZW5jaWVzID8/IHt9O1xuICAgICAgZGV2RGVwZW5kZW5jaWVzID0gcGFja2FnZUpzb24uZGV2RGVwZW5kZW5jaWVzID8/IHt9O1xuICAgICAgZXNtUGFja2FnZSA9IHBhY2thZ2VKc29uLnR5cGUgPT09ICdtb2R1bGUnO1xuICAgIH1cblxuICAgIGxldCByZWxlYXNlQnJhbmNoZXM6IHN0cmluZ1tdID0gW107XG4gICAgbGV0IHJlbGVhc2VQbHVnaW5zOiBzdHJpbmdbXSA9IFtdO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCByZWxlYXNlcmNKc29uUGF0aCA9IHBhdGgucmVzb2x2ZShkaXJQYXRoLCAnLnJlbGVhc2VyYy5qc29uJyk7XG4gICAgICBjb25zdCBqc29uID0gSlNPTi5wYXJzZShhd2FpdCBmc3AucmVhZEZpbGUocmVsZWFzZXJjSnNvblBhdGgsICd1dGY4JykpIGFzXG4gICAgICAgIHwge1xuICAgICAgICAgICAgYnJhbmNoZXM6IHN0cmluZ1tdO1xuICAgICAgICAgICAgcGx1Z2lucz86IHN0cmluZ1tdW107XG4gICAgICAgICAgfVxuICAgICAgICB8IHVuZGVmaW5lZDtcbiAgICAgIHJlbGVhc2VCcmFuY2hlcyA9IGpzb24/LmJyYW5jaGVzID8/IFtdO1xuICAgICAgcmVsZWFzZVBsdWdpbnMgPSBqc29uPy5wbHVnaW5zPy5mbGF0KCkgPz8gW107XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBkbyBub3RoaW5nXG4gICAgfVxuXG4gICAgY29uc3QgaXNSb290ID1cbiAgICAgIHBhdGguYmFzZW5hbWUocGF0aC5yZXNvbHZlKGRpclBhdGgsICcuLicpKSAhPT0gJ3BhY2thZ2VzJyB8fFxuICAgICAgIWZzLmV4aXN0c1N5bmMocGF0aC5yZXNvbHZlKGRpclBhdGgsICcuLicsICcuLicsICdwYWNrYWdlLmpzb24nKSk7XG5cbiAgICBsZXQgcmVwb0luZm86IFJlY29yZDxzdHJpbmcsIHVua25vd24+IHwgdW5kZWZpbmVkO1xuICAgIGlmIChpc1Jvb3QpIHtcbiAgICAgIHJlcG9JbmZvID0gYXdhaXQgZmV0Y2hSZXBvSW5mbyhkaXJQYXRoLCBwYWNrYWdlSnNvbik7XG4gICAgfVxuXG4gICAgbGV0IGhhc1ZlcnNpb25TZXR0aW5ncyA9IGhhc1ZlcnNpb25TZXR0aW5nc0ZpbGUoZGlyUGF0aCk7XG4gICAgZm9yIChjb25zdCBwcmVmaXggb2YgWydqYXZhJywgJ25vZGUnLCAncHl0aG9uJ10pIHtcbiAgICAgIGlmIChmcy5leGlzdHNTeW5jKHBhdGgucmVzb2x2ZShkaXJQYXRoLCBgLiR7cHJlZml4fS12ZXJzaW9uYCkpKSB7XG4gICAgICAgIGhhc1ZlcnNpb25TZXR0aW5ncyA9IHRydWU7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cblxuICAgIGxldCBkb2NrZXJmaWxlID0gJyc7XG4gICAgdHJ5IHtcbiAgICAgIGRvY2tlcmZpbGUgPSBhd2FpdCBmc3AucmVhZEZpbGUocGF0aC5yZXNvbHZlKGRpclBhdGgsICdEb2NrZXJmaWxlJyksICd1dGY4Jyk7XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBkbyBub3RoaW5nXG4gICAgfVxuXG4gICAgLy8gUmVhZCB3YmZ5Lmpzb25cbiAgICBjb25zdCB3YmZ5SnNvblBhdGggPSBwYXRoLnJlc29sdmUoZGlyUGF0aCwgJ3diZnkuanNvbicpO1xuICAgIGxldCB3YmZ5SnNvbjogV2JmeUpzb24gfCB1bmRlZmluZWQ7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHdiZnlKc29uVGV4dCA9IGF3YWl0IGZzcC5yZWFkRmlsZSh3YmZ5SnNvblBhdGgsICd1dGY4Jyk7XG4gICAgICB3YmZ5SnNvbiA9IHdiZnlKc29uU2NoZW1hLnBhcnNlKEpTT04ucGFyc2Uod2JmeUpzb25UZXh0KSk7XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBkbyBub3RoaW5nXG4gICAgfVxuXG4gICAgY29uc3QgcmVwb0Z1bGxOYW1lID0gdHlwZW9mIHJlcG9JbmZvPy5mdWxsX25hbWUgPT09ICdzdHJpbmcnID8gcmVwb0luZm8uZnVsbF9uYW1lIDogdW5kZWZpbmVkO1xuICAgIGxldCByZXBvQXV0aG9yOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gICAgbGV0IHJlcG9OYW1lOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gICAgaWYgKHJlcG9GdWxsTmFtZSkge1xuICAgICAgY29uc3QgcmVwb1BhcnRzID0gcmVwb0Z1bGxOYW1lLnNwbGl0KCcvJyk7XG4gICAgICBpZiAocmVwb1BhcnRzLmxlbmd0aCA+PSAyKSB7XG4gICAgICAgIHJlcG9BdXRob3IgPSByZXBvUGFydHNbMF07XG4gICAgICAgIHJlcG9OYW1lID0gcmVwb1BhcnRzWzFdO1xuICAgICAgfVxuICAgIH1cbiAgICBjb25zdCByZXBvc2l0b3J5ID0gcmVwb0Z1bGxOYW1lID8gYGdpdGh1Yjoke3JlcG9GdWxsTmFtZX1gIDogdW5kZWZpbmVkO1xuICAgIGNvbnN0IGNvbmZpZzogUGFja2FnZUNvbmZpZyA9IHtcbiAgICAgIGRpclBhdGgsXG4gICAgICBkb2NrZXJmaWxlLFxuICAgICAgaXNSb290LFxuICAgICAgaXNQdWJsaWNSZXBvOiByZXBvSW5mbz8ucHJpdmF0ZSA9PT0gZmFsc2UsXG4gICAgICBpc1JlZmVycmVkQnlPdGhlclJlcG86ICEhcGFja2FnZUpzb24uZmlsZXMsXG4gICAgICByZXBvc2l0b3J5LFxuICAgICAgcmVwb0F1dGhvcixcbiAgICAgIHJlcG9OYW1lLFxuICAgICAgaXNXaWxsQm9vc3RlclJlcG86IEJvb2xlYW4oXG4gICAgICAgIHJlcG9zaXRvcnk/LnN0YXJ0c1dpdGgoJ2dpdGh1YjpXaWxsQm9vc3Rlci8nKSB8fCByZXBvc2l0b3J5Py5zdGFydHNXaXRoKCdnaXRodWI6V2lsbEJvb3N0ZXJMYWIvJylcbiAgICAgICksXG4gICAgICBpc0J1bjogcm9vdENvbmZpZz8uaXNCdW4gfHwgZnMuZXhpc3RzU3luYyhwYXRoLmpvaW4oZGlyUGF0aCwgJ2J1bi5sb2NrJykpLFxuICAgICAgaXNFc21QYWNrYWdlOiBlc21QYWNrYWdlLFxuICAgICAgaXNXaWxsQm9vc3RlckNvbmZpZ3M6IHBhY2thZ2VKc29uUGF0aC5pbmNsdWRlcygnL3dpbGxib29zdGVyLWNvbmZpZ3MnKSxcbiAgICAgIGRvZXNDb250YWluU3ViUGFja2FnZUpzb25zOiBjb250YWluc0FueSgncGFja2FnZXMvKiovcGFja2FnZS5qc29uJywgZGlyUGF0aCksXG4gICAgICBkb2VzQ29udGFpbkRvY2tlcmZpbGU6ICEhZG9ja2VyZmlsZSB8fCBmcy5leGlzdHNTeW5jKHBhdGgucmVzb2x2ZShkaXJQYXRoLCAnZG9ja2VyLWNvbXBvc2UueW1sJykpLFxuICAgICAgZG9lc0NvbnRhaW5HZW1maWxlOiBmcy5leGlzdHNTeW5jKHBhdGgucmVzb2x2ZShkaXJQYXRoLCAnR2VtZmlsZScpKSxcbiAgICAgIGRvZXNDb250YWluR29Nb2Q6IGZzLmV4aXN0c1N5bmMocGF0aC5yZXNvbHZlKGRpclBhdGgsICdnby5tb2QnKSksXG4gICAgICBkb2VzQ29udGFpblBhY2thZ2VKc29uOiBmcy5leGlzdHNTeW5jKHBhdGgucmVzb2x2ZShkaXJQYXRoLCAncGFja2FnZS5qc29uJykpLFxuICAgICAgZG9lc0NvbnRhaW5Qb2V0cnlMb2NrOiBmcy5leGlzdHNTeW5jKHBhdGgucmVzb2x2ZShkaXJQYXRoLCAncG9ldHJ5LmxvY2snKSksXG4gICAgICBkb2VzQ29udGFpblBvbVhtbDogZnMuZXhpc3RzU3luYyhwYXRoLnJlc29sdmUoZGlyUGF0aCwgJ3BvbS54bWwnKSksXG4gICAgICBkb2VzQ29udGFpblB1YnNwZWNZYW1sOiBmcy5leGlzdHNTeW5jKHBhdGgucmVzb2x2ZShkaXJQYXRoLCAncHVic3BlYy55YW1sJykpLFxuICAgICAgZG9lc0NvbnRhaW5UZW1wbGF0ZVlhbWw6IGZzLmV4aXN0c1N5bmMocGF0aC5yZXNvbHZlKGRpclBhdGgsICd0ZW1wbGF0ZS55YW1sJykpLFxuICAgICAgZG9lc0NvbnRhaW5Wc2NvZGVTZXR0aW5nc0pzb246IGZzLmV4aXN0c1N5bmMocGF0aC5yZXNvbHZlKGRpclBhdGgsICcudnNjb2RlJywgJ3NldHRpbmdzLmpzb24nKSksXG4gICAgICBkb2VzQ29udGFpbkphdmFTY3JpcHQ6IGNvbnRhaW5zQW55KCd7YXBwLHNyYyx0ZXN0LHNjcmlwdHN9LyoqLyoue2NqcyxtanMsanMsanN4fScsIGRpclBhdGgpLFxuICAgICAgZG9lc0NvbnRhaW5UeXBlU2NyaXB0OiBjb250YWluc0FueSgne2FwcCxzcmMsdGVzdCxzY3JpcHRzfS8qKi8qLntjdHMsbXRzLHRzLHRzeH0nLCBkaXJQYXRoKSxcbiAgICAgIGRvZXNDb250YWluSnN4T3JUc3g6IGNvbnRhaW5zQW55KCd7YXBwLHNyYyx0ZXN0fS8qKi8qLnt0LGp9c3gnLCBkaXJQYXRoKSxcbiAgICAgIGRvZXNDb250YWluSmF2YVNjcmlwdEluUGFja2FnZXM6IGNvbnRhaW5zQW55KCdwYWNrYWdlcy8qKi97YXBwLHNyYyx0ZXN0LHNjcmlwdHN9LyoqLyoue2NqcyxtanMsanMsanN4fScsIGRpclBhdGgpLFxuICAgICAgZG9lc0NvbnRhaW5UeXBlU2NyaXB0SW5QYWNrYWdlczogY29udGFpbnNBbnkoJ3BhY2thZ2VzLyoqL3thcHAsc3JjLHRlc3Qsc2NyaXB0c30vKiovKi57Y3RzLG10cyx0cyx0c3h9JywgZGlyUGF0aCksXG4gICAgICBkb2VzQ29udGFpbkpzeE9yVHN4SW5QYWNrYWdlczogY29udGFpbnNBbnkoJ3BhY2thZ2VzLyoqL3thcHAsc3JjLHRlc3R9LyoqLyoue3Qsan1zeCcsIGRpclBhdGgpLFxuICAgICAgaGFzU3RhcnRUZXN0U2VydmVyOiAhIXBhY2thZ2VKc29uLnNjcmlwdHM/Llsnc3RhcnQtdGVzdC1zZXJ2ZXInXSxcbiAgICAgIGRlcGVuZGluZzoge1xuICAgICAgICBibGl0ejogISFkZXBlbmRlbmNpZXMuYmxpdHosXG4gICAgICAgIGZpcmViYXNlOiAhIWRldkRlcGVuZGVuY2llc1snZmlyZWJhc2UtdG9vbHMnXSxcbiAgICAgICAgZ2VuSTE4blRzOiAhIWRldkRlcGVuZGVuY2llc1snZ2VuLWkxOG4tdHMnXSxcbiAgICAgICAgbGl0ZXN0cmVhbTogZG9ja2VyZmlsZS5pbmNsdWRlcygnaW5zdGFsbC1saXRlc3RyZWFtLnNoJyksXG4gICAgICAgIHJlYWN0OiAhIWRlcGVuZGVuY2llcy5yZWFjdCxcbiAgICAgICAgbmV4dDogISFkZXBlbmRlbmNpZXMubmV4dCxcbiAgICAgICAgcGxheXdyaWdodFRlc3Q6XG4gICAgICAgICAgISFkZXBlbmRlbmNpZXNbJ0BwbGF5d3JpZ2h0L3Rlc3QnXSB8fCAhIWRldkRlcGVuZGVuY2llc1snQHBsYXl3cmlnaHQvdGVzdCddIHx8ICEhZGV2RGVwZW5kZW5jaWVzLnBsYXl3cmlnaHQsXG4gICAgICAgIHByaXNtYTogISFkZXBlbmRlbmNpZXNbJ0BwcmlzbWEvY2xpZW50J10gfHwgISFkZXZEZXBlbmRlbmNpZXMucHJpc21hLFxuICAgICAgICBweXJpZ2h0OiAhIWRldkRlcGVuZGVuY2llcy5weXJpZ2h0LFxuICAgICAgICByZWFjdE5hdGl2ZTogISFkZXBlbmRlbmNpZXNbJ3JlYWN0LW5hdGl2ZSddLFxuICAgICAgICBzZW1hbnRpY1JlbGVhc2U6ICEhKFxuICAgICAgICAgIGRldkRlcGVuZGVuY2llc1snc2VtYW50aWMtcmVsZWFzZSddIHx8XG4gICAgICAgICAgcmVsZWFzZUJyYW5jaGVzLmxlbmd0aCA+IDAgfHxcbiAgICAgICAgICByZWxlYXNlUGx1Z2lucy5sZW5ndGggPiAwXG4gICAgICAgICksXG4gICAgICAgIHN0b3J5Ym9vazogISFkZXZEZXBlbmRlbmNpZXNbJ0BzdG9yeWJvb2svcmVhY3QnXSxcbiAgICAgICAgd2I6ICEhZGVwZW5kZW5jaWVzWydAd2lsbGJvb3N0ZXIvd2InXSB8fCAhIWRldkRlcGVuZGVuY2llc1snQHdpbGxib29zdGVyL3diJ10sXG4gICAgICB9LFxuICAgICAgcmVsZWFzZToge1xuICAgICAgICBicmFuY2hlczogcmVsZWFzZUJyYW5jaGVzLFxuICAgICAgICBnaXRodWI6IHJlbGVhc2VQbHVnaW5zLmluY2x1ZGVzKCdAc2VtYW50aWMtcmVsZWFzZS9naXRodWInKSxcbiAgICAgICAgbnBtOiByZWxlYXNlUGx1Z2lucy5pbmNsdWRlcygnQHNlbWFudGljLXJlbGVhc2UvbnBtJyksXG4gICAgICB9LFxuICAgICAgaGFzVmVyc2lvblNldHRpbmdzLFxuICAgICAgcGFja2FnZUpzb24sXG4gICAgICB3YmZ5SnNvbixcbiAgICB9O1xuICAgIGlmICghY29uZmlnLmlzQnVuKSB7XG4gICAgICBjb25maWcuZXNsaW50QmFzZSA9IGdldEVzbGludEV4dGVuc2lvbkJhc2UoY29uZmlnKTtcbiAgICB9XG4gICAgaWYgKFxuICAgICAgY29uZmlnLmRvZXNDb250YWluR2VtZmlsZSB8fFxuICAgICAgY29uZmlnLmRvZXNDb250YWluR29Nb2QgfHxcbiAgICAgIGNvbmZpZy5kb2VzQ29udGFpblBhY2thZ2VKc29uIHx8XG4gICAgICBjb25maWcuZG9lc0NvbnRhaW5Qb2V0cnlMb2NrIHx8XG4gICAgICBjb25maWcuZG9lc0NvbnRhaW5Qb21YbWwgfHxcbiAgICAgIGNvbmZpZy5kb2VzQ29udGFpblB1YnNwZWNZYW1sIHx8XG4gICAgICBjb25maWcuZG9lc0NvbnRhaW5UZW1wbGF0ZVlhbWxcbiAgICApIHtcbiAgICAgIHJldHVybiBjb25maWc7XG4gICAgfVxuICB9IGNhdGNoIHtcbiAgICAvLyBkbyBub3RoaW5nXG4gIH1cbn1cblxuZnVuY3Rpb24gaGFzVmVyc2lvblNldHRpbmdzRmlsZShkaXJQYXRoOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgY29uc3QgY3VycmVudCA9IHBhdGgucmVzb2x2ZShkaXJQYXRoKTtcbiAgcmV0dXJuIChcbiAgICBmcy5leGlzdHNTeW5jKHBhdGguam9pbihjdXJyZW50LCAnbWlzZS50b21sJykpIHx8XG4gICAgZnMuZXhpc3RzU3luYyhwYXRoLmpvaW4oY3VycmVudCwgJy5taXNlLnRvbWwnKSkgfHxcbiAgICBmcy5leGlzdHNTeW5jKHBhdGguam9pbihjdXJyZW50LCAnLnRvb2wtdmVyc2lvbnMnKSlcbiAgKTtcbn1cblxuZnVuY3Rpb24gY29udGFpbnNBbnkocGF0dGVybjogc3RyaW5nLCBkaXJQYXRoOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgcmV0dXJuIGZnLmdsb2JTeW5jKHBhdHRlcm4sIHsgZG90OiB0cnVlLCBjd2Q6IGRpclBhdGgsIGlnbm9yZTogZ2xvYklnbm9yZSB9KS5sZW5ndGggPiAwO1xufVxuXG5leHBvcnQgdHlwZSBFc2xpbnRFeHRlbnNpb25CYXNlID1cbiAgfCAnQHdpbGxib29zdGVyL2VzbGludC1jb25maWctdHMtcmVhY3QnXG4gIHwgJ0B3aWxsYm9vc3Rlci9lc2xpbnQtY29uZmlnLXRzJ1xuICB8ICdAd2lsbGJvb3N0ZXIvZXNsaW50LWNvbmZpZy1qcy1yZWFjdCdcbiAgfCAnQHdpbGxib29zdGVyL2VzbGludC1jb25maWctanMnXG4gIHwgJ0B3aWxsYm9vc3Rlci9lc2xpbnQtY29uZmlnLW5leHQnO1xuXG5mdW5jdGlvbiBnZXRFc2xpbnRFeHRlbnNpb25CYXNlKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IEVzbGludEV4dGVuc2lvbkJhc2UgfCB1bmRlZmluZWQge1xuICBpZiAoY29uZmlnLmRlcGVuZGluZy5uZXh0KSB7XG4gICAgcmV0dXJuICdAd2lsbGJvb3N0ZXIvZXNsaW50LWNvbmZpZy1uZXh0JztcbiAgfSBlbHNlIGlmIChjb25maWcuZG9lc0NvbnRhaW5UeXBlU2NyaXB0KSB7XG4gICAgcmV0dXJuIGNvbmZpZy5kb2VzQ29udGFpbkpzeE9yVHN4ID8gJ0B3aWxsYm9vc3Rlci9lc2xpbnQtY29uZmlnLXRzLXJlYWN0JyA6ICdAd2lsbGJvb3N0ZXIvZXNsaW50LWNvbmZpZy10cyc7XG4gIH0gZWxzZSB7XG4gICAgaWYgKGNvbmZpZy5kb2VzQ29udGFpbkpzeE9yVHN4KSB7XG4gICAgICByZXR1cm4gJ0B3aWxsYm9vc3Rlci9lc2xpbnQtY29uZmlnLWpzLXJlYWN0JztcbiAgICB9IGVsc2UgaWYgKGNvbmZpZy5kb2VzQ29udGFpbkphdmFTY3JpcHQpIHtcbiAgICAgIHJldHVybiAnQHdpbGxib29zdGVyL2VzbGludC1jb25maWctanMnO1xuICAgIH1cbiAgfVxufVxuXG5hc3luYyBmdW5jdGlvbiBmZXRjaFJlcG9JbmZvKGRpclBhdGg6IHN0cmluZywgcGFja2FnZUpzb246IFBhY2thZ2VKc29uKTogUHJvbWlzZTxSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB8IHVuZGVmaW5lZD4ge1xuICBjb25zdCBnaXQgPSBzaW1wbGVHaXQoZGlyUGF0aCk7XG4gIGNvbnN0IHJlbW90ZXMgPSBhd2FpdCBnaXQuZ2V0UmVtb3Rlcyh0cnVlKTtcbiAgY29uc3Qgb3JpZ2luID0gcmVtb3Rlcy5maW5kKChyKSA9PiByLm5hbWUgPT09ICdvcmlnaW4nKTtcbiAgY29uc3QgcmVtb3RlVXJsID0gb3JpZ2luPy5yZWZzLmZldGNoID8/IG9yaWdpbj8ucmVmcy5wdXNoO1xuICBpZiAodHlwZW9mIHJlbW90ZVVybCA9PT0gJ3N0cmluZycpIHtcbiAgICBjb25zdCBqc29uID0gYXdhaXQgcmVxdWVzdFJlcG9JbmZvKHJlbW90ZVVybCk7XG4gICAgaWYgKGpzb24pIHJldHVybiBqc29uO1xuICB9XG5cbiAgY29uc3QgdXJsID0gdHlwZW9mIHBhY2thZ2VKc29uLnJlcG9zaXRvcnkgPT09ICdzdHJpbmcnID8gcGFja2FnZUpzb24ucmVwb3NpdG9yeSA6IHBhY2thZ2VKc29uLnJlcG9zaXRvcnk/LnVybDtcbiAgaWYgKHVybCkge1xuICAgIGNvbnN0IGpzb24gPSBhd2FpdCByZXF1ZXN0UmVwb0luZm8odXJsKTtcbiAgICBpZiAoanNvbiAmJiBqc29uLm1lc3NhZ2UgIT09ICdOb3QgRm91bmQnKSByZXR1cm4ganNvbjtcbiAgfVxufVxuXG5hc3luYyBmdW5jdGlvbiByZXF1ZXN0UmVwb0luZm8odXJsT3JGdWxsTmFtZTogc3RyaW5nKTogUHJvbWlzZTxSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB8IHVuZGVmaW5lZD4ge1xuICBjb25zdCBbb3JnLCBuYW1lXSA9IGdpdEh1YlV0aWwuZ2V0T3JnQW5kTmFtZSh1cmxPckZ1bGxOYW1lKTtcbiAgaWYgKCFvcmcgfHwgIW5hbWUpIHJldHVybjtcblxuICBjb25zdCByZXQgPSB7IGZ1bGxfbmFtZTogYCR7b3JnfS8ke25hbWV9YCB9O1xuICB0cnkge1xuICAgIC8vIE1ldGFkYXRhIHBlcm1pc3Npb25cbiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGdldE9jdG9raXQoKS5yZXF1ZXN0KCdHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99Jywge1xuICAgICAgb3duZXI6IG9yZyxcbiAgICAgIHJlcG86IG5hbWUsXG4gICAgfSk7XG4gICAgT2JqZWN0LmFzc2lnbihyZXQsIHJlc3BvbnNlLmRhdGEpO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGNvbnN0IHJlZGlyZWN0ZWRGdWxsTmFtZSA9IGdldFJlZGlyZWN0ZWRSZXBvRnVsbE5hbWUoZXJyb3IpO1xuICAgIGlmIChyZWRpcmVjdGVkRnVsbE5hbWUpIHtcbiAgICAgIHJldC5mdWxsX25hbWUgPSByZWRpcmVjdGVkRnVsbE5hbWU7XG4gICAgfVxuICB9XG4gIHJldHVybiByZXQ7XG59XG5cbmZ1bmN0aW9uIGdldFJlZGlyZWN0ZWRSZXBvRnVsbE5hbWUoZXJyb3I6IHVua25vd24pOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBpZiAoIWVycm9yIHx8IHR5cGVvZiBlcnJvciAhPT0gJ29iamVjdCcpIHJldHVybjtcblxuICBjb25zdCByZXNwb25zZSA9XG4gICAgJ3Jlc3BvbnNlJyBpbiBlcnJvclxuICAgICAgPyAoZXJyb3IgYXMgeyByZXNwb25zZT86IHsgc3RhdHVzPzogbnVtYmVyOyBoZWFkZXJzPzogUmVjb3JkPHN0cmluZywgc3RyaW5nIHwgdW5kZWZpbmVkPiB9IH0pLnJlc3BvbnNlXG4gICAgICA6IHVuZGVmaW5lZDtcbiAgY29uc3Qgc3RhdHVzID0gcmVzcG9uc2U/LnN0YXR1cyA/PyAoZXJyb3IgYXMgeyBzdGF0dXM/OiBudW1iZXIgfSkuc3RhdHVzO1xuICBpZiAoc3RhdHVzICE9PSAzMDEgJiYgc3RhdHVzICE9PSAzMDIpIHJldHVybjtcblxuICBjb25zdCBsb2NhdGlvbiA9IHJlc3BvbnNlPy5oZWFkZXJzPy5sb2NhdGlvbjtcbiAgaWYgKHR5cGVvZiBsb2NhdGlvbiAhPT0gJ3N0cmluZycpIHJldHVybjtcblxuICBjb25zdCBbb3JnLCBuYW1lXSA9IGdpdEh1YlV0aWwuZ2V0T3JnQW5kTmFtZShsb2NhdGlvbik7XG4gIGlmICghb3JnIHx8ICFuYW1lKSByZXR1cm47XG5cbiAgcmV0dXJuIGAke29yZ30vJHtuYW1lfWA7XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgeyBpZ25vcmVFcnJvckFzeW5jIH0gZnJvbSAnQHdpbGxib29zdGVyL3NoYXJlZC1saWIvc3JjJztcbmltcG9ydCB5YXJncyBmcm9tICd5YXJncyc7XG5cbmltcG9ydCB7IGZpeE5leHRDb25maWdKc29uIH0gZnJvbSAnLi9maXhlcnMvbmV4dENvbmZpZy5qcyc7XG5pbXBvcnQgeyBmaXhQbGF5d3JpZ2h0Q29uZmlnIH0gZnJvbSAnLi9maXhlcnMvcGxheXdyaWdodENvbmZpZy5qcyc7XG5pbXBvcnQgeyBmaXhQcmlzbWFFbnZGaWxlcyB9IGZyb20gJy4vZml4ZXJzL3ByaXNtYS5qcyc7XG5pbXBvcnQgeyBmaXhUZXN0RGlyZWN0b3JpZXNVcGRhdGluZ1BhY2thZ2VKc29uIH0gZnJvbSAnLi9maXhlcnMvdGVzdERpcmVjdG9yeS5qcyc7XG5pbXBvcnQgeyBmaXhUeXBlRGVmaW5pdGlvbnMgfSBmcm9tICcuL2ZpeGVycy90eXBlRGVmaW5pdGlvbi5qcyc7XG5pbXBvcnQgeyBmaXhUeXBvcyB9IGZyb20gJy4vZml4ZXJzL3R5cG9zLmpzJztcbmltcG9ydCB7IGdlbmVyYXRlQWdlbnRJbnN0cnVjdGlvbnMgfSBmcm9tICcuL2dlbmVyYXRvcnMvYWdlbnRzLmpzJztcbmltcG9ydCB7IGdlbmVyYXRlQmlvbWVKc29uYyB9IGZyb20gJy4vZ2VuZXJhdG9ycy9iaW9tZS5qcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZUJ1bmZpZ1RvbWwgfSBmcm9tICcuL2dlbmVyYXRvcnMvYnVuZmlnLmpzJztcbmltcG9ydCB7IGdlbmVyYXRlRG9ja2VyaWdub3JlIH0gZnJvbSAnLi9nZW5lcmF0b3JzL2RvY2tlcmlnbm9yZS5qcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZUVkaXRvcmNvbmZpZyB9IGZyb20gJy4vZ2VuZXJhdG9ycy9lZGl0b3Jjb25maWcuanMnO1xuaW1wb3J0IHsgZ2VuZXJhdGVFc2xpbnRyYyB9IGZyb20gJy4vZ2VuZXJhdG9ycy9lc2xpbnRDb25maWcuanMnO1xuaW1wb3J0IHsgZ2VuZXJhdGVHZW1pbmlDb25maWcgfSBmcm9tICcuL2dlbmVyYXRvcnMvZ2VtaW5pQ29uZmlnLmpzJztcbmltcG9ydCB7IHJlbW92ZUdlbWluaVNldHRpbmdzIH0gZnJvbSAnLi9nZW5lcmF0b3JzL2dlbWluaVNldHRpbmdzLmpzJztcbmltcG9ydCB7IGdlbmVyYXRlR2l0YXR0cmlidXRlcyB9IGZyb20gJy4vZ2VuZXJhdG9ycy9naXRhdHRyaWJ1dGVzLmpzJztcbmltcG9ydCB7IGdlbmVyYXRlR2l0aWdub3JlIH0gZnJvbSAnLi9nZW5lcmF0b3JzL2dpdGlnbm9yZS5qcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZUlkZWFTZXR0aW5ncyB9IGZyb20gJy4vZ2VuZXJhdG9ycy9pZGVhLmpzJztcbmltcG9ydCB7IGdlbmVyYXRlTGVmdGhvb2tVcGRhdGluZ1BhY2thZ2VKc29uIH0gZnJvbSAnLi9nZW5lcmF0b3JzL2xlZnRob29rLmpzJztcbmltcG9ydCB7IGdlbmVyYXRlTGludHN0YWdlZHJjIH0gZnJvbSAnLi9nZW5lcmF0b3JzL2xpbnRzdGFnZWRyYy5qcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZVBhY2thZ2VKc29uIH0gZnJvbSAnLi9nZW5lcmF0b3JzL3BhY2thZ2VKc29uLmpzJztcbmltcG9ydCB7IGdlbmVyYXRlUHJldHRpZXJpZ25vcmUgfSBmcm9tICcuL2dlbmVyYXRvcnMvcHJldHRpZXJpZ25vcmUuanMnO1xuaW1wb3J0IHsgZ2VuZXJhdGVQeXJpZ2h0Q29uZmlnSnNvbiB9IGZyb20gJy4vZ2VuZXJhdG9ycy9weXJpZ2h0Q29uZmlnLmpzJztcbmltcG9ydCB7IGdlbmVyYXRlUmVhZG1lIH0gZnJvbSAnLi9nZW5lcmF0b3JzL3JlYWRtZS5qcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZVJlbGVhc2VyYyB9IGZyb20gJy4vZ2VuZXJhdG9ycy9yZWxlYXNlcmMuanMnO1xuaW1wb3J0IHsgZ2VuZXJhdGVSZW5vdmF0ZUpzb24gfSBmcm9tICcuL2dlbmVyYXRvcnMvcmVub3ZhdGVKc29uLmpzJztcbmltcG9ydCB7IGluc3RhbGxBZ2VudFNraWxscyB9IGZyb20gJy4vZ2VuZXJhdG9ycy9za2lsbHMuanMnO1xuaW1wb3J0IHsgZ2VuZXJhdGVUc2NvbmZpZyB9IGZyb20gJy4vZ2VuZXJhdG9ycy90c2NvbmZpZy5qcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZVZzY29kZVNldHRpbmdzIH0gZnJvbSAnLi9nZW5lcmF0b3JzL3ZzY29kZVNldHRpbmdzLmpzJztcbmltcG9ydCB7IGdlbmVyYXRlV29ya2Zsb3dzLCBpc1JldXNhYmxlV29ya2Zsb3dzUmVwbyB9IGZyb20gJy4vZ2VuZXJhdG9ycy93b3JrZmxvdy5qcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZVlhcm5yY1ltbCB9IGZyb20gJy4vZ2VuZXJhdG9ycy95YXJucmMuanMnO1xuaW1wb3J0IHsgc2V0dXBMYWJlbHMgfSBmcm9tICcuL2dpdGh1Yi9sYWJlbC5qcyc7XG5pbXBvcnQgeyBzZXR1cFNlY3JldHMgfSBmcm9tICcuL2dpdGh1Yi9zZWNyZXQuanMnO1xuaW1wb3J0IHsgc2V0dXBHaXRIdWJTZXR0aW5ncyB9IGZyb20gJy4vZ2l0aHViL3NldHRpbmdzLmpzJztcbmltcG9ydCB7IGdlbmVyYXRlR2l0SHViVGVtcGxhdGVzIH0gZnJvbSAnLi9naXRodWIvdGVtcGxhdGUuanMnO1xuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi9sb2dnZXIuanMnO1xuaW1wb3J0IHsgb3B0aW9ucyB9IGZyb20gJy4vb3B0aW9ucy5qcyc7XG5pbXBvcnQgeyBnZXRQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5pbXBvcnQgeyBzcGF3blN5bmMsIHNwYXduU3luY0FuZFJldHVyblN0YXR1cyB9IGZyb20gJy4vdXRpbHMvc3Bhd25VdGlsLmpzJztcbmltcG9ydCB7IHNob3VsZFNraXBXaWxsYm9vc3RlckNvbmZpZ3NFc2xpbnRQYWNrYWdlIH0gZnJvbSAnLi91dGlscy93aWxsYm9vc3RlckNvbmZpZ3NVdGlsLmpzJztcblxuYXN5bmMgZnVuY3Rpb24gbWFpbigpOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgYXJndiA9IGF3YWl0IHlhcmdzKHByb2Nlc3MuYXJndi5zbGljZSgyKSlcbiAgICAuY29tbWFuZCgnJDAgW3BhdGhzLi5dJywgJ01ha2UgYSBnaXZlbiBwcm9qZWN0IGZvbGxvdyB0aGUgV2lsbEJvb3N0ZXIgc3RhbmRhcmQnLCAoeWFyZ3MpID0+IHtcbiAgICAgIHlhcmdzLnBvc2l0aW9uYWwoJ3BhdGhzJywge1xuICAgICAgICBkZXNjcmliZTogJ3Byb2plY3QgcGF0aHMgdG8gYmUgd2JmaWVkJyxcbiAgICAgICAgYXJyYXk6IHRydWUsXG4gICAgICAgIHR5cGU6ICdzdHJpbmcnLFxuICAgICAgICBkZWZhdWx0OiBbJy4nXSxcbiAgICAgIH0pO1xuICAgIH0pXG4gICAgLm9wdGlvbnMoe1xuICAgICAgZW52OiB7XG4gICAgICAgIGRlc2NyaXB0aW9uOiAnVXBsb2FkIGVudmlyb25tZW50IHZhcmlhYmxlcyBhcyBzZWNyZXRzIHRvIEdpdEh1YicsXG4gICAgICAgIHR5cGU6ICdib29sZWFuJyxcbiAgICAgICAgZGVmYXVsdDogZmFsc2UsXG4gICAgICAgIGFsaWFzOiAnZScsXG4gICAgICB9LFxuICAgICAgc2tpcERlcHM6IHtcbiAgICAgICAgZGVzY3JpcHRpb246ICdTa2lwIGRlcGVuZGVuY3kgaW5zdGFsbGF0aW9uJyxcbiAgICAgICAgdHlwZTogJ2Jvb2xlYW4nLFxuICAgICAgICBkZWZhdWx0OiBmYWxzZSxcbiAgICAgICAgYWxpYXM6ICdkJyxcbiAgICAgIH0sXG4gICAgICB2ZXJib3NlOiB7XG4gICAgICAgIGRlc2NyaXB0aW9uOiAnV2hldGhlciBvciBub3QgdG8gZW5hYmxlIHZlcmJvc2UgbW9kZScsXG4gICAgICAgIHR5cGU6ICdib29sZWFuJyxcbiAgICAgICAgZGVmYXVsdDogZmFsc2UsXG4gICAgICAgIGFsaWFzOiAndicsXG4gICAgICB9LFxuICAgIH0pXG4gICAgLnZlcnNpb24oZ2V0VmVyc2lvbigpKVxuICAgIC5zdHJpY3QoKS5hcmd2O1xuICBvcHRpb25zLmlzVmVyYm9zZSA9IGFyZ3YudmVyYm9zZTtcbiAgb3B0aW9ucy5kb2VzVXBsb2FkRW52VmFycyA9IGFyZ3YuZW52O1xuXG4gIGZvciAoY29uc3Qgcm9vdERpclBhdGggb2YgYXJndi5wYXRocyBhcyBzdHJpbmdbXSkge1xuICAgIGNvbnN0IHBhY2thZ2VzRGlyUGF0aCA9IHBhdGguam9pbihyb290RGlyUGF0aCwgJ3BhY2thZ2VzJyk7XG4gICAgY29uc3QgZGlyZW50cyA9IChhd2FpdCBpZ25vcmVFcnJvckFzeW5jKCgpID0+IGZzLnByb21pc2VzLnJlYWRkaXIocGFja2FnZXNEaXJQYXRoLCB7IHdpdGhGaWxlVHlwZXM6IHRydWUgfSkpKSA/PyBbXTtcbiAgICBjb25zdCBzdWJEaXJQYXRocyA9IGRpcmVudHMuZmlsdGVyKChkKSA9PiBkLmlzRGlyZWN0b3J5KCkpLm1hcCgoZCkgPT4gcGF0aC5qb2luKHBhY2thZ2VzRGlyUGF0aCwgZC5uYW1lKSk7XG5cbiAgICBhd2FpdCBmaXhUZXN0RGlyZWN0b3JpZXNVcGRhdGluZ1BhY2thZ2VKc29uKFtyb290RGlyUGF0aCwgLi4uc3ViRGlyUGF0aHNdKTtcblxuICAgIGNvbnN0IHJvb3RDb25maWcgPSBhd2FpdCBnZXRQYWNrYWdlQ29uZmlnKHJvb3REaXJQYXRoKTtcbiAgICBpZiAob3B0aW9ucy5pc1ZlcmJvc2UpIHtcbiAgICAgIGNvbnNvbGUubG9nKCdyb290Q29uZmlnOicsIHJvb3RDb25maWcpO1xuICAgIH1cbiAgICBpZiAoIXJvb3RDb25maWcpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoYHRoZXJlIGlzIG5vIHZhbGlkIHBhY2thZ2UuanNvbiBpbiAke3Jvb3REaXJQYXRofWApO1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGNvbnN0IGFiYnJldmlhdGlvblByb21pc2UgPSBmaXhUeXBvcyhyb290Q29uZmlnKTtcblxuICAgIGNvbnN0IG51bGxhYmxlU3ViUGFja2FnZUNvbmZpZ3MgPSBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgIHN1YkRpclBhdGhzLm1hcCgoc3ViRGlyUGF0aCkgPT4gZ2V0UGFja2FnZUNvbmZpZyhzdWJEaXJQYXRoLCByb290Q29uZmlnKSlcbiAgICApO1xuICAgIGNvbnN0IHN1YlBhY2thZ2VDb25maWdzID0gbnVsbGFibGVTdWJQYWNrYWdlQ29uZmlncy5maWx0ZXIoKGNvbmZpZykgPT4gISFjb25maWcpO1xuICAgIGNvbnN0IGFsbFBhY2thZ2VDb25maWdzID0gW3Jvb3RDb25maWcsIC4uLnN1YlBhY2thZ2VDb25maWdzXTtcblxuICAgIGlmIChvcHRpb25zLmlzVmVyYm9zZSkge1xuICAgICAgZm9yIChjb25zdCBjb25maWcgb2YgYWxsUGFja2FnZUNvbmZpZ3MpIHtcbiAgICAgICAgY29uc29sZS5pbmZvKGNvbmZpZyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gSW5zdGFsbCB5YXJuIGJlcnJ5XG4gICAgYXdhaXQgZ2VuZXJhdGVZYXJucmNZbWwocm9vdENvbmZpZyk7XG4gICAgaWYgKHJvb3RDb25maWcuaXNCdW4pIHtcbiAgICAgIGF3YWl0IGdlbmVyYXRlQnVuZmlnVG9tbChyb290Q29uZmlnKTtcbiAgICB9XG5cbiAgICBjb25zdCBzaG91bGRSdW5Xb3JrZmxvd3MgPVxuICAgICAgIWlzUmV1c2FibGVXb3JrZmxvd3NSZXBvKHJvb3RDb25maWcucmVwb3NpdG9yeSkgJiZcbiAgICAgIChyb290Q29uZmlnLnJlcG9zaXRvcnk/LnN0YXJ0c1dpdGgoJ2dpdGh1YjpXaWxsQm9vc3Rlci8nKSB8fFxuICAgICAgICByb290Q29uZmlnLnJlcG9zaXRvcnk/LnN0YXJ0c1dpdGgoJ2dpdGh1YjpXaWxsQm9vc3RlckxhYi8nKSk7XG4gICAgYXdhaXQgUHJvbWlzZS5hbGwoW1xuICAgICAgZml4UHJpc21hRW52RmlsZXMocm9vdENvbmZpZyksXG4gICAgICBhYmJyZXZpYXRpb25Qcm9taXNlLnRoZW4oKCkgPT4gZ2VuZXJhdGVSZWFkbWUocm9vdENvbmZpZykpLFxuICAgICAgZ2VuZXJhdGVBZ2VudEluc3RydWN0aW9ucyhyb290Q29uZmlnLCBhbGxQYWNrYWdlQ29uZmlncyksXG4gICAgICBnZW5lcmF0ZURvY2tlcmlnbm9yZShyb290Q29uZmlnKSxcbiAgICAgIGdlbmVyYXRlRWRpdG9yY29uZmlnKHJvb3RDb25maWcpLFxuICAgICAgZ2VuZXJhdGVHZW1pbmlDb25maWcocm9vdENvbmZpZywgYWxsUGFja2FnZUNvbmZpZ3MpLFxuICAgICAgcmVtb3ZlR2VtaW5pU2V0dGluZ3Mocm9vdENvbmZpZyksXG4gICAgICBnZW5lcmF0ZUdpdGF0dHJpYnV0ZXMocm9vdENvbmZpZyksXG4gICAgICBnZW5lcmF0ZUdpdEh1YlRlbXBsYXRlcyhyb290Q29uZmlnKSxcbiAgICAgIGdlbmVyYXRlSWRlYVNldHRpbmdzKHJvb3RDb25maWcpLFxuICAgICAgZ2VuZXJhdGVSZW5vdmF0ZUpzb24ocm9vdENvbmZpZyksXG4gICAgICBnZW5lcmF0ZVJlbGVhc2VyYyhyb290Q29uZmlnKSxcbiAgICAgIC4uLihzaG91bGRSdW5Xb3JrZmxvd3MgPyBbZ2VuZXJhdGVXb3JrZmxvd3Mocm9vdENvbmZpZyldIDogW10pLFxuICAgICAgc2V0dXBMYWJlbHMocm9vdENvbmZpZyksXG4gICAgICBzZXR1cFNlY3JldHMocm9vdENvbmZpZyksXG4gICAgICBzZXR1cEdpdEh1YlNldHRpbmdzKHJvb3RDb25maWcpLFxuICAgICAgZ2VuZXJhdGVMZWZ0aG9va1VwZGF0aW5nUGFja2FnZUpzb24ocm9vdENvbmZpZyksXG4gICAgICBnZW5lcmF0ZUxpbnRzdGFnZWRyYyhyb290Q29uZmlnKSxcbiAgICBdKTtcbiAgICBhd2FpdCBwcm9taXNlUG9vbC5wcm9taXNlQWxsKCk7XG5cbiAgICBjb25zdCBwcm9taXNlczogUHJvbWlzZTx2b2lkPltdID0gW107XG4gICAgZm9yIChjb25zdCBjb25maWcgb2YgYWxsUGFja2FnZUNvbmZpZ3MpIHtcbiAgICAgIGlmIChzaG91bGRTa2lwV2lsbGJvb3N0ZXJDb25maWdzRXNsaW50UGFja2FnZShjb25maWcpKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgaWYgKGNvbmZpZy5kb2VzQ29udGFpblR5cGVTY3JpcHQgfHwgY29uZmlnLmRvZXNDb250YWluVHlwZVNjcmlwdEluUGFja2FnZXMpIHtcbiAgICAgICAgcHJvbWlzZXMucHVzaChmaXhUeXBlRGVmaW5pdGlvbnMoY29uZmlnLCBjb25maWcuaXNSb290ID8gYWxsUGFja2FnZUNvbmZpZ3MgOiBbY29uZmlnXSkpO1xuICAgICAgfVxuICAgICAgaWYgKGNvbmZpZy5kZXBlbmRpbmcucGxheXdyaWdodFRlc3QpIHtcbiAgICAgICAgcHJvbWlzZXMucHVzaChmaXhQbGF5d3JpZ2h0Q29uZmlnKGNvbmZpZykpO1xuICAgICAgfVxuICAgICAgaWYgKGNvbmZpZy5kZXBlbmRpbmcubmV4dCkge1xuICAgICAgICBwcm9taXNlcy5wdXNoKGZpeE5leHRDb25maWdKc29uKGNvbmZpZykpO1xuICAgICAgfVxuICAgICAgYXdhaXQgZ2VuZXJhdGVHaXRpZ25vcmUoY29uZmlnLCByb290Q29uZmlnKTtcbiAgICAgIGF3YWl0IHByb21pc2VQb29sLnByb21pc2VBbGwoKTtcbiAgICAgIGlmICghY29uZmlnLmlzUm9vdCAmJiAhY29uZmlnLmRvZXNDb250YWluUGFja2FnZUpzb24pIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBhd2FpdCBnZW5lcmF0ZVByZXR0aWVyaWdub3JlKGNvbmZpZyk7XG4gICAgICBhd2FpdCBnZW5lcmF0ZVBhY2thZ2VKc29uKGNvbmZpZywgcm9vdENvbmZpZywgYXJndi5za2lwRGVwcyk7XG5cbiAgICAgIHByb21pc2VzLnB1c2goZ2VuZXJhdGVMaW50c3RhZ2VkcmMoY29uZmlnKSk7XG4gICAgICBpZiAoY29uZmlnLmRvZXNDb250YWluVnNjb2RlU2V0dGluZ3NKc29uICYmIGNvbmZpZy5kb2VzQ29udGFpblBhY2thZ2VKc29uKSB7XG4gICAgICAgIHByb21pc2VzLnB1c2goZ2VuZXJhdGVWc2NvZGVTZXR0aW5ncyhjb25maWcpKTtcbiAgICAgIH1cbiAgICAgIGlmIChjb25maWcuZG9lc0NvbnRhaW5UeXBlU2NyaXB0IHx8IGNvbmZpZy5kb2VzQ29udGFpblR5cGVTY3JpcHRJblBhY2thZ2VzKSB7XG4gICAgICAgIHByb21pc2VzLnB1c2goZ2VuZXJhdGVUc2NvbmZpZyhjb25maWcpKTtcbiAgICAgIH1cbiAgICAgIGlmIChcbiAgICAgICAgY29uZmlnLmRvZXNDb250YWluSmF2YVNjcmlwdCB8fFxuICAgICAgICBjb25maWcuZG9lc0NvbnRhaW5KYXZhU2NyaXB0SW5QYWNrYWdlcyB8fFxuICAgICAgICBjb25maWcuZG9lc0NvbnRhaW5UeXBlU2NyaXB0IHx8XG4gICAgICAgIGNvbmZpZy5kb2VzQ29udGFpblR5cGVTY3JpcHRJblBhY2thZ2VzXG4gICAgICApIHtcbiAgICAgICAgaWYgKHJvb3RDb25maWcuaXNCdW4pIHtcbiAgICAgICAgICBwcm9taXNlcy5wdXNoKGdlbmVyYXRlQmlvbWVKc29uYyhjb25maWcpKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIXJvb3RDb25maWcuaXNXaWxsQm9vc3RlckNvbmZpZ3MpIHtcbiAgICAgICAgICBwcm9taXNlcy5wdXNoKGdlbmVyYXRlRXNsaW50cmMoY29uZmlnKSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChjb25maWcuZGVwZW5kaW5nLnB5cmlnaHQpIHtcbiAgICAgICAgcHJvbWlzZXMucHVzaChnZW5lcmF0ZVB5cmlnaHRDb25maWdKc29uKGNvbmZpZykpO1xuICAgICAgfVxuICAgIH1cbiAgICBhd2FpdCBQcm9taXNlLmFsbChwcm9taXNlcyk7XG4gICAgYXdhaXQgcHJvbWlzZVBvb2wucHJvbWlzZUFsbCgpO1xuXG4gICAgY29uc3QgcGFja2FnZU1hbmFnZXIgPSByb290Q29uZmlnLmlzQnVuID8gJ2J1bicgOiAneWFybic7XG4gICAgLy8gUmVmcmVzaCBsb2NrIGZpbGVzXG4gICAgaWYgKHJvb3RDb25maWcuaXNCdW4pIHtcbiAgICAgIGF3YWl0IGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdyZWZyZXNoQnVuTG9jaycsIGFzeW5jICgpID0+IHtcbiAgICAgICAgYXdhaXQgUHJvbWlzZS5yZXNvbHZlKCk7XG4gICAgICAgIHJlZnJlc2hCdW5Mb2NrKHJvb3REaXJQYXRoKTtcbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICBzcGF3blN5bmMocGFja2FnZU1hbmFnZXIsIFsnaW5zdGFsbCcsICctLW5vLWltbXV0YWJsZSddLCByb290RGlyUGF0aCk7XG4gICAgfVxuICAgIHNwYXduU3luYyhwYWNrYWdlTWFuYWdlciwgWydjbGVhbnVwJ10sIHJvb3REaXJQYXRoKTtcblxuICAgIGF3YWl0IGluc3RhbGxBZ2VudFNraWxscyhyb290Q29uZmlnKTtcbiAgfVxufVxuXG5mdW5jdGlvbiByZWZyZXNoQnVuTG9jayhyb290RGlyUGF0aDogc3RyaW5nKTogdm9pZCB7XG4gIGNvbnN0IGxvY2tGaWxlUGF0aCA9IHBhdGguam9pbihyb290RGlyUGF0aCwgJ2J1bi5sb2NrJyk7XG4gIGNvbnN0IGJhY2t1cExvY2tGaWxlUGF0aCA9IHBhdGguam9pbihyb290RGlyUGF0aCwgJy5idW4ubG9jay53YmZ5LWJhY2t1cCcpO1xuICBmcy5ybVN5bmMoYmFja3VwTG9ja0ZpbGVQYXRoLCB7IGZvcmNlOiB0cnVlIH0pO1xuICBpZiAoZnMuZXhpc3RzU3luYyhsb2NrRmlsZVBhdGgpKSB7XG4gICAgLy8gUmVnZW5lcmF0ZSBmcm9tIHNjcmF0Y2gsIGJ1dCBrZWVwIHRoZSBwcmV2aW91cyBsb2NrZmlsZSBzbyBhIHJlZ2lzdHJ5IG9yXG4gICAgLy8gcmVzb2x2ZXIgZmFpbHVyZSBjYW5ub3QgbGVhdmUgdGhlIHJlcG9zaXRvcnkgd2l0aG91dCBhIGxvY2tmaWxlLlxuICAgIGZzLmNvcHlGaWxlU3luYyhsb2NrRmlsZVBhdGgsIGJhY2t1cExvY2tGaWxlUGF0aCk7XG4gICAgZnMucm1TeW5jKGxvY2tGaWxlUGF0aCwgeyBmb3JjZTogdHJ1ZSB9KTtcbiAgfVxuXG4gIGNvbnN0IHN0YXR1cyA9IHNwYXduU3luY0FuZFJldHVyblN0YXR1cygnYnVuJywgWyd1cGRhdGUnXSwgcm9vdERpclBhdGgpO1xuICBpZiAoc3RhdHVzID09PSAwICYmIGZzLmV4aXN0c1N5bmMobG9ja0ZpbGVQYXRoKSkge1xuICAgIGZzLnJtU3luYyhiYWNrdXBMb2NrRmlsZVBhdGgsIHsgZm9yY2U6IHRydWUgfSk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgaWYgKGZzLmV4aXN0c1N5bmMoYmFja3VwTG9ja0ZpbGVQYXRoKSkge1xuICAgIGZzLmNvcHlGaWxlU3luYyhiYWNrdXBMb2NrRmlsZVBhdGgsIGxvY2tGaWxlUGF0aCk7XG4gICAgZnMucm1TeW5jKGJhY2t1cExvY2tGaWxlUGF0aCwgeyBmb3JjZTogdHJ1ZSB9KTtcbiAgfVxuICB0aHJvdyBuZXcgRXJyb3IoYEZhaWxlZCB0byByZWdlbmVyYXRlICR7bG9ja0ZpbGVQYXRofTogYnVuIHVwZGF0ZSBleGl0ZWQgd2l0aCBzdGF0dXMgJHtzdGF0dXN9YCk7XG59XG5cbmZ1bmN0aW9uIGdldFZlcnNpb24oKTogc3RyaW5nIHtcbiAgbGV0IHBhY2thZ2VKc29uRGlyID0gcGF0aC5kaXJuYW1lKG5ldyBVUkwoaW1wb3J0Lm1ldGEudXJsKS5wYXRobmFtZSk7XG4gIHdoaWxlICghZnMuZXhpc3RzU3luYyhwYXRoLmpvaW4ocGFja2FnZUpzb25EaXIsICdwYWNrYWdlLmpzb24nKSkpIHtcbiAgICBwYWNrYWdlSnNvbkRpciA9IHBhdGguZGlybmFtZShwYWNrYWdlSnNvbkRpcik7XG4gIH1cbiAgY29uc3QgcGFja2FnZUpzb24gPSBKU09OLnBhcnNlKGZzLnJlYWRGaWxlU3luYyhwYXRoLmpvaW4ocGFja2FnZUpzb25EaXIsICdwYWNrYWdlLmpzb24nKSwgJ3V0ZjgnKSkgYXMge1xuICAgIHZlcnNpb246IHN0cmluZztcbiAgfTtcbiAgcmV0dXJuIHBhY2thZ2VKc29uLnZlcnNpb247XG59XG5cbmF3YWl0IG1haW4oKTtcbiJdLCJuYW1lcyI6WyJhc3luYyIsInNsZWVwIiwibWlsbGlzZWNvbmRzIiwiUHJvbWlzZSIsInIiLCJzZXRUaW1lb3V0IiwiaWdub3JlRXJyb3JBc3luYyIsImZuIiwiaWdub3JlRW5vZW50QXN5bmMiLCJlcnJvciIsImNvZGUiLCJvcHRpb25zIiwiaXNWZXJib3NlIiwiZG9lc1VwbG9hZEVudlZhcnMiLCJsb2dnZXIiLCJmdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uIiwibmFtZSIsImZ1bmMiLCJjb25zb2xlIiwiaW5mbyIsIkVycm9yIiwic3RhY2siLCJTdHJpbmciLCJmc1V0aWwiLCJyZWFkRmlsZUlnbm9yaW5nRXJyb3IiLCJmaWxlUGF0aCIsImZzIiwicHJvbWlzZXMiLCJyZWFkRmlsZSIsImdlbmVyYXRlRmlsZSIsImNvbnRlbnQiLCJta2RpciIsInBhdGgiLCJkaXJuYW1lIiwicmVjdXJzaXZlIiwibm9ybWFsaXplZENvbnRlbnQiLCJ0cmltIiwid3JpdGVGaWxlIiwicHJvbWlzZVBvb2wiLCJQcm9taXNlUG9vbCIsImZpeE5leHRDb25maWdKc29uIiwiY29uZmlnIiwibWFwIiwiZXh0IiwicmVzb2x2ZSIsImRpclBhdGgiLCJmaW5kIiwicCIsImV4aXN0c1N5bmMiLCJvbGRDb250ZW50Iiwib2JqZWN0TGl0ZXJhbCIsInNvdXJjZSIsInRzIiwiY3JlYXRlU291cmNlRmlsZSIsIlNjcmlwdFRhcmdldCIsIkxhdGVzdCIsIlNjcmlwdEtpbmQiLCJKUyIsInZpc2l0Iiwibm9kZSIsImlzRXhwb3J0QXNzaWdubWVudCIsImlzT2JqZWN0TGl0ZXJhbEV4cHJlc3Npb24iLCJleHByZXNzaW9uIiwiaXNCaW5hcnlFeHByZXNzaW9uIiwib3BlcmF0b3JUb2tlbiIsImtpbmQiLCJTeW50YXhLaW5kIiwiRXF1YWxzVG9rZW4iLCJsZWZ0IiwiZ2V0VGV4dCIsInJpZ2h0IiwiZm9yRWFjaENoaWxkIiwiZ2V0TmV4dENvbmZpZ09iamVjdExpdGVyYWwiLCJleGlzdGluZ1Byb3BlcnRpZXMiLCJTZXQiLCJwcm9wZXJ0aWVzIiwicHJvcGVydHkiLCJwcm9wZXJ0eVRleHRzIiwiaGFzIiwicHVzaCIsImxlbmd0aCIsImluc2VydGlvblBvaW50IiwiZ2V0RW5kIiwibGFzdFByb3BlcnR5IiwiYXQiLCJoYXNUcmFpbGluZ0NvbW1hIiwic2xpY2UiLCJpbmNsdWRlcyIsInByZWZpeCIsIm5ld0NvbnRlbnQiLCJqb2luIiwicnVuIiwibGl0ZXJhbCIsInZhbHVlIiwiYXNPYmplY3QiLCJleHRyYU1lbWJlcnMiLCJ0b1BhcnNlZE9iamVjdCIsImRlZmF1bHRDb25maWciLCJmb3JiaWRPbmx5IiwicmV0cmllcyIsInVzZSIsImJhc2VVUkwiLCJ0cmFjZSIsInNjcmVlbnNob3QiLCJ2aWRlbyIsIndlYlNlcnZlciIsImNvbW1hbmQiLCJ1cmwiLCJyZXVzZUV4aXN0aW5nU2VydmVyIiwidGltZW91dCIsInN0ZG91dCIsInN0ZGVyciIsImVudiIsImdyYWNlZnVsU2h1dGRvd24iLCJtZW1iZXJPcmRlciIsIk9iamVjdCIsImtleXMiLCJrZXkiLCJfIiwiaW5kZXgiLCJmaXhQbGF5d3JpZ2h0Q29uZmlnIiwiZW52RmlsZVBhdGhzIiwiZW52RmlsZVBhdGgiLCJ0ZXN0IiwiYXNzZXJ0TmV4dFB1YmxpY0Jhc2VVcmwiLCJleHRyYWN0ZWRPYmplY3RMaXRlcmFsIiwiVFMiLCJmb3VuZCIsImlzQ2FsbEV4cHJlc3Npb24iLCJmaXJzdEFyZ3VtZW50IiwiYXJndW1lbnRzIiwidW5kZWZpbmVkIiwiZXh0cmFjdERlZmluZUNvbmZpZ09iamVjdExpdGVyYWwiLCJwYXJzZWQiLCJwYXJzZU9iamVjdExpdGVyYWxFeHByZXNzaW9uIiwibWVyZ2VkIiwibWVyZ2VQYXJzZWRPYmplY3RzIiwiaGFzU3RhcnRUZXN0U2VydmVyIiwiQm9vbGVhbiIsInBhY2thZ2VKc29uIiwic2NyaXB0cyIsImhhc0V4aXN0aW5nV2ViU2VydmVyIiwib2JqZWN0IiwiaXNCdW4iLCJzZXRXZWJTZXJ2ZXJDb21tYW5kIiwibmV3T2JqZWN0TGl0ZXJhbCIsInN0cmluZ2lmeVZhbHVlIiwic3RhcnQiLCJnZXRTdGFydCIsImVuZCIsImJhc2UiLCJvdmVycmlkZSIsIm92ZXJyaWRlUHJvcGVydHlLZXlzIiwiZmlsdGVyIiwibWVtYmVyIiwiZW50cmllcyIsIm1lcmdlUGFyc2VkVmFsdWUiLCJwYXJzZUV4cHJlc3Npb24iLCJwYXJzZWRPYmplY3QiLCJpc0FycmF5TGl0ZXJhbEV4cHJlc3Npb24iLCJlbGVtZW50cyIsImVsZW1lbnQiLCJzb21lIiwiaXNTaG9ydGhhbmRQcm9wZXJ0eUFzc2lnbm1lbnQiLCJpc1Byb3BlcnR5QXNzaWdubWVudCIsImlzSWRlbnRpZmllciIsImlzU3RyaW5nTGl0ZXJhbCIsImluaXRpYWxpemVyIiwibGV2ZWwiLCJjbG9zaW5nSW5kZW50IiwicmVwZWF0IiwiaW5kZW50IiwiaXRlbSIsInN0cmluZ2lmaWVkIiwic3BsaXQiLCJlbWl0dGVkUHJvcGVydGllcyIsImxhc3RQcm9wZXJ0eUluZGV4QnlLZXkiLCJNYXAiLCJzZXQiLCJnZXRMYXN0UHJvcGVydHlJbmRleEJ5S2V5IiwibGluZXMiLCJmbGF0TWFwIiwic3RyaW5naWZ5T2JqZWN0TWVtYmVyIiwiZ2V0IiwiYWRkIiwic3RyaW5naWZ5T2JqZWN0UHJvcGVydHkiLCJsaW5lIiwiZ2xvYklnbm9yZSIsImZpeFByaXNtYUVudkZpbGVzIiwiZW52RmlsZXMiLCJmZyIsImdsb2IiLCJkb3QiLCJjd2QiLCJpZ25vcmUiLCJlbnZGaWxlIiwicmVwbGFjZUFsbCIsIm1hdGNoIiwic2VwYXJhdG9yIiwicHJvdG90eXBlIiwiaGFzT3duUHJvcGVydHkiLCJjYWxsIiwic29ydE9iamVjdEJ5S2V5TmFtZUxpc3QiLCJzb3J0V2l0aCIsInNvcnRGbiIsInRvdGFsIiwib2JqZWN0S2V5cyIsInNvcnQiLCJJTkRFTlRfUkVHRVgiLCJJTkRFTlRfVFlQRV9TUEFDRSIsInNob3VsZElnbm9yZVNpbmdsZVNwYWNlIiwiaWdub3JlU2luZ2xlU3BhY2VzIiwiaW5kZW50VHlwZSIsIm1ha2VJbmRlbnRzTWFwIiwic3RyaW5nIiwiaW5kZW50cyIsInByZXZpb3VzSW5kZW50VHlwZSIsInByZXZpb3VzU2l6ZSIsIm1hdGNoZXMiLCJ3ZWlnaHQiLCJpbmRlbnREaWZmZXJlbmNlIiwiYWJzb2x1dGVJbmRlbnREaWZmZXJlbmNlIiwiTWF0aCIsImFicyIsImVuY29kZUluZGVudHNLZXkiLCJlbnRyeSIsImluZGVudEFtb3VudCIsImRldGVjdEluZGVudCIsIlR5cGVFcnJvciIsInNpemUiLCJrZXlPZk1vc3RVc2VkSW5kZW50IiwicmVzdWx0IiwibWF4VXNlZCIsIm1heFdlaWdodCIsInVzZWRDb3VudCIsImdldE1vc3RVc2VkS2V5IiwidHlwZSIsImFtb3VudCIsImluZGVudHNLZXkiLCJOdW1iZXIiLCJtYWtlSW5kZW50U3RyaW5nIiwiZGV0ZWN0TmV3bGluZUdyYWNlZnVsIiwibmV3bGluZXMiLCJjcmxmIiwibmV3bGluZSIsImRldGVjdE5ld2xpbmUiLCJwaXBlIiwiZm5zIiwieCIsImFyZ3MiLCJyZWR1Y2UiLCJvbkFycmF5IiwiQXJyYXkiLCJpc0FycmF5Iiwib25TdHJpbmdBcnJheSIsImV2ZXJ5IiwidW5pcSIsInhzIiwic29ydEFycmF5IiwiYXJyYXkiLCJ0b1NvcnRlZCIsInVuaXFBbmRTb3J0QXJyYXkiLCJvbk9iamVjdCIsImdldFByb3RvdHlwZU9mIiwiU3ltYm9sIiwidG9TdHJpbmdUYWciLCJpdGVyYXRvciIsImlzUGxhaW5PYmplY3QiLCJzb3J0T2JqZWN0QnkiLCJjb21wYXJhdG9yIiwiZGVlcCIsIm92ZXIiLCJmcm9tRW50cmllcyIsInNvcnRPYmplY3RLZXlzIiwib2JqZWN0R3JvdXBCeSIsImdyb3VwQnkiLCJjYWxsYmFjayIsImNyZWF0ZSIsInNvcnRPYmplY3QiLCJzb3J0VVJMT2JqZWN0Iiwic29ydFBlb3BsZU9iamVjdCIsInNvcnREaXJlY3RvcmllcyIsIm92ZXJQcm9wZXJ0eSIsImhhc093biIsInNvcnRHaXRIb29rcyIsInBhcnNlTmFtZUFuZFZlcnNpb25SYW5nZSIsInNwZWNpZmllciIsIm5hbWVBbmRWZXJzaW9uIiwiYXRNYXRjaGVzIiwibWF0Y2hBbGwiLCJzcGxpdEluZGV4IiwicG9wIiwic3Vic3RyaW5nIiwicmFuZ2UiLCJzb3J0T2JqZWN0QnlTZW12ZXIiLCJhIiwiYiIsImFOYW1lIiwiYVJhbmdlIiwiYk5hbWUiLCJiUmFuZ2UiLCJsb2NhbGVDb21wYXJlIiwic2VtdmVyQ29tcGFyZSIsInNlbXZlck1pblZlcnNpb24iLCJnZXRQYWNrYWdlTmFtZSIsImlkZW50IiwiaW5kZXhPZiIsInN0YXJ0c1dpdGgiLCJjYWNoZSIsInNob3VsZFNvcnREZXBlbmRlbmNpZXNMaWtlTnBtIiwicGFja2FnZU1hbmFnZXIiLCJkZXZFbmdpbmVzIiwicG5wbSIsImVuZ2luZXMiLCJucG0iLCJwcm9jZXNzIiwiaGFzWWFybk9yUG5wbUZpbGVzIiwic29ydERlcGVuZGVuY2llcyIsImRlcGVuZGVuY2llcyIsInNvcnRXb3Jrc3BhY2VzIiwic29ydEVzbGludENvbmZpZyIsIm92ZXJyaWRlcyIsInJ1bGUxIiwicnVsZTIiLCJzb3J0VlNDb2RlQmFkZ2VPYmplY3QiLCJzb3J0UHJldHRpZXJDb25maWciLCJzb3J0Vm9sdGEiLCJzb3J0RGV2RW5naW5lcyIsInNvcnRQbnBtQ29uZmlnIiwiZGVmYXVsdE5wbVNjcmlwdHMiLCJoYXNEZXZEZXBlbmRlbmN5IiwiZGVwZW5kZW5jeSIsImRldkRlcGVuZGVuY2llcyIsInJ1blNSZWdFeHAiLCJoYXNTZXF1ZW50aWFsU2NyaXB0IiwiZmllbGQiLCJ2YWx1ZXMiLCJzY3JpcHQiLCJpc1NlcXVlbnRpYWxTY3JpcHQiLCJzb3J0U2NyaXB0TmFtZXMiLCJncm91cE1hcCIsImlkeCIsImZyb20iLCJncm91cEtleSIsImNoaWxkcmVuIiwiayIsInNvcnRTY3JpcHRzIiwibmFtZXMiLCJwcmVmaXhhYmxlIiwib21pdHRlZCIsInJlcGxhY2UiLCJzb3J0Q29uZGl0aW9ucyIsImNvbmRpdGlvbnMiLCJkZWZhdWx0Q29uZGl0aW9ucyIsInJlc3RDb25kaXRpb25zIiwiY29uZGl0aW9uIiwic29ydEV4cG9ydHMiLCJleHBvcnRzIiwicGF0aHMiLCJmaWVsZHMiLCJtYWludGFpbmVycyIsImNvbnRyaWJ1dG9ycyIsInBhY2thZ2VOYW1lQSIsInBhY2thZ2VOYW1lQiIsImJhZGdlIiwiZGVmYXVsdFNvcnRPcmRlciIsIm92ZXJGaWVsZHMiLCJzb3J0UGFja2FnZUpzb24iLCJqc29uSXNoIiwianNvbiIsImVuZENoYXJhY3RlcnMiLCJKU09OIiwicGFyc2UiLCJzdHJpbmdpZnkiLCJlZGl0U3RyaW5nSlNPTiIsInNvcnRPcmRlciIsInByaXZhdGVLZXlzIiwicHVibGljS2V5cyIsImZpeFRlc3REaXJlY3Rvcmllc1VwZGF0aW5nUGFja2FnZUpzb24iLCJwYWNrYWdlRGlyUGF0aHMiLCJhbGwiLCJwYWNrYWdlSnNvblBhdGgiLCJwYWNrYWdlRGlyUGF0aCIsIm5ld1Rlc3REaXJQYXRoIiwib2xkVGVzdERpck5hbWUiLCJvbGRUZXN0RGlyUGF0aCIsIm1vdmVUZXN0RGlyZWN0b3J5IiwiZGlkVXBkYXRlU2NyaXB0Iiwic2NyaXB0TmFtZSIsIm5ld1NjcmlwdCIsInJlbmFtZSIsImRpcmVudHMiLCJyZWFkZGlyIiwid2l0aEZpbGVUeXBlcyIsIm9sZFBhdGgiLCJkaXJlbnQiLCJuZXdQYXRoIiwibmV3UGF0aFN0YXQiLCJzdGF0IiwiaXNEaXJlY3RvcnkiLCJybSIsImZpeFR5cGVEZWZpbml0aW9ucyIsImNvbmZpZ3NJbmNsdWRpbmdDaGlsZHJlbiIsImxpYlR5cGVEaXJQYXRoIiwic3JjVHlwZURpclBhdGgiLCJpc1Jvb3QiLCJkb2VzQ29udGFpblN1YlBhY2thZ2VKc29ucyIsImRpck5hbWUiLCJoYXNUeXBlRGVjbGFyYXRpb25FeHRlbnNpb24iLCJlbmRzV2l0aCIsInBhY2thZ2VOYW1lIiwiaGFzTGlicmFyeSIsImlzRmlsZSIsIm92ZXJ3cml0ZU1lcmdlIiwiZGVzdGluYXRpb25BcnJheSIsInNvdXJjZUFycmF5IiwiY29tYmluZU1lcmdlIiwidGFyZ2V0IiwiZGVzdGluYXRpb24iLCJjbG9uZVVubGVzc090aGVyd2lzZVNwZWNpZmllZCIsImlzTWVyZ2VhYmxlT2JqZWN0IiwibWVyZ2UiLCJzb3J0S2V5cyIsIm9iaiIsImtleUFuZFZhbHVlcyIsImtleTEiLCJrZXkyIiwicHVibGljUmVwb0F1dG9maXhXb3JrZmxvdyIsIm9uIiwicHVsbF9yZXF1ZXN0IiwiYnJhbmNoZXMiLCJwZXJtaXNzaW9ucyIsImNvbnRlbnRzIiwiY29uY3VycmVuY3kiLCJncm91cCIsImpvYnMiLCJhdXRvZml4IiwicHJpdmF0ZVJlcG9BdXRvZml4V29ya2Zsb3ciLCJ1c2VzIiwid29ya2Zsb3dzIiwicmVsZWFzZSIsInB1bGxfcmVxdWVzdF90YXJnZXQiLCJ0eXBlcyIsInN5bmMiLCJpc3N1ZXMiLCJpZiIsIndpdGgiLCJzZWNyZXRzIiwiQ0xBVURFX0NPREVfT0FVVEhfVE9LRU4iLCJPUEVOQUlfQVBJX0tFWSIsIkdFTUlOSV9BUElfS0VZIiwiZ2VuZXJhdGVXb3JrZmxvd3MiLCJyb290Q29uZmlnIiwiaXNSZXVzYWJsZVdvcmtmbG93c1JlcG8iLCJyZXBvc2l0b3J5Iiwid29ya2Zsb3dzUGF0aCIsInNlbWFudGljWW1sUGF0aCIsImZvcmNlIiwiZmlsZU5hbWVTZXQiLCJkZXBlbmRpbmciLCJzZW1hbnRpY1JlbGVhc2UiLCJmaWxlTmFtZSIsImJhc2VuYW1lIiwid3JpdGVXb3JrZmxvd1lhbWwiLCJkZXBsb3lQcm9kdWN0aW9uV29ya2Zsb3dFeGlzdHMiLCJ3cml0ZVlhbWwiLCJpc1B1YmxpY1JlcG8iLCJjbG9uZURlZXAiLCJzdGVwcyIsImJ1aWxkIiwiYXV0b2ZpeFdvcmtmbG93IiwiYXV0b2ZpeEpvYiIsImdlbmVyYXRlQXV0b2ZpeFdvcmtmbG93IiwibmV3U2V0dGluZ3MiLCJvbGRTZXR0aW5ncyIsInlhbWwiLCJsb2FkIiwiYXJyYXlNZXJnZSIsIm1vdmVUb0JvdHRvbSIsImFjdGlvbnMiLCJ0cmlnZ2VyX2RlcGxveV93b3JrZmxvdyIsImlzUmV1c2FibGVXb3JrZmxvdyIsImpvYiIsIm5vcm1hbGl6ZUpvYiIsInNjaGVkdWxlIiwiYnJhbmNoIiwicGFyYW1zIiwic3luY19wYXJhbXNfd2l0aG91dF9kZXN0Iiwid29ya2Zsb3dfZGlzcGF0Y2giLCJOUE1fVE9LRU4iLCJHSF9UT0tFTiIsIkZJUkVCQVNFX1RPS0VOIiwiR0NQX1NBX0tFWV9KU09OX0ZPUl9GSVJFQkFTRSIsIkRJU0NPUkRfV0VCSE9PS19VUkwiLCJzZXJ2ZXJfdXJsIiwiZG90X2Vudl9wYXRoIiwiRkxZX0FQSV9UT0tFTiIsImRlcGxveV9jb21tYW5kIiwiZG9lc0NvbnRhaW5Eb2NrZXJmaWxlIiwiY2lfbGFiZWwiLCJnaXRodWJfaG9zdGVkX3J1bm5lciIsIm5ld1NlY3JldHMiLCJ5YW1sVGV4dCIsImR1bXAiLCJsaW5lV2lkdGgiLCJub0NvbXBhdE1vZGUiLCJzdHlsZXMiLCJmaXhUeXBvcyIsInBhY2thZ2VDb25maWciLCJkb2NGaWxlcyIsIm1kRmlsZSIsImZpeFR5cG9zSW5UZXh0IiwicmVwbGFjZVdpdGhDb25maWciLCJ0c0ZpbGVzIiwidHNGaWxlIiwiY29tbWVudCIsInRleHRCYXNlZEZpbGVzIiwiZmlsZSIsInByb21pc2VBbGwiLCJwcm9wTmFtZSIsImJlZm9yZSIsImFmdGVyIiwid2JmeUpzb24iLCJ0eXBvcyIsImdlbmVyYXRlQWdlbnRJbnN0cnVjdGlvbnMiLCJhbGxDb25maWdzIiwiYWdlbnRzRXh0cmFQYXRoIiwiZXh0cmFDb250ZW50IiwidG9vbE5hbWUiLCJnZW5lcmF0ZUFnZW50SW5zdHJ1Y3Rpb24iLCJjdXJzb3JSdWxlc1BhdGgiLCJjdXJzb3JSdWxlc0NvbnRlbnQiLCJmcm9udG1hdHRlciIsImJvZHkiLCJnZW5lcmF0ZUN1cnNvckdlbmVyYWxNZGNDb250ZW50IiwiYmFzZUNvbnRlbnQiLCJkZXNjcmlwdGlvbiIsImlzV2lsbEJvb3N0ZXJSZXBvIiwiYyIsImdlbmVyYXRlQWdlbnRDb2RpbmdTdHlsZSIsImhhc05ld1NlY3Rpb24iLCJnZW5JMThuVHMiLCJyZWFjdCIsIm5leHQiLCJnZW5lcmF0ZUJpb21lSnNvbmMiLCJyb290IiwiJHNjaGVtYSIsImV4dGVuZHMiLCJtaW5pbXVtUmVsZWFzZUFnZUV4Y2x1ZGVzIiwiZ2VuZXJhdGVCdW5maWdUb21sIiwiZXhpc3RpbmdDb250ZW50IiwicmVhZEZpbGVTeW5jIiwiYnVuZmlnVG9tbCIsInBhcnNlQnVuZmlnVG9tbCIsImJ1biIsImdlbmVyYXRlUnVuU2VjdGlvbiIsImluc3RhbGwiLCJleGFjdCIsInVzZXJDb250ZW50SGVhZGVyIiwidXNlckNvbnRlbnRIZWFkZXJSZWdleCIsImRlZmF1bHRIZWFkVXNlckNvbnRlbnQiLCJkZWZhdWx0VGFpbFVzZXJDb250ZW50IiwiaWdub3JlRmlsZVV0aWwiLCJzZXBhcmF0b3JQcmVmaXgiLCJyZWFkR2l0aWdub3JlV2l0aG91dFNlcGFyYXRvcnMiLCJsYXN0SGVhZGVySW5kZXgiLCJnZXRJbmRleE9mVGFpbFVzZXJDb250ZW50SGVhZGVyIiwiZ2V0SGVhZFVzZXJDb250ZW50IiwidGhpcyIsImdldFRhaWxVc2VyQ29udGVudCIsImlzQmVycnlaZXJvSW5zdGFsbEVuYWJsZWQiLCJsYXN0SW5kZXgiLCJsYXN0SW5kZXhPZiIsImdlbmVyYXRlRG9ja2VyaWdub3JlIiwiZXh0ZW5zaW9ucyIsImNvZGVXaXRoMkluZGVudFNpemUiLCJjb2RlV2l0aDRJbmRlbnRTaXplIiwibWFya2Rvd25MaWtlIiwiZXNsaW50IiwicHJldHRpZXIiLCJiaW9tZSIsImdlbmVyYXRlRXh0ZW5zaW9ucyIsImdlbmVyYXRlRWRpdG9yY29uZmlnIiwiZ2VuZXJhdGVFc2xpbnRyYyIsImVzbGludEJhc2UiLCJoYXZlX2Z1biIsImNvZGVfcmV2aWV3IiwiZGlzYWJsZSIsImNvbW1lbnRfc2V2ZXJpdHlfdGhyZXNob2xkIiwibWF4X3Jldmlld19jb21tZW50cyIsInB1bGxfcmVxdWVzdF9vcGVuZWQiLCJoZWxwIiwic3VtbWFyeSIsImlnbm9yZV9wYXR0ZXJucyIsImdlbmVyYXRlR2VtaW5pQ29uZmlnIiwiY29uZmlnRmlsZVBhdGgiLCJzdHlsZWd1aWRlRmlsZVBhdGgiLCJuZXdDb25maWciLCJvbGRDb25maWciLCJ5YW1sQ29udGVudCIsImNvZGluZ1J1bGVFeHRyYUNvbnRlbnQiLCJ0cmltU3RhcnQiLCJzdHlsZWd1aWRlQ29udGVudCIsInRyaW1FbmQiLCJyZW1vdmVHZW1pbmlTZXR0aW5ncyIsImdlbmVyYXRlR2l0YXR0cmlidXRlcyIsImRlZmF1bHROYW1lcyIsImdlbmVyYXRlR2l0aWdub3JlIiwiaGVhZFVzZXJDb250ZW50IiwidGFpbFVzZXJDb250ZW50IiwiZG9lc0NvbnRhaW5HZW1maWxlIiwiZG9lc0NvbnRhaW5Hb01vZCIsImRvZXNDb250YWluUGFja2FnZUpzb24iLCJkb2VzQ29udGFpblBvbVhtbCIsImRvZXNDb250YWluUHVic3BlY1lhbWwiLCJkb2VzQ29udGFpblRlbXBsYXRlWWFtbCIsImRvZXNDb250YWluUG9ldHJ5TG9jayIsImJsaXR6IiwiZmlyZWJhc2UiLCJwcmlzbWEiLCJwbGF5d3JpZ2h0VGVzdCIsInJlYWN0TmF0aXZlIiwic3Rvcnlib29rIiwibGl0ZXN0cmVhbSIsImdlbmVyYXRlZCIsInJlYWRDYWNoZSIsInJlc3BvbnNlIiwiZmV0Y2giLCJyZXNwb25zZVRleHQiLCJ0ZXh0Iiwib2siLCJ3cml0ZUNhY2hlIiwib3MiLCJob21lZGlyIiwiRGF0ZSIsIm5vdyIsIm10aW1lTXMiLCJnZW5lcmF0ZUlkZWFTZXR0aW5ncyIsImRvZXNDb250YWluSmF2YVNjcmlwdCIsImRvZXNDb250YWluSmF2YVNjcmlwdEluUGFja2FnZXMiLCJkb2VzQ29udGFpblR5cGVTY3JpcHQiLCJkb2VzQ29udGFpblR5cGVTY3JpcHRJblBhY2thZ2VzIiwiYmlvbWVDb250ZW50IiwicHJldHRpZXJDb250ZW50IiwiY3JlYXRlVGFza09wdGlvbnMiLCJydW5uZXIiLCJleHRlbnNpb24iLCJzcGF3blN5bmMiLCJyZXRyeSIsInNwYXduU3luY0FuZFJldHVyblN0YXR1cyIsInN0YXR1cyIsIm5ld0NtZCIsIm5ld0FyZ3MiLCJnZXRTcGF3blN5bmNBcmdzIiwiY2hpbGRfcHJvY2VzcyIsInNwYXduU3luY0FuZFJldHVyblN0ZG91dCIsInN0ZGlvIiwicHJvYyIsInRvU3RyaW5nIiwicyIsIm1lc3NhZ2UiLCJQQVRIIiwiQkVSUllfQklOX0ZPTERFUiIsImVuY29kaW5nIiwic2hlbGwiLCJFc2xpbnRVdGlsIiwiZ2V0TGludEZpeFN1ZmZpeCIsImRvZXNDb250YWluSnN4T3JUc3giLCJnaXRIdWJVdGlsIiwiZ2V0T3JnQW5kTmFtZSIsInVybE9yRnVsbE5hbWUiLCJ1cmxXaXRob3V0UHJvdG9jb2wiLCJvY3Rva2l0Q2FjaGUiLCJnZXRPY3Rva2l0Iiwib3duZXIiLCJjYWNoZWQiLCJvY3Rva2l0IiwiT2N0b2tpdCIsImF1dGgiLCJnZXRHaXRIdWJUb2tlbiIsImhhc0dpdEh1YlRva2VuIiwiR0hfQk9UX1BBVF9GT1JfV0lMTEJPT1NURVIiLCJHSF9CT1RfUEFUX0ZPUl9XSUxMQk9PU1RFUkxBQiIsIkdJVEhVQl9UT0tFTiIsInBpbm5lZERlcGVuZGVuY3lTcGVjaWZpZXJzIiwidHlwZXNjcmlwdCIsInNob3VsZFNraXBXaWxsYm9vc3RlckNvbmZpZ3NFc2xpbnRQYWNrYWdlIiwiaXNXaWxsQm9vc3RlckNvbmZpZ3MiLCJqc0NvbW1vbkRlcHMiLCJ0c0NvbW1vbkRlcHMiLCJyZWFjdENvbW1vbkRlcHMiLCJlc2xpbnREZXBzIiwiZ2VuZXJhdGVQYWNrYWdlSnNvbiIsInNraXBBZGRpbmdEZXBzIiwianNvbk9iaiIsImpzb25UZXh0IiwicGVlckRlcGVuZGVuY2llcyIsInJlYWRQYWNrYWdlSnNvbiIsImF1dGhvciIsInRzbGliIiwibGVybmEiLCJwaW5zdCIsInJlbW92ZURlcHJlY2F0ZWRTdHVmZiIsInJlbW92ZUxlZ2FjeUluc3RhbGxDb21tYW5kcyIsImdlbmVyYXRlU2NyaXB0cyIsIndiIiwiYWRkU3RhcnRUZXN0U2VydmVyU2NyaXB0SWZOZWVkZWQiLCJhZGRJbnN0YWxsU3RlcFRvQ2hlY2tGb3JBaSIsInByZXR0aWZ5Iiwib3JpZ2luYWxDb250ZW50IiwibmV3TGluZSIsImwiLCJnZW5lcmF0ZVByZXR0aWVyU3VmZml4Iiwibm9ybWFsaXplWWFybldvcmtzcGFjZUZvcmVhY2hTY3JpcHRzIiwidXBkYXRlU2NyaXB0cyIsImRlcGVuZGVuY3lVcGRhdGVzIiwicG9ldHJ5RGV2RGVwZW5kZW5jaWVzIiwiaHVza3kiLCJwb3N0aW5zdGFsbCIsInBvc3RwdWJsaXNoIiwicHJlcHVibGlzaE9ubHkiLCJwcmVwYWNrIiwicG9zdHBhY2siLCJwcmVwYXJlIiwidmVyc2lvbiIsImFydGlsbGVyeSIsInBsYXl3cmlnaHQiLCJ3b3Jrc3BhY2VzIiwid29ya3NwYWNlIiwiZ2xvYlN5bmMiLCJkb2VzQ29udGFpbkpzT3JUcyIsIm1pY3JvbWF0Y2giLCJnZXRUc2NvbmZpZ0Jhc2VEZXBlbmRlbmNpZXMiLCJqZXN0IiwiZGVwIiwiYXBwbHlQYWNrYWdlSnNvbkNvbnZlbnRpb25zIiwicHJpdmF0ZSIsImxpY2Vuc2UiLCJwdWJsaXNoQ29uZmlnIiwiYWNjZXNzIiwibWFpbiIsInJlc29sdXRpb25zIiwibGludCIsImRpcnMiLCJkaXIiLCJmb3JtYXQiLCJweXRob25GaWxlcyIsImRpck5hbWVTZXQiLCJweXRob25GaWxlIiwiZmlyc3QiLCJzZWNvbmQiLCJkaXJOYW1lc1N0ciIsImV4aXN0aW5nUmVwb3NpdG9yeSIsIm5vcm1hbGl6ZWRSZXBvc2l0b3J5Iiwibm9ybWFsaXplUmVwb3NpdG9yeVVybEZvclBhY2thZ2VKc29uIiwiYnVpbGROb3JtYWxpemVkUmVwb3NpdG9yeUZvclBhY2thZ2VKc29uIiwibm9ybWFsaXplZEV4aXN0aW5nUmVwb3NpdG9yeSIsImZvcm1hdFJlcG9zaXRvcnlGb3JQYWNrYWdlSnNvbiIsIm5vcm1hbGl6ZVBhY2thZ2VNZXRhZGF0YSIsInBhY2thZ2VKc29uRGVwZW5kZW5jaWVzIiwicGFja2FnZUpzb25EZXZEZXBlbmRlbmNpZXMiLCJhZGRQYWNrYWdlSnNvbkRlcGVuZGVuY2llcyIsImFkZERlcGVuZGVuY3lWZXJzaW9uc1RvUGFja2FnZUpzb24iLCJwYWNrYWdlTmFtZXMiLCJwcml2YXRlUGFja2FnZXMiLCJyZXBvIiwiaXNXb3Jrc3BhY2VQYWNrYWdlIiwib3RoZXJUYXJnZXQiLCJSZWZsZWN0IiwiZGVsZXRlUHJvcGVydHkiLCJjb21taXRIYXNoIiwib3JnYW5pemF0aW9uIiwicmVqZWN0IiwiZ2V0TGF0ZXN0Q29tbWl0SGFzaCIsImdldExhdGVzdFByaXZhdGVQYWNrYWdlU3BlY2lmaWVyIiwidXBkYXRlUHJpdmF0ZVBhY2thZ2VzIiwic2VjdGlvbiIsInJlbW92ZUVtcHR5RGVwZW5kZW5jeVNlY3Rpb25zIiwib2xkQW5kTmV3U2NyaXB0TmFtZXMiLCJvbGROYW1lIiwibmV3TmFtZSIsIm9sZFNjcmlwdCIsInJlcGxhY2VTY3JpcHROYW1lc0luVGV4dCIsImZpbGVzIiwiZml4U2NyaXB0TmFtZXMiLCJpbnN0YWxsTnBtRGVwZW5kZW5jaWVzIiwiaW5zdGFsbERlcGVuZGVuY3lVcGRhdGVzIiwiY29yZSIsImRldiIsImRlcGVuZGVuY3lTcGVjaWZpZXJzIiwiZ2V0RGVwZW5kZW5jeVNwZWNpZmllciIsInVuaXF1ZURlcGVuZGVuY2llcyIsImdldFBhY2thZ2VKc29uRGVwZW5kZW5jeVZlcnNpb24iLCJkZXBlbmRlbmN5U3BlY2lmaWVyIiwidmVyc2lvblNlcGFyYXRvckluZGV4IiwiZ2V0UGlubmVkRGVwZW5kZW5jeVNwZWNpZmllciIsInJlcG9zaXRvcnlVcmwiLCJtYXRjaGVkIiwiZXhlYyIsIm5vcm1hbGl6ZWRVcmwiLCJvbGRTY3JpcHRzIiwiaGFzVHlwZWNoZWNrIiwiY2xlYW51cCIsInR5cGVjaGVjayIsIm9sZFRlc3QiLCJweXJpZ2h0IiwibmV3VGV4dCIsIlJlZ0V4cCIsInJhdyIsImVzY2FwZVJlZ0V4cCIsImJhc2VTZXR0aW5ncyIsInByZUNvbW1pdFNldHRpbmdzIiwiY29tbWFuZHMiLCJnZW5lcmF0ZUxlZnRob29rVXBkYXRpbmdQYWNrYWdlSnNvbiIsImh1c2t5RGlyUGF0aCIsImhhc0h1c2t5RGlyIiwic2V0dGluZ3MiLCJnZXRDbGVhbnVwR2xvYnMiLCJnZXRDbGVhbnVwQ29tbWFuZCIsInByZVB1c2giLCJ0eXBlY2hlY2tDb21tYW5kIiwiZ2V0UHJlUHVzaFNjcmlwdCIsIm1rZGlyU3luYyIsIm1vZGUiLCJwb3N0TWVyZ2VDb21tYW5kIiwicG9zdE1lcmdlQ29tbWFuZHMiLCJoYXNWZXJzaW9uU2V0dGluZ3MiLCJ0b29sc0NoYW5nZWRQYXR0ZXJuIiwiaW5zdGFsbENvbW1hbmQiLCJybU5leHREaXJlY3RvcnkiLCJnZW5lcmF0ZVBvc3RNZXJnZUNvbW1hbmRzIiwic3VwcG9ydGVkRXh0ZW5zaW9ucyIsImxvY2FsV2JQYWNrYWdlSnNvblBhdGgiLCJoYXNMb2NhbFdiV29ya3NwYWNlIiwiZXNsaW50UnVsZVN1ZmZpeCIsImRvZXNDb250YWluSnN4T3JUc3hJblBhY2thZ2VzIiwiZXNsaW50UGF0dGVybiIsImdlbmVyYXRlTGludHN0YWdlZHJjIiwiZ2VuZXJhdGVQcmV0dGllcmlnbm9yZSIsImdpdGlnbm9yZUZpbGVQYXRoIiwiZ2l0aWdub3JlQ29udGVudCIsImFkZGl0aW9uYWxDb250ZW50IiwidmVudlBhdGgiLCJ2ZW52IiwiZ2VuZXJhdGVQeXJpZ2h0Q29uZmlnSnNvbiIsImdlbmVyYXRlUmVhZG1lIiwiaW5zZXJ0QmFkZ2UiLCJmaWxlTmFtZXMiLCJyZWFkZGlyU3luYyIsImJhZGdlTmFtZSIsInRvVXBwZXJDYXNlIiwicmVhZG1lIiwiaSIsImdlbmVyYXRlUmVsZWFzZXJjIiwicGx1Z2lucyIsInBsdWdpbkVudHJ5IiwicGx1Z2luIiwicHJlc2V0Iiwic3VjY2Vzc0NvbW1lbnRDb25kaXRpb24iLCJmYWlsQ29tbWVudENvbmRpdGlvbiIsImxhYmVscyIsInJlbGVhc2VkTGFiZWxzIiwiZ2VuZXJhdGVSZW5vdmF0ZUpzb24iLCJwYWNrYWdlUnVsZXMiLCJydWxlIiwibWF0Y2hQYWNrYWdlTmFtZXMiLCJlbmFibGVkIiwiaW5zdGFsbEFnZW50U2tpbGxzIiwic3JjRGlyZWN0b3JpZXMiLCJnZXRTcmNEaXJzIiwicm9vdEpzb25PYmoiLCJjb21waWxlck9wdGlvbnMiLCJhbHdheXNTdHJpY3QiLCJub1VuY2hlY2tlZEluZGV4ZWRBY2Nlc3MiLCJhbGxvd1N5bnRoZXRpY0RlZmF1bHRJbXBvcnRzIiwiZXNNb2R1bGVJbnRlcm9wIiwicmVzb2x2ZUpzb25Nb2R1bGUiLCJkZWNsYXJhdGlvbiIsInNvdXJjZU1hcCIsImltcG9ydEhlbHBlcnMiLCJub0VtaXQiLCJvdXREaXIiLCJleGNsdWRlIiwiaW5jbHVkZSIsInN1Ykpzb25PYmoiLCJnZW5lcmF0ZVRzY29uZmlnIiwiZ2VuZXJhdGVkUm9vdERpciIsInJvb3REaXJDYW5kaWRhdGVzIiwiZ2V0Um9vdERpckNhbmRpZGF0ZXMiLCJleGlzdGluZ0luY2x1ZGVkRGlycyIsImV4aXN0aW5nUm9vdFNvdXJjZURpcnMiLCJnZXRHZW5lcmF0ZWRSb290RGlyIiwiZ2VuZXJhdGVkVHlwZXMiLCJ0eXBlTmFtZXMiLCJ2aXRlc3QiLCJtb2NoYSIsImN5cHJlc3MiLCJnZXRHZW5lcmF0ZWRUeXBlcyIsImdldFRzY29uZmlnRXh0ZW5kcyIsInJvb3REaXIiLCJqc3giLCJleGlzdGluZ1Jvb3REaXIiLCJleGlzdGluZ1R5cGVzIiwiZ2VuZXJhdGVkRXh0ZW5kcyIsImV4aXN0aW5nRXh0ZW5kcyIsIm1lcmdlZEV4dGVuZHMiLCJub3JtYWxpemVFeHRlbmRzIiwidW5pcXVlRXh0ZW5kcyIsIm1lcmdlVHNjb25maWdFeHRlbmRzIiwic2hvdWxkUmVwbGFjZUV4aXN0aW5nUm9vdERpciIsIm1lcmdlZFR5cGVzIiwidHlwZU5hbWUiLCJ0eXBlUm9vdHMiLCJleHBlcmltZW50YWxEZWNvcmF0b3JzIiwidmVyYmF0aW1Nb2R1bGVTeW50YXgiLCJleGNsdWRlRmlsZVBhdHRlcm5zIiwiZ2VuZXJhdGVWc2NvZGVTZXR0aW5ncyIsImV4Y2x1ZGVGaWxlUGF0dGVybiIsImV4Y2x1ZGVTZXR0aW5nIiwiZ2VuZXJhdGVZYXJucmNZbWwiLCJ5YXJucmNZbWxQYXRoIiwiY3VycmVudFZlcnNpb24iLCJsYXRlc3RWZXJzaW9uIiwiZ2V0TGF0ZXN0VmVyc2lvbiIsIm5ld1ZlcnNpb24iLCJvbGRWZXJzaW9uIiwidmFsaWROZXdWZXJzaW9uIiwic2VtdmVyIiwidmFsaWQiLCJndCIsImlzTmV3ZXJWZXJzaW9uIiwicmVsZWFzZXNQYXRoIiwieWFybnJjUGF0aCIsImRlZmF1bHRTZW12ZXJSYW5nZVByZWZpeCIsIm5vZGVMaW5rZXIiLCJubU1vZGUiLCJucG1NaW5pbWFsQWdlR2F0ZSIsIm5wbVByZWFwcHJvdmVkUGFja2FnZXMiLCJjb21wcmVzc2lvbkxldmVsIiwiaW5qZWN0RW52aXJvbm1lbnRGaWxlcyIsImVuYWJsZUdsb2JhbENhY2hlIiwib3JpZ2luYWxMZW5ndGgiLCJwbHVnaW5QYXRoIiwic2V0dXBMYWJlbHMiLCJzZXR1cExhYmVsIiwiZGVsZXRlTGFiZWwiLCJ3YXJuIiwiY29sb3IiLCJyZXF1ZXN0IiwiREVQUkVDQVRFRF9TRUNSRVRfTkFNRVMiLCJzZXR1cFNlY3JldHMiLCJkb3RlbnYiLCJzZWNyZXROYW1lIiwic2VjcmV0X25hbWUiLCJrZXlfaWQiLCJrZXlJZCIsImRhdGEiLCJzb2RpdW0iLCJyZWFkeSIsInNlY3JldCIsInJhd0tleSIsImZyb21fYmFzZTY0IiwiYmFzZTY0X3ZhcmlhbnRzIiwiT1JJR0lOQUwiLCJyYXdTZWMiLCJmcm9tX3N0cmluZyIsImVuY0J5dGVzIiwiY3J5cHRvX2JveF9zZWFsIiwiZW5jQmFzZTY0IiwidG9fYmFzZTY0IiwiZW5jcnlwdGVkX3ZhbHVlIiwic2V0dXBHaXRIdWJTZXR0aW5ncyIsImJlZm9yZVJldHJ5IiwiaGFuZGxlRXJyb3IiLCJyZXRyeUNvdW50IiwicmV0cnlMb2dnZXIiLCJzaG91bGRSZXRyeSIsInNsZWVwTWlsbGlzZWNvbmRzIiwidXBkYXRlU2xlZXBNaWxsaXNlY29uZHMiLCJmYWlsZWRDb3VudCIsIndpdGhSZXRyeSIsImFsbG93X2F1dG9fbWVyZ2UiLCJhbGxvd19tZXJnZV9jb21taXQiLCJhbGxvd19zcXVhc2hfbWVyZ2UiLCJhbGxvd19yZWJhc2VfbWVyZ2UiLCJhbGxvd191cGRhdGVfYnJhbmNoIiwiZGVsZXRlX2JyYW5jaF9vbl9tZXJnZSIsInNxdWFzaF9tZXJnZV9jb21taXRfdGl0bGUiLCJzcXVhc2hfbWVyZ2VfY29tbWl0X21lc3NhZ2UiLCJoZWFkZXJzIiwicGFja2FnZU1hbmFnZXJSdW5QbGFjZWhvbGRlciIsInRlbXBsYXRlcyIsImdlbmVyYXRlR2l0SHViVGVtcGxhdGVzIiwiYXBwbHlQYWNrYWdlTWFuYWdlclRlbXBsYXRlIiwiZGlzdGFuY2UiLCJ0ZW1wbGF0ZSIsInBhY2thZ2VNYW5hZ2VyQ29tbWFuZCIsIndiZnlKc29uU2NoZW1hIiwieiIsInJlY29yZCIsIm9wdGlvbmFsIiwiZG9jIiwiZ2V0UGFja2FnZUNvbmZpZyIsImVzbVBhY2thZ2UiLCJwYWNrYWdlSnNvblRleHQiLCJyZWxlYXNlQnJhbmNoZXMiLCJyZWxlYXNlUGx1Z2lucyIsInJlbGVhc2VyY0pzb25QYXRoIiwiZnNwIiwiZmxhdCIsInJlcG9JbmZvIiwiZ2l0Iiwic2ltcGxlR2l0Iiwib3JpZ2luIiwiZ2V0UmVtb3RlcyIsInJlbW90ZVVybCIsInJlZnMiLCJyZXF1ZXN0UmVwb0luZm8iLCJmZXRjaFJlcG9JbmZvIiwiY3VycmVudCIsImhhc1ZlcnNpb25TZXR0aW5nc0ZpbGUiLCJkb2NrZXJmaWxlIiwid2JmeUpzb25QYXRoIiwid2JmeUpzb25UZXh0IiwicmVwb0Z1bGxOYW1lIiwiZnVsbF9uYW1lIiwicmVwb0F1dGhvciIsInJlcG9OYW1lIiwicmVwb1BhcnRzIiwiaXNSZWZlcnJlZEJ5T3RoZXJSZXBvIiwiaXNFc21QYWNrYWdlIiwiY29udGFpbnNBbnkiLCJkb2VzQ29udGFpblZzY29kZVNldHRpbmdzSnNvbiIsImdpdGh1YiIsImdldEVzbGludEV4dGVuc2lvbkJhc2UiLCJwYXR0ZXJuIiwib3JnIiwicmV0IiwiYXNzaWduIiwicmVkaXJlY3RlZEZ1bGxOYW1lIiwibG9jYXRpb24iLCJnZXRSZWRpcmVjdGVkUmVwb0Z1bGxOYW1lIiwicmVmcmVzaEJ1bkxvY2siLCJyb290RGlyUGF0aCIsImxvY2tGaWxlUGF0aCIsImJhY2t1cExvY2tGaWxlUGF0aCIsInJtU3luYyIsImNvcHlGaWxlU3luYyIsImFyZ3YiLCJ5YXJncyIsInBvc2l0aW9uYWwiLCJkZXNjcmliZSIsImRlZmF1bHQiLCJhbGlhcyIsInNraXBEZXBzIiwidmVyYm9zZSIsInBhY2thZ2VKc29uRGlyIiwiVVJMIiwicGF0aG5hbWUiLCJnZXRWZXJzaW9uIiwic3RyaWN0IiwicGFja2FnZXNEaXJQYXRoIiwic3ViRGlyUGF0aHMiLCJkIiwiYWJicmV2aWF0aW9uUHJvbWlzZSIsInN1YlBhY2thZ2VDb25maWdzIiwic3ViRGlyUGF0aCIsImFsbFBhY2thZ2VDb25maWdzIiwic2hvdWxkUnVuV29ya2Zsb3dzIiwidGhlbiJdLCJtYXBwaW5ncyI6ImlyQkFBT0EsZUFBZUMsRUFBTUMsR0FDMUIsT0FBTyxJQUFJQyxRQUFTQyxHQUFNQyxXQUFXRCxFQUFHRixHQUMxQyxDQ2lDT0YsZUFBZU0sRUFBb0JDLEdBQ3hDLElBQ0UsYUFBYUEsR0FDZixDQUFFLE1BQ0EsQ0FFSixDQUVPUCxlQUFlUSxFQUFxQkQsR0FDekMsSUFDRSxhQUFhQSxHQUNmLENBQUUsTUFBT0UsR0FDUCxHQUFxQixpQkFBVkEsR0FBc0JBLEdBQVMsU0FBVUEsR0FBd0IsV0FBZkEsRUFBTUMsS0FDakUsT0FFRixNQUFNRCxDQUNSLENBQ0YsQ0MvQ08sTUFBTUUsRUFBVSxJQUx2QixNQUNFQyxXQUFZLEVBQ1pDLG1CQUFvQixHQ2dCZixNQUFNQyxFQUFTLElBaEJ0QixNQUNFLCtCQUFNQyxDQUEwQkMsRUFBY0MsR0FDeENOLEVBQVFDLFdBQ1ZNLFFBQVFDLEtBQUssYUFBYUgscUJBRTVCLFVBQ1FDLEdBQ1IsQ0FBRSxNQUFPUixHQUNQUyxRQUFRQyxLQUFLLHFCQUFx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cUIsQ0FBQ3ptQixHQUFrQkMsSUFBZSxHQUMzRDJlLEdBQVkzZSxHQUNaa2YsR0FBYWxmLEdBQ2J1Z0IsR0FBb0J2Z0IsR0FDcEJ5VyxHQUFvQ3pXLEdBQ3BDaVksR0FBcUJqWSxXQUVqQjlaLEVBQVlnZSxhQUVsQixNQUFNM2UsRUFBNEIsR0FDbEMsSUFBSyxNQUFNYyxLQUFVa2dDLEVBQ2Y3WCxHQUEwQ3JvQixNQUcxQ0EsRUFBT3VsQix1QkFBeUJ2bEIsRUFBT3dsQixrQ0FDekN0bUIsRUFBU29ELEtBQUtrVSxHQUFtQnhXLEVBQVFBLEVBQU80VyxPQUFTc3BCLEVBQW9CLENBQUNsZ0MsS0FFNUVBLEVBQU9rYSxVQUFVaUssZ0JBQ25CamxCLEVBQVNvRCxLQUFLeUMsRUFBb0IvRSxJQUVoQ0EsRUFBT2thLFVBQVVvRixNQUNuQnBnQixFQUFTb0QsS0FBS3ZDLEVBQWtCQyxVQUU1QnNqQixHQUFrQnRqQixFQUFRMlosU0FDMUI5WixFQUFZZ2UsY0FDYjdkLEVBQU80VyxRQUFXNVcsRUFBTzJqQixnQ0FHeEJrTyxHQUF1Qjd4QixTQUN2QjJvQixHQUFvQjNvQixFQUFRMlosRUFBWW9sQixFQUFLTSxVQUVuRG5nQyxFQUFTb0QsS0FBS3N2QixHQUFxQjV4QixJQUMvQkEsRUFBTys5QiwrQkFBaUMvOUIsRUFBTzJqQix3QkFDakR6a0IsRUFBU29ELEtBQUtxMEIsR0FBdUIzMkIsS0FFbkNBLEVBQU91bEIsdUJBQXlCdmxCLEVBQU93bEIsa0NBQ3pDdG1CLEVBQVNvRCxLQUFLc3lCLEdBQWlCNTBCLEtBRy9CQSxFQUFPcWxCLHVCQUNQcmxCLEVBQU9zbEIsaUNBQ1B0bEIsRUFBT3VsQix1QkFDUHZsQixFQUFPd2xCLG1DQUVIN0wsRUFBV3JULE9BQ2JwSCxFQUFTb0QsS0FBS2lkLEdBQW1CdmYsSUFFOUIyWixFQUFXMk8sc0JBQ2RwcEIsRUFBU29ELEtBQUt3ZixHQUFpQjloQixLQUcvQkEsRUFBT2thLFVBQVUwVixTQUNuQjF3QixFQUFTb0QsS0FBSzZ2QixHQUEwQm55QixZQUd0Q3RDLFFBQVF5WCxJQUFJalcsU0FDWlcsRUFBWWdlLGFBRWxCLE1BQU1oTixFQUFpQjhJLEVBQVdyVCxNQUFRLE1BQVEsT0FFOUNxVCxFQUFXclQsWUFDUGpJLEVBQU9DLDBCQUEwQixpQkFBa0JmLGdCQUNqREcsUUFBUXlDLFVBQ2RzK0IsR0FBZUMsS0FHakI1WSxHQUFValYsRUFBZ0IsQ0FBQyxVQUFXLGtCQUFtQjZ0QixHQUUzRDVZLEdBQVVqVixFQUFnQixDQUFDLFdBQVk2dEIsU0FFakNoTCxHQUFtQi9aLEVBQzNCLENBQ0YsQ0FxQ01nUyIsInhfZ29vZ2xlX2lnbm9yZUxpc3QiOlsxMCwxMSwxMiwxMywxNF19
|