@willbooster/wbfy 1.7.7 → 1.7.9
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 +6 -6
- package/package.json +2 -2
package/dist/index.js
CHANGED
|
@@ -1,13 +1,13 @@
|
|
|
1
|
-
import e from"node:fs";import t from"node:path";import n from"yargs";import i from"typescript";import{PromisePool as r}from"minimal-promise-pool";import s from"node:fs/promises";import o from"fast-glob";import a from"semver/functions/compare.js";import c from"semver/ranges/min-version.js";import l from"deepmerge";import p from"js-yaml";import{parse as d}from"smol-toml";import u from"node:os";import f from"node:child_process";import{fileURLToPath as g}from"node:url";import m from"semver";import{Octokit as y}from"@octokit/core";import{createRequire as h}from"node:module";import w from"dotenv";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,i){await e.promises.mkdir(t.dirname(n),{recursive:!0});let r=i.trim();r&&(r+="\n"),await e.promises.writeFile(n,r)}},C=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 s=await e.promises.readFile(r,"utf8"),o=function(e){const t=i.createSourceFile("next.config.js",e,i.ScriptTarget.Latest,!0,i.ScriptKind.JS);let n;const r=e=>{n||(i.isExportAssignment(e)&&i.isObjectLiteralExpression(e.expression)?n=e.expression:i.isBinaryExpression(e)&&e.operatorToken.kind===i.SyntaxKind.EqualsToken&&"module.exports"===e.left.getText(t)&&i.isObjectLiteralExpression(e.right)?n=e.right:i.forEachChild(e,r))};return r(t),n}(s);if(!o)return;const a=[];if(new Set(o.properties.map(e=>e.name?.getText())).has("typescript")||a.push("typescript: { ignoreBuildErrors: true }"),0===a.length)return;const c=o.getEnd()-1,l=o.properties.at(-1),p=!!l&&s.slice(l.getEnd(),c).includes(","),d=o.properties.length>0&&!p?", ":"",u=`${s.slice(0,c)}${d}${a.join(", ")}${s.slice(c)}`;await C.run(()=>P.generateFile(r,u))})}function O(e){return e.doesContainJavaScript||e.doesContainJavaScriptInPackages||e.doesContainTypeScript||e.doesContainTypeScriptInPackages}function B(e){return e.doesContainJava||e.doesContainJavaInPackages}function A(e){return e.isBun?"bun":"yarn"}const F=e=>({kind:"literal",value:e}),R=(e,t=[])=>({kind:"object",value:I(e,t)});function I(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 D(n){const r=t.resolve(n.dirPath,"playwright.config.ts");if(e.existsSync(r))return _.functionIgnoringException("fixPlaywrightConfig",async()=>{await async function(n){for(const i of function(n){const i=[".env",".env.test",".env.example","mise.toml","mise.test.toml"],r=[];for(let s=t.resolve(n);r.push(...i.map(e=>t.resolve(s,e))),!e.existsSync(t.resolve(s,".git"));s=t.dirname(s)){if(t.dirname(s)===s)break}return r}(n))try{const t=await e.promises.readFile(i,"utf8");if(/NEXT_PUBLIC_BASE_URL\s*=/m.test(t))return}catch{}throw new Error("NEXT_PUBLIC_BASE_URL is required for Playwright. Define NEXT_PUBLIC_BASE_URL in the target repo.")}(n.dirPath);const s=await e.promises.readFile(r,"utf8"),o=function(e){const t=i.createSourceFile("playwright.config.ts",e,i.ScriptTarget.Latest,!0,i.ScriptKind.TS);let n;const r=e=>{if(!n){if(i.isCallExpression(e)&&"defineConfig"===e.expression.getText(t)){const t=e.arguments[0];if(t&&i.isObjectLiteralExpression(t))return void(n=t)}i.forEachChild(e,r)}};return r(t),n?{source:t,node:n}:void 0}(s);if(!o)return;const a=M(o.node,o.source);if(!a)return;const c=T((e=>I({forbidOnly:F("!!process.env.CI"),retries:F("process.env.PWDEBUG ? 0 : process.env.CI ? 5 : 1"),use:R({baseURL:F("process.env.NEXT_PUBLIC_BASE_URL"),trace:F("process.env.CI ? 'on-first-retry' : 'retain-on-failure'"),screenshot:F("process.env.CI ? 'only-on-failure' : 'on'"),video:F("process.env.CI ? 'on-first-retry' : 'retain-on-failure'")}),webServer:R({command:F(N(e)),url:F("process.env.NEXT_PUBLIC_BASE_URL"),reuseExistingServer:F("!!process.env.CI"),timeout:F("300_000"),stdout:F("'pipe'"),stderr:F("'pipe'"),env:F("{\n ...process.env,\n PRISMA_USER_CONSENT_FOR_DANGEROUS_AI_ACTION: 'true',\n}"),gracefulShutdown:F("{\n signal: 'SIGTERM',\n timeout: 500,\n}")})}))(n),a);!function(e,t){const n=e.properties.webServer;if("object"!==n?.kind)return;n.value.properties.command=F(N(t))}(c,n);const l=J({kind:"object",value:c},0),p=o.node.getStart(o.source),d=o.node.getEnd(),u=`${s.slice(0,p)}${l}${s.slice(d)}`;await C.run(()=>P.generateFile(r,u))})}function T(e,t){const n=new Set(Object.keys(t.properties)),i=[...e.extraMembers,...t.extraMembers],r=[...e.memberOrder.filter(e=>"property"!==e.kind||!n.has(e.key)),...t.memberOrder.map(t=>"property"===t.kind?t:{kind:"extra",index:e.extraMembers.length+t.index})],s={...e.properties};for(const[e,n]of Object.entries(t.properties))s[e]=W(s[e],n);return{extraMembers:i,memberOrder:r,properties:s}}function W(e,t){return"object"===e?.kind&&"object"===t.kind?{kind:"object",value:T(e.value,t.value)}:t}function N(e){return`'${A(e)} wb start --mode test'`}function L(e,t){if(i.isObjectLiteralExpression(e)){const n=M(e,t);return n?{kind:"object",value:n}:F(e.getText(t))}if(i.isArrayLiteralExpression(e)){const n=e.elements.map(e=>L(e,t));return n.some(e=>void 0===e)?F(e.getText(t)):{kind:"array",value:n}}return F(e.getText(t))}function M(e,t){const n={extraMembers:[],memberOrder:[],properties:{}};for(const r of e.properties){if(i.isShorthandPropertyAssignment(r)){const e=r.name.getText(t);n.properties[e]=F(e),n.memberOrder.push({kind:"property",key:e});continue}if(!i.isPropertyAssignment(r)||!i.isIdentifier(r.name)&&!i.isStringLiteral(r.name)){const e=n.extraMembers.push(r.getText(t))-1;n.memberOrder.push({kind:"extra",index:e});continue}const e=L(r.initializer,t);if(void 0===e)return;const s=r.name.getText(t);n.properties[s]=e,n.memberOrder.push({kind:"property",key:s})}return n}function J(e,t){const n=" ".repeat(t);if("array"===e.kind){if(0===e.value.length)return"[]";const i=" ".repeat(t+1);return`[\n${e.value.map(e=>{const n=J(e,t+1).split("\n");if(n[n.length-1]=`${n.at(-1)},`,"literal"===e.kind)for(let e=1;e<n.length;e+=1)n[e]=`${i}${n[e]}`;return n[0]=`${i}${n[0]}`,n.join("\n")}).join("\n")}\n${n}]`}if("literal"===e.kind)return e.value;const i=" ".repeat(t+1),r=new Set,s=function(e){const t=new Map;for(const[n,i]of e.entries())"property"===i.kind&&t.set(i.key,n);return t}(e.value.memberOrder),o=e.value.memberOrder.flatMap((n,o)=>{if("extra"===n.kind)return[z(e.value.extraMembers[n.index]??"",i)];if(s.get(n.key)!==o)return[];const a=e.value.properties[n.key];return!a||r.has(n.key)?[]:(r.add(n.key),[U(n.key,a,t,i)])});return o.push(...Object.entries(e.value.properties).filter(([e])=>!r.has(e)).map(([e,n])=>U(e,n,t,i))),0===o.length?`{\n${n}}`:`{\n${o.join("\n")}\n${n}}`}function U(e,t,n,i){const r=J(t,n+1).split("\n");if(r[r.length-1]=`${r.at(-1)},`,"literal"===t.kind)for(let e=1;e<r.length;e+=1)r[e]=`${i}${r[e]}`;return r[0]=`${i}${e}: ${r[0]}`,r.join("\n")}function z(e,t){const n=e.split("\n");n[n.length-1]=`${n.at(-1)},`;for(const[e,i]of n.entries())n[e]=`${t}${i}`;return n.join("\n")}const G=["**/node_modules/**","**/.venv/**","**/test-fixtures/**","**/test/fixtures/**","**/dist/**","**/build/**","**/target/**","**/temp/**","**/tmp/**"];async function q(e){return _.functionIgnoringException("fixPrismaEnvFiles",async()=>{const n=function(e){if(!e.depending.prisma)return!1;const t={...e.packageJson?.dependencies,...e.packageJson?.devDependencies};return!t["@prisma/adapter-better-sqlite3"]&&!t["@prisma/adapter-libsql"]}(e),i=await o.glob(["*.env","*.env.*"],{dot:!0,cwd:e.dirPath,ignore:G});for(const r of i){const i=t.resolve(e.dirPath,r),o=await s.readFile(i,"utf8"),a=o.replaceAll(/DATABASE_URL\s*=\s*"?([^"#\n]+?\.sqlite3[^"#\n]*)"?/g,(e,t)=>`DATABASE_URL="${H(t,n)}"`);a!==o&&await s.writeFile(i,a)}})}function H(e,t){const n=e.indexOf("?"),i=-1!==n?e.slice(0,n):e,r=-1!==n?e.slice(n+1):"",s=new URLSearchParams(r);s.delete("connection_limit"),t&&s.set("connection_limit","1");const o=s.toString();return o?`${i}?${o}`:i}const Y=(e,t)=>Object.prototype.hasOwnProperty.call(e,t);function K(e,t){let n,i,r;"function"==typeof t?i=t:n=t;const s={},o=[...n??[],...Object.keys(e).sort(i)];for(r of o)Y(e,r)&&(s[r]=e[r]);return s}const V=/^(?:( )+|\t+)/,X="space";function Z(e,t,n){return e&&t===X&&1===n}function Q(e,t){const n=new Map;let i,r,s=0;for(const o of e.split(/\n/g)){if(!o)continue;const e=o.match(V);if(null===e)s=0,i="";else{const o=e[0].length,a=e[1]?X:"tab";if(Z(t,a,o))continue;a!==i&&(s=0),i=a;let c=1,l=0;const p=o-s;if(s=o,0===p)c=0,l=1;else{const e=Math.abs(p);if(Z(t,a,e))continue;r=ee(a,e)}const d=n.get(r);n.set(r,void 0===d?[1,0]:[d[0]+c,d[1]+l])}}return n}function ee(e,t){return(e===X?"s":"t")+String(t)}function te(e){if("string"!=typeof e)throw new TypeError("Expected a string");let t=Q(e,!0);0===t.size&&(t=Q(e,!1));const n=function(e){let t,n=0,i=0;for(const[r,[s,o]]of e)(s>n||s===n&&o>i)&&(n=s,i=o,t=r);return t}(t);let i,r=0,s="";var o;return void 0!==n&&(({type:i,amount:r}={type:"s"===(o=n)[0]?X:"tab",amount:Number(o.slice(1))}),s=function(e,t){return(e===X?" ":"\t").repeat(t)}(i,r)),{amount:r,type:i,indent:s}}function ne(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 ie=e=>(t,...n)=>e.reduce((e,t)=>t(e,...n),t),re=e=>t=>Array.isArray(t)?e(t):t,se=e=>t=>Array.isArray(t)&&t.every(e=>"string"==typeof e)?e(t):t,oe=se(e=>[...new Set(e)]),ae=se(e=>e.toSorted()),ce=ie([oe,ae]),le=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,pe=(e,t)=>{const n=le(i=>(t&&(i=Object.fromEntries(Object.entries(i).map(([e,t])=>[e,n(t)]))),K(i,e)));return n},de=Object.groupBy||((e,t)=>{const n=Object.create(null);for(const i of e){const e=t(i);n[e]?n[e].push(i):n[e]=[i]}return n}),ue=pe(),fe=pe(["type","url"]),ge=pe(["name","email","url"]),me=pe(["lib","bin","man","doc","example","test"]),ye=(e,t)=>le((n,...i)=>Object.hasOwn(n,e)?{...n,[e]:t(n[e],...i)}:n),he=pe(["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"]),we=e=>{const[t]=e.split(">"),n=[...t.matchAll("@")];if(!n.length||1===n.length&&0===n[0].index)return{name:e};const i=n.pop().index;return{name:t.substring(0,i),range:t.substring(i+1)}},be=pe((e,t)=>{const{name:n,range:i}=we(e),{name:r,range:s}=we(t);return n!==r?n.localeCompare(r,"en"):i?s?a(c(i),c(s)):1:-1}),ve=e=>{const t=e.indexOf("@",e.startsWith("@")?1:0);return-1===t?e:e.slice(0,t)},ke=new Map;function xe(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 ke.has(t)||ke.set(t,e.existsSync("yarn.lock")||e.existsSync(".yarn/")||e.existsSync(".yarnrc.yml")||e.existsSync("pnpm-lock.yaml")||e.existsSync("pnpm-workspace.yaml")),ke.get(t)})())}const je=le((e,t)=>Object.keys(e).length<2?e:xe(t)?K(e,(e,t)=>e.localeCompare(t,"en")):K(e)),$e=ie([pe(["packages","catalog"]),ye("packages",ce),ye("catalog",je)]),Se=ie([pe(["files","excludedFiles","env","parser","parserOptions","settings","plugins","extends","rules","overrides","globals","processor","noInlineConfig","reportUnusedDisableDirectives"]),ye("env",ue),ye("globals",ue),ye("overrides",re(e=>e.map(Se))),ye("parserOptions",ue),ye("rules",pe((e,t)=>e.split("/").length-t.split("/").length||e.localeCompare(t))),ye("settings",ue)]),_e=pe(["description","url","href"]),Pe=ie([le(e=>K(e,[...Object.keys(e).filter(e=>"overrides"!==e).sort(),"overrides"])),ye("overrides",re(e=>e.map(ie([ue,ye("options",ue)]))))]),Ce=pe(["node","npm","yarn"]),Ee=ye("packageManager",pe(["name","version","onFail"])),Oe=ie([pe(["peerDependencyRules","neverBuiltDependencies","onlyBuiltDependencies","onlyBuiltDependenciesFile","allowedDeprecatedVersions","allowNonAppliedPatches","updateConfig","auditConfig","requiredScripts","supportedArchitectures","overrides","patchedDependencies","packageExtensions"],!0),ye("overrides",be)]),Be=new Set(["install","pack","prepare","publish","restart","shrinkwrap","start","stop","test","uninstall","version"]),Ae=(e,t)=>Object.hasOwn(t,"devDependencies")&&Object.hasOwn(t.devDependencies,e),Fe=/(?<=^|[\s&;<>|(])(?:run-s|npm-run-all2? .*(?:--sequential|--serial|-s))(?=$|[\s&;<>|)])/,Re=e=>{if(!Ae("npm-run-all",e)&&!Ae("npm-run-all2",e))return!1;return["scripts","betterScripts"].flatMap(t=>e[t]?Object.values(e[t]):[]).some(e=>{return(t=e).includes("*")&&Fe.test(t);var t})};function Ie(e,t=""){const n=new Map;for(const i of e){const e=(t?i.slice(t.length+1):i).indexOf(":");if(e>0){const r=i.slice(0,(t?t.length+1:0)+e);n.has(r)||n.set(r,[]),n.get(r).push(i)}else n.has(i)||n.set(i,[]),n.get(i).push(i)}return Array.from(n.keys()).sort().flatMap(e=>{const t=n.get(e);if(t.length>1&&t.some(t=>t!==e&&t.startsWith(e+":"))){return[...t.filter(t=>t===e||!t.startsWith(e+":")).sort(),...Ie(t.filter(t=>t.startsWith(e+":")),e)]}return t.sort()})}const De=le((e,t)=>{let n=Object.keys(e);const i=new Set;return n=n.map(e=>{const t=e.replace(/^(?:pre|post)/,"");return Be.has(t)||n.includes(t)?(i.add(t),t):e}),Re(t)||(n=Ie(n)),n=n.flatMap(e=>i.has(e)?[`pre${e}`,e,`post${e}`]:[e]),K(e,n)}),Te=e=>{const{defaultConditions:t=[],restConditions:n=[]}=de(e,e=>"default"===e?"defaultConditions":"restConditions");return[...n,...t]},We=le(e=>{const{paths:t=[],conditions:n=[]}=de(Object.keys(e),e=>e.startsWith(".")?"paths":"conditions");return Object.fromEntries([...t,...Te(n)].map(t=>[t,We(e[t])]))}),Ne=[{key:"$schema"},{key:"name"},{key:"displayName"},{key:"version"},{key:"stableVersion"},{key:"private"},{key:"description"},{key:"categories",over:oe},{key:"keywords",over:oe},{key:"homepage"},{key:"bugs",over:pe(["url","email"])},{key:"repository",over:fe},{key:"funding",over:fe},{key:"license",over:fe},{key:"qna"},{key:"author",over:ge},{key:"maintainers",over:re(e=>e.map(ge))},{key:"contributors",over:re(e=>e.map(ge))},{key:"publisher"},{key:"sideEffects"},{key:"type"},{key:"imports"},{key:"exports",over:We},{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:ue},{key:"man"},{key:"directories",over:me},{key:"files",over:oe},{key:"workspaces",over:$e},{key:"binary",over:pe(["module_name","module_path","remote_path","package_name","host"])},{key:"scripts",over:De},{key:"betterScripts",over:De},{key:"l10n"},{key:"contributes",over:ue},{key:"activationEvents",over:oe},{key:"husky",over:ye("hooks",he)},{key:"simple-git-hooks",over:he},{key:"pre-commit"},{key:"commitlint",over:ue},{key:"lint-staged"},{key:"nano-staged"},{key:"config",over:ue},{key:"nodemonConfig",over:ue},{key:"browserify",over:ue},{key:"babel",over:ue},{key:"browserslist"},{key:"xo",over:ue},{key:"prettier",over:Pe},{key:"eslintConfig",over:Se},{key:"eslintIgnore"},{key:"npmpkgjsonlint",over:ue},{key:"npmPackageJsonLintConfig",over:ue},{key:"npmpackagejsonlint",over:ue},{key:"release",over:ue},{key:"remarkConfig",over:ue},{key:"stylelint"},{key:"ava",over:ue},{key:"jest",over:ue},{key:"jest-junit",over:ue},{key:"jest-stare",over:ue},{key:"mocha",over:ue},{key:"nyc",over:ue},{key:"c8",over:ue},{key:"tap",over:ue},{key:"oclif",over:pe(void 0,!0)},{key:"resolutions",over:ue},{key:"overrides",over:je},{key:"dependencies",over:je},{key:"devDependencies",over:je},{key:"dependenciesMeta",over:pe((e,t)=>{const n=ve(e),i=ve(t);return n<i?-1:n>i?1:0},!0)},{key:"peerDependencies",over:je},{key:"peerDependenciesMeta",over:pe(void 0,!0)},{key:"optionalDependencies",over:je},{key:"bundledDependencies",over:ce},{key:"bundleDependencies",over:ce},{key:"extensionPack",over:ce},{key:"extensionDependencies",over:ce},{key:"flat"},{key:"packageManager"},{key:"engines",over:ue},{key:"engineStrict",over:ue},{key:"devEngines",over:Ee},{key:"volta",over:Ce},{key:"languageName"},{key:"os"},{key:"cpu"},{key:"preferGlobal",over:ue},{key:"publishConfig",over:ue},{key:"icon"},{key:"badges",over:re(e=>e.map(_e))},{key:"galleryBanner",over:ue},{key:"preview"},{key:"markdown"},{key:"pnpm",over:Oe}],Le=Ne.map(({key:e})=>e),Me=ie(Ne.map(({key:e,over:t})=>t?ye(e,t):void 0).filter(Boolean));function Je(e,t={}){return function(e,t){if("string"==typeof e){const{indent:n,type:i}=te(e),r="\n"===e.slice(-1)?"\n":"",s=ne(e);e=JSON.parse(e);let o=JSON.stringify(t(e),null,"tab"===i?"\t":n)+r;return"\r\n"===s&&(o=o.replace(/\n/g,s)),o}return t(e)}(e,le(e=>{let n=t.sortOrder||Le;if(Array.isArray(n)){const t=Object.keys(e),{privateKeys:i=[],publicKeys:r=[]}=de(t,e=>"_"===e[0]?"privateKeys":"publicKeys");n=[...n,...Le,...r.sort(),...i.sort()]}return Me(K(e,n),e)}))}async function Ue(n){return _.functionIgnoringException("fixTestDirectoriesUpdatingPackageJson",async()=>{await Promise.all(n.map(async n=>{const i=t.join(n,"package.json");if(!e.existsSync(i))return;const r=t.join(n,"test");for(const s of["__tests__","tests"]){const o=t.join(n,s);try{await ze(o,r);const t=JSON.parse(await e.promises.readFile(i,"utf8"));let n=!1;const a=t.scripts??{};for(const[e,t]of Object.entries(a)){const i=t.replaceAll(s,"test");t!==i&&(a[e]=i,n=!0)}if(t.scripts=a,!n)return;await P.generateFile(i,JSON.stringify(Je(t),void 0,2))}catch{}}}))})}async function ze(n,i){if(!e.existsSync(i))return void await e.promises.rename(n,i);const r=await e.promises.readdir(n,{withFileTypes:!0});await Promise.all(r.map(async r=>{const s=t.join(n,r.name),o=t.join(i,r.name),a=e.existsSync(o)?await e.promises.stat(o):void 0;r.isDirectory()&&a?.isDirectory()?await ze(s,o):await e.promises.rename(s,o)})),await e.promises.rm(n,{recursive:!0})}async function Ge(e,n){return _.functionIgnoringException("fixTypeDefinitions",async()=>{const i=t.resolve(e.dirPath,"@types"),r=e.isRoot&&e.doesContainSubPackageJsons?void 0:t.resolve(e.dirPath,"src","types"),o=await $(()=>s.readdir(i,{withFileTypes:!0}));if(o)for(const e of o){const o=e.name.slice(0,-5),a=e.name.endsWith(".d.ts");let c=a?o:e.name;c.includes("__")&&(c=`@${c.replace("__","/")}`);const l=n.some(e=>e.packageJson?.dependencies?.[c]||e.packageJson?.devDependencies?.[c]);e.isFile()&&a?l?(await s.mkdir(t.join(i,o),{recursive:!0}),await C.run(()=>s.rename(t.join(i,e.name),t.join(i,o,"index.d.ts")))):r&&(await s.mkdir(r,{recursive:!0}),await C.run(()=>s.rename(t.join(i,e.name),t.join(r,e.name)))):e.isDirectory()&&r&&!l&&(await s.mkdir(r,{recursive:!0}),await C.run(()=>$(()=>s.rename(t.join(i,e.name,"index.d.ts"),t.join(r,`${e.name}.d.ts`)))))}})}function qe(e,t){return t}function He(e,t,n){const i=[...e];for(const[r,s]of t.entries())void 0===i[r]?i[r]=Ye(s,n):Ke(e[r],n)&&Ke(s,n)?i[r]=l(e[r],s,n):e.includes(s)||i.push(s);return i}function Ye(e,t){return Ke(e,t)?t.cloneUnlessOtherwiseSpecified(e,t):e}function Ke(e,t){return!!e&&"object"==typeof e&&t.isMergeableObject(e)}function Ve(e){const t=Object.entries(e).toSorted(([e],[t])=>e.localeCompare(t));for(const[n,i]of t)delete e[n],e[n]=i,i&&"object"==typeof i&&!Array.isArray(i)&&Ve(i);return e}const Xe={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"}}},Ze={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"}}},Qe={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"}}}};async function et(n){return _.functionIgnoringException("generateWorkflow",async()=>{if(tt(n.repository))return;const i=t.resolve(n.dirPath,".github","workflows");await e.promises.mkdir(i,{recursive:!0});const r=t.resolve(n.dirPath,".github","semantic.yml");await C.run(()=>e.promises.rm(r,{force:!0,recursive:!0}));const s=await e.promises.readdir(i,{withFileTypes:!0});for(const n of s)n.isFile()&&nt(n.name)&&await C.run(()=>e.promises.rm(t.join(i,n.name),{force:!0}));const o=new Set(["test.yml","autofix.yml","semantic-pr.yml","close-comment.yml",...s.filter(e=>e.isFile()&&e.name.endsWith(".yml")&&!nt(e.name)).map(e=>e.name)]);n.depending.semanticRelease&&o.add("release.yml");for(const e of o){const r=t.basename(e,".yml");await C.run(()=>it(n,i,r))}})}function tt(e){return e?.endsWith("/reusable-workflows")??!1}function nt(e){return/^gen-pr(?:-.+)?\.ya?ml$/u.test(e)}async function it(n,i,r){const s=t.join(i,`${r}.yml`),o=e.existsSync(t.join(i,"deploy-production.yml"));if("autofix"===r)return void await st(function(e){if(!e.isPublicRepo)return structuredClone(Ze);const t=e.isBun?"bun":"yarn",n=[{uses:"actions/checkout@v6"},{uses:"actions/setup-node@v6",with:{"check-latest":!0,"node-version":"lts/*"}},...e.isBun?[{uses:"oven-sh/setup-bun@v2",with:{"bun-version":"latest"}}]:[],{run:`${t} install`},{run:`${t} run cleanup`}];e.packageJson?.scripts?.build&&n.push({run:`${t} run build`});n.push({uses:"autofix-ci/action@v1"});const i=structuredClone(Xe),r=i.jobs.autofix??{"runs-on":"ubuntu-latest"};return i.jobs.autofix={...r,steps:n},i}(n),s);let a=structuredClone(r in Qe?Qe[r]:{});try{const t=await e.promises.readFile(s,"utf8"),n=p.load(t);a=l.all([a,n,a],{arrayMerge:He})}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/")&&(rt(n,e,r),c=!0);if(c){switch(r){case"release":if(a.on?.schedule)delete a.on.push;else{if(!(a.on?.push&&n.release.branches.length>0))return void await e.promises.rm(t.join(i,"release.yml"),{force:!0});a.on.push.branches=n.release.branches}n.isPublicRepo?(a.permissions??={},a.permissions["id-token"]="write"):delete a.permissions?.["id-token"];break;case"test":a.on?.pull_request&&delete a.on.pull_request["paths-ignore"],a.on?.push&&(delete a.on.push["paths-ignore"],a.on.push.branches=a.on.push.branches.filter(e=>"renovate/**"!==e))}if(await st(a,s),"sync"===r){if(await e.promises.rm(t.join(i,"sync-init.yml"),{force:!0}),!a.jobs.sync?.with)return;a.jobs["sync-force"]=a.jobs.sync;const n=a.jobs.sync.with.sync_params_without_dest;if("string"!=typeof n)return;a.jobs.sync.with.sync_params_without_dest=`--force ${n}`,a.name="Force to Sync",a.on={workflow_dispatch:null},delete a.jobs.sync,await st(a,t.join(i,"sync-force.yml"))}}}function rt(e,t,n){if(t.with??={},t.secrets??={},delete t.secrets.NPM_TOKEN,"test"!==n&&"release"!==n||(t.secrets.GH_TOKEN="${{ secrets.GITHUB_TOKEN }}"),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?Ve(t.with):delete t.with,Object.keys(t.secrets).length>0){const e=Ve(t.secrets);delete t.secrets,t.secrets=e}else delete t.secrets}async function st(t,n){const i=p.dump(t,{lineWidth:-1,noCompatMode:!0,styles:{"!!null":"empty"}}).replaceAll(/[ \t]+$/gm,"");await e.promises.writeFile(n,i)}async function ot(e){return _.functionIgnoringException("fixTypos",async()=>{if(tt(e.repository))return;const n=e.dirPath,i=await o.glob("**/*.md",{dot:!0,cwd:n,ignore:G});S.isVerbose&&console.info(`Found ${i.length} markdown files in ${n}`);for(const r of i){const i=t.join(n,r);C.run(async()=>{const t=await P.readFileIgnoringError(i);if(void 0===t)return;let n=at(t);n=ct(n,e,"doc"),t!==n&&await P.generateFile(i,n)})}const r=await o.glob(["{app,src,test,scripts}/**/*.{cjs,mjs,js,jsx,cts,mts,ts,tsx}","packages/**/{app,src,test,scripts}/**/*.{cjs,mjs,js,jsx,cts,mts,ts,tsx}"],{dot:!0,cwd:n,ignore:G});S.isVerbose&&console.info(`Found ${r.length} TypeScript files in ${n}`);for(const i of r){const r=t.join(n,i);C.run(async()=>{const t=await P.readFileIgnoringError(r);if(void 0===t)return;let n=t.replaceAll(/\/\*[\s\S]*?\*\//g,e=>at(e)).replaceAll(/(^|\s)\/\/(.*?)c\.f\./g,"$1//$2cf.").replaceAll(/(^|\s)\/\/(.*?)eg\./g,"$1//$2e.g.").replaceAll(/(^|\s)\/\/(.*?)ie\./g,"$1//$2i.e.");n=ct(n,e,"ts"),t!==n&&await P.generateFile(r,n)})}const s=await o.glob("**/*.{csv,htm,html,tsv,xml,yaml,yml}",{dot:!0,cwd:n,ignore:G});S.isVerbose&&console.info(`Found ${s.length} text-based files in ${n}`);for(const i of s){const r=t.join(n,i);C.run(async()=>{const t=await P.readFileIgnoringError(r);if(void 0===t)return;let n=at(t);n=ct(n,e,"text"),t!==n&&await P.generateFile(r,n)})}await C.promiseAll()})}function at(e){return e.replaceAll(/\bc\.f\.(?=\s|$)/g,"cf.").replaceAll(/\beg\.(?=\s|$)/g,"e.g.").replaceAll(/\bie\.(?=\s)/g,"i.e.")}function ct(e,t,n){for(const[n,i]of Object.entries(t.wbfyJson?.typos?.all??{}))e=e.replaceAll(n,i);for(const[i,r]of Object.entries(t.wbfyJson?.typos?.[n]??{}))e=e.replaceAll(i,r);return e}async function lt(e,n){return _.functionIgnoringException("generateAgentInstructions",async()=>{if(!e.isRoot)return;const i=t.resolve(e.dirPath,"AGENTS_EXTRA.md"),r=await P.readFileIgnoringError(i);for(const[i,s]of[["AGENTS.md","Codex CLI"],["CLAUDE.md","Claude Code"],["GEMINI.md","Gemini CLI"]]){const o=pt(e,n,s,r),a=t.resolve(e.dirPath,i);await C.run(()=>P.generateFile(a,o))}const s=t.resolve(e.dirPath,".cursor/rules/general.mdc"),o=function(e,t,n){const i="---\ndescription: General Coding Rules\nglobs:\nalwaysApply: true\n---",r=pt(e,t,"Cursor",n);return`${i}\n\n${r}`}(e,n,r);await C.run(()=>P.generateFile(s,o))})}function pt(e,t,n,i){const r=A(e),s=`\n## Project Information\n\n- Name: \`${e.packageJson?.name||"unknown"}\`\n- Description: ${e.packageJson?.description}\n- Package Manager: ${r}\n\n## General Instructions\n\n- Create a new branch if the current branch is \`main\`.\n- Run any \`git\` commands sequentially.\n- Write tests ONLY if explicitly requested. If requested, follow these rules:\n - Continue modifying tests and/or code until all tests pass.\n - Ensure tests are idempotent and independent (e.g., reset persistent data) so they can run repeatedly or in parallel.\n - Prefer actual API calls over mocks, unless actual calls are impractical, have unintended side effects, or mocks are explicitly requested.\n - Always investigate the root cause of a test failure before fixing it.\n - Avoid adding wait functions in E2E tests unless strictly necessary.\n- When fixing issues, follow these rules:\n - Investigate the root cause first (e.g., by gathering debug logs, taking screenshots, etc.).\n - Fix the actual root cause instead of applying workarounds.\n- After making code changes, run \`${r} verify-full\` to execute all tests (takes up to 1 hour), or \`${r} verify\` for only type checking and linting (takes up to 10 minutes).\n - If you are confident that your changes will not break any tests, you may use \`verify\`.\n - Use \`oxlint\` ignore comments with reasons (e.g., \`// oxlint-disable-next-line <rule> -- <reason>\`) if lint errors or warnings cannot be fixed.\n- Once you have verified your changes, commit and push them to the current (non-main) branch, then create a PR via \`gh\`.\n - Follow the conventional commits; your commit message should start with \`feat:\`, \`fix:\`, etc.\n - If not specified, make sure to add a new line at the end of your commit message${e.isWillBoosterRepo?` with: \`Co-authored-by: WillBooster (${n}) <agent@willbooster.com>\``:""}.\n - Always create new commits. Avoid using \`--amend\`.\n- Always use heredoc syntax when passing multi-line content to any command.\n- Put temporary files in the \`.tmp\` or \`/tmp\` directory.\n${o=t,o.some(e=>e.depending.playwrightTest)?`- Use \`${r} wb start --mode test\` to launch a web server for debugging or testing.`:""}\n\n${dt(t)}\n`.replaceAll(/\.\n\n+-/g,".\n-").replaceAll(/\n{3,}/g,"\n\n").trim();var o;const a=i?.trim().startsWith("#");return s+(i?a?"\n\n"+i.trim():"\n"+i:"")}function dt(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 above the functions they call to maintain a clear top-down order.\n - e.g., \`function caller() { callee(); } function callee() { ... }\`\n - Unlike functions, place variable and type declarations ABOVE their usage.\n- Write comments and JSDoc for complex or hard-to-understand code.\n - Explain "why" in comments and "what" in JSDoc.\n - Avoid stating what can be easily 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 a pre-computable array literal of strings.\n- Assume that all environment variables are properly defined.\n - If validation is required, use \`assert\` to fail fast (e.g., during startup).\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\n${e.some(e=>e.depending.react||e.depending.next)?"- Prefer lambda over `function` for React components, e.g., `const Button: React.FC = () => {`.\n- Prefer `useImmer` for storing an array or an object to `useState`.\n- Allow `autoFocus` to minimize user effort.":""}\n${e.some(e=>e.depending.next)?"\n- Since this project uses the React Compiler, you do not need to use `useCallback` or `useMemo` for performance optimization.\n- Assume there is only a single server instance.\n":""}\n`.replaceAll(/\.\n\n+-/g,".\n-").replaceAll(/\n{3,}/g,"\n\n").trim()}const ut=["@exercode/problem-utils","@willbooster/agent-skills","@willbooster/babel-configs","@willbooster/monaco-loader","@willbooster/monaco-react","@willbooster/oxfmt-config","@willbooster/oxlint-config","@willbooster/prettier-config","@willbooster/renovate-config","@willbooster/shared-lib","@willbooster/shared-lib-blitz-next","@willbooster/shared-lib-next","@willbooster/shared-lib-node","@willbooster/shared-lib-react","@willbooster/wb","agent-runtime-kit","at-decorators","build-ts","gen-i18n-ts","one-way-git-sync","@typescript/native-preview","@typescript/native-preview-darwin-arm64","@typescript/native-preview-darwin-x64","@typescript/native-preview-linux-arm","@typescript/native-preview-linux-arm64","@typescript/native-preview-linux-x64","@typescript/native-preview-win32-arm64","@typescript/native-preview-win32-x64","oxfmt","@oxfmt/binding-android-arm-eabi","@oxfmt/binding-android-arm64","@oxfmt/binding-darwin-arm64","@oxfmt/binding-darwin-x64","@oxfmt/binding-freebsd-x64","@oxfmt/binding-linux-arm-gnueabihf","@oxfmt/binding-linux-arm-musleabihf","@oxfmt/binding-linux-arm64-gnu","@oxfmt/binding-linux-arm64-musl","@oxfmt/binding-linux-ppc64-gnu","@oxfmt/binding-linux-riscv64-gnu","@oxfmt/binding-linux-riscv64-musl","@oxfmt/binding-linux-s390x-gnu","@oxfmt/binding-linux-x64-gnu","@oxfmt/binding-linux-x64-musl","@oxfmt/binding-openharmony-arm64","@oxfmt/binding-win32-arm64-msvc","@oxfmt/binding-win32-ia32-msvc","@oxfmt/binding-win32-x64-msvc","oxlint","@oxlint/binding-android-arm-eabi","@oxlint/binding-android-arm64","@oxlint/binding-darwin-arm64","@oxlint/binding-darwin-x64","@oxlint/binding-freebsd-x64","@oxlint/binding-linux-arm-gnueabihf","@oxlint/binding-linux-arm-musleabihf","@oxlint/binding-linux-arm64-gnu","@oxlint/binding-linux-arm64-musl","@oxlint/binding-linux-ppc64-gnu","@oxlint/binding-linux-riscv64-gnu","@oxlint/binding-linux-riscv64-musl","@oxlint/binding-linux-s390x-gnu","@oxlint/binding-linux-x64-gnu","@oxlint/binding-linux-x64-musl","@oxlint/binding-openharmony-arm64","@oxlint/binding-win32-arm64-msvc","@oxlint/binding-win32-ia32-msvc","@oxlint/binding-win32-x64-msvc","oxlint-tsgolint","@oxlint-tsgolint/darwin-arm64","@oxlint-tsgolint/darwin-x64","@oxlint-tsgolint/linux-arm64","@oxlint-tsgolint/linux-x64","@oxlint-tsgolint/win32-arm64","@oxlint-tsgolint/win32-x64","@next/env","@next/font","@next/rspack-binding-linux-arm64-gnu","@next/rspack-binding-linux-arm64-musl","@next/rspack-binding-linux-x64-gnu","@next/rspack-binding-linux-x64-musl","@next/swc-android-arm-eabi","@next/swc-android-arm64","@next/swc-darwin-arm64","@next/swc-darwin-x64","@next/swc-freebsd-x64","@next/swc-linux-arm-gnueabihf","@next/swc-linux-arm64-gnu","@next/swc-linux-arm64-musl","@next/swc-linux-x64-gnu","@next/swc-linux-x64-musl","@next/swc-wasm-nodejs","@next/swc-wasm-web","@next/third-parties","next","react","react-dom"];async function ft(n){return _.functionIgnoringException("generateBunfigToml",async()=>{const i=t.resolve(n.dirPath,"bunfig.toml"),r=e.existsSync(i)?e.readFileSync(i,"utf8"):void 0,s=gt(r);await C.run(()=>P.generateFile(i,s))})}const gt=e=>{const t=function(e){if(!e)return;try{return d(e)}catch{return}}(e);return`env = false\ntelemetry = false\n\n${function(e){return"boolean"==typeof e?.run?.bun?`[run]\nbun = ${e.run.bun}\n`:""}(t)}\n[install]\nexact = ${!1===t?.install?.exact?"false":"true"}\nlinker = "hoisted"\nminimumReleaseAge = 432000 # 5 days\nminimumReleaseAgeExcludes = [\n${ut.map(e=>` "${e}",`).join("\n")}\n]\n`};const mt="# Project-specific settings",yt=/# Project-specific settings[^\n]*\n/gm,ht="# Generated by wbfy",wt=`${mt} (head)\n\n\n${ht}\n`,bt=`\n${mt} (tail)\n`,vt={separator:ht,separatorPrefix:"# Generated by ",defaultHeadUserContent:wt,defaultTailUserContent:bt,async readGitignoreWithoutSeparators(t){try{let n=await e.promises.readFile(t,"utf8");const i=kt(n);return i>0&&(n=n.slice(0,i-1)),n.replaceAll(yt,"").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(yt,`${mt} (head)\n`):wt},getTailUserContent(e){const t=kt(e);return t>0?e.slice(t-1):bt},async isBerryZeroInstallEnabled(t){try{return(await e.promises.readFile(t,"utf8")).includes("\n!.yarn/cache")}catch{return!1}}};function kt(e){const t=e.indexOf(mt),n=e.lastIndexOf(mt);return n>t?n:-1}async function xt(n){return _.functionIgnoringException("generateDockerignore",async()=>{const i=t.resolve(n.dirPath,".dockerignore");if(n.doesContainDockerfile){const e=await P.readFileIgnoringError(i)??"",t=vt.getHeadUserContent(e)+"\n**/.idea\n**/*.sqlite3*\n**/.yarn/install-state.gz\n**/.venv\n"+vt.getTailUserContent(e);await C.run(()=>P.generateFile(i,t))}else await e.promises.rm(i,{force:!0})})}const jt={codeWith2IndentSize:["cjs","mjs","js","jsx","cts","mts","ts","tsx","json","json5","jsonc","cpp","dart","htm","html","pu","puml","rb","vue","xml","yaml","yml","sh"].toSorted(),codeWith4IndentSize:["go","gradle","java","py"].toSorted(),markdownLike:["md"].toSorted(),oxlint:["astro","cjs","cts","js","jsx","mjs","mts","svelte","ts","tsx","vue"].toSorted(),oxfmt:["astro","cjs","css","cts","gql","graphql","hbs","htm","html","js","json","json5","jsonc","jsx","less","md","mdx","mjs","mts","scss","svelte","toml","ts","tsx","vue","yaml","yml"].toSorted(),prettierOnly:["java"].toSorted()},$t=`root = true\n\n[*]\ncharset = utf-8\nend_of_line = lf\ninsert_final_newline = true\ntrim_trailing_whitespace = true\n\n${_t(jt.codeWith2IndentSize)}\nindent_size = 2\nindent_style = space\n\n${_t(jt.codeWith4IndentSize)}\nindent_size = 4\nindent_style = space\n\n${_t(jt.markdownLike)}\nmax_line_length = off\ntrim_trailing_whitespace = false\n\n[{Makefile,*.mk}]\nindent_style = tab\n`;async function St(e){return _.functionIgnoringException("generateEditorconfig",async()=>{const n=t.resolve(e.dirPath,".editorconfig");await C.run(()=>P.generateFile(n,$t))})}function _t(e){return e.length>1?`[*.{${e.join(",")}}]`:`[*.${e[0]}]`}const Pt={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 Ct(n,i){return _.functionIgnoringException("generateGeminiConfig",async()=>{if(!n.isRoot)return;const r=t.resolve(n.dirPath,".gemini"),s=t.resolve(r,"config.yml"),o=t.resolve(r,"styleguide.md"),a=t.resolve(n.dirPath,"AGENTS_EXTRA.md");let c=structuredClone(Pt);try{const t=await e.promises.readFile(s,"utf8"),n=p.load(t);c=l.all([c,n,c],{arrayMerge:qe})}catch{}const d=p.dump(c,{lineWidth:-1,noCompatMode:!0,styles:{"!!null":"empty"}}),u=await P.readFileIgnoringError(a),f=u?.trimStart().startsWith("#")?void 0:u,g=`${n.isPublicRepo?"Review in English based on the following coding standards.":"以下のコーディング規約を踏まえて、日本語でレビューしてください。"}\n\n${dt(i)}${f?`\n${f.trimEnd()}`:""}`,m=[C.run(()=>P.generateFile(s,d)),C.run(()=>P.generateFile(o,g))];await Promise.all(m)})}async function Et(n){return _.functionIgnoringException("generateGeminiSettings",async()=>{if(!n.isRoot)return;const i=t.resolve(n.dirPath,".gemini"),r=t.resolve(i,"settings.json");await e.promises.rm(r,{force:!0})})}const Ot=`* text=auto\n\n*.lockb binary diff=lockb\n*.vcproj text eol=crlf\n\n${[...jt.codeWith2IndentSize,...jt.codeWith4IndentSize,...jt.markdownLike].map(e=>`*.${e} text eol=lf`).join("\n")}\n\ndist/** linguist-generated=true\n`;async function Bt(e){return _.functionIgnoringException("generateGitattributes",async()=>{const n=t.resolve(e.dirPath,".gitattributes");await C.run(()=>P.generateFile(n,Ot))})}const At=["windows","macos","linux","jetbrains","visualstudiocode","emacs","vim","yarn"];async function Ft(e,n){return _.functionIgnoringException("generateGitignore",async()=>{const i=t.resolve(e.dirPath,".gitignore"),r=await P.readFileIgnoringError(i)??"";let s=vt.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.wb/\n__generated__/\n@willbooster/\ndist/\ndrizzle/mount/\ntemp/\ntmp/\n";const o=vt.getTailUserContent(r),a=[...At];e.doesContainGemfile&&a.push("ruby"),e.doesContainGoMod&&(a.push("go"),s+=`${t.basename(e.dirPath)}\n`),e.doesContainPackageJson&&a.push("node"),e.doesContainPomXml&&(a.push("maven"),s+=".idea/google-java-format.xml\n"),e.doesContainPubspecYaml&&(a.push("flutter","AndroidStudio","ruby"),s+=".flutter-plugins-dependencies\nandroid/key.properties\nios/.bundle\n.idea/runConfigurations.xml\n"),e.doesContainTemplateYaml&&(s+=".aws-sam/\npackaged.yaml\n"),(e.doesContainPoetryLock||e.doesContainUvLock)&&(a.push("python"),s+=".venv/\n"),e.depending.blitz&&(s+=".blitz/\n.blitz**\n"),e.depending.next&&a.push("nextjs"),(n.depending.firebase||e.depending.firebase)&&a.push("firebase"),e.depending.prisma&&(s+="*.sqlite3*\n"),e.depending.playwrightTest&&(s+="playwright-report/\ntest-results/\n"),(n.depending.reactNative||e.depending.reactNative)&&(a.push("reactnative"),s+="google-services.json\nandroid/app/src/main/assets/\n"),e.depending.storybook&&a.push("storybookjs"),e.depending.litestream&&(s+="gcp-sa-key.json\n");let c="";for(const e of a){let t=await Dt(e)??"";if(!t){const n=`https://www.toptal.com/developers/gitignore/api/${e}`,i=await fetch(n),r=await i.text();if(!i.ok||r.includes("Attention Required!")||r.includes("<title>"))return void console.error(`Failed to fetch ${n}`);t=r.trim(),await C.run(()=>It(e,t)),S.isVerbose&&console.info(`Fetched ${n}`)}c&&(c+="\n"),c+=t+"\n"}await vt.isBerryZeroInstallEnabled(i)||(c=c.replace("!.yarn/cache","# !.yarn/cache").replace("# .pnp.*",".pnp.*")),(e.doesContainPomXml||e.doesContainPubspecYaml)&&(c=c.replaceAll(/^# .idea\/artifacts$/gm,".idea/artifacts").replaceAll(/^# .idea\/compiler.xml$/gm,".idea/compiler.xml").replaceAll(/^# .idea\/jarRepositories.xml$/gm,".idea/jarRepositories.xml").replaceAll(/^# .idea\/modules.xml$/gm,".idea/modules.xml").replaceAll(/^# .idea\/*.iml$/gm,".idea/*.iml").replaceAll(/^# .idea\/modules$/gm,".idea/modules").replaceAll(/^# *.iml$/gm,"*.iml").replaceAll(/^# *.ipr$/gm,"*.ipr"),e.doesContainPubspecYaml&&(c=c.replaceAll(/^.idea\/modules.xml$/gm,"# .idea/modules.xml"))),c=c.replaceAll(/^.idea\/?$/gm,"# .idea"),(n.depending.reactNative||e.depending.reactNative||e.doesContainPubspecYaml)&&(c=c.replaceAll(/^(.idea\/.+)$/gm,"$1\nandroid/$1"));const l=s+"\n"+c+o;await C.run(()=>P.generateFile(i,l))})}const Rt=t.join(u.homedir(),".cache","wbfy","gitignore");async function It(n,i){await e.promises.mkdir(Rt,{recursive:!0}),await e.promises.writeFile(t.join(Rt,n),i)}async function Dt(n){try{const i=await e.promises.stat(t.join(Rt,n));if(Date.now()-i.mtimeMs>216e5)return;return await e.promises.readFile(t.join(Rt,n),"utf8")}catch{}}const Tt="$ProjectFileDir$/node_modules/.bin/oxfmt",Wt="$ProjectFileDir$/node_modules/.bin/prettier";async function Nt(n){return _.functionIgnoringException("generateIdeaSettings",async()=>{const i=t.resolve(n.dirPath,".idea");if(e.existsSync(i)){const r=t.resolve(i,"watcherTasks.xml");await(O(n)||B(n)?C.run(()=>P.generateFile(r,function(e){const t=[{args:"--write --no-error-on-unmatched-pattern !**/package.json",condition:O(e),extensions:jt.oxfmt,name:"Oxfmt",program:Tt},{args:"--cache --write",condition:B(e),extensions:jt.prettierOnly,name:"Prettier",program:Wt}].filter(e=>e.condition).flatMap(e=>e.extensions.map(t=>{return n=e.program,i=e.args,r=e.name,` <TaskOptions isEnabled="true">\n <option name="arguments" value="${i} $FilePathRelativeToProjectRoot$" />\n <option name="checkSyntaxErrors" value="false" />\n <option name="description" />\n <option name="exitCodeBehavior" value="ERROR" />\n <option name="fileExtension" value="${s=t}" />\n <option name="immediateSync" value="false" />\n <option name="name" value="${r} (.${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="${n}" />\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`;var n,i,r,s}));return`<?xml version="1.0" encoding="UTF-8"?>\n<project version="4">\n <component name="ProjectTasksOptions">\n ${t.join("")}\n </component>\n</project>\n`}(n))):C.run(()=>e.promises.rm(r,{force:!0})))}})}function Lt(e,t){if(e.depending.genI18nTs&&t?.["gen-i18n-ts"])return(e.isBun?"bun":"yarn")+" run gen-i18n-ts > /dev/null"}function Mt(e,t,n,i=0){Jt(e,t,n,i)}function Jt(e,t,n,i=0){do{const[r,s,o]=zt(e,t,n),a=f.spawnSync(r,s,o).status??1;if(0===a)break;if(i<=0)return a}while(--i>=0);return 0}function Ut(e,t,n){const[i,r,s]=zt(e,t,n);s.stdio="pipe";const o=f.spawnSync(i,r,s),a=o.stderr??"",c="string"==typeof a?a.trim():a.toString().trim();o.error?console.error(`${i} [${r.map(e=>`"${e}"`).join(", ")}] failed with: ${o.error.message}`):c&&console.error(`${i} [${r.map(e=>`"${e}"`).join(", ")}] outputs the following content to stderr:\n${c}`);const l=o.stdout??"";return"string"==typeof l?l.trim():l.toString().trim()}function zt(e,t,n){const i={...process.env};return i.PATH&&i.BERRY_BIN_FOLDER&&(i.PATH=i.PATH.split(":").filter(e=>e!==i.BERRY_BIN_FOLDER).join(":")),[e,t,{cwd:n,env:i,encoding:"utf8",shell:!1,stdio:"inherit"}]}const Gt=new class{getOrgAndName(e){const t=e.split(":").at(-1),n=t?.split("/");return[n?.at(-2)??"",n?.at(-1)?.replace(/.git$/,"")??""]}},qt=new Map;function Ht(e){const t=e??"",n=qt.get(t);if(n)return n;const i=new y({auth:Kt(e)||void 0});return qt.set(t,i),i}function Yt(e){return!!Kt(e)}function Kt(e){return"WillBooster"===e?process.env.GH_BOT_PAT_FOR_WILLBOOSTER||Xt():"WillBoosterLab"===e?process.env.GH_BOT_PAT_FOR_WILLBOOSTERLAB||Xt():process.env.GH_BOT_PAT_FOR_WILLBOOSTER||process.env.GH_BOT_PAT_FOR_WILLBOOSTERLAB||process.env.GH_TOKEN||process.env.GITHUB_TOKEN||Xt()}let Vt;function Xt(){if(void 0!==Vt)return Vt||void 0;try{Vt=f.execFileSync("gh",["auth","token"],{encoding:"utf8",stdio:["ignore","pipe","ignore"]}).trim()||""}catch{Vt=""}return Vt||void 0}const Zt=["@tsconfig/bun","@tsconfig/node-lts","@tsconfig/node-ts","@tsconfig/react-native"];function Qt(e){return e.isWillBoosterConfigs&&!e.isRoot&&!0!==e.packageJson?.private&&Array.isArray(e.packageJson?.files)&&e.packageJson.files.length>0}const en=["@willbooster/oxfmt-config","@willbooster/oxlint-config","oxfmt","oxlint","oxlint-tsgolint"],tn="@typescript/native-preview",nn="typescript",rn="@willbooster/wb",sn="build-ts",on=function(){let n=t.dirname(g(import.meta.url));for(;;){const i=t.join(n,"package.json");if(e.existsSync(i)){const t=JSON.parse(e.readFileSync(i,"utf8"));if("@willbooster/wbfy"===t.name)return t}const r=t.dirname(n);if(r===n)throw new Error("Could not find @willbooster/wbfy package.json");n=r}}(),an={...on.dependencies,...on.devDependencies,...on.peerDependencies},cn=new Set([rn,sn,...en]),ln=["@willbooster/prettier-config",...en.filter(e=>e.startsWith("@willbooster/"))],pn=["@biomejs/biome","@eslint-react/eslint-plugin","@eslint/js","@next/eslint-plugin-next","@types/eslint","@types/micromatch","@typescript-eslint/eslint-plugin","@typescript-eslint/parser","@willbooster/biome-config","@willbooster/eslint-config","@willbooster/eslint-config-blitz-next","@willbooster/eslint-config-js","@willbooster/eslint-config-js-react","@willbooster/eslint-config-next","@willbooster/eslint-config-react","@willbooster/eslint-config-ts","@willbooster/eslint-config-ts-react","biome","eslint","eslint-config-flat-gitignore","eslint-config-next","eslint-config-prettier","eslint-import-resolver-node","eslint-import-resolver-typescript","eslint-plugin-import","eslint-plugin-import-x","eslint-plugin-perfectionist","eslint-plugin-prettier","eslint-plugin-react","eslint-plugin-react-compiler","eslint-plugin-react-hooks","eslint-plugin-sort-class-members","eslint-plugin-sort-destructure-keys","eslint-plugin-storybook","eslint-plugin-unicorn","eslint-plugin-unused-imports","globals","micromatch","typescript-eslint"],dn=new Set(["micromatch","@types/micromatch"]),un=/\bfrom\s+['"]micromatch['"]|\brequire\(\s*['"]micromatch['"]\s*\)|\bimport\(\s*['"]micromatch['"]\s*\)/u,fn=new Map,gn=["dependencies","devDependencies","optionalDependencies","peerDependencies"];async function mn(n,r,s){return _.functionIgnoringException("generatePackageJson",async()=>{await async function(n,r,s){const a=t.resolve(n.dirPath,"package.json"),c=await async function(t){const n=await e.promises.readFile(t,"utf8"),i=JSON.parse(n);return i.scripts=i.scripts??{},i.dependencies=i.dependencies??{},i.devDependencies=i.devDependencies??{},i.peerDependencies=i.peerDependencies??{},i}(a),p=n.isBun?"bun":"yarn";await async function(n,i){"WillBooster LLC"===i.author&&(i.author="WillBooster Inc.");(function(e,n){const i=n.name||t.basename(e.dirPath);for(const e of jn(n))Reflect.deleteProperty(e,i)})(n,i),function(e,t){if(!e.isWillBoosterConfigs)return;for(const e of jn(t))for(const[t,n]of Object.entries(e))n&&En(n)&&(e[t]=$n(t))}(n,i),delete i.scripts["sort-package-json"],delete i.scripts["sort-all-package-json"],delete i.scripts["check-all-for-ai"],delete i.scripts["check-for-ai"],delete i.scripts["typecheck/warn"],delete i.scripts["typecheck:gen-code"],delete i.scripts["typecheck:codegen"],delete i.dependencies.tslib,delete i.devDependencies["@willbooster/renovate-config"],delete i.devDependencies["@willbooster/tsconfig"],n.depending.next||delete i.devDependencies[nn];delete i.devDependencies.lerna,delete i.devDependencies.pinst,delete i.scripts["flutter-format"],delete i.scripts["format-flutter"],delete i.scripts["python-format"],delete i.scripts["format-python"],delete i.scripts.prettier,delete i.scripts["check-all"],delete i.scripts["verify-code"],delete i.scripts["verify-code-with-tests"],await C.run(()=>e.promises.rm(t.resolve(n.dirPath,"lerna.json"),{force:!0})),function(e,t){if(!e.isWillBoosterConfigs)return;const n=jn(t);for(const e of ln)for(const t of n)Reflect.deleteProperty(t,e)}(n,i),function(n,i){const r=function(n){return n.isWillBoosterConfigs&&!n.isRoot||function(n){const i=o.globSync("src/**/*.{js,jsx,mjs,cjs,ts,tsx,mts,cts}",{cwd:n,dot:!0,ignore:G});return i.some(i=>{try{return un.test(e.readFileSync(t.resolve(n,i),"utf8"))}catch{return!1}})}(n.dirPath)}(i);for(const e of pn)r&&dn.has(e)||_n(n,i,e)||(delete n.dependencies[e],delete n.devDependencies[e],delete n.peerDependencies[e])}(i,n)}(n,c),await async function(n,i){(function(e){for(const[t,n]of Object.entries(e))"string"==typeof n&&(n.includes("git clone")||(e[t]=n.replaceAll(/yarn\s*(?:install\s*)?&&\s*/gu,"")))})(i.scripts),i.scripts={...i.scripts,...An(n,i.scripts)},delete i.scripts["start-test-server"];const r=i.scripts;n.isBun||!B(n)?delete r.prettify:r.prettify=(r.prettify??"")+await async function(n){const i=t.resolve(n,".prettierignore"),r=await e.promises.readFile(i,"utf8").catch(()=>""),s=r.indexOf(vt.separatorPrefix);if(-1===s)return"";const o=r.slice(0,s);return`${o.split("\n").map(e=>{const t=e.trim();return t.endsWith("/")?t.slice(0,-1):t}).filter(e=>e&&!e.startsWith("#")&&!e.includes("/")).map(e=>` "!**/${e}/**"`).join("")} || true`}(n.dirPath);(function(e){for(const[t,n]of Object.entries(e))n?.includes("yarn workspaces foreach")&&(e[t]=n.replaceAll(/yarn workspaces foreach(?!\s+(?:-A|-R|--(?:all|recursive|since|worktree|from|include|exclude|public|private)))/gu,"yarn workspaces foreach --all"))})(r),function(e,t){if(e.isBun||!t.railway?.includes("@railway/cli"))return;t.railway="YARN_ENABLE_SCRIPTS=true yarn dlx @railway/cli"}(n,r)}(n,c),function(e){for(const t of[rn,sn])e.dependencies[t]&&(e.devDependencies[t]??=e.dependencies[t],delete e.dependencies[t])}(c);const d=await async function(n,r,s){const a=[],c=["sort-package-json"],p=[],d=B(n);!d||e.existsSync(t.join(r.dirPath,".prettierrc.json"))||e.existsSync(t.join(n.dirPath,".prettierrc.json"))||(s.prettier="@willbooster/prettier-config",c.push("prettier-plugin-java","@willbooster/prettier-config"));d?c.push("prettier"):function(e){delete e.prettier;const t=[e.dependencies,e.devDependencies,e.peerDependencies];for(const e of t)e&&(delete e.prettier,delete e["prettier-plugin-java"],delete e["prettier-plugin-prisma"],delete e["@willbooster/prettier-config"],delete e["@types/prettier"])}(s);if(delete s.devDependencies["lint-staged"],delete s["lint-staged"],n.isRoot){if(delete s.devDependencies.husky,delete s.scripts.postinstall,delete s.scripts.postpublish,delete s.scripts.prepublishOnly,delete s.scripts.prepack,delete s.scripts.postpack,s.scripts.prepare="lefthook install || true",c.push("lefthook"),n.depending.semanticRelease&&(s.devDependencies["semantic-release"]||s.devDependencies["multi-semantic-release"]||s.devDependencies["@qiwi/multi-semantic-release"]||c.push("semantic-release"),s.version="0.0.0-semantically-released"),n.depending.playwrightTest){s.dependencies.artillery||s.devDependencies.artillery||s.dependencies["@playwright/test"]||c.push("@playwright/test"),delete s.dependencies.playwright,delete s.devDependencies.playwright}n.doesContainSubPackageJsons?s.workspaces=Array.isArray(s.workspaces)?l.all([s.workspaces,["packages/*"]],{arrayMerge:He}):["packages/*"]:Array.isArray(s.workspaces)&&(s.workspaces=s.workspaces.filter(e=>o.globSync(e,{dot:!0,cwd:n.dirPath,ignore:G}).length>0),0===s.workspaces.length&&delete s.workspaces)}Fn(s)||c.push(rn);if(n.depending.wb||n.isBun)for(const[e,t]of Object.entries(s.scripts))"string"==typeof t&&(s.scripts[e]=t.replaceAll(/wb\s+db/gu,"wb prisma"));(s.dependencies[sn]||s.devDependencies[sn]||Object.values(s.scripts).some(e=>e?.includes(sn)))&&c.push(sn);O(n)&&c.push(...en);const u=O(n)?function(e){return e.depending.blitz||e.depending.next?[]:e.isBun?["@tsconfig/bun"]:e.depending.reactNative?["@tsconfig/react-native"]:["@tsconfig/node-lts","@tsconfig/node-ts"]}(n):[];await async function(n,r,s){const a=new Set(s),c=await async function(n){const r=new Set,s=await o.glob("**/tsconfig*.json",{cwd:n.dirPath,dot:!0,ignore:G});for(const o of s){const s=t.resolve(n.dirPath,o);try{const t=i.parseConfigFileTextToJson(s,await e.promises.readFile(s,"utf8"));if(t.error)return console.warn(`Preserve managed @tsconfig dependencies because ${s} could not be parsed: ${kn(t.error)}`),new Set(Zt);for(const e of xn(t.config?.extends))for(const t of Zt)(e===t||e.startsWith(`${t}/`))&&r.add(t)}catch(e){return console.warn(`Preserve managed @tsconfig dependencies because ${s} could not be read: ${e instanceof Error?e.message:String(e)}`),new Set(Zt)}}return r}(n);for(const e of Zt)if(!a.has(e)&&!c.has(e))for(const t of jn(r))Reflect.deleteProperty(t,e)}(n,s,u),c.push(...u),(n.doesContainTypeScript||n.doesContainTypeScriptInPackages)&&(c.push(tn),n.depending.next&&c.push(nn),n.isBun?c.push("@types/bun"):n.depending.reactNative||c.push("@types/node"),(s.dependencies.jest||s.devDependencies.jest||s.dependencies["@jest/globals"]||s.devDependencies["@jest/globals"]||s.dependencies["ts-jest"]||s.devDependencies["ts-jest"])&&c.push("@types/jest"));if(n.isWillBoosterConfigs)return{dependencies:a.filter(e=>!e.includes("@willbooster/")),devDependencies:c.filter(e=>!e.includes("@willbooster/")),pythonDevDependencies:p};return{dependencies:a,devDependencies:c,pythonDevDependencies:p}}(n,r,c);await async function(n,i,r,s){r.name||(r.name=t.basename(n.dirPath));n.doesContainSubPackageJsons&&(r.private=!0);r.license||(r.license="UNLICENSED");!r.private&&"UNLICENSED"!==r.license&&i.isPublicRepo&&(r.publishConfig??={},r.publishConfig.access??="public");const[a]=Gt.getOrgAndName(n.repository??"");"WillBooster"!==a&&"WillBoosterLab"!==a||(r.author="WillBooster Inc.");await async function(n,i){if(!Qt(n))return;const r=t.resolve(n.dirPath,"config.mjs");if(!e.existsSync(r))return;i.type="module";const s=t.resolve(n.dirPath,"config.d.ts");if(!e.existsSync(s))return;i.files=[...new Set([...i.files??[],"config.d.mts"])],await C.run(()=>P.generateFile(t.resolve(n.dirPath,"config.d.mts"),hn))}(n,r),n.isRoot||!r.private||r.main||(r.main="./src");if(delete r.resolutions?.["npm/chalk"],!n.doesContainSubPackageJsons){if(!n.isBun)if(n.doesContainJavaScript||n.doesContainTypeScript)r.scripts["lint-fix"]=r.scripts["lint-fix"]??"yarn lint --fix";else{delete r.scripts.lint,delete r.scripts["lint-fix"];for(const e of["cleanup"]){const t=r.scripts[e];t&&(r.scripts[e]=t.replace(/ ?&& ?yarn lint-fix(?: --quiet)?/,""))}}if(n.doesContainPubspecYaml){r.scripts.lint="flutter analyze",r.scripts["lint-fix"]="yarn lint";const i=["lib","test","test_driver"].filter(i=>e.existsSync(t.resolve(n.dirPath,i)));i.length>0&&(r.scripts["format-code"]=`dart format $(find ${i.join(" ")} -name generated -prune -o -name '*.freezed.dart' -prune -o -name '*.g.dart' -prune -o -name '*.dart' -print)`,r.scripts.format=yn(r.scripts.format,n))}const i=wn(n);if(i){"poetry install"===r.scripts.postinstall&&delete r.scripts.postinstall,r.scripts["common/ci-setup"]=`yarn setup-${i}`,delete r.scripts["setup-"+("poetry"===i?"uv":"poetry")],delete r.scripts["setup-poetry-asdf"],r.scripts[`setup-${i}`]="uv"===i?"uv sync --frozen":"poetry config virtualenvs.in-project true && poetry env use $(mise current python) && poetry run pip install --upgrade pip && poetry install";const e=await o.glob("**/*.py",{cwd:n.dirPath,dot:!0,ignore:G}),t=new Set;for(const n of e){const[e,i]=n.split("/");e&&i&&t.add(e)}if(t.size>0){const e=[...t].join(" "),o=`${i} run`;r.scripts["format-code"]=`${o} isort --profile black ${e} && ${o} black ${e}`,r.scripts.lint?r.scripts.lint=`${o} flake8 ${e} && ${r.scripts.lint}`:(r.scripts.lint=`${o} flake8 ${e}`,r.scripts["lint-fix"]="yarn lint"),r.scripts.format=yn(r.scripts.format,n),s.pythonDevDependencies.push("black","isort","flake8")}}}(n.repository||r.repository)&&(r.repository=function(e,t){const n=On(e);if(n)return Bn(n,e,t);const i=On(t);if(i)return Bn(i,t);return e}(n.repository??r.repository,r.repository));const c=r.scripts["gen-code"];c?.includes("No code generation needed")?delete r.scripts["gen-code"]:function(e,t){return e.depending.blitz||e.depending.chakra||e.depending.prisma||e.depending.drizzle&&!!t?.includes("drizzle-kit check")}(n,c)&&(r.scripts["gen-code"]=(n.isBun?"bun --bun ":"")+"wb gen-code");(function(e,t){const n=Lt(e,t.scripts);if(!n)return;const i=t.scripts.postinstall;i?i.includes(n)||(t.scripts.postinstall=`${i} && ${n}`):t.scripts.postinstall=n})(n,r),r.dependencies.prettier||delete r.devDependencies["@types/prettier"]}(n,r,c,d),function(e,t){const n=e.dependencies,i=e.devDependencies;t.dependencies=vn(n,t.dependencies),t.devDependencies=t.devDependencies.filter(e=>!n[e]),t.devDependencies=vn(i,t.devDependencies)}(c,d),await async function(e){const t=new Set([...Object.keys(e.dependencies),...Object.keys(e.devDependencies)]),n=[{packageName:"@willbooster/auth",repo:"auth",target:"dependencies"},{packageName:"@discord-bot/shared",repo:"discord-bot",target:"dependencies"},{packageName:"@willbooster/code-analyzer",repo:"code-analyzer",target:"devDependencies"},{packageName:"@willbooster/judge",repo:"judge",target:"dependencies"},{packageName:"@willbooster/llm-proxy",repo:"llm-proxy",target:"dependencies"}];await Promise.all(n.map(async({packageName:n,repo:i,target:r})=>{if(!t.has(n)||function(e,t){return(e.devDependencies?.[t]||e.dependencies?.[t]||"").includes("workspace")}(e,n))return;const s="dependencies"===r?"devDependencies":"dependencies";Reflect.deleteProperty(e[s],n),e[r][n]=await async function(e){const t=await function(e,t){try{const n=Ut("git",["ls-remote",`git@github.com:${e}/${t}.git`,"HEAD"],process.cwd()).split(/\s+/)[0];if(!n)throw new Error(`No commits found for ${e}/${t}`);return Promise.resolve(n)}catch(n){return Promise.reject(new Error(`Failed to fetch commits for ${e}/${t}: ${String(n)}`))}}("WillBoosterLab",e);return`git@github.com:WillBoosterLab/${e}.git#${t}`}(i)}))}(c),function(e){for(const t of gn){const n=e[t];n&&0===Object.keys(n).length&&Reflect.deleteProperty(e,t)}}(c),n.isBun&&delete c.packageManager;await P.generateFile(a,function(e){return JSON.stringify(Je(e),void 0,2)}(c)),s||(function(e,t,n,i){const r=n.dependencies.filter(e=>!t.devDependencies?.[e]);bn(e,i,t.dependencies??{},r,!1);const s=n.devDependencies.filter(e=>!t.dependencies?.[e]);bn(e,i,t.devDependencies??{},s,!0);const o=wn(e);if(o&&n.pythonDevDependencies.length>0){const t=[...new Set(n.pythonDevDependencies)];"poetry"===o?Mt("poetry",["add","--group","dev",...t],e.dirPath):Mt("uv",["add","--dev",...t],e.dirPath)}}(n,c,d,p),function(e,n,i){const r=t.relative(e.dirPath,i);if(!r)return;Mt("bun"===n?"bunx":n,["sort-package-json",r],e.dirPath)}(n,p,a))}(n,r,s)})}function yn(e,t){const n=t.isBun?"bun run":"yarn";return e?`${e} && ${n} format-code`:`${n} format-code`}const hn="export { default } from './config.js';\n";function wn(e){return e.doesContainUvLock?"uv":e.doesContainPoetryLock?"poetry":void 0}function bn(e,t,n,i,r){if(0===i.length)return;const s=[...new Set(i.map(e=>function(e,t){if(t&&!En(t))return`${e}@${t}`;return Sn(e)}(e,n[e])))];Mt(t,["add",...r?["-D"]:[],...e.isBun?["--exact"]:[],...s],e.dirPath)}function vn(e,t){const n=[];for(const i of new Set(t)){const t=Pn(i,e[i]);t&&n.push(i),e[i]&&!t&&"*"!==e[i]||(e[i]=$n(i))}return n}function kn(e){return i.flattenDiagnosticMessageText(e.messageText,"\n")}function xn(e){return"string"==typeof e?[e]:Array.isArray(e)?e.filter(e=>"string"==typeof e):[]}function jn(e){return gn.map(t=>e[t]).filter(e=>!!e)}function $n(e){const t=function(e){return cn.has(e)?an[e]:void 0}(e);if(t)return t;const n=fn.get(e);if(n)return n;const i=function(e){return Ut("npm",["show",Sn(e),"version","--workspaces=false"],process.cwd())||"*"}(e);return fn.set(e,i),i}function Sn(e){return e===tn?`${e}@beta`:e}function _n(e,t,n){return!!Qt(t)&&(!!e.peerDependencies[n]||"@types/eslint"===n&&!!e.peerDependencies.eslint)}function Pn(e,t){return!t||("*"===t||(!!En(t)||(e===tn||cn.has(e))&&Cn(e,t)))}function Cn(e,t){const n=$n(e),i=m.valid(n),r=m.valid(t);return!i||!r||m.gt(i,r)}function En(e){return e.startsWith("workspace:")}function On(e){if("string"==typeof e){if(!e.startsWith("github:"))return;const[t,n]=Gt.getOrgAndName(e);if(!t||!n)return;return`git+https://github.com/${t}/${n}.git`}const t=e?.url;if("string"!=typeof t)return;const n=/^(?:git\+)?https:\/\/github\.com\/([^/]+)\/([^/]+?)(?:\.git)?$/u.exec(t);if(!n)return;const[,i,r]=n;return`git+https://github.com/${i}/${r}.git`}function Bn(e,t,n){return{..."object"==typeof t?t:"object"==typeof n?n:void 0,type:"git",url:e}}function An(e,t){if(e.isBun){const n=e.doesContainTypeScript||e.doesContainTypeScriptInPackages,i={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",verify:"bun --bun wb verify","verify-full":"bun --bun wb verify --full"};return Rn(e,i,t,["build","dev","start","test","typecheck"]),n?e.depending.pyright&&(i.typecheck+=" && pyright"):delete i.typecheck,i}{const n=e.doesContainTypeScript||e.doesContainTypeScriptInPackages,i=O(e),r=B(e),s=t.test;let o={cleanup:"yarn format && yarn lint-fix",format:Wn(i,r),lint:"oxlint --no-error-on-unmatched-pattern .","lint-fix":"yarn lint --fix","format-code":"oxfmt --write --no-error-on-unmatched-pattern . '!**/package.json'",typecheck:"tsgo --noEmit"};return r&&(o.prettify=`prettier --cache --color --no-error-on-unmatched-pattern --write "**/{.*/,}*.{${jt.prettierOnly.join(",")}}" "!**/test{-,/}fixtures/**"`),e.doesContainSubPackageJsons?(o=l({...o},{format:`${o.format} && yarn workspaces foreach --all --parallel --verbose run format`,lint:"yarn workspaces foreach --all --parallel --verbose run lint","lint-fix":"yarn workspaces foreach --all --parallel --verbose run lint-fix",test:"CI=1 FORCE_COLOR=3 yarn workspaces foreach --all --verbose run test",typecheck:"yarn workspaces foreach --all --parallel --verbose run typecheck"}),r&&(o.prettify=`prettier --cache --color --no-error-on-unmatched-pattern --write "**/{.*/,}*.{${jt.prettierOnly.join(",")}}" "!**/packages/**" "!**/test{-,/}fixtures/**"`)):e.depending.pyright&&(o.typecheck=o.typecheck?`${o.typecheck} && `:"",o.typecheck+="pyright"),s?.includes("wb test")&&(o.test=s),i||(delete o["format-code"],delete o.lint,delete o["lint-fix"]),n?e.depending.wb&&(o.typecheck="wb typecheck"):delete o.typecheck,Fn(e.packageJson)?(o.verify=t.verify??'yarn workspace @willbooster/wb start --working-dir "$INIT_CWD" verify',o["verify-full"]=t["verify-full"]??"yarn verify --full"):(o.verify="wb verify",o["verify-full"]="wb verify --full"),Rn(e,o,t,["build","dev","start","test","typecheck"]),o}}function Fn(e){return e?.name===rn}function Rn(e,t,n,i){for(const r of i)In(e,r)&&(Dn(e,r)||(!n[r]||Tn(n[r],r)||r in t)&&(t[r]=`mise run ${r}`))}function In(e,t){return Object.hasOwn(e.miseTasks,t)}function Dn(e,t){const n=e.miseTasks[t];if(!n)return!1;return["bun","yarn","npm","pnpm"].some(e=>{return new RegExp(String.raw`\b${e}\s+(?:run\s+)?${i=t,i.replaceAll(/[.*+?^${}()|[\]\\]/g,String.raw`\$&`)}(?![a-zA-Z0-9_\-:.])`,"u").test(n);var i})}function Tn(e,t){return e===`mise run ${t}`}function Wn(e,t){const n=["sort-package-json"];return e&&n.push("yarn format-code"),t&&n.push("yarn prettify"),n.join(" && ")}const Nn={glob_matcher:"doublestar","post-merge":{jobs:[{name:"prepare",script:"prepare.sh",runner:"bash"}]},"pre-push":{jobs:[{name:"check",script:"check.sh",runner:"bash"}]}},Ln={jobs:[{name:"cleanup",glob:"",run:"",stage_fixed:!0},{name:"check-migrations",glob:"**/migration.sql",run:'\nfailed=0\n# Lefthook expands {staged_files} as shell-escaped args, so paths with spaces stay intact.\nfor file in {staged_files}; do\n if grep -q \'Warnings:\' "$file"; then\n echo "Migration SQL file ($file) contains warnings! Please solve the warnings and commit again."\n failed=1\n fi\ndone\nexit "$failed"\n'.trim()}]},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 Jn(n){return _.functionIgnoringException("generateLefthookUpdatingPackageJson",async()=>{await async function(n){const i=t.resolve(n.dirPath,".lefthook"),r=t.resolve(n.dirPath,".husky"),s=e.existsSync(r),{lint:o}=An(n,{}),a={...Nn,"pre-commit":{jobs:Un(n)}};o||delete a["pre-push"];await Promise.all([e.promises.writeFile(t.join(n.dirPath,"lefthook.yml"),p.dump(a,{lineWidth:-1,noCompatMode:!0,styles:{"!!null":"empty"}})),e.promises.rm(i,{force:!0,recursive:!0})]),s&&(await Promise.all([e.promises.rm(r,{force:!0,recursive:!0}),e.promises.rm(t.resolve(n.dirPath,".huskyrc.json"),{force:!0})]),Mt("git",["config","--unset","core.hooksPath"],n.dirPath));if(o){const r=function(e){let t;t=e.isBun?"bun --bun wb lint":e.depending.wb?"yarn wb lint":"yarn run lint";const n=`${t} --quiet`;if(e.repository?.startsWith("github:WillBoosterLab/"))return`\n#!/bin/bash\n\nif [ $(git branch --show-current) = "main" ] && [ $(git config user.email) != "exkazuu@gmail.com" ]; then\n echo "************************************************"\n echo "*** Don't push main branch directly. Use PR! ***"\n echo "************************************************"\n exit 1\nfi\n\n${n}\n`.trim();return n}(n);e.mkdirSync(t.join(i,"pre-push"),{recursive:!0}),await e.promises.writeFile(t.join(i,"pre-push","check.sh"),r+"\n",{mode:493})}const c=`${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",i=e.depending.blitz||e.depending.next?" && rm -Rf .next":"";t.push(String.raw`run_if_changed "package\.json" "${n}${i}"`),e.doesContainPoetryLock&&t.push(String.raw`run_if_changed "poetry\.lock" "poetry install"`);e.doesContainUvLock&&t.push(String.raw`run_if_changed "uv\.lock" "uv sync --frozen"`);e.depending.blitz?t.push(String.raw`run_if_changed ".*\.prisma" "node node_modules/.bin/blitz prisma migrate deploy"`,String.raw`run_if_changed ".*\.prisma" "node node_modules/.bin/blitz prisma generate"`,String.raw`run_if_changed ".*\.prisma" "node node_modules/.bin/blitz codegen"`):e.depending.prisma&&t.push(String.raw`run_if_changed ".*\.prisma" "node node_modules/.bin/dotenv -c development -- node node_modules/.bin/prisma migrate deploy"`,String.raw`run_if_changed ".*\.prisma" "node node_modules/.bin/dotenv -c development -- node node_modules/.bin/prisma generate"`);const r=Lt(e,e.packageJson?.scripts);r&&t.push(String.raw`run_if_changed "(^|/)i18n/.*\.json$" "${r}"`);return t}(n).join("\n")}\n`;e.mkdirSync(t.join(i,"post-merge"),{recursive:!0}),await e.promises.writeFile(t.resolve(i,"post-merge","prepare.sh"),c,{mode:493})}(n)})}function Un(e){return Ln.jobs.map(t=>"cleanup"===t.name?{...t,glob:zn(e),run:Gn(e)}:t)}function zn(e){const t=e.isBun||e.depending.wb||B(e)?[...jt.prettierOnly]:[];O(e)&&t.push(...jt.oxfmt,...jt.oxlint),(e.doesContainPoetryLock||e.doesContainUvLock)&&t.push("py"),e.doesContainPubspecYaml&&t.push("dart");return`**/*.{${[...new Set(t)].toSorted().join(",")}}`}function Gn(n){if(function(n){if(!n.isRoot)return!1;const i=t.resolve(n.dirPath,"packages","wb","package.json");if(!e.existsSync(i))return!1;try{return"@willbooster/wb"===JSON.parse(e.readFileSync(i,"utf8")).name}catch{return!1}}(n))return String.raw`
|
|
1
|
+
import e from"node:fs";import t from"node:path";import n from"yargs";import i from"typescript";import{PromisePool as r}from"minimal-promise-pool";import s from"node:fs/promises";import o from"fast-glob";import a from"semver/functions/compare.js";import c from"semver/ranges/min-version.js";import l from"deepmerge";import p from"js-yaml";import{parse as d}from"smol-toml";import u from"node:os";import f from"node:child_process";import{fileURLToPath as g}from"node:url";import m from"semver";import{Octokit as y}from"@octokit/core";import{createRequire as h}from"node:module";import w from"dotenv";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,i){await e.promises.mkdir(t.dirname(n),{recursive:!0});let r=i.trim();r&&(r+="\n"),await e.promises.writeFile(n,r)}},E=new r;async function C(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 s=await e.promises.readFile(r,"utf8"),o=function(e){const t=i.createSourceFile("next.config.js",e,i.ScriptTarget.Latest,!0,i.ScriptKind.JS);let n;const r=e=>{n||(i.isExportAssignment(e)&&i.isObjectLiteralExpression(e.expression)?n=e.expression:i.isBinaryExpression(e)&&e.operatorToken.kind===i.SyntaxKind.EqualsToken&&"module.exports"===e.left.getText(t)&&i.isObjectLiteralExpression(e.right)?n=e.right:i.forEachChild(e,r))};return r(t),n}(s);if(!o)return;const a=[];if(new Set(o.properties.map(e=>e.name?.getText())).has("typescript")||a.push("typescript: { ignoreBuildErrors: true }"),0===a.length)return;const c=o.getEnd()-1,l=o.properties.at(-1),p=!!l&&s.slice(l.getEnd(),c).includes(","),d=o.properties.length>0&&!p?", ":"",u=`${s.slice(0,c)}${d}${a.join(", ")}${s.slice(c)}`;await E.run(()=>P.generateFile(r,u))})}function O(e){return e.doesContainJavaScript||e.doesContainJavaScriptInPackages||e.doesContainTypeScript||e.doesContainTypeScriptInPackages}function B(e){return e.doesContainJava||e.doesContainJavaInPackages}function A(e){return e.isBun?"bun":"yarn"}const F=e=>({kind:"literal",value:e}),R=(e,t=[])=>({kind:"object",value:I(e,t)});function I(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 D(n){const r=t.resolve(n.dirPath,"playwright.config.ts");if(e.existsSync(r))return _.functionIgnoringException("fixPlaywrightConfig",async()=>{await async function(n){for(const i of function(n){const i=[".env",".env.test",".env.example","mise.toml","mise.test.toml"],r=[];for(let s=t.resolve(n);r.push(...i.map(e=>t.resolve(s,e))),!e.existsSync(t.resolve(s,".git"));s=t.dirname(s)){if(t.dirname(s)===s)break}return r}(n))try{const t=await e.promises.readFile(i,"utf8");if(/NEXT_PUBLIC_BASE_URL\s*=/m.test(t))return}catch{}throw new Error("NEXT_PUBLIC_BASE_URL is required for Playwright. Define NEXT_PUBLIC_BASE_URL in the target repo.")}(n.dirPath);const s=await e.promises.readFile(r,"utf8"),o=function(e){const t=i.createSourceFile("playwright.config.ts",e,i.ScriptTarget.Latest,!0,i.ScriptKind.TS);let n;const r=e=>{if(!n){if(i.isCallExpression(e)&&"defineConfig"===e.expression.getText(t)){const t=e.arguments[0];if(t&&i.isObjectLiteralExpression(t))return void(n=t)}i.forEachChild(e,r)}};return r(t),n?{source:t,node:n}:void 0}(s);if(!o)return;const a=M(o.node,o.source);if(!a)return;const c=T((e=>I({forbidOnly:F("!!process.env.CI"),retries:F("process.env.PWDEBUG ? 0 : process.env.CI ? 5 : 1"),use:R({baseURL:F("process.env.NEXT_PUBLIC_BASE_URL"),trace:F("process.env.CI ? 'on-first-retry' : 'retain-on-failure'"),screenshot:F("process.env.CI ? 'only-on-failure' : 'on'"),video:F("process.env.CI ? 'on-first-retry' : 'retain-on-failure'")}),webServer:R({command:F(N(e)),url:F("process.env.NEXT_PUBLIC_BASE_URL"),reuseExistingServer:F("!!process.env.CI"),timeout:F("300_000"),stdout:F("'pipe'"),stderr:F("'pipe'"),env:F("{\n ...process.env,\n PRISMA_USER_CONSENT_FOR_DANGEROUS_AI_ACTION: 'true',\n}"),gracefulShutdown:F("{\n signal: 'SIGTERM',\n timeout: 500,\n}")})}))(n),a);!function(e,t){const n=e.properties.webServer;if("object"!==n?.kind)return;n.value.properties.command=F(N(t))}(c,n);const l=J({kind:"object",value:c},0),p=o.node.getStart(o.source),d=o.node.getEnd(),u=`${s.slice(0,p)}${l}${s.slice(d)}`;await E.run(()=>P.generateFile(r,u))})}function T(e,t){const n=new Set(Object.keys(t.properties)),i=[...e.extraMembers,...t.extraMembers],r=[...e.memberOrder.filter(e=>"property"!==e.kind||!n.has(e.key)),...t.memberOrder.map(t=>"property"===t.kind?t:{kind:"extra",index:e.extraMembers.length+t.index})],s={...e.properties};for(const[e,n]of Object.entries(t.properties))s[e]=W(s[e],n);return{extraMembers:i,memberOrder:r,properties:s}}function W(e,t){return"object"===e?.kind&&"object"===t.kind?{kind:"object",value:T(e.value,t.value)}:t}function N(e){return`'${A(e)} wb start --mode test'`}function L(e,t){if(i.isObjectLiteralExpression(e)){const n=M(e,t);return n?{kind:"object",value:n}:F(e.getText(t))}if(i.isArrayLiteralExpression(e)){const n=e.elements.map(e=>L(e,t));return n.some(e=>void 0===e)?F(e.getText(t)):{kind:"array",value:n}}return F(e.getText(t))}function M(e,t){const n={extraMembers:[],memberOrder:[],properties:{}};for(const r of e.properties){if(i.isShorthandPropertyAssignment(r)){const e=r.name.getText(t);n.properties[e]=F(e),n.memberOrder.push({kind:"property",key:e});continue}if(!i.isPropertyAssignment(r)||!i.isIdentifier(r.name)&&!i.isStringLiteral(r.name)){const e=n.extraMembers.push(r.getText(t))-1;n.memberOrder.push({kind:"extra",index:e});continue}const e=L(r.initializer,t);if(void 0===e)return;const s=r.name.getText(t);n.properties[s]=e,n.memberOrder.push({kind:"property",key:s})}return n}function J(e,t){const n=" ".repeat(t);if("array"===e.kind){if(0===e.value.length)return"[]";const i=" ".repeat(t+1);return`[\n${e.value.map(e=>{const n=J(e,t+1).split("\n");if(n[n.length-1]=`${n.at(-1)},`,"literal"===e.kind)for(let e=1;e<n.length;e+=1)n[e]=`${i}${n[e]}`;return n[0]=`${i}${n[0]}`,n.join("\n")}).join("\n")}\n${n}]`}if("literal"===e.kind)return e.value;const i=" ".repeat(t+1),r=new Set,s=function(e){const t=new Map;for(const[n,i]of e.entries())"property"===i.kind&&t.set(i.key,n);return t}(e.value.memberOrder),o=e.value.memberOrder.flatMap((n,o)=>{if("extra"===n.kind)return[z(e.value.extraMembers[n.index]??"",i)];if(s.get(n.key)!==o)return[];const a=e.value.properties[n.key];return!a||r.has(n.key)?[]:(r.add(n.key),[U(n.key,a,t,i)])});return o.push(...Object.entries(e.value.properties).filter(([e])=>!r.has(e)).map(([e,n])=>U(e,n,t,i))),0===o.length?`{\n${n}}`:`{\n${o.join("\n")}\n${n}}`}function U(e,t,n,i){const r=J(t,n+1).split("\n");if(r[r.length-1]=`${r.at(-1)},`,"literal"===t.kind)for(let e=1;e<r.length;e+=1)r[e]=`${i}${r[e]}`;return r[0]=`${i}${e}: ${r[0]}`,r.join("\n")}function z(e,t){const n=e.split("\n");n[n.length-1]=`${n.at(-1)},`;for(const[e,i]of n.entries())n[e]=`${t}${i}`;return n.join("\n")}const G=["**/node_modules/**","**/.venv/**","**/test-fixtures/**","**/test/fixtures/**","**/dist/**","**/build/**","**/target/**","**/temp/**","**/tmp/**"];async function q(e){return _.functionIgnoringException("fixPrismaEnvFiles",async()=>{const n=function(e){if(!e.depending.prisma)return!1;const t={...e.packageJson?.dependencies,...e.packageJson?.devDependencies};return!t["@prisma/adapter-better-sqlite3"]&&!t["@prisma/adapter-libsql"]}(e),i=await o.glob(["*.env","*.env.*"],{dot:!0,cwd:e.dirPath,ignore:G});for(const r of i){const i=t.resolve(e.dirPath,r),o=await s.readFile(i,"utf8"),a=o.replaceAll(/DATABASE_URL\s*=\s*"?([^"#\n]+?\.sqlite3[^"#\n]*)"?/g,(e,t)=>`DATABASE_URL="${H(t,n)}"`);a!==o&&await s.writeFile(i,a)}})}function H(e,t){const n=e.indexOf("?"),i=-1!==n?e.slice(0,n):e,r=-1!==n?e.slice(n+1):"",s=new URLSearchParams(r);s.delete("connection_limit"),t&&s.set("connection_limit","1");const o=s.toString();return o?`${i}?${o}`:i}const Y=(e,t)=>Object.prototype.hasOwnProperty.call(e,t);function K(e,t){let n,i,r;"function"==typeof t?i=t:n=t;const s={},o=[...n??[],...Object.keys(e).sort(i)];for(r of o)Y(e,r)&&(s[r]=e[r]);return s}const V=/^(?:( )+|\t+)/,X="space";function Z(e,t,n){return e&&t===X&&1===n}function Q(e,t){const n=new Map;let i,r,s=0;for(const o of e.split(/\n/g)){if(!o)continue;const e=o.match(V);if(null===e)s=0,i="";else{const o=e[0].length,a=e[1]?X:"tab";if(Z(t,a,o))continue;a!==i&&(s=0),i=a;let c=1,l=0;const p=o-s;if(s=o,0===p)c=0,l=1;else{const e=Math.abs(p);if(Z(t,a,e))continue;r=ee(a,e)}const d=n.get(r);n.set(r,void 0===d?[1,0]:[d[0]+c,d[1]+l])}}return n}function ee(e,t){return(e===X?"s":"t")+String(t)}function te(e){if("string"!=typeof e)throw new TypeError("Expected a string");let t=Q(e,!0);0===t.size&&(t=Q(e,!1));const n=function(e){let t,n=0,i=0;for(const[r,[s,o]]of e)(s>n||s===n&&o>i)&&(n=s,i=o,t=r);return t}(t);let i,r=0,s="";var o;return void 0!==n&&(({type:i,amount:r}={type:"s"===(o=n)[0]?X:"tab",amount:Number(o.slice(1))}),s=function(e,t){return(e===X?" ":"\t").repeat(t)}(i,r)),{amount:r,type:i,indent:s}}function ne(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 ie=e=>(t,...n)=>e.reduce((e,t)=>t(e,...n),t),re=e=>t=>Array.isArray(t)?e(t):t,se=e=>t=>Array.isArray(t)&&t.every(e=>"string"==typeof e)?e(t):t,oe=se(e=>[...new Set(e)]),ae=se(e=>e.toSorted()),ce=ie([oe,ae]),le=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,pe=(e,t)=>{const n=le(i=>(t&&(i=Object.fromEntries(Object.entries(i).map(([e,t])=>[e,n(t)]))),K(i,e)));return n},de=Object.groupBy||((e,t)=>{const n=Object.create(null);for(const i of e){const e=t(i);n[e]?n[e].push(i):n[e]=[i]}return n}),ue=pe(),fe=pe(["type","url"]),ge=pe(["name","email","url"]),me=pe(["lib","bin","man","doc","example","test"]),ye=(e,t)=>le((n,...i)=>Object.hasOwn(n,e)?{...n,[e]:t(n[e],...i)}:n),he=pe(["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"]),we=e=>{const[t]=e.split(">"),n=[...t.matchAll("@")];if(!n.length||1===n.length&&0===n[0].index)return{name:e};const i=n.pop().index;return{name:t.substring(0,i),range:t.substring(i+1)}},be=pe((e,t)=>{const{name:n,range:i}=we(e),{name:r,range:s}=we(t);return n!==r?n.localeCompare(r,"en"):i?s?a(c(i),c(s)):1:-1}),ve=e=>{const t=e.indexOf("@",e.startsWith("@")?1:0);return-1===t?e:e.slice(0,t)},ke=new Map;function xe(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 ke.has(t)||ke.set(t,e.existsSync("yarn.lock")||e.existsSync(".yarn/")||e.existsSync(".yarnrc.yml")||e.existsSync("pnpm-lock.yaml")||e.existsSync("pnpm-workspace.yaml")),ke.get(t)})())}const je=le((e,t)=>Object.keys(e).length<2?e:xe(t)?K(e,(e,t)=>e.localeCompare(t,"en")):K(e)),$e=ie([pe(["packages","catalog"]),ye("packages",ce),ye("catalog",je)]),Se=ie([pe(["files","excludedFiles","env","parser","parserOptions","settings","plugins","extends","rules","overrides","globals","processor","noInlineConfig","reportUnusedDisableDirectives"]),ye("env",ue),ye("globals",ue),ye("overrides",re(e=>e.map(Se))),ye("parserOptions",ue),ye("rules",pe((e,t)=>e.split("/").length-t.split("/").length||e.localeCompare(t))),ye("settings",ue)]),_e=pe(["description","url","href"]),Pe=ie([le(e=>K(e,[...Object.keys(e).filter(e=>"overrides"!==e).sort(),"overrides"])),ye("overrides",re(e=>e.map(ie([ue,ye("options",ue)]))))]),Ee=pe(["node","npm","yarn"]),Ce=ye("packageManager",pe(["name","version","onFail"])),Oe=ie([pe(["peerDependencyRules","neverBuiltDependencies","onlyBuiltDependencies","onlyBuiltDependenciesFile","allowedDeprecatedVersions","allowNonAppliedPatches","updateConfig","auditConfig","requiredScripts","supportedArchitectures","overrides","patchedDependencies","packageExtensions"],!0),ye("overrides",be)]),Be=new Set(["install","pack","prepare","publish","restart","shrinkwrap","start","stop","test","uninstall","version"]),Ae=(e,t)=>Object.hasOwn(t,"devDependencies")&&Object.hasOwn(t.devDependencies,e),Fe=/(?<=^|[\s&;<>|(])(?:run-s|npm-run-all2? .*(?:--sequential|--serial|-s))(?=$|[\s&;<>|)])/,Re=e=>{if(!Ae("npm-run-all",e)&&!Ae("npm-run-all2",e))return!1;return["scripts","betterScripts"].flatMap(t=>e[t]?Object.values(e[t]):[]).some(e=>{return(t=e).includes("*")&&Fe.test(t);var t})};function Ie(e,t=""){const n=new Map;for(const i of e){const e=(t?i.slice(t.length+1):i).indexOf(":");if(e>0){const r=i.slice(0,(t?t.length+1:0)+e);n.has(r)||n.set(r,[]),n.get(r).push(i)}else n.has(i)||n.set(i,[]),n.get(i).push(i)}return Array.from(n.keys()).sort().flatMap(e=>{const t=n.get(e);if(t.length>1&&t.some(t=>t!==e&&t.startsWith(e+":"))){return[...t.filter(t=>t===e||!t.startsWith(e+":")).sort(),...Ie(t.filter(t=>t.startsWith(e+":")),e)]}return t.sort()})}const De=le((e,t)=>{let n=Object.keys(e);const i=new Set;return n=n.map(e=>{const t=e.replace(/^(?:pre|post)/,"");return Be.has(t)||n.includes(t)?(i.add(t),t):e}),Re(t)||(n=Ie(n)),n=n.flatMap(e=>i.has(e)?[`pre${e}`,e,`post${e}`]:[e]),K(e,n)}),Te=e=>{const{defaultConditions:t=[],restConditions:n=[]}=de(e,e=>"default"===e?"defaultConditions":"restConditions");return[...n,...t]},We=le(e=>{const{paths:t=[],conditions:n=[]}=de(Object.keys(e),e=>e.startsWith(".")?"paths":"conditions");return Object.fromEntries([...t,...Te(n)].map(t=>[t,We(e[t])]))}),Ne=[{key:"$schema"},{key:"name"},{key:"displayName"},{key:"version"},{key:"stableVersion"},{key:"private"},{key:"description"},{key:"categories",over:oe},{key:"keywords",over:oe},{key:"homepage"},{key:"bugs",over:pe(["url","email"])},{key:"repository",over:fe},{key:"funding",over:fe},{key:"license",over:fe},{key:"qna"},{key:"author",over:ge},{key:"maintainers",over:re(e=>e.map(ge))},{key:"contributors",over:re(e=>e.map(ge))},{key:"publisher"},{key:"sideEffects"},{key:"type"},{key:"imports"},{key:"exports",over:We},{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:ue},{key:"man"},{key:"directories",over:me},{key:"files",over:oe},{key:"workspaces",over:$e},{key:"binary",over:pe(["module_name","module_path","remote_path","package_name","host"])},{key:"scripts",over:De},{key:"betterScripts",over:De},{key:"l10n"},{key:"contributes",over:ue},{key:"activationEvents",over:oe},{key:"husky",over:ye("hooks",he)},{key:"simple-git-hooks",over:he},{key:"pre-commit"},{key:"commitlint",over:ue},{key:"lint-staged"},{key:"nano-staged"},{key:"config",over:ue},{key:"nodemonConfig",over:ue},{key:"browserify",over:ue},{key:"babel",over:ue},{key:"browserslist"},{key:"xo",over:ue},{key:"prettier",over:Pe},{key:"eslintConfig",over:Se},{key:"eslintIgnore"},{key:"npmpkgjsonlint",over:ue},{key:"npmPackageJsonLintConfig",over:ue},{key:"npmpackagejsonlint",over:ue},{key:"release",over:ue},{key:"remarkConfig",over:ue},{key:"stylelint"},{key:"ava",over:ue},{key:"jest",over:ue},{key:"jest-junit",over:ue},{key:"jest-stare",over:ue},{key:"mocha",over:ue},{key:"nyc",over:ue},{key:"c8",over:ue},{key:"tap",over:ue},{key:"oclif",over:pe(void 0,!0)},{key:"resolutions",over:ue},{key:"overrides",over:je},{key:"dependencies",over:je},{key:"devDependencies",over:je},{key:"dependenciesMeta",over:pe((e,t)=>{const n=ve(e),i=ve(t);return n<i?-1:n>i?1:0},!0)},{key:"peerDependencies",over:je},{key:"peerDependenciesMeta",over:pe(void 0,!0)},{key:"optionalDependencies",over:je},{key:"bundledDependencies",over:ce},{key:"bundleDependencies",over:ce},{key:"extensionPack",over:ce},{key:"extensionDependencies",over:ce},{key:"flat"},{key:"packageManager"},{key:"engines",over:ue},{key:"engineStrict",over:ue},{key:"devEngines",over:Ce},{key:"volta",over:Ee},{key:"languageName"},{key:"os"},{key:"cpu"},{key:"preferGlobal",over:ue},{key:"publishConfig",over:ue},{key:"icon"},{key:"badges",over:re(e=>e.map(_e))},{key:"galleryBanner",over:ue},{key:"preview"},{key:"markdown"},{key:"pnpm",over:Oe}],Le=Ne.map(({key:e})=>e),Me=ie(Ne.map(({key:e,over:t})=>t?ye(e,t):void 0).filter(Boolean));function Je(e,t={}){return function(e,t){if("string"==typeof e){const{indent:n,type:i}=te(e),r="\n"===e.slice(-1)?"\n":"",s=ne(e);e=JSON.parse(e);let o=JSON.stringify(t(e),null,"tab"===i?"\t":n)+r;return"\r\n"===s&&(o=o.replace(/\n/g,s)),o}return t(e)}(e,le(e=>{let n=t.sortOrder||Le;if(Array.isArray(n)){const t=Object.keys(e),{privateKeys:i=[],publicKeys:r=[]}=de(t,e=>"_"===e[0]?"privateKeys":"publicKeys");n=[...n,...Le,...r.sort(),...i.sort()]}return Me(K(e,n),e)}))}async function Ue(n){return _.functionIgnoringException("fixTestDirectoriesUpdatingPackageJson",async()=>{await Promise.all(n.map(async n=>{const i=t.join(n,"package.json");if(!e.existsSync(i))return;const r=t.join(n,"test");for(const s of["__tests__","tests"]){const o=t.join(n,s);try{await ze(o,r);const t=JSON.parse(await e.promises.readFile(i,"utf8"));let n=!1;const a=t.scripts??{};for(const[e,t]of Object.entries(a)){const i=t.replaceAll(s,"test");t!==i&&(a[e]=i,n=!0)}if(t.scripts=a,!n)return;await P.generateFile(i,JSON.stringify(Je(t),void 0,2))}catch{}}}))})}async function ze(n,i){if(!e.existsSync(i))return void await e.promises.rename(n,i);const r=await e.promises.readdir(n,{withFileTypes:!0});await Promise.all(r.map(async r=>{const s=t.join(n,r.name),o=t.join(i,r.name),a=e.existsSync(o)?await e.promises.stat(o):void 0;r.isDirectory()&&a?.isDirectory()?await ze(s,o):await e.promises.rename(s,o)})),await e.promises.rm(n,{recursive:!0})}async function Ge(e,n){return _.functionIgnoringException("fixTypeDefinitions",async()=>{const i=t.resolve(e.dirPath,"@types"),r=e.isRoot&&e.doesContainSubPackageJsons?void 0:t.resolve(e.dirPath,"src","types"),o=await $(()=>s.readdir(i,{withFileTypes:!0}));if(o)for(const e of o){const o=e.name.slice(0,-5),a=e.name.endsWith(".d.ts");let c=a?o:e.name;c.includes("__")&&(c=`@${c.replace("__","/")}`);const l=n.some(e=>e.packageJson?.dependencies?.[c]||e.packageJson?.devDependencies?.[c]);e.isFile()&&a?l?(await s.mkdir(t.join(i,o),{recursive:!0}),await E.run(()=>s.rename(t.join(i,e.name),t.join(i,o,"index.d.ts")))):r&&(await s.mkdir(r,{recursive:!0}),await E.run(()=>s.rename(t.join(i,e.name),t.join(r,e.name)))):e.isDirectory()&&r&&!l&&(await s.mkdir(r,{recursive:!0}),await E.run(()=>$(()=>s.rename(t.join(i,e.name,"index.d.ts"),t.join(r,`${e.name}.d.ts`)))))}})}function qe(e,t){return t}function He(e,t,n){const i=[...e];for(const[r,s]of t.entries())void 0===i[r]?i[r]=Ye(s,n):Ke(e[r],n)&&Ke(s,n)?i[r]=l(e[r],s,n):e.includes(s)||i.push(s);return i}function Ye(e,t){return Ke(e,t)?t.cloneUnlessOtherwiseSpecified(e,t):e}function Ke(e,t){return!!e&&"object"==typeof e&&t.isMergeableObject(e)}function Ve(e){const t=Object.entries(e).toSorted(([e],[t])=>e.localeCompare(t));for(const[n,i]of t)delete e[n],e[n]=i,i&&"object"==typeof i&&!Array.isArray(i)&&Ve(i);return e}const Xe={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"}}},Ze={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"}}},Qe={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"}}}};async function et(n){return _.functionIgnoringException("generateWorkflow",async()=>{if(tt(n.repository))return;const i=t.resolve(n.dirPath,".github","workflows");await e.promises.mkdir(i,{recursive:!0});const r=t.resolve(n.dirPath,".github","semantic.yml");await E.run(()=>e.promises.rm(r,{force:!0,recursive:!0}));const s=await e.promises.readdir(i,{withFileTypes:!0});for(const n of s)n.isFile()&&nt(n.name)&&await E.run(()=>e.promises.rm(t.join(i,n.name),{force:!0}));const o=new Set(["test.yml","autofix.yml","semantic-pr.yml","close-comment.yml",...s.filter(e=>e.isFile()&&e.name.endsWith(".yml")&&!nt(e.name)).map(e=>e.name)]);n.depending.semanticRelease&&o.add("release.yml");for(const e of o){const r=t.basename(e,".yml");await E.run(()=>it(n,i,r))}})}function tt(e){return e?.endsWith("/reusable-workflows")??!1}function nt(e){return/^gen-pr(?:-.+)?\.ya?ml$/u.test(e)}async function it(n,i,r){const s=t.join(i,`${r}.yml`),o=e.existsSync(t.join(i,"deploy-production.yml"));if("autofix"===r)return void await st(function(e){if(!e.isPublicRepo)return structuredClone(Ze);const t=e.isBun?"bun":"yarn",n=[{uses:"actions/checkout@v6"},{uses:"actions/setup-node@v6",with:{"check-latest":!0,"node-version":"lts/*"}},...e.isBun?[{uses:"oven-sh/setup-bun@v2",with:{"bun-version":"latest"}}]:[],{run:`${t} install`},{run:`${t} run cleanup`}];e.packageJson?.scripts?.build&&n.push({run:`${t} run build`});n.push({uses:"autofix-ci/action@v1"});const i=structuredClone(Xe),r=i.jobs.autofix??{"runs-on":"ubuntu-latest"};return i.jobs.autofix={...r,steps:n},i}(n),s);let a=structuredClone(r in Qe?Qe[r]:{});try{const t=await e.promises.readFile(s,"utf8"),n=p.load(t);a=l.all([a,n,a],{arrayMerge:He})}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/")&&(rt(n,e,r),c=!0);if(c){switch(r){case"release":if(a.on?.schedule)delete a.on.push;else{if(!(a.on?.push&&n.release.branches.length>0))return void await e.promises.rm(t.join(i,"release.yml"),{force:!0});a.on.push.branches=n.release.branches}n.isPublicRepo?(a.permissions??={},a.permissions["id-token"]="write"):delete a.permissions?.["id-token"];break;case"test":a.on?.pull_request&&delete a.on.pull_request["paths-ignore"],a.on?.push&&(delete a.on.push["paths-ignore"],a.on.push.branches=a.on.push.branches.filter(e=>"renovate/**"!==e))}if(await st(a,s),"sync"===r){if(await e.promises.rm(t.join(i,"sync-init.yml"),{force:!0}),!a.jobs.sync?.with)return;a.jobs["sync-force"]=a.jobs.sync;const n=a.jobs.sync.with.sync_params_without_dest;if("string"!=typeof n)return;a.jobs.sync.with.sync_params_without_dest=`--force ${n}`,a.name="Force to Sync",a.on={workflow_dispatch:null},delete a.jobs.sync,await st(a,t.join(i,"sync-force.yml"))}}}function rt(e,t,n){if(t.with??={},t.secrets??={},delete t.secrets.NPM_TOKEN,"test"!==n&&"release"!==n||(t.secrets.GH_TOKEN="${{ secrets.GITHUB_TOKEN }}"),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?Ve(t.with):delete t.with,Object.keys(t.secrets).length>0){const e=Ve(t.secrets);delete t.secrets,t.secrets=e}else delete t.secrets}async function st(t,n){const i=p.dump(t,{lineWidth:-1,noCompatMode:!0,styles:{"!!null":"empty"}}).replaceAll(/[ \t]+$/gm,"");await e.promises.writeFile(n,i)}async function ot(e){return _.functionIgnoringException("fixTypos",async()=>{if(tt(e.repository))return;const n=e.dirPath,i=await o.glob("**/*.md",{dot:!0,cwd:n,ignore:G});S.isVerbose&&console.info(`Found ${i.length} markdown files in ${n}`);for(const r of i){const i=t.join(n,r);E.run(async()=>{const t=await P.readFileIgnoringError(i);if(void 0===t)return;let n=at(t);n=ct(n,e,"doc"),t!==n&&await P.generateFile(i,n)})}const r=await o.glob(["{app,src,test,scripts}/**/*.{cjs,mjs,js,jsx,cts,mts,ts,tsx}","packages/**/{app,src,test,scripts}/**/*.{cjs,mjs,js,jsx,cts,mts,ts,tsx}"],{dot:!0,cwd:n,ignore:G});S.isVerbose&&console.info(`Found ${r.length} TypeScript files in ${n}`);for(const i of r){const r=t.join(n,i);E.run(async()=>{const t=await P.readFileIgnoringError(r);if(void 0===t)return;let n=t.replaceAll(/\/\*[\s\S]*?\*\//g,e=>at(e)).replaceAll(/(^|\s)\/\/(.*?)c\.f\./g,"$1//$2cf.").replaceAll(/(^|\s)\/\/(.*?)eg\./g,"$1//$2e.g.").replaceAll(/(^|\s)\/\/(.*?)ie\./g,"$1//$2i.e.");n=ct(n,e,"ts"),t!==n&&await P.generateFile(r,n)})}const s=await o.glob("**/*.{csv,htm,html,tsv,xml,yaml,yml}",{dot:!0,cwd:n,ignore:G});S.isVerbose&&console.info(`Found ${s.length} text-based files in ${n}`);for(const i of s){const r=t.join(n,i);E.run(async()=>{const t=await P.readFileIgnoringError(r);if(void 0===t)return;let n=at(t);n=ct(n,e,"text"),t!==n&&await P.generateFile(r,n)})}await E.promiseAll()})}function at(e){return e.replaceAll(/\bc\.f\.(?=\s|$)/g,"cf.").replaceAll(/\beg\.(?=\s|$)/g,"e.g.").replaceAll(/\bie\.(?=\s)/g,"i.e.")}function ct(e,t,n){for(const[n,i]of Object.entries(t.wbfyJson?.typos?.all??{}))e=e.replaceAll(n,i);for(const[i,r]of Object.entries(t.wbfyJson?.typos?.[n]??{}))e=e.replaceAll(i,r);return e}const lt="wb prisma",pt="wb db",dt=1048576,ut=["**/*.{cjs,cts,js,json,jsx,md,mdc,mjs,mts,sh,tsx,ts,toml,txt,yaml,yml}","**/.env","**/.env.*","**/.github/workflows/*","**/.gitignore","**/.dockerignore","**/Dockerfile","**/Dockerfile.*","**/Makefile","**/mise.toml","**/.mise.toml","**/lefthook.yml","**/package.json"];async function ft(e){if("WillBooster"===e.repoAuthor&&"shared"===e.repoName)return;const t=await o(ut,{absolute:!0,cwd:e.dirPath,dot:!0,ignore:["**/.git/**",...G],onlyFiles:!0});await Promise.all(t.map(e=>E.run(()=>async function(e){const t=await async function(e){const t=await s.stat(e);if(t.size>dt)return;const n=await s.readFile(e);return n.includes(0)?void 0:n.toString("utf8")}(e);if(!t?.includes(lt))return;await P.generateFile(e,t.replaceAll(lt,pt))}(e))))}async function gt(e,n){return _.functionIgnoringException("generateAgentInstructions",async()=>{if(!e.isRoot)return;const i=t.resolve(e.dirPath,"AGENTS_EXTRA.md"),r=await P.readFileIgnoringError(i);for(const[i,s]of[["AGENTS.md","Codex CLI"],["CLAUDE.md","Claude Code"],["GEMINI.md","Gemini CLI"]]){const o=mt(e,n,s,r),a=t.resolve(e.dirPath,i);await E.run(()=>P.generateFile(a,o))}const s=t.resolve(e.dirPath,".cursor/rules/general.mdc"),o=function(e,t,n){const i="---\ndescription: General Coding Rules\nglobs:\nalwaysApply: true\n---",r=mt(e,t,"Cursor",n);return`${i}\n\n${r}`}(e,n,r);await E.run(()=>P.generateFile(s,o))})}function mt(e,t,n,i){const r=A(e),s=`\n## Project Information\n\n- Name: \`${e.packageJson?.name||"unknown"}\`\n- Description: ${e.packageJson?.description}\n- Package Manager: ${r}\n\n## General Instructions\n\n- Create a new branch if the current branch is \`main\`.\n- Run any \`git\` commands sequentially.\n- Write tests ONLY if explicitly requested. If requested, follow these rules:\n - Continue modifying tests and/or code until all tests pass.\n - Ensure tests are idempotent and independent (e.g., reset persistent data) so they can run repeatedly or in parallel.\n - Prefer actual API calls over mocks, unless actual calls are impractical, have unintended side effects, or mocks are explicitly requested.\n - Always investigate the root cause of a test failure before fixing it.\n - Avoid adding wait functions in E2E tests unless strictly necessary.\n- When fixing issues, follow these rules:\n - Investigate the root cause first (e.g., by gathering debug logs, taking screenshots, etc.).\n - Fix the actual root cause instead of applying workarounds.\n- After making code changes, run \`${r} verify-full\` to execute all tests (takes up to 1 hour), or \`${r} verify\` for only type checking and linting (takes up to 10 minutes).\n - If you are confident that your changes will not break any tests, you may use \`verify\`.\n - Use \`oxlint\` ignore comments with reasons (e.g., \`// oxlint-disable-next-line <rule> -- <reason>\`) if lint errors or warnings cannot be fixed.\n- Once you have verified your changes, commit and push them to the current (non-main) branch, then create a PR via \`gh\`.\n - Follow the conventional commits; your commit message should start with \`feat:\`, \`fix:\`, etc.\n - If not specified, make sure to add a new line at the end of your commit message${e.isWillBoosterRepo?` with: \`Co-authored-by: WillBooster (${n}) <agent@willbooster.com>\``:""}.\n - Always create new commits. Avoid using \`--amend\`.\n- Always use heredoc syntax when passing multi-line content to any command.\n- Put temporary files in the \`.tmp\` or \`/tmp\` directory.\n${o=t,o.some(e=>e.depending.playwrightTest)?`- Use \`${r} wb start --mode test\` to launch a web server for debugging or testing.`:""}\n\n${yt(t)}\n`.replaceAll(/\.\n\n+-/g,".\n-").replaceAll(/\n{3,}/g,"\n\n").trim();var o;const a=i?.trim().startsWith("#");return s+(i?a?"\n\n"+i.trim():"\n"+i:"")}function yt(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 above the functions they call to maintain a clear top-down order.\n - e.g., \`function caller() { callee(); } function callee() { ... }\`\n - Unlike functions, place variable and type declarations ABOVE their usage.\n- Write comments and JSDoc for complex or hard-to-understand code.\n - Explain "why" in comments and "what" in JSDoc.\n - Avoid stating what can be easily 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 a pre-computable array literal of strings.\n- Assume that all environment variables are properly defined.\n - If validation is required, use \`assert\` to fail fast (e.g., during startup).\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\n${e.some(e=>e.depending.react||e.depending.next)?"- Prefer lambda over `function` for React components, e.g., `const Button: React.FC = () => {`.\n- Prefer `useImmer` for storing an array or an object to `useState`.\n- Allow `autoFocus` to minimize user effort.":""}\n${e.some(e=>e.depending.next)?"\n- Since this project uses the React Compiler, you do not need to use `useCallback` or `useMemo` for performance optimization.\n- Assume there is only a single server instance.\n":""}\n`.replaceAll(/\.\n\n+-/g,".\n-").replaceAll(/\n{3,}/g,"\n\n").trim()}const ht=["@exercode/problem-utils","@willbooster/agent-skills","@willbooster/babel-configs","@willbooster/monaco-loader","@willbooster/monaco-react","@willbooster/oxfmt-config","@willbooster/oxlint-config","@willbooster/prettier-config","@willbooster/renovate-config","@willbooster/shared-lib","@willbooster/shared-lib-blitz-next","@willbooster/shared-lib-next","@willbooster/shared-lib-node","@willbooster/shared-lib-react","@willbooster/wb","agent-runtime-kit","at-decorators","build-ts","gen-i18n-ts","one-way-git-sync","@typescript/native-preview","@typescript/native-preview-darwin-arm64","@typescript/native-preview-darwin-x64","@typescript/native-preview-linux-arm","@typescript/native-preview-linux-arm64","@typescript/native-preview-linux-x64","@typescript/native-preview-win32-arm64","@typescript/native-preview-win32-x64","oxfmt","@oxfmt/binding-android-arm-eabi","@oxfmt/binding-android-arm64","@oxfmt/binding-darwin-arm64","@oxfmt/binding-darwin-x64","@oxfmt/binding-freebsd-x64","@oxfmt/binding-linux-arm-gnueabihf","@oxfmt/binding-linux-arm-musleabihf","@oxfmt/binding-linux-arm64-gnu","@oxfmt/binding-linux-arm64-musl","@oxfmt/binding-linux-ppc64-gnu","@oxfmt/binding-linux-riscv64-gnu","@oxfmt/binding-linux-riscv64-musl","@oxfmt/binding-linux-s390x-gnu","@oxfmt/binding-linux-x64-gnu","@oxfmt/binding-linux-x64-musl","@oxfmt/binding-openharmony-arm64","@oxfmt/binding-win32-arm64-msvc","@oxfmt/binding-win32-ia32-msvc","@oxfmt/binding-win32-x64-msvc","oxlint","@oxlint/binding-android-arm-eabi","@oxlint/binding-android-arm64","@oxlint/binding-darwin-arm64","@oxlint/binding-darwin-x64","@oxlint/binding-freebsd-x64","@oxlint/binding-linux-arm-gnueabihf","@oxlint/binding-linux-arm-musleabihf","@oxlint/binding-linux-arm64-gnu","@oxlint/binding-linux-arm64-musl","@oxlint/binding-linux-ppc64-gnu","@oxlint/binding-linux-riscv64-gnu","@oxlint/binding-linux-riscv64-musl","@oxlint/binding-linux-s390x-gnu","@oxlint/binding-linux-x64-gnu","@oxlint/binding-linux-x64-musl","@oxlint/binding-openharmony-arm64","@oxlint/binding-win32-arm64-msvc","@oxlint/binding-win32-ia32-msvc","@oxlint/binding-win32-x64-msvc","oxlint-tsgolint","@oxlint-tsgolint/darwin-arm64","@oxlint-tsgolint/darwin-x64","@oxlint-tsgolint/linux-arm64","@oxlint-tsgolint/linux-x64","@oxlint-tsgolint/win32-arm64","@oxlint-tsgolint/win32-x64","@next/env","@next/font","@next/rspack-binding-linux-arm64-gnu","@next/rspack-binding-linux-arm64-musl","@next/rspack-binding-linux-x64-gnu","@next/rspack-binding-linux-x64-musl","@next/swc-android-arm-eabi","@next/swc-android-arm64","@next/swc-darwin-arm64","@next/swc-darwin-x64","@next/swc-freebsd-x64","@next/swc-linux-arm-gnueabihf","@next/swc-linux-arm64-gnu","@next/swc-linux-arm64-musl","@next/swc-linux-x64-gnu","@next/swc-linux-x64-musl","@next/swc-wasm-nodejs","@next/swc-wasm-web","@next/third-parties","next","react","react-dom"];async function wt(n){return _.functionIgnoringException("generateBunfigToml",async()=>{const i=t.resolve(n.dirPath,"bunfig.toml"),r=e.existsSync(i)?e.readFileSync(i,"utf8"):void 0,s=bt(r);await E.run(()=>P.generateFile(i,s))})}const bt=e=>{const t=function(e){if(!e)return;try{return d(e)}catch{return}}(e);return`env = false\ntelemetry = false\n\n${function(e){return"boolean"==typeof e?.run?.bun?`[run]\nbun = ${e.run.bun}\n`:""}(t)}\n[install]\nexact = ${!1===t?.install?.exact?"false":"true"}\nlinker = "hoisted"\nminimumReleaseAge = 432000 # 5 days\nminimumReleaseAgeExcludes = [\n${ht.map(e=>` "${e}",`).join("\n")}\n]\n`};const vt="# Project-specific settings",kt=/# Project-specific settings[^\n]*\n/gm,xt="# Generated by wbfy",jt=`${vt} (head)\n\n\n${xt}\n`,$t=`\n${vt} (tail)\n`,St={separator:xt,separatorPrefix:"# Generated by ",defaultHeadUserContent:jt,defaultTailUserContent:$t,async readGitignoreWithoutSeparators(t){try{let n=await e.promises.readFile(t,"utf8");const i=_t(n);return i>0&&(n=n.slice(0,i-1)),n.replaceAll(kt,"").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(kt,`${vt} (head)\n`):jt},getTailUserContent(e){const t=_t(e);return t>0?e.slice(t-1):$t},async isBerryZeroInstallEnabled(t){try{return(await e.promises.readFile(t,"utf8")).includes("\n!.yarn/cache")}catch{return!1}}};function _t(e){const t=e.indexOf(vt),n=e.lastIndexOf(vt);return n>t?n:-1}async function Pt(n){return _.functionIgnoringException("generateDockerignore",async()=>{const i=t.resolve(n.dirPath,".dockerignore");if(n.doesContainDockerfile){const e=await P.readFileIgnoringError(i)??"",t=St.getHeadUserContent(e)+"\n**/.idea\n**/*.sqlite3*\n**/.yarn/install-state.gz\n**/.venv\n"+St.getTailUserContent(e);await E.run(()=>P.generateFile(i,t))}else await e.promises.rm(i,{force:!0})})}const Et={codeWith2IndentSize:["cjs","mjs","js","jsx","cts","mts","ts","tsx","json","json5","jsonc","cpp","dart","htm","html","pu","puml","rb","vue","xml","yaml","yml","sh"].toSorted(),codeWith4IndentSize:["go","gradle","java","py"].toSorted(),markdownLike:["md"].toSorted(),oxlint:["astro","cjs","cts","js","jsx","mjs","mts","svelte","ts","tsx","vue"].toSorted(),oxfmt:["astro","cjs","css","cts","gql","graphql","hbs","htm","html","js","json","json5","jsonc","jsx","less","md","mdx","mjs","mts","scss","svelte","toml","ts","tsx","vue","yaml","yml"].toSorted(),prettierOnly:["java"].toSorted()},Ct=`root = true\n\n[*]\ncharset = utf-8\nend_of_line = lf\ninsert_final_newline = true\ntrim_trailing_whitespace = true\n\n${Bt(Et.codeWith2IndentSize)}\nindent_size = 2\nindent_style = space\n\n${Bt(Et.codeWith4IndentSize)}\nindent_size = 4\nindent_style = space\n\n${Bt(Et.markdownLike)}\nmax_line_length = off\ntrim_trailing_whitespace = false\n\n[{Makefile,*.mk}]\nindent_style = tab\n`;async function Ot(e){return _.functionIgnoringException("generateEditorconfig",async()=>{const n=t.resolve(e.dirPath,".editorconfig");await E.run(()=>P.generateFile(n,Ct))})}function Bt(e){return e.length>1?`[*.{${e.join(",")}}]`:`[*.${e[0]}]`}const At={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 Ft(n,i){return _.functionIgnoringException("generateGeminiConfig",async()=>{if(!n.isRoot)return;const r=t.resolve(n.dirPath,".gemini"),s=t.resolve(r,"config.yml"),o=t.resolve(r,"styleguide.md"),a=t.resolve(n.dirPath,"AGENTS_EXTRA.md");let c=structuredClone(At);try{const t=await e.promises.readFile(s,"utf8"),n=p.load(t);c=l.all([c,n,c],{arrayMerge:qe})}catch{}const d=p.dump(c,{lineWidth:-1,noCompatMode:!0,styles:{"!!null":"empty"}}),u=await P.readFileIgnoringError(a),f=u?.trimStart().startsWith("#")?void 0:u,g=`${n.isPublicRepo?"Review in English based on the following coding standards.":"以下のコーディング規約を踏まえて、日本語でレビューしてください。"}\n\n${yt(i)}${f?`\n${f.trimEnd()}`:""}`,m=[E.run(()=>P.generateFile(s,d)),E.run(()=>P.generateFile(o,g))];await Promise.all(m)})}async function Rt(n){return _.functionIgnoringException("generateGeminiSettings",async()=>{if(!n.isRoot)return;const i=t.resolve(n.dirPath,".gemini"),r=t.resolve(i,"settings.json");await e.promises.rm(r,{force:!0})})}const It=`* text=auto\n\n*.lockb binary diff=lockb\n*.vcproj text eol=crlf\n\n${[...Et.codeWith2IndentSize,...Et.codeWith4IndentSize,...Et.markdownLike].map(e=>`*.${e} text eol=lf`).join("\n")}\n\ndist/** linguist-generated=true\n`;async function Dt(e){return _.functionIgnoringException("generateGitattributes",async()=>{const n=t.resolve(e.dirPath,".gitattributes");await E.run(()=>P.generateFile(n,It))})}const Tt=["windows","macos","linux","jetbrains","visualstudiocode","emacs","vim","yarn"];async function Wt(e,n){return _.functionIgnoringException("generateGitignore",async()=>{const i=t.resolve(e.dirPath,".gitignore"),r=await P.readFileIgnoringError(i)??"";let s=St.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.wb/\n__generated__/\n@willbooster/\ndist/\ndrizzle/mount/\ntemp/\ntmp/\n";const o=St.getTailUserContent(r),a=[...Tt];e.doesContainGemfile&&a.push("ruby"),e.doesContainGoMod&&(a.push("go"),s+=`${t.basename(e.dirPath)}\n`),e.doesContainPackageJson&&a.push("node"),e.doesContainPomXml&&(a.push("maven"),s+=".idea/google-java-format.xml\n"),e.doesContainPubspecYaml&&(a.push("flutter","AndroidStudio","ruby"),s+=".flutter-plugins-dependencies\nandroid/key.properties\nios/.bundle\n.idea/runConfigurations.xml\n"),e.doesContainTemplateYaml&&(s+=".aws-sam/\npackaged.yaml\n"),(e.doesContainPoetryLock||e.doesContainUvLock)&&(a.push("python"),s+=".venv/\n"),e.depending.blitz&&(s+=".blitz/\n.blitz**\n"),e.depending.next&&a.push("nextjs"),(n.depending.firebase||e.depending.firebase)&&a.push("firebase"),e.depending.prisma&&(s+="*.sqlite3*\n"),e.depending.playwrightTest&&(s+="playwright-report/\ntest-results/\n"),(n.depending.reactNative||e.depending.reactNative)&&(a.push("reactnative"),s+="google-services.json\nandroid/app/src/main/assets/\n"),e.depending.storybook&&a.push("storybookjs"),e.depending.litestream&&(s+="gcp-sa-key.json\n");let c="";for(const e of a){let t=await Mt(e)??"";if(!t){const n=`https://www.toptal.com/developers/gitignore/api/${e}`,i=await fetch(n),r=await i.text();if(!i.ok||r.includes("Attention Required!")||r.includes("<title>"))return void console.error(`Failed to fetch ${n}`);t=r.trim(),await E.run(()=>Lt(e,t)),S.isVerbose&&console.info(`Fetched ${n}`)}c&&(c+="\n"),c+=t+"\n"}await St.isBerryZeroInstallEnabled(i)||(c=c.replace("!.yarn/cache","# !.yarn/cache").replace("# .pnp.*",".pnp.*")),(e.doesContainPomXml||e.doesContainPubspecYaml)&&(c=c.replaceAll(/^# .idea\/artifacts$/gm,".idea/artifacts").replaceAll(/^# .idea\/compiler.xml$/gm,".idea/compiler.xml").replaceAll(/^# .idea\/jarRepositories.xml$/gm,".idea/jarRepositories.xml").replaceAll(/^# .idea\/modules.xml$/gm,".idea/modules.xml").replaceAll(/^# .idea\/*.iml$/gm,".idea/*.iml").replaceAll(/^# .idea\/modules$/gm,".idea/modules").replaceAll(/^# *.iml$/gm,"*.iml").replaceAll(/^# *.ipr$/gm,"*.ipr"),e.doesContainPubspecYaml&&(c=c.replaceAll(/^.idea\/modules.xml$/gm,"# .idea/modules.xml"))),c=c.replaceAll(/^.idea\/?$/gm,"# .idea"),(n.depending.reactNative||e.depending.reactNative||e.doesContainPubspecYaml)&&(c=c.replaceAll(/^(.idea\/.+)$/gm,"$1\nandroid/$1"));const l=s+"\n"+c+o;await E.run(()=>P.generateFile(i,l))})}const Nt=t.join(u.homedir(),".cache","wbfy","gitignore");async function Lt(n,i){await e.promises.mkdir(Nt,{recursive:!0}),await e.promises.writeFile(t.join(Nt,n),i)}async function Mt(n){try{const i=await e.promises.stat(t.join(Nt,n));if(Date.now()-i.mtimeMs>216e5)return;return await e.promises.readFile(t.join(Nt,n),"utf8")}catch{}}const Jt="$ProjectFileDir$/node_modules/.bin/oxfmt",Ut="$ProjectFileDir$/node_modules/.bin/prettier";async function zt(n){return _.functionIgnoringException("generateIdeaSettings",async()=>{const i=t.resolve(n.dirPath,".idea");if(e.existsSync(i)){const r=t.resolve(i,"watcherTasks.xml");await(O(n)||B(n)?E.run(()=>P.generateFile(r,function(e){const t=[{args:"--write --no-error-on-unmatched-pattern !**/package.json",condition:O(e),extensions:Et.oxfmt,name:"Oxfmt",program:Jt},{args:"--cache --write",condition:B(e),extensions:Et.prettierOnly,name:"Prettier",program:Ut}].filter(e=>e.condition).flatMap(e=>e.extensions.map(t=>{return n=e.program,i=e.args,r=e.name,` <TaskOptions isEnabled="true">\n <option name="arguments" value="${i} $FilePathRelativeToProjectRoot$" />\n <option name="checkSyntaxErrors" value="false" />\n <option name="description" />\n <option name="exitCodeBehavior" value="ERROR" />\n <option name="fileExtension" value="${s=t}" />\n <option name="immediateSync" value="false" />\n <option name="name" value="${r} (.${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="${n}" />\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`;var n,i,r,s}));return`<?xml version="1.0" encoding="UTF-8"?>\n<project version="4">\n <component name="ProjectTasksOptions">\n ${t.join("")}\n </component>\n</project>\n`}(n))):E.run(()=>e.promises.rm(r,{force:!0})))}})}function Gt(e,t){if(e.depending.genI18nTs&&t?.["gen-i18n-ts"])return(e.isBun?"bun":"yarn")+" run gen-i18n-ts > /dev/null"}function qt(e,t,n,i=0){Ht(e,t,n,i)}function Ht(e,t,n,i=0){do{const[r,s,o]=Kt(e,t,n),a=f.spawnSync(r,s,o).status??1;if(0===a)break;if(i<=0)return a}while(--i>=0);return 0}function Yt(e,t,n){const[i,r,s]=Kt(e,t,n);s.stdio="pipe";const o=f.spawnSync(i,r,s),a=o.stderr??"",c="string"==typeof a?a.trim():a.toString().trim();o.error?console.error(`${i} [${r.map(e=>`"${e}"`).join(", ")}] failed with: ${o.error.message}`):c&&console.error(`${i} [${r.map(e=>`"${e}"`).join(", ")}] outputs the following content to stderr:\n${c}`);const l=o.stdout??"";return"string"==typeof l?l.trim():l.toString().trim()}function Kt(e,t,n){const i={...process.env};return i.PATH&&i.BERRY_BIN_FOLDER&&(i.PATH=i.PATH.split(":").filter(e=>e!==i.BERRY_BIN_FOLDER).join(":")),[e,t,{cwd:n,env:i,encoding:"utf8",shell:!1,stdio:"inherit"}]}const Vt=new class{getOrgAndName(e){const t=e.split(":").at(-1),n=t?.split("/");return[n?.at(-2)??"",n?.at(-1)?.replace(/.git$/,"")??""]}},Xt=new Map;function Zt(e){const t=e??"",n=Xt.get(t);if(n)return n;const i=new y({auth:en(e)||void 0});return Xt.set(t,i),i}function Qt(e){return!!en(e)}function en(e){return"WillBooster"===e?process.env.GH_BOT_PAT_FOR_WILLBOOSTER||nn():"WillBoosterLab"===e?process.env.GH_BOT_PAT_FOR_WILLBOOSTERLAB||nn():process.env.GH_BOT_PAT_FOR_WILLBOOSTER||process.env.GH_BOT_PAT_FOR_WILLBOOSTERLAB||process.env.GH_TOKEN||process.env.GITHUB_TOKEN||nn()}let tn;function nn(){if(void 0!==tn)return tn||void 0;try{tn=f.execFileSync("gh",["auth","token"],{encoding:"utf8",stdio:["ignore","pipe","ignore"]}).trim()||""}catch{tn=""}return tn||void 0}const rn=["@tsconfig/bun","@tsconfig/node-lts","@tsconfig/node-ts","@tsconfig/react-native"];function sn(e){return e.isWillBoosterConfigs&&!e.isRoot&&!0!==e.packageJson?.private&&Array.isArray(e.packageJson?.files)&&e.packageJson.files.length>0}const on=["@willbooster/oxfmt-config","@willbooster/oxlint-config","oxfmt","oxlint","oxlint-tsgolint"],an="@typescript/native-preview",cn="typescript",ln="@willbooster/wb",pn="build-ts",dn=function(){let n=t.dirname(g(import.meta.url));for(;;){const i=t.join(n,"package.json");if(e.existsSync(i)){const t=JSON.parse(e.readFileSync(i,"utf8"));if("@willbooster/wbfy"===t.name)return t}const r=t.dirname(n);if(r===n)throw new Error("Could not find @willbooster/wbfy package.json");n=r}}(),un={...dn.dependencies,...dn.devDependencies,...dn.peerDependencies},fn=new Set([ln,pn,...on]),gn=["@willbooster/prettier-config",...on.filter(e=>e.startsWith("@willbooster/"))],mn=["@biomejs/biome","@eslint-react/eslint-plugin","@eslint/js","@next/eslint-plugin-next","@types/eslint","@types/micromatch","@typescript-eslint/eslint-plugin","@typescript-eslint/parser","@willbooster/biome-config","@willbooster/eslint-config","@willbooster/eslint-config-blitz-next","@willbooster/eslint-config-js","@willbooster/eslint-config-js-react","@willbooster/eslint-config-next","@willbooster/eslint-config-react","@willbooster/eslint-config-ts","@willbooster/eslint-config-ts-react","biome","eslint","eslint-config-flat-gitignore","eslint-config-next","eslint-config-prettier","eslint-import-resolver-node","eslint-import-resolver-typescript","eslint-plugin-import","eslint-plugin-import-x","eslint-plugin-perfectionist","eslint-plugin-prettier","eslint-plugin-react","eslint-plugin-react-compiler","eslint-plugin-react-hooks","eslint-plugin-sort-class-members","eslint-plugin-sort-destructure-keys","eslint-plugin-storybook","eslint-plugin-unicorn","eslint-plugin-unused-imports","globals","micromatch","typescript-eslint"],yn=new Set(["micromatch","@types/micromatch"]),hn=/\bfrom\s+['"]micromatch['"]|\brequire\(\s*['"]micromatch['"]\s*\)|\bimport\(\s*['"]micromatch['"]\s*\)/u,wn=new Map,bn=["dependencies","devDependencies","optionalDependencies","peerDependencies"];async function vn(n,r,s){return _.functionIgnoringException("generatePackageJson",async()=>{await async function(n,r,s){const a=t.resolve(n.dirPath,"package.json"),c=await async function(t){const n=await e.promises.readFile(t,"utf8"),i=JSON.parse(n);return i.scripts=i.scripts??{},i.dependencies=i.dependencies??{},i.devDependencies=i.devDependencies??{},i.peerDependencies=i.peerDependencies??{},i}(a),p=n.isBun?"bun":"yarn";await async function(n,i){"WillBooster LLC"===i.author&&(i.author="WillBooster Inc.");(function(e,n){const i=n.name||t.basename(e.dirPath);for(const e of En(n))Reflect.deleteProperty(e,i)})(n,i),function(e,t){if(!e.isWillBoosterConfigs)return;for(const e of En(t))for(const[t,n]of Object.entries(e))n&&Rn(n)&&(e[t]=Cn(t))}(n,i),delete i.scripts["sort-package-json"],delete i.scripts["sort-all-package-json"],delete i.scripts["check-all-for-ai"],delete i.scripts["check-for-ai"],delete i.scripts["typecheck/warn"],delete i.scripts["typecheck:gen-code"],delete i.scripts["typecheck:codegen"],delete i.dependencies.tslib,delete i.devDependencies["@willbooster/renovate-config"],delete i.devDependencies["@willbooster/tsconfig"],n.depending.next||delete i.devDependencies[cn];delete i.devDependencies.lerna,delete i.devDependencies.pinst,delete i.scripts["flutter-format"],delete i.scripts["format-flutter"],delete i.scripts["python-format"],delete i.scripts["format-python"],delete i.scripts.prettier,delete i.scripts["check-all"],delete i.scripts["verify-code"],delete i.scripts["verify-code-with-tests"],await E.run(()=>e.promises.rm(t.resolve(n.dirPath,"lerna.json"),{force:!0})),function(e,t){if(!e.isWillBoosterConfigs)return;const n=En(t);for(const e of gn)for(const t of n)Reflect.deleteProperty(t,e)}(n,i),function(n,i){const r=function(n){return n.isWillBoosterConfigs&&!n.isRoot||function(n){const i=o.globSync("src/**/*.{js,jsx,mjs,cjs,ts,tsx,mts,cts}",{cwd:n,dot:!0,ignore:G});return i.some(i=>{try{return hn.test(e.readFileSync(t.resolve(n,i),"utf8"))}catch{return!1}})}(n.dirPath)}(i);for(const e of mn)r&&yn.has(e)||Bn(n,i,e)||(delete n.dependencies[e],delete n.devDependencies[e],delete n.peerDependencies[e])}(i,n)}(n,c),await async function(n,i){(function(e){for(const[t,n]of Object.entries(e))"string"==typeof n&&(n.includes("git clone")||(e[t]=n.replaceAll(/yarn\s*(?:install\s*)?&&\s*/gu,"")))})(i.scripts),i.scripts={...i.scripts,...Tn(n,i.scripts)},delete i.scripts["start-test-server"];const r=i.scripts;n.isBun||!B(n)?delete r.prettify:r.prettify=(r.prettify??"")+await async function(n){const i=t.resolve(n,".prettierignore"),r=await e.promises.readFile(i,"utf8").catch(()=>""),s=r.indexOf(St.separatorPrefix);if(-1===s)return"";const o=r.slice(0,s);return`${o.split("\n").map(e=>{const t=e.trim();return t.endsWith("/")?t.slice(0,-1):t}).filter(e=>e&&!e.startsWith("#")&&!e.includes("/")).map(e=>` "!**/${e}/**"`).join("")} || true`}(n.dirPath);(function(e){for(const[t,n]of Object.entries(e))n?.includes("yarn workspaces foreach")&&(e[t]=n.replaceAll(/yarn workspaces foreach(?!\s+(?:-A|-R|--(?:all|recursive|since|worktree|from|include|exclude|public|private)))/gu,"yarn workspaces foreach --all"))})(r),function(e,t){if(e.isBun||!t.railway?.includes("@railway/cli"))return;t.railway="YARN_ENABLE_SCRIPTS=true yarn dlx @railway/cli"}(n,r)}(n,c),function(e){for(const t of[ln,pn])e.dependencies[t]&&(e.devDependencies[t]??=e.dependencies[t],delete e.dependencies[t])}(c);const d=await async function(n,r,s){const a=[],c=["sort-package-json"],p=[],d=B(n);!d||e.existsSync(t.join(r.dirPath,".prettierrc.json"))||e.existsSync(t.join(n.dirPath,".prettierrc.json"))||(s.prettier="@willbooster/prettier-config",c.push("prettier-plugin-java","@willbooster/prettier-config"));d?c.push("prettier"):function(e){delete e.prettier;const t=[e.dependencies,e.devDependencies,e.peerDependencies];for(const e of t)e&&(delete e.prettier,delete e["prettier-plugin-java"],delete e["prettier-plugin-prisma"],delete e["@willbooster/prettier-config"],delete e["@types/prettier"])}(s);if(delete s.devDependencies["lint-staged"],delete s["lint-staged"],n.isRoot){if(delete s.devDependencies.husky,delete s.scripts.postinstall,delete s.scripts.postpublish,delete s.scripts.prepublishOnly,delete s.scripts.prepack,delete s.scripts.postpack,s.scripts.prepare="lefthook install || true",c.push("lefthook"),n.depending.semanticRelease&&(s.devDependencies["semantic-release"]||s.devDependencies["multi-semantic-release"]||s.devDependencies["@qiwi/multi-semantic-release"]||c.push("semantic-release"),s.version="0.0.0-semantically-released"),n.depending.playwrightTest){s.dependencies.artillery||s.devDependencies.artillery||s.dependencies["@playwright/test"]||c.push("@playwright/test"),delete s.dependencies.playwright,delete s.devDependencies.playwright}n.doesContainSubPackageJsons?s.workspaces=Array.isArray(s.workspaces)?l.all([s.workspaces,["packages/*"]],{arrayMerge:He}):["packages/*"]:Array.isArray(s.workspaces)&&(s.workspaces=s.workspaces.filter(e=>o.globSync(e,{dot:!0,cwd:n.dirPath,ignore:G}).length>0),0===s.workspaces.length&&delete s.workspaces)}Nn(s)||c.push(ln);(s.dependencies[pn]||s.devDependencies[pn]||Object.values(s.scripts).some(e=>e?.includes(pn)))&&c.push(pn);O(n)&&c.push(...on);const u=O(n)?function(e){return e.depending.blitz||e.depending.next?[]:e.isBun?["@tsconfig/bun"]:e.depending.reactNative?["@tsconfig/react-native"]:["@tsconfig/node-lts","@tsconfig/node-ts"]}(n):[];await async function(n,r,s){const a=new Set(s),c=await async function(n){const r=new Set,s=await o.glob("**/tsconfig*.json",{cwd:n.dirPath,dot:!0,ignore:G});for(const o of s){const s=t.resolve(n.dirPath,o);try{const t=i.parseConfigFileTextToJson(s,await e.promises.readFile(s,"utf8"));if(t.error)return console.warn(`Preserve managed @tsconfig dependencies because ${s} could not be parsed: ${_n(t.error)}`),new Set(rn);for(const e of Pn(t.config?.extends))for(const t of rn)(e===t||e.startsWith(`${t}/`))&&r.add(t)}catch(e){return console.warn(`Preserve managed @tsconfig dependencies because ${s} could not be read: ${e instanceof Error?e.message:String(e)}`),new Set(rn)}}return r}(n);for(const e of rn)if(!a.has(e)&&!c.has(e))for(const t of En(r))Reflect.deleteProperty(t,e)}(n,s,u),c.push(...u),(n.doesContainTypeScript||n.doesContainTypeScriptInPackages)&&(c.push(an),n.depending.next&&c.push(cn),n.isBun?c.push("@types/bun"):n.depending.reactNative||c.push("@types/node"),(s.dependencies.jest||s.devDependencies.jest||s.dependencies["@jest/globals"]||s.devDependencies["@jest/globals"]||s.dependencies["ts-jest"]||s.devDependencies["ts-jest"])&&c.push("@types/jest"));if(n.isWillBoosterConfigs)return{dependencies:a.filter(e=>!e.includes("@willbooster/")),devDependencies:c.filter(e=>!e.includes("@willbooster/")),pythonDevDependencies:p};return{dependencies:a,devDependencies:c,pythonDevDependencies:p}}(n,r,c);await async function(n,i,r,s){r.name||(r.name=t.basename(n.dirPath));n.doesContainSubPackageJsons&&(r.private=!0);r.license||(r.license="UNLICENSED");!r.private&&"UNLICENSED"!==r.license&&i.isPublicRepo&&(r.publishConfig??={},r.publishConfig.access??="public");const[a]=Vt.getOrgAndName(n.repository??"");"WillBooster"!==a&&"WillBoosterLab"!==a||(r.author="WillBooster Inc.");await async function(n,i){if(!sn(n))return;const r=t.resolve(n.dirPath,"config.mjs");if(!e.existsSync(r))return;i.type="module";const s=t.resolve(n.dirPath,"config.d.ts");if(!e.existsSync(s))return;i.files=[...new Set([...i.files??[],"config.d.mts"])],await E.run(()=>P.generateFile(t.resolve(n.dirPath,"config.d.mts"),xn))}(n,r),n.isRoot||!r.private||r.main||(r.main="./src");if(delete r.resolutions?.["npm/chalk"],!n.doesContainSubPackageJsons){if(!n.isBun)if(n.doesContainJavaScript||n.doesContainTypeScript)r.scripts["lint-fix"]=r.scripts["lint-fix"]??"yarn lint --fix";else{delete r.scripts.lint,delete r.scripts["lint-fix"];for(const e of["cleanup"]){const t=r.scripts[e];t&&(r.scripts[e]=t.replace(/ ?&& ?yarn lint-fix(?: --quiet)?/,""))}}if(n.doesContainPubspecYaml){r.scripts.lint="flutter analyze",r.scripts["lint-fix"]="yarn lint";const i=["lib","test","test_driver"].filter(i=>e.existsSync(t.resolve(n.dirPath,i)));i.length>0&&(r.scripts["format-code"]=`dart format $(find ${i.join(" ")} -name generated -prune -o -name '*.freezed.dart' -prune -o -name '*.g.dart' -prune -o -name '*.dart' -print)`,r.scripts.format=kn(r.scripts.format,n))}const i=jn(n);if(i){"poetry install"===r.scripts.postinstall&&delete r.scripts.postinstall,r.scripts["common/ci-setup"]=`yarn setup-${i}`,delete r.scripts["setup-"+("poetry"===i?"uv":"poetry")],delete r.scripts["setup-poetry-asdf"],r.scripts[`setup-${i}`]="uv"===i?"uv sync --frozen":"poetry config virtualenvs.in-project true && poetry env use $(mise current python) && poetry run pip install --upgrade pip && poetry install";const e=await o.glob("**/*.py",{cwd:n.dirPath,dot:!0,ignore:G}),t=new Set;for(const n of e){const[e,i]=n.split("/");e&&i&&t.add(e)}if(t.size>0){const e=[...t].join(" "),o=`${i} run`;r.scripts["format-code"]=`${o} isort --profile black ${e} && ${o} black ${e}`,r.scripts.lint?r.scripts.lint=`${o} flake8 ${e} && ${r.scripts.lint}`:(r.scripts.lint=`${o} flake8 ${e}`,r.scripts["lint-fix"]="yarn lint"),r.scripts.format=kn(r.scripts.format,n),s.pythonDevDependencies.push("black","isort","flake8")}}}(n.repository||r.repository)&&(r.repository=function(e,t){const n=In(e);if(n)return Dn(n,e,t);const i=In(t);if(i)return Dn(i,t);return e}(n.repository??r.repository,r.repository));const c=r.scripts["gen-code"];c?.includes("No code generation needed")?delete r.scripts["gen-code"]:function(e,t){return e.depending.blitz||e.depending.chakra||e.depending.prisma||e.depending.drizzle&&!!t?.includes("drizzle-kit check")}(n,c)&&(r.scripts["gen-code"]=(n.isBun?"bun --bun ":"")+"wb gen-code");(function(e,t){const n=Gt(e,t.scripts);if(!n)return;const i=t.scripts.postinstall;i?i.includes(n)||(t.scripts.postinstall=`${i} && ${n}`):t.scripts.postinstall=n})(n,r),r.dependencies.prettier||delete r.devDependencies["@types/prettier"]}(n,r,c,d),function(e,t){const n=e.dependencies,i=e.devDependencies;t.dependencies=Sn(n,t.dependencies),t.devDependencies=t.devDependencies.filter(e=>!n[e]),t.devDependencies=Sn(i,t.devDependencies)}(c,d),await async function(e){const t=new Set([...Object.keys(e.dependencies),...Object.keys(e.devDependencies)]),n=[{packageName:"@willbooster/auth",repo:"auth",target:"dependencies"},{packageName:"@discord-bot/shared",repo:"discord-bot",target:"dependencies"},{packageName:"@willbooster/code-analyzer",repo:"code-analyzer",target:"devDependencies"},{packageName:"@willbooster/judge",repo:"judge",target:"dependencies"},{packageName:"@willbooster/llm-proxy",repo:"llm-proxy",target:"dependencies"}];await Promise.all(n.map(async({packageName:n,repo:i,target:r})=>{if(!t.has(n)||function(e,t){return(e.devDependencies?.[t]||e.dependencies?.[t]||"").includes("workspace")}(e,n))return;const s="dependencies"===r?"devDependencies":"dependencies";Reflect.deleteProperty(e[s],n),e[r][n]=await async function(e){const t=await function(e,t){try{const n=Yt("git",["ls-remote",`git@github.com:${e}/${t}.git`,"HEAD"],process.cwd()).split(/\s+/)[0];if(!n)throw new Error(`No commits found for ${e}/${t}`);return Promise.resolve(n)}catch(n){return Promise.reject(new Error(`Failed to fetch commits for ${e}/${t}: ${String(n)}`))}}("WillBoosterLab",e);return`git@github.com:WillBoosterLab/${e}.git#${t}`}(i)}))}(c),function(e){for(const t of bn){const n=e[t];n&&0===Object.keys(n).length&&Reflect.deleteProperty(e,t)}}(c),n.isBun&&delete c.packageManager;await P.generateFile(a,function(e){return JSON.stringify(Je(e),void 0,2)}(c)),s||(function(e,t,n,i){const r=n.dependencies.filter(e=>!t.devDependencies?.[e]);$n(e,i,t.dependencies??{},r,!1);const s=n.devDependencies.filter(e=>!t.dependencies?.[e]);$n(e,i,t.devDependencies??{},s,!0);const o=jn(e);if(o&&n.pythonDevDependencies.length>0){const t=[...new Set(n.pythonDevDependencies)];"poetry"===o?qt("poetry",["add","--group","dev",...t],e.dirPath):qt("uv",["add","--dev",...t],e.dirPath)}}(n,c,d,p),function(e,n,i){const r=t.relative(e.dirPath,i);if(!r)return;qt("bun"===n?"bunx":n,["sort-package-json",r],e.dirPath)}(n,p,a))}(n,r,s)})}function kn(e,t){const n=t.isBun?"bun run":"yarn";return e?`${e} && ${n} format-code`:`${n} format-code`}const xn="export { default } from './config.js';\n";function jn(e){return e.doesContainUvLock?"uv":e.doesContainPoetryLock?"poetry":void 0}function $n(e,t,n,i,r){if(0===i.length)return;const s=[...new Set(i.map(e=>function(e,t){if(t&&!Rn(t))return`${e}@${t}`;return On(e)}(e,n[e])))];qt(t,["add",...r?["-D"]:[],...e.isBun?["--exact"]:[],...s],e.dirPath)}function Sn(e,t){const n=[];for(const i of new Set(t)){const t=An(i,e[i]);t&&n.push(i),e[i]&&!t&&"*"!==e[i]||(e[i]=Cn(i))}return n}function _n(e){return i.flattenDiagnosticMessageText(e.messageText,"\n")}function Pn(e){return"string"==typeof e?[e]:Array.isArray(e)?e.filter(e=>"string"==typeof e):[]}function En(e){return bn.map(t=>e[t]).filter(e=>!!e)}function Cn(e){const t=function(e){return fn.has(e)?un[e]:void 0}(e);if(t)return t;const n=wn.get(e);if(n)return n;const i=function(e){return Yt("npm",["show",On(e),"version","--workspaces=false"],process.cwd())||"*"}(e);return wn.set(e,i),i}function On(e){return e===an?`${e}@beta`:e}function Bn(e,t,n){return!!sn(t)&&(!!e.peerDependencies[n]||"@types/eslint"===n&&!!e.peerDependencies.eslint)}function An(e,t){return!t||("*"===t||(!!Rn(t)||(e===an||fn.has(e))&&Fn(e,t)))}function Fn(e,t){const n=Cn(e),i=m.valid(n),r=m.valid(t);return!i||!r||m.gt(i,r)}function Rn(e){return e.startsWith("workspace:")}function In(e){if("string"==typeof e){if(!e.startsWith("github:"))return;const[t,n]=Vt.getOrgAndName(e);if(!t||!n)return;return`git+https://github.com/${t}/${n}.git`}const t=e?.url;if("string"!=typeof t)return;const n=/^(?:git\+)?https:\/\/github\.com\/([^/]+)\/([^/]+?)(?:\.git)?$/u.exec(t);if(!n)return;const[,i,r]=n;return`git+https://github.com/${i}/${r}.git`}function Dn(e,t,n){return{..."object"==typeof t?t:"object"==typeof n?n:void 0,type:"git",url:e}}function Tn(e,t){if(e.isBun){const n=e.doesContainTypeScript||e.doesContainTypeScriptInPackages,i={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",verify:"bun --bun wb verify","verify-full":"bun --bun wb verify --full"};return Wn(e,i,"bun --bun wb db"),Ln(e,i,t,["build","dev","start","test","typecheck"]),n?e.depending.pyright&&(i.typecheck+=" && pyright"):delete i.typecheck,i}{const n=e.doesContainTypeScript||e.doesContainTypeScriptInPackages,i=O(e),r=B(e),s=t.test;let o={cleanup:"yarn format && yarn lint-fix",format:zn(i,r),lint:"oxlint --no-error-on-unmatched-pattern .","lint-fix":"yarn lint --fix","format-code":"oxfmt --write --no-error-on-unmatched-pattern . '!**/package.json'",typecheck:"tsgo --noEmit"};return r&&(o.prettify=`prettier --cache --no-error-on-unmatched-pattern --write "**/{.*/,}*.{${Et.prettierOnly.join(",")}}" "!**/test{-,/}fixtures/**"`),e.doesContainSubPackageJsons?(o=l({...o},{format:`${o.format} && yarn workspaces foreach --all --parallel --verbose run format`,lint:"yarn workspaces foreach --all --parallel --verbose run lint","lint-fix":"yarn workspaces foreach --all --parallel --verbose run lint-fix",test:"CI=1 yarn workspaces foreach --all --verbose run test",typecheck:"yarn workspaces foreach --all --parallel --verbose run typecheck"}),r&&(o.prettify=`prettier --cache --no-error-on-unmatched-pattern --write "**/{.*/,}*.{${Et.prettierOnly.join(",")}}" "!**/packages/**" "!**/test{-,/}fixtures/**"`)):e.depending.pyright&&(o.typecheck=o.typecheck?`${o.typecheck} && `:"",o.typecheck+="pyright"),s?.includes("wb test")&&(o.test=s),i||(delete o["format-code"],delete o.lint,delete o["lint-fix"]),n?e.depending.wb&&(o.typecheck="wb typecheck"):delete o.typecheck,Nn(e.packageJson)?(o.verify=t.verify??'yarn workspace @willbooster/wb start --working-dir "$INIT_CWD" verify',o["verify-full"]=t["verify-full"]??"yarn verify --full"):(o.verify="wb verify",o["verify-full"]="wb verify --full"),Wn(e,o,"wb db"),Ln(e,o,t,["build","dev","start","test","typecheck"]),o}}function Wn(e,t,n){(e.depending.prisma||e.depending.drizzle)&&(t["db-create-migration"]=`${n} migrate-dev`,t["db-migrate"]=`${n} migrate --check-idempotency`,t["db-view"]=`${n} studio`)}function Nn(e){return e?.name===ln}function Ln(e,t,n,i){for(const r of i)Mn(e,r)&&(Jn(e,r)||(!n[r]||Un(n[r],r)||r in t)&&(t[r]=`mise run ${r}`))}function Mn(e,t){return Object.hasOwn(e.miseTasks,t)}function Jn(e,t){const n=e.miseTasks[t];if(!n)return!1;return["bun","yarn","npm","pnpm"].some(e=>{return new RegExp(String.raw`\b${e}\s+(?:run\s+)?${i=t,i.replaceAll(/[.*+?^${}()|[\]\\]/g,String.raw`\$&`)}(?![a-zA-Z0-9_\-:.])`,"u").test(n);var i})}function Un(e,t){return e===`mise run ${t}`}function zn(e,t){const n=["sort-package-json"];return e&&n.push("yarn format-code"),t&&n.push("yarn prettify"),n.join(" && ")}const Gn={glob_matcher:"doublestar","post-merge":{jobs:[{name:"prepare",script:"prepare.sh",runner:"bash"}]},"pre-push":{jobs:[{name:"check",script:"check.sh",runner:"bash"}]}},qn={jobs:[{name:"cleanup",glob:"",run:"",stage_fixed:!0},{name:"check-migrations",glob:"**/migration.sql",run:'\nfailed=0\n# Lefthook expands {staged_files} as shell-escaped args, so paths with spaces stay intact.\nfor file in {staged_files}; do\n if grep -q \'Warnings:\' "$file"; then\n echo "Migration SQL file ($file) contains warnings! Please solve the warnings and commit again."\n failed=1\n fi\ndone\nexit "$failed"\n'.trim()}]},Hn='\n#!/bin/bash\n\nchanged_files="$(git diff-tree -r --name-only --no-commit-id ORIG_HEAD HEAD)"\n\nrun_if_changed() {\n if echo "$changed_files" | grep --quiet -E "$1"; then\n eval "$2"\n fi\n}\n'.trim();async function Yn(n){return _.functionIgnoringException("generateLefthookUpdatingPackageJson",async()=>{await async function(n){const i=t.resolve(n.dirPath,".lefthook"),r=t.resolve(n.dirPath,".husky"),s=e.existsSync(r),{lint:o}=Tn(n,{}),a={...Gn,"pre-commit":{jobs:Kn(n)}};o||delete a["pre-push"];await Promise.all([e.promises.writeFile(t.join(n.dirPath,"lefthook.yml"),p.dump(a,{lineWidth:-1,noCompatMode:!0,styles:{"!!null":"empty"}})),e.promises.rm(i,{force:!0,recursive:!0})]),s&&(await Promise.all([e.promises.rm(r,{force:!0,recursive:!0}),e.promises.rm(t.resolve(n.dirPath,".huskyrc.json"),{force:!0})]),qt("git",["config","--unset","core.hooksPath"],n.dirPath));if(o){const r=function(e){let t;t=e.isBun?"bun --bun wb lint":e.depending.wb?"yarn wb lint":"yarn run lint";const n=`${t} --quiet`;if(e.repository?.startsWith("github:WillBoosterLab/"))return`\n#!/bin/bash\n\nif [ $(git branch --show-current) = "main" ] && [ $(git config user.email) != "exkazuu@gmail.com" ]; then\n echo "************************************************"\n echo "*** Don't push main branch directly. Use PR! ***"\n echo "************************************************"\n exit 1\nfi\n\n${n}\n`.trim();return n}(n);e.mkdirSync(t.join(i,"pre-push"),{recursive:!0}),await e.promises.writeFile(t.join(i,"pre-push","check.sh"),r+"\n",{mode:493})}const c=`${Hn}\n\n${function(e){const t=[];if(e.hasVersionSettings){const e=String.raw`(mise\.toml|\.mise\.toml|\.tool-versions|\..+-version)`;t.push(String.raw`run_if_changed "${e}" "mise install"`)}const n=e.isBun?"bun install":"yarn",i=e.depending.blitz||e.depending.next?" && rm -Rf .next":"";t.push(String.raw`run_if_changed "package\.json" "${n}${i}"`),e.doesContainPoetryLock&&t.push(String.raw`run_if_changed "poetry\.lock" "poetry install"`);e.doesContainUvLock&&t.push(String.raw`run_if_changed "uv\.lock" "uv sync --frozen"`);e.depending.blitz?t.push(String.raw`run_if_changed ".*\.prisma" "node node_modules/.bin/blitz prisma migrate deploy"`,String.raw`run_if_changed ".*\.prisma" "node node_modules/.bin/blitz prisma generate"`,String.raw`run_if_changed ".*\.prisma" "node node_modules/.bin/blitz codegen"`):e.depending.prisma&&t.push(String.raw`run_if_changed ".*\.prisma" "node node_modules/.bin/dotenv -c development -- node node_modules/.bin/prisma migrate deploy"`,String.raw`run_if_changed ".*\.prisma" "node node_modules/.bin/dotenv -c development -- node node_modules/.bin/prisma generate"`);const r=Gt(e,e.packageJson?.scripts);r&&t.push(String.raw`run_if_changed "(^|/)i18n/.*\.json$" "${r}"`);return t}(n).join("\n")}\n`;e.mkdirSync(t.join(i,"post-merge"),{recursive:!0}),await e.promises.writeFile(t.resolve(i,"post-merge","prepare.sh"),c,{mode:493})}(n)})}function Kn(e){return qn.jobs.map(t=>"cleanup"===t.name?{...t,glob:Vn(e),run:Xn(e)}:t)}function Vn(e){const t=e.isBun||e.depending.wb||B(e)?[...Et.prettierOnly]:[];O(e)&&t.push(...Et.oxfmt,...Et.oxlint),(e.doesContainPoetryLock||e.doesContainUvLock)&&t.push("py"),e.doesContainPubspecYaml&&t.push("dart");return`**/*.{${[...new Set(t)].toSorted().join(",")}}`}function Xn(n){if(function(n){if(!n.isRoot)return!1;const i=t.resolve(n.dirPath,"packages","wb","package.json");if(!e.existsSync(i))return!1;try{return"@willbooster/wb"===JSON.parse(e.readFileSync(i,"utf8")).name}catch{return!1}}(n))return String.raw`
|
|
2
2
|
# Lefthook expands {staged_files} as shell-escaped args, so paths with spaces stay intact.
|
|
3
3
|
yarn workspace @willbooster/wb start --working-dir "$(git rev-parse --show-toplevel)" lint --fix --format -- {staged_files}
|
|
4
|
-
`.trim();const i=O(n)||B(n);if((n.isBun||n.depending.wb)&&i)return`\n# Lefthook expands {staged_files} as shell-escaped args, so paths with spaces stay intact.\n${n.isBun?"bun --bun wb":"yarn wb"} lint --fix --format -- {staged_files}\n`.trim();const r=
|
|
4
|
+
`.trim();const i=O(n)||B(n);if((n.isBun||n.depending.wb)&&i)return`\n# Lefthook expands {staged_files} as shell-escaped args, so paths with spaces stay intact.\n${n.isBun?"bun --bun wb":"yarn wb"} lint --fix --format -- {staged_files}\n`.trim();const r=Et.oxlint.map(e=>String.raw`\.${e}$`).join("|"),s=Et.oxfmt.map(e=>String.raw`\.${e}$`).join("|"),o=Et.prettierOnly.map(e=>String.raw`\.${e}$`).join("|"),a=O(n),c=B(n);return String.raw`
|
|
5
5
|
# Lefthook expands {staged_files} as shell-escaped args, so paths with spaces stay intact.
|
|
6
6
|
${a?String.raw`oxlint_files="$(printf '%s\n' {staged_files} | grep -E '(${r})' || true)"`:""}
|
|
7
7
|
${a?String.raw`oxfmt_files="$(printf '%s\n' {staged_files} | grep -E '(${s})' | grep -v -E '(^|/)package\.json$' || true)"`:""}
|
|
8
8
|
${c?String.raw`prettier_files="$(printf '%s\n' {staged_files} | grep -E '(${o})' || true)"`:""}
|
|
9
9
|
package_json_files="$(printf '%s\n' {staged_files} | grep -E '(^|/)package\.json$' || true)"
|
|
10
|
-
${
|
|
10
|
+
${Zn(n)?String.raw`python_files="$(printf '%s\n' {staged_files} | grep -E '\.py$' || true)"`:""}
|
|
11
11
|
${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)"`:""}
|
|
12
12
|
|
|
13
13
|
${a?String.raw`
|
|
@@ -26,7 +26,7 @@ fi
|
|
|
26
26
|
if [ -n "$package_json_files" ]; then
|
|
27
27
|
node node_modules/.bin/sort-package-json -- $package_json_files
|
|
28
28
|
fi
|
|
29
|
-
${
|
|
29
|
+
${Zn(n)?`if [ -n "$python_files" ]; then\n ${Qn(n)} isort --profile black --filter-files $python_files\n ${Qn(n)} black $python_files\n ${Qn(n)} flake8 $python_files\nfi`:""}
|
|
30
30
|
${n.doesContainPubspecYaml?'if [ -n "$dart_files" ]; then\n dart format $dart_files\nfi':""}
|
|
31
|
-
`.trim()}function qn(e){return e.doesContainPoetryLock||e.doesContainUvLock}function Hn(e){return e.doesContainUvLock?"uv run":"poetry run"}async function Yn(t){return _.functionIgnoringException("generateLintstagedrc",async()=>{await Promise.all([C.run(()=>e.promises.rm(`${t.dirPath}/.lintstagedrc.cjs`,{force:!0})),C.run(()=>e.promises.rm(`${t.dirPath}/.lintstagedrc.js`,{force:!0})),C.run(()=>e.promises.rm(`${t.dirPath}/.lintstagedrc.json`,{force:!0}))])})}function Kn(e){return e?.trim()}class Vn{constructor(e){this.blockNames=e.blockNames,this.markerPrefix=e.markerPrefix,this.toolName=e.toolName}getConfigContent(e){return e.existingContent&&this.hasManagedBlocks(e.existingContent)?this.replaceManagedBlocks(e.existingContent,e.desiredContent,e.filePath):e.desiredContent}getBlock(e,t){return`${this.getStartMarker(e)}\n${t}\n${this.getEndMarker(e)}`}hasManagedBlocks(e){return this.blockNames.some(t=>e.includes(this.getStartMarker(t)))}replaceManagedBlocks(e,t,n){let i=e;for(const r of this.blockNames){const s=this.extractManagedBlock(t,r);if(!s)continue;const o=this.replaceManagedBlock(i,r,s);if(!o)return console.warn(`Skipped updating incomplete ${r} block in ${this.toolName} config: ${n}`),e;i=o}return i}extractManagedBlock(e,t){return this.getManagedBlockRegExp(t).exec(e)?.[0]}replaceManagedBlock(e,t,n){const i=this.getManagedBlockRegExp(t);if(i.test(e))return e.replace(i,n)}getManagedBlockRegExp(e){return new RegExp(`${Xn(this.getStartMarker(e))}[\\s\\S]*?${Xn(this.getEndMarker(e))}`)}getStartMarker(e){return`// wbfy:start ${this.markerPrefix}-${e}`}getEndMarker(e){return`// wbfy:end ${this.markerPrefix}-${e}`}}function Xn(e){return e.replaceAll(/[.*+?^${}()|[\]\\]/g,String.raw`\$&`)}const Zn=new Vn({blockNames:["base","export"],markerPrefix:"oxfmt",toolName:"oxfmt"});async function Qn(n){return _.functionIgnoringException("generateOxfmtConfig",async()=>{const i=t.resolve(n.dirPath,".oxfmtrc.json"),r=t.resolve(n.dirPath,"oxfmt.config.ts"),s=await P.readFileIgnoringError(r),o=Zn.getConfigContent({desiredContent:ei(n),existingContent:s,filePath:r}),a=[C.run(()=>e.promises.rm(i,{force:!0}))];Kn(s)!==Kn(o)&&a.push(C.run(()=>P.generateFile(r,o))),await Promise.all(a)})}function ei(e){return e.isEsmPackage?`${Zn.getBlock("base","import config from '@willbooster/oxfmt-config';")}\n\n${Zn.getBlock("export","export default config;")}\n`:`${Zn.getBlock("base","/// <reference types=\"node\" />\n// oxlint-disable unicorn/prefer-module -- Oxfmt config files are only auto-discovered as .ts, and CommonJS avoids ESM package loading issues.\nconst oxfmtConfig = require('@willbooster/oxfmt-config');\n\nconst oxfmtResolvedConfig = oxfmtConfig.default ?? oxfmtConfig;")}\n\n${Zn.getBlock("export","module.exports = oxfmtResolvedConfig;")}\n`}const ti=new Vn({blockNames:["base","export"],markerPrefix:"oxlint",toolName:"oxlint"});async function ni(n,i){return _.functionIgnoringException("generateOxlintConfig",async()=>{const i=Qt(n),r=t.resolve(n.dirPath,"oxlint.config.ts"),s=await P.readFileIgnoringError(r),o=i&&s&&!ti.hasManagedBlocks(s)?s:ti.getConfigContent({desiredContent:ii(n),existingContent:s,filePath:r}).replaceAll("config.","oxlintResolvedConfig.");const a=[];i||a.push(C.run(()=>e.promises.rm(t.resolve(n.dirPath,".oxlintrc.json"),{force:!0})),C.run(()=>e.promises.rm(t.resolve(n.dirPath,"biome.json"),{force:!0})),C.run(()=>e.promises.rm(t.resolve(n.dirPath,"biome.jsonc"),{force:!0})),C.run(()=>e.promises.rm(t.resolve(n.dirPath,".eslintrc"),{force:!0})),C.run(()=>e.promises.rm(t.resolve(n.dirPath,".eslintrc.cjs"),{force:!0})),C.run(()=>e.promises.rm(t.resolve(n.dirPath,".eslintrc.js"),{force:!0})),C.run(()=>e.promises.rm(t.resolve(n.dirPath,".eslintrc.json"),{force:!0})),C.run(()=>e.promises.rm(t.resolve(n.dirPath,".eslintrc.yaml"),{force:!0})),C.run(()=>e.promises.rm(t.resolve(n.dirPath,".eslintrc.yml"),{force:!0})),C.run(()=>e.promises.rm(t.resolve(n.dirPath,"eslint.config.cjs"),{force:!0})),C.run(()=>e.promises.rm(t.resolve(n.dirPath,"eslint.config.js"),{force:!0})),C.run(()=>e.promises.rm(t.resolve(n.dirPath,"eslint.config.mjs"),{force:!0})),C.run(()=>e.promises.rm(t.resolve(n.dirPath,"eslint.config.ts"),{force:!0}))),Kn(s)!==Kn(o)&&a.push(C.run(()=>P.generateFile(r,o))),await Promise.all(a)})}function ii(e){const t=e.isRoot;return e.isEsmPackage?`${ti.getBlock("base",`import oxlintBaseConfig from '@willbooster/oxlint-config';\n\n${ri("oxlintBaseConfig",t)}`)}\n\n${ti.getBlock("export","export default oxlintResolvedConfig;")}\n`:`${ti.getBlock("base",`/// <reference types="node" />\n// oxlint-disable unicorn/prefer-module -- Oxlint only auto-discovers .ts config files, and CommonJS avoids ESM package loading issues.\nconst oxlintBaseConfig = require('@willbooster/oxlint-config');\n\n${ri("oxlintBaseConfig.default ?? oxlintBaseConfig",t)}`)}\n\n${ti.getBlock("export","module.exports = oxlintResolvedConfig;")}\n`}function ri(e,t){return t?`const oxlintResolvedConfig = ${e};`:`// Oxlint only supports type-aware options in the root config, while it\n// still auto-discovers package-local config files in monorepos. Keep this as a\n// plain object copy so package typechecks do not export oxlint's private helper\n// types through the generated config variable.\nconst oxlintResolvedConfig: Record<string, unknown> = { ...${e} };\ndelete oxlintResolvedConfig.options;`}async function si(n){return _.functionIgnoringException("generatePrettierignore",async()=>{const i=t.resolve(n.dirPath,".prettierignore");if(!B(n))return void await C.run(()=>e.promises.rm(i,{force:!0}));const r=await P.readFileIgnoringError(i)??"",s=vt.getHeadUserContent(r),o=vt.getTailUserContent(r),a=t.resolve(n.dirPath,".gitignore"),c=await vt.readGitignoreWithoutSeparators(a)||"";let l="";n.doesContainPubspecYaml&&(l="\nandroid/app/\nios/Runner/Assets.xcassets/\npubspec.yaml\n");const p=s+"\n3rd-party/\nandroid/\nios/\nno-format/\ntest-fixtures/\ntest/fixtures/\n*.d.ts\n*.min.js\n.yarn/\n.pnp.js\n"+l+c+o;await C.run(()=>P.generateFile(i,p))})}const oi={venvPath:".",venv:".venv"};async function ai(n){return _.functionIgnoringException("generatePyrightConfigJson",async()=>{let i=structuredClone(oi);const r=t.resolve(n.dirPath,"pyrightconfig.json");try{const t=await e.promises.readFile(r,"utf8"),n=JSON.parse(t);i=l.all([i,n,i],{arrayMerge:qe})}catch{}const s=JSON.stringify(i,void 0,2);await C.run(()=>P.generateFile(r,s))})}async function ci(e){return _.functionIgnoringException("fixRailwayignore",async()=>{const n=t.resolve(e.dirPath,".railwayignore"),i=await P.readFileIgnoringError(n);if(!i)return;const r=i.replace(/^scripts\/$/m,"scripts/**\n!scripts/\n!scripts/*.sh");r!==i&&await C.run(()=>P.generateFile(n,r))})}async function li(n){return _.functionIgnoringException("generateReadme",async()=>{const i=t.resolve(n.dirPath,"README.md");let r=await e.promises.readFile(i,"utf8");e.existsSync(t.resolve(n.dirPath,".releaserc.json"))&&(r=pi(r,"[](https://github.com/semantic-release/semantic-release)"));const s=n.repository?.slice(n.repository.indexOf(":")+1),o=t.resolve(n.dirPath,".github","workflows"),a=e.existsSync(o)?e.readdirSync(o):[];for(const i of a){if(!i.startsWith("test")&&!i.startsWith("deploy"))continue;let o=i;if(o=(o[0]||"").toUpperCase()+o.slice(1,o.indexOf(".")),o=o.replace("-"," "),!s)continue;const a=`[](https://github.com/${s}/actions/workflows/${i})`;e.existsSync(t.resolve(n.dirPath,`.github/workflows/${i}`))&&(r=di(r,o,i),r=pi(r,a))}await C.run(()=>P.generateFile(i,r))})}function pi(e,t){e=e.replace(t,"").replaceAll(/\n\n\n+/g,"\n\n");for(let n=0;n<e.length;n++)if("\n"===e[n-1]&&"\n"===e[n]){const i=e.slice(0,n+1);let r=e.slice(n+1);return r.startsWith("[")||r.startsWith("!")||(r=`\n${r}`),`${i}${t}\n${r}`}return`${e}\n${t}\n`}function di(e,t,n){const i=ui(t),r=ui(n);return e.replaceAll(new RegExp(String.raw`\[!\[${i}\]\(https://github\.com/[^/\s)]+/[^/\s)]+/actions/workflows/${r}/badge\.svg\)\]\(https://github\.com/[^/\s)]+/[^/\s)]+/actions/workflows/${r}\)\n?`,"gu"),"").replaceAll(/\n\n\n+/g,"\n\n")}function ui(e){return e.replaceAll(/[.*+?^${}()|[\]\\]/g,String.raw`\$&`)}async function fi(n){return _.functionIgnoringException("generateReleaserc",async()=>{const i=t.resolve(n.dirPath,".releaserc.json");if(!e.existsSync(i))return;const r=JSON.parse(await e.promises.readFile(i,"utf8")),s=r.plugins??[];for(let e=0;e<s.length;e++){const t=s[e],n=Array.isArray(t),i=n?t[0]:t,r=n&&t[1]||{};"@semantic-release/commit-analyzer"===i?s[e]=["@semantic-release/commit-analyzer",l.all([r,{preset:"conventionalcommits"}],{arrayMerge:qe})]:"@semantic-release/github"===i&&(s[e]=["@semantic-release/github",l.all([r,{successCommentCondition:!1,failCommentCondition:!1,labels:["r: semantic-release"],releasedLabels:["released :bookmark:"]}],{arrayMerge:qe})])}const o=JSON.stringify(r,void 0,2);await C.run(()=>P.generateFile(i,o))})}const gi={$schema:"https://docs.renovatebot.com/renovate-schema.json",extends:["github>WillBooster/willbooster-configs:renovate.json5"]};async function mi(n){return _.functionIgnoringException("generateRenovateJson",async()=>{let i=structuredClone(gi);const r=t.resolve(n.dirPath,"renovate.json");if(e.existsSync(`${r}5`))return;try{const t=await e.promises.readFile(r,"utf8"),n=JSON.parse(t);i=l.all([i,n,i],{arrayMerge:qe}),i.extends=(s=gi.extends,o=n.extends??[],[...new Set([...s,...o])].filter(e=>"@willbooster"!==e))}catch{}var s,o;n.depending.blitz&&(i.packageRules??=[],i.packageRules.some(e=>e.matchPackageNames?.includes("next"))||i.packageRules.push({matchPackageNames:["next"],enabled:!1})),await C.run(()=>e.promises.rm(t.resolve(n.dirPath,".dependabot"),{force:!0})),await C.run(()=>e.promises.rm(t.resolve(n.dirPath,".renovaterc.json"),{force:!0}));const a=JSON.stringify(i,void 0,2);await C.run(()=>P.generateFile(r,a))})}async function yi(e){return _.functionIgnoringException("installAgentSkills",async()=>{})}const hi={compilerOptions:{alwaysStrict:!0,noUncheckedIndexedAccess:!0,allowSyntheticDefaultImports:!0,esModuleInterop:!0,resolveJsonModule:!0,importHelpers:!1,noEmit:!0},exclude:["packages/*/test/fixtures","test/fixtures"],include:["*.config.ts","packages/*/*.config.ts","packages/*/scripts/**/*","packages/*/src/**/*","packages/*/test/**/*","scripts/**/*","src/**/*","test/**/*"]},wi={compilerOptions:{alwaysStrict:!0,noUncheckedIndexedAccess:!0,allowSyntheticDefaultImports:!0,esModuleInterop:!0,resolveJsonModule:!0,importHelpers:!1,noEmit:!0},exclude:["test/fixtures"],include:["*.config.ts","scripts/**/*","src/**/*","test/**/*"]};async function bi(n){return _.functionIgnoringException("generateTsconfig",async()=>{if(n.depending.blitz||n.depending.next)return void await async function(n){const i=t.resolve(n.dirPath,"tsconfig.json");try{const t=JSON.parse(await e.promises.readFile(i,"utf8"));!function(e){if(!e)return;"node"!==e.moduleResolution&&"Node"!==e.moduleResolution&&"node10"!==e.moduleResolution&&void 0!==e.moduleResolution||(e.moduleResolution="bundler")}(t.compilerOptions),function(e){if(!e)return;if(delete e.baseUrl,!e.paths)return;for(const[t,n]of Object.entries(e.paths))e.paths[t]=vi(n)}(t.compilerOptions),function(e){if(!e.include)return;if(e.include.includes("scripts/**/*"))return;e.include.push("scripts/**/*"),e.include.sort()}(t),await C.run(()=>P.generateFile(i,JSON.stringify(t,void 0,2)))}catch{}}(n);let i=structuredClone(n.isRoot?hi:wi);const r=function(e){const t=new Set,n={...e.packageJson?.dependencies,...e.packageJson?.devDependencies};e.isBun?t.add("bun"):e.depending.reactNative||t.add("node");(n.jest||n["@jest/globals"]||n["jest-environment-jsdom"]||n["ts-jest"])&&t.add("jest");n.vitest&&t.add("vitest/globals");n.mocha&&t.add("mocha");n.cypress&&t.add("cypress");return[...t]}(n);i.extends=function(e){return e.isBun?"@tsconfig/bun/tsconfig.json":e.depending.reactNative?"@tsconfig/react-native/tsconfig.json":["@tsconfig/node-lts/tsconfig.json","@tsconfig/node-ts/tsconfig.json"]}(n),i.compilerOptions??={},i.compilerOptions.rootDir=function(n){return n.isRoot?".":e.existsSync(t.resolve(n.dirPath,"..","..","package.json"))?"../..":"."}(n),r.length>0&&(i.compilerOptions={...i.compilerOptions,types:r}),n.doesContainJsxOrTsx||n.doesContainJsxOrTsxInPackages?n.isBun||n.depending.reactNative||(i.compilerOptions={...i.compilerOptions,jsx:"react-jsx"}):delete i.compilerOptions?.jsx,n.isRoot&&!n.doesContainSubPackageJsons&&(i.include=i.include?.filter(e=>!e.startsWith("packages/*/")),i.exclude=i.exclude?.filter(e=>!e.startsWith("packages/*/"))),n.depending.prisma&&function(e,t){e.include??=[],e.include.includes(t)||e.include.push(t)}(i,"prisma/**/*");const s=t.resolve(n.dirPath,"tsconfig.json");try{const t=await e.promises.readFile(s,"utf8"),n=JSON.parse(t),a=(o=n.compilerOptions?.types,"string"==typeof o?[o]:Array.isArray(o)?o.filter(e=>"string"==typeof e):[]),c=function(e){const t={};for(const n of["declaration","declarationMap","sourceMap"]){const i=e?.[n];void 0!==i&&(t[n]=i)}return t}(n.compilerOptions);i.extends=function(e,t){const n=[...ki(e),...ki(t)],i=[...new Set(n)];return 0===i.length?void 0:1===i.length?i[0]:i}(i.extends,n.extends),delete n.extends,delete n.compilerOptions?.jsx,i=l.all([i,n,i],{arrayMerge:He}),i.include=i.include?.filter(e=>!e.includes("@types")&&!e.includes("__tests__/")&&!e.includes("tests/")),i.compilerOptions??={},i.compilerOptions={...i.compilerOptions,...c},function(e){if(!e)return;if(!1!==e.noEmit||!0===e.emitDeclarationOnly)return;e.rewriteRelativeImportExtensions=!0}(i.compilerOptions);const p=[...new Set([...xi(a,r),...r])];p.length>0?i.compilerOptions.types=p:delete i.compilerOptions.types,r.some(e=>"cypress"===e||e.includes("/"))&&delete i.compilerOptions.typeRoots}catch{}var o;Ve(i),i.include?.sort(),delete i.compilerOptions?.experimentalDecorators,delete i.compilerOptions?.baseUrl,function(e,t){if(!e)return;"node"!==e.moduleResolution&&"Node"!==e.moduleResolution&&"node10"!==e.moduleResolution||delete e.moduleResolution;if(t.isBun||t.depending.reactNative||"ESNext"!==e.module)return;delete e.module}(i.compilerOptions,n),function(e,t){if(!e||t.isBun||t.depending.reactNative||t.isEsmPackage)return;"commonjs"===e.module?.toLowerCase()&&(e.module="Node16");e.verbatimModuleSyntax=!1}(i.compilerOptions,n),n.depending.reactNative&&delete i.compilerOptions?.verbatimModuleSyntax;const a=JSON.stringify(i,void 0,2);await C.run(()=>P.generateFile(s,a))})}function vi(e){return e.map(e=>e.startsWith("./")||e.startsWith("../")||t.isAbsolute(e)?e:`./${e}`)}function ki(e){return e?Array.isArray(e)?e:[e]:[]}function xi(e,t){const n=new Set(t);return e.filter(e=>!(function(e){return"cypress"===e||"jest"===e||"mocha"===e||"vitest/globals"===e}(e)&&!n.has(e)))}const ji=["**/.git/objects/**","**/.git/subtree-cache/**","**/node_modules/**","**/tmp/**","**/temp/**","**/dist/**"];async function $i(n){return _.functionIgnoringException("generateVscodeSettings",async()=>{try{const i=t.resolve(n.dirPath,".vscode","settings.json"),r=await e.promises.readFile(i,"utf8");let s=JSON.parse(r);for(const e of ji)s=l.all([s,Si(e)]);(n.doesContainPoetryLock||n.doesContainUvLock)&&(s=l.all([s,Si("**/.venv/**")])),n.depending.next&&(s=l.all([s,Si("**/.next/**")])),"editor.codeActionsOnSave"in s&&delete s["editor.codeActionsOnSave"],"editor.formatOnSave"in s&&delete s["editor.formatOnSave"],Ve(s);const o=JSON.stringify(s,void 0,2);await C.run(()=>P.generateFile(i,o))}catch{}})}function Si(e){return{"files.watcherExclude":{[e]:!0}}}async function _i(n){return _.functionIgnoringException("generateYarnrcYml",async()=>{const i=t.resolve(n.dirPath,".yarnrc.yml");if(n.isBun)return await C.run(()=>e.promises.rm(i,{force:!0})),await C.run(()=>e.promises.rm(t.resolve(n.dirPath,".yarn"),{force:!0,recursive:!0})),void await C.run(()=>e.promises.rm(t.resolve(n.dirPath,"yarn.lock"),{force:!0,recursive:!0}));const r=Ut("yarn",["--version"],n.dirPath),s=function(e,t){return Ut("npm",["show",e,"version"],t)||"0.0.0"}("@yarnpkg/cli",n.dirPath);(function(e,t){const n=m.valid(e);return!!n&&m.gt(n,m.valid(t)??"0.0.0")})(s,r)&&Mt("yarn",["set","version",s],n.dirPath,1);const o=t.join(n.dirPath,".yarn","releases");await e.promises.mkdir(o,{recursive:!0});for(const n of await e.promises.readdir(o))n.startsWith("yarn-")&&!n.startsWith(`yarn-${s}.`)&&await C.run(()=>e.promises.rm(t.join(o,n)));const a=t.resolve(n.dirPath,".yarnrc");await C.run(()=>e.promises.rm(a,{force:!0}));let c={};try{c=p.load(await e.promises.readFile(i,"utf8"))??c}catch{}c.defaultSemverRangePrefix="",c.enableScripts=!1,c.nodeLinker="node-modules",c.nmMode="hardlinks-global",c.npmMinimalAgeGate="5d",c.approvedGitRepositories=["https://github.com/WillBooster/*.git","ssh://git@github.com/WillBooster/*.git","https://github.com/WillBoosterLab/*.git","ssh://git@github.com/WillBoosterLab/*.git"],c.npmPreapprovedPackages=["@exercode/*","@willbooster/*","agent-runtime-kit","at-decorators","build-ts","gen-i18n-ts","one-way-git-sync","next","@next/*","@types/*","@typescript/*","@oxfmt/*","@oxlint/*","@oxlint-tsgolint/*","oxfmt","oxlint","oxlint-tsgolint","react","react-dom"],delete c.compressionLevel,0===c.injectEnvironmentFiles?.length&&delete c.injectEnvironmentFiles,c.enableGlobalCache=!0;const l=c.plugins?.length??0;if(c.plugins=c.plugins?.filter(e=>".yarn/plugins/undefined.cjs"!==e.path)??[],c.plugins.length!==l){const i=t.resolve(n.dirPath,".yarn","plugins","undefined.cjs");await C.run(()=>e.promises.rm(i,{force:!0}))}0===c.plugins.length&&delete c.plugins,await e.promises.writeFile(i,p.dump(c,{lineWidth:-1})),Mt("yarn",["dlx","yarn-plugin-auto-install"],n.dirPath),Mt("yarn",function(e,n){return["dlx","prettier","--no-config","--write",t.relative(e,n)]}(n.dirPath,i),n.dirPath)})}async function Pi(e){return _.functionIgnoringException("setupLabels",async()=>{const[t,n]=Gt.getOrgAndName(e.repository??"");if(!t||!n)return;if("WillBooster"!==t&&"WillBoosterLab"!==t)return;if(!Yt(t))return;const i=Ht(t);try{await Ci(i,t,n,"d1: x-easy :hedgehog:","EDE9FE"),await Ci(i,t,n,"d2: easy :rabbit2:","DDD6FE"),await Ci(i,t,n,"d3: medium :ox:","C4B5FD"),await Ci(i,t,n,"d4: hard :squid:","A78BFA"),await Ci(i,t,n,"d5: x-hard :whale2:","8B5CF6"),await Ci(i,t,n,"p1: critical :fire::fire::fire:","EF4444"),await Ci(i,t,n,"p2: urgent :fire::fire:","F87171"),await Ci(i,t,n,"p3: important :fire:","FCA5A5"),await Ci(i,t,n,"p4: nice to have :droplet:","FECACA"),await Ci(i,t,n,"r: blitz","5300bc"),await Ci(i,t,n,"r: firebase","ffca28"),await Ci(i,t,n,"r: prisma","0c344b"),await Ci(i,t,n,"r: react","61dafb"),await Ci(i,t,n,"r: svelte","ff3e00"),await Ci(i,t,n,"r: semantic-release","494949"),await Ci(i,t,n,"ready :rocket:","22C55E"),await Ci(i,t,n,"review requested :mag:","FBCA04"),await Ci(i,t,n,"released :bookmark:","6366F1"),await Ci(i,t,n,"s: 0.5h :clock1230:","F3F4F6"),await Ci(i,t,n,"s: 1h :clock1:","E5E7EB"),await Ci(i,t,n,"s: 2h :clock2:","D1D5DB"),await Ci(i,t,n,"s: 3h :clock3:","9CA3AF"),await Ci(i,t,n,"s: 5h :clock5:","6B7280"),await Ci(i,t,n,"s: 8h :clock8:","4B5563"),await Ci(i,t,n,"s: 13h :clock1:","374151"),await Ci(i,t,n,"t: build :hammer:","BFDBFE"),await Ci(i,t,n,"t: chore :broom:","BFDBFE"),await Ci(i,t,n,"t: ci :construction_worker:","BFDBFE"),await Ci(i,t,n,"t: docs :memo:","BFDBFE"),await Ci(i,t,n,"t: feat :sparkles:","BFDBFE"),await Ci(i,t,n,"t: fix :bug:","BFDBFE"),await Ci(i,t,n,"t: perf :zap:","BFDBFE"),await Ci(i,t,n,"t: refactor :recycle:","BFDBFE"),await Ci(i,t,n,"t: style :lipstick:","BFDBFE"),await Ci(i,t,n,"t: test :test_tube:","BFDBFE"),await Ci(i,t,n,"project","24292F"),await Ci(i,t,n,"focused :dart:","22C55E"),await Ei(i,t,n,"bug"),await Ei(i,t,n,"documentation"),await Ei(i,t,n,"duplicate"),await Ei(i,t,n,"enhancement"),await Ei(i,t,n,"good first issue"),await Ei(i,t,n,"help wanted"),await Ei(i,t,n,"invalid"),await Ei(i,t,n,"question"),await Ei(i,t,n,"wontfix"),await Ei(i,t,n,"ready"),await Ei(i,t,n,"review requested"),await Ei(i,t,n,"released"),await Ei(i,t,n,"semantic-release"),await Ei(i,t,n,"llm-pr :robot:"),await Ei(i,t,n,"ai-pr :robot:"),await Ei(i,t,n,"gen-pr-all :robot:"),await Ei(i,t,n,"gen-pr-claude :robot:"),await Ei(i,t,n,"gen-pr-codex :robot:"),await Ei(i,t,n,"gen-pr-gemini :robot:")}catch(e){console.warn("Skip setupLabels due to:",e?.stack??e)}})}async function Ci(e,t,n,i,r){try{await e.request("POST /repos/{owner}/{repo}/labels",{owner:t,repo:n,name:i,color:r})}catch{await e.request("PATCH /repos/{owner}/{repo}/labels/{name}",{owner:t,repo:n,name:i,color:r})}}async function Ei(e,t,n,i){try{await e.request("DELETE /repos/{owner}/{repo}/labels/{name}",{owner:t,repo:n,name:i})}catch{}}const Oi=["READY_DISCORD_WEBHOOK_URL","GH_BOT_PAT","PUBLIC_GH_BOT_PAT"],Bi=h(import.meta.url);async function Ai(e){return _.functionIgnoringException("setupSecrets",async()=>{const[n,i]=Gt.getOrgAndName(e.repository??"");if(!n||!i||"WillBoosterLab"!==n)return;if(!Yt(n)||!S.doesUploadEnvVars)return;const r=w.config({path:t.resolve(e.dirPath,".env"),quiet:!0}).parsed??{};if(0===Object.keys(r).length)return;const s=Ht(n);try{for(const e of Oi)try{await s.request("DELETE /repos/{owner}/{repo}/actions/secrets/{secret_name}",{owner:n,repo:i,secret_name:e})}catch{}const e=await s.request("GET /repos/{owner}/{repo}/actions/secrets/public-key",{owner:n,repo:i}),{key:t,key_id:o}=e.data,a=Bi("libsodium-wrappers");await a.ready;for(const[e,c]of Object.entries(r)){if("GH_BOT_PAT"===e||"GH_BOT_PAT_FOR_WILLBOOSTER"===e||"GH_BOT_PAT_FOR_WILLBOOSTERLAB"===e)continue;const r=a.from_base64(t,a.base64_variants.ORIGINAL),l=a.from_string(c),p=a.crypto_box_seal(l,r),d=a.to_base64(p,a.base64_variants.ORIGINAL);await s.request("PUT /repos/{owner}/{repo}/actions/secrets/{secret_name}",{owner:n,repo:i,secret_name:e,encrypted_value:d,key_id:o})}}catch(e){console.warn("Skip setupSecrets due to:",e?.stack??e)}})}async function Fi(e){return _.functionIgnoringException("setupGitHubSettings",async()=>{const[t,n]=Gt.getOrgAndName(e.repository??"");if(!t||!n)return;if("WillBooster"!==t&&"WillBoosterLab"!==t)return;if(!Yt(t))return;const i=Ht(t);try{await async function(e,{beforeRetry:t,handleError:n,retryCount:i=3,retryLogger:r,shouldRetry:s,sleepMilliseconds:o=0,updateSleepMilliseconds:a}={}){let c=0;for(;;)try{return await e(c)}catch(e){if(await(n?.(e)),c++,c>=i)throw e;if(s&&!s(e))throw e;o>0&&await x(o),a&&(o=a(o)),r?.(`Retry due to: ${e}\n${e instanceof Error?"---\n"+(e.stack??""):""}`),await(t?.(e))}}(()=>i.request("PATCH /repos/{owner}/{repo}",{owner:t,repo:n,allow_auto_merge:!0,allow_merge_commit:!1,allow_squash_merge:!0,allow_rebase_merge:!1,allow_update_branch:!0,delete_branch_on_merge:!0,squash_merge_commit_title:"PR_TITLE",squash_merge_commit_message:"BLANK",headers:{"X-GitHub-Api-Version":"2022-11-28"},...e.repository?.startsWith("github:WillBooster/")?{allow_auto_merge:!0}:{}}),{shouldRetry:e=>!Ri(e)})}catch(e){if(!Ri(e))throw e;console.warn("Skip setupGitHubSettings due to:",e?.stack??e)}})}function Ri(e){return!(!e||"object"!=typeof e||!("status"in e))&&(401===e.status||403===e.status||404===e.status)}const Ii="__PM_RUN__",Di={"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., \`${Ii} test\`) passed.\n - The lint command (e.g., \`${Ii} 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 Ti(n){return _.functionIgnoringException("generateGitHubTemplates",async()=>{if(n.isWillBoosterRepo)for(const[i,r]of Object.entries(Di)){const s=Wi(r,n),o=t.resolve(n.dirPath,".github",i);if(e.existsSync(o)){const t=await e.promises.readFile(o,"utf8");if(b(t,s)>s.length/2)continue}await e.promises.mkdir(t.resolve(n.dirPath,".github"),{recursive:!0}),await C.run(()=>P.generateFile(o,s))}})}function Wi(e,t){const n=t.isBun?"bun run":"yarn";return e.replaceAll(Ii,n)}const Ni=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 Li(n,i){const r=t.resolve(n,"package.json");try{const o=e.existsSync(r);let a={},c={},l={},p=!1;if(o){const t=e.readFileSync(r,"utf8");l=JSON.parse(t),a=l.dependencies??{},c=l.devDependencies??{},p="module"===l.type}let d=[],u=[];try{const e=t.resolve(n,".releaserc.json"),i=JSON.parse(await s.readFile(e,"utf8"));d=i?.branches??[],u=i?.plugins?.flat()??[]}catch{}const f="packages"!==t.basename(t.resolve(n,".."))||!e.existsSync(t.resolve(n,"..","..","package.json"));let g;f&&(g=await async function(e,t){const n=v(e),i=(await n.getRemotes(!0)).find(e=>"origin"===e.name),r=i?.refs.fetch??i?.refs.push;if("string"==typeof r){const e=await zi(r);if(e)return e}const s="string"==typeof t.repository?t.repository:t.repository?.url;if(s){const e=await zi(s);if(e&&"Not Found"!==e.message)return e}}(n,l));let m=function(n){const i=t.resolve(n);return e.existsSync(t.join(i,"mise.toml"))||e.existsSync(t.join(i,".mise.toml"))||e.existsSync(t.join(i,".tool-versions"))}(n);for(const i of["java","node","python"])if(e.existsSync(t.resolve(n,`.${i}-version`))){m=!0;break}let y="";try{y=await s.readFile(t.resolve(n,"Dockerfile"),"utf8")}catch{}const h=t.resolve(n,"wbfy.json");let w;try{const e=await s.readFile(h,"utf8");w=Ni.parse(JSON.parse(e))}catch{}const b="string"==typeof g?.full_name?g.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:f,isPublicRepo:!1===g?.private,isReferredByOtherRepo:!!l.files,repository:j,repoAuthor:k,repoName:x,isWillBoosterRepo:Boolean(j?.startsWith("github:WillBooster/")||j?.startsWith("github:WillBoosterLab/")),isBun:i?.isBun||e.existsSync(t.join(n,"bun.lock")),isEsmPackage:p,isWillBoosterConfigs:r.includes("/willbooster-configs"),doesContainSubPackageJsons:Ui("packages/**/package.json",n),doesContainDockerfile:!!y||e.existsSync(t.resolve(n,"docker-compose.yml")),doesContainGemfile:e.existsSync(t.resolve(n,"Gemfile")),doesContainGoMod:e.existsSync(t.resolve(n,"go.mod")),doesContainPackageJson:e.existsSync(t.resolve(n,"package.json")),doesContainPoetryLock:e.existsSync(t.resolve(n,"poetry.lock")),doesContainUvLock:e.existsSync(t.resolve(n,"uv.lock")),doesContainPomXml:e.existsSync(t.resolve(n,"pom.xml")),doesContainPubspecYaml:e.existsSync(t.resolve(n,"pubspec.yaml")),doesContainTemplateYaml:e.existsSync(t.resolve(n,"template.yaml")),doesContainVscodeSettingsJson:e.existsSync(t.resolve(n,".vscode","settings.json")),doesContainJavaScript:Ui("{app,src,test,scripts}/**/*.{cjs,mjs,js,jsx}",n),doesContainTypeScript:Ui("{app,src,test,scripts}/**/*.{cts,mts,ts,tsx}",n),doesContainJsxOrTsx:Ui("{app,src,test}/**/*.{t,j}sx",n),doesContainJava:Ui("**/*.java",n),doesContainJavaScriptInPackages:Ui("packages/**/{app,src,test,scripts}/**/*.{cjs,mjs,js,jsx}",n),doesContainTypeScriptInPackages:Ui("packages/**/{app,src,test,scripts}/**/*.{cts,mts,ts,tsx}",n),doesContainJsxOrTsxInPackages:Ui("packages/**/{app,src,test}/**/*.{t,j}sx",n),doesContainJavaInPackages:Ui("packages/**/*.java",n),depending:{blitz:!!a.blitz,chakra:!!c["@chakra-ui/cli"],drizzle:!!a["drizzle-orm"]||!!c["drizzle-kit"],firebase:!!c["firebase-tools"],genI18nTs:!!a["gen-i18n-ts"]||!!c["gen-i18n-ts"],litestream:y.includes("install-litestream.sh"),react:!!a.react,next:!!a.next,playwrightTest:!!a["@playwright/test"]||!!c["@playwright/test"]||!!c.playwright,prisma:!!a["@prisma/client"]||!!c.prisma,pyright:!!c.pyright,reactNative:!!a["react-native"],semanticRelease:!!(c["semantic-release"]||d.length>0||u.length>0),storybook:!!c["@storybook/react"],wb:!!a["@willbooster/wb"]||!!c["@willbooster/wb"]},release:{branches:d,github:u.includes("@semantic-release/github"),npm:u.includes("@semantic-release/npm")},hasVersionSettings:m,miseTasks:await Mi(n),packageJson:l,wbfyJson:w};if($.doesContainGemfile||$.doesContainGoMod||$.doesContainPackageJson||$.doesContainPoetryLock||$.doesContainUvLock||$.doesContainPomXml||$.doesContainPubspecYaml||$.doesContainTemplateYaml)return $}catch{}}async function Mi(e){const n={};for(const i of["mise.toml",".mise.toml"]){const r=t.resolve(e,i);try{const e=d(await s.readFile(r,"utf8"));for(const[t,i]of Object.entries(e.tasks??{}))n[t]=Ji(i)}catch{}}return n}function Ji(e){return"string"==typeof e?e:Array.isArray(e)?e.filter(e=>"string"==typeof e).join("\n"):e&&"object"==typeof e?Ji(e.run):""}function Ui(e,t){return o.globSync(e,{dot:!0,cwd:t,ignore:G}).length>0}async function zi(e){const[t,n]=Gt.getOrgAndName(e);if(t&&n)try{return(await Ht().request("GET /repos/{owner}/{repo}",{owner:t,repo:n})).data}catch(e){const t=function(e){if(!e||"object"!=typeof e)return;const t="response"in e?e.response:void 0,n=t?.status??e.status;if(301!==n&&302!==n)return;const i=t?.headers?.location;if("string"!=typeof i)return;const[r,s]=Gt.getOrgAndName(i);if(!r||!s)return;return`${r}/${s}`}(e);if(t)return{full_name:t}}}const Gi=["dependencies","devDependencies","optionalDependencies","peerDependencies"],qi=String.raw`(?:WillBooster|WillBoosterLab)`,Hi=[new RegExp(`^${qi}/[^#\\s]+(?:#\\S+)?$`,"u"),new RegExp(`^github:${qi}/[^#\\s]+(?:#\\S+)?$`,"u"),new RegExp(`^(?:git\\+)?https://github\\.com/${qi}/[^#\\s]+(?:\\.git)?(?:#\\S+)?$`,"u"),new RegExp(`^(?:git\\+)?ssh://git@github\\.com[:/]${qi}/[^#\\s]+(?:\\.git)?(?:#\\S+)?$`,"u"),new RegExp(`^(?:git\\+)?git@github\\.com:${qi}/[^#\\s]+(?:\\.git)?(?:#\\S+)?$`,"u")];function Yi(e){const n=e.flatMap(Ki);if(0===n.length)return;const i=n.map(({dependencyName:e,dirPath:n,sectionName:i,specifier:r})=>`- ${t.join(n,"package.json")}: ${i}.${e} uses ${r}`).join("\n");throw new Error(`Disallowed Git dependency sources found.\nOnly WillBooster and WillBoosterLab GitHub dependencies are allowed.\n${i}`)}function Ki(e){const t=e.packageJson;if(!t)return[];const n=[];for(const i of Gi){const r=t[i];if(r)for(const[t,s]of Object.entries(r))s&&Vi(s)&&(Xi(s)||n.push({dependencyName:t,dirPath:e.dirPath,sectionName:i,specifier:s}))}return n}function Vi(e){return function(e){return/^[a-zA-Z0-9][\w.-]*\/[\w.-]+(?:#\S+)?$/u.test(e)}(e)||/^(?:bitbucket|gist|github|gitlab):/u.test(e)||/^https?:\/\/(?:bitbucket\.org|github\.com|gitlab\.com)\//u.test(e)||/^(?:https?|ssh):\/\/\S+\.git(?:#\S+)?$/u.test(e)||/^[^@\s]+@[^:\s]+:\S+(?:#\S+)?$/u.test(e)||e.startsWith("git:")||e.startsWith("git+")||e.startsWith("ssh://git@")}function Xi(e){return Hi.some(t=>t.test(e))}function Zi(e){const t=Jt("bun",["install"],e);if(0!==t)throw new Error(`Failed to refresh Bun lockfile: bun install exited with status ${t}`)}await async function(){const i=await n(process.argv.slice(2)).command("$0 [paths..]","Make a given project follow the WillBooster standard",e=>{e.positional("paths",{describe:"project paths to be wbfied",array:!0,type:"string",default:["."]})}).options({env:{description:"Upload environment variables as secrets to GitHub",type:"boolean",default:!1,alias:"e"},skipDeps:{description:"Skip dependency installation",type:"boolean",default:!1,alias:"d"},verbose:{description:"Whether or not to enable verbose mode",type:"boolean",default:!1,alias:"v"}}).version(function(){let n=t.dirname(new URL(import.meta.url).pathname);for(;!e.existsSync(t.join(n,"package.json"));)n=t.dirname(n);return JSON.parse(e.readFileSync(t.join(n,"package.json"),"utf8")).version}()).strict().argv;S.isVerbose=i.verbose,S.doesUploadEnvVars=i.env;let r=!1;for(const n of i.paths){const s=t.join(n,"packages"),o=(await j(()=>e.promises.readdir(s,{withFileTypes:!0}))??[]).filter(e=>e.isDirectory()).map(e=>t.join(s,e.name));await Ue([n,...o]);const a=await Li(n);if(S.isVerbose,!a){console.error(`there is no valid package.json in ${n}`),r=!0;continue}const c=ot(a),l=(await Promise.all(o.map(e=>Li(e,a)))).filter(e=>!!e),p=[a,...l];if(S.isVerbose)for(const e of p)console.info(e);Yi(p),await _i(a),a.isBun&&await ft(a);const d=!tt(a.repository)&&(a.repository?.startsWith("github:WillBooster/")||a.repository?.startsWith("github:WillBoosterLab/"));await Promise.all([q(a),c.then(()=>li(a)),lt(a,p),xt(a),St(a),Ct(a,p),Et(a),Bt(a),Ti(a),Nt(a),ci(a),mi(a),fi(a),...d?[et(a)]:[],Pi(a),Ai(a),Fi(a),Jn(a),Yn(a)]),await C.promiseAll();const u=[];for(const e of p)(e.doesContainTypeScript||e.doesContainTypeScriptInPackages)&&u.push(Ge(e,e.isRoot?p:[e])),e.depending.playwrightTest&&u.push(D(e)),e.depending.next&&u.push(E(e)),await Ft(e,a),await C.promiseAll(),(e.isRoot||e.doesContainPackageJson)&&(await si(e),await mn(e,a,i.skipDeps),u.push(Yn(e)),e.doesContainVscodeSettingsJson&&e.doesContainPackageJson&&u.push($i(e)),(e.doesContainTypeScript||e.doesContainTypeScriptInPackages)&&u.push(bi(e)),O(e)?(u.push(Qn(e)),u.push(ni(e))):!e.isRoot&&e.doesContainPackageJson&&O(a)&&u.push(ni(e)),e.depending.pyright&&u.push(ai(e)));await Promise.all(u),await C.promiseAll();const f=a.isBun?"bun":"yarn";a.isBun?await _.functionIgnoringException("refreshBunLock",async()=>{await Promise.resolve(),Zi(n)}):Mt(f,["install","--no-immutable"],n),Mt(f,["cleanup"],n),await yi()}r&&(process.exitCode=1)}();
|
|
32
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VzIjpbIi4uLy4uL3NoYXJlZC1saWIvc3JjL3NsZWVwLnRzIiwiLi4vLi4vc2hhcmVkLWxpYi9zcmMvZXJyb3IudHMiLCIuLi9zcmMvb3B0aW9ucy50cyIsIi4uL3NyYy9sb2dnZXIudHMiLCIuLi9zcmMvdXRpbHMvZnNVdGlsLnRzIiwiLi4vc3JjL3V0aWxzL3Byb21pc2VQb29sLnRzIiwiLi4vc3JjL2ZpeGVycy9uZXh0Q29uZmlnLnRzIiwiLi4vc3JjL3V0aWxzL3BhY2thZ2VDYXBhYmlsaXRpZXMudHMiLCIuLi9zcmMvZml4ZXJzL3BsYXl3cmlnaHRDb25maWcudHMiLCIuLi9zcmMvdXRpbHMvZ2xvYlV0aWwudHMiLCIuLi9zcmMvZml4ZXJzL3ByaXNtYS50cyIsIi4uLy4uLy4uL25vZGVfbW9kdWxlcy9zb3J0LW9iamVjdC1rZXlzL2luZGV4LmpzIiwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2RldGVjdC1pbmRlbnQvaW5kZXguanMiLCIuLi8uLi8uLi9ub2RlX21vZHVsZXMvZGV0ZWN0LW5ld2xpbmUvaW5kZXguanMiLCIuLi8uLi8uLi9ub2RlX21vZHVsZXMvc29ydC1wYWNrYWdlLWpzb24vaW5kZXguanMiLCIuLi8uLi8uLi9ub2RlX21vZHVsZXMvaXMtcGxhaW4tb2JqL2luZGV4LmpzIiwiLi4vc3JjL2ZpeGVycy90ZXN0RGlyZWN0b3J5LnRzIiwiLi4vc3JjL2ZpeGVycy90eXBlRGVmaW5pdGlvbi50cyIsIi4uL3NyYy91dGlscy9tZXJnZVV0aWwudHMiLCIuLi9zcmMvdXRpbHMvb2JqZWN0VXRpbC50cyIsIi4uL3NyYy9nZW5lcmF0b3JzL3dvcmtmbG93LnRzIiwiLi4vc3JjL2ZpeGVycy90eXBvcy50cyIsIi4uL3NyYy9nZW5lcmF0b3JzL2FnZW50cy50cyIsIi4uL3NyYy9nZW5lcmF0b3JzL2J1bmZpZy50cyIsIi4uL3NyYy91dGlscy9pZ25vcmVGaWxlVXRpbC50cyIsIi4uL3NyYy9nZW5lcmF0b3JzL2RvY2tlcmlnbm9yZS50cyIsIi4uL3NyYy91dGlscy9leHRlbnNpb25zLnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvZWRpdG9yY29uZmlnLnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvZ2VtaW5pQ29uZmlnLnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvZ2VtaW5pU2V0dGluZ3MudHMiLCIuLi9zcmMvZ2VuZXJhdG9ycy9naXRhdHRyaWJ1dGVzLnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvZ2l0aWdub3JlLnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvaWRlYS50cyIsIi4uL3NyYy91dGlscy9nZW5JMThuVHMudHMiLCIuLi9zcmMvdXRpbHMvc3Bhd25VdGlsLnRzIiwiLi4vc3JjL3V0aWxzL2dpdGh1YlV0aWwudHMiLCIuLi9zcmMvdXRpbHMvdHNjb25maWdCYXNlLnRzIiwiLi4vc3JjL3V0aWxzL3dpbGxib29zdGVyQ29uZmlnc1V0aWwudHMiLCIuLi9zcmMvZ2VuZXJhdG9ycy9wYWNrYWdlSnNvbi50cyIsIi4uL3NyYy9naXRodWIvY29tbWl0LnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvbGVmdGhvb2sudHMiLCIuLi9zcmMvZ2VuZXJhdG9ycy9saW50c3RhZ2VkcmMudHMiLCIuLi9zcmMvZ2VuZXJhdG9ycy9jb25maWdDb250ZW50LnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvbWFuYWdlZENvbmZpZ0Jsb2NrLnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvb3hmbXRDb25maWcudHMiLCIuLi9zcmMvZ2VuZXJhdG9ycy9veGxpbnRDb25maWcudHMiLCIuLi9zcmMvZ2VuZXJhdG9ycy9wcmV0dGllcmlnbm9yZS50cyIsIi4uL3NyYy9nZW5lcmF0b3JzL3B5cmlnaHRDb25maWcudHMiLCIuLi9zcmMvZ2VuZXJhdG9ycy9yYWlsd2F5aWdub3JlLnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvcmVhZG1lLnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvcmVsZWFzZXJjLnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvcmVub3ZhdGVKc29uLnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvc2tpbGxzLnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvdHNjb25maWcudHMiLCIuLi9zcmMvZ2VuZXJhdG9ycy92c2NvZGVTZXR0aW5ncy50cyIsIi4uL3NyYy9nZW5lcmF0b3JzL3lhcm5yYy50cyIsIi4uL3NyYy9naXRodWIvbGFiZWwudHMiLCIuLi9zcmMvZ2l0aHViL3NlY3JldC50cyIsIi4uL3NyYy9naXRodWIvc2V0dGluZ3MudHMiLCIuLi9zcmMvZ2l0aHViL3RlbXBsYXRlLnRzIiwiLi4vc3JjL3BhY2thZ2VDb25maWcudHMiLCIuLi9zcmMvdXRpbHMvZGVwZW5kZW5jeVNvdXJjZVBvbGljeS50cyIsIi4uL3NyYy9pbmRleC50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgYXN5bmMgZnVuY3Rpb24gc2xlZXAobWlsbGlzZWNvbmRzOiBudW1iZXIpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiBzZXRUaW1lb3V0KHJlc29sdmUsIG1pbGxpc2Vjb25kcykpO1xufVxuIiwiaW1wb3J0IHsgc2xlZXAgfSBmcm9tICcuL3NsZWVwLmpzJztcblxuLyoqXG4gKiBDb252ZXJ0IGFuIG9iamVjdCB0byBhbiBlcnJvci5cbiAqIEBwYXJhbSBvYmogVGhlIG9iamVjdCB0byBjb252ZXJ0LlxuICovXG5leHBvcnQgZnVuY3Rpb24gZXJyb3JpZnkob2JqOiB1bmtub3duKTogRXJyb3Ige1xuICBpZiAob2JqIGluc3RhbmNlb2YgRXJyb3IpIHJldHVybiBvYmo7XG4gIGlmICh0eXBlb2Ygb2JqID09PSAnc3RyaW5nJykgcmV0dXJuIG5ldyBFcnJvcihvYmopO1xuICB0cnkge1xuICAgIHJldHVybiBuZXcgRXJyb3IoSlNPTi5zdHJpbmdpZnkob2JqKSk7XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiBuZXcgRXJyb3IoU3RyaW5nKG9iaikpO1xuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpZ25vcmVFcnJvcjxUPihmbjogKCkgPT4gVCk6IFQgfCB1bmRlZmluZWQge1xuICB0cnkge1xuICAgIHJldHVybiBmbigpO1xuICB9IGNhdGNoIHtcbiAgICAvLyBkbyBub3RoaW5nXG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlnbm9yZUVub2VudDxUPihmbjogKCkgPT4gVCk6IFQgfCB1bmRlZmluZWQge1xuICB0cnkge1xuICAgIHJldHVybiBmbigpO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGlmICh0eXBlb2YgZXJyb3IgPT09ICdvYmplY3QnICYmIGVycm9yICYmICdjb2RlJyBpbiBlcnJvciAmJiBlcnJvci5jb2RlID09PSAnRU5PRU5UJykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aHJvdyBlcnJvcjtcbiAgfVxufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gaWdub3JlRXJyb3JBc3luYzxUPihmbjogKCkgPT4gUHJvbWlzZTxUPik6IFByb21pc2U8VCB8IHVuZGVmaW5lZD4ge1xuICB0cnkge1xuICAgIHJldHVybiBhd2FpdCBmbigpO1xuICB9IGNhdGNoIHtcbiAgICAvLyBkbyBub3RoaW5nXG4gIH1cbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGlnbm9yZUVub2VudEFzeW5jPFQ+KGZuOiAoKSA9PiBQcm9taXNlPFQ+KTogUHJvbWlzZTxUIHwgdW5kZWZpbmVkPiB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIGF3YWl0IGZuKCk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgaWYgKHR5cGVvZiBlcnJvciA9PT0gJ29iamVjdCcgJiYgZXJyb3IgJiYgJ2NvZGUnIGluIGVycm9yICYmIGVycm9yLmNvZGUgPT09ICdFTk9FTlQnKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRocm93IGVycm9yO1xuICB9XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUmV0cnlPcHRpb25zIHtcbiAgYmVmb3JlUmV0cnk/OiAoZXJyb3I6IHVua25vd24pID0+IFByb21pc2U8dm9pZD47XG4gIGhhbmRsZUVycm9yPzogKGVycm9yOiB1bmtub3duKSA9PiBQcm9taXNlPHZvaWQ+O1xuICAvKipcbiAgICogVGhlIG1heGltdW0gbnVtYmVyIG9mIHRvdGFsIGF0dGVtcHRzLCBpbmNsdWRpbmcgdGhlIGluaXRpYWwgYXR0ZW1wdC5cbiAgICogRm9yIGV4YW1wbGUsIGByZXRyeUNvdW50OiAzYCBydW5zIHRoZSBmdW5jdGlvbiBhdCBtb3N0IDMgdGltZXM6IDEgaW5pdGlhbCBhdHRlbXB0IGFuZCB1cCB0byAyIHJldHJpZXMuXG4gICAqL1xuICByZXRyeUNvdW50PzogbnVtYmVyO1xuICByZXRyeUxvZ2dlcj86IChtZXNzYWdlOiBzdHJpbmcpID0+IHZvaWQ7XG4gIHNob3VsZFJldHJ5PzogKGVycm9yOiB1bmtub3duKSA9PiBib29sZWFuO1xuICBzbGVlcE1pbGxpc2Vjb25kcz86IG51bWJlcjtcbiAgdXBkYXRlU2xlZXBNaWxsaXNlY29uZHM/OiAoc2xlZXBNaWxsaXNlY29uZHM6IG51bWJlcikgPT4gbnVtYmVyO1xufVxuXG4vKipcbiAqIFJldHJ5IHRoZSBnaXZlbiBmdW5jdGlvbi5cbiAqIEBwYXJhbSBmdW5jIFRoZSBmdW5jdGlvbiB0byByZXRyeS5cbiAqIEBwYXJhbSBiZWZvcmVSZXRyeSBUaGUgZnVuY3Rpb24gdG8gY2FsbCBpbW1lZGlhdGVseSBiZWZvcmUgcmV0cnlpbmcuXG4gKiBAcGFyYW0gaGFuZGxlRXJyb3IgVGhlIGZ1bmN0aW9uIHRvIGNhbGwgd2hlbiBhbiBlcnJvciBvY2N1cnMuXG4gKiBAcGFyYW0gcmV0cnlDb3VudCBUaGUgbWF4aW11bSBudW1iZXIgb2YgdG90YWwgYXR0ZW1wdHMsIGluY2x1ZGluZyB0aGUgaW5pdGlhbCBhdHRlbXB0LlxuICogQHBhcmFtIHJldHJ5TG9nZ2VyIFRoZSBmdW5jdGlvbiB0byBsb2cgcmV0cnlpbmcuXG4gKiBAcGFyYW0gc2xlZXBNaWxsaXNlY29uZHMgVGhlIG51bWJlciBvZiBtaWxsaXNlY29uZHMgdG8gc2xlZXAgYmVmb3JlIHJldHJ5aW5nLlxuICogQHBhcmFtIHVwZGF0ZVNsZWVwTWlsbGlzZWNvbmRzIFRoZSBmdW5jdGlvbiB0byB1cGRhdGUgc2xlZXAgbWlsbGlzZWNvbmRzIGFmdGVyIGVhY2ggcmV0cnkuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiB3aXRoUmV0cnk8VD4oXG4gIGZ1bmM6IChmYWlsZWRDb3VudDogbnVtYmVyKSA9PiBUIHwgUHJvbWlzZTxUPixcbiAge1xuICAgIGJlZm9yZVJldHJ5LFxuICAgIGhhbmRsZUVycm9yLFxuICAgIHJldHJ5Q291bnQgPSAzLFxuICAgIHJldHJ5TG9nZ2VyLFxuICAgIHNob3VsZFJldHJ5LFxuICAgIHNsZWVwTWlsbGlzZWNvbmRzID0gMCxcbiAgICB1cGRhdGVTbGVlcE1pbGxpc2Vjb25kcyxcbiAgfTogUmV0cnlPcHRpb25zID0ge31cbik6IFByb21pc2U8VD4ge1xuICBsZXQgZmFpbGVkQ291bnQgPSAwO1xuICBmb3IgKDs7KSB7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiBhd2FpdCBmdW5jKGZhaWxlZENvdW50KTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgYXdhaXQgaGFuZGxlRXJyb3I/LihlcnJvcik7XG4gICAgICBmYWlsZWRDb3VudCsrO1xuICAgICAgaWYgKGZhaWxlZENvdW50ID49IHJldHJ5Q291bnQpIHtcbiAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICB9XG4gICAgICBpZiAoc2hvdWxkUmV0cnkgJiYgIXNob3VsZFJldHJ5KGVycm9yKSkge1xuICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgIH1cbiAgICAgIGlmIChzbGVlcE1pbGxpc2Vjb25kcyA+IDApIHtcbiAgICAgICAgYXdhaXQgc2xlZXAoc2xlZXBNaWxsaXNlY29uZHMpO1xuICAgICAgfVxuICAgICAgaWYgKHVwZGF0ZVNsZWVwTWlsbGlzZWNvbmRzKSB7XG4gICAgICAgIHNsZWVwTWlsbGlzZWNvbmRzID0gdXBkYXRlU2xlZXBNaWxsaXNlY29uZHMoc2xlZXBNaWxsaXNlY29uZHMpO1xuICAgICAgfVxuICAgICAgcmV0cnlMb2dnZXI/LihgUmV0cnkgZHVlIHRvOiAke2Vycm9yfVxuJHtlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gJy0tLVxcbicgKyAoZXJyb3Iuc3RhY2sgPz8gJycpIDogJyd9YCk7XG4gICAgICBhd2FpdCBiZWZvcmVSZXRyeT8uKGVycm9yKTtcbiAgICB9XG4gIH1cbn1cbiIsImNsYXNzIE9wdGlvbnMge1xuICBpc1ZlcmJvc2UgPSBmYWxzZTtcbiAgZG9lc1VwbG9hZEVudlZhcnMgPSBmYWxzZTtcbn1cblxuZXhwb3J0IGNvbnN0IG9wdGlvbnMgPSBuZXcgT3B0aW9ucygpO1xuIiwiaW1wb3J0IHsgb3B0aW9ucyB9IGZyb20gJy4vb3B0aW9ucy5qcyc7XG5cbmNsYXNzIExvZ2dlciB7XG4gIGFzeW5jIGZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24obmFtZTogc3RyaW5nLCBmdW5jOiAoKSA9PiBQcm9taXNlPHZvaWQ+KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKG9wdGlvbnMuaXNWZXJib3NlKSB7XG4gICAgICBjb25zb2xlLmluZm8oYC0tLS0tLS0tLSAke25hbWV9IHN0YXJ0IC0tLS0tLS0tLWApO1xuICAgIH1cbiAgICB0cnkge1xuICAgICAgYXdhaXQgZnVuYygpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBjb25zb2xlLmluZm8oYEVycm9yIG9jY3VycmVkIGluICR7bmFtZX06ICR7ZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLnN0YWNrIDogU3RyaW5nKGVycm9yKX19YCk7XG4gICAgfVxuICAgIGlmIChvcHRpb25zLmlzVmVyYm9zZSkge1xuICAgICAgY29uc29sZS5pbmZvKGAtLS0tLS0tLS0tICR7bmFtZX0gZW5kIC0tLS0tLS0tLS1gKTtcbiAgICB9XG4gIH1cbn1cblxuZXhwb3J0IGNvbnN0IGxvZ2dlciA9IG5ldyBMb2dnZXIoKTtcbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmV4cG9ydCBjb25zdCBmc1V0aWwgPSB7XG4gIGFzeW5jIHJlYWRGaWxlSWdub3JpbmdFcnJvcihmaWxlUGF0aDogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmcgfCB1bmRlZmluZWQ+IHtcbiAgICB0cnkge1xuICAgICAgcmV0dXJuIGF3YWl0IGZzLnByb21pc2VzLnJlYWRGaWxlKGZpbGVQYXRoLCAndXRmOCcpO1xuICAgIH0gY2F0Y2gge1xuICAgICAgLy8gZG8gbm90aGluZ1xuICAgIH1cbiAgfSxcbiAgYXN5bmMgZ2VuZXJhdGVGaWxlKGZpbGVQYXRoOiBzdHJpbmcsIGNvbnRlbnQ6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgIGF3YWl0IGZzLnByb21pc2VzLm1rZGlyKHBhdGguZGlybmFtZShmaWxlUGF0aCksIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICAgIGxldCBub3JtYWxpemVkQ29udGVudCA9IGNvbnRlbnQudHJpbSgpO1xuICAgIGlmIChub3JtYWxpemVkQ29udGVudCkge1xuICAgICAgbm9ybWFsaXplZENvbnRlbnQgKz0gJ1xcbic7XG4gICAgfVxuICAgIGF3YWl0IGZzLnByb21pc2VzLndyaXRlRmlsZShmaWxlUGF0aCwgbm9ybWFsaXplZENvbnRlbnQpO1xuICAgIGNvbnNvbGUubG9nKGBHZW5lcmF0ZWQvVXBkYXRlZCAke2ZpbGVQYXRofWApO1xuICB9LFxufTtcbiIsImltcG9ydCB7IFByb21pc2VQb29sIH0gZnJvbSAnbWluaW1hbC1wcm9taXNlLXBvb2wnO1xuXG5leHBvcnQgY29uc3QgcHJvbWlzZVBvb2wgPSBuZXcgUHJvbWlzZVBvb2woKTtcbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB0cyBmcm9tICd0eXBlc2NyaXB0JztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZnNVdGlsIH0gZnJvbSAnLi4vdXRpbHMvZnNVdGlsLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZml4TmV4dENvbmZpZ0pzb24oY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZml4TmV4dENvbmZpZ0pzb24nLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgZmlsZVBhdGggPSBbJ2pzJywgJ21qcycsICdjanMnXVxuICAgICAgLm1hcCgoZXh0KSA9PiBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsIGBuZXh0LmNvbmZpZy4ke2V4dH1gKSlcbiAgICAgIC5maW5kKChwKSA9PiBmcy5leGlzdHNTeW5jKHApKTtcbiAgICBpZiAoIWZpbGVQYXRoKSByZXR1cm47XG5cbiAgICBjb25zdCBvbGRDb250ZW50ID0gYXdhaXQgZnMucHJvbWlzZXMucmVhZEZpbGUoZmlsZVBhdGgsICd1dGY4Jyk7XG4gICAgY29uc3Qgb2JqZWN0TGl0ZXJhbCA9IGdldE5leHRDb25maWdPYmplY3RMaXRlcmFsKG9sZENvbnRlbnQpO1xuICAgIGlmICghb2JqZWN0TGl0ZXJhbCkgcmV0dXJuO1xuXG4gICAgY29uc3QgZXhpc3RpbmdQcm9wZXJ0aWVzID0gbmV3IFNldChvYmplY3RMaXRlcmFsLnByb3BlcnRpZXMubWFwKChwcm9wZXJ0eSkgPT4gcHJvcGVydHkubmFtZT8uZ2V0VGV4dCgpKSk7XG4gICAgY29uc3QgcHJvcGVydHlUZXh0czogc3RyaW5nW10gPSBbXTtcbiAgICBpZiAoIWV4aXN0aW5nUHJvcGVydGllcy5oYXMoJ3R5cGVzY3JpcHQnKSkge1xuICAgICAgcHJvcGVydHlUZXh0cy5wdXNoKCd0eXBlc2NyaXB0OiB7IGlnbm9yZUJ1aWxkRXJyb3JzOiB0cnVlIH0nKTtcbiAgICB9XG4gICAgaWYgKHByb3BlcnR5VGV4dHMubGVuZ3RoID09PSAwKSByZXR1cm47XG5cbiAgICBjb25zdCBpbnNlcnRpb25Qb2ludCA9IG9iamVjdExpdGVyYWwuZ2V0RW5kKCkgLSAxO1xuICAgIGNvbnN0IGxhc3RQcm9wZXJ0eSA9IG9iamVjdExpdGVyYWwucHJvcGVydGllcy5hdCgtMSk7XG4gICAgY29uc3QgaGFzVHJhaWxpbmdDb21tYSA9IGxhc3RQcm9wZXJ0eVxuICAgICAgPyBvbGRDb250ZW50LnNsaWNlKGxhc3RQcm9wZXJ0eS5nZXRFbmQoKSwgaW5zZXJ0aW9uUG9pbnQpLmluY2x1ZGVzKCcsJylcbiAgICAgIDogZmFsc2U7XG4gICAgY29uc3QgcHJlZml4ID0gb2JqZWN0TGl0ZXJhbC5wcm9wZXJ0aWVzLmxlbmd0aCA+IDAgJiYgIWhhc1RyYWlsaW5nQ29tbWEgPyAnLCAnIDogJyc7XG4gICAgY29uc3QgbmV3Q29udGVudCA9IGAke29sZENvbnRlbnQuc2xpY2UoMCwgaW5zZXJ0aW9uUG9pbnQpfSR7cHJlZml4fSR7cHJvcGVydHlUZXh0cy5qb2luKCcsICcpfSR7b2xkQ29udGVudC5zbGljZShcbiAgICAgIGluc2VydGlvblBvaW50XG4gICAgKX1gO1xuICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiBmc1V0aWwuZ2VuZXJhdGVGaWxlKGZpbGVQYXRoLCBuZXdDb250ZW50KSk7XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBnZXROZXh0Q29uZmlnT2JqZWN0TGl0ZXJhbChjb250ZW50OiBzdHJpbmcpOiB0cy5PYmplY3RMaXRlcmFsRXhwcmVzc2lvbiB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IHNvdXJjZSA9IHRzLmNyZWF0ZVNvdXJjZUZpbGUoJ25leHQuY29uZmlnLmpzJywgY29udGVudCwgdHMuU2NyaXB0VGFyZ2V0LkxhdGVzdCwgdHJ1ZSwgdHMuU2NyaXB0S2luZC5KUyk7XG4gIGxldCBvYmplY3RMaXRlcmFsOiB0cy5PYmplY3RMaXRlcmFsRXhwcmVzc2lvbiB8IHVuZGVmaW5lZDtcbiAgY29uc3QgdmlzaXQgPSAobm9kZTogdHMuTm9kZSk6IHZvaWQgPT4ge1xuICAgIGlmIChvYmplY3RMaXRlcmFsKSByZXR1cm47XG4gICAgaWYgKHRzLmlzRXhwb3J0QXNzaWdubWVudChub2RlKSAmJiB0cy5pc09iamVjdExpdGVyYWxFeHByZXNzaW9uKG5vZGUuZXhwcmVzc2lvbikpIHtcbiAgICAgIG9iamVjdExpdGVyYWwgPSBub2RlLmV4cHJlc3Npb247XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmIChcbiAgICAgIHRzLmlzQmluYXJ5RXhwcmVzc2lvbihub2RlKSAmJlxuICAgICAgbm9kZS5vcGVyYXRvclRva2VuLmtpbmQgPT09IHRzLlN5bnRheEtpbmQuRXF1YWxzVG9rZW4gJiZcbiAgICAgIG5vZGUubGVmdC5nZXRUZXh0KHNvdXJjZSkgPT09ICdtb2R1bGUuZXhwb3J0cycgJiZcbiAgICAgIHRzLmlzT2JqZWN0TGl0ZXJhbEV4cHJlc3Npb24obm9kZS5yaWdodClcbiAgICApIHtcbiAgICAgIG9iamVjdExpdGVyYWwgPSBub2RlLnJpZ2h0O1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0cy5mb3JFYWNoQ2hpbGQobm9kZSwgdmlzaXQpO1xuICB9O1xuICB2aXNpdChzb3VyY2UpO1xuICByZXR1cm4gb2JqZWN0TGl0ZXJhbDtcbn1cbiIsImltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuXG5leHBvcnQgZnVuY3Rpb24gZG9lc0NvbnRhaW5Kc09yVHMoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogYm9vbGVhbiB7XG4gIHJldHVybiAoXG4gICAgY29uZmlnLmRvZXNDb250YWluSmF2YVNjcmlwdCB8fFxuICAgIGNvbmZpZy5kb2VzQ29udGFpbkphdmFTY3JpcHRJblBhY2thZ2VzIHx8XG4gICAgY29uZmlnLmRvZXNDb250YWluVHlwZVNjcmlwdCB8fFxuICAgIGNvbmZpZy5kb2VzQ29udGFpblR5cGVTY3JpcHRJblBhY2thZ2VzXG4gICk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBkb2VzQ29udGFpbkphdmEoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogYm9vbGVhbiB7XG4gIHJldHVybiBjb25maWcuZG9lc0NvbnRhaW5KYXZhIHx8IGNvbmZpZy5kb2VzQ29udGFpbkphdmFJblBhY2thZ2VzO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0UGFja2FnZU1hbmFnZXJDb21tYW5kKGNvbmZpZzogUGljazxQYWNrYWdlQ29uZmlnLCAnaXNCdW4nPik6ICdidW4nIHwgJ3lhcm4nIHtcbiAgcmV0dXJuIGNvbmZpZy5pc0J1biA/ICdidW4nIDogJ3lhcm4nO1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHRzIGZyb20gJ3R5cGVzY3JpcHQnO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBmc1V0aWwgfSBmcm9tICcuLi91dGlscy9mc1V0aWwuanMnO1xuaW1wb3J0IHsgZ2V0UGFja2FnZU1hbmFnZXJDb21tYW5kIH0gZnJvbSAnLi4vdXRpbHMvcGFja2FnZUNhcGFiaWxpdGllcy5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcblxudHlwZSBQYXJzZWRWYWx1ZSA9XG4gIHwgeyBraW5kOiAnYXJyYXknOyB2YWx1ZTogUGFyc2VkVmFsdWVbXSB9XG4gIHwgeyBraW5kOiAnbGl0ZXJhbCc7IHZhbHVlOiBzdHJpbmcgfVxuICB8IHsga2luZDogJ29iamVjdCc7IHZhbHVlOiBQYXJzZWRPYmplY3QgfTtcbnR5cGUgT2JqZWN0TWVtYmVyID0geyBraW5kOiAnZXh0cmEnOyBpbmRleDogbnVtYmVyIH0gfCB7IGtpbmQ6ICdwcm9wZXJ0eSc7IGtleTogc3RyaW5nIH07XG5pbnRlcmZhY2UgUGFyc2VkT2JqZWN0IHtcbiAgZXh0cmFNZW1iZXJzOiBzdHJpbmdbXTtcbiAgbWVtYmVyT3JkZXI6IE9iamVjdE1lbWJlcltdO1xuICBwcm9wZXJ0aWVzOiBSZWNvcmQ8c3RyaW5nLCBQYXJzZWRWYWx1ZT47XG59XG5pbnRlcmZhY2UgRXh0cmFjdGVkT2JqZWN0TGl0ZXJhbCB7XG4gIHNvdXJjZTogdHMuU291cmNlRmlsZTtcbiAgbm9kZTogdHMuT2JqZWN0TGl0ZXJhbEV4cHJlc3Npb247XG59XG5cbmNvbnN0IGxpdGVyYWwgPSAodmFsdWU6IHN0cmluZyk6IFBhcnNlZFZhbHVlID0+ICh7IGtpbmQ6ICdsaXRlcmFsJywgdmFsdWUgfSk7XG5jb25zdCBhc0FycmF5ID0gKHZhbHVlOiBQYXJzZWRWYWx1ZVtdKTogUGFyc2VkVmFsdWUgPT4gKHsga2luZDogJ2FycmF5JywgdmFsdWUgfSk7XG5jb25zdCBhc09iamVjdCA9IChwcm9wZXJ0aWVzOiBSZWNvcmQ8c3RyaW5nLCBQYXJzZWRWYWx1ZT4sIGV4dHJhTWVtYmVyczogc3RyaW5nW10gPSBbXSk6IFBhcnNlZFZhbHVlID0+ICh7XG4gIGtpbmQ6ICdvYmplY3QnLFxuICB2YWx1ZTogdG9QYXJzZWRPYmplY3QocHJvcGVydGllcywgZXh0cmFNZW1iZXJzKSxcbn0pO1xuXG5jb25zdCBjcmVhdGVEZWZhdWx0Q29uZmlnID0gKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFBhcnNlZE9iamVjdCA9PlxuICB0b1BhcnNlZE9iamVjdCh7XG4gICAgZm9yYmlkT25seTogbGl0ZXJhbCgnISFwcm9jZXNzLmVudi5DSScpLFxuICAgIHJldHJpZXM6IGxpdGVyYWwoJ3Byb2Nlc3MuZW52LlBXREVCVUcgPyAwIDogcHJvY2Vzcy5lbnYuQ0kgPyA1IDogMScpLFxuICAgIHVzZTogYXNPYmplY3Qoe1xuICAgICAgYmFzZVVSTDogbGl0ZXJhbCgncHJvY2Vzcy5lbnYuTkVYVF9QVUJMSUNfQkFTRV9VUkwnKSxcbiAgICAgIHRyYWNlOiBsaXRlcmFsKFwicHJvY2Vzcy5lbnYuQ0kgPyAnb24tZmlyc3QtcmV0cnknIDogJ3JldGFpbi1vbi1mYWlsdXJlJ1wiKSxcbiAgICAgIHNjcmVlbnNob3Q6IGxpdGVyYWwoXCJwcm9jZXNzLmVudi5DSSA/ICdvbmx5LW9uLWZhaWx1cmUnIDogJ29uJ1wiKSxcbiAgICAgIHZpZGVvOiBsaXRlcmFsKFwicHJvY2Vzcy5lbnYuQ0kgPyAnb24tZmlyc3QtcmV0cnknIDogJ3JldGFpbi1vbi1mYWlsdXJlJ1wiKSxcbiAgICB9KSxcbiAgICB3ZWJTZXJ2ZXI6IGFzT2JqZWN0KHtcbiAgICAgIGNvbW1hbmQ6IGxpdGVyYWwoZ2V0V2JTdGFydFRlc3RDb21tYW5kKGNvbmZpZykpLFxuICAgICAgdXJsOiBsaXRlcmFsKCdwcm9jZXNzLmVudi5ORVhUX1BVQkxJQ19CQVNFX1VSTCcpLFxuICAgICAgcmV1c2VFeGlzdGluZ1NlcnZlcjogbGl0ZXJhbCgnISFwcm9jZXNzLmVudi5DSScpLFxuICAgICAgdGltZW91dDogbGl0ZXJhbCgnMzAwXzAwMCcpLFxuICAgICAgc3Rkb3V0OiBsaXRlcmFsKFwiJ3BpcGUnXCIpLFxuICAgICAgc3RkZXJyOiBsaXRlcmFsKFwiJ3BpcGUnXCIpLFxuICAgICAgZW52OiBsaXRlcmFsKGB7XG4gIC4uLnByb2Nlc3MuZW52LFxuICBQUklTTUFfVVNFUl9DT05TRU5UX0ZPUl9EQU5HRVJPVVNfQUlfQUNUSU9OOiAndHJ1ZScsXG59YCksXG4gICAgICBncmFjZWZ1bFNodXRkb3duOiBsaXRlcmFsKGB7XG4gIHNpZ25hbDogJ1NJR1RFUk0nLFxuICB0aW1lb3V0OiA1MDAsXG59YCksXG4gICAgfSksXG4gIH0pO1xuXG5mdW5jdGlvbiB0b1BhcnNlZE9iamVjdChwcm9wZXJ0aWVzOiBSZWNvcmQ8c3RyaW5nLCBQYXJzZWRWYWx1ZT4sIGV4dHJhTWVtYmVyczogc3RyaW5nW10gPSBbXSk6IFBhcnNlZE9iamVjdCB7XG4gIHJldHVybiB7XG4gICAgZXh0cmFNZW1iZXJzLFxuICAgIG1lbWJlck9yZGVyOiBbXG4gICAgICAuLi5PYmplY3Qua2V5cyhwcm9wZXJ0aWVzKS5tYXAoKGtleSk6IE9iamVjdE1lbWJlciA9PiAoeyBraW5kOiAncHJvcGVydHknLCBrZXkgfSkpLFxuICAgICAgLi4uZXh0cmFNZW1iZXJzLm1hcCgoXywgaW5kZXgpOiBPYmplY3RNZW1iZXIgPT4gKHsga2luZDogJ2V4dHJhJywgaW5kZXggfSkpLFxuICAgIF0sXG4gICAgcHJvcGVydGllcyxcbiAgfTtcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGZpeFBsYXl3cmlnaHRDb25maWcoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCBgcGxheXdyaWdodC5jb25maWcudHNgKTtcbiAgaWYgKCFmcy5leGlzdHNTeW5jKGZpbGVQYXRoKSkgcmV0dXJuO1xuXG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZml4UGxheXdyaWdodENvbmZpZycsIGFzeW5jICgpID0+IHtcbiAgICBhd2FpdCBhc3NlcnROZXh0UHVibGljQmFzZVVybChjb25maWcuZGlyUGF0aCk7XG5cbiAgICBjb25zdCBvbGRDb250ZW50ID0gYXdhaXQgZnMucHJvbWlzZXMucmVhZEZpbGUoZmlsZVBhdGgsICd1dGY4Jyk7XG4gICAgY29uc3QgZXh0cmFjdGVkT2JqZWN0TGl0ZXJhbCA9IGV4dHJhY3REZWZpbmVDb25maWdPYmplY3RMaXRlcmFsKG9sZENvbnRlbnQpO1xuICAgIGlmICghZXh0cmFjdGVkT2JqZWN0TGl0ZXJhbCkgcmV0dXJuO1xuXG4gICAgY29uc3QgcGFyc2VkID0gcGFyc2VPYmplY3RMaXRlcmFsRXhwcmVzc2lvbihleHRyYWN0ZWRPYmplY3RMaXRlcmFsLm5vZGUsIGV4dHJhY3RlZE9iamVjdExpdGVyYWwuc291cmNlKTtcbiAgICBpZiAoIXBhcnNlZCkgcmV0dXJuO1xuXG4gICAgLy8gS2VlcCBmaWxsaW5nIG1pc3NpbmcgZGVmYXVsdHMsIGJ1dCBkb24ndCBvdmVyd3JpdGUgbG9jYWwgYWRqdXN0bWVudHMgb24gZXZlcnkgcmVnZW5lcmF0aW9uLlxuICAgIGNvbnN0IG1lcmdlZCA9IG1lcmdlUGFyc2VkT2JqZWN0cyhjcmVhdGVEZWZhdWx0Q29uZmlnKGNvbmZpZyksIHBhcnNlZCk7XG4gICAgc2V0V2ViU2VydmVyQ29tbWFuZChtZXJnZWQsIGNvbmZpZyk7XG5cbiAgICBjb25zdCBuZXdPYmplY3RMaXRlcmFsID0gc3RyaW5naWZ5VmFsdWUoeyBraW5kOiAnb2JqZWN0JywgdmFsdWU6IG1lcmdlZCB9LCAwKTtcbiAgICBjb25zdCBzdGFydCA9IGV4dHJhY3RlZE9iamVjdExpdGVyYWwubm9kZS5nZXRTdGFydChleHRyYWN0ZWRPYmplY3RMaXRlcmFsLnNvdXJjZSk7XG4gICAgY29uc3QgZW5kID0gZXh0cmFjdGVkT2JqZWN0TGl0ZXJhbC5ub2RlLmdldEVuZCgpO1xuICAgIGNvbnN0IG5ld0NvbnRlbnQgPSBgJHtvbGRDb250ZW50LnNsaWNlKDAsIHN0YXJ0KX0ke25ld09iamVjdExpdGVyYWx9JHtvbGRDb250ZW50LnNsaWNlKGVuZCl9YDtcblxuICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiBmc1V0aWwuZ2VuZXJhdGVGaWxlKGZpbGVQYXRoLCBuZXdDb250ZW50KSk7XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBtZXJnZVBhcnNlZE9iamVjdHMoYmFzZTogUGFyc2VkT2JqZWN0LCBvdmVycmlkZTogUGFyc2VkT2JqZWN0KTogUGFyc2VkT2JqZWN0IHtcbiAgY29uc3Qgb3ZlcnJpZGVQcm9wZXJ0eUtleXMgPSBuZXcgU2V0KE9iamVjdC5rZXlzKG92ZXJyaWRlLnByb3BlcnRpZXMpKTtcbiAgY29uc3QgZXh0cmFNZW1iZXJzID0gWy4uLmJhc2UuZXh0cmFNZW1iZXJzLCAuLi5vdmVycmlkZS5leHRyYU1lbWJlcnNdO1xuICAvLyBLZWVwIGRlZmF1bHQtb25seSBtZW1iZXJzIGJlZm9yZSBwYXJzZWQgbWVtYmVycyBzbyBzcHJlYWRzIGFuZCBleHBsaWNpdCBsb2NhbCBwcm9wZXJ0aWVzIHJldGFpbiBwcmVjZWRlbmNlLlxuICBjb25zdCBtZW1iZXJPcmRlciA9IFtcbiAgICAuLi5iYXNlLm1lbWJlck9yZGVyLmZpbHRlcigobWVtYmVyKSA9PiBtZW1iZXIua2luZCAhPT0gJ3Byb3BlcnR5JyB8fCAhb3ZlcnJpZGVQcm9wZXJ0eUtleXMuaGFzKG1lbWJlci5rZXkpKSxcbiAgICAuLi5vdmVycmlkZS5tZW1iZXJPcmRlci5tYXAoKG1lbWJlcik6IE9iamVjdE1lbWJlciA9PiB7XG4gICAgICBpZiAobWVtYmVyLmtpbmQgPT09ICdwcm9wZXJ0eScpIHJldHVybiBtZW1iZXI7XG4gICAgICByZXR1cm4geyBraW5kOiAnZXh0cmEnLCBpbmRleDogYmFzZS5leHRyYU1lbWJlcnMubGVuZ3RoICsgbWVtYmVyLmluZGV4IH07XG4gICAgfSksXG4gIF07XG4gIGNvbnN0IHByb3BlcnRpZXMgPSB7IC4uLmJhc2UucHJvcGVydGllcyB9O1xuICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhvdmVycmlkZS5wcm9wZXJ0aWVzKSkge1xuICAgIHByb3BlcnRpZXNba2V5XSA9IG1lcmdlUGFyc2VkVmFsdWUocHJvcGVydGllc1trZXldLCB2YWx1ZSk7XG4gIH1cbiAgcmV0dXJuIHsgZXh0cmFNZW1iZXJzLCBtZW1iZXJPcmRlciwgcHJvcGVydGllcyB9O1xufVxuXG5mdW5jdGlvbiBtZXJnZVBhcnNlZFZhbHVlKGJhc2U6IFBhcnNlZFZhbHVlIHwgdW5kZWZpbmVkLCBvdmVycmlkZTogUGFyc2VkVmFsdWUpOiBQYXJzZWRWYWx1ZSB7XG4gIGlmIChiYXNlPy5raW5kID09PSAnb2JqZWN0JyAmJiBvdmVycmlkZS5raW5kID09PSAnb2JqZWN0Jykge1xuICAgIHJldHVybiB7IGtpbmQ6ICdvYmplY3QnLCB2YWx1ZTogbWVyZ2VQYXJzZWRPYmplY3RzKGJhc2UudmFsdWUsIG92ZXJyaWRlLnZhbHVlKSB9O1xuICB9XG4gIHJldHVybiBvdmVycmlkZTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gYXNzZXJ0TmV4dFB1YmxpY0Jhc2VVcmwoZGlyUGF0aDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gIGZvciAoY29uc3QgZW52RmlsZVBhdGggb2YgZ2V0RW52RmlsZVBhdGhzKGRpclBhdGgpKSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGNvbnRlbnQgPSBhd2FpdCBmcy5wcm9taXNlcy5yZWFkRmlsZShlbnZGaWxlUGF0aCwgJ3V0ZjgnKTtcbiAgICAgIGlmICgvTkVYVF9QVUJMSUNfQkFTRV9VUkxcXHMqPS9tLnRlc3QoY29udGVudCkpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgIH0gY2F0Y2gge1xuICAgICAgLy8gTWlzc2luZyBlbnYgZmlsZXMgYXJlIGV4cGVjdGVkIGluIHNvbWUgcmVwb3MuXG4gICAgfVxuICB9XG5cbiAgdGhyb3cgbmV3IEVycm9yKCdORVhUX1BVQkxJQ19CQVNFX1VSTCBpcyByZXF1aXJlZCBmb3IgUGxheXdyaWdodC4gRGVmaW5lIE5FWFRfUFVCTElDX0JBU0VfVVJMIGluIHRoZSB0YXJnZXQgcmVwby4nKTtcbn1cblxuZnVuY3Rpb24gZ2V0RW52RmlsZVBhdGhzKGRpclBhdGg6IHN0cmluZyk6IHN0cmluZ1tdIHtcbiAgY29uc3QgZW52RmlsZU5hbWVzID0gWycuZW52JywgJy5lbnYudGVzdCcsICcuZW52LmV4YW1wbGUnLCAnbWlzZS50b21sJywgJ21pc2UudGVzdC50b21sJ107XG4gIGNvbnN0IGVudkZpbGVQYXRoczogc3RyaW5nW10gPSBbXTtcblxuICBmb3IgKGxldCBjdXJyZW50RGlyUGF0aCA9IHBhdGgucmVzb2x2ZShkaXJQYXRoKTsgOyBjdXJyZW50RGlyUGF0aCA9IHBhdGguZGlybmFtZShjdXJyZW50RGlyUGF0aCkpIHtcbiAgICBlbnZGaWxlUGF0aHMucHVzaCguLi5lbnZGaWxlTmFtZXMubWFwKChmaWxlTmFtZSkgPT4gcGF0aC5yZXNvbHZlKGN1cnJlbnREaXJQYXRoLCBmaWxlTmFtZSkpKTtcblxuICAgIC8vIFBsYXl3cmlnaHQgY29uZmlncyBvZnRlbiBsaXZlIGluIHBhY2thZ2VzLyogd2hpbGUgc2hhcmVkIGVudiBmaWxlcyBsaXZlIGF0IHRoZVxuICAgIC8vIHJlcG9zaXRvcnkgcm9vdCwgc28gd2FsayB1cHdhcmQgdW50aWwgdGhlIHRhcmdldCByZXBvIGJvdW5kYXJ5LlxuICAgIGlmIChmcy5leGlzdHNTeW5jKHBhdGgucmVzb2x2ZShjdXJyZW50RGlyUGF0aCwgJy5naXQnKSkpIGJyZWFrO1xuXG4gICAgY29uc3QgcGFyZW50RGlyUGF0aCA9IHBhdGguZGlybmFtZShjdXJyZW50RGlyUGF0aCk7XG4gICAgaWYgKHBhcmVudERpclBhdGggPT09IGN1cnJlbnREaXJQYXRoKSBicmVhaztcbiAgfVxuXG4gIHJldHVybiBlbnZGaWxlUGF0aHM7XG59XG5cbmZ1bmN0aW9uIHNldFdlYlNlcnZlckNvbW1hbmQob2JqZWN0OiBQYXJzZWRPYmplY3QsIGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IHZvaWQge1xuICBjb25zdCB3ZWJTZXJ2ZXIgPSBvYmplY3QucHJvcGVydGllcy53ZWJTZXJ2ZXI7XG4gIGlmICh3ZWJTZXJ2ZXI/LmtpbmQgIT09ICdvYmplY3QnKSByZXR1cm47XG5cbiAgLy8gd2Igb3ducyB0aGUgY2Fub25pY2FsIHRlc3Qtc2VydmVyIHN0YXJ0dXAgcGF0aDsga2VlcCBjdXN0b20gUGxheXdyaWdodFxuICAvLyBzZXJ2ZXIgc2V0dGluZ3Mgd2hpbGUgbm9ybWFsaXppbmcgdGhlIGNvbW1hbmQgaXRzZWxmLiBJbnZva2Ugd2IgdGhyb3VnaCB0aGVcbiAgLy8gcGFja2FnZSBtYW5hZ2VyIGJlY2F1c2UgdGFyZ2V0IHJlcG9zIGluc3RhbGwgd2IgYXMgYSBwYWNrYWdlIGRlcGVuZGVuY3kuXG4gIHdlYlNlcnZlci52YWx1ZS5wcm9wZXJ0aWVzLmNvbW1hbmQgPSBsaXRlcmFsKGdldFdiU3RhcnRUZXN0Q29tbWFuZChjb25maWcpKTtcbn1cblxuZnVuY3Rpb24gZ2V0V2JTdGFydFRlc3RDb21tYW5kKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IHN0cmluZyB7XG4gIHJldHVybiBgJyR7Z2V0UGFja2FnZU1hbmFnZXJDb21tYW5kKGNvbmZpZyl9IHdiIHN0YXJ0IC0tbW9kZSB0ZXN0J2A7XG59XG5cbmZ1bmN0aW9uIGV4dHJhY3REZWZpbmVDb25maWdPYmplY3RMaXRlcmFsKGNvbnRlbnQ6IHN0cmluZyk6IEV4dHJhY3RlZE9iamVjdExpdGVyYWwgfCB1bmRlZmluZWQge1xuICBjb25zdCBzb3VyY2UgPSB0cy5jcmVhdGVTb3VyY2VGaWxlKCdwbGF5d3JpZ2h0LmNvbmZpZy50cycsIGNvbnRlbnQsIHRzLlNjcmlwdFRhcmdldC5MYXRlc3QsIHRydWUsIHRzLlNjcmlwdEtpbmQuVFMpO1xuXG4gIC8vIFR5cGVTY3JpcHQgYWxyZWFkeSB1bmRlcnN0YW5kcyBuZXN0ZWQgb2JqZWN0IGxpdGVyYWxzIGFuZCB0ZW1wbGF0ZSBzdHJpbmdzLCBzbyB1c2VcbiAgLy8gaXRzIEFTVCByYW5nZXMgaW5zdGVhZCBvZiBhIHJlZ2V4IHRoYXQgY2FuIHN0b3AgYXQgdGhlIGZpcnN0IGlubmVyIGNsb3NpbmcgYnJhY2UuXG4gIGxldCBmb3VuZDogdHMuT2JqZWN0TGl0ZXJhbEV4cHJlc3Npb24gfCB1bmRlZmluZWQ7XG4gIGNvbnN0IHZpc2l0ID0gKG5vZGU6IHRzLk5vZGUpOiB2b2lkID0+IHtcbiAgICBpZiAoZm91bmQpIHJldHVybjtcbiAgICBpZiAodHMuaXNDYWxsRXhwcmVzc2lvbihub2RlKSAmJiBub2RlLmV4cHJlc3Npb24uZ2V0VGV4dChzb3VyY2UpID09PSAnZGVmaW5lQ29uZmlnJykge1xuICAgICAgY29uc3QgZmlyc3RBcmd1bWVudCA9IG5vZGUuYXJndW1lbnRzWzBdO1xuICAgICAgaWYgKGZpcnN0QXJndW1lbnQgJiYgdHMuaXNPYmplY3RMaXRlcmFsRXhwcmVzc2lvbihmaXJzdEFyZ3VtZW50KSkge1xuICAgICAgICBmb3VuZCA9IGZpcnN0QXJndW1lbnQ7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICB9XG4gICAgdHMuZm9yRWFjaENoaWxkKG5vZGUsIHZpc2l0KTtcbiAgfTtcbiAgdmlzaXQoc291cmNlKTtcblxuICByZXR1cm4gZm91bmQgPyB7IHNvdXJjZSwgbm9kZTogZm91bmQgfSA6IHVuZGVmaW5lZDtcbn1cblxuZnVuY3Rpb24gcGFyc2VFeHByZXNzaW9uKGV4cHJlc3Npb246IHRzLkV4cHJlc3Npb24sIHNvdXJjZTogdHMuU291cmNlRmlsZSk6IFBhcnNlZFZhbHVlIHwgdW5kZWZpbmVkIHtcbiAgaWYgKHRzLmlzT2JqZWN0TGl0ZXJhbEV4cHJlc3Npb24oZXhwcmVzc2lvbikpIHtcbiAgICBjb25zdCBwYXJzZWRPYmplY3QgPSBwYXJzZU9iamVjdExpdGVyYWxFeHByZXNzaW9uKGV4cHJlc3Npb24sIHNvdXJjZSk7XG4gICAgcmV0dXJuIHBhcnNlZE9iamVjdCA/IHsga2luZDogJ29iamVjdCcsIHZhbHVlOiBwYXJzZWRPYmplY3QgfSA6IGxpdGVyYWwoZXhwcmVzc2lvbi5nZXRUZXh0KHNvdXJjZSkpO1xuICB9XG4gIGlmICh0cy5pc0FycmF5TGl0ZXJhbEV4cHJlc3Npb24oZXhwcmVzc2lvbikpIHtcbiAgICBjb25zdCBlbGVtZW50cyA9IGV4cHJlc3Npb24uZWxlbWVudHMubWFwKChlbGVtZW50KSA9PiBwYXJzZUV4cHJlc3Npb24oZWxlbWVudCwgc291cmNlKSk7XG4gICAgaWYgKGVsZW1lbnRzLnNvbWUoKGVsZW1lbnQpOiBlbGVtZW50IGlzIHVuZGVmaW5lZCA9PiBlbGVtZW50ID09PSB1bmRlZmluZWQpKSB7XG4gICAgICByZXR1cm4gbGl0ZXJhbChleHByZXNzaW9uLmdldFRleHQoc291cmNlKSk7XG4gICAgfVxuICAgIHJldHVybiBhc0FycmF5KGVsZW1lbnRzIGFzIFBhcnNlZFZhbHVlW10pO1xuICB9XG4gIHJldHVybiBsaXRlcmFsKGV4cHJlc3Npb24uZ2V0VGV4dChzb3VyY2UpKTtcbn1cblxuZnVuY3Rpb24gcGFyc2VPYmplY3RMaXRlcmFsRXhwcmVzc2lvbihcbiAgb2JqZWN0TGl0ZXJhbDogdHMuT2JqZWN0TGl0ZXJhbEV4cHJlc3Npb24sXG4gIHNvdXJjZTogdHMuU291cmNlRmlsZVxuKTogUGFyc2VkT2JqZWN0IHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgcGFyc2VkOiBQYXJzZWRPYmplY3QgPSB7IGV4dHJhTWVtYmVyczogW10sIG1lbWJlck9yZGVyOiBbXSwgcHJvcGVydGllczoge30gfTtcbiAgZm9yIChjb25zdCBwcm9wZXJ0eSBvZiBvYmplY3RMaXRlcmFsLnByb3BlcnRpZXMpIHtcbiAgICBpZiAodHMuaXNTaG9ydGhhbmRQcm9wZXJ0eUFzc2lnbm1lbnQocHJvcGVydHkpKSB7XG4gICAgICBjb25zdCBrZXkgPSBwcm9wZXJ0eS5uYW1lLmdldFRleHQoc291cmNlKTtcbiAgICAgIHBhcnNlZC5wcm9wZXJ0aWVzW2tleV0gPSBsaXRlcmFsKGtleSk7XG4gICAgICBwYXJzZWQubWVtYmVyT3JkZXIucHVzaCh7IGtpbmQ6ICdwcm9wZXJ0eScsIGtleSB9KTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBpZiAoIXRzLmlzUHJvcGVydHlBc3NpZ25tZW50KHByb3BlcnR5KSB8fCAoIXRzLmlzSWRlbnRpZmllcihwcm9wZXJ0eS5uYW1lKSAmJiAhdHMuaXNTdHJpbmdMaXRlcmFsKHByb3BlcnR5Lm5hbWUpKSkge1xuICAgICAgY29uc3QgaW5kZXggPSBwYXJzZWQuZXh0cmFNZW1iZXJzLnB1c2gocHJvcGVydHkuZ2V0VGV4dChzb3VyY2UpKSAtIDE7XG4gICAgICBwYXJzZWQubWVtYmVyT3JkZXIucHVzaCh7IGtpbmQ6ICdleHRyYScsIGluZGV4IH0pO1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGNvbnN0IHZhbHVlID0gcGFyc2VFeHByZXNzaW9uKHByb3BlcnR5LmluaXRpYWxpemVyLCBzb3VyY2UpO1xuICAgIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkKSByZXR1cm47XG4gICAgY29uc3Qga2V5ID0gcHJvcGVydHkubmFtZS5nZXRUZXh0KHNvdXJjZSk7XG4gICAgcGFyc2VkLnByb3BlcnRpZXNba2V5XSA9IHZhbHVlO1xuICAgIHBhcnNlZC5tZW1iZXJPcmRlci5wdXNoKHsga2luZDogJ3Byb3BlcnR5Jywga2V5IH0pO1xuICB9XG4gIHJldHVybiBwYXJzZWQ7XG59XG5cbmZ1bmN0aW9uIHN0cmluZ2lmeVZhbHVlKHZhbHVlOiBQYXJzZWRWYWx1ZSwgbGV2ZWw6IG51bWJlcik6IHN0cmluZyB7XG4gIGNvbnN0IGNsb3NpbmdJbmRlbnQgPSAnICAnLnJlcGVhdChsZXZlbCk7XG4gIGlmICh2YWx1ZS5raW5kID09PSAnYXJyYXknKSB7XG4gICAgaWYgKHZhbHVlLnZhbHVlLmxlbmd0aCA9PT0gMCkgcmV0dXJuICdbXSc7XG4gICAgY29uc3QgaW5kZW50ID0gJyAgJy5yZXBlYXQobGV2ZWwgKyAxKTtcbiAgICBjb25zdCBsaW5lcyA9IHZhbHVlLnZhbHVlLm1hcCgoaXRlbSkgPT4ge1xuICAgICAgY29uc3Qgc3RyaW5naWZpZWQgPSBzdHJpbmdpZnlWYWx1ZShpdGVtLCBsZXZlbCArIDEpLnNwbGl0KCdcXG4nKTtcbiAgICAgIHN0cmluZ2lmaWVkW3N0cmluZ2lmaWVkLmxlbmd0aCAtIDFdID0gYCR7c3RyaW5naWZpZWQuYXQoLTEpfSxgO1xuICAgICAgaWYgKGl0ZW0ua2luZCA9PT0gJ2xpdGVyYWwnKSB7XG4gICAgICAgIGZvciAobGV0IGluZGV4ID0gMTsgaW5kZXggPCBzdHJpbmdpZmllZC5sZW5ndGg7IGluZGV4ICs9IDEpIHtcbiAgICAgICAgICBzdHJpbmdpZmllZFtpbmRleF0gPSBgJHtpbmRlbnR9JHtzdHJpbmdpZmllZFtpbmRleF19YDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgc3RyaW5naWZpZWRbMF0gPSBgJHtpbmRlbnR9JHtzdHJpbmdpZmllZFswXX1gO1xuICAgICAgcmV0dXJuIHN0cmluZ2lmaWVkLmpvaW4oJ1xcbicpO1xuICAgIH0pO1xuICAgIHJldHVybiBgW1xcbiR7bGluZXMuam9pbignXFxuJyl9XFxuJHtjbG9zaW5nSW5kZW50fV1gO1xuICB9XG4gIGlmICh2YWx1ZS5raW5kID09PSAnbGl0ZXJhbCcpIHJldHVybiB2YWx1ZS52YWx1ZTtcblxuICBjb25zdCBpbmRlbnQgPSAnICAnLnJlcGVhdChsZXZlbCArIDEpO1xuICBjb25zdCBlbWl0dGVkUHJvcGVydGllcyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICBjb25zdCBsYXN0UHJvcGVydHlJbmRleEJ5S2V5ID0gZ2V0TGFzdFByb3BlcnR5SW5kZXhCeUtleSh2YWx1ZS52YWx1ZS5tZW1iZXJPcmRlcik7XG4gIGNvbnN0IGxpbmVzID0gdmFsdWUudmFsdWUubWVtYmVyT3JkZXIuZmxhdE1hcCgobWVtYmVyLCBpbmRleCkgPT4ge1xuICAgIGlmIChtZW1iZXIua2luZCA9PT0gJ2V4dHJhJykge1xuICAgICAgcmV0dXJuIFtzdHJpbmdpZnlPYmplY3RNZW1iZXIodmFsdWUudmFsdWUuZXh0cmFNZW1iZXJzW21lbWJlci5pbmRleF0gPz8gJycsIGluZGVudCldO1xuICAgIH1cblxuICAgIGlmIChsYXN0UHJvcGVydHlJbmRleEJ5S2V5LmdldChtZW1iZXIua2V5KSAhPT0gaW5kZXgpIHJldHVybiBbXTtcbiAgICBjb25zdCBpdGVtID0gdmFsdWUudmFsdWUucHJvcGVydGllc1ttZW1iZXIua2V5XTtcbiAgICBpZiAoIWl0ZW0gfHwgZW1pdHRlZFByb3BlcnRpZXMuaGFzKG1lbWJlci5rZXkpKSByZXR1cm4gW107XG4gICAgZW1pdHRlZFByb3BlcnRpZXMuYWRkKG1lbWJlci5rZXkpO1xuICAgIHJldHVybiBbc3RyaW5naWZ5T2JqZWN0UHJvcGVydHkobWVtYmVyLmtleSwgaXRlbSwgbGV2ZWwsIGluZGVudCldO1xuICB9KTtcbiAgbGluZXMucHVzaChcbiAgICAuLi5PYmplY3QuZW50cmllcyh2YWx1ZS52YWx1ZS5wcm9wZXJ0aWVzKVxuICAgICAgLmZpbHRlcigoW2tleV0pID0+ICFlbWl0dGVkUHJvcGVydGllcy5oYXMoa2V5KSlcbiAgICAgIC5tYXAoKFtrZXksIGl0ZW1dKSA9PiBzdHJpbmdpZnlPYmplY3RQcm9wZXJ0eShrZXksIGl0ZW0sIGxldmVsLCBpbmRlbnQpKVxuICApO1xuICBpZiAobGluZXMubGVuZ3RoID09PSAwKSByZXR1cm4gYHtcXG4ke2Nsb3NpbmdJbmRlbnR9fWA7XG4gIHJldHVybiBge1xcbiR7bGluZXMuam9pbignXFxuJyl9XFxuJHtjbG9zaW5nSW5kZW50fX1gO1xufVxuXG5mdW5jdGlvbiBnZXRMYXN0UHJvcGVydHlJbmRleEJ5S2V5KG1lbWJlck9yZGVyOiBPYmplY3RNZW1iZXJbXSk6IE1hcDxzdHJpbmcsIG51bWJlcj4ge1xuICBjb25zdCBsYXN0UHJvcGVydHlJbmRleEJ5S2V5ID0gbmV3IE1hcDxzdHJpbmcsIG51bWJlcj4oKTtcbiAgZm9yIChjb25zdCBbaW5kZXgsIG1lbWJlcl0gb2YgbWVtYmVyT3JkZXIuZW50cmllcygpKSB7XG4gICAgaWYgKG1lbWJlci5raW5kID09PSAncHJvcGVydHknKSB7XG4gICAgICBsYXN0UHJvcGVydHlJbmRleEJ5S2V5LnNldChtZW1iZXIua2V5LCBpbmRleCk7XG4gICAgfVxuICB9XG4gIHJldHVybiBsYXN0UHJvcGVydHlJbmRleEJ5S2V5O1xufVxuXG5mdW5jdGlvbiBzdHJpbmdpZnlPYmplY3RQcm9wZXJ0eShrZXk6IHN0cmluZywgaXRlbTogUGFyc2VkVmFsdWUsIGxldmVsOiBudW1iZXIsIGluZGVudDogc3RyaW5nKTogc3RyaW5nIHtcbiAgY29uc3Qgc3RyaW5naWZpZWQgPSBzdHJpbmdpZnlWYWx1ZShpdGVtLCBsZXZlbCArIDEpLnNwbGl0KCdcXG4nKTtcbiAgc3RyaW5naWZpZWRbc3RyaW5naWZpZWQubGVuZ3RoIC0gMV0gPSBgJHtzdHJpbmdpZmllZC5hdCgtMSl9LGA7XG4gIGlmIChpdGVtLmtpbmQgPT09ICdsaXRlcmFsJykge1xuICAgIGZvciAobGV0IGluZGV4ID0gMTsgaW5kZXggPCBzdHJpbmdpZmllZC5sZW5ndGg7IGluZGV4ICs9IDEpIHtcbiAgICAgIHN0cmluZ2lmaWVkW2luZGV4XSA9IGAke2luZGVudH0ke3N0cmluZ2lmaWVkW2luZGV4XX1gO1xuICAgIH1cbiAgfVxuICBzdHJpbmdpZmllZFswXSA9IGAke2luZGVudH0ke2tleX06ICR7c3RyaW5naWZpZWRbMF19YDtcbiAgcmV0dXJuIHN0cmluZ2lmaWVkLmpvaW4oJ1xcbicpO1xufVxuXG5mdW5jdGlvbiBzdHJpbmdpZnlPYmplY3RNZW1iZXIobWVtYmVyOiBzdHJpbmcsIGluZGVudDogc3RyaW5nKTogc3RyaW5nIHtcbiAgY29uc3Qgc3RyaW5naWZpZWQgPSBtZW1iZXIuc3BsaXQoJ1xcbicpO1xuICBzdHJpbmdpZmllZFtzdHJpbmdpZmllZC5sZW5ndGggLSAxXSA9IGAke3N0cmluZ2lmaWVkLmF0KC0xKX0sYDtcbiAgZm9yIChjb25zdCBbaW5kZXgsIGxpbmVdIG9mIHN0cmluZ2lmaWVkLmVudHJpZXMoKSkge1xuICAgIHN0cmluZ2lmaWVkW2luZGV4XSA9IGAke2luZGVudH0ke2xpbmV9YDtcbiAgfVxuICByZXR1cm4gc3RyaW5naWZpZWQuam9pbignXFxuJyk7XG59XG4iLCJleHBvcnQgY29uc3QgZ2xvYklnbm9yZSA9IFtcbiAgJyoqL25vZGVfbW9kdWxlcy8qKicsXG4gICcqKi8udmVudi8qKicsXG4gICcqKi90ZXN0LWZpeHR1cmVzLyoqJyxcbiAgJyoqL3Rlc3QvZml4dHVyZXMvKionLFxuICAnKiovZGlzdC8qKicsXG4gICcqKi9idWlsZC8qKicsXG4gICcqKi90YXJnZXQvKionLFxuICAnKiovdGVtcC8qKicsXG4gICcqKi90bXAvKionLFxuXTtcbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzL3Byb21pc2VzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCBmZyBmcm9tICdmYXN0LWdsb2InO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBnbG9iSWdub3JlIH0gZnJvbSAnLi4vdXRpbHMvZ2xvYlV0aWwuanMnO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZml4UHJpc21hRW52RmlsZXMoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZml4UHJpc21hRW52RmlsZXMnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3Qgc2hvdWxkQWRkQ29ubmVjdGlvbkxpbWl0ID0gc2hvdWxkQWRkU3FsaXRlQ29ubmVjdGlvbkxpbWl0KGNvbmZpZyk7XG4gICAgY29uc3QgZW52RmlsZXMgPSBhd2FpdCBmZy5nbG9iKFsnKi5lbnYnLCAnKi5lbnYuKiddLCB7IGRvdDogdHJ1ZSwgY3dkOiBjb25maWcuZGlyUGF0aCwgaWdub3JlOiBnbG9iSWdub3JlIH0pO1xuICAgIGZvciAoY29uc3QgZW52RmlsZSBvZiBlbnZGaWxlcykge1xuICAgICAgY29uc3QgZW52RmlsZVBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsIGVudkZpbGUpO1xuICAgICAgY29uc3QgY29udGVudCA9IGF3YWl0IGZzLnJlYWRGaWxlKGVudkZpbGVQYXRoLCAndXRmOCcpO1xuICAgICAgY29uc3QgbmV3Q29udGVudCA9IGNvbnRlbnQucmVwbGFjZUFsbChcbiAgICAgICAgL0RBVEFCQVNFX1VSTFxccyo9XFxzKlwiPyhbXlwiI1xcbl0rP1xcLnNxbGl0ZTNbXlwiI1xcbl0qKVwiPy9nLFxuICAgICAgICAobWF0Y2gsIHVybDogc3RyaW5nKSA9PiB7XG4gICAgICAgICAgcmV0dXJuIGBEQVRBQkFTRV9VUkw9XCIke25vcm1hbGl6ZVNxbGl0ZURhdGFiYXNlVXJsKHVybCwgc2hvdWxkQWRkQ29ubmVjdGlvbkxpbWl0KX1cImA7XG4gICAgICAgIH1cbiAgICAgICk7XG4gICAgICBpZiAobmV3Q29udGVudCAhPT0gY29udGVudCkge1xuICAgICAgICBhd2FpdCBmcy53cml0ZUZpbGUoZW52RmlsZVBhdGgsIG5ld0NvbnRlbnQpO1xuICAgICAgfVxuICAgIH1cbiAgfSk7XG59XG5cbmZ1bmN0aW9uIHNob3VsZEFkZFNxbGl0ZUNvbm5lY3Rpb25MaW1pdChjb25maWc6IFBhY2thZ2VDb25maWcpOiBib29sZWFuIHtcbiAgaWYgKCFjb25maWcuZGVwZW5kaW5nLnByaXNtYSkgcmV0dXJuIGZhbHNlO1xuXG4gIGNvbnN0IGRlcGVuZGVuY2llcyA9IHtcbiAgICAuLi5jb25maWcucGFja2FnZUpzb24/LmRlcGVuZGVuY2llcyxcbiAgICAuLi5jb25maWcucGFja2FnZUpzb24/LmRldkRlcGVuZGVuY2llcyxcbiAgfTtcblxuICAvLyBgY29ubmVjdGlvbl9saW1pdD0xYCBvbmx5IGFwcGxpZXMgdG8gUHJpc21hJ3MgU1FMaXRlIGRhdGFzb3VyY2UgaGFuZGxpbmcuXG4gIC8vIFJlcG9zIHRoYXQgb3B0IGludG8gbm9uLXB1cmUgU1FMaXRlIGFkYXB0ZXJzIHNob3VsZCBrZWVwIHRoZWlyIFVSTCBhcy1pcy5cbiAgcmV0dXJuICFkZXBlbmRlbmNpZXNbJ0BwcmlzbWEvYWRhcHRlci1iZXR0ZXItc3FsaXRlMyddICYmICFkZXBlbmRlbmNpZXNbJ0BwcmlzbWEvYWRhcHRlci1saWJzcWwnXTtcbn1cblxuZnVuY3Rpb24gbm9ybWFsaXplU3FsaXRlRGF0YWJhc2VVcmwodXJsOiBzdHJpbmcsIHNob3VsZEFkZENvbm5lY3Rpb25MaW1pdDogYm9vbGVhbik6IHN0cmluZyB7XG4gIGNvbnN0IHF1ZXJ5U3RhcnQgPSB1cmwuaW5kZXhPZignPycpO1xuICBjb25zdCBwYXRoUGFydCA9IHF1ZXJ5U3RhcnQgIT09IC0xID8gdXJsLnNsaWNlKDAsIHF1ZXJ5U3RhcnQpIDogdXJsO1xuICBjb25zdCBxdWVyeVBhcnQgPSBxdWVyeVN0YXJ0ICE9PSAtMSA/IHVybC5zbGljZShxdWVyeVN0YXJ0ICsgMSkgOiAnJztcbiAgY29uc3QgcGFyYW1zID0gbmV3IFVSTFNlYXJjaFBhcmFtcyhxdWVyeVBhcnQpO1xuXG4gIHBhcmFtcy5kZWxldGUoJ2Nvbm5lY3Rpb25fbGltaXQnKTtcbiAgaWYgKHNob3VsZEFkZENvbm5lY3Rpb25MaW1pdCkge1xuICAgIHBhcmFtcy5zZXQoJ2Nvbm5lY3Rpb25fbGltaXQnLCAnMScpO1xuICB9XG5cbiAgY29uc3Qgbm9ybWFsaXplZFF1ZXJ5ID0gcGFyYW1zLnRvU3RyaW5nKCk7XG4gIHJldHVybiBub3JtYWxpemVkUXVlcnkgPyBgJHtwYXRoUGFydH0/JHtub3JtYWxpemVkUXVlcnl9YCA6IHBhdGhQYXJ0O1xufVxuIiwiY29uc3QgaGFzID0gKG9iamVjdCwga2V5KSA9PiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqZWN0LCBrZXkpXG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHNvcnRPYmplY3RCeUtleU5hbWVMaXN0KG9iamVjdCwgc29ydFdpdGgpIHtcbiAgbGV0IGtleXMsIHNvcnRGbiwga2V5XG5cbiAgaWYgKHR5cGVvZiBzb3J0V2l0aCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIHNvcnRGbiA9IHNvcnRXaXRoXG4gIH0gZWxzZSB7XG4gICAga2V5cyA9IHNvcnRXaXRoXG4gIH1cblxuICBjb25zdCB0b3RhbCA9IHt9XG4gIGNvbnN0IG9iamVjdEtleXMgPSBbLi4uKGtleXMgPz8gW10pLCAuLi5PYmplY3Qua2V5cyhvYmplY3QpLnNvcnQoc29ydEZuKV1cblxuICBmb3IgKGtleSBvZiBvYmplY3RLZXlzKSB7XG4gICAgaWYgKGhhcyhvYmplY3QsIGtleSkpIHtcbiAgICAgIHRvdGFsW2tleV0gPSBvYmplY3Rba2V5XVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiB0b3RhbFxufVxuIiwiLy8gRGV0ZWN0IGVpdGhlciBzcGFjZXMgb3IgdGFicyBidXQgbm90IGJvdGggdG8gcHJvcGVybHkgaGFuZGxlIHRhYnMgZm9yIGluZGVudGF0aW9uIGFuZCBzcGFjZXMgZm9yIGFsaWdubWVudFxuY29uc3QgSU5ERU5UX1JFR0VYID0gL14oPzooICkrfFxcdCspLztcblxuY29uc3QgSU5ERU5UX1RZUEVfU1BBQ0UgPSAnc3BhY2UnO1xuY29uc3QgSU5ERU5UX1RZUEVfVEFCID0gJ3RhYic7XG5cbi8vIEhlbHBlciBmdW5jdGlvbiB0byBjaGVjayBpZiB3ZSBzaG91bGQgaWdub3JlIHNpbmdsZSBzcGFjZSBwYXR0ZXJuc1xuZnVuY3Rpb24gc2hvdWxkSWdub3JlU2luZ2xlU3BhY2UoaWdub3JlU2luZ2xlU3BhY2VzLCBpbmRlbnRUeXBlLCB2YWx1ZSkge1xuXHRyZXR1cm4gaWdub3JlU2luZ2xlU3BhY2VzICYmIGluZGVudFR5cGUgPT09IElOREVOVF9UWVBFX1NQQUNFICYmIHZhbHVlID09PSAxO1xufVxuXG4vKipcbk1ha2UgYSBNYXAgdGhhdCBjb3VudHMgaG93IG1hbnkgaW5kZW50cy91bmluZGVudHMgaGF2ZSBvY2N1cnJlZCBmb3IgYSBnaXZlbiBzaXplIGFuZCBob3cgbWFueSBsaW5lcyBmb2xsb3cgYSBnaXZlbiBpbmRlbnRhdGlvbi5cblxuVGhlIGtleSBpcyBhIGNvbmNhdGVuYXRpb24gb2YgdGhlIGluZGVudGF0aW9uIHR5cGUgKHMgPSBzcGFjZSBhbmQgdCA9IHRhYikgYW5kIHRoZSBzaXplIG9mIHRoZSBpbmRlbnRzL3VuaW5kZW50cy5cblxuYGBgXG5pbmRlbnRzID0ge1xuXHR0MzogWzEsIDBdLFxuXHR0NDogWzEsIDVdLFxuXHRzNTogWzEsIDBdLFxuXHRzMTI6IFsxLCAwXSxcbn1cbmBgYFxuKi9cbmZ1bmN0aW9uIG1ha2VJbmRlbnRzTWFwKHN0cmluZywgaWdub3JlU2luZ2xlU3BhY2VzKSB7XG5cdGNvbnN0IGluZGVudHMgPSBuZXcgTWFwKCk7XG5cblx0Ly8gUmVtZW1iZXIgdGhlIHNpemUgb2YgcHJldmlvdXMgbGluZSdzIGluZGVudGF0aW9uXG5cdGxldCBwcmV2aW91c1NpemUgPSAwO1xuXHRsZXQgcHJldmlvdXNJbmRlbnRUeXBlO1xuXG5cdC8vIEluZGVudHMga2V5IChpZGVudCB0eXBlICsgc2l6ZSBvZiB0aGUgaW5kZW50cy91bmluZGVudHMpXG5cdGxldCBrZXk7XG5cblx0Zm9yIChjb25zdCBsaW5lIG9mIHN0cmluZy5zcGxpdCgvXFxuL2cpKSB7XG5cdFx0aWYgKCFsaW5lKSB7XG5cdFx0XHQvLyBJZ25vcmUgZW1wdHkgbGluZXNcblx0XHRcdGNvbnRpbnVlO1xuXHRcdH1cblxuXHRcdGNvbnN0IG1hdGNoZXMgPSBsaW5lLm1hdGNoKElOREVOVF9SRUdFWCk7XG5cblx0XHRpZiAobWF0Y2hlcyA9PT0gbnVsbCkge1xuXHRcdFx0cHJldmlvdXNTaXplID0gMDtcblx0XHRcdHByZXZpb3VzSW5kZW50VHlwZSA9ICcnO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRjb25zdCBpbmRlbnQgPSBtYXRjaGVzWzBdLmxlbmd0aDtcblx0XHRcdGNvbnN0IGluZGVudFR5cGUgPSBtYXRjaGVzWzFdID8gSU5ERU5UX1RZUEVfU1BBQ0UgOiBJTkRFTlRfVFlQRV9UQUI7XG5cblx0XHRcdC8vIElnbm9yZSBzaW5nbGUgc3BhY2UgdW5sZXNzIGl0J3MgdGhlIG9ubHkgaW5kZW50IGRldGVjdGVkIHRvIHByZXZlbnQgY29tbW9uIGZhbHNlIHBvc2l0aXZlc1xuXHRcdFx0aWYgKHNob3VsZElnbm9yZVNpbmdsZVNwYWNlKGlnbm9yZVNpbmdsZVNwYWNlcywgaW5kZW50VHlwZSwgaW5kZW50KSkge1xuXHRcdFx0XHRjb250aW51ZTtcblx0XHRcdH1cblxuXHRcdFx0aWYgKGluZGVudFR5cGUgIT09IHByZXZpb3VzSW5kZW50VHlwZSkge1xuXHRcdFx0XHRwcmV2aW91c1NpemUgPSAwO1xuXHRcdFx0fVxuXG5cdFx0XHRwcmV2aW91c0luZGVudFR5cGUgPSBpbmRlbnRUeXBlO1xuXG5cdFx0XHRsZXQgdXNlID0gMTtcblx0XHRcdGxldCB3ZWlnaHQgPSAwO1xuXG5cdFx0XHRjb25zdCBpbmRlbnREaWZmZXJlbmNlID0gaW5kZW50IC0gcHJldmlvdXNTaXplO1xuXHRcdFx0cHJldmlvdXNTaXplID0gaW5kZW50O1xuXG5cdFx0XHQvLyBQcmV2aW91cyBsaW5lIGhhdmUgc2FtZSBpbmRlbnQ/XG5cdFx0XHRpZiAoaW5kZW50RGlmZmVyZW5jZSA9PT0gMCkge1xuXHRcdFx0XHQvLyBOb3QgYSBuZXcgXCJ1c2VcIiBvZiB0aGUgY3VycmVudCBpbmRlbnQ6XG5cdFx0XHRcdHVzZSA9IDA7XG5cdFx0XHRcdC8vIEJ1dCBkbyBhZGQgYSBiaXQgdG8gaXQgZm9yIGJyZWFraW5nIHRpZXM6XG5cdFx0XHRcdHdlaWdodCA9IDE7XG5cdFx0XHRcdC8vIFdlIHVzZSB0aGUga2V5IGZyb20gcHJldmlvdXMgbG9vcFxuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0Y29uc3QgYWJzb2x1dGVJbmRlbnREaWZmZXJlbmNlID0gTWF0aC5hYnMoaW5kZW50RGlmZmVyZW5jZSk7XG5cblx0XHRcdFx0Ly8gSWdub3JlIHNpbmdsZSBzcGFjZSBjaGFuZ2VzIHdoZW4gaWdub3JlU2luZ2xlU3BhY2VzIGlzIHRydWVcblx0XHRcdFx0Ly8gVGhpcyBwcmV2ZW50cyBjb21tb24gZmFsc2UgcG9zaXRpdmVzIGZyb20gdGhpbmdzIGxpa2UgYWxpZ25lZCBjb21tZW50c1xuXHRcdFx0XHRpZiAoc2hvdWxkSWdub3JlU2luZ2xlU3BhY2UoaWdub3JlU2luZ2xlU3BhY2VzLCBpbmRlbnRUeXBlLCBhYnNvbHV0ZUluZGVudERpZmZlcmVuY2UpKSB7XG5cdFx0XHRcdFx0Y29udGludWU7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRrZXkgPSBlbmNvZGVJbmRlbnRzS2V5KGluZGVudFR5cGUsIGFic29sdXRlSW5kZW50RGlmZmVyZW5jZSk7XG5cdFx0XHR9XG5cblx0XHRcdC8vIFVwZGF0ZSB0aGUgc3RhdHNcblx0XHRcdGNvbnN0IGVudHJ5ID0gaW5kZW50cy5nZXQoa2V5KTtcblx0XHRcdGluZGVudHMuc2V0KGtleSwgZW50cnkgPT09IHVuZGVmaW5lZCA/IFsxLCAwXSA6IFtlbnRyeVswXSArIHVzZSwgZW50cnlbMV0gKyB3ZWlnaHRdKTtcblx0XHR9XG5cdH1cblxuXHRyZXR1cm4gaW5kZW50cztcbn1cblxuLy8gRW5jb2RlIHRoZSBpbmRlbnQgdHlwZSBhbmQgYW1vdW50IGFzIGEgc3RyaW5nIChlLmcuICdzNCcpIGZvciB1c2UgYXMgYSBjb21wb3VuZCBrZXkgaW4gdGhlIGluZGVudHMgTWFwLlxuZnVuY3Rpb24gZW5jb2RlSW5kZW50c0tleShpbmRlbnRUeXBlLCBpbmRlbnRBbW91bnQpIHtcblx0Y29uc3QgdHlwZUNoYXJhY3RlciA9IGluZGVudFR5cGUgPT09IElOREVOVF9UWVBFX1NQQUNFID8gJ3MnIDogJ3QnO1xuXHRyZXR1cm4gdHlwZUNoYXJhY3RlciArIFN0cmluZyhpbmRlbnRBbW91bnQpO1xufVxuXG4vLyBFeHRyYWN0IHRoZSBpbmRlbnQgdHlwZSBhbmQgYW1vdW50IGZyb20gYSBrZXkgb2YgdGhlIGluZGVudHMgTWFwLlxuZnVuY3Rpb24gZGVjb2RlSW5kZW50c0tleShpbmRlbnRzS2V5KSB7XG5cdGNvbnN0IGtleUhhc1R5cGVTcGFjZSA9IGluZGVudHNLZXlbMF0gPT09ICdzJztcblx0Y29uc3QgdHlwZSA9IGtleUhhc1R5cGVTcGFjZSA/IElOREVOVF9UWVBFX1NQQUNFIDogSU5ERU5UX1RZUEVfVEFCO1xuXG5cdGNvbnN0IGFtb3VudCA9IE51bWJlcihpbmRlbnRzS2V5LnNsaWNlKDEpKTtcblxuXHRyZXR1cm4ge3R5cGUsIGFtb3VudH07XG59XG5cbi8vIFJldHVybiB0aGUga2V5IChlLmcuICdzNCcpIGZyb20gdGhlIGluZGVudHMgTWFwIHRoYXQgcmVwcmVzZW50cyB0aGUgbW9zdCBjb21tb24gaW5kZW50LFxuLy8gb3IgcmV0dXJuIHVuZGVmaW5lZCBpZiB0aGVyZSBhcmUgbm8gaW5kZW50cy5cbmZ1bmN0aW9uIGdldE1vc3RVc2VkS2V5KGluZGVudHMpIHtcblx0bGV0IHJlc3VsdDtcblx0bGV0IG1heFVzZWQgPSAwO1xuXHRsZXQgbWF4V2VpZ2h0ID0gMDtcblxuXHRmb3IgKGNvbnN0IFtrZXksIFt1c2VkQ291bnQsIHdlaWdodF1dIG9mIGluZGVudHMpIHtcblx0XHRpZiAodXNlZENvdW50ID4gbWF4VXNlZCB8fCAodXNlZENvdW50ID09PSBtYXhVc2VkICYmIHdlaWdodCA+IG1heFdlaWdodCkpIHtcblx0XHRcdG1heFVzZWQgPSB1c2VkQ291bnQ7XG5cdFx0XHRtYXhXZWlnaHQgPSB3ZWlnaHQ7XG5cdFx0XHRyZXN1bHQgPSBrZXk7XG5cdFx0fVxuXHR9XG5cblx0cmV0dXJuIHJlc3VsdDtcbn1cblxuZnVuY3Rpb24gbWFrZUluZGVudFN0cmluZyh0eXBlLCBhbW91bnQpIHtcblx0Y29uc3QgaW5kZW50Q2hhcmFjdGVyID0gdHlwZSA9PT0gSU5ERU5UX1RZUEVfU1BBQ0UgPyAnICcgOiAnXFx0Jztcblx0cmV0dXJuIGluZGVudENoYXJhY3Rlci5yZXBlYXQoYW1vdW50KTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gZGV0ZWN0SW5kZW50KHN0cmluZykge1xuXHRpZiAodHlwZW9mIHN0cmluZyAhPT0gJ3N0cmluZycpIHtcblx0XHR0aHJvdyBuZXcgVHlwZUVycm9yKCdFeHBlY3RlZCBhIHN0cmluZycpO1xuXHR9XG5cblx0Ly8gSWRlbnRpZnkgaW5kZW50cyB3aGlsZSBza2lwcGluZyBzaW5nbGUgc3BhY2UgaW5kZW50cyB0byBhdm9pZCBjb21tb24gZWRnZSBjYXNlcyAoZS5nLiBjb2RlIGNvbW1lbnRzKVxuXHQvLyBJZiBubyBpbmRlbnRzIGFyZSBpZGVudGlmaWVkLCBydW4gYWdhaW4gYW5kIGluY2x1ZGUgYWxsIGluZGVudHMgZm9yIGNvbXByZWhlbnNpdmUgZGV0ZWN0aW9uXG5cdGxldCBpbmRlbnRzID0gbWFrZUluZGVudHNNYXAoc3RyaW5nLCB0cnVlKTtcblx0aWYgKGluZGVudHMuc2l6ZSA9PT0gMCkge1xuXHRcdGluZGVudHMgPSBtYWtlSW5kZW50c01hcChzdHJpbmcsIGZhbHNlKTtcblx0fVxuXG5cdGNvbnN0IGtleU9mTW9zdFVzZWRJbmRlbnQgPSBnZXRNb3N0VXNlZEtleShpbmRlbnRzKTtcblxuXHRsZXQgdHlwZTtcblx0bGV0IGFtb3VudCA9IDA7XG5cdGxldCBpbmRlbnQgPSAnJztcblxuXHRpZiAoa2V5T2ZNb3N0VXNlZEluZGVudCAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0KHt0eXBlLCBhbW91bnR9ID0gZGVjb2RlSW5kZW50c0tleShrZXlPZk1vc3RVc2VkSW5kZW50KSk7XG5cdFx0aW5kZW50ID0gbWFrZUluZGVudFN0cmluZyh0eXBlLCBhbW91bnQpO1xuXHR9XG5cblx0cmV0dXJuIHtcblx0XHRhbW91bnQsXG5cdFx0dHlwZSxcblx0XHRpbmRlbnQsXG5cdH07XG59XG4iLCJleHBvcnQgZnVuY3Rpb24gZGV0ZWN0TmV3bGluZShzdHJpbmcpIHtcblx0aWYgKHR5cGVvZiBzdHJpbmcgIT09ICdzdHJpbmcnKSB7XG5cdFx0dGhyb3cgbmV3IFR5cGVFcnJvcignRXhwZWN0ZWQgYSBzdHJpbmcnKTtcblx0fVxuXG5cdGNvbnN0IG5ld2xpbmVzID0gc3RyaW5nLm1hdGNoKC8oPzpcXHI/XFxuKS9nKSB8fCBbXTtcblxuXHRpZiAobmV3bGluZXMubGVuZ3RoID09PSAwKSB7XG5cdFx0cmV0dXJuO1xuXHR9XG5cblx0Y29uc3QgY3JsZiA9IG5ld2xpbmVzLmZpbHRlcihuZXdsaW5lID0+IG5ld2xpbmUgPT09ICdcXHJcXG4nKS5sZW5ndGg7XG5cdGNvbnN0IGxmID0gbmV3bGluZXMubGVuZ3RoIC0gY3JsZjtcblxuXHRyZXR1cm4gY3JsZiA+IGxmID8gJ1xcclxcbicgOiAnXFxuJztcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGRldGVjdE5ld2xpbmVHcmFjZWZ1bChzdHJpbmcpIHtcblx0cmV0dXJuICh0eXBlb2Ygc3RyaW5nID09PSAnc3RyaW5nJyAmJiBkZXRlY3ROZXdsaW5lKHN0cmluZykpIHx8ICdcXG4nO1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnXG5pbXBvcnQgc29ydE9iamVjdEtleXMgZnJvbSAnc29ydC1vYmplY3Qta2V5cydcbmltcG9ydCBkZXRlY3RJbmRlbnQgZnJvbSAnZGV0ZWN0LWluZGVudCdcbmltcG9ydCB7IGRldGVjdE5ld2xpbmVHcmFjZWZ1bCBhcyBkZXRlY3ROZXdsaW5lIH0gZnJvbSAnZGV0ZWN0LW5ld2xpbmUnXG5pbXBvcnQgZ2l0SG9va3MgZnJvbSAnZ2l0LWhvb2tzLWxpc3QnXG5pbXBvcnQgaXNQbGFpbk9iamVjdCBmcm9tICdpcy1wbGFpbi1vYmonXG5pbXBvcnQgc2VtdmVyQ29tcGFyZSBmcm9tICdzZW12ZXIvZnVuY3Rpb25zL2NvbXBhcmUuanMnXG5pbXBvcnQgc2VtdmVyTWluVmVyc2lvbiBmcm9tICdzZW12ZXIvcmFuZ2VzL21pbi12ZXJzaW9uLmpzJ1xuXG5jb25zdCBwaXBlID1cbiAgKGZucykgPT5cbiAgKHgsIC4uLmFyZ3MpID0+XG4gICAgZm5zLnJlZHVjZSgocmVzdWx0LCBmbikgPT4gZm4ocmVzdWx0LCAuLi5hcmdzKSwgeClcbmNvbnN0IG9uQXJyYXkgPSAoZm4pID0+ICh4KSA9PiAoQXJyYXkuaXNBcnJheSh4KSA/IGZuKHgpIDogeClcbmNvbnN0IG9uU3RyaW5nQXJyYXkgPSAoZm4pID0+ICh4KSA9PlxuICBBcnJheS5pc0FycmF5KHgpICYmIHguZXZlcnkoKGl0ZW0pID0+IHR5cGVvZiBpdGVtID09PSAnc3RyaW5nJykgPyBmbih4KSA6IHhcbmNvbnN0IHVuaXEgPSBvblN0cmluZ0FycmF5KCh4cykgPT4gWy4uLm5ldyBTZXQoeHMpXSlcbmNvbnN0IHNvcnRBcnJheSA9IG9uU3RyaW5nQXJyYXkoKGFycmF5KSA9PiBhcnJheS50b1NvcnRlZCgpKVxuY29uc3QgdW5pcUFuZFNvcnRBcnJheSA9IHBpcGUoW3VuaXEsIHNvcnRBcnJheV0pXG5jb25zdCBvbk9iamVjdCA9XG4gIChmbikgPT5cbiAgKHgsIC4uLmFyZ3MpID0+XG4gICAgaXNQbGFpbk9iamVjdCh4KSA/IGZuKHgsIC4uLmFyZ3MpIDogeFxuY29uc3Qgc29ydE9iamVjdEJ5ID0gKGNvbXBhcmF0b3IsIGRlZXApID0+IHtcbiAgY29uc3Qgb3ZlciA9IG9uT2JqZWN0KChvYmplY3QpID0+IHtcbiAgICBpZiAoZGVlcCkge1xuICAgICAgb2JqZWN0ID0gT2JqZWN0LmZyb21FbnRyaWVzKFxuICAgICAgICBPYmplY3QuZW50cmllcyhvYmplY3QpLm1hcCgoW2tleSwgdmFsdWVdKSA9PiBba2V5LCBvdmVyKHZhbHVlKV0pLFxuICAgICAgKVxuICAgIH1cblxuICAgIHJldHVybiBzb3J0T2JqZWN0S2V5cyhvYmplY3QsIGNvbXBhcmF0b3IpXG4gIH0pXG5cbiAgcmV0dXJuIG92ZXJcbn1cbmNvbnN0IG9iamVjdEdyb3VwQnkgPVxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbi9uby11bnN1cHBvcnRlZC1mZWF0dXJlcy9lcy1idWlsdGlucywgbi9uby11bnN1cHBvcnRlZC1mZWF0dXJlcy9lcy1zeW50YXggLS0gU2FmZVxuICBPYmplY3QuZ3JvdXBCeSB8fFxuICAvLyBSZW1vdmUgdGhpcyB3aGVuIHdlIGRyb3Agc3VwcG9ydCBmb3IgTm9kZS5qcyAyMFxuICAoKGFycmF5LCBjYWxsYmFjaykgPT4ge1xuICAgIGNvbnN0IHJlc3VsdCA9IE9iamVjdC5jcmVhdGUobnVsbClcbiAgICBmb3IgKGNvbnN0IHZhbHVlIG9mIGFycmF5KSB7XG4gICAgICBjb25zdCBrZXkgPSBjYWxsYmFjayh2YWx1ZSlcbiAgICAgIGlmIChyZXN1bHRba2V5XSkge1xuICAgICAgICByZXN1bHRba2V5XS5wdXNoKHZhbHVlKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmVzdWx0W2tleV0gPSBbdmFsdWVdXG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiByZXN1bHRcbiAgfSlcbmNvbnN0IHNvcnRPYmplY3QgPSBzb3J0T2JqZWN0QnkoKVxuY29uc3Qgc29ydFVSTE9iamVjdCA9IHNvcnRPYmplY3RCeShbJ3R5cGUnLCAndXJsJ10pXG5jb25zdCBzb3J0UGVvcGxlT2JqZWN0ID0gc29ydE9iamVjdEJ5KFsnbmFtZScsICdlbWFpbCcsICd1cmwnXSlcbmNvbnN0IHNvcnREaXJlY3RvcmllcyA9IHNvcnRPYmplY3RCeShbXG4gICdsaWInLFxuICAnYmluJyxcbiAgJ21hbicsXG4gICdkb2MnLFxuICAnZXhhbXBsZScsXG4gICd0ZXN0Jyxcbl0pXG5jb25zdCBvdmVyUHJvcGVydHkgPSAocHJvcGVydHksIG92ZXIpID0+XG4gIG9uT2JqZWN0KChvYmplY3QsIC4uLmFyZ3MpID0+XG4gICAgT2JqZWN0Lmhhc093bihvYmplY3QsIHByb3BlcnR5KVxuICAgICAgPyB7IC4uLm9iamVjdCwgW3Byb3BlcnR5XTogb3ZlcihvYmplY3RbcHJvcGVydHldLCAuLi5hcmdzKSB9XG4gICAgICA6IG9iamVjdCxcbiAgKVxuY29uc3Qgc29ydEdpdEhvb2tzID0gc29ydE9iamVjdEJ5KGdpdEhvb2tzKVxuXG5jb25zdCBwYXJzZU5hbWVBbmRWZXJzaW9uUmFuZ2UgPSAoc3BlY2lmaWVyKSA9PiB7XG4gIC8vIElnbm9yZSBhbnl0aGluZyBhZnRlciA+ICYgcmVseSBvbiBmYWxsYmFjayBhbHBoYW51bWVyaWMgc29ydGluZyBmb3IgdGhhdFxuICBjb25zdCBbbmFtZUFuZFZlcnNpb25dID0gc3BlY2lmaWVyLnNwbGl0KCc+JylcbiAgY29uc3QgYXRNYXRjaGVzID0gWy4uLm5hbWVBbmRWZXJzaW9uLm1hdGNoQWxsKCdAJyldXG4gIGlmIChcbiAgICAhYXRNYXRjaGVzLmxlbmd0aCB8fFxuICAgIChhdE1hdGNoZXMubGVuZ3RoID09PSAxICYmIGF0TWF0Y2hlc1swXS5pbmRleCA9PT0gMClcbiAgKSB7XG4gICAgcmV0dXJuIHsgbmFtZTogc3BlY2lmaWVyIH1cbiAgfVxuICBjb25zdCBzcGxpdEluZGV4ID0gYXRNYXRjaGVzLnBvcCgpLmluZGV4XG4gIHJldHVybiB7XG4gICAgbmFtZTogbmFtZUFuZFZlcnNpb24uc3Vic3RyaW5nKDAsIHNwbGl0SW5kZXgpLFxuICAgIHJhbmdlOiBuYW1lQW5kVmVyc2lvbi5zdWJzdHJpbmcoc3BsaXRJbmRleCArIDEpLFxuICB9XG59XG5cbmNvbnN0IHNvcnRPYmplY3RCeVNlbXZlciA9IHNvcnRPYmplY3RCeSgoYSwgYikgPT4ge1xuICBjb25zdCB7IG5hbWU6IGFOYW1lLCByYW5nZTogYVJhbmdlIH0gPSBwYXJzZU5hbWVBbmRWZXJzaW9uUmFuZ2UoYSlcbiAgY29uc3QgeyBuYW1lOiBiTmFtZSwgcmFuZ2U6IGJSYW5nZSB9ID0gcGFyc2VOYW1lQW5kVmVyc2lvblJhbmdlKGIpXG5cbiAgaWYgKGFOYW1lICE9PSBiTmFtZSkge1xuICAgIHJldHVybiBhTmFtZS5sb2NhbGVDb21wYXJlKGJOYW1lLCAnZW4nKVxuICB9XG4gIGlmICghYVJhbmdlKSB7XG4gICAgcmV0dXJuIC0xXG4gIH1cbiAgaWYgKCFiUmFuZ2UpIHtcbiAgICByZXR1cm4gMVxuICB9XG4gIHJldHVybiBzZW12ZXJDb21wYXJlKHNlbXZlck1pblZlcnNpb24oYVJhbmdlKSwgc2VtdmVyTWluVmVyc2lvbihiUmFuZ2UpKVxufSlcblxuY29uc3QgZ2V0UGFja2FnZU5hbWUgPSAoaWRlbnQpID0+IHtcbiAgY29uc3QgaW5kZXggPSBpZGVudC5pbmRleE9mKCdAJywgaWRlbnQuc3RhcnRzV2l0aCgnQCcpID8gMSA6IDApXG4gIC8vIFRoaXMgc2hvdWxkIG5vdCBoYXBwZW4sIHVubGVzcyB1c2VyIG1hbnVhbGx5IGVkaXQgdGhlIHBhY2thZ2UuanNvbiBmaWxlXG4gIHJldHVybiBpbmRleCA9PT0gLTEgPyBpZGVudCA6IGlkZW50LnNsaWNlKDAsIGluZGV4KVxufVxuXG5jb25zdCBzb3J0T2JqZWN0QnlJZGVudCA9IChhLCBiKSA9PiB7XG4gIGNvbnN0IHBhY2thZ2VOYW1lQSA9IGdldFBhY2thZ2VOYW1lKGEpXG4gIGNvbnN0IHBhY2thZ2VOYW1lQiA9IGdldFBhY2thZ2VOYW1lKGIpXG5cbiAgaWYgKHBhY2thZ2VOYW1lQSA8IHBhY2thZ2VOYW1lQikgcmV0dXJuIC0xXG4gIGlmIChwYWNrYWdlTmFtZUEgPiBwYWNrYWdlTmFtZUIpIHJldHVybiAxXG4gIHJldHVybiAwXG59XG5cbi8vIENhY2hlIGJ5IGBwcm9jZXNzLmN3ZCgpYCBpbnN0ZWFkIG9mIGEgdmFyaWFibGUgdG8gYWxsb3cgdXNlciBjYWxsIGBwcm9jZXNzLmNoZGlyKClgXG5jb25zdCBjYWNoZSA9IG5ldyBNYXAoKVxuY29uc3QgaGFzWWFybk9yUG5wbUZpbGVzID0gKCkgPT4ge1xuICBjb25zdCBjd2QgPSBwcm9jZXNzLmN3ZCgpXG4gIGlmICghY2FjaGUuaGFzKGN3ZCkpIHtcbiAgICBjYWNoZS5zZXQoXG4gICAgICBjd2QsXG4gICAgICBmcy5leGlzdHNTeW5jKCd5YXJuLmxvY2snKSB8fFxuICAgICAgICBmcy5leGlzdHNTeW5jKCcueWFybi8nKSB8fFxuICAgICAgICBmcy5leGlzdHNTeW5jKCcueWFybnJjLnltbCcpIHx8XG4gICAgICAgIGZzLmV4aXN0c1N5bmMoJ3BucG0tbG9jay55YW1sJykgfHxcbiAgICAgICAgZnMuZXhpc3RzU3luYygncG5wbS13b3Jrc3BhY2UueWFtbCcpLFxuICAgIClcbiAgfVxuICByZXR1cm4gY2FjaGUuZ2V0KGN3ZClcbn1cblxuLyoqXG4gKiBEZXRlY3RzIHRoZSBwYWNrYWdlIG1hbmFnZXIgZnJvbSBwYWNrYWdlLmpzb24gYW5kIGxvY2sgZmlsZXNcbiAqIEBwYXJhbSB7b2JqZWN0fSBwYWNrYWdlSnNvbiAtIFRoZSBwYXJzZWQgcGFja2FnZS5qc29uIG9iamVjdFxuICogQHJldHVybnMge2Jvb2xlYW59IC0gVGhlIGRldGVjdGVkIHBhY2thZ2UgbWFuYWdlci4gRGVmYXVsdCB0byBucG0gaWYgbm90IGRldGVjdGVkLlxuICovXG5mdW5jdGlvbiBzaG91bGRTb3J0RGVwZW5kZW5jaWVzTGlrZU5wbShwYWNrYWdlSnNvbikge1xuICAvLyBodHRwczovL2dpdGh1Yi5jb20vbm9kZWpzL2NvcmVwYWNrXG4gIGlmICh0eXBlb2YgcGFja2FnZUpzb24ucGFja2FnZU1hbmFnZXIgPT09ICdzdHJpbmcnKSB7XG4gICAgcmV0dXJuIHBhY2thZ2VKc29uLnBhY2thZ2VNYW5hZ2VyLnN0YXJ0c1dpdGgoJ25wbUAnKVxuICB9XG5cbiAgaWYgKHBhY2thZ2VKc29uLmRldkVuZ2luZXM/LnBhY2thZ2VNYW5hZ2VyPy5uYW1lKSB7XG4gICAgcmV0dXJuIHBhY2thZ2VKc29uLmRldkVuZ2luZXMucGFja2FnZU1hbmFnZXIubmFtZSA9PT0gJ25wbSdcbiAgfVxuXG4gIGlmIChwYWNrYWdlSnNvbi5wbnBtKSB7XG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cblxuICAvLyBPcHRpbWlzYXRpb246IENoZWNrIGlmIG5wbSBpcyBleHBsaWNpdCBiZWZvcmUgcmVhZGluZyBGUy5cbiAgaWYgKHBhY2thZ2VKc29uLmVuZ2luZXM/Lm5wbSkge1xuICAgIHJldHVybiB0cnVlXG4gIH1cblxuICBpZiAoaGFzWWFybk9yUG5wbUZpbGVzKCkpIHtcbiAgICByZXR1cm4gZmFsc2VcbiAgfVxuXG4gIHJldHVybiB0cnVlXG59XG5cbi8qKlxuICogU29ydCBkZXBlbmRlbmNpZXMgYWxwaGFiZXRpY2FsbHksIGRldGVjdGluZyBwYWNrYWdlIG1hbmFnZXIgdG8gdXNlIHRoZVxuICogYXBwcm9wcmlhdGUgY29tcGFyaXNvbi4gbnBtIHVzZXMgbG9jYWxlLWF3YXJlIGNvbXBhcmlzb24sIHlhcm4gYW5kIHBucG0gdXNlXG4gKiBzaW1wbGUgc3RyaW5nIGNvbXBhcmlzb25cbiAqL1xuY29uc3Qgc29ydERlcGVuZGVuY2llcyA9IG9uT2JqZWN0KChkZXBlbmRlbmNpZXMsIHBhY2thZ2VKc29uKSA9PiB7XG4gIC8vIEF2b2lkIGZpbGUgYWNjZXNzXG4gIGlmIChPYmplY3Qua2V5cyhkZXBlbmRlbmNpZXMpLmxlbmd0aCA8IDIpIHtcbiAgICByZXR1cm4gZGVwZW5kZW5jaWVzXG4gIH1cblxuICAvLyBzb3J0IGRlcHMgbGlrZSB0aGUgbnBtIENMSSBkb2VzICh2aWEgdGhlIHBhY2thZ2UgQG5wbWNsaS9wYWNrYWdlLWpzb24pXG4gIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9ucG0vcGFja2FnZS1qc29uL2Jsb2IvYjY0NjVmNDRjNzI3ZDY1MTNkYjY4OThjN2NiZTQxZGQzNTVjZWJlOC9saWIvdXBkYXRlLWRlcGVuZGVuY2llcy5qcyNMOC1MMjFcbiAgaWYgKHNob3VsZFNvcnREZXBlbmRlbmNpZXNMaWtlTnBtKHBhY2thZ2VKc29uKSkge1xuICAgIHJldHVybiBzb3J0T2JqZWN0S2V5cyhkZXBlbmRlbmNpZXMsIChhLCBiKSA9PiBhLmxvY2FsZUNvbXBhcmUoYiwgJ2VuJykpXG4gIH1cblxuICByZXR1cm4gc29ydE9iamVjdEtleXMoZGVwZW5kZW5jaWVzKVxufSlcblxuLyoqXG4gKiBcIndvcmtzcGFjZXNcIiBjYW4gYmUgYW4gYXJyYXkgKG5wbSBvciB5YXJuIGNsYXNzaWMpIG9yIGFuIG9iamVjdCAocG5wbS9idW4pLlxuICogSW4gdGhlIGNhc2Ugb2YgYW4gYXJyYXksIHdlIGRvIG5vdCB3YW50IHRvIGFscGhhYmV0aWNhbGx5IHNvcnQgaXQgaW4gY2FzZVxuICogc2NyaXB0cyBuZWVkIHRvIHJ1biBpbiBhIHNwZWNpZmljIG9yZGVyLlxuICpcbiAqIEBzZWUgaHR0cHM6Ly9kb2NzLm5wbWpzLmNvbS9jbGkvdjcvdXNpbmctbnBtL3dvcmtzcGFjZXM/dj10cnVlI3J1bm5pbmctY29tbWFuZHMtaW4tdGhlLWNvbnRleHQtb2Ytd29ya3NwYWNlc1xuICovXG5jb25zdCBzb3J0V29ya3NwYWNlcyA9IHBpcGUoW1xuICBzb3J0T2JqZWN0QnkoWydwYWNrYWdlcycsICdjYXRhbG9nJ10pLFxuICBvdmVyUHJvcGVydHkoJ3BhY2thZ2VzJywgdW5pcUFuZFNvcnRBcnJheSksXG4gIG92ZXJQcm9wZXJ0eSgnY2F0YWxvZycsIHNvcnREZXBlbmRlbmNpZXMpLFxuXSlcblxuLy8gaHR0cHM6Ly9naXRodWIuY29tL2VzbGludC9lc2xpbnQvYmxvYi9hY2MwZTQ3NTcyYTkzOTAyOTJiNGUzMTNiNGE0YmYzNjBkMjM2MzU4L2NvbmYvY29uZmlnLXNjaGVtYS5qc1xuY29uc3QgZXNsaW50QmFzZUNvbmZpZ1Byb3BlcnRpZXMgPSBbXG4gIC8vIGBmaWxlc2AgYW5kIGBleGNsdWRlZEZpbGVzYCBhcmUgb25seSBvbiBgb3ZlcnJpZGVzW11gXG4gIC8vIGZvciBlYXNpZXIgc29ydCBgb3ZlcnJpZGVzW11gLFxuICAvLyBhZGQgdGhlbSB0byBoZXJlLCBzbyB3ZSBkb24ndCBuZWVkIHNvcnQgYG92ZXJyaWRlc1tdYCB0d2ljZVxuICAnZmlsZXMnLFxuICAnZXhjbHVkZWRGaWxlcycsXG4gIC8vIGJhc2VDb25maWdcbiAgJ2VudicsXG4gICdwYXJzZXInLFxuICAncGFyc2VyT3B0aW9ucycsXG4gICdzZXR0aW5ncycsXG4gICdwbHVnaW5zJyxcbiAgJ2V4dGVuZHMnLFxuICAncnVsZXMnLFxuICAnb3ZlcnJpZGVzJyxcbiAgJ2dsb2JhbHMnLFxuICAncHJvY2Vzc29yJyxcbiAgJ25vSW5saW5lQ29uZmlnJyxcbiAgJ3JlcG9ydFVudXNlZERpc2FibGVEaXJlY3RpdmVzJyxcbl1cbmNvbnN0IHNvcnRFc2xpbnRDb25maWcgPSBwaXBlKFtcbiAgc29ydE9iamVjdEJ5KGVzbGludEJhc2VDb25maWdQcm9wZXJ0aWVzKSxcbiAgb3ZlclByb3BlcnR5KCdlbnYnLCBzb3J0T2JqZWN0KSxcbiAgb3ZlclByb3BlcnR5KCdnbG9iYWxzJywgc29ydE9iamVjdCksXG4gIG92ZXJQcm9wZXJ0eShcbiAgICAnb3ZlcnJpZGVzJyxcbiAgICBvbkFycmF5KChvdmVycmlkZXMpID0+IG92ZXJyaWRlcy5tYXAoc29ydEVzbGludENvbmZpZykpLFxuICApLFxuICBvdmVyUHJvcGVydHkoJ3BhcnNlck9wdGlvbnMnLCBzb3J0T2JqZWN0KSxcbiAgb3ZlclByb3BlcnR5KFxuICAgICdydWxlcycsXG4gICAgc29ydE9iamVjdEJ5KFxuICAgICAgKHJ1bGUxLCBydWxlMikgPT5cbiAgICAgICAgcnVsZTEuc3BsaXQoJy8nKS5sZW5ndGggLSBydWxlMi5zcGxpdCgnLycpLmxlbmd0aCB8fFxuICAgICAgICBydWxlMS5sb2NhbGVDb21wYXJlKHJ1bGUyKSxcbiAgICApLFxuICApLFxuICBvdmVyUHJvcGVydHkoJ3NldHRpbmdzJywgc29ydE9iamVjdCksXG5dKVxuY29uc3Qgc29ydFZTQ29kZUJhZGdlT2JqZWN0ID0gc29ydE9iamVjdEJ5KFsnZGVzY3JpcHRpb24nLCAndXJsJywgJ2hyZWYnXSlcblxuY29uc3Qgc29ydFByZXR0aWVyQ29uZmlnID0gcGlwZShbXG4gIC8vIHNvcnQga2V5cyBhbHBoYWJldGljYWxseSwgYnV0IHB1dCBgb3ZlcnJpZGVzYCBhdCBib3R0b21cbiAgb25PYmplY3QoKGNvbmZpZykgPT5cbiAgICBzb3J0T2JqZWN0S2V5cyhjb25maWcsIFtcbiAgICAgIC4uLk9iamVjdC5rZXlzKGNvbmZpZylcbiAgICAgICAgLmZpbHRlcigoa2V5KSA9PiBrZXkgIT09ICdvdmVycmlkZXMnKVxuICAgICAgICAuc29ydCgpLFxuICAgICAgJ292ZXJyaWRlcycsXG4gICAgXSksXG4gICksXG4gIC8vIGlmIGBjb25maWcub3ZlcnJpZGVzYCBleGlzdHNcbiAgb3ZlclByb3BlcnR5KFxuICAgICdvdmVycmlkZXMnLFxuICAgIC8vIGFuZCBgY29uZmlnLm92ZXJyaWRlc2AgaXMgYW4gYXJyYXlcbiAgICBvbkFycmF5KChvdmVycmlkZXMpID0+XG4gICAgICBvdmVycmlkZXMubWFwKFxuICAgICAgICBwaXBlKFtcbiAgICAgICAgICAvLyBzb3J0IGBjb25maWcub3ZlcnJpZGVzW11gIGFscGhhYmV0aWNhbGx5XG4gICAgICAgICAgc29ydE9iamVjdCxcbiAgICAgICAgICAvLyBzb3J0IGBjb25maWcub3ZlcnJpZGVzW10ub3B0aW9uc2AgYWxwaGFiZXRpY2FsbHlcbiAgICAgICAgICBvdmVyUHJvcGVydHkoJ29wdGlvbnMnLCBzb3J0T2JqZWN0KSxcbiAgICAgICAgXSksXG4gICAgICApLFxuICAgICksXG4gICksXG5dKVxuXG5jb25zdCBzb3J0Vm9sdGEgPSBzb3J0T2JqZWN0QnkoWydub2RlJywgJ25wbScsICd5YXJuJ10pXG5jb25zdCBzb3J0RGV2RW5naW5lcyA9IG92ZXJQcm9wZXJ0eShcbiAgJ3BhY2thZ2VNYW5hZ2VyJyxcbiAgc29ydE9iamVjdEJ5KFsnbmFtZScsICd2ZXJzaW9uJywgJ29uRmFpbCddKSxcbilcblxuY29uc3QgcG5wbUJhc2VDb25maWdQcm9wZXJ0aWVzID0gW1xuICAncGVlckRlcGVuZGVuY3lSdWxlcycsXG4gICduZXZlckJ1aWx0RGVwZW5kZW5jaWVzJyxcbiAgJ29ubHlCdWlsdERlcGVuZGVuY2llcycsXG4gICdvbmx5QnVpbHREZXBlbmRlbmNpZXNGaWxlJyxcbiAgJ2FsbG93ZWREZXByZWNhdGVkVmVyc2lvbnMnLFxuICAnYWxsb3dOb25BcHBsaWVkUGF0Y2hlcycsXG4gICd1cGRhdGVDb25maWcnLFxuICAnYXVkaXRDb25maWcnLFxuICAncmVxdWlyZWRTY3JpcHRzJyxcbiAgJ3N1cHBvcnRlZEFyY2hpdGVjdHVyZXMnLFxuICAnb3ZlcnJpZGVzJyxcbiAgJ3BhdGNoZWREZXBlbmRlbmNpZXMnLFxuICAncGFja2FnZUV4dGVuc2lvbnMnLFxuXVxuXG5jb25zdCBzb3J0UG5wbUNvbmZpZyA9IHBpcGUoW1xuICBzb3J0T2JqZWN0QnkocG5wbUJhc2VDb25maWdQcm9wZXJ0aWVzLCB0cnVlKSxcbiAgb3ZlclByb3BlcnR5KCdvdmVycmlkZXMnLCBzb3J0T2JqZWN0QnlTZW12ZXIpLFxuXSlcblxuLy8gU2VlIGh0dHBzOi8vZG9jcy5ucG1qcy5jb20vbWlzYy9zY3JpcHRzXG5jb25zdCBkZWZhdWx0TnBtU2NyaXB0cyA9IG5ldyBTZXQoW1xuICAnaW5zdGFsbCcsXG4gICdwYWNrJyxcbiAgJ3ByZXBhcmUnLFxuICAncHVibGlzaCcsXG4gICdyZXN0YXJ0JyxcbiAgJ3Nocmlua3dyYXAnLFxuICAnc3RhcnQnLFxuICAnc3RvcCcsXG4gICd0ZXN0JyxcbiAgJ3VuaW5zdGFsbCcsXG4gICd2ZXJzaW9uJyxcbl0pXG5cbmNvbnN0IGhhc0RldkRlcGVuZGVuY3kgPSAoZGVwZW5kZW5jeSwgcGFja2FnZUpzb24pID0+IHtcbiAgcmV0dXJuIChcbiAgICBPYmplY3QuaGFzT3duKHBhY2thZ2VKc29uLCAnZGV2RGVwZW5kZW5jaWVzJykgJiZcbiAgICBPYmplY3QuaGFzT3duKHBhY2thZ2VKc29uLmRldkRlcGVuZGVuY2llcywgZGVwZW5kZW5jeSlcbiAgKVxufVxuXG5jb25zdCBydW5TUmVnRXhwID1cbiAgLyg/PD1efFtcXHMmOzw+fChdKSg/OnJ1bi1zfG5wbS1ydW4tYWxsMj8gLiooPzotLXNlcXVlbnRpYWx8LS1zZXJpYWx8LXMpKSg/PSR8W1xccyY7PD58KV0pL1xuXG5jb25zdCBpc1NlcXVlbnRpYWxTY3JpcHQgPSAoY29tbWFuZCkgPT5cbiAgY29tbWFuZC5pbmNsdWRlcygnKicpICYmIHJ1blNSZWdFeHAudGVzdChjb21tYW5kKVxuXG5jb25zdCBoYXNTZXF1ZW50aWFsU2NyaXB0ID0gKHBhY2thZ2VKc29uKSA9PiB7XG4gIGlmIChcbiAgICAhaGFzRGV2RGVwZW5kZW5jeSgnbnBtLXJ1bi1hbGwnLCBwYWNrYWdlSnNvbikgJiZcbiAgICAhaGFzRGV2RGVwZW5kZW5jeSgnbnBtLXJ1bi1hbGwyJywgcGFja2FnZUpzb24pXG4gICkge1xuICAgIHJldHVybiBmYWxzZVxuICB9XG4gIGNvbnN0IHNjcmlwdHMgPSBbJ3NjcmlwdHMnLCAnYmV0dGVyU2NyaXB0cyddLmZsYXRNYXAoKGZpZWxkKSA9PlxuICAgIHBhY2thZ2VKc29uW2ZpZWxkXSA/IE9iamVjdC52YWx1ZXMocGFja2FnZUpzb25bZmllbGRdKSA6IFtdLFxuICApXG4gIHJldHVybiBzY3JpcHRzLnNvbWUoKHNjcmlwdCkgPT4gaXNTZXF1ZW50aWFsU2NyaXB0KHNjcmlwdCkpXG59XG5cbmZ1bmN0aW9uIHNvcnRTY3JpcHROYW1lcyhrZXlzLCBwcmVmaXggPSAnJykge1xuICBjb25zdCBncm91cE1hcCA9IG5ldyBNYXAoKVxuICBmb3IgKGNvbnN0IGtleSBvZiBrZXlzKSB7XG4gICAgY29uc3QgcmVzdCA9IHByZWZpeCA/IGtleS5zbGljZShwcmVmaXgubGVuZ3RoICsgMSkgOiBrZXlcbiAgICBjb25zdCBpZHggPSByZXN0LmluZGV4T2YoJzonKVxuICAgIGlmIChpZHggPiAwKSB7XG4gICAgICBjb25zdCBiYXNlID0ga2V5LnNsaWNlKDAsIChwcmVmaXggPyBwcmVmaXgubGVuZ3RoICsgMSA6IDApICsgaWR4KVxuICAgICAgaWYgKCFncm91cE1hcC5oYXMoYmFzZSkpIGdyb3VwTWFwLnNldChiYXNlLCBbXSlcbiAgICAgIGdyb3VwTWFwLmdldChiYXNlKS5wdXNoKGtleSlcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKCFncm91cE1hcC5oYXMoa2V5KSkgZ3JvdXBNYXAuc2V0KGtleSwgW10pXG4gICAgICBncm91cE1hcC5nZXQoa2V5KS5wdXNoKGtleSlcbiAgICB9XG4gIH1cbiAgcmV0dXJuIEFycmF5LmZyb20oZ3JvdXBNYXAua2V5cygpKVxuICAgIC5zb3J0KClcbiAgICAuZmxhdE1hcCgoZ3JvdXBLZXkpID0+IHtcbiAgICAgIGNvbnN0IGNoaWxkcmVuID0gZ3JvdXBNYXAuZ2V0KGdyb3VwS2V5KVxuICAgICAgaWYgKFxuICAgICAgICBjaGlsZHJlbi5sZW5ndGggPiAxICYmXG4gICAgICAgIGNoaWxkcmVuLnNvbWUoKGspID0+IGsgIT09IGdyb3VwS2V5ICYmIGsuc3RhcnRzV2l0aChncm91cEtleSArICc6JykpXG4gICAgICApIHtcbiAgICAgICAgY29uc3QgZGlyZWN0ID0gY2hpbGRyZW5cbiAgICAgICAgICAuZmlsdGVyKChrKSA9PiBrID09PSBncm91cEtleSB8fCAhay5zdGFydHNXaXRoKGdyb3VwS2V5ICsgJzonKSlcbiAgICAgICAgICAuc29ydCgpXG4gICAgICAgIGNvbnN0IG5lc3RlZCA9IGNoaWxkcmVuLmZpbHRlcigoaykgPT4gay5zdGFydHNXaXRoKGdyb3VwS2V5ICsgJzonKSlcbiAgICAgICAgcmV0dXJuIFsuLi5kaXJlY3QsIC4uLnNvcnRTY3JpcHROYW1lcyhuZXN0ZWQsIGdyb3VwS2V5KV1cbiAgICAgIH1cbiAgICAgIHJldHVybiBjaGlsZHJlbi5zb3J0KClcbiAgICB9KVxufVxuXG5jb25zdCBzb3J0U2NyaXB0cyA9IG9uT2JqZWN0KChzY3JpcHRzLCBwYWNrYWdlSnNvbikgPT4ge1xuICBsZXQgbmFtZXMgPSBPYmplY3Qua2V5cyhzY3JpcHRzKVxuICBjb25zdCBwcmVmaXhhYmxlID0gbmV3IFNldCgpXG5cbiAgbmFtZXMgPSBuYW1lcy5tYXAoKG5hbWUpID0+IHtcbiAgICBjb25zdCBvbWl0dGVkID0gbmFtZS5yZXBsYWNlKC9eKD86cHJlfHBvc3QpLywgJycpXG4gICAgaWYgKGRlZmF1bHROcG1TY3JpcHRzLmhhcyhvbWl0dGVkKSB8fCBuYW1lcy5pbmNsdWRlcyhvbWl0dGVkKSkge1xuICAgICAgcHJlZml4YWJsZS5hZGQob21pdHRlZClcbiAgICAgIHJldHVybiBvbWl0dGVkXG4gICAgfVxuICAgIHJldHVybiBuYW1lXG4gIH0pXG5cbiAgaWYgKCFoYXNTZXF1ZW50aWFsU2NyaXB0KHBhY2thZ2VKc29uKSkge1xuICAgIG5hbWVzID0gc29ydFNjcmlwdE5hbWVzKG5hbWVzKVxuICB9XG4gIG5hbWVzID0gbmFtZXMuZmxhdE1hcCgoa2V5KSA9PlxuICAgIHByZWZpeGFibGUuaGFzKGtleSkgPyBbYHByZSR7a2V5fWAsIGtleSwgYHBvc3Qke2tleX1gXSA6IFtrZXldLFxuICApXG4gIHJldHVybiBzb3J0T2JqZWN0S2V5cyhzY3JpcHRzLCBuYW1lcylcbn0pXG5cbi8qXG4tIE1vdmUgYGRlZmF1bHRgIGNvbmRpdGlvbiB0byBib3R0b21cbiovXG5jb25zdCBzb3J0Q29uZGl0aW9ucyA9IChjb25kaXRpb25zKSA9PiB7XG4gIGNvbnN0IHsgZGVmYXVsdENvbmRpdGlvbnMgPSBbXSwgcmVzdENvbmRpdGlvbnMgPSBbXSB9ID0gb2JqZWN0R3JvdXBCeShcbiAgICBjb25kaXRpb25zLFxuICAgIChjb25kaXRpb24pID0+IHtcbiAgICAgIGlmIChjb25kaXRpb24gPT09ICdkZWZhdWx0Jykge1xuICAgICAgICByZXR1cm4gJ2RlZmF1bHRDb25kaXRpb25zJ1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gJ3Jlc3RDb25kaXRpb25zJ1xuICAgIH0sXG4gIClcblxuICByZXR1cm4gWy4uLnJlc3RDb25kaXRpb25zLCAuLi5kZWZhdWx0Q29uZGl0aW9uc11cbn1cblxuY29uc3Qgc29ydEV4cG9ydHMgPSBvbk9iamVjdCgoZXhwb3J0cykgPT4ge1xuICBjb25zdCB7IHBhdGhzID0gW10sIGNvbmRpdGlvbnMgPSBbXSB9ID0gb2JqZWN0R3JvdXBCeShcbiAgICBPYmplY3Qua2V5cyhleHBvcnRzKSxcbiAgICAoa2V5KSA9PiAoa2V5LnN0YXJ0c1dpdGgoJy4nKSA/ICdwYXRocycgOiAnY29uZGl0aW9ucycpLFxuICApXG5cbiAgcmV0dXJuIE9iamVjdC5mcm9tRW50cmllcyhcbiAgICBbLi4ucGF0aHMsIC4uLnNvcnRDb25kaXRpb25zKGNvbmRpdGlvbnMpXS5tYXAoKGtleSkgPT4gW1xuICAgICAga2V5LFxuICAgICAgc29ydEV4cG9ydHMoZXhwb3J0c1trZXldKSxcbiAgICBdKSxcbiAgKVxufSlcblxuLy8gZmllbGRzIG1hcmtlZCBgdnNjb2RlYCBhcmUgZm9yIGBWaXN1YWwgU3R1ZGlvIENvZGUgZXh0ZW5zaW9uIG1hbmlmZXN0YCBvbmx5XG4vLyBodHRwczovL2NvZGUudmlzdWFsc3R1ZGlvLmNvbS9hcGkvcmVmZXJlbmNlcy9leHRlbnNpb24tbWFuaWZlc3Rcbi8vIFN1cHBvcnRlZCBmaWVsZHM6XG4vLyBwdWJsaXNoZXIsIGRpc3BsYXlOYW1lLCBjYXRlZ29yaWVzLCBnYWxsZXJ5QmFubmVyLCBwcmV2aWV3LCBjb250cmlidXRlcyxcbi8vIGFjdGl2YXRpb25FdmVudHMsIGJhZGdlcywgbWFya2Rvd24sIHFuYSwgZXh0ZW5zaW9uUGFjayxcbi8vIGV4dGVuc2lvbkRlcGVuZGVuY2llcywgaWNvblxuXG4vLyBmaWVsZC5rZXl7c3RyaW5nfTogZmllbGQgbmFtZVxuLy8gZmllbGQub3ZlcntmdW5jdGlvbn06IHNvcnQgZmllbGQgc3ViS2V5XG5jb25zdCBmaWVsZHMgPSBbXG4gIHsga2V5OiAnJHNjaGVtYScgfSxcbiAgeyBrZXk6ICduYW1lJyB9LFxuICAvKiB2c2NvZGUgKi8geyBrZXk6ICdkaXNwbGF5TmFtZScgfSxcbiAgeyBrZXk6ICd2ZXJzaW9uJyB9LFxuICAvKiB5YXJuICovIHsga2V5OiAnc3RhYmxlVmVyc2lvbicgfSxcbiAgeyBrZXk6ICdwcml2YXRlJyB9LFxuICB7IGtleTogJ2Rlc2NyaXB0aW9uJyB9LFxuICAvKiB2c2NvZGUgKi8geyBrZXk6ICdjYXRlZ29yaWVzJywgb3ZlcjogdW5pcSB9LFxuICB7IGtleTogJ2tleXdvcmRzJywgb3ZlcjogdW5pcSB9LFxuICB7IGtleTogJ2hvbWVwYWdlJyB9LFxuICB7IGtleTogJ2J1Z3MnLCBvdmVyOiBzb3J0T2JqZWN0QnkoWyd1cmwnLCAnZW1haWwnXSkgfSxcbiAgeyBrZXk6ICdyZXBvc2l0b3J5Jywgb3Zlcjogc29ydFVSTE9iamVjdCB9LFxuICB7IGtleTogJ2Z1bmRpbmcnLCBvdmVyOiBzb3J0VVJMT2JqZWN0IH0sXG4gIHsga2V5OiAnbGljZW5zZScsIG92ZXI6IHNvcnRVUkxPYmplY3QgfSxcbiAgLyogdnNjb2RlICovIHsga2V5OiAncW5hJyB9LFxuICB7IGtleTogJ2F1dGhvcicsIG92ZXI6IHNvcnRQZW9wbGVPYmplY3QgfSxcbiAge1xuICAgIGtleTogJ21haW50YWluZXJzJyxcbiAgICBvdmVyOiBvbkFycmF5KChtYWludGFpbmVycykgPT4gbWFpbnRhaW5lcnMubWFwKHNvcnRQZW9wbGVPYmplY3QpKSxcbiAgfSxcbiAge1xuICAgIGtleTogJ2NvbnRyaWJ1dG9ycycsXG4gICAgb3Zlcjogb25BcnJheSgoY29udHJpYnV0b3JzKSA9PiBjb250cmlidXRvcnMubWFwKHNvcnRQZW9wbGVPYmplY3QpKSxcbiAgfSxcbiAgLyogdnNjb2RlICovIHsga2V5OiAncHVibGlzaGVyJyB9LFxuICB7IGtleTogJ3NpZGVFZmZlY3RzJyB9LFxuICB7IGtleTogJ3R5cGUnIH0sXG4gIHsga2V5OiAnaW1wb3J0cycgfSxcbiAgeyBrZXk6ICdleHBvcnRzJywgb3Zlcjogc29ydEV4cG9ydHMgfSxcbiAgeyBrZXk6ICdtYWluJyB9LFxuICB7IGtleTogJ3N2ZWx0ZScgfSxcbiAgeyBrZXk6ICd1bWQ6bWFpbicgfSxcbiAgeyBrZXk6ICdqc2RlbGl2cicgfSxcbiAgeyBrZXk6ICd1bnBrZycgfSxcbiAgeyBrZXk6ICdtb2R1bGUnIH0sXG4gIHsga2V5OiAnc291cmNlJyB9LFxuICB7IGtleTogJ2pzbmV4dDptYWluJyB9LFxuICB7IGtleTogJ2Jyb3dzZXInIH0sXG4gIHsga2V5OiAncmVhY3QtbmF0aXZlJyB9LFxuICB7IGtleTogJ3R5cGVzJyB9LFxuICB7IGtleTogJ3R5cGVzVmVyc2lvbnMnIH0sXG4gIHsga2V5OiAndHlwaW5ncycgfSxcbiAgeyBrZXk6ICdzdHlsZScgfSxcbiAgeyBrZXk6ICdleGFtcGxlJyB9LFxuICB7IGtleTogJ2V4YW1wbGVzdHlsZScgfSxcbiAgeyBrZXk6ICdhc3NldHMnIH0sXG4gIHsga2V5OiAnYmluJywgb3Zlcjogc29ydE9iamVjdCB9LFxuICB7IGtleTogJ21hbicgfSxcbiAgeyBrZXk6ICdkaXJlY3RvcmllcycsIG92ZXI6IHNvcnREaXJlY3RvcmllcyB9LFxuICB7IGtleTogJ2ZpbGVzJywgb3ZlcjogdW5pcSB9LFxuICB7IGtleTogJ3dvcmtzcGFjZXMnLCBvdmVyOiBzb3J0V29ya3NwYWNlcyB9LFxuICAvLyBub2RlLXByZS1neXAgaHR0cHM6Ly93d3cubnBtanMuY29tL3BhY2thZ2Uvbm9kZS1wcmUtZ3lwIzEtYWRkLW5ldy1lbnRyaWVzLXRvLXlvdXItcGFja2FnZWpzb25cbiAge1xuICAgIGtleTogJ2JpbmFyeScsXG4gICAgb3Zlcjogc29ydE9iamVjdEJ5KFtcbiAgICAgICdtb2R1bGVfbmFtZScsXG4gICAgICAnbW9kdWxlX3BhdGgnLFxuICAgICAgJ3JlbW90ZV9wYXRoJyxcbiAgICAgICdwYWNrYWdlX25hbWUnLFxuICAgICAgJ2hvc3QnLFxuICAgIF0pLFxuICB9LFxuICB7IGtleTogJ3NjcmlwdHMnLCBvdmVyOiBzb3J0U2NyaXB0cyB9LFxuICB7IGtleTogJ2JldHRlclNjcmlwdHMnLCBvdmVyOiBzb3J0U2NyaXB0cyB9LFxuICAvKiB2c2NvZGUgKi8geyBrZXk6ICdsMTBuJyB9LFxuICAvKiB2c2NvZGUgKi8geyBrZXk6ICdjb250cmlidXRlcycsIG92ZXI6IHNvcnRPYmplY3QgfSxcbiAgLyogdnNjb2RlICovIHsga2V5OiAnYWN0aXZhdGlvbkV2ZW50cycsIG92ZXI6IHVuaXEgfSxcbiAgeyBrZXk6ICdodXNreScsIG92ZXI6IG92ZXJQcm9wZXJ0eSgnaG9va3MnLCBzb3J0R2l0SG9va3MpIH0sXG4gIHsga2V5OiAnc2ltcGxlLWdpdC1ob29rcycsIG92ZXI6IHNvcnRHaXRIb29rcyB9LFxuICB7IGtleTogJ3ByZS1jb21taXQnIH0sXG4gIHsga2V5OiAnY29tbWl0bGludCcsIG92ZXI6IHNvcnRPYmplY3QgfSxcbiAgeyBrZXk6ICdsaW50LXN0YWdlZCcgfSxcbiAgeyBrZXk6ICduYW5vLXN0YWdlZCcgfSxcbiAgeyBrZXk6ICdjb25maWcnLCBvdmVyOiBzb3J0T2JqZWN0IH0sXG4gIHsga2V5OiAnbm9kZW1vbkNvbmZpZycsIG92ZXI6IHNvcnRPYmplY3QgfSxcbiAgeyBrZXk6ICdicm93c2VyaWZ5Jywgb3Zlcjogc29ydE9iamVjdCB9LFxuICB7IGtleTogJ2JhYmVsJywgb3Zlcjogc29ydE9iamVjdCB9LFxuICB7IGtleTogJ2Jyb3dzZXJzbGlzdCcgfSxcbiAgeyBrZXk6ICd4bycsIG92ZXI6IHNvcnRPYmplY3QgfSxcbiAgeyBrZXk6ICdwcmV0dGllcicsIG92ZXI6IHNvcnRQcmV0dGllckNvbmZpZyB9LFxuICB7IGtleTogJ2VzbGludENvbmZpZycsIG92ZXI6IHNvcnRFc2xpbnRDb25maWcgfSxcbiAgeyBrZXk6ICdlc2xpbnRJZ25vcmUnIH0sXG4gIHsga2V5OiAnbnBtcGtnanNvbmxpbnQnLCBvdmVyOiBzb3J0T2JqZWN0IH0sXG4gIHsga2V5OiAnbnBtUGFja2FnZUpzb25MaW50Q29uZmlnJywgb3Zlcjogc29ydE9iamVjdCB9LFxuICB7IGtleTogJ25wbXBhY2thZ2Vqc29ubGludCcsIG92ZXI6IHNvcnRPYmplY3QgfSxcbiAgeyBrZXk6ICdyZWxlYXNlJywgb3Zlcjogc29ydE9iamVjdCB9LFxuICB7IGtleTogJ3JlbWFya0NvbmZpZycsIG92ZXI6IHNvcnRPYmplY3QgfSxcbiAgeyBrZXk6ICdzdHlsZWxpbnQnIH0sXG4gIHsga2V5OiAnYXZhJywgb3Zlcjogc29ydE9iamVjdCB9LFxuICB7IGtleTogJ2plc3QnLCBvdmVyOiBzb3J0T2JqZWN0IH0sXG4gIHsga2V5OiAnamVzdC1qdW5pdCcsIG92ZXI6IHNvcnRPYmplY3QgfSxcbiAgeyBrZXk6ICdqZXN0LXN0YXJlJywgb3Zlcjogc29ydE9iamVjdCB9LFxuICB7IGtleTogJ21vY2hhJywgb3Zlcjogc29ydE9iamVjdCB9LFxuICB7IGtleTogJ255YycsIG92ZXI6IHNvcnRPYmplY3QgfSxcbiAgeyBrZXk6ICdjOCcsIG92ZXI6IHNvcnRPYmplY3QgfSxcbiAgeyBrZXk6ICd0YXAnLCBvdmVyOiBzb3J0T2JqZWN0IH0sXG4gIHsga2V5OiAnb2NsaWYnLCBvdmVyOiBzb3J0T2JqZWN0QnkodW5kZWZpbmVkLCB0cnVlKSB9LFxuICB7IGtleTogJ3Jlc29sdXRpb25zJywgb3Zlcjogc29ydE9iamVjdCB9LFxuICB7IGtleTogJ292ZXJyaWRlcycsIG92ZXI6IHNvcnREZXBlbmRlbmNpZXMgfSxcbiAgeyBrZXk6ICdkZXBlbmRlbmNpZXMnLCBvdmVyOiBzb3J0RGVwZW5kZW5jaWVzIH0sXG4gIHsga2V5OiAnZGV2RGVwZW5kZW5jaWVzJywgb3Zlcjogc29ydERlcGVuZGVuY2llcyB9LFxuICB7IGtleTogJ2RlcGVuZGVuY2llc01ldGEnLCBvdmVyOiBzb3J0T2JqZWN0Qnkoc29ydE9iamVjdEJ5SWRlbnQsIHRydWUpIH0sXG4gIHsga2V5OiAncGVlckRlcGVuZGVuY2llcycsIG92ZXI6IHNvcnREZXBlbmRlbmNpZXMgfSxcbiAgLy8gVE9ETzogb25seSBzb3J0IGRlcHRoID0gMlxuICB7IGtleTogJ3BlZXJEZXBlbmRlbmNpZXNNZXRhJywgb3Zlcjogc29ydE9iamVjdEJ5KHVuZGVmaW5lZCwgdHJ1ZSkgfSxcbiAgeyBrZXk6ICdvcHRpb25hbERlcGVuZGVuY2llcycsIG92ZXI6IHNvcnREZXBlbmRlbmNpZXMgfSxcbiAgeyBrZXk6ICdidW5kbGVkRGVwZW5kZW5jaWVzJywgb3ZlcjogdW5pcUFuZFNvcnRBcnJheSB9LFxuICB7IGtleTogJ2J1bmRsZURlcGVuZGVuY2llcycsIG92ZXI6IHVuaXFBbmRTb3J0QXJyYXkgfSxcbiAgLyogdnNjb2RlICovIHsga2V5OiAnZXh0ZW5zaW9uUGFjaycsIG92ZXI6IHVuaXFBbmRTb3J0QXJyYXkgfSxcbiAgLyogdnNjb2RlICovIHsga2V5OiAnZXh0ZW5zaW9uRGVwZW5kZW5jaWVzJywgb3ZlcjogdW5pcUFuZFNvcnRBcnJheSB9LFxuICB7IGtleTogJ2ZsYXQnIH0sXG4gIHsga2V5OiAncGFja2FnZU1hbmFnZXInIH0sXG4gIHsga2V5OiAnZW5naW5lcycsIG92ZXI6IHNvcnRPYmplY3QgfSxcbiAgeyBrZXk6ICdlbmdpbmVTdHJpY3QnLCBvdmVyOiBzb3J0T2JqZWN0IH0sXG4gIHsga2V5OiAnZGV2RW5naW5lcycsIG92ZXI6IHNvcnREZXZFbmdpbmVzIH0sXG4gIHsga2V5OiAndm9sdGEnLCBvdmVyOiBzb3J0Vm9sdGEgfSxcbiAgeyBrZXk6ICdsYW5ndWFnZU5hbWUnIH0sXG4gIHsga2V5OiAnb3MnIH0sXG4gIHsga2V5OiAnY3B1JyB9LFxuICB7IGtleTogJ3ByZWZlckdsb2JhbCcsIG92ZXI6IHNvcnRPYmplY3QgfSxcbiAgeyBrZXk6ICdwdWJsaXNoQ29uZmlnJywgb3Zlcjogc29ydE9iamVjdCB9LFxuICAvKiB2c2NvZGUgKi8geyBrZXk6ICdpY29uJyB9LFxuICAvKiB2c2NvZGUgKi8ge1xuICAgIGtleTogJ2JhZGdlcycsXG4gICAgb3Zlcjogb25BcnJheSgoYmFkZ2UpID0+IGJhZGdlLm1hcChzb3J0VlNDb2RlQmFkZ2VPYmplY3QpKSxcbiAgfSxcbiAgLyogdnNjb2RlICovIHsga2V5OiAnZ2FsbGVyeUJhbm5lcicsIG92ZXI6IHNvcnRPYmplY3QgfSxcbiAgLyogdnNjb2RlICovIHsga2V5OiAncHJldmlldycgfSxcbiAgLyogdnNjb2RlICovIHsga2V5OiAnbWFya2Rvd24nIH0sXG4gIHsga2V5OiAncG5wbScsIG92ZXI6IHNvcnRQbnBtQ29uZmlnIH0sXG5dXG5cbmNvbnN0IGRlZmF1bHRTb3J0T3JkZXIgPSBmaWVsZHMubWFwKCh7IGtleSB9KSA9PiBrZXkpXG5jb25zdCBvdmVyRmllbGRzID0gcGlwZShcbiAgZmllbGRzXG4gICAgLm1hcCgoeyBrZXksIG92ZXIgfSkgPT4gKG92ZXIgPyBvdmVyUHJvcGVydHkoa2V5LCBvdmVyKSA6IHVuZGVmaW5lZCkpXG4gICAgLmZpbHRlcihCb29sZWFuKSxcbilcblxuZnVuY3Rpb24gZWRpdFN0cmluZ0pTT04oanNvbiwgb3Zlcikge1xuICBpZiAodHlwZW9mIGpzb24gPT09ICdzdHJpbmcnKSB7XG4gICAgY29uc3QgeyBpbmRlbnQsIHR5cGUgfSA9IGRldGVjdEluZGVudChqc29uKVxuICAgIGNvbnN0IGVuZENoYXJhY3RlcnMgPSBqc29uLnNsaWNlKC0xKSA9PT0gJ1xcbicgPyAnXFxuJyA6ICcnXG4gICAgY29uc3QgbmV3bGluZSA9IGRldGVjdE5ld2xpbmUoanNvbilcbiAgICBqc29uID0gSlNPTi5wYXJzZShqc29uKVxuXG4gICAgbGV0IHJlc3VsdCA9XG4gICAgICBKU09OLnN0cmluZ2lmeShvdmVyKGpzb24pLCBudWxsLCB0eXBlID09PSAndGFiJyA/ICdcXHQnIDogaW5kZW50KSArXG4gICAgICBlbmRDaGFyYWN0ZXJzXG4gICAgaWYgKG5ld2xpbmUgPT09ICdcXHJcXG4nKSB7XG4gICAgICByZXN1bHQgPSByZXN1bHQucmVwbGFjZSgvXFxuL2csIG5ld2xpbmUpXG4gICAgfVxuICAgIHJldHVybiByZXN1bHRcbiAgfVxuXG4gIHJldHVybiBvdmVyKGpzb24pXG59XG5cbmZ1bmN0aW9uIHNvcnRQYWNrYWdlSnNvbihqc29uSXNoLCBvcHRpb25zID0ge30pIHtcbiAgcmV0dXJuIGVkaXRTdHJpbmdKU09OKFxuICAgIGpzb25Jc2gsXG4gICAgb25PYmplY3QoKGpzb24pID0+IHtcbiAgICAgIGxldCBzb3J0T3JkZXIgPSBvcHRpb25zLnNvcnRPcmRlciB8fCBkZWZhdWx0U29ydE9yZGVyXG5cbiAgICAgIGlmIChBcnJheS5pc0FycmF5KHNvcnRPcmRlcikpIHtcbiAgICAgICAgY29uc3Qga2V5cyA9IE9iamVjdC5rZXlzKGpzb24pXG4gICAgICAgIGNvbnN0IHsgcHJpdmF0ZUtleXMgPSBbXSwgcHVibGljS2V5cyA9IFtdIH0gPSBvYmplY3RHcm91cEJ5KFxuICAgICAgICAgIGtleXMsXG4gICAgICAgICAgKGtleSkgPT4gKGtleVswXSA9PT0gJ18nID8gJ3ByaXZhdGVLZXlzJyA6ICdwdWJsaWNLZXlzJyksXG4gICAgICAgIClcbiAgICAgICAgc29ydE9yZGVyID0gW1xuICAgICAgICAgIC4uLnNvcnRPcmRlcixcbiAgICAgICAgICAuLi5kZWZhdWx0U29ydE9yZGVyLFxuICAgICAgICAgIC4uLnB1YmxpY0tleXMuc29ydCgpLFxuICAgICAgICAgIC4uLnByaXZhdGVLZXlzLnNvcnQoKSxcbiAgICAgICAgXVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gb3ZlckZpZWxkcyhzb3J0T2JqZWN0S2V5cyhqc29uLCBzb3J0T3JkZXIpLCBqc29uKVxuICAgIH0pLFxuICApXG59XG5cbmV4cG9ydCBkZWZhdWx0IHNvcnRQYWNrYWdlSnNvblxuZXhwb3J0IHsgc29ydFBhY2thZ2VKc29uLCBkZWZhdWx0U29ydE9yZGVyIGFzIHNvcnRPcmRlciB9XG4iLCJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBpc1BsYWluT2JqZWN0KHZhbHVlKSB7XG5cdGlmICh0eXBlb2YgdmFsdWUgIT09ICdvYmplY3QnIHx8IHZhbHVlID09PSBudWxsKSB7XG5cdFx0cmV0dXJuIGZhbHNlO1xuXHR9XG5cblx0Y29uc3QgcHJvdG90eXBlID0gT2JqZWN0LmdldFByb3RvdHlwZU9mKHZhbHVlKTtcblx0cmV0dXJuIChwcm90b3R5cGUgPT09IG51bGwgfHwgcHJvdG90eXBlID09PSBPYmplY3QucHJvdG90eXBlIHx8IE9iamVjdC5nZXRQcm90b3R5cGVPZihwcm90b3R5cGUpID09PSBudWxsKSAmJiAhKFN5bWJvbC50b1N0cmluZ1RhZyBpbiB2YWx1ZSkgJiYgIShTeW1ib2wuaXRlcmF0b3IgaW4gdmFsdWUpO1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHsgc29ydFBhY2thZ2VKc29uIH0gZnJvbSAnc29ydC1wYWNrYWdlLWpzb24nO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHsgZnNVdGlsIH0gZnJvbSAnLi4vdXRpbHMvZnNVdGlsLmpzJztcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGZpeFRlc3REaXJlY3Rvcmllc1VwZGF0aW5nUGFja2FnZUpzb24ocGFja2FnZURpclBhdGhzOiBzdHJpbmdbXSk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2ZpeFRlc3REaXJlY3Rvcmllc1VwZGF0aW5nUGFja2FnZUpzb24nLCBhc3luYyAoKSA9PiB7XG4gICAgYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgICBwYWNrYWdlRGlyUGF0aHMubWFwKGFzeW5jIChwYWNrYWdlRGlyUGF0aCkgPT4ge1xuICAgICAgICBjb25zdCBwYWNrYWdlSnNvblBhdGggPSBwYXRoLmpvaW4ocGFja2FnZURpclBhdGgsICdwYWNrYWdlLmpzb24nKTtcbiAgICAgICAgaWYgKCFmcy5leGlzdHNTeW5jKHBhY2thZ2VKc29uUGF0aCkpIHJldHVybjtcblxuICAgICAgICBjb25zdCBuZXdUZXN0RGlyUGF0aCA9IHBhdGguam9pbihwYWNrYWdlRGlyUGF0aCwgJ3Rlc3QnKTtcbiAgICAgICAgZm9yIChjb25zdCBvbGRUZXN0RGlyTmFtZSBvZiBbJ19fdGVzdHNfXycsICd0ZXN0cyddKSB7XG4gICAgICAgICAgY29uc3Qgb2xkVGVzdERpclBhdGggPSBwYXRoLmpvaW4ocGFja2FnZURpclBhdGgsIG9sZFRlc3REaXJOYW1lKTtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgYXdhaXQgbW92ZVRlc3REaXJlY3Rvcnkob2xkVGVzdERpclBhdGgsIG5ld1Rlc3REaXJQYXRoKTtcbiAgICAgICAgICAgIGNvbnN0IHBhY2thZ2VKc29uID0gSlNPTi5wYXJzZShhd2FpdCBmcy5wcm9taXNlcy5yZWFkRmlsZShwYWNrYWdlSnNvblBhdGgsICd1dGY4JykpIGFzIHtcbiAgICAgICAgICAgICAgc2NyaXB0cz86IFJlY29yZDxzdHJpbmcsIHN0cmluZz47XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgbGV0IGRpZFVwZGF0ZVNjcmlwdCA9IGZhbHNlO1xuICAgICAgICAgICAgY29uc3Qgc2NyaXB0cyA9IHBhY2thZ2VKc29uLnNjcmlwdHMgPz8ge307XG4gICAgICAgICAgICBmb3IgKGNvbnN0IFtzY3JpcHROYW1lLCBzY3JpcHRdIG9mIE9iamVjdC5lbnRyaWVzKHNjcmlwdHMpKSB7XG4gICAgICAgICAgICAgIGNvbnN0IG5ld1NjcmlwdCA9IHNjcmlwdC5yZXBsYWNlQWxsKG9sZFRlc3REaXJOYW1lLCAndGVzdCcpO1xuICAgICAgICAgICAgICBpZiAoc2NyaXB0ICE9PSBuZXdTY3JpcHQpIHtcbiAgICAgICAgICAgICAgICBzY3JpcHRzW3NjcmlwdE5hbWVdID0gbmV3U2NyaXB0O1xuICAgICAgICAgICAgICAgIGRpZFVwZGF0ZVNjcmlwdCA9IHRydWU7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHBhY2thZ2VKc29uLnNjcmlwdHMgPSBzY3JpcHRzO1xuICAgICAgICAgICAgaWYgKCFkaWRVcGRhdGVTY3JpcHQpIHJldHVybjtcblxuICAgICAgICAgICAgYXdhaXQgZnNVdGlsLmdlbmVyYXRlRmlsZShwYWNrYWdlSnNvblBhdGgsIEpTT04uc3RyaW5naWZ5KHNvcnRQYWNrYWdlSnNvbihwYWNrYWdlSnNvbiksIHVuZGVmaW5lZCwgMikpO1xuICAgICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgICAgLy8gZG8gbm90aGluZ1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSlcbiAgICApO1xuICB9KTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gbW92ZVRlc3REaXJlY3Rvcnkob2xkVGVzdERpclBhdGg6IHN0cmluZywgbmV3VGVzdERpclBhdGg6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICBpZiAoIWZzLmV4aXN0c1N5bmMobmV3VGVzdERpclBhdGgpKSB7XG4gICAgYXdhaXQgZnMucHJvbWlzZXMucmVuYW1lKG9sZFRlc3REaXJQYXRoLCBuZXdUZXN0RGlyUGF0aCk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgY29uc3QgZGlyZW50cyA9IGF3YWl0IGZzLnByb21pc2VzLnJlYWRkaXIob2xkVGVzdERpclBhdGgsIHsgd2l0aEZpbGVUeXBlczogdHJ1ZSB9KTtcbiAgYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgZGlyZW50cy5tYXAoYXN5bmMgKGRpcmVudCkgPT4ge1xuICAgICAgY29uc3Qgb2xkUGF0aCA9IHBhdGguam9pbihvbGRUZXN0RGlyUGF0aCwgZGlyZW50Lm5hbWUpO1xuICAgICAgY29uc3QgbmV3UGF0aCA9IHBhdGguam9pbihuZXdUZXN0RGlyUGF0aCwgZGlyZW50Lm5hbWUpO1xuICAgICAgY29uc3QgbmV3UGF0aFN0YXQgPSBmcy5leGlzdHNTeW5jKG5ld1BhdGgpID8gYXdhaXQgZnMucHJvbWlzZXMuc3RhdChuZXdQYXRoKSA6IHVuZGVmaW5lZDtcbiAgICAgIGlmIChkaXJlbnQuaXNEaXJlY3RvcnkoKSAmJiBuZXdQYXRoU3RhdD8uaXNEaXJlY3RvcnkoKSkge1xuICAgICAgICBhd2FpdCBtb3ZlVGVzdERpcmVjdG9yeShvbGRQYXRoLCBuZXdQYXRoKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgYXdhaXQgZnMucHJvbWlzZXMucmVuYW1lKG9sZFBhdGgsIG5ld1BhdGgpO1xuICAgIH0pXG4gICk7XG4gIGF3YWl0IGZzLnByb21pc2VzLnJtKG9sZFRlc3REaXJQYXRoLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzL3Byb21pc2VzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB7IGlnbm9yZUVub2VudEFzeW5jIH0gZnJvbSAnQHdpbGxib29zdGVyL3NoYXJlZC1saWIvc3JjJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgcHJvbWlzZVBvb2wgfSBmcm9tICcuLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBmaXhUeXBlRGVmaW5pdGlvbnMoXG4gIGNvbmZpZzogUGFja2FnZUNvbmZpZyxcbiAgY29uZmlnc0luY2x1ZGluZ0NoaWxkcmVuOiBQYWNrYWdlQ29uZmlnW11cbik6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2ZpeFR5cGVEZWZpbml0aW9ucycsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBsaWJUeXBlRGlyUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJ0B0eXBlcycpO1xuICAgIGNvbnN0IHNyY1R5cGVEaXJQYXRoID1cbiAgICAgIGNvbmZpZy5pc1Jvb3QgJiYgY29uZmlnLmRvZXNDb250YWluU3ViUGFja2FnZUpzb25zID8gdW5kZWZpbmVkIDogcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnc3JjJywgJ3R5cGVzJyk7XG5cbiAgICBjb25zdCBkaXJlbnRzID0gYXdhaXQgaWdub3JlRW5vZW50QXN5bmMoKCkgPT4gZnMucmVhZGRpcihsaWJUeXBlRGlyUGF0aCwgeyB3aXRoRmlsZVR5cGVzOiB0cnVlIH0pKTtcbiAgICBpZiAoIWRpcmVudHMpIHJldHVybjtcblxuICAgIGZvciAoY29uc3QgZGlyZW50IG9mIGRpcmVudHMpIHtcbiAgICAgIGNvbnN0IGRpck5hbWUgPSBkaXJlbnQubmFtZS5zbGljZSgwLCAtNSk7XG4gICAgICBjb25zdCBoYXNUeXBlRGVjbGFyYXRpb25FeHRlbnNpb24gPSBkaXJlbnQubmFtZS5lbmRzV2l0aCgnLmQudHMnKTtcbiAgICAgIGxldCBwYWNrYWdlTmFtZSA9IGhhc1R5cGVEZWNsYXJhdGlvbkV4dGVuc2lvbiA/IGRpck5hbWUgOiBkaXJlbnQubmFtZTtcbiAgICAgIGlmIChwYWNrYWdlTmFtZS5pbmNsdWRlcygnX18nKSkge1xuICAgICAgICBwYWNrYWdlTmFtZSA9IGBAJHtwYWNrYWdlTmFtZS5yZXBsYWNlKCdfXycsICcvJyl9YDtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGhhc0xpYnJhcnkgPSBjb25maWdzSW5jbHVkaW5nQ2hpbGRyZW4uc29tZShcbiAgICAgICAgKGNvbmZpZykgPT5cbiAgICAgICAgICBjb25maWcucGFja2FnZUpzb24/LmRlcGVuZGVuY2llcz8uW3BhY2thZ2VOYW1lXSB8fCBjb25maWcucGFja2FnZUpzb24/LmRldkRlcGVuZGVuY2llcz8uW3BhY2thZ2VOYW1lXVxuICAgICAgKTtcblxuICAgICAgaWYgKGRpcmVudC5pc0ZpbGUoKSAmJiBoYXNUeXBlRGVjbGFyYXRpb25FeHRlbnNpb24pIHtcbiAgICAgICAgaWYgKGhhc0xpYnJhcnkpIHtcbiAgICAgICAgICAvLyBNb3ZlIEB0eXBlcy88bmFtZT4vaW5kZXguZC50cyBpZiBpbnN0YWxsZWRcbiAgICAgICAgICBhd2FpdCBmcy5ta2RpcihwYXRoLmpvaW4obGliVHlwZURpclBhdGgsIGRpck5hbWUpLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgICAgICAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT5cbiAgICAgICAgICAgIGZzLnJlbmFtZShwYXRoLmpvaW4obGliVHlwZURpclBhdGgsIGRpcmVudC5uYW1lKSwgcGF0aC5qb2luKGxpYlR5cGVEaXJQYXRoLCBkaXJOYW1lLCAnaW5kZXguZC50cycpKVxuICAgICAgICAgICk7XG4gICAgICAgIH0gZWxzZSBpZiAoc3JjVHlwZURpclBhdGgpIHtcbiAgICAgICAgICAvLyBNb3ZlIHNyYy90eXBlcy88bmFtZT4gaWYgbm90IGluc3RhbGxlZFxuICAgICAgICAgIGF3YWl0IGZzLm1rZGlyKHNyY1R5cGVEaXJQYXRoLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgICAgICAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT5cbiAgICAgICAgICAgIGZzLnJlbmFtZShwYXRoLmpvaW4obGliVHlwZURpclBhdGgsIGRpcmVudC5uYW1lKSwgcGF0aC5qb2luKHNyY1R5cGVEaXJQYXRoLCBkaXJlbnQubmFtZSkpXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChkaXJlbnQuaXNEaXJlY3RvcnkoKSAmJiBzcmNUeXBlRGlyUGF0aCAmJiAhaGFzTGlicmFyeSkge1xuICAgICAgICAvLyBNb3ZlIHNyYy90eXBlcy88bmFtZT4uZC50cyBpZiBub3QgaW5zdGFsbGVkXG4gICAgICAgIGF3YWl0IGZzLm1rZGlyKHNyY1R5cGVEaXJQYXRoLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgICAgICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+XG4gICAgICAgICAgaWdub3JlRW5vZW50QXN5bmMoKCkgPT5cbiAgICAgICAgICAgIGZzLnJlbmFtZShcbiAgICAgICAgICAgICAgcGF0aC5qb2luKGxpYlR5cGVEaXJQYXRoLCBkaXJlbnQubmFtZSwgJ2luZGV4LmQudHMnKSxcbiAgICAgICAgICAgICAgcGF0aC5qb2luKHNyY1R5cGVEaXJQYXRoLCBgJHtkaXJlbnQubmFtZX0uZC50c2ApXG4gICAgICAgICAgICApXG4gICAgICAgICAgKVxuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cbiAgfSk7XG59XG4iLCJpbXBvcnQgbWVyZ2UgZnJvbSAnZGVlcG1lcmdlJztcblxuZXhwb3J0IGZ1bmN0aW9uIG92ZXJ3cml0ZU1lcmdlPFQ+KGRlc3RpbmF0aW9uQXJyYXk6IFRbXSwgc291cmNlQXJyYXk6IFRbXSk6IFRbXSB7XG4gIHJldHVybiBzb3VyY2VBcnJheTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNvbWJpbmVNZXJnZSh0YXJnZXQ6IHVua25vd25bXSwgc291cmNlOiB1bmtub3duW10sIG9wdGlvbnM6IG1lcmdlLkFycmF5TWVyZ2VPcHRpb25zKTogdW5rbm93bltdIHtcbiAgY29uc3QgZGVzdGluYXRpb24gPSBbLi4udGFyZ2V0XTtcblxuICBmb3IgKGNvbnN0IFtpbmRleCwgaXRlbV0gb2Ygc291cmNlLmVudHJpZXMoKSkge1xuICAgIGlmIChkZXN0aW5hdGlvbltpbmRleF0gPT09IHVuZGVmaW5lZCkge1xuICAgICAgZGVzdGluYXRpb25baW5kZXhdID0gY2xvbmVVbmxlc3NPdGhlcndpc2VTcGVjaWZpZWQoaXRlbSwgb3B0aW9ucyk7XG4gICAgfSBlbHNlIGlmIChpc01lcmdlYWJsZU9iamVjdCh0YXJnZXRbaW5kZXhdLCBvcHRpb25zKSAmJiBpc01lcmdlYWJsZU9iamVjdChpdGVtLCBvcHRpb25zKSkge1xuICAgICAgZGVzdGluYXRpb25baW5kZXhdID0gbWVyZ2UodGFyZ2V0W2luZGV4XSwgaXRlbSwgb3B0aW9ucyk7XG4gICAgfSBlbHNlIGlmICghdGFyZ2V0LmluY2x1ZGVzKGl0ZW0pKSB7XG4gICAgICBkZXN0aW5hdGlvbi5wdXNoKGl0ZW0pO1xuICAgIH1cbiAgfVxuICByZXR1cm4gZGVzdGluYXRpb247XG59XG5cbmZ1bmN0aW9uIGNsb25lVW5sZXNzT3RoZXJ3aXNlU3BlY2lmaWVkKHZhbHVlOiB1bmtub3duLCBvcHRpb25zOiBtZXJnZS5BcnJheU1lcmdlT3B0aW9ucyk6IHVua25vd24ge1xuICByZXR1cm4gaXNNZXJnZWFibGVPYmplY3QodmFsdWUsIG9wdGlvbnMpID8gb3B0aW9ucy5jbG9uZVVubGVzc090aGVyd2lzZVNwZWNpZmllZCh2YWx1ZSwgb3B0aW9ucykgOiB2YWx1ZTtcbn1cblxuZnVuY3Rpb24gaXNNZXJnZWFibGVPYmplY3QodmFsdWU6IHVua25vd24sIG9wdGlvbnM6IG1lcmdlLkFycmF5TWVyZ2VPcHRpb25zKTogdmFsdWUgaXMgb2JqZWN0IHtcbiAgcmV0dXJuICEhdmFsdWUgJiYgdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJiBvcHRpb25zLmlzTWVyZ2VhYmxlT2JqZWN0KHZhbHVlKTtcbn1cbiIsImV4cG9ydCBmdW5jdGlvbiBtb3ZlVG9Cb3R0b208VE9iaiBleHRlbmRzIFJlY29yZDxUS2V5LCB1bmtub3duPiwgVEtleSBleHRlbmRzIHN0cmluZyB8IG51bWJlciB8IHN5bWJvbD4oXG4gIG9iajogVE9iaixcbiAga2V5OiBUS2V5XG4pOiBUT2JqIHtcbiAgY29uc3QgdmFsdWUgPSBvYmpba2V5XTtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1keW5hbWljLWRlbGV0ZVxuICBkZWxldGUgb2JqW2tleV07XG4gIChvYmogYXMgUmVjb3JkPFRLZXksIHVua25vd24+KVtrZXldID0gdmFsdWU7XG4gIHJldHVybiBvYmo7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBzb3J0S2V5czxUIGV4dGVuZHMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4+KG9iajogVCk6IFQge1xuICBjb25zdCBrZXlBbmRWYWx1ZXMgPSBPYmplY3QuZW50cmllcyhvYmopLnRvU29ydGVkKChba2V5MV0sIFtrZXkyXSkgPT4ga2V5MS5sb2NhbGVDb21wYXJlKGtleTIpKTtcbiAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2Yga2V5QW5kVmFsdWVzKSB7XG4gICAgLy8gcGFja2FnZS5qc29uLXN0eWxlIGtleXMgYXJlIG5vbi1hcnJheS1pbmRleCBrZXlzLCBzbyBKU09OLnN0cmluZ2lmeSBwcmVzZXJ2ZXMgdGhpcyBpbnNlcnRpb24gb3JkZXIuXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1keW5hbWljLWRlbGV0ZVxuICAgIGRlbGV0ZSBvYmpba2V5XTtcbiAgICAob2JqIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KVtrZXldID0gdmFsdWU7XG5cbiAgICAvLyBpZiB2YWx1ZSBpcyBhbiBvYmplY3QsIHNvcnQgdGhlIGtleXMgb2YgdGhlIG9iamVjdFxuICAgIGlmICh2YWx1ZSAmJiB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnICYmICFBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgICAgc29ydEtleXModmFsdWUgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pO1xuICAgIH1cbiAgfVxuICByZXR1cm4gb2JqO1xufVxuIiwiLy8gR2l0SHViIEFjdGlvbnMgdmFsdWVsZXNzIGV2ZW50cyBzdWNoIGFzIGBwdWxsX3JlcXVlc3Q6YCByZXF1aXJlIFlBTUwgbnVsbCB2YWx1ZXMuXG4vLyBveGxpbnQtZGlzYWJsZSBlc2xpbnQtcGx1Z2luLWltcG9ydC9uby1uYW1lZC1hcy1kZWZhdWx0LW1lbWJlciAtLSBOYW1lc3BhY2UgWUFNTCBjYWxscyBtYWtlIGxvYWQvZHVtcCB1c2FnZSBjbGVhcmVyLlxuLyogZXNsaW50LWRpc2FibGUgdW5pY29ybi9uby1udWxsICovXG5cbmltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCBtZXJnZSBmcm9tICdkZWVwbWVyZ2UnO1xuaW1wb3J0IHlhbWwgZnJvbSAnanMteWFtbCc7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGNvbWJpbmVNZXJnZSB9IGZyb20gJy4uL3V0aWxzL21lcmdlVXRpbC5qcyc7XG5pbXBvcnQgeyBtb3ZlVG9Cb3R0b20sIHNvcnRLZXlzIH0gZnJvbSAnLi4vdXRpbHMvb2JqZWN0VXRpbC5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcblxuaW50ZXJmYWNlIFdvcmtmbG93IHtcbiAgbmFtZT86IHN0cmluZztcbiAgb24/OiBPbjtcbiAgY29uY3VycmVuY3k/OiBDb25jdXJyZW5jeTtcbiAgcGVybWlzc2lvbnM/OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+O1xuICBqb2JzOiBSZWNvcmQ8c3RyaW5nLCBKb2I+O1xufVxuXG5pbnRlcmZhY2UgQ29uY3VycmVuY3kge1xuICBncm91cDogc3RyaW5nO1xuICAnY2FuY2VsLWluLXByb2dyZXNzJzogYm9vbGVhbjtcbn1cblxuaW50ZXJmYWNlIE9uIHtcbiAgLy8gR2l0SHViIEFjdGlvbnMgdHJlYXRzIGBldmVudDogbnVsbGAgYXMgYSB2YWx1ZWxlc3MgZXZlbnQgbWFwcGluZywgZS5nLlxuICAvLyBgcHVsbF9yZXF1ZXN0OmAuIGB1bmRlZmluZWRgIHdvdWxkIG9taXQgdGhlIGV2ZW50IGVudGlyZWx5IHdoZW4gZHVtcGluZyBZQU1MLlxuICBpc3N1ZXM/OiBUeXBlcyB8IG51bGw7XG4gIHB1bGxfcmVxdWVzdD86IFB1bGxSZXF1ZXN0IHwgbnVsbDtcbiAgcHVsbF9yZXF1ZXN0X3RhcmdldD86IFR5cGVzIHwgbnVsbDtcbiAgcHVzaD86IFB1c2g7XG4gIHNjaGVkdWxlPzogU2NoZWR1bGVbXTtcbiAgd29ya2Zsb3dfZGlzcGF0Y2g/OiBudWxsO1xufVxuXG5pbnRlcmZhY2UgUHVsbFJlcXVlc3Qge1xuICAncGF0aHMtaWdub3JlJz86IHN0cmluZ1tdO1xuICB0eXBlcz86IHN0cmluZ1tdO1xufVxuXG5pbnRlcmZhY2UgUHVzaCB7XG4gIGJyYW5jaGVzOiBzdHJpbmdbXTtcbiAgJ3BhdGhzLWlnbm9yZSc/OiBzdHJpbmdbXTtcbn1cblxuaW50ZXJmYWNlIFNjaGVkdWxlIHtcbiAgY3Jvbjogc3RyaW5nO1xufVxuXG5pbnRlcmZhY2UgVHlwZXMge1xuICB0eXBlczogc3RyaW5nW107XG59XG5cbmludGVyZmFjZSBKb2Ige1xuICAncnVucy1vbic/OiBzdHJpbmc7XG4gIHBlcm1pc3Npb25zPzogUmVjb3JkPHN0cmluZywgc3RyaW5nPjtcbiAgc3RlcHM/OiBTdGVwW107XG4gIHVzZXM/OiBzdHJpbmc7XG4gIGlmPzogc3RyaW5nO1xuICBzZWNyZXRzPzogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gIHdpdGg/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbn1cblxuaW50ZXJmYWNlIFN0ZXAge1xuICB1c2VzPzogc3RyaW5nO1xuICB3aXRoPzogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gIHJ1bj86IHN0cmluZztcbn1cblxuY29uc3QgcHVibGljUmVwb0F1dG9maXhXb3JrZmxvdzogV29ya2Zsb3cgPSB7XG4gIG5hbWU6ICdhdXRvZml4LmNpJyxcbiAgb246IHtcbiAgICBwdWxsX3JlcXVlc3Q6IG51bGwsXG4gICAgcHVzaDoge1xuICAgICAgYnJhbmNoZXM6IFsnbWFpbiddLFxuICAgIH0sXG4gIH0sXG4gIHBlcm1pc3Npb25zOiB7XG4gICAgY29udGVudHM6ICdyZWFkJyxcbiAgfSxcbiAgY29uY3VycmVuY3k6IHtcbiAgICBncm91cDogJ2F1dG9maXgtJHt7IGdpdGh1Yi5oZWFkX3JlZiB9fScsXG4gICAgJ2NhbmNlbC1pbi1wcm9ncmVzcyc6IHRydWUsXG4gIH0sXG4gIGpvYnM6IHtcbiAgICBhdXRvZml4OiB7ICdydW5zLW9uJzogJ3VidW50dS1sYXRlc3QnIH0sXG4gIH0sXG59O1xuXG5jb25zdCBwcml2YXRlUmVwb0F1dG9maXhXb3JrZmxvdzogV29ya2Zsb3cgPSB7XG4gIG5hbWU6ICdGaXggY29kZSBhdXRvbWF0aWNhbGx5JyxcbiAgb246IHtcbiAgICBwdWxsX3JlcXVlc3Q6IG51bGwsXG4gIH0sXG4gIGNvbmN1cnJlbmN5OiB7XG4gICAgZ3JvdXA6ICcke3sgZ2l0aHViLndvcmtmbG93IH19LSR7eyBnaXRodWIucmVmIH19JyxcbiAgICAnY2FuY2VsLWluLXByb2dyZXNzJzogdHJ1ZSxcbiAgfSxcbiAgam9iczoge1xuICAgIGF1dG9maXg6IHtcbiAgICAgIHVzZXM6ICdXaWxsQm9vc3Rlci9yZXVzYWJsZS13b3JrZmxvd3MvLmdpdGh1Yi93b3JrZmxvd3MvYXV0b2ZpeC55bWxAbWFpbicsXG4gICAgfSxcbiAgfSxcbn07XG5cbmNvbnN0IHdvcmtmbG93cyA9IHtcbiAgdGVzdDoge1xuICAgIG5hbWU6ICdUZXN0JyxcbiAgICBvbjoge1xuICAgICAgcHVsbF9yZXF1ZXN0OiBudWxsLFxuICAgICAgcHVzaDoge1xuICAgICAgICBicmFuY2hlczogWydtYWluJywgJ3diZnknXSxcbiAgICAgIH0sXG4gICAgfSxcbiAgICAvLyBjZi4gaHR0cHM6Ly9kb2NzLmdpdGh1Yi5jb20vZW4vYWN0aW9ucy91c2luZy1qb2JzL3VzaW5nLWNvbmN1cnJlbmN5I2V4YW1wbGUtb25seS1jYW5jZWwtaW4tcHJvZ3Jlc3Mtam9icy1vci1ydW5zLWZvci10aGUtY3VycmVudC13b3JrZmxvd1xuICAgIGNvbmN1cnJlbmN5OiB7XG4gICAgICBncm91cDogJyR7eyBnaXRodWIud29ya2Zsb3cgfX0tJHt7IGdpdGh1Yi5yZWYgfX0nLFxuICAgICAgJ2NhbmNlbC1pbi1wcm9ncmVzcyc6IHRydWUsXG4gICAgfSxcbiAgICBwZXJtaXNzaW9uczoge1xuICAgICAgLy8gZm9yIGxpbnRlciBmaXhcbiAgICAgIGNvbnRlbnRzOiAnd3JpdGUnLFxuICAgIH0sXG4gICAgam9iczoge1xuICAgICAgdGVzdDoge1xuICAgICAgICB1c2VzOiAnV2lsbEJvb3N0ZXIvcmV1c2FibGUtd29ya2Zsb3dzLy5naXRodWIvd29ya2Zsb3dzL3Rlc3QueW1sQG1haW4nLFxuICAgICAgfSxcbiAgICB9LFxuICB9LFxuICByZWxlYXNlOiB7XG4gICAgbmFtZTogJ1JlbGVhc2UnLFxuICAgIG9uOiB7XG4gICAgICBwdXNoOiB7XG4gICAgICAgIGJyYW5jaGVzOiBbXSxcbiAgICAgIH0sXG4gICAgfSxcbiAgICBjb25jdXJyZW5jeToge1xuICAgICAgZ3JvdXA6ICcke3sgZ2l0aHViLndvcmtmbG93IH19JyxcbiAgICAgICdjYW5jZWwtaW4tcHJvZ3Jlc3MnOiBmYWxzZSxcbiAgICB9LFxuICAgIHBlcm1pc3Npb25zOiB7XG4gICAgICAvLyBodHRwczovL2RvY3MubnBtanMuY29tL3RydXN0ZWQtcHVibGlzaGVycyNzdGVwLTItY29uZmlndXJlLXlvdXItY2ljZC13b3JrZmxvd1xuICAgICAgJ2lkLXRva2VuJzogJ3dyaXRlJyxcbiAgICAgIC8vIGZvciBzZW1hbnRpYy1yZWxlYXNlXG4gICAgICBjb250ZW50czogJ3dyaXRlJyxcbiAgICB9LFxuICAgIGpvYnM6IHtcbiAgICAgIHJlbGVhc2U6IHtcbiAgICAgICAgdXNlczogJ1dpbGxCb29zdGVyL3JldXNhYmxlLXdvcmtmbG93cy8uZ2l0aHViL3dvcmtmbG93cy9yZWxlYXNlLnltbEBtYWluJyxcbiAgICAgIH0sXG4gICAgfSxcbiAgfSxcbiAgJ3NlbWFudGljLXByJzoge1xuICAgIG5hbWU6ICdMaW50IFBSIHRpdGxlJyxcbiAgICBvbjoge1xuICAgICAgcHVsbF9yZXF1ZXN0X3RhcmdldDoge1xuICAgICAgICB0eXBlczogWydvcGVuZWQnLCAnZWRpdGVkJywgJ3N5bmNocm9uaXplJ10sXG4gICAgICB9LFxuICAgIH0sXG4gICAgam9iczoge1xuICAgICAgJ3NlbWFudGljLXByJzoge1xuICAgICAgICB1c2VzOiAnV2lsbEJvb3N0ZXIvcmV1c2FibGUtd29ya2Zsb3dzLy5naXRodWIvd29ya2Zsb3dzL3NlbWFudGljLXByLnltbEBtYWluJyxcbiAgICAgIH0sXG4gICAgfSxcbiAgfSxcbiAgc3luYzoge1xuICAgIG5hbWU6ICdTeW5jJyxcbiAgICBvbjoge30sXG4gICAgcGVybWlzc2lvbnM6IHtcbiAgICAgIC8vIGZvciBjb21taXRpbmcgY2hhbmdlc1xuICAgICAgY29udGVudHM6ICd3cml0ZScsXG4gICAgfSxcbiAgICBqb2JzOiB7XG4gICAgICBzeW5jOiB7IHVzZXM6ICdXaWxsQm9vc3Rlci9yZXVzYWJsZS13b3JrZmxvd3MvLmdpdGh1Yi93b3JrZmxvd3Mvc3luYy55bWxAbWFpbicgfSxcbiAgICB9LFxuICB9LFxuICAnY2xvc2UtY29tbWVudCc6IHtcbiAgICBuYW1lOiAnQWRkIGNsb3NlIGNvbW1lbnQnLFxuICAgIG9uOiB7XG4gICAgICBwdWxsX3JlcXVlc3Q6IHtcbiAgICAgICAgdHlwZXM6IFsnb3BlbmVkJ10sXG4gICAgICB9LFxuICAgIH0sXG4gICAgam9iczoge1xuICAgICAgJ2Nsb3NlLWNvbW1lbnQnOiB7XG4gICAgICAgIHVzZXM6ICdXaWxsQm9vc3Rlci9yZXVzYWJsZS13b3JrZmxvd3MvLmdpdGh1Yi93b3JrZmxvd3MvY2xvc2UtY29tbWVudC55bWxAbWFpbicsXG4gICAgICB9LFxuICAgIH0sXG4gIH0sXG59IGFzIGNvbnN0O1xuXG50eXBlIEtub3duS2luZCA9IGtleW9mIHR5cGVvZiB3b3JrZmxvd3MgfCAnZGVwbG95JyB8ICdhdXRvZml4JztcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlV29ya2Zsb3dzKHJvb3RDb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdnZW5lcmF0ZVdvcmtmbG93JywgYXN5bmMgKCkgPT4ge1xuICAgIGlmIChpc1JldXNhYmxlV29ya2Zsb3dzUmVwbyhyb290Q29uZmlnLnJlcG9zaXRvcnkpKSB7XG4gICAgICAvLyBEb24ndCB0b3VjaCByZXVzYWJsZS13b3JrZmxvd3MgcmVwbyBiZWNhdXNlIGl0IGhvc3RzIHVwc3RyZWFtIHdvcmtmbG93IGRlZmluaXRpb25zLlxuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHdvcmtmbG93c1BhdGggPSBwYXRoLnJlc29sdmUocm9vdENvbmZpZy5kaXJQYXRoLCAnLmdpdGh1YicsICd3b3JrZmxvd3MnKTtcbiAgICBhd2FpdCBmcy5wcm9taXNlcy5ta2Rpcih3b3JrZmxvd3NQYXRoLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcblxuICAgIC8vIFJlbW92ZSBjb25maWcgb2Ygc2VtYW50aWMgcHVsbCByZXF1ZXN0XG4gICAgY29uc3Qgc2VtYW50aWNZbWxQYXRoID0gcGF0aC5yZXNvbHZlKHJvb3RDb25maWcuZGlyUGF0aCwgJy5naXRodWInLCAnc2VtYW50aWMueW1sJyk7XG4gICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzLnByb21pc2VzLnJtKHNlbWFudGljWW1sUGF0aCwgeyBmb3JjZTogdHJ1ZSwgcmVjdXJzaXZlOiB0cnVlIH0pKTtcblxuICAgIGNvbnN0IGVudHJpZXMgPSBhd2FpdCBmcy5wcm9taXNlcy5yZWFkZGlyKHdvcmtmbG93c1BhdGgsIHsgd2l0aEZpbGVUeXBlczogdHJ1ZSB9KTtcbiAgICBmb3IgKGNvbnN0IGVudHJ5IG9mIGVudHJpZXMpIHtcbiAgICAgIGlmICghZW50cnkuaXNGaWxlKCkgfHwgIWlzT2Jzb2xldGVHZW5QcldvcmtmbG93RmlsZU5hbWUoZW50cnkubmFtZSkpIGNvbnRpbnVlO1xuICAgICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzLnByb21pc2VzLnJtKHBhdGguam9pbih3b3JrZmxvd3NQYXRoLCBlbnRyeS5uYW1lKSwgeyBmb3JjZTogdHJ1ZSB9KSk7XG4gICAgfVxuICAgIGNvbnN0IGZpbGVOYW1lU2V0ID0gbmV3IFNldChbXG4gICAgICAndGVzdC55bWwnLFxuICAgICAgJ2F1dG9maXgueW1sJyxcbiAgICAgICdzZW1hbnRpYy1wci55bWwnLFxuICAgICAgJ2Nsb3NlLWNvbW1lbnQueW1sJyxcbiAgICAgIC4uLmVudHJpZXNcbiAgICAgICAgLmZpbHRlcihcbiAgICAgICAgICAoZGlyZW50KSA9PiBkaXJlbnQuaXNGaWxlKCkgJiYgZGlyZW50Lm5hbWUuZW5kc1dpdGgoJy55bWwnKSAmJiAhaXNPYnNvbGV0ZUdlblByV29ya2Zsb3dGaWxlTmFtZShkaXJlbnQubmFtZSlcbiAgICAgICAgKVxuICAgICAgICAubWFwKChkaXJlbnQpID0+IGRpcmVudC5uYW1lKSxcbiAgICBdKTtcbiAgICBpZiAocm9vdENvbmZpZy5kZXBlbmRpbmcuc2VtYW50aWNSZWxlYXNlKSB7XG4gICAgICBmaWxlTmFtZVNldC5hZGQoJ3JlbGVhc2UueW1sJyk7XG4gICAgfVxuXG4gICAgZm9yIChjb25zdCBmaWxlTmFtZSBvZiBmaWxlTmFtZVNldCkge1xuICAgICAgLy8g5a6f6Zqb44GvS25vd25LaW5k5Lul5aSW44Gu5YCk44KC5Luj5YWl44GV44KM44KL44GT44Go44Gr5rOo5oSPXG4gICAgICBjb25zdCBraW5kID0gcGF0aC5iYXNlbmFtZShmaWxlTmFtZSwgJy55bWwnKSBhcyBLbm93bktpbmQ7XG4gICAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT4gd3JpdGVXb3JrZmxvd1lhbWwocm9vdENvbmZpZywgd29ya2Zsb3dzUGF0aCwga2luZCkpO1xuICAgIH1cbiAgfSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc1JldXNhYmxlV29ya2Zsb3dzUmVwbyhyZXBvc2l0b3J5Pzogc3RyaW5nKTogYm9vbGVhbiB7XG4gIHJldHVybiByZXBvc2l0b3J5Py5lbmRzV2l0aCgnL3JldXNhYmxlLXdvcmtmbG93cycpID8/IGZhbHNlO1xufVxuXG5mdW5jdGlvbiBpc09ic29sZXRlR2VuUHJXb3JrZmxvd0ZpbGVOYW1lKGZpbGVOYW1lOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgcmV0dXJuIC9eZ2VuLXByKD86LS4rKT9cXC55YT9tbCQvdS50ZXN0KGZpbGVOYW1lKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gd3JpdGVXb3JrZmxvd1lhbWwoY29uZmlnOiBQYWNrYWdlQ29uZmlnLCB3b3JrZmxvd3NQYXRoOiBzdHJpbmcsIGtpbmQ6IEtub3duS2luZCk6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBmaWxlUGF0aCA9IHBhdGguam9pbih3b3JrZmxvd3NQYXRoLCBgJHtraW5kfS55bWxgKTtcbiAgY29uc3QgZGVwbG95UHJvZHVjdGlvbldvcmtmbG93RXhpc3RzID0gZnMuZXhpc3RzU3luYyhwYXRoLmpvaW4od29ya2Zsb3dzUGF0aCwgJ2RlcGxveS1wcm9kdWN0aW9uLnltbCcpKTtcblxuICBpZiAoa2luZCA9PT0gJ2F1dG9maXgnKSB7XG4gICAgYXdhaXQgd3JpdGVZYW1sKGdlbmVyYXRlQXV0b2ZpeFdvcmtmbG93KGNvbmZpZyksIGZpbGVQYXRoKTtcbiAgICByZXR1cm47XG4gIH1cblxuICBsZXQgbmV3U2V0dGluZ3MgPSBzdHJ1Y3R1cmVkQ2xvbmUoa2luZCBpbiB3b3JrZmxvd3MgPyB3b3JrZmxvd3Nba2luZCBhcyBrZXlvZiB0eXBlb2Ygd29ya2Zsb3dzXSA6IHt9KSBhcyBXb3JrZmxvdztcblxuICB0cnkge1xuICAgIGNvbnN0IG9sZENvbnRlbnQgPSBhd2FpdCBmcy5wcm9taXNlcy5yZWFkRmlsZShmaWxlUGF0aCwgJ3V0ZjgnKTtcbiAgICBjb25zdCBvbGRTZXR0aW5ncyA9IHlhbWwubG9hZChvbGRDb250ZW50KSBhcyBXb3JrZmxvdztcbiAgICBuZXdTZXR0aW5ncyA9IG1lcmdlLmFsbChbbmV3U2V0dGluZ3MsIG9sZFNldHRpbmdzLCBuZXdTZXR0aW5nc10sIHsgYXJyYXlNZXJnZTogY29tYmluZU1lcmdlIH0pIGFzIFdvcmtmbG93O1xuICB9IGNhdGNoIHtcbiAgICAvLyBkbyBub3RoaW5nXG4gIH1cblxuICAvLyBTa2lwIGEgYnJva2VuIHdvcmtmbG93XG4gIGlmICghKCdqb2JzJyBpbiBuZXdTZXR0aW5ncykpIHJldHVybjtcblxuICBpZiAoa2luZC5zdGFydHNXaXRoKCdkZXBsb3knKSkge1xuICAgIG5ld1NldHRpbmdzID0ge1xuICAgICAgLi4ubmV3U2V0dGluZ3MsXG4gICAgICBjb25jdXJyZW5jeToge1xuICAgICAgICBncm91cDogJyR7eyBnaXRodWIud29ya2Zsb3cgfX0nLFxuICAgICAgICAnY2FuY2VsLWluLXByb2dyZXNzJzogZmFsc2UsXG4gICAgICB9LFxuICAgIH07XG4gICAgLy8gTW92ZSBqb2JzIHRvIHRoZSBib3R0b21cbiAgICBtb3ZlVG9Cb3R0b20obmV3U2V0dGluZ3MsICdqb2JzJyk7XG4gICAgaWYgKG5ld1NldHRpbmdzLm9uPy5wdXNoKSB7XG4gICAgICBuZXdTZXR0aW5ncy5vbi5wdXNoWydwYXRocy1pZ25vcmUnXSA9IFtcbiAgICAgICAgLi4ubmV3IFNldChbJyoqLm1kJywgJyoqL2RvY3MvKionLCAuLi4obmV3U2V0dGluZ3Mub24ucHVzaFsncGF0aHMtaWdub3JlJ10gPz8gW10pXSksXG4gICAgICBdO1xuICAgIH1cbiAgfVxuXG4gIGlmIChraW5kID09PSAncmVsZWFzZScgJiYgbmV3U2V0dGluZ3Muam9icy5yZWxlYXNlICYmIGRlcGxveVByb2R1Y3Rpb25Xb3JrZmxvd0V4aXN0cykge1xuICAgIG5ld1NldHRpbmdzLnBlcm1pc3Npb25zID8/PSB7fTtcbiAgICBuZXdTZXR0aW5ncy5wZXJtaXNzaW9ucy5hY3Rpb25zID0gJ3dyaXRlJztcbiAgICBuZXdTZXR0aW5ncy5qb2JzLnJlbGVhc2Uud2l0aCA/Pz0ge307XG4gICAgbmV3U2V0dGluZ3Muam9icy5yZWxlYXNlLndpdGgudHJpZ2dlcl9kZXBsb3lfd29ya2Zsb3cgPSAnZGVwbG95LXByb2R1Y3Rpb24ueW1sJztcbiAgfVxuXG4gIGxldCBpc1JldXNhYmxlV29ya2Zsb3cgPSBmYWxzZTtcbiAgZm9yIChjb25zdCBqb2Igb2YgT2JqZWN0LnZhbHVlcyhuZXdTZXR0aW5ncy5qb2JzKSkge1xuICAgIC8vIElnbm9yZSBub24tcmV1c2FibGUgd29ya2Zsb3dzXG4gICAgaWYgKCFqb2IudXNlcz8uaW5jbHVkZXMoJy9yZXVzYWJsZS13b3JrZmxvd3MvJykpIGNvbnRpbnVlO1xuXG4gICAgbm9ybWFsaXplSm9iKGNvbmZpZywgam9iLCBraW5kKTtcbiAgICBpc1JldXNhYmxlV29ya2Zsb3cgPSB0cnVlO1xuICB9XG4gIGlmICghaXNSZXVzYWJsZVdvcmtmbG93KSByZXR1cm47XG5cbiAgc3dpdGNoIChraW5kKSB7XG4gICAgY2FzZSAncmVsZWFzZSc6IHtcbiAgICAgIGlmIChuZXdTZXR0aW5ncy5vbj8uc2NoZWR1bGUpIHtcbiAgICAgICAgZGVsZXRlIG5ld1NldHRpbmdzLm9uLnB1c2g7XG4gICAgICB9IGVsc2UgaWYgKG5ld1NldHRpbmdzLm9uPy5wdXNoICYmIGNvbmZpZy5yZWxlYXNlLmJyYW5jaGVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgbmV3U2V0dGluZ3Mub24ucHVzaC5icmFuY2hlcyA9IGNvbmZpZy5yZWxlYXNlLmJyYW5jaGVzO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gRG9uJ3QgdXNlIHJlbGVhc2UueW1sIGlmIHJlbGVhc2UgYnJhbmNoIGlzIG5vdCBzcGVjaWZpZWRcbiAgICAgICAgYXdhaXQgZnMucHJvbWlzZXMucm0ocGF0aC5qb2luKHdvcmtmbG93c1BhdGgsICdyZWxlYXNlLnltbCcpLCB7IGZvcmNlOiB0cnVlIH0pO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBpZiAoY29uZmlnLmlzUHVibGljUmVwbykge1xuICAgICAgICBuZXdTZXR0aW5ncy5wZXJtaXNzaW9ucyA/Pz0ge307XG4gICAgICAgIG5ld1NldHRpbmdzLnBlcm1pc3Npb25zWydpZC10b2tlbiddID0gJ3dyaXRlJztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGRlbGV0ZSBuZXdTZXR0aW5ncy5wZXJtaXNzaW9ucz8uWydpZC10b2tlbiddO1xuICAgICAgfVxuICAgICAgYnJlYWs7XG4gICAgfVxuICAgIGNhc2UgJ3Rlc3QnOiB7XG4gICAgICAvLyBEb24ndCB1c2UgYHBhdGhzLWlnbm9yZWAgZm9yIHRlc3QgYmVjYXVzZSBHaXRIdWIncyBCcmFuY2ggUHJvdGVjdGlvbiBhbmQgUnVsZXNldHMgcmVxdWlyZSBqb2IgcnVubmluZy5cbiAgICAgIGlmIChuZXdTZXR0aW5ncy5vbj8ucHVsbF9yZXF1ZXN0KSB7XG4gICAgICAgIGRlbGV0ZSBuZXdTZXR0aW5ncy5vbi5wdWxsX3JlcXVlc3RbJ3BhdGhzLWlnbm9yZSddO1xuICAgICAgfVxuICAgICAgaWYgKG5ld1NldHRpbmdzLm9uPy5wdXNoKSB7XG4gICAgICAgIGRlbGV0ZSBuZXdTZXR0aW5ncy5vbi5wdXNoWydwYXRocy1pZ25vcmUnXTtcbiAgICAgICAgbmV3U2V0dGluZ3Mub24ucHVzaC5icmFuY2hlcyA9IG5ld1NldHRpbmdzLm9uLnB1c2guYnJhbmNoZXMuZmlsdGVyKChicmFuY2gpID0+IGJyYW5jaCAhPT0gJ3Jlbm92YXRlLyoqJyk7XG4gICAgICB9XG4gICAgICBicmVhaztcbiAgICB9XG4gICAgLy8gTm8gZGVmYXVsdFxuICB9XG4gIGF3YWl0IHdyaXRlWWFtbChuZXdTZXR0aW5ncywgZmlsZVBhdGgpO1xuXG4gIGlmIChraW5kID09PSAnc3luYycpIHtcbiAgICBhd2FpdCBmcy5wcm9taXNlcy5ybShwYXRoLmpvaW4od29ya2Zsb3dzUGF0aCwgJ3N5bmMtaW5pdC55bWwnKSwgeyBmb3JjZTogdHJ1ZSB9KTtcbiAgICBpZiAoIW5ld1NldHRpbmdzLmpvYnMuc3luYz8ud2l0aCkgcmV0dXJuO1xuXG4gICAgLy8gR2VuZXJhdGUgc3luYy1mb3JjZS55bWwgYmFzZWQgb24gc3luYy55bWwgaWYgaXQgZXhpc3RzLlxuICAgIG5ld1NldHRpbmdzLmpvYnNbJ3N5bmMtZm9yY2UnXSA9IG5ld1NldHRpbmdzLmpvYnMuc3luYztcbiAgICBjb25zdCBwYXJhbXMgPSBuZXdTZXR0aW5ncy5qb2JzLnN5bmMud2l0aC5zeW5jX3BhcmFtc193aXRob3V0X2Rlc3Q7XG4gICAgaWYgKHR5cGVvZiBwYXJhbXMgIT09ICdzdHJpbmcnKSByZXR1cm47XG5cbiAgICBuZXdTZXR0aW5ncy5qb2JzLnN5bmMud2l0aC5zeW5jX3BhcmFtc193aXRob3V0X2Rlc3QgPSBgLS1mb3JjZSAke3BhcmFtc31gO1xuICAgIG5ld1NldHRpbmdzLm5hbWUgPSAnRm9yY2UgdG8gU3luYyc7XG4gICAgbmV3U2V0dGluZ3Mub24gPSB7IHdvcmtmbG93X2Rpc3BhdGNoOiBudWxsIH07XG4gICAgZGVsZXRlIG5ld1NldHRpbmdzLmpvYnMuc3luYztcbiAgICBhd2FpdCB3cml0ZVlhbWwobmV3U2V0dGluZ3MsIHBhdGguam9pbih3b3JrZmxvd3NQYXRoLCAnc3luYy1mb3JjZS55bWwnKSk7XG4gIH1cbn1cblxuZnVuY3Rpb24gbm9ybWFsaXplSm9iKGNvbmZpZzogUGFja2FnZUNvbmZpZywgam9iOiBKb2IsIGtpbmQ6IEtub3duS2luZCk6IHZvaWQge1xuICBqb2Iud2l0aCA/Pz0ge307XG4gIGpvYi5zZWNyZXRzID8/PSB7fTtcbiAgLy8gVXNlIHRydXN0ZWQgcHVibGlzaGluZyBpbnN0ZWFkIG9mIE5QTV9UT0tFTlxuICBkZWxldGUgam9iLnNlY3JldHMuTlBNX1RPS0VOO1xuXG4gIGlmIChraW5kID09PSAndGVzdCcgfHwga2luZCA9PT0gJ3JlbGVhc2UnKSB7XG4gICAgam9iLnNlY3JldHMuR0hfVE9LRU4gPSAnJHt7IHNlY3JldHMuR0lUSFVCX1RPS0VOIH19JztcbiAgfVxuXG4gIGlmIChqb2Iuc2VjcmV0cy5GSVJFQkFTRV9UT0tFTikge1xuICAgIGpvYi5zZWNyZXRzLkdDUF9TQV9LRVlfSlNPTl9GT1JfRklSRUJBU0UgPSAnJHt7IHNlY3JldHMuR0NQX1NBX0tFWV9KU09OX0ZPUl9GSVJFQkFTRSB9fSc7XG4gICAgZGVsZXRlIGpvYi5zZWNyZXRzLkZJUkVCQVNFX1RPS0VOO1xuICB9XG4gIGlmIChcbiAgICAoam9iLnNlY3JldHMuRElTQ09SRF9XRUJIT09LX1VSTCAmJiAoa2luZCA9PT0gJ3JlbGVhc2UnIHx8IGtpbmQuc3RhcnRzV2l0aCgnZGVwbG95JykpKSB8fFxuICAgIChqb2Iud2l0aC5zZXJ2ZXJfdXJsICYmIGtpbmQuc3RhcnRzV2l0aCgnZGVwbG95JykpXG4gICkge1xuICAgIGpvYi5zZWNyZXRzLkRJU0NPUkRfV0VCSE9PS19VUkwgPSAnJHt7IHNlY3JldHMuRElTQ09SRF9XRUJIT09LX1VSTF9GT1JfUkVMRUFTRSB9fSc7XG4gIH1cblxuICBpZiAoa2luZCA9PT0gJ3N5bmMnKSB7XG4gICAgY29uc3QgcGFyYW1zID0gam9iLndpdGguc3luY19wYXJhbXNfd2l0aG91dF9kZXN0O1xuICAgIGlmICh0eXBlb2YgcGFyYW1zID09PSAnc3RyaW5nJykge1xuICAgICAgam9iLndpdGguc3luY19wYXJhbXNfd2l0aG91dF9kZXN0ID0gcGFyYW1zLnJlcGxhY2UoJ3N5bmMgJywgJycpO1xuICAgIH1cbiAgfVxuXG4gIGlmIChjb25maWcucmVwb3NpdG9yeT8uc3RhcnRzV2l0aCgnZ2l0aHViOldpbGxCb29zdGVyLycpKSB7XG4gICAgam9iLnVzZXMgPSBqb2IudXNlcz8ucmVwbGFjZSgnV2lsbEJvb3N0ZXJMYWIvJywgJ1dpbGxCb29zdGVyLycpO1xuICB9IGVsc2UgaWYgKGNvbmZpZy5yZXBvc2l0b3J5Py5zdGFydHNXaXRoKCdnaXRodWI6V2lsbEJvb3N0ZXJMYWIvJykpIHtcbiAgICBqb2IudXNlcyA9IGpvYi51c2VzPy5yZXBsYWNlKCdXaWxsQm9vc3Rlci8nLCAnV2lsbEJvb3N0ZXJMYWIvJyk7XG4gIH1cblxuICAvLyBSZW1vdmUgcmVkdW5kYW50IHBhcmFtZXRlcnNcbiAgaWYgKGpvYi53aXRoLmRvdF9lbnZfcGF0aCA9PT0gJy5lbnYnKSB7XG4gICAgZGVsZXRlIGpvYi53aXRoLmRvdF9lbnZfcGF0aDtcbiAgfVxuXG4gIC8vIERvbid0IHVzZSBgZmx5IGRlcGxveSAtLWpzb25gIHNpbmNlIGl0IGNhdXNlcyBhbiBlcnJvclxuICBpZiAoa2luZC5zdGFydHNXaXRoKCdkZXBsb3knKSAmJiBqb2Iuc2VjcmV0cy5GTFlfQVBJX1RPS0VOICYmIHR5cGVvZiBqb2Iud2l0aC5kZXBsb3lfY29tbWFuZCA9PT0gJ3N0cmluZycpIHtcbiAgICBqb2Iud2l0aC5kZXBsb3lfY29tbWFuZCA9IGpvYi53aXRoLmRlcGxveV9jb21tYW5kLnJlcGxhY2UoL1xccystLWpzb24vLCAnJyk7XG4gIH1cbiAgaWYgKGNvbmZpZy5kb2VzQ29udGFpbkRvY2tlcmZpbGUgJiYgIWpvYi53aXRoLmNpX2xhYmVsICYmIGtpbmQuc3RhcnRzV2l0aCgndGVzdCcpKSB7XG4gICAgam9iLndpdGguY2lfbGFiZWwgPSAnbGFyZ2UnO1xuICB9XG4gIC8vIEJlY2F1c2UgZ2l0aHViLmV2ZW50LnJlcG9zaXRvcnkucHJpdmF0ZSBpcyBhbHdheXMgdHJ1ZSBpZiBqb2IgaXMgc2NoZWR1bGVkXG4gIGlmIChraW5kID09PSAncmVsZWFzZScgfHwga2luZCA9PT0gJ3Rlc3QnIHx8IGtpbmQuc3RhcnRzV2l0aCgnZGVwbG95JykpIHtcbiAgICBpZiAoY29uZmlnLmlzUHVibGljUmVwbykge1xuICAgICAgam9iLndpdGguZ2l0aHViX2hvc3RlZF9ydW5uZXIgPSB0cnVlO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBkZWxldGUgam9iLndpdGguZ2l0aHViX2hvc3RlZF9ydW5uZXI7XG4gIH1cblxuICBpZiAoT2JqZWN0LmtleXMoam9iLndpdGgpLmxlbmd0aCA+IDApIHtcbiAgICBzb3J0S2V5cyhqb2Iud2l0aCk7XG4gIH0gZWxzZSB7XG4gICAgZGVsZXRlIGpvYi53aXRoO1xuICB9XG4gIGlmIChPYmplY3Qua2V5cyhqb2Iuc2VjcmV0cykubGVuZ3RoID4gMCkge1xuICAgIC8vIE1vdmUgc2VjcmV0cyBwcm9wIGFmdGVyIHdpdGggcHJvcFxuICAgIGNvbnN0IG5ld1NlY3JldHMgPSBzb3J0S2V5cyhqb2Iuc2VjcmV0cyk7XG4gICAgZGVsZXRlIGpvYi5zZWNyZXRzO1xuICAgIGpvYi5zZWNyZXRzID0gbmV3U2VjcmV0cztcbiAgfSBlbHNlIHtcbiAgICBkZWxldGUgam9iLnNlY3JldHM7XG4gIH1cbn1cblxuZnVuY3Rpb24gZ2VuZXJhdGVBdXRvZml4V29ya2Zsb3coY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogV29ya2Zsb3cge1xuICBpZiAoIWNvbmZpZy5pc1B1YmxpY1JlcG8pIHtcbiAgICByZXR1cm4gc3RydWN0dXJlZENsb25lKHByaXZhdGVSZXBvQXV0b2ZpeFdvcmtmbG93KTtcbiAgfVxuXG4gIGNvbnN0IHBhY2thZ2VNYW5hZ2VyID0gY29uZmlnLmlzQnVuID8gJ2J1bicgOiAneWFybic7XG4gIGNvbnN0IHN0ZXBzOiBTdGVwW10gPSBbXG4gICAgeyB1c2VzOiAnYWN0aW9ucy9jaGVja291dEB2NicgfSxcbiAgICB7IHVzZXM6ICdhY3Rpb25zL3NldHVwLW5vZGVAdjYnLCB3aXRoOiB7ICdjaGVjay1sYXRlc3QnOiB0cnVlLCAnbm9kZS12ZXJzaW9uJzogJ2x0cy8qJyB9IH0sXG4gICAgLi4uKGNvbmZpZy5pc0J1biA/IFt7IHVzZXM6ICdvdmVuLXNoL3NldHVwLWJ1bkB2MicsIHdpdGg6IHsgJ2J1bi12ZXJzaW9uJzogJ2xhdGVzdCcgfSB9XSA6IFtdKSxcbiAgICB7IHJ1bjogYCR7cGFja2FnZU1hbmFnZXJ9IGluc3RhbGxgIH0sXG4gICAgeyBydW46IGAke3BhY2thZ2VNYW5hZ2VyfSBydW4gY2xlYW51cGAgfSxcbiAgXTtcbiAgaWYgKGNvbmZpZy5wYWNrYWdlSnNvbj8uc2NyaXB0cz8uYnVpbGQpIHtcbiAgICBzdGVwcy5wdXNoKHsgcnVuOiBgJHtwYWNrYWdlTWFuYWdlcn0gcnVuIGJ1aWxkYCB9KTtcbiAgfVxuICBzdGVwcy5wdXNoKHsgdXNlczogJ2F1dG9maXgtY2kvYWN0aW9uQHYxJyB9KTtcblxuICBjb25zdCBhdXRvZml4V29ya2Zsb3cgPSBzdHJ1Y3R1cmVkQ2xvbmUocHVibGljUmVwb0F1dG9maXhXb3JrZmxvdyk7XG4gIGNvbnN0IGF1dG9maXhKb2IgPSBhdXRvZml4V29ya2Zsb3cuam9icy5hdXRvZml4ID8/IHsgJ3J1bnMtb24nOiAndWJ1bnR1LWxhdGVzdCcgfTtcbiAgYXV0b2ZpeFdvcmtmbG93LmpvYnMuYXV0b2ZpeCA9IHsgLi4uYXV0b2ZpeEpvYiwgc3RlcHMgfTtcbiAgcmV0dXJuIGF1dG9maXhXb3JrZmxvdztcbn1cblxuYXN5bmMgZnVuY3Rpb24gd3JpdGVZYW1sKG5ld1NldHRpbmdzOiBXb3JrZmxvdywgZmlsZVBhdGg6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCB5YW1sVGV4dCA9IHJlbW92ZVRyYWlsaW5nU3BhY2VzKFxuICAgIHlhbWwuZHVtcChuZXdTZXR0aW5ncywgeyBsaW5lV2lkdGg6IC0xLCBub0NvbXBhdE1vZGU6IHRydWUsIHN0eWxlczogeyAnISFudWxsJzogJ2VtcHR5JyB9IH0pXG4gICk7XG4gIGF3YWl0IGZzLnByb21pc2VzLndyaXRlRmlsZShmaWxlUGF0aCwgeWFtbFRleHQpO1xufVxuXG5mdW5jdGlvbiByZW1vdmVUcmFpbGluZ1NwYWNlcyh0ZXh0OiBzdHJpbmcpOiBzdHJpbmcge1xuICAvLyBqcy15YW1sIGVtaXRzIHZhbHVlbGVzcyBHaXRIdWIgQWN0aW9ucyBldmVudHMgYXMgYGV2ZW50OiBgIHdoZW4gdXNpbmcgdGhlIGVtcHR5IG51bGwgc3R5bGUuXG4gIHJldHVybiB0ZXh0LnJlcGxhY2VBbGwoL1sgXFx0XSskL2dtLCAnJyk7XG59XG4iLCJpbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgZmcgZnJvbSAnZmFzdC1nbG9iJztcblxuaW1wb3J0IHsgaXNSZXVzYWJsZVdvcmtmbG93c1JlcG8gfSBmcm9tICcuLi9nZW5lcmF0b3JzL3dvcmtmbG93LmpzJztcbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgeyBvcHRpb25zIH0gZnJvbSAnLi4vb3B0aW9ucy5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGZzVXRpbCB9IGZyb20gJy4uL3V0aWxzL2ZzVXRpbC5qcyc7XG5pbXBvcnQgeyBnbG9iSWdub3JlIH0gZnJvbSAnLi4vdXRpbHMvZ2xvYlV0aWwuanMnO1xuaW1wb3J0IHsgcHJvbWlzZVBvb2wgfSBmcm9tICcuLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBmaXhUeXBvcyhwYWNrYWdlQ29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZml4VHlwb3MnLCBhc3luYyAoKSA9PiB7XG4gICAgaWYgKGlzUmV1c2FibGVXb3JrZmxvd3NSZXBvKHBhY2thZ2VDb25maWcucmVwb3NpdG9yeSkpIHJldHVybjtcblxuICAgIGNvbnN0IGRpclBhdGggPSBwYWNrYWdlQ29uZmlnLmRpclBhdGg7XG4gICAgY29uc3QgZG9jRmlsZXMgPSBhd2FpdCBmZy5nbG9iKCcqKi8qLm1kJywgeyBkb3Q6IHRydWUsIGN3ZDogZGlyUGF0aCwgaWdub3JlOiBnbG9iSWdub3JlIH0pO1xuICAgIGlmIChvcHRpb25zLmlzVmVyYm9zZSkge1xuICAgICAgY29uc29sZS5pbmZvKGBGb3VuZCAke2RvY0ZpbGVzLmxlbmd0aH0gbWFya2Rvd24gZmlsZXMgaW4gJHtkaXJQYXRofWApO1xuICAgIH1cbiAgICBmb3IgKGNvbnN0IG1kRmlsZSBvZiBkb2NGaWxlcykge1xuICAgICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLmpvaW4oZGlyUGF0aCwgbWRGaWxlKTtcbiAgICAgIHZvaWQgcHJvbWlzZVBvb2wucnVuKGFzeW5jICgpID0+IHtcbiAgICAgICAgY29uc3QgY29udGVudCA9IGF3YWl0IGZzVXRpbC5yZWFkRmlsZUlnbm9yaW5nRXJyb3IoZmlsZVBhdGgpO1xuICAgICAgICBpZiAoY29udGVudCA9PT0gdW5kZWZpbmVkKSByZXR1cm47XG4gICAgICAgIGxldCBuZXdDb250ZW50ID0gZml4VHlwb3NJblRleHQoY29udGVudCk7XG4gICAgICAgIG5ld0NvbnRlbnQgPSByZXBsYWNlV2l0aENvbmZpZyhuZXdDb250ZW50LCBwYWNrYWdlQ29uZmlnLCAnZG9jJyk7XG4gICAgICAgIGlmIChjb250ZW50ICE9PSBuZXdDb250ZW50KSB7XG4gICAgICAgICAgYXdhaXQgZnNVdGlsLmdlbmVyYXRlRmlsZShmaWxlUGF0aCwgbmV3Q29udGVudCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGNvbnN0IHRzRmlsZXMgPSBhd2FpdCBmZy5nbG9iKFxuICAgICAgW1xuICAgICAgICAne2FwcCxzcmMsdGVzdCxzY3JpcHRzfS8qKi8qLntjanMsbWpzLGpzLGpzeCxjdHMsbXRzLHRzLHRzeH0nLFxuICAgICAgICAncGFja2FnZXMvKiove2FwcCxzcmMsdGVzdCxzY3JpcHRzfS8qKi8qLntjanMsbWpzLGpzLGpzeCxjdHMsbXRzLHRzLHRzeH0nLFxuICAgICAgXSxcbiAgICAgIHsgZG90OiB0cnVlLCBjd2Q6IGRpclBhdGgsIGlnbm9yZTogZ2xvYklnbm9yZSB9XG4gICAgKTtcbiAgICBpZiAob3B0aW9ucy5pc1ZlcmJvc2UpIHtcbiAgICAgIGNvbnNvbGUuaW5mbyhgRm91bmQgJHt0c0ZpbGVzLmxlbmd0aH0gVHlwZVNjcmlwdCBmaWxlcyBpbiAke2RpclBhdGh9YCk7XG4gICAgfVxuICAgIGZvciAoY29uc3QgdHNGaWxlIG9mIHRzRmlsZXMpIHtcbiAgICAgIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5qb2luKGRpclBhdGgsIHRzRmlsZSk7XG4gICAgICB2b2lkIHByb21pc2VQb29sLnJ1bihhc3luYyAoKSA9PiB7XG4gICAgICAgIGNvbnN0IG9sZENvbnRlbnQgPSBhd2FpdCBmc1V0aWwucmVhZEZpbGVJZ25vcmluZ0Vycm9yKGZpbGVQYXRoKTtcbiAgICAgICAgaWYgKG9sZENvbnRlbnQgPT09IHVuZGVmaW5lZCkgcmV0dXJuO1xuICAgICAgICBsZXQgbmV3Q29udGVudCA9IGZpeFR5cG9zSW5Db2RlKG9sZENvbnRlbnQpO1xuICAgICAgICBuZXdDb250ZW50ID0gcmVwbGFjZVdpdGhDb25maWcobmV3Q29udGVudCwgcGFja2FnZUNvbmZpZywgJ3RzJyk7XG5cbiAgICAgICAgaWYgKG9sZENvbnRlbnQgIT09IG5ld0NvbnRlbnQpIHtcbiAgICAgICAgICBhd2FpdCBmc1V0aWwuZ2VuZXJhdGVGaWxlKGZpbGVQYXRoLCBuZXdDb250ZW50KTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgY29uc3QgdGV4dEJhc2VkRmlsZXMgPSBhd2FpdCBmZy5nbG9iKCcqKi8qLntjc3YsaHRtLGh0bWwsdHN2LHhtbCx5YW1sLHltbH0nLCB7XG4gICAgICBkb3Q6IHRydWUsXG4gICAgICBjd2Q6IGRpclBhdGgsXG4gICAgICBpZ25vcmU6IGdsb2JJZ25vcmUsXG4gICAgfSk7XG4gICAgaWYgKG9wdGlvbnMuaXNWZXJib3NlKSB7XG4gICAgICBjb25zb2xlLmluZm8oYEZvdW5kICR7dGV4dEJhc2VkRmlsZXMubGVuZ3RofSB0ZXh0LWJhc2VkIGZpbGVzIGluICR7ZGlyUGF0aH1gKTtcbiAgICB9XG4gICAgZm9yIChjb25zdCBmaWxlIG9mIHRleHRCYXNlZEZpbGVzKSB7XG4gICAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGguam9pbihkaXJQYXRoLCBmaWxlKTtcbiAgICAgIHZvaWQgcHJvbWlzZVBvb2wucnVuKGFzeW5jICgpID0+IHtcbiAgICAgICAgY29uc3Qgb2xkQ29udGVudCA9IGF3YWl0IGZzVXRpbC5yZWFkRmlsZUlnbm9yaW5nRXJyb3IoZmlsZVBhdGgpO1xuICAgICAgICBpZiAob2xkQ29udGVudCA9PT0gdW5kZWZpbmVkKSByZXR1cm47XG4gICAgICAgIGxldCBuZXdDb250ZW50ID0gZml4VHlwb3NJblRleHQob2xkQ29udGVudCk7XG4gICAgICAgIG5ld0NvbnRlbnQgPSByZXBsYWNlV2l0aENvbmZpZyhuZXdDb250ZW50LCBwYWNrYWdlQ29uZmlnLCAndGV4dCcpO1xuXG4gICAgICAgIGlmIChvbGRDb250ZW50ICE9PSBuZXdDb250ZW50KSB7XG4gICAgICAgICAgYXdhaXQgZnNVdGlsLmdlbmVyYXRlRmlsZShmaWxlUGF0aCwgbmV3Q29udGVudCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGF3YWl0IHByb21pc2VQb29sLnByb21pc2VBbGwoKTtcbiAgfSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBmaXhUeXBvc0luVGV4dChjb250ZW50OiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gY29udGVudFxuICAgIC5yZXBsYWNlQWxsKC9cXGJjXFwuZlxcLig/PVxcc3wkKS9nLCAnY2YuJylcbiAgICAucmVwbGFjZUFsbCgvXFxiZWdcXC4oPz1cXHN8JCkvZywgJ2UuZy4nKVxuICAgIC5yZXBsYWNlQWxsKC9cXGJpZVxcLig/PVxccykvZywgJ2kuZS4nKTtcbn1cblxuZnVuY3Rpb24gZml4VHlwb3NJbkNvZGUoY29udGVudDogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIGNvbnRlbnRcbiAgICAucmVwbGFjZUFsbCgvXFwvXFwqW1xcc1xcU10qP1xcKlxcLy9nLCAoY29tbWVudCkgPT4gZml4VHlwb3NJblRleHQoY29tbWVudCkpXG4gICAgLnJlcGxhY2VBbGwoLyhefFxccylcXC9cXC8oLio/KWNcXC5mXFwuL2csICckMS8vJDJjZi4nKVxuICAgIC5yZXBsYWNlQWxsKC8oXnxcXHMpXFwvXFwvKC4qPyllZ1xcLi9nLCAnJDEvLyQyZS5nLicpXG4gICAgLnJlcGxhY2VBbGwoLyhefFxccylcXC9cXC8oLio/KWllXFwuL2csICckMS8vJDJpLmUuJyk7XG59XG5cbmZ1bmN0aW9uIHJlcGxhY2VXaXRoQ29uZmlnKG5ld0NvbnRlbnQ6IHN0cmluZywgcGFja2FnZUNvbmZpZzogUGFja2FnZUNvbmZpZywgcHJvcE5hbWU6ICdkb2MnIHwgJ3RzJyB8ICd0ZXh0Jyk6IHN0cmluZyB7XG4gIGZvciAoY29uc3QgW2JlZm9yZSwgYWZ0ZXJdIG9mIE9iamVjdC5lbnRyaWVzKHBhY2thZ2VDb25maWcud2JmeUpzb24/LnR5cG9zPy5hbGwgPz8ge30pKSB7XG4gICAgbmV3Q29udGVudCA9IG5ld0NvbnRlbnQucmVwbGFjZUFsbChiZWZvcmUsIGFmdGVyKTtcbiAgfVxuICBmb3IgKGNvbnN0IFtiZWZvcmUsIGFmdGVyXSBvZiBPYmplY3QuZW50cmllcyhwYWNrYWdlQ29uZmlnLndiZnlKc29uPy50eXBvcz8uW3Byb3BOYW1lXSA/PyB7fSkpIHtcbiAgICBuZXdDb250ZW50ID0gbmV3Q29udGVudC5yZXBsYWNlQWxsKGJlZm9yZSwgYWZ0ZXIpO1xuICB9XG4gIHJldHVybiBuZXdDb250ZW50O1xufVxuIiwiaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZnNVdGlsIH0gZnJvbSAnLi4vdXRpbHMvZnNVdGlsLmpzJztcbmltcG9ydCB7IGdldFBhY2thZ2VNYW5hZ2VyQ29tbWFuZCB9IGZyb20gJy4uL3V0aWxzL3BhY2thZ2VDYXBhYmlsaXRpZXMuanMnO1xuaW1wb3J0IHsgcHJvbWlzZVBvb2wgfSBmcm9tICcuLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZW5lcmF0ZUFnZW50SW5zdHJ1Y3Rpb25zKHJvb3RDb25maWc6IFBhY2thZ2VDb25maWcsIGFsbENvbmZpZ3M6IFBhY2thZ2VDb25maWdbXSk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2dlbmVyYXRlQWdlbnRJbnN0cnVjdGlvbnMnLCBhc3luYyAoKSA9PiB7XG4gICAgaWYgKCFyb290Q29uZmlnLmlzUm9vdCkgcmV0dXJuO1xuXG4gICAgLy8gQ2hlY2sgaWYgQUdFTlRTX0VYVFJBLm1kIGV4aXN0cyBhbmQgcmVhZCBpdHMgY29udGVudFxuICAgIGNvbnN0IGFnZW50c0V4dHJhUGF0aCA9IHBhdGgucmVzb2x2ZShyb290Q29uZmlnLmRpclBhdGgsICdBR0VOVFNfRVhUUkEubWQnKTtcbiAgICBjb25zdCBleHRyYUNvbnRlbnQgPSBhd2FpdCBmc1V0aWwucmVhZEZpbGVJZ25vcmluZ0Vycm9yKGFnZW50c0V4dHJhUGF0aCk7XG5cbiAgICBmb3IgKGNvbnN0IFtmaWxlTmFtZSwgdG9vbE5hbWVdIG9mIFtcbiAgICAgIFsnQUdFTlRTLm1kJywgJ0NvZGV4IENMSSddLFxuICAgICAgWydDTEFVREUubWQnLCAnQ2xhdWRlIENvZGUnXSxcbiAgICAgIFsnR0VNSU5JLm1kJywgJ0dlbWluaSBDTEknXSxcbiAgICBdIGFzIGNvbnN0KSB7XG4gICAgICBjb25zdCBjb250ZW50ID0gZ2VuZXJhdGVBZ2VudEluc3RydWN0aW9uKHJvb3RDb25maWcsIGFsbENvbmZpZ3MsIHRvb2xOYW1lLCBleHRyYUNvbnRlbnQpO1xuICAgICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLnJlc29sdmUocm9vdENvbmZpZy5kaXJQYXRoLCBmaWxlTmFtZSk7XG4gICAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnNVdGlsLmdlbmVyYXRlRmlsZShmaWxlUGF0aCwgY29udGVudCkpO1xuICAgIH1cblxuICAgIGNvbnN0IGN1cnNvclJ1bGVzUGF0aCA9IHBhdGgucmVzb2x2ZShyb290Q29uZmlnLmRpclBhdGgsICcuY3Vyc29yL3J1bGVzL2dlbmVyYWwubWRjJyk7XG4gICAgY29uc3QgY3Vyc29yUnVsZXNDb250ZW50ID0gZ2VuZXJhdGVDdXJzb3JHZW5lcmFsTWRjQ29udGVudChyb290Q29uZmlnLCBhbGxDb25maWdzLCBleHRyYUNvbnRlbnQpO1xuICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiBmc1V0aWwuZ2VuZXJhdGVGaWxlKGN1cnNvclJ1bGVzUGF0aCwgY3Vyc29yUnVsZXNDb250ZW50KSk7XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBnZW5lcmF0ZUN1cnNvckdlbmVyYWxNZGNDb250ZW50KFxuICBjb25maWc6IFBhY2thZ2VDb25maWcsXG4gIGFsbENvbmZpZ3M6IFBhY2thZ2VDb25maWdbXSxcbiAgZXh0cmFDb250ZW50Pzogc3RyaW5nXG4pOiBzdHJpbmcge1xuICBjb25zdCBmcm9udG1hdHRlciA9IGAtLS1cXG5kZXNjcmlwdGlvbjogR2VuZXJhbCBDb2RpbmcgUnVsZXNcXG5nbG9iczpcXG5hbHdheXNBcHBseTogdHJ1ZVxcbi0tLWA7XG4gIGNvbnN0IGJvZHkgPSBnZW5lcmF0ZUFnZW50SW5zdHJ1Y3Rpb24oY29uZmlnLCBhbGxDb25maWdzLCAnQ3Vyc29yJywgZXh0cmFDb250ZW50KTtcbiAgcmV0dXJuIGAke2Zyb250bWF0dGVyfVxcblxcbiR7Ym9keX1gO1xufVxuXG5mdW5jdGlvbiBnZW5lcmF0ZUFnZW50SW5zdHJ1Y3Rpb24oXG4gIHJvb3RDb25maWc6IFBhY2thZ2VDb25maWcsXG4gIGFsbENvbmZpZ3M6IFBhY2thZ2VDb25maWdbXSxcbiAgdG9vbE5hbWU6IHN0cmluZyxcbiAgZXh0cmFDb250ZW50Pzogc3RyaW5nXG4pOiBzdHJpbmcge1xuICBjb25zdCBwYWNrYWdlTWFuYWdlciA9IGdldFBhY2thZ2VNYW5hZ2VyQ29tbWFuZChyb290Q29uZmlnKTtcbiAgY29uc3QgYmFzZUNvbnRlbnQgPSBgXG4jIyBQcm9qZWN0IEluZm9ybWF0aW9uXG5cbi0gTmFtZTogXFxgJHtyb290Q29uZmlnLnBhY2thZ2VKc29uPy5uYW1lIHx8ICd1bmtub3duJ31cXGBcbi0gRGVzY3JpcHRpb246ICR7cm9vdENvbmZpZy5wYWNrYWdlSnNvbj8uZGVzY3JpcHRpb259XG4tIFBhY2thZ2UgTWFuYWdlcjogJHtwYWNrYWdlTWFuYWdlcn1cblxuIyMgR2VuZXJhbCBJbnN0cnVjdGlvbnNcblxuLSBDcmVhdGUgYSBuZXcgYnJhbmNoIGlmIHRoZSBjdXJyZW50IGJyYW5jaCBpcyBcXGBtYWluXFxgLlxuLSBSdW4gYW55IFxcYGdpdFxcYCBjb21tYW5kcyBzZXF1ZW50aWFsbHkuXG4tIFdyaXRlIHRlc3RzIE9OTFkgaWYgZXhwbGljaXRseSByZXF1ZXN0ZWQuIElmIHJlcXVlc3RlZCwgZm9sbG93IHRoZXNlIHJ1bGVzOlxuICAtIENvbnRpbnVlIG1vZGlmeWluZyB0ZXN0cyBhbmQvb3IgY29kZSB1bnRpbCBhbGwgdGVzdHMgcGFzcy5cbiAgLSBFbnN1cmUgdGVzdHMgYXJlIGlkZW1wb3RlbnQgYW5kIGluZGVwZW5kZW50IChlLmcuLCByZXNldCBwZXJzaXN0ZW50IGRhdGEpIHNvIHRoZXkgY2FuIHJ1biByZXBlYXRlZGx5IG9yIGluIHBhcmFsbGVsLlxuICAtIFByZWZlciBhY3R1YWwgQVBJIGNhbGxzIG92ZXIgbW9ja3MsIHVubGVzcyBhY3R1YWwgY2FsbHMgYXJlIGltcHJhY3RpY2FsLCBoYXZlIHVuaW50ZW5kZWQgc2lkZSBlZmZlY3RzLCBvciBtb2NrcyBhcmUgZXhwbGljaXRseSByZXF1ZXN0ZWQuXG4gIC0gQWx3YXlzIGludmVzdGlnYXRlIHRoZSByb290IGNhdXNlIG9mIGEgdGVzdCBmYWlsdXJlIGJlZm9yZSBmaXhpbmcgaXQuXG4gIC0gQXZvaWQgYWRkaW5nIHdhaXQgZnVuY3Rpb25zIGluIEUyRSB0ZXN0cyB1bmxlc3Mgc3RyaWN0bHkgbmVjZXNzYXJ5LlxuLSBXaGVuIGZpeGluZyBpc3N1ZXMsIGZvbGxvdyB0aGVzZSBydWxlczpcbiAgLSBJbnZlc3RpZ2F0ZSB0aGUgcm9vdCBjYXVzZSBmaXJzdCAoZS5nLiwgYnkgZ2F0aGVyaW5nIGRlYnVnIGxvZ3MsIHRha2luZyBzY3JlZW5zaG90cywgZXRjLikuXG4gIC0gRml4IHRoZSBhY3R1YWwgcm9vdCBjYXVzZSBpbnN0ZWFkIG9mIGFwcGx5aW5nIHdvcmthcm91bmRzLlxuLSBBZnRlciBtYWtpbmcgY29kZSBjaGFuZ2VzLCBydW4gXFxgJHtwYWNrYWdlTWFuYWdlcn0gdmVyaWZ5LWZ1bGxcXGAgdG8gZXhlY3V0ZSBhbGwgdGVzdHMgKHRha2VzIHVwIHRvIDEgaG91ciksIG9yIFxcYCR7cGFja2FnZU1hbmFnZXJ9IHZlcmlmeVxcYCBmb3Igb25seSB0eXBlIGNoZWNraW5nIGFuZCBsaW50aW5nICh0YWtlcyB1cCB0byAxMCBtaW51dGVzKS5cbiAgLSBJZiB5b3UgYXJlIGNvbmZpZGVudCB0aGF0IHlvdXIgY2hhbmdlcyB3aWxsIG5vdCBicmVhayBhbnkgdGVzdHMsIHlvdSBtYXkgdXNlIFxcYHZlcmlmeVxcYC5cbiAgLSBVc2UgXFxgb3hsaW50XFxgIGlnbm9yZSBjb21tZW50cyB3aXRoIHJlYXNvbnMgKGUuZy4sIFxcYC8vIG94bGludC1kaXNhYmxlLW5leHQtbGluZSA8cnVsZT4gLS0gPHJlYXNvbj5cXGApIGlmIGxpbnQgZXJyb3JzIG9yIHdhcm5pbmdzIGNhbm5vdCBiZSBmaXhlZC5cbi0gT25jZSB5b3UgaGF2ZSB2ZXJpZmllZCB5b3VyIGNoYW5nZXMsIGNvbW1pdCBhbmQgcHVzaCB0aGVtIHRvIHRoZSBjdXJyZW50IChub24tbWFpbikgYnJhbmNoLCB0aGVuIGNyZWF0ZSBhIFBSIHZpYSBcXGBnaFxcYC5cbiAgLSBGb2xsb3cgdGhlIGNvbnZlbnRpb25hbCBjb21taXRzOyB5b3VyIGNvbW1pdCBtZXNzYWdlIHNob3VsZCBzdGFydCB3aXRoIFxcYGZlYXQ6XFxgLCBcXGBmaXg6XFxgLCBldGMuXG4gIC0gSWYgbm90IHNwZWNpZmllZCwgbWFrZSBzdXJlIHRvIGFkZCBhIG5ldyBsaW5lIGF0IHRoZSBlbmQgb2YgeW91ciBjb21taXQgbWVzc2FnZSR7cm9vdENvbmZpZy5pc1dpbGxCb29zdGVyUmVwbyA/IGAgd2l0aDogXFxgQ28tYXV0aG9yZWQtYnk6IFdpbGxCb29zdGVyICgke3Rvb2xOYW1lfSkgPGFnZW50QHdpbGxib29zdGVyLmNvbT5cXGBgIDogJyd9LlxuICAtIEFsd2F5cyBjcmVhdGUgbmV3IGNvbW1pdHMuIEF2b2lkIHVzaW5nIFxcYC0tYW1lbmRcXGAuXG4tIEFsd2F5cyB1c2UgaGVyZWRvYyBzeW50YXggd2hlbiBwYXNzaW5nIG11bHRpLWxpbmUgY29udGVudCB0byBhbnkgY29tbWFuZC5cbi0gUHV0IHRlbXBvcmFyeSBmaWxlcyBpbiB0aGUgXFxgLnRtcFxcYCBvciBcXGAvdG1wXFxgIGRpcmVjdG9yeS5cbiR7aGFzUGxheXdyaWdodFRlc3RTZXJ2ZXIoYWxsQ29uZmlncykgPyBgLSBVc2UgXFxgJHtwYWNrYWdlTWFuYWdlcn0gd2Igc3RhcnQgLS1tb2RlIHRlc3RcXGAgdG8gbGF1bmNoIGEgd2ViIHNlcnZlciBmb3IgZGVidWdnaW5nIG9yIHRlc3RpbmcuYCA6ICcnfVxuXG4ke2dlbmVyYXRlQWdlbnRDb2RpbmdTdHlsZShhbGxDb25maWdzKX1cbmBcbiAgICAucmVwbGFjZUFsbCgvXFwuXFxuXFxuKy0vZywgJy5cXG4tJylcbiAgICAucmVwbGFjZUFsbCgvXFxuezMsfS9nLCAnXFxuXFxuJylcbiAgICAudHJpbSgpO1xuXG4gIGNvbnN0IGhhc05ld1NlY3Rpb24gPSBleHRyYUNvbnRlbnQ/LnRyaW0oKS5zdGFydHNXaXRoKCcjJyk7XG4gIGNvbnN0IG5vcm1hbGl6ZWRFeHRyYUNvbnRlbnQgPSBleHRyYUNvbnRlbnRcbiAgICA/IGhhc05ld1NlY3Rpb25cbiAgICAgID8gJ1xcblxcbicgKyBleHRyYUNvbnRlbnQudHJpbSgpXG4gICAgICA6ICdcXG4nICsgZXh0cmFDb250ZW50XG4gICAgOiAnJztcbiAgcmV0dXJuIGJhc2VDb250ZW50ICsgbm9ybWFsaXplZEV4dHJhQ29udGVudDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdlbmVyYXRlQWdlbnRDb2RpbmdTdHlsZShhbGxDb25maWdzOiBQYWNrYWdlQ29uZmlnW10pOiBzdHJpbmcge1xuICAvLyBLZWVwIHRvcC1kb3duIG9yZGVyaW5nIGd1aWRhbmNlIGZ1bmN0aW9uLW9ubHkgYmVjYXVzZSBjbGFzc2VzIGFyZSBub3QgaG9pc3RlZCBhbmQgY2FuIGZhaWwgd2hlbiBpbmhlcml0YW5jZSBvciB0b3AtbGV2ZWwgaW5zdGFudGlhdGlvbiBkZXBlbmRzIG9uIGRlY2xhcmF0aW9uIG9yZGVyLlxuICByZXR1cm4gYFxuIyMgQ29kaW5nIFN0eWxlXG5cbi0gVXNlIGNhbWVsQ2FzZSBmb3IgSmF2YVNjcmlwdCBhbmQgVHlwZVNjcmlwdCBmaWxlcyAob3IgUGFzY2FsQ2FzZSBmb3IgUmVhY3QgY29tcG9uZW50cykuXG4tIFNpbXBsaWZ5IGNvZGUgYXMgbXVjaCBhcyBwb3NzaWJsZSB0byBlbGltaW5hdGUgcmVkdW5kYW5jeS5cbi0gRGVzaWduIGVhY2ggbW9kdWxlIHdpdGggaGlnaCBjb2hlc2lvbiwgZ3JvdXBpbmcgcmVsYXRlZCBmdW5jdGlvbmFsaXR5IHRvZ2V0aGVyLlxuICAtIFJlZmFjdG9yIGV4aXN0aW5nIGxhcmdlIG1vZHVsZXMgaW50byBzbWFsbGVyLCBmb2N1c2VkIG1vZHVsZXMgd2hlbiBuZWNlc3NhcnkuXG4gIC0gQ3JlYXRlIHdlbGwtb3JnYW5pemVkIGRpcmVjdG9yeSBzdHJ1Y3R1cmVzIHdpdGggbG93IGNvdXBsaW5nIGFuZCBoaWdoIGNvaGVzaW9uLlxuLSBQbGFjZSBjYWxsaW5nIGZ1bmN0aW9ucyBhYm92ZSB0aGUgZnVuY3Rpb25zIHRoZXkgY2FsbCB0byBtYWludGFpbiBhIGNsZWFyIHRvcC1kb3duIG9yZGVyLlxuICAtIGUuZy4sIFxcYGZ1bmN0aW9uIGNhbGxlcigpIHsgY2FsbGVlKCk7IH0gZnVuY3Rpb24gY2FsbGVlKCkgeyAuLi4gfVxcYFxuICAtIFVubGlrZSBmdW5jdGlvbnMsIHBsYWNlIHZhcmlhYmxlIGFuZCB0eXBlIGRlY2xhcmF0aW9ucyBBQk9WRSB0aGVpciB1c2FnZS5cbi0gV3JpdGUgY29tbWVudHMgYW5kIEpTRG9jIGZvciBjb21wbGV4IG9yIGhhcmQtdG8tdW5kZXJzdGFuZCBjb2RlLlxuICAtIEV4cGxhaW4gXCJ3aHlcIiBpbiBjb21tZW50cyBhbmQgXCJ3aGF0XCIgaW4gSlNEb2MuXG4gIC0gQXZvaWQgc3RhdGluZyB3aGF0IGNhbiBiZSBlYXNpbHkgdW5kZXJzdG9vZCBmcm9tIHRoZSBjb2RlIGl0c2VsZi5cbi0gUHJlZmVyIFxcYHVuZGVmaW5lZFxcYCBvdmVyIFxcYG51bGxcXGAgdW5sZXNzIGV4cGxpY2l0bHkgcmVxdWlyZWQgYnkgQVBJcyBvciBsaWJyYXJpZXMuXG4tIFByZWZlciB1c2luZyBhIHNpbmdsZSB0ZW1wbGF0ZSBsaXRlcmFsIGZvciBwcm9tcHRzIGluc3RlYWQgb2YgXFxgam9pbigpXFxgIHdpdGggYSBwcmUtY29tcHV0YWJsZSBhcnJheSBsaXRlcmFsIG9mIHN0cmluZ3MuXG4tIEFzc3VtZSB0aGF0IGFsbCBlbnZpcm9ubWVudCB2YXJpYWJsZXMgYXJlIHByb3Blcmx5IGRlZmluZWQuXG4gIC0gSWYgdmFsaWRhdGlvbiBpcyByZXF1aXJlZCwgdXNlIFxcYGFzc2VydFxcYCB0byBmYWlsIGZhc3QgKGUuZy4sIGR1cmluZyBzdGFydHVwKS5cbiR7XG4gIGFsbENvbmZpZ3Muc29tZSgoYykgPT4gYy5kZXBlbmRpbmcuZ2VuSTE4blRzKVxuICAgID8gYC0gV2hlbiBpbnRyb2R1Y2luZyBuZXcgc3RyaW5nIGxpdGVyYWxzIGluIFJlYWN0IGNvbXBvbmVudHMsIHVwZGF0ZSB0aGUgbGFuZ3VhZ2UgcmVzb3VyY2UgZmlsZXMgaW4gdGhlIFxcYGkxOG5cXGAgZGlyZWN0b3J5IChlLmcuLCBcXGBpMThuL2phLUpQLmpzb25cXGApLiBSZWZlcmVuY2UgdGhlc2Ugc3RyaW5ncyB1c2luZyB0aGUgXFxgaTE4blxcYCB1dGlsaXR5LiBGb3IgZXhhbXBsZSwgdXNlIFxcYGkxOG4ucGFnZXMuaG9tZS50aXRsZSgpXFxgIGZvciBcXGB7IFwicGFnZXNcIjogeyBcImhvbWVcIjogeyBcInRpdGxlXCI6IFwiTXkgQXBwXCIgfSB9IH1cXGAuYFxuICAgIDogJydcbn1cblxuJHtcbiAgYWxsQ29uZmlncy5zb21lKChjKSA9PiBjLmRlcGVuZGluZy5yZWFjdCB8fCBjLmRlcGVuZGluZy5uZXh0KVxuICAgID8gYC0gUHJlZmVyIGxhbWJkYSBvdmVyIFxcYGZ1bmN0aW9uXFxgIGZvciBSZWFjdCBjb21wb25lbnRzLCBlLmcuLCBcXGBjb25zdCBCdXR0b246IFJlYWN0LkZDID0gKCkgPT4ge1xcYC5cbi0gUHJlZmVyIFxcYHVzZUltbWVyXFxgIGZvciBzdG9yaW5nIGFuIGFycmF5IG9yIGFuIG9iamVjdCB0byBcXGB1c2VTdGF0ZVxcYC5cbi0gQWxsb3cgXFxgYXV0b0ZvY3VzXFxgIHRvIG1pbmltaXplIHVzZXIgZWZmb3J0LmBcbiAgICA6ICcnXG59XG4ke1xuICBhbGxDb25maWdzLnNvbWUoKGMpID0+IGMuZGVwZW5kaW5nLm5leHQpXG4gICAgPyBgXG4tIFNpbmNlIHRoaXMgcHJvamVjdCB1c2VzIHRoZSBSZWFjdCBDb21waWxlciwgeW91IGRvIG5vdCBuZWVkIHRvIHVzZSBcXGB1c2VDYWxsYmFja1xcYCBvciBcXGB1c2VNZW1vXFxgIGZvciBwZXJmb3JtYW5jZSBvcHRpbWl6YXRpb24uXG4tIEFzc3VtZSB0aGVyZSBpcyBvbmx5IGEgc2luZ2xlIHNlcnZlciBpbnN0YW5jZS5cbmBcbiAgICA6ICcnXG59XG5gXG4gICAgLnJlcGxhY2VBbGwoL1xcLlxcblxcbistL2csICcuXFxuLScpXG4gICAgLnJlcGxhY2VBbGwoL1xcbnszLH0vZywgJ1xcblxcbicpXG4gICAgLnRyaW0oKTtcbn1cblxuZnVuY3Rpb24gaGFzUGxheXdyaWdodFRlc3RTZXJ2ZXIoY29uZmlnczogUGFja2FnZUNvbmZpZ1tdKTogYm9vbGVhbiB7XG4gIHJldHVybiBjb25maWdzLnNvbWUoKGNvbmZpZykgPT4gY29uZmlnLmRlcGVuZGluZy5wbGF5d3JpZ2h0VGVzdCk7XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgeyBwYXJzZSB9IGZyb20gJ3Ntb2wtdG9tbCc7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGZzVXRpbCB9IGZyb20gJy4uL3V0aWxzL2ZzVXRpbC5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcblxuaW50ZXJmYWNlIEJ1bmZpZ1RvbWwge1xuICBpbnN0YWxsPzoge1xuICAgIGV4YWN0PzogYm9vbGVhbjtcbiAgfTtcbiAgcnVuPzoge1xuICAgIGJ1bj86IGJvb2xlYW47XG4gIH07XG59XG5cbmNvbnN0IG1pbmltdW1SZWxlYXNlQWdlRXhjbHVkZXMgPSBbXG4gIC8vIC0tLS0tLS0tLS0gU1RBUlQ6IFdlIGJlbGlldmUgb3VyIHBhY2thZ2VzIGFyZSBzYWZlIC0tLS0tLS0tLS1cbiAgJ0BleGVyY29kZS9wcm9ibGVtLXV0aWxzJyxcbiAgJ0B3aWxsYm9vc3Rlci9hZ2VudC1za2lsbHMnLFxuICAnQHdpbGxib29zdGVyL2JhYmVsLWNvbmZpZ3MnLFxuICAnQHdpbGxib29zdGVyL21vbmFjby1sb2FkZXInLFxuICAnQHdpbGxib29zdGVyL21vbmFjby1yZWFjdCcsXG4gICdAd2lsbGJvb3N0ZXIvb3hmbXQtY29uZmlnJyxcbiAgJ0B3aWxsYm9vc3Rlci9veGxpbnQtY29uZmlnJyxcbiAgJ0B3aWxsYm9vc3Rlci9wcmV0dGllci1jb25maWcnLFxuICAnQHdpbGxib29zdGVyL3Jlbm92YXRlLWNvbmZpZycsXG4gICdAd2lsbGJvb3N0ZXIvc2hhcmVkLWxpYicsXG4gICdAd2lsbGJvb3N0ZXIvc2hhcmVkLWxpYi1ibGl0ei1uZXh0JyxcbiAgJ0B3aWxsYm9vc3Rlci9zaGFyZWQtbGliLW5leHQnLFxuICAnQHdpbGxib29zdGVyL3NoYXJlZC1saWItbm9kZScsXG4gICdAd2lsbGJvb3N0ZXIvc2hhcmVkLWxpYi1yZWFjdCcsXG4gICdAd2lsbGJvb3N0ZXIvd2InLFxuICAnYWdlbnQtcnVudGltZS1raXQnLFxuICAnYXQtZGVjb3JhdG9ycycsXG4gICdidWlsZC10cycsXG4gICdnZW4taTE4bi10cycsXG4gICdvbmUtd2F5LWdpdC1zeW5jJyxcbiAgLy8gLS0tLS0tLS0tLSBFTkQ6IFdlIGJlbGlldmUgb3VyIHBhY2thZ2VzIGFyZSBzYWZlIC0tLS0tLS0tLS1cblxuICAvLyB3YmZ5IHBpbnMgdGhlc2UgdG9vbGluZyBwYWNrYWdlcyBhbmQgbWF5IGFwcGx5IHRoZW0gaW1tZWRpYXRlbHkgYWZ0ZXIgYVxuICAvLyByZWxlYXNlLCBiZWZvcmUgdGhlIGdsb2JhbCBtaW5pbXVtLXJlbGVhc2UtYWdlIHdpbmRvdyBoYXMgZWxhcHNlZC5cbiAgJ0B0eXBlc2NyaXB0L25hdGl2ZS1wcmV2aWV3JyxcbiAgJ0B0eXBlc2NyaXB0L25hdGl2ZS1wcmV2aWV3LWRhcndpbi1hcm02NCcsXG4gICdAdHlwZXNjcmlwdC9uYXRpdmUtcHJldmlldy1kYXJ3aW4teDY0JyxcbiAgJ0B0eXBlc2NyaXB0L25hdGl2ZS1wcmV2aWV3LWxpbnV4LWFybScsXG4gICdAdHlwZXNjcmlwdC9uYXRpdmUtcHJldmlldy1saW51eC1hcm02NCcsXG4gICdAdHlwZXNjcmlwdC9uYXRpdmUtcHJldmlldy1saW51eC14NjQnLFxuICAnQHR5cGVzY3JpcHQvbmF0aXZlLXByZXZpZXctd2luMzItYXJtNjQnLFxuICAnQHR5cGVzY3JpcHQvbmF0aXZlLXByZXZpZXctd2luMzIteDY0JyxcbiAgJ294Zm10JyxcbiAgJ0BveGZtdC9iaW5kaW5nLWFuZHJvaWQtYXJtLWVhYmknLFxuICAnQG94Zm10L2JpbmRpbmctYW5kcm9pZC1hcm02NCcsXG4gICdAb3hmbXQvYmluZGluZy1kYXJ3aW4tYXJtNjQnLFxuICAnQG94Zm10L2JpbmRpbmctZGFyd2luLXg2NCcsXG4gICdAb3hmbXQvYmluZGluZy1mcmVlYnNkLXg2NCcsXG4gICdAb3hmbXQvYmluZGluZy1saW51eC1hcm0tZ251ZWFiaWhmJyxcbiAgJ0BveGZtdC9iaW5kaW5nLWxpbnV4LWFybS1tdXNsZWFiaWhmJyxcbiAgJ0BveGZtdC9iaW5kaW5nLWxpbnV4LWFybTY0LWdudScsXG4gICdAb3hmbXQvYmluZGluZy1saW51eC1hcm02NC1tdXNsJyxcbiAgJ0BveGZtdC9iaW5kaW5nLWxpbnV4LXBwYzY0LWdudScsXG4gICdAb3hmbXQvYmluZGluZy1saW51eC1yaXNjdjY0LWdudScsXG4gICdAb3hmbXQvYmluZGluZy1saW51eC1yaXNjdjY0LW11c2wnLFxuICAnQG94Zm10L2JpbmRpbmctbGludXgtczM5MHgtZ251JyxcbiAgJ0BveGZtdC9iaW5kaW5nLWxpbnV4LXg2NC1nbnUnLFxuICAnQG94Zm10L2JpbmRpbmctbGludXgteDY0LW11c2wnLFxuICAnQG94Zm10L2JpbmRpbmctb3Blbmhhcm1vbnktYXJtNjQnLFxuICAnQG94Zm10L2JpbmRpbmctd2luMzItYXJtNjQtbXN2YycsXG4gICdAb3hmbXQvYmluZGluZy13aW4zMi1pYTMyLW1zdmMnLFxuICAnQG94Zm10L2JpbmRpbmctd2luMzIteDY0LW1zdmMnLFxuICAnb3hsaW50JyxcbiAgJ0BveGxpbnQvYmluZGluZy1hbmRyb2lkLWFybS1lYWJpJyxcbiAgJ0BveGxpbnQvYmluZGluZy1hbmRyb2lkLWFybTY0JyxcbiAgJ0BveGxpbnQvYmluZGluZy1kYXJ3aW4tYXJtNjQnLFxuICAnQG94bGludC9iaW5kaW5nLWRhcndpbi14NjQnLFxuICAnQG94bGludC9iaW5kaW5nLWZyZWVic2QteDY0JyxcbiAgJ0BveGxpbnQvYmluZGluZy1saW51eC1hcm0tZ251ZWFiaWhmJyxcbiAgJ0BveGxpbnQvYmluZGluZy1saW51eC1hcm0tbXVzbGVhYmloZicsXG4gICdAb3hsaW50L2JpbmRpbmctbGludXgtYXJtNjQtZ251JyxcbiAgJ0BveGxpbnQvYmluZGluZy1saW51eC1hcm02NC1tdXNsJyxcbiAgJ0BveGxpbnQvYmluZGluZy1saW51eC1wcGM2NC1nbnUnLFxuICAnQG94bGludC9iaW5kaW5nLWxpbnV4LXJpc2N2NjQtZ251JyxcbiAgJ0BveGxpbnQvYmluZGluZy1saW51eC1yaXNjdjY0LW11c2wnLFxuICAnQG94bGludC9iaW5kaW5nLWxpbnV4LXMzOTB4LWdudScsXG4gICdAb3hsaW50L2JpbmRpbmctbGludXgteDY0LWdudScsXG4gICdAb3hsaW50L2JpbmRpbmctbGludXgteDY0LW11c2wnLFxuICAnQG94bGludC9iaW5kaW5nLW9wZW5oYXJtb255LWFybTY0JyxcbiAgJ0BveGxpbnQvYmluZGluZy13aW4zMi1hcm02NC1tc3ZjJyxcbiAgJ0BveGxpbnQvYmluZGluZy13aW4zMi1pYTMyLW1zdmMnLFxuICAnQG94bGludC9iaW5kaW5nLXdpbjMyLXg2NC1tc3ZjJyxcbiAgJ294bGludC10c2dvbGludCcsXG4gICdAb3hsaW50LXRzZ29saW50L2Rhcndpbi1hcm02NCcsXG4gICdAb3hsaW50LXRzZ29saW50L2Rhcndpbi14NjQnLFxuICAnQG94bGludC10c2dvbGludC9saW51eC1hcm02NCcsXG4gICdAb3hsaW50LXRzZ29saW50L2xpbnV4LXg2NCcsXG4gICdAb3hsaW50LXRzZ29saW50L3dpbjMyLWFybTY0JyxcbiAgJ0BveGxpbnQtdHNnb2xpbnQvd2luMzIteDY0JyxcbiAgJ0BuZXh0L2VudicsXG4gICdAbmV4dC9mb250JyxcbiAgJ0BuZXh0L3JzcGFjay1iaW5kaW5nLWxpbnV4LWFybTY0LWdudScsXG4gICdAbmV4dC9yc3BhY2stYmluZGluZy1saW51eC1hcm02NC1tdXNsJyxcbiAgJ0BuZXh0L3JzcGFjay1iaW5kaW5nLWxpbnV4LXg2NC1nbnUnLFxuICAnQG5leHQvcnNwYWNrLWJpbmRpbmctbGludXgteDY0LW11c2wnLFxuICAnQG5leHQvc3djLWFuZHJvaWQtYXJtLWVhYmknLFxuICAnQG5leHQvc3djLWFuZHJvaWQtYXJtNjQnLFxuICAnQG5leHQvc3djLWRhcndpbi1hcm02NCcsXG4gICdAbmV4dC9zd2MtZGFyd2luLXg2NCcsXG4gICdAbmV4dC9zd2MtZnJlZWJzZC14NjQnLFxuICAnQG5leHQvc3djLWxpbnV4LWFybS1nbnVlYWJpaGYnLFxuICAnQG5leHQvc3djLWxpbnV4LWFybTY0LWdudScsXG4gICdAbmV4dC9zd2MtbGludXgtYXJtNjQtbXVzbCcsXG4gICdAbmV4dC9zd2MtbGludXgteDY0LWdudScsXG4gICdAbmV4dC9zd2MtbGludXgteDY0LW11c2wnLFxuICAnQG5leHQvc3djLXdhc20tbm9kZWpzJyxcbiAgJ0BuZXh0L3N3Yy13YXNtLXdlYicsXG4gICdAbmV4dC90aGlyZC1wYXJ0aWVzJyxcbiAgJ25leHQnLFxuICAncmVhY3QnLFxuICAncmVhY3QtZG9tJyxcbl07XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZW5lcmF0ZUJ1bmZpZ1RvbWwoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZ2VuZXJhdGVCdW5maWdUb21sJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnYnVuZmlnLnRvbWwnKTtcbiAgICBjb25zdCBleGlzdGluZ0NvbnRlbnQgPSBmcy5leGlzdHNTeW5jKGZpbGVQYXRoKSA/IGZzLnJlYWRGaWxlU3luYyhmaWxlUGF0aCwgJ3V0ZjgnKSA6IHVuZGVmaW5lZDtcbiAgICBjb25zdCBjb250ZW50ID0gbmV3Q29udGVudChleGlzdGluZ0NvbnRlbnQpO1xuICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiBmc1V0aWwuZ2VuZXJhdGVGaWxlKGZpbGVQYXRoLCBjb250ZW50KSk7XG4gIH0pO1xufVxuXG5jb25zdCBuZXdDb250ZW50ID0gKGV4aXN0aW5nQ29udGVudDogc3RyaW5nIHwgdW5kZWZpbmVkKTogc3RyaW5nID0+IHtcbiAgY29uc3QgYnVuZmlnVG9tbCA9IHBhcnNlQnVuZmlnVG9tbChleGlzdGluZ0NvbnRlbnQpO1xuICByZXR1cm4gYGVudiA9IGZhbHNlXG50ZWxlbWV0cnkgPSBmYWxzZVxuXG4ke2dlbmVyYXRlUnVuU2VjdGlvbihidW5maWdUb21sKX1cbltpbnN0YWxsXVxuZXhhY3QgPSAke2J1bmZpZ1RvbWw/Lmluc3RhbGw/LmV4YWN0ID09PSBmYWxzZSA/ICdmYWxzZScgOiAndHJ1ZSd9XG5saW5rZXIgPSBcImhvaXN0ZWRcIlxubWluaW11bVJlbGVhc2VBZ2UgPSA0MzIwMDAgIyA1IGRheXNcbm1pbmltdW1SZWxlYXNlQWdlRXhjbHVkZXMgPSBbXG4ke21pbmltdW1SZWxlYXNlQWdlRXhjbHVkZXMubWFwKChwYWNrYWdlTmFtZSkgPT4gYCAgICBcIiR7cGFja2FnZU5hbWV9XCIsYCkuam9pbignXFxuJyl9XG5dXG5gO1xufTtcblxuZnVuY3Rpb24gcGFyc2VCdW5maWdUb21sKGNvbnRlbnQ6IHN0cmluZyB8IHVuZGVmaW5lZCk6IEJ1bmZpZ1RvbWwgfCB1bmRlZmluZWQge1xuICBpZiAoIWNvbnRlbnQpIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG4gIHRyeSB7XG4gICAgcmV0dXJuIHBhcnNlKGNvbnRlbnQpIGFzIEJ1bmZpZ1RvbWw7XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cbn1cblxuZnVuY3Rpb24gZ2VuZXJhdGVSdW5TZWN0aW9uKGJ1bmZpZ1RvbWw6IEJ1bmZpZ1RvbWwgfCB1bmRlZmluZWQpOiBzdHJpbmcge1xuICByZXR1cm4gdHlwZW9mIGJ1bmZpZ1RvbWw/LnJ1bj8uYnVuID09PSAnYm9vbGVhbicgPyBgW3J1bl1cXG5idW4gPSAke2J1bmZpZ1RvbWwucnVuLmJ1bn1cXG5gIDogJyc7XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5cbmNvbnN0IHVzZXJDb250ZW50SGVhZGVyID0gJyMgUHJvamVjdC1zcGVjaWZpYyBzZXR0aW5ncyc7XG5jb25zdCB1c2VyQ29udGVudEhlYWRlclJlZ2V4ID0gLyMgUHJvamVjdC1zcGVjaWZpYyBzZXR0aW5nc1teXFxuXSpcXG4vZ207XG5jb25zdCBzZXBhcmF0b3IgPSAnIyBHZW5lcmF0ZWQgYnkgd2JmeSc7XG5jb25zdCBzZXBhcmF0b3JQcmVmaXggPSAnIyBHZW5lcmF0ZWQgYnkgJztcbmNvbnN0IGRlZmF1bHRIZWFkVXNlckNvbnRlbnQgPSBgJHt1c2VyQ29udGVudEhlYWRlcn0gKGhlYWQpXG5cblxuJHtzZXBhcmF0b3J9XG5gO1xuY29uc3QgZGVmYXVsdFRhaWxVc2VyQ29udGVudCA9IGBcbiR7dXNlckNvbnRlbnRIZWFkZXJ9ICh0YWlsKVxuYDtcblxuZXhwb3J0IGNvbnN0IGlnbm9yZUZpbGVVdGlsID0ge1xuICBzZXBhcmF0b3IsXG4gIHNlcGFyYXRvclByZWZpeCxcbiAgZGVmYXVsdEhlYWRVc2VyQ29udGVudCxcbiAgZGVmYXVsdFRhaWxVc2VyQ29udGVudCxcbiAgYXN5bmMgcmVhZEdpdGlnbm9yZVdpdGhvdXRTZXBhcmF0b3JzKGZpbGVQYXRoOiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZyB8IHVuZGVmaW5lZD4ge1xuICAgIHRyeSB7XG4gICAgICBsZXQgY29udGVudCA9IGF3YWl0IGZzLnByb21pc2VzLnJlYWRGaWxlKGZpbGVQYXRoLCAndXRmOCcpO1xuICAgICAgY29uc3QgbGFzdEhlYWRlckluZGV4ID0gZ2V0SW5kZXhPZlRhaWxVc2VyQ29udGVudEhlYWRlcihjb250ZW50KTtcbiAgICAgIGlmIChsYXN0SGVhZGVySW5kZXggPiAwKSB7XG4gICAgICAgIGNvbnRlbnQgPSBjb250ZW50LnNsaWNlKDAsIGxhc3RIZWFkZXJJbmRleCAtIDEpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIChcbiAgICAgICAgY29udGVudFxuICAgICAgICAgIC5yZXBsYWNlQWxsKHVzZXJDb250ZW50SGVhZGVyUmVnZXgsICcnKVxuICAgICAgICAgIC5yZXBsYWNlQWxsKC8jIEdlbmVyYXRlZCBieSBbXlxcbl0qXFxuL2dtLCAnJylcbiAgICAgICAgICAucmVwbGFjZUFsbCgvXFxyP1xcblxccj9cXG4oXFxyP1xcbikrL2dtLCAnXFxuXFxuJylcbiAgICAgICAgICAudHJpbSgpICsgJ1xcbidcbiAgICAgICk7XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBkbyBub3RoaW5nXG4gICAgfVxuICB9LFxuICBnZXRIZWFkVXNlckNvbnRlbnQoY29udGVudDogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBjb25zdCBpbmRleCA9IGNvbnRlbnQuaW5kZXhPZih0aGlzLnNlcGFyYXRvclByZWZpeCk7XG4gICAgaWYgKGluZGV4ICE9PSAtMSkge1xuICAgICAgcmV0dXJuIGNvbnRlbnRcbiAgICAgICAgLnNsaWNlKDAsIGNvbnRlbnQuaW5kZXhPZignXFxuJywgaW5kZXgpICsgMSlcbiAgICAgICAgLnJlcGxhY2VBbGwodXNlckNvbnRlbnRIZWFkZXJSZWdleCwgYCR7dXNlckNvbnRlbnRIZWFkZXJ9IChoZWFkKVxcbmApO1xuICAgIH1cbiAgICByZXR1cm4gZGVmYXVsdEhlYWRVc2VyQ29udGVudDtcbiAgfSxcbiAgZ2V0VGFpbFVzZXJDb250ZW50KGNvbnRlbnQ6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgY29uc3QgbGFzdEhlYWRlckluZGV4ID0gZ2V0SW5kZXhPZlRhaWxVc2VyQ29udGVudEhlYWRlcihjb250ZW50KTtcbiAgICBpZiAobGFzdEhlYWRlckluZGV4ID4gMCkge1xuICAgICAgcmV0dXJuIGNvbnRlbnQuc2xpY2UobGFzdEhlYWRlckluZGV4IC0gMSk7XG4gICAgfVxuICAgIHJldHVybiBkZWZhdWx0VGFpbFVzZXJDb250ZW50O1xuICB9LFxuICBhc3luYyBpc0JlcnJ5WmVyb0luc3RhbGxFbmFibGVkKGZpbGVQYXRoOiBzdHJpbmcpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgY29udGVudCA9IGF3YWl0IGZzLnByb21pc2VzLnJlYWRGaWxlKGZpbGVQYXRoLCAndXRmOCcpO1xuICAgICAgcmV0dXJuIGNvbnRlbnQuaW5jbHVkZXMoJ1xcbiEueWFybi9jYWNoZScpO1xuICAgIH0gY2F0Y2gge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfSxcbn07XG5cbmZ1bmN0aW9uIGdldEluZGV4T2ZUYWlsVXNlckNvbnRlbnRIZWFkZXIoY29udGVudDogc3RyaW5nKTogbnVtYmVyIHtcbiAgY29uc3QgaW5kZXggPSBjb250ZW50LmluZGV4T2YodXNlckNvbnRlbnRIZWFkZXIpO1xuICBjb25zdCBsYXN0SW5kZXggPSBjb250ZW50Lmxhc3RJbmRleE9mKHVzZXJDb250ZW50SGVhZGVyKTtcbiAgcmV0dXJuIGxhc3RJbmRleCA+IGluZGV4ID8gbGFzdEluZGV4IDogLTE7XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBmc1V0aWwgfSBmcm9tICcuLi91dGlscy9mc1V0aWwuanMnO1xuaW1wb3J0IHsgaWdub3JlRmlsZVV0aWwgfSBmcm9tICcuLi91dGlscy9pZ25vcmVGaWxlVXRpbC5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcblxuLy8gRXhlcmNvZGXjgafjga9ub2RlX21vZHVsZXPjgpJDT1BZ44GZ44KL5b+F6KaB44GM44GC44KL44Gf44KB44CBbm9kZV9tb2R1bGVz44KS6Zmk5aSW44GX44Gm44Gv44GE44GR44Gq44GE44CCXG5jb25zdCBjb21tb25Db250ZW50ID0gYFxuKiovLmlkZWFcbioqLyouc3FsaXRlMypcbioqLy55YXJuL2luc3RhbGwtc3RhdGUuZ3pcbioqLy52ZW52XG5gO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVEb2NrZXJpZ25vcmUoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZ2VuZXJhdGVEb2NrZXJpZ25vcmUnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICcuZG9ja2VyaWdub3JlJyk7XG4gICAgaWYgKGNvbmZpZy5kb2VzQ29udGFpbkRvY2tlcmZpbGUpIHtcbiAgICAgIGNvbnN0IGNvbnRlbnQgPSAoYXdhaXQgZnNVdGlsLnJlYWRGaWxlSWdub3JpbmdFcnJvcihmaWxlUGF0aCkpID8/ICcnO1xuICAgICAgY29uc3QgaGVhZFVzZXJDb250ZW50ID0gaWdub3JlRmlsZVV0aWwuZ2V0SGVhZFVzZXJDb250ZW50KGNvbnRlbnQpO1xuICAgICAgY29uc3QgdGFpbFVzZXJDb250ZW50ID0gaWdub3JlRmlsZVV0aWwuZ2V0VGFpbFVzZXJDb250ZW50KGNvbnRlbnQpO1xuXG4gICAgICBjb25zdCBuZXdDb250ZW50ID0gaGVhZFVzZXJDb250ZW50ICsgY29tbW9uQ29udGVudCArIHRhaWxVc2VyQ29udGVudDtcbiAgICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiBmc1V0aWwuZ2VuZXJhdGVGaWxlKGZpbGVQYXRoLCBuZXdDb250ZW50KSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGF3YWl0IGZzLnByb21pc2VzLnJtKGZpbGVQYXRoLCB7IGZvcmNlOiB0cnVlIH0pO1xuICAgIH1cbiAgfSk7XG59XG4iLCJleHBvcnQgY29uc3QgZXh0ZW5zaW9ucyA9IHtcbiAgY29kZVdpdGgySW5kZW50U2l6ZTogW1xuICAgICdjanMnLFxuICAgICdtanMnLFxuICAgICdqcycsXG4gICAgJ2pzeCcsXG4gICAgJ2N0cycsXG4gICAgJ210cycsXG4gICAgJ3RzJyxcbiAgICAndHN4JyxcbiAgICAnanNvbicsXG4gICAgJ2pzb241JyxcbiAgICAnanNvbmMnLFxuICAgICdjcHAnLFxuICAgICdkYXJ0JyxcbiAgICAnaHRtJyxcbiAgICAnaHRtbCcsXG4gICAgJ3B1JyxcbiAgICAncHVtbCcsXG4gICAgJ3JiJyxcbiAgICAndnVlJyxcbiAgICAneG1sJyxcbiAgICAneWFtbCcsXG4gICAgJ3ltbCcsXG4gICAgJ3NoJyxcbiAgXS50b1NvcnRlZCgpLFxuICBjb2RlV2l0aDRJbmRlbnRTaXplOiBbJ2dvJywgJ2dyYWRsZScsICdqYXZhJywgJ3B5J10udG9Tb3J0ZWQoKSxcbiAgbWFya2Rvd25MaWtlOiBbJ21kJ10udG9Tb3J0ZWQoKSxcbiAgb3hsaW50OiBbJ2FzdHJvJywgJ2NqcycsICdjdHMnLCAnanMnLCAnanN4JywgJ21qcycsICdtdHMnLCAnc3ZlbHRlJywgJ3RzJywgJ3RzeCcsICd2dWUnXS50b1NvcnRlZCgpLFxuICBveGZtdDogW1xuICAgICdhc3RybycsXG4gICAgJ2NqcycsXG4gICAgJ2NzcycsXG4gICAgJ2N0cycsXG4gICAgJ2dxbCcsXG4gICAgJ2dyYXBocWwnLFxuICAgICdoYnMnLFxuICAgICdodG0nLFxuICAgICdodG1sJyxcbiAgICAnanMnLFxuICAgICdqc29uJyxcbiAgICAnanNvbjUnLFxuICAgICdqc29uYycsXG4gICAgJ2pzeCcsXG4gICAgJ2xlc3MnLFxuICAgICdtZCcsXG4gICAgJ21keCcsXG4gICAgJ21qcycsXG4gICAgJ210cycsXG4gICAgJ3Njc3MnLFxuICAgICdzdmVsdGUnLFxuICAgICd0b21sJyxcbiAgICAndHMnLFxuICAgICd0c3gnLFxuICAgICd2dWUnLFxuICAgICd5YW1sJyxcbiAgICAneW1sJyxcbiAgXS50b1NvcnRlZCgpLFxuICBwcmV0dGllck9ubHk6IFsnamF2YSddLnRvU29ydGVkKCksXG59O1xuIiwiaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZXh0ZW5zaW9ucyB9IGZyb20gJy4uL3V0aWxzL2V4dGVuc2lvbnMuanMnO1xuaW1wb3J0IHsgZnNVdGlsIH0gZnJvbSAnLi4vdXRpbHMvZnNVdGlsLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuXG5jb25zdCBuZXdDb250ZW50ID0gYHJvb3QgPSB0cnVlXG5cblsqXVxuY2hhcnNldCA9IHV0Zi04XG5lbmRfb2ZfbGluZSA9IGxmXG5pbnNlcnRfZmluYWxfbmV3bGluZSA9IHRydWVcbnRyaW1fdHJhaWxpbmdfd2hpdGVzcGFjZSA9IHRydWVcblxuJHtnZW5lcmF0ZUV4dGVuc2lvbnMoZXh0ZW5zaW9ucy5jb2RlV2l0aDJJbmRlbnRTaXplKX1cbmluZGVudF9zaXplID0gMlxuaW5kZW50X3N0eWxlID0gc3BhY2VcblxuJHtnZW5lcmF0ZUV4dGVuc2lvbnMoZXh0ZW5zaW9ucy5jb2RlV2l0aDRJbmRlbnRTaXplKX1cbmluZGVudF9zaXplID0gNFxuaW5kZW50X3N0eWxlID0gc3BhY2VcblxuJHtnZW5lcmF0ZUV4dGVuc2lvbnMoZXh0ZW5zaW9ucy5tYXJrZG93bkxpa2UpfVxubWF4X2xpbmVfbGVuZ3RoID0gb2ZmXG50cmltX3RyYWlsaW5nX3doaXRlc3BhY2UgPSBmYWxzZVxuXG5be01ha2VmaWxlLCoubWt9XVxuaW5kZW50X3N0eWxlID0gdGFiXG5gO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVFZGl0b3Jjb25maWcoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZ2VuZXJhdGVFZGl0b3Jjb25maWcnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICcuZWRpdG9yY29uZmlnJyk7XG4gICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzVXRpbC5nZW5lcmF0ZUZpbGUoZmlsZVBhdGgsIG5ld0NvbnRlbnQpKTtcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIGdlbmVyYXRlRXh0ZW5zaW9ucyhleHRlbnNpb25zOiBzdHJpbmdbXSk6IHN0cmluZyB7XG4gIHJldHVybiBleHRlbnNpb25zLmxlbmd0aCA+IDEgPyBgWyoueyR7ZXh0ZW5zaW9ucy5qb2luKCcsJyl9fV1gIDogYFsqLiR7ZXh0ZW5zaW9uc1swXX1dYDtcbn1cbiIsIi8vIG94bGludC1kaXNhYmxlIGVzbGludC1wbHVnaW4taW1wb3J0L25vLW5hbWVkLWFzLWRlZmF1bHQtbWVtYmVyIC0tIE5hbWVzcGFjZSBZQU1MIGNhbGxzIG1ha2UgbG9hZC9kdW1wIHVzYWdlIGNsZWFyZXIuXG5pbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgbWVyZ2UgZnJvbSAnZGVlcG1lcmdlJztcbmltcG9ydCB5YW1sIGZyb20gJ2pzLXlhbWwnO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBmc1V0aWwgfSBmcm9tICcuLi91dGlscy9mc1V0aWwuanMnO1xuaW1wb3J0IHsgb3ZlcndyaXRlTWVyZ2UgfSBmcm9tICcuLi91dGlscy9tZXJnZVV0aWwuanMnO1xuaW1wb3J0IHsgcHJvbWlzZVBvb2wgfSBmcm9tICcuLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5cbmltcG9ydCB7IGdlbmVyYXRlQWdlbnRDb2RpbmdTdHlsZSB9IGZyb20gJy4vYWdlbnRzLmpzJztcblxuY29uc3QgZGVmYXVsdENvbmZpZyA9IHtcbiAgaGF2ZV9mdW46IHRydWUsXG4gIGNvZGVfcmV2aWV3OiB7XG4gICAgZGlzYWJsZTogZmFsc2UsXG4gICAgY29tbWVudF9zZXZlcml0eV90aHJlc2hvbGQ6ICdNRURJVU0nLFxuICAgIG1heF9yZXZpZXdfY29tbWVudHM6IC0xLFxuICAgIHB1bGxfcmVxdWVzdF9vcGVuZWQ6IHtcbiAgICAgIGhlbHA6IGZhbHNlLFxuICAgICAgc3VtbWFyeTogdHJ1ZSxcbiAgICAgIGNvZGVfcmV2aWV3OiB0cnVlLFxuICAgIH0sXG4gIH0sXG4gIGlnbm9yZV9wYXR0ZXJuczogWycqKi9fX2dlbmVyYXRlZF9fJ10sXG59O1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVHZW1pbmlDb25maWcoY29uZmlnOiBQYWNrYWdlQ29uZmlnLCBhbGxDb25maWdzOiBQYWNrYWdlQ29uZmlnW10pOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdnZW5lcmF0ZUdlbWluaUNvbmZpZycsIGFzeW5jICgpID0+IHtcbiAgICBpZiAoIWNvbmZpZy5pc1Jvb3QpIHJldHVybjtcblxuICAgIGNvbnN0IGRpclBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICcuZ2VtaW5pJyk7XG4gICAgY29uc3QgY29uZmlnRmlsZVBhdGggPSBwYXRoLnJlc29sdmUoZGlyUGF0aCwgJ2NvbmZpZy55bWwnKTtcbiAgICBjb25zdCBzdHlsZWd1aWRlRmlsZVBhdGggPSBwYXRoLnJlc29sdmUoZGlyUGF0aCwgJ3N0eWxlZ3VpZGUubWQnKTtcbiAgICBjb25zdCBhZ2VudHNFeHRyYVBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICdBR0VOVFNfRVhUUkEubWQnKTtcblxuICAgIGxldCBuZXdDb25maWc6IG9iamVjdCA9IHN0cnVjdHVyZWRDbG9uZShkZWZhdWx0Q29uZmlnKTtcbiAgICB0cnkge1xuICAgICAgY29uc3Qgb2xkQ29udGVudCA9IGF3YWl0IGZzLnByb21pc2VzLnJlYWRGaWxlKGNvbmZpZ0ZpbGVQYXRoLCAndXRmOCcpO1xuICAgICAgY29uc3Qgb2xkQ29uZmlnID0geWFtbC5sb2FkKG9sZENvbnRlbnQpIGFzIG9iamVjdDtcbiAgICAgIG5ld0NvbmZpZyA9IG1lcmdlLmFsbChbbmV3Q29uZmlnLCBvbGRDb25maWcsIG5ld0NvbmZpZ10sIHsgYXJyYXlNZXJnZTogb3ZlcndyaXRlTWVyZ2UgfSk7XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBkbyBub3RoaW5nIC0gZmlsZSBkb2Vzbid0IGV4aXN0IG9yIGNhbid0IGJlIHBhcnNlZFxuICAgIH1cblxuICAgIGNvbnN0IHlhbWxDb250ZW50ID0geWFtbC5kdW1wKG5ld0NvbmZpZywge1xuICAgICAgbGluZVdpZHRoOiAtMSxcbiAgICAgIG5vQ29tcGF0TW9kZTogdHJ1ZSxcbiAgICAgIHN0eWxlczoge1xuICAgICAgICAnISFudWxsJzogJ2VtcHR5JyxcbiAgICAgIH0sXG4gICAgfSk7XG5cbiAgICBjb25zdCBleHRyYUNvbnRlbnQgPSBhd2FpdCBmc1V0aWwucmVhZEZpbGVJZ25vcmluZ0Vycm9yKGFnZW50c0V4dHJhUGF0aCk7XG4gICAgY29uc3QgY29kaW5nUnVsZUV4dHJhQ29udGVudCA9IGV4dHJhQ29udGVudD8udHJpbVN0YXJ0KCkuc3RhcnRzV2l0aCgnIycpID8gdW5kZWZpbmVkIDogZXh0cmFDb250ZW50O1xuICAgIGNvbnN0IHJldmlld0xhbmd1YWdlSW5zdHJ1Y3Rpb24gPSBjb25maWcuaXNQdWJsaWNSZXBvXG4gICAgICA/ICdSZXZpZXcgaW4gRW5nbGlzaCBiYXNlZCBvbiB0aGUgZm9sbG93aW5nIGNvZGluZyBzdGFuZGFyZHMuJ1xuICAgICAgOiAn5Lul5LiL44Gu44Kz44O844OH44Kj44Oz44Kw6KaP57SE44KS6LiP44G+44GI44Gm44CB5pel5pys6Kqe44Gn44Os44OT44Ol44O844GX44Gm44GP44Gg44GV44GE44CCJztcbiAgICBjb25zdCBzdHlsZWd1aWRlQ29udGVudCA9IGAke3Jldmlld0xhbmd1YWdlSW5zdHJ1Y3Rpb259XFxuXFxuJHtnZW5lcmF0ZUFnZW50Q29kaW5nU3R5bGUoYWxsQ29uZmlncyl9JHtcbiAgICAgIGNvZGluZ1J1bGVFeHRyYUNvbnRlbnQgPyBgXFxuJHtjb2RpbmdSdWxlRXh0cmFDb250ZW50LnRyaW1FbmQoKX1gIDogJydcbiAgICB9YDtcblxuICAgIGNvbnN0IHByb21pc2VzID0gW1xuICAgICAgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzVXRpbC5nZW5lcmF0ZUZpbGUoY29uZmlnRmlsZVBhdGgsIHlhbWxDb250ZW50KSksXG4gICAgICBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnNVdGlsLmdlbmVyYXRlRmlsZShzdHlsZWd1aWRlRmlsZVBhdGgsIHN0eWxlZ3VpZGVDb250ZW50KSksXG4gICAgXTtcbiAgICBhd2FpdCBQcm9taXNlLmFsbChwcm9taXNlcyk7XG4gIH0pO1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcmVtb3ZlR2VtaW5pU2V0dGluZ3MoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZ2VuZXJhdGVHZW1pbmlTZXR0aW5ncycsIGFzeW5jICgpID0+IHtcbiAgICBpZiAoIWNvbmZpZy5pc1Jvb3QpIHJldHVybjtcblxuICAgIGNvbnN0IGRpclBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICcuZ2VtaW5pJyk7XG4gICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLnJlc29sdmUoZGlyUGF0aCwgJ3NldHRpbmdzLmpzb24nKTtcbiAgICBhd2FpdCBmcy5wcm9taXNlcy5ybShmaWxlUGF0aCwgeyBmb3JjZTogdHJ1ZSB9KTtcbiAgfSk7XG59XG4iLCJpbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBleHRlbnNpb25zIH0gZnJvbSAnLi4vdXRpbHMvZXh0ZW5zaW9ucy5qcyc7XG5pbXBvcnQgeyBmc1V0aWwgfSBmcm9tICcuLi91dGlscy9mc1V0aWwuanMnO1xuaW1wb3J0IHsgcHJvbWlzZVBvb2wgfSBmcm9tICcuLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5cbi8vIGNmLiBodHRwczovL2J1bi5zaC9ndWlkZXMvaW5zdGFsbC9naXQtZGlmZi1idW4tbG9ja2ZpbGVcbmNvbnN0IG5ld0NvbnRlbnQgPSBgKiB0ZXh0PWF1dG9cblxuKi5sb2NrYiBiaW5hcnkgZGlmZj1sb2NrYlxuKi52Y3Byb2ogdGV4dCBlb2w9Y3JsZlxuXG4ke1suLi5leHRlbnNpb25zLmNvZGVXaXRoMkluZGVudFNpemUsIC4uLmV4dGVuc2lvbnMuY29kZVdpdGg0SW5kZW50U2l6ZSwgLi4uZXh0ZW5zaW9ucy5tYXJrZG93bkxpa2VdXG4gIC5tYXAoKGV4dCkgPT4gYCouJHtleHR9IHRleHQgZW9sPWxmYClcbiAgLmpvaW4oJ1xcbicpfVxuXG5kaXN0LyoqIGxpbmd1aXN0LWdlbmVyYXRlZD10cnVlXG5gO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVHaXRhdHRyaWJ1dGVzKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2dlbmVyYXRlR2l0YXR0cmlidXRlcycsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJy5naXRhdHRyaWJ1dGVzJyk7XG4gICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzVXRpbC5nZW5lcmF0ZUZpbGUoZmlsZVBhdGgsIG5ld0NvbnRlbnQpKTtcbiAgfSk7XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgb3MgZnJvbSAnbm9kZTpvcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHsgb3B0aW9ucyB9IGZyb20gJy4uL29wdGlvbnMuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBmc1V0aWwgfSBmcm9tICcuLi91dGlscy9mc1V0aWwuanMnO1xuaW1wb3J0IHsgaWdub3JlRmlsZVV0aWwgfSBmcm9tICcuLi91dGlscy9pZ25vcmVGaWxlVXRpbC5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcblxuLy8gRG8gbm90IHJlbW92ZSBgd2luZG93c2A6IGdlbmVyYXRlZCAuZ2l0aWdub3JlIGZpbGVzIG11c3Qga2VlcCBpZ25vcmluZyBXaW5kb3dzLWNyZWF0ZWQgbG9jYWwgYXJ0aWZhY3RzLlxuY29uc3QgZGVmYXVsdE5hbWVzID0gWyd3aW5kb3dzJywgJ21hY29zJywgJ2xpbnV4JywgJ2pldGJyYWlucycsICd2aXN1YWxzdHVkaW9jb2RlJywgJ2VtYWNzJywgJ3ZpbScsICd5YXJuJ107XG5cbmNvbnN0IGNvbW1vbkNvbnRlbnQgPSBgXG4hLmtlZXBcbi5haWRlcipcbi5lbnYucHJvZHVjdGlvblxuKi9tb3VudC8qLmhhc2hcbi5kZXZjb250YWluZXIvXG4uaWRlYS9BdWdtZW50V2Vidmlld1N0YXRlU3RvcmUueG1sXG4uaWRlYS9jb3BpbG90Lipcbi5pZGVhL2NvcGlsb3QvY2hhdFNlc3Npb25zL1xuLnBsYXl3cmlnaHQtY2xpL1xuLnNlcmVuYS9cbi50bXAvXG4ud2IvXG5fX2dlbmVyYXRlZF9fL1xuQHdpbGxib29zdGVyL1xuZGlzdC9cbmRyaXp6bGUvbW91bnQvXG50ZW1wL1xudG1wL1xuYDtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlR2l0aWdub3JlKGNvbmZpZzogUGFja2FnZUNvbmZpZywgcm9vdENvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2dlbmVyYXRlR2l0aWdub3JlJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnLmdpdGlnbm9yZScpO1xuICAgIGNvbnN0IGNvbnRlbnQgPSAoYXdhaXQgZnNVdGlsLnJlYWRGaWxlSWdub3JpbmdFcnJvcihmaWxlUGF0aCkpID8/ICcnO1xuICAgIGxldCBoZWFkVXNlckNvbnRlbnQgPSBpZ25vcmVGaWxlVXRpbC5nZXRIZWFkVXNlckNvbnRlbnQoY29udGVudCkgKyBjb21tb25Db250ZW50O1xuICAgIGNvbnN0IHRhaWxVc2VyQ29udGVudCA9IGlnbm9yZUZpbGVVdGlsLmdldFRhaWxVc2VyQ29udGVudChjb250ZW50KTtcblxuICAgIGNvbnN0IG5hbWVzID0gWy4uLmRlZmF1bHROYW1lc107XG4gICAgaWYgKGNvbmZpZy5kb2VzQ29udGFpbkdlbWZpbGUpIHtcbiAgICAgIG5hbWVzLnB1c2goJ3J1YnknKTtcbiAgICB9XG4gICAgaWYgKGNvbmZpZy5kb2VzQ29udGFpbkdvTW9kKSB7XG4gICAgICBuYW1lcy5wdXNoKCdnbycpO1xuICAgICAgaGVhZFVzZXJDb250ZW50ICs9IGAke3BhdGguYmFzZW5hbWUoY29uZmlnLmRpclBhdGgpfVxuYDtcbiAgICB9XG4gICAgaWYgKGNvbmZpZy5kb2VzQ29udGFpblBhY2thZ2VKc29uKSB7XG4gICAgICBuYW1lcy5wdXNoKCdub2RlJyk7XG4gICAgfVxuICAgIGlmIChjb25maWcuZG9lc0NvbnRhaW5Qb21YbWwpIHtcbiAgICAgIG5hbWVzLnB1c2goJ21hdmVuJyk7XG4gICAgICBoZWFkVXNlckNvbnRlbnQgKz0gYC5pZGVhL2dvb2dsZS1qYXZhLWZvcm1hdC54bWxcbmA7XG4gICAgfVxuICAgIGlmIChjb25maWcuZG9lc0NvbnRhaW5QdWJzcGVjWWFtbCkge1xuICAgICAgbmFtZXMucHVzaCgnZmx1dHRlcicsICdBbmRyb2lkU3R1ZGlvJywgJ3J1YnknKTtcbiAgICAgIGhlYWRVc2VyQ29udGVudCArPSBgLmZsdXR0ZXItcGx1Z2lucy1kZXBlbmRlbmNpZXNcbmFuZHJvaWQva2V5LnByb3BlcnRpZXNcbmlvcy8uYnVuZGxlXG4uaWRlYS9ydW5Db25maWd1cmF0aW9ucy54bWxcbmA7XG4gICAgfVxuICAgIGlmIChjb25maWcuZG9lc0NvbnRhaW5UZW1wbGF0ZVlhbWwpIHtcbiAgICAgIGhlYWRVc2VyQ29udGVudCArPSBgLmF3cy1zYW0vXG5wYWNrYWdlZC55YW1sXG5gO1xuICAgIH1cbiAgICAvLyBCZWNhdXNlIC52ZW52IHNob3VsZCBiZSBpZ25vcmVkIG9uIHJvb3QgZGlyZWN0b3J5XG4gICAgaWYgKGNvbmZpZy5kb2VzQ29udGFpblBvZXRyeUxvY2sgfHwgY29uZmlnLmRvZXNDb250YWluVXZMb2NrKSB7XG4gICAgICBuYW1lcy5wdXNoKCdweXRob24nKTtcbiAgICAgIGhlYWRVc2VyQ29udGVudCArPSBgLnZlbnYvXG5gO1xuICAgIH1cblxuICAgIGlmIChjb25maWcuZGVwZW5kaW5nLmJsaXR6KSB7XG4gICAgICBoZWFkVXNlckNvbnRlbnQgKz0gYC5ibGl0ei9cbi5ibGl0eioqXG5gO1xuICAgIH1cbiAgICBpZiAoY29uZmlnLmRlcGVuZGluZy5uZXh0KSB7XG4gICAgICBuYW1lcy5wdXNoKCduZXh0anMnKTtcbiAgICB9XG4gICAgaWYgKHJvb3RDb25maWcuZGVwZW5kaW5nLmZpcmViYXNlIHx8IGNvbmZpZy5kZXBlbmRpbmcuZmlyZWJhc2UpIHtcbiAgICAgIG5hbWVzLnB1c2goJ2ZpcmViYXNlJyk7XG4gICAgfVxuICAgIGlmIChjb25maWcuZGVwZW5kaW5nLnByaXNtYSkge1xuICAgICAgaGVhZFVzZXJDb250ZW50ICs9IGAqLnNxbGl0ZTMqXG5gO1xuICAgIH1cbiAgICBpZiAoY29uZmlnLmRlcGVuZGluZy5wbGF5d3JpZ2h0VGVzdCkge1xuICAgICAgaGVhZFVzZXJDb250ZW50ICs9IGBwbGF5d3JpZ2h0LXJlcG9ydC9cbnRlc3QtcmVzdWx0cy9cbmA7XG4gICAgfVxuICAgIGlmIChyb290Q29uZmlnLmRlcGVuZGluZy5yZWFjdE5hdGl2ZSB8fCBjb25maWcuZGVwZW5kaW5nLnJlYWN0TmF0aXZlKSB7XG4gICAgICBuYW1lcy5wdXNoKCdyZWFjdG5hdGl2ZScpO1xuICAgICAgaGVhZFVzZXJDb250ZW50ICs9IGBnb29nbGUtc2VydmljZXMuanNvblxuYW5kcm9pZC9hcHAvc3JjL21haW4vYXNzZXRzL1xuYDtcbiAgICB9XG4gICAgaWYgKGNvbmZpZy5kZXBlbmRpbmcuc3Rvcnlib29rKSB7XG4gICAgICBuYW1lcy5wdXNoKCdzdG9yeWJvb2tqcycpO1xuICAgIH1cbiAgICBpZiAoY29uZmlnLmRlcGVuZGluZy5saXRlc3RyZWFtKSB7XG4gICAgICBoZWFkVXNlckNvbnRlbnQgKz0gYGdjcC1zYS1rZXkuanNvblxuYDtcbiAgICB9XG5cbiAgICBsZXQgZ2VuZXJhdGVkID0gJyc7XG4gICAgZm9yIChjb25zdCBuYW1lIG9mIG5hbWVzKSB7XG4gICAgICBsZXQgY29udGVudCA9IChhd2FpdCByZWFkQ2FjaGUobmFtZSkpID8/ICcnO1xuICAgICAgaWYgKCFjb250ZW50KSB7XG4gICAgICAgIGNvbnN0IHVybCA9IGBodHRwczovL3d3dy50b3B0YWwuY29tL2RldmVsb3BlcnMvZ2l0aWdub3JlL2FwaS8ke25hbWV9YDtcbiAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaCh1cmwpO1xuICAgICAgICBjb25zdCByZXNwb25zZVRleHQgPSBhd2FpdCByZXNwb25zZS50ZXh0KCk7XG4gICAgICAgIGlmICghcmVzcG9uc2Uub2sgfHwgcmVzcG9uc2VUZXh0LmluY2x1ZGVzKCdBdHRlbnRpb24gUmVxdWlyZWQhJykgfHwgcmVzcG9uc2VUZXh0LmluY2x1ZGVzKCc8dGl0bGU+JykpIHtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKGBGYWlsZWQgdG8gZmV0Y2ggJHt1cmx9YCk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNvbnRlbnQgPSByZXNwb25zZVRleHQudHJpbSgpO1xuICAgICAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT4gd3JpdGVDYWNoZShuYW1lLCBjb250ZW50KSk7XG4gICAgICAgIGlmIChvcHRpb25zLmlzVmVyYm9zZSkge1xuICAgICAgICAgIGNvbnNvbGUuaW5mbyhgRmV0Y2hlZCAke3VybH1gKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKGdlbmVyYXRlZCkgZ2VuZXJhdGVkICs9ICdcXG4nO1xuICAgICAgZ2VuZXJhdGVkICs9IGNvbnRlbnQgKyAnXFxuJztcbiAgICB9XG4gICAgaWYgKCEoYXdhaXQgaWdub3JlRmlsZVV0aWwuaXNCZXJyeVplcm9JbnN0YWxsRW5hYmxlZChmaWxlUGF0aCkpKSB7XG4gICAgICBnZW5lcmF0ZWQgPSBnZW5lcmF0ZWQucmVwbGFjZSgnIS55YXJuL2NhY2hlJywgJyMgIS55YXJuL2NhY2hlJykucmVwbGFjZSgnIyAucG5wLionLCAnLnBucC4qJyk7XG4gICAgfVxuICAgIGlmIChjb25maWcuZG9lc0NvbnRhaW5Qb21YbWwgfHwgY29uZmlnLmRvZXNDb250YWluUHVic3BlY1lhbWwpIHtcbiAgICAgIGdlbmVyYXRlZCA9IGdlbmVyYXRlZFxuICAgICAgICAucmVwbGFjZUFsbCgvXiMgLmlkZWFcXC9hcnRpZmFjdHMkL2dtLCAnLmlkZWEvYXJ0aWZhY3RzJylcbiAgICAgICAgLnJlcGxhY2VBbGwoL14jIC5pZGVhXFwvY29tcGlsZXIueG1sJC9nbSwgJy5pZGVhL2NvbXBpbGVyLnhtbCcpXG4gICAgICAgIC5yZXBsYWNlQWxsKC9eIyAuaWRlYVxcL2phclJlcG9zaXRvcmllcy54bWwkL2dtLCAnLmlkZWEvamFyUmVwb3NpdG9yaWVzLnhtbCcpXG4gICAgICAgIC5yZXBsYWNlQWxsKC9eIyAuaWRlYVxcL21vZHVsZXMueG1sJC9nbSwgJy5pZGVhL21vZHVsZXMueG1sJylcbiAgICAgICAgLnJlcGxhY2VBbGwoL14jIC5pZGVhXFwvKi5pbWwkL2dtLCAnLmlkZWEvKi5pbWwnKVxuICAgICAgICAucmVwbGFjZUFsbCgvXiMgLmlkZWFcXC9tb2R1bGVzJC9nbSwgJy5pZGVhL21vZHVsZXMnKVxuICAgICAgICAucmVwbGFjZUFsbCgvXiMgKi5pbWwkL2dtLCAnKi5pbWwnKVxuICAgICAgICAucmVwbGFjZUFsbCgvXiMgKi5pcHIkL2dtLCAnKi5pcHInKTtcbiAgICAgIGlmIChjb25maWcuZG9lc0NvbnRhaW5QdWJzcGVjWWFtbCkge1xuICAgICAgICBnZW5lcmF0ZWQgPSBnZW5lcmF0ZWQucmVwbGFjZUFsbCgvXi5pZGVhXFwvbW9kdWxlcy54bWwkL2dtLCAnIyAuaWRlYS9tb2R1bGVzLnhtbCcpO1xuICAgICAgfVxuICAgIH1cbiAgICBnZW5lcmF0ZWQgPSBnZW5lcmF0ZWQucmVwbGFjZUFsbCgvXi5pZGVhXFwvPyQvZ20sICcjIC5pZGVhJyk7XG4gICAgaWYgKHJvb3RDb25maWcuZGVwZW5kaW5nLnJlYWN0TmF0aXZlIHx8IGNvbmZpZy5kZXBlbmRpbmcucmVhY3ROYXRpdmUgfHwgY29uZmlnLmRvZXNDb250YWluUHVic3BlY1lhbWwpIHtcbiAgICAgIGdlbmVyYXRlZCA9IGdlbmVyYXRlZC5yZXBsYWNlQWxsKC9eKC5pZGVhXFwvLispJC9nbSwgJyQxXFxuYW5kcm9pZC8kMScpO1xuICAgIH1cbiAgICBjb25zdCBuZXdDb250ZW50ID0gaGVhZFVzZXJDb250ZW50ICsgJ1xcbicgKyBnZW5lcmF0ZWQgKyB0YWlsVXNlckNvbnRlbnQ7XG4gICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzVXRpbC5nZW5lcmF0ZUZpbGUoZmlsZVBhdGgsIG5ld0NvbnRlbnQpKTtcbiAgfSk7XG59XG5cbmNvbnN0IGRpclBhdGggPSBwYXRoLmpvaW4ob3MuaG9tZWRpcigpLCAnLmNhY2hlJywgJ3diZnknLCAnZ2l0aWdub3JlJyk7XG5cbmFzeW5jIGZ1bmN0aW9uIHdyaXRlQ2FjaGUobmFtZTogc3RyaW5nLCBjb250ZW50OiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgYXdhaXQgZnMucHJvbWlzZXMubWtkaXIoZGlyUGF0aCwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gIGF3YWl0IGZzLnByb21pc2VzLndyaXRlRmlsZShwYXRoLmpvaW4oZGlyUGF0aCwgbmFtZSksIGNvbnRlbnQpO1xufVxuXG5hc3luYyBmdW5jdGlvbiByZWFkQ2FjaGUobmFtZTogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmcgfCB1bmRlZmluZWQ+IHtcbiAgdHJ5IHtcbiAgICBjb25zdCBzdGF0ID0gYXdhaXQgZnMucHJvbWlzZXMuc3RhdChwYXRoLmpvaW4oZGlyUGF0aCwgbmFtZSkpO1xuICAgIGlmIChEYXRlLm5vdygpIC0gc3RhdC5tdGltZU1zID4gNiAqIDYwICogNjAgKiAxMDAwKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHJldHVybiBhd2FpdCBmcy5wcm9taXNlcy5yZWFkRmlsZShwYXRoLmpvaW4oZGlyUGF0aCwgbmFtZSksICd1dGY4Jyk7XG4gIH0gY2F0Y2gge1xuICAgIC8vIGRvIG5vdGhpbmdcbiAgfVxufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZXh0ZW5zaW9ucyB9IGZyb20gJy4uL3V0aWxzL2V4dGVuc2lvbnMuanMnO1xuaW1wb3J0IHsgZnNVdGlsIH0gZnJvbSAnLi4vdXRpbHMvZnNVdGlsLmpzJztcbmltcG9ydCB7IGRvZXNDb250YWluSmF2YSwgZG9lc0NvbnRhaW5Kc09yVHMgfSBmcm9tICcuLi91dGlscy9wYWNrYWdlQ2FwYWJpbGl0aWVzLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuXG4vLyBLZWVwIHBhY2thZ2UtbWFuYWdlciBzaGltcyBpbiB0aGUgRmlsZSBXYXRjaGVyIHByb2dyYW0gZmllbGQgc28gbm9kZSBkb2VzIG5vdFxuLy8gcGFyc2Ugd3JhcHBlciBzY3JpcHRzIHBhc3NlZCB0aHJvdWdoIGFyZ3VtZW50cy5cbmNvbnN0IG94Zm10UHJvZ3JhbSA9ICckUHJvamVjdEZpbGVEaXIkL25vZGVfbW9kdWxlcy8uYmluL294Zm10JztcbmNvbnN0IHByZXR0aWVyUHJvZ3JhbSA9ICckUHJvamVjdEZpbGVEaXIkL25vZGVfbW9kdWxlcy8uYmluL3ByZXR0aWVyJztcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlSWRlYVNldHRpbmdzKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2dlbmVyYXRlSWRlYVNldHRpbmdzJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IGRpclBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICcuaWRlYScpO1xuICAgIGlmIChmcy5leGlzdHNTeW5jKGRpclBhdGgpKSB7XG4gICAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShkaXJQYXRoLCAnd2F0Y2hlclRhc2tzLnhtbCcpO1xuICAgICAgYXdhaXQgKGRvZXNDb250YWluSnNPclRzKGNvbmZpZykgfHwgZG9lc0NvbnRhaW5KYXZhKGNvbmZpZylcbiAgICAgICAgPyBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnNVdGlsLmdlbmVyYXRlRmlsZShmaWxlUGF0aCwgZ2V0V2F0Y2hlclRhc2tzQ29udGVudChjb25maWcpKSlcbiAgICAgICAgOiBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnMucHJvbWlzZXMucm0oZmlsZVBhdGgsIHsgZm9yY2U6IHRydWUgfSkpKTtcbiAgICB9XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBnZXRXYXRjaGVyVGFza3NDb250ZW50KGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IHN0cmluZyB7XG4gIGNvbnN0IHRhc2tPcHRpb25zID0gW1xuICAgIHtcbiAgICAgIGFyZ3M6ICctLXdyaXRlIC0tbm8tZXJyb3Itb24tdW5tYXRjaGVkLXBhdHRlcm4gISoqL3BhY2thZ2UuanNvbicsXG4gICAgICBjb25kaXRpb246IGRvZXNDb250YWluSnNPclRzKGNvbmZpZyksXG4gICAgICBleHRlbnNpb25zOiBleHRlbnNpb25zLm94Zm10LFxuICAgICAgbmFtZTogJ094Zm10JyxcbiAgICAgIHByb2dyYW06IG94Zm10UHJvZ3JhbSxcbiAgICB9LFxuICAgIHtcbiAgICAgIGFyZ3M6ICctLWNhY2hlIC0td3JpdGUnLFxuICAgICAgY29uZGl0aW9uOiBkb2VzQ29udGFpbkphdmEoY29uZmlnKSxcbiAgICAgIGV4dGVuc2lvbnM6IGV4dGVuc2lvbnMucHJldHRpZXJPbmx5LFxuICAgICAgbmFtZTogJ1ByZXR0aWVyJyxcbiAgICAgIHByb2dyYW06IHByZXR0aWVyUHJvZ3JhbSxcbiAgICB9LFxuICBdXG4gICAgLmZpbHRlcigodGFzaykgPT4gdGFzay5jb25kaXRpb24pXG4gICAgLmZsYXRNYXAoKHRhc2spID0+IHRhc2suZXh0ZW5zaW9ucy5tYXAoKGV4dCkgPT4gY3JlYXRlVGFza09wdGlvbnModGFzay5wcm9ncmFtLCB0YXNrLmFyZ3MsIHRhc2submFtZSwgZXh0KSkpO1xuXG4gIHJldHVybiBgPD94bWwgdmVyc2lvbj1cIjEuMFwiIGVuY29kaW5nPVwiVVRGLThcIj8+XG48cHJvamVjdCB2ZXJzaW9uPVwiNFwiPlxuICA8Y29tcG9uZW50IG5hbWU9XCJQcm9qZWN0VGFza3NPcHRpb25zXCI+XG4gICAgJHt0YXNrT3B0aW9ucy5qb2luKCcnKX1cbiAgPC9jb21wb25lbnQ+XG48L3Byb2plY3Q+XG5gO1xufVxuXG5mdW5jdGlvbiBjcmVhdGVUYXNrT3B0aW9ucyhydW5uZXI6IHN0cmluZywgYXJnczogc3RyaW5nLCBuYW1lOiBzdHJpbmcsIGV4dGVuc2lvbjogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIGAgICAgPFRhc2tPcHRpb25zIGlzRW5hYmxlZD1cInRydWVcIj5cbiAgICAgIDxvcHRpb24gbmFtZT1cImFyZ3VtZW50c1wiIHZhbHVlPVwiJHthcmdzfSAkRmlsZVBhdGhSZWxhdGl2ZVRvUHJvamVjdFJvb3QkXCIgLz5cbiAgICAgIDxvcHRpb24gbmFtZT1cImNoZWNrU3ludGF4RXJyb3JzXCIgdmFsdWU9XCJmYWxzZVwiIC8+XG4gICAgICA8b3B0aW9uIG5hbWU9XCJkZXNjcmlwdGlvblwiIC8+XG4gICAgICA8b3B0aW9uIG5hbWU9XCJleGl0Q29kZUJlaGF2aW9yXCIgdmFsdWU9XCJFUlJPUlwiIC8+XG4gICAgICA8b3B0aW9uIG5hbWU9XCJmaWxlRXh0ZW5zaW9uXCIgdmFsdWU9XCIke2V4dGVuc2lvbn1cIiAvPlxuICAgICAgPG9wdGlvbiBuYW1lPVwiaW1tZWRpYXRlU3luY1wiIHZhbHVlPVwiZmFsc2VcIiAvPlxuICAgICAgPG9wdGlvbiBuYW1lPVwibmFtZVwiIHZhbHVlPVwiJHtuYW1lfSAoLiR7ZXh0ZW5zaW9ufSlcIiAvPlxuICAgICAgPG9wdGlvbiBuYW1lPVwib3V0cHV0XCIgdmFsdWU9XCIkRmlsZVBhdGhSZWxhdGl2ZVRvUHJvamVjdFJvb3QkXCIgLz5cbiAgICAgIDxvcHRpb24gbmFtZT1cIm91dHB1dEZpbHRlcnNcIj5cbiAgICAgICAgPGFycmF5IC8+XG4gICAgICA8L29wdGlvbj5cbiAgICAgIDxvcHRpb24gbmFtZT1cIm91dHB1dEZyb21TdGRvdXRcIiB2YWx1ZT1cImZhbHNlXCIgLz5cbiAgICAgIDxvcHRpb24gbmFtZT1cInByb2dyYW1cIiB2YWx1ZT1cIiR7cnVubmVyfVwiIC8+XG4gICAgICA8b3B0aW9uIG5hbWU9XCJydW5PbkV4dGVybmFsQ2hhbmdlc1wiIHZhbHVlPVwiZmFsc2VcIiAvPlxuICAgICAgPG9wdGlvbiBuYW1lPVwic2NvcGVOYW1lXCIgdmFsdWU9XCJQcm9qZWN0IEZpbGVzXCIgLz5cbiAgICAgIDxvcHRpb24gbmFtZT1cInRyYWNrT25seVJvb3RcIiB2YWx1ZT1cImZhbHNlXCIgLz5cbiAgICAgIDxvcHRpb24gbmFtZT1cIndvcmtpbmdEaXJcIiB2YWx1ZT1cIiRQcm9qZWN0RmlsZURpciRcIiAvPlxuICAgICAgPGVudnMgLz5cbiAgICA8L1Rhc2tPcHRpb25zPlxuYDtcbn1cbiIsImltcG9ydCB0eXBlIHsgUGFja2FnZUpzb24gfSBmcm9tICd0eXBlLWZlc3QnO1xuXG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcblxuZXhwb3J0IGZ1bmN0aW9uIGdldEdlbkkxOG5Uc0NvbW1hbmQoXG4gIGNvbmZpZzogUGljazxQYWNrYWdlQ29uZmlnLCAnZGVwZW5kaW5nJyB8ICdpc0J1bic+LFxuICBzY3JpcHRzOiBQYWNrYWdlSnNvbi5TY3JpcHRzIHwgdW5kZWZpbmVkXG4pOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBpZiAoIWNvbmZpZy5kZXBlbmRpbmcuZ2VuSTE4blRzIHx8ICFzY3JpcHRzPy5bJ2dlbi1pMThuLXRzJ10pIHJldHVybiB1bmRlZmluZWQ7XG4gIHJldHVybiBgJHtjb25maWcuaXNCdW4gPyAnYnVuJyA6ICd5YXJuJ30gcnVuIGdlbi1pMThuLXRzID4gL2Rldi9udWxsYDtcbn1cbiIsImltcG9ydCB0eXBlIHsgU3Bhd25TeW5jT3B0aW9ucyB9IGZyb20gJ25vZGU6Y2hpbGRfcHJvY2Vzcyc7XG5pbXBvcnQgY2hpbGRfcHJvY2VzcyBmcm9tICdub2RlOmNoaWxkX3Byb2Nlc3MnO1xuXG5leHBvcnQgZnVuY3Rpb24gc3Bhd25TeW5jKGNvbW1hbmQ6IHN0cmluZywgYXJnczogc3RyaW5nW10sIGN3ZDogc3RyaW5nLCByZXRyeSA9IDApOiB2b2lkIHtcbiAgc3Bhd25TeW5jQW5kUmV0dXJuU3RhdHVzKGNvbW1hbmQsIGFyZ3MsIGN3ZCwgcmV0cnkpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gc3Bhd25TeW5jQW5kUmV0dXJuU3RhdHVzKGNvbW1hbmQ6IHN0cmluZywgYXJnczogc3RyaW5nW10sIGN3ZDogc3RyaW5nLCByZXRyeSA9IDApOiBudW1iZXIge1xuICBkbyB7XG4gICAgY29uc3QgW25ld0NtZCwgbmV3QXJncywgb3B0aW9uc10gPSBnZXRTcGF3blN5bmNBcmdzKGNvbW1hbmQsIGFyZ3MsIGN3ZCk7XG4gICAgY29uc29sZS5sb2coYCQgJHtuZXdDbWR9ICR7bmV3QXJncy5qb2luKCcgJyl9IGF0ICR7Y3dkfWApO1xuICAgIGNvbnN0IHJldCA9IGNoaWxkX3Byb2Nlc3Muc3Bhd25TeW5jKG5ld0NtZCwgbmV3QXJncywgb3B0aW9ucyk7XG4gICAgY29uc3Qgc3RhdHVzID0gcmV0LnN0YXR1cyA/PyAxO1xuICAgIGlmIChzdGF0dXMgPT09IDApIGJyZWFrO1xuICAgIGlmIChyZXRyeSA8PSAwKSByZXR1cm4gc3RhdHVzO1xuICB9IHdoaWxlICgtLXJldHJ5ID49IDApO1xuICByZXR1cm4gMDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHNwYXduU3luY0FuZFJldHVyblN0ZG91dChjb21tYW5kOiBzdHJpbmcsIGFyZ3M6IHN0cmluZ1tdLCBjd2Q6IHN0cmluZyk6IHN0cmluZyB7XG4gIGNvbnN0IFtuZXdDbWQsIG5ld0FyZ3MsIG9wdGlvbnNdID0gZ2V0U3Bhd25TeW5jQXJncyhjb21tYW5kLCBhcmdzLCBjd2QpO1xuICBvcHRpb25zLnN0ZGlvID0gJ3BpcGUnO1xuICBjb25zdCBwcm9jID0gY2hpbGRfcHJvY2Vzcy5zcGF3blN5bmMobmV3Q21kLCBuZXdBcmdzLCBvcHRpb25zKTtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bm5lY2Vzc2FyeS1jb25kaXRpb24gLS0gc3Bhd25TeW5jIHJldHVybnMgbnVsbCBzdGRlcnIgb24gRU5PRU5ULlxuICBjb25zdCBzdGRlcnIgPSBwcm9jLnN0ZGVyciA/PyAnJztcbiAgY29uc3QgZXJyb3IgPSB0eXBlb2Ygc3RkZXJyID09PSAnc3RyaW5nJyA/IHN0ZGVyci50cmltKCkgOiBzdGRlcnIudG9TdHJpbmcoKS50cmltKCk7XG4gIGlmIChwcm9jLmVycm9yKSB7XG4gICAgY29uc29sZS5lcnJvcihgJHtuZXdDbWR9IFske25ld0FyZ3MubWFwKChzKSA9PiBgXCIke3N9XCJgKS5qb2luKCcsICcpfV0gZmFpbGVkIHdpdGg6ICR7cHJvYy5lcnJvci5tZXNzYWdlfWApO1xuICB9IGVsc2UgaWYgKGVycm9yKSB7XG4gICAgY29uc29sZS5lcnJvcihcbiAgICAgIGAke25ld0NtZH0gWyR7bmV3QXJncy5tYXAoKHMpID0+IGBcIiR7c31cImApLmpvaW4oJywgJyl9XSBvdXRwdXRzIHRoZSBmb2xsb3dpbmcgY29udGVudCB0byBzdGRlcnI6XFxuJHtlcnJvcn1gXG4gICAgKTtcbiAgfVxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVubmVjZXNzYXJ5LWNvbmRpdGlvbiAtLSBzcGF3blN5bmMgcmV0dXJucyBudWxsIHN0ZG91dCBvbiBFTk9FTlQuXG4gIGNvbnN0IHN0ZG91dCA9IHByb2Muc3Rkb3V0ID8/ICcnO1xuICByZXR1cm4gdHlwZW9mIHN0ZG91dCA9PT0gJ3N0cmluZycgPyBzdGRvdXQudHJpbSgpIDogc3Rkb3V0LnRvU3RyaW5nKCkudHJpbSgpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0U3Bhd25TeW5jQXJncyhjb21tYW5kOiBzdHJpbmcsIGFyZ3M6IHN0cmluZ1tdLCBjd2Q6IHN0cmluZyk6IFtzdHJpbmcsIHN0cmluZ1tdLCBTcGF3blN5bmNPcHRpb25zXSB7XG4gIGNvbnN0IGVudiA9IHsgLi4ucHJvY2Vzcy5lbnYgfTtcbiAgLy8gUmVtb3ZlIGJlcnJ5IGZyb20gUEFUSFxuICBpZiAoZW52LlBBVEggJiYgZW52LkJFUlJZX0JJTl9GT0xERVIpIHtcbiAgICBlbnYuUEFUSCA9IGVudi5QQVRILnNwbGl0KCc6JylcbiAgICAgIC5maWx0ZXIoKHApID0+IHAgIT09IGVudi5CRVJSWV9CSU5fRk9MREVSKVxuICAgICAgLmpvaW4oJzonKTtcbiAgfVxuXG4gIHJldHVybiBbXG4gICAgY29tbWFuZCxcbiAgICBhcmdzLFxuICAgIHtcbiAgICAgIGN3ZCxcbiAgICAgIGVudixcbiAgICAgIGVuY29kaW5nOiAndXRmOCcsXG4gICAgICBzaGVsbDogZmFsc2UsXG4gICAgICBzdGRpbzogJ2luaGVyaXQnLFxuICAgIH0sXG4gIF07XG59XG4iLCJpbXBvcnQgY2hpbGRQcm9jZXNzIGZyb20gJ25vZGU6Y2hpbGRfcHJvY2Vzcyc7XG5cbmltcG9ydCB7IE9jdG9raXQgfSBmcm9tICdAb2N0b2tpdC9jb3JlJztcblxuY2xhc3MgR2l0SHViVXRpbCB7XG4gIGdldE9yZ0FuZE5hbWUodXJsT3JGdWxsTmFtZTogc3RyaW5nKTogW3N0cmluZywgc3RyaW5nXSB7XG4gICAgY29uc3QgdXJsV2l0aG91dFByb3RvY29sID0gdXJsT3JGdWxsTmFtZS5zcGxpdCgnOicpLmF0KC0xKTtcbiAgICBjb25zdCBuYW1lcyA9IHVybFdpdGhvdXRQcm90b2NvbD8uc3BsaXQoJy8nKTtcbiAgICBjb25zdCBvcmcgPSBuYW1lcz8uYXQoLTIpID8/ICcnO1xuICAgIGNvbnN0IG5hbWUgPSBuYW1lcz8uYXQoLTEpPy5yZXBsYWNlKC8uZ2l0JC8sICcnKSA/PyAnJztcbiAgICByZXR1cm4gW29yZywgbmFtZV07XG4gIH1cbn1cbmV4cG9ydCBjb25zdCBnaXRIdWJVdGlsID0gbmV3IEdpdEh1YlV0aWwoKTtcblxuY29uc3Qgb2N0b2tpdENhY2hlID0gbmV3IE1hcDxzdHJpbmcsIE9jdG9raXQ+KCk7XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRPY3Rva2l0KG93bmVyPzogc3RyaW5nKTogT2N0b2tpdCB7XG4gIGNvbnN0IGtleSA9IG93bmVyID8/ICcnO1xuICBjb25zdCBjYWNoZWQgPSBvY3Rva2l0Q2FjaGUuZ2V0KGtleSk7XG4gIGlmIChjYWNoZWQpIHJldHVybiBjYWNoZWQ7XG5cbiAgY29uc3Qgb2N0b2tpdCA9IG5ldyBPY3Rva2l0KHtcbiAgICBhdXRoOiBnZXRHaXRIdWJUb2tlbihvd25lcikgfHwgdW5kZWZpbmVkLFxuICB9KTtcbiAgb2N0b2tpdENhY2hlLnNldChrZXksIG9jdG9raXQpO1xuICByZXR1cm4gb2N0b2tpdDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGhhc0dpdEh1YlRva2VuKG93bmVyOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgcmV0dXJuICEhZ2V0R2l0SHViVG9rZW4ob3duZXIpO1xufVxuXG5mdW5jdGlvbiBnZXRHaXRIdWJUb2tlbihvd25lcj86IHN0cmluZyk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGlmIChvd25lciA9PT0gJ1dpbGxCb29zdGVyJykge1xuICAgIHJldHVybiBwcm9jZXNzLmVudi5HSF9CT1RfUEFUX0ZPUl9XSUxMQk9PU1RFUiB8fCBnZXRHaXRIdWJDbGlUb2tlbigpO1xuICB9XG4gIGlmIChvd25lciA9PT0gJ1dpbGxCb29zdGVyTGFiJykge1xuICAgIHJldHVybiBwcm9jZXNzLmVudi5HSF9CT1RfUEFUX0ZPUl9XSUxMQk9PU1RFUkxBQiB8fCBnZXRHaXRIdWJDbGlUb2tlbigpO1xuICB9XG4gIHJldHVybiAoXG4gICAgcHJvY2Vzcy5lbnYuR0hfQk9UX1BBVF9GT1JfV0lMTEJPT1NURVIgfHxcbiAgICBwcm9jZXNzLmVudi5HSF9CT1RfUEFUX0ZPUl9XSUxMQk9PU1RFUkxBQiB8fFxuICAgIHByb2Nlc3MuZW52LkdIX1RPS0VOIHx8XG4gICAgcHJvY2Vzcy5lbnYuR0lUSFVCX1RPS0VOIHx8XG4gICAgZ2V0R2l0SHViQ2xpVG9rZW4oKVxuICApO1xufVxuXG5sZXQgZ2l0SHViQ2xpVG9rZW46IHN0cmluZyB8IHVuZGVmaW5lZDtcblxuZnVuY3Rpb24gZ2V0R2l0SHViQ2xpVG9rZW4oKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgaWYgKGdpdEh1YkNsaVRva2VuICE9PSB1bmRlZmluZWQpIHJldHVybiBnaXRIdWJDbGlUb2tlbiB8fCB1bmRlZmluZWQ7XG5cbiAgdHJ5IHtcbiAgICAvLyBTb21lIGxvY2FsIHJ1bnMgcmVseSBvbiBHaXRIdWIgQ0xJIGF1dGhlbnRpY2F0aW9uIGluc3RlYWQgb2YgZXhwb3J0ZWQgZW52IHRva2Vucy5cbiAgICBnaXRIdWJDbGlUb2tlbiA9XG4gICAgICBjaGlsZFByb2Nlc3NcbiAgICAgICAgLmV4ZWNGaWxlU3luYygnZ2gnLCBbJ2F1dGgnLCAndG9rZW4nXSwge1xuICAgICAgICAgIGVuY29kaW5nOiAndXRmOCcsXG4gICAgICAgICAgc3RkaW86IFsnaWdub3JlJywgJ3BpcGUnLCAnaWdub3JlJ10sXG4gICAgICAgIH0pXG4gICAgICAgIC50cmltKCkgfHwgJyc7XG4gIH0gY2F0Y2gge1xuICAgIGdpdEh1YkNsaVRva2VuID0gJyc7XG4gIH1cbiAgcmV0dXJuIGdpdEh1YkNsaVRva2VuIHx8IHVuZGVmaW5lZDtcbn1cbiIsImltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuXG5leHBvcnQgY29uc3QgbWFuYWdlZFRzY29uZmlnQmFzZURlcGVuZGVuY2llcyA9IFtcbiAgJ0B0c2NvbmZpZy9idW4nLFxuICAnQHRzY29uZmlnL25vZGUtbHRzJyxcbiAgJ0B0c2NvbmZpZy9ub2RlLXRzJyxcbiAgJ0B0c2NvbmZpZy9yZWFjdC1uYXRpdmUnLFxuXTtcblxuZXhwb3J0IGZ1bmN0aW9uIGdldFRzY29uZmlnRXh0ZW5kcyhjb25maWc6IFBhY2thZ2VDb25maWcpOiBzdHJpbmcgfCBzdHJpbmdbXSB7XG4gIGlmIChjb25maWcuaXNCdW4pIHtcbiAgICByZXR1cm4gJ0B0c2NvbmZpZy9idW4vdHNjb25maWcuanNvbic7XG4gIH1cbiAgaWYgKGNvbmZpZy5kZXBlbmRpbmcucmVhY3ROYXRpdmUpIHtcbiAgICByZXR1cm4gJ0B0c2NvbmZpZy9yZWFjdC1uYXRpdmUvdHNjb25maWcuanNvbic7XG4gIH1cbiAgcmV0dXJuIFsnQHRzY29uZmlnL25vZGUtbHRzL3RzY29uZmlnLmpzb24nLCAnQHRzY29uZmlnL25vZGUtdHMvdHNjb25maWcuanNvbiddO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0VHNjb25maWdCYXNlRGVwZW5kZW5jaWVzKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IHN0cmluZ1tdIHtcbiAgaWYgKGNvbmZpZy5kZXBlbmRpbmcuYmxpdHogfHwgY29uZmlnLmRlcGVuZGluZy5uZXh0KSB7XG4gICAgcmV0dXJuIFtdO1xuICB9XG4gIGlmIChjb25maWcuaXNCdW4pIHtcbiAgICByZXR1cm4gWydAdHNjb25maWcvYnVuJ107XG4gIH1cbiAgaWYgKGNvbmZpZy5kZXBlbmRpbmcucmVhY3ROYXRpdmUpIHtcbiAgICByZXR1cm4gWydAdHNjb25maWcvcmVhY3QtbmF0aXZlJ107XG4gIH1cbiAgcmV0dXJuIFsnQHRzY29uZmlnL25vZGUtbHRzJywgJ0B0c2NvbmZpZy9ub2RlLXRzJ107XG59XG4iLCJpbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcblxuZXhwb3J0IGZ1bmN0aW9uIGlzUHVibGlzaGVkV2lsbGJvb3N0ZXJDb25maWdzUGFja2FnZShjb25maWc6IFBhY2thZ2VDb25maWcpOiBib29sZWFuIHtcbiAgcmV0dXJuIChcbiAgICBjb25maWcuaXNXaWxsQm9vc3RlckNvbmZpZ3MgJiZcbiAgICAhY29uZmlnLmlzUm9vdCAmJlxuICAgIGNvbmZpZy5wYWNrYWdlSnNvbj8ucHJpdmF0ZSAhPT0gdHJ1ZSAmJlxuICAgIEFycmF5LmlzQXJyYXkoY29uZmlnLnBhY2thZ2VKc29uPy5maWxlcykgJiZcbiAgICBjb25maWcucGFja2FnZUpzb24uZmlsZXMubGVuZ3RoID4gMFxuICApO1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcbmltcG9ydCB7IGZpbGVVUkxUb1BhdGggfSBmcm9tICdub2RlOnVybCc7XG5cbmltcG9ydCBtZXJnZSBmcm9tICdkZWVwbWVyZ2UnO1xuaW1wb3J0IGZnIGZyb20gJ2Zhc3QtZ2xvYic7XG5pbXBvcnQgc2VtdmVyIGZyb20gJ3NlbXZlcic7XG5pbXBvcnQgeyBzb3J0UGFja2FnZUpzb24gfSBmcm9tICdzb3J0LXBhY2thZ2UtanNvbic7XG5pbXBvcnQgdHMgZnJvbSAndHlwZXNjcmlwdCc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VKc29uLCBTZXRSZXF1aXJlZCB9IGZyb20gJ3R5cGUtZmVzdCc7XG5cbmltcG9ydCB7IGdldExhdGVzdENvbW1pdEhhc2ggfSBmcm9tICcuLi9naXRodWIvY29tbWl0LmpzJztcbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGV4dGVuc2lvbnMgfSBmcm9tICcuLi91dGlscy9leHRlbnNpb25zLmpzJztcbmltcG9ydCB7IGZzVXRpbCB9IGZyb20gJy4uL3V0aWxzL2ZzVXRpbC5qcyc7XG5pbXBvcnQgeyBnZXRHZW5JMThuVHNDb21tYW5kIH0gZnJvbSAnLi4vdXRpbHMvZ2VuSTE4blRzLmpzJztcbmltcG9ydCB7IGdpdEh1YlV0aWwgfSBmcm9tICcuLi91dGlscy9naXRodWJVdGlsLmpzJztcbmltcG9ydCB7IGdsb2JJZ25vcmUgfSBmcm9tICcuLi91dGlscy9nbG9iVXRpbC5qcyc7XG5pbXBvcnQgeyBpZ25vcmVGaWxlVXRpbCB9IGZyb20gJy4uL3V0aWxzL2lnbm9yZUZpbGVVdGlsLmpzJztcbmltcG9ydCB7IGNvbWJpbmVNZXJnZSB9IGZyb20gJy4uL3V0aWxzL21lcmdlVXRpbC5qcyc7XG5pbXBvcnQgeyBkb2VzQ29udGFpbkphdmEsIGRvZXNDb250YWluSnNPclRzIH0gZnJvbSAnLi4vdXRpbHMvcGFja2FnZUNhcGFiaWxpdGllcy5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcbmltcG9ydCB7IHNwYXduU3luYywgc3Bhd25TeW5jQW5kUmV0dXJuU3Rkb3V0IH0gZnJvbSAnLi4vdXRpbHMvc3Bhd25VdGlsLmpzJztcbmltcG9ydCB7IGdldFRzY29uZmlnQmFzZURlcGVuZGVuY2llcywgbWFuYWdlZFRzY29uZmlnQmFzZURlcGVuZGVuY2llcyB9IGZyb20gJy4uL3V0aWxzL3RzY29uZmlnQmFzZS5qcyc7XG5pbXBvcnQgeyBpc1B1Ymxpc2hlZFdpbGxib29zdGVyQ29uZmlnc1BhY2thZ2UgfSBmcm9tICcuLi91dGlscy93aWxsYm9vc3RlckNvbmZpZ3NVdGlsLmpzJztcblxuY29uc3Qgb3hsaW50RGVwcyA9IFsnQHdpbGxib29zdGVyL294Zm10LWNvbmZpZycsICdAd2lsbGJvb3N0ZXIvb3hsaW50LWNvbmZpZycsICdveGZtdCcsICdveGxpbnQnLCAnb3hsaW50LXRzZ29saW50J107XG5jb25zdCB0eXBlc2NyaXB0R29EZXBlbmRlbmN5ID0gJ0B0eXBlc2NyaXB0L25hdGl2ZS1wcmV2aWV3JztcbmNvbnN0IHR5cGVzY3JpcHREZXBlbmRlbmN5ID0gJ3R5cGVzY3JpcHQnO1xuY29uc3Qgd2JEZXBlbmRlbmN5ID0gJ0B3aWxsYm9vc3Rlci93Yic7XG5jb25zdCBidWlsZFRzRGVwZW5kZW5jeSA9ICdidWlsZC10cyc7XG5jb25zdCB3YmZ5UGFja2FnZUpzb24gPSByZWFkV2JmeVBhY2thZ2VKc29uKCk7XG5jb25zdCBtYW5hZ2VkRGVwZW5kZW5jeVZlcnNpb25zID0ge1xuICAuLi53YmZ5UGFja2FnZUpzb24uZGVwZW5kZW5jaWVzLFxuICAuLi53YmZ5UGFja2FnZUpzb24uZGV2RGVwZW5kZW5jaWVzLFxuICAuLi53YmZ5UGFja2FnZUpzb24ucGVlckRlcGVuZGVuY2llcyxcbn07XG5jb25zdCBiYXNlbGluZU1hbmFnZWREZXBlbmRlbmNpZXMgPSBuZXcgU2V0KFt3YkRlcGVuZGVuY3ksIGJ1aWxkVHNEZXBlbmRlbmN5LCAuLi5veGxpbnREZXBzXSk7XG5jb25zdCB3aWxsQm9vc3RlckNvbmZpZ3NNYW5hZ2VkRGVwZW5kZW5jaWVzID0gW1xuICAnQHdpbGxib29zdGVyL3ByZXR0aWVyLWNvbmZpZycsXG4gIC4uLm94bGludERlcHMuZmlsdGVyKChkZXBlbmRlbmN5KSA9PiBkZXBlbmRlbmN5LnN0YXJ0c1dpdGgoJ0B3aWxsYm9vc3Rlci8nKSksXG5dO1xuY29uc3Qgb2Jzb2xldGVMaW50RGVwZW5kZW5jaWVzID0gW1xuICAnQGJpb21lanMvYmlvbWUnLFxuICAnQGVzbGludC1yZWFjdC9lc2xpbnQtcGx1Z2luJyxcbiAgJ0Blc2xpbnQvanMnLFxuICAnQG5leHQvZXNsaW50LXBsdWdpbi1uZXh0JyxcbiAgJ0B0eXBlcy9lc2xpbnQnLFxuICAnQHR5cGVzL21pY3JvbWF0Y2gnLFxuICAnQHR5cGVzY3JpcHQtZXNsaW50L2VzbGludC1wbHVnaW4nLFxuICAnQHR5cGVzY3JpcHQtZXNsaW50L3BhcnNlcicsXG4gICdAd2lsbGJvb3N0ZXIvYmlvbWUtY29uZmlnJyxcbiAgJ0B3aWxsYm9vc3Rlci9lc2xpbnQtY29uZmlnJyxcbiAgJ0B3aWxsYm9vc3Rlci9lc2xpbnQtY29uZmlnLWJsaXR6LW5leHQnLFxuICAnQHdpbGxib29zdGVyL2VzbGludC1jb25maWctanMnLFxuICAnQHdpbGxib29zdGVyL2VzbGludC1jb25maWctanMtcmVhY3QnLFxuICAnQHdpbGxib29zdGVyL2VzbGludC1jb25maWctbmV4dCcsXG4gICdAd2lsbGJvb3N0ZXIvZXNsaW50LWNvbmZpZy1yZWFjdCcsXG4gICdAd2lsbGJvb3N0ZXIvZXNsaW50LWNvbmZpZy10cycsXG4gICdAd2lsbGJvb3N0ZXIvZXNsaW50LWNvbmZpZy10cy1yZWFjdCcsXG4gICdiaW9tZScsXG4gICdlc2xpbnQnLFxuICAnZXNsaW50LWNvbmZpZy1mbGF0LWdpdGlnbm9yZScsXG4gICdlc2xpbnQtY29uZmlnLW5leHQnLFxuICAnZXNsaW50LWNvbmZpZy1wcmV0dGllcicsXG4gICdlc2xpbnQtaW1wb3J0LXJlc29sdmVyLW5vZGUnLFxuICAnZXNsaW50LWltcG9ydC1yZXNvbHZlci10eXBlc2NyaXB0JyxcbiAgJ2VzbGludC1wbHVnaW4taW1wb3J0JyxcbiAgJ2VzbGludC1wbHVnaW4taW1wb3J0LXgnLFxuICAnZXNsaW50LXBsdWdpbi1wZXJmZWN0aW9uaXN0JyxcbiAgJ2VzbGludC1wbHVnaW4tcHJldHRpZXInLFxuICAnZXNsaW50LXBsdWdpbi1yZWFjdCcsXG4gICdlc2xpbnQtcGx1Z2luLXJlYWN0LWNvbXBpbGVyJyxcbiAgJ2VzbGludC1wbHVnaW4tcmVhY3QtaG9va3MnLFxuICAnZXNsaW50LXBsdWdpbi1zb3J0LWNsYXNzLW1lbWJlcnMnLFxuICAnZXNsaW50LXBsdWdpbi1zb3J0LWRlc3RydWN0dXJlLWtleXMnLFxuICAnZXNsaW50LXBsdWdpbi1zdG9yeWJvb2snLFxuICAnZXNsaW50LXBsdWdpbi11bmljb3JuJyxcbiAgJ2VzbGludC1wbHVnaW4tdW51c2VkLWltcG9ydHMnLFxuICAnZ2xvYmFscycsXG4gICdtaWNyb21hdGNoJyxcbiAgJ3R5cGVzY3JpcHQtZXNsaW50Jyxcbl07XG5jb25zdCBtaWNyb21hdGNoUGFja2FnZU5hbWVzID0gbmV3IFNldChbJ21pY3JvbWF0Y2gnLCAnQHR5cGVzL21pY3JvbWF0Y2gnXSk7XG5jb25zdCBtaWNyb21hdGNoSW1wb3J0UGF0dGVybiA9XG4gIC9cXGJmcm9tXFxzK1snXCJdbWljcm9tYXRjaFsnXCJdfFxcYnJlcXVpcmVcXChcXHMqWydcIl1taWNyb21hdGNoWydcIl1cXHMqXFwpfFxcYmltcG9ydFxcKFxccypbJ1wiXW1pY3JvbWF0Y2hbJ1wiXVxccypcXCkvdTtcblxuY29uc3QgbGF0ZXN0RGVwZW5kZW5jeVZlcnNpb25DYWNoZSA9IG5ldyBNYXA8c3RyaW5nLCBzdHJpbmc+KCk7XG5jb25zdCBkZXBlbmRlbmN5U2VjdGlvbktleXMgPSBbJ2RlcGVuZGVuY2llcycsICdkZXZEZXBlbmRlbmNpZXMnLCAnb3B0aW9uYWxEZXBlbmRlbmNpZXMnLCAncGVlckRlcGVuZGVuY2llcyddIGFzIGNvbnN0O1xuXG50eXBlIFdyaXRhYmxlUGFja2FnZUpzb24gPSBTZXRSZXF1aXJlZDxcbiAgUGFja2FnZUpzb24sXG4gICdzY3JpcHRzJyB8ICdkZXBlbmRlbmNpZXMnIHwgJ2RldkRlcGVuZGVuY2llcycgfCAncGVlckRlcGVuZGVuY2llcydcbj47XG5cbmludGVyZmFjZSBEZXBlbmRlbmN5VXBkYXRlcyB7XG4gIGRlcGVuZGVuY2llczogc3RyaW5nW107XG4gIGRldkRlcGVuZGVuY2llczogc3RyaW5nW107XG4gIHB5dGhvbkRldkRlcGVuZGVuY2llczogc3RyaW5nW107XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZW5lcmF0ZVBhY2thZ2VKc29uKFxuICBjb25maWc6IFBhY2thZ2VDb25maWcsXG4gIHJvb3RDb25maWc6IFBhY2thZ2VDb25maWcsXG4gIHNraXBBZGRpbmdEZXBzOiBib29sZWFuXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdnZW5lcmF0ZVBhY2thZ2VKc29uJywgYXN5bmMgKCkgPT4ge1xuICAgIGF3YWl0IGNvcmUoY29uZmlnLCByb290Q29uZmlnLCBza2lwQWRkaW5nRGVwcyk7XG4gIH0pO1xufVxuXG5hc3luYyBmdW5jdGlvbiBjb3JlKGNvbmZpZzogUGFja2FnZUNvbmZpZywgcm9vdENvbmZpZzogUGFja2FnZUNvbmZpZywgc2tpcEFkZGluZ0RlcHM6IGJvb2xlYW4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgZmlsZVBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICdwYWNrYWdlLmpzb24nKTtcbiAgY29uc3QganNvbk9iaiA9IGF3YWl0IHJlYWRQYWNrYWdlSnNvbihmaWxlUGF0aCk7XG4gIGNvbnN0IHBhY2thZ2VNYW5hZ2VyID0gY29uZmlnLmlzQnVuID8gJ2J1bicgOiAneWFybic7XG5cbiAgYXdhaXQgcmVtb3ZlRGVwcmVjYXRlZFN0dWZmKGNvbmZpZywganNvbk9iaik7XG4gIGF3YWl0IHVwZGF0ZVNjcmlwdHMoY29uZmlnLCBqc29uT2JqKTtcbiAgbW92ZU1hbmFnZWRUb29sRGVwZW5kZW5jaWVzVG9EZXZEZXBlbmRlbmNpZXMoanNvbk9iaik7XG4gIGNvbnN0IGRlcGVuZGVuY3lVcGRhdGVzID0gYXdhaXQgYXBwbHlQYWNrYWdlSnNvbkNvbnZlbnRpb25zKGNvbmZpZywgcm9vdENvbmZpZywganNvbk9iaik7XG4gIGF3YWl0IG5vcm1hbGl6ZVBhY2thZ2VNZXRhZGF0YShjb25maWcsIHJvb3RDb25maWcsIGpzb25PYmosIGRlcGVuZGVuY3lVcGRhdGVzKTtcbiAgYWRkRGVwZW5kZW5jeVZlcnNpb25zVG9QYWNrYWdlSnNvbihqc29uT2JqLCBkZXBlbmRlbmN5VXBkYXRlcyk7XG4gIGF3YWl0IHVwZGF0ZVByaXZhdGVQYWNrYWdlcyhqc29uT2JqKTtcbiAgcmVtb3ZlRW1wdHlEZXBlbmRlbmN5U2VjdGlvbnMoanNvbk9iaik7XG5cbiAgaWYgKGNvbmZpZy5pc0J1bikgZGVsZXRlIGpzb25PYmoucGFja2FnZU1hbmFnZXI7XG4gIC8vIFlhcm4gcmVhZHMgcGFja2FnZS5qc29uIGZyb20gZGlzayBiZWZvcmUgZGVjaWRpbmcgd2hldGhlciBgeWFybiBhZGQgLURgXG4gIC8vIGNvbmZsaWN0cyB3aXRoIGFuIGV4aXN0aW5nIHJlZ3VsYXIgZGVwZW5kZW5jeSwgc28gdGhpcyB3cml0ZSBtdXN0IGZpbmlzaFxuICAvLyBiZWZvcmUgaW5zdGFsbGluZyB0aGUgbWFuYWdlZCBkZXBlbmRlbmN5IHVwZGF0ZXMgYmVsb3cuIEtlZXAgdGhpcyBiYXNlbGluZVxuICAvLyBmaWxlIHNvcnRlZCBldmVuIHdoZW4gd2UgbGF0ZXIgcnVuIHRoZSB0YXJnZXQgcmVwb3NpdG9yeSdzIGZvcm1hdHRlciBzbyBhXG4gIC8vIG1pZC1ydW4gaW50ZXJydXB0aW9uIG5ldmVyIGxlYXZlcyBwYWNrYWdlLmpzb24gaW4gYSBwYXJ0aWFsbHkgbWFuYWdlZCBvcmRlci5cbiAgYXdhaXQgZnNVdGlsLmdlbmVyYXRlRmlsZShmaWxlUGF0aCwgc2VyaWFsaXplUGFja2FnZUpzb24oanNvbk9iaikpO1xuXG4gIGlmICghc2tpcEFkZGluZ0RlcHMpIHtcbiAgICBpbnN0YWxsRGVwZW5kZW5jeVVwZGF0ZXMoY29uZmlnLCBqc29uT2JqLCBkZXBlbmRlbmN5VXBkYXRlcywgcGFja2FnZU1hbmFnZXIpO1xuICAgIGZvcm1hdFBhY2thZ2VKc29uV2l0aFByb2plY3RGb3JtYXR0ZXIoY29uZmlnLCBwYWNrYWdlTWFuYWdlciwgZmlsZVBhdGgpO1xuICB9XG59XG5cbmZ1bmN0aW9uIHNlcmlhbGl6ZVBhY2thZ2VKc29uKGpzb25PYmo6IFdyaXRhYmxlUGFja2FnZUpzb24pOiBzdHJpbmcge1xuICAvLyBmc1V0aWwuZ2VuZXJhdGVGaWxlKCkgbm9ybWFsaXplcyB0aGUgdHJhaWxpbmcgbmV3bGluZSwgc28ga2VlcCB0aGUgc2VyaWFsaXplclxuICAvLyBmb2N1c2VkIG9uIHRoZSBKU09OIHBheWxvYWQgaXRzZWxmLlxuICByZXR1cm4gSlNPTi5zdHJpbmdpZnkoc29ydFBhY2thZ2VKc29uKGpzb25PYmopLCB1bmRlZmluZWQsIDIpO1xufVxuXG5hc3luYyBmdW5jdGlvbiByZWFkUGFja2FnZUpzb24oZmlsZVBhdGg6IHN0cmluZyk6IFByb21pc2U8V3JpdGFibGVQYWNrYWdlSnNvbj4ge1xuICBjb25zdCBqc29uVGV4dCA9IGF3YWl0IGZzLnByb21pc2VzLnJlYWRGaWxlKGZpbGVQYXRoLCAndXRmOCcpO1xuICBjb25zdCBqc29uT2JqID0gSlNPTi5wYXJzZShqc29uVGV4dCkgYXMgUGFja2FnZUpzb247XG4gIGpzb25PYmouc2NyaXB0cyA9IGpzb25PYmouc2NyaXB0cyA/PyB7fTtcbiAganNvbk9iai5kZXBlbmRlbmNpZXMgPSBqc29uT2JqLmRlcGVuZGVuY2llcyA/PyB7fTtcbiAganNvbk9iai5kZXZEZXBlbmRlbmNpZXMgPSBqc29uT2JqLmRldkRlcGVuZGVuY2llcyA/PyB7fTtcbiAganNvbk9iai5wZWVyRGVwZW5kZW5jaWVzID0ganNvbk9iai5wZWVyRGVwZW5kZW5jaWVzID8/IHt9O1xuICByZXR1cm4ganNvbk9iaiBhcyBXcml0YWJsZVBhY2thZ2VKc29uO1xufVxuXG5hc3luYyBmdW5jdGlvbiB1cGRhdGVTY3JpcHRzKGNvbmZpZzogUGFja2FnZUNvbmZpZywganNvbk9iajogV3JpdGFibGVQYWNrYWdlSnNvbik6IFByb21pc2U8dm9pZD4ge1xuICByZW1vdmVMZWdhY3lJbnN0YWxsQ29tbWFuZHMoanNvbk9iai5zY3JpcHRzKTtcblxuICBqc29uT2JqLnNjcmlwdHMgPSB7IC4uLmpzb25PYmouc2NyaXB0cywgLi4uZ2VuZXJhdGVTY3JpcHRzKGNvbmZpZywganNvbk9iai5zY3JpcHRzKSB9O1xuICBkZWxldGUganNvbk9iai5zY3JpcHRzWydzdGFydC10ZXN0LXNlcnZlciddO1xuXG4gIGNvbnN0IHNjcmlwdHMgPSBqc29uT2JqLnNjcmlwdHM7XG4gIGlmIChjb25maWcuaXNCdW4gfHwgIWRvZXNDb250YWluSmF2YShjb25maWcpKSB7XG4gICAgZGVsZXRlIHNjcmlwdHMucHJldHRpZnk7XG4gIH0gZWxzZSB7XG4gICAgc2NyaXB0cy5wcmV0dGlmeSA9IChzY3JpcHRzLnByZXR0aWZ5ID8/ICcnKSArIChhd2FpdCBnZW5lcmF0ZVByZXR0aWVyU3VmZml4KGNvbmZpZy5kaXJQYXRoKSk7XG4gIH1cbiAgbm9ybWFsaXplWWFybldvcmtzcGFjZUZvcmVhY2hTY3JpcHRzKHNjcmlwdHMpO1xuICBub3JtYWxpemVSYWlsd2F5Q2xpU2NyaXB0KGNvbmZpZywgc2NyaXB0cyk7XG59XG5cbmZ1bmN0aW9uIHJlbW92ZUxlZ2FjeUluc3RhbGxDb21tYW5kcyhzY3JpcHRzOiBQYWNrYWdlSnNvbi5TY3JpcHRzKTogdm9pZCB7XG4gIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKHNjcmlwdHMpKSB7XG4gICAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gJ3N0cmluZycpIGNvbnRpbnVlO1xuICAgIC8vIEZyZXNoIHJlcG9zIHN0aWxsIHJlcXVpcmUgc3RhbmRhbG9uZSBgeWFybiBpbnN0YWxsYDsgb25seSByZW1vdmUgbGVnYWN5IGluc3RhbGwgcHJlZml4ZXMgYmVmb3JlIGFub3RoZXIgY29tbWFuZC5cbiAgICBpZiAoIXZhbHVlLmluY2x1ZGVzKCdnaXQgY2xvbmUnKSkge1xuICAgICAgc2NyaXB0c1trZXldID0gdmFsdWUucmVwbGFjZUFsbCgveWFyblxccyooPzppbnN0YWxsXFxzKik/JiZcXHMqL2d1LCAnJyk7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIG5vcm1hbGl6ZVlhcm5Xb3Jrc3BhY2VGb3JlYWNoU2NyaXB0cyhzY3JpcHRzOiBQYWNrYWdlSnNvbi5TY3JpcHRzKTogdm9pZCB7XG4gIC8vIERlYWwgd2l0aCBicmVha2luZyBjaGFuZ2VzIGluIHlhcm4gYmVycnkgNC4wLjAtcmMuNDlcbiAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMoc2NyaXB0cykpIHtcbiAgICBpZiAoIXZhbHVlPy5pbmNsdWRlcygneWFybiB3b3Jrc3BhY2VzIGZvcmVhY2gnKSkgY29udGludWU7XG4gICAgc2NyaXB0c1trZXldID0gdmFsdWUucmVwbGFjZUFsbChcbiAgICAgIC95YXJuIHdvcmtzcGFjZXMgZm9yZWFjaCg/IVxccysoPzotQXwtUnwtLSg/OmFsbHxyZWN1cnNpdmV8c2luY2V8d29ya3RyZWV8ZnJvbXxpbmNsdWRlfGV4Y2x1ZGV8cHVibGljfHByaXZhdGUpKSkvZ3UsXG4gICAgICAneWFybiB3b3Jrc3BhY2VzIGZvcmVhY2ggLS1hbGwnXG4gICAgKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBub3JtYWxpemVSYWlsd2F5Q2xpU2NyaXB0KGNvbmZpZzogUGFja2FnZUNvbmZpZywgc2NyaXB0czogUGFja2FnZUpzb24uU2NyaXB0cyk6IHZvaWQge1xuICBpZiAoY29uZmlnLmlzQnVuIHx8ICFzY3JpcHRzLnJhaWx3YXk/LmluY2x1ZGVzKCdAcmFpbHdheS9jbGknKSkgcmV0dXJuO1xuXG4gIHNjcmlwdHMucmFpbHdheSA9ICdZQVJOX0VOQUJMRV9TQ1JJUFRTPXRydWUgeWFybiBkbHggQHJhaWx3YXkvY2xpJztcbn1cblxuYXN5bmMgZnVuY3Rpb24gYXBwbHlQYWNrYWdlSnNvbkNvbnZlbnRpb25zKFxuICBjb25maWc6IFBhY2thZ2VDb25maWcsXG4gIHJvb3RDb25maWc6IFBhY2thZ2VDb25maWcsXG4gIGpzb25PYmo6IFdyaXRhYmxlUGFja2FnZUpzb25cbik6IFByb21pc2U8RGVwZW5kZW5jeVVwZGF0ZXM+IHtcbiAgY29uc3QgZGVwZW5kZW5jaWVzOiBzdHJpbmdbXSA9IFtdO1xuICBjb25zdCBkZXZEZXBlbmRlbmNpZXMgPSBbJ3NvcnQtcGFja2FnZS1qc29uJ107XG4gIGNvbnN0IHB5dGhvbkRldkRlcGVuZGVuY2llczogc3RyaW5nW10gPSBbXTtcbiAgY29uc3QgaGFzSmF2YSA9IGRvZXNDb250YWluSmF2YShjb25maWcpO1xuXG4gIGlmIChcbiAgICBoYXNKYXZhICYmXG4gICAgIWZzLmV4aXN0c1N5bmMocGF0aC5qb2luKHJvb3RDb25maWcuZGlyUGF0aCwgJy5wcmV0dGllcnJjLmpzb24nKSkgJiZcbiAgICAhZnMuZXhpc3RzU3luYyhwYXRoLmpvaW4oY29uZmlnLmRpclBhdGgsICcucHJldHRpZXJyYy5qc29uJykpXG4gICkge1xuICAgIGpzb25PYmoucHJldHRpZXIgPSAnQHdpbGxib29zdGVyL3ByZXR0aWVyLWNvbmZpZyc7XG4gICAgZGV2RGVwZW5kZW5jaWVzLnB1c2goJ3ByZXR0aWVyLXBsdWdpbi1qYXZhJywgJ0B3aWxsYm9vc3Rlci9wcmV0dGllci1jb25maWcnKTtcbiAgfVxuICBpZiAoaGFzSmF2YSkge1xuICAgIGRldkRlcGVuZGVuY2llcy5wdXNoKCdwcmV0dGllcicpO1xuICB9IGVsc2Uge1xuICAgIHJlbW92ZVByZXR0aWVyQXJ0aWZhY3RzKGpzb25PYmopO1xuICB9XG5cbiAgZGVsZXRlIGpzb25PYmouZGV2RGVwZW5kZW5jaWVzWydsaW50LXN0YWdlZCddO1xuICBkZWxldGUgKGpzb25PYmogYXMgUGFja2FnZUpzb24gJiB7ICdsaW50LXN0YWdlZCc/OiB1bmtub3duIH0pWydsaW50LXN0YWdlZCddO1xuXG4gIGlmIChjb25maWcuaXNSb290KSB7XG4gICAgZGVsZXRlIGpzb25PYmouZGV2RGVwZW5kZW5jaWVzLmh1c2t5O1xuICAgIGRlbGV0ZSBqc29uT2JqLnNjcmlwdHMucG9zdGluc3RhbGw7XG4gICAgZGVsZXRlIGpzb25PYmouc2NyaXB0cy5wb3N0cHVibGlzaDtcbiAgICBkZWxldGUganNvbk9iai5zY3JpcHRzLnByZXB1Ymxpc2hPbmx5O1xuICAgIGRlbGV0ZSBqc29uT2JqLnNjcmlwdHMucHJlcGFjaztcbiAgICBkZWxldGUganNvbk9iai5zY3JpcHRzLnBvc3RwYWNrO1xuICAgIGpzb25PYmouc2NyaXB0cy5wcmVwYXJlID0gJ2xlZnRob29rIGluc3RhbGwgfHwgdHJ1ZSc7XG4gICAgZGV2RGVwZW5kZW5jaWVzLnB1c2goJ2xlZnRob29rJyk7XG5cbiAgICBpZiAoY29uZmlnLmRlcGVuZGluZy5zZW1hbnRpY1JlbGVhc2UpIHtcbiAgICAgIGlmIChcbiAgICAgICAgIWpzb25PYmouZGV2RGVwZW5kZW5jaWVzWydzZW1hbnRpYy1yZWxlYXNlJ10gJiZcbiAgICAgICAgIWpzb25PYmouZGV2RGVwZW5kZW5jaWVzWydtdWx0aS1zZW1hbnRpYy1yZWxlYXNlJ10gJiZcbiAgICAgICAgIWpzb25PYmouZGV2RGVwZW5kZW5jaWVzWydAcWl3aS9tdWx0aS1zZW1hbnRpYy1yZWxlYXNlJ11cbiAgICAgICkge1xuICAgICAgICBkZXZEZXBlbmRlbmNpZXMucHVzaCgnc2VtYW50aWMtcmVsZWFzZScpO1xuICAgICAgfVxuICAgICAganNvbk9iai52ZXJzaW9uID0gJzAuMC4wLXNlbWFudGljYWxseS1yZWxlYXNlZCc7XG4gICAgfVxuXG4gICAgaWYgKGNvbmZpZy5kZXBlbmRpbmcucGxheXdyaWdodFRlc3QpIHtcbiAgICAgIC8vIFNpbmNlIGFydGlsbGVyeSByZXF1aXJlcyBhIHNwZWNpZmljIHZlcnNpb24gb2YgQHBsYXl3cmlnaHQvdGVzdFxuICAgICAgY29uc3QgaGFzQXJ0aWxsZXJ5ID0ganNvbk9iai5kZXBlbmRlbmNpZXMuYXJ0aWxsZXJ5IHx8IGpzb25PYmouZGV2RGVwZW5kZW5jaWVzLmFydGlsbGVyeTtcbiAgICAgIC8vIFNpbmNlIGxsbS10b29sYm94IHJlcXVpcmVzIEBwbGF5d3JpZ2h0L3Rlc3QgaW4gZGVwZW5kZW5jaWVzXG4gICAgICBpZiAoIWhhc0FydGlsbGVyeSAmJiAhanNvbk9iai5kZXBlbmRlbmNpZXNbJ0BwbGF5d3JpZ2h0L3Rlc3QnXSkge1xuICAgICAgICBkZXZEZXBlbmRlbmNpZXMucHVzaCgnQHBsYXl3cmlnaHQvdGVzdCcpO1xuICAgICAgfVxuICAgICAgZGVsZXRlIGpzb25PYmouZGVwZW5kZW5jaWVzLnBsYXl3cmlnaHQ7XG4gICAgICBkZWxldGUganNvbk9iai5kZXZEZXBlbmRlbmNpZXMucGxheXdyaWdodDtcbiAgICB9XG5cbiAgICBpZiAoY29uZmlnLmRvZXNDb250YWluU3ViUGFja2FnZUpzb25zKSB7XG4gICAgICAvLyBXZSBkb24ndCBhbGxvdyBub24tYXJyYXkgd29ya3NwYWNlcyBpbiBtb25vcmVwby5cbiAgICAgIGpzb25PYmoud29ya3NwYWNlcyA9IEFycmF5LmlzQXJyYXkoanNvbk9iai53b3Jrc3BhY2VzKVxuICAgICAgICA/IG1lcmdlLmFsbChbanNvbk9iai53b3Jrc3BhY2VzLCBbJ3BhY2thZ2VzLyonXV0sIHtcbiAgICAgICAgICAgIGFycmF5TWVyZ2U6IGNvbWJpbmVNZXJnZSxcbiAgICAgICAgICB9KVxuICAgICAgICA6IFsncGFja2FnZXMvKiddO1xuICAgIH0gZWxzZSBpZiAoQXJyYXkuaXNBcnJheShqc29uT2JqLndvcmtzcGFjZXMpKSB7XG4gICAgICBqc29uT2JqLndvcmtzcGFjZXMgPSBqc29uT2JqLndvcmtzcGFjZXMuZmlsdGVyKFxuICAgICAgICAod29ya3NwYWNlKSA9PlxuICAgICAgICAgIGZnLmdsb2JTeW5jKHdvcmtzcGFjZSwge1xuICAgICAgICAgICAgZG90OiB0cnVlLFxuICAgICAgICAgICAgY3dkOiBjb25maWcuZGlyUGF0aCxcbiAgICAgICAgICAgIGlnbm9yZTogZ2xvYklnbm9yZSxcbiAgICAgICAgICB9KS5sZW5ndGggPiAwXG4gICAgICApO1xuICAgICAgaWYgKGpzb25PYmoud29ya3NwYWNlcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgZGVsZXRlIGpzb25PYmoud29ya3NwYWNlcztcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBpZiAoIWlzV2JQYWNrYWdlKGpzb25PYmopKSB7XG4gICAgZGV2RGVwZW5kZW5jaWVzLnB1c2god2JEZXBlbmRlbmN5KTtcbiAgfVxuICBpZiAoY29uZmlnLmRlcGVuZGluZy53YiB8fCBjb25maWcuaXNCdW4pIHtcbiAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhqc29uT2JqLnNjcmlwdHMpKSB7XG4gICAgICBpZiAodHlwZW9mIHZhbHVlICE9PSAnc3RyaW5nJykgY29udGludWU7XG4gICAgICBqc29uT2JqLnNjcmlwdHNba2V5XSA9IHZhbHVlLnJlcGxhY2VBbGwoL3diXFxzK2RiL2d1LCAnd2IgcHJpc21hJyk7XG4gICAgfVxuICB9XG5cbiAgLy8gYnVpbGQtdHMgb3ducyBUeXBlU2NyaXB0IGV4ZWN1dGlvbiBhbmQgZGVjbGFyYXRpb24gZW1pdC4gd2JmeSBtdXN0IGFsd2F5c1xuICAvLyBrZWVwIGV4aXN0aW5nIGJ1aWxkLXRzIHVzZXJzIGN1cnJlbnQgYmVjYXVzZSBvbGRlciByZWxlYXNlcyBjYW4gZW1pdCAuZC50c1xuICAvLyBmaWxlcyBhdCBwYXRocyB0aGF0IG5vIGxvbmdlciBtYXRjaCBwYWNrYWdlIGV4cG9ydHMuXG4gIGlmIChcbiAgICBqc29uT2JqLmRlcGVuZGVuY2llc1tidWlsZFRzRGVwZW5kZW5jeV0gfHxcbiAgICBqc29uT2JqLmRldkRlcGVuZGVuY2llc1tidWlsZFRzRGVwZW5kZW5jeV0gfHxcbiAgICBPYmplY3QudmFsdWVzKGpzb25PYmouc2NyaXB0cykuc29tZSgoc2NyaXB0KSA9PiBzY3JpcHQ/LmluY2x1ZGVzKGJ1aWxkVHNEZXBlbmRlbmN5KSlcbiAgKSB7XG4gICAgZGV2RGVwZW5kZW5jaWVzLnB1c2goYnVpbGRUc0RlcGVuZGVuY3kpO1xuICB9XG4gIGlmIChkb2VzQ29udGFpbkpzT3JUcyhjb25maWcpKSB7XG4gICAgZGV2RGVwZW5kZW5jaWVzLnB1c2goLi4ub3hsaW50RGVwcyk7XG4gIH1cblxuICBjb25zdCB0c2NvbmZpZ0Jhc2VEZXBlbmRlbmNpZXMgPSBkb2VzQ29udGFpbkpzT3JUcyhjb25maWcpID8gZ2V0VHNjb25maWdCYXNlRGVwZW5kZW5jaWVzKGNvbmZpZykgOiBbXTtcbiAgYXdhaXQgcmVtb3ZlVW51c2VkVHNjb25maWdCYXNlRGVwZW5kZW5jaWVzKGNvbmZpZywganNvbk9iaiwgdHNjb25maWdCYXNlRGVwZW5kZW5jaWVzKTtcbiAgZGV2RGVwZW5kZW5jaWVzLnB1c2goLi4udHNjb25maWdCYXNlRGVwZW5kZW5jaWVzKTtcblxuICBpZiAoY29uZmlnLmRvZXNDb250YWluVHlwZVNjcmlwdCB8fCBjb25maWcuZG9lc0NvbnRhaW5UeXBlU2NyaXB0SW5QYWNrYWdlcykge1xuICAgIGRldkRlcGVuZGVuY2llcy5wdXNoKHR5cGVzY3JpcHRHb0RlcGVuZGVuY3kpO1xuICAgIGlmIChjb25maWcuZGVwZW5kaW5nLm5leHQpIHtcbiAgICAgIC8vIE5leHQuanMgc3RpbGwgdXNlcyB0aGUgYHR5cGVzY3JpcHRgIHBhY2thZ2UgZHVyaW5nIGRldi9idWlsZCBzdGFydHVwIGZvclxuICAgICAgLy8gVHlwZVNjcmlwdCBhcHBzIGV2ZW4gd2hlbiByZXBvc2l0b3JpZXMgZGVsZWdhdGUgZXhwbGljaXQgdHlwZWNoZWNraW5nIHRvIHRzZ28uXG4gICAgICBkZXZEZXBlbmRlbmNpZXMucHVzaCh0eXBlc2NyaXB0RGVwZW5kZW5jeSk7XG4gICAgfVxuICAgIGlmIChjb25maWcuaXNCdW4pIHtcbiAgICAgIGRldkRlcGVuZGVuY2llcy5wdXNoKCdAdHlwZXMvYnVuJyk7XG4gICAgfSBlbHNlIGlmICghY29uZmlnLmRlcGVuZGluZy5yZWFjdE5hdGl2ZSkge1xuICAgICAgZGV2RGVwZW5kZW5jaWVzLnB1c2goJ0B0eXBlcy9ub2RlJyk7XG4gICAgfVxuICAgIGlmIChcbiAgICAgIGpzb25PYmouZGVwZW5kZW5jaWVzLmplc3QgfHxcbiAgICAgIGpzb25PYmouZGV2RGVwZW5kZW5jaWVzLmplc3QgfHxcbiAgICAgIGpzb25PYmouZGVwZW5kZW5jaWVzWydAamVzdC9nbG9iYWxzJ10gfHxcbiAgICAgIGpzb25PYmouZGV2RGVwZW5kZW5jaWVzWydAamVzdC9nbG9iYWxzJ10gfHxcbiAgICAgIGpzb25PYmouZGVwZW5kZW5jaWVzWyd0cy1qZXN0J10gfHxcbiAgICAgIGpzb25PYmouZGV2RGVwZW5kZW5jaWVzWyd0cy1qZXN0J11cbiAgICApIHtcbiAgICAgIGRldkRlcGVuZGVuY2llcy5wdXNoKCdAdHlwZXMvamVzdCcpO1xuICAgIH1cbiAgfVxuXG4gIGlmIChjb25maWcuaXNXaWxsQm9vc3RlckNvbmZpZ3MpIHtcbiAgICByZXR1cm4ge1xuICAgICAgZGVwZW5kZW5jaWVzOiBkZXBlbmRlbmNpZXMuZmlsdGVyKChkZXApID0+ICFkZXAuaW5jbHVkZXMoJ0B3aWxsYm9vc3Rlci8nKSksXG4gICAgICBkZXZEZXBlbmRlbmNpZXM6IGRldkRlcGVuZGVuY2llcy5maWx0ZXIoKGRlcCkgPT4gIWRlcC5pbmNsdWRlcygnQHdpbGxib29zdGVyLycpKSxcbiAgICAgIHB5dGhvbkRldkRlcGVuZGVuY2llcyxcbiAgICB9O1xuICB9XG5cbiAgcmV0dXJuIHsgZGVwZW5kZW5jaWVzLCBkZXZEZXBlbmRlbmNpZXMsIHB5dGhvbkRldkRlcGVuZGVuY2llcyB9O1xufVxuXG5mdW5jdGlvbiBtb3ZlTWFuYWdlZFRvb2xEZXBlbmRlbmNpZXNUb0RldkRlcGVuZGVuY2llcyhqc29uT2JqOiBXcml0YWJsZVBhY2thZ2VKc29uKTogdm9pZCB7XG4gIGZvciAoY29uc3QgZGVwZW5kZW5jeSBvZiBbd2JEZXBlbmRlbmN5LCBidWlsZFRzRGVwZW5kZW5jeV0pIHtcbiAgICBpZiAoIWpzb25PYmouZGVwZW5kZW5jaWVzW2RlcGVuZGVuY3ldKSBjb250aW51ZTtcbiAgICBqc29uT2JqLmRldkRlcGVuZGVuY2llc1tkZXBlbmRlbmN5XSA/Pz0ganNvbk9iai5kZXBlbmRlbmNpZXNbZGVwZW5kZW5jeV07XG4gICAgZGVsZXRlIGpzb25PYmouZGVwZW5kZW5jaWVzW2RlcGVuZGVuY3ldO1xuICB9XG59XG5cbmFzeW5jIGZ1bmN0aW9uIG5vcm1hbGl6ZVBhY2thZ2VNZXRhZGF0YShcbiAgY29uZmlnOiBQYWNrYWdlQ29uZmlnLFxuICByb290Q29uZmlnOiBQYWNrYWdlQ29uZmlnLFxuICBqc29uT2JqOiBXcml0YWJsZVBhY2thZ2VKc29uLFxuICBkZXBlbmRlbmN5VXBkYXRlczogRGVwZW5kZW5jeVVwZGF0ZXNcbik6IFByb21pc2U8dm9pZD4ge1xuICBpZiAoIWpzb25PYmoubmFtZSkge1xuICAgIGpzb25PYmoubmFtZSA9IHBhdGguYmFzZW5hbWUoY29uZmlnLmRpclBhdGgpO1xuICB9XG5cbiAgaWYgKGNvbmZpZy5kb2VzQ29udGFpblN1YlBhY2thZ2VKc29ucykge1xuICAgIGpzb25PYmoucHJpdmF0ZSA9IHRydWU7XG4gIH1cbiAgaWYgKCFqc29uT2JqLmxpY2Vuc2UpIHtcbiAgICBqc29uT2JqLmxpY2Vuc2UgPSAnVU5MSUNFTlNFRCc7XG4gIH1cbiAgaWYgKCFqc29uT2JqLnByaXZhdGUgJiYganNvbk9iai5saWNlbnNlICE9PSAnVU5MSUNFTlNFRCcgJiYgcm9vdENvbmZpZy5pc1B1YmxpY1JlcG8pIHtcbiAgICBqc29uT2JqLnB1Ymxpc2hDb25maWcgPz89IHt9O1xuICAgIGpzb25PYmoucHVibGlzaENvbmZpZy5hY2Nlc3MgPz89ICdwdWJsaWMnO1xuICB9XG4gIGNvbnN0IFtvd25lcl0gPSBnaXRIdWJVdGlsLmdldE9yZ0FuZE5hbWUoY29uZmlnLnJlcG9zaXRvcnkgPz8gJycpO1xuICBpZiAob3duZXIgPT09ICdXaWxsQm9vc3RlcicgfHwgb3duZXIgPT09ICdXaWxsQm9vc3RlckxhYicpIHtcbiAgICBqc29uT2JqLmF1dGhvciA9ICdXaWxsQm9vc3RlciBJbmMuJztcbiAgfVxuICBhd2FpdCBub3JtYWxpemVQdWJsaXNoZWRDb25maWdQYWNrYWdlTWV0YWRhdGEoY29uZmlnLCBqc29uT2JqKTtcbiAgaWYgKCFjb25maWcuaXNSb290ICYmIGpzb25PYmoucHJpdmF0ZSAmJiAhanNvbk9iai5tYWluKSB7XG4gICAgLy8gTWFrZSBWU0NvZGUgcG9zc2libGUgdG8gcmVmYWN0b3IgY29kZSBhY3Jvc3Mgc3VicGFja2FnZXMuXG4gICAganNvbk9iai5tYWluID0gJy4vc3JjJztcbiAgfVxuXG4gIC8vIFlhcm4gdHJlYXRzIHRoZSBsZWdhY3kgbnBtL2NoYWxrIHJlc29sdXRpb24gYWxpYXMgYXMgYW4gaW52YWxpZCBwYWNrYWdlIHRva2VuLlxuICBkZWxldGUganNvbk9iai5yZXNvbHV0aW9ucz8uWyducG0vY2hhbGsnXTtcblxuICBpZiAoIWNvbmZpZy5kb2VzQ29udGFpblN1YlBhY2thZ2VKc29ucykge1xuICAgIGlmICghY29uZmlnLmlzQnVuKSB7XG4gICAgICBpZiAoIWNvbmZpZy5kb2VzQ29udGFpbkphdmFTY3JpcHQgJiYgIWNvbmZpZy5kb2VzQ29udGFpblR5cGVTY3JpcHQpIHtcbiAgICAgICAgZGVsZXRlIGpzb25PYmouc2NyaXB0cy5saW50O1xuICAgICAgICBkZWxldGUganNvbk9iai5zY3JpcHRzWydsaW50LWZpeCddO1xuICAgICAgICBmb3IgKGNvbnN0IHNjcmlwdE5hbWUgb2YgWydjbGVhbnVwJ10pIHtcbiAgICAgICAgICBjb25zdCBzY3JpcHQgPSBqc29uT2JqLnNjcmlwdHNbc2NyaXB0TmFtZV07XG4gICAgICAgICAgaWYgKCFzY3JpcHQpIGNvbnRpbnVlO1xuICAgICAgICAgIGpzb25PYmouc2NyaXB0c1tzY3JpcHROYW1lXSA9IHNjcmlwdC5yZXBsYWNlKC8gPyYmID95YXJuIGxpbnQtZml4KD86IC0tcXVpZXQpPy8sICcnKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAganNvbk9iai5zY3JpcHRzWydsaW50LWZpeCddID0ganNvbk9iai5zY3JpcHRzWydsaW50LWZpeCddID8/ICd5YXJuIGxpbnQgLS1maXgnO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChjb25maWcuZG9lc0NvbnRhaW5QdWJzcGVjWWFtbCkge1xuICAgICAganNvbk9iai5zY3JpcHRzLmxpbnQgPSAnZmx1dHRlciBhbmFseXplJztcbiAgICAgIGpzb25PYmouc2NyaXB0c1snbGludC1maXgnXSA9ICd5YXJuIGxpbnQnO1xuICAgICAgY29uc3QgZGlycyA9IFsnbGliJywgJ3Rlc3QnLCAndGVzdF9kcml2ZXInXS5maWx0ZXIoKGRpcikgPT4gZnMuZXhpc3RzU3luYyhwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsIGRpcikpKTtcbiAgICAgIGlmIChkaXJzLmxlbmd0aCA+IDApIHtcbiAgICAgICAganNvbk9iai5zY3JpcHRzWydmb3JtYXQtY29kZSddID0gYGRhcnQgZm9ybWF0ICQoZmluZCAke2RpcnMuam9pbihcbiAgICAgICAgICAnICdcbiAgICAgICAgKX0gLW5hbWUgZ2VuZXJhdGVkIC1wcnVuZSAtbyAtbmFtZSAnKi5mcmVlemVkLmRhcnQnIC1wcnVuZSAtbyAtbmFtZSAnKi5nLmRhcnQnIC1wcnVuZSAtbyAtbmFtZSAnKi5kYXJ0JyAtcHJpbnQpYDtcbiAgICAgICAganNvbk9iai5zY3JpcHRzLmZvcm1hdCA9IGFwcGVuZEZvcm1hdENvZGVDb21tYW5kKGpzb25PYmouc2NyaXB0cy5mb3JtYXQsIGNvbmZpZyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgcHl0aG9uUGFja2FnZU1hbmFnZXIgPSBnZXRQeXRob25QYWNrYWdlTWFuYWdlcihjb25maWcpO1xuICAgIGlmIChweXRob25QYWNrYWdlTWFuYWdlcikge1xuICAgICAgaWYgKGpzb25PYmouc2NyaXB0cy5wb3N0aW5zdGFsbCA9PT0gJ3BvZXRyeSBpbnN0YWxsJykge1xuICAgICAgICBkZWxldGUganNvbk9iai5zY3JpcHRzLnBvc3RpbnN0YWxsO1xuICAgICAgfVxuICAgICAganNvbk9iai5zY3JpcHRzWydjb21tb24vY2ktc2V0dXAnXSA9IGB5YXJuIHNldHVwLSR7cHl0aG9uUGFja2FnZU1hbmFnZXJ9YDtcbiAgICAgIGRlbGV0ZSBqc29uT2JqLnNjcmlwdHNbYHNldHVwLSR7cHl0aG9uUGFja2FnZU1hbmFnZXIgPT09ICdwb2V0cnknID8gJ3V2JyA6ICdwb2V0cnknfWBdO1xuICAgICAgZGVsZXRlIGpzb25PYmouc2NyaXB0c1snc2V0dXAtcG9ldHJ5LWFzZGYnXTtcbiAgICAgIGpzb25PYmouc2NyaXB0c1tgc2V0dXAtJHtweXRob25QYWNrYWdlTWFuYWdlcn1gXSA9IGdldFB5dGhvblNldHVwQ29tbWFuZChweXRob25QYWNrYWdlTWFuYWdlcik7XG4gICAgICBjb25zdCBweXRob25GaWxlcyA9IGF3YWl0IGZnLmdsb2IoJyoqLyoucHknLCB7XG4gICAgICAgIGN3ZDogY29uZmlnLmRpclBhdGgsXG4gICAgICAgIGRvdDogdHJ1ZSxcbiAgICAgICAgaWdub3JlOiBnbG9iSWdub3JlLFxuICAgICAgfSk7XG4gICAgICBjb25zdCBkaXJOYW1lU2V0ID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gICAgICBmb3IgKGNvbnN0IHB5dGhvbkZpbGUgb2YgcHl0aG9uRmlsZXMpIHtcbiAgICAgICAgY29uc3QgW2ZpcnN0LCBzZWNvbmRdID0gcHl0aG9uRmlsZS5zcGxpdCgnLycpO1xuICAgICAgICBpZiAoZmlyc3QgJiYgc2Vjb25kKSB7XG4gICAgICAgICAgZGlyTmFtZVNldC5hZGQoZmlyc3QpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAoZGlyTmFtZVNldC5zaXplID4gMCkge1xuICAgICAgICBjb25zdCBkaXJOYW1lc1N0ciA9IFsuLi5kaXJOYW1lU2V0XS5qb2luKCcgJyk7XG4gICAgICAgIGNvbnN0IHB5dGhvblJ1bm5lciA9IGAke3B5dGhvblBhY2thZ2VNYW5hZ2VyfSBydW5gO1xuICAgICAgICBqc29uT2JqLnNjcmlwdHNbJ2Zvcm1hdC1jb2RlJ10gPVxuICAgICAgICAgIGAke3B5dGhvblJ1bm5lcn0gaXNvcnQgLS1wcm9maWxlIGJsYWNrICR7ZGlyTmFtZXNTdHJ9ICYmICR7cHl0aG9uUnVubmVyfSBibGFjayAke2Rpck5hbWVzU3RyfWA7XG4gICAgICAgIGlmIChqc29uT2JqLnNjcmlwdHMubGludCkge1xuICAgICAgICAgIGpzb25PYmouc2NyaXB0cy5saW50ID0gYCR7cHl0aG9uUnVubmVyfSBmbGFrZTggJHtkaXJOYW1lc1N0cn0gJiYgJHtqc29uT2JqLnNjcmlwdHMubGludH1gO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGpzb25PYmouc2NyaXB0cy5saW50ID0gYCR7cHl0aG9uUnVubmVyfSBmbGFrZTggJHtkaXJOYW1lc1N0cn1gO1xuICAgICAgICAgIGpzb25PYmouc2NyaXB0c1snbGludC1maXgnXSA9ICd5YXJuIGxpbnQnO1xuICAgICAgICB9XG4gICAgICAgIGpzb25PYmouc2NyaXB0cy5mb3JtYXQgPSBhcHBlbmRGb3JtYXRDb2RlQ29tbWFuZChqc29uT2JqLnNjcmlwdHMuZm9ybWF0LCBjb25maWcpO1xuICAgICAgICBkZXBlbmRlbmN5VXBkYXRlcy5weXRob25EZXZEZXBlbmRlbmNpZXMucHVzaCgnYmxhY2snLCAnaXNvcnQnLCAnZmxha2U4Jyk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgaWYgKGNvbmZpZy5yZXBvc2l0b3J5IHx8IGpzb25PYmoucmVwb3NpdG9yeSkge1xuICAgIGpzb25PYmoucmVwb3NpdG9yeSA9IGZvcm1hdFJlcG9zaXRvcnlGb3JQYWNrYWdlSnNvbihjb25maWcucmVwb3NpdG9yeSA/PyBqc29uT2JqLnJlcG9zaXRvcnksIGpzb25PYmoucmVwb3NpdG9yeSk7XG4gIH1cblxuICBjb25zdCBnZW5Db2RlU2NyaXB0ID0ganNvbk9iai5zY3JpcHRzWydnZW4tY29kZSddO1xuICBpZiAoZ2VuQ29kZVNjcmlwdD8uaW5jbHVkZXMoJ05vIGNvZGUgZ2VuZXJhdGlvbiBuZWVkZWQnKSkge1xuICAgIGRlbGV0ZSBqc29uT2JqLnNjcmlwdHNbJ2dlbi1jb2RlJ107XG4gIH0gZWxzZSBpZiAoc2hvdWxkR2VuZXJhdGVXYkdlbkNvZGVTY3JpcHQoY29uZmlnLCBnZW5Db2RlU2NyaXB0KSkge1xuICAgIGpzb25PYmouc2NyaXB0c1snZ2VuLWNvZGUnXSA9IGAke2NvbmZpZy5pc0J1biA/ICdidW4gLS1idW4gJyA6ICcnfXdiIGdlbi1jb2RlYDtcbiAgfVxuICBhZGRHZW5JMThuVHNQb3N0aW5zdGFsbFNjcmlwdChjb25maWcsIGpzb25PYmopO1xuXG4gIGlmICghanNvbk9iai5kZXBlbmRlbmNpZXMucHJldHRpZXIpIHtcbiAgICAvLyBCZWNhdXNlIEB0eXBlcy9wcmV0dGllciBibG9ja3MgcHJldHRpZXIgZXhlY3V0aW9uLlxuICAgIGRlbGV0ZSBqc29uT2JqLmRldkRlcGVuZGVuY2llc1snQHR5cGVzL3ByZXR0aWVyJ107XG4gIH1cbn1cblxuZnVuY3Rpb24gc2hvdWxkR2VuZXJhdGVXYkdlbkNvZGVTY3JpcHQoY29uZmlnOiBQYWNrYWdlQ29uZmlnLCBvbGRHZW5Db2RlU2NyaXB0OiBzdHJpbmcgfCB1bmRlZmluZWQpOiBib29sZWFuIHtcbiAgcmV0dXJuIChcbiAgICBjb25maWcuZGVwZW5kaW5nLmJsaXR6IHx8XG4gICAgY29uZmlnLmRlcGVuZGluZy5jaGFrcmEgfHxcbiAgICBjb25maWcuZGVwZW5kaW5nLnByaXNtYSB8fFxuICAgIChjb25maWcuZGVwZW5kaW5nLmRyaXp6bGUgJiYgISFvbGRHZW5Db2RlU2NyaXB0Py5pbmNsdWRlcygnZHJpenpsZS1raXQgY2hlY2snKSlcbiAgKTtcbn1cblxuZnVuY3Rpb24gYXBwZW5kRm9ybWF0Q29kZUNvbW1hbmQoZm9ybWF0U2NyaXB0OiBzdHJpbmcgfCB1bmRlZmluZWQsIGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IHN0cmluZyB7XG4gIC8vIEJ1biBwcm9qZWN0cyBtYXkgbm90IGhhdmUgYSBZYXJuIGxvY2tmaWxlLCBzbyBnZW5lcmF0ZWQgcGFja2FnZSBzY3JpcHRzXG4gIC8vIG11c3QgaW52b2tlIGxvY2FsIHBhY2thZ2Ugc2NyaXB0cyB0aHJvdWdoIHRoZSByZXBvc2l0b3J5J3MgcGFja2FnZSBtYW5hZ2VyLlxuICBjb25zdCBzY3JpcHRSdW5uZXIgPSBjb25maWcuaXNCdW4gPyAnYnVuIHJ1bicgOiAneWFybic7XG4gIHJldHVybiBmb3JtYXRTY3JpcHQgPyBgJHtmb3JtYXRTY3JpcHR9ICYmICR7c2NyaXB0UnVubmVyfSBmb3JtYXQtY29kZWAgOiBgJHtzY3JpcHRSdW5uZXJ9IGZvcm1hdC1jb2RlYDtcbn1cblxuZnVuY3Rpb24gYWRkR2VuSTE4blRzUG9zdGluc3RhbGxTY3JpcHQoY29uZmlnOiBQYWNrYWdlQ29uZmlnLCBqc29uT2JqOiBXcml0YWJsZVBhY2thZ2VKc29uKTogdm9pZCB7XG4gIGNvbnN0IGNvbW1hbmQgPSBnZXRHZW5JMThuVHNDb21tYW5kKGNvbmZpZywganNvbk9iai5zY3JpcHRzKTtcbiAgaWYgKCFjb21tYW5kKSByZXR1cm47XG5cbiAgY29uc3QgcG9zdGluc3RhbGwgPSBqc29uT2JqLnNjcmlwdHMucG9zdGluc3RhbGw7XG4gIGlmICghcG9zdGluc3RhbGwpIHtcbiAgICBqc29uT2JqLnNjcmlwdHMucG9zdGluc3RhbGwgPSBjb21tYW5kO1xuICB9IGVsc2UgaWYgKCFwb3N0aW5zdGFsbC5pbmNsdWRlcyhjb21tYW5kKSkge1xuICAgIGpzb25PYmouc2NyaXB0cy5wb3N0aW5zdGFsbCA9IGAke3Bvc3RpbnN0YWxsfSAmJiAke2NvbW1hbmR9YDtcbiAgfVxufVxuXG5hc3luYyBmdW5jdGlvbiBub3JtYWxpemVQdWJsaXNoZWRDb25maWdQYWNrYWdlTWV0YWRhdGEoXG4gIGNvbmZpZzogUGFja2FnZUNvbmZpZyxcbiAganNvbk9iajogV3JpdGFibGVQYWNrYWdlSnNvblxuKTogUHJvbWlzZTx2b2lkPiB7XG4gIGlmICghaXNQdWJsaXNoZWRXaWxsYm9vc3RlckNvbmZpZ3NQYWNrYWdlKGNvbmZpZykpIHJldHVybjtcblxuICBjb25zdCBjb25maWdNanNQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnY29uZmlnLm1qcycpO1xuICBpZiAoIWZzLmV4aXN0c1N5bmMoY29uZmlnTWpzUGF0aCkpIHJldHVybjtcblxuICBqc29uT2JqLnR5cGUgPSAnbW9kdWxlJztcblxuICBjb25zdCBjb25maWdEdHNQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnY29uZmlnLmQudHMnKTtcbiAgaWYgKCFmcy5leGlzdHNTeW5jKGNvbmZpZ0R0c1BhdGgpKSByZXR1cm47XG5cbiAganNvbk9iai5maWxlcyA9IFsuLi5uZXcgU2V0KFsuLi4oanNvbk9iai5maWxlcyA/PyBbXSksICdjb25maWcuZC5tdHMnXSldO1xuICAvLyBOb2RlTmV4dCByZXNvbHZlcyBhIHJlbGF0aXZlIGAuL2NvbmZpZy5tanNgIGltcG9ydCB0byBgY29uZmlnLmQubXRzYCwgbm90XG4gIC8vIHRoZSBwYWNrYWdlLWxldmVsIGB0eXBlc2AgZmllbGQuIEtlZXAgdGhlIHB1Ymxpc2hlZCBjb25maWcgaW1wb3J0YWJsZSBmcm9tXG4gIC8vIHBhY2thZ2UtbG9jYWwgVHlwZVNjcmlwdCBsaW50ZXIgc2V0dGluZ3MuXG4gIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiBmc1V0aWwuZ2VuZXJhdGVGaWxlKHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJ2NvbmZpZy5kLm10cycpLCBjb25maWdEbXRzQ29udGVudCkpO1xufVxuXG5jb25zdCBjb25maWdEbXRzQ29udGVudCA9IGBleHBvcnQgeyBkZWZhdWx0IH0gZnJvbSAnLi9jb25maWcuanMnO1xuYDtcblxuZnVuY3Rpb24gYWRkRGVwZW5kZW5jeVZlcnNpb25zVG9QYWNrYWdlSnNvbihqc29uT2JqOiBXcml0YWJsZVBhY2thZ2VKc29uLCBkZXBlbmRlbmN5VXBkYXRlczogRGVwZW5kZW5jeVVwZGF0ZXMpOiB2b2lkIHtcbiAgY29uc3QgcGFja2FnZUpzb25EZXBlbmRlbmNpZXMgPSBqc29uT2JqLmRlcGVuZGVuY2llcztcbiAgY29uc3QgcGFja2FnZUpzb25EZXZEZXBlbmRlbmNpZXMgPSBqc29uT2JqLmRldkRlcGVuZGVuY2llcztcbiAgZGVwZW5kZW5jeVVwZGF0ZXMuZGVwZW5kZW5jaWVzID0gYWRkUGFja2FnZUpzb25EZXBlbmRlbmNpZXMocGFja2FnZUpzb25EZXBlbmRlbmNpZXMsIGRlcGVuZGVuY3lVcGRhdGVzLmRlcGVuZGVuY2llcyk7XG4gIGRlcGVuZGVuY3lVcGRhdGVzLmRldkRlcGVuZGVuY2llcyA9IGRlcGVuZGVuY3lVcGRhdGVzLmRldkRlcGVuZGVuY2llcy5maWx0ZXIoKGRlcCkgPT4gIXBhY2thZ2VKc29uRGVwZW5kZW5jaWVzW2RlcF0pO1xuICBkZXBlbmRlbmN5VXBkYXRlcy5kZXZEZXBlbmRlbmNpZXMgPSBhZGRQYWNrYWdlSnNvbkRlcGVuZGVuY2llcyhcbiAgICBwYWNrYWdlSnNvbkRldkRlcGVuZGVuY2llcyxcbiAgICBkZXBlbmRlbmN5VXBkYXRlcy5kZXZEZXBlbmRlbmNpZXNcbiAgKTtcbn1cblxuZnVuY3Rpb24gcmVtb3ZlRW1wdHlEZXBlbmRlbmN5U2VjdGlvbnMoanNvbk9iajogUGFja2FnZUpzb24pOiB2b2lkIHtcbiAgZm9yIChjb25zdCBrZXkgb2YgZGVwZW5kZW5jeVNlY3Rpb25LZXlzKSB7XG4gICAgY29uc3Qgc2VjdGlvbiA9IGpzb25PYmpba2V5XTtcbiAgICBpZiAoc2VjdGlvbiAmJiBPYmplY3Qua2V5cyhzZWN0aW9uKS5sZW5ndGggPT09IDApIHtcbiAgICAgIFJlZmxlY3QuZGVsZXRlUHJvcGVydHkoanNvbk9iaiwga2V5KTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gaW5zdGFsbERlcGVuZGVuY3lVcGRhdGVzKFxuICBjb25maWc6IFBhY2thZ2VDb25maWcsXG4gIGpzb25PYmo6IFBhY2thZ2VKc29uLFxuICBkZXBlbmRlbmN5VXBkYXRlczogRGVwZW5kZW5jeVVwZGF0ZXMsXG4gIHBhY2thZ2VNYW5hZ2VyOiAnYnVuJyB8ICd5YXJuJ1xuKTogdm9pZCB7XG4gIGNvbnN0IGRlcGVuZGVuY2llcyA9IGRlcGVuZGVuY3lVcGRhdGVzLmRlcGVuZGVuY2llcy5maWx0ZXIoKGRlcCkgPT4gIWpzb25PYmouZGV2RGVwZW5kZW5jaWVzPy5bZGVwXSk7XG4gIGluc3RhbGxOcG1EZXBlbmRlbmNpZXMoY29uZmlnLCBwYWNrYWdlTWFuYWdlciwganNvbk9iai5kZXBlbmRlbmNpZXMgPz8ge30sIGRlcGVuZGVuY2llcywgZmFsc2UpO1xuXG4gIGNvbnN0IGRldkRlcGVuZGVuY2llcyA9IGRlcGVuZGVuY3lVcGRhdGVzLmRldkRlcGVuZGVuY2llcy5maWx0ZXIoKGRlcCkgPT4gIWpzb25PYmouZGVwZW5kZW5jaWVzPy5bZGVwXSk7XG4gIGluc3RhbGxOcG1EZXBlbmRlbmNpZXMoY29uZmlnLCBwYWNrYWdlTWFuYWdlciwganNvbk9iai5kZXZEZXBlbmRlbmNpZXMgPz8ge30sIGRldkRlcGVuZGVuY2llcywgdHJ1ZSk7XG5cbiAgY29uc3QgcHl0aG9uUGFja2FnZU1hbmFnZXIgPSBnZXRQeXRob25QYWNrYWdlTWFuYWdlcihjb25maWcpO1xuICBpZiAocHl0aG9uUGFja2FnZU1hbmFnZXIgJiYgZGVwZW5kZW5jeVVwZGF0ZXMucHl0aG9uRGV2RGVwZW5kZW5jaWVzLmxlbmd0aCA+IDApIHtcbiAgICBjb25zdCBkZXBlbmRlbmNpZXMgPSBbLi4ubmV3IFNldChkZXBlbmRlbmN5VXBkYXRlcy5weXRob25EZXZEZXBlbmRlbmNpZXMpXTtcbiAgICBpZiAocHl0aG9uUGFja2FnZU1hbmFnZXIgPT09ICdwb2V0cnknKSB7XG4gICAgICBzcGF3blN5bmMoJ3BvZXRyeScsIFsnYWRkJywgJy0tZ3JvdXAnLCAnZGV2JywgLi4uZGVwZW5kZW5jaWVzXSwgY29uZmlnLmRpclBhdGgpO1xuICAgIH0gZWxzZSB7XG4gICAgICBzcGF3blN5bmMoJ3V2JywgWydhZGQnLCAnLS1kZXYnLCAuLi5kZXBlbmRlbmNpZXNdLCBjb25maWcuZGlyUGF0aCk7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGdldFB5dGhvblBhY2thZ2VNYW5hZ2VyKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6ICdwb2V0cnknIHwgJ3V2JyB8IHVuZGVmaW5lZCB7XG4gIGlmIChjb25maWcuZG9lc0NvbnRhaW5VdkxvY2spIHJldHVybiAndXYnO1xuICBpZiAoY29uZmlnLmRvZXNDb250YWluUG9ldHJ5TG9jaykgcmV0dXJuICdwb2V0cnknO1xufVxuXG5mdW5jdGlvbiBnZXRQeXRob25TZXR1cENvbW1hbmQocGFja2FnZU1hbmFnZXI6ICdwb2V0cnknIHwgJ3V2Jyk6IHN0cmluZyB7XG4gIGlmIChwYWNrYWdlTWFuYWdlciA9PT0gJ3V2JykgcmV0dXJuICd1diBzeW5jIC0tZnJvemVuJztcbiAgcmV0dXJuICdwb2V0cnkgY29uZmlnIHZpcnR1YWxlbnZzLmluLXByb2plY3QgdHJ1ZSAmJiBwb2V0cnkgZW52IHVzZSAkKG1pc2UgY3VycmVudCBweXRob24pICYmIHBvZXRyeSBydW4gcGlwIGluc3RhbGwgLS11cGdyYWRlIHBpcCAmJiBwb2V0cnkgaW5zdGFsbCc7XG59XG5cbmZ1bmN0aW9uIGluc3RhbGxOcG1EZXBlbmRlbmNpZXMoXG4gIGNvbmZpZzogUGFja2FnZUNvbmZpZyxcbiAgcGFja2FnZU1hbmFnZXI6ICdidW4nIHwgJ3lhcm4nLFxuICBwYWNrYWdlSnNvbkRlcGVuZGVuY2llczogUGFydGlhbDxSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+PixcbiAgZGVwZW5kZW5jaWVzOiBzdHJpbmdbXSxcbiAgZGV2OiBib29sZWFuXG4pOiB2b2lkIHtcbiAgaWYgKGRlcGVuZGVuY2llcy5sZW5ndGggPT09IDApIHJldHVybjtcblxuICBjb25zdCBkZXBlbmRlbmN5U3BlY2lmaWVycyA9IFtcbiAgICAuLi5uZXcgU2V0KFxuICAgICAgZGVwZW5kZW5jaWVzLm1hcCgoZGVwZW5kZW5jeSkgPT4gZ2V0SW5zdGFsbERlcGVuZGVuY3lTcGVjaWZpZXIoZGVwZW5kZW5jeSwgcGFja2FnZUpzb25EZXBlbmRlbmNpZXNbZGVwZW5kZW5jeV0pKVxuICAgICksXG4gIF07XG4gIHNwYXduU3luYyhcbiAgICBwYWNrYWdlTWFuYWdlcixcbiAgICBbJ2FkZCcsIC4uLihkZXYgPyBbJy1EJ10gOiBbXSksIC4uLihjb25maWcuaXNCdW4gPyBbJy0tZXhhY3QnXSA6IFtdKSwgLi4uZGVwZW5kZW5jeVNwZWNpZmllcnNdLFxuICAgIGNvbmZpZy5kaXJQYXRoXG4gICk7XG59XG5cbmZ1bmN0aW9uIGdldEluc3RhbGxEZXBlbmRlbmN5U3BlY2lmaWVyKGRlcGVuZGVuY3k6IHN0cmluZywgY3VycmVudFZlcnNpb246IHN0cmluZyB8IHVuZGVmaW5lZCk6IHN0cmluZyB7XG4gIC8vIFBhY2thZ2UgbWFuYWdlcnMgcmVzb2x2ZSBhIGJhcmUgYWRkIHRhcmdldCBhZ2FpbnN0IGxpdmUgcmVnaXN0cnkgc3RhdGUuXG4gIC8vIFBhc3NpbmcgdGhlIHJlc29sdmVkIHZlcnNpb24ga2VlcHMgZ2VuZXJhdGVkIGluc3RhbGxzIGFsaWduZWQgd2l0aCB0aGVcbiAgLy8gcGFja2FnZS5qc29uIGJhc2VsaW5lIHdlIGp1c3Qgd3JvdGUuXG4gIGlmIChjdXJyZW50VmVyc2lvbiAmJiAhaXNXb3Jrc3BhY2VQcm90b2NvbFJhbmdlKGN1cnJlbnRWZXJzaW9uKSkge1xuICAgIHJldHVybiBgJHtkZXBlbmRlbmN5fUAke2N1cnJlbnRWZXJzaW9ufWA7XG4gIH1cblxuICByZXR1cm4gZ2V0RGVwZW5kZW5jeVNwZWNpZmllcihkZXBlbmRlbmN5KTtcbn1cblxuZnVuY3Rpb24gYWRkUGFja2FnZUpzb25EZXBlbmRlbmNpZXMoXG4gIHBhY2thZ2VKc29uRGVwZW5kZW5jaWVzOiBQYXJ0aWFsPFJlY29yZDxzdHJpbmcsIHN0cmluZz4+LFxuICBkZXBlbmRlbmNpZXM6IHN0cmluZ1tdXG4pOiBzdHJpbmdbXSB7XG4gIGNvbnN0IGRlcGVuZGVuY2llc1RvSW5zdGFsbDogc3RyaW5nW10gPSBbXTtcbiAgZm9yIChjb25zdCBkZXBlbmRlbmN5IG9mIG5ldyBTZXQoZGVwZW5kZW5jaWVzKSkge1xuICAgIGNvbnN0IHNob3VsZFVwZGF0ZUV4aXN0aW5nRGVwZW5kZW5jeSA9IHNob3VsZFVwZGF0ZUV4aXN0aW5nTWFuYWdlZERlcGVuZGVuY3koXG4gICAgICBkZXBlbmRlbmN5LFxuICAgICAgcGFja2FnZUpzb25EZXBlbmRlbmNpZXNbZGVwZW5kZW5jeV1cbiAgICApO1xuICAgIGlmIChzaG91bGRVcGRhdGVFeGlzdGluZ0RlcGVuZGVuY3kpIHtcbiAgICAgIGRlcGVuZGVuY2llc1RvSW5zdGFsbC5wdXNoKGRlcGVuZGVuY3kpO1xuICAgIH1cbiAgICBpZiAoXG4gICAgICBwYWNrYWdlSnNvbkRlcGVuZGVuY2llc1tkZXBlbmRlbmN5XSAmJlxuICAgICAgIXNob3VsZFVwZGF0ZUV4aXN0aW5nRGVwZW5kZW5jeSAmJlxuICAgICAgcGFja2FnZUpzb25EZXBlbmRlbmNpZXNbZGVwZW5kZW5jeV0gIT09ICcqJ1xuICAgIClcbiAgICAgIGNvbnRpbnVlO1xuICAgIHBhY2thZ2VKc29uRGVwZW5kZW5jaWVzW2RlcGVuZGVuY3ldID0gZ2V0TGF0ZXN0RGVwZW5kZW5jeVZlcnNpb24oZGVwZW5kZW5jeSk7XG4gIH1cbiAgcmV0dXJuIGRlcGVuZGVuY2llc1RvSW5zdGFsbDtcbn1cblxuZnVuY3Rpb24gZm9ybWF0UGFja2FnZUpzb25XaXRoUHJvamVjdEZvcm1hdHRlcihcbiAgY29uZmlnOiBQYWNrYWdlQ29uZmlnLFxuICBwYWNrYWdlTWFuYWdlcjogJ2J1bicgfCAneWFybicsXG4gIGZpbGVQYXRoOiBzdHJpbmdcbik6IHZvaWQge1xuICBjb25zdCByZWxhdGl2ZUZpbGVQYXRoID0gcGF0aC5yZWxhdGl2ZShjb25maWcuZGlyUGF0aCwgZmlsZVBhdGgpO1xuICBpZiAoIXJlbGF0aXZlRmlsZVBhdGgpIHJldHVybjtcblxuICAvLyBSZXVzZSB0aGUgdGFyZ2V0IHJlcG9zaXRvcnkncyBvd24gZm9ybWF0dGVyIGFmdGVyIGRlcGVuZGVuY3kgaW5zdGFsbGF0aW9uIHNvXG4gIC8vIHBhY2thZ2UuanNvbiBtYXRjaGVzIHdoYXRldmVyIGl0cyBjdXJyZW50IHNvcnQtcGFja2FnZS1qc29uIHZlcnNpb24gZXhwZWN0cy5cbiAgLy8gVGhpcyBhdm9pZHMgZm9sbG93LXVwIGF1dG9maXggY29tbWl0cyBjYXVzZWQgb25seSBieSBmb3JtYXR0ZXIgdmVyc2lvbiBkcmlmdFxuICAvLyBiZXR3ZWVuIHdiZnkgYW5kIHRoZSBwcm9qZWN0IGJlaW5nIHVwZGF0ZWQuXG4gIGlmIChwYWNrYWdlTWFuYWdlciA9PT0gJ2J1bicpIHtcbiAgICBzcGF3blN5bmMoJ2J1bngnLCBbJ3NvcnQtcGFja2FnZS1qc29uJywgcmVsYXRpdmVGaWxlUGF0aF0sIGNvbmZpZy5kaXJQYXRoKTtcbiAgfSBlbHNlIHtcbiAgICBzcGF3blN5bmMocGFja2FnZU1hbmFnZXIsIFsnc29ydC1wYWNrYWdlLWpzb24nLCByZWxhdGl2ZUZpbGVQYXRoXSwgY29uZmlnLmRpclBhdGgpO1xuICB9XG59XG5cbi8vIFRPRE86IHJlbW92ZSB0aGUgZm9sbG93aW5nIG1pZ3JhdGlvbiBjb2RlIGluIGZ1dHVyZVxuYXN5bmMgZnVuY3Rpb24gcmVtb3ZlRGVwcmVjYXRlZFN0dWZmKFxuICBjb25maWc6IFBhY2thZ2VDb25maWcsXG4gIGpzb25PYmo6IFNldFJlcXVpcmVkPFBhY2thZ2VKc29uLCAnc2NyaXB0cycgfCAnZGVwZW5kZW5jaWVzJyB8ICdkZXZEZXBlbmRlbmNpZXMnIHwgJ3BlZXJEZXBlbmRlbmNpZXMnPlxuKTogUHJvbWlzZTx2b2lkPiB7XG4gIGlmIChqc29uT2JqLmF1dGhvciA9PT0gJ1dpbGxCb29zdGVyIExMQycpIHtcbiAgICBqc29uT2JqLmF1dGhvciA9ICdXaWxsQm9vc3RlciBJbmMuJztcbiAgfVxuICByZW1vdmVTZWxmRGVwZW5kZW5jeShjb25maWcsIGpzb25PYmopO1xuICByZXBsYWNlV2lsbEJvb3N0ZXJDb25maWdzV29ya3NwYWNlRGVwZW5kZW5jeVJhbmdlcyhjb25maWcsIGpzb25PYmopO1xuICBkZWxldGUganNvbk9iai5zY3JpcHRzWydzb3J0LXBhY2thZ2UtanNvbiddO1xuICBkZWxldGUganNvbk9iai5zY3JpcHRzWydzb3J0LWFsbC1wYWNrYWdlLWpzb24nXTtcbiAgZGVsZXRlIGpzb25PYmouc2NyaXB0c1snY2hlY2stYWxsLWZvci1haSddO1xuICBkZWxldGUganNvbk9iai5zY3JpcHRzWydjaGVjay1mb3ItYWknXTtcbiAgZGVsZXRlIGpzb25PYmouc2NyaXB0c1sndHlwZWNoZWNrL3dhcm4nXTtcbiAgZGVsZXRlIGpzb25PYmouc2NyaXB0c1sndHlwZWNoZWNrOmdlbi1jb2RlJ107XG4gIGRlbGV0ZSBqc29uT2JqLnNjcmlwdHNbJ3R5cGVjaGVjazpjb2RlZ2VuJ107XG4gIGRlbGV0ZSBqc29uT2JqLmRlcGVuZGVuY2llcy50c2xpYjtcbiAgZGVsZXRlIGpzb25PYmouZGV2RGVwZW5kZW5jaWVzWydAd2lsbGJvb3N0ZXIvcmVub3ZhdGUtY29uZmlnJ107XG4gIGRlbGV0ZSBqc29uT2JqLmRldkRlcGVuZGVuY2llc1snQHdpbGxib29zdGVyL3RzY29uZmlnJ107XG4gIC8vIE5leHQuanMgc3RpbGwgcmVxdWlyZXMgdGhlIGB0eXBlc2NyaXB0YCBwYWNrYWdlIGF0IGJ1aWxkL2RldiB0aW1lIGZvclxuICAvLyBUeXBlU2NyaXB0IHByb2plY3RzIGV2ZW4gd2hlbiByZXBvcyB1c2UgdHNnbyBmb3IgZXhwbGljaXQgdHlwZWNoZWNraW5nLlxuICBpZiAoIWNvbmZpZy5kZXBlbmRpbmcubmV4dCkge1xuICAgIGRlbGV0ZSBqc29uT2JqLmRldkRlcGVuZGVuY2llc1t0eXBlc2NyaXB0RGVwZW5kZW5jeV07XG4gIH1cbiAgZGVsZXRlIGpzb25PYmouZGV2RGVwZW5kZW5jaWVzLmxlcm5hO1xuICAvLyBUbyBpbnN0YWxsIHRoZSBsYXRlc3QgcGluc3RcbiAgZGVsZXRlIGpzb25PYmouZGV2RGVwZW5kZW5jaWVzLnBpbnN0O1xuICBkZWxldGUganNvbk9iai5zY3JpcHRzWydmbHV0dGVyLWZvcm1hdCddO1xuICBkZWxldGUganNvbk9iai5zY3JpcHRzWydmb3JtYXQtZmx1dHRlciddO1xuICBkZWxldGUganNvbk9iai5zY3JpcHRzWydweXRob24tZm9ybWF0J107XG4gIGRlbGV0ZSBqc29uT2JqLnNjcmlwdHNbJ2Zvcm1hdC1weXRob24nXTtcbiAgZGVsZXRlIGpzb25PYmouc2NyaXB0cy5wcmV0dGllcjtcbiAgZGVsZXRlIGpzb25PYmouc2NyaXB0c1snY2hlY2stYWxsJ107XG4gIGRlbGV0ZSBqc29uT2JqLnNjcmlwdHNbJ3ZlcmlmeS1jb2RlJ107XG4gIGRlbGV0ZSBqc29uT2JqLnNjcmlwdHNbJ3ZlcmlmeS1jb2RlLXdpdGgtdGVzdHMnXTtcbiAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzLnByb21pc2VzLnJtKHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJ2xlcm5hLmpzb24nKSwgeyBmb3JjZTogdHJ1ZSB9KSk7XG5cbiAgcmVtb3ZlV2lsbEJvb3N0ZXJDb25maWdzTWFuYWdlZERlcGVuZGVuY2llcyhjb25maWcsIGpzb25PYmopO1xuICByZW1vdmVPYnNvbGV0ZUxpbnREZXBlbmRlbmNpZXMoanNvbk9iaiwgY29uZmlnKTtcbn1cblxuZnVuY3Rpb24gcmVtb3ZlU2VsZkRlcGVuZGVuY3koXG4gIGNvbmZpZzogUGFja2FnZUNvbmZpZyxcbiAganNvbk9iajogU2V0UmVxdWlyZWQ8UGFja2FnZUpzb24sICdkZXBlbmRlbmNpZXMnIHwgJ2RldkRlcGVuZGVuY2llcycgfCAncGVlckRlcGVuZGVuY2llcyc+XG4pOiB2b2lkIHtcbiAgY29uc3QgcGFja2FnZU5hbWUgPSBqc29uT2JqLm5hbWUgfHwgcGF0aC5iYXNlbmFtZShjb25maWcuZGlyUGF0aCk7XG5cbiAgLy8gQSBwYWNrYWdlIGNhbiBpbXBvcnQgaXRzZWxmIHRocm91Z2ggTm9kZSdzIHBhY2thZ2Ugc2VsZi1yZWZlcmVuY2Ugd2l0aG91dFxuICAvLyBkZWNsYXJpbmcgaXRzZWxmOyBrZWVwaW5nIHRoYXQgZWRnZSBicmVha3MgbW9ub3JlcG8gcmVsZWFzZSB0b3BvbG9naWNhbCBzb3J0aW5nLlxuICBmb3IgKGNvbnN0IHNlY3Rpb24gb2YgZ2V0RGVwZW5kZW5jeVNlY3Rpb25zKGpzb25PYmopKSB7XG4gICAgUmVmbGVjdC5kZWxldGVQcm9wZXJ0eShzZWN0aW9uLCBwYWNrYWdlTmFtZSk7XG4gIH1cbn1cblxuZnVuY3Rpb24gcmVwbGFjZVdpbGxCb29zdGVyQ29uZmlnc1dvcmtzcGFjZURlcGVuZGVuY3lSYW5nZXMoY29uZmlnOiBQYWNrYWdlQ29uZmlnLCBqc29uT2JqOiBQYWNrYWdlSnNvbik6IHZvaWQge1xuICBpZiAoIWNvbmZpZy5pc1dpbGxCb29zdGVyQ29uZmlncykgcmV0dXJuO1xuXG4gIGZvciAoY29uc3Qgc2VjdGlvbiBvZiBnZXREZXBlbmRlbmN5U2VjdGlvbnMoanNvbk9iaikpIHtcbiAgICBmb3IgKGNvbnN0IFtkZXBlbmRlbmN5LCB2ZXJzaW9uXSBvZiBPYmplY3QuZW50cmllcyhzZWN0aW9uKSkge1xuICAgICAgaWYgKCF2ZXJzaW9uKSBjb250aW51ZTtcbiAgICAgIGlmICghaXNXb3Jrc3BhY2VQcm90b2NvbFJhbmdlKHZlcnNpb24pKSBjb250aW51ZTtcbiAgICAgIC8vIHdpbGxib29zdGVyLWNvbmZpZ3MgcHVibGlzaGVzIHRoZXNlIHBhY2thZ2VzIGluZGVwZW5kZW50bHksIHNvIGdlbmVyYXRlZFxuICAgICAgLy8gcGFja2FnZSBtZXRhZGF0YSBtdXN0IGRlc2NyaWJlIG5wbSByZWxlYXNlIGVkZ2VzIGluc3RlYWQgb2YgbG9jYWxcbiAgICAgIC8vIHdvcmtzcGFjZSBlZGdlcyB0aGF0IHJlbGVhc2UgdG9vbGluZyB0cmVhdHMgYXMgbW9ub3JlcG8gZ3JhcGggbGlua3MuXG4gICAgICAvLyBUaGUgZmluYWwgYHlhcm4gaW5zdGFsbCAtLW5vLWltbXV0YWJsZWAgc3luY3MgdGhlIGxvY2tmaWxlIGFmdGVyIHRoaXNcbiAgICAgIC8vIG1pZ3JhdGlvbiwgZXZlbiB3aGVuIHRoZSBkZXBlbmRlbmN5IGlzIG5vdCBwYXJ0IG9mIHdiZnkncyBtYW5hZ2VkIGxpc3QuXG4gICAgICBzZWN0aW9uW2RlcGVuZGVuY3ldID0gZ2V0TGF0ZXN0RGVwZW5kZW5jeVZlcnNpb24oZGVwZW5kZW5jeSk7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIHJlbW92ZVdpbGxCb29zdGVyQ29uZmlnc01hbmFnZWREZXBlbmRlbmNpZXMoXG4gIGNvbmZpZzogUGFja2FnZUNvbmZpZyxcbiAganNvbk9iajogU2V0UmVxdWlyZWQ8UGFja2FnZUpzb24sICdkZXBlbmRlbmNpZXMnIHwgJ2RldkRlcGVuZGVuY2llcycgfCAncGVlckRlcGVuZGVuY2llcyc+XG4pOiB2b2lkIHtcbiAgaWYgKCFjb25maWcuaXNXaWxsQm9vc3RlckNvbmZpZ3MpIHJldHVybjtcblxuICBjb25zdCBzZWN0aW9ucyA9IGdldERlcGVuZGVuY3lTZWN0aW9ucyhqc29uT2JqKTtcbiAgZm9yIChjb25zdCBkZXBlbmRlbmN5IG9mIHdpbGxCb29zdGVyQ29uZmlnc01hbmFnZWREZXBlbmRlbmNpZXMpIHtcbiAgICAvLyB3aWxsYm9vc3Rlci1jb25maWdzIG93bnMgdGhlc2UgY29uZmlnIHBhY2thZ2VzLiBQYWNrYWdlLWxvY2FsIGZvcm1hdHRlclxuICAgIC8vIGFuZCBsaW50ZXIgY29uZmlnIGZpbGVzIGFyZSByZXBvIHRvb2xpbmcsIG5vdCBwdWJsaXNoZWQgcGFja2FnZSBkYXRhLCBzb1xuICAgIC8vIHRoZSBwYWNrYWdlIG1ldGFkYXRhIG9ubHkgbmVlZHMgdGhlIGZvcm1hdHRlci9saW50ZXIgZXhlY3V0YWJsZXMuXG4gICAgZm9yIChjb25zdCBzZWN0aW9uIG9mIHNlY3Rpb25zKSB7XG4gICAgICBSZWZsZWN0LmRlbGV0ZVByb3BlcnR5KHNlY3Rpb24sIGRlcGVuZGVuY3kpO1xuICAgIH1cbiAgfVxufVxuXG5hc3luYyBmdW5jdGlvbiByZW1vdmVVbnVzZWRUc2NvbmZpZ0Jhc2VEZXBlbmRlbmNpZXMoXG4gIGNvbmZpZzogUGFja2FnZUNvbmZpZyxcbiAganNvbk9iajogV3JpdGFibGVQYWNrYWdlSnNvbixcbiAgdXNlZERlcGVuZGVuY2llczogc3RyaW5nW11cbik6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCB1c2VkRGVwZW5kZW5jeVNldCA9IG5ldyBTZXQodXNlZERlcGVuZGVuY2llcyk7XG4gIGNvbnN0IGV4aXN0aW5nVHNjb25maWdCYXNlRGVwZW5kZW5jaWVzID0gYXdhaXQgZ2V0RXhpc3RpbmdUc2NvbmZpZ0Jhc2VEZXBlbmRlbmNpZXMoY29uZmlnKTtcbiAgZm9yIChjb25zdCBkZXBlbmRlbmN5IG9mIG1hbmFnZWRUc2NvbmZpZ0Jhc2VEZXBlbmRlbmNpZXMpIHtcbiAgICBpZiAodXNlZERlcGVuZGVuY3lTZXQuaGFzKGRlcGVuZGVuY3kpIHx8IGV4aXN0aW5nVHNjb25maWdCYXNlRGVwZW5kZW5jaWVzLmhhcyhkZXBlbmRlbmN5KSkgY29udGludWU7XG4gICAgLy8gd2JmeSBvd25zIHRoZXNlIGJhc2UtY29uZmlnIHBhY2thZ2VzLiBSZW1vdmUgc3RhbGUgdmFyaWFudHMgd2hlbiByZXBvXG4gICAgLy8gY2FwYWJpbGl0aWVzIGNoYW5nZSwgc3VjaCBhcyBOZXh0LmpzIHRha2luZyBvd25lcnNoaXAgb2YgdHNjb25maWcuanNvbi5cbiAgICBmb3IgKGNvbnN0IHNlY3Rpb24gb2YgZ2V0RGVwZW5kZW5jeVNlY3Rpb25zKGpzb25PYmopKSB7XG4gICAgICBSZWZsZWN0LmRlbGV0ZVByb3BlcnR5KHNlY3Rpb24sIGRlcGVuZGVuY3kpO1xuICAgIH1cbiAgfVxufVxuXG5hc3luYyBmdW5jdGlvbiBnZXRFeGlzdGluZ1RzY29uZmlnQmFzZURlcGVuZGVuY2llcyhjb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPFNldDxzdHJpbmc+PiB7XG4gIGNvbnN0IGV4aXN0aW5nVHNjb25maWdCYXNlRGVwZW5kZW5jaWVzID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gIGNvbnN0IGZpbGVQYXRocyA9IGF3YWl0IGZnLmdsb2IoJyoqL3RzY29uZmlnKi5qc29uJywge1xuICAgIGN3ZDogY29uZmlnLmRpclBhdGgsXG4gICAgZG90OiB0cnVlLFxuICAgIGlnbm9yZTogZ2xvYklnbm9yZSxcbiAgfSk7XG5cbiAgZm9yIChjb25zdCBmaWxlUGF0aCBvZiBmaWxlUGF0aHMpIHtcbiAgICBjb25zdCBhYnNvbHV0ZUZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCBmaWxlUGF0aCk7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHBhcnNlZCA9IHRzLnBhcnNlQ29uZmlnRmlsZVRleHRUb0pzb24oXG4gICAgICAgIGFic29sdXRlRmlsZVBhdGgsXG4gICAgICAgIGF3YWl0IGZzLnByb21pc2VzLnJlYWRGaWxlKGFic29sdXRlRmlsZVBhdGgsICd1dGY4JylcbiAgICAgICk7XG4gICAgICBpZiAocGFyc2VkLmVycm9yKSB7XG4gICAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgICBgUHJlc2VydmUgbWFuYWdlZCBAdHNjb25maWcgZGVwZW5kZW5jaWVzIGJlY2F1c2UgJHthYnNvbHV0ZUZpbGVQYXRofSBjb3VsZCBub3QgYmUgcGFyc2VkOiAke2Zvcm1hdFRzRGlhZ25vc3RpYyhwYXJzZWQuZXJyb3IpfWBcbiAgICAgICAgKTtcbiAgICAgICAgcmV0dXJuIG5ldyBTZXQobWFuYWdlZFRzY29uZmlnQmFzZURlcGVuZGVuY2llcyk7XG4gICAgICB9XG4gICAgICBmb3IgKGNvbnN0IHZhbHVlIG9mIG5vcm1hbGl6ZVRzY29uZmlnRXh0ZW5kcygocGFyc2VkLmNvbmZpZyBhcyB7IGV4dGVuZHM/OiB1bmtub3duIH0gfCB1bmRlZmluZWQpPy5leHRlbmRzKSkge1xuICAgICAgICBmb3IgKGNvbnN0IGRlcGVuZGVuY3kgb2YgbWFuYWdlZFRzY29uZmlnQmFzZURlcGVuZGVuY2llcykge1xuICAgICAgICAgIGlmICh2YWx1ZSA9PT0gZGVwZW5kZW5jeSB8fCB2YWx1ZS5zdGFydHNXaXRoKGAke2RlcGVuZGVuY3l9L2ApKSB7XG4gICAgICAgICAgICBleGlzdGluZ1RzY29uZmlnQmFzZURlcGVuZGVuY2llcy5hZGQoZGVwZW5kZW5jeSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgYFByZXNlcnZlIG1hbmFnZWQgQHRzY29uZmlnIGRlcGVuZGVuY2llcyBiZWNhdXNlICR7YWJzb2x1dGVGaWxlUGF0aH0gY291bGQgbm90IGJlIHJlYWQ6ICR7ZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiBTdHJpbmcoZXJyb3IpfWBcbiAgICAgICk7XG4gICAgICByZXR1cm4gbmV3IFNldChtYW5hZ2VkVHNjb25maWdCYXNlRGVwZW5kZW5jaWVzKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gZXhpc3RpbmdUc2NvbmZpZ0Jhc2VEZXBlbmRlbmNpZXM7XG59XG5cbmZ1bmN0aW9uIGZvcm1hdFRzRGlhZ25vc3RpYyhkaWFnbm9zdGljOiB0cy5EaWFnbm9zdGljKTogc3RyaW5nIHtcbiAgcmV0dXJuIHRzLmZsYXR0ZW5EaWFnbm9zdGljTWVzc2FnZVRleHQoZGlhZ25vc3RpYy5tZXNzYWdlVGV4dCwgJ1xcbicpO1xufVxuXG5mdW5jdGlvbiBub3JtYWxpemVUc2NvbmZpZ0V4dGVuZHModmFsdWU6IHVua25vd24pOiBzdHJpbmdbXSB7XG4gIGlmICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnKSByZXR1cm4gW3ZhbHVlXTtcbiAgaWYgKCFBcnJheS5pc0FycmF5KHZhbHVlKSkgcmV0dXJuIFtdO1xuICByZXR1cm4gdmFsdWUuZmlsdGVyKChpdGVtKTogaXRlbSBpcyBzdHJpbmcgPT4gdHlwZW9mIGl0ZW0gPT09ICdzdHJpbmcnKTtcbn1cblxuZnVuY3Rpb24gZ2V0RGVwZW5kZW5jeVNlY3Rpb25zKGpzb25PYmo6IFBhY2thZ2VKc29uKTogUGFydGlhbDxSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+PltdIHtcbiAgcmV0dXJuIGRlcGVuZGVuY3lTZWN0aW9uS2V5c1xuICAgIC5tYXAoKGtleSkgPT4ganNvbk9ialtrZXldKVxuICAgIC5maWx0ZXIoKHNlY3Rpb24pOiBzZWN0aW9uIGlzIFBhcnRpYWw8UmVjb3JkPHN0cmluZywgc3RyaW5nPj4gPT4gISFzZWN0aW9uKTtcbn1cblxuZnVuY3Rpb24gZ2V0TGF0ZXN0RGVwZW5kZW5jeVZlcnNpb24oZGVwZW5kZW5jeTogc3RyaW5nKTogc3RyaW5nIHtcbiAgY29uc3QgbWFuYWdlZFZlcnNpb24gPSBnZXRNYW5hZ2VkRGVwZW5kZW5jeVZlcnNpb24oZGVwZW5kZW5jeSk7XG4gIGlmIChtYW5hZ2VkVmVyc2lvbikgcmV0dXJuIG1hbmFnZWRWZXJzaW9uO1xuXG4gIGNvbnN0IGNhY2hlZFZlcnNpb24gPSBsYXRlc3REZXBlbmRlbmN5VmVyc2lvbkNhY2hlLmdldChkZXBlbmRlbmN5KTtcbiAgaWYgKGNhY2hlZFZlcnNpb24pIHJldHVybiBjYWNoZWRWZXJzaW9uO1xuXG4gIGNvbnN0IHZlcnNpb24gPSBnZXREZXBlbmRlbmN5VmVyc2lvbkZyb21OcG0oZGVwZW5kZW5jeSk7XG4gIGxhdGVzdERlcGVuZGVuY3lWZXJzaW9uQ2FjaGUuc2V0KGRlcGVuZGVuY3ksIHZlcnNpb24pO1xuICByZXR1cm4gdmVyc2lvbjtcbn1cblxuZnVuY3Rpb24gZ2V0TWFuYWdlZERlcGVuZGVuY3lWZXJzaW9uKGRlcGVuZGVuY3k6IHN0cmluZyk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGlmICghYmFzZWxpbmVNYW5hZ2VkRGVwZW5kZW5jaWVzLmhhcyhkZXBlbmRlbmN5KSkgcmV0dXJuIHVuZGVmaW5lZDtcblxuICAvLyBUaGVzZSB0b29scyBvZnRlbiBzaGlwIG5hdGl2ZSBiaW5hcmllcy4gVXNlIHdiZnkncyB0ZXN0ZWQgZGVwZW5kZW5jeVxuICAvLyBiYXNlbGluZSBpbnN0ZWFkIG9mIGxpdmUgbnBtIGxhdGVzdCBzbyBnZW5lcmF0ZWQgbG9ja2ZpbGVzIGRvIG5vdCBwdWxsXG4gIC8vIHVucmV2aWV3ZWQgdG9vbCByZWxlYXNlcyBpbnRvIGV2ZXJ5IHJlcG9zaXRvcnkgYXQgcnVudGltZS5cbiAgcmV0dXJuIG1hbmFnZWREZXBlbmRlbmN5VmVyc2lvbnNbZGVwZW5kZW5jeV07XG59XG5cbmZ1bmN0aW9uIHJlYWRXYmZ5UGFja2FnZUpzb24oKTogUGFja2FnZUpzb24ge1xuICBsZXQgZGlyUGF0aCA9IHBhdGguZGlybmFtZShmaWxlVVJMVG9QYXRoKGltcG9ydC5tZXRhLnVybCkpO1xuICB3aGlsZSAodHJ1ZSkge1xuICAgIGNvbnN0IHBhY2thZ2VKc29uUGF0aCA9IHBhdGguam9pbihkaXJQYXRoLCAncGFja2FnZS5qc29uJyk7XG4gICAgaWYgKGZzLmV4aXN0c1N5bmMocGFja2FnZUpzb25QYXRoKSkge1xuICAgICAgY29uc3QgcGFja2FnZUpzb24gPSBKU09OLnBhcnNlKGZzLnJlYWRGaWxlU3luYyhwYWNrYWdlSnNvblBhdGgsICd1dGY4JykpIGFzIFBhY2thZ2VKc29uO1xuICAgICAgaWYgKHBhY2thZ2VKc29uLm5hbWUgPT09ICdAd2lsbGJvb3N0ZXIvd2JmeScpIHJldHVybiBwYWNrYWdlSnNvbjtcbiAgICB9XG5cbiAgICBjb25zdCBwYXJlbnREaXJQYXRoID0gcGF0aC5kaXJuYW1lKGRpclBhdGgpO1xuICAgIGlmIChwYXJlbnREaXJQYXRoID09PSBkaXJQYXRoKSB0aHJvdyBuZXcgRXJyb3IoJ0NvdWxkIG5vdCBmaW5kIEB3aWxsYm9vc3Rlci93YmZ5IHBhY2thZ2UuanNvbicpO1xuICAgIGRpclBhdGggPSBwYXJlbnREaXJQYXRoO1xuICB9XG59XG5cbmZ1bmN0aW9uIGdldERlcGVuZGVuY3lWZXJzaW9uRnJvbU5wbShkZXBlbmRlbmN5OiBzdHJpbmcpOiBzdHJpbmcge1xuICAvLyBucG0ncyBsYXRlc3QgZGlzdC10YWcgc3RpbGwgdHJhY2tzIFRTNyBkZXYgc25hcHNob3RzOyB3YmZ5IHNob3VsZCBmb2xsb3dcbiAgLy8gdGhlIHB1YmxpYyBiZXRhIGNoYW5uZWwgdW50aWwgdGhlIHN0YWJsZSBUUzcgcGFja2FnZSBsYXlvdXQgaXMgZmluYWxpemVkLlxuICByZXR1cm4gKFxuICAgIHNwYXduU3luY0FuZFJldHVyblN0ZG91dChcbiAgICAgICducG0nLFxuICAgICAgWydzaG93JywgZ2V0RGVwZW5kZW5jeVNwZWNpZmllcihkZXBlbmRlbmN5KSwgJ3ZlcnNpb24nLCAnLS13b3Jrc3BhY2VzPWZhbHNlJ10sXG4gICAgICBwcm9jZXNzLmN3ZCgpXG4gICAgKSB8fCAnKidcbiAgKTtcbn1cblxuZnVuY3Rpb24gZ2V0RGVwZW5kZW5jeVNwZWNpZmllcihkZXBlbmRlbmN5OiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gZGVwZW5kZW5jeSA9PT0gdHlwZXNjcmlwdEdvRGVwZW5kZW5jeSA/IGAke2RlcGVuZGVuY3l9QGJldGFgIDogZGVwZW5kZW5jeTtcbn1cblxuZnVuY3Rpb24gcmVtb3ZlT2Jzb2xldGVMaW50RGVwZW5kZW5jaWVzKFxuICBqc29uT2JqOiBTZXRSZXF1aXJlZDxQYWNrYWdlSnNvbiwgJ2RlcGVuZGVuY2llcycgfCAnZGV2RGVwZW5kZW5jaWVzJyB8ICdwZWVyRGVwZW5kZW5jaWVzJz4sXG4gIGNvbmZpZzogUGFja2FnZUNvbmZpZ1xuKTogdm9pZCB7XG4gIGNvbnN0IHByZXNlcnZlTWljcm9tYXRjaCA9IHNob3VsZFByZXNlcnZlTWljcm9tYXRjaChjb25maWcpO1xuICBmb3IgKGNvbnN0IGRlcGVuZGVuY3kgb2Ygb2Jzb2xldGVMaW50RGVwZW5kZW5jaWVzKSB7XG4gICAgaWYgKHByZXNlcnZlTWljcm9tYXRjaCAmJiBtaWNyb21hdGNoUGFja2FnZU5hbWVzLmhhcyhkZXBlbmRlbmN5KSkgY29udGludWU7XG4gICAgaWYgKHNob3VsZFByZXNlcnZlQ29uZmlnUGFja2FnZUxpbnREZXBlbmRlbmN5KGpzb25PYmosIGNvbmZpZywgZGVwZW5kZW5jeSkpIGNvbnRpbnVlO1xuICAgIGRlbGV0ZSBqc29uT2JqLmRlcGVuZGVuY2llc1tkZXBlbmRlbmN5XTtcbiAgICBkZWxldGUganNvbk9iai5kZXZEZXBlbmRlbmNpZXNbZGVwZW5kZW5jeV07XG4gICAgZGVsZXRlIGpzb25PYmoucGVlckRlcGVuZGVuY2llc1tkZXBlbmRlbmN5XTtcbiAgfVxufVxuXG5mdW5jdGlvbiBzaG91bGRQcmVzZXJ2ZUNvbmZpZ1BhY2thZ2VMaW50RGVwZW5kZW5jeShcbiAganNvbk9iajogU2V0UmVxdWlyZWQ8UGFja2FnZUpzb24sICdkZXBlbmRlbmNpZXMnIHwgJ2RldkRlcGVuZGVuY2llcycgfCAncGVlckRlcGVuZGVuY2llcyc+LFxuICBjb25maWc6IFBhY2thZ2VDb25maWcsXG4gIGRlcGVuZGVuY3k6IHN0cmluZ1xuKTogYm9vbGVhbiB7XG4gIGlmICghaXNQdWJsaXNoZWRXaWxsYm9vc3RlckNvbmZpZ3NQYWNrYWdlKGNvbmZpZykpIHJldHVybiBmYWxzZTtcbiAgaWYgKGpzb25PYmoucGVlckRlcGVuZGVuY2llc1tkZXBlbmRlbmN5XSkgcmV0dXJuIHRydWU7XG5cbiAgLy8gUHVibGlzaGVkIGNvbmZpZyBwYWNrYWdlcyBuZWVkIGxvY2FsIHR5cGUtb25seSBkZXBzIHRvIHZhbGlkYXRlIHRoZVxuICAvLyBwYWNrYWdlLXByb3ZpZGVkIGNvbmZpZyBkZWNsYXJhdGlvbnMgdW5kZXIgWWFybiBQblAuXG4gIHJldHVybiBkZXBlbmRlbmN5ID09PSAnQHR5cGVzL2VzbGludCcgJiYgISFqc29uT2JqLnBlZXJEZXBlbmRlbmNpZXMuZXNsaW50O1xufVxuXG5mdW5jdGlvbiBzaG91bGRQcmVzZXJ2ZU1pY3JvbWF0Y2goY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogYm9vbGVhbiB7XG4gIC8vIHdpbGxib29zdGVyLWNvbmZpZ3Mgc3VicGFja2FnZXMgcHVibGlzaCBjb25maWcgZmlsZXMgYXMgdGhlaXIgcHJvZHVjdCwgc29cbiAgLy8gbWljcm9tYXRjaCBpcyBwYWNrYWdlIGRhdGEgdGhlcmUuIE90aGVyIHJlcG9zIGtlZXAgbWljcm9tYXRjaCBvbmx5IHdoZW5cbiAgLy8gcHJvZHVjdCBjb2RlIGltcG9ydHMgaXQ7IG90aGVyd2lzZSBpdCBpcyB0cmVhdGVkIGFzIG9ic29sZXRlIEVTTGludC1lcmFcbiAgLy8gdG9vbGluZy5cbiAgcmV0dXJuIChjb25maWcuaXNXaWxsQm9vc3RlckNvbmZpZ3MgJiYgIWNvbmZpZy5pc1Jvb3QpIHx8IGRvZXNQcm9kdWN0Q29kZUltcG9ydE1pY3JvbWF0Y2goY29uZmlnLmRpclBhdGgpO1xufVxuXG5mdW5jdGlvbiBkb2VzUHJvZHVjdENvZGVJbXBvcnRNaWNyb21hdGNoKGRpclBhdGg6IHN0cmluZyk6IGJvb2xlYW4ge1xuICBjb25zdCBmaWxlUGF0aHMgPSBmZy5nbG9iU3luYygnc3JjLyoqLyoue2pzLGpzeCxtanMsY2pzLHRzLHRzeCxtdHMsY3RzfScsIHtcbiAgICBjd2Q6IGRpclBhdGgsXG4gICAgZG90OiB0cnVlLFxuICAgIGlnbm9yZTogZ2xvYklnbm9yZSxcbiAgfSk7XG4gIHJldHVybiBmaWxlUGF0aHMuc29tZSgoZmlsZVBhdGgpID0+IHtcbiAgICB0cnkge1xuICAgICAgcmV0dXJuIG1pY3JvbWF0Y2hJbXBvcnRQYXR0ZXJuLnRlc3QoZnMucmVhZEZpbGVTeW5jKHBhdGgucmVzb2x2ZShkaXJQYXRoLCBmaWxlUGF0aCksICd1dGY4JykpO1xuICAgIH0gY2F0Y2gge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfSk7XG59XG5cbmZ1bmN0aW9uIHNob3VsZFVwZGF0ZUV4aXN0aW5nTWFuYWdlZERlcGVuZGVuY3koZGVwZW5kZW5jeTogc3RyaW5nLCBjdXJyZW50VmVyc2lvbjogc3RyaW5nIHwgdW5kZWZpbmVkKTogYm9vbGVhbiB7XG4gIGlmICghY3VycmVudFZlcnNpb24pIHJldHVybiB0cnVlO1xuICBpZiAoY3VycmVudFZlcnNpb24gPT09ICcqJykgcmV0dXJuIHRydWU7XG4gIGlmIChpc1dvcmtzcGFjZVByb3RvY29sUmFuZ2UoY3VycmVudFZlcnNpb24pKSByZXR1cm4gdHJ1ZTtcbiAgaWYgKGRlcGVuZGVuY3kgPT09IHR5cGVzY3JpcHRHb0RlcGVuZGVuY3kpIHJldHVybiBpc05ld2VyTWFuYWdlZERlcGVuZGVuY3lWZXJzaW9uKGRlcGVuZGVuY3ksIGN1cnJlbnRWZXJzaW9uKTtcbiAgLy8gd2JmeSBvd25zIHRoZXNlIHRvb2wgYmFzZWxpbmVzLCBidXQgYXBwbHlpbmcgd2JmeSBzaG91bGQgbm90IGRvd25ncmFkZSBhXG4gIC8vIHJlcG9zaXRvcnkgdGhhdCBhbHJlYWR5IHBpbnMgYSBuZXdlciByZXZpZXdlZCByZWxlYXNlLlxuICByZXR1cm4gYmFzZWxpbmVNYW5hZ2VkRGVwZW5kZW5jaWVzLmhhcyhkZXBlbmRlbmN5KSAmJiBpc05ld2VyTWFuYWdlZERlcGVuZGVuY3lWZXJzaW9uKGRlcGVuZGVuY3ksIGN1cnJlbnRWZXJzaW9uKTtcbn1cblxuZnVuY3Rpb24gaXNOZXdlck1hbmFnZWREZXBlbmRlbmN5VmVyc2lvbihkZXBlbmRlbmN5OiBzdHJpbmcsIGN1cnJlbnRWZXJzaW9uOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgY29uc3QgbGF0ZXN0VmVyc2lvbiA9IGdldExhdGVzdERlcGVuZGVuY3lWZXJzaW9uKGRlcGVuZGVuY3kpO1xuICBjb25zdCB2YWxpZExhdGVzdFZlcnNpb24gPSBzZW12ZXIudmFsaWQobGF0ZXN0VmVyc2lvbik7XG4gIGNvbnN0IHZhbGlkQ3VycmVudFZlcnNpb24gPSBzZW12ZXIudmFsaWQoY3VycmVudFZlcnNpb24pO1xuICAvLyBUaGUgVHlwZVNjcmlwdCBiZXRhIGRpc3QtdGFnIGNhbiBsYWcgYmVoaW5kIG5ld2VyIGNvbmNyZXRlIGRldiBzbmFwc2hvdHNcbiAgLy8gYWxyZWFkeSBwaW5uZWQgYnkgUmVub3ZhdGUuIEtlZXAgdGhlIGV4aXN0aW5nIHBpbiBpbnN0ZWFkIG9mIGRvd25ncmFkaW5nLlxuICByZXR1cm4gIXZhbGlkTGF0ZXN0VmVyc2lvbiB8fCAhdmFsaWRDdXJyZW50VmVyc2lvbiB8fCBzZW12ZXIuZ3QodmFsaWRMYXRlc3RWZXJzaW9uLCB2YWxpZEN1cnJlbnRWZXJzaW9uKTtcbn1cblxuZnVuY3Rpb24gaXNXb3Jrc3BhY2VQcm90b2NvbFJhbmdlKHZlcnNpb246IHN0cmluZyk6IGJvb2xlYW4ge1xuICByZXR1cm4gdmVyc2lvbi5zdGFydHNXaXRoKCd3b3Jrc3BhY2U6Jyk7XG59XG5cbmZ1bmN0aW9uIGZvcm1hdFJlcG9zaXRvcnlGb3JQYWNrYWdlSnNvbihcbiAgcmVwb3NpdG9yeTogUGFja2FnZUpzb25bJ3JlcG9zaXRvcnknXSxcbiAgZXhpc3RpbmdSZXBvc2l0b3J5PzogUGFja2FnZUpzb25bJ3JlcG9zaXRvcnknXVxuKTogUGFja2FnZUpzb25bJ3JlcG9zaXRvcnknXSB7XG4gIGNvbnN0IG5vcm1hbGl6ZWRSZXBvc2l0b3J5ID0gbm9ybWFsaXplUmVwb3NpdG9yeVVybEZvclBhY2thZ2VKc29uKHJlcG9zaXRvcnkpO1xuICBpZiAobm9ybWFsaXplZFJlcG9zaXRvcnkpIHtcbiAgICByZXR1cm4gYnVpbGROb3JtYWxpemVkUmVwb3NpdG9yeUZvclBhY2thZ2VKc29uKG5vcm1hbGl6ZWRSZXBvc2l0b3J5LCByZXBvc2l0b3J5LCBleGlzdGluZ1JlcG9zaXRvcnkpO1xuICB9XG5cbiAgY29uc3Qgbm9ybWFsaXplZEV4aXN0aW5nUmVwb3NpdG9yeSA9IG5vcm1hbGl6ZVJlcG9zaXRvcnlVcmxGb3JQYWNrYWdlSnNvbihleGlzdGluZ1JlcG9zaXRvcnkpO1xuICBpZiAobm9ybWFsaXplZEV4aXN0aW5nUmVwb3NpdG9yeSkge1xuICAgIHJldHVybiBidWlsZE5vcm1hbGl6ZWRSZXBvc2l0b3J5Rm9yUGFja2FnZUpzb24obm9ybWFsaXplZEV4aXN0aW5nUmVwb3NpdG9yeSwgZXhpc3RpbmdSZXBvc2l0b3J5KTtcbiAgfVxuXG4gIHJldHVybiByZXBvc2l0b3J5O1xufVxuXG5mdW5jdGlvbiBub3JtYWxpemVSZXBvc2l0b3J5VXJsRm9yUGFja2FnZUpzb24ocmVwb3NpdG9yeTogUGFja2FnZUpzb25bJ3JlcG9zaXRvcnknXSk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGlmICh0eXBlb2YgcmVwb3NpdG9yeSA9PT0gJ3N0cmluZycpIHtcbiAgICBpZiAoIXJlcG9zaXRvcnkuc3RhcnRzV2l0aCgnZ2l0aHViOicpKSByZXR1cm47XG5cbiAgICBjb25zdCBbb3duZXIsIHJlcG9dID0gZ2l0SHViVXRpbC5nZXRPcmdBbmROYW1lKHJlcG9zaXRvcnkpO1xuICAgIGlmICghb3duZXIgfHwgIXJlcG8pIHJldHVybjtcbiAgICByZXR1cm4gYGdpdCtodHRwczovL2dpdGh1Yi5jb20vJHtvd25lcn0vJHtyZXBvfS5naXRgO1xuICB9XG5cbiAgY29uc3QgcmVwb3NpdG9yeVVybCA9IHJlcG9zaXRvcnk/LnVybDtcbiAgaWYgKHR5cGVvZiByZXBvc2l0b3J5VXJsICE9PSAnc3RyaW5nJykgcmV0dXJuO1xuXG4gIGNvbnN0IG1hdGNoZWQgPSAvXig/OmdpdFxcKyk/aHR0cHM6XFwvXFwvZ2l0aHViXFwuY29tXFwvKFteL10rKVxcLyhbXi9dKz8pKD86XFwuZ2l0KT8kL3UuZXhlYyhyZXBvc2l0b3J5VXJsKTtcbiAgaWYgKCFtYXRjaGVkKSByZXR1cm47XG5cbiAgY29uc3QgWywgb3duZXIsIHJlcG9dID0gbWF0Y2hlZDtcbiAgcmV0dXJuIGBnaXQraHR0cHM6Ly9naXRodWIuY29tLyR7b3duZXJ9LyR7cmVwb30uZ2l0YDtcbn1cblxuZnVuY3Rpb24gYnVpbGROb3JtYWxpemVkUmVwb3NpdG9yeUZvclBhY2thZ2VKc29uKFxuICBub3JtYWxpemVkVXJsOiBzdHJpbmcsXG4gIHJlcG9zaXRvcnk6IFBhY2thZ2VKc29uWydyZXBvc2l0b3J5J10sXG4gIGV4aXN0aW5nUmVwb3NpdG9yeT86IFBhY2thZ2VKc29uWydyZXBvc2l0b3J5J11cbik6IFBhY2thZ2VKc29uWydyZXBvc2l0b3J5J10ge1xuICBjb25zdCByZXBvc2l0b3J5T2JqID1cbiAgICB0eXBlb2YgcmVwb3NpdG9yeSA9PT0gJ29iamVjdCdcbiAgICAgID8gcmVwb3NpdG9yeVxuICAgICAgOiB0eXBlb2YgZXhpc3RpbmdSZXBvc2l0b3J5ID09PSAnb2JqZWN0J1xuICAgICAgICA/IGV4aXN0aW5nUmVwb3NpdG9yeVxuICAgICAgICA6IHVuZGVmaW5lZDtcblxuICByZXR1cm4ge1xuICAgIC4uLnJlcG9zaXRvcnlPYmosXG4gICAgdHlwZTogJ2dpdCcsXG4gICAgdXJsOiBub3JtYWxpemVkVXJsLFxuICB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2VuZXJhdGVTY3JpcHRzKGNvbmZpZzogUGFja2FnZUNvbmZpZywgb2xkU2NyaXB0czogUGFja2FnZUpzb24uU2NyaXB0cyk6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4ge1xuICBpZiAoY29uZmlnLmlzQnVuKSB7XG4gICAgY29uc3QgaGFzVHlwZWNoZWNrID0gY29uZmlnLmRvZXNDb250YWluVHlwZVNjcmlwdCB8fCBjb25maWcuZG9lc0NvbnRhaW5UeXBlU2NyaXB0SW5QYWNrYWdlcztcbiAgICBjb25zdCBzY3JpcHRzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge1xuICAgICAgY2xlYW51cDogJ2J1biAtLWJ1biB3YiBsaW50IC0tZml4IC0tZm9ybWF0JyxcbiAgICAgIGZvcm1hdDogYGJ1biAtLWJ1biB3YiBsaW50IC0tZm9ybWF0YCxcbiAgICAgIGxpbnQ6IGBidW4gLS1idW4gd2IgbGludGAsXG4gICAgICAnbGludC1maXgnOiAnYnVuIC0tYnVuIHdiIGxpbnQgLS1maXgnLFxuICAgICAgdGVzdDogJ2J1biB3YiB0ZXN0JyxcbiAgICAgIHR5cGVjaGVjazogJ2J1biAtLWJ1biB3YiB0eXBlY2hlY2snLFxuICAgICAgdmVyaWZ5OiAnYnVuIC0tYnVuIHdiIHZlcmlmeScsXG4gICAgICAndmVyaWZ5LWZ1bGwnOiAnYnVuIC0tYnVuIHdiIHZlcmlmeSAtLWZ1bGwnLFxuICAgIH07XG4gICAgYXBwbHlNaXNlVGFza1NjcmlwdHMoY29uZmlnLCBzY3JpcHRzLCBvbGRTY3JpcHRzLCBbJ2J1aWxkJywgJ2RldicsICdzdGFydCcsICd0ZXN0JywgJ3R5cGVjaGVjayddKTtcbiAgICBpZiAoIWhhc1R5cGVjaGVjaykge1xuICAgICAgZGVsZXRlIHNjcmlwdHMudHlwZWNoZWNrO1xuICAgIH0gZWxzZSBpZiAoY29uZmlnLmRlcGVuZGluZy5weXJpZ2h0KSB7XG4gICAgICBzY3JpcHRzLnR5cGVjaGVjayArPSAnICYmIHB5cmlnaHQnO1xuICAgIH1cbiAgICByZXR1cm4gc2NyaXB0cztcbiAgfSBlbHNlIHtcbiAgICBjb25zdCBoYXNUeXBlY2hlY2sgPSBjb25maWcuZG9lc0NvbnRhaW5UeXBlU2NyaXB0IHx8IGNvbmZpZy5kb2VzQ29udGFpblR5cGVTY3JpcHRJblBhY2thZ2VzO1xuICAgIGNvbnN0IGhhc0pzT3JUcyA9IGRvZXNDb250YWluSnNPclRzKGNvbmZpZyk7XG4gICAgY29uc3QgaGFzSmF2YSA9IGRvZXNDb250YWluSmF2YShjb25maWcpO1xuICAgIGNvbnN0IG9sZFRlc3QgPSBvbGRTY3JpcHRzLnRlc3Q7XG4gICAgbGV0IHNjcmlwdHM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7XG4gICAgICBjbGVhbnVwOiAneWFybiBmb3JtYXQgJiYgeWFybiBsaW50LWZpeCcsXG4gICAgICBmb3JtYXQ6IGdlbmVyYXRlRm9ybWF0U2NyaXB0KGhhc0pzT3JUcywgaGFzSmF2YSksXG4gICAgICBsaW50OiBgb3hsaW50IC0tbm8tZXJyb3Itb24tdW5tYXRjaGVkLXBhdHRlcm4gLmAsXG4gICAgICAnbGludC1maXgnOiAneWFybiBsaW50IC0tZml4JyxcbiAgICAgICdmb3JtYXQtY29kZSc6IGBveGZtdCAtLXdyaXRlIC0tbm8tZXJyb3Itb24tdW5tYXRjaGVkLXBhdHRlcm4gLiAnISoqL3BhY2thZ2UuanNvbidgLFxuICAgICAgdHlwZWNoZWNrOiAndHNnbyAtLW5vRW1pdCcsXG4gICAgfTtcbiAgICBpZiAoaGFzSmF2YSkge1xuICAgICAgc2NyaXB0cy5wcmV0dGlmeSA9IGBwcmV0dGllciAtLWNhY2hlIC0tY29sb3IgLS1uby1lcnJvci1vbi11bm1hdGNoZWQtcGF0dGVybiAtLXdyaXRlIFwiKiovey4qLyx9Ki57JHtleHRlbnNpb25zLnByZXR0aWVyT25seS5qb2luKCcsJyl9fVwiIFwiISoqL3Rlc3R7LSwvfWZpeHR1cmVzLyoqXCJgO1xuICAgIH1cbiAgICBpZiAoY29uZmlnLmRvZXNDb250YWluU3ViUGFja2FnZUpzb25zKSB7XG4gICAgICBzY3JpcHRzID0gbWVyZ2UoXG4gICAgICAgIHsgLi4uc2NyaXB0cyB9LFxuICAgICAgICB7XG4gICAgICAgICAgZm9ybWF0OiBgJHtzY3JpcHRzLmZvcm1hdH0gJiYgeWFybiB3b3Jrc3BhY2VzIGZvcmVhY2ggLS1hbGwgLS1wYXJhbGxlbCAtLXZlcmJvc2UgcnVuIGZvcm1hdGAsXG4gICAgICAgICAgbGludDogYHlhcm4gd29ya3NwYWNlcyBmb3JlYWNoIC0tYWxsIC0tcGFyYWxsZWwgLS12ZXJib3NlIHJ1biBsaW50YCxcbiAgICAgICAgICAnbGludC1maXgnOiAneWFybiB3b3Jrc3BhY2VzIGZvcmVhY2ggLS1hbGwgLS1wYXJhbGxlbCAtLXZlcmJvc2UgcnVuIGxpbnQtZml4JyxcbiAgICAgICAgICAvLyBDST0xIHByZXZlbnRzIHZpdGVzdCBmcm9tIGVuYWJsaW5nIHdhdGNoLlxuICAgICAgICAgIC8vIEZPUkNFX0NPTE9SPTMgbWFrZSB3YiBlbmFibGUgY29sb3Igb3V0cHV0LlxuICAgICAgICAgIHRlc3Q6ICdDST0xIEZPUkNFX0NPTE9SPTMgeWFybiB3b3Jrc3BhY2VzIGZvcmVhY2ggLS1hbGwgLS12ZXJib3NlIHJ1biB0ZXN0JyxcbiAgICAgICAgICB0eXBlY2hlY2s6ICd5YXJuIHdvcmtzcGFjZXMgZm9yZWFjaCAtLWFsbCAtLXBhcmFsbGVsIC0tdmVyYm9zZSBydW4gdHlwZWNoZWNrJyxcbiAgICAgICAgfVxuICAgICAgKTtcbiAgICAgIGlmIChoYXNKYXZhKSB7XG4gICAgICAgIHNjcmlwdHMucHJldHRpZnkgPSBgcHJldHRpZXIgLS1jYWNoZSAtLWNvbG9yIC0tbm8tZXJyb3Itb24tdW5tYXRjaGVkLXBhdHRlcm4gLS13cml0ZSBcIioqL3suKi8sfSoueyR7ZXh0ZW5zaW9ucy5wcmV0dGllck9ubHkuam9pbihcbiAgICAgICAgICAnLCdcbiAgICAgICAgKX19XCIgXCIhKiovcGFja2FnZXMvKipcIiBcIiEqKi90ZXN0ey0sL31maXh0dXJlcy8qKlwiYDtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKGNvbmZpZy5kZXBlbmRpbmcucHlyaWdodCkge1xuICAgICAgc2NyaXB0cy50eXBlY2hlY2sgPSBzY3JpcHRzLnR5cGVjaGVjayA/IGAke3NjcmlwdHMudHlwZWNoZWNrfSAmJiBgIDogJyc7XG4gICAgICBzY3JpcHRzLnR5cGVjaGVjayArPSAncHlyaWdodCc7XG4gICAgfVxuICAgIGlmIChvbGRUZXN0Py5pbmNsdWRlcygnd2IgdGVzdCcpKSB7XG4gICAgICBzY3JpcHRzLnRlc3QgPSBvbGRUZXN0O1xuICAgIH1cbiAgICBpZiAoIWhhc0pzT3JUcykge1xuICAgICAgZGVsZXRlIHNjcmlwdHNbJ2Zvcm1hdC1jb2RlJ107XG4gICAgICBkZWxldGUgc2NyaXB0cy5saW50O1xuICAgICAgZGVsZXRlIHNjcmlwdHNbJ2xpbnQtZml4J107XG4gICAgfVxuICAgIGlmICghaGFzVHlwZWNoZWNrKSB7XG4gICAgICBkZWxldGUgc2NyaXB0cy50eXBlY2hlY2s7XG4gICAgfSBlbHNlIGlmIChjb25maWcuZGVwZW5kaW5nLndiKSB7XG4gICAgICBzY3JpcHRzLnR5cGVjaGVjayA9ICd3YiB0eXBlY2hlY2snO1xuICAgIH1cbiAgICBpZiAoaXNXYlBhY2thZ2UoY29uZmlnLnBhY2thZ2VKc29uKSkge1xuICAgICAgc2NyaXB0cy52ZXJpZnkgPSBvbGRTY3JpcHRzLnZlcmlmeSA/PyAneWFybiB3b3Jrc3BhY2UgQHdpbGxib29zdGVyL3diIHN0YXJ0IC0td29ya2luZy1kaXIgXCIkSU5JVF9DV0RcIiB2ZXJpZnknO1xuICAgICAgc2NyaXB0c1sndmVyaWZ5LWZ1bGwnXSA9IG9sZFNjcmlwdHNbJ3ZlcmlmeS1mdWxsJ10gPz8gJ3lhcm4gdmVyaWZ5IC0tZnVsbCc7XG4gICAgfSBlbHNlIHtcbiAgICAgIHNjcmlwdHMudmVyaWZ5ID0gJ3diIHZlcmlmeSc7XG4gICAgICBzY3JpcHRzWyd2ZXJpZnktZnVsbCddID0gJ3diIHZlcmlmeSAtLWZ1bGwnO1xuICAgIH1cbiAgICBhcHBseU1pc2VUYXNrU2NyaXB0cyhjb25maWcsIHNjcmlwdHMsIG9sZFNjcmlwdHMsIFsnYnVpbGQnLCAnZGV2JywgJ3N0YXJ0JywgJ3Rlc3QnLCAndHlwZWNoZWNrJ10pO1xuICAgIHJldHVybiBzY3JpcHRzO1xuICB9XG59XG5cbmZ1bmN0aW9uIGlzV2JQYWNrYWdlKHBhY2thZ2VKc29uOiBQYWNrYWdlSnNvbiB8IHVuZGVmaW5lZCk6IGJvb2xlYW4ge1xuICByZXR1cm4gcGFja2FnZUpzb24/Lm5hbWUgPT09IHdiRGVwZW5kZW5jeTtcbn1cblxuZnVuY3Rpb24gYXBwbHlNaXNlVGFza1NjcmlwdHMoXG4gIGNvbmZpZzogUGFja2FnZUNvbmZpZyxcbiAgc2NyaXB0czogUmVjb3JkPHN0cmluZywgc3RyaW5nPixcbiAgb2xkU2NyaXB0czogUGFja2FnZUpzb24uU2NyaXB0cyxcbiAgbmFtZXM6IHN0cmluZ1tdXG4pOiB2b2lkIHtcbiAgZm9yIChjb25zdCBuYW1lIG9mIG5hbWVzKSB7XG4gICAgaWYgKCFoYXNNaXNlVGFzayhjb25maWcsIG5hbWUpKSBjb250aW51ZTtcbiAgICBpZiAoZG9lc01pc2VUYXNrQ2FsbFBhY2thZ2VTY3JpcHQoY29uZmlnLCBuYW1lKSkgY29udGludWU7XG4gICAgaWYgKG9sZFNjcmlwdHNbbmFtZV0gJiYgIWlzV2JmeU1hbmFnZWRNaXNlQnJpZGdlKG9sZFNjcmlwdHNbbmFtZV0sIG5hbWUpICYmICEobmFtZSBpbiBzY3JpcHRzKSkgY29udGludWU7XG4gICAgc2NyaXB0c1tuYW1lXSA9IGBtaXNlIHJ1biAke25hbWV9YDtcbiAgfVxufVxuXG5mdW5jdGlvbiBoYXNNaXNlVGFzayhjb25maWc6IFBhY2thZ2VDb25maWcsIG5hbWU6IHN0cmluZyk6IGJvb2xlYW4ge1xuICByZXR1cm4gT2JqZWN0Lmhhc093bihjb25maWcubWlzZVRhc2tzLCBuYW1lKTtcbn1cblxuZnVuY3Rpb24gZG9lc01pc2VUYXNrQ2FsbFBhY2thZ2VTY3JpcHQoY29uZmlnOiBQYWNrYWdlQ29uZmlnLCBuYW1lOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgY29uc3QgdGFzayA9IGNvbmZpZy5taXNlVGFza3NbbmFtZV07XG4gIGlmICghdGFzaykgcmV0dXJuIGZhbHNlO1xuICBjb25zdCBwYWNrYWdlTWFuYWdlcnMgPSBbJ2J1bicsICd5YXJuJywgJ25wbScsICdwbnBtJ107XG4gIHJldHVybiBwYWNrYWdlTWFuYWdlcnMuc29tZSgocGFja2FnZU1hbmFnZXIpID0+XG4gICAgbmV3IFJlZ0V4cChTdHJpbmcucmF3YFxcYiR7cGFja2FnZU1hbmFnZXJ9XFxzKyg/OnJ1blxccyspPyR7ZXNjYXBlUmVnRXhwKG5hbWUpfSg/IVthLXpBLVowLTlfXFwtOi5dKWAsICd1JykudGVzdCh0YXNrKVxuICApO1xufVxuXG5mdW5jdGlvbiBpc1diZnlNYW5hZ2VkTWlzZUJyaWRnZShzY3JpcHQ6IHVua25vd24sIG5hbWU6IHN0cmluZyk6IGJvb2xlYW4ge1xuICByZXR1cm4gc2NyaXB0ID09PSBgbWlzZSBydW4gJHtuYW1lfWA7XG59XG5cbmZ1bmN0aW9uIGVzY2FwZVJlZ0V4cCh2YWx1ZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIHZhbHVlLnJlcGxhY2VBbGwoL1suKis/XiR7fSgpfFtcXF1cXFxcXS9nLCBTdHJpbmcucmF3YFxcJCZgKTtcbn1cblxuZnVuY3Rpb24gZ2VuZXJhdGVGb3JtYXRTY3JpcHQoaGFzSnNPclRzOiBib29sZWFuLCBoYXNKYXZhOiBib29sZWFuKTogc3RyaW5nIHtcbiAgY29uc3QgY29tbWFuZHMgPSBbJ3NvcnQtcGFja2FnZS1qc29uJ107XG4gIGlmIChoYXNKc09yVHMpIHtcbiAgICBjb21tYW5kcy5wdXNoKCd5YXJuIGZvcm1hdC1jb2RlJyk7XG4gIH1cbiAgaWYgKGhhc0phdmEpIHtcbiAgICBjb21tYW5kcy5wdXNoKCd5YXJuIHByZXR0aWZ5Jyk7XG4gIH1cbiAgcmV0dXJuIGNvbW1hbmRzLmpvaW4oJyAmJiAnKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVQcmV0dGllclN1ZmZpeChkaXJQYXRoOiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZz4ge1xuICBjb25zdCBmaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShkaXJQYXRoLCAnLnByZXR0aWVyaWdub3JlJyk7XG4gIGNvbnN0IGV4aXN0aW5nQ29udGVudCA9IGF3YWl0IGZzLnByb21pc2VzLnJlYWRGaWxlKGZpbGVQYXRoLCAndXRmOCcpLmNhdGNoKCgpID0+ICcnKTtcbiAgY29uc3QgaW5kZXggPSBleGlzdGluZ0NvbnRlbnQuaW5kZXhPZihpZ25vcmVGaWxlVXRpbC5zZXBhcmF0b3JQcmVmaXgpO1xuICBpZiAoaW5kZXggPT09IC0xKSByZXR1cm4gJyc7XG5cbiAgY29uc3Qgb3JpZ2luYWxDb250ZW50ID0gZXhpc3RpbmdDb250ZW50LnNsaWNlKDAsIGluZGV4KTtcbiAgY29uc3QgbGluZXMgPSBvcmlnaW5hbENvbnRlbnRcbiAgICAuc3BsaXQoJ1xcbicpXG4gICAgLm1hcCgobGluZSkgPT4ge1xuICAgICAgY29uc3QgbmV3TGluZSA9IGxpbmUudHJpbSgpO1xuICAgICAgcmV0dXJuIG5ld0xpbmUuZW5kc1dpdGgoJy8nKSA/IG5ld0xpbmUuc2xpY2UoMCwgLTEpIDogbmV3TGluZTtcbiAgICB9KVxuICAgIC5maWx0ZXIoKGwpID0+IGwgJiYgIWwuc3RhcnRzV2l0aCgnIycpICYmICFsLmluY2x1ZGVzKCcvJykpO1xuXG4gIHJldHVybiBgJHtsaW5lcy5tYXAoKGxpbmUpID0+IGAgXCIhKiovJHtsaW5lfS8qKlwiYCkuam9pbignJyl9IHx8IHRydWVgO1xufVxuXG5mdW5jdGlvbiByZW1vdmVQcmV0dGllckFydGlmYWN0cyhqc29uT2JqOiBXcml0YWJsZVBhY2thZ2VKc29uKTogdm9pZCB7XG4gIGRlbGV0ZSBqc29uT2JqLnByZXR0aWVyO1xuICBjb25zdCBkZXBlbmRlbmN5U2VjdGlvbnM6IEFycmF5PFBhcnRpYWw8UmVjb3JkPHN0cmluZywgc3RyaW5nPj4gfCB1bmRlZmluZWQ+ID0gW1xuICAgIGpzb25PYmouZGVwZW5kZW5jaWVzLFxuICAgIGpzb25PYmouZGV2RGVwZW5kZW5jaWVzLFxuICAgIGpzb25PYmoucGVlckRlcGVuZGVuY2llcyxcbiAgXTtcbiAgZm9yIChjb25zdCBzZWN0aW9uIG9mIGRlcGVuZGVuY3lTZWN0aW9ucykge1xuICAgIGlmICghc2VjdGlvbikgY29udGludWU7XG4gICAgZGVsZXRlIHNlY3Rpb24ucHJldHRpZXI7XG4gICAgZGVsZXRlIHNlY3Rpb25bJ3ByZXR0aWVyLXBsdWdpbi1qYXZhJ107XG4gICAgZGVsZXRlIHNlY3Rpb25bJ3ByZXR0aWVyLXBsdWdpbi1wcmlzbWEnXTtcbiAgICBkZWxldGUgc2VjdGlvblsnQHdpbGxib29zdGVyL3ByZXR0aWVyLWNvbmZpZyddO1xuICAgIGRlbGV0ZSBzZWN0aW9uWydAdHlwZXMvcHJldHRpZXInXTtcbiAgfVxufVxuXG5hc3luYyBmdW5jdGlvbiB1cGRhdGVQcml2YXRlUGFja2FnZXMoanNvbk9iajogV3JpdGFibGVQYWNrYWdlSnNvbik6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBwYWNrYWdlTmFtZXMgPSBuZXcgU2V0KFsuLi5PYmplY3Qua2V5cyhqc29uT2JqLmRlcGVuZGVuY2llcyksIC4uLk9iamVjdC5rZXlzKGpzb25PYmouZGV2RGVwZW5kZW5jaWVzKV0pO1xuICBjb25zdCBwcml2YXRlUGFja2FnZXM6IHtcbiAgICBwYWNrYWdlTmFtZTogc3RyaW5nO1xuICAgIHJlcG86IHN0cmluZztcbiAgICB0YXJnZXQ6ICdkZXBlbmRlbmNpZXMnIHwgJ2RldkRlcGVuZGVuY2llcyc7XG4gIH1bXSA9IFtcbiAgICB7IHBhY2thZ2VOYW1lOiAnQHdpbGxib29zdGVyL2F1dGgnLCByZXBvOiAnYXV0aCcsIHRhcmdldDogJ2RlcGVuZGVuY2llcycgfSxcbiAgICB7IHBhY2thZ2VOYW1lOiAnQGRpc2NvcmQtYm90L3NoYXJlZCcsIHJlcG86ICdkaXNjb3JkLWJvdCcsIHRhcmdldDogJ2RlcGVuZGVuY2llcycgfSxcbiAgICB7IHBhY2thZ2VOYW1lOiAnQHdpbGxib29zdGVyL2NvZGUtYW5hbHl6ZXInLCByZXBvOiAnY29kZS1hbmFseXplcicsIHRhcmdldDogJ2RldkRlcGVuZGVuY2llcycgfSxcbiAgICB7IHBhY2thZ2VOYW1lOiAnQHdpbGxib29zdGVyL2p1ZGdlJywgcmVwbzogJ2p1ZGdlJywgdGFyZ2V0OiAnZGVwZW5kZW5jaWVzJyB9LFxuICAgIHsgcGFja2FnZU5hbWU6ICdAd2lsbGJvb3N0ZXIvbGxtLXByb3h5JywgcmVwbzogJ2xsbS1wcm94eScsIHRhcmdldDogJ2RlcGVuZGVuY2llcycgfSxcbiAgXTtcblxuICBhd2FpdCBQcm9taXNlLmFsbChcbiAgICBwcml2YXRlUGFja2FnZXMubWFwKGFzeW5jICh7IHBhY2thZ2VOYW1lLCByZXBvLCB0YXJnZXQgfSkgPT4ge1xuICAgICAgaWYgKCFwYWNrYWdlTmFtZXMuaGFzKHBhY2thZ2VOYW1lKSB8fCBpc1dvcmtzcGFjZVBhY2thZ2UoanNvbk9iaiwgcGFja2FnZU5hbWUpKSByZXR1cm47XG5cbiAgICAgIGNvbnN0IG90aGVyVGFyZ2V0ID0gdGFyZ2V0ID09PSAnZGVwZW5kZW5jaWVzJyA/ICdkZXZEZXBlbmRlbmNpZXMnIDogJ2RlcGVuZGVuY2llcyc7XG4gICAgICAvLyBUaGUgbGludCBydWxlIGRpc2FsbG93cyBgZGVsZXRlYCB3aXRoIGNvbXB1dGVkIHBhY2thZ2UgbmFtZXM7IFJlZmxlY3QgaGFzIHRoZSBzYW1lIGRlbGV0aW9uIHNlbWFudGljcyBoZXJlLlxuICAgICAgUmVmbGVjdC5kZWxldGVQcm9wZXJ0eShqc29uT2JqW290aGVyVGFyZ2V0XSwgcGFja2FnZU5hbWUpO1xuICAgICAganNvbk9ialt0YXJnZXRdW3BhY2thZ2VOYW1lXSA9IGF3YWl0IGdldExhdGVzdFByaXZhdGVQYWNrYWdlU3BlY2lmaWVyKHJlcG8pO1xuICAgIH0pXG4gICk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGdldExhdGVzdFByaXZhdGVQYWNrYWdlU3BlY2lmaWVyKHJlcG86IHN0cmluZyk6IFByb21pc2U8c3RyaW5nPiB7XG4gIGNvbnN0IGNvbW1pdEhhc2ggPSBhd2FpdCBnZXRMYXRlc3RDb21taXRIYXNoKCdXaWxsQm9vc3RlckxhYicsIHJlcG8pO1xuICByZXR1cm4gYGdpdEBnaXRodWIuY29tOldpbGxCb29zdGVyTGFiLyR7cmVwb30uZ2l0IyR7Y29tbWl0SGFzaH1gO1xufVxuXG5mdW5jdGlvbiBpc1dvcmtzcGFjZVBhY2thZ2UoanNvbk9iajogUGFja2FnZUpzb24sIHBhY2thZ2VOYW1lOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgcmV0dXJuIChqc29uT2JqLmRldkRlcGVuZGVuY2llcz8uW3BhY2thZ2VOYW1lXSB8fCBqc29uT2JqLmRlcGVuZGVuY2llcz8uW3BhY2thZ2VOYW1lXSB8fCAnJykuaW5jbHVkZXMoJ3dvcmtzcGFjZScpO1xufVxuIiwiaW1wb3J0IHsgc3Bhd25TeW5jQW5kUmV0dXJuU3Rkb3V0IH0gZnJvbSAnLi4vdXRpbHMvc3Bhd25VdGlsLmpzJztcblxuZXhwb3J0IGZ1bmN0aW9uIGdldExhdGVzdENvbW1pdEhhc2gob3JnYW5pemF0aW9uOiBzdHJpbmcsIHJlcG86IHN0cmluZyk6IFByb21pc2U8c3RyaW5nPiB7XG4gIHRyeSB7XG4gICAgY29uc3QgcmVwb1VybCA9IGBnaXRAZ2l0aHViLmNvbToke29yZ2FuaXphdGlvbn0vJHtyZXBvfS5naXRgO1xuICAgIGNvbnN0IG91dHB1dCA9IHNwYXduU3luY0FuZFJldHVyblN0ZG91dCgnZ2l0JywgWydscy1yZW1vdGUnLCByZXBvVXJsLCAnSEVBRCddLCBwcm9jZXNzLmN3ZCgpKTtcbiAgICBjb25zdCBjb21taXRIYXNoID0gb3V0cHV0LnNwbGl0KC9cXHMrLylbMF07XG4gICAgaWYgKCFjb21taXRIYXNoKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYE5vIGNvbW1pdHMgZm91bmQgZm9yICR7b3JnYW5pemF0aW9ufS8ke3JlcG99YCk7XG4gICAgfVxuICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoY29tbWl0SGFzaCk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgcmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBFcnJvcihgRmFpbGVkIHRvIGZldGNoIGNvbW1pdHMgZm9yICR7b3JnYW5pemF0aW9ufS8ke3JlcG99OiAke1N0cmluZyhlcnJvcil9YCkpO1xuICB9XG59XG4iLCIvLyBveGxpbnQtZGlzYWJsZSBlc2xpbnQtcGx1Z2luLWltcG9ydC9uby1uYW1lZC1hcy1kZWZhdWx0LW1lbWJlciAtLSBOYW1lc3BhY2UgWUFNTCBjYWxscyBtYWtlIGR1bXAgdXNhZ2UgY2xlYXJlci5cbmltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB5YW1sIGZyb20gJ2pzLXlhbWwnO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBleHRlbnNpb25zIH0gZnJvbSAnLi4vdXRpbHMvZXh0ZW5zaW9ucy5qcyc7XG5pbXBvcnQgeyBnZXRHZW5JMThuVHNDb21tYW5kIH0gZnJvbSAnLi4vdXRpbHMvZ2VuSTE4blRzLmpzJztcbmltcG9ydCB7IGRvZXNDb250YWluSmF2YSwgZG9lc0NvbnRhaW5Kc09yVHMgfSBmcm9tICcuLi91dGlscy9wYWNrYWdlQ2FwYWJpbGl0aWVzLmpzJztcbmltcG9ydCB7IHNwYXduU3luYyB9IGZyb20gJy4uL3V0aWxzL3NwYXduVXRpbC5qcyc7XG5cbmltcG9ydCB7IGdlbmVyYXRlU2NyaXB0cyB9IGZyb20gJy4vcGFja2FnZUpzb24uanMnO1xuXG5pbnRlcmZhY2UgTGVmdGhvb2tTZXR0aW5ncyB7XG4gIGdsb2JfbWF0Y2hlcjogJ2RvdWJsZXN0YXInO1xuICAncG9zdC1tZXJnZSc6IHtcbiAgICBqb2JzOiBMZWZ0aG9va0pvYltdO1xuICB9O1xuICAncHJlLWNvbW1pdCc6IHtcbiAgICBqb2JzOiBMZWZ0aG9va0pvYltdO1xuICB9O1xuICAncHJlLXB1c2gnOiB7XG4gICAgam9iczogTGVmdGhvb2tKb2JbXTtcbiAgfTtcbn1cblxuaW50ZXJmYWNlIExlZnRob29rSm9iIHtcbiAgbmFtZTogc3RyaW5nO1xuICBnbG9iPzogc3RyaW5nO1xuICBydW4/OiBzdHJpbmc7XG4gIHNjcmlwdD86IHN0cmluZztcbiAgcnVubmVyPzogJ2Jhc2gnO1xuICBzdGFnZV9maXhlZD86IHRydWU7XG59XG5cbmNvbnN0IGJhc2VTZXR0aW5nczogT21pdDxMZWZ0aG9va1NldHRpbmdzLCAncHJlLWNvbW1pdCc+ID0ge1xuICBnbG9iX21hdGNoZXI6ICdkb3VibGVzdGFyJyxcbiAgJ3Bvc3QtbWVyZ2UnOiB7XG4gICAgam9iczogW1xuICAgICAge1xuICAgICAgICBuYW1lOiAncHJlcGFyZScsXG4gICAgICAgIHNjcmlwdDogJ3ByZXBhcmUuc2gnLFxuICAgICAgICBydW5uZXI6ICdiYXNoJyxcbiAgICAgIH0sXG4gICAgXSxcbiAgfSxcbiAgJ3ByZS1wdXNoJzoge1xuICAgIGpvYnM6IFtcbiAgICAgIHtcbiAgICAgICAgbmFtZTogJ2NoZWNrJyxcbiAgICAgICAgc2NyaXB0OiAnY2hlY2suc2gnLFxuICAgICAgICBydW5uZXI6ICdiYXNoJyxcbiAgICAgIH0sXG4gICAgXSxcbiAgfSxcbn07XG5cbmNvbnN0IHByZUNvbW1pdFNldHRpbmdzOiBMZWZ0aG9va1NldHRpbmdzWydwcmUtY29tbWl0J10gPSB7XG4gIGpvYnM6IFtcbiAgICB7XG4gICAgICBuYW1lOiAnY2xlYW51cCcsXG4gICAgICBnbG9iOiAnJyxcbiAgICAgIHJ1bjogJycsXG4gICAgICBzdGFnZV9maXhlZDogdHJ1ZSxcbiAgICB9LFxuICAgIHtcbiAgICAgIG5hbWU6ICdjaGVjay1taWdyYXRpb25zJyxcbiAgICAgIGdsb2I6ICcqKi9taWdyYXRpb24uc3FsJyxcbiAgICAgIHJ1bjogYFxuZmFpbGVkPTBcbiMgTGVmdGhvb2sgZXhwYW5kcyB7c3RhZ2VkX2ZpbGVzfSBhcyBzaGVsbC1lc2NhcGVkIGFyZ3MsIHNvIHBhdGhzIHdpdGggc3BhY2VzIHN0YXkgaW50YWN0LlxuZm9yIGZpbGUgaW4ge3N0YWdlZF9maWxlc307IGRvXG4gIGlmIGdyZXAgLXEgJ1dhcm5pbmdzOicgXCIkZmlsZVwiOyB0aGVuXG4gICAgZWNobyBcIk1pZ3JhdGlvbiBTUUwgZmlsZSAoJGZpbGUpIGNvbnRhaW5zIHdhcm5pbmdzISBQbGVhc2Ugc29sdmUgdGhlIHdhcm5pbmdzIGFuZCBjb21taXQgYWdhaW4uXCJcbiAgICBmYWlsZWQ9MVxuICBmaVxuZG9uZVxuZXhpdCBcIiRmYWlsZWRcIlxuYC50cmltKCksXG4gICAgfSxcbiAgXSxcbn07XG5cbmNvbnN0IHNjcmlwdHMgPSB7XG4gIHBvc3RNZXJnZTogYFxuIyEvYmluL2Jhc2hcblxuY2hhbmdlZF9maWxlcz1cIiQoZ2l0IGRpZmYtdHJlZSAtciAtLW5hbWUtb25seSAtLW5vLWNvbW1pdC1pZCBPUklHX0hFQUQgSEVBRClcIlxuXG5ydW5faWZfY2hhbmdlZCgpIHtcbiAgaWYgZWNobyBcIiRjaGFuZ2VkX2ZpbGVzXCIgfCBncmVwIC0tcXVpZXQgLUUgXCIkMVwiOyB0aGVuXG4gICAgZXZhbCBcIiQyXCJcbiAgZmlcbn1cbmAudHJpbSgpLFxufTtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlTGVmdGhvb2tVcGRhdGluZ1BhY2thZ2VKc29uKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2dlbmVyYXRlTGVmdGhvb2tVcGRhdGluZ1BhY2thZ2VKc29uJywgYXN5bmMgKCkgPT4ge1xuICAgIGF3YWl0IGNvcmUoY29uZmlnKTtcbiAgfSk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGNvcmUoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IGRpclBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICcubGVmdGhvb2snKTtcbiAgY29uc3QgaHVza3lEaXJQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnLmh1c2t5Jyk7XG4gIGNvbnN0IGhhc0h1c2t5RGlyID0gZnMuZXhpc3RzU3luYyhodXNreURpclBhdGgpO1xuICBjb25zdCB7IGxpbnQgfSA9IGdlbmVyYXRlU2NyaXB0cyhjb25maWcsIHt9KTtcbiAgY29uc3Qgc2V0dGluZ3M6IFBhcnRpYWw8TGVmdGhvb2tTZXR0aW5ncz4gPSB7XG4gICAgLi4uYmFzZVNldHRpbmdzLFxuICAgICdwcmUtY29tbWl0Jzoge1xuICAgICAgam9iczogZ2V0UHJlQ29tbWl0Sm9icyhjb25maWcpLFxuICAgIH0sXG4gIH07XG4gIGlmICghbGludCkge1xuICAgIGRlbGV0ZSBzZXR0aW5nc1sncHJlLXB1c2gnXTtcbiAgfVxuICBhd2FpdCBQcm9taXNlLmFsbChbXG4gICAgZnMucHJvbWlzZXMud3JpdGVGaWxlKFxuICAgICAgcGF0aC5qb2luKGNvbmZpZy5kaXJQYXRoLCAnbGVmdGhvb2sueW1sJyksXG4gICAgICB5YW1sLmR1bXAoc2V0dGluZ3MsIHtcbiAgICAgICAgbGluZVdpZHRoOiAtMSxcbiAgICAgICAgbm9Db21wYXRNb2RlOiB0cnVlLFxuICAgICAgICBzdHlsZXM6IHtcbiAgICAgICAgICAnISFudWxsJzogJ2VtcHR5JyxcbiAgICAgICAgfSxcbiAgICAgIH0pXG4gICAgKSxcbiAgICBmcy5wcm9taXNlcy5ybShkaXJQYXRoLCB7IGZvcmNlOiB0cnVlLCByZWN1cnNpdmU6IHRydWUgfSksXG4gIF0pO1xuICBpZiAoaGFzSHVza3lEaXIpIHtcbiAgICBhd2FpdCBQcm9taXNlLmFsbChbXG4gICAgICBmcy5wcm9taXNlcy5ybShodXNreURpclBhdGgsIHsgZm9yY2U6IHRydWUsIHJlY3Vyc2l2ZTogdHJ1ZSB9KSxcbiAgICAgIGZzLnByb21pc2VzLnJtKHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJy5odXNreXJjLmpzb24nKSwgeyBmb3JjZTogdHJ1ZSB9KSxcbiAgICBdKTtcbiAgICBzcGF3blN5bmMoJ2dpdCcsIFsnY29uZmlnJywgJy0tdW5zZXQnLCAnY29yZS5ob29rc1BhdGgnXSwgY29uZmlnLmRpclBhdGgpO1xuICB9XG5cbiAgaWYgKGxpbnQpIHtcbiAgICBjb25zdCBwcmVQdXNoID0gZ2V0UHJlUHVzaFNjcmlwdChjb25maWcpO1xuICAgIGZzLm1rZGlyU3luYyhwYXRoLmpvaW4oZGlyUGF0aCwgJ3ByZS1wdXNoJyksIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICAgIGF3YWl0IGZzLnByb21pc2VzLndyaXRlRmlsZShwYXRoLmpvaW4oZGlyUGF0aCwgJ3ByZS1wdXNoJywgJ2NoZWNrLnNoJyksIHByZVB1c2ggKyAnXFxuJywge1xuICAgICAgbW9kZTogMG83NTUsXG4gICAgfSk7XG4gIH1cbiAgY29uc3QgcG9zdE1lcmdlQ29tbWFuZCA9IGAke3NjcmlwdHMucG9zdE1lcmdlfVxcblxcbiR7Z2VuZXJhdGVQb3N0TWVyZ2VDb21tYW5kcyhjb25maWcpLmpvaW4oJ1xcbicpfVxcbmA7XG4gIGZzLm1rZGlyU3luYyhwYXRoLmpvaW4oZGlyUGF0aCwgJ3Bvc3QtbWVyZ2UnKSwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gIGF3YWl0IGZzLnByb21pc2VzLndyaXRlRmlsZShwYXRoLnJlc29sdmUoZGlyUGF0aCwgJ3Bvc3QtbWVyZ2UnLCAncHJlcGFyZS5zaCcpLCBwb3N0TWVyZ2VDb21tYW5kLCB7XG4gICAgbW9kZTogMG83NTUsXG4gIH0pO1xufVxuXG5mdW5jdGlvbiBnZXRQcmVQdXNoU2NyaXB0KGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IHN0cmluZyB7XG4gIGxldCBsaW50Q29tbWFuZDogc3RyaW5nO1xuICBpZiAoY29uZmlnLmlzQnVuKSB7XG4gICAgLy8gQnVuIHJlcG9zIHJlY2VpdmUgd2IgYXMgcGFydCBvZiB3YmZ5J3MgbWFuYWdlZCB0b29sY2hhaW4sIHNvIGdlbmVyYXRlIHRoZVxuICAgIC8vIGZpbmFsIGhvb2sgY29tbWFuZCBvbiB0aGUgZmlyc3QgcnVuIGluc3RlYWQgb2YgY2hhbmdpbmcgaXQgb24gdGhlIHNlY29uZC5cbiAgICBsaW50Q29tbWFuZCA9ICdidW4gLS1idW4gd2IgbGludCc7XG4gIH0gZWxzZSB7XG4gICAgbGludENvbW1hbmQgPSBjb25maWcuZGVwZW5kaW5nLndiID8gJ3lhcm4gd2IgbGludCcgOiAneWFybiBydW4gbGludCc7XG4gIH1cbiAgY29uc3QgcXVpZXRMaW50Q29tbWFuZCA9IGAke2xpbnRDb21tYW5kfSAtLXF1aWV0YDtcbiAgLy8gTm8gc2VwYXJhdGUgdHlwZWNoZWNrIHN0ZXAgbmVlZGVkIOKAlCB0aGUgbGludCBjb21tYW5kIGFscmVhZHkgaW5jbHVkZXMgdHlwZWNoZWNraW5nLlxuICBpZiAoY29uZmlnLnJlcG9zaXRvcnk/LnN0YXJ0c1dpdGgoJ2dpdGh1YjpXaWxsQm9vc3RlckxhYi8nKSkge1xuICAgIHJldHVybiBgXG4jIS9iaW4vYmFzaFxuXG5pZiBbICQoZ2l0IGJyYW5jaCAtLXNob3ctY3VycmVudCkgPSBcIm1haW5cIiBdICYmIFsgJChnaXQgY29uZmlnIHVzZXIuZW1haWwpICE9IFwiZXhrYXp1dUBnbWFpbC5jb21cIiBdOyB0aGVuXG4gIGVjaG8gXCIqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcIlxuICBlY2hvIFwiKioqIERvbid0IHB1c2ggbWFpbiBicmFuY2ggZGlyZWN0bHkuIFVzZSBQUiEgKioqXCJcbiAgZWNobyBcIioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlwiXG4gIGV4aXQgMVxuZmlcblxuJHtxdWlldExpbnRDb21tYW5kfVxuYC50cmltKCk7XG4gIH1cbiAgcmV0dXJuIHF1aWV0TGludENvbW1hbmQ7XG59XG5cbmZ1bmN0aW9uIGdldFByZUNvbW1pdEpvYnMoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogTGVmdGhvb2tKb2JbXSB7XG4gIHJldHVybiBwcmVDb21taXRTZXR0aW5ncy5qb2JzLm1hcCgoam9iKSA9PlxuICAgIGpvYi5uYW1lID09PSAnY2xlYW51cCdcbiAgICAgID8ge1xuICAgICAgICAgIC4uLmpvYixcbiAgICAgICAgICBnbG9iOiBnZXRDbGVhbnVwR2xvYnMoY29uZmlnKSxcbiAgICAgICAgICBydW46IGdldENsZWFudXBDb21tYW5kKGNvbmZpZyksXG4gICAgICAgIH1cbiAgICAgIDogam9iXG4gICk7XG59XG5cbmZ1bmN0aW9uIGdldENsZWFudXBHbG9icyhjb25maWc6IFBhY2thZ2VDb25maWcpOiBzdHJpbmcge1xuICAvLyBMZXQgYHdiIGxpbnQgLS1mb3JtYXRgIGRlY2lkZSB3aGV0aGVyIFByZXR0aWVyIGlzIGF2YWlsYWJsZTsgdGhlIGhvb2tcbiAgLy8gc3RpbGwgbmVlZHMgdG8gdHJpZ2dlciB3aGVuIGFkZGluZyB0aGUgZmlyc3QgcHJldHRpZXItb25seSBmaWxlLlxuICBjb25zdCBzdXBwb3J0ZWRFeHRlbnNpb25zID1cbiAgICBjb25maWcuaXNCdW4gfHwgY29uZmlnLmRlcGVuZGluZy53YiB8fCBkb2VzQ29udGFpbkphdmEoY29uZmlnKSA/IFsuLi5leHRlbnNpb25zLnByZXR0aWVyT25seV0gOiBbXTtcbiAgaWYgKGRvZXNDb250YWluSnNPclRzKGNvbmZpZykpIHtcbiAgICBzdXBwb3J0ZWRFeHRlbnNpb25zLnB1c2goLi4uZXh0ZW5zaW9ucy5veGZtdCwgLi4uZXh0ZW5zaW9ucy5veGxpbnQpO1xuICB9XG4gIGlmIChjb25maWcuZG9lc0NvbnRhaW5Qb2V0cnlMb2NrIHx8IGNvbmZpZy5kb2VzQ29udGFpblV2TG9jaykge1xuICAgIHN1cHBvcnRlZEV4dGVuc2lvbnMucHVzaCgncHknKTtcbiAgfVxuICBpZiAoY29uZmlnLmRvZXNDb250YWluUHVic3BlY1lhbWwpIHtcbiAgICBzdXBwb3J0ZWRFeHRlbnNpb25zLnB1c2goJ2RhcnQnKTtcbiAgfVxuICBjb25zdCBmaWx0ZXJlZEV4dGVuc2lvbnMgPSBbLi4ubmV3IFNldChzdXBwb3J0ZWRFeHRlbnNpb25zKV0udG9Tb3J0ZWQoKTtcbiAgcmV0dXJuIGAqKi8qLnske2ZpbHRlcmVkRXh0ZW5zaW9ucy5qb2luKCcsJyl9fWA7XG59XG5cbmZ1bmN0aW9uIGdldENsZWFudXBDb21tYW5kKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IHN0cmluZyB7XG4gIGlmIChoYXNMb2NhbFdiV29ya3NwYWNlKGNvbmZpZykpIHtcbiAgICByZXR1cm4gU3RyaW5nLnJhd2BcbiMgTGVmdGhvb2sgZXhwYW5kcyB7c3RhZ2VkX2ZpbGVzfSBhcyBzaGVsbC1lc2NhcGVkIGFyZ3MsIHNvIHBhdGhzIHdpdGggc3BhY2VzIHN0YXkgaW50YWN0LlxueWFybiB3b3Jrc3BhY2UgQHdpbGxib29zdGVyL3diIHN0YXJ0IC0td29ya2luZy1kaXIgXCIkKGdpdCByZXYtcGFyc2UgLS1zaG93LXRvcGxldmVsKVwiIGxpbnQgLS1maXggLS1mb3JtYXQgLS0ge3N0YWdlZF9maWxlc31cbmAudHJpbSgpO1xuICB9XG4gIC8vIFB5dGhvbi1vbmx5IEJ1biByZXBvcyBpbnN0YWxsIHdiIGZvciBzaGFyZWQgc2NyaXB0cyBidXQgbm90IE94bGludCwgc29cbiAgLy8gc3RhZ2VkLWZpbGUgaG9va3MgbXVzdCB1c2UgdGhlIGxhbmd1YWdlLXNwZWNpZmljIGZvcm1hdHRlciBwYXRoIGJlbG93LlxuICBjb25zdCBjYW5Vc2VXYkZvclN0YWdlZEZpbGVzID0gZG9lc0NvbnRhaW5Kc09yVHMoY29uZmlnKSB8fCBkb2VzQ29udGFpbkphdmEoY29uZmlnKTtcbiAgaWYgKChjb25maWcuaXNCdW4gfHwgY29uZmlnLmRlcGVuZGluZy53YikgJiYgY2FuVXNlV2JGb3JTdGFnZWRGaWxlcykge1xuICAgIHJldHVybiBgXG4jIExlZnRob29rIGV4cGFuZHMge3N0YWdlZF9maWxlc30gYXMgc2hlbGwtZXNjYXBlZCBhcmdzLCBzbyBwYXRocyB3aXRoIHNwYWNlcyBzdGF5IGludGFjdC5cbiR7Y29uZmlnLmlzQnVuID8gJ2J1biAtLWJ1biB3YicgOiAneWFybiB3Yid9IGxpbnQgLS1maXggLS1mb3JtYXQgLS0ge3N0YWdlZF9maWxlc31cbmAudHJpbSgpO1xuICB9XG5cbiAgY29uc3Qgb3hsaW50UGF0dGVybiA9IGV4dGVuc2lvbnMub3hsaW50Lm1hcCgoZXh0ZW5zaW9uKSA9PiBTdHJpbmcucmF3YFxcLiR7ZXh0ZW5zaW9ufSRgKS5qb2luKCd8Jyk7XG4gIGNvbnN0IG94Zm10UGF0dGVybiA9IGV4dGVuc2lvbnMub3hmbXQubWFwKChleHRlbnNpb24pID0+IFN0cmluZy5yYXdgXFwuJHtleHRlbnNpb259JGApLmpvaW4oJ3wnKTtcbiAgY29uc3QgcHJldHRpZXJQYXR0ZXJuID0gZXh0ZW5zaW9ucy5wcmV0dGllck9ubHkubWFwKChleHRlbnNpb24pID0+IFN0cmluZy5yYXdgXFwuJHtleHRlbnNpb259JGApLmpvaW4oJ3wnKTtcbiAgY29uc3QgaGFzSnNPclRzID0gZG9lc0NvbnRhaW5Kc09yVHMoY29uZmlnKTtcbiAgY29uc3QgaGFzSmF2YSA9IGRvZXNDb250YWluSmF2YShjb25maWcpO1xuXG4gIHJldHVybiBTdHJpbmcucmF3YFxuIyBMZWZ0aG9vayBleHBhbmRzIHtzdGFnZWRfZmlsZXN9IGFzIHNoZWxsLWVzY2FwZWQgYXJncywgc28gcGF0aHMgd2l0aCBzcGFjZXMgc3RheSBpbnRhY3QuXG4ke2hhc0pzT3JUcyA/IFN0cmluZy5yYXdgb3hsaW50X2ZpbGVzPVwiJChwcmludGYgJyVzXFxuJyB7c3RhZ2VkX2ZpbGVzfSB8IGdyZXAgLUUgJygke294bGludFBhdHRlcm59KScgfHwgdHJ1ZSlcImAgOiAnJ31cbiR7aGFzSnNPclRzID8gU3RyaW5nLnJhd2BveGZtdF9maWxlcz1cIiQocHJpbnRmICclc1xcbicge3N0YWdlZF9maWxlc30gfCBncmVwIC1FICcoJHtveGZtdFBhdHRlcm59KScgfCBncmVwIC12IC1FICcoXnwvKXBhY2thZ2VcXC5qc29uJCcgfHwgdHJ1ZSlcImAgOiAnJ31cbiR7aGFzSmF2YSA/IFN0cmluZy5yYXdgcHJldHRpZXJfZmlsZXM9XCIkKHByaW50ZiAnJXNcXG4nIHtzdGFnZWRfZmlsZXN9IHwgZ3JlcCAtRSAnKCR7cHJldHRpZXJQYXR0ZXJufSknIHx8IHRydWUpXCJgIDogJyd9XG5wYWNrYWdlX2pzb25fZmlsZXM9XCIkKHByaW50ZiAnJXNcXG4nIHtzdGFnZWRfZmlsZXN9IHwgZ3JlcCAtRSAnKF58LylwYWNrYWdlXFwuanNvbiQnIHx8IHRydWUpXCJcbiR7aGFzUHl0aG9uUGFja2FnZU1hbmFnZXIoY29uZmlnKSA/IFN0cmluZy5yYXdgcHl0aG9uX2ZpbGVzPVwiJChwcmludGYgJyVzXFxuJyB7c3RhZ2VkX2ZpbGVzfSB8IGdyZXAgLUUgJ1xcLnB5JCcgfHwgdHJ1ZSlcImAgOiAnJ31cbiR7Y29uZmlnLmRvZXNDb250YWluUHVic3BlY1lhbWwgPyBTdHJpbmcucmF3YGRhcnRfZmlsZXM9XCIkKHByaW50ZiAnJXNcXG4nIHtzdGFnZWRfZmlsZXN9IHwgZ3JlcCAtRSAnXFwuZGFydCQnIHwgZ3JlcCAtdiAnZ2VuZXJhdGVkJyB8IGdyZXAgLXYgJ1xcLmZyZWV6ZWRcXC5kYXJ0JCcgfCBncmVwIC12ICdcXC5nXFwuZGFydCQnIHx8IHRydWUpXCJgIDogJyd9XG5cbiR7XG4gIGhhc0pzT3JUc1xuICAgID8gU3RyaW5nLnJhd2BcbmlmIFsgLW4gXCIkb3hmbXRfZmlsZXNcIiBdOyB0aGVuXG4gIG5vZGUgbm9kZV9tb2R1bGVzLy5iaW4vb3hmbXQgLS13cml0ZSAtLW5vLWVycm9yLW9uLXVubWF0Y2hlZC1wYXR0ZXJuICchKiovcGFja2FnZS5qc29uJyAkb3hmbXRfZmlsZXNcbmZpXG5gXG4gICAgOiAnJ1xufVxuJHtcbiAgaGFzSmF2YVxuICAgID8gU3RyaW5nLnJhd2BpZiBbIC1uIFwiJHByZXR0aWVyX2ZpbGVzXCIgXTsgdGhlblxuICBub2RlIG5vZGVfbW9kdWxlcy8uYmluL3ByZXR0aWVyIC0tY2FjaGUgLS13cml0ZSAtLWlnbm9yZS11bmtub3duIC0tICRwcmV0dGllcl9maWxlc1xuZmlgXG4gICAgOiAnJ1xufVxuJHtcbiAgaGFzSnNPclRzXG4gICAgPyBTdHJpbmcucmF3YFxuaWYgWyAtbiBcIiRveGxpbnRfZmlsZXNcIiBdOyB0aGVuXG4gIG5vZGUgbm9kZV9tb2R1bGVzLy5iaW4vb3hsaW50IC0tZml4ICRveGxpbnRfZmlsZXNcbmZpXG5gXG4gICAgOiAnJ1xufVxuaWYgWyAtbiBcIiRwYWNrYWdlX2pzb25fZmlsZXNcIiBdOyB0aGVuXG4gIG5vZGUgbm9kZV9tb2R1bGVzLy5iaW4vc29ydC1wYWNrYWdlLWpzb24gLS0gJHBhY2thZ2VfanNvbl9maWxlc1xuZmlcbiR7XG4gIGhhc1B5dGhvblBhY2thZ2VNYW5hZ2VyKGNvbmZpZylcbiAgICA/IGBpZiBbIC1uIFwiJHB5dGhvbl9maWxlc1wiIF07IHRoZW5cbiAgJHtnZXRQeXRob25SdW5uZXIoY29uZmlnKX0gaXNvcnQgLS1wcm9maWxlIGJsYWNrIC0tZmlsdGVyLWZpbGVzICRweXRob25fZmlsZXNcbiAgJHtnZXRQeXRob25SdW5uZXIoY29uZmlnKX0gYmxhY2sgJHB5dGhvbl9maWxlc1xuICAke2dldFB5dGhvblJ1bm5lcihjb25maWcpfSBmbGFrZTggJHB5dGhvbl9maWxlc1xuZmlgXG4gICAgOiAnJ1xufVxuJHtcbiAgY29uZmlnLmRvZXNDb250YWluUHVic3BlY1lhbWxcbiAgICA/IGBpZiBbIC1uIFwiJGRhcnRfZmlsZXNcIiBdOyB0aGVuXG4gIGRhcnQgZm9ybWF0ICRkYXJ0X2ZpbGVzXG5maWBcbiAgICA6ICcnXG59XG5gLnRyaW0oKTtcbn1cblxuZnVuY3Rpb24gaGFzTG9jYWxXYldvcmtzcGFjZShjb25maWc6IFBhY2thZ2VDb25maWcpOiBib29sZWFuIHtcbiAgaWYgKCFjb25maWcuaXNSb290KSByZXR1cm4gZmFsc2U7XG5cbiAgY29uc3QgbG9jYWxXYlBhY2thZ2VKc29uUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJ3BhY2thZ2VzJywgJ3diJywgJ3BhY2thZ2UuanNvbicpO1xuICBpZiAoIWZzLmV4aXN0c1N5bmMobG9jYWxXYlBhY2thZ2VKc29uUGF0aCkpIHJldHVybiBmYWxzZTtcblxuICB0cnkge1xuICAgIGNvbnN0IHBhY2thZ2VKc29uID0gSlNPTi5wYXJzZShmcy5yZWFkRmlsZVN5bmMobG9jYWxXYlBhY2thZ2VKc29uUGF0aCwgJ3V0ZjgnKSkgYXMgeyBuYW1lPzogc3RyaW5nIH07XG4gICAgcmV0dXJuIHBhY2thZ2VKc29uLm5hbWUgPT09ICdAd2lsbGJvb3N0ZXIvd2InO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn1cblxuZnVuY3Rpb24gZ2VuZXJhdGVQb3N0TWVyZ2VDb21tYW5kcyhjb25maWc6IFBhY2thZ2VDb25maWcpOiBzdHJpbmdbXSB7XG4gIGNvbnN0IHBvc3RNZXJnZUNvbW1hbmRzOiBzdHJpbmdbXSA9IFtdO1xuICBpZiAoY29uZmlnLmhhc1ZlcnNpb25TZXR0aW5ncykge1xuICAgIGNvbnN0IHRvb2xzQ2hhbmdlZFBhdHRlcm4gPSBTdHJpbmcucmF3YChtaXNlXFwudG9tbHxcXC5taXNlXFwudG9tbHxcXC50b29sLXZlcnNpb25zfFxcLi4rLXZlcnNpb24pYDtcbiAgICBwb3N0TWVyZ2VDb21tYW5kcy5wdXNoKFN0cmluZy5yYXdgcnVuX2lmX2NoYW5nZWQgXCIke3Rvb2xzQ2hhbmdlZFBhdHRlcm59XCIgXCJtaXNlIGluc3RhbGxcImApO1xuICB9XG4gIGNvbnN0IGluc3RhbGxDb21tYW5kID0gY29uZmlnLmlzQnVuID8gJ2J1biBpbnN0YWxsJyA6ICd5YXJuJztcbiAgY29uc3Qgcm1OZXh0RGlyZWN0b3J5ID0gY29uZmlnLmRlcGVuZGluZy5ibGl0eiB8fCBjb25maWcuZGVwZW5kaW5nLm5leHQgPyAnICYmIHJtIC1SZiAubmV4dCcgOiAnJztcbiAgcG9zdE1lcmdlQ29tbWFuZHMucHVzaChTdHJpbmcucmF3YHJ1bl9pZl9jaGFuZ2VkIFwicGFja2FnZVxcLmpzb25cIiBcIiR7aW5zdGFsbENvbW1hbmR9JHtybU5leHREaXJlY3Rvcnl9XCJgKTtcbiAgaWYgKGNvbmZpZy5kb2VzQ29udGFpblBvZXRyeUxvY2spIHtcbiAgICBwb3N0TWVyZ2VDb21tYW5kcy5wdXNoKFN0cmluZy5yYXdgcnVuX2lmX2NoYW5nZWQgXCJwb2V0cnlcXC5sb2NrXCIgXCJwb2V0cnkgaW5zdGFsbFwiYCk7XG4gIH1cbiAgaWYgKGNvbmZpZy5kb2VzQ29udGFpblV2TG9jaykge1xuICAgIHBvc3RNZXJnZUNvbW1hbmRzLnB1c2goU3RyaW5nLnJhd2BydW5faWZfY2hhbmdlZCBcInV2XFwubG9ja1wiIFwidXYgc3luYyAtLWZyb3plblwiYCk7XG4gIH1cbiAgaWYgKGNvbmZpZy5kZXBlbmRpbmcuYmxpdHopIHtcbiAgICBwb3N0TWVyZ2VDb21tYW5kcy5wdXNoKFxuICAgICAgU3RyaW5nLnJhd2BydW5faWZfY2hhbmdlZCBcIi4qXFwucHJpc21hXCIgXCJub2RlIG5vZGVfbW9kdWxlcy8uYmluL2JsaXR6IHByaXNtYSBtaWdyYXRlIGRlcGxveVwiYCxcbiAgICAgIFN0cmluZy5yYXdgcnVuX2lmX2NoYW5nZWQgXCIuKlxcLnByaXNtYVwiIFwibm9kZSBub2RlX21vZHVsZXMvLmJpbi9ibGl0eiBwcmlzbWEgZ2VuZXJhdGVcImAsXG4gICAgICBTdHJpbmcucmF3YHJ1bl9pZl9jaGFuZ2VkIFwiLipcXC5wcmlzbWFcIiBcIm5vZGUgbm9kZV9tb2R1bGVzLy5iaW4vYmxpdHogY29kZWdlblwiYFxuICAgICk7XG4gIH0gZWxzZSBpZiAoY29uZmlnLmRlcGVuZGluZy5wcmlzbWEpIHtcbiAgICBwb3N0TWVyZ2VDb21tYW5kcy5wdXNoKFxuICAgICAgU3RyaW5nLnJhd2BydW5faWZfY2hhbmdlZCBcIi4qXFwucHJpc21hXCIgXCJub2RlIG5vZGVfbW9kdWxlcy8uYmluL2RvdGVudiAtYyBkZXZlbG9wbWVudCAtLSBub2RlIG5vZGVfbW9kdWxlcy8uYmluL3ByaXNtYSBtaWdyYXRlIGRlcGxveVwiYCxcbiAgICAgIFN0cmluZy5yYXdgcnVuX2lmX2NoYW5nZWQgXCIuKlxcLnByaXNtYVwiIFwibm9kZSBub2RlX21vZHVsZXMvLmJpbi9kb3RlbnYgLWMgZGV2ZWxvcG1lbnQgLS0gbm9kZSBub2RlX21vZHVsZXMvLmJpbi9wcmlzbWEgZ2VuZXJhdGVcImBcbiAgICApO1xuICB9XG4gIGNvbnN0IGdlbkkxOG5Uc0NvbW1hbmQgPSBnZXRHZW5JMThuVHNDb21tYW5kKGNvbmZpZywgY29uZmlnLnBhY2thZ2VKc29uPy5zY3JpcHRzKTtcbiAgaWYgKGdlbkkxOG5Uc0NvbW1hbmQpIHtcbiAgICAvLyBnZW4taTE4bi10cyBvdXRwdXRzIGFyZSBjb21tb25seSBpZ25vcmVkLCBzbyBwb3N0LW1lcmdlIHJlZ2VuZXJhdGVzIHRoZW0gYWZ0ZXIgcHVsbGVkIHJlc291cmNlIGNoYW5nZXMuXG4gICAgcG9zdE1lcmdlQ29tbWFuZHMucHVzaChTdHJpbmcucmF3YHJ1bl9pZl9jaGFuZ2VkIFwiKF58LylpMThuLy4qXFwuanNvbiRcIiBcIiR7Z2VuSTE4blRzQ29tbWFuZH1cImApO1xuICB9XG4gIHJldHVybiBwb3N0TWVyZ2VDb21tYW5kcztcbn1cblxuZnVuY3Rpb24gaGFzUHl0aG9uUGFja2FnZU1hbmFnZXIoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogYm9vbGVhbiB7XG4gIHJldHVybiBjb25maWcuZG9lc0NvbnRhaW5Qb2V0cnlMb2NrIHx8IGNvbmZpZy5kb2VzQ29udGFpblV2TG9jaztcbn1cblxuZnVuY3Rpb24gZ2V0UHl0aG9uUnVubmVyKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6ICdwb2V0cnkgcnVuJyB8ICd1diBydW4nIHtcbiAgcmV0dXJuIGNvbmZpZy5kb2VzQ29udGFpblV2TG9jayA/ICd1diBydW4nIDogJ3BvZXRyeSBydW4nO1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlTGludHN0YWdlZHJjKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2dlbmVyYXRlTGludHN0YWdlZHJjJywgYXN5bmMgKCkgPT4ge1xuICAgIGF3YWl0IFByb21pc2UuYWxsKFtcbiAgICAgIHByb21pc2VQb29sLnJ1bigoKSA9PiBmcy5wcm9taXNlcy5ybShgJHtjb25maWcuZGlyUGF0aH0vLmxpbnRzdGFnZWRyYy5janNgLCB7IGZvcmNlOiB0cnVlIH0pKSxcbiAgICAgIHByb21pc2VQb29sLnJ1bigoKSA9PiBmcy5wcm9taXNlcy5ybShgJHtjb25maWcuZGlyUGF0aH0vLmxpbnRzdGFnZWRyYy5qc2AsIHsgZm9yY2U6IHRydWUgfSkpLFxuICAgICAgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzLnByb21pc2VzLnJtKGAke2NvbmZpZy5kaXJQYXRofS8ubGludHN0YWdlZHJjLmpzb25gLCB7IGZvcmNlOiB0cnVlIH0pKSxcbiAgICBdKTtcbiAgfSk7XG59XG4iLCJleHBvcnQgZnVuY3Rpb24gbm9ybWFsaXplQ29uZmlnQ29udGVudChjb250ZW50OiBzdHJpbmcgfCB1bmRlZmluZWQpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICByZXR1cm4gY29udGVudD8udHJpbSgpO1xufVxuIiwiZXhwb3J0IHR5cGUgQ29uZmlnQmxvY2tOYW1lID0gJ2Jhc2UnIHwgJ2V4cG9ydCc7XG5cbmludGVyZmFjZSBNYW5hZ2VkQ29uZmlnQmxvY2tzT3B0aW9ucyB7XG4gIGJsb2NrTmFtZXM6IHJlYWRvbmx5IENvbmZpZ0Jsb2NrTmFtZVtdO1xuICBtYXJrZXJQcmVmaXg6IHN0cmluZztcbiAgdG9vbE5hbWU6IHN0cmluZztcbn1cblxuaW50ZXJmYWNlIEdldENvbmZpZ0NvbnRlbnRPcHRpb25zIHtcbiAgZGVzaXJlZENvbnRlbnQ6IHN0cmluZztcbiAgZXhpc3RpbmdDb250ZW50OiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gIGZpbGVQYXRoOiBzdHJpbmc7XG59XG5cbmV4cG9ydCBjbGFzcyBNYW5hZ2VkQ29uZmlnQmxvY2tzIHtcbiAgcHJpdmF0ZSByZWFkb25seSBibG9ja05hbWVzOiByZWFkb25seSBDb25maWdCbG9ja05hbWVbXTtcblxuICBwcml2YXRlIHJlYWRvbmx5IG1hcmtlclByZWZpeDogc3RyaW5nO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgdG9vbE5hbWU6IHN0cmluZztcblxuICBjb25zdHJ1Y3RvcihvcHRpb25zOiBNYW5hZ2VkQ29uZmlnQmxvY2tzT3B0aW9ucykge1xuICAgIHRoaXMuYmxvY2tOYW1lcyA9IG9wdGlvbnMuYmxvY2tOYW1lcztcbiAgICB0aGlzLm1hcmtlclByZWZpeCA9IG9wdGlvbnMubWFya2VyUHJlZml4O1xuICAgIHRoaXMudG9vbE5hbWUgPSBvcHRpb25zLnRvb2xOYW1lO1xuICB9XG5cbiAgZ2V0Q29uZmlnQ29udGVudChvcHRpb25zOiBHZXRDb25maWdDb250ZW50T3B0aW9ucyk6IHN0cmluZyB7XG4gICAgaWYgKCFvcHRpb25zLmV4aXN0aW5nQ29udGVudCkgcmV0dXJuIG9wdGlvbnMuZGVzaXJlZENvbnRlbnQ7XG4gICAgaWYgKHRoaXMuaGFzTWFuYWdlZEJsb2NrcyhvcHRpb25zLmV4aXN0aW5nQ29udGVudCkpIHtcbiAgICAgIHJldHVybiB0aGlzLnJlcGxhY2VNYW5hZ2VkQmxvY2tzKG9wdGlvbnMuZXhpc3RpbmdDb250ZW50LCBvcHRpb25zLmRlc2lyZWRDb250ZW50LCBvcHRpb25zLmZpbGVQYXRoKTtcbiAgICB9XG4gICAgcmV0dXJuIG9wdGlvbnMuZGVzaXJlZENvbnRlbnQ7XG4gIH1cblxuICBnZXRCbG9jayhibG9ja05hbWU6IENvbmZpZ0Jsb2NrTmFtZSwgY29udGVudDogc3RyaW5nKTogc3RyaW5nIHtcbiAgICByZXR1cm4gYCR7dGhpcy5nZXRTdGFydE1hcmtlcihibG9ja05hbWUpfVxuJHtjb250ZW50fVxuJHt0aGlzLmdldEVuZE1hcmtlcihibG9ja05hbWUpfWA7XG4gIH1cblxuICBoYXNNYW5hZ2VkQmxvY2tzKGNvbnRlbnQ6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmJsb2NrTmFtZXMuc29tZSgoYmxvY2tOYW1lKSA9PiBjb250ZW50LmluY2x1ZGVzKHRoaXMuZ2V0U3RhcnRNYXJrZXIoYmxvY2tOYW1lKSkpO1xuICB9XG5cbiAgcHJpdmF0ZSByZXBsYWNlTWFuYWdlZEJsb2NrcyhleGlzdGluZ0NvbnRlbnQ6IHN0cmluZywgZGVzaXJlZENvbnRlbnQ6IHN0cmluZywgZmlsZVBhdGg6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgbGV0IGNvbnRlbnQgPSBleGlzdGluZ0NvbnRlbnQ7XG4gICAgZm9yIChjb25zdCBibG9ja05hbWUgb2YgdGhpcy5ibG9ja05hbWVzKSB7XG4gICAgICBjb25zdCByZXBsYWNlbWVudCA9IHRoaXMuZXh0cmFjdE1hbmFnZWRCbG9jayhkZXNpcmVkQ29udGVudCwgYmxvY2tOYW1lKTtcbiAgICAgIGlmICghcmVwbGFjZW1lbnQpIGNvbnRpbnVlO1xuXG4gICAgICBjb25zdCBuZXh0Q29udGVudCA9IHRoaXMucmVwbGFjZU1hbmFnZWRCbG9jayhjb250ZW50LCBibG9ja05hbWUsIHJlcGxhY2VtZW50KTtcbiAgICAgIGlmICghbmV4dENvbnRlbnQpIHtcbiAgICAgICAgY29uc29sZS53YXJuKGBTa2lwcGVkIHVwZGF0aW5nIGluY29tcGxldGUgJHtibG9ja05hbWV9IGJsb2NrIGluICR7dGhpcy50b29sTmFtZX0gY29uZmlnOiAke2ZpbGVQYXRofWApO1xuICAgICAgICByZXR1cm4gZXhpc3RpbmdDb250ZW50O1xuICAgICAgfVxuICAgICAgY29udGVudCA9IG5leHRDb250ZW50O1xuICAgIH1cbiAgICByZXR1cm4gY29udGVudDtcbiAgfVxuXG4gIHByaXZhdGUgZXh0cmFjdE1hbmFnZWRCbG9jayhjb250ZW50OiBzdHJpbmcsIGJsb2NrTmFtZTogQ29uZmlnQmxvY2tOYW1lKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5nZXRNYW5hZ2VkQmxvY2tSZWdFeHAoYmxvY2tOYW1lKS5leGVjKGNvbnRlbnQpPy5bMF07XG4gIH1cblxuICBwcml2YXRlIHJlcGxhY2VNYW5hZ2VkQmxvY2soY29udGVudDogc3RyaW5nLCBibG9ja05hbWU6IENvbmZpZ0Jsb2NrTmFtZSwgcmVwbGFjZW1lbnQ6IHN0cmluZyk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgY29uc3QgcGF0dGVybiA9IHRoaXMuZ2V0TWFuYWdlZEJsb2NrUmVnRXhwKGJsb2NrTmFtZSk7XG4gICAgaWYgKCFwYXR0ZXJuLnRlc3QoY29udGVudCkpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgcmV0dXJuIGNvbnRlbnQucmVwbGFjZShwYXR0ZXJuLCByZXBsYWNlbWVudCk7XG4gIH1cblxuICBwcml2YXRlIGdldE1hbmFnZWRCbG9ja1JlZ0V4cChibG9ja05hbWU6IENvbmZpZ0Jsb2NrTmFtZSk6IFJlZ0V4cCB7XG4gICAgcmV0dXJuIG5ldyBSZWdFeHAoXG4gICAgICBgJHtlc2NhcGVSZWdFeHAodGhpcy5nZXRTdGFydE1hcmtlcihibG9ja05hbWUpKX1bXFxcXHNcXFxcU10qPyR7ZXNjYXBlUmVnRXhwKHRoaXMuZ2V0RW5kTWFya2VyKGJsb2NrTmFtZSkpfWBcbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRTdGFydE1hcmtlcihibG9ja05hbWU6IENvbmZpZ0Jsb2NrTmFtZSk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGAvLyB3YmZ5OnN0YXJ0ICR7dGhpcy5tYXJrZXJQcmVmaXh9LSR7YmxvY2tOYW1lfWA7XG4gIH1cblxuICBwcml2YXRlIGdldEVuZE1hcmtlcihibG9ja05hbWU6IENvbmZpZ0Jsb2NrTmFtZSk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGAvLyB3YmZ5OmVuZCAke3RoaXMubWFya2VyUHJlZml4fS0ke2Jsb2NrTmFtZX1gO1xuICB9XG59XG5cbmZ1bmN0aW9uIGVzY2FwZVJlZ0V4cCh2YWx1ZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIHZhbHVlLnJlcGxhY2VBbGwoL1suKis/XiR7fSgpfFtcXF1cXFxcXS9nLCBTdHJpbmcucmF3YFxcJCZgKTtcbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGZzVXRpbCB9IGZyb20gJy4uL3V0aWxzL2ZzVXRpbC5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcblxuaW1wb3J0IHsgbm9ybWFsaXplQ29uZmlnQ29udGVudCB9IGZyb20gJy4vY29uZmlnQ29udGVudC5qcyc7XG5pbXBvcnQgeyBNYW5hZ2VkQ29uZmlnQmxvY2tzIH0gZnJvbSAnLi9tYW5hZ2VkQ29uZmlnQmxvY2suanMnO1xuXG5jb25zdCBtYW5hZ2VkQ29uZmlnQmxvY2tzID0gbmV3IE1hbmFnZWRDb25maWdCbG9ja3Moe1xuICBibG9ja05hbWVzOiBbJ2Jhc2UnLCAnZXhwb3J0J10sXG4gIG1hcmtlclByZWZpeDogJ294Zm10JyxcbiAgdG9vbE5hbWU6ICdveGZtdCcsXG59KTtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlT3hmbXRDb25maWcoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZ2VuZXJhdGVPeGZtdENvbmZpZycsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBsZWdhY3lKc29uQ29uZmlnUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJy5veGZtdHJjLmpzb24nKTtcbiAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJ294Zm10LmNvbmZpZy50cycpO1xuICAgIGNvbnN0IGV4aXN0aW5nQ29udGVudCA9IGF3YWl0IGZzVXRpbC5yZWFkRmlsZUlnbm9yaW5nRXJyb3IoZmlsZVBhdGgpO1xuICAgIGNvbnN0IGRlc2lyZWRDb250ZW50ID0gbWFuYWdlZENvbmZpZ0Jsb2Nrcy5nZXRDb25maWdDb250ZW50KHtcbiAgICAgIGRlc2lyZWRDb250ZW50OiBnZXRDb25maWdDb250ZW50KGNvbmZpZyksXG4gICAgICBleGlzdGluZ0NvbnRlbnQsXG4gICAgICBmaWxlUGF0aCxcbiAgICB9KTtcbiAgICBjb25zdCBwcm9taXNlcyA9IFtwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnMucHJvbWlzZXMucm0obGVnYWN5SnNvbkNvbmZpZ1BhdGgsIHsgZm9yY2U6IHRydWUgfSkpXTtcbiAgICBpZiAobm9ybWFsaXplQ29uZmlnQ29udGVudChleGlzdGluZ0NvbnRlbnQpICE9PSBub3JtYWxpemVDb25maWdDb250ZW50KGRlc2lyZWRDb250ZW50KSkge1xuICAgICAgcHJvbWlzZXMucHVzaChwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnNVdGlsLmdlbmVyYXRlRmlsZShmaWxlUGF0aCwgZGVzaXJlZENvbnRlbnQpKSk7XG4gICAgfVxuICAgIGF3YWl0IFByb21pc2UuYWxsKHByb21pc2VzKTtcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIGdldENvbmZpZ0NvbnRlbnQoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogc3RyaW5nIHtcbiAgLy8gQ29tbW9uSlMgcGFja2FnZXMgbmVlZCByZXF1aXJlL21vZHVsZS5leHBvcnRzIGhlcmU6IG94Zm10IGNvbmZpZyBmaWxlcyBhcmVcbiAgLy8gb25seSBhdXRvLWRpc2NvdmVyZWQgYXMgLnRzLCBhbmQgdGhlIHNoYXJlZCBjb25maWcgcGFja2FnZSBpcyBFU00tb25seS5cbiAgaWYgKCFjb25maWcuaXNFc21QYWNrYWdlKSB7XG4gICAgcmV0dXJuIGAke21hbmFnZWRDb25maWdCbG9ja3MuZ2V0QmxvY2soXG4gICAgICAnYmFzZScsXG4gICAgICBgLy8vIDxyZWZlcmVuY2UgdHlwZXM9XCJub2RlXCIgLz5cbi8vIG94bGludC1kaXNhYmxlIHVuaWNvcm4vcHJlZmVyLW1vZHVsZSAtLSBPeGZtdCBjb25maWcgZmlsZXMgYXJlIG9ubHkgYXV0by1kaXNjb3ZlcmVkIGFzIC50cywgYW5kIENvbW1vbkpTIGF2b2lkcyBFU00gcGFja2FnZSBsb2FkaW5nIGlzc3Vlcy5cbmNvbnN0IG94Zm10Q29uZmlnID0gcmVxdWlyZSgnQHdpbGxib29zdGVyL294Zm10LWNvbmZpZycpO1xuXG5jb25zdCBveGZtdFJlc29sdmVkQ29uZmlnID0gb3hmbXRDb25maWcuZGVmYXVsdCA/PyBveGZtdENvbmZpZztgXG4gICAgKX1cblxuJHttYW5hZ2VkQ29uZmlnQmxvY2tzLmdldEJsb2NrKCdleHBvcnQnLCAnbW9kdWxlLmV4cG9ydHMgPSBveGZtdFJlc29sdmVkQ29uZmlnOycpfVxuYDtcbiAgfVxuXG4gIHJldHVybiBgJHttYW5hZ2VkQ29uZmlnQmxvY2tzLmdldEJsb2NrKCdiYXNlJywgXCJpbXBvcnQgY29uZmlnIGZyb20gJ0B3aWxsYm9vc3Rlci9veGZtdC1jb25maWcnO1wiKX1cblxuJHttYW5hZ2VkQ29uZmlnQmxvY2tzLmdldEJsb2NrKCdleHBvcnQnLCAnZXhwb3J0IGRlZmF1bHQgY29uZmlnOycpfVxuYDtcbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGZzVXRpbCB9IGZyb20gJy4uL3V0aWxzL2ZzVXRpbC5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcbmltcG9ydCB7IGlzUHVibGlzaGVkV2lsbGJvb3N0ZXJDb25maWdzUGFja2FnZSB9IGZyb20gJy4uL3V0aWxzL3dpbGxib29zdGVyQ29uZmlnc1V0aWwuanMnO1xuXG5pbXBvcnQgeyBub3JtYWxpemVDb25maWdDb250ZW50IH0gZnJvbSAnLi9jb25maWdDb250ZW50LmpzJztcbmltcG9ydCB7IE1hbmFnZWRDb25maWdCbG9ja3MgfSBmcm9tICcuL21hbmFnZWRDb25maWdCbG9jay5qcyc7XG5cbmNvbnN0IG1hbmFnZWRDb25maWdCbG9ja3MgPSBuZXcgTWFuYWdlZENvbmZpZ0Jsb2Nrcyh7XG4gIGJsb2NrTmFtZXM6IFsnYmFzZScsICdleHBvcnQnXSxcbiAgbWFya2VyUHJlZml4OiAnb3hsaW50JyxcbiAgdG9vbE5hbWU6ICdveGxpbnQnLFxufSk7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZW5lcmF0ZU94bGludENvbmZpZyhjb25maWc6IFBhY2thZ2VDb25maWcsIF9yb290Q29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZ2VuZXJhdGVPeGxpbnRDb25maWcnLCBhc3luYyAoKSA9PiB7XG4gICAgLy8gd2lsbGJvb3N0ZXItY29uZmlncyBwdWJsaXNoZXMgY29uZmlnIGZpbGVzIGFzIHByb2R1Y3QgY29kZSwgc28gbWlncmF0aW9uXG4gICAgLy8gbXVzdCBub3QgcmVtb3ZlIHBhY2thZ2UtcHJvdmlkZWQgbGludGVyIHNldHRpbmdzLiBHZW5lcmF0ZWQgZmlsZXMgd2l0aFxuICAgIC8vIG1hbmFnZWQgYmxvY2tzIGFyZSBzdGlsbCBzYWZlIHRvIHVwZGF0ZS5cbiAgICBjb25zdCBzaG91bGRQcmVzZXJ2ZVB1Ymxpc2hlZExpbnRlckNvbmZpZyA9IGlzUHVibGlzaGVkV2lsbGJvb3N0ZXJDb25maWdzUGFja2FnZShjb25maWcpO1xuICAgIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnb3hsaW50LmNvbmZpZy50cycpO1xuICAgIGNvbnN0IGV4aXN0aW5nQ29udGVudCA9IGF3YWl0IGZzVXRpbC5yZWFkRmlsZUlnbm9yaW5nRXJyb3IoZmlsZVBhdGgpO1xuICAgIGNvbnN0IHNob3VsZFByZXNlcnZlRXhpc3RpbmdDb250ZW50ID1cbiAgICAgIHNob3VsZFByZXNlcnZlUHVibGlzaGVkTGludGVyQ29uZmlnICYmIGV4aXN0aW5nQ29udGVudCAmJiAhbWFuYWdlZENvbmZpZ0Jsb2Nrcy5oYXNNYW5hZ2VkQmxvY2tzKGV4aXN0aW5nQ29udGVudCk7XG4gICAgY29uc3QgZGVzaXJlZENvbnRlbnQgPSBzaG91bGRQcmVzZXJ2ZUV4aXN0aW5nQ29udGVudFxuICAgICAgPyBleGlzdGluZ0NvbnRlbnRcbiAgICAgIDogcmVwbGFjZUxlZ2FjeUNvbmZpZ1JlZmVyZW5jZXMoXG4gICAgICAgICAgbWFuYWdlZENvbmZpZ0Jsb2Nrcy5nZXRDb25maWdDb250ZW50KHtcbiAgICAgICAgICAgIGRlc2lyZWRDb250ZW50OiBnZXRDb25maWdDb250ZW50KGNvbmZpZyksXG4gICAgICAgICAgICBleGlzdGluZ0NvbnRlbnQsXG4gICAgICAgICAgICBmaWxlUGF0aCxcbiAgICAgICAgICB9KVxuICAgICAgICApO1xuXG4gICAgY29uc3QgcHJvbWlzZXM6IFByb21pc2U8dm9pZD5bXSA9IFtdO1xuICAgIGlmICghc2hvdWxkUHJlc2VydmVQdWJsaXNoZWRMaW50ZXJDb25maWcpIHtcbiAgICAgIHByb21pc2VzLnB1c2goXG4gICAgICAgIHByb21pc2VQb29sLnJ1bigoKSA9PiBmcy5wcm9taXNlcy5ybShwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICcub3hsaW50cmMuanNvbicpLCB7IGZvcmNlOiB0cnVlIH0pKSxcbiAgICAgICAgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzLnByb21pc2VzLnJtKHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJ2Jpb21lLmpzb24nKSwgeyBmb3JjZTogdHJ1ZSB9KSksXG4gICAgICAgIHByb21pc2VQb29sLnJ1bigoKSA9PiBmcy5wcm9taXNlcy5ybShwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICdiaW9tZS5qc29uYycpLCB7IGZvcmNlOiB0cnVlIH0pKSxcbiAgICAgICAgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzLnByb21pc2VzLnJtKHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJy5lc2xpbnRyYycpLCB7IGZvcmNlOiB0cnVlIH0pKSxcbiAgICAgICAgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzLnByb21pc2VzLnJtKHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJy5lc2xpbnRyYy5janMnKSwgeyBmb3JjZTogdHJ1ZSB9KSksXG4gICAgICAgIHByb21pc2VQb29sLnJ1bigoKSA9PiBmcy5wcm9taXNlcy5ybShwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICcuZXNsaW50cmMuanMnKSwgeyBmb3JjZTogdHJ1ZSB9KSksXG4gICAgICAgIHByb21pc2VQb29sLnJ1bigoKSA9PiBmcy5wcm9taXNlcy5ybShwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICcuZXNsaW50cmMuanNvbicpLCB7IGZvcmNlOiB0cnVlIH0pKSxcbiAgICAgICAgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzLnByb21pc2VzLnJtKHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJy5lc2xpbnRyYy55YW1sJyksIHsgZm9yY2U6IHRydWUgfSkpLFxuICAgICAgICBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnMucHJvbWlzZXMucm0ocGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnLmVzbGludHJjLnltbCcpLCB7IGZvcmNlOiB0cnVlIH0pKSxcbiAgICAgICAgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzLnByb21pc2VzLnJtKHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJ2VzbGludC5jb25maWcuY2pzJyksIHsgZm9yY2U6IHRydWUgfSkpLFxuICAgICAgICBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnMucHJvbWlzZXMucm0ocGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnZXNsaW50LmNvbmZpZy5qcycpLCB7IGZvcmNlOiB0cnVlIH0pKSxcbiAgICAgICAgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzLnByb21pc2VzLnJtKHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJ2VzbGludC5jb25maWcubWpzJyksIHsgZm9yY2U6IHRydWUgfSkpLFxuICAgICAgICBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnMucHJvbWlzZXMucm0ocGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnZXNsaW50LmNvbmZpZy50cycpLCB7IGZvcmNlOiB0cnVlIH0pKVxuICAgICAgKTtcbiAgICB9XG4gICAgaWYgKG5vcm1hbGl6ZUNvbmZpZ0NvbnRlbnQoZXhpc3RpbmdDb250ZW50KSAhPT0gbm9ybWFsaXplQ29uZmlnQ29udGVudChkZXNpcmVkQ29udGVudCkpIHtcbiAgICAgIHByb21pc2VzLnB1c2gocHJvbWlzZVBvb2wucnVuKCgpID0+IGZzVXRpbC5nZW5lcmF0ZUZpbGUoZmlsZVBhdGgsIGRlc2lyZWRDb250ZW50KSkpO1xuICAgIH1cbiAgICBhd2FpdCBQcm9taXNlLmFsbChwcm9taXNlcyk7XG4gIH0pO1xufVxuXG5mdW5jdGlvbiByZXBsYWNlTGVnYWN5Q29uZmlnUmVmZXJlbmNlcyhjb250ZW50OiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gY29udGVudC5yZXBsYWNlQWxsKCdjb25maWcuJywgJ294bGludFJlc29sdmVkQ29uZmlnLicpO1xufVxuXG5mdW5jdGlvbiBnZXRDb25maWdDb250ZW50KGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IHN0cmluZyB7XG4gIGNvbnN0IGlzUm9vdENvbmZpZyA9IGNvbmZpZy5pc1Jvb3Q7XG5cbiAgLy8gRG8gbm90IGNvbGxhcHNlIHRoaXMgdG8gYSBzdGF0aWMgaW1wb3J0IGZvciBldmVyeSBwYWNrYWdlLiBDb21tb25KUyBwYWNrYWdlc1xuICAvLyB0eXBlLWNoZWNrIGF1dG8tZGlzY292ZXJlZCBveGxpbnQuY29uZmlnLnRzIGFzIENvbW1vbkpTLCBzbyBpbXBvcnRpbmcgdGhlIEVTTVxuICAvLyBAd2lsbGJvb3N0ZXIvb3hsaW50LWNvbmZpZyBwYWNrYWdlIHRyaWdnZXJzIFRTMTQ3OS4gS2VlcCB0aGlzIGluIHN5bmMgd2l0aFxuICAvLyBsaXRlcmFjeS10ZXN0J3MgZ2VuZXJhdGVkIGNvbmZpZyBwYXR0ZXJuLlxuICBpZiAoIWNvbmZpZy5pc0VzbVBhY2thZ2UpIHtcbiAgICByZXR1cm4gYCR7bWFuYWdlZENvbmZpZ0Jsb2Nrcy5nZXRCbG9jayhcbiAgICAgICdiYXNlJyxcbiAgICAgIGAvLy8gPHJlZmVyZW5jZSB0eXBlcz1cIm5vZGVcIiAvPlxuLy8gb3hsaW50LWRpc2FibGUgdW5pY29ybi9wcmVmZXItbW9kdWxlIC0tIE94bGludCBvbmx5IGF1dG8tZGlzY292ZXJzIC50cyBjb25maWcgZmlsZXMsIGFuZCBDb21tb25KUyBhdm9pZHMgRVNNIHBhY2thZ2UgbG9hZGluZyBpc3N1ZXMuXG5jb25zdCBveGxpbnRCYXNlQ29uZmlnID0gcmVxdWlyZSgnQHdpbGxib29zdGVyL294bGludC1jb25maWcnKTtcblxuJHtnZXRSZXNvbHZlZENvbmZpZ0NvbnRlbnQoJ294bGludEJhc2VDb25maWcuZGVmYXVsdCA/PyBveGxpbnRCYXNlQ29uZmlnJywgaXNSb290Q29uZmlnKX1gXG4gICAgKX1cblxuJHttYW5hZ2VkQ29uZmlnQmxvY2tzLmdldEJsb2NrKCdleHBvcnQnLCAnbW9kdWxlLmV4cG9ydHMgPSBveGxpbnRSZXNvbHZlZENvbmZpZzsnKX1cbmA7XG4gIH1cblxuICByZXR1cm4gYCR7bWFuYWdlZENvbmZpZ0Jsb2Nrcy5nZXRCbG9jayhcbiAgICAnYmFzZScsXG4gICAgYGltcG9ydCBveGxpbnRCYXNlQ29uZmlnIGZyb20gJ0B3aWxsYm9vc3Rlci9veGxpbnQtY29uZmlnJztcblxuJHtnZXRSZXNvbHZlZENvbmZpZ0NvbnRlbnQoJ294bGludEJhc2VDb25maWcnLCBpc1Jvb3RDb25maWcpfWBcbiAgKX1cblxuJHttYW5hZ2VkQ29uZmlnQmxvY2tzLmdldEJsb2NrKCdleHBvcnQnLCAnZXhwb3J0IGRlZmF1bHQgb3hsaW50UmVzb2x2ZWRDb25maWc7Jyl9XG5gO1xufVxuXG5mdW5jdGlvbiBnZXRSZXNvbHZlZENvbmZpZ0NvbnRlbnQoYmFzZUNvbmZpZ05hbWU6IHN0cmluZywgaXNSb290Q29uZmlnOiBib29sZWFuKTogc3RyaW5nIHtcbiAgaWYgKGlzUm9vdENvbmZpZykge1xuICAgIHJldHVybiBgY29uc3Qgb3hsaW50UmVzb2x2ZWRDb25maWcgPSAke2Jhc2VDb25maWdOYW1lfTtgO1xuICB9XG5cbiAgcmV0dXJuIGAvLyBPeGxpbnQgb25seSBzdXBwb3J0cyB0eXBlLWF3YXJlIG9wdGlvbnMgaW4gdGhlIHJvb3QgY29uZmlnLCB3aGlsZSBpdFxuLy8gc3RpbGwgYXV0by1kaXNjb3ZlcnMgcGFja2FnZS1sb2NhbCBjb25maWcgZmlsZXMgaW4gbW9ub3JlcG9zLiBLZWVwIHRoaXMgYXMgYVxuLy8gcGxhaW4gb2JqZWN0IGNvcHkgc28gcGFja2FnZSB0eXBlY2hlY2tzIGRvIG5vdCBleHBvcnQgb3hsaW50J3MgcHJpdmF0ZSBoZWxwZXJcbi8vIHR5cGVzIHRocm91Z2ggdGhlIGdlbmVyYXRlZCBjb25maWcgdmFyaWFibGUuXG5jb25zdCBveGxpbnRSZXNvbHZlZENvbmZpZzogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPSB7IC4uLiR7YmFzZUNvbmZpZ05hbWV9IH07XG5kZWxldGUgb3hsaW50UmVzb2x2ZWRDb25maWcub3B0aW9ucztgO1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZnNVdGlsIH0gZnJvbSAnLi4vdXRpbHMvZnNVdGlsLmpzJztcbmltcG9ydCB7IGlnbm9yZUZpbGVVdGlsIH0gZnJvbSAnLi4vdXRpbHMvaWdub3JlRmlsZVV0aWwuanMnO1xuaW1wb3J0IHsgZG9lc0NvbnRhaW5KYXZhIH0gZnJvbSAnLi4vdXRpbHMvcGFja2FnZUNhcGFiaWxpdGllcy5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcblxuY29uc3QgY29tbW9uQ29udGVudCA9IGBcbjNyZC1wYXJ0eS9cbmFuZHJvaWQvXG5pb3MvXG5uby1mb3JtYXQvXG50ZXN0LWZpeHR1cmVzL1xudGVzdC9maXh0dXJlcy9cbiouZC50c1xuKi5taW4uanNcbi55YXJuL1xuLnBucC5qc1xuYDtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlUHJldHRpZXJpZ25vcmUoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZ2VuZXJhdGVQcmV0dGllcmlnbm9yZScsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJy5wcmV0dGllcmlnbm9yZScpO1xuICAgIGlmICghZG9lc0NvbnRhaW5KYXZhKGNvbmZpZykpIHtcbiAgICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiBmcy5wcm9taXNlcy5ybShmaWxlUGF0aCwgeyBmb3JjZTogdHJ1ZSB9KSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IGNvbnRlbnQgPSAoYXdhaXQgZnNVdGlsLnJlYWRGaWxlSWdub3JpbmdFcnJvcihmaWxlUGF0aCkpID8/ICcnO1xuICAgIGNvbnN0IGhlYWRVc2VyQ29udGVudCA9IGlnbm9yZUZpbGVVdGlsLmdldEhlYWRVc2VyQ29udGVudChjb250ZW50KTtcbiAgICBjb25zdCB0YWlsVXNlckNvbnRlbnQgPSBpZ25vcmVGaWxlVXRpbC5nZXRUYWlsVXNlckNvbnRlbnQoY29udGVudCk7XG5cbiAgICBjb25zdCBnaXRpZ25vcmVGaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJy5naXRpZ25vcmUnKTtcbiAgICBjb25zdCBnaXRpZ25vcmVDb250ZW50ID0gKGF3YWl0IGlnbm9yZUZpbGVVdGlsLnJlYWRHaXRpZ25vcmVXaXRob3V0U2VwYXJhdG9ycyhnaXRpZ25vcmVGaWxlUGF0aCkpIHx8ICcnO1xuXG4gICAgbGV0IGFkZGl0aW9uYWxDb250ZW50ID0gJyc7XG4gICAgaWYgKGNvbmZpZy5kb2VzQ29udGFpblB1YnNwZWNZYW1sKSB7XG4gICAgICBhZGRpdGlvbmFsQ29udGVudCA9IGBcbmFuZHJvaWQvYXBwL1xuaW9zL1J1bm5lci9Bc3NldHMueGNhc3NldHMvXG5wdWJzcGVjLnlhbWxcbmA7XG4gICAgfVxuXG4gICAgY29uc3QgbmV3Q29udGVudCA9IGhlYWRVc2VyQ29udGVudCArIGNvbW1vbkNvbnRlbnQgKyBhZGRpdGlvbmFsQ29udGVudCArIGdpdGlnbm9yZUNvbnRlbnQgKyB0YWlsVXNlckNvbnRlbnQ7XG4gICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzVXRpbC5nZW5lcmF0ZUZpbGUoZmlsZVBhdGgsIG5ld0NvbnRlbnQpKTtcbiAgfSk7XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgbWVyZ2UgZnJvbSAnZGVlcG1lcmdlJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZnNVdGlsIH0gZnJvbSAnLi4vdXRpbHMvZnNVdGlsLmpzJztcbmltcG9ydCB7IG92ZXJ3cml0ZU1lcmdlIH0gZnJvbSAnLi4vdXRpbHMvbWVyZ2VVdGlsLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuXG5jb25zdCBqc29uT2JqID0ge1xuICB2ZW52UGF0aDogJy4nLFxuICB2ZW52OiAnLnZlbnYnLFxufTtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlUHlyaWdodENvbmZpZ0pzb24oY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZ2VuZXJhdGVQeXJpZ2h0Q29uZmlnSnNvbicsIGFzeW5jICgpID0+IHtcbiAgICBsZXQgbmV3U2V0dGluZ3M6IG9iamVjdCA9IHN0cnVjdHVyZWRDbG9uZShqc29uT2JqKTtcbiAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJ3B5cmlnaHRjb25maWcuanNvbicpO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBvbGRDb250ZW50ID0gYXdhaXQgZnMucHJvbWlzZXMucmVhZEZpbGUoZmlsZVBhdGgsICd1dGY4Jyk7XG4gICAgICBjb25zdCBvbGRTZXR0aW5ncyA9IEpTT04ucGFyc2Uob2xkQ29udGVudCkgYXMgb2JqZWN0O1xuICAgICAgbmV3U2V0dGluZ3MgPSBtZXJnZS5hbGwoW25ld1NldHRpbmdzLCBvbGRTZXR0aW5ncywgbmV3U2V0dGluZ3NdLCB7IGFycmF5TWVyZ2U6IG92ZXJ3cml0ZU1lcmdlIH0pO1xuICAgIH0gY2F0Y2gge1xuICAgICAgLy8gZG8gbm90aGluZ1xuICAgIH1cbiAgICBjb25zdCBuZXdDb250ZW50ID0gSlNPTi5zdHJpbmdpZnkobmV3U2V0dGluZ3MsIHVuZGVmaW5lZCwgMik7XG4gICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzVXRpbC5nZW5lcmF0ZUZpbGUoZmlsZVBhdGgsIG5ld0NvbnRlbnQpKTtcbiAgfSk7XG59XG4iLCJpbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBmc1V0aWwgfSBmcm9tICcuLi91dGlscy9mc1V0aWwuanMnO1xuaW1wb3J0IHsgcHJvbWlzZVBvb2wgfSBmcm9tICcuLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5cbmNvbnN0IG1hbmFnZWRTY3JpcHRzQmxvY2sgPSBgc2NyaXB0cy8qKlxuIXNjcmlwdHMvXG4hc2NyaXB0cy8qLnNoYDtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGZpeFJhaWx3YXlpZ25vcmUoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZml4UmFpbHdheWlnbm9yZScsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJy5yYWlsd2F5aWdub3JlJyk7XG4gICAgY29uc3QgY29udGVudCA9IGF3YWl0IGZzVXRpbC5yZWFkRmlsZUlnbm9yaW5nRXJyb3IoZmlsZVBhdGgpO1xuICAgIGlmICghY29udGVudCkgcmV0dXJuO1xuXG4gICAgY29uc3QgbmV3Q29udGVudCA9IGNvbnRlbnQucmVwbGFjZSgvXnNjcmlwdHNcXC8kL20sIG1hbmFnZWRTY3JpcHRzQmxvY2spO1xuICAgIGlmIChuZXdDb250ZW50ID09PSBjb250ZW50KSByZXR1cm47XG5cbiAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnNVdGlsLmdlbmVyYXRlRmlsZShmaWxlUGF0aCwgbmV3Q29udGVudCkpO1xuICB9KTtcbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGZzVXRpbCB9IGZyb20gJy4uL3V0aWxzL2ZzVXRpbC5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcblxuY29uc3Qgc2VtYW50aWNSZWxlYXNlQmFkZ2UgPVxuICAnWyFbc2VtYW50aWMtcmVsZWFzZV0oaHR0cHM6Ly9pbWcuc2hpZWxkcy5pby9iYWRnZS8lMjAlMjAlRjAlOUYlOTMlQTYlRjAlOUYlOUElODAtc2VtYW50aWMtLXJlbGVhc2UtZTEwMDc5LnN2ZyldKGh0dHBzOi8vZ2l0aHViLmNvbS9zZW1hbnRpYy1yZWxlYXNlL3NlbWFudGljLXJlbGVhc2UpJztcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlUmVhZG1lKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2dlbmVyYXRlUmVhZG1lJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnUkVBRE1FLm1kJyk7XG4gICAgbGV0IG5ld0NvbnRlbnQgPSBhd2FpdCBmcy5wcm9taXNlcy5yZWFkRmlsZShmaWxlUGF0aCwgJ3V0ZjgnKTtcblxuICAgIGlmIChmcy5leGlzdHNTeW5jKHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJy5yZWxlYXNlcmMuanNvbicpKSkge1xuICAgICAgbmV3Q29udGVudCA9IGluc2VydEJhZGdlKG5ld0NvbnRlbnQsIHNlbWFudGljUmVsZWFzZUJhZGdlKTtcbiAgICB9XG5cbiAgICBjb25zdCByZXBvc2l0b3J5ID0gY29uZmlnLnJlcG9zaXRvcnk/LnNsaWNlKGNvbmZpZy5yZXBvc2l0b3J5LmluZGV4T2YoJzonKSArIDEpO1xuICAgIGNvbnN0IHdvcmtmbG93c1BhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICcuZ2l0aHViJywgJ3dvcmtmbG93cycpO1xuICAgIGNvbnN0IGZpbGVOYW1lcyA9IGZzLmV4aXN0c1N5bmMod29ya2Zsb3dzUGF0aCkgPyBmcy5yZWFkZGlyU3luYyh3b3JrZmxvd3NQYXRoKSA6IFtdO1xuICAgIGZvciAoY29uc3QgZmlsZU5hbWUgb2YgZmlsZU5hbWVzKSB7XG4gICAgICBpZiAoIWZpbGVOYW1lLnN0YXJ0c1dpdGgoJ3Rlc3QnKSAmJiAhZmlsZU5hbWUuc3RhcnRzV2l0aCgnZGVwbG95JykpIGNvbnRpbnVlO1xuXG4gICAgICBsZXQgYmFkZ2VOYW1lID0gZmlsZU5hbWU7XG4gICAgICBiYWRnZU5hbWUgPSAoYmFkZ2VOYW1lWzBdIHx8ICcnKS50b1VwcGVyQ2FzZSgpICsgYmFkZ2VOYW1lLnNsaWNlKDEsIGJhZGdlTmFtZS5pbmRleE9mKCcuJykpO1xuICAgICAgYmFkZ2VOYW1lID0gYmFkZ2VOYW1lLnJlcGxhY2UoJy0nLCAnICcpO1xuICAgICAgaWYgKCFyZXBvc2l0b3J5KSBjb250aW51ZTtcbiAgICAgIGNvbnN0IGJhZGdlID0gYFshWyR7YmFkZ2VOYW1lfV0oaHR0cHM6Ly9naXRodWIuY29tLyR7cmVwb3NpdG9yeX0vYWN0aW9ucy93b3JrZmxvd3MvJHtmaWxlTmFtZX0vYmFkZ2Uuc3ZnKV0oaHR0cHM6Ly9naXRodWIuY29tLyR7cmVwb3NpdG9yeX0vYWN0aW9ucy93b3JrZmxvd3MvJHtmaWxlTmFtZX0pYDtcbiAgICAgIGlmIChmcy5leGlzdHNTeW5jKHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgYC5naXRodWIvd29ya2Zsb3dzLyR7ZmlsZU5hbWV9YCkpKSB7XG4gICAgICAgIG5ld0NvbnRlbnQgPSByZW1vdmVHaXRIdWJBY3Rpb25zQmFkZ2UobmV3Q29udGVudCwgYmFkZ2VOYW1lLCBmaWxlTmFtZSk7XG4gICAgICAgIG5ld0NvbnRlbnQgPSBpbnNlcnRCYWRnZShuZXdDb250ZW50LCBiYWRnZSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzVXRpbC5nZW5lcmF0ZUZpbGUoZmlsZVBhdGgsIG5ld0NvbnRlbnQpKTtcbiAgfSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpbnNlcnRCYWRnZShyZWFkbWU6IHN0cmluZywgYmFkZ2U6IHN0cmluZyk6IHN0cmluZyB7XG4gIC8vIOaXouOBq2JhZGdl44GM44GC44KL5aC05ZCI44Gv5YmK6ZmkXG4gIHJlYWRtZSA9IHJlYWRtZS5yZXBsYWNlKGJhZGdlLCAnJykucmVwbGFjZUFsbCgvXFxuXFxuXFxuKy9nLCAnXFxuXFxuJyk7XG5cbiAgZm9yIChsZXQgaSA9IDA7IGkgPCByZWFkbWUubGVuZ3RoOyBpKyspIHtcbiAgICBpZiAocmVhZG1lW2kgLSAxXSA9PT0gJ1xcbicgJiYgcmVhZG1lW2ldID09PSAnXFxuJykge1xuICAgICAgY29uc3QgYmVmb3JlID0gcmVhZG1lLnNsaWNlKDAsIGkgKyAxKTtcbiAgICAgIGxldCBhZnRlciA9IHJlYWRtZS5zbGljZShpICsgMSk7XG4gICAgICBpZiAoIWFmdGVyLnN0YXJ0c1dpdGgoJ1snKSAmJiAhYWZ0ZXIuc3RhcnRzV2l0aCgnIScpKSB7XG4gICAgICAgIGFmdGVyID0gYFxcbiR7YWZ0ZXJ9YDtcbiAgICAgIH1cbiAgICAgIHJldHVybiBgJHtiZWZvcmV9JHtiYWRnZX1cXG4ke2FmdGVyfWA7XG4gICAgfVxuICB9XG4gIHJldHVybiBgJHtyZWFkbWV9XFxuJHtiYWRnZX1cXG5gO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcmVtb3ZlR2l0SHViQWN0aW9uc0JhZGdlKHJlYWRtZTogc3RyaW5nLCBiYWRnZU5hbWU6IHN0cmluZywgZmlsZU5hbWU6IHN0cmluZyk6IHN0cmluZyB7XG4gIGNvbnN0IGVzY2FwZWRCYWRnZU5hbWUgPSBlc2NhcGVSZWdFeHAoYmFkZ2VOYW1lKTtcbiAgY29uc3QgZXNjYXBlZEZpbGVOYW1lID0gZXNjYXBlUmVnRXhwKGZpbGVOYW1lKTtcbiAgcmV0dXJuIHJlYWRtZVxuICAgIC5yZXBsYWNlQWxsKFxuICAgICAgbmV3IFJlZ0V4cChcbiAgICAgICAgU3RyaW5nLnJhd2BcXFshXFxbJHtlc2NhcGVkQmFkZ2VOYW1lfVxcXVxcKGh0dHBzOi8vZ2l0aHViXFwuY29tL1teL1xccyldKy9bXi9cXHMpXSsvYWN0aW9ucy93b3JrZmxvd3MvJHtlc2NhcGVkRmlsZU5hbWV9L2JhZGdlXFwuc3ZnXFwpXFxdXFwoaHR0cHM6Ly9naXRodWJcXC5jb20vW14vXFxzKV0rL1teL1xccyldKy9hY3Rpb25zL3dvcmtmbG93cy8ke2VzY2FwZWRGaWxlTmFtZX1cXClcXG4/YCxcbiAgICAgICAgJ2d1J1xuICAgICAgKSxcbiAgICAgICcnXG4gICAgKVxuICAgIC5yZXBsYWNlQWxsKC9cXG5cXG5cXG4rL2csICdcXG5cXG4nKTtcbn1cblxuZnVuY3Rpb24gZXNjYXBlUmVnRXhwKHZhbHVlOiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gdmFsdWUucmVwbGFjZUFsbCgvWy4qKz9eJHt9KCl8W1xcXVxcXFxdL2csIFN0cmluZy5yYXdgXFwkJmApO1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IG1lcmdlIGZyb20gJ2RlZXBtZXJnZSc7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGZzVXRpbCB9IGZyb20gJy4uL3V0aWxzL2ZzVXRpbC5qcyc7XG5pbXBvcnQgeyBvdmVyd3JpdGVNZXJnZSB9IGZyb20gJy4uL3V0aWxzL21lcmdlVXRpbC5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlUmVsZWFzZXJjKHJvb3RDb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdnZW5lcmF0ZVJlbGVhc2VyYycsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShyb290Q29uZmlnLmRpclBhdGgsICcucmVsZWFzZXJjLmpzb24nKTtcbiAgICBpZiAoIWZzLmV4aXN0c1N5bmMoZmlsZVBhdGgpKSByZXR1cm47XG5cbiAgICBjb25zdCBzZXR0aW5ncyA9IEpTT04ucGFyc2UoYXdhaXQgZnMucHJvbWlzZXMucmVhZEZpbGUoZmlsZVBhdGgsICd1dGY4JykpIGFzIHtcbiAgICAgIHBsdWdpbnM/OiAoc3RyaW5nIHwgW3N0cmluZywgdW5rbm93bl0pW107XG4gICAgfTtcbiAgICBjb25zdCBwbHVnaW5zID0gc2V0dGluZ3MucGx1Z2lucyA/PyBbXTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHBsdWdpbnMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNvbnN0IHBsdWdpbkVudHJ5ID0gcGx1Z2luc1tpXTtcbiAgICAgIGNvbnN0IGlzQXJyYXkgPSBBcnJheS5pc0FycmF5KHBsdWdpbkVudHJ5KTtcbiAgICAgIGNvbnN0IHBsdWdpbiA9IGlzQXJyYXkgPyBwbHVnaW5FbnRyeVswXSA6IHBsdWdpbkVudHJ5O1xuICAgICAgY29uc3Qgb2xkQ29uZmlnID0gKGlzQXJyYXkgJiYgcGx1Z2luRW50cnlbMV0pIHx8IHt9O1xuICAgICAgaWYgKHBsdWdpbiA9PT0gJ0BzZW1hbnRpYy1yZWxlYXNlL2NvbW1pdC1hbmFseXplcicpIHtcbiAgICAgICAgcGx1Z2luc1tpXSA9IFtcbiAgICAgICAgICAnQHNlbWFudGljLXJlbGVhc2UvY29tbWl0LWFuYWx5emVyJyxcbiAgICAgICAgICBtZXJnZS5hbGwoXG4gICAgICAgICAgICBbXG4gICAgICAgICAgICAgIG9sZENvbmZpZyxcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHByZXNldDogJ2NvbnZlbnRpb25hbGNvbW1pdHMnLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIHsgYXJyYXlNZXJnZTogb3ZlcndyaXRlTWVyZ2UgfVxuICAgICAgICAgICksXG4gICAgICAgIF07XG4gICAgICB9IGVsc2UgaWYgKHBsdWdpbiA9PT0gJ0BzZW1hbnRpYy1yZWxlYXNlL2dpdGh1YicpIHtcbiAgICAgICAgcGx1Z2luc1tpXSA9IFtcbiAgICAgICAgICAnQHNlbWFudGljLXJlbGVhc2UvZ2l0aHViJyxcbiAgICAgICAgICBtZXJnZS5hbGwoXG4gICAgICAgICAgICBbXG4gICAgICAgICAgICAgIG9sZENvbmZpZyxcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIC8vIGNmLiBodHRwczovL2dpdGh1Yi5jb20vc2VtYW50aWMtcmVsZWFzZS9zZW1hbnRpYy1yZWxlYXNlL2lzc3Vlcy8yMjA0I2lzc3VlY29tbWVudC0xNTA4NDE3NzA0XG4gICAgICAgICAgICAgICAgc3VjY2Vzc0NvbW1lbnRDb25kaXRpb246IGZhbHNlLFxuICAgICAgICAgICAgICAgIGZhaWxDb21tZW50Q29uZGl0aW9uOiBmYWxzZSxcbiAgICAgICAgICAgICAgICBsYWJlbHM6IFsncjogc2VtYW50aWMtcmVsZWFzZSddLFxuICAgICAgICAgICAgICAgIHJlbGVhc2VkTGFiZWxzOiBbJ3JlbGVhc2VkIDpib29rbWFyazonXSxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICB7IGFycmF5TWVyZ2U6IG92ZXJ3cml0ZU1lcmdlIH1cbiAgICAgICAgICApLFxuICAgICAgICBdO1xuICAgICAgfVxuICAgIH1cbiAgICBjb25zdCBuZXdDb250ZW50ID0gSlNPTi5zdHJpbmdpZnkoc2V0dGluZ3MsIHVuZGVmaW5lZCwgMik7XG4gICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzVXRpbC5nZW5lcmF0ZUZpbGUoZmlsZVBhdGgsIG5ld0NvbnRlbnQpKTtcbiAgfSk7XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgbWVyZ2UgZnJvbSAnZGVlcG1lcmdlJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZnNVdGlsIH0gZnJvbSAnLi4vdXRpbHMvZnNVdGlsLmpzJztcbmltcG9ydCB7IG92ZXJ3cml0ZU1lcmdlIH0gZnJvbSAnLi4vdXRpbHMvbWVyZ2VVdGlsLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuXG5jb25zdCBqc29uT2JqID0ge1xuICAkc2NoZW1hOiAnaHR0cHM6Ly9kb2NzLnJlbm92YXRlYm90LmNvbS9yZW5vdmF0ZS1zY2hlbWEuanNvbicsXG4gIGV4dGVuZHM6IFsnZ2l0aHViPldpbGxCb29zdGVyL3dpbGxib29zdGVyLWNvbmZpZ3M6cmVub3ZhdGUuanNvbjUnXSxcbn07XG5cbnR5cGUgU2V0dGluZ3MgPSBPbWl0PHR5cGVvZiBqc29uT2JqLCAnZXh0ZW5kcyc+ICYge1xuICBleHRlbmRzPzogc3RyaW5nW107XG4gIHBhY2thZ2VSdWxlcz86IHsgbWF0Y2hQYWNrYWdlTmFtZXM6IHN0cmluZ1tdOyBlbmFibGVkPzogYm9vbGVhbiB9W107XG59O1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVSZW5vdmF0ZUpzb24oY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZ2VuZXJhdGVSZW5vdmF0ZUpzb24nLCBhc3luYyAoKSA9PiB7XG4gICAgbGV0IG5ld1NldHRpbmdzID0gc3RydWN0dXJlZENsb25lKGpzb25PYmopIGFzIFNldHRpbmdzO1xuICAgIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAncmVub3ZhdGUuanNvbicpO1xuICAgIGlmIChmcy5leGlzdHNTeW5jKGAke2ZpbGVQYXRofTVgKSkge1xuICAgICAgLy8gU2luY2UgaXQgaXMgZGlmZmljdWx0IGZvciBwYXJzaW5nIHJlbm92YXRlLmpzb241LCB3ZSBkbyBub3RoaW5nXG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRyeSB7XG4gICAgICBjb25zdCBvbGRDb250ZW50ID0gYXdhaXQgZnMucHJvbWlzZXMucmVhZEZpbGUoZmlsZVBhdGgsICd1dGY4Jyk7XG4gICAgICBjb25zdCBvbGRTZXR0aW5ncyA9IEpTT04ucGFyc2Uob2xkQ29udGVudCkgYXMgU2V0dGluZ3M7XG4gICAgICBuZXdTZXR0aW5ncyA9IG1lcmdlLmFsbChbbmV3U2V0dGluZ3MsIG9sZFNldHRpbmdzLCBuZXdTZXR0aW5nc10sIHtcbiAgICAgICAgYXJyYXlNZXJnZTogb3ZlcndyaXRlTWVyZ2UsXG4gICAgICB9KSBhcyBTZXR0aW5ncztcbiAgICAgIG5ld1NldHRpbmdzLmV4dGVuZHMgPSBtZXJnZVJlbm92YXRlRXh0ZW5kcyhqc29uT2JqLmV4dGVuZHMsIG9sZFNldHRpbmdzLmV4dGVuZHMgPz8gW10pO1xuICAgIH0gY2F0Y2gge1xuICAgICAgLy8gZG8gbm90aGluZ1xuICAgIH1cblxuICAgIC8vIERvbid0IHVwZ3JhZGUgTmV4dC5qcyBhdXRvbWF0aWNhbGx5XG4gICAgaWYgKGNvbmZpZy5kZXBlbmRpbmcuYmxpdHopIHtcbiAgICAgIG5ld1NldHRpbmdzLnBhY2thZ2VSdWxlcyA/Pz0gW107XG4gICAgICBpZiAoXG4gICAgICAgICFuZXdTZXR0aW5ncy5wYWNrYWdlUnVsZXMuc29tZSgocnVsZTogeyBtYXRjaFBhY2thZ2VOYW1lcz86IHN0cmluZ1tdIH0pID0+XG4gICAgICAgICAgcnVsZS5tYXRjaFBhY2thZ2VOYW1lcz8uaW5jbHVkZXMoJ25leHQnKVxuICAgICAgICApXG4gICAgICApIHtcbiAgICAgICAgbmV3U2V0dGluZ3MucGFja2FnZVJ1bGVzLnB1c2goeyBtYXRjaFBhY2thZ2VOYW1lczogWyduZXh0J10sIGVuYWJsZWQ6IGZhbHNlIH0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiBmcy5wcm9taXNlcy5ybShwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICcuZGVwZW5kYWJvdCcpLCB7IGZvcmNlOiB0cnVlIH0pKTtcbiAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnMucHJvbWlzZXMucm0ocGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnLnJlbm92YXRlcmMuanNvbicpLCB7IGZvcmNlOiB0cnVlIH0pKTtcbiAgICBjb25zdCBuZXdDb250ZW50ID0gSlNPTi5zdHJpbmdpZnkobmV3U2V0dGluZ3MsIHVuZGVmaW5lZCwgMik7XG4gICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzVXRpbC5nZW5lcmF0ZUZpbGUoZmlsZVBhdGgsIG5ld0NvbnRlbnQpKTtcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIG1lcmdlUmVub3ZhdGVFeHRlbmRzKGdlbmVyYXRlZEV4dGVuZHM6IHN0cmluZ1tdLCBleGlzdGluZ0V4dGVuZHM6IHN0cmluZ1tdKTogc3RyaW5nW10ge1xuICByZXR1cm4gWy4uLm5ldyBTZXQoWy4uLmdlbmVyYXRlZEV4dGVuZHMsIC4uLmV4aXN0aW5nRXh0ZW5kc10pXS5maWx0ZXIoKGl0ZW0pID0+IGl0ZW0gIT09ICdAd2lsbGJvb3N0ZXInKTtcbn1cbiIsImltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGluc3RhbGxBZ2VudFNraWxscyhfcm9vdENvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2luc3RhbGxBZ2VudFNraWxscycsIGFzeW5jICgpID0+IHtcbiAgICAvLyBUT0RPOiBXZSBhcmUgdGVtcG9yYXJpbHkgbm90IGluc3RhbGxpbmcgbWFuYWdlZCBhZ2VudCBza2lsbHMgaW50byByZXBvcy5cbiAgICAvLyBhd2FpdCBydW5JbnN0YWxsQWdlbnRTa2lsbHMoX3Jvb3RDb25maWcpO1xuICB9KTtcbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCBtZXJnZSBmcm9tICdkZWVwbWVyZ2UnO1xuaW1wb3J0IHR5cGUgeyBUc0NvbmZpZ0pzb24gfSBmcm9tICd0eXBlLWZlc3QnO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBmc1V0aWwgfSBmcm9tICcuLi91dGlscy9mc1V0aWwuanMnO1xuaW1wb3J0IHsgY29tYmluZU1lcmdlIH0gZnJvbSAnLi4vdXRpbHMvbWVyZ2VVdGlsLmpzJztcbmltcG9ydCB7IHNvcnRLZXlzIH0gZnJvbSAnLi4vdXRpbHMvb2JqZWN0VXRpbC5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcbmltcG9ydCB7IGdldFRzY29uZmlnRXh0ZW5kcyB9IGZyb20gJy4uL3V0aWxzL3RzY29uZmlnQmFzZS5qcyc7XG5cbmNvbnN0IHJvb3RKc29uT2JqID0ge1xuICBjb21waWxlck9wdGlvbnM6IHtcbiAgICBhbHdheXNTdHJpY3Q6IHRydWUsXG4gICAgbm9VbmNoZWNrZWRJbmRleGVkQWNjZXNzOiB0cnVlLCAvLyBmb3IgQHR5cGVzY3JpcHQtZXNsaW50L3ByZWZlci1udWxsaXNoLWNvYWxlc2NpbmdcbiAgICBhbGxvd1N5bnRoZXRpY0RlZmF1bHRJbXBvcnRzOiB0cnVlLCAvLyBhbGxvdyBgaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0J2BcbiAgICBlc01vZHVsZUludGVyb3A6IHRydWUsIC8vIGFsbG93IGRlZmF1bHQgaW1wb3J0IGZyb20gQ29tbW9uSlMvQU1EL1VNRCBtb2R1bGVzXG4gICAgcmVzb2x2ZUpzb25Nb2R1bGU6IHRydWUsIC8vIGFsbG93IHRvIGltcG9ydCBKU09OIGZpbGVzXG4gICAgaW1wb3J0SGVscGVyczogZmFsc2UsXG4gICAgbm9FbWl0OiB0cnVlLFxuICB9LFxuICBleGNsdWRlOiBbJ3BhY2thZ2VzLyovdGVzdC9maXh0dXJlcycsICd0ZXN0L2ZpeHR1cmVzJ10sXG4gIGluY2x1ZGU6IFtcbiAgICAnKi5jb25maWcudHMnLFxuICAgICdwYWNrYWdlcy8qLyouY29uZmlnLnRzJyxcbiAgICAncGFja2FnZXMvKi9zY3JpcHRzLyoqLyonLFxuICAgICdwYWNrYWdlcy8qL3NyYy8qKi8qJyxcbiAgICAncGFja2FnZXMvKi90ZXN0LyoqLyonLFxuICAgICdzY3JpcHRzLyoqLyonLFxuICAgICdzcmMvKiovKicsXG4gICAgJ3Rlc3QvKiovKicsXG4gIF0sXG59O1xuXG5jb25zdCBzdWJKc29uT2JqID0ge1xuICBjb21waWxlck9wdGlvbnM6IHtcbiAgICBhbHdheXNTdHJpY3Q6IHRydWUsXG4gICAgbm9VbmNoZWNrZWRJbmRleGVkQWNjZXNzOiB0cnVlLCAvLyBmb3IgQHR5cGVzY3JpcHQtZXNsaW50L3ByZWZlci1udWxsaXNoLWNvYWxlc2NpbmdcbiAgICBhbGxvd1N5bnRoZXRpY0RlZmF1bHRJbXBvcnRzOiB0cnVlLCAvLyBhbGxvdyBgaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0J2BcbiAgICBlc01vZHVsZUludGVyb3A6IHRydWUsIC8vIGFsbG93IGRlZmF1bHQgaW1wb3J0IGZyb20gQ29tbW9uSlMvQU1EL1VNRCBtb2R1bGVzXG4gICAgcmVzb2x2ZUpzb25Nb2R1bGU6IHRydWUsIC8vIGFsbG93IHRvIGltcG9ydCBKU09OIGZpbGVzXG4gICAgaW1wb3J0SGVscGVyczogZmFsc2UsXG4gICAgbm9FbWl0OiB0cnVlLFxuICB9LFxuICBleGNsdWRlOiBbJ3Rlc3QvZml4dHVyZXMnXSxcbiAgLy8gd2JmeSBnZW5lcmF0ZXMgcm9vdC1sZXZlbCB0b29sIGNvbmZpZ3Mgc3VjaCBhcyBwbGF5d3JpZ2h0LmNvbmZpZy50cywgYW5kXG4gIC8vIHR5cGUtYXdhcmUgbGludGluZyBuZWVkcyB0aG9zZSBmaWxlcyBpbiB0aGUgcHJvamVjdCB0byBzZWUgTm9kZS9CdW4gZ2xvYmFscy5cbiAgaW5jbHVkZTogWycqLmNvbmZpZy50cycsICdzY3JpcHRzLyoqLyonLCAnc3JjLyoqLyonLCAndGVzdC8qKi8qJ10sXG59O1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVUc2NvbmZpZyhjb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdnZW5lcmF0ZVRzY29uZmlnJywgYXN5bmMgKCkgPT4ge1xuICAgIGlmIChjb25maWcuZGVwZW5kaW5nLmJsaXR6IHx8IGNvbmZpZy5kZXBlbmRpbmcubmV4dCkge1xuICAgICAgYXdhaXQgY2xlYW51cExlZ2FjeVRzY29uZmlnTW9kdWxlU2V0dGluZ3MoY29uZmlnKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBsZXQgbmV3U2V0dGluZ3MgPSBzdHJ1Y3R1cmVkQ2xvbmUoY29uZmlnLmlzUm9vdCA/IHJvb3RKc29uT2JqIDogc3ViSnNvbk9iaikgYXMgVHNDb25maWdKc29uO1xuICAgIGNvbnN0IGdlbmVyYXRlZFR5cGVzID0gZ2V0R2VuZXJhdGVkVHlwZXMoY29uZmlnKTtcbiAgICBuZXdTZXR0aW5ncy5leHRlbmRzID0gZ2V0VHNjb25maWdFeHRlbmRzKGNvbmZpZyk7XG4gICAgbmV3U2V0dGluZ3MuY29tcGlsZXJPcHRpb25zID8/PSB7fTtcbiAgICBuZXdTZXR0aW5ncy5jb21waWxlck9wdGlvbnMucm9vdERpciA9IGdldFJvb3REaXIoY29uZmlnKTtcbiAgICBpZiAoZ2VuZXJhdGVkVHlwZXMubGVuZ3RoID4gMCkge1xuICAgICAgbmV3U2V0dGluZ3MuY29tcGlsZXJPcHRpb25zID0geyAuLi5uZXdTZXR0aW5ncy5jb21waWxlck9wdGlvbnMsIHR5cGVzOiBnZW5lcmF0ZWRUeXBlcyB9O1xuICAgIH1cbiAgICBpZiAoIWNvbmZpZy5kb2VzQ29udGFpbkpzeE9yVHN4ICYmICFjb25maWcuZG9lc0NvbnRhaW5Kc3hPclRzeEluUGFja2FnZXMpIHtcbiAgICAgIGRlbGV0ZSBuZXdTZXR0aW5ncy5jb21waWxlck9wdGlvbnM/LmpzeDtcbiAgICB9IGVsc2UgaWYgKCFjb25maWcuaXNCdW4gJiYgIWNvbmZpZy5kZXBlbmRpbmcucmVhY3ROYXRpdmUpIHtcbiAgICAgIG5ld1NldHRpbmdzLmNvbXBpbGVyT3B0aW9ucyA9IHsgLi4ubmV3U2V0dGluZ3MuY29tcGlsZXJPcHRpb25zLCBqc3g6ICdyZWFjdC1qc3gnIH07XG4gICAgfVxuICAgIGlmIChjb25maWcuaXNSb290ICYmICFjb25maWcuZG9lc0NvbnRhaW5TdWJQYWNrYWdlSnNvbnMpIHtcbiAgICAgIG5ld1NldHRpbmdzLmluY2x1ZGUgPSBuZXdTZXR0aW5ncy5pbmNsdWRlPy5maWx0ZXIoKGRpclBhdGg6IHN0cmluZykgPT4gIWRpclBhdGguc3RhcnRzV2l0aCgncGFja2FnZXMvKi8nKSk7XG4gICAgICBuZXdTZXR0aW5ncy5leGNsdWRlID0gbmV3U2V0dGluZ3MuZXhjbHVkZT8uZmlsdGVyKChkaXJQYXRoOiBzdHJpbmcpID0+ICFkaXJQYXRoLnN0YXJ0c1dpdGgoJ3BhY2thZ2VzLyovJykpO1xuICAgIH1cbiAgICBpZiAoY29uZmlnLmRlcGVuZGluZy5wcmlzbWEpIHtcbiAgICAgIC8vIFByaXNtYSBzZWVkcyBhbmQgbWlncmF0aW9uIGhlbHBlciBzY3JpcHRzIG9mdGVuIGxpdmUgb3V0c2lkZSBzcmMsIGJ1dFxuICAgICAgLy8gdHlwZS1hd2FyZSBsaW50aW5nIHN0aWxsIG5lZWRzIHRoZW0gY292ZXJlZCBieSB0aGUgcHJvamVjdCBjb25maWcuXG4gICAgICBhZGRJbmNsdWRlUGF0aChuZXdTZXR0aW5ncywgJ3ByaXNtYS8qKi8qJyk7XG4gICAgfVxuXG4gICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICd0c2NvbmZpZy5qc29uJyk7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGV4aXN0aW5nQ29udGVudCA9IGF3YWl0IGZzLnByb21pc2VzLnJlYWRGaWxlKGZpbGVQYXRoLCAndXRmOCcpO1xuICAgICAgY29uc3Qgb2xkU2V0dGluZ3MgPSBKU09OLnBhcnNlKGV4aXN0aW5nQ29udGVudCkgYXMgVHNDb25maWdKc29uO1xuICAgICAgY29uc3QgZXhpc3RpbmdUeXBlcyA9IG5vcm1hbGl6ZVN0cmluZ0FycmF5KG9sZFNldHRpbmdzLmNvbXBpbGVyT3B0aW9ucz8udHlwZXMpO1xuICAgICAgY29uc3QgZXhpc3RpbmdFbWl0TWV0YWRhdGEgPSBwaWNrRXhpc3RpbmdFbWl0TWV0YWRhdGEob2xkU2V0dGluZ3MuY29tcGlsZXJPcHRpb25zKTtcbiAgICAgIG5ld1NldHRpbmdzLmV4dGVuZHMgPSBtZXJnZVRzY29uZmlnRXh0ZW5kcyhuZXdTZXR0aW5ncy5leHRlbmRzLCBvbGRTZXR0aW5ncy5leHRlbmRzKTtcbiAgICAgIGRlbGV0ZSBvbGRTZXR0aW5ncy5leHRlbmRzO1xuICAgICAgZGVsZXRlIG9sZFNldHRpbmdzLmNvbXBpbGVyT3B0aW9ucz8uanN4O1xuICAgICAgbmV3U2V0dGluZ3MgPSBtZXJnZS5hbGwoW25ld1NldHRpbmdzLCBvbGRTZXR0aW5ncywgbmV3U2V0dGluZ3NdLCB7IGFycmF5TWVyZ2U6IGNvbWJpbmVNZXJnZSB9KTtcbiAgICAgIG5ld1NldHRpbmdzLmluY2x1ZGUgPSBuZXdTZXR0aW5ncy5pbmNsdWRlPy5maWx0ZXIoXG4gICAgICAgIChkaXJQYXRoOiBzdHJpbmcpID0+XG4gICAgICAgICAgIWRpclBhdGguaW5jbHVkZXMoJ0B0eXBlcycpICYmICFkaXJQYXRoLmluY2x1ZGVzKCdfX3Rlc3RzX18vJykgJiYgIWRpclBhdGguaW5jbHVkZXMoJ3Rlc3RzLycpXG4gICAgICApO1xuICAgICAgbmV3U2V0dGluZ3MuY29tcGlsZXJPcHRpb25zID8/PSB7fTtcbiAgICAgIC8vIHdiZnktZ2VuZXJhdGVkIHRzY29uZmlnLmpzb24gaXMgYSBsaW50L3R5cGVjaGVjayBwcm9qZWN0LCBub3QgdGhlIGVtaXRcbiAgICAgIC8vIGNvbnRyYWN0LiBJdCBtdXN0IGtlZXAgcm9vdERpciBicm9hZCBlbm91Z2ggZm9yIHJvb3QgY29uZmlnIGZpbGVzLFxuICAgICAgLy8gc2NyaXB0cywgc3JjLCBhbmQgdGVzdHMuIGJ1aWxkLXRzIG93bnMgZW1pdCBhbmQgY3JlYXRlcyBhIHRlbXBvcmFyeVxuICAgICAgLy8gc3JjLW9ubHkgdHNjb25maWcgd2l0aCBub0VtaXQ9ZmFsc2UsIGVtaXREZWNsYXJhdGlvbk9ubHk9dHJ1ZSxcbiAgICAgIC8vIHJvb3REaXI9XCJzcmNcIiwgYW5kIGluY2x1ZGU9W1wic3JjLyoqLypcIl0sIHNvIHByZXNlcnZpbmcgbm9FbWl0PWZhbHNlIG9yXG4gICAgICAvLyByb290RGlyPVwic3JjXCIgaGVyZSB3b3VsZCBvbmx5IGJyZWFrIG5vbi1zcmMgdHlwZS1hd2FyZSBsaW50IGNvdmVyYWdlLlxuICAgICAgbmV3U2V0dGluZ3MuY29tcGlsZXJPcHRpb25zID0geyAuLi5uZXdTZXR0aW5ncy5jb21waWxlck9wdGlvbnMsIC4uLmV4aXN0aW5nRW1pdE1ldGFkYXRhIH07XG4gICAgICBlbnN1cmVUc0V4dGVuc2lvbkVtaXRDb21wYXRpYmlsaXR5KG5ld1NldHRpbmdzLmNvbXBpbGVyT3B0aW9ucyk7XG5cbiAgICAgIGNvbnN0IG1lcmdlZFR5cGVzID0gWy4uLm5ldyBTZXQoWy4uLmZpbHRlckV4aXN0aW5nVHlwZXMoZXhpc3RpbmdUeXBlcywgZ2VuZXJhdGVkVHlwZXMpLCAuLi5nZW5lcmF0ZWRUeXBlc10pXTtcbiAgICAgIGlmIChtZXJnZWRUeXBlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgIG5ld1NldHRpbmdzLmNvbXBpbGVyT3B0aW9ucy50eXBlcyA9IG1lcmdlZFR5cGVzO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZGVsZXRlIG5ld1NldHRpbmdzLmNvbXBpbGVyT3B0aW9ucy50eXBlcztcbiAgICAgIH1cbiAgICAgIGlmIChzaG91bGREZWxldGVUeXBlUm9vdHMoZ2VuZXJhdGVkVHlwZXMpKSB7XG4gICAgICAgIGRlbGV0ZSBuZXdTZXR0aW5ncy5jb21waWxlck9wdGlvbnMudHlwZVJvb3RzO1xuICAgICAgfVxuICAgIH0gY2F0Y2gge1xuICAgICAgLy8gZG8gbm90aGluZ1xuICAgIH1cbiAgICBzb3J0S2V5cyhuZXdTZXR0aW5ncyk7XG4gICAgbmV3U2V0dGluZ3MuaW5jbHVkZT8uc29ydCgpO1xuICAgIC8vIERvbid0IHVzZSBvbGQgZGVjb3JhdG9yXG4gICAgZGVsZXRlIG5ld1NldHRpbmdzLmNvbXBpbGVyT3B0aW9ucz8uZXhwZXJpbWVudGFsRGVjb3JhdG9ycztcbiAgICAvLyBQYWNrYWdlIGltcG9ydHMgc2hvdWxkIHJlc29sdmUgdGhyb3VnaCBwYWNrYWdlIGV4cG9ydHMgaW5zdGVhZCBvZiBiYXNlVXJsLlxuICAgIC8vIHBhdGhzIGlzIGludGVudGlvbmFsbHkgcHJlc2VydmVkIHNvIHJlcG8tbG9jYWwgdG9vbGluZyBjYW4ga2VlcCBleHBsaWNpdFxuICAgIC8vIGFsaWFzZXMgd2l0aG91dCByZWx5aW5nIG9uIGJhc2VVcmwncyBicm9hZCBmYWxsYmFjayByZXNvbHV0aW9uLlxuICAgIGRlbGV0ZSBuZXdTZXR0aW5ncy5jb21waWxlck9wdGlvbnM/LmJhc2VVcmw7XG4gICAgZGVsZXRlTGVnYWN5TW9kdWxlU2V0dGluZ3MobmV3U2V0dGluZ3MuY29tcGlsZXJPcHRpb25zLCBjb25maWcpO1xuICAgIG5vcm1hbGl6ZUNvbW1vbkpzVHNjb25maWdTZXR0aW5ncyhuZXdTZXR0aW5ncy5jb21waWxlck9wdGlvbnMsIGNvbmZpZyk7XG4gICAgaWYgKGNvbmZpZy5kZXBlbmRpbmcucmVhY3ROYXRpdmUpIHtcbiAgICAgIGRlbGV0ZSBuZXdTZXR0aW5ncy5jb21waWxlck9wdGlvbnM/LnZlcmJhdGltTW9kdWxlU3ludGF4O1xuICAgIH1cbiAgICBjb25zdCBuZXdDb250ZW50ID0gSlNPTi5zdHJpbmdpZnkobmV3U2V0dGluZ3MsIHVuZGVmaW5lZCwgMik7XG4gICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzVXRpbC5nZW5lcmF0ZUZpbGUoZmlsZVBhdGgsIG5ld0NvbnRlbnQpKTtcbiAgfSk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGNsZWFudXBMZWdhY3lUc2NvbmZpZ01vZHVsZVNldHRpbmdzKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBmaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJ3RzY29uZmlnLmpzb24nKTtcbiAgdHJ5IHtcbiAgICBjb25zdCBzZXR0aW5ncyA9IEpTT04ucGFyc2UoYXdhaXQgZnMucHJvbWlzZXMucmVhZEZpbGUoZmlsZVBhdGgsICd1dGY4JykpIGFzIFRzQ29uZmlnSnNvbjtcbiAgICBub3JtYWxpemVOZXh0VHNjb25maWdNb2R1bGVTZXR0aW5ncyhzZXR0aW5ncy5jb21waWxlck9wdGlvbnMpO1xuICAgIG5vcm1hbGl6ZU5leHRUc2NvbmZpZ1BhdGhBbGlhc2VzKHNldHRpbmdzLmNvbXBpbGVyT3B0aW9ucyk7XG4gICAgYWRkU2NyaXB0c0luY2x1ZGVGb3JGcmFtZXdvcmtQcm9qZWN0KHNldHRpbmdzKTtcbiAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnNVdGlsLmdlbmVyYXRlRmlsZShmaWxlUGF0aCwgSlNPTi5zdHJpbmdpZnkoc2V0dGluZ3MsIHVuZGVmaW5lZCwgMikpKTtcbiAgfSBjYXRjaCB7XG4gICAgLy8gTmV4dC9CbGl0eiBvd24gdGhlaXIgdHNjb25maWcgc2hhcGUsIGJ1dCBUeXBlU2NyaXB0IDYgbm8gbG9uZ2VyIGFjY2VwdHNcbiAgICAvLyBub2RlMTAgcmVzb2x2ZXIgc3BlbGxpbmdzIHRoYXQgb2xkZXIgcHJvamVjdHMgY29tbW9ubHkgaW5oZXJpdGVkLlxuICB9XG59XG5cbmZ1bmN0aW9uIGFkZFNjcmlwdHNJbmNsdWRlRm9yRnJhbWV3b3JrUHJvamVjdChzZXR0aW5nczogVHNDb25maWdKc29uKTogdm9pZCB7XG4gIC8vIE9taXR0aW5nIGluY2x1ZGUgbGV0cyBmcmFtZXdvcmsgdHNjb25maWdzIGtlZXAgVHlwZVNjcmlwdCdzIGRlZmF1bHRcbiAgLy8gXCJhbGwgVFMvVFNYIGZpbGVzXCIgYmVoYXZpb3IsIHdoaWNoIGFscmVhZHkgY292ZXJzIHNjcmlwdHMuXG4gIGlmICghc2V0dGluZ3MuaW5jbHVkZSkgcmV0dXJuO1xuICBpZiAoc2V0dGluZ3MuaW5jbHVkZS5pbmNsdWRlcygnc2NyaXB0cy8qKi8qJykpIHJldHVybjtcblxuICBzZXR0aW5ncy5pbmNsdWRlLnB1c2goJ3NjcmlwdHMvKiovKicpO1xuICBzZXR0aW5ncy5pbmNsdWRlLnNvcnQoKTtcbn1cblxuZnVuY3Rpb24gbm9ybWFsaXplTmV4dFRzY29uZmlnTW9kdWxlU2V0dGluZ3MoY29tcGlsZXJPcHRpb25zOiBUc0NvbmZpZ0pzb24uQ29tcGlsZXJPcHRpb25zIHwgdW5kZWZpbmVkKTogdm9pZCB7XG4gIGlmICghY29tcGlsZXJPcHRpb25zKSByZXR1cm47XG4gIGlmIChcbiAgICBjb21waWxlck9wdGlvbnMubW9kdWxlUmVzb2x1dGlvbiA9PT0gJ25vZGUnIHx8XG4gICAgY29tcGlsZXJPcHRpb25zLm1vZHVsZVJlc29sdXRpb24gPT09ICdOb2RlJyB8fFxuICAgIGNvbXBpbGVyT3B0aW9ucy5tb2R1bGVSZXNvbHV0aW9uID09PSAnbm9kZTEwJyB8fFxuICAgIGNvbXBpbGVyT3B0aW9ucy5tb2R1bGVSZXNvbHV0aW9uID09PSB1bmRlZmluZWRcbiAgKSB7XG4gICAgLy8gTmV4dC5qcyB3cml0ZXMgXCJub2RlXCIgZHVyaW5nIGJ1aWxkIHdoZW4gdGhpcyBvcHRpb24gaXMgbWlzc2luZywgYnV0XG4gICAgLy8gdHNnb2xpbnQgdHJlYXRzIHRoYXQgc3BlbGxpbmcgYXMgdGhlIHJlbW92ZWQgbm9kZTEwIHJlc29sdmVyLlxuICAgIGNvbXBpbGVyT3B0aW9ucy5tb2R1bGVSZXNvbHV0aW9uID0gJ2J1bmRsZXInO1xuICB9XG59XG5cbmZ1bmN0aW9uIG5vcm1hbGl6ZU5leHRUc2NvbmZpZ1BhdGhBbGlhc2VzKGNvbXBpbGVyT3B0aW9uczogVHNDb25maWdKc29uLkNvbXBpbGVyT3B0aW9ucyB8IHVuZGVmaW5lZCk6IHZvaWQge1xuICBpZiAoIWNvbXBpbGVyT3B0aW9ucykgcmV0dXJuO1xuXG4gIC8vIHRzZ29saW50IGZvbGxvd3MgVHlwZVNjcmlwdCA2IHZhbGlkYXRpb24sIHdoZXJlIGJhc2VVcmwgaXMgcmVtb3ZlZCBhbmRcbiAgLy8gcGF0aCB0YXJnZXRzIG11c3QgYmUgZXhwbGljaXRseSByZWxhdGl2ZS4gTmV4dC5qcyBzdGlsbCBhY2NlcHRzIHRoZSBhbGlhc1xuICAvLyBzaGFwZSBhZnRlciBlYWNoIHRhcmdldCBpcyB3cml0dGVuIHdpdGggYSBsZWFkaW5nIC4vLlxuICBkZWxldGUgY29tcGlsZXJPcHRpb25zLmJhc2VVcmw7XG4gIGlmICghY29tcGlsZXJPcHRpb25zLnBhdGhzKSByZXR1cm47XG5cbiAgZm9yIChjb25zdCBbYWxpYXMsIHRhcmdldHNdIG9mIE9iamVjdC5lbnRyaWVzKGNvbXBpbGVyT3B0aW9ucy5wYXRocykpIHtcbiAgICBjb21waWxlck9wdGlvbnMucGF0aHNbYWxpYXNdID0gbm9ybWFsaXplUGF0aEFsaWFzVGFyZ2V0cyh0YXJnZXRzKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBub3JtYWxpemVQYXRoQWxpYXNUYXJnZXRzKHRhcmdldHM6IHN0cmluZ1tdKTogc3RyaW5nW10ge1xuICByZXR1cm4gdGFyZ2V0cy5tYXAoKHRhcmdldCkgPT4ge1xuICAgIGlmICh0YXJnZXQuc3RhcnRzV2l0aCgnLi8nKSB8fCB0YXJnZXQuc3RhcnRzV2l0aCgnLi4vJykgfHwgcGF0aC5pc0Fic29sdXRlKHRhcmdldCkpIHJldHVybiB0YXJnZXQ7XG4gICAgcmV0dXJuIGAuLyR7dGFyZ2V0fWA7XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBnZXRSb290RGlyKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IHN0cmluZyB7XG4gIGlmIChjb25maWcuaXNSb290KSByZXR1cm4gJy4nO1xuICByZXR1cm4gZnMuZXhpc3RzU3luYyhwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICcuLicsICcuLicsICdwYWNrYWdlLmpzb24nKSkgPyAnLi4vLi4nIDogJy4nO1xufVxuXG5mdW5jdGlvbiBtZXJnZVRzY29uZmlnRXh0ZW5kcyhcbiAgZ2VuZXJhdGVkRXh0ZW5kczogVHNDb25maWdKc29uWydleHRlbmRzJ10sXG4gIGV4aXN0aW5nRXh0ZW5kczogVHNDb25maWdKc29uWydleHRlbmRzJ11cbik6IFRzQ29uZmlnSnNvblsnZXh0ZW5kcyddIHtcbiAgY29uc3QgbWVyZ2VkRXh0ZW5kcyA9IFsuLi5ub3JtYWxpemVFeHRlbmRzKGdlbmVyYXRlZEV4dGVuZHMpLCAuLi5ub3JtYWxpemVFeHRlbmRzKGV4aXN0aW5nRXh0ZW5kcyldO1xuICBjb25zdCB1bmlxdWVFeHRlbmRzID0gWy4uLm5ldyBTZXQobWVyZ2VkRXh0ZW5kcyldO1xuICBpZiAodW5pcXVlRXh0ZW5kcy5sZW5ndGggPT09IDApIHJldHVybiB1bmRlZmluZWQ7XG4gIGlmICh1bmlxdWVFeHRlbmRzLmxlbmd0aCA9PT0gMSkgcmV0dXJuIHVuaXF1ZUV4dGVuZHNbMF07XG4gIHJldHVybiB1bmlxdWVFeHRlbmRzO1xufVxuXG5mdW5jdGlvbiBhZGRJbmNsdWRlUGF0aChzZXR0aW5nczogVHNDb25maWdKc29uLCBkaXJQYXRoOiBzdHJpbmcpOiB2b2lkIHtcbiAgc2V0dGluZ3MuaW5jbHVkZSA/Pz0gW107XG4gIGlmICghc2V0dGluZ3MuaW5jbHVkZS5pbmNsdWRlcyhkaXJQYXRoKSkge1xuICAgIHNldHRpbmdzLmluY2x1ZGUucHVzaChkaXJQYXRoKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBub3JtYWxpemVFeHRlbmRzKHZhbHVlOiBUc0NvbmZpZ0pzb25bJ2V4dGVuZHMnXSk6IHN0cmluZ1tdIHtcbiAgaWYgKCF2YWx1ZSkgcmV0dXJuIFtdO1xuICByZXR1cm4gQXJyYXkuaXNBcnJheSh2YWx1ZSkgPyB2YWx1ZSA6IFt2YWx1ZV07XG59XG5cbmZ1bmN0aW9uIG5vcm1hbGl6ZVN0cmluZ0FycmF5KHZhbHVlOiB1bmtub3duKTogc3RyaW5nW10ge1xuICBpZiAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJykgcmV0dXJuIFt2YWx1ZV07XG4gIGlmICghQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHJldHVybiBbXTtcbiAgcmV0dXJuIHZhbHVlLmZpbHRlcigoaXRlbSk6IGl0ZW0gaXMgc3RyaW5nID0+IHR5cGVvZiBpdGVtID09PSAnc3RyaW5nJyk7XG59XG5cbmZ1bmN0aW9uIHNob3VsZERlbGV0ZVR5cGVSb290cyh0eXBlTmFtZXM6IHN0cmluZ1tdKTogYm9vbGVhbiB7XG4gIC8vIE9ubHkgZ2VuZXJhdGVkIHBhY2thZ2Utb3duZWQgdGVzdCB0eXBlcyBzaG91bGQgdHJpZ2dlciB0aGlzLiBVc2VyLWRlZmluZWQgc2xhc2gtYmFzZWRcbiAgLy8gZW50cmllcyBtYXkgaW50ZW50aW9uYWxseSByZWx5IG9uIGN1c3RvbSB0eXBlUm9vdHMgYW5kIHNob3VsZCBiZSBwcmVzZXJ2ZWQgYXMtaXMuXG4gIHJldHVybiB0eXBlTmFtZXMuc29tZSgodHlwZU5hbWUpID0+IHR5cGVOYW1lID09PSAnY3lwcmVzcycgfHwgdHlwZU5hbWUuaW5jbHVkZXMoJy8nKSk7XG59XG5cbmZ1bmN0aW9uIGZpbHRlckV4aXN0aW5nVHlwZXMoZXhpc3RpbmdUeXBlczogc3RyaW5nW10sIGdlbmVyYXRlZFR5cGVzOiBzdHJpbmdbXSk6IHN0cmluZ1tdIHtcbiAgY29uc3QgZ2VuZXJhdGVkVHlwZVNldCA9IG5ldyBTZXQoZ2VuZXJhdGVkVHlwZXMpO1xuICByZXR1cm4gZXhpc3RpbmdUeXBlcy5maWx0ZXIoKHR5cGVOYW1lKSA9PiB7XG4gICAgLy8gd2JmeSBvd25zIHRoZXNlIHBhY2thZ2UtcHJvdmlkZWQgdGVzdCBnbG9iYWxzLiBEcm9wIHN0YWxlIGVudHJpZXMgd2hlbiB0aGVcbiAgICAvLyBjb3JyZXNwb25kaW5nIGRlcGVuZGVuY3kgaXMgbm8gbG9uZ2VyIHByZXNlbnQgc28gVHlwZVNjcmlwdCB3b24ndCByZXF1aXJlXG4gICAgLy8gbWlzc2luZyBwYWNrYWdlcyBzdWNoIGFzIHZpdGVzdC5cbiAgICBpZiAoaXNHZW5lcmF0ZWRUZXN0R2xvYmFsVHlwZSh0eXBlTmFtZSkgJiYgIWdlbmVyYXRlZFR5cGVTZXQuaGFzKHR5cGVOYW1lKSkgcmV0dXJuIGZhbHNlO1xuICAgIHJldHVybiB0cnVlO1xuICB9KTtcbn1cblxuZnVuY3Rpb24gaXNHZW5lcmF0ZWRUZXN0R2xvYmFsVHlwZSh0eXBlTmFtZTogc3RyaW5nKTogYm9vbGVhbiB7XG4gIHJldHVybiB0eXBlTmFtZSA9PT0gJ2N5cHJlc3MnIHx8IHR5cGVOYW1lID09PSAnamVzdCcgfHwgdHlwZU5hbWUgPT09ICdtb2NoYScgfHwgdHlwZU5hbWUgPT09ICd2aXRlc3QvZ2xvYmFscyc7XG59XG5cbmZ1bmN0aW9uIGVuc3VyZVRzRXh0ZW5zaW9uRW1pdENvbXBhdGliaWxpdHkoY29tcGlsZXJPcHRpb25zOiBUc0NvbmZpZ0pzb24uQ29tcGlsZXJPcHRpb25zIHwgdW5kZWZpbmVkKTogdm9pZCB7XG4gIGlmICghY29tcGlsZXJPcHRpb25zKSByZXR1cm47XG4gIGlmIChjb21waWxlck9wdGlvbnMubm9FbWl0ICE9PSBmYWxzZSB8fCBjb21waWxlck9wdGlvbnMuZW1pdERlY2xhcmF0aW9uT25seSA9PT0gdHJ1ZSkgcmV0dXJuO1xuXG4gIC8vIEB0c2NvbmZpZy9idW4gZW5hYmxlcyBhbGxvd0ltcG9ydGluZ1RzRXh0ZW5zaW9ucywgd2hpY2ggVHlwZVNjcmlwdCBwZXJtaXRzXG4gIC8vIGR1cmluZyBlbWl0IG9ubHkgd2hlbiByZWxhdGl2ZSBUUyBleHRlbnNpb25zIGFyZSByZXdyaXR0ZW4uXG4gIGNvbXBpbGVyT3B0aW9ucy5yZXdyaXRlUmVsYXRpdmVJbXBvcnRFeHRlbnNpb25zID0gdHJ1ZTtcbn1cblxuZnVuY3Rpb24gZGVsZXRlTGVnYWN5TW9kdWxlU2V0dGluZ3MoXG4gIGNvbXBpbGVyT3B0aW9uczogVHNDb25maWdKc29uLkNvbXBpbGVyT3B0aW9ucyB8IHVuZGVmaW5lZCxcbiAgY29uZmlnOiBQYWNrYWdlQ29uZmlnXG4pOiB2b2lkIHtcbiAgaWYgKCFjb21waWxlck9wdGlvbnMpIHJldHVybjtcblxuICAvLyBUeXBlU2NyaXB0IDYgcmVtb3ZlZCB0aGUgb2xkIG5vZGUxMCByZXNvbHZlciBzcGVsbGluZywgc28gaW5oZXJpdGVkIGJhc2UgY29uZmlnc1xuICAvLyBzaG91bGQgY2hvb3NlIHRoZSByZXNvbHZlciB1bmxlc3MgYSBwcm9qZWN0IGFscmVhZHkgb3B0ZWQgaW50byBhIG1vZGVybiBvbmUuXG4gIGlmIChcbiAgICBjb21waWxlck9wdGlvbnMubW9kdWxlUmVzb2x1dGlvbiA9PT0gJ25vZGUnIHx8XG4gICAgY29tcGlsZXJPcHRpb25zLm1vZHVsZVJlc29sdXRpb24gPT09ICdOb2RlJyB8fFxuICAgIGNvbXBpbGVyT3B0aW9ucy5tb2R1bGVSZXNvbHV0aW9uID09PSAnbm9kZTEwJ1xuICApIHtcbiAgICBkZWxldGUgY29tcGlsZXJPcHRpb25zLm1vZHVsZVJlc29sdXRpb247XG4gIH1cbiAgaWYgKGNvbmZpZy5pc0J1biB8fCBjb25maWcuZGVwZW5kaW5nLnJlYWN0TmF0aXZlIHx8IGNvbXBpbGVyT3B0aW9ucy5tb2R1bGUgIT09ICdFU05leHQnKSByZXR1cm47XG5cbiAgLy8gTm9kZSBiYXNlIGNvbmZpZ3Mgbm93IHBhaXIgdGhlaXIgcmVzb2x2ZXIgd2l0aCBhIG1hdGNoaW5nIG1vZHVsZSBraW5kLiBLZWVwaW5nXG4gIC8vIG9sZGVyIEVTTmV4dCBvdmVycmlkZXMgY3JlYXRlcyBpbnZhbGlkIGdlbmVyYXRlZCBjb25maWdzIGZvciBUUyA2LlxuICBkZWxldGUgY29tcGlsZXJPcHRpb25zLm1vZHVsZTtcbn1cblxuZnVuY3Rpb24gbm9ybWFsaXplQ29tbW9uSnNUc2NvbmZpZ1NldHRpbmdzKFxuICBjb21waWxlck9wdGlvbnM6IFRzQ29uZmlnSnNvbi5Db21waWxlck9wdGlvbnMgfCB1bmRlZmluZWQsXG4gIGNvbmZpZzogUGFja2FnZUNvbmZpZ1xuKTogdm9pZCB7XG4gIGlmICghY29tcGlsZXJPcHRpb25zIHx8IGNvbmZpZy5pc0J1biB8fCBjb25maWcuZGVwZW5kaW5nLnJlYWN0TmF0aXZlIHx8IGNvbmZpZy5pc0VzbVBhY2thZ2UpIHJldHVybjtcblxuICBpZiAoY29tcGlsZXJPcHRpb25zLm1vZHVsZT8udG9Mb3dlckNhc2UoKSA9PT0gJ2NvbW1vbmpzJykge1xuICAgIC8vIEB0c2NvbmZpZy9ub2RlLWx0cyBub3cgcHJvdmlkZXMgbW9kdWxlUmVzb2x1dGlvbj1ub2RlMTYuIFR5cGVTY3JpcHQgcmVxdWlyZXNcbiAgICAvLyB0aGUgbW9kdWxlIGtpbmQgdG8gbW92ZSB3aXRoIHRoYXQgcmVzb2x2ZXIsIHdoaWxlIHZlcmJhdGltTW9kdWxlU3ludGF4PWZhbHNlXG4gICAgLy8gcHJlc2VydmVzIHRoZSBsb25nLXN0YW5kaW5nIENvbW1vbkpTIGVtaXQgc2hhcGUgZm9yIGV4aXN0aW5nIHBhY2thZ2VzLlxuICAgIGNvbXBpbGVyT3B0aW9ucy5tb2R1bGUgPSAnTm9kZTE2JztcbiAgfVxuICBjb21waWxlck9wdGlvbnMudmVyYmF0aW1Nb2R1bGVTeW50YXggPSBmYWxzZTtcbn1cblxuZnVuY3Rpb24gcGlja0V4aXN0aW5nRW1pdE1ldGFkYXRhKFxuICBjb21waWxlck9wdGlvbnM6IFRzQ29uZmlnSnNvblsnY29tcGlsZXJPcHRpb25zJ11cbik6IFBpY2s8Tm9uTnVsbGFibGU8VHNDb25maWdKc29uWydjb21waWxlck9wdGlvbnMnXT4sICdkZWNsYXJhdGlvbicgfCAnZGVjbGFyYXRpb25NYXAnIHwgJ3NvdXJjZU1hcCc+IHtcbiAgY29uc3QgZW1pdE9wdGlvbnMgPSB7fSBhcyBQaWNrPFxuICAgIE5vbk51bGxhYmxlPFRzQ29uZmlnSnNvblsnY29tcGlsZXJPcHRpb25zJ10+LFxuICAgICdkZWNsYXJhdGlvbicgfCAnZGVjbGFyYXRpb25NYXAnIHwgJ3NvdXJjZU1hcCdcbiAgPjtcbiAgZm9yIChjb25zdCBrZXkgb2YgWydkZWNsYXJhdGlvbicsICdkZWNsYXJhdGlvbk1hcCcsICdzb3VyY2VNYXAnXSBhcyBjb25zdCkge1xuICAgIGNvbnN0IHZhbHVlID0gY29tcGlsZXJPcHRpb25zPy5ba2V5XTtcbiAgICBpZiAodmFsdWUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgZW1pdE9wdGlvbnNba2V5XSA9IHZhbHVlIGFzIG5ldmVyO1xuICAgIH1cbiAgfVxuICByZXR1cm4gZW1pdE9wdGlvbnM7XG59XG5cbmZ1bmN0aW9uIGdldEdlbmVyYXRlZFR5cGVzKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IHN0cmluZ1tdIHtcbiAgY29uc3QgdHlwZU5hbWVzID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gIGNvbnN0IGRlcGVuZGVuY2llcyA9IHtcbiAgICAuLi5jb25maWcucGFja2FnZUpzb24/LmRlcGVuZGVuY2llcyxcbiAgICAuLi5jb25maWcucGFja2FnZUpzb24/LmRldkRlcGVuZGVuY2llcyxcbiAgfTtcblxuICBpZiAoY29uZmlnLmlzQnVuKSB7XG4gICAgdHlwZU5hbWVzLmFkZCgnYnVuJyk7XG4gIH0gZWxzZSBpZiAoIWNvbmZpZy5kZXBlbmRpbmcucmVhY3ROYXRpdmUpIHtcbiAgICB0eXBlTmFtZXMuYWRkKCdub2RlJyk7XG4gIH1cbiAgaWYgKFxuICAgIGRlcGVuZGVuY2llcy5qZXN0IHx8XG4gICAgZGVwZW5kZW5jaWVzWydAamVzdC9nbG9iYWxzJ10gfHxcbiAgICBkZXBlbmRlbmNpZXNbJ2plc3QtZW52aXJvbm1lbnQtanNkb20nXSB8fFxuICAgIGRlcGVuZGVuY2llc1sndHMtamVzdCddXG4gICkge1xuICAgIHR5cGVOYW1lcy5hZGQoJ2plc3QnKTtcbiAgfVxuICBpZiAoZGVwZW5kZW5jaWVzLnZpdGVzdCkge1xuICAgIHR5cGVOYW1lcy5hZGQoJ3ZpdGVzdC9nbG9iYWxzJyk7XG4gIH1cbiAgaWYgKGRlcGVuZGVuY2llcy5tb2NoYSkge1xuICAgIHR5cGVOYW1lcy5hZGQoJ21vY2hhJyk7XG4gIH1cbiAgaWYgKGRlcGVuZGVuY2llcy5jeXByZXNzKSB7XG4gICAgdHlwZU5hbWVzLmFkZCgnY3lwcmVzcycpO1xuICB9XG5cbiAgcmV0dXJuIFsuLi50eXBlTmFtZXNdO1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IG1lcmdlIGZyb20gJ2RlZXBtZXJnZSc7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGZzVXRpbCB9IGZyb20gJy4uL3V0aWxzL2ZzVXRpbC5qcyc7XG5pbXBvcnQgeyBzb3J0S2V5cyB9IGZyb20gJy4uL3V0aWxzL29iamVjdFV0aWwuanMnO1xuaW1wb3J0IHsgcHJvbWlzZVBvb2wgfSBmcm9tICcuLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5cbmNvbnN0IGV4Y2x1ZGVGaWxlUGF0dGVybnMgPSBbXG4gICcqKi8uZ2l0L29iamVjdHMvKionLFxuICAnKiovLmdpdC9zdWJ0cmVlLWNhY2hlLyoqJyxcbiAgJyoqL25vZGVfbW9kdWxlcy8qKicsXG4gICcqKi90bXAvKionLFxuICAnKiovdGVtcC8qKicsXG4gICcqKi9kaXN0LyoqJyxcbl07XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZW5lcmF0ZVZzY29kZVNldHRpbmdzKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2dlbmVyYXRlVnNjb2RlU2V0dGluZ3MnLCBhc3luYyAoKSA9PiB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnLnZzY29kZScsICdzZXR0aW5ncy5qc29uJyk7XG4gICAgICBjb25zdCBleGlzdGluZ0NvbnRlbnQgPSBhd2FpdCBmcy5wcm9taXNlcy5yZWFkRmlsZShmaWxlUGF0aCwgJ3V0ZjgnKTtcbiAgICAgIGxldCBzZXR0aW5ncyA9IEpTT04ucGFyc2UoZXhpc3RpbmdDb250ZW50KSBhcyBvYmplY3Q7XG4gICAgICBmb3IgKGNvbnN0IGV4Y2x1ZGVGaWxlUGF0dGVybiBvZiBleGNsdWRlRmlsZVBhdHRlcm5zKSB7XG4gICAgICAgIHNldHRpbmdzID0gbWVyZ2UuYWxsKFtzZXR0aW5ncywgZXhjbHVkZVNldHRpbmcoZXhjbHVkZUZpbGVQYXR0ZXJuKV0pO1xuICAgICAgfVxuICAgICAgaWYgKGNvbmZpZy5kb2VzQ29udGFpblBvZXRyeUxvY2sgfHwgY29uZmlnLmRvZXNDb250YWluVXZMb2NrKSB7XG4gICAgICAgIHNldHRpbmdzID0gbWVyZ2UuYWxsKFtzZXR0aW5ncywgZXhjbHVkZVNldHRpbmcoJyoqLy52ZW52LyoqJyldKTtcbiAgICAgIH1cbiAgICAgIGlmIChjb25maWcuZGVwZW5kaW5nLm5leHQpIHtcbiAgICAgICAgc2V0dGluZ3MgPSBtZXJnZS5hbGwoW3NldHRpbmdzLCBleGNsdWRlU2V0dGluZygnKiovLm5leHQvKionKV0pO1xuICAgICAgfVxuICAgICAgLy8gTExN44Gr44KI44KLdmliZSBjb2Rpbmfjgafjga/jgIHoh6rli5Xjg5Xjgqnjg7zjg57jg4Pjg4jjgoTjgrPjg7zjg4njgqLjgq/jgrfjg6fjg7PjgpLnhKHlirnljJbjgZnjgovjgZPjgajjgadcbiAgICAgIC8vIOeUn+aIkOOBleOCjOOBn+OCs+ODvOODieOBruWFg+OBruW9ouW8j+OCkue2reaMgeOBp+OBjeOCi1xuICAgICAgaWYgKCdlZGl0b3IuY29kZUFjdGlvbnNPblNhdmUnIGluIHNldHRpbmdzKSB7XG4gICAgICAgIGRlbGV0ZSBzZXR0aW5nc1snZWRpdG9yLmNvZGVBY3Rpb25zT25TYXZlJ107XG4gICAgICB9XG4gICAgICBpZiAoJ2VkaXRvci5mb3JtYXRPblNhdmUnIGluIHNldHRpbmdzKSB7XG4gICAgICAgIGRlbGV0ZSBzZXR0aW5nc1snZWRpdG9yLmZvcm1hdE9uU2F2ZSddO1xuICAgICAgfVxuICAgICAgc29ydEtleXMoc2V0dGluZ3MgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pO1xuICAgICAgY29uc3QgbmV3Q29udGVudCA9IEpTT04uc3RyaW5naWZ5KHNldHRpbmdzLCB1bmRlZmluZWQsIDIpO1xuICAgICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzVXRpbC5nZW5lcmF0ZUZpbGUoZmlsZVBhdGgsIG5ld0NvbnRlbnQpKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIGRvIG5vdGhpbmdcbiAgICB9XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBleGNsdWRlU2V0dGluZyhleGNsdWRlRmlsZVBhdHRlcm46IHN0cmluZyk6IG9iamVjdCB7XG4gIHJldHVybiB7XG4gICAgJ2ZpbGVzLndhdGNoZXJFeGNsdWRlJzoge1xuICAgICAgW2V4Y2x1ZGVGaWxlUGF0dGVybl06IHRydWUsXG4gICAgfSxcbiAgfTtcbn1cbiIsIi8vIG94bGludC1kaXNhYmxlIGVzbGludC1wbHVnaW4taW1wb3J0L25vLW5hbWVkLWFzLWRlZmF1bHQtbWVtYmVyIC0tIE5hbWVzcGFjZSBZQU1MIGNhbGxzIG1ha2UgbG9hZC9kdW1wIHVzYWdlIGNsZWFyZXIuXG5pbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgdHlwZSB7IENvbmZpZ3VyYXRpb25WYWx1ZU1hcCB9IGZyb20gJ0B5YXJucGtnL2NvcmUnO1xuaW1wb3J0IHlhbWwgZnJvbSAnanMteWFtbCc7XG5pbXBvcnQgc2VtdmVyIGZyb20gJ3NlbXZlcic7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuaW1wb3J0IHsgc3Bhd25TeW5jLCBzcGF3blN5bmNBbmRSZXR1cm5TdGRvdXQgfSBmcm9tICcuLi91dGlscy9zcGF3blV0aWwuanMnO1xuXG50eXBlIFNldHRpbmdzID0ge1xuICBhcHByb3ZlZEdpdFJlcG9zaXRvcmllcz86IHN0cmluZ1tdO1xuICBkZWZhdWx0U2VtdmVyUmFuZ2VQcmVmaXg6IHN0cmluZztcbiAgZW5hYmxlU2NyaXB0cz86IGJvb2xlYW47XG4gIG5tTW9kZTogc3RyaW5nO1xuICBub2RlTGlua2VyOiBzdHJpbmc7XG4gIG5wbU1pbmltYWxBZ2VHYXRlPzogc3RyaW5nO1xuICBucG1QcmVhcHByb3ZlZFBhY2thZ2VzPzogc3RyaW5nW107XG4gIHBsdWdpbnM/OiBQbHVnaW5bXTtcbn0gJiBQYXJ0aWFsPENvbmZpZ3VyYXRpb25WYWx1ZU1hcD47XG5cbmludGVyZmFjZSBQbHVnaW4ge1xuICBjaGVja3N1bTogc3RyaW5nO1xuICBwYXRoOiBzdHJpbmc7XG4gIHNwZWM6IHN0cmluZztcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlWWFybnJjWW1sKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2dlbmVyYXRlWWFybnJjWW1sJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IHlhcm5yY1ltbFBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICcueWFybnJjLnltbCcpO1xuICAgIGlmIChjb25maWcuaXNCdW4pIHtcbiAgICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiBmcy5wcm9taXNlcy5ybSh5YXJucmNZbWxQYXRoLCB7IGZvcmNlOiB0cnVlIH0pKTtcbiAgICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PlxuICAgICAgICBmcy5wcm9taXNlcy5ybShwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICcueWFybicpLCB7IGZvcmNlOiB0cnVlLCByZWN1cnNpdmU6IHRydWUgfSlcbiAgICAgICk7XG4gICAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT5cbiAgICAgICAgZnMucHJvbWlzZXMucm0ocGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAneWFybi5sb2NrJyksIHsgZm9yY2U6IHRydWUsIHJlY3Vyc2l2ZTogdHJ1ZSB9KVxuICAgICAgKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBjdXJyZW50VmVyc2lvbiA9IHNwYXduU3luY0FuZFJldHVyblN0ZG91dCgneWFybicsIFsnLS12ZXJzaW9uJ10sIGNvbmZpZy5kaXJQYXRoKTtcbiAgICBjb25zdCBsYXRlc3RWZXJzaW9uID0gZ2V0TGF0ZXN0VmVyc2lvbignQHlhcm5wa2cvY2xpJywgY29uZmlnLmRpclBhdGgpO1xuICAgIGlmIChpc05ld2VyVmVyc2lvbihsYXRlc3RWZXJzaW9uLCBjdXJyZW50VmVyc2lvbikpIHtcbiAgICAgIHNwYXduU3luYygneWFybicsIFsnc2V0JywgJ3ZlcnNpb24nLCBsYXRlc3RWZXJzaW9uXSwgY29uZmlnLmRpclBhdGgsIDEpO1xuICAgIH1cblxuICAgIGNvbnN0IHJlbGVhc2VzUGF0aCA9IHBhdGguam9pbihjb25maWcuZGlyUGF0aCwgJy55YXJuJywgJ3JlbGVhc2VzJyk7XG4gICAgYXdhaXQgZnMucHJvbWlzZXMubWtkaXIocmVsZWFzZXNQYXRoLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgICBmb3IgKGNvbnN0IGZpbGUgb2YgYXdhaXQgZnMucHJvbWlzZXMucmVhZGRpcihyZWxlYXNlc1BhdGgpKSB7XG4gICAgICBpZiAoZmlsZS5zdGFydHNXaXRoKCd5YXJuLScpICYmICFmaWxlLnN0YXJ0c1dpdGgoYHlhcm4tJHtsYXRlc3RWZXJzaW9ufS5gKSkge1xuICAgICAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnMucHJvbWlzZXMucm0ocGF0aC5qb2luKHJlbGVhc2VzUGF0aCwgZmlsZSkpKTtcbiAgICAgICAgY29uc29sZS5sb2coJ1JlbW92ZWQnLCBwYXRoLmpvaW4ocmVsZWFzZXNQYXRoLCBmaWxlKSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgeWFybnJjUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJy55YXJucmMnKTtcbiAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnMucHJvbWlzZXMucm0oeWFybnJjUGF0aCwgeyBmb3JjZTogdHJ1ZSB9KSk7XG5cbiAgICBsZXQgc2V0dGluZ3MgPSB7fSBhcyBTZXR0aW5ncztcbiAgICB0cnkge1xuICAgICAgc2V0dGluZ3MgPSAoeWFtbC5sb2FkKGF3YWl0IGZzLnByb21pc2VzLnJlYWRGaWxlKHlhcm5yY1ltbFBhdGgsICd1dGY4JykpIGFzIFNldHRpbmdzIHwgdW5kZWZpbmVkKSA/PyBzZXR0aW5ncztcbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIGRvIG5vdGhpbmdcbiAgICB9XG4gICAgc2V0dGluZ3MuZGVmYXVsdFNlbXZlclJhbmdlUHJlZml4ID0gJyc7XG4gICAgLy8gSW5zdGFsbC10aW1lIHNjcmlwdHMgYXJlIGEgY29tbW9uIHN1cHBseS1jaGFpbiBleGVjdXRpb24gcGF0aC4gS2VlcCB0aGlzXG4gICAgLy8gZXhwbGljaXQgc28gc3RhbGUgcHJvamVjdCBzZXR0aW5ncyBjYW5ub3QgcmUtZW5hYmxlIHRoZW0gZ2xvYmFsbHkuXG4gICAgc2V0dGluZ3MuZW5hYmxlU2NyaXB0cyA9IGZhbHNlO1xuICAgIHNldHRpbmdzLm5vZGVMaW5rZXIgPSAnbm9kZS1tb2R1bGVzJztcbiAgICBzZXR0aW5ncy5ubU1vZGUgPSAnaGFyZGxpbmtzLWdsb2JhbCc7XG4gICAgc2V0dGluZ3MubnBtTWluaW1hbEFnZUdhdGUgPSAnNWQnO1xuICAgIHNldHRpbmdzLmFwcHJvdmVkR2l0UmVwb3NpdG9yaWVzID0gW1xuICAgICAgLy8gWWFybiA0LjE0IGJsb2NrcyBnaXQgZGVwZW5kZW5jaWVzIHVubGVzcyB0aGUgcmVwb3NpdG9yeSBVUkwgaXMgZXhwbGljaXRseSBhbGxvd2VkLlxuICAgICAgJ2h0dHBzOi8vZ2l0aHViLmNvbS9XaWxsQm9vc3Rlci8qLmdpdCcsXG4gICAgICAnc3NoOi8vZ2l0QGdpdGh1Yi5jb20vV2lsbEJvb3N0ZXIvKi5naXQnLFxuICAgICAgJ2h0dHBzOi8vZ2l0aHViLmNvbS9XaWxsQm9vc3RlckxhYi8qLmdpdCcsXG4gICAgICAnc3NoOi8vZ2l0QGdpdGh1Yi5jb20vV2lsbEJvb3N0ZXJMYWIvKi5naXQnLFxuICAgIF07XG4gICAgc2V0dGluZ3MubnBtUHJlYXBwcm92ZWRQYWNrYWdlcyA9IFtcbiAgICAgIC8vIC0tLS0tLS0tLS0gU1RBUlQ6IFdlIGJlbGlldmUgb3VyIHBhY2thZ2VzIGFyZSBzYWZlIC0tLS0tLS0tLS1cbiAgICAgICdAZXhlcmNvZGUvKicsXG4gICAgICAnQHdpbGxib29zdGVyLyonLFxuICAgICAgJ2FnZW50LXJ1bnRpbWUta2l0JyxcbiAgICAgICdhdC1kZWNvcmF0b3JzJyxcbiAgICAgICdidWlsZC10cycsXG4gICAgICAnZ2VuLWkxOG4tdHMnLFxuICAgICAgJ29uZS13YXktZ2l0LXN5bmMnLFxuICAgICAgLy8gLS0tLS0tLS0tLSBFTkQ6IFdlIGJlbGlldmUgb3VyIHBhY2thZ2VzIGFyZSBzYWZlIC0tLS0tLS0tLS1cblxuICAgICAgLy8gVG8gZGVhbCB3aXRoIENWRSBsaWtlIGh0dHBzOi8vbmV4dGpzLm9yZy9ibG9nL0NWRS0yMDI1LTY2NDc4XG4gICAgICAnbmV4dCcsXG4gICAgICAnQG5leHQvKicsXG4gICAgICAnQHR5cGVzLyonLFxuICAgICAgJ0B0eXBlc2NyaXB0LyonLFxuICAgICAgJ0BveGZtdC8qJyxcbiAgICAgICdAb3hsaW50LyonLFxuICAgICAgJ0BveGxpbnQtdHNnb2xpbnQvKicsXG4gICAgICAnb3hmbXQnLFxuICAgICAgJ294bGludCcsXG4gICAgICAnb3hsaW50LXRzZ29saW50JyxcbiAgICAgICdyZWFjdCcsXG4gICAgICAncmVhY3QtZG9tJyxcbiAgICBdO1xuICAgIGRlbGV0ZSBzZXR0aW5ncy5jb21wcmVzc2lvbkxldmVsO1xuICAgIGlmIChzZXR0aW5ncy5pbmplY3RFbnZpcm9ubWVudEZpbGVzPy5sZW5ndGggPT09IDApIHtcbiAgICAgIGRlbGV0ZSBzZXR0aW5ncy5pbmplY3RFbnZpcm9ubWVudEZpbGVzO1xuICAgIH1cbiAgICAvLyBjZi4gaHR0cHM6Ly9naXRodWIuY29tL3lhcm5wa2cvYmVycnkvcHVsbC80Njk4XG4gICAgc2V0dGluZ3MuZW5hYmxlR2xvYmFsQ2FjaGUgPSB0cnVlO1xuICAgIGNvbnN0IG9yaWdpbmFsTGVuZ3RoID0gc2V0dGluZ3MucGx1Z2lucz8ubGVuZ3RoID8/IDA7XG4gICAgc2V0dGluZ3MucGx1Z2lucyA9IHNldHRpbmdzLnBsdWdpbnM/LmZpbHRlcigocCkgPT4gcC5wYXRoICE9PSAnLnlhcm4vcGx1Z2lucy91bmRlZmluZWQuY2pzJykgPz8gW107XG4gICAgaWYgKHNldHRpbmdzLnBsdWdpbnMubGVuZ3RoICE9PSBvcmlnaW5hbExlbmd0aCkge1xuICAgICAgY29uc3QgcGx1Z2luUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJy55YXJuJywgJ3BsdWdpbnMnLCAndW5kZWZpbmVkLmNqcycpO1xuICAgICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzLnByb21pc2VzLnJtKHBsdWdpblBhdGgsIHsgZm9yY2U6IHRydWUgfSkpO1xuICAgIH1cbiAgICBpZiAoc2V0dGluZ3MucGx1Z2lucy5sZW5ndGggPT09IDApIHtcbiAgICAgIGRlbGV0ZSBzZXR0aW5ncy5wbHVnaW5zO1xuICAgIH1cbiAgICBhd2FpdCBmcy5wcm9taXNlcy53cml0ZUZpbGUoeWFybnJjWW1sUGF0aCwgeWFtbC5kdW1wKHNldHRpbmdzLCB7IGxpbmVXaWR0aDogLTEgfSkpO1xuXG4gICAgc3Bhd25TeW5jKCd5YXJuJywgWydkbHgnLCAneWFybi1wbHVnaW4tYXV0by1pbnN0YWxsJ10sIGNvbmZpZy5kaXJQYXRoKTtcbiAgICAvLyBUaGUgdGFyZ2V0IHJlcG8gbWF5IG5vdCBoYXZlIHByZXR0aWVyIGluc3RhbGxlZCB5ZXQsIGFuZCB5YXJuLXBsdWdpbi1hdXRvLWluc3RhbGwgZWRpdHMgdGhpcyBmaWxlIGFmdGVyIGpzLXlhbWwuXG4gICAgc3Bhd25TeW5jKCd5YXJuJywgZ2V0WWFybnJjUHJldHRpZXJBcmdzKGNvbmZpZy5kaXJQYXRoLCB5YXJucmNZbWxQYXRoKSwgY29uZmlnLmRpclBhdGgpO1xuICB9KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldFlhcm5yY1ByZXR0aWVyQXJncyhkaXJQYXRoOiBzdHJpbmcsIHlhcm5yY1ltbFBhdGg6IHN0cmluZyk6IHN0cmluZ1tdIHtcbiAgcmV0dXJuIFsnZGx4JywgJ3ByZXR0aWVyJywgJy0tbm8tY29uZmlnJywgJy0td3JpdGUnLCBwYXRoLnJlbGF0aXZlKGRpclBhdGgsIHlhcm5yY1ltbFBhdGgpXTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldExhdGVzdFZlcnNpb24ocGFja2FnZU5hbWU6IHN0cmluZywgZGlyUGF0aDogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIHNwYXduU3luY0FuZFJldHVyblN0ZG91dCgnbnBtJywgWydzaG93JywgcGFja2FnZU5hbWUsICd2ZXJzaW9uJ10sIGRpclBhdGgpIHx8ICcwLjAuMCc7XG59XG5cbmZ1bmN0aW9uIGlzTmV3ZXJWZXJzaW9uKG5ld1ZlcnNpb246IHN0cmluZywgb2xkVmVyc2lvbjogc3RyaW5nKTogYm9vbGVhbiB7XG4gIGNvbnN0IHZhbGlkTmV3VmVyc2lvbiA9IHNlbXZlci52YWxpZChuZXdWZXJzaW9uKTtcbiAgaWYgKCF2YWxpZE5ld1ZlcnNpb24pIHJldHVybiBmYWxzZTtcblxuICByZXR1cm4gc2VtdmVyLmd0KHZhbGlkTmV3VmVyc2lvbiwgc2VtdmVyLnZhbGlkKG9sZFZlcnNpb24pID8/ICcwLjAuMCcpO1xufVxuIiwiaW1wb3J0IHR5cGUgeyBPY3Rva2l0IH0gZnJvbSAnQG9jdG9raXQvY29yZSc7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGdldE9jdG9raXQsIGdpdEh1YlV0aWwsIGhhc0dpdEh1YlRva2VuIH0gZnJvbSAnLi4vdXRpbHMvZ2l0aHViVXRpbC5qcyc7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBzZXR1cExhYmVscyhjb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdzZXR1cExhYmVscycsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBbb3duZXIsIHJlcG9dID0gZ2l0SHViVXRpbC5nZXRPcmdBbmROYW1lKGNvbmZpZy5yZXBvc2l0b3J5ID8/ICcnKTtcbiAgICBpZiAoIW93bmVyIHx8ICFyZXBvKSByZXR1cm47XG4gICAgaWYgKG93bmVyICE9PSAnV2lsbEJvb3N0ZXInICYmIG93bmVyICE9PSAnV2lsbEJvb3N0ZXJMYWInKSByZXR1cm47XG4gICAgaWYgKCFoYXNHaXRIdWJUb2tlbihvd25lcikpIHJldHVybjtcblxuICAgIGNvbnN0IG9jdG9raXQgPSBnZXRPY3Rva2l0KG93bmVyKTtcblxuICAgIHRyeSB7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAnZDE6IHgtZWFzeSA6aGVkZ2Vob2c6JywgJ0VERTlGRScpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ2QyOiBlYXN5IDpyYWJiaXQyOicsICdEREQ2RkUnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdkMzogbWVkaXVtIDpveDonLCAnQzRCNUZEJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAnZDQ6IGhhcmQgOnNxdWlkOicsICdBNzhCRkEnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdkNTogeC1oYXJkIDp3aGFsZTI6JywgJzhCNUNGNicpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ3AxOiBjcml0aWNhbCA6ZmlyZTo6ZmlyZTo6ZmlyZTonLCAnRUY0NDQ0Jyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAncDI6IHVyZ2VudCA6ZmlyZTo6ZmlyZTonLCAnRjg3MTcxJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAncDM6IGltcG9ydGFudCA6ZmlyZTonLCAnRkNBNUE1Jyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAncDQ6IG5pY2UgdG8gaGF2ZSA6ZHJvcGxldDonLCAnRkVDQUNBJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAncjogYmxpdHonLCAnNTMwMGJjJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAncjogZmlyZWJhc2UnLCAnZmZjYTI4Jyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAncjogcHJpc21hJywgJzBjMzQ0YicpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ3I6IHJlYWN0JywgJzYxZGFmYicpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ3I6IHN2ZWx0ZScsICdmZjNlMDAnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdyOiBzZW1hbnRpYy1yZWxlYXNlJywgJzQ5NDk0OScpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ3JlYWR5IDpyb2NrZXQ6JywgJzIyQzU1RScpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ3JldmlldyByZXF1ZXN0ZWQgOm1hZzonLCAnRkJDQTA0Jyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAncmVsZWFzZWQgOmJvb2ttYXJrOicsICc2MzY2RjEnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdzOiAwLjVoIDpjbG9jazEyMzA6JywgJ0YzRjRGNicpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ3M6IDFoIDpjbG9jazE6JywgJ0U1RTdFQicpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ3M6IDJoIDpjbG9jazI6JywgJ0QxRDVEQicpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ3M6IDNoIDpjbG9jazM6JywgJzlDQTNBRicpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ3M6IDVoIDpjbG9jazU6JywgJzZCNzI4MCcpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ3M6IDhoIDpjbG9jazg6JywgJzRCNTU2MycpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ3M6IDEzaCA6Y2xvY2sxOicsICczNzQxNTEnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICd0OiBidWlsZCA6aGFtbWVyOicsICdCRkRCRkUnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICd0OiBjaG9yZSA6YnJvb206JywgJ0JGREJGRScpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ3Q6IGNpIDpjb25zdHJ1Y3Rpb25fd29ya2VyOicsICdCRkRCRkUnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICd0OiBkb2NzIDptZW1vOicsICdCRkRCRkUnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICd0OiBmZWF0IDpzcGFya2xlczonLCAnQkZEQkZFJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAndDogZml4IDpidWc6JywgJ0JGREJGRScpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ3Q6IHBlcmYgOnphcDonLCAnQkZEQkZFJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAndDogcmVmYWN0b3IgOnJlY3ljbGU6JywgJ0JGREJGRScpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ3Q6IHN0eWxlIDpsaXBzdGljazonLCAnQkZEQkZFJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAndDogdGVzdCA6dGVzdF90dWJlOicsICdCRkRCRkUnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdwcm9qZWN0JywgJzI0MjkyRicpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ2ZvY3VzZWQgOmRhcnQ6JywgJzIyQzU1RScpO1xuXG4gICAgICBhd2FpdCBkZWxldGVMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ2J1ZycpO1xuICAgICAgYXdhaXQgZGVsZXRlTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdkb2N1bWVudGF0aW9uJyk7XG4gICAgICBhd2FpdCBkZWxldGVMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ2R1cGxpY2F0ZScpO1xuICAgICAgYXdhaXQgZGVsZXRlTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdlbmhhbmNlbWVudCcpO1xuICAgICAgYXdhaXQgZGVsZXRlTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdnb29kIGZpcnN0IGlzc3VlJyk7XG4gICAgICBhd2FpdCBkZWxldGVMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ2hlbHAgd2FudGVkJyk7XG4gICAgICBhd2FpdCBkZWxldGVMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ2ludmFsaWQnKTtcbiAgICAgIGF3YWl0IGRlbGV0ZUxhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAncXVlc3Rpb24nKTtcbiAgICAgIGF3YWl0IGRlbGV0ZUxhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAnd29udGZpeCcpO1xuXG4gICAgICBhd2FpdCBkZWxldGVMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ3JlYWR5Jyk7XG4gICAgICBhd2FpdCBkZWxldGVMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ3JldmlldyByZXF1ZXN0ZWQnKTtcbiAgICAgIGF3YWl0IGRlbGV0ZUxhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAncmVsZWFzZWQnKTtcbiAgICAgIGF3YWl0IGRlbGV0ZUxhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAnc2VtYW50aWMtcmVsZWFzZScpO1xuICAgICAgYXdhaXQgZGVsZXRlTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdsbG0tcHIgOnJvYm90OicpO1xuICAgICAgYXdhaXQgZGVsZXRlTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdhaS1wciA6cm9ib3Q6Jyk7XG4gICAgICBhd2FpdCBkZWxldGVMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ2dlbi1wci1hbGwgOnJvYm90OicpO1xuICAgICAgYXdhaXQgZGVsZXRlTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdnZW4tcHItY2xhdWRlIDpyb2JvdDonKTtcbiAgICAgIGF3YWl0IGRlbGV0ZUxhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAnZ2VuLXByLWNvZGV4IDpyb2JvdDonKTtcbiAgICAgIGF3YWl0IGRlbGV0ZUxhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAnZ2VuLXByLWdlbWluaSA6cm9ib3Q6Jyk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNvbnNvbGUud2FybignU2tpcCBzZXR1cExhYmVscyBkdWUgdG86JywgKGVycm9yIGFzIEVycm9yIHwgdW5kZWZpbmVkKT8uc3RhY2sgPz8gZXJyb3IpO1xuICAgIH1cbiAgfSk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHNldHVwTGFiZWwob2N0b2tpdDogT2N0b2tpdCwgb3duZXI6IHN0cmluZywgcmVwbzogc3RyaW5nLCBuYW1lOiBzdHJpbmcsIGNvbG9yOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgdHJ5IHtcbiAgICAvLyBJc3N1ZXMgcGVybWlzc2lvblxuICAgIGF3YWl0IG9jdG9raXQucmVxdWVzdCgnUE9TVCAvcmVwb3Mve293bmVyfS97cmVwb30vbGFiZWxzJywge1xuICAgICAgb3duZXIsXG4gICAgICByZXBvLFxuICAgICAgbmFtZSxcbiAgICAgIGNvbG9yLFxuICAgIH0pO1xuICB9IGNhdGNoIHtcbiAgICAvLyBJc3N1ZXMgcGVybWlzc2lvblxuICAgIGF3YWl0IG9jdG9raXQucmVxdWVzdCgnUEFUQ0ggL3JlcG9zL3tvd25lcn0ve3JlcG99L2xhYmVscy97bmFtZX0nLCB7XG4gICAgICBvd25lcixcbiAgICAgIHJlcG8sXG4gICAgICBuYW1lLFxuICAgICAgY29sb3IsXG4gICAgfSk7XG4gIH1cbn1cblxuYXN5bmMgZnVuY3Rpb24gZGVsZXRlTGFiZWwob2N0b2tpdDogT2N0b2tpdCwgb3duZXI6IHN0cmluZywgcmVwbzogc3RyaW5nLCBuYW1lOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgdHJ5IHtcbiAgICAvLyBJc3N1ZXMgcGVybWlzc2lvblxuICAgIGF3YWl0IG9jdG9raXQucmVxdWVzdCgnREVMRVRFIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9sYWJlbHMve25hbWV9Jywge1xuICAgICAgb3duZXIsXG4gICAgICByZXBvLFxuICAgICAgbmFtZSxcbiAgICB9KTtcbiAgfSBjYXRjaCB7XG4gICAgLy8gZG8gbm90aGluZ1xuICB9XG59XG4iLCJpbXBvcnQgeyBjcmVhdGVSZXF1aXJlIH0gZnJvbSAnbm9kZTptb2R1bGUnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IGRvdGVudiBmcm9tICdkb3RlbnYnO1xuaW1wb3J0IHR5cGUgc29kaXVtTW9kdWxlIGZyb20gJ2xpYnNvZGl1bS13cmFwcGVycyc7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgeyBvcHRpb25zIH0gZnJvbSAnLi4vb3B0aW9ucy5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGdldE9jdG9raXQsIGdpdEh1YlV0aWwsIGhhc0dpdEh1YlRva2VuIH0gZnJvbSAnLi4vdXRpbHMvZ2l0aHViVXRpbC5qcyc7XG5cbmNvbnN0IERFUFJFQ0FURURfU0VDUkVUX05BTUVTID0gWydSRUFEWV9ESVNDT1JEX1dFQkhPT0tfVVJMJywgJ0dIX0JPVF9QQVQnLCAnUFVCTElDX0dIX0JPVF9QQVQnXTtcbmNvbnN0IHJlcXVpcmUgPSBjcmVhdGVSZXF1aXJlKGltcG9ydC5tZXRhLnVybCk7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBzZXR1cFNlY3JldHMoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignc2V0dXBTZWNyZXRzJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IFtvd25lciwgcmVwb10gPSBnaXRIdWJVdGlsLmdldE9yZ0FuZE5hbWUoY29uZmlnLnJlcG9zaXRvcnkgPz8gJycpO1xuICAgIGlmICghb3duZXIgfHwgIXJlcG8gfHwgb3duZXIgIT09ICdXaWxsQm9vc3RlckxhYicpIHJldHVybjtcbiAgICBpZiAoIWhhc0dpdEh1YlRva2VuKG93bmVyKSB8fCAhb3B0aW9ucy5kb2VzVXBsb2FkRW52VmFycykgcmV0dXJuO1xuXG4gICAgY29uc3QgcGFyc2VkID0gZG90ZW52LmNvbmZpZyh7IHBhdGg6IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJy5lbnYnKSwgcXVpZXQ6IHRydWUgfSkucGFyc2VkID8/IHt9O1xuICAgIGlmIChPYmplY3Qua2V5cyhwYXJzZWQpLmxlbmd0aCA9PT0gMCkgcmV0dXJuO1xuXG4gICAgY29uc3Qgb2N0b2tpdCA9IGdldE9jdG9raXQob3duZXIpO1xuXG4gICAgdHJ5IHtcbiAgICAgIGZvciAoY29uc3Qgc2VjcmV0TmFtZSBvZiBERVBSRUNBVEVEX1NFQ1JFVF9OQU1FUykge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIC8vIFJlcXVpcmVzIFNlY3JldHMgcGVybWlzc2lvblxuICAgICAgICAgIGF3YWl0IG9jdG9raXQucmVxdWVzdCgnREVMRVRFIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9hY3Rpb25zL3NlY3JldHMve3NlY3JldF9uYW1lfScsIHtcbiAgICAgICAgICAgIG93bmVyLFxuICAgICAgICAgICAgcmVwbyxcbiAgICAgICAgICAgIHNlY3JldF9uYW1lOiBzZWNyZXROYW1lLFxuICAgICAgICAgIH0pO1xuICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICAvLyBkbyBub3RoaW5nXG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gUmVxdWlyZXMgU2VjcmV0cyBwZXJtaXNzaW9uXG4gICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IG9jdG9raXQucmVxdWVzdCgnR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9hY3Rpb25zL3NlY3JldHMvcHVibGljLWtleScsIHtcbiAgICAgICAgb3duZXIsXG4gICAgICAgIHJlcG8sXG4gICAgICB9KTtcbiAgICAgIGNvbnN0IHsga2V5LCBrZXlfaWQ6IGtleUlkIH0gPSByZXNwb25zZS5kYXRhO1xuXG4gICAgICBjb25zdCBzb2RpdW0gPSBnZXRTb2RpdW0oKTtcbiAgICAgIGF3YWl0IHNvZGl1bS5yZWFkeTtcblxuICAgICAgZm9yIChjb25zdCBbbmFtZSwgc2VjcmV0XSBvZiBPYmplY3QuZW50cmllcyhwYXJzZWQpKSB7XG4gICAgICAgIGlmIChcbiAgICAgICAgICBuYW1lID09PSAnR0hfQk9UX1BBVCcgfHxcbiAgICAgICAgICBuYW1lID09PSAnR0hfQk9UX1BBVF9GT1JfV0lMTEJPT1NURVInIHx8XG4gICAgICAgICAgbmFtZSA9PT0gJ0dIX0JPVF9QQVRfRk9SX1dJTExCT09TVEVSTEFCJ1xuICAgICAgICApIHtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIENvbnZlcnQgU2VjcmV0ICYgQmFzZTY0IGtleSB0byBVaW50OEFycmF5LlxuICAgICAgICBjb25zdCByYXdLZXkgPSBzb2RpdW0uZnJvbV9iYXNlNjQoa2V5LCBzb2RpdW0uYmFzZTY0X3ZhcmlhbnRzLk9SSUdJTkFMKTtcbiAgICAgICAgY29uc3QgcmF3U2VjID0gc29kaXVtLmZyb21fc3RyaW5nKHNlY3JldCk7XG5cbiAgICAgICAgLy8gRW5jcnlwdCB0aGUgc2VjcmV0IHVzaW5nIExpYlNvZGl1bVxuICAgICAgICBjb25zdCBlbmNCeXRlcyA9IHNvZGl1bS5jcnlwdG9fYm94X3NlYWwocmF3U2VjLCByYXdLZXkpO1xuXG4gICAgICAgIC8vIENvbnZlcnQgZW5jcnlwdGVkIFVpbnQ4QXJyYXkgdG8gQmFzZTY0XG4gICAgICAgIGNvbnN0IGVuY0Jhc2U2NCA9IHNvZGl1bS50b19iYXNlNjQoZW5jQnl0ZXMsIHNvZGl1bS5iYXNlNjRfdmFyaWFudHMuT1JJR0lOQUwpO1xuXG4gICAgICAgIC8vIFJlcXVpcmVzIFNlY3JldHMgcGVybWlzc2lvblxuICAgICAgICBhd2FpdCBvY3Rva2l0LnJlcXVlc3QoJ1BVVCAvcmVwb3Mve293bmVyfS97cmVwb30vYWN0aW9ucy9zZWNyZXRzL3tzZWNyZXRfbmFtZX0nLCB7XG4gICAgICAgICAgb3duZXIsXG4gICAgICAgICAgcmVwbyxcbiAgICAgICAgICBzZWNyZXRfbmFtZTogbmFtZSxcbiAgICAgICAgICBlbmNyeXB0ZWRfdmFsdWU6IGVuY0Jhc2U2NCxcbiAgICAgICAgICBrZXlfaWQ6IGtleUlkLFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgY29uc29sZS53YXJuKCdTa2lwIHNldHVwU2VjcmV0cyBkdWUgdG86JywgKGVycm9yIGFzIEVycm9yIHwgdW5kZWZpbmVkKT8uc3RhY2sgPz8gZXJyb3IpO1xuICAgIH1cbiAgfSk7XG59XG5cbmZ1bmN0aW9uIGdldFNvZGl1bSgpOiB0eXBlb2Ygc29kaXVtTW9kdWxlIHtcbiAgLy8gbGlic29kaXVtLXdyYXBwZXJzJyBFU00gZW50cnkgY2FuIGJpbmQgdG8gbGlic29kaXVtQDAuOC4zLCB3aG9zZSBkZWZhdWx0XG4gIC8vIGV4cG9ydCBubyBsb25nZXIgZXhwb3NlcyByZWFkeS4gVGhlIENvbW1vbkpTIGVudHJ5IGtlZXBzIHRoZSBBUEkgc2hhcGUuXG4gIHJldHVybiByZXF1aXJlKCdsaWJzb2RpdW0td3JhcHBlcnMnKSBhcyB0eXBlb2Ygc29kaXVtTW9kdWxlO1xufVxuIiwiaW1wb3J0IHsgd2l0aFJldHJ5IH0gZnJvbSAnQHdpbGxib29zdGVyL3NoYXJlZC1saWIvc3JjJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZ2V0T2N0b2tpdCwgZ2l0SHViVXRpbCwgaGFzR2l0SHViVG9rZW4gfSBmcm9tICcuLi91dGlscy9naXRodWJVdGlsLmpzJztcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHNldHVwR2l0SHViU2V0dGluZ3MoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignc2V0dXBHaXRIdWJTZXR0aW5ncycsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBbb3duZXIsIHJlcG9dID0gZ2l0SHViVXRpbC5nZXRPcmdBbmROYW1lKGNvbmZpZy5yZXBvc2l0b3J5ID8/ICcnKTtcbiAgICBpZiAoIW93bmVyIHx8ICFyZXBvKSByZXR1cm47XG4gICAgaWYgKG93bmVyICE9PSAnV2lsbEJvb3N0ZXInICYmIG93bmVyICE9PSAnV2lsbEJvb3N0ZXJMYWInKSByZXR1cm47XG4gICAgaWYgKCFoYXNHaXRIdWJUb2tlbihvd25lcikpIHJldHVybjtcblxuICAgIGNvbnN0IG9jdG9raXQgPSBnZXRPY3Rva2l0KG93bmVyKTtcblxuICAgIHRyeSB7XG4gICAgICAvLyBSZXBvc2l0b3J5IHNldHRpbmdzIG5lZWQgYWRtaW5pc3RyYXRpb24gcGVybWlzc2lvbiwgdW5saWtlIGZpbGUgZ2VuZXJhdGlvbi5cbiAgICAgIGF3YWl0IHdpdGhSZXRyeShcbiAgICAgICAgKCkgPT5cbiAgICAgICAgICBvY3Rva2l0LnJlcXVlc3QoJ1BBVENIIC9yZXBvcy97b3duZXJ9L3tyZXBvfScsIHtcbiAgICAgICAgICAgIG93bmVyLFxuICAgICAgICAgICAgcmVwbyxcbiAgICAgICAgICAgIGFsbG93X2F1dG9fbWVyZ2U6IHRydWUsXG4gICAgICAgICAgICBhbGxvd19tZXJnZV9jb21taXQ6IGZhbHNlLFxuICAgICAgICAgICAgYWxsb3dfc3F1YXNoX21lcmdlOiB0cnVlLFxuICAgICAgICAgICAgYWxsb3dfcmViYXNlX21lcmdlOiBmYWxzZSxcbiAgICAgICAgICAgIGFsbG93X3VwZGF0ZV9icmFuY2g6IHRydWUsXG4gICAgICAgICAgICBkZWxldGVfYnJhbmNoX29uX21lcmdlOiB0cnVlLFxuICAgICAgICAgICAgc3F1YXNoX21lcmdlX2NvbW1pdF90aXRsZTogJ1BSX1RJVExFJyxcbiAgICAgICAgICAgIHNxdWFzaF9tZXJnZV9jb21taXRfbWVzc2FnZTogJ0JMQU5LJyxcbiAgICAgICAgICAgIGhlYWRlcnM6IHtcbiAgICAgICAgICAgICAgJ1gtR2l0SHViLUFwaS1WZXJzaW9uJzogJzIwMjItMTEtMjgnLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIC4uLihjb25maWcucmVwb3NpdG9yeT8uc3RhcnRzV2l0aCgnZ2l0aHViOldpbGxCb29zdGVyLycpID8geyBhbGxvd19hdXRvX21lcmdlOiB0cnVlIH0gOiB7fSksXG4gICAgICAgICAgfSksXG4gICAgICAgIHtcbiAgICAgICAgICBzaG91bGRSZXRyeTogKGVycm9yKSA9PiAhaXNHaXRIdWJQZXJtaXNzaW9uT3JWaXNpYmlsaXR5RXJyb3IoZXJyb3IpLFxuICAgICAgICB9XG4gICAgICApO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBpZiAoIWlzR2l0SHViUGVybWlzc2lvbk9yVmlzaWJpbGl0eUVycm9yKGVycm9yKSkgdGhyb3cgZXJyb3I7XG5cbiAgICAgIC8vIExvY2FsIHdiZnkgcnVucyBvZnRlbiBoYXZlIHB1c2ggcGVybWlzc2lvbiB3aXRob3V0IGFkbWluIHBlcm1pc3Npb24uXG4gICAgICBjb25zb2xlLndhcm4oJ1NraXAgc2V0dXBHaXRIdWJTZXR0aW5ncyBkdWUgdG86JywgKGVycm9yIGFzIEVycm9yIHwgdW5kZWZpbmVkKT8uc3RhY2sgPz8gZXJyb3IpO1xuICAgIH1cbiAgfSk7XG59XG5cbmZ1bmN0aW9uIGlzR2l0SHViUGVybWlzc2lvbk9yVmlzaWJpbGl0eUVycm9yKGVycm9yOiB1bmtub3duKTogYm9vbGVhbiB7XG4gIGlmICghZXJyb3IgfHwgdHlwZW9mIGVycm9yICE9PSAnb2JqZWN0JyB8fCAhKCdzdGF0dXMnIGluIGVycm9yKSkgcmV0dXJuIGZhbHNlO1xuICByZXR1cm4gZXJyb3Iuc3RhdHVzID09PSA0MDEgfHwgZXJyb3Iuc3RhdHVzID09PSA0MDMgfHwgZXJyb3Iuc3RhdHVzID09PSA0MDQ7XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgeyBkaXN0YW5jZSB9IGZyb20gJ2Zhc3Rlc3QtbGV2ZW5zaHRlaW4nO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBmc1V0aWwgfSBmcm9tICcuLi91dGlscy9mc1V0aWwuanMnO1xuaW1wb3J0IHsgcHJvbWlzZVBvb2wgfSBmcm9tICcuLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5cbmNvbnN0IHBhY2thZ2VNYW5hZ2VyUnVuUGxhY2Vob2xkZXIgPSAnX19QTV9SVU5fXyc7XG5cbmNvbnN0IHRlbXBsYXRlcyA9IHtcbiAgJ3B1bGxfcmVxdWVzdF90ZW1wbGF0ZS5tZCc6IGBcbkNsb3NlICM8SXNzdWVOdW1iZXI+XG5cbiMjIFNlbGYgQ2hlY2tcblxuLSBbIF0gSSd2ZSBjb25maXJtZWQgXFxgQWxsIGNoZWNrcyBoYXZlIHBhc3NlZFxcYCBvbiB0aGlzIHBhZ2UuXG4gIC0gUFIgdGl0bGUgZm9sbG93cyBbQW5ndWxhcidzIGNvbW1pdCBtZXNzYWdlIGZvcm1hdF0oaHR0cHM6Ly9naXRodWIuY29tL2FuZ3VsYXIvYW5ndWxhci9ibG9iL21haW4vQ09OVFJJQlVUSU5HLm1kIy1jb21taXQtbWVzc2FnZS1mb3JtYXQpLlxuICAtIFBSIHRpdGxlIGRvZXNuJ3QgaGF2ZSBcXGBXSVA6XFxgLlxuICAtIFRoZSB0ZXN0IGNvbW1hbmQgKGUuZy4sIFxcYCR7cGFja2FnZU1hbmFnZXJSdW5QbGFjZWhvbGRlcn0gdGVzdFxcYCkgcGFzc2VkLlxuICAtIFRoZSBsaW50IGNvbW1hbmQgKGUuZy4sIFxcYCR7cGFja2FnZU1hbmFnZXJSdW5QbGFjZWhvbGRlcn0gbGludFxcYCkgcGFzc2VkLlxuICAtIFlvdSBtYXkgbGVhdmUgdGhpcyBib3ggdW5jaGVja2VkIGR1ZSB0byBsb25nIHdvcmtmbG93cy5cbi0gWyBdIEkndmUgcmV2aWV3ZWQgbXkgY2hhbmdlcyBvbiB0aGUgR2l0SHViIGRpZmYgdmlldy5cbi0gWyBdIEkndmUgd3JpdHRlbiB0aGUgc3RlcHMgdG8gdGVzdCBteSBjaGFuZ2VzLlxuLSBbIF0gSSd2ZSBhZGRlZCBzY3JlZW5zaG90cyAoaWYgdGhlIFVJIGNoYW5nZWQpLlxuICAtIFlvdSBtYXkgbGVhdmUgdGhpcyBib3ggdW5jaGVja2VkIGlmIHlvdSBkaWRuJ3QgbW9kaWZ5IHRoZSBVSS5cblxuPCEtLSBQbGVhc2UgYWRkIHNjcmVlbnNob3RzIGlmIHlvdSBtb2RpZnkgdGhlIFVJLlxufCBDdXJyZW50ICAgICAgICAgICAgICAgICAgfCBJbiBjb21pbmcgICAgICAgICAgICAgICAgfFxufCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfFxufCA8aW1nIHNyYz1cIlwiIHdpZHRoPVwiNDAwXCI+IHwgPGltZyBzcmM9XCJcIiB3aWR0aD1cIjQwMFwiPiB8XG4tLT5cblxuPCEtLSBQbGVhc2UgYWRkIHN0ZXBzIHRvIHRlc3QgeW91ciBjaGFuZ2VzLlxuIyMgU3RlcHMgdG8gVGVzdFxuXG4xLiBPcGVuIGh0dHA6Ly9sb2NhbGhvc3QtZXhlcmNvZGUud2lsbGJvb3N0ZXIubmV0OjMwMDAvamEtSlAvY291cnNlcy9fZXhhbXBsZS9sZXNzb25zL19leGFtcGxlX2FfcGx1c19iL3Byb2JsZW1zL19leGFtcGxlX2FfcGx1c19iIGFmdGVyIGxvZ2luLlxuMi4gU2VsZWN0IHRoZSBsYW5ndWFnZSBcXGBDXFxgLlxuMy4gV3JpdGUgdGhlIGZvbGxvd2luZyBjb2RlOlxuICAgXFxgXFxgXFxgY1xuICAgI2luY2x1ZGUgPHN0ZGlvLmg+XG5cbiAgIGludCBtYWluKHZvaWQpIHtcbiAgICAgaW50IGEsIGI7XG5cbiAgICAgc2NhbmYoXCIlZCAlZFwiLCAmYSwgJmIpO1xuICAgICBwcmludGYoXCIlZFwiLCBhICsgYik7XG4gICAgIHJldHVybiAwO1xuICAgfVxuICAgXFxgXFxgXFxgXG40LiBQdXNoIFxcYFN1Ym1pdFxcYCBidXR0b24uXG41LiAuLi5cbi0tPlxuYC50cmltKCksXG59O1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVHaXRIdWJUZW1wbGF0ZXMoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZ2VuZXJhdGVHaXRIdWJUZW1wbGF0ZXMnLCBhc3luYyAoKSA9PiB7XG4gICAgaWYgKCFjb25maWcuaXNXaWxsQm9vc3RlclJlcG8pIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IFtmaWxlTmFtZSwgbmV3Q29udGVudF0gb2YgT2JqZWN0LmVudHJpZXModGVtcGxhdGVzKSkge1xuICAgICAgY29uc3QgY29udGVudCA9IGFwcGx5UGFja2FnZU1hbmFnZXJUZW1wbGF0ZShuZXdDb250ZW50LCBjb25maWcpO1xuICAgICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICcuZ2l0aHViJywgZmlsZU5hbWUpO1xuICAgICAgaWYgKGZzLmV4aXN0c1N5bmMoZmlsZVBhdGgpKSB7XG4gICAgICAgIGNvbnN0IG9sZENvbnRlbnQgPSBhd2FpdCBmcy5wcm9taXNlcy5yZWFkRmlsZShmaWxlUGF0aCwgJ3V0ZjgnKTtcbiAgICAgICAgaWYgKGRpc3RhbmNlKG9sZENvbnRlbnQsIGNvbnRlbnQpID4gY29udGVudC5sZW5ndGggLyAyKSB7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgYXdhaXQgZnMucHJvbWlzZXMubWtkaXIocGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnLmdpdGh1YicpLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiBmc1V0aWwuZ2VuZXJhdGVGaWxlKGZpbGVQYXRoLCBjb250ZW50KSk7XG4gICAgfVxuICB9KTtcbn1cblxuZnVuY3Rpb24gYXBwbHlQYWNrYWdlTWFuYWdlclRlbXBsYXRlKHRlbXBsYXRlOiBzdHJpbmcsIGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IHN0cmluZyB7XG4gIGNvbnN0IHBhY2thZ2VNYW5hZ2VyQ29tbWFuZCA9IGNvbmZpZy5pc0J1biA/ICdidW4gcnVuJyA6ICd5YXJuJztcbiAgcmV0dXJuIHRlbXBsYXRlLnJlcGxhY2VBbGwocGFja2FnZU1hbmFnZXJSdW5QbGFjZWhvbGRlciwgcGFja2FnZU1hbmFnZXJDb21tYW5kKTtcbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBmc3AgZnJvbSAnbm9kZTpmcy9wcm9taXNlcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgZmcgZnJvbSAnZmFzdC1nbG9iJztcbmltcG9ydCB7IHNpbXBsZUdpdCB9IGZyb20gJ3NpbXBsZS1naXQnO1xuaW1wb3J0IHsgcGFyc2UgYXMgcGFyc2VUb21sIH0gZnJvbSAnc21vbC10b21sJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUpzb24gfSBmcm9tICd0eXBlLWZlc3QnO1xuaW1wb3J0IHsgeiB9IGZyb20gJ3pvZCc7XG5cbmltcG9ydCB7IGdldE9jdG9raXQsIGdpdEh1YlV0aWwgfSBmcm9tICcuL3V0aWxzL2dpdGh1YlV0aWwuanMnO1xuaW1wb3J0IHsgZ2xvYklnbm9yZSB9IGZyb20gJy4vdXRpbHMvZ2xvYlV0aWwuanMnO1xuXG5leHBvcnQgaW50ZXJmYWNlIFBhY2thZ2VDb25maWcge1xuICBkaXJQYXRoOiBzdHJpbmc7XG4gIGRvY2tlcmZpbGU6IHN0cmluZztcbiAgaXNSb290OiBib29sZWFuO1xuICBpc1B1YmxpY1JlcG86IGJvb2xlYW47XG4gIGlzUmVmZXJyZWRCeU90aGVyUmVwbzogYm9vbGVhbjtcbiAgcmVwb3NpdG9yeT86IHN0cmluZztcbiAgcmVwb0F1dGhvcj86IHN0cmluZztcbiAgcmVwb05hbWU/OiBzdHJpbmc7XG4gIGlzV2lsbEJvb3N0ZXJSZXBvOiBib29sZWFuO1xuICBpc0J1bjogYm9vbGVhbjtcbiAgaXNFc21QYWNrYWdlOiBib29sZWFuO1xuICBpc1dpbGxCb29zdGVyQ29uZmlnczogYm9vbGVhbjtcbiAgLy8gZGVwZW5kZW5jeSBpbmZvcm1hdGlvblxuICBkb2VzQ29udGFpblN1YlBhY2thZ2VKc29uczogYm9vbGVhbjtcbiAgZG9lc0NvbnRhaW5Eb2NrZXJmaWxlOiBib29sZWFuO1xuICBkb2VzQ29udGFpbkdlbWZpbGU6IGJvb2xlYW47XG4gIGRvZXNDb250YWluR29Nb2Q6IGJvb2xlYW47XG4gIGRvZXNDb250YWluUGFja2FnZUpzb246IGJvb2xlYW47XG4gIGRvZXNDb250YWluUG9ldHJ5TG9jazogYm9vbGVhbjtcbiAgZG9lc0NvbnRhaW5VdkxvY2s6IGJvb2xlYW47XG4gIGRvZXNDb250YWluUG9tWG1sOiBib29sZWFuO1xuICBkb2VzQ29udGFpblB1YnNwZWNZYW1sOiBib29sZWFuO1xuICBkb2VzQ29udGFpblRlbXBsYXRlWWFtbDogYm9vbGVhbjtcbiAgZG9lc0NvbnRhaW5Wc2NvZGVTZXR0aW5nc0pzb246IGJvb2xlYW47XG4gIC8vIHNvdXJjZSBjb2RlIGZpbGVzXG4gIGRvZXNDb250YWluSmF2YVNjcmlwdDogYm9vbGVhbjtcbiAgZG9lc0NvbnRhaW5UeXBlU2NyaXB0OiBib29sZWFuO1xuICBkb2VzQ29udGFpbkpzeE9yVHN4OiBib29sZWFuO1xuICBkb2VzQ29udGFpbkphdmE6IGJvb2xlYW47XG4gIGRvZXNDb250YWluSmF2YVNjcmlwdEluUGFja2FnZXM6IGJvb2xlYW47XG4gIGRvZXNDb250YWluVHlwZVNjcmlwdEluUGFja2FnZXM6IGJvb2xlYW47XG4gIGRvZXNDb250YWluSnN4T3JUc3hJblBhY2thZ2VzOiBib29sZWFuO1xuICBkb2VzQ29udGFpbkphdmFJblBhY2thZ2VzOiBib29sZWFuO1xuXG4gIGRlcGVuZGluZzoge1xuICAgIGJsaXR6OiBib29sZWFuO1xuICAgIGZpcmViYXNlOiBib29sZWFuO1xuICAgIGdlbkkxOG5UczogYm9vbGVhbjtcbiAgICBsaXRlc3RyZWFtOiBib29sZWFuO1xuICAgIG5leHQ6IGJvb2xlYW47XG4gICAgcGxheXdyaWdodFRlc3Q6IGJvb2xlYW47XG4gICAgcHJpc21hOiBib29sZWFuO1xuICAgIHB5cmlnaHQ6IGJvb2xlYW47XG4gICAgcmVhY3Q6IGJvb2xlYW47XG4gICAgcmVhY3ROYXRpdmU6IGJvb2xlYW47XG4gICAgc2VtYW50aWNSZWxlYXNlOiBib29sZWFuO1xuICAgIHN0b3J5Ym9vazogYm9vbGVhbjtcbiAgICB3YjogYm9vbGVhbjtcbiAgICBjaGFrcmE6IGJvb2xlYW47XG4gICAgZHJpenpsZTogYm9vbGVhbjtcbiAgfTtcbiAgcmVsZWFzZToge1xuICAgIGJyYW5jaGVzOiBzdHJpbmdbXTtcbiAgICBnaXRodWI6IGJvb2xlYW47XG4gICAgbnBtOiBib29sZWFuO1xuICB9O1xuICBoYXNWZXJzaW9uU2V0dGluZ3M6IGJvb2xlYW47XG4gIG1pc2VUYXNrczogUmVjb3JkPHN0cmluZywgc3RyaW5nPjtcbiAgcGFja2FnZUpzb24/OiBQYWNrYWdlSnNvbjtcbiAgd2JmeUpzb24/OiBXYmZ5SnNvbjtcbn1cblxudHlwZSBXYmZ5SnNvbiA9IHouaW5mZXI8dHlwZW9mIHdiZnlKc29uU2NoZW1hPjtcblxuY29uc3Qgd2JmeUpzb25TY2hlbWEgPSB6Lm9iamVjdCh7XG4gIHR5cG9zOiB6XG4gICAgLm9iamVjdCh7XG4gICAgICBhbGw6IHoucmVjb3JkKHouc3RyaW5nKCksIHouc3RyaW5nKCkpLm9wdGlvbmFsKCksXG4gICAgICBkb2M6IHoucmVjb3JkKHouc3RyaW5nKCksIHouc3RyaW5nKCkpLm9wdGlvbmFsKCksXG4gICAgICB0czogei5yZWNvcmQoei5zdHJpbmcoKSwgei5zdHJpbmcoKSkub3B0aW9uYWwoKSxcbiAgICAgIHRleHQ6IHoucmVjb3JkKHouc3RyaW5nKCksIHouc3RyaW5nKCkpLm9wdGlvbmFsKCksXG4gICAgfSlcbiAgICAub3B0aW9uYWwoKSxcbn0pO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2V0UGFja2FnZUNvbmZpZyhcbiAgZGlyUGF0aDogc3RyaW5nLFxuICByb290Q29uZmlnPzogUGFja2FnZUNvbmZpZ1xuKTogUHJvbWlzZTxQYWNrYWdlQ29uZmlnIHwgdW5kZWZpbmVkPiB7XG4gIGNvbnN0IHBhY2thZ2VKc29uUGF0aCA9IHBhdGgucmVzb2x2ZShkaXJQYXRoLCAncGFja2FnZS5qc29uJyk7XG4gIHRyeSB7XG4gICAgY29uc3QgZG9lc0NvbnRhaW5QYWNrYWdlSnNvbiA9IGZzLmV4aXN0c1N5bmMocGFja2FnZUpzb25QYXRoKTtcbiAgICBsZXQgZGVwZW5kZW5jaWVzOiBQYWNrYWdlSnNvblsnZGVwZW5kZW5jaWVzJ10gPSB7fTtcbiAgICBsZXQgZGV2RGVwZW5kZW5jaWVzOiBQYWNrYWdlSnNvblsnZGV2RGVwZW5kZW5jaWVzJ10gPSB7fTtcbiAgICBsZXQgcGFja2FnZUpzb246IFBhY2thZ2VKc29uID0ge307XG4gICAgbGV0IGVzbVBhY2thZ2UgPSBmYWxzZTtcbiAgICBpZiAoZG9lc0NvbnRhaW5QYWNrYWdlSnNvbikge1xuICAgICAgY29uc3QgcGFja2FnZUpzb25UZXh0ID0gZnMucmVhZEZpbGVTeW5jKHBhY2thZ2VKc29uUGF0aCwgJ3V0ZjgnKTtcbiAgICAgIHBhY2thZ2VKc29uID0gSlNPTi5wYXJzZShwYWNrYWdlSnNvblRleHQpIGFzIFBhY2thZ2VKc29uO1xuICAgICAgZGVwZW5kZW5jaWVzID0gcGFja2FnZUpzb24uZGVwZW5kZW5jaWVzID8/IHt9O1xuICAgICAgZGV2RGVwZW5kZW5jaWVzID0gcGFja2FnZUpzb24uZGV2RGVwZW5kZW5jaWVzID8/IHt9O1xuICAgICAgZXNtUGFja2FnZSA9IHBhY2thZ2VKc29uLnR5cGUgPT09ICdtb2R1bGUnO1xuICAgIH1cblxuICAgIGxldCByZWxlYXNlQnJhbmNoZXM6IHN0cmluZ1tdID0gW107XG4gICAgbGV0IHJlbGVhc2VQbHVnaW5zOiBzdHJpbmdbXSA9IFtdO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCByZWxlYXNlcmNKc29uUGF0aCA9IHBhdGgucmVzb2x2ZShkaXJQYXRoLCAnLnJlbGVhc2VyYy5qc29uJyk7XG4gICAgICBjb25zdCBqc29uID0gSlNPTi5wYXJzZShhd2FpdCBmc3AucmVhZEZpbGUocmVsZWFzZXJjSnNvblBhdGgsICd1dGY4JykpIGFzXG4gICAgICAgIHwge1xuICAgICAgICAgICAgYnJhbmNoZXM6IHN0cmluZ1tdO1xuICAgICAgICAgICAgcGx1Z2lucz86IHN0cmluZ1tdW107XG4gICAgICAgICAgfVxuICAgICAgICB8IHVuZGVmaW5lZDtcbiAgICAgIHJlbGVhc2VCcmFuY2hlcyA9IGpzb24/LmJyYW5jaGVzID8/IFtdO1xuICAgICAgcmVsZWFzZVBsdWdpbnMgPSBqc29uPy5wbHVnaW5zPy5mbGF0KCkgPz8gW107XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBkbyBub3RoaW5nXG4gICAgfVxuXG4gICAgY29uc3QgaXNSb290ID1cbiAgICAgIHBhdGguYmFzZW5hbWUocGF0aC5yZXNvbHZlKGRpclBhdGgsICcuLicpKSAhPT0gJ3BhY2thZ2VzJyB8fFxuICAgICAgIWZzLmV4aXN0c1N5bmMocGF0aC5yZXNvbHZlKGRpclBhdGgsICcuLicsICcuLicsICdwYWNrYWdlLmpzb24nKSk7XG5cbiAgICBsZXQgcmVwb0luZm86IFJlY29yZDxzdHJpbmcsIHVua25vd24+IHwgdW5kZWZpbmVkO1xuICAgIGlmIChpc1Jvb3QpIHtcbiAgICAgIHJlcG9JbmZvID0gYXdhaXQgZmV0Y2hSZXBvSW5mbyhkaXJQYXRoLCBwYWNrYWdlSnNvbik7XG4gICAgfVxuXG4gICAgbGV0IGhhc1ZlcnNpb25TZXR0aW5ncyA9IGhhc1ZlcnNpb25TZXR0aW5nc0ZpbGUoZGlyUGF0aCk7XG4gICAgZm9yIChjb25zdCBwcmVmaXggb2YgWydqYXZhJywgJ25vZGUnLCAncHl0aG9uJ10pIHtcbiAgICAgIGlmIChmcy5leGlzdHNTeW5jKHBhdGgucmVzb2x2ZShkaXJQYXRoLCBgLiR7cHJlZml4fS12ZXJzaW9uYCkpKSB7XG4gICAgICAgIGhhc1ZlcnNpb25TZXR0aW5ncyA9IHRydWU7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cblxuICAgIGxldCBkb2NrZXJmaWxlID0gJyc7XG4gICAgdHJ5IHtcbiAgICAgIGRvY2tlcmZpbGUgPSBhd2FpdCBmc3AucmVhZEZpbGUocGF0aC5yZXNvbHZlKGRpclBhdGgsICdEb2NrZXJmaWxlJyksICd1dGY4Jyk7XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBkbyBub3RoaW5nXG4gICAgfVxuXG4gICAgLy8gUmVhZCB3YmZ5Lmpzb25cbiAgICBjb25zdCB3YmZ5SnNvblBhdGggPSBwYXRoLnJlc29sdmUoZGlyUGF0aCwgJ3diZnkuanNvbicpO1xuICAgIGxldCB3YmZ5SnNvbjogV2JmeUpzb24gfCB1bmRlZmluZWQ7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHdiZnlKc29uVGV4dCA9IGF3YWl0IGZzcC5yZWFkRmlsZSh3YmZ5SnNvblBhdGgsICd1dGY4Jyk7XG4gICAgICB3YmZ5SnNvbiA9IHdiZnlKc29uU2NoZW1hLnBhcnNlKEpTT04ucGFyc2Uod2JmeUpzb25UZXh0KSk7XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBkbyBub3RoaW5nXG4gICAgfVxuXG4gICAgY29uc3QgcmVwb0Z1bGxOYW1lID0gdHlwZW9mIHJlcG9JbmZvPy5mdWxsX25hbWUgPT09ICdzdHJpbmcnID8gcmVwb0luZm8uZnVsbF9uYW1lIDogdW5kZWZpbmVkO1xuICAgIGxldCByZXBvQXV0aG9yOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gICAgbGV0IHJlcG9OYW1lOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gICAgaWYgKHJlcG9GdWxsTmFtZSkge1xuICAgICAgY29uc3QgcmVwb1BhcnRzID0gcmVwb0Z1bGxOYW1lLnNwbGl0KCcvJyk7XG4gICAgICBpZiAocmVwb1BhcnRzLmxlbmd0aCA+PSAyKSB7XG4gICAgICAgIHJlcG9BdXRob3IgPSByZXBvUGFydHNbMF07XG4gICAgICAgIHJlcG9OYW1lID0gcmVwb1BhcnRzWzFdO1xuICAgICAgfVxuICAgIH1cbiAgICBjb25zdCByZXBvc2l0b3J5ID0gcmVwb0Z1bGxOYW1lID8gYGdpdGh1Yjoke3JlcG9GdWxsTmFtZX1gIDogdW5kZWZpbmVkO1xuICAgIGNvbnN0IGNvbmZpZzogUGFja2FnZUNvbmZpZyA9IHtcbiAgICAgIGRpclBhdGgsXG4gICAgICBkb2NrZXJmaWxlLFxuICAgICAgaXNSb290LFxuICAgICAgaXNQdWJsaWNSZXBvOiByZXBvSW5mbz8ucHJpdmF0ZSA9PT0gZmFsc2UsXG4gICAgICBpc1JlZmVycmVkQnlPdGhlclJlcG86ICEhcGFja2FnZUpzb24uZmlsZXMsXG4gICAgICByZXBvc2l0b3J5LFxuICAgICAgcmVwb0F1dGhvcixcbiAgICAgIHJlcG9OYW1lLFxuICAgICAgaXNXaWxsQm9vc3RlclJlcG86IEJvb2xlYW4oXG4gICAgICAgIHJlcG9zaXRvcnk/LnN0YXJ0c1dpdGgoJ2dpdGh1YjpXaWxsQm9vc3Rlci8nKSB8fCByZXBvc2l0b3J5Py5zdGFydHNXaXRoKCdnaXRodWI6V2lsbEJvb3N0ZXJMYWIvJylcbiAgICAgICksXG4gICAgICBpc0J1bjogcm9vdENvbmZpZz8uaXNCdW4gfHwgZnMuZXhpc3RzU3luYyhwYXRoLmpvaW4oZGlyUGF0aCwgJ2J1bi5sb2NrJykpLFxuICAgICAgaXNFc21QYWNrYWdlOiBlc21QYWNrYWdlLFxuICAgICAgaXNXaWxsQm9vc3RlckNvbmZpZ3M6IHBhY2thZ2VKc29uUGF0aC5pbmNsdWRlcygnL3dpbGxib29zdGVyLWNvbmZpZ3MnKSxcbiAgICAgIGRvZXNDb250YWluU3ViUGFja2FnZUpzb25zOiBjb250YWluc0FueSgncGFja2FnZXMvKiovcGFja2FnZS5qc29uJywgZGlyUGF0aCksXG4gICAgICBkb2VzQ29udGFpbkRvY2tlcmZpbGU6ICEhZG9ja2VyZmlsZSB8fCBmcy5leGlzdHNTeW5jKHBhdGgucmVzb2x2ZShkaXJQYXRoLCAnZG9ja2VyLWNvbXBvc2UueW1sJykpLFxuICAgICAgZG9lc0NvbnRhaW5HZW1maWxlOiBmcy5leGlzdHNTeW5jKHBhdGgucmVzb2x2ZShkaXJQYXRoLCAnR2VtZmlsZScpKSxcbiAgICAgIGRvZXNDb250YWluR29Nb2Q6IGZzLmV4aXN0c1N5bmMocGF0aC5yZXNvbHZlKGRpclBhdGgsICdnby5tb2QnKSksXG4gICAgICBkb2VzQ29udGFpblBhY2thZ2VKc29uOiBmcy5leGlzdHNTeW5jKHBhdGgucmVzb2x2ZShkaXJQYXRoLCAncGFja2FnZS5qc29uJykpLFxuICAgICAgZG9lc0NvbnRhaW5Qb2V0cnlMb2NrOiBmcy5leGlzdHNTeW5jKHBhdGgucmVzb2x2ZShkaXJQYXRoLCAncG9ldHJ5LmxvY2snKSksXG4gICAgICBkb2VzQ29udGFpblV2TG9jazogZnMuZXhpc3RzU3luYyhwYXRoLnJlc29sdmUoZGlyUGF0aCwgJ3V2LmxvY2snKSksXG4gICAgICBkb2VzQ29udGFpblBvbVhtbDogZnMuZXhpc3RzU3luYyhwYXRoLnJlc29sdmUoZGlyUGF0aCwgJ3BvbS54bWwnKSksXG4gICAgICBkb2VzQ29udGFpblB1YnNwZWNZYW1sOiBmcy5leGlzdHNTeW5jKHBhdGgucmVzb2x2ZShkaXJQYXRoLCAncHVic3BlYy55YW1sJykpLFxuICAgICAgZG9lc0NvbnRhaW5UZW1wbGF0ZVlhbWw6IGZzLmV4aXN0c1N5bmMocGF0aC5yZXNvbHZlKGRpclBhdGgsICd0ZW1wbGF0ZS55YW1sJykpLFxuICAgICAgZG9lc0NvbnRhaW5Wc2NvZGVTZXR0aW5nc0pzb246IGZzLmV4aXN0c1N5bmMocGF0aC5yZXNvbHZlKGRpclBhdGgsICcudnNjb2RlJywgJ3NldHRpbmdzLmpzb24nKSksXG4gICAgICBkb2VzQ29udGFpbkphdmFTY3JpcHQ6IGNvbnRhaW5zQW55KCd7YXBwLHNyYyx0ZXN0LHNjcmlwdHN9LyoqLyoue2NqcyxtanMsanMsanN4fScsIGRpclBhdGgpLFxuICAgICAgZG9lc0NvbnRhaW5UeXBlU2NyaXB0OiBjb250YWluc0FueSgne2FwcCxzcmMsdGVzdCxzY3JpcHRzfS8qKi8qLntjdHMsbXRzLHRzLHRzeH0nLCBkaXJQYXRoKSxcbiAgICAgIGRvZXNDb250YWluSnN4T3JUc3g6IGNvbnRhaW5zQW55KCd7YXBwLHNyYyx0ZXN0fS8qKi8qLnt0LGp9c3gnLCBkaXJQYXRoKSxcbiAgICAgIGRvZXNDb250YWluSmF2YTogY29udGFpbnNBbnkoJyoqLyouamF2YScsIGRpclBhdGgpLFxuICAgICAgZG9lc0NvbnRhaW5KYXZhU2NyaXB0SW5QYWNrYWdlczogY29udGFpbnNBbnkoJ3BhY2thZ2VzLyoqL3thcHAsc3JjLHRlc3Qsc2NyaXB0c30vKiovKi57Y2pzLG1qcyxqcyxqc3h9JywgZGlyUGF0aCksXG4gICAgICBkb2VzQ29udGFpblR5cGVTY3JpcHRJblBhY2thZ2VzOiBjb250YWluc0FueSgncGFja2FnZXMvKiove2FwcCxzcmMsdGVzdCxzY3JpcHRzfS8qKi8qLntjdHMsbXRzLHRzLHRzeH0nLCBkaXJQYXRoKSxcbiAgICAgIGRvZXNDb250YWluSnN4T3JUc3hJblBhY2thZ2VzOiBjb250YWluc0FueSgncGFja2FnZXMvKiove2FwcCxzcmMsdGVzdH0vKiovKi57dCxqfXN4JywgZGlyUGF0aCksXG4gICAgICBkb2VzQ29udGFpbkphdmFJblBhY2thZ2VzOiBjb250YWluc0FueSgncGFja2FnZXMvKiovKi5qYXZhJywgZGlyUGF0aCksXG4gICAgICBkZXBlbmRpbmc6IHtcbiAgICAgICAgYmxpdHo6ICEhZGVwZW5kZW5jaWVzLmJsaXR6LFxuICAgICAgICBjaGFrcmE6ICEhZGV2RGVwZW5kZW5jaWVzWydAY2hha3JhLXVpL2NsaSddLFxuICAgICAgICBkcml6emxlOiAhIWRlcGVuZGVuY2llc1snZHJpenpsZS1vcm0nXSB8fCAhIWRldkRlcGVuZGVuY2llc1snZHJpenpsZS1raXQnXSxcbiAgICAgICAgZmlyZWJhc2U6ICEhZGV2RGVwZW5kZW5jaWVzWydmaXJlYmFzZS10b29scyddLFxuICAgICAgICBnZW5JMThuVHM6ICEhZGVwZW5kZW5jaWVzWydnZW4taTE4bi10cyddIHx8ICEhZGV2RGVwZW5kZW5jaWVzWydnZW4taTE4bi10cyddLFxuICAgICAgICBsaXRlc3RyZWFtOiBkb2NrZXJmaWxlLmluY2x1ZGVzKCdpbnN0YWxsLWxpdGVzdHJlYW0uc2gnKSxcbiAgICAgICAgcmVhY3Q6ICEhZGVwZW5kZW5jaWVzLnJlYWN0LFxuICAgICAgICBuZXh0OiAhIWRlcGVuZGVuY2llcy5uZXh0LFxuICAgICAgICBwbGF5d3JpZ2h0VGVzdDpcbiAgICAgICAgICAhIWRlcGVuZGVuY2llc1snQHBsYXl3cmlnaHQvdGVzdCddIHx8ICEhZGV2RGVwZW5kZW5jaWVzWydAcGxheXdyaWdodC90ZXN0J10gfHwgISFkZXZEZXBlbmRlbmNpZXMucGxheXdyaWdodCxcbiAgICAgICAgcHJpc21hOiAhIWRlcGVuZGVuY2llc1snQHByaXNtYS9jbGllbnQnXSB8fCAhIWRldkRlcGVuZGVuY2llcy5wcmlzbWEsXG4gICAgICAgIHB5cmlnaHQ6ICEhZGV2RGVwZW5kZW5jaWVzLnB5cmlnaHQsXG4gICAgICAgIHJlYWN0TmF0aXZlOiAhIWRlcGVuZGVuY2llc1sncmVhY3QtbmF0aXZlJ10sXG4gICAgICAgIHNlbWFudGljUmVsZWFzZTogISEoXG4gICAgICAgICAgZGV2RGVwZW5kZW5jaWVzWydzZW1hbnRpYy1yZWxlYXNlJ10gfHxcbiAgICAgICAgICByZWxlYXNlQnJhbmNoZXMubGVuZ3RoID4gMCB8fFxuICAgICAgICAgIHJlbGVhc2VQbHVnaW5zLmxlbmd0aCA+IDBcbiAgICAgICAgKSxcbiAgICAgICAgc3Rvcnlib29rOiAhIWRldkRlcGVuZGVuY2llc1snQHN0b3J5Ym9vay9yZWFjdCddLFxuICAgICAgICB3YjogISFkZXBlbmRlbmNpZXNbJ0B3aWxsYm9vc3Rlci93YiddIHx8ICEhZGV2RGVwZW5kZW5jaWVzWydAd2lsbGJvb3N0ZXIvd2InXSxcbiAgICAgIH0sXG4gICAgICByZWxlYXNlOiB7XG4gICAgICAgIGJyYW5jaGVzOiByZWxlYXNlQnJhbmNoZXMsXG4gICAgICAgIGdpdGh1YjogcmVsZWFzZVBsdWdpbnMuaW5jbHVkZXMoJ0BzZW1hbnRpYy1yZWxlYXNlL2dpdGh1YicpLFxuICAgICAgICBucG06IHJlbGVhc2VQbHVnaW5zLmluY2x1ZGVzKCdAc2VtYW50aWMtcmVsZWFzZS9ucG0nKSxcbiAgICAgIH0sXG4gICAgICBoYXNWZXJzaW9uU2V0dGluZ3MsXG4gICAgICBtaXNlVGFza3M6IGF3YWl0IHJlYWRNaXNlVGFza3MoZGlyUGF0aCksXG4gICAgICBwYWNrYWdlSnNvbixcbiAgICAgIHdiZnlKc29uLFxuICAgIH07XG4gICAgaWYgKFxuICAgICAgY29uZmlnLmRvZXNDb250YWluR2VtZmlsZSB8fFxuICAgICAgY29uZmlnLmRvZXNDb250YWluR29Nb2QgfHxcbiAgICAgIGNvbmZpZy5kb2VzQ29udGFpblBhY2thZ2VKc29uIHx8XG4gICAgICBjb25maWcuZG9lc0NvbnRhaW5Qb2V0cnlMb2NrIHx8XG4gICAgICBjb25maWcuZG9lc0NvbnRhaW5VdkxvY2sgfHxcbiAgICAgIGNvbmZpZy5kb2VzQ29udGFpblBvbVhtbCB8fFxuICAgICAgY29uZmlnLmRvZXNDb250YWluUHVic3BlY1lhbWwgfHxcbiAgICAgIGNvbmZpZy5kb2VzQ29udGFpblRlbXBsYXRlWWFtbFxuICAgICkge1xuICAgICAgcmV0dXJuIGNvbmZpZztcbiAgICB9XG4gIH0gY2F0Y2gge1xuICAgIC8vIGRvIG5vdGhpbmdcbiAgfVxufVxuXG5mdW5jdGlvbiBoYXNWZXJzaW9uU2V0dGluZ3NGaWxlKGRpclBhdGg6IHN0cmluZyk6IGJvb2xlYW4ge1xuICBjb25zdCBjdXJyZW50ID0gcGF0aC5yZXNvbHZlKGRpclBhdGgpO1xuICByZXR1cm4gKFxuICAgIGZzLmV4aXN0c1N5bmMocGF0aC5qb2luKGN1cnJlbnQsICdtaXNlLnRvbWwnKSkgfHxcbiAgICBmcy5leGlzdHNTeW5jKHBhdGguam9pbihjdXJyZW50LCAnLm1pc2UudG9tbCcpKSB8fFxuICAgIGZzLmV4aXN0c1N5bmMocGF0aC5qb2luKGN1cnJlbnQsICcudG9vbC12ZXJzaW9ucycpKVxuICApO1xufVxuXG5hc3luYyBmdW5jdGlvbiByZWFkTWlzZVRhc2tzKGRpclBhdGg6IHN0cmluZyk6IFByb21pc2U8UmVjb3JkPHN0cmluZywgc3RyaW5nPj4ge1xuICBjb25zdCB0YXNrczogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHt9O1xuICBmb3IgKGNvbnN0IGZpbGVOYW1lIG9mIFsnbWlzZS50b21sJywgJy5taXNlLnRvbWwnXSkge1xuICAgIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKGRpclBhdGgsIGZpbGVOYW1lKTtcbiAgICB0cnkge1xuICAgICAgY29uc3Qgc2V0dGluZ3MgPSBwYXJzZVRvbWwoYXdhaXQgZnNwLnJlYWRGaWxlKGZpbGVQYXRoLCAndXRmOCcpKSBhcyB7IHRhc2tzPzogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gfTtcbiAgICAgIGZvciAoY29uc3QgW25hbWUsIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhzZXR0aW5ncy50YXNrcyA/PyB7fSkpIHtcbiAgICAgICAgdGFza3NbbmFtZV0gPSByZWFkTWlzZVRhc2tDb21tYW5kKHZhbHVlKTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIE1pc3Npbmcgb3IgdGVtcG9yYXJpbHkgaW52YWxpZCBtaXNlIGZpbGVzIHNob3VsZCBub3QgYmxvY2sgb3RoZXIgd2JmeSBnZW5lcmF0b3JzLlxuICAgIH1cbiAgfVxuICByZXR1cm4gdGFza3M7XG59XG5cbmZ1bmN0aW9uIHJlYWRNaXNlVGFza0NvbW1hbmQodmFsdWU6IHVua25vd24pOiBzdHJpbmcge1xuICBpZiAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJykgcmV0dXJuIHZhbHVlO1xuICAvLyBQcmVzZXJ2ZSBhcnJheS1mb3JtIG1pc2UgY29tbWFuZHMgc28gcmVjdXJzaW9uIGNoZWNrcyBjYW4gc3RpbGwgc2VlIHBhY2thZ2Ugc2NyaXB0IGNhbGxzLlxuICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHJldHVybiB2YWx1ZS5maWx0ZXIoKGNvbW1hbmQpOiBjb21tYW5kIGlzIHN0cmluZyA9PiB0eXBlb2YgY29tbWFuZCA9PT0gJ3N0cmluZycpLmpvaW4oJ1xcbicpO1xuICBpZiAodmFsdWUgJiYgdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JykgcmV0dXJuIHJlYWRNaXNlVGFza0NvbW1hbmQoKHZhbHVlIGFzIHsgcnVuPzogdW5rbm93biB9KS5ydW4pO1xuICByZXR1cm4gJyc7XG59XG5cbmZ1bmN0aW9uIGNvbnRhaW5zQW55KHBhdHRlcm46IHN0cmluZywgZGlyUGF0aDogc3RyaW5nKTogYm9vbGVhbiB7XG4gIHJldHVybiBmZy5nbG9iU3luYyhwYXR0ZXJuLCB7IGRvdDogdHJ1ZSwgY3dkOiBkaXJQYXRoLCBpZ25vcmU6IGdsb2JJZ25vcmUgfSkubGVuZ3RoID4gMDtcbn1cblxuYXN5bmMgZnVuY3Rpb24gZmV0Y2hSZXBvSW5mbyhkaXJQYXRoOiBzdHJpbmcsIHBhY2thZ2VKc29uOiBQYWNrYWdlSnNvbik6IFByb21pc2U8UmVjb3JkPHN0cmluZywgdW5rbm93bj4gfCB1bmRlZmluZWQ+IHtcbiAgY29uc3QgZ2l0ID0gc2ltcGxlR2l0KGRpclBhdGgpO1xuICBjb25zdCByZW1vdGVzID0gYXdhaXQgZ2l0LmdldFJlbW90ZXModHJ1ZSk7XG4gIGNvbnN0IG9yaWdpbiA9IHJlbW90ZXMuZmluZCgocikgPT4gci5uYW1lID09PSAnb3JpZ2luJyk7XG4gIGNvbnN0IHJlbW90ZVVybCA9IG9yaWdpbj8ucmVmcy5mZXRjaCA/PyBvcmlnaW4/LnJlZnMucHVzaDtcbiAgaWYgKHR5cGVvZiByZW1vdGVVcmwgPT09ICdzdHJpbmcnKSB7XG4gICAgY29uc3QganNvbiA9IGF3YWl0IHJlcXVlc3RSZXBvSW5mbyhyZW1vdGVVcmwpO1xuICAgIGlmIChqc29uKSByZXR1cm4ganNvbjtcbiAgfVxuXG4gIGNvbnN0IHVybCA9IHR5cGVvZiBwYWNrYWdlSnNvbi5yZXBvc2l0b3J5ID09PSAnc3RyaW5nJyA/IHBhY2thZ2VKc29uLnJlcG9zaXRvcnkgOiBwYWNrYWdlSnNvbi5yZXBvc2l0b3J5Py51cmw7XG4gIGlmICh1cmwpIHtcbiAgICBjb25zdCBqc29uID0gYXdhaXQgcmVxdWVzdFJlcG9JbmZvKHVybCk7XG4gICAgaWYgKGpzb24gJiYganNvbi5tZXNzYWdlICE9PSAnTm90IEZvdW5kJykgcmV0dXJuIGpzb247XG4gIH1cbn1cblxuYXN5bmMgZnVuY3Rpb24gcmVxdWVzdFJlcG9JbmZvKHVybE9yRnVsbE5hbWU6IHN0cmluZyk6IFByb21pc2U8UmVjb3JkPHN0cmluZywgdW5rbm93bj4gfCB1bmRlZmluZWQ+IHtcbiAgY29uc3QgW29yZywgbmFtZV0gPSBnaXRIdWJVdGlsLmdldE9yZ0FuZE5hbWUodXJsT3JGdWxsTmFtZSk7XG4gIGlmICghb3JnIHx8ICFuYW1lKSByZXR1cm47XG5cbiAgdHJ5IHtcbiAgICAvLyBNZXRhZGF0YSBwZXJtaXNzaW9uXG4gICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBnZXRPY3Rva2l0KCkucmVxdWVzdCgnR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfScsIHtcbiAgICAgIG93bmVyOiBvcmcsXG4gICAgICByZXBvOiBuYW1lLFxuICAgIH0pO1xuICAgIHJldHVybiByZXNwb25zZS5kYXRhO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGNvbnN0IHJlZGlyZWN0ZWRGdWxsTmFtZSA9IGdldFJlZGlyZWN0ZWRSZXBvRnVsbE5hbWUoZXJyb3IpO1xuICAgIGlmIChyZWRpcmVjdGVkRnVsbE5hbWUpIHtcbiAgICAgIHJldHVybiB7IGZ1bGxfbmFtZTogcmVkaXJlY3RlZEZ1bGxOYW1lIH07XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGdldFJlZGlyZWN0ZWRSZXBvRnVsbE5hbWUoZXJyb3I6IHVua25vd24pOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBpZiAoIWVycm9yIHx8IHR5cGVvZiBlcnJvciAhPT0gJ29iamVjdCcpIHJldHVybjtcblxuICBjb25zdCByZXNwb25zZSA9XG4gICAgJ3Jlc3BvbnNlJyBpbiBlcnJvclxuICAgICAgPyAoZXJyb3IgYXMgeyByZXNwb25zZT86IHsgc3RhdHVzPzogbnVtYmVyOyBoZWFkZXJzPzogUmVjb3JkPHN0cmluZywgc3RyaW5nIHwgdW5kZWZpbmVkPiB9IH0pLnJlc3BvbnNlXG4gICAgICA6IHVuZGVmaW5lZDtcbiAgY29uc3Qgc3RhdHVzID0gcmVzcG9uc2U/LnN0YXR1cyA/PyAoZXJyb3IgYXMgeyBzdGF0dXM/OiBudW1iZXIgfSkuc3RhdHVzO1xuICBpZiAoc3RhdHVzICE9PSAzMDEgJiYgc3RhdHVzICE9PSAzMDIpIHJldHVybjtcblxuICBjb25zdCBsb2NhdGlvbiA9IHJlc3BvbnNlPy5oZWFkZXJzPy5sb2NhdGlvbjtcbiAgaWYgKHR5cGVvZiBsb2NhdGlvbiAhPT0gJ3N0cmluZycpIHJldHVybjtcblxuICBjb25zdCBbb3JnLCBuYW1lXSA9IGdpdEh1YlV0aWwuZ2V0T3JnQW5kTmFtZShsb2NhdGlvbik7XG4gIGlmICghb3JnIHx8ICFuYW1lKSByZXR1cm47XG5cbiAgcmV0dXJuIGAke29yZ30vJHtuYW1lfWA7XG59XG4iLCJpbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcblxuY29uc3QgZGVwZW5kZW5jeVNlY3Rpb25LZXlzID0gWydkZXBlbmRlbmNpZXMnLCAnZGV2RGVwZW5kZW5jaWVzJywgJ29wdGlvbmFsRGVwZW5kZW5jaWVzJywgJ3BlZXJEZXBlbmRlbmNpZXMnXSBhcyBjb25zdDtcbmNvbnN0IGFsbG93ZWRHaXRIdWJPcmdhbml6YXRpb25QYXR0ZXJuID0gU3RyaW5nLnJhd2AoPzpXaWxsQm9vc3RlcnxXaWxsQm9vc3RlckxhYilgO1xuY29uc3QgYWxsb3dlZEdpdERlcGVuZGVuY3lQYXR0ZXJucyA9IFtcbiAgbmV3IFJlZ0V4cChgXiR7YWxsb3dlZEdpdEh1Yk9yZ2FuaXphdGlvblBhdHRlcm59L1teI1xcXFxzXSsoPzojXFxcXFMrKT8kYCwgJ3UnKSxcbiAgbmV3IFJlZ0V4cChgXmdpdGh1Yjoke2FsbG93ZWRHaXRIdWJPcmdhbml6YXRpb25QYXR0ZXJufS9bXiNcXFxcc10rKD86I1xcXFxTKyk/JGAsICd1JyksXG4gIG5ldyBSZWdFeHAoXG4gICAgYF4oPzpnaXRcXFxcKyk/aHR0cHM6Ly9naXRodWJcXFxcLmNvbS8ke2FsbG93ZWRHaXRIdWJPcmdhbml6YXRpb25QYXR0ZXJufS9bXiNcXFxcc10rKD86XFxcXC5naXQpPyg/OiNcXFxcUyspPyRgLFxuICAgICd1J1xuICApLFxuICBuZXcgUmVnRXhwKFxuICAgIGBeKD86Z2l0XFxcXCspP3NzaDovL2dpdEBnaXRodWJcXFxcLmNvbVs6L10ke2FsbG93ZWRHaXRIdWJPcmdhbml6YXRpb25QYXR0ZXJufS9bXiNcXFxcc10rKD86XFxcXC5naXQpPyg/OiNcXFxcUyspPyRgLFxuICAgICd1J1xuICApLFxuICBuZXcgUmVnRXhwKGBeKD86Z2l0XFxcXCspP2dpdEBnaXRodWJcXFxcLmNvbToke2FsbG93ZWRHaXRIdWJPcmdhbml6YXRpb25QYXR0ZXJufS9bXiNcXFxcc10rKD86XFxcXC5naXQpPyg/OiNcXFxcUyspPyRgLCAndScpLFxuXTtcblxuaW50ZXJmYWNlIERpc2FsbG93ZWREZXBlbmRlbmN5U291cmNlIHtcbiAgZGVwZW5kZW5jeU5hbWU6IHN0cmluZztcbiAgZGlyUGF0aDogc3RyaW5nO1xuICBzZWN0aW9uTmFtZTogKHR5cGVvZiBkZXBlbmRlbmN5U2VjdGlvbktleXMpW251bWJlcl07XG4gIHNwZWNpZmllcjogc3RyaW5nO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gYXNzZXJ0U2FmZURlcGVuZGVuY3lTb3VyY2VzKGNvbmZpZ3M6IFBhY2thZ2VDb25maWdbXSk6IHZvaWQge1xuICBjb25zdCBkaXNhbGxvd2VkU291cmNlcyA9IGNvbmZpZ3MuZmxhdE1hcChnZXREaXNhbGxvd2VkRGVwZW5kZW5jeVNvdXJjZXMpO1xuICBpZiAoZGlzYWxsb3dlZFNvdXJjZXMubGVuZ3RoID09PSAwKSByZXR1cm47XG5cbiAgY29uc3QgZGV0YWlscyA9IGRpc2FsbG93ZWRTb3VyY2VzXG4gICAgLm1hcChcbiAgICAgICh7IGRlcGVuZGVuY3lOYW1lLCBkaXJQYXRoLCBzZWN0aW9uTmFtZSwgc3BlY2lmaWVyIH0pID0+XG4gICAgICAgIGAtICR7cGF0aC5qb2luKGRpclBhdGgsICdwYWNrYWdlLmpzb24nKX06ICR7c2VjdGlvbk5hbWV9LiR7ZGVwZW5kZW5jeU5hbWV9IHVzZXMgJHtzcGVjaWZpZXJ9YFxuICAgIClcbiAgICAuam9pbignXFxuJyk7XG5cbiAgdGhyb3cgbmV3IEVycm9yKFxuICAgIGBEaXNhbGxvd2VkIEdpdCBkZXBlbmRlbmN5IHNvdXJjZXMgZm91bmQuXFxuT25seSBXaWxsQm9vc3RlciBhbmQgV2lsbEJvb3N0ZXJMYWIgR2l0SHViIGRlcGVuZGVuY2llcyBhcmUgYWxsb3dlZC5cXG4ke2RldGFpbHN9YFxuICApO1xufVxuXG5mdW5jdGlvbiBnZXREaXNhbGxvd2VkRGVwZW5kZW5jeVNvdXJjZXMoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogRGlzYWxsb3dlZERlcGVuZGVuY3lTb3VyY2VbXSB7XG4gIGNvbnN0IHBhY2thZ2VKc29uID0gY29uZmlnLnBhY2thZ2VKc29uO1xuICBpZiAoIXBhY2thZ2VKc29uKSByZXR1cm4gW107XG5cbiAgY29uc3QgZGlzYWxsb3dlZFNvdXJjZXM6IERpc2FsbG93ZWREZXBlbmRlbmN5U291cmNlW10gPSBbXTtcbiAgZm9yIChjb25zdCBzZWN0aW9uTmFtZSBvZiBkZXBlbmRlbmN5U2VjdGlvbktleXMpIHtcbiAgICBjb25zdCBzZWN0aW9uID0gcGFja2FnZUpzb25bc2VjdGlvbk5hbWVdO1xuICAgIGlmICghc2VjdGlvbikgY29udGludWU7XG5cbiAgICBmb3IgKGNvbnN0IFtkZXBlbmRlbmN5TmFtZSwgc3BlY2lmaWVyXSBvZiBPYmplY3QuZW50cmllcyhzZWN0aW9uKSkge1xuICAgICAgaWYgKCFzcGVjaWZpZXIpIGNvbnRpbnVlO1xuICAgICAgaWYgKCFpc0dpdERlcGVuZGVuY3lTcGVjaWZpZXIoc3BlY2lmaWVyKSkgY29udGludWU7XG4gICAgICBpZiAoaXNBbGxvd2VkR2l0RGVwZW5kZW5jeVNwZWNpZmllcihzcGVjaWZpZXIpKSBjb250aW51ZTtcblxuICAgICAgZGlzYWxsb3dlZFNvdXJjZXMucHVzaCh7XG4gICAgICAgIGRlcGVuZGVuY3lOYW1lLFxuICAgICAgICBkaXJQYXRoOiBjb25maWcuZGlyUGF0aCxcbiAgICAgICAgc2VjdGlvbk5hbWUsXG4gICAgICAgIHNwZWNpZmllcixcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuICByZXR1cm4gZGlzYWxsb3dlZFNvdXJjZXM7XG59XG5cbmZ1bmN0aW9uIGlzR2l0RGVwZW5kZW5jeVNwZWNpZmllcihzcGVjaWZpZXI6IHN0cmluZyk6IGJvb2xlYW4ge1xuICByZXR1cm4gKFxuICAgIGlzR2l0SHViU2hvcnRoYW5kU3BlY2lmaWVyKHNwZWNpZmllcikgfHxcbiAgICAvXig/OmJpdGJ1Y2tldHxnaXN0fGdpdGh1YnxnaXRsYWIpOi91LnRlc3Qoc3BlY2lmaWVyKSB8fFxuICAgIC9eaHR0cHM/OlxcL1xcLyg/OmJpdGJ1Y2tldFxcLm9yZ3xnaXRodWJcXC5jb218Z2l0bGFiXFwuY29tKVxcLy91LnRlc3Qoc3BlY2lmaWVyKSB8fFxuICAgIC9eKD86aHR0cHM/fHNzaCk6XFwvXFwvXFxTK1xcLmdpdCg/OiNcXFMrKT8kL3UudGVzdChzcGVjaWZpZXIpIHx8XG4gICAgL15bXkBcXHNdK0BbXjpcXHNdKzpcXFMrKD86I1xcUyspPyQvdS50ZXN0KHNwZWNpZmllcikgfHxcbiAgICBzcGVjaWZpZXIuc3RhcnRzV2l0aCgnZ2l0OicpIHx8XG4gICAgc3BlY2lmaWVyLnN0YXJ0c1dpdGgoJ2dpdCsnKSB8fFxuICAgIHNwZWNpZmllci5zdGFydHNXaXRoKCdzc2g6Ly9naXRAJylcbiAgKTtcbn1cblxuZnVuY3Rpb24gaXNHaXRIdWJTaG9ydGhhbmRTcGVjaWZpZXIoc3BlY2lmaWVyOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgcmV0dXJuIC9eW2EtekEtWjAtOV1bXFx3Li1dKlxcL1tcXHcuLV0rKD86I1xcUyspPyQvdS50ZXN0KHNwZWNpZmllcik7XG59XG5cbmZ1bmN0aW9uIGlzQWxsb3dlZEdpdERlcGVuZGVuY3lTcGVjaWZpZXIoc3BlY2lmaWVyOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgcmV0dXJuIGFsbG93ZWRHaXREZXBlbmRlbmN5UGF0dGVybnMuc29tZSgocGF0dGVybikgPT4gcGF0dGVybi50ZXN0KHNwZWNpZmllcikpO1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHsgaWdub3JlRXJyb3JBc3luYyB9IGZyb20gJ0B3aWxsYm9vc3Rlci9zaGFyZWQtbGliL3NyYyc7XG5pbXBvcnQgeWFyZ3MgZnJvbSAneWFyZ3MnO1xuXG5pbXBvcnQgeyBmaXhOZXh0Q29uZmlnSnNvbiB9IGZyb20gJy4vZml4ZXJzL25leHRDb25maWcuanMnO1xuaW1wb3J0IHsgZml4UGxheXdyaWdodENvbmZpZyB9IGZyb20gJy4vZml4ZXJzL3BsYXl3cmlnaHRDb25maWcuanMnO1xuaW1wb3J0IHsgZml4UHJpc21hRW52RmlsZXMgfSBmcm9tICcuL2ZpeGVycy9wcmlzbWEuanMnO1xuaW1wb3J0IHsgZml4VGVzdERpcmVjdG9yaWVzVXBkYXRpbmdQYWNrYWdlSnNvbiB9IGZyb20gJy4vZml4ZXJzL3Rlc3REaXJlY3RvcnkuanMnO1xuaW1wb3J0IHsgZml4VHlwZURlZmluaXRpb25zIH0gZnJvbSAnLi9maXhlcnMvdHlwZURlZmluaXRpb24uanMnO1xuaW1wb3J0IHsgZml4VHlwb3MgfSBmcm9tICcuL2ZpeGVycy90eXBvcy5qcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZUFnZW50SW5zdHJ1Y3Rpb25zIH0gZnJvbSAnLi9nZW5lcmF0b3JzL2FnZW50cy5qcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZUJ1bmZpZ1RvbWwgfSBmcm9tICcuL2dlbmVyYXRvcnMvYnVuZmlnLmpzJztcbmltcG9ydCB7IGdlbmVyYXRlRG9ja2VyaWdub3JlIH0gZnJvbSAnLi9nZW5lcmF0b3JzL2RvY2tlcmlnbm9yZS5qcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZUVkaXRvcmNvbmZpZyB9IGZyb20gJy4vZ2VuZXJhdG9ycy9lZGl0b3Jjb25maWcuanMnO1xuaW1wb3J0IHsgZ2VuZXJhdGVHZW1pbmlDb25maWcgfSBmcm9tICcuL2dlbmVyYXRvcnMvZ2VtaW5pQ29uZmlnLmpzJztcbmltcG9ydCB7IHJlbW92ZUdlbWluaVNldHRpbmdzIH0gZnJvbSAnLi9nZW5lcmF0b3JzL2dlbWluaVNldHRpbmdzLmpzJztcbmltcG9ydCB7IGdlbmVyYXRlR2l0YXR0cmlidXRlcyB9IGZyb20gJy4vZ2VuZXJhdG9ycy9naXRhdHRyaWJ1dGVzLmpzJztcbmltcG9ydCB7IGdlbmVyYXRlR2l0aWdub3JlIH0gZnJvbSAnLi9nZW5lcmF0b3JzL2dpdGlnbm9yZS5qcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZUlkZWFTZXR0aW5ncyB9IGZyb20gJy4vZ2VuZXJhdG9ycy9pZGVhLmpzJztcbmltcG9ydCB7IGdlbmVyYXRlTGVmdGhvb2tVcGRhdGluZ1BhY2thZ2VKc29uIH0gZnJvbSAnLi9nZW5lcmF0b3JzL2xlZnRob29rLmpzJztcbmltcG9ydCB7IGdlbmVyYXRlTGludHN0YWdlZHJjIH0gZnJvbSAnLi9nZW5lcmF0b3JzL2xpbnRzdGFnZWRyYy5qcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZVBhY2thZ2VKc29uIH0gZnJvbSAnLi9nZW5lcmF0b3JzL3BhY2thZ2VKc29uLmpzJztcbmltcG9ydCB7IGdlbmVyYXRlT3hmbXRDb25maWcgfSBmcm9tICcuL2dlbmVyYXRvcnMvb3hmbXRDb25maWcuanMnO1xuaW1wb3J0IHsgZ2VuZXJhdGVPeGxpbnRDb25maWcgfSBmcm9tICcuL2dlbmVyYXRvcnMvb3hsaW50Q29uZmlnLmpzJztcbmltcG9ydCB7IGdlbmVyYXRlUHJldHRpZXJpZ25vcmUgfSBmcm9tICcuL2dlbmVyYXRvcnMvcHJldHRpZXJpZ25vcmUuanMnO1xuaW1wb3J0IHsgZ2VuZXJhdGVQeXJpZ2h0Q29uZmlnSnNvbiB9IGZyb20gJy4vZ2VuZXJhdG9ycy9weXJpZ2h0Q29uZmlnLmpzJztcbmltcG9ydCB7IGZpeFJhaWx3YXlpZ25vcmUgfSBmcm9tICcuL2dlbmVyYXRvcnMvcmFpbHdheWlnbm9yZS5qcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZVJlYWRtZSB9IGZyb20gJy4vZ2VuZXJhdG9ycy9yZWFkbWUuanMnO1xuaW1wb3J0IHsgZ2VuZXJhdGVSZWxlYXNlcmMgfSBmcm9tICcuL2dlbmVyYXRvcnMvcmVsZWFzZXJjLmpzJztcbmltcG9ydCB7IGdlbmVyYXRlUmVub3ZhdGVKc29uIH0gZnJvbSAnLi9nZW5lcmF0b3JzL3Jlbm92YXRlSnNvbi5qcyc7XG5pbXBvcnQgeyBpbnN0YWxsQWdlbnRTa2lsbHMgfSBmcm9tICcuL2dlbmVyYXRvcnMvc2tpbGxzLmpzJztcbmltcG9ydCB7IGdlbmVyYXRlVHNjb25maWcgfSBmcm9tICcuL2dlbmVyYXRvcnMvdHNjb25maWcuanMnO1xuaW1wb3J0IHsgZ2VuZXJhdGVWc2NvZGVTZXR0aW5ncyB9IGZyb20gJy4vZ2VuZXJhdG9ycy92c2NvZGVTZXR0aW5ncy5qcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZVdvcmtmbG93cywgaXNSZXVzYWJsZVdvcmtmbG93c1JlcG8gfSBmcm9tICcuL2dlbmVyYXRvcnMvd29ya2Zsb3cuanMnO1xuaW1wb3J0IHsgZ2VuZXJhdGVZYXJucmNZbWwgfSBmcm9tICcuL2dlbmVyYXRvcnMveWFybnJjLmpzJztcbmltcG9ydCB7IHNldHVwTGFiZWxzIH0gZnJvbSAnLi9naXRodWIvbGFiZWwuanMnO1xuaW1wb3J0IHsgc2V0dXBTZWNyZXRzIH0gZnJvbSAnLi9naXRodWIvc2VjcmV0LmpzJztcbmltcG9ydCB7IHNldHVwR2l0SHViU2V0dGluZ3MgfSBmcm9tICcuL2dpdGh1Yi9zZXR0aW5ncy5qcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZUdpdEh1YlRlbXBsYXRlcyB9IGZyb20gJy4vZ2l0aHViL3RlbXBsYXRlLmpzJztcbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4vbG9nZ2VyLmpzJztcbmltcG9ydCB7IG9wdGlvbnMgfSBmcm9tICcuL29wdGlvbnMuanMnO1xuaW1wb3J0IHsgZ2V0UGFja2FnZUNvbmZpZyB9IGZyb20gJy4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBhc3NlcnRTYWZlRGVwZW5kZW5jeVNvdXJjZXMgfSBmcm9tICcuL3V0aWxzL2RlcGVuZGVuY3lTb3VyY2VQb2xpY3kuanMnO1xuaW1wb3J0IHsgZG9lc0NvbnRhaW5Kc09yVHMgfSBmcm9tICcuL3V0aWxzL3BhY2thZ2VDYXBhYmlsaXRpZXMuanMnO1xuaW1wb3J0IHsgcHJvbWlzZVBvb2wgfSBmcm9tICcuL3V0aWxzL3Byb21pc2VQb29sLmpzJztcbmltcG9ydCB7IHNwYXduU3luYywgc3Bhd25TeW5jQW5kUmV0dXJuU3RhdHVzIH0gZnJvbSAnLi91dGlscy9zcGF3blV0aWwuanMnO1xuXG5hc3luYyBmdW5jdGlvbiBtYWluKCk6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBhcmd2ID0gYXdhaXQgeWFyZ3MocHJvY2Vzcy5hcmd2LnNsaWNlKDIpKVxuICAgIC5jb21tYW5kKCckMCBbcGF0aHMuLl0nLCAnTWFrZSBhIGdpdmVuIHByb2plY3QgZm9sbG93IHRoZSBXaWxsQm9vc3RlciBzdGFuZGFyZCcsICh5YXJncykgPT4ge1xuICAgICAgeWFyZ3MucG9zaXRpb25hbCgncGF0aHMnLCB7XG4gICAgICAgIGRlc2NyaWJlOiAncHJvamVjdCBwYXRocyB0byBiZSB3YmZpZWQnLFxuICAgICAgICBhcnJheTogdHJ1ZSxcbiAgICAgICAgdHlwZTogJ3N0cmluZycsXG4gICAgICAgIGRlZmF1bHQ6IFsnLiddLFxuICAgICAgfSk7XG4gICAgfSlcbiAgICAub3B0aW9ucyh7XG4gICAgICBlbnY6IHtcbiAgICAgICAgZGVzY3JpcHRpb246ICdVcGxvYWQgZW52aXJvbm1lbnQgdmFyaWFibGVzIGFzIHNlY3JldHMgdG8gR2l0SHViJyxcbiAgICAgICAgdHlwZTogJ2Jvb2xlYW4nLFxuICAgICAgICBkZWZhdWx0OiBmYWxzZSxcbiAgICAgICAgYWxpYXM6ICdlJyxcbiAgICAgIH0sXG4gICAgICBza2lwRGVwczoge1xuICAgICAgICBkZXNjcmlwdGlvbjogJ1NraXAgZGVwZW5kZW5jeSBpbnN0YWxsYXRpb24nLFxuICAgICAgICB0eXBlOiAnYm9vbGVhbicsXG4gICAgICAgIGRlZmF1bHQ6IGZhbHNlLFxuICAgICAgICBhbGlhczogJ2QnLFxuICAgICAgfSxcbiAgICAgIHZlcmJvc2U6IHtcbiAgICAgICAgZGVzY3JpcHRpb246ICdXaGV0aGVyIG9yIG5vdCB0byBlbmFibGUgdmVyYm9zZSBtb2RlJyxcbiAgICAgICAgdHlwZTogJ2Jvb2xlYW4nLFxuICAgICAgICBkZWZhdWx0OiBmYWxzZSxcbiAgICAgICAgYWxpYXM6ICd2JyxcbiAgICAgIH0sXG4gICAgfSlcbiAgICAudmVyc2lvbihnZXRWZXJzaW9uKCkpXG4gICAgLnN0cmljdCgpLmFyZ3Y7XG4gIG9wdGlvbnMuaXNWZXJib3NlID0gYXJndi52ZXJib3NlO1xuICBvcHRpb25zLmRvZXNVcGxvYWRFbnZWYXJzID0gYXJndi5lbnY7XG5cbiAgbGV0IGhhc0ludmFsaWRQYWNrYWdlQ29uZmlnID0gZmFsc2U7XG4gIGZvciAoY29uc3Qgcm9vdERpclBhdGggb2YgYXJndi5wYXRocyBhcyBzdHJpbmdbXSkge1xuICAgIGNvbnN0IHBhY2thZ2VzRGlyUGF0aCA9IHBhdGguam9pbihyb290RGlyUGF0aCwgJ3BhY2thZ2VzJyk7XG4gICAgY29uc3QgZGlyZW50cyA9IChhd2FpdCBpZ25vcmVFcnJvckFzeW5jKCgpID0+IGZzLnByb21pc2VzLnJlYWRkaXIocGFja2FnZXNEaXJQYXRoLCB7IHdpdGhGaWxlVHlwZXM6IHRydWUgfSkpKSA/PyBbXTtcbiAgICBjb25zdCBzdWJEaXJQYXRocyA9IGRpcmVudHMuZmlsdGVyKChkKSA9PiBkLmlzRGlyZWN0b3J5KCkpLm1hcCgoZCkgPT4gcGF0aC5qb2luKHBhY2thZ2VzRGlyUGF0aCwgZC5uYW1lKSk7XG5cbiAgICBhd2FpdCBmaXhUZXN0RGlyZWN0b3JpZXNVcGRhdGluZ1BhY2thZ2VKc29uKFtyb290RGlyUGF0aCwgLi4uc3ViRGlyUGF0aHNdKTtcblxuICAgIGNvbnN0IHJvb3RDb25maWcgPSBhd2FpdCBnZXRQYWNrYWdlQ29uZmlnKHJvb3REaXJQYXRoKTtcbiAgICBpZiAob3B0aW9ucy5pc1ZlcmJvc2UpIHtcbiAgICAgIGNvbnNvbGUubG9nKCdyb290Q29uZmlnOicsIHJvb3RDb25maWcpO1xuICAgIH1cbiAgICBpZiAoIXJvb3RDb25maWcpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoYHRoZXJlIGlzIG5vIHZhbGlkIHBhY2thZ2UuanNvbiBpbiAke3Jvb3REaXJQYXRofWApO1xuICAgICAgaGFzSW52YWxpZFBhY2thZ2VDb25maWcgPSB0cnVlO1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGNvbnN0IGFiYnJldmlhdGlvblByb21pc2UgPSBmaXhUeXBvcyhyb290Q29uZmlnKTtcblxuICAgIGNvbnN0IG51bGxhYmxlU3ViUGFja2FnZUNvbmZpZ3MgPSBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgIHN1YkRpclBhdGhzLm1hcCgoc3ViRGlyUGF0aCkgPT4gZ2V0UGFja2FnZUNvbmZpZyhzdWJEaXJQYXRoLCByb290Q29uZmlnKSlcbiAgICApO1xuICAgIGNvbnN0IHN1YlBhY2thZ2VDb25maWdzID0gbnVsbGFibGVTdWJQYWNrYWdlQ29uZmlncy5maWx0ZXIoKGNvbmZpZykgPT4gISFjb25maWcpO1xuICAgIGNvbnN0IGFsbFBhY2thZ2VDb25maWdzID0gW3Jvb3RDb25maWcsIC4uLnN1YlBhY2thZ2VDb25maWdzXTtcblxuICAgIGlmIChvcHRpb25zLmlzVmVyYm9zZSkge1xuICAgICAgZm9yIChjb25zdCBjb25maWcgb2YgYWxsUGFja2FnZUNvbmZpZ3MpIHtcbiAgICAgICAgY29uc29sZS5pbmZvKGNvbmZpZyk7XG4gICAgICB9XG4gICAgfVxuICAgIGFzc2VydFNhZmVEZXBlbmRlbmN5U291cmNlcyhhbGxQYWNrYWdlQ29uZmlncyk7XG5cbiAgICAvLyBJbnN0YWxsIHlhcm4gYmVycnlcbiAgICBhd2FpdCBnZW5lcmF0ZVlhcm5yY1ltbChyb290Q29uZmlnKTtcbiAgICBpZiAocm9vdENvbmZpZy5pc0J1bikge1xuICAgICAgYXdhaXQgZ2VuZXJhdGVCdW5maWdUb21sKHJvb3RDb25maWcpO1xuICAgIH1cblxuICAgIGNvbnN0IHNob3VsZFJ1bldvcmtmbG93cyA9XG4gICAgICAhaXNSZXVzYWJsZVdvcmtmbG93c1JlcG8ocm9vdENvbmZpZy5yZXBvc2l0b3J5KSAmJlxuICAgICAgKHJvb3RDb25maWcucmVwb3NpdG9yeT8uc3RhcnRzV2l0aCgnZ2l0aHViOldpbGxCb29zdGVyLycpIHx8XG4gICAgICAgIHJvb3RDb25maWcucmVwb3NpdG9yeT8uc3RhcnRzV2l0aCgnZ2l0aHViOldpbGxCb29zdGVyTGFiLycpKTtcbiAgICBhd2FpdCBQcm9taXNlLmFsbChbXG4gICAgICBmaXhQcmlzbWFFbnZGaWxlcyhyb290Q29uZmlnKSxcbiAgICAgIGFiYnJldmlhdGlvblByb21pc2UudGhlbigoKSA9PiBnZW5lcmF0ZVJlYWRtZShyb290Q29uZmlnKSksXG4gICAgICBnZW5lcmF0ZUFnZW50SW5zdHJ1Y3Rpb25zKHJvb3RDb25maWcsIGFsbFBhY2thZ2VDb25maWdzKSxcbiAgICAgIGdlbmVyYXRlRG9ja2VyaWdub3JlKHJvb3RDb25maWcpLFxuICAgICAgZ2VuZXJhdGVFZGl0b3Jjb25maWcocm9vdENvbmZpZyksXG4gICAgICBnZW5lcmF0ZUdlbWluaUNvbmZpZyhyb290Q29uZmlnLCBhbGxQYWNrYWdlQ29uZmlncyksXG4gICAgICByZW1vdmVHZW1pbmlTZXR0aW5ncyhyb290Q29uZmlnKSxcbiAgICAgIGdlbmVyYXRlR2l0YXR0cmlidXRlcyhyb290Q29uZmlnKSxcbiAgICAgIGdlbmVyYXRlR2l0SHViVGVtcGxhdGVzKHJvb3RDb25maWcpLFxuICAgICAgZ2VuZXJhdGVJZGVhU2V0dGluZ3Mocm9vdENvbmZpZyksXG4gICAgICBmaXhSYWlsd2F5aWdub3JlKHJvb3RDb25maWcpLFxuICAgICAgZ2VuZXJhdGVSZW5vdmF0ZUpzb24ocm9vdENvbmZpZyksXG4gICAgICBnZW5lcmF0ZVJlbGVhc2VyYyhyb290Q29uZmlnKSxcbiAgICAgIC4uLihzaG91bGRSdW5Xb3JrZmxvd3MgPyBbZ2VuZXJhdGVXb3JrZmxvd3Mocm9vdENvbmZpZyldIDogW10pLFxuICAgICAgc2V0dXBMYWJlbHMocm9vdENvbmZpZyksXG4gICAgICBzZXR1cFNlY3JldHMocm9vdENvbmZpZyksXG4gICAgICBzZXR1cEdpdEh1YlNldHRpbmdzKHJvb3RDb25maWcpLFxuICAgICAgZ2VuZXJhdGVMZWZ0aG9va1VwZGF0aW5nUGFja2FnZUpzb24ocm9vdENvbmZpZyksXG4gICAgICBnZW5lcmF0ZUxpbnRzdGFnZWRyYyhyb290Q29uZmlnKSxcbiAgICBdKTtcbiAgICBhd2FpdCBwcm9taXNlUG9vbC5wcm9taXNlQWxsKCk7XG5cbiAgICBjb25zdCBwcm9taXNlczogUHJvbWlzZTx2b2lkPltdID0gW107XG4gICAgZm9yIChjb25zdCBjb25maWcgb2YgYWxsUGFja2FnZUNvbmZpZ3MpIHtcbiAgICAgIGlmIChjb25maWcuZG9lc0NvbnRhaW5UeXBlU2NyaXB0IHx8IGNvbmZpZy5kb2VzQ29udGFpblR5cGVTY3JpcHRJblBhY2thZ2VzKSB7XG4gICAgICAgIHByb21pc2VzLnB1c2goZml4VHlwZURlZmluaXRpb25zKGNvbmZpZywgY29uZmlnLmlzUm9vdCA/IGFsbFBhY2thZ2VDb25maWdzIDogW2NvbmZpZ10pKTtcbiAgICAgIH1cbiAgICAgIGlmIChjb25maWcuZGVwZW5kaW5nLnBsYXl3cmlnaHRUZXN0KSB7XG4gICAgICAgIHByb21pc2VzLnB1c2goZml4UGxheXdyaWdodENvbmZpZyhjb25maWcpKTtcbiAgICAgIH1cbiAgICAgIGlmIChjb25maWcuZGVwZW5kaW5nLm5leHQpIHtcbiAgICAgICAgcHJvbWlzZXMucHVzaChmaXhOZXh0Q29uZmlnSnNvbihjb25maWcpKTtcbiAgICAgIH1cbiAgICAgIGF3YWl0IGdlbmVyYXRlR2l0aWdub3JlKGNvbmZpZywgcm9vdENvbmZpZyk7XG4gICAgICBhd2FpdCBwcm9taXNlUG9vbC5wcm9taXNlQWxsKCk7XG4gICAgICBpZiAoIWNvbmZpZy5pc1Jvb3QgJiYgIWNvbmZpZy5kb2VzQ29udGFpblBhY2thZ2VKc29uKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgYXdhaXQgZ2VuZXJhdGVQcmV0dGllcmlnbm9yZShjb25maWcpO1xuICAgICAgYXdhaXQgZ2VuZXJhdGVQYWNrYWdlSnNvbihjb25maWcsIHJvb3RDb25maWcsIGFyZ3Yuc2tpcERlcHMpO1xuXG4gICAgICBwcm9taXNlcy5wdXNoKGdlbmVyYXRlTGludHN0YWdlZHJjKGNvbmZpZykpO1xuICAgICAgaWYgKGNvbmZpZy5kb2VzQ29udGFpblZzY29kZVNldHRpbmdzSnNvbiAmJiBjb25maWcuZG9lc0NvbnRhaW5QYWNrYWdlSnNvbikge1xuICAgICAgICBwcm9taXNlcy5wdXNoKGdlbmVyYXRlVnNjb2RlU2V0dGluZ3MoY29uZmlnKSk7XG4gICAgICB9XG4gICAgICBpZiAoY29uZmlnLmRvZXNDb250YWluVHlwZVNjcmlwdCB8fCBjb25maWcuZG9lc0NvbnRhaW5UeXBlU2NyaXB0SW5QYWNrYWdlcykge1xuICAgICAgICBwcm9taXNlcy5wdXNoKGdlbmVyYXRlVHNjb25maWcoY29uZmlnKSk7XG4gICAgICB9XG4gICAgICBpZiAoZG9lc0NvbnRhaW5Kc09yVHMoY29uZmlnKSkge1xuICAgICAgICBwcm9taXNlcy5wdXNoKGdlbmVyYXRlT3hmbXRDb25maWcoY29uZmlnKSk7XG4gICAgICAgIHByb21pc2VzLnB1c2goZ2VuZXJhdGVPeGxpbnRDb25maWcoY29uZmlnLCByb290Q29uZmlnKSk7XG4gICAgICB9IGVsc2UgaWYgKCFjb25maWcuaXNSb290ICYmIGNvbmZpZy5kb2VzQ29udGFpblBhY2thZ2VKc29uICYmIGRvZXNDb250YWluSnNPclRzKHJvb3RDb25maWcpKSB7XG4gICAgICAgIC8vIE1vbm9yZXBvIHZlcmlmaWNhdGlvbiBjYW4gaW52b2tlIG94bGludCBmcm9tIGV2ZXJ5IHdvcmtzcGFjZS4gR2l2ZVxuICAgICAgICAvLyBub24tY29kZSBwYWNrYWdlcyBhIGxvY2FsIGNvbmZpZyBzbyBveGxpbnQgZG9lcyBub3QgY2xpbWIgdG8gdGhlXG4gICAgICAgIC8vIHJvb3QgY29uZmlnIGFuZCByZWplY3Qgcm9vdC1vbmx5IHR5cGUtYXdhcmUgb3B0aW9ucyBmcm9tIGEgcGFja2FnZSBjd2QuXG4gICAgICAgIHByb21pc2VzLnB1c2goZ2VuZXJhdGVPeGxpbnRDb25maWcoY29uZmlnLCByb290Q29uZmlnKSk7XG4gICAgICB9XG4gICAgICBpZiAoY29uZmlnLmRlcGVuZGluZy5weXJpZ2h0KSB7XG4gICAgICAgIHByb21pc2VzLnB1c2goZ2VuZXJhdGVQeXJpZ2h0Q29uZmlnSnNvbihjb25maWcpKTtcbiAgICAgIH1cbiAgICB9XG4gICAgYXdhaXQgUHJvbWlzZS5hbGwocHJvbWlzZXMpO1xuICAgIGF3YWl0IHByb21pc2VQb29sLnByb21pc2VBbGwoKTtcblxuICAgIGNvbnN0IHBhY2thZ2VNYW5hZ2VyID0gcm9vdENvbmZpZy5pc0J1biA/ICdidW4nIDogJ3lhcm4nO1xuICAgIC8vIFJlZnJlc2ggbG9jayBmaWxlc1xuICAgIGlmIChyb290Q29uZmlnLmlzQnVuKSB7XG4gICAgICBhd2FpdCBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbigncmVmcmVzaEJ1bkxvY2snLCBhc3luYyAoKSA9PiB7XG4gICAgICAgIGF3YWl0IFByb21pc2UucmVzb2x2ZSgpO1xuICAgICAgICByZWZyZXNoQnVuTG9jayhyb290RGlyUGF0aCk7XG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgc3Bhd25TeW5jKHBhY2thZ2VNYW5hZ2VyLCBbJ2luc3RhbGwnLCAnLS1uby1pbW11dGFibGUnXSwgcm9vdERpclBhdGgpO1xuICAgIH1cbiAgICBzcGF3blN5bmMocGFja2FnZU1hbmFnZXIsIFsnY2xlYW51cCddLCByb290RGlyUGF0aCk7XG5cbiAgICBhd2FpdCBpbnN0YWxsQWdlbnRTa2lsbHMocm9vdENvbmZpZyk7XG4gIH1cbiAgaWYgKGhhc0ludmFsaWRQYWNrYWdlQ29uZmlnKSB7XG4gICAgcHJvY2Vzcy5leGl0Q29kZSA9IDE7XG4gIH1cbn1cblxuZnVuY3Rpb24gcmVmcmVzaEJ1bkxvY2socm9vdERpclBhdGg6IHN0cmluZyk6IHZvaWQge1xuICAvLyB3YmZ5IHNob3VsZCB1cGRhdGUgb25seSB0aGUgcGFja2FnZXMgaXQgZXhwbGljaXRseSBtYW5hZ2VzIHRocm91Z2ggYnVuIGFkZC5cbiAgLy8gUnVubmluZyBidW4gdXBkYXRlIGhlcmUgcmVmcmVzaGVzIHVucmVsYXRlZCBhcHBsaWNhdGlvbiBkZXBlbmRlbmNpZXMgYW5kXG4gIC8vIGNhbiBjaGFuZ2UgcHJvZHVjdCBiZWhhdmlvciwgc28ga2VlcCB0aGUgZXhpc3RpbmcgbG9jayBhbmQgcmVjb25jaWxlIGl0LlxuICBjb25zdCBzdGF0dXMgPSBzcGF3blN5bmNBbmRSZXR1cm5TdGF0dXMoJ2J1bicsIFsnaW5zdGFsbCddLCByb290RGlyUGF0aCk7XG4gIGlmIChzdGF0dXMgIT09IDApIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYEZhaWxlZCB0byByZWZyZXNoIEJ1biBsb2NrZmlsZTogYnVuIGluc3RhbGwgZXhpdGVkIHdpdGggc3RhdHVzICR7c3RhdHVzfWApO1xuICB9XG59XG5cbmZ1bmN0aW9uIGdldFZlcnNpb24oKTogc3RyaW5nIHtcbiAgbGV0IHBhY2thZ2VKc29uRGlyID0gcGF0aC5kaXJuYW1lKG5ldyBVUkwoaW1wb3J0Lm1ldGEudXJsKS5wYXRobmFtZSk7XG4gIHdoaWxlICghZnMuZXhpc3RzU3luYyhwYXRoLmpvaW4ocGFja2FnZUpzb25EaXIsICdwYWNrYWdlLmpzb24nKSkpIHtcbiAgICBwYWNrYWdlSnNvbkRpciA9IHBhdGguZGlybmFtZShwYWNrYWdlSnNvbkRpcik7XG4gIH1cbiAgY29uc3QgcGFja2FnZUpzb24gPSBKU09OLnBhcnNlKGZzLnJlYWRGaWxlU3luYyhwYXRoLmpvaW4ocGFja2FnZUpzb25EaXIsICdwYWNrYWdlLmpzb24nKSwgJ3V0ZjgnKSkgYXMge1xuICAgIHZlcnNpb246IHN0cmluZztcbiAgfTtcbiAgcmV0dXJuIHBhY2thZ2VKc29uLnZlcnNpb247XG59XG5cbmF3YWl0IG1haW4oKTtcbiJdLCJuYW1lcyI6WyJhc3luYyIsInNsZWVwIiwibWlsbGlzZWNvbmRzIiwiUHJvbWlzZSIsInJlc29sdmUiLCJzZXRUaW1lb3V0IiwiaWdub3JlRXJyb3JBc3luYyIsImZuIiwiaWdub3JlRW5vZW50QXN5bmMiLCJlcnJvciIsImNvZGUiLCJvcHRpb25zIiwiaXNWZXJib3NlIiwiZG9lc1VwbG9hZEVudlZhcnMiLCJsb2dnZXIiLCJmdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uIiwibmFtZSIsImZ1bmMiLCJjb25zb2xlIiwiaW5mbyIsIkVycm9yIiwic3RhY2siLCJTdHJpbmciLCJmc1V0aWwiLCJyZWFkRmlsZUlnbm9yaW5nRXJyb3IiLCJmaWxlUGF0aCIsImZzIiwicHJvbWlzZXMiLCJyZWFkRmlsZSIsImdlbmVyYXRlRmlsZSIsImNvbnRlbnQiLCJta2RpciIsInBhdGgiLCJkaXJuYW1lIiwicmVjdXJzaXZlIiwibm9ybWFsaXplZENvbnRlbnQiLCJ0cmltIiwid3JpdGVGaWxlIiwicHJvbWlzZVBvb2wiLCJQcm9taXNlUG9vbCIsImZpeE5leHRDb25maWdKc29uIiwiY29uZmlnIiwibWFwIiwiZXh0IiwiZGlyUGF0aCIsImZpbmQiLCJwIiwiZXhpc3RzU3luYyIsIm9sZENvbnRlbnQiLCJvYmplY3RMaXRlcmFsIiwic291cmNlIiwidHMiLCJjcmVhdGVTb3VyY2VGaWxlIiwiU2NyaXB0VGFyZ2V0IiwiTGF0ZXN0IiwiU2NyaXB0S2luZCIsIkpTIiwidmlzaXQiLCJub2RlIiwiaXNFeHBvcnRBc3NpZ25tZW50IiwiaXNPYmplY3RMaXRlcmFsRXhwcmVzc2lvbiIsImV4cHJlc3Npb24iLCJpc0JpbmFyeUV4cHJlc3Npb24iLCJvcGVyYXRvclRva2VuIiwia2luZCIsIlN5bnRheEtpbmQiLCJFcXVhbHNUb2tlbiIsImxlZnQiLCJnZXRUZXh0IiwicmlnaHQiLCJmb3JFYWNoQ2hpbGQiLCJnZXROZXh0Q29uZmlnT2JqZWN0TGl0ZXJhbCIsInByb3BlcnR5VGV4dHMiLCJTZXQiLCJwcm9wZXJ0aWVzIiwicHJvcGVydHkiLCJoYXMiLCJwdXNoIiwibGVuZ3RoIiwiaW5zZXJ0aW9uUG9pbnQiLCJnZXRFbmQiLCJsYXN0UHJvcGVydHkiLCJhdCIsImhhc1RyYWlsaW5nQ29tbWEiLCJzbGljZSIsImluY2x1ZGVzIiwicHJlZml4IiwibmV3Q29udGVudCIsImpvaW4iLCJydW4iLCJkb2VzQ29udGFpbkpzT3JUcyIsImRvZXNDb250YWluSmF2YVNjcmlwdCIsImRvZXNDb250YWluSmF2YVNjcmlwdEluUGFja2FnZXMiLCJkb2VzQ29udGFpblR5cGVTY3JpcHQiLCJkb2VzQ29udGFpblR5cGVTY3JpcHRJblBhY2thZ2VzIiwiZG9lc0NvbnRhaW5KYXZhIiwiZG9lc0NvbnRhaW5KYXZhSW5QYWNrYWdlcyIsImdldFBhY2thZ2VNYW5hZ2VyQ29tbWFuZCIsImlzQnVuIiwibGl0ZXJhbCIsInZhbHVlIiwiYXNPYmplY3QiLCJleHRyYU1lbWJlcnMiLCJ0b1BhcnNlZE9iamVjdCIsIm1lbWJlck9yZGVyIiwiT2JqZWN0Iiwia2V5cyIsImtleSIsIl8iLCJpbmRleCIsImZpeFBsYXl3cmlnaHRDb25maWciLCJlbnZGaWxlUGF0aCIsImVudkZpbGVOYW1lcyIsImVudkZpbGVQYXRocyIsImN1cnJlbnREaXJQYXRoIiwiZmlsZU5hbWUiLCJnZXRFbnZGaWxlUGF0aHMiLCJ0ZXN0IiwiYXNzZXJ0TmV4dFB1YmxpY0Jhc2VVcmwiLCJleHRyYWN0ZWRPYmplY3RMaXRlcmFsIiwiVFMiLCJmb3VuZCIsImlzQ2FsbEV4cHJlc3Npb24iLCJmaXJzdEFyZ3VtZW50IiwiYXJndW1lbnRzIiwidW5kZWZpbmVkIiwiZXh0cmFjdERlZmluZUNvbmZpZ09iamVjdExpdGVyYWwiLCJwYXJzZWQiLCJwYXJzZU9iamVjdExpdGVyYWxFeHByZXNzaW9uIiwibWVyZ2VkIiwibWVyZ2VQYXJzZWRPYmplY3RzIiwiZm9yYmlkT25seSIsInJldHJpZXMiLCJ1c2UiLCJiYXNlVVJMIiwidHJhY2UiLCJzY3JlZW5zaG90IiwidmlkZW8iLCJ3ZWJTZXJ2ZXIiLCJjb21tYW5kIiwiZ2V0V2JTdGFydFRlc3RDb21tYW5kIiwidXJsIiwicmV1c2VFeGlzdGluZ1NlcnZlciIsInRpbWVvdXQiLCJzdGRvdXQiLCJzdGRlcnIiLCJlbnYiLCJncmFjZWZ1bFNodXRkb3duIiwiY3JlYXRlRGVmYXVsdENvbmZpZyIsIm9iamVjdCIsInNldFdlYlNlcnZlckNvbW1hbmQiLCJuZXdPYmplY3RMaXRlcmFsIiwic3RyaW5naWZ5VmFsdWUiLCJzdGFydCIsImdldFN0YXJ0IiwiZW5kIiwiYmFzZSIsIm92ZXJyaWRlIiwib3ZlcnJpZGVQcm9wZXJ0eUtleXMiLCJmaWx0ZXIiLCJtZW1iZXIiLCJlbnRyaWVzIiwibWVyZ2VQYXJzZWRWYWx1ZSIsInBhcnNlRXhwcmVzc2lvbiIsInBhcnNlZE9iamVjdCIsImlzQXJyYXlMaXRlcmFsRXhwcmVzc2lvbiIsImVsZW1lbnRzIiwiZWxlbWVudCIsInNvbWUiLCJpc1Nob3J0aGFuZFByb3BlcnR5QXNzaWdubWVudCIsImlzUHJvcGVydHlBc3NpZ25tZW50IiwiaXNJZGVudGlmaWVyIiwiaXNTdHJpbmdMaXRlcmFsIiwiaW5pdGlhbGl6ZXIiLCJsZXZlbCIsImNsb3NpbmdJbmRlbnQiLCJyZXBlYXQiLCJpbmRlbnQiLCJpdGVtIiwic3RyaW5naWZpZWQiLCJzcGxpdCIsImVtaXR0ZWRQcm9wZXJ0aWVzIiwibGFzdFByb3BlcnR5SW5kZXhCeUtleSIsIk1hcCIsInNldCIsImdldExhc3RQcm9wZXJ0eUluZGV4QnlLZXkiLCJsaW5lcyIsImZsYXRNYXAiLCJzdHJpbmdpZnlPYmplY3RNZW1iZXIiLCJnZXQiLCJhZGQiLCJzdHJpbmdpZnlPYmplY3RQcm9wZXJ0eSIsImxpbmUiLCJnbG9iSWdub3JlIiwiZml4UHJpc21hRW52RmlsZXMiLCJzaG91bGRBZGRDb25uZWN0aW9uTGltaXQiLCJkZXBlbmRpbmciLCJwcmlzbWEiLCJkZXBlbmRlbmNpZXMiLCJwYWNrYWdlSnNvbiIsImRldkRlcGVuZGVuY2llcyIsInNob3VsZEFkZFNxbGl0ZUNvbm5lY3Rpb25MaW1pdCIsImVudkZpbGVzIiwiZmciLCJnbG9iIiwiZG90IiwiY3dkIiwiaWdub3JlIiwiZW52RmlsZSIsInJlcGxhY2VBbGwiLCJtYXRjaCIsIm5vcm1hbGl6ZVNxbGl0ZURhdGFiYXNlVXJsIiwicXVlcnlTdGFydCIsImluZGV4T2YiLCJwYXRoUGFydCIsInF1ZXJ5UGFydCIsInBhcmFtcyIsIlVSTFNlYXJjaFBhcmFtcyIsImRlbGV0ZSIsIm5vcm1hbGl6ZWRRdWVyeSIsInRvU3RyaW5nIiwicHJvdG90eXBlIiwiaGFzT3duUHJvcGVydHkiLCJjYWxsIiwic29ydE9iamVjdEJ5S2V5TmFtZUxpc3QiLCJzb3J0V2l0aCIsInNvcnRGbiIsInRvdGFsIiwib2JqZWN0S2V5cyIsInNvcnQiLCJJTkRFTlRfUkVHRVgiLCJJTkRFTlRfVFlQRV9TUEFDRSIsInNob3VsZElnbm9yZVNpbmdsZVNwYWNlIiwiaWdub3JlU2luZ2xlU3BhY2VzIiwiaW5kZW50VHlwZSIsIm1ha2VJbmRlbnRzTWFwIiwic3RyaW5nIiwiaW5kZW50cyIsInByZXZpb3VzSW5kZW50VHlwZSIsInByZXZpb3VzU2l6ZSIsIm1hdGNoZXMiLCJ3ZWlnaHQiLCJpbmRlbnREaWZmZXJlbmNlIiwiYWJzb2x1dGVJbmRlbnREaWZmZXJlbmNlIiwiTWF0aCIsImFicyIsImVuY29kZUluZGVudHNLZXkiLCJlbnRyeSIsImluZGVudEFtb3VudCIsImRldGVjdEluZGVudCIsIlR5cGVFcnJvciIsInNpemUiLCJrZXlPZk1vc3RVc2VkSW5kZW50IiwicmVzdWx0IiwibWF4VXNlZCIsIm1heFdlaWdodCIsInVzZWRDb3VudCIsImdldE1vc3RVc2VkS2V5IiwidHlwZSIsImFtb3VudCIsImluZGVudHNLZXkiLCJOdW1iZXIiLCJtYWtlSW5kZW50U3RyaW5nIiwiZGV0ZWN0TmV3bGluZUdyYWNlZnVsIiwibmV3bGluZXMiLCJjcmxmIiwibmV3bGluZSIsImRldGVjdE5ld2xpbmUiLCJwaXBlIiwiZm5zIiwieCIsImFyZ3MiLCJyZWR1Y2UiLCJvbkFycmF5IiwiQXJyYXkiLCJpc0FycmF5Iiwib25TdHJpbmdBcnJheSIsImV2ZXJ5IiwidW5pcSIsInhzIiwic29ydEFycmF5IiwiYXJyYXkiLCJ0b1NvcnRlZCIsInVuaXFBbmRTb3J0QXJyYXkiLCJvbk9iamVjdCIsImdldFByb3RvdHlwZU9mIiwiU3ltYm9sIiwidG9TdHJpbmdUYWciLCJpdGVyYXRvciIsImlzUGxhaW5PYmplY3QiLCJzb3J0T2JqZWN0QnkiLCJjb21wYXJhdG9yIiwiZGVlcCIsIm92ZXIiLCJmcm9tRW50cmllcyIsInNvcnRPYmplY3RLZXlzIiwib2JqZWN0R3JvdXBCeSIsImdyb3VwQnkiLCJjYWxsYmFjayIsImNyZWF0ZSIsInNvcnRPYmplY3QiLCJzb3J0VVJMT2JqZWN0Iiwic29ydFBlb3BsZU9iamVjdCIsInNvcnREaXJlY3RvcmllcyIsIm92ZXJQcm9wZXJ0eSIsImhhc093biIsInNvcnRHaXRIb29rcyIsInBhcnNlTmFtZUFuZFZlcnNpb25SYW5nZSIsInNwZWNpZmllciIsIm5hbWVBbmRWZXJzaW9uIiwiYXRNYXRjaGVzIiwibWF0Y2hBbGwiLCJzcGxpdEluZGV4IiwicG9wIiwic3Vic3RyaW5nIiwicmFuZ2UiLCJzb3J0T2JqZWN0QnlTZW12ZXIiLCJhIiwiYiIsImFOYW1lIiwiYVJhbmdlIiwiYk5hbWUiLCJiUmFuZ2UiLCJsb2NhbGVDb21wYXJlIiwic2VtdmVyQ29tcGFyZSIsInNlbXZlck1pblZlcnNpb24iLCJnZXRQYWNrYWdlTmFtZSIsImlkZW50Iiwic3RhcnRzV2l0aCIsImNhY2hlIiwic2hvdWxkU29ydERlcGVuZGVuY2llc0xpa2VOcG0iLCJwYWNrYWdlTWFuYWdlciIsImRldkVuZ2luZXMiLCJwbnBtIiwiZW5naW5lcyIsIm5wbSIsInByb2Nlc3MiLCJoYXNZYXJuT3JQbnBtRmlsZXMiLCJzb3J0RGVwZW5kZW5jaWVzIiwic29ydFdvcmtzcGFjZXMiLCJzb3J0RXNsaW50Q29uZmlnIiwib3ZlcnJpZGVzIiwicnVsZTEiLCJydWxlMiIsInNvcnRWU0NvZGVCYWRnZU9iamVjdCIsInNvcnRQcmV0dGllckNvbmZpZyIsInNvcnRWb2x0YSIsInNvcnREZXZFbmdpbmVzIiwic29ydFBucG1Db25maWciLCJkZWZhdWx0TnBtU2NyaXB0cyIsImhhc0RldkRlcGVuZGVuY3kiLCJkZXBlbmRlbmN5IiwicnVuU1JlZ0V4cCIsImhhc1NlcXVlbnRpYWxTY3JpcHQiLCJmaWVsZCIsInZhbHVlcyIsInNjcmlwdCIsImlzU2VxdWVudGlhbFNjcmlwdCIsInNvcnRTY3JpcHROYW1lcyIsImdyb3VwTWFwIiwiaWR4IiwiZnJvbSIsImdyb3VwS2V5IiwiY2hpbGRyZW4iLCJrIiwic29ydFNjcmlwdHMiLCJzY3JpcHRzIiwibmFtZXMiLCJwcmVmaXhhYmxlIiwib21pdHRlZCIsInJlcGxhY2UiLCJzb3J0Q29uZGl0aW9ucyIsImNvbmRpdGlvbnMiLCJkZWZhdWx0Q29uZGl0aW9ucyIsInJlc3RDb25kaXRpb25zIiwiY29uZGl0aW9uIiwic29ydEV4cG9ydHMiLCJleHBvcnRzIiwicGF0aHMiLCJmaWVsZHMiLCJtYWludGFpbmVycyIsImNvbnRyaWJ1dG9ycyIsInBhY2thZ2VOYW1lQSIsInBhY2thZ2VOYW1lQiIsImJhZGdlIiwiZGVmYXVsdFNvcnRPcmRlciIsIm92ZXJGaWVsZHMiLCJCb29sZWFuIiwic29ydFBhY2thZ2VKc29uIiwianNvbklzaCIsImpzb24iLCJlbmRDaGFyYWN0ZXJzIiwiSlNPTiIsInBhcnNlIiwic3RyaW5naWZ5IiwiZWRpdFN0cmluZ0pTT04iLCJzb3J0T3JkZXIiLCJwcml2YXRlS2V5cyIsInB1YmxpY0tleXMiLCJmaXhUZXN0RGlyZWN0b3JpZXNVcGRhdGluZ1BhY2thZ2VKc29uIiwicGFja2FnZURpclBhdGhzIiwiYWxsIiwicGFja2FnZUpzb25QYXRoIiwicGFja2FnZURpclBhdGgiLCJuZXdUZXN0RGlyUGF0aCIsIm9sZFRlc3REaXJOYW1lIiwib2xkVGVzdERpclBhdGgiLCJtb3ZlVGVzdERpcmVjdG9yeSIsImRpZFVwZGF0ZVNjcmlwdCIsInNjcmlwdE5hbWUiLCJuZXdTY3JpcHQiLCJyZW5hbWUiLCJkaXJlbnRzIiwicmVhZGRpciIsIndpdGhGaWxlVHlwZXMiLCJvbGRQYXRoIiwiZGlyZW50IiwibmV3UGF0aCIsIm5ld1BhdGhTdGF0Iiwic3RhdCIsImlzRGlyZWN0b3J5Iiwicm0iLCJmaXhUeXBlRGVmaW5pdGlvbnMiLCJjb25maWdzSW5jbHVkaW5nQ2hpbGRyZW4iLCJsaWJUeXBlRGlyUGF0aCIsInNyY1R5cGVEaXJQYXRoIiwiaXNSb290IiwiZG9lc0NvbnRhaW5TdWJQYWNrYWdlSnNvbnMiLCJkaXJOYW1lIiwiaGFzVHlwZURlY2xhcmF0aW9uRXh0ZW5zaW9uIiwiZW5kc1dpdGgiLCJwYWNrYWdlTmFtZSIsImhhc0xpYnJhcnkiLCJpc0ZpbGUiLCJvdmVyd3JpdGVNZXJnZSIsImRlc3RpbmF0aW9uQXJyYXkiLCJzb3VyY2VBcnJheSIsImNvbWJpbmVNZXJnZSIsInRhcmdldCIsImRlc3RpbmF0aW9uIiwiY2xvbmVVbmxlc3NPdGhlcndpc2VTcGVjaWZpZWQiLCJpc01lcmdlYWJsZU9iamVjdCIsIm1lcmdlIiwic29ydEtleXMiLCJvYmoiLCJrZXlBbmRWYWx1ZXMiLCJrZXkxIiwia2V5MiIsInB1YmxpY1JlcG9BdXRvZml4V29ya2Zsb3ciLCJvbiIsInB1bGxfcmVxdWVzdCIsImJyYW5jaGVzIiwicGVybWlzc2lvbnMiLCJjb250ZW50cyIsImNvbmN1cnJlbmN5IiwiZ3JvdXAiLCJqb2JzIiwiYXV0b2ZpeCIsInByaXZhdGVSZXBvQXV0b2ZpeFdvcmtmbG93IiwidXNlcyIsIndvcmtmbG93cyIsInJlbGVhc2UiLCJwdWxsX3JlcXVlc3RfdGFyZ2V0IiwidHlwZXMiLCJzeW5jIiwiZ2VuZXJhdGVXb3JrZmxvd3MiLCJyb290Q29uZmlnIiwiaXNSZXVzYWJsZVdvcmtmbG93c1JlcG8iLCJyZXBvc2l0b3J5Iiwid29ya2Zsb3dzUGF0aCIsInNlbWFudGljWW1sUGF0aCIsImZvcmNlIiwiaXNPYnNvbGV0ZUdlblByV29ya2Zsb3dGaWxlTmFtZSIsImZpbGVOYW1lU2V0Iiwic2VtYW50aWNSZWxlYXNlIiwiYmFzZW5hbWUiLCJ3cml0ZVdvcmtmbG93WWFtbCIsImRlcGxveVByb2R1Y3Rpb25Xb3JrZmxvd0V4aXN0cyIsIndyaXRlWWFtbCIsImlzUHVibGljUmVwbyIsInN0cnVjdHVyZWRDbG9uZSIsInN0ZXBzIiwid2l0aCIsImJ1aWxkIiwiYXV0b2ZpeFdvcmtmbG93IiwiYXV0b2ZpeEpvYiIsImdlbmVyYXRlQXV0b2ZpeFdvcmtmbG93IiwibmV3U2V0dGluZ3MiLCJvbGRTZXR0aW5ncyIsInlhbWwiLCJsb2FkIiwiYXJyYXlNZXJnZSIsIm1vdmVUb0JvdHRvbSIsImFjdGlvbnMiLCJ0cmlnZ2VyX2RlcGxveV93b3JrZmxvdyIsImlzUmV1c2FibGVXb3JrZmxvdyIsImpvYiIsIm5vcm1hbGl6ZUpvYiIsInNjaGVkdWxlIiwiYnJhbmNoIiwic3luY19wYXJhbXNfd2l0aG91dF9kZXN0Iiwid29ya2Zsb3dfZGlzcGF0Y2giLCJzZWNyZXRzIiwiTlBNX1RPS0VOIiwiR0hfVE9LRU4iLCJGSVJFQkFTRV9UT0tFTiIsIkdDUF9TQV9LRVlfSlNPTl9GT1JfRklSRUJBU0UiLCJESVNDT1JEX1dFQkhPT0tfVVJMIiwic2VydmVyX3VybCIsImRvdF9lbnZfcGF0aCIsIkZMWV9BUElfVE9LRU4iLCJkZXBsb3lfY29tbWFuZCIsImRvZXNDb250YWluRG9ja2VyZmlsZSIsImNpX2xhYmVsIiwiZ2l0aHViX2hvc3RlZF9ydW5uZXIiLCJuZXdTZWNyZXRzIiwieWFtbFRleHQiLCJkdW1wIiwibGluZVdpZHRoIiwibm9Db21wYXRNb2RlIiwic3R5bGVzIiwiZml4VHlwb3MiLCJwYWNrYWdlQ29uZmlnIiwiZG9jRmlsZXMiLCJtZEZpbGUiLCJmaXhUeXBvc0luVGV4dCIsInJlcGxhY2VXaXRoQ29uZmlnIiwidHNGaWxlcyIsInRzRmlsZSIsImNvbW1lbnQiLCJ0ZXh0QmFzZWRGaWxlcyIsImZpbGUiLCJwcm9taXNlQWxsIiwicHJvcE5hbWUiLCJiZWZvcmUiLCJhZnRlciIsIndiZnlKc29uIiwidHlwb3MiLCJnZW5lcmF0ZUFnZW50SW5zdHJ1Y3Rpb25zIiwiYWxsQ29uZmlncyIsImFnZW50c0V4dHJhUGF0aCIsImV4dHJhQ29udGVudCIsInRvb2xOYW1lIiwiZ2VuZXJhdGVBZ2VudEluc3RydWN0aW9uIiwiY3Vyc29yUnVsZXNQYXRoIiwiY3Vyc29yUnVsZXNDb250ZW50IiwiZnJvbnRtYXR0ZXIiLCJib2R5IiwiZ2VuZXJhdGVDdXJzb3JHZW5lcmFsTWRjQ29udGVudCIsImJhc2VDb250ZW50IiwiZGVzY3JpcHRpb24iLCJpc1dpbGxCb29zdGVyUmVwbyIsImNvbmZpZ3MiLCJwbGF5d3JpZ2h0VGVzdCIsImdlbmVyYXRlQWdlbnRDb2RpbmdTdHlsZSIsImhhc05ld1NlY3Rpb24iLCJjIiwiZ2VuSTE4blRzIiwicmVhY3QiLCJuZXh0IiwibWluaW11bVJlbGVhc2VBZ2VFeGNsdWRlcyIsImdlbmVyYXRlQnVuZmlnVG9tbCIsImV4aXN0aW5nQ29udGVudCIsInJlYWRGaWxlU3luYyIsImJ1bmZpZ1RvbWwiLCJwYXJzZUJ1bmZpZ1RvbWwiLCJidW4iLCJnZW5lcmF0ZVJ1blNlY3Rpb24iLCJpbnN0YWxsIiwiZXhhY3QiLCJ1c2VyQ29udGVudEhlYWRlciIsInVzZXJDb250ZW50SGVhZGVyUmVnZXgiLCJzZXBhcmF0b3IiLCJkZWZhdWx0SGVhZFVzZXJDb250ZW50IiwiZGVmYXVsdFRhaWxVc2VyQ29udGVudCIsImlnbm9yZUZpbGVVdGlsIiwic2VwYXJhdG9yUHJlZml4IiwicmVhZEdpdGlnbm9yZVdpdGhvdXRTZXBhcmF0b3JzIiwibGFzdEhlYWRlckluZGV4IiwiZ2V0SW5kZXhPZlRhaWxVc2VyQ29udGVudEhlYWRlciIsImdldEhlYWRVc2VyQ29udGVudCIsInRoaXMiLCJnZXRUYWlsVXNlckNvbnRlbnQiLCJpc0JlcnJ5WmVyb0luc3RhbGxFbmFibGVkIiwibGFzdEluZGV4IiwibGFzdEluZGV4T2YiLCJnZW5lcmF0ZURvY2tlcmlnbm9yZSIsImV4dGVuc2lvbnMiLCJjb2RlV2l0aDJJbmRlbnRTaXplIiwiY29kZVdpdGg0SW5kZW50U2l6ZSIsIm1hcmtkb3duTGlrZSIsIm94bGludCIsIm94Zm10IiwicHJldHRpZXJPbmx5IiwiZ2VuZXJhdGVFeHRlbnNpb25zIiwiZ2VuZXJhdGVFZGl0b3Jjb25maWciLCJkZWZhdWx0Q29uZmlnIiwiaGF2ZV9mdW4iLCJjb2RlX3JldmlldyIsImRpc2FibGUiLCJjb21tZW50X3NldmVyaXR5X3RocmVzaG9sZCIsIm1heF9yZXZpZXdfY29tbWVudHMiLCJwdWxsX3JlcXVlc3Rfb3BlbmVkIiwiaGVscCIsInN1bW1hcnkiLCJpZ25vcmVfcGF0dGVybnMiLCJnZW5lcmF0ZUdlbWluaUNvbmZpZyIsImNvbmZpZ0ZpbGVQYXRoIiwic3R5bGVndWlkZUZpbGVQYXRoIiwibmV3Q29uZmlnIiwib2xkQ29uZmlnIiwieWFtbENvbnRlbnQiLCJjb2RpbmdSdWxlRXh0cmFDb250ZW50IiwidHJpbVN0YXJ0Iiwic3R5bGVndWlkZUNvbnRlbnQiLCJ0cmltRW5kIiwicmVtb3ZlR2VtaW5pU2V0dGluZ3MiLCJnZW5lcmF0ZUdpdGF0dHJpYnV0ZXMiLCJkZWZhdWx0TmFtZXMiLCJnZW5lcmF0ZUdpdGlnbm9yZSIsImhlYWRVc2VyQ29udGVudCIsInRhaWxVc2VyQ29udGVudCIsImRvZXNDb250YWluR2VtZmlsZSIsImRvZXNDb250YWluR29Nb2QiLCJkb2VzQ29udGFpblBhY2thZ2VKc29uIiwiZG9lc0NvbnRhaW5Qb21YbWwiLCJkb2VzQ29udGFpblB1YnNwZWNZYW1sIiwiZG9lc0NvbnRhaW5UZW1wbGF0ZVlhbWwiLCJkb2VzQ29udGFpblBvZXRyeUxvY2siLCJkb2VzQ29udGFpblV2TG9jayIsImJsaXR6IiwiZmlyZWJhc2UiLCJyZWFjdE5hdGl2ZSIsInN0b3J5Ym9vayIsImxpdGVzdHJlYW0iLCJnZW5lcmF0ZWQiLCJyZWFkQ2FjaGUiLCJyZXNwb25zZSIsImZldGNoIiwicmVzcG9uc2VUZXh0IiwidGV4dCIsIm9rIiwid3JpdGVDYWNoZSIsIm9zIiwiaG9tZWRpciIsIkRhdGUiLCJub3ciLCJtdGltZU1zIiwib3hmbXRQcm9ncmFtIiwicHJldHRpZXJQcm9ncmFtIiwiZ2VuZXJhdGVJZGVhU2V0dGluZ3MiLCJ0YXNrT3B0aW9ucyIsInByb2dyYW0iLCJ0YXNrIiwiY3JlYXRlVGFza09wdGlvbnMiLCJydW5uZXIiLCJleHRlbnNpb24iLCJnZXRXYXRjaGVyVGFza3NDb250ZW50IiwiZ2V0R2VuSTE4blRzQ29tbWFuZCIsInNwYXduU3luYyIsInJldHJ5Iiwic3Bhd25TeW5jQW5kUmV0dXJuU3RhdHVzIiwibmV3Q21kIiwibmV3QXJncyIsImdldFNwYXduU3luY0FyZ3MiLCJzdGF0dXMiLCJjaGlsZF9wcm9jZXNzIiwic3Bhd25TeW5jQW5kUmV0dXJuU3Rkb3V0Iiwic3RkaW8iLCJwcm9jIiwicyIsIm1lc3NhZ2UiLCJQQVRIIiwiQkVSUllfQklOX0ZPTERFUiIsImVuY29kaW5nIiwic2hlbGwiLCJnaXRIdWJVdGlsIiwiZ2V0T3JnQW5kTmFtZSIsInVybE9yRnVsbE5hbWUiLCJ1cmxXaXRob3V0UHJvdG9jb2wiLCJvY3Rva2l0Q2FjaGUiLCJnZXRPY3Rva2l0Iiwib3duZXIiLCJjYWNoZWQiLCJvY3Rva2l0IiwiT2N0b2tpdCIsImF1dGgiLCJnZXRHaXRIdWJUb2tlbiIsImhhc0dpdEh1YlRva2VuIiwiR0hfQk9UX1BBVF9GT1JfV0lMTEJPT1NURVIiLCJnZXRHaXRIdWJDbGlUb2tlbiIsIkdIX0JPVF9QQVRfRk9SX1dJTExCT09TVEVSTEFCIiwiR0lUSFVCX1RPS0VOIiwiZ2l0SHViQ2xpVG9rZW4iLCJjaGlsZFByb2Nlc3MiLCJleGVjRmlsZVN5bmMiLCJtYW5hZ2VkVHNjb25maWdCYXNlRGVwZW5kZW5jaWVzIiwiaXNQdWJsaXNoZWRXaWxsYm9vc3RlckNvbmZpZ3NQYWNrYWdlIiwiaXNXaWxsQm9vc3RlckNvbmZpZ3MiLCJwcml2YXRlIiwiZmlsZXMiLCJveGxpbnREZXBzIiwidHlwZXNjcmlwdEdvRGVwZW5kZW5jeSIsInR5cGVzY3JpcHREZXBlbmRlbmN5Iiwid2JEZXBlbmRlbmN5IiwiYnVpbGRUc0RlcGVuZGVuY3kiLCJ3YmZ5UGFja2FnZUpzb24iLCJmaWxlVVJMVG9QYXRoIiwicGFyZW50RGlyUGF0aCIsInJlYWRXYmZ5UGFja2FnZUpzb24iLCJtYW5hZ2VkRGVwZW5kZW5jeVZlcnNpb25zIiwicGVlckRlcGVuZGVuY2llcyIsImJhc2VsaW5lTWFuYWdlZERlcGVuZGVuY2llcyIsIndpbGxCb29zdGVyQ29uZmlnc01hbmFnZWREZXBlbmRlbmNpZXMiLCJvYnNvbGV0ZUxpbnREZXBlbmRlbmNpZXMiLCJtaWNyb21hdGNoUGFja2FnZU5hbWVzIiwibWljcm9tYXRjaEltcG9ydFBhdHRlcm4iLCJsYXRlc3REZXBlbmRlbmN5VmVyc2lvbkNhY2hlIiwiZGVwZW5kZW5jeVNlY3Rpb25LZXlzIiwiZ2VuZXJhdGVQYWNrYWdlSnNvbiIsInNraXBBZGRpbmdEZXBzIiwianNvbk9iaiIsImpzb25UZXh0IiwicmVhZFBhY2thZ2VKc29uIiwiYXV0aG9yIiwic2VjdGlvbiIsImdldERlcGVuZGVuY3lTZWN0aW9ucyIsIlJlZmxlY3QiLCJkZWxldGVQcm9wZXJ0eSIsInJlbW92ZVNlbGZEZXBlbmRlbmN5IiwidmVyc2lvbiIsImlzV29ya3NwYWNlUHJvdG9jb2xSYW5nZSIsImdldExhdGVzdERlcGVuZGVuY3lWZXJzaW9uIiwicmVwbGFjZVdpbGxCb29zdGVyQ29uZmlnc1dvcmtzcGFjZURlcGVuZGVuY3lSYW5nZXMiLCJ0c2xpYiIsImxlcm5hIiwicGluc3QiLCJwcmV0dGllciIsInNlY3Rpb25zIiwicmVtb3ZlV2lsbEJvb3N0ZXJDb25maWdzTWFuYWdlZERlcGVuZGVuY2llcyIsInByZXNlcnZlTWljcm9tYXRjaCIsImZpbGVQYXRocyIsImdsb2JTeW5jIiwiZG9lc1Byb2R1Y3RDb2RlSW1wb3J0TWljcm9tYXRjaCIsInNob3VsZFByZXNlcnZlTWljcm9tYXRjaCIsInNob3VsZFByZXNlcnZlQ29uZmlnUGFja2FnZUxpbnREZXBlbmRlbmN5IiwicmVtb3ZlT2Jzb2xldGVMaW50RGVwZW5kZW5jaWVzIiwicmVtb3ZlRGVwcmVjYXRlZFN0dWZmIiwicmVtb3ZlTGVnYWN5SW5zdGFsbENvbW1hbmRzIiwiZ2VuZXJhdGVTY3JpcHRzIiwicHJldHRpZnkiLCJjYXRjaCIsIm9yaWdpbmFsQ29udGVudCIsIm5ld0xpbmUiLCJsIiwiZ2VuZXJhdGVQcmV0dGllclN1ZmZpeCIsIm5vcm1hbGl6ZVlhcm5Xb3Jrc3BhY2VGb3JlYWNoU2NyaXB0cyIsInJhaWx3YXkiLCJub3JtYWxpemVSYWlsd2F5Q2xpU2NyaXB0IiwidXBkYXRlU2NyaXB0cyIsIm1vdmVNYW5hZ2VkVG9vbERlcGVuZGVuY2llc1RvRGV2RGVwZW5kZW5jaWVzIiwiZGVwZW5kZW5jeVVwZGF0ZXMiLCJweXRob25EZXZEZXBlbmRlbmNpZXMiLCJoYXNKYXZhIiwiZGVwZW5kZW5jeVNlY3Rpb25zIiwicmVtb3ZlUHJldHRpZXJBcnRpZmFjdHMiLCJodXNreSIsInBvc3RpbnN0YWxsIiwicG9zdHB1Ymxpc2giLCJwcmVwdWJsaXNoT25seSIsInByZXBhY2siLCJwb3N0cGFjayIsInByZXBhcmUiLCJhcnRpbGxlcnkiLCJwbGF5d3JpZ2h0Iiwid29ya3NwYWNlcyIsIndvcmtzcGFjZSIsImlzV2JQYWNrYWdlIiwid2IiLCJ0c2NvbmZpZ0Jhc2VEZXBlbmRlbmNpZXMiLCJnZXRUc2NvbmZpZ0Jhc2VEZXBlbmRlbmNpZXMiLCJ1c2VkRGVwZW5kZW5jaWVzIiwidXNlZERlcGVuZGVuY3lTZXQiLCJleGlzdGluZ1RzY29uZmlnQmFzZURlcGVuZGVuY2llcyIsImFic29sdXRlRmlsZVBhdGgiLCJwYXJzZUNvbmZpZ0ZpbGVUZXh0VG9Kc29uIiwid2FybiIsImZvcm1hdFRzRGlhZ25vc3RpYyIsIm5vcm1hbGl6ZVRzY29uZmlnRXh0ZW5kcyIsImV4dGVuZHMiLCJnZXRFeGlzdGluZ1RzY29uZmlnQmFzZURlcGVuZGVuY2llcyIsInJlbW92ZVVudXNlZFRzY29uZmlnQmFzZURlcGVuZGVuY2llcyIsImplc3QiLCJkZXAiLCJhcHBseVBhY2thZ2VKc29uQ29udmVudGlvbnMiLCJsaWNlbnNlIiwicHVibGlzaENvbmZpZyIsImFjY2VzcyIsImNvbmZpZ01qc1BhdGgiLCJjb25maWdEdHNQYXRoIiwiY29uZmlnRG10c0NvbnRlbnQiLCJub3JtYWxpemVQdWJsaXNoZWRDb25maWdQYWNrYWdlTWV0YWRhdGEiLCJtYWluIiwicmVzb2x1dGlvbnMiLCJsaW50IiwiZGlycyIsImRpciIsImZvcm1hdCIsImFwcGVuZEZvcm1hdENvZGVDb21tYW5kIiwicHl0aG9uUGFja2FnZU1hbmFnZXIiLCJnZXRQeXRob25QYWNrYWdlTWFuYWdlciIsInB5dGhvbkZpbGVzIiwiZGlyTmFtZVNldCIsInB5dGhvbkZpbGUiLCJmaXJzdCIsInNlY29uZCIsImRpck5hbWVzU3RyIiwicHl0aG9uUnVubmVyIiwiZXhpc3RpbmdSZXBvc2l0b3J5Iiwibm9ybWFsaXplZFJlcG9zaXRvcnkiLCJub3JtYWxpemVSZXBvc2l0b3J5VXJsRm9yUGFja2FnZUpzb24iLCJidWlsZE5vcm1hbGl6ZWRSZXBvc2l0b3J5Rm9yUGFja2FnZUpzb24iLCJub3JtYWxpemVkRXhpc3RpbmdSZXBvc2l0b3J5IiwiZm9ybWF0UmVwb3NpdG9yeUZvclBhY2thZ2VKc29uIiwiZ2VuQ29kZVNjcmlwdCIsIm9sZEdlbkNvZGVTY3JpcHQiLCJjaGFrcmEiLCJkcml6emxlIiwic2hvdWxkR2VuZXJhdGVXYkdlbkNvZGVTY3JpcHQiLCJhZGRHZW5JMThuVHNQb3N0aW5zdGFsbFNjcmlwdCIsIm5vcm1hbGl6ZVBhY2thZ2VNZXRhZGF0YSIsInBhY2thZ2VKc29uRGVwZW5kZW5jaWVzIiwicGFja2FnZUpzb25EZXZEZXBlbmRlbmNpZXMiLCJhZGRQYWNrYWdlSnNvbkRlcGVuZGVuY2llcyIsImFkZERlcGVuZGVuY3lWZXJzaW9uc1RvUGFja2FnZUpzb24iLCJwYWNrYWdlTmFtZXMiLCJwcml2YXRlUGFja2FnZXMiLCJyZXBvIiwiaXNXb3Jrc3BhY2VQYWNrYWdlIiwib3RoZXJUYXJnZXQiLCJjb21taXRIYXNoIiwib3JnYW5pemF0aW9uIiwicmVqZWN0IiwiZ2V0TGF0ZXN0Q29tbWl0SGFzaCIsImdldExhdGVzdFByaXZhdGVQYWNrYWdlU3BlY2lmaWVyIiwidXBkYXRlUHJpdmF0ZVBhY2thZ2VzIiwicmVtb3ZlRW1wdHlEZXBlbmRlbmN5U2VjdGlvbnMiLCJzZXJpYWxpemVQYWNrYWdlSnNvbiIsImluc3RhbGxOcG1EZXBlbmRlbmNpZXMiLCJpbnN0YWxsRGVwZW5kZW5jeVVwZGF0ZXMiLCJyZWxhdGl2ZUZpbGVQYXRoIiwicmVsYXRpdmUiLCJmb3JtYXRQYWNrYWdlSnNvbldpdGhQcm9qZWN0Rm9ybWF0dGVyIiwiY29yZSIsImZvcm1hdFNjcmlwdCIsInNjcmlwdFJ1bm5lciIsImRldiIsImRlcGVuZGVuY3lTcGVjaWZpZXJzIiwiY3VycmVudFZlcnNpb24iLCJnZXREZXBlbmRlbmN5U3BlY2lmaWVyIiwiZ2V0SW5zdGFsbERlcGVuZGVuY3lTcGVjaWZpZXIiLCJkZXBlbmRlbmNpZXNUb0luc3RhbGwiLCJzaG91bGRVcGRhdGVFeGlzdGluZ0RlcGVuZGVuY3kiLCJzaG91bGRVcGRhdGVFeGlzdGluZ01hbmFnZWREZXBlbmRlbmN5IiwiZGlhZ25vc3RpYyIsImZsYXR0ZW5EaWFnbm9zdGljTWVzc2FnZVRleHQiLCJtZXNzYWdlVGV4dCIsIm1hbmFnZWRWZXJzaW9uIiwiZ2V0TWFuYWdlZERlcGVuZGVuY3lWZXJzaW9uIiwiY2FjaGVkVmVyc2lvbiIsImdldERlcGVuZGVuY3lWZXJzaW9uRnJvbU5wbSIsImVzbGludCIsImlzTmV3ZXJNYW5hZ2VkRGVwZW5kZW5jeVZlcnNpb24iLCJsYXRlc3RWZXJzaW9uIiwidmFsaWRMYXRlc3RWZXJzaW9uIiwic2VtdmVyIiwidmFsaWQiLCJ2YWxpZEN1cnJlbnRWZXJzaW9uIiwiZ3QiLCJyZXBvc2l0b3J5VXJsIiwibWF0Y2hlZCIsImV4ZWMiLCJub3JtYWxpemVkVXJsIiwib2xkU2NyaXB0cyIsImhhc1R5cGVjaGVjayIsImNsZWFudXAiLCJ0eXBlY2hlY2siLCJ2ZXJpZnkiLCJhcHBseU1pc2VUYXNrU2NyaXB0cyIsInB5cmlnaHQiLCJoYXNKc09yVHMiLCJvbGRUZXN0IiwiZ2VuZXJhdGVGb3JtYXRTY3JpcHQiLCJoYXNNaXNlVGFzayIsImRvZXNNaXNlVGFza0NhbGxQYWNrYWdlU2NyaXB0IiwiaXNXYmZ5TWFuYWdlZE1pc2VCcmlkZ2UiLCJtaXNlVGFza3MiLCJSZWdFeHAiLCJyYXciLCJjb21tYW5kcyIsImJhc2VTZXR0aW5ncyIsImdsb2JfbWF0Y2hlciIsInByZUNvbW1pdFNldHRpbmdzIiwic3RhZ2VfZml4ZWQiLCJnZW5lcmF0ZUxlZnRob29rVXBkYXRpbmdQYWNrYWdlSnNvbiIsImh1c2t5RGlyUGF0aCIsImhhc0h1c2t5RGlyIiwic2V0dGluZ3MiLCJnZXRQcmVDb21taXRKb2JzIiwicHJlUHVzaCIsImxpbnRDb21tYW5kIiwicXVpZXRMaW50Q29tbWFuZCIsImdldFByZVB1c2hTY3JpcHQiLCJta2RpclN5bmMiLCJtb2RlIiwicG9zdE1lcmdlQ29tbWFuZCIsInBvc3RNZXJnZUNvbW1hbmRzIiwiaGFzVmVyc2lvblNldHRpbmdzIiwidG9vbHNDaGFuZ2VkUGF0dGVybiIsImluc3RhbGxDb21tYW5kIiwicm1OZXh0RGlyZWN0b3J5IiwiZ2VuSTE4blRzQ29tbWFuZCIsImdlbmVyYXRlUG9zdE1lcmdlQ29tbWFuZHMiLCJnZXRDbGVhbnVwR2xvYnMiLCJnZXRDbGVhbnVwQ29tbWFuZCIsInN1cHBvcnRlZEV4dGVuc2lvbnMiLCJsb2NhbFdiUGFja2FnZUpzb25QYXRoIiwiaGFzTG9jYWxXYldvcmtzcGFjZSIsImNhblVzZVdiRm9yU3RhZ2VkRmlsZXMiLCJveGxpbnRQYXR0ZXJuIiwib3hmbXRQYXR0ZXJuIiwicHJldHRpZXJQYXR0ZXJuIiwiaGFzUHl0aG9uUGFja2FnZU1hbmFnZXIiLCJnZXRQeXRob25SdW5uZXIiLCJnZW5lcmF0ZUxpbnRzdGFnZWRyYyIsIm5vcm1hbGl6ZUNvbmZpZ0NvbnRlbnQiLCJNYW5hZ2VkQ29uZmlnQmxvY2tzIiwiY29uc3RydWN0b3IiLCJibG9ja05hbWVzIiwibWFya2VyUHJlZml4IiwiZ2V0Q29uZmlnQ29udGVudCIsImhhc01hbmFnZWRCbG9ja3MiLCJyZXBsYWNlTWFuYWdlZEJsb2NrcyIsImRlc2lyZWRDb250ZW50IiwiZ2V0QmxvY2siLCJibG9ja05hbWUiLCJnZXRTdGFydE1hcmtlciIsImdldEVuZE1hcmtlciIsInJlcGxhY2VtZW50IiwiZXh0cmFjdE1hbmFnZWRCbG9jayIsIm5leHRDb250ZW50IiwicmVwbGFjZU1hbmFnZWRCbG9jayIsImdldE1hbmFnZWRCbG9ja1JlZ0V4cCIsInBhdHRlcm4iLCJlc2NhcGVSZWdFeHAiLCJtYW5hZ2VkQ29uZmlnQmxvY2tzIiwiZ2VuZXJhdGVPeGZtdENvbmZpZyIsImxlZ2FjeUpzb25Db25maWdQYXRoIiwiaXNFc21QYWNrYWdlIiwiZ2VuZXJhdGVPeGxpbnRDb25maWciLCJfcm9vdENvbmZpZyIsInNob3VsZFByZXNlcnZlUHVibGlzaGVkTGludGVyQ29uZmlnIiwiaXNSb290Q29uZmlnIiwiZ2V0UmVzb2x2ZWRDb25maWdDb250ZW50IiwiYmFzZUNvbmZpZ05hbWUiLCJnZW5lcmF0ZVByZXR0aWVyaWdub3JlIiwiZ2l0aWdub3JlRmlsZVBhdGgiLCJnaXRpZ25vcmVDb250ZW50IiwiYWRkaXRpb25hbENvbnRlbnQiLCJ2ZW52UGF0aCIsInZlbnYiLCJnZW5lcmF0ZVB5cmlnaHRDb25maWdKc29uIiwiZml4UmFpbHdheWlnbm9yZSIsImdlbmVyYXRlUmVhZG1lIiwiaW5zZXJ0QmFkZ2UiLCJmaWxlTmFtZXMiLCJyZWFkZGlyU3luYyIsImJhZGdlTmFtZSIsInRvVXBwZXJDYXNlIiwicmVtb3ZlR2l0SHViQWN0aW9uc0JhZGdlIiwicmVhZG1lIiwiaSIsImVzY2FwZWRCYWRnZU5hbWUiLCJlc2NhcGVkRmlsZU5hbWUiLCJnZW5lcmF0ZVJlbGVhc2VyYyIsInBsdWdpbnMiLCJwbHVnaW5FbnRyeSIsInBsdWdpbiIsInByZXNldCIsInN1Y2Nlc3NDb21tZW50Q29uZGl0aW9uIiwiZmFpbENvbW1lbnRDb25kaXRpb24iLCJsYWJlbHMiLCJyZWxlYXNlZExhYmVscyIsIiRzY2hlbWEiLCJnZW5lcmF0ZVJlbm92YXRlSnNvbiIsImdlbmVyYXRlZEV4dGVuZHMiLCJleGlzdGluZ0V4dGVuZHMiLCJwYWNrYWdlUnVsZXMiLCJydWxlIiwibWF0Y2hQYWNrYWdlTmFtZXMiLCJlbmFibGVkIiwiaW5zdGFsbEFnZW50U2tpbGxzIiwicm9vdEpzb25PYmoiLCJjb21waWxlck9wdGlvbnMiLCJhbHdheXNTdHJpY3QiLCJub1VuY2hlY2tlZEluZGV4ZWRBY2Nlc3MiLCJhbGxvd1N5bnRoZXRpY0RlZmF1bHRJbXBvcnRzIiwiZXNNb2R1bGVJbnRlcm9wIiwicmVzb2x2ZUpzb25Nb2R1bGUiLCJpbXBvcnRIZWxwZXJzIiwibm9FbWl0IiwiZXhjbHVkZSIsImluY2x1ZGUiLCJzdWJKc29uT2JqIiwiZ2VuZXJhdGVUc2NvbmZpZyIsIm1vZHVsZVJlc29sdXRpb24iLCJub3JtYWxpemVOZXh0VHNjb25maWdNb2R1bGVTZXR0aW5ncyIsImJhc2VVcmwiLCJhbGlhcyIsInRhcmdldHMiLCJub3JtYWxpemVQYXRoQWxpYXNUYXJnZXRzIiwibm9ybWFsaXplTmV4dFRzY29uZmlnUGF0aEFsaWFzZXMiLCJhZGRTY3JpcHRzSW5jbHVkZUZvckZyYW1ld29ya1Byb2plY3QiLCJjbGVhbnVwTGVnYWN5VHNjb25maWdNb2R1bGVTZXR0aW5ncyIsImdlbmVyYXRlZFR5cGVzIiwidHlwZU5hbWVzIiwidml0ZXN0IiwibW9jaGEiLCJjeXByZXNzIiwiZ2V0R2VuZXJhdGVkVHlwZXMiLCJnZXRUc2NvbmZpZ0V4dGVuZHMiLCJyb290RGlyIiwiZ2V0Um9vdERpciIsImRvZXNDb250YWluSnN4T3JUc3giLCJkb2VzQ29udGFpbkpzeE9yVHN4SW5QYWNrYWdlcyIsImpzeCIsImFkZEluY2x1ZGVQYXRoIiwiZXhpc3RpbmdUeXBlcyIsImV4aXN0aW5nRW1pdE1ldGFkYXRhIiwiZW1pdE9wdGlvbnMiLCJwaWNrRXhpc3RpbmdFbWl0TWV0YWRhdGEiLCJtZXJnZWRFeHRlbmRzIiwibm9ybWFsaXplRXh0ZW5kcyIsInVuaXF1ZUV4dGVuZHMiLCJtZXJnZVRzY29uZmlnRXh0ZW5kcyIsImVtaXREZWNsYXJhdGlvbk9ubHkiLCJyZXdyaXRlUmVsYXRpdmVJbXBvcnRFeHRlbnNpb25zIiwiZW5zdXJlVHNFeHRlbnNpb25FbWl0Q29tcGF0aWJpbGl0eSIsIm1lcmdlZFR5cGVzIiwiZmlsdGVyRXhpc3RpbmdUeXBlcyIsInR5cGVOYW1lIiwidHlwZVJvb3RzIiwiZXhwZXJpbWVudGFsRGVjb3JhdG9ycyIsIm1vZHVsZSIsImRlbGV0ZUxlZ2FjeU1vZHVsZVNldHRpbmdzIiwidG9Mb3dlckNhc2UiLCJ2ZXJiYXRpbU1vZHVsZVN5bnRheCIsIm5vcm1hbGl6ZUNvbW1vbkpzVHNjb25maWdTZXR0aW5ncyIsImlzQWJzb2x1dGUiLCJnZW5lcmF0ZWRUeXBlU2V0IiwiaXNHZW5lcmF0ZWRUZXN0R2xvYmFsVHlwZSIsImV4Y2x1ZGVGaWxlUGF0dGVybnMiLCJnZW5lcmF0ZVZzY29kZVNldHRpbmdzIiwiZXhjbHVkZUZpbGVQYXR0ZXJuIiwiZXhjbHVkZVNldHRpbmciLCJnZW5lcmF0ZVlhcm5yY1ltbCIsInlhcm5yY1ltbFBhdGgiLCJnZXRMYXRlc3RWZXJzaW9uIiwibmV3VmVyc2lvbiIsIm9sZFZlcnNpb24iLCJ2YWxpZE5ld1ZlcnNpb24iLCJpc05ld2VyVmVyc2lvbiIsInJlbGVhc2VzUGF0aCIsInlhcm5yY1BhdGgiLCJkZWZhdWx0U2VtdmVyUmFuZ2VQcmVmaXgiLCJlbmFibGVTY3JpcHRzIiwibm9kZUxpbmtlciIsIm5tTW9kZSIsIm5wbU1pbmltYWxBZ2VHYXRlIiwiYXBwcm92ZWRHaXRSZXBvc2l0b3JpZXMiLCJucG1QcmVhcHByb3ZlZFBhY2thZ2VzIiwiY29tcHJlc3Npb25MZXZlbCIsImluamVjdEVudmlyb25tZW50RmlsZXMiLCJlbmFibGVHbG9iYWxDYWNoZSIsIm9yaWdpbmFsTGVuZ3RoIiwicGx1Z2luUGF0aCIsImdldFlhcm5yY1ByZXR0aWVyQXJncyIsInNldHVwTGFiZWxzIiwic2V0dXBMYWJlbCIsImRlbGV0ZUxhYmVsIiwiY29sb3IiLCJyZXF1ZXN0IiwiREVQUkVDQVRFRF9TRUNSRVRfTkFNRVMiLCJyZXF1aXJlIiwiY3JlYXRlUmVxdWlyZSIsInNldHVwU2VjcmV0cyIsImRvdGVudiIsInF1aWV0Iiwic2VjcmV0TmFtZSIsInNlY3JldF9uYW1lIiwia2V5X2lkIiwia2V5SWQiLCJkYXRhIiwic29kaXVtIiwicmVhZHkiLCJzZWNyZXQiLCJyYXdLZXkiLCJmcm9tX2Jhc2U2NCIsImJhc2U2NF92YXJpYW50cyIsIk9SSUdJTkFMIiwicmF3U2VjIiwiZnJvbV9zdHJpbmciLCJlbmNCeXRlcyIsImNyeXB0b19ib3hfc2VhbCIsImVuY0Jhc2U2NCIsInRvX2Jhc2U2NCIsImVuY3J5cHRlZF92YWx1ZSIsInNldHVwR2l0SHViU2V0dGluZ3MiLCJiZWZvcmVSZXRyeSIsImhhbmRsZUVycm9yIiwicmV0cnlDb3VudCIsInJldHJ5TG9nZ2VyIiwic2hvdWxkUmV0cnkiLCJzbGVlcE1pbGxpc2Vjb25kcyIsInVwZGF0ZVNsZWVwTWlsbGlzZWNvbmRzIiwiZmFpbGVkQ291bnQiLCJ3aXRoUmV0cnkiLCJhbGxvd19hdXRvX21lcmdlIiwiYWxsb3dfbWVyZ2VfY29tbWl0IiwiYWxsb3dfc3F1YXNoX21lcmdlIiwiYWxsb3dfcmViYXNlX21lcmdlIiwiYWxsb3dfdXBkYXRlX2JyYW5jaCIsImRlbGV0ZV9icmFuY2hfb25fbWVyZ2UiLCJzcXVhc2hfbWVyZ2VfY29tbWl0X3RpdGxlIiwic3F1YXNoX21lcmdlX2NvbW1pdF9tZXNzYWdlIiwiaGVhZGVycyIsImlzR2l0SHViUGVybWlzc2lvbk9yVmlzaWJpbGl0eUVycm9yIiwicGFja2FnZU1hbmFnZXJSdW5QbGFjZWhvbGRlciIsInRlbXBsYXRlcyIsImdlbmVyYXRlR2l0SHViVGVtcGxhdGVzIiwiYXBwbHlQYWNrYWdlTWFuYWdlclRlbXBsYXRlIiwiZGlzdGFuY2UiLCJ0ZW1wbGF0ZSIsInBhY2thZ2VNYW5hZ2VyQ29tbWFuZCIsIndiZnlKc29uU2NoZW1hIiwieiIsInJlY29yZCIsIm9wdGlvbmFsIiwiZG9jIiwiZ2V0UGFja2FnZUNvbmZpZyIsImVzbVBhY2thZ2UiLCJwYWNrYWdlSnNvblRleHQiLCJyZWxlYXNlQnJhbmNoZXMiLCJyZWxlYXNlUGx1Z2lucyIsInJlbGVhc2VyY0pzb25QYXRoIiwiZnNwIiwiZmxhdCIsInJlcG9JbmZvIiwiZ2l0Iiwic2ltcGxlR2l0Iiwib3JpZ2luIiwiZ2V0UmVtb3RlcyIsInIiLCJyZW1vdGVVcmwiLCJyZWZzIiwicmVxdWVzdFJlcG9JbmZvIiwiZmV0Y2hSZXBvSW5mbyIsImN1cnJlbnQiLCJoYXNWZXJzaW9uU2V0dGluZ3NGaWxlIiwiZG9ja2VyZmlsZSIsIndiZnlKc29uUGF0aCIsIndiZnlKc29uVGV4dCIsInJlcG9GdWxsTmFtZSIsImZ1bGxfbmFtZSIsInJlcG9BdXRob3IiLCJyZXBvTmFtZSIsInJlcG9QYXJ0cyIsImlzUmVmZXJyZWRCeU90aGVyUmVwbyIsImNvbnRhaW5zQW55IiwiZG9lc0NvbnRhaW5Wc2NvZGVTZXR0aW5nc0pzb24iLCJnaXRodWIiLCJyZWFkTWlzZVRhc2tzIiwidGFza3MiLCJwYXJzZVRvbWwiLCJyZWFkTWlzZVRhc2tDb21tYW5kIiwib3JnIiwicmVkaXJlY3RlZEZ1bGxOYW1lIiwibG9jYXRpb24iLCJnZXRSZWRpcmVjdGVkUmVwb0Z1bGxOYW1lIiwiYWxsb3dlZEdpdEh1Yk9yZ2FuaXphdGlvblBhdHRlcm4iLCJhbGxvd2VkR2l0RGVwZW5kZW5jeVBhdHRlcm5zIiwiYXNzZXJ0U2FmZURlcGVuZGVuY3lTb3VyY2VzIiwiZGlzYWxsb3dlZFNvdXJjZXMiLCJnZXREaXNhbGxvd2VkRGVwZW5kZW5jeVNvdXJjZXMiLCJkZXRhaWxzIiwiZGVwZW5kZW5jeU5hbWUiLCJzZWN0aW9uTmFtZSIsImlzR2l0RGVwZW5kZW5jeVNwZWNpZmllciIsImlzQWxsb3dlZEdpdERlcGVuZGVuY3lTcGVjaWZpZXIiLCJpc0dpdEh1YlNob3J0aGFuZFNwZWNpZmllciIsInJlZnJlc2hCdW5Mb2NrIiwicm9vdERpclBhdGgiLCJhcmd2IiwieWFyZ3MiLCJwb3NpdGlvbmFsIiwiZGVzY3JpYmUiLCJkZWZhdWx0Iiwic2tpcERlcHMiLCJ2ZXJib3NlIiwicGFja2FnZUpzb25EaXIiLCJVUkwiLCJwYXRobmFtZSIsImdldFZlcnNpb24iLCJzdHJpY3QiLCJoYXNJbnZhbGlkUGFja2FnZUNvbmZpZyIsInBhY2thZ2VzRGlyUGF0aCIsInN1YkRpclBhdGhzIiwiZCIsImFiYnJldmlhdGlvblByb21pc2UiLCJzdWJQYWNrYWdlQ29uZmlncyIsInN1YkRpclBhdGgiLCJhbGxQYWNrYWdlQ29uZmlncyIsInNob3VsZFJ1bldvcmtmbG93cyIsInRoZW4iLCJleGl0Q29kZSJdLCJtYXBwaW5ncyI6Im9zQkFBT0EsZUFBZUMsRUFBTUMsR0FDMUIsT0FBTyxJQUFJQyxRQUFTQyxHQUFZQyxXQUFXRCxFQUFTRixHQUN0RCxDQ2lDT0YsZUFBZU0sRUFBb0JDLEdBQ3hDLElBQ0UsYUFBYUEsR0FDZixDQUFFLE1BQ0EsQ0FFSixDQUVPUCxlQUFlUSxFQUFxQkQsR0FDekMsSUFDRSxhQUFhQSxHQUNmLENBQUUsTUFBT0UsR0FDUCxHQUFxQixpQkFBVkEsR0FBc0JBLEdBQVMsU0FBVUEsR0FBd0IsV0FBZkEsRUFBTUMsS0FDakUsT0FFRixNQUFNRCxDQUNSLENBQ0YsQ0MvQ08sTUFBTUUsRUFBVSxJQUx2QixNQUNFQyxXQUFZLEVBQ1pDLG1CQUFvQixHQ2dCZixNQUFNQyxFQUFTLElBaEJ0QixNQUNFLCtCQUFNQyxDQUEwQkMsRUFBY0MsR0FDeENOLEVBQVFDLFdBQ1ZNLFFBQVFDLEtBQUssYUFBYUgscUJBRTVCLFVBQ1FDLEdBQ1IsQ0FBRSxNQUFPUixHQUNQUyxRQUFRQyxLQUFLLHFCQUFxQkgsTUFBU1AsYUFBaUJXLE1BQVFYLEVBQU1ZLE1BQVFDLE9BQU9iLE1BQzNGLENBQ0lFLEVBQVFDLFdBQ1ZNLFFBQVFDLEtBQUssY0FBY0gsbUJBRS9CLEdDWldPLEVBQVMsQ0FDcEIsMkJBQU1DLENBQXNCQyxHQUMxQixJQUNFLGFBQWFDLEVBQUdDLFNBQVNDLFNBQVNILEVBQVUsT0FDOUMsQ0FBRSxNQUNBLENBRUosRUFDQSxrQkFBTUksQ0FBYUosRUFBa0JLLFNBQzdCSixFQUFHQyxTQUFTSSxNQUFNQyxFQUFLQyxRQUFRUixHQUFXLENBQUVTLFdBQVcsSUFDN0QsSUFBSUMsRUFBb0JMLEVBQVFNLE9BQzVCRCxJQUNGQSxHQUFxQixZQUVqQlQsRUFBR0MsU0FBU1UsVUFBVVos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
|
|
31
|
+
`.trim()}function Zn(e){return e.doesContainPoetryLock||e.doesContainUvLock}function Qn(e){return e.doesContainUvLock?"uv run":"poetry run"}async function ei(t){return _.functionIgnoringException("generateLintstagedrc",async()=>{await Promise.all([E.run(()=>e.promises.rm(`${t.dirPath}/.lintstagedrc.cjs`,{force:!0})),E.run(()=>e.promises.rm(`${t.dirPath}/.lintstagedrc.js`,{force:!0})),E.run(()=>e.promises.rm(`${t.dirPath}/.lintstagedrc.json`,{force:!0}))])})}function ti(e){return e?.trim()}class ni{constructor(e){this.blockNames=e.blockNames,this.markerPrefix=e.markerPrefix,this.toolName=e.toolName}getConfigContent(e){return e.existingContent&&this.hasManagedBlocks(e.existingContent)?this.replaceManagedBlocks(e.existingContent,e.desiredContent,e.filePath):e.desiredContent}getBlock(e,t){return`${this.getStartMarker(e)}\n${t}\n${this.getEndMarker(e)}`}hasManagedBlocks(e){return this.blockNames.some(t=>e.includes(this.getStartMarker(t)))}replaceManagedBlocks(e,t,n){let i=e;for(const r of this.blockNames){const s=this.extractManagedBlock(t,r);if(!s)continue;const o=this.replaceManagedBlock(i,r,s);if(!o)return console.warn(`Skipped updating incomplete ${r} block in ${this.toolName} config: ${n}`),e;i=o}return i}extractManagedBlock(e,t){return this.getManagedBlockRegExp(t).exec(e)?.[0]}replaceManagedBlock(e,t,n){const i=this.getManagedBlockRegExp(t);if(i.test(e))return e.replace(i,n)}getManagedBlockRegExp(e){return new RegExp(`${ii(this.getStartMarker(e))}[\\s\\S]*?${ii(this.getEndMarker(e))}`)}getStartMarker(e){return`// wbfy:start ${this.markerPrefix}-${e}`}getEndMarker(e){return`// wbfy:end ${this.markerPrefix}-${e}`}}function ii(e){return e.replaceAll(/[.*+?^${}()|[\]\\]/g,String.raw`\$&`)}const ri=new ni({blockNames:["base","export"],markerPrefix:"oxfmt",toolName:"oxfmt"});async function si(n){return _.functionIgnoringException("generateOxfmtConfig",async()=>{const i=t.resolve(n.dirPath,".oxfmtrc.json"),r=t.resolve(n.dirPath,"oxfmt.config.ts"),s=await P.readFileIgnoringError(r),o=ri.getConfigContent({desiredContent:oi(n),existingContent:s,filePath:r}),a=[E.run(()=>e.promises.rm(i,{force:!0}))];ti(s)!==ti(o)&&a.push(E.run(()=>P.generateFile(r,o))),await Promise.all(a)})}function oi(e){return e.isEsmPackage?`${ri.getBlock("base","import config from '@willbooster/oxfmt-config';")}\n\n${ri.getBlock("export","export default config;")}\n`:`${ri.getBlock("base","/// <reference types=\"node\" />\n// oxlint-disable unicorn/prefer-module -- Oxfmt config files are only auto-discovered as .ts, and CommonJS avoids ESM package loading issues.\nconst oxfmtConfig = require('@willbooster/oxfmt-config');\n\nconst oxfmtResolvedConfig = oxfmtConfig.default ?? oxfmtConfig;")}\n\n${ri.getBlock("export","module.exports = oxfmtResolvedConfig;")}\n`}const ai=new ni({blockNames:["base","export"],markerPrefix:"oxlint",toolName:"oxlint"});async function ci(n,i){return _.functionIgnoringException("generateOxlintConfig",async()=>{const i=sn(n),r=t.resolve(n.dirPath,"oxlint.config.ts"),s=await P.readFileIgnoringError(r),o=i&&s&&!ai.hasManagedBlocks(s)?s:ai.getConfigContent({desiredContent:li(n),existingContent:s,filePath:r}).replaceAll("config.","oxlintResolvedConfig.");const a=[];i||a.push(E.run(()=>e.promises.rm(t.resolve(n.dirPath,".oxlintrc.json"),{force:!0})),E.run(()=>e.promises.rm(t.resolve(n.dirPath,"biome.json"),{force:!0})),E.run(()=>e.promises.rm(t.resolve(n.dirPath,"biome.jsonc"),{force:!0})),E.run(()=>e.promises.rm(t.resolve(n.dirPath,".eslintrc"),{force:!0})),E.run(()=>e.promises.rm(t.resolve(n.dirPath,".eslintrc.cjs"),{force:!0})),E.run(()=>e.promises.rm(t.resolve(n.dirPath,".eslintrc.js"),{force:!0})),E.run(()=>e.promises.rm(t.resolve(n.dirPath,".eslintrc.json"),{force:!0})),E.run(()=>e.promises.rm(t.resolve(n.dirPath,".eslintrc.yaml"),{force:!0})),E.run(()=>e.promises.rm(t.resolve(n.dirPath,".eslintrc.yml"),{force:!0})),E.run(()=>e.promises.rm(t.resolve(n.dirPath,"eslint.config.cjs"),{force:!0})),E.run(()=>e.promises.rm(t.resolve(n.dirPath,"eslint.config.js"),{force:!0})),E.run(()=>e.promises.rm(t.resolve(n.dirPath,"eslint.config.mjs"),{force:!0})),E.run(()=>e.promises.rm(t.resolve(n.dirPath,"eslint.config.ts"),{force:!0}))),ti(s)!==ti(o)&&a.push(E.run(()=>P.generateFile(r,o))),await Promise.all(a)})}function li(e){const t=e.isRoot;return e.isEsmPackage?`${ai.getBlock("base",`import oxlintBaseConfig from '@willbooster/oxlint-config';\n\n${pi("oxlintBaseConfig",t)}`)}\n\n${ai.getBlock("export","export default oxlintResolvedConfig;")}\n`:`${ai.getBlock("base",`/// <reference types="node" />\n// oxlint-disable unicorn/prefer-module -- Oxlint only auto-discovers .ts config files, and CommonJS avoids ESM package loading issues.\nconst oxlintBaseConfig = require('@willbooster/oxlint-config');\n\n${pi("oxlintBaseConfig.default ?? oxlintBaseConfig",t)}`)}\n\n${ai.getBlock("export","module.exports = oxlintResolvedConfig;")}\n`}function pi(e,t){return t?`const oxlintResolvedConfig = ${e};`:`// Oxlint only supports type-aware options in the root config, while it\n// still auto-discovers package-local config files in monorepos. Keep this as a\n// plain object copy so package typechecks do not export oxlint's private helper\n// types through the generated config variable.\nconst oxlintResolvedConfig: Record<string, unknown> = { ...${e} };\ndelete oxlintResolvedConfig.options;`}async function di(n){return _.functionIgnoringException("generatePrettierignore",async()=>{const i=t.resolve(n.dirPath,".prettierignore");if(!B(n))return void await E.run(()=>e.promises.rm(i,{force:!0}));const r=await P.readFileIgnoringError(i)??"",s=St.getHeadUserContent(r),o=St.getTailUserContent(r),a=t.resolve(n.dirPath,".gitignore"),c=await St.readGitignoreWithoutSeparators(a)||"";let l="";n.doesContainPubspecYaml&&(l="\nandroid/app/\nios/Runner/Assets.xcassets/\npubspec.yaml\n");const p=s+"\n3rd-party/\nandroid/\nios/\nno-format/\ntest-fixtures/\ntest/fixtures/\n*.d.ts\n*.min.js\n.yarn/\n.pnp.js\n"+l+c+o;await E.run(()=>P.generateFile(i,p))})}const ui={venvPath:".",venv:".venv"};async function fi(n){return _.functionIgnoringException("generatePyrightConfigJson",async()=>{let i=structuredClone(ui);const r=t.resolve(n.dirPath,"pyrightconfig.json");try{const t=await e.promises.readFile(r,"utf8"),n=JSON.parse(t);i=l.all([i,n,i],{arrayMerge:qe})}catch{}const s=JSON.stringify(i,void 0,2);await E.run(()=>P.generateFile(r,s))})}async function gi(e){return _.functionIgnoringException("fixRailwayignore",async()=>{const n=t.resolve(e.dirPath,".railwayignore"),i=await P.readFileIgnoringError(n);if(!i)return;const r=i.replace(/^scripts\/$/m,"scripts/**\n!scripts/\n!scripts/*.sh");r!==i&&await E.run(()=>P.generateFile(n,r))})}async function mi(n){return _.functionIgnoringException("generateReadme",async()=>{const i=t.resolve(n.dirPath,"README.md");let r=await e.promises.readFile(i,"utf8");e.existsSync(t.resolve(n.dirPath,".releaserc.json"))&&(r=yi(r,"[](https://github.com/semantic-release/semantic-release)"));const s=n.repository?.slice(n.repository.indexOf(":")+1),o=t.resolve(n.dirPath,".github","workflows"),a=e.existsSync(o)?e.readdirSync(o):[];for(const i of a){if(!i.startsWith("test")&&!i.startsWith("deploy"))continue;let o=i;if(o=(o[0]||"").toUpperCase()+o.slice(1,o.indexOf(".")),o=o.replace("-"," "),!s)continue;const a=`[](https://github.com/${s}/actions/workflows/${i})`;e.existsSync(t.resolve(n.dirPath,`.github/workflows/${i}`))&&(r=hi(r,o,i),r=yi(r,a))}await E.run(()=>P.generateFile(i,r))})}function yi(e,t){e=e.replace(t,"").replaceAll(/\n\n\n+/g,"\n\n");for(let n=0;n<e.length;n++)if("\n"===e[n-1]&&"\n"===e[n]){const i=e.slice(0,n+1);let r=e.slice(n+1);return r.startsWith("[")||r.startsWith("!")||(r=`\n${r}`),`${i}${t}\n${r}`}return`${e}\n${t}\n`}function hi(e,t,n){const i=wi(t),r=wi(n);return e.replaceAll(new RegExp(String.raw`\[!\[${i}\]\(https://github\.com/[^/\s)]+/[^/\s)]+/actions/workflows/${r}/badge\.svg\)\]\(https://github\.com/[^/\s)]+/[^/\s)]+/actions/workflows/${r}\)\n?`,"gu"),"").replaceAll(/\n\n\n+/g,"\n\n")}function wi(e){return e.replaceAll(/[.*+?^${}()|[\]\\]/g,String.raw`\$&`)}async function bi(n){return _.functionIgnoringException("generateReleaserc",async()=>{const i=t.resolve(n.dirPath,".releaserc.json");if(!e.existsSync(i))return;const r=JSON.parse(await e.promises.readFile(i,"utf8")),s=r.plugins??[];for(let e=0;e<s.length;e++){const t=s[e],n=Array.isArray(t),i=n?t[0]:t,r=n&&t[1]||{};"@semantic-release/commit-analyzer"===i?s[e]=["@semantic-release/commit-analyzer",l.all([r,{preset:"conventionalcommits"}],{arrayMerge:qe})]:"@semantic-release/github"===i&&(s[e]=["@semantic-release/github",l.all([r,{successCommentCondition:!1,failCommentCondition:!1,labels:["r: semantic-release"],releasedLabels:["released :bookmark:"]}],{arrayMerge:qe})])}const o=JSON.stringify(r,void 0,2);await E.run(()=>P.generateFile(i,o))})}const vi={$schema:"https://docs.renovatebot.com/renovate-schema.json",extends:["github>WillBooster/willbooster-configs:renovate.json5"]};async function ki(n){return _.functionIgnoringException("generateRenovateJson",async()=>{let i=structuredClone(vi);const r=t.resolve(n.dirPath,"renovate.json");if(e.existsSync(`${r}5`))return;try{const t=await e.promises.readFile(r,"utf8"),n=JSON.parse(t);i=l.all([i,n,i],{arrayMerge:qe}),i.extends=(s=vi.extends,o=n.extends??[],[...new Set([...s,...o])].filter(e=>"@willbooster"!==e))}catch{}var s,o;n.depending.blitz&&(i.packageRules??=[],i.packageRules.some(e=>e.matchPackageNames?.includes("next"))||i.packageRules.push({matchPackageNames:["next"],enabled:!1})),await E.run(()=>e.promises.rm(t.resolve(n.dirPath,".dependabot"),{force:!0})),await E.run(()=>e.promises.rm(t.resolve(n.dirPath,".renovaterc.json"),{force:!0}));const a=JSON.stringify(i,void 0,2);await E.run(()=>P.generateFile(r,a))})}async function xi(e){return _.functionIgnoringException("installAgentSkills",async()=>{})}const ji={compilerOptions:{alwaysStrict:!0,noUncheckedIndexedAccess:!0,allowSyntheticDefaultImports:!0,esModuleInterop:!0,resolveJsonModule:!0,importHelpers:!1,noEmit:!0},exclude:["packages/*/test/fixtures","test/fixtures"],include:["*.config.ts","packages/*/*.config.ts","packages/*/scripts/**/*","packages/*/src/**/*","packages/*/test/**/*","scripts/**/*","src/**/*","test/**/*"]},$i={compilerOptions:{alwaysStrict:!0,noUncheckedIndexedAccess:!0,allowSyntheticDefaultImports:!0,esModuleInterop:!0,resolveJsonModule:!0,importHelpers:!1,noEmit:!0},exclude:["test/fixtures"],include:["*.config.ts","scripts/**/*","src/**/*","test/**/*"]};async function Si(n){return _.functionIgnoringException("generateTsconfig",async()=>{if(n.depending.blitz||n.depending.next)return void await async function(n){const i=t.resolve(n.dirPath,"tsconfig.json");try{const t=JSON.parse(await e.promises.readFile(i,"utf8"));!function(e){if(!e)return;"node"!==e.moduleResolution&&"Node"!==e.moduleResolution&&"node10"!==e.moduleResolution&&void 0!==e.moduleResolution||(e.moduleResolution="bundler")}(t.compilerOptions),function(e){if(!e)return;if(delete e.baseUrl,!e.paths)return;for(const[t,n]of Object.entries(e.paths))e.paths[t]=_i(n)}(t.compilerOptions),function(e){if(!e.include)return;if(e.include.includes("scripts/**/*"))return;e.include.push("scripts/**/*"),e.include.sort()}(t),await E.run(()=>P.generateFile(i,JSON.stringify(t,void 0,2)))}catch{}}(n);let i=structuredClone(n.isRoot?ji:$i);const r=function(e){const t=new Set,n={...e.packageJson?.dependencies,...e.packageJson?.devDependencies};e.isBun?t.add("bun"):e.depending.reactNative||t.add("node");(n.jest||n["@jest/globals"]||n["jest-environment-jsdom"]||n["ts-jest"])&&t.add("jest");n.vitest&&t.add("vitest/globals");n.mocha&&t.add("mocha");n.cypress&&t.add("cypress");return[...t]}(n);i.extends=function(e){return e.isBun?"@tsconfig/bun/tsconfig.json":e.depending.reactNative?"@tsconfig/react-native/tsconfig.json":["@tsconfig/node-lts/tsconfig.json","@tsconfig/node-ts/tsconfig.json"]}(n),i.compilerOptions??={},i.compilerOptions.rootDir=function(n){return n.isRoot?".":e.existsSync(t.resolve(n.dirPath,"..","..","package.json"))?"../..":"."}(n),r.length>0&&(i.compilerOptions={...i.compilerOptions,types:r}),n.doesContainJsxOrTsx||n.doesContainJsxOrTsxInPackages?n.isBun||n.depending.reactNative||(i.compilerOptions={...i.compilerOptions,jsx:"react-jsx"}):delete i.compilerOptions?.jsx,n.isRoot&&!n.doesContainSubPackageJsons&&(i.include=i.include?.filter(e=>!e.startsWith("packages/*/")),i.exclude=i.exclude?.filter(e=>!e.startsWith("packages/*/"))),n.depending.prisma&&function(e,t){e.include??=[],e.include.includes(t)||e.include.push(t)}(i,"prisma/**/*");const s=t.resolve(n.dirPath,"tsconfig.json");try{const t=await e.promises.readFile(s,"utf8"),n=JSON.parse(t),a=(o=n.compilerOptions?.types,"string"==typeof o?[o]:Array.isArray(o)?o.filter(e=>"string"==typeof e):[]),c=function(e){const t={};for(const n of["declaration","declarationMap","sourceMap"]){const i=e?.[n];void 0!==i&&(t[n]=i)}return t}(n.compilerOptions);i.extends=function(e,t){const n=[...Pi(e),...Pi(t)],i=[...new Set(n)];return 0===i.length?void 0:1===i.length?i[0]:i}(i.extends,n.extends),delete n.extends,delete n.compilerOptions?.jsx,i=l.all([i,n,i],{arrayMerge:He}),i.include=i.include?.filter(e=>!e.includes("@types")&&!e.includes("__tests__/")&&!e.includes("tests/")),i.compilerOptions??={},i.compilerOptions={...i.compilerOptions,...c},function(e){if(!e)return;if(!1!==e.noEmit||!0===e.emitDeclarationOnly)return;e.rewriteRelativeImportExtensions=!0}(i.compilerOptions);const p=[...new Set([...Ei(a,r),...r])];p.length>0?i.compilerOptions.types=p:delete i.compilerOptions.types,r.some(e=>"cypress"===e||e.includes("/"))&&delete i.compilerOptions.typeRoots}catch{}var o;Ve(i),i.include?.sort(),delete i.compilerOptions?.experimentalDecorators,delete i.compilerOptions?.baseUrl,function(e,t){if(!e)return;"node"!==e.moduleResolution&&"Node"!==e.moduleResolution&&"node10"!==e.moduleResolution||delete e.moduleResolution;if(t.isBun||t.depending.reactNative||"ESNext"!==e.module)return;delete e.module}(i.compilerOptions,n),function(e,t){if(!e||t.isBun||t.depending.reactNative||t.isEsmPackage)return;"commonjs"===e.module?.toLowerCase()&&(e.module="Node16");e.verbatimModuleSyntax=!1}(i.compilerOptions,n),n.depending.reactNative&&delete i.compilerOptions?.verbatimModuleSyntax;const a=JSON.stringify(i,void 0,2);await E.run(()=>P.generateFile(s,a))})}function _i(e){return e.map(e=>e.startsWith("./")||e.startsWith("../")||t.isAbsolute(e)?e:`./${e}`)}function Pi(e){return e?Array.isArray(e)?e:[e]:[]}function Ei(e,t){const n=new Set(t);return e.filter(e=>!(function(e){return"cypress"===e||"jest"===e||"mocha"===e||"vitest/globals"===e}(e)&&!n.has(e)))}const Ci=["**/.git/objects/**","**/.git/subtree-cache/**","**/node_modules/**","**/tmp/**","**/temp/**","**/dist/**"];async function Oi(n){return _.functionIgnoringException("generateVscodeSettings",async()=>{try{const i=t.resolve(n.dirPath,".vscode","settings.json"),r=await e.promises.readFile(i,"utf8");let s=JSON.parse(r);for(const e of Ci)s=l.all([s,Bi(e)]);(n.doesContainPoetryLock||n.doesContainUvLock)&&(s=l.all([s,Bi("**/.venv/**")])),n.depending.next&&(s=l.all([s,Bi("**/.next/**")])),"editor.codeActionsOnSave"in s&&delete s["editor.codeActionsOnSave"],"editor.formatOnSave"in s&&delete s["editor.formatOnSave"],Ve(s);const o=JSON.stringify(s,void 0,2);await E.run(()=>P.generateFile(i,o))}catch{}})}function Bi(e){return{"files.watcherExclude":{[e]:!0}}}async function Ai(n){return _.functionIgnoringException("generateYarnrcYml",async()=>{const i=t.resolve(n.dirPath,".yarnrc.yml");if(n.isBun)return await E.run(()=>e.promises.rm(i,{force:!0})),await E.run(()=>e.promises.rm(t.resolve(n.dirPath,".yarn"),{force:!0,recursive:!0})),void await E.run(()=>e.promises.rm(t.resolve(n.dirPath,"yarn.lock"),{force:!0,recursive:!0}));const r=Yt("yarn",["--version"],n.dirPath),s=function(e,t){return Yt("npm",["show",e,"version"],t)||"0.0.0"}("@yarnpkg/cli",n.dirPath);(function(e,t){const n=m.valid(e);return!!n&&m.gt(n,m.valid(t)??"0.0.0")})(s,r)&&qt("yarn",["set","version",s],n.dirPath,1);const o=t.join(n.dirPath,".yarn","releases");await e.promises.mkdir(o,{recursive:!0});for(const n of await e.promises.readdir(o))n.startsWith("yarn-")&&!n.startsWith(`yarn-${s}.`)&&await E.run(()=>e.promises.rm(t.join(o,n)));const a=t.resolve(n.dirPath,".yarnrc");await E.run(()=>e.promises.rm(a,{force:!0}));let c={};try{c=p.load(await e.promises.readFile(i,"utf8"))??c}catch{}c.defaultSemverRangePrefix="",c.enableScripts=!1,c.nodeLinker="node-modules",c.nmMode="hardlinks-global",c.npmMinimalAgeGate="5d",c.approvedGitRepositories=["https://github.com/WillBooster/*.git","ssh://git@github.com/WillBooster/*.git","https://github.com/WillBoosterLab/*.git","ssh://git@github.com/WillBoosterLab/*.git"],c.npmPreapprovedPackages=["@exercode/*","@willbooster/*","agent-runtime-kit","at-decorators","build-ts","gen-i18n-ts","one-way-git-sync","next","@next/*","@types/*","@typescript/*","@oxfmt/*","@oxlint/*","@oxlint-tsgolint/*","oxfmt","oxlint","oxlint-tsgolint","react","react-dom"],delete c.compressionLevel,0===c.injectEnvironmentFiles?.length&&delete c.injectEnvironmentFiles,c.enableGlobalCache=!0;const l=c.plugins?.length??0;if(c.plugins=c.plugins?.filter(e=>".yarn/plugins/undefined.cjs"!==e.path)??[],c.plugins.length!==l){const i=t.resolve(n.dirPath,".yarn","plugins","undefined.cjs");await E.run(()=>e.promises.rm(i,{force:!0}))}0===c.plugins.length&&delete c.plugins,await e.promises.writeFile(i,p.dump(c,{lineWidth:-1})),qt("yarn",["dlx","yarn-plugin-auto-install"],n.dirPath),qt("yarn",function(e,n){return["dlx","prettier","--no-config","--write",t.relative(e,n)]}(n.dirPath,i),n.dirPath)})}async function Fi(e){return _.functionIgnoringException("setupLabels",async()=>{const[t,n]=Vt.getOrgAndName(e.repository??"");if(!t||!n)return;if("WillBooster"!==t&&"WillBoosterLab"!==t)return;if(!Qt(t))return;const i=Zt(t);try{await Ri(i,t,n,"d1: x-easy :hedgehog:","EDE9FE"),await Ri(i,t,n,"d2: easy :rabbit2:","DDD6FE"),await Ri(i,t,n,"d3: medium :ox:","C4B5FD"),await Ri(i,t,n,"d4: hard :squid:","A78BFA"),await Ri(i,t,n,"d5: x-hard :whale2:","8B5CF6"),await Ri(i,t,n,"p1: critical :fire::fire::fire:","EF4444"),await Ri(i,t,n,"p2: urgent :fire::fire:","F87171"),await Ri(i,t,n,"p3: important :fire:","FCA5A5"),await Ri(i,t,n,"p4: nice to have :droplet:","FECACA"),await Ri(i,t,n,"r: blitz","5300bc"),await Ri(i,t,n,"r: firebase","ffca28"),await Ri(i,t,n,"r: prisma","0c344b"),await Ri(i,t,n,"r: react","61dafb"),await Ri(i,t,n,"r: svelte","ff3e00"),await Ri(i,t,n,"r: semantic-release","494949"),await Ri(i,t,n,"ready :rocket:","22C55E"),await Ri(i,t,n,"review requested :mag:","FBCA04"),await Ri(i,t,n,"released :bookmark:","6366F1"),await Ri(i,t,n,"s: 0.5h :clock1230:","F3F4F6"),await Ri(i,t,n,"s: 1h :clock1:","E5E7EB"),await Ri(i,t,n,"s: 2h :clock2:","D1D5DB"),await Ri(i,t,n,"s: 3h :clock3:","9CA3AF"),await Ri(i,t,n,"s: 5h :clock5:","6B7280"),await Ri(i,t,n,"s: 8h :clock8:","4B5563"),await Ri(i,t,n,"s: 13h :clock1:","374151"),await Ri(i,t,n,"t: build :hammer:","BFDBFE"),await Ri(i,t,n,"t: chore :broom:","BFDBFE"),await Ri(i,t,n,"t: ci :construction_worker:","BFDBFE"),await Ri(i,t,n,"t: docs :memo:","BFDBFE"),await Ri(i,t,n,"t: feat :sparkles:","BFDBFE"),await Ri(i,t,n,"t: fix :bug:","BFDBFE"),await Ri(i,t,n,"t: perf :zap:","BFDBFE"),await Ri(i,t,n,"t: refactor :recycle:","BFDBFE"),await Ri(i,t,n,"t: style :lipstick:","BFDBFE"),await Ri(i,t,n,"t: test :test_tube:","BFDBFE"),await Ri(i,t,n,"project","24292F"),await Ri(i,t,n,"focused :dart:","22C55E"),await Ii(i,t,n,"bug"),await Ii(i,t,n,"documentation"),await Ii(i,t,n,"duplicate"),await Ii(i,t,n,"enhancement"),await Ii(i,t,n,"good first issue"),await Ii(i,t,n,"help wanted"),await Ii(i,t,n,"invalid"),await Ii(i,t,n,"question"),await Ii(i,t,n,"wontfix"),await Ii(i,t,n,"ready"),await Ii(i,t,n,"review requested"),await Ii(i,t,n,"released"),await Ii(i,t,n,"semantic-release"),await Ii(i,t,n,"llm-pr :robot:"),await Ii(i,t,n,"ai-pr :robot:"),await Ii(i,t,n,"gen-pr-all :robot:"),await Ii(i,t,n,"gen-pr-claude :robot:"),await Ii(i,t,n,"gen-pr-codex :robot:"),await Ii(i,t,n,"gen-pr-gemini :robot:")}catch(e){console.warn("Skip setupLabels due to:",e?.stack??e)}})}async function Ri(e,t,n,i,r){try{await e.request("POST /repos/{owner}/{repo}/labels",{owner:t,repo:n,name:i,color:r})}catch{await e.request("PATCH /repos/{owner}/{repo}/labels/{name}",{owner:t,repo:n,name:i,color:r})}}async function Ii(e,t,n,i){try{await e.request("DELETE /repos/{owner}/{repo}/labels/{name}",{owner:t,repo:n,name:i})}catch{}}const Di=["READY_DISCORD_WEBHOOK_URL","GH_BOT_PAT","PUBLIC_GH_BOT_PAT"],Ti=h(import.meta.url);async function Wi(e){return _.functionIgnoringException("setupSecrets",async()=>{const[n,i]=Vt.getOrgAndName(e.repository??"");if(!n||!i||"WillBoosterLab"!==n)return;if(!Qt(n)||!S.doesUploadEnvVars)return;const r=w.config({path:t.resolve(e.dirPath,".env"),quiet:!0}).parsed??{};if(0===Object.keys(r).length)return;const s=Zt(n);try{for(const e of Di)try{await s.request("DELETE /repos/{owner}/{repo}/actions/secrets/{secret_name}",{owner:n,repo:i,secret_name:e})}catch{}const e=await s.request("GET /repos/{owner}/{repo}/actions/secrets/public-key",{owner:n,repo:i}),{key:t,key_id:o}=e.data,a=Ti("libsodium-wrappers");await a.ready;for(const[e,c]of Object.entries(r)){if("GH_BOT_PAT"===e||"GH_BOT_PAT_FOR_WILLBOOSTER"===e||"GH_BOT_PAT_FOR_WILLBOOSTERLAB"===e)continue;const r=a.from_base64(t,a.base64_variants.ORIGINAL),l=a.from_string(c),p=a.crypto_box_seal(l,r),d=a.to_base64(p,a.base64_variants.ORIGINAL);await s.request("PUT /repos/{owner}/{repo}/actions/secrets/{secret_name}",{owner:n,repo:i,secret_name:e,encrypted_value:d,key_id:o})}}catch(e){console.warn("Skip setupSecrets due to:",e?.stack??e)}})}async function Ni(e){return _.functionIgnoringException("setupGitHubSettings",async()=>{const[t,n]=Vt.getOrgAndName(e.repository??"");if(!t||!n)return;if("WillBooster"!==t&&"WillBoosterLab"!==t)return;if(!Qt(t))return;const i=Zt(t);try{await async function(e,{beforeRetry:t,handleError:n,retryCount:i=3,retryLogger:r,shouldRetry:s,sleepMilliseconds:o=0,updateSleepMilliseconds:a}={}){let c=0;for(;;)try{return await e(c)}catch(e){if(await(n?.(e)),c++,c>=i)throw e;if(s&&!s(e))throw e;o>0&&await x(o),a&&(o=a(o)),r?.(`Retry due to: ${e}\n${e instanceof Error?"---\n"+(e.stack??""):""}`),await(t?.(e))}}(()=>i.request("PATCH /repos/{owner}/{repo}",{owner:t,repo:n,allow_auto_merge:!0,allow_merge_commit:!1,allow_squash_merge:!0,allow_rebase_merge:!1,allow_update_branch:!0,delete_branch_on_merge:!0,squash_merge_commit_title:"PR_TITLE",squash_merge_commit_message:"BLANK",headers:{"X-GitHub-Api-Version":"2022-11-28"},...e.repository?.startsWith("github:WillBooster/")?{allow_auto_merge:!0}:{}}),{shouldRetry:e=>!Li(e)})}catch(e){if(!Li(e))throw e;console.warn("Skip setupGitHubSettings due to:",e?.stack??e)}})}function Li(e){return!(!e||"object"!=typeof e||!("status"in e))&&(401===e.status||403===e.status||404===e.status)}const Mi="__PM_RUN__",Ji={"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., \`${Mi} test\`) passed.\n - The lint command (e.g., \`${Mi} 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 Ui(n){return _.functionIgnoringException("generateGitHubTemplates",async()=>{if(n.isWillBoosterRepo)for(const[i,r]of Object.entries(Ji)){const s=zi(r,n),o=t.resolve(n.dirPath,".github",i);if(e.existsSync(o)){const t=await e.promises.readFile(o,"utf8");if(b(t,s)>s.length/2)continue}await e.promises.mkdir(t.resolve(n.dirPath,".github"),{recursive:!0}),await E.run(()=>P.generateFile(o,s))}})}function zi(e,t){const n=t.isBun?"bun run":"yarn";return e.replaceAll(Mi,n)}const Gi=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 qi(n,i){const r=t.resolve(n,"package.json");try{const o=e.existsSync(r);let a={},c={},l={},p=!1;if(o){const t=e.readFileSync(r,"utf8");l=JSON.parse(t),a=l.dependencies??{},c=l.devDependencies??{},p="module"===l.type}let d=[],u=[];try{const e=t.resolve(n,".releaserc.json"),i=JSON.parse(await s.readFile(e,"utf8"));d=i?.branches??[],u=i?.plugins?.flat()??[]}catch{}const f="packages"!==t.basename(t.resolve(n,".."))||!e.existsSync(t.resolve(n,"..","..","package.json"));let g;f&&(g=await async function(e,t){const n=v(e),i=(await n.getRemotes(!0)).find(e=>"origin"===e.name),r=i?.refs.fetch??i?.refs.push;if("string"==typeof r){const e=await Vi(r);if(e)return e}const s="string"==typeof t.repository?t.repository:t.repository?.url;if(s){const e=await Vi(s);if(e&&"Not Found"!==e.message)return e}}(n,l));let m=function(n){const i=t.resolve(n);return e.existsSync(t.join(i,"mise.toml"))||e.existsSync(t.join(i,".mise.toml"))||e.existsSync(t.join(i,".tool-versions"))}(n);for(const i of["java","node","python"])if(e.existsSync(t.resolve(n,`.${i}-version`))){m=!0;break}let y="";try{y=await s.readFile(t.resolve(n,"Dockerfile"),"utf8")}catch{}const h=t.resolve(n,"wbfy.json");let w;try{const e=await s.readFile(h,"utf8");w=Gi.parse(JSON.parse(e))}catch{}const b="string"==typeof g?.full_name?g.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:f,isPublicRepo:!1===g?.private,isReferredByOtherRepo:!!l.files,repository:j,repoAuthor:k,repoName:x,isWillBoosterRepo:Boolean(j?.startsWith("github:WillBooster/")||j?.startsWith("github:WillBoosterLab/")),isBun:i?.isBun||e.existsSync(t.join(n,"bun.lock")),isEsmPackage:p,isWillBoosterConfigs:r.includes("/willbooster-configs"),doesContainSubPackageJsons:Ki("packages/**/package.json",n),doesContainDockerfile:!!y||e.existsSync(t.resolve(n,"docker-compose.yml")),doesContainGemfile:e.existsSync(t.resolve(n,"Gemfile")),doesContainGoMod:e.existsSync(t.resolve(n,"go.mod")),doesContainPackageJson:e.existsSync(t.resolve(n,"package.json")),doesContainPoetryLock:e.existsSync(t.resolve(n,"poetry.lock")),doesContainUvLock:e.existsSync(t.resolve(n,"uv.lock")),doesContainPomXml:e.existsSync(t.resolve(n,"pom.xml")),doesContainPubspecYaml:e.existsSync(t.resolve(n,"pubspec.yaml")),doesContainTemplateYaml:e.existsSync(t.resolve(n,"template.yaml")),doesContainVscodeSettingsJson:e.existsSync(t.resolve(n,".vscode","settings.json")),doesContainJavaScript:Ki("{app,src,test,scripts}/**/*.{cjs,mjs,js,jsx}",n),doesContainTypeScript:Ki("{app,src,test,scripts}/**/*.{cts,mts,ts,tsx}",n),doesContainJsxOrTsx:Ki("{app,src,test}/**/*.{t,j}sx",n),doesContainJava:Ki("**/*.java",n),doesContainJavaScriptInPackages:Ki("packages/**/{app,src,test,scripts}/**/*.{cjs,mjs,js,jsx}",n),doesContainTypeScriptInPackages:Ki("packages/**/{app,src,test,scripts}/**/*.{cts,mts,ts,tsx}",n),doesContainJsxOrTsxInPackages:Ki("packages/**/{app,src,test}/**/*.{t,j}sx",n),doesContainJavaInPackages:Ki("packages/**/*.java",n),depending:{blitz:!!a.blitz,chakra:!!c["@chakra-ui/cli"],drizzle:!!a["drizzle-orm"]||!!c["drizzle-kit"],firebase:!!c["firebase-tools"],genI18nTs:!!a["gen-i18n-ts"]||!!c["gen-i18n-ts"],litestream:y.includes("install-litestream.sh"),react:!!a.react,next:!!a.next,playwrightTest:!!a["@playwright/test"]||!!c["@playwright/test"]||!!c.playwright,prisma:!!a["@prisma/client"]||!!c.prisma,pyright:!!c.pyright,reactNative:!!a["react-native"],semanticRelease:!!(c["semantic-release"]||d.length>0||u.length>0),storybook:!!c["@storybook/react"],wb:!!a["@willbooster/wb"]||!!c["@willbooster/wb"]},release:{branches:d,github:u.includes("@semantic-release/github"),npm:u.includes("@semantic-release/npm")},hasVersionSettings:m,miseTasks:await Hi(n),packageJson:l,wbfyJson:w};if($.doesContainGemfile||$.doesContainGoMod||$.doesContainPackageJson||$.doesContainPoetryLock||$.doesContainUvLock||$.doesContainPomXml||$.doesContainPubspecYaml||$.doesContainTemplateYaml)return $}catch{}}async function Hi(e){const n={};for(const i of["mise.toml",".mise.toml"]){const r=t.resolve(e,i);try{const e=d(await s.readFile(r,"utf8"));for(const[t,i]of Object.entries(e.tasks??{}))n[t]=Yi(i)}catch{}}return n}function Yi(e){return"string"==typeof e?e:Array.isArray(e)?e.filter(e=>"string"==typeof e).join("\n"):e&&"object"==typeof e?Yi(e.run):""}function Ki(e,t){return o.globSync(e,{dot:!0,cwd:t,ignore:G}).length>0}async function Vi(e){const[t,n]=Vt.getOrgAndName(e);if(t&&n)try{return(await Zt().request("GET /repos/{owner}/{repo}",{owner:t,repo:n})).data}catch(e){const t=function(e){if(!e||"object"!=typeof e)return;const t="response"in e?e.response:void 0,n=t?.status??e.status;if(301!==n&&302!==n)return;const i=t?.headers?.location;if("string"!=typeof i)return;const[r,s]=Vt.getOrgAndName(i);if(!r||!s)return;return`${r}/${s}`}(e);if(t)return{full_name:t}}}const Xi=["dependencies","devDependencies","optionalDependencies","peerDependencies"],Zi=String.raw`(?:WillBooster|WillBoosterLab)`,Qi=[new RegExp(`^${Zi}/[^#\\s]+(?:#\\S+)?$`,"u"),new RegExp(`^github:${Zi}/[^#\\s]+(?:#\\S+)?$`,"u"),new RegExp(`^(?:git\\+)?https://github\\.com/${Zi}/[^#\\s]+(?:\\.git)?(?:#\\S+)?$`,"u"),new RegExp(`^(?:git\\+)?ssh://git@github\\.com[:/]${Zi}/[^#\\s]+(?:\\.git)?(?:#\\S+)?$`,"u"),new RegExp(`^(?:git\\+)?git@github\\.com:${Zi}/[^#\\s]+(?:\\.git)?(?:#\\S+)?$`,"u")];function er(e){const n=e.flatMap(tr);if(0===n.length)return;const i=n.map(({dependencyName:e,dirPath:n,sectionName:i,specifier:r})=>`- ${t.join(n,"package.json")}: ${i}.${e} uses ${r}`).join("\n");throw new Error(`Disallowed Git dependency sources found.\nOnly WillBooster and WillBoosterLab GitHub dependencies are allowed.\n${i}`)}function tr(e){const t=e.packageJson;if(!t)return[];const n=[];for(const i of Xi){const r=t[i];if(r)for(const[t,s]of Object.entries(r))s&&nr(s)&&(ir(s)||n.push({dependencyName:t,dirPath:e.dirPath,sectionName:i,specifier:s}))}return n}function nr(e){return function(e){return/^[a-zA-Z0-9][\w.-]*\/[\w.-]+(?:#\S+)?$/u.test(e)}(e)||/^(?:bitbucket|gist|github|gitlab):/u.test(e)||/^https?:\/\/(?:bitbucket\.org|github\.com|gitlab\.com)\//u.test(e)||/^(?:https?|ssh):\/\/\S+\.git(?:#\S+)?$/u.test(e)||/^[^@\s]+@[^:\s]+:\S+(?:#\S+)?$/u.test(e)||e.startsWith("git:")||e.startsWith("git+")||e.startsWith("ssh://git@")}function ir(e){return Qi.some(t=>t.test(e))}function rr(e){const t=Ht("bun",["install"],e);if(0!==t)throw new Error(`Failed to refresh Bun lockfile: bun install exited with status ${t}`)}await async function(){const i=await n(process.argv.slice(2)).command("$0 [paths..]","Make a given project follow the WillBooster standard",e=>{e.positional("paths",{describe:"project paths to be wbfied",array:!0,type:"string",default:["."]})}).options({env:{description:"Upload environment variables as secrets to GitHub",type:"boolean",default:!1,alias:"e"},skipDeps:{description:"Skip dependency installation",type:"boolean",default:!1,alias:"d"},verbose:{description:"Whether or not to enable verbose mode",type:"boolean",default:!1,alias:"v"}}).version(function(){let n=t.dirname(new URL(import.meta.url).pathname);for(;!e.existsSync(t.join(n,"package.json"));)n=t.dirname(n);return JSON.parse(e.readFileSync(t.join(n,"package.json"),"utf8")).version}()).strict().argv;S.isVerbose=i.verbose,S.doesUploadEnvVars=i.env;let r=!1;for(const n of i.paths){const s=t.join(n,"packages"),o=(await j(()=>e.promises.readdir(s,{withFileTypes:!0}))??[]).filter(e=>e.isDirectory()).map(e=>t.join(s,e.name));await Ue([n,...o]);const a=await qi(n);if(S.isVerbose,!a){console.error(`there is no valid package.json in ${n}`),r=!0;continue}const c=ot(a),l=(await Promise.all(o.map(e=>qi(e,a)))).filter(e=>!!e),p=[a,...l];if(S.isVerbose)for(const e of p)console.info(e);er(p),await Ai(a),a.isBun&&await wt(a);const d=!tt(a.repository)&&(a.repository?.startsWith("github:WillBooster/")||a.repository?.startsWith("github:WillBoosterLab/"));await Promise.all([q(a),c.then(()=>mi(a)),gt(a,p),Pt(a),Ot(a),Ft(a,p),Rt(a),Dt(a),Ui(a),zt(a),gi(a),ki(a),bi(a),...d?[et(a)]:[],Fi(a),Wi(a),Ni(a),Yn(a),ei(a)]),await E.promiseAll();const u=[];for(const e of p)(e.doesContainTypeScript||e.doesContainTypeScriptInPackages)&&u.push(Ge(e,e.isRoot?p:[e])),e.depending.playwrightTest&&u.push(D(e)),e.depending.next&&u.push(C(e)),await Wt(e,a),await E.promiseAll(),(e.isRoot||e.doesContainPackageJson)&&(await di(e),await vn(e,a,i.skipDeps),u.push(ei(e)),e.doesContainVscodeSettingsJson&&e.doesContainPackageJson&&u.push(Oi(e)),(e.doesContainTypeScript||e.doesContainTypeScriptInPackages)&&u.push(Si(e)),O(e)?(u.push(si(e)),u.push(ci(e))):!e.isRoot&&e.doesContainPackageJson&&O(a)&&u.push(ci(e)),e.depending.pyright&&u.push(fi(e)));await Promise.all(u),await E.promiseAll(),await ft(a);const f=a.isBun?"bun":"yarn";a.isBun?await _.functionIgnoringException("refreshBunLock",async()=>{await Promise.resolve(),rr(n)}):qt(f,["install","--no-immutable"],n),qt(f,["cleanup"],n),await xi()}r&&(process.exitCode=1)}();
|
|
32
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VzIjpbIi4uLy4uL3NoYXJlZC1saWIvc3JjL3NsZWVwLnRzIiwiLi4vLi4vc2hhcmVkLWxpYi9zcmMvZXJyb3IudHMiLCIuLi9zcmMvb3B0aW9ucy50cyIsIi4uL3NyYy9sb2dnZXIudHMiLCIuLi9zcmMvdXRpbHMvZnNVdGlsLnRzIiwiLi4vc3JjL3V0aWxzL3Byb21pc2VQb29sLnRzIiwiLi4vc3JjL2ZpeGVycy9uZXh0Q29uZmlnLnRzIiwiLi4vc3JjL3V0aWxzL3BhY2thZ2VDYXBhYmlsaXRpZXMudHMiLCIuLi9zcmMvZml4ZXJzL3BsYXl3cmlnaHRDb25maWcudHMiLCIuLi9zcmMvdXRpbHMvZ2xvYlV0aWwudHMiLCIuLi9zcmMvZml4ZXJzL3ByaXNtYS50cyIsIi4uLy4uLy4uL25vZGVfbW9kdWxlcy9zb3J0LW9iamVjdC1rZXlzL2luZGV4LmpzIiwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2RldGVjdC1pbmRlbnQvaW5kZXguanMiLCIuLi8uLi8uLi9ub2RlX21vZHVsZXMvZGV0ZWN0LW5ld2xpbmUvaW5kZXguanMiLCIuLi8uLi8uLi9ub2RlX21vZHVsZXMvc29ydC1wYWNrYWdlLWpzb24vaW5kZXguanMiLCIuLi8uLi8uLi9ub2RlX21vZHVsZXMvaXMtcGxhaW4tb2JqL2luZGV4LmpzIiwiLi4vc3JjL2ZpeGVycy90ZXN0RGlyZWN0b3J5LnRzIiwiLi4vc3JjL2ZpeGVycy90eXBlRGVmaW5pdGlvbi50cyIsIi4uL3NyYy91dGlscy9tZXJnZVV0aWwudHMiLCIuLi9zcmMvdXRpbHMvb2JqZWN0VXRpbC50cyIsIi4uL3NyYy9nZW5lcmF0b3JzL3dvcmtmbG93LnRzIiwiLi4vc3JjL2ZpeGVycy90eXBvcy50cyIsIi4uL3NyYy9maXhlcnMvd2JEYkNvbW1hbmQudHMiLCIuLi9zcmMvZ2VuZXJhdG9ycy9hZ2VudHMudHMiLCIuLi9zcmMvZ2VuZXJhdG9ycy9idW5maWcudHMiLCIuLi9zcmMvdXRpbHMvaWdub3JlRmlsZVV0aWwudHMiLCIuLi9zcmMvZ2VuZXJhdG9ycy9kb2NrZXJpZ25vcmUudHMiLCIuLi9zcmMvdXRpbHMvZXh0ZW5zaW9ucy50cyIsIi4uL3NyYy9nZW5lcmF0b3JzL2VkaXRvcmNvbmZpZy50cyIsIi4uL3NyYy9nZW5lcmF0b3JzL2dlbWluaUNvbmZpZy50cyIsIi4uL3NyYy9nZW5lcmF0b3JzL2dlbWluaVNldHRpbmdzLnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvZ2l0YXR0cmlidXRlcy50cyIsIi4uL3NyYy9nZW5lcmF0b3JzL2dpdGlnbm9yZS50cyIsIi4uL3NyYy9nZW5lcmF0b3JzL2lkZWEudHMiLCIuLi9zcmMvdXRpbHMvZ2VuSTE4blRzLnRzIiwiLi4vc3JjL3V0aWxzL3NwYXduVXRpbC50cyIsIi4uL3NyYy91dGlscy9naXRodWJVdGlsLnRzIiwiLi4vc3JjL3V0aWxzL3RzY29uZmlnQmFzZS50cyIsIi4uL3NyYy91dGlscy93aWxsYm9vc3RlckNvbmZpZ3NVdGlsLnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvcGFja2FnZUpzb24udHMiLCIuLi9zcmMvZ2l0aHViL2NvbW1pdC50cyIsIi4uL3NyYy9nZW5lcmF0b3JzL2xlZnRob29rLnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvbGludHN0YWdlZHJjLnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvY29uZmlnQ29udGVudC50cyIsIi4uL3NyYy9nZW5lcmF0b3JzL21hbmFnZWRDb25maWdCbG9jay50cyIsIi4uL3NyYy9nZW5lcmF0b3JzL294Zm10Q29uZmlnLnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvb3hsaW50Q29uZmlnLnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvcHJldHRpZXJpZ25vcmUudHMiLCIuLi9zcmMvZ2VuZXJhdG9ycy9weXJpZ2h0Q29uZmlnLnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvcmFpbHdheWlnbm9yZS50cyIsIi4uL3NyYy9nZW5lcmF0b3JzL3JlYWRtZS50cyIsIi4uL3NyYy9nZW5lcmF0b3JzL3JlbGVhc2VyYy50cyIsIi4uL3NyYy9nZW5lcmF0b3JzL3Jlbm92YXRlSnNvbi50cyIsIi4uL3NyYy9nZW5lcmF0b3JzL3NraWxscy50cyIsIi4uL3NyYy9nZW5lcmF0b3JzL3RzY29uZmlnLnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvdnNjb2RlU2V0dGluZ3MudHMiLCIuLi9zcmMvZ2VuZXJhdG9ycy95YXJucmMudHMiLCIuLi9zcmMvZ2l0aHViL2xhYmVsLnRzIiwiLi4vc3JjL2dpdGh1Yi9zZWNyZXQudHMiLCIuLi9zcmMvZ2l0aHViL3NldHRpbmdzLnRzIiwiLi4vc3JjL2dpdGh1Yi90ZW1wbGF0ZS50cyIsIi4uL3NyYy9wYWNrYWdlQ29uZmlnLnRzIiwiLi4vc3JjL3V0aWxzL2RlcGVuZGVuY3lTb3VyY2VQb2xpY3kudHMiLCIuLi9zcmMvaW5kZXgudHMiXSwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHNsZWVwKG1pbGxpc2Vjb25kczogbnVtYmVyKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4gc2V0VGltZW91dChyZXNvbHZlLCBtaWxsaXNlY29uZHMpKTtcbn1cbiIsImltcG9ydCB7IHNsZWVwIH0gZnJvbSAnLi9zbGVlcC5qcyc7XG5cbi8qKlxuICogQ29udmVydCBhbiBvYmplY3QgdG8gYW4gZXJyb3IuXG4gKiBAcGFyYW0gb2JqIFRoZSBvYmplY3QgdG8gY29udmVydC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGVycm9yaWZ5KG9iajogdW5rbm93bik6IEVycm9yIHtcbiAgaWYgKG9iaiBpbnN0YW5jZW9mIEVycm9yKSByZXR1cm4gb2JqO1xuICBpZiAodHlwZW9mIG9iaiA9PT0gJ3N0cmluZycpIHJldHVybiBuZXcgRXJyb3Iob2JqKTtcbiAgdHJ5IHtcbiAgICByZXR1cm4gbmV3IEVycm9yKEpTT04uc3RyaW5naWZ5KG9iaikpO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gbmV3IEVycm9yKFN0cmluZyhvYmopKTtcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gaWdub3JlRXJyb3I8VD4oZm46ICgpID0+IFQpOiBUIHwgdW5kZWZpbmVkIHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gZm4oKTtcbiAgfSBjYXRjaCB7XG4gICAgLy8gZG8gbm90aGluZ1xuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpZ25vcmVFbm9lbnQ8VD4oZm46ICgpID0+IFQpOiBUIHwgdW5kZWZpbmVkIHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gZm4oKTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBpZiAodHlwZW9mIGVycm9yID09PSAnb2JqZWN0JyAmJiBlcnJvciAmJiAnY29kZScgaW4gZXJyb3IgJiYgZXJyb3IuY29kZSA9PT0gJ0VOT0VOVCcpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhyb3cgZXJyb3I7XG4gIH1cbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGlnbm9yZUVycm9yQXN5bmM8VD4oZm46ICgpID0+IFByb21pc2U8VD4pOiBQcm9taXNlPFQgfCB1bmRlZmluZWQ+IHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gYXdhaXQgZm4oKTtcbiAgfSBjYXRjaCB7XG4gICAgLy8gZG8gbm90aGluZ1xuICB9XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBpZ25vcmVFbm9lbnRBc3luYzxUPihmbjogKCkgPT4gUHJvbWlzZTxUPik6IFByb21pc2U8VCB8IHVuZGVmaW5lZD4ge1xuICB0cnkge1xuICAgIHJldHVybiBhd2FpdCBmbigpO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGlmICh0eXBlb2YgZXJyb3IgPT09ICdvYmplY3QnICYmIGVycm9yICYmICdjb2RlJyBpbiBlcnJvciAmJiBlcnJvci5jb2RlID09PSAnRU5PRU5UJykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aHJvdyBlcnJvcjtcbiAgfVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIFJldHJ5T3B0aW9ucyB7XG4gIGJlZm9yZVJldHJ5PzogKGVycm9yOiB1bmtub3duKSA9PiBQcm9taXNlPHZvaWQ+O1xuICBoYW5kbGVFcnJvcj86IChlcnJvcjogdW5rbm93bikgPT4gUHJvbWlzZTx2b2lkPjtcbiAgLyoqXG4gICAqIFRoZSBtYXhpbXVtIG51bWJlciBvZiB0b3RhbCBhdHRlbXB0cywgaW5jbHVkaW5nIHRoZSBpbml0aWFsIGF0dGVtcHQuXG4gICAqIEZvciBleGFtcGxlLCBgcmV0cnlDb3VudDogM2AgcnVucyB0aGUgZnVuY3Rpb24gYXQgbW9zdCAzIHRpbWVzOiAxIGluaXRpYWwgYXR0ZW1wdCBhbmQgdXAgdG8gMiByZXRyaWVzLlxuICAgKi9cbiAgcmV0cnlDb3VudD86IG51bWJlcjtcbiAgcmV0cnlMb2dnZXI/OiAobWVzc2FnZTogc3RyaW5nKSA9PiB2b2lkO1xuICBzaG91bGRSZXRyeT86IChlcnJvcjogdW5rbm93bikgPT4gYm9vbGVhbjtcbiAgc2xlZXBNaWxsaXNlY29uZHM/OiBudW1iZXI7XG4gIHVwZGF0ZVNsZWVwTWlsbGlzZWNvbmRzPzogKHNsZWVwTWlsbGlzZWNvbmRzOiBudW1iZXIpID0+IG51bWJlcjtcbn1cblxuLyoqXG4gKiBSZXRyeSB0aGUgZ2l2ZW4gZnVuY3Rpb24uXG4gKiBAcGFyYW0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gcmV0cnkuXG4gKiBAcGFyYW0gYmVmb3JlUmV0cnkgVGhlIGZ1bmN0aW9uIHRvIGNhbGwgaW1tZWRpYXRlbHkgYmVmb3JlIHJldHJ5aW5nLlxuICogQHBhcmFtIGhhbmRsZUVycm9yIFRoZSBmdW5jdGlvbiB0byBjYWxsIHdoZW4gYW4gZXJyb3Igb2NjdXJzLlxuICogQHBhcmFtIHJldHJ5Q291bnQgVGhlIG1heGltdW0gbnVtYmVyIG9mIHRvdGFsIGF0dGVtcHRzLCBpbmNsdWRpbmcgdGhlIGluaXRpYWwgYXR0ZW1wdC5cbiAqIEBwYXJhbSByZXRyeUxvZ2dlciBUaGUgZnVuY3Rpb24gdG8gbG9nIHJldHJ5aW5nLlxuICogQHBhcmFtIHNsZWVwTWlsbGlzZWNvbmRzIFRoZSBudW1iZXIgb2YgbWlsbGlzZWNvbmRzIHRvIHNsZWVwIGJlZm9yZSByZXRyeWluZy5cbiAqIEBwYXJhbSB1cGRhdGVTbGVlcE1pbGxpc2Vjb25kcyBUaGUgZnVuY3Rpb24gdG8gdXBkYXRlIHNsZWVwIG1pbGxpc2Vjb25kcyBhZnRlciBlYWNoIHJldHJ5LlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gd2l0aFJldHJ5PFQ+KFxuICBmdW5jOiAoZmFpbGVkQ291bnQ6IG51bWJlcikgPT4gVCB8IFByb21pc2U8VD4sXG4gIHtcbiAgICBiZWZvcmVSZXRyeSxcbiAgICBoYW5kbGVFcnJvcixcbiAgICByZXRyeUNvdW50ID0gMyxcbiAgICByZXRyeUxvZ2dlcixcbiAgICBzaG91bGRSZXRyeSxcbiAgICBzbGVlcE1pbGxpc2Vjb25kcyA9IDAsXG4gICAgdXBkYXRlU2xlZXBNaWxsaXNlY29uZHMsXG4gIH06IFJldHJ5T3B0aW9ucyA9IHt9XG4pOiBQcm9taXNlPFQ+IHtcbiAgbGV0IGZhaWxlZENvdW50ID0gMDtcbiAgZm9yICg7Oykge1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gYXdhaXQgZnVuYyhmYWlsZWRDb3VudCk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGF3YWl0IGhhbmRsZUVycm9yPy4oZXJyb3IpO1xuICAgICAgZmFpbGVkQ291bnQrKztcbiAgICAgIGlmIChmYWlsZWRDb3VudCA+PSByZXRyeUNvdW50KSB7XG4gICAgICAgIHRocm93IGVycm9yO1xuICAgICAgfVxuICAgICAgaWYgKHNob3VsZFJldHJ5ICYmICFzaG91bGRSZXRyeShlcnJvcikpIHtcbiAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICB9XG4gICAgICBpZiAoc2xlZXBNaWxsaXNlY29uZHMgPiAwKSB7XG4gICAgICAgIGF3YWl0IHNsZWVwKHNsZWVwTWlsbGlzZWNvbmRzKTtcbiAgICAgIH1cbiAgICAgIGlmICh1cGRhdGVTbGVlcE1pbGxpc2Vjb25kcykge1xuICAgICAgICBzbGVlcE1pbGxpc2Vjb25kcyA9IHVwZGF0ZVNsZWVwTWlsbGlzZWNvbmRzKHNsZWVwTWlsbGlzZWNvbmRzKTtcbiAgICAgIH1cbiAgICAgIHJldHJ5TG9nZ2VyPy4oYFJldHJ5IGR1ZSB0bzogJHtlcnJvcn1cbiR7ZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/ICctLS1cXG4nICsgKGVycm9yLnN0YWNrID8/ICcnKSA6ICcnfWApO1xuICAgICAgYXdhaXQgYmVmb3JlUmV0cnk/LihlcnJvcik7XG4gICAgfVxuICB9XG59XG4iLCJjbGFzcyBPcHRpb25zIHtcbiAgaXNWZXJib3NlID0gZmFsc2U7XG4gIGRvZXNVcGxvYWRFbnZWYXJzID0gZmFsc2U7XG59XG5cbmV4cG9ydCBjb25zdCBvcHRpb25zID0gbmV3IE9wdGlvbnMoKTtcbiIsImltcG9ydCB7IG9wdGlvbnMgfSBmcm9tICcuL29wdGlvbnMuanMnO1xuXG5jbGFzcyBMb2dnZXIge1xuICBhc3luYyBmdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKG5hbWU6IHN0cmluZywgZnVuYzogKCkgPT4gUHJvbWlzZTx2b2lkPik6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmIChvcHRpb25zLmlzVmVyYm9zZSkge1xuICAgICAgY29uc29sZS5pbmZvKGAtLS0tLS0tLS0gJHtuYW1lfSBzdGFydCAtLS0tLS0tLS1gKTtcbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IGZ1bmMoKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgY29uc29sZS5pbmZvKGBFcnJvciBvY2N1cnJlZCBpbiAke25hbWV9OiAke2Vycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5zdGFjayA6IFN0cmluZyhlcnJvcil9fWApO1xuICAgIH1cbiAgICBpZiAob3B0aW9ucy5pc1ZlcmJvc2UpIHtcbiAgICAgIGNvbnNvbGUuaW5mbyhgLS0tLS0tLS0tLSAke25hbWV9IGVuZCAtLS0tLS0tLS0tYCk7XG4gICAgfVxuICB9XG59XG5cbmV4cG9ydCBjb25zdCBsb2dnZXIgPSBuZXcgTG9nZ2VyKCk7XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5leHBvcnQgY29uc3QgZnNVdGlsID0ge1xuICBhc3luYyByZWFkRmlsZUlnbm9yaW5nRXJyb3IoZmlsZVBhdGg6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nIHwgdW5kZWZpbmVkPiB7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiBhd2FpdCBmcy5wcm9taXNlcy5yZWFkRmlsZShmaWxlUGF0aCwgJ3V0ZjgnKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIGRvIG5vdGhpbmdcbiAgICB9XG4gIH0sXG4gIGFzeW5jIGdlbmVyYXRlRmlsZShmaWxlUGF0aDogc3RyaW5nLCBjb250ZW50OiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBhd2FpdCBmcy5wcm9taXNlcy5ta2RpcihwYXRoLmRpcm5hbWUoZmlsZVBhdGgpLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgICBsZXQgbm9ybWFsaXplZENvbnRlbnQgPSBjb250ZW50LnRyaW0oKTtcbiAgICBpZiAobm9ybWFsaXplZENvbnRlbnQpIHtcbiAgICAgIG5vcm1hbGl6ZWRDb250ZW50ICs9ICdcXG4nO1xuICAgIH1cbiAgICBhd2FpdCBmcy5wcm9taXNlcy53cml0ZUZpbGUoZmlsZVBhdGgsIG5vcm1hbGl6ZWRDb250ZW50KTtcbiAgICBjb25zb2xlLmxvZyhgR2VuZXJhdGVkL1VwZGF0ZWQgJHtmaWxlUGF0aH1gKTtcbiAgfSxcbn07XG4iLCJpbXBvcnQgeyBQcm9taXNlUG9vbCB9IGZyb20gJ21pbmltYWwtcHJvbWlzZS1wb29sJztcblxuZXhwb3J0IGNvbnN0IHByb21pc2VQb29sID0gbmV3IFByb21pc2VQb29sKCk7XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgdHMgZnJvbSAndHlwZXNjcmlwdCc7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGZzVXRpbCB9IGZyb20gJy4uL3V0aWxzL2ZzVXRpbC5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGZpeE5leHRDb25maWdKc29uKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2ZpeE5leHRDb25maWdKc29uJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IGZpbGVQYXRoID0gWydqcycsICdtanMnLCAnY2pzJ11cbiAgICAgIC5tYXAoKGV4dCkgPT4gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCBgbmV4dC5jb25maWcuJHtleHR9YCkpXG4gICAgICAuZmluZCgocCkgPT4gZnMuZXhpc3RzU3luYyhwKSk7XG4gICAgaWYgKCFmaWxlUGF0aCkgcmV0dXJuO1xuXG4gICAgY29uc3Qgb2xkQ29udGVudCA9IGF3YWl0IGZzLnByb21pc2VzLnJlYWRGaWxlKGZpbGVQYXRoLCAndXRmOCcpO1xuICAgIGNvbnN0IG9iamVjdExpdGVyYWwgPSBnZXROZXh0Q29uZmlnT2JqZWN0TGl0ZXJhbChvbGRDb250ZW50KTtcbiAgICBpZiAoIW9iamVjdExpdGVyYWwpIHJldHVybjtcblxuICAgIGNvbnN0IGV4aXN0aW5nUHJvcGVydGllcyA9IG5ldyBTZXQob2JqZWN0TGl0ZXJhbC5wcm9wZXJ0aWVzLm1hcCgocHJvcGVydHkpID0+IHByb3BlcnR5Lm5hbWU/LmdldFRleHQoKSkpO1xuICAgIGNvbnN0IHByb3BlcnR5VGV4dHM6IHN0cmluZ1tdID0gW107XG4gICAgaWYgKCFleGlzdGluZ1Byb3BlcnRpZXMuaGFzKCd0eXBlc2NyaXB0JykpIHtcbiAgICAgIHByb3BlcnR5VGV4dHMucHVzaCgndHlwZXNjcmlwdDogeyBpZ25vcmVCdWlsZEVycm9yczogdHJ1ZSB9Jyk7XG4gICAgfVxuICAgIGlmIChwcm9wZXJ0eVRleHRzLmxlbmd0aCA9PT0gMCkgcmV0dXJuO1xuXG4gICAgY29uc3QgaW5zZXJ0aW9uUG9pbnQgPSBvYmplY3RMaXRlcmFsLmdldEVuZCgpIC0gMTtcbiAgICBjb25zdCBsYXN0UHJvcGVydHkgPSBvYmplY3RMaXRlcmFsLnByb3BlcnRpZXMuYXQoLTEpO1xuICAgIGNvbnN0IGhhc1RyYWlsaW5nQ29tbWEgPSBsYXN0UHJvcGVydHlcbiAgICAgID8gb2xkQ29udGVudC5zbGljZShsYXN0UHJvcGVydHkuZ2V0RW5kKCksIGluc2VydGlvblBvaW50KS5pbmNsdWRlcygnLCcpXG4gICAgICA6IGZhbHNlO1xuICAgIGNvbnN0IHByZWZpeCA9IG9iamVjdExpdGVyYWwucHJvcGVydGllcy5sZW5ndGggPiAwICYmICFoYXNUcmFpbGluZ0NvbW1hID8gJywgJyA6ICcnO1xuICAgIGNvbnN0IG5ld0NvbnRlbnQgPSBgJHtvbGRDb250ZW50LnNsaWNlKDAsIGluc2VydGlvblBvaW50KX0ke3ByZWZpeH0ke3Byb3BlcnR5VGV4dHMuam9pbignLCAnKX0ke29sZENvbnRlbnQuc2xpY2UoXG4gICAgICBpbnNlcnRpb25Qb2ludFxuICAgICl9YDtcbiAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnNVdGlsLmdlbmVyYXRlRmlsZShmaWxlUGF0aCwgbmV3Q29udGVudCkpO1xuICB9KTtcbn1cblxuZnVuY3Rpb24gZ2V0TmV4dENvbmZpZ09iamVjdExpdGVyYWwoY29udGVudDogc3RyaW5nKTogdHMuT2JqZWN0TGl0ZXJhbEV4cHJlc3Npb24gfCB1bmRlZmluZWQge1xuICBjb25zdCBzb3VyY2UgPSB0cy5jcmVhdGVTb3VyY2VGaWxlKCduZXh0LmNvbmZpZy5qcycsIGNvbnRlbnQsIHRzLlNjcmlwdFRhcmdldC5MYXRlc3QsIHRydWUsIHRzLlNjcmlwdEtpbmQuSlMpO1xuICBsZXQgb2JqZWN0TGl0ZXJhbDogdHMuT2JqZWN0TGl0ZXJhbEV4cHJlc3Npb24gfCB1bmRlZmluZWQ7XG4gIGNvbnN0IHZpc2l0ID0gKG5vZGU6IHRzLk5vZGUpOiB2b2lkID0+IHtcbiAgICBpZiAob2JqZWN0TGl0ZXJhbCkgcmV0dXJuO1xuICAgIGlmICh0cy5pc0V4cG9ydEFzc2lnbm1lbnQobm9kZSkgJiYgdHMuaXNPYmplY3RMaXRlcmFsRXhwcmVzc2lvbihub2RlLmV4cHJlc3Npb24pKSB7XG4gICAgICBvYmplY3RMaXRlcmFsID0gbm9kZS5leHByZXNzaW9uO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAoXG4gICAgICB0cy5pc0JpbmFyeUV4cHJlc3Npb24obm9kZSkgJiZcbiAgICAgIG5vZGUub3BlcmF0b3JUb2tlbi5raW5kID09PSB0cy5TeW50YXhLaW5kLkVxdWFsc1Rva2VuICYmXG4gICAgICBub2RlLmxlZnQuZ2V0VGV4dChzb3VyY2UpID09PSAnbW9kdWxlLmV4cG9ydHMnICYmXG4gICAgICB0cy5pc09iamVjdExpdGVyYWxFeHByZXNzaW9uKG5vZGUucmlnaHQpXG4gICAgKSB7XG4gICAgICBvYmplY3RMaXRlcmFsID0gbm9kZS5yaWdodDtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdHMuZm9yRWFjaENoaWxkKG5vZGUsIHZpc2l0KTtcbiAgfTtcbiAgdmlzaXQoc291cmNlKTtcbiAgcmV0dXJuIG9iamVjdExpdGVyYWw7XG59XG4iLCJpbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcblxuZXhwb3J0IGZ1bmN0aW9uIGRvZXNDb250YWluSnNPclRzKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IGJvb2xlYW4ge1xuICByZXR1cm4gKFxuICAgIGNvbmZpZy5kb2VzQ29udGFpbkphdmFTY3JpcHQgfHxcbiAgICBjb25maWcuZG9lc0NvbnRhaW5KYXZhU2NyaXB0SW5QYWNrYWdlcyB8fFxuICAgIGNvbmZpZy5kb2VzQ29udGFpblR5cGVTY3JpcHQgfHxcbiAgICBjb25maWcuZG9lc0NvbnRhaW5UeXBlU2NyaXB0SW5QYWNrYWdlc1xuICApO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZG9lc0NvbnRhaW5KYXZhKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IGJvb2xlYW4ge1xuICByZXR1cm4gY29uZmlnLmRvZXNDb250YWluSmF2YSB8fCBjb25maWcuZG9lc0NvbnRhaW5KYXZhSW5QYWNrYWdlcztcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldFBhY2thZ2VNYW5hZ2VyQ29tbWFuZChjb25maWc6IFBpY2s8UGFja2FnZUNvbmZpZywgJ2lzQnVuJz4pOiAnYnVuJyB8ICd5YXJuJyB7XG4gIHJldHVybiBjb25maWcuaXNCdW4gPyAnYnVuJyA6ICd5YXJuJztcbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB0cyBmcm9tICd0eXBlc2NyaXB0JztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZnNVdGlsIH0gZnJvbSAnLi4vdXRpbHMvZnNVdGlsLmpzJztcbmltcG9ydCB7IGdldFBhY2thZ2VNYW5hZ2VyQ29tbWFuZCB9IGZyb20gJy4uL3V0aWxzL3BhY2thZ2VDYXBhYmlsaXRpZXMuanMnO1xuaW1wb3J0IHsgcHJvbWlzZVBvb2wgfSBmcm9tICcuLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5cbnR5cGUgUGFyc2VkVmFsdWUgPVxuICB8IHsga2luZDogJ2FycmF5JzsgdmFsdWU6IFBhcnNlZFZhbHVlW10gfVxuICB8IHsga2luZDogJ2xpdGVyYWwnOyB2YWx1ZTogc3RyaW5nIH1cbiAgfCB7IGtpbmQ6ICdvYmplY3QnOyB2YWx1ZTogUGFyc2VkT2JqZWN0IH07XG50eXBlIE9iamVjdE1lbWJlciA9IHsga2luZDogJ2V4dHJhJzsgaW5kZXg6IG51bWJlciB9IHwgeyBraW5kOiAncHJvcGVydHknOyBrZXk6IHN0cmluZyB9O1xuaW50ZXJmYWNlIFBhcnNlZE9iamVjdCB7XG4gIGV4dHJhTWVtYmVyczogc3RyaW5nW107XG4gIG1lbWJlck9yZGVyOiBPYmplY3RNZW1iZXJbXTtcbiAgcHJvcGVydGllczogUmVjb3JkPHN0cmluZywgUGFyc2VkVmFsdWU+O1xufVxuaW50ZXJmYWNlIEV4dHJhY3RlZE9iamVjdExpdGVyYWwge1xuICBzb3VyY2U6IHRzLlNvdXJjZUZpbGU7XG4gIG5vZGU6IHRzLk9iamVjdExpdGVyYWxFeHByZXNzaW9uO1xufVxuXG5jb25zdCBsaXRlcmFsID0gKHZhbHVlOiBzdHJpbmcpOiBQYXJzZWRWYWx1ZSA9PiAoeyBraW5kOiAnbGl0ZXJhbCcsIHZhbHVlIH0pO1xuY29uc3QgYXNBcnJheSA9ICh2YWx1ZTogUGFyc2VkVmFsdWVbXSk6IFBhcnNlZFZhbHVlID0+ICh7IGtpbmQ6ICdhcnJheScsIHZhbHVlIH0pO1xuY29uc3QgYXNPYmplY3QgPSAocHJvcGVydGllczogUmVjb3JkPHN0cmluZywgUGFyc2VkVmFsdWU+LCBleHRyYU1lbWJlcnM6IHN0cmluZ1tdID0gW10pOiBQYXJzZWRWYWx1ZSA9PiAoe1xuICBraW5kOiAnb2JqZWN0JyxcbiAgdmFsdWU6IHRvUGFyc2VkT2JqZWN0KHByb3BlcnRpZXMsIGV4dHJhTWVtYmVycyksXG59KTtcblxuY29uc3QgY3JlYXRlRGVmYXVsdENvbmZpZyA9IChjb25maWc6IFBhY2thZ2VDb25maWcpOiBQYXJzZWRPYmplY3QgPT5cbiAgdG9QYXJzZWRPYmplY3Qoe1xuICAgIGZvcmJpZE9ubHk6IGxpdGVyYWwoJyEhcHJvY2Vzcy5lbnYuQ0knKSxcbiAgICByZXRyaWVzOiBsaXRlcmFsKCdwcm9jZXNzLmVudi5QV0RFQlVHID8gMCA6IHByb2Nlc3MuZW52LkNJID8gNSA6IDEnKSxcbiAgICB1c2U6IGFzT2JqZWN0KHtcbiAgICAgIGJhc2VVUkw6IGxpdGVyYWwoJ3Byb2Nlc3MuZW52Lk5FWFRfUFVCTElDX0JBU0VfVVJMJyksXG4gICAgICB0cmFjZTogbGl0ZXJhbChcInByb2Nlc3MuZW52LkNJID8gJ29uLWZpcnN0LXJldHJ5JyA6ICdyZXRhaW4tb24tZmFpbHVyZSdcIiksXG4gICAgICBzY3JlZW5zaG90OiBsaXRlcmFsKFwicHJvY2Vzcy5lbnYuQ0kgPyAnb25seS1vbi1mYWlsdXJlJyA6ICdvbidcIiksXG4gICAgICB2aWRlbzogbGl0ZXJhbChcInByb2Nlc3MuZW52LkNJID8gJ29uLWZpcnN0LXJldHJ5JyA6ICdyZXRhaW4tb24tZmFpbHVyZSdcIiksXG4gICAgfSksXG4gICAgd2ViU2VydmVyOiBhc09iamVjdCh7XG4gICAgICBjb21tYW5kOiBsaXRlcmFsKGdldFdiU3RhcnRUZXN0Q29tbWFuZChjb25maWcpKSxcbiAgICAgIHVybDogbGl0ZXJhbCgncHJvY2Vzcy5lbnYuTkVYVF9QVUJMSUNfQkFTRV9VUkwnKSxcbiAgICAgIHJldXNlRXhpc3RpbmdTZXJ2ZXI6IGxpdGVyYWwoJyEhcHJvY2Vzcy5lbnYuQ0knKSxcbiAgICAgIHRpbWVvdXQ6IGxpdGVyYWwoJzMwMF8wMDAnKSxcbiAgICAgIHN0ZG91dDogbGl0ZXJhbChcIidwaXBlJ1wiKSxcbiAgICAgIHN0ZGVycjogbGl0ZXJhbChcIidwaXBlJ1wiKSxcbiAgICAgIGVudjogbGl0ZXJhbChge1xuICAuLi5wcm9jZXNzLmVudixcbiAgUFJJU01BX1VTRVJfQ09OU0VOVF9GT1JfREFOR0VST1VTX0FJX0FDVElPTjogJ3RydWUnLFxufWApLFxuICAgICAgZ3JhY2VmdWxTaHV0ZG93bjogbGl0ZXJhbChge1xuICBzaWduYWw6ICdTSUdURVJNJyxcbiAgdGltZW91dDogNTAwLFxufWApLFxuICAgIH0pLFxuICB9KTtcblxuZnVuY3Rpb24gdG9QYXJzZWRPYmplY3QocHJvcGVydGllczogUmVjb3JkPHN0cmluZywgUGFyc2VkVmFsdWU+LCBleHRyYU1lbWJlcnM6IHN0cmluZ1tdID0gW10pOiBQYXJzZWRPYmplY3Qge1xuICByZXR1cm4ge1xuICAgIGV4dHJhTWVtYmVycyxcbiAgICBtZW1iZXJPcmRlcjogW1xuICAgICAgLi4uT2JqZWN0LmtleXMocHJvcGVydGllcykubWFwKChrZXkpOiBPYmplY3RNZW1iZXIgPT4gKHsga2luZDogJ3Byb3BlcnR5Jywga2V5IH0pKSxcbiAgICAgIC4uLmV4dHJhTWVtYmVycy5tYXAoKF8sIGluZGV4KTogT2JqZWN0TWVtYmVyID0+ICh7IGtpbmQ6ICdleHRyYScsIGluZGV4IH0pKSxcbiAgICBdLFxuICAgIHByb3BlcnRpZXMsXG4gIH07XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBmaXhQbGF5d3JpZ2h0Q29uZmlnKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBmaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgYHBsYXl3cmlnaHQuY29uZmlnLnRzYCk7XG4gIGlmICghZnMuZXhpc3RzU3luYyhmaWxlUGF0aCkpIHJldHVybjtcblxuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2ZpeFBsYXl3cmlnaHRDb25maWcnLCBhc3luYyAoKSA9PiB7XG4gICAgYXdhaXQgYXNzZXJ0TmV4dFB1YmxpY0Jhc2VVcmwoY29uZmlnLmRpclBhdGgpO1xuXG4gICAgY29uc3Qgb2xkQ29udGVudCA9IGF3YWl0IGZzLnByb21pc2VzLnJlYWRGaWxlKGZpbGVQYXRoLCAndXRmOCcpO1xuICAgIGNvbnN0IGV4dHJhY3RlZE9iamVjdExpdGVyYWwgPSBleHRyYWN0RGVmaW5lQ29uZmlnT2JqZWN0TGl0ZXJhbChvbGRDb250ZW50KTtcbiAgICBpZiAoIWV4dHJhY3RlZE9iamVjdExpdGVyYWwpIHJldHVybjtcblxuICAgIGNvbnN0IHBhcnNlZCA9IHBhcnNlT2JqZWN0TGl0ZXJhbEV4cHJlc3Npb24oZXh0cmFjdGVkT2JqZWN0TGl0ZXJhbC5ub2RlLCBleHRyYWN0ZWRPYmplY3RMaXRlcmFsLnNvdXJjZSk7XG4gICAgaWYgKCFwYXJzZWQpIHJldHVybjtcblxuICAgIC8vIEtlZXAgZmlsbGluZyBtaXNzaW5nIGRlZmF1bHRzLCBidXQgZG9uJ3Qgb3ZlcndyaXRlIGxvY2FsIGFkanVzdG1lbnRzIG9uIGV2ZXJ5IHJlZ2VuZXJhdGlvbi5cbiAgICBjb25zdCBtZXJnZWQgPSBtZXJnZVBhcnNlZE9iamVjdHMoY3JlYXRlRGVmYXVsdENvbmZpZyhjb25maWcpLCBwYXJzZWQpO1xuICAgIHNldFdlYlNlcnZlckNvbW1hbmQobWVyZ2VkLCBjb25maWcpO1xuXG4gICAgY29uc3QgbmV3T2JqZWN0TGl0ZXJhbCA9IHN0cmluZ2lmeVZhbHVlKHsga2luZDogJ29iamVjdCcsIHZhbHVlOiBtZXJnZWQgfSwgMCk7XG4gICAgY29uc3Qgc3RhcnQgPSBleHRyYWN0ZWRPYmplY3RMaXRlcmFsLm5vZGUuZ2V0U3RhcnQoZXh0cmFjdGVkT2JqZWN0TGl0ZXJhbC5zb3VyY2UpO1xuICAgIGNvbnN0IGVuZCA9IGV4dHJhY3RlZE9iamVjdExpdGVyYWwubm9kZS5nZXRFbmQoKTtcbiAgICBjb25zdCBuZXdDb250ZW50ID0gYCR7b2xkQ29udGVudC5zbGljZSgwLCBzdGFydCl9JHtuZXdPYmplY3RMaXRlcmFsfSR7b2xkQ29udGVudC5zbGljZShlbmQpfWA7XG5cbiAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnNVdGlsLmdlbmVyYXRlRmlsZShmaWxlUGF0aCwgbmV3Q29udGVudCkpO1xuICB9KTtcbn1cblxuZnVuY3Rpb24gbWVyZ2VQYXJzZWRPYmplY3RzKGJhc2U6IFBhcnNlZE9iamVjdCwgb3ZlcnJpZGU6IFBhcnNlZE9iamVjdCk6IFBhcnNlZE9iamVjdCB7XG4gIGNvbnN0IG92ZXJyaWRlUHJvcGVydHlLZXlzID0gbmV3IFNldChPYmplY3Qua2V5cyhvdmVycmlkZS5wcm9wZXJ0aWVzKSk7XG4gIGNvbnN0IGV4dHJhTWVtYmVycyA9IFsuLi5iYXNlLmV4dHJhTWVtYmVycywgLi4ub3ZlcnJpZGUuZXh0cmFNZW1iZXJzXTtcbiAgLy8gS2VlcCBkZWZhdWx0LW9ubHkgbWVtYmVycyBiZWZvcmUgcGFyc2VkIG1lbWJlcnMgc28gc3ByZWFkcyBhbmQgZXhwbGljaXQgbG9jYWwgcHJvcGVydGllcyByZXRhaW4gcHJlY2VkZW5jZS5cbiAgY29uc3QgbWVtYmVyT3JkZXIgPSBbXG4gICAgLi4uYmFzZS5tZW1iZXJPcmRlci5maWx0ZXIoKG1lbWJlcikgPT4gbWVtYmVyLmtpbmQgIT09ICdwcm9wZXJ0eScgfHwgIW92ZXJyaWRlUHJvcGVydHlLZXlzLmhhcyhtZW1iZXIua2V5KSksXG4gICAgLi4ub3ZlcnJpZGUubWVtYmVyT3JkZXIubWFwKChtZW1iZXIpOiBPYmplY3RNZW1iZXIgPT4ge1xuICAgICAgaWYgKG1lbWJlci5raW5kID09PSAncHJvcGVydHknKSByZXR1cm4gbWVtYmVyO1xuICAgICAgcmV0dXJuIHsga2luZDogJ2V4dHJhJywgaW5kZXg6IGJhc2UuZXh0cmFNZW1iZXJzLmxlbmd0aCArIG1lbWJlci5pbmRleCB9O1xuICAgIH0pLFxuICBdO1xuICBjb25zdCBwcm9wZXJ0aWVzID0geyAuLi5iYXNlLnByb3BlcnRpZXMgfTtcbiAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMob3ZlcnJpZGUucHJvcGVydGllcykpIHtcbiAgICBwcm9wZXJ0aWVzW2tleV0gPSBtZXJnZVBhcnNlZFZhbHVlKHByb3BlcnRpZXNba2V5XSwgdmFsdWUpO1xuICB9XG4gIHJldHVybiB7IGV4dHJhTWVtYmVycywgbWVtYmVyT3JkZXIsIHByb3BlcnRpZXMgfTtcbn1cblxuZnVuY3Rpb24gbWVyZ2VQYXJzZWRWYWx1ZShiYXNlOiBQYXJzZWRWYWx1ZSB8IHVuZGVmaW5lZCwgb3ZlcnJpZGU6IFBhcnNlZFZhbHVlKTogUGFyc2VkVmFsdWUge1xuICBpZiAoYmFzZT8ua2luZCA9PT0gJ29iamVjdCcgJiYgb3ZlcnJpZGUua2luZCA9PT0gJ29iamVjdCcpIHtcbiAgICByZXR1cm4geyBraW5kOiAnb2JqZWN0JywgdmFsdWU6IG1lcmdlUGFyc2VkT2JqZWN0cyhiYXNlLnZhbHVlLCBvdmVycmlkZS52YWx1ZSkgfTtcbiAgfVxuICByZXR1cm4gb3ZlcnJpZGU7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGFzc2VydE5leHRQdWJsaWNCYXNlVXJsKGRpclBhdGg6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICBmb3IgKGNvbnN0IGVudkZpbGVQYXRoIG9mIGdldEVudkZpbGVQYXRocyhkaXJQYXRoKSkge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBjb250ZW50ID0gYXdhaXQgZnMucHJvbWlzZXMucmVhZEZpbGUoZW52RmlsZVBhdGgsICd1dGY4Jyk7XG4gICAgICBpZiAoL05FWFRfUFVCTElDX0JBU0VfVVJMXFxzKj0vbS50ZXN0KGNvbnRlbnQpKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIE1pc3NpbmcgZW52IGZpbGVzIGFyZSBleHBlY3RlZCBpbiBzb21lIHJlcG9zLlxuICAgIH1cbiAgfVxuXG4gIHRocm93IG5ldyBFcnJvcignTkVYVF9QVUJMSUNfQkFTRV9VUkwgaXMgcmVxdWlyZWQgZm9yIFBsYXl3cmlnaHQuIERlZmluZSBORVhUX1BVQkxJQ19CQVNFX1VSTCBpbiB0aGUgdGFyZ2V0IHJlcG8uJyk7XG59XG5cbmZ1bmN0aW9uIGdldEVudkZpbGVQYXRocyhkaXJQYXRoOiBzdHJpbmcpOiBzdHJpbmdbXSB7XG4gIGNvbnN0IGVudkZpbGVOYW1lcyA9IFsnLmVudicsICcuZW52LnRlc3QnLCAnLmVudi5leGFtcGxlJywgJ21pc2UudG9tbCcsICdtaXNlLnRlc3QudG9tbCddO1xuICBjb25zdCBlbnZGaWxlUGF0aHM6IHN0cmluZ1tdID0gW107XG5cbiAgZm9yIChsZXQgY3VycmVudERpclBhdGggPSBwYXRoLnJlc29sdmUoZGlyUGF0aCk7IDsgY3VycmVudERpclBhdGggPSBwYXRoLmRpcm5hbWUoY3VycmVudERpclBhdGgpKSB7XG4gICAgZW52RmlsZVBhdGhzLnB1c2goLi4uZW52RmlsZU5hbWVzLm1hcCgoZmlsZU5hbWUpID0+IHBhdGgucmVzb2x2ZShjdXJyZW50RGlyUGF0aCwgZmlsZU5hbWUpKSk7XG5cbiAgICAvLyBQbGF5d3JpZ2h0IGNvbmZpZ3Mgb2Z0ZW4gbGl2ZSBpbiBwYWNrYWdlcy8qIHdoaWxlIHNoYXJlZCBlbnYgZmlsZXMgbGl2ZSBhdCB0aGVcbiAgICAvLyByZXBvc2l0b3J5IHJvb3QsIHNvIHdhbGsgdXB3YXJkIHVudGlsIHRoZSB0YXJnZXQgcmVwbyBib3VuZGFyeS5cbiAgICBpZiAoZnMuZXhpc3RzU3luYyhwYXRoLnJlc29sdmUoY3VycmVudERpclBhdGgsICcuZ2l0JykpKSBicmVhaztcblxuICAgIGNvbnN0IHBhcmVudERpclBhdGggPSBwYXRoLmRpcm5hbWUoY3VycmVudERpclBhdGgpO1xuICAgIGlmIChwYXJlbnREaXJQYXRoID09PSBjdXJyZW50RGlyUGF0aCkgYnJlYWs7XG4gIH1cblxuICByZXR1cm4gZW52RmlsZVBhdGhzO1xufVxuXG5mdW5jdGlvbiBzZXRXZWJTZXJ2ZXJDb21tYW5kKG9iamVjdDogUGFyc2VkT2JqZWN0LCBjb25maWc6IFBhY2thZ2VDb25maWcpOiB2b2lkIHtcbiAgY29uc3Qgd2ViU2VydmVyID0gb2JqZWN0LnByb3BlcnRpZXMud2ViU2VydmVyO1xuICBpZiAod2ViU2VydmVyPy5raW5kICE9PSAnb2JqZWN0JykgcmV0dXJuO1xuXG4gIC8vIHdiIG93bnMgdGhlIGNhbm9uaWNhbCB0ZXN0LXNlcnZlciBzdGFydHVwIHBhdGg7IGtlZXAgY3VzdG9tIFBsYXl3cmlnaHRcbiAgLy8gc2VydmVyIHNldHRpbmdzIHdoaWxlIG5vcm1hbGl6aW5nIHRoZSBjb21tYW5kIGl0c2VsZi4gSW52b2tlIHdiIHRocm91Z2ggdGhlXG4gIC8vIHBhY2thZ2UgbWFuYWdlciBiZWNhdXNlIHRhcmdldCByZXBvcyBpbnN0YWxsIHdiIGFzIGEgcGFja2FnZSBkZXBlbmRlbmN5LlxuICB3ZWJTZXJ2ZXIudmFsdWUucHJvcGVydGllcy5jb21tYW5kID0gbGl0ZXJhbChnZXRXYlN0YXJ0VGVzdENvbW1hbmQoY29uZmlnKSk7XG59XG5cbmZ1bmN0aW9uIGdldFdiU3RhcnRUZXN0Q29tbWFuZChjb25maWc6IFBhY2thZ2VDb25maWcpOiBzdHJpbmcge1xuICByZXR1cm4gYCcke2dldFBhY2thZ2VNYW5hZ2VyQ29tbWFuZChjb25maWcpfSB3YiBzdGFydCAtLW1vZGUgdGVzdCdgO1xufVxuXG5mdW5jdGlvbiBleHRyYWN0RGVmaW5lQ29uZmlnT2JqZWN0TGl0ZXJhbChjb250ZW50OiBzdHJpbmcpOiBFeHRyYWN0ZWRPYmplY3RMaXRlcmFsIHwgdW5kZWZpbmVkIHtcbiAgY29uc3Qgc291cmNlID0gdHMuY3JlYXRlU291cmNlRmlsZSgncGxheXdyaWdodC5jb25maWcudHMnLCBjb250ZW50LCB0cy5TY3JpcHRUYXJnZXQuTGF0ZXN0LCB0cnVlLCB0cy5TY3JpcHRLaW5kLlRTKTtcblxuICAvLyBUeXBlU2NyaXB0IGFscmVhZHkgdW5kZXJzdGFuZHMgbmVzdGVkIG9iamVjdCBsaXRlcmFscyBhbmQgdGVtcGxhdGUgc3RyaW5ncywgc28gdXNlXG4gIC8vIGl0cyBBU1QgcmFuZ2VzIGluc3RlYWQgb2YgYSByZWdleCB0aGF0IGNhbiBzdG9wIGF0IHRoZSBmaXJzdCBpbm5lciBjbG9zaW5nIGJyYWNlLlxuICBsZXQgZm91bmQ6IHRzLk9iamVjdExpdGVyYWxFeHByZXNzaW9uIHwgdW5kZWZpbmVkO1xuICBjb25zdCB2aXNpdCA9IChub2RlOiB0cy5Ob2RlKTogdm9pZCA9PiB7XG4gICAgaWYgKGZvdW5kKSByZXR1cm47XG4gICAgaWYgKHRzLmlzQ2FsbEV4cHJlc3Npb24obm9kZSkgJiYgbm9kZS5leHByZXNzaW9uLmdldFRleHQoc291cmNlKSA9PT0gJ2RlZmluZUNvbmZpZycpIHtcbiAgICAgIGNvbnN0IGZpcnN0QXJndW1lbnQgPSBub2RlLmFyZ3VtZW50c1swXTtcbiAgICAgIGlmIChmaXJzdEFyZ3VtZW50ICYmIHRzLmlzT2JqZWN0TGl0ZXJhbEV4cHJlc3Npb24oZmlyc3RBcmd1bWVudCkpIHtcbiAgICAgICAgZm91bmQgPSBmaXJzdEFyZ3VtZW50O1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgfVxuICAgIHRzLmZvckVhY2hDaGlsZChub2RlLCB2aXNpdCk7XG4gIH07XG4gIHZpc2l0KHNvdXJjZSk7XG5cbiAgcmV0dXJuIGZvdW5kID8geyBzb3VyY2UsIG5vZGU6IGZvdW5kIH0gOiB1bmRlZmluZWQ7XG59XG5cbmZ1bmN0aW9uIHBhcnNlRXhwcmVzc2lvbihleHByZXNzaW9uOiB0cy5FeHByZXNzaW9uLCBzb3VyY2U6IHRzLlNvdXJjZUZpbGUpOiBQYXJzZWRWYWx1ZSB8IHVuZGVmaW5lZCB7XG4gIGlmICh0cy5pc09iamVjdExpdGVyYWxFeHByZXNzaW9uKGV4cHJlc3Npb24pKSB7XG4gICAgY29uc3QgcGFyc2VkT2JqZWN0ID0gcGFyc2VPYmplY3RMaXRlcmFsRXhwcmVzc2lvbihleHByZXNzaW9uLCBzb3VyY2UpO1xuICAgIHJldHVybiBwYXJzZWRPYmplY3QgPyB7IGtpbmQ6ICdvYmplY3QnLCB2YWx1ZTogcGFyc2VkT2JqZWN0IH0gOiBsaXRlcmFsKGV4cHJlc3Npb24uZ2V0VGV4dChzb3VyY2UpKTtcbiAgfVxuICBpZiAodHMuaXNBcnJheUxpdGVyYWxFeHByZXNzaW9uKGV4cHJlc3Npb24pKSB7XG4gICAgY29uc3QgZWxlbWVudHMgPSBleHByZXNzaW9uLmVsZW1lbnRzLm1hcCgoZWxlbWVudCkgPT4gcGFyc2VFeHByZXNzaW9uKGVsZW1lbnQsIHNvdXJjZSkpO1xuICAgIGlmIChlbGVtZW50cy5zb21lKChlbGVtZW50KTogZWxlbWVudCBpcyB1bmRlZmluZWQgPT4gZWxlbWVudCA9PT0gdW5kZWZpbmVkKSkge1xuICAgICAgcmV0dXJuIGxpdGVyYWwoZXhwcmVzc2lvbi5nZXRUZXh0KHNvdXJjZSkpO1xuICAgIH1cbiAgICByZXR1cm4gYXNBcnJheShlbGVtZW50cyBhcyBQYXJzZWRWYWx1ZVtdKTtcbiAgfVxuICByZXR1cm4gbGl0ZXJhbChleHByZXNzaW9uLmdldFRleHQoc291cmNlKSk7XG59XG5cbmZ1bmN0aW9uIHBhcnNlT2JqZWN0TGl0ZXJhbEV4cHJlc3Npb24oXG4gIG9iamVjdExpdGVyYWw6IHRzLk9iamVjdExpdGVyYWxFeHByZXNzaW9uLFxuICBzb3VyY2U6IHRzLlNvdXJjZUZpbGVcbik6IFBhcnNlZE9iamVjdCB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IHBhcnNlZDogUGFyc2VkT2JqZWN0ID0geyBleHRyYU1lbWJlcnM6IFtdLCBtZW1iZXJPcmRlcjogW10sIHByb3BlcnRpZXM6IHt9IH07XG4gIGZvciAoY29uc3QgcHJvcGVydHkgb2Ygb2JqZWN0TGl0ZXJhbC5wcm9wZXJ0aWVzKSB7XG4gICAgaWYgKHRzLmlzU2hvcnRoYW5kUHJvcGVydHlBc3NpZ25tZW50KHByb3BlcnR5KSkge1xuICAgICAgY29uc3Qga2V5ID0gcHJvcGVydHkubmFtZS5nZXRUZXh0KHNvdXJjZSk7XG4gICAgICBwYXJzZWQucHJvcGVydGllc1trZXldID0gbGl0ZXJhbChrZXkpO1xuICAgICAgcGFyc2VkLm1lbWJlck9yZGVyLnB1c2goeyBraW5kOiAncHJvcGVydHknLCBrZXkgfSk7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgaWYgKCF0cy5pc1Byb3BlcnR5QXNzaWdubWVudChwcm9wZXJ0eSkgfHwgKCF0cy5pc0lkZW50aWZpZXIocHJvcGVydHkubmFtZSkgJiYgIXRzLmlzU3RyaW5nTGl0ZXJhbChwcm9wZXJ0eS5uYW1lKSkpIHtcbiAgICAgIGNvbnN0IGluZGV4ID0gcGFyc2VkLmV4dHJhTWVtYmVycy5wdXNoKHByb3BlcnR5LmdldFRleHQoc291cmNlKSkgLSAxO1xuICAgICAgcGFyc2VkLm1lbWJlck9yZGVyLnB1c2goeyBraW5kOiAnZXh0cmEnLCBpbmRleCB9KTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBjb25zdCB2YWx1ZSA9IHBhcnNlRXhwcmVzc2lvbihwcm9wZXJ0eS5pbml0aWFsaXplciwgc291cmNlKTtcbiAgICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCkgcmV0dXJuO1xuICAgIGNvbnN0IGtleSA9IHByb3BlcnR5Lm5hbWUuZ2V0VGV4dChzb3VyY2UpO1xuICAgIHBhcnNlZC5wcm9wZXJ0aWVzW2tleV0gPSB2YWx1ZTtcbiAgICBwYXJzZWQubWVtYmVyT3JkZXIucHVzaCh7IGtpbmQ6ICdwcm9wZXJ0eScsIGtleSB9KTtcbiAgfVxuICByZXR1cm4gcGFyc2VkO1xufVxuXG5mdW5jdGlvbiBzdHJpbmdpZnlWYWx1ZSh2YWx1ZTogUGFyc2VkVmFsdWUsIGxldmVsOiBudW1iZXIpOiBzdHJpbmcge1xuICBjb25zdCBjbG9zaW5nSW5kZW50ID0gJyAgJy5yZXBlYXQobGV2ZWwpO1xuICBpZiAodmFsdWUua2luZCA9PT0gJ2FycmF5Jykge1xuICAgIGlmICh2YWx1ZS52YWx1ZS5sZW5ndGggPT09IDApIHJldHVybiAnW10nO1xuICAgIGNvbnN0IGluZGVudCA9ICcgICcucmVwZWF0KGxldmVsICsgMSk7XG4gICAgY29uc3QgbGluZXMgPSB2YWx1ZS52YWx1ZS5tYXAoKGl0ZW0pID0+IHtcbiAgICAgIGNvbnN0IHN0cmluZ2lmaWVkID0gc3RyaW5naWZ5VmFsdWUoaXRlbSwgbGV2ZWwgKyAxKS5zcGxpdCgnXFxuJyk7XG4gICAgICBzdHJpbmdpZmllZFtzdHJpbmdpZmllZC5sZW5ndGggLSAxXSA9IGAke3N0cmluZ2lmaWVkLmF0KC0xKX0sYDtcbiAgICAgIGlmIChpdGVtLmtpbmQgPT09ICdsaXRlcmFsJykge1xuICAgICAgICBmb3IgKGxldCBpbmRleCA9IDE7IGluZGV4IDwgc3RyaW5naWZpZWQubGVuZ3RoOyBpbmRleCArPSAxKSB7XG4gICAgICAgICAgc3RyaW5naWZpZWRbaW5kZXhdID0gYCR7aW5kZW50fSR7c3RyaW5naWZpZWRbaW5kZXhdfWA7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHN0cmluZ2lmaWVkWzBdID0gYCR7aW5kZW50fSR7c3RyaW5naWZpZWRbMF19YDtcbiAgICAgIHJldHVybiBzdHJpbmdpZmllZC5qb2luKCdcXG4nKTtcbiAgICB9KTtcbiAgICByZXR1cm4gYFtcXG4ke2xpbmVzLmpvaW4oJ1xcbicpfVxcbiR7Y2xvc2luZ0luZGVudH1dYDtcbiAgfVxuICBpZiAodmFsdWUua2luZCA9PT0gJ2xpdGVyYWwnKSByZXR1cm4gdmFsdWUudmFsdWU7XG5cbiAgY29uc3QgaW5kZW50ID0gJyAgJy5yZXBlYXQobGV2ZWwgKyAxKTtcbiAgY29uc3QgZW1pdHRlZFByb3BlcnRpZXMgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgY29uc3QgbGFzdFByb3BlcnR5SW5kZXhCeUtleSA9IGdldExhc3RQcm9wZXJ0eUluZGV4QnlLZXkodmFsdWUudmFsdWUubWVtYmVyT3JkZXIpO1xuICBjb25zdCBsaW5lcyA9IHZhbHVlLnZhbHVlLm1lbWJlck9yZGVyLmZsYXRNYXAoKG1lbWJlciwgaW5kZXgpID0+IHtcbiAgICBpZiAobWVtYmVyLmtpbmQgPT09ICdleHRyYScpIHtcbiAgICAgIHJldHVybiBbc3RyaW5naWZ5T2JqZWN0TWVtYmVyKHZhbHVlLnZhbHVlLmV4dHJhTWVtYmVyc1ttZW1iZXIuaW5kZXhdID8/ICcnLCBpbmRlbnQpXTtcbiAgICB9XG5cbiAgICBpZiAobGFzdFByb3BlcnR5SW5kZXhCeUtleS5nZXQobWVtYmVyLmtleSkgIT09IGluZGV4KSByZXR1cm4gW107XG4gICAgY29uc3QgaXRlbSA9IHZhbHVlLnZhbHVlLnByb3BlcnRpZXNbbWVtYmVyLmtleV07XG4gICAgaWYgKCFpdGVtIHx8IGVtaXR0ZWRQcm9wZXJ0aWVzLmhhcyhtZW1iZXIua2V5KSkgcmV0dXJuIFtdO1xuICAgIGVtaXR0ZWRQcm9wZXJ0aWVzLmFkZChtZW1iZXIua2V5KTtcbiAgICByZXR1cm4gW3N0cmluZ2lmeU9iamVjdFByb3BlcnR5KG1lbWJlci5rZXksIGl0ZW0sIGxldmVsLCBpbmRlbnQpXTtcbiAgfSk7XG4gIGxpbmVzLnB1c2goXG4gICAgLi4uT2JqZWN0LmVudHJpZXModmFsdWUudmFsdWUucHJvcGVydGllcylcbiAgICAgIC5maWx0ZXIoKFtrZXldKSA9PiAhZW1pdHRlZFByb3BlcnRpZXMuaGFzKGtleSkpXG4gICAgICAubWFwKChba2V5LCBpdGVtXSkgPT4gc3RyaW5naWZ5T2JqZWN0UHJvcGVydHkoa2V5LCBpdGVtLCBsZXZlbCwgaW5kZW50KSlcbiAgKTtcbiAgaWYgKGxpbmVzLmxlbmd0aCA9PT0gMCkgcmV0dXJuIGB7XFxuJHtjbG9zaW5nSW5kZW50fX1gO1xuICByZXR1cm4gYHtcXG4ke2xpbmVzLmpvaW4oJ1xcbicpfVxcbiR7Y2xvc2luZ0luZGVudH19YDtcbn1cblxuZnVuY3Rpb24gZ2V0TGFzdFByb3BlcnR5SW5kZXhCeUtleShtZW1iZXJPcmRlcjogT2JqZWN0TWVtYmVyW10pOiBNYXA8c3RyaW5nLCBudW1iZXI+IHtcbiAgY29uc3QgbGFzdFByb3BlcnR5SW5kZXhCeUtleSA9IG5ldyBNYXA8c3RyaW5nLCBudW1iZXI+KCk7XG4gIGZvciAoY29uc3QgW2luZGV4LCBtZW1iZXJdIG9mIG1lbWJlck9yZGVyLmVudHJpZXMoKSkge1xuICAgIGlmIChtZW1iZXIua2luZCA9PT0gJ3Byb3BlcnR5Jykge1xuICAgICAgbGFzdFByb3BlcnR5SW5kZXhCeUtleS5zZXQobWVtYmVyLmtleSwgaW5kZXgpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gbGFzdFByb3BlcnR5SW5kZXhCeUtleTtcbn1cblxuZnVuY3Rpb24gc3RyaW5naWZ5T2JqZWN0UHJvcGVydHkoa2V5OiBzdHJpbmcsIGl0ZW06IFBhcnNlZFZhbHVlLCBsZXZlbDogbnVtYmVyLCBpbmRlbnQ6IHN0cmluZyk6IHN0cmluZyB7XG4gIGNvbnN0IHN0cmluZ2lmaWVkID0gc3RyaW5naWZ5VmFsdWUoaXRlbSwgbGV2ZWwgKyAxKS5zcGxpdCgnXFxuJyk7XG4gIHN0cmluZ2lmaWVkW3N0cmluZ2lmaWVkLmxlbmd0aCAtIDFdID0gYCR7c3RyaW5naWZpZWQuYXQoLTEpfSxgO1xuICBpZiAoaXRlbS5raW5kID09PSAnbGl0ZXJhbCcpIHtcbiAgICBmb3IgKGxldCBpbmRleCA9IDE7IGluZGV4IDwgc3RyaW5naWZpZWQubGVuZ3RoOyBpbmRleCArPSAxKSB7XG4gICAgICBzdHJpbmdpZmllZFtpbmRleF0gPSBgJHtpbmRlbnR9JHtzdHJpbmdpZmllZFtpbmRleF19YDtcbiAgICB9XG4gIH1cbiAgc3RyaW5naWZpZWRbMF0gPSBgJHtpbmRlbnR9JHtrZXl9OiAke3N0cmluZ2lmaWVkWzBdfWA7XG4gIHJldHVybiBzdHJpbmdpZmllZC5qb2luKCdcXG4nKTtcbn1cblxuZnVuY3Rpb24gc3RyaW5naWZ5T2JqZWN0TWVtYmVyKG1lbWJlcjogc3RyaW5nLCBpbmRlbnQ6IHN0cmluZyk6IHN0cmluZyB7XG4gIGNvbnN0IHN0cmluZ2lmaWVkID0gbWVtYmVyLnNwbGl0KCdcXG4nKTtcbiAgc3RyaW5naWZpZWRbc3RyaW5naWZpZWQubGVuZ3RoIC0gMV0gPSBgJHtzdHJpbmdpZmllZC5hdCgtMSl9LGA7XG4gIGZvciAoY29uc3QgW2luZGV4LCBsaW5lXSBvZiBzdHJpbmdpZmllZC5lbnRyaWVzKCkpIHtcbiAgICBzdHJpbmdpZmllZFtpbmRleF0gPSBgJHtpbmRlbnR9JHtsaW5lfWA7XG4gIH1cbiAgcmV0dXJuIHN0cmluZ2lmaWVkLmpvaW4oJ1xcbicpO1xufVxuIiwiZXhwb3J0IGNvbnN0IGdsb2JJZ25vcmUgPSBbXG4gICcqKi9ub2RlX21vZHVsZXMvKionLFxuICAnKiovLnZlbnYvKionLFxuICAnKiovdGVzdC1maXh0dXJlcy8qKicsXG4gICcqKi90ZXN0L2ZpeHR1cmVzLyoqJyxcbiAgJyoqL2Rpc3QvKionLFxuICAnKiovYnVpbGQvKionLFxuICAnKiovdGFyZ2V0LyoqJyxcbiAgJyoqL3RlbXAvKionLFxuICAnKiovdG1wLyoqJyxcbl07XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcy9wcm9taXNlcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgZmcgZnJvbSAnZmFzdC1nbG9iJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZ2xvYklnbm9yZSB9IGZyb20gJy4uL3V0aWxzL2dsb2JVdGlsLmpzJztcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGZpeFByaXNtYUVudkZpbGVzKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2ZpeFByaXNtYUVudkZpbGVzJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IHNob3VsZEFkZENvbm5lY3Rpb25MaW1pdCA9IHNob3VsZEFkZFNxbGl0ZUNvbm5lY3Rpb25MaW1pdChjb25maWcpO1xuICAgIGNvbnN0IGVudkZpbGVzID0gYXdhaXQgZmcuZ2xvYihbJyouZW52JywgJyouZW52LionXSwgeyBkb3Q6IHRydWUsIGN3ZDogY29uZmlnLmRpclBhdGgsIGlnbm9yZTogZ2xvYklnbm9yZSB9KTtcbiAgICBmb3IgKGNvbnN0IGVudkZpbGUgb2YgZW52RmlsZXMpIHtcbiAgICAgIGNvbnN0IGVudkZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCBlbnZGaWxlKTtcbiAgICAgIGNvbnN0IGNvbnRlbnQgPSBhd2FpdCBmcy5yZWFkRmlsZShlbnZGaWxlUGF0aCwgJ3V0ZjgnKTtcbiAgICAgIGNvbnN0IG5ld0NvbnRlbnQgPSBjb250ZW50LnJlcGxhY2VBbGwoXG4gICAgICAgIC9EQVRBQkFTRV9VUkxcXHMqPVxccypcIj8oW15cIiNcXG5dKz9cXC5zcWxpdGUzW15cIiNcXG5dKilcIj8vZyxcbiAgICAgICAgKG1hdGNoLCB1cmw6IHN0cmluZykgPT4ge1xuICAgICAgICAgIHJldHVybiBgREFUQUJBU0VfVVJMPVwiJHtub3JtYWxpemVTcWxpdGVEYXRhYmFzZVVybCh1cmwsIHNob3VsZEFkZENvbm5lY3Rpb25MaW1pdCl9XCJgO1xuICAgICAgICB9XG4gICAgICApO1xuICAgICAgaWYgKG5ld0NvbnRlbnQgIT09IGNvbnRlbnQpIHtcbiAgICAgICAgYXdhaXQgZnMud3JpdGVGaWxlKGVudkZpbGVQYXRoLCBuZXdDb250ZW50KTtcbiAgICAgIH1cbiAgICB9XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBzaG91bGRBZGRTcWxpdGVDb25uZWN0aW9uTGltaXQoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogYm9vbGVhbiB7XG4gIGlmICghY29uZmlnLmRlcGVuZGluZy5wcmlzbWEpIHJldHVybiBmYWxzZTtcblxuICBjb25zdCBkZXBlbmRlbmNpZXMgPSB7XG4gICAgLi4uY29uZmlnLnBhY2thZ2VKc29uPy5kZXBlbmRlbmNpZXMsXG4gICAgLi4uY29uZmlnLnBhY2thZ2VKc29uPy5kZXZEZXBlbmRlbmNpZXMsXG4gIH07XG5cbiAgLy8gYGNvbm5lY3Rpb25fbGltaXQ9MWAgb25seSBhcHBsaWVzIHRvIFByaXNtYSdzIFNRTGl0ZSBkYXRhc291cmNlIGhhbmRsaW5nLlxuICAvLyBSZXBvcyB0aGF0IG9wdCBpbnRvIG5vbi1wdXJlIFNRTGl0ZSBhZGFwdGVycyBzaG91bGQga2VlcCB0aGVpciBVUkwgYXMtaXMuXG4gIHJldHVybiAhZGVwZW5kZW5jaWVzWydAcHJpc21hL2FkYXB0ZXItYmV0dGVyLXNxbGl0ZTMnXSAmJiAhZGVwZW5kZW5jaWVzWydAcHJpc21hL2FkYXB0ZXItbGlic3FsJ107XG59XG5cbmZ1bmN0aW9uIG5vcm1hbGl6ZVNxbGl0ZURhdGFiYXNlVXJsKHVybDogc3RyaW5nLCBzaG91bGRBZGRDb25uZWN0aW9uTGltaXQ6IGJvb2xlYW4pOiBzdHJpbmcge1xuICBjb25zdCBxdWVyeVN0YXJ0ID0gdXJsLmluZGV4T2YoJz8nKTtcbiAgY29uc3QgcGF0aFBhcnQgPSBxdWVyeVN0YXJ0ICE9PSAtMSA/IHVybC5zbGljZSgwLCBxdWVyeVN0YXJ0KSA6IHVybDtcbiAgY29uc3QgcXVlcnlQYXJ0ID0gcXVlcnlTdGFydCAhPT0gLTEgPyB1cmwuc2xpY2UocXVlcnlTdGFydCArIDEpIDogJyc7XG4gIGNvbnN0IHBhcmFtcyA9IG5ldyBVUkxTZWFyY2hQYXJhbXMocXVlcnlQYXJ0KTtcblxuICBwYXJhbXMuZGVsZXRlKCdjb25uZWN0aW9uX2xpbWl0Jyk7XG4gIGlmIChzaG91bGRBZGRDb25uZWN0aW9uTGltaXQpIHtcbiAgICBwYXJhbXMuc2V0KCdjb25uZWN0aW9uX2xpbWl0JywgJzEnKTtcbiAgfVxuXG4gIGNvbnN0IG5vcm1hbGl6ZWRRdWVyeSA9IHBhcmFtcy50b1N0cmluZygpO1xuICByZXR1cm4gbm9ybWFsaXplZFF1ZXJ5ID8gYCR7cGF0aFBhcnR9PyR7bm9ybWFsaXplZFF1ZXJ5fWAgOiBwYXRoUGFydDtcbn1cbiIsImNvbnN0IGhhcyA9IChvYmplY3QsIGtleSkgPT4gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iamVjdCwga2V5KVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBzb3J0T2JqZWN0QnlLZXlOYW1lTGlzdChvYmplY3QsIHNvcnRXaXRoKSB7XG4gIGxldCBrZXlzLCBzb3J0Rm4sIGtleVxuXG4gIGlmICh0eXBlb2Ygc29ydFdpdGggPT09ICdmdW5jdGlvbicpIHtcbiAgICBzb3J0Rm4gPSBzb3J0V2l0aFxuICB9IGVsc2Uge1xuICAgIGtleXMgPSBzb3J0V2l0aFxuICB9XG5cbiAgY29uc3QgdG90YWwgPSB7fVxuICBjb25zdCBvYmplY3RLZXlzID0gWy4uLihrZXlzID8/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+KTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIG9iajtcbn1cbiIsIi8vIEdpdEh1YiBBY3Rpb25zIHZhbHVlbGVzcyBldmVudHMgc3VjaCBhcyBgcHVsbF9yZXF1ZXN0OmAgcmVxdWlyZSBZQU1MIG51bGwgdmFsdWVzLlxuLy8gb3hsaW50LWRpc2FibGUgZXNsaW50LXBsdWdpbi1pbXBvcnQvbm8tbmFtZWQtYXMtZGVmYXVsdC1tZW1iZXIgLS0gTmFtZXNwYWNlIFlBTUwgY2FsbHMgbWFrZSBsb2FkL2R1bXAgdXNhZ2UgY2xlYXJlci5cbi8qIGVzbGludC1kaXNhYmxlIHVuaWNvcm4vbm8tbnVsbCAqL1xuXG5pbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgbWVyZ2UgZnJvbSAnZGVlcG1lcmdlJztcbmltcG9ydCB5YW1sIGZyb20gJ2pzLXlhbWwnO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBjb21iaW5lTWVyZ2UgfSBmcm9tICcuLi91dGlscy9tZXJnZVV0aWwuanMnO1xuaW1wb3J0IHsgbW92ZVRvQm90dG9tLCBzb3J0S2V5cyB9IGZyb20gJy4uL3V0aWxzL29iamVjdFV0aWwuanMnO1xuaW1wb3J0IHsgcHJvbWlzZVBvb2wgfSBmcm9tICcuLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5cbmludGVyZmFjZSBXb3JrZmxvdyB7XG4gIG5hbWU/OiBzdHJpbmc7XG4gIG9uPzogT247XG4gIGNvbmN1cnJlbmN5PzogQ29uY3VycmVuY3k7XG4gIHBlcm1pc3Npb25zPzogUmVjb3JkPHN0cmluZywgc3RyaW5nPjtcbiAgam9iczogUmVjb3JkPHN0cmluZywgSm9iPjtcbn1cblxuaW50ZXJmYWNlIENvbmN1cnJlbmN5IHtcbiAgZ3JvdXA6IHN0cmluZztcbiAgJ2NhbmNlbC1pbi1wcm9ncmVzcyc6IGJvb2xlYW47XG59XG5cbmludGVyZmFjZSBPbiB7XG4gIC8vIEdpdEh1YiBBY3Rpb25zIHRyZWF0cyBgZXZlbnQ6IG51bGxgIGFzIGEgdmFsdWVsZXNzIGV2ZW50IG1hcHBpbmcsIGUuZy5cbiAgLy8gYHB1bGxfcmVxdWVzdDpgLiBgdW5kZWZpbmVkYCB3b3VsZCBvbWl0IHRoZSBldmVudCBlbnRpcmVseSB3aGVuIGR1bXBpbmcgWUFNTC5cbiAgaXNzdWVzPzogVHlwZXMgfCBudWxsO1xuICBwdWxsX3JlcXVlc3Q/OiBQdWxsUmVxdWVzdCB8IG51bGw7XG4gIHB1bGxfcmVxdWVzdF90YXJnZXQ/OiBUeXBlcyB8IG51bGw7XG4gIHB1c2g/OiBQdXNoO1xuICBzY2hlZHVsZT86IFNjaGVkdWxlW107XG4gIHdvcmtmbG93X2Rpc3BhdGNoPzogbnVsbDtcbn1cblxuaW50ZXJmYWNlIFB1bGxSZXF1ZXN0IHtcbiAgJ3BhdGhzLWlnbm9yZSc/OiBzdHJpbmdbXTtcbiAgdHlwZXM/OiBzdHJpbmdbXTtcbn1cblxuaW50ZXJmYWNlIFB1c2gge1xuICBicmFuY2hlczogc3RyaW5nW107XG4gICdwYXRocy1pZ25vcmUnPzogc3RyaW5nW107XG59XG5cbmludGVyZmFjZSBTY2hlZHVsZSB7XG4gIGNyb246IHN0cmluZztcbn1cblxuaW50ZXJmYWNlIFR5cGVzIHtcbiAgdHlwZXM6IHN0cmluZ1tdO1xufVxuXG5pbnRlcmZhY2UgSm9iIHtcbiAgJ3J1bnMtb24nPzogc3RyaW5nO1xuICBwZXJtaXNzaW9ucz86IFJlY29yZDxzdHJpbmcsIHN0cmluZz47XG4gIHN0ZXBzPzogU3RlcFtdO1xuICB1c2VzPzogc3RyaW5nO1xuICBpZj86IHN0cmluZztcbiAgc2VjcmV0cz86IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICB3aXRoPzogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG59XG5cbmludGVyZmFjZSBTdGVwIHtcbiAgdXNlcz86IHN0cmluZztcbiAgd2l0aD86IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICBydW4/OiBzdHJpbmc7XG59XG5cbmNvbnN0IHB1YmxpY1JlcG9BdXRvZml4V29ya2Zsb3c6IFdvcmtmbG93ID0ge1xuICBuYW1lOiAnYXV0b2ZpeC5jaScsXG4gIG9uOiB7XG4gICAgcHVsbF9yZXF1ZXN0OiBudWxsLFxuICAgIHB1c2g6IHtcbiAgICAgIGJyYW5jaGVzOiBbJ21haW4nXSxcbiAgICB9LFxuICB9LFxuICBwZXJtaXNzaW9uczoge1xuICAgIGNvbnRlbnRzOiAncmVhZCcsXG4gIH0sXG4gIGNvbmN1cnJlbmN5OiB7XG4gICAgZ3JvdXA6ICdhdXRvZml4LSR7eyBnaXRodWIuaGVhZF9yZWYgfX0nLFxuICAgICdjYW5jZWwtaW4tcHJvZ3Jlc3MnOiB0cnVlLFxuICB9LFxuICBqb2JzOiB7XG4gICAgYXV0b2ZpeDogeyAncnVucy1vbic6ICd1YnVudHUtbGF0ZXN0JyB9LFxuICB9LFxufTtcblxuY29uc3QgcHJpdmF0ZVJlcG9BdXRvZml4V29ya2Zsb3c6IFdvcmtmbG93ID0ge1xuICBuYW1lOiAnRml4IGNvZGUgYXV0b21hdGljYWxseScsXG4gIG9uOiB7XG4gICAgcHVsbF9yZXF1ZXN0OiBudWxsLFxuICB9LFxuICBjb25jdXJyZW5jeToge1xuICAgIGdyb3VwOiAnJHt7IGdpdGh1Yi53b3JrZmxvdyB9fS0ke3sgZ2l0aHViLnJlZiB9fScsXG4gICAgJ2NhbmNlbC1pbi1wcm9ncmVzcyc6IHRydWUsXG4gIH0sXG4gIGpvYnM6IHtcbiAgICBhdXRvZml4OiB7XG4gICAgICB1c2VzOiAnV2lsbEJvb3N0ZXIvcmV1c2FibGUtd29ya2Zsb3dzLy5naXRodWIvd29ya2Zsb3dzL2F1dG9maXgueW1sQG1haW4nLFxuICAgIH0sXG4gIH0sXG59O1xuXG5jb25zdCB3b3JrZmxvd3MgPSB7XG4gIHRlc3Q6IHtcbiAgICBuYW1lOiAnVGVzdCcsXG4gICAgb246IHtcbiAgICAgIHB1bGxfcmVxdWVzdDogbnVsbCxcbiAgICAgIHB1c2g6IHtcbiAgICAgICAgYnJhbmNoZXM6IFsnbWFpbicsICd3YmZ5J10sXG4gICAgICB9LFxuICAgIH0sXG4gICAgLy8gY2YuIGh0dHBzOi8vZG9jcy5naXRodWIuY29tL2VuL2FjdGlvbnMvdXNpbmctam9icy91c2luZy1jb25jdXJyZW5jeSNleGFtcGxlLW9ubHktY2FuY2VsLWluLXByb2dyZXNzLWpvYnMtb3ItcnVucy1mb3ItdGhlLWN1cnJlbnQtd29ya2Zsb3dcbiAgICBjb25jdXJyZW5jeToge1xuICAgICAgZ3JvdXA6ICcke3sgZ2l0aHViLndvcmtmbG93IH19LSR7eyBnaXRodWIucmVmIH19JyxcbiAgICAgICdjYW5jZWwtaW4tcHJvZ3Jlc3MnOiB0cnVlLFxuICAgIH0sXG4gICAgcGVybWlzc2lvbnM6IHtcbiAgICAgIC8vIGZvciBsaW50ZXIgZml4XG4gICAgICBjb250ZW50czogJ3dyaXRlJyxcbiAgICB9LFxuICAgIGpvYnM6IHtcbiAgICAgIHRlc3Q6IHtcbiAgICAgICAgdXNlczogJ1dpbGxCb29zdGVyL3JldXNhYmxlLXdvcmtmbG93cy8uZ2l0aHViL3dvcmtmbG93cy90ZXN0LnltbEBtYWluJyxcbiAgICAgIH0sXG4gICAgfSxcbiAgfSxcbiAgcmVsZWFzZToge1xuICAgIG5hbWU6ICdSZWxlYXNlJyxcbiAgICBvbjoge1xuICAgICAgcHVzaDoge1xuICAgICAgICBicmFuY2hlczogW10sXG4gICAgICB9LFxuICAgIH0sXG4gICAgY29uY3VycmVuY3k6IHtcbiAgICAgIGdyb3VwOiAnJHt7IGdpdGh1Yi53b3JrZmxvdyB9fScsXG4gICAgICAnY2FuY2VsLWluLXByb2dyZXNzJzogZmFsc2UsXG4gICAgfSxcbiAgICBwZXJtaXNzaW9uczoge1xuICAgICAgLy8gaHR0cHM6Ly9kb2NzLm5wbWpzLmNvbS90cnVzdGVkLXB1Ymxpc2hlcnMjc3RlcC0yLWNvbmZpZ3VyZS15b3VyLWNpY2Qtd29ya2Zsb3dcbiAgICAgICdpZC10b2tlbic6ICd3cml0ZScsXG4gICAgICAvLyBmb3Igc2VtYW50aWMtcmVsZWFzZVxuICAgICAgY29udGVudHM6ICd3cml0ZScsXG4gICAgfSxcbiAgICBqb2JzOiB7XG4gICAgICByZWxlYXNlOiB7XG4gICAgICAgIHVzZXM6ICdXaWxsQm9vc3Rlci9yZXVzYWJsZS13b3JrZmxvd3MvLmdpdGh1Yi93b3JrZmxvd3MvcmVsZWFzZS55bWxAbWFpbicsXG4gICAgICB9LFxuICAgIH0sXG4gIH0sXG4gICdzZW1hbnRpYy1wcic6IHtcbiAgICBuYW1lOiAnTGludCBQUiB0aXRsZScsXG4gICAgb246IHtcbiAgICAgIHB1bGxfcmVxdWVzdF90YXJnZXQ6IHtcbiAgICAgICAgdHlwZXM6IFsnb3BlbmVkJywgJ2VkaXRlZCcsICdzeW5jaHJvbml6ZSddLFxuICAgICAgfSxcbiAgICB9LFxuICAgIGpvYnM6IHtcbiAgICAgICdzZW1hbnRpYy1wcic6IHtcbiAgICAgICAgdXNlczogJ1dpbGxCb29zdGVyL3JldXNhYmxlLXdvcmtmbG93cy8uZ2l0aHViL3dvcmtmbG93cy9zZW1hbnRpYy1wci55bWxAbWFpbicsXG4gICAgICB9LFxuICAgIH0sXG4gIH0sXG4gIHN5bmM6IHtcbiAgICBuYW1lOiAnU3luYycsXG4gICAgb246IHt9LFxuICAgIHBlcm1pc3Npb25zOiB7XG4gICAgICAvLyBmb3IgY29tbWl0aW5nIGNoYW5nZXNcbiAgICAgIGNvbnRlbnRzOiAnd3JpdGUnLFxuICAgIH0sXG4gICAgam9iczoge1xuICAgICAgc3luYzogeyB1c2VzOiAnV2lsbEJvb3N0ZXIvcmV1c2FibGUtd29ya2Zsb3dzLy5naXRodWIvd29ya2Zsb3dzL3N5bmMueW1sQG1haW4nIH0sXG4gICAgfSxcbiAgfSxcbiAgJ2Nsb3NlLWNvbW1lbnQnOiB7XG4gICAgbmFtZTogJ0FkZCBjbG9zZSBjb21tZW50JyxcbiAgICBvbjoge1xuICAgICAgcHVsbF9yZXF1ZXN0OiB7XG4gICAgICAgIHR5cGVzOiBbJ29wZW5lZCddLFxuICAgICAgfSxcbiAgICB9LFxuICAgIGpvYnM6IHtcbiAgICAgICdjbG9zZS1jb21tZW50Jzoge1xuICAgICAgICB1c2VzOiAnV2lsbEJvb3N0ZXIvcmV1c2FibGUtd29ya2Zsb3dzLy5naXRodWIvd29ya2Zsb3dzL2Nsb3NlLWNvbW1lbnQueW1sQG1haW4nLFxuICAgICAgfSxcbiAgICB9LFxuICB9LFxufSBhcyBjb25zdDtcblxudHlwZSBLbm93bktpbmQgPSBrZXlvZiB0eXBlb2Ygd29ya2Zsb3dzIHwgJ2RlcGxveScgfCAnYXV0b2ZpeCc7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZW5lcmF0ZVdvcmtmbG93cyhyb290Q29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZ2VuZXJhdGVXb3JrZmxvdycsIGFzeW5jICgpID0+IHtcbiAgICBpZiAoaXNSZXVzYWJsZVdvcmtmbG93c1JlcG8ocm9vdENvbmZpZy5yZXBvc2l0b3J5KSkge1xuICAgICAgLy8gRG9uJ3QgdG91Y2ggcmV1c2FibGUtd29ya2Zsb3dzIHJlcG8gYmVjYXVzZSBpdCBob3N0cyB1cHN0cmVhbSB3b3JrZmxvdyBkZWZpbml0aW9ucy5cbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCB3b3JrZmxvd3NQYXRoID0gcGF0aC5yZXNvbHZlKHJvb3RDb25maWcuZGlyUGF0aCwgJy5naXRodWInLCAnd29ya2Zsb3dzJyk7XG4gICAgYXdhaXQgZnMucHJvbWlzZXMubWtkaXIod29ya2Zsb3dzUGF0aCwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG5cbiAgICAvLyBSZW1vdmUgY29uZmlnIG9mIHNlbWFudGljIHB1bGwgcmVxdWVzdFxuICAgIGNvbnN0IHNlbWFudGljWW1sUGF0aCA9IHBhdGgucmVzb2x2ZShyb290Q29uZmlnLmRpclBhdGgsICcuZ2l0aHViJywgJ3NlbWFudGljLnltbCcpO1xuICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiBmcy5wcm9taXNlcy5ybShzZW1hbnRpY1ltbFBhdGgsIHsgZm9yY2U6IHRydWUsIHJlY3Vyc2l2ZTogdHJ1ZSB9KSk7XG5cbiAgICBjb25zdCBlbnRyaWVzID0gYXdhaXQgZnMucHJvbWlzZXMucmVhZGRpcih3b3JrZmxvd3NQYXRoLCB7IHdpdGhGaWxlVHlwZXM6IHRydWUgfSk7XG4gICAgZm9yIChjb25zdCBlbnRyeSBvZiBlbnRyaWVzKSB7XG4gICAgICBpZiAoIWVudHJ5LmlzRmlsZSgpIHx8ICFpc09ic29sZXRlR2VuUHJXb3JrZmxvd0ZpbGVOYW1lKGVudHJ5Lm5hbWUpKSBjb250aW51ZTtcbiAgICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiBmcy5wcm9taXNlcy5ybShwYXRoLmpvaW4od29ya2Zsb3dzUGF0aCwgZW50cnkubmFtZSksIHsgZm9yY2U6IHRydWUgfSkpO1xuICAgIH1cbiAgICBjb25zdCBmaWxlTmFtZVNldCA9IG5ldyBTZXQoW1xuICAgICAgJ3Rlc3QueW1sJyxcbiAgICAgICdhdXRvZml4LnltbCcsXG4gICAgICAnc2VtYW50aWMtcHIueW1sJyxcbiAgICAgICdjbG9zZS1jb21tZW50LnltbCcsXG4gICAgICAuLi5lbnRyaWVzXG4gICAgICAgIC5maWx0ZXIoXG4gICAgICAgICAgKGRpcmVudCkgPT4gZGlyZW50LmlzRmlsZSgpICYmIGRpcmVudC5uYW1lLmVuZHNXaXRoKCcueW1sJykgJiYgIWlzT2Jzb2xldGVHZW5QcldvcmtmbG93RmlsZU5hbWUoZGlyZW50Lm5hbWUpXG4gICAgICAgIClcbiAgICAgICAgLm1hcCgoZGlyZW50KSA9PiBkaXJlbnQubmFtZSksXG4gICAgXSk7XG4gICAgaWYgKHJvb3RDb25maWcuZGVwZW5kaW5nLnNlbWFudGljUmVsZWFzZSkge1xuICAgICAgZmlsZU5hbWVTZXQuYWRkKCdyZWxlYXNlLnltbCcpO1xuICAgIH1cblxuICAgIGZvciAoY29uc3QgZmlsZU5hbWUgb2YgZmlsZU5hbWVTZXQpIHtcbiAgICAgIC8vIOWun+mam+OBr0tub3duS2luZOS7peWkluOBruWApOOCguS7o+WFpeOBleOCjOOCi+OBk+OBqOOBq+azqOaEj1xuICAgICAgY29uc3Qga2luZCA9IHBhdGguYmFzZW5hbWUoZmlsZU5hbWUsICcueW1sJykgYXMgS25vd25LaW5kO1xuICAgICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IHdyaXRlV29ya2Zsb3dZYW1sKHJvb3RDb25maWcsIHdvcmtmbG93c1BhdGgsIGtpbmQpKTtcbiAgICB9XG4gIH0pO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNSZXVzYWJsZVdvcmtmbG93c1JlcG8ocmVwb3NpdG9yeT86IHN0cmluZyk6IGJvb2xlYW4ge1xuICByZXR1cm4gcmVwb3NpdG9yeT8uZW5kc1dpdGgoJy9yZXVzYWJsZS13b3JrZmxvd3MnKSA/PyBmYWxzZTtcbn1cblxuZnVuY3Rpb24gaXNPYnNvbGV0ZUdlblByV29ya2Zsb3dGaWxlTmFtZShmaWxlTmFtZTogc3RyaW5nKTogYm9vbGVhbiB7XG4gIHJldHVybiAvXmdlbi1wcig/Oi0uKyk/XFwueWE/bWwkL3UudGVzdChmaWxlTmFtZSk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHdyaXRlV29ya2Zsb3dZYW1sKGNvbmZpZzogUGFja2FnZUNvbmZpZywgd29ya2Zsb3dzUGF0aDogc3RyaW5nLCBraW5kOiBLbm93bktpbmQpOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgZmlsZVBhdGggPSBwYXRoLmpvaW4od29ya2Zsb3dzUGF0aCwgYCR7a2luZH0ueW1sYCk7XG4gIGNvbnN0IGRlcGxveVByb2R1Y3Rpb25Xb3JrZmxvd0V4aXN0cyA9IGZzLmV4aXN0c1N5bmMocGF0aC5qb2luKHdvcmtmbG93c1BhdGgsICdkZXBsb3ktcHJvZHVjdGlvbi55bWwnKSk7XG5cbiAgaWYgKGtpbmQgPT09ICdhdXRvZml4Jykge1xuICAgIGF3YWl0IHdyaXRlWWFtbChnZW5lcmF0ZUF1dG9maXhXb3JrZmxvdyhjb25maWcpLCBmaWxlUGF0aCk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgbGV0IG5ld1NldHRpbmdzID0gc3RydWN0dXJlZENsb25lKGtpbmQgaW4gd29ya2Zsb3dzID8gd29ya2Zsb3dzW2tpbmQgYXMga2V5b2YgdHlwZW9mIHdvcmtmbG93c10gOiB7fSkgYXMgV29ya2Zsb3c7XG5cbiAgdHJ5IHtcbiAgICBjb25zdCBvbGRDb250ZW50ID0gYXdhaXQgZnMucHJvbWlzZXMucmVhZEZpbGUoZmlsZVBhdGgsICd1dGY4Jyk7XG4gICAgY29uc3Qgb2xkU2V0dGluZ3MgPSB5YW1sLmxvYWQob2xkQ29udGVudCkgYXMgV29ya2Zsb3c7XG4gICAgbmV3U2V0dGluZ3MgPSBtZXJnZS5hbGwoW25ld1NldHRpbmdzLCBvbGRTZXR0aW5ncywgbmV3U2V0dGluZ3NdLCB7IGFycmF5TWVyZ2U6IGNvbWJpbmVNZXJnZSB9KSBhcyBXb3JrZmxvdztcbiAgfSBjYXRjaCB7XG4gICAgLy8gZG8gbm90aGluZ1xuICB9XG5cbiAgLy8gU2tpcCBhIGJyb2tlbiB3b3JrZmxvd1xuICBpZiAoISgnam9icycgaW4gbmV3U2V0dGluZ3MpKSByZXR1cm47XG5cbiAgaWYgKGtpbmQuc3RhcnRzV2l0aCgnZGVwbG95JykpIHtcbiAgICBuZXdTZXR0aW5ncyA9IHtcbiAgICAgIC4uLm5ld1NldHRpbmdzLFxuICAgICAgY29uY3VycmVuY3k6IHtcbiAgICAgICAgZ3JvdXA6ICcke3sgZ2l0aHViLndvcmtmbG93IH19JyxcbiAgICAgICAgJ2NhbmNlbC1pbi1wcm9ncmVzcyc6IGZhbHNlLFxuICAgICAgfSxcbiAgICB9O1xuICAgIC8vIE1vdmUgam9icyB0byB0aGUgYm90dG9tXG4gICAgbW92ZVRvQm90dG9tKG5ld1NldHRpbmdzLCAnam9icycpO1xuICAgIGlmIChuZXdTZXR0aW5ncy5vbj8ucHVzaCkge1xuICAgICAgbmV3U2V0dGluZ3Mub24ucHVzaFsncGF0aHMtaWdub3JlJ10gPSBbXG4gICAgICAgIC4uLm5ldyBTZXQoWycqKi5tZCcsICcqKi9kb2NzLyoqJywgLi4uKG5ld1NldHRpbmdzLm9uLnB1c2hbJ3BhdGhzLWlnbm9yZSddID8/IFtdKV0pLFxuICAgICAgXTtcbiAgICB9XG4gIH1cblxuICBpZiAoa2luZCA9PT0gJ3JlbGVhc2UnICYmIG5ld1NldHRpbmdzLmpvYnMucmVsZWFzZSAmJiBkZXBsb3lQcm9kdWN0aW9uV29ya2Zsb3dFeGlzdHMpIHtcbiAgICBuZXdTZXR0aW5ncy5wZXJtaXNzaW9ucyA/Pz0ge307XG4gICAgbmV3U2V0dGluZ3MucGVybWlzc2lvbnMuYWN0aW9ucyA9ICd3cml0ZSc7XG4gICAgbmV3U2V0dGluZ3Muam9icy5yZWxlYXNlLndpdGggPz89IHt9O1xuICAgIG5ld1NldHRpbmdzLmpvYnMucmVsZWFzZS53aXRoLnRyaWdnZXJfZGVwbG95X3dvcmtmbG93ID0gJ2RlcGxveS1wcm9kdWN0aW9uLnltbCc7XG4gIH1cblxuICBsZXQgaXNSZXVzYWJsZVdvcmtmbG93ID0gZmFsc2U7XG4gIGZvciAoY29uc3Qgam9iIG9mIE9iamVjdC52YWx1ZXMobmV3U2V0dGluZ3Muam9icykpIHtcbiAgICAvLyBJZ25vcmUgbm9uLXJldXNhYmxlIHdvcmtmbG93c1xuICAgIGlmICgham9iLnVzZXM/LmluY2x1ZGVzKCcvcmV1c2FibGUtd29ya2Zsb3dzLycpKSBjb250aW51ZTtcblxuICAgIG5vcm1hbGl6ZUpvYihjb25maWcsIGpvYiwga2luZCk7XG4gICAgaXNSZXVzYWJsZVdvcmtmbG93ID0gdHJ1ZTtcbiAgfVxuICBpZiAoIWlzUmV1c2FibGVXb3JrZmxvdykgcmV0dXJuO1xuXG4gIHN3aXRjaCAoa2luZCkge1xuICAgIGNhc2UgJ3JlbGVhc2UnOiB7XG4gICAgICBpZiAobmV3U2V0dGluZ3Mub24/LnNjaGVkdWxlKSB7XG4gICAgICAgIGRlbGV0ZSBuZXdTZXR0aW5ncy5vbi5wdXNoO1xuICAgICAgfSBlbHNlIGlmIChuZXdTZXR0aW5ncy5vbj8ucHVzaCAmJiBjb25maWcucmVsZWFzZS5icmFuY2hlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgIG5ld1NldHRpbmdzLm9uLnB1c2guYnJhbmNoZXMgPSBjb25maWcucmVsZWFzZS5icmFuY2hlcztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIERvbid0IHVzZSByZWxlYXNlLnltbCBpZiByZWxlYXNlIGJyYW5jaCBpcyBub3Qgc3BlY2lmaWVkXG4gICAgICAgIGF3YWl0IGZzLnByb21pc2VzLnJtKHBhdGguam9pbih3b3JrZmxvd3NQYXRoLCAncmVsZWFzZS55bWwnKSwgeyBmb3JjZTogdHJ1ZSB9KTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgaWYgKGNvbmZpZy5pc1B1YmxpY1JlcG8pIHtcbiAgICAgICAgbmV3U2V0dGluZ3MucGVybWlzc2lvbnMgPz89IHt9O1xuICAgICAgICBuZXdTZXR0aW5ncy5wZXJtaXNzaW9uc1snaWQtdG9rZW4nXSA9ICd3cml0ZSc7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBkZWxldGUgbmV3U2V0dGluZ3MucGVybWlzc2lvbnM/LlsnaWQtdG9rZW4nXTtcbiAgICAgIH1cbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgICBjYXNlICd0ZXN0Jzoge1xuICAgICAgLy8gRG9uJ3QgdXNlIGBwYXRocy1pZ25vcmVgIGZvciB0ZXN0IGJlY2F1c2UgR2l0SHViJ3MgQnJhbmNoIFByb3RlY3Rpb24gYW5kIFJ1bGVzZXRzIHJlcXVpcmUgam9iIHJ1bm5pbmcuXG4gICAgICBpZiAobmV3U2V0dGluZ3Mub24/LnB1bGxfcmVxdWVzdCkge1xuICAgICAgICBkZWxldGUgbmV3U2V0dGluZ3Mub24ucHVsbF9yZXF1ZXN0WydwYXRocy1pZ25vcmUnXTtcbiAgICAgIH1cbiAgICAgIGlmIChuZXdTZXR0aW5ncy5vbj8ucHVzaCkge1xuICAgICAgICBkZWxldGUgbmV3U2V0dGluZ3Mub24ucHVzaFsncGF0aHMtaWdub3JlJ107XG4gICAgICAgIG5ld1NldHRpbmdzLm9uLnB1c2guYnJhbmNoZXMgPSBuZXdTZXR0aW5ncy5vbi5wdXNoLmJyYW5jaGVzLmZpbHRlcigoYnJhbmNoKSA9PiBicmFuY2ggIT09ICdyZW5vdmF0ZS8qKicpO1xuICAgICAgfVxuICAgICAgYnJlYWs7XG4gICAgfVxuICAgIC8vIE5vIGRlZmF1bHRcbiAgfVxuICBhd2FpdCB3cml0ZVlhbWwobmV3U2V0dGluZ3MsIGZpbGVQYXRoKTtcblxuICBpZiAoa2luZCA9PT0gJ3N5bmMnKSB7XG4gICAgYXdhaXQgZnMucHJvbWlzZXMucm0ocGF0aC5qb2luKHdvcmtmbG93c1BhdGgsICdzeW5jLWluaXQueW1sJyksIHsgZm9yY2U6IHRydWUgfSk7XG4gICAgaWYgKCFuZXdTZXR0aW5ncy5qb2JzLnN5bmM/LndpdGgpIHJldHVybjtcblxuICAgIC8vIEdlbmVyYXRlIHN5bmMtZm9yY2UueW1sIGJhc2VkIG9uIHN5bmMueW1sIGlmIGl0IGV4aXN0cy5cbiAgICBuZXdTZXR0aW5ncy5qb2JzWydzeW5jLWZvcmNlJ10gPSBuZXdTZXR0aW5ncy5qb2JzLnN5bmM7XG4gICAgY29uc3QgcGFyYW1zID0gbmV3U2V0dGluZ3Muam9icy5zeW5jLndpdGguc3luY19wYXJhbXNfd2l0aG91dF9kZXN0O1xuICAgIGlmICh0eXBlb2YgcGFyYW1zICE9PSAnc3RyaW5nJykgcmV0dXJuO1xuXG4gICAgbmV3U2V0dGluZ3Muam9icy5zeW5jLndpdGguc3luY19wYXJhbXNfd2l0aG91dF9kZXN0ID0gYC0tZm9yY2UgJHtwYXJhbXN9YDtcbiAgICBuZXdTZXR0aW5ncy5uYW1lID0gJ0ZvcmNlIHRvIFN5bmMnO1xuICAgIG5ld1NldHRpbmdzLm9uID0geyB3b3JrZmxvd19kaXNwYXRjaDogbnVsbCB9O1xuICAgIGRlbGV0ZSBuZXdTZXR0aW5ncy5qb2JzLnN5bmM7XG4gICAgYXdhaXQgd3JpdGVZYW1sKG5ld1NldHRpbmdzLCBwYXRoLmpvaW4od29ya2Zsb3dzUGF0aCwgJ3N5bmMtZm9yY2UueW1sJykpO1xuICB9XG59XG5cbmZ1bmN0aW9uIG5vcm1hbGl6ZUpvYihjb25maWc6IFBhY2thZ2VDb25maWcsIGpvYjogSm9iLCBraW5kOiBLbm93bktpbmQpOiB2b2lkIHtcbiAgam9iLndpdGggPz89IHt9O1xuICBqb2Iuc2VjcmV0cyA/Pz0ge307XG4gIC8vIFVzZSB0cnVzdGVkIHB1Ymxpc2hpbmcgaW5zdGVhZCBvZiBOUE1fVE9LRU5cbiAgZGVsZXRlIGpvYi5zZWNyZXRzLk5QTV9UT0tFTjtcblxuICBpZiAoa2luZCA9PT0gJ3Rlc3QnIHx8IGtpbmQgPT09ICdyZWxlYXNlJykge1xuICAgIGpvYi5zZWNyZXRzLkdIX1RPS0VOID0gJyR7eyBzZWNyZXRzLkdJVEhVQl9UT0tFTiB9fSc7XG4gIH1cblxuICBpZiAoam9iLnNlY3JldHMuRklSRUJBU0VfVE9LRU4pIHtcbiAgICBqb2Iuc2VjcmV0cy5HQ1BfU0FfS0VZX0pTT05fRk9SX0ZJUkVCQVNFID0gJyR7eyBzZWNyZXRzLkdDUF9TQV9LRVlfSlNPTl9GT1JfRklSRUJBU0UgfX0nO1xuICAgIGRlbGV0ZSBqb2Iuc2VjcmV0cy5GSVJFQkFTRV9UT0tFTjtcbiAgfVxuICBpZiAoXG4gICAgKGpvYi5zZWNyZXRzLkRJU0NPUkRfV0VCSE9PS19VUkwgJiYgKGtpbmQgPT09ICdyZWxlYXNlJyB8fCBraW5kLnN0YXJ0c1dpdGgoJ2RlcGxveScpKSkgfHxcbiAgICAoam9iLndpdGguc2VydmVyX3VybCAmJiBraW5kLnN0YXJ0c1dpdGgoJ2RlcGxveScpKVxuICApIHtcbiAgICBqb2Iuc2VjcmV0cy5ESVNDT1JEX1dFQkhPT0tfVVJMID0gJyR7eyBzZWNyZXRzLkRJU0NPUkRfV0VCSE9PS19VUkxfRk9SX1JFTEVBU0UgfX0nO1xuICB9XG5cbiAgaWYgKGtpbmQgPT09ICdzeW5jJykge1xuICAgIGNvbnN0IHBhcmFtcyA9IGpvYi53aXRoLnN5bmNfcGFyYW1zX3dpdGhvdXRfZGVzdDtcbiAgICBpZiAodHlwZW9mIHBhcmFtcyA9PT0gJ3N0cmluZycpIHtcbiAgICAgIGpvYi53aXRoLnN5bmNfcGFyYW1zX3dpdGhvdXRfZGVzdCA9IHBhcmFtcy5yZXBsYWNlKCdzeW5jICcsICcnKTtcbiAgICB9XG4gIH1cblxuICBpZiAoY29uZmlnLnJlcG9zaXRvcnk/LnN0YXJ0c1dpdGgoJ2dpdGh1YjpXaWxsQm9vc3Rlci8nKSkge1xuICAgIGpvYi51c2VzID0gam9iLnVzZXM/LnJlcGxhY2UoJ1dpbGxCb29zdGVyTGFiLycsICdXaWxsQm9vc3Rlci8nKTtcbiAgfSBlbHNlIGlmIChjb25maWcucmVwb3NpdG9yeT8uc3RhcnRzV2l0aCgnZ2l0aHViOldpbGxCb29zdGVyTGFiLycpKSB7XG4gICAgam9iLnVzZXMgPSBqb2IudXNlcz8ucmVwbGFjZSgnV2lsbEJvb3N0ZXIvJywgJ1dpbGxCb29zdGVyTGFiLycpO1xuICB9XG5cbiAgLy8gUmVtb3ZlIHJlZHVuZGFudCBwYXJhbWV0ZXJzXG4gIGlmIChqb2Iud2l0aC5kb3RfZW52X3BhdGggPT09ICcuZW52Jykge1xuICAgIGRlbGV0ZSBqb2Iud2l0aC5kb3RfZW52X3BhdGg7XG4gIH1cblxuICAvLyBEb24ndCB1c2UgYGZseSBkZXBsb3kgLS1qc29uYCBzaW5jZSBpdCBjYXVzZXMgYW4gZXJyb3JcbiAgaWYgKGtpbmQuc3RhcnRzV2l0aCgnZGVwbG95JykgJiYgam9iLnNlY3JldHMuRkxZX0FQSV9UT0tFTiAmJiB0eXBlb2Ygam9iLndpdGguZGVwbG95X2NvbW1hbmQgPT09ICdzdHJpbmcnKSB7XG4gICAgam9iLndpdGguZGVwbG95X2NvbW1hbmQgPSBqb2Iud2l0aC5kZXBsb3lfY29tbWFuZC5yZXBsYWNlKC9cXHMrLS1qc29uLywgJycpO1xuICB9XG4gIGlmIChjb25maWcuZG9lc0NvbnRhaW5Eb2NrZXJmaWxlICYmICFqb2Iud2l0aC5jaV9sYWJlbCAmJiBraW5kLnN0YXJ0c1dpdGgoJ3Rlc3QnKSkge1xuICAgIGpvYi53aXRoLmNpX2xhYmVsID0gJ2xhcmdlJztcbiAgfVxuICAvLyBCZWNhdXNlIGdpdGh1Yi5ldmVudC5yZXBvc2l0b3J5LnByaXZhdGUgaXMgYWx3YXlzIHRydWUgaWYgam9iIGlzIHNjaGVkdWxlZFxuICBpZiAoa2luZCA9PT0gJ3JlbGVhc2UnIHx8IGtpbmQgPT09ICd0ZXN0JyB8fCBraW5kLnN0YXJ0c1dpdGgoJ2RlcGxveScpKSB7XG4gICAgaWYgKGNvbmZpZy5pc1B1YmxpY1JlcG8pIHtcbiAgICAgIGpvYi53aXRoLmdpdGh1Yl9ob3N0ZWRfcnVubmVyID0gdHJ1ZTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgZGVsZXRlIGpvYi53aXRoLmdpdGh1Yl9ob3N0ZWRfcnVubmVyO1xuICB9XG5cbiAgaWYgKE9iamVjdC5rZXlzKGpvYi53aXRoKS5sZW5ndGggPiAwKSB7XG4gICAgc29ydEtleXMoam9iLndpdGgpO1xuICB9IGVsc2Uge1xuICAgIGRlbGV0ZSBqb2Iud2l0aDtcbiAgfVxuICBpZiAoT2JqZWN0LmtleXMoam9iLnNlY3JldHMpLmxlbmd0aCA+IDApIHtcbiAgICAvLyBNb3ZlIHNlY3JldHMgcHJvcCBhZnRlciB3aXRoIHByb3BcbiAgICBjb25zdCBuZXdTZWNyZXRzID0gc29ydEtleXMoam9iLnNlY3JldHMpO1xuICAgIGRlbGV0ZSBqb2Iuc2VjcmV0cztcbiAgICBqb2Iuc2VjcmV0cyA9IG5ld1NlY3JldHM7XG4gIH0gZWxzZSB7XG4gICAgZGVsZXRlIGpvYi5zZWNyZXRzO1xuICB9XG59XG5cbmZ1bmN0aW9uIGdlbmVyYXRlQXV0b2ZpeFdvcmtmbG93KGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFdvcmtmbG93IHtcbiAgaWYgKCFjb25maWcuaXNQdWJsaWNSZXBvKSB7XG4gICAgcmV0dXJuIHN0cnVjdHVyZWRDbG9uZShwcml2YXRlUmVwb0F1dG9maXhXb3JrZmxvdyk7XG4gIH1cblxuICBjb25zdCBwYWNrYWdlTWFuYWdlciA9IGNvbmZpZy5pc0J1biA/ICdidW4nIDogJ3lhcm4nO1xuICBjb25zdCBzdGVwczogU3RlcFtdID0gW1xuICAgIHsgdXNlczogJ2FjdGlvbnMvY2hlY2tvdXRAdjYnIH0sXG4gICAgeyB1c2VzOiAnYWN0aW9ucy9zZXR1cC1ub2RlQHY2Jywgd2l0aDogeyAnY2hlY2stbGF0ZXN0JzogdHJ1ZSwgJ25vZGUtdmVyc2lvbic6ICdsdHMvKicgfSB9LFxuICAgIC4uLihjb25maWcuaXNCdW4gPyBbeyB1c2VzOiAnb3Zlbi1zaC9zZXR1cC1idW5AdjInLCB3aXRoOiB7ICdidW4tdmVyc2lvbic6ICdsYXRlc3QnIH0gfV0gOiBbXSksXG4gICAgeyBydW46IGAke3BhY2thZ2VNYW5hZ2VyfSBpbnN0YWxsYCB9LFxuICAgIHsgcnVuOiBgJHtwYWNrYWdlTWFuYWdlcn0gcnVuIGNsZWFudXBgIH0sXG4gIF07XG4gIGlmIChjb25maWcucGFja2FnZUpzb24/LnNjcmlwdHM/LmJ1aWxkKSB7XG4gICAgc3RlcHMucHVzaCh7IHJ1bjogYCR7cGFja2FnZU1hbmFnZXJ9IHJ1biBidWlsZGAgfSk7XG4gIH1cbiAgc3RlcHMucHVzaCh7IHVzZXM6ICdhdXRvZml4LWNpL2FjdGlvbkB2MScgfSk7XG5cbiAgY29uc3QgYXV0b2ZpeFdvcmtmbG93ID0gc3RydWN0dXJlZENsb25lKHB1YmxpY1JlcG9BdXRvZml4V29ya2Zsb3cpO1xuICBjb25zdCBhdXRvZml4Sm9iID0gYXV0b2ZpeFdvcmtmbG93LmpvYnMuYXV0b2ZpeCA/PyB7ICdydW5zLW9uJzogJ3VidW50dS1sYXRlc3QnIH07XG4gIGF1dG9maXhXb3JrZmxvdy5qb2JzLmF1dG9maXggPSB7IC4uLmF1dG9maXhKb2IsIHN0ZXBzIH07XG4gIHJldHVybiBhdXRvZml4V29ya2Zsb3c7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHdyaXRlWWFtbChuZXdTZXR0aW5nczogV29ya2Zsb3csIGZpbGVQYXRoOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgeWFtbFRleHQgPSByZW1vdmVUcmFpbGluZ1NwYWNlcyhcbiAgICB5YW1sLmR1bXAobmV3U2V0dGluZ3MsIHsgbGluZVdpZHRoOiAtMSwgbm9Db21wYXRNb2RlOiB0cnVlLCBzdHlsZXM6IHsgJyEhbnVsbCc6ICdlbXB0eScgfSB9KVxuICApO1xuICBhd2FpdCBmcy5wcm9taXNlcy53cml0ZUZpbGUoZmlsZVBhdGgsIHlhbWxUZXh0KTtcbn1cblxuZnVuY3Rpb24gcmVtb3ZlVHJhaWxpbmdTcGFjZXModGV4dDogc3RyaW5nKTogc3RyaW5nIHtcbiAgLy8ganMteWFtbCBlbWl0cyB2YWx1ZWxlc3MgR2l0SHViIEFjdGlvbnMgZXZlbnRzIGFzIGBldmVudDogYCB3aGVuIHVzaW5nIHRoZSBlbXB0eSBudWxsIHN0eWxlLlxuICByZXR1cm4gdGV4dC5yZXBsYWNlQWxsKC9bIFxcdF0rJC9nbSwgJycpO1xufVxuIiwiaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IGZnIGZyb20gJ2Zhc3QtZ2xvYic7XG5cbmltcG9ydCB7IGlzUmV1c2FibGVXb3JrZmxvd3NSZXBvIH0gZnJvbSAnLi4vZ2VuZXJhdG9ycy93b3JrZmxvdy5qcyc7XG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHsgb3B0aW9ucyB9IGZyb20gJy4uL29wdGlvbnMuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBmc1V0aWwgfSBmcm9tICcuLi91dGlscy9mc1V0aWwuanMnO1xuaW1wb3J0IHsgZ2xvYklnbm9yZSB9IGZyb20gJy4uL3V0aWxzL2dsb2JVdGlsLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZml4VHlwb3MocGFja2FnZUNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2ZpeFR5cG9zJywgYXN5bmMgKCkgPT4ge1xuICAgIGlmIChpc1JldXNhYmxlV29ya2Zsb3dzUmVwbyhwYWNrYWdlQ29uZmlnLnJlcG9zaXRvcnkpKSByZXR1cm47XG5cbiAgICBjb25zdCBkaXJQYXRoID0gcGFja2FnZUNvbmZpZy5kaXJQYXRoO1xuICAgIGNvbnN0IGRvY0ZpbGVzID0gYXdhaXQgZmcuZ2xvYignKiovKi5tZCcsIHsgZG90OiB0cnVlLCBjd2Q6IGRpclBhdGgsIGlnbm9yZTogZ2xvYklnbm9yZSB9KTtcbiAgICBpZiAob3B0aW9ucy5pc1ZlcmJvc2UpIHtcbiAgICAgIGNvbnNvbGUuaW5mbyhgRm91bmQgJHtkb2NGaWxlcy5sZW5ndGh9IG1hcmtkb3duIGZpbGVzIGluICR7ZGlyUGF0aH1gKTtcbiAgICB9XG4gICAgZm9yIChjb25zdCBtZEZpbGUgb2YgZG9jRmlsZXMpIHtcbiAgICAgIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5qb2luKGRpclBhdGgsIG1kRmlsZSk7XG4gICAgICB2b2lkIHByb21pc2VQb29sLnJ1bihhc3luYyAoKSA9PiB7XG4gICAgICAgIGNvbnN0IGNvbnRlbnQgPSBhd2FpdCBmc1V0aWwucmVhZEZpbGVJZ25vcmluZ0Vycm9yKGZpbGVQYXRoKTtcbiAgICAgICAgaWYgKGNvbnRlbnQgPT09IHVuZGVmaW5lZCkgcmV0dXJuO1xuICAgICAgICBsZXQgbmV3Q29udGVudCA9IGZpeFR5cG9zSW5UZXh0KGNvbnRlbnQpO1xuICAgICAgICBuZXdDb250ZW50ID0gcmVwbGFjZVdpdGhDb25maWcobmV3Q29udGVudCwgcGFja2FnZUNvbmZpZywgJ2RvYycpO1xuICAgICAgICBpZiAoY29udGVudCAhPT0gbmV3Q29udGVudCkge1xuICAgICAgICAgIGF3YWl0IGZzVXRpbC5nZW5lcmF0ZUZpbGUoZmlsZVBhdGgsIG5ld0NvbnRlbnQpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBjb25zdCB0c0ZpbGVzID0gYXdhaXQgZmcuZ2xvYihcbiAgICAgIFtcbiAgICAgICAgJ3thcHAsc3JjLHRlc3Qsc2NyaXB0c30vKiovKi57Y2pzLG1qcyxqcyxqc3gsY3RzLG10cyx0cyx0c3h9JyxcbiAgICAgICAgJ3BhY2thZ2VzLyoqL3thcHAsc3JjLHRlc3Qsc2NyaXB0c30vKiovKi57Y2pzLG1qcyxqcyxqc3gsY3RzLG10cyx0cyx0c3h9JyxcbiAgICAgIF0sXG4gICAgICB7IGRvdDogdHJ1ZSwgY3dkOiBkaXJQYXRoLCBpZ25vcmU6IGdsb2JJZ25vcmUgfVxuICAgICk7XG4gICAgaWYgKG9wdGlvbnMuaXNWZXJib3NlKSB7XG4gICAgICBjb25zb2xlLmluZm8oYEZvdW5kICR7dHNGaWxlcy5sZW5ndGh9IFR5cGVTY3JpcHQgZmlsZXMgaW4gJHtkaXJQYXRofWApO1xuICAgIH1cbiAgICBmb3IgKGNvbnN0IHRzRmlsZSBvZiB0c0ZpbGVzKSB7XG4gICAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGguam9pbihkaXJQYXRoLCB0c0ZpbGUpO1xuICAgICAgdm9pZCBwcm9taXNlUG9vbC5ydW4oYXN5bmMgKCkgPT4ge1xuICAgICAgICBjb25zdCBvbGRDb250ZW50ID0gYXdhaXQgZnNVdGlsLnJlYWRGaWxlSWdub3JpbmdFcnJvcihmaWxlUGF0aCk7XG4gICAgICAgIGlmIChvbGRDb250ZW50ID09PSB1bmRlZmluZWQpIHJldHVybjtcbiAgICAgICAgbGV0IG5ld0NvbnRlbnQgPSBmaXhUeXBvc0luQ29kZShvbGRDb250ZW50KTtcbiAgICAgICAgbmV3Q29udGVudCA9IHJlcGxhY2VXaXRoQ29uZmlnKG5ld0NvbnRlbnQsIHBhY2thZ2VDb25maWcsICd0cycpO1xuXG4gICAgICAgIGlmIChvbGRDb250ZW50ICE9PSBuZXdDb250ZW50KSB7XG4gICAgICAgICAgYXdhaXQgZnNVdGlsLmdlbmVyYXRlRmlsZShmaWxlUGF0aCwgbmV3Q29udGVudCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGNvbnN0IHRleHRCYXNlZEZpbGVzID0gYXdhaXQgZmcuZ2xvYignKiovKi57Y3N2LGh0bSxodG1sLHRzdix4bWwseWFtbCx5bWx9Jywge1xuICAgICAgZG90OiB0cnVlLFxuICAgICAgY3dkOiBkaXJQYXRoLFxuICAgICAgaWdub3JlOiBnbG9iSWdub3JlLFxuICAgIH0pO1xuICAgIGlmIChvcHRpb25zLmlzVmVyYm9zZSkge1xuICAgICAgY29uc29sZS5pbmZvKGBGb3VuZCAke3RleHRCYXNlZEZpbGVzLmxlbmd0aH0gdGV4dC1iYXNlZCBmaWxlcyBpbiAke2RpclBhdGh9YCk7XG4gICAgfVxuICAgIGZvciAoY29uc3QgZmlsZSBvZiB0ZXh0QmFzZWRGaWxlcykge1xuICAgICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLmpvaW4oZGlyUGF0aCwgZmlsZSk7XG4gICAgICB2b2lkIHByb21pc2VQb29sLnJ1bihhc3luYyAoKSA9PiB7XG4gICAgICAgIGNvbnN0IG9sZENvbnRlbnQgPSBhd2FpdCBmc1V0aWwucmVhZEZpbGVJZ25vcmluZ0Vycm9yKGZpbGVQYXRoKTtcbiAgICAgICAgaWYgKG9sZENvbnRlbnQgPT09IHVuZGVmaW5lZCkgcmV0dXJuO1xuICAgICAgICBsZXQgbmV3Q29udGVudCA9IGZpeFR5cG9zSW5UZXh0KG9sZENvbnRlbnQpO1xuICAgICAgICBuZXdDb250ZW50ID0gcmVwbGFjZVdpdGhDb25maWcobmV3Q29udGVudCwgcGFja2FnZUNvbmZpZywgJ3RleHQnKTtcblxuICAgICAgICBpZiAob2xkQ29udGVudCAhPT0gbmV3Q29udGVudCkge1xuICAgICAgICAgIGF3YWl0IGZzVXRpbC5nZW5lcmF0ZUZpbGUoZmlsZVBhdGgsIG5ld0NvbnRlbnQpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBhd2FpdCBwcm9taXNlUG9vbC5wcm9taXNlQWxsKCk7XG4gIH0pO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZml4VHlwb3NJblRleHQoY29udGVudDogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIGNvbnRlbnRcbiAgICAucmVwbGFjZUFsbCgvXFxiY1xcLmZcXC4oPz1cXHN8JCkvZywgJ2NmLicpXG4gICAgLnJlcGxhY2VBbGwoL1xcYmVnXFwuKD89XFxzfCQpL2csICdlLmcuJylcbiAgICAucmVwbGFjZUFsbCgvXFxiaWVcXC4oPz1cXHMpL2csICdpLmUuJyk7XG59XG5cbmZ1bmN0aW9uIGZpeFR5cG9zSW5Db2RlKGNvbnRlbnQ6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiBjb250ZW50XG4gICAgLnJlcGxhY2VBbGwoL1xcL1xcKltcXHNcXFNdKj9cXCpcXC8vZywgKGNvbW1lbnQpID0+IGZpeFR5cG9zSW5UZXh0KGNvbW1lbnQpKVxuICAgIC5yZXBsYWNlQWxsKC8oXnxcXHMpXFwvXFwvKC4qPyljXFwuZlxcLi9nLCAnJDEvLyQyY2YuJylcbiAgICAucmVwbGFjZUFsbCgvKF58XFxzKVxcL1xcLyguKj8pZWdcXC4vZywgJyQxLy8kMmUuZy4nKVxuICAgIC5yZXBsYWNlQWxsKC8oXnxcXHMpXFwvXFwvKC4qPylpZVxcLi9nLCAnJDEvLyQyaS5lLicpO1xufVxuXG5mdW5jdGlvbiByZXBsYWNlV2l0aENvbmZpZyhuZXdDb250ZW50OiBzdHJpbmcsIHBhY2thZ2VDb25maWc6IFBhY2thZ2VDb25maWcsIHByb3BOYW1lOiAnZG9jJyB8ICd0cycgfCAndGV4dCcpOiBzdHJpbmcge1xuICBmb3IgKGNvbnN0IFtiZWZvcmUsIGFmdGVyXSBvZiBPYmplY3QuZW50cmllcyhwYWNrYWdlQ29uZmlnLndiZnlKc29uPy50eXBvcz8uYWxsID8/IHt9KSkge1xuICAgIG5ld0NvbnRlbnQgPSBuZXdDb250ZW50LnJlcGxhY2VBbGwoYmVmb3JlLCBhZnRlcik7XG4gIH1cbiAgZm9yIChjb25zdCBbYmVmb3JlLCBhZnRlcl0gb2YgT2JqZWN0LmVudHJpZXMocGFja2FnZUNvbmZpZy53YmZ5SnNvbj8udHlwb3M/Lltwcm9wTmFtZV0gPz8ge30pKSB7XG4gICAgbmV3Q29udGVudCA9IG5ld0NvbnRlbnQucmVwbGFjZUFsbChiZWZvcmUsIGFmdGVyKTtcbiAgfVxuICByZXR1cm4gbmV3Q29udGVudDtcbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzL3Byb21pc2VzJztcblxuaW1wb3J0IGZnIGZyb20gJ2Zhc3QtZ2xvYic7XG5cbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZnNVdGlsIH0gZnJvbSAnLi4vdXRpbHMvZnNVdGlsLmpzJztcbmltcG9ydCB7IGdsb2JJZ25vcmUgfSBmcm9tICcuLi91dGlscy9nbG9iVXRpbC5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcblxuY29uc3Qgb2xkQ29tbWFuZCA9ICd3YiBwcmlzbWEnO1xuY29uc3QgbmV3Q29tbWFuZCA9ICd3YiBkYic7XG5jb25zdCBtYXhUZXh0RmlsZUJ5dGVzID0gMTAyNCAqIDEwMjQ7XG5jb25zdCBtaWdyYXRpb25UYXJnZXRzID0gW1xuICAnKiovKi57Y2pzLGN0cyxqcyxqc29uLGpzeCxtZCxtZGMsbWpzLG10cyxzaCx0c3gsdHMsdG9tbCx0eHQseWFtbCx5bWx9JyxcbiAgJyoqLy5lbnYnLFxuICAnKiovLmVudi4qJyxcbiAgJyoqLy5naXRodWIvd29ya2Zsb3dzLyonLFxuICAnKiovLmdpdGlnbm9yZScsXG4gICcqKi8uZG9ja2VyaWdub3JlJyxcbiAgJyoqL0RvY2tlcmZpbGUnLFxuICAnKiovRG9ja2VyZmlsZS4qJyxcbiAgJyoqL01ha2VmaWxlJyxcbiAgJyoqL21pc2UudG9tbCcsXG4gICcqKi8ubWlzZS50b21sJyxcbiAgJyoqL2xlZnRob29rLnltbCcsXG4gICcqKi9wYWNrYWdlLmpzb24nLFxuXTtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGZpeFdiRGJDb21tYW5kKHJvb3RDb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgaWYgKHJvb3RDb25maWcucmVwb0F1dGhvciA9PT0gJ1dpbGxCb29zdGVyJyAmJiByb290Q29uZmlnLnJlcG9OYW1lID09PSAnc2hhcmVkJykgcmV0dXJuO1xuXG4gIGNvbnN0IGZpbGVQYXRocyA9IGF3YWl0IGZnKG1pZ3JhdGlvblRhcmdldHMsIHtcbiAgICBhYnNvbHV0ZTogdHJ1ZSxcbiAgICBjd2Q6IHJvb3RDb25maWcuZGlyUGF0aCxcbiAgICBkb3Q6IHRydWUsXG4gICAgaWdub3JlOiBbJyoqLy5naXQvKionLCAuLi5nbG9iSWdub3JlXSxcbiAgICBvbmx5RmlsZXM6IHRydWUsXG4gIH0pO1xuXG4gIGF3YWl0IFByb21pc2UuYWxsKGZpbGVQYXRocy5tYXAoKGZpbGVQYXRoKSA9PiBwcm9taXNlUG9vbC5ydW4oKCkgPT4gcmVwbGFjZVdiUHJpc21hQ29tbWFuZChmaWxlUGF0aCkpKSk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHJlcGxhY2VXYlByaXNtYUNvbW1hbmQoZmlsZVBhdGg6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBjb250ZW50ID0gYXdhaXQgcmVhZFRleHRGaWxlKGZpbGVQYXRoKTtcbiAgaWYgKCFjb250ZW50Py5pbmNsdWRlcyhvbGRDb21tYW5kKSkgcmV0dXJuO1xuXG4gIC8vIFRlbXBvcmFyeSBtaWdyYXRpb246IHJlbW92ZSB0aGlzIGZpeGVyIGFmdGVyIGFsbCByZXBvc2l0b3JpZXMgaGF2ZSBiZWVuXG4gIC8vIG1pZ3JhdGVkIGZyb20gdGhlIGxlZ2FjeSBgd2IgcHJpc21hYCBzcGVsbGluZyB0byBgd2IgZGJgLlxuICBhd2FpdCBmc1V0aWwuZ2VuZXJhdGVGaWxlKGZpbGVQYXRoLCBjb250ZW50LnJlcGxhY2VBbGwob2xkQ29tbWFuZCwgbmV3Q29tbWFuZCkpO1xufVxuXG5hc3luYyBmdW5jdGlvbiByZWFkVGV4dEZpbGUoZmlsZVBhdGg6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nIHwgdW5kZWZpbmVkPiB7XG4gIGNvbnN0IHN0YXRzID0gYXdhaXQgZnMuc3RhdChmaWxlUGF0aCk7XG4gIGlmIChzdGF0cy5zaXplID4gbWF4VGV4dEZpbGVCeXRlcykgcmV0dXJuIHVuZGVmaW5lZDtcblxuICBjb25zdCBidWZmZXIgPSBhd2FpdCBmcy5yZWFkRmlsZShmaWxlUGF0aCk7XG4gIGlmIChidWZmZXIuaW5jbHVkZXMoMCkpIHJldHVybiB1bmRlZmluZWQ7XG5cbiAgcmV0dXJuIGJ1ZmZlci50b1N0cmluZygndXRmOCcpO1xufVxuIiwiaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZnNVdGlsIH0gZnJvbSAnLi4vdXRpbHMvZnNVdGlsLmpzJztcbmltcG9ydCB7IGdldFBhY2thZ2VNYW5hZ2VyQ29tbWFuZCB9IGZyb20gJy4uL3V0aWxzL3BhY2thZ2VDYXBhYmlsaXRpZXMuanMnO1xuaW1wb3J0IHsgcHJvbWlzZVBvb2wgfSBmcm9tICcuLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZW5lcmF0ZUFnZW50SW5zdHJ1Y3Rpb25zKHJvb3RDb25maWc6IFBhY2thZ2VDb25maWcsIGFsbENvbmZpZ3M6IFBhY2thZ2VDb25maWdbXSk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2dlbmVyYXRlQWdlbnRJbnN0cnVjdGlvbnMnLCBhc3luYyAoKSA9PiB7XG4gICAgaWYgKCFyb290Q29uZmlnLmlzUm9vdCkgcmV0dXJuO1xuXG4gICAgLy8gQ2hlY2sgaWYgQUdFTlRTX0VYVFJBLm1kIGV4aXN0cyBhbmQgcmVhZCBpdHMgY29udGVudFxuICAgIGNvbnN0IGFnZW50c0V4dHJhUGF0aCA9IHBhdGgucmVzb2x2ZShyb290Q29uZmlnLmRpclBhdGgsICdBR0VOVFNfRVhUUkEubWQnKTtcbiAgICBjb25zdCBleHRyYUNvbnRlbnQgPSBhd2FpdCBmc1V0aWwucmVhZEZpbGVJZ25vcmluZ0Vycm9yKGFnZW50c0V4dHJhUGF0aCk7XG5cbiAgICBmb3IgKGNvbnN0IFtmaWxlTmFtZSwgdG9vbE5hbWVdIG9mIFtcbiAgICAgIFsnQUdFTlRTLm1kJywgJ0NvZGV4IENMSSddLFxuICAgICAgWydDTEFVREUubWQnLCAnQ2xhdWRlIENvZGUnXSxcbiAgICAgIFsnR0VNSU5JLm1kJywgJ0dlbWluaSBDTEknXSxcbiAgICBdIGFzIGNvbnN0KSB7XG4gICAgICBjb25zdCBjb250ZW50ID0gZ2VuZXJhdGVBZ2VudEluc3RydWN0aW9uKHJvb3RDb25maWcsIGFsbENvbmZpZ3MsIHRvb2xOYW1lLCBleHRyYUNvbnRlbnQpO1xuICAgICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLnJlc29sdmUocm9vdENvbmZpZy5kaXJQYXRoLCBmaWxlTmFtZSk7XG4gICAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnNVdGlsLmdlbmVyYXRlRmlsZShmaWxlUGF0aCwgY29udGVudCkpO1xuICAgIH1cblxuICAgIGNvbnN0IGN1cnNvclJ1bGVzUGF0aCA9IHBhdGgucmVzb2x2ZShyb290Q29uZmlnLmRpclBhdGgsICcuY3Vyc29yL3J1bGVzL2dlbmVyYWwubWRjJyk7XG4gICAgY29uc3QgY3Vyc29yUnVsZXNDb250ZW50ID0gZ2VuZXJhdGVDdXJzb3JHZW5lcmFsTWRjQ29udGVudChyb290Q29uZmlnLCBhbGxDb25maWdzLCBleHRyYUNvbnRlbnQpO1xuICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiBmc1V0aWwuZ2VuZXJhdGVGaWxlKGN1cnNvclJ1bGVzUGF0aCwgY3Vyc29yUnVsZXNDb250ZW50KSk7XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBnZW5lcmF0ZUN1cnNvckdlbmVyYWxNZGNDb250ZW50KFxuICBjb25maWc6IFBhY2thZ2VDb25maWcsXG4gIGFsbENvbmZpZ3M6IFBhY2thZ2VDb25maWdbXSxcbiAgZXh0cmFDb250ZW50Pzogc3RyaW5nXG4pOiBzdHJpbmcge1xuICBjb25zdCBmcm9udG1hdHRlciA9IGAtLS1cXG5kZXNjcmlwdGlvbjogR2VuZXJhbCBDb2RpbmcgUnVsZXNcXG5nbG9iczpcXG5hbHdheXNBcHBseTogdHJ1ZVxcbi0tLWA7XG4gIGNvbnN0IGJvZHkgPSBnZW5lcmF0ZUFnZW50SW5zdHJ1Y3Rpb24oY29uZmlnLCBhbGxDb25maWdzLCAnQ3Vyc29yJywgZXh0cmFDb250ZW50KTtcbiAgcmV0dXJuIGAke2Zyb250bWF0dGVyfVxcblxcbiR7Ym9keX1gO1xufVxuXG5mdW5jdGlvbiBnZW5lcmF0ZUFnZW50SW5zdHJ1Y3Rpb24oXG4gIHJvb3RDb25maWc6IFBhY2thZ2VDb25maWcsXG4gIGFsbENvbmZpZ3M6IFBhY2thZ2VDb25maWdbXSxcbiAgdG9vbE5hbWU6IHN0cmluZyxcbiAgZXh0cmFDb250ZW50Pzogc3RyaW5nXG4pOiBzdHJpbmcge1xuICBjb25zdCBwYWNrYWdlTWFuYWdlciA9IGdldFBhY2thZ2VNYW5hZ2VyQ29tbWFuZChyb290Q29uZmlnKTtcbiAgY29uc3QgYmFzZUNvbnRlbnQgPSBgXG4jIyBQcm9qZWN0IEluZm9ybWF0aW9uXG5cbi0gTmFtZTogXFxgJHtyb290Q29uZmlnLnBhY2thZ2VKc29uPy5uYW1lIHx8ICd1bmtub3duJ31cXGBcbi0gRGVzY3JpcHRpb246ICR7cm9vdENvbmZpZy5wYWNrYWdlSnNvbj8uZGVzY3JpcHRpb259XG4tIFBhY2thZ2UgTWFuYWdlcjogJHtwYWNrYWdlTWFuYWdlcn1cblxuIyMgR2VuZXJhbCBJbnN0cnVjdGlvbnNcblxuLSBDcmVhdGUgYSBuZXcgYnJhbmNoIGlmIHRoZSBjdXJyZW50IGJyYW5jaCBpcyBcXGBtYWluXFxgLlxuLSBSdW4gYW55IFxcYGdpdFxcYCBjb21tYW5kcyBzZXF1ZW50aWFsbHkuXG4tIFdyaXRlIHRlc3RzIE9OTFkgaWYgZXhwbGljaXRseSByZXF1ZXN0ZWQuIElmIHJlcXVlc3RlZCwgZm9sbG93IHRoZXNlIHJ1bGVzOlxuICAtIENvbnRpbnVlIG1vZGlmeWluZyB0ZXN0cyBhbmQvb3IgY29kZSB1bnRpbCBhbGwgdGVzdHMgcGFzcy5cbiAgLSBFbnN1cmUgdGVzdHMgYXJlIGlkZW1wb3RlbnQgYW5kIGluZGVwZW5kZW50IChlLmcuLCByZXNldCBwZXJzaXN0ZW50IGRhdGEpIHNvIHRoZXkgY2FuIHJ1biByZXBlYXRlZGx5IG9yIGluIHBhcmFsbGVsLlxuICAtIFByZWZlciBhY3R1YWwgQVBJIGNhbGxzIG92ZXIgbW9ja3MsIHVubGVzcyBhY3R1YWwgY2FsbHMgYXJlIGltcHJhY3RpY2FsLCBoYXZlIHVuaW50ZW5kZWQgc2lkZSBlZmZlY3RzLCBvciBtb2NrcyBhcmUgZXhwbGljaXRseSByZXF1ZXN0ZWQuXG4gIC0gQWx3YXlzIGludmVzdGlnYXRlIHRoZSByb290IGNhdXNlIG9mIGEgdGVzdCBmYWlsdXJlIGJlZm9yZSBmaXhpbmcgaXQuXG4gIC0gQXZvaWQgYWRkaW5nIHdhaXQgZnVuY3Rpb25zIGluIEUyRSB0ZXN0cyB1bmxlc3Mgc3RyaWN0bHkgbmVjZXNzYXJ5LlxuLSBXaGVuIGZpeGluZyBpc3N1ZXMsIGZvbGxvdyB0aGVzZSBydWxlczpcbiAgLSBJbnZlc3RpZ2F0ZSB0aGUgcm9vdCBjYXVzZSBmaXJzdCAoZS5nLiwgYnkgZ2F0aGVyaW5nIGRlYnVnIGxvZ3MsIHRha2luZyBzY3JlZW5zaG90cywgZXRjLikuXG4gIC0gRml4IHRoZSBhY3R1YWwgcm9vdCBjYXVzZSBpbnN0ZWFkIG9mIGFwcGx5aW5nIHdvcmthcm91bmRzLlxuLSBBZnRlciBtYWtpbmcgY29kZSBjaGFuZ2VzLCBydW4gXFxgJHtwYWNrYWdlTWFuYWdlcn0gdmVyaWZ5LWZ1bGxcXGAgdG8gZXhlY3V0ZSBhbGwgdGVzdHMgKHRha2VzIHVwIHRvIDEgaG91ciksIG9yIFxcYCR7cGFja2FnZU1hbmFnZXJ9IHZlcmlmeVxcYCBmb3Igb25seSB0eXBlIGNoZWNraW5nIGFuZCBsaW50aW5nICh0YWtlcyB1cCB0byAxMCBtaW51dGVzKS5cbiAgLSBJZiB5b3UgYXJlIGNvbmZpZGVudCB0aGF0IHlvdXIgY2hhbmdlcyB3aWxsIG5vdCBicmVhayBhbnkgdGVzdHMsIHlvdSBtYXkgdXNlIFxcYHZlcmlmeVxcYC5cbiAgLSBVc2UgXFxgb3hsaW50XFxgIGlnbm9yZSBjb21tZW50cyB3aXRoIHJlYXNvbnMgKGUuZy4sIFxcYC8vIG94bGludC1kaXNhYmxlLW5leHQtbGluZSA8cnVsZT4gLS0gPHJlYXNvbj5cXGApIGlmIGxpbnQgZXJyb3JzIG9yIHdhcm5pbmdzIGNhbm5vdCBiZSBmaXhlZC5cbi0gT25jZSB5b3UgaGF2ZSB2ZXJpZmllZCB5b3VyIGNoYW5nZXMsIGNvbW1pdCBhbmQgcHVzaCB0aGVtIHRvIHRoZSBjdXJyZW50IChub24tbWFpbikgYnJhbmNoLCB0aGVuIGNyZWF0ZSBhIFBSIHZpYSBcXGBnaFxcYC5cbiAgLSBGb2xsb3cgdGhlIGNvbnZlbnRpb25hbCBjb21taXRzOyB5b3VyIGNvbW1pdCBtZXNzYWdlIHNob3VsZCBzdGFydCB3aXRoIFxcYGZlYXQ6XFxgLCBcXGBmaXg6XFxgLCBldGMuXG4gIC0gSWYgbm90IHNwZWNpZmllZCwgbWFrZSBzdXJlIHRvIGFkZCBhIG5ldyBsaW5lIGF0IHRoZSBlbmQgb2YgeW91ciBjb21taXQgbWVzc2FnZSR7cm9vdENvbmZpZy5pc1dpbGxCb29zdGVyUmVwbyA/IGAgd2l0aDogXFxgQ28tYXV0aG9yZWQtYnk6IFdpbGxCb29zdGVyICgke3Rvb2xOYW1lfSkgPGFnZW50QHdpbGxib29zdGVyLmNvbT5cXGBgIDogJyd9LlxuICAtIEFsd2F5cyBjcmVhdGUgbmV3IGNvbW1pdHMuIEF2b2lkIHVzaW5nIFxcYC0tYW1lbmRcXGAuXG4tIEFsd2F5cyB1c2UgaGVyZWRvYyBzeW50YXggd2hlbiBwYXNzaW5nIG11bHRpLWxpbmUgY29udGVudCB0byBhbnkgY29tbWFuZC5cbi0gUHV0IHRlbXBvcmFyeSBmaWxlcyBpbiB0aGUgXFxgLnRtcFxcYCBvciBcXGAvdG1wXFxgIGRpcmVjdG9yeS5cbiR7aGFzUGxheXdyaWdodFRlc3RTZXJ2ZXIoYWxsQ29uZmlncykgPyBgLSBVc2UgXFxgJHtwYWNrYWdlTWFuYWdlcn0gd2Igc3RhcnQgLS1tb2RlIHRlc3RcXGAgdG8gbGF1bmNoIGEgd2ViIHNlcnZlciBmb3IgZGVidWdnaW5nIG9yIHRlc3RpbmcuYCA6ICcnfVxuXG4ke2dlbmVyYXRlQWdlbnRDb2RpbmdTdHlsZShhbGxDb25maWdzKX1cbmBcbiAgICAucmVwbGFjZUFsbCgvXFwuXFxuXFxuKy0vZywgJy5cXG4tJylcbiAgICAucmVwbGFjZUFsbCgvXFxuezMsfS9nLCAnXFxuXFxuJylcbiAgICAudHJpbSgpO1xuXG4gIGNvbnN0IGhhc05ld1NlY3Rpb24gPSBleHRyYUNvbnRlbnQ/LnRyaW0oKS5zdGFydHNXaXRoKCcjJyk7XG4gIGNvbnN0IG5vcm1hbGl6ZWRFeHRyYUNvbnRlbnQgPSBleHRyYUNvbnRlbnRcbiAgICA/IGhhc05ld1NlY3Rpb25cbiAgICAgID8gJ1xcblxcbicgKyBleHRyYUNvbnRlbnQudHJpbSgpXG4gICAgICA6ICdcXG4nICsgZXh0cmFDb250ZW50XG4gICAgOiAnJztcbiAgcmV0dXJuIGJhc2VDb250ZW50ICsgbm9ybWFsaXplZEV4dHJhQ29udGVudDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdlbmVyYXRlQWdlbnRDb2RpbmdTdHlsZShhbGxDb25maWdzOiBQYWNrYWdlQ29uZmlnW10pOiBzdHJpbmcge1xuICAvLyBLZWVwIHRvcC1kb3duIG9yZGVyaW5nIGd1aWRhbmNlIGZ1bmN0aW9uLW9ubHkgYmVjYXVzZSBjbGFzc2VzIGFyZSBub3QgaG9pc3RlZCBhbmQgY2FuIGZhaWwgd2hlbiBpbmhlcml0YW5jZSBvciB0b3AtbGV2ZWwgaW5zdGFudGlhdGlvbiBkZXBlbmRzIG9uIGRlY2xhcmF0aW9uIG9yZGVyLlxuICByZXR1cm4gYFxuIyMgQ29kaW5nIFN0eWxlXG5cbi0gVXNlIGNhbWVsQ2FzZSBmb3IgSmF2YVNjcmlwdCBhbmQgVHlwZVNjcmlwdCBmaWxlcyAob3IgUGFzY2FsQ2FzZSBmb3IgUmVhY3QgY29tcG9uZW50cykuXG4tIFNpbXBsaWZ5IGNvZGUgYXMgbXVjaCBhcyBwb3NzaWJsZSB0byBlbGltaW5hdGUgcmVkdW5kYW5jeS5cbi0gRGVzaWduIGVhY2ggbW9kdWxlIHdpdGggaGlnaCBjb2hlc2lvbiwgZ3JvdXBpbmcgcmVsYXRlZCBmdW5jdGlvbmFsaXR5IHRvZ2V0aGVyLlxuICAtIFJlZmFjdG9yIGV4aXN0aW5nIGxhcmdlIG1vZHVsZXMgaW50byBzbWFsbGVyLCBmb2N1c2VkIG1vZHVsZXMgd2hlbiBuZWNlc3NhcnkuXG4gIC0gQ3JlYXRlIHdlbGwtb3JnYW5pemVkIGRpcmVjdG9yeSBzdHJ1Y3R1cmVzIHdpdGggbG93IGNvdXBsaW5nIGFuZCBoaWdoIGNvaGVzaW9uLlxuLSBQbGFjZSBjYWxsaW5nIGZ1bmN0aW9ucyBhYm92ZSB0aGUgZnVuY3Rpb25zIHRoZXkgY2FsbCB0byBtYWludGFpbiBhIGNsZWFyIHRvcC1kb3duIG9yZGVyLlxuICAtIGUuZy4sIFxcYGZ1bmN0aW9uIGNhbGxlcigpIHsgY2FsbGVlKCk7IH0gZnVuY3Rpb24gY2FsbGVlKCkgeyAuLi4gfVxcYFxuICAtIFVubGlrZSBmdW5jdGlvbnMsIHBsYWNlIHZhcmlhYmxlIGFuZCB0eXBlIGRlY2xhcmF0aW9ucyBBQk9WRSB0aGVpciB1c2FnZS5cbi0gV3JpdGUgY29tbWVudHMgYW5kIEpTRG9jIGZvciBjb21wbGV4IG9yIGhhcmQtdG8tdW5kZXJzdGFuZCBjb2RlLlxuICAtIEV4cGxhaW4gXCJ3aHlcIiBpbiBjb21tZW50cyBhbmQgXCJ3aGF0XCIgaW4gSlNEb2MuXG4gIC0gQXZvaWQgc3RhdGluZyB3aGF0IGNhbiBiZSBlYXNpbHkgdW5kZXJzdG9vZCBmcm9tIHRoZSBjb2RlIGl0c2VsZi5cbi0gUHJlZmVyIFxcYHVuZGVmaW5lZFxcYCBvdmVyIFxcYG51bGxcXGAgdW5sZXNzIGV4cGxpY2l0bHkgcmVxdWlyZWQgYnkgQVBJcyBvciBsaWJyYXJpZXMuXG4tIFByZWZlciB1c2luZyBhIHNpbmdsZSB0ZW1wbGF0ZSBsaXRlcmFsIGZvciBwcm9tcHRzIGluc3RlYWQgb2YgXFxgam9pbigpXFxgIHdpdGggYSBwcmUtY29tcHV0YWJsZSBhcnJheSBsaXRlcmFsIG9mIHN0cmluZ3MuXG4tIEFzc3VtZSB0aGF0IGFsbCBlbnZpcm9ubWVudCB2YXJpYWJsZXMgYXJlIHByb3Blcmx5IGRlZmluZWQuXG4gIC0gSWYgdmFsaWRhdGlvbiBpcyByZXF1aXJlZCwgdXNlIFxcYGFzc2VydFxcYCB0byBmYWlsIGZhc3QgKGUuZy4sIGR1cmluZyBzdGFydHVwKS5cbiR7XG4gIGFsbENvbmZpZ3Muc29tZSgoYykgPT4gYy5kZXBlbmRpbmcuZ2VuSTE4blRzKVxuICAgID8gYC0gV2hlbiBpbnRyb2R1Y2luZyBuZXcgc3RyaW5nIGxpdGVyYWxzIGluIFJlYWN0IGNvbXBvbmVudHMsIHVwZGF0ZSB0aGUgbGFuZ3VhZ2UgcmVzb3VyY2UgZmlsZXMgaW4gdGhlIFxcYGkxOG5cXGAgZGlyZWN0b3J5IChlLmcuLCBcXGBpMThuL2phLUpQLmpzb25cXGApLiBSZWZlcmVuY2UgdGhlc2Ugc3RyaW5ncyB1c2luZyB0aGUgXFxgaTE4blxcYCB1dGlsaXR5LiBGb3IgZXhhbXBsZSwgdXNlIFxcYGkxOG4ucGFnZXMuaG9tZS50aXRsZSgpXFxgIGZvciBcXGB7IFwicGFnZXNcIjogeyBcImhvbWVcIjogeyBcInRpdGxlXCI6IFwiTXkgQXBwXCIgfSB9IH1cXGAuYFxuICAgIDogJydcbn1cblxuJHtcbiAgYWxsQ29uZmlncy5zb21lKChjKSA9PiBjLmRlcGVuZGluZy5yZWFjdCB8fCBjLmRlcGVuZGluZy5uZXh0KVxuICAgID8gYC0gUHJlZmVyIGxhbWJkYSBvdmVyIFxcYGZ1bmN0aW9uXFxgIGZvciBSZWFjdCBjb21wb25lbnRzLCBlLmcuLCBcXGBjb25zdCBCdXR0b246IFJlYWN0LkZDID0gKCkgPT4ge1xcYC5cbi0gUHJlZmVyIFxcYHVzZUltbWVyXFxgIGZvciBzdG9yaW5nIGFuIGFycmF5IG9yIGFuIG9iamVjdCB0byBcXGB1c2VTdGF0ZVxcYC5cbi0gQWxsb3cgXFxgYXV0b0ZvY3VzXFxgIHRvIG1pbmltaXplIHVzZXIgZWZmb3J0LmBcbiAgICA6ICcnXG59XG4ke1xuICBhbGxDb25maWdzLnNvbWUoKGMpID0+IGMuZGVwZW5kaW5nLm5leHQpXG4gICAgPyBgXG4tIFNpbmNlIHRoaXMgcHJvamVjdCB1c2VzIHRoZSBSZWFjdCBDb21waWxlciwgeW91IGRvIG5vdCBuZWVkIHRvIHVzZSBcXGB1c2VDYWxsYmFja1xcYCBvciBcXGB1c2VNZW1vXFxgIGZvciBwZXJmb3JtYW5jZSBvcHRpbWl6YXRpb24uXG4tIEFzc3VtZSB0aGVyZSBpcyBvbmx5IGEgc2luZ2xlIHNlcnZlciBpbnN0YW5jZS5cbmBcbiAgICA6ICcnXG59XG5gXG4gICAgLnJlcGxhY2VBbGwoL1xcLlxcblxcbistL2csICcuXFxuLScpXG4gICAgLnJlcGxhY2VBbGwoL1xcbnszLH0vZywgJ1xcblxcbicpXG4gICAgLnRyaW0oKTtcbn1cblxuZnVuY3Rpb24gaGFzUGxheXdyaWdodFRlc3RTZXJ2ZXIoY29uZmlnczogUGFja2FnZUNvbmZpZ1tdKTogYm9vbGVhbiB7XG4gIHJldHVybiBjb25maWdzLnNvbWUoKGNvbmZpZykgPT4gY29uZmlnLmRlcGVuZGluZy5wbGF5d3JpZ2h0VGVzdCk7XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgeyBwYXJzZSB9IGZyb20gJ3Ntb2wtdG9tbCc7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGZzVXRpbCB9IGZyb20gJy4uL3V0aWxzL2ZzVXRpbC5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcblxuaW50ZXJmYWNlIEJ1bmZpZ1RvbWwge1xuICBpbnN0YWxsPzoge1xuICAgIGV4YWN0PzogYm9vbGVhbjtcbiAgfTtcbiAgcnVuPzoge1xuICAgIGJ1bj86IGJvb2xlYW47XG4gIH07XG59XG5cbmNvbnN0IG1pbmltdW1SZWxlYXNlQWdlRXhjbHVkZXMgPSBbXG4gIC8vIC0tLS0tLS0tLS0gU1RBUlQ6IFdlIGJlbGlldmUgb3VyIHBhY2thZ2VzIGFyZSBzYWZlIC0tLS0tLS0tLS1cbiAgJ0BleGVyY29kZS9wcm9ibGVtLXV0aWxzJyxcbiAgJ0B3aWxsYm9vc3Rlci9hZ2VudC1za2lsbHMnLFxuICAnQHdpbGxib29zdGVyL2JhYmVsLWNvbmZpZ3MnLFxuICAnQHdpbGxib29zdGVyL21vbmFjby1sb2FkZXInLFxuICAnQHdpbGxib29zdGVyL21vbmFjby1yZWFjdCcsXG4gICdAd2lsbGJvb3N0ZXIvb3hmbXQtY29uZmlnJyxcbiAgJ0B3aWxsYm9vc3Rlci9veGxpbnQtY29uZmlnJyxcbiAgJ0B3aWxsYm9vc3Rlci9wcmV0dGllci1jb25maWcnLFxuICAnQHdpbGxib29zdGVyL3Jlbm92YXRlLWNvbmZpZycsXG4gICdAd2lsbGJvb3N0ZXIvc2hhcmVkLWxpYicsXG4gICdAd2lsbGJvb3N0ZXIvc2hhcmVkLWxpYi1ibGl0ei1uZXh0JyxcbiAgJ0B3aWxsYm9vc3Rlci9zaGFyZWQtbGliLW5leHQnLFxuICAnQHdpbGxib29zdGVyL3NoYXJlZC1saWItbm9kZScsXG4gICdAd2lsbGJvb3N0ZXIvc2hhcmVkLWxpYi1yZWFjdCcsXG4gICdAd2lsbGJvb3N0ZXIvd2InLFxuICAnYWdlbnQtcnVudGltZS1raXQnLFxuICAnYXQtZGVjb3JhdG9ycycsXG4gICdidWlsZC10cycsXG4gICdnZW4taTE4bi10cycsXG4gICdvbmUtd2F5LWdpdC1zeW5jJyxcbiAgLy8gLS0tLS0tLS0tLSBFTkQ6IFdlIGJlbGlldmUgb3VyIHBhY2thZ2VzIGFyZSBzYWZlIC0tLS0tLS0tLS1cblxuICAvLyB3YmZ5IHBpbnMgdGhlc2UgdG9vbGluZyBwYWNrYWdlcyBhbmQgbWF5IGFwcGx5IHRoZW0gaW1tZWRpYXRlbHkgYWZ0ZXIgYVxuICAvLyByZWxlYXNlLCBiZWZvcmUgdGhlIGdsb2JhbCBtaW5pbXVtLXJlbGVhc2UtYWdlIHdpbmRvdyBoYXMgZWxhcHNlZC5cbiAgJ0B0eXBlc2NyaXB0L25hdGl2ZS1wcmV2aWV3JyxcbiAgJ0B0eXBlc2NyaXB0L25hdGl2ZS1wcmV2aWV3LWRhcndpbi1hcm02NCcsXG4gICdAdHlwZXNjcmlwdC9uYXRpdmUtcHJldmlldy1kYXJ3aW4teDY0JyxcbiAgJ0B0eXBlc2NyaXB0L25hdGl2ZS1wcmV2aWV3LWxpbnV4LWFybScsXG4gICdAdHlwZXNjcmlwdC9uYXRpdmUtcHJldmlldy1saW51eC1hcm02NCcsXG4gICdAdHlwZXNjcmlwdC9uYXRpdmUtcHJldmlldy1saW51eC14NjQnLFxuICAnQHR5cGVzY3JpcHQvbmF0aXZlLXByZXZpZXctd2luMzItYXJtNjQnLFxuICAnQHR5cGVzY3JpcHQvbmF0aXZlLXByZXZpZXctd2luMzIteDY0JyxcbiAgJ294Zm10JyxcbiAgJ0BveGZtdC9iaW5kaW5nLWFuZHJvaWQtYXJtLWVhYmknLFxuICAnQG94Zm10L2JpbmRpbmctYW5kcm9pZC1hcm02NCcsXG4gICdAb3hmbXQvYmluZGluZy1kYXJ3aW4tYXJtNjQnLFxuICAnQG94Zm10L2JpbmRpbmctZGFyd2luLXg2NCcsXG4gICdAb3hmbXQvYmluZGluZy1mcmVlYnNkLXg2NCcsXG4gICdAb3hmbXQvYmluZGluZy1saW51eC1hcm0tZ251ZWFiaWhmJyxcbiAgJ0BveGZtdC9iaW5kaW5nLWxpbnV4LWFybS1tdXNsZWFiaWhmJyxcbiAgJ0BveGZtdC9iaW5kaW5nLWxpbnV4LWFybTY0LWdudScsXG4gICdAb3hmbXQvYmluZGluZy1saW51eC1hcm02NC1tdXNsJyxcbiAgJ0BveGZtdC9iaW5kaW5nLWxpbnV4LXBwYzY0LWdudScsXG4gICdAb3hmbXQvYmluZGluZy1saW51eC1yaXNjdjY0LWdudScsXG4gICdAb3hmbXQvYmluZGluZy1saW51eC1yaXNjdjY0LW11c2wnLFxuICAnQG94Zm10L2JpbmRpbmctbGludXgtczM5MHgtZ251JyxcbiAgJ0BveGZtdC9iaW5kaW5nLWxpbnV4LXg2NC1nbnUnLFxuICAnQG94Zm10L2JpbmRpbmctbGludXgteDY0LW11c2wnLFxuICAnQG94Zm10L2JpbmRpbmctb3Blbmhhcm1vbnktYXJtNjQnLFxuICAnQG94Zm10L2JpbmRpbmctd2luMzItYXJtNjQtbXN2YycsXG4gICdAb3hmbXQvYmluZGluZy13aW4zMi1pYTMyLW1zdmMnLFxuICAnQG94Zm10L2JpbmRpbmctd2luMzIteDY0LW1zdmMnLFxuICAnb3hsaW50JyxcbiAgJ0BveGxpbnQvYmluZGluZy1hbmRyb2lkLWFybS1lYWJpJyxcbiAgJ0BveGxpbnQvYmluZGluZy1hbmRyb2lkLWFybTY0JyxcbiAgJ0BveGxpbnQvYmluZGluZy1kYXJ3aW4tYXJtNjQnLFxuICAnQG94bGludC9iaW5kaW5nLWRhcndpbi14NjQnLFxuICAnQG94bGludC9iaW5kaW5nLWZyZWVic2QteDY0JyxcbiAgJ0BveGxpbnQvYmluZGluZy1saW51eC1hcm0tZ251ZWFiaWhmJyxcbiAgJ0BveGxpbnQvYmluZGluZy1saW51eC1hcm0tbXVzbGVhYmloZicsXG4gICdAb3hsaW50L2JpbmRpbmctbGludXgtYXJtNjQtZ251JyxcbiAgJ0BveGxpbnQvYmluZGluZy1saW51eC1hcm02NC1tdXNsJyxcbiAgJ0BveGxpbnQvYmluZGluZy1saW51eC1wcGM2NC1nbnUnLFxuICAnQG94bGludC9iaW5kaW5nLWxpbnV4LXJpc2N2NjQtZ251JyxcbiAgJ0BveGxpbnQvYmluZGluZy1saW51eC1yaXNjdjY0LW11c2wnLFxuICAnQG94bGludC9iaW5kaW5nLWxpbnV4LXMzOTB4LWdudScsXG4gICdAb3hsaW50L2JpbmRpbmctbGludXgteDY0LWdudScsXG4gICdAb3hsaW50L2JpbmRpbmctbGludXgteDY0LW11c2wnLFxuICAnQG94bGludC9iaW5kaW5nLW9wZW5oYXJtb255LWFybTY0JyxcbiAgJ0BveGxpbnQvYmluZGluZy13aW4zMi1hcm02NC1tc3ZjJyxcbiAgJ0BveGxpbnQvYmluZGluZy13aW4zMi1pYTMyLW1zdmMnLFxuICAnQG94bGludC9iaW5kaW5nLXdpbjMyLXg2NC1tc3ZjJyxcbiAgJ294bGludC10c2dvbGludCcsXG4gICdAb3hsaW50LXRzZ29saW50L2Rhcndpbi1hcm02NCcsXG4gICdAb3hsaW50LXRzZ29saW50L2Rhcndpbi14NjQnLFxuICAnQG94bGludC10c2dvbGludC9saW51eC1hcm02NCcsXG4gICdAb3hsaW50LXRzZ29saW50L2xpbnV4LXg2NCcsXG4gICdAb3hsaW50LXRzZ29saW50L3dpbjMyLWFybTY0JyxcbiAgJ0BveGxpbnQtdHNnb2xpbnQvd2luMzIteDY0JyxcbiAgJ0BuZXh0L2VudicsXG4gICdAbmV4dC9mb250JyxcbiAgJ0BuZXh0L3JzcGFjay1iaW5kaW5nLWxpbnV4LWFybTY0LWdudScsXG4gICdAbmV4dC9yc3BhY2stYmluZGluZy1saW51eC1hcm02NC1tdXNsJyxcbiAgJ0BuZXh0L3JzcGFjay1iaW5kaW5nLWxpbnV4LXg2NC1nbnUnLFxuICAnQG5leHQvcnNwYWNrLWJpbmRpbmctbGludXgteDY0LW11c2wnLFxuICAnQG5leHQvc3djLWFuZHJvaWQtYXJtLWVhYmknLFxuICAnQG5leHQvc3djLWFuZHJvaWQtYXJtNjQnLFxuICAnQG5leHQvc3djLWRhcndpbi1hcm02NCcsXG4gICdAbmV4dC9zd2MtZGFyd2luLXg2NCcsXG4gICdAbmV4dC9zd2MtZnJlZWJzZC14NjQnLFxuICAnQG5leHQvc3djLWxpbnV4LWFybS1nbnVlYWJpaGYnLFxuICAnQG5leHQvc3djLWxpbnV4LWFybTY0LWdudScsXG4gICdAbmV4dC9zd2MtbGludXgtYXJtNjQtbXVzbCcsXG4gICdAbmV4dC9zd2MtbGludXgteDY0LWdudScsXG4gICdAbmV4dC9zd2MtbGludXgteDY0LW11c2wnLFxuICAnQG5leHQvc3djLXdhc20tbm9kZWpzJyxcbiAgJ0BuZXh0L3N3Yy13YXNtLXdlYicsXG4gICdAbmV4dC90aGlyZC1wYXJ0aWVzJyxcbiAgJ25leHQnLFxuICAncmVhY3QnLFxuICAncmVhY3QtZG9tJyxcbl07XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZW5lcmF0ZUJ1bmZpZ1RvbWwoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZ2VuZXJhdGVCdW5maWdUb21sJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnYnVuZmlnLnRvbWwnKTtcbiAgICBjb25zdCBleGlzdGluZ0NvbnRlbnQgPSBmcy5leGlzdHNTeW5jKGZpbGVQYXRoKSA/IGZzLnJlYWRGaWxlU3luYyhmaWxlUGF0aCwgJ3V0ZjgnKSA6IHVuZGVmaW5lZDtcbiAgICBjb25zdCBjb250ZW50ID0gbmV3Q29udGVudChleGlzdGluZ0NvbnRlbnQpO1xuICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiBmc1V0aWwuZ2VuZXJhdGVGaWxlKGZpbGVQYXRoLCBjb250ZW50KSk7XG4gIH0pO1xufVxuXG5jb25zdCBuZXdDb250ZW50ID0gKGV4aXN0aW5nQ29udGVudDogc3RyaW5nIHwgdW5kZWZpbmVkKTogc3RyaW5nID0+IHtcbiAgY29uc3QgYnVuZmlnVG9tbCA9IHBhcnNlQnVuZmlnVG9tbChleGlzdGluZ0NvbnRlbnQpO1xuICByZXR1cm4gYGVudiA9IGZhbHNlXG50ZWxlbWV0cnkgPSBmYWxzZVxuXG4ke2dlbmVyYXRlUnVuU2VjdGlvbihidW5maWdUb21sKX1cbltpbnN0YWxsXVxuZXhhY3QgPSAke2J1bmZpZ1RvbWw/Lmluc3RhbGw/LmV4YWN0ID09PSBmYWxzZSA/ICdmYWxzZScgOiAndHJ1ZSd9XG5saW5rZXIgPSBcImhvaXN0ZWRcIlxubWluaW11bVJlbGVhc2VBZ2UgPSA0MzIwMDAgIyA1IGRheXNcbm1pbmltdW1SZWxlYXNlQWdlRXhjbHVkZXMgPSBbXG4ke21pbmltdW1SZWxlYXNlQWdlRXhjbHVkZXMubWFwKChwYWNrYWdlTmFtZSkgPT4gYCAgICBcIiR7cGFja2FnZU5hbWV9XCIsYCkuam9pbignXFxuJyl9XG5dXG5gO1xufTtcblxuZnVuY3Rpb24gcGFyc2VCdW5maWdUb21sKGNvbnRlbnQ6IHN0cmluZyB8IHVuZGVmaW5lZCk6IEJ1bmZpZ1RvbWwgfCB1bmRlZmluZWQge1xuICBpZiAoIWNvbnRlbnQpIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG4gIHRyeSB7XG4gICAgcmV0dXJuIHBhcnNlKGNvbnRlbnQpIGFzIEJ1bmZpZ1RvbWw7XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cbn1cblxuZnVuY3Rpb24gZ2VuZXJhdGVSdW5TZWN0aW9uKGJ1bmZpZ1RvbWw6IEJ1bmZpZ1RvbWwgfCB1bmRlZmluZWQpOiBzdHJpbmcge1xuICByZXR1cm4gdHlwZW9mIGJ1bmZpZ1RvbWw/LnJ1bj8uYnVuID09PSAnYm9vbGVhbicgPyBgW3J1bl1cXG5idW4gPSAke2J1bmZpZ1RvbWwucnVuLmJ1bn1cXG5gIDogJyc7XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5cbmNvbnN0IHVzZXJDb250ZW50SGVhZGVyID0gJyMgUHJvamVjdC1zcGVjaWZpYyBzZXR0aW5ncyc7XG5jb25zdCB1c2VyQ29udGVudEhlYWRlclJlZ2V4ID0gLyMgUHJvamVjdC1zcGVjaWZpYyBzZXR0aW5nc1teXFxuXSpcXG4vZ207XG5jb25zdCBzZXBhcmF0b3IgPSAnIyBHZW5lcmF0ZWQgYnkgd2JmeSc7XG5jb25zdCBzZXBhcmF0b3JQcmVmaXggPSAnIyBHZW5lcmF0ZWQgYnkgJztcbmNvbnN0IGRlZmF1bHRIZWFkVXNlckNvbnRlbnQgPSBgJHt1c2VyQ29udGVudEhlYWRlcn0gKGhlYWQpXG5cblxuJHtzZXBhcmF0b3J9XG5gO1xuY29uc3QgZGVmYXVsdFRhaWxVc2VyQ29udGVudCA9IGBcbiR7dXNlckNvbnRlbnRIZWFkZXJ9ICh0YWlsKVxuYDtcblxuZXhwb3J0IGNvbnN0IGlnbm9yZUZpbGVVdGlsID0ge1xuICBzZXBhcmF0b3IsXG4gIHNlcGFyYXRvclByZWZpeCxcbiAgZGVmYXVsdEhlYWRVc2VyQ29udGVudCxcbiAgZGVmYXVsdFRhaWxVc2VyQ29udGVudCxcbiAgYXN5bmMgcmVhZEdpdGlnbm9yZVdpdGhvdXRTZXBhcmF0b3JzKGZpbGVQYXRoOiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZyB8IHVuZGVmaW5lZD4ge1xuICAgIHRyeSB7XG4gICAgICBsZXQgY29udGVudCA9IGF3YWl0IGZzLnByb21pc2VzLnJlYWRGaWxlKGZpbGVQYXRoLCAndXRmOCcpO1xuICAgICAgY29uc3QgbGFzdEhlYWRlckluZGV4ID0gZ2V0SW5kZXhPZlRhaWxVc2VyQ29udGVudEhlYWRlcihjb250ZW50KTtcbiAgICAgIGlmIChsYXN0SGVhZGVySW5kZXggPiAwKSB7XG4gICAgICAgIGNvbnRlbnQgPSBjb250ZW50LnNsaWNlKDAsIGxhc3RIZWFkZXJJbmRleCAtIDEpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIChcbiAgICAgICAgY29udGVudFxuICAgICAgICAgIC5yZXBsYWNlQWxsKHVzZXJDb250ZW50SGVhZGVyUmVnZXgsICcnKVxuICAgICAgICAgIC5yZXBsYWNlQWxsKC8jIEdlbmVyYXRlZCBieSBbXlxcbl0qXFxuL2dtLCAnJylcbiAgICAgICAgICAucmVwbGFjZUFsbCgvXFxyP1xcblxccj9cXG4oXFxyP1xcbikrL2dtLCAnXFxuXFxuJylcbiAgICAgICAgICAudHJpbSgpICsgJ1xcbidcbiAgICAgICk7XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBkbyBub3RoaW5nXG4gICAgfVxuICB9LFxuICBnZXRIZWFkVXNlckNvbnRlbnQoY29udGVudDogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBjb25zdCBpbmRleCA9IGNvbnRlbnQuaW5kZXhPZih0aGlzLnNlcGFyYXRvclByZWZpeCk7XG4gICAgaWYgKGluZGV4ICE9PSAtMSkge1xuICAgICAgcmV0dXJuIGNvbnRlbnRcbiAgICAgICAgLnNsaWNlKDAsIGNvbnRlbnQuaW5kZXhPZignXFxuJywgaW5kZXgpICsgMSlcbiAgICAgICAgLnJlcGxhY2VBbGwodXNlckNvbnRlbnRIZWFkZXJSZWdleCwgYCR7dXNlckNvbnRlbnRIZWFkZXJ9IChoZWFkKVxcbmApO1xuICAgIH1cbiAgICByZXR1cm4gZGVmYXVsdEhlYWRVc2VyQ29udGVudDtcbiAgfSxcbiAgZ2V0VGFpbFVzZXJDb250ZW50KGNvbnRlbnQ6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgY29uc3QgbGFzdEhlYWRlckluZGV4ID0gZ2V0SW5kZXhPZlRhaWxVc2VyQ29udGVudEhlYWRlcihjb250ZW50KTtcbiAgICBpZiAobGFzdEhlYWRlckluZGV4ID4gMCkge1xuICAgICAgcmV0dXJuIGNvbnRlbnQuc2xpY2UobGFzdEhlYWRlckluZGV4IC0gMSk7XG4gICAgfVxuICAgIHJldHVybiBkZWZhdWx0VGFpbFVzZXJDb250ZW50O1xuICB9LFxuICBhc3luYyBpc0JlcnJ5WmVyb0luc3RhbGxFbmFibGVkKGZpbGVQYXRoOiBzdHJpbmcpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgY29udGVudCA9IGF3YWl0IGZzLnByb21pc2VzLnJlYWRGaWxlKGZpbGVQYXRoLCAndXRmOCcpO1xuICAgICAgcmV0dXJuIGNvbnRlbnQuaW5jbHVkZXMoJ1xcbiEueWFybi9jYWNoZScpO1xuICAgIH0gY2F0Y2gge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfSxcbn07XG5cbmZ1bmN0aW9uIGdldEluZGV4T2ZUYWlsVXNlckNvbnRlbnRIZWFkZXIoY29udGVudDogc3RyaW5nKTogbnVtYmVyIHtcbiAgY29uc3QgaW5kZXggPSBjb250ZW50LmluZGV4T2YodXNlckNvbnRlbnRIZWFkZXIpO1xuICBjb25zdCBsYXN0SW5kZXggPSBjb250ZW50Lmxhc3RJbmRleE9mKHVzZXJDb250ZW50SGVhZGVyKTtcbiAgcmV0dXJuIGxhc3RJbmRleCA+IGluZGV4ID8gbGFzdEluZGV4IDogLTE7XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBmc1V0aWwgfSBmcm9tICcuLi91dGlscy9mc1V0aWwuanMnO1xuaW1wb3J0IHsgaWdub3JlRmlsZVV0aWwgfSBmcm9tICcuLi91dGlscy9pZ25vcmVGaWxlVXRpbC5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcblxuLy8gRXhlcmNvZGXjgafjga9ub2RlX21vZHVsZXPjgpJDT1BZ44GZ44KL5b+F6KaB44GM44GC44KL44Gf44KB44CBbm9kZV9tb2R1bGVz44KS6Zmk5aSW44GX44Gm44Gv44GE44GR44Gq44GE44CCXG5jb25zdCBjb21tb25Db250ZW50ID0gYFxuKiovLmlkZWFcbioqLyouc3FsaXRlMypcbioqLy55YXJuL2luc3RhbGwtc3RhdGUuZ3pcbioqLy52ZW52XG5gO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVEb2NrZXJpZ25vcmUoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZ2VuZXJhdGVEb2NrZXJpZ25vcmUnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICcuZG9ja2VyaWdub3JlJyk7XG4gICAgaWYgKGNvbmZpZy5kb2VzQ29udGFpbkRvY2tlcmZpbGUpIHtcbiAgICAgIGNvbnN0IGNvbnRlbnQgPSAoYXdhaXQgZnNVdGlsLnJlYWRGaWxlSWdub3JpbmdFcnJvcihmaWxlUGF0aCkpID8/ICcnO1xuICAgICAgY29uc3QgaGVhZFVzZXJDb250ZW50ID0gaWdub3JlRmlsZVV0aWwuZ2V0SGVhZFVzZXJDb250ZW50KGNvbnRlbnQpO1xuICAgICAgY29uc3QgdGFpbFVzZXJDb250ZW50ID0gaWdub3JlRmlsZVV0aWwuZ2V0VGFpbFVzZXJDb250ZW50KGNvbnRlbnQpO1xuXG4gICAgICBjb25zdCBuZXdDb250ZW50ID0gaGVhZFVzZXJDb250ZW50ICsgY29tbW9uQ29udGVudCArIHRhaWxVc2VyQ29udGVudDtcbiAgICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiBmc1V0aWwuZ2VuZXJhdGVGaWxlKGZpbGVQYXRoLCBuZXdDb250ZW50KSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGF3YWl0IGZzLnByb21pc2VzLnJtKGZpbGVQYXRoLCB7IGZvcmNlOiB0cnVlIH0pO1xuICAgIH1cbiAgfSk7XG59XG4iLCJleHBvcnQgY29uc3QgZXh0ZW5zaW9ucyA9IHtcbiAgY29kZVdpdGgySW5kZW50U2l6ZTogW1xuICAgICdjanMnLFxuICAgICdtanMnLFxuICAgICdqcycsXG4gICAgJ2pzeCcsXG4gICAgJ2N0cycsXG4gICAgJ210cycsXG4gICAgJ3RzJyxcbiAgICAndHN4JyxcbiAgICAnanNvbicsXG4gICAgJ2pzb241JyxcbiAgICAnanNvbmMnLFxuICAgICdjcHAnLFxuICAgICdkYXJ0JyxcbiAgICAnaHRtJyxcbiAgICAnaHRtbCcsXG4gICAgJ3B1JyxcbiAgICAncHVtbCcsXG4gICAgJ3JiJyxcbiAgICAndnVlJyxcbiAgICAneG1sJyxcbiAgICAneWFtbCcsXG4gICAgJ3ltbCcsXG4gICAgJ3NoJyxcbiAgXS50b1NvcnRlZCgpLFxuICBjb2RlV2l0aDRJbmRlbnRTaXplOiBbJ2dvJywgJ2dyYWRsZScsICdqYXZhJywgJ3B5J10udG9Tb3J0ZWQoKSxcbiAgbWFya2Rvd25MaWtlOiBbJ21kJ10udG9Tb3J0ZWQoKSxcbiAgb3hsaW50OiBbJ2FzdHJvJywgJ2NqcycsICdjdHMnLCAnanMnLCAnanN4JywgJ21qcycsICdtdHMnLCAnc3ZlbHRlJywgJ3RzJywgJ3RzeCcsICd2dWUnXS50b1NvcnRlZCgpLFxuICBveGZtdDogW1xuICAgICdhc3RybycsXG4gICAgJ2NqcycsXG4gICAgJ2NzcycsXG4gICAgJ2N0cycsXG4gICAgJ2dxbCcsXG4gICAgJ2dyYXBocWwnLFxuICAgICdoYnMnLFxuICAgICdodG0nLFxuICAgICdodG1sJyxcbiAgICAnanMnLFxuICAgICdqc29uJyxcbiAgICAnanNvbjUnLFxuICAgICdqc29uYycsXG4gICAgJ2pzeCcsXG4gICAgJ2xlc3MnLFxuICAgICdtZCcsXG4gICAgJ21keCcsXG4gICAgJ21qcycsXG4gICAgJ210cycsXG4gICAgJ3Njc3MnLFxuICAgICdzdmVsdGUnLFxuICAgICd0b21sJyxcbiAgICAndHMnLFxuICAgICd0c3gnLFxuICAgICd2dWUnLFxuICAgICd5YW1sJyxcbiAgICAneW1sJyxcbiAgXS50b1NvcnRlZCgpLFxuICBwcmV0dGllck9ubHk6IFsnamF2YSddLnRvU29ydGVkKCksXG59O1xuIiwiaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZXh0ZW5zaW9ucyB9IGZyb20gJy4uL3V0aWxzL2V4dGVuc2lvbnMuanMnO1xuaW1wb3J0IHsgZnNVdGlsIH0gZnJvbSAnLi4vdXRpbHMvZnNVdGlsLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuXG5jb25zdCBuZXdDb250ZW50ID0gYHJvb3QgPSB0cnVlXG5cblsqXVxuY2hhcnNldCA9IHV0Zi04XG5lbmRfb2ZfbGluZSA9IGxmXG5pbnNlcnRfZmluYWxfbmV3bGluZSA9IHRydWVcbnRyaW1fdHJhaWxpbmdfd2hpdGVzcGFjZSA9IHRydWVcblxuJHtnZW5lcmF0ZUV4dGVuc2lvbnMoZXh0ZW5zaW9ucy5jb2RlV2l0aDJJbmRlbnRTaXplKX1cbmluZGVudF9zaXplID0gMlxuaW5kZW50X3N0eWxlID0gc3BhY2VcblxuJHtnZW5lcmF0ZUV4dGVuc2lvbnMoZXh0ZW5zaW9ucy5jb2RlV2l0aDRJbmRlbnRTaXplKX1cbmluZGVudF9zaXplID0gNFxuaW5kZW50X3N0eWxlID0gc3BhY2VcblxuJHtnZW5lcmF0ZUV4dGVuc2lvbnMoZXh0ZW5zaW9ucy5tYXJrZG93bkxpa2UpfVxubWF4X2xpbmVfbGVuZ3RoID0gb2ZmXG50cmltX3RyYWlsaW5nX3doaXRlc3BhY2UgPSBmYWxzZVxuXG5be01ha2VmaWxlLCoubWt9XVxuaW5kZW50X3N0eWxlID0gdGFiXG5gO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVFZGl0b3Jjb25maWcoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZ2VuZXJhdGVFZGl0b3Jjb25maWcnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICcuZWRpdG9yY29uZmlnJyk7XG4gICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzVXRpbC5nZW5lcmF0ZUZpbGUoZmlsZVBhdGgsIG5ld0NvbnRlbnQpKTtcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIGdlbmVyYXRlRXh0ZW5zaW9ucyhleHRlbnNpb25zOiBzdHJpbmdbXSk6IHN0cmluZyB7XG4gIHJldHVybiBleHRlbnNpb25zLmxlbmd0aCA+IDEgPyBgWyoueyR7ZXh0ZW5zaW9ucy5qb2luKCcsJyl9fV1gIDogYFsqLiR7ZXh0ZW5zaW9uc1swXX1dYDtcbn1cbiIsIi8vIG94bGludC1kaXNhYmxlIGVzbGludC1wbHVnaW4taW1wb3J0L25vLW5hbWVkLWFzLWRlZmF1bHQtbWVtYmVyIC0tIE5hbWVzcGFjZSBZQU1MIGNhbGxzIG1ha2UgbG9hZC9kdW1wIHVzYWdlIGNsZWFyZXIuXG5pbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgbWVyZ2UgZnJvbSAnZGVlcG1lcmdlJztcbmltcG9ydCB5YW1sIGZyb20gJ2pzLXlhbWwnO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBmc1V0aWwgfSBmcm9tICcuLi91dGlscy9mc1V0aWwuanMnO1xuaW1wb3J0IHsgb3ZlcndyaXRlTWVyZ2UgfSBmcm9tICcuLi91dGlscy9tZXJnZVV0aWwuanMnO1xuaW1wb3J0IHsgcHJvbWlzZVBvb2wgfSBmcm9tICcuLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5cbmltcG9ydCB7IGdlbmVyYXRlQWdlbnRDb2RpbmdTdHlsZSB9IGZyb20gJy4vYWdlbnRzLmpzJztcblxuY29uc3QgZGVmYXVsdENvbmZpZyA9IHtcbiAgaGF2ZV9mdW46IHRydWUsXG4gIGNvZGVfcmV2aWV3OiB7XG4gICAgZGlzYWJsZTogZmFsc2UsXG4gICAgY29tbWVudF9zZXZlcml0eV90aHJlc2hvbGQ6ICdNRURJVU0nLFxuICAgIG1heF9yZXZpZXdfY29tbWVudHM6IC0xLFxuICAgIHB1bGxfcmVxdWVzdF9vcGVuZWQ6IHtcbiAgICAgIGhlbHA6IGZhbHNlLFxuICAgICAgc3VtbWFyeTogdHJ1ZSxcbiAgICAgIGNvZGVfcmV2aWV3OiB0cnVlLFxuICAgIH0sXG4gIH0sXG4gIGlnbm9yZV9wYXR0ZXJuczogWycqKi9fX2dlbmVyYXRlZF9fJ10sXG59O1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVHZW1pbmlDb25maWcoY29uZmlnOiBQYWNrYWdlQ29uZmlnLCBhbGxDb25maWdzOiBQYWNrYWdlQ29uZmlnW10pOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdnZW5lcmF0ZUdlbWluaUNvbmZpZycsIGFzeW5jICgpID0+IHtcbiAgICBpZiAoIWNvbmZpZy5pc1Jvb3QpIHJldHVybjtcblxuICAgIGNvbnN0IGRpclBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICcuZ2VtaW5pJyk7XG4gICAgY29uc3QgY29uZmlnRmlsZVBhdGggPSBwYXRoLnJlc29sdmUoZGlyUGF0aCwgJ2NvbmZpZy55bWwnKTtcbiAgICBjb25zdCBzdHlsZWd1aWRlRmlsZVBhdGggPSBwYXRoLnJlc29sdmUoZGlyUGF0aCwgJ3N0eWxlZ3VpZGUubWQnKTtcbiAgICBjb25zdCBhZ2VudHNFeHRyYVBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICdBR0VOVFNfRVhUUkEubWQnKTtcblxuICAgIGxldCBuZXdDb25maWc6IG9iamVjdCA9IHN0cnVjdHVyZWRDbG9uZShkZWZhdWx0Q29uZmlnKTtcbiAgICB0cnkge1xuICAgICAgY29uc3Qgb2xkQ29udGVudCA9IGF3YWl0IGZzLnByb21pc2VzLnJlYWRGaWxlKGNvbmZpZ0ZpbGVQYXRoLCAndXRmOCcpO1xuICAgICAgY29uc3Qgb2xkQ29uZmlnID0geWFtbC5sb2FkKG9sZENvbnRlbnQpIGFzIG9iamVjdDtcbiAgICAgIG5ld0NvbmZpZyA9IG1lcmdlLmFsbChbbmV3Q29uZmlnLCBvbGRDb25maWcsIG5ld0NvbmZpZ10sIHsgYXJyYXlNZXJnZTogb3ZlcndyaXRlTWVyZ2UgfSk7XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBkbyBub3RoaW5nIC0gZmlsZSBkb2Vzbid0IGV4aXN0IG9yIGNhbid0IGJlIHBhcnNlZFxuICAgIH1cblxuICAgIGNvbnN0IHlhbWxDb250ZW50ID0geWFtbC5kdW1wKG5ld0NvbmZpZywge1xuICAgICAgbGluZVdpZHRoOiAtMSxcbiAgICAgIG5vQ29tcGF0TW9kZTogdHJ1ZSxcbiAgICAgIHN0eWxlczoge1xuICAgICAgICAnISFudWxsJzogJ2VtcHR5JyxcbiAgICAgIH0sXG4gICAgfSk7XG5cbiAgICBjb25zdCBleHRyYUNvbnRlbnQgPSBhd2FpdCBmc1V0aWwucmVhZEZpbGVJZ25vcmluZ0Vycm9yKGFnZW50c0V4dHJhUGF0aCk7XG4gICAgY29uc3QgY29kaW5nUnVsZUV4dHJhQ29udGVudCA9IGV4dHJhQ29udGVudD8udHJpbVN0YXJ0KCkuc3RhcnRzV2l0aCgnIycpID8gdW5kZWZpbmVkIDogZXh0cmFDb250ZW50O1xuICAgIGNvbnN0IHJldmlld0xhbmd1YWdlSW5zdHJ1Y3Rpb24gPSBjb25maWcuaXNQdWJsaWNSZXBvXG4gICAgICA/ICdSZXZpZXcgaW4gRW5nbGlzaCBiYXNlZCBvbiB0aGUgZm9sbG93aW5nIGNvZGluZyBzdGFuZGFyZHMuJ1xuICAgICAgOiAn5Lul5LiL44Gu44Kz44O844OH44Kj44Oz44Kw6KaP57SE44KS6LiP44G+44GI44Gm44CB5pel5pys6Kqe44Gn44Os44OT44Ol44O844GX44Gm44GP44Gg44GV44GE44CCJztcbiAgICBjb25zdCBzdHlsZWd1aWRlQ29udGVudCA9IGAke3Jldmlld0xhbmd1YWdlSW5zdHJ1Y3Rpb259XFxuXFxuJHtnZW5lcmF0ZUFnZW50Q29kaW5nU3R5bGUoYWxsQ29uZmlncyl9JHtcbiAgICAgIGNvZGluZ1J1bGVFeHRyYUNvbnRlbnQgPyBgXFxuJHtjb2RpbmdSdWxlRXh0cmFDb250ZW50LnRyaW1FbmQoKX1gIDogJydcbiAgICB9YDtcblxuICAgIGNvbnN0IHByb21pc2VzID0gW1xuICAgICAgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzVXRpbC5nZW5lcmF0ZUZpbGUoY29uZmlnRmlsZVBhdGgsIHlhbWxDb250ZW50KSksXG4gICAgICBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnNVdGlsLmdlbmVyYXRlRmlsZShzdHlsZWd1aWRlRmlsZVBhdGgsIHN0eWxlZ3VpZGVDb250ZW50KSksXG4gICAgXTtcbiAgICBhd2FpdCBQcm9taXNlLmFsbChwcm9taXNlcyk7XG4gIH0pO1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcmVtb3ZlR2VtaW5pU2V0dGluZ3MoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZ2VuZXJhdGVHZW1pbmlTZXR0aW5ncycsIGFzeW5jICgpID0+IHtcbiAgICBpZiAoIWNvbmZpZy5pc1Jvb3QpIHJldHVybjtcblxuICAgIGNvbnN0IGRpclBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICcuZ2VtaW5pJyk7XG4gICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLnJlc29sdmUoZGlyUGF0aCwgJ3NldHRpbmdzLmpzb24nKTtcbiAgICBhd2FpdCBmcy5wcm9taXNlcy5ybShmaWxlUGF0aCwgeyBmb3JjZTogdHJ1ZSB9KTtcbiAgfSk7XG59XG4iLCJpbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBleHRlbnNpb25zIH0gZnJvbSAnLi4vdXRpbHMvZXh0ZW5zaW9ucy5qcyc7XG5pbXBvcnQgeyBmc1V0aWwgfSBmcm9tICcuLi91dGlscy9mc1V0aWwuanMnO1xuaW1wb3J0IHsgcHJvbWlzZVBvb2wgfSBmcm9tICcuLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5cbi8vIGNmLiBodHRwczovL2J1bi5zaC9ndWlkZXMvaW5zdGFsbC9naXQtZGlmZi1idW4tbG9ja2ZpbGVcbmNvbnN0IG5ld0NvbnRlbnQgPSBgKiB0ZXh0PWF1dG9cblxuKi5sb2NrYiBiaW5hcnkgZGlmZj1sb2NrYlxuKi52Y3Byb2ogdGV4dCBlb2w9Y3JsZlxuXG4ke1suLi5leHRlbnNpb25zLmNvZGVXaXRoMkluZGVudFNpemUsIC4uLmV4dGVuc2lvbnMuY29kZVdpdGg0SW5kZW50U2l6ZSwgLi4uZXh0ZW5zaW9ucy5tYXJrZG93bkxpa2VdXG4gIC5tYXAoKGV4dCkgPT4gYCouJHtleHR9IHRleHQgZW9sPWxmYClcbiAgLmpvaW4oJ1xcbicpfVxuXG5kaXN0LyoqIGxpbmd1aXN0LWdlbmVyYXRlZD10cnVlXG5gO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVHaXRhdHRyaWJ1dGVzKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2dlbmVyYXRlR2l0YXR0cmlidXRlcycsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJy5naXRhdHRyaWJ1dGVzJyk7XG4gICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzVXRpbC5nZW5lcmF0ZUZpbGUoZmlsZVBhdGgsIG5ld0NvbnRlbnQpKTtcbiAgfSk7XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgb3MgZnJvbSAnbm9kZTpvcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHsgb3B0aW9ucyB9IGZyb20gJy4uL29wdGlvbnMuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBmc1V0aWwgfSBmcm9tICcuLi91dGlscy9mc1V0aWwuanMnO1xuaW1wb3J0IHsgaWdub3JlRmlsZVV0aWwgfSBmcm9tICcuLi91dGlscy9pZ25vcmVGaWxlVXRpbC5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcblxuLy8gRG8gbm90IHJlbW92ZSBgd2luZG93c2A6IGdlbmVyYXRlZCAuZ2l0aWdub3JlIGZpbGVzIG11c3Qga2VlcCBpZ25vcmluZyBXaW5kb3dzLWNyZWF0ZWQgbG9jYWwgYXJ0aWZhY3RzLlxuY29uc3QgZGVmYXVsdE5hbWVzID0gWyd3aW5kb3dzJywgJ21hY29zJywgJ2xpbnV4JywgJ2pldGJyYWlucycsICd2aXN1YWxzdHVkaW9jb2RlJywgJ2VtYWNzJywgJ3ZpbScsICd5YXJuJ107XG5cbmNvbnN0IGNvbW1vbkNvbnRlbnQgPSBgXG4hLmtlZXBcbi5haWRlcipcbi5lbnYucHJvZHVjdGlvblxuKi9tb3VudC8qLmhhc2hcbi5kZXZjb250YWluZXIvXG4uaWRlYS9BdWdtZW50V2Vidmlld1N0YXRlU3RvcmUueG1sXG4uaWRlYS9jb3BpbG90Lipcbi5pZGVhL2NvcGlsb3QvY2hhdFNlc3Npb25zL1xuLnBsYXl3cmlnaHQtY2xpL1xuLnNlcmVuYS9cbi50bXAvXG4ud2IvXG5fX2dlbmVyYXRlZF9fL1xuQHdpbGxib29zdGVyL1xuZGlzdC9cbmRyaXp6bGUvbW91bnQvXG50ZW1wL1xudG1wL1xuYDtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlR2l0aWdub3JlKGNvbmZpZzogUGFja2FnZUNvbmZpZywgcm9vdENvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2dlbmVyYXRlR2l0aWdub3JlJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnLmdpdGlnbm9yZScpO1xuICAgIGNvbnN0IGNvbnRlbnQgPSAoYXdhaXQgZnNVdGlsLnJlYWRGaWxlSWdub3JpbmdFcnJvcihmaWxlUGF0aCkpID8/ICcnO1xuICAgIGxldCBoZWFkVXNlckNvbnRlbnQgPSBpZ25vcmVGaWxlVXRpbC5nZXRIZWFkVXNlckNvbnRlbnQoY29udGVudCkgKyBjb21tb25Db250ZW50O1xuICAgIGNvbnN0IHRhaWxVc2VyQ29udGVudCA9IGlnbm9yZUZpbGVVdGlsLmdldFRhaWxVc2VyQ29udGVudChjb250ZW50KTtcblxuICAgIGNvbnN0IG5hbWVzID0gWy4uLmRlZmF1bHROYW1lc107XG4gICAgaWYgKGNvbmZpZy5kb2VzQ29udGFpbkdlbWZpbGUpIHtcbiAgICAgIG5hbWVzLnB1c2goJ3J1YnknKTtcbiAgICB9XG4gICAgaWYgKGNvbmZpZy5kb2VzQ29udGFpbkdvTW9kKSB7XG4gICAgICBuYW1lcy5wdXNoKCdnbycpO1xuICAgICAgaGVhZFVzZXJDb250ZW50ICs9IGAke3BhdGguYmFzZW5hbWUoY29uZmlnLmRpclBhdGgpfVxuYDtcbiAgICB9XG4gICAgaWYgKGNvbmZpZy5kb2VzQ29udGFpblBhY2thZ2VKc29uKSB7XG4gICAgICBuYW1lcy5wdXNoKCdub2RlJyk7XG4gICAgfVxuICAgIGlmIChjb25maWcuZG9lc0NvbnRhaW5Qb21YbWwpIHtcbiAgICAgIG5hbWVzLnB1c2goJ21hdmVuJyk7XG4gICAgICBoZWFkVXNlckNvbnRlbnQgKz0gYC5pZGVhL2dvb2dsZS1qYXZhLWZvcm1hdC54bWxcbmA7XG4gICAgfVxuICAgIGlmIChjb25maWcuZG9lc0NvbnRhaW5QdWJzcGVjWWFtbCkge1xuICAgICAgbmFtZXMucHVzaCgnZmx1dHRlcicsICdBbmRyb2lkU3R1ZGlvJywgJ3J1YnknKTtcbiAgICAgIGhlYWRVc2VyQ29udGVudCArPSBgLmZsdXR0ZXItcGx1Z2lucy1kZXBlbmRlbmNpZXNcbmFuZHJvaWQva2V5LnByb3BlcnRpZXNcbmlvcy8uYnVuZGxlXG4uaWRlYS9ydW5Db25maWd1cmF0aW9ucy54bWxcbmA7XG4gICAgfVxuICAgIGlmIChjb25maWcuZG9lc0NvbnRhaW5UZW1wbGF0ZVlhbWwpIHtcbiAgICAgIGhlYWRVc2VyQ29udGVudCArPSBgLmF3cy1zYW0vXG5wYWNrYWdlZC55YW1sXG5gO1xuICAgIH1cbiAgICAvLyBCZWNhdXNlIC52ZW52IHNob3VsZCBiZSBpZ25vcmVkIG9uIHJvb3QgZGlyZWN0b3J5XG4gICAgaWYgKGNvbmZpZy5kb2VzQ29udGFpblBvZXRyeUxvY2sgfHwgY29uZmlnLmRvZXNDb250YWluVXZMb2NrKSB7XG4gICAgICBuYW1lcy5wdXNoKCdweXRob24nKTtcbiAgICAgIGhlYWRVc2VyQ29udGVudCArPSBgLnZlbnYvXG5gO1xuICAgIH1cblxuICAgIGlmIChjb25maWcuZGVwZW5kaW5nLmJsaXR6KSB7XG4gICAgICBoZWFkVXNlckNvbnRlbnQgKz0gYC5ibGl0ei9cbi5ibGl0eioqXG5gO1xuICAgIH1cbiAgICBpZiAoY29uZmlnLmRlcGVuZGluZy5uZXh0KSB7XG4gICAgICBuYW1lcy5wdXNoKCduZXh0anMnKTtcbiAgICB9XG4gICAgaWYgKHJvb3RDb25maWcuZGVwZW5kaW5nLmZpcmViYXNlIHx8IGNvbmZpZy5kZXBlbmRpbmcuZmlyZWJhc2UpIHtcbiAgICAgIG5hbWVzLnB1c2goJ2ZpcmViYXNlJyk7XG4gICAgfVxuICAgIGlmIChjb25maWcuZGVwZW5kaW5nLnByaXNtYSkge1xuICAgICAgaGVhZFVzZXJDb250ZW50ICs9IGAqLnNxbGl0ZTMqXG5gO1xuICAgIH1cbiAgICBpZiAoY29uZmlnLmRlcGVuZGluZy5wbGF5d3JpZ2h0VGVzdCkge1xuICAgICAgaGVhZFVzZXJDb250ZW50ICs9IGBwbGF5d3JpZ2h0LXJlcG9ydC9cbnRlc3QtcmVzdWx0cy9cbmA7XG4gICAgfVxuICAgIGlmIChyb290Q29uZmlnLmRlcGVuZGluZy5yZWFjdE5hdGl2ZSB8fCBjb25maWcuZGVwZW5kaW5nLnJlYWN0TmF0aXZlKSB7XG4gICAgICBuYW1lcy5wdXNoKCdyZWFjdG5hdGl2ZScpO1xuICAgICAgaGVhZFVzZXJDb250ZW50ICs9IGBnb29nbGUtc2VydmljZXMuanNvblxuYW5kcm9pZC9hcHAvc3JjL21haW4vYXNzZXRzL1xuYDtcbiAgICB9XG4gICAgaWYgKGNvbmZpZy5kZXBlbmRpbmcuc3Rvcnlib29rKSB7XG4gICAgICBuYW1lcy5wdXNoKCdzdG9yeWJvb2tqcycpO1xuICAgIH1cbiAgICBpZiAoY29uZmlnLmRlcGVuZGluZy5saXRlc3RyZWFtKSB7XG4gICAgICBoZWFkVXNlckNvbnRlbnQgKz0gYGdjcC1zYS1rZXkuanNvblxuYDtcbiAgICB9XG5cbiAgICBsZXQgZ2VuZXJhdGVkID0gJyc7XG4gICAgZm9yIChjb25zdCBuYW1lIG9mIG5hbWVzKSB7XG4gICAgICBsZXQgY29udGVudCA9IChhd2FpdCByZWFkQ2FjaGUobmFtZSkpID8/ICcnO1xuICAgICAgaWYgKCFjb250ZW50KSB7XG4gICAgICAgIGNvbnN0IHVybCA9IGBodHRwczovL3d3dy50b3B0YWwuY29tL2RldmVsb3BlcnMvZ2l0aWdub3JlL2FwaS8ke25hbWV9YDtcbiAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaCh1cmwpO1xuICAgICAgICBjb25zdCByZXNwb25zZVRleHQgPSBhd2FpdCByZXNwb25zZS50ZXh0KCk7XG4gICAgICAgIGlmICghcmVzcG9uc2Uub2sgfHwgcmVzcG9uc2VUZXh0LmluY2x1ZGVzKCdBdHRlbnRpb24gUmVxdWlyZWQhJykgfHwgcmVzcG9uc2VUZXh0LmluY2x1ZGVzKCc8dGl0bGU+JykpIHtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKGBGYWlsZWQgdG8gZmV0Y2ggJHt1cmx9YCk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNvbnRlbnQgPSByZXNwb25zZVRleHQudHJpbSgpO1xuICAgICAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT4gd3JpdGVDYWNoZShuYW1lLCBjb250ZW50KSk7XG4gICAgICAgIGlmIChvcHRpb25zLmlzVmVyYm9zZSkge1xuICAgICAgICAgIGNvbnNvbGUuaW5mbyhgRmV0Y2hlZCAke3VybH1gKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKGdlbmVyYXRlZCkgZ2VuZXJhdGVkICs9ICdcXG4nO1xuICAgICAgZ2VuZXJhdGVkICs9IGNvbnRlbnQgKyAnXFxuJztcbiAgICB9XG4gICAgaWYgKCEoYXdhaXQgaWdub3JlRmlsZVV0aWwuaXNCZXJyeVplcm9JbnN0YWxsRW5hYmxlZChmaWxlUGF0aCkpKSB7XG4gICAgICBnZW5lcmF0ZWQgPSBnZW5lcmF0ZWQucmVwbGFjZSgnIS55YXJuL2NhY2hlJywgJyMgIS55YXJuL2NhY2hlJykucmVwbGFjZSgnIyAucG5wLionLCAnLnBucC4qJyk7XG4gICAgfVxuICAgIGlmIChjb25maWcuZG9lc0NvbnRhaW5Qb21YbWwgfHwgY29uZmlnLmRvZXNDb250YWluUHVic3BlY1lhbWwpIHtcbiAgICAgIGdlbmVyYXRlZCA9IGdlbmVyYXRlZFxuICAgICAgICAucmVwbGFjZUFsbCgvXiMgLmlkZWFcXC9hcnRpZmFjdHMkL2dtLCAnLmlkZWEvYXJ0aWZhY3RzJylcbiAgICAgICAgLnJlcGxhY2VBbGwoL14jIC5pZGVhXFwvY29tcGlsZXIueG1sJC9nbSwgJy5pZGVhL2NvbXBpbGVyLnhtbCcpXG4gICAgICAgIC5yZXBsYWNlQWxsKC9eIyAuaWRlYVxcL2phclJlcG9zaXRvcmllcy54bWwkL2dtLCAnLmlkZWEvamFyUmVwb3NpdG9yaWVzLnhtbCcpXG4gICAgICAgIC5yZXBsYWNlQWxsKC9eIyAuaWRlYVxcL21vZHVsZXMueG1sJC9nbSwgJy5pZGVhL21vZHVsZXMueG1sJylcbiAgICAgICAgLnJlcGxhY2VBbGwoL14jIC5pZGVhXFwvKi5pbWwkL2dtLCAnLmlkZWEvKi5pbWwnKVxuICAgICAgICAucmVwbGFjZUFsbCgvXiMgLmlkZWFcXC9tb2R1bGVzJC9nbSwgJy5pZGVhL21vZHVsZXMnKVxuICAgICAgICAucmVwbGFjZUFsbCgvXiMgKi5pbWwkL2dtLCAnKi5pbWwnKVxuICAgICAgICAucmVwbGFjZUFsbCgvXiMgKi5pcHIkL2dtLCAnKi5pcHInKTtcbiAgICAgIGlmIChjb25maWcuZG9lc0NvbnRhaW5QdWJzcGVjWWFtbCkge1xuICAgICAgICBnZW5lcmF0ZWQgPSBnZW5lcmF0ZWQucmVwbGFjZUFsbCgvXi5pZGVhXFwvbW9kdWxlcy54bWwkL2dtLCAnIyAuaWRlYS9tb2R1bGVzLnhtbCcpO1xuICAgICAgfVxuICAgIH1cbiAgICBnZW5lcmF0ZWQgPSBnZW5lcmF0ZWQucmVwbGFjZUFsbCgvXi5pZGVhXFwvPyQvZ20sICcjIC5pZGVhJyk7XG4gICAgaWYgKHJvb3RDb25maWcuZGVwZW5kaW5nLnJlYWN0TmF0aXZlIHx8IGNvbmZpZy5kZXBlbmRpbmcucmVhY3ROYXRpdmUgfHwgY29uZmlnLmRvZXNDb250YWluUHVic3BlY1lhbWwpIHtcbiAgICAgIGdlbmVyYXRlZCA9IGdlbmVyYXRlZC5yZXBsYWNlQWxsKC9eKC5pZGVhXFwvLispJC9nbSwgJyQxXFxuYW5kcm9pZC8kMScpO1xuICAgIH1cbiAgICBjb25zdCBuZXdDb250ZW50ID0gaGVhZFVzZXJDb250ZW50ICsgJ1xcbicgKyBnZW5lcmF0ZWQgKyB0YWlsVXNlckNvbnRlbnQ7XG4gICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzVXRpbC5nZW5lcmF0ZUZpbGUoZmlsZVBhdGgsIG5ld0NvbnRlbnQpKTtcbiAgfSk7XG59XG5cbmNvbnN0IGRpclBhdGggPSBwYXRoLmpvaW4ob3MuaG9tZWRpcigpLCAnLmNhY2hlJywgJ3diZnknLCAnZ2l0aWdub3JlJyk7XG5cbmFzeW5jIGZ1bmN0aW9uIHdyaXRlQ2FjaGUobmFtZTogc3RyaW5nLCBjb250ZW50OiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgYXdhaXQgZnMucHJvbWlzZXMubWtkaXIoZGlyUGF0aCwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gIGF3YWl0IGZzLnByb21pc2VzLndyaXRlRmlsZShwYXRoLmpvaW4oZGlyUGF0aCwgbmFtZSksIGNvbnRlbnQpO1xufVxuXG5hc3luYyBmdW5jdGlvbiByZWFkQ2FjaGUobmFtZTogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmcgfCB1bmRlZmluZWQ+IHtcbiAgdHJ5IHtcbiAgICBjb25zdCBzdGF0ID0gYXdhaXQgZnMucHJvbWlzZXMuc3RhdChwYXRoLmpvaW4oZGlyUGF0aCwgbmFtZSkpO1xuICAgIGlmIChEYXRlLm5vdygpIC0gc3RhdC5tdGltZU1zID4gNiAqIDYwICogNjAgKiAxMDAwKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHJldHVybiBhd2FpdCBmcy5wcm9taXNlcy5yZWFkRmlsZShwYXRoLmpvaW4oZGlyUGF0aCwgbmFtZSksICd1dGY4Jyk7XG4gIH0gY2F0Y2gge1xuICAgIC8vIGRvIG5vdGhpbmdcbiAgfVxufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZXh0ZW5zaW9ucyB9IGZyb20gJy4uL3V0aWxzL2V4dGVuc2lvbnMuanMnO1xuaW1wb3J0IHsgZnNVdGlsIH0gZnJvbSAnLi4vdXRpbHMvZnNVdGlsLmpzJztcbmltcG9ydCB7IGRvZXNDb250YWluSmF2YSwgZG9lc0NvbnRhaW5Kc09yVHMgfSBmcm9tICcuLi91dGlscy9wYWNrYWdlQ2FwYWJpbGl0aWVzLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuXG4vLyBLZWVwIHBhY2thZ2UtbWFuYWdlciBzaGltcyBpbiB0aGUgRmlsZSBXYXRjaGVyIHByb2dyYW0gZmllbGQgc28gbm9kZSBkb2VzIG5vdFxuLy8gcGFyc2Ugd3JhcHBlciBzY3JpcHRzIHBhc3NlZCB0aHJvdWdoIGFyZ3VtZW50cy5cbmNvbnN0IG94Zm10UHJvZ3JhbSA9ICckUHJvamVjdEZpbGVEaXIkL25vZGVfbW9kdWxlcy8uYmluL294Zm10JztcbmNvbnN0IHByZXR0aWVyUHJvZ3JhbSA9ICckUHJvamVjdEZpbGVEaXIkL25vZGVfbW9kdWxlcy8uYmluL3ByZXR0aWVyJztcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlSWRlYVNldHRpbmdzKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2dlbmVyYXRlSWRlYVNldHRpbmdzJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IGRpclBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICcuaWRlYScpO1xuICAgIGlmIChmcy5leGlzdHNTeW5jKGRpclBhdGgpKSB7XG4gICAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShkaXJQYXRoLCAnd2F0Y2hlclRhc2tzLnhtbCcpO1xuICAgICAgYXdhaXQgKGRvZXNDb250YWluSnNPclRzKGNvbmZpZykgfHwgZG9lc0NvbnRhaW5KYXZhKGNvbmZpZylcbiAgICAgICAgPyBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnNVdGlsLmdlbmVyYXRlRmlsZShmaWxlUGF0aCwgZ2V0V2F0Y2hlclRhc2tzQ29udGVudChjb25maWcpKSlcbiAgICAgICAgOiBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnMucHJvbWlzZXMucm0oZmlsZVBhdGgsIHsgZm9yY2U6IHRydWUgfSkpKTtcbiAgICB9XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBnZXRXYXRjaGVyVGFza3NDb250ZW50KGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IHN0cmluZyB7XG4gIGNvbnN0IHRhc2tPcHRpb25zID0gW1xuICAgIHtcbiAgICAgIGFyZ3M6ICctLXdyaXRlIC0tbm8tZXJyb3Itb24tdW5tYXRjaGVkLXBhdHRlcm4gISoqL3BhY2thZ2UuanNvbicsXG4gICAgICBjb25kaXRpb246IGRvZXNDb250YWluSnNPclRzKGNvbmZpZyksXG4gICAgICBleHRlbnNpb25zOiBleHRlbnNpb25zLm94Zm10LFxuICAgICAgbmFtZTogJ094Zm10JyxcbiAgICAgIHByb2dyYW06IG94Zm10UHJvZ3JhbSxcbiAgICB9LFxuICAgIHtcbiAgICAgIGFyZ3M6ICctLWNhY2hlIC0td3JpdGUnLFxuICAgICAgY29uZGl0aW9uOiBkb2VzQ29udGFpbkphdmEoY29uZmlnKSxcbiAgICAgIGV4dGVuc2lvbnM6IGV4dGVuc2lvbnMucHJldHRpZXJPbmx5LFxuICAgICAgbmFtZTogJ1ByZXR0aWVyJyxcbiAgICAgIHByb2dyYW06IHByZXR0aWVyUHJvZ3JhbSxcbiAgICB9LFxuICBdXG4gICAgLmZpbHRlcigodGFzaykgPT4gdGFzay5jb25kaXRpb24pXG4gICAgLmZsYXRNYXAoKHRhc2spID0+IHRhc2suZXh0ZW5zaW9ucy5tYXAoKGV4dCkgPT4gY3JlYXRlVGFza09wdGlvbnModGFzay5wcm9ncmFtLCB0YXNrLmFyZ3MsIHRhc2submFtZSwgZXh0KSkpO1xuXG4gIHJldHVybiBgPD94bWwgdmVyc2lvbj1cIjEuMFwiIGVuY29kaW5nPVwiVVRGLThcIj8+XG48cHJvamVjdCB2ZXJzaW9uPVwiNFwiPlxuICA8Y29tcG9uZW50IG5hbWU9XCJQcm9qZWN0VGFza3NPcHRpb25zXCI+XG4gICAgJHt0YXNrT3B0aW9ucy5qb2luKCcnKX1cbiAgPC9jb21wb25lbnQ+XG48L3Byb2plY3Q+XG5gO1xufVxuXG5mdW5jdGlvbiBjcmVhdGVUYXNrT3B0aW9ucyhydW5uZXI6IHN0cmluZywgYXJnczogc3RyaW5nLCBuYW1lOiBzdHJpbmcsIGV4dGVuc2lvbjogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIGAgICAgPFRhc2tPcHRpb25zIGlzRW5hYmxlZD1cInRydWVcIj5cbiAgICAgIDxvcHRpb24gbmFtZT1cImFyZ3VtZW50c1wiIHZhbHVlPVwiJHthcmdzfSAkRmlsZVBhdGhSZWxhdGl2ZVRvUHJvamVjdFJvb3QkXCIgLz5cbiAgICAgIDxvcHRpb24gbmFtZT1cImNoZWNrU3ludGF4RXJyb3JzXCIgdmFsdWU9XCJmYWxzZVwiIC8+XG4gICAgICA8b3B0aW9uIG5hbWU9XCJkZXNjcmlwdGlvblwiIC8+XG4gICAgICA8b3B0aW9uIG5hbWU9XCJleGl0Q29kZUJlaGF2aW9yXCIgdmFsdWU9XCJFUlJPUlwiIC8+XG4gICAgICA8b3B0aW9uIG5hbWU9XCJmaWxlRXh0ZW5zaW9uXCIgdmFsdWU9XCIke2V4dGVuc2lvbn1cIiAvPlxuICAgICAgPG9wdGlvbiBuYW1lPVwiaW1tZWRpYXRlU3luY1wiIHZhbHVlPVwiZmFsc2VcIiAvPlxuICAgICAgPG9wdGlvbiBuYW1lPVwibmFtZVwiIHZhbHVlPVwiJHtuYW1lfSAoLiR7ZXh0ZW5zaW9ufSlcIiAvPlxuICAgICAgPG9wdGlvbiBuYW1lPVwib3V0cHV0XCIgdmFsdWU9XCIkRmlsZVBhdGhSZWxhdGl2ZVRvUHJvamVjdFJvb3QkXCIgLz5cbiAgICAgIDxvcHRpb24gbmFtZT1cIm91dHB1dEZpbHRlcnNcIj5cbiAgICAgICAgPGFycmF5IC8+XG4gICAgICA8L29wdGlvbj5cbiAgICAgIDxvcHRpb24gbmFtZT1cIm91dHB1dEZyb21TdGRvdXRcIiB2YWx1ZT1cImZhbHNlXCIgLz5cbiAgICAgIDxvcHRpb24gbmFtZT1cInByb2dyYW1cIiB2YWx1ZT1cIiR7cnVubmVyfVwiIC8+XG4gICAgICA8b3B0aW9uIG5hbWU9XCJydW5PbkV4dGVybmFsQ2hhbmdlc1wiIHZhbHVlPVwiZmFsc2VcIiAvPlxuICAgICAgPG9wdGlvbiBuYW1lPVwic2NvcGVOYW1lXCIgdmFsdWU9XCJQcm9qZWN0IEZpbGVzXCIgLz5cbiAgICAgIDxvcHRpb24gbmFtZT1cInRyYWNrT25seVJvb3RcIiB2YWx1ZT1cImZhbHNlXCIgLz5cbiAgICAgIDxvcHRpb24gbmFtZT1cIndvcmtpbmdEaXJcIiB2YWx1ZT1cIiRQcm9qZWN0RmlsZURpciRcIiAvPlxuICAgICAgPGVudnMgLz5cbiAgICA8L1Rhc2tPcHRpb25zPlxuYDtcbn1cbiIsImltcG9ydCB0eXBlIHsgUGFja2FnZUpzb24gfSBmcm9tICd0eXBlLWZlc3QnO1xuXG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcblxuZXhwb3J0IGZ1bmN0aW9uIGdldEdlbkkxOG5Uc0NvbW1hbmQoXG4gIGNvbmZpZzogUGljazxQYWNrYWdlQ29uZmlnLCAnZGVwZW5kaW5nJyB8ICdpc0J1bic+LFxuICBzY3JpcHRzOiBQYWNrYWdlSnNvbi5TY3JpcHRzIHwgdW5kZWZpbmVkXG4pOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBpZiAoIWNvbmZpZy5kZXBlbmRpbmcuZ2VuSTE4blRzIHx8ICFzY3JpcHRzPy5bJ2dlbi1pMThuLXRzJ10pIHJldHVybiB1bmRlZmluZWQ7XG4gIHJldHVybiBgJHtjb25maWcuaXNCdW4gPyAnYnVuJyA6ICd5YXJuJ30gcnVuIGdlbi1pMThuLXRzID4gL2Rldi9udWxsYDtcbn1cbiIsImltcG9ydCB0eXBlIHsgU3Bhd25TeW5jT3B0aW9ucyB9IGZyb20gJ25vZGU6Y2hpbGRfcHJvY2Vzcyc7XG5pbXBvcnQgY2hpbGRfcHJvY2VzcyBmcm9tICdub2RlOmNoaWxkX3Byb2Nlc3MnO1xuXG5leHBvcnQgZnVuY3Rpb24gc3Bhd25TeW5jKGNvbW1hbmQ6IHN0cmluZywgYXJnczogc3RyaW5nW10sIGN3ZDogc3RyaW5nLCByZXRyeSA9IDApOiB2b2lkIHtcbiAgc3Bhd25TeW5jQW5kUmV0dXJuU3RhdHVzKGNvbW1hbmQsIGFyZ3MsIGN3ZCwgcmV0cnkpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gc3Bhd25TeW5jQW5kUmV0dXJuU3RhdHVzKGNvbW1hbmQ6IHN0cmluZywgYXJnczogc3RyaW5nW10sIGN3ZDogc3RyaW5nLCByZXRyeSA9IDApOiBudW1iZXIge1xuICBkbyB7XG4gICAgY29uc3QgW25ld0NtZCwgbmV3QXJncywgb3B0aW9uc10gPSBnZXRTcGF3blN5bmNBcmdzKGNvbW1hbmQsIGFyZ3MsIGN3ZCk7XG4gICAgY29uc29sZS5sb2coYCQgJHtuZXdDbWR9ICR7bmV3QXJncy5qb2luKCcgJyl9IGF0ICR7Y3dkfWApO1xuICAgIGNvbnN0IHJldCA9IGNoaWxkX3Byb2Nlc3Muc3Bhd25TeW5jKG5ld0NtZCwgbmV3QXJncywgb3B0aW9ucyk7XG4gICAgY29uc3Qgc3RhdHVzID0gcmV0LnN0YXR1cyA/PyAxO1xuICAgIGlmIChzdGF0dXMgPT09IDApIGJyZWFrO1xuICAgIGlmIChyZXRyeSA8PSAwKSByZXR1cm4gc3RhdHVzO1xuICB9IHdoaWxlICgtLXJldHJ5ID49IDApO1xuICByZXR1cm4gMDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHNwYXduU3luY0FuZFJldHVyblN0ZG91dChjb21tYW5kOiBzdHJpbmcsIGFyZ3M6IHN0cmluZ1tdLCBjd2Q6IHN0cmluZyk6IHN0cmluZyB7XG4gIGNvbnN0IFtuZXdDbWQsIG5ld0FyZ3MsIG9wdGlvbnNdID0gZ2V0U3Bhd25TeW5jQXJncyhjb21tYW5kLCBhcmdzLCBjd2QpO1xuICBvcHRpb25zLnN0ZGlvID0gJ3BpcGUnO1xuICBjb25zdCBwcm9jID0gY2hpbGRfcHJvY2Vzcy5zcGF3blN5bmMobmV3Q21kLCBuZXdBcmdzLCBvcHRpb25zKTtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bm5lY2Vzc2FyeS1jb25kaXRpb24gLS0gc3Bhd25TeW5jIHJldHVybnMgbnVsbCBzdGRlcnIgb24gRU5PRU5ULlxuICBjb25zdCBzdGRlcnIgPSBwcm9jLnN0ZGVyciA/PyAnJztcbiAgY29uc3QgZXJyb3IgPSB0eXBlb2Ygc3RkZXJyID09PSAnc3RyaW5nJyA/IHN0ZGVyci50cmltKCkgOiBzdGRlcnIudG9TdHJpbmcoKS50cmltKCk7XG4gIGlmIChwcm9jLmVycm9yKSB7XG4gICAgY29uc29sZS5lcnJvcihgJHtuZXdDbWR9IFske25ld0FyZ3MubWFwKChzKSA9PiBgXCIke3N9XCJgKS5qb2luKCcsICcpfV0gZmFpbGVkIHdpdGg6ICR7cHJvYy5lcnJvci5tZXNzYWdlfWApO1xuICB9IGVsc2UgaWYgKGVycm9yKSB7XG4gICAgY29uc29sZS5lcnJvcihcbiAgICAgIGAke25ld0NtZH0gWyR7bmV3QXJncy5tYXAoKHMpID0+IGBcIiR7c31cImApLmpvaW4oJywgJyl9XSBvdXRwdXRzIHRoZSBmb2xsb3dpbmcgY29udGVudCB0byBzdGRlcnI6XFxuJHtlcnJvcn1gXG4gICAgKTtcbiAgfVxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVubmVjZXNzYXJ5LWNvbmRpdGlvbiAtLSBzcGF3blN5bmMgcmV0dXJucyBudWxsIHN0ZG91dCBvbiBFTk9FTlQuXG4gIGNvbnN0IHN0ZG91dCA9IHByb2Muc3Rkb3V0ID8/ICcnO1xuICByZXR1cm4gdHlwZW9mIHN0ZG91dCA9PT0gJ3N0cmluZycgPyBzdGRvdXQudHJpbSgpIDogc3Rkb3V0LnRvU3RyaW5nKCkudHJpbSgpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0U3Bhd25TeW5jQXJncyhjb21tYW5kOiBzdHJpbmcsIGFyZ3M6IHN0cmluZ1tdLCBjd2Q6IHN0cmluZyk6IFtzdHJpbmcsIHN0cmluZ1tdLCBTcGF3blN5bmNPcHRpb25zXSB7XG4gIGNvbnN0IGVudiA9IHsgLi4ucHJvY2Vzcy5lbnYgfTtcbiAgLy8gUmVtb3ZlIGJlcnJ5IGZyb20gUEFUSFxuICBpZiAoZW52LlBBVEggJiYgZW52LkJFUlJZX0JJTl9GT0xERVIpIHtcbiAgICBlbnYuUEFUSCA9IGVudi5QQVRILnNwbGl0KCc6JylcbiAgICAgIC5maWx0ZXIoKHApID0+IHAgIT09IGVudi5CRVJSWV9CSU5fRk9MREVSKVxuICAgICAgLmpvaW4oJzonKTtcbiAgfVxuXG4gIHJldHVybiBbXG4gICAgY29tbWFuZCxcbiAgICBhcmdzLFxuICAgIHtcbiAgICAgIGN3ZCxcbiAgICAgIGVudixcbiAgICAgIGVuY29kaW5nOiAndXRmOCcsXG4gICAgICBzaGVsbDogZmFsc2UsXG4gICAgICBzdGRpbzogJ2luaGVyaXQnLFxuICAgIH0sXG4gIF07XG59XG4iLCJpbXBvcnQgY2hpbGRQcm9jZXNzIGZyb20gJ25vZGU6Y2hpbGRfcHJvY2Vzcyc7XG5cbmltcG9ydCB7IE9jdG9raXQgfSBmcm9tICdAb2N0b2tpdC9jb3JlJztcblxuY2xhc3MgR2l0SHViVXRpbCB7XG4gIGdldE9yZ0FuZE5hbWUodXJsT3JGdWxsTmFtZTogc3RyaW5nKTogW3N0cmluZywgc3RyaW5nXSB7XG4gICAgY29uc3QgdXJsV2l0aG91dFByb3RvY29sID0gdXJsT3JGdWxsTmFtZS5zcGxpdCgnOicpLmF0KC0xKTtcbiAgICBjb25zdCBuYW1lcyA9IHVybFdpdGhvdXRQcm90b2NvbD8uc3BsaXQoJy8nKTtcbiAgICBjb25zdCBvcmcgPSBuYW1lcz8uYXQoLTIpID8/ICcnO1xuICAgIGNvbnN0IG5hbWUgPSBuYW1lcz8uYXQoLTEpPy5yZXBsYWNlKC8uZ2l0JC8sICcnKSA/PyAnJztcbiAgICByZXR1cm4gW29yZywgbmFtZV07XG4gIH1cbn1cbmV4cG9ydCBjb25zdCBnaXRIdWJVdGlsID0gbmV3IEdpdEh1YlV0aWwoKTtcblxuY29uc3Qgb2N0b2tpdENhY2hlID0gbmV3IE1hcDxzdHJpbmcsIE9jdG9raXQ+KCk7XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRPY3Rva2l0KG93bmVyPzogc3RyaW5nKTogT2N0b2tpdCB7XG4gIGNvbnN0IGtleSA9IG93bmVyID8/ICcnO1xuICBjb25zdCBjYWNoZWQgPSBvY3Rva2l0Q2FjaGUuZ2V0KGtleSk7XG4gIGlmIChjYWNoZWQpIHJldHVybiBjYWNoZWQ7XG5cbiAgY29uc3Qgb2N0b2tpdCA9IG5ldyBPY3Rva2l0KHtcbiAgICBhdXRoOiBnZXRHaXRIdWJUb2tlbihvd25lcikgfHwgdW5kZWZpbmVkLFxuICB9KTtcbiAgb2N0b2tpdENhY2hlLnNldChrZXksIG9jdG9raXQpO1xuICByZXR1cm4gb2N0b2tpdDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGhhc0dpdEh1YlRva2VuKG93bmVyOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgcmV0dXJuICEhZ2V0R2l0SHViVG9rZW4ob3duZXIpO1xufVxuXG5mdW5jdGlvbiBnZXRHaXRIdWJUb2tlbihvd25lcj86IHN0cmluZyk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGlmIChvd25lciA9PT0gJ1dpbGxCb29zdGVyJykge1xuICAgIHJldHVybiBwcm9jZXNzLmVudi5HSF9CT1RfUEFUX0ZPUl9XSUxMQk9PU1RFUiB8fCBnZXRHaXRIdWJDbGlUb2tlbigpO1xuICB9XG4gIGlmIChvd25lciA9PT0gJ1dpbGxCb29zdGVyTGFiJykge1xuICAgIHJldHVybiBwcm9jZXNzLmVudi5HSF9CT1RfUEFUX0ZPUl9XSUxMQk9PU1RFUkxBQiB8fCBnZXRHaXRIdWJDbGlUb2tlbigpO1xuICB9XG4gIHJldHVybiAoXG4gICAgcHJvY2Vzcy5lbnYuR0hfQk9UX1BBVF9GT1JfV0lMTEJPT1NURVIgfHxcbiAgICBwcm9jZXNzLmVudi5HSF9CT1RfUEFUX0ZPUl9XSUxMQk9PU1RFUkxBQiB8fFxuICAgIHByb2Nlc3MuZW52LkdIX1RPS0VOIHx8XG4gICAgcHJvY2Vzcy5lbnYuR0lUSFVCX1RPS0VOIHx8XG4gICAgZ2V0R2l0SHViQ2xpVG9rZW4oKVxuICApO1xufVxuXG5sZXQgZ2l0SHViQ2xpVG9rZW46IHN0cmluZyB8IHVuZGVmaW5lZDtcblxuZnVuY3Rpb24gZ2V0R2l0SHViQ2xpVG9rZW4oKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgaWYgKGdpdEh1YkNsaVRva2VuICE9PSB1bmRlZmluZWQpIHJldHVybiBnaXRIdWJDbGlUb2tlbiB8fCB1bmRlZmluZWQ7XG5cbiAgdHJ5IHtcbiAgICAvLyBTb21lIGxvY2FsIHJ1bnMgcmVseSBvbiBHaXRIdWIgQ0xJIGF1dGhlbnRpY2F0aW9uIGluc3RlYWQgb2YgZXhwb3J0ZWQgZW52IHRva2Vucy5cbiAgICBnaXRIdWJDbGlUb2tlbiA9XG4gICAgICBjaGlsZFByb2Nlc3NcbiAgICAgICAgLmV4ZWNGaWxlU3luYygnZ2gnLCBbJ2F1dGgnLCAndG9rZW4nXSwge1xuICAgICAgICAgIGVuY29kaW5nOiAndXRmOCcsXG4gICAgICAgICAgc3RkaW86IFsnaWdub3JlJywgJ3BpcGUnLCAnaWdub3JlJ10sXG4gICAgICAgIH0pXG4gICAgICAgIC50cmltKCkgfHwgJyc7XG4gIH0gY2F0Y2gge1xuICAgIGdpdEh1YkNsaVRva2VuID0gJyc7XG4gIH1cbiAgcmV0dXJuIGdpdEh1YkNsaVRva2VuIHx8IHVuZGVmaW5lZDtcbn1cbiIsImltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuXG5leHBvcnQgY29uc3QgbWFuYWdlZFRzY29uZmlnQmFzZURlcGVuZGVuY2llcyA9IFtcbiAgJ0B0c2NvbmZpZy9idW4nLFxuICAnQHRzY29uZmlnL25vZGUtbHRzJyxcbiAgJ0B0c2NvbmZpZy9ub2RlLXRzJyxcbiAgJ0B0c2NvbmZpZy9yZWFjdC1uYXRpdmUnLFxuXTtcblxuZXhwb3J0IGZ1bmN0aW9uIGdldFRzY29uZmlnRXh0ZW5kcyhjb25maWc6IFBhY2thZ2VDb25maWcpOiBzdHJpbmcgfCBzdHJpbmdbXSB7XG4gIGlmIChjb25maWcuaXNCdW4pIHtcbiAgICByZXR1cm4gJ0B0c2NvbmZpZy9idW4vdHNjb25maWcuanNvbic7XG4gIH1cbiAgaWYgKGNvbmZpZy5kZXBlbmRpbmcucmVhY3ROYXRpdmUpIHtcbiAgICByZXR1cm4gJ0B0c2NvbmZpZy9yZWFjdC1uYXRpdmUvdHNjb25maWcuanNvbic7XG4gIH1cbiAgcmV0dXJuIFsnQHRzY29uZmlnL25vZGUtbHRzL3RzY29uZmlnLmpzb24nLCAnQHRzY29uZmlnL25vZGUtdHMvdHNjb25maWcuanNvbiddO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0VHNjb25maWdCYXNlRGVwZW5kZW5jaWVzKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IHN0cmluZ1tdIHtcbiAgaWYgKGNvbmZpZy5kZXBlbmRpbmcuYmxpdHogfHwgY29uZmlnLmRlcGVuZGluZy5uZXh0KSB7XG4gICAgcmV0dXJuIFtdO1xuICB9XG4gIGlmIChjb25maWcuaXNCdW4pIHtcbiAgICByZXR1cm4gWydAdHNjb25maWcvYnVuJ107XG4gIH1cbiAgaWYgKGNvbmZpZy5kZXBlbmRpbmcucmVhY3ROYXRpdmUpIHtcbiAgICByZXR1cm4gWydAdHNjb25maWcvcmVhY3QtbmF0aXZlJ107XG4gIH1cbiAgcmV0dXJuIFsnQHRzY29uZmlnL25vZGUtbHRzJywgJ0B0c2NvbmZpZy9ub2RlLXRzJ107XG59XG4iLCJpbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcblxuZXhwb3J0IGZ1bmN0aW9uIGlzUHVibGlzaGVkV2lsbGJvb3N0ZXJDb25maWdzUGFja2FnZShjb25maWc6IFBhY2thZ2VDb25maWcpOiBib29sZWFuIHtcbiAgcmV0dXJuIChcbiAgICBjb25maWcuaXNXaWxsQm9vc3RlckNvbmZpZ3MgJiZcbiAgICAhY29uZmlnLmlzUm9vdCAmJlxuICAgIGNvbmZpZy5wYWNrYWdlSnNvbj8ucHJpdmF0ZSAhPT0gdHJ1ZSAmJlxuICAgIEFycmF5LmlzQXJyYXkoY29uZmlnLnBhY2thZ2VKc29uPy5maWxlcykgJiZcbiAgICBjb25maWcucGFja2FnZUpzb24uZmlsZXMubGVuZ3RoID4gMFxuICApO1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcbmltcG9ydCB7IGZpbGVVUkxUb1BhdGggfSBmcm9tICdub2RlOnVybCc7XG5cbmltcG9ydCBtZXJnZSBmcm9tICdkZWVwbWVyZ2UnO1xuaW1wb3J0IGZnIGZyb20gJ2Zhc3QtZ2xvYic7XG5pbXBvcnQgc2VtdmVyIGZyb20gJ3NlbXZlcic7XG5pbXBvcnQgeyBzb3J0UGFja2FnZUpzb24gfSBmcm9tICdzb3J0LXBhY2thZ2UtanNvbic7XG5pbXBvcnQgdHMgZnJvbSAndHlwZXNjcmlwdCc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VKc29uLCBTZXRSZXF1aXJlZCB9IGZyb20gJ3R5cGUtZmVzdCc7XG5cbmltcG9ydCB7IGdldExhdGVzdENvbW1pdEhhc2ggfSBmcm9tICcuLi9naXRodWIvY29tbWl0LmpzJztcbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGV4dGVuc2lvbnMgfSBmcm9tICcuLi91dGlscy9leHRlbnNpb25zLmpzJztcbmltcG9ydCB7IGZzVXRpbCB9IGZyb20gJy4uL3V0aWxzL2ZzVXRpbC5qcyc7XG5pbXBvcnQgeyBnZXRHZW5JMThuVHNDb21tYW5kIH0gZnJvbSAnLi4vdXRpbHMvZ2VuSTE4blRzLmpzJztcbmltcG9ydCB7IGdpdEh1YlV0aWwgfSBmcm9tICcuLi91dGlscy9naXRodWJVdGlsLmpzJztcbmltcG9ydCB7IGdsb2JJZ25vcmUgfSBmcm9tICcuLi91dGlscy9nbG9iVXRpbC5qcyc7XG5pbXBvcnQgeyBpZ25vcmVGaWxlVXRpbCB9IGZyb20gJy4uL3V0aWxzL2lnbm9yZUZpbGVVdGlsLmpzJztcbmltcG9ydCB7IGNvbWJpbmVNZXJnZSB9IGZyb20gJy4uL3V0aWxzL21lcmdlVXRpbC5qcyc7XG5pbXBvcnQgeyBkb2VzQ29udGFpbkphdmEsIGRvZXNDb250YWluSnNPclRzIH0gZnJvbSAnLi4vdXRpbHMvcGFja2FnZUNhcGFiaWxpdGllcy5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcbmltcG9ydCB7IHNwYXduU3luYywgc3Bhd25TeW5jQW5kUmV0dXJuU3Rkb3V0IH0gZnJvbSAnLi4vdXRpbHMvc3Bhd25VdGlsLmpzJztcbmltcG9ydCB7IGdldFRzY29uZmlnQmFzZURlcGVuZGVuY2llcywgbWFuYWdlZFRzY29uZmlnQmFzZURlcGVuZGVuY2llcyB9IGZyb20gJy4uL3V0aWxzL3RzY29uZmlnQmFzZS5qcyc7XG5pbXBvcnQgeyBpc1B1Ymxpc2hlZFdpbGxib29zdGVyQ29uZmlnc1BhY2thZ2UgfSBmcm9tICcuLi91dGlscy93aWxsYm9vc3RlckNvbmZpZ3NVdGlsLmpzJztcblxuY29uc3Qgb3hsaW50RGVwcyA9IFsnQHdpbGxib29zdGVyL294Zm10LWNvbmZpZycsICdAd2lsbGJvb3N0ZXIvb3hsaW50LWNvbmZpZycsICdveGZtdCcsICdveGxpbnQnLCAnb3hsaW50LXRzZ29saW50J107XG5jb25zdCB0eXBlc2NyaXB0R29EZXBlbmRlbmN5ID0gJ0B0eXBlc2NyaXB0L25hdGl2ZS1wcmV2aWV3JztcbmNvbnN0IHR5cGVzY3JpcHREZXBlbmRlbmN5ID0gJ3R5cGVzY3JpcHQnO1xuY29uc3Qgd2JEZXBlbmRlbmN5ID0gJ0B3aWxsYm9vc3Rlci93Yic7XG5jb25zdCBidWlsZFRzRGVwZW5kZW5jeSA9ICdidWlsZC10cyc7XG5jb25zdCB3YmZ5UGFja2FnZUpzb24gPSByZWFkV2JmeVBhY2thZ2VKc29uKCk7XG5jb25zdCBtYW5hZ2VkRGVwZW5kZW5jeVZlcnNpb25zID0ge1xuICAuLi53YmZ5UGFja2FnZUpzb24uZGVwZW5kZW5jaWVzLFxuICAuLi53YmZ5UGFja2FnZUpzb24uZGV2RGVwZW5kZW5jaWVzLFxuICAuLi53YmZ5UGFja2FnZUpzb24ucGVlckRlcGVuZGVuY2llcyxcbn07XG5jb25zdCBiYXNlbGluZU1hbmFnZWREZXBlbmRlbmNpZXMgPSBuZXcgU2V0KFt3YkRlcGVuZGVuY3ksIGJ1aWxkVHNEZXBlbmRlbmN5LCAuLi5veGxpbnREZXBzXSk7XG5jb25zdCB3aWxsQm9vc3RlckNvbmZpZ3NNYW5hZ2VkRGVwZW5kZW5jaWVzID0gW1xuICAnQHdpbGxib29zdGVyL3ByZXR0aWVyLWNvbmZpZycsXG4gIC4uLm94bGludERlcHMuZmlsdGVyKChkZXBlbmRlbmN5KSA9PiBkZXBlbmRlbmN5LnN0YXJ0c1dpdGgoJ0B3aWxsYm9vc3Rlci8nKSksXG5dO1xuY29uc3Qgb2Jzb2xldGVMaW50RGVwZW5kZW5jaWVzID0gW1xuICAnQGJpb21lanMvYmlvbWUnLFxuICAnQGVzbGludC1yZWFjdC9lc2xpbnQtcGx1Z2luJyxcbiAgJ0Blc2xpbnQvanMnLFxuICAnQG5leHQvZXNsaW50LXBsdWdpbi1uZXh0JyxcbiAgJ0B0eXBlcy9lc2xpbnQnLFxuICAnQHR5cGVzL21pY3JvbWF0Y2gnLFxuICAnQHR5cGVzY3JpcHQtZXNsaW50L2VzbGludC1wbHVnaW4nLFxuICAnQHR5cGVzY3JpcHQtZXNsaW50L3BhcnNlcicsXG4gICdAd2lsbGJvb3N0ZXIvYmlvbWUtY29uZmlnJyxcbiAgJ0B3aWxsYm9vc3Rlci9lc2xpbnQtY29uZmlnJyxcbiAgJ0B3aWxsYm9vc3Rlci9lc2xpbnQtY29uZmlnLWJsaXR6LW5leHQnLFxuICAnQHdpbGxib29zdGVyL2VzbGludC1jb25maWctanMnLFxuICAnQHdpbGxib29zdGVyL2VzbGludC1jb25maWctanMtcmVhY3QnLFxuICAnQHdpbGxib29zdGVyL2VzbGludC1jb25maWctbmV4dCcsXG4gICdAd2lsbGJvb3N0ZXIvZXNsaW50LWNvbmZpZy1yZWFjdCcsXG4gICdAd2lsbGJvb3N0ZXIvZXNsaW50LWNvbmZpZy10cycsXG4gICdAd2lsbGJvb3N0ZXIvZXNsaW50LWNvbmZpZy10cy1yZWFjdCcsXG4gICdiaW9tZScsXG4gICdlc2xpbnQnLFxuICAnZXNsaW50LWNvbmZpZy1mbGF0LWdpdGlnbm9yZScsXG4gICdlc2xpbnQtY29uZmlnLW5leHQnLFxuICAnZXNsaW50LWNvbmZpZy1wcmV0dGllcicsXG4gICdlc2xpbnQtaW1wb3J0LXJlc29sdmVyLW5vZGUnLFxuICAnZXNsaW50LWltcG9ydC1yZXNvbHZlci10eXBlc2NyaXB0JyxcbiAgJ2VzbGludC1wbHVnaW4taW1wb3J0JyxcbiAgJ2VzbGludC1wbHVnaW4taW1wb3J0LXgnLFxuICAnZXNsaW50LXBsdWdpbi1wZXJmZWN0aW9uaXN0JyxcbiAgJ2VzbGludC1wbHVnaW4tcHJldHRpZXInLFxuICAnZXNsaW50LXBsdWdpbi1yZWFjdCcsXG4gICdlc2xpbnQtcGx1Z2luLXJlYWN0LWNvbXBpbGVyJyxcbiAgJ2VzbGludC1wbHVnaW4tcmVhY3QtaG9va3MnLFxuICAnZXNsaW50LXBsdWdpbi1zb3J0LWNsYXNzLW1lbWJlcnMnLFxuICAnZXNsaW50LXBsdWdpbi1zb3J0LWRlc3RydWN0dXJlLWtleXMnLFxuICAnZXNsaW50LXBsdWdpbi1zdG9yeWJvb2snLFxuICAnZXNsaW50LXBsdWdpbi11bmljb3JuJyxcbiAgJ2VzbGludC1wbHVnaW4tdW51c2VkLWltcG9ydHMnLFxuICAnZ2xvYmFscycsXG4gICdtaWNyb21hdGNoJyxcbiAgJ3R5cGVzY3JpcHQtZXNsaW50Jyxcbl07XG5jb25zdCBtaWNyb21hdGNoUGFja2FnZU5hbWVzID0gbmV3IFNldChbJ21pY3JvbWF0Y2gnLCAnQHR5cGVzL21pY3JvbWF0Y2gnXSk7XG5jb25zdCBtaWNyb21hdGNoSW1wb3J0UGF0dGVybiA9XG4gIC9cXGJmcm9tXFxzK1snXCJdbWljcm9tYXRjaFsnXCJdfFxcYnJlcXVpcmVcXChcXHMqWydcIl1taWNyb21hdGNoWydcIl1cXHMqXFwpfFxcYmltcG9ydFxcKFxccypbJ1wiXW1pY3JvbWF0Y2hbJ1wiXVxccypcXCkvdTtcblxuY29uc3QgbGF0ZXN0RGVwZW5kZW5jeVZlcnNpb25DYWNoZSA9IG5ldyBNYXA8c3RyaW5nLCBzdHJpbmc+KCk7XG5jb25zdCBkZXBlbmRlbmN5U2VjdGlvbktleXMgPSBbJ2RlcGVuZGVuY2llcycsICdkZXZEZXBlbmRlbmNpZXMnLCAnb3B0aW9uYWxEZXBlbmRlbmNpZXMnLCAncGVlckRlcGVuZGVuY2llcyddIGFzIGNvbnN0O1xuXG50eXBlIFdyaXRhYmxlUGFja2FnZUpzb24gPSBTZXRSZXF1aXJlZDxcbiAgUGFja2FnZUpzb24sXG4gICdzY3JpcHRzJyB8ICdkZXBlbmRlbmNpZXMnIHwgJ2RldkRlcGVuZGVuY2llcycgfCAncGVlckRlcGVuZGVuY2llcydcbj47XG5cbmludGVyZmFjZSBEZXBlbmRlbmN5VXBkYXRlcyB7XG4gIGRlcGVuZGVuY2llczogc3RyaW5nW107XG4gIGRldkRlcGVuZGVuY2llczogc3RyaW5nW107XG4gIHB5dGhvbkRldkRlcGVuZGVuY2llczogc3RyaW5nW107XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZW5lcmF0ZVBhY2thZ2VKc29uKFxuICBjb25maWc6IFBhY2thZ2VDb25maWcsXG4gIHJvb3RDb25maWc6IFBhY2thZ2VDb25maWcsXG4gIHNraXBBZGRpbmdEZXBzOiBib29sZWFuXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdnZW5lcmF0ZVBhY2thZ2VKc29uJywgYXN5bmMgKCkgPT4ge1xuICAgIGF3YWl0IGNvcmUoY29uZmlnLCByb290Q29uZmlnLCBza2lwQWRkaW5nRGVwcyk7XG4gIH0pO1xufVxuXG5hc3luYyBmdW5jdGlvbiBjb3JlKGNvbmZpZzogUGFja2FnZUNvbmZpZywgcm9vdENvbmZpZzogUGFja2FnZUNvbmZpZywgc2tpcEFkZGluZ0RlcHM6IGJvb2xlYW4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgZmlsZVBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICdwYWNrYWdlLmpzb24nKTtcbiAgY29uc3QganNvbk9iaiA9IGF3YWl0IHJlYWRQYWNrYWdlSnNvbihmaWxlUGF0aCk7XG4gIGNvbnN0IHBhY2thZ2VNYW5hZ2VyID0gY29uZmlnLmlzQnVuID8gJ2J1bicgOiAneWFybic7XG5cbiAgYXdhaXQgcmVtb3ZlRGVwcmVjYXRlZFN0dWZmKGNvbmZpZywganNvbk9iaik7XG4gIGF3YWl0IHVwZGF0ZVNjcmlwdHMoY29uZmlnLCBqc29uT2JqKTtcbiAgbW92ZU1hbmFnZWRUb29sRGVwZW5kZW5jaWVzVG9EZXZEZXBlbmRlbmNpZXMoanNvbk9iaik7XG4gIGNvbnN0IGRlcGVuZGVuY3lVcGRhdGVzID0gYXdhaXQgYXBwbHlQYWNrYWdlSnNvbkNvbnZlbnRpb25zKGNvbmZpZywgcm9vdENvbmZpZywganNvbk9iaik7XG4gIGF3YWl0IG5vcm1hbGl6ZVBhY2thZ2VNZXRhZGF0YShjb25maWcsIHJvb3RDb25maWcsIGpzb25PYmosIGRlcGVuZGVuY3lVcGRhdGVzKTtcbiAgYWRkRGVwZW5kZW5jeVZlcnNpb25zVG9QYWNrYWdlSnNvbihqc29uT2JqLCBkZXBlbmRlbmN5VXBkYXRlcyk7XG4gIGF3YWl0IHVwZGF0ZVByaXZhdGVQYWNrYWdlcyhqc29uT2JqKTtcbiAgcmVtb3ZlRW1wdHlEZXBlbmRlbmN5U2VjdGlvbnMoanNvbk9iaik7XG5cbiAgaWYgKGNvbmZpZy5pc0J1bikgZGVsZXRlIGpzb25PYmoucGFja2FnZU1hbmFnZXI7XG4gIC8vIFlhcm4gcmVhZHMgcGFja2FnZS5qc29uIGZyb20gZGlzayBiZWZvcmUgZGVjaWRpbmcgd2hldGhlciBgeWFybiBhZGQgLURgXG4gIC8vIGNvbmZsaWN0cyB3aXRoIGFuIGV4aXN0aW5nIHJlZ3VsYXIgZGVwZW5kZW5jeSwgc28gdGhpcyB3cml0ZSBtdXN0IGZpbmlzaFxuICAvLyBiZWZvcmUgaW5zdGFsbGluZyB0aGUgbWFuYWdlZCBkZXBlbmRlbmN5IHVwZGF0ZXMgYmVsb3cuIEtlZXAgdGhpcyBiYXNlbGluZVxuICAvLyBmaWxlIHNvcnRlZCBldmVuIHdoZW4gd2UgbGF0ZXIgcnVuIHRoZSB0YXJnZXQgcmVwb3NpdG9yeSdzIGZvcm1hdHRlciBzbyBhXG4gIC8vIG1pZC1ydW4gaW50ZXJydXB0aW9uIG5ldmVyIGxlYXZlcyBwYWNrYWdlLmpzb24gaW4gYSBwYXJ0aWFsbHkgbWFuYWdlZCBvcmRlci5cbiAgYXdhaXQgZnNVdGlsLmdlbmVyYXRlRmlsZShmaWxlUGF0aCwgc2VyaWFsaXplUGFja2FnZUpzb24oanNvbk9iaikpO1xuXG4gIGlmICghc2tpcEFkZGluZ0RlcHMpIHtcbiAgICBpbnN0YWxsRGVwZW5kZW5jeVVwZGF0ZXMoY29uZmlnLCBqc29uT2JqLCBkZXBlbmRlbmN5VXBkYXRlcywgcGFja2FnZU1hbmFnZXIpO1xuICAgIGZvcm1hdFBhY2thZ2VKc29uV2l0aFByb2plY3RGb3JtYXR0ZXIoY29uZmlnLCBwYWNrYWdlTWFuYWdlciwgZmlsZVBhdGgpO1xuICB9XG59XG5cbmZ1bmN0aW9uIHNlcmlhbGl6ZVBhY2thZ2VKc29uKGpzb25PYmo6IFdyaXRhYmxlUGFja2FnZUpzb24pOiBzdHJpbmcge1xuICAvLyBmc1V0aWwuZ2VuZXJhdGVGaWxlKCkgbm9ybWFsaXplcyB0aGUgdHJhaWxpbmcgbmV3bGluZSwgc28ga2VlcCB0aGUgc2VyaWFsaXplclxuICAvLyBmb2N1c2VkIG9uIHRoZSBKU09OIHBheWxvYWQgaXRzZWxmLlxuICByZXR1cm4gSlNPTi5zdHJpbmdpZnkoc29ydFBhY2thZ2VKc29uKGpzb25PYmopLCB1bmRlZmluZWQsIDIpO1xufVxuXG5hc3luYyBmdW5jdGlvbiByZWFkUGFja2FnZUpzb24oZmlsZVBhdGg6IHN0cmluZyk6IFByb21pc2U8V3JpdGFibGVQYWNrYWdlSnNvbj4ge1xuICBjb25zdCBqc29uVGV4dCA9IGF3YWl0IGZzLnByb21pc2VzLnJlYWRGaWxlKGZpbGVQYXRoLCAndXRmOCcpO1xuICBjb25zdCBqc29uT2JqID0gSlNPTi5wYXJzZShqc29uVGV4dCkgYXMgUGFja2FnZUpzb247XG4gIGpzb25PYmouc2NyaXB0cyA9IGpzb25PYmouc2NyaXB0cyA/PyB7fTtcbiAganNvbk9iai5kZXBlbmRlbmNpZXMgPSBqc29uT2JqLmRlcGVuZGVuY2llcyA/PyB7fTtcbiAganNvbk9iai5kZXZEZXBlbmRlbmNpZXMgPSBqc29uT2JqLmRldkRlcGVuZGVuY2llcyA/PyB7fTtcbiAganNvbk9iai5wZWVyRGVwZW5kZW5jaWVzID0ganNvbk9iai5wZWVyRGVwZW5kZW5jaWVzID8/IHt9O1xuICByZXR1cm4ganNvbk9iaiBhcyBXcml0YWJsZVBhY2thZ2VKc29uO1xufVxuXG5hc3luYyBmdW5jdGlvbiB1cGRhdGVTY3JpcHRzKGNvbmZpZzogUGFja2FnZUNvbmZpZywganNvbk9iajogV3JpdGFibGVQYWNrYWdlSnNvbik6IFByb21pc2U8dm9pZD4ge1xuICByZW1vdmVMZWdhY3lJbnN0YWxsQ29tbWFuZHMoanNvbk9iai5zY3JpcHRzKTtcblxuICBqc29uT2JqLnNjcmlwdHMgPSB7IC4uLmpzb25PYmouc2NyaXB0cywgLi4uZ2VuZXJhdGVTY3JpcHRzKGNvbmZpZywganNvbk9iai5zY3JpcHRzKSB9O1xuICBkZWxldGUganNvbk9iai5zY3JpcHRzWydzdGFydC10ZXN0LXNlcnZlciddO1xuXG4gIGNvbnN0IHNjcmlwdHMgPSBqc29uT2JqLnNjcmlwdHM7XG4gIGlmIChjb25maWcuaXNCdW4gfHwgIWRvZXNDb250YWluSmF2YShjb25maWcpKSB7XG4gICAgZGVsZXRlIHNjcmlwdHMucHJldHRpZnk7XG4gIH0gZWxzZSB7XG4gICAgc2NyaXB0cy5wcmV0dGlmeSA9IChzY3JpcHRzLnByZXR0aWZ5ID8/ICcnKSArIChhd2FpdCBnZW5lcmF0ZVByZXR0aWVyU3VmZml4KGNvbmZpZy5kaXJQYXRoKSk7XG4gIH1cbiAgbm9ybWFsaXplWWFybldvcmtzcGFjZUZvcmVhY2hTY3JpcHRzKHNjcmlwdHMpO1xuICBub3JtYWxpemVSYWlsd2F5Q2xpU2NyaXB0KGNvbmZpZywgc2NyaXB0cyk7XG59XG5cbmZ1bmN0aW9uIHJlbW92ZUxlZ2FjeUluc3RhbGxDb21tYW5kcyhzY3JpcHRzOiBQYWNrYWdlSnNvbi5TY3JpcHRzKTogdm9pZCB7XG4gIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKHNjcmlwdHMpKSB7XG4gICAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gJ3N0cmluZycpIGNvbnRpbnVlO1xuICAgIC8vIEZyZXNoIHJlcG9zIHN0aWxsIHJlcXVpcmUgc3RhbmRhbG9uZSBgeWFybiBpbnN0YWxsYDsgb25seSByZW1vdmUgbGVnYWN5IGluc3RhbGwgcHJlZml4ZXMgYmVmb3JlIGFub3RoZXIgY29tbWFuZC5cbiAgICBpZiAoIXZhbHVlLmluY2x1ZGVzKCdnaXQgY2xvbmUnKSkge1xuICAgICAgc2NyaXB0c1trZXldID0gdmFsdWUucmVwbGFjZUFsbCgveWFyblxccyooPzppbnN0YWxsXFxzKik/JiZcXHMqL2d1LCAnJyk7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIG5vcm1hbGl6ZVlhcm5Xb3Jrc3BhY2VGb3JlYWNoU2NyaXB0cyhzY3JpcHRzOiBQYWNrYWdlSnNvbi5TY3JpcHRzKTogdm9pZCB7XG4gIC8vIERlYWwgd2l0aCBicmVha2luZyBjaGFuZ2VzIGluIHlhcm4gYmVycnkgNC4wLjAtcmMuNDlcbiAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMoc2NyaXB0cykpIHtcbiAgICBpZiAoIXZhbHVlPy5pbmNsdWRlcygneWFybiB3b3Jrc3BhY2VzIGZvcmVhY2gnKSkgY29udGludWU7XG4gICAgc2NyaXB0c1trZXldID0gdmFsdWUucmVwbGFjZUFsbChcbiAgICAgIC95YXJuIHdvcmtzcGFjZXMgZm9yZWFjaCg/IVxccysoPzotQXwtUnwtLSg/OmFsbHxyZWN1cnNpdmV8c2luY2V8d29ya3RyZWV8ZnJvbXxpbmNsdWRlfGV4Y2x1ZGV8cHVibGljfHByaXZhdGUpKSkvZ3UsXG4gICAgICAneWFybiB3b3Jrc3BhY2VzIGZvcmVhY2ggLS1hbGwnXG4gICAgKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBub3JtYWxpemVSYWlsd2F5Q2xpU2NyaXB0KGNvbmZpZzogUGFja2FnZUNvbmZpZywgc2NyaXB0czogUGFja2FnZUpzb24uU2NyaXB0cyk6IHZvaWQge1xuICBpZiAoY29uZmlnLmlzQnVuIHx8ICFzY3JpcHRzLnJhaWx3YXk/LmluY2x1ZGVzKCdAcmFpbHdheS9jbGknKSkgcmV0dXJuO1xuXG4gIHNjcmlwdHMucmFpbHdheSA9ICdZQVJOX0VOQUJMRV9TQ1JJUFRTPXRydWUgeWFybiBkbHggQHJhaWx3YXkvY2xpJztcbn1cblxuYXN5bmMgZnVuY3Rpb24gYXBwbHlQYWNrYWdlSnNvbkNvbnZlbnRpb25zKFxuICBjb25maWc6IFBhY2thZ2VDb25maWcsXG4gIHJvb3RDb25maWc6IFBhY2thZ2VDb25maWcsXG4gIGpzb25PYmo6IFdyaXRhYmxlUGFja2FnZUpzb25cbik6IFByb21pc2U8RGVwZW5kZW5jeVVwZGF0ZXM+IHtcbiAgY29uc3QgZGVwZW5kZW5jaWVzOiBzdHJpbmdbXSA9IFtdO1xuICBjb25zdCBkZXZEZXBlbmRlbmNpZXMgPSBbJ3NvcnQtcGFja2FnZS1qc29uJ107XG4gIGNvbnN0IHB5dGhvbkRldkRlcGVuZGVuY2llczogc3RyaW5nW10gPSBbXTtcbiAgY29uc3QgaGFzSmF2YSA9IGRvZXNDb250YWluSmF2YShjb25maWcpO1xuXG4gIGlmIChcbiAgICBoYXNKYXZhICYmXG4gICAgIWZzLmV4aXN0c1N5bmMocGF0aC5qb2luKHJvb3RDb25maWcuZGlyUGF0aCwgJy5wcmV0dGllcnJjLmpzb24nKSkgJiZcbiAgICAhZnMuZXhpc3RzU3luYyhwYXRoLmpvaW4oY29uZmlnLmRpclBhdGgsICcucHJldHRpZXJyYy5qc29uJykpXG4gICkge1xuICAgIGpzb25PYmoucHJldHRpZXIgPSAnQHdpbGxib29zdGVyL3ByZXR0aWVyLWNvbmZpZyc7XG4gICAgZGV2RGVwZW5kZW5jaWVzLnB1c2goJ3ByZXR0aWVyLXBsdWdpbi1qYXZhJywgJ0B3aWxsYm9vc3Rlci9wcmV0dGllci1jb25maWcnKTtcbiAgfVxuICBpZiAoaGFzSmF2YSkge1xuICAgIGRldkRlcGVuZGVuY2llcy5wdXNoKCdwcmV0dGllcicpO1xuICB9IGVsc2Uge1xuICAgIHJlbW92ZVByZXR0aWVyQXJ0aWZhY3RzKGpzb25PYmopO1xuICB9XG5cbiAgZGVsZXRlIGpzb25PYmouZGV2RGVwZW5kZW5jaWVzWydsaW50LXN0YWdlZCddO1xuICBkZWxldGUgKGpzb25PYmogYXMgUGFja2FnZUpzb24gJiB7ICdsaW50LXN0YWdlZCc/OiB1bmtub3duIH0pWydsaW50LXN0YWdlZCddO1xuXG4gIGlmIChjb25maWcuaXNSb290KSB7XG4gICAgZGVsZXRlIGpzb25PYmouZGV2RGVwZW5kZW5jaWVzLmh1c2t5O1xuICAgIGRlbGV0ZSBqc29uT2JqLnNjcmlwdHMucG9zdGluc3RhbGw7XG4gICAgZGVsZXRlIGpzb25PYmouc2NyaXB0cy5wb3N0cHVibGlzaDtcbiAgICBkZWxldGUganNvbk9iai5zY3JpcHRzLnByZXB1Ymxpc2hPbmx5O1xuICAgIGRlbGV0ZSBqc29uT2JqLnNjcmlwdHMucHJlcGFjaztcbiAgICBkZWxldGUganNvbk9iai5zY3JpcHRzLnBvc3RwYWNrO1xuICAgIGpzb25PYmouc2NyaXB0cy5wcmVwYXJlID0gJ2xlZnRob29rIGluc3RhbGwgfHwgdHJ1ZSc7XG4gICAgZGV2RGVwZW5kZW5jaWVzLnB1c2goJ2xlZnRob29rJyk7XG5cbiAgICBpZiAoY29uZmlnLmRlcGVuZGluZy5zZW1hbnRpY1JlbGVhc2UpIHtcbiAgICAgIGlmIChcbiAgICAgICAgIWpzb25PYmouZGV2RGVwZW5kZW5jaWVzWydzZW1hbnRpYy1yZWxlYXNlJ10gJiZcbiAgICAgICAgIWpzb25PYmouZGV2RGVwZW5kZW5jaWVzWydtdWx0aS1zZW1hbnRpYy1yZWxlYXNlJ10gJiZcbiAgICAgICAgIWpzb25PYmouZGV2RGVwZW5kZW5jaWVzWydAcWl3aS9tdWx0aS1zZW1hbnRpYy1yZWxlYXNlJ11cbiAgICAgICkge1xuICAgICAgICBkZXZEZXBlbmRlbmNpZXMucHVzaCgnc2VtYW50aWMtcmVsZWFzZScpO1xuICAgICAgfVxuICAgICAganNvbk9iai52ZXJzaW9uID0gJzAuMC4wLXNlbWFudGljYWxseS1yZWxlYXNlZCc7XG4gICAgfVxuXG4gICAgaWYgKGNvbmZpZy5kZXBlbmRpbmcucGxheXdyaWdodFRlc3QpIHtcbiAgICAgIC8vIFNpbmNlIGFydGlsbGVyeSByZXF1aXJlcyBhIHNwZWNpZmljIHZlcnNpb24gb2YgQHBsYXl3cmlnaHQvdGVzdFxuICAgICAgY29uc3QgaGFzQXJ0aWxsZXJ5ID0ganNvbk9iai5kZXBlbmRlbmNpZXMuYXJ0aWxsZXJ5IHx8IGpzb25PYmouZGV2RGVwZW5kZW5jaWVzLmFydGlsbGVyeTtcbiAgICAgIC8vIFNpbmNlIGxsbS10b29sYm94IHJlcXVpcmVzIEBwbGF5d3JpZ2h0L3Rlc3QgaW4gZGVwZW5kZW5jaWVzXG4gICAgICBpZiAoIWhhc0FydGlsbGVyeSAmJiAhanNvbk9iai5kZXBlbmRlbmNpZXNbJ0BwbGF5d3JpZ2h0L3Rlc3QnXSkge1xuICAgICAgICBkZXZEZXBlbmRlbmNpZXMucHVzaCgnQHBsYXl3cmlnaHQvdGVzdCcpO1xuICAgICAgfVxuICAgICAgZGVsZXRlIGpzb25PYmouZGVwZW5kZW5jaWVzLnBsYXl3cmlnaHQ7XG4gICAgICBkZWxldGUganNvbk9iai5kZXZEZXBlbmRlbmNpZXMucGxheXdyaWdodDtcbiAgICB9XG5cbiAgICBpZiAoY29uZmlnLmRvZXNDb250YWluU3ViUGFja2FnZUpzb25zKSB7XG4gICAgICAvLyBXZSBkb24ndCBhbGxvdyBub24tYXJyYXkgd29ya3NwYWNlcyBpbiBtb25vcmVwby5cbiAgICAgIGpzb25PYmoud29ya3NwYWNlcyA9IEFycmF5LmlzQXJyYXkoanNvbk9iai53b3Jrc3BhY2VzKVxuICAgICAgICA/IG1lcmdlLmFsbChbanNvbk9iai53b3Jrc3BhY2VzLCBbJ3BhY2thZ2VzLyonXV0sIHtcbiAgICAgICAgICAgIGFycmF5TWVyZ2U6IGNvbWJpbmVNZXJnZSxcbiAgICAgICAgICB9KVxuICAgICAgICA6IFsncGFja2FnZXMvKiddO1xuICAgIH0gZWxzZSBpZiAoQXJyYXkuaXNBcnJheShqc29uT2JqLndvcmtzcGFjZXMpKSB7XG4gICAgICBqc29uT2JqLndvcmtzcGFjZXMgPSBqc29uT2JqLndvcmtzcGFjZXMuZmlsdGVyKFxuICAgICAgICAod29ya3NwYWNlKSA9PlxuICAgICAgICAgIGZnLmdsb2JTeW5jKHdvcmtzcGFjZSwge1xuICAgICAgICAgICAgZG90OiB0cnVlLFxuICAgICAgICAgICAgY3dkOiBjb25maWcuZGlyUGF0aCxcbiAgICAgICAgICAgIGlnbm9yZTogZ2xvYklnbm9yZSxcbiAgICAgICAgICB9KS5sZW5ndGggPiAwXG4gICAgICApO1xuICAgICAgaWYgKGpzb25PYmoud29ya3NwYWNlcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgZGVsZXRlIGpzb25PYmoud29ya3NwYWNlcztcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBpZiAoIWlzV2JQYWNrYWdlKGpzb25PYmopKSB7XG4gICAgZGV2RGVwZW5kZW5jaWVzLnB1c2god2JEZXBlbmRlbmN5KTtcbiAgfVxuICAvLyBidWlsZC10cyBvd25zIFR5cGVTY3JpcHQgZXhlY3V0aW9uIGFuZCBkZWNsYXJhdGlvbiBlbWl0LiB3YmZ5IG11c3QgYWx3YXlzXG4gIC8vIGtlZXAgZXhpc3RpbmcgYnVpbGQtdHMgdXNlcnMgY3VycmVudCBiZWNhdXNlIG9sZGVyIHJlbGVhc2VzIGNhbiBlbWl0IC5kLnRzXG4gIC8vIGZpbGVzIGF0IHBhdGhzIHRoYXQgbm8gbG9uZ2VyIG1hdGNoIHBhY2thZ2UgZXhwb3J0cy5cbiAgaWYgKFxuICAgIGpzb25PYmouZGVwZW5kZW5jaWVzW2J1aWxkVHNEZXBlbmRlbmN5XSB8fFxuICAgIGpzb25PYmouZGV2RGVwZW5kZW5jaWVzW2J1aWxkVHNEZXBlbmRlbmN5XSB8fFxuICAgIE9iamVjdC52YWx1ZXMoanNvbk9iai5zY3JpcHRzKS5zb21lKChzY3JpcHQpID0+IHNjcmlwdD8uaW5jbHVkZXMoYnVpbGRUc0RlcGVuZGVuY3kpKVxuICApIHtcbiAgICBkZXZEZXBlbmRlbmNpZXMucHVzaChidWlsZFRzRGVwZW5kZW5jeSk7XG4gIH1cbiAgaWYgKGRvZXNDb250YWluSnNPclRzKGNvbmZpZykpIHtcbiAgICBkZXZEZXBlbmRlbmNpZXMucHVzaCguLi5veGxpbnREZXBzKTtcbiAgfVxuXG4gIGNvbnN0IHRzY29uZmlnQmFzZURlcGVuZGVuY2llcyA9IGRvZXNDb250YWluSnNPclRzKGNvbmZpZykgPyBnZXRUc2NvbmZpZ0Jhc2VEZXBlbmRlbmNpZXMoY29uZmlnKSA6IFtdO1xuICBhd2FpdCByZW1vdmVVbnVzZWRUc2NvbmZpZ0Jhc2VEZXBlbmRlbmNpZXMoY29uZmlnLCBqc29uT2JqLCB0c2NvbmZpZ0Jhc2VEZXBlbmRlbmNpZXMpO1xuICBkZXZEZXBlbmRlbmNpZXMucHVzaCguLi50c2NvbmZpZ0Jhc2VEZXBlbmRlbmNpZXMpO1xuXG4gIGlmIChjb25maWcuZG9lc0NvbnRhaW5UeXBlU2NyaXB0IHx8IGNvbmZpZy5kb2VzQ29udGFpblR5cGVTY3JpcHRJblBhY2thZ2VzKSB7XG4gICAgZGV2RGVwZW5kZW5jaWVzLnB1c2godHlwZXNjcmlwdEdvRGVwZW5kZW5jeSk7XG4gICAgaWYgKGNvbmZpZy5kZXBlbmRpbmcubmV4dCkge1xuICAgICAgLy8gTmV4dC5qcyBzdGlsbCB1c2VzIHRoZSBgdHlwZXNjcmlwdGAgcGFja2FnZSBkdXJpbmcgZGV2L2J1aWxkIHN0YXJ0dXAgZm9yXG4gICAgICAvLyBUeXBlU2NyaXB0IGFwcHMgZXZlbiB3aGVuIHJlcG9zaXRvcmllcyBkZWxlZ2F0ZSBleHBsaWNpdCB0eXBlY2hlY2tpbmcgdG8gdHNnby5cbiAgICAgIGRldkRlcGVuZGVuY2llcy5wdXNoKHR5cGVzY3JpcHREZXBlbmRlbmN5KTtcbiAgICB9XG4gICAgaWYgKGNvbmZpZy5pc0J1bikge1xuICAgICAgZGV2RGVwZW5kZW5jaWVzLnB1c2goJ0B0eXBlcy9idW4nKTtcbiAgICB9IGVsc2UgaWYgKCFjb25maWcuZGVwZW5kaW5nLnJlYWN0TmF0aXZlKSB7XG4gICAgICBkZXZEZXBlbmRlbmNpZXMucHVzaCgnQHR5cGVzL25vZGUnKTtcbiAgICB9XG4gICAgaWYgKFxuICAgICAganNvbk9iai5kZXBlbmRlbmNpZXMuamVzdCB8fFxuICAgICAganNvbk9iai5kZXZEZXBlbmRlbmNpZXMuamVzdCB8fFxuICAgICAganNvbk9iai5kZXBlbmRlbmNpZXNbJ0BqZXN0L2dsb2JhbHMnXSB8fFxuICAgICAganNvbk9iai5kZXZEZXBlbmRlbmNpZXNbJ0BqZXN0L2dsb2JhbHMnXSB8fFxuICAgICAganNvbk9iai5kZXBlbmRlbmNpZXNbJ3RzLWplc3QnXSB8fFxuICAgICAganNvbk9iai5kZXZEZXBlbmRlbmNpZXNbJ3RzLWplc3QnXVxuICAgICkge1xuICAgICAgZGV2RGVwZW5kZW5jaWVzLnB1c2goJ0B0eXBlcy9qZXN0Jyk7XG4gICAgfVxuICB9XG5cbiAgaWYgKGNvbmZpZy5pc1dpbGxCb29zdGVyQ29uZmlncykge1xuICAgIHJldHVybiB7XG4gICAgICBkZXBlbmRlbmNpZXM6IGRlcGVuZGVuY2llcy5maWx0ZXIoKGRlcCkgPT4gIWRlcC5pbmNsdWRlcygnQHdpbGxib29zdGVyLycpKSxcbiAgICAgIGRldkRlcGVuZGVuY2llczogZGV2RGVwZW5kZW5jaWVzLmZpbHRlcigoZGVwKSA9PiAhZGVwLmluY2x1ZGVzKCdAd2lsbGJvb3N0ZXIvJykpLFxuICAgICAgcHl0aG9uRGV2RGVwZW5kZW5jaWVzLFxuICAgIH07XG4gIH1cblxuICByZXR1cm4geyBkZXBlbmRlbmNpZXMsIGRldkRlcGVuZGVuY2llcywgcHl0aG9uRGV2RGVwZW5kZW5jaWVzIH07XG59XG5cbmZ1bmN0aW9uIG1vdmVNYW5hZ2VkVG9vbERlcGVuZGVuY2llc1RvRGV2RGVwZW5kZW5jaWVzKGpzb25PYmo6IFdyaXRhYmxlUGFja2FnZUpzb24pOiB2b2lkIHtcbiAgZm9yIChjb25zdCBkZXBlbmRlbmN5IG9mIFt3YkRlcGVuZGVuY3ksIGJ1aWxkVHNEZXBlbmRlbmN5XSkge1xuICAgIGlmICghanNvbk9iai5kZXBlbmRlbmNpZXNbZGVwZW5kZW5jeV0pIGNvbnRpbnVlO1xuICAgIGpzb25PYmouZGV2RGVwZW5kZW5jaWVzW2RlcGVuZGVuY3ldID8/PSBqc29uT2JqLmRlcGVuZGVuY2llc1tkZXBlbmRlbmN5XTtcbiAgICBkZWxldGUganNvbk9iai5kZXBlbmRlbmNpZXNbZGVwZW5kZW5jeV07XG4gIH1cbn1cblxuYXN5bmMgZnVuY3Rpb24gbm9ybWFsaXplUGFja2FnZU1ldGFkYXRhKFxuICBjb25maWc6IFBhY2thZ2VDb25maWcsXG4gIHJvb3RDb25maWc6IFBhY2thZ2VDb25maWcsXG4gIGpzb25PYmo6IFdyaXRhYmxlUGFja2FnZUpzb24sXG4gIGRlcGVuZGVuY3lVcGRhdGVzOiBEZXBlbmRlbmN5VXBkYXRlc1xuKTogUHJvbWlzZTx2b2lkPiB7XG4gIGlmICghanNvbk9iai5uYW1lKSB7XG4gICAganNvbk9iai5uYW1lID0gcGF0aC5iYXNlbmFtZShjb25maWcuZGlyUGF0aCk7XG4gIH1cblxuICBpZiAoY29uZmlnLmRvZXNDb250YWluU3ViUGFja2FnZUpzb25zKSB7XG4gICAganNvbk9iai5wcml2YXRlID0gdHJ1ZTtcbiAgfVxuICBpZiAoIWpzb25PYmoubGljZW5zZSkge1xuICAgIGpzb25PYmoubGljZW5zZSA9ICdVTkxJQ0VOU0VEJztcbiAgfVxuICBpZiAoIWpzb25PYmoucHJpdmF0ZSAmJiBqc29uT2JqLmxpY2Vuc2UgIT09ICdVTkxJQ0VOU0VEJyAmJiByb290Q29uZmlnLmlzUHVibGljUmVwbykge1xuICAgIGpzb25PYmoucHVibGlzaENvbmZpZyA/Pz0ge307XG4gICAganNvbk9iai5wdWJsaXNoQ29uZmlnLmFjY2VzcyA/Pz0gJ3B1YmxpYyc7XG4gIH1cbiAgY29uc3QgW293bmVyXSA9IGdpdEh1YlV0aWwuZ2V0T3JnQW5kTmFtZShjb25maWcucmVwb3NpdG9yeSA/PyAnJyk7XG4gIGlmIChvd25lciA9PT0gJ1dpbGxCb29zdGVyJyB8fCBvd25lciA9PT0gJ1dpbGxCb29zdGVyTGFiJykge1xuICAgIGpzb25PYmouYXV0aG9yID0gJ1dpbGxCb29zdGVyIEluYy4nO1xuICB9XG4gIGF3YWl0IG5vcm1hbGl6ZVB1Ymxpc2hlZENvbmZpZ1BhY2thZ2VNZXRhZGF0YShjb25maWcsIGpzb25PYmopO1xuICBpZiAoIWNvbmZpZy5pc1Jvb3QgJiYganNvbk9iai5wcml2YXRlICYmICFqc29uT2JqLm1haW4pIHtcbiAgICAvLyBNYWtlIFZTQ29kZSBwb3NzaWJsZSB0byByZWZhY3RvciBjb2RlIGFjcm9zcyBzdWJwYWNrYWdlcy5cbiAgICBqc29uT2JqLm1haW4gPSAnLi9zcmMnO1xuICB9XG5cbiAgLy8gWWFybiB0cmVhdHMgdGhlIGxlZ2FjeSBucG0vY2hhbGsgcmVzb2x1dGlvbiBhbGlhcyBhcyBhbiBpbnZhbGlkIHBhY2thZ2UgdG9rZW4uXG4gIGRlbGV0ZSBqc29uT2JqLnJlc29sdXRpb25zPy5bJ25wbS9jaGFsayddO1xuXG4gIGlmICghY29uZmlnLmRvZXNDb250YWluU3ViUGFja2FnZUpzb25zKSB7XG4gICAgaWYgKCFjb25maWcuaXNCdW4pIHtcbiAgICAgIGlmICghY29uZmlnLmRvZXNDb250YWluSmF2YVNjcmlwdCAmJiAhY29uZmlnLmRvZXNDb250YWluVHlwZVNjcmlwdCkge1xuICAgICAgICBkZWxldGUganNvbk9iai5zY3JpcHRzLmxpbnQ7XG4gICAgICAgIGRlbGV0ZSBqc29uT2JqLnNjcmlwdHNbJ2xpbnQtZml4J107XG4gICAgICAgIGZvciAoY29uc3Qgc2NyaXB0TmFtZSBvZiBbJ2NsZWFudXAnXSkge1xuICAgICAgICAgIGNvbnN0IHNjcmlwdCA9IGpzb25PYmouc2NyaXB0c1tzY3JpcHROYW1lXTtcbiAgICAgICAgICBpZiAoIXNjcmlwdCkgY29udGludWU7XG4gICAgICAgICAganNvbk9iai5zY3JpcHRzW3NjcmlwdE5hbWVdID0gc2NyaXB0LnJlcGxhY2UoLyA/JiYgP3lhcm4gbGludC1maXgoPzogLS1xdWlldCk/LywgJycpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBqc29uT2JqLnNjcmlwdHNbJ2xpbnQtZml4J10gPSBqc29uT2JqLnNjcmlwdHNbJ2xpbnQtZml4J10gPz8gJ3lhcm4gbGludCAtLWZpeCc7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGNvbmZpZy5kb2VzQ29udGFpblB1YnNwZWNZYW1sKSB7XG4gICAgICBqc29uT2JqLnNjcmlwdHMubGludCA9ICdmbHV0dGVyIGFuYWx5emUnO1xuICAgICAganNvbk9iai5zY3JpcHRzWydsaW50LWZpeCddID0gJ3lhcm4gbGludCc7XG4gICAgICBjb25zdCBkaXJzID0gWydsaWInLCAndGVzdCcsICd0ZXN0X2RyaXZlciddLmZpbHRlcigoZGlyKSA9PiBmcy5leGlzdHNTeW5jKHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgZGlyKSkpO1xuICAgICAgaWYgKGRpcnMubGVuZ3RoID4gMCkge1xuICAgICAgICBqc29uT2JqLnNjcmlwdHNbJ2Zvcm1hdC1jb2RlJ10gPSBgZGFydCBmb3JtYXQgJChmaW5kICR7ZGlycy5qb2luKFxuICAgICAgICAgICcgJ1xuICAgICAgICApfSAtbmFtZSBnZW5lcmF0ZWQgLXBydW5lIC1vIC1uYW1lICcqLmZyZWV6ZWQuZGFydCcgLXBydW5lIC1vIC1uYW1lICcqLmcuZGFydCcgLXBydW5lIC1vIC1uYW1lICcqLmRhcnQnIC1wcmludClgO1xuICAgICAgICBqc29uT2JqLnNjcmlwdHMuZm9ybWF0ID0gYXBwZW5kRm9ybWF0Q29kZUNvbW1hbmQoanNvbk9iai5zY3JpcHRzLmZvcm1hdCwgY29uZmlnKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCBweXRob25QYWNrYWdlTWFuYWdlciA9IGdldFB5dGhvblBhY2thZ2VNYW5hZ2VyKGNvbmZpZyk7XG4gICAgaWYgKHB5dGhvblBhY2thZ2VNYW5hZ2VyKSB7XG4gICAgICBpZiAoanNvbk9iai5zY3JpcHRzLnBvc3RpbnN0YWxsID09PSAncG9ldHJ5IGluc3RhbGwnKSB7XG4gICAgICAgIGRlbGV0ZSBqc29uT2JqLnNjcmlwdHMucG9zdGluc3RhbGw7XG4gICAgICB9XG4gICAgICBqc29uT2JqLnNjcmlwdHNbJ2NvbW1vbi9jaS1zZXR1cCddID0gYHlhcm4gc2V0dXAtJHtweXRob25QYWNrYWdlTWFuYWdlcn1gO1xuICAgICAgZGVsZXRlIGpzb25PYmouc2NyaXB0c1tgc2V0dXAtJHtweXRob25QYWNrYWdlTWFuYWdlciA9PT0gJ3BvZXRyeScgPyAndXYnIDogJ3BvZXRyeSd9YF07XG4gICAgICBkZWxldGUganNvbk9iai5zY3JpcHRzWydzZXR1cC1wb2V0cnktYXNkZiddO1xuICAgICAganNvbk9iai5zY3JpcHRzW2BzZXR1cC0ke3B5dGhvblBhY2thZ2VNYW5hZ2VyfWBdID0gZ2V0UHl0aG9uU2V0dXBDb21tYW5kKHB5dGhvblBhY2thZ2VNYW5hZ2VyKTtcbiAgICAgIGNvbnN0IHB5dGhvbkZpbGVzID0gYXdhaXQgZmcuZ2xvYignKiovKi5weScsIHtcbiAgICAgICAgY3dkOiBjb25maWcuZGlyUGF0aCxcbiAgICAgICAgZG90OiB0cnVlLFxuICAgICAgICBpZ25vcmU6IGdsb2JJZ25vcmUsXG4gICAgICB9KTtcbiAgICAgIGNvbnN0IGRpck5hbWVTZXQgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgICAgIGZvciAoY29uc3QgcHl0aG9uRmlsZSBvZiBweXRob25GaWxlcykge1xuICAgICAgICBjb25zdCBbZmlyc3QsIHNlY29uZF0gPSBweXRob25GaWxlLnNwbGl0KCcvJyk7XG4gICAgICAgIGlmIChmaXJzdCAmJiBzZWNvbmQpIHtcbiAgICAgICAgICBkaXJOYW1lU2V0LmFkZChmaXJzdCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChkaXJOYW1lU2V0LnNpemUgPiAwKSB7XG4gICAgICAgIGNvbnN0IGRpck5hbWVzU3RyID0gWy4uLmRpck5hbWVTZXRdLmpvaW4oJyAnKTtcbiAgICAgICAgY29uc3QgcHl0aG9uUnVubmVyID0gYCR7cHl0aG9uUGFja2FnZU1hbmFnZXJ9IHJ1bmA7XG4gICAgICAgIGpzb25PYmouc2NyaXB0c1snZm9ybWF0LWNvZGUnXSA9XG4gICAgICAgICAgYCR7cHl0aG9uUnVubmVyfSBpc29ydCAtLXByb2ZpbGUgYmxhY2sgJHtkaXJOYW1lc1N0cn0gJiYgJHtweXRob25SdW5uZXJ9IGJsYWNrICR7ZGlyTmFtZXNTdHJ9YDtcbiAgICAgICAgaWYgKGpzb25PYmouc2NyaXB0cy5saW50KSB7XG4gICAgICAgICAganNvbk9iai5zY3JpcHRzLmxpbnQgPSBgJHtweXRob25SdW5uZXJ9IGZsYWtlOCAke2Rpck5hbWVzU3RyfSAmJiAke2pzb25PYmouc2NyaXB0cy5saW50fWA7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAganNvbk9iai5zY3JpcHRzLmxpbnQgPSBgJHtweXRob25SdW5uZXJ9IGZsYWtlOCAke2Rpck5hbWVzU3RyfWA7XG4gICAgICAgICAganNvbk9iai5zY3JpcHRzWydsaW50LWZpeCddID0gJ3lhcm4gbGludCc7XG4gICAgICAgIH1cbiAgICAgICAganNvbk9iai5zY3JpcHRzLmZvcm1hdCA9IGFwcGVuZEZvcm1hdENvZGVDb21tYW5kKGpzb25PYmouc2NyaXB0cy5mb3JtYXQsIGNvbmZpZyk7XG4gICAgICAgIGRlcGVuZGVuY3lVcGRhdGVzLnB5dGhvbkRldkRlcGVuZGVuY2llcy5wdXNoKCdibGFjaycsICdpc29ydCcsICdmbGFrZTgnKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBpZiAoY29uZmlnLnJlcG9zaXRvcnkgfHwganNvbk9iai5yZXBvc2l0b3J5KSB7XG4gICAganNvbk9iai5yZXBvc2l0b3J5ID0gZm9ybWF0UmVwb3NpdG9yeUZvclBhY2thZ2VKc29uKGNvbmZpZy5yZXBvc2l0b3J5ID8/IGpzb25PYmoucmVwb3NpdG9yeSwganNvbk9iai5yZXBvc2l0b3J5KTtcbiAgfVxuXG4gIGNvbnN0IGdlbkNvZGVTY3JpcHQgPSBqc29uT2JqLnNjcmlwdHNbJ2dlbi1jb2RlJ107XG4gIGlmIChnZW5Db2RlU2NyaXB0Py5pbmNsdWRlcygnTm8gY29kZSBnZW5lcmF0aW9uIG5lZWRlZCcpKSB7XG4gICAgZGVsZXRlIGpzb25PYmouc2NyaXB0c1snZ2VuLWNvZGUnXTtcbiAgfSBlbHNlIGlmIChzaG91bGRHZW5lcmF0ZVdiR2VuQ29kZVNjcmlwdChjb25maWcsIGdlbkNvZGVTY3JpcHQpKSB7XG4gICAganNvbk9iai5zY3JpcHRzWydnZW4tY29kZSddID0gYCR7Y29uZmlnLmlzQnVuID8gJ2J1biAtLWJ1biAnIDogJyd9d2IgZ2VuLWNvZGVgO1xuICB9XG4gIGFkZEdlbkkxOG5Uc1Bvc3RpbnN0YWxsU2NyaXB0KGNvbmZpZywganNvbk9iaik7XG5cbiAgaWYgKCFqc29uT2JqLmRlcGVuZGVuY2llcy5wcmV0dGllcikge1xuICAgIC8vIEJlY2F1c2UgQHR5cGVzL3ByZXR0aWVyIGJsb2NrcyBwcmV0dGllciBleGVjdXRpb24uXG4gICAgZGVsZXRlIGpzb25PYmouZGV2RGVwZW5kZW5jaWVzWydAdHlwZXMvcHJldHRpZXInXTtcbiAgfVxufVxuXG5mdW5jdGlvbiBzaG91bGRHZW5lcmF0ZVdiR2VuQ29kZVNjcmlwdChjb25maWc6IFBhY2thZ2VDb25maWcsIG9sZEdlbkNvZGVTY3JpcHQ6IHN0cmluZyB8IHVuZGVmaW5lZCk6IGJvb2xlYW4ge1xuICByZXR1cm4gKFxuICAgIGNvbmZpZy5kZXBlbmRpbmcuYmxpdHogfHxcbiAgICBjb25maWcuZGVwZW5kaW5nLmNoYWtyYSB8fFxuICAgIGNvbmZpZy5kZXBlbmRpbmcucHJpc21hIHx8XG4gICAgKGNvbmZpZy5kZXBlbmRpbmcuZHJpenpsZSAmJiAhIW9sZEdlbkNvZGVTY3JpcHQ/LmluY2x1ZGVzKCdkcml6emxlLWtpdCBjaGVjaycpKVxuICApO1xufVxuXG5mdW5jdGlvbiBhcHBlbmRGb3JtYXRDb2RlQ29tbWFuZChmb3JtYXRTY3JpcHQ6IHN0cmluZyB8IHVuZGVmaW5lZCwgY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogc3RyaW5nIHtcbiAgLy8gQnVuIHByb2plY3RzIG1heSBub3QgaGF2ZSBhIFlhcm4gbG9ja2ZpbGUsIHNvIGdlbmVyYXRlZCBwYWNrYWdlIHNjcmlwdHNcbiAgLy8gbXVzdCBpbnZva2UgbG9jYWwgcGFja2FnZSBzY3JpcHRzIHRocm91Z2ggdGhlIHJlcG9zaXRvcnkncyBwYWNrYWdlIG1hbmFnZXIuXG4gIGNvbnN0IHNjcmlwdFJ1bm5lciA9IGNvbmZpZy5pc0J1biA/ICdidW4gcnVuJyA6ICd5YXJuJztcbiAgcmV0dXJuIGZvcm1hdFNjcmlwdCA/IGAke2Zvcm1hdFNjcmlwdH0gJiYgJHtzY3JpcHRSdW5uZXJ9IGZvcm1hdC1jb2RlYCA6IGAke3NjcmlwdFJ1bm5lcn0gZm9ybWF0LWNvZGVgO1xufVxuXG5mdW5jdGlvbiBhZGRHZW5JMThuVHNQb3N0aW5zdGFsbFNjcmlwdChjb25maWc6IFBhY2thZ2VDb25maWcsIGpzb25PYmo6IFdyaXRhYmxlUGFja2FnZUpzb24pOiB2b2lkIHtcbiAgY29uc3QgY29tbWFuZCA9IGdldEdlbkkxOG5Uc0NvbW1hbmQoY29uZmlnLCBqc29uT2JqLnNjcmlwdHMpO1xuICBpZiAoIWNvbW1hbmQpIHJldHVybjtcblxuICBjb25zdCBwb3N0aW5zdGFsbCA9IGpzb25PYmouc2NyaXB0cy5wb3N0aW5zdGFsbDtcbiAgaWYgKCFwb3N0aW5zdGFsbCkge1xuICAgIGpzb25PYmouc2NyaXB0cy5wb3N0aW5zdGFsbCA9IGNvbW1hbmQ7XG4gIH0gZWxzZSBpZiAoIXBvc3RpbnN0YWxsLmluY2x1ZGVzKGNvbW1hbmQpKSB7XG4gICAganNvbk9iai5zY3JpcHRzLnBvc3RpbnN0YWxsID0gYCR7cG9zdGluc3RhbGx9ICYmICR7Y29tbWFuZH1gO1xuICB9XG59XG5cbmFzeW5jIGZ1bmN0aW9uIG5vcm1hbGl6ZVB1Ymxpc2hlZENvbmZpZ1BhY2thZ2VNZXRhZGF0YShcbiAgY29uZmlnOiBQYWNrYWdlQ29uZmlnLFxuICBqc29uT2JqOiBXcml0YWJsZVBhY2thZ2VKc29uXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgaWYgKCFpc1B1Ymxpc2hlZFdpbGxib29zdGVyQ29uZmlnc1BhY2thZ2UoY29uZmlnKSkgcmV0dXJuO1xuXG4gIGNvbnN0IGNvbmZpZ01qc1BhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICdjb25maWcubWpzJyk7XG4gIGlmICghZnMuZXhpc3RzU3luYyhjb25maWdNanNQYXRoKSkgcmV0dXJuO1xuXG4gIGpzb25PYmoudHlwZSA9ICdtb2R1bGUnO1xuXG4gIGNvbnN0IGNvbmZpZ0R0c1BhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICdjb25maWcuZC50cycpO1xuICBpZiAoIWZzLmV4aXN0c1N5bmMoY29uZmlnRHRzUGF0aCkpIHJldHVybjtcblxuICBqc29uT2JqLmZpbGVzID0gWy4uLm5ldyBTZXQoWy4uLihqc29uT2JqLmZpbGVzID8/IFtdKSwgJ2NvbmZpZy5kLm10cyddKV07XG4gIC8vIE5vZGVOZXh0IHJlc29sdmVzIGEgcmVsYXRpdmUgYC4vY29uZmlnLm1qc2AgaW1wb3J0IHRvIGBjb25maWcuZC5tdHNgLCBub3RcbiAgLy8gdGhlIHBhY2thZ2UtbGV2ZWwgYHR5cGVzYCBmaWVsZC4gS2VlcCB0aGUgcHVibGlzaGVkIGNvbmZpZyBpbXBvcnRhYmxlIGZyb21cbiAgLy8gcGFja2FnZS1sb2NhbCBUeXBlU2NyaXB0IGxpbnRlciBzZXR0aW5ncy5cbiAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzVXRpbC5nZW5lcmF0ZUZpbGUocGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnY29uZmlnLmQubXRzJyksIGNvbmZpZ0RtdHNDb250ZW50KSk7XG59XG5cbmNvbnN0IGNvbmZpZ0RtdHNDb250ZW50ID0gYGV4cG9ydCB7IGRlZmF1bHQgfSBmcm9tICcuL2NvbmZpZy5qcyc7XG5gO1xuXG5mdW5jdGlvbiBhZGREZXBlbmRlbmN5VmVyc2lvbnNUb1BhY2thZ2VKc29uKGpzb25PYmo6IFdyaXRhYmxlUGFja2FnZUpzb24sIGRlcGVuZGVuY3lVcGRhdGVzOiBEZXBlbmRlbmN5VXBkYXRlcyk6IHZvaWQge1xuICBjb25zdCBwYWNrYWdlSnNvbkRlcGVuZGVuY2llcyA9IGpzb25PYmouZGVwZW5kZW5jaWVzO1xuICBjb25zdCBwYWNrYWdlSnNvbkRldkRlcGVuZGVuY2llcyA9IGpzb25PYmouZGV2RGVwZW5kZW5jaWVzO1xuICBkZXBlbmRlbmN5VXBkYXRlcy5kZXBlbmRlbmNpZXMgPSBhZGRQYWNrYWdlSnNvbkRlcGVuZGVuY2llcyhwYWNrYWdlSnNvbkRlcGVuZGVuY2llcywgZGVwZW5kZW5jeVVwZGF0ZXMuZGVwZW5kZW5jaWVzKTtcbiAgZGVwZW5kZW5jeVVwZGF0ZXMuZGV2RGVwZW5kZW5jaWVzID0gZGVwZW5kZW5jeVVwZGF0ZXMuZGV2RGVwZW5kZW5jaWVzLmZpbHRlcigoZGVwKSA9PiAhcGFja2FnZUpzb25EZXBlbmRlbmNpZXNbZGVwXSk7XG4gIGRlcGVuZGVuY3lVcGRhdGVzLmRldkRlcGVuZGVuY2llcyA9IGFkZFBhY2thZ2VKc29uRGVwZW5kZW5jaWVzKFxuICAgIHBhY2thZ2VKc29uRGV2RGVwZW5kZW5jaWVzLFxuICAgIGRlcGVuZGVuY3lVcGRhdGVzLmRldkRlcGVuZGVuY2llc1xuICApO1xufVxuXG5mdW5jdGlvbiByZW1vdmVFbXB0eURlcGVuZGVuY3lTZWN0aW9ucyhqc29uT2JqOiBQYWNrYWdlSnNvbik6IHZvaWQge1xuICBmb3IgKGNvbnN0IGtleSBvZiBkZXBlbmRlbmN5U2VjdGlvbktleXMpIHtcbiAgICBjb25zdCBzZWN0aW9uID0ganNvbk9ialtrZXldO1xuICAgIGlmIChzZWN0aW9uICYmIE9iamVjdC5rZXlzKHNlY3Rpb24pLmxlbmd0aCA9PT0gMCkge1xuICAgICAgUmVmbGVjdC5kZWxldGVQcm9wZXJ0eShqc29uT2JqLCBrZXkpO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBpbnN0YWxsRGVwZW5kZW5jeVVwZGF0ZXMoXG4gIGNvbmZpZzogUGFja2FnZUNvbmZpZyxcbiAganNvbk9iajogUGFja2FnZUpzb24sXG4gIGRlcGVuZGVuY3lVcGRhdGVzOiBEZXBlbmRlbmN5VXBkYXRlcyxcbiAgcGFja2FnZU1hbmFnZXI6ICdidW4nIHwgJ3lhcm4nXG4pOiB2b2lkIHtcbiAgY29uc3QgZGVwZW5kZW5jaWVzID0gZGVwZW5kZW5jeVVwZGF0ZXMuZGVwZW5kZW5jaWVzLmZpbHRlcigoZGVwKSA9PiAhanNvbk9iai5kZXZEZXBlbmRlbmNpZXM/LltkZXBdKTtcbiAgaW5zdGFsbE5wbURlcGVuZGVuY2llcyhjb25maWcsIHBhY2thZ2VNYW5hZ2VyLCBqc29uT2JqLmRlcGVuZGVuY2llcyA/PyB7fSwgZGVwZW5kZW5jaWVzLCBmYWxzZSk7XG5cbiAgY29uc3QgZGV2RGVwZW5kZW5jaWVzID0gZGVwZW5kZW5jeVVwZGF0ZXMuZGV2RGVwZW5kZW5jaWVzLmZpbHRlcigoZGVwKSA9PiAhanNvbk9iai5kZXBlbmRlbmNpZXM/LltkZXBdKTtcbiAgaW5zdGFsbE5wbURlcGVuZGVuY2llcyhjb25maWcsIHBhY2thZ2VNYW5hZ2VyLCBqc29uT2JqLmRldkRlcGVuZGVuY2llcyA/PyB7fSwgZGV2RGVwZW5kZW5jaWVzLCB0cnVlKTtcblxuICBjb25zdCBweXRob25QYWNrYWdlTWFuYWdlciA9IGdldFB5dGhvblBhY2thZ2VNYW5hZ2VyKGNvbmZpZyk7XG4gIGlmIChweXRob25QYWNrYWdlTWFuYWdlciAmJiBkZXBlbmRlbmN5VXBkYXRlcy5weXRob25EZXZEZXBlbmRlbmNpZXMubGVuZ3RoID4gMCkge1xuICAgIGNvbnN0IGRlcGVuZGVuY2llcyA9IFsuLi5uZXcgU2V0KGRlcGVuZGVuY3lVcGRhdGVzLnB5dGhvbkRldkRlcGVuZGVuY2llcyldO1xuICAgIGlmIChweXRob25QYWNrYWdlTWFuYWdlciA9PT0gJ3BvZXRyeScpIHtcbiAgICAgIHNwYXduU3luYygncG9ldHJ5JywgWydhZGQnLCAnLS1ncm91cCcsICdkZXYnLCAuLi5kZXBlbmRlbmNpZXNdLCBjb25maWcuZGlyUGF0aCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHNwYXduU3luYygndXYnLCBbJ2FkZCcsICctLWRldicsIC4uLmRlcGVuZGVuY2llc10sIGNvbmZpZy5kaXJQYXRoKTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gZ2V0UHl0aG9uUGFja2FnZU1hbmFnZXIoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogJ3BvZXRyeScgfCAndXYnIHwgdW5kZWZpbmVkIHtcbiAgaWYgKGNvbmZpZy5kb2VzQ29udGFpblV2TG9jaykgcmV0dXJuICd1dic7XG4gIGlmIChjb25maWcuZG9lc0NvbnRhaW5Qb2V0cnlMb2NrKSByZXR1cm4gJ3BvZXRyeSc7XG59XG5cbmZ1bmN0aW9uIGdldFB5dGhvblNldHVwQ29tbWFuZChwYWNrYWdlTWFuYWdlcjogJ3BvZXRyeScgfCAndXYnKTogc3RyaW5nIHtcbiAgaWYgKHBhY2thZ2VNYW5hZ2VyID09PSAndXYnKSByZXR1cm4gJ3V2IHN5bmMgLS1mcm96ZW4nO1xuICByZXR1cm4gJ3BvZXRyeSBjb25maWcgdmlydHVhbGVudnMuaW4tcHJvamVjdCB0cnVlICYmIHBvZXRyeSBlbnYgdXNlICQobWlzZSBjdXJyZW50IHB5dGhvbikgJiYgcG9ldHJ5IHJ1biBwaXAgaW5zdGFsbCAtLXVwZ3JhZGUgcGlwICYmIHBvZXRyeSBpbnN0YWxsJztcbn1cblxuZnVuY3Rpb24gaW5zdGFsbE5wbURlcGVuZGVuY2llcyhcbiAgY29uZmlnOiBQYWNrYWdlQ29uZmlnLFxuICBwYWNrYWdlTWFuYWdlcjogJ2J1bicgfCAneWFybicsXG4gIHBhY2thZ2VKc29uRGVwZW5kZW5jaWVzOiBQYXJ0aWFsPFJlY29yZDxzdHJpbmcsIHN0cmluZz4+LFxuICBkZXBlbmRlbmNpZXM6IHN0cmluZ1tdLFxuICBkZXY6IGJvb2xlYW5cbik6IHZvaWQge1xuICBpZiAoZGVwZW5kZW5jaWVzLmxlbmd0aCA9PT0gMCkgcmV0dXJuO1xuXG4gIGNvbnN0IGRlcGVuZGVuY3lTcGVjaWZpZXJzID0gW1xuICAgIC4uLm5ldyBTZXQoXG4gICAgICBkZXBlbmRlbmNpZXMubWFwKChkZXBlbmRlbmN5KSA9PiBnZXRJbnN0YWxsRGVwZW5kZW5jeVNwZWNpZmllcihkZXBlbmRlbmN5LCBwYWNrYWdlSnNvbkRlcGVuZGVuY2llc1tkZXBlbmRlbmN5XSkpXG4gICAgKSxcbiAgXTtcbiAgc3Bhd25TeW5jKFxuICAgIHBhY2thZ2VNYW5hZ2VyLFxuICAgIFsnYWRkJywgLi4uKGRldiA/IFsnLUQnXSA6IFtdKSwgLi4uKGNvbmZpZy5pc0J1biA/IFsnLS1leGFjdCddIDogW10pLCAuLi5kZXBlbmRlbmN5U3BlY2lmaWVyc10sXG4gICAgY29uZmlnLmRpclBhdGhcbiAgKTtcbn1cblxuZnVuY3Rpb24gZ2V0SW5zdGFsbERlcGVuZGVuY3lTcGVjaWZpZXIoZGVwZW5kZW5jeTogc3RyaW5nLCBjdXJyZW50VmVyc2lvbjogc3RyaW5nIHwgdW5kZWZpbmVkKTogc3RyaW5nIHtcbiAgLy8gUGFja2FnZSBtYW5hZ2VycyByZXNvbHZlIGEgYmFyZSBhZGQgdGFyZ2V0IGFnYWluc3QgbGl2ZSByZWdpc3RyeSBzdGF0ZS5cbiAgLy8gUGFzc2luZyB0aGUgcmVzb2x2ZWQgdmVyc2lvbiBrZWVwcyBnZW5lcmF0ZWQgaW5zdGFsbHMgYWxpZ25lZCB3aXRoIHRoZVxuICAvLyBwYWNrYWdlLmpzb24gYmFzZWxpbmUgd2UganVzdCB3cm90ZS5cbiAgaWYgKGN1cnJlbnRWZXJzaW9uICYmICFpc1dvcmtzcGFjZVByb3RvY29sUmFuZ2UoY3VycmVudFZlcnNpb24pKSB7XG4gICAgcmV0dXJuIGAke2RlcGVuZGVuY3l9QCR7Y3VycmVudFZlcnNpb259YDtcbiAgfVxuXG4gIHJldHVybiBnZXREZXBlbmRlbmN5U3BlY2lmaWVyKGRlcGVuZGVuY3kpO1xufVxuXG5mdW5jdGlvbiBhZGRQYWNrYWdlSnNvbkRlcGVuZGVuY2llcyhcbiAgcGFja2FnZUpzb25EZXBlbmRlbmNpZXM6IFBhcnRpYWw8UmVjb3JkPHN0cmluZywgc3RyaW5nPj4sXG4gIGRlcGVuZGVuY2llczogc3RyaW5nW11cbik6IHN0cmluZ1tdIHtcbiAgY29uc3QgZGVwZW5kZW5jaWVzVG9JbnN0YWxsOiBzdHJpbmdbXSA9IFtdO1xuICBmb3IgKGNvbnN0IGRlcGVuZGVuY3kgb2YgbmV3IFNldChkZXBlbmRlbmNpZXMpKSB7XG4gICAgY29uc3Qgc2hvdWxkVXBkYXRlRXhpc3RpbmdEZXBlbmRlbmN5ID0gc2hvdWxkVXBkYXRlRXhpc3RpbmdNYW5hZ2VkRGVwZW5kZW5jeShcbiAgICAgIGRlcGVuZGVuY3ksXG4gICAgICBwYWNrYWdlSnNvbkRlcGVuZGVuY2llc1tkZXBlbmRlbmN5XVxuICAgICk7XG4gICAgaWYgKHNob3VsZFVwZGF0ZUV4aXN0aW5nRGVwZW5kZW5jeSkge1xuICAgICAgZGVwZW5kZW5jaWVzVG9JbnN0YWxsLnB1c2goZGVwZW5kZW5jeSk7XG4gICAgfVxuICAgIGlmIChcbiAgICAgIHBhY2thZ2VKc29uRGVwZW5kZW5jaWVzW2RlcGVuZGVuY3ldICYmXG4gICAgICAhc2hvdWxkVXBkYXRlRXhpc3RpbmdEZXBlbmRlbmN5ICYmXG4gICAgICBwYWNrYWdlSnNvbkRlcGVuZGVuY2llc1tkZXBlbmRlbmN5XSAhPT0gJyonXG4gICAgKVxuICAgICAgY29udGludWU7XG4gICAgcGFja2FnZUpzb25EZXBlbmRlbmNpZXNbZGVwZW5kZW5jeV0gPSBnZXRMYXRlc3REZXBlbmRlbmN5VmVyc2lvbihkZXBlbmRlbmN5KTtcbiAgfVxuICByZXR1cm4gZGVwZW5kZW5jaWVzVG9JbnN0YWxsO1xufVxuXG5mdW5jdGlvbiBmb3JtYXRQYWNrYWdlSnNvbldpdGhQcm9qZWN0Rm9ybWF0dGVyKFxuICBjb25maWc6IFBhY2thZ2VDb25maWcsXG4gIHBhY2thZ2VNYW5hZ2VyOiAnYnVuJyB8ICd5YXJuJyxcbiAgZmlsZVBhdGg6IHN0cmluZ1xuKTogdm9pZCB7XG4gIGNvbnN0IHJlbGF0aXZlRmlsZVBhdGggPSBwYXRoLnJlbGF0aXZlKGNvbmZpZy5kaXJQYXRoLCBmaWxlUGF0aCk7XG4gIGlmICghcmVsYXRpdmVGaWxlUGF0aCkgcmV0dXJuO1xuXG4gIC8vIFJldXNlIHRoZSB0YXJnZXQgcmVwb3NpdG9yeSdzIG93biBmb3JtYXR0ZXIgYWZ0ZXIgZGVwZW5kZW5jeSBpbnN0YWxsYXRpb24gc29cbiAgLy8gcGFja2FnZS5qc29uIG1hdGNoZXMgd2hhdGV2ZXIgaXRzIGN1cnJlbnQgc29ydC1wYWNrYWdlLWpzb24gdmVyc2lvbiBleHBlY3RzLlxuICAvLyBUaGlzIGF2b2lkcyBmb2xsb3ctdXAgYXV0b2ZpeCBjb21taXRzIGNhdXNlZCBvbmx5IGJ5IGZvcm1hdHRlciB2ZXJzaW9uIGRyaWZ0XG4gIC8vIGJldHdlZW4gd2JmeSBhbmQgdGhlIHByb2plY3QgYmVpbmcgdXBkYXRlZC5cbiAgaWYgKHBhY2thZ2VNYW5hZ2VyID09PSAnYnVuJykge1xuICAgIHNwYXduU3luYygnYnVueCcsIFsnc29ydC1wYWNrYWdlLWpzb24nLCByZWxhdGl2ZUZpbGVQYXRoXSwgY29uZmlnLmRpclBhdGgpO1xuICB9IGVsc2Uge1xuICAgIHNwYXduU3luYyhwYWNrYWdlTWFuYWdlciwgWydzb3J0LXBhY2thZ2UtanNvbicsIHJlbGF0aXZlRmlsZVBhdGhdLCBjb25maWcuZGlyUGF0aCk7XG4gIH1cbn1cblxuLy8gVE9ETzogcmVtb3ZlIHRoZSBmb2xsb3dpbmcgbWlncmF0aW9uIGNvZGUgaW4gZnV0dXJlXG5hc3luYyBmdW5jdGlvbiByZW1vdmVEZXByZWNhdGVkU3R1ZmYoXG4gIGNvbmZpZzogUGFja2FnZUNvbmZpZyxcbiAganNvbk9iajogU2V0UmVxdWlyZWQ8UGFja2FnZUpzb24sICdzY3JpcHRzJyB8ICdkZXBlbmRlbmNpZXMnIHwgJ2RldkRlcGVuZGVuY2llcycgfCAncGVlckRlcGVuZGVuY2llcyc+XG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgaWYgKGpzb25PYmouYXV0aG9yID09PSAnV2lsbEJvb3N0ZXIgTExDJykge1xuICAgIGpzb25PYmouYXV0aG9yID0gJ1dpbGxCb29zdGVyIEluYy4nO1xuICB9XG4gIHJlbW92ZVNlbGZEZXBlbmRlbmN5KGNvbmZpZywganNvbk9iaik7XG4gIHJlcGxhY2VXaWxsQm9vc3RlckNvbmZpZ3NXb3Jrc3BhY2VEZXBlbmRlbmN5UmFuZ2VzKGNvbmZpZywganNvbk9iaik7XG4gIGRlbGV0ZSBqc29uT2JqLnNjcmlwdHNbJ3NvcnQtcGFja2FnZS1qc29uJ107XG4gIGRlbGV0ZSBqc29uT2JqLnNjcmlwdHNbJ3NvcnQtYWxsLXBhY2thZ2UtanNvbiddO1xuICBkZWxldGUganNvbk9iai5zY3JpcHRzWydjaGVjay1hbGwtZm9yLWFpJ107XG4gIGRlbGV0ZSBqc29uT2JqLnNjcmlwdHNbJ2NoZWNrLWZvci1haSddO1xuICBkZWxldGUganNvbk9iai5zY3JpcHRzWyd0eXBlY2hlY2svd2FybiddO1xuICBkZWxldGUganNvbk9iai5zY3JpcHRzWyd0eXBlY2hlY2s6Z2VuLWNvZGUnXTtcbiAgZGVsZXRlIGpzb25PYmouc2NyaXB0c1sndHlwZWNoZWNrOmNvZGVnZW4nXTtcbiAgZGVsZXRlIGpzb25PYmouZGVwZW5kZW5jaWVzLnRzbGliO1xuICBkZWxldGUganNvbk9iai5kZXZEZXBlbmRlbmNpZXNbJ0B3aWxsYm9vc3Rlci9yZW5vdmF0ZS1jb25maWcnXTtcbiAgZGVsZXRlIGpzb25PYmouZGV2RGVwZW5kZW5jaWVzWydAd2lsbGJvb3N0ZXIvdHNjb25maWcnXTtcbiAgLy8gTmV4dC5qcyBzdGlsbCByZXF1aXJlcyB0aGUgYHR5cGVzY3JpcHRgIHBhY2thZ2UgYXQgYnVpbGQvZGV2IHRpbWUgZm9yXG4gIC8vIFR5cGVTY3JpcHQgcHJvamVjdHMgZXZlbiB3aGVuIHJlcG9zIHVzZSB0c2dvIGZvciBleHBsaWNpdCB0eXBlY2hlY2tpbmcuXG4gIGlmICghY29uZmlnLmRlcGVuZGluZy5uZXh0KSB7XG4gICAgZGVsZXRlIGpzb25PYmouZGV2RGVwZW5kZW5jaWVzW3R5cGVzY3JpcHREZXBlbmRlbmN5XTtcbiAgfVxuICBkZWxldGUganNvbk9iai5kZXZEZXBlbmRlbmNpZXMubGVybmE7XG4gIC8vIFRvIGluc3RhbGwgdGhlIGxhdGVzdCBwaW5zdFxuICBkZWxldGUganNvbk9iai5kZXZEZXBlbmRlbmNpZXMucGluc3Q7XG4gIGRlbGV0ZSBqc29uT2JqLnNjcmlwdHNbJ2ZsdXR0ZXItZm9ybWF0J107XG4gIGRlbGV0ZSBqc29uT2JqLnNjcmlwdHNbJ2Zvcm1hdC1mbHV0dGVyJ107XG4gIGRlbGV0ZSBqc29uT2JqLnNjcmlwdHNbJ3B5dGhvbi1mb3JtYXQnXTtcbiAgZGVsZXRlIGpzb25PYmouc2NyaXB0c1snZm9ybWF0LXB5dGhvbiddO1xuICBkZWxldGUganNvbk9iai5zY3JpcHRzLnByZXR0aWVyO1xuICBkZWxldGUganNvbk9iai5zY3JpcHRzWydjaGVjay1hbGwnXTtcbiAgZGVsZXRlIGpzb25PYmouc2NyaXB0c1sndmVyaWZ5LWNvZGUnXTtcbiAgZGVsZXRlIGpzb25PYmouc2NyaXB0c1sndmVyaWZ5LWNvZGUtd2l0aC10ZXN0cyddO1xuICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnMucHJvbWlzZXMucm0ocGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnbGVybmEuanNvbicpLCB7IGZvcmNlOiB0cnVlIH0pKTtcblxuICByZW1vdmVXaWxsQm9vc3RlckNvbmZpZ3NNYW5hZ2VkRGVwZW5kZW5jaWVzKGNvbmZpZywganNvbk9iaik7XG4gIHJlbW92ZU9ic29sZXRlTGludERlcGVuZGVuY2llcyhqc29uT2JqLCBjb25maWcpO1xufVxuXG5mdW5jdGlvbiByZW1vdmVTZWxmRGVwZW5kZW5jeShcbiAgY29uZmlnOiBQYWNrYWdlQ29uZmlnLFxuICBqc29uT2JqOiBTZXRSZXF1aXJlZDxQYWNrYWdlSnNvbiwgJ2RlcGVuZGVuY2llcycgfCAnZGV2RGVwZW5kZW5jaWVzJyB8ICdwZWVyRGVwZW5kZW5jaWVzJz5cbik6IHZvaWQge1xuICBjb25zdCBwYWNrYWdlTmFtZSA9IGpzb25PYmoubmFtZSB8fCBwYXRoLmJhc2VuYW1lKGNvbmZpZy5kaXJQYXRoKTtcblxuICAvLyBBIHBhY2thZ2UgY2FuIGltcG9ydCBpdHNlbGYgdGhyb3VnaCBOb2RlJ3MgcGFja2FnZSBzZWxmLXJlZmVyZW5jZSB3aXRob3V0XG4gIC8vIGRlY2xhcmluZyBpdHNlbGY7IGtlZXBpbmcgdGhhdCBlZGdlIGJyZWFrcyBtb25vcmVwbyByZWxlYXNlIHRvcG9sb2dpY2FsIHNvcnRpbmcuXG4gIGZvciAoY29uc3Qgc2VjdGlvbiBvZiBnZXREZXBlbmRlbmN5U2VjdGlvbnMoanNvbk9iaikpIHtcbiAgICBSZWZsZWN0LmRlbGV0ZVByb3BlcnR5KHNlY3Rpb24sIHBhY2thZ2VOYW1lKTtcbiAgfVxufVxuXG5mdW5jdGlvbiByZXBsYWNlV2lsbEJvb3N0ZXJDb25maWdzV29ya3NwYWNlRGVwZW5kZW5jeVJhbmdlcyhjb25maWc6IFBhY2thZ2VDb25maWcsIGpzb25PYmo6IFBhY2thZ2VKc29uKTogdm9pZCB7XG4gIGlmICghY29uZmlnLmlzV2lsbEJvb3N0ZXJDb25maWdzKSByZXR1cm47XG5cbiAgZm9yIChjb25zdCBzZWN0aW9uIG9mIGdldERlcGVuZGVuY3lTZWN0aW9ucyhqc29uT2JqKSkge1xuICAgIGZvciAoY29uc3QgW2RlcGVuZGVuY3ksIHZlcnNpb25dIG9mIE9iamVjdC5lbnRyaWVzKHNlY3Rpb24pKSB7XG4gICAgICBpZiAoIXZlcnNpb24pIGNvbnRpbnVlO1xuICAgICAgaWYgKCFpc1dvcmtzcGFjZVByb3RvY29sUmFuZ2UodmVyc2lvbikpIGNvbnRpbnVlO1xuICAgICAgLy8gd2lsbGJvb3N0ZXItY29uZmlncyBwdWJsaXNoZXMgdGhlc2UgcGFja2FnZXMgaW5kZXBlbmRlbnRseSwgc28gZ2VuZXJhdGVkXG4gICAgICAvLyBwYWNrYWdlIG1ldGFkYXRhIG11c3QgZGVzY3JpYmUgbnBtIHJlbGVhc2UgZWRnZXMgaW5zdGVhZCBvZiBsb2NhbFxuICAgICAgLy8gd29ya3NwYWNlIGVkZ2VzIHRoYXQgcmVsZWFzZSB0b29saW5nIHRyZWF0cyBhcyBtb25vcmVwbyBncmFwaCBsaW5rcy5cbiAgICAgIC8vIFRoZSBmaW5hbCBgeWFybiBpbnN0YWxsIC0tbm8taW1tdXRhYmxlYCBzeW5jcyB0aGUgbG9ja2ZpbGUgYWZ0ZXIgdGhpc1xuICAgICAgLy8gbWlncmF0aW9uLCBldmVuIHdoZW4gdGhlIGRlcGVuZGVuY3kgaXMgbm90IHBhcnQgb2Ygd2JmeSdzIG1hbmFnZWQgbGlzdC5cbiAgICAgIHNlY3Rpb25bZGVwZW5kZW5jeV0gPSBnZXRMYXRlc3REZXBlbmRlbmN5VmVyc2lvbihkZXBlbmRlbmN5KTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gcmVtb3ZlV2lsbEJvb3N0ZXJDb25maWdzTWFuYWdlZERlcGVuZGVuY2llcyhcbiAgY29uZmlnOiBQYWNrYWdlQ29uZmlnLFxuICBqc29uT2JqOiBTZXRSZXF1aXJlZDxQYWNrYWdlSnNvbiwgJ2RlcGVuZGVuY2llcycgfCAnZGV2RGVwZW5kZW5jaWVzJyB8ICdwZWVyRGVwZW5kZW5jaWVzJz5cbik6IHZvaWQge1xuICBpZiAoIWNvbmZpZy5pc1dpbGxCb29zdGVyQ29uZmlncykgcmV0dXJuO1xuXG4gIGNvbnN0IHNlY3Rpb25zID0gZ2V0RGVwZW5kZW5jeVNlY3Rpb25zKGpzb25PYmopO1xuICBmb3IgKGNvbnN0IGRlcGVuZGVuY3kgb2Ygd2lsbEJvb3N0ZXJDb25maWdzTWFuYWdlZERlcGVuZGVuY2llcykge1xuICAgIC8vIHdpbGxib29zdGVyLWNvbmZpZ3Mgb3ducyB0aGVzZSBjb25maWcgcGFja2FnZXMuIFBhY2thZ2UtbG9jYWwgZm9ybWF0dGVyXG4gICAgLy8gYW5kIGxpbnRlciBjb25maWcgZmlsZXMgYXJlIHJlcG8gdG9vbGluZywgbm90IHB1Ymxpc2hlZCBwYWNrYWdlIGRhdGEsIHNvXG4gICAgLy8gdGhlIHBhY2thZ2UgbWV0YWRhdGEgb25seSBuZWVkcyB0aGUgZm9ybWF0dGVyL2xpbnRlciBleGVjdXRhYmxlcy5cbiAgICBmb3IgKGNvbnN0IHNlY3Rpb24gb2Ygc2VjdGlvbnMpIHtcbiAgICAgIFJlZmxlY3QuZGVsZXRlUHJvcGVydHkoc2VjdGlvbiwgZGVwZW5kZW5jeSk7XG4gICAgfVxuICB9XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHJlbW92ZVVudXNlZFRzY29uZmlnQmFzZURlcGVuZGVuY2llcyhcbiAgY29uZmlnOiBQYWNrYWdlQ29uZmlnLFxuICBqc29uT2JqOiBXcml0YWJsZVBhY2thZ2VKc29uLFxuICB1c2VkRGVwZW5kZW5jaWVzOiBzdHJpbmdbXVxuKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IHVzZWREZXBlbmRlbmN5U2V0ID0gbmV3IFNldCh1c2VkRGVwZW5kZW5jaWVzKTtcbiAgY29uc3QgZXhpc3RpbmdUc2NvbmZpZ0Jhc2VEZXBlbmRlbmNpZXMgPSBhd2FpdCBnZXRFeGlzdGluZ1RzY29uZmlnQmFzZURlcGVuZGVuY2llcyhjb25maWcpO1xuICBmb3IgKGNvbnN0IGRlcGVuZGVuY3kgb2YgbWFuYWdlZFRzY29uZmlnQmFzZURlcGVuZGVuY2llcykge1xuICAgIGlmICh1c2VkRGVwZW5kZW5jeVNldC5oYXMoZGVwZW5kZW5jeSkgfHwgZXhpc3RpbmdUc2NvbmZpZ0Jhc2VEZXBlbmRlbmNpZXMuaGFzKGRlcGVuZGVuY3kpKSBjb250aW51ZTtcbiAgICAvLyB3YmZ5IG93bnMgdGhlc2UgYmFzZS1jb25maWcgcGFja2FnZXMuIFJlbW92ZSBzdGFsZSB2YXJpYW50cyB3aGVuIHJlcG9cbiAgICAvLyBjYXBhYmlsaXRpZXMgY2hhbmdlLCBzdWNoIGFzIE5leHQuanMgdGFraW5nIG93bmVyc2hpcCBvZiB0c2NvbmZpZy5qc29uLlxuICAgIGZvciAoY29uc3Qgc2VjdGlvbiBvZiBnZXREZXBlbmRlbmN5U2VjdGlvbnMoanNvbk9iaikpIHtcbiAgICAgIFJlZmxlY3QuZGVsZXRlUHJvcGVydHkoc2VjdGlvbiwgZGVwZW5kZW5jeSk7XG4gICAgfVxuICB9XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGdldEV4aXN0aW5nVHNjb25maWdCYXNlRGVwZW5kZW5jaWVzKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8U2V0PHN0cmluZz4+IHtcbiAgY29uc3QgZXhpc3RpbmdUc2NvbmZpZ0Jhc2VEZXBlbmRlbmNpZXMgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgY29uc3QgZmlsZVBhdGhzID0gYXdhaXQgZmcuZ2xvYignKiovdHNjb25maWcqLmpzb24nLCB7XG4gICAgY3dkOiBjb25maWcuZGlyUGF0aCxcbiAgICBkb3Q6IHRydWUsXG4gICAgaWdub3JlOiBnbG9iSWdub3JlLFxuICB9KTtcblxuICBmb3IgKGNvbnN0IGZpbGVQYXRoIG9mIGZpbGVQYXRocykge1xuICAgIGNvbnN0IGFic29sdXRlRmlsZVBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsIGZpbGVQYXRoKTtcbiAgICB0cnkge1xuICAgICAgY29uc3QgcGFyc2VkID0gdHMucGFyc2VDb25maWdGaWxlVGV4dFRvSnNvbihcbiAgICAgICAgYWJzb2x1dGVGaWxlUGF0aCxcbiAgICAgICAgYXdhaXQgZnMucHJvbWlzZXMucmVhZEZpbGUoYWJzb2x1dGVGaWxlUGF0aCwgJ3V0ZjgnKVxuICAgICAgKTtcbiAgICAgIGlmIChwYXJzZWQuZXJyb3IpIHtcbiAgICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICAgIGBQcmVzZXJ2ZSBtYW5hZ2VkIEB0c2NvbmZpZyBkZXBlbmRlbmNpZXMgYmVjYXVzZSAke2Fic29sdXRlRmlsZVBhdGh9IGNvdWxkIG5vdCBiZSBwYXJzZWQ6ICR7Zm9ybWF0VHNEaWFnbm9zdGljKHBhcnNlZC5lcnJvcil9YFxuICAgICAgICApO1xuICAgICAgICByZXR1cm4gbmV3IFNldChtYW5hZ2VkVHNjb25maWdCYXNlRGVwZW5kZW5jaWVzKTtcbiAgICAgIH1cbiAgICAgIGZvciAoY29uc3QgdmFsdWUgb2Ygbm9ybWFsaXplVHNjb25maWdFeHRlbmRzKChwYXJzZWQuY29uZmlnIGFzIHsgZXh0ZW5kcz86IHVua25vd24gfSB8IHVuZGVmaW5lZCk/LmV4dGVuZHMpKSB7XG4gICAgICAgIGZvciAoY29uc3QgZGVwZW5kZW5jeSBvZiBtYW5hZ2VkVHNjb25maWdCYXNlRGVwZW5kZW5jaWVzKSB7XG4gICAgICAgICAgaWYgKHZhbHVlID09PSBkZXBlbmRlbmN5IHx8IHZhbHVlLnN0YXJ0c1dpdGgoYCR7ZGVwZW5kZW5jeX0vYCkpIHtcbiAgICAgICAgICAgIGV4aXN0aW5nVHNjb25maWdCYXNlRGVwZW5kZW5jaWVzLmFkZChkZXBlbmRlbmN5KTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICBgUHJlc2VydmUgbWFuYWdlZCBAdHNjb25maWcgZGVwZW5kZW5jaWVzIGJlY2F1c2UgJHthYnNvbHV0ZUZpbGVQYXRofSBjb3VsZCBub3QgYmUgcmVhZDogJHtlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6IFN0cmluZyhlcnJvcil9YFxuICAgICAgKTtcbiAgICAgIHJldHVybiBuZXcgU2V0KG1hbmFnZWRUc2NvbmZpZ0Jhc2VEZXBlbmRlbmNpZXMpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBleGlzdGluZ1RzY29uZmlnQmFzZURlcGVuZGVuY2llcztcbn1cblxuZnVuY3Rpb24gZm9ybWF0VHNEaWFnbm9zdGljKGRpYWdub3N0aWM6IHRzLkRpYWdub3N0aWMpOiBzdHJpbmcge1xuICByZXR1cm4gdHMuZmxhdHRlbkRpYWdub3N0aWNNZXNzYWdlVGV4dChkaWFnbm9zdGljLm1lc3NhZ2VUZXh0LCAnXFxuJyk7XG59XG5cbmZ1bmN0aW9uIG5vcm1hbGl6ZVRzY29uZmlnRXh0ZW5kcyh2YWx1ZTogdW5rbm93bik6IHN0cmluZ1tdIHtcbiAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycpIHJldHVybiBbdmFsdWVdO1xuICBpZiAoIUFycmF5LmlzQXJyYXkodmFsdWUpKSByZXR1cm4gW107XG4gIHJldHVybiB2YWx1ZS5maWx0ZXIoKGl0ZW0pOiBpdGVtIGlzIHN0cmluZyA9PiB0eXBlb2YgaXRlbSA9PT0gJ3N0cmluZycpO1xufVxuXG5mdW5jdGlvbiBnZXREZXBlbmRlbmN5U2VjdGlvbnMoanNvbk9iajogUGFja2FnZUpzb24pOiBQYXJ0aWFsPFJlY29yZDxzdHJpbmcsIHN0cmluZz4+W10ge1xuICByZXR1cm4gZGVwZW5kZW5jeVNlY3Rpb25LZXlzXG4gICAgLm1hcCgoa2V5KSA9PiBqc29uT2JqW2tleV0pXG4gICAgLmZpbHRlcigoc2VjdGlvbik6IHNlY3Rpb24gaXMgUGFydGlhbDxSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+PiA9PiAhIXNlY3Rpb24pO1xufVxuXG5mdW5jdGlvbiBnZXRMYXRlc3REZXBlbmRlbmN5VmVyc2lvbihkZXBlbmRlbmN5OiBzdHJpbmcpOiBzdHJpbmcge1xuICBjb25zdCBtYW5hZ2VkVmVyc2lvbiA9IGdldE1hbmFnZWREZXBlbmRlbmN5VmVyc2lvbihkZXBlbmRlbmN5KTtcbiAgaWYgKG1hbmFnZWRWZXJzaW9uKSByZXR1cm4gbWFuYWdlZFZlcnNpb247XG5cbiAgY29uc3QgY2FjaGVkVmVyc2lvbiA9IGxhdGVzdERlcGVuZGVuY3lWZXJzaW9uQ2FjaGUuZ2V0KGRlcGVuZGVuY3kpO1xuICBpZiAoY2FjaGVkVmVyc2lvbikgcmV0dXJuIGNhY2hlZFZlcnNpb247XG5cbiAgY29uc3QgdmVyc2lvbiA9IGdldERlcGVuZGVuY3lWZXJzaW9uRnJvbU5wbShkZXBlbmRlbmN5KTtcbiAgbGF0ZXN0RGVwZW5kZW5jeVZlcnNpb25DYWNoZS5zZXQoZGVwZW5kZW5jeSwgdmVyc2lvbik7XG4gIHJldHVybiB2ZXJzaW9uO1xufVxuXG5mdW5jdGlvbiBnZXRNYW5hZ2VkRGVwZW5kZW5jeVZlcnNpb24oZGVwZW5kZW5jeTogc3RyaW5nKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgaWYgKCFiYXNlbGluZU1hbmFnZWREZXBlbmRlbmNpZXMuaGFzKGRlcGVuZGVuY3kpKSByZXR1cm4gdW5kZWZpbmVkO1xuXG4gIC8vIFRoZXNlIHRvb2xzIG9mdGVuIHNoaXAgbmF0aXZlIGJpbmFyaWVzLiBVc2Ugd2JmeSdzIHRlc3RlZCBkZXBlbmRlbmN5XG4gIC8vIGJhc2VsaW5lIGluc3RlYWQgb2YgbGl2ZSBucG0gbGF0ZXN0IHNvIGdlbmVyYXRlZCBsb2NrZmlsZXMgZG8gbm90IHB1bGxcbiAgLy8gdW5yZXZpZXdlZCB0b29sIHJlbGVhc2VzIGludG8gZXZlcnkgcmVwb3NpdG9yeSBhdCBydW50aW1lLlxuICByZXR1cm4gbWFuYWdlZERlcGVuZGVuY3lWZXJzaW9uc1tkZXBlbmRlbmN5XTtcbn1cblxuZnVuY3Rpb24gcmVhZFdiZnlQYWNrYWdlSnNvbigpOiBQYWNrYWdlSnNvbiB7XG4gIGxldCBkaXJQYXRoID0gcGF0aC5kaXJuYW1lKGZpbGVVUkxUb1BhdGgoaW1wb3J0Lm1ldGEudXJsKSk7XG4gIHdoaWxlICh0cnVlKSB7XG4gICAgY29uc3QgcGFja2FnZUpzb25QYXRoID0gcGF0aC5qb2luKGRpclBhdGgsICdwYWNrYWdlLmpzb24nKTtcbiAgICBpZiAoZnMuZXhpc3RzU3luYyhwYWNrYWdlSnNvblBhdGgpKSB7XG4gICAgICBjb25zdCBwYWNrYWdlSnNvbiA9IEpTT04ucGFyc2UoZnMucmVhZEZpbGVTeW5jKHBhY2thZ2VKc29uUGF0aCwgJ3V0ZjgnKSkgYXMgUGFja2FnZUpzb247XG4gICAgICBpZiAocGFja2FnZUpzb24ubmFtZSA9PT0gJ0B3aWxsYm9vc3Rlci93YmZ5JykgcmV0dXJuIHBhY2thZ2VKc29uO1xuICAgIH1cblxuICAgIGNvbnN0IHBhcmVudERpclBhdGggPSBwYXRoLmRpcm5hbWUoZGlyUGF0aCk7XG4gICAgaWYgKHBhcmVudERpclBhdGggPT09IGRpclBhdGgpIHRocm93IG5ldyBFcnJvcignQ291bGQgbm90IGZpbmQgQHdpbGxib29zdGVyL3diZnkgcGFja2FnZS5qc29uJyk7XG4gICAgZGlyUGF0aCA9IHBhcmVudERpclBhdGg7XG4gIH1cbn1cblxuZnVuY3Rpb24gZ2V0RGVwZW5kZW5jeVZlcnNpb25Gcm9tTnBtKGRlcGVuZGVuY3k6IHN0cmluZyk6IHN0cmluZyB7XG4gIC8vIG5wbSdzIGxhdGVzdCBkaXN0LXRhZyBzdGlsbCB0cmFja3MgVFM3IGRldiBzbmFwc2hvdHM7IHdiZnkgc2hvdWxkIGZvbGxvd1xuICAvLyB0aGUgcHVibGljIGJldGEgY2hhbm5lbCB1bnRpbCB0aGUgc3RhYmxlIFRTNyBwYWNrYWdlIGxheW91dCBpcyBmaW5hbGl6ZWQuXG4gIHJldHVybiAoXG4gICAgc3Bhd25TeW5jQW5kUmV0dXJuU3Rkb3V0KFxuICAgICAgJ25wbScsXG4gICAgICBbJ3Nob3cnLCBnZXREZXBlbmRlbmN5U3BlY2lmaWVyKGRlcGVuZGVuY3kpLCAndmVyc2lvbicsICctLXdvcmtzcGFjZXM9ZmFsc2UnXSxcbiAgICAgIHByb2Nlc3MuY3dkKClcbiAgICApIHx8ICcqJ1xuICApO1xufVxuXG5mdW5jdGlvbiBnZXREZXBlbmRlbmN5U3BlY2lmaWVyKGRlcGVuZGVuY3k6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiBkZXBlbmRlbmN5ID09PSB0eXBlc2NyaXB0R29EZXBlbmRlbmN5ID8gYCR7ZGVwZW5kZW5jeX1AYmV0YWAgOiBkZXBlbmRlbmN5O1xufVxuXG5mdW5jdGlvbiByZW1vdmVPYnNvbGV0ZUxpbnREZXBlbmRlbmNpZXMoXG4gIGpzb25PYmo6IFNldFJlcXVpcmVkPFBhY2thZ2VKc29uLCAnZGVwZW5kZW5jaWVzJyB8ICdkZXZEZXBlbmRlbmNpZXMnIHwgJ3BlZXJEZXBlbmRlbmNpZXMnPixcbiAgY29uZmlnOiBQYWNrYWdlQ29uZmlnXG4pOiB2b2lkIHtcbiAgY29uc3QgcHJlc2VydmVNaWNyb21hdGNoID0gc2hvdWxkUHJlc2VydmVNaWNyb21hdGNoKGNvbmZpZyk7XG4gIGZvciAoY29uc3QgZGVwZW5kZW5jeSBvZiBvYnNvbGV0ZUxpbnREZXBlbmRlbmNpZXMpIHtcbiAgICBpZiAocHJlc2VydmVNaWNyb21hdGNoICYmIG1pY3JvbWF0Y2hQYWNrYWdlTmFtZXMuaGFzKGRlcGVuZGVuY3kpKSBjb250aW51ZTtcbiAgICBpZiAoc2hvdWxkUHJlc2VydmVDb25maWdQYWNrYWdlTGludERlcGVuZGVuY3koanNvbk9iaiwgY29uZmlnLCBkZXBlbmRlbmN5KSkgY29udGludWU7XG4gICAgZGVsZXRlIGpzb25PYmouZGVwZW5kZW5jaWVzW2RlcGVuZGVuY3ldO1xuICAgIGRlbGV0ZSBqc29uT2JqLmRldkRlcGVuZGVuY2llc1tkZXBlbmRlbmN5XTtcbiAgICBkZWxldGUganNvbk9iai5wZWVyRGVwZW5kZW5jaWVzW2RlcGVuZGVuY3ldO1xuICB9XG59XG5cbmZ1bmN0aW9uIHNob3VsZFByZXNlcnZlQ29uZmlnUGFja2FnZUxpbnREZXBlbmRlbmN5KFxuICBqc29uT2JqOiBTZXRSZXF1aXJlZDxQYWNrYWdlSnNvbiwgJ2RlcGVuZGVuY2llcycgfCAnZGV2RGVwZW5kZW5jaWVzJyB8ICdwZWVyRGVwZW5kZW5jaWVzJz4sXG4gIGNvbmZpZzogUGFja2FnZUNvbmZpZyxcbiAgZGVwZW5kZW5jeTogc3RyaW5nXG4pOiBib29sZWFuIHtcbiAgaWYgKCFpc1B1Ymxpc2hlZFdpbGxib29zdGVyQ29uZmlnc1BhY2thZ2UoY29uZmlnKSkgcmV0dXJuIGZhbHNlO1xuICBpZiAoanNvbk9iai5wZWVyRGVwZW5kZW5jaWVzW2RlcGVuZGVuY3ldKSByZXR1cm4gdHJ1ZTtcblxuICAvLyBQdWJsaXNoZWQgY29uZmlnIHBhY2thZ2VzIG5lZWQgbG9jYWwgdHlwZS1vbmx5IGRlcHMgdG8gdmFsaWRhdGUgdGhlXG4gIC8vIHBhY2thZ2UtcHJvdmlkZWQgY29uZmlnIGRlY2xhcmF0aW9ucyB1bmRlciBZYXJuIFBuUC5cbiAgcmV0dXJuIGRlcGVuZGVuY3kgPT09ICdAdHlwZXMvZXNsaW50JyAmJiAhIWpzb25PYmoucGVlckRlcGVuZGVuY2llcy5lc2xpbnQ7XG59XG5cbmZ1bmN0aW9uIHNob3VsZFByZXNlcnZlTWljcm9tYXRjaChjb25maWc6IFBhY2thZ2VDb25maWcpOiBib29sZWFuIHtcbiAgLy8gd2lsbGJvb3N0ZXItY29uZmlncyBzdWJwYWNrYWdlcyBwdWJsaXNoIGNvbmZpZyBmaWxlcyBhcyB0aGVpciBwcm9kdWN0LCBzb1xuICAvLyBtaWNyb21hdGNoIGlzIHBhY2thZ2UgZGF0YSB0aGVyZS4gT3RoZXIgcmVwb3Mga2VlcCBtaWNyb21hdGNoIG9ubHkgd2hlblxuICAvLyBwcm9kdWN0IGNvZGUgaW1wb3J0cyBpdDsgb3RoZXJ3aXNlIGl0IGlzIHRyZWF0ZWQgYXMgb2Jzb2xldGUgRVNMaW50LWVyYVxuICAvLyB0b29saW5nLlxuICByZXR1cm4gKGNvbmZpZy5pc1dpbGxCb29zdGVyQ29uZmlncyAmJiAhY29uZmlnLmlzUm9vdCkgfHwgZG9lc1Byb2R1Y3RDb2RlSW1wb3J0TWljcm9tYXRjaChjb25maWcuZGlyUGF0aCk7XG59XG5cbmZ1bmN0aW9uIGRvZXNQcm9kdWN0Q29kZUltcG9ydE1pY3JvbWF0Y2goZGlyUGF0aDogc3RyaW5nKTogYm9vbGVhbiB7XG4gIGNvbnN0IGZpbGVQYXRocyA9IGZnLmdsb2JTeW5jKCdzcmMvKiovKi57anMsanN4LG1qcyxjanMsdHMsdHN4LG10cyxjdHN9Jywge1xuICAgIGN3ZDogZGlyUGF0aCxcbiAgICBkb3Q6IHRydWUsXG4gICAgaWdub3JlOiBnbG9iSWdub3JlLFxuICB9KTtcbiAgcmV0dXJuIGZpbGVQYXRocy5zb21lKChmaWxlUGF0aCkgPT4ge1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gbWljcm9tYXRjaEltcG9ydFBhdHRlcm4udGVzdChmcy5yZWFkRmlsZVN5bmMocGF0aC5yZXNvbHZlKGRpclBhdGgsIGZpbGVQYXRoKSwgJ3V0ZjgnKSk7XG4gICAgfSBjYXRjaCB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9KTtcbn1cblxuZnVuY3Rpb24gc2hvdWxkVXBkYXRlRXhpc3RpbmdNYW5hZ2VkRGVwZW5kZW5jeShkZXBlbmRlbmN5OiBzdHJpbmcsIGN1cnJlbnRWZXJzaW9uOiBzdHJpbmcgfCB1bmRlZmluZWQpOiBib29sZWFuIHtcbiAgaWYgKCFjdXJyZW50VmVyc2lvbikgcmV0dXJuIHRydWU7XG4gIGlmIChjdXJyZW50VmVyc2lvbiA9PT0gJyonKSByZXR1cm4gdHJ1ZTtcbiAgaWYgKGlzV29ya3NwYWNlUHJvdG9jb2xSYW5nZShjdXJyZW50VmVyc2lvbikpIHJldHVybiB0cnVlO1xuICBpZiAoZGVwZW5kZW5jeSA9PT0gdHlwZXNjcmlwdEdvRGVwZW5kZW5jeSkgcmV0dXJuIGlzTmV3ZXJNYW5hZ2VkRGVwZW5kZW5jeVZlcnNpb24oZGVwZW5kZW5jeSwgY3VycmVudFZlcnNpb24pO1xuICAvLyB3YmZ5IG93bnMgdGhlc2UgdG9vbCBiYXNlbGluZXMsIGJ1dCBhcHBseWluZyB3YmZ5IHNob3VsZCBub3QgZG93bmdyYWRlIGFcbiAgLy8gcmVwb3NpdG9yeSB0aGF0IGFscmVhZHkgcGlucyBhIG5ld2VyIHJldmlld2VkIHJlbGVhc2UuXG4gIHJldHVybiBiYXNlbGluZU1hbmFnZWREZXBlbmRlbmNpZXMuaGFzKGRlcGVuZGVuY3kpICYmIGlzTmV3ZXJNYW5hZ2VkRGVwZW5kZW5jeVZlcnNpb24oZGVwZW5kZW5jeSwgY3VycmVudFZlcnNpb24pO1xufVxuXG5mdW5jdGlvbiBpc05ld2VyTWFuYWdlZERlcGVuZGVuY3lWZXJzaW9uKGRlcGVuZGVuY3k6IHN0cmluZywgY3VycmVudFZlcnNpb246IHN0cmluZyk6IGJvb2xlYW4ge1xuICBjb25zdCBsYXRlc3RWZXJzaW9uID0gZ2V0TGF0ZXN0RGVwZW5kZW5jeVZlcnNpb24oZGVwZW5kZW5jeSk7XG4gIGNvbnN0IHZhbGlkTGF0ZXN0VmVyc2lvbiA9IHNlbXZlci52YWxpZChsYXRlc3RWZXJzaW9uKTtcbiAgY29uc3QgdmFsaWRDdXJyZW50VmVyc2lvbiA9IHNlbXZlci52YWxpZChjdXJyZW50VmVyc2lvbik7XG4gIC8vIFRoZSBUeXBlU2NyaXB0IGJldGEgZGlzdC10YWcgY2FuIGxhZyBiZWhpbmQgbmV3ZXIgY29uY3JldGUgZGV2IHNuYXBzaG90c1xuICAvLyBhbHJlYWR5IHBpbm5lZCBieSBSZW5vdmF0ZS4gS2VlcCB0aGUgZXhpc3RpbmcgcGluIGluc3RlYWQgb2YgZG93bmdyYWRpbmcuXG4gIHJldHVybiAhdmFsaWRMYXRlc3RWZXJzaW9uIHx8ICF2YWxpZEN1cnJlbnRWZXJzaW9uIHx8IHNlbXZlci5ndCh2YWxpZExhdGVzdFZlcnNpb24sIHZhbGlkQ3VycmVudFZlcnNpb24pO1xufVxuXG5mdW5jdGlvbiBpc1dvcmtzcGFjZVByb3RvY29sUmFuZ2UodmVyc2lvbjogc3RyaW5nKTogYm9vbGVhbiB7XG4gIHJldHVybiB2ZXJzaW9uLnN0YXJ0c1dpdGgoJ3dvcmtzcGFjZTonKTtcbn1cblxuZnVuY3Rpb24gZm9ybWF0UmVwb3NpdG9yeUZvclBhY2thZ2VKc29uKFxuICByZXBvc2l0b3J5OiBQYWNrYWdlSnNvblsncmVwb3NpdG9yeSddLFxuICBleGlzdGluZ1JlcG9zaXRvcnk/OiBQYWNrYWdlSnNvblsncmVwb3NpdG9yeSddXG4pOiBQYWNrYWdlSnNvblsncmVwb3NpdG9yeSddIHtcbiAgY29uc3Qgbm9ybWFsaXplZFJlcG9zaXRvcnkgPSBub3JtYWxpemVSZXBvc2l0b3J5VXJsRm9yUGFja2FnZUpzb24ocmVwb3NpdG9yeSk7XG4gIGlmIChub3JtYWxpemVkUmVwb3NpdG9yeSkge1xuICAgIHJldHVybiBidWlsZE5vcm1hbGl6ZWRSZXBvc2l0b3J5Rm9yUGFja2FnZUpzb24obm9ybWFsaXplZFJlcG9zaXRvcnksIHJlcG9zaXRvcnksIGV4aXN0aW5nUmVwb3NpdG9yeSk7XG4gIH1cblxuICBjb25zdCBub3JtYWxpemVkRXhpc3RpbmdSZXBvc2l0b3J5ID0gbm9ybWFsaXplUmVwb3NpdG9yeVVybEZvclBhY2thZ2VKc29uKGV4aXN0aW5nUmVwb3NpdG9yeSk7XG4gIGlmIChub3JtYWxpemVkRXhpc3RpbmdSZXBvc2l0b3J5KSB7XG4gICAgcmV0dXJuIGJ1aWxkTm9ybWFsaXplZFJlcG9zaXRvcnlGb3JQYWNrYWdlSnNvbihub3JtYWxpemVkRXhpc3RpbmdSZXBvc2l0b3J5LCBleGlzdGluZ1JlcG9zaXRvcnkpO1xuICB9XG5cbiAgcmV0dXJuIHJlcG9zaXRvcnk7XG59XG5cbmZ1bmN0aW9uIG5vcm1hbGl6ZVJlcG9zaXRvcnlVcmxGb3JQYWNrYWdlSnNvbihyZXBvc2l0b3J5OiBQYWNrYWdlSnNvblsncmVwb3NpdG9yeSddKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgaWYgKHR5cGVvZiByZXBvc2l0b3J5ID09PSAnc3RyaW5nJykge1xuICAgIGlmICghcmVwb3NpdG9yeS5zdGFydHNXaXRoKCdnaXRodWI6JykpIHJldHVybjtcblxuICAgIGNvbnN0IFtvd25lciwgcmVwb10gPSBnaXRIdWJVdGlsLmdldE9yZ0FuZE5hbWUocmVwb3NpdG9yeSk7XG4gICAgaWYgKCFvd25lciB8fCAhcmVwbykgcmV0dXJuO1xuICAgIHJldHVybiBgZ2l0K2h0dHBzOi8vZ2l0aHViLmNvbS8ke293bmVyfS8ke3JlcG99LmdpdGA7XG4gIH1cblxuICBjb25zdCByZXBvc2l0b3J5VXJsID0gcmVwb3NpdG9yeT8udXJsO1xuICBpZiAodHlwZW9mIHJlcG9zaXRvcnlVcmwgIT09ICdzdHJpbmcnKSByZXR1cm47XG5cbiAgY29uc3QgbWF0Y2hlZCA9IC9eKD86Z2l0XFwrKT9odHRwczpcXC9cXC9naXRodWJcXC5jb21cXC8oW14vXSspXFwvKFteL10rPykoPzpcXC5naXQpPyQvdS5leGVjKHJlcG9zaXRvcnlVcmwpO1xuICBpZiAoIW1hdGNoZWQpIHJldHVybjtcblxuICBjb25zdCBbLCBvd25lciwgcmVwb10gPSBtYXRjaGVkO1xuICByZXR1cm4gYGdpdCtodHRwczovL2dpdGh1Yi5jb20vJHtvd25lcn0vJHtyZXBvfS5naXRgO1xufVxuXG5mdW5jdGlvbiBidWlsZE5vcm1hbGl6ZWRSZXBvc2l0b3J5Rm9yUGFja2FnZUpzb24oXG4gIG5vcm1hbGl6ZWRVcmw6IHN0cmluZyxcbiAgcmVwb3NpdG9yeTogUGFja2FnZUpzb25bJ3JlcG9zaXRvcnknXSxcbiAgZXhpc3RpbmdSZXBvc2l0b3J5PzogUGFja2FnZUpzb25bJ3JlcG9zaXRvcnknXVxuKTogUGFja2FnZUpzb25bJ3JlcG9zaXRvcnknXSB7XG4gIGNvbnN0IHJlcG9zaXRvcnlPYmogPVxuICAgIHR5cGVvZiByZXBvc2l0b3J5ID09PSAnb2JqZWN0J1xuICAgICAgPyByZXBvc2l0b3J5XG4gICAgICA6IHR5cGVvZiBleGlzdGluZ1JlcG9zaXRvcnkgPT09ICdvYmplY3QnXG4gICAgICAgID8gZXhpc3RpbmdSZXBvc2l0b3J5XG4gICAgICAgIDogdW5kZWZpbmVkO1xuXG4gIHJldHVybiB7XG4gICAgLi4ucmVwb3NpdG9yeU9iaixcbiAgICB0eXBlOiAnZ2l0JyxcbiAgICB1cmw6IG5vcm1hbGl6ZWRVcmwsXG4gIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZW5lcmF0ZVNjcmlwdHMoY29uZmlnOiBQYWNrYWdlQ29uZmlnLCBvbGRTY3JpcHRzOiBQYWNrYWdlSnNvbi5TY3JpcHRzKTogUmVjb3JkPHN0cmluZywgc3RyaW5nPiB7XG4gIGlmIChjb25maWcuaXNCdW4pIHtcbiAgICBjb25zdCBoYXNUeXBlY2hlY2sgPSBjb25maWcuZG9lc0NvbnRhaW5UeXBlU2NyaXB0IHx8IGNvbmZpZy5kb2VzQ29udGFpblR5cGVTY3JpcHRJblBhY2thZ2VzO1xuICAgIGNvbnN0IHNjcmlwdHM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7XG4gICAgICBjbGVhbnVwOiAnYnVuIC0tYnVuIHdiIGxpbnQgLS1maXggLS1mb3JtYXQnLFxuICAgICAgZm9ybWF0OiBgYnVuIC0tYnVuIHdiIGxpbnQgLS1mb3JtYXRgLFxuICAgICAgbGludDogYGJ1biAtLWJ1biB3YiBsaW50YCxcbiAgICAgICdsaW50LWZpeCc6ICdidW4gLS1idW4gd2IgbGludCAtLWZpeCcsXG4gICAgICB0ZXN0OiAnYnVuIHdiIHRlc3QnLFxuICAgICAgdHlwZWNoZWNrOiAnYnVuIC0tYnVuIHdiIHR5cGVjaGVjaycsXG4gICAgICB2ZXJpZnk6ICdidW4gLS1idW4gd2IgdmVyaWZ5JyxcbiAgICAgICd2ZXJpZnktZnVsbCc6ICdidW4gLS1idW4gd2IgdmVyaWZ5IC0tZnVsbCcsXG4gICAgfTtcbiAgICBhcHBseURhdGFiYXNlU2NyaXB0cyhjb25maWcsIHNjcmlwdHMsICdidW4gLS1idW4gd2IgZGInKTtcbiAgICBhcHBseU1pc2VUYXNrU2NyaXB0cyhjb25maWcsIHNjcmlwdHMsIG9sZFNjcmlwdHMsIFsnYnVpbGQnLCAnZGV2JywgJ3N0YXJ0JywgJ3Rlc3QnLCAndHlwZWNoZWNrJ10pO1xuICAgIGlmICghaGFzVHlwZWNoZWNrKSB7XG4gICAgICBkZWxldGUgc2NyaXB0cy50eXBlY2hlY2s7XG4gICAgfSBlbHNlIGlmIChjb25maWcuZGVwZW5kaW5nLnB5cmlnaHQpIHtcbiAgICAgIHNjcmlwdHMudHlwZWNoZWNrICs9ICcgJiYgcHlyaWdodCc7XG4gICAgfVxuICAgIHJldHVybiBzY3JpcHRzO1xuICB9IGVsc2Uge1xuICAgIGNvbnN0IGhhc1R5cGVjaGVjayA9IGNvbmZpZy5kb2VzQ29udGFpblR5cGVTY3JpcHQgfHwgY29uZmlnLmRvZXNDb250YWluVHlwZVNjcmlwdEluUGFja2FnZXM7XG4gICAgY29uc3QgaGFzSnNPclRzID0gZG9lc0NvbnRhaW5Kc09yVHMoY29uZmlnKTtcbiAgICBjb25zdCBoYXNKYXZhID0gZG9lc0NvbnRhaW5KYXZhKGNvbmZpZyk7XG4gICAgY29uc3Qgb2xkVGVzdCA9IG9sZFNjcmlwdHMudGVzdDtcbiAgICBsZXQgc2NyaXB0czogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHtcbiAgICAgIGNsZWFudXA6ICd5YXJuIGZvcm1hdCAmJiB5YXJuIGxpbnQtZml4JyxcbiAgICAgIGZvcm1hdDogZ2VuZXJhdGVGb3JtYXRTY3JpcHQoaGFzSnNPclRzLCBoYXNKYXZhKSxcbiAgICAgIGxpbnQ6IGBveGxpbnQgLS1uby1lcnJvci1vbi11bm1hdGNoZWQtcGF0dGVybiAuYCxcbiAgICAgICdsaW50LWZpeCc6ICd5YXJuIGxpbnQgLS1maXgnLFxuICAgICAgJ2Zvcm1hdC1jb2RlJzogYG94Zm10IC0td3JpdGUgLS1uby1lcnJvci1vbi11bm1hdGNoZWQtcGF0dGVybiAuICchKiovcGFja2FnZS5qc29uJ2AsXG4gICAgICB0eXBlY2hlY2s6ICd0c2dvIC0tbm9FbWl0JyxcbiAgICB9O1xuICAgIGlmIChoYXNKYXZhKSB7XG4gICAgICBzY3JpcHRzLnByZXR0aWZ5ID0gYHByZXR0aWVyIC0tY2FjaGUgLS1uby1lcnJvci1vbi11bm1hdGNoZWQtcGF0dGVybiAtLXdyaXRlIFwiKiovey4qLyx9Ki57JHtleHRlbnNpb25zLnByZXR0aWVyT25seS5qb2luKCcsJyl9fVwiIFwiISoqL3Rlc3R7LSwvfWZpeHR1cmVzLyoqXCJgO1xuICAgIH1cbiAgICBpZiAoY29uZmlnLmRvZXNDb250YWluU3ViUGFja2FnZUpzb25zKSB7XG4gICAgICBzY3JpcHRzID0gbWVyZ2UoXG4gICAgICAgIHsgLi4uc2NyaXB0cyB9LFxuICAgICAgICB7XG4gICAgICAgICAgZm9ybWF0OiBgJHtzY3JpcHRzLmZvcm1hdH0gJiYgeWFybiB3b3Jrc3BhY2VzIGZvcmVhY2ggLS1hbGwgLS1wYXJhbGxlbCAtLXZlcmJvc2UgcnVuIGZvcm1hdGAsXG4gICAgICAgICAgbGludDogYHlhcm4gd29ya3NwYWNlcyBmb3JlYWNoIC0tYWxsIC0tcGFyYWxsZWwgLS12ZXJib3NlIHJ1biBsaW50YCxcbiAgICAgICAgICAnbGludC1maXgnOiAneWFybiB3b3Jrc3BhY2VzIGZvcmVhY2ggLS1hbGwgLS1wYXJhbGxlbCAtLXZlcmJvc2UgcnVuIGxpbnQtZml4JyxcbiAgICAgICAgICAvLyBDST0xIHByZXZlbnRzIHZpdGVzdCBmcm9tIGVuYWJsaW5nIHdhdGNoLiBDb2xvciBwb2xpY3kgYmVsb25ncyB0byB3Yiwgbm90IGdlbmVyYXRlZCBwYWNrYWdlIHNjcmlwdHMuXG4gICAgICAgICAgdGVzdDogJ0NJPTEgeWFybiB3b3Jrc3BhY2VzIGZvcmVhY2ggLS1hbGwgLS12ZXJib3NlIHJ1biB0ZXN0JyxcbiAgICAgICAgICB0eXBlY2hlY2s6ICd5YXJuIHdvcmtzcGFjZXMgZm9yZWFjaCAtLWFsbCAtLXBhcmFsbGVsIC0tdmVyYm9zZSBydW4gdHlwZWNoZWNrJyxcbiAgICAgICAgfVxuICAgICAgKTtcbiAgICAgIGlmIChoYXNKYXZhKSB7XG4gICAgICAgIHNjcmlwdHMucHJldHRpZnkgPSBgcHJldHRpZXIgLS1jYWNoZSAtLW5vLWVycm9yLW9uLXVubWF0Y2hlZC1wYXR0ZXJuIC0td3JpdGUgXCIqKi97LiovLH0qLnske2V4dGVuc2lvbnMucHJldHRpZXJPbmx5LmpvaW4oXG4gICAgICAgICAgJywnXG4gICAgICAgICl9fVwiIFwiISoqL3BhY2thZ2VzLyoqXCIgXCIhKiovdGVzdHstLC99Zml4dHVyZXMvKipcImA7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChjb25maWcuZGVwZW5kaW5nLnB5cmlnaHQpIHtcbiAgICAgIHNjcmlwdHMudHlwZWNoZWNrID0gc2NyaXB0cy50eXBlY2hlY2sgPyBgJHtzY3JpcHRzLnR5cGVjaGVja30gJiYgYCA6ICcnO1xuICAgICAgc2NyaXB0cy50eXBlY2hlY2sgKz0gJ3B5cmlnaHQnO1xuICAgIH1cbiAgICBpZiAob2xkVGVzdD8uaW5jbHVkZXMoJ3diIHRlc3QnKSkge1xuICAgICAgc2NyaXB0cy50ZXN0ID0gb2xkVGVzdDtcbiAgICB9XG4gICAgaWYgKCFoYXNKc09yVHMpIHtcbiAgICAgIGRlbGV0ZSBzY3JpcHRzWydmb3JtYXQtY29kZSddO1xuICAgICAgZGVsZXRlIHNjcmlwdHMubGludDtcbiAgICAgIGRlbGV0ZSBzY3JpcHRzWydsaW50LWZpeCddO1xuICAgIH1cbiAgICBpZiAoIWhhc1R5cGVjaGVjaykge1xuICAgICAgZGVsZXRlIHNjcmlwdHMudHlwZWNoZWNrO1xuICAgIH0gZWxzZSBpZiAoY29uZmlnLmRlcGVuZGluZy53Yikge1xuICAgICAgc2NyaXB0cy50eXBlY2hlY2sgPSAnd2IgdHlwZWNoZWNrJztcbiAgICB9XG4gICAgaWYgKGlzV2JQYWNrYWdlKGNvbmZpZy5wYWNrYWdlSnNvbikpIHtcbiAgICAgIHNjcmlwdHMudmVyaWZ5ID0gb2xkU2NyaXB0cy52ZXJpZnkgPz8gJ3lhcm4gd29ya3NwYWNlIEB3aWxsYm9vc3Rlci93YiBzdGFydCAtLXdvcmtpbmctZGlyIFwiJElOSVRfQ1dEXCIgdmVyaWZ5JztcbiAgICAgIHNjcmlwdHNbJ3ZlcmlmeS1mdWxsJ10gPSBvbGRTY3JpcHRzWyd2ZXJpZnktZnVsbCddID8/ICd5YXJuIHZlcmlmeSAtLWZ1bGwnO1xuICAgIH0gZWxzZSB7XG4gICAgICBzY3JpcHRzLnZlcmlmeSA9ICd3YiB2ZXJpZnknO1xuICAgICAgc2NyaXB0c1sndmVyaWZ5LWZ1bGwnXSA9ICd3YiB2ZXJpZnkgLS1mdWxsJztcbiAgICB9XG4gICAgYXBwbHlEYXRhYmFzZVNjcmlwdHMoY29uZmlnLCBzY3JpcHRzLCAnd2IgZGInKTtcbiAgICBhcHBseU1pc2VUYXNrU2NyaXB0cyhjb25maWcsIHNjcmlwdHMsIG9sZFNjcmlwdHMsIFsnYnVpbGQnLCAnZGV2JywgJ3N0YXJ0JywgJ3Rlc3QnLCAndHlwZWNoZWNrJ10pO1xuICAgIHJldHVybiBzY3JpcHRzO1xuICB9XG59XG5cbmZ1bmN0aW9uIGFwcGx5RGF0YWJhc2VTY3JpcHRzKGNvbmZpZzogUGFja2FnZUNvbmZpZywgc2NyaXB0czogUmVjb3JkPHN0cmluZywgc3RyaW5nPiwgd2JEYkNvbW1hbmQ6IHN0cmluZyk6IHZvaWQge1xuICBpZiAoIWNvbmZpZy5kZXBlbmRpbmcucHJpc21hICYmICFjb25maWcuZGVwZW5kaW5nLmRyaXp6bGUpIHJldHVybjtcblxuICBzY3JpcHRzWydkYi1jcmVhdGUtbWlncmF0aW9uJ10gPSBgJHt3YkRiQ29tbWFuZH0gbWlncmF0ZS1kZXZgO1xuICBzY3JpcHRzWydkYi1taWdyYXRlJ10gPSBgJHt3YkRiQ29tbWFuZH0gbWlncmF0ZSAtLWNoZWNrLWlkZW1wb3RlbmN5YDtcbiAgc2NyaXB0c1snZGItdmlldyddID0gYCR7d2JEYkNvbW1hbmR9IHN0dWRpb2A7XG59XG5cbmZ1bmN0aW9uIGlzV2JQYWNrYWdlKHBhY2thZ2VKc29uOiBQYWNrYWdlSnNvbiB8IHVuZGVmaW5lZCk6IGJvb2xlYW4ge1xuICByZXR1cm4gcGFja2FnZUpzb24/Lm5hbWUgPT09IHdiRGVwZW5kZW5jeTtcbn1cblxuZnVuY3Rpb24gYXBwbHlNaXNlVGFza1NjcmlwdHMoXG4gIGNvbmZpZzogUGFja2FnZUNvbmZpZyxcbiAgc2NyaXB0czogUmVjb3JkPHN0cmluZywgc3RyaW5nPixcbiAgb2xkU2NyaXB0czogUGFja2FnZUpzb24uU2NyaXB0cyxcbiAgbmFtZXM6IHN0cmluZ1tdXG4pOiB2b2lkIHtcbiAgZm9yIChjb25zdCBuYW1lIG9mIG5hbWVzKSB7XG4gICAgaWYgKCFoYXNNaXNlVGFzayhjb25maWcsIG5hbWUpKSBjb250aW51ZTtcbiAgICBpZiAoZG9lc01pc2VUYXNrQ2FsbFBhY2thZ2VTY3JpcHQoY29uZmlnLCBuYW1lKSkgY29udGludWU7XG4gICAgaWYgKG9sZFNjcmlwdHNbbmFtZV0gJiYgIWlzV2JmeU1hbmFnZWRNaXNlQnJpZGdlKG9sZFNjcmlwdHNbbmFtZV0sIG5hbWUpICYmICEobmFtZSBpbiBzY3JpcHRzKSkgY29udGludWU7XG4gICAgc2NyaXB0c1tuYW1lXSA9IGBtaXNlIHJ1biAke25hbWV9YDtcbiAgfVxufVxuXG5mdW5jdGlvbiBoYXNNaXNlVGFzayhjb25maWc6IFBhY2thZ2VDb25maWcsIG5hbWU6IHN0cmluZyk6IGJvb2xlYW4ge1xuICByZXR1cm4gT2JqZWN0Lmhhc093bihjb25maWcubWlzZVRhc2tzLCBuYW1lKTtcbn1cblxuZnVuY3Rpb24gZG9lc01pc2VUYXNrQ2FsbFBhY2thZ2VTY3JpcHQoY29uZmlnOiBQYWNrYWdlQ29uZmlnLCBuYW1lOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgY29uc3QgdGFzayA9IGNvbmZpZy5taXNlVGFza3NbbmFtZV07XG4gIGlmICghdGFzaykgcmV0dXJuIGZhbHNlO1xuICBjb25zdCBwYWNrYWdlTWFuYWdlcnMgPSBbJ2J1bicsICd5YXJuJywgJ25wbScsICdwbnBtJ107XG4gIHJldHVybiBwYWNrYWdlTWFuYWdlcnMuc29tZSgocGFja2FnZU1hbmFnZXIpID0+XG4gICAgbmV3IFJlZ0V4cChTdHJpbmcucmF3YFxcYiR7cGFja2FnZU1hbmFnZXJ9XFxzKyg/OnJ1blxccyspPyR7ZXNjYXBlUmVnRXhwKG5hbWUpfSg/IVthLXpBLVowLTlfXFwtOi5dKWAsICd1JykudGVzdCh0YXNrKVxuICApO1xufVxuXG5mdW5jdGlvbiBpc1diZnlNYW5hZ2VkTWlzZUJyaWRnZShzY3JpcHQ6IHVua25vd24sIG5hbWU6IHN0cmluZyk6IGJvb2xlYW4ge1xuICByZXR1cm4gc2NyaXB0ID09PSBgbWlzZSBydW4gJHtuYW1lfWA7XG59XG5cbmZ1bmN0aW9uIGVzY2FwZVJlZ0V4cCh2YWx1ZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIHZhbHVlLnJlcGxhY2VBbGwoL1suKis/XiR7fSgpfFtcXF1cXFxcXS9nLCBTdHJpbmcucmF3YFxcJCZgKTtcbn1cblxuZnVuY3Rpb24gZ2VuZXJhdGVGb3JtYXRTY3JpcHQoaGFzSnNPclRzOiBib29sZWFuLCBoYXNKYXZhOiBib29sZWFuKTogc3RyaW5nIHtcbiAgY29uc3QgY29tbWFuZHMgPSBbJ3NvcnQtcGFja2FnZS1qc29uJ107XG4gIGlmIChoYXNKc09yVHMpIHtcbiAgICBjb21tYW5kcy5wdXNoKCd5YXJuIGZvcm1hdC1jb2RlJyk7XG4gIH1cbiAgaWYgKGhhc0phdmEpIHtcbiAgICBjb21tYW5kcy5wdXNoKCd5YXJuIHByZXR0aWZ5Jyk7XG4gIH1cbiAgcmV0dXJuIGNvbW1hbmRzLmpvaW4oJyAmJiAnKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVQcmV0dGllclN1ZmZpeChkaXJQYXRoOiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZz4ge1xuICBjb25zdCBmaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShkaXJQYXRoLCAnLnByZXR0aWVyaWdub3JlJyk7XG4gIGNvbnN0IGV4aXN0aW5nQ29udGVudCA9IGF3YWl0IGZzLnByb21pc2VzLnJlYWRGaWxlKGZpbGVQYXRoLCAndXRmOCcpLmNhdGNoKCgpID0+ICcnKTtcbiAgY29uc3QgaW5kZXggPSBleGlzdGluZ0NvbnRlbnQuaW5kZXhPZihpZ25vcmVGaWxlVXRpbC5zZXBhcmF0b3JQcmVmaXgpO1xuICBpZiAoaW5kZXggPT09IC0xKSByZXR1cm4gJyc7XG5cbiAgY29uc3Qgb3JpZ2luYWxDb250ZW50ID0gZXhpc3RpbmdDb250ZW50LnNsaWNlKDAsIGluZGV4KTtcbiAgY29uc3QgbGluZXMgPSBvcmlnaW5hbENvbnRlbnRcbiAgICAuc3BsaXQoJ1xcbicpXG4gICAgLm1hcCgobGluZSkgPT4ge1xuICAgICAgY29uc3QgbmV3TGluZSA9IGxpbmUudHJpbSgpO1xuICAgICAgcmV0dXJuIG5ld0xpbmUuZW5kc1dpdGgoJy8nKSA/IG5ld0xpbmUuc2xpY2UoMCwgLTEpIDogbmV3TGluZTtcbiAgICB9KVxuICAgIC5maWx0ZXIoKGwpID0+IGwgJiYgIWwuc3RhcnRzV2l0aCgnIycpICYmICFsLmluY2x1ZGVzKCcvJykpO1xuXG4gIHJldHVybiBgJHtsaW5lcy5tYXAoKGxpbmUpID0+IGAgXCIhKiovJHtsaW5lfS8qKlwiYCkuam9pbignJyl9IHx8IHRydWVgO1xufVxuXG5mdW5jdGlvbiByZW1vdmVQcmV0dGllckFydGlmYWN0cyhqc29uT2JqOiBXcml0YWJsZVBhY2thZ2VKc29uKTogdm9pZCB7XG4gIGRlbGV0ZSBqc29uT2JqLnByZXR0aWVyO1xuICBjb25zdCBkZXBlbmRlbmN5U2VjdGlvbnM6IEFycmF5PFBhcnRpYWw8UmVjb3JkPHN0cmluZywgc3RyaW5nPj4gfCB1bmRlZmluZWQ+ID0gW1xuICAgIGpzb25PYmouZGVwZW5kZW5jaWVzLFxuICAgIGpzb25PYmouZGV2RGVwZW5kZW5jaWVzLFxuICAgIGpzb25PYmoucGVlckRlcGVuZGVuY2llcyxcbiAgXTtcbiAgZm9yIChjb25zdCBzZWN0aW9uIG9mIGRlcGVuZGVuY3lTZWN0aW9ucykge1xuICAgIGlmICghc2VjdGlvbikgY29udGludWU7XG4gICAgZGVsZXRlIHNlY3Rpb24ucHJldHRpZXI7XG4gICAgZGVsZXRlIHNlY3Rpb25bJ3ByZXR0aWVyLXBsdWdpbi1qYXZhJ107XG4gICAgZGVsZXRlIHNlY3Rpb25bJ3ByZXR0aWVyLXBsdWdpbi1wcmlzbWEnXTtcbiAgICBkZWxldGUgc2VjdGlvblsnQHdpbGxib29zdGVyL3ByZXR0aWVyLWNvbmZpZyddO1xuICAgIGRlbGV0ZSBzZWN0aW9uWydAdHlwZXMvcHJldHRpZXInXTtcbiAgfVxufVxuXG5hc3luYyBmdW5jdGlvbiB1cGRhdGVQcml2YXRlUGFja2FnZXMoanNvbk9iajogV3JpdGFibGVQYWNrYWdlSnNvbik6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBwYWNrYWdlTmFtZXMgPSBuZXcgU2V0KFsuLi5PYmplY3Qua2V5cyhqc29uT2JqLmRlcGVuZGVuY2llcyksIC4uLk9iamVjdC5rZXlzKGpzb25PYmouZGV2RGVwZW5kZW5jaWVzKV0pO1xuICBjb25zdCBwcml2YXRlUGFja2FnZXM6IHtcbiAgICBwYWNrYWdlTmFtZTogc3RyaW5nO1xuICAgIHJlcG86IHN0cmluZztcbiAgICB0YXJnZXQ6ICdkZXBlbmRlbmNpZXMnIHwgJ2RldkRlcGVuZGVuY2llcyc7XG4gIH1bXSA9IFtcbiAgICB7IHBhY2thZ2VOYW1lOiAnQHdpbGxib29zdGVyL2F1dGgnLCByZXBvOiAnYXV0aCcsIHRhcmdldDogJ2RlcGVuZGVuY2llcycgfSxcbiAgICB7IHBhY2thZ2VOYW1lOiAnQGRpc2NvcmQtYm90L3NoYXJlZCcsIHJlcG86ICdkaXNjb3JkLWJvdCcsIHRhcmdldDogJ2RlcGVuZGVuY2llcycgfSxcbiAgICB7IHBhY2thZ2VOYW1lOiAnQHdpbGxib29zdGVyL2NvZGUtYW5hbHl6ZXInLCByZXBvOiAnY29kZS1hbmFseXplcicsIHRhcmdldDogJ2RldkRlcGVuZGVuY2llcycgfSxcbiAgICB7IHBhY2thZ2VOYW1lOiAnQHdpbGxib29zdGVyL2p1ZGdlJywgcmVwbzogJ2p1ZGdlJywgdGFyZ2V0OiAnZGVwZW5kZW5jaWVzJyB9LFxuICAgIHsgcGFja2FnZU5hbWU6ICdAd2lsbGJvb3N0ZXIvbGxtLXByb3h5JywgcmVwbzogJ2xsbS1wcm94eScsIHRhcmdldDogJ2RlcGVuZGVuY2llcycgfSxcbiAgXTtcblxuICBhd2FpdCBQcm9taXNlLmFsbChcbiAgICBwcml2YXRlUGFja2FnZXMubWFwKGFzeW5jICh7IHBhY2thZ2VOYW1lLCByZXBvLCB0YXJnZXQgfSkgPT4ge1xuICAgICAgaWYgKCFwYWNrYWdlTmFtZXMuaGFzKHBhY2thZ2VOYW1lKSB8fCBpc1dvcmtzcGFjZVBhY2thZ2UoanNvbk9iaiwgcGFja2FnZU5hbWUpKSByZXR1cm47XG5cbiAgICAgIGNvbnN0IG90aGVyVGFyZ2V0ID0gdGFyZ2V0ID09PSAnZGVwZW5kZW5jaWVzJyA/ICdkZXZEZXBlbmRlbmNpZXMnIDogJ2RlcGVuZGVuY2llcyc7XG4gICAgICAvLyBUaGUgbGludCBydWxlIGRpc2FsbG93cyBgZGVsZXRlYCB3aXRoIGNvbXB1dGVkIHBhY2thZ2UgbmFtZXM7IFJlZmxlY3QgaGFzIHRoZSBzYW1lIGRlbGV0aW9uIHNlbWFudGljcyBoZXJlLlxuICAgICAgUmVmbGVjdC5kZWxldGVQcm9wZXJ0eShqc29uT2JqW290aGVyVGFyZ2V0XSwgcGFja2FnZU5hbWUpO1xuICAgICAganNvbk9ialt0YXJnZXRdW3BhY2thZ2VOYW1lXSA9IGF3YWl0IGdldExhdGVzdFByaXZhdGVQYWNrYWdlU3BlY2lmaWVyKHJlcG8pO1xuICAgIH0pXG4gICk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGdldExhdGVzdFByaXZhdGVQYWNrYWdlU3BlY2lmaWVyKHJlcG86IHN0cmluZyk6IFByb21pc2U8c3RyaW5nPiB7XG4gIGNvbnN0IGNvbW1pdEhhc2ggPSBhd2FpdCBnZXRMYXRlc3RDb21taXRIYXNoKCdXaWxsQm9vc3RlckxhYicsIHJlcG8pO1xuICByZXR1cm4gYGdpdEBnaXRodWIuY29tOldpbGxCb29zdGVyTGFiLyR7cmVwb30uZ2l0IyR7Y29tbWl0SGFzaH1gO1xufVxuXG5mdW5jdGlvbiBpc1dvcmtzcGFjZVBhY2thZ2UoanNvbk9iajogUGFja2FnZUpzb24sIHBhY2thZ2VOYW1lOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgcmV0dXJuIChqc29uT2JqLmRldkRlcGVuZGVuY2llcz8uW3BhY2thZ2VOYW1lXSB8fCBqc29uT2JqLmRlcGVuZGVuY2llcz8uW3BhY2thZ2VOYW1lXSB8fCAnJykuaW5jbHVkZXMoJ3dvcmtzcGFjZScpO1xufVxuIiwiaW1wb3J0IHsgc3Bhd25TeW5jQW5kUmV0dXJuU3Rkb3V0IH0gZnJvbSAnLi4vdXRpbHMvc3Bhd25VdGlsLmpzJztcblxuZXhwb3J0IGZ1bmN0aW9uIGdldExhdGVzdENvbW1pdEhhc2gob3JnYW5pemF0aW9uOiBzdHJpbmcsIHJlcG86IHN0cmluZyk6IFByb21pc2U8c3RyaW5nPiB7XG4gIHRyeSB7XG4gICAgY29uc3QgcmVwb1VybCA9IGBnaXRAZ2l0aHViLmNvbToke29yZ2FuaXphdGlvbn0vJHtyZXBvfS5naXRgO1xuICAgIGNvbnN0IG91dHB1dCA9IHNwYXduU3luY0FuZFJldHVyblN0ZG91dCgnZ2l0JywgWydscy1yZW1vdGUnLCByZXBvVXJsLCAnSEVBRCddLCBwcm9jZXNzLmN3ZCgpKTtcbiAgICBjb25zdCBjb21taXRIYXNoID0gb3V0cHV0LnNwbGl0KC9cXHMrLylbMF07XG4gICAgaWYgKCFjb21taXRIYXNoKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYE5vIGNvbW1pdHMgZm91bmQgZm9yICR7b3JnYW5pemF0aW9ufS8ke3JlcG99YCk7XG4gICAgfVxuICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoY29tbWl0SGFzaCk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgcmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBFcnJvcihgRmFpbGVkIHRvIGZldGNoIGNvbW1pdHMgZm9yICR7b3JnYW5pemF0aW9ufS8ke3JlcG99OiAke1N0cmluZyhlcnJvcil9YCkpO1xuICB9XG59XG4iLCIvLyBveGxpbnQtZGlzYWJsZSBlc2xpbnQtcGx1Z2luLWltcG9ydC9uby1uYW1lZC1hcy1kZWZhdWx0LW1lbWJlciAtLSBOYW1lc3BhY2UgWUFNTCBjYWxscyBtYWtlIGR1bXAgdXNhZ2UgY2xlYXJlci5cbmltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB5YW1sIGZyb20gJ2pzLXlhbWwnO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBleHRlbnNpb25zIH0gZnJvbSAnLi4vdXRpbHMvZXh0ZW5zaW9ucy5qcyc7XG5pbXBvcnQgeyBnZXRHZW5JMThuVHNDb21tYW5kIH0gZnJvbSAnLi4vdXRpbHMvZ2VuSTE4blRzLmpzJztcbmltcG9ydCB7IGRvZXNDb250YWluSmF2YSwgZG9lc0NvbnRhaW5Kc09yVHMgfSBmcm9tICcuLi91dGlscy9wYWNrYWdlQ2FwYWJpbGl0aWVzLmpzJztcbmltcG9ydCB7IHNwYXduU3luYyB9IGZyb20gJy4uL3V0aWxzL3NwYXduVXRpbC5qcyc7XG5cbmltcG9ydCB7IGdlbmVyYXRlU2NyaXB0cyB9IGZyb20gJy4vcGFja2FnZUpzb24uanMnO1xuXG5pbnRlcmZhY2UgTGVmdGhvb2tTZXR0aW5ncyB7XG4gIGdsb2JfbWF0Y2hlcjogJ2RvdWJsZXN0YXInO1xuICAncG9zdC1tZXJnZSc6IHtcbiAgICBqb2JzOiBMZWZ0aG9va0pvYltdO1xuICB9O1xuICAncHJlLWNvbW1pdCc6IHtcbiAgICBqb2JzOiBMZWZ0aG9va0pvYltdO1xuICB9O1xuICAncHJlLXB1c2gnOiB7XG4gICAgam9iczogTGVmdGhvb2tKb2JbXTtcbiAgfTtcbn1cblxuaW50ZXJmYWNlIExlZnRob29rSm9iIHtcbiAgbmFtZTogc3RyaW5nO1xuICBnbG9iPzogc3RyaW5nO1xuICBydW4/OiBzdHJpbmc7XG4gIHNjcmlwdD86IHN0cmluZztcbiAgcnVubmVyPzogJ2Jhc2gnO1xuICBzdGFnZV9maXhlZD86IHRydWU7XG59XG5cbmNvbnN0IGJhc2VTZXR0aW5nczogT21pdDxMZWZ0aG9va1NldHRpbmdzLCAncHJlLWNvbW1pdCc+ID0ge1xuICBnbG9iX21hdGNoZXI6ICdkb3VibGVzdGFyJyxcbiAgJ3Bvc3QtbWVyZ2UnOiB7XG4gICAgam9iczogW1xuICAgICAge1xuICAgICAgICBuYW1lOiAncHJlcGFyZScsXG4gICAgICAgIHNjcmlwdDogJ3ByZXBhcmUuc2gnLFxuICAgICAgICBydW5uZXI6ICdiYXNoJyxcbiAgICAgIH0sXG4gICAgXSxcbiAgfSxcbiAgJ3ByZS1wdXNoJzoge1xuICAgIGpvYnM6IFtcbiAgICAgIHtcbiAgICAgICAgbmFtZTogJ2NoZWNrJyxcbiAgICAgICAgc2NyaXB0OiAnY2hlY2suc2gnLFxuICAgICAgICBydW5uZXI6ICdiYXNoJyxcbiAgICAgIH0sXG4gICAgXSxcbiAgfSxcbn07XG5cbmNvbnN0IHByZUNvbW1pdFNldHRpbmdzOiBMZWZ0aG9va1NldHRpbmdzWydwcmUtY29tbWl0J10gPSB7XG4gIGpvYnM6IFtcbiAgICB7XG4gICAgICBuYW1lOiAnY2xlYW51cCcsXG4gICAgICBnbG9iOiAnJyxcbiAgICAgIHJ1bjogJycsXG4gICAgICBzdGFnZV9maXhlZDogdHJ1ZSxcbiAgICB9LFxuICAgIHtcbiAgICAgIG5hbWU6ICdjaGVjay1taWdyYXRpb25zJyxcbiAgICAgIGdsb2I6ICcqKi9taWdyYXRpb24uc3FsJyxcbiAgICAgIHJ1bjogYFxuZmFpbGVkPTBcbiMgTGVmdGhvb2sgZXhwYW5kcyB7c3RhZ2VkX2ZpbGVzfSBhcyBzaGVsbC1lc2NhcGVkIGFyZ3MsIHNvIHBhdGhzIHdpdGggc3BhY2VzIHN0YXkgaW50YWN0LlxuZm9yIGZpbGUgaW4ge3N0YWdlZF9maWxlc307IGRvXG4gIGlmIGdyZXAgLXEgJ1dhcm5pbmdzOicgXCIkZmlsZVwiOyB0aGVuXG4gICAgZWNobyBcIk1pZ3JhdGlvbiBTUUwgZmlsZSAoJGZpbGUpIGNvbnRhaW5zIHdhcm5pbmdzISBQbGVhc2Ugc29sdmUgdGhlIHdhcm5pbmdzIGFuZCBjb21taXQgYWdhaW4uXCJcbiAgICBmYWlsZWQ9MVxuICBmaVxuZG9uZVxuZXhpdCBcIiRmYWlsZWRcIlxuYC50cmltKCksXG4gICAgfSxcbiAgXSxcbn07XG5cbmNvbnN0IHNjcmlwdHMgPSB7XG4gIHBvc3RNZXJnZTogYFxuIyEvYmluL2Jhc2hcblxuY2hhbmdlZF9maWxlcz1cIiQoZ2l0IGRpZmYtdHJlZSAtciAtLW5hbWUtb25seSAtLW5vLWNvbW1pdC1pZCBPUklHX0hFQUQgSEVBRClcIlxuXG5ydW5faWZfY2hhbmdlZCgpIHtcbiAgaWYgZWNobyBcIiRjaGFuZ2VkX2ZpbGVzXCIgfCBncmVwIC0tcXVpZXQgLUUgXCIkMVwiOyB0aGVuXG4gICAgZXZhbCBcIiQyXCJcbiAgZmlcbn1cbmAudHJpbSgpLFxufTtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlTGVmdGhvb2tVcGRhdGluZ1BhY2thZ2VKc29uKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2dlbmVyYXRlTGVmdGhvb2tVcGRhdGluZ1BhY2thZ2VKc29uJywgYXN5bmMgKCkgPT4ge1xuICAgIGF3YWl0IGNvcmUoY29uZmlnKTtcbiAgfSk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGNvcmUoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IGRpclBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICcubGVmdGhvb2snKTtcbiAgY29uc3QgaHVza3lEaXJQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnLmh1c2t5Jyk7XG4gIGNvbnN0IGhhc0h1c2t5RGlyID0gZnMuZXhpc3RzU3luYyhodXNreURpclBhdGgpO1xuICBjb25zdCB7IGxpbnQgfSA9IGdlbmVyYXRlU2NyaXB0cyhjb25maWcsIHt9KTtcbiAgY29uc3Qgc2V0dGluZ3M6IFBhcnRpYWw8TGVmdGhvb2tTZXR0aW5ncz4gPSB7XG4gICAgLi4uYmFzZVNldHRpbmdzLFxuICAgICdwcmUtY29tbWl0Jzoge1xuICAgICAgam9iczogZ2V0UHJlQ29tbWl0Sm9icyhjb25maWcpLFxuICAgIH0sXG4gIH07XG4gIGlmICghbGludCkge1xuICAgIGRlbGV0ZSBzZXR0aW5nc1sncHJlLXB1c2gnXTtcbiAgfVxuICBhd2FpdCBQcm9taXNlLmFsbChbXG4gICAgZnMucHJvbWlzZXMud3JpdGVGaWxlKFxuICAgICAgcGF0aC5qb2luKGNvbmZpZy5kaXJQYXRoLCAnbGVmdGhvb2sueW1sJyksXG4gICAgICB5YW1sLmR1bXAoc2V0dGluZ3MsIHtcbiAgICAgICAgbGluZVdpZHRoOiAtMSxcbiAgICAgICAgbm9Db21wYXRNb2RlOiB0cnVlLFxuICAgICAgICBzdHlsZXM6IHtcbiAgICAgICAgICAnISFudWxsJzogJ2VtcHR5JyxcbiAgICAgICAgfSxcbiAgICAgIH0pXG4gICAgKSxcbiAgICBmcy5wcm9taXNlcy5ybShkaXJQYXRoLCB7IGZvcmNlOiB0cnVlLCByZWN1cnNpdmU6IHRydWUgfSksXG4gIF0pO1xuICBpZiAoaGFzSHVza3lEaXIpIHtcbiAgICBhd2FpdCBQcm9taXNlLmFsbChbXG4gICAgICBmcy5wcm9taXNlcy5ybShodXNreURpclBhdGgsIHsgZm9yY2U6IHRydWUsIHJlY3Vyc2l2ZTogdHJ1ZSB9KSxcbiAgICAgIGZzLnByb21pc2VzLnJtKHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJy5odXNreXJjLmpzb24nKSwgeyBmb3JjZTogdHJ1ZSB9KSxcbiAgICBdKTtcbiAgICBzcGF3blN5bmMoJ2dpdCcsIFsnY29uZmlnJywgJy0tdW5zZXQnLCAnY29yZS5ob29rc1BhdGgnXSwgY29uZmlnLmRpclBhdGgpO1xuICB9XG5cbiAgaWYgKGxpbnQpIHtcbiAgICBjb25zdCBwcmVQdXNoID0gZ2V0UHJlUHVzaFNjcmlwdChjb25maWcpO1xuICAgIGZzLm1rZGlyU3luYyhwYXRoLmpvaW4oZGlyUGF0aCwgJ3ByZS1wdXNoJyksIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICAgIGF3YWl0IGZzLnByb21pc2VzLndyaXRlRmlsZShwYXRoLmpvaW4oZGlyUGF0aCwgJ3ByZS1wdXNoJywgJ2NoZWNrLnNoJyksIHByZVB1c2ggKyAnXFxuJywge1xuICAgICAgbW9kZTogMG83NTUsXG4gICAgfSk7XG4gIH1cbiAgY29uc3QgcG9zdE1lcmdlQ29tbWFuZCA9IGAke3NjcmlwdHMucG9zdE1lcmdlfVxcblxcbiR7Z2VuZXJhdGVQb3N0TWVyZ2VDb21tYW5kcyhjb25maWcpLmpvaW4oJ1xcbicpfVxcbmA7XG4gIGZzLm1rZGlyU3luYyhwYXRoLmpvaW4oZGlyUGF0aCwgJ3Bvc3QtbWVyZ2UnKSwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gIGF3YWl0IGZzLnByb21pc2VzLndyaXRlRmlsZShwYXRoLnJlc29sdmUoZGlyUGF0aCwgJ3Bvc3QtbWVyZ2UnLCAncHJlcGFyZS5zaCcpLCBwb3N0TWVyZ2VDb21tYW5kLCB7XG4gICAgbW9kZTogMG83NTUsXG4gIH0pO1xufVxuXG5mdW5jdGlvbiBnZXRQcmVQdXNoU2NyaXB0KGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IHN0cmluZyB7XG4gIGxldCBsaW50Q29tbWFuZDogc3RyaW5nO1xuICBpZiAoY29uZmlnLmlzQnVuKSB7XG4gICAgLy8gQnVuIHJlcG9zIHJlY2VpdmUgd2IgYXMgcGFydCBvZiB3YmZ5J3MgbWFuYWdlZCB0b29sY2hhaW4sIHNvIGdlbmVyYXRlIHRoZVxuICAgIC8vIGZpbmFsIGhvb2sgY29tbWFuZCBvbiB0aGUgZmlyc3QgcnVuIGluc3RlYWQgb2YgY2hhbmdpbmcgaXQgb24gdGhlIHNlY29uZC5cbiAgICBsaW50Q29tbWFuZCA9ICdidW4gLS1idW4gd2IgbGludCc7XG4gIH0gZWxzZSB7XG4gICAgbGludENvbW1hbmQgPSBjb25maWcuZGVwZW5kaW5nLndiID8gJ3lhcm4gd2IgbGludCcgOiAneWFybiBydW4gbGludCc7XG4gIH1cbiAgY29uc3QgcXVpZXRMaW50Q29tbWFuZCA9IGAke2xpbnRDb21tYW5kfSAtLXF1aWV0YDtcbiAgLy8gTm8gc2VwYXJhdGUgdHlwZWNoZWNrIHN0ZXAgbmVlZGVkIOKAlCB0aGUgbGludCBjb21tYW5kIGFscmVhZHkgaW5jbHVkZXMgdHlwZWNoZWNraW5nLlxuICBpZiAoY29uZmlnLnJlcG9zaXRvcnk/LnN0YXJ0c1dpdGgoJ2dpdGh1YjpXaWxsQm9vc3RlckxhYi8nKSkge1xuICAgIHJldHVybiBgXG4jIS9iaW4vYmFzaFxuXG5pZiBbICQoZ2l0IGJyYW5jaCAtLXNob3ctY3VycmVudCkgPSBcIm1haW5cIiBdICYmIFsgJChnaXQgY29uZmlnIHVzZXIuZW1haWwpICE9IFwiZXhrYXp1dUBnbWFpbC5jb21cIiBdOyB0aGVuXG4gIGVjaG8gXCIqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcIlxuICBlY2hvIFwiKioqIERvbid0IHB1c2ggbWFpbiBicmFuY2ggZGlyZWN0bHkuIFVzZSBQUiEgKioqXCJcbiAgZWNobyBcIioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlwiXG4gIGV4aXQgMVxuZmlcblxuJHtxdWlldExpbnRDb21tYW5kfVxuYC50cmltKCk7XG4gIH1cbiAgcmV0dXJuIHF1aWV0TGludENvbW1hbmQ7XG59XG5cbmZ1bmN0aW9uIGdldFByZUNvbW1pdEpvYnMoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogTGVmdGhvb2tKb2JbXSB7XG4gIHJldHVybiBwcmVDb21taXRTZXR0aW5ncy5qb2JzLm1hcCgoam9iKSA9PlxuICAgIGpvYi5uYW1lID09PSAnY2xlYW51cCdcbiAgICAgID8ge1xuICAgICAgICAgIC4uLmpvYixcbiAgICAgICAgICBnbG9iOiBnZXRDbGVhbnVwR2xvYnMoY29uZmlnKSxcbiAgICAgICAgICBydW46IGdldENsZWFudXBDb21tYW5kKGNvbmZpZyksXG4gICAgICAgIH1cbiAgICAgIDogam9iXG4gICk7XG59XG5cbmZ1bmN0aW9uIGdldENsZWFudXBHbG9icyhjb25maWc6IFBhY2thZ2VDb25maWcpOiBzdHJpbmcge1xuICAvLyBMZXQgYHdiIGxpbnQgLS1mb3JtYXRgIGRlY2lkZSB3aGV0aGVyIFByZXR0aWVyIGlzIGF2YWlsYWJsZTsgdGhlIGhvb2tcbiAgLy8gc3RpbGwgbmVlZHMgdG8gdHJpZ2dlciB3aGVuIGFkZGluZyB0aGUgZmlyc3QgcHJldHRpZXItb25seSBmaWxlLlxuICBjb25zdCBzdXBwb3J0ZWRFeHRlbnNpb25zID1cbiAgICBjb25maWcuaXNCdW4gfHwgY29uZmlnLmRlcGVuZGluZy53YiB8fCBkb2VzQ29udGFpbkphdmEoY29uZmlnKSA/IFsuLi5leHRlbnNpb25zLnByZXR0aWVyT25seV0gOiBbXTtcbiAgaWYgKGRvZXNDb250YWluSnNPclRzKGNvbmZpZykpIHtcbiAgICBzdXBwb3J0ZWRFeHRlbnNpb25zLnB1c2goLi4uZXh0ZW5zaW9ucy5veGZtdCwgLi4uZXh0ZW5zaW9ucy5veGxpbnQpO1xuICB9XG4gIGlmIChjb25maWcuZG9lc0NvbnRhaW5Qb2V0cnlMb2NrIHx8IGNvbmZpZy5kb2VzQ29udGFpblV2TG9jaykge1xuICAgIHN1cHBvcnRlZEV4dGVuc2lvbnMucHVzaCgncHknKTtcbiAgfVxuICBpZiAoY29uZmlnLmRvZXNDb250YWluUHVic3BlY1lhbWwpIHtcbiAgICBzdXBwb3J0ZWRFeHRlbnNpb25zLnB1c2goJ2RhcnQnKTtcbiAgfVxuICBjb25zdCBmaWx0ZXJlZEV4dGVuc2lvbnMgPSBbLi4ubmV3IFNldChzdXBwb3J0ZWRFeHRlbnNpb25zKV0udG9Tb3J0ZWQoKTtcbiAgcmV0dXJuIGAqKi8qLnske2ZpbHRlcmVkRXh0ZW5zaW9ucy5qb2luKCcsJyl9fWA7XG59XG5cbmZ1bmN0aW9uIGdldENsZWFudXBDb21tYW5kKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IHN0cmluZyB7XG4gIGlmIChoYXNMb2NhbFdiV29ya3NwYWNlKGNvbmZpZykpIHtcbiAgICByZXR1cm4gU3RyaW5nLnJhd2BcbiMgTGVmdGhvb2sgZXhwYW5kcyB7c3RhZ2VkX2ZpbGVzfSBhcyBzaGVsbC1lc2NhcGVkIGFyZ3MsIHNvIHBhdGhzIHdpdGggc3BhY2VzIHN0YXkgaW50YWN0LlxueWFybiB3b3Jrc3BhY2UgQHdpbGxib29zdGVyL3diIHN0YXJ0IC0td29ya2luZy1kaXIgXCIkKGdpdCByZXYtcGFyc2UgLS1zaG93LXRvcGxldmVsKVwiIGxpbnQgLS1maXggLS1mb3JtYXQgLS0ge3N0YWdlZF9maWxlc31cbmAudHJpbSgpO1xuICB9XG4gIC8vIFB5dGhvbi1vbmx5IEJ1biByZXBvcyBpbnN0YWxsIHdiIGZvciBzaGFyZWQgc2NyaXB0cyBidXQgbm90IE94bGludCwgc29cbiAgLy8gc3RhZ2VkLWZpbGUgaG9va3MgbXVzdCB1c2UgdGhlIGxhbmd1YWdlLXNwZWNpZmljIGZvcm1hdHRlciBwYXRoIGJlbG93LlxuICBjb25zdCBjYW5Vc2VXYkZvclN0YWdlZEZpbGVzID0gZG9lc0NvbnRhaW5Kc09yVHMoY29uZmlnKSB8fCBkb2VzQ29udGFpbkphdmEoY29uZmlnKTtcbiAgaWYgKChjb25maWcuaXNCdW4gfHwgY29uZmlnLmRlcGVuZGluZy53YikgJiYgY2FuVXNlV2JGb3JTdGFnZWRGaWxlcykge1xuICAgIHJldHVybiBgXG4jIExlZnRob29rIGV4cGFuZHMge3N0YWdlZF9maWxlc30gYXMgc2hlbGwtZXNjYXBlZCBhcmdzLCBzbyBwYXRocyB3aXRoIHNwYWNlcyBzdGF5IGludGFjdC5cbiR7Y29uZmlnLmlzQnVuID8gJ2J1biAtLWJ1biB3YicgOiAneWFybiB3Yid9IGxpbnQgLS1maXggLS1mb3JtYXQgLS0ge3N0YWdlZF9maWxlc31cbmAudHJpbSgpO1xuICB9XG5cbiAgY29uc3Qgb3hsaW50UGF0dGVybiA9IGV4dGVuc2lvbnMub3hsaW50Lm1hcCgoZXh0ZW5zaW9uKSA9PiBTdHJpbmcucmF3YFxcLiR7ZXh0ZW5zaW9ufSRgKS5qb2luKCd8Jyk7XG4gIGNvbnN0IG94Zm10UGF0dGVybiA9IGV4dGVuc2lvbnMub3hmbXQubWFwKChleHRlbnNpb24pID0+IFN0cmluZy5yYXdgXFwuJHtleHRlbnNpb259JGApLmpvaW4oJ3wnKTtcbiAgY29uc3QgcHJldHRpZXJQYXR0ZXJuID0gZXh0ZW5zaW9ucy5wcmV0dGllck9ubHkubWFwKChleHRlbnNpb24pID0+IFN0cmluZy5yYXdgXFwuJHtleHRlbnNpb259JGApLmpvaW4oJ3wnKTtcbiAgY29uc3QgaGFzSnNPclRzID0gZG9lc0NvbnRhaW5Kc09yVHMoY29uZmlnKTtcbiAgY29uc3QgaGFzSmF2YSA9IGRvZXNDb250YWluSmF2YShjb25maWcpO1xuXG4gIHJldHVybiBTdHJpbmcucmF3YFxuIyBMZWZ0aG9vayBleHBhbmRzIHtzdGFnZWRfZmlsZXN9IGFzIHNoZWxsLWVzY2FwZWQgYXJncywgc28gcGF0aHMgd2l0aCBzcGFjZXMgc3RheSBpbnRhY3QuXG4ke2hhc0pzT3JUcyA/IFN0cmluZy5yYXdgb3hsaW50X2ZpbGVzPVwiJChwcmludGYgJyVzXFxuJyB7c3RhZ2VkX2ZpbGVzfSB8IGdyZXAgLUUgJygke294bGludFBhdHRlcm59KScgfHwgdHJ1ZSlcImAgOiAnJ31cbiR7aGFzSnNPclRzID8gU3RyaW5nLnJhd2BveGZtdF9maWxlcz1cIiQocHJpbnRmICclc1xcbicge3N0YWdlZF9maWxlc30gfCBncmVwIC1FICcoJHtveGZtdFBhdHRlcm59KScgfCBncmVwIC12IC1FICcoXnwvKXBhY2thZ2VcXC5qc29uJCcgfHwgdHJ1ZSlcImAgOiAnJ31cbiR7aGFzSmF2YSA/IFN0cmluZy5yYXdgcHJldHRpZXJfZmlsZXM9XCIkKHByaW50ZiAnJXNcXG4nIHtzdGFnZWRfZmlsZXN9IHwgZ3JlcCAtRSAnKCR7cHJldHRpZXJQYXR0ZXJufSknIHx8IHRydWUpXCJgIDogJyd9XG5wYWNrYWdlX2pzb25fZmlsZXM9XCIkKHByaW50ZiAnJXNcXG4nIHtzdGFnZWRfZmlsZXN9IHwgZ3JlcCAtRSAnKF58LylwYWNrYWdlXFwuanNvbiQnIHx8IHRydWUpXCJcbiR7aGFzUHl0aG9uUGFja2FnZU1hbmFnZXIoY29uZmlnKSA/IFN0cmluZy5yYXdgcHl0aG9uX2ZpbGVzPVwiJChwcmludGYgJyVzXFxuJyB7c3RhZ2VkX2ZpbGVzfSB8IGdyZXAgLUUgJ1xcLnB5JCcgfHwgdHJ1ZSlcImAgOiAnJ31cbiR7Y29uZmlnLmRvZXNDb250YWluUHVic3BlY1lhbWwgPyBTdHJpbmcucmF3YGRhcnRfZmlsZXM9XCIkKHByaW50ZiAnJXNcXG4nIHtzdGFnZWRfZmlsZXN9IHwgZ3JlcCAtRSAnXFwuZGFydCQnIHwgZ3JlcCAtdiAnZ2VuZXJhdGVkJyB8IGdyZXAgLXYgJ1xcLmZyZWV6ZWRcXC5kYXJ0JCcgfCBncmVwIC12ICdcXC5nXFwuZGFydCQnIHx8IHRydWUpXCJgIDogJyd9XG5cbiR7XG4gIGhhc0pzT3JUc1xuICAgID8gU3RyaW5nLnJhd2BcbmlmIFsgLW4gXCIkb3hmbXRfZmlsZXNcIiBdOyB0aGVuXG4gIG5vZGUgbm9kZV9tb2R1bGVzLy5iaW4vb3hmbXQgLS13cml0ZSAtLW5vLWVycm9yLW9uLXVubWF0Y2hlZC1wYXR0ZXJuICchKiovcGFja2FnZS5qc29uJyAkb3hmbXRfZmlsZXNcbmZpXG5gXG4gICAgOiAnJ1xufVxuJHtcbiAgaGFzSmF2YVxuICAgID8gU3RyaW5nLnJhd2BpZiBbIC1uIFwiJHByZXR0aWVyX2ZpbGVzXCIgXTsgdGhlblxuICBub2RlIG5vZGVfbW9kdWxlcy8uYmluL3ByZXR0aWVyIC0tY2FjaGUgLS13cml0ZSAtLWlnbm9yZS11bmtub3duIC0tICRwcmV0dGllcl9maWxlc1xuZmlgXG4gICAgOiAnJ1xufVxuJHtcbiAgaGFzSnNPclRzXG4gICAgPyBTdHJpbmcucmF3YFxuaWYgWyAtbiBcIiRveGxpbnRfZmlsZXNcIiBdOyB0aGVuXG4gIG5vZGUgbm9kZV9tb2R1bGVzLy5iaW4vb3hsaW50IC0tZml4ICRveGxpbnRfZmlsZXNcbmZpXG5gXG4gICAgOiAnJ1xufVxuaWYgWyAtbiBcIiRwYWNrYWdlX2pzb25fZmlsZXNcIiBdOyB0aGVuXG4gIG5vZGUgbm9kZV9tb2R1bGVzLy5iaW4vc29ydC1wYWNrYWdlLWpzb24gLS0gJHBhY2thZ2VfanNvbl9maWxlc1xuZmlcbiR7XG4gIGhhc1B5dGhvblBhY2thZ2VNYW5hZ2VyKGNvbmZpZylcbiAgICA/IGBpZiBbIC1uIFwiJHB5dGhvbl9maWxlc1wiIF07IHRoZW5cbiAgJHtnZXRQeXRob25SdW5uZXIoY29uZmlnKX0gaXNvcnQgLS1wcm9maWxlIGJsYWNrIC0tZmlsdGVyLWZpbGVzICRweXRob25fZmlsZXNcbiAgJHtnZXRQeXRob25SdW5uZXIoY29uZmlnKX0gYmxhY2sgJHB5dGhvbl9maWxlc1xuICAke2dldFB5dGhvblJ1bm5lcihjb25maWcpfSBmbGFrZTggJHB5dGhvbl9maWxlc1xuZmlgXG4gICAgOiAnJ1xufVxuJHtcbiAgY29uZmlnLmRvZXNDb250YWluUHVic3BlY1lhbWxcbiAgICA/IGBpZiBbIC1uIFwiJGRhcnRfZmlsZXNcIiBdOyB0aGVuXG4gIGRhcnQgZm9ybWF0ICRkYXJ0X2ZpbGVzXG5maWBcbiAgICA6ICcnXG59XG5gLnRyaW0oKTtcbn1cblxuZnVuY3Rpb24gaGFzTG9jYWxXYldvcmtzcGFjZShjb25maWc6IFBhY2thZ2VDb25maWcpOiBib29sZWFuIHtcbiAgaWYgKCFjb25maWcuaXNSb290KSByZXR1cm4gZmFsc2U7XG5cbiAgY29uc3QgbG9jYWxXYlBhY2thZ2VKc29uUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJ3BhY2thZ2VzJywgJ3diJywgJ3BhY2thZ2UuanNvbicpO1xuICBpZiAoIWZzLmV4aXN0c1N5bmMobG9jYWxXYlBhY2thZ2VKc29uUGF0aCkpIHJldHVybiBmYWxzZTtcblxuICB0cnkge1xuICAgIGNvbnN0IHBhY2thZ2VKc29uID0gSlNPTi5wYXJzZShmcy5yZWFkRmlsZVN5bmMobG9jYWxXYlBhY2thZ2VKc29uUGF0aCwgJ3V0ZjgnKSkgYXMgeyBuYW1lPzogc3RyaW5nIH07XG4gICAgcmV0dXJuIHBhY2thZ2VKc29uLm5hbWUgPT09ICdAd2lsbGJvb3N0ZXIvd2InO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn1cblxuZnVuY3Rpb24gZ2VuZXJhdGVQb3N0TWVyZ2VDb21tYW5kcyhjb25maWc6IFBhY2thZ2VDb25maWcpOiBzdHJpbmdbXSB7XG4gIGNvbnN0IHBvc3RNZXJnZUNvbW1hbmRzOiBzdHJpbmdbXSA9IFtdO1xuICBpZiAoY29uZmlnLmhhc1ZlcnNpb25TZXR0aW5ncykge1xuICAgIGNvbnN0IHRvb2xzQ2hhbmdlZFBhdHRlcm4gPSBTdHJpbmcucmF3YChtaXNlXFwudG9tbHxcXC5taXNlXFwudG9tbHxcXC50b29sLXZlcnNpb25zfFxcLi4rLXZlcnNpb24pYDtcbiAgICBwb3N0TWVyZ2VDb21tYW5kcy5wdXNoKFN0cmluZy5yYXdgcnVuX2lmX2NoYW5nZWQgXCIke3Rvb2xzQ2hhbmdlZFBhdHRlcm59XCIgXCJtaXNlIGluc3RhbGxcImApO1xuICB9XG4gIGNvbnN0IGluc3RhbGxDb21tYW5kID0gY29uZmlnLmlzQnVuID8gJ2J1biBpbnN0YWxsJyA6ICd5YXJuJztcbiAgY29uc3Qgcm1OZXh0RGlyZWN0b3J5ID0gY29uZmlnLmRlcGVuZGluZy5ibGl0eiB8fCBjb25maWcuZGVwZW5kaW5nLm5leHQgPyAnICYmIHJtIC1SZiAubmV4dCcgOiAnJztcbiAgcG9zdE1lcmdlQ29tbWFuZHMucHVzaChTdHJpbmcucmF3YHJ1bl9pZl9jaGFuZ2VkIFwicGFja2FnZVxcLmpzb25cIiBcIiR7aW5zdGFsbENvbW1hbmR9JHtybU5leHREaXJlY3Rvcnl9XCJgKTtcbiAgaWYgKGNvbmZpZy5kb2VzQ29udGFpblBvZXRyeUxvY2spIHtcbiAgICBwb3N0TWVyZ2VDb21tYW5kcy5wdXNoKFN0cmluZy5yYXdgcnVuX2lmX2NoYW5nZWQgXCJwb2V0cnlcXC5sb2NrXCIgXCJwb2V0cnkgaW5zdGFsbFwiYCk7XG4gIH1cbiAgaWYgKGNvbmZpZy5kb2VzQ29udGFpblV2TG9jaykge1xuICAgIHBvc3RNZXJnZUNvbW1hbmRzLnB1c2goU3RyaW5nLnJhd2BydW5faWZfY2hhbmdlZCBcInV2XFwubG9ja1wiIFwidXYgc3luYyAtLWZyb3plblwiYCk7XG4gIH1cbiAgaWYgKGNvbmZpZy5kZXBlbmRpbmcuYmxpdHopIHtcbiAgICBwb3N0TWVyZ2VDb21tYW5kcy5wdXNoKFxuICAgICAgU3RyaW5nLnJhd2BydW5faWZfY2hhbmdlZCBcIi4qXFwucHJpc21hXCIgXCJub2RlIG5vZGVfbW9kdWxlcy8uYmluL2JsaXR6IHByaXNtYSBtaWdyYXRlIGRlcGxveVwiYCxcbiAgICAgIFN0cmluZy5yYXdgcnVuX2lmX2NoYW5nZWQgXCIuKlxcLnByaXNtYVwiIFwibm9kZSBub2RlX21vZHVsZXMvLmJpbi9ibGl0eiBwcmlzbWEgZ2VuZXJhdGVcImAsXG4gICAgICBTdHJpbmcucmF3YHJ1bl9pZl9jaGFuZ2VkIFwiLipcXC5wcmlzbWFcIiBcIm5vZGUgbm9kZV9tb2R1bGVzLy5iaW4vYmxpdHogY29kZWdlblwiYFxuICAgICk7XG4gIH0gZWxzZSBpZiAoY29uZmlnLmRlcGVuZGluZy5wcmlzbWEpIHtcbiAgICBwb3N0TWVyZ2VDb21tYW5kcy5wdXNoKFxuICAgICAgU3RyaW5nLnJhd2BydW5faWZfY2hhbmdlZCBcIi4qXFwucHJpc21hXCIgXCJub2RlIG5vZGVfbW9kdWxlcy8uYmluL2RvdGVudiAtYyBkZXZlbG9wbWVudCAtLSBub2RlIG5vZGVfbW9kdWxlcy8uYmluL3ByaXNtYSBtaWdyYXRlIGRlcGxveVwiYCxcbiAgICAgIFN0cmluZy5yYXdgcnVuX2lmX2NoYW5nZWQgXCIuKlxcLnByaXNtYVwiIFwibm9kZSBub2RlX21vZHVsZXMvLmJpbi9kb3RlbnYgLWMgZGV2ZWxvcG1lbnQgLS0gbm9kZSBub2RlX21vZHVsZXMvLmJpbi9wcmlzbWEgZ2VuZXJhdGVcImBcbiAgICApO1xuICB9XG4gIGNvbnN0IGdlbkkxOG5Uc0NvbW1hbmQgPSBnZXRHZW5JMThuVHNDb21tYW5kKGNvbmZpZywgY29uZmlnLnBhY2thZ2VKc29uPy5zY3JpcHRzKTtcbiAgaWYgKGdlbkkxOG5Uc0NvbW1hbmQpIHtcbiAgICAvLyBnZW4taTE4bi10cyBvdXRwdXRzIGFyZSBjb21tb25seSBpZ25vcmVkLCBzbyBwb3N0LW1lcmdlIHJlZ2VuZXJhdGVzIHRoZW0gYWZ0ZXIgcHVsbGVkIHJlc291cmNlIGNoYW5nZXMuXG4gICAgcG9zdE1lcmdlQ29tbWFuZHMucHVzaChTdHJpbmcucmF3YHJ1bl9pZl9jaGFuZ2VkIFwiKF58LylpMThuLy4qXFwuanNvbiRcIiBcIiR7Z2VuSTE4blRzQ29tbWFuZH1cImApO1xuICB9XG4gIHJldHVybiBwb3N0TWVyZ2VDb21tYW5kcztcbn1cblxuZnVuY3Rpb24gaGFzUHl0aG9uUGFja2FnZU1hbmFnZXIoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogYm9vbGVhbiB7XG4gIHJldHVybiBjb25maWcuZG9lc0NvbnRhaW5Qb2V0cnlMb2NrIHx8IGNvbmZpZy5kb2VzQ29udGFpblV2TG9jaztcbn1cblxuZnVuY3Rpb24gZ2V0UHl0aG9uUnVubmVyKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6ICdwb2V0cnkgcnVuJyB8ICd1diBydW4nIHtcbiAgcmV0dXJuIGNvbmZpZy5kb2VzQ29udGFpblV2TG9jayA/ICd1diBydW4nIDogJ3BvZXRyeSBydW4nO1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlTGludHN0YWdlZHJjKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2dlbmVyYXRlTGludHN0YWdlZHJjJywgYXN5bmMgKCkgPT4ge1xuICAgIGF3YWl0IFByb21pc2UuYWxsKFtcbiAgICAgIHByb21pc2VQb29sLnJ1bigoKSA9PiBmcy5wcm9taXNlcy5ybShgJHtjb25maWcuZGlyUGF0aH0vLmxpbnRzdGFnZWRyYy5janNgLCB7IGZvcmNlOiB0cnVlIH0pKSxcbiAgICAgIHByb21pc2VQb29sLnJ1bigoKSA9PiBmcy5wcm9taXNlcy5ybShgJHtjb25maWcuZGlyUGF0aH0vLmxpbnRzdGFnZWRyYy5qc2AsIHsgZm9yY2U6IHRydWUgfSkpLFxuICAgICAgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzLnByb21pc2VzLnJtKGAke2NvbmZpZy5kaXJQYXRofS8ubGludHN0YWdlZHJjLmpzb25gLCB7IGZvcmNlOiB0cnVlIH0pKSxcbiAgICBdKTtcbiAgfSk7XG59XG4iLCJleHBvcnQgZnVuY3Rpb24gbm9ybWFsaXplQ29uZmlnQ29udGVudChjb250ZW50OiBzdHJpbmcgfCB1bmRlZmluZWQpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICByZXR1cm4gY29udGVudD8udHJpbSgpO1xufVxuIiwiZXhwb3J0IHR5cGUgQ29uZmlnQmxvY2tOYW1lID0gJ2Jhc2UnIHwgJ2V4cG9ydCc7XG5cbmludGVyZmFjZSBNYW5hZ2VkQ29uZmlnQmxvY2tzT3B0aW9ucyB7XG4gIGJsb2NrTmFtZXM6IHJlYWRvbmx5IENvbmZpZ0Jsb2NrTmFtZVtdO1xuICBtYXJrZXJQcmVmaXg6IHN0cmluZztcbiAgdG9vbE5hbWU6IHN0cmluZztcbn1cblxuaW50ZXJmYWNlIEdldENvbmZpZ0NvbnRlbnRPcHRpb25zIHtcbiAgZGVzaXJlZENvbnRlbnQ6IHN0cmluZztcbiAgZXhpc3RpbmdDb250ZW50OiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gIGZpbGVQYXRoOiBzdHJpbmc7XG59XG5cbmV4cG9ydCBjbGFzcyBNYW5hZ2VkQ29uZmlnQmxvY2tzIHtcbiAgcHJpdmF0ZSByZWFkb25seSBibG9ja05hbWVzOiByZWFkb25seSBDb25maWdCbG9ja05hbWVbXTtcblxuICBwcml2YXRlIHJlYWRvbmx5IG1hcmtlclByZWZpeDogc3RyaW5nO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgdG9vbE5hbWU6IHN0cmluZztcblxuICBjb25zdHJ1Y3RvcihvcHRpb25zOiBNYW5hZ2VkQ29uZmlnQmxvY2tzT3B0aW9ucykge1xuICAgIHRoaXMuYmxvY2tOYW1lcyA9IG9wdGlvbnMuYmxvY2tOYW1lcztcbiAgICB0aGlzLm1hcmtlclByZWZpeCA9IG9wdGlvbnMubWFya2VyUHJlZml4O1xuICAgIHRoaXMudG9vbE5hbWUgPSBvcHRpb25zLnRvb2xOYW1lO1xuICB9XG5cbiAgZ2V0Q29uZmlnQ29udGVudChvcHRpb25zOiBHZXRDb25maWdDb250ZW50T3B0aW9ucyk6IHN0cmluZyB7XG4gICAgaWYgKCFvcHRpb25zLmV4aXN0aW5nQ29udGVudCkgcmV0dXJuIG9wdGlvbnMuZGVzaXJlZENvbnRlbnQ7XG4gICAgaWYgKHRoaXMuaGFzTWFuYWdlZEJsb2NrcyhvcHRpb25zLmV4aXN0aW5nQ29udGVudCkpIHtcbiAgICAgIHJldHVybiB0aGlzLnJlcGxhY2VNYW5hZ2VkQmxvY2tzKG9wdGlvbnMuZXhpc3RpbmdDb250ZW50LCBvcHRpb25zLmRlc2lyZWRDb250ZW50LCBvcHRpb25zLmZpbGVQYXRoKTtcbiAgICB9XG4gICAgcmV0dXJuIG9wdGlvbnMuZGVzaXJlZENvbnRlbnQ7XG4gIH1cblxuICBnZXRCbG9jayhibG9ja05hbWU6IENvbmZpZ0Jsb2NrTmFtZSwgY29udGVudDogc3RyaW5nKTogc3RyaW5nIHtcbiAgICByZXR1cm4gYCR7dGhpcy5nZXRTdGFydE1hcmtlcihibG9ja05hbWUpfVxuJHtjb250ZW50fVxuJHt0aGlzLmdldEVuZE1hcmtlcihibG9ja05hbWUpfWA7XG4gIH1cblxuICBoYXNNYW5hZ2VkQmxvY2tzKGNvbnRlbnQ6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmJsb2NrTmFtZXMuc29tZSgoYmxvY2tOYW1lKSA9PiBjb250ZW50LmluY2x1ZGVzKHRoaXMuZ2V0U3RhcnRNYXJrZXIoYmxvY2tOYW1lKSkpO1xuICB9XG5cbiAgcHJpdmF0ZSByZXBsYWNlTWFuYWdlZEJsb2NrcyhleGlzdGluZ0NvbnRlbnQ6IHN0cmluZywgZGVzaXJlZENvbnRlbnQ6IHN0cmluZywgZmlsZVBhdGg6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgbGV0IGNvbnRlbnQgPSBleGlzdGluZ0NvbnRlbnQ7XG4gICAgZm9yIChjb25zdCBibG9ja05hbWUgb2YgdGhpcy5ibG9ja05hbWVzKSB7XG4gICAgICBjb25zdCByZXBsYWNlbWVudCA9IHRoaXMuZXh0cmFjdE1hbmFnZWRCbG9jayhkZXNpcmVkQ29udGVudCwgYmxvY2tOYW1lKTtcbiAgICAgIGlmICghcmVwbGFjZW1lbnQpIGNvbnRpbnVlO1xuXG4gICAgICBjb25zdCBuZXh0Q29udGVudCA9IHRoaXMucmVwbGFjZU1hbmFnZWRCbG9jayhjb250ZW50LCBibG9ja05hbWUsIHJlcGxhY2VtZW50KTtcbiAgICAgIGlmICghbmV4dENvbnRlbnQpIHtcbiAgICAgICAgY29uc29sZS53YXJuKGBTa2lwcGVkIHVwZGF0aW5nIGluY29tcGxldGUgJHtibG9ja05hbWV9IGJsb2NrIGluICR7dGhpcy50b29sTmFtZX0gY29uZmlnOiAke2ZpbGVQYXRofWApO1xuICAgICAgICByZXR1cm4gZXhpc3RpbmdDb250ZW50O1xuICAgICAgfVxuICAgICAgY29udGVudCA9IG5leHRDb250ZW50O1xuICAgIH1cbiAgICByZXR1cm4gY29udGVudDtcbiAgfVxuXG4gIHByaXZhdGUgZXh0cmFjdE1hbmFnZWRCbG9jayhjb250ZW50OiBzdHJpbmcsIGJsb2NrTmFtZTogQ29uZmlnQmxvY2tOYW1lKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5nZXRNYW5hZ2VkQmxvY2tSZWdFeHAoYmxvY2tOYW1lKS5leGVjKGNvbnRlbnQpPy5bMF07XG4gIH1cblxuICBwcml2YXRlIHJlcGxhY2VNYW5hZ2VkQmxvY2soY29udGVudDogc3RyaW5nLCBibG9ja05hbWU6IENvbmZpZ0Jsb2NrTmFtZSwgcmVwbGFjZW1lbnQ6IHN0cmluZyk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgY29uc3QgcGF0dGVybiA9IHRoaXMuZ2V0TWFuYWdlZEJsb2NrUmVnRXhwKGJsb2NrTmFtZSk7XG4gICAgaWYgKCFwYXR0ZXJuLnRlc3QoY29udGVudCkpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgcmV0dXJuIGNvbnRlbnQucmVwbGFjZShwYXR0ZXJuLCByZXBsYWNlbWVudCk7XG4gIH1cblxuICBwcml2YXRlIGdldE1hbmFnZWRCbG9ja1JlZ0V4cChibG9ja05hbWU6IENvbmZpZ0Jsb2NrTmFtZSk6IFJlZ0V4cCB7XG4gICAgcmV0dXJuIG5ldyBSZWdFeHAoXG4gICAgICBgJHtlc2NhcGVSZWdFeHAodGhpcy5nZXRTdGFydE1hcmtlcihibG9ja05hbWUpKX1bXFxcXHNcXFxcU10qPyR7ZXNjYXBlUmVnRXhwKHRoaXMuZ2V0RW5kTWFya2VyKGJsb2NrTmFtZSkpfWBcbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRTdGFydE1hcmtlcihibG9ja05hbWU6IENvbmZpZ0Jsb2NrTmFtZSk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGAvLyB3YmZ5OnN0YXJ0ICR7dGhpcy5tYXJrZXJQcmVmaXh9LSR7YmxvY2tOYW1lfWA7XG4gIH1cblxuICBwcml2YXRlIGdldEVuZE1hcmtlcihibG9ja05hbWU6IENvbmZpZ0Jsb2NrTmFtZSk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGAvLyB3YmZ5OmVuZCAke3RoaXMubWFya2VyUHJlZml4fS0ke2Jsb2NrTmFtZX1gO1xuICB9XG59XG5cbmZ1bmN0aW9uIGVzY2FwZVJlZ0V4cCh2YWx1ZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIHZhbHVlLnJlcGxhY2VBbGwoL1suKis/XiR7fSgpfFtcXF1cXFxcXS9nLCBTdHJpbmcucmF3YFxcJCZgKTtcbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGZzVXRpbCB9IGZyb20gJy4uL3V0aWxzL2ZzVXRpbC5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcblxuaW1wb3J0IHsgbm9ybWFsaXplQ29uZmlnQ29udGVudCB9IGZyb20gJy4vY29uZmlnQ29udGVudC5qcyc7XG5pbXBvcnQgeyBNYW5hZ2VkQ29uZmlnQmxvY2tzIH0gZnJvbSAnLi9tYW5hZ2VkQ29uZmlnQmxvY2suanMnO1xuXG5jb25zdCBtYW5hZ2VkQ29uZmlnQmxvY2tzID0gbmV3IE1hbmFnZWRDb25maWdCbG9ja3Moe1xuICBibG9ja05hbWVzOiBbJ2Jhc2UnLCAnZXhwb3J0J10sXG4gIG1hcmtlclByZWZpeDogJ294Zm10JyxcbiAgdG9vbE5hbWU6ICdveGZtdCcsXG59KTtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlT3hmbXRDb25maWcoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZ2VuZXJhdGVPeGZtdENvbmZpZycsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBsZWdhY3lKc29uQ29uZmlnUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJy5veGZtdHJjLmpzb24nKTtcbiAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJ294Zm10LmNvbmZpZy50cycpO1xuICAgIGNvbnN0IGV4aXN0aW5nQ29udGVudCA9IGF3YWl0IGZzVXRpbC5yZWFkRmlsZUlnbm9yaW5nRXJyb3IoZmlsZVBhdGgpO1xuICAgIGNvbnN0IGRlc2lyZWRDb250ZW50ID0gbWFuYWdlZENvbmZpZ0Jsb2Nrcy5nZXRDb25maWdDb250ZW50KHtcbiAgICAgIGRlc2lyZWRDb250ZW50OiBnZXRDb25maWdDb250ZW50KGNvbmZpZyksXG4gICAgICBleGlzdGluZ0NvbnRlbnQsXG4gICAgICBmaWxlUGF0aCxcbiAgICB9KTtcbiAgICBjb25zdCBwcm9taXNlcyA9IFtwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnMucHJvbWlzZXMucm0obGVnYWN5SnNvbkNvbmZpZ1BhdGgsIHsgZm9yY2U6IHRydWUgfSkpXTtcbiAgICBpZiAobm9ybWFsaXplQ29uZmlnQ29udGVudChleGlzdGluZ0NvbnRlbnQpICE9PSBub3JtYWxpemVDb25maWdDb250ZW50KGRlc2lyZWRDb250ZW50KSkge1xuICAgICAgcHJvbWlzZXMucHVzaChwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnNVdGlsLmdlbmVyYXRlRmlsZShmaWxlUGF0aCwgZGVzaXJlZENvbnRlbnQpKSk7XG4gICAgfVxuICAgIGF3YWl0IFByb21pc2UuYWxsKHByb21pc2VzKTtcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIGdldENvbmZpZ0NvbnRlbnQoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogc3RyaW5nIHtcbiAgLy8gQ29tbW9uSlMgcGFja2FnZXMgbmVlZCByZXF1aXJlL21vZHVsZS5leHBvcnRzIGhlcmU6IG94Zm10IGNvbmZpZyBmaWxlcyBhcmVcbiAgLy8gb25seSBhdXRvLWRpc2NvdmVyZWQgYXMgLnRzLCBhbmQgdGhlIHNoYXJlZCBjb25maWcgcGFja2FnZSBpcyBFU00tb25seS5cbiAgaWYgKCFjb25maWcuaXNFc21QYWNrYWdlKSB7XG4gICAgcmV0dXJuIGAke21hbmFnZWRDb25maWdCbG9ja3MuZ2V0QmxvY2soXG4gICAgICAnYmFzZScsXG4gICAgICBgLy8vIDxyZWZlcmVuY2UgdHlwZXM9XCJub2RlXCIgLz5cbi8vIG94bGludC1kaXNhYmxlIHVuaWNvcm4vcHJlZmVyLW1vZHVsZSAtLSBPeGZtdCBjb25maWcgZmlsZXMgYXJlIG9ubHkgYXV0by1kaXNjb3ZlcmVkIGFzIC50cywgYW5kIENvbW1vbkpTIGF2b2lkcyBFU00gcGFja2FnZSBsb2FkaW5nIGlzc3Vlcy5cbmNvbnN0IG94Zm10Q29uZmlnID0gcmVxdWlyZSgnQHdpbGxib29zdGVyL294Zm10LWNvbmZpZycpO1xuXG5jb25zdCBveGZtdFJlc29sdmVkQ29uZmlnID0gb3hmbXRDb25maWcuZGVmYXVsdCA/PyBveGZtdENvbmZpZztgXG4gICAgKX1cblxuJHttYW5hZ2VkQ29uZmlnQmxvY2tzLmdldEJsb2NrKCdleHBvcnQnLCAnbW9kdWxlLmV4cG9ydHMgPSBveGZtdFJlc29sdmVkQ29uZmlnOycpfVxuYDtcbiAgfVxuXG4gIHJldHVybiBgJHttYW5hZ2VkQ29uZmlnQmxvY2tzLmdldEJsb2NrKCdiYXNlJywgXCJpbXBvcnQgY29uZmlnIGZyb20gJ0B3aWxsYm9vc3Rlci9veGZtdC1jb25maWcnO1wiKX1cblxuJHttYW5hZ2VkQ29uZmlnQmxvY2tzLmdldEJsb2NrKCdleHBvcnQnLCAnZXhwb3J0IGRlZmF1bHQgY29uZmlnOycpfVxuYDtcbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGZzVXRpbCB9IGZyb20gJy4uL3V0aWxzL2ZzVXRpbC5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcbmltcG9ydCB7IGlzUHVibGlzaGVkV2lsbGJvb3N0ZXJDb25maWdzUGFja2FnZSB9IGZyb20gJy4uL3V0aWxzL3dpbGxib29zdGVyQ29uZmlnc1V0aWwuanMnO1xuXG5pbXBvcnQgeyBub3JtYWxpemVDb25maWdDb250ZW50IH0gZnJvbSAnLi9jb25maWdDb250ZW50LmpzJztcbmltcG9ydCB7IE1hbmFnZWRDb25maWdCbG9ja3MgfSBmcm9tICcuL21hbmFnZWRDb25maWdCbG9jay5qcyc7XG5cbmNvbnN0IG1hbmFnZWRDb25maWdCbG9ja3MgPSBuZXcgTWFuYWdlZENvbmZpZ0Jsb2Nrcyh7XG4gIGJsb2NrTmFtZXM6IFsnYmFzZScsICdleHBvcnQnXSxcbiAgbWFya2VyUHJlZml4OiAnb3hsaW50JyxcbiAgdG9vbE5hbWU6ICdveGxpbnQnLFxufSk7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZW5lcmF0ZU94bGludENvbmZpZyhjb25maWc6IFBhY2thZ2VDb25maWcsIF9yb290Q29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZ2VuZXJhdGVPeGxpbnRDb25maWcnLCBhc3luYyAoKSA9PiB7XG4gICAgLy8gd2lsbGJvb3N0ZXItY29uZmlncyBwdWJsaXNoZXMgY29uZmlnIGZpbGVzIGFzIHByb2R1Y3QgY29kZSwgc28gbWlncmF0aW9uXG4gICAgLy8gbXVzdCBub3QgcmVtb3ZlIHBhY2thZ2UtcHJvdmlkZWQgbGludGVyIHNldHRpbmdzLiBHZW5lcmF0ZWQgZmlsZXMgd2l0aFxuICAgIC8vIG1hbmFnZWQgYmxvY2tzIGFyZSBzdGlsbCBzYWZlIHRvIHVwZGF0ZS5cbiAgICBjb25zdCBzaG91bGRQcmVzZXJ2ZVB1Ymxpc2hlZExpbnRlckNvbmZpZyA9IGlzUHVibGlzaGVkV2lsbGJvb3N0ZXJDb25maWdzUGFja2FnZShjb25maWcpO1xuICAgIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnb3hsaW50LmNvbmZpZy50cycpO1xuICAgIGNvbnN0IGV4aXN0aW5nQ29udGVudCA9IGF3YWl0IGZzVXRpbC5yZWFkRmlsZUlnbm9yaW5nRXJyb3IoZmlsZVBhdGgpO1xuICAgIGNvbnN0IHNob3VsZFByZXNlcnZlRXhpc3RpbmdDb250ZW50ID1cbiAgICAgIHNob3VsZFByZXNlcnZlUHVibGlzaGVkTGludGVyQ29uZmlnICYmIGV4aXN0aW5nQ29udGVudCAmJiAhbWFuYWdlZENvbmZpZ0Jsb2Nrcy5oYXNNYW5hZ2VkQmxvY2tzKGV4aXN0aW5nQ29udGVudCk7XG4gICAgY29uc3QgZGVzaXJlZENvbnRlbnQgPSBzaG91bGRQcmVzZXJ2ZUV4aXN0aW5nQ29udGVudFxuICAgICAgPyBleGlzdGluZ0NvbnRlbnRcbiAgICAgIDogcmVwbGFjZUxlZ2FjeUNvbmZpZ1JlZmVyZW5jZXMoXG4gICAgICAgICAgbWFuYWdlZENvbmZpZ0Jsb2Nrcy5nZXRDb25maWdDb250ZW50KHtcbiAgICAgICAgICAgIGRlc2lyZWRDb250ZW50OiBnZXRDb25maWdDb250ZW50KGNvbmZpZyksXG4gICAgICAgICAgICBleGlzdGluZ0NvbnRlbnQsXG4gICAgICAgICAgICBmaWxlUGF0aCxcbiAgICAgICAgICB9KVxuICAgICAgICApO1xuXG4gICAgY29uc3QgcHJvbWlzZXM6IFByb21pc2U8dm9pZD5bXSA9IFtdO1xuICAgIGlmICghc2hvdWxkUHJlc2VydmVQdWJsaXNoZWRMaW50ZXJDb25maWcpIHtcbiAgICAgIHByb21pc2VzLnB1c2goXG4gICAgICAgIHByb21pc2VQb29sLnJ1bigoKSA9PiBmcy5wcm9taXNlcy5ybShwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICcub3hsaW50cmMuanNvbicpLCB7IGZvcmNlOiB0cnVlIH0pKSxcbiAgICAgICAgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzLnByb21pc2VzLnJtKHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJ2Jpb21lLmpzb24nKSwgeyBmb3JjZTogdHJ1ZSB9KSksXG4gICAgICAgIHByb21pc2VQb29sLnJ1bigoKSA9PiBmcy5wcm9taXNlcy5ybShwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICdiaW9tZS5qc29uYycpLCB7IGZvcmNlOiB0cnVlIH0pKSxcbiAgICAgICAgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzLnByb21pc2VzLnJtKHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJy5lc2xpbnRyYycpLCB7IGZvcmNlOiB0cnVlIH0pKSxcbiAgICAgICAgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzLnByb21pc2VzLnJtKHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJy5lc2xpbnRyYy5janMnKSwgeyBmb3JjZTogdHJ1ZSB9KSksXG4gICAgICAgIHByb21pc2VQb29sLnJ1bigoKSA9PiBmcy5wcm9taXNlcy5ybShwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICcuZXNsaW50cmMuanMnKSwgeyBmb3JjZTogdHJ1ZSB9KSksXG4gICAgICAgIHByb21pc2VQb29sLnJ1bigoKSA9PiBmcy5wcm9taXNlcy5ybShwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICcuZXNsaW50cmMuanNvbicpLCB7IGZvcmNlOiB0cnVlIH0pKSxcbiAgICAgICAgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzLnByb21pc2VzLnJtKHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJy5lc2xpbnRyYy55YW1sJyksIHsgZm9yY2U6IHRydWUgfSkpLFxuICAgICAgICBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnMucHJvbWlzZXMucm0ocGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnLmVzbGludHJjLnltbCcpLCB7IGZvcmNlOiB0cnVlIH0pKSxcbiAgICAgICAgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzLnByb21pc2VzLnJtKHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJ2VzbGludC5jb25maWcuY2pzJyksIHsgZm9yY2U6IHRydWUgfSkpLFxuICAgICAgICBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnMucHJvbWlzZXMucm0ocGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnZXNsaW50LmNvbmZpZy5qcycpLCB7IGZvcmNlOiB0cnVlIH0pKSxcbiAgICAgICAgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzLnByb21pc2VzLnJtKHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJ2VzbGludC5jb25maWcubWpzJyksIHsgZm9yY2U6IHRydWUgfSkpLFxuICAgICAgICBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnMucHJvbWlzZXMucm0ocGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnZXNsaW50LmNvbmZpZy50cycpLCB7IGZvcmNlOiB0cnVlIH0pKVxuICAgICAgKTtcbiAgICB9XG4gICAgaWYgKG5vcm1hbGl6ZUNvbmZpZ0NvbnRlbnQoZXhpc3RpbmdDb250ZW50KSAhPT0gbm9ybWFsaXplQ29uZmlnQ29udGVudChkZXNpcmVkQ29udGVudCkpIHtcbiAgICAgIHByb21pc2VzLnB1c2gocHJvbWlzZVBvb2wucnVuKCgpID0+IGZzVXRpbC5nZW5lcmF0ZUZpbGUoZmlsZVBhdGgsIGRlc2lyZWRDb250ZW50KSkpO1xuICAgIH1cbiAgICBhd2FpdCBQcm9taXNlLmFsbChwcm9taXNlcyk7XG4gIH0pO1xufVxuXG5mdW5jdGlvbiByZXBsYWNlTGVnYWN5Q29uZmlnUmVmZXJlbmNlcyhjb250ZW50OiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gY29udGVudC5yZXBsYWNlQWxsKCdjb25maWcuJywgJ294bGludFJlc29sdmVkQ29uZmlnLicpO1xufVxuXG5mdW5jdGlvbiBnZXRDb25maWdDb250ZW50KGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IHN0cmluZyB7XG4gIGNvbnN0IGlzUm9vdENvbmZpZyA9IGNvbmZpZy5pc1Jvb3Q7XG5cbiAgLy8gRG8gbm90IGNvbGxhcHNlIHRoaXMgdG8gYSBzdGF0aWMgaW1wb3J0IGZvciBldmVyeSBwYWNrYWdlLiBDb21tb25KUyBwYWNrYWdlc1xuICAvLyB0eXBlLWNoZWNrIGF1dG8tZGlzY292ZXJlZCBveGxpbnQuY29uZmlnLnRzIGFzIENvbW1vbkpTLCBzbyBpbXBvcnRpbmcgdGhlIEVTTVxuICAvLyBAd2lsbGJvb3N0ZXIvb3hsaW50LWNvbmZpZyBwYWNrYWdlIHRyaWdnZXJzIFRTMTQ3OS4gS2VlcCB0aGlzIGluIHN5bmMgd2l0aFxuICAvLyBsaXRlcmFjeS10ZXN0J3MgZ2VuZXJhdGVkIGNvbmZpZyBwYXR0ZXJuLlxuICBpZiAoIWNvbmZpZy5pc0VzbVBhY2thZ2UpIHtcbiAgICByZXR1cm4gYCR7bWFuYWdlZENvbmZpZ0Jsb2Nrcy5nZXRCbG9jayhcbiAgICAgICdiYXNlJyxcbiAgICAgIGAvLy8gPHJlZmVyZW5jZSB0eXBlcz1cIm5vZGVcIiAvPlxuLy8gb3hsaW50LWRpc2FibGUgdW5pY29ybi9wcmVmZXItbW9kdWxlIC0tIE94bGludCBvbmx5IGF1dG8tZGlzY292ZXJzIC50cyBjb25maWcgZmlsZXMsIGFuZCBDb21tb25KUyBhdm9pZHMgRVNNIHBhY2thZ2UgbG9hZGluZyBpc3N1ZXMuXG5jb25zdCBveGxpbnRCYXNlQ29uZmlnID0gcmVxdWlyZSgnQHdpbGxib29zdGVyL294bGludC1jb25maWcnKTtcblxuJHtnZXRSZXNvbHZlZENvbmZpZ0NvbnRlbnQoJ294bGludEJhc2VDb25maWcuZGVmYXVsdCA/PyBveGxpbnRCYXNlQ29uZmlnJywgaXNSb290Q29uZmlnKX1gXG4gICAgKX1cblxuJHttYW5hZ2VkQ29uZmlnQmxvY2tzLmdldEJsb2NrKCdleHBvcnQnLCAnbW9kdWxlLmV4cG9ydHMgPSBveGxpbnRSZXNvbHZlZENvbmZpZzsnKX1cbmA7XG4gIH1cblxuICByZXR1cm4gYCR7bWFuYWdlZENvbmZpZ0Jsb2Nrcy5nZXRCbG9jayhcbiAgICAnYmFzZScsXG4gICAgYGltcG9ydCBveGxpbnRCYXNlQ29uZmlnIGZyb20gJ0B3aWxsYm9vc3Rlci9veGxpbnQtY29uZmlnJztcblxuJHtnZXRSZXNvbHZlZENvbmZpZ0NvbnRlbnQoJ294bGludEJhc2VDb25maWcnLCBpc1Jvb3RDb25maWcpfWBcbiAgKX1cblxuJHttYW5hZ2VkQ29uZmlnQmxvY2tzLmdldEJsb2NrKCdleHBvcnQnLCAnZXhwb3J0IGRlZmF1bHQgb3hsaW50UmVzb2x2ZWRDb25maWc7Jyl9XG5gO1xufVxuXG5mdW5jdGlvbiBnZXRSZXNvbHZlZENvbmZpZ0NvbnRlbnQoYmFzZUNvbmZpZ05hbWU6IHN0cmluZywgaXNSb290Q29uZmlnOiBib29sZWFuKTogc3RyaW5nIHtcbiAgaWYgKGlzUm9vdENvbmZpZykge1xuICAgIHJldHVybiBgY29uc3Qgb3hsaW50UmVzb2x2ZWRDb25maWcgPSAke2Jhc2VDb25maWdOYW1lfTtgO1xuICB9XG5cbiAgcmV0dXJuIGAvLyBPeGxpbnQgb25seSBzdXBwb3J0cyB0eXBlLWF3YXJlIG9wdGlvbnMgaW4gdGhlIHJvb3QgY29uZmlnLCB3aGlsZSBpdFxuLy8gc3RpbGwgYXV0by1kaXNjb3ZlcnMgcGFja2FnZS1sb2NhbCBjb25maWcgZmlsZXMgaW4gbW9ub3JlcG9zLiBLZWVwIHRoaXMgYXMgYVxuLy8gcGxhaW4gb2JqZWN0IGNvcHkgc28gcGFja2FnZSB0eXBlY2hlY2tzIGRvIG5vdCBleHBvcnQgb3hsaW50J3MgcHJpdmF0ZSBoZWxwZXJcbi8vIHR5cGVzIHRocm91Z2ggdGhlIGdlbmVyYXRlZCBjb25maWcgdmFyaWFibGUuXG5jb25zdCBveGxpbnRSZXNvbHZlZENvbmZpZzogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPSB7IC4uLiR7YmFzZUNvbmZpZ05hbWV9IH07XG5kZWxldGUgb3hsaW50UmVzb2x2ZWRDb25maWcub3B0aW9ucztgO1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZnNVdGlsIH0gZnJvbSAnLi4vdXRpbHMvZnNVdGlsLmpzJztcbmltcG9ydCB7IGlnbm9yZUZpbGVVdGlsIH0gZnJvbSAnLi4vdXRpbHMvaWdub3JlRmlsZVV0aWwuanMnO1xuaW1wb3J0IHsgZG9lc0NvbnRhaW5KYXZhIH0gZnJvbSAnLi4vdXRpbHMvcGFja2FnZUNhcGFiaWxpdGllcy5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcblxuY29uc3QgY29tbW9uQ29udGVudCA9IGBcbjNyZC1wYXJ0eS9cbmFuZHJvaWQvXG5pb3MvXG5uby1mb3JtYXQvXG50ZXN0LWZpeHR1cmVzL1xudGVzdC9maXh0dXJlcy9cbiouZC50c1xuKi5taW4uanNcbi55YXJuL1xuLnBucC5qc1xuYDtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlUHJldHRpZXJpZ25vcmUoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZ2VuZXJhdGVQcmV0dGllcmlnbm9yZScsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJy5wcmV0dGllcmlnbm9yZScpO1xuICAgIGlmICghZG9lc0NvbnRhaW5KYXZhKGNvbmZpZykpIHtcbiAgICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiBmcy5wcm9taXNlcy5ybShmaWxlUGF0aCwgeyBmb3JjZTogdHJ1ZSB9KSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IGNvbnRlbnQgPSAoYXdhaXQgZnNVdGlsLnJlYWRGaWxlSWdub3JpbmdFcnJvcihmaWxlUGF0aCkpID8/ICcnO1xuICAgIGNvbnN0IGhlYWRVc2VyQ29udGVudCA9IGlnbm9yZUZpbGVVdGlsLmdldEhlYWRVc2VyQ29udGVudChjb250ZW50KTtcbiAgICBjb25zdCB0YWlsVXNlckNvbnRlbnQgPSBpZ25vcmVGaWxlVXRpbC5nZXRUYWlsVXNlckNvbnRlbnQoY29udGVudCk7XG5cbiAgICBjb25zdCBnaXRpZ25vcmVGaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJy5naXRpZ25vcmUnKTtcbiAgICBjb25zdCBnaXRpZ25vcmVDb250ZW50ID0gKGF3YWl0IGlnbm9yZUZpbGVVdGlsLnJlYWRHaXRpZ25vcmVXaXRob3V0U2VwYXJhdG9ycyhnaXRpZ25vcmVGaWxlUGF0aCkpIHx8ICcnO1xuXG4gICAgbGV0IGFkZGl0aW9uYWxDb250ZW50ID0gJyc7XG4gICAgaWYgKGNvbmZpZy5kb2VzQ29udGFpblB1YnNwZWNZYW1sKSB7XG4gICAgICBhZGRpdGlvbmFsQ29udGVudCA9IGBcbmFuZHJvaWQvYXBwL1xuaW9zL1J1bm5lci9Bc3NldHMueGNhc3NldHMvXG5wdWJzcGVjLnlhbWxcbmA7XG4gICAgfVxuXG4gICAgY29uc3QgbmV3Q29udGVudCA9IGhlYWRVc2VyQ29udGVudCArIGNvbW1vbkNvbnRlbnQgKyBhZGRpdGlvbmFsQ29udGVudCArIGdpdGlnbm9yZUNvbnRlbnQgKyB0YWlsVXNlckNvbnRlbnQ7XG4gICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzVXRpbC5nZW5lcmF0ZUZpbGUoZmlsZVBhdGgsIG5ld0NvbnRlbnQpKTtcbiAgfSk7XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgbWVyZ2UgZnJvbSAnZGVlcG1lcmdlJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZnNVdGlsIH0gZnJvbSAnLi4vdXRpbHMvZnNVdGlsLmpzJztcbmltcG9ydCB7IG92ZXJ3cml0ZU1lcmdlIH0gZnJvbSAnLi4vdXRpbHMvbWVyZ2VVdGlsLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuXG5jb25zdCBqc29uT2JqID0ge1xuICB2ZW52UGF0aDogJy4nLFxuICB2ZW52OiAnLnZlbnYnLFxufTtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlUHlyaWdodENvbmZpZ0pzb24oY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZ2VuZXJhdGVQeXJpZ2h0Q29uZmlnSnNvbicsIGFzeW5jICgpID0+IHtcbiAgICBsZXQgbmV3U2V0dGluZ3M6IG9iamVjdCA9IHN0cnVjdHVyZWRDbG9uZShqc29uT2JqKTtcbiAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJ3B5cmlnaHRjb25maWcuanNvbicpO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBvbGRDb250ZW50ID0gYXdhaXQgZnMucHJvbWlzZXMucmVhZEZpbGUoZmlsZVBhdGgsICd1dGY4Jyk7XG4gICAgICBjb25zdCBvbGRTZXR0aW5ncyA9IEpTT04ucGFyc2Uob2xkQ29udGVudCkgYXMgb2JqZWN0O1xuICAgICAgbmV3U2V0dGluZ3MgPSBtZXJnZS5hbGwoW25ld1NldHRpbmdzLCBvbGRTZXR0aW5ncywgbmV3U2V0dGluZ3NdLCB7IGFycmF5TWVyZ2U6IG92ZXJ3cml0ZU1lcmdlIH0pO1xuICAgIH0gY2F0Y2gge1xuICAgICAgLy8gZG8gbm90aGluZ1xuICAgIH1cbiAgICBjb25zdCBuZXdDb250ZW50ID0gSlNPTi5zdHJpbmdpZnkobmV3U2V0dGluZ3MsIHVuZGVmaW5lZCwgMik7XG4gICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzVXRpbC5nZW5lcmF0ZUZpbGUoZmlsZVBhdGgsIG5ld0NvbnRlbnQpKTtcbiAgfSk7XG59XG4iLCJpbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBmc1V0aWwgfSBmcm9tICcuLi91dGlscy9mc1V0aWwuanMnO1xuaW1wb3J0IHsgcHJvbWlzZVBvb2wgfSBmcm9tICcuLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5cbmNvbnN0IG1hbmFnZWRTY3JpcHRzQmxvY2sgPSBgc2NyaXB0cy8qKlxuIXNjcmlwdHMvXG4hc2NyaXB0cy8qLnNoYDtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGZpeFJhaWx3YXlpZ25vcmUoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZml4UmFpbHdheWlnbm9yZScsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJy5yYWlsd2F5aWdub3JlJyk7XG4gICAgY29uc3QgY29udGVudCA9IGF3YWl0IGZzVXRpbC5yZWFkRmlsZUlnbm9yaW5nRXJyb3IoZmlsZVBhdGgpO1xuICAgIGlmICghY29udGVudCkgcmV0dXJuO1xuXG4gICAgY29uc3QgbmV3Q29udGVudCA9IGNvbnRlbnQucmVwbGFjZSgvXnNjcmlwdHNcXC8kL20sIG1hbmFnZWRTY3JpcHRzQmxvY2spO1xuICAgIGlmIChuZXdDb250ZW50ID09PSBjb250ZW50KSByZXR1cm47XG5cbiAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnNVdGlsLmdlbmVyYXRlRmlsZShmaWxlUGF0aCwgbmV3Q29udGVudCkpO1xuICB9KTtcbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGZzVXRpbCB9IGZyb20gJy4uL3V0aWxzL2ZzVXRpbC5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcblxuY29uc3Qgc2VtYW50aWNSZWxlYXNlQmFkZ2UgPVxuICAnWyFbc2VtYW50aWMtcmVsZWFzZV0oaHR0cHM6Ly9pbWcuc2hpZWxkcy5pby9iYWRnZS8lMjAlMjAlRjAlOUYlOTMlQTYlRjAlOUYlOUElODAtc2VtYW50aWMtLXJlbGVhc2UtZTEwMDc5LnN2ZyldKGh0dHBzOi8vZ2l0aHViLmNvbS9zZW1hbnRpYy1yZWxlYXNlL3NlbWFudGljLXJlbGVhc2UpJztcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlUmVhZG1lKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2dlbmVyYXRlUmVhZG1lJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnUkVBRE1FLm1kJyk7XG4gICAgbGV0IG5ld0NvbnRlbnQgPSBhd2FpdCBmcy5wcm9taXNlcy5yZWFkRmlsZShmaWxlUGF0aCwgJ3V0ZjgnKTtcblxuICAgIGlmIChmcy5leGlzdHNTeW5jKHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJy5yZWxlYXNlcmMuanNvbicpKSkge1xuICAgICAgbmV3Q29udGVudCA9IGluc2VydEJhZGdlKG5ld0NvbnRlbnQsIHNlbWFudGljUmVsZWFzZUJhZGdlKTtcbiAgICB9XG5cbiAgICBjb25zdCByZXBvc2l0b3J5ID0gY29uZmlnLnJlcG9zaXRvcnk/LnNsaWNlKGNvbmZpZy5yZXBvc2l0b3J5LmluZGV4T2YoJzonKSArIDEpO1xuICAgIGNvbnN0IHdvcmtmbG93c1BhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICcuZ2l0aHViJywgJ3dvcmtmbG93cycpO1xuICAgIGNvbnN0IGZpbGVOYW1lcyA9IGZzLmV4aXN0c1N5bmMod29ya2Zsb3dzUGF0aCkgPyBmcy5yZWFkZGlyU3luYyh3b3JrZmxvd3NQYXRoKSA6IFtdO1xuICAgIGZvciAoY29uc3QgZmlsZU5hbWUgb2YgZmlsZU5hbWVzKSB7XG4gICAgICBpZiAoIWZpbGVOYW1lLnN0YXJ0c1dpdGgoJ3Rlc3QnKSAmJiAhZmlsZU5hbWUuc3RhcnRzV2l0aCgnZGVwbG95JykpIGNvbnRpbnVlO1xuXG4gICAgICBsZXQgYmFkZ2VOYW1lID0gZmlsZU5hbWU7XG4gICAgICBiYWRnZU5hbWUgPSAoYmFkZ2VOYW1lWzBdIHx8ICcnKS50b1VwcGVyQ2FzZSgpICsgYmFkZ2VOYW1lLnNsaWNlKDEsIGJhZGdlTmFtZS5pbmRleE9mKCcuJykpO1xuICAgICAgYmFkZ2VOYW1lID0gYmFkZ2VOYW1lLnJlcGxhY2UoJy0nLCAnICcpO1xuICAgICAgaWYgKCFyZXBvc2l0b3J5KSBjb250aW51ZTtcbiAgICAgIGNvbnN0IGJhZGdlID0gYFshWyR7YmFkZ2VOYW1lfV0oaHR0cHM6Ly9naXRodWIuY29tLyR7cmVwb3NpdG9yeX0vYWN0aW9ucy93b3JrZmxvd3MvJHtmaWxlTmFtZX0vYmFkZ2Uuc3ZnKV0oaHR0cHM6Ly9naXRodWIuY29tLyR7cmVwb3NpdG9yeX0vYWN0aW9ucy93b3JrZmxvd3MvJHtmaWxlTmFtZX0pYDtcbiAgICAgIGlmIChmcy5leGlzdHNTeW5jKHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgYC5naXRodWIvd29ya2Zsb3dzLyR7ZmlsZU5hbWV9YCkpKSB7XG4gICAgICAgIG5ld0NvbnRlbnQgPSByZW1vdmVHaXRIdWJBY3Rpb25zQmFkZ2UobmV3Q29udGVudCwgYmFkZ2VOYW1lLCBmaWxlTmFtZSk7XG4gICAgICAgIG5ld0NvbnRlbnQgPSBpbnNlcnRCYWRnZShuZXdDb250ZW50LCBiYWRnZSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzVXRpbC5nZW5lcmF0ZUZpbGUoZmlsZVBhdGgsIG5ld0NvbnRlbnQpKTtcbiAgfSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpbnNlcnRCYWRnZShyZWFkbWU6IHN0cmluZywgYmFkZ2U6IHN0cmluZyk6IHN0cmluZyB7XG4gIC8vIOaXouOBq2JhZGdl44GM44GC44KL5aC05ZCI44Gv5YmK6ZmkXG4gIHJlYWRtZSA9IHJlYWRtZS5yZXBsYWNlKGJhZGdlLCAnJykucmVwbGFjZUFsbCgvXFxuXFxuXFxuKy9nLCAnXFxuXFxuJyk7XG5cbiAgZm9yIChsZXQgaSA9IDA7IGkgPCByZWFkbWUubGVuZ3RoOyBpKyspIHtcbiAgICBpZiAocmVhZG1lW2kgLSAxXSA9PT0gJ1xcbicgJiYgcmVhZG1lW2ldID09PSAnXFxuJykge1xuICAgICAgY29uc3QgYmVmb3JlID0gcmVhZG1lLnNsaWNlKDAsIGkgKyAxKTtcbiAgICAgIGxldCBhZnRlciA9IHJlYWRtZS5zbGljZShpICsgMSk7XG4gICAgICBpZiAoIWFmdGVyLnN0YXJ0c1dpdGgoJ1snKSAmJiAhYWZ0ZXIuc3RhcnRzV2l0aCgnIScpKSB7XG4gICAgICAgIGFmdGVyID0gYFxcbiR7YWZ0ZXJ9YDtcbiAgICAgIH1cbiAgICAgIHJldHVybiBgJHtiZWZvcmV9JHtiYWRnZX1cXG4ke2FmdGVyfWA7XG4gICAgfVxuICB9XG4gIHJldHVybiBgJHtyZWFkbWV9XFxuJHtiYWRnZX1cXG5gO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcmVtb3ZlR2l0SHViQWN0aW9uc0JhZGdlKHJlYWRtZTogc3RyaW5nLCBiYWRnZU5hbWU6IHN0cmluZywgZmlsZU5hbWU6IHN0cmluZyk6IHN0cmluZyB7XG4gIGNvbnN0IGVzY2FwZWRCYWRnZU5hbWUgPSBlc2NhcGVSZWdFeHAoYmFkZ2VOYW1lKTtcbiAgY29uc3QgZXNjYXBlZEZpbGVOYW1lID0gZXNjYXBlUmVnRXhwKGZpbGVOYW1lKTtcbiAgcmV0dXJuIHJlYWRtZVxuICAgIC5yZXBsYWNlQWxsKFxuICAgICAgbmV3IFJlZ0V4cChcbiAgICAgICAgU3RyaW5nLnJhd2BcXFshXFxbJHtlc2NhcGVkQmFkZ2VOYW1lfVxcXVxcKGh0dHBzOi8vZ2l0aHViXFwuY29tL1teL1xccyldKy9bXi9cXHMpXSsvYWN0aW9ucy93b3JrZmxvd3MvJHtlc2NhcGVkRmlsZU5hbWV9L2JhZGdlXFwuc3ZnXFwpXFxdXFwoaHR0cHM6Ly9naXRodWJcXC5jb20vW14vXFxzKV0rL1teL1xccyldKy9hY3Rpb25zL3dvcmtmbG93cy8ke2VzY2FwZWRGaWxlTmFtZX1cXClcXG4/YCxcbiAgICAgICAgJ2d1J1xuICAgICAgKSxcbiAgICAgICcnXG4gICAgKVxuICAgIC5yZXBsYWNlQWxsKC9cXG5cXG5cXG4rL2csICdcXG5cXG4nKTtcbn1cblxuZnVuY3Rpb24gZXNjYXBlUmVnRXhwKHZhbHVlOiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gdmFsdWUucmVwbGFjZUFsbCgvWy4qKz9eJHt9KCl8W1xcXVxcXFxdL2csIFN0cmluZy5yYXdgXFwkJmApO1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IG1lcmdlIGZyb20gJ2RlZXBtZXJnZSc7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGZzVXRpbCB9IGZyb20gJy4uL3V0aWxzL2ZzVXRpbC5qcyc7XG5pbXBvcnQgeyBvdmVyd3JpdGVNZXJnZSB9IGZyb20gJy4uL3V0aWxzL21lcmdlVXRpbC5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlUmVsZWFzZXJjKHJvb3RDb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdnZW5lcmF0ZVJlbGVhc2VyYycsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShyb290Q29uZmlnLmRpclBhdGgsICcucmVsZWFzZXJjLmpzb24nKTtcbiAgICBpZiAoIWZzLmV4aXN0c1N5bmMoZmlsZVBhdGgpKSByZXR1cm47XG5cbiAgICBjb25zdCBzZXR0aW5ncyA9IEpTT04ucGFyc2UoYXdhaXQgZnMucHJvbWlzZXMucmVhZEZpbGUoZmlsZVBhdGgsICd1dGY4JykpIGFzIHtcbiAgICAgIHBsdWdpbnM/OiAoc3RyaW5nIHwgW3N0cmluZywgdW5rbm93bl0pW107XG4gICAgfTtcbiAgICBjb25zdCBwbHVnaW5zID0gc2V0dGluZ3MucGx1Z2lucyA/PyBbXTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHBsdWdpbnMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNvbnN0IHBsdWdpbkVudHJ5ID0gcGx1Z2luc1tpXTtcbiAgICAgIGNvbnN0IGlzQXJyYXkgPSBBcnJheS5pc0FycmF5KHBsdWdpbkVudHJ5KTtcbiAgICAgIGNvbnN0IHBsdWdpbiA9IGlzQXJyYXkgPyBwbHVnaW5FbnRyeVswXSA6IHBsdWdpbkVudHJ5O1xuICAgICAgY29uc3Qgb2xkQ29uZmlnID0gKGlzQXJyYXkgJiYgcGx1Z2luRW50cnlbMV0pIHx8IHt9O1xuICAgICAgaWYgKHBsdWdpbiA9PT0gJ0BzZW1hbnRpYy1yZWxlYXNlL2NvbW1pdC1hbmFseXplcicpIHtcbiAgICAgICAgcGx1Z2luc1tpXSA9IFtcbiAgICAgICAgICAnQHNlbWFudGljLXJlbGVhc2UvY29tbWl0LWFuYWx5emVyJyxcbiAgICAgICAgICBtZXJnZS5hbGwoXG4gICAgICAgICAgICBbXG4gICAgICAgICAgICAgIG9sZENvbmZpZyxcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHByZXNldDogJ2NvbnZlbnRpb25hbGNvbW1pdHMnLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIHsgYXJyYXlNZXJnZTogb3ZlcndyaXRlTWVyZ2UgfVxuICAgICAgICAgICksXG4gICAgICAgIF07XG4gICAgICB9IGVsc2UgaWYgKHBsdWdpbiA9PT0gJ0BzZW1hbnRpYy1yZWxlYXNlL2dpdGh1YicpIHtcbiAgICAgICAgcGx1Z2luc1tpXSA9IFtcbiAgICAgICAgICAnQHNlbWFudGljLXJlbGVhc2UvZ2l0aHViJyxcbiAgICAgICAgICBtZXJnZS5hbGwoXG4gICAgICAgICAgICBbXG4gICAgICAgICAgICAgIG9sZENvbmZpZyxcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIC8vIGNmLiBodHRwczovL2dpdGh1Yi5jb20vc2VtYW50aWMtcmVsZWFzZS9zZW1hbnRpYy1yZWxlYXNlL2lzc3Vlcy8yMjA0I2lzc3VlY29tbWVudC0xNTA4NDE3NzA0XG4gICAgICAgICAgICAgICAgc3VjY2Vzc0NvbW1lbnRDb25kaXRpb246IGZhbHNlLFxuICAgICAgICAgICAgICAgIGZhaWxDb21tZW50Q29uZGl0aW9uOiBmYWxzZSxcbiAgICAgICAgICAgICAgICBsYWJlbHM6IFsncjogc2VtYW50aWMtcmVsZWFzZSddLFxuICAgICAgICAgICAgICAgIHJlbGVhc2VkTGFiZWxzOiBbJ3JlbGVhc2VkIDpib29rbWFyazonXSxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICB7IGFycmF5TWVyZ2U6IG92ZXJ3cml0ZU1lcmdlIH1cbiAgICAgICAgICApLFxuICAgICAgICBdO1xuICAgICAgfVxuICAgIH1cbiAgICBjb25zdCBuZXdDb250ZW50ID0gSlNPTi5zdHJpbmdpZnkoc2V0dGluZ3MsIHVuZGVmaW5lZCwgMik7XG4gICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzVXRpbC5nZW5lcmF0ZUZpbGUoZmlsZVBhdGgsIG5ld0NvbnRlbnQpKTtcbiAgfSk7XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgbWVyZ2UgZnJvbSAnZGVlcG1lcmdlJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZnNVdGlsIH0gZnJvbSAnLi4vdXRpbHMvZnNVdGlsLmpzJztcbmltcG9ydCB7IG92ZXJ3cml0ZU1lcmdlIH0gZnJvbSAnLi4vdXRpbHMvbWVyZ2VVdGlsLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuXG5jb25zdCBqc29uT2JqID0ge1xuICAkc2NoZW1hOiAnaHR0cHM6Ly9kb2NzLnJlbm92YXRlYm90LmNvbS9yZW5vdmF0ZS1zY2hlbWEuanNvbicsXG4gIGV4dGVuZHM6IFsnZ2l0aHViPldpbGxCb29zdGVyL3dpbGxib29zdGVyLWNvbmZpZ3M6cmVub3ZhdGUuanNvbjUnXSxcbn07XG5cbnR5cGUgU2V0dGluZ3MgPSBPbWl0PHR5cGVvZiBqc29uT2JqLCAnZXh0ZW5kcyc+ICYge1xuICBleHRlbmRzPzogc3RyaW5nW107XG4gIHBhY2thZ2VSdWxlcz86IHsgbWF0Y2hQYWNrYWdlTmFtZXM6IHN0cmluZ1tdOyBlbmFibGVkPzogYm9vbGVhbiB9W107XG59O1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVSZW5vdmF0ZUpzb24oY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZ2VuZXJhdGVSZW5vdmF0ZUpzb24nLCBhc3luYyAoKSA9PiB7XG4gICAgbGV0IG5ld1NldHRpbmdzID0gc3RydWN0dXJlZENsb25lKGpzb25PYmopIGFzIFNldHRpbmdzO1xuICAgIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAncmVub3ZhdGUuanNvbicpO1xuICAgIGlmIChmcy5leGlzdHNTeW5jKGAke2ZpbGVQYXRofTVgKSkge1xuICAgICAgLy8gU2luY2UgaXQgaXMgZGlmZmljdWx0IGZvciBwYXJzaW5nIHJlbm92YXRlLmpzb241LCB3ZSBkbyBub3RoaW5nXG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRyeSB7XG4gICAgICBjb25zdCBvbGRDb250ZW50ID0gYXdhaXQgZnMucHJvbWlzZXMucmVhZEZpbGUoZmlsZVBhdGgsICd1dGY4Jyk7XG4gICAgICBjb25zdCBvbGRTZXR0aW5ncyA9IEpTT04ucGFyc2Uob2xkQ29udGVudCkgYXMgU2V0dGluZ3M7XG4gICAgICBuZXdTZXR0aW5ncyA9IG1lcmdlLmFsbChbbmV3U2V0dGluZ3MsIG9sZFNldHRpbmdzLCBuZXdTZXR0aW5nc10sIHtcbiAgICAgICAgYXJyYXlNZXJnZTogb3ZlcndyaXRlTWVyZ2UsXG4gICAgICB9KSBhcyBTZXR0aW5ncztcbiAgICAgIG5ld1NldHRpbmdzLmV4dGVuZHMgPSBtZXJnZVJlbm92YXRlRXh0ZW5kcyhqc29uT2JqLmV4dGVuZHMsIG9sZFNldHRpbmdzLmV4dGVuZHMgPz8gW10pO1xuICAgIH0gY2F0Y2gge1xuICAgICAgLy8gZG8gbm90aGluZ1xuICAgIH1cblxuICAgIC8vIERvbid0IHVwZ3JhZGUgTmV4dC5qcyBhdXRvbWF0aWNhbGx5XG4gICAgaWYgKGNvbmZpZy5kZXBlbmRpbmcuYmxpdHopIHtcbiAgICAgIG5ld1NldHRpbmdzLnBhY2thZ2VSdWxlcyA/Pz0gW107XG4gICAgICBpZiAoXG4gICAgICAgICFuZXdTZXR0aW5ncy5wYWNrYWdlUnVsZXMuc29tZSgocnVsZTogeyBtYXRjaFBhY2thZ2VOYW1lcz86IHN0cmluZ1tdIH0pID0+XG4gICAgICAgICAgcnVsZS5tYXRjaFBhY2thZ2VOYW1lcz8uaW5jbHVkZXMoJ25leHQnKVxuICAgICAgICApXG4gICAgICApIHtcbiAgICAgICAgbmV3U2V0dGluZ3MucGFja2FnZVJ1bGVzLnB1c2goeyBtYXRjaFBhY2thZ2VOYW1lczogWyduZXh0J10sIGVuYWJsZWQ6IGZhbHNlIH0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiBmcy5wcm9taXNlcy5ybShwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICcuZGVwZW5kYWJvdCcpLCB7IGZvcmNlOiB0cnVlIH0pKTtcbiAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnMucHJvbWlzZXMucm0ocGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnLnJlbm92YXRlcmMuanNvbicpLCB7IGZvcmNlOiB0cnVlIH0pKTtcbiAgICBjb25zdCBuZXdDb250ZW50ID0gSlNPTi5zdHJpbmdpZnkobmV3U2V0dGluZ3MsIHVuZGVmaW5lZCwgMik7XG4gICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzVXRpbC5nZW5lcmF0ZUZpbGUoZmlsZVBhdGgsIG5ld0NvbnRlbnQpKTtcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIG1lcmdlUmVub3ZhdGVFeHRlbmRzKGdlbmVyYXRlZEV4dGVuZHM6IHN0cmluZ1tdLCBleGlzdGluZ0V4dGVuZHM6IHN0cmluZ1tdKTogc3RyaW5nW10ge1xuICByZXR1cm4gWy4uLm5ldyBTZXQoWy4uLmdlbmVyYXRlZEV4dGVuZHMsIC4uLmV4aXN0aW5nRXh0ZW5kc10pXS5maWx0ZXIoKGl0ZW0pID0+IGl0ZW0gIT09ICdAd2lsbGJvb3N0ZXInKTtcbn1cbiIsImltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGluc3RhbGxBZ2VudFNraWxscyhfcm9vdENvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2luc3RhbGxBZ2VudFNraWxscycsIGFzeW5jICgpID0+IHtcbiAgICAvLyBUT0RPOiBXZSBhcmUgdGVtcG9yYXJpbHkgbm90IGluc3RhbGxpbmcgbWFuYWdlZCBhZ2VudCBza2lsbHMgaW50byByZXBvcy5cbiAgICAvLyBhd2FpdCBydW5JbnN0YWxsQWdlbnRTa2lsbHMoX3Jvb3RDb25maWcpO1xuICB9KTtcbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCBtZXJnZSBmcm9tICdkZWVwbWVyZ2UnO1xuaW1wb3J0IHR5cGUgeyBUc0NvbmZpZ0pzb24gfSBmcm9tICd0eXBlLWZlc3QnO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBmc1V0aWwgfSBmcm9tICcuLi91dGlscy9mc1V0aWwuanMnO1xuaW1wb3J0IHsgY29tYmluZU1lcmdlIH0gZnJvbSAnLi4vdXRpbHMvbWVyZ2VVdGlsLmpzJztcbmltcG9ydCB7IHNvcnRLZXlzIH0gZnJvbSAnLi4vdXRpbHMvb2JqZWN0VXRpbC5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcbmltcG9ydCB7IGdldFRzY29uZmlnRXh0ZW5kcyB9IGZyb20gJy4uL3V0aWxzL3RzY29uZmlnQmFzZS5qcyc7XG5cbmNvbnN0IHJvb3RKc29uT2JqID0ge1xuICBjb21waWxlck9wdGlvbnM6IHtcbiAgICBhbHdheXNTdHJpY3Q6IHRydWUsXG4gICAgbm9VbmNoZWNrZWRJbmRleGVkQWNjZXNzOiB0cnVlLCAvLyBmb3IgQHR5cGVzY3JpcHQtZXNsaW50L3ByZWZlci1udWxsaXNoLWNvYWxlc2NpbmdcbiAgICBhbGxvd1N5bnRoZXRpY0RlZmF1bHRJbXBvcnRzOiB0cnVlLCAvLyBhbGxvdyBgaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0J2BcbiAgICBlc01vZHVsZUludGVyb3A6IHRydWUsIC8vIGFsbG93IGRlZmF1bHQgaW1wb3J0IGZyb20gQ29tbW9uSlMvQU1EL1VNRCBtb2R1bGVzXG4gICAgcmVzb2x2ZUpzb25Nb2R1bGU6IHRydWUsIC8vIGFsbG93IHRvIGltcG9ydCBKU09OIGZpbGVzXG4gICAgaW1wb3J0SGVscGVyczogZmFsc2UsXG4gICAgbm9FbWl0OiB0cnVlLFxuICB9LFxuICBleGNsdWRlOiBbJ3BhY2thZ2VzLyovdGVzdC9maXh0dXJlcycsICd0ZXN0L2ZpeHR1cmVzJ10sXG4gIGluY2x1ZGU6IFtcbiAgICAnKi5jb25maWcudHMnLFxuICAgICdwYWNrYWdlcy8qLyouY29uZmlnLnRzJyxcbiAgICAncGFja2FnZXMvKi9zY3JpcHRzLyoqLyonLFxuICAgICdwYWNrYWdlcy8qL3NyYy8qKi8qJyxcbiAgICAncGFja2FnZXMvKi90ZXN0LyoqLyonLFxuICAgICdzY3JpcHRzLyoqLyonLFxuICAgICdzcmMvKiovKicsXG4gICAgJ3Rlc3QvKiovKicsXG4gIF0sXG59O1xuXG5jb25zdCBzdWJKc29uT2JqID0ge1xuICBjb21waWxlck9wdGlvbnM6IHtcbiAgICBhbHdheXNTdHJpY3Q6IHRydWUsXG4gICAgbm9VbmNoZWNrZWRJbmRleGVkQWNjZXNzOiB0cnVlLCAvLyBmb3IgQHR5cGVzY3JpcHQtZXNsaW50L3ByZWZlci1udWxsaXNoLWNvYWxlc2NpbmdcbiAgICBhbGxvd1N5bnRoZXRpY0RlZmF1bHRJbXBvcnRzOiB0cnVlLCAvLyBhbGxvdyBgaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0J2BcbiAgICBlc01vZHVsZUludGVyb3A6IHRydWUsIC8vIGFsbG93IGRlZmF1bHQgaW1wb3J0IGZyb20gQ29tbW9uSlMvQU1EL1VNRCBtb2R1bGVzXG4gICAgcmVzb2x2ZUpzb25Nb2R1bGU6IHRydWUsIC8vIGFsbG93IHRvIGltcG9ydCBKU09OIGZpbGVzXG4gICAgaW1wb3J0SGVscGVyczogZmFsc2UsXG4gICAgbm9FbWl0OiB0cnVlLFxuICB9LFxuICBleGNsdWRlOiBbJ3Rlc3QvZml4dHVyZXMnXSxcbiAgLy8gd2JmeSBnZW5lcmF0ZXMgcm9vdC1sZXZlbCB0b29sIGNvbmZpZ3Mgc3VjaCBhcyBwbGF5d3JpZ2h0LmNvbmZpZy50cywgYW5kXG4gIC8vIHR5cGUtYXdhcmUgbGludGluZyBuZWVkcyB0aG9zZSBmaWxlcyBpbiB0aGUgcHJvamVjdCB0byBzZWUgTm9kZS9CdW4gZ2xvYmFscy5cbiAgaW5jbHVkZTogWycqLmNvbmZpZy50cycsICdzY3JpcHRzLyoqLyonLCAnc3JjLyoqLyonLCAndGVzdC8qKi8qJ10sXG59O1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVUc2NvbmZpZyhjb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdnZW5lcmF0ZVRzY29uZmlnJywgYXN5bmMgKCkgPT4ge1xuICAgIGlmIChjb25maWcuZGVwZW5kaW5nLmJsaXR6IHx8IGNvbmZpZy5kZXBlbmRpbmcubmV4dCkge1xuICAgICAgYXdhaXQgY2xlYW51cExlZ2FjeVRzY29uZmlnTW9kdWxlU2V0dGluZ3MoY29uZmlnKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBsZXQgbmV3U2V0dGluZ3MgPSBzdHJ1Y3R1cmVkQ2xvbmUoY29uZmlnLmlzUm9vdCA/IHJvb3RKc29uT2JqIDogc3ViSnNvbk9iaikgYXMgVHNDb25maWdKc29uO1xuICAgIGNvbnN0IGdlbmVyYXRlZFR5cGVzID0gZ2V0R2VuZXJhdGVkVHlwZXMoY29uZmlnKTtcbiAgICBuZXdTZXR0aW5ncy5leHRlbmRzID0gZ2V0VHNjb25maWdFeHRlbmRzKGNvbmZpZyk7XG4gICAgbmV3U2V0dGluZ3MuY29tcGlsZXJPcHRpb25zID8/PSB7fTtcbiAgICBuZXdTZXR0aW5ncy5jb21waWxlck9wdGlvbnMucm9vdERpciA9IGdldFJvb3REaXIoY29uZmlnKTtcbiAgICBpZiAoZ2VuZXJhdGVkVHlwZXMubGVuZ3RoID4gMCkge1xuICAgICAgbmV3U2V0dGluZ3MuY29tcGlsZXJPcHRpb25zID0geyAuLi5uZXdTZXR0aW5ncy5jb21waWxlck9wdGlvbnMsIHR5cGVzOiBnZW5lcmF0ZWRUeXBlcyB9O1xuICAgIH1cbiAgICBpZiAoIWNvbmZpZy5kb2VzQ29udGFpbkpzeE9yVHN4ICYmICFjb25maWcuZG9lc0NvbnRhaW5Kc3hPclRzeEluUGFja2FnZXMpIHtcbiAgICAgIGRlbGV0ZSBuZXdTZXR0aW5ncy5jb21waWxlck9wdGlvbnM/LmpzeDtcbiAgICB9IGVsc2UgaWYgKCFjb25maWcuaXNCdW4gJiYgIWNvbmZpZy5kZXBlbmRpbmcucmVhY3ROYXRpdmUpIHtcbiAgICAgIG5ld1NldHRpbmdzLmNvbXBpbGVyT3B0aW9ucyA9IHsgLi4ubmV3U2V0dGluZ3MuY29tcGlsZXJPcHRpb25zLCBqc3g6ICdyZWFjdC1qc3gnIH07XG4gICAgfVxuICAgIGlmIChjb25maWcuaXNSb290ICYmICFjb25maWcuZG9lc0NvbnRhaW5TdWJQYWNrYWdlSnNvbnMpIHtcbiAgICAgIG5ld1NldHRpbmdzLmluY2x1ZGUgPSBuZXdTZXR0aW5ncy5pbmNsdWRlPy5maWx0ZXIoKGRpclBhdGg6IHN0cmluZykgPT4gIWRpclBhdGguc3RhcnRzV2l0aCgncGFja2FnZXMvKi8nKSk7XG4gICAgICBuZXdTZXR0aW5ncy5leGNsdWRlID0gbmV3U2V0dGluZ3MuZXhjbHVkZT8uZmlsdGVyKChkaXJQYXRoOiBzdHJpbmcpID0+ICFkaXJQYXRoLnN0YXJ0c1dpdGgoJ3BhY2thZ2VzLyovJykpO1xuICAgIH1cbiAgICBpZiAoY29uZmlnLmRlcGVuZGluZy5wcmlzbWEpIHtcbiAgICAgIC8vIFByaXNtYSBzZWVkcyBhbmQgbWlncmF0aW9uIGhlbHBlciBzY3JpcHRzIG9mdGVuIGxpdmUgb3V0c2lkZSBzcmMsIGJ1dFxuICAgICAgLy8gdHlwZS1hd2FyZSBsaW50aW5nIHN0aWxsIG5lZWRzIHRoZW0gY292ZXJlZCBieSB0aGUgcHJvamVjdCBjb25maWcuXG4gICAgICBhZGRJbmNsdWRlUGF0aChuZXdTZXR0aW5ncywgJ3ByaXNtYS8qKi8qJyk7XG4gICAgfVxuXG4gICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICd0c2NvbmZpZy5qc29uJyk7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGV4aXN0aW5nQ29udGVudCA9IGF3YWl0IGZzLnByb21pc2VzLnJlYWRGaWxlKGZpbGVQYXRoLCAndXRmOCcpO1xuICAgICAgY29uc3Qgb2xkU2V0dGluZ3MgPSBKU09OLnBhcnNlKGV4aXN0aW5nQ29udGVudCkgYXMgVHNDb25maWdKc29uO1xuICAgICAgY29uc3QgZXhpc3RpbmdUeXBlcyA9IG5vcm1hbGl6ZVN0cmluZ0FycmF5KG9sZFNldHRpbmdzLmNvbXBpbGVyT3B0aW9ucz8udHlwZXMpO1xuICAgICAgY29uc3QgZXhpc3RpbmdFbWl0TWV0YWRhdGEgPSBwaWNrRXhpc3RpbmdFbWl0TWV0YWRhdGEob2xkU2V0dGluZ3MuY29tcGlsZXJPcHRpb25zKTtcbiAgICAgIG5ld1NldHRpbmdzLmV4dGVuZHMgPSBtZXJnZVRzY29uZmlnRXh0ZW5kcyhuZXdTZXR0aW5ncy5leHRlbmRzLCBvbGRTZXR0aW5ncy5leHRlbmRzKTtcbiAgICAgIGRlbGV0ZSBvbGRTZXR0aW5ncy5leHRlbmRzO1xuICAgICAgZGVsZXRlIG9sZFNldHRpbmdzLmNvbXBpbGVyT3B0aW9ucz8uanN4O1xuICAgICAgbmV3U2V0dGluZ3MgPSBtZXJnZS5hbGwoW25ld1NldHRpbmdzLCBvbGRTZXR0aW5ncywgbmV3U2V0dGluZ3NdLCB7IGFycmF5TWVyZ2U6IGNvbWJpbmVNZXJnZSB9KTtcbiAgICAgIG5ld1NldHRpbmdzLmluY2x1ZGUgPSBuZXdTZXR0aW5ncy5pbmNsdWRlPy5maWx0ZXIoXG4gICAgICAgIChkaXJQYXRoOiBzdHJpbmcpID0+XG4gICAgICAgICAgIWRpclBhdGguaW5jbHVkZXMoJ0B0eXBlcycpICYmICFkaXJQYXRoLmluY2x1ZGVzKCdfX3Rlc3RzX18vJykgJiYgIWRpclBhdGguaW5jbHVkZXMoJ3Rlc3RzLycpXG4gICAgICApO1xuICAgICAgbmV3U2V0dGluZ3MuY29tcGlsZXJPcHRpb25zID8/PSB7fTtcbiAgICAgIC8vIHdiZnktZ2VuZXJhdGVkIHRzY29uZmlnLmpzb24gaXMgYSBsaW50L3R5cGVjaGVjayBwcm9qZWN0LCBub3QgdGhlIGVtaXRcbiAgICAgIC8vIGNvbnRyYWN0LiBJdCBtdXN0IGtlZXAgcm9vdERpciBicm9hZCBlbm91Z2ggZm9yIHJvb3QgY29uZmlnIGZpbGVzLFxuICAgICAgLy8gc2NyaXB0cywgc3JjLCBhbmQgdGVzdHMuIGJ1aWxkLXRzIG93bnMgZW1pdCBhbmQgY3JlYXRlcyBhIHRlbXBvcmFyeVxuICAgICAgLy8gc3JjLW9ubHkgdHNjb25maWcgd2l0aCBub0VtaXQ9ZmFsc2UsIGVtaXREZWNsYXJhdGlvbk9ubHk9dHJ1ZSxcbiAgICAgIC8vIHJvb3REaXI9XCJzcmNcIiwgYW5kIGluY2x1ZGU9W1wic3JjLyoqLypcIl0sIHNvIHByZXNlcnZpbmcgbm9FbWl0PWZhbHNlIG9yXG4gICAgICAvLyByb290RGlyPVwic3JjXCIgaGVyZSB3b3VsZCBvbmx5IGJyZWFrIG5vbi1zcmMgdHlwZS1hd2FyZSBsaW50IGNvdmVyYWdlLlxuICAgICAgbmV3U2V0dGluZ3MuY29tcGlsZXJPcHRpb25zID0geyAuLi5uZXdTZXR0aW5ncy5jb21waWxlck9wdGlvbnMsIC4uLmV4aXN0aW5nRW1pdE1ldGFkYXRhIH07XG4gICAgICBlbnN1cmVUc0V4dGVuc2lvbkVtaXRDb21wYXRpYmlsaXR5KG5ld1NldHRpbmdzLmNvbXBpbGVyT3B0aW9ucyk7XG5cbiAgICAgIGNvbnN0IG1lcmdlZFR5cGVzID0gWy4uLm5ldyBTZXQoWy4uLmZpbHRlckV4aXN0aW5nVHlwZXMoZXhpc3RpbmdUeXBlcywgZ2VuZXJhdGVkVHlwZXMpLCAuLi5nZW5lcmF0ZWRUeXBlc10pXTtcbiAgICAgIGlmIChtZXJnZWRUeXBlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgIG5ld1NldHRpbmdzLmNvbXBpbGVyT3B0aW9ucy50eXBlcyA9IG1lcmdlZFR5cGVzO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZGVsZXRlIG5ld1NldHRpbmdzLmNvbXBpbGVyT3B0aW9ucy50eXBlcztcbiAgICAgIH1cbiAgICAgIGlmIChzaG91bGREZWxldGVUeXBlUm9vdHMoZ2VuZXJhdGVkVHlwZXMpKSB7XG4gICAgICAgIGRlbGV0ZSBuZXdTZXR0aW5ncy5jb21waWxlck9wdGlvbnMudHlwZVJvb3RzO1xuICAgICAgfVxuICAgIH0gY2F0Y2gge1xuICAgICAgLy8gZG8gbm90aGluZ1xuICAgIH1cbiAgICBzb3J0S2V5cyhuZXdTZXR0aW5ncyk7XG4gICAgbmV3U2V0dGluZ3MuaW5jbHVkZT8uc29ydCgpO1xuICAgIC8vIERvbid0IHVzZSBvbGQgZGVjb3JhdG9yXG4gICAgZGVsZXRlIG5ld1NldHRpbmdzLmNvbXBpbGVyT3B0aW9ucz8uZXhwZXJpbWVudGFsRGVjb3JhdG9ycztcbiAgICAvLyBQYWNrYWdlIGltcG9ydHMgc2hvdWxkIHJlc29sdmUgdGhyb3VnaCBwYWNrYWdlIGV4cG9ydHMgaW5zdGVhZCBvZiBiYXNlVXJsLlxuICAgIC8vIHBhdGhzIGlzIGludGVudGlvbmFsbHkgcHJlc2VydmVkIHNvIHJlcG8tbG9jYWwgdG9vbGluZyBjYW4ga2VlcCBleHBsaWNpdFxuICAgIC8vIGFsaWFzZXMgd2l0aG91dCByZWx5aW5nIG9uIGJhc2VVcmwncyBicm9hZCBmYWxsYmFjayByZXNvbHV0aW9uLlxuICAgIGRlbGV0ZSBuZXdTZXR0aW5ncy5jb21waWxlck9wdGlvbnM/LmJhc2VVcmw7XG4gICAgZGVsZXRlTGVnYWN5TW9kdWxlU2V0dGluZ3MobmV3U2V0dGluZ3MuY29tcGlsZXJPcHRpb25zLCBjb25maWcpO1xuICAgIG5vcm1hbGl6ZUNvbW1vbkpzVHNjb25maWdTZXR0aW5ncyhuZXdTZXR0aW5ncy5jb21waWxlck9wdGlvbnMsIGNvbmZpZyk7XG4gICAgaWYgKGNvbmZpZy5kZXBlbmRpbmcucmVhY3ROYXRpdmUpIHtcbiAgICAgIGRlbGV0ZSBuZXdTZXR0aW5ncy5jb21waWxlck9wdGlvbnM/LnZlcmJhdGltTW9kdWxlU3ludGF4O1xuICAgIH1cbiAgICBjb25zdCBuZXdDb250ZW50ID0gSlNPTi5zdHJpbmdpZnkobmV3U2V0dGluZ3MsIHVuZGVmaW5lZCwgMik7XG4gICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzVXRpbC5nZW5lcmF0ZUZpbGUoZmlsZVBhdGgsIG5ld0NvbnRlbnQpKTtcbiAgfSk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGNsZWFudXBMZWdhY3lUc2NvbmZpZ01vZHVsZVNldHRpbmdzKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBmaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJ3RzY29uZmlnLmpzb24nKTtcbiAgdHJ5IHtcbiAgICBjb25zdCBzZXR0aW5ncyA9IEpTT04ucGFyc2UoYXdhaXQgZnMucHJvbWlzZXMucmVhZEZpbGUoZmlsZVBhdGgsICd1dGY4JykpIGFzIFRzQ29uZmlnSnNvbjtcbiAgICBub3JtYWxpemVOZXh0VHNjb25maWdNb2R1bGVTZXR0aW5ncyhzZXR0aW5ncy5jb21waWxlck9wdGlvbnMpO1xuICAgIG5vcm1hbGl6ZU5leHRUc2NvbmZpZ1BhdGhBbGlhc2VzKHNldHRpbmdzLmNvbXBpbGVyT3B0aW9ucyk7XG4gICAgYWRkU2NyaXB0c0luY2x1ZGVGb3JGcmFtZXdvcmtQcm9qZWN0KHNldHRpbmdzKTtcbiAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnNVdGlsLmdlbmVyYXRlRmlsZShmaWxlUGF0aCwgSlNPTi5zdHJpbmdpZnkoc2V0dGluZ3MsIHVuZGVmaW5lZCwgMikpKTtcbiAgfSBjYXRjaCB7XG4gICAgLy8gTmV4dC9CbGl0eiBvd24gdGhlaXIgdHNjb25maWcgc2hhcGUsIGJ1dCBUeXBlU2NyaXB0IDYgbm8gbG9uZ2VyIGFjY2VwdHNcbiAgICAvLyBub2RlMTAgcmVzb2x2ZXIgc3BlbGxpbmdzIHRoYXQgb2xkZXIgcHJvamVjdHMgY29tbW9ubHkgaW5oZXJpdGVkLlxuICB9XG59XG5cbmZ1bmN0aW9uIGFkZFNjcmlwdHNJbmNsdWRlRm9yRnJhbWV3b3JrUHJvamVjdChzZXR0aW5nczogVHNDb25maWdKc29uKTogdm9pZCB7XG4gIC8vIE9taXR0aW5nIGluY2x1ZGUgbGV0cyBmcmFtZXdvcmsgdHNjb25maWdzIGtlZXAgVHlwZVNjcmlwdCdzIGRlZmF1bHRcbiAgLy8gXCJhbGwgVFMvVFNYIGZpbGVzXCIgYmVoYXZpb3IsIHdoaWNoIGFscmVhZHkgY292ZXJzIHNjcmlwdHMuXG4gIGlmICghc2V0dGluZ3MuaW5jbHVkZSkgcmV0dXJuO1xuICBpZiAoc2V0dGluZ3MuaW5jbHVkZS5pbmNsdWRlcygnc2NyaXB0cy8qKi8qJykpIHJldHVybjtcblxuICBzZXR0aW5ncy5pbmNsdWRlLnB1c2goJ3NjcmlwdHMvKiovKicpO1xuICBzZXR0aW5ncy5pbmNsdWRlLnNvcnQoKTtcbn1cblxuZnVuY3Rpb24gbm9ybWFsaXplTmV4dFRzY29uZmlnTW9kdWxlU2V0dGluZ3MoY29tcGlsZXJPcHRpb25zOiBUc0NvbmZpZ0pzb24uQ29tcGlsZXJPcHRpb25zIHwgdW5kZWZpbmVkKTogdm9pZCB7XG4gIGlmICghY29tcGlsZXJPcHRpb25zKSByZXR1cm47XG4gIGlmIChcbiAgICBjb21waWxlck9wdGlvbnMubW9kdWxlUmVzb2x1dGlvbiA9PT0gJ25vZGUnIHx8XG4gICAgY29tcGlsZXJPcHRpb25zLm1vZHVsZVJlc29sdXRpb24gPT09ICdOb2RlJyB8fFxuICAgIGNvbXBpbGVyT3B0aW9ucy5tb2R1bGVSZXNvbHV0aW9uID09PSAnbm9kZTEwJyB8fFxuICAgIGNvbXBpbGVyT3B0aW9ucy5tb2R1bGVSZXNvbHV0aW9uID09PSB1bmRlZmluZWRcbiAgKSB7XG4gICAgLy8gTmV4dC5qcyB3cml0ZXMgXCJub2RlXCIgZHVyaW5nIGJ1aWxkIHdoZW4gdGhpcyBvcHRpb24gaXMgbWlzc2luZywgYnV0XG4gICAgLy8gdHNnb2xpbnQgdHJlYXRzIHRoYXQgc3BlbGxpbmcgYXMgdGhlIHJlbW92ZWQgbm9kZTEwIHJlc29sdmVyLlxuICAgIGNvbXBpbGVyT3B0aW9ucy5tb2R1bGVSZXNvbHV0aW9uID0gJ2J1bmRsZXInO1xuICB9XG59XG5cbmZ1bmN0aW9uIG5vcm1hbGl6ZU5leHRUc2NvbmZpZ1BhdGhBbGlhc2VzKGNvbXBpbGVyT3B0aW9uczogVHNDb25maWdKc29uLkNvbXBpbGVyT3B0aW9ucyB8IHVuZGVmaW5lZCk6IHZvaWQge1xuICBpZiAoIWNvbXBpbGVyT3B0aW9ucykgcmV0dXJuO1xuXG4gIC8vIHRzZ29saW50IGZvbGxvd3MgVHlwZVNjcmlwdCA2IHZhbGlkYXRpb24sIHdoZXJlIGJhc2VVcmwgaXMgcmVtb3ZlZCBhbmRcbiAgLy8gcGF0aCB0YXJnZXRzIG11c3QgYmUgZXhwbGljaXRseSByZWxhdGl2ZS4gTmV4dC5qcyBzdGlsbCBhY2NlcHRzIHRoZSBhbGlhc1xuICAvLyBzaGFwZSBhZnRlciBlYWNoIHRhcmdldCBpcyB3cml0dGVuIHdpdGggYSBsZWFkaW5nIC4vLlxuICBkZWxldGUgY29tcGlsZXJPcHRpb25zLmJhc2VVcmw7XG4gIGlmICghY29tcGlsZXJPcHRpb25zLnBhdGhzKSByZXR1cm47XG5cbiAgZm9yIChjb25zdCBbYWxpYXMsIHRhcmdldHNdIG9mIE9iamVjdC5lbnRyaWVzKGNvbXBpbGVyT3B0aW9ucy5wYXRocykpIHtcbiAgICBjb21waWxlck9wdGlvbnMucGF0aHNbYWxpYXNdID0gbm9ybWFsaXplUGF0aEFsaWFzVGFyZ2V0cyh0YXJnZXRzKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBub3JtYWxpemVQYXRoQWxpYXNUYXJnZXRzKHRhcmdldHM6IHN0cmluZ1tdKTogc3RyaW5nW10ge1xuICByZXR1cm4gdGFyZ2V0cy5tYXAoKHRhcmdldCkgPT4ge1xuICAgIGlmICh0YXJnZXQuc3RhcnRzV2l0aCgnLi8nKSB8fCB0YXJnZXQuc3RhcnRzV2l0aCgnLi4vJykgfHwgcGF0aC5pc0Fic29sdXRlKHRhcmdldCkpIHJldHVybiB0YXJnZXQ7XG4gICAgcmV0dXJuIGAuLyR7dGFyZ2V0fWA7XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBnZXRSb290RGlyKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IHN0cmluZyB7XG4gIGlmIChjb25maWcuaXNSb290KSByZXR1cm4gJy4nO1xuICByZXR1cm4gZnMuZXhpc3RzU3luYyhwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICcuLicsICcuLicsICdwYWNrYWdlLmpzb24nKSkgPyAnLi4vLi4nIDogJy4nO1xufVxuXG5mdW5jdGlvbiBtZXJnZVRzY29uZmlnRXh0ZW5kcyhcbiAgZ2VuZXJhdGVkRXh0ZW5kczogVHNDb25maWdKc29uWydleHRlbmRzJ10sXG4gIGV4aXN0aW5nRXh0ZW5kczogVHNDb25maWdKc29uWydleHRlbmRzJ11cbik6IFRzQ29uZmlnSnNvblsnZXh0ZW5kcyddIHtcbiAgY29uc3QgbWVyZ2VkRXh0ZW5kcyA9IFsuLi5ub3JtYWxpemVFeHRlbmRzKGdlbmVyYXRlZEV4dGVuZHMpLCAuLi5ub3JtYWxpemVFeHRlbmRzKGV4aXN0aW5nRXh0ZW5kcyldO1xuICBjb25zdCB1bmlxdWVFeHRlbmRzID0gWy4uLm5ldyBTZXQobWVyZ2VkRXh0ZW5kcyldO1xuICBpZiAodW5pcXVlRXh0ZW5kcy5sZW5ndGggPT09IDApIHJldHVybiB1bmRlZmluZWQ7XG4gIGlmICh1bmlxdWVFeHRlbmRzLmxlbmd0aCA9PT0gMSkgcmV0dXJuIHVuaXF1ZUV4dGVuZHNbMF07XG4gIHJldHVybiB1bmlxdWVFeHRlbmRzO1xufVxuXG5mdW5jdGlvbiBhZGRJbmNsdWRlUGF0aChzZXR0aW5nczogVHNDb25maWdKc29uLCBkaXJQYXRoOiBzdHJpbmcpOiB2b2lkIHtcbiAgc2V0dGluZ3MuaW5jbHVkZSA/Pz0gW107XG4gIGlmICghc2V0dGluZ3MuaW5jbHVkZS5pbmNsdWRlcyhkaXJQYXRoKSkge1xuICAgIHNldHRpbmdzLmluY2x1ZGUucHVzaChkaXJQYXRoKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBub3JtYWxpemVFeHRlbmRzKHZhbHVlOiBUc0NvbmZpZ0pzb25bJ2V4dGVuZHMnXSk6IHN0cmluZ1tdIHtcbiAgaWYgKCF2YWx1ZSkgcmV0dXJuIFtdO1xuICByZXR1cm4gQXJyYXkuaXNBcnJheSh2YWx1ZSkgPyB2YWx1ZSA6IFt2YWx1ZV07XG59XG5cbmZ1bmN0aW9uIG5vcm1hbGl6ZVN0cmluZ0FycmF5KHZhbHVlOiB1bmtub3duKTogc3RyaW5nW10ge1xuICBpZiAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJykgcmV0dXJuIFt2YWx1ZV07XG4gIGlmICghQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHJldHVybiBbXTtcbiAgcmV0dXJuIHZhbHVlLmZpbHRlcigoaXRlbSk6IGl0ZW0gaXMgc3RyaW5nID0+IHR5cGVvZiBpdGVtID09PSAnc3RyaW5nJyk7XG59XG5cbmZ1bmN0aW9uIHNob3VsZERlbGV0ZVR5cGVSb290cyh0eXBlTmFtZXM6IHN0cmluZ1tdKTogYm9vbGVhbiB7XG4gIC8vIE9ubHkgZ2VuZXJhdGVkIHBhY2thZ2Utb3duZWQgdGVzdCB0eXBlcyBzaG91bGQgdHJpZ2dlciB0aGlzLiBVc2VyLWRlZmluZWQgc2xhc2gtYmFzZWRcbiAgLy8gZW50cmllcyBtYXkgaW50ZW50aW9uYWxseSByZWx5IG9uIGN1c3RvbSB0eXBlUm9vdHMgYW5kIHNob3VsZCBiZSBwcmVzZXJ2ZWQgYXMtaXMuXG4gIHJldHVybiB0eXBlTmFtZXMuc29tZSgodHlwZU5hbWUpID0+IHR5cGVOYW1lID09PSAnY3lwcmVzcycgfHwgdHlwZU5hbWUuaW5jbHVkZXMoJy8nKSk7XG59XG5cbmZ1bmN0aW9uIGZpbHRlckV4aXN0aW5nVHlwZXMoZXhpc3RpbmdUeXBlczogc3RyaW5nW10sIGdlbmVyYXRlZFR5cGVzOiBzdHJpbmdbXSk6IHN0cmluZ1tdIHtcbiAgY29uc3QgZ2VuZXJhdGVkVHlwZVNldCA9IG5ldyBTZXQoZ2VuZXJhdGVkVHlwZXMpO1xuICByZXR1cm4gZXhpc3RpbmdUeXBlcy5maWx0ZXIoKHR5cGVOYW1lKSA9PiB7XG4gICAgLy8gd2JmeSBvd25zIHRoZXNlIHBhY2thZ2UtcHJvdmlkZWQgdGVzdCBnbG9iYWxzLiBEcm9wIHN0YWxlIGVudHJpZXMgd2hlbiB0aGVcbiAgICAvLyBjb3JyZXNwb25kaW5nIGRlcGVuZGVuY3kgaXMgbm8gbG9uZ2VyIHByZXNlbnQgc28gVHlwZVNjcmlwdCB3b24ndCByZXF1aXJlXG4gICAgLy8gbWlzc2luZyBwYWNrYWdlcyBzdWNoIGFzIHZpdGVzdC5cbiAgICBpZiAoaXNHZW5lcmF0ZWRUZXN0R2xvYmFsVHlwZSh0eXBlTmFtZSkgJiYgIWdlbmVyYXRlZFR5cGVTZXQuaGFzKHR5cGVOYW1lKSkgcmV0dXJuIGZhbHNlO1xuICAgIHJldHVybiB0cnVlO1xuICB9KTtcbn1cblxuZnVuY3Rpb24gaXNHZW5lcmF0ZWRUZXN0R2xvYmFsVHlwZSh0eXBlTmFtZTogc3RyaW5nKTogYm9vbGVhbiB7XG4gIHJldHVybiB0eXBlTmFtZSA9PT0gJ2N5cHJlc3MnIHx8IHR5cGVOYW1lID09PSAnamVzdCcgfHwgdHlwZU5hbWUgPT09ICdtb2NoYScgfHwgdHlwZU5hbWUgPT09ICd2aXRlc3QvZ2xvYmFscyc7XG59XG5cbmZ1bmN0aW9uIGVuc3VyZVRzRXh0ZW5zaW9uRW1pdENvbXBhdGliaWxpdHkoY29tcGlsZXJPcHRpb25zOiBUc0NvbmZpZ0pzb24uQ29tcGlsZXJPcHRpb25zIHwgdW5kZWZpbmVkKTogdm9pZCB7XG4gIGlmICghY29tcGlsZXJPcHRpb25zKSByZXR1cm47XG4gIGlmIChjb21waWxlck9wdGlvbnMubm9FbWl0ICE9PSBmYWxzZSB8fCBjb21waWxlck9wdGlvbnMuZW1pdERlY2xhcmF0aW9uT25seSA9PT0gdHJ1ZSkgcmV0dXJuO1xuXG4gIC8vIEB0c2NvbmZpZy9idW4gZW5hYmxlcyBhbGxvd0ltcG9ydGluZ1RzRXh0ZW5zaW9ucywgd2hpY2ggVHlwZVNjcmlwdCBwZXJtaXRzXG4gIC8vIGR1cmluZyBlbWl0IG9ubHkgd2hlbiByZWxhdGl2ZSBUUyBleHRlbnNpb25zIGFyZSByZXdyaXR0ZW4uXG4gIGNvbXBpbGVyT3B0aW9ucy5yZXdyaXRlUmVsYXRpdmVJbXBvcnRFeHRlbnNpb25zID0gdHJ1ZTtcbn1cblxuZnVuY3Rpb24gZGVsZXRlTGVnYWN5TW9kdWxlU2V0dGluZ3MoXG4gIGNvbXBpbGVyT3B0aW9uczogVHNDb25maWdKc29uLkNvbXBpbGVyT3B0aW9ucyB8IHVuZGVmaW5lZCxcbiAgY29uZmlnOiBQYWNrYWdlQ29uZmlnXG4pOiB2b2lkIHtcbiAgaWYgKCFjb21waWxlck9wdGlvbnMpIHJldHVybjtcblxuICAvLyBUeXBlU2NyaXB0IDYgcmVtb3ZlZCB0aGUgb2xkIG5vZGUxMCByZXNvbHZlciBzcGVsbGluZywgc28gaW5oZXJpdGVkIGJhc2UgY29uZmlnc1xuICAvLyBzaG91bGQgY2hvb3NlIHRoZSByZXNvbHZlciB1bmxlc3MgYSBwcm9qZWN0IGFscmVhZHkgb3B0ZWQgaW50byBhIG1vZGVybiBvbmUuXG4gIGlmIChcbiAgICBjb21waWxlck9wdGlvbnMubW9kdWxlUmVzb2x1dGlvbiA9PT0gJ25vZGUnIHx8XG4gICAgY29tcGlsZXJPcHRpb25zLm1vZHVsZVJlc29sdXRpb24gPT09ICdOb2RlJyB8fFxuICAgIGNvbXBpbGVyT3B0aW9ucy5tb2R1bGVSZXNvbHV0aW9uID09PSAnbm9kZTEwJ1xuICApIHtcbiAgICBkZWxldGUgY29tcGlsZXJPcHRpb25zLm1vZHVsZVJlc29sdXRpb247XG4gIH1cbiAgaWYgKGNvbmZpZy5pc0J1biB8fCBjb25maWcuZGVwZW5kaW5nLnJlYWN0TmF0aXZlIHx8IGNvbXBpbGVyT3B0aW9ucy5tb2R1bGUgIT09ICdFU05leHQnKSByZXR1cm47XG5cbiAgLy8gTm9kZSBiYXNlIGNvbmZpZ3Mgbm93IHBhaXIgdGhlaXIgcmVzb2x2ZXIgd2l0aCBhIG1hdGNoaW5nIG1vZHVsZSBraW5kLiBLZWVwaW5nXG4gIC8vIG9sZGVyIEVTTmV4dCBvdmVycmlkZXMgY3JlYXRlcyBpbnZhbGlkIGdlbmVyYXRlZCBjb25maWdzIGZvciBUUyA2LlxuICBkZWxldGUgY29tcGlsZXJPcHRpb25zLm1vZHVsZTtcbn1cblxuZnVuY3Rpb24gbm9ybWFsaXplQ29tbW9uSnNUc2NvbmZpZ1NldHRpbmdzKFxuICBjb21waWxlck9wdGlvbnM6IFRzQ29uZmlnSnNvbi5Db21waWxlck9wdGlvbnMgfCB1bmRlZmluZWQsXG4gIGNvbmZpZzogUGFja2FnZUNvbmZpZ1xuKTogdm9pZCB7XG4gIGlmICghY29tcGlsZXJPcHRpb25zIHx8IGNvbmZpZy5pc0J1biB8fCBjb25maWcuZGVwZW5kaW5nLnJlYWN0TmF0aXZlIHx8IGNvbmZpZy5pc0VzbVBhY2thZ2UpIHJldHVybjtcblxuICBpZiAoY29tcGlsZXJPcHRpb25zLm1vZHVsZT8udG9Mb3dlckNhc2UoKSA9PT0gJ2NvbW1vbmpzJykge1xuICAgIC8vIEB0c2NvbmZpZy9ub2RlLWx0cyBub3cgcHJvdmlkZXMgbW9kdWxlUmVzb2x1dGlvbj1ub2RlMTYuIFR5cGVTY3JpcHQgcmVxdWlyZXNcbiAgICAvLyB0aGUgbW9kdWxlIGtpbmQgdG8gbW92ZSB3aXRoIHRoYXQgcmVzb2x2ZXIsIHdoaWxlIHZlcmJhdGltTW9kdWxlU3ludGF4PWZhbHNlXG4gICAgLy8gcHJlc2VydmVzIHRoZSBsb25nLXN0YW5kaW5nIENvbW1vbkpTIGVtaXQgc2hhcGUgZm9yIGV4aXN0aW5nIHBhY2thZ2VzLlxuICAgIGNvbXBpbGVyT3B0aW9ucy5tb2R1bGUgPSAnTm9kZTE2JztcbiAgfVxuICBjb21waWxlck9wdGlvbnMudmVyYmF0aW1Nb2R1bGVTeW50YXggPSBmYWxzZTtcbn1cblxuZnVuY3Rpb24gcGlja0V4aXN0aW5nRW1pdE1ldGFkYXRhKFxuICBjb21waWxlck9wdGlvbnM6IFRzQ29uZmlnSnNvblsnY29tcGlsZXJPcHRpb25zJ11cbik6IFBpY2s8Tm9uTnVsbGFibGU8VHNDb25maWdKc29uWydjb21waWxlck9wdGlvbnMnXT4sICdkZWNsYXJhdGlvbicgfCAnZGVjbGFyYXRpb25NYXAnIHwgJ3NvdXJjZU1hcCc+IHtcbiAgY29uc3QgZW1pdE9wdGlvbnMgPSB7fSBhcyBQaWNrPFxuICAgIE5vbk51bGxhYmxlPFRzQ29uZmlnSnNvblsnY29tcGlsZXJPcHRpb25zJ10+LFxuICAgICdkZWNsYXJhdGlvbicgfCAnZGVjbGFyYXRpb25NYXAnIHwgJ3NvdXJjZU1hcCdcbiAgPjtcbiAgZm9yIChjb25zdCBrZXkgb2YgWydkZWNsYXJhdGlvbicsICdkZWNsYXJhdGlvbk1hcCcsICdzb3VyY2VNYXAnXSBhcyBjb25zdCkge1xuICAgIGNvbnN0IHZhbHVlID0gY29tcGlsZXJPcHRpb25zPy5ba2V5XTtcbiAgICBpZiAodmFsdWUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgZW1pdE9wdGlvbnNba2V5XSA9IHZhbHVlIGFzIG5ldmVyO1xuICAgIH1cbiAgfVxuICByZXR1cm4gZW1pdE9wdGlvbnM7XG59XG5cbmZ1bmN0aW9uIGdldEdlbmVyYXRlZFR5cGVzKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IHN0cmluZ1tdIHtcbiAgY29uc3QgdHlwZU5hbWVzID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gIGNvbnN0IGRlcGVuZGVuY2llcyA9IHtcbiAgICAuLi5jb25maWcucGFja2FnZUpzb24/LmRlcGVuZGVuY2llcyxcbiAgICAuLi5jb25maWcucGFja2FnZUpzb24/LmRldkRlcGVuZGVuY2llcyxcbiAgfTtcblxuICBpZiAoY29uZmlnLmlzQnVuKSB7XG4gICAgdHlwZU5hbWVzLmFkZCgnYnVuJyk7XG4gIH0gZWxzZSBpZiAoIWNvbmZpZy5kZXBlbmRpbmcucmVhY3ROYXRpdmUpIHtcbiAgICB0eXBlTmFtZXMuYWRkKCdub2RlJyk7XG4gIH1cbiAgaWYgKFxuICAgIGRlcGVuZGVuY2llcy5qZXN0IHx8XG4gICAgZGVwZW5kZW5jaWVzWydAamVzdC9nbG9iYWxzJ10gfHxcbiAgICBkZXBlbmRlbmNpZXNbJ2plc3QtZW52aXJvbm1lbnQtanNkb20nXSB8fFxuICAgIGRlcGVuZGVuY2llc1sndHMtamVzdCddXG4gICkge1xuICAgIHR5cGVOYW1lcy5hZGQoJ2plc3QnKTtcbiAgfVxuICBpZiAoZGVwZW5kZW5jaWVzLnZpdGVzdCkge1xuICAgIHR5cGVOYW1lcy5hZGQoJ3ZpdGVzdC9nbG9iYWxzJyk7XG4gIH1cbiAgaWYgKGRlcGVuZGVuY2llcy5tb2NoYSkge1xuICAgIHR5cGVOYW1lcy5hZGQoJ21vY2hhJyk7XG4gIH1cbiAgaWYgKGRlcGVuZGVuY2llcy5jeXByZXNzKSB7XG4gICAgdHlwZU5hbWVzLmFkZCgnY3lwcmVzcycpO1xuICB9XG5cbiAgcmV0dXJuIFsuLi50eXBlTmFtZXNdO1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IG1lcmdlIGZyb20gJ2RlZXBtZXJnZSc7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGZzVXRpbCB9IGZyb20gJy4uL3V0aWxzL2ZzVXRpbC5qcyc7XG5pbXBvcnQgeyBzb3J0S2V5cyB9IGZyb20gJy4uL3V0aWxzL29iamVjdFV0aWwuanMnO1xuaW1wb3J0IHsgcHJvbWlzZVBvb2wgfSBmcm9tICcuLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5cbmNvbnN0IGV4Y2x1ZGVGaWxlUGF0dGVybnMgPSBbXG4gICcqKi8uZ2l0L29iamVjdHMvKionLFxuICAnKiovLmdpdC9zdWJ0cmVlLWNhY2hlLyoqJyxcbiAgJyoqL25vZGVfbW9kdWxlcy8qKicsXG4gICcqKi90bXAvKionLFxuICAnKiovdGVtcC8qKicsXG4gICcqKi9kaXN0LyoqJyxcbl07XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZW5lcmF0ZVZzY29kZVNldHRpbmdzKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2dlbmVyYXRlVnNjb2RlU2V0dGluZ3MnLCBhc3luYyAoKSA9PiB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnLnZzY29kZScsICdzZXR0aW5ncy5qc29uJyk7XG4gICAgICBjb25zdCBleGlzdGluZ0NvbnRlbnQgPSBhd2FpdCBmcy5wcm9taXNlcy5yZWFkRmlsZShmaWxlUGF0aCwgJ3V0ZjgnKTtcbiAgICAgIGxldCBzZXR0aW5ncyA9IEpTT04ucGFyc2UoZXhpc3RpbmdDb250ZW50KSBhcyBvYmplY3Q7XG4gICAgICBmb3IgKGNvbnN0IGV4Y2x1ZGVGaWxlUGF0dGVybiBvZiBleGNsdWRlRmlsZVBhdHRlcm5zKSB7XG4gICAgICAgIHNldHRpbmdzID0gbWVyZ2UuYWxsKFtzZXR0aW5ncywgZXhjbHVkZVNldHRpbmcoZXhjbHVkZUZpbGVQYXR0ZXJuKV0pO1xuICAgICAgfVxuICAgICAgaWYgKGNvbmZpZy5kb2VzQ29udGFpblBvZXRyeUxvY2sgfHwgY29uZmlnLmRvZXNDb250YWluVXZMb2NrKSB7XG4gICAgICAgIHNldHRpbmdzID0gbWVyZ2UuYWxsKFtzZXR0aW5ncywgZXhjbHVkZVNldHRpbmcoJyoqLy52ZW52LyoqJyldKTtcbiAgICAgIH1cbiAgICAgIGlmIChjb25maWcuZGVwZW5kaW5nLm5leHQpIHtcbiAgICAgICAgc2V0dGluZ3MgPSBtZXJnZS5hbGwoW3NldHRpbmdzLCBleGNsdWRlU2V0dGluZygnKiovLm5leHQvKionKV0pO1xuICAgICAgfVxuICAgICAgLy8gTExN44Gr44KI44KLdmliZSBjb2Rpbmfjgafjga/jgIHoh6rli5Xjg5Xjgqnjg7zjg57jg4Pjg4jjgoTjgrPjg7zjg4njgqLjgq/jgrfjg6fjg7PjgpLnhKHlirnljJbjgZnjgovjgZPjgajjgadcbiAgICAgIC8vIOeUn+aIkOOBleOCjOOBn+OCs+ODvOODieOBruWFg+OBruW9ouW8j+OCkue2reaMgeOBp+OBjeOCi1xuICAgICAgaWYgKCdlZGl0b3IuY29kZUFjdGlvbnNPblNhdmUnIGluIHNldHRpbmdzKSB7XG4gICAgICAgIGRlbGV0ZSBzZXR0aW5nc1snZWRpdG9yLmNvZGVBY3Rpb25zT25TYXZlJ107XG4gICAgICB9XG4gICAgICBpZiAoJ2VkaXRvci5mb3JtYXRPblNhdmUnIGluIHNldHRpbmdzKSB7XG4gICAgICAgIGRlbGV0ZSBzZXR0aW5nc1snZWRpdG9yLmZvcm1hdE9uU2F2ZSddO1xuICAgICAgfVxuICAgICAgc29ydEtleXMoc2V0dGluZ3MgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pO1xuICAgICAgY29uc3QgbmV3Q29udGVudCA9IEpTT04uc3RyaW5naWZ5KHNldHRpbmdzLCB1bmRlZmluZWQsIDIpO1xuICAgICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzVXRpbC5nZW5lcmF0ZUZpbGUoZmlsZVBhdGgsIG5ld0NvbnRlbnQpKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIGRvIG5vdGhpbmdcbiAgICB9XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBleGNsdWRlU2V0dGluZyhleGNsdWRlRmlsZVBhdHRlcm46IHN0cmluZyk6IG9iamVjdCB7XG4gIHJldHVybiB7XG4gICAgJ2ZpbGVzLndhdGNoZXJFeGNsdWRlJzoge1xuICAgICAgW2V4Y2x1ZGVGaWxlUGF0dGVybl06IHRydWUsXG4gICAgfSxcbiAgfTtcbn1cbiIsIi8vIG94bGludC1kaXNhYmxlIGVzbGludC1wbHVnaW4taW1wb3J0L25vLW5hbWVkLWFzLWRlZmF1bHQtbWVtYmVyIC0tIE5hbWVzcGFjZSBZQU1MIGNhbGxzIG1ha2UgbG9hZC9kdW1wIHVzYWdlIGNsZWFyZXIuXG5pbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgdHlwZSB7IENvbmZpZ3VyYXRpb25WYWx1ZU1hcCB9IGZyb20gJ0B5YXJucGtnL2NvcmUnO1xuaW1wb3J0IHlhbWwgZnJvbSAnanMteWFtbCc7XG5pbXBvcnQgc2VtdmVyIGZyb20gJ3NlbXZlcic7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuaW1wb3J0IHsgc3Bhd25TeW5jLCBzcGF3blN5bmNBbmRSZXR1cm5TdGRvdXQgfSBmcm9tICcuLi91dGlscy9zcGF3blV0aWwuanMnO1xuXG50eXBlIFNldHRpbmdzID0ge1xuICBhcHByb3ZlZEdpdFJlcG9zaXRvcmllcz86IHN0cmluZ1tdO1xuICBkZWZhdWx0U2VtdmVyUmFuZ2VQcmVmaXg6IHN0cmluZztcbiAgZW5hYmxlU2NyaXB0cz86IGJvb2xlYW47XG4gIG5tTW9kZTogc3RyaW5nO1xuICBub2RlTGlua2VyOiBzdHJpbmc7XG4gIG5wbU1pbmltYWxBZ2VHYXRlPzogc3RyaW5nO1xuICBucG1QcmVhcHByb3ZlZFBhY2thZ2VzPzogc3RyaW5nW107XG4gIHBsdWdpbnM/OiBQbHVnaW5bXTtcbn0gJiBQYXJ0aWFsPENvbmZpZ3VyYXRpb25WYWx1ZU1hcD47XG5cbmludGVyZmFjZSBQbHVnaW4ge1xuICBjaGVja3N1bTogc3RyaW5nO1xuICBwYXRoOiBzdHJpbmc7XG4gIHNwZWM6IHN0cmluZztcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlWWFybnJjWW1sKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2dlbmVyYXRlWWFybnJjWW1sJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IHlhcm5yY1ltbFBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICcueWFybnJjLnltbCcpO1xuICAgIGlmIChjb25maWcuaXNCdW4pIHtcbiAgICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiBmcy5wcm9taXNlcy5ybSh5YXJucmNZbWxQYXRoLCB7IGZvcmNlOiB0cnVlIH0pKTtcbiAgICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PlxuICAgICAgICBmcy5wcm9taXNlcy5ybShwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICcueWFybicpLCB7IGZvcmNlOiB0cnVlLCByZWN1cnNpdmU6IHRydWUgfSlcbiAgICAgICk7XG4gICAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT5cbiAgICAgICAgZnMucHJvbWlzZXMucm0ocGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAneWFybi5sb2NrJyksIHsgZm9yY2U6IHRydWUsIHJlY3Vyc2l2ZTogdHJ1ZSB9KVxuICAgICAgKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBjdXJyZW50VmVyc2lvbiA9IHNwYXduU3luY0FuZFJldHVyblN0ZG91dCgneWFybicsIFsnLS12ZXJzaW9uJ10sIGNvbmZpZy5kaXJQYXRoKTtcbiAgICBjb25zdCBsYXRlc3RWZXJzaW9uID0gZ2V0TGF0ZXN0VmVyc2lvbignQHlhcm5wa2cvY2xpJywgY29uZmlnLmRpclBhdGgpO1xuICAgIGlmIChpc05ld2VyVmVyc2lvbihsYXRlc3RWZXJzaW9uLCBjdXJyZW50VmVyc2lvbikpIHtcbiAgICAgIHNwYXduU3luYygneWFybicsIFsnc2V0JywgJ3ZlcnNpb24nLCBsYXRlc3RWZXJzaW9uXSwgY29uZmlnLmRpclBhdGgsIDEpO1xuICAgIH1cblxuICAgIGNvbnN0IHJlbGVhc2VzUGF0aCA9IHBhdGguam9pbihjb25maWcuZGlyUGF0aCwgJy55YXJuJywgJ3JlbGVhc2VzJyk7XG4gICAgYXdhaXQgZnMucHJvbWlzZXMubWtkaXIocmVsZWFzZXNQYXRoLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgICBmb3IgKGNvbnN0IGZpbGUgb2YgYXdhaXQgZnMucHJvbWlzZXMucmVhZGRpcihyZWxlYXNlc1BhdGgpKSB7XG4gICAgICBpZiAoZmlsZS5zdGFydHNXaXRoKCd5YXJuLScpICYmICFmaWxlLnN0YXJ0c1dpdGgoYHlhcm4tJHtsYXRlc3RWZXJzaW9ufS5gKSkge1xuICAgICAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnMucHJvbWlzZXMucm0ocGF0aC5qb2luKHJlbGVhc2VzUGF0aCwgZmlsZSkpKTtcbiAgICAgICAgY29uc29sZS5sb2coJ1JlbW92ZWQnLCBwYXRoLmpvaW4ocmVsZWFzZXNQYXRoLCBmaWxlKSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgeWFybnJjUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJy55YXJucmMnKTtcbiAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnMucHJvbWlzZXMucm0oeWFybnJjUGF0aCwgeyBmb3JjZTogdHJ1ZSB9KSk7XG5cbiAgICBsZXQgc2V0dGluZ3MgPSB7fSBhcyBTZXR0aW5ncztcbiAgICB0cnkge1xuICAgICAgc2V0dGluZ3MgPSAoeWFtbC5sb2FkKGF3YWl0IGZzLnByb21pc2VzLnJlYWRGaWxlKHlhcm5yY1ltbFBhdGgsICd1dGY4JykpIGFzIFNldHRpbmdzIHwgdW5kZWZpbmVkKSA/PyBzZXR0aW5ncztcbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIGRvIG5vdGhpbmdcbiAgICB9XG4gICAgc2V0dGluZ3MuZGVmYXVsdFNlbXZlclJhbmdlUHJlZml4ID0gJyc7XG4gICAgLy8gSW5zdGFsbC10aW1lIHNjcmlwdHMgYXJlIGEgY29tbW9uIHN1cHBseS1jaGFpbiBleGVjdXRpb24gcGF0aC4gS2VlcCB0aGlzXG4gICAgLy8gZXhwbGljaXQgc28gc3RhbGUgcHJvamVjdCBzZXR0aW5ncyBjYW5ub3QgcmUtZW5hYmxlIHRoZW0gZ2xvYmFsbHkuXG4gICAgc2V0dGluZ3MuZW5hYmxlU2NyaXB0cyA9IGZhbHNlO1xuICAgIHNldHRpbmdzLm5vZGVMaW5rZXIgPSAnbm9kZS1tb2R1bGVzJztcbiAgICBzZXR0aW5ncy5ubU1vZGUgPSAnaGFyZGxpbmtzLWdsb2JhbCc7XG4gICAgc2V0dGluZ3MubnBtTWluaW1hbEFnZUdhdGUgPSAnNWQnO1xuICAgIHNldHRpbmdzLmFwcHJvdmVkR2l0UmVwb3NpdG9yaWVzID0gW1xuICAgICAgLy8gWWFybiA0LjE0IGJsb2NrcyBnaXQgZGVwZW5kZW5jaWVzIHVubGVzcyB0aGUgcmVwb3NpdG9yeSBVUkwgaXMgZXhwbGljaXRseSBhbGxvd2VkLlxuICAgICAgJ2h0dHBzOi8vZ2l0aHViLmNvbS9XaWxsQm9vc3Rlci8qLmdpdCcsXG4gICAgICAnc3NoOi8vZ2l0QGdpdGh1Yi5jb20vV2lsbEJvb3N0ZXIvKi5naXQnLFxuICAgICAgJ2h0dHBzOi8vZ2l0aHViLmNvbS9XaWxsQm9vc3RlckxhYi8qLmdpdCcsXG4gICAgICAnc3NoOi8vZ2l0QGdpdGh1Yi5jb20vV2lsbEJvb3N0ZXJMYWIvKi5naXQnLFxuICAgIF07XG4gICAgc2V0dGluZ3MubnBtUHJlYXBwcm92ZWRQYWNrYWdlcyA9IFtcbiAgICAgIC8vIC0tLS0tLS0tLS0gU1RBUlQ6IFdlIGJlbGlldmUgb3VyIHBhY2thZ2VzIGFyZSBzYWZlIC0tLS0tLS0tLS1cbiAgICAgICdAZXhlcmNvZGUvKicsXG4gICAgICAnQHdpbGxib29zdGVyLyonLFxuICAgICAgJ2FnZW50LXJ1bnRpbWUta2l0JyxcbiAgICAgICdhdC1kZWNvcmF0b3JzJyxcbiAgICAgICdidWlsZC10cycsXG4gICAgICAnZ2VuLWkxOG4tdHMnLFxuICAgICAgJ29uZS13YXktZ2l0LXN5bmMnLFxuICAgICAgLy8gLS0tLS0tLS0tLSBFTkQ6IFdlIGJlbGlldmUgb3VyIHBhY2thZ2VzIGFyZSBzYWZlIC0tLS0tLS0tLS1cblxuICAgICAgLy8gVG8gZGVhbCB3aXRoIENWRSBsaWtlIGh0dHBzOi8vbmV4dGpzLm9yZy9ibG9nL0NWRS0yMDI1LTY2NDc4XG4gICAgICAnbmV4dCcsXG4gICAgICAnQG5leHQvKicsXG4gICAgICAnQHR5cGVzLyonLFxuICAgICAgJ0B0eXBlc2NyaXB0LyonLFxuICAgICAgJ0BveGZtdC8qJyxcbiAgICAgICdAb3hsaW50LyonLFxuICAgICAgJ0BveGxpbnQtdHNnb2xpbnQvKicsXG4gICAgICAnb3hmbXQnLFxuICAgICAgJ294bGludCcsXG4gICAgICAnb3hsaW50LXRzZ29saW50JyxcbiAgICAgICdyZWFjdCcsXG4gICAgICAncmVhY3QtZG9tJyxcbiAgICBdO1xuICAgIGRlbGV0ZSBzZXR0aW5ncy5jb21wcmVzc2lvbkxldmVsO1xuICAgIGlmIChzZXR0aW5ncy5pbmplY3RFbnZpcm9ubWVudEZpbGVzPy5sZW5ndGggPT09IDApIHtcbiAgICAgIGRlbGV0ZSBzZXR0aW5ncy5pbmplY3RFbnZpcm9ubWVudEZpbGVzO1xuICAgIH1cbiAgICAvLyBjZi4gaHR0cHM6Ly9naXRodWIuY29tL3lhcm5wa2cvYmVycnkvcHVsbC80Njk4XG4gICAgc2V0dGluZ3MuZW5hYmxlR2xvYmFsQ2FjaGUgPSB0cnVlO1xuICAgIGNvbnN0IG9yaWdpbmFsTGVuZ3RoID0gc2V0dGluZ3MucGx1Z2lucz8ubGVuZ3RoID8/IDA7XG4gICAgc2V0dGluZ3MucGx1Z2lucyA9IHNldHRpbmdzLnBsdWdpbnM/LmZpbHRlcigocCkgPT4gcC5wYXRoICE9PSAnLnlhcm4vcGx1Z2lucy91bmRlZmluZWQuY2pzJykgPz8gW107XG4gICAgaWYgKHNldHRpbmdzLnBsdWdpbnMubGVuZ3RoICE9PSBvcmlnaW5hbExlbmd0aCkge1xuICAgICAgY29uc3QgcGx1Z2luUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJy55YXJuJywgJ3BsdWdpbnMnLCAndW5kZWZpbmVkLmNqcycpO1xuICAgICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzLnByb21pc2VzLnJtKHBsdWdpblBhdGgsIHsgZm9yY2U6IHRydWUgfSkpO1xuICAgIH1cbiAgICBpZiAoc2V0dGluZ3MucGx1Z2lucy5sZW5ndGggPT09IDApIHtcbiAgICAgIGRlbGV0ZSBzZXR0aW5ncy5wbHVnaW5zO1xuICAgIH1cbiAgICBhd2FpdCBmcy5wcm9taXNlcy53cml0ZUZpbGUoeWFybnJjWW1sUGF0aCwgeWFtbC5kdW1wKHNldHRpbmdzLCB7IGxpbmVXaWR0aDogLTEgfSkpO1xuXG4gICAgc3Bhd25TeW5jKCd5YXJuJywgWydkbHgnLCAneWFybi1wbHVnaW4tYXV0by1pbnN0YWxsJ10sIGNvbmZpZy5kaXJQYXRoKTtcbiAgICAvLyBUaGUgdGFyZ2V0IHJlcG8gbWF5IG5vdCBoYXZlIHByZXR0aWVyIGluc3RhbGxlZCB5ZXQsIGFuZCB5YXJuLXBsdWdpbi1hdXRvLWluc3RhbGwgZWRpdHMgdGhpcyBmaWxlIGFmdGVyIGpzLXlhbWwuXG4gICAgc3Bhd25TeW5jKCd5YXJuJywgZ2V0WWFybnJjUHJldHRpZXJBcmdzKGNvbmZpZy5kaXJQYXRoLCB5YXJucmNZbWxQYXRoKSwgY29uZmlnLmRpclBhdGgpO1xuICB9KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldFlhcm5yY1ByZXR0aWVyQXJncyhkaXJQYXRoOiBzdHJpbmcsIHlhcm5yY1ltbFBhdGg6IHN0cmluZyk6IHN0cmluZ1tdIHtcbiAgcmV0dXJuIFsnZGx4JywgJ3ByZXR0aWVyJywgJy0tbm8tY29uZmlnJywgJy0td3JpdGUnLCBwYXRoLnJlbGF0aXZlKGRpclBhdGgsIHlhcm5yY1ltbFBhdGgpXTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldExhdGVzdFZlcnNpb24ocGFja2FnZU5hbWU6IHN0cmluZywgZGlyUGF0aDogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIHNwYXduU3luY0FuZFJldHVyblN0ZG91dCgnbnBtJywgWydzaG93JywgcGFja2FnZU5hbWUsICd2ZXJzaW9uJ10sIGRpclBhdGgpIHx8ICcwLjAuMCc7XG59XG5cbmZ1bmN0aW9uIGlzTmV3ZXJWZXJzaW9uKG5ld1ZlcnNpb246IHN0cmluZywgb2xkVmVyc2lvbjogc3RyaW5nKTogYm9vbGVhbiB7XG4gIGNvbnN0IHZhbGlkTmV3VmVyc2lvbiA9IHNlbXZlci52YWxpZChuZXdWZXJzaW9uKTtcbiAgaWYgKCF2YWxpZE5ld1ZlcnNpb24pIHJldHVybiBmYWxzZTtcblxuICByZXR1cm4gc2VtdmVyLmd0KHZhbGlkTmV3VmVyc2lvbiwgc2VtdmVyLnZhbGlkKG9sZFZlcnNpb24pID8/ICcwLjAuMCcpO1xufVxuIiwiaW1wb3J0IHR5cGUgeyBPY3Rva2l0IH0gZnJvbSAnQG9jdG9raXQvY29yZSc7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGdldE9jdG9raXQsIGdpdEh1YlV0aWwsIGhhc0dpdEh1YlRva2VuIH0gZnJvbSAnLi4vdXRpbHMvZ2l0aHViVXRpbC5qcyc7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBzZXR1cExhYmVscyhjb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdzZXR1cExhYmVscycsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBbb3duZXIsIHJlcG9dID0gZ2l0SHViVXRpbC5nZXRPcmdBbmROYW1lKGNvbmZpZy5yZXBvc2l0b3J5ID8/ICcnKTtcbiAgICBpZiAoIW93bmVyIHx8ICFyZXBvKSByZXR1cm47XG4gICAgaWYgKG93bmVyICE9PSAnV2lsbEJvb3N0ZXInICYmIG93bmVyICE9PSAnV2lsbEJvb3N0ZXJMYWInKSByZXR1cm47XG4gICAgaWYgKCFoYXNHaXRIdWJUb2tlbihvd25lcikpIHJldHVybjtcblxuICAgIGNvbnN0IG9jdG9raXQgPSBnZXRPY3Rva2l0KG93bmVyKTtcblxuICAgIHRyeSB7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAnZDE6IHgtZWFzeSA6aGVkZ2Vob2c6JywgJ0VERTlGRScpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ2QyOiBlYXN5IDpyYWJiaXQyOicsICdEREQ2RkUnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdkMzogbWVkaXVtIDpveDonLCAnQzRCNUZEJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAnZDQ6IGhhcmQgOnNxdWlkOicsICdBNzhCRkEnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdkNTogeC1oYXJkIDp3aGFsZTI6JywgJzhCNUNGNicpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ3AxOiBjcml0aWNhbCA6ZmlyZTo6ZmlyZTo6ZmlyZTonLCAnRUY0NDQ0Jyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAncDI6IHVyZ2VudCA6ZmlyZTo6ZmlyZTonLCAnRjg3MTcxJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAncDM6IGltcG9ydGFudCA6ZmlyZTonLCAnRkNBNUE1Jyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAncDQ6IG5pY2UgdG8gaGF2ZSA6ZHJvcGxldDonLCAnRkVDQUNBJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAncjogYmxpdHonLCAnNTMwMGJjJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAncjogZmlyZWJhc2UnLCAnZmZjYTI4Jyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAncjogcHJpc21hJywgJzBjMzQ0YicpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ3I6IHJlYWN0JywgJzYxZGFmYicpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ3I6IHN2ZWx0ZScsICdmZjNlMDAnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdyOiBzZW1hbnRpYy1yZWxlYXNlJywgJzQ5NDk0OScpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ3JlYWR5IDpyb2NrZXQ6JywgJzIyQzU1RScpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ3JldmlldyByZXF1ZXN0ZWQgOm1hZzonLCAnRkJDQTA0Jyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAncmVsZWFzZWQgOmJvb2ttYXJrOicsICc2MzY2RjEnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdzOiAwLjVoIDpjbG9jazEyMzA6JywgJ0YzRjRGNicpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ3M6IDFoIDpjbG9jazE6JywgJ0U1RTdFQicpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ3M6IDJoIDpjbG9jazI6JywgJ0QxRDVEQicpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ3M6IDNoIDpjbG9jazM6JywgJzlDQTNBRicpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ3M6IDVoIDpjbG9jazU6JywgJzZCNzI4MCcpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ3M6IDhoIDpjbG9jazg6JywgJzRCNTU2MycpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ3M6IDEzaCA6Y2xvY2sxOicsICczNzQxNTEnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICd0OiBidWlsZCA6aGFtbWVyOicsICdCRkRCRkUnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICd0OiBjaG9yZSA6YnJvb206JywgJ0JGREJGRScpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ3Q6IGNpIDpjb25zdHJ1Y3Rpb25fd29ya2VyOicsICdCRkRCRkUnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICd0OiBkb2NzIDptZW1vOicsICdCRkRCRkUnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICd0OiBmZWF0IDpzcGFya2xlczonLCAnQkZEQkZFJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAndDogZml4IDpidWc6JywgJ0JGREJGRScpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ3Q6IHBlcmYgOnphcDonLCAnQkZEQkZFJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAndDogcmVmYWN0b3IgOnJlY3ljbGU6JywgJ0JGREJGRScpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ3Q6IHN0eWxlIDpsaXBzdGljazonLCAnQkZEQkZFJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAndDogdGVzdCA6dGVzdF90dWJlOicsICdCRkRCRkUnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdwcm9qZWN0JywgJzI0MjkyRicpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ2ZvY3VzZWQgOmRhcnQ6JywgJzIyQzU1RScpO1xuXG4gICAgICBhd2FpdCBkZWxldGVMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ2J1ZycpO1xuICAgICAgYXdhaXQgZGVsZXRlTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdkb2N1bWVudGF0aW9uJyk7XG4gICAgICBhd2FpdCBkZWxldGVMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ2R1cGxpY2F0ZScpO1xuICAgICAgYXdhaXQgZGVsZXRlTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdlbmhhbmNlbWVudCcpO1xuICAgICAgYXdhaXQgZGVsZXRlTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdnb29kIGZpcnN0IGlzc3VlJyk7XG4gICAgICBhd2FpdCBkZWxldGVMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ2hlbHAgd2FudGVkJyk7XG4gICAgICBhd2FpdCBkZWxldGVMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ2ludmFsaWQnKTtcbiAgICAgIGF3YWl0IGRlbGV0ZUxhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAncXVlc3Rpb24nKTtcbiAgICAgIGF3YWl0IGRlbGV0ZUxhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAnd29udGZpeCcpO1xuXG4gICAgICBhd2FpdCBkZWxldGVMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ3JlYWR5Jyk7XG4gICAgICBhd2FpdCBkZWxldGVMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ3JldmlldyByZXF1ZXN0ZWQnKTtcbiAgICAgIGF3YWl0IGRlbGV0ZUxhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAncmVsZWFzZWQnKTtcbiAgICAgIGF3YWl0IGRlbGV0ZUxhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAnc2VtYW50aWMtcmVsZWFzZScpO1xuICAgICAgYXdhaXQgZGVsZXRlTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdsbG0tcHIgOnJvYm90OicpO1xuICAgICAgYXdhaXQgZGVsZXRlTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdhaS1wciA6cm9ib3Q6Jyk7XG4gICAgICBhd2FpdCBkZWxldGVMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ2dlbi1wci1hbGwgOnJvYm90OicpO1xuICAgICAgYXdhaXQgZGVsZXRlTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdnZW4tcHItY2xhdWRlIDpyb2JvdDonKTtcbiAgICAgIGF3YWl0IGRlbGV0ZUxhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAnZ2VuLXByLWNvZGV4IDpyb2JvdDonKTtcbiAgICAgIGF3YWl0IGRlbGV0ZUxhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAnZ2VuLXByLWdlbWluaSA6cm9ib3Q6Jyk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNvbnNvbGUud2FybignU2tpcCBzZXR1cExhYmVscyBkdWUgdG86JywgKGVycm9yIGFzIEVycm9yIHwgdW5kZWZpbmVkKT8uc3RhY2sgPz8gZXJyb3IpO1xuICAgIH1cbiAgfSk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHNldHVwTGFiZWwob2N0b2tpdDogT2N0b2tpdCwgb3duZXI6IHN0cmluZywgcmVwbzogc3RyaW5nLCBuYW1lOiBzdHJpbmcsIGNvbG9yOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgdHJ5IHtcbiAgICAvLyBJc3N1ZXMgcGVybWlzc2lvblxuICAgIGF3YWl0IG9jdG9raXQucmVxdWVzdCgnUE9TVCAvcmVwb3Mve293bmVyfS97cmVwb30vbGFiZWxzJywge1xuICAgICAgb3duZXIsXG4gICAgICByZXBvLFxuICAgICAgbmFtZSxcbiAgICAgIGNvbG9yLFxuICAgIH0pO1xuICB9IGNhdGNoIHtcbiAgICAvLyBJc3N1ZXMgcGVybWlzc2lvblxuICAgIGF3YWl0IG9jdG9raXQucmVxdWVzdCgnUEFUQ0ggL3JlcG9zL3tvd25lcn0ve3JlcG99L2xhYmVscy97bmFtZX0nLCB7XG4gICAgICBvd25lcixcbiAgICAgIHJlcG8sXG4gICAgICBuYW1lLFxuICAgICAgY29sb3IsXG4gICAgfSk7XG4gIH1cbn1cblxuYXN5bmMgZnVuY3Rpb24gZGVsZXRlTGFiZWwob2N0b2tpdDogT2N0b2tpdCwgb3duZXI6IHN0cmluZywgcmVwbzogc3RyaW5nLCBuYW1lOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgdHJ5IHtcbiAgICAvLyBJc3N1ZXMgcGVybWlzc2lvblxuICAgIGF3YWl0IG9jdG9raXQucmVxdWVzdCgnREVMRVRFIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9sYWJlbHMve25hbWV9Jywge1xuICAgICAgb3duZXIsXG4gICAgICByZXBvLFxuICAgICAgbmFtZSxcbiAgICB9KTtcbiAgfSBjYXRjaCB7XG4gICAgLy8gZG8gbm90aGluZ1xuICB9XG59XG4iLCJpbXBvcnQgeyBjcmVhdGVSZXF1aXJlIH0gZnJvbSAnbm9kZTptb2R1bGUnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IGRvdGVudiBmcm9tICdkb3RlbnYnO1xuaW1wb3J0IHR5cGUgc29kaXVtTW9kdWxlIGZyb20gJ2xpYnNvZGl1bS13cmFwcGVycyc7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgeyBvcHRpb25zIH0gZnJvbSAnLi4vb3B0aW9ucy5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGdldE9jdG9raXQsIGdpdEh1YlV0aWwsIGhhc0dpdEh1YlRva2VuIH0gZnJvbSAnLi4vdXRpbHMvZ2l0aHViVXRpbC5qcyc7XG5cbmNvbnN0IERFUFJFQ0FURURfU0VDUkVUX05BTUVTID0gWydSRUFEWV9ESVNDT1JEX1dFQkhPT0tfVVJMJywgJ0dIX0JPVF9QQVQnLCAnUFVCTElDX0dIX0JPVF9QQVQnXTtcbmNvbnN0IHJlcXVpcmUgPSBjcmVhdGVSZXF1aXJlKGltcG9ydC5tZXRhLnVybCk7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBzZXR1cFNlY3JldHMoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignc2V0dXBTZWNyZXRzJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IFtvd25lciwgcmVwb10gPSBnaXRIdWJVdGlsLmdldE9yZ0FuZE5hbWUoY29uZmlnLnJlcG9zaXRvcnkgPz8gJycpO1xuICAgIGlmICghb3duZXIgfHwgIXJlcG8gfHwgb3duZXIgIT09ICdXaWxsQm9vc3RlckxhYicpIHJldHVybjtcbiAgICBpZiAoIWhhc0dpdEh1YlRva2VuKG93bmVyKSB8fCAhb3B0aW9ucy5kb2VzVXBsb2FkRW52VmFycykgcmV0dXJuO1xuXG4gICAgY29uc3QgcGFyc2VkID0gZG90ZW52LmNvbmZpZyh7IHBhdGg6IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJy5lbnYnKSwgcXVpZXQ6IHRydWUgfSkucGFyc2VkID8/IHt9O1xuICAgIGlmIChPYmplY3Qua2V5cyhwYXJzZWQpLmxlbmd0aCA9PT0gMCkgcmV0dXJuO1xuXG4gICAgY29uc3Qgb2N0b2tpdCA9IGdldE9jdG9raXQob3duZXIpO1xuXG4gICAgdHJ5IHtcbiAgICAgIGZvciAoY29uc3Qgc2VjcmV0TmFtZSBvZiBERVBSRUNBVEVEX1NFQ1JFVF9OQU1FUykge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIC8vIFJlcXVpcmVzIFNlY3JldHMgcGVybWlzc2lvblxuICAgICAgICAgIGF3YWl0IG9jdG9raXQucmVxdWVzdCgnREVMRVRFIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9hY3Rpb25zL3NlY3JldHMve3NlY3JldF9uYW1lfScsIHtcbiAgICAgICAgICAgIG93bmVyLFxuICAgICAgICAgICAgcmVwbyxcbiAgICAgICAgICAgIHNlY3JldF9uYW1lOiBzZWNyZXROYW1lLFxuICAgICAgICAgIH0pO1xuICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICAvLyBkbyBub3RoaW5nXG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gUmVxdWlyZXMgU2VjcmV0cyBwZXJtaXNzaW9uXG4gICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IG9jdG9raXQucmVxdWVzdCgnR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9hY3Rpb25zL3NlY3JldHMvcHVibGljLWtleScsIHtcbiAgICAgICAgb3duZXIsXG4gICAgICAgIHJlcG8sXG4gICAgICB9KTtcbiAgICAgIGNvbnN0IHsga2V5LCBrZXlfaWQ6IGtleUlkIH0gPSByZXNwb25zZS5kYXRhO1xuXG4gICAgICBjb25zdCBzb2RpdW0gPSBnZXRTb2RpdW0oKTtcbiAgICAgIGF3YWl0IHNvZGl1bS5yZWFkeTtcblxuICAgICAgZm9yIChjb25zdCBbbmFtZSwgc2VjcmV0XSBvZiBPYmplY3QuZW50cmllcyhwYXJzZWQpKSB7XG4gICAgICAgIGlmIChcbiAgICAgICAgICBuYW1lID09PSAnR0hfQk9UX1BBVCcgfHxcbiAgICAgICAgICBuYW1lID09PSAnR0hfQk9UX1BBVF9GT1JfV0lMTEJPT1NURVInIHx8XG4gICAgICAgICAgbmFtZSA9PT0gJ0dIX0JPVF9QQVRfRk9SX1dJTExCT09TVEVSTEFCJ1xuICAgICAgICApIHtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIENvbnZlcnQgU2VjcmV0ICYgQmFzZTY0IGtleSB0byBVaW50OEFycmF5LlxuICAgICAgICBjb25zdCByYXdLZXkgPSBzb2RpdW0uZnJvbV9iYXNlNjQoa2V5LCBzb2RpdW0uYmFzZTY0X3ZhcmlhbnRzLk9SSUdJTkFMKTtcbiAgICAgICAgY29uc3QgcmF3U2VjID0gc29kaXVtLmZyb21fc3RyaW5nKHNlY3JldCk7XG5cbiAgICAgICAgLy8gRW5jcnlwdCB0aGUgc2VjcmV0IHVzaW5nIExpYlNvZGl1bVxuICAgICAgICBjb25zdCBlbmNCeXRlcyA9IHNvZGl1bS5jcnlwdG9fYm94X3NlYWwocmF3U2VjLCByYXdLZXkpO1xuXG4gICAgICAgIC8vIENvbnZlcnQgZW5jcnlwdGVkIFVpbnQ4QXJyYXkgdG8gQmFzZTY0XG4gICAgICAgIGNvbnN0IGVuY0Jhc2U2NCA9IHNvZGl1bS50b19iYXNlNjQoZW5jQnl0ZXMsIHNvZGl1bS5iYXNlNjRfdmFyaWFudHMuT1JJR0lOQUwpO1xuXG4gICAgICAgIC8vIFJlcXVpcmVzIFNlY3JldHMgcGVybWlzc2lvblxuICAgICAgICBhd2FpdCBvY3Rva2l0LnJlcXVlc3QoJ1BVVCAvcmVwb3Mve293bmVyfS97cmVwb30vYWN0aW9ucy9zZWNyZXRzL3tzZWNyZXRfbmFtZX0nLCB7XG4gICAgICAgICAgb3duZXIsXG4gICAgICAgICAgcmVwbyxcbiAgICAgICAgICBzZWNyZXRfbmFtZTogbmFtZSxcbiAgICAgICAgICBlbmNyeXB0ZWRfdmFsdWU6IGVuY0Jhc2U2NCxcbiAgICAgICAgICBrZXlfaWQ6IGtleUlkLFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgY29uc29sZS53YXJuKCdTa2lwIHNldHVwU2VjcmV0cyBkdWUgdG86JywgKGVycm9yIGFzIEVycm9yIHwgdW5kZWZpbmVkKT8uc3RhY2sgPz8gZXJyb3IpO1xuICAgIH1cbiAgfSk7XG59XG5cbmZ1bmN0aW9uIGdldFNvZGl1bSgpOiB0eXBlb2Ygc29kaXVtTW9kdWxlIHtcbiAgLy8gbGlic29kaXVtLXdyYXBwZXJzJyBFU00gZW50cnkgY2FuIGJpbmQgdG8gbGlic29kaXVtQDAuOC4zLCB3aG9zZSBkZWZhdWx0XG4gIC8vIGV4cG9ydCBubyBsb25nZXIgZXhwb3NlcyByZWFkeS4gVGhlIENvbW1vbkpTIGVudHJ5IGtlZXBzIHRoZSBBUEkgc2hhcGUuXG4gIHJldHVybiByZXF1aXJlKCdsaWJzb2RpdW0td3JhcHBlcnMnKSBhcyB0eXBlb2Ygc29kaXVtTW9kdWxlO1xufVxuIiwiaW1wb3J0IHsgd2l0aFJldHJ5IH0gZnJvbSAnQHdpbGxib29zdGVyL3NoYXJlZC1saWIvc3JjJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZ2V0T2N0b2tpdCwgZ2l0SHViVXRpbCwgaGFzR2l0SHViVG9rZW4gfSBmcm9tICcuLi91dGlscy9naXRodWJVdGlsLmpzJztcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHNldHVwR2l0SHViU2V0dGluZ3MoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignc2V0dXBHaXRIdWJTZXR0aW5ncycsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBbb3duZXIsIHJlcG9dID0gZ2l0SHViVXRpbC5nZXRPcmdBbmROYW1lKGNvbmZpZy5yZXBvc2l0b3J5ID8/ICcnKTtcbiAgICBpZiAoIW93bmVyIHx8ICFyZXBvKSByZXR1cm47XG4gICAgaWYgKG93bmVyICE9PSAnV2lsbEJvb3N0ZXInICYmIG93bmVyICE9PSAnV2lsbEJvb3N0ZXJMYWInKSByZXR1cm47XG4gICAgaWYgKCFoYXNHaXRIdWJUb2tlbihvd25lcikpIHJldHVybjtcblxuICAgIGNvbnN0IG9jdG9raXQgPSBnZXRPY3Rva2l0KG93bmVyKTtcblxuICAgIHRyeSB7XG4gICAgICAvLyBSZXBvc2l0b3J5IHNldHRpbmdzIG5lZWQgYWRtaW5pc3RyYXRpb24gcGVybWlzc2lvbiwgdW5saWtlIGZpbGUgZ2VuZXJhdGlvbi5cbiAgICAgIGF3YWl0IHdpdGhSZXRyeShcbiAgICAgICAgKCkgPT5cbiAgICAgICAgICBvY3Rva2l0LnJlcXVlc3QoJ1BBVENIIC9yZXBvcy97b3duZXJ9L3tyZXBvfScsIHtcbiAgICAgICAgICAgIG93bmVyLFxuICAgICAgICAgICAgcmVwbyxcbiAgICAgICAgICAgIGFsbG93X2F1dG9fbWVyZ2U6IHRydWUsXG4gICAgICAgICAgICBhbGxvd19tZXJnZV9jb21taXQ6IGZhbHNlLFxuICAgICAgICAgICAgYWxsb3dfc3F1YXNoX21lcmdlOiB0cnVlLFxuICAgICAgICAgICAgYWxsb3dfcmViYXNlX21lcmdlOiBmYWxzZSxcbiAgICAgICAgICAgIGFsbG93X3VwZGF0ZV9icmFuY2g6IHRydWUsXG4gICAgICAgICAgICBkZWxldGVfYnJhbmNoX29uX21lcmdlOiB0cnVlLFxuICAgICAgICAgICAgc3F1YXNoX21lcmdlX2NvbW1pdF90aXRsZTogJ1BSX1RJVExFJyxcbiAgICAgICAgICAgIHNxdWFzaF9tZXJnZV9jb21taXRfbWVzc2FnZTogJ0JMQU5LJyxcbiAgICAgICAgICAgIGhlYWRlcnM6IHtcbiAgICAgICAgICAgICAgJ1gtR2l0SHViLUFwaS1WZXJzaW9uJzogJzIwMjItMTEtMjgnLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIC4uLihjb25maWcucmVwb3NpdG9yeT8uc3RhcnRzV2l0aCgnZ2l0aHViOldpbGxCb29zdGVyLycpID8geyBhbGxvd19hdXRvX21lcmdlOiB0cnVlIH0gOiB7fSksXG4gICAgICAgICAgfSksXG4gICAgICAgIHtcbiAgICAgICAgICBzaG91bGRSZXRyeTogKGVycm9yKSA9PiAhaXNHaXRIdWJQZXJtaXNzaW9uT3JWaXNpYmlsaXR5RXJyb3IoZXJyb3IpLFxuICAgICAgICB9XG4gICAgICApO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBpZiAoIWlzR2l0SHViUGVybWlzc2lvbk9yVmlzaWJpbGl0eUVycm9yKGVycm9yKSkgdGhyb3cgZXJyb3I7XG5cbiAgICAgIC8vIExvY2FsIHdiZnkgcnVucyBvZnRlbiBoYXZlIHB1c2ggcGVybWlzc2lvbiB3aXRob3V0IGFkbWluIHBlcm1pc3Npb24uXG4gICAgICBjb25zb2xlLndhcm4oJ1NraXAgc2V0dXBHaXRIdWJTZXR0aW5ncyBkdWUgdG86JywgKGVycm9yIGFzIEVycm9yIHwgdW5kZWZpbmVkKT8uc3RhY2sgPz8gZXJyb3IpO1xuICAgIH1cbiAgfSk7XG59XG5cbmZ1bmN0aW9uIGlzR2l0SHViUGVybWlzc2lvbk9yVmlzaWJpbGl0eUVycm9yKGVycm9yOiB1bmtub3duKTogYm9vbGVhbiB7XG4gIGlmICghZXJyb3IgfHwgdHlwZW9mIGVycm9yICE9PSAnb2JqZWN0JyB8fCAhKCdzdGF0dXMnIGluIGVycm9yKSkgcmV0dXJuIGZhbHNlO1xuICByZXR1cm4gZXJyb3Iuc3RhdHVzID09PSA0MDEgfHwgZXJyb3Iuc3RhdHVzID09PSA0MDMgfHwgZXJyb3Iuc3RhdHVzID09PSA0MDQ7XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgeyBkaXN0YW5jZSB9IGZyb20gJ2Zhc3Rlc3QtbGV2ZW5zaHRlaW4nO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBmc1V0aWwgfSBmcm9tICcuLi91dGlscy9mc1V0aWwuanMnO1xuaW1wb3J0IHsgcHJvbWlzZVBvb2wgfSBmcm9tICcuLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5cbmNvbnN0IHBhY2thZ2VNYW5hZ2VyUnVuUGxhY2Vob2xkZXIgPSAnX19QTV9SVU5fXyc7XG5cbmNvbnN0IHRlbXBsYXRlcyA9IHtcbiAgJ3B1bGxfcmVxdWVzdF90ZW1wbGF0ZS5tZCc6IGBcbkNsb3NlICM8SXNzdWVOdW1iZXI+XG5cbiMjIFNlbGYgQ2hlY2tcblxuLSBbIF0gSSd2ZSBjb25maXJtZWQgXFxgQWxsIGNoZWNrcyBoYXZlIHBhc3NlZFxcYCBvbiB0aGlzIHBhZ2UuXG4gIC0gUFIgdGl0bGUgZm9sbG93cyBbQW5ndWxhcidzIGNvbW1pdCBtZXNzYWdlIGZvcm1hdF0oaHR0cHM6Ly9naXRodWIuY29tL2FuZ3VsYXIvYW5ndWxhci9ibG9iL21haW4vQ09OVFJJQlVUSU5HLm1kIy1jb21taXQtbWVzc2FnZS1mb3JtYXQpLlxuICAtIFBSIHRpdGxlIGRvZXNuJ3QgaGF2ZSBcXGBXSVA6XFxgLlxuICAtIFRoZSB0ZXN0IGNvbW1hbmQgKGUuZy4sIFxcYCR7cGFja2FnZU1hbmFnZXJSdW5QbGFjZWhvbGRlcn0gdGVzdFxcYCkgcGFzc2VkLlxuICAtIFRoZSBsaW50IGNvbW1hbmQgKGUuZy4sIFxcYCR7cGFja2FnZU1hbmFnZXJSdW5QbGFjZWhvbGRlcn0gbGludFxcYCkgcGFzc2VkLlxuICAtIFlvdSBtYXkgbGVhdmUgdGhpcyBib3ggdW5jaGVja2VkIGR1ZSB0byBsb25nIHdvcmtmbG93cy5cbi0gWyBdIEkndmUgcmV2aWV3ZWQgbXkgY2hhbmdlcyBvbiB0aGUgR2l0SHViIGRpZmYgdmlldy5cbi0gWyBdIEkndmUgd3JpdHRlbiB0aGUgc3RlcHMgdG8gdGVzdCBteSBjaGFuZ2VzLlxuLSBbIF0gSSd2ZSBhZGRlZCBzY3JlZW5zaG90cyAoaWYgdGhlIFVJIGNoYW5nZWQpLlxuICAtIFlvdSBtYXkgbGVhdmUgdGhpcyBib3ggdW5jaGVja2VkIGlmIHlvdSBkaWRuJ3QgbW9kaWZ5IHRoZSBVSS5cblxuPCEtLSBQbGVhc2UgYWRkIHNjcmVlbnNob3RzIGlmIHlvdSBtb2RpZnkgdGhlIFVJLlxufCBDdXJyZW50ICAgICAgICAgICAgICAgICAgfCBJbiBjb21pbmcgICAgICAgICAgICAgICAgfFxufCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfFxufCA8aW1nIHNyYz1cIlwiIHdpZHRoPVwiNDAwXCI+IHwgPGltZyBzcmM9XCJcIiB3aWR0aD1cIjQwMFwiPiB8XG4tLT5cblxuPCEtLSBQbGVhc2UgYWRkIHN0ZXBzIHRvIHRlc3QgeW91ciBjaGFuZ2VzLlxuIyMgU3RlcHMgdG8gVGVzdFxuXG4xLiBPcGVuIGh0dHA6Ly9sb2NhbGhvc3QtZXhlcmNvZGUud2lsbGJvb3N0ZXIubmV0OjMwMDAvamEtSlAvY291cnNlcy9fZXhhbXBsZS9sZXNzb25zL19leGFtcGxlX2FfcGx1c19iL3Byb2JsZW1zL19leGFtcGxlX2FfcGx1c19iIGFmdGVyIGxvZ2luLlxuMi4gU2VsZWN0IHRoZSBsYW5ndWFnZSBcXGBDXFxgLlxuMy4gV3JpdGUgdGhlIGZvbGxvd2luZyBjb2RlOlxuICAgXFxgXFxgXFxgY1xuICAgI2luY2x1ZGUgPHN0ZGlvLmg+XG5cbiAgIGludCBtYWluKHZvaWQpIHtcbiAgICAgaW50IGEsIGI7XG5cbiAgICAgc2NhbmYoXCIlZCAlZFwiLCAmYSwgJmIpO1xuICAgICBwcmludGYoXCIlZFwiLCBhICsgYik7XG4gICAgIHJldHVybiAwO1xuICAgfVxuICAgXFxgXFxgXFxgXG40LiBQdXNoIFxcYFN1Ym1pdFxcYCBidXR0b24uXG41LiAuLi5cbi0tPlxuYC50cmltKCksXG59O1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVHaXRIdWJUZW1wbGF0ZXMoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZ2VuZXJhdGVHaXRIdWJUZW1wbGF0ZXMnLCBhc3luYyAoKSA9PiB7XG4gICAgaWYgKCFjb25maWcuaXNXaWxsQm9vc3RlclJlcG8pIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IFtmaWxlTmFtZSwgbmV3Q29udGVudF0gb2YgT2JqZWN0LmVudHJpZXModGVtcGxhdGVzKSkge1xuICAgICAgY29uc3QgY29udGVudCA9IGFwcGx5UGFja2FnZU1hbmFnZXJUZW1wbGF0ZShuZXdDb250ZW50LCBjb25maWcpO1xuICAgICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICcuZ2l0aHViJywgZmlsZU5hbWUpO1xuICAgICAgaWYgKGZzLmV4aXN0c1N5bmMoZmlsZVBhdGgpKSB7XG4gICAgICAgIGNvbnN0IG9sZENvbnRlbnQgPSBhd2FpdCBmcy5wcm9taXNlcy5yZWFkRmlsZShmaWxlUGF0aCwgJ3V0ZjgnKTtcbiAgICAgICAgaWYgKGRpc3RhbmNlKG9sZENvbnRlbnQsIGNvbnRlbnQpID4gY29udGVudC5sZW5ndGggLyAyKSB7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgYXdhaXQgZnMucHJvbWlzZXMubWtkaXIocGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnLmdpdGh1YicpLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiBmc1V0aWwuZ2VuZXJhdGVGaWxlKGZpbGVQYXRoLCBjb250ZW50KSk7XG4gICAgfVxuICB9KTtcbn1cblxuZnVuY3Rpb24gYXBwbHlQYWNrYWdlTWFuYWdlclRlbXBsYXRlKHRlbXBsYXRlOiBzdHJpbmcsIGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IHN0cmluZyB7XG4gIGNvbnN0IHBhY2thZ2VNYW5hZ2VyQ29tbWFuZCA9IGNvbmZpZy5pc0J1biA/ICdidW4gcnVuJyA6ICd5YXJuJztcbiAgcmV0dXJuIHRlbXBsYXRlLnJlcGxhY2VBbGwocGFja2FnZU1hbmFnZXJSdW5QbGFjZWhvbGRlciwgcGFja2FnZU1hbmFnZXJDb21tYW5kKTtcbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBmc3AgZnJvbSAnbm9kZTpmcy9wcm9taXNlcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgZmcgZnJvbSAnZmFzdC1nbG9iJztcbmltcG9ydCB7IHNpbXBsZUdpdCB9IGZyb20gJ3NpbXBsZS1naXQnO1xuaW1wb3J0IHsgcGFyc2UgYXMgcGFyc2VUb21sIH0gZnJvbSAnc21vbC10b21sJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUpzb24gfSBmcm9tICd0eXBlLWZlc3QnO1xuaW1wb3J0IHsgeiB9IGZyb20gJ3pvZCc7XG5cbmltcG9ydCB7IGdldE9jdG9raXQsIGdpdEh1YlV0aWwgfSBmcm9tICcuL3V0aWxzL2dpdGh1YlV0aWwuanMnO1xuaW1wb3J0IHsgZ2xvYklnbm9yZSB9IGZyb20gJy4vdXRpbHMvZ2xvYlV0aWwuanMnO1xuXG5leHBvcnQgaW50ZXJmYWNlIFBhY2thZ2VDb25maWcge1xuICBkaXJQYXRoOiBzdHJpbmc7XG4gIGRvY2tlcmZpbGU6IHN0cmluZztcbiAgaXNSb290OiBib29sZWFuO1xuICBpc1B1YmxpY1JlcG86IGJvb2xlYW47XG4gIGlzUmVmZXJyZWRCeU90aGVyUmVwbzogYm9vbGVhbjtcbiAgcmVwb3NpdG9yeT86IHN0cmluZztcbiAgcmVwb0F1dGhvcj86IHN0cmluZztcbiAgcmVwb05hbWU/OiBzdHJpbmc7XG4gIGlzV2lsbEJvb3N0ZXJSZXBvOiBib29sZWFuO1xuICBpc0J1bjogYm9vbGVhbjtcbiAgaXNFc21QYWNrYWdlOiBib29sZWFuO1xuICBpc1dpbGxCb29zdGVyQ29uZmlnczogYm9vbGVhbjtcbiAgLy8gZGVwZW5kZW5jeSBpbmZvcm1hdGlvblxuICBkb2VzQ29udGFpblN1YlBhY2thZ2VKc29uczogYm9vbGVhbjtcbiAgZG9lc0NvbnRhaW5Eb2NrZXJmaWxlOiBib29sZWFuO1xuICBkb2VzQ29udGFpbkdlbWZpbGU6IGJvb2xlYW47XG4gIGRvZXNDb250YWluR29Nb2Q6IGJvb2xlYW47XG4gIGRvZXNDb250YWluUGFja2FnZUpzb246IGJvb2xlYW47XG4gIGRvZXNDb250YWluUG9ldHJ5TG9jazogYm9vbGVhbjtcbiAgZG9lc0NvbnRhaW5VdkxvY2s6IGJvb2xlYW47XG4gIGRvZXNDb250YWluUG9tWG1sOiBib29sZWFuO1xuICBkb2VzQ29udGFpblB1YnNwZWNZYW1sOiBib29sZWFuO1xuICBkb2VzQ29udGFpblRlbXBsYXRlWWFtbDogYm9vbGVhbjtcbiAgZG9lc0NvbnRhaW5Wc2NvZGVTZXR0aW5nc0pzb246IGJvb2xlYW47XG4gIC8vIHNvdXJjZSBjb2RlIGZpbGVzXG4gIGRvZXNDb250YWluSmF2YVNjcmlwdDogYm9vbGVhbjtcbiAgZG9lc0NvbnRhaW5UeXBlU2NyaXB0OiBib29sZWFuO1xuICBkb2VzQ29udGFpbkpzeE9yVHN4OiBib29sZWFuO1xuICBkb2VzQ29udGFpbkphdmE6IGJvb2xlYW47XG4gIGRvZXNDb250YWluSmF2YVNjcmlwdEluUGFja2FnZXM6IGJvb2xlYW47XG4gIGRvZXNDb250YWluVHlwZVNjcmlwdEluUGFja2FnZXM6IGJvb2xlYW47XG4gIGRvZXNDb250YWluSnN4T3JUc3hJblBhY2thZ2VzOiBib29sZWFuO1xuICBkb2VzQ29udGFpbkphdmFJblBhY2thZ2VzOiBib29sZWFuO1xuXG4gIGRlcGVuZGluZzoge1xuICAgIGJsaXR6OiBib29sZWFuO1xuICAgIGZpcmViYXNlOiBib29sZWFuO1xuICAgIGdlbkkxOG5UczogYm9vbGVhbjtcbiAgICBsaXRlc3RyZWFtOiBib29sZWFuO1xuICAgIG5leHQ6IGJvb2xlYW47XG4gICAgcGxheXdyaWdodFRlc3Q6IGJvb2xlYW47XG4gICAgcHJpc21hOiBib29sZWFuO1xuICAgIHB5cmlnaHQ6IGJvb2xlYW47XG4gICAgcmVhY3Q6IGJvb2xlYW47XG4gICAgcmVhY3ROYXRpdmU6IGJvb2xlYW47XG4gICAgc2VtYW50aWNSZWxlYXNlOiBib29sZWFuO1xuICAgIHN0b3J5Ym9vazogYm9vbGVhbjtcbiAgICB3YjogYm9vbGVhbjtcbiAgICBjaGFrcmE6IGJvb2xlYW47XG4gICAgZHJpenpsZTogYm9vbGVhbjtcbiAgfTtcbiAgcmVsZWFzZToge1xuICAgIGJyYW5jaGVzOiBzdHJpbmdbXTtcbiAgICBnaXRodWI6IGJvb2xlYW47XG4gICAgbnBtOiBib29sZWFuO1xuICB9O1xuICBoYXNWZXJzaW9uU2V0dGluZ3M6IGJvb2xlYW47XG4gIG1pc2VUYXNrczogUmVjb3JkPHN0cmluZywgc3RyaW5nPjtcbiAgcGFja2FnZUpzb24/OiBQYWNrYWdlSnNvbjtcbiAgd2JmeUpzb24/OiBXYmZ5SnNvbjtcbn1cblxudHlwZSBXYmZ5SnNvbiA9IHouaW5mZXI8dHlwZW9mIHdiZnlKc29uU2NoZW1hPjtcblxuY29uc3Qgd2JmeUpzb25TY2hlbWEgPSB6Lm9iamVjdCh7XG4gIHR5cG9zOiB6XG4gICAgLm9iamVjdCh7XG4gICAgICBhbGw6IHoucmVjb3JkKHouc3RyaW5nKCksIHouc3RyaW5nKCkpLm9wdGlvbmFsKCksXG4gICAgICBkb2M6IHoucmVjb3JkKHouc3RyaW5nKCksIHouc3RyaW5nKCkpLm9wdGlvbmFsKCksXG4gICAgICB0czogei5yZWNvcmQoei5zdHJpbmcoKSwgei5zdHJpbmcoKSkub3B0aW9uYWwoKSxcbiAgICAgIHRleHQ6IHoucmVjb3JkKHouc3RyaW5nKCksIHouc3RyaW5nKCkpLm9wdGlvbmFsKCksXG4gICAgfSlcbiAgICAub3B0aW9uYWwoKSxcbn0pO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2V0UGFja2FnZUNvbmZpZyhcbiAgZGlyUGF0aDogc3RyaW5nLFxuICByb290Q29uZmlnPzogUGFja2FnZUNvbmZpZ1xuKTogUHJvbWlzZTxQYWNrYWdlQ29uZmlnIHwgdW5kZWZpbmVkPiB7XG4gIGNvbnN0IHBhY2thZ2VKc29uUGF0aCA9IHBhdGgucmVzb2x2ZShkaXJQYXRoLCAncGFja2FnZS5qc29uJyk7XG4gIHRyeSB7XG4gICAgY29uc3QgZG9lc0NvbnRhaW5QYWNrYWdlSnNvbiA9IGZzLmV4aXN0c1N5bmMocGFja2FnZUpzb25QYXRoKTtcbiAgICBsZXQgZGVwZW5kZW5jaWVzOiBQYWNrYWdlSnNvblsnZGVwZW5kZW5jaWVzJ10gPSB7fTtcbiAgICBsZXQgZGV2RGVwZW5kZW5jaWVzOiBQYWNrYWdlSnNvblsnZGV2RGVwZW5kZW5jaWVzJ10gPSB7fTtcbiAgICBsZXQgcGFja2FnZUpzb246IFBhY2thZ2VKc29uID0ge307XG4gICAgbGV0IGVzbVBhY2thZ2UgPSBmYWxzZTtcbiAgICBpZiAoZG9lc0NvbnRhaW5QYWNrYWdlSnNvbikge1xuICAgICAgY29uc3QgcGFja2FnZUpzb25UZXh0ID0gZnMucmVhZEZpbGVTeW5jKHBhY2thZ2VKc29uUGF0aCwgJ3V0ZjgnKTtcbiAgICAgIHBhY2thZ2VKc29uID0gSlNPTi5wYXJzZShwYWNrYWdlSnNvblRleHQpIGFzIFBhY2thZ2VKc29uO1xuICAgICAgZGVwZW5kZW5jaWVzID0gcGFja2FnZUpzb24uZGVwZW5kZW5jaWVzID8/IHt9O1xuICAgICAgZGV2RGVwZW5kZW5jaWVzID0gcGFja2FnZUpzb24uZGV2RGVwZW5kZW5jaWVzID8/IHt9O1xuICAgICAgZXNtUGFja2FnZSA9IHBhY2thZ2VKc29uLnR5cGUgPT09ICdtb2R1bGUnO1xuICAgIH1cblxuICAgIGxldCByZWxlYXNlQnJhbmNoZXM6IHN0cmluZ1tdID0gW107XG4gICAgbGV0IHJlbGVhc2VQbHVnaW5zOiBzdHJpbmdbXSA9IFtdO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCByZWxlYXNlcmNKc29uUGF0aCA9IHBhdGgucmVzb2x2ZShkaXJQYXRoLCAnLnJlbGVhc2VyYy5qc29uJyk7XG4gICAgICBjb25zdCBqc29uID0gSlNPTi5wYXJzZShhd2FpdCBmc3AucmVhZEZpbGUocmVsZWFzZXJjSnNvblBhdGgsICd1dGY4JykpIGFzXG4gICAgICAgIHwge1xuICAgICAgICAgICAgYnJhbmNoZXM6IHN0cmluZ1tdO1xuICAgICAgICAgICAgcGx1Z2lucz86IHN0cmluZ1tdW107XG4gICAgICAgICAgfVxuICAgICAgICB8IHVuZGVmaW5lZDtcbiAgICAgIHJlbGVhc2VCcmFuY2hlcyA9IGpzb24/LmJyYW5jaGVzID8/IFtdO1xuICAgICAgcmVsZWFzZVBsdWdpbnMgPSBqc29uPy5wbHVnaW5zPy5mbGF0KCkgPz8gW107XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBkbyBub3RoaW5nXG4gICAgfVxuXG4gICAgY29uc3QgaXNSb290ID1cbiAgICAgIHBhdGguYmFzZW5hbWUocGF0aC5yZXNvbHZlKGRpclBhdGgsICcuLicpKSAhPT0gJ3BhY2thZ2VzJyB8fFxuICAgICAgIWZzLmV4aXN0c1N5bmMocGF0aC5yZXNvbHZlKGRpclBhdGgsICcuLicsICcuLicsICdwYWNrYWdlLmpzb24nKSk7XG5cbiAgICBsZXQgcmVwb0luZm86IFJlY29yZDxzdHJpbmcsIHVua25vd24+IHwgdW5kZWZpbmVkO1xuICAgIGlmIChpc1Jvb3QpIHtcbiAgICAgIHJlcG9JbmZvID0gYXdhaXQgZmV0Y2hSZXBvSW5mbyhkaXJQYXRoLCBwYWNrYWdlSnNvbik7XG4gICAgfVxuXG4gICAgbGV0IGhhc1ZlcnNpb25TZXR0aW5ncyA9IGhhc1ZlcnNpb25TZXR0aW5nc0ZpbGUoZGlyUGF0aCk7XG4gICAgZm9yIChjb25zdCBwcmVmaXggb2YgWydqYXZhJywgJ25vZGUnLCAncHl0aG9uJ10pIHtcbiAgICAgIGlmIChmcy5leGlzdHNTeW5jKHBhdGgucmVzb2x2ZShkaXJQYXRoLCBgLiR7cHJlZml4fS12ZXJzaW9uYCkpKSB7XG4gICAgICAgIGhhc1ZlcnNpb25TZXR0aW5ncyA9IHRydWU7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cblxuICAgIGxldCBkb2NrZXJmaWxlID0gJyc7XG4gICAgdHJ5IHtcbiAgICAgIGRvY2tlcmZpbGUgPSBhd2FpdCBmc3AucmVhZEZpbGUocGF0aC5yZXNvbHZlKGRpclBhdGgsICdEb2NrZXJmaWxlJyksICd1dGY4Jyk7XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBkbyBub3RoaW5nXG4gICAgfVxuXG4gICAgLy8gUmVhZCB3YmZ5Lmpzb25cbiAgICBjb25zdCB3YmZ5SnNvblBhdGggPSBwYXRoLnJlc29sdmUoZGlyUGF0aCwgJ3diZnkuanNvbicpO1xuICAgIGxldCB3YmZ5SnNvbjogV2JmeUpzb24gfCB1bmRlZmluZWQ7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHdiZnlKc29uVGV4dCA9IGF3YWl0IGZzcC5yZWFkRmlsZSh3YmZ5SnNvblBhdGgsICd1dGY4Jyk7XG4gICAgICB3YmZ5SnNvbiA9IHdiZnlKc29uU2NoZW1hLnBhcnNlKEpTT04ucGFyc2Uod2JmeUpzb25UZXh0KSk7XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBkbyBub3RoaW5nXG4gICAgfVxuXG4gICAgY29uc3QgcmVwb0Z1bGxOYW1lID0gdHlwZW9mIHJlcG9JbmZvPy5mdWxsX25hbWUgPT09ICdzdHJpbmcnID8gcmVwb0luZm8uZnVsbF9uYW1lIDogdW5kZWZpbmVkO1xuICAgIGxldCByZXBvQXV0aG9yOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gICAgbGV0IHJlcG9OYW1lOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gICAgaWYgKHJlcG9GdWxsTmFtZSkge1xuICAgICAgY29uc3QgcmVwb1BhcnRzID0gcmVwb0Z1bGxOYW1lLnNwbGl0KCcvJyk7XG4gICAgICBpZiAocmVwb1BhcnRzLmxlbmd0aCA+PSAyKSB7XG4gICAgICAgIHJlcG9BdXRob3IgPSByZXBvUGFydHNbMF07XG4gICAgICAgIHJlcG9OYW1lID0gcmVwb1BhcnRzWzFdO1xuICAgICAgfVxuICAgIH1cbiAgICBjb25zdCByZXBvc2l0b3J5ID0gcmVwb0Z1bGxOYW1lID8gYGdpdGh1Yjoke3JlcG9GdWxsTmFtZX1gIDogdW5kZWZpbmVkO1xuICAgIGNvbnN0IGNvbmZpZzogUGFja2FnZUNvbmZpZyA9IHtcbiAgICAgIGRpclBhdGgsXG4gICAgICBkb2NrZXJmaWxlLFxuICAgICAgaXNSb290LFxuICAgICAgaXNQdWJsaWNSZXBvOiByZXBvSW5mbz8ucHJpdmF0ZSA9PT0gZmFsc2UsXG4gICAgICBpc1JlZmVycmVkQnlPdGhlclJlcG86ICEhcGFja2FnZUpzb24uZmlsZXMsXG4gICAgICByZXBvc2l0b3J5LFxuICAgICAgcmVwb0F1dGhvcixcbiAgICAgIHJlcG9OYW1lLFxuICAgICAgaXNXaWxsQm9vc3RlclJlcG86IEJvb2xlYW4oXG4gICAgICAgIHJlcG9zaXRvcnk/LnN0YXJ0c1dpdGgoJ2dpdGh1YjpXaWxsQm9vc3Rlci8nKSB8fCByZXBvc2l0b3J5Py5zdGFydHNXaXRoKCdnaXRodWI6V2lsbEJvb3N0ZXJMYWIvJylcbiAgICAgICksXG4gICAgICBpc0J1bjogcm9vdENvbmZpZz8uaXNCdW4gfHwgZnMuZXhpc3RzU3luYyhwYXRoLmpvaW4oZGlyUGF0aCwgJ2J1bi5sb2NrJykpLFxuICAgICAgaXNFc21QYWNrYWdlOiBlc21QYWNrYWdlLFxuICAgICAgaXNXaWxsQm9vc3RlckNvbmZpZ3M6IHBhY2thZ2VKc29uUGF0aC5pbmNsdWRlcygnL3dpbGxib29zdGVyLWNvbmZpZ3MnKSxcbiAgICAgIGRvZXNDb250YWluU3ViUGFja2FnZUpzb25zOiBjb250YWluc0FueSgncGFja2FnZXMvKiovcGFja2FnZS5qc29uJywgZGlyUGF0aCksXG4gICAgICBkb2VzQ29udGFpbkRvY2tlcmZpbGU6ICEhZG9ja2VyZmlsZSB8fCBmcy5leGlzdHNTeW5jKHBhdGgucmVzb2x2ZShkaXJQYXRoLCAnZG9ja2VyLWNvbXBvc2UueW1sJykpLFxuICAgICAgZG9lc0NvbnRhaW5HZW1maWxlOiBmcy5leGlzdHNTeW5jKHBhdGgucmVzb2x2ZShkaXJQYXRoLCAnR2VtZmlsZScpKSxcbiAgICAgIGRvZXNDb250YWluR29Nb2Q6IGZzLmV4aXN0c1N5bmMocGF0aC5yZXNvbHZlKGRpclBhdGgsICdnby5tb2QnKSksXG4gICAgICBkb2VzQ29udGFpblBhY2thZ2VKc29uOiBmcy5leGlzdHNTeW5jKHBhdGgucmVzb2x2ZShkaXJQYXRoLCAncGFja2FnZS5qc29uJykpLFxuICAgICAgZG9lc0NvbnRhaW5Qb2V0cnlMb2NrOiBmcy5leGlzdHNTeW5jKHBhdGgucmVzb2x2ZShkaXJQYXRoLCAncG9ldHJ5LmxvY2snKSksXG4gICAgICBkb2VzQ29udGFpblV2TG9jazogZnMuZXhpc3RzU3luYyhwYXRoLnJlc29sdmUoZGlyUGF0aCwgJ3V2LmxvY2snKSksXG4gICAgICBkb2VzQ29udGFpblBvbVhtbDogZnMuZXhpc3RzU3luYyhwYXRoLnJlc29sdmUoZGlyUGF0aCwgJ3BvbS54bWwnKSksXG4gICAgICBkb2VzQ29udGFpblB1YnNwZWNZYW1sOiBmcy5leGlzdHNTeW5jKHBhdGgucmVzb2x2ZShkaXJQYXRoLCAncHVic3BlYy55YW1sJykpLFxuICAgICAgZG9lc0NvbnRhaW5UZW1wbGF0ZVlhbWw6IGZzLmV4aXN0c1N5bmMocGF0aC5yZXNvbHZlKGRpclBhdGgsICd0ZW1wbGF0ZS55YW1sJykpLFxuICAgICAgZG9lc0NvbnRhaW5Wc2NvZGVTZXR0aW5nc0pzb246IGZzLmV4aXN0c1N5bmMocGF0aC5yZXNvbHZlKGRpclBhdGgsICcudnNjb2RlJywgJ3NldHRpbmdzLmpzb24nKSksXG4gICAgICBkb2VzQ29udGFpbkphdmFTY3JpcHQ6IGNvbnRhaW5zQW55KCd7YXBwLHNyYyx0ZXN0LHNjcmlwdHN9LyoqLyoue2NqcyxtanMsanMsanN4fScsIGRpclBhdGgpLFxuICAgICAgZG9lc0NvbnRhaW5UeXBlU2NyaXB0OiBjb250YWluc0FueSgne2FwcCxzcmMsdGVzdCxzY3JpcHRzfS8qKi8qLntjdHMsbXRzLHRzLHRzeH0nLCBkaXJQYXRoKSxcbiAgICAgIGRvZXNDb250YWluSnN4T3JUc3g6IGNvbnRhaW5zQW55KCd7YXBwLHNyYyx0ZXN0fS8qKi8qLnt0LGp9c3gnLCBkaXJQYXRoKSxcbiAgICAgIGRvZXNDb250YWluSmF2YTogY29udGFpbnNBbnkoJyoqLyouamF2YScsIGRpclBhdGgpLFxuICAgICAgZG9lc0NvbnRhaW5KYXZhU2NyaXB0SW5QYWNrYWdlczogY29udGFpbnNBbnkoJ3BhY2thZ2VzLyoqL3thcHAsc3JjLHRlc3Qsc2NyaXB0c30vKiovKi57Y2pzLG1qcyxqcyxqc3h9JywgZGlyUGF0aCksXG4gICAgICBkb2VzQ29udGFpblR5cGVTY3JpcHRJblBhY2thZ2VzOiBjb250YWluc0FueSgncGFja2FnZXMvKiove2FwcCxzcmMsdGVzdCxzY3JpcHRzfS8qKi8qLntjdHMsbXRzLHRzLHRzeH0nLCBkaXJQYXRoKSxcbiAgICAgIGRvZXNDb250YWluSnN4T3JUc3hJblBhY2thZ2VzOiBjb250YWluc0FueSgncGFja2FnZXMvKiove2FwcCxzcmMsdGVzdH0vKiovKi57dCxqfXN4JywgZGlyUGF0aCksXG4gICAgICBkb2VzQ29udGFpbkphdmFJblBhY2thZ2VzOiBjb250YWluc0FueSgncGFja2FnZXMvKiovKi5qYXZhJywgZGlyUGF0aCksXG4gICAgICBkZXBlbmRpbmc6IHtcbiAgICAgICAgYmxpdHo6ICEhZGVwZW5kZW5jaWVzLmJsaXR6LFxuICAgICAgICBjaGFrcmE6ICEhZGV2RGVwZW5kZW5jaWVzWydAY2hha3JhLXVpL2NsaSddLFxuICAgICAgICBkcml6emxlOiAhIWRlcGVuZGVuY2llc1snZHJpenpsZS1vcm0nXSB8fCAhIWRldkRlcGVuZGVuY2llc1snZHJpenpsZS1raXQnXSxcbiAgICAgICAgZmlyZWJhc2U6ICEhZGV2RGVwZW5kZW5jaWVzWydmaXJlYmFzZS10b29scyddLFxuICAgICAgICBnZW5JMThuVHM6ICEhZGVwZW5kZW5jaWVzWydnZW4taTE4bi10cyddIHx8ICEhZGV2RGVwZW5kZW5jaWVzWydnZW4taTE4bi10cyddLFxuICAgICAgICBsaXRlc3RyZWFtOiBkb2NrZXJmaWxlLmluY2x1ZGVzKCdpbnN0YWxsLWxpdGVzdHJlYW0uc2gnKSxcbiAgICAgICAgcmVhY3Q6ICEhZGVwZW5kZW5jaWVzLnJlYWN0LFxuICAgICAgICBuZXh0OiAhIWRlcGVuZGVuY2llcy5uZXh0LFxuICAgICAgICBwbGF5d3JpZ2h0VGVzdDpcbiAgICAgICAgICAhIWRlcGVuZGVuY2llc1snQHBsYXl3cmlnaHQvdGVzdCddIHx8ICEhZGV2RGVwZW5kZW5jaWVzWydAcGxheXdyaWdodC90ZXN0J10gfHwgISFkZXZEZXBlbmRlbmNpZXMucGxheXdyaWdodCxcbiAgICAgICAgcHJpc21hOiAhIWRlcGVuZGVuY2llc1snQHByaXNtYS9jbGllbnQnXSB8fCAhIWRldkRlcGVuZGVuY2llcy5wcmlzbWEsXG4gICAgICAgIHB5cmlnaHQ6ICEhZGV2RGVwZW5kZW5jaWVzLnB5cmlnaHQsXG4gICAgICAgIHJlYWN0TmF0aXZlOiAhIWRlcGVuZGVuY2llc1sncmVhY3QtbmF0aXZlJ10sXG4gICAgICAgIHNlbWFudGljUmVsZWFzZTogISEoXG4gICAgICAgICAgZGV2RGVwZW5kZW5jaWVzWydzZW1hbnRpYy1yZWxlYXNlJ10gfHxcbiAgICAgICAgICByZWxlYXNlQnJhbmNoZXMubGVuZ3RoID4gMCB8fFxuICAgICAgICAgIHJlbGVhc2VQbHVnaW5zLmxlbmd0aCA+IDBcbiAgICAgICAgKSxcbiAgICAgICAgc3Rvcnlib29rOiAhIWRldkRlcGVuZGVuY2llc1snQHN0b3J5Ym9vay9yZWFjdCddLFxuICAgICAgICB3YjogISFkZXBlbmRlbmNpZXNbJ0B3aWxsYm9vc3Rlci93YiddIHx8ICEhZGV2RGVwZW5kZW5jaWVzWydAd2lsbGJvb3N0ZXIvd2InXSxcbiAgICAgIH0sXG4gICAgICByZWxlYXNlOiB7XG4gICAgICAgIGJyYW5jaGVzOiByZWxlYXNlQnJhbmNoZXMsXG4gICAgICAgIGdpdGh1YjogcmVsZWFzZVBsdWdpbnMuaW5jbHVkZXMoJ0BzZW1hbnRpYy1yZWxlYXNlL2dpdGh1YicpLFxuICAgICAgICBucG06IHJlbGVhc2VQbHVnaW5zLmluY2x1ZGVzKCdAc2VtYW50aWMtcmVsZWFzZS9ucG0nKSxcbiAgICAgIH0sXG4gICAgICBoYXNWZXJzaW9uU2V0dGluZ3MsXG4gICAgICBtaXNlVGFza3M6IGF3YWl0IHJlYWRNaXNlVGFza3MoZGlyUGF0aCksXG4gICAgICBwYWNrYWdlSnNvbixcbiAgICAgIHdiZnlKc29uLFxuICAgIH07XG4gICAgaWYgKFxuICAgICAgY29uZmlnLmRvZXNDb250YWluR2VtZmlsZSB8fFxuICAgICAgY29uZmlnLmRvZXNDb250YWluR29Nb2QgfHxcbiAgICAgIGNvbmZpZy5kb2VzQ29udGFpblBhY2thZ2VKc29uIHx8XG4gICAgICBjb25maWcuZG9lc0NvbnRhaW5Qb2V0cnlMb2NrIHx8XG4gICAgICBjb25maWcuZG9lc0NvbnRhaW5VdkxvY2sgfHxcbiAgICAgIGNvbmZpZy5kb2VzQ29udGFpblBvbVhtbCB8fFxuICAgICAgY29uZmlnLmRvZXNDb250YWluUHVic3BlY1lhbWwgfHxcbiAgICAgIGNvbmZpZy5kb2VzQ29udGFpblRlbXBsYXRlWWFtbFxuICAgICkge1xuICAgICAgcmV0dXJuIGNvbmZpZztcbiAgICB9XG4gIH0gY2F0Y2gge1xuICAgIC8vIGRvIG5vdGhpbmdcbiAgfVxufVxuXG5mdW5jdGlvbiBoYXNWZXJzaW9uU2V0dGluZ3NGaWxlKGRpclBhdGg6IHN0cmluZyk6IGJvb2xlYW4ge1xuICBjb25zdCBjdXJyZW50ID0gcGF0aC5yZXNvbHZlKGRpclBhdGgpO1xuICByZXR1cm4gKFxuICAgIGZzLmV4aXN0c1N5bmMocGF0aC5qb2luKGN1cnJlbnQsICdtaXNlLnRvbWwnKSkgfHxcbiAgICBmcy5leGlzdHNTeW5jKHBhdGguam9pbihjdXJyZW50LCAnLm1pc2UudG9tbCcpKSB8fFxuICAgIGZzLmV4aXN0c1N5bmMocGF0aC5qb2luKGN1cnJlbnQsICcudG9vbC12ZXJzaW9ucycpKVxuICApO1xufVxuXG5hc3luYyBmdW5jdGlvbiByZWFkTWlzZVRhc2tzKGRpclBhdGg6IHN0cmluZyk6IFByb21pc2U8UmVjb3JkPHN0cmluZywgc3RyaW5nPj4ge1xuICBjb25zdCB0YXNrczogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHt9O1xuICBmb3IgKGNvbnN0IGZpbGVOYW1lIG9mIFsnbWlzZS50b21sJywgJy5taXNlLnRvbWwnXSkge1xuICAgIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKGRpclBhdGgsIGZpbGVOYW1lKTtcbiAgICB0cnkge1xuICAgICAgY29uc3Qgc2V0dGluZ3MgPSBwYXJzZVRvbWwoYXdhaXQgZnNwLnJlYWRGaWxlKGZpbGVQYXRoLCAndXRmOCcpKSBhcyB7IHRhc2tzPzogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gfTtcbiAgICAgIGZvciAoY29uc3QgW25hbWUsIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhzZXR0aW5ncy50YXNrcyA/PyB7fSkpIHtcbiAgICAgICAgdGFza3NbbmFtZV0gPSByZWFkTWlzZVRhc2tDb21tYW5kKHZhbHVlKTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIE1pc3Npbmcgb3IgdGVtcG9yYXJpbHkgaW52YWxpZCBtaXNlIGZpbGVzIHNob3VsZCBub3QgYmxvY2sgb3RoZXIgd2JmeSBnZW5lcmF0b3JzLlxuICAgIH1cbiAgfVxuICByZXR1cm4gdGFza3M7XG59XG5cbmZ1bmN0aW9uIHJlYWRNaXNlVGFza0NvbW1hbmQodmFsdWU6IHVua25vd24pOiBzdHJpbmcge1xuICBpZiAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJykgcmV0dXJuIHZhbHVlO1xuICAvLyBQcmVzZXJ2ZSBhcnJheS1mb3JtIG1pc2UgY29tbWFuZHMgc28gcmVjdXJzaW9uIGNoZWNrcyBjYW4gc3RpbGwgc2VlIHBhY2thZ2Ugc2NyaXB0IGNhbGxzLlxuICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHJldHVybiB2YWx1ZS5maWx0ZXIoKGNvbW1hbmQpOiBjb21tYW5kIGlzIHN0cmluZyA9PiB0eXBlb2YgY29tbWFuZCA9PT0gJ3N0cmluZycpLmpvaW4oJ1xcbicpO1xuICBpZiAodmFsdWUgJiYgdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JykgcmV0dXJuIHJlYWRNaXNlVGFza0NvbW1hbmQoKHZhbHVlIGFzIHsgcnVuPzogdW5rbm93biB9KS5ydW4pO1xuICByZXR1cm4gJyc7XG59XG5cbmZ1bmN0aW9uIGNvbnRhaW5zQW55KHBhdHRlcm46IHN0cmluZywgZGlyUGF0aDogc3RyaW5nKTogYm9vbGVhbiB7XG4gIHJldHVybiBmZy5nbG9iU3luYyhwYXR0ZXJuLCB7IGRvdDogdHJ1ZSwgY3dkOiBkaXJQYXRoLCBpZ25vcmU6IGdsb2JJZ25vcmUgfSkubGVuZ3RoID4gMDtcbn1cblxuYXN5bmMgZnVuY3Rpb24gZmV0Y2hSZXBvSW5mbyhkaXJQYXRoOiBzdHJpbmcsIHBhY2thZ2VKc29uOiBQYWNrYWdlSnNvbik6IFByb21pc2U8UmVjb3JkPHN0cmluZywgdW5rbm93bj4gfCB1bmRlZmluZWQ+IHtcbiAgY29uc3QgZ2l0ID0gc2ltcGxlR2l0KGRpclBhdGgpO1xuICBjb25zdCByZW1vdGVzID0gYXdhaXQgZ2l0LmdldFJlbW90ZXModHJ1ZSk7XG4gIGNvbnN0IG9yaWdpbiA9IHJlbW90ZXMuZmluZCgocikgPT4gci5uYW1lID09PSAnb3JpZ2luJyk7XG4gIGNvbnN0IHJlbW90ZVVybCA9IG9yaWdpbj8ucmVmcy5mZXRjaCA/PyBvcmlnaW4/LnJlZnMucHVzaDtcbiAgaWYgKHR5cGVvZiByZW1vdGVVcmwgPT09ICdzdHJpbmcnKSB7XG4gICAgY29uc3QganNvbiA9IGF3YWl0IHJlcXVlc3RSZXBvSW5mbyhyZW1vdGVVcmwpO1xuICAgIGlmIChqc29uKSByZXR1cm4ganNvbjtcbiAgfVxuXG4gIGNvbnN0IHVybCA9IHR5cGVvZiBwYWNrYWdlSnNvbi5yZXBvc2l0b3J5ID09PSAnc3RyaW5nJyA/IHBhY2thZ2VKc29uLnJlcG9zaXRvcnkgOiBwYWNrYWdlSnNvbi5yZXBvc2l0b3J5Py51cmw7XG4gIGlmICh1cmwpIHtcbiAgICBjb25zdCBqc29uID0gYXdhaXQgcmVxdWVzdFJlcG9JbmZvKHVybCk7XG4gICAgaWYgKGpzb24gJiYganNvbi5tZXNzYWdlICE9PSAnTm90IEZvdW5kJykgcmV0dXJuIGpzb247XG4gIH1cbn1cblxuYXN5bmMgZnVuY3Rpb24gcmVxdWVzdFJlcG9JbmZvKHVybE9yRnVsbE5hbWU6IHN0cmluZyk6IFByb21pc2U8UmVjb3JkPHN0cmluZywgdW5rbm93bj4gfCB1bmRlZmluZWQ+IHtcbiAgY29uc3QgW29yZywgbmFtZV0gPSBnaXRIdWJVdGlsLmdldE9yZ0FuZE5hbWUodXJsT3JGdWxsTmFtZSk7XG4gIGlmICghb3JnIHx8ICFuYW1lKSByZXR1cm47XG5cbiAgdHJ5IHtcbiAgICAvLyBNZXRhZGF0YSBwZXJtaXNzaW9uXG4gICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBnZXRPY3Rva2l0KCkucmVxdWVzdCgnR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfScsIHtcbiAgICAgIG93bmVyOiBvcmcsXG4gICAgICByZXBvOiBuYW1lLFxuICAgIH0pO1xuICAgIHJldHVybiByZXNwb25zZS5kYXRhO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGNvbnN0IHJlZGlyZWN0ZWRGdWxsTmFtZSA9IGdldFJlZGlyZWN0ZWRSZXBvRnVsbE5hbWUoZXJyb3IpO1xuICAgIGlmIChyZWRpcmVjdGVkRnVsbE5hbWUpIHtcbiAgICAgIHJldHVybiB7IGZ1bGxfbmFtZTogcmVkaXJlY3RlZEZ1bGxOYW1lIH07XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGdldFJlZGlyZWN0ZWRSZXBvRnVsbE5hbWUoZXJyb3I6IHVua25vd24pOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBpZiAoIWVycm9yIHx8IHR5cGVvZiBlcnJvciAhPT0gJ29iamVjdCcpIHJldHVybjtcblxuICBjb25zdCByZXNwb25zZSA9XG4gICAgJ3Jlc3BvbnNlJyBpbiBlcnJvclxuICAgICAgPyAoZXJyb3IgYXMgeyByZXNwb25zZT86IHsgc3RhdHVzPzogbnVtYmVyOyBoZWFkZXJzPzogUmVjb3JkPHN0cmluZywgc3RyaW5nIHwgdW5kZWZpbmVkPiB9IH0pLnJlc3BvbnNlXG4gICAgICA6IHVuZGVmaW5lZDtcbiAgY29uc3Qgc3RhdHVzID0gcmVzcG9uc2U/LnN0YXR1cyA/PyAoZXJyb3IgYXMgeyBzdGF0dXM/OiBudW1iZXIgfSkuc3RhdHVzO1xuICBpZiAoc3RhdHVzICE9PSAzMDEgJiYgc3RhdHVzICE9PSAzMDIpIHJldHVybjtcblxuICBjb25zdCBsb2NhdGlvbiA9IHJlc3BvbnNlPy5oZWFkZXJzPy5sb2NhdGlvbjtcbiAgaWYgKHR5cGVvZiBsb2NhdGlvbiAhPT0gJ3N0cmluZycpIHJldHVybjtcblxuICBjb25zdCBbb3JnLCBuYW1lXSA9IGdpdEh1YlV0aWwuZ2V0T3JnQW5kTmFtZShsb2NhdGlvbik7XG4gIGlmICghb3JnIHx8ICFuYW1lKSByZXR1cm47XG5cbiAgcmV0dXJuIGAke29yZ30vJHtuYW1lfWA7XG59XG4iLCJpbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcblxuY29uc3QgZGVwZW5kZW5jeVNlY3Rpb25LZXlzID0gWydkZXBlbmRlbmNpZXMnLCAnZGV2RGVwZW5kZW5jaWVzJywgJ29wdGlvbmFsRGVwZW5kZW5jaWVzJywgJ3BlZXJEZXBlbmRlbmNpZXMnXSBhcyBjb25zdDtcbmNvbnN0IGFsbG93ZWRHaXRIdWJPcmdhbml6YXRpb25QYXR0ZXJuID0gU3RyaW5nLnJhd2AoPzpXaWxsQm9vc3RlcnxXaWxsQm9vc3RlckxhYilgO1xuY29uc3QgYWxsb3dlZEdpdERlcGVuZGVuY3lQYXR0ZXJucyA9IFtcbiAgbmV3IFJlZ0V4cChgXiR7YWxsb3dlZEdpdEh1Yk9yZ2FuaXphdGlvblBhdHRlcm59L1teI1xcXFxzXSsoPzojXFxcXFMrKT8kYCwgJ3UnKSxcbiAgbmV3IFJlZ0V4cChgXmdpdGh1Yjoke2FsbG93ZWRHaXRIdWJPcmdhbml6YXRpb25QYXR0ZXJufS9bXiNcXFxcc10rKD86I1xcXFxTKyk/JGAsICd1JyksXG4gIG5ldyBSZWdFeHAoXG4gICAgYF4oPzpnaXRcXFxcKyk/aHR0cHM6Ly9naXRodWJcXFxcLmNvbS8ke2FsbG93ZWRHaXRIdWJPcmdhbml6YXRpb25QYXR0ZXJufS9bXiNcXFxcc10rKD86XFxcXC5naXQpPyg/OiNcXFxcUyspPyRgLFxuICAgICd1J1xuICApLFxuICBuZXcgUmVnRXhwKFxuICAgIGBeKD86Z2l0XFxcXCspP3NzaDovL2dpdEBnaXRodWJcXFxcLmNvbVs6L10ke2FsbG93ZWRHaXRIdWJPcmdhbml6YXRpb25QYXR0ZXJufS9bXiNcXFxcc10rKD86XFxcXC5naXQpPyg/OiNcXFxcUyspPyRgLFxuICAgICd1J1xuICApLFxuICBuZXcgUmVnRXhwKGBeKD86Z2l0XFxcXCspP2dpdEBnaXRodWJcXFxcLmNvbToke2FsbG93ZWRHaXRIdWJPcmdhbml6YXRpb25QYXR0ZXJufS9bXiNcXFxcc10rKD86XFxcXC5naXQpPyg/OiNcXFxcUyspPyRgLCAndScpLFxuXTtcblxuaW50ZXJmYWNlIERpc2FsbG93ZWREZXBlbmRlbmN5U291cmNlIHtcbiAgZGVwZW5kZW5jeU5hbWU6IHN0cmluZztcbiAgZGlyUGF0aDogc3RyaW5nO1xuICBzZWN0aW9uTmFtZTogKHR5cGVvZiBkZXBlbmRlbmN5U2VjdGlvbktleXMpW251bWJlcl07XG4gIHNwZWNpZmllcjogc3RyaW5nO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gYXNzZXJ0U2FmZURlcGVuZGVuY3lTb3VyY2VzKGNvbmZpZ3M6IFBhY2thZ2VDb25maWdbXSk6IHZvaWQge1xuICBjb25zdCBkaXNhbGxvd2VkU291cmNlcyA9IGNvbmZpZ3MuZmxhdE1hcChnZXREaXNhbGxvd2VkRGVwZW5kZW5jeVNvdXJjZXMpO1xuICBpZiAoZGlzYWxsb3dlZFNvdXJjZXMubGVuZ3RoID09PSAwKSByZXR1cm47XG5cbiAgY29uc3QgZGV0YWlscyA9IGRpc2FsbG93ZWRTb3VyY2VzXG4gICAgLm1hcChcbiAgICAgICh7IGRlcGVuZGVuY3lOYW1lLCBkaXJQYXRoLCBzZWN0aW9uTmFtZSwgc3BlY2lmaWVyIH0pID0+XG4gICAgICAgIGAtICR7cGF0aC5qb2luKGRpclBhdGgsICdwYWNrYWdlLmpzb24nKX06ICR7c2VjdGlvbk5hbWV9LiR7ZGVwZW5kZW5jeU5hbWV9IHVzZXMgJHtzcGVjaWZpZXJ9YFxuICAgIClcbiAgICAuam9pbignXFxuJyk7XG5cbiAgdGhyb3cgbmV3IEVycm9yKFxuICAgIGBEaXNhbGxvd2VkIEdpdCBkZXBlbmRlbmN5IHNvdXJjZXMgZm91bmQuXFxuT25seSBXaWxsQm9vc3RlciBhbmQgV2lsbEJvb3N0ZXJMYWIgR2l0SHViIGRlcGVuZGVuY2llcyBhcmUgYWxsb3dlZC5cXG4ke2RldGFpbHN9YFxuICApO1xufVxuXG5mdW5jdGlvbiBnZXREaXNhbGxvd2VkRGVwZW5kZW5jeVNvdXJjZXMoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogRGlzYWxsb3dlZERlcGVuZGVuY3lTb3VyY2VbXSB7XG4gIGNvbnN0IHBhY2thZ2VKc29uID0gY29uZmlnLnBhY2thZ2VKc29uO1xuICBpZiAoIXBhY2thZ2VKc29uKSByZXR1cm4gW107XG5cbiAgY29uc3QgZGlzYWxsb3dlZFNvdXJjZXM6IERpc2FsbG93ZWREZXBlbmRlbmN5U291cmNlW10gPSBbXTtcbiAgZm9yIChjb25zdCBzZWN0aW9uTmFtZSBvZiBkZXBlbmRlbmN5U2VjdGlvbktleXMpIHtcbiAgICBjb25zdCBzZWN0aW9uID0gcGFja2FnZUpzb25bc2VjdGlvbk5hbWVdO1xuICAgIGlmICghc2VjdGlvbikgY29udGludWU7XG5cbiAgICBmb3IgKGNvbnN0IFtkZXBlbmRlbmN5TmFtZSwgc3BlY2lmaWVyXSBvZiBPYmplY3QuZW50cmllcyhzZWN0aW9uKSkge1xuICAgICAgaWYgKCFzcGVjaWZpZXIpIGNvbnRpbnVlO1xuICAgICAgaWYgKCFpc0dpdERlcGVuZGVuY3lTcGVjaWZpZXIoc3BlY2lmaWVyKSkgY29udGludWU7XG4gICAgICBpZiAoaXNBbGxvd2VkR2l0RGVwZW5kZW5jeVNwZWNpZmllcihzcGVjaWZpZXIpKSBjb250aW51ZTtcblxuICAgICAgZGlzYWxsb3dlZFNvdXJjZXMucHVzaCh7XG4gICAgICAgIGRlcGVuZGVuY3lOYW1lLFxuICAgICAgICBkaXJQYXRoOiBjb25maWcuZGlyUGF0aCxcbiAgICAgICAgc2VjdGlvbk5hbWUsXG4gICAgICAgIHNwZWNpZmllcixcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuICByZXR1cm4gZGlzYWxsb3dlZFNvdXJjZXM7XG59XG5cbmZ1bmN0aW9uIGlzR2l0RGVwZW5kZW5jeVNwZWNpZmllcihzcGVjaWZpZXI6IHN0cmluZyk6IGJvb2xlYW4ge1xuICByZXR1cm4gKFxuICAgIGlzR2l0SHViU2hvcnRoYW5kU3BlY2lmaWVyKHNwZWNpZmllcikgfHxcbiAgICAvXig/OmJpdGJ1Y2tldHxnaXN0fGdpdGh1YnxnaXRsYWIpOi91LnRlc3Qoc3BlY2lmaWVyKSB8fFxuICAgIC9eaHR0cHM/OlxcL1xcLyg/OmJpdGJ1Y2tldFxcLm9yZ3xnaXRodWJcXC5jb218Z2l0bGFiXFwuY29tKVxcLy91LnRlc3Qoc3BlY2lmaWVyKSB8fFxuICAgIC9eKD86aHR0cHM/fHNzaCk6XFwvXFwvXFxTK1xcLmdpdCg/OiNcXFMrKT8kL3UudGVzdChzcGVjaWZpZXIpIHx8XG4gICAgL15bXkBcXHNdK0BbXjpcXHNdKzpcXFMrKD86I1xcUyspPyQvdS50ZXN0KHNwZWNpZmllcikgfHxcbiAgICBzcGVjaWZpZXIuc3RhcnRzV2l0aCgnZ2l0OicpIHx8XG4gICAgc3BlY2lmaWVyLnN0YXJ0c1dpdGgoJ2dpdCsnKSB8fFxuICAgIHNwZWNpZmllci5zdGFydHNXaXRoKCdzc2g6Ly9naXRAJylcbiAgKTtcbn1cblxuZnVuY3Rpb24gaXNHaXRIdWJTaG9ydGhhbmRTcGVjaWZpZXIoc3BlY2lmaWVyOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgcmV0dXJuIC9eW2EtekEtWjAtOV1bXFx3Li1dKlxcL1tcXHcuLV0rKD86I1xcUyspPyQvdS50ZXN0KHNwZWNpZmllcik7XG59XG5cbmZ1bmN0aW9uIGlzQWxsb3dlZEdpdERlcGVuZGVuY3lTcGVjaWZpZXIoc3BlY2lmaWVyOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgcmV0dXJuIGFsbG93ZWRHaXREZXBlbmRlbmN5UGF0dGVybnMuc29tZSgocGF0dGVybikgPT4gcGF0dGVybi50ZXN0KHNwZWNpZmllcikpO1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHsgaWdub3JlRXJyb3JBc3luYyB9IGZyb20gJ0B3aWxsYm9vc3Rlci9zaGFyZWQtbGliL3NyYyc7XG5pbXBvcnQgeWFyZ3MgZnJvbSAneWFyZ3MnO1xuXG5pbXBvcnQgeyBmaXhOZXh0Q29uZmlnSnNvbiB9IGZyb20gJy4vZml4ZXJzL25leHRDb25maWcuanMnO1xuaW1wb3J0IHsgZml4UGxheXdyaWdodENvbmZpZyB9IGZyb20gJy4vZml4ZXJzL3BsYXl3cmlnaHRDb25maWcuanMnO1xuaW1wb3J0IHsgZml4UHJpc21hRW52RmlsZXMgfSBmcm9tICcuL2ZpeGVycy9wcmlzbWEuanMnO1xuaW1wb3J0IHsgZml4VGVzdERpcmVjdG9yaWVzVXBkYXRpbmdQYWNrYWdlSnNvbiB9IGZyb20gJy4vZml4ZXJzL3Rlc3REaXJlY3RvcnkuanMnO1xuaW1wb3J0IHsgZml4VHlwZURlZmluaXRpb25zIH0gZnJvbSAnLi9maXhlcnMvdHlwZURlZmluaXRpb24uanMnO1xuaW1wb3J0IHsgZml4VHlwb3MgfSBmcm9tICcuL2ZpeGVycy90eXBvcy5qcyc7XG5pbXBvcnQgeyBmaXhXYkRiQ29tbWFuZCB9IGZyb20gJy4vZml4ZXJzL3diRGJDb21tYW5kLmpzJztcbmltcG9ydCB7IGdlbmVyYXRlQWdlbnRJbnN0cnVjdGlvbnMgfSBmcm9tICcuL2dlbmVyYXRvcnMvYWdlbnRzLmpzJztcbmltcG9ydCB7IGdlbmVyYXRlQnVuZmlnVG9tbCB9IGZyb20gJy4vZ2VuZXJhdG9ycy9idW5maWcuanMnO1xuaW1wb3J0IHsgZ2VuZXJhdGVEb2NrZXJpZ25vcmUgfSBmcm9tICcuL2dlbmVyYXRvcnMvZG9ja2VyaWdub3JlLmpzJztcbmltcG9ydCB7IGdlbmVyYXRlRWRpdG9yY29uZmlnIH0gZnJvbSAnLi9nZW5lcmF0b3JzL2VkaXRvcmNvbmZpZy5qcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZUdlbWluaUNvbmZpZyB9IGZyb20gJy4vZ2VuZXJhdG9ycy9nZW1pbmlDb25maWcuanMnO1xuaW1wb3J0IHsgcmVtb3ZlR2VtaW5pU2V0dGluZ3MgfSBmcm9tICcuL2dlbmVyYXRvcnMvZ2VtaW5pU2V0dGluZ3MuanMnO1xuaW1wb3J0IHsgZ2VuZXJhdGVHaXRhdHRyaWJ1dGVzIH0gZnJvbSAnLi9nZW5lcmF0b3JzL2dpdGF0dHJpYnV0ZXMuanMnO1xuaW1wb3J0IHsgZ2VuZXJhdGVHaXRpZ25vcmUgfSBmcm9tICcuL2dlbmVyYXRvcnMvZ2l0aWdub3JlLmpzJztcbmltcG9ydCB7IGdlbmVyYXRlSWRlYVNldHRpbmdzIH0gZnJvbSAnLi9nZW5lcmF0b3JzL2lkZWEuanMnO1xuaW1wb3J0IHsgZ2VuZXJhdGVMZWZ0aG9va1VwZGF0aW5nUGFja2FnZUpzb24gfSBmcm9tICcuL2dlbmVyYXRvcnMvbGVmdGhvb2suanMnO1xuaW1wb3J0IHsgZ2VuZXJhdGVMaW50c3RhZ2VkcmMgfSBmcm9tICcuL2dlbmVyYXRvcnMvbGludHN0YWdlZHJjLmpzJztcbmltcG9ydCB7IGdlbmVyYXRlUGFja2FnZUpzb24gfSBmcm9tICcuL2dlbmVyYXRvcnMvcGFja2FnZUpzb24uanMnO1xuaW1wb3J0IHsgZ2VuZXJhdGVPeGZtdENvbmZpZyB9IGZyb20gJy4vZ2VuZXJhdG9ycy9veGZtdENvbmZpZy5qcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZU94bGludENvbmZpZyB9IGZyb20gJy4vZ2VuZXJhdG9ycy9veGxpbnRDb25maWcuanMnO1xuaW1wb3J0IHsgZ2VuZXJhdGVQcmV0dGllcmlnbm9yZSB9IGZyb20gJy4vZ2VuZXJhdG9ycy9wcmV0dGllcmlnbm9yZS5qcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZVB5cmlnaHRDb25maWdKc29uIH0gZnJvbSAnLi9nZW5lcmF0b3JzL3B5cmlnaHRDb25maWcuanMnO1xuaW1wb3J0IHsgZml4UmFpbHdheWlnbm9yZSB9IGZyb20gJy4vZ2VuZXJhdG9ycy9yYWlsd2F5aWdub3JlLmpzJztcbmltcG9ydCB7IGdlbmVyYXRlUmVhZG1lIH0gZnJvbSAnLi9nZW5lcmF0b3JzL3JlYWRtZS5qcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZVJlbGVhc2VyYyB9IGZyb20gJy4vZ2VuZXJhdG9ycy9yZWxlYXNlcmMuanMnO1xuaW1wb3J0IHsgZ2VuZXJhdGVSZW5vdmF0ZUpzb24gfSBmcm9tICcuL2dlbmVyYXRvcnMvcmVub3ZhdGVKc29uLmpzJztcbmltcG9ydCB7IGluc3RhbGxBZ2VudFNraWxscyB9IGZyb20gJy4vZ2VuZXJhdG9ycy9za2lsbHMuanMnO1xuaW1wb3J0IHsgZ2VuZXJhdGVUc2NvbmZpZyB9IGZyb20gJy4vZ2VuZXJhdG9ycy90c2NvbmZpZy5qcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZVZzY29kZVNldHRpbmdzIH0gZnJvbSAnLi9nZW5lcmF0b3JzL3ZzY29kZVNldHRpbmdzLmpzJztcbmltcG9ydCB7IGdlbmVyYXRlV29ya2Zsb3dzLCBpc1JldXNhYmxlV29ya2Zsb3dzUmVwbyB9IGZyb20gJy4vZ2VuZXJhdG9ycy93b3JrZmxvdy5qcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZVlhcm5yY1ltbCB9IGZyb20gJy4vZ2VuZXJhdG9ycy95YXJucmMuanMnO1xuaW1wb3J0IHsgc2V0dXBMYWJlbHMgfSBmcm9tICcuL2dpdGh1Yi9sYWJlbC5qcyc7XG5pbXBvcnQgeyBzZXR1cFNlY3JldHMgfSBmcm9tICcuL2dpdGh1Yi9zZWNyZXQuanMnO1xuaW1wb3J0IHsgc2V0dXBHaXRIdWJTZXR0aW5ncyB9IGZyb20gJy4vZ2l0aHViL3NldHRpbmdzLmpzJztcbmltcG9ydCB7IGdlbmVyYXRlR2l0SHViVGVtcGxhdGVzIH0gZnJvbSAnLi9naXRodWIvdGVtcGxhdGUuanMnO1xuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi9sb2dnZXIuanMnO1xuaW1wb3J0IHsgb3B0aW9ucyB9IGZyb20gJy4vb3B0aW9ucy5qcyc7XG5pbXBvcnQgeyBnZXRQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGFzc2VydFNhZmVEZXBlbmRlbmN5U291cmNlcyB9IGZyb20gJy4vdXRpbHMvZGVwZW5kZW5jeVNvdXJjZVBvbGljeS5qcyc7XG5pbXBvcnQgeyBkb2VzQ29udGFpbkpzT3JUcyB9IGZyb20gJy4vdXRpbHMvcGFja2FnZUNhcGFiaWxpdGllcy5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuaW1wb3J0IHsgc3Bhd25TeW5jLCBzcGF3blN5bmNBbmRSZXR1cm5TdGF0dXMgfSBmcm9tICcuL3V0aWxzL3NwYXduVXRpbC5qcyc7XG5cbmFzeW5jIGZ1bmN0aW9uIG1haW4oKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IGFyZ3YgPSBhd2FpdCB5YXJncyhwcm9jZXNzLmFyZ3Yuc2xpY2UoMikpXG4gICAgLmNvbW1hbmQoJyQwIFtwYXRocy4uXScsICdNYWtlIGEgZ2l2ZW4gcHJvamVjdCBmb2xsb3cgdGhlIFdpbGxCb29zdGVyIHN0YW5kYXJkJywgKHlhcmdzKSA9PiB7XG4gICAgICB5YXJncy5wb3NpdGlvbmFsKCdwYXRocycsIHtcbiAgICAgICAgZGVzY3JpYmU6ICdwcm9qZWN0IHBhdGhzIHRvIGJlIHdiZmllZCcsXG4gICAgICAgIGFycmF5OiB0cnVlLFxuICAgICAgICB0eXBlOiAnc3RyaW5nJyxcbiAgICAgICAgZGVmYXVsdDogWycuJ10sXG4gICAgICB9KTtcbiAgICB9KVxuICAgIC5vcHRpb25zKHtcbiAgICAgIGVudjoge1xuICAgICAgICBkZXNjcmlwdGlvbjogJ1VwbG9hZCBlbnZpcm9ubWVudCB2YXJpYWJsZXMgYXMgc2VjcmV0cyB0byBHaXRIdWInLFxuICAgICAgICB0eXBlOiAnYm9vbGVhbicsXG4gICAgICAgIGRlZmF1bHQ6IGZhbHNlLFxuICAgICAgICBhbGlhczogJ2UnLFxuICAgICAgfSxcbiAgICAgIHNraXBEZXBzOiB7XG4gICAgICAgIGRlc2NyaXB0aW9uOiAnU2tpcCBkZXBlbmRlbmN5IGluc3RhbGxhdGlvbicsXG4gICAgICAgIHR5cGU6ICdib29sZWFuJyxcbiAgICAgICAgZGVmYXVsdDogZmFsc2UsXG4gICAgICAgIGFsaWFzOiAnZCcsXG4gICAgICB9LFxuICAgICAgdmVyYm9zZToge1xuICAgICAgICBkZXNjcmlwdGlvbjogJ1doZXRoZXIgb3Igbm90IHRvIGVuYWJsZSB2ZXJib3NlIG1vZGUnLFxuICAgICAgICB0eXBlOiAnYm9vbGVhbicsXG4gICAgICAgIGRlZmF1bHQ6IGZhbHNlLFxuICAgICAgICBhbGlhczogJ3YnLFxuICAgICAgfSxcbiAgICB9KVxuICAgIC52ZXJzaW9uKGdldFZlcnNpb24oKSlcbiAgICAuc3RyaWN0KCkuYXJndjtcbiAgb3B0aW9ucy5pc1ZlcmJvc2UgPSBhcmd2LnZlcmJvc2U7XG4gIG9wdGlvbnMuZG9lc1VwbG9hZEVudlZhcnMgPSBhcmd2LmVudjtcblxuICBsZXQgaGFzSW52YWxpZFBhY2thZ2VDb25maWcgPSBmYWxzZTtcbiAgZm9yIChjb25zdCByb290RGlyUGF0aCBvZiBhcmd2LnBhdGhzIGFzIHN0cmluZ1tdKSB7XG4gICAgY29uc3QgcGFja2FnZXNEaXJQYXRoID0gcGF0aC5qb2luKHJvb3REaXJQYXRoLCAncGFja2FnZXMnKTtcbiAgICBjb25zdCBkaXJlbnRzID0gKGF3YWl0IGlnbm9yZUVycm9yQXN5bmMoKCkgPT4gZnMucHJvbWlzZXMucmVhZGRpcihwYWNrYWdlc0RpclBhdGgsIHsgd2l0aEZpbGVUeXBlczogdHJ1ZSB9KSkpID8/IFtdO1xuICAgIGNvbnN0IHN1YkRpclBhdGhzID0gZGlyZW50cy5maWx0ZXIoKGQpID0+IGQuaXNEaXJlY3RvcnkoKSkubWFwKChkKSA9PiBwYXRoLmpvaW4ocGFja2FnZXNEaXJQYXRoLCBkLm5hbWUpKTtcblxuICAgIGF3YWl0IGZpeFRlc3REaXJlY3Rvcmllc1VwZGF0aW5nUGFja2FnZUpzb24oW3Jvb3REaXJQYXRoLCAuLi5zdWJEaXJQYXRoc10pO1xuXG4gICAgY29uc3Qgcm9vdENvbmZpZyA9IGF3YWl0IGdldFBhY2thZ2VDb25maWcocm9vdERpclBhdGgpO1xuICAgIGlmIChvcHRpb25zLmlzVmVyYm9zZSkge1xuICAgICAgY29uc29sZS5sb2coJ3Jvb3RDb25maWc6Jywgcm9vdENvbmZpZyk7XG4gICAgfVxuICAgIGlmICghcm9vdENvbmZpZykge1xuICAgICAgY29uc29sZS5lcnJvcihgdGhlcmUgaXMgbm8gdmFsaWQgcGFja2FnZS5qc29uIGluICR7cm9vdERpclBhdGh9YCk7XG4gICAgICBoYXNJbnZhbGlkUGFja2FnZUNvbmZpZyA9IHRydWU7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgY29uc3QgYWJicmV2aWF0aW9uUHJvbWlzZSA9IGZpeFR5cG9zKHJvb3RDb25maWcpO1xuXG4gICAgY29uc3QgbnVsbGFibGVTdWJQYWNrYWdlQ29uZmlncyA9IGF3YWl0IFByb21pc2UuYWxsKFxuICAgICAgc3ViRGlyUGF0aHMubWFwKChzdWJEaXJQYXRoKSA9PiBnZXRQYWNrYWdlQ29uZmlnKHN1YkRpclBhdGgsIHJvb3RDb25maWcpKVxuICAgICk7XG4gICAgY29uc3Qgc3ViUGFja2FnZUNvbmZpZ3MgPSBudWxsYWJsZVN1YlBhY2thZ2VDb25maWdzLmZpbHRlcigoY29uZmlnKSA9PiAhIWNvbmZpZyk7XG4gICAgY29uc3QgYWxsUGFja2FnZUNvbmZpZ3MgPSBbcm9vdENvbmZpZywgLi4uc3ViUGFja2FnZUNvbmZpZ3NdO1xuXG4gICAgaWYgKG9wdGlvbnMuaXNWZXJib3NlKSB7XG4gICAgICBmb3IgKGNvbnN0IGNvbmZpZyBvZiBhbGxQYWNrYWdlQ29uZmlncykge1xuICAgICAgICBjb25zb2xlLmluZm8oY29uZmlnKTtcbiAgICAgIH1cbiAgICB9XG4gICAgYXNzZXJ0U2FmZURlcGVuZGVuY3lTb3VyY2VzKGFsbFBhY2thZ2VDb25maWdzKTtcblxuICAgIC8vIEluc3RhbGwgeWFybiBiZXJyeVxuICAgIGF3YWl0IGdlbmVyYXRlWWFybnJjWW1sKHJvb3RDb25maWcpO1xuICAgIGlmIChyb290Q29uZmlnLmlzQnVuKSB7XG4gICAgICBhd2FpdCBnZW5lcmF0ZUJ1bmZpZ1RvbWwocm9vdENvbmZpZyk7XG4gICAgfVxuXG4gICAgY29uc3Qgc2hvdWxkUnVuV29ya2Zsb3dzID1cbiAgICAgICFpc1JldXNhYmxlV29ya2Zsb3dzUmVwbyhyb290Q29uZmlnLnJlcG9zaXRvcnkpICYmXG4gICAgICAocm9vdENvbmZpZy5yZXBvc2l0b3J5Py5zdGFydHNXaXRoKCdnaXRodWI6V2lsbEJvb3N0ZXIvJykgfHxcbiAgICAgICAgcm9vdENvbmZpZy5yZXBvc2l0b3J5Py5zdGFydHNXaXRoKCdnaXRodWI6V2lsbEJvb3N0ZXJMYWIvJykpO1xuICAgIGF3YWl0IFByb21pc2UuYWxsKFtcbiAgICAgIGZpeFByaXNtYUVudkZpbGVzKHJvb3RDb25maWcpLFxuICAgICAgYWJicmV2aWF0aW9uUHJvbWlzZS50aGVuKCgpID0+IGdlbmVyYXRlUmVhZG1lKHJvb3RDb25maWcpKSxcbiAgICAgIGdlbmVyYXRlQWdlbnRJbnN0cnVjdGlvbnMocm9vdENvbmZpZywgYWxsUGFja2FnZUNvbmZpZ3MpLFxuICAgICAgZ2VuZXJhdGVEb2NrZXJpZ25vcmUocm9vdENvbmZpZyksXG4gICAgICBnZW5lcmF0ZUVkaXRvcmNvbmZpZyhyb290Q29uZmlnKSxcbiAgICAgIGdlbmVyYXRlR2VtaW5pQ29uZmlnKHJvb3RDb25maWcsIGFsbFBhY2thZ2VDb25maWdzKSxcbiAgICAgIHJlbW92ZUdlbWluaVNldHRpbmdzKHJvb3RDb25maWcpLFxuICAgICAgZ2VuZXJhdGVHaXRhdHRyaWJ1dGVzKHJvb3RDb25maWcpLFxuICAgICAgZ2VuZXJhdGVHaXRIdWJUZW1wbGF0ZXMocm9vdENvbmZpZyksXG4gICAgICBnZW5lcmF0ZUlkZWFTZXR0aW5ncyhyb290Q29uZmlnKSxcbiAgICAgIGZpeFJhaWx3YXlpZ25vcmUocm9vdENvbmZpZyksXG4gICAgICBnZW5lcmF0ZVJlbm92YXRlSnNvbihyb290Q29uZmlnKSxcbiAgICAgIGdlbmVyYXRlUmVsZWFzZXJjKHJvb3RDb25maWcpLFxuICAgICAgLi4uKHNob3VsZFJ1bldvcmtmbG93cyA/IFtnZW5lcmF0ZVdvcmtmbG93cyhyb290Q29uZmlnKV0gOiBbXSksXG4gICAgICBzZXR1cExhYmVscyhyb290Q29uZmlnKSxcbiAgICAgIHNldHVwU2VjcmV0cyhyb290Q29uZmlnKSxcbiAgICAgIHNldHVwR2l0SHViU2V0dGluZ3Mocm9vdENvbmZpZyksXG4gICAgICBnZW5lcmF0ZUxlZnRob29rVXBkYXRpbmdQYWNrYWdlSnNvbihyb290Q29uZmlnKSxcbiAgICAgIGdlbmVyYXRlTGludHN0YWdlZHJjKHJvb3RDb25maWcpLFxuICAgIF0pO1xuICAgIGF3YWl0IHByb21pc2VQb29sLnByb21pc2VBbGwoKTtcblxuICAgIGNvbnN0IHByb21pc2VzOiBQcm9taXNlPHZvaWQ+W10gPSBbXTtcbiAgICBmb3IgKGNvbnN0IGNvbmZpZyBvZiBhbGxQYWNrYWdlQ29uZmlncykge1xuICAgICAgaWYgKGNvbmZpZy5kb2VzQ29udGFpblR5cGVTY3JpcHQgfHwgY29uZmlnLmRvZXNDb250YWluVHlwZVNjcmlwdEluUGFja2FnZXMpIHtcbiAgICAgICAgcHJvbWlzZXMucHVzaChmaXhUeXBlRGVmaW5pdGlvbnMoY29uZmlnLCBjb25maWcuaXNSb290ID8gYWxsUGFja2FnZUNvbmZpZ3MgOiBbY29uZmlnXSkpO1xuICAgICAgfVxuICAgICAgaWYgKGNvbmZpZy5kZXBlbmRpbmcucGxheXdyaWdodFRlc3QpIHtcbiAgICAgICAgcHJvbWlzZXMucHVzaChmaXhQbGF5d3JpZ2h0Q29uZmlnKGNvbmZpZykpO1xuICAgICAgfVxuICAgICAgaWYgKGNvbmZpZy5kZXBlbmRpbmcubmV4dCkge1xuICAgICAgICBwcm9taXNlcy5wdXNoKGZpeE5leHRDb25maWdKc29uKGNvbmZpZykpO1xuICAgICAgfVxuICAgICAgYXdhaXQgZ2VuZXJhdGVHaXRpZ25vcmUoY29uZmlnLCByb290Q29uZmlnKTtcbiAgICAgIGF3YWl0IHByb21pc2VQb29sLnByb21pc2VBbGwoKTtcbiAgICAgIGlmICghY29uZmlnLmlzUm9vdCAmJiAhY29uZmlnLmRvZXNDb250YWluUGFja2FnZUpzb24pIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBhd2FpdCBnZW5lcmF0ZVByZXR0aWVyaWdub3JlKGNvbmZpZyk7XG4gICAgICBhd2FpdCBnZW5lcmF0ZVBhY2thZ2VKc29uKGNvbmZpZywgcm9vdENvbmZpZywgYXJndi5za2lwRGVwcyk7XG5cbiAgICAgIHByb21pc2VzLnB1c2goZ2VuZXJhdGVMaW50c3RhZ2VkcmMoY29uZmlnKSk7XG4gICAgICBpZiAoY29uZmlnLmRvZXNDb250YWluVnNjb2RlU2V0dGluZ3NKc29uICYmIGNvbmZpZy5kb2VzQ29udGFpblBhY2thZ2VKc29uKSB7XG4gICAgICAgIHByb21pc2VzLnB1c2goZ2VuZXJhdGVWc2NvZGVTZXR0aW5ncyhjb25maWcpKTtcbiAgICAgIH1cbiAgICAgIGlmIChjb25maWcuZG9lc0NvbnRhaW5UeXBlU2NyaXB0IHx8IGNvbmZpZy5kb2VzQ29udGFpblR5cGVTY3JpcHRJblBhY2thZ2VzKSB7XG4gICAgICAgIHByb21pc2VzLnB1c2goZ2VuZXJhdGVUc2NvbmZpZyhjb25maWcpKTtcbiAgICAgIH1cbiAgICAgIGlmIChkb2VzQ29udGFpbkpzT3JUcyhjb25maWcpKSB7XG4gICAgICAgIHByb21pc2VzLnB1c2goZ2VuZXJhdGVPeGZtdENvbmZpZyhjb25maWcpKTtcbiAgICAgICAgcHJvbWlzZXMucHVzaChnZW5lcmF0ZU94bGludENvbmZpZyhjb25maWcsIHJvb3RDb25maWcpKTtcbiAgICAgIH0gZWxzZSBpZiAoIWNvbmZpZy5pc1Jvb3QgJiYgY29uZmlnLmRvZXNDb250YWluUGFja2FnZUpzb24gJiYgZG9lc0NvbnRhaW5Kc09yVHMocm9vdENvbmZpZykpIHtcbiAgICAgICAgLy8gTW9ub3JlcG8gdmVyaWZpY2F0aW9uIGNhbiBpbnZva2Ugb3hsaW50IGZyb20gZXZlcnkgd29ya3NwYWNlLiBHaXZlXG4gICAgICAgIC8vIG5vbi1jb2RlIHBhY2thZ2VzIGEgbG9jYWwgY29uZmlnIHNvIG94bGludCBkb2VzIG5vdCBjbGltYiB0byB0aGVcbiAgICAgICAgLy8gcm9vdCBjb25maWcgYW5kIHJlamVjdCByb290LW9ubHkgdHlwZS1hd2FyZSBvcHRpb25zIGZyb20gYSBwYWNrYWdlIGN3ZC5cbiAgICAgICAgcHJvbWlzZXMucHVzaChnZW5lcmF0ZU94bGludENvbmZpZyhjb25maWcsIHJvb3RDb25maWcpKTtcbiAgICAgIH1cbiAgICAgIGlmIChjb25maWcuZGVwZW5kaW5nLnB5cmlnaHQpIHtcbiAgICAgICAgcHJvbWlzZXMucHVzaChnZW5lcmF0ZVB5cmlnaHRDb25maWdKc29uKGNvbmZpZykpO1xuICAgICAgfVxuICAgIH1cbiAgICBhd2FpdCBQcm9taXNlLmFsbChwcm9taXNlcyk7XG4gICAgYXdhaXQgcHJvbWlzZVBvb2wucHJvbWlzZUFsbCgpO1xuICAgIGF3YWl0IGZpeFdiRGJDb21tYW5kKHJvb3RDb25maWcpO1xuXG4gICAgY29uc3QgcGFja2FnZU1hbmFnZXIgPSByb290Q29uZmlnLmlzQnVuID8gJ2J1bicgOiAneWFybic7XG4gICAgLy8gUmVmcmVzaCBsb2NrIGZpbGVzXG4gICAgaWYgKHJvb3RDb25maWcuaXNCdW4pIHtcbiAgICAgIGF3YWl0IGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdyZWZyZXNoQnVuTG9jaycsIGFzeW5jICgpID0+IHtcbiAgICAgICAgYXdhaXQgUHJvbWlzZS5yZXNvbHZlKCk7XG4gICAgICAgIHJlZnJlc2hCdW5Mb2NrKHJvb3REaXJQYXRoKTtcbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICBzcGF3blN5bmMocGFja2FnZU1hbmFnZXIsIFsnaW5zdGFsbCcsICctLW5vLWltbXV0YWJsZSddLCByb290RGlyUGF0aCk7XG4gICAgfVxuICAgIHNwYXduU3luYyhwYWNrYWdlTWFuYWdlciwgWydjbGVhbnVwJ10sIHJvb3REaXJQYXRoKTtcblxuICAgIGF3YWl0IGluc3RhbGxBZ2VudFNraWxscyhyb290Q29uZmlnKTtcbiAgfVxuICBpZiAoaGFzSW52YWxpZFBhY2thZ2VDb25maWcpIHtcbiAgICBwcm9jZXNzLmV4aXRDb2RlID0gMTtcbiAgfVxufVxuXG5mdW5jdGlvbiByZWZyZXNoQnVuTG9jayhyb290RGlyUGF0aDogc3RyaW5nKTogdm9pZCB7XG4gIC8vIHdiZnkgc2hvdWxkIHVwZGF0ZSBvbmx5IHRoZSBwYWNrYWdlcyBpdCBleHBsaWNpdGx5IG1hbmFnZXMgdGhyb3VnaCBidW4gYWRkLlxuICAvLyBSdW5uaW5nIGJ1biB1cGRhdGUgaGVyZSByZWZyZXNoZXMgdW5yZWxhdGVkIGFwcGxpY2F0aW9uIGRlcGVuZGVuY2llcyBhbmRcbiAgLy8gY2FuIGNoYW5nZSBwcm9kdWN0IGJlaGF2aW9yLCBzbyBrZWVwIHRoZSBleGlzdGluZyBsb2NrIGFuZCByZWNvbmNpbGUgaXQuXG4gIGNvbnN0IHN0YXR1cyA9IHNwYXduU3luY0FuZFJldHVyblN0YXR1cygnYnVuJywgWydpbnN0YWxsJ10sIHJvb3REaXJQYXRoKTtcbiAgaWYgKHN0YXR1cyAhPT0gMCkge1xuICAgIHRocm93IG5ldyBFcnJvcihgRmFpbGVkIHRvIHJlZnJlc2ggQnVuIGxvY2tmaWxlOiBidW4gaW5zdGFsbCBleGl0ZWQgd2l0aCBzdGF0dXMgJHtzdGF0dXN9YCk7XG4gIH1cbn1cblxuZnVuY3Rpb24gZ2V0VmVyc2lvbigpOiBzdHJpbmcge1xuICBsZXQgcGFja2FnZUpzb25EaXIgPSBwYXRoLmRpcm5hbWUobmV3IFVSTChpbXBvcnQubWV0YS51cmwpLnBhdGhuYW1lKTtcbiAgd2hpbGUgKCFmcy5leGlzdHNTeW5jKHBhdGguam9pbihwYWNrYWdlSnNvbkRpciwgJ3BhY2thZ2UuanNvbicpKSkge1xuICAgIHBhY2thZ2VKc29uRGlyID0gcGF0aC5kaXJuYW1lKHBhY2thZ2VKc29uRGlyKTtcbiAgfVxuICBjb25zdCBwYWNrYWdlSnNvbiA9IEpTT04ucGFyc2UoZnMucmVhZEZpbGVTeW5jKHBhdGguam9pbihwYWNrYWdlSnNvbkRpciwgJ3BhY2thZ2UuanNvbicpLCAndXRmOCcpKSBhcyB7XG4gICAgdmVyc2lvbjogc3RyaW5nO1xuICB9O1xuICByZXR1cm4gcGFja2FnZUpzb24udmVyc2lvbjtcbn1cblxuYXdhaXQgbWFpbigpO1xuIl0sIm5hbWVzIjpbImFzeW5jIiwic2xlZXAiLCJtaWxsaXNlY29uZHMiLCJQcm9taXNlIiwicmVzb2x2ZSIsInNldFRpbWVvdXQiLCJpZ25vcmVFcnJvckFzeW5jIiwiZm4iLCJpZ25vcmVFbm9lbnRBc3luYyIsImVycm9yIiwiY29kZSIsIm9wdGlvbnMiLCJpc1ZlcmJvc2UiLCJkb2VzVXBsb2FkRW52VmFycyIsImxvZ2dlciIsImZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24iLCJuYW1lIiwiZnVuYyIsImNvbnNvbGUiLCJpbmZvIiwiRXJyb3IiLCJzdGFjayIsIlN0cmluZyIsImZzVXRpbCIsInJlYWRGaWxlSWdub3JpbmdFcnJvciIsImZpbGVQYXRoIiwiZnMiLCJwcm9taXNlcyIsInJlYWRGaWxlIiwiZ2VuZXJhdGVGaWxlIiwiY29udGVudCIsIm1rZGlyIiwicGF0aCIsImRpcm5hbWUiLCJyZWN1cnNpdmUiLCJub3JtYWxpemVkQ29udGVudCIsInRyaW0iLCJ3cml0ZUZpbGUiLCJwcm9taXNlUG9vbCIsIlByb21pc2VQb29sIiwiZml4TmV4dENvbmZpZ0pzb24iLCJjb25maWciLCJtYXAiLCJleHQiLCJkaXJQYXRoIiwiZmluZCIsInAiLCJleGlzdHNTeW5jIiwib2xkQ29udGVudCIsIm9iamVjdExpdGVyYWwiLCJzb3VyY2UiLCJ0cyIsImNyZWF0ZVNvdXJjZUZpbGUiLCJTY3JpcHRUYXJnZXQiLCJMYXRlc3QiLCJTY3JpcHRLaW5kIiwiSlMiLCJ2aXNpdCIsIm5vZGUiLCJpc0V4cG9ydEFzc2lnbm1lbnQiLCJpc09iamVjdExpdGVyYWxFeHByZXNzaW9uIiwiZXhwcmVzc2lvbiIsImlzQmluYXJ5RXhwcmVzc2lvbiIsIm9wZXJhdG9yVG9rZW4iLCJraW5kIiwiU3ludGF4S2luZCIsIkVxdWFsc1Rva2VuIiwibGVmdCIsImdldFRleHQiLCJyaWdodCIsImZvckVhY2hDaGlsZCIsImdldE5leHRDb25maWdPYmplY3RMaXRlcmFsIiwicHJvcGVydHlUZXh0cyIsIlNldCIsInByb3BlcnRpZXMiLCJwcm9wZXJ0eSIsImhhcyIsInB1c2giLCJsZW5ndGgiLCJpbnNlcnRpb25Qb2ludCIsImdldEVuZCIsImxhc3RQcm9wZXJ0eSIsImF0IiwiaGFzVHJhaWxpbmdDb21tYSIsInNsaWNlIiwiaW5jbHVkZXMiLCJwcmVmaXgiLCJuZXdDb250ZW50Iiwiam9pbiIsInJ1biIsImRvZXNDb250YWluSnNPclRzIiwiZG9lc0NvbnRhaW5KYXZhU2NyaXB0IiwiZG9lc0NvbnRhaW5KYXZhU2NyaXB0SW5QYWNrYWdlcyIsImRvZXNDb250YWluVHlwZVNjcmlwdCIsImRvZXNDb250YWluVHlwZVNjcmlwdEluUGFja2FnZXMiLCJkb2VzQ29udGFpbkphdmEiLCJkb2VzQ29udGFpbkphdmFJblBhY2thZ2VzIiwiZ2V0UGFja2FnZU1hbmFnZXJDb21tYW5kIiwiaXNCdW4iLCJsaXRlcmFsIiwidmFsdWUiLCJhc09iamVjdCIsImV4dHJhTWVtYmVycyIsInRvUGFyc2VkT2JqZWN0IiwibWVtYmVyT3JkZXIiLCJPYmplY3QiLCJrZXlzIiwia2V5IiwiXyIsImluZGV4IiwiZml4UGxheXdyaWdodENvbmZpZyIsImVudkZpbGVQYXRoIiwiZW52RmlsZU5hbWVzIiwiZW52RmlsZVBhdGhzIiwiY3VycmVudERpclBhdGgiLCJmaWxlTmFtZSIsImdldEVudkZpbGVQYXRocyIsInRlc3QiLCJhc3NlcnROZXh0UHVibGljQmFzZVVybCIsImV4dHJhY3RlZE9iamVjdExpdGVyYWwiLCJUUyIsImZvdW5kIiwiaXNDYWxsRXhwcmVzc2lvbiIsImZpcnN0QXJndW1lbnQiLCJhcmd1bWVudHMiLCJ1bmRlZmluZWQiLCJleHRyYWN0RGVmaW5lQ29uZmlnT2JqZWN0TGl0ZXJhbCIsInBhcnNlZCIsInBhcnNlT2JqZWN0TGl0ZXJhbEV4cHJlc3Npb24iLCJtZXJnZWQiLCJtZXJnZVBhcnNlZE9iamVjdHMiLCJmb3JiaWRPbmx5IiwicmV0cmllcyIsInVzZSIsImJhc2VVUkwiLCJ0cmFjZSIsInNjcmVlbnNob3QiLCJ2aWRlbyIsIndlYlNlcnZlciIsImNvbW1hbmQiLCJnZXRXYlN0YXJ0VGVzdENvbW1hbmQiLCJ1cmwiLCJyZXVzZUV4aXN0aW5nU2VydmVyIiwidGltZW91dCIsInN0ZG91dCIsInN0ZGVyciIsImVudiIsImdyYWNlZnVsU2h1dGRvd24iLCJjcmVhdGVEZWZhdWx0Q29uZmlnIiwib2JqZWN0Iiwic2V0V2ViU2VydmVyQ29tbWFuZCIsIm5ld09iamVjdExpdGVyYWwiLCJzdHJpbmdpZnlWYWx1ZSIsInN0YXJ0IiwiZ2V0U3RhcnQiLCJlbmQiLCJiYXNlIiwib3ZlcnJpZGUiLCJvdmVycmlkZVByb3BlcnR5S2V5cyIsImZpbHRlciIsIm1lbWJlciIsImVudHJpZXMiLCJtZXJnZVBhcnNlZFZhbHVlIiwicGFyc2VFeHByZXNzaW9uIiwicGFyc2VkT2JqZWN0IiwiaXNBcnJheUxpdGVyYWxFeHByZXNzaW9uIiwiZWxlbWVudHMiLCJlbGVtZW50Iiwic29tZSIsImlzU2hvcnRoYW5kUHJvcGVydHlBc3NpZ25tZW50IiwiaXNQcm9wZXJ0eUFzc2lnbm1lbnQiLCJpc0lkZW50aWZpZXIiLCJpc1N0cmluZ0xpdGVyYWwiLCJpbml0aWFsaXplciIsImxldmVsIiwiY2xvc2luZ0luZGVudCIsInJlcGVhdCIsImluZGVudCIsIml0ZW0iLCJzdHJpbmdpZmllZCIsInNwbGl0IiwiZW1pdHRlZFByb3BlcnRpZXMiLCJsYXN0UHJvcGVydHlJbmRleEJ5S2V5IiwiTWFwIiwic2V0IiwiZ2V0TGFzdFByb3BlcnR5SW5kZXhCeUtleSIsImxpbmVzIiwiZmxhdE1hcCIsInN0cmluZ2lmeU9iamVjdE1lbWJlciIsImdldCIsImFkZCIsInN0cmluZ2lmeU9iamVjdFByb3BlcnR5IiwibGluZSIsImdsb2JJZ25vcmUiLCJmaXhQcmlzbWFFbnZGaWxlcyIsInNob3VsZEFkZENvbm5lY3Rpb25MaW1pdCIsImRlcGVuZGluZyIsInByaXNtYSIsImRlcGVuZGVuY2llcyIsInBhY2thZ2VKc29uIiwiZGV2RGVwZW5kZW5jaWVzIiwic2hvdWxkQWRkU3FsaXRlQ29ubmVjdGlvbkxpbWl0IiwiZW52RmlsZXMiLCJmZyIsImdsb2IiLCJkb3QiLCJjd2QiLCJpZ25vcmUiLCJlbnZGaWxlIiwicmVwbGFjZUFsbCIsIm1hdGNoIiwibm9ybWFsaXplU3FsaXRlRGF0YWJhc2VVcmwiLCJxdWVyeVN0YXJ0IiwiaW5kZXhPZiIsInBhdGhQYXJ0IiwicXVlcnlQYXJ0IiwicGFyYW1zIiwiVVJMU2VhcmNoUGFyYW1zIiwiZGVsZXRlIiwibm9ybWFsaXplZFF1ZXJ5IiwidG9TdHJpbmciLCJwcm90b3R5cGUiLCJoYXNPd25Qcm9wZXJ0eSIsImNhbGwiLCJzb3J0T2JqZWN0QnlLZXlOYW1lTGlzdCIsInNvcnRXaXRoIiwic29ydEZuIiwidG90YWwiLCJvYmplY3RLZXlzIiwic29ydCIsIklOREVOVF9SRUdFWCIsIklOREVOVF9UWVBFX1NQQUNFIiwic2hvdWxkSWdub3JlU2luZ2xlU3BhY2UiLCJpZ25vcmVTaW5nbGVTcGFjZXMiLCJpbmRlbnRUeXBlIiwibWFrZUluZGVudHNNYXAiLCJzdHJpbmciLCJpbmRlbnRzIiwicHJldmlvdXNJbmRlbnRUeXBlIiwicHJldmlvdXNTaXplIiwibWF0Y2hlcyIsIndlaWdodCIsImluZGVudERpZmZlcmVuY2UiLCJhYnNvbHV0ZUluZGVudERpZmZlcmVuY2UiLCJNYXRoIiwiYWJzIiwiZW5jb2RlSW5kZW50c0tleSIsImVudHJ5IiwiaW5kZW50QW1vdW50IiwiZGV0ZWN0SW5kZW50IiwiVHlwZUVycm9yIiwic2l6ZSIsImtleU9mTW9zdFVzZWRJbmRlbnQiLCJyZXN1bHQiLCJtYXhVc2VkIiwibWF4V2VpZ2h0IiwidXNlZENvdW50IiwiZ2V0TW9zdFVzZWRLZXkiLCJ0eXBlIiwiYW1vdW50IiwiaW5kZW50c0tleSIsIk51bWJlciIsIm1ha2VJbmRlbnRTdHJpbmciLCJkZXRlY3ROZXdsaW5lR3JhY2VmdWwiLCJuZXdsaW5lcyIsImNybGYiLCJuZXdsaW5lIiwiZGV0ZWN0TmV3bGluZSIsInBpcGUiLCJmbnMiLCJ4IiwiYXJncyIsInJlZHVjZSIsIm9uQXJyYXkiLCJBcnJheSIsImlzQXJyYXkiLCJvblN0cmluZ0FycmF5IiwiZXZlcnkiLCJ1bmlxIiwieHMiLCJzb3J0QXJyYXkiLCJhcnJheSIsInRvU29ydGVkIiwidW5pcUFuZFNvcnRBcnJheSIsIm9uT2JqZWN0IiwiZ2V0UHJvdG90eXBlT2YiLCJTeW1ib2wiLCJ0b1N0cmluZ1RhZyIsIml0ZXJhdG9yIiwiaXNQbGFpbk9iamVjdCIsInNvcnRPYmplY3RCeSIsImNvbXBhcmF0b3IiLCJkZWVwIiwib3ZlciIsImZyb21FbnRyaWVzIiwic29ydE9iamVjdEtleXMiLCJvYmplY3RHcm91cEJ5IiwiZ3JvdXBCeSIsImNhbGxiYWNrIiwiY3JlYXRlIiwic29ydE9iamVjdCIsInNvcnRVUkxPYmplY3QiLCJzb3J0UGVvcGxlT2JqZWN0Iiwic29ydERpcmVjdG9yaWVzIiwib3ZlclByb3BlcnR5IiwiaGFzT3duIiwic29ydEdpdEhvb2tzIiwicGFyc2VOYW1lQW5kVmVyc2lvblJhbmdlIiwic3BlY2lmaWVyIiwibmFtZUFuZFZlcnNpb24iLCJhdE1hdGNoZXMiLCJtYXRjaEFsbCIsInNwbGl0SW5kZXgiLCJwb3AiLCJzdWJzdHJpbmciLCJyYW5nZSIsInNvcnRPYmplY3RCeVNlbXZlciIsImEiLCJiIiwiYU5hbWUiLCJhUmFuZ2UiLCJiTmFtZSIsImJSYW5nZSIsImxvY2FsZUNvbXBhcmUiLCJzZW12ZXJDb21wYXJlIiwic2VtdmVyTWluVmVyc2lvbiIsImdldFBhY2thZ2VOYW1lIiwiaWRlbnQiLCJzdGFydHNXaXRoIiwiY2FjaGUiLCJzaG91bGRTb3J0RGVwZW5kZW5jaWVzTGlrZU5wbSIsInBhY2thZ2VNYW5hZ2VyIiwiZGV2RW5naW5lcyIsInBucG0iLCJlbmdpbmVzIiwibnBtIiwicHJvY2VzcyIsImhhc1lhcm5PclBucG1GaWxlcyIsInNvcnREZXBlbmRlbmNpZXMiLCJzb3J0V29ya3NwYWNlcyIsInNvcnRFc2xpbnRDb25maWciLCJvdmVycmlkZXMiLCJydWxlMSIsInJ1bGUyIiwic29ydFZTQ29kZUJhZGdlT2JqZWN0Iiwic29ydFByZXR0aWVyQ29uZmlnIiwic29ydFZvbHRhIiwic29ydERldkVuZ2luZXMiLCJzb3J0UG5wbUNvbmZpZyIsImRlZmF1bHROcG1TY3JpcHRzIiwiaGFzRGV2RGVwZW5kZW5jeSIsImRlcGVuZGVuY3kiLCJydW5TUmVnRXhwIiwiaGFzU2VxdWVudGlhbFNjcmlwdCIsImZpZWxkIiwidmFsdWVzIiwic2NyaXB0IiwiaXNTZXF1ZW50aWFsU2NyaXB0Iiwic29ydFNjcmlwdE5hbWVzIiwiZ3JvdXBNYXAiLCJpZHgiLCJmcm9tIiwiZ3JvdXBLZXkiLCJjaGlsZHJlbiIsImsiLCJzb3J0U2NyaXB0cyIsInNjcmlwdHMiLCJuYW1lcyIsInByZWZpeGFibGUiLCJvbWl0dGVkIiwicmVwbGFjZSIsInNvcnRDb25kaXRpb25zIiwiY29uZGl0aW9ucyIsImRlZmF1bHRDb25kaXRpb25zIiwicmVzdENvbmRpdGlvbnMiLCJjb25kaXRpb24iLCJzb3J0RXhwb3J0cyIsImV4cG9ydHMiLCJwYXRocyIsImZpZWxkcyIsIm1haW50YWluZXJzIiwiY29udHJpYnV0b3JzIiwicGFja2FnZU5hbWVBIiwicGFja2FnZU5hbWVCIiwiYmFkZ2UiLCJkZWZhdWx0U29ydE9yZGVyIiwib3ZlckZpZWxkcyIsIkJvb2xlYW4iLCJzb3J0UGFja2FnZUpzb24iLCJqc29uSXNoIiwianNvbiIsImVuZENoYXJhY3RlcnMiLCJKU09OIiwicGFyc2UiLCJzdHJpbmdpZnkiLCJlZGl0U3RyaW5nSlNPTiIsInNvcnRPcmRlciIsInByaXZhdGVLZXlzIiwicHVibGljS2V5cyIsImZpeFRlc3REaXJlY3Rvcmllc1VwZGF0aW5nUGFja2FnZUpzb24iLCJwYWNrYWdlRGlyUGF0aHMiLCJhbGwiLCJwYWNrYWdlSnNvblBhdGgiLCJwYWNrYWdlRGlyUGF0aCIsIm5ld1Rlc3REaXJQYXRoIiwib2xkVGVzdERpck5hbWUiLCJvbGRUZXN0RGlyUGF0aCIsIm1vdmVUZXN0RGlyZWN0b3J5IiwiZGlkVXBkYXRlU2NyaXB0Iiwic2NyaXB0TmFtZSIsIm5ld1NjcmlwdCIsInJlbmFtZSIsImRpcmVudHMiLCJyZWFkZGlyIiwid2l0aEZpbGVUeXBlcyIsIm9sZFBhdGgiLCJkaXJlbnQiLCJuZXdQYXRoIiwibmV3UGF0aFN0YXQiLCJzdGF0IiwiaXNEaXJlY3RvcnkiLCJybSIsImZpeFR5cGVEZWZpbml0aW9ucyIsImNvbmZpZ3NJbmNsdWRpbmdDaGlsZHJlbiIsImxpYlR5cGVEaXJQYXRoIiwic3JjVHlwZURpclBhdGgiLCJpc1Jvb3QiLCJkb2VzQ29udGFpblN1YlBhY2thZ2VKc29ucyIsImRpck5hbWUiLCJoYXNUeXBlRGVjbGFyYXRpb25FeHRlbnNpb24iLCJlbmRzV2l0aCIsInBhY2thZ2VOYW1lIiwiaGFzTGlicmFyeSIsImlzRmlsZSIsIm92ZXJ3cml0ZU1lcmdlIiwiZGVzdGluYXRpb25BcnJheSIsInNvdXJjZUFycmF5IiwiY29tYmluZU1lcmdlIiwidGFyZ2V0IiwiZGVzdGluYXRpb24iLCJjbG9uZVVubGVzc090aGVyd2lzZVNwZWNpZmllZCIsImlzTWVyZ2VhYmxlT2JqZWN0IiwibWVyZ2UiLCJzb3J0S2V5cyIsIm9iaiIsImtleUFuZFZhbHVlcyIsImtleTEiLCJrZXkyIiwicHVibGljUmVwb0F1dG9maXhXb3JrZmxvdyIsIm9uIiwicHVsbF9yZXF1ZXN0IiwiYnJhbmNoZXMiLCJwZXJtaXNzaW9ucyIsImNvbnRlbnRzIiwiY29uY3VycmVuY3kiLCJncm91cCIsImpvYnMiLCJhdXRvZml4IiwicHJpdmF0ZVJlcG9BdXRvZml4V29ya2Zsb3ciLCJ1c2VzIiwid29ya2Zsb3dzIiwicmVsZWFzZSIsInB1bGxfcmVxdWVzdF90YXJnZXQiLCJ0eXBlcyIsInN5bmMiLCJnZW5lcmF0ZVdvcmtmbG93cyIsInJvb3RDb25maWciLCJpc1JldXNhYmxlV29ya2Zsb3dzUmVwbyIsInJlcG9zaXRvcnkiLCJ3b3JrZmxvd3NQYXRoIiwic2VtYW50aWNZbWxQYXRoIiwiZm9yY2UiLCJpc09ic29sZXRlR2VuUHJXb3JrZmxvd0ZpbGVOYW1lIiwiZmlsZU5hbWVTZXQiLCJzZW1hbnRpY1JlbGVhc2UiLCJiYXNlbmFtZSIsIndyaXRlV29ya2Zsb3dZYW1sIiwiZGVwbG95UHJvZHVjdGlvbldvcmtmbG93RXhpc3RzIiwid3JpdGVZYW1sIiwiaXNQdWJsaWNSZXBvIiwic3RydWN0dXJlZENsb25lIiwic3RlcHMiLCJ3aXRoIiwiYnVpbGQiLCJhdXRvZml4V29ya2Zsb3ciLCJhdXRvZml4Sm9iIiwiZ2VuZXJhdGVBdXRvZml4V29ya2Zsb3ciLCJuZXdTZXR0aW5ncyIsIm9sZFNldHRpbmdzIiwieWFtbCIsImxvYWQiLCJhcnJheU1lcmdlIiwibW92ZVRvQm90dG9tIiwiYWN0aW9ucyIsInRyaWdnZXJfZGVwbG95X3dvcmtmbG93IiwiaXNSZXVzYWJsZVdvcmtmbG93Iiwiam9iIiwibm9ybWFsaXplSm9iIiwic2NoZWR1bGUiLCJicmFuY2giLCJzeW5jX3BhcmFtc193aXRob3V0X2Rlc3QiLCJ3b3JrZmxvd19kaXNwYXRjaCIsInNlY3JldHMiLCJOUE1fVE9LRU4iLCJHSF9UT0tFTiIsIkZJUkVCQVNFX1RPS0VOIiwiR0NQX1NBX0tFWV9KU09OX0ZPUl9GSVJFQkFTRSIsIkRJU0NPUkRfV0VCSE9PS19VUkwiLCJzZXJ2ZXJfdXJsIiwiZG90X2Vudl9wYXRoIiwiRkxZX0FQSV9UT0tFTiIsImRlcGxveV9jb21tYW5kIiwiZG9lc0NvbnRhaW5Eb2NrZXJmaWxlIiwiY2lfbGFiZWwiLCJnaXRodWJfaG9zdGVkX3J1bm5lciIsIm5ld1NlY3JldHMiLCJ5YW1sVGV4dCIsImR1bXAiLCJsaW5lV2lkdGgiLCJub0NvbXBhdE1vZGUiLCJzdHlsZXMiLCJmaXhUeXBvcyIsInBhY2thZ2VDb25maWciLCJkb2NGaWxlcyIsIm1kRmlsZSIsImZpeFR5cG9zSW5UZXh0IiwicmVwbGFjZVdpdGhDb25maWciLCJ0c0ZpbGVzIiwidHNGaWxlIiwiY29tbWVudCIsInRleHRCYXNlZEZpbGVzIiwiZmlsZSIsInByb21pc2VBbGwiLCJwcm9wTmFtZSIsImJlZm9yZSIsImFmdGVyIiwid2JmeUpzb24iLCJ0eXBvcyIsIm9sZENvbW1hbmQiLCJuZXdDb21tYW5kIiwibWF4VGV4dEZpbGVCeXRlcyIsIm1pZ3JhdGlvblRhcmdldHMiLCJmaXhXYkRiQ29tbWFuZCIsInJlcG9BdXRob3IiLCJyZXBvTmFtZSIsImZpbGVQYXRocyIsImFic29sdXRlIiwib25seUZpbGVzIiwic3RhdHMiLCJidWZmZXIiLCJyZWFkVGV4dEZpbGUiLCJyZXBsYWNlV2JQcmlzbWFDb21tYW5kIiwiZ2VuZXJhdGVBZ2VudEluc3RydWN0aW9ucyIsImFsbENvbmZpZ3MiLCJhZ2VudHNFeHRyYVBhdGgiLCJleHRyYUNvbnRlbnQiLCJ0b29sTmFtZSIsImdlbmVyYXRlQWdlbnRJbnN0cnVjdGlvbiIsImN1cnNvclJ1bGVzUGF0aCIsImN1cnNvclJ1bGVzQ29udGVudCIsImZyb250bWF0dGVyIiwiYm9keSIsImdlbmVyYXRlQ3Vyc29yR2VuZXJhbE1kY0NvbnRlbnQiLCJiYXNlQ29udGVudCIsImRlc2NyaXB0aW9uIiwiaXNXaWxsQm9vc3RlclJlcG8iLCJjb25maWdzIiwicGxheXdyaWdodFRlc3QiLCJnZW5lcmF0ZUFnZW50Q29kaW5nU3R5bGUiLCJoYXNOZXdTZWN0aW9uIiwiYyIsImdlbkkxOG5UcyIsInJlYWN0IiwibmV4dCIsIm1pbmltdW1SZWxlYXNlQWdlRXhjbHVkZXMiLCJnZW5lcmF0ZUJ1bmZpZ1RvbWwiLCJleGlzdGluZ0NvbnRlbnQiLCJyZWFkRmlsZVN5bmMiLCJidW5maWdUb21sIiwicGFyc2VCdW5maWdUb21sIiwiYnVuIiwiZ2VuZXJhdGVSdW5TZWN0aW9uIiwiaW5zdGFsbCIsImV4YWN0IiwidXNlckNvbnRlbnRIZWFkZXIiLCJ1c2VyQ29udGVudEhlYWRlclJlZ2V4Iiwic2VwYXJhdG9yIiwiZGVmYXVsdEhlYWRVc2VyQ29udGVudCIsImRlZmF1bHRUYWlsVXNlckNvbnRlbnQiLCJpZ25vcmVGaWxlVXRpbCIsInNlcGFyYXRvclByZWZpeCIsInJlYWRHaXRpZ25vcmVXaXRob3V0U2VwYXJhdG9ycyIsImxhc3RIZWFkZXJJbmRleCIsImdldEluZGV4T2ZUYWlsVXNlckNvbnRlbnRIZWFkZXIiLCJnZXRIZWFkVXNlckNvbnRlbnQiLCJ0aGlzIiwiZ2V0VGFpbFVzZXJDb250ZW50IiwiaXNCZXJyeVplcm9JbnN0YWxsRW5hYmxlZCIsImxhc3RJbmRleCIsImxhc3RJbmRleE9mIiwiZ2VuZXJhdGVEb2NrZXJpZ25vcmUiLCJleHRlbnNpb25zIiwiY29kZVdpdGgySW5kZW50U2l6ZSIsImNvZGVXaXRoNEluZGVudFNpemUiLCJtYXJrZG93bkxpa2UiLCJveGxpbnQiLCJveGZtdCIsInByZXR0aWVyT25seSIsImdlbmVyYXRlRXh0ZW5zaW9ucyIsImdlbmVyYXRlRWRpdG9yY29uZmlnIiwiZGVmYXVsdENvbmZpZyIsImhhdmVfZnVuIiwiY29kZV9yZXZpZXciLCJkaXNhYmxlIiwiY29tbWVudF9zZXZlcml0eV90aHJlc2hvbGQiLCJtYXhfcmV2aWV3X2NvbW1lbnRzIiwicHVsbF9yZXF1ZXN0X29wZW5lZCIsImhlbHAiLCJzdW1tYXJ5IiwiaWdub3JlX3BhdHRlcm5zIiwiZ2VuZXJhdGVHZW1pbmlDb25maWciLCJjb25maWdGaWxlUGF0aCIsInN0eWxlZ3VpZGVGaWxlUGF0aCIsIm5ld0NvbmZpZyIsIm9sZENvbmZpZyIsInlhbWxDb250ZW50IiwiY29kaW5nUnVsZUV4dHJhQ29udGVudCIsInRyaW1TdGFydCIsInN0eWxlZ3VpZGVDb250ZW50IiwidHJpbUVuZCIsInJlbW92ZUdlbWluaVNldHRpbmdzIiwiZ2VuZXJhdGVHaXRhdHRyaWJ1dGVzIiwiZGVmYXVsdE5hbWVzIiwiZ2VuZXJhdGVHaXRpZ25vcmUiLCJoZWFkVXNlckNvbnRlbnQiLCJ0YWlsVXNlckNvbnRlbnQiLCJkb2VzQ29udGFpbkdlbWZpbGUiLCJkb2VzQ29udGFpbkdvTW9kIiwiZG9lc0NvbnRhaW5QYWNrYWdlSnNvbiIsImRvZXNDb250YWluUG9tWG1sIiwiZG9lc0NvbnRhaW5QdWJzcGVjWWFtbCIsImRvZXNDb250YWluVGVtcGxhdGVZYW1sIiwiZG9lc0NvbnRhaW5Qb2V0cnlMb2NrIiwiZG9lc0NvbnRhaW5VdkxvY2siLCJibGl0eiIsImZpcmViYXNlIiwicmVhY3ROYXRpdmUiLCJzdG9yeWJvb2siLCJsaXRlc3RyZWFtIiwiZ2VuZXJhdGVkIiwicmVhZENhY2hlIiwicmVzcG9uc2UiLCJmZXRjaCIsInJlc3BvbnNlVGV4dCIsInRleHQiLCJvayIsIndyaXRlQ2FjaGUiLCJvcyIsImhvbWVkaXIiLCJEYXRlIiwibm93IiwibXRpbWVNcyIsIm94Zm10UHJvZ3JhbSIsInByZXR0aWVyUHJvZ3JhbSIsImdlbmVyYXRlSWRlYVNldHRpbmdzIiwidGFza09wdGlvbnMiLCJwcm9ncmFtIiwidGFzayIsImNyZWF0ZVRhc2tPcHRpb25zIiwicnVubmVyIiwiZXh0ZW5zaW9uIiwiZ2V0V2F0Y2hlclRhc2tzQ29udGVudCIsImdldEdlbkkxOG5Uc0NvbW1hbmQiLCJzcGF3blN5bmMiLCJyZXRyeSIsInNwYXduU3luY0FuZFJldHVyblN0YXR1cyIsIm5ld0NtZCIsIm5ld0FyZ3MiLCJnZXRTcGF3blN5bmNBcmdzIiwic3RhdHVzIiwiY2hpbGRfcHJvY2VzcyIsInNwYXduU3luY0FuZFJldHVyblN0ZG91dCIsInN0ZGlvIiwicHJvYyIsInMiLCJtZXNzYWdlIiwiUEFUSCIsIkJFUlJZX0JJTl9GT0xERVIiLCJlbmNvZGluZyIsInNoZWxsIiwiZ2l0SHViVXRpbCIsImdldE9yZ0FuZE5hbWUiLCJ1cmxPckZ1bGxOYW1lIiwidXJsV2l0aG91dFByb3RvY29sIiwib2N0b2tpdENhY2hlIiwiZ2V0T2N0b2tpdCIsIm93bmVyIiwiY2FjaGVkIiwib2N0b2tpdCIsIk9jdG9raXQiLCJhdXRoIiwiZ2V0R2l0SHViVG9rZW4iLCJoYXNHaXRIdWJUb2tlbiIsIkdIX0JPVF9QQVRfRk9SX1dJTExCT09TVEVSIiwiZ2V0R2l0SHViQ2xpVG9rZW4iLCJHSF9CT1RfUEFUX0ZPUl9XSUxMQk9PU1RFUkxBQiIsIkdJVEhVQl9UT0tFTiIsImdpdEh1YkNsaVRva2VuIiwiY2hpbGRQcm9jZXNzIiwiZXhlY0ZpbGVTeW5jIiwibWFuYWdlZFRzY29uZmlnQmFzZURlcGVuZGVuY2llcyIsImlzUHVibGlzaGVkV2lsbGJvb3N0ZXJDb25maWdzUGFja2FnZSIsImlzV2lsbEJvb3N0ZXJDb25maWdzIiwicHJpdmF0ZSIsImZpbGVzIiwib3hsaW50RGVwcyIsInR5cGVzY3JpcHRHb0RlcGVuZGVuY3kiLCJ0eXBlc2NyaXB0RGVwZW5kZW5jeSIsIndiRGVwZW5kZW5jeSIsImJ1aWxkVHNEZXBlbmRlbmN5Iiwid2JmeVBhY2thZ2VKc29uIiwiZmlsZVVSTFRvUGF0aCIsInBhcmVudERpclBhdGgiLCJyZWFkV2JmeVBhY2thZ2VKc29uIiwibWFuYWdlZERlcGVuZGVuY3lWZXJzaW9ucyIsInBlZXJEZXBlbmRlbmNpZXMiLCJiYXNlbGluZU1hbmFnZWREZXBlbmRlbmNpZXMiLCJ3aWxsQm9vc3RlckNvbmZpZ3NNYW5hZ2VkRGVwZW5kZW5jaWVzIiwib2Jzb2xldGVMaW50RGVwZW5kZW5jaWVzIiwibWljcm9tYXRjaFBhY2thZ2VOYW1lcyIsIm1pY3JvbWF0Y2hJbXBvcnRQYXR0ZXJuIiwibGF0ZXN0RGVwZW5kZW5jeVZlcnNpb25DYWNoZSIsImRlcGVuZGVuY3lTZWN0aW9uS2V5cyIsImdlbmVyYXRlUGFja2FnZUpzb24iLCJza2lwQWRkaW5nRGVwcyIsImpzb25PYmoiLCJqc29uVGV4dCIsInJlYWRQYWNrYWdlSnNvbiIsImF1dGhvciIsInNlY3Rpb24iLCJnZXREZXBlbmRlbmN5U2VjdGlvbnMiLCJSZWZsZWN0IiwiZGVsZXRlUHJvcGVydHkiLCJyZW1vdmVTZWxmRGVwZW5kZW5jeSIsInZlcnNpb24iLCJpc1dvcmtzcGFjZVByb3RvY29sUmFuZ2UiLCJnZXRMYXRlc3REZXBlbmRlbmN5VmVyc2lvbiIsInJlcGxhY2VXaWxsQm9vc3RlckNvbmZpZ3NXb3Jrc3BhY2VEZXBlbmRlbmN5UmFuZ2VzIiwidHNsaWIiLCJsZXJuYSIsInBpbnN0IiwicHJldHRpZXIiLCJzZWN0aW9ucyIsInJlbW92ZVdpbGxCb29zdGVyQ29uZmlnc01hbmFnZWREZXBlbmRlbmNpZXMiLCJwcmVzZXJ2ZU1pY3JvbWF0Y2giLCJnbG9iU3luYyIsImRvZXNQcm9kdWN0Q29kZUltcG9ydE1pY3JvbWF0Y2giLCJzaG91bGRQcmVzZXJ2ZU1pY3JvbWF0Y2giLCJzaG91bGRQcmVzZXJ2ZUNvbmZpZ1BhY2thZ2VMaW50RGVwZW5kZW5jeSIsInJlbW92ZU9ic29sZXRlTGludERlcGVuZGVuY2llcyIsInJlbW92ZURlcHJlY2F0ZWRTdHVmZiIsInJlbW92ZUxlZ2FjeUluc3RhbGxDb21tYW5kcyIsImdlbmVyYXRlU2NyaXB0cyIsInByZXR0aWZ5IiwiY2F0Y2giLCJvcmlnaW5hbENvbnRlbnQiLCJuZXdMaW5lIiwibCIsImdlbmVyYXRlUHJldHRpZXJTdWZmaXgiLCJub3JtYWxpemVZYXJuV29ya3NwYWNlRm9yZWFjaFNjcmlwdHMiLCJyYWlsd2F5Iiwibm9ybWFsaXplUmFpbHdheUNsaVNjcmlwdCIsInVwZGF0ZVNjcmlwdHMiLCJtb3ZlTWFuYWdlZFRvb2xEZXBlbmRlbmNpZXNUb0RldkRlcGVuZGVuY2llcyIsImRlcGVuZGVuY3lVcGRhdGVzIiwicHl0aG9uRGV2RGVwZW5kZW5jaWVzIiwiaGFzSmF2YSIsImRlcGVuZGVuY3lTZWN0aW9ucyIsInJlbW92ZVByZXR0aWVyQXJ0aWZhY3RzIiwiaHVza3kiLCJwb3N0aW5zdGFsbCIsInBvc3RwdWJsaXNoIiwicHJlcHVibGlzaE9ubHkiLCJwcmVwYWNrIiwicG9zdHBhY2siLCJwcmVwYXJlIiwiYXJ0aWxsZXJ5IiwicGxheXdyaWdodCIsIndvcmtzcGFjZXMiLCJ3b3Jrc3BhY2UiLCJpc1diUGFja2FnZSIsInRzY29uZmlnQmFzZURlcGVuZGVuY2llcyIsImdldFRzY29uZmlnQmFzZURlcGVuZGVuY2llcyIsInVzZWREZXBlbmRlbmNpZXMiLCJ1c2VkRGVwZW5kZW5jeVNldCIsImV4aXN0aW5nVHNjb25maWdCYXNlRGVwZW5kZW5jaWVzIiwiYWJzb2x1dGVGaWxlUGF0aCIsInBhcnNlQ29uZmlnRmlsZVRleHRUb0pzb24iLCJ3YXJuIiwiZm9ybWF0VHNEaWFnbm9zdGljIiwibm9ybWFsaXplVHNjb25maWdFeHRlbmRzIiwiZXh0ZW5kcyIsImdldEV4aXN0aW5nVHNjb25maWdCYXNlRGVwZW5kZW5jaWVzIiwicmVtb3ZlVW51c2VkVHNjb25maWdCYXNlRGVwZW5kZW5jaWVzIiwiamVzdCIsImRlcCIsImFwcGx5UGFja2FnZUpzb25Db252ZW50aW9ucyIsImxpY2Vuc2UiLCJwdWJsaXNoQ29uZmlnIiwiYWNjZXNzIiwiY29uZmlnTWpzUGF0aCIsImNvbmZpZ0R0c1BhdGgiLCJjb25maWdEbXRzQ29udGVudCIsIm5vcm1hbGl6ZVB1Ymxpc2hlZENvbmZpZ1BhY2thZ2VNZXRhZGF0YSIsIm1haW4iLCJyZXNvbHV0aW9ucyIsImxpbnQiLCJkaXJzIiwiZGlyIiwiZm9ybWF0IiwiYXBwZW5kRm9ybWF0Q29kZUNvbW1hbmQiLCJweXRob25QYWNrYWdlTWFuYWdlciIsImdldFB5dGhvblBhY2thZ2VNYW5hZ2VyIiwicHl0aG9uRmlsZXMiLCJkaXJOYW1lU2V0IiwicHl0aG9uRmlsZSIsImZpcnN0Iiwic2Vjb25kIiwiZGlyTmFtZXNTdHIiLCJweXRob25SdW5uZXIiLCJleGlzdGluZ1JlcG9zaXRvcnkiLCJub3JtYWxpemVkUmVwb3NpdG9yeSIsIm5vcm1hbGl6ZVJlcG9zaXRvcnlVcmxGb3JQYWNrYWdlSnNvbiIsImJ1aWxkTm9ybWFsaXplZFJlcG9zaXRvcnlGb3JQYWNrYWdlSnNvbiIsIm5vcm1hbGl6ZWRFeGlzdGluZ1JlcG9zaXRvcnkiLCJmb3JtYXRSZXBvc2l0b3J5Rm9yUGFja2FnZUpzb24iLCJnZW5Db2RlU2NyaXB0Iiwib2xkR2VuQ29kZVNjcmlwdCIsImNoYWtyYSIsImRyaXp6bGUiLCJzaG91bGRHZW5lcmF0ZVdiR2VuQ29kZVNjcmlwdCIsImFkZEdlbkkxOG5Uc1Bvc3RpbnN0YWxsU2NyaXB0Iiwibm9ybWFsaXplUGFja2FnZU1ldGFkYXRhIiwicGFja2FnZUpzb25EZXBlbmRlbmNpZXMiLCJwYWNrYWdlSnNvbkRldkRlcGVuZGVuY2llcyIsImFkZFBhY2thZ2VKc29uRGVwZW5kZW5jaWVzIiwiYWRkRGVwZW5kZW5jeVZlcnNpb25zVG9QYWNrYWdlSnNvbiIsInBhY2thZ2VOYW1lcyIsInByaXZhdGVQYWNrYWdlcyIsInJlcG8iLCJpc1dvcmtzcGFjZVBhY2thZ2UiLCJvdGhlclRhcmdldCIsImNvbW1pdEhhc2giLCJvcmdhbml6YXRpb24iLCJyZWplY3QiLCJnZXRMYXRlc3RDb21taXRIYXNoIiwiZ2V0TGF0ZXN0UHJpdmF0ZVBhY2thZ2VTcGVjaWZpZXIiLCJ1cGRhdGVQcml2YXRlUGFja2FnZXMiLCJyZW1vdmVFbXB0eURlcGVuZGVuY3lTZWN0aW9ucyIsInNlcmlhbGl6ZVBhY2thZ2VKc29uIiwiaW5zdGFsbE5wbURlcGVuZGVuY2llcyIsImluc3RhbGxEZXBlbmRlbmN5VXBkYXRlcyIsInJlbGF0aXZlRmlsZVBhdGgiLCJyZWxhdGl2ZSIsImZvcm1hdFBhY2thZ2VKc29uV2l0aFByb2plY3RGb3JtYXR0ZXIiLCJjb3JlIiwiZm9ybWF0U2NyaXB0Iiwic2NyaXB0UnVubmVyIiwiZGV2IiwiZGVwZW5kZW5jeVNwZWNpZmllcnMiLCJjdXJyZW50VmVyc2lvbiIsImdldERlcGVuZGVuY3lTcGVjaWZpZXIiLCJnZXRJbnN0YWxsRGVwZW5kZW5jeVNwZWNpZmllciIsImRlcGVuZGVuY2llc1RvSW5zdGFsbCIsInNob3VsZFVwZGF0ZUV4aXN0aW5nRGVwZW5kZW5jeSIsInNob3VsZFVwZGF0ZUV4aXN0aW5nTWFuYWdlZERlcGVuZGVuY3kiLCJkaWFnbm9zdGljIiwiZmxhdHRlbkRpYWdub3N0aWNNZXNzYWdlVGV4dCIsIm1lc3NhZ2VUZXh0IiwibWFuYWdlZFZlcnNpb24iLCJnZXRNYW5hZ2VkRGVwZW5kZW5jeVZlcnNpb24iLCJjYWNoZWRWZXJzaW9uIiwiZ2V0RGVwZW5kZW5jeVZlcnNpb25Gcm9tTnBtIiwiZXNsaW50IiwiaXNOZXdlck1hbmFnZWREZXBlbmRlbmN5VmVyc2lvbiIsImxhdGVzdFZlcnNpb24iLCJ2YWxpZExhdGVzdFZlcnNpb24iLCJzZW12ZXIiLCJ2YWxpZCIsInZhbGlkQ3VycmVudFZlcnNpb24iLCJndCIsInJlcG9zaXRvcnlVcmwiLCJtYXRjaGVkIiwiZXhlYyIsIm5vcm1hbGl6ZWRVcmwiLCJvbGRTY3JpcHRzIiwiaGFzVHlwZWNoZWNrIiwiY2xlYW51cCIsInR5cGVjaGVjayIsInZlcmlmeSIsImFwcGx5RGF0YWJhc2VTY3JpcHRzIiwiYXBwbHlNaXNlVGFza1NjcmlwdHMiLCJweXJpZ2h0IiwiaGFzSnNPclRzIiwib2xkVGVzdCIsImdlbmVyYXRlRm9ybWF0U2NyaXB0Iiwid2IiLCJ3YkRiQ29tbWFuZCIsImhhc01pc2VUYXNrIiwiZG9lc01pc2VUYXNrQ2FsbFBhY2thZ2VTY3JpcHQiLCJpc1diZnlNYW5hZ2VkTWlzZUJyaWRnZSIsIm1pc2VUYXNrcyIsIlJlZ0V4cCIsInJhdyIsImNvbW1hbmRzIiwiYmFzZVNldHRpbmdzIiwiZ2xvYl9tYXRjaGVyIiwicHJlQ29tbWl0U2V0dGluZ3MiLCJzdGFnZV9maXhlZCIsImdlbmVyYXRlTGVmdGhvb2tVcGRhdGluZ1BhY2thZ2VKc29uIiwiaHVza3lEaXJQYXRoIiwiaGFzSHVza3lEaXIiLCJzZXR0aW5ncyIsImdldFByZUNvbW1pdEpvYnMiLCJwcmVQdXNoIiwibGludENvbW1hbmQiLCJxdWlldExpbnRDb21tYW5kIiwiZ2V0UHJlUHVzaFNjcmlwdCIsIm1rZGlyU3luYyIsIm1vZGUiLCJwb3N0TWVyZ2VDb21tYW5kIiwicG9zdE1lcmdlQ29tbWFuZHMiLCJoYXNWZXJzaW9uU2V0dGluZ3MiLCJ0b29sc0NoYW5nZWRQYXR0ZXJuIiwiaW5zdGFsbENvbW1hbmQiLCJybU5leHREaXJlY3RvcnkiLCJnZW5JMThuVHNDb21tYW5kIiwiZ2VuZXJhdGVQb3N0TWVyZ2VDb21tYW5kcyIsImdldENsZWFudXBHbG9icyIsImdldENsZWFudXBDb21tYW5kIiwic3VwcG9ydGVkRXh0ZW5zaW9ucyIsImxvY2FsV2JQYWNrYWdlSnNvblBhdGgiLCJoYXNMb2NhbFdiV29ya3NwYWNlIiwiY2FuVXNlV2JGb3JTdGFnZWRGaWxlcyIsIm94bGludFBhdHRlcm4iLCJveGZtdFBhdHRlcm4iLCJwcmV0dGllclBhdHRlcm4iLCJoYXNQeXRob25QYWNrYWdlTWFuYWdlciIsImdldFB5dGhvblJ1bm5lciIsImdlbmVyYXRlTGludHN0YWdlZHJjIiwibm9ybWFsaXplQ29uZmlnQ29udGVudCIsIk1hbmFnZWRDb25maWdCbG9ja3MiLCJjb25zdHJ1Y3RvciIsImJsb2NrTmFtZXMiLCJtYXJrZXJQcmVmaXgiLCJnZXRDb25maWdDb250ZW50IiwiaGFzTWFuYWdlZEJsb2NrcyIsInJlcGxhY2VNYW5hZ2VkQmxvY2tzIiwiZGVzaXJlZENvbnRlbnQiLCJnZXRCbG9jayIsImJsb2NrTmFtZSIsImdldFN0YXJ0TWFya2VyIiwiZ2V0RW5kTWFya2VyIiwicmVwbGFjZW1lbnQiLCJleHRyYWN0TWFuYWdlZEJsb2NrIiwibmV4dENvbnRlbnQiLCJyZXBsYWNlTWFuYWdlZEJsb2NrIiwiZ2V0TWFuYWdlZEJsb2NrUmVnRXhwIiwicGF0dGVybiIsImVzY2FwZVJlZ0V4cCIsIm1hbmFnZWRDb25maWdCbG9ja3MiLCJnZW5lcmF0ZU94Zm10Q29uZmlnIiwibGVnYWN5SnNvbkNvbmZpZ1BhdGgiLCJpc0VzbVBhY2thZ2UiLCJnZW5lcmF0ZU94bGludENvbmZpZyIsIl9yb290Q29uZmlnIiwic2hvdWxkUHJlc2VydmVQdWJsaXNoZWRMaW50ZXJDb25maWciLCJpc1Jvb3RDb25maWciLCJnZXRSZXNvbHZlZENvbmZpZ0NvbnRlbnQiLCJiYXNlQ29uZmlnTmFtZSIsImdlbmVyYXRlUHJldHRpZXJpZ25vcmUiLCJnaXRpZ25vcmVGaWxlUGF0aCIsImdpdGlnbm9yZUNvbnRlbnQiLCJhZGRpdGlvbmFsQ29udGVudCIsInZlbnZQYXRoIiwidmVudiIsImdlbmVyYXRlUHlyaWdodENvbmZpZ0pzb24iLCJmaXhSYWlsd2F5aWdub3JlIiwiZ2VuZXJhdGVSZWFkbWUiLCJpbnNlcnRCYWRnZSIsImZpbGVOYW1lcyIsInJlYWRkaXJTeW5jIiwiYmFkZ2VOYW1lIiwidG9VcHBlckNhc2UiLCJyZW1vdmVHaXRIdWJBY3Rpb25zQmFkZ2UiLCJyZWFkbWUiLCJpIiwiZXNjYXBlZEJhZGdlTmFtZSIsImVzY2FwZWRGaWxlTmFtZSIsImdlbmVyYXRlUmVsZWFzZXJjIiwicGx1Z2lucyIsInBsdWdpbkVudHJ5IiwicGx1Z2luIiwicHJlc2V0Iiwic3VjY2Vzc0NvbW1lbnRDb25kaXRpb24iLCJmYWlsQ29tbWVudENvbmRpdGlvbiIsImxhYmVscyIsInJlbGVhc2VkTGFiZWxzIiwiJHNjaGVtYSIsImdlbmVyYXRlUmVub3ZhdGVKc29uIiwiZ2VuZXJhdGVkRXh0ZW5kcyIsImV4aXN0aW5nRXh0ZW5kcyIsInBhY2thZ2VSdWxlcyIsInJ1bGUiLCJtYXRjaFBhY2thZ2VOYW1lcyIsImVuYWJsZWQiLCJpbnN0YWxsQWdlbnRTa2lsbHMiLCJyb290SnNvbk9iaiIsImNvbXBpbGVyT3B0aW9ucyIsImFsd2F5c1N0cmljdCIsIm5vVW5jaGVja2VkSW5kZXhlZEFjY2VzcyIsImFsbG93U3ludGhldGljRGVmYXVsdEltcG9ydHMiLCJlc01vZHVsZUludGVyb3AiLCJyZXNvbHZlSnNvbk1vZHVsZSIsImltcG9ydEhlbHBlcnMiLCJub0VtaXQiLCJleGNsdWRlIiwiaW5jbHVkZSIsInN1Ykpzb25PYmoiLCJnZW5lcmF0ZVRzY29uZmlnIiwibW9kdWxlUmVzb2x1dGlvbiIsIm5vcm1hbGl6ZU5leHRUc2NvbmZpZ01vZHVsZVNldHRpbmdzIiwiYmFzZVVybCIsImFsaWFzIiwidGFyZ2V0cyIsIm5vcm1hbGl6ZVBhdGhBbGlhc1RhcmdldHMiLCJub3JtYWxpemVOZXh0VHNjb25maWdQYXRoQWxpYXNlcyIsImFkZFNjcmlwdHNJbmNsdWRlRm9yRnJhbWV3b3JrUHJvamVjdCIsImNsZWFudXBMZWdhY3lUc2NvbmZpZ01vZHVsZVNldHRpbmdzIiwiZ2VuZXJhdGVkVHlwZXMiLCJ0eXBlTmFtZXMiLCJ2aXRlc3QiLCJtb2NoYSIsImN5cHJlc3MiLCJnZXRHZW5lcmF0ZWRUeXBlcyIsImdldFRzY29uZmlnRXh0ZW5kcyIsInJvb3REaXIiLCJnZXRSb290RGlyIiwiZG9lc0NvbnRhaW5Kc3hPclRzeCIsImRvZXNDb250YWluSnN4T3JUc3hJblBhY2thZ2VzIiwianN4IiwiYWRkSW5jbHVkZVBhdGgiLCJleGlzdGluZ1R5cGVzIiwiZXhpc3RpbmdFbWl0TWV0YWRhdGEiLCJlbWl0T3B0aW9ucyIsInBpY2tFeGlzdGluZ0VtaXRNZXRhZGF0YSIsIm1lcmdlZEV4dGVuZHMiLCJub3JtYWxpemVFeHRlbmRzIiwidW5pcXVlRXh0ZW5kcyIsIm1lcmdlVHNjb25maWdFeHRlbmRzIiwiZW1pdERlY2xhcmF0aW9uT25seSIsInJld3JpdGVSZWxhdGl2ZUltcG9ydEV4dGVuc2lvbnMiLCJlbnN1cmVUc0V4dGVuc2lvbkVtaXRDb21wYXRpYmlsaXR5IiwibWVyZ2VkVHlwZXMiLCJmaWx0ZXJFeGlzdGluZ1R5cGVzIiwidHlwZU5hbWUiLCJ0eXBlUm9vdHMiLCJleHBlcmltZW50YWxEZWNvcmF0b3JzIiwibW9kdWxlIiwiZGVsZXRlTGVnYWN5TW9kdWxlU2V0dGluZ3MiLCJ0b0xvd2VyQ2FzZSIsInZlcmJhdGltTW9kdWxlU3ludGF4Iiwibm9ybWFsaXplQ29tbW9uSnNUc2NvbmZpZ1NldHRpbmdzIiwiaXNBYnNvbHV0ZSIsImdlbmVyYXRlZFR5cGVTZXQiLCJpc0dlbmVyYXRlZFRlc3RHbG9iYWxUeXBlIiwiZXhjbHVkZUZpbGVQYXR0ZXJucyIsImdlbmVyYXRlVnNjb2RlU2V0dGluZ3MiLCJleGNsdWRlRmlsZVBhdHRlcm4iLCJleGNsdWRlU2V0dGluZyIsImdlbmVyYXRlWWFybnJjWW1sIiwieWFybnJjWW1sUGF0aCIsImdldExhdGVzdFZlcnNpb24iLCJuZXdWZXJzaW9uIiwib2xkVmVyc2lvbiIsInZhbGlkTmV3VmVyc2lvbiIsImlzTmV3ZXJWZXJzaW9uIiwicmVsZWFzZXNQYXRoIiwieWFybnJjUGF0aCIsImRlZmF1bHRTZW12ZXJSYW5nZVByZWZpeCIsImVuYWJsZVNjcmlwdHMiLCJub2RlTGlua2VyIiwibm1Nb2RlIiwibnBtTWluaW1hbEFnZUdhdGUiLCJhcHByb3ZlZEdpdFJlcG9zaXRvcmllcyIsIm5wbVByZWFwcHJvdmVkUGFja2FnZXMiLCJjb21wcmVzc2lvbkxldmVsIiwiaW5qZWN0RW52aXJvbm1lbnRGaWxlcyIsImVuYWJsZUdsb2JhbENhY2hlIiwib3JpZ2luYWxMZW5ndGgiLCJwbHVnaW5QYXRoIiwiZ2V0WWFybnJjUHJldHRpZXJBcmdzIiwic2V0dXBMYWJlbHMiLCJzZXR1cExhYmVsIiwiZGVsZXRlTGFiZWwiLCJjb2xvciIsInJlcXVlc3QiLCJERVBSRUNBVEVEX1NFQ1JFVF9OQU1FUyIsInJlcXVpcmUiLCJjcmVhdGVSZXF1aXJlIiwic2V0dXBTZWNyZXRzIiwiZG90ZW52IiwicXVpZXQiLCJzZWNyZXROYW1lIiwic2VjcmV0X25hbWUiLCJrZXlfaWQiLCJrZXlJZCIsImRhdGEiLCJzb2RpdW0iLCJyZWFkeSIsInNlY3JldCIsInJhd0tleSIsImZyb21fYmFzZTY0IiwiYmFzZTY0X3ZhcmlhbnRzIiwiT1JJR0lOQUwiLCJyYXdTZWMiLCJmcm9tX3N0cmluZyIsImVuY0J5dGVzIiwiY3J5cHRvX2JveF9zZWFsIiwiZW5jQmFzZTY0IiwidG9fYmFzZTY0IiwiZW5jcnlwdGVkX3ZhbHVlIiwic2V0dXBHaXRIdWJTZXR0aW5ncyIsImJlZm9yZVJldHJ5IiwiaGFuZGxlRXJyb3IiLCJyZXRyeUNvdW50IiwicmV0cnlMb2dnZXIiLCJzaG91bGRSZXRyeSIsInNsZWVwTWlsbGlzZWNvbmRzIiwidXBkYXRlU2xlZXBNaWxsaXNlY29uZHMiLCJmYWlsZWRDb3VudCIsIndpdGhSZXRyeSIsImFsbG93X2F1dG9fbWVyZ2UiLCJhbGxvd19tZXJnZV9jb21taXQiLCJhbGxvd19zcXVhc2hfbWVyZ2UiLCJhbGxvd19yZWJhc2VfbWVyZ2UiLCJhbGxvd191cGRhdGVfYnJhbmNoIiwiZGVsZXRlX2JyYW5jaF9vbl9tZXJnZSIsInNxdWFzaF9tZXJnZV9jb21taXRfdGl0bGUiLCJzcXVhc2hfbWVyZ2VfY29tbWl0X21lc3NhZ2UiLCJoZWFkZXJzIiwiaXNHaXRIdWJQZXJtaXNzaW9uT3JWaXNpYmlsaXR5RXJyb3IiLCJwYWNrYWdlTWFuYWdlclJ1blBsYWNlaG9sZGVyIiwidGVtcGxhdGVzIiwiZ2VuZXJhdGVHaXRIdWJUZW1wbGF0ZXMiLCJhcHBseVBhY2thZ2VNYW5hZ2VyVGVtcGxhdGUiLCJkaXN0YW5jZSIsInRlbXBsYXRlIiwicGFja2FnZU1hbmFnZXJDb21tYW5kIiwid2JmeUpzb25TY2hlbWEiLCJ6IiwicmVjb3JkIiwib3B0aW9uYWwiLCJkb2MiLCJnZXRQYWNrYWdlQ29uZmlnIiwiZXNtUGFja2FnZSIsInBhY2thZ2VKc29uVGV4dCIsInJlbGVhc2VCcmFuY2hlcyIsInJlbGVhc2VQbHVnaW5zIiwicmVsZWFzZXJjSnNvblBhdGgiLCJmc3AiLCJmbGF0IiwicmVwb0luZm8iLCJnaXQiLCJzaW1wbGVHaXQiLCJvcmlnaW4iLCJnZXRSZW1vdGVzIiwiciIsInJlbW90ZVVybCIsInJlZnMiLCJyZXF1ZXN0UmVwb0luZm8iLCJmZXRjaFJlcG9JbmZvIiwiY3VycmVudCIsImhhc1ZlcnNpb25TZXR0aW5nc0ZpbGUiLCJkb2NrZXJmaWxlIiwid2JmeUpzb25QYXRoIiwid2JmeUpzb25UZXh0IiwicmVwb0Z1bGxOYW1lIiwiZnVsbF9uYW1lIiwicmVwb1BhcnRzIiwiaXNSZWZlcnJlZEJ5T3RoZXJSZXBvIiwiY29udGFpbnNBbnkiLCJkb2VzQ29udGFpblZzY29kZVNldHRpbmdzSnNvbiIsImdpdGh1YiIsInJlYWRNaXNlVGFza3MiLCJ0YXNrcyIsInBhcnNlVG9tbCIsInJlYWRNaXNlVGFza0NvbW1hbmQiLCJvcmciLCJyZWRpcmVjdGVkRnVsbE5hbWUiLCJsb2NhdGlvbiIsImdldFJlZGlyZWN0ZWRSZXBvRnVsbE5hbWUiLCJhbGxvd2VkR2l0SHViT3JnYW5pemF0aW9uUGF0dGVybiIsImFsbG93ZWRHaXREZXBlbmRlbmN5UGF0dGVybnMiLCJhc3NlcnRTYWZlRGVwZW5kZW5jeVNvdXJjZXMiLCJkaXNhbGxvd2VkU291cmNlcyIsImdldERpc2FsbG93ZWREZXBlbmRlbmN5U291cmNlcyIsImRldGFpbHMiLCJkZXBlbmRlbmN5TmFtZSIsInNlY3Rpb25OYW1lIiwiaXNHaXREZXBlbmRlbmN5U3BlY2lmaWVyIiwiaXNBbGxvd2VkR2l0RGVwZW5kZW5jeVNwZWNpZmllciIsImlzR2l0SHViU2hvcnRoYW5kU3BlY2lmaWVyIiwicmVmcmVzaEJ1bkxvY2siLCJyb290RGlyUGF0aCIsImFyZ3YiLCJ5YXJncyIsInBvc2l0aW9uYWwiLCJkZXNjcmliZSIsImRlZmF1bHQiLCJza2lwRGVwcyIsInZlcmJvc2UiLCJwYWNrYWdlSnNvbkRpciIsIlVSTCIsInBhdGhuYW1lIiwiZ2V0VmVyc2lvbiIsInN0cmljdCIsImhhc0ludmFsaWRQYWNrYWdlQ29uZmlnIiwicGFja2FnZXNEaXJQYXRoIiwic3ViRGlyUGF0aHMiLCJkIiwiYWJicmV2aWF0aW9uUHJvbWlzZSIsInN1YlBhY2thZ2VDb25maWdzIiwic3ViRGlyUGF0aCIsImFsbFBhY2thZ2VDb25maWdzIiwic2hvdWxkUnVuV29ya2Zsb3dzIiwidGhlbiIsImV4aXRDb2RlIl0sIm1hcHBpbmdzIjoib3NCQUFPQSxlQUFlQyxFQUFNQyxHQUMxQixPQUFPLElBQUlDLFFBQVNDLEdBQVlDLFdBQVdELEVBQVNGLEdBQ3RELENDaUNPRixlQUFlTSxFQUFv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QUFrQkMsSUFBZSxHQUMzRDRuQixHQUFZNW5CLEdBQ1pvb0IsR0FBYXBvQixHQUNiMHBCLEdBQW9CMXBCLEdBQ3BCcWMsR0FBb0NyYyxHQUNwQ21lLEdBQXFCbmUsV0FFakI1YSxFQUFZOGUsYUFFbEIsTUFBTXpmLEVBQTRCLEdBQ2xDLElBQUssTUFBTWMsS0FBVXlxQyxHQUNmenFDLEVBQU9vRCx1QkFBeUJwRCxFQUFPcUQsa0NBQ3pDbkUsRUFBU2tELEtBQUt5VixHQUFtQjdYLEVBQVFBLEVBQU9pWSxPQUFTd3lCLEVBQW9CLENBQUN6cUMsS0FFNUVBLEVBQU8ySixVQUFVbVgsZ0JBQ25CNWhCLEVBQVNrRCxLQUFLaUMsRUFBb0JyRSxJQUVoQ0EsRUFBTzJKLFVBQVV5WCxNQUNuQmxpQixFQUFTa0QsS0FBS3JDLEVBQWtCQyxVQUU1QmdsQixHQUFrQmhsQixFQUFReWEsU0FDMUI1YSxFQUFZOGUsY0FDYjNlLEVBQU9pWSxRQUFXalksRUFBT3FsQixnQ0FHeEJzVixHQUF1QjM2QixTQUN2Qm9yQixHQUFvQnByQixFQUFReWEsRUFBWTZ1QixFQUFLSyxVQUVuRHpxQyxFQUFTa0QsS0FBS3cyQixHQUFxQjU0QixJQUMvQkEsRUFBTytuQywrQkFBaUMvbkMsRUFBT3FsQix3QkFDakRubUIsRUFBU2tELEtBQUt3K0IsR0FBdUI1Z0MsS0FFbkNBLEVBQU9vRCx1QkFBeUJwRCxFQUFPcUQsa0NBQ3pDbkUsRUFBU2tELEtBQUt3N0IsR0FBaUI1OUIsSUFFN0JpRCxFQUFrQmpELElBQ3BCZCxFQUFTa0QsS0FBSzgzQixHQUFvQmw2QixJQUNsQ2QsRUFBU2tELEtBQUtpNEIsR0FBcUJyNkIsTUFDekJBLEVBQU9pWSxRQUFValksRUFBT3FsQix3QkFBMEJwaUIsRUFBa0J3WCxJQUk5RXZiLEVBQVNrRCxLQUFLaTRCLEdBQXFCcjZCLElBRWpDQSxFQUFPMkosVUFBVWtzQixTQUNuQjMyQixFQUFTa0QsS0FBSzY0QixHQUEwQmo3QixXQUd0Q3RDLFFBQVE4WSxJQUFJdFgsU0FDWlcsRUFBWThlLG1CQUNaVSxHQUFlNUUsR0FFckIsTUFBTXZJLEVBQWlCdUksRUFBV2hYLE1BQVEsTUFBUSxPQUU5Q2dYLEVBQVdoWCxZQUNQcEYsRUFBT0MsMEJBQTBCLGlCQUFrQmYsZ0JBQ2pERyxRQUFRQyxVQUNkeXJDLEdBQWVDLEtBR2pCN2hCLEdBQVV0VixFQUFnQixDQUFDLFVBQVcsa0JBQW1CbTNCLEdBRTNEN2hCLEdBQVV0VixFQUFnQixDQUFDLFdBQVltM0IsU0FFakN0TSxJQUNSLENBQ0ltTixJQUNGMzNCLFFBQVFxNEIsU0FBVyxFQUV2QixDQXVCTXZhIiwieF9nb29nbGVfaWdub3JlTGlzdCI6WzExLDEyLDEzLDE0LDE1XX0=
|