@willbooster/wbfy 1.6.6 → 1.6.8

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (2) hide show
  1. package/dist/index.js +6 -6
  2. package/package.json +3 -3
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 u,{parse as d}from"smol-toml";import f from"node:os";import m from"node:child_process";import{Octokit as g}from"@octokit/core";import y from"semver";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 x}from"zod";async function k(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 _=new class{isVerbose=!1;doesUploadEnvVars=!1};const S=new class{async functionIgnoringException(e,t){_.isVerbose&&console.info(`--------- ${e} start ---------`);try{await t()}catch(t){console.info(`Error occurred in ${e}: ${t instanceof Error?t.stack:String(t)}}`)}_.isVerbose&&console.info(`---------- ${e} end ----------`)}},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)}},O=new r;async function E(n){return S.functionIgnoringException("fixNextConfigJson",async()=>{const r=["js","mjs","cjs"].map(e=>t.resolve(n.dirPath,`next.config.${e}`)).find(t=>e.existsSync(t));if(!r)return;const s=await e.promises.readFile(r,"utf8"),o=function(e){const t=i.createSourceFile("next.config.js",e,i.ScriptTarget.Latest,!0,i.ScriptKind.JS);let n;const r=e=>{n||(i.isExportAssignment(e)&&i.isObjectLiteralExpression(e.expression)?n=e.expression:i.isBinaryExpression(e)&&e.operatorToken.kind===i.SyntaxKind.EqualsToken&&"module.exports"===e.left.getText(t)&&i.isObjectLiteralExpression(e.right)?n=e.right:i.forEachChild(e,r))};return r(t),n}(s);if(!o)return;const a=[];if(new Set(o.properties.map(e=>e.name?.getText())).has("typescript")||a.push("typescript: { ignoreBuildErrors: true }"),0===a.length)return;const c=o.getEnd()-1,l=o.properties.at(-1),p=!!l&&s.slice(l.getEnd(),c).includes(","),u=o.properties.length>0&&!p?", ":"",d=`${s.slice(0,c)}${u}${a.join(", ")}${s.slice(c)}`;await O.run(()=>P.generateFile(r,d))})}function C(e){return e.doesContainJavaScript||e.doesContainJavaScriptInPackages||e.doesContainTypeScript||e.doesContainTypeScriptInPackages}function A(e){return e.doesContainJava||e.doesContainJavaInPackages}function F(e){return e.isBun?"bun":"yarn"}const B=e=>({kind:"literal",value:e}),I=(e,t=[])=>({kind:"object",value:R(e,t)});function R(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 T(n){const r=t.resolve(n.dirPath,"playwright.config.ts");if(e.existsSync(r))return S.functionIgnoringException("fixPlaywrightConfig",async()=>{await async function(n){for(const i of function(n){const i=[".env",".env.test",".env.example","mise.toml","mise.test.toml"],r=[];for(let s=t.resolve(n);r.push(...i.map(e=>t.resolve(s,e))),!e.existsSync(t.resolve(s,".git"));s=t.dirname(s)){if(t.dirname(s)===s)break}return r}(n))try{const t=await e.promises.readFile(i,"utf8");if(/NEXT_PUBLIC_BASE_URL\s*=/m.test(t))return}catch{}throw new Error("NEXT_PUBLIC_BASE_URL is required for Playwright. Define NEXT_PUBLIC_BASE_URL in the target repo.")}(n.dirPath);const s=await e.promises.readFile(r,"utf8"),o=function(e){const t=i.createSourceFile("playwright.config.ts",e,i.ScriptTarget.Latest,!0,i.ScriptKind.TS);let n;const r=e=>{if(!n){if(i.isCallExpression(e)&&"defineConfig"===e.expression.getText(t)){const t=e.arguments[0];if(t&&i.isObjectLiteralExpression(t))return void(n=t)}i.forEachChild(e,r)}};return r(t),n?{source:t,node:n}:void 0}(s);if(!o)return;const a=J(o.node,o.source);if(!a)return;const c=D((e=>R({forbidOnly:B("!!process.env.CI"),retries:B("process.env.PWDEBUG ? 0 : process.env.CI ? 5 : 1"),use:I({baseURL:B("process.env.NEXT_PUBLIC_BASE_URL"),trace:B("process.env.CI ? 'on-first-retry' : 'retain-on-failure'"),screenshot:B("process.env.CI ? 'only-on-failure' : 'on'"),video:B("process.env.CI ? 'on-first-retry' : 'retain-on-failure'")}),webServer:I({command:B(L(e)),url:B("process.env.NEXT_PUBLIC_BASE_URL"),reuseExistingServer:B("!!process.env.CI"),timeout:B("300_000"),stdout:B("'pipe'"),stderr:B("'pipe'"),env:B("{\n ...process.env,\n PRISMA_USER_CONSENT_FOR_DANGEROUS_AI_ACTION: 'true',\n}"),gracefulShutdown:B("{\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=B(L(t))}(c,n);const l=M({kind:"object",value:c},0),p=o.node.getStart(o.source),u=o.node.getEnd(),d=`${s.slice(0,p)}${l}${s.slice(u)}`;await O.run(()=>P.generateFile(r,d))})}function D(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:D(e.value,t.value)}:t}function L(e){return`'${F(e)} wb start --mode test'`}function N(e,t){if(i.isObjectLiteralExpression(e)){const n=J(e,t);return n?{kind:"object",value:n}:B(e.getText(t))}if(i.isArrayLiteralExpression(e)){const n=e.elements.map(e=>N(e,t));return n.some(e=>void 0===e)?B(e.getText(t)):{kind:"array",value:n}}return B(e.getText(t))}function J(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]=B(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=N(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 M(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=M(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[G(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=M(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 G(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 z=["**/node_modules/**","**/.venv/**","**/test-fixtures/**","**/test/fixtures/**","**/dist/**","**/build/**","**/target/**","**/temp/**","**/tmp/**"];async function q(e){return S.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:z});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 V(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 K=/^(?:( )+|\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(K);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 u=n.get(r);n.set(r,void 0===u?[1,0]:[u[0]+c,u[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)]))),V(i,e)));return n},ue=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}),de=pe(),fe=pe(["type","url"]),me=pe(["name","email","url"]),ge=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)},xe=new Map;function ke(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 xe.has(t)||xe.set(t,e.existsSync("yarn.lock")||e.existsSync(".yarn/")||e.existsSync(".yarnrc.yml")||e.existsSync("pnpm-lock.yaml")||e.existsSync("pnpm-workspace.yaml")),xe.get(t)})())}const je=le((e,t)=>Object.keys(e).length<2?e:ke(t)?V(e,(e,t)=>e.localeCompare(t,"en")):V(e)),$e=ie([pe(["packages","catalog"]),ye("packages",ce),ye("catalog",je)]),_e=ie([pe(["files","excludedFiles","env","parser","parserOptions","settings","plugins","extends","rules","overrides","globals","processor","noInlineConfig","reportUnusedDisableDirectives"]),ye("env",de),ye("globals",de),ye("overrides",re(e=>e.map(_e))),ye("parserOptions",de),ye("rules",pe((e,t)=>e.split("/").length-t.split("/").length||e.localeCompare(t))),ye("settings",de)]),Se=pe(["description","url","href"]),Pe=ie([le(e=>V(e,[...Object.keys(e).filter(e=>"overrides"!==e).sort(),"overrides"])),ye("overrides",re(e=>e.map(ie([de,ye("options",de)]))))]),Oe=pe(["node","npm","yarn"]),Ee=ye("packageManager",pe(["name","version","onFail"])),Ce=ie([pe(["peerDependencyRules","neverBuiltDependencies","onlyBuiltDependencies","onlyBuiltDependenciesFile","allowedDeprecatedVersions","allowNonAppliedPatches","updateConfig","auditConfig","requiredScripts","supportedArchitectures","overrides","patchedDependencies","packageExtensions"],!0),ye("overrides",be)]),Ae=new Set(["install","pack","prepare","publish","restart","shrinkwrap","start","stop","test","uninstall","version"]),Fe=(e,t)=>Object.hasOwn(t,"devDependencies")&&Object.hasOwn(t.devDependencies,e),Be=/(?<=^|[\s&;<>|(])(?:run-s|npm-run-all2? .*(?:--sequential|--serial|-s))(?=$|[\s&;<>|)])/,Ie=e=>{if(!Fe("npm-run-all",e)&&!Fe("npm-run-all2",e))return!1;return["scripts","betterScripts"].flatMap(t=>e[t]?Object.values(e[t]):[]).some(e=>{return(t=e).includes("*")&&Be.test(t);var t})};function Re(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(),...Re(t.filter(t=>t.startsWith(e+":")),e)]}return t.sort()})}const Te=le((e,t)=>{let n=Object.keys(e);const i=new Set;return n=n.map(e=>{const t=e.replace(/^(?:pre|post)/,"");return Ae.has(t)||n.includes(t)?(i.add(t),t):e}),Ie(t)||(n=Re(n)),n=n.flatMap(e=>i.has(e)?[`pre${e}`,e,`post${e}`]:[e]),V(e,n)}),De=e=>{const{defaultConditions:t=[],restConditions:n=[]}=ue(e,e=>"default"===e?"defaultConditions":"restConditions");return[...n,...t]},We=le(e=>{const{paths:t=[],conditions:n=[]}=ue(Object.keys(e),e=>e.startsWith(".")?"paths":"conditions");return Object.fromEntries([...t,...De(n)].map(t=>[t,We(e[t])]))}),Le=[{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:me},{key:"maintainers",over:re(e=>e.map(me))},{key:"contributors",over:re(e=>e.map(me))},{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:de},{key:"man"},{key:"directories",over:ge},{key:"files",over:oe},{key:"workspaces",over:$e},{key:"binary",over:pe(["module_name","module_path","remote_path","package_name","host"])},{key:"scripts",over:Te},{key:"betterScripts",over:Te},{key:"l10n"},{key:"contributes",over:de},{key:"activationEvents",over:oe},{key:"husky",over:ye("hooks",he)},{key:"simple-git-hooks",over:he},{key:"pre-commit"},{key:"commitlint",over:de},{key:"lint-staged"},{key:"nano-staged"},{key:"config",over:de},{key:"nodemonConfig",over:de},{key:"browserify",over:de},{key:"babel",over:de},{key:"browserslist"},{key:"xo",over:de},{key:"prettier",over:Pe},{key:"eslintConfig",over:_e},{key:"eslintIgnore"},{key:"npmpkgjsonlint",over:de},{key:"npmPackageJsonLintConfig",over:de},{key:"npmpackagejsonlint",over:de},{key:"release",over:de},{key:"remarkConfig",over:de},{key:"stylelint"},{key:"ava",over:de},{key:"jest",over:de},{key:"jest-junit",over:de},{key:"jest-stare",over:de},{key:"mocha",over:de},{key:"nyc",over:de},{key:"c8",over:de},{key:"tap",over:de},{key:"oclif",over:pe(void 0,!0)},{key:"resolutions",over:de},{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:de},{key:"engineStrict",over:de},{key:"devEngines",over:Ee},{key:"volta",over:Oe},{key:"languageName"},{key:"os"},{key:"cpu"},{key:"preferGlobal",over:de},{key:"publishConfig",over:de},{key:"icon"},{key:"badges",over:re(e=>e.map(Se))},{key:"galleryBanner",over:de},{key:"preview"},{key:"markdown"},{key:"pnpm",over:Ce}],Ne=Le.map(({key:e})=>e),Je=ie(Le.map(({key:e,over:t})=>t?ye(e,t):void 0).filter(Boolean));function Me(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||Ne;if(Array.isArray(n)){const t=Object.keys(e),{privateKeys:i=[],publicKeys:r=[]}=ue(t,e=>"_"===e[0]?"privateKeys":"publicKeys");n=[...n,...Ne,...r.sort(),...i.sort()]}return Je(V(e,n),e)}))}async function Ue(n){return S.functionIgnoringException("fixTestDirectoriesUpdatingPackageJson",async()=>{await Promise.all(n.map(async n=>{const i=t.join(n,"package.json");if(!e.existsSync(i))return;const r=t.join(n,"test");for(const s of["__tests__","tests"]){const o=t.join(n,s);try{await Ge(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(Me(t),void 0,2))}catch{}}}))})}async function Ge(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 Ge(s,o):await e.promises.rename(s,o)})),await e.promises.rm(n,{recursive:!0})}async function ze(e,n){return S.functionIgnoringException("fixTypeDefinitions",async()=>{const i=t.resolve(e.dirPath,"@types"),r=e.isRoot&&e.doesContainSubPackageJsons?void 0:t.resolve(e.dirPath,"src","types"),o=await $(()=>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 O.run(()=>s.rename(t.join(i,e.name),t.join(i,o,"index.d.ts")))):r&&(await s.mkdir(r,{recursive:!0}),await O.run(()=>s.rename(t.join(i,e.name),t.join(r,e.name)))):e.isDirectory()&&r&&!l&&(await s.mkdir(r,{recursive:!0}),await O.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):Ve(e[r],n)&&Ve(s,n)?i[r]=l(e[r],s,n):e.includes(s)||i.push(s);return i}function Ye(e,t){return Ve(e,t)?t.cloneUnlessOtherwiseSpecified(e,t):e}function Ve(e,t){return!!e&&"object"==typeof e&&t.isMergeableObject(e)}function Ke(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)&&Ke(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 S.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 O.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 O.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 O.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?Ke(t.with):delete t.with,Object.keys(t.secrets).length>0){const e=Ke(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 S.functionIgnoringException("fixTypos",async()=>{if(tt(e.repository))return;const n=e.dirPath,i=await o.glob("**/*.md",{dot:!0,cwd:n,ignore:z});_.isVerbose&&console.info(`Found ${i.length} markdown files in ${n}`);for(const r of i){const i=t.join(n,r);O.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:z});_.isVerbose&&console.info(`Found ${r.length} TypeScript files in ${n}`);for(const i of r){const r=t.join(n,i);O.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:z});_.isVerbose&&console.info(`Found ${s.length} text-based files in ${n}`);for(const i of s){const r=t.join(n,i);O.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 O.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 S.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 O.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 O.run(()=>P.generateFile(s,o))})}function pt(e,t,n,i){const r=F(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${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${ut(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 ut(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 dt=["@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 S.functionIgnoringException("generateBunfigToml",async()=>{const i=t.resolve(n.dirPath,"bunfig.toml"),r=e.existsSync(i)?e.readFileSync(i,"utf8"):void 0,s=mt(r);await O.run(()=>P.generateFile(i,s))})}const mt=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${dt.map(e=>` "${e}",`).join("\n")}\n]\n`};const gt="# Project-specific settings",yt=/# Project-specific settings[^\n]*\n/gm,ht="# Generated by wbfy",wt=`${gt} (head)\n\n\n${ht}\n`,bt=`\n${gt} (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=xt(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,`${gt} (head)\n`):wt},getTailUserContent(e){const t=xt(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 xt(e){const t=e.indexOf(gt),n=e.lastIndexOf(gt);return n>t?n:-1}async function kt(n){return S.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 O.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${St(jt.codeWith2IndentSize)}\nindent_size = 2\nindent_style = space\n\n${St(jt.codeWith4IndentSize)}\nindent_size = 4\nindent_style = space\n\n${St(jt.markdownLike)}\nmax_line_length = off\ntrim_trailing_whitespace = false\n\n[{Makefile,*.mk}]\nindent_style = tab\n`;async function _t(e){return S.functionIgnoringException("generateEditorconfig",async()=>{const n=t.resolve(e.dirPath,".editorconfig");await O.run(()=>P.generateFile(n,$t))})}function St(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 Ot(n,i){return S.functionIgnoringException("generateGeminiConfig",async()=>{if(!n.isRoot)return;const r=t.resolve(n.dirPath,".gemini"),s=t.resolve(r,"config.yml"),o=t.resolve(r,"styleguide.md"),a=t.resolve(n.dirPath,"AGENTS_EXTRA.md");let c=structuredClone(Pt);try{const t=await e.promises.readFile(s,"utf8"),n=p.load(t);c=l.all([c,n,c],{arrayMerge:qe})}catch{}const u=p.dump(c,{lineWidth:-1,noCompatMode:!0,styles:{"!!null":"empty"}}),d=await P.readFileIgnoringError(a),f=d?.trimStart().startsWith("#")?void 0:d,m=`${n.isPublicRepo?"Review in English based on the following coding standards.":"以下のコーディング規約を踏まえて、日本語でレビューしてください。"}\n\n${ut(i)}${f?`\n${f.trimEnd()}`:""}`,g=[O.run(()=>P.generateFile(s,u)),O.run(()=>P.generateFile(o,m))];await Promise.all(g)})}async function Et(n){return S.functionIgnoringException("generateGeminiSettings",async()=>{if(!n.isRoot)return;const i=t.resolve(n.dirPath,".gemini"),r=t.resolve(i,"settings.json");await e.promises.rm(r,{force:!0})})}const Ct=`* 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 At(e){return S.functionIgnoringException("generateGitattributes",async()=>{const n=t.resolve(e.dirPath,".gitattributes");await O.run(()=>P.generateFile(n,Ct))})}const Ft=["windows","macos","linux","jetbrains","visualstudiocode","emacs","vim","yarn"];async function Bt(e,n){return S.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=[...Ft];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 Tt(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 O.run(()=>Rt(e,t)),_.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 O.run(()=>P.generateFile(i,l))})}const It=t.join(f.homedir(),".cache","wbfy","gitignore");async function Rt(n,i){await e.promises.mkdir(It,{recursive:!0}),await e.promises.writeFile(t.join(It,n),i)}async function Tt(n){try{const i=await e.promises.stat(t.join(It,n));if(Date.now()-i.mtimeMs>216e5)return;return await e.promises.readFile(t.join(It,n),"utf8")}catch{}}async function Dt(n){return S.functionIgnoringException("generateIdeaSettings",async()=>{const i=t.resolve(n.dirPath,".idea");if(e.existsSync(i)){const r=t.resolve(i,"watcherTasks.xml");await(C(n)||A(n)?O.run(()=>P.generateFile(r,function(e){return`<?xml version="1.0" encoding="UTF-8"?>\n<project version="4">\n <component name="ProjectTasksOptions">\n${C(e)?jt.oxfmt.map(e=>Wt("node","node_modules/.bin/oxfmt --write --no-error-on-unmatched-pattern !**/package.json","Oxfmt",e)).join(""):""}\n${A(e)?jt.prettierOnly.map(e=>Wt("node","node_modules/.bin/prettier --cache --write","Prettier",e)).join(""):""}\n </component>\n</project>\n`}(n))):O.run(()=>e.promises.rm(r,{force:!0})))}})}function Wt(e,t,n,i){return` <TaskOptions isEnabled="true">\n <option name="arguments" value="${t} $FilePathRelativeToProjectRoot$" />\n <option name="checkSyntaxErrors" value="false" />\n <option name="description" />\n <option name="exitCodeBehavior" value="ERROR" />\n <option name="fileExtension" value="${i}" />\n <option name="immediateSync" value="false" />\n <option name="name" value="${n} (.${i})" />\n <option name="output" value="$FilePathRelativeToProjectRoot$" />\n <option name="outputFilters">\n <array />\n </option>\n <option name="outputFromStdout" value="false" />\n <option name="program" value="${e}" />\n <option name="runOnExternalChanges" value="false" />\n <option name="scopeName" value="Project Files" />\n <option name="trackOnlyRoot" value="false" />\n <option name="workingDir" value="$ProjectFileDir$" />\n <envs />\n </TaskOptions>\n`}function Lt(e,t){if(e.depending.genI18nTs&&t?.["gen-i18n-ts"])return(e.isBun?"bun":"yarn")+" run gen-i18n-ts > /dev/null"}function Nt(e,t,n,i=0){Jt(e,t,n,i)}function Jt(e,t,n,i=0){do{const[r,s,o]=Ut(e,t,n),a=m.spawnSync(r,s,o).status??1;if(0===a)break;if(i<=0)return a}while(--i>=0);return 0}function Mt(e,t,n){const[i,r,s]=Ut(e,t,n);s.stdio="pipe";const o=m.spawnSync(i,r,s),a=o.stderr??"",c="string"==typeof a?a.trim():a.toString().trim();o.error?console.error(`${i} [${r.map(e=>`"${e}"`).join(", ")}] failed with: ${o.error.message}`):c&&console.error(`${i} [${r.map(e=>`"${e}"`).join(", ")}] outputs the following content to stderr:\n${c}`);const l=o.stdout??"";return"string"==typeof l?l.trim():l.toString().trim()}function Ut(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$/,"")??""]}},zt=new Map;function qt(e){const t=e??"",n=zt.get(t);if(n)return n;const i=new g({auth:Yt(e)||void 0});return zt.set(t,i),i}function Ht(e){return!!Yt(e)}function Yt(e){return"WillBooster"===e?process.env.GH_BOT_PAT_FOR_WILLBOOSTER||Kt():"WillBoosterLab"===e?process.env.GH_BOT_PAT_FOR_WILLBOOSTERLAB||Kt():process.env.GH_BOT_PAT_FOR_WILLBOOSTER||process.env.GH_BOT_PAT_FOR_WILLBOOSTERLAB||process.env.GH_TOKEN||process.env.GITHUB_TOKEN||Kt()}let Vt;function Kt(){if(void 0!==Vt)return Vt||void 0;try{Vt=m.execFileSync("gh",["auth","token"],{encoding:"utf8",stdio:["ignore","pipe","ignore"]}).trim()||""}catch{Vt=""}return Vt||void 0}const Xt=["@tsconfig/bun","@tsconfig/node-lts","@tsconfig/node-ts","@tsconfig/react-native"];function Zt(e){return e.isWillBoosterConfigs&&!e.isRoot&&!0!==e.packageJson?.private&&Array.isArray(e.packageJson?.files)&&e.packageJson.files.length>0}const Qt=["@willbooster/oxfmt-config","@willbooster/oxlint-config","oxfmt","oxlint","oxlint-tsgolint"],en="@typescript/native-preview",tn="typescript",nn="@willbooster/wb",rn="build-ts",sn=["@willbooster/prettier-config",...Qt.filter(e=>e.startsWith("@willbooster/"))],on=["@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"],an=new Set(["micromatch","@types/micromatch"]),cn=/\bfrom\s+['"]micromatch['"]|\brequire\(\s*['"]micromatch['"]\s*\)|\bimport\(\s*['"]micromatch['"]\s*\)/u,ln=new Map,pn=["dependencies","devDependencies","optionalDependencies","peerDependencies"];async function un(n,r,s){return S.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 bn(n))Reflect.deleteProperty(e,i)})(n,i),function(e,t){if(!e.isWillBoosterConfigs)return;for(const e of bn(t))for(const[t,n]of Object.entries(e))n&&$n(n)&&(e[t]=vn(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[tn];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 O.run(()=>e.promises.rm(t.resolve(n.dirPath,"lerna.json"),{force:!0})),function(e,t){if(!e.isWillBoosterConfigs)return;const n=bn(t);for(const e of sn)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:z});return i.some(i=>{try{return cn.test(e.readFileSync(t.resolve(n,i),"utf8"))}catch{return!1}})}(n.dirPath)}(i);for(const e of on)r&&an.has(e)||kn(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,...Pn(n,i.scripts)},delete i.scripts["start-test-server"];const r=i.scripts;n.isBun||!A(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)}(n,c),function(e){for(const t of[nn,rn])e.dependencies[t]&&(e.devDependencies[t]??=e.dependencies[t],delete e.dependencies[t])}(c);const u=await async function(n,r,s){const a=[],c=["sort-package-json"],p=[],u=A(n);!u||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"));u?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:z}).length>0),0===s.workspaces.length&&delete s.workspaces)}On(s)||c.push(nn);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[rn]||s.devDependencies[rn]||Object.values(s.scripts).some(e=>e?.includes(rn)))&&c.push(rn);C(n)&&c.push(...Qt);const d=C(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:z});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: ${hn(t.error)}`),new Set(Xt);for(const e of wn(t.config?.extends))for(const t of Xt)(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(Xt)}}return r}(n);for(const e of Xt)if(!a.has(e)&&!c.has(e))for(const t of bn(r))Reflect.deleteProperty(t,e)}(n,s,d),c.push(...d),(n.doesContainTypeScript||n.doesContainTypeScriptInPackages)&&(c.push(en),n.depending.next&&c.push(tn),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(!Zt(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 O.run(()=>P.generateFile(t.resolve(n.dirPath,"config.d.mts"),fn))}(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=dn(r.scripts.format,n))}const i=mn(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:z}),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=dn(r.scripts.format,n),s.pythonDevDependencies.push("black","isort","flake8")}}}(n.repository||r.repository)&&(r.repository=function(e,t){const n=_n(e);if(n)return Sn(n,e,t);const i=_n(t);if(i)return Sn(i,t);return e}(n.repository??r.repository,r.repository));n.depending.blitz?r.scripts["gen-code"]?.startsWith("blitz codegen")?r.scripts["gen-code"].includes("blitz prisma generate")||(r.scripts["gen-code"]=r.scripts["gen-code"].replace("blitz codegen","blitz codegen && blitz prisma generate")):r.scripts["gen-code"]="blitz codegen":n.depending.prisma&&!r.scripts["gen-code"]?.startsWith("prisma generate")&&(r.scripts["gen-code"]="prisma generate");(function(e,t){const n=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,u),function(e,t){const n=e.dependencies,i=e.devDependencies;t.dependencies=yn(n,t.dependencies),t.devDependencies=t.devDependencies.filter(e=>!n[e]),t.devDependencies=yn(i,t.devDependencies)}(c,u),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=Mt("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 pn){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(Me(e),void 0,2)}(c)),s||(function(e,t,n,i){const r=n.dependencies.filter(e=>!t.devDependencies?.[e]);gn(e,i,t.dependencies??{},r,!1);const s=n.devDependencies.filter(e=>!t.dependencies?.[e]);gn(e,i,t.devDependencies??{},s,!0);const o=mn(e);if(o&&n.pythonDevDependencies.length>0){const t=[...new Set(n.pythonDevDependencies)];"poetry"===o?Nt("poetry",["add","--group","dev",...t],e.dirPath):Nt("uv",["add","--dev",...t],e.dirPath)}}(n,c,u,p),function(e,n,i){const r=t.relative(e.dirPath,i);if(!r)return;Nt("bun"===n?"bunx":n,["sort-package-json",r],e.dirPath)}(n,p,a))}(n,r,s)})}function dn(e,t){const n=t.isBun?"bun run":"yarn";return e?`${e} && ${n} format-code`:`${n} format-code`}const fn="export { default } from './config.js';\n";function mn(e){return e.doesContainUvLock?"uv":e.doesContainPoetryLock?"poetry":void 0}function gn(e,t,n,i,r){if(0===i.length)return;const s=[...new Set(i.map(e=>function(e,t,n){if("yarn"===n&&t&&!$n(t))return`${e}@${t}`;return xn(e)}(e,n[e],t)))];Nt(t,["add",...r?["-D"]:[],...e.isBun?["--exact"]:[],...s],e.dirPath)}function yn(e,t){const n=[];for(const i of new Set(t)){const t=jn(i,e[i]);t&&n.push(i),e[i]&&!t&&"*"!==e[i]||(e[i]=vn(i))}return n}function hn(e){return i.flattenDiagnosticMessageText(e.messageText,"\n")}function wn(e){return"string"==typeof e?[e]:Array.isArray(e)?e.filter(e=>"string"==typeof e):[]}function bn(e){return pn.map(t=>e[t]).filter(e=>!!e)}function vn(e){const t=ln.get(e);if(t)return t;const n=function(e){return Mt("npm",["show",xn(e),"version","--workspaces=false"],process.cwd())||"*"}(e);return ln.set(e,n),n}function xn(e){return e===en?`${e}@beta`:e}function kn(e,t,n){return!!Zt(t)&&(!!e.peerDependencies[n]||"@types/eslint"===n&&!!e.peerDependencies.eslint)}function jn(e,t){return!t||("*"===t||(!!$n(t)||("@willbooster/wb"===e||e===rn||Qt.includes(e)||e===en)))}function $n(e){return e.startsWith("workspace:")}function _n(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 Sn(e,t,n){return{..."object"==typeof t?t:"object"==typeof n?n:void 0,type:"git",url:e}}function Pn(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 En(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=C(e),r=A(e),s=t.test;let o={cleanup:"yarn format && yarn lint-fix",format:Bn(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,On(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"),En(e,o,t,["build","dev","start","test","typecheck"]),o}}function On(e){return e?.name===nn}function En(e,t,n,i){for(const r of i)Cn(e,r)&&(An(e,r)||(!n[r]||Fn(n[r],r)||r in t)&&(t[r]=`mise run ${r}`))}function Cn(e,t){return Object.hasOwn(e.miseTasks,t)}function An(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 Fn(e,t){return e===`mise run ${t}`}function Bn(e,t){const n=["sort-package-json"];return e&&n.push("yarn format-code"),t&&n.push("yarn prettify"),n.join(" && ")}const In={glob_matcher:"doublestar","post-merge":{jobs:[{name:"prepare",script:"prepare.sh",runner:"bash"}]},"pre-push":{jobs:[{name:"check",script:"check.sh",runner:"bash"}]}},Rn={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()}]},Tn='\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 Dn(n){return S.functionIgnoringException("generateLefthookUpdatingPackageJson",async()=>{await async function(n){const i=t.resolve(n.dirPath,".lefthook"),r=t.resolve(n.dirPath,".husky"),s=e.existsSync(r),{lint:o}=Pn(n,{}),a={...In,"pre-commit":{jobs:Wn(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})]),Nt("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=`${Tn}\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 Wn(e){return Rn.jobs.map(t=>"cleanup"===t.name?{...t,glob:Ln(e),run:Nn(e)}:t)}function Ln(e){const t=e.isBun||e.depending.wb||A(e)?[...jt.prettierOnly]:[];C(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 Nn(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 d,{parse as u}from"smol-toml";import f from"node:os";import m from"node:child_process";import{Octokit as g}from"@octokit/core";import y from"semver";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 _=new class{isVerbose=!1;doesUploadEnvVars=!1};const S=new class{async functionIgnoringException(e,t){_.isVerbose&&console.info(`--------- ${e} start ---------`);try{await t()}catch(t){console.info(`Error occurred in ${e}: ${t instanceof Error?t.stack:String(t)}}`)}_.isVerbose&&console.info(`---------- ${e} end ----------`)}},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 S.functionIgnoringException("fixNextConfigJson",async()=>{const r=["js","mjs","cjs"].map(e=>t.resolve(n.dirPath,`next.config.${e}`)).find(t=>e.existsSync(t));if(!r)return;const s=await e.promises.readFile(r,"utf8"),o=function(e){const t=i.createSourceFile("next.config.js",e,i.ScriptTarget.Latest,!0,i.ScriptKind.JS);let n;const r=e=>{n||(i.isExportAssignment(e)&&i.isObjectLiteralExpression(e.expression)?n=e.expression:i.isBinaryExpression(e)&&e.operatorToken.kind===i.SyntaxKind.EqualsToken&&"module.exports"===e.left.getText(t)&&i.isObjectLiteralExpression(e.right)?n=e.right:i.forEachChild(e,r))};return r(t),n}(s);if(!o)return;const a=[];if(new Set(o.properties.map(e=>e.name?.getText())).has("typescript")||a.push("typescript: { ignoreBuildErrors: true }"),0===a.length)return;const c=o.getEnd()-1,l=o.properties.at(-1),p=!!l&&s.slice(l.getEnd(),c).includes(","),d=o.properties.length>0&&!p?", ":"",u=`${s.slice(0,c)}${d}${a.join(", ")}${s.slice(c)}`;await 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 S.functionIgnoringException("fixPlaywrightConfig",async()=>{await async function(n){for(const i of function(n){const i=[".env",".env.test",".env.example","mise.toml","mise.test.toml"],r=[];for(let s=t.resolve(n);r.push(...i.map(e=>t.resolve(s,e))),!e.existsSync(t.resolve(s,".git"));s=t.dirname(s)){if(t.dirname(s)===s)break}return r}(n))try{const t=await e.promises.readFile(i,"utf8");if(/NEXT_PUBLIC_BASE_URL\s*=/m.test(t))return}catch{}throw new Error("NEXT_PUBLIC_BASE_URL is required for Playwright. Define NEXT_PUBLIC_BASE_URL in the target repo.")}(n.dirPath);const s=await e.promises.readFile(r,"utf8"),o=function(e){const t=i.createSourceFile("playwright.config.ts",e,i.ScriptTarget.Latest,!0,i.ScriptKind.TS);let n;const r=e=>{if(!n){if(i.isCallExpression(e)&&"defineConfig"===e.expression.getText(t)){const t=e.arguments[0];if(t&&i.isObjectLiteralExpression(t))return void(n=t)}i.forEachChild(e,r)}};return r(t),n?{source:t,node:n}:void 0}(s);if(!o)return;const a=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[G(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 G(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 z=["**/node_modules/**","**/.venv/**","**/test-fixtures/**","**/test/fixtures/**","**/dist/**","**/build/**","**/target/**","**/temp/**","**/tmp/**"];async function q(e){return S.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:z});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 V(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 K=/^(?:( )+|\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(K);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)]))),V(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"]),me=pe(["name","email","url"]),ge=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)?V(e,(e,t)=>e.localeCompare(t,"en")):V(e)),$e=ie([pe(["packages","catalog"]),ye("packages",ce),ye("catalog",je)]),_e=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(_e))),ye("parserOptions",ue),ye("rules",pe((e,t)=>e.split("/").length-t.split("/").length||e.localeCompare(t))),ye("settings",ue)]),Se=pe(["description","url","href"]),Pe=ie([le(e=>V(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]),V(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:me},{key:"maintainers",over:re(e=>e.map(me))},{key:"contributors",over:re(e=>e.map(me))},{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:ge},{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:_e},{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(Se))},{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(V(e,n),e)}))}async function Ue(n){return S.functionIgnoringException("fixTestDirectoriesUpdatingPackageJson",async()=>{await Promise.all(n.map(async n=>{const i=t.join(n,"package.json");if(!e.existsSync(i))return;const r=t.join(n,"test");for(const s of["__tests__","tests"]){const o=t.join(n,s);try{await Ge(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 Ge(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 Ge(s,o):await e.promises.rename(s,o)})),await e.promises.rm(n,{recursive:!0})}async function ze(e,n){return S.functionIgnoringException("fixTypeDefinitions",async()=>{const i=t.resolve(e.dirPath,"@types"),r=e.isRoot&&e.doesContainSubPackageJsons?void 0:t.resolve(e.dirPath,"src","types"),o=await $(()=>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):Ve(e[r],n)&&Ve(s,n)?i[r]=l(e[r],s,n):e.includes(s)||i.push(s);return i}function Ye(e,t){return Ve(e,t)?t.cloneUnlessOtherwiseSpecified(e,t):e}function Ve(e,t){return!!e&&"object"==typeof e&&t.isMergeableObject(e)}function Ke(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)&&Ke(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 S.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?Ke(t.with):delete t.with,Object.keys(t.secrets).length>0){const e=Ke(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 S.functionIgnoringException("fixTypos",async()=>{if(tt(e.repository))return;const n=e.dirPath,i=await o.glob("**/*.md",{dot:!0,cwd:n,ignore:z});_.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:z});_.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:z});_.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 S.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${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 S.functionIgnoringException("generateBunfigToml",async()=>{const i=t.resolve(n.dirPath,"bunfig.toml"),r=e.existsSync(i)?e.readFileSync(i,"utf8"):void 0,s=mt(r);await C.run(()=>P.generateFile(i,s))})}const mt=e=>{const t=function(e){if(!e)return;try{return u(e)}catch{return}}(e);return`env = false\ntelemetry = false\n\n${function(e){return"boolean"==typeof e?.run?.bun?`[run]\nbun = ${e.run.bun}\n`:""}(t)}\n[install]\nexact = ${!1===t?.install?.exact?"false":"true"}\nlinker = "hoisted"\nminimumReleaseAge = 432000 # 5 days\nminimumReleaseAgeExcludes = [\n${ut.map(e=>` "${e}",`).join("\n")}\n]\n`};const gt="# Project-specific settings",yt=/# Project-specific settings[^\n]*\n/gm,ht="# Generated by wbfy",wt=`${gt} (head)\n\n\n${ht}\n`,bt=`\n${gt} (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,`${gt} (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(gt),n=e.lastIndexOf(gt);return n>t?n:-1}async function xt(n){return S.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${St(jt.codeWith2IndentSize)}\nindent_size = 2\nindent_style = space\n\n${St(jt.codeWith4IndentSize)}\nindent_size = 4\nindent_style = space\n\n${St(jt.markdownLike)}\nmax_line_length = off\ntrim_trailing_whitespace = false\n\n[{Makefile,*.mk}]\nindent_style = tab\n`;async function _t(e){return S.functionIgnoringException("generateEditorconfig",async()=>{const n=t.resolve(e.dirPath,".editorconfig");await C.run(()=>P.generateFile(n,$t))})}function St(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 S.functionIgnoringException("generateGeminiConfig",async()=>{if(!n.isRoot)return;const r=t.resolve(n.dirPath,".gemini"),s=t.resolve(r,"config.yml"),o=t.resolve(r,"styleguide.md"),a=t.resolve(n.dirPath,"AGENTS_EXTRA.md");let c=structuredClone(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,m=`${n.isPublicRepo?"Review in English based on the following coding standards.":"以下のコーディング規約を踏まえて、日本語でレビューしてください。"}\n\n${dt(i)}${f?`\n${f.trimEnd()}`:""}`,g=[C.run(()=>P.generateFile(s,d)),C.run(()=>P.generateFile(o,m))];await Promise.all(g)})}async function Et(n){return S.functionIgnoringException("generateGeminiSettings",async()=>{if(!n.isRoot)return;const i=t.resolve(n.dirPath,".gemini"),r=t.resolve(i,"settings.json");await e.promises.rm(r,{force:!0})})}const 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 S.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 S.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)),_.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(f.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{}}async function Tt(n){return S.functionIgnoringException("generateIdeaSettings",async()=>{const i=t.resolve(n.dirPath,".idea");if(e.existsSync(i)){const r=t.resolve(i,"watcherTasks.xml");await(O(n)||B(n)?C.run(()=>P.generateFile(r,function(e){return`<?xml version="1.0" encoding="UTF-8"?>\n<project version="4">\n <component name="ProjectTasksOptions">\n${O(e)?jt.oxfmt.map(e=>Wt("node","node_modules/.bin/oxfmt --write --no-error-on-unmatched-pattern !**/package.json","Oxfmt",e)).join(""):""}\n${B(e)?jt.prettierOnly.map(e=>Wt("node","node_modules/.bin/prettier --cache --write","Prettier",e)).join(""):""}\n </component>\n</project>\n`}(n))):C.run(()=>e.promises.rm(r,{force:!0})))}})}function Wt(e,t,n,i){return` <TaskOptions isEnabled="true">\n <option name="arguments" value="${t} $FilePathRelativeToProjectRoot$" />\n <option name="checkSyntaxErrors" value="false" />\n <option name="description" />\n <option name="exitCodeBehavior" value="ERROR" />\n <option name="fileExtension" value="${i}" />\n <option name="immediateSync" value="false" />\n <option name="name" value="${n} (.${i})" />\n <option name="output" value="$FilePathRelativeToProjectRoot$" />\n <option name="outputFilters">\n <array />\n </option>\n <option name="outputFromStdout" value="false" />\n <option name="program" value="${e}" />\n <option name="runOnExternalChanges" value="false" />\n <option name="scopeName" value="Project Files" />\n <option name="trackOnlyRoot" value="false" />\n <option name="workingDir" value="$ProjectFileDir$" />\n <envs />\n </TaskOptions>\n`}function Nt(e,t){if(e.depending.genI18nTs&&t?.["gen-i18n-ts"])return(e.isBun?"bun":"yarn")+" run gen-i18n-ts > /dev/null"}function Lt(e,t,n,i=0){Mt(e,t,n,i)}function Mt(e,t,n,i=0){do{const[r,s,o]=Ut(e,t,n),a=m.spawnSync(r,s,o).status??1;if(0===a)break;if(i<=0)return a}while(--i>=0);return 0}function Jt(e,t,n){const[i,r,s]=Ut(e,t,n);s.stdio="pipe";const o=m.spawnSync(i,r,s),a=o.stderr??"",c="string"==typeof a?a.trim():a.toString().trim();o.error?console.error(`${i} [${r.map(e=>`"${e}"`).join(", ")}] failed with: ${o.error.message}`):c&&console.error(`${i} [${r.map(e=>`"${e}"`).join(", ")}] outputs the following content to stderr:\n${c}`);const l=o.stdout??"";return"string"==typeof l?l.trim():l.toString().trim()}function Ut(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$/,"")??""]}},zt=new Map;function qt(e){const t=e??"",n=zt.get(t);if(n)return n;const i=new g({auth:Yt(e)||void 0});return zt.set(t,i),i}function Ht(e){return!!Yt(e)}function Yt(e){return"WillBooster"===e?process.env.GH_BOT_PAT_FOR_WILLBOOSTER||Kt():"WillBoosterLab"===e?process.env.GH_BOT_PAT_FOR_WILLBOOSTERLAB||Kt():process.env.GH_BOT_PAT_FOR_WILLBOOSTER||process.env.GH_BOT_PAT_FOR_WILLBOOSTERLAB||process.env.GH_TOKEN||process.env.GITHUB_TOKEN||Kt()}let Vt;function Kt(){if(void 0!==Vt)return Vt||void 0;try{Vt=m.execFileSync("gh",["auth","token"],{encoding:"utf8",stdio:["ignore","pipe","ignore"]}).trim()||""}catch{Vt=""}return Vt||void 0}const Xt=["@tsconfig/bun","@tsconfig/node-lts","@tsconfig/node-ts","@tsconfig/react-native"];function Zt(e){return e.isWillBoosterConfigs&&!e.isRoot&&!0!==e.packageJson?.private&&Array.isArray(e.packageJson?.files)&&e.packageJson.files.length>0}const Qt=["@willbooster/oxfmt-config","@willbooster/oxlint-config","oxfmt","oxlint","oxlint-tsgolint"],en="@typescript/native-preview",tn="typescript",nn="@willbooster/wb",rn="build-ts",sn=["@willbooster/prettier-config",...Qt.filter(e=>e.startsWith("@willbooster/"))],on=["@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"],an=new Set(["micromatch","@types/micromatch"]),cn=/\bfrom\s+['"]micromatch['"]|\brequire\(\s*['"]micromatch['"]\s*\)|\bimport\(\s*['"]micromatch['"]\s*\)/u,ln=new Map,pn=["dependencies","devDependencies","optionalDependencies","peerDependencies"];async function dn(n,r,s){return S.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 bn(n))Reflect.deleteProperty(e,i)})(n,i),function(e,t){if(!e.isWillBoosterConfigs)return;for(const e of bn(t))for(const[t,n]of Object.entries(e))n&&$n(n)&&(e[t]=vn(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[tn];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=bn(t);for(const e of sn)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:z});return i.some(i=>{try{return cn.test(e.readFileSync(t.resolve(n,i),"utf8"))}catch{return!1}})}(n.dirPath)}(i);for(const e of on)r&&an.has(e)||xn(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,...Pn(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)}(n,c),function(e){for(const t of[nn,rn])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:z}).length>0),0===s.workspaces.length&&delete s.workspaces)}Cn(s)||c.push(nn);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[rn]||s.devDependencies[rn]||Object.values(s.scripts).some(e=>e?.includes(rn)))&&c.push(rn);O(n)&&c.push(...Qt);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:z});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: ${hn(t.error)}`),new Set(Xt);for(const e of wn(t.config?.extends))for(const t of Xt)(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(Xt)}}return r}(n);for(const e of Xt)if(!a.has(e)&&!c.has(e))for(const t of bn(r))Reflect.deleteProperty(t,e)}(n,s,u),c.push(...u),(n.doesContainTypeScript||n.doesContainTypeScriptInPackages)&&(c.push(en),n.depending.next&&c.push(tn),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(!Zt(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"),fn))}(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=un(r.scripts.format,n))}const i=mn(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:z}),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=un(r.scripts.format,n),s.pythonDevDependencies.push("black","isort","flake8")}}}(n.repository||r.repository)&&(r.repository=function(e,t){const n=_n(e);if(n)return Sn(n,e,t);const i=_n(t);if(i)return Sn(i,t);return e}(n.repository??r.repository,r.repository));n.depending.blitz?r.scripts["gen-code"]?.startsWith("blitz codegen")?r.scripts["gen-code"].includes("blitz prisma generate")||(r.scripts["gen-code"]=r.scripts["gen-code"].replace("blitz codegen","blitz codegen && blitz prisma generate")):r.scripts["gen-code"]="blitz codegen":n.depending.prisma&&!r.scripts["gen-code"]?.startsWith("prisma generate")&&(r.scripts["gen-code"]="prisma generate");(function(e,t){const n=Nt(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=yn(n,t.dependencies),t.devDependencies=t.devDependencies.filter(e=>!n[e]),t.devDependencies=yn(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=Jt("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 pn){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]);gn(e,i,t.dependencies??{},r,!1);const s=n.devDependencies.filter(e=>!t.dependencies?.[e]);gn(e,i,t.devDependencies??{},s,!0);const o=mn(e);if(o&&n.pythonDevDependencies.length>0){const t=[...new Set(n.pythonDevDependencies)];"poetry"===o?Lt("poetry",["add","--group","dev",...t],e.dirPath):Lt("uv",["add","--dev",...t],e.dirPath)}}(n,c,d,p),function(e,n,i){const r=t.relative(e.dirPath,i);if(!r)return;Lt("bun"===n?"bunx":n,["sort-package-json",r],e.dirPath)}(n,p,a))}(n,r,s)})}function un(e,t){const n=t.isBun?"bun run":"yarn";return e?`${e} && ${n} format-code`:`${n} format-code`}const fn="export { default } from './config.js';\n";function mn(e){return e.doesContainUvLock?"uv":e.doesContainPoetryLock?"poetry":void 0}function gn(e,t,n,i,r){if(0===i.length)return;const s=[...new Set(i.map(e=>function(e,t,n){if("yarn"===n&&t&&!$n(t))return`${e}@${t}`;return kn(e)}(e,n[e],t)))];Lt(t,["add",...r?["-D"]:[],...e.isBun?["--exact"]:[],...s],e.dirPath)}function yn(e,t){const n=[];for(const i of new Set(t)){const t=jn(i,e[i]);t&&n.push(i),e[i]&&!t&&"*"!==e[i]||(e[i]=vn(i))}return n}function hn(e){return i.flattenDiagnosticMessageText(e.messageText,"\n")}function wn(e){return"string"==typeof e?[e]:Array.isArray(e)?e.filter(e=>"string"==typeof e):[]}function bn(e){return pn.map(t=>e[t]).filter(e=>!!e)}function vn(e){const t=ln.get(e);if(t)return t;const n=function(e){return Jt("npm",["show",kn(e),"version","--workspaces=false"],process.cwd())||"*"}(e);return ln.set(e,n),n}function kn(e){return e===en?`${e}@beta`:e}function xn(e,t,n){return!!Zt(t)&&(!!e.peerDependencies[n]||"@types/eslint"===n&&!!e.peerDependencies.eslint)}function jn(e,t){return!t||("*"===t||(!!$n(t)||("@willbooster/wb"===e||e===rn||Qt.includes(e)||e===en)))}function $n(e){return e.startsWith("workspace:")}function _n(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 Sn(e,t,n){return{..."object"==typeof t?t:"object"==typeof n?n:void 0,type:"git",url:e}}function Pn(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 En(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:Fn(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,Cn(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"),En(e,o,t,["build","dev","start","test","typecheck"]),o}}function Cn(e){return e?.name===nn}function En(e,t,n,i){for(const r of i)On(e,r)&&(Bn(e,r)||(!n[r]||An(n[r],r)||r in t)&&(t[r]=`mise run ${r}`))}function On(e,t){return Object.hasOwn(e.miseTasks,t)}function Bn(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 An(e,t){return e===`mise run ${t}`}function Fn(e,t){const n=["sort-package-json"];return e&&n.push("yarn format-code"),t&&n.push("yarn prettify"),n.join(" && ")}const Rn={glob_matcher:"doublestar","post-merge":{jobs:[{name:"prepare",script:"prepare.sh",runner:"bash"}]},"pre-push":{jobs:[{name:"check",script:"check.sh",runner:"bash"}]}},In={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()}]},Dn='\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 Tn(n){return S.functionIgnoringException("generateLefthookUpdatingPackageJson",async()=>{await async function(n){const i=t.resolve(n.dirPath,".lefthook"),r=t.resolve(n.dirPath,".husky"),s=e.existsSync(r),{lint:o}=Pn(n,{}),a={...Rn,"pre-commit":{jobs:Wn(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})]),Lt("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=`${Dn}\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=Nt(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 Wn(e){return In.jobs.map(t=>"cleanup"===t.name?{...t,glob:Nn(e),run:Ln(e)}:t)}function Nn(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 Ln(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=C(n)||A(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=jt.oxlint.map(e=>String.raw`\.${e}$`).join("|"),s=jt.oxfmt.map(e=>String.raw`\.${e}$`).join("|"),o=jt.prettierOnly.map(e=>String.raw`\.${e}$`).join("|"),a=C(n),c=A(n);return String.raw`
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=jt.oxlint.map(e=>String.raw`\.${e}$`).join("|"),s=jt.oxfmt.map(e=>String.raw`\.${e}$`).join("|"),o=jt.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
- ${Jn(n)?String.raw`python_files="$(printf '%s\n' {staged_files} | grep -E '\.py$' || true)"`:""}
10
+ ${Mn(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
- ${Jn(n)?`if [ -n "$python_files" ]; then\n ${Mn(n)} isort --profile black --filter-files $python_files\n ${Mn(n)} black $python_files\n ${Mn(n)} flake8 $python_files\nfi`:""}
29
+ ${Mn(n)?`if [ -n "$python_files" ]; then\n ${Jn(n)} isort --profile black --filter-files $python_files\n ${Jn(n)} black $python_files\n ${Jn(n)} flake8 $python_files\nfi`:""}
30
30
  ${n.doesContainPubspecYaml?'if [ -n "$dart_files" ]; then\n dart format $dart_files\nfi':""}
31
- `.trim()}function Jn(e){return e.doesContainPoetryLock||e.doesContainUvLock}function Mn(e){return e.doesContainUvLock?"uv run":"poetry run"}async function Un(t){return S.functionIgnoringException("generateLintstagedrc",async()=>{await Promise.all([O.run(()=>e.promises.rm(`${t.dirPath}/.lintstagedrc.cjs`,{force:!0})),O.run(()=>e.promises.rm(`${t.dirPath}/.lintstagedrc.js`,{force:!0})),O.run(()=>e.promises.rm(`${t.dirPath}/.lintstagedrc.json`,{force:!0}))])})}function Gn(e){return e?.trim()}async function zn(n){return S.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=function(e){return function(e){return e.isEsmPackage?`import config from '${e.packageName}';\n\nexport default config;\n`:`// oxlint-disable unicorn/prefer-module -- Tool config files are auto-discovered as .ts, and CommonJS avoids Node typeless ESM warnings.\nconst toolConfig = require('${e.packageName}');\n\nmodule.exports = toolConfig.default ?? toolConfig;\n`}({isEsmPackage:e.isEsmPackage,packageName:"@willbooster/oxfmt-config"})}(n),a=[O.run(()=>e.promises.rm(i,{force:!0}))];Gn(s)!==Gn(o)&&a.push(O.run(()=>P.generateFile(r,o))),await Promise.all(a)})}async function qn(n,i){return S.functionIgnoringException("generateOxlintConfig",async()=>{const i=Zt(n),r=t.resolve(n.dirPath,"oxlint.config.ts"),s=await P.readFileIgnoringError(r),o=i&&s?s:function(e,t,n){const i=function(e){if(!e.isEsmPackage)return`${Kn("base","// oxlint-disable unicorn/prefer-module -- Oxlint only auto-discovers .ts config files, and CommonJS avoids Node typeless ESM warnings.\nconst oxlintBaseConfig = require('@willbooster/oxlint-config');\n\nconst config = oxlintBaseConfig.default ?? oxlintBaseConfig;")}\n\n${Kn("export","module.exports = config;")}\n`;return`${Kn("base","import config from '@willbooster/oxlint-config';")}\n\n${Kn("export","export default config;")}\n`}(e);return t&&function(e){return e.includes(Xn("base"))||e.includes(Xn("export"))}(t)?function(e,t,n){let i=e;for(const r of["base","export"]){const s=Hn(t,r);if(!s)continue;const o=Yn(i,r,s);if(!o)return console.warn(`Skipped updating incomplete ${r} block in oxlint config: ${n}`),e;i=o}return i}(t,i,n):i}(n,s,r),a=[];i||a.push(O.run(()=>e.promises.rm(t.resolve(n.dirPath,".oxlintrc.json"),{force:!0})),O.run(()=>e.promises.rm(t.resolve(n.dirPath,"biome.json"),{force:!0})),O.run(()=>e.promises.rm(t.resolve(n.dirPath,"biome.jsonc"),{force:!0})),O.run(()=>e.promises.rm(t.resolve(n.dirPath,".eslintrc"),{force:!0})),O.run(()=>e.promises.rm(t.resolve(n.dirPath,".eslintrc.cjs"),{force:!0})),O.run(()=>e.promises.rm(t.resolve(n.dirPath,".eslintrc.js"),{force:!0})),O.run(()=>e.promises.rm(t.resolve(n.dirPath,".eslintrc.json"),{force:!0})),O.run(()=>e.promises.rm(t.resolve(n.dirPath,".eslintrc.yaml"),{force:!0})),O.run(()=>e.promises.rm(t.resolve(n.dirPath,".eslintrc.yml"),{force:!0})),O.run(()=>e.promises.rm(t.resolve(n.dirPath,"eslint.config.cjs"),{force:!0})),O.run(()=>e.promises.rm(t.resolve(n.dirPath,"eslint.config.js"),{force:!0})),O.run(()=>e.promises.rm(t.resolve(n.dirPath,"eslint.config.mjs"),{force:!0})),O.run(()=>e.promises.rm(t.resolve(n.dirPath,"eslint.config.ts"),{force:!0}))),Gn(s)!==Gn(o)&&a.push(O.run(()=>P.generateFile(r,o))),await Promise.all(a)})}function Hn(e,t){return Vn(t).exec(e)?.[0]}function Yn(e,t,n){const i=Vn(t);if(i.test(e))return e.replace(i,n)}function Vn(e){return new RegExp(`${Qn(Xn(e))}[\\s\\S]*?${Qn(Zn(e))}`)}function Kn(e,t){return`${Xn(e)}\n${t}\n${Zn(e)}`}function Xn(e){return`// wbfy:start oxlint-${e}`}function Zn(e){return`// wbfy:end oxlint-${e}`}function Qn(e){return e.replaceAll(/[.*+?^${}()|[\]\\]/g,String.raw`\$&`)}async function ei(n){return S.functionIgnoringException("generatePrettierignore",async()=>{const i=t.resolve(n.dirPath,".prettierignore");if(!A(n))return void await O.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 O.run(()=>P.generateFile(i,p))})}const ti={venvPath:".",venv:".venv"};async function ni(n){return S.functionIgnoringException("generatePyrightConfigJson",async()=>{let i=structuredClone(ti);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 O.run(()=>P.generateFile(r,s))})}async function ii(n){return S.functionIgnoringException("generateReadme",async()=>{const i=t.resolve(n.dirPath,"README.md");let r=await e.promises.readFile(i,"utf8");e.existsSync(t.resolve(n.dirPath,".releaserc.json"))&&(r=ri(r,"[![semantic-release](https://img.shields.io/badge/%20%20%F0%9F%93%A6%F0%9F%9A%80-semantic--release-e10079.svg)](https://github.com/semantic-release/semantic-release)"));const 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=`[![${o}](https://github.com/${s}/actions/workflows/${i}/badge.svg)](https://github.com/${s}/actions/workflows/${i})`;e.existsSync(t.resolve(n.dirPath,`.github/workflows/${i}`))&&(r=si(r,o,i),r=ri(r,a))}await O.run(()=>P.generateFile(i,r))})}function ri(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 si(e,t,n){const i=oi(t),r=oi(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 oi(e){return e.replaceAll(/[.*+?^${}()|[\]\\]/g,String.raw`\$&`)}async function ai(n){return S.functionIgnoringException("generateReleaserc",async()=>{const i=t.resolve(n.dirPath,".releaserc.json");if(!e.existsSync(i))return;const r=JSON.parse(await e.promises.readFile(i,"utf8")),s=r.plugins??[];for(let e=0;e<s.length;e++){const t=s[e],n=Array.isArray(t),i=n?t[0]:t,r=n&&t[1]||{};"@semantic-release/commit-analyzer"===i?s[e]=["@semantic-release/commit-analyzer",l.all([r,{preset:"conventionalcommits"}],{arrayMerge: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 O.run(()=>P.generateFile(i,o))})}const ci={$schema:"https://docs.renovatebot.com/renovate-schema.json",extends:["github>WillBooster/willbooster-configs:renovate.json5"]};async function li(n){return S.functionIgnoringException("generateRenovateJson",async()=>{let i=structuredClone(ci);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=i.extends.filter(e=>"@willbooster"!==e)}catch{}n.depending.blitz&&(i.packageRules??=[],i.packageRules.some(e=>e.matchPackageNames?.includes("next"))||i.packageRules.push({matchPackageNames:["next"],enabled:!1})),await O.run(()=>e.promises.rm(t.resolve(n.dirPath,".dependabot"),{force:!0})),await O.run(()=>e.promises.rm(t.resolve(n.dirPath,".renovaterc.json"),{force:!0}));const s=JSON.stringify(i,void 0,2);await O.run(()=>P.generateFile(r,s))})}async function pi(e){return S.functionIgnoringException("installAgentSkills",async()=>{await Promise.all([s.rm(t.resolve(e.dirPath,".agents"),{force:!0,recursive:!0}),s.rm(t.resolve(e.dirPath,".claude"),{force:!0,recursive:!0}),s.rm(t.resolve(e.dirPath,"skills-lock.json"),{force:!0})])})}const ui={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/**/*"]},di={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 fi(n){return S.functionIgnoringException("generateTsconfig",async()=>{if(n.depending.blitz||n.depending.next)return void await async function(n){const i=t.resolve(n.dirPath,"tsconfig.json");try{const t=JSON.parse(await e.promises.readFile(i,"utf8"));!function(e){if(!e)return;"node"!==e.moduleResolution&&"Node"!==e.moduleResolution&&"node10"!==e.moduleResolution&&void 0!==e.moduleResolution||(e.moduleResolution="bundler")}(t.compilerOptions),function(e){if(!e)return;if(delete e.baseUrl,!e.paths)return;for(const[t,n]of Object.entries(e.paths))e.paths[t]=mi(n)}(t.compilerOptions),await O.run(()=>P.generateFile(i,JSON.stringify(t,void 0,2)))}catch{}}(n);let i=structuredClone(n.isRoot?ui:di);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=[...gi(e),...gi(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([...yi(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;Ke(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 O.run(()=>P.generateFile(s,a))})}function mi(e){return e.map(e=>e.startsWith("./")||e.startsWith("../")||t.isAbsolute(e)?e:`./${e}`)}function gi(e){return e?Array.isArray(e)?e:[e]:[]}function yi(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 hi=["**/.git/objects/**","**/.git/subtree-cache/**","**/node_modules/**","**/tmp/**","**/temp/**","**/dist/**"];async function wi(n){return S.functionIgnoringException("generateVscodeSettings",async()=>{try{const i=t.resolve(n.dirPath,".vscode","settings.json"),r=await e.promises.readFile(i,"utf8");let s=JSON.parse(r);for(const e of hi)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"],Ke(s);const o=JSON.stringify(s,void 0,2);await O.run(()=>P.generateFile(i,o))}catch{}})}function bi(e){return{"files.watcherExclude":{[e]:!0}}}async function vi(n){return S.functionIgnoringException("generateYarnrcYml",async()=>{const i=t.resolve(n.dirPath,".yarnrc.yml");if(n.isBun)return await O.run(()=>e.promises.rm(i,{force:!0})),await O.run(()=>e.promises.rm(t.resolve(n.dirPath,".yarn"),{force:!0,recursive:!0})),void await O.run(()=>e.promises.rm(t.resolve(n.dirPath,"yarn.lock"),{force:!0,recursive:!0}));const r=Mt("yarn",["--version"],n.dirPath),s=function(e,t){return Mt("npm",["show",e,"version"],t)||"0.0.0"}("@yarnpkg/cli",n.dirPath);(function(e,t){const n=y.valid(e);return!!n&&y.gt(n,y.valid(t)??"0.0.0")})(s,r)&&Nt("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 O.run(()=>e.promises.rm(t.join(o,n)));const a=t.resolve(n.dirPath,".yarnrc");await O.run(()=>e.promises.rm(a,{force:!0}));let c={};try{c=p.load(await e.promises.readFile(i,"utf8"))??c}catch{}c.defaultSemverRangePrefix="",c.nodeLinker="node-modules",c.nmMode="hardlinks-global",c.npmMinimalAgeGate="5d",c.approvedGitRepositories=["https://github.com/WillBoosterLab/*.git","ssh://git@github.com/WillBoosterLab/*.git"],c.npmPreapprovedPackages=["@exercode/*","@willbooster/*","agent-runtime-kit","at-decorators","build-ts","gen-i18n-ts","one-way-git-sync","next","@next/*","@typescript/*","@oxfmt/*","@oxlint/*","@oxlint-tsgolint/*","oxfmt","oxlint","oxlint-tsgolint","react","react-dom"],delete c.compressionLevel,0===c.injectEnvironmentFiles?.length&&delete c.injectEnvironmentFiles,c.enableGlobalCache=!0;const l=c.plugins?.length??0;if(c.plugins=c.plugins?.filter(e=>".yarn/plugins/undefined.cjs"!==e.path)??[],c.plugins.length!==l){const i=t.resolve(n.dirPath,".yarn","plugins","undefined.cjs");await O.run(()=>e.promises.rm(i,{force:!0}))}0===c.plugins.length&&delete c.plugins,await e.promises.writeFile(i,p.dump(c,{lineWidth:-1})),Nt("yarn",["dlx","yarn-plugin-auto-install"],n.dirPath),Nt("yarn",function(e,n){return["dlx","prettier","--no-config","--write",t.relative(e,n)]}(n.dirPath,i),n.dirPath)})}async function xi(e){return S.functionIgnoringException("setupLabels",async()=>{const[t,n]=Gt.getOrgAndName(e.repository??"");if(!t||!n)return;if("WillBooster"!==t&&"WillBoosterLab"!==t)return;if(!Ht(t))return;const i=qt(t);try{await ki(i,t,n,"d1: x-easy :hedgehog:","EDE9FE"),await ki(i,t,n,"d2: easy :rabbit2:","DDD6FE"),await ki(i,t,n,"d3: medium :ox:","C4B5FD"),await ki(i,t,n,"d4: hard :squid:","A78BFA"),await ki(i,t,n,"d5: x-hard :whale2:","8B5CF6"),await ki(i,t,n,"p1: critical :fire::fire::fire:","EF4444"),await ki(i,t,n,"p2: urgent :fire::fire:","F87171"),await ki(i,t,n,"p3: important :fire:","FCA5A5"),await ki(i,t,n,"p4: nice to have :droplet:","FECACA"),await ki(i,t,n,"r: blitz","5300bc"),await ki(i,t,n,"r: firebase","ffca28"),await ki(i,t,n,"r: prisma","0c344b"),await ki(i,t,n,"r: react","61dafb"),await ki(i,t,n,"r: svelte","ff3e00"),await ki(i,t,n,"r: semantic-release","494949"),await ki(i,t,n,"ready :rocket:","22C55E"),await ki(i,t,n,"review requested :mag:","FBCA04"),await ki(i,t,n,"released :bookmark:","6366F1"),await ki(i,t,n,"s: 0.5h :clock1230:","F3F4F6"),await ki(i,t,n,"s: 1h :clock1:","E5E7EB"),await ki(i,t,n,"s: 2h :clock2:","D1D5DB"),await ki(i,t,n,"s: 3h :clock3:","9CA3AF"),await ki(i,t,n,"s: 5h :clock5:","6B7280"),await ki(i,t,n,"s: 8h :clock8:","4B5563"),await ki(i,t,n,"s: 13h :clock1:","374151"),await ki(i,t,n,"t: build :hammer:","BFDBFE"),await ki(i,t,n,"t: chore :broom:","BFDBFE"),await ki(i,t,n,"t: ci :construction_worker:","BFDBFE"),await ki(i,t,n,"t: docs :memo:","BFDBFE"),await ki(i,t,n,"t: feat :sparkles:","BFDBFE"),await ki(i,t,n,"t: fix :bug:","BFDBFE"),await ki(i,t,n,"t: perf :zap:","BFDBFE"),await ki(i,t,n,"t: refactor :recycle:","BFDBFE"),await ki(i,t,n,"t: style :lipstick:","BFDBFE"),await ki(i,t,n,"t: test :test_tube:","BFDBFE"),await ki(i,t,n,"project","24292F"),await ki(i,t,n,"focused :dart:","22C55E"),await ji(i,t,n,"bug"),await ji(i,t,n,"documentation"),await ji(i,t,n,"duplicate"),await ji(i,t,n,"enhancement"),await ji(i,t,n,"good first issue"),await ji(i,t,n,"help wanted"),await ji(i,t,n,"invalid"),await ji(i,t,n,"question"),await ji(i,t,n,"wontfix"),await ji(i,t,n,"ready"),await ji(i,t,n,"review requested"),await ji(i,t,n,"released"),await ji(i,t,n,"semantic-release"),await ji(i,t,n,"llm-pr :robot:"),await ji(i,t,n,"ai-pr :robot:"),await ji(i,t,n,"gen-pr-all :robot:"),await ji(i,t,n,"gen-pr-claude :robot:"),await ji(i,t,n,"gen-pr-codex :robot:"),await ji(i,t,n,"gen-pr-gemini :robot:")}catch(e){console.warn("Skip setupLabels due to:",e?.stack??e)}})}async function ki(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 ji(e,t,n,i){try{await e.request("DELETE /repos/{owner}/{repo}/labels/{name}",{owner:t,repo:n,name:i})}catch{}}const $i=["READY_DISCORD_WEBHOOK_URL","GH_BOT_PAT","PUBLIC_GH_BOT_PAT"],_i=h(import.meta.url);async function Si(e){return S.functionIgnoringException("setupSecrets",async()=>{const[n,i]=Gt.getOrgAndName(e.repository??"");if(!n||!i||"WillBoosterLab"!==n)return;if(!Ht(n)||!_.doesUploadEnvVars)return;const r=w.config({path:t.resolve(e.dirPath,".env"),quiet:!0}).parsed??{};if(0===Object.keys(r).length)return;const s=qt(n);try{for(const e of $i)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=_i("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),u=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:u,key_id:o})}}catch(e){console.warn("Skip setupSecrets due to:",e?.stack??e)}})}async function Pi(e){const[t,n]=Gt.getOrgAndName(e.repository??"");if(!t||!n)return;if("WillBooster"!==t&&"WillBoosterLab"!==t)return;if(!Ht(t))return;const i=qt(t);await async function(e,{beforeRetry:t,handleError:n,retryCount:i=3,retryLogger:r,shouldRetry:s,sleepMilliseconds:o=0,updateSleepMilliseconds:a}={}){let c=0;for(;;)try{return await e(c)}catch(e){if(await(n?.(e)),c++,c>=i)throw e;if(s&&!s(e))throw e;o>0&&await k(o),a&&(o=a(o)),r?.(`Retry due to: ${e}\n${e instanceof Error?"---\n"+(e.stack??""):""}`),await(t?.(e))}}(()=>i.request("PATCH /repos/{owner}/{repo}",{owner:t,repo:n,allow_auto_merge:!0,allow_merge_commit:!1,allow_squash_merge:!0,allow_rebase_merge:!1,allow_update_branch:!0,delete_branch_on_merge:!0,squash_merge_commit_title:"PR_TITLE",squash_merge_commit_message:"BLANK",headers:{"X-GitHub-Api-Version":"2022-11-28"},...e.repository?.startsWith("github:WillBooster/")?{allow_auto_merge:!0}:{}}))}const Oi="__PM_RUN__",Ei={"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., \`${Oi} test\`) passed.\n - The lint command (e.g., \`${Oi} 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 Ci(n){return S.functionIgnoringException("generateGitHubTemplates",async()=>{if(n.isWillBoosterRepo)for(const[i,r]of Object.entries(Ei)){const s=Ai(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 O.run(()=>P.generateFile(o,s))}})}function Ai(e,t){const n=t.isBun?"bun run":"yarn";return e.replaceAll(Oi,n)}const Fi=x.object({typos:x.object({all:x.record(x.string(),x.string()).optional(),doc:x.record(x.string(),x.string()).optional(),ts:x.record(x.string(),x.string()).optional(),text:x.record(x.string(),x.string()).optional()}).optional()});async function Bi(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 u=[],d=[];try{const e=t.resolve(n,".releaserc.json"),i=JSON.parse(await s.readFile(e,"utf8"));u=i?.branches??[],d=i?.plugins?.flat()??[]}catch{}const f="packages"!==t.basename(t.resolve(n,".."))||!e.existsSync(t.resolve(n,"..","..","package.json"));let m;f&&(m=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 Di(r);if(e)return e}const s="string"==typeof t.repository?t.repository:t.repository?.url;if(s){const e=await Di(s);if(e&&"Not Found"!==e.message)return e}}(n,l));let g=function(n){const i=t.resolve(n);return e.existsSync(t.join(i,"mise.toml"))||e.existsSync(t.join(i,".mise.toml"))||e.existsSync(t.join(i,".tool-versions"))}(n);for(const i of["java","node","python"])if(e.existsSync(t.resolve(n,`.${i}-version`))){g=!0;break}let y="";try{y=await s.readFile(t.resolve(n,"Dockerfile"),"utf8")}catch{}const h=t.resolve(n,"wbfy.json");let w;try{const e=await s.readFile(h,"utf8");w=Fi.parse(JSON.parse(e))}catch{}const b="string"==typeof m?.full_name?m.full_name:void 0;let x,k;if(b){const e=b.split("/");e.length>=2&&(x=e[0],k=e[1])}const j=b?`github:${b}`:void 0,$={dirPath:n,dockerfile:y,isRoot:f,isPublicRepo:!1===m?.private,isReferredByOtherRepo:!!l.files,repository:j,repoAuthor:x,repoName:k,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:Ti("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:Ti("{app,src,test,scripts}/**/*.{cjs,mjs,js,jsx}",n),doesContainTypeScript:Ti("{app,src,test,scripts}/**/*.{cts,mts,ts,tsx}",n),doesContainJsxOrTsx:Ti("{app,src,test}/**/*.{t,j}sx",n),doesContainJava:Ti("**/*.java",n),doesContainJavaScriptInPackages:Ti("packages/**/{app,src,test,scripts}/**/*.{cjs,mjs,js,jsx}",n),doesContainTypeScriptInPackages:Ti("packages/**/{app,src,test,scripts}/**/*.{cts,mts,ts,tsx}",n),doesContainJsxOrTsxInPackages:Ti("packages/**/{app,src,test}/**/*.{t,j}sx",n),doesContainJavaInPackages:Ti("packages/**/*.java",n),depending:{blitz:!!a.blitz,firebase:!!c["firebase-tools"],genI18nTs:!!a["gen-i18n-ts"]||!!c["gen-i18n-ts"],litestream:y.includes("install-litestream.sh"),react:!!a.react,next:!!a.next,playwrightTest:!!a["@playwright/test"]||!!c["@playwright/test"]||!!c.playwright,prisma:!!a["@prisma/client"]||!!c.prisma,pyright:!!c.pyright,reactNative:!!a["react-native"],semanticRelease:!!(c["semantic-release"]||u.length>0||d.length>0),storybook:!!c["@storybook/react"],wb:!!a["@willbooster/wb"]||!!c["@willbooster/wb"]},release:{branches:u,github:d.includes("@semantic-release/github"),npm:d.includes("@semantic-release/npm")},hasVersionSettings:g,miseTasks:await Ii(n),packageJson:l,wbfyJson:w};if($.doesContainGemfile||$.doesContainGoMod||$.doesContainPackageJson||$.doesContainPoetryLock||$.doesContainUvLock||$.doesContainPomXml||$.doesContainPubspecYaml||$.doesContainTemplateYaml)return $}catch{}}async function Ii(e){const n={};for(const i of["mise.toml",".mise.toml"]){const r=t.resolve(e,i);try{const e=u.parse(await s.readFile(r,"utf8"));for(const[t,i]of Object.entries(e.tasks??{}))n[t]=Ri(i)}catch{}}return n}function Ri(e){return"string"==typeof e?e:Array.isArray(e)?e.filter(e=>"string"==typeof e).join("\n"):e&&"object"==typeof e?Ri(e.run):""}function Ti(e,t){return o.globSync(e,{dot:!0,cwd:t,ignore:z}).length>0}async function Di(e){const[t,n]=Gt.getOrgAndName(e);if(t&&n)try{return(await qt().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}}}function Wi(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;_.isVerbose=i.verbose,_.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 Bi(n);if(_.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=>Bi(e,a)))).filter(e=>!!e),p=[a,...l];if(_.isVerbose)for(const e of p)console.info(e);await vi(a),a.isBun&&await ft(a);const u=!tt(a.repository)&&(a.repository?.startsWith("github:WillBooster/")||a.repository?.startsWith("github:WillBoosterLab/"));await Promise.all([q(a),c.then(()=>ii(a)),lt(a,p),kt(a),_t(a),Ot(a,p),Et(a),At(a),Ci(a),Dt(a),li(a),ai(a),...u?[et(a)]:[],xi(a),Si(a),Pi(a),Dn(a),Un(a)]),await O.promiseAll();const d=[];for(const e of p)(e.doesContainTypeScript||e.doesContainTypeScriptInPackages)&&d.push(ze(e,e.isRoot?p:[e])),e.depending.playwrightTest&&d.push(T(e)),e.depending.next&&d.push(E(e)),await Bt(e,a),await O.promiseAll(),(e.isRoot||e.doesContainPackageJson)&&(await ei(e),await un(e,a,i.skipDeps),d.push(Un(e)),e.doesContainVscodeSettingsJson&&e.doesContainPackageJson&&d.push(wi(e)),(e.doesContainTypeScript||e.doesContainTypeScriptInPackages)&&d.push(fi(e)),C(e)&&(d.push(zn(e)),d.push(qn(e))),e.depending.pyright&&d.push(ni(e)));await Promise.all(d),await O.promiseAll();const f=a.isBun?"bun":"yarn";a.isBun?await S.functionIgnoringException("refreshBunLock",async()=>{await Promise.resolve(),Wi(n)}):Nt(f,["install","--no-immutable"],n),Nt(f,["cleanup"],n),await pi(a)}r&&(process.exitCode=1)}();
32
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VzIjpbIi4uLy4uL3NoYXJlZC1saWIvc3JjL3NsZWVwLnRzIiwiLi4vLi4vc2hhcmVkLWxpYi9zcmMvZXJyb3IudHMiLCIuLi9zcmMvb3B0aW9ucy50cyIsIi4uL3NyYy9sb2dnZXIudHMiLCIuLi9zcmMvdXRpbHMvZnNVdGlsLnRzIiwiLi4vc3JjL3V0aWxzL3Byb21pc2VQb29sLnRzIiwiLi4vc3JjL2ZpeGVycy9uZXh0Q29uZmlnLnRzIiwiLi4vc3JjL3V0aWxzL3BhY2thZ2VDYXBhYmlsaXRpZXMudHMiLCIuLi9zcmMvZml4ZXJzL3BsYXl3cmlnaHRDb25maWcudHMiLCIuLi9zcmMvdXRpbHMvZ2xvYlV0aWwudHMiLCIuLi9zcmMvZml4ZXJzL3ByaXNtYS50cyIsIi4uLy4uLy4uL25vZGVfbW9kdWxlcy9zb3J0LW9iamVjdC1rZXlzL2luZGV4LmpzIiwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2RldGVjdC1pbmRlbnQvaW5kZXguanMiLCIuLi8uLi8uLi9ub2RlX21vZHVsZXMvZGV0ZWN0LW5ld2xpbmUvaW5kZXguanMiLCIuLi8uLi8uLi9ub2RlX21vZHVsZXMvc29ydC1wYWNrYWdlLWpzb24vaW5kZXguanMiLCIuLi8uLi8uLi9ub2RlX21vZHVsZXMvaXMtcGxhaW4tb2JqL2luZGV4LmpzIiwiLi4vc3JjL2ZpeGVycy90ZXN0RGlyZWN0b3J5LnRzIiwiLi4vc3JjL2ZpeGVycy90eXBlRGVmaW5pdGlvbi50cyIsIi4uL3NyYy91dGlscy9tZXJnZVV0aWwudHMiLCIuLi9zcmMvdXRpbHMvb2JqZWN0VXRpbC50cyIsIi4uL3NyYy9nZW5lcmF0b3JzL3dvcmtmbG93LnRzIiwiLi4vc3JjL2ZpeGVycy90eXBvcy50cyIsIi4uL3NyYy9nZW5lcmF0b3JzL2FnZW50cy50cyIsIi4uL3NyYy9nZW5lcmF0b3JzL2J1bmZpZy50cyIsIi4uL3NyYy91dGlscy9pZ25vcmVGaWxlVXRpbC50cyIsIi4uL3NyYy9nZW5lcmF0b3JzL2RvY2tlcmlnbm9yZS50cyIsIi4uL3NyYy91dGlscy9leHRlbnNpb25zLnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvZWRpdG9yY29uZmlnLnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvZ2VtaW5pQ29uZmlnLnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvZ2VtaW5pU2V0dGluZ3MudHMiLCIuLi9zcmMvZ2VuZXJhdG9ycy9naXRhdHRyaWJ1dGVzLnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvZ2l0aWdub3JlLnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvaWRlYS50cyIsIi4uL3NyYy91dGlscy9nZW5JMThuVHMudHMiLCIuLi9zcmMvdXRpbHMvc3Bhd25VdGlsLnRzIiwiLi4vc3JjL3V0aWxzL2dpdGh1YlV0aWwudHMiLCIuLi9zcmMvdXRpbHMvdHNjb25maWdCYXNlLnRzIiwiLi4vc3JjL3V0aWxzL3dpbGxib29zdGVyQ29uZmlnc1V0aWwudHMiLCIuLi9zcmMvZ2VuZXJhdG9ycy9wYWNrYWdlSnNvbi50cyIsIi4uL3NyYy9naXRodWIvY29tbWl0LnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvbGVmdGhvb2sudHMiLCIuLi9zcmMvZ2VuZXJhdG9ycy9saW50c3RhZ2VkcmMudHMiLCIuLi9zcmMvZ2VuZXJhdG9ycy90b29sQ29uZmlnQ29udGVudC50cyIsIi4uL3NyYy9nZW5lcmF0b3JzL294Zm10Q29uZmlnLnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvb3hsaW50Q29uZmlnLnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvcHJldHRpZXJpZ25vcmUudHMiLCIuLi9zcmMvZ2VuZXJhdG9ycy9weXJpZ2h0Q29uZmlnLnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvcmVhZG1lLnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvcmVsZWFzZXJjLnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvcmVub3ZhdGVKc29uLnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvc2tpbGxzLnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvdHNjb25maWcudHMiLCIuLi9zcmMvZ2VuZXJhdG9ycy92c2NvZGVTZXR0aW5ncy50cyIsIi4uL3NyYy9nZW5lcmF0b3JzL3lhcm5yYy50cyIsIi4uL3NyYy9naXRodWIvbGFiZWwudHMiLCIuLi9zcmMvZ2l0aHViL3NlY3JldC50cyIsIi4uL3NyYy9naXRodWIvc2V0dGluZ3MudHMiLCIuLi9zcmMvZ2l0aHViL3RlbXBsYXRlLnRzIiwiLi4vc3JjL3BhY2thZ2VDb25maWcudHMiLCIuLi9zcmMvaW5kZXgudHMiXSwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHNsZWVwKG1pbGxpc2Vjb25kczogbnVtYmVyKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4gc2V0VGltZW91dChyZXNvbHZlLCBtaWxsaXNlY29uZHMpKTtcbn1cbiIsImltcG9ydCB7IHNsZWVwIH0gZnJvbSAnLi9zbGVlcC5qcyc7XG5cbi8qKlxuICogQ29udmVydCBhbiBvYmplY3QgdG8gYW4gZXJyb3IuXG4gKiBAcGFyYW0gb2JqIFRoZSBvYmplY3QgdG8gY29udmVydC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGVycm9yaWZ5KG9iajogdW5rbm93bik6IEVycm9yIHtcbiAgaWYgKG9iaiBpbnN0YW5jZW9mIEVycm9yKSByZXR1cm4gb2JqO1xuICBpZiAodHlwZW9mIG9iaiA9PT0gJ3N0cmluZycpIHJldHVybiBuZXcgRXJyb3Iob2JqKTtcbiAgdHJ5IHtcbiAgICByZXR1cm4gbmV3IEVycm9yKEpTT04uc3RyaW5naWZ5KG9iaikpO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gbmV3IEVycm9yKFN0cmluZyhvYmopKTtcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gaWdub3JlRXJyb3I8VD4oZm46ICgpID0+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/Lltwcm9wTmFtZV0gPz8ge30pKSB7XG4gICAgbmV3Q29udGVudCA9IG5ld0NvbnRlbnQucmVwbGFjZUFsbChiZWZvcmUsIGFmdGVyKTtcbiAgfVxuICByZXR1cm4gbmV3Q29udGVudDtcbn1cbiIsImltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGZzVXRpbCB9IGZyb20gJy4uL3V0aWxzL2ZzVXRpbC5qcyc7XG5pbXBvcnQgeyBnZXRQYWNrYWdlTWFuYWdlckNvbW1hbmQgfSBmcm9tICcuLi91dGlscy9wYWNrYWdlQ2FwYWJpbGl0aWVzLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVBZ2VudEluc3RydWN0aW9ucyhyb290Q29uZmlnOiBQYWNrYWdlQ29uZmlnLCBhbGxDb25maWdzOiBQYWNrYWdlQ29uZmlnW10pOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdnZW5lcmF0ZUFnZW50SW5zdHJ1Y3Rpb25zJywgYXN5bmMgKCkgPT4ge1xuICAgIGlmICghcm9vdENvbmZpZy5pc1Jvb3QpIHJldHVybjtcblxuICAgIC8vIENoZWNrIGlmIEFHRU5UU19FWFRSQS5tZCBleGlzdHMgYW5kIHJlYWQgaXRzIGNvbnRlbnRcbiAgICBjb25zdCBhZ2VudHNFeHRyYVBhdGggPSBwYXRoLnJlc29sdmUocm9vdENvbmZpZy5kaXJQYXRoLCAnQUdFTlRTX0VYVFJBLm1kJyk7XG4gICAgY29uc3QgZXh0cmFDb250ZW50ID0gYXdhaXQgZnNVdGlsLnJlYWRGaWxlSWdub3JpbmdFcnJvcihhZ2VudHNFeHRyYVBhdGgpO1xuXG4gICAgZm9yIChjb25zdCBbZmlsZU5hbWUsIHRvb2xOYW1lXSBvZiBbXG4gICAgICBbJ0FHRU5UUy5tZCcsICdDb2RleCBDTEknXSxcbiAgICAgIFsnQ0xBVURFLm1kJywgJ0NsYXVkZSBDb2RlJ10sXG4gICAgICBbJ0dFTUlOSS5tZCcsICdHZW1pbmkgQ0xJJ10sXG4gICAgXSBhcyBjb25zdCkge1xuICAgICAgY29uc3QgY29udGVudCA9IGdlbmVyYXRlQWdlbnRJbnN0cnVjdGlvbihyb290Q29uZmlnLCBhbGxDb25maWdzLCB0b29sTmFtZSwgZXh0cmFDb250ZW50KTtcbiAgICAgIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKHJvb3RDb25maWcuZGlyUGF0aCwgZmlsZU5hbWUpO1xuICAgICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzVXRpbC5nZW5lcmF0ZUZpbGUoZmlsZVBhdGgsIGNvbnRlbnQpKTtcbiAgICB9XG5cbiAgICBjb25zdCBjdXJzb3JSdWxlc1BhdGggPSBwYXRoLnJlc29sdmUocm9vdENvbmZpZy5kaXJQYXRoLCAnLmN1cnNvci9ydWxlcy9nZW5lcmFsLm1kYycpO1xuICAgIGNvbnN0IGN1cnNvclJ1bGVzQ29udGVudCA9IGdlbmVyYXRlQ3Vyc29yR2VuZXJhbE1kY0NvbnRlbnQocm9vdENvbmZpZywgYWxsQ29uZmlncywgZXh0cmFDb250ZW50KTtcbiAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnNVdGlsLmdlbmVyYXRlRmlsZShjdXJzb3JSdWxlc1BhdGgsIGN1cnNvclJ1bGVzQ29udGVudCkpO1xuICB9KTtcbn1cblxuZnVuY3Rpb24gZ2VuZXJhdGVDdXJzb3JHZW5lcmFsTWRjQ29udGVudChcbiAgY29uZmlnOiBQYWNrYWdlQ29uZmlnLFxuICBhbGxDb25maWdzOiBQYWNrYWdlQ29uZmlnW10sXG4gIGV4dHJhQ29udGVudD86IHN0cmluZ1xuKTogc3RyaW5nIHtcbiAgY29uc3QgZnJvbnRtYXR0ZXIgPSBgLS0tXFxuZGVzY3JpcHRpb246IEdlbmVyYWwgQ29kaW5nIFJ1bGVzXFxuZ2xvYnM6XFxuYWx3YXlzQXBwbHk6IHRydWVcXG4tLS1gO1xuICBjb25zdCBib2R5ID0gZ2VuZXJhdGVBZ2VudEluc3RydWN0aW9uKGNvbmZpZywgYWxsQ29uZmlncywgJ0N1cnNvcicsIGV4dHJhQ29udGVudCk7XG4gIHJldHVybiBgJHtmcm9udG1hdHRlcn1cXG5cXG4ke2JvZHl9YDtcbn1cblxuZnVuY3Rpb24gZ2VuZXJhdGVBZ2VudEluc3RydWN0aW9uKFxuICByb290Q29uZmlnOiBQYWNrYWdlQ29uZmlnLFxuICBhbGxDb25maWdzOiBQYWNrYWdlQ29uZmlnW10sXG4gIHRvb2xOYW1lOiBzdHJpbmcsXG4gIGV4dHJhQ29udGVudD86IHN0cmluZ1xuKTogc3RyaW5nIHtcbiAgY29uc3QgcGFja2FnZU1hbmFnZXIgPSBnZXRQYWNrYWdlTWFuYWdlckNvbW1hbmQocm9vdENvbmZpZyk7XG4gIGNvbnN0IGJhc2VDb250ZW50ID0gYFxuIyMgUHJvamVjdCBJbmZvcm1hdGlvblxuXG4tIE5hbWU6IFxcYCR7cm9vdENvbmZpZy5wYWNrYWdlSnNvbj8ubmFtZSB8fCAndW5rbm93bid9XFxgXG4tIERlc2NyaXB0aW9uOiAke3Jvb3RDb25maWcucGFja2FnZUpzb24/LmRlc2NyaXB0aW9ufVxuLSBQYWNrYWdlIE1hbmFnZXI6ICR7cGFja2FnZU1hbmFnZXJ9XG5cbiMjIEdlbmVyYWwgSW5zdHJ1Y3Rpb25zXG5cbi0gQ3JlYXRlIGEgbmV3IGJyYW5jaCBpZiB0aGUgY3VycmVudCBicmFuY2ggaXMgXFxgbWFpblxcYC5cbi0gUnVuIGFueSBcXGBnaXRcXGAgY29tbWFuZHMgc2VxdWVudGlhbGx5LlxuLSBXcml0ZSB0ZXN0cyBPTkxZIGlmIGV4cGxpY2l0bHkgcmVxdWVzdGVkLiBJZiByZXF1ZXN0ZWQsIGZvbGxvdyB0aGVzZSBydWxlczpcbiAgLSBDb250aW51ZSBtb2RpZnlpbmcgdGVzdHMgYW5kL29yIGNvZGUgdW50aWwgYWxsIHRlc3RzIHBhc3MuXG4gIC0gRW5zdXJlIHRlc3RzIGFyZSBpZGVtcG90ZW50IGFuZCBpbmRlcGVuZGVudCAoZS5nLiwgcmVzZXQgcGVyc2lzdGVudCBkYXRhKSBzbyB0aGV5IGNhbiBydW4gcmVwZWF0ZWRseSBvciBpbiBwYXJhbGxlbC5cbiAgLSBQcmVmZXIgYWN0dWFsIEFQSSBjYWxscyBvdmVyIG1vY2tzLCB1bmxlc3MgYWN0dWFsIGNhbGxzIGFyZSBpbXByYWN0aWNhbCwgaGF2ZSB1bmludGVuZGVkIHNpZGUgZWZmZWN0cywgb3IgbW9ja3MgYXJlIGV4cGxpY2l0bHkgcmVxdWVzdGVkLlxuICAtIEFsd2F5cyBpbnZlc3RpZ2F0ZSB0aGUgcm9vdCBjYXVzZSBvZiBhIHRlc3QgZmFpbHVyZSBiZWZvcmUgZml4aW5nIGl0LlxuICAtIEF2b2lkIGFkZGluZyB3YWl0IGZ1bmN0aW9ucyBpbiBFMkUgdGVzdHMgdW5sZXNzIHN0cmljdGx5IG5lY2Vzc2FyeS5cbi0gV2hlbiBmaXhpbmcgaXNzdWVzLCBmb2xsb3cgdGhlc2UgcnVsZXM6XG4gIC0gSW52ZXN0aWdhdGUgdGhlIHJvb3QgY2F1c2UgZmlyc3QgKGUuZy4sIGJ5IGdhdGhlcmluZyBkZWJ1ZyBsb2dzLCB0YWtpbmcgc2NyZWVuc2hvdHMsIGV0Yy4pLlxuICAtIEZpeCB0aGUgYWN0dWFsIHJvb3QgY2F1c2UgaW5zdGVhZCBvZiBhcHBseWluZyB3b3JrYXJvdW5kcy5cbi0gQWZ0ZXIgbWFraW5nIGNvZGUgY2hhbmdlcywgcnVuIFxcYCR7cGFja2FnZU1hbmFnZXJ9IHZlcmlmeS1mdWxsXFxgIHRvIGV4ZWN1dGUgYWxsIHRlc3RzICh0YWtlcyB1cCB0byAxIGhvdXIpLCBvciBcXGAke3BhY2thZ2VNYW5hZ2VyfSB2ZXJpZnlcXGAgZm9yIG9ubHkgdHlwZSBjaGVja2luZyBhbmQgbGludGluZyAodGFrZXMgdXAgdG8gMTAgbWludXRlcykuXG4gIC0gSWYgeW91IGFyZSBjb25maWRlbnQgdGhhdCB5b3VyIGNoYW5nZXMgd2lsbCBub3QgYnJlYWsgYW55IHRlc3RzLCB5b3UgbWF5IHVzZSBcXGB2ZXJpZnlcXGAuXG4gIC0gVXNlIFxcYG94bGludFxcYCBpZ25vcmUgY29tbWVudHMgd2l0aCByZWFzb25zIChlLmcuLCBcXGAvLyBveGxpbnQtZGlzYWJsZS1uZXh0LWxpbmUgPHJ1bGU+IC0tIDxyZWFzb24+XFxgKSBpZiBsaW50IGVycm9ycyBvciB3YXJuaW5ncyBjYW5ub3QgYmUgZml4ZWQuXG4tIE9uY2UgeW91IGhhdmUgdmVyaWZpZWQgeW91ciBjaGFuZ2VzLCBjb21taXQgYW5kIHB1c2ggdGhlbSB0byB0aGUgY3VycmVudCAobm9uLW1haW4pIGJyYW5jaCwgdGhlbiBjcmVhdGUgYSBQUiB2aWEgXFxgZ2hcXGAuXG4gIC0gRm9sbG93IHRoZSBjb252ZW50aW9uYWwgY29tbWl0czsgeW91ciBjb21taXQgbWVzc2FnZSBzaG91bGQgc3RhcnQgd2l0aCBcXGBmZWF0OlxcYCwgXFxgZml4OlxcYCwgZXRjLlxuICAtIElmIG5vdCBzcGVjaWZpZWQsIG1ha2Ugc3VyZSB0byBhZGQgYSBuZXcgbGluZSBhdCB0aGUgZW5kIG9mIHlvdXIgY29tbWl0IG1lc3NhZ2Uke3Jvb3RDb25maWcuaXNXaWxsQm9vc3RlclJlcG8gPyBgIHdpdGg6IFxcYENvLWF1dGhvcmVkLWJ5OiBXaWxsQm9vc3RlciAoJHt0b29sTmFtZX0pIDxhZ2VudEB3aWxsYm9vc3Rlci5jb20+XFxgYCA6ICcnfS5cbiAgLSBBbHdheXMgY3JlYXRlIG5ldyBjb21taXRzLiBBdm9pZCB1c2luZyBcXGAtLWFtZW5kXFxgLlxuLSBBbHdheXMgdXNlIGhlcmVkb2Mgc3ludGF4IHdoZW4gcGFzc2luZyBtdWx0aS1saW5lIGNvbnRlbnQgdG8gYW55IGNvbW1hbmQuXG4ke2hhc1BsYXl3cmlnaHRUZXN0U2VydmVyKGFsbENvbmZpZ3MpID8gYC0gVXNlIFxcYCR7cGFja2FnZU1hbmFnZXJ9IHdiIHN0YXJ0IC0tbW9kZSB0ZXN0XFxgIHRvIGxhdW5jaCBhIHdlYiBzZXJ2ZXIgZm9yIGRlYnVnZ2luZyBvciB0ZXN0aW5nLmAgOiAnJ31cblxuJHtnZW5lcmF0ZUFnZW50Q29kaW5nU3R5bGUoYWxsQ29uZmlncyl9XG5gXG4gICAgLnJlcGxhY2VBbGwoL1xcLlxcblxcbistL2csICcuXFxuLScpXG4gICAgLnJlcGxhY2VBbGwoL1xcbnszLH0vZywgJ1xcblxcbicpXG4gICAgLnRyaW0oKTtcblxuICBjb25zdCBoYXNOZXdTZWN0aW9uID0gZXh0cmFDb250ZW50Py50cmltKCkuc3RhcnRzV2l0aCgnIycpO1xuICBjb25zdCBub3JtYWxpemVkRXh0cmFDb250ZW50ID0gZXh0cmFDb250ZW50XG4gICAgPyBoYXNOZXdTZWN0aW9uXG4gICAgICA/ICdcXG5cXG4nICsgZXh0cmFDb250ZW50LnRyaW0oKVxuICAgICAgOiAnXFxuJyArIGV4dHJhQ29udGVudFxuICAgIDogJyc7XG4gIHJldHVybiBiYXNlQ29udGVudCArIG5vcm1hbGl6ZWRFeHRyYUNvbnRlbnQ7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZW5lcmF0ZUFnZW50Q29kaW5nU3R5bGUoYWxsQ29uZmlnczogUGFja2FnZUNvbmZpZ1tdKTogc3RyaW5nIHtcbiAgLy8gS2VlcCB0b3AtZG93biBvcmRlcmluZyBndWlkYW5jZSBmdW5jdGlvbi1vbmx5IGJlY2F1c2UgY2xhc3NlcyBhcmUgbm90IGhvaXN0ZWQgYW5kIGNhbiBmYWlsIHdoZW4gaW5oZXJpdGFuY2Ugb3IgdG9wLWxldmVsIGluc3RhbnRpYXRpb24gZGVwZW5kcyBvbiBkZWNsYXJhdGlvbiBvcmRlci5cbiAgcmV0dXJuIGBcbiMjIENvZGluZyBTdHlsZVxuXG4tIFVzZSBjYW1lbENhc2UgZm9yIEphdmFTY3JpcHQgYW5kIFR5cGVTY3JpcHQgZmlsZXMgKG9yIFBhc2NhbENhc2UgZm9yIFJlYWN0IGNvbXBvbmVudHMpLlxuLSBTaW1wbGlmeSBjb2RlIGFzIG11Y2ggYXMgcG9zc2libGUgdG8gZWxpbWluYXRlIHJlZHVuZGFuY3kuXG4tIERlc2lnbiBlYWNoIG1vZHVsZSB3aXRoIGhpZ2ggY29oZXNpb24sIGdyb3VwaW5nIHJlbGF0ZWQgZnVuY3Rpb25hbGl0eSB0b2dldGhlci5cbiAgLSBSZWZhY3RvciBleGlzdGluZyBsYXJnZSBtb2R1bGVzIGludG8gc21hbGxlciwgZm9jdXNlZCBtb2R1bGVzIHdoZW4gbmVjZXNzYXJ5LlxuICAtIENyZWF0ZSB3ZWxsLW9yZ2FuaXplZCBkaXJlY3Rvcnkgc3RydWN0dXJlcyB3aXRoIGxvdyBjb3VwbGluZyBhbmQgaGlnaCBjb2hlc2lvbi5cbi0gUGxhY2UgY2FsbGluZyBmdW5jdGlvbnMgYWJvdmUgdGhlIGZ1bmN0aW9ucyB0aGV5IGNhbGwgdG8gbWFpbnRhaW4gYSBjbGVhciB0b3AtZG93biBvcmRlci5cbiAgLSBlLmcuLCBcXGBmdW5jdGlvbiBjYWxsZXIoKSB7IGNhbGxlZSgpOyB9IGZ1bmN0aW9uIGNhbGxlZSgpIHsgLi4uIH1cXGBcbiAgLSBVbmxpa2UgZnVuY3Rpb25zLCBwbGFjZSB2YXJpYWJsZSBhbmQgdHlwZSBkZWNsYXJhdGlvbnMgQUJPVkUgdGhlaXIgdXNhZ2UuXG4tIFdyaXRlIGNvbW1lbnRzIGFuZCBKU0RvYyBmb3IgY29tcGxleCBvciBoYXJkLXRvLXVuZGVyc3RhbmQgY29kZS5cbiAgLSBFeHBsYWluIFwid2h5XCIgaW4gY29tbWVudHMgYW5kIFwid2hhdFwiIGluIEpTRG9jLlxuICAtIEF2b2lkIHN0YXRpbmcgd2hhdCBjYW4gYmUgZWFzaWx5IHVuZGVyc3Rvb2QgZnJvbSB0aGUgY29kZSBpdHNlbGYuXG4tIFByZWZlciBcXGB1bmRlZmluZWRcXGAgb3ZlciBcXGBudWxsXFxgIHVubGVzcyBleHBsaWNpdGx5IHJlcXVpcmVkIGJ5IEFQSXMgb3IgbGlicmFyaWVzLlxuLSBQcmVmZXIgdXNpbmcgYSBzaW5nbGUgdGVtcGxhdGUgbGl0ZXJhbCBmb3IgcHJvbXB0cyBpbnN0ZWFkIG9mIFxcYGpvaW4oKVxcYCB3aXRoIGEgcHJlLWNvbXB1dGFibGUgYXJyYXkgbGl0ZXJhbCBvZiBzdHJpbmdzLlxuLSBBc3N1bWUgdGhhdCBhbGwgZW52aXJvbm1lbnQgdmFyaWFibGVzIGFyZSBwcm9wZXJseSBkZWZpbmVkLlxuICAtIElmIHZhbGlkYXRpb24gaXMgcmVxdWlyZWQsIHVzZSBcXGBhc3NlcnRcXGAgdG8gZmFpbCBmYXN0IChlLmcuLCBkdXJpbmcgc3RhcnR1cCkuXG4ke1xuICBhbGxDb25maWdzLnNvbWUoKGMpID0+IGMuZGVwZW5kaW5nLmdlbkkxOG5UcylcbiAgICA/IGAtIFdoZW4gaW50cm9kdWNpbmcgbmV3IHN0cmluZyBsaXRlcmFscyBpbiBSZWFjdCBjb21wb25lbnRzLCB1cGRhdGUgdGhlIGxhbmd1YWdlIHJlc291cmNlIGZpbGVzIGluIHRoZSBcXGBpMThuXFxgIGRpcmVjdG9yeSAoZS5nLiwgXFxgaTE4bi9qYS1KUC5qc29uXFxgKS4gUmVmZXJlbmNlIHRoZXNlIHN0cmluZ3MgdXNpbmcgdGhlIFxcYGkxOG5cXGAgdXRpbGl0eS4gRm9yIGV4YW1wbGUsIHVzZSBcXGBpMThuLnBhZ2VzLmhvbWUudGl0bGUoKVxcYCBmb3IgXFxgeyBcInBhZ2VzXCI6IHsgXCJob21lXCI6IHsgXCJ0aXRsZVwiOiBcIk15IEFwcFwiIH0gfSB9XFxgLmBcbiAgICA6ICcnXG59XG5cbiR7XG4gIGFsbENvbmZpZ3Muc29tZSgoYykgPT4gYy5kZXBlbmRpbmcucmVhY3QgfHwgYy5kZXBlbmRpbmcubmV4dClcbiAgICA/IGAtIFByZWZlciBsYW1iZGEgb3ZlciBcXGBmdW5jdGlvblxcYCBmb3IgUmVhY3QgY29tcG9uZW50cywgZS5nLiwgXFxgY29uc3QgQnV0dG9uOiBSZWFjdC5GQyA9ICgpID0+IHtcXGAuXG4tIFByZWZlciBcXGB1c2VJbW1lclxcYCBmb3Igc3RvcmluZyBhbiBhcnJheSBvciBhbiBvYmplY3QgdG8gXFxgdXNlU3RhdGVcXGAuXG4tIEFsbG93IFxcYGF1dG9Gb2N1c1xcYCB0byBtaW5pbWl6ZSB1c2VyIGVmZm9ydC5gXG4gICAgOiAnJ1xufVxuJHtcbiAgYWxsQ29uZmlncy5zb21lKChjKSA9PiBjLmRlcGVuZGluZy5uZXh0KVxuICAgID8gYFxuLSBTaW5jZSB0aGlzIHByb2plY3QgdXNlcyB0aGUgUmVhY3QgQ29tcGlsZXIsIHlvdSBkbyBub3QgbmVlZCB0byB1c2UgXFxgdXNlQ2FsbGJhY2tcXGAgb3IgXFxgdXNlTWVtb1xcYCBmb3IgcGVyZm9ybWFuY2Ugb3B0aW1pemF0aW9uLlxuLSBBc3N1bWUgdGhlcmUgaXMgb25seSBhIHNpbmdsZSBzZXJ2ZXIgaW5zdGFuY2UuXG5gXG4gICAgOiAnJ1xufVxuYFxuICAgIC5yZXBsYWNlQWxsKC9cXC5cXG5cXG4rLS9nLCAnLlxcbi0nKVxuICAgIC5yZXBsYWNlQWxsKC9cXG57Myx9L2csICdcXG5cXG4nKVxuICAgIC50cmltKCk7XG59XG5cbmZ1bmN0aW9uIGhhc1BsYXl3cmlnaHRUZXN0U2VydmVyKGNvbmZpZ3M6IFBhY2thZ2VDb25maWdbXSk6IGJvb2xlYW4ge1xuICByZXR1cm4gY29uZmlncy5zb21lKChjb25maWcpID0+IGNvbmZpZy5kZXBlbmRpbmcucGxheXdyaWdodFRlc3QpO1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHsgcGFyc2UgfSBmcm9tICdzbW9sLXRvbWwnO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBmc1V0aWwgfSBmcm9tICcuLi91dGlscy9mc1V0aWwuanMnO1xuaW1wb3J0IHsgcHJvbWlzZVBvb2wgfSBmcm9tICcuLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5cbmludGVyZmFjZSBCdW5maWdUb21sIHtcbiAgaW5zdGFsbD86IHtcbiAgICBleGFjdD86IGJvb2xlYW47XG4gIH07XG4gIHJ1bj86IHtcbiAgICBidW4/OiBib29sZWFuO1xuICB9O1xufVxuXG5jb25zdCBtaW5pbXVtUmVsZWFzZUFnZUV4Y2x1ZGVzID0gW1xuICAvLyAtLS0tLS0tLS0tIFNUQVJUOiBXZSBiZWxpZXZlIG91ciBwYWNrYWdlcyBhcmUgc2FmZSAtLS0tLS0tLS0tXG4gICdAZXhlcmNvZGUvcHJvYmxlbS11dGlscycsXG4gICdAd2lsbGJvb3N0ZXIvYWdlbnQtc2tpbGxzJyxcbiAgJ0B3aWxsYm9vc3Rlci9iYWJlbC1jb25maWdzJyxcbiAgJ0B3aWxsYm9vc3Rlci9tb25hY28tbG9hZGVyJyxcbiAgJ0B3aWxsYm9vc3Rlci9tb25hY28tcmVhY3QnLFxuICAnQHdpbGxib29zdGVyL294Zm10LWNvbmZpZycsXG4gICdAd2lsbGJvb3N0ZXIvb3hsaW50LWNvbmZpZycsXG4gICdAd2lsbGJvb3N0ZXIvcHJldHRpZXItY29uZmlnJyxcbiAgJ0B3aWxsYm9vc3Rlci9yZW5vdmF0ZS1jb25maWcnLFxuICAnQHdpbGxib29zdGVyL3NoYXJlZC1saWInLFxuICAnQHdpbGxib29zdGVyL3NoYXJlZC1saWItYmxpdHotbmV4dCcsXG4gICdAd2lsbGJvb3N0ZXIvc2hhcmVkLWxpYi1uZXh0JyxcbiAgJ0B3aWxsYm9vc3Rlci9zaGFyZWQtbGliLW5vZGUnLFxuICAnQHdpbGxib29zdGVyL3NoYXJlZC1saWItcmVhY3QnLFxuICAnQHdpbGxib29zdGVyL3diJyxcbiAgJ2FnZW50LXJ1bnRpbWUta2l0JyxcbiAgJ2F0LWRlY29yYXRvcnMnLFxuICAnYnVpbGQtdHMnLFxuICAnZ2VuLWkxOG4tdHMnLFxuICAnb25lLXdheS1naXQtc3luYycsXG4gIC8vIC0tLS0tLS0tLS0gRU5EOiBXZSBiZWxpZXZlIG91ciBwYWNrYWdlcyBhcmUgc2FmZSAtLS0tLS0tLS0tXG5cbiAgLy8gd2JmeSBwaW5zIHRoZXNlIHRvb2xpbmcgcGFja2FnZXMgYW5kIG1heSBhcHBseSB0aGVtIGltbWVkaWF0ZWx5IGFmdGVyIGFcbiAgLy8gcmVsZWFzZSwgYmVmb3JlIHRoZSBnbG9iYWwgbWluaW11bS1yZWxlYXNlLWFnZSB3aW5kb3cgaGFzIGVsYXBzZWQuXG4gICdAdHlwZXNjcmlwdC9uYXRpdmUtcHJldmlldycsXG4gICdAdHlwZXNjcmlwdC9uYXRpdmUtcHJldmlldy1kYXJ3aW4tYXJtNjQnLFxuICAnQHR5cGVzY3JpcHQvbmF0aXZlLXByZXZpZXctZGFyd2luLXg2NCcsXG4gICdAdHlwZXNjcmlwdC9uYXRpdmUtcHJldmlldy1saW51eC1hcm0nLFxuICAnQHR5cGVzY3JpcHQvbmF0aXZlLXByZXZpZXctbGludXgtYXJtNjQnLFxuICAnQHR5cGVzY3JpcHQvbmF0aXZlLXByZXZpZXctbGludXgteDY0JyxcbiAgJ0B0eXBlc2NyaXB0L25hdGl2ZS1wcmV2aWV3LXdpbjMyLWFybTY0JyxcbiAgJ0B0eXBlc2NyaXB0L25hdGl2ZS1wcmV2aWV3LXdpbjMyLXg2NCcsXG4gICdveGZtdCcsXG4gICdAb3hmbXQvYmluZGluZy1hbmRyb2lkLWFybS1lYWJpJyxcbiAgJ0BveGZtdC9iaW5kaW5nLWFuZHJvaWQtYXJtNjQnLFxuICAnQG94Zm10L2JpbmRpbmctZGFyd2luLWFybTY0JyxcbiAgJ0BveGZtdC9iaW5kaW5nLWRhcndpbi14NjQnLFxuICAnQG94Zm10L2JpbmRpbmctZnJlZWJzZC14NjQnLFxuICAnQG94Zm10L2JpbmRpbmctbGludXgtYXJtLWdudWVhYmloZicsXG4gICdAb3hmbXQvYmluZGluZy1saW51eC1hcm0tbXVzbGVhYmloZicsXG4gICdAb3hmbXQvYmluZGluZy1saW51eC1hcm02NC1nbnUnLFxuICAnQG94Zm10L2JpbmRpbmctbGludXgtYXJtNjQtbXVzbCcsXG4gICdAb3hmbXQvYmluZGluZy1saW51eC1wcGM2NC1nbnUnLFxuICAnQG94Zm10L2JpbmRpbmctbGludXgtcmlzY3Y2NC1nbnUnLFxuICAnQG94Zm10L2JpbmRpbmctbGludXgtcmlzY3Y2NC1tdXNsJyxcbiAgJ0BveGZtdC9iaW5kaW5nLWxpbnV4LXMzOTB4LWdudScsXG4gICdAb3hmbXQvYmluZGluZy1saW51eC14NjQtZ251JyxcbiAgJ0BveGZtdC9iaW5kaW5nLWxpbnV4LXg2NC1tdXNsJyxcbiAgJ0BveGZtdC9iaW5kaW5nLW9wZW5oYXJtb255LWFybTY0JyxcbiAgJ0BveGZtdC9iaW5kaW5nLXdpbjMyLWFybTY0LW1zdmMnLFxuICAnQG94Zm10L2JpbmRpbmctd2luMzItaWEzMi1tc3ZjJyxcbiAgJ0BveGZtdC9iaW5kaW5nLXdpbjMyLXg2NC1tc3ZjJyxcbiAgJ294bGludCcsXG4gICdAb3hsaW50L2JpbmRpbmctYW5kcm9pZC1hcm0tZWFiaScsXG4gICdAb3hsaW50L2JpbmRpbmctYW5kcm9pZC1hcm02NCcsXG4gICdAb3hsaW50L2JpbmRpbmctZGFyd2luLWFybTY0JyxcbiAgJ0BveGxpbnQvYmluZGluZy1kYXJ3aW4teDY0JyxcbiAgJ0BveGxpbnQvYmluZGluZy1mcmVlYnNkLXg2NCcsXG4gICdAb3hsaW50L2JpbmRpbmctbGludXgtYXJtLWdudWVhYmloZicsXG4gICdAb3hsaW50L2JpbmRpbmctbGludXgtYXJtLW11c2xlYWJpaGYnLFxuICAnQG94bGludC9iaW5kaW5nLWxpbnV4LWFybTY0LWdudScsXG4gICdAb3hsaW50L2JpbmRpbmctbGludXgtYXJtNjQtbXVzbCcsXG4gICdAb3hsaW50L2JpbmRpbmctbGludXgtcHBjNjQtZ251JyxcbiAgJ0BveGxpbnQvYmluZGluZy1saW51eC1yaXNjdjY0LWdudScsXG4gICdAb3hsaW50L2JpbmRpbmctbGludXgtcmlzY3Y2NC1tdXNsJyxcbiAgJ0BveGxpbnQvYmluZGluZy1saW51eC1zMzkweC1nbnUnLFxuICAnQG94bGludC9iaW5kaW5nLWxpbnV4LXg2NC1nbnUnLFxuICAnQG94bGludC9iaW5kaW5nLWxpbnV4LXg2NC1tdXNsJyxcbiAgJ0BveGxpbnQvYmluZGluZy1vcGVuaGFybW9ueS1hcm02NCcsXG4gICdAb3hsaW50L2JpbmRpbmctd2luMzItYXJtNjQtbXN2YycsXG4gICdAb3hsaW50L2JpbmRpbmctd2luMzItaWEzMi1tc3ZjJyxcbiAgJ0BveGxpbnQvYmluZGluZy13aW4zMi14NjQtbXN2YycsXG4gICdveGxpbnQtdHNnb2xpbnQnLFxuICAnQG94bGludC10c2dvbGludC9kYXJ3aW4tYXJtNjQnLFxuICAnQG94bGludC10c2dvbGludC9kYXJ3aW4teDY0JyxcbiAgJ0BveGxpbnQtdHNnb2xpbnQvbGludXgtYXJtNjQnLFxuICAnQG94bGludC10c2dvbGludC9saW51eC14NjQnLFxuICAnQG94bGludC10c2dvbGludC93aW4zMi1hcm02NCcsXG4gICdAb3hsaW50LXRzZ29saW50L3dpbjMyLXg2NCcsXG4gICdAbmV4dC9lbnYnLFxuICAnQG5leHQvZm9udCcsXG4gICdAbmV4dC9yc3BhY2stYmluZGluZy1saW51eC1hcm02NC1nbnUnLFxuICAnQG5leHQvcnNwYWNrLWJpbmRpbmctbGludXgtYXJtNjQtbXVzbCcsXG4gICdAbmV4dC9yc3BhY2stYmluZGluZy1saW51eC14NjQtZ251JyxcbiAgJ0BuZXh0L3JzcGFjay1iaW5kaW5nLWxpbnV4LXg2NC1tdXNsJyxcbiAgJ0BuZXh0L3N3Yy1hbmRyb2lkLWFybS1lYWJpJyxcbiAgJ0BuZXh0L3N3Yy1hbmRyb2lkLWFybTY0JyxcbiAgJ0BuZXh0L3N3Yy1kYXJ3aW4tYXJtNjQnLFxuICAnQG5leHQvc3djLWRhcndpbi14NjQnLFxuICAnQG5leHQvc3djLWZyZWVic2QteDY0JyxcbiAgJ0BuZXh0L3N3Yy1saW51eC1hcm0tZ251ZWFiaWhmJyxcbiAgJ0BuZXh0L3N3Yy1saW51eC1hcm02NC1nbnUnLFxuICAnQG5leHQvc3djLWxpbnV4LWFybTY0LW11c2wnLFxuICAnQG5leHQvc3djLWxpbnV4LXg2NC1nbnUnLFxuICAnQG5leHQvc3djLWxpbnV4LXg2NC1tdXNsJyxcbiAgJ0BuZXh0L3N3Yy13YXNtLW5vZGVqcycsXG4gICdAbmV4dC9zd2Mtd2FzbS13ZWInLFxuICAnQG5leHQvdGhpcmQtcGFydGllcycsXG4gICduZXh0JyxcbiAgJ3JlYWN0JyxcbiAgJ3JlYWN0LWRvbScsXG5dO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVCdW5maWdUb21sKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2dlbmVyYXRlQnVuZmlnVG9tbCcsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJ2J1bmZpZy50b21sJyk7XG4gICAgY29uc3QgZXhpc3RpbmdDb250ZW50ID0gZnMuZXhpc3RzU3luYyhmaWxlUGF0aCkgPyBmcy5yZWFkRmlsZVN5bmMoZmlsZVBhdGgsICd1dGY4JykgOiB1bmRlZmluZWQ7XG4gICAgY29uc3QgY29udGVudCA9IG5ld0NvbnRlbnQoZXhpc3RpbmdDb250ZW50KTtcbiAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnNVdGlsLmdlbmVyYXRlRmlsZShmaWxlUGF0aCwgY29udGVudCkpO1xuICB9KTtcbn1cblxuY29uc3QgbmV3Q29udGVudCA9IChleGlzdGluZ0NvbnRlbnQ6IHN0cmluZyB8IHVuZGVmaW5lZCk6IHN0cmluZyA9PiB7XG4gIGNvbnN0IGJ1bmZpZ1RvbWwgPSBwYXJzZUJ1bmZpZ1RvbWwoZXhpc3RpbmdDb250ZW50KTtcbiAgcmV0dXJuIGBlbnYgPSBmYWxzZVxudGVsZW1ldHJ5ID0gZmFsc2VcblxuJHtnZW5lcmF0ZVJ1blNlY3Rpb24oYnVuZmlnVG9tbCl9XG5baW5zdGFsbF1cbmV4YWN0ID0gJHtidW5maWdUb21sPy5pbnN0YWxsPy5leGFjdCA9PT0gZmFsc2UgPyAnZmFsc2UnIDogJ3RydWUnfVxubGlua2VyID0gXCJob2lzdGVkXCJcbm1pbmltdW1SZWxlYXNlQWdlID0gNDMyMDAwICMgNSBkYXlzXG5taW5pbXVtUmVsZWFzZUFnZUV4Y2x1ZGVzID0gW1xuJHttaW5pbXVtUmVsZWFzZUFnZUV4Y2x1ZGVzLm1hcCgocGFja2FnZU5hbWUpID0+IGAgICAgXCIke3BhY2thZ2VOYW1lfVwiLGApLmpvaW4oJ1xcbicpfVxuXVxuYDtcbn07XG5cbmZ1bmN0aW9uIHBhcnNlQnVuZmlnVG9tbChjb250ZW50OiBzdHJpbmcgfCB1bmRlZmluZWQpOiBCdW5maWdUb21sIHwgdW5kZWZpbmVkIHtcbiAgaWYgKCFjb250ZW50KSB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuICB0cnkge1xuICAgIHJldHVybiBwYXJzZShjb250ZW50KSBhcyBCdW5maWdUb21sO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG59XG5cbmZ1bmN0aW9uIGdlbmVyYXRlUnVuU2VjdGlvbihidW5maWdUb21sOiBCdW5maWdUb21sIHwgdW5kZWZpbmVkKTogc3RyaW5nIHtcbiAgcmV0dXJuIHR5cGVvZiBidW5maWdUb21sPy5ydW4/LmJ1biA9PT0gJ2Jvb2xlYW4nID8gYFtydW5dXFxuYnVuID0gJHtidW5maWdUb21sLnJ1bi5idW59XFxuYCA6ICcnO1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuXG5jb25zdCB1c2VyQ29udGVudEhlYWRlciA9ICcjIFByb2plY3Qtc3BlY2lmaWMgc2V0dGluZ3MnO1xuY29uc3QgdXNlckNvbnRlbnRIZWFkZXJSZWdleCA9IC8jIFByb2plY3Qtc3BlY2lmaWMgc2V0dGluZ3NbXlxcbl0qXFxuL2dtO1xuY29uc3Qgc2VwYXJhdG9yID0gJyMgR2VuZXJhdGVkIGJ5IHdiZnknO1xuY29uc3Qgc2VwYXJhdG9yUHJlZml4ID0gJyMgR2VuZXJhdGVkIGJ5ICc7XG5jb25zdCBkZWZhdWx0SGVhZFVzZXJDb250ZW50ID0gYCR7dXNlckNvbnRlbnRIZWFkZXJ9IChoZWFkKVxuXG5cbiR7c2VwYXJhdG9yfVxuYDtcbmNvbnN0IGRlZmF1bHRUYWlsVXNlckNvbnRlbnQgPSBgXG4ke3VzZXJDb250ZW50SGVhZGVyfSAodGFpbClcbmA7XG5cbmV4cG9ydCBjb25zdCBpZ25vcmVGaWxlVXRpbCA9IHtcbiAgc2VwYXJhdG9yLFxuICBzZXBhcmF0b3JQcmVmaXgsXG4gIGRlZmF1bHRIZWFkVXNlckNvbnRlbnQsXG4gIGRlZmF1bHRUYWlsVXNlckNvbnRlbnQsXG4gIGFzeW5jIHJlYWRHaXRpZ25vcmVXaXRob3V0U2VwYXJhdG9ycyhmaWxlUGF0aDogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmcgfCB1bmRlZmluZWQ+IHtcbiAgICB0cnkge1xuICAgICAgbGV0IGNvbnRlbnQgPSBhd2FpdCBmcy5wcm9taXNlcy5yZWFkRmlsZShmaWxlUGF0aCwgJ3V0ZjgnKTtcbiAgICAgIGNvbnN0IGxhc3RIZWFkZXJJbmRleCA9IGdldEluZGV4T2ZUYWlsVXNlckNvbnRlbnRIZWFkZXIoY29udGVudCk7XG4gICAgICBpZiAobGFzdEhlYWRlckluZGV4ID4gMCkge1xuICAgICAgICBjb250ZW50ID0gY29udGVudC5zbGljZSgwLCBsYXN0SGVhZGVySW5kZXggLSAxKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiAoXG4gICAgICAgIGNvbnRlbnRcbiAgICAgICAgICAucmVwbGFjZUFsbCh1c2VyQ29udGVudEhlYWRlclJlZ2V4LCAnJylcbiAgICAgICAgICAucmVwbGFjZUFsbCgvIyBHZW5lcmF0ZWQgYnkgW15cXG5dKlxcbi9nbSwgJycpXG4gICAgICAgICAgLnJlcGxhY2VBbGwoL1xccj9cXG5cXHI/XFxuKFxccj9cXG4pKy9nbSwgJ1xcblxcbicpXG4gICAgICAgICAgLnRyaW0oKSArICdcXG4nXG4gICAgICApO1xuICAgIH0gY2F0Y2gge1xuICAgICAgLy8gZG8gbm90aGluZ1xuICAgIH1cbiAgfSxcbiAgZ2V0SGVhZFVzZXJDb250ZW50KGNvbnRlbnQ6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgY29uc3QgaW5kZXggPSBjb250ZW50LmluZGV4T2YodGhpcy5zZXBhcmF0b3JQcmVmaXgpO1xuICAgIGlmIChpbmRleCAhPT0gLTEpIHtcbiAgICAgIHJldHVybiBjb250ZW50XG4gICAgICAgIC5zbGljZSgwLCBjb250ZW50LmluZGV4T2YoJ1xcbicsIGluZGV4KSArIDEpXG4gICAgICAgIC5yZXBsYWNlQWxsKHVzZXJDb250ZW50SGVhZGVyUmVnZXgsIGAke3VzZXJDb250ZW50SGVhZGVyfSAoaGVhZClcXG5gKTtcbiAgICB9XG4gICAgcmV0dXJuIGRlZmF1bHRIZWFkVXNlckNvbnRlbnQ7XG4gIH0sXG4gIGdldFRhaWxVc2VyQ29udGVudChjb250ZW50OiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGNvbnN0IGxhc3RIZWFkZXJJbmRleCA9IGdldEluZGV4T2ZUYWlsVXNlckNvbnRlbnRIZWFkZXIoY29udGVudCk7XG4gICAgaWYgKGxhc3RIZWFkZXJJbmRleCA+IDApIHtcbiAgICAgIHJldHVybiBjb250ZW50LnNsaWNlKGxhc3RIZWFkZXJJbmRleCAtIDEpO1xuICAgIH1cbiAgICByZXR1cm4gZGVmYXVsdFRhaWxVc2VyQ29udGVudDtcbiAgfSxcbiAgYXN5bmMgaXNCZXJyeVplcm9JbnN0YWxsRW5hYmxlZChmaWxlUGF0aDogc3RyaW5nKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGNvbnRlbnQgPSBhd2FpdCBmcy5wcm9taXNlcy5yZWFkRmlsZShmaWxlUGF0aCwgJ3V0ZjgnKTtcbiAgICAgIHJldHVybiBjb250ZW50LmluY2x1ZGVzKCdcXG4hLnlhcm4vY2FjaGUnKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH0sXG59O1xuXG5mdW5jdGlvbiBnZXRJbmRleE9mVGFpbFVzZXJDb250ZW50SGVhZGVyKGNvbnRlbnQ6IHN0cmluZyk6IG51bWJlciB7XG4gIGNvbnN0IGluZGV4ID0gY29udGVudC5pbmRleE9mKHVzZXJDb250ZW50SGVhZGVyKTtcbiAgY29uc3QgbGFzdEluZGV4ID0gY29udGVudC5sYXN0SW5kZXhPZih1c2VyQ29udGVudEhlYWRlcik7XG4gIHJldHVybiBsYXN0SW5kZXggPiBpbmRleCA/IGxhc3RJbmRleCA6IC0xO1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZnNVdGlsIH0gZnJvbSAnLi4vdXRpbHMvZnNVdGlsLmpzJztcbmltcG9ydCB7IGlnbm9yZUZpbGVVdGlsIH0gZnJvbSAnLi4vdXRpbHMvaWdub3JlRmlsZVV0aWwuanMnO1xuaW1wb3J0IHsgcHJvbWlzZVBvb2wgfSBmcm9tICcuLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5cbi8vIEV4ZXJjb2Rl44Gn44Gvbm9kZV9tb2R1bGVz44KSQ09QWeOBmeOCi+W/heimgeOBjOOBguOCi+OBn+OCgeOAgW5vZGVfbW9kdWxlc+OCkumZpOWkluOBl+OBpuOBr+OBhOOBkeOBquOBhOOAglxuY29uc3QgY29tbW9uQ29udGVudCA9IGBcbioqLy5pZGVhXG4qKi8qLnNxbGl0ZTMqXG4qKi8ueWFybi9pbnN0YWxsLXN0YXRlLmd6XG4qKi8udmVudlxuYDtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlRG9ja2VyaWdub3JlKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2dlbmVyYXRlRG9ja2VyaWdub3JlJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnLmRvY2tlcmlnbm9yZScpO1xuICAgIGlmIChjb25maWcuZG9lc0NvbnRhaW5Eb2NrZXJmaWxlKSB7XG4gICAgICBjb25zdCBjb250ZW50ID0gKGF3YWl0IGZzVXRpbC5yZWFkRmlsZUlnbm9yaW5nRXJyb3IoZmlsZVBhdGgpKSA/PyAnJztcbiAgICAgIGNvbnN0IGhlYWRVc2VyQ29udGVudCA9IGlnbm9yZUZpbGVVdGlsLmdldEhlYWRVc2VyQ29udGVudChjb250ZW50KTtcbiAgICAgIGNvbnN0IHRhaWxVc2VyQ29udGVudCA9IGlnbm9yZUZpbGVVdGlsLmdldFRhaWxVc2VyQ29udGVudChjb250ZW50KTtcblxuICAgICAgY29uc3QgbmV3Q29udGVudCA9IGhlYWRVc2VyQ29udGVudCArIGNvbW1vbkNvbnRlbnQgKyB0YWlsVXNlckNvbnRlbnQ7XG4gICAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnNVdGlsLmdlbmVyYXRlRmlsZShmaWxlUGF0aCwgbmV3Q29udGVudCkpO1xuICAgIH0gZWxzZSB7XG4gICAgICBhd2FpdCBmcy5wcm9taXNlcy5ybShmaWxlUGF0aCwgeyBmb3JjZTogdHJ1ZSB9KTtcbiAgICB9XG4gIH0pO1xufVxuIiwiZXhwb3J0IGNvbnN0IGV4dGVuc2lvbnMgPSB7XG4gIGNvZGVXaXRoMkluZGVudFNpemU6IFtcbiAgICAnY2pzJyxcbiAgICAnbWpzJyxcbiAgICAnanMnLFxuICAgICdqc3gnLFxuICAgICdjdHMnLFxuICAgICdtdHMnLFxuICAgICd0cycsXG4gICAgJ3RzeCcsXG4gICAgJ2pzb24nLFxuICAgICdqc29uNScsXG4gICAgJ2pzb25jJyxcbiAgICAnY3BwJyxcbiAgICAnZGFydCcsXG4gICAgJ2h0bScsXG4gICAgJ2h0bWwnLFxuICAgICdwdScsXG4gICAgJ3B1bWwnLFxuICAgICdyYicsXG4gICAgJ3Z1ZScsXG4gICAgJ3htbCcsXG4gICAgJ3lhbWwnLFxuICAgICd5bWwnLFxuICAgICdzaCcsXG4gIF0udG9Tb3J0ZWQoKSxcbiAgY29kZVdpdGg0SW5kZW50U2l6ZTogWydnbycsICdncmFkbGUnLCAnamF2YScsICdweSddLnRvU29ydGVkKCksXG4gIG1hcmtkb3duTGlrZTogWydtZCddLnRvU29ydGVkKCksXG4gIG94bGludDogWydhc3RybycsICdjanMnLCAnY3RzJywgJ2pzJywgJ2pzeCcsICdtanMnLCAnbXRzJywgJ3N2ZWx0ZScsICd0cycsICd0c3gnLCAndnVlJ10udG9Tb3J0ZWQoKSxcbiAgb3hmbXQ6IFtcbiAgICAnYXN0cm8nLFxuICAgICdjanMnLFxuICAgICdjc3MnLFxuICAgICdjdHMnLFxuICAgICdncWwnLFxuICAgICdncmFwaHFsJyxcbiAgICAnaGJzJyxcbiAgICAnaHRtJyxcbiAgICAnaHRtbCcsXG4gICAgJ2pzJyxcbiAgICAnanNvbicsXG4gICAgJ2pzb241JyxcbiAgICAnanNvbmMnLFxuICAgICdqc3gnLFxuICAgICdsZXNzJyxcbiAgICAnbWQnLFxuICAgICdtZHgnLFxuICAgICdtanMnLFxuICAgICdtdHMnLFxuICAgICdzY3NzJyxcbiAgICAnc3ZlbHRlJyxcbiAgICAndG9tbCcsXG4gICAgJ3RzJyxcbiAgICAndHN4JyxcbiAgICAndnVlJyxcbiAgICAneWFtbCcsXG4gICAgJ3ltbCcsXG4gIF0udG9Tb3J0ZWQoKSxcbiAgcHJldHRpZXJPbmx5OiBbJ2phdmEnXS50b1NvcnRlZCgpLFxufTtcbiIsImltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGV4dGVuc2lvbnMgfSBmcm9tICcuLi91dGlscy9leHRlbnNpb25zLmpzJztcbmltcG9ydCB7IGZzVXRpbCB9IGZyb20gJy4uL3V0aWxzL2ZzVXRpbC5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcblxuY29uc3QgbmV3Q29udGVudCA9IGByb290ID0gdHJ1ZVxuXG5bKl1cbmNoYXJzZXQgPSB1dGYtOFxuZW5kX29mX2xpbmUgPSBsZlxuaW5zZXJ0X2ZpbmFsX25ld2xpbmUgPSB0cnVlXG50cmltX3RyYWlsaW5nX3doaXRlc3BhY2UgPSB0cnVlXG5cbiR7Z2VuZXJhdGVFeHRlbnNpb25zKGV4dGVuc2lvbnMuY29kZVdpdGgySW5kZW50U2l6ZSl9XG5pbmRlbnRfc2l6ZSA9IDJcbmluZGVudF9zdHlsZSA9IHNwYWNlXG5cbiR7Z2VuZXJhdGVFeHRlbnNpb25zKGV4dGVuc2lvbnMuY29kZVdpdGg0SW5kZW50U2l6ZSl9XG5pbmRlbnRfc2l6ZSA9IDRcbmluZGVudF9zdHlsZSA9IHNwYWNlXG5cbiR7Z2VuZXJhdGVFeHRlbnNpb25zKGV4dGVuc2lvbnMubWFya2Rvd25MaWtlKX1cbm1heF9saW5lX2xlbmd0aCA9IG9mZlxudHJpbV90cmFpbGluZ193aGl0ZXNwYWNlID0gZmFsc2VcblxuW3tNYWtlZmlsZSwqLm1rfV1cbmluZGVudF9zdHlsZSA9IHRhYlxuYDtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlRWRpdG9yY29uZmlnKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2dlbmVyYXRlRWRpdG9yY29uZmlnJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnLmVkaXRvcmNvbmZpZycpO1xuICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiBmc1V0aWwuZ2VuZXJhdGVGaWxlKGZpbGVQYXRoLCBuZXdDb250ZW50KSk7XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBnZW5lcmF0ZUV4dGVuc2lvbnMoZXh0ZW5zaW9uczogc3RyaW5nW10pOiBzdHJpbmcge1xuICByZXR1cm4gZXh0ZW5zaW9ucy5sZW5ndGggPiAxID8gYFsqLnske2V4dGVuc2lvbnMuam9pbignLCcpfX1dYCA6IGBbKi4ke2V4dGVuc2lvbnNbMF19XWA7XG59XG4iLCIvLyBveGxpbnQtZGlzYWJsZSBlc2xpbnQtcGx1Z2luLWltcG9ydC9uby1uYW1lZC1hcy1kZWZhdWx0LW1lbWJlciAtLSBOYW1lc3BhY2UgWUFNTCBjYWxscyBtYWtlIGxvYWQvZHVtcCB1c2FnZSBjbGVhcmVyLlxuaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IG1lcmdlIGZyb20gJ2RlZXBtZXJnZSc7XG5pbXBvcnQgeWFtbCBmcm9tICdqcy15YW1sJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZnNVdGlsIH0gZnJvbSAnLi4vdXRpbHMvZnNVdGlsLmpzJztcbmltcG9ydCB7IG92ZXJ3cml0ZU1lcmdlIH0gZnJvbSAnLi4vdXRpbHMvbWVyZ2VVdGlsLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuXG5pbXBvcnQgeyBnZW5lcmF0ZUFnZW50Q29kaW5nU3R5bGUgfSBmcm9tICcuL2FnZW50cy5qcyc7XG5cbmNvbnN0IGRlZmF1bHRDb25maWcgPSB7XG4gIGhhdmVfZnVuOiB0cnVlLFxuICBjb2RlX3Jldmlldzoge1xuICAgIGRpc2FibGU6IGZhbHNlLFxuICAgIGNvbW1lbnRfc2V2ZXJpdHlfdGhyZXNob2xkOiAnTUVESVVNJyxcbiAgICBtYXhfcmV2aWV3X2NvbW1lbnRzOiAtMSxcbiAgICBwdWxsX3JlcXVlc3Rfb3BlbmVkOiB7XG4gICAgICBoZWxwOiBmYWxzZSxcbiAgICAgIHN1bW1hcnk6IHRydWUsXG4gICAgICBjb2RlX3JldmlldzogdHJ1ZSxcbiAgICB9LFxuICB9LFxuICBpZ25vcmVfcGF0dGVybnM6IFsnKiovX19nZW5lcmF0ZWRfXyddLFxufTtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlR2VtaW5pQ29uZmlnKGNvbmZpZzogUGFja2FnZUNvbmZpZywgYWxsQ29uZmlnczogUGFja2FnZUNvbmZpZ1tdKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZ2VuZXJhdGVHZW1pbmlDb25maWcnLCBhc3luYyAoKSA9PiB7XG4gICAgaWYgKCFjb25maWcuaXNSb290KSByZXR1cm47XG5cbiAgICBjb25zdCBkaXJQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnLmdlbWluaScpO1xuICAgIGNvbnN0IGNvbmZpZ0ZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKGRpclBhdGgsICdjb25maWcueW1sJyk7XG4gICAgY29uc3Qgc3R5bGVndWlkZUZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKGRpclBhdGgsICdzdHlsZWd1aWRlLm1kJyk7XG4gICAgY29uc3QgYWdlbnRzRXh0cmFQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnQUdFTlRTX0VYVFJBLm1kJyk7XG5cbiAgICBsZXQgbmV3Q29uZmlnOiBvYmplY3QgPSBzdHJ1Y3R1cmVkQ2xvbmUoZGVmYXVsdENvbmZpZyk7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IG9sZENvbnRlbnQgPSBhd2FpdCBmcy5wcm9taXNlcy5yZWFkRmlsZShjb25maWdGaWxlUGF0aCwgJ3V0ZjgnKTtcbiAgICAgIGNvbnN0IG9sZENvbmZpZyA9IHlhbWwubG9hZChvbGRDb250ZW50KSBhcyBvYmplY3Q7XG4gICAgICBuZXdDb25maWcgPSBtZXJnZS5hbGwoW25ld0NvbmZpZywgb2xkQ29uZmlnLCBuZXdDb25maWddLCB7IGFycmF5TWVyZ2U6IG92ZXJ3cml0ZU1lcmdlIH0pO1xuICAgIH0gY2F0Y2gge1xuICAgICAgLy8gZG8gbm90aGluZyAtIGZpbGUgZG9lc24ndCBleGlzdCBvciBjYW4ndCBiZSBwYXJzZWRcbiAgICB9XG5cbiAgICBjb25zdCB5YW1sQ29udGVudCA9IHlhbWwuZHVtcChuZXdDb25maWcsIHtcbiAgICAgIGxpbmVXaWR0aDogLTEsXG4gICAgICBub0NvbXBhdE1vZGU6IHRydWUsXG4gICAgICBzdHlsZXM6IHtcbiAgICAgICAgJyEhbnVsbCc6ICdlbXB0eScsXG4gICAgICB9LFxuICAgIH0pO1xuXG4gICAgY29uc3QgZXh0cmFDb250ZW50ID0gYXdhaXQgZnNVdGlsLnJlYWRGaWxlSWdub3JpbmdFcnJvcihhZ2VudHNFeHRyYVBhdGgpO1xuICAgIGNvbnN0IGNvZGluZ1J1bGVFeHRyYUNvbnRlbnQgPSBleHRyYUNvbnRlbnQ/LnRyaW1TdGFydCgpLnN0YXJ0c1dpdGgoJyMnKSA/IHVuZGVmaW5lZCA6IGV4dHJhQ29udGVudDtcbiAgICBjb25zdCByZXZpZXdMYW5ndWFnZUluc3RydWN0aW9uID0gY29uZmlnLmlzUHVibGljUmVwb1xuICAgICAgPyAnUmV2aWV3IGluIEVuZ2xpc2ggYmFzZWQgb24gdGhlIGZvbGxvd2luZyBjb2Rpbmcgc3RhbmRhcmRzLidcbiAgICAgIDogJ+S7peS4i+OBruOCs+ODvOODh+OCo+ODs+OCsOimj+e0hOOCkui4j+OBvuOBiOOBpuOAgeaXpeacrOiqnuOBp+ODrOODk+ODpeODvOOBl+OBpuOBj+OBoOOBleOBhOOAgic7XG4gICAgY29uc3Qgc3R5bGVndWlkZUNvbnRlbnQgPSBgJHtyZXZpZXdMYW5ndWFnZUluc3RydWN0aW9ufVxcblxcbiR7Z2VuZXJhdGVBZ2VudENvZGluZ1N0eWxlKGFsbENvbmZpZ3MpfSR7XG4gICAgICBjb2RpbmdSdWxlRXh0cmFDb250ZW50ID8gYFxcbiR7Y29kaW5nUnVsZUV4dHJhQ29udGVudC50cmltRW5kKCl9YCA6ICcnXG4gICAgfWA7XG5cbiAgICBjb25zdCBwcm9taXNlcyA9IFtcbiAgICAgIHByb21pc2VQb29sLnJ1bigoKSA9PiBmc1V0aWwuZ2VuZXJhdGVGaWxlKGNvbmZpZ0ZpbGVQYXRoLCB5YW1sQ29udGVudCkpLFxuICAgICAgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzVXRpbC5nZW5lcmF0ZUZpbGUoc3R5bGVndWlkZUZpbGVQYXRoLCBzdHlsZWd1aWRlQ29udGVudCkpLFxuICAgIF07XG4gICAgYXdhaXQgUHJvbWlzZS5hbGwocHJvbWlzZXMpO1xuICB9KTtcbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJlbW92ZUdlbWluaVNldHRpbmdzKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2dlbmVyYXRlR2VtaW5pU2V0dGluZ3MnLCBhc3luYyAoKSA9PiB7XG4gICAgaWYgKCFjb25maWcuaXNSb290KSByZXR1cm47XG5cbiAgICBjb25zdCBkaXJQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnLmdlbWluaScpO1xuICAgIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKGRpclBhdGgsICdzZXR0aW5ncy5qc29uJyk7XG4gICAgYXdhaXQgZnMucHJvbWlzZXMucm0oZmlsZVBhdGgsIHsgZm9yY2U6IHRydWUgfSk7XG4gIH0pO1xufVxuIiwiaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZXh0ZW5zaW9ucyB9IGZyb20gJy4uL3V0aWxzL2V4dGVuc2lvbnMuanMnO1xuaW1wb3J0IHsgZnNVdGlsIH0gZnJvbSAnLi4vdXRpbHMvZnNVdGlsLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuXG4vLyBjZi4gaHR0cHM6Ly9idW4uc2gvZ3VpZGVzL2luc3RhbGwvZ2l0LWRpZmYtYnVuLWxvY2tmaWxlXG5jb25zdCBuZXdDb250ZW50ID0gYCogdGV4dD1hdXRvXG5cbioubG9ja2IgYmluYXJ5IGRpZmY9bG9ja2JcbioudmNwcm9qIHRleHQgZW9sPWNybGZcblxuJHtbLi4uZXh0ZW5zaW9ucy5jb2RlV2l0aDJJbmRlbnRTaXplLCAuLi5leHRlbnNpb25zLmNvZGVXaXRoNEluZGVudFNpemUsIC4uLmV4dGVuc2lvbnMubWFya2Rvd25MaWtlXVxuICAubWFwKChleHQpID0+IGAqLiR7ZXh0fSB0ZXh0IGVvbD1sZmApXG4gIC5qb2luKCdcXG4nKX1cblxuZGlzdC8qKiBsaW5ndWlzdC1nZW5lcmF0ZWQ9dHJ1ZVxuYDtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlR2l0YXR0cmlidXRlcyhjb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdnZW5lcmF0ZUdpdGF0dHJpYnV0ZXMnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICcuZ2l0YXR0cmlidXRlcycpO1xuICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiBmc1V0aWwuZ2VuZXJhdGVGaWxlKGZpbGVQYXRoLCBuZXdDb250ZW50KSk7XG4gIH0pO1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IG9zIGZyb20gJ25vZGU6b3MnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB7IG9wdGlvbnMgfSBmcm9tICcuLi9vcHRpb25zLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZnNVdGlsIH0gZnJvbSAnLi4vdXRpbHMvZnNVdGlsLmpzJztcbmltcG9ydCB7IGlnbm9yZUZpbGVVdGlsIH0gZnJvbSAnLi4vdXRpbHMvaWdub3JlRmlsZVV0aWwuanMnO1xuaW1wb3J0IHsgcHJvbWlzZVBvb2wgfSBmcm9tICcuLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5cbi8vIERvIG5vdCByZW1vdmUgYHdpbmRvd3NgOiBnZW5lcmF0ZWQgLmdpdGlnbm9yZSBmaWxlcyBtdXN0IGtlZXAgaWdub3JpbmcgV2luZG93cy1jcmVhdGVkIGxvY2FsIGFydGlmYWN0cy5cbmNvbnN0IGRlZmF1bHROYW1lcyA9IFsnd2luZG93cycsICdtYWNvcycsICdsaW51eCcsICdqZXRicmFpbnMnLCAndmlzdWFsc3R1ZGlvY29kZScsICdlbWFjcycsICd2aW0nLCAneWFybiddO1xuXG5jb25zdCBjb21tb25Db250ZW50ID0gYFxuIS5rZWVwXG4uYWlkZXIqXG4uZW52LnByb2R1Y3Rpb25cbiovbW91bnQvKi5oYXNoXG4uZGV2Y29udGFpbmVyL1xuLmlkZWEvQXVnbWVudFdlYnZpZXdTdGF0ZVN0b3JlLnhtbFxuLmlkZWEvY29waWxvdC4qXG4uaWRlYS9jb3BpbG90L2NoYXRTZXNzaW9ucy9cbi5wbGF5d3JpZ2h0LWNsaS9cbi5zZXJlbmEvXG4udG1wL1xuLndiL1xuX19nZW5lcmF0ZWRfXy9cbkB3aWxsYm9vc3Rlci9cbmRpc3QvXG5kcml6emxlL21vdW50L1xudGVtcC9cbnRtcC9cbmA7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZW5lcmF0ZUdpdGlnbm9yZShjb25maWc6IFBhY2thZ2VDb25maWcsIHJvb3RDb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdnZW5lcmF0ZUdpdGlnbm9yZScsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJy5naXRpZ25vcmUnKTtcbiAgICBjb25zdCBjb250ZW50ID0gKGF3YWl0IGZzVXRpbC5yZWFkRmlsZUlnbm9yaW5nRXJyb3IoZmlsZVBhdGgpKSA/PyAnJztcbiAgICBsZXQgaGVhZFVzZXJDb250ZW50ID0gaWdub3JlRmlsZVV0aWwuZ2V0SGVhZFVzZXJDb250ZW50KGNvbnRlbnQpICsgY29tbW9uQ29udGVudDtcbiAgICBjb25zdCB0YWlsVXNlckNvbnRlbnQgPSBpZ25vcmVGaWxlVXRpbC5nZXRUYWlsVXNlckNvbnRlbnQoY29udGVudCk7XG5cbiAgICBjb25zdCBuYW1lcyA9IFsuLi5kZWZhdWx0TmFtZXNdO1xuICAgIGlmIChjb25maWcuZG9lc0NvbnRhaW5HZW1maWxlKSB7XG4gICAgICBuYW1lcy5wdXNoKCdydWJ5Jyk7XG4gICAgfVxuICAgIGlmIChjb25maWcuZG9lc0NvbnRhaW5Hb01vZCkge1xuICAgICAgbmFtZXMucHVzaCgnZ28nKTtcbiAgICAgIGhlYWRVc2VyQ29udGVudCArPSBgJHtwYXRoLmJhc2VuYW1lKGNvbmZpZy5kaXJQYXRoKX1cbmA7XG4gICAgfVxuICAgIGlmIChjb25maWcuZG9lc0NvbnRhaW5QYWNrYWdlSnNvbikge1xuICAgICAgbmFtZXMucHVzaCgnbm9kZScpO1xuICAgIH1cbiAgICBpZiAoY29uZmlnLmRvZXNDb250YWluUG9tWG1sKSB7XG4gICAgICBuYW1lcy5wdXNoKCdtYXZlbicpO1xuICAgICAgaGVhZFVzZXJDb250ZW50ICs9IGAuaWRlYS9nb29nbGUtamF2YS1mb3JtYXQueG1sXG5gO1xuICAgIH1cbiAgICBpZiAoY29uZmlnLmRvZXNDb250YWluUHVic3BlY1lhbWwpIHtcbiAgICAgIG5hbWVzLnB1c2goJ2ZsdXR0ZXInLCAnQW5kcm9pZFN0dWRpbycsICdydWJ5Jyk7XG4gICAgICBoZWFkVXNlckNvbnRlbnQgKz0gYC5mbHV0dGVyLXBsdWdpbnMtZGVwZW5kZW5jaWVzXG5hbmRyb2lkL2tleS5wcm9wZXJ0aWVzXG5pb3MvLmJ1bmRsZVxuLmlkZWEvcnVuQ29uZmlndXJhdGlvbnMueG1sXG5gO1xuICAgIH1cbiAgICBpZiAoY29uZmlnLmRvZXNDb250YWluVGVtcGxhdGVZYW1sKSB7XG4gICAgICBoZWFkVXNlckNvbnRlbnQgKz0gYC5hd3Mtc2FtL1xucGFja2FnZWQueWFtbFxuYDtcbiAgICB9XG4gICAgLy8gQmVjYXVzZSAudmVudiBzaG91bGQgYmUgaWdub3JlZCBvbiByb290IGRpcmVjdG9yeVxuICAgIGlmIChjb25maWcuZG9lc0NvbnRhaW5Qb2V0cnlMb2NrIHx8IGNvbmZpZy5kb2VzQ29udGFpblV2TG9jaykge1xuICAgICAgbmFtZXMucHVzaCgncHl0aG9uJyk7XG4gICAgICBoZWFkVXNlckNvbnRlbnQgKz0gYC52ZW52L1xuYDtcbiAgICB9XG5cbiAgICBpZiAoY29uZmlnLmRlcGVuZGluZy5ibGl0eikge1xuICAgICAgaGVhZFVzZXJDb250ZW50ICs9IGAuYmxpdHovXG4uYmxpdHoqKlxuYDtcbiAgICB9XG4gICAgaWYgKGNvbmZpZy5kZXBlbmRpbmcubmV4dCkge1xuICAgICAgbmFtZXMucHVzaCgnbmV4dGpzJyk7XG4gICAgfVxuICAgIGlmIChyb290Q29uZmlnLmRlcGVuZGluZy5maXJlYmFzZSB8fCBjb25maWcuZGVwZW5kaW5nLmZpcmViYXNlKSB7XG4gICAgICBuYW1lcy5wdXNoKCdmaXJlYmFzZScpO1xuICAgIH1cbiAgICBpZiAoY29uZmlnLmRlcGVuZGluZy5wcmlzbWEpIHtcbiAgICAgIGhlYWRVc2VyQ29udGVudCArPSBgKi5zcWxpdGUzKlxuYDtcbiAgICB9XG4gICAgaWYgKGNvbmZpZy5kZXBlbmRpbmcucGxheXdyaWdodFRlc3QpIHtcbiAgICAgIGhlYWRVc2VyQ29udGVudCArPSBgcGxheXdyaWdodC1yZXBvcnQvXG50ZXN0LXJlc3VsdHMvXG5gO1xuICAgIH1cbiAgICBpZiAocm9vdENvbmZpZy5kZXBlbmRpbmcucmVhY3ROYXRpdmUgfHwgY29uZmlnLmRlcGVuZGluZy5yZWFjdE5hdGl2ZSkge1xuICAgICAgbmFtZXMucHVzaCgncmVhY3RuYXRpdmUnKTtcbiAgICAgIGhlYWRVc2VyQ29udGVudCArPSBgZ29vZ2xlLXNlcnZpY2VzLmpzb25cbmFuZHJvaWQvYXBwL3NyYy9tYWluL2Fzc2V0cy9cbmA7XG4gICAgfVxuICAgIGlmIChjb25maWcuZGVwZW5kaW5nLnN0b3J5Ym9vaykge1xuICAgICAgbmFtZXMucHVzaCgnc3Rvcnlib29ranMnKTtcbiAgICB9XG4gICAgaWYgKGNvbmZpZy5kZXBlbmRpbmcubGl0ZXN0cmVhbSkge1xuICAgICAgaGVhZFVzZXJDb250ZW50ICs9IGBnY3Atc2Eta2V5Lmpzb25cbmA7XG4gICAgfVxuXG4gICAgbGV0IGdlbmVyYXRlZCA9ICcnO1xuICAgIGZvciAoY29uc3QgbmFtZSBvZiBuYW1lcykge1xuICAgICAgbGV0IGNvbnRlbnQgPSAoYXdhaXQgcmVhZENhY2hlKG5hbWUpKSA/PyAnJztcbiAgICAgIGlmICghY29udGVudCkge1xuICAgICAgICBjb25zdCB1cmwgPSBgaHR0cHM6Ly93d3cudG9wdGFsLmNvbS9kZXZlbG9wZXJzL2dpdGlnbm9yZS9hcGkvJHtuYW1lfWA7XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2godXJsKTtcbiAgICAgICAgY29uc3QgcmVzcG9uc2VUZXh0ID0gYXdhaXQgcmVzcG9uc2UudGV4dCgpO1xuICAgICAgICBpZiAoIXJlc3BvbnNlLm9rIHx8IHJlc3BvbnNlVGV4dC5pbmNsdWRlcygnQXR0ZW50aW9uIFJlcXVpcmVkIScpIHx8IHJlc3BvbnNlVGV4dC5pbmNsdWRlcygnPHRpdGxlPicpKSB7XG4gICAgICAgICAgY29uc29sZS5lcnJvcihgRmFpbGVkIHRvIGZldGNoICR7dXJsfWApO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb250ZW50ID0gcmVzcG9uc2VUZXh0LnRyaW0oKTtcbiAgICAgICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IHdyaXRlQ2FjaGUobmFtZSwgY29udGVudCkpO1xuICAgICAgICBpZiAob3B0aW9ucy5pc1ZlcmJvc2UpIHtcbiAgICAgICAgICBjb25zb2xlLmluZm8oYEZldGNoZWQgJHt1cmx9YCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChnZW5lcmF0ZWQpIGdlbmVyYXRlZCArPSAnXFxuJztcbiAgICAgIGdlbmVyYXRlZCArPSBjb250ZW50ICsgJ1xcbic7XG4gICAgfVxuICAgIGlmICghKGF3YWl0IGlnbm9yZUZpbGVVdGlsLmlzQmVycnlaZXJvSW5zdGFsbEVuYWJsZWQoZmlsZVBhdGgpKSkge1xuICAgICAgZ2VuZXJhdGVkID0gZ2VuZXJhdGVkLnJlcGxhY2UoJyEueWFybi9jYWNoZScsICcjICEueWFybi9jYWNoZScpLnJlcGxhY2UoJyMgLnBucC4qJywgJy5wbnAuKicpO1xuICAgIH1cbiAgICBpZiAoY29uZmlnLmRvZXNDb250YWluUG9tWG1sIHx8IGNvbmZpZy5kb2VzQ29udGFpblB1YnNwZWNZYW1sKSB7XG4gICAgICBnZW5lcmF0ZWQgPSBnZW5lcmF0ZWRcbiAgICAgICAgLnJlcGxhY2VBbGwoL14jIC5pZGVhXFwvYXJ0aWZhY3RzJC9nbSwgJy5pZGVhL2FydGlmYWN0cycpXG4gICAgICAgIC5yZXBsYWNlQWxsKC9eIyAuaWRlYVxcL2NvbXBpbGVyLnhtbCQvZ20sICcuaWRlYS9jb21waWxlci54bWwnKVxuICAgICAgICAucmVwbGFjZUFsbCgvXiMgLmlkZWFcXC9qYXJSZXBvc2l0b3JpZXMueG1sJC9nbSwgJy5pZGVhL2phclJlcG9zaXRvcmllcy54bWwnKVxuICAgICAgICAucmVwbGFjZUFsbCgvXiMgLmlkZWFcXC9tb2R1bGVzLnhtbCQvZ20sICcuaWRlYS9tb2R1bGVzLnhtbCcpXG4gICAgICAgIC5yZXBsYWNlQWxsKC9eIyAuaWRlYVxcLyouaW1sJC9nbSwgJy5pZGVhLyouaW1sJylcbiAgICAgICAgLnJlcGxhY2VBbGwoL14jIC5pZGVhXFwvbW9kdWxlcyQvZ20sICcuaWRlYS9tb2R1bGVzJylcbiAgICAgICAgLnJlcGxhY2VBbGwoL14jICouaW1sJC9nbSwgJyouaW1sJylcbiAgICAgICAgLnJlcGxhY2VBbGwoL14jICouaXByJC9nbSwgJyouaXByJyk7XG4gICAgICBpZiAoY29uZmlnLmRvZXNDb250YWluUHVic3BlY1lhbWwpIHtcbiAgICAgICAgZ2VuZXJhdGVkID0gZ2VuZXJhdGVkLnJlcGxhY2VBbGwoL14uaWRlYVxcL21vZHVsZXMueG1sJC9nbSwgJyMgLmlkZWEvbW9kdWxlcy54bWwnKTtcbiAgICAgIH1cbiAgICB9XG4gICAgZ2VuZXJhdGVkID0gZ2VuZXJhdGVkLnJlcGxhY2VBbGwoL14uaWRlYVxcLz8kL2dtLCAnIyAuaWRlYScpO1xuICAgIGlmIChyb290Q29uZmlnLmRlcGVuZGluZy5yZWFjdE5hdGl2ZSB8fCBjb25maWcuZGVwZW5kaW5nLnJlYWN0TmF0aXZlIHx8IGNvbmZpZy5kb2VzQ29udGFpblB1YnNwZWNZYW1sKSB7XG4gICAgICBnZW5lcmF0ZWQgPSBnZW5lcmF0ZWQucmVwbGFjZUFsbCgvXiguaWRlYVxcLy4rKSQvZ20sICckMVxcbmFuZHJvaWQvJDEnKTtcbiAgICB9XG4gICAgY29uc3QgbmV3Q29udGVudCA9IGhlYWRVc2VyQ29udGVudCArICdcXG4nICsgZ2VuZXJhdGVkICsgdGFpbFVzZXJDb250ZW50O1xuICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiBmc1V0aWwuZ2VuZXJhdGVGaWxlKGZpbGVQYXRoLCBuZXdDb250ZW50KSk7XG4gIH0pO1xufVxuXG5jb25zdCBkaXJQYXRoID0gcGF0aC5qb2luKG9zLmhvbWVkaXIoKSwgJy5jYWNoZScsICd3YmZ5JywgJ2dpdGlnbm9yZScpO1xuXG5hc3luYyBmdW5jdGlvbiB3cml0ZUNhY2hlKG5hbWU6IHN0cmluZywgY29udGVudDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gIGF3YWl0IGZzLnByb21pc2VzLm1rZGlyKGRpclBhdGgsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICBhd2FpdCBmcy5wcm9taXNlcy53cml0ZUZpbGUocGF0aC5qb2luKGRpclBhdGgsIG5hbWUpLCBjb250ZW50KTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gcmVhZENhY2hlKG5hbWU6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nIHwgdW5kZWZpbmVkPiB7XG4gIHRyeSB7XG4gICAgY29uc3Qgc3RhdCA9IGF3YWl0IGZzLnByb21pc2VzLnN0YXQocGF0aC5qb2luKGRpclBhdGgsIG5hbWUpKTtcbiAgICBpZiAoRGF0ZS5ub3coKSAtIHN0YXQubXRpbWVNcyA+IDYgKiA2MCAqIDYwICogMTAwMCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICByZXR1cm4gYXdhaXQgZnMucHJvbWlzZXMucmVhZEZpbGUocGF0aC5qb2luKGRpclBhdGgsIG5hbWUpLCAndXRmOCcpO1xuICB9IGNhdGNoIHtcbiAgICAvLyBkbyBub3RoaW5nXG4gIH1cbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGV4dGVuc2lvbnMgfSBmcm9tICcuLi91dGlscy9leHRlbnNpb25zLmpzJztcbmltcG9ydCB7IGZzVXRpbCB9IGZyb20gJy4uL3V0aWxzL2ZzVXRpbC5qcyc7XG5pbXBvcnQgeyBkb2VzQ29udGFpbkphdmEsIGRvZXNDb250YWluSnNPclRzIH0gZnJvbSAnLi4vdXRpbHMvcGFja2FnZUNhcGFiaWxpdGllcy5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlSWRlYVNldHRpbmdzKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2dlbmVyYXRlSWRlYVNldHRpbmdzJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IGRpclBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICcuaWRlYScpO1xuICAgIGlmIChmcy5leGlzdHNTeW5jKGRpclBhdGgpKSB7XG4gICAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShkaXJQYXRoLCAnd2F0Y2hlclRhc2tzLnhtbCcpO1xuICAgICAgYXdhaXQgKGRvZXNDb250YWluSnNPclRzKGNvbmZpZykgfHwgZG9lc0NvbnRhaW5KYXZhKGNvbmZpZylcbiAgICAgICAgPyBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnNVdGlsLmdlbmVyYXRlRmlsZShmaWxlUGF0aCwgZ2V0V2F0Y2hlclRhc2tzQ29udGVudChjb25maWcpKSlcbiAgICAgICAgOiBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnMucHJvbWlzZXMucm0oZmlsZVBhdGgsIHsgZm9yY2U6IHRydWUgfSkpKTtcbiAgICB9XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBjcmVhdGVUYXNrT3B0aW9ucyhydW5uZXI6IHN0cmluZywgYXJnczogc3RyaW5nLCBuYW1lOiBzdHJpbmcsIGV4dGVuc2lvbjogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIGAgICAgPFRhc2tPcHRpb25zIGlzRW5hYmxlZD1cInRydWVcIj5cbiAgICAgIDxvcHRpb24gbmFtZT1cImFyZ3VtZW50c1wiIHZhbHVlPVwiJHthcmdzfSAkRmlsZVBhdGhSZWxhdGl2ZVRvUHJvamVjdFJvb3QkXCIgLz5cbiAgICAgIDxvcHRpb24gbmFtZT1cImNoZWNrU3ludGF4RXJyb3JzXCIgdmFsdWU9XCJmYWxzZVwiIC8+XG4gICAgICA8b3B0aW9uIG5hbWU9XCJkZXNjcmlwdGlvblwiIC8+XG4gICAgICA8b3B0aW9uIG5hbWU9XCJleGl0Q29kZUJlaGF2aW9yXCIgdmFsdWU9XCJFUlJPUlwiIC8+XG4gICAgICA8b3B0aW9uIG5hbWU9XCJmaWxlRXh0ZW5zaW9uXCIgdmFsdWU9XCIke2V4dGVuc2lvbn1cIiAvPlxuICAgICAgPG9wdGlvbiBuYW1lPVwiaW1tZWRpYXRlU3luY1wiIHZhbHVlPVwiZmFsc2VcIiAvPlxuICAgICAgPG9wdGlvbiBuYW1lPVwibmFtZVwiIHZhbHVlPVwiJHtuYW1lfSAoLiR7ZXh0ZW5zaW9ufSlcIiAvPlxuICAgICAgPG9wdGlvbiBuYW1lPVwib3V0cHV0XCIgdmFsdWU9XCIkRmlsZVBhdGhSZWxhdGl2ZVRvUHJvamVjdFJvb3QkXCIgLz5cbiAgICAgIDxvcHRpb24gbmFtZT1cIm91dHB1dEZpbHRlcnNcIj5cbiAgICAgICAgPGFycmF5IC8+XG4gICAgICA8L29wdGlvbj5cbiAgICAgIDxvcHRpb24gbmFtZT1cIm91dHB1dEZyb21TdGRvdXRcIiB2YWx1ZT1cImZhbHNlXCIgLz5cbiAgICAgIDxvcHRpb24gbmFtZT1cInByb2dyYW1cIiB2YWx1ZT1cIiR7cnVubmVyfVwiIC8+XG4gICAgICA8b3B0aW9uIG5hbWU9XCJydW5PbkV4dGVybmFsQ2hhbmdlc1wiIHZhbHVlPVwiZmFsc2VcIiAvPlxuICAgICAgPG9wdGlvbiBuYW1lPVwic2NvcGVOYW1lXCIgdmFsdWU9XCJQcm9qZWN0IEZpbGVzXCIgLz5cbiAgICAgIDxvcHRpb24gbmFtZT1cInRyYWNrT25seVJvb3RcIiB2YWx1ZT1cImZhbHNlXCIgLz5cbiAgICAgIDxvcHRpb24gbmFtZT1cIndvcmtpbmdEaXJcIiB2YWx1ZT1cIiRQcm9qZWN0RmlsZURpciRcIiAvPlxuICAgICAgPGVudnMgLz5cbiAgICA8L1Rhc2tPcHRpb25zPlxuYDtcbn1cblxuZnVuY3Rpb24gZ2V0V2F0Y2hlclRhc2tzQ29udGVudChjb25maWc6IFBhY2thZ2VDb25maWcpOiBzdHJpbmcge1xuICByZXR1cm4gYDw/eG1sIHZlcnNpb249XCIxLjBcIiBlbmNvZGluZz1cIlVURi04XCI/PlxuPHByb2plY3QgdmVyc2lvbj1cIjRcIj5cbiAgPGNvbXBvbmVudCBuYW1lPVwiUHJvamVjdFRhc2tzT3B0aW9uc1wiPlxuJHtkb2VzQ29udGFpbkpzT3JUcyhjb25maWcpID8gZXh0ZW5zaW9ucy5veGZtdC5tYXAoKGV4dCkgPT4gY3JlYXRlVGFza09wdGlvbnMoJ25vZGUnLCAnbm9kZV9tb2R1bGVzLy5iaW4vb3hmbXQgLS13cml0ZSAtLW5vLWVycm9yLW9uLXVubWF0Y2hlZC1wYXR0ZXJuICEqKi9wYWNrYWdlLmpzb24nLCAnT3hmbXQnLCBleHQpKS5qb2luKCcnKSA6ICcnfVxuJHtkb2VzQ29udGFpbkphdmEoY29uZmlnKSA/IGV4dGVuc2lvbnMucHJldHRpZXJPbmx5Lm1hcCgoZXh0KSA9PiBjcmVhdGVUYXNrT3B0aW9ucygnbm9kZScsICdub2RlX21vZHVsZXMvLmJpbi9wcmV0dGllciAtLWNhY2hlIC0td3JpdGUnLCAnUHJldHRpZXInLCBleHQpKS5qb2luKCcnKSA6ICcnfVxuICA8L2NvbXBvbmVudD5cbjwvcHJvamVjdD5cbmA7XG59XG4iLCJpbXBvcnQgdHlwZSB7IFBhY2thZ2VKc29uIH0gZnJvbSAndHlwZS1mZXN0JztcblxuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRHZW5JMThuVHNDb21tYW5kKFxuICBjb25maWc6IFBpY2s8UGFja2FnZUNvbmZpZywgJ2RlcGVuZGluZycgfCAnaXNCdW4nPixcbiAgc2NyaXB0czogUGFja2FnZUpzb24uU2NyaXB0cyB8IHVuZGVmaW5lZFxuKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgaWYgKCFjb25maWcuZGVwZW5kaW5nLmdlbkkxOG5UcyB8fCAhc2NyaXB0cz8uWydnZW4taTE4bi10cyddKSByZXR1cm4gdW5kZWZpbmVkO1xuICByZXR1cm4gYCR7Y29uZmlnLmlzQnVuID8gJ2J1bicgOiAneWFybid9IHJ1biBnZW4taTE4bi10cyA+IC9kZXYvbnVsbGA7XG59XG4iLCJpbXBvcnQgdHlwZSB7IFNwYXduU3luY09wdGlvbnMgfSBmcm9tICdub2RlOmNoaWxkX3Byb2Nlc3MnO1xuaW1wb3J0IGNoaWxkX3Byb2Nlc3MgZnJvbSAnbm9kZTpjaGlsZF9wcm9jZXNzJztcblxuZXhwb3J0IGZ1bmN0aW9uIHNwYXduU3luYyhjb21tYW5kOiBzdHJpbmcsIGFyZ3M6IHN0cmluZ1tdLCBjd2Q6IHN0cmluZywgcmV0cnkgPSAwKTogdm9pZCB7XG4gIHNwYXduU3luY0FuZFJldHVyblN0YXR1cyhjb21tYW5kLCBhcmdzLCBjd2QsIHJldHJ5KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHNwYXduU3luY0FuZFJldHVyblN0YXR1cyhjb21tYW5kOiBzdHJpbmcsIGFyZ3M6IHN0cmluZ1tdLCBjd2Q6IHN0cmluZywgcmV0cnkgPSAwKTogbnVtYmVyIHtcbiAgZG8ge1xuICAgIGNvbnN0IFtuZXdDbWQsIG5ld0FyZ3MsIG9wdGlvbnNdID0gZ2V0U3Bhd25TeW5jQXJncyhjb21tYW5kLCBhcmdzLCBjd2QpO1xuICAgIGNvbnNvbGUubG9nKGAkICR7bmV3Q21kfSAke25ld0FyZ3Muam9pbignICcpfSBhdCAke2N3ZH1gKTtcbiAgICBjb25zdCByZXQgPSBjaGlsZF9wcm9jZXNzLnNwYXduU3luYyhuZXdDbWQsIG5ld0FyZ3MsIG9wdGlvbnMpO1xuICAgIGNvbnN0IHN0YXR1cyA9IHJldC5zdGF0dXMgPz8gMTtcbiAgICBpZiAoc3RhdHVzID09PSAwKSBicmVhaztcbiAgICBpZiAocmV0cnkgPD0gMCkgcmV0dXJuIHN0YXR1cztcbiAgfSB3aGlsZSAoLS1yZXRyeSA+PSAwKTtcbiAgcmV0dXJuIDA7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBzcGF3blN5bmNBbmRSZXR1cm5TdGRvdXQoY29tbWFuZDogc3RyaW5nLCBhcmdzOiBzdHJpbmdbXSwgY3dkOiBzdHJpbmcpOiBzdHJpbmcge1xuICBjb25zdCBbbmV3Q21kLCBuZXdBcmdzLCBvcHRpb25zXSA9IGdldFNwYXduU3luY0FyZ3MoY29tbWFuZCwgYXJncywgY3dkKTtcbiAgb3B0aW9ucy5zdGRpbyA9ICdwaXBlJztcbiAgY29uc3QgcHJvYyA9IGNoaWxkX3Byb2Nlc3Muc3Bhd25TeW5jKG5ld0NtZCwgbmV3QXJncywgb3B0aW9ucyk7XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW5uZWNlc3NhcnktY29uZGl0aW9uIC0tIHNwYXduU3luYyByZXR1cm5zIG51bGwgc3RkZXJyIG9uIEVOT0VOVC5cbiAgY29uc3Qgc3RkZXJyID0gcHJvYy5zdGRlcnIgPz8gJyc7XG4gIGNvbnN0IGVycm9yID0gdHlwZW9mIHN0ZGVyciA9PT0gJ3N0cmluZycgPyBzdGRlcnIudHJpbSgpIDogc3RkZXJyLnRvU3RyaW5nKCkudHJpbSgpO1xuICBpZiAocHJvYy5lcnJvcikge1xuICAgIGNvbnNvbGUuZXJyb3IoYCR7bmV3Q21kfSBbJHtuZXdBcmdzLm1hcCgocykgPT4gYFwiJHtzfVwiYCkuam9pbignLCAnKX1dIGZhaWxlZCB3aXRoOiAke3Byb2MuZXJyb3IubWVzc2FnZX1gKTtcbiAgfSBlbHNlIGlmIChlcnJvcikge1xuICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICBgJHtuZXdDbWR9IFske25ld0FyZ3MubWFwKChzKSA9PiBgXCIke3N9XCJgKS5qb2luKCcsICcpfV0gb3V0cHV0cyB0aGUgZm9sbG93aW5nIGNvbnRlbnQgdG8gc3RkZXJyOlxcbiR7ZXJyb3J9YFxuICAgICk7XG4gIH1cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bm5lY2Vzc2FyeS1jb25kaXRpb24gLS0gc3Bhd25TeW5jIHJldHVybnMgbnVsbCBzdGRvdXQgb24gRU5PRU5ULlxuICBjb25zdCBzdGRvdXQgPSBwcm9jLnN0ZG91dCA/PyAnJztcbiAgcmV0dXJuIHR5cGVvZiBzdGRvdXQgPT09ICdzdHJpbmcnID8gc3Rkb3V0LnRyaW0oKSA6IHN0ZG91dC50b1N0cmluZygpLnRyaW0oKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldFNwYXduU3luY0FyZ3MoY29tbWFuZDogc3RyaW5nLCBhcmdzOiBzdHJpbmdbXSwgY3dkOiBzdHJpbmcpOiBbc3RyaW5nLCBzdHJpbmdbXSwgU3Bhd25TeW5jT3B0aW9uc10ge1xuICBjb25zdCBlbnYgPSB7IC4uLnByb2Nlc3MuZW52IH07XG4gIC8vIFJlbW92ZSBiZXJyeSBmcm9tIFBBVEhcbiAgaWYgKGVudi5QQVRIICYmIGVudi5CRVJSWV9CSU5fRk9MREVSKSB7XG4gICAgZW52LlBBVEggPSBlbnYuUEFUSC5zcGxpdCgnOicpXG4gICAgICAuZmlsdGVyKChwKSA9PiBwICE9PSBlbnYuQkVSUllfQklOX0ZPTERFUilcbiAgICAgIC5qb2luKCc6Jyk7XG4gIH1cblxuICByZXR1cm4gW1xuICAgIGNvbW1hbmQsXG4gICAgYXJncyxcbiAgICB7XG4gICAgICBjd2QsXG4gICAgICBlbnYsXG4gICAgICBlbmNvZGluZzogJ3V0ZjgnLFxuICAgICAgc2hlbGw6IGZhbHNlLFxuICAgICAgc3RkaW86ICdpbmhlcml0JyxcbiAgICB9LFxuICBdO1xufVxuIiwiaW1wb3J0IGNoaWxkUHJvY2VzcyBmcm9tICdub2RlOmNoaWxkX3Byb2Nlc3MnO1xuXG5pbXBvcnQgeyBPY3Rva2l0IH0gZnJvbSAnQG9jdG9raXQvY29yZSc7XG5cbmNsYXNzIEdpdEh1YlV0aWwge1xuICBnZXRPcmdBbmROYW1lKHVybE9yRnVsbE5hbWU6IHN0cmluZyk6IFtzdHJpbmcsIHN0cmluZ10ge1xuICAgIGNvbnN0IHVybFdpdGhvdXRQcm90b2NvbCA9IHVybE9yRnVsbE5hbWUuc3BsaXQoJzonKS5hdCgtMSk7XG4gICAgY29uc3QgbmFtZXMgPSB1cmxXaXRob3V0UHJvdG9jb2w/LnNwbGl0KCcvJyk7XG4gICAgY29uc3Qgb3JnID0gbmFtZXM/LmF0KC0yKSA/PyAnJztcbiAgICBjb25zdCBuYW1lID0gbmFtZXM/LmF0KC0xKT8ucmVwbGFjZSgvLmdpdCQvLCAnJykgPz8gJyc7XG4gICAgcmV0dXJuIFtvcmcsIG5hbWVdO1xuICB9XG59XG5leHBvcnQgY29uc3QgZ2l0SHViVXRpbCA9IG5ldyBHaXRIdWJVdGlsKCk7XG5cbmNvbnN0IG9jdG9raXRDYWNoZSA9IG5ldyBNYXA8c3RyaW5nLCBPY3Rva2l0PigpO1xuXG5leHBvcnQgZnVuY3Rpb24gZ2V0T2N0b2tpdChvd25lcj86IHN0cmluZyk6IE9jdG9raXQge1xuICBjb25zdCBrZXkgPSBvd25lciA/PyAnJztcbiAgY29uc3QgY2FjaGVkID0gb2N0b2tpdENhY2hlLmdldChrZXkpO1xuICBpZiAoY2FjaGVkKSByZXR1cm4gY2FjaGVkO1xuXG4gIGNvbnN0IG9jdG9raXQgPSBuZXcgT2N0b2tpdCh7XG4gICAgYXV0aDogZ2V0R2l0SHViVG9rZW4ob3duZXIpIHx8IHVuZGVmaW5lZCxcbiAgfSk7XG4gIG9jdG9raXRDYWNoZS5zZXQoa2V5LCBvY3Rva2l0KTtcbiAgcmV0dXJuIG9jdG9raXQ7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBoYXNHaXRIdWJUb2tlbihvd25lcjogc3RyaW5nKTogYm9vbGVhbiB7XG4gIHJldHVybiAhIWdldEdpdEh1YlRva2VuKG93bmVyKTtcbn1cblxuZnVuY3Rpb24gZ2V0R2l0SHViVG9rZW4ob3duZXI/OiBzdHJpbmcpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBpZiAob3duZXIgPT09ICdXaWxsQm9vc3RlcicpIHtcbiAgICByZXR1cm4gcHJvY2Vzcy5lbnYuR0hfQk9UX1BBVF9GT1JfV0lMTEJPT1NURVIgfHwgZ2V0R2l0SHViQ2xpVG9rZW4oKTtcbiAgfVxuICBpZiAob3duZXIgPT09ICdXaWxsQm9vc3RlckxhYicpIHtcbiAgICByZXR1cm4gcHJvY2Vzcy5lbnYuR0hfQk9UX1BBVF9GT1JfV0lMTEJPT1NURVJMQUIgfHwgZ2V0R2l0SHViQ2xpVG9rZW4oKTtcbiAgfVxuICByZXR1cm4gKFxuICAgIHByb2Nlc3MuZW52LkdIX0JPVF9QQVRfRk9SX1dJTExCT09TVEVSIHx8XG4gICAgcHJvY2Vzcy5lbnYuR0hfQk9UX1BBVF9GT1JfV0lMTEJPT1NURVJMQUIgfHxcbiAgICBwcm9jZXNzLmVudi5HSF9UT0tFTiB8fFxuICAgIHByb2Nlc3MuZW52LkdJVEhVQl9UT0tFTiB8fFxuICAgIGdldEdpdEh1YkNsaVRva2VuKClcbiAgKTtcbn1cblxubGV0IGdpdEh1YkNsaVRva2VuOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG5cbmZ1bmN0aW9uIGdldEdpdEh1YkNsaVRva2VuKCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGlmIChnaXRIdWJDbGlUb2tlbiAhPT0gdW5kZWZpbmVkKSByZXR1cm4gZ2l0SHViQ2xpVG9rZW4gfHwgdW5kZWZpbmVkO1xuXG4gIHRyeSB7XG4gICAgLy8gU29tZSBsb2NhbCBydW5zIHJlbHkgb24gR2l0SHViIENMSSBhdXRoZW50aWNhdGlvbiBpbnN0ZWFkIG9mIGV4cG9ydGVkIGVudiB0b2tlbnMuXG4gICAgZ2l0SHViQ2xpVG9rZW4gPVxuICAgICAgY2hpbGRQcm9jZXNzXG4gICAgICAgIC5leGVjRmlsZVN5bmMoJ2doJywgWydhdXRoJywgJ3Rva2VuJ10sIHtcbiAgICAgICAgICBlbmNvZGluZzogJ3V0ZjgnLFxuICAgICAgICAgIHN0ZGlvOiBbJ2lnbm9yZScsICdwaXBlJywgJ2lnbm9yZSddLFxuICAgICAgICB9KVxuICAgICAgICAudHJpbSgpIHx8ICcnO1xuICB9IGNhdGNoIHtcbiAgICBnaXRIdWJDbGlUb2tlbiA9ICcnO1xuICB9XG4gIHJldHVybiBnaXRIdWJDbGlUb2tlbiB8fCB1bmRlZmluZWQ7XG59XG4iLCJpbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcblxuZXhwb3J0IGNvbnN0IG1hbmFnZWRUc2NvbmZpZ0Jhc2VEZXBlbmRlbmNpZXMgPSBbXG4gICdAdHNjb25maWcvYnVuJyxcbiAgJ0B0c2NvbmZpZy9ub2RlLWx0cycsXG4gICdAdHNjb25maWcvbm9kZS10cycsXG4gICdAdHNjb25maWcvcmVhY3QtbmF0aXZlJyxcbl07XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRUc2NvbmZpZ0V4dGVuZHMoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogc3RyaW5nIHwgc3RyaW5nW10ge1xuICBpZiAoY29uZmlnLmlzQnVuKSB7XG4gICAgcmV0dXJuICdAdHNjb25maWcvYnVuL3RzY29uZmlnLmpzb24nO1xuICB9XG4gIGlmIChjb25maWcuZGVwZW5kaW5nLnJlYWN0TmF0aXZlKSB7XG4gICAgcmV0dXJuICdAdHNjb25maWcvcmVhY3QtbmF0aXZlL3RzY29uZmlnLmpzb24nO1xuICB9XG4gIHJldHVybiBbJ0B0c2NvbmZpZy9ub2RlLWx0cy90c2NvbmZpZy5qc29uJywgJ0B0c2NvbmZpZy9ub2RlLXRzL3RzY29uZmlnLmpzb24nXTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldFRzY29uZmlnQmFzZURlcGVuZGVuY2llcyhjb25maWc6IFBhY2thZ2VDb25maWcpOiBzdHJpbmdbXSB7XG4gIGlmIChjb25maWcuZGVwZW5kaW5nLmJsaXR6IHx8IGNvbmZpZy5kZXBlbmRpbmcubmV4dCkge1xuICAgIHJldHVybiBbXTtcbiAgfVxuICBpZiAoY29uZmlnLmlzQnVuKSB7XG4gICAgcmV0dXJuIFsnQHRzY29uZmlnL2J1biddO1xuICB9XG4gIGlmIChjb25maWcuZGVwZW5kaW5nLnJlYWN0TmF0aXZlKSB7XG4gICAgcmV0dXJuIFsnQHRzY29uZmlnL3JlYWN0LW5hdGl2ZSddO1xuICB9XG4gIHJldHVybiBbJ0B0c2NvbmZpZy9ub2RlLWx0cycsICdAdHNjb25maWcvbm9kZS10cyddO1xufVxuIiwiaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5cbmV4cG9ydCBmdW5jdGlvbiBpc1B1Ymxpc2hlZFdpbGxib29zdGVyQ29uZmlnc1BhY2thZ2UoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogYm9vbGVhbiB7XG4gIHJldHVybiAoXG4gICAgY29uZmlnLmlzV2lsbEJvb3N0ZXJDb25maWdzICYmXG4gICAgIWNvbmZpZy5pc1Jvb3QgJiZcbiAgICBjb25maWcucGFja2FnZUpzb24/LnByaXZhdGUgIT09IHRydWUgJiZcbiAgICBBcnJheS5pc0FycmF5KGNvbmZpZy5wYWNrYWdlSnNvbj8uZmlsZXMpICYmXG4gICAgY29uZmlnLnBhY2thZ2VKc29uLmZpbGVzLmxlbmd0aCA+IDBcbiAgKTtcbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCBtZXJnZSBmcm9tICdkZWVwbWVyZ2UnO1xuaW1wb3J0IGZnIGZyb20gJ2Zhc3QtZ2xvYic7XG5pbXBvcnQgeyBzb3J0UGFja2FnZUpzb24gfSBmcm9tICdzb3J0LXBhY2thZ2UtanNvbic7XG5pbXBvcnQgdHMgZnJvbSAndHlwZXNjcmlwdCc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VKc29uLCBTZXRSZXF1aXJlZCB9IGZyb20gJ3R5cGUtZmVzdCc7XG5cbmltcG9ydCB7IGdldExhdGVzdENvbW1pdEhhc2ggfSBmcm9tICcuLi9naXRodWIvY29tbWl0LmpzJztcbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGV4dGVuc2lvbnMgfSBmcm9tICcuLi91dGlscy9leHRlbnNpb25zLmpzJztcbmltcG9ydCB7IGZzVXRpbCB9IGZyb20gJy4uL3V0aWxzL2ZzVXRpbC5qcyc7XG5pbXBvcnQgeyBnZXRHZW5JMThuVHNDb21tYW5kIH0gZnJvbSAnLi4vdXRpbHMvZ2VuSTE4blRzLmpzJztcbmltcG9ydCB7IGdpdEh1YlV0aWwgfSBmcm9tICcuLi91dGlscy9naXRodWJVdGlsLmpzJztcbmltcG9ydCB7IGdsb2JJZ25vcmUgfSBmcm9tICcuLi91dGlscy9nbG9iVXRpbC5qcyc7XG5pbXBvcnQgeyBpZ25vcmVGaWxlVXRpbCB9IGZyb20gJy4uL3V0aWxzL2lnbm9yZUZpbGVVdGlsLmpzJztcbmltcG9ydCB7IGNvbWJpbmVNZXJnZSB9IGZyb20gJy4uL3V0aWxzL21lcmdlVXRpbC5qcyc7XG5pbXBvcnQgeyBkb2VzQ29udGFpbkphdmEsIGRvZXNDb250YWluSnNPclRzIH0gZnJvbSAnLi4vdXRpbHMvcGFja2FnZUNhcGFiaWxpdGllcy5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcbmltcG9ydCB7IHNwYXduU3luYywgc3Bhd25TeW5jQW5kUmV0dXJuU3Rkb3V0IH0gZnJvbSAnLi4vdXRpbHMvc3Bhd25VdGlsLmpzJztcbmltcG9ydCB7IGdldFRzY29uZmlnQmFzZURlcGVuZGVuY2llcywgbWFuYWdlZFRzY29uZmlnQmFzZURlcGVuZGVuY2llcyB9IGZyb20gJy4uL3V0aWxzL3RzY29uZmlnQmFzZS5qcyc7XG5pbXBvcnQgeyBpc1B1Ymxpc2hlZFdpbGxib29zdGVyQ29uZmlnc1BhY2thZ2UgfSBmcm9tICcuLi91dGlscy93aWxsYm9vc3RlckNvbmZpZ3NVdGlsLmpzJztcblxuY29uc3Qgb3hsaW50RGVwcyA9IFsnQHdpbGxib29zdGVyL294Zm10LWNvbmZpZycsICdAd2lsbGJvb3N0ZXIvb3hsaW50LWNvbmZpZycsICdveGZtdCcsICdveGxpbnQnLCAnb3hsaW50LXRzZ29saW50J107XG5jb25zdCB0eXBlc2NyaXB0R29EZXBlbmRlbmN5ID0gJ0B0eXBlc2NyaXB0L25hdGl2ZS1wcmV2aWV3JztcbmNvbnN0IHR5cGVzY3JpcHREZXBlbmRlbmN5ID0gJ3R5cGVzY3JpcHQnO1xuY29uc3Qgd2JEZXBlbmRlbmN5ID0gJ0B3aWxsYm9vc3Rlci93Yic7XG5jb25zdCBidWlsZFRzRGVwZW5kZW5jeSA9ICdidWlsZC10cyc7XG5jb25zdCB3aWxsQm9vc3RlckNvbmZpZ3NNYW5hZ2VkRGVwZW5kZW5jaWVzID0gW1xuICAnQHdpbGxib29zdGVyL3ByZXR0aWVyLWNvbmZpZycsXG4gIC4uLm94bGludERlcHMuZmlsdGVyKChkZXBlbmRlbmN5KSA9PiBkZXBlbmRlbmN5LnN0YXJ0c1dpdGgoJ0B3aWxsYm9vc3Rlci8nKSksXG5dO1xuY29uc3Qgb2Jzb2xldGVMaW50RGVwZW5kZW5jaWVzID0gW1xuICAnQGJpb21lanMvYmlvbWUnLFxuICAnQGVzbGludC1yZWFjdC9lc2xpbnQtcGx1Z2luJyxcbiAgJ0Blc2xpbnQvanMnLFxuICAnQG5leHQvZXNsaW50LXBsdWdpbi1uZXh0JyxcbiAgJ0B0eXBlcy9lc2xpbnQnLFxuICAnQHR5cGVzL21pY3JvbWF0Y2gnLFxuICAnQHR5cGVzY3JpcHQtZXNsaW50L2VzbGludC1wbHVnaW4nLFxuICAnQHR5cGVzY3JpcHQtZXNsaW50L3BhcnNlcicsXG4gICdAd2lsbGJvb3N0ZXIvYmlvbWUtY29uZmlnJyxcbiAgJ0B3aWxsYm9vc3Rlci9lc2xpbnQtY29uZmlnJyxcbiAgJ0B3aWxsYm9vc3Rlci9lc2xpbnQtY29uZmlnLWJsaXR6LW5leHQnLFxuICAnQHdpbGxib29zdGVyL2VzbGludC1jb25maWctanMnLFxuICAnQHdpbGxib29zdGVyL2VzbGludC1jb25maWctanMtcmVhY3QnLFxuICAnQHdpbGxib29zdGVyL2VzbGludC1jb25maWctbmV4dCcsXG4gICdAd2lsbGJvb3N0ZXIvZXNsaW50LWNvbmZpZy1yZWFjdCcsXG4gICdAd2lsbGJvb3N0ZXIvZXNsaW50LWNvbmZpZy10cycsXG4gICdAd2lsbGJvb3N0ZXIvZXNsaW50LWNvbmZpZy10cy1yZWFjdCcsXG4gICdiaW9tZScsXG4gICdlc2xpbnQnLFxuICAnZXNsaW50LWNvbmZpZy1mbGF0LWdpdGlnbm9yZScsXG4gICdlc2xpbnQtY29uZmlnLW5leHQnLFxuICAnZXNsaW50LWNvbmZpZy1wcmV0dGllcicsXG4gICdlc2xpbnQtaW1wb3J0LXJlc29sdmVyLW5vZGUnLFxuICAnZXNsaW50LWltcG9ydC1yZXNvbHZlci10eXBlc2NyaXB0JyxcbiAgJ2VzbGludC1wbHVnaW4taW1wb3J0JyxcbiAgJ2VzbGludC1wbHVnaW4taW1wb3J0LXgnLFxuICAnZXNsaW50LXBsdWdpbi1wZXJmZWN0aW9uaXN0JyxcbiAgJ2VzbGludC1wbHVnaW4tcHJldHRpZXInLFxuICAnZXNsaW50LXBsdWdpbi1yZWFjdCcsXG4gICdlc2xpbnQtcGx1Z2luLXJlYWN0LWNvbXBpbGVyJyxcbiAgJ2VzbGludC1wbHVnaW4tcmVhY3QtaG9va3MnLFxuICAnZXNsaW50LXBsdWdpbi1zb3J0LWNsYXNzLW1lbWJlcnMnLFxuICAnZXNsaW50LXBsdWdpbi1zb3J0LWRlc3RydWN0dXJlLWtleXMnLFxuICAnZXNsaW50LXBsdWdpbi1zdG9yeWJvb2snLFxuICAnZXNsaW50LXBsdWdpbi11bmljb3JuJyxcbiAgJ2VzbGludC1wbHVnaW4tdW51c2VkLWltcG9ydHMnLFxuICAnZ2xvYmFscycsXG4gICdtaWNyb21hdGNoJyxcbiAgJ3R5cGVzY3JpcHQtZXNsaW50Jyxcbl07XG5jb25zdCBtaWNyb21hdGNoUGFja2FnZU5hbWVzID0gbmV3IFNldChbJ21pY3JvbWF0Y2gnLCAnQHR5cGVzL21pY3JvbWF0Y2gnXSk7XG5jb25zdCBtaWNyb21hdGNoSW1wb3J0UGF0dGVybiA9XG4gIC9cXGJmcm9tXFxzK1snXCJdbWljcm9tYXRjaFsnXCJdfFxcYnJlcXVpcmVcXChcXHMqWydcIl1taWNyb21hdGNoWydcIl1cXHMqXFwpfFxcYmltcG9ydFxcKFxccypbJ1wiXW1pY3JvbWF0Y2hbJ1wiXVxccypcXCkvdTtcblxuY29uc3QgbGF0ZXN0RGVwZW5kZW5jeVZlcnNpb25DYWNoZSA9IG5ldyBNYXA8c3RyaW5nLCBzdHJpbmc+KCk7XG5jb25zdCBkZXBlbmRlbmN5U2VjdGlvbktleXMgPSBbJ2RlcGVuZGVuY2llcycsICdkZXZEZXBlbmRlbmNpZXMnLCAnb3B0aW9uYWxEZXBlbmRlbmNpZXMnLCAncGVlckRlcGVuZGVuY2llcyddIGFzIGNvbnN0O1xuXG50eXBlIFdyaXRhYmxlUGFja2FnZUpzb24gPSBTZXRSZXF1aXJlZDxcbiAgUGFja2FnZUpzb24sXG4gICdzY3JpcHRzJyB8ICdkZXBlbmRlbmNpZXMnIHwgJ2RldkRlcGVuZGVuY2llcycgfCAncGVlckRlcGVuZGVuY2llcydcbj47XG5cbmludGVyZmFjZSBEZXBlbmRlbmN5VXBkYXRlcyB7XG4gIGRlcGVuZGVuY2llczogc3RyaW5nW107XG4gIGRldkRlcGVuZGVuY2llczogc3RyaW5nW107XG4gIHB5dGhvbkRldkRlcGVuZGVuY2llczogc3RyaW5nW107XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZW5lcmF0ZVBhY2thZ2VKc29uKFxuICBjb25maWc6IFBhY2thZ2VDb25maWcsXG4gIHJvb3RDb25maWc6IFBhY2thZ2VDb25maWcsXG4gIHNraXBBZGRpbmdEZXBzOiBib29sZWFuXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdnZW5lcmF0ZVBhY2thZ2VKc29uJywgYXN5bmMgKCkgPT4ge1xuICAgIGF3YWl0IGNvcmUoY29uZmlnLCByb290Q29uZmlnLCBza2lwQWRkaW5nRGVwcyk7XG4gIH0pO1xufVxuXG5hc3luYyBmdW5jdGlvbiBjb3JlKGNvbmZpZzogUGFja2FnZUNvbmZpZywgcm9vdENvbmZpZzogUGFja2FnZUNvbmZpZywgc2tpcEFkZGluZ0RlcHM6IGJvb2xlYW4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgZmlsZVBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICdwYWNrYWdlLmpzb24nKTtcbiAgY29uc3QganNvbk9iaiA9IGF3YWl0IHJlYWRQYWNrYWdlSnNvbihmaWxlUGF0aCk7XG4gIGNvbnN0IHBhY2thZ2VNYW5hZ2VyID0gY29uZmlnLmlzQnVuID8gJ2J1bicgOiAneWFybic7XG5cbiAgYXdhaXQgcmVtb3ZlRGVwcmVjYXRlZFN0dWZmKGNvbmZpZywganNvbk9iaik7XG4gIGF3YWl0IHVwZGF0ZVNjcmlwdHMoY29uZmlnLCBqc29uT2JqKTtcbiAgbW92ZU1hbmFnZWRUb29sRGVwZW5kZW5jaWVzVG9EZXZEZXBlbmRlbmNpZXMoanNvbk9iaik7XG4gIGNvbnN0IGRlcGVuZGVuY3lVcGRhdGVzID0gYXdhaXQgYXBwbHlQYWNrYWdlSnNvbkNvbnZlbnRpb25zKGNvbmZpZywgcm9vdENvbmZpZywganNvbk9iaik7XG4gIGF3YWl0IG5vcm1hbGl6ZVBhY2thZ2VNZXRhZGF0YShjb25maWcsIHJvb3RDb25maWcsIGpzb25PYmosIGRlcGVuZGVuY3lVcGRhdGVzKTtcbiAgYWRkRGVwZW5kZW5jeVZlcnNpb25zVG9QYWNrYWdlSnNvbihqc29uT2JqLCBkZXBlbmRlbmN5VXBkYXRlcyk7XG4gIGF3YWl0IHVwZGF0ZVByaXZhdGVQYWNrYWdlcyhqc29uT2JqKTtcbiAgcmVtb3ZlRW1wdHlEZXBlbmRlbmN5U2VjdGlvbnMoanNvbk9iaik7XG5cbiAgaWYgKGNvbmZpZy5pc0J1bikgZGVsZXRlIGpzb25PYmoucGFja2FnZU1hbmFnZXI7XG4gIC8vIFlhcm4gcmVhZHMgcGFja2FnZS5qc29uIGZyb20gZGlzayBiZWZvcmUgZGVjaWRpbmcgd2hldGhlciBgeWFybiBhZGQgLURgXG4gIC8vIGNvbmZsaWN0cyB3aXRoIGFuIGV4aXN0aW5nIHJlZ3VsYXIgZGVwZW5kZW5jeSwgc28gdGhpcyB3cml0ZSBtdXN0IGZpbmlzaFxuICAvLyBiZWZvcmUgaW5zdGFsbGluZyB0aGUgbWFuYWdlZCBkZXBlbmRlbmN5IHVwZGF0ZXMgYmVsb3cuIEtlZXAgdGhpcyBiYXNlbGluZVxuICAvLyBmaWxlIHNvcnRlZCBldmVuIHdoZW4gd2UgbGF0ZXIgcnVuIHRoZSB0YXJnZXQgcmVwb3NpdG9yeSdzIGZvcm1hdHRlciBzbyBhXG4gIC8vIG1pZC1ydW4gaW50ZXJydXB0aW9uIG5ldmVyIGxlYXZlcyBwYWNrYWdlLmpzb24gaW4gYSBwYXJ0aWFsbHkgbWFuYWdlZCBvcmRlci5cbiAgYXdhaXQgZnNVdGlsLmdlbmVyYXRlRmlsZShmaWxlUGF0aCwgc2VyaWFsaXplUGFja2FnZUpzb24oanNvbk9iaikpO1xuXG4gIGlmICghc2tpcEFkZGluZ0RlcHMpIHtcbiAgICBpbnN0YWxsRGVwZW5kZW5jeVVwZGF0ZXMoY29uZmlnLCBqc29uT2JqLCBkZXBlbmRlbmN5VXBkYXRlcywgcGFja2FnZU1hbmFnZXIpO1xuICAgIGZvcm1hdFBhY2thZ2VKc29uV2l0aFByb2plY3RGb3JtYXR0ZXIoY29uZmlnLCBwYWNrYWdlTWFuYWdlciwgZmlsZVBhdGgpO1xuICB9XG59XG5cbmZ1bmN0aW9uIHNlcmlhbGl6ZVBhY2thZ2VKc29uKGpzb25PYmo6IFdyaXRhYmxlUGFja2FnZUpzb24pOiBzdHJpbmcge1xuICAvLyBmc1V0aWwuZ2VuZXJhdGVGaWxlKCkgbm9ybWFsaXplcyB0aGUgdHJhaWxpbmcgbmV3bGluZSwgc28ga2VlcCB0aGUgc2VyaWFsaXplclxuICAvLyBmb2N1c2VkIG9uIHRoZSBKU09OIHBheWxvYWQgaXRzZWxmLlxuICByZXR1cm4gSlNPTi5zdHJpbmdpZnkoc29ydFBhY2thZ2VKc29uKGpzb25PYmopLCB1bmRlZmluZWQsIDIpO1xufVxuXG5hc3luYyBmdW5jdGlvbiByZWFkUGFja2FnZUpzb24oZmlsZVBhdGg6IHN0cmluZyk6IFByb21pc2U8V3JpdGFibGVQYWNrYWdlSnNvbj4ge1xuICBjb25zdCBqc29uVGV4dCA9IGF3YWl0IGZzLnByb21pc2VzLnJlYWRGaWxlKGZpbGVQYXRoLCAndXRmOCcpO1xuICBjb25zdCBqc29uT2JqID0gSlNPTi5wYXJzZShqc29uVGV4dCkgYXMgUGFja2FnZUpzb247XG4gIGpzb25PYmouc2NyaXB0cyA9IGpzb25PYmouc2NyaXB0cyA/PyB7fTtcbiAganNvbk9iai5kZXBlbmRlbmNpZXMgPSBqc29uT2JqLmRlcGVuZGVuY2llcyA/PyB7fTtcbiAganNvbk9iai5kZXZEZXBlbmRlbmNpZXMgPSBqc29uT2JqLmRldkRlcGVuZGVuY2llcyA/PyB7fTtcbiAganNvbk9iai5wZWVyRGVwZW5kZW5jaWVzID0ganNvbk9iai5wZWVyRGVwZW5kZW5jaWVzID8/IHt9O1xuICByZXR1cm4ganNvbk9iaiBhcyBXcml0YWJsZVBhY2thZ2VKc29uO1xufVxuXG5hc3luYyBmdW5jdGlvbiB1cGRhdGVTY3JpcHRzKGNvbmZpZzogUGFja2FnZUNvbmZpZywganNvbk9iajogV3JpdGFibGVQYWNrYWdlSnNvbik6IFByb21pc2U8dm9pZD4ge1xuICByZW1vdmVMZWdhY3lJbnN0YWxsQ29tbWFuZHMoanNvbk9iai5zY3JpcHRzKTtcblxuICBqc29uT2JqLnNjcmlwdHMgPSB7IC4uLmpzb25PYmouc2NyaXB0cywgLi4uZ2VuZXJhdGVTY3JpcHRzKGNvbmZpZywganNvbk9iai5zY3JpcHRzKSB9O1xuICBkZWxldGUganNvbk9iai5zY3JpcHRzWydzdGFydC10ZXN0LXNlcnZlciddO1xuXG4gIGNvbnN0IHNjcmlwdHMgPSBqc29uT2JqLnNjcmlwdHM7XG4gIGlmIChjb25maWcuaXNCdW4gfHwgIWRvZXNDb250YWluSmF2YShjb25maWcpKSB7XG4gICAgZGVsZXRlIHNjcmlwdHMucHJldHRpZnk7XG4gIH0gZWxzZSB7XG4gICAgc2NyaXB0cy5wcmV0dGlmeSA9IChzY3JpcHRzLnByZXR0aWZ5ID8/ICcnKSArIChhd2FpdCBnZW5lcmF0ZVByZXR0aWVyU3VmZml4KGNvbmZpZy5kaXJQYXRoKSk7XG4gIH1cbiAgbm9ybWFsaXplWWFybldvcmtzcGFjZUZvcmVhY2hTY3JpcHRzKHNjcmlwdHMpO1xufVxuXG5mdW5jdGlvbiByZW1vdmVMZWdhY3lJbnN0YWxsQ29tbWFuZHMoc2NyaXB0czogUGFja2FnZUpzb24uU2NyaXB0cyk6IHZvaWQge1xuICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhzY3JpcHRzKSkge1xuICAgIGlmICh0eXBlb2YgdmFsdWUgIT09ICdzdHJpbmcnKSBjb250aW51ZTtcbiAgICAvLyBGcmVzaCByZXBvcyBzdGlsbCByZXF1aXJlIHN0YW5kYWxvbmUgYHlhcm4gaW5zdGFsbGA7IG9ubHkgcmVtb3ZlIGxlZ2FjeSBpbnN0YWxsIHByZWZpeGVzIGJlZm9yZSBhbm90aGVyIGNvbW1hbmQuXG4gICAgaWYgKCF2YWx1ZS5pbmNsdWRlcygnZ2l0IGNsb25lJykpIHtcbiAgICAgIHNjcmlwdHNba2V5XSA9IHZhbHVlLnJlcGxhY2VBbGwoL3lhcm5cXHMqKD86aW5zdGFsbFxccyopPyYmXFxzKi9ndSwgJycpO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBub3JtYWxpemVZYXJuV29ya3NwYWNlRm9yZWFjaFNjcmlwdHMoc2NyaXB0czogUGFja2FnZUpzb24uU2NyaXB0cyk6IHZvaWQge1xuICAvLyBEZWFsIHdpdGggYnJlYWtpbmcgY2hhbmdlcyBpbiB5YXJuIGJlcnJ5IDQuMC4wLXJjLjQ5XG4gIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKHNjcmlwdHMpKSB7XG4gICAgaWYgKCF2YWx1ZT8uaW5jbHVkZXMoJ3lhcm4gd29ya3NwYWNlcyBmb3JlYWNoJykpIGNvbnRpbnVlO1xuICAgIHNjcmlwdHNba2V5XSA9IHZhbHVlLnJlcGxhY2VBbGwoXG4gICAgICAveWFybiB3b3Jrc3BhY2VzIGZvcmVhY2goPyFcXHMrKD86LUF8LVJ8LS0oPzphbGx8cmVjdXJzaXZlfHNpbmNlfHdvcmt0cmVlfGZyb218aW5jbHVkZXxleGNsdWRlfHB1YmxpY3xwcml2YXRlKSkpL2d1LFxuICAgICAgJ3lhcm4gd29ya3NwYWNlcyBmb3JlYWNoIC0tYWxsJ1xuICAgICk7XG4gIH1cbn1cblxuYXN5bmMgZnVuY3Rpb24gYXBwbHlQYWNrYWdlSnNvbkNvbnZlbnRpb25zKFxuICBjb25maWc6IFBhY2thZ2VDb25maWcsXG4gIHJvb3RDb25maWc6IFBhY2thZ2VDb25maWcsXG4gIGpzb25PYmo6IFdyaXRhYmxlUGFja2FnZUpzb25cbik6IFByb21pc2U8RGVwZW5kZW5jeVVwZGF0ZXM+IHtcbiAgY29uc3QgZGVwZW5kZW5jaWVzOiBzdHJpbmdbXSA9IFtdO1xuICBjb25zdCBkZXZEZXBlbmRlbmNpZXMgPSBbJ3NvcnQtcGFja2FnZS1qc29uJ107XG4gIGNvbnN0IHB5dGhvbkRldkRlcGVuZGVuY2llczogc3RyaW5nW10gPSBbXTtcbiAgY29uc3QgaGFzSmF2YSA9IGRvZXNDb250YWluSmF2YShjb25maWcpO1xuXG4gIGlmIChcbiAgICBoYXNKYXZhICYmXG4gICAgIWZzLmV4aXN0c1N5bmMocGF0aC5qb2luKHJvb3RDb25maWcuZGlyUGF0aCwgJy5wcmV0dGllcnJjLmpzb24nKSkgJiZcbiAgICAhZnMuZXhpc3RzU3luYyhwYXRoLmpvaW4oY29uZmlnLmRpclBhdGgsICcucHJldHRpZXJyYy5qc29uJykpXG4gICkge1xuICAgIGpzb25PYmoucHJldHRpZXIgPSAnQHdpbGxib29zdGVyL3ByZXR0aWVyLWNvbmZpZyc7XG4gICAgZGV2RGVwZW5kZW5jaWVzLnB1c2goJ3ByZXR0aWVyLXBsdWdpbi1qYXZhJywgJ0B3aWxsYm9vc3Rlci9wcmV0dGllci1jb25maWcnKTtcbiAgfVxuICBpZiAoaGFzSmF2YSkge1xuICAgIGRldkRlcGVuZGVuY2llcy5wdXNoKCdwcmV0dGllcicpO1xuICB9IGVsc2Uge1xuICAgIHJlbW92ZVByZXR0aWVyQXJ0aWZhY3RzKGpzb25PYmopO1xuICB9XG5cbiAgZGVsZXRlIGpzb25PYmouZGV2RGVwZW5kZW5jaWVzWydsaW50LXN0YWdlZCddO1xuICBkZWxldGUgKGpzb25PYmogYXMgUGFja2FnZUpzb24gJiB7ICdsaW50LXN0YWdlZCc/OiB1bmtub3duIH0pWydsaW50LXN0YWdlZCddO1xuXG4gIGlmIChjb25maWcuaXNSb290KSB7XG4gICAgZGVsZXRlIGpzb25PYmouZGV2RGVwZW5kZW5jaWVzLmh1c2t5O1xuICAgIGRlbGV0ZSBqc29uT2JqLnNjcmlwdHMucG9zdGluc3RhbGw7XG4gICAgZGVsZXRlIGpzb25PYmouc2NyaXB0cy5wb3N0cHVibGlzaDtcbiAgICBkZWxldGUganNvbk9iai5zY3JpcHRzLnByZXB1Ymxpc2hPbmx5O1xuICAgIGRlbGV0ZSBqc29uT2JqLnNjcmlwdHMucHJlcGFjaztcbiAgICBkZWxldGUganNvbk9iai5zY3JpcHRzLnBvc3RwYWNrO1xuICAgIGpzb25PYmouc2NyaXB0cy5wcmVwYXJlID0gJ2xlZnRob29rIGluc3RhbGwgfHwgdHJ1ZSc7XG4gICAgZGV2RGVwZW5kZW5jaWVzLnB1c2goJ2xlZnRob29rJyk7XG5cbiAgICBpZiAoY29uZmlnLmRlcGVuZGluZy5zZW1hbnRpY1JlbGVhc2UpIHtcbiAgICAgIGlmIChcbiAgICAgICAgIWpzb25PYmouZGV2RGVwZW5kZW5jaWVzWydzZW1hbnRpYy1yZWxlYXNlJ10gJiZcbiAgICAgICAgIWpzb25PYmouZGV2RGVwZW5kZW5jaWVzWydtdWx0aS1zZW1hbnRpYy1yZWxlYXNlJ10gJiZcbiAgICAgICAgIWpzb25PYmouZGV2RGVwZW5kZW5jaWVzWydAcWl3aS9tdWx0aS1zZW1hbnRpYy1yZWxlYXNlJ11cbiAgICAgICkge1xuICAgICAgICBkZXZEZXBlbmRlbmNpZXMucHVzaCgnc2VtYW50aWMtcmVsZWFzZScpO1xuICAgICAgfVxuICAgICAganNvbk9iai52ZXJzaW9uID0gJzAuMC4wLXNlbWFudGljYWxseS1yZWxlYXNlZCc7XG4gICAgfVxuXG4gICAgaWYgKGNvbmZpZy5kZXBlbmRpbmcucGxheXdyaWdodFRlc3QpIHtcbiAgICAgIC8vIFNpbmNlIGFydGlsbGVyeSByZXF1aXJlcyBhIHNwZWNpZmljIHZlcnNpb24gb2YgQHBsYXl3cmlnaHQvdGVzdFxuICAgICAgY29uc3QgaGFzQXJ0aWxsZXJ5ID0ganNvbk9iai5kZXBlbmRlbmNpZXMuYXJ0aWxsZXJ5IHx8IGpzb25PYmouZGV2RGVwZW5kZW5jaWVzLmFydGlsbGVyeTtcbiAgICAgIC8vIFNpbmNlIGxsbS10b29sYm94IHJlcXVpcmVzIEBwbGF5d3JpZ2h0L3Rlc3QgaW4gZGVwZW5kZW5jaWVzXG4gICAgICBpZiAoIWhhc0FydGlsbGVyeSAmJiAhanNvbk9iai5kZXBlbmRlbmNpZXNbJ0BwbGF5d3JpZ2h0L3Rlc3QnXSkge1xuICAgICAgICBkZXZEZXBlbmRlbmNpZXMucHVzaCgnQHBsYXl3cmlnaHQvdGVzdCcpO1xuICAgICAgfVxuICAgICAgZGVsZXRlIGpzb25PYmouZGVwZW5kZW5jaWVzLnBsYXl3cmlnaHQ7XG4gICAgICBkZWxldGUganNvbk9iai5kZXZEZXBlbmRlbmNpZXMucGxheXdyaWdodDtcbiAgICB9XG5cbiAgICBpZiAoY29uZmlnLmRvZXNDb250YWluU3ViUGFja2FnZUpzb25zKSB7XG4gICAgICAvLyBXZSBkb24ndCBhbGxvdyBub24tYXJyYXkgd29ya3NwYWNlcyBpbiBtb25vcmVwby5cbiAgICAgIGpzb25PYmoud29ya3NwYWNlcyA9IEFycmF5LmlzQXJyYXkoanNvbk9iai53b3Jrc3BhY2VzKVxuICAgICAgICA/IG1lcmdlLmFsbChbanNvbk9iai53b3Jrc3BhY2VzLCBbJ3BhY2thZ2VzLyonXV0sIHtcbiAgICAgICAgICAgIGFycmF5TWVyZ2U6IGNvbWJpbmVNZXJnZSxcbiAgICAgICAgICB9KVxuICAgICAgICA6IFsncGFja2FnZXMvKiddO1xuICAgIH0gZWxzZSBpZiAoQXJyYXkuaXNBcnJheShqc29uT2JqLndvcmtzcGFjZXMpKSB7XG4gICAgICBqc29uT2JqLndvcmtzcGFjZXMgPSBqc29uT2JqLndvcmtzcGFjZXMuZmlsdGVyKFxuICAgICAgICAod29ya3NwYWNlKSA9PlxuICAgICAgICAgIGZnLmdsb2JTeW5jKHdvcmtzcGFjZSwge1xuICAgICAgICAgICAgZG90OiB0cnVlLFxuICAgICAgICAgICAgY3dkOiBjb25maWcuZGlyUGF0aCxcbiAgICAgICAgICAgIGlnbm9yZTogZ2xvYklnbm9yZSxcbiAgICAgICAgICB9KS5sZW5ndGggPiAwXG4gICAgICApO1xuICAgICAgaWYgKGpzb25PYmoud29ya3NwYWNlcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgZGVsZXRlIGpzb25PYmoud29ya3NwYWNlcztcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBpZiAoIWlzV2JQYWNrYWdlKGpzb25PYmopKSB7XG4gICAgZGV2RGVwZW5kZW5jaWVzLnB1c2god2JEZXBlbmRlbmN5KTtcbiAgfVxuICBpZiAoY29uZmlnLmRlcGVuZGluZy53YiB8fCBjb25maWcuaXNCdW4pIHtcbiAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhqc29uT2JqLnNjcmlwdHMpKSB7XG4gICAgICBpZiAodHlwZW9mIHZhbHVlICE9PSAnc3RyaW5nJykgY29udGludWU7XG4gICAgICBqc29uT2JqLnNjcmlwdHNba2V5XSA9IHZhbHVlLnJlcGxhY2VBbGwoL3diXFxzK2RiL2d1LCAnd2IgcHJpc21hJyk7XG4gICAgfVxuICB9XG5cbiAgLy8gYnVpbGQtdHMgb3ducyBUeXBlU2NyaXB0IGV4ZWN1dGlvbiBhbmQgZGVjbGFyYXRpb24gZW1pdC4gd2JmeSBtdXN0IGFsd2F5c1xuICAvLyBrZWVwIGV4aXN0aW5nIGJ1aWxkLXRzIHVzZXJzIGN1cnJlbnQgYmVjYXVzZSBvbGRlciByZWxlYXNlcyBjYW4gZW1pdCAuZC50c1xuICAvLyBmaWxlcyBhdCBwYXRocyB0aGF0IG5vIGxvbmdlciBtYXRjaCBwYWNrYWdlIGV4cG9ydHMuXG4gIGlmIChcbiAgICBqc29uT2JqLmRlcGVuZGVuY2llc1tidWlsZFRzRGVwZW5kZW5jeV0gfHxcbiAgICBqc29uT2JqLmRldkRlcGVuZGVuY2llc1tidWlsZFRzRGVwZW5kZW5jeV0gfHxcbiAgICBPYmplY3QudmFsdWVzKGpzb25PYmouc2NyaXB0cykuc29tZSgoc2NyaXB0KSA9PiBzY3JpcHQ/LmluY2x1ZGVzKGJ1aWxkVHNEZXBlbmRlbmN5KSlcbiAgKSB7XG4gICAgZGV2RGVwZW5kZW5jaWVzLnB1c2goYnVpbGRUc0RlcGVuZGVuY3kpO1xuICB9XG4gIGlmIChkb2VzQ29udGFpbkpzT3JUcyhjb25maWcpKSB7XG4gICAgZGV2RGVwZW5kZW5jaWVzLnB1c2goLi4ub3hsaW50RGVwcyk7XG4gIH1cblxuICBjb25zdCB0c2NvbmZpZ0Jhc2VEZXBlbmRlbmNpZXMgPSBkb2VzQ29udGFpbkpzT3JUcyhjb25maWcpID8gZ2V0VHNjb25maWdCYXNlRGVwZW5kZW5jaWVzKGNvbmZpZykgOiBbXTtcbiAgYXdhaXQgcmVtb3ZlVW51c2VkVHNjb25maWdCYXNlRGVwZW5kZW5jaWVzKGNvbmZpZywganNvbk9iaiwgdHNjb25maWdCYXNlRGVwZW5kZW5jaWVzKTtcbiAgZGV2RGVwZW5kZW5jaWVzLnB1c2goLi4udHNjb25maWdCYXNlRGVwZW5kZW5jaWVzKTtcblxuICBpZiAoY29uZmlnLmRvZXNDb250YWluVHlwZVNjcmlwdCB8fCBjb25maWcuZG9lc0NvbnRhaW5UeXBlU2NyaXB0SW5QYWNrYWdlcykge1xuICAgIGRldkRlcGVuZGVuY2llcy5wdXNoKHR5cGVzY3JpcHRHb0RlcGVuZGVuY3kpO1xuICAgIGlmIChjb25maWcuZGVwZW5kaW5nLm5leHQpIHtcbiAgICAgIC8vIE5leHQuanMgc3RpbGwgdXNlcyB0aGUgYHR5cGVzY3JpcHRgIHBhY2thZ2UgZHVyaW5nIGRldi9idWlsZCBzdGFydHVwIGZvclxuICAgICAgLy8gVHlwZVNjcmlwdCBhcHBzIGV2ZW4gd2hlbiByZXBvc2l0b3JpZXMgZGVsZWdhdGUgZXhwbGljaXQgdHlwZWNoZWNraW5nIHRvIHRzZ28uXG4gICAgICBkZXZEZXBlbmRlbmNpZXMucHVzaCh0eXBlc2NyaXB0RGVwZW5kZW5jeSk7XG4gICAgfVxuICAgIGlmIChjb25maWcuaXNCdW4pIHtcbiAgICAgIGRldkRlcGVuZGVuY2llcy5wdXNoKCdAdHlwZXMvYnVuJyk7XG4gICAgfSBlbHNlIGlmICghY29uZmlnLmRlcGVuZGluZy5yZWFjdE5hdGl2ZSkge1xuICAgICAgZGV2RGVwZW5kZW5jaWVzLnB1c2goJ0B0eXBlcy9ub2RlJyk7XG4gICAgfVxuICAgIGlmIChcbiAgICAgIGpzb25PYmouZGVwZW5kZW5jaWVzLmplc3QgfHxcbiAgICAgIGpzb25PYmouZGV2RGVwZW5kZW5jaWVzLmplc3QgfHxcbiAgICAgIGpzb25PYmouZGVwZW5kZW5jaWVzWydAamVzdC9nbG9iYWxzJ10gfHxcbiAgICAgIGpzb25PYmouZGV2RGVwZW5kZW5jaWVzWydAamVzdC9nbG9iYWxzJ10gfHxcbiAgICAgIGpzb25PYmouZGVwZW5kZW5jaWVzWyd0cy1qZXN0J10gfHxcbiAgICAgIGpzb25PYmouZGV2RGVwZW5kZW5jaWVzWyd0cy1qZXN0J11cbiAgICApIHtcbiAgICAgIGRldkRlcGVuZGVuY2llcy5wdXNoKCdAdHlwZXMvamVzdCcpO1xuICAgIH1cbiAgfVxuXG4gIGlmIChjb25maWcuaXNXaWxsQm9vc3RlckNvbmZpZ3MpIHtcbiAgICByZXR1cm4ge1xuICAgICAgZGVwZW5kZW5jaWVzOiBkZXBlbmRlbmNpZXMuZmlsdGVyKChkZXApID0+ICFkZXAuaW5jbHVkZXMoJ0B3aWxsYm9vc3Rlci8nKSksXG4gICAgICBkZXZEZXBlbmRlbmNpZXM6IGRldkRlcGVuZGVuY2llcy5maWx0ZXIoKGRlcCkgPT4gIWRlcC5pbmNsdWRlcygnQHdpbGxib29zdGVyLycpKSxcbiAgICAgIHB5dGhvbkRldkRlcGVuZGVuY2llcyxcbiAgICB9O1xuICB9XG5cbiAgcmV0dXJuIHsgZGVwZW5kZW5jaWVzLCBkZXZEZXBlbmRlbmNpZXMsIHB5dGhvbkRldkRlcGVuZGVuY2llcyB9O1xufVxuXG5mdW5jdGlvbiBtb3ZlTWFuYWdlZFRvb2xEZXBlbmRlbmNpZXNUb0RldkRlcGVuZGVuY2llcyhqc29uT2JqOiBXcml0YWJsZVBhY2thZ2VKc29uKTogdm9pZCB7XG4gIGZvciAoY29uc3QgZGVwZW5kZW5jeSBvZiBbd2JEZXBlbmRlbmN5LCBidWlsZFRzRGVwZW5kZW5jeV0pIHtcbiAgICBpZiAoIWpzb25PYmouZGVwZW5kZW5jaWVzW2RlcGVuZGVuY3ldKSBjb250aW51ZTtcbiAgICBqc29uT2JqLmRldkRlcGVuZGVuY2llc1tkZXBlbmRlbmN5XSA/Pz0ganNvbk9iai5kZXBlbmRlbmNpZXNbZGVwZW5kZW5jeV07XG4gICAgZGVsZXRlIGpzb25PYmouZGVwZW5kZW5jaWVzW2RlcGVuZGVuY3ldO1xuICB9XG59XG5cbmFzeW5jIGZ1bmN0aW9uIG5vcm1hbGl6ZVBhY2thZ2VNZXRhZGF0YShcbiAgY29uZmlnOiBQYWNrYWdlQ29uZmlnLFxuICByb290Q29uZmlnOiBQYWNrYWdlQ29uZmlnLFxuICBqc29uT2JqOiBXcml0YWJsZVBhY2thZ2VKc29uLFxuICBkZXBlbmRlbmN5VXBkYXRlczogRGVwZW5kZW5jeVVwZGF0ZXNcbik6IFByb21pc2U8dm9pZD4ge1xuICBpZiAoIWpzb25PYmoubmFtZSkge1xuICAgIGpzb25PYmoubmFtZSA9IHBhdGguYmFzZW5hbWUoY29uZmlnLmRpclBhdGgpO1xuICB9XG5cbiAgaWYgKGNvbmZpZy5kb2VzQ29udGFpblN1YlBhY2thZ2VKc29ucykge1xuICAgIGpzb25PYmoucHJpdmF0ZSA9IHRydWU7XG4gIH1cbiAgaWYgKCFqc29uT2JqLmxpY2Vuc2UpIHtcbiAgICBqc29uT2JqLmxpY2Vuc2UgPSAnVU5MSUNFTlNFRCc7XG4gIH1cbiAgaWYgKCFqc29uT2JqLnByaXZhdGUgJiYganNvbk9iai5saWNlbnNlICE9PSAnVU5MSUNFTlNFRCcgJiYgcm9vdENvbmZpZy5pc1B1YmxpY1JlcG8pIHtcbiAgICBqc29uT2JqLnB1Ymxpc2hDb25maWcgPz89IHt9O1xuICAgIGpzb25PYmoucHVibGlzaENvbmZpZy5hY2Nlc3MgPz89ICdwdWJsaWMnO1xuICB9XG4gIGNvbnN0IFtvd25lcl0gPSBnaXRIdWJVdGlsLmdldE9yZ0FuZE5hbWUoY29uZmlnLnJlcG9zaXRvcnkgPz8gJycpO1xuICBpZiAob3duZXIgPT09ICdXaWxsQm9vc3RlcicgfHwgb3duZXIgPT09ICdXaWxsQm9vc3RlckxhYicpIHtcbiAgICBqc29uT2JqLmF1dGhvciA9ICdXaWxsQm9vc3RlciBJbmMuJztcbiAgfVxuICBhd2FpdCBub3JtYWxpemVQdWJsaXNoZWRDb25maWdQYWNrYWdlTWV0YWRhdGEoY29uZmlnLCBqc29uT2JqKTtcbiAgaWYgKCFjb25maWcuaXNSb290ICYmIGpzb25PYmoucHJpdmF0ZSAmJiAhanNvbk9iai5tYWluKSB7XG4gICAgLy8gTWFrZSBWU0NvZGUgcG9zc2libGUgdG8gcmVmYWN0b3IgY29kZSBhY3Jvc3Mgc3VicGFja2FnZXMuXG4gICAganNvbk9iai5tYWluID0gJy4vc3JjJztcbiAgfVxuXG4gIC8vIFlhcm4gdHJlYXRzIHRoZSBsZWdhY3kgbnBtL2NoYWxrIHJlc29sdXRpb24gYWxpYXMgYXMgYW4gaW52YWxpZCBwYWNrYWdlIHRva2VuLlxuICBkZWxldGUganNvbk9iai5yZXNvbHV0aW9ucz8uWyducG0vY2hhbGsnXTtcblxuICBpZiAoIWNvbmZpZy5kb2VzQ29udGFpblN1YlBhY2thZ2VKc29ucykge1xuICAgIGlmICghY29uZmlnLmlzQnVuKSB7XG4gICAgICBpZiAoIWNvbmZpZy5kb2VzQ29udGFpbkphdmFTY3JpcHQgJiYgIWNvbmZpZy5kb2VzQ29udGFpblR5cGVTY3JpcHQpIHtcbiAgICAgICAgZGVsZXRlIGpzb25PYmouc2NyaXB0cy5saW50O1xuICAgICAgICBkZWxldGUganNvbk9iai5zY3JpcHRzWydsaW50LWZpeCddO1xuICAgICAgICBmb3IgKGNvbnN0IHNjcmlwdE5hbWUgb2YgWydjbGVhbnVwJ10pIHtcbiAgICAgICAgICBjb25zdCBzY3JpcHQgPSBqc29uT2JqLnNjcmlwdHNbc2NyaXB0TmFtZV07XG4gICAgICAgICAgaWYgKCFzY3JpcHQpIGNvbnRpbnVlO1xuICAgICAgICAgIGpzb25PYmouc2NyaXB0c1tzY3JpcHROYW1lXSA9IHNjcmlwdC5yZXBsYWNlKC8gPyYmID95YXJuIGxpbnQtZml4KD86IC0tcXVpZXQpPy8sICcnKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAganNvbk9iai5zY3JpcHRzWydsaW50LWZpeCddID0ganNvbk9iai5zY3JpcHRzWydsaW50LWZpeCddID8/ICd5YXJuIGxpbnQgLS1maXgnO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChjb25maWcuZG9lc0NvbnRhaW5QdWJzcGVjWWFtbCkge1xuICAgICAganNvbk9iai5zY3JpcHRzLmxpbnQgPSAnZmx1dHRlciBhbmFseXplJztcbiAgICAgIGpzb25PYmouc2NyaXB0c1snbGludC1maXgnXSA9ICd5YXJuIGxpbnQnO1xuICAgICAgY29uc3QgZGlycyA9IFsnbGliJywgJ3Rlc3QnLCAndGVzdF9kcml2ZXInXS5maWx0ZXIoKGRpcikgPT4gZnMuZXhpc3RzU3luYyhwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsIGRpcikpKTtcbiAgICAgIGlmIChkaXJzLmxlbmd0aCA+IDApIHtcbiAgICAgICAganNvbk9iai5zY3JpcHRzWydmb3JtYXQtY29kZSddID0gYGRhcnQgZm9ybWF0ICQoZmluZCAke2RpcnMuam9pbihcbiAgICAgICAgICAnICdcbiAgICAgICAgKX0gLW5hbWUgZ2VuZXJhdGVkIC1wcnVuZSAtbyAtbmFtZSAnKi5mcmVlemVkLmRhcnQnIC1wcnVuZSAtbyAtbmFtZSAnKi5nLmRhcnQnIC1wcnVuZSAtbyAtbmFtZSAnKi5kYXJ0JyAtcHJpbnQpYDtcbiAgICAgICAganNvbk9iai5zY3JpcHRzLmZvcm1hdCA9IGFwcGVuZEZvcm1hdENvZGVDb21tYW5kKGpzb25PYmouc2NyaXB0cy5mb3JtYXQsIGNvbmZpZyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgcHl0aG9uUGFja2FnZU1hbmFnZXIgPSBnZXRQeXRob25QYWNrYWdlTWFuYWdlcihjb25maWcpO1xuICAgIGlmIChweXRob25QYWNrYWdlTWFuYWdlcikge1xuICAgICAgaWYgKGpzb25PYmouc2NyaXB0cy5wb3N0aW5zdGFsbCA9PT0gJ3BvZXRyeSBpbnN0YWxsJykge1xuICAgICAgICBkZWxldGUganNvbk9iai5zY3JpcHRzLnBvc3RpbnN0YWxsO1xuICAgICAgfVxuICAgICAganNvbk9iai5zY3JpcHRzWydjb21tb24vY2ktc2V0dXAnXSA9IGB5YXJuIHNldHVwLSR7cHl0aG9uUGFja2FnZU1hbmFnZXJ9YDtcbiAgICAgIGRlbGV0ZSBqc29uT2JqLnNjcmlwdHNbYHNldHVwLSR7cHl0aG9uUGFja2FnZU1hbmFnZXIgPT09ICdwb2V0cnknID8gJ3V2JyA6ICdwb2V0cnknfWBdO1xuICAgICAgZGVsZXRlIGpzb25PYmouc2NyaXB0c1snc2V0dXAtcG9ldHJ5LWFzZGYnXTtcbiAgICAgIGpzb25PYmouc2NyaXB0c1tgc2V0dXAtJHtweXRob25QYWNrYWdlTWFuYWdlcn1gXSA9IGdldFB5dGhvblNldHVwQ29tbWFuZChweXRob25QYWNrYWdlTWFuYWdlcik7XG4gICAgICBjb25zdCBweXRob25GaWxlcyA9IGF3YWl0IGZnLmdsb2IoJyoqLyoucHknLCB7XG4gICAgICAgIGN3ZDogY29uZmlnLmRpclBhdGgsXG4gICAgICAgIGRvdDogdHJ1ZSxcbiAgICAgICAgaWdub3JlOiBnbG9iSWdub3JlLFxuICAgICAgfSk7XG4gICAgICBjb25zdCBkaXJOYW1lU2V0ID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gICAgICBmb3IgKGNvbnN0IHB5dGhvbkZpbGUgb2YgcHl0aG9uRmlsZXMpIHtcbiAgICAgICAgY29uc3QgW2ZpcnN0LCBzZWNvbmRdID0gcHl0aG9uRmlsZS5zcGxpdCgnLycpO1xuICAgICAgICBpZiAoZmlyc3QgJiYgc2Vjb25kKSB7XG4gICAgICAgICAgZGlyTmFtZVNldC5hZGQoZmlyc3QpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAoZGlyTmFtZVNldC5zaXplID4gMCkge1xuICAgICAgICBjb25zdCBkaXJOYW1lc1N0ciA9IFsuLi5kaXJOYW1lU2V0XS5qb2luKCcgJyk7XG4gICAgICAgIGNvbnN0IHB5dGhvblJ1bm5lciA9IGAke3B5dGhvblBhY2thZ2VNYW5hZ2VyfSBydW5gO1xuICAgICAgICBqc29uT2JqLnNjcmlwdHNbJ2Zvcm1hdC1jb2RlJ10gPVxuICAgICAgICAgIGAke3B5dGhvblJ1bm5lcn0gaXNvcnQgLS1wcm9maWxlIGJsYWNrICR7ZGlyTmFtZXNTdHJ9ICYmICR7cHl0aG9uUnVubmVyfSBibGFjayAke2Rpck5hbWVzU3RyfWA7XG4gICAgICAgIGlmIChqc29uT2JqLnNjcmlwdHMubGludCkge1xuICAgICAgICAgIGpzb25PYmouc2NyaXB0cy5saW50ID0gYCR7cHl0aG9uUnVubmVyfSBmbGFrZTggJHtkaXJOYW1lc1N0cn0gJiYgJHtqc29uT2JqLnNjcmlwdHMubGludH1gO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGpzb25PYmouc2NyaXB0cy5saW50ID0gYCR7cHl0aG9uUnVubmVyfSBmbGFrZTggJHtkaXJOYW1lc1N0cn1gO1xuICAgICAgICAgIGpzb25PYmouc2NyaXB0c1snbGludC1maXgnXSA9ICd5YXJuIGxpbnQnO1xuICAgICAgICB9XG4gICAgICAgIGpzb25PYmouc2NyaXB0cy5mb3JtYXQgPSBhcHBlbmRGb3JtYXRDb2RlQ29tbWFuZChqc29uT2JqLnNjcmlwdHMuZm9ybWF0LCBjb25maWcpO1xuICAgICAgICBkZXBlbmRlbmN5VXBkYXRlcy5weXRob25EZXZEZXBlbmRlbmNpZXMucHVzaCgnYmxhY2snLCAnaXNvcnQnLCAnZmxha2U4Jyk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgaWYgKGNvbmZpZy5yZXBvc2l0b3J5IHx8IGpzb25PYmoucmVwb3NpdG9yeSkge1xuICAgIGpzb25PYmoucmVwb3NpdG9yeSA9IGZvcm1hdFJlcG9zaXRvcnlGb3JQYWNrYWdlSnNvbihjb25maWcucmVwb3NpdG9yeSA/PyBqc29uT2JqLnJlcG9zaXRvcnksIGpzb25PYmoucmVwb3NpdG9yeSk7XG4gIH1cblxuICBpZiAoY29uZmlnLmRlcGVuZGluZy5ibGl0eikge1xuICAgIGlmICghanNvbk9iai5zY3JpcHRzWydnZW4tY29kZSddPy5zdGFydHNXaXRoKCdibGl0eiBjb2RlZ2VuJykpIHtcbiAgICAgIGpzb25PYmouc2NyaXB0c1snZ2VuLWNvZGUnXSA9ICdibGl0eiBjb2RlZ2VuJztcbiAgICB9IGVsc2UgaWYgKCFqc29uT2JqLnNjcmlwdHNbJ2dlbi1jb2RlJ10uaW5jbHVkZXMoJ2JsaXR6IHByaXNtYSBnZW5lcmF0ZScpKSB7XG4gICAgICBqc29uT2JqLnNjcmlwdHNbJ2dlbi1jb2RlJ10gPSBqc29uT2JqLnNjcmlwdHNbJ2dlbi1jb2RlJ10ucmVwbGFjZShcbiAgICAgICAgJ2JsaXR6IGNvZGVnZW4nLFxuICAgICAgICAnYmxpdHogY29kZWdlbiAmJiBibGl0eiBwcmlzbWEgZ2VuZXJhdGUnXG4gICAgICApO1xuICAgIH1cbiAgfSBlbHNlIGlmIChjb25maWcuZGVwZW5kaW5nLnByaXNtYSAmJiAhanNvbk9iai5zY3JpcHRzWydnZW4tY29kZSddPy5zdGFydHNXaXRoKCdwcmlzbWEgZ2VuZXJhdGUnKSkge1xuICAgIGpzb25PYmouc2NyaXB0c1snZ2VuLWNvZGUnXSA9ICdwcmlzbWEgZ2VuZXJhdGUnO1xuICB9XG4gIGFkZEdlbkkxOG5Uc1Bvc3RpbnN0YWxsU2NyaXB0KGNvbmZpZywganNvbk9iaik7XG5cbiAgaWYgKCFqc29uT2JqLmRlcGVuZGVuY2llcy5wcmV0dGllcikge1xuICAgIC8vIEJlY2F1c2UgQHR5cGVzL3ByZXR0aWVyIGJsb2NrcyBwcmV0dGllciBleGVjdXRpb24uXG4gICAgZGVsZXRlIGpzb25PYmouZGV2RGVwZW5kZW5jaWVzWydAdHlwZXMvcHJldHRpZXInXTtcbiAgfVxufVxuXG5mdW5jdGlvbiBhcHBlbmRGb3JtYXRDb2RlQ29tbWFuZChmb3JtYXRTY3JpcHQ6IHN0cmluZyB8IHVuZGVmaW5lZCwgY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogc3RyaW5nIHtcbiAgLy8gQnVuIHByb2plY3RzIG1heSBub3QgaGF2ZSBhIFlhcm4gbG9ja2ZpbGUsIHNvIGdlbmVyYXRlZCBwYWNrYWdlIHNjcmlwdHNcbiAgLy8gbXVzdCBpbnZva2UgbG9jYWwgcGFja2FnZSBzY3JpcHRzIHRocm91Z2ggdGhlIHJlcG9zaXRvcnkncyBwYWNrYWdlIG1hbmFnZXIuXG4gIGNvbnN0IHNjcmlwdFJ1bm5lciA9IGNvbmZpZy5pc0J1biA/ICdidW4gcnVuJyA6ICd5YXJuJztcbiAgcmV0dXJuIGZvcm1hdFNjcmlwdCA/IGAke2Zvcm1hdFNjcmlwdH0gJiYgJHtzY3JpcHRSdW5uZXJ9IGZvcm1hdC1jb2RlYCA6IGAke3NjcmlwdFJ1bm5lcn0gZm9ybWF0LWNvZGVgO1xufVxuXG5mdW5jdGlvbiBhZGRHZW5JMThuVHNQb3N0aW5zdGFsbFNjcmlwdChjb25maWc6IFBhY2thZ2VDb25maWcsIGpzb25PYmo6IFdyaXRhYmxlUGFja2FnZUpzb24pOiB2b2lkIHtcbiAgY29uc3QgY29tbWFuZCA9IGdldEdlbkkxOG5Uc0NvbW1hbmQoY29uZmlnLCBqc29uT2JqLnNjcmlwdHMpO1xuICBpZiAoIWNvbW1hbmQpIHJldHVybjtcblxuICBjb25zdCBwb3N0aW5zdGFsbCA9IGpzb25PYmouc2NyaXB0cy5wb3N0aW5zdGFsbDtcbiAgaWYgKCFwb3N0aW5zdGFsbCkge1xuICAgIGpzb25PYmouc2NyaXB0cy5wb3N0aW5zdGFsbCA9IGNvbW1hbmQ7XG4gIH0gZWxzZSBpZiAoIXBvc3RpbnN0YWxsLmluY2x1ZGVzKGNvbW1hbmQpKSB7XG4gICAganNvbk9iai5zY3JpcHRzLnBvc3RpbnN0YWxsID0gYCR7cG9zdGluc3RhbGx9ICYmICR7Y29tbWFuZH1gO1xuICB9XG59XG5cbmFzeW5jIGZ1bmN0aW9uIG5vcm1hbGl6ZVB1Ymxpc2hlZENvbmZpZ1BhY2thZ2VNZXRhZGF0YShcbiAgY29uZmlnOiBQYWNrYWdlQ29uZmlnLFxuICBqc29uT2JqOiBXcml0YWJsZVBhY2thZ2VKc29uXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgaWYgKCFpc1B1Ymxpc2hlZFdpbGxib29zdGVyQ29uZmlnc1BhY2thZ2UoY29uZmlnKSkgcmV0dXJuO1xuXG4gIGNvbnN0IGNvbmZpZ01qc1BhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICdjb25maWcubWpzJyk7XG4gIGlmICghZnMuZXhpc3RzU3luYyhjb25maWdNanNQYXRoKSkgcmV0dXJuO1xuXG4gIGpzb25PYmoudHlwZSA9ICdtb2R1bGUnO1xuXG4gIGNvbnN0IGNvbmZpZ0R0c1BhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICdjb25maWcuZC50cycpO1xuICBpZiAoIWZzLmV4aXN0c1N5bmMoY29uZmlnRHRzUGF0aCkpIHJldHVybjtcblxuICBqc29uT2JqLmZpbGVzID0gWy4uLm5ldyBTZXQoWy4uLihqc29uT2JqLmZpbGVzID8/IFtdKSwgJ2NvbmZpZy5kLm10cyddKV07XG4gIC8vIE5vZGVOZXh0IHJlc29sdmVzIGEgcmVsYXRpdmUgYC4vY29uZmlnLm1qc2AgaW1wb3J0IHRvIGBjb25maWcuZC5tdHNgLCBub3RcbiAgLy8gdGhlIHBhY2thZ2UtbGV2ZWwgYHR5cGVzYCBmaWVsZC4gS2VlcCB0aGUgcHVibGlzaGVkIGNvbmZpZyBpbXBvcnRhYmxlIGZyb21cbiAgLy8gcGFja2FnZS1sb2NhbCBUeXBlU2NyaXB0IGxpbnRlciBzZXR0aW5ncy5cbiAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzVXRpbC5nZW5lcmF0ZUZpbGUocGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnY29uZmlnLmQubXRzJyksIGNvbmZpZ0RtdHNDb250ZW50KSk7XG59XG5cbmNvbnN0IGNvbmZpZ0RtdHNDb250ZW50ID0gYGV4cG9ydCB7IGRlZmF1bHQgfSBmcm9tICcuL2NvbmZpZy5qcyc7XG5gO1xuXG5mdW5jdGlvbiBhZGREZXBlbmRlbmN5VmVyc2lvbnNUb1BhY2thZ2VKc29uKGpzb25PYmo6IFdyaXRhYmxlUGFja2FnZUpzb24sIGRlcGVuZGVuY3lVcGRhdGVzOiBEZXBlbmRlbmN5VXBkYXRlcyk6IHZvaWQge1xuICBjb25zdCBwYWNrYWdlSnNvbkRlcGVuZGVuY2llcyA9IGpzb25PYmouZGVwZW5kZW5jaWVzO1xuICBjb25zdCBwYWNrYWdlSnNvbkRldkRlcGVuZGVuY2llcyA9IGpzb25PYmouZGV2RGVwZW5kZW5jaWVzO1xuICBkZXBlbmRlbmN5VXBkYXRlcy5kZXBlbmRlbmNpZXMgPSBhZGRQYWNrYWdlSnNvbkRlcGVuZGVuY2llcyhwYWNrYWdlSnNvbkRlcGVuZGVuY2llcywgZGVwZW5kZW5jeVVwZGF0ZXMuZGVwZW5kZW5jaWVzKTtcbiAgZGVwZW5kZW5jeVVwZGF0ZXMuZGV2RGVwZW5kZW5jaWVzID0gZGVwZW5kZW5jeVVwZGF0ZXMuZGV2RGVwZW5kZW5jaWVzLmZpbHRlcigoZGVwKSA9PiAhcGFja2FnZUpzb25EZXBlbmRlbmNpZXNbZGVwXSk7XG4gIGRlcGVuZGVuY3lVcGRhdGVzLmRldkRlcGVuZGVuY2llcyA9IGFkZFBhY2thZ2VKc29uRGVwZW5kZW5jaWVzKFxuICAgIHBhY2thZ2VKc29uRGV2RGVwZW5kZW5jaWVzLFxuICAgIGRlcGVuZGVuY3lVcGRhdGVzLmRldkRlcGVuZGVuY2llc1xuICApO1xufVxuXG5mdW5jdGlvbiByZW1vdmVFbXB0eURlcGVuZGVuY3lTZWN0aW9ucyhqc29uT2JqOiBQYWNrYWdlSnNvbik6IHZvaWQge1xuICBmb3IgKGNvbnN0IGtleSBvZiBkZXBlbmRlbmN5U2VjdGlvbktleXMpIHtcbiAgICBjb25zdCBzZWN0aW9uID0ganNvbk9ialtrZXldO1xuICAgIGlmIChzZWN0aW9uICYmIE9iamVjdC5rZXlzKHNlY3Rpb24pLmxlbmd0aCA9PT0gMCkge1xuICAgICAgUmVmbGVjdC5kZWxldGVQcm9wZXJ0eShqc29uT2JqLCBrZXkpO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBpbnN0YWxsRGVwZW5kZW5jeVVwZGF0ZXMoXG4gIGNvbmZpZzogUGFja2FnZUNvbmZpZyxcbiAganNvbk9iajogUGFja2FnZUpzb24sXG4gIGRlcGVuZGVuY3lVcGRhdGVzOiBEZXBlbmRlbmN5VXBkYXRlcyxcbiAgcGFja2FnZU1hbmFnZXI6ICdidW4nIHwgJ3lhcm4nXG4pOiB2b2lkIHtcbiAgY29uc3QgZGVwZW5kZW5jaWVzID0gZGVwZW5kZW5jeVVwZGF0ZXMuZGVwZW5kZW5jaWVzLmZpbHRlcigoZGVwKSA9PiAhanNvbk9iai5kZXZEZXBlbmRlbmNpZXM/LltkZXBdKTtcbiAgaW5zdGFsbE5wbURlcGVuZGVuY2llcyhjb25maWcsIHBhY2thZ2VNYW5hZ2VyLCBqc29uT2JqLmRlcGVuZGVuY2llcyA/PyB7fSwgZGVwZW5kZW5jaWVzLCBmYWxzZSk7XG5cbiAgY29uc3QgZGV2RGVwZW5kZW5jaWVzID0gZGVwZW5kZW5jeVVwZGF0ZXMuZGV2RGVwZW5kZW5jaWVzLmZpbHRlcigoZGVwKSA9PiAhanNvbk9iai5kZXBlbmRlbmNpZXM/LltkZXBdKTtcbiAgaW5zdGFsbE5wbURlcGVuZGVuY2llcyhjb25maWcsIHBhY2thZ2VNYW5hZ2VyLCBqc29uT2JqLmRldkRlcGVuZGVuY2llcyA/PyB7fSwgZGV2RGVwZW5kZW5jaWVzLCB0cnVlKTtcblxuICBjb25zdCBweXRob25QYWNrYWdlTWFuYWdlciA9IGdldFB5dGhvblBhY2thZ2VNYW5hZ2VyKGNvbmZpZyk7XG4gIGlmIChweXRob25QYWNrYWdlTWFuYWdlciAmJiBkZXBlbmRlbmN5VXBkYXRlcy5weXRob25EZXZEZXBlbmRlbmNpZXMubGVuZ3RoID4gMCkge1xuICAgIGNvbnN0IGRlcGVuZGVuY2llcyA9IFsuLi5uZXcgU2V0KGRlcGVuZGVuY3lVcGRhdGVzLnB5dGhvbkRldkRlcGVuZGVuY2llcyldO1xuICAgIGlmIChweXRob25QYWNrYWdlTWFuYWdlciA9PT0gJ3BvZXRyeScpIHtcbiAgICAgIHNwYXduU3luYygncG9ldHJ5JywgWydhZGQnLCAnLS1ncm91cCcsICdkZXYnLCAuLi5kZXBlbmRlbmNpZXNdLCBjb25maWcuZGlyUGF0aCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHNwYXduU3luYygndXYnLCBbJ2FkZCcsICctLWRldicsIC4uLmRlcGVuZGVuY2llc10sIGNvbmZpZy5kaXJQYXRoKTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gZ2V0UHl0aG9uUGFja2FnZU1hbmFnZXIoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogJ3BvZXRyeScgfCAndXYnIHwgdW5kZWZpbmVkIHtcbiAgaWYgKGNvbmZpZy5kb2VzQ29udGFpblV2TG9jaykgcmV0dXJuICd1dic7XG4gIGlmIChjb25maWcuZG9lc0NvbnRhaW5Qb2V0cnlMb2NrKSByZXR1cm4gJ3BvZXRyeSc7XG59XG5cbmZ1bmN0aW9uIGdldFB5dGhvblNldHVwQ29tbWFuZChwYWNrYWdlTWFuYWdlcjogJ3BvZXRyeScgfCAndXYnKTogc3RyaW5nIHtcbiAgaWYgKHBhY2thZ2VNYW5hZ2VyID09PSAndXYnKSByZXR1cm4gJ3V2IHN5bmMgLS1mcm96ZW4nO1xuICByZXR1cm4gJ3BvZXRyeSBjb25maWcgdmlydHVhbGVudnMuaW4tcHJvamVjdCB0cnVlICYmIHBvZXRyeSBlbnYgdXNlICQobWlzZSBjdXJyZW50IHB5dGhvbikgJiYgcG9ldHJ5IHJ1biBwaXAgaW5zdGFsbCAtLXVwZ3JhZGUgcGlwICYmIHBvZXRyeSBpbnN0YWxsJztcbn1cblxuZnVuY3Rpb24gaW5zdGFsbE5wbURlcGVuZGVuY2llcyhcbiAgY29uZmlnOiBQYWNrYWdlQ29uZmlnLFxuICBwYWNrYWdlTWFuYWdlcjogJ2J1bicgfCAneWFybicsXG4gIHBhY2thZ2VKc29uRGVwZW5kZW5jaWVzOiBQYXJ0aWFsPFJlY29yZDxzdHJpbmcsIHN0cmluZz4+LFxuICBkZXBlbmRlbmNpZXM6IHN0cmluZ1tdLFxuICBkZXY6IGJvb2xlYW5cbik6IHZvaWQge1xuICBpZiAoZGVwZW5kZW5jaWVzLmxlbmd0aCA9PT0gMCkgcmV0dXJuO1xuXG4gIGNvbnN0IGRlcGVuZGVuY3lTcGVjaWZpZXJzID0gW1xuICAgIC4uLm5ldyBTZXQoXG4gICAgICBkZXBlbmRlbmNpZXMubWFwKChkZXBlbmRlbmN5KSA9PlxuICAgICAgICBnZXRJbnN0YWxsRGVwZW5kZW5jeVNwZWNpZmllcihkZXBlbmRlbmN5LCBwYWNrYWdlSnNvbkRlcGVuZGVuY2llc1tkZXBlbmRlbmN5XSwgcGFja2FnZU1hbmFnZXIpXG4gICAgICApXG4gICAgKSxcbiAgXTtcbiAgc3Bhd25TeW5jKFxuICAgIHBhY2thZ2VNYW5hZ2VyLFxuICAgIFsnYWRkJywgLi4uKGRldiA/IFsnLUQnXSA6IFtdKSwgLi4uKGNvbmZpZy5pc0J1biA/IFsnLS1leGFjdCddIDogW10pLCAuLi5kZXBlbmRlbmN5U3BlY2lmaWVyc10sXG4gICAgY29uZmlnLmRpclBhdGhcbiAgKTtcbn1cblxuZnVuY3Rpb24gZ2V0SW5zdGFsbERlcGVuZGVuY3lTcGVjaWZpZXIoXG4gIGRlcGVuZGVuY3k6IHN0cmluZyxcbiAgY3VycmVudFZlcnNpb246IHN0cmluZyB8IHVuZGVmaW5lZCxcbiAgcGFja2FnZU1hbmFnZXI6ICdidW4nIHwgJ3lhcm4nXG4pOiBzdHJpbmcge1xuICAvLyBZYXJuIHByZWZlcnMgbG9jYWwgd29ya3NwYWNlcyB3aGVuIGFkZGluZyBhIGJhcmUgcGFja2FnZSBuYW1lLiBQYXNzaW5nIHRoZVxuICAvLyByZXNvbHZlZCB2ZXJzaW9uIGtlZXBzIG1hbmFnZWQgdG9vbHMgYXMgbnBtIGRlcGVuZGVuY2llcyBpbiBjb25maWctcGFja2FnZVxuICAvLyBtb25vcmVwb3MsIHdoZXJlIHRob3NlIHBhY2thZ2UgbmFtZXMgY2FuIGFsc28gZXhpc3QgYXMgd29ya3NwYWNlcy5cbiAgaWYgKHBhY2thZ2VNYW5hZ2VyID09PSAneWFybicgJiYgY3VycmVudFZlcnNpb24gJiYgIWlzV29ya3NwYWNlUHJvdG9jb2xSYW5nZShjdXJyZW50VmVyc2lvbikpIHtcbiAgICByZXR1cm4gYCR7ZGVwZW5kZW5jeX1AJHtjdXJyZW50VmVyc2lvbn1gO1xuICB9XG5cbiAgcmV0dXJuIGdldERlcGVuZGVuY3lTcGVjaWZpZXIoZGVwZW5kZW5jeSk7XG59XG5cbmZ1bmN0aW9uIGFkZFBhY2thZ2VKc29uRGVwZW5kZW5jaWVzKFxuICBwYWNrYWdlSnNvbkRlcGVuZGVuY2llczogUGFydGlhbDxSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+PixcbiAgZGVwZW5kZW5jaWVzOiBzdHJpbmdbXVxuKTogc3RyaW5nW10ge1xuICBjb25zdCBkZXBlbmRlbmNpZXNUb0luc3RhbGw6IHN0cmluZ1tdID0gW107XG4gIGZvciAoY29uc3QgZGVwZW5kZW5jeSBvZiBuZXcgU2V0KGRlcGVuZGVuY2llcykpIHtcbiAgICBjb25zdCBzaG91bGRVcGRhdGVFeGlzdGluZ0RlcGVuZGVuY3kgPSBzaG91bGRVcGRhdGVFeGlzdGluZ01hbmFnZWREZXBlbmRlbmN5KFxuICAgICAgZGVwZW5kZW5jeSxcbiAgICAgIHBhY2thZ2VKc29uRGVwZW5kZW5jaWVzW2RlcGVuZGVuY3ldXG4gICAgKTtcbiAgICBpZiAoc2hvdWxkVXBkYXRlRXhpc3RpbmdEZXBlbmRlbmN5KSB7XG4gICAgICBkZXBlbmRlbmNpZXNUb0luc3RhbGwucHVzaChkZXBlbmRlbmN5KTtcbiAgICB9XG4gICAgaWYgKFxuICAgICAgcGFja2FnZUpzb25EZXBlbmRlbmNpZXNbZGVwZW5kZW5jeV0gJiZcbiAgICAgICFzaG91bGRVcGRhdGVFeGlzdGluZ0RlcGVuZGVuY3kgJiZcbiAgICAgIHBhY2thZ2VKc29uRGVwZW5kZW5jaWVzW2RlcGVuZGVuY3ldICE9PSAnKidcbiAgICApXG4gICAgICBjb250aW51ZTtcbiAgICBwYWNrYWdlSnNvbkRlcGVuZGVuY2llc1tkZXBlbmRlbmN5XSA9IGdldExhdGVzdERlcGVuZGVuY3lWZXJzaW9uKGRlcGVuZGVuY3kpO1xuICB9XG4gIHJldHVybiBkZXBlbmRlbmNpZXNUb0luc3RhbGw7XG59XG5cbmZ1bmN0aW9uIGZvcm1hdFBhY2thZ2VKc29uV2l0aFByb2plY3RGb3JtYXR0ZXIoXG4gIGNvbmZpZzogUGFja2FnZUNvbmZpZyxcbiAgcGFja2FnZU1hbmFnZXI6ICdidW4nIHwgJ3lhcm4nLFxuICBmaWxlUGF0aDogc3RyaW5nXG4pOiB2b2lkIHtcbiAgY29uc3QgcmVsYXRpdmVGaWxlUGF0aCA9IHBhdGgucmVsYXRpdmUoY29uZmlnLmRpclBhdGgsIGZpbGVQYXRoKTtcbiAgaWYgKCFyZWxhdGl2ZUZpbGVQYXRoKSByZXR1cm47XG5cbiAgLy8gUmV1c2UgdGhlIHRhcmdldCByZXBvc2l0b3J5J3Mgb3duIGZvcm1hdHRlciBhZnRlciBkZXBlbmRlbmN5IGluc3RhbGxhdGlvbiBzb1xuICAvLyBwYWNrYWdlLmpzb24gbWF0Y2hlcyB3aGF0ZXZlciBpdHMgY3VycmVudCBzb3J0LXBhY2thZ2UtanNvbiB2ZXJzaW9uIGV4cGVjdHMuXG4gIC8vIFRoaXMgYXZvaWRzIGZvbGxvdy11cCBhdXRvZml4IGNvbW1pdHMgY2F1c2VkIG9ubHkgYnkgZm9ybWF0dGVyIHZlcnNpb24gZHJpZnRcbiAgLy8gYmV0d2VlbiB3YmZ5IGFuZCB0aGUgcHJvamVjdCBiZWluZyB1cGRhdGVkLlxuICBpZiAocGFja2FnZU1hbmFnZXIgPT09ICdidW4nKSB7XG4gICAgc3Bhd25TeW5jKCdidW54JywgWydzb3J0LXBhY2thZ2UtanNvbicsIHJlbGF0aXZlRmlsZVBhdGhdLCBjb25maWcuZGlyUGF0aCk7XG4gIH0gZWxzZSB7XG4gICAgc3Bhd25TeW5jKHBhY2thZ2VNYW5hZ2VyLCBbJ3NvcnQtcGFja2FnZS1qc29uJywgcmVsYXRpdmVGaWxlUGF0aF0sIGNvbmZpZy5kaXJQYXRoKTtcbiAgfVxufVxuXG4vLyBUT0RPOiByZW1vdmUgdGhlIGZvbGxvd2luZyBtaWdyYXRpb24gY29kZSBpbiBmdXR1cmVcbmFzeW5jIGZ1bmN0aW9uIHJlbW92ZURlcHJlY2F0ZWRTdHVmZihcbiAgY29uZmlnOiBQYWNrYWdlQ29uZmlnLFxuICBqc29uT2JqOiBTZXRSZXF1aXJlZDxQYWNrYWdlSnNvbiwgJ3NjcmlwdHMnIHwgJ2RlcGVuZGVuY2llcycgfCAnZGV2RGVwZW5kZW5jaWVzJyB8ICdwZWVyRGVwZW5kZW5jaWVzJz5cbik6IFByb21pc2U8dm9pZD4ge1xuICBpZiAoanNvbk9iai5hdXRob3IgPT09ICdXaWxsQm9vc3RlciBMTEMnKSB7XG4gICAganNvbk9iai5hdXRob3IgPSAnV2lsbEJvb3N0ZXIgSW5jLic7XG4gIH1cbiAgcmVtb3ZlU2VsZkRlcGVuZGVuY3koY29uZmlnLCBqc29uT2JqKTtcbiAgcmVwbGFjZVdpbGxCb29zdGVyQ29uZmlnc1dvcmtzcGFjZURlcGVuZGVuY3lSYW5nZXMoY29uZmlnLCBqc29uT2JqKTtcbiAgZGVsZXRlIGpzb25PYmouc2NyaXB0c1snc29ydC1wYWNrYWdlLWpzb24nXTtcbiAgZGVsZXRlIGpzb25PYmouc2NyaXB0c1snc29ydC1hbGwtcGFja2FnZS1qc29uJ107XG4gIGRlbGV0ZSBqc29uT2JqLnNjcmlwdHNbJ2NoZWNrLWFsbC1mb3ItYWknXTtcbiAgZGVsZXRlIGpzb25PYmouc2NyaXB0c1snY2hlY2stZm9yLWFpJ107XG4gIGRlbGV0ZSBqc29uT2JqLnNjcmlwdHNbJ3R5cGVjaGVjay93YXJuJ107XG4gIGRlbGV0ZSBqc29uT2JqLnNjcmlwdHNbJ3R5cGVjaGVjazpnZW4tY29kZSddO1xuICBkZWxldGUganNvbk9iai5zY3JpcHRzWyd0eXBlY2hlY2s6Y29kZWdlbiddO1xuICBkZWxldGUganNvbk9iai5kZXBlbmRlbmNpZXMudHNsaWI7XG4gIGRlbGV0ZSBqc29uT2JqLmRldkRlcGVuZGVuY2llc1snQHdpbGxib29zdGVyL3Jlbm92YXRlLWNvbmZpZyddO1xuICBkZWxldGUganNvbk9iai5kZXZEZXBlbmRlbmNpZXNbJ0B3aWxsYm9vc3Rlci90c2NvbmZpZyddO1xuICAvLyBOZXh0LmpzIHN0aWxsIHJlcXVpcmVzIHRoZSBgdHlwZXNjcmlwdGAgcGFja2FnZSBhdCBidWlsZC9kZXYgdGltZSBmb3JcbiAgLy8gVHlwZVNjcmlwdCBwcm9qZWN0cyBldmVuIHdoZW4gcmVwb3MgdXNlIHRzZ28gZm9yIGV4cGxpY2l0IHR5cGVjaGVja2luZy5cbiAgaWYgKCFjb25maWcuZGVwZW5kaW5nLm5leHQpIHtcbiAgICBkZWxldGUganNvbk9iai5kZXZEZXBlbmRlbmNpZXNbdHlwZXNjcmlwdERlcGVuZGVuY3ldO1xuICB9XG4gIGRlbGV0ZSBqc29uT2JqLmRldkRlcGVuZGVuY2llcy5sZXJuYTtcbiAgLy8gVG8gaW5zdGFsbCB0aGUgbGF0ZXN0IHBpbnN0XG4gIGRlbGV0ZSBqc29uT2JqLmRldkRlcGVuZGVuY2llcy5waW5zdDtcbiAgZGVsZXRlIGpzb25PYmouc2NyaXB0c1snZmx1dHRlci1mb3JtYXQnXTtcbiAgZGVsZXRlIGpzb25PYmouc2NyaXB0c1snZm9ybWF0LWZsdXR0ZXInXTtcbiAgZGVsZXRlIGpzb25PYmouc2NyaXB0c1sncHl0aG9uLWZvcm1hdCddO1xuICBkZWxldGUganNvbk9iai5zY3JpcHRzWydmb3JtYXQtcHl0aG9uJ107XG4gIGRlbGV0ZSBqc29uT2JqLnNjcmlwdHMucHJldHRpZXI7XG4gIGRlbGV0ZSBqc29uT2JqLnNjcmlwdHNbJ2NoZWNrLWFsbCddO1xuICBkZWxldGUganNvbk9iai5zY3JpcHRzWyd2ZXJpZnktY29kZSddO1xuICBkZWxldGUganNvbk9iai5zY3JpcHRzWyd2ZXJpZnktY29kZS13aXRoLXRlc3RzJ107XG4gIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiBmcy5wcm9taXNlcy5ybShwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICdsZXJuYS5qc29uJyksIHsgZm9yY2U6IHRydWUgfSkpO1xuXG4gIHJlbW92ZVdpbGxCb29zdGVyQ29uZmlnc01hbmFnZWREZXBlbmRlbmNpZXMoY29uZmlnLCBqc29uT2JqKTtcbiAgcmVtb3ZlT2Jzb2xldGVMaW50RGVwZW5kZW5jaWVzKGpzb25PYmosIGNvbmZpZyk7XG59XG5cbmZ1bmN0aW9uIHJlbW92ZVNlbGZEZXBlbmRlbmN5KFxuICBjb25maWc6IFBhY2thZ2VDb25maWcsXG4gIGpzb25PYmo6IFNldFJlcXVpcmVkPFBhY2thZ2VKc29uLCAnZGVwZW5kZW5jaWVzJyB8ICdkZXZEZXBlbmRlbmNpZXMnIHwgJ3BlZXJEZXBlbmRlbmNpZXMnPlxuKTogdm9pZCB7XG4gIGNvbnN0IHBhY2thZ2VOYW1lID0ganNvbk9iai5uYW1lIHx8IHBhdGguYmFzZW5hbWUoY29uZmlnLmRpclBhdGgpO1xuXG4gIC8vIEEgcGFja2FnZSBjYW4gaW1wb3J0IGl0c2VsZiB0aHJvdWdoIE5vZGUncyBwYWNrYWdlIHNlbGYtcmVmZXJlbmNlIHdpdGhvdXRcbiAgLy8gZGVjbGFyaW5nIGl0c2VsZjsga2VlcGluZyB0aGF0IGVkZ2UgYnJlYWtzIG1vbm9yZXBvIHJlbGVhc2UgdG9wb2xvZ2ljYWwgc29ydGluZy5cbiAgZm9yIChjb25zdCBzZWN0aW9uIG9mIGdldERlcGVuZGVuY3lTZWN0aW9ucyhqc29uT2JqKSkge1xuICAgIFJlZmxlY3QuZGVsZXRlUHJvcGVydHkoc2VjdGlvbiwgcGFja2FnZU5hbWUpO1xuICB9XG59XG5cbmZ1bmN0aW9uIHJlcGxhY2VXaWxsQm9vc3RlckNvbmZpZ3NXb3Jrc3BhY2VEZXBlbmRlbmN5UmFuZ2VzKGNvbmZpZzogUGFja2FnZUNvbmZpZywganNvbk9iajogUGFja2FnZUpzb24pOiB2b2lkIHtcbiAgaWYgKCFjb25maWcuaXNXaWxsQm9vc3RlckNvbmZpZ3MpIHJldHVybjtcblxuICBmb3IgKGNvbnN0IHNlY3Rpb24gb2YgZ2V0RGVwZW5kZW5jeVNlY3Rpb25zKGpzb25PYmopKSB7XG4gICAgZm9yIChjb25zdCBbZGVwZW5kZW5jeSwgdmVyc2lvbl0gb2YgT2JqZWN0LmVudHJpZXMoc2VjdGlvbikpIHtcbiAgICAgIGlmICghdmVyc2lvbikgY29udGludWU7XG4gICAgICBpZiAoIWlzV29ya3NwYWNlUHJvdG9jb2xSYW5nZSh2ZXJzaW9uKSkgY29udGludWU7XG4gICAgICAvLyB3aWxsYm9vc3Rlci1jb25maWdzIHB1Ymxpc2hlcyB0aGVzZSBwYWNrYWdlcyBpbmRlcGVuZGVudGx5LCBzbyBnZW5lcmF0ZWRcbiAgICAgIC8vIHBhY2thZ2UgbWV0YWRhdGEgbXVzdCBkZXNjcmliZSBucG0gcmVsZWFzZSBlZGdlcyBpbnN0ZWFkIG9mIGxvY2FsXG4gICAgICAvLyB3b3Jrc3BhY2UgZWRnZXMgdGhhdCByZWxlYXNlIHRvb2xpbmcgdHJlYXRzIGFzIG1vbm9yZXBvIGdyYXBoIGxpbmtzLlxuICAgICAgLy8gVGhlIGZpbmFsIGB5YXJuIGluc3RhbGwgLS1uby1pbW11dGFibGVgIHN5bmNzIHRoZSBsb2NrZmlsZSBhZnRlciB0aGlzXG4gICAgICAvLyBtaWdyYXRpb24sIGV2ZW4gd2hlbiB0aGUgZGVwZW5kZW5jeSBpcyBub3QgcGFydCBvZiB3YmZ5J3MgbWFuYWdlZCBsaXN0LlxuICAgICAgc2VjdGlvbltkZXBlbmRlbmN5XSA9IGdldExhdGVzdERlcGVuZGVuY3lWZXJzaW9uKGRlcGVuZGVuY3kpO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiByZW1vdmVXaWxsQm9vc3RlckNvbmZpZ3NNYW5hZ2VkRGVwZW5kZW5jaWVzKFxuICBjb25maWc6IFBhY2thZ2VDb25maWcsXG4gIGpzb25PYmo6IFNldFJlcXVpcmVkPFBhY2thZ2VKc29uLCAnZGVwZW5kZW5jaWVzJyB8ICdkZXZEZXBlbmRlbmNpZXMnIHwgJ3BlZXJEZXBlbmRlbmNpZXMnPlxuKTogdm9pZCB7XG4gIGlmICghY29uZmlnLmlzV2lsbEJvb3N0ZXJDb25maWdzKSByZXR1cm47XG5cbiAgY29uc3Qgc2VjdGlvbnMgPSBnZXREZXBlbmRlbmN5U2VjdGlvbnMoanNvbk9iaik7XG4gIGZvciAoY29uc3QgZGVwZW5kZW5jeSBvZiB3aWxsQm9vc3RlckNvbmZpZ3NNYW5hZ2VkRGVwZW5kZW5jaWVzKSB7XG4gICAgLy8gd2lsbGJvb3N0ZXItY29uZmlncyBwdWJsaXNoZXMgdGhlc2UgbWFuYWdlZCBjb25maWcgcGFja2FnZXMgZnJvbSB0aGUgc2FtZVxuICAgIC8vIG1vbm9yZXBvLiBLZWVwaW5nIHRoZW0gaW4gc3VicGFja2FnZSBtZXRhZGF0YSBjcmVhdGVzIGxvY2FsIHdvcmtzcGFjZVxuICAgIC8vIGdyYXBoIGVkZ2VzIHRoYXQgbXVsdGktc2VtYW50aWMtcmVsZWFzZSBzb3J0cyBhcyByZWxlYXNlIGRlcGVuZGVuY2llcy5cbiAgICBmb3IgKGNvbnN0IHNlY3Rpb24gb2Ygc2VjdGlvbnMpIHtcbiAgICAgIFJlZmxlY3QuZGVsZXRlUHJvcGVydHkoc2VjdGlvbiwgZGVwZW5kZW5jeSk7XG4gICAgfVxuICB9XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHJlbW92ZVVudXNlZFRzY29uZmlnQmFzZURlcGVuZGVuY2llcyhcbiAgY29uZmlnOiBQYWNrYWdlQ29uZmlnLFxuICBqc29uT2JqOiBXcml0YWJsZVBhY2thZ2VKc29uLFxuICB1c2VkRGVwZW5kZW5jaWVzOiBzdHJpbmdbXVxuKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IHVzZWREZXBlbmRlbmN5U2V0ID0gbmV3IFNldCh1c2VkRGVwZW5kZW5jaWVzKTtcbiAgY29uc3QgZXhpc3RpbmdUc2NvbmZpZ0Jhc2VEZXBlbmRlbmNpZXMgPSBhd2FpdCBnZXRFeGlzdGluZ1RzY29uZmlnQmFzZURlcGVuZGVuY2llcyhjb25maWcpO1xuICBmb3IgKGNvbnN0IGRlcGVuZGVuY3kgb2YgbWFuYWdlZFRzY29uZmlnQmFzZURlcGVuZGVuY2llcykge1xuICAgIGlmICh1c2VkRGVwZW5kZW5jeVNldC5oYXMoZGVwZW5kZW5jeSkgfHwgZXhpc3RpbmdUc2NvbmZpZ0Jhc2VEZXBlbmRlbmNpZXMuaGFzKGRlcGVuZGVuY3kpKSBjb250aW51ZTtcbiAgICAvLyB3YmZ5IG93bnMgdGhlc2UgYmFzZS1jb25maWcgcGFja2FnZXMuIFJlbW92ZSBzdGFsZSB2YXJpYW50cyB3aGVuIHJlcG9cbiAgICAvLyBjYXBhYmlsaXRpZXMgY2hhbmdlLCBzdWNoIGFzIE5leHQuanMgdGFraW5nIG93bmVyc2hpcCBvZiB0c2NvbmZpZy5qc29uLlxuICAgIGZvciAoY29uc3Qgc2VjdGlvbiBvZiBnZXREZXBlbmRlbmN5U2VjdGlvbnMoanNvbk9iaikpIHtcbiAgICAgIFJlZmxlY3QuZGVsZXRlUHJvcGVydHkoc2VjdGlvbiwgZGVwZW5kZW5jeSk7XG4gICAgfVxuICB9XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGdldEV4aXN0aW5nVHNjb25maWdCYXNlRGVwZW5kZW5jaWVzKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8U2V0PHN0cmluZz4+IHtcbiAgY29uc3QgZXhpc3RpbmdUc2NvbmZpZ0Jhc2VEZXBlbmRlbmNpZXMgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgY29uc3QgZmlsZVBhdGhzID0gYXdhaXQgZmcuZ2xvYignKiovdHNjb25maWcqLmpzb24nLCB7XG4gICAgY3dkOiBjb25maWcuZGlyUGF0aCxcbiAgICBkb3Q6IHRydWUsXG4gICAgaWdub3JlOiBnbG9iSWdub3JlLFxuICB9KTtcblxuICBmb3IgKGNvbnN0IGZpbGVQYXRoIG9mIGZpbGVQYXRocykge1xuICAgIGNvbnN0IGFic29sdXRlRmlsZVBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsIGZpbGVQYXRoKTtcbiAgICB0cnkge1xuICAgICAgY29uc3QgcGFyc2VkID0gdHMucGFyc2VDb25maWdGaWxlVGV4dFRvSnNvbihcbiAgICAgICAgYWJzb2x1dGVGaWxlUGF0aCxcbiAgICAgICAgYXdhaXQgZnMucHJvbWlzZXMucmVhZEZpbGUoYWJzb2x1dGVGaWxlUGF0aCwgJ3V0ZjgnKVxuICAgICAgKTtcbiAgICAgIGlmIChwYXJzZWQuZXJyb3IpIHtcbiAgICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICAgIGBQcmVzZXJ2ZSBtYW5hZ2VkIEB0c2NvbmZpZyBkZXBlbmRlbmNpZXMgYmVjYXVzZSAke2Fic29sdXRlRmlsZVBhdGh9IGNvdWxkIG5vdCBiZSBwYXJzZWQ6ICR7Zm9ybWF0VHNEaWFnbm9zdGljKHBhcnNlZC5lcnJvcil9YFxuICAgICAgICApO1xuICAgICAgICByZXR1cm4gbmV3IFNldChtYW5hZ2VkVHNjb25maWdCYXNlRGVwZW5kZW5jaWVzKTtcbiAgICAgIH1cbiAgICAgIGZvciAoY29uc3QgdmFsdWUgb2Ygbm9ybWFsaXplVHNjb25maWdFeHRlbmRzKChwYXJzZWQuY29uZmlnIGFzIHsgZXh0ZW5kcz86IHVua25vd24gfSB8IHVuZGVmaW5lZCk/LmV4dGVuZHMpKSB7XG4gICAgICAgIGZvciAoY29uc3QgZGVwZW5kZW5jeSBvZiBtYW5hZ2VkVHNjb25maWdCYXNlRGVwZW5kZW5jaWVzKSB7XG4gICAgICAgICAgaWYgKHZhbHVlID09PSBkZXBlbmRlbmN5IHx8IHZhbHVlLnN0YXJ0c1dpdGgoYCR7ZGVwZW5kZW5jeX0vYCkpIHtcbiAgICAgICAgICAgIGV4aXN0aW5nVHNjb25maWdCYXNlRGVwZW5kZW5jaWVzLmFkZChkZXBlbmRlbmN5KTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICBgUHJlc2VydmUgbWFuYWdlZCBAdHNjb25maWcgZGVwZW5kZW5jaWVzIGJlY2F1c2UgJHthYnNvbHV0ZUZpbGVQYXRofSBjb3VsZCBub3QgYmUgcmVhZDogJHtlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6IFN0cmluZyhlcnJvcil9YFxuICAgICAgKTtcbiAgICAgIHJldHVybiBuZXcgU2V0KG1hbmFnZWRUc2NvbmZpZ0Jhc2VEZXBlbmRlbmNpZXMpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBleGlzdGluZ1RzY29uZmlnQmFzZURlcGVuZGVuY2llcztcbn1cblxuZnVuY3Rpb24gZm9ybWF0VHNEaWFnbm9zdGljKGRpYWdub3N0aWM6IHRzLkRpYWdub3N0aWMpOiBzdHJpbmcge1xuICByZXR1cm4gdHMuZmxhdHRlbkRpYWdub3N0aWNNZXNzYWdlVGV4dChkaWFnbm9zdGljLm1lc3NhZ2VUZXh0LCAnXFxuJyk7XG59XG5cbmZ1bmN0aW9uIG5vcm1hbGl6ZVRzY29uZmlnRXh0ZW5kcyh2YWx1ZTogdW5rbm93bik6IHN0cmluZ1tdIHtcbiAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycpIHJldHVybiBbdmFsdWVdO1xuICBpZiAoIUFycmF5LmlzQXJyYXkodmFsdWUpKSByZXR1cm4gW107XG4gIHJldHVybiB2YWx1ZS5maWx0ZXIoKGl0ZW0pOiBpdGVtIGlzIHN0cmluZyA9PiB0eXBlb2YgaXRlbSA9PT0gJ3N0cmluZycpO1xufVxuXG5mdW5jdGlvbiBnZXREZXBlbmRlbmN5U2VjdGlvbnMoanNvbk9iajogUGFja2FnZUpzb24pOiBQYXJ0aWFsPFJlY29yZDxzdHJpbmcsIHN0cmluZz4+W10ge1xuICByZXR1cm4gZGVwZW5kZW5jeVNlY3Rpb25LZXlzXG4gICAgLm1hcCgoa2V5KSA9PiBqc29uT2JqW2tleV0pXG4gICAgLmZpbHRlcigoc2VjdGlvbik6IHNlY3Rpb24gaXMgUGFydGlhbDxSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+PiA9PiAhIXNlY3Rpb24pO1xufVxuXG5mdW5jdGlvbiBnZXRMYXRlc3REZXBlbmRlbmN5VmVyc2lvbihkZXBlbmRlbmN5OiBzdHJpbmcpOiBzdHJpbmcge1xuICBjb25zdCBjYWNoZWRWZXJzaW9uID0gbGF0ZXN0RGVwZW5kZW5jeVZlcnNpb25DYWNoZS5nZXQoZGVwZW5kZW5jeSk7XG4gIGlmIChjYWNoZWRWZXJzaW9uKSByZXR1cm4gY2FjaGVkVmVyc2lvbjtcblxuICBjb25zdCB2ZXJzaW9uID0gZ2V0RGVwZW5kZW5jeVZlcnNpb25Gcm9tTnBtKGRlcGVuZGVuY3kpO1xuICBsYXRlc3REZXBlbmRlbmN5VmVyc2lvbkNhY2hlLnNldChkZXBlbmRlbmN5LCB2ZXJzaW9uKTtcbiAgcmV0dXJuIHZlcnNpb247XG59XG5cbmZ1bmN0aW9uIGdldERlcGVuZGVuY3lWZXJzaW9uRnJvbU5wbShkZXBlbmRlbmN5OiBzdHJpbmcpOiBzdHJpbmcge1xuICAvLyBucG0ncyBsYXRlc3QgZGlzdC10YWcgc3RpbGwgdHJhY2tzIFRTNyBkZXYgc25hcHNob3RzOyB3YmZ5IHNob3VsZCBmb2xsb3dcbiAgLy8gdGhlIHB1YmxpYyBiZXRhIGNoYW5uZWwgdW50aWwgdGhlIHN0YWJsZSBUUzcgcGFja2FnZSBsYXlvdXQgaXMgZmluYWxpemVkLlxuICByZXR1cm4gKFxuICAgIHNwYXduU3luY0FuZFJldHVyblN0ZG91dChcbiAgICAgICducG0nLFxuICAgICAgWydzaG93JywgZ2V0RGVwZW5kZW5jeVNwZWNpZmllcihkZXBlbmRlbmN5KSwgJ3ZlcnNpb24nLCAnLS13b3Jrc3BhY2VzPWZhbHNlJ10sXG4gICAgICBwcm9jZXNzLmN3ZCgpXG4gICAgKSB8fCAnKidcbiAgKTtcbn1cblxuZnVuY3Rpb24gZ2V0RGVwZW5kZW5jeVNwZWNpZmllcihkZXBlbmRlbmN5OiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gZGVwZW5kZW5jeSA9PT0gdHlwZXNjcmlwdEdvRGVwZW5kZW5jeSA/IGAke2RlcGVuZGVuY3l9QGJldGFgIDogZGVwZW5kZW5jeTtcbn1cblxuZnVuY3Rpb24gcmVtb3ZlT2Jzb2xldGVMaW50RGVwZW5kZW5jaWVzKFxuICBqc29uT2JqOiBTZXRSZXF1aXJlZDxQYWNrYWdlSnNvbiwgJ2RlcGVuZGVuY2llcycgfCAnZGV2RGVwZW5kZW5jaWVzJyB8ICdwZWVyRGVwZW5kZW5jaWVzJz4sXG4gIGNvbmZpZzogUGFja2FnZUNvbmZpZ1xuKTogdm9pZCB7XG4gIGNvbnN0IHByZXNlcnZlTWljcm9tYXRjaCA9IHNob3VsZFByZXNlcnZlTWljcm9tYXRjaChjb25maWcpO1xuICBmb3IgKGNvbnN0IGRlcGVuZGVuY3kgb2Ygb2Jzb2xldGVMaW50RGVwZW5kZW5jaWVzKSB7XG4gICAgaWYgKHByZXNlcnZlTWljcm9tYXRjaCAmJiBtaWNyb21hdGNoUGFja2FnZU5hbWVzLmhhcyhkZXBlbmRlbmN5KSkgY29udGludWU7XG4gICAgaWYgKHNob3VsZFByZXNlcnZlQ29uZmlnUGFja2FnZUxpbnREZXBlbmRlbmN5KGpzb25PYmosIGNvbmZpZywgZGVwZW5kZW5jeSkpIGNvbnRpbnVlO1xuICAgIGRlbGV0ZSBqc29uT2JqLmRlcGVuZGVuY2llc1tkZXBlbmRlbmN5XTtcbiAgICBkZWxldGUganNvbk9iai5kZXZEZXBlbmRlbmNpZXNbZGVwZW5kZW5jeV07XG4gICAgZGVsZXRlIGpzb25PYmoucGVlckRlcGVuZGVuY2llc1tkZXBlbmRlbmN5XTtcbiAgfVxufVxuXG5mdW5jdGlvbiBzaG91bGRQcmVzZXJ2ZUNvbmZpZ1BhY2thZ2VMaW50RGVwZW5kZW5jeShcbiAganNvbk9iajogU2V0UmVxdWlyZWQ8UGFja2FnZUpzb24sICdkZXBlbmRlbmNpZXMnIHwgJ2RldkRlcGVuZGVuY2llcycgfCAncGVlckRlcGVuZGVuY2llcyc+LFxuICBjb25maWc6IFBhY2thZ2VDb25maWcsXG4gIGRlcGVuZGVuY3k6IHN0cmluZ1xuKTogYm9vbGVhbiB7XG4gIGlmICghaXNQdWJsaXNoZWRXaWxsYm9vc3RlckNvbmZpZ3NQYWNrYWdlKGNvbmZpZykpIHJldHVybiBmYWxzZTtcbiAgaWYgKGpzb25PYmoucGVlckRlcGVuZGVuY2llc1tkZXBlbmRlbmN5XSkgcmV0dXJuIHRydWU7XG5cbiAgLy8gUHVibGlzaGVkIGNvbmZpZyBwYWNrYWdlcyBuZWVkIGxvY2FsIHR5cGUtb25seSBkZXBzIHRvIHZhbGlkYXRlIHRoZVxuICAvLyBwYWNrYWdlLXByb3ZpZGVkIGNvbmZpZyBkZWNsYXJhdGlvbnMgdW5kZXIgWWFybiBQblAuXG4gIHJldHVybiBkZXBlbmRlbmN5ID09PSAnQHR5cGVzL2VzbGludCcgJiYgISFqc29uT2JqLnBlZXJEZXBlbmRlbmNpZXMuZXNsaW50O1xufVxuXG5mdW5jdGlvbiBzaG91bGRQcmVzZXJ2ZU1pY3JvbWF0Y2goY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogYm9vbGVhbiB7XG4gIC8vIHdpbGxib29zdGVyLWNvbmZpZ3Mgc3VicGFja2FnZXMgcHVibGlzaCBjb25maWcgZmlsZXMgYXMgdGhlaXIgcHJvZHVjdCwgc29cbiAgLy8gbWljcm9tYXRjaCBpcyBwYWNrYWdlIGRhdGEgdGhlcmUuIE90aGVyIHJlcG9zIGtlZXAgbWljcm9tYXRjaCBvbmx5IHdoZW5cbiAgLy8gcHJvZHVjdCBjb2RlIGltcG9ydHMgaXQ7IG90aGVyd2lzZSBpdCBpcyB0cmVhdGVkIGFzIG9ic29sZXRlIEVTTGludC1lcmFcbiAgLy8gdG9vbGluZy5cbiAgcmV0dXJuIChjb25maWcuaXNXaWxsQm9vc3RlckNvbmZpZ3MgJiYgIWNvbmZpZy5pc1Jvb3QpIHx8IGRvZXNQcm9kdWN0Q29kZUltcG9ydE1pY3JvbWF0Y2goY29uZmlnLmRpclBhdGgpO1xufVxuXG5mdW5jdGlvbiBkb2VzUHJvZHVjdENvZGVJbXBvcnRNaWNyb21hdGNoKGRpclBhdGg6IHN0cmluZyk6IGJvb2xlYW4ge1xuICBjb25zdCBmaWxlUGF0aHMgPSBmZy5nbG9iU3luYygnc3JjLyoqLyoue2pzLGpzeCxtanMsY2pzLHRzLHRzeCxtdHMsY3RzfScsIHtcbiAgICBjd2Q6IGRpclBhdGgsXG4gICAgZG90OiB0cnVlLFxuICAgIGlnbm9yZTogZ2xvYklnbm9yZSxcbiAgfSk7XG4gIHJldHVybiBmaWxlUGF0aHMuc29tZSgoZmlsZVBhdGgpID0+IHtcbiAgICB0cnkge1xuICAgICAgcmV0dXJuIG1pY3JvbWF0Y2hJbXBvcnRQYXR0ZXJuLnRlc3QoZnMucmVhZEZpbGVTeW5jKHBhdGgucmVzb2x2ZShkaXJQYXRoLCBmaWxlUGF0aCksICd1dGY4JykpO1xuICAgIH0gY2F0Y2gge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfSk7XG59XG5cbmZ1bmN0aW9uIHNob3VsZFVwZGF0ZUV4aXN0aW5nTWFuYWdlZERlcGVuZGVuY3koZGVwZW5kZW5jeTogc3RyaW5nLCBjdXJyZW50VmVyc2lvbjogc3RyaW5nIHwgdW5kZWZpbmVkKTogYm9vbGVhbiB7XG4gIGlmICghY3VycmVudFZlcnNpb24pIHJldHVybiB0cnVlO1xuICBpZiAoY3VycmVudFZlcnNpb24gPT09ICcqJykgcmV0dXJuIHRydWU7XG4gIGlmIChpc1dvcmtzcGFjZVByb3RvY29sUmFuZ2UoY3VycmVudFZlcnNpb24pKSByZXR1cm4gdHJ1ZTtcbiAgLy8gd2JmeS1tYW5hZ2VkIHRvb2xzIG11c3QgYmUga2VwdCBjdXJyZW50IGV2ZW4gd2hlbiB0aGUgcGFja2FnZSBhbHJlYWR5IHBpbnNcbiAgLy8gYSBjb25jcmV0ZSB2ZXJzaW9uLiBJbiBwYXJ0aWN1bGFyLCBidWlsZC10cyBvd25zIGRlY2xhcmF0aW9uIG91dHB1dCBwYXRocy5cbiAgcmV0dXJuIChcbiAgICBkZXBlbmRlbmN5ID09PSAnQHdpbGxib29zdGVyL3diJyB8fFxuICAgIGRlcGVuZGVuY3kgPT09IGJ1aWxkVHNEZXBlbmRlbmN5IHx8XG4gICAgb3hsaW50RGVwcy5pbmNsdWRlcyhkZXBlbmRlbmN5KSB8fFxuICAgIGRlcGVuZGVuY3kgPT09IHR5cGVzY3JpcHRHb0RlcGVuZGVuY3lcbiAgKTtcbn1cblxuZnVuY3Rpb24gaXNXb3Jrc3BhY2VQcm90b2NvbFJhbmdlKHZlcnNpb246IHN0cmluZyk6IGJvb2xlYW4ge1xuICByZXR1cm4gdmVyc2lvbi5zdGFydHNXaXRoKCd3b3Jrc3BhY2U6Jyk7XG59XG5cbmZ1bmN0aW9uIGZvcm1hdFJlcG9zaXRvcnlGb3JQYWNrYWdlSnNvbihcbiAgcmVwb3NpdG9yeTogUGFja2FnZUpzb25bJ3JlcG9zaXRvcnknXSxcbiAgZXhpc3RpbmdSZXBvc2l0b3J5PzogUGFja2FnZUpzb25bJ3JlcG9zaXRvcnknXVxuKTogUGFja2FnZUpzb25bJ3JlcG9zaXRvcnknXSB7XG4gIGNvbnN0IG5vcm1hbGl6ZWRSZXBvc2l0b3J5ID0gbm9ybWFsaXplUmVwb3NpdG9yeVVybEZvclBhY2thZ2VKc29uKHJlcG9zaXRvcnkpO1xuICBpZiAobm9ybWFsaXplZFJlcG9zaXRvcnkpIHtcbiAgICByZXR1cm4gYnVpbGROb3JtYWxpemVkUmVwb3NpdG9yeUZvclBhY2thZ2VKc29uKG5vcm1hbGl6ZWRSZXBvc2l0b3J5LCByZXBvc2l0b3J5LCBleGlzdGluZ1JlcG9zaXRvcnkpO1xuICB9XG5cbiAgY29uc3Qgbm9ybWFsaXplZEV4aXN0aW5nUmVwb3NpdG9yeSA9IG5vcm1hbGl6ZVJlcG9zaXRvcnlVcmxGb3JQYWNrYWdlSnNvbihleGlzdGluZ1JlcG9zaXRvcnkpO1xuICBpZiAobm9ybWFsaXplZEV4aXN0aW5nUmVwb3NpdG9yeSkge1xuICAgIHJldHVybiBidWlsZE5vcm1hbGl6ZWRSZXBvc2l0b3J5Rm9yUGFja2FnZUpzb24obm9ybWFsaXplZEV4aXN0aW5nUmVwb3NpdG9yeSwgZXhpc3RpbmdSZXBvc2l0b3J5KTtcbiAgfVxuXG4gIHJldHVybiByZXBvc2l0b3J5O1xufVxuXG5mdW5jdGlvbiBub3JtYWxpemVSZXBvc2l0b3J5VXJsRm9yUGFja2FnZUpzb24ocmVwb3NpdG9yeTogUGFja2FnZUpzb25bJ3JlcG9zaXRvcnknXSk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGlmICh0eXBlb2YgcmVwb3NpdG9yeSA9PT0gJ3N0cmluZycpIHtcbiAgICBpZiAoIXJlcG9zaXRvcnkuc3RhcnRzV2l0aCgnZ2l0aHViOicpKSByZXR1cm47XG5cbiAgICBjb25zdCBbb3duZXIsIHJlcG9dID0gZ2l0SHViVXRpbC5nZXRPcmdBbmROYW1lKHJlcG9zaXRvcnkpO1xuICAgIGlmICghb3duZXIgfHwgIXJlcG8pIHJldHVybjtcbiAgICByZXR1cm4gYGdpdCtodHRwczovL2dpdGh1Yi5jb20vJHtvd25lcn0vJHtyZXBvfS5naXRgO1xuICB9XG5cbiAgY29uc3QgcmVwb3NpdG9yeVVybCA9IHJlcG9zaXRvcnk/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+IGZzLnByb21pc2VzLnJtKGAke2NvbmZpZy5kaXJQYXRofS8ubGludHN0YWdlZHJjLmpzb25gLCB7IGZvcmNlOiB0cnVlIH0pKSxcbiAgICBdKTtcbiAgfSk7XG59XG4iLCJpbnRlcmZhY2UgVG9vbENvbmZpZ0NvbnRlbnRPcHRpb25zIHtcbiAgaXNFc21QYWNrYWdlOiBib29sZWFuO1xuICBwYWNrYWdlTmFtZTogc3RyaW5nO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2VuZXJhdGVUb29sQ29uZmlnQ29udGVudChvcHRpb25zOiBUb29sQ29uZmlnQ29udGVudE9wdGlvbnMpOiBzdHJpbmcge1xuICAvLyBDb21tb25KUyBwYWNrYWdlcyBuZWVkIHJlcXVpcmUvbW9kdWxlLmV4cG9ydHMgaGVyZTogdGhlc2UgLnRzIGNvbmZpZyBmaWxlcyBhcmVcbiAgLy8gYXV0by1kaXNjb3ZlcmVkIGFuZCB0eXBlLWNoZWNrZWQgYXMgQ29tbW9uSlMsIGJ1dCB0aGUgc2hhcmVkIGNvbmZpZyBwYWNrYWdlc1xuICAvLyBhcmUgRVNNLW9ubHkuXG4gIGlmICghb3B0aW9ucy5pc0VzbVBhY2thZ2UpIHtcbiAgICByZXR1cm4gYC8vIG94bGludC1kaXNhYmxlIHVuaWNvcm4vcHJlZmVyLW1vZHVsZSAtLSBUb29sIGNvbmZpZyBmaWxlcyBhcmUgYXV0by1kaXNjb3ZlcmVkIGFzIC50cywgYW5kIENvbW1vbkpTIGF2b2lkcyBOb2RlIHR5cGVsZXNzIEVTTSB3YXJuaW5ncy5cbmNvbnN0IHRvb2xDb25maWcgPSByZXF1aXJlKCcke29wdGlvbnMucGFja2FnZU5hbWV9Jyk7XG5cbm1vZHVsZS5leHBvcnRzID0gdG9vbENvbmZpZy5kZWZhdWx0ID8/IHRvb2xDb25maWc7XG5gO1xuICB9XG5cbiAgcmV0dXJuIGBpbXBvcnQgY29uZmlnIGZyb20gJyR7b3B0aW9ucy5wYWNrYWdlTmFtZX0nO1xuXG5leHBvcnQgZGVmYXVsdCBjb25maWc7XG5gO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gbm9ybWFsaXplVG9vbENvbmZpZ0NvbnRlbnQoY29udGVudDogc3RyaW5nIHwgdW5kZWZpbmVkKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgcmV0dXJuIGNvbnRlbnQ/LnRyaW0oKTtcbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGZzVXRpbCB9IGZyb20gJy4uL3V0aWxzL2ZzVXRpbC5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcblxuaW1wb3J0IHsgZ2VuZXJhdGVUb29sQ29uZmlnQ29udGVudCwgbm9ybWFsaXplVG9vbENvbmZpZ0NvbnRlbnQgfSBmcm9tICcuL3Rvb2xDb25maWdDb250ZW50LmpzJztcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlT3hmbXRDb25maWcoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZ2VuZXJhdGVPeGZtdENvbmZpZycsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBsZWdhY3lKc29uQ29uZmlnUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJy5veGZtdHJjLmpzb24nKTtcbiAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJ294Zm10LmNvbmZpZy50cycpO1xuICAgIGNvbnN0IGV4aXN0aW5nQ29udGVudCA9IGF3YWl0IGZzVXRpbC5yZWFkRmlsZUlnbm9yaW5nRXJyb3IoZmlsZVBhdGgpO1xuICAgIGNvbnN0IGRlc2lyZWRDb250ZW50ID0gZ2V0Q29uZmlnQ29udGVudChjb25maWcpO1xuICAgIGNvbnN0IHByb21pc2VzID0gW3Byb21pc2VQb29sLnJ1bigoKSA9PiBmcy5wcm9taXNlcy5ybShsZWdhY3lKc29uQ29uZmlnUGF0aCwgeyBmb3JjZTogdHJ1ZSB9KSldO1xuICAgIGlmIChub3JtYWxpemVUb29sQ29uZmlnQ29udGVudChleGlzdGluZ0NvbnRlbnQpICE9PSBub3JtYWxpemVUb29sQ29uZmlnQ29udGVudChkZXNpcmVkQ29udGVudCkpIHtcbiAgICAgIHByb21pc2VzLnB1c2gocHJvbWlzZVBvb2wucnVuKCgpID0+IGZzVXRpbC5nZW5lcmF0ZUZpbGUoZmlsZVBhdGgsIGRlc2lyZWRDb250ZW50KSkpO1xuICAgIH1cbiAgICBhd2FpdCBQcm9taXNlLmFsbChwcm9taXNlcyk7XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBnZXRDb25maWdDb250ZW50KGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IHN0cmluZyB7XG4gIHJldHVybiBnZW5lcmF0ZVRvb2xDb25maWdDb250ZW50KHtcbiAgICBpc0VzbVBhY2thZ2U6IGNvbmZpZy5pc0VzbVBhY2thZ2UsXG4gICAgcGFja2FnZU5hbWU6ICdAd2lsbGJvb3N0ZXIvb3hmbXQtY29uZmlnJyxcbiAgfSk7XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBmc1V0aWwgfSBmcm9tICcuLi91dGlscy9mc1V0aWwuanMnO1xuaW1wb3J0IHsgcHJvbWlzZVBvb2wgfSBmcm9tICcuLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5pbXBvcnQgeyBpc1B1Ymxpc2hlZFdpbGxib29zdGVyQ29uZmlnc1BhY2thZ2UgfSBmcm9tICcuLi91dGlscy93aWxsYm9vc3RlckNvbmZpZ3NVdGlsLmpzJztcblxuaW1wb3J0IHsgbm9ybWFsaXplVG9vbENvbmZpZ0NvbnRlbnQgfSBmcm9tICcuL3Rvb2xDb25maWdDb250ZW50LmpzJztcblxudHlwZSBPeGxpbnRCbG9ja05hbWUgPSAnYmFzZScgfCAnZXhwb3J0JztcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlT3hsaW50Q29uZmlnKGNvbmZpZzogUGFja2FnZUNvbmZpZywgX3Jvb3RDb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdnZW5lcmF0ZU94bGludENvbmZpZycsIGFzeW5jICgpID0+IHtcbiAgICAvLyB3aWxsYm9vc3Rlci1jb25maWdzIHB1Ymxpc2hlcyBjb25maWcgZmlsZXMgYXMgcHJvZHVjdCBjb2RlLCBzbyBtaWdyYXRpb25cbiAgICAvLyBtdXN0IG5vdCByZW1vdmUgcGFja2FnZS1wcm92aWRlZCBsaW50ZXIgc2V0dGluZ3MuXG4gICAgY29uc3Qgc2hvdWxkUHJlc2VydmVQdWJsaXNoZWRMaW50ZXJDb25maWcgPSBpc1B1Ymxpc2hlZFdpbGxib29zdGVyQ29uZmlnc1BhY2thZ2UoY29uZmlnKTtcbiAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJ294bGludC5jb25maWcudHMnKTtcbiAgICBjb25zdCBleGlzdGluZ0NvbnRlbnQgPSBhd2FpdCBmc1V0aWwucmVhZEZpbGVJZ25vcmluZ0Vycm9yKGZpbGVQYXRoKTtcbiAgICBjb25zdCBkZXNpcmVkQ29udGVudCA9XG4gICAgICBzaG91bGRQcmVzZXJ2ZVB1Ymxpc2hlZExpbnRlckNvbmZpZyAmJiBleGlzdGluZ0NvbnRlbnRcbiAgICAgICAgPyBleGlzdGluZ0NvbnRlbnRcbiAgICAgICAgOiBnZXRDb25maWdDb250ZW50V2l0aE1hbmFnZWRCbG9ja3MoY29uZmlnLCBleGlzdGluZ0NvbnRlbnQsIGZpbGVQYXRoKTtcblxuICAgIGNvbnN0IHByb21pc2VzOiBQcm9taXNlPHZvaWQ+W10gPSBbXTtcbiAgICBpZiAoIXNob3VsZFByZXNlcnZlUHVibGlzaGVkTGludGVyQ29uZmlnKSB7XG4gICAgICBwcm9taXNlcy5wdXNoKFxuICAgICAgICBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnMucHJvbWlzZXMucm0ocGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnLm94bGludHJjLmpzb24nKSwgeyBmb3JjZTogdHJ1ZSB9KSksXG4gICAgICAgIHByb21pc2VQb29sLnJ1bigoKSA9PiBmcy5wcm9taXNlcy5ybShwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICdiaW9tZS5qc29uJyksIHsgZm9yY2U6IHRydWUgfSkpLFxuICAgICAgICBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnMucHJvbWlzZXMucm0ocGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnYmlvbWUuanNvbmMnKSwgeyBmb3JjZTogdHJ1ZSB9KSksXG4gICAgICAgIHByb21pc2VQb29sLnJ1bigoKSA9PiBmcy5wcm9taXNlcy5ybShwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICcuZXNsaW50cmMnKSwgeyBmb3JjZTogdHJ1ZSB9KSksXG4gICAgICAgIHByb21pc2VQb29sLnJ1bigoKSA9PiBmcy5wcm9taXNlcy5ybShwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICcuZXNsaW50cmMuY2pzJyksIHsgZm9yY2U6IHRydWUgfSkpLFxuICAgICAgICBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnMucHJvbWlzZXMucm0ocGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnLmVzbGludHJjLmpzJyksIHsgZm9yY2U6IHRydWUgfSkpLFxuICAgICAgICBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnMucHJvbWlzZXMucm0ocGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnLmVzbGludHJjLmpzb24nKSwgeyBmb3JjZTogdHJ1ZSB9KSksXG4gICAgICAgIHByb21pc2VQb29sLnJ1bigoKSA9PiBmcy5wcm9taXNlcy5ybShwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICcuZXNsaW50cmMueWFtbCcpLCB7IGZvcmNlOiB0cnVlIH0pKSxcbiAgICAgICAgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzLnByb21pc2VzLnJtKHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJy5lc2xpbnRyYy55bWwnKSwgeyBmb3JjZTogdHJ1ZSB9KSksXG4gICAgICAgIHByb21pc2VQb29sLnJ1bigoKSA9PiBmcy5wcm9taXNlcy5ybShwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICdlc2xpbnQuY29uZmlnLmNqcycpLCB7IGZvcmNlOiB0cnVlIH0pKSxcbiAgICAgICAgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzLnByb21pc2VzLnJtKHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJ2VzbGludC5jb25maWcuanMnKSwgeyBmb3JjZTogdHJ1ZSB9KSksXG4gICAgICAgIHByb21pc2VQb29sLnJ1bigoKSA9PiBmcy5wcm9taXNlcy5ybShwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICdlc2xpbnQuY29uZmlnLm1qcycpLCB7IGZvcmNlOiB0cnVlIH0pKSxcbiAgICAgICAgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzLnByb21pc2VzLnJtKHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJ2VzbGludC5jb25maWcudHMnKSwgeyBmb3JjZTogdHJ1ZSB9KSlcbiAgICAgICk7XG4gICAgfVxuICAgIGlmIChub3JtYWxpemVUb29sQ29uZmlnQ29udGVudChleGlzdGluZ0NvbnRlbnQpICE9PSBub3JtYWxpemVUb29sQ29uZmlnQ29udGVudChkZXNpcmVkQ29udGVudCkpIHtcbiAgICAgIHByb21pc2VzLnB1c2gocHJvbWlzZVBvb2wucnVuKCgpID0+IGZzVXRpbC5nZW5lcmF0ZUZpbGUoZmlsZVBhdGgsIGRlc2lyZWRDb250ZW50KSkpO1xuICAgIH1cbiAgICBhd2FpdCBQcm9taXNlLmFsbChwcm9taXNlcyk7XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBnZXRDb25maWdDb250ZW50V2l0aE1hbmFnZWRCbG9ja3MoXG4gIGNvbmZpZzogUGFja2FnZUNvbmZpZyxcbiAgZXhpc3RpbmdDb250ZW50OiBzdHJpbmcgfCB1bmRlZmluZWQsXG4gIGZpbGVQYXRoOiBzdHJpbmdcbik6IHN0cmluZyB7XG4gIGNvbnN0IGRlc2lyZWRDb250ZW50ID0gZ2V0Q29uZmlnQ29udGVudChjb25maWcpO1xuICBpZiAoIWV4aXN0aW5nQ29udGVudCkgcmV0dXJuIGRlc2lyZWRDb250ZW50O1xuICBpZiAoaGFzTWFuYWdlZEJsb2NrcyhleGlzdGluZ0NvbnRlbnQpKSByZXR1cm4gcmVwbGFjZU1hbmFnZWRCbG9ja3MoZXhpc3RpbmdDb250ZW50LCBkZXNpcmVkQ29udGVudCwgZmlsZVBhdGgpO1xuICByZXR1cm4gZGVzaXJlZENvbnRlbnQ7XG59XG5cbmZ1bmN0aW9uIGdldENvbmZpZ0NvbnRlbnQoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogc3RyaW5nIHtcbiAgLy8gRG8gbm90IGNvbGxhcHNlIHRoaXMgdG8gYSBzdGF0aWMgaW1wb3J0IGZvciBldmVyeSBwYWNrYWdlLiBDb21tb25KUyBwYWNrYWdlc1xuICAvLyB0eXBlLWNoZWNrIGF1dG8tZGlzY292ZXJlZCBveGxpbnQuY29uZmlnLnRzIGFzIENvbW1vbkpTLCBzbyBpbXBvcnRpbmcgdGhlIEVTTVxuICAvLyBAd2lsbGJvb3N0ZXIvb3hsaW50LWNvbmZpZyBwYWNrYWdlIHRyaWdnZXJzIFRTMTQ3OS4gS2VlcCB0aGlzIGluIHN5bmMgd2l0aFxuICAvLyBsaXRlcmFjeS10ZXN0J3MgZ2VuZXJhdGVkIGNvbmZpZyBwYXR0ZXJuLlxuICBpZiAoIWNvbmZpZy5pc0VzbVBhY2thZ2UpIHtcbiAgICByZXR1cm4gYCR7Z2V0TWFuYWdlZEJsb2NrKFxuICAgICAgJ2Jhc2UnLFxuICAgICAgYC8vIG94bGludC1kaXNhYmxlIHVuaWNvcm4vcHJlZmVyLW1vZHVsZSAtLSBPeGxpbnQgb25seSBhdXRvLWRpc2NvdmVycyAudHMgY29uZmlnIGZpbGVzLCBhbmQgQ29tbW9uSlMgYXZvaWRzIE5vZGUgdHlwZWxlc3MgRVNNIHdhcm5pbmdzLlxuY29uc3Qgb3hsaW50QmFzZUNvbmZpZyA9IHJlcXVpcmUoJ0B3aWxsYm9vc3Rlci9veGxpbnQtY29uZmlnJyk7XG5cbmNvbnN0IGNvbmZpZyA9IG94bGludEJhc2VDb25maWcuZGVmYXVsdCA/PyBveGxpbnRCYXNlQ29uZmlnO2BcbiAgICApfVxuXG4ke2dldE1hbmFnZWRCbG9jaygnZXhwb3J0JywgJ21vZHVsZS5leHBvcnRzID0gY29uZmlnOycpfVxuYDtcbiAgfVxuXG4gIHJldHVybiBgJHtnZXRNYW5hZ2VkQmxvY2soJ2Jhc2UnLCBcImltcG9ydCBjb25maWcgZnJvbSAnQHdpbGxib29zdGVyL294bGludC1jb25maWcnO1wiKX1cblxuJHtnZXRNYW5hZ2VkQmxvY2soJ2V4cG9ydCcsICdleHBvcnQgZGVmYXVsdCBjb25maWc7Jyl9XG5gO1xufVxuXG5mdW5jdGlvbiBoYXNNYW5hZ2VkQmxvY2tzKGNvbnRlbnQ6IHN0cmluZyk6IGJvb2xlYW4ge1xuICByZXR1cm4gY29udGVudC5pbmNsdWRlcyhnZXRTdGFydE1hcmtlcignYmFzZScpKSB8fCBjb250ZW50LmluY2x1ZGVzKGdldFN0YXJ0TWFya2VyKCdleHBvcnQnKSk7XG59XG5cbmZ1bmN0aW9uIHJlcGxhY2VNYW5hZ2VkQmxvY2tzKGV4aXN0aW5nQ29udGVudDogc3RyaW5nLCBkZXNpcmVkQ29udGVudDogc3RyaW5nLCBmaWxlUGF0aDogc3RyaW5nKTogc3RyaW5nIHtcbiAgbGV0IGNvbnRlbnQgPSBleGlzdGluZ0NvbnRlbnQ7XG4gIGZvciAoY29uc3QgYmxvY2tOYW1lIG9mIFsnYmFzZScsICdleHBvcnQnXSBzYXRpc2ZpZXMgT3hsaW50QmxvY2tOYW1lW10pIHtcbiAgICBjb25zdCByZXBsYWNlbWVudCA9IGV4dHJhY3RNYW5hZ2VkQmxvY2soZGVzaXJlZENvbnRlbnQsIGJsb2NrTmFtZSk7XG4gICAgaWYgKCFyZXBsYWNlbWVudCkgY29udGludWU7XG5cbiAgICBjb25zdCBuZXh0Q29udGVudCA9IHJlcGxhY2VNYW5hZ2VkQmxvY2soY29udGVudCwgYmxvY2tOYW1lLCByZXBsYWNlbWVudCk7XG4gICAgaWYgKCFuZXh0Q29udGVudCkge1xuICAgICAgY29uc29sZS53YXJuKGBTa2lwcGVkIHVwZGF0aW5nIGluY29tcGxldGUgJHtibG9ja05hbWV9IGJsb2NrIGluIG94bGludCBjb25maWc6ICR7ZmlsZVBhdGh9YCk7XG4gICAgICByZXR1cm4gZXhpc3RpbmdDb250ZW50O1xuICAgIH1cbiAgICBjb250ZW50ID0gbmV4dENvbnRlbnQ7XG4gIH1cbiAgcmV0dXJuIGNvbnRlbnQ7XG59XG5cbmZ1bmN0aW9uIGV4dHJhY3RNYW5hZ2VkQmxvY2soY29udGVudDogc3RyaW5nLCBibG9ja05hbWU6IE94bGludEJsb2NrTmFtZSk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIHJldHVybiBnZXRNYW5hZ2VkQmxvY2tSZWdFeHAoYmxvY2tOYW1lKS5leGVjKGNvbnRlbnQpPy5bMF07XG59XG5cbmZ1bmN0aW9uIHJlcGxhY2VNYW5hZ2VkQmxvY2soY29udGVudDogc3RyaW5nLCBibG9ja05hbWU6IE94bGludEJsb2NrTmFtZSwgcmVwbGFjZW1lbnQ6IHN0cmluZyk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IHBhdHRlcm4gPSBnZXRNYW5hZ2VkQmxvY2tSZWdFeHAoYmxvY2tOYW1lKTtcbiAgaWYgKCFwYXR0ZXJuLnRlc3QoY29udGVudCkpIHJldHVybiB1bmRlZmluZWQ7XG4gIHJldHVybiBjb250ZW50LnJlcGxhY2UocGF0dGVybiwgcmVwbGFjZW1lbnQpO1xufVxuXG5mdW5jdGlvbiBnZXRNYW5hZ2VkQmxvY2tSZWdFeHAoYmxvY2tOYW1lOiBPeGxpbnRCbG9ja05hbWUpOiBSZWdFeHAge1xuICByZXR1cm4gbmV3IFJlZ0V4cChgJHtlc2NhcGVSZWdFeHAoZ2V0U3RhcnRNYXJrZXIoYmxvY2tOYW1lKSl9W1xcXFxzXFxcXFNdKj8ke2VzY2FwZVJlZ0V4cChnZXRFbmRNYXJrZXIoYmxvY2tOYW1lKSl9YCk7XG59XG5cbmZ1bmN0aW9uIGdldE1hbmFnZWRCbG9jayhibG9ja05hbWU6IE94bGludEJsb2NrTmFtZSwgY29udGVudDogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIGAke2dldFN0YXJ0TWFya2VyKGJsb2NrTmFtZSl9XG4ke2NvbnRlbnR9XG4ke2dldEVuZE1hcmtlcihibG9ja05hbWUpfWA7XG59XG5cbmZ1bmN0aW9uIGdldFN0YXJ0TWFya2VyKGJsb2NrTmFtZTogT3hsaW50QmxvY2tOYW1lKTogc3RyaW5nIHtcbiAgcmV0dXJuIGAvLyB3YmZ5OnN0YXJ0IG94bGludC0ke2Jsb2NrTmFtZX1gO1xufVxuXG5mdW5jdGlvbiBnZXRFbmRNYXJrZXIoYmxvY2tOYW1lOiBPeGxpbnRCbG9ja05hbWUpOiBzdHJpbmcge1xuICByZXR1cm4gYC8vIHdiZnk6ZW5kIG94bGludC0ke2Jsb2NrTmFtZX1gO1xufVxuXG5mdW5jdGlvbiBlc2NhcGVSZWdFeHAodmFsdWU6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiB2YWx1ZS5yZXBsYWNlQWxsKC9bLiorP14ke30oKXxbXFxdXFxcXF0vZywgU3RyaW5nLnJhd2BcXCQmYCk7XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBmc1V0aWwgfSBmcm9tICcuLi91dGlscy9mc1V0aWwuanMnO1xuaW1wb3J0IHsgaWdub3JlRmlsZVV0aWwgfSBmcm9tICcuLi91dGlscy9pZ25vcmVGaWxlVXRpbC5qcyc7XG5pbXBvcnQgeyBkb2VzQ29udGFpbkphdmEgfSBmcm9tICcuLi91dGlscy9wYWNrYWdlQ2FwYWJpbGl0aWVzLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuXG5jb25zdCBjb21tb25Db250ZW50ID0gYFxuM3JkLXBhcnR5L1xuYW5kcm9pZC9cbmlvcy9cbm5vLWZvcm1hdC9cbnRlc3QtZml4dHVyZXMvXG50ZXN0L2ZpeHR1cmVzL1xuKi5kLnRzXG4qLm1pbi5qc1xuLnlhcm4vXG4ucG5wLmpzXG5gO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVQcmV0dGllcmlnbm9yZShjb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdnZW5lcmF0ZVByZXR0aWVyaWdub3JlJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnLnByZXR0aWVyaWdub3JlJyk7XG4gICAgaWYgKCFkb2VzQ29udGFpbkphdmEoY29uZmlnKSkge1xuICAgICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzLnByb21pc2VzLnJtKGZpbGVQYXRoLCB7IGZvcmNlOiB0cnVlIH0pKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgY29udGVudCA9IChhd2FpdCBmc1V0aWwucmVhZEZpbGVJZ25vcmluZ0Vycm9yKGZpbGVQYXRoKSkgPz8gJyc7XG4gICAgY29uc3QgaGVhZFVzZXJDb250ZW50ID0gaWdub3JlRmlsZVV0aWwuZ2V0SGVhZFVzZXJDb250ZW50KGNvbnRlbnQpO1xuICAgIGNvbnN0IHRhaWxVc2VyQ29udGVudCA9IGlnbm9yZUZpbGVVdGlsLmdldFRhaWxVc2VyQ29udGVudChjb250ZW50KTtcblxuICAgIGNvbnN0IGdpdGlnbm9yZUZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnLmdpdGlnbm9yZScpO1xuICAgIGNvbnN0IGdpdGlnbm9yZUNvbnRlbnQgPSAoYXdhaXQgaWdub3JlRmlsZVV0aWwucmVhZEdpdGlnbm9yZVdpdGhvdXRTZXBhcmF0b3JzKGdpdGlnbm9yZUZpbGVQYXRoKSkgfHwgJyc7XG5cbiAgICBsZXQgYWRkaXRpb25hbENvbnRlbnQgPSAnJztcbiAgICBpZiAoY29uZmlnLmRvZXNDb250YWluUHVic3BlY1lhbWwpIHtcbiAgICAgIGFkZGl0aW9uYWxDb250ZW50ID0gYFxuYW5kcm9pZC9hcHAvXG5pb3MvUnVubmVyL0Fzc2V0cy54Y2Fzc2V0cy9cbnB1YnNwZWMueWFtbFxuYDtcbiAgICB9XG5cbiAgICBjb25zdCBuZXdDb250ZW50ID0gaGVhZFVzZXJDb250ZW50ICsgY29tbW9uQ29udGVudCArIGFkZGl0aW9uYWxDb250ZW50ICsgZ2l0aWdub3JlQ29udGVudCArIHRhaWxVc2VyQ29udGVudDtcbiAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnNVdGlsLmdlbmVyYXRlRmlsZShmaWxlUGF0aCwgbmV3Q29udGVudCkpO1xuICB9KTtcbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCBtZXJnZSBmcm9tICdkZWVwbWVyZ2UnO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBmc1V0aWwgfSBmcm9tICcuLi91dGlscy9mc1V0aWwuanMnO1xuaW1wb3J0IHsgb3ZlcndyaXRlTWVyZ2UgfSBmcm9tICcuLi91dGlscy9tZXJnZVV0aWwuanMnO1xuaW1wb3J0IHsgcHJvbWlzZVBvb2wgfSBmcm9tICcuLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5cbmNvbnN0IGpzb25PYmogPSB7XG4gIHZlbnZQYXRoOiAnLicsXG4gIHZlbnY6ICcudmVudicsXG59O1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVQeXJpZ2h0Q29uZmlnSnNvbihjb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdnZW5lcmF0ZVB5cmlnaHRDb25maWdKc29uJywgYXN5bmMgKCkgPT4ge1xuICAgIGxldCBuZXdTZXR0aW5nczogb2JqZWN0ID0gc3RydWN0dXJlZENsb25lKGpzb25PYmopO1xuICAgIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAncHlyaWdodGNvbmZpZy5qc29uJyk7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IG9sZENvbnRlbnQgPSBhd2FpdCBmcy5wcm9taXNlcy5yZWFkRmlsZShmaWxlUGF0aCwgJ3V0ZjgnKTtcbiAgICAgIGNvbnN0IG9sZFNldHRpbmdzID0gSlNPTi5wYXJzZShvbGRDb250ZW50KSBhcyBvYmplY3Q7XG4gICAgICBuZXdTZXR0aW5ncyA9IG1lcmdlLmFsbChbbmV3U2V0dGluZ3MsIG9sZFNldHRpbmdzLCBuZXdTZXR0aW5nc10sIHsgYXJyYXlNZXJnZTogb3ZlcndyaXRlTWVyZ2UgfSk7XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBkbyBub3RoaW5nXG4gICAgfVxuICAgIGNvbnN0IG5ld0NvbnRlbnQgPSBKU09OLnN0cmluZ2lmeShuZXdTZXR0aW5ncywgdW5kZWZpbmVkLCAyKTtcbiAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnNVdGlsLmdlbmVyYXRlRmlsZShmaWxlUGF0aCwgbmV3Q29udGVudCkpO1xuICB9KTtcbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGZzVXRpbCB9IGZyb20gJy4uL3V0aWxzL2ZzVXRpbC5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcblxuY29uc3Qgc2VtYW50aWNSZWxlYXNlQmFkZ2UgPVxuICAnWyFbc2VtYW50aWMtcmVsZWFzZV0oaHR0cHM6Ly9pbWcuc2hpZWxkcy5pby9iYWRnZS8lMjAlMjAlRjAlOUYlOTMlQTYlRjAlOUYlOUElODAtc2VtYW50aWMtLXJlbGVhc2UtZTEwMDc5LnN2ZyldKGh0dHBzOi8vZ2l0aHViLmNvbS9zZW1hbnRpYy1yZWxlYXNlL3NlbWFudGljLXJlbGVhc2UpJztcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlUmVhZG1lKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2dlbmVyYXRlUmVhZG1lJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnUkVBRE1FLm1kJyk7XG4gICAgbGV0IG5ld0NvbnRlbnQgPSBhd2FpdCBmcy5wcm9taXNlcy5yZWFkRmlsZShmaWxlUGF0aCwgJ3V0ZjgnKTtcblxuICAgIGlmIChmcy5leGlzdHNTeW5jKHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJy5yZWxlYXNlcmMuanNvbicpKSkge1xuICAgICAgbmV3Q29udGVudCA9IGluc2VydEJhZGdlKG5ld0NvbnRlbnQsIHNlbWFudGljUmVsZWFzZUJhZGdlKTtcbiAgICB9XG5cbiAgICBjb25zdCByZXBvc2l0b3J5ID0gY29uZmlnLnJlcG9zaXRvcnk/LnNsaWNlKGNvbmZpZy5yZXBvc2l0b3J5LmluZGV4T2YoJzonKSArIDEpO1xuICAgIGNvbnN0IHdvcmtmbG93c1BhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICcuZ2l0aHViJywgJ3dvcmtmbG93cycpO1xuICAgIGNvbnN0IGZpbGVOYW1lcyA9IGZzLmV4aXN0c1N5bmMod29ya2Zsb3dzUGF0aCkgPyBmcy5yZWFkZGlyU3luYyh3b3JrZmxvd3NQYXRoKSA6IFtdO1xuICAgIGZvciAoY29uc3QgZmlsZU5hbWUgb2YgZmlsZU5hbWVzKSB7XG4gICAgICBpZiAoIWZpbGVOYW1lLnN0YXJ0c1dpdGgoJ3Rlc3QnKSAmJiAhZmlsZU5hbWUuc3RhcnRzV2l0aCgnZGVwbG95JykpIGNvbnRpbnVlO1xuXG4gICAgICBsZXQgYmFkZ2VOYW1lID0gZmlsZU5hbWU7XG4gICAgICBiYWRnZU5hbWUgPSAoYmFkZ2VOYW1lWzBdIHx8ICcnKS50b1VwcGVyQ2FzZSgpICsgYmFkZ2VOYW1lLnNsaWNlKDEsIGJhZGdlTmFtZS5pbmRleE9mKCcuJykpO1xuICAgICAgYmFkZ2VOYW1lID0gYmFkZ2VOYW1lLnJlcGxhY2UoJy0nLCAnICcpO1xuICAgICAgaWYgKCFyZXBvc2l0b3J5KSBjb250aW51ZTtcbiAgICAgIGNvbnN0IGJhZGdlID0gYFshWyR7YmFkZ2VOYW1lfV0oaHR0cHM6Ly9naXRodWIuY29tLyR7cmVwb3NpdG9yeX0vYWN0aW9ucy93b3JrZmxvd3MvJHtmaWxlTmFtZX0vYmFkZ2Uuc3ZnKV0oaHR0cHM6Ly9naXRodWIuY29tLyR7cmVwb3NpdG9yeX0vYWN0aW9ucy93b3JrZmxvd3MvJHtmaWxlTmFtZX0pYDtcbiAgICAgIGlmIChmcy5leGlzdHNTeW5jKHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgYC5naXRodWIvd29ya2Zsb3dzLyR7ZmlsZU5hbWV9YCkpKSB7XG4gICAgICAgIG5ld0NvbnRlbnQgPSByZW1vdmVHaXRIdWJBY3Rpb25zQmFkZ2UobmV3Q29udGVudCwgYmFkZ2VOYW1lLCBmaWxlTmFtZSk7XG4gICAgICAgIG5ld0NvbnRlbnQgPSBpbnNlcnRCYWRnZShuZXdDb250ZW50LCBiYWRnZSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzVXRpbC5nZW5lcmF0ZUZpbGUoZmlsZVBhdGgsIG5ld0NvbnRlbnQpKTtcbiAgfSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpbnNlcnRCYWRnZShyZWFkbWU6IHN0cmluZywgYmFkZ2U6IHN0cmluZyk6IHN0cmluZyB7XG4gIC8vIOaXouOBq2JhZGdl44GM44GC44KL5aC05ZCI44Gv5YmK6ZmkXG4gIHJlYWRtZSA9IHJlYWRtZS5yZXBsYWNlKGJhZGdlLCAnJykucmVwbGFjZUFsbCgvXFxuXFxuXFxuKy9nLCAnXFxuXFxuJyk7XG5cbiAgZm9yIChsZXQgaSA9IDA7IGkgPCByZWFkbWUubGVuZ3RoOyBpKyspIHtcbiAgICBpZiAocmVhZG1lW2kgLSAxXSA9PT0gJ1xcbicgJiYgcmVhZG1lW2ldID09PSAnXFxuJykge1xuICAgICAgY29uc3QgYmVmb3JlID0gcmVhZG1lLnNsaWNlKDAsIGkgKyAxKTtcbiAgICAgIGxldCBhZnRlciA9IHJlYWRtZS5zbGljZShpICsgMSk7XG4gICAgICBpZiAoIWFmdGVyLnN0YXJ0c1dpdGgoJ1snKSAmJiAhYWZ0ZXIuc3RhcnRzV2l0aCgnIScpKSB7XG4gICAgICAgIGFmdGVyID0gYFxcbiR7YWZ0ZXJ9YDtcbiAgICAgIH1cbiAgICAgIHJldHVybiBgJHtiZWZvcmV9JHtiYWRnZX1cXG4ke2FmdGVyfWA7XG4gICAgfVxuICB9XG4gIHJldHVybiBgJHtyZWFkbWV9XFxuJHtiYWRnZX1cXG5gO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcmVtb3ZlR2l0SHViQWN0aW9uc0JhZGdlKHJlYWRtZTogc3RyaW5nLCBiYWRnZU5hbWU6IHN0cmluZywgZmlsZU5hbWU6IHN0cmluZyk6IHN0cmluZyB7XG4gIGNvbnN0IGVzY2FwZWRCYWRnZU5hbWUgPSBlc2NhcGVSZWdFeHAoYmFkZ2VOYW1lKTtcbiAgY29uc3QgZXNjYXBlZEZpbGVOYW1lID0gZXNjYXBlUmVnRXhwKGZpbGVOYW1lKTtcbiAgcmV0dXJuIHJlYWRtZVxuICAgIC5yZXBsYWNlQWxsKFxuICAgICAgbmV3IFJlZ0V4cChcbiAgICAgICAgU3RyaW5nLnJhd2BcXFshXFxbJHtlc2NhcGVkQmFkZ2VOYW1lfVxcXVxcKGh0dHBzOi8vZ2l0aHViXFwuY29tL1teL1xccyldKy9bXi9cXHMpXSsvYWN0aW9ucy93b3JrZmxvd3MvJHtlc2NhcGVkRmlsZU5hbWV9L2JhZGdlXFwuc3ZnXFwpXFxdXFwoaHR0cHM6Ly9naXRodWJcXC5jb20vW14vXFxzKV0rL1teL1xccyldKy9hY3Rpb25zL3dvcmtmbG93cy8ke2VzY2FwZWRGaWxlTmFtZX1cXClcXG4/YCxcbiAgICAgICAgJ2d1J1xuICAgICAgKSxcbiAgICAgICcnXG4gICAgKVxuICAgIC5yZXBsYWNlQWxsKC9cXG5cXG5cXG4rL2csICdcXG5cXG4nKTtcbn1cblxuZnVuY3Rpb24gZXNjYXBlUmVnRXhwKHZhbHVlOiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gdmFsdWUucmVwbGFjZUFsbCgvWy4qKz9eJHt9KCl8W1xcXVxcXFxdL2csIFN0cmluZy5yYXdgXFwkJmApO1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IG1lcmdlIGZyb20gJ2RlZXBtZXJnZSc7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGZzVXRpbCB9IGZyb20gJy4uL3V0aWxzL2ZzVXRpbC5qcyc7XG5pbXBvcnQgeyBvdmVyd3JpdGVNZXJnZSB9IGZyb20gJy4uL3V0aWxzL21lcmdlVXRpbC5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlUmVsZWFzZXJjKHJvb3RDb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdnZW5lcmF0ZVJlbGVhc2VyYycsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShyb290Q29uZmlnLmRpclBhdGgsICcucmVsZWFzZXJjLmpzb24nKTtcbiAgICBpZiAoIWZzLmV4aXN0c1N5bmMoZmlsZVBhdGgpKSByZXR1cm47XG5cbiAgICBjb25zdCBzZXR0aW5ncyA9IEpTT04ucGFyc2UoYXdhaXQgZnMucHJvbWlzZXMucmVhZEZpbGUoZmlsZVBhdGgsICd1dGY4JykpIGFzIHtcbiAgICAgIHBsdWdpbnM/OiAoc3RyaW5nIHwgW3N0cmluZywgdW5rbm93bl0pW107XG4gICAgfTtcbiAgICBjb25zdCBwbHVnaW5zID0gc2V0dGluZ3MucGx1Z2lucyA/PyBbXTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHBsdWdpbnMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNvbnN0IHBsdWdpbkVudHJ5ID0gcGx1Z2luc1tpXTtcbiAgICAgIGNvbnN0IGlzQXJyYXkgPSBBcnJheS5pc0FycmF5KHBsdWdpbkVudHJ5KTtcbiAgICAgIGNvbnN0IHBsdWdpbiA9IGlzQXJyYXkgPyBwbHVnaW5FbnRyeVswXSA6IHBsdWdpbkVudHJ5O1xuICAgICAgY29uc3Qgb2xkQ29uZmlnID0gKGlzQXJyYXkgJiYgcGx1Z2luRW50cnlbMV0pIHx8IHt9O1xuICAgICAgaWYgKHBsdWdpbiA9PT0gJ0BzZW1hbnRpYy1yZWxlYXNlL2NvbW1pdC1hbmFseXplcicpIHtcbiAgICAgICAgcGx1Z2luc1tpXSA9IFtcbiAgICAgICAgICAnQHNlbWFudGljLXJlbGVhc2UvY29tbWl0LWFuYWx5emVyJyxcbiAgICAgICAgICBtZXJnZS5hbGwoXG4gICAgICAgICAgICBbXG4gICAgICAgICAgICAgIG9sZENvbmZpZyxcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHByZXNldDogJ2NvbnZlbnRpb25hbGNvbW1pdHMnLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIHsgYXJyYXlNZXJnZTogb3ZlcndyaXRlTWVyZ2UgfVxuICAgICAgICAgICksXG4gICAgICAgIF07XG4gICAgICB9IGVsc2UgaWYgKHBsdWdpbiA9PT0gJ0BzZW1hbnRpYy1yZWxlYXNlL2dpdGh1YicpIHtcbiAgICAgICAgcGx1Z2luc1tpXSA9IFtcbiAgICAgICAgICAnQHNlbWFudGljLXJlbGVhc2UvZ2l0aHViJyxcbiAgICAgICAgICBtZXJnZS5hbGwoXG4gICAgICAgICAgICBbXG4gICAgICAgICAgICAgIG9sZENvbmZpZyxcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIC8vIGNmLiBodHRwczovL2dpdGh1Yi5jb20vc2VtYW50aWMtcmVsZWFzZS9zZW1hbnRpYy1yZWxlYXNlL2lzc3Vlcy8yMjA0I2lzc3VlY29tbWVudC0xNTA4NDE3NzA0XG4gICAgICAgICAgICAgICAgc3VjY2Vzc0NvbW1lbnRDb25kaXRpb246IGZhbHNlLFxuICAgICAgICAgICAgICAgIGZhaWxDb21tZW50Q29uZGl0aW9uOiBmYWxzZSxcbiAgICAgICAgICAgICAgICBsYWJlbHM6IFsncjogc2VtYW50aWMtcmVsZWFzZSddLFxuICAgICAgICAgICAgICAgIHJlbGVhc2VkTGFiZWxzOiBbJ3JlbGVhc2VkIDpib29rbWFyazonXSxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICB7IGFycmF5TWVyZ2U6IG92ZXJ3cml0ZU1lcmdlIH1cbiAgICAgICAgICApLFxuICAgICAgICBdO1xuICAgICAgfVxuICAgIH1cbiAgICBjb25zdCBuZXdDb250ZW50ID0gSlNPTi5zdHJpbmdpZnkoc2V0dGluZ3MsIHVuZGVmaW5lZCwgMik7XG4gICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzVXRpbC5nZW5lcmF0ZUZpbGUoZmlsZVBhdGgsIG5ld0NvbnRlbnQpKTtcbiAgfSk7XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgbWVyZ2UgZnJvbSAnZGVlcG1lcmdlJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZnNVdGlsIH0gZnJvbSAnLi4vdXRpbHMvZnNVdGlsLmpzJztcbmltcG9ydCB7IG92ZXJ3cml0ZU1lcmdlIH0gZnJvbSAnLi4vdXRpbHMvbWVyZ2VVdGlsLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuXG5jb25zdCBqc29uT2JqID0ge1xuICAkc2NoZW1hOiAnaHR0cHM6Ly9kb2NzLnJlbm92YXRlYm90LmNvbS9yZW5vdmF0ZS1zY2hlbWEuanNvbicsXG4gIGV4dGVuZHM6IFsnZ2l0aHViPldpbGxCb29zdGVyL3dpbGxib29zdGVyLWNvbmZpZ3M6cmVub3ZhdGUuanNvbjUnXSxcbn07XG5cbnR5cGUgU2V0dGluZ3MgPSB0eXBlb2YganNvbk9iaiAmIHsgcGFja2FnZVJ1bGVzPzogeyBtYXRjaFBhY2thZ2VOYW1lczogc3RyaW5nW107IGVuYWJsZWQ/OiBib29sZWFuIH1bXSB9O1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVSZW5vdmF0ZUpzb24oY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZ2VuZXJhdGVSZW5vdmF0ZUpzb24nLCBhc3luYyAoKSA9PiB7XG4gICAgbGV0IG5ld1NldHRpbmdzID0gc3RydWN0dXJlZENsb25lKGpzb25PYmopIGFzIFNldHRpbmdzO1xuICAgIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAncmVub3ZhdGUuanNvbicpO1xuICAgIGlmIChmcy5leGlzdHNTeW5jKGAke2ZpbGVQYXRofTVgKSkge1xuICAgICAgLy8gU2luY2UgaXQgaXMgZGlmZmljdWx0IGZvciBwYXJzaW5nIHJlbm92YXRlLmpzb241LCB3ZSBkbyBub3RoaW5nXG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRyeSB7XG4gICAgICBjb25zdCBvbGRDb250ZW50ID0gYXdhaXQgZnMucHJvbWlzZXMucmVhZEZpbGUoZmlsZVBhdGgsICd1dGY4Jyk7XG4gICAgICBjb25zdCBvbGRTZXR0aW5ncyA9IEpTT04ucGFyc2Uob2xkQ29udGVudCkgYXMgU2V0dGluZ3M7XG4gICAgICBuZXdTZXR0aW5ncyA9IG1lcmdlLmFsbChbbmV3U2V0dGluZ3MsIG9sZFNldHRpbmdzLCBuZXdTZXR0aW5nc10sIHtcbiAgICAgICAgYXJyYXlNZXJnZTogb3ZlcndyaXRlTWVyZ2UsXG4gICAgICB9KSBhcyBTZXR0aW5ncztcbiAgICAgIG5ld1NldHRpbmdzLmV4dGVuZHMgPSBuZXdTZXR0aW5ncy5leHRlbmRzLmZpbHRlcigoaXRlbTogc3RyaW5nKSA9PiBpdGVtICE9PSAnQHdpbGxib29zdGVyJyk7XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBkbyBub3RoaW5nXG4gICAgfVxuXG4gICAgLy8gRG9uJ3QgdXBncmFkZSBOZXh0LmpzIGF1dG9tYXRpY2FsbHlcbiAgICBpZiAoY29uZmlnLmRlcGVuZGluZy5ibGl0eikge1xuICAgICAgbmV3U2V0dGluZ3MucGFja2FnZVJ1bGVzID8/PSBbXTtcbiAgICAgIGlmIChcbiAgICAgICAgIW5ld1NldHRpbmdzLnBhY2thZ2VSdWxlcy5zb21lKChydWxlOiB7IG1hdGNoUGFja2FnZU5hbWVzPzogc3RyaW5nW10gfSkgPT5cbiAgICAgICAgICBydWxlLm1hdGNoUGFja2FnZU5hbWVzPy5pbmNsdWRlcygnbmV4dCcpXG4gICAgICAgIClcbiAgICAgICkge1xuICAgICAgICBuZXdTZXR0aW5ncy5wYWNrYWdlUnVsZXMucHVzaCh7IG1hdGNoUGFja2FnZU5hbWVzOiBbJ25leHQnXSwgZW5hYmxlZDogZmFsc2UgfSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzLnByb21pc2VzLnJtKHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJy5kZXBlbmRhYm90JyksIHsgZm9yY2U6IHRydWUgfSkpO1xuICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiBmcy5wcm9taXNlcy5ybShwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICcucmVub3ZhdGVyYy5qc29uJyksIHsgZm9yY2U6IHRydWUgfSkpO1xuICAgIGNvbnN0IG5ld0NvbnRlbnQgPSBKU09OLnN0cmluZ2lmeShuZXdTZXR0aW5ncywgdW5kZWZpbmVkLCAyKTtcbiAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnNVdGlsLmdlbmVyYXRlRmlsZShmaWxlUGF0aCwgbmV3Q29udGVudCkpO1xuICB9KTtcbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzL3Byb21pc2VzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGluc3RhbGxBZ2VudFNraWxscyhyb290Q29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignaW5zdGFsbEFnZW50U2tpbGxzJywgYXN5bmMgKCkgPT4ge1xuICAgIC8vIFRPRE86IFdlIGFyZSB0ZW1wb3JhcmlseSByZW1vdmluZyBhZ2VudCBza2lsbHMgZnJvbSB0aGUgcmVwb1xuICAgIC8vIGF3YWl0IHJ1bkluc3RhbGxBZ2VudFNraWxscyhyb290Q29uZmlnKTtcbiAgICBhd2FpdCBQcm9taXNlLmFsbChbXG4gICAgICBmcy5ybShwYXRoLnJlc29sdmUocm9vdENvbmZpZy5kaXJQYXRoLCAnLmFnZW50cycpLCB7XG4gICAgICAgIGZvcmNlOiB0cnVlLFxuICAgICAgICByZWN1cnNpdmU6IHRydWUsXG4gICAgICB9KSxcbiAgICAgIGZzLnJtKHBhdGgucmVzb2x2ZShyb290Q29uZmlnLmRpclBhdGgsICcuY2xhdWRlJyksIHtcbiAgICAgICAgZm9yY2U6IHRydWUsXG4gICAgICAgIHJlY3Vyc2l2ZTogdHJ1ZSxcbiAgICAgIH0pLFxuICAgICAgZnMucm0ocGF0aC5yZXNvbHZlKHJvb3RDb25maWcuZGlyUGF0aCwgJ3NraWxscy1sb2NrLmpzb24nKSwge1xuICAgICAgICBmb3JjZTogdHJ1ZSxcbiAgICAgIH0pLFxuICAgIF0pO1xuICB9KTtcbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCBtZXJnZSBmcm9tICdkZWVwbWVyZ2UnO1xuaW1wb3J0IHR5cGUgeyBUc0NvbmZpZ0pzb24gfSBmcm9tICd0eXBlLWZlc3QnO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBmc1V0aWwgfSBmcm9tICcuLi91dGlscy9mc1V0aWwuanMnO1xuaW1wb3J0IHsgY29tYmluZU1lcmdlIH0gZnJvbSAnLi4vdXRpbHMvbWVyZ2VVdGlsLmpzJztcbmltcG9ydCB7IHNvcnRLZXlzIH0gZnJvbSAnLi4vdXRpbHMvb2JqZWN0VXRpbC5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcbmltcG9ydCB7IGdldFRzY29uZmlnRXh0ZW5kcyB9IGZyb20gJy4uL3V0aWxzL3RzY29uZmlnQmFzZS5qcyc7XG5cbmNvbnN0IHJvb3RKc29uT2JqID0ge1xuICBjb21waWxlck9wdGlvbnM6IHtcbiAgICBhbHdheXNTdHJpY3Q6IHRydWUsXG4gICAgbm9VbmNoZWNrZWRJbmRleGVkQWNjZXNzOiB0cnVlLCAvLyBmb3IgQHR5cGVzY3JpcHQtZXNsaW50L3ByZWZlci1udWxsaXNoLWNvYWxlc2NpbmdcbiAgICBhbGxvd1N5bnRoZXRpY0RlZmF1bHRJbXBvcnRzOiB0cnVlLCAvLyBhbGxvdyBgaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0J2BcbiAgICBlc01vZHVsZUludGVyb3A6IHRydWUsIC8vIGFsbG93IGRlZmF1bHQgaW1wb3J0IGZyb20gQ29tbW9uSlMvQU1EL1VNRCBtb2R1bGVzXG4gICAgcmVzb2x2ZUpzb25Nb2R1bGU6IHRydWUsIC8vIGFsbG93IHRvIGltcG9ydCBKU09OIGZpbGVzXG4gICAgaW1wb3J0SGVscGVyczogZmFsc2UsXG4gICAgbm9FbWl0OiB0cnVlLFxuICB9LFxuICBleGNsdWRlOiBbJ3BhY2thZ2VzLyovdGVzdC9maXh0dXJlcycsICd0ZXN0L2ZpeHR1cmVzJ10sXG4gIGluY2x1ZGU6IFtcbiAgICAnKi5jb25maWcudHMnLFxuICAgICdwYWNrYWdlcy8qLyouY29uZmlnLnRzJyxcbiAgICAncGFja2FnZXMvKi9zY3JpcHRzLyoqLyonLFxuICAgICdwYWNrYWdlcy8qL3NyYy8qKi8qJyxcbiAgICAncGFja2FnZXMvKi90ZXN0LyoqLyonLFxuICAgICdzY3JpcHRzLyoqLyonLFxuICAgICdzcmMvKiovKicsXG4gICAgJ3Rlc3QvKiovKicsXG4gIF0sXG59O1xuXG5jb25zdCBzdWJKc29uT2JqID0ge1xuICBjb21waWxlck9wdGlvbnM6IHtcbiAgICBhbHdheXNTdHJpY3Q6IHRydWUsXG4gICAgbm9VbmNoZWNrZWRJbmRleGVkQWNjZXNzOiB0cnVlLCAvLyBmb3IgQHR5cGVzY3JpcHQtZXNsaW50L3ByZWZlci1udWxsaXNoLWNvYWxlc2NpbmdcbiAgICBhbGxvd1N5bnRoZXRpY0RlZmF1bHRJbXBvcnRzOiB0cnVlLCAvLyBhbGxvdyBgaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0J2BcbiAgICBlc01vZHVsZUludGVyb3A6IHRydWUsIC8vIGFsbG93IGRlZmF1bHQgaW1wb3J0IGZyb20gQ29tbW9uSlMvQU1EL1VNRCBtb2R1bGVzXG4gICAgcmVzb2x2ZUpzb25Nb2R1bGU6IHRydWUsIC8vIGFsbG93IHRvIGltcG9ydCBKU09OIGZpbGVzXG4gICAgaW1wb3J0SGVscGVyczogZmFsc2UsXG4gICAgbm9FbWl0OiB0cnVlLFxuICB9LFxuICBleGNsdWRlOiBbJ3Rlc3QvZml4dHVyZXMnXSxcbiAgLy8gd2JmeSBnZW5lcmF0ZXMgcm9vdC1sZXZlbCB0b29sIGNvbmZpZ3Mgc3VjaCBhcyBwbGF5d3JpZ2h0LmNvbmZpZy50cywgYW5kXG4gIC8vIHR5cGUtYXdhcmUgbGludGluZyBuZWVkcyB0aG9zZSBmaWxlcyBpbiB0aGUgcHJvamVjdCB0byBzZWUgTm9kZS9CdW4gZ2xvYmFscy5cbiAgaW5jbHVkZTogWycqLmNvbmZpZy50cycsICdzY3JpcHRzLyoqLyonLCAnc3JjLyoqLyonLCAndGVzdC8qKi8qJ10sXG59O1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVUc2NvbmZpZyhjb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdnZW5lcmF0ZVRzY29uZmlnJywgYXN5bmMgKCkgPT4ge1xuICAgIGlmIChjb25maWcuZGVwZW5kaW5nLmJsaXR6IHx8IGNvbmZpZy5kZXBlbmRpbmcubmV4dCkge1xuICAgICAgYXdhaXQgY2xlYW51cExlZ2FjeVRzY29uZmlnTW9kdWxlU2V0dGluZ3MoY29uZmlnKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBsZXQgbmV3U2V0dGluZ3MgPSBzdHJ1Y3R1cmVkQ2xvbmUoY29uZmlnLmlzUm9vdCA/IHJvb3RKc29uT2JqIDogc3ViSnNvbk9iaikgYXMgVHNDb25maWdKc29uO1xuICAgIGNvbnN0IGdlbmVyYXRlZFR5cGVzID0gZ2V0R2VuZXJhdGVkVHlwZXMoY29uZmlnKTtcbiAgICBuZXdTZXR0aW5ncy5leHRlbmRzID0gZ2V0VHNjb25maWdFeHRlbmRzKGNvbmZpZyk7XG4gICAgbmV3U2V0dGluZ3MuY29tcGlsZXJPcHRpb25zID8/PSB7fTtcbiAgICBuZXdTZXR0aW5ncy5jb21waWxlck9wdGlvbnMucm9vdERpciA9IGdldFJvb3REaXIoY29uZmlnKTtcbiAgICBpZiAoZ2VuZXJhdGVkVHlwZXMubGVuZ3RoID4gMCkge1xuICAgICAgbmV3U2V0dGluZ3MuY29tcGlsZXJPcHRpb25zID0geyAuLi5uZXdTZXR0aW5ncy5jb21waWxlck9wdGlvbnMsIHR5cGVzOiBnZW5lcmF0ZWRUeXBlcyB9O1xuICAgIH1cbiAgICBpZiAoIWNvbmZpZy5kb2VzQ29udGFpbkpzeE9yVHN4ICYmICFjb25maWcuZG9lc0NvbnRhaW5Kc3hPclRzeEluUGFja2FnZXMpIHtcbiAgICAgIGRlbGV0ZSBuZXdTZXR0aW5ncy5jb21waWxlck9wdGlvbnM/LmpzeDtcbiAgICB9IGVsc2UgaWYgKCFjb25maWcuaXNCdW4gJiYgIWNvbmZpZy5kZXBlbmRpbmcucmVhY3ROYXRpdmUpIHtcbiAgICAgIG5ld1NldHRpbmdzLmNvbXBpbGVyT3B0aW9ucyA9IHsgLi4ubmV3U2V0dGluZ3MuY29tcGlsZXJPcHRpb25zLCBqc3g6ICdyZWFjdC1qc3gnIH07XG4gICAgfVxuICAgIGlmIChjb25maWcuaXNSb290ICYmICFjb25maWcuZG9lc0NvbnRhaW5TdWJQYWNrYWdlSnNvbnMpIHtcbiAgICAgIG5ld1NldHRpbmdzLmluY2x1ZGUgPSBuZXdTZXR0aW5ncy5pbmNsdWRlPy5maWx0ZXIoKGRpclBhdGg6IHN0cmluZykgPT4gIWRpclBhdGguc3RhcnRzV2l0aCgncGFja2FnZXMvKi8nKSk7XG4gICAgICBuZXdTZXR0aW5ncy5leGNsdWRlID0gbmV3U2V0dGluZ3MuZXhjbHVkZT8uZmlsdGVyKChkaXJQYXRoOiBzdHJpbmcpID0+ICFkaXJQYXRoLnN0YXJ0c1dpdGgoJ3BhY2thZ2VzLyovJykpO1xuICAgIH1cbiAgICBpZiAoY29uZmlnLmRlcGVuZGluZy5wcmlzbWEpIHtcbiAgICAgIC8vIFByaXNtYSBzZWVkcyBhbmQgbWlncmF0aW9uIGhlbHBlciBzY3JpcHRzIG9mdGVuIGxpdmUgb3V0c2lkZSBzcmMsIGJ1dFxuICAgICAgLy8gdHlwZS1hd2FyZSBsaW50aW5nIHN0aWxsIG5lZWRzIHRoZW0gY292ZXJlZCBieSB0aGUgcHJvamVjdCBjb25maWcuXG4gICAgICBhZGRJbmNsdWRlUGF0aChuZXdTZXR0aW5ncywgJ3ByaXNtYS8qKi8qJyk7XG4gICAgfVxuXG4gICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICd0c2NvbmZpZy5qc29uJyk7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGV4aXN0aW5nQ29udGVudCA9IGF3YWl0IGZzLnByb21pc2VzLnJlYWRGaWxlKGZpbGVQYXRoLCAndXRmOCcpO1xuICAgICAgY29uc3Qgb2xkU2V0dGluZ3MgPSBKU09OLnBhcnNlKGV4aXN0aW5nQ29udGVudCkgYXMgVHNDb25maWdKc29uO1xuICAgICAgY29uc3QgZXhpc3RpbmdUeXBlcyA9IG5vcm1hbGl6ZVN0cmluZ0FycmF5KG9sZFNldHRpbmdzLmNvbXBpbGVyT3B0aW9ucz8udHlwZXMpO1xuICAgICAgY29uc3QgZXhpc3RpbmdFbWl0TWV0YWRhdGEgPSBwaWNrRXhpc3RpbmdFbWl0TWV0YWRhdGEob2xkU2V0dGluZ3MuY29tcGlsZXJPcHRpb25zKTtcbiAgICAgIG5ld1NldHRpbmdzLmV4dGVuZHMgPSBtZXJnZVRzY29uZmlnRXh0ZW5kcyhuZXdTZXR0aW5ncy5leHRlbmRzLCBvbGRTZXR0aW5ncy5leHRlbmRzKTtcbiAgICAgIGRlbGV0ZSBvbGRTZXR0aW5ncy5leHRlbmRzO1xuICAgICAgZGVsZXRlIG9sZFNldHRpbmdzLmNvbXBpbGVyT3B0aW9ucz8uanN4O1xuICAgICAgbmV3U2V0dGluZ3MgPSBtZXJnZS5hbGwoW25ld1NldHRpbmdzLCBvbGRTZXR0aW5ncywgbmV3U2V0dGluZ3NdLCB7IGFycmF5TWVyZ2U6IGNvbWJpbmVNZXJnZSB9KTtcbiAgICAgIG5ld1NldHRpbmdzLmluY2x1ZGUgPSBuZXdTZXR0aW5ncy5pbmNsdWRlPy5maWx0ZXIoXG4gICAgICAgIChkaXJQYXRoOiBzdHJpbmcpID0+XG4gICAgICAgICAgIWRpclBhdGguaW5jbHVkZXMoJ0B0eXBlcycpICYmICFkaXJQYXRoLmluY2x1ZGVzKCdfX3Rlc3RzX18vJykgJiYgIWRpclBhdGguaW5jbHVkZXMoJ3Rlc3RzLycpXG4gICAgICApO1xuICAgICAgbmV3U2V0dGluZ3MuY29tcGlsZXJPcHRpb25zID8/PSB7fTtcbiAgICAgIC8vIHdiZnktZ2VuZXJhdGVkIHRzY29uZmlnLmpzb24gaXMgYSBsaW50L3R5cGVjaGVjayBwcm9qZWN0LCBub3QgdGhlIGVtaXRcbiAgICAgIC8vIGNvbnRyYWN0LiBJdCBtdXN0IGtlZXAgcm9vdERpciBicm9hZCBlbm91Z2ggZm9yIHJvb3QgY29uZmlnIGZpbGVzLFxuICAgICAgLy8gc2NyaXB0cywgc3JjLCBhbmQgdGVzdHMuIGJ1aWxkLXRzIG93bnMgZW1pdCBhbmQgY3JlYXRlcyBhIHRlbXBvcmFyeVxuICAgICAgLy8gc3JjLW9ubHkgdHNjb25maWcgd2l0aCBub0VtaXQ9ZmFsc2UsIGVtaXREZWNsYXJhdGlvbk9ubHk9dHJ1ZSxcbiAgICAgIC8vIHJvb3REaXI9XCJzcmNcIiwgYW5kIGluY2x1ZGU9W1wic3JjLyoqLypcIl0sIHNvIHByZXNlcnZpbmcgbm9FbWl0PWZhbHNlIG9yXG4gICAgICAvLyByb290RGlyPVwic3JjXCIgaGVyZSB3b3VsZCBvbmx5IGJyZWFrIG5vbi1zcmMgdHlwZS1hd2FyZSBsaW50IGNvdmVyYWdlLlxuICAgICAgbmV3U2V0dGluZ3MuY29tcGlsZXJPcHRpb25zID0geyAuLi5uZXdTZXR0aW5ncy5jb21waWxlck9wdGlvbnMsIC4uLmV4aXN0aW5nRW1pdE1ldGFkYXRhIH07XG4gICAgICBlbnN1cmVUc0V4dGVuc2lvbkVtaXRDb21wYXRpYmlsaXR5KG5ld1NldHRpbmdzLmNvbXBpbGVyT3B0aW9ucyk7XG5cbiAgICAgIGNvbnN0IG1lcmdlZFR5cGVzID0gWy4uLm5ldyBTZXQoWy4uLmZpbHRlckV4aXN0aW5nVHlwZXMoZXhpc3RpbmdUeXBlcywgZ2VuZXJhdGVkVHlwZXMpLCAuLi5nZW5lcmF0ZWRUeXBlc10pXTtcbiAgICAgIGlmIChtZXJnZWRUeXBlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgIG5ld1NldHRpbmdzLmNvbXBpbGVyT3B0aW9ucy50eXBlcyA9IG1lcmdlZFR5cGVzO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZGVsZXRlIG5ld1NldHRpbmdzLmNvbXBpbGVyT3B0aW9ucy50eXBlcztcbiAgICAgIH1cbiAgICAgIGlmIChzaG91bGREZWxldGVUeXBlUm9vdHMoZ2VuZXJhdGVkVHlwZXMpKSB7XG4gICAgICAgIGRlbGV0ZSBuZXdTZXR0aW5ncy5jb21waWxlck9wdGlvbnMudHlwZVJvb3RzO1xuICAgICAgfVxuICAgIH0gY2F0Y2gge1xuICAgICAgLy8gZG8gbm90aGluZ1xuICAgIH1cbiAgICBzb3J0S2V5cyhuZXdTZXR0aW5ncyk7XG4gICAgbmV3U2V0dGluZ3MuaW5jbHVkZT8uc29ydCgpO1xuICAgIC8vIERvbid0IHVzZSBvbGQgZGVjb3JhdG9yXG4gICAgZGVsZXRlIG5ld1NldHRpbmdzLmNvbXBpbGVyT3B0aW9ucz8uZXhwZXJpbWVudGFsRGVjb3JhdG9ycztcbiAgICAvLyBQYWNrYWdlIGltcG9ydHMgc2hvdWxkIHJlc29sdmUgdGhyb3VnaCBwYWNrYWdlIGV4cG9ydHMgaW5zdGVhZCBvZiBiYXNlVXJsLlxuICAgIC8vIHBhdGhzIGlzIGludGVudGlvbmFsbHkgcHJlc2VydmVkIHNvIHJlcG8tbG9jYWwgdG9vbGluZyBjYW4ga2VlcCBleHBsaWNpdFxuICAgIC8vIGFsaWFzZXMgd2l0aG91dCByZWx5aW5nIG9uIGJhc2VVcmwncyBicm9hZCBmYWxsYmFjayByZXNvbHV0aW9uLlxuICAgIGRlbGV0ZSBuZXdTZXR0aW5ncy5jb21waWxlck9wdGlvbnM/LmJhc2VVcmw7XG4gICAgZGVsZXRlTGVnYWN5TW9kdWxlU2V0dGluZ3MobmV3U2V0dGluZ3MuY29tcGlsZXJPcHRpb25zLCBjb25maWcpO1xuICAgIG5vcm1hbGl6ZUNvbW1vbkpzVHNjb25maWdTZXR0aW5ncyhuZXdTZXR0aW5ncy5jb21waWxlck9wdGlvbnMsIGNvbmZpZyk7XG4gICAgaWYgKGNvbmZpZy5kZXBlbmRpbmcucmVhY3ROYXRpdmUpIHtcbiAgICAgIGRlbGV0ZSBuZXdTZXR0aW5ncy5jb21waWxlck9wdGlvbnM/LnZlcmJhdGltTW9kdWxlU3ludGF4O1xuICAgIH1cbiAgICBjb25zdCBuZXdDb250ZW50ID0gSlNPTi5zdHJpbmdpZnkobmV3U2V0dGluZ3MsIHVuZGVmaW5lZCwgMik7XG4gICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzVXRpbC5nZW5lcmF0ZUZpbGUoZmlsZVBhdGgsIG5ld0NvbnRlbnQpKTtcbiAgfSk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGNsZWFudXBMZWdhY3lUc2NvbmZpZ01vZHVsZVNldHRpbmdzKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBmaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJ3RzY29uZmlnLmpzb24nKTtcbiAgdHJ5IHtcbiAgICBjb25zdCBzZXR0aW5ncyA9IEpTT04ucGFyc2UoYXdhaXQgZnMucHJvbWlzZXMucmVhZEZpbGUoZmlsZVBhdGgsICd1dGY4JykpIGFzIFRzQ29uZmlnSnNvbjtcbiAgICBub3JtYWxpemVOZXh0VHNjb25maWdNb2R1bGVTZXR0aW5ncyhzZXR0aW5ncy5jb21waWxlck9wdGlvbnMpO1xuICAgIG5vcm1hbGl6ZU5leHRUc2NvbmZpZ1BhdGhBbGlhc2VzKHNldHRpbmdzLmNvbXBpbGVyT3B0aW9ucyk7XG4gICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzVXRpbC5nZW5lcmF0ZUZpbGUoZmlsZVBhdGgsIEpTT04uc3RyaW5naWZ5KHNldHRpbmdzLCB1bmRlZmluZWQsIDIpKSk7XG4gIH0gY2F0Y2gge1xuICAgIC8vIE5leHQvQmxpdHogb3duIHRoZWlyIHRzY29uZmlnIHNoYXBlLCBidXQgVHlwZVNjcmlwdCA2IG5vIGxvbmdlciBhY2NlcHRzXG4gICAgLy8gbm9kZTEwIHJlc29sdmVyIHNwZWxsaW5ncyB0aGF0IG9sZGVyIHByb2plY3RzIGNvbW1vbmx5IGluaGVyaXRlZC5cbiAgfVxufVxuXG5mdW5jdGlvbiBub3JtYWxpemVOZXh0VHNjb25maWdNb2R1bGVTZXR0aW5ncyhjb21waWxlck9wdGlvbnM6IFRzQ29uZmlnSnNvbi5Db21waWxlck9wdGlvbnMgfCB1bmRlZmluZWQpOiB2b2lkIHtcbiAgaWYgKCFjb21waWxlck9wdGlvbnMpIHJldHVybjtcbiAgaWYgKFxuICAgIGNvbXBpbGVyT3B0aW9ucy5tb2R1bGVSZXNvbHV0aW9uID09PSAnbm9kZScgfHxcbiAgICBjb21waWxlck9wdGlvbnMubW9kdWxlUmVzb2x1dGlvbiA9PT0gJ05vZGUnIHx8XG4gICAgY29tcGlsZXJPcHRpb25zLm1vZHVsZVJlc29sdXRpb24gPT09ICdub2RlMTAnIHx8XG4gICAgY29tcGlsZXJPcHRpb25zLm1vZHVsZVJlc29sdXRpb24gPT09IHVuZGVmaW5lZFxuICApIHtcbiAgICAvLyBOZXh0LmpzIHdyaXRlcyBcIm5vZGVcIiBkdXJpbmcgYnVpbGQgd2hlbiB0aGlzIG9wdGlvbiBpcyBtaXNzaW5nLCBidXRcbiAgICAvLyB0c2dvbGludCB0cmVhdHMgdGhhdCBzcGVsbGluZyBhcyB0aGUgcmVtb3ZlZCBub2RlMTAgcmVzb2x2ZXIuXG4gICAgY29tcGlsZXJPcHRpb25zLm1vZHVsZVJlc29sdXRpb24gPSAnYnVuZGxlcic7XG4gIH1cbn1cblxuZnVuY3Rpb24gbm9ybWFsaXplTmV4dFRzY29uZmlnUGF0aEFsaWFzZXMoY29tcGlsZXJPcHRpb25zOiBUc0NvbmZpZ0pzb24uQ29tcGlsZXJPcHRpb25zIHwgdW5kZWZpbmVkKTogdm9pZCB7XG4gIGlmICghY29tcGlsZXJPcHRpb25zKSByZXR1cm47XG5cbiAgLy8gdHNnb2xpbnQgZm9sbG93cyBUeXBlU2NyaXB0IDYgdmFsaWRhdGlvbiwgd2hlcmUgYmFzZVVybCBpcyByZW1vdmVkIGFuZFxuICAvLyBwYXRoIHRhcmdldHMgbXVzdCBiZSBleHBsaWNpdGx5IHJlbGF0aXZlLiBOZXh0LmpzIHN0aWxsIGFjY2VwdHMgdGhlIGFsaWFzXG4gIC8vIHNoYXBlIGFmdGVyIGVhY2ggdGFyZ2V0IGlzIHdyaXR0ZW4gd2l0aCBhIGxlYWRpbmcgLi8uXG4gIGRlbGV0ZSBjb21waWxlck9wdGlvbnMuYmFzZVVybDtcbiAgaWYgKCFjb21waWxlck9wdGlvbnMucGF0aHMpIHJldHVybjtcblxuICBmb3IgKGNvbnN0IFthbGlhcywgdGFyZ2V0c10gb2YgT2JqZWN0LmVudHJpZXMoY29tcGlsZXJPcHRpb25zLnBhdGhzKSkge1xuICAgIGNvbXBpbGVyT3B0aW9ucy5wYXRoc1thbGlhc10gPSBub3JtYWxpemVQYXRoQWxpYXNUYXJnZXRzKHRhcmdldHMpO1xuICB9XG59XG5cbmZ1bmN0aW9uIG5vcm1hbGl6ZVBhdGhBbGlhc1RhcmdldHModGFyZ2V0czogc3RyaW5nW10pOiBzdHJpbmdbXSB7XG4gIHJldHVybiB0YXJnZXRzLm1hcCgodGFyZ2V0KSA9PiB7XG4gICAgaWYgKHRhcmdldC5zdGFydHNXaXRoKCcuLycpIHx8IHRhcmdldC5zdGFydHNXaXRoKCcuLi8nKSB8fCBwYXRoLmlzQWJzb2x1dGUodGFyZ2V0KSkgcmV0dXJuIHRhcmdldDtcbiAgICByZXR1cm4gYC4vJHt0YXJnZXR9YDtcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIGdldFJvb3REaXIoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogc3RyaW5nIHtcbiAgaWYgKGNvbmZpZy5pc1Jvb3QpIHJldHVybiAnLic7XG4gIHJldHVybiBmcy5leGlzdHNTeW5jKHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJy4uJywgJy4uJywgJ3BhY2thZ2UuanNvbicpKSA/ICcuLi8uLicgOiAnLic7XG59XG5cbmZ1bmN0aW9uIG1lcmdlVHNjb25maWdFeHRlbmRzKFxuICBnZW5lcmF0ZWRFeHRlbmRzOiBUc0NvbmZpZ0pzb25bJ2V4dGVuZHMnXSxcbiAgZXhpc3RpbmdFeHRlbmRzOiBUc0NvbmZpZ0pzb25bJ2V4dGVuZHMnXVxuKTogVHNDb25maWdKc29uWydleHRlbmRzJ10ge1xuICBjb25zdCBtZXJnZWRFeHRlbmRzID0gWy4uLm5vcm1hbGl6ZUV4dGVuZHMoZ2VuZXJhdGVkRXh0ZW5kcyksIC4uLm5vcm1hbGl6ZUV4dGVuZHMoZXhpc3RpbmdFeHRlbmRzKV07XG4gIGNvbnN0IHVuaXF1ZUV4dGVuZHMgPSBbLi4ubmV3IFNldChtZXJnZWRFeHRlbmRzKV07XG4gIGlmICh1bmlxdWVFeHRlbmRzLmxlbmd0aCA9PT0gMCkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgaWYgKHVuaXF1ZUV4dGVuZHMubGVuZ3RoID09PSAxKSByZXR1cm4gdW5pcXVlRXh0ZW5kc1swXTtcbiAgcmV0dXJuIHVuaXF1ZUV4dGVuZHM7XG59XG5cbmZ1bmN0aW9uIGFkZEluY2x1ZGVQYXRoKHNldHRpbmdzOiBUc0NvbmZpZ0pzb24sIGRpclBhdGg6IHN0cmluZyk6IHZvaWQge1xuICBzZXR0aW5ncy5pbmNsdWRlID8/PSBbXTtcbiAgaWYgKCFzZXR0aW5ncy5pbmNsdWRlLmluY2x1ZGVzKGRpclBhdGgpKSB7XG4gICAgc2V0dGluZ3MuaW5jbHVkZS5wdXNoKGRpclBhdGgpO1xuICB9XG59XG5cbmZ1bmN0aW9uIG5vcm1hbGl6ZUV4dGVuZHModmFsdWU6IFRzQ29uZmlnSnNvblsnZXh0ZW5kcyddKTogc3RyaW5nW10ge1xuICBpZiAoIXZhbHVlKSByZXR1cm4gW107XG4gIHJldHVybiBBcnJheS5pc0FycmF5KHZhbHVlKSA/IHZhbHVlIDogW3ZhbHVlXTtcbn1cblxuZnVuY3Rpb24gbm9ybWFsaXplU3RyaW5nQXJyYXkodmFsdWU6IHVua25vd24pOiBzdHJpbmdbXSB7XG4gIGlmICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnKSByZXR1cm4gW3ZhbHVlXTtcbiAgaWYgKCFBcnJheS5pc0FycmF5KHZhbHVlKSkgcmV0dXJuIFtdO1xuICByZXR1cm4gdmFsdWUuZmlsdGVyKChpdGVtKTogaXRlbSBpcyBzdHJpbmcgPT4gdHlwZW9mIGl0ZW0gPT09ICdzdHJpbmcnKTtcbn1cblxuZnVuY3Rpb24gc2hvdWxkRGVsZXRlVHlwZVJvb3RzKHR5cGVOYW1lczogc3RyaW5nW10pOiBib29sZWFuIHtcbiAgLy8gT25seSBnZW5lcmF0ZWQgcGFja2FnZS1vd25lZCB0ZXN0IHR5cGVzIHNob3VsZCB0cmlnZ2VyIHRoaXMuIFVzZXItZGVmaW5lZCBzbGFzaC1iYXNlZFxuICAvLyBlbnRyaWVzIG1heSBpbnRlbnRpb25hbGx5IHJlbHkgb24gY3VzdG9tIHR5cGVSb290cyBhbmQgc2hvdWxkIGJlIHByZXNlcnZlZCBhcy1pcy5cbiAgcmV0dXJuIHR5cGVOYW1lcy5zb21lKCh0eXBlTmFtZSkgPT4gdHlwZU5hbWUgPT09ICdjeXByZXNzJyB8fCB0eXBlTmFtZS5pbmNsdWRlcygnLycpKTtcbn1cblxuZnVuY3Rpb24gZmlsdGVyRXhpc3RpbmdUeXBlcyhleGlzdGluZ1R5cGVzOiBzdHJpbmdbXSwgZ2VuZXJhdGVkVHlwZXM6IHN0cmluZ1tdKTogc3RyaW5nW10ge1xuICBjb25zdCBnZW5lcmF0ZWRUeXBlU2V0ID0gbmV3IFNldChnZW5lcmF0ZWRUeXBlcyk7XG4gIHJldHVybiBleGlzdGluZ1R5cGVzLmZpbHRlcigodHlwZU5hbWUpID0+IHtcbiAgICAvLyB3YmZ5IG93bnMgdGhlc2UgcGFja2FnZS1wcm92aWRlZCB0ZXN0IGdsb2JhbHMuIERyb3Agc3RhbGUgZW50cmllcyB3aGVuIHRoZVxuICAgIC8vIGNvcnJlc3BvbmRpbmcgZGVwZW5kZW5jeSBpcyBubyBsb25nZXIgcHJlc2VudCBzbyBUeXBlU2NyaXB0IHdvbid0IHJlcXVpcmVcbiAgICAvLyBtaXNzaW5nIHBhY2thZ2VzIHN1Y2ggYXMgdml0ZXN0LlxuICAgIGlmIChpc0dlbmVyYXRlZFRlc3RHbG9iYWxUeXBlKHR5cGVOYW1lKSAmJiAhZ2VuZXJhdGVkVHlwZVNldC5oYXModHlwZU5hbWUpKSByZXR1cm4gZmFsc2U7XG4gICAgcmV0dXJuIHRydWU7XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBpc0dlbmVyYXRlZFRlc3RHbG9iYWxUeXBlKHR5cGVOYW1lOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgcmV0dXJuIHR5cGVOYW1lID09PSAnY3lwcmVzcycgfHwgdHlwZU5hbWUgPT09ICdqZXN0JyB8fCB0eXBlTmFtZSA9PT0gJ21vY2hhJyB8fCB0eXBlTmFtZSA9PT0gJ3ZpdGVzdC9nbG9iYWxzJztcbn1cblxuZnVuY3Rpb24gZW5zdXJlVHNFeHRlbnNpb25FbWl0Q29tcGF0aWJpbGl0eShjb21waWxlck9wdGlvbnM6IFRzQ29uZmlnSnNvbi5Db21waWxlck9wdGlvbnMgfCB1bmRlZmluZWQpOiB2b2lkIHtcbiAgaWYgKCFjb21waWxlck9wdGlvbnMpIHJldHVybjtcbiAgaWYgKGNvbXBpbGVyT3B0aW9ucy5ub0VtaXQgIT09IGZhbHNlIHx8IGNvbXBpbGVyT3B0aW9ucy5lbWl0RGVjbGFyYXRpb25Pbmx5ID09PSB0cnVlKSByZXR1cm47XG5cbiAgLy8gQHRzY29uZmlnL2J1biBlbmFibGVzIGFsbG93SW1wb3J0aW5nVHNFeHRlbnNpb25zLCB3aGljaCBUeXBlU2NyaXB0IHBlcm1pdHNcbiAgLy8gZHVyaW5nIGVtaXQgb25seSB3aGVuIHJlbGF0aXZlIFRTIGV4dGVuc2lvbnMgYXJlIHJld3JpdHRlbi5cbiAgY29tcGlsZXJPcHRpb25zLnJld3JpdGVSZWxhdGl2ZUltcG9ydEV4dGVuc2lvbnMgPSB0cnVlO1xufVxuXG5mdW5jdGlvbiBkZWxldGVMZWdhY3lNb2R1bGVTZXR0aW5ncyhcbiAgY29tcGlsZXJPcHRpb25zOiBUc0NvbmZpZ0pzb24uQ29tcGlsZXJPcHRpb25zIHwgdW5kZWZpbmVkLFxuICBjb25maWc6IFBhY2thZ2VDb25maWdcbik6IHZvaWQge1xuICBpZiAoIWNvbXBpbGVyT3B0aW9ucykgcmV0dXJuO1xuXG4gIC8vIFR5cGVTY3JpcHQgNiByZW1vdmVkIHRoZSBvbGQgbm9kZTEwIHJlc29sdmVyIHNwZWxsaW5nLCBzbyBpbmhlcml0ZWQgYmFzZSBjb25maWdzXG4gIC8vIHNob3VsZCBjaG9vc2UgdGhlIHJlc29sdmVyIHVubGVzcyBhIHByb2plY3QgYWxyZWFkeSBvcHRlZCBpbnRvIGEgbW9kZXJuIG9uZS5cbiAgaWYgKFxuICAgIGNvbXBpbGVyT3B0aW9ucy5tb2R1bGVSZXNvbHV0aW9uID09PSAnbm9kZScgfHxcbiAgICBjb21waWxlck9wdGlvbnMubW9kdWxlUmVzb2x1dGlvbiA9PT0gJ05vZGUnIHx8XG4gICAgY29tcGlsZXJPcHRpb25zLm1vZHVsZVJlc29sdXRpb24gPT09ICdub2RlMTAnXG4gICkge1xuICAgIGRlbGV0ZSBjb21waWxlck9wdGlvbnMubW9kdWxlUmVzb2x1dGlvbjtcbiAgfVxuICBpZiAoY29uZmlnLmlzQnVuIHx8IGNvbmZpZy5kZXBlbmRpbmcucmVhY3ROYXRpdmUgfHwgY29tcGlsZXJPcHRpb25zLm1vZHVsZSAhPT0gJ0VTTmV4dCcpIHJldHVybjtcblxuICAvLyBOb2RlIGJhc2UgY29uZmlncyBub3cgcGFpciB0aGVpciByZXNvbHZlciB3aXRoIGEgbWF0Y2hpbmcgbW9kdWxlIGtpbmQuIEtlZXBpbmdcbiAgLy8gb2xkZXIgRVNOZXh0IG92ZXJyaWRlcyBjcmVhdGVzIGludmFsaWQgZ2VuZXJhdGVkIGNvbmZpZ3MgZm9yIFRTIDYuXG4gIGRlbGV0ZSBjb21waWxlck9wdGlvbnMubW9kdWxlO1xufVxuXG5mdW5jdGlvbiBub3JtYWxpemVDb21tb25Kc1RzY29uZmlnU2V0dGluZ3MoXG4gIGNvbXBpbGVyT3B0aW9uczogVHNDb25maWdKc29uLkNvbXBpbGVyT3B0aW9ucyB8IHVuZGVmaW5lZCxcbiAgY29uZmlnOiBQYWNrYWdlQ29uZmlnXG4pOiB2b2lkIHtcbiAgaWYgKCFjb21waWxlck9wdGlvbnMgfHwgY29uZmlnLmlzQnVuIHx8IGNvbmZpZy5kZXBlbmRpbmcucmVhY3ROYXRpdmUgfHwgY29uZmlnLmlzRXNtUGFja2FnZSkgcmV0dXJuO1xuXG4gIGlmIChjb21waWxlck9wdGlvbnMubW9kdWxlPy50b0xvd2VyQ2FzZSgpID09PSAnY29tbW9uanMnKSB7XG4gICAgLy8gQHRzY29uZmlnL25vZGUtbHRzIG5vdyBwcm92aWRlcyBtb2R1bGVSZXNvbHV0aW9uPW5vZGUxNi4gVHlwZVNjcmlwdCByZXF1aXJlc1xuICAgIC8vIHRoZSBtb2R1bGUga2luZCB0byBtb3ZlIHdpdGggdGhhdCByZXNvbHZlciwgd2hpbGUgdmVyYmF0aW1Nb2R1bGVTeW50YXg9ZmFsc2VcbiAgICAvLyBwcmVzZXJ2ZXMgdGhlIGxvbmctc3RhbmRpbmcgQ29tbW9uSlMgZW1pdCBzaGFwZSBmb3IgZXhpc3RpbmcgcGFja2FnZXMuXG4gICAgY29tcGlsZXJPcHRpb25zLm1vZHVsZSA9ICdOb2RlMTYnO1xuICB9XG4gIGNvbXBpbGVyT3B0aW9ucy52ZXJiYXRpbU1vZHVsZVN5bnRheCA9IGZhbHNlO1xufVxuXG5mdW5jdGlvbiBwaWNrRXhpc3RpbmdFbWl0TWV0YWRhdGEoXG4gIGNvbXBpbGVyT3B0aW9uczogVHNDb25maWdKc29uWydjb21waWxlck9wdGlvbnMnXVxuKTogUGljazxOb25OdWxsYWJsZTxUc0NvbmZpZ0pzb25bJ2NvbXBpbGVyT3B0aW9ucyddPiwgJ2RlY2xhcmF0aW9uJyB8ICdkZWNsYXJhdGlvbk1hcCcgfCAnc291cmNlTWFwJz4ge1xuICBjb25zdCBlbWl0T3B0aW9ucyA9IHt9IGFzIFBpY2s8XG4gICAgTm9uTnVsbGFibGU8VHNDb25maWdKc29uWydjb21waWxlck9wdGlvbnMnXT4sXG4gICAgJ2RlY2xhcmF0aW9uJyB8ICdkZWNsYXJhdGlvbk1hcCcgfCAnc291cmNlTWFwJ1xuICA+O1xuICBmb3IgKGNvbnN0IGtleSBvZiBbJ2RlY2xhcmF0aW9uJywgJ2RlY2xhcmF0aW9uTWFwJywgJ3NvdXJjZU1hcCddIGFzIGNvbnN0KSB7XG4gICAgY29uc3QgdmFsdWUgPSBjb21waWxlck9wdGlvbnM/LltrZXldO1xuICAgIGlmICh2YWx1ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBlbWl0T3B0aW9uc1trZXldID0gdmFsdWUgYXMgbmV2ZXI7XG4gICAgfVxuICB9XG4gIHJldHVybiBlbWl0T3B0aW9ucztcbn1cblxuZnVuY3Rpb24gZ2V0R2VuZXJhdGVkVHlwZXMoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogc3RyaW5nW10ge1xuICBjb25zdCB0eXBlTmFtZXMgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgY29uc3QgZGVwZW5kZW5jaWVzID0ge1xuICAgIC4uLmNvbmZpZy5wYWNrYWdlSnNvbj8uZGVwZW5kZW5jaWVzLFxuICAgIC4uLmNvbmZpZy5wYWNrYWdlSnNvbj8uZGV2RGVwZW5kZW5jaWVzLFxuICB9O1xuXG4gIGlmIChjb25maWcuaXNCdW4pIHtcbiAgICB0eXBlTmFtZXMuYWRkKCdidW4nKTtcbiAgfSBlbHNlIGlmICghY29uZmlnLmRlcGVuZGluZy5yZWFjdE5hdGl2ZSkge1xuICAgIHR5cGVOYW1lcy5hZGQoJ25vZGUnKTtcbiAgfVxuICBpZiAoXG4gICAgZGVwZW5kZW5jaWVzLmplc3QgfHxcbiAgICBkZXBlbmRlbmNpZXNbJ0BqZXN0L2dsb2JhbHMnXSB8fFxuICAgIGRlcGVuZGVuY2llc1snamVzdC1lbnZpcm9ubWVudC1qc2RvbSddIHx8XG4gICAgZGVwZW5kZW5jaWVzWyd0cy1qZXN0J11cbiAgKSB7XG4gICAgdHlwZU5hbWVzLmFkZCgnamVzdCcpO1xuICB9XG4gIGlmIChkZXBlbmRlbmNpZXMudml0ZXN0KSB7XG4gICAgdHlwZU5hbWVzLmFkZCgndml0ZXN0L2dsb2JhbHMnKTtcbiAgfVxuICBpZiAoZGVwZW5kZW5jaWVzLm1vY2hhKSB7XG4gICAgdHlwZU5hbWVzLmFkZCgnbW9jaGEnKTtcbiAgfVxuICBpZiAoZGVwZW5kZW5jaWVzLmN5cHJlc3MpIHtcbiAgICB0eXBlTmFtZXMuYWRkKCdjeXByZXNzJyk7XG4gIH1cblxuICByZXR1cm4gWy4uLnR5cGVOYW1lc107XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgbWVyZ2UgZnJvbSAnZGVlcG1lcmdlJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZnNVdGlsIH0gZnJvbSAnLi4vdXRpbHMvZnNVdGlsLmpzJztcbmltcG9ydCB7IHNvcnRLZXlzIH0gZnJvbSAnLi4vdXRpbHMvb2JqZWN0VXRpbC5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcblxuY29uc3QgZXhjbHVkZUZpbGVQYXR0ZXJucyA9IFtcbiAgJyoqLy5naXQvb2JqZWN0cy8qKicsXG4gICcqKi8uZ2l0L3N1YnRyZWUtY2FjaGUvKionLFxuICAnKiovbm9kZV9tb2R1bGVzLyoqJyxcbiAgJyoqL3RtcC8qKicsXG4gICcqKi90ZW1wLyoqJyxcbiAgJyoqL2Rpc3QvKionLFxuXTtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlVnNjb2RlU2V0dGluZ3MoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZ2VuZXJhdGVWc2NvZGVTZXR0aW5ncycsIGFzeW5jICgpID0+IHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICcudnNjb2RlJywgJ3NldHRpbmdzLmpzb24nKTtcbiAgICAgIGNvbnN0IGV4aXN0aW5nQ29udGVudCA9IGF3YWl0IGZzLnByb21pc2VzLnJlYWRGaWxlKGZpbGVQYXRoLCAndXRmOCcpO1xuICAgICAgbGV0IHNldHRpbmdzID0gSlNPTi5wYXJzZShleGlzdGluZ0NvbnRlbnQpIGFzIG9iamVjdDtcbiAgICAgIGZvciAoY29uc3QgZXhjbHVkZUZpbGVQYXR0ZXJuIG9mIGV4Y2x1ZGVGaWxlUGF0dGVybnMpIHtcbiAgICAgICAgc2V0dGluZ3MgPSBtZXJnZS5hbGwoW3NldHRpbmdzLCBleGNsdWRlU2V0dGluZyhleGNsdWRlRmlsZVBhdHRlcm4pXSk7XG4gICAgICB9XG4gICAgICBpZiAoY29uZmlnLmRvZXNDb250YWluUG9ldHJ5TG9jayB8fCBjb25maWcuZG9lc0NvbnRhaW5VdkxvY2spIHtcbiAgICAgICAgc2V0dGluZ3MgPSBtZXJnZS5hbGwoW3NldHRpbmdzLCBleGNsdWRlU2V0dGluZygnKiovLnZlbnYvKionKV0pO1xuICAgICAgfVxuICAgICAgaWYgKGNvbmZpZy5kZXBlbmRpbmcubmV4dCkge1xuICAgICAgICBzZXR0aW5ncyA9IG1lcmdlLmFsbChbc2V0dGluZ3MsIGV4Y2x1ZGVTZXR0aW5nKCcqKi8ubmV4dC8qKicpXSk7XG4gICAgICB9XG4gICAgICAvLyBMTE3jgavjgojjgot2aWJlIGNvZGluZ+OBp+OBr+OAgeiHquWLleODleOCqeODvOODnuODg+ODiOOChOOCs+ODvOODieOCouOCr+OCt+ODp+ODs+OCkueEoeWKueWMluOBmeOCi+OBk+OBqOOBp1xuICAgICAgLy8g55Sf5oiQ44GV44KM44Gf44Kz44O844OJ44Gu5YWD44Gu5b2i5byP44KS57at5oyB44Gn44GN44KLXG4gICAgICBpZiAoJ2VkaXRvci5jb2RlQWN0aW9uc09uU2F2ZScgaW4gc2V0dGluZ3MpIHtcbiAgICAgICAgZGVsZXRlIHNldHRpbmdzWydlZGl0b3IuY29kZUFjdGlvbnNPblNhdmUnXTtcbiAgICAgIH1cbiAgICAgIGlmICgnZWRpdG9yLmZvcm1hdE9uU2F2ZScgaW4gc2V0dGluZ3MpIHtcbiAgICAgICAgZGVsZXRlIHNldHRpbmdzWydlZGl0b3IuZm9ybWF0T25TYXZlJ107XG4gICAgICB9XG4gICAgICBzb3J0S2V5cyhzZXR0aW5ncyBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPik7XG4gICAgICBjb25zdCBuZXdDb250ZW50ID0gSlNPTi5zdHJpbmdpZnkoc2V0dGluZ3MsIHVuZGVmaW5lZCwgMik7XG4gICAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnNVdGlsLmdlbmVyYXRlRmlsZShmaWxlUGF0aCwgbmV3Q29udGVudCkpO1xuICAgIH0gY2F0Y2gge1xuICAgICAgLy8gZG8gbm90aGluZ1xuICAgIH1cbiAgfSk7XG59XG5cbmZ1bmN0aW9uIGV4Y2x1ZGVTZXR0aW5nKGV4Y2x1ZGVGaWxlUGF0dGVybjogc3RyaW5nKTogb2JqZWN0IHtcbiAgcmV0dXJuIHtcbiAgICAnZmlsZXMud2F0Y2hlckV4Y2x1ZGUnOiB7XG4gICAgICBbZXhjbHVkZUZpbGVQYXR0ZXJuXTogdHJ1ZSxcbiAgICB9LFxuICB9O1xufVxuIiwiLy8gb3hsaW50LWRpc2FibGUgZXNsaW50LXBsdWdpbi1pbXBvcnQvbm8tbmFtZWQtYXMtZGVmYXVsdC1tZW1iZXIgLS0gTmFtZXNwYWNlIFlBTUwgY2FsbHMgbWFrZSBsb2FkL2R1bXAgdXNhZ2UgY2xlYXJlci5cbmltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB0eXBlIHsgQ29uZmlndXJhdGlvblZhbHVlTWFwIH0gZnJvbSAnQHlhcm5wa2cvY29yZSc7XG5pbXBvcnQgeWFtbCBmcm9tICdqcy15YW1sJztcbmltcG9ydCBzZW12ZXIgZnJvbSAnc2VtdmVyJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgcHJvbWlzZVBvb2wgfSBmcm9tICcuLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5pbXBvcnQgeyBzcGF3blN5bmMsIHNwYXduU3luY0FuZFJldHVyblN0ZG91dCB9IGZyb20gJy4uL3V0aWxzL3NwYXduVXRpbC5qcyc7XG5cbnR5cGUgU2V0dGluZ3MgPSB7XG4gIGFwcHJvdmVkR2l0UmVwb3NpdG9yaWVzPzogc3RyaW5nW107XG4gIGRlZmF1bHRTZW12ZXJSYW5nZVByZWZpeDogc3RyaW5nO1xuICBubU1vZGU6IHN0cmluZztcbiAgbm9kZUxpbmtlcjogc3RyaW5nO1xuICBucG1NaW5pbWFsQWdlR2F0ZT86IHN0cmluZztcbiAgbnBtUHJlYXBwcm92ZWRQYWNrYWdlcz86IHN0cmluZ1tdO1xuICBwbHVnaW5zPzogUGx1Z2luW107XG59ICYgUGFydGlhbDxDb25maWd1cmF0aW9uVmFsdWVNYXA+O1xuXG5pbnRlcmZhY2UgUGx1Z2luIHtcbiAgY2hlY2tzdW06IHN0cmluZztcbiAgcGF0aDogc3RyaW5nO1xuICBzcGVjOiBzdHJpbmc7XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZW5lcmF0ZVlhcm5yY1ltbChjb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdnZW5lcmF0ZVlhcm5yY1ltbCcsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCB5YXJucmNZbWxQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnLnlhcm5yYy55bWwnKTtcbiAgICBpZiAoY29uZmlnLmlzQnVuKSB7XG4gICAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnMucHJvbWlzZXMucm0oeWFybnJjWW1sUGF0aCwgeyBmb3JjZTogdHJ1ZSB9KSk7XG4gICAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT5cbiAgICAgICAgZnMucHJvbWlzZXMucm0ocGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnLnlhcm4nKSwgeyBmb3JjZTogdHJ1ZSwgcmVjdXJzaXZlOiB0cnVlIH0pXG4gICAgICApO1xuICAgICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+XG4gICAgICAgIGZzLnByb21pc2VzLnJtKHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJ3lhcm4ubG9jaycpLCB7IGZvcmNlOiB0cnVlLCByZWN1cnNpdmU6IHRydWUgfSlcbiAgICAgICk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgY3VycmVudFZlcnNpb24gPSBzcGF3blN5bmNBbmRSZXR1cm5TdGRvdXQoJ3lhcm4nLCBbJy0tdmVyc2lvbiddLCBjb25maWcuZGlyUGF0aCk7XG4gICAgY29uc3QgbGF0ZXN0VmVyc2lvbiA9IGdldExhdGVzdFZlcnNpb24oJ0B5YXJucGtnL2NsaScsIGNvbmZpZy5kaXJQYXRoKTtcbiAgICBpZiAoaXNOZXdlclZlcnNpb24obGF0ZXN0VmVyc2lvbiwgY3VycmVudFZlcnNpb24pKSB7XG4gICAgICBzcGF3blN5bmMoJ3lhcm4nLCBbJ3NldCcsICd2ZXJzaW9uJywgbGF0ZXN0VmVyc2lvbl0sIGNvbmZpZy5kaXJQYXRoLCAxKTtcbiAgICB9XG5cbiAgICBjb25zdCByZWxlYXNlc1BhdGggPSBwYXRoLmpvaW4oY29uZmlnLmRpclBhdGgsICcueWFybicsICdyZWxlYXNlcycpO1xuICAgIGF3YWl0IGZzLnByb21pc2VzLm1rZGlyKHJlbGVhc2VzUGF0aCwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gICAgZm9yIChjb25zdCBmaWxlIG9mIGF3YWl0IGZzLnByb21pc2VzLnJlYWRkaXIocmVsZWFzZXNQYXRoKSkge1xuICAgICAgaWYgKGZpbGUuc3RhcnRzV2l0aCgneWFybi0nKSAmJiAhZmlsZS5zdGFydHNXaXRoKGB5YXJuLSR7bGF0ZXN0VmVyc2lvbn0uYCkpIHtcbiAgICAgICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzLnByb21pc2VzLnJtKHBhdGguam9pbihyZWxlYXNlc1BhdGgsIGZpbGUpKSk7XG4gICAgICAgIGNvbnNvbGUubG9nKCdSZW1vdmVkJywgcGF0aC5qb2luKHJlbGVhc2VzUGF0aCwgZmlsZSkpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IHlhcm5yY1BhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICcueWFybnJjJyk7XG4gICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzLnByb21pc2VzLnJtKHlhcm5yY1BhdGgsIHsgZm9yY2U6IHRydWUgfSkpO1xuXG4gICAgbGV0IHNldHRpbmdzID0ge30gYXMgU2V0dGluZ3M7XG4gICAgdHJ5IHtcbiAgICAgIHNldHRpbmdzID0gKHlhbWwubG9hZChhd2FpdCBmcy5wcm9taXNlcy5yZWFkRmlsZSh5YXJucmNZbWxQYXRoLCAndXRmOCcpKSBhcyBTZXR0aW5ncyB8IHVuZGVmaW5lZCkgPz8gc2V0dGluZ3M7XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBkbyBub3RoaW5nXG4gICAgfVxuICAgIHNldHRpbmdzLmRlZmF1bHRTZW12ZXJSYW5nZVByZWZpeCA9ICcnO1xuICAgIHNldHRpbmdzLm5vZGVMaW5rZXIgPSAnbm9kZS1tb2R1bGVzJztcbiAgICBzZXR0aW5ncy5ubU1vZGUgPSAnaGFyZGxpbmtzLWdsb2JhbCc7XG4gICAgc2V0dGluZ3MubnBtTWluaW1hbEFnZUdhdGUgPSAnNWQnO1xuICAgIHNldHRpbmdzLmFwcHJvdmVkR2l0UmVwb3NpdG9yaWVzID0gW1xuICAgICAgLy8gWWFybiA0LjE0IGJsb2NrcyBnaXQgZGVwZW5kZW5jaWVzIHVubGVzcyB0aGUgcmVwb3NpdG9yeSBVUkwgaXMgZXhwbGljaXRseSBhbGxvd2VkLlxuICAgICAgJ2h0dHBzOi8vZ2l0aHViLmNvbS9XaWxsQm9vc3RlckxhYi8qLmdpdCcsXG4gICAgICAnc3NoOi8vZ2l0QGdpdGh1Yi5jb20vV2lsbEJvb3N0ZXJMYWIvKi5naXQnLFxuICAgIF07XG4gICAgc2V0dGluZ3MubnBtUHJlYXBwcm92ZWRQYWNrYWdlcyA9IFtcbiAgICAgIC8vIC0tLS0tLS0tLS0gU1RBUlQ6IFdlIGJlbGlldmUgb3VyIHBhY2thZ2VzIGFyZSBzYWZlIC0tLS0tLS0tLS1cbiAgICAgICdAZXhlcmNvZGUvKicsXG4gICAgICAnQHdpbGxib29zdGVyLyonLFxuICAgICAgJ2FnZW50LXJ1bnRpbWUta2l0JyxcbiAgICAgICdhdC1kZWNvcmF0b3JzJyxcbiAgICAgICdidWlsZC10cycsXG4gICAgICAnZ2VuLWkxOG4tdHMnLFxuICAgICAgJ29uZS13YXktZ2l0LXN5bmMnLFxuICAgICAgLy8gLS0tLS0tLS0tLSBFTkQ6IFdlIGJlbGlldmUgb3VyIHBhY2thZ2VzIGFyZSBzYWZlIC0tLS0tLS0tLS1cblxuICAgICAgLy8gVG8gZGVhbCB3aXRoIENWRSBsaWtlIGh0dHBzOi8vbmV4dGpzLm9yZy9ibG9nL0NWRS0yMDI1LTY2NDc4XG4gICAgICAnbmV4dCcsXG4gICAgICAnQG5leHQvKicsXG4gICAgICAnQHR5cGVzY3JpcHQvKicsXG4gICAgICAnQG94Zm10LyonLFxuICAgICAgJ0BveGxpbnQvKicsXG4gICAgICAnQG94bGludC10c2dvbGludC8qJyxcbiAgICAgICdveGZtdCcsXG4gICAgICAnb3hsaW50JyxcbiAgICAgICdveGxpbnQtdHNnb2xpbnQnLFxuICAgICAgJ3JlYWN0JyxcbiAgICAgICdyZWFjdC1kb20nLFxuICAgIF07XG4gICAgZGVsZXRlIHNldHRpbmdzLmNvbXByZXNzaW9uTGV2ZWw7XG4gICAgaWYgKHNldHRpbmdzLmluamVjdEVudmlyb25tZW50RmlsZXM/Lmxlbmd0aCA9PT0gMCkge1xuICAgICAgZGVsZXRlIHNldHRpbmdzLmluamVjdEVudmlyb25tZW50RmlsZXM7XG4gICAgfVxuICAgIC8vIGNmLiBodHRwczovL2dpdGh1Yi5jb20veWFybnBrZy9iZXJyeS9wdWxsLzQ2OThcbiAgICBzZXR0aW5ncy5lbmFibGVHbG9iYWxDYWNoZSA9IHRydWU7XG4gICAgY29uc3Qgb3JpZ2luYWxMZW5ndGggPSBzZXR0aW5ncy5wbHVnaW5zPy5sZW5ndGggPz8gMDtcbiAgICBzZXR0aW5ncy5wbHVnaW5zID0gc2V0dGluZ3MucGx1Z2lucz8uZmlsdGVyKChwKSA9PiBwLnBhdGggIT09ICcueWFybi9wbHVnaW5zL3VuZGVmaW5lZC5janMnKSA/PyBbXTtcbiAgICBpZiAoc2V0dGluZ3MucGx1Z2lucy5sZW5ndGggIT09IG9yaWdpbmFsTGVuZ3RoKSB7XG4gICAgICBjb25zdCBwbHVnaW5QYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnLnlhcm4nLCAncGx1Z2lucycsICd1bmRlZmluZWQuY2pzJyk7XG4gICAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnMucHJvbWlzZXMucm0ocGx1Z2luUGF0aCwgeyBmb3JjZTogdHJ1ZSB9KSk7XG4gICAgfVxuICAgIGlmIChzZXR0aW5ncy5wbHVnaW5zLmxlbmd0aCA9PT0gMCkge1xuICAgICAgZGVsZXRlIHNldHRpbmdzLnBsdWdpbnM7XG4gICAgfVxuICAgIGF3YWl0IGZzLnByb21pc2VzLndyaXRlRmlsZSh5YXJucmNZbWxQYXRoLCB5YW1sLmR1bXAoc2V0dGluZ3MsIHsgbGluZVdpZHRoOiAtMSB9KSk7XG5cbiAgICBzcGF3blN5bmMoJ3lhcm4nLCBbJ2RseCcsICd5YXJuLXBsdWdpbi1hdXRvLWluc3RhbGwnXSwgY29uZmlnLmRpclBhdGgpO1xuICAgIC8vIFRoZSB0YXJnZXQgcmVwbyBtYXkgbm90IGhhdmUgcHJldHRpZXIgaW5zdGFsbGVkIHlldCwgYW5kIHlhcm4tcGx1Z2luLWF1dG8taW5zdGFsbCBlZGl0cyB0aGlzIGZpbGUgYWZ0ZXIganMteWFtbC5cbiAgICBzcGF3blN5bmMoJ3lhcm4nLCBnZXRZYXJucmNQcmV0dGllckFyZ3MoY29uZmlnLmRpclBhdGgsIHlhcm5yY1ltbFBhdGgpLCBjb25maWcuZGlyUGF0aCk7XG4gIH0pO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0WWFybnJjUHJldHRpZXJBcmdzKGRpclBhdGg6IHN0cmluZywgeWFybnJjWW1sUGF0aDogc3RyaW5nKTogc3RyaW5nW10ge1xuICByZXR1cm4gWydkbHgnLCAncHJldHRpZXInLCAnLS1uby1jb25maWcnLCAnLS13cml0ZScsIHBhdGgucmVsYXRpdmUoZGlyUGF0aCwgeWFybnJjWW1sUGF0aCldO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0TGF0ZXN0VmVyc2lvbihwYWNrYWdlTmFtZTogc3RyaW5nLCBkaXJQYXRoOiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gc3Bhd25TeW5jQW5kUmV0dXJuU3Rkb3V0KCducG0nLCBbJ3Nob3cnLCBwYWNrYWdlTmFtZSwgJ3ZlcnNpb24nXSwgZGlyUGF0aCkgfHwgJzAuMC4wJztcbn1cblxuZnVuY3Rpb24gaXNOZXdlclZlcnNpb24obmV3VmVyc2lvbjogc3RyaW5nLCBvbGRWZXJzaW9uOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgY29uc3QgdmFsaWROZXdWZXJzaW9uID0gc2VtdmVyLnZhbGlkKG5ld1ZlcnNpb24pO1xuICBpZiAoIXZhbGlkTmV3VmVyc2lvbikgcmV0dXJuIGZhbHNlO1xuXG4gIHJldHVybiBzZW12ZXIuZ3QodmFsaWROZXdWZXJzaW9uLCBzZW12ZXIudmFsaWQob2xkVmVyc2lvbikgPz8gJzAuMC4wJyk7XG59XG4iLCJpbXBvcnQgdHlwZSB7IE9jdG9raXQgfSBmcm9tICdAb2N0b2tpdC9jb3JlJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZ2V0T2N0b2tpdCwgZ2l0SHViVXRpbCwgaGFzR2l0SHViVG9rZW4gfSBmcm9tICcuLi91dGlscy9naXRodWJVdGlsLmpzJztcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHNldHVwTGFiZWxzKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ3NldHVwTGFiZWxzJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IFtvd25lciwgcmVwb10gPSBnaXRIdWJVdGlsLmdldE9yZ0FuZE5hbWUoY29uZmlnLnJlcG9zaXRvcnkgPz8gJycpO1xuICAgIGlmICghb3duZXIgfHwgIXJlcG8pIHJldHVybjtcbiAgICBpZiAob3duZXIgIT09ICdXaWxsQm9vc3RlcicgJiYgb3duZXIgIT09ICdXaWxsQm9vc3RlckxhYicpIHJldHVybjtcbiAgICBpZiAoIWhhc0dpdEh1YlRva2VuKG93bmVyKSkgcmV0dXJuO1xuXG4gICAgY29uc3Qgb2N0b2tpdCA9IGdldE9jdG9raXQob3duZXIpO1xuXG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdkMTogeC1lYXN5IDpoZWRnZWhvZzonLCAnRURFOUZFJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAnZDI6IGVhc3kgOnJhYmJpdDI6JywgJ0RERDZGRScpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ2QzOiBtZWRpdW0gOm94OicsICdDNEI1RkQnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdkNDogaGFyZCA6c3F1aWQ6JywgJ0E3OEJGQScpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ2Q1OiB4LWhhcmQgOndoYWxlMjonLCAnOEI1Q0Y2Jyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAncDE6IGNyaXRpY2FsIDpmaXJlOjpmaXJlOjpmaXJlOicsICdFRjQ0NDQnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdwMjogdXJnZW50IDpmaXJlOjpmaXJlOicsICdGODcxNzEnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdwMzogaW1wb3J0YW50IDpmaXJlOicsICdGQ0E1QTUnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdwNDogbmljZSB0byBoYXZlIDpkcm9wbGV0OicsICdGRUNBQ0EnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdyOiBibGl0eicsICc1MzAwYmMnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdyOiBmaXJlYmFzZScsICdmZmNhMjgnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdyOiBwcmlzbWEnLCAnMGMzNDRiJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAncjogcmVhY3QnLCAnNjFkYWZiJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAncjogc3ZlbHRlJywgJ2ZmM2UwMCcpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ3I6IHNlbWFudGljLXJlbGVhc2UnLCAnNDk0OTQ5Jyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAncmVhZHkgOnJvY2tldDonLCAnMjJDNTVFJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAncmV2aWV3IHJlcXVlc3RlZCA6bWFnOicsICdGQkNBMDQnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdyZWxlYXNlZCA6Ym9va21hcms6JywgJzYzNjZGMScpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ3M6IDAuNWggOmNsb2NrMTIzMDonLCAnRjNGNEY2Jyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAnczogMWggOmNsb2NrMTonLCAnRTVFN0VCJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAnczogMmggOmNsb2NrMjonLCAnRDFENURCJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAnczogM2ggOmNsb2NrMzonLCAnOUNBM0FGJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAnczogNWggOmNsb2NrNTonLCAnNkI3MjgwJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAnczogOGggOmNsb2NrODonLCAnNEI1NTYzJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAnczogMTNoIDpjbG9jazE6JywgJzM3NDE1MScpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ3Q6IGJ1aWxkIDpoYW1tZXI6JywgJ0JGREJGRScpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ3Q6IGNob3JlIDpicm9vbTonLCAnQkZEQkZFJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAndDogY2kgOmNvbnN0cnVjdGlvbl93b3JrZXI6JywgJ0JGREJGRScpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ3Q6IGRvY3MgOm1lbW86JywgJ0JGREJGRScpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ3Q6IGZlYXQgOnNwYXJrbGVzOicsICdCRkRCRkUnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICd0OiBmaXggOmJ1ZzonLCAnQkZEQkZFJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAndDogcGVyZiA6emFwOicsICdCRkRCRkUnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICd0OiByZWZhY3RvciA6cmVjeWNsZTonLCAnQkZEQkZFJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAndDogc3R5bGUgOmxpcHN0aWNrOicsICdCRkRCRkUnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICd0OiB0ZXN0IDp0ZXN0X3R1YmU6JywgJ0JGREJGRScpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ3Byb2plY3QnLCAnMjQyOTJGJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAnZm9jdXNlZCA6ZGFydDonLCAnMjJDNTVFJyk7XG5cbiAgICAgIGF3YWl0IGRlbGV0ZUxhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAnYnVnJyk7XG4gICAgICBhd2FpdCBkZWxldGVMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ2RvY3VtZW50YXRpb24nKTtcbiAgICAgIGF3YWl0IGRlbGV0ZUxhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAnZHVwbGljYXRlJyk7XG4gICAgICBhd2FpdCBkZWxldGVMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ2VuaGFuY2VtZW50Jyk7XG4gICAgICBhd2FpdCBkZWxldGVMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ2dvb2QgZmlyc3QgaXNzdWUnKTtcbiAgICAgIGF3YWl0IGRlbGV0ZUxhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAnaGVscCB3YW50ZWQnKTtcbiAgICAgIGF3YWl0IGRlbGV0ZUxhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAnaW52YWxpZCcpO1xuICAgICAgYXdhaXQgZGVsZXRlTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdxdWVzdGlvbicpO1xuICAgICAgYXdhaXQgZGVsZXRlTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICd3b250Zml4Jyk7XG5cbiAgICAgIGF3YWl0IGRlbGV0ZUxhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAncmVhZHknKTtcbiAgICAgIGF3YWl0IGRlbGV0ZUxhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAncmV2aWV3IHJlcXVlc3RlZCcpO1xuICAgICAgYXdhaXQgZGVsZXRlTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdyZWxlYXNlZCcpO1xuICAgICAgYXdhaXQgZGVsZXRlTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdzZW1hbnRpYy1yZWxlYXNlJyk7XG4gICAgICBhd2FpdCBkZWxldGVMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ2xsbS1wciA6cm9ib3Q6Jyk7XG4gICAgICBhd2FpdCBkZWxldGVMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ2FpLXByIDpyb2JvdDonKTtcbiAgICAgIGF3YWl0IGRlbGV0ZUxhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAnZ2VuLXByLWFsbCA6cm9ib3Q6Jyk7XG4gICAgICBhd2FpdCBkZWxldGVMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ2dlbi1wci1jbGF1ZGUgOnJvYm90OicpO1xuICAgICAgYXdhaXQgZGVsZXRlTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdnZW4tcHItY29kZXggOnJvYm90OicpO1xuICAgICAgYXdhaXQgZGVsZXRlTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdnZW4tcHItZ2VtaW5pIDpyb2JvdDonKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgY29uc29sZS53YXJuKCdTa2lwIHNldHVwTGFiZWxzIGR1ZSB0bzonLCAoZXJyb3IgYXMgRXJyb3IgfCB1bmRlZmluZWQpPy5zdGFjayA/PyBlcnJvcik7XG4gICAgfVxuICB9KTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gc2V0dXBMYWJlbChvY3Rva2l0OiBPY3Rva2l0LCBvd25lcjogc3RyaW5nLCByZXBvOiBzdHJpbmcsIG5hbWU6IHN0cmluZywgY29sb3I6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICB0cnkge1xuICAgIC8vIElzc3VlcyBwZXJtaXNzaW9uXG4gICAgYXdhaXQgb2N0b2tpdC5yZXF1ZXN0KCdQT1NUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9sYWJlbHMnLCB7XG4gICAgICBvd25lcixcbiAgICAgIHJlcG8sXG4gICAgICBuYW1lLFxuICAgICAgY29sb3IsXG4gICAgfSk7XG4gIH0gY2F0Y2gge1xuICAgIC8vIElzc3VlcyBwZXJtaXNzaW9uXG4gICAgYXdhaXQgb2N0b2tpdC5yZXF1ZXN0KCdQQVRDSCAvcmVwb3Mve293bmVyfS97cmVwb30vbGFiZWxzL3tuYW1lfScsIHtcbiAgICAgIG93bmVyLFxuICAgICAgcmVwbyxcbiAgICAgIG5hbWUsXG4gICAgICBjb2xvcixcbiAgICB9KTtcbiAgfVxufVxuXG5hc3luYyBmdW5jdGlvbiBkZWxldGVMYWJlbChvY3Rva2l0OiBPY3Rva2l0LCBvd25lcjogc3RyaW5nLCByZXBvOiBzdHJpbmcsIG5hbWU6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICB0cnkge1xuICAgIC8vIElzc3VlcyBwZXJtaXNzaW9uXG4gICAgYXdhaXQgb2N0b2tpdC5yZXF1ZXN0KCdERUxFVEUgL3JlcG9zL3tvd25lcn0ve3JlcG99L2xhYmVscy97bmFtZX0nLCB7XG4gICAgICBvd25lcixcbiAgICAgIHJlcG8sXG4gICAgICBuYW1lLFxuICAgIH0pO1xuICB9IGNhdGNoIHtcbiAgICAvLyBkbyBub3RoaW5nXG4gIH1cbn1cbiIsImltcG9ydCB7IGNyZWF0ZVJlcXVpcmUgfSBmcm9tICdub2RlOm1vZHVsZSc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgZG90ZW52IGZyb20gJ2RvdGVudic7XG5pbXBvcnQgdHlwZSBzb2RpdW1Nb2R1bGUgZnJvbSAnbGlic29kaXVtLXdyYXBwZXJzJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB7IG9wdGlvbnMgfSBmcm9tICcuLi9vcHRpb25zLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZ2V0T2N0b2tpdCwgZ2l0SHViVXRpbCwgaGFzR2l0SHViVG9rZW4gfSBmcm9tICcuLi91dGlscy9naXRodWJVdGlsLmpzJztcblxuY29uc3QgREVQUkVDQVRFRF9TRUNSRVRfTkFNRVMgPSBbJ1JFQURZX0RJU0NPUkRfV0VCSE9PS19VUkwnLCAnR0hfQk9UX1BBVCcsICdQVUJMSUNfR0hfQk9UX1BBVCddO1xuY29uc3QgcmVxdWlyZSA9IGNyZWF0ZVJlcXVpcmUoaW1wb3J0Lm1ldGEudXJsKTtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHNldHVwU2VjcmV0cyhjb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdzZXR1cFNlY3JldHMnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgW293bmVyLCByZXBvXSA9IGdpdEh1YlV0aWwuZ2V0T3JnQW5kTmFtZShjb25maWcucmVwb3NpdG9yeSA/PyAnJyk7XG4gICAgaWYgKCFvd25lciB8fCAhcmVwbyB8fCBvd25lciAhPT0gJ1dpbGxCb29zdGVyTGFiJykgcmV0dXJuO1xuICAgIGlmICghaGFzR2l0SHViVG9rZW4ob3duZXIpIHx8ICFvcHRpb25zLmRvZXNVcGxvYWRFbnZWYXJzKSByZXR1cm47XG5cbiAgICBjb25zdCBwYXJzZWQgPSBkb3RlbnYuY29uZmlnKHsgcGF0aDogcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnLmVudicpLCBxdWlldDogdHJ1ZSB9KS5wYXJzZWQgPz8ge307XG4gICAgaWYgKE9iamVjdC5rZXlzKHBhcnNlZCkubGVuZ3RoID09PSAwKSByZXR1cm47XG5cbiAgICBjb25zdCBvY3Rva2l0ID0gZ2V0T2N0b2tpdChvd25lcik7XG5cbiAgICB0cnkge1xuICAgICAgZm9yIChjb25zdCBzZWNyZXROYW1lIG9mIERFUFJFQ0FURURfU0VDUkVUX05BTUVTKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgLy8gUmVxdWlyZXMgU2VjcmV0cyBwZXJtaXNzaW9uXG4gICAgICAgICAgYXdhaXQgb2N0b2tpdC5yZXF1ZXN0KCdERUxFVEUgL3JlcG9zL3tvd25lcn0ve3JlcG99L2FjdGlvbnMvc2VjcmV0cy97c2VjcmV0X25hbWV9Jywge1xuICAgICAgICAgICAgb3duZXIsXG4gICAgICAgICAgICByZXBvLFxuICAgICAgICAgICAgc2VjcmV0X25hbWU6IHNlY3JldE5hbWUsXG4gICAgICAgICAgfSk7XG4gICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgIC8vIGRvIG5vdGhpbmdcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBSZXF1aXJlcyBTZWNyZXRzIHBlcm1pc3Npb25cbiAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgb2N0b2tpdC5yZXF1ZXN0KCdHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2FjdGlvbnMvc2VjcmV0cy9wdWJsaWMta2V5Jywge1xuICAgICAgICBvd25lcixcbiAgICAgICAgcmVwbyxcbiAgICAgIH0pO1xuICAgICAgY29uc3QgeyBrZXksIGtleV9pZDoga2V5SWQgfSA9IHJlc3BvbnNlLmRhdGE7XG5cbiAgICAgIGNvbnN0IHNvZGl1bSA9IGdldFNvZGl1bSgpO1xuICAgICAgYXdhaXQgc29kaXVtLnJlYWR5O1xuXG4gICAgICBmb3IgKGNvbnN0IFtuYW1lLCBzZWNyZXRdIG9mIE9iamVjdC5lbnRyaWVzKHBhcnNlZCkpIHtcbiAgICAgICAgaWYgKFxuICAgICAgICAgIG5hbWUgPT09ICdHSF9CT1RfUEFUJyB8fFxuICAgICAgICAgIG5hbWUgPT09ICdHSF9CT1RfUEFUX0ZPUl9XSUxMQk9PU1RFUicgfHxcbiAgICAgICAgICBuYW1lID09PSAnR0hfQk9UX1BBVF9GT1JfV0lMTEJPT1NURVJMQUInXG4gICAgICAgICkge1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gQ29udmVydCBTZWNyZXQgJiBCYXNlNjQga2V5IHRvIFVpbnQ4QXJyYXkuXG4gICAgICAgIGNvbnN0IHJhd0tleSA9IHNvZGl1bS5mcm9tX2Jhc2U2NChrZXksIHNvZGl1bS5iYXNlNjRfdmFyaWFudHMuT1JJR0lOQUwpO1xuICAgICAgICBjb25zdCByYXdTZWMgPSBzb2RpdW0uZnJvbV9zdHJpbmcoc2VjcmV0KTtcblxuICAgICAgICAvLyBFbmNyeXB0IHRoZSBzZWNyZXQgdXNpbmcgTGliU29kaXVtXG4gICAgICAgIGNvbnN0IGVuY0J5dGVzID0gc29kaXVtLmNyeXB0b19ib3hfc2VhbChyYXdTZWMsIHJhd0tleSk7XG5cbiAgICAgICAgLy8gQ29udmVydCBlbmNyeXB0ZWQgVWludDhBcnJheSB0byBCYXNlNjRcbiAgICAgICAgY29uc3QgZW5jQmFzZTY0ID0gc29kaXVtLnRvX2Jhc2U2NChlbmNCeXRlcywgc29kaXVtLmJhc2U2NF92YXJpYW50cy5PUklHSU5BTCk7XG5cbiAgICAgICAgLy8gUmVxdWlyZXMgU2VjcmV0cyBwZXJtaXNzaW9uXG4gICAgICAgIGF3YWl0IG9jdG9raXQucmVxdWVzdCgnUFVUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9hY3Rpb25zL3NlY3JldHMve3NlY3JldF9uYW1lfScsIHtcbiAgICAgICAgICBvd25lcixcbiAgICAgICAgICByZXBvLFxuICAgICAgICAgIHNlY3JldF9uYW1lOiBuYW1lLFxuICAgICAgICAgIGVuY3J5cHRlZF92YWx1ZTogZW5jQmFzZTY0LFxuICAgICAgICAgIGtleV9pZDoga2V5SWQsXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBjb25zb2xlLndhcm4oJ1NraXAgc2V0dXBTZWNyZXRzIGR1ZSB0bzonLCAoZXJyb3IgYXMgRXJyb3IgfCB1bmRlZmluZWQpPy5zdGFjayA/PyBlcnJvcik7XG4gICAgfVxuICB9KTtcbn1cblxuZnVuY3Rpb24gZ2V0U29kaXVtKCk6IHR5cGVvZiBzb2RpdW1Nb2R1bGUge1xuICAvLyBsaWJzb2RpdW0td3JhcHBlcnMnIEVTTSBlbnRyeSBjYW4gYmluZCB0byBsaWJzb2RpdW1AMC44LjMsIHdob3NlIGRlZmF1bHRcbiAgLy8gZXhwb3J0IG5vIGxvbmdlciBleHBvc2VzIHJlYWR5LiBUaGUgQ29tbW9uSlMgZW50cnkga2VlcHMgdGhlIEFQSSBzaGFwZS5cbiAgcmV0dXJuIHJlcXVpcmUoJ2xpYnNvZGl1bS13cmFwcGVycycpIGFzIHR5cGVvZiBzb2RpdW1Nb2R1bGU7XG59XG4iLCJpbXBvcnQgeyB3aXRoUmV0cnkgfSBmcm9tICdAd2lsbGJvb3N0ZXIvc2hhcmVkLWxpYi9zcmMnO1xuXG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGdldE9jdG9raXQsIGdpdEh1YlV0aWwsIGhhc0dpdEh1YlRva2VuIH0gZnJvbSAnLi4vdXRpbHMvZ2l0aHViVXRpbC5qcyc7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBzZXR1cEdpdEh1YlNldHRpbmdzKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBbb3duZXIsIHJlcG9dID0gZ2l0SHViVXRpbC5nZXRPcmdBbmROYW1lKGNvbmZpZy5yZXBvc2l0b3J5ID8/ICcnKTtcbiAgaWYgKCFvd25lciB8fCAhcmVwbykgcmV0dXJuO1xuICBpZiAob3duZXIgIT09ICdXaWxsQm9vc3RlcicgJiYgb3duZXIgIT09ICdXaWxsQm9vc3RlckxhYicpIHJldHVybjtcbiAgaWYgKCFoYXNHaXRIdWJUb2tlbihvd25lcikpIHJldHVybjtcblxuICBjb25zdCBvY3Rva2l0ID0gZ2V0T2N0b2tpdChvd25lcik7XG5cbiAgLy8gQWRtaW5pc3RyYXRpb24gcGVybWlzc2lvblxuICBhd2FpdCB3aXRoUmV0cnkoKCkgPT5cbiAgICBvY3Rva2l0LnJlcXVlc3QoJ1BBVENIIC9yZXBvcy97b3duZXJ9L3tyZXBvfScsIHtcbiAgICAgIG93bmVyLFxuICAgICAgcmVwbyxcbiAgICAgIGFsbG93X2F1dG9fbWVyZ2U6IHRydWUsXG4gICAgICBhbGxvd19tZXJnZV9jb21taXQ6IGZhbHNlLFxuICAgICAgYWxsb3dfc3F1YXNoX21lcmdlOiB0cnVlLFxuICAgICAgYWxsb3dfcmViYXNlX21lcmdlOiBmYWxzZSxcbiAgICAgIGFsbG93X3VwZGF0ZV9icmFuY2g6IHRydWUsXG4gICAgICBkZWxldGVfYnJhbmNoX29uX21lcmdlOiB0cnVlLFxuICAgICAgc3F1YXNoX21lcmdlX2NvbW1pdF90aXRsZTogJ1BSX1RJVExFJyxcbiAgICAgIHNxdWFzaF9tZXJnZV9jb21taXRfbWVzc2FnZTogJ0JMQU5LJyxcbiAgICAgIGhlYWRlcnM6IHtcbiAgICAgICAgJ1gtR2l0SHViLUFwaS1WZXJzaW9uJzogJzIwMjItMTEtMjgnLFxuICAgICAgfSxcbiAgICAgIC4uLihjb25maWcucmVwb3NpdG9yeT8uc3RhcnRzV2l0aCgnZ2l0aHViOldpbGxCb29zdGVyLycpID8geyBhbGxvd19hdXRvX21lcmdlOiB0cnVlIH0gOiB7fSksXG4gICAgfSlcbiAgKTtcbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB7IGRpc3RhbmNlIH0gZnJvbSAnZmFzdGVzdC1sZXZlbnNodGVpbic7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGZzVXRpbCB9IGZyb20gJy4uL3V0aWxzL2ZzVXRpbC5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcblxuY29uc3QgcGFja2FnZU1hbmFnZXJSdW5QbGFjZWhvbGRlciA9ICdfX1BNX1JVTl9fJztcblxuY29uc3QgdGVtcGxhdGVzID0ge1xuICAncHVsbF9yZXF1ZXN0X3RlbXBsYXRlLm1kJzogYFxuQ2xvc2UgIzxJc3N1ZU51bWJlcj5cblxuIyMgU2VsZiBDaGVja1xuXG4tIFsgXSBJJ3ZlIGNvbmZpcm1lZCBcXGBBbGwgY2hlY2tzIGhhdmUgcGFzc2VkXFxgIG9uIHRoaXMgcGFnZS5cbiAgLSBQUiB0aXRsZSBmb2xsb3dzIFtBbmd1bGFyJ3MgY29tbWl0IG1lc3NhZ2UgZm9ybWF0XShodHRwczovL2dpdGh1Yi5jb20vYW5ndWxhci9hbmd1bGFyL2Jsb2IvbWFpbi9DT05UUklCVVRJTkcubWQjLWNvbW1pdC1tZXNzYWdlLWZvcm1hdCkuXG4gIC0gUFIgdGl0bGUgZG9lc24ndCBoYXZlIFxcYFdJUDpcXGAuXG4gIC0gVGhlIHRlc3QgY29tbWFuZCAoZS5nLiwgXFxgJHtwYWNrYWdlTWFuYWdlclJ1blBsYWNlaG9sZGVyfSB0ZXN0XFxgKSBwYXNzZWQuXG4gIC0gVGhlIGxpbnQgY29tbWFuZCAoZS5nLiwgXFxgJHtwYWNrYWdlTWFuYWdlclJ1blBsYWNlaG9sZGVyfSBsaW50XFxgKSBwYXNzZWQuXG4gIC0gWW91IG1heSBsZWF2ZSB0aGlzIGJveCB1bmNoZWNrZWQgZHVlIHRvIGxvbmcgd29ya2Zsb3dzLlxuLSBbIF0gSSd2ZSByZXZpZXdlZCBteSBjaGFuZ2VzIG9uIHRoZSBHaXRIdWIgZGlmZiB2aWV3LlxuLSBbIF0gSSd2ZSB3cml0dGVuIHRoZSBzdGVwcyB0byB0ZXN0IG15IGNoYW5nZXMuXG4tIFsgXSBJJ3ZlIGFkZGVkIHNjcmVlbnNob3RzIChpZiB0aGUgVUkgY2hhbmdlZCkuXG4gIC0gWW91IG1heSBsZWF2ZSB0aGlzIGJveCB1bmNoZWNrZWQgaWYgeW91IGRpZG4ndCBtb2RpZnkgdGhlIFVJLlxuXG48IS0tIFBsZWFzZSBhZGQgc2NyZWVuc2hvdHMgaWYgeW91IG1vZGlmeSB0aGUgVUkuXG58IEN1cnJlbnQgICAgICAgICAgICAgICAgICB8IEluIGNvbWluZyAgICAgICAgICAgICAgICB8XG58IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8XG58IDxpbWcgc3JjPVwiXCIgd2lkdGg9XCI0MDBcIj4gfCA8aW1nIHNyYz1cIlwiIHdpZHRoPVwiNDAwXCI+IHxcbi0tPlxuXG48IS0tIFBsZWFzZSBhZGQgc3RlcHMgdG8gdGVzdCB5b3VyIGNoYW5nZXMuXG4jIyBTdGVwcyB0byBUZXN0XG5cbjEuIE9wZW4gaHR0cDovL2xvY2FsaG9zdC1leGVyY29kZS53aWxsYm9vc3Rlci5uZXQ6MzAwMC9qYS1KUC9jb3Vyc2VzL19leGFtcGxlL2xlc3NvbnMvX2V4YW1wbGVfYV9wbHVzX2IvcHJvYmxlbXMvX2V4YW1wbGVfYV9wbHVzX2IgYWZ0ZXIgbG9naW4uXG4yLiBTZWxlY3QgdGhlIGxhbmd1YWdlIFxcYENcXGAuXG4zLiBXcml0ZSB0aGUgZm9sbG93aW5nIGNvZGU6XG4gICBcXGBcXGBcXGBjXG4gICAjaW5jbHVkZSA8c3RkaW8uaD5cblxuICAgaW50IG1haW4odm9pZCkge1xuICAgICBpbnQgYSwgYjtcblxuICAgICBzY2FuZihcIiVkICVkXCIsICZhLCAmYik7XG4gICAgIHByaW50ZihcIiVkXCIsIGEgKyBiKTtcbiAgICAgcmV0dXJuIDA7XG4gICB9XG4gICBcXGBcXGBcXGBcbjQuIFB1c2ggXFxgU3VibWl0XFxgIGJ1dHRvbi5cbjUuIC4uLlxuLS0+XG5gLnRyaW0oKSxcbn07XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZW5lcmF0ZUdpdEh1YlRlbXBsYXRlcyhjb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdnZW5lcmF0ZUdpdEh1YlRlbXBsYXRlcycsIGFzeW5jICgpID0+IHtcbiAgICBpZiAoIWNvbmZpZy5pc1dpbGxCb29zdGVyUmVwbykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGZvciAoY29uc3QgW2ZpbGVOYW1lLCBuZXdDb250ZW50XSBvZiBPYmplY3QuZW50cmllcyh0ZW1wbGF0ZXMpKSB7XG4gICAgICBjb25zdCBjb250ZW50ID0gYXBwbHlQYWNrYWdlTWFuYWdlclRlbXBsYXRlKG5ld0NvbnRlbnQsIGNvbmZpZyk7XG4gICAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJy5naXRodWInLCBmaWxlTmFtZSk7XG4gICAgICBpZiAoZnMuZXhpc3RzU3luYyhmaWxlUGF0aCkpIHtcbiAgICAgICAgY29uc3Qgb2xkQ29udGVudCA9IGF3YWl0IGZzLnByb21pc2VzLnJlYWRGaWxlKGZpbGVQYXRoLCAndXRmOCcpO1xuICAgICAgICBpZiAoZGlzdGFuY2Uob2xkQ29udGVudCwgY29udGVudCkgPiBjb250ZW50Lmxlbmd0aCAvIDIpIHtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBhd2FpdCBmcy5wcm9taXNlcy5ta2RpcihwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICcuZ2l0aHViJyksIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICAgICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzVXRpbC5nZW5lcmF0ZUZpbGUoZmlsZVBhdGgsIGNvbnRlbnQpKTtcbiAgICB9XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBhcHBseVBhY2thZ2VNYW5hZ2VyVGVtcGxhdGUodGVtcGxhdGU6IHN0cmluZywgY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogc3RyaW5nIHtcbiAgY29uc3QgcGFja2FnZU1hbmFnZXJDb21tYW5kID0gY29uZmlnLmlzQnVuID8gJ2J1biBydW4nIDogJ3lhcm4nO1xuICByZXR1cm4gdGVtcGxhdGUucmVwbGFjZUFsbChwYWNrYWdlTWFuYWdlclJ1blBsYWNlaG9sZGVyLCBwYWNrYWdlTWFuYWdlckNvbW1hbmQpO1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IGZzcCBmcm9tICdub2RlOmZzL3Byb21pc2VzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCBmZyBmcm9tICdmYXN0LWdsb2InO1xuaW1wb3J0IHsgc2ltcGxlR2l0IH0gZnJvbSAnc2ltcGxlLWdpdCc7XG5pbXBvcnQgdG9tbCBmcm9tICdzbW9sLXRvbWwnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlSnNvbiB9IGZyb20gJ3R5cGUtZmVzdCc7XG5pbXBvcnQgeyB6IH0gZnJvbSAnem9kJztcblxuaW1wb3J0IHsgZ2V0T2N0b2tpdCwgZ2l0SHViVXRpbCB9IGZyb20gJy4vdXRpbHMvZ2l0aHViVXRpbC5qcyc7XG5pbXBvcnQgeyBnbG9iSWdub3JlIH0gZnJvbSAnLi91dGlscy9nbG9iVXRpbC5qcyc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgUGFja2FnZUNvbmZpZyB7XG4gIGRpclBhdGg6IHN0cmluZztcbiAgZG9ja2VyZmlsZTogc3RyaW5nO1xuICBpc1Jvb3Q6IGJvb2xlYW47XG4gIGlzUHVibGljUmVwbzogYm9vbGVhbjtcbiAgaXNSZWZlcnJlZEJ5T3RoZXJSZXBvOiBib29sZWFuO1xuICByZXBvc2l0b3J5Pzogc3RyaW5nO1xuICByZXBvQXV0aG9yPzogc3RyaW5nO1xuICByZXBvTmFtZT86IHN0cmluZztcbiAgaXNXaWxsQm9vc3RlclJlcG86IGJvb2xlYW47XG4gIGlzQnVuOiBib29sZWFuO1xuICBpc0VzbVBhY2thZ2U6IGJvb2xlYW47XG4gIGlzV2lsbEJvb3N0ZXJDb25maWdzOiBib29sZWFuO1xuICAvLyBkZXBlbmRlbmN5IGluZm9ybWF0aW9uXG4gIGRvZXNDb250YWluU3ViUGFja2FnZUpzb25zOiBib29sZWFuO1xuICBkb2VzQ29udGFpbkRvY2tlcmZpbGU6IGJvb2xlYW47XG4gIGRvZXNDb250YWluR2VtZmlsZTogYm9vbGVhbjtcbiAgZG9lc0NvbnRhaW5Hb01vZDogYm9vbGVhbjtcbiAgZG9lc0NvbnRhaW5QYWNrYWdlSnNvbjogYm9vbGVhbjtcbiAgZG9lc0NvbnRhaW5Qb2V0cnlMb2NrOiBib29sZWFuO1xuICBkb2VzQ29udGFpblV2TG9jazogYm9vbGVhbjtcbiAgZG9lc0NvbnRhaW5Qb21YbWw6IGJvb2xlYW47XG4gIGRvZXNDb250YWluUHVic3BlY1lhbWw6IGJvb2xlYW47XG4gIGRvZXNDb250YWluVGVtcGxhdGVZYW1sOiBib29sZWFuO1xuICBkb2VzQ29udGFpblZzY29kZVNldHRpbmdzSnNvbjogYm9vbGVhbjtcbiAgLy8gc291cmNlIGNvZGUgZmlsZXNcbiAgZG9lc0NvbnRhaW5KYXZhU2NyaXB0OiBib29sZWFuO1xuICBkb2VzQ29udGFpblR5cGVTY3JpcHQ6IGJvb2xlYW47XG4gIGRvZXNDb250YWluSnN4T3JUc3g6IGJvb2xlYW47XG4gIGRvZXNDb250YWluSmF2YTogYm9vbGVhbjtcbiAgZG9lc0NvbnRhaW5KYXZhU2NyaXB0SW5QYWNrYWdlczogYm9vbGVhbjtcbiAgZG9lc0NvbnRhaW5UeXBlU2NyaXB0SW5QYWNrYWdlczogYm9vbGVhbjtcbiAgZG9lc0NvbnRhaW5Kc3hPclRzeEluUGFja2FnZXM6IGJvb2xlYW47XG4gIGRvZXNDb250YWluSmF2YUluUGFja2FnZXM6IGJvb2xlYW47XG5cbiAgZGVwZW5kaW5nOiB7XG4gICAgYmxpdHo6IGJvb2xlYW47XG4gICAgZmlyZWJhc2U6IGJvb2xlYW47XG4gICAgZ2VuSTE4blRzOiBib29sZWFuO1xuICAgIGxpdGVzdHJlYW06IGJvb2xlYW47XG4gICAgbmV4dDogYm9vbGVhbjtcbiAgICBwbGF5d3JpZ2h0VGVzdDogYm9vbGVhbjtcbiAgICBwcmlzbWE6IGJvb2xlYW47XG4gICAgcHlyaWdodDogYm9vbGVhbjtcbiAgICByZWFjdDogYm9vbGVhbjtcbiAgICByZWFjdE5hdGl2ZTogYm9vbGVhbjtcbiAgICBzZW1hbnRpY1JlbGVhc2U6IGJvb2xlYW47XG4gICAgc3Rvcnlib29rOiBib29sZWFuO1xuICAgIHdiOiBib29sZWFuO1xuICB9O1xuICByZWxlYXNlOiB7XG4gICAgYnJhbmNoZXM6IHN0cmluZ1tdO1xuICAgIGdpdGh1YjogYm9vbGVhbjtcbiAgICBucG06IGJvb2xlYW47XG4gIH07XG4gIGhhc1ZlcnNpb25TZXR0aW5nczogYm9vbGVhbjtcbiAgbWlzZVRhc2tzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+O1xuICBwYWNrYWdlSnNvbj86IFBhY2thZ2VKc29uO1xuICB3YmZ5SnNvbj86IFdiZnlKc29uO1xufVxuXG50eXBlIFdiZnlKc29uID0gei5pbmZlcjx0eXBlb2Ygd2JmeUpzb25TY2hlbWE+O1xuXG5jb25zdCB3YmZ5SnNvblNjaGVtYSA9IHoub2JqZWN0KHtcbiAgdHlwb3M6IHpcbiAgICAub2JqZWN0KHtcbiAgICAgIGFsbDogei5yZWNvcmQoei5zdHJpbmcoKSwgei5zdHJpbmcoKSkub3B0aW9uYWwoKSxcbiAgICAgIGRvYzogei5yZWNvcmQoei5zdHJpbmcoKSwgei5zdHJpbmcoKSkub3B0aW9uYWwoKSxcbiAgICAgIHRzOiB6LnJlY29yZCh6LnN0cmluZygpLCB6LnN0cmluZygpKS5vcHRpb25hbCgpLFxuICAgICAgdGV4dDogei5yZWNvcmQoei5zdHJpbmcoKSwgei5zdHJpbmcoKSkub3B0aW9uYWwoKSxcbiAgICB9KVxuICAgIC5vcHRpb25hbCgpLFxufSk7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZXRQYWNrYWdlQ29uZmlnKFxuICBkaXJQYXRoOiBzdHJpbmcsXG4gIHJvb3RDb25maWc/OiBQYWNrYWdlQ29uZmlnXG4pOiBQcm9taXNlPFBhY2thZ2VDb25maWcgfCB1bmRlZmluZWQ+IHtcbiAgY29uc3QgcGFja2FnZUpzb25QYXRoID0gcGF0aC5yZXNvbHZlKGRpclBhdGgsICdwYWNrYWdlLmpzb24nKTtcbiAgdHJ5IHtcbiAgICBjb25zdCBkb2VzQ29udGFpblBhY2thZ2VKc29uID0gZnMuZXhpc3RzU3luYyhwYWNrYWdlSnNvblBhdGgpO1xuICAgIGxldCBkZXBlbmRlbmNpZXM6IFBhY2thZ2VKc29uWydkZXBlbmRlbmNpZXMnXSA9IHt9O1xuICAgIGxldCBkZXZEZXBlbmRlbmNpZXM6IFBhY2thZ2VKc29uWydkZXZEZXBlbmRlbmNpZXMnXSA9IHt9O1xuICAgIGxldCBwYWNrYWdlSnNvbjogUGFja2FnZUpzb24gPSB7fTtcbiAgICBsZXQgZXNtUGFja2FnZSA9IGZhbHNlO1xuICAgIGlmIChkb2VzQ29udGFpblBhY2thZ2VKc29uKSB7XG4gICAgICBjb25zdCBwYWNrYWdlSnNvblRleHQgPSBmcy5yZWFkRmlsZVN5bmMocGFja2FnZUpzb25QYXRoLCAndXRmOCcpO1xuICAgICAgcGFja2FnZUpzb24gPSBKU09OLnBhcnNlKHBhY2thZ2VKc29uVGV4dCkgYXMgUGFja2FnZUpzb247XG4gICAgICBkZXBlbmRlbmNpZXMgPSBwYWNrYWdlSnNvbi5kZXBlbmRlbmNpZXMgPz8ge307XG4gICAgICBkZXZEZXBlbmRlbmNpZXMgPSBwYWNrYWdlSnNvbi5kZXZEZXBlbmRlbmNpZXMgPz8ge307XG4gICAgICBlc21QYWNrYWdlID0gcGFja2FnZUpzb24udHlwZSA9PT0gJ21vZHVsZSc7XG4gICAgfVxuXG4gICAgbGV0IHJlbGVhc2VCcmFuY2hlczogc3RyaW5nW10gPSBbXTtcbiAgICBsZXQgcmVsZWFzZVBsdWdpbnM6IHN0cmluZ1tdID0gW107XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJlbGVhc2VyY0pzb25QYXRoID0gcGF0aC5yZXNvbHZlKGRpclBhdGgsICcucmVsZWFzZXJjLmpzb24nKTtcbiAgICAgIGNvbnN0IGpzb24gPSBKU09OLnBhcnNlKGF3YWl0IGZzcC5yZWFkRmlsZShyZWxlYXNlcmNKc29uUGF0aCwgJ3V0ZjgnKSkgYXNcbiAgICAgICAgfCB7XG4gICAgICAgICAgICBicmFuY2hlczogc3RyaW5nW107XG4gICAgICAgICAgICBwbHVnaW5zPzogc3RyaW5nW11bXTtcbiAgICAgICAgICB9XG4gICAgICAgIHwgdW5kZWZpbmVkO1xuICAgICAgcmVsZWFzZUJyYW5jaGVzID0ganNvbj8uYnJhbmNoZXMgPz8gW107XG4gICAgICByZWxlYXNlUGx1Z2lucyA9IGpzb24/LnBsdWdpbnM/LmZsYXQoKSA/PyBbXTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIGRvIG5vdGhpbmdcbiAgICB9XG5cbiAgICBjb25zdCBpc1Jvb3QgPVxuICAgICAgcGF0aC5iYXNlbmFtZShwYXRoLnJlc29sdmUoZGlyUGF0aCwgJy4uJykpICE9PSAncGFja2FnZXMnIHx8XG4gICAgICAhZnMuZXhpc3RzU3luYyhwYXRoLnJlc29sdmUoZGlyUGF0aCwgJy4uJywgJy4uJywgJ3BhY2thZ2UuanNvbicpKTtcblxuICAgIGxldCByZXBvSW5mbzogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gfCB1bmRlZmluZWQ7XG4gICAgaWYgKGlzUm9vdCkge1xuICAgICAgcmVwb0luZm8gPSBhd2FpdCBmZXRjaFJlcG9JbmZvKGRpclBhdGgsIHBhY2thZ2VKc29uKTtcbiAgICB9XG5cbiAgICBsZXQgaGFzVmVyc2lvblNldHRpbmdzID0gaGFzVmVyc2lvblNldHRpbmdzRmlsZShkaXJQYXRoKTtcbiAgICBmb3IgKGNvbnN0IHByZWZpeCBvZiBbJ2phdmEnLCAnbm9kZScsICdweXRob24nXSkge1xuICAgICAgaWYgKGZzLmV4aXN0c1N5bmMocGF0aC5yZXNvbHZlKGRpclBhdGgsIGAuJHtwcmVmaXh9LXZlcnNpb25gKSkpIHtcbiAgICAgICAgaGFzVmVyc2lvblNldHRpbmdzID0gdHJ1ZTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuXG4gICAgbGV0IGRvY2tlcmZpbGUgPSAnJztcbiAgICB0cnkge1xuICAgICAgZG9ja2VyZmlsZSA9IGF3YWl0IGZzcC5yZWFkRmlsZShwYXRoLnJlc29sdmUoZGlyUGF0aCwgJ0RvY2tlcmZpbGUnKSwgJ3V0ZjgnKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIGRvIG5vdGhpbmdcbiAgICB9XG5cbiAgICAvLyBSZWFkIHdiZnkuanNvblxuICAgIGNvbnN0IHdiZnlKc29uUGF0aCA9IHBhdGgucmVzb2x2ZShkaXJQYXRoLCAnd2JmeS5qc29uJyk7XG4gICAgbGV0IHdiZnlKc29uOiBXYmZ5SnNvbiB8IHVuZGVmaW5lZDtcbiAgICB0cnkge1xuICAgICAgY29uc3Qgd2JmeUpzb25UZXh0ID0gYXdhaXQgZnNwLnJlYWRGaWxlKHdiZnlKc29uUGF0aCwgJ3V0ZjgnKTtcbiAgICAgIHdiZnlKc29uID0gd2JmeUpzb25TY2hlbWEucGFyc2UoSlNPTi5wYXJzZSh3YmZ5SnNvblRleHQpKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIGRvIG5vdGhpbmdcbiAgICB9XG5cbiAgICBjb25zdCByZXBvRnVsbE5hbWUgPSB0eXBlb2YgcmVwb0luZm8/LmZ1bGxfbmFtZSA9PT0gJ3N0cmluZycgPyByZXBvSW5mby5mdWxsX25hbWUgOiB1bmRlZmluZWQ7XG4gICAgbGV0IHJlcG9BdXRob3I6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgICBsZXQgcmVwb05hbWU6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgICBpZiAocmVwb0Z1bGxOYW1lKSB7XG4gICAgICBjb25zdCByZXBvUGFydHMgPSByZXBvRnVsbE5hbWUuc3BsaXQoJy8nKTtcbiAgICAgIGlmIChyZXBvUGFydHMubGVuZ3RoID49IDIpIHtcbiAgICAgICAgcmVwb0F1dGhvciA9IHJlcG9QYXJ0c1swXTtcbiAgICAgICAgcmVwb05hbWUgPSByZXBvUGFydHNbMV07XG4gICAgICB9XG4gICAgfVxuICAgIGNvbnN0IHJlcG9zaXRvcnkgPSByZXBvRnVsbE5hbWUgPyBgZ2l0aHViOiR7cmVwb0Z1bGxOYW1lfWAgOiB1bmRlZmluZWQ7XG4gICAgY29uc3QgY29uZmlnOiBQYWNrYWdlQ29uZmlnID0ge1xuICAgICAgZGlyUGF0aCxcbiAgICAgIGRvY2tlcmZpbGUsXG4gICAgICBpc1Jvb3QsXG4gICAgICBpc1B1YmxpY1JlcG86IHJlcG9JbmZvPy5wcml2YXRlID09PSBmYWxzZSxcbiAgICAgIGlzUmVmZXJyZWRCeU90aGVyUmVwbzogISFwYWNrYWdlSnNvbi5maWxlcyxcbiAgICAgIHJlcG9zaXRvcnksXG4gICAgICByZXBvQXV0aG9yLFxuICAgICAgcmVwb05hbWUsXG4gICAgICBpc1dpbGxCb29zdGVyUmVwbzogQm9vbGVhbihcbiAgICAgICAgcmVwb3NpdG9yeT8uc3RhcnRzV2l0aCgnZ2l0aHViOldpbGxCb29zdGVyLycpIHx8IHJlcG9zaXRvcnk/LnN0YXJ0c1dpdGgoJ2dpdGh1YjpXaWxsQm9vc3RlckxhYi8nKVxuICAgICAgKSxcbiAgICAgIGlzQnVuOiByb290Q29uZmlnPy5pc0J1biB8fCBmcy5leGlzdHNTeW5jKHBhdGguam9pbihkaXJQYXRoLCAnYnVuLmxvY2snKSksXG4gICAgICBpc0VzbVBhY2thZ2U6IGVzbVBhY2thZ2UsXG4gICAgICBpc1dpbGxCb29zdGVyQ29uZmlnczogcGFja2FnZUpzb25QYXRoLmluY2x1ZGVzKCcvd2lsbGJvb3N0ZXItY29uZmlncycpLFxuICAgICAgZG9lc0NvbnRhaW5TdWJQYWNrYWdlSnNvbnM6IGNvbnRhaW5zQW55KCdwYWNrYWdlcy8qKi9wYWNrYWdlLmpzb24nLCBkaXJQYXRoKSxcbiAgICAgIGRvZXNDb250YWluRG9ja2VyZmlsZTogISFkb2NrZXJmaWxlIHx8IGZzLmV4aXN0c1N5bmMocGF0aC5yZXNvbHZlKGRpclBhdGgsICdkb2NrZXItY29tcG9zZS55bWwnKSksXG4gICAgICBkb2VzQ29udGFpbkdlbWZpbGU6IGZzLmV4aXN0c1N5bmMocGF0aC5yZXNvbHZlKGRpclBhdGgsICdHZW1maWxlJykpLFxuICAgICAgZG9lc0NvbnRhaW5Hb01vZDogZnMuZXhpc3RzU3luYyhwYXRoLnJlc29sdmUoZGlyUGF0aCwgJ2dvLm1vZCcpKSxcbiAgICAgIGRvZXNDb250YWluUGFja2FnZUpzb246IGZzLmV4aXN0c1N5bmMocGF0aC5yZXNvbHZlKGRpclBhdGgsICdwYWNrYWdlLmpzb24nKSksXG4gICAgICBkb2VzQ29udGFpblBvZXRyeUxvY2s6IGZzLmV4aXN0c1N5bmMocGF0aC5yZXNvbHZlKGRpclBhdGgsICdwb2V0cnkubG9jaycpKSxcbiAgICAgIGRvZXNDb250YWluVXZMb2NrOiBmcy5leGlzdHNTeW5jKHBhdGgucmVzb2x2ZShkaXJQYXRoLCAndXYubG9jaycpKSxcbiAgICAgIGRvZXNDb250YWluUG9tWG1sOiBmcy5leGlzdHNTeW5jKHBhdGgucmVzb2x2ZShkaXJQYXRoLCAncG9tLnhtbCcpKSxcbiAgICAgIGRvZXNDb250YWluUHVic3BlY1lhbWw6IGZzLmV4aXN0c1N5bmMocGF0aC5yZXNvbHZlKGRpclBhdGgsICdwdWJzcGVjLnlhbWwnKSksXG4gICAgICBkb2VzQ29udGFpblRlbXBsYXRlWWFtbDogZnMuZXhpc3RzU3luYyhwYXRoLnJlc29sdmUoZGlyUGF0aCwgJ3RlbXBsYXRlLnlhbWwnKSksXG4gICAgICBkb2VzQ29udGFpblZzY29kZVNldHRpbmdzSnNvbjogZnMuZXhpc3RzU3luYyhwYXRoLnJlc29sdmUoZGlyUGF0aCwgJy52c2NvZGUnLCAnc2V0dGluZ3MuanNvbicpKSxcbiAgICAgIGRvZXNDb250YWluSmF2YVNjcmlwdDogY29udGFpbnNBbnkoJ3thcHAsc3JjLHRlc3Qsc2NyaXB0c30vKiovKi57Y2pzLG1qcyxqcyxqc3h9JywgZGlyUGF0aCksXG4gICAgICBkb2VzQ29udGFpblR5cGVTY3JpcHQ6IGNvbnRhaW5zQW55KCd7YXBwLHNyYyx0ZXN0LHNjcmlwdHN9LyoqLyoue2N0cyxtdHMsdHMsdHN4fScsIGRpclBhdGgpLFxuICAgICAgZG9lc0NvbnRhaW5Kc3hPclRzeDogY29udGFpbnNBbnkoJ3thcHAsc3JjLHRlc3R9LyoqLyoue3Qsan1zeCcsIGRpclBhdGgpLFxuICAgICAgZG9lc0NvbnRhaW5KYXZhOiBjb250YWluc0FueSgnKiovKi5qYXZhJywgZGlyUGF0aCksXG4gICAgICBkb2VzQ29udGFpbkphdmFTY3JpcHRJblBhY2thZ2VzOiBjb250YWluc0FueSgncGFja2FnZXMvKiove2FwcCxzcmMsdGVzdCxzY3JpcHRzfS8qKi8qLntjanMsbWpzLGpzLGpzeH0nLCBkaXJQYXRoKSxcbiAgICAgIGRvZXNDb250YWluVHlwZVNjcmlwdEluUGFja2FnZXM6IGNvbnRhaW5zQW55KCdwYWNrYWdlcy8qKi97YXBwLHNyYyx0ZXN0LHNjcmlwdHN9LyoqLyoue2N0cyxtdHMsdHMsdHN4fScsIGRpclBhdGgpLFxuICAgICAgZG9lc0NvbnRhaW5Kc3hPclRzeEluUGFja2FnZXM6IGNvbnRhaW5zQW55KCdwYWNrYWdlcy8qKi97YXBwLHNyYyx0ZXN0fS8qKi8qLnt0LGp9c3gnLCBkaXJQYXRoKSxcbiAgICAgIGRvZXNDb250YWluSmF2YUluUGFja2FnZXM6IGNvbnRhaW5zQW55KCdwYWNrYWdlcy8qKi8qLmphdmEnLCBkaXJQYXRoKSxcbiAgICAgIGRlcGVuZGluZzoge1xuICAgICAgICBibGl0ejogISFkZXBlbmRlbmNpZXMuYmxpdHosXG4gICAgICAgIGZpcmViYXNlOiAhIWRldkRlcGVuZGVuY2llc1snZmlyZWJhc2UtdG9vbHMnXSxcbiAgICAgICAgZ2VuSTE4blRzOiAhIWRlcGVuZGVuY2llc1snZ2VuLWkxOG4tdHMnXSB8fCAhIWRldkRlcGVuZGVuY2llc1snZ2VuLWkxOG4tdHMnXSxcbiAgICAgICAgbGl0ZXN0cmVhbTogZG9ja2VyZmlsZS5pbmNsdWRlcygnaW5zdGFsbC1saXRlc3RyZWFtLnNoJyksXG4gICAgICAgIHJlYWN0OiAhIWRlcGVuZGVuY2llcy5yZWFjdCxcbiAgICAgICAgbmV4dDogISFkZXBlbmRlbmNpZXMubmV4dCxcbiAgICAgICAgcGxheXdyaWdodFRlc3Q6XG4gICAgICAgICAgISFkZXBlbmRlbmNpZXNbJ0BwbGF5d3JpZ2h0L3Rlc3QnXSB8fCAhIWRldkRlcGVuZGVuY2llc1snQHBsYXl3cmlnaHQvdGVzdCddIHx8ICEhZGV2RGVwZW5kZW5jaWVzLnBsYXl3cmlnaHQsXG4gICAgICAgIHByaXNtYTogISFkZXBlbmRlbmNpZXNbJ0BwcmlzbWEvY2xpZW50J10gfHwgISFkZXZEZXBlbmRlbmNpZXMucHJpc21hLFxuICAgICAgICBweXJpZ2h0OiAhIWRldkRlcGVuZGVuY2llcy5weXJpZ2h0LFxuICAgICAgICByZWFjdE5hdGl2ZTogISFkZXBlbmRlbmNpZXNbJ3JlYWN0LW5hdGl2ZSddLFxuICAgICAgICBzZW1hbnRpY1JlbGVhc2U6ICEhKFxuICAgICAgICAgIGRldkRlcGVuZGVuY2llc1snc2VtYW50aWMtcmVsZWFzZSddIHx8XG4gICAgICAgICAgcmVsZWFzZUJyYW5jaGVzLmxlbmd0aCA+IDAgfHxcbiAgICAgICAgICByZWxlYXNlUGx1Z2lucy5sZW5ndGggPiAwXG4gICAgICAgICksXG4gICAgICAgIHN0b3J5Ym9vazogISFkZXZEZXBlbmRlbmNpZXNbJ0BzdG9yeWJvb2svcmVhY3QnXSxcbiAgICAgICAgd2I6ICEhZGVwZW5kZW5jaWVzWydAd2lsbGJvb3N0ZXIvd2InXSB8fCAhIWRldkRlcGVuZGVuY2llc1snQHdpbGxib29zdGVyL3diJ10sXG4gICAgICB9LFxuICAgICAgcmVsZWFzZToge1xuICAgICAgICBicmFuY2hlczogcmVsZWFzZUJyYW5jaGVzLFxuICAgICAgICBnaXRodWI6IHJlbGVhc2VQbHVnaW5zLmluY2x1ZGVzKCdAc2VtYW50aWMtcmVsZWFzZS9naXRodWInKSxcbiAgICAgICAgbnBtOiByZWxlYXNlUGx1Z2lucy5pbmNsdWRlcygnQHNlbWFudGljLXJlbGVhc2UvbnBtJyksXG4gICAgICB9LFxuICAgICAgaGFzVmVyc2lvblNldHRpbmdzLFxuICAgICAgbWlzZVRhc2tzOiBhd2FpdCByZWFkTWlzZVRhc2tzKGRpclBhdGgpLFxuICAgICAgcGFja2FnZUpzb24sXG4gICAgICB3YmZ5SnNvbixcbiAgICB9O1xuICAgIGlmIChcbiAgICAgIGNvbmZpZy5kb2VzQ29udGFpbkdlbWZpbGUgfHxcbiAgICAgIGNvbmZpZy5kb2VzQ29udGFpbkdvTW9kIHx8XG4gICAgICBjb25maWcuZG9lc0NvbnRhaW5QYWNrYWdlSnNvbiB8fFxuICAgICAgY29uZmlnLmRvZXNDb250YWluUG9ldHJ5TG9jayB8fFxuICAgICAgY29uZmlnLmRvZXNDb250YWluVXZMb2NrIHx8XG4gICAgICBjb25maWcuZG9lc0NvbnRhaW5Qb21YbWwgfHxcbiAgICAgIGNvbmZpZy5kb2VzQ29udGFpblB1YnNwZWNZYW1sIHx8XG4gICAgICBjb25maWcuZG9lc0NvbnRhaW5UZW1wbGF0ZVlhbWxcbiAgICApIHtcbiAgICAgIHJldHVybiBjb25maWc7XG4gICAgfVxuICB9IGNhdGNoIHtcbiAgICAvLyBkbyBub3RoaW5nXG4gIH1cbn1cblxuZnVuY3Rpb24gaGFzVmVyc2lvblNldHRpbmdzRmlsZShkaXJQYXRoOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgY29uc3QgY3VycmVudCA9IHBhdGgucmVzb2x2ZShkaXJQYXRoKTtcbiAgcmV0dXJuIChcbiAgICBmcy5leGlzdHNTeW5jKHBhdGguam9pbihjdXJyZW50LCAnbWlzZS50b21sJykpIHx8XG4gICAgZnMuZXhpc3RzU3luYyhwYXRoLmpvaW4oY3VycmVudCwgJy5taXNlLnRvbWwnKSkgfHxcbiAgICBmcy5leGlzdHNTeW5jKHBhdGguam9pbihjdXJyZW50LCAnLnRvb2wtdmVyc2lvbnMnKSlcbiAgKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gcmVhZE1pc2VUYXNrcyhkaXJQYXRoOiBzdHJpbmcpOiBQcm9taXNlPFJlY29yZDxzdHJpbmcsIHN0cmluZz4+IHtcbiAgY29uc3QgdGFza3M6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7fTtcbiAgZm9yIChjb25zdCBmaWxlTmFtZSBvZiBbJ21pc2UudG9tbCcsICcubWlzZS50b21sJ10pIHtcbiAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShkaXJQYXRoLCBmaWxlTmFtZSk7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHNldHRpbmdzID0gdG9tbC5wYXJzZShhd2FpdCBmc3AucmVhZEZpbGUoZmlsZVBhdGgsICd1dGY4JykpIGFzIHsgdGFza3M/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB9O1xuICAgICAgZm9yIChjb25zdCBbbmFtZSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKHNldHRpbmdzLnRhc2tzID8/IHt9KSkge1xuICAgICAgICB0YXNrc1tuYW1lXSA9IHJlYWRNaXNlVGFza0NvbW1hbmQodmFsdWUpO1xuICAgICAgfVxuICAgIH0gY2F0Y2gge1xuICAgICAgLy8gTWlzc2luZyBvciB0ZW1wb3JhcmlseSBpbnZhbGlkIG1pc2UgZmlsZXMgc2hvdWxkIG5vdCBibG9jayBvdGhlciB3YmZ5IGdlbmVyYXRvcnMuXG4gICAgfVxuICB9XG4gIHJldHVybiB0YXNrcztcbn1cblxuZnVuY3Rpb24gcmVhZE1pc2VUYXNrQ29tbWFuZCh2YWx1ZTogdW5rbm93bik6IHN0cmluZyB7XG4gIGlmICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnKSByZXR1cm4gdmFsdWU7XG4gIC8vIFByZXNlcnZlIGFycmF5LWZvcm0gbWlzZSBjb21tYW5kcyBzbyByZWN1cnNpb24gY2hlY2tzIGNhbiBzdGlsbCBzZWUgcGFja2FnZSBzY3JpcHQgY2FsbHMuXG4gIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkgcmV0dXJuIHZhbHVlLmZpbHRlcigoY29tbWFuZCk6IGNvbW1hbmQgaXMgc3RyaW5nID0+IHR5cGVvZiBjb21tYW5kID09PSAnc3RyaW5nJykuam9pbignXFxuJyk7XG4gIGlmICh2YWx1ZSAmJiB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnKSByZXR1cm4gcmVhZE1pc2VUYXNrQ29tbWFuZCgodmFsdWUgYXMgeyBydW4/OiB1bmtub3duIH0pLnJ1bik7XG4gIHJldHVybiAnJztcbn1cblxuZnVuY3Rpb24gY29udGFpbnNBbnkocGF0dGVybjogc3RyaW5nLCBkaXJQYXRoOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgcmV0dXJuIGZnLmdsb2JTeW5jKHBhdHRlcm4sIHsgZG90OiB0cnVlLCBjd2Q6IGRpclBhdGgsIGlnbm9yZTogZ2xvYklnbm9yZSB9KS5sZW5ndGggPiAwO1xufVxuXG5hc3luYyBmdW5jdGlvbiBmZXRjaFJlcG9JbmZvKGRpclBhdGg6IHN0cmluZywgcGFja2FnZUpzb246IFBhY2thZ2VKc29uKTogUHJvbWlzZTxSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB8IHVuZGVmaW5lZD4ge1xuICBjb25zdCBnaXQgPSBzaW1wbGVHaXQoZGlyUGF0aCk7XG4gIGNvbnN0IHJlbW90ZXMgPSBhd2FpdCBnaXQuZ2V0UmVtb3Rlcyh0cnVlKTtcbiAgY29uc3Qgb3JpZ2luID0gcmVtb3Rlcy5maW5kKChyKSA9PiByLm5hbWUgPT09ICdvcmlnaW4nKTtcbiAgY29uc3QgcmVtb3RlVXJsID0gb3JpZ2luPy5yZWZzLmZldGNoID8/IG9yaWdpbj8ucmVmcy5wdXNoO1xuICBpZiAodHlwZW9mIHJlbW90ZVVybCA9PT0gJ3N0cmluZycpIHtcbiAgICBjb25zdCBqc29uID0gYXdhaXQgcmVxdWVzdFJlcG9JbmZvKHJlbW90ZVVybCk7XG4gICAgaWYgKGpzb24pIHJldHVybiBqc29uO1xuICB9XG5cbiAgY29uc3QgdXJsID0gdHlwZW9mIHBhY2thZ2VKc29uLnJlcG9zaXRvcnkgPT09ICdzdHJpbmcnID8gcGFja2FnZUpzb24ucmVwb3NpdG9yeSA6IHBhY2thZ2VKc29uLnJlcG9zaXRvcnk/LnVybDtcbiAgaWYgKHVybCkge1xuICAgIGNvbnN0IGpzb24gPSBhd2FpdCByZXF1ZXN0UmVwb0luZm8odXJsKTtcbiAgICBpZiAoanNvbiAmJiBqc29uLm1lc3NhZ2UgIT09ICdOb3QgRm91bmQnKSByZXR1cm4ganNvbjtcbiAgfVxufVxuXG5hc3luYyBmdW5jdGlvbiByZXF1ZXN0UmVwb0luZm8odXJsT3JGdWxsTmFtZTogc3RyaW5nKTogUHJvbWlzZTxSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB8IHVuZGVmaW5lZD4ge1xuICBjb25zdCBbb3JnLCBuYW1lXSA9IGdpdEh1YlV0aWwuZ2V0T3JnQW5kTmFtZSh1cmxPckZ1bGxOYW1lKTtcbiAgaWYgKCFvcmcgfHwgIW5hbWUpIHJldHVybjtcblxuICB0cnkge1xuICAgIC8vIE1ldGFkYXRhIHBlcm1pc3Npb25cbiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGdldE9jdG9raXQoKS5yZXF1ZXN0KCdHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99Jywge1xuICAgICAgb3duZXI6IG9yZyxcbiAgICAgIHJlcG86IG5hbWUsXG4gICAgfSk7XG4gICAgcmV0dXJuIHJlc3BvbnNlLmRhdGE7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgY29uc3QgcmVkaXJlY3RlZEZ1bGxOYW1lID0gZ2V0UmVkaXJlY3RlZFJlcG9GdWxsTmFtZShlcnJvcik7XG4gICAgaWYgKHJlZGlyZWN0ZWRGdWxsTmFtZSkge1xuICAgICAgcmV0dXJuIHsgZnVsbF9uYW1lOiByZWRpcmVjdGVkRnVsbE5hbWUgfTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gZ2V0UmVkaXJlY3RlZFJlcG9GdWxsTmFtZShlcnJvcjogdW5rbm93bik6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGlmICghZXJyb3IgfHwgdHlwZW9mIGVycm9yICE9PSAnb2JqZWN0JykgcmV0dXJuO1xuXG4gIGNvbnN0IHJlc3BvbnNlID1cbiAgICAncmVzcG9uc2UnIGluIGVycm9yXG4gICAgICA/IChlcnJvciBhcyB7IHJlc3BvbnNlPzogeyBzdGF0dXM/OiBudW1iZXI7IGhlYWRlcnM/OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmcgfCB1bmRlZmluZWQ+IH0gfSkucmVzcG9uc2VcbiAgICAgIDogdW5kZWZpbmVkO1xuICBjb25zdCBzdGF0dXMgPSByZXNwb25zZT8uc3RhdHVzID8/IChlcnJvciBhcyB7IHN0YXR1cz86IG51bWJlciB9KS5zdGF0dXM7XG4gIGlmIChzdGF0dXMgIT09IDMwMSAmJiBzdGF0dXMgIT09IDMwMikgcmV0dXJuO1xuXG4gIGNvbnN0IGxvY2F0aW9uID0gcmVzcG9uc2U/LmhlYWRlcnM/LmxvY2F0aW9uO1xuICBpZiAodHlwZW9mIGxvY2F0aW9uICE9PSAnc3RyaW5nJykgcmV0dXJuO1xuXG4gIGNvbnN0IFtvcmcsIG5hbWVdID0gZ2l0SHViVXRpbC5nZXRPcmdBbmROYW1lKGxvY2F0aW9uKTtcbiAgaWYgKCFvcmcgfHwgIW5hbWUpIHJldHVybjtcblxuICByZXR1cm4gYCR7b3JnfS8ke25hbWV9YDtcbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB7IGlnbm9yZUVycm9yQXN5bmMgfSBmcm9tICdAd2lsbGJvb3N0ZXIvc2hhcmVkLWxpYi9zcmMnO1xuaW1wb3J0IHlhcmdzIGZyb20gJ3lhcmdzJztcblxuaW1wb3J0IHsgZml4TmV4dENvbmZpZ0pzb24gfSBmcm9tICcuL2ZpeGVycy9uZXh0Q29uZmlnLmpzJztcbmltcG9ydCB7IGZpeFBsYXl3cmlnaHRDb25maWcgfSBmcm9tICcuL2ZpeGVycy9wbGF5d3JpZ2h0Q29uZmlnLmpzJztcbmltcG9ydCB7IGZpeFByaXNtYUVudkZpbGVzIH0gZnJvbSAnLi9maXhlcnMvcHJpc21hLmpzJztcbmltcG9ydCB7IGZpeFRlc3REaXJlY3Rvcmllc1VwZGF0aW5nUGFja2FnZUpzb24gfSBmcm9tICcuL2ZpeGVycy90ZXN0RGlyZWN0b3J5LmpzJztcbmltcG9ydCB7IGZpeFR5cGVEZWZpbml0aW9ucyB9IGZyb20gJy4vZml4ZXJzL3R5cGVEZWZpbml0aW9uLmpzJztcbmltcG9ydCB7IGZpeFR5cG9zIH0gZnJvbSAnLi9maXhlcnMvdHlwb3MuanMnO1xuaW1wb3J0IHsgZ2VuZXJhdGVBZ2VudEluc3RydWN0aW9ucyB9IGZyb20gJy4vZ2VuZXJhdG9ycy9hZ2VudHMuanMnO1xuaW1wb3J0IHsgZ2VuZXJhdGVCdW5maWdUb21sIH0gZnJvbSAnLi9nZW5lcmF0b3JzL2J1bmZpZy5qcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZURvY2tlcmlnbm9yZSB9IGZyb20gJy4vZ2VuZXJhdG9ycy9kb2NrZXJpZ25vcmUuanMnO1xuaW1wb3J0IHsgZ2VuZXJhdGVFZGl0b3Jjb25maWcgfSBmcm9tICcuL2dlbmVyYXRvcnMvZWRpdG9yY29uZmlnLmpzJztcbmltcG9ydCB7IGdlbmVyYXRlR2VtaW5pQ29uZmlnIH0gZnJvbSAnLi9nZW5lcmF0b3JzL2dlbWluaUNvbmZpZy5qcyc7XG5pbXBvcnQgeyByZW1vdmVHZW1pbmlTZXR0aW5ncyB9IGZyb20gJy4vZ2VuZXJhdG9ycy9nZW1pbmlTZXR0aW5ncy5qcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZUdpdGF0dHJpYnV0ZXMgfSBmcm9tICcuL2dlbmVyYXRvcnMvZ2l0YXR0cmlidXRlcy5qcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZUdpdGlnbm9yZSB9IGZyb20gJy4vZ2VuZXJhdG9ycy9naXRpZ25vcmUuanMnO1xuaW1wb3J0IHsgZ2VuZXJhdGVJZGVhU2V0dGluZ3MgfSBmcm9tICcuL2dlbmVyYXRvcnMvaWRlYS5qcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZUxlZnRob29rVXBkYXRpbmdQYWNrYWdlSnNvbiB9IGZyb20gJy4vZ2VuZXJhdG9ycy9sZWZ0aG9vay5qcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZUxpbnRzdGFnZWRyYyB9IGZyb20gJy4vZ2VuZXJhdG9ycy9saW50c3RhZ2VkcmMuanMnO1xuaW1wb3J0IHsgZ2VuZXJhdGVQYWNrYWdlSnNvbiB9IGZyb20gJy4vZ2VuZXJhdG9ycy9wYWNrYWdlSnNvbi5qcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZU94Zm10Q29uZmlnIH0gZnJvbSAnLi9nZW5lcmF0b3JzL294Zm10Q29uZmlnLmpzJztcbmltcG9ydCB7IGdlbmVyYXRlT3hsaW50Q29uZmlnIH0gZnJvbSAnLi9nZW5lcmF0b3JzL294bGludENvbmZpZy5qcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZVByZXR0aWVyaWdub3JlIH0gZnJvbSAnLi9nZW5lcmF0b3JzL3ByZXR0aWVyaWdub3JlLmpzJztcbmltcG9ydCB7IGdlbmVyYXRlUHlyaWdodENvbmZpZ0pzb24gfSBmcm9tICcuL2dlbmVyYXRvcnMvcHlyaWdodENvbmZpZy5qcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZVJlYWRtZSB9IGZyb20gJy4vZ2VuZXJhdG9ycy9yZWFkbWUuanMnO1xuaW1wb3J0IHsgZ2VuZXJhdGVSZWxlYXNlcmMgfSBmcm9tICcuL2dlbmVyYXRvcnMvcmVsZWFzZXJjLmpzJztcbmltcG9ydCB7IGdlbmVyYXRlUmVub3ZhdGVKc29uIH0gZnJvbSAnLi9nZW5lcmF0b3JzL3Jlbm92YXRlSnNvbi5qcyc7XG5pbXBvcnQgeyBpbnN0YWxsQWdlbnRTa2lsbHMgfSBmcm9tICcuL2dlbmVyYXRvcnMvc2tpbGxzLmpzJztcbmltcG9ydCB7IGdlbmVyYXRlVHNjb25maWcgfSBmcm9tICcuL2dlbmVyYXRvcnMvdHNjb25maWcuanMnO1xuaW1wb3J0IHsgZ2VuZXJhdGVWc2NvZGVTZXR0aW5ncyB9IGZyb20gJy4vZ2VuZXJhdG9ycy92c2NvZGVTZXR0aW5ncy5qcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZVdvcmtmbG93cywgaXNSZXVzYWJsZVdvcmtmbG93c1JlcG8gfSBmcm9tICcuL2dlbmVyYXRvcnMvd29ya2Zsb3cuanMnO1xuaW1wb3J0IHsgZ2VuZXJhdGVZYXJucmNZbWwgfSBmcm9tICcuL2dlbmVyYXRvcnMveWFybnJjLmpzJztcbmltcG9ydCB7IHNldHVwTGFiZWxzIH0gZnJvbSAnLi9naXRodWIvbGFiZWwuanMnO1xuaW1wb3J0IHsgc2V0dXBTZWNyZXRzIH0gZnJvbSAnLi9naXRodWIvc2VjcmV0LmpzJztcbmltcG9ydCB7IHNldHVwR2l0SHViU2V0dGluZ3MgfSBmcm9tICcuL2dpdGh1Yi9zZXR0aW5ncy5qcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZUdpdEh1YlRlbXBsYXRlcyB9IGZyb20gJy4vZ2l0aHViL3RlbXBsYXRlLmpzJztcbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4vbG9nZ2VyLmpzJztcbmltcG9ydCB7IG9wdGlvbnMgfSBmcm9tICcuL29wdGlvbnMuanMnO1xuaW1wb3J0IHsgZ2V0UGFja2FnZUNvbmZpZyB9IGZyb20gJy4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBkb2VzQ29udGFpbkpzT3JUcyB9IGZyb20gJy4vdXRpbHMvcGFja2FnZUNhcGFiaWxpdGllcy5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuaW1wb3J0IHsgc3Bhd25TeW5jLCBzcGF3blN5bmNBbmRSZXR1cm5TdGF0dXMgfSBmcm9tICcuL3V0aWxzL3NwYXduVXRpbC5qcyc7XG5cbmFzeW5jIGZ1bmN0aW9uIG1haW4oKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IGFyZ3YgPSBhd2FpdCB5YXJncyhwcm9jZXNzLmFyZ3Yuc2xpY2UoMikpXG4gICAgLmNvbW1hbmQoJyQwIFtwYXRocy4uXScsICdNYWtlIGEgZ2l2ZW4gcHJvamVjdCBmb2xsb3cgdGhlIFdpbGxCb29zdGVyIHN0YW5kYXJkJywgKHlhcmdzKSA9PiB7XG4gICAgICB5YXJncy5wb3NpdGlvbmFsKCdwYXRocycsIHtcbiAgICAgICAgZGVzY3JpYmU6ICdwcm9qZWN0IHBhdGhzIHRvIGJlIHdiZmllZCcsXG4gICAgICAgIGFycmF5OiB0cnVlLFxuICAgICAgICB0eXBlOiAnc3RyaW5nJyxcbiAgICAgICAgZGVmYXVsdDogWycuJ10sXG4gICAgICB9KTtcbiAgICB9KVxuICAgIC5vcHRpb25zKHtcbiAgICAgIGVudjoge1xuICAgICAgICBkZXNjcmlwdGlvbjogJ1VwbG9hZCBlbnZpcm9ubWVudCB2YXJpYWJsZXMgYXMgc2VjcmV0cyB0byBHaXRIdWInLFxuICAgICAgICB0eXBlOiAnYm9vbGVhbicsXG4gICAgICAgIGRlZmF1bHQ6IGZhbHNlLFxuICAgICAgICBhbGlhczogJ2UnLFxuICAgICAgfSxcbiAgICAgIHNraXBEZXBzOiB7XG4gICAgICAgIGRlc2NyaXB0aW9uOiAnU2tpcCBkZXBlbmRlbmN5IGluc3RhbGxhdGlvbicsXG4gICAgICAgIHR5cGU6ICdib29sZWFuJyxcbiAgICAgICAgZGVmYXVsdDogZmFsc2UsXG4gICAgICAgIGFsaWFzOiAnZCcsXG4gICAgICB9LFxuICAgICAgdmVyYm9zZToge1xuICAgICAgICBkZXNjcmlwdGlvbjogJ1doZXRoZXIgb3Igbm90IHRvIGVuYWJsZSB2ZXJib3NlIG1vZGUnLFxuICAgICAgICB0eXBlOiAnYm9vbGVhbicsXG4gICAgICAgIGRlZmF1bHQ6IGZhbHNlLFxuICAgICAgICBhbGlhczogJ3YnLFxuICAgICAgfSxcbiAgICB9KVxuICAgIC52ZXJzaW9uKGdldFZlcnNpb24oKSlcbiAgICAuc3RyaWN0KCkuYXJndjtcbiAgb3B0aW9ucy5pc1ZlcmJvc2UgPSBhcmd2LnZlcmJvc2U7XG4gIG9wdGlvbnMuZG9lc1VwbG9hZEVudlZhcnMgPSBhcmd2LmVudjtcblxuICBsZXQgaGFzSW52YWxpZFBhY2thZ2VDb25maWcgPSBmYWxzZTtcbiAgZm9yIChjb25zdCByb290RGlyUGF0aCBvZiBhcmd2LnBhdGhzIGFzIHN0cmluZ1tdKSB7XG4gICAgY29uc3QgcGFja2FnZXNEaXJQYXRoID0gcGF0aC5qb2luKHJvb3REaXJQYXRoLCAncGFja2FnZXMnKTtcbiAgICBjb25zdCBkaXJlbnRzID0gKGF3YWl0IGlnbm9yZUVycm9yQXN5bmMoKCkgPT4gZnMucHJvbWlzZXMucmVhZGRpcihwYWNrYWdlc0RpclBhdGgsIHsgd2l0aEZpbGVUeXBlczogdHJ1ZSB9KSkpID8/IFtdO1xuICAgIGNvbnN0IHN1YkRpclBhdGhzID0gZGlyZW50cy5maWx0ZXIoKGQpID0+IGQuaXNEaXJlY3RvcnkoKSkubWFwKChkKSA9PiBwYXRoLmpvaW4ocGFja2FnZXNEaXJQYXRoLCBkLm5hbWUpKTtcblxuICAgIGF3YWl0IGZpeFRlc3REaXJlY3Rvcmllc1VwZGF0aW5nUGFja2FnZUpzb24oW3Jvb3REaXJQYXRoLCAuLi5zdWJEaXJQYXRoc10pO1xuXG4gICAgY29uc3Qgcm9vdENvbmZpZyA9IGF3YWl0IGdldFBhY2thZ2VDb25maWcocm9vdERpclBhdGgpO1xuICAgIGlmIChvcHRpb25zLmlzVmVyYm9zZSkge1xuICAgICAgY29uc29sZS5sb2coJ3Jvb3RDb25maWc6Jywgcm9vdENvbmZpZyk7XG4gICAgfVxuICAgIGlmICghcm9vdENvbmZpZykge1xuICAgICAgY29uc29sZS5lcnJvcihgdGhlcmUgaXMgbm8gdmFsaWQgcGFja2FnZS5qc29uIGluICR7cm9vdERpclBhdGh9YCk7XG4gICAgICBoYXNJbnZhbGlkUGFja2FnZUNvbmZpZyA9IHRydWU7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgY29uc3QgYWJicmV2aWF0aW9uUHJvbWlzZSA9IGZpeFR5cG9zKHJvb3RDb25maWcpO1xuXG4gICAgY29uc3QgbnVsbGFibGVTdWJQYWNrYWdlQ29uZmlncyA9IGF3YWl0IFByb21pc2UuYWxsKFxuICAgICAgc3ViRGlyUGF0aHMubWFwKChzdWJEaXJQYXRoKSA9PiBnZXRQYWNrYWdlQ29uZmlnKHN1YkRpclBhdGgsIHJvb3RDb25maWcpKVxuICAgICk7XG4gICAgY29uc3Qgc3ViUGFja2FnZUNvbmZpZ3MgPSBudWxsYWJsZVN1YlBhY2thZ2VDb25maWdzLmZpbHRlcigoY29uZmlnKSA9PiAhIWNvbmZpZyk7XG4gICAgY29uc3QgYWxsUGFja2FnZUNvbmZpZ3MgPSBbcm9vdENvbmZpZywgLi4uc3ViUGFja2FnZUNvbmZpZ3NdO1xuXG4gICAgaWYgKG9wdGlvbnMuaXNWZXJib3NlKSB7XG4gICAgICBmb3IgKGNvbnN0IGNvbmZpZyBvZiBhbGxQYWNrYWdlQ29uZmlncykge1xuICAgICAgICBjb25zb2xlLmluZm8oY29uZmlnKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBJbnN0YWxsIHlhcm4gYmVycnlcbiAgICBhd2FpdCBnZW5lcmF0ZVlhcm5yY1ltbChyb290Q29uZmlnKTtcbiAgICBpZiAocm9vdENvbmZpZy5pc0J1bikge1xuICAgICAgYXdhaXQgZ2VuZXJhdGVCdW5maWdUb21sKHJvb3RDb25maWcpO1xuICAgIH1cblxuICAgIGNvbnN0IHNob3VsZFJ1bldvcmtmbG93cyA9XG4gICAgICAhaXNSZXVzYWJsZVdvcmtmbG93c1JlcG8ocm9vdENvbmZpZy5yZXBvc2l0b3J5KSAmJlxuICAgICAgKHJvb3RDb25maWcucmVwb3NpdG9yeT8uc3RhcnRzV2l0aCgnZ2l0aHViOldpbGxCb29zdGVyLycpIHx8XG4gICAgICAgIHJvb3RDb25maWcucmVwb3NpdG9yeT8uc3RhcnRzV2l0aCgnZ2l0aHViOldpbGxCb29zdGVyTGFiLycpKTtcbiAgICBhd2FpdCBQcm9taXNlLmFsbChbXG4gICAgICBmaXhQcmlzbWFFbnZGaWxlcyhyb290Q29uZmlnKSxcbiAgICAgIGFiYnJldmlhdGlvblByb21pc2UudGhlbigoKSA9PiBnZW5lcmF0ZVJlYWRtZShyb290Q29uZmlnKSksXG4gICAgICBnZW5lcmF0ZUFnZW50SW5zdHJ1Y3Rpb25zKHJvb3RDb25maWcsIGFsbFBhY2thZ2VDb25maWdzKSxcbiAgICAgIGdlbmVyYXRlRG9ja2VyaWdub3JlKHJvb3RDb25maWcpLFxuICAgICAgZ2VuZXJhdGVFZGl0b3Jjb25maWcocm9vdENvbmZpZyksXG4gICAgICBnZW5lcmF0ZUdlbWluaUNvbmZpZyhyb290Q29uZmlnLCBhbGxQYWNrYWdlQ29uZmlncyksXG4gICAgICByZW1vdmVHZW1pbmlTZXR0aW5ncyhyb290Q29uZmlnKSxcbiAgICAgIGdlbmVyYXRlR2l0YXR0cmlidXRlcyhyb290Q29uZmlnKSxcbiAgICAgIGdlbmVyYXRlR2l0SHViVGVtcGxhdGVzKHJvb3RDb25maWcpLFxuICAgICAgZ2VuZXJhdGVJZGVhU2V0dGluZ3Mocm9vdENvbmZpZyksXG4gICAgICBnZW5lcmF0ZVJlbm92YXRlSnNvbihyb290Q29uZmlnKSxcbiAgICAgIGdlbmVyYXRlUmVsZWFzZXJjKHJvb3RDb25maWcpLFxuICAgICAgLi4uKHNob3VsZFJ1bldvcmtmbG93cyA/IFtnZW5lcmF0ZVdvcmtmbG93cyhyb290Q29uZmlnKV0gOiBbXSksXG4gICAgICBzZXR1cExhYmVscyhyb290Q29uZmlnKSxcbiAgICAgIHNldHVwU2VjcmV0cyhyb290Q29uZmlnKSxcbiAgICAgIHNldHVwR2l0SHViU2V0dGluZ3Mocm9vdENvbmZpZyksXG4gICAgICBnZW5lcmF0ZUxlZnRob29rVXBkYXRpbmdQYWNrYWdlSnNvbihyb290Q29uZmlnKSxcbiAgICAgIGdlbmVyYXRlTGludHN0YWdlZHJjKHJvb3RDb25maWcpLFxuICAgIF0pO1xuICAgIGF3YWl0IHByb21pc2VQb29sLnByb21pc2VBbGwoKTtcblxuICAgIGNvbnN0IHByb21pc2VzOiBQcm9taXNlPHZvaWQ+W10gPSBbXTtcbiAgICBmb3IgKGNvbnN0IGNvbmZpZyBvZiBhbGxQYWNrYWdlQ29uZmlncykge1xuICAgICAgaWYgKGNvbmZpZy5kb2VzQ29udGFpblR5cGVTY3JpcHQgfHwgY29uZmlnLmRvZXNDb250YWluVHlwZVNjcmlwdEluUGFja2FnZXMpIHtcbiAgICAgICAgcHJvbWlzZXMucHVzaChmaXhUeXBlRGVmaW5pdGlvbnMoY29uZmlnLCBjb25maWcuaXNSb290ID8gYWxsUGFja2FnZUNvbmZpZ3MgOiBbY29uZmlnXSkpO1xuICAgICAgfVxuICAgICAgaWYgKGNvbmZpZy5kZXBlbmRpbmcucGxheXdyaWdodFRlc3QpIHtcbiAgICAgICAgcHJvbWlzZXMucHVzaChmaXhQbGF5d3JpZ2h0Q29uZmlnKGNvbmZpZykpO1xuICAgICAgfVxuICAgICAgaWYgKGNvbmZpZy5kZXBlbmRpbmcubmV4dCkge1xuICAgICAgICBwcm9taXNlcy5wdXNoKGZpeE5leHRDb25maWdKc29uKGNvbmZpZykpO1xuICAgICAgfVxuICAgICAgYXdhaXQgZ2VuZXJhdGVHaXRpZ25vcmUoY29uZmlnLCByb290Q29uZmlnKTtcbiAgICAgIGF3YWl0IHByb21pc2VQb29sLnByb21pc2VBbGwoKTtcbiAgICAgIGlmICghY29uZmlnLmlzUm9vdCAmJiAhY29uZmlnLmRvZXNDb250YWluUGFja2FnZUpzb24pIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBhd2FpdCBnZW5lcmF0ZVByZXR0aWVyaWdub3JlKGNvbmZpZyk7XG4gICAgICBhd2FpdCBnZW5lcmF0ZVBhY2thZ2VKc29uKGNvbmZpZywgcm9vdENvbmZpZywgYXJndi5za2lwRGVwcyk7XG5cbiAgICAgIHByb21pc2VzLnB1c2goZ2VuZXJhdGVMaW50c3RhZ2VkcmMoY29uZmlnKSk7XG4gICAgICBpZiAoY29uZmlnLmRvZXNDb250YWluVnNjb2RlU2V0dGluZ3NKc29uICYmIGNvbmZpZy5kb2VzQ29udGFpblBhY2thZ2VKc29uKSB7XG4gICAgICAgIHByb21pc2VzLnB1c2goZ2VuZXJhdGVWc2NvZGVTZXR0aW5ncyhjb25maWcpKTtcbiAgICAgIH1cbiAgICAgIGlmIChjb25maWcuZG9lc0NvbnRhaW5UeXBlU2NyaXB0IHx8IGNvbmZpZy5kb2VzQ29udGFpblR5cGVTY3JpcHRJblBhY2thZ2VzKSB7XG4gICAgICAgIHByb21pc2VzLnB1c2goZ2VuZXJhdGVUc2NvbmZpZyhjb25maWcpKTtcbiAgICAgIH1cbiAgICAgIGlmIChkb2VzQ29udGFpbkpzT3JUcyhjb25maWcpKSB7XG4gICAgICAgIHByb21pc2VzLnB1c2goZ2VuZXJhdGVPeGZtdENvbmZpZyhjb25maWcpKTtcbiAgICAgICAgcHJvbWlzZXMucHVzaChnZW5lcmF0ZU94bGludENvbmZpZyhjb25maWcsIHJvb3RDb25maWcpKTtcbiAgICAgIH1cbiAgICAgIGlmIChjb25maWcuZGVwZW5kaW5nLnB5cmlnaHQpIHtcbiAgICAgICAgcHJvbWlzZXMucHVzaChnZW5lcmF0ZVB5cmlnaHRDb25maWdKc29uKGNvbmZpZykpO1xuICAgICAgfVxuICAgIH1cbiAgICBhd2FpdCBQcm9taXNlLmFsbChwcm9taXNlcyk7XG4gICAgYXdhaXQgcHJvbWlzZVBvb2wucHJvbWlzZUFsbCgpO1xuXG4gICAgY29uc3QgcGFja2FnZU1hbmFnZXIgPSByb290Q29uZmlnLmlzQnVuID8gJ2J1bicgOiAneWFybic7XG4gICAgLy8gUmVmcmVzaCBsb2NrIGZpbGVzXG4gICAgaWYgKHJvb3RDb25maWcuaXNCdW4pIHtcbiAgICAgIGF3YWl0IGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdyZWZyZXNoQnVuTG9jaycsIGFzeW5jICgpID0+IHtcbiAgICAgICAgYXdhaXQgUHJvbWlzZS5yZXNvbHZlKCk7XG4gICAgICAgIHJlZnJlc2hCdW5Mb2NrKHJvb3REaXJQYXRoKTtcbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICBzcGF3blN5bmMocGFja2FnZU1hbmFnZXIsIFsnaW5zdGFsbCcsICctLW5vLWltbXV0YWJsZSddLCByb290RGlyUGF0aCk7XG4gICAgfVxuICAgIHNwYXduU3luYyhwYWNrYWdlTWFuYWdlciwgWydjbGVhbnVwJ10sIHJvb3REaXJQYXRoKTtcblxuICAgIGF3YWl0IGluc3RhbGxBZ2VudFNraWxscyhyb290Q29uZmlnKTtcbiAgfVxuICBpZiAoaGFzSW52YWxpZFBhY2thZ2VDb25maWcpIHtcbiAgICBwcm9jZXNzLmV4aXRDb2RlID0gMTtcbiAgfVxufVxuXG5mdW5jdGlvbiByZWZyZXNoQnVuTG9jayhyb290RGlyUGF0aDogc3RyaW5nKTogdm9pZCB7XG4gIC8vIHdiZnkgc2hvdWxkIHVwZGF0ZSBvbmx5IHRoZSBwYWNrYWdlcyBpdCBleHBsaWNpdGx5IG1hbmFnZXMgdGhyb3VnaCBidW4gYWRkLlxuICAvLyBSdW5uaW5nIGJ1biB1cGRhdGUgaGVyZSByZWZyZXNoZXMgdW5yZWxhdGVkIGFwcGxpY2F0aW9uIGRlcGVuZGVuY2llcyBhbmRcbiAgLy8gY2FuIGNoYW5nZSBwcm9kdWN0IGJlaGF2aW9yLCBzbyBrZWVwIHRoZSBleGlzdGluZyBsb2NrIGFuZCByZWNvbmNpbGUgaXQuXG4gIGNvbnN0IHN0YXR1cyA9IHNwYXduU3luY0FuZFJldHVyblN0YXR1cygnYnVuJywgWydpbnN0YWxsJ10sIHJvb3REaXJQYXRoKTtcbiAgaWYgKHN0YXR1cyAhPT0gMCkge1xuICAgIHRocm93IG5ldyBFcnJvcihgRmFpbGVkIHRvIHJlZnJlc2ggQnVuIGxvY2tmaWxlOiBidW4gaW5zdGFsbCBleGl0ZWQgd2l0aCBzdGF0dXMgJHtzdGF0dXN9YCk7XG4gIH1cbn1cblxuZnVuY3Rpb24gZ2V0VmVyc2lvbigpOiBzdHJpbmcge1xuICBsZXQgcGFja2FnZUpzb25EaXIgPSBwYXRoLmRpcm5hbWUobmV3IFVSTChpbXBvcnQubWV0YS51cmwpLnBhdGhuYW1lKTtcbiAgd2hpbGUgKCFmcy5leGlzdHNTeW5jKHBhdGguam9pbihwYWNrYWdlSnNvbkRpciwgJ3BhY2thZ2UuanNvbicpKSkge1xuICAgIHBhY2thZ2VKc29uRGlyID0gcGF0aC5kaXJuYW1lKHBhY2thZ2VKc29uRGlyKTtcbiAgfVxuICBjb25zdCBwYWNrYWdlSnNvbiA9IEpTT04ucGFyc2UoZnMucmVhZEZpbGVTeW5jKHBhdGguam9pbihwYWNrYWdlSnNvbkRpciwgJ3BhY2thZ2UuanNvbicpLCAndXRmOCcpKSBhcyB7XG4gICAgdmVyc2lvbjogc3RyaW5nO1xuICB9O1xuICByZXR1cm4gcGFja2FnZUpzb24udmVyc2lvbjtcbn1cblxuYXdhaXQgbWFpbigpO1xuIl0sIm5hbWVzIjpbImFzeW5jIiwic2xlZXAiLCJtaWxsaXNlY29uZHMiLCJQcm9taXNlIiwicmVzb2x2ZSIsInNldFRpbWVvdXQiLCJpZ25vcmVFcnJvckFzeW5jIiwiZm4iLCJpZ25vcmVFbm9lbnRBc3luYyIsImVycm9yIiwiY29kZSIsIm9wdGlvbnMiLCJpc1ZlcmJvc2UiLCJkb2VzVXBsb2FkRW52VmFycyIsImxvZ2dlciIsImZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24iLCJuYW1lIiwiZnVuYyIsImNvbnNvbGUiLCJpbmZvIiwiRXJyb3IiLCJzdGFjayIsIlN0cmluZyIsImZzVXRpbCIsInJlYWRGaWxlSWdub3JpbmdFcnJvciIsImZpbGVQYXRoIiwiZnMiLCJwcm9taXNlcyIsInJlYWRGaWxlIiwiZ2VuZXJhdGVGaWxlIiwiY29udGVudCIsIm1rZGlyIiwicGF0aCIsImRpcm5hbWUiLCJyZWN1cnNpdmUiLCJub3JtYWxpemVkQ29udGVudCIsInRyaW0iLCJ3cml0ZUZpbGUiLCJwcm9taXNlUG9vbCIsIlByb21pc2VQb29sIiwiZml4TmV4dENvbmZpZ0pzb24iLCJjb25maWciLCJtYXAiLCJleHQiLCJkaXJQYXRoIiwiZmluZCIsInAiLCJleGlzdHNTeW5jIiwib2xkQ29udGVudCIsIm9iamVjdExpdGVyYWwiLCJzb3VyY2UiLCJ0cyIsImNyZWF0ZVNvdXJjZUZpbGUiLCJTY3JpcHRUYXJnZXQiLCJMYXRlc3QiLCJTY3JpcHRLaW5kIiwiSlMiLCJ2aXNpdCIsIm5vZGUiLCJpc0V4cG9ydEFzc2lnbm1lbnQiLCJpc09iamVjdExpdGVyYWxFeHByZXNzaW9uIiwiZXhwcmVzc2lvbiIsImlzQmluYXJ5RXhwcmVzc2lvbiIsIm9wZXJhdG9yVG9rZW4iLCJraW5kIiwiU3ludGF4S2luZCIsIkVxdWFsc1Rva2VuIiwibGVmdCIsImdldFRleHQiLCJyaWdodCIsImZvckVhY2hDaGlsZCIsImdldE5leHRDb25maWdPYmplY3RMaXRlcmFsIiwicHJvcGVydHlUZXh0cyIsIlNldCIsInByb3BlcnRpZXMiLCJwcm9wZXJ0eSIsImhhcyIsInB1c2giLCJsZW5ndGgiLCJpbnNlcnRpb25Qb2ludCIsImdldEVuZCIsImxhc3RQcm9wZXJ0eSIsImF0IiwiaGFzVHJhaWxpbmdDb21tYSIsInNsaWNlIiwiaW5jbHVkZXMiLCJwcmVmaXgiLCJuZXdDb250ZW50Iiwiam9pbiIsInJ1biIsImRvZXNDb250YWluSnNPclRzIiwiZG9lc0NvbnRhaW5KYXZhU2NyaXB0IiwiZG9lc0NvbnRhaW5KYXZhU2NyaXB0SW5QYWNrYWdlcyIsImRvZXNDb250YWluVHlwZVNjcmlwdCIsImRvZXNDb250YWluVHlwZVNjcmlwdEluUGFja2FnZXMiLCJkb2VzQ29udGFpbkphdmEiLCJkb2VzQ29udGFpbkphdmFJblBhY2thZ2VzIiwiZ2V0UGFja2FnZU1hbmFnZXJDb21tYW5kIiwiaXNCdW4iLCJsaXRlcmFsIiwidmFsdWUiLCJhc09iamVjdCIsImV4dHJhTWVtYmVycyIsInRvUGFyc2VkT2JqZWN0IiwibWVtYmVyT3JkZXIiLCJPYmplY3QiLCJrZXlzIiwia2V5IiwiXyIsImluZGV4IiwiZml4UGxheXdyaWdodENvbmZpZyIsImVudkZpbGVQYXRoIiwiZW52RmlsZU5hbWVzIiwiZW52RmlsZVBhdGhzIiwiY3VycmVudERpclBhdGgiLCJmaWxlTmFtZSIsImdldEVudkZpbGVQYXRocyIsInRlc3QiLCJhc3NlcnROZXh0UHVibGljQmFzZVVybCIsImV4dHJhY3RlZE9iamVjdExpdGVyYWwiLCJUUyIsImZvdW5kIiwiaXNDYWxsRXhwcmVzc2lvbiIsImZpcnN0QXJndW1lbnQiLCJhcmd1bWVudHMiLCJ1bmRlZmluZWQiLCJleHRyYWN0RGVmaW5lQ29uZmlnT2JqZWN0TGl0ZXJhbCIsInBhcnNlZCIsInBhcnNlT2JqZWN0TGl0ZXJhbEV4cHJlc3Npb24iLCJtZXJnZWQiLCJtZXJnZVBhcnNlZE9iamVjdHMiLCJmb3JiaWRPbmx5IiwicmV0cmllcyIsInVzZSIsImJhc2VVUkwiLCJ0cmFjZSIsInNjcmVlbnNob3QiLCJ2aWRlbyIsIndlYlNlcnZlciIsImNvbW1hbmQiLCJnZXRXYlN0YXJ0VGVzdENvbW1hbmQiLCJ1cmwiLCJyZXVzZUV4aXN0aW5nU2VydmVyIiwidGltZW91dCIsInN0ZG91dCIsInN0ZGVyciIsImVudiIsImdyYWNlZnVsU2h1dGRvd24iLCJjcmVhdGVEZWZhdWx0Q29uZmlnIiwib2JqZWN0Iiwic2V0V2ViU2VydmVyQ29tbWFuZCIsIm5ld09iamVjdExpdGVyYWwiLCJzdHJpbmdpZnlWYWx1ZSIsInN0YXJ0IiwiZ2V0U3RhcnQiLCJlbmQiLCJiYXNlIiwib3ZlcnJpZGUiLCJvdmVycmlkZVByb3BlcnR5S2V5cyIsImZpbHRlciIsIm1lbWJlciIsImVudHJpZXMiLCJtZXJnZVBhcnNlZFZhbHVlIiwicGFyc2VFeHByZXNzaW9uIiwicGFyc2VkT2JqZWN0IiwiaXNBcnJheUxpdGVyYWxFeHByZXNzaW9uIiwiZWxlbWVudHMiLCJlbGVtZW50Iiwic29tZSIsImlzU2hvcnRoYW5kUHJvcGVydHlBc3NpZ25tZW50IiwiaXNQcm9wZXJ0eUFzc2lnbm1lbnQiLCJpc0lkZW50aWZpZXIiLCJpc1N0cmluZ0xpdGVyYWwiLCJpbml0aWFsaXplciIsImxldmVsIiwiY2xvc2luZ0luZGVudCIsInJlcGVhdCIsImluZGVudCIsIml0ZW0iLCJzdHJpbmdpZmllZCIsInNwbGl0IiwiZW1pdHRlZFByb3BlcnRpZXMiLCJsYXN0UHJvcGVydHlJbmRleEJ5S2V5IiwiTWFwIiwic2V0IiwiZ2V0TGFzdFByb3BlcnR5SW5kZXhCeUtleSIsImxpbmVzIiwiZmxhdE1hcCIsInN0cmluZ2lmeU9iamVjdE1lbWJlciIsImdldCIsImFkZCIsInN0cmluZ2lmeU9iamVjdFByb3BlcnR5IiwibGluZSIsImdsb2JJZ25vcmUiLCJmaXhQcmlzbWFFbnZGaWxlcyIsInNob3VsZEFkZENvbm5lY3Rpb25MaW1pdCIsImRlcGVuZGluZyIsInByaXNtYSIsImRlcGVuZGVuY2llcyIsInBhY2thZ2VKc29uIiwiZGV2RGVwZW5kZW5jaWVzIiwic2hvdWxkQWRkU3FsaXRlQ29ubmVjdGlvbkxpbWl0IiwiZW52RmlsZXMiLCJmZyIsImdsb2IiLCJkb3QiLCJjd2QiLCJpZ25vcmUiLCJlbnZGaWxlIiwicmVwbGFjZUFsbCIsIm1hdGNoIiwibm9ybWFsaXplU3FsaXRlRGF0YWJhc2VVcmwiLCJxdWVyeVN0YXJ0IiwiaW5kZXhPZiIsInBhdGhQYXJ0IiwicXVlcnlQYXJ0IiwicGFyYW1zIiwiVVJMU2VhcmNoUGFyYW1zIiwiZGVsZXRlIiwibm9ybWFsaXplZFF1ZXJ5IiwidG9TdHJpbmciLCJwcm90b3R5cGUiLCJoYXNPd25Qcm9wZXJ0eSIsImNhbGwiLCJzb3J0T2JqZWN0QnlLZXlOYW1lTGlzdCIsInNvcnRXaXRoIiwic29ydEZuIiwidG90YWwiLCJvYmplY3RLZXlzIiwic29ydCIsIklOREVOVF9SRUdFWCIsIklOREVOVF9UWVBFX1NQQUNFIiwic2hvdWxkSWdub3JlU2luZ2xlU3BhY2UiLCJpZ25vcmVTaW5nbGVTcGFjZXMiLCJpbmRlbnRUeXBlIiwibWFrZUluZGVudHNNYXAiLCJzdHJpbmciLCJpbmRlbnRzIiwicHJldmlvdXNJbmRlbnRUeXBlIiwicHJldmlvdXNTaXplIiwibWF0Y2hlcyIsIndlaWdodCIsImluZGVudERpZmZlcmVuY2UiLCJhYnNvbHV0ZUluZGVudERpZmZlcmVuY2UiLCJNYXRoIiwiYWJzIiwiZW5jb2RlSW5kZW50c0tleSIsImVudHJ5IiwiaW5kZW50QW1vdW50IiwiZGV0ZWN0SW5kZW50IiwiVHlwZUVycm9yIiwic2l6ZSIsImtleU9mTW9zdFVzZWRJbmRlbnQiLCJyZXN1bHQiLCJtYXhVc2VkIiwibWF4V2VpZ2h0IiwidXNlZENvdW50IiwiZ2V0TW9zdFVzZWRLZXkiLCJ0eXBlIiwiYW1vdW50IiwiaW5kZW50c0tleSIsIk51bWJlciIsIm1ha2VJbmRlbnRTdHJpbmciLCJkZXRlY3ROZXdsaW5lR3JhY2VmdWwiLCJuZXdsaW5lcyIsImNybGYiLCJuZXdsaW5lIiwiZGV0ZWN0TmV3bGluZSIsInBpcGUiLCJmbnMiLCJ4IiwiYXJncyIsInJlZHVjZSIsIm9uQXJyYXkiLCJBcnJheSIsImlzQXJyYXkiLCJvblN0cmluZ0FycmF5IiwiZXZlcnkiLCJ1bmlxIiwieHMiLCJzb3J0QXJyYXkiLCJhcnJheSIsInRvU29ydGVkIiwidW5pcUFuZFNvcnRBcnJheSIsIm9uT2JqZWN0IiwiZ2V0UHJvdG90eXBlT2YiLCJTeW1ib2wiLCJ0b1N0cmluZ1RhZyIsIml0ZXJhdG9yIiwiaXNQbGFpbk9iamVjdCIsInNvcnRPYmplY3RCeSIsImNvbXBhcmF0b3IiLCJkZWVwIiwib3ZlciIsImZyb21FbnRyaWVzIiwic29ydE9iamVjdEtleXMiLCJvYmplY3RHcm91cEJ5IiwiZ3JvdXBCeSIsImNhbGxiYWNrIiwiY3JlYXRlIiwic29ydE9iamVjdCIsInNvcnRVUkxPYmplY3QiLCJzb3J0UGVvcGxlT2JqZWN0Iiwic29ydERpcmVjdG9yaWVzIiwib3ZlclByb3BlcnR5IiwiaGFzT3duIiwic29ydEdpdEhvb2tzIiwicGFyc2VOYW1lQW5kVmVyc2lvblJhbmdlIiwic3BlY2lmaWVyIiwibmFtZUFuZFZlcnNpb24iLCJhdE1hdGNoZXMiLCJtYXRjaEFsbCIsInNwbGl0SW5kZXgiLCJwb3AiLCJzdWJzdHJpbmciLCJyYW5nZSIsInNvcnRPYmplY3RCeVNlbXZlciIsImEiLCJiIiwiYU5hbWUiLCJhUmFuZ2UiLCJiTmFtZSIsImJSYW5nZSIsImxvY2FsZUNvbXBhcmUiLCJzZW12ZXJDb21wYXJlIiwic2VtdmVyTWluVmVyc2lvbiIsImdldFBhY2thZ2VOYW1lIiwiaWRlbnQiLCJzdGFydHNXaXRoIiwiY2FjaGUiLCJzaG91bGRTb3J0RGVwZW5kZW5jaWVzTGlrZU5wbSIsInBhY2thZ2VNYW5hZ2VyIiwiZGV2RW5naW5lcyIsInBucG0iLCJlbmdpbmVzIiwibnBtIiwicHJvY2VzcyIsImhhc1lhcm5PclBucG1GaWxlcyIsInNvcnREZXBlbmRlbmNpZXMiLCJzb3J0V29ya3NwYWNlcyIsInNvcnRFc2xpbnRDb25maWciLCJvdmVycmlkZXMiLCJydWxlMSIsInJ1bGUyIiwic29ydFZTQ29kZUJhZGdlT2JqZWN0Iiwic29ydFByZXR0aWVyQ29uZmlnIiwic29ydFZvbHRhIiwic29ydERldkVuZ2luZXMiLCJzb3J0UG5wbUNvbmZpZyIsImRlZmF1bHROcG1TY3JpcHRzIiwiaGFzRGV2RGVwZW5kZW5jeSIsImRlcGVuZGVuY3kiLCJydW5TUmVnRXhwIiwiaGFzU2VxdWVudGlhbFNjcmlwdCIsImZpZWxkIiwidmFsdWVzIiwic2NyaXB0IiwiaXNTZXF1ZW50aWFsU2NyaXB0Iiwic29ydFNjcmlwdE5hbWVzIiwiZ3JvdXBNYXAiLCJpZHgiLCJmcm9tIiwiZ3JvdXBLZXkiLCJjaGlsZHJlbiIsImsiLCJzb3J0U2NyaXB0cyIsInNjcmlwdHMiLCJuYW1lcyIsInByZWZpeGFibGUiLCJvbWl0dGVkIiwicmVwbGFjZSIsInNvcnRDb25kaXRpb25zIiwiY29uZGl0aW9ucyIsImRlZmF1bHRDb25kaXRpb25zIiwicmVzdENvbmRpdGlvbnMiLCJjb25kaXRpb24iLCJzb3J0RXhwb3J0cyIsImV4cG9ydHMiLCJwYXRocyIsImZpZWxkcyIsIm1haW50YWluZXJzIiwiY29udHJpYnV0b3JzIiwicGFja2FnZU5hbWVBIiwicGFja2FnZU5hbWVCIiwiYmFkZ2UiLCJkZWZhdWx0U29ydE9yZGVyIiwib3ZlckZpZWxkcyIsIkJvb2xlYW4iLCJzb3J0UGFja2FnZUpzb24iLCJqc29uSXNoIiwianNvbiIsImVuZENoYXJhY3RlcnMiLCJKU09OIiwicGFyc2UiLCJzdHJpbmdpZnkiLCJlZGl0U3RyaW5nSlNPTiIsInNvcnRPcmRlciIsInByaXZhdGVLZXlzIiwicHVibGljS2V5cyIsImZpeFRlc3REaXJlY3Rvcmllc1VwZGF0aW5nUGFja2FnZUpzb24iLCJwYWNrYWdlRGlyUGF0aHMiLCJhbGwiLCJwYWNrYWdlSnNvblBhdGgiLCJwYWNrYWdlRGlyUGF0aCIsIm5ld1Rlc3REaXJQYXRoIiwib2xkVGVzdERpck5hbWUiLCJvbGRUZXN0RGlyUGF0aCIsIm1vdmVUZXN0RGlyZWN0b3J5IiwiZGlkVXBkYXRlU2NyaXB0Iiwic2NyaXB0TmFtZSIsIm5ld1NjcmlwdCIsInJlbmFtZSIsImRpcmVudHMiLCJyZWFkZGlyIiwid2l0aEZpbGVUeXBlcyIsIm9sZFBhdGgiLCJkaXJlbnQiLCJuZXdQYXRoIiwibmV3UGF0aFN0YXQiLCJzdGF0IiwiaXNEaXJlY3RvcnkiLCJybSIsImZpeFR5cGVEZWZpbml0aW9ucyIsImNvbmZpZ3NJbmNsdWRpbmdDaGlsZHJlbiIsImxpYlR5cGVEaXJQYXRoIiwic3JjVHlwZURpclBhdGgiLCJpc1Jvb3QiLCJkb2VzQ29udGFpblN1YlBhY2thZ2VKc29ucyIsImRpck5hbWUiLCJoYXNUeXBlRGVjbGFyYXRpb25FeHRlbnNpb24iLCJlbmRzV2l0aCIsInBhY2thZ2VOYW1lIiwiaGFzTGlicmFyeSIsImlzRmlsZSIsIm92ZXJ3cml0ZU1lcmdlIiwiZGVzdGluYXRpb25BcnJheSIsInNvdXJjZUFycmF5IiwiY29tYmluZU1lcmdlIiwidGFyZ2V0IiwiZGVzdGluYXRpb24iLCJjbG9uZVVubGVzc090aGVyd2lzZVNwZWNpZmllZCIsImlzTWVyZ2VhYmxlT2JqZWN0IiwibWVyZ2UiLCJzb3J0S2V5cyIsIm9iaiIsImtleUFuZFZhbHVlcyIsImtleTEiLCJrZXkyIiwicHVibGljUmVwb0F1dG9maXhXb3JrZmxvdyIsIm9uIiwicHVsbF9yZXF1ZXN0IiwiYnJhbmNoZXMiLCJwZXJtaXNzaW9ucyIsImNvbnRlbnRzIiwiY29uY3VycmVuY3kiLCJncm91cCIsImpvYnMiLCJhdXRvZml4IiwicHJpdmF0ZVJlcG9BdXRvZml4V29ya2Zsb3ciLCJ1c2VzIiwid29ya2Zsb3dzIiwicmVsZWFzZSIsInB1bGxfcmVxdWVzdF90YXJnZXQiLCJ0eXBlcyIsInN5bmMiLCJnZW5lcmF0ZVdvcmtmbG93cyIsInJvb3RDb25maWciLCJpc1JldXNhYmxlV29ya2Zsb3dzUmVwbyIsInJlcG9zaXRvcnkiLCJ3b3JrZmxvd3NQYXRoIiwic2VtYW50aWNZbWxQYXRoIiwiZm9yY2UiLCJpc09ic29sZXRlR2VuUHJXb3JrZmxvd0ZpbGVOYW1lIiwiZmlsZU5hbWVTZXQiLCJzZW1hbnRpY1JlbGVhc2UiLCJiYXNlbmFtZSIsIndyaXRlV29ya2Zsb3dZYW1sIiwiZGVwbG95UHJvZHVjdGlvbldvcmtmbG93RXhpc3RzIiwid3JpdGVZYW1sIiwiaXNQdWJsaWNSZXBvIiwic3RydWN0dXJlZENsb25lIiwic3RlcHMiLCJ3aXRoIiwiYnVpbGQiLCJhdXRvZml4V29ya2Zsb3ciLCJhdXRvZml4Sm9iIiwiZ2VuZXJhdGVBdXRvZml4V29ya2Zsb3ciLCJuZXdTZXR0aW5ncyIsIm9sZFNldHRpbmdzIiwieWFtbCIsImxvYWQiLCJhcnJheU1lcmdlIiwibW92ZVRvQm90dG9tIiwiYWN0aW9ucyIsInRyaWdnZXJfZGVwbG95X3dvcmtmbG93IiwiaXNSZXVzYWJsZVdvcmtmbG93Iiwiam9iIiwibm9ybWFsaXplSm9iIiwic2NoZWR1bGUiLCJicmFuY2giLCJzeW5jX3BhcmFtc193aXRob3V0X2Rlc3QiLCJ3b3JrZmxvd19kaXNwYXRjaCIsInNlY3JldHMiLCJOUE1fVE9LRU4iLCJHSF9UT0tFTiIsIkZJUkVCQVNFX1RPS0VOIiwiR0NQX1NBX0tFWV9KU09OX0ZPUl9GSVJFQkFTRSIsIkRJU0NPUkRfV0VCSE9PS19VUkwiLCJzZXJ2ZXJfdXJsIiwiZG90X2Vudl9wYXRoIiwiRkxZX0FQSV9UT0tFTiIsImRlcGxveV9jb21tYW5kIiwiZG9lc0NvbnRhaW5Eb2NrZXJmaWxlIiwiY2lfbGFiZWwiLCJnaXRodWJfaG9zdGVkX3J1bm5lciIsIm5ld1NlY3JldHMiLCJ5YW1sVGV4dCIsImR1bXAiLCJsaW5lV2lkdGgiLCJub0NvbXBhdE1vZGUiLCJzdHlsZXMiLCJmaXhUeXBvcyIsInBhY2thZ2VDb25maWciLCJkb2NGaWxlcyIsIm1kRmlsZSIsImZpeFR5cG9zSW5UZXh0IiwicmVwbGFjZVdpdGhDb25maWciLCJ0c0ZpbGVzIiwidHNGaWxlIiwiY29tbWVudCIsInRleHRCYXNlZEZpbGVzIiwiZmlsZSIsInByb21pc2VBbGwiLCJwcm9wTmFtZSIsImJlZm9yZSIsImFmdGVyIiwid2JmeUpzb24iLCJ0eXBvcyIsImdlbmVyYXRlQWdlbnRJbnN0cnVjdGlvbnMiLCJhbGxDb25maWdzIiwiYWdlbnRzRXh0cmFQYXRoIiwiZXh0cmFDb250ZW50IiwidG9vbE5hbWUiLCJnZW5lcmF0ZUFnZW50SW5zdHJ1Y3Rpb24iLCJjdXJzb3JSdWxlc1BhdGgiLCJjdXJzb3JSdWxlc0NvbnRlbnQiLCJmcm9udG1hdHRlciIsImJvZHkiLCJnZW5lcmF0ZUN1cnNvckdlbmVyYWxNZGNDb250ZW50IiwiYmFzZUNvbnRlbnQiLCJkZXNjcmlwdGlvbiIsImlzV2lsbEJvb3N0ZXJSZXBvIiwiY29uZmlncyIsInBsYXl3cmlnaHRUZXN0IiwiZ2VuZXJhdGVBZ2VudENvZGluZ1N0eWxlIiwiaGFzTmV3U2VjdGlvbiIsImMiLCJnZW5JMThuVHMiLCJyZWFjdCIsIm5leHQiLCJtaW5pbXVtUmVsZWFzZUFnZUV4Y2x1ZGVzIiwiZ2VuZXJhdGVCdW5maWdUb21sIiwiZXhpc3RpbmdDb250ZW50IiwicmVhZEZpbGVTeW5jIiwiYnVuZmlnVG9tbCIsInBhcnNlQnVuZmlnVG9tbCIsImJ1biIsImdlbmVyYXRlUnVuU2VjdGlvbiIsImluc3RhbGwiLCJleGFjdCIsInVzZXJDb250ZW50SGVhZGVyIiwidXNlckNvbnRlbnRIZWFkZXJSZWdleCIsInNlcGFyYXRvciIsImRlZmF1bHRIZWFkVXNlckNvbnRlbnQiLCJkZWZhdWx0VGFpbFVzZXJDb250ZW50IiwiaWdub3JlRmlsZVV0aWwiLCJzZXBhcmF0b3JQcmVmaXgiLCJyZWFkR2l0aWdub3JlV2l0aG91dFNlcGFyYXRvcnMiLCJsYXN0SGVhZGVySW5kZXgiLCJnZXRJbmRleE9mVGFpbFVzZXJDb250ZW50SGVhZGVyIiwiZ2V0SGVhZFVzZXJDb250ZW50IiwidGhpcyIsImdldFRhaWxVc2VyQ29udGVudCIsImlzQmVycnlaZXJvSW5zdGFsbEVuYWJsZWQiLCJsYXN0SW5kZXgiLCJsYXN0SW5kZXhPZiIsImdlbmVyYXRlRG9ja2VyaWdub3JlIiwiZXh0ZW5zaW9ucyIsImNvZGVXaXRoMkluZGVudFNpemUiLCJjb2RlV2l0aDRJbmRlbnRTaXplIiwibWFya2Rvd25MaWtlIiwib3hsaW50Iiwib3hmbXQiLCJwcmV0dGllck9ubHkiLCJnZW5lcmF0ZUV4dGVuc2lvbnMiLCJnZW5lcmF0ZUVkaXRvcmNvbmZpZyIsImRlZmF1bHRDb25maWciLCJoYXZlX2Z1biIsImNvZGVfcmV2aWV3IiwiZGlzYWJsZSIsImNvbW1lbnRfc2V2ZXJpdHlfdGhyZXNob2xkIiwibWF4X3Jldmlld19jb21tZW50cyIsInB1bGxfcmVxdWVzdF9vcGVuZWQiLCJoZWxwIiwic3VtbWFyeSIsImlnbm9yZV9wYXR0ZXJucyIsImdlbmVyYXRlR2VtaW5pQ29uZmlnIiwiY29uZmlnRmlsZVBhdGgiLCJzdHlsZWd1aWRlRmlsZVBhdGgiLCJuZXdDb25maWciLCJvbGRDb25maWciLCJ5YW1sQ29udGVudCIsImNvZGluZ1J1bGVFeHRyYUNvbnRlbnQiLCJ0cmltU3RhcnQiLCJzdHlsZWd1aWRlQ29udGVudCIsInRyaW1FbmQiLCJyZW1vdmVHZW1pbmlTZXR0aW5ncyIsImdlbmVyYXRlR2l0YXR0cmlidXRlcyIsImRlZmF1bHROYW1lcyIsImdlbmVyYXRlR2l0aWdub3JlIiwiaGVhZFVzZXJDb250ZW50IiwidGFpbFVzZXJDb250ZW50IiwiZG9lc0NvbnRhaW5HZW1maWxlIiwiZG9lc0NvbnRhaW5Hb01vZCIsImRvZXNDb250YWluUGFja2FnZUpzb24iLCJkb2VzQ29udGFpblBvbVhtbCIsImRvZXNDb250YWluUHVic3BlY1lhbWwiLCJkb2VzQ29udGFpblRlbXBsYXRlWWFtbCIsImRvZXNDb250YWluUG9ldHJ5TG9jayIsImRvZXNDb250YWluVXZMb2NrIiwiYmxpdHoiLCJmaXJlYmFzZSIsInJlYWN0TmF0aXZlIiwic3Rvcnlib29rIiwibGl0ZXN0cmVhbSIsImdlbmVyYXRlZCIsInJlYWRDYWNoZSIsInJlc3BvbnNlIiwiZmV0Y2giLCJyZXNwb25zZVRleHQiLCJ0ZXh0Iiwib2siLCJ3cml0ZUNhY2hlIiwib3MiLCJob21lZGlyIiwiRGF0ZSIsIm5vdyIsIm10aW1lTXMiLCJnZW5lcmF0ZUlkZWFTZXR0aW5ncyIsImNyZWF0ZVRhc2tPcHRpb25zIiwiZ2V0V2F0Y2hlclRhc2tzQ29udGVudCIsInJ1bm5lciIsImV4dGVuc2lvbiIsImdldEdlbkkxOG5Uc0NvbW1hbmQiLCJzcGF3blN5bmMiLCJyZXRyeSIsInNwYXduU3luY0FuZFJldHVyblN0YXR1cyIsIm5ld0NtZCIsIm5ld0FyZ3MiLCJnZXRTcGF3blN5bmNBcmdzIiwic3RhdHVzIiwiY2hpbGRfcHJvY2VzcyIsInNwYXduU3luY0FuZFJldHVyblN0ZG91dCIsInN0ZGlvIiwicHJvYyIsInMiLCJtZXNzYWdlIiwiUEFUSCIsIkJFUlJZX0JJTl9GT0xERVIiLCJlbmNvZGluZyIsInNoZWxsIiwiZ2l0SHViVXRpbCIsImdldE9yZ0FuZE5hbWUiLCJ1cmxPckZ1bGxOYW1lIiwidXJsV2l0aG91dFByb3RvY29sIiwib2N0b2tpdENhY2hlIiwiZ2V0T2N0b2tpdCIsIm93bmVyIiwiY2FjaGVkIiwib2N0b2tpdCIsIk9jdG9raXQiLCJhdXRoIiwiZ2V0R2l0SHViVG9rZW4iLCJoYXNHaXRIdWJUb2tlbiIsIkdIX0JPVF9QQVRfRk9SX1dJTExCT09TVEVSIiwiZ2V0R2l0SHViQ2xpVG9rZW4iLCJHSF9CT1RfUEFUX0ZPUl9XSUxMQk9PU1RFUkxBQiIsIkdJVEhVQl9UT0tFTiIsImdpdEh1YkNsaVRva2VuIiwiY2hpbGRQcm9jZXNzIiwiZXhlY0ZpbGVTeW5jIiwibWFuYWdlZFRzY29uZmlnQmFzZURlcGVuZGVuY2llcyIsImlzUHVibGlzaGVkV2lsbGJvb3N0ZXJDb25maWdzUGFja2FnZSIsImlzV2lsbEJvb3N0ZXJDb25maWdzIiwicHJpdmF0ZSIsImZpbGVzIiwib3hsaW50RGVwcyIsInR5cGVzY3JpcHRHb0RlcGVuZGVuY3kiLCJ0eXBlc2NyaXB0RGVwZW5kZW5jeSIsIndiRGVwZW5kZW5jeSIsImJ1aWxkVHNEZXBlbmRlbmN5Iiwid2lsbEJvb3N0ZXJDb25maWdzTWFuYWdlZERlcGVuZGVuY2llcyIsIm9ic29sZXRlTGludERlcGVuZGVuY2llcyIsIm1pY3JvbWF0Y2hQYWNrYWdlTmFtZXMiLCJtaWNyb21hdGNoSW1wb3J0UGF0dGVybiIsImxhdGVzdERlcGVuZGVuY3lWZXJzaW9uQ2FjaGUiLCJkZXBlbmRlbmN5U2VjdGlvbktleXMiLCJnZW5lcmF0ZVBhY2thZ2VKc29uIiwic2tpcEFkZGluZ0RlcHMiLCJqc29uT2JqIiwianNvblRleHQiLCJwZWVyRGVwZW5kZW5jaWVzIiwicmVhZFBhY2thZ2VKc29uIiwiYXV0aG9yIiwic2VjdGlvbiIsImdldERlcGVuZGVuY3lTZWN0aW9ucyIsIlJlZmxlY3QiLCJkZWxldGVQcm9wZXJ0eSIsInJlbW92ZVNlbGZEZXBlbmRlbmN5IiwidmVyc2lvbiIsImlzV29ya3NwYWNlUHJvdG9jb2xSYW5nZSIsImdldExhdGVzdERlcGVuZGVuY3lWZXJzaW9uIiwicmVwbGFjZVdpbGxCb29zdGVyQ29uZmlnc1dvcmtzcGFjZURlcGVuZGVuY3lSYW5nZXMiLCJ0c2xpYiIsImxlcm5hIiwicGluc3QiLCJwcmV0dGllciIsInNlY3Rpb25zIiwicmVtb3ZlV2lsbEJvb3N0ZXJDb25maWdzTWFuYWdlZERlcGVuZGVuY2llcyIsInByZXNlcnZlTWljcm9tYXRjaCIsImZpbGVQYXRocyIsImdsb2JTeW5jIiwiZG9lc1Byb2R1Y3RDb2RlSW1wb3J0TWljcm9tYXRjaCIsInNob3VsZFByZXNlcnZlTWljcm9tYXRjaCIsInNob3VsZFByZXNlcnZlQ29uZmlnUGFja2FnZUxpbnREZXBlbmRlbmN5IiwicmVtb3ZlT2Jzb2xldGVMaW50RGVwZW5kZW5jaWVzIiwicmVtb3ZlRGVwcmVjYXRlZFN0dWZmIiwicmVtb3ZlTGVnYWN5SW5zdGFsbENvbW1hbmRzIiwiZ2VuZXJhdGVTY3JpcHRzIiwicHJldHRpZnkiLCJjYXRjaCIsIm9yaWdpbmFsQ29udGVudCIsIm5ld0xpbmUiLCJsIiwiZ2VuZXJhdGVQcmV0dGllclN1ZmZpeCIsIm5vcm1hbGl6ZVlhcm5Xb3Jrc3BhY2VGb3JlYWNoU2NyaXB0cyIsInVwZGF0ZVNjcmlwdHMiLCJtb3ZlTWFuYWdlZFRvb2xEZXBlbmRlbmNpZXNUb0RldkRlcGVuZGVuY2llcyIsImRlcGVuZGVuY3lVcGRhdGVzIiwicHl0aG9uRGV2RGVwZW5kZW5jaWVzIiwiaGFzSmF2YSIsImRlcGVuZGVuY3lTZWN0aW9ucyIsInJlbW92ZVByZXR0aWVyQXJ0aWZhY3RzIiwiaHVza3kiLCJwb3N0aW5zdGFsbCIsInBvc3RwdWJsaXNoIiwicHJlcHVibGlzaE9ubHkiLCJwcmVwYWNrIiwicG9zdHBhY2siLCJwcmVwYXJlIiwiYXJ0aWxsZXJ5IiwicGxheXdyaWdodCIsIndvcmtzcGFjZXMiLCJ3b3Jrc3BhY2UiLCJpc1diUGFja2FnZSIsIndiIiwidHNjb25maWdCYXNlRGVwZW5kZW5jaWVzIiwiZ2V0VHNjb25maWdCYXNlRGVwZW5kZW5jaWVzIiwidXNlZERlcGVuZGVuY2llcyIsInVzZWREZXBlbmRlbmN5U2V0IiwiZXhpc3RpbmdUc2NvbmZpZ0Jhc2VEZXBlbmRlbmNpZXMiLCJhYnNvbHV0ZUZpbGVQYXRoIiwicGFyc2VDb25maWdGaWxlVGV4dFRvSnNvbiIsIndhcm4iLCJmb3JtYXRUc0RpYWdub3N0aWMiLCJub3JtYWxpemVUc2NvbmZpZ0V4dGVuZHMiLCJleHRlbmRzIiwiZ2V0RXhpc3RpbmdUc2NvbmZpZ0Jhc2VEZXBlbmRlbmNpZXMiLCJyZW1vdmVVbnVzZWRUc2NvbmZpZ0Jhc2VEZXBlbmRlbmNpZXMiLCJqZXN0IiwiZGVwIiwiYXBwbHlQYWNrYWdlSnNvbkNvbnZlbnRpb25zIiwibGljZW5zZSIsInB1Ymxpc2hDb25maWciLCJhY2Nlc3MiLCJjb25maWdNanNQYXRoIiwiY29uZmlnRHRzUGF0aCIsImNvbmZpZ0RtdHNDb250ZW50Iiwibm9ybWFsaXplUHVibGlzaGVkQ29uZmlnUGFja2FnZU1ldGFkYXRhIiwibWFpbiIsInJlc29sdXRpb25zIiwibGludCIsImRpcnMiLCJkaXIiLCJmb3JtYXQiLCJhcHBlbmRGb3JtYXRDb2RlQ29tbWFuZCIsInB5dGhvblBhY2thZ2VNYW5hZ2VyIiwiZ2V0UHl0aG9uUGFja2FnZU1hbmFnZXIiLCJweXRob25GaWxlcyIsImRpck5hbWVTZXQiLCJweXRob25GaWxlIiwiZmlyc3QiLCJzZWNvbmQiLCJkaXJOYW1lc1N0ciIsInB5dGhvblJ1bm5lciIsImV4aXN0aW5nUmVwb3NpdG9yeSIsIm5vcm1hbGl6ZWRSZXBvc2l0b3J5Iiwibm9ybWFsaXplUmVwb3NpdG9yeVVybEZvclBhY2thZ2VKc29uIiwiYnVpbGROb3JtYWxpemVkUmVwb3NpdG9yeUZvclBhY2thZ2VKc29uIiwibm9ybWFsaXplZEV4aXN0aW5nUmVwb3NpdG9yeSIsImZvcm1hdFJlcG9zaXRvcnlGb3JQYWNrYWdlSnNvbiIsImFkZEdlbkkxOG5Uc1Bvc3RpbnN0YWxsU2NyaXB0Iiwibm9ybWFsaXplUGFja2FnZU1ldGFkYXRhIiwicGFja2FnZUpzb25EZXBlbmRlbmNpZXMiLCJwYWNrYWdlSnNvbkRldkRlcGVuZGVuY2llcyIsImFkZFBhY2thZ2VKc29uRGVwZW5kZW5jaWVzIiwiYWRkRGVwZW5kZW5jeVZlcnNpb25zVG9QYWNrYWdlSnNvbiIsInBhY2thZ2VOYW1lcyIsInByaXZhdGVQYWNrYWdlcyIsInJlcG8iLCJpc1dvcmtzcGFjZVBhY2thZ2UiLCJvdGhlclRhcmdldCIsImNvbW1pdEhhc2giLCJvcmdhbml6YXRpb24iLCJyZWplY3QiLCJnZXRMYXRlc3RDb21taXRIYXNoIiwiZ2V0TGF0ZXN0UHJpdmF0ZVBhY2thZ2VTcGVjaWZpZXIiLCJ1cGRhdGVQcml2YXRlUGFja2FnZXMiLCJyZW1vdmVFbXB0eURlcGVuZGVuY3lTZWN0aW9ucyIsInNlcmlhbGl6ZVBhY2thZ2VKc29uIiwiaW5zdGFsbE5wbURlcGVuZGVuY2llcyIsImluc3RhbGxEZXBlbmRlbmN5VXBkYXRlcyIsInJlbGF0aXZlRmlsZVBhdGgiLCJyZWxhdGl2ZSIsImZvcm1hdFBhY2thZ2VKc29uV2l0aFByb2plY3RGb3JtYXR0ZXIiLCJjb3JlIiwiZm9ybWF0U2NyaXB0Iiwic2NyaXB0UnVubmVyIiwiZGV2IiwiZGVwZW5kZW5jeVNwZWNpZmllcnMiLCJjdXJyZW50VmVyc2lvbiIsImdldERlcGVuZGVuY3lTcGVjaWZpZXIiLCJnZXRJbnN0YWxsRGVwZW5kZW5jeVNwZWNpZmllciIsImRlcGVuZGVuY2llc1RvSW5zdGFsbCIsInNob3VsZFVwZGF0ZUV4aXN0aW5nRGVwZW5kZW5jeSIsInNob3VsZFVwZGF0ZUV4aXN0aW5nTWFuYWdlZERlcGVuZGVuY3kiLCJkaWFnbm9zdGljIiwiZmxhdHRlbkRpYWdub3N0aWNNZXNzYWdlVGV4dCIsIm1lc3NhZ2VUZXh0IiwiY2FjaGVkVmVyc2lvbiIsImdldERlcGVuZGVuY3lWZXJzaW9uRnJvbU5wbSIsImVzbGludCIsInJlcG9zaXRvcnlVcmwiLCJtYXRjaGVkIiwiZXhlYyIsIm5vcm1hbGl6ZWRVcmwiLCJvbGRTY3JpcHRzIiwiaGFzVHlwZWNoZWNrIiwiY2xlYW51cCIsInR5cGVjaGVjayIsInZlcmlmeSIsImFwcGx5TWlzZVRhc2tTY3JpcHRzIiwicHlyaWdodCIsImhhc0pzT3JUcyIsIm9sZFRlc3QiLCJnZW5lcmF0ZUZvcm1hdFNjcmlwdCIsImhhc01pc2VUYXNrIiwiZG9lc01pc2VUYXNrQ2FsbFBhY2thZ2VTY3JpcHQiLCJpc1diZnlNYW5hZ2VkTWlzZUJyaWRnZSIsIm1pc2VUYXNrcyIsInRhc2siLCJSZWdFeHAiLCJyYXciLCJjb21tYW5kcyIsImJhc2VTZXR0aW5ncyIsImdsb2JfbWF0Y2hlciIsInByZUNvbW1pdFNldHRpbmdzIiwic3RhZ2VfZml4ZWQiLCJnZW5lcmF0ZUxlZnRob29rVXBkYXRpbmdQYWNrYWdlSnNvbiIsImh1c2t5RGlyUGF0aCIsImhhc0h1c2t5RGlyIiwic2V0dGluZ3MiLCJnZXRQcmVDb21taXRKb2JzIiwicHJlUHVzaCIsImxpbnRDb21tYW5kIiwicXVpZXRMaW50Q29tbWFuZCIsImdldFByZVB1c2hTY3JpcHQiLCJta2RpclN5bmMiLCJtb2RlIiwicG9zdE1lcmdlQ29tbWFuZCIsInBvc3RNZXJnZUNvbW1hbmRzIiwiaGFzVmVyc2lvblNldHRpbmdzIiwidG9vbHNDaGFuZ2VkUGF0dGVybiIsImluc3RhbGxDb21tYW5kIiwicm1OZXh0RGlyZWN0b3J5IiwiZ2VuSTE4blRzQ29tbWFuZCIsImdlbmVyYXRlUG9zdE1lcmdlQ29tbWFuZHMiLCJnZXRDbGVhbnVwR2xvYnMiLCJnZXRDbGVhbnVwQ29tbWFuZCIsInN1cHBvcnRlZEV4dGVuc2lvbnMiLCJsb2NhbFdiUGFja2FnZUpzb25QYXRoIiwiaGFzTG9jYWxXYldvcmtzcGFjZSIsImNhblVzZVdiRm9yU3RhZ2VkRmlsZXMiLCJveGxpbnRQYXR0ZXJuIiwib3hmbXRQYXR0ZXJuIiwicHJldHRpZXJQYXR0ZXJuIiwiaGFzUHl0aG9uUGFja2FnZU1hbmFnZXIiLCJnZXRQeXRob25SdW5uZXIiLCJnZW5lcmF0ZUxpbnRzdGFnZWRyYyIsIm5vcm1hbGl6ZVRvb2xDb25maWdDb250ZW50IiwiZ2VuZXJhdGVPeGZtdENvbmZpZyIsImxlZ2FjeUpzb25Db25maWdQYXRoIiwiZGVzaXJlZENvbnRlbnQiLCJpc0VzbVBhY2thZ2UiLCJnZW5lcmF0ZVRvb2xDb25maWdDb250ZW50IiwiZ2V0Q29uZmlnQ29udGVudCIsImdlbmVyYXRlT3hsaW50Q29uZmlnIiwiX3Jvb3RDb25maWciLCJzaG91bGRQcmVzZXJ2ZVB1Ymxpc2hlZExpbnRlckNvbmZpZyIsImdldE1hbmFnZWRCbG9jayIsImdldFN0YXJ0TWFya2VyIiwiaGFzTWFuYWdlZEJsb2NrcyIsImJsb2NrTmFtZSIsInJlcGxhY2VtZW50IiwiZXh0cmFjdE1hbmFnZWRCbG9jayIsIm5leHRDb250ZW50IiwicmVwbGFjZU1hbmFnZWRCbG9jayIsInJlcGxhY2VNYW5hZ2VkQmxvY2tzIiwiZ2V0Q29uZmlnQ29udGVudFdpdGhNYW5hZ2VkQmxvY2tzIiwiZ2V0TWFuYWdlZEJsb2NrUmVnRXhwIiwicGF0dGVybiIsImVzY2FwZVJlZ0V4cCIsImdldEVuZE1hcmtlciIsImdlbmVyYXRlUHJldHRpZXJpZ25vcmUiLCJnaXRpZ25vcmVGaWxlUGF0aCIsImdpdGlnbm9yZUNvbnRlbnQiLCJhZGRpdGlvbmFsQ29udGVudCIsInZlbnZQYXRoIiwidmVudiIsImdlbmVyYXRlUHlyaWdodENvbmZpZ0pzb24iLCJnZW5lcmF0ZVJlYWRtZSIsImluc2VydEJhZGdlIiwiZmlsZU5hbWVzIiwicmVhZGRpclN5bmMiLCJiYWRnZU5hbWUiLCJ0b1VwcGVyQ2FzZSIsInJlbW92ZUdpdEh1YkFjdGlvbnNCYWRnZSIsInJlYWRtZSIsImkiLCJlc2NhcGVkQmFkZ2VOYW1lIiwiZXNjYXBlZEZpbGVOYW1lIiwiZ2VuZXJhdGVSZWxlYXNlcmMiLCJwbHVnaW5zIiwicGx1Z2luRW50cnkiLCJwbHVnaW4iLCJwcmVzZXQiLCJzdWNjZXNzQ29tbWVudENvbmRpdGlvbiIsImZhaWxDb21tZW50Q29uZGl0aW9uIiwibGFiZWxzIiwicmVsZWFzZWRMYWJlbHMiLCIkc2NoZW1hIiwiZ2VuZXJhdGVSZW5vdmF0ZUpzb24iLCJwYWNrYWdlUnVsZXMiLCJydWxlIiwibWF0Y2hQYWNrYWdlTmFtZXMiLCJlbmFibGVkIiwiaW5zdGFsbEFnZW50U2tpbGxzIiwicm9vdEpzb25PYmoiLCJjb21waWxlck9wdGlvbnMiLCJhbHdheXNTdHJpY3QiLCJub1VuY2hlY2tlZEluZGV4ZWRBY2Nlc3MiLCJhbGxvd1N5bnRoZXRpY0RlZmF1bHRJbXBvcnRzIiwiZXNNb2R1bGVJbnRlcm9wIiwicmVzb2x2ZUpzb25Nb2R1bGUiLCJpbXBvcnRIZWxwZXJzIiwibm9FbWl0IiwiZXhjbHVkZSIsImluY2x1ZGUiLCJzdWJKc29uT2JqIiwiZ2VuZXJhdGVUc2NvbmZpZyIsIm1vZHVsZVJlc29sdXRpb24iLCJub3JtYWxpemVOZXh0VHNjb25maWdNb2R1bGVTZXR0aW5ncyIsImJhc2VVcmwiLCJhbGlhcyIsInRhcmdldHMiLCJub3JtYWxpemVQYXRoQWxpYXNUYXJnZXRzIiwibm9ybWFsaXplTmV4dFRzY29uZmlnUGF0aEFsaWFzZXMiLCJjbGVhbnVwTGVnYWN5VHNjb25maWdNb2R1bGVTZXR0aW5ncyIsImdlbmVyYXRlZFR5cGVzIiwidHlwZU5hbWVzIiwidml0ZXN0IiwibW9jaGEiLCJjeXByZXNzIiwiZ2V0R2VuZXJhdGVkVHlwZXMiLCJnZXRUc2NvbmZpZ0V4dGVuZHMiLCJyb290RGlyIiwiZ2V0Um9vdERpciIsImRvZXNDb250YWluSnN4T3JUc3giLCJkb2VzQ29udGFpbkpzeE9yVHN4SW5QYWNrYWdlcyIsImpzeCIsImFkZEluY2x1ZGVQYXRoIiwiZXhpc3RpbmdUeXBlcyIsImV4aXN0aW5nRW1pdE1ldGFkYXRhIiwiZW1pdE9wdGlvbnMiLCJwaWNrRXhpc3RpbmdFbWl0TWV0YWRhdGEiLCJnZW5lcmF0ZWRFeHRlbmRzIiwiZXhpc3RpbmdFeHRlbmRzIiwibWVyZ2VkRXh0ZW5kcyIsIm5vcm1hbGl6ZUV4dGVuZHMiLCJ1bmlxdWVFeHRlbmRzIiwibWVyZ2VUc2NvbmZpZ0V4dGVuZHMiLCJlbWl0RGVjbGFyYXRpb25Pbmx5IiwicmV3cml0ZVJlbGF0aXZlSW1wb3J0RXh0ZW5zaW9ucyIsImVuc3VyZVRzRXh0ZW5zaW9uRW1pdENvbXBhdGliaWxpdHkiLCJtZXJnZWRUeXBlcyIsImZpbHRlckV4aXN0aW5nVHlwZXMiLCJ0eXBlTmFtZSIsInR5cGVSb290cyIsImV4cGVyaW1lbnRhbERlY29yYXRvcnMiLCJtb2R1bGUiLCJkZWxldGVMZWdhY3lNb2R1bGVTZXR0aW5ncyIsInRvTG93ZXJDYXNlIiwidmVyYmF0aW1Nb2R1bGVTeW50YXgiLCJub3JtYWxpemVDb21tb25Kc1RzY29uZmlnU2V0dGluZ3MiLCJpc0Fic29sdXRlIiwiZ2VuZXJhdGVkVHlwZVNldCIsImlzR2VuZXJhdGVkVGVzdEdsb2JhbFR5cGUiLCJleGNsdWRlRmlsZVBhdHRlcm5zIiwiZ2VuZXJhdGVWc2NvZGVTZXR0aW5ncyIsImV4Y2x1ZGVGaWxlUGF0dGVybiIsImV4Y2x1ZGVTZXR0aW5nIiwiZ2VuZXJhdGVZYXJucmNZbWwiLCJ5YXJucmNZbWxQYXRoIiwibGF0ZXN0VmVyc2lvbiIsImdldExhdGVzdFZlcnNpb24iLCJuZXdWZXJzaW9uIiwib2xkVmVyc2lvbiIsInZhbGlkTmV3VmVyc2lvbiIsInNlbXZlciIsInZhbGlkIiwiZ3QiLCJpc05ld2VyVmVyc2lvbiIsInJlbGVhc2VzUGF0aCIsInlhcm5yY1BhdGgiLCJkZWZhdWx0U2VtdmVyUmFuZ2VQcmVmaXgiLCJub2RlTGlua2VyIiwibm1Nb2RlIiwibnBtTWluaW1hbEFnZUdhdGUiLCJhcHByb3ZlZEdpdFJlcG9zaXRvcmllcyIsIm5wbVByZWFwcHJvdmVkUGFja2FnZXMiLCJjb21wcmVzc2lvbkxldmVsIiwiaW5qZWN0RW52aXJvbm1lbnRGaWxlcyIsImVuYWJsZUdsb2JhbENhY2hlIiwib3JpZ2luYWxMZW5ndGgiLCJwbHVnaW5QYXRoIiwiZ2V0WWFybnJjUHJldHRpZXJBcmdzIiwic2V0dXBMYWJlbHMiLCJzZXR1cExhYmVsIiwiZGVsZXRlTGFiZWwiLCJjb2xvciIsInJlcXVlc3QiLCJERVBSRUNBVEVEX1NFQ1JFVF9OQU1FUyIsInJlcXVpcmUiLCJjcmVhdGVSZXF1aXJlIiwic2V0dXBTZWNyZXRzIiwiZG90ZW52IiwicXVpZXQiLCJzZWNyZXROYW1lIiwic2VjcmV0X25hbWUiLCJrZXlfaWQiLCJrZXlJZCIsImRhdGEiLCJzb2RpdW0iLCJyZWFkeSIsInNlY3JldCIsInJhd0tleSIsImZyb21fYmFzZTY0IiwiYmFzZTY0X3ZhcmlhbnRzIiwiT1JJR0lOQUwiLCJyYXdTZWMiLCJmcm9tX3N0cmluZyIsImVuY0J5dGVzIiwiY3J5cHRvX2JveF9zZWFsIiwiZW5jQmFzZTY0IiwidG9fYmFzZTY0IiwiZW5jcnlwdGVkX3ZhbHVlIiwic2V0dXBHaXRIdWJTZXR0aW5ncyIsImJlZm9yZVJldHJ5IiwiaGFuZGxlRXJyb3IiLCJyZXRyeUNvdW50IiwicmV0cnlMb2dnZXIiLCJzaG91bGRSZXRyeSIsInNsZWVwTWlsbGlzZWNvbmRzIiwidXBkYXRlU2xlZXBNaWxsaXNlY29uZHMiLCJmYWlsZWRDb3VudCIsIndpdGhSZXRyeSIsImFsbG93X2F1dG9fbWVyZ2UiLCJhbGxvd19tZXJnZV9jb21taXQiLCJhbGxvd19zcXVhc2hfbWVyZ2UiLCJhbGxvd19yZWJhc2VfbWVyZ2UiLCJhbGxvd191cGRhdGVfYnJhbmNoIiwiZGVsZXRlX2JyYW5jaF9vbl9tZXJnZSIsInNxdWFzaF9tZXJnZV9jb21taXRfdGl0bGUiLCJzcXVhc2hfbWVyZ2VfY29tbWl0X21lc3NhZ2UiLCJoZWFkZXJzIiwicGFja2FnZU1hbmFnZXJSdW5QbGFjZWhvbGRlciIsInRlbXBsYXRlcyIsImdlbmVyYXRlR2l0SHViVGVtcGxhdGVzIiwiYXBwbHlQYWNrYWdlTWFuYWdlclRlbXBsYXRlIiwiZGlzdGFuY2UiLCJ0ZW1wbGF0ZSIsInBhY2thZ2VNYW5hZ2VyQ29tbWFuZCIsIndiZnlKc29uU2NoZW1hIiwieiIsInJlY29yZCIsIm9wdGlvbmFsIiwiZG9jIiwiZ2V0UGFja2FnZUNvbmZpZyIsImVzbVBhY2thZ2UiLCJwYWNrYWdlSnNvblRleHQiLCJyZWxlYXNlQnJhbmNoZXMiLCJyZWxlYXNlUGx1Z2lucyIsInJlbGVhc2VyY0pzb25QYXRoIiwiZnNwIiwiZmxhdCIsInJlcG9JbmZvIiwiZ2l0Iiwic2ltcGxlR2l0Iiwib3JpZ2luIiwiZ2V0UmVtb3RlcyIsInIiLCJyZW1vdGVVcmwiLCJyZWZzIiwicmVxdWVzdFJlcG9JbmZvIiwiZmV0Y2hSZXBvSW5mbyIsImN1cnJlbnQiLCJoYXNWZXJzaW9uU2V0dGluZ3NGaWxlIiwiZG9ja2VyZmlsZSIsIndiZnlKc29uUGF0aCIsIndiZnlKc29uVGV4dCIsInJlcG9GdWxsTmFtZSIsImZ1bGxfbmFtZSIsInJlcG9BdXRob3IiLCJyZXBvTmFtZSIsInJlcG9QYXJ0cyIsImlzUmVmZXJyZWRCeU90aGVyUmVwbyIsImNvbnRhaW5zQW55IiwiZG9lc0NvbnRhaW5Wc2NvZGVTZXR0aW5nc0pzb24iLCJnaXRodWIiLCJyZWFkTWlzZVRhc2tzIiwidGFza3MiLCJ0b21sIiwicmVhZE1pc2VUYXNrQ29tbWFuZCIsIm9yZyIsInJlZGlyZWN0ZWRGdWxsTmFtZSIsImxvY2F0aW9uIiwiZ2V0UmVkaXJlY3RlZFJlcG9GdWxsTmFtZSIsInJlZnJlc2hCdW5Mb2NrIiwicm9vdERpclBhdGgiLCJhcmd2IiwieWFyZ3MiLCJwb3NpdGlvbmFsIiwiZGVzY3JpYmUiLCJkZWZhdWx0Iiwic2tpcERlcHMiLCJ2ZXJib3NlIiwicGFja2FnZUpzb25EaXIiLCJVUkwiLCJwYXRobmFtZSIsImdldFZlcnNpb24iLCJzdHJpY3QiLCJoYXNJbnZhbGlkUGFja2FnZUNvbmZpZyIsInBhY2thZ2VzRGlyUGF0aCIsInN1YkRpclBhdGhzIiwiZCIsImFiYnJldmlhdGlvblByb21pc2UiLCJzdWJQYWNrYWdlQ29uZmlncyIsInN1YkRpclBhdGgiLCJhbGxQYWNrYWdlQ29uZmlncyIsInNob3VsZFJ1bldvcmtmbG93cyIsInRoZW4iLCJleGl0Q29kZSJdLCJtYXBwaW5ncyI6IjhwQkFBT0EsZUFBZUMsRUFBTUMsR0FDMUIsT0FBTyxJQUFJQyxRQUFTQyxHQUFZQyxXQUFXRCxFQUFTRixHQUN0RCxDQ2lDT0YsZUFBZU0sRUFBb0JDLEdBQ3hDLElBQ0UsYUFBYUEsR0FDZixDQUFFLE1BQ0EsQ0FFSixDQUVPUCxlQUFlUSxFQUFxQkQsR0FDekMsSUFDRSxhQUFhQSxHQUNmLENBQUUsTUFBT0UsR0FDUCxHQUFxQixpQkFBVkEsR0FBc0JBLEdBQVMsU0FBVUEsR0FBd0IsV0FBZkEsRUFBTUMsS0FDakUsT0FFRixNQUFNRCxDQUNSLENBQ0YsQ0MvQ08sTUFBTUUsRUFBVSxJQUx2QixN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
31
+ `.trim()}function Mn(e){return e.doesContainPoetryLock||e.doesContainUvLock}function Jn(e){return e.doesContainUvLock?"uv run":"poetry run"}async function Un(t){return S.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 Gn(e){return e?.trim()}class zn{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(`${qn(this.getStartMarker(e))}[\\s\\S]*?${qn(this.getEndMarker(e))}`)}getStartMarker(e){return`// wbfy:start ${this.markerPrefix}-${e}`}getEndMarker(e){return`// wbfy:end ${this.markerPrefix}-${e}`}}function qn(e){return e.replaceAll(/[.*+?^${}()|[\]\\]/g,String.raw`\$&`)}const Hn=new zn({blockNames:["base","export"],markerPrefix:"oxfmt",toolName:"oxfmt"});async function Yn(n){return S.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=Hn.getConfigContent({desiredContent:Vn(n),existingContent:s,filePath:r}),a=[C.run(()=>e.promises.rm(i,{force:!0}))];Gn(s)!==Gn(o)&&a.push(C.run(()=>P.generateFile(r,o))),await Promise.all(a)})}function Vn(e){return e.isEsmPackage?`${Hn.getBlock("base","import config from '@willbooster/oxfmt-config';")}\n\n${Hn.getBlock("export","export default config;")}\n`:`${Hn.getBlock("base","// oxlint-disable unicorn/prefer-module -- Oxfmt config files are only auto-discovered as .ts, and CommonJS avoids Node typeless ESM warnings.\nconst oxfmtConfig = require('@willbooster/oxfmt-config');\n\nconst oxfmtResolvedConfig = oxfmtConfig.default ?? oxfmtConfig;")}\n\n${Hn.getBlock("export","module.exports = oxfmtResolvedConfig;")}\n`}const Kn=new zn({blockNames:["base","export"],markerPrefix:"oxlint",toolName:"oxlint"});async function Xn(n,i){return S.functionIgnoringException("generateOxlintConfig",async()=>{const i=Zt(n),r=t.resolve(n.dirPath,"oxlint.config.ts"),s=await P.readFileIgnoringError(r),o=i&&s?s:Kn.getConfigContent({desiredContent:Zn(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}))),Gn(s)!==Gn(o)&&a.push(C.run(()=>P.generateFile(r,o))),await Promise.all(a)})}function Zn(e){return e.isEsmPackage?`${Kn.getBlock("base","import oxlintResolvedConfig from '@willbooster/oxlint-config';")}\n\n${Kn.getBlock("export","export default oxlintResolvedConfig;")}\n`:`${Kn.getBlock("base","// oxlint-disable unicorn/prefer-module -- Oxlint only auto-discovers .ts config files, and CommonJS avoids Node typeless ESM warnings.\nconst oxlintBaseConfig = require('@willbooster/oxlint-config');\n\nconst oxlintResolvedConfig = oxlintBaseConfig.default ?? oxlintBaseConfig;")}\n\n${Kn.getBlock("export","module.exports = oxlintResolvedConfig;")}\n`}async function Qn(n){return S.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 ei={venvPath:".",venv:".venv"};async function ti(n){return S.functionIgnoringException("generatePyrightConfigJson",async()=>{let i=structuredClone(ei);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 ni(n){return S.functionIgnoringException("generateReadme",async()=>{const i=t.resolve(n.dirPath,"README.md");let r=await e.promises.readFile(i,"utf8");e.existsSync(t.resolve(n.dirPath,".releaserc.json"))&&(r=ii(r,"[![semantic-release](https://img.shields.io/badge/%20%20%F0%9F%93%A6%F0%9F%9A%80-semantic--release-e10079.svg)](https://github.com/semantic-release/semantic-release)"));const 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=`[![${o}](https://github.com/${s}/actions/workflows/${i}/badge.svg)](https://github.com/${s}/actions/workflows/${i})`;e.existsSync(t.resolve(n.dirPath,`.github/workflows/${i}`))&&(r=ri(r,o,i),r=ii(r,a))}await C.run(()=>P.generateFile(i,r))})}function ii(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 ri(e,t,n){const i=si(t),r=si(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 si(e){return e.replaceAll(/[.*+?^${}()|[\]\\]/g,String.raw`\$&`)}async function oi(n){return S.functionIgnoringException("generateReleaserc",async()=>{const i=t.resolve(n.dirPath,".releaserc.json");if(!e.existsSync(i))return;const r=JSON.parse(await e.promises.readFile(i,"utf8")),s=r.plugins??[];for(let e=0;e<s.length;e++){const t=s[e],n=Array.isArray(t),i=n?t[0]:t,r=n&&t[1]||{};"@semantic-release/commit-analyzer"===i?s[e]=["@semantic-release/commit-analyzer",l.all([r,{preset:"conventionalcommits"}],{arrayMerge: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 ai={$schema:"https://docs.renovatebot.com/renovate-schema.json",extends:["github>WillBooster/willbooster-configs:renovate.json5"]};async function ci(n){return S.functionIgnoringException("generateRenovateJson",async()=>{let i=structuredClone(ai);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=i.extends.filter(e=>"@willbooster"!==e)}catch{}n.depending.blitz&&(i.packageRules??=[],i.packageRules.some(e=>e.matchPackageNames?.includes("next"))||i.packageRules.push({matchPackageNames:["next"],enabled:!1})),await 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 s=JSON.stringify(i,void 0,2);await C.run(()=>P.generateFile(r,s))})}async function li(e){return S.functionIgnoringException("installAgentSkills",async()=>{await Promise.all([s.rm(t.resolve(e.dirPath,".agents"),{force:!0,recursive:!0}),s.rm(t.resolve(e.dirPath,".claude"),{force:!0,recursive:!0}),s.rm(t.resolve(e.dirPath,"skills-lock.json"),{force:!0})])})}const pi={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/**/*"]},di={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 ui(n){return S.functionIgnoringException("generateTsconfig",async()=>{if(n.depending.blitz||n.depending.next)return void await async function(n){const i=t.resolve(n.dirPath,"tsconfig.json");try{const t=JSON.parse(await e.promises.readFile(i,"utf8"));!function(e){if(!e)return;"node"!==e.moduleResolution&&"Node"!==e.moduleResolution&&"node10"!==e.moduleResolution&&void 0!==e.moduleResolution||(e.moduleResolution="bundler")}(t.compilerOptions),function(e){if(!e)return;if(delete e.baseUrl,!e.paths)return;for(const[t,n]of Object.entries(e.paths))e.paths[t]=fi(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?pi:di);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=[...mi(e),...mi(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([...gi(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;Ke(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 fi(e){return e.map(e=>e.startsWith("./")||e.startsWith("../")||t.isAbsolute(e)?e:`./${e}`)}function mi(e){return e?Array.isArray(e)?e:[e]:[]}function gi(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 yi=["**/.git/objects/**","**/.git/subtree-cache/**","**/node_modules/**","**/tmp/**","**/temp/**","**/dist/**"];async function hi(n){return S.functionIgnoringException("generateVscodeSettings",async()=>{try{const i=t.resolve(n.dirPath,".vscode","settings.json"),r=await e.promises.readFile(i,"utf8");let s=JSON.parse(r);for(const e of yi)s=l.all([s,wi(e)]);(n.doesContainPoetryLock||n.doesContainUvLock)&&(s=l.all([s,wi("**/.venv/**")])),n.depending.next&&(s=l.all([s,wi("**/.next/**")])),"editor.codeActionsOnSave"in s&&delete s["editor.codeActionsOnSave"],"editor.formatOnSave"in s&&delete s["editor.formatOnSave"],Ke(s);const o=JSON.stringify(s,void 0,2);await C.run(()=>P.generateFile(i,o))}catch{}})}function wi(e){return{"files.watcherExclude":{[e]:!0}}}async function bi(n){return S.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=Jt("yarn",["--version"],n.dirPath),s=function(e,t){return Jt("npm",["show",e,"version"],t)||"0.0.0"}("@yarnpkg/cli",n.dirPath);(function(e,t){const n=y.valid(e);return!!n&&y.gt(n,y.valid(t)??"0.0.0")})(s,r)&&Lt("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.nodeLinker="node-modules",c.nmMode="hardlinks-global",c.npmMinimalAgeGate="5d",c.approvedGitRepositories=["https://github.com/WillBoosterLab/*.git","ssh://git@github.com/WillBoosterLab/*.git"],c.npmPreapprovedPackages=["@exercode/*","@willbooster/*","agent-runtime-kit","at-decorators","build-ts","gen-i18n-ts","one-way-git-sync","next","@next/*","@typescript/*","@oxfmt/*","@oxlint/*","@oxlint-tsgolint/*","oxfmt","oxlint","oxlint-tsgolint","react","react-dom"],delete c.compressionLevel,0===c.injectEnvironmentFiles?.length&&delete c.injectEnvironmentFiles,c.enableGlobalCache=!0;const l=c.plugins?.length??0;if(c.plugins=c.plugins?.filter(e=>".yarn/plugins/undefined.cjs"!==e.path)??[],c.plugins.length!==l){const i=t.resolve(n.dirPath,".yarn","plugins","undefined.cjs");await 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})),Lt("yarn",["dlx","yarn-plugin-auto-install"],n.dirPath),Lt("yarn",function(e,n){return["dlx","prettier","--no-config","--write",t.relative(e,n)]}(n.dirPath,i),n.dirPath)})}async function vi(e){return S.functionIgnoringException("setupLabels",async()=>{const[t,n]=Gt.getOrgAndName(e.repository??"");if(!t||!n)return;if("WillBooster"!==t&&"WillBoosterLab"!==t)return;if(!Ht(t))return;const i=qt(t);try{await ki(i,t,n,"d1: x-easy :hedgehog:","EDE9FE"),await ki(i,t,n,"d2: easy :rabbit2:","DDD6FE"),await ki(i,t,n,"d3: medium :ox:","C4B5FD"),await ki(i,t,n,"d4: hard :squid:","A78BFA"),await ki(i,t,n,"d5: x-hard :whale2:","8B5CF6"),await ki(i,t,n,"p1: critical :fire::fire::fire:","EF4444"),await ki(i,t,n,"p2: urgent :fire::fire:","F87171"),await ki(i,t,n,"p3: important :fire:","FCA5A5"),await ki(i,t,n,"p4: nice to have :droplet:","FECACA"),await ki(i,t,n,"r: blitz","5300bc"),await ki(i,t,n,"r: firebase","ffca28"),await ki(i,t,n,"r: prisma","0c344b"),await ki(i,t,n,"r: react","61dafb"),await ki(i,t,n,"r: svelte","ff3e00"),await ki(i,t,n,"r: semantic-release","494949"),await ki(i,t,n,"ready :rocket:","22C55E"),await ki(i,t,n,"review requested :mag:","FBCA04"),await ki(i,t,n,"released :bookmark:","6366F1"),await ki(i,t,n,"s: 0.5h :clock1230:","F3F4F6"),await ki(i,t,n,"s: 1h :clock1:","E5E7EB"),await ki(i,t,n,"s: 2h :clock2:","D1D5DB"),await ki(i,t,n,"s: 3h :clock3:","9CA3AF"),await ki(i,t,n,"s: 5h :clock5:","6B7280"),await ki(i,t,n,"s: 8h :clock8:","4B5563"),await ki(i,t,n,"s: 13h :clock1:","374151"),await ki(i,t,n,"t: build :hammer:","BFDBFE"),await ki(i,t,n,"t: chore :broom:","BFDBFE"),await ki(i,t,n,"t: ci :construction_worker:","BFDBFE"),await ki(i,t,n,"t: docs :memo:","BFDBFE"),await ki(i,t,n,"t: feat :sparkles:","BFDBFE"),await ki(i,t,n,"t: fix :bug:","BFDBFE"),await ki(i,t,n,"t: perf :zap:","BFDBFE"),await ki(i,t,n,"t: refactor :recycle:","BFDBFE"),await ki(i,t,n,"t: style :lipstick:","BFDBFE"),await ki(i,t,n,"t: test :test_tube:","BFDBFE"),await ki(i,t,n,"project","24292F"),await ki(i,t,n,"focused :dart:","22C55E"),await xi(i,t,n,"bug"),await xi(i,t,n,"documentation"),await xi(i,t,n,"duplicate"),await xi(i,t,n,"enhancement"),await xi(i,t,n,"good first issue"),await xi(i,t,n,"help wanted"),await xi(i,t,n,"invalid"),await xi(i,t,n,"question"),await xi(i,t,n,"wontfix"),await xi(i,t,n,"ready"),await xi(i,t,n,"review requested"),await xi(i,t,n,"released"),await xi(i,t,n,"semantic-release"),await xi(i,t,n,"llm-pr :robot:"),await xi(i,t,n,"ai-pr :robot:"),await xi(i,t,n,"gen-pr-all :robot:"),await xi(i,t,n,"gen-pr-claude :robot:"),await xi(i,t,n,"gen-pr-codex :robot:"),await xi(i,t,n,"gen-pr-gemini :robot:")}catch(e){console.warn("Skip setupLabels due to:",e?.stack??e)}})}async function ki(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 xi(e,t,n,i){try{await e.request("DELETE /repos/{owner}/{repo}/labels/{name}",{owner:t,repo:n,name:i})}catch{}}const ji=["READY_DISCORD_WEBHOOK_URL","GH_BOT_PAT","PUBLIC_GH_BOT_PAT"],$i=h(import.meta.url);async function _i(e){return S.functionIgnoringException("setupSecrets",async()=>{const[n,i]=Gt.getOrgAndName(e.repository??"");if(!n||!i||"WillBoosterLab"!==n)return;if(!Ht(n)||!_.doesUploadEnvVars)return;const r=w.config({path:t.resolve(e.dirPath,".env"),quiet:!0}).parsed??{};if(0===Object.keys(r).length)return;const s=qt(n);try{for(const e of ji)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=$i("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 Si(e){const[t,n]=Gt.getOrgAndName(e.repository??"");if(!t||!n)return;if("WillBooster"!==t&&"WillBoosterLab"!==t)return;if(!Ht(t))return;const i=qt(t);await async function(e,{beforeRetry:t,handleError:n,retryCount:i=3,retryLogger:r,shouldRetry:s,sleepMilliseconds:o=0,updateSleepMilliseconds:a}={}){let c=0;for(;;)try{return await e(c)}catch(e){if(await(n?.(e)),c++,c>=i)throw e;if(s&&!s(e))throw e;o>0&&await 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}:{}}))}const Pi="__PM_RUN__",Ci={"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., \`${Pi} test\`) passed.\n - The lint command (e.g., \`${Pi} lint\`) passed.\n - You may leave this box unchecked due to long workflows.\n- [ ] I've reviewed my changes on the GitHub diff view.\n- [ ] I've written the steps to test my changes.\n- [ ] I've added screenshots (if the UI changed).\n - You may leave this box unchecked if you didn't modify the UI.\n\n\x3c!-- Please add screenshots if you modify the UI.\n| Current | In coming |\n| ------------------------ | ------------------------ |\n| <img src="" width="400"> | <img src="" width="400"> |\n--\x3e\n\n\x3c!-- Please add steps to test your changes.\n## Steps to Test\n\n1. Open http://localhost-exercode.willbooster.net:3000/ja-JP/courses/_example/lessons/_example_a_plus_b/problems/_example_a_plus_b after login.\n2. Select the language \`C\`.\n3. Write the following code:\n \`\`\`c\n #include <stdio.h>\n\n int main(void) {\n int a, b;\n\n scanf("%d %d", &a, &b);\n printf("%d", a + b);\n return 0;\n }\n \`\`\`\n4. Push \`Submit\` button.\n5. ...\n--\x3e\n`.trim()};async function Ei(n){return S.functionIgnoringException("generateGitHubTemplates",async()=>{if(n.isWillBoosterRepo)for(const[i,r]of Object.entries(Ci)){const s=Oi(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 Oi(e,t){const n=t.isBun?"bun run":"yarn";return e.replaceAll(Pi,n)}const Bi=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 Ai(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 m;f&&(m=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 Di(r);if(e)return e}const s="string"==typeof t.repository?t.repository:t.repository?.url;if(s){const e=await Di(s);if(e&&"Not Found"!==e.message)return e}}(n,l));let g=function(n){const i=t.resolve(n);return e.existsSync(t.join(i,"mise.toml"))||e.existsSync(t.join(i,".mise.toml"))||e.existsSync(t.join(i,".tool-versions"))}(n);for(const i of["java","node","python"])if(e.existsSync(t.resolve(n,`.${i}-version`))){g=!0;break}let y="";try{y=await s.readFile(t.resolve(n,"Dockerfile"),"utf8")}catch{}const h=t.resolve(n,"wbfy.json");let w;try{const e=await s.readFile(h,"utf8");w=Bi.parse(JSON.parse(e))}catch{}const b="string"==typeof m?.full_name?m.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===m?.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:Ii("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:Ii("{app,src,test,scripts}/**/*.{cjs,mjs,js,jsx}",n),doesContainTypeScript:Ii("{app,src,test,scripts}/**/*.{cts,mts,ts,tsx}",n),doesContainJsxOrTsx:Ii("{app,src,test}/**/*.{t,j}sx",n),doesContainJava:Ii("**/*.java",n),doesContainJavaScriptInPackages:Ii("packages/**/{app,src,test,scripts}/**/*.{cjs,mjs,js,jsx}",n),doesContainTypeScriptInPackages:Ii("packages/**/{app,src,test,scripts}/**/*.{cts,mts,ts,tsx}",n),doesContainJsxOrTsxInPackages:Ii("packages/**/{app,src,test}/**/*.{t,j}sx",n),doesContainJavaInPackages:Ii("packages/**/*.java",n),depending:{blitz:!!a.blitz,firebase:!!c["firebase-tools"],genI18nTs:!!a["gen-i18n-ts"]||!!c["gen-i18n-ts"],litestream:y.includes("install-litestream.sh"),react:!!a.react,next:!!a.next,playwrightTest:!!a["@playwright/test"]||!!c["@playwright/test"]||!!c.playwright,prisma:!!a["@prisma/client"]||!!c.prisma,pyright:!!c.pyright,reactNative:!!a["react-native"],semanticRelease:!!(c["semantic-release"]||d.length>0||u.length>0),storybook:!!c["@storybook/react"],wb:!!a["@willbooster/wb"]||!!c["@willbooster/wb"]},release:{branches:d,github:u.includes("@semantic-release/github"),npm:u.includes("@semantic-release/npm")},hasVersionSettings:g,miseTasks:await Fi(n),packageJson:l,wbfyJson:w};if($.doesContainGemfile||$.doesContainGoMod||$.doesContainPackageJson||$.doesContainPoetryLock||$.doesContainUvLock||$.doesContainPomXml||$.doesContainPubspecYaml||$.doesContainTemplateYaml)return $}catch{}}async function Fi(e){const n={};for(const i of["mise.toml",".mise.toml"]){const r=t.resolve(e,i);try{const e=d.parse(await s.readFile(r,"utf8"));for(const[t,i]of Object.entries(e.tasks??{}))n[t]=Ri(i)}catch{}}return n}function Ri(e){return"string"==typeof e?e:Array.isArray(e)?e.filter(e=>"string"==typeof e).join("\n"):e&&"object"==typeof e?Ri(e.run):""}function Ii(e,t){return o.globSync(e,{dot:!0,cwd:t,ignore:z}).length>0}async function Di(e){const[t,n]=Gt.getOrgAndName(e);if(t&&n)try{return(await qt().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}}}function Ti(e){const t=Mt("bun",["install"],e);if(0!==t)throw new Error(`Failed to refresh Bun lockfile: bun install exited with status ${t}`)}await async function(){const i=await n(process.argv.slice(2)).command("$0 [paths..]","Make a given project follow the WillBooster standard",e=>{e.positional("paths",{describe:"project paths to be wbfied",array:!0,type:"string",default:["."]})}).options({env:{description:"Upload environment variables as secrets to GitHub",type:"boolean",default:!1,alias:"e"},skipDeps:{description:"Skip dependency installation",type:"boolean",default:!1,alias:"d"},verbose:{description:"Whether or not to enable verbose mode",type:"boolean",default:!1,alias:"v"}}).version(function(){let n=t.dirname(new URL(import.meta.url).pathname);for(;!e.existsSync(t.join(n,"package.json"));)n=t.dirname(n);return JSON.parse(e.readFileSync(t.join(n,"package.json"),"utf8")).version}()).strict().argv;_.isVerbose=i.verbose,_.doesUploadEnvVars=i.env;let r=!1;for(const n of i.paths){const s=t.join(n,"packages"),o=(await 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 Ai(n);if(_.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=>Ai(e,a)))).filter(e=>!!e),p=[a,...l];if(_.isVerbose)for(const e of p)console.info(e);await bi(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(()=>ni(a)),lt(a,p),xt(a),_t(a),Ct(a,p),Et(a),Bt(a),Ei(a),Tt(a),ci(a),oi(a),...d?[et(a)]:[],vi(a),_i(a),Si(a),Tn(a),Un(a)]),await C.promiseAll();const u=[];for(const e of p)(e.doesContainTypeScript||e.doesContainTypeScriptInPackages)&&u.push(ze(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 Qn(e),await dn(e,a,i.skipDeps),u.push(Un(e)),e.doesContainVscodeSettingsJson&&e.doesContainPackageJson&&u.push(hi(e)),(e.doesContainTypeScript||e.doesContainTypeScriptInPackages)&&u.push(ui(e)),O(e)&&(u.push(Yn(e)),u.push(Xn(e))),e.depending.pyright&&u.push(ti(e)));await Promise.all(u),await C.promiseAll();const f=a.isBun?"bun":"yarn";a.isBun?await S.functionIgnoringException("refreshBunLock",async()=>{await Promise.resolve(),Ti(n)}):Lt(f,["install","--no-immutable"],n),Lt(f,["cleanup"],n),await li(a)}r&&(process.exitCode=1)}();
32
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VzIjpbIi4uLy4uL3NoYXJlZC1saWIvc3JjL3NsZWVwLnRzIiwiLi4vLi4vc2hhcmVkLWxpYi9zcmMvZXJyb3IudHMiLCIuLi9zcmMvb3B0aW9ucy50cyIsIi4uL3NyYy9sb2dnZXIudHMiLCIuLi9zcmMvdXRpbHMvZnNVdGlsLnRzIiwiLi4vc3JjL3V0aWxzL3Byb21pc2VQb29sLnRzIiwiLi4vc3JjL2ZpeGVycy9uZXh0Q29uZmlnLnRzIiwiLi4vc3JjL3V0aWxzL3BhY2thZ2VDYXBhYmlsaXRpZXMudHMiLCIuLi9zcmMvZml4ZXJzL3BsYXl3cmlnaHRDb25maWcudHMiLCIuLi9zcmMvdXRpbHMvZ2xvYlV0aWwudHMiLCIuLi9zcmMvZml4ZXJzL3ByaXNtYS50cyIsIi4uLy4uLy4uL25vZGVfbW9kdWxlcy9zb3J0LW9iamVjdC1rZXlzL2luZGV4LmpzIiwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2RldGVjdC1pbmRlbnQvaW5kZXguanMiLCIuLi8uLi8uLi9ub2RlX21vZHVsZXMvZGV0ZWN0LW5ld2xpbmUvaW5kZXguanMiLCIuLi8uLi8uLi9ub2RlX21vZHVsZXMvc29ydC1wYWNrYWdlLWpzb24vaW5kZXguanMiLCIuLi8uLi8uLi9ub2RlX21vZHVsZXMvaXMtcGxhaW4tb2JqL2luZGV4LmpzIiwiLi4vc3JjL2ZpeGVycy90ZXN0RGlyZWN0b3J5LnRzIiwiLi4vc3JjL2ZpeGVycy90eXBlRGVmaW5pdGlvbi50cyIsIi4uL3NyYy91dGlscy9tZXJnZVV0aWwudHMiLCIuLi9zcmMvdXRpbHMvb2JqZWN0VXRpbC50cyIsIi4uL3NyYy9nZW5lcmF0b3JzL3dvcmtmbG93LnRzIiwiLi4vc3JjL2ZpeGVycy90eXBvcy50cyIsIi4uL3NyYy9nZW5lcmF0b3JzL2FnZW50cy50cyIsIi4uL3NyYy9nZW5lcmF0b3JzL2J1bmZpZy50cyIsIi4uL3NyYy91dGlscy9pZ25vcmVGaWxlVXRpbC50cyIsIi4uL3NyYy9nZW5lcmF0b3JzL2RvY2tlcmlnbm9yZS50cyIsIi4uL3NyYy91dGlscy9leHRlbnNpb25zLnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvZWRpdG9yY29uZmlnLnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvZ2VtaW5pQ29uZmlnLnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvZ2VtaW5pU2V0dGluZ3MudHMiLCIuLi9zcmMvZ2VuZXJhdG9ycy9naXRhdHRyaWJ1dGVzLnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvZ2l0aWdub3JlLnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvaWRlYS50cyIsIi4uL3NyYy91dGlscy9nZW5JMThuVHMudHMiLCIuLi9zcmMvdXRpbHMvc3Bhd25VdGlsLnRzIiwiLi4vc3JjL3V0aWxzL2dpdGh1YlV0aWwudHMiLCIuLi9zcmMvdXRpbHMvdHNjb25maWdCYXNlLnRzIiwiLi4vc3JjL3V0aWxzL3dpbGxib29zdGVyQ29uZmlnc1V0aWwudHMiLCIuLi9zcmMvZ2VuZXJhdG9ycy9wYWNrYWdlSnNvbi50cyIsIi4uL3NyYy9naXRodWIvY29tbWl0LnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvbGVmdGhvb2sudHMiLCIuLi9zcmMvZ2VuZXJhdG9ycy9saW50c3RhZ2VkcmMudHMiLCIuLi9zcmMvZ2VuZXJhdG9ycy9jb25maWdDb250ZW50LnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvbWFuYWdlZENvbmZpZ0Jsb2NrLnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMvb3hmbXRDb25maWcudHMiLCIuLi9zcmMvZ2VuZXJhdG9ycy9veGxpbnRDb25maWcudHMiLCIuLi9zcmMvZ2VuZXJhdG9ycy9wcmV0dGllcmlnbm9yZS50cyIsIi4uL3NyYy9nZW5lcmF0b3JzL3B5cmlnaHRDb25maWcudHMiLCIuLi9zcmMvZ2VuZXJhdG9ycy9yZWFkbWUudHMiLCIuLi9zcmMvZ2VuZXJhdG9ycy9yZWxlYXNlcmMudHMiLCIuLi9zcmMvZ2VuZXJhdG9ycy9yZW5vdmF0ZUpzb24udHMiLCIuLi9zcmMvZ2VuZXJhdG9ycy9za2lsbHMudHMiLCIuLi9zcmMvZ2VuZXJhdG9ycy90c2NvbmZpZy50cyIsIi4uL3NyYy9nZW5lcmF0b3JzL3ZzY29kZVNldHRpbmdzLnRzIiwiLi4vc3JjL2dlbmVyYXRvcnMveWFybnJjLnRzIiwiLi4vc3JjL2dpdGh1Yi9sYWJlbC50cyIsIi4uL3NyYy9naXRodWIvc2VjcmV0LnRzIiwiLi4vc3JjL2dpdGh1Yi9zZXR0aW5ncy50cyIsIi4uL3NyYy9naXRodWIvdGVtcGxhdGUudHMiLCIuLi9zcmMvcGFja2FnZUNvbmZpZy50cyIsIi4uL3NyYy9pbmRleC50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgYXN5bmMgZnVuY3Rpb24gc2xlZXAobWlsbGlzZWNvbmRzOiBudW1iZXIpOiBQcm9taXNlPHZvaWQ+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/IGAgd2l0aDogXFxgQ28tYXV0aG9yZWQtYnk6IFdpbGxCb29zdGVyICgke3Rvb2xOYW1lfSkgPGFnZW50QHdpbGxib29zdGVyLmNvbT5cXGBgIDogJyd9LlxuICAtIEFsd2F5cyBjcmVhdGUgbmV3IGNvbW1pdHMuIEF2b2lkIHVzaW5nIFxcYC0tYW1lbmRcXGAuXG4tIEFsd2F5cyB1c2UgaGVyZWRvYyBzeW50YXggd2hlbiBwYXNzaW5nIG11bHRpLWxpbmUgY29udGVudCB0byBhbnkgY29tbWFuZC5cbiR7aGFzUGxheXdyaWdodFRlc3RTZXJ2ZXIoYWxsQ29uZmlncykgPyBgLSBVc2UgXFxgJHtwYWNrYWdlTWFuYWdlcn0gd2Igc3RhcnQgLS1tb2RlIHRlc3RcXGAgdG8gbGF1bmNoIGEgd2ViIHNlcnZlciBmb3IgZGVidWdnaW5nIG9yIHRlc3RpbmcuYCA6ICcnfVxuXG4ke2dlbmVyYXRlQWdlbnRDb2RpbmdTdHlsZShhbGxDb25maWdzKX1cbmBcbiAgICAucmVwbGFjZUFsbCgvXFwuXFxuXFxuKy0vZywgJy5cXG4tJylcbiAgICAucmVwbGFjZUFsbCgvXFxuezMsfS9nLCAnXFxuXFxuJylcbiAgICAudHJpbSgpO1xuXG4gIGNvbnN0IGhhc05ld1NlY3Rpb24gPSBleHRyYUNvbnRlbnQ/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+IHtcbiAgdHJ5IHtcbiAgICBjb25zdCBzdGF0ID0gYXdhaXQgZnMucHJvbWlzZXMuc3RhdChwYXRoLmpvaW4oZGlyUGF0aCwgbmFtZSkpO1xuICAgIGlmIChEYXRlLm5vdygpIC0gc3RhdC5tdGltZU1zID4gNiAqIDYwICogNjAgKiAxMDAwKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHJldHVybiBhd2FpdCBmcy5wcm9taXNlcy5yZWFkRmlsZShwYXRoLmpvaW4oZGlyUGF0aCwgbmFtZSksICd1dGY4Jyk7XG4gIH0gY2F0Y2gge1xuICAgIC8vIGRvIG5vdGhpbmdcbiAgfVxufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZXh0ZW5zaW9ucyB9IGZyb20gJy4uL3V0aWxzL2V4dGVuc2lvbnMuanMnO1xuaW1wb3J0IHsgZnNVdGlsIH0gZnJvbSAnLi4vdXRpbHMvZnNVdGlsLmpzJztcbmltcG9ydCB7IGRvZXNDb250YWluSmF2YSwgZG9lc0NvbnRhaW5Kc09yVHMgfSBmcm9tICcuLi91dGlscy9wYWNrYWdlQ2FwYWJpbGl0aWVzLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVJZGVhU2V0dGluZ3MoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZ2VuZXJhdGVJZGVhU2V0dGluZ3MnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgZGlyUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJy5pZGVhJyk7XG4gICAgaWYgKGZzLmV4aXN0c1N5bmMoZGlyUGF0aCkpIHtcbiAgICAgIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKGRpclBhdGgsICd3YXRjaGVyVGFza3MueG1sJyk7XG4gICAgICBhd2FpdCAoZG9lc0NvbnRhaW5Kc09yVHMoY29uZmlnKSB8fCBkb2VzQ29udGFpbkphdmEoY29uZmlnKVxuICAgICAgICA/IHByb21pc2VQb29sLnJ1bigoKSA9PiBmc1V0aWwuZ2VuZXJhdGVGaWxlKGZpbGVQYXRoLCBnZXRXYXRjaGVyVGFza3NDb250ZW50KGNvbmZpZykpKVxuICAgICAgICA6IHByb21pc2VQb29sLnJ1bigoKSA9PiBmcy5wcm9taXNlcy5ybShmaWxlUGF0aCwgeyBmb3JjZTogdHJ1ZSB9KSkpO1xuICAgIH1cbiAgfSk7XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZVRhc2tPcHRpb25zKHJ1bm5lcjogc3RyaW5nLCBhcmdzOiBzdHJpbmcsIG5hbWU6IHN0cmluZywgZXh0ZW5zaW9uOiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gYCAgICA8VGFza09wdGlvbnMgaXNFbmFibGVkPVwidHJ1ZVwiPlxuICAgICAgPG9wdGlvbiBuYW1lPVwiYXJndW1lbnRzXCIgdmFsdWU9XCIke2FyZ3N9ICRGaWxlUGF0aFJlbGF0aXZlVG9Qcm9qZWN0Um9vdCRcIiAvPlxuICAgICAgPG9wdGlvbiBuYW1lPVwiY2hlY2tTeW50YXhFcnJvcnNcIiB2YWx1ZT1cImZhbHNlXCIgLz5cbiAgICAgIDxvcHRpb24gbmFtZT1cImRlc2NyaXB0aW9uXCIgLz5cbiAgICAgIDxvcHRpb24gbmFtZT1cImV4aXRDb2RlQmVoYXZpb3JcIiB2YWx1ZT1cIkVSUk9SXCIgLz5cbiAgICAgIDxvcHRpb24gbmFtZT1cImZpbGVFeHRlbnNpb25cIiB2YWx1ZT1cIiR7ZXh0ZW5zaW9ufVwiIC8+XG4gICAgICA8b3B0aW9uIG5hbWU9XCJpbW1lZGlhdGVTeW5jXCIgdmFsdWU9XCJmYWxzZVwiIC8+XG4gICAgICA8b3B0aW9uIG5hbWU9XCJuYW1lXCIgdmFsdWU9XCIke25hbWV9ICguJHtleHRlbnNpb259KVwiIC8+XG4gICAgICA8b3B0aW9uIG5hbWU9XCJvdXRwdXRcIiB2YWx1ZT1cIiRGaWxlUGF0aFJlbGF0aXZlVG9Qcm9qZWN0Um9vdCRcIiAvPlxuICAgICAgPG9wdGlvbiBuYW1lPVwib3V0cHV0RmlsdGVyc1wiPlxuICAgICAgICA8YXJyYXkgLz5cbiAgICAgIDwvb3B0aW9uPlxuICAgICAgPG9wdGlvbiBuYW1lPVwib3V0cHV0RnJvbVN0ZG91dFwiIHZhbHVlPVwiZmFsc2VcIiAvPlxuICAgICAgPG9wdGlvbiBuYW1lPVwicHJvZ3JhbVwiIHZhbHVlPVwiJHtydW5uZXJ9XCIgLz5cbiAgICAgIDxvcHRpb24gbmFtZT1cInJ1bk9uRXh0ZXJuYWxDaGFuZ2VzXCIgdmFsdWU9XCJmYWxzZVwiIC8+XG4gICAgICA8b3B0aW9uIG5hbWU9XCJzY29wZU5hbWVcIiB2YWx1ZT1cIlByb2plY3QgRmlsZXNcIiAvPlxuICAgICAgPG9wdGlvbiBuYW1lPVwidHJhY2tPbmx5Um9vdFwiIHZhbHVlPVwiZmFsc2VcIiAvPlxuICAgICAgPG9wdGlvbiBuYW1lPVwid29ya2luZ0RpclwiIHZhbHVlPVwiJFByb2plY3RGaWxlRGlyJFwiIC8+XG4gICAgICA8ZW52cyAvPlxuICAgIDwvVGFza09wdGlvbnM+XG5gO1xufVxuXG5mdW5jdGlvbiBnZXRXYXRjaGVyVGFza3NDb250ZW50KGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IHN0cmluZyB7XG4gIHJldHVybiBgPD94bWwgdmVyc2lvbj1cIjEuMFwiIGVuY29kaW5nPVwiVVRGLThcIj8+XG48cHJvamVjdCB2ZXJzaW9uPVwiNFwiPlxuICA8Y29tcG9uZW50IG5hbWU9XCJQcm9qZWN0VGFza3NPcHRpb25zXCI+XG4ke2RvZXNDb250YWluSnNPclRzKGNvbmZpZykgPyBleHRlbnNpb25zLm94Zm10Lm1hcCgoZXh0KSA9PiBjcmVhdGVUYXNrT3B0aW9ucygnbm9kZScsICdub2RlX21vZHVsZXMvLmJpbi9veGZtdCAtLXdyaXRlIC0tbm8tZXJyb3Itb24tdW5tYXRjaGVkLXBhdHRlcm4gISoqL3BhY2thZ2UuanNvbicsICdPeGZtdCcsIGV4dCkpLmpvaW4oJycpIDogJyd9XG4ke2RvZXNDb250YWluSmF2YShjb25maWcpID8gZXh0ZW5zaW9ucy5wcmV0dGllck9ubHkubWFwKChleHQpID0+IGNyZWF0ZVRhc2tPcHRpb25zKCdub2RlJywgJ25vZGVfbW9kdWxlcy8uYmluL3ByZXR0aWVyIC0tY2FjaGUgLS13cml0ZScsICdQcmV0dGllcicsIGV4dCkpLmpvaW4oJycpIDogJyd9XG4gIDwvY29tcG9uZW50PlxuPC9wcm9qZWN0PlxuYDtcbn1cbiIsImltcG9ydCB0eXBlIHsgUGFja2FnZUpzb24gfSBmcm9tICd0eXBlLWZlc3QnO1xuXG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcblxuZXhwb3J0IGZ1bmN0aW9uIGdldEdlbkkxOG5Uc0NvbW1hbmQoXG4gIGNvbmZpZzogUGljazxQYWNrYWdlQ29uZmlnLCAnZGVwZW5kaW5nJyB8ICdpc0J1bic+LFxuICBzY3JpcHRzOiBQYWNrYWdlSnNvbi5TY3JpcHRzIHwgdW5kZWZpbmVkXG4pOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBpZiAoIWNvbmZpZy5kZXBlbmRpbmcuZ2VuSTE4blRzIHx8ICFzY3JpcHRzPy5bJ2dlbi1pMThuLXRzJ10pIHJldHVybiB1bmRlZmluZWQ7XG4gIHJldHVybiBgJHtjb25maWcuaXNCdW4gPyAnYnVuJyA6ICd5YXJuJ30gcnVuIGdlbi1pMThuLXRzID4gL2Rldi9udWxsYDtcbn1cbiIsImltcG9ydCB0eXBlIHsgU3Bhd25TeW5jT3B0aW9ucyB9IGZyb20gJ25vZGU6Y2hpbGRfcHJvY2Vzcyc7XG5pbXBvcnQgY2hpbGRfcHJvY2VzcyBmcm9tICdub2RlOmNoaWxkX3Byb2Nlc3MnO1xuXG5leHBvcnQgZnVuY3Rpb24gc3Bhd25TeW5jKGNvbW1hbmQ6IHN0cmluZywgYXJnczogc3RyaW5nW10sIGN3ZDogc3RyaW5nLCByZXRyeSA9IDApOiB2b2lkIHtcbiAgc3Bhd25TeW5jQW5kUmV0dXJuU3RhdHVzKGNvbW1hbmQsIGFyZ3MsIGN3ZCwgcmV0cnkpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gc3Bhd25TeW5jQW5kUmV0dXJuU3RhdHVzKGNvbW1hbmQ6IHN0cmluZywgYXJnczogc3RyaW5nW10sIGN3ZDogc3RyaW5nLCByZXRyeSA9IDApOiBudW1iZXIge1xuICBkbyB7XG4gICAgY29uc3QgW25ld0NtZCwgbmV3QXJncywgb3B0aW9uc10gPSBnZXRTcGF3blN5bmNBcmdzKGNvbW1hbmQsIGFyZ3MsIGN3ZCk7XG4gICAgY29uc29sZS5sb2coYCQgJHtuZXdDbWR9ICR7bmV3QXJncy5qb2luKCcgJyl9IGF0ICR7Y3dkfWApO1xuICAgIGNvbnN0IHJldCA9IGNoaWxkX3Byb2Nlc3Muc3Bhd25TeW5jKG5ld0NtZCwgbmV3QXJncywgb3B0aW9ucyk7XG4gICAgY29uc3Qgc3RhdHVzID0gcmV0LnN0YXR1cyA/PyAxO1xuICAgIGlmIChzdGF0dXMgPT09IDApIGJyZWFrO1xuICAgIGlmIChyZXRyeSA8PSAwKSByZXR1cm4gc3RhdHVzO1xuICB9IHdoaWxlICgtLXJldHJ5ID49IDApO1xuICByZXR1cm4gMDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHNwYXduU3luY0FuZFJldHVyblN0ZG91dChjb21tYW5kOiBzdHJpbmcsIGFyZ3M6IHN0cmluZ1tdLCBjd2Q6IHN0cmluZyk6IHN0cmluZyB7XG4gIGNvbnN0IFtuZXdDbWQsIG5ld0FyZ3MsIG9wdGlvbnNdID0gZ2V0U3Bhd25TeW5jQXJncyhjb21tYW5kLCBhcmdzLCBjd2QpO1xuICBvcHRpb25zLnN0ZGlvID0gJ3BpcGUnO1xuICBjb25zdCBwcm9jID0gY2hpbGRfcHJvY2Vzcy5zcGF3blN5bmMobmV3Q21kLCBuZXdBcmdzLCBvcHRpb25zKTtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bm5lY2Vzc2FyeS1jb25kaXRpb24gLS0gc3Bhd25TeW5jIHJldHVybnMgbnVsbCBzdGRlcnIgb24gRU5PRU5ULlxuICBjb25zdCBzdGRlcnIgPSBwcm9jLnN0ZGVyciA/PyAnJztcbiAgY29uc3QgZXJyb3IgPSB0eXBlb2Ygc3RkZXJyID09PSAnc3RyaW5nJyA/IHN0ZGVyci50cmltKCkgOiBzdGRlcnIudG9TdHJpbmcoKS50cmltKCk7XG4gIGlmIChwcm9jLmVycm9yKSB7XG4gICAgY29uc29sZS5lcnJvcihgJHtuZXdDbWR9IFske25ld0FyZ3MubWFwKChzKSA9PiBgXCIke3N9XCJgKS5qb2luKCcsICcpfV0gZmFpbGVkIHdpdGg6ICR7cHJvYy5lcnJvci5tZXNzYWdlfWApO1xuICB9IGVsc2UgaWYgKGVycm9yKSB7XG4gICAgY29uc29sZS5lcnJvcihcbiAgICAgIGAke25ld0NtZH0gWyR7bmV3QXJncy5tYXAoKHMpID0+IGBcIiR7c31cImApLmpvaW4oJywgJyl9XSBvdXRwdXRzIHRoZSBmb2xsb3dpbmcgY29udGVudCB0byBzdGRlcnI6XFxuJHtlcnJvcn1gXG4gICAgKTtcbiAgfVxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVubmVjZXNzYXJ5LWNvbmRpdGlvbiAtLSBzcGF3blN5bmMgcmV0dXJucyBudWxsIHN0ZG91dCBvbiBFTk9FTlQuXG4gIGNvbnN0IHN0ZG91dCA9IHByb2Muc3Rkb3V0ID8/ICcnO1xuICByZXR1cm4gdHlwZW9mIHN0ZG91dCA9PT0gJ3N0cmluZycgPyBzdGRvdXQudHJpbSgpIDogc3Rkb3V0LnRvU3RyaW5nKCkudHJpbSgpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0U3Bhd25TeW5jQXJncyhjb21tYW5kOiBzdHJpbmcsIGFyZ3M6IHN0cmluZ1tdLCBjd2Q6IHN0cmluZyk6IFtzdHJpbmcsIHN0cmluZ1tdLCBTcGF3blN5bmNPcHRpb25zXSB7XG4gIGNvbnN0IGVudiA9IHsgLi4ucHJvY2Vzcy5lbnYgfTtcbiAgLy8gUmVtb3ZlIGJlcnJ5IGZyb20gUEFUSFxuICBpZiAoZW52LlBBVEggJiYgZW52LkJFUlJZX0JJTl9GT0xERVIpIHtcbiAgICBlbnYuUEFUSCA9IGVudi5QQVRILnNwbGl0KCc6JylcbiAgICAgIC5maWx0ZXIoKHApID0+IHAgIT09IGVudi5CRVJSWV9CSU5fRk9MREVSKVxuICAgICAgLmpvaW4oJzonKTtcbiAgfVxuXG4gIHJldHVybiBbXG4gICAgY29tbWFuZCxcbiAgICBhcmdzLFxuICAgIHtcbiAgICAgIGN3ZCxcbiAgICAgIGVudixcbiAgICAgIGVuY29kaW5nOiAndXRmOCcsXG4gICAgICBzaGVsbDogZmFsc2UsXG4gICAgICBzdGRpbzogJ2luaGVyaXQnLFxuICAgIH0sXG4gIF07XG59XG4iLCJpbXBvcnQgY2hpbGRQcm9jZXNzIGZyb20gJ25vZGU6Y2hpbGRfcHJvY2Vzcyc7XG5cbmltcG9ydCB7IE9jdG9raXQgfSBmcm9tICdAb2N0b2tpdC9jb3JlJztcblxuY2xhc3MgR2l0SHViVXRpbCB7XG4gIGdldE9yZ0FuZE5hbWUodXJsT3JGdWxsTmFtZTogc3RyaW5nKTogW3N0cmluZywgc3RyaW5nXSB7XG4gICAgY29uc3QgdXJsV2l0aG91dFByb3RvY29sID0gdXJsT3JGdWxsTmFtZS5zcGxpdCgnOicpLmF0KC0xKTtcbiAgICBjb25zdCBuYW1lcyA9IHVybFdpdGhvdXRQcm90b2NvbD8uc3BsaXQoJy8nKTtcbiAgICBjb25zdCBvcmcgPSBuYW1lcz8uYXQoLTIpID8/ICcnO1xuICAgIGNvbnN0IG5hbWUgPSBuYW1lcz8uYXQoLTEpPy5yZXBsYWNlKC8uZ2l0JC8sICcnKSA/PyAnJztcbiAgICByZXR1cm4gW29yZywgbmFtZV07XG4gIH1cbn1cbmV4cG9ydCBjb25zdCBnaXRIdWJVdGlsID0gbmV3IEdpdEh1YlV0aWwoKTtcblxuY29uc3Qgb2N0b2tpdENhY2hlID0gbmV3IE1hcDxzdHJpbmcsIE9jdG9raXQ+KCk7XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRPY3Rva2l0KG93bmVyPzogc3RyaW5nKTogT2N0b2tpdCB7XG4gIGNvbnN0IGtleSA9IG93bmVyID8/ICcnO1xuICBjb25zdCBjYWNoZWQgPSBvY3Rva2l0Q2FjaGUuZ2V0KGtleSk7XG4gIGlmIChjYWNoZWQpIHJldHVybiBjYWNoZWQ7XG5cbiAgY29uc3Qgb2N0b2tpdCA9IG5ldyBPY3Rva2l0KHtcbiAgICBhdXRoOiBnZXRHaXRIdWJUb2tlbihvd25lcikgfHwgdW5kZWZpbmVkLFxuICB9KTtcbiAgb2N0b2tpdENhY2hlLnNldChrZXksIG9jdG9raXQpO1xuICByZXR1cm4gb2N0b2tpdDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGhhc0dpdEh1YlRva2VuKG93bmVyOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgcmV0dXJuICEhZ2V0R2l0SHViVG9rZW4ob3duZXIpO1xufVxuXG5mdW5jdGlvbiBnZXRHaXRIdWJUb2tlbihvd25lcj86IHN0cmluZyk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGlmIChvd25lciA9PT0gJ1dpbGxCb29zdGVyJykge1xuICAgIHJldHVybiBwcm9jZXNzLmVudi5HSF9CT1RfUEFUX0ZPUl9XSUxMQk9PU1RFUiB8fCBnZXRHaXRIdWJDbGlUb2tlbigpO1xuICB9XG4gIGlmIChvd25lciA9PT0gJ1dpbGxCb29zdGVyTGFiJykge1xuICAgIHJldHVybiBwcm9jZXNzLmVudi5HSF9CT1RfUEFUX0ZPUl9XSUxMQk9PU1RFUkxBQiB8fCBnZXRHaXRIdWJDbGlUb2tlbigpO1xuICB9XG4gIHJldHVybiAoXG4gICAgcHJvY2Vzcy5lbnYuR0hfQk9UX1BBVF9GT1JfV0lMTEJPT1NURVIgfHxcbiAgICBwcm9jZXNzLmVudi5HSF9CT1RfUEFUX0ZPUl9XSUxMQk9PU1RFUkxBQiB8fFxuICAgIHByb2Nlc3MuZW52LkdIX1RPS0VOIHx8XG4gICAgcHJvY2Vzcy5lbnYuR0lUSFVCX1RPS0VOIHx8XG4gICAgZ2V0R2l0SHViQ2xpVG9rZW4oKVxuICApO1xufVxuXG5sZXQgZ2l0SHViQ2xpVG9rZW46IHN0cmluZyB8IHVuZGVmaW5lZDtcblxuZnVuY3Rpb24gZ2V0R2l0SHViQ2xpVG9rZW4oKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgaWYgKGdpdEh1YkNsaVRva2VuICE9PSB1bmRlZmluZWQpIHJldHVybiBnaXRIdWJDbGlUb2tlbiB8fCB1bmRlZmluZWQ7XG5cbiAgdHJ5IHtcbiAgICAvLyBTb21lIGxvY2FsIHJ1bnMgcmVseSBvbiBHaXRIdWIgQ0xJIGF1dGhlbnRpY2F0aW9uIGluc3RlYWQgb2YgZXhwb3J0ZWQgZW52IHRva2Vucy5cbiAgICBnaXRIdWJDbGlUb2tlbiA9XG4gICAgICBjaGlsZFByb2Nlc3NcbiAgICAgICAgLmV4ZWNGaWxlU3luYygnZ2gnLCBbJ2F1dGgnLCAndG9rZW4nXSwge1xuICAgICAgICAgIGVuY29kaW5nOiAndXRmOCcsXG4gICAgICAgICAgc3RkaW86IFsnaWdub3JlJywgJ3BpcGUnLCAnaWdub3JlJ10sXG4gICAgICAgIH0pXG4gICAgICAgIC50cmltKCkgfHwgJyc7XG4gIH0gY2F0Y2gge1xuICAgIGdpdEh1YkNsaVRva2VuID0gJyc7XG4gIH1cbiAgcmV0dXJuIGdpdEh1YkNsaVRva2VuIHx8IHVuZGVmaW5lZDtcbn1cbiIsImltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuXG5leHBvcnQgY29uc3QgbWFuYWdlZFRzY29uZmlnQmFzZURlcGVuZGVuY2llcyA9IFtcbiAgJ0B0c2NvbmZpZy9idW4nLFxuICAnQHRzY29uZmlnL25vZGUtbHRzJyxcbiAgJ0B0c2NvbmZpZy9ub2RlLXRzJyxcbiAgJ0B0c2NvbmZpZy9yZWFjdC1uYXRpdmUnLFxuXTtcblxuZXhwb3J0IGZ1bmN0aW9uIGdldFRzY29uZmlnRXh0ZW5kcyhjb25maWc6IFBhY2thZ2VDb25maWcpOiBzdHJpbmcgfCBzdHJpbmdbXSB7XG4gIGlmIChjb25maWcuaXNCdW4pIHtcbiAgICByZXR1cm4gJ0B0c2NvbmZpZy9idW4vdHNjb25maWcuanNvbic7XG4gIH1cbiAgaWYgKGNvbmZpZy5kZXBlbmRpbmcucmVhY3ROYXRpdmUpIHtcbiAgICByZXR1cm4gJ0B0c2NvbmZpZy9yZWFjdC1uYXRpdmUvdHNjb25maWcuanNvbic7XG4gIH1cbiAgcmV0dXJuIFsnQHRzY29uZmlnL25vZGUtbHRzL3RzY29uZmlnLmpzb24nLCAnQHRzY29uZmlnL25vZGUtdHMvdHNjb25maWcuanNvbiddO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0VHNjb25maWdCYXNlRGVwZW5kZW5jaWVzKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IHN0cmluZ1tdIHtcbiAgaWYgKGNvbmZpZy5kZXBlbmRpbmcuYmxpdHogfHwgY29uZmlnLmRlcGVuZGluZy5uZXh0KSB7XG4gICAgcmV0dXJuIFtdO1xuICB9XG4gIGlmIChjb25maWcuaXNCdW4pIHtcbiAgICByZXR1cm4gWydAdHNjb25maWcvYnVuJ107XG4gIH1cbiAgaWYgKGNvbmZpZy5kZXBlbmRpbmcucmVhY3ROYXRpdmUpIHtcbiAgICByZXR1cm4gWydAdHNjb25maWcvcmVhY3QtbmF0aXZlJ107XG4gIH1cbiAgcmV0dXJuIFsnQHRzY29uZmlnL25vZGUtbHRzJywgJ0B0c2NvbmZpZy9ub2RlLXRzJ107XG59XG4iLCJpbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcblxuZXhwb3J0IGZ1bmN0aW9uIGlzUHVibGlzaGVkV2lsbGJvb3N0ZXJDb25maWdzUGFja2FnZShjb25maWc6IFBhY2thZ2VDb25maWcpOiBib29sZWFuIHtcbiAgcmV0dXJuIChcbiAgICBjb25maWcuaXNXaWxsQm9vc3RlckNvbmZpZ3MgJiZcbiAgICAhY29uZmlnLmlzUm9vdCAmJlxuICAgIGNvbmZpZy5wYWNrYWdlSnNvbj8ucHJpdmF0ZSAhPT0gdHJ1ZSAmJlxuICAgIEFycmF5LmlzQXJyYXkoY29uZmlnLnBhY2thZ2VKc29uPy5maWxlcykgJiZcbiAgICBjb25maWcucGFja2FnZUpzb24uZmlsZXMubGVuZ3RoID4gMFxuICApO1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IG1lcmdlIGZyb20gJ2RlZXBtZXJnZSc7XG5pbXBvcnQgZmcgZnJvbSAnZmFzdC1nbG9iJztcbmltcG9ydCB7IHNvcnRQYWNrYWdlSnNvbiB9IGZyb20gJ3NvcnQtcGFja2FnZS1qc29uJztcbmltcG9ydCB0cyBmcm9tICd0eXBlc2NyaXB0JztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUpzb24sIFNldFJlcXVpcmVkIH0gZnJvbSAndHlwZS1mZXN0JztcblxuaW1wb3J0IHsgZ2V0TGF0ZXN0Q29tbWl0SGFzaCB9IGZyb20gJy4uL2dpdGh1Yi9jb21taXQuanMnO1xuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZXh0ZW5zaW9ucyB9IGZyb20gJy4uL3V0aWxzL2V4dGVuc2lvbnMuanMnO1xuaW1wb3J0IHsgZnNVdGlsIH0gZnJvbSAnLi4vdXRpbHMvZnNVdGlsLmpzJztcbmltcG9ydCB7IGdldEdlbkkxOG5Uc0NvbW1hbmQgfSBmcm9tICcuLi91dGlscy9nZW5JMThuVHMuanMnO1xuaW1wb3J0IHsgZ2l0SHViVXRpbCB9IGZyb20gJy4uL3V0aWxzL2dpdGh1YlV0aWwuanMnO1xuaW1wb3J0IHsgZ2xvYklnbm9yZSB9IGZyb20gJy4uL3V0aWxzL2dsb2JVdGlsLmpzJztcbmltcG9ydCB7IGlnbm9yZUZpbGVVdGlsIH0gZnJvbSAnLi4vdXRpbHMvaWdub3JlRmlsZVV0aWwuanMnO1xuaW1wb3J0IHsgY29tYmluZU1lcmdlIH0gZnJvbSAnLi4vdXRpbHMvbWVyZ2VVdGlsLmpzJztcbmltcG9ydCB7IGRvZXNDb250YWluSmF2YSwgZG9lc0NvbnRhaW5Kc09yVHMgfSBmcm9tICcuLi91dGlscy9wYWNrYWdlQ2FwYWJpbGl0aWVzLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuaW1wb3J0IHsgc3Bhd25TeW5jLCBzcGF3blN5bmNBbmRSZXR1cm5TdGRvdXQgfSBmcm9tICcuLi91dGlscy9zcGF3blV0aWwuanMnO1xuaW1wb3J0IHsgZ2V0VHNjb25maWdCYXNlRGVwZW5kZW5jaWVzLCBtYW5hZ2VkVHNjb25maWdCYXNlRGVwZW5kZW5jaWVzIH0gZnJvbSAnLi4vdXRpbHMvdHNjb25maWdCYXNlLmpzJztcbmltcG9ydCB7IGlzUHVibGlzaGVkV2lsbGJvb3N0ZXJDb25maWdzUGFja2FnZSB9IGZyb20gJy4uL3V0aWxzL3dpbGxib29zdGVyQ29uZmlnc1V0aWwuanMnO1xuXG5jb25zdCBveGxpbnREZXBzID0gWydAd2lsbGJvb3N0ZXIvb3hmbXQtY29uZmlnJywgJ0B3aWxsYm9vc3Rlci9veGxpbnQtY29uZmlnJywgJ294Zm10JywgJ294bGludCcsICdveGxpbnQtdHNnb2xpbnQnXTtcbmNvbnN0IHR5cGVzY3JpcHRHb0RlcGVuZGVuY3kgPSAnQHR5cGVzY3JpcHQvbmF0aXZlLXByZXZpZXcnO1xuY29uc3QgdHlwZXNjcmlwdERlcGVuZGVuY3kgPSAndHlwZXNjcmlwdCc7XG5jb25zdCB3YkRlcGVuZGVuY3kgPSAnQHdpbGxib29zdGVyL3diJztcbmNvbnN0IGJ1aWxkVHNEZXBlbmRlbmN5ID0gJ2J1aWxkLXRzJztcbmNvbnN0IHdpbGxCb29zdGVyQ29uZmlnc01hbmFnZWREZXBlbmRlbmNpZXMgPSBbXG4gICdAd2lsbGJvb3N0ZXIvcHJldHRpZXItY29uZmlnJyxcbiAgLi4ub3hsaW50RGVwcy5maWx0ZXIoKGRlcGVuZGVuY3kpID0+IGRlcGVuZGVuY3kuc3RhcnRzV2l0aCgnQHdpbGxib29zdGVyLycpKSxcbl07XG5jb25zdCBvYnNvbGV0ZUxpbnREZXBlbmRlbmNpZXMgPSBbXG4gICdAYmlvbWVqcy9iaW9tZScsXG4gICdAZXNsaW50LXJlYWN0L2VzbGludC1wbHVnaW4nLFxuICAnQGVzbGludC9qcycsXG4gICdAbmV4dC9lc2xpbnQtcGx1Z2luLW5leHQnLFxuICAnQHR5cGVzL2VzbGludCcsXG4gICdAdHlwZXMvbWljcm9tYXRjaCcsXG4gICdAdHlwZXNjcmlwdC1lc2xpbnQvZXNsaW50LXBsdWdpbicsXG4gICdAdHlwZXNjcmlwdC1lc2xpbnQvcGFyc2VyJyxcbiAgJ0B3aWxsYm9vc3Rlci9iaW9tZS1jb25maWcnLFxuICAnQHdpbGxib29zdGVyL2VzbGludC1jb25maWcnLFxuICAnQHdpbGxib29zdGVyL2VzbGludC1jb25maWctYmxpdHotbmV4dCcsXG4gICdAd2lsbGJvb3N0ZXIvZXNsaW50LWNvbmZpZy1qcycsXG4gICdAd2lsbGJvb3N0ZXIvZXNsaW50LWNvbmZpZy1qcy1yZWFjdCcsXG4gICdAd2lsbGJvb3N0ZXIvZXNsaW50LWNvbmZpZy1uZXh0JyxcbiAgJ0B3aWxsYm9vc3Rlci9lc2xpbnQtY29uZmlnLXJlYWN0JyxcbiAgJ0B3aWxsYm9vc3Rlci9lc2xpbnQtY29uZmlnLXRzJyxcbiAgJ0B3aWxsYm9vc3Rlci9lc2xpbnQtY29uZmlnLXRzLXJlYWN0JyxcbiAgJ2Jpb21lJyxcbiAgJ2VzbGludCcsXG4gICdlc2xpbnQtY29uZmlnLWZsYXQtZ2l0aWdub3JlJyxcbiAgJ2VzbGludC1jb25maWctbmV4dCcsXG4gICdlc2xpbnQtY29uZmlnLXByZXR0aWVyJyxcbiAgJ2VzbGludC1pbXBvcnQtcmVzb2x2ZXItbm9kZScsXG4gICdlc2xpbnQtaW1wb3J0LXJlc29sdmVyLXR5cGVzY3JpcHQnLFxuICAnZXNsaW50LXBsdWdpbi1pbXBvcnQnLFxuICAnZXNsaW50LXBsdWdpbi1pbXBvcnQteCcsXG4gICdlc2xpbnQtcGx1Z2luLXBlcmZlY3Rpb25pc3QnLFxuICAnZXNsaW50LXBsdWdpbi1wcmV0dGllcicsXG4gICdlc2xpbnQtcGx1Z2luLXJlYWN0JyxcbiAgJ2VzbGludC1wbHVnaW4tcmVhY3QtY29tcGlsZXInLFxuICAnZXNsaW50LXBsdWdpbi1yZWFjdC1ob29rcycsXG4gICdlc2xpbnQtcGx1Z2luLXNvcnQtY2xhc3MtbWVtYmVycycsXG4gICdlc2xpbnQtcGx1Z2luLXNvcnQtZGVzdHJ1Y3R1cmUta2V5cycsXG4gICdlc2xpbnQtcGx1Z2luLXN0b3J5Ym9vaycsXG4gICdlc2xpbnQtcGx1Z2luLXVuaWNvcm4nLFxuICAnZXNsaW50LXBsdWdpbi11bnVzZWQtaW1wb3J0cycsXG4gICdnbG9iYWxzJyxcbiAgJ21pY3JvbWF0Y2gnLFxuICAndHlwZXNjcmlwdC1lc2xpbnQnLFxuXTtcbmNvbnN0IG1pY3JvbWF0Y2hQYWNrYWdlTmFtZXMgPSBuZXcgU2V0KFsnbWljcm9tYXRjaCcsICdAdHlwZXMvbWljcm9tYXRjaCddKTtcbmNvbnN0IG1pY3JvbWF0Y2hJbXBvcnRQYXR0ZXJuID1cbiAgL1xcYmZyb21cXHMrWydcIl1taWNyb21hdGNoWydcIl18XFxicmVxdWlyZVxcKFxccypbJ1wiXW1pY3JvbWF0Y2hbJ1wiXVxccypcXCl8XFxiaW1wb3J0XFwoXFxzKlsnXCJdbWljcm9tYXRjaFsnXCJdXFxzKlxcKS91O1xuXG5jb25zdCBsYXRlc3REZXBlbmRlbmN5VmVyc2lvbkNhY2hlID0gbmV3IE1hcDxzdHJpbmcsIHN0cmluZz4oKTtcbmNvbnN0IGRlcGVuZGVuY3lTZWN0aW9uS2V5cyA9IFsnZGVwZW5kZW5jaWVzJywgJ2RldkRlcGVuZGVuY2llcycsICdvcHRpb25hbERlcGVuZGVuY2llcycsICdwZWVyRGVwZW5kZW5jaWVzJ10gYXMgY29uc3Q7XG5cbnR5cGUgV3JpdGFibGVQYWNrYWdlSnNvbiA9IFNldFJlcXVpcmVkPFxuICBQYWNrYWdlSnNvbixcbiAgJ3NjcmlwdHMnIHwgJ2RlcGVuZGVuY2llcycgfCAnZGV2RGVwZW5kZW5jaWVzJyB8ICdwZWVyRGVwZW5kZW5jaWVzJ1xuPjtcblxuaW50ZXJmYWNlIERlcGVuZGVuY3lVcGRhdGVzIHtcbiAgZGVwZW5kZW5jaWVzOiBzdHJpbmdbXTtcbiAgZGV2RGVwZW5kZW5jaWVzOiBzdHJpbmdbXTtcbiAgcHl0aG9uRGV2RGVwZW5kZW5jaWVzOiBzdHJpbmdbXTtcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlUGFja2FnZUpzb24oXG4gIGNvbmZpZzogUGFja2FnZUNvbmZpZyxcbiAgcm9vdENvbmZpZzogUGFja2FnZUNvbmZpZyxcbiAgc2tpcEFkZGluZ0RlcHM6IGJvb2xlYW5cbik6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2dlbmVyYXRlUGFja2FnZUpzb24nLCBhc3luYyAoKSA9PiB7XG4gICAgYXdhaXQgY29yZShjb25maWcsIHJvb3RDb25maWcsIHNraXBBZGRpbmdEZXBzKTtcbiAgfSk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGNvcmUoY29uZmlnOiBQYWNrYWdlQ29uZmlnLCByb290Q29uZmlnOiBQYWNrYWdlQ29uZmlnLCBza2lwQWRkaW5nRGVwczogYm9vbGVhbik6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBmaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJ3BhY2thZ2UuanNvbicpO1xuICBjb25zdCBqc29uT2JqID0gYXdhaXQgcmVhZFBhY2thZ2VKc29uKGZpbGVQYXRoKTtcbiAgY29uc3QgcGFja2FnZU1hbmFnZXIgPSBjb25maWcuaXNCdW4gPyAnYnVuJyA6ICd5YXJuJztcblxuICBhd2FpdCByZW1vdmVEZXByZWNhdGVkU3R1ZmYoY29uZmlnLCBqc29uT2JqKTtcbiAgYXdhaXQgdXBkYXRlU2NyaXB0cyhjb25maWcsIGpzb25PYmopO1xuICBtb3ZlTWFuYWdlZFRvb2xEZXBlbmRlbmNpZXNUb0RldkRlcGVuZGVuY2llcyhqc29uT2JqKTtcbiAgY29uc3QgZGVwZW5kZW5jeVVwZGF0ZXMgPSBhd2FpdCBhcHBseVBhY2thZ2VKc29uQ29udmVudGlvbnMoY29uZmlnLCByb290Q29uZmlnLCBqc29uT2JqKTtcbiAgYXdhaXQgbm9ybWFsaXplUGFja2FnZU1ldGFkYXRhKGNvbmZpZywgcm9vdENvbmZpZywganNvbk9iaiwgZGVwZW5kZW5jeVVwZGF0ZXMpO1xuICBhZGREZXBlbmRlbmN5VmVyc2lvbnNUb1BhY2thZ2VKc29uKGpzb25PYmosIGRlcGVuZGVuY3lVcGRhdGVzKTtcbiAgYXdhaXQgdXBkYXRlUHJpdmF0ZVBhY2thZ2VzKGpzb25PYmopO1xuICByZW1vdmVFbXB0eURlcGVuZGVuY3lTZWN0aW9ucyhqc29uT2JqKTtcblxuICBpZiAoY29uZmlnLmlzQnVuKSBkZWxldGUganNvbk9iai5wYWNrYWdlTWFuYWdlcjtcbiAgLy8gWWFybiByZWFkcyBwYWNrYWdlLmpzb24gZnJvbSBkaXNrIGJlZm9yZSBkZWNpZGluZyB3aGV0aGVyIGB5YXJuIGFkZCAtRGBcbiAgLy8gY29uZmxpY3RzIHdpdGggYW4gZXhpc3RpbmcgcmVndWxhciBkZXBlbmRlbmN5LCBzbyB0aGlzIHdyaXRlIG11c3QgZmluaXNoXG4gIC8vIGJlZm9yZSBpbnN0YWxsaW5nIHRoZSBtYW5hZ2VkIGRlcGVuZGVuY3kgdXBkYXRlcyBiZWxvdy4gS2VlcCB0aGlzIGJhc2VsaW5lXG4gIC8vIGZpbGUgc29ydGVkIGV2ZW4gd2hlbiB3ZSBsYXRlciBydW4gdGhlIHRhcmdldCByZXBvc2l0b3J5J3MgZm9ybWF0dGVyIHNvIGFcbiAgLy8gbWlkLXJ1biBpbnRlcnJ1cHRpb24gbmV2ZXIgbGVhdmVzIHBhY2thZ2UuanNvbiBpbiBhIHBhcnRpYWxseSBtYW5hZ2VkIG9yZGVyLlxuICBhd2FpdCBmc1V0aWwuZ2VuZXJhdGVGaWxlKGZpbGVQYXRoLCBzZXJpYWxpemVQYWNrYWdlSnNvbihqc29uT2JqKSk7XG5cbiAgaWYgKCFza2lwQWRkaW5nRGVwcykge1xuICAgIGluc3RhbGxEZXBlbmRlbmN5VXBkYXRlcyhjb25maWcsIGpzb25PYmosIGRlcGVuZGVuY3lVcGRhdGVzLCBwYWNrYWdlTWFuYWdlcik7XG4gICAgZm9ybWF0UGFja2FnZUpzb25XaXRoUHJvamVjdEZvcm1hdHRlcihjb25maWcsIHBhY2thZ2VNYW5hZ2VyLCBmaWxlUGF0aCk7XG4gIH1cbn1cblxuZnVuY3Rpb24gc2VyaWFsaXplUGFja2FnZUpzb24oanNvbk9iajogV3JpdGFibGVQYWNrYWdlSnNvbik6IHN0cmluZyB7XG4gIC8vIGZzVXRpbC5nZW5lcmF0ZUZpbGUoKSBub3JtYWxpemVzIHRoZSB0cmFpbGluZyBuZXdsaW5lLCBzbyBrZWVwIHRoZSBzZXJpYWxpemVyXG4gIC8vIGZvY3VzZWQgb24gdGhlIEpTT04gcGF5bG9hZCBpdHNlbGYuXG4gIHJldHVybiBKU09OLnN0cmluZ2lmeShzb3J0UGFja2FnZUpzb24oanNvbk9iaiksIHVuZGVmaW5lZCwgMik7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHJlYWRQYWNrYWdlSnNvbihmaWxlUGF0aDogc3RyaW5nKTogUHJvbWlzZTxXcml0YWJsZVBhY2thZ2VKc29uPiB7XG4gIGNvbnN0IGpzb25UZXh0ID0gYXdhaXQgZnMucHJvbWlzZXMucmVhZEZpbGUoZmlsZVBhdGgsICd1dGY4Jyk7XG4gIGNvbnN0IGpzb25PYmogPSBKU09OLnBhcnNlKGpzb25UZXh0KSBhcyBQYWNrYWdlSnNvbjtcbiAganNvbk9iai5zY3JpcHRzID0ganNvbk9iai5zY3JpcHRzID8/IHt9O1xuICBqc29uT2JqLmRlcGVuZGVuY2llcyA9IGpzb25PYmouZGVwZW5kZW5jaWVzID8/IHt9O1xuICBqc29uT2JqLmRldkRlcGVuZGVuY2llcyA9IGpzb25PYmouZGV2RGVwZW5kZW5jaWVzID8/IHt9O1xuICBqc29uT2JqLnBlZXJEZXBlbmRlbmNpZXMgPSBqc29uT2JqLnBlZXJEZXBlbmRlbmNpZXMgPz8ge307XG4gIHJldHVybiBqc29uT2JqIGFzIFdyaXRhYmxlUGFja2FnZUpzb247XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHVwZGF0ZVNjcmlwdHMoY29uZmlnOiBQYWNrYWdlQ29uZmlnLCBqc29uT2JqOiBXcml0YWJsZVBhY2thZ2VKc29uKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJlbW92ZUxlZ2FjeUluc3RhbGxDb21tYW5kcyhqc29uT2JqLnNjcmlwdHMpO1xuXG4gIGpzb25PYmouc2NyaXB0cyA9IHsgLi4uanNvbk9iai5zY3JpcHRzLCAuLi5nZW5lcmF0ZVNjcmlwdHMoY29uZmlnLCBqc29uT2JqLnNjcmlwdHMpIH07XG4gIGRlbGV0ZSBqc29uT2JqLnNjcmlwdHNbJ3N0YXJ0LXRlc3Qtc2VydmVyJ107XG5cbiAgY29uc3Qgc2NyaXB0cyA9IGpzb25PYmouc2NyaXB0cztcbiAgaWYgKGNvbmZpZy5pc0J1biB8fCAhZG9lc0NvbnRhaW5KYXZhKGNvbmZpZykpIHtcbiAgICBkZWxldGUgc2NyaXB0cy5wcmV0dGlmeTtcbiAgfSBlbHNlIHtcbiAgICBzY3JpcHRzLnByZXR0aWZ5ID0gKHNjcmlwdHMucHJldHRpZnkgPz8gJycpICsgKGF3YWl0IGdlbmVyYXRlUHJldHRpZXJTdWZmaXgoY29uZmlnLmRpclBhdGgpKTtcbiAgfVxuICBub3JtYWxpemVZYXJuV29ya3NwYWNlRm9yZWFjaFNjcmlwdHMoc2NyaXB0cyk7XG59XG5cbmZ1bmN0aW9uIHJlbW92ZUxlZ2FjeUluc3RhbGxDb21tYW5kcyhzY3JpcHRzOiBQYWNrYWdlSnNvbi5TY3JpcHRzKTogdm9pZCB7XG4gIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKHNjcmlwdHMpKSB7XG4gICAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gJ3N0cmluZycpIGNvbnRpbnVlO1xuICAgIC8vIEZyZXNoIHJlcG9zIHN0aWxsIHJlcXVpcmUgc3RhbmRhbG9uZSBgeWFybiBpbnN0YWxsYDsgb25seSByZW1vdmUgbGVnYWN5IGluc3RhbGwgcHJlZml4ZXMgYmVmb3JlIGFub3RoZXIgY29tbWFuZC5cbiAgICBpZiAoIXZhbHVlLmluY2x1ZGVzKCdnaXQgY2xvbmUnKSkge1xuICAgICAgc2NyaXB0c1trZXldID0gdmFsdWUucmVwbGFjZUFsbCgveWFyblxccyooPzppbnN0YWxsXFxzKik/JiZcXHMqL2d1LCAnJyk7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIG5vcm1hbGl6ZVlhcm5Xb3Jrc3BhY2VGb3JlYWNoU2NyaXB0cyhzY3JpcHRzOiBQYWNrYWdlSnNvbi5TY3JpcHRzKTogdm9pZCB7XG4gIC8vIERlYWwgd2l0aCBicmVha2luZyBjaGFuZ2VzIGluIHlhcm4gYmVycnkgNC4wLjAtcmMuNDlcbiAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMoc2NyaXB0cykpIHtcbiAgICBpZiAoIXZhbHVlPy5pbmNsdWRlcygneWFybiB3b3Jrc3BhY2VzIGZvcmVhY2gnKSkgY29udGludWU7XG4gICAgc2NyaXB0c1trZXldID0gdmFsdWUucmVwbGFjZUFsbChcbiAgICAgIC95YXJuIHdvcmtzcGFjZXMgZm9yZWFjaCg/IVxccysoPzotQXwtUnwtLSg/OmFsbHxyZWN1cnNpdmV8c2luY2V8d29ya3RyZWV8ZnJvbXxpbmNsdWRlfGV4Y2x1ZGV8cHVibGljfHByaXZhdGUpKSkvZ3UsXG4gICAgICAneWFybiB3b3Jrc3BhY2VzIGZvcmVhY2ggLS1hbGwnXG4gICAgKTtcbiAgfVxufVxuXG5hc3luYyBmdW5jdGlvbiBhcHBseVBhY2thZ2VKc29uQ29udmVudGlvbnMoXG4gIGNvbmZpZzogUGFja2FnZUNvbmZpZyxcbiAgcm9vdENvbmZpZzogUGFja2FnZUNvbmZpZyxcbiAganNvbk9iajogV3JpdGFibGVQYWNrYWdlSnNvblxuKTogUHJvbWlzZTxEZXBlbmRlbmN5VXBkYXRlcz4ge1xuICBjb25zdCBkZXBlbmRlbmNpZXM6IHN0cmluZ1tdID0gW107XG4gIGNvbnN0IGRldkRlcGVuZGVuY2llcyA9IFsnc29ydC1wYWNrYWdlLWpzb24nXTtcbiAgY29uc3QgcHl0aG9uRGV2RGVwZW5kZW5jaWVzOiBzdHJpbmdbXSA9IFtdO1xuICBjb25zdCBoYXNKYXZhID0gZG9lc0NvbnRhaW5KYXZhKGNvbmZpZyk7XG5cbiAgaWYgKFxuICAgIGhhc0phdmEgJiZcbiAgICAhZnMuZXhpc3RzU3luYyhwYXRoLmpvaW4ocm9vdENvbmZpZy5kaXJQYXRoLCAnLnByZXR0aWVycmMuanNvbicpKSAmJlxuICAgICFmcy5leGlzdHNTeW5jKHBhdGguam9pbihjb25maWcuZGlyUGF0aCwgJy5wcmV0dGllcnJjLmpzb24nKSlcbiAgKSB7XG4gICAganNvbk9iai5wcmV0dGllciA9ICdAd2lsbGJvb3N0ZXIvcHJldHRpZXItY29uZmlnJztcbiAgICBkZXZEZXBlbmRlbmNpZXMucHVzaCgncHJldHRpZXItcGx1Z2luLWphdmEnLCAnQHdpbGxib29zdGVyL3ByZXR0aWVyLWNvbmZpZycpO1xuICB9XG4gIGlmIChoYXNKYXZhKSB7XG4gICAgZGV2RGVwZW5kZW5jaWVzLnB1c2goJ3ByZXR0aWVyJyk7XG4gIH0gZWxzZSB7XG4gICAgcmVtb3ZlUHJldHRpZXJBcnRpZmFjdHMoanNvbk9iaik7XG4gIH1cblxuICBkZWxldGUganNvbk9iai5kZXZEZXBlbmRlbmNpZXNbJ2xpbnQtc3RhZ2VkJ107XG4gIGRlbGV0ZSAoanNvbk9iaiBhcyBQYWNrYWdlSnNvbiAmIHsgJ2xpbnQtc3RhZ2VkJz86IHVua25vd24gfSlbJ2xpbnQtc3RhZ2VkJ107XG5cbiAgaWYgKGNvbmZpZy5pc1Jvb3QpIHtcbiAgICBkZWxldGUganNvbk9iai5kZXZEZXBlbmRlbmNpZXMuaHVza3k7XG4gICAgZGVsZXRlIGpzb25PYmouc2NyaXB0cy5wb3N0aW5zdGFsbDtcbiAgICBkZWxldGUganNvbk9iai5zY3JpcHRzLnBvc3RwdWJsaXNoO1xuICAgIGRlbGV0ZSBqc29uT2JqLnNjcmlwdHMucHJlcHVibGlzaE9ubHk7XG4gICAgZGVsZXRlIGpzb25PYmouc2NyaXB0cy5wcmVwYWNrO1xuICAgIGRlbGV0ZSBqc29uT2JqLnNjcmlwdHMucG9zdHBhY2s7XG4gICAganNvbk9iai5zY3JpcHRzLnByZXBhcmUgPSAnbGVmdGhvb2sgaW5zdGFsbCB8fCB0cnVlJztcbiAgICBkZXZEZXBlbmRlbmNpZXMucHVzaCgnbGVmdGhvb2snKTtcblxuICAgIGlmIChjb25maWcuZGVwZW5kaW5nLnNlbWFudGljUmVsZWFzZSkge1xuICAgICAgaWYgKFxuICAgICAgICAhanNvbk9iai5kZXZEZXBlbmRlbmNpZXNbJ3NlbWFudGljLXJlbGVhc2UnXSAmJlxuICAgICAgICAhanNvbk9iai5kZXZEZXBlbmRlbmNpZXNbJ211bHRpLXNlbWFudGljLXJlbGVhc2UnXSAmJlxuICAgICAgICAhanNvbk9iai5kZXZEZXBlbmRlbmNpZXNbJ0BxaXdpL211bHRpLXNlbWFudGljLXJlbGVhc2UnXVxuICAgICAgKSB7XG4gICAgICAgIGRldkRlcGVuZGVuY2llcy5wdXNoKCdzZW1hbnRpYy1yZWxlYXNlJyk7XG4gICAgICB9XG4gICAgICBqc29uT2JqLnZlcnNpb24gPSAnMC4wLjAtc2VtYW50aWNhbGx5LXJlbGVhc2VkJztcbiAgICB9XG5cbiAgICBpZiAoY29uZmlnLmRlcGVuZGluZy5wbGF5d3JpZ2h0VGVzdCkge1xuICAgICAgLy8gU2luY2UgYXJ0aWxsZXJ5IHJlcXVpcmVzIGEgc3BlY2lmaWMgdmVyc2lvbiBvZiBAcGxheXdyaWdodC90ZXN0XG4gICAgICBjb25zdCBoYXNBcnRpbGxlcnkgPSBqc29uT2JqLmRlcGVuZGVuY2llcy5hcnRpbGxlcnkgfHwganNvbk9iai5kZXZEZXBlbmRlbmNpZXMuYXJ0aWxsZXJ5O1xuICAgICAgLy8gU2luY2UgbGxtLXRvb2xib3ggcmVxdWlyZXMgQHBsYXl3cmlnaHQvdGVzdCBpbiBkZXBlbmRlbmNpZXNcbiAgICAgIGlmICghaGFzQXJ0aWxsZXJ5ICYmICFqc29uT2JqLmRlcGVuZGVuY2llc1snQHBsYXl3cmlnaHQvdGVzdCddKSB7XG4gICAgICAgIGRldkRlcGVuZGVuY2llcy5wdXNoKCdAcGxheXdyaWdodC90ZXN0Jyk7XG4gICAgICB9XG4gICAgICBkZWxldGUganNvbk9iai5kZXBlbmRlbmNpZXMucGxheXdyaWdodDtcbiAgICAgIGRlbGV0ZSBqc29uT2JqLmRldkRlcGVuZGVuY2llcy5wbGF5d3JpZ2h0O1xuICAgIH1cblxuICAgIGlmIChjb25maWcuZG9lc0NvbnRhaW5TdWJQYWNrYWdlSnNvbnMpIHtcbiAgICAgIC8vIFdlIGRvbid0IGFsbG93IG5vbi1hcnJheSB3b3Jrc3BhY2VzIGluIG1vbm9yZXBvLlxuICAgICAganNvbk9iai53b3Jrc3BhY2VzID0gQXJyYXkuaXNBcnJheShqc29uT2JqLndvcmtzcGFjZXMpXG4gICAgICAgID8gbWVyZ2UuYWxsKFtqc29uT2JqLndvcmtzcGFjZXMsIFsncGFja2FnZXMvKiddXSwge1xuICAgICAgICAgICAgYXJyYXlNZXJnZTogY29tYmluZU1lcmdlLFxuICAgICAgICAgIH0pXG4gICAgICAgIDogWydwYWNrYWdlcy8qJ107XG4gICAgfSBlbHNlIGlmIChBcnJheS5pc0FycmF5KGpzb25PYmoud29ya3NwYWNlcykpIHtcbiAgICAgIGpzb25PYmoud29ya3NwYWNlcyA9IGpzb25PYmoud29ya3NwYWNlcy5maWx0ZXIoXG4gICAgICAgICh3b3Jrc3BhY2UpID0+XG4gICAgICAgICAgZmcuZ2xvYlN5bmMod29ya3NwYWNlLCB7XG4gICAgICAgICAgICBkb3Q6IHRydWUsXG4gICAgICAgICAgICBjd2Q6IGNvbmZpZy5kaXJQYXRoLFxuICAgICAgICAgICAgaWdub3JlOiBnbG9iSWdub3JlLFxuICAgICAgICAgIH0pLmxlbmd0aCA+IDBcbiAgICAgICk7XG4gICAgICBpZiAoanNvbk9iai53b3Jrc3BhY2VzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICBkZWxldGUganNvbk9iai53b3Jrc3BhY2VzO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGlmICghaXNXYlBhY2thZ2UoanNvbk9iaikpIHtcbiAgICBkZXZEZXBlbmRlbmNpZXMucHVzaCh3YkRlcGVuZGVuY3kpO1xuICB9XG4gIGlmIChjb25maWcuZGVwZW5kaW5nLndiIHx8IGNvbmZpZy5pc0J1bikge1xuICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKGpzb25PYmouc2NyaXB0cykpIHtcbiAgICAgIGlmICh0eXBlb2YgdmFsdWUgIT09ICdzdHJpbmcnKSBjb250aW51ZTtcbiAgICAgIGpzb25PYmouc2NyaXB0c1trZXldID0gdmFsdWUucmVwbGFjZUFsbCgvd2JcXHMrZGIvZ3UsICd3YiBwcmlzbWEnKTtcbiAgICB9XG4gIH1cblxuICAvLyBidWlsZC10cyBvd25zIFR5cGVTY3JpcHQgZXhlY3V0aW9uIGFuZCBkZWNsYXJhdGlvbiBlbWl0LiB3YmZ5IG11c3QgYWx3YXlzXG4gIC8vIGtlZXAgZXhpc3RpbmcgYnVpbGQtdHMgdXNlcnMgY3VycmVudCBiZWNhdXNlIG9sZGVyIHJlbGVhc2VzIGNhbiBlbWl0IC5kLnRzXG4gIC8vIGZpbGVzIGF0IHBhdGhzIHRoYXQgbm8gbG9uZ2VyIG1hdGNoIHBhY2thZ2UgZXhwb3J0cy5cbiAgaWYgKFxuICAgIGpzb25PYmouZGVwZW5kZW5jaWVzW2J1aWxkVHNEZXBlbmRlbmN5XSB8fFxuICAgIGpzb25PYmouZGV2RGVwZW5kZW5jaWVzW2J1aWxkVHNEZXBlbmRlbmN5XSB8fFxuICAgIE9iamVjdC52YWx1ZXMoanNvbk9iai5zY3JpcHRzKS5zb21lKChzY3JpcHQpID0+IHNjcmlwdD8uaW5jbHVkZXMoYnVpbGRUc0RlcGVuZGVuY3kpKVxuICApIHtcbiAgICBkZXZEZXBlbmRlbmNpZXMucHVzaChidWlsZFRzRGVwZW5kZW5jeSk7XG4gIH1cbiAgaWYgKGRvZXNDb250YWluSnNPclRzKGNvbmZpZykpIHtcbiAgICBkZXZEZXBlbmRlbmNpZXMucHVzaCguLi5veGxpbnREZXBzKTtcbiAgfVxuXG4gIGNvbnN0IHRzY29uZmlnQmFzZURlcGVuZGVuY2llcyA9IGRvZXNDb250YWluSnNPclRzKGNvbmZpZykgPyBnZXRUc2NvbmZpZ0Jhc2VEZXBlbmRlbmNpZXMoY29uZmlnKSA6IFtdO1xuICBhd2FpdCByZW1vdmVVbnVzZWRUc2NvbmZpZ0Jhc2VEZXBlbmRlbmNpZXMoY29uZmlnLCBqc29uT2JqLCB0c2NvbmZpZ0Jhc2VEZXBlbmRlbmNpZXMpO1xuICBkZXZEZXBlbmRlbmNpZXMucHVzaCguLi50c2NvbmZpZ0Jhc2VEZXBlbmRlbmNpZXMpO1xuXG4gIGlmIChjb25maWcuZG9lc0NvbnRhaW5UeXBlU2NyaXB0IHx8IGNvbmZpZy5kb2VzQ29udGFpblR5cGVTY3JpcHRJblBhY2thZ2VzKSB7XG4gICAgZGV2RGVwZW5kZW5jaWVzLnB1c2godHlwZXNjcmlwdEdvRGVwZW5kZW5jeSk7XG4gICAgaWYgKGNvbmZpZy5kZXBlbmRpbmcubmV4dCkge1xuICAgICAgLy8gTmV4dC5qcyBzdGlsbCB1c2VzIHRoZSBgdHlwZXNjcmlwdGAgcGFja2FnZSBkdXJpbmcgZGV2L2J1aWxkIHN0YXJ0dXAgZm9yXG4gICAgICAvLyBUeXBlU2NyaXB0IGFwcHMgZXZlbiB3aGVuIHJlcG9zaXRvcmllcyBkZWxlZ2F0ZSBleHBsaWNpdCB0eXBlY2hlY2tpbmcgdG8gdHNnby5cbiAgICAgIGRldkRlcGVuZGVuY2llcy5wdXNoKHR5cGVzY3JpcHREZXBlbmRlbmN5KTtcbiAgICB9XG4gICAgaWYgKGNvbmZpZy5pc0J1bikge1xuICAgICAgZGV2RGVwZW5kZW5jaWVzLnB1c2goJ0B0eXBlcy9idW4nKTtcbiAgICB9IGVsc2UgaWYgKCFjb25maWcuZGVwZW5kaW5nLnJlYWN0TmF0aXZlKSB7XG4gICAgICBkZXZEZXBlbmRlbmNpZXMucHVzaCgnQHR5cGVzL25vZGUnKTtcbiAgICB9XG4gICAgaWYgKFxuICAgICAganNvbk9iai5kZXBlbmRlbmNpZXMuamVzdCB8fFxuICAgICAganNvbk9iai5kZXZEZXBlbmRlbmNpZXMuamVzdCB8fFxuICAgICAganNvbk9iai5kZXBlbmRlbmNpZXNbJ0BqZXN0L2dsb2JhbHMnXSB8fFxuICAgICAganNvbk9iai5kZXZEZXBlbmRlbmNpZXNbJ0BqZXN0L2dsb2JhbHMnXSB8fFxuICAgICAganNvbk9iai5kZXBlbmRlbmNpZXNbJ3RzLWplc3QnXSB8fFxuICAgICAganNvbk9iai5kZXZEZXBlbmRlbmNpZXNbJ3RzLWplc3QnXVxuICAgICkge1xuICAgICAgZGV2RGVwZW5kZW5jaWVzLnB1c2goJ0B0eXBlcy9qZXN0Jyk7XG4gICAgfVxuICB9XG5cbiAgaWYgKGNvbmZpZy5pc1dpbGxCb29zdGVyQ29uZmlncykge1xuICAgIHJldHVybiB7XG4gICAgICBkZXBlbmRlbmNpZXM6IGRlcGVuZGVuY2llcy5maWx0ZXIoKGRlcCkgPT4gIWRlcC5pbmNsdWRlcygnQHdpbGxib29zdGVyLycpKSxcbiAgICAgIGRldkRlcGVuZGVuY2llczogZGV2RGVwZW5kZW5jaWVzLmZpbHRlcigoZGVwKSA9PiAhZGVwLmluY2x1ZGVzKCdAd2lsbGJvb3N0ZXIvJykpLFxuICAgICAgcHl0aG9uRGV2RGVwZW5kZW5jaWVzLFxuICAgIH07XG4gIH1cblxuICByZXR1cm4geyBkZXBlbmRlbmNpZXMsIGRldkRlcGVuZGVuY2llcywgcHl0aG9uRGV2RGVwZW5kZW5jaWVzIH07XG59XG5cbmZ1bmN0aW9uIG1vdmVNYW5hZ2VkVG9vbERlcGVuZGVuY2llc1RvRGV2RGVwZW5kZW5jaWVzKGpzb25PYmo6IFdyaXRhYmxlUGFja2FnZUpzb24pOiB2b2lkIHtcbiAgZm9yIChjb25zdCBkZXBlbmRlbmN5IG9mIFt3YkRlcGVuZGVuY3ksIGJ1aWxkVHNEZXBlbmRlbmN5XSkge1xuICAgIGlmICghanNvbk9iai5kZXBlbmRlbmNpZXNbZGVwZW5kZW5jeV0pIGNvbnRpbnVlO1xuICAgIGpzb25PYmouZGV2RGVwZW5kZW5jaWVzW2RlcGVuZGVuY3ldID8/PSBqc29uT2JqLmRlcGVuZGVuY2llc1tkZXBlbmRlbmN5XTtcbiAgICBkZWxldGUganNvbk9iai5kZXBlbmRlbmNpZXNbZGVwZW5kZW5jeV07XG4gIH1cbn1cblxuYXN5bmMgZnVuY3Rpb24gbm9ybWFsaXplUGFja2FnZU1ldGFkYXRhKFxuICBjb25maWc6IFBhY2thZ2VDb25maWcsXG4gIHJvb3RDb25maWc6IFBhY2thZ2VDb25maWcsXG4gIGpzb25PYmo6IFdyaXRhYmxlUGFja2FnZUpzb24sXG4gIGRlcGVuZGVuY3lVcGRhdGVzOiBEZXBlbmRlbmN5VXBkYXRlc1xuKTogUHJvbWlzZTx2b2lkPiB7XG4gIGlmICghanNvbk9iai5uYW1lKSB7XG4gICAganNvbk9iai5uYW1lID0gcGF0aC5iYXNlbmFtZShjb25maWcuZGlyUGF0aCk7XG4gIH1cblxuICBpZiAoY29uZmlnLmRvZXNDb250YWluU3ViUGFja2FnZUpzb25zKSB7XG4gICAganNvbk9iai5wcml2YXRlID0gdHJ1ZTtcbiAgfVxuICBpZiAoIWpzb25PYmoubGljZW5zZSkge1xuICAgIGpzb25PYmoubGljZW5zZSA9ICdVTkxJQ0VOU0VEJztcbiAgfVxuICBpZiAoIWpzb25PYmoucHJpdmF0ZSAmJiBqc29uT2JqLmxpY2Vuc2UgIT09ICdVTkxJQ0VOU0VEJyAmJiByb290Q29uZmlnLmlzUHVibGljUmVwbykge1xuICAgIGpzb25PYmoucHVibGlzaENvbmZpZyA/Pz0ge307XG4gICAganNvbk9iai5wdWJsaXNoQ29uZmlnLmFjY2VzcyA/Pz0gJ3B1YmxpYyc7XG4gIH1cbiAgY29uc3QgW293bmVyXSA9IGdpdEh1YlV0aWwuZ2V0T3JnQW5kTmFtZShjb25maWcucmVwb3NpdG9yeSA/PyAnJyk7XG4gIGlmIChvd25lciA9PT0gJ1dpbGxCb29zdGVyJyB8fCBvd25lciA9PT0gJ1dpbGxCb29zdGVyTGFiJykge1xuICAgIGpzb25PYmouYXV0aG9yID0gJ1dpbGxCb29zdGVyIEluYy4nO1xuICB9XG4gIGF3YWl0IG5vcm1hbGl6ZVB1Ymxpc2hlZENvbmZpZ1BhY2thZ2VNZXRhZGF0YShjb25maWcsIGpzb25PYmopO1xuICBpZiAoIWNvbmZpZy5pc1Jvb3QgJiYganNvbk9iai5wcml2YXRlICYmICFqc29uT2JqLm1haW4pIHtcbiAgICAvLyBNYWtlIFZTQ29kZSBwb3NzaWJsZSB0byByZWZhY3RvciBjb2RlIGFjcm9zcyBzdWJwYWNrYWdlcy5cbiAgICBqc29uT2JqLm1haW4gPSAnLi9zcmMnO1xuICB9XG5cbiAgLy8gWWFybiB0cmVhdHMgdGhlIGxlZ2FjeSBucG0vY2hhbGsgcmVzb2x1dGlvbiBhbGlhcyBhcyBhbiBpbnZhbGlkIHBhY2thZ2UgdG9rZW4uXG4gIGRlbGV0ZSBqc29uT2JqLnJlc29sdXRpb25zPy5bJ25wbS9jaGFsayddO1xuXG4gIGlmICghY29uZmlnLmRvZXNDb250YWluU3ViUGFja2FnZUpzb25zKSB7XG4gICAgaWYgKCFjb25maWcuaXNCdW4pIHtcbiAgICAgIGlmICghY29uZmlnLmRvZXNDb250YWluSmF2YVNjcmlwdCAmJiAhY29uZmlnLmRvZXNDb250YWluVHlwZVNjcmlwdCkge1xuICAgICAgICBkZWxldGUganNvbk9iai5zY3JpcHRzLmxpbnQ7XG4gICAgICAgIGRlbGV0ZSBqc29uT2JqLnNjcmlwdHNbJ2xpbnQtZml4J107XG4gICAgICAgIGZvciAoY29uc3Qgc2NyaXB0TmFtZSBvZiBbJ2NsZWFudXAnXSkge1xuICAgICAgICAgIGNvbnN0IHNjcmlwdCA9IGpzb25PYmouc2NyaXB0c1tzY3JpcHROYW1lXTtcbiAgICAgICAgICBpZiAoIXNjcmlwdCkgY29udGludWU7XG4gICAgICAgICAganNvbk9iai5zY3JpcHRzW3NjcmlwdE5hbWVdID0gc2NyaXB0LnJlcGxhY2UoLyA/JiYgP3lhcm4gbGludC1maXgoPzogLS1xdWlldCk/LywgJycpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBqc29uT2JqLnNjcmlwdHNbJ2xpbnQtZml4J10gPSBqc29uT2JqLnNjcmlwdHNbJ2xpbnQtZml4J10gPz8gJ3lhcm4gbGludCAtLWZpeCc7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGNvbmZpZy5kb2VzQ29udGFpblB1YnNwZWNZYW1sKSB7XG4gICAgICBqc29uT2JqLnNjcmlwdHMubGludCA9ICdmbHV0dGVyIGFuYWx5emUnO1xuICAgICAganNvbk9iai5zY3JpcHRzWydsaW50LWZpeCddID0gJ3lhcm4gbGludCc7XG4gICAgICBjb25zdCBkaXJzID0gWydsaWInLCAndGVzdCcsICd0ZXN0X2RyaXZlciddLmZpbHRlcigoZGlyKSA9PiBmcy5leGlzdHNTeW5jKHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgZGlyKSkpO1xuICAgICAgaWYgKGRpcnMubGVuZ3RoID4gMCkge1xuICAgICAgICBqc29uT2JqLnNjcmlwdHNbJ2Zvcm1hdC1jb2RlJ10gPSBgZGFydCBmb3JtYXQgJChmaW5kICR7ZGlycy5qb2luKFxuICAgICAgICAgICcgJ1xuICAgICAgICApfSAtbmFtZSBnZW5lcmF0ZWQgLXBydW5lIC1vIC1uYW1lICcqLmZyZWV6ZWQuZGFydCcgLXBydW5lIC1vIC1uYW1lICcqLmcuZGFydCcgLXBydW5lIC1vIC1uYW1lICcqLmRhcnQnIC1wcmludClgO1xuICAgICAgICBqc29uT2JqLnNjcmlwdHMuZm9ybWF0ID0gYXBwZW5kRm9ybWF0Q29kZUNvbW1hbmQoanNvbk9iai5zY3JpcHRzLmZvcm1hdCwgY29uZmlnKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCBweXRob25QYWNrYWdlTWFuYWdlciA9IGdldFB5dGhvblBhY2thZ2VNYW5hZ2VyKGNvbmZpZyk7XG4gICAgaWYgKHB5dGhvblBhY2thZ2VNYW5hZ2VyKSB7XG4gICAgICBpZiAoanNvbk9iai5zY3JpcHRzLnBvc3RpbnN0YWxsID09PSAncG9ldHJ5IGluc3RhbGwnKSB7XG4gICAgICAgIGRlbGV0ZSBqc29uT2JqLnNjcmlwdHMucG9zdGluc3RhbGw7XG4gICAgICB9XG4gICAgICBqc29uT2JqLnNjcmlwdHNbJ2NvbW1vbi9jaS1zZXR1cCddID0gYHlhcm4gc2V0dXAtJHtweXRob25QYWNrYWdlTWFuYWdlcn1gO1xuICAgICAgZGVsZXRlIGpzb25PYmouc2NyaXB0c1tgc2V0dXAtJHtweXRob25QYWNrYWdlTWFuYWdlciA9PT0gJ3BvZXRyeScgPyAndXYnIDogJ3BvZXRyeSd9YF07XG4gICAgICBkZWxldGUganNvbk9iai5zY3JpcHRzWydzZXR1cC1wb2V0cnktYXNkZiddO1xuICAgICAganNvbk9iai5zY3JpcHRzW2BzZXR1cC0ke3B5dGhvblBhY2thZ2VNYW5hZ2VyfWBdID0gZ2V0UHl0aG9uU2V0dXBDb21tYW5kKHB5dGhvblBhY2thZ2VNYW5hZ2VyKTtcbiAgICAgIGNvbnN0IHB5dGhvbkZpbGVzID0gYXdhaXQgZmcuZ2xvYignKiovKi5weScsIHtcbiAgICAgICAgY3dkOiBjb25maWcuZGlyUGF0aCxcbiAgICAgICAgZG90OiB0cnVlLFxuICAgICAgICBpZ25vcmU6IGdsb2JJZ25vcmUsXG4gICAgICB9KTtcbiAgICAgIGNvbnN0IGRpck5hbWVTZXQgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgICAgIGZvciAoY29uc3QgcHl0aG9uRmlsZSBvZiBweXRob25GaWxlcykge1xuICAgICAgICBjb25zdCBbZmlyc3QsIHNlY29uZF0gPSBweXRob25GaWxlLnNwbGl0KCcvJyk7XG4gICAgICAgIGlmIChmaXJzdCAmJiBzZWNvbmQpIHtcbiAgICAgICAgICBkaXJOYW1lU2V0LmFkZChmaXJzdCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChkaXJOYW1lU2V0LnNpemUgPiAwKSB7XG4gICAgICAgIGNvbnN0IGRpck5hbWVzU3RyID0gWy4uLmRpck5hbWVTZXRdLmpvaW4oJyAnKTtcbiAgICAgICAgY29uc3QgcHl0aG9uUnVubmVyID0gYCR7cHl0aG9uUGFja2FnZU1hbmFnZXJ9IHJ1bmA7XG4gICAgICAgIGpzb25PYmouc2NyaXB0c1snZm9ybWF0LWNvZGUnXSA9XG4gICAgICAgICAgYCR7cHl0aG9uUnVubmVyfSBpc29ydCAtLXByb2ZpbGUgYmxhY2sgJHtkaXJOYW1lc1N0cn0gJiYgJHtweXRob25SdW5uZXJ9IGJsYWNrICR7ZGlyTmFtZXNTdHJ9YDtcbiAgICAgICAgaWYgKGpzb25PYmouc2NyaXB0cy5saW50KSB7XG4gICAgICAgICAganNvbk9iai5zY3JpcHRzLmxpbnQgPSBgJHtweXRob25SdW5uZXJ9IGZsYWtlOCAke2Rpck5hbWVzU3RyfSAmJiAke2pzb25PYmouc2NyaXB0cy5saW50fWA7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAganNvbk9iai5zY3JpcHRzLmxpbnQgPSBgJHtweXRob25SdW5uZXJ9IGZsYWtlOCAke2Rpck5hbWVzU3RyfWA7XG4gICAgICAgICAganNvbk9iai5zY3JpcHRzWydsaW50LWZpeCddID0gJ3lhcm4gbGludCc7XG4gICAgICAgIH1cbiAgICAgICAganNvbk9iai5zY3JpcHRzLmZvcm1hdCA9IGFwcGVuZEZvcm1hdENvZGVDb21tYW5kKGpzb25PYmouc2NyaXB0cy5mb3JtYXQsIGNvbmZpZyk7XG4gICAgICAgIGRlcGVuZGVuY3lVcGRhdGVzLnB5dGhvbkRldkRlcGVuZGVuY2llcy5wdXNoKCdibGFjaycsICdpc29ydCcsICdmbGFrZTgnKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBpZiAoY29uZmlnLnJlcG9zaXRvcnkgfHwganNvbk9iai5yZXBvc2l0b3J5KSB7XG4gICAganNvbk9iai5yZXBvc2l0b3J5ID0gZm9ybWF0UmVwb3NpdG9yeUZvclBhY2thZ2VKc29uKGNvbmZpZy5yZXBvc2l0b3J5ID8/IGpzb25PYmoucmVwb3NpdG9yeSwganNvbk9iai5yZXBvc2l0b3J5KTtcbiAgfVxuXG4gIGlmIChjb25maWcuZGVwZW5kaW5nLmJsaXR6KSB7XG4gICAgaWYgKCFqc29uT2JqLnNjcmlwdHNbJ2dlbi1jb2RlJ10/LnN0YXJ0c1dpdGgoJ2JsaXR6IGNvZGVnZW4nKSkge1xuICAgICAganNvbk9iai5zY3JpcHRzWydnZW4tY29kZSddID0gJ2JsaXR6IGNvZGVnZW4nO1xuICAgIH0gZWxzZSBpZiAoIWpzb25PYmouc2NyaXB0c1snZ2VuLWNvZGUnXS5pbmNsdWRlcygnYmxpdHogcHJpc21hIGdlbmVyYXRlJykpIHtcbiAgICAgIGpzb25PYmouc2NyaXB0c1snZ2VuLWNvZGUnXSA9IGpzb25PYmouc2NyaXB0c1snZ2VuLWNvZGUnXS5yZXBsYWNlKFxuICAgICAgICAnYmxpdHogY29kZWdlbicsXG4gICAgICAgICdibGl0eiBjb2RlZ2VuICYmIGJsaXR6IHByaXNtYSBnZW5lcmF0ZSdcbiAgICAgICk7XG4gICAgfVxuICB9IGVsc2UgaWYgKGNvbmZpZy5kZXBlbmRpbmcucHJpc21hICYmICFqc29uT2JqLnNjcmlwdHNbJ2dlbi1jb2RlJ10/LnN0YXJ0c1dpdGgoJ3ByaXNtYSBnZW5lcmF0ZScpKSB7XG4gICAganNvbk9iai5zY3JpcHRzWydnZW4tY29kZSddID0gJ3ByaXNtYSBnZW5lcmF0ZSc7XG4gIH1cbiAgYWRkR2VuSTE4blRzUG9zdGluc3RhbGxTY3JpcHQoY29uZmlnLCBqc29uT2JqKTtcblxuICBpZiAoIWpzb25PYmouZGVwZW5kZW5jaWVzLnByZXR0aWVyKSB7XG4gICAgLy8gQmVjYXVzZSBAdHlwZXMvcHJldHRpZXIgYmxvY2tzIHByZXR0aWVyIGV4ZWN1dGlvbi5cbiAgICBkZWxldGUganNvbk9iai5kZXZEZXBlbmRlbmNpZXNbJ0B0eXBlcy9wcmV0dGllciddO1xuICB9XG59XG5cbmZ1bmN0aW9uIGFwcGVuZEZvcm1hdENvZGVDb21tYW5kKGZvcm1hdFNjcmlwdDogc3RyaW5nIHwgdW5kZWZpbmVkLCBjb25maWc6IFBhY2thZ2VDb25maWcpOiBzdHJpbmcge1xuICAvLyBCdW4gcHJvamVjdHMgbWF5IG5vdCBoYXZlIGEgWWFybiBsb2NrZmlsZSwgc28gZ2VuZXJhdGVkIHBhY2thZ2Ugc2NyaXB0c1xuICAvLyBtdXN0IGludm9rZSBsb2NhbCBwYWNrYWdlIHNjcmlwdHMgdGhyb3VnaCB0aGUgcmVwb3NpdG9yeSdzIHBhY2thZ2UgbWFuYWdlci5cbiAgY29uc3Qgc2NyaXB0UnVubmVyID0gY29uZmlnLmlzQnVuID8gJ2J1biBydW4nIDogJ3lhcm4nO1xuICByZXR1cm4gZm9ybWF0U2NyaXB0ID8gYCR7Zm9ybWF0U2NyaXB0fSAmJiAke3NjcmlwdFJ1bm5lcn0gZm9ybWF0LWNvZGVgIDogYCR7c2NyaXB0UnVubmVyfSBmb3JtYXQtY29kZWA7XG59XG5cbmZ1bmN0aW9uIGFkZEdlbkkxOG5Uc1Bvc3RpbnN0YWxsU2NyaXB0KGNvbmZpZzogUGFja2FnZUNvbmZpZywganNvbk9iajogV3JpdGFibGVQYWNrYWdlSnNvbik6IHZvaWQge1xuICBjb25zdCBjb21tYW5kID0gZ2V0R2VuSTE4blRzQ29tbWFuZChjb25maWcsIGpzb25PYmouc2NyaXB0cyk7XG4gIGlmICghY29tbWFuZCkgcmV0dXJuO1xuXG4gIGNvbnN0IHBvc3RpbnN0YWxsID0ganNvbk9iai5zY3JpcHRzLnBvc3RpbnN0YWxsO1xuICBpZiAoIXBvc3RpbnN0YWxsKSB7XG4gICAganNvbk9iai5zY3JpcHRzLnBvc3RpbnN0YWxsID0gY29tbWFuZDtcbiAgfSBlbHNlIGlmICghcG9zdGluc3RhbGwuaW5jbHVkZXMoY29tbWFuZCkpIHtcbiAgICBqc29uT2JqLnNjcmlwdHMucG9zdGluc3RhbGwgPSBgJHtwb3N0aW5zdGFsbH0gJiYgJHtjb21tYW5kfWA7XG4gIH1cbn1cblxuYXN5bmMgZnVuY3Rpb24gbm9ybWFsaXplUHVibGlzaGVkQ29uZmlnUGFja2FnZU1ldGFkYXRhKFxuICBjb25maWc6IFBhY2thZ2VDb25maWcsXG4gIGpzb25PYmo6IFdyaXRhYmxlUGFja2FnZUpzb25cbik6IFByb21pc2U8dm9pZD4ge1xuICBpZiAoIWlzUHVibGlzaGVkV2lsbGJvb3N0ZXJDb25maWdzUGFja2FnZShjb25maWcpKSByZXR1cm47XG5cbiAgY29uc3QgY29uZmlnTWpzUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJ2NvbmZpZy5tanMnKTtcbiAgaWYgKCFmcy5leGlzdHNTeW5jKGNvbmZpZ01qc1BhdGgpKSByZXR1cm47XG5cbiAganNvbk9iai50eXBlID0gJ21vZHVsZSc7XG5cbiAgY29uc3QgY29uZmlnRHRzUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJ2NvbmZpZy5kLnRzJyk7XG4gIGlmICghZnMuZXhpc3RzU3luYyhjb25maWdEdHNQYXRoKSkgcmV0dXJuO1xuXG4gIGpzb25PYmouZmlsZXMgPSBbLi4ubmV3IFNldChbLi4uKGpzb25PYmouZmlsZXMgPz8gW10pLCAnY29uZmlnLmQubXRzJ10pXTtcbiAgLy8gTm9kZU5leHQgcmVzb2x2ZXMgYSByZWxhdGl2ZSBgLi9jb25maWcubWpzYCBpbXBvcnQgdG8gYGNvbmZpZy5kLm10c2AsIG5vdFxuICAvLyB0aGUgcGFja2FnZS1sZXZlbCBgdHlwZXNgIGZpZWxkLiBLZWVwIHRoZSBwdWJsaXNoZWQgY29uZmlnIGltcG9ydGFibGUgZnJvbVxuICAvLyBwYWNrYWdlLWxvY2FsIFR5cGVTY3JpcHQgbGludGVyIHNldHRpbmdzLlxuICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnNVdGlsLmdlbmVyYXRlRmlsZShwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICdjb25maWcuZC5tdHMnKSwgY29uZmlnRG10c0NvbnRlbnQpKTtcbn1cblxuY29uc3QgY29uZmlnRG10c0NvbnRlbnQgPSBgZXhwb3J0IHsgZGVmYXVsdCB9IGZyb20gJy4vY29uZmlnLmpzJztcbmA7XG5cbmZ1bmN0aW9uIGFkZERlcGVuZGVuY3lWZXJzaW9uc1RvUGFja2FnZUpzb24oanNvbk9iajogV3JpdGFibGVQYWNrYWdlSnNvbiwgZGVwZW5kZW5jeVVwZGF0ZXM6IERlcGVuZGVuY3lVcGRhdGVzKTogdm9pZCB7XG4gIGNvbnN0IHBhY2thZ2VKc29uRGVwZW5kZW5jaWVzID0ganNvbk9iai5kZXBlbmRlbmNpZXM7XG4gIGNvbnN0IHBhY2thZ2VKc29uRGV2RGVwZW5kZW5jaWVzID0ganNvbk9iai5kZXZEZXBlbmRlbmNpZXM7XG4gIGRlcGVuZGVuY3lVcGRhdGVzLmRlcGVuZGVuY2llcyA9IGFkZFBhY2thZ2VKc29uRGVwZW5kZW5jaWVzKHBhY2thZ2VKc29uRGVwZW5kZW5jaWVzLCBkZXBlbmRlbmN5VXBkYXRlcy5kZXBlbmRlbmNpZXMpO1xuICBkZXBlbmRlbmN5VXBkYXRlcy5kZXZEZXBlbmRlbmNpZXMgPSBkZXBlbmRlbmN5VXBkYXRlcy5kZXZEZXBlbmRlbmNpZXMuZmlsdGVyKChkZXApID0+ICFwYWNrYWdlSnNvbkRlcGVuZGVuY2llc1tkZXBdKTtcbiAgZGVwZW5kZW5jeVVwZGF0ZXMuZGV2RGVwZW5kZW5jaWVzID0gYWRkUGFja2FnZUpzb25EZXBlbmRlbmNpZXMoXG4gICAgcGFja2FnZUpzb25EZXZEZXBlbmRlbmNpZXMsXG4gICAgZGVwZW5kZW5jeVVwZGF0ZXMuZGV2RGVwZW5kZW5jaWVzXG4gICk7XG59XG5cbmZ1bmN0aW9uIHJlbW92ZUVtcHR5RGVwZW5kZW5jeVNlY3Rpb25zKGpzb25PYmo6IFBhY2thZ2VKc29uKTogdm9pZCB7XG4gIGZvciAoY29uc3Qga2V5IG9mIGRlcGVuZGVuY3lTZWN0aW9uS2V5cykge1xuICAgIGNvbnN0IHNlY3Rpb24gPSBqc29uT2JqW2tleV07XG4gICAgaWYgKHNlY3Rpb24gJiYgT2JqZWN0LmtleXMoc2VjdGlvbikubGVuZ3RoID09PSAwKSB7XG4gICAgICBSZWZsZWN0LmRlbGV0ZVByb3BlcnR5KGpzb25PYmosIGtleSk7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGluc3RhbGxEZXBlbmRlbmN5VXBkYXRlcyhcbiAgY29uZmlnOiBQYWNrYWdlQ29uZmlnLFxuICBqc29uT2JqOiBQYWNrYWdlSnNvbixcbiAgZGVwZW5kZW5jeVVwZGF0ZXM6IERlcGVuZGVuY3lVcGRhdGVzLFxuICBwYWNrYWdlTWFuYWdlcjogJ2J1bicgfCAneWFybidcbik6IHZvaWQge1xuICBjb25zdCBkZXBlbmRlbmNpZXMgPSBkZXBlbmRlbmN5VXBkYXRlcy5kZXBlbmRlbmNpZXMuZmlsdGVyKChkZXApID0+ICFqc29uT2JqLmRldkRlcGVuZGVuY2llcz8uW2RlcF0pO1xuICBpbnN0YWxsTnBtRGVwZW5kZW5jaWVzKGNvbmZpZywgcGFja2FnZU1hbmFnZXIsIGpzb25PYmouZGVwZW5kZW5jaWVzID8/IHt9LCBkZXBlbmRlbmNpZXMsIGZhbHNlKTtcblxuICBjb25zdCBkZXZEZXBlbmRlbmNpZXMgPSBkZXBlbmRlbmN5VXBkYXRlcy5kZXZEZXBlbmRlbmNpZXMuZmlsdGVyKChkZXApID0+ICFqc29uT2JqLmRlcGVuZGVuY2llcz8uW2RlcF0pO1xuICBpbnN0YWxsTnBtRGVwZW5kZW5jaWVzKGNvbmZpZywgcGFja2FnZU1hbmFnZXIsIGpzb25PYmouZGV2RGVwZW5kZW5jaWVzID8/IHt9LCBkZXZEZXBlbmRlbmNpZXMsIHRydWUpO1xuXG4gIGNvbnN0IHB5dGhvblBhY2thZ2VNYW5hZ2VyID0gZ2V0UHl0aG9uUGFja2FnZU1hbmFnZXIoY29uZmlnKTtcbiAgaWYgKHB5dGhvblBhY2thZ2VNYW5hZ2VyICYmIGRlcGVuZGVuY3lVcGRhdGVzLnB5dGhvbkRldkRlcGVuZGVuY2llcy5sZW5ndGggPiAwKSB7XG4gICAgY29uc3QgZGVwZW5kZW5jaWVzID0gWy4uLm5ldyBTZXQoZGVwZW5kZW5jeVVwZGF0ZXMucHl0aG9uRGV2RGVwZW5kZW5jaWVzKV07XG4gICAgaWYgKHB5dGhvblBhY2thZ2VNYW5hZ2VyID09PSAncG9ldHJ5Jykge1xuICAgICAgc3Bhd25TeW5jKCdwb2V0cnknLCBbJ2FkZCcsICctLWdyb3VwJywgJ2RldicsIC4uLmRlcGVuZGVuY2llc10sIGNvbmZpZy5kaXJQYXRoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgc3Bhd25TeW5jKCd1dicsIFsnYWRkJywgJy0tZGV2JywgLi4uZGVwZW5kZW5jaWVzXSwgY29uZmlnLmRpclBhdGgpO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBnZXRQeXRob25QYWNrYWdlTWFuYWdlcihjb25maWc6IFBhY2thZ2VDb25maWcpOiAncG9ldHJ5JyB8ICd1dicgfCB1bmRlZmluZWQge1xuICBpZiAoY29uZmlnLmRvZXNDb250YWluVXZMb2NrKSByZXR1cm4gJ3V2JztcbiAgaWYgKGNvbmZpZy5kb2VzQ29udGFpblBvZXRyeUxvY2spIHJldHVybiAncG9ldHJ5Jztcbn1cblxuZnVuY3Rpb24gZ2V0UHl0aG9uU2V0dXBDb21tYW5kKHBhY2thZ2VNYW5hZ2VyOiAncG9ldHJ5JyB8ICd1dicpOiBzdHJpbmcge1xuICBpZiAocGFja2FnZU1hbmFnZXIgPT09ICd1dicpIHJldHVybiAndXYgc3luYyAtLWZyb3plbic7XG4gIHJldHVybiAncG9ldHJ5IGNvbmZpZyB2aXJ0dWFsZW52cy5pbi1wcm9qZWN0IHRydWUgJiYgcG9ldHJ5IGVudiB1c2UgJChtaXNlIGN1cnJlbnQgcHl0aG9uKSAmJiBwb2V0cnkgcnVuIHBpcCBpbnN0YWxsIC0tdXBncmFkZSBwaXAgJiYgcG9ldHJ5IGluc3RhbGwnO1xufVxuXG5mdW5jdGlvbiBpbnN0YWxsTnBtRGVwZW5kZW5jaWVzKFxuICBjb25maWc6IFBhY2thZ2VDb25maWcsXG4gIHBhY2thZ2VNYW5hZ2VyOiAnYnVuJyB8ICd5YXJuJyxcbiAgcGFja2FnZUpzb25EZXBlbmRlbmNpZXM6IFBhcnRpYWw8UmVjb3JkPHN0cmluZywgc3RyaW5nPj4sXG4gIGRlcGVuZGVuY2llczogc3RyaW5nW10sXG4gIGRldjogYm9vbGVhblxuKTogdm9pZCB7XG4gIGlmIChkZXBlbmRlbmNpZXMubGVuZ3RoID09PSAwKSByZXR1cm47XG5cbiAgY29uc3QgZGVwZW5kZW5jeVNwZWNpZmllcnMgPSBbXG4gICAgLi4ubmV3IFNldChcbiAgICAgIGRlcGVuZGVuY2llcy5tYXAoKGRlcGVuZGVuY3kpID0+XG4gICAgICAgIGdldEluc3RhbGxEZXBlbmRlbmN5U3BlY2lmaWVyKGRlcGVuZGVuY3ksIHBhY2thZ2VKc29uRGVwZW5kZW5jaWVzW2RlcGVuZGVuY3ldLCBwYWNrYWdlTWFuYWdlcilcbiAgICAgIClcbiAgICApLFxuICBdO1xuICBzcGF3blN5bmMoXG4gICAgcGFja2FnZU1hbmFnZXIsXG4gICAgWydhZGQnLCAuLi4oZGV2ID8gWyctRCddIDogW10pLCAuLi4oY29uZmlnLmlzQnVuID8gWyctLWV4YWN0J10gOiBbXSksIC4uLmRlcGVuZGVuY3lTcGVjaWZpZXJzXSxcbiAgICBjb25maWcuZGlyUGF0aFxuICApO1xufVxuXG5mdW5jdGlvbiBnZXRJbnN0YWxsRGVwZW5kZW5jeVNwZWNpZmllcihcbiAgZGVwZW5kZW5jeTogc3RyaW5nLFxuICBjdXJyZW50VmVyc2lvbjogc3RyaW5nIHwgdW5kZWZpbmVkLFxuICBwYWNrYWdlTWFuYWdlcjogJ2J1bicgfCAneWFybidcbik6IHN0cmluZyB7XG4gIC8vIFlhcm4gcHJlZmVycyBsb2NhbCB3b3Jrc3BhY2VzIHdoZW4gYWRkaW5nIGEgYmFyZSBwYWNrYWdlIG5hbWUuIFBhc3NpbmcgdGhlXG4gIC8vIHJlc29sdmVkIHZlcnNpb24ga2VlcHMgbWFuYWdlZCB0b29scyBhcyBucG0gZGVwZW5kZW5jaWVzIGluIGNvbmZpZy1wYWNrYWdlXG4gIC8vIG1vbm9yZXBvcywgd2hlcmUgdGhvc2UgcGFja2FnZSBuYW1lcyBjYW4gYWxzbyBleGlzdCBhcyB3b3Jrc3BhY2VzLlxuICBpZiAocGFja2FnZU1hbmFnZXIgPT09ICd5YXJuJyAmJiBjdXJyZW50VmVyc2lvbiAmJiAhaXNXb3Jrc3BhY2VQcm90b2NvbFJhbmdlKGN1cnJlbnRWZXJzaW9uKSkge1xuICAgIHJldHVybiBgJHtkZXBlbmRlbmN5fUAke2N1cnJlbnRWZXJzaW9ufWA7XG4gIH1cblxuICByZXR1cm4gZ2V0RGVwZW5kZW5jeVNwZWNpZmllcihkZXBlbmRlbmN5KTtcbn1cblxuZnVuY3Rpb24gYWRkUGFja2FnZUpzb25EZXBlbmRlbmNpZXMoXG4gIHBhY2thZ2VKc29uRGVwZW5kZW5jaWVzOiBQYXJ0aWFsPFJlY29yZDxzdHJpbmcsIHN0cmluZz4+LFxuICBkZXBlbmRlbmNpZXM6IHN0cmluZ1tdXG4pOiBzdHJpbmdbXSB7XG4gIGNvbnN0IGRlcGVuZGVuY2llc1RvSW5zdGFsbDogc3RyaW5nW10gPSBbXTtcbiAgZm9yIChjb25zdCBkZXBlbmRlbmN5IG9mIG5ldyBTZXQoZGVwZW5kZW5jaWVzKSkge1xuICAgIGNvbnN0IHNob3VsZFVwZGF0ZUV4aXN0aW5nRGVwZW5kZW5jeSA9IHNob3VsZFVwZGF0ZUV4aXN0aW5nTWFuYWdlZERlcGVuZGVuY3koXG4gICAgICBkZXBlbmRlbmN5LFxuICAgICAgcGFja2FnZUpzb25EZXBlbmRlbmNpZXNbZGVwZW5kZW5jeV1cbiAgICApO1xuICAgIGlmIChzaG91bGRVcGRhdGVFeGlzdGluZ0RlcGVuZGVuY3kpIHtcbiAgICAgIGRlcGVuZGVuY2llc1RvSW5zdGFsbC5wdXNoKGRlcGVuZGVuY3kpO1xuICAgIH1cbiAgICBpZiAoXG4gICAgICBwYWNrYWdlSnNvbkRlcGVuZGVuY2llc1tkZXBlbmRlbmN5XSAmJlxuICAgICAgIXNob3VsZFVwZGF0ZUV4aXN0aW5nRGVwZW5kZW5jeSAmJlxuICAgICAgcGFja2FnZUpzb25EZXBlbmRlbmNpZXNbZGVwZW5kZW5jeV0gIT09ICcqJ1xuICAgIClcbiAgICAgIGNvbnRpbnVlO1xuICAgIHBhY2thZ2VKc29uRGVwZW5kZW5jaWVzW2RlcGVuZGVuY3ldID0gZ2V0TGF0ZXN0RGVwZW5kZW5jeVZlcnNpb24oZGVwZW5kZW5jeSk7XG4gIH1cbiAgcmV0dXJuIGRlcGVuZGVuY2llc1RvSW5zdGFsbDtcbn1cblxuZnVuY3Rpb24gZm9ybWF0UGFja2FnZUpzb25XaXRoUHJvamVjdEZvcm1hdHRlcihcbiAgY29uZmlnOiBQYWNrYWdlQ29uZmlnLFxuICBwYWNrYWdlTWFuYWdlcjogJ2J1bicgfCAneWFybicsXG4gIGZpbGVQYXRoOiBzdHJpbmdcbik6IHZvaWQge1xuICBjb25zdCByZWxhdGl2ZUZpbGVQYXRoID0gcGF0aC5yZWxhdGl2ZShjb25maWcuZGlyUGF0aCwgZmlsZVBhdGgpO1xuICBpZiAoIXJlbGF0aXZlRmlsZVBhdGgpIHJldHVybjtcblxuICAvLyBSZXVzZSB0aGUgdGFyZ2V0IHJlcG9zaXRvcnkncyBvd24gZm9ybWF0dGVyIGFmdGVyIGRlcGVuZGVuY3kgaW5zdGFsbGF0aW9uIHNvXG4gIC8vIHBhY2thZ2UuanNvbiBtYXRjaGVzIHdoYXRldmVyIGl0cyBjdXJyZW50IHNvcnQtcGFja2FnZS1qc29uIHZlcnNpb24gZXhwZWN0cy5cbiAgLy8gVGhpcyBhdm9pZHMgZm9sbG93LXVwIGF1dG9maXggY29tbWl0cyBjYXVzZWQgb25seSBieSBmb3JtYXR0ZXIgdmVyc2lvbiBkcmlmdFxuICAvLyBiZXR3ZWVuIHdiZnkgYW5kIHRoZSBwcm9qZWN0IGJlaW5nIHVwZGF0ZWQuXG4gIGlmIChwYWNrYWdlTWFuYWdlciA9PT0gJ2J1bicpIHtcbiAgICBzcGF3blN5bmMoJ2J1bngnLCBbJ3NvcnQtcGFja2FnZS1qc29uJywgcmVsYXRpdmVGaWxlUGF0aF0sIGNvbmZpZy5kaXJQYXRoKTtcbiAgfSBlbHNlIHtcbiAgICBzcGF3blN5bmMocGFja2FnZU1hbmFnZXIsIFsnc29ydC1wYWNrYWdlLWpzb24nLCByZWxhdGl2ZUZpbGVQYXRoXSwgY29uZmlnLmRpclBhdGgpO1xuICB9XG59XG5cbi8vIFRPRE86IHJlbW92ZSB0aGUgZm9sbG93aW5nIG1pZ3JhdGlvbiBjb2RlIGluIGZ1dHVyZVxuYXN5bmMgZnVuY3Rpb24gcmVtb3ZlRGVwcmVjYXRlZFN0dWZmKFxuICBjb25maWc6IFBhY2thZ2VDb25maWcsXG4gIGpzb25PYmo6IFNldFJlcXVpcmVkPFBhY2thZ2VKc29uLCAnc2NyaXB0cycgfCAnZGVwZW5kZW5jaWVzJyB8ICdkZXZEZXBlbmRlbmNpZXMnIHwgJ3BlZXJEZXBlbmRlbmNpZXMnPlxuKTogUHJvbWlzZTx2b2lkPiB7XG4gIGlmIChqc29uT2JqLmF1dGhvciA9PT0gJ1dpbGxCb29zdGVyIExMQycpIHtcbiAgICBqc29uT2JqLmF1dGhvciA9ICdXaWxsQm9vc3RlciBJbmMuJztcbiAgfVxuICByZW1vdmVTZWxmRGVwZW5kZW5jeShjb25maWcsIGpzb25PYmopO1xuICByZXBsYWNlV2lsbEJvb3N0ZXJDb25maWdzV29ya3NwYWNlRGVwZW5kZW5jeVJhbmdlcyhjb25maWcsIGpzb25PYmopO1xuICBkZWxldGUganNvbk9iai5zY3JpcHRzWydzb3J0LXBhY2thZ2UtanNvbiddO1xuICBkZWxldGUganNvbk9iai5zY3JpcHRzWydzb3J0LWFsbC1wYWNrYWdlLWpzb24nXTtcbiAgZGVsZXRlIGpzb25PYmouc2NyaXB0c1snY2hlY2stYWxsLWZvci1haSddO1xuICBkZWxldGUganNvbk9iai5zY3JpcHRzWydjaGVjay1mb3ItYWknXTtcbiAgZGVsZXRlIGpzb25PYmouc2NyaXB0c1sndHlwZWNoZWNrL3dhcm4nXTtcbiAgZGVsZXRlIGpzb25PYmouc2NyaXB0c1sndHlwZWNoZWNrOmdlbi1jb2RlJ107XG4gIGRlbGV0ZSBqc29uT2JqLnNjcmlwdHNbJ3R5cGVjaGVjazpjb2RlZ2VuJ107XG4gIGRlbGV0ZSBqc29uT2JqLmRlcGVuZGVuY2llcy50c2xpYjtcbiAgZGVsZXRlIGpzb25PYmouZGV2RGVwZW5kZW5jaWVzWydAd2lsbGJvb3N0ZXIvcmVub3ZhdGUtY29uZmlnJ107XG4gIGRlbGV0ZSBqc29uT2JqLmRldkRlcGVuZGVuY2llc1snQHdpbGxib29zdGVyL3RzY29uZmlnJ107XG4gIC8vIE5leHQuanMgc3RpbGwgcmVxdWlyZXMgdGhlIGB0eXBlc2NyaXB0YCBwYWNrYWdlIGF0IGJ1aWxkL2RldiB0aW1lIGZvclxuICAvLyBUeXBlU2NyaXB0IHByb2plY3RzIGV2ZW4gd2hlbiByZXBvcyB1c2UgdHNnbyBmb3IgZXhwbGljaXQgdHlwZWNoZWNraW5nLlxuICBpZiAoIWNvbmZpZy5kZXBlbmRpbmcubmV4dCkge1xuICAgIGRlbGV0ZSBqc29uT2JqLmRldkRlcGVuZGVuY2llc1t0eXBlc2NyaXB0RGVwZW5kZW5jeV07XG4gIH1cbiAgZGVsZXRlIGpzb25PYmouZGV2RGVwZW5kZW5jaWVzLmxlcm5hO1xuICAvLyBUbyBpbnN0YWxsIHRoZSBsYXRlc3QgcGluc3RcbiAgZGVsZXRlIGpzb25PYmouZGV2RGVwZW5kZW5jaWVzLnBpbnN0O1xuICBkZWxldGUganNvbk9iai5zY3JpcHRzWydmbHV0dGVyLWZvcm1hdCddO1xuICBkZWxldGUganNvbk9iai5zY3JpcHRzWydmb3JtYXQtZmx1dHRlciddO1xuICBkZWxldGUganNvbk9iai5zY3JpcHRzWydweXRob24tZm9ybWF0J107XG4gIGRlbGV0ZSBqc29uT2JqLnNjcmlwdHNbJ2Zvcm1hdC1weXRob24nXTtcbiAgZGVsZXRlIGpzb25PYmouc2NyaXB0cy5wcmV0dGllcjtcbiAgZGVsZXRlIGpzb25PYmouc2NyaXB0c1snY2hlY2stYWxsJ107XG4gIGRlbGV0ZSBqc29uT2JqLnNjcmlwdHNbJ3ZlcmlmeS1jb2RlJ107XG4gIGRlbGV0ZSBqc29uT2JqLnNjcmlwdHNbJ3ZlcmlmeS1jb2RlLXdpdGgtdGVzdHMnXTtcbiAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzLnByb21pc2VzLnJtKHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJ2xlcm5hLmpzb24nKSwgeyBmb3JjZTogdHJ1ZSB9KSk7XG5cbiAgcmVtb3ZlV2lsbEJvb3N0ZXJDb25maWdzTWFuYWdlZERlcGVuZGVuY2llcyhjb25maWcsIGpzb25PYmopO1xuICByZW1vdmVPYnNvbGV0ZUxpbnREZXBlbmRlbmNpZXMoanNvbk9iaiwgY29uZmlnKTtcbn1cblxuZnVuY3Rpb24gcmVtb3ZlU2VsZkRlcGVuZGVuY3koXG4gIGNvbmZpZzogUGFja2FnZUNvbmZpZyxcbiAganNvbk9iajogU2V0UmVxdWlyZWQ8UGFja2FnZUpzb24sICdkZXBlbmRlbmNpZXMnIHwgJ2RldkRlcGVuZGVuY2llcycgfCAncGVlckRlcGVuZGVuY2llcyc+XG4pOiB2b2lkIHtcbiAgY29uc3QgcGFja2FnZU5hbWUgPSBqc29uT2JqLm5hbWUgfHwgcGF0aC5iYXNlbmFtZShjb25maWcuZGlyUGF0aCk7XG5cbiAgLy8gQSBwYWNrYWdlIGNhbiBpbXBvcnQgaXRzZWxmIHRocm91Z2ggTm9kZSdzIHBhY2thZ2Ugc2VsZi1yZWZlcmVuY2Ugd2l0aG91dFxuICAvLyBkZWNsYXJpbmcgaXRzZWxmOyBrZWVwaW5nIHRoYXQgZWRnZSBicmVha3MgbW9ub3JlcG8gcmVsZWFzZSB0b3BvbG9naWNhbCBzb3J0aW5nLlxuICBmb3IgKGNvbnN0IHNlY3Rpb24gb2YgZ2V0RGVwZW5kZW5jeVNlY3Rpb25zKGpzb25PYmopKSB7XG4gICAgUmVmbGVjdC5kZWxldGVQcm9wZXJ0eShzZWN0aW9uLCBwYWNrYWdlTmFtZSk7XG4gIH1cbn1cblxuZnVuY3Rpb24gcmVwbGFjZVdpbGxCb29zdGVyQ29uZmlnc1dvcmtzcGFjZURlcGVuZGVuY3lSYW5nZXMoY29uZmlnOiBQYWNrYWdlQ29uZmlnLCBqc29uT2JqOiBQYWNrYWdlSnNvbik6IHZvaWQge1xuICBpZiAoIWNvbmZpZy5pc1dpbGxCb29zdGVyQ29uZmlncykgcmV0dXJuO1xuXG4gIGZvciAoY29uc3Qgc2VjdGlvbiBvZiBnZXREZXBlbmRlbmN5U2VjdGlvbnMoanNvbk9iaikpIHtcbiAgICBmb3IgKGNvbnN0IFtkZXBlbmRlbmN5LCB2ZXJzaW9uXSBvZiBPYmplY3QuZW50cmllcyhzZWN0aW9uKSkge1xuICAgICAgaWYgKCF2ZXJzaW9uKSBjb250aW51ZTtcbiAgICAgIGlmICghaXNXb3Jrc3BhY2VQcm90b2NvbFJhbmdlKHZlcnNpb24pKSBjb250aW51ZTtcbiAgICAgIC8vIHdpbGxib29zdGVyLWNvbmZpZ3MgcHVibGlzaGVzIHRoZXNlIHBhY2thZ2VzIGluZGVwZW5kZW50bHksIHNvIGdlbmVyYXRlZFxuICAgICAgLy8gcGFja2FnZSBtZXRhZGF0YSBtdXN0IGRlc2NyaWJlIG5wbSByZWxlYXNlIGVkZ2VzIGluc3RlYWQgb2YgbG9jYWxcbiAgICAgIC8vIHdvcmtzcGFjZSBlZGdlcyB0aGF0IHJlbGVhc2UgdG9vbGluZyB0cmVhdHMgYXMgbW9ub3JlcG8gZ3JhcGggbGlua3MuXG4gICAgICAvLyBUaGUgZmluYWwgYHlhcm4gaW5zdGFsbCAtLW5vLWltbXV0YWJsZWAgc3luY3MgdGhlIGxvY2tmaWxlIGFmdGVyIHRoaXNcbiAgICAgIC8vIG1pZ3JhdGlvbiwgZXZlbiB3aGVuIHRoZSBkZXBlbmRlbmN5IGlzIG5vdCBwYXJ0IG9mIHdiZnkncyBtYW5hZ2VkIGxpc3QuXG4gICAgICBzZWN0aW9uW2RlcGVuZGVuY3ldID0gZ2V0TGF0ZXN0RGVwZW5kZW5jeVZlcnNpb24oZGVwZW5kZW5jeSk7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIHJlbW92ZVdpbGxCb29zdGVyQ29uZmlnc01hbmFnZWREZXBlbmRlbmNpZXMoXG4gIGNvbmZpZzogUGFja2FnZUNvbmZpZyxcbiAganNvbk9iajogU2V0UmVxdWlyZWQ8UGFja2FnZUpzb24sICdkZXBlbmRlbmNpZXMnIHwgJ2RldkRlcGVuZGVuY2llcycgfCAncGVlckRlcGVuZGVuY2llcyc+XG4pOiB2b2lkIHtcbiAgaWYgKCFjb25maWcuaXNXaWxsQm9vc3RlckNvbmZpZ3MpIHJldHVybjtcblxuICBjb25zdCBzZWN0aW9ucyA9IGdldERlcGVuZGVuY3lTZWN0aW9ucyhqc29uT2JqKTtcbiAgZm9yIChjb25zdCBkZXBlbmRlbmN5IG9mIHdpbGxCb29zdGVyQ29uZmlnc01hbmFnZWREZXBlbmRlbmNpZXMpIHtcbiAgICAvLyB3aWxsYm9vc3Rlci1jb25maWdzIHB1Ymxpc2hlcyB0aGVzZSBtYW5hZ2VkIGNvbmZpZyBwYWNrYWdlcyBmcm9tIHRoZSBzYW1lXG4gICAgLy8gbW9ub3JlcG8uIEtlZXBpbmcgdGhlbSBpbiBzdWJwYWNrYWdlIG1ldGFkYXRhIGNyZWF0ZXMgbG9jYWwgd29ya3NwYWNlXG4gICAgLy8gZ3JhcGggZWRnZXMgdGhhdCBtdWx0aS1zZW1hbnRpYy1yZWxlYXNlIHNvcnRzIGFzIHJlbGVhc2UgZGVwZW5kZW5jaWVzLlxuICAgIGZvciAoY29uc3Qgc2VjdGlvbiBvZiBzZWN0aW9ucykge1xuICAgICAgUmVmbGVjdC5kZWxldGVQcm9wZXJ0eShzZWN0aW9uLCBkZXBlbmRlbmN5KTtcbiAgICB9XG4gIH1cbn1cblxuYXN5bmMgZnVuY3Rpb24gcmVtb3ZlVW51c2VkVHNjb25maWdCYXNlRGVwZW5kZW5jaWVzKFxuICBjb25maWc6IFBhY2thZ2VDb25maWcsXG4gIGpzb25PYmo6IFdyaXRhYmxlUGFja2FnZUpzb24sXG4gIHVzZWREZXBlbmRlbmNpZXM6IHN0cmluZ1tdXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgdXNlZERlcGVuZGVuY3lTZXQgPSBuZXcgU2V0KHVzZWREZXBlbmRlbmNpZXMpO1xuICBjb25zdCBleGlzdGluZ1RzY29uZmlnQmFzZURlcGVuZGVuY2llcyA9IGF3YWl0IGdldEV4aXN0aW5nVHNjb25maWdCYXNlRGVwZW5kZW5jaWVzKGNvbmZpZyk7XG4gIGZvciAoY29uc3QgZGVwZW5kZW5jeSBvZiBtYW5hZ2VkVHNjb25maWdCYXNlRGVwZW5kZW5jaWVzKSB7XG4gICAgaWYgKHVzZWREZXBlbmRlbmN5U2V0LmhhcyhkZXBlbmRlbmN5KSB8fCBleGlzdGluZ1RzY29uZmlnQmFzZURlcGVuZGVuY2llcy5oYXMoZGVwZW5kZW5jeSkpIGNvbnRpbnVlO1xuICAgIC8vIHdiZnkgb3ducyB0aGVzZSBiYXNlLWNvbmZpZyBwYWNrYWdlcy4gUmVtb3ZlIHN0YWxlIHZhcmlhbnRzIHdoZW4gcmVwb1xuICAgIC8vIGNhcGFiaWxpdGllcyBjaGFuZ2UsIHN1Y2ggYXMgTmV4dC5qcyB0YWtpbmcgb3duZXJzaGlwIG9mIHRzY29uZmlnLmpzb24uXG4gICAgZm9yIChjb25zdCBzZWN0aW9uIG9mIGdldERlcGVuZGVuY3lTZWN0aW9ucyhqc29uT2JqKSkge1xuICAgICAgUmVmbGVjdC5kZWxldGVQcm9wZXJ0eShzZWN0aW9uLCBkZXBlbmRlbmN5KTtcbiAgICB9XG4gIH1cbn1cblxuYXN5bmMgZnVuY3Rpb24gZ2V0RXhpc3RpbmdUc2NvbmZpZ0Jhc2VEZXBlbmRlbmNpZXMoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTxTZXQ8c3RyaW5nPj4ge1xuICBjb25zdCBleGlzdGluZ1RzY29uZmlnQmFzZURlcGVuZGVuY2llcyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICBjb25zdCBmaWxlUGF0aHMgPSBhd2FpdCBmZy5nbG9iKCcqKi90c2NvbmZpZyouanNvbicsIHtcbiAgICBjd2Q6IGNvbmZpZy5kaXJQYXRoLFxuICAgIGRvdDogdHJ1ZSxcbiAgICBpZ25vcmU6IGdsb2JJZ25vcmUsXG4gIH0pO1xuXG4gIGZvciAoY29uc3QgZmlsZVBhdGggb2YgZmlsZVBhdGhzKSB7XG4gICAgY29uc3QgYWJzb2x1dGVGaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgZmlsZVBhdGgpO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBwYXJzZWQgPSB0cy5wYXJzZUNvbmZpZ0ZpbGVUZXh0VG9Kc29uKFxuICAgICAgICBhYnNvbHV0ZUZpbGVQYXRoLFxuICAgICAgICBhd2FpdCBmcy5wcm9taXNlcy5yZWFkRmlsZShhYnNvbHV0ZUZpbGVQYXRoLCAndXRmOCcpXG4gICAgICApO1xuICAgICAgaWYgKHBhcnNlZC5lcnJvcikge1xuICAgICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgICAgYFByZXNlcnZlIG1hbmFnZWQgQHRzY29uZmlnIGRlcGVuZGVuY2llcyBiZWNhdXNlICR7YWJzb2x1dGVGaWxlUGF0aH0gY291bGQgbm90IGJlIHBhcnNlZDogJHtmb3JtYXRUc0RpYWdub3N0aWMocGFyc2VkLmVycm9yKX1gXG4gICAgICAgICk7XG4gICAgICAgIHJldHVybiBuZXcgU2V0KG1hbmFnZWRUc2NvbmZpZ0Jhc2VEZXBlbmRlbmNpZXMpO1xuICAgICAgfVxuICAgICAgZm9yIChjb25zdCB2YWx1ZSBvZiBub3JtYWxpemVUc2NvbmZpZ0V4dGVuZHMoKHBhcnNlZC5jb25maWcgYXMgeyBleHRlbmRzPzogdW5rbm93biB9IHwgdW5kZWZpbmVkKT8uZXh0ZW5kcykpIHtcbiAgICAgICAgZm9yIChjb25zdCBkZXBlbmRlbmN5IG9mIG1hbmFnZWRUc2NvbmZpZ0Jhc2VEZXBlbmRlbmNpZXMpIHtcbiAgICAgICAgICBpZiAodmFsdWUgPT09IGRlcGVuZGVuY3kgfHwgdmFsdWUuc3RhcnRzV2l0aChgJHtkZXBlbmRlbmN5fS9gKSkge1xuICAgICAgICAgICAgZXhpc3RpbmdUc2NvbmZpZ0Jhc2VEZXBlbmRlbmNpZXMuYWRkKGRlcGVuZGVuY3kpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgIGBQcmVzZXJ2ZSBtYW5hZ2VkIEB0c2NvbmZpZyBkZXBlbmRlbmNpZXMgYmVjYXVzZSAke2Fic29sdXRlRmlsZVBhdGh9IGNvdWxkIG5vdCBiZSByZWFkOiAke2Vycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogU3RyaW5nKGVycm9yKX1gXG4gICAgICApO1xuICAgICAgcmV0dXJuIG5ldyBTZXQobWFuYWdlZFRzY29uZmlnQmFzZURlcGVuZGVuY2llcyk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGV4aXN0aW5nVHNjb25maWdCYXNlRGVwZW5kZW5jaWVzO1xufVxuXG5mdW5jdGlvbiBmb3JtYXRUc0RpYWdub3N0aWMoZGlhZ25vc3RpYzogdHMuRGlhZ25vc3RpYyk6IHN0cmluZyB7XG4gIHJldHVybiB0cy5mbGF0dGVuRGlhZ25vc3RpY01lc3NhZ2VUZXh0KGRpYWdub3N0aWMubWVzc2FnZVRleHQsICdcXG4nKTtcbn1cblxuZnVuY3Rpb24gbm9ybWFsaXplVHNjb25maWdFeHRlbmRzKHZhbHVlOiB1bmtub3duKTogc3RyaW5nW10ge1xuICBpZiAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJykgcmV0dXJuIFt2YWx1ZV07XG4gIGlmICghQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHJldHVybiBbXTtcbiAgcmV0dXJuIHZhbHVlLmZpbHRlcigoaXRlbSk6IGl0ZW0gaXMgc3RyaW5nID0+IHR5cGVvZiBpdGVtID09PSAnc3RyaW5nJyk7XG59XG5cbmZ1bmN0aW9uIGdldERlcGVuZGVuY3lTZWN0aW9ucyhqc29uT2JqOiBQYWNrYWdlSnNvbik6IFBhcnRpYWw8UmVjb3JkPHN0cmluZywgc3RyaW5nPj5bXSB7XG4gIHJldHVybiBkZXBlbmRlbmN5U2VjdGlvbktleXNcbiAgICAubWFwKChrZXkpID0+IGpzb25PYmpba2V5XSlcbiAgICAuZmlsdGVyKChzZWN0aW9uKTogc2VjdGlvbiBpcyBQYXJ0aWFsPFJlY29yZDxzdHJpbmcsIHN0cmluZz4+ID0+ICEhc2VjdGlvbik7XG59XG5cbmZ1bmN0aW9uIGdldExhdGVzdERlcGVuZGVuY3lWZXJzaW9uKGRlcGVuZGVuY3k6IHN0cmluZyk6IHN0cmluZyB7XG4gIGNvbnN0IGNhY2hlZFZlcnNpb24gPSBsYXRlc3REZXBlbmRlbmN5VmVyc2lvbkNhY2hlLmdldChkZXBlbmRlbmN5KTtcbiAgaWYgKGNhY2hlZFZlcnNpb24pIHJldHVybiBjYWNoZWRWZXJzaW9uO1xuXG4gIGNvbnN0IHZlcnNpb24gPSBnZXREZXBlbmRlbmN5VmVyc2lvbkZyb21OcG0oZGVwZW5kZW5jeSk7XG4gIGxhdGVzdERlcGVuZGVuY3lWZXJzaW9uQ2FjaGUuc2V0KGRlcGVuZGVuY3ksIHZlcnNpb24pO1xuICByZXR1cm4gdmVyc2lvbjtcbn1cblxuZnVuY3Rpb24gZ2V0RGVwZW5kZW5jeVZlcnNpb25Gcm9tTnBtKGRlcGVuZGVuY3k6IHN0cmluZyk6IHN0cmluZyB7XG4gIC8vIG5wbSdzIGxhdGVzdCBkaXN0LXRhZyBzdGlsbCB0cmFja3MgVFM3IGRldiBzbmFwc2hvdHM7IHdiZnkgc2hvdWxkIGZvbGxvd1xuICAvLyB0aGUgcHVibGljIGJldGEgY2hhbm5lbCB1bnRpbCB0aGUgc3RhYmxlIFRTNyBwYWNrYWdlIGxheW91dCBpcyBmaW5hbGl6ZWQuXG4gIHJldHVybiAoXG4gICAgc3Bhd25TeW5jQW5kUmV0dXJuU3Rkb3V0KFxuICAgICAgJ25wbScsXG4gICAgICBbJ3Nob3cnLCBnZXREZXBlbmRlbmN5U3BlY2lmaWVyKGRlcGVuZGVuY3kpLCAndmVyc2lvbicsICctLXdvcmtzcGFjZXM9ZmFsc2UnXSxcbiAgICAgIHByb2Nlc3MuY3dkKClcbiAgICApIHx8ICcqJ1xuICApO1xufVxuXG5mdW5jdGlvbiBnZXREZXBlbmRlbmN5U3BlY2lmaWVyKGRlcGVuZGVuY3k6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiBkZXBlbmRlbmN5ID09PSB0eXBlc2NyaXB0R29EZXBlbmRlbmN5ID8gYCR7ZGVwZW5kZW5jeX1AYmV0YWAgOiBkZXBlbmRlbmN5O1xufVxuXG5mdW5jdGlvbiByZW1vdmVPYnNvbGV0ZUxpbnREZXBlbmRlbmNpZXMoXG4gIGpzb25PYmo6IFNldFJlcXVpcmVkPFBhY2thZ2VKc29uLCAnZGVwZW5kZW5jaWVzJyB8ICdkZXZEZXBlbmRlbmNpZXMnIHwgJ3BlZXJEZXBlbmRlbmNpZXMnPixcbiAgY29uZmlnOiBQYWNrYWdlQ29uZmlnXG4pOiB2b2lkIHtcbiAgY29uc3QgcHJlc2VydmVNaWNyb21hdGNoID0gc2hvdWxkUHJlc2VydmVNaWNyb21hdGNoKGNvbmZpZyk7XG4gIGZvciAoY29uc3QgZGVwZW5kZW5jeSBvZiBvYnNvbGV0ZUxpbnREZXBlbmRlbmNpZXMpIHtcbiAgICBpZiAocHJlc2VydmVNaWNyb21hdGNoICYmIG1pY3JvbWF0Y2hQYWNrYWdlTmFtZXMuaGFzKGRlcGVuZGVuY3kpKSBjb250aW51ZTtcbiAgICBpZiAoc2hvdWxkUHJlc2VydmVDb25maWdQYWNrYWdlTGludERlcGVuZGVuY3koanNvbk9iaiwgY29uZmlnLCBkZXBlbmRlbmN5KSkgY29udGludWU7XG4gICAgZGVsZXRlIGpzb25PYmouZGVwZW5kZW5jaWVzW2RlcGVuZGVuY3ldO1xuICAgIGRlbGV0ZSBqc29uT2JqLmRldkRlcGVuZGVuY2llc1tkZXBlbmRlbmN5XTtcbiAgICBkZWxldGUganNvbk9iai5wZWVyRGVwZW5kZW5jaWVzW2RlcGVuZGVuY3ldO1xuICB9XG59XG5cbmZ1bmN0aW9uIHNob3VsZFByZXNlcnZlQ29uZmlnUGFja2FnZUxpbnREZXBlbmRlbmN5KFxuICBqc29uT2JqOiBTZXRSZXF1aXJlZDxQYWNrYWdlSnNvbiwgJ2RlcGVuZGVuY2llcycgfCAnZGV2RGVwZW5kZW5jaWVzJyB8ICdwZWVyRGVwZW5kZW5jaWVzJz4sXG4gIGNvbmZpZzogUGFja2FnZUNvbmZpZyxcbiAgZGVwZW5kZW5jeTogc3RyaW5nXG4pOiBib29sZWFuIHtcbiAgaWYgKCFpc1B1Ymxpc2hlZFdpbGxib29zdGVyQ29uZmlnc1BhY2thZ2UoY29uZmlnKSkgcmV0dXJuIGZhbHNlO1xuICBpZiAoanNvbk9iai5wZWVyRGVwZW5kZW5jaWVzW2RlcGVuZGVuY3ldKSByZXR1cm4gdHJ1ZTtcblxuICAvLyBQdWJsaXNoZWQgY29uZmlnIHBhY2thZ2VzIG5lZWQgbG9jYWwgdHlwZS1vbmx5IGRlcHMgdG8gdmFsaWRhdGUgdGhlXG4gIC8vIHBhY2thZ2UtcHJvdmlkZWQgY29uZmlnIGRlY2xhcmF0aW9ucyB1bmRlciBZYXJuIFBuUC5cbiAgcmV0dXJuIGRlcGVuZGVuY3kgPT09ICdAdHlwZXMvZXNsaW50JyAmJiAhIWpzb25PYmoucGVlckRlcGVuZGVuY2llcy5lc2xpbnQ7XG59XG5cbmZ1bmN0aW9uIHNob3VsZFByZXNlcnZlTWljcm9tYXRjaChjb25maWc6IFBhY2thZ2VDb25maWcpOiBib29sZWFuIHtcbiAgLy8gd2lsbGJvb3N0ZXItY29uZmlncyBzdWJwYWNrYWdlcyBwdWJsaXNoIGNvbmZpZyBmaWxlcyBhcyB0aGVpciBwcm9kdWN0LCBzb1xuICAvLyBtaWNyb21hdGNoIGlzIHBhY2thZ2UgZGF0YSB0aGVyZS4gT3RoZXIgcmVwb3Mga2VlcCBtaWNyb21hdGNoIG9ubHkgd2hlblxuICAvLyBwcm9kdWN0IGNvZGUgaW1wb3J0cyBpdDsgb3RoZXJ3aXNlIGl0IGlzIHRyZWF0ZWQgYXMgb2Jzb2xldGUgRVNMaW50LWVyYVxuICAvLyB0b29saW5nLlxuICByZXR1cm4gKGNvbmZpZy5pc1dpbGxCb29zdGVyQ29uZmlncyAmJiAhY29uZmlnLmlzUm9vdCkgfHwgZG9lc1Byb2R1Y3RDb2RlSW1wb3J0TWljcm9tYXRjaChjb25maWcuZGlyUGF0aCk7XG59XG5cbmZ1bmN0aW9uIGRvZXNQcm9kdWN0Q29kZUltcG9ydE1pY3JvbWF0Y2goZGlyUGF0aDogc3RyaW5nKTogYm9vbGVhbiB7XG4gIGNvbnN0IGZpbGVQYXRocyA9IGZnLmdsb2JTeW5jKCdzcmMvKiovKi57anMsanN4LG1qcyxjanMsdHMsdHN4LG10cyxjdHN9Jywge1xuICAgIGN3ZDogZGlyUGF0aCxcbiAgICBkb3Q6IHRydWUsXG4gICAgaWdub3JlOiBnbG9iSWdub3JlLFxuICB9KTtcbiAgcmV0dXJuIGZpbGVQYXRocy5zb21lKChmaWxlUGF0aCkgPT4ge1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gbWljcm9tYXRjaEltcG9ydFBhdHRlcm4udGVzdChmcy5yZWFkRmlsZVN5bmMocGF0aC5yZXNvbHZlKGRpclBhdGgsIGZpbGVQYXRoKSwgJ3V0ZjgnKSk7XG4gICAgfSBjYXRjaCB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9KTtcbn1cblxuZnVuY3Rpb24gc2hvdWxkVXBkYXRlRXhpc3RpbmdNYW5hZ2VkRGVwZW5kZW5jeShkZXBlbmRlbmN5OiBzdHJpbmcsIGN1cnJlbnRWZXJzaW9uOiBzdHJpbmcgfCB1bmRlZmluZWQpOiBib29sZWFuIHtcbiAgaWYgKCFjdXJyZW50VmVyc2lvbikgcmV0dXJuIHRydWU7XG4gIGlmIChjdXJyZW50VmVyc2lvbiA9PT0gJyonKSByZXR1cm4gdHJ1ZTtcbiAgaWYgKGlzV29ya3NwYWNlUHJvdG9jb2xSYW5nZShjdXJyZW50VmVyc2lvbikpIHJldHVybiB0cnVlO1xuICAvLyB3YmZ5LW1hbmFnZWQgdG9vbHMgbXVzdCBiZSBrZXB0IGN1cnJlbnQgZXZlbiB3aGVuIHRoZSBwYWNrYWdlIGFscmVhZHkgcGluc1xuICAvLyBhIGNvbmNyZXRlIHZlcnNpb24uIEluIHBhcnRpY3VsYXIsIGJ1aWxkLXRzIG93bnMgZGVjbGFyYXRpb24gb3V0cHV0IHBhdGhzLlxuICByZXR1cm4gKFxuICAgIGRlcGVuZGVuY3kgPT09ICdAd2lsbGJvb3N0ZXIvd2InIHx8XG4gICAgZGVwZW5kZW5jeSA9PT0gYnVpbGRUc0RlcGVuZGVuY3kgfHxcbiAgICBveGxpbnREZXBzLmluY2x1ZGVzKGRlcGVuZGVuY3kpIHx8XG4gICAgZGVwZW5kZW5jeSA9PT0gdHlwZXNjcmlwdEdvRGVwZW5kZW5jeVxuICApO1xufVxuXG5mdW5jdGlvbiBpc1dvcmtzcGFjZVByb3RvY29sUmFuZ2UodmVyc2lvbjogc3RyaW5nKTogYm9vbGVhbiB7XG4gIHJldHVybiB2ZXJzaW9uLnN0YXJ0c1dpdGgoJ3dvcmtzcGFjZTonKTtcbn1cblxuZnVuY3Rpb24gZm9ybWF0UmVwb3NpdG9yeUZvclBhY2thZ2VKc29uKFxuICByZXBvc2l0b3J5OiBQYWNrYWdlSnNvblsncmVwb3NpdG9yeSddLFxuICBleGlzdGluZ1JlcG9zaXRvcnk/OiBQYWNrYWdlSnNvblsncmVwb3NpdG9yeSddXG4pOiBQYWNrYWdlSnNvblsncmVwb3NpdG9yeSddIHtcbiAgY29uc3Qgbm9ybWFsaXplZFJlcG9zaXRvcnkgPSBub3JtYWxpemVSZXBvc2l0b3J5VXJsRm9yUGFja2FnZUpzb24ocmVwb3NpdG9yeSk7XG4gIGlmIChub3JtYWxpemVkUmVwb3NpdG9yeSkge1xuICAgIHJldHVybiBidWlsZE5vcm1hbGl6ZWRSZXBvc2l0b3J5Rm9yUGFja2FnZUpzb24obm9ybWFsaXplZFJlcG9zaXRvcnksIHJlcG9zaXRvcnksIGV4aXN0aW5nUmVwb3NpdG9yeSk7XG4gIH1cblxuICBjb25zdCBub3JtYWxpemVkRXhpc3RpbmdSZXBvc2l0b3J5ID0gbm9ybWFsaXplUmVwb3NpdG9yeVVybEZvclBhY2thZ2VKc29uKGV4aXN0aW5nUmVwb3NpdG9yeSk7XG4gIGlmIChub3JtYWxpemVkRXhpc3RpbmdSZXBvc2l0b3J5KSB7XG4gICAgcmV0dXJuIGJ1aWxkTm9ybWFsaXplZFJlcG9zaXRvcnlGb3JQYWNrYWdlSnNvbihub3JtYWxpemVkRXhpc3RpbmdSZXBvc2l0b3J5LCBleGlzdGluZ1JlcG9zaXRvcnkpO1xuICB9XG5cbiAgcmV0dXJuIHJlcG9zaXRvcnk7XG59XG5cbmZ1bmN0aW9uIG5vcm1hbGl6ZVJlcG9zaXRvcnlVcmxGb3JQYWNrYWdlSnNvbihyZXBvc2l0b3J5OiBQYWNrYWdlSnNvblsncmVwb3NpdG9yeSddKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgaWYgKHR5cGVvZiByZXBvc2l0b3J5ID09PSAnc3RyaW5nJykge1xuICAgIGlmICghcmVwb3NpdG9yeS5zdGFydHNXaXRoKCdnaXRodWI6JykpIHJldHVybjtcblxuICAgIGNvbnN0IFtvd25lciwgcmVwb10gPSBnaXRIdWJVdGlsLmdldE9yZ0FuZE5hbWUocmVwb3NpdG9yeSk7XG4gICAgaWYgKCFvd25lciB8fCAhcmVwbykgcmV0dXJuO1xuICAgIHJldHVybiBgZ2l0K2h0dHBzOi8vZ2l0aHViLmNvbS8ke293bmVyfS8ke3JlcG99LmdpdGA7XG4gIH1cblxuICBjb25zdCByZXBvc2l0b3J5VXJsID0gcmVwb3NpdG9yeT8udXJsO1xuICBpZiAodHlwZW9mIHJlcG9zaXRvcnlVcmwgIT09ICdzdHJpbmcnKSByZXR1cm47XG5cbiAgY29uc3QgbWF0Y2hlZCA9IC9eKD86Z2l0XFwrKT9odHRwczpcXC9cXC9naXRodWJcXC5jb21cXC8oW14vXSspXFwvKFteL10rPykoPzpcXC5naXQpPyQvdS5leGVjKHJlcG9zaXRvcnlVcmwpO1xuICBpZiAoIW1hdGNoZWQpIHJldHVybjtcblxuICBjb25zdCBbLCBvd25lciwgcmVwb10gPSBtYXRjaGVkO1xuICByZXR1cm4gYGdpdCtodHRwczovL2dpdGh1Yi5jb20vJHtvd25lcn0vJHtyZXBvfS5naXRgO1xufVxuXG5mdW5jdGlvbiBidWlsZE5vcm1hbGl6ZWRSZXBvc2l0b3J5Rm9yUGFja2FnZUpzb24oXG4gIG5vcm1hbGl6ZWRVcmw6IHN0cmluZyxcbiAgcmVwb3NpdG9yeTogUGFja2FnZUpzb25bJ3JlcG9zaXRvcnknXSxcbiAgZXhpc3RpbmdSZXBvc2l0b3J5PzogUGFja2FnZUpzb25bJ3JlcG9zaXRvcnknXVxuKTogUGFja2FnZUpzb25bJ3JlcG9zaXRvcnknXSB7XG4gIGNvbnN0IHJlcG9zaXRvcnlPYmogPVxuICAgIHR5cGVvZiByZXBvc2l0b3J5ID09PSAnb2JqZWN0J1xuICAgICAgPyByZXBvc2l0b3J5XG4gICAgICA6IHR5cGVvZiBleGlzdGluZ1JlcG9zaXRvcnkgPT09ICdvYmplY3QnXG4gICAgICAgID8gZXhpc3RpbmdSZXBvc2l0b3J5XG4gICAgICAgIDogdW5kZWZpbmVkO1xuXG4gIHJldHVybiB7XG4gICAgLi4ucmVwb3NpdG9yeU9iaixcbiAgICB0eXBlOiAnZ2l0JyxcbiAgICB1cmw6IG5vcm1hbGl6ZWRVcmwsXG4gIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZW5lcmF0ZVNjcmlwdHMoY29uZmlnOiBQYWNrYWdlQ29uZmlnLCBvbGRTY3JpcHRzOiBQYWNrYWdlSnNvbi5TY3JpcHRzKTogUmVjb3JkPHN0cmluZywgc3RyaW5nPiB7XG4gIGlmIChjb25maWcuaXNCdW4pIHtcbiAgICBjb25zdCBoYXNUeXBlY2hlY2sgPSBjb25maWcuZG9lc0NvbnRhaW5UeXBlU2NyaXB0IHx8IGNvbmZpZy5kb2VzQ29udGFpblR5cGVTY3JpcHRJblBhY2thZ2VzO1xuICAgIGNvbnN0IHNjcmlwdHM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7XG4gICAgICBjbGVhbnVwOiAnYnVuIC0tYnVuIHdiIGxpbnQgLS1maXggLS1mb3JtYXQnLFxuICAgICAgZm9ybWF0OiBgYnVuIC0tYnVuIHdiIGxpbnQgLS1mb3JtYXRgLFxuICAgICAgbGludDogYGJ1biAtLWJ1biB3YiBsaW50YCxcbiAgICAgICdsaW50LWZpeCc6ICdidW4gLS1idW4gd2IgbGludCAtLWZpeCcsXG4gICAgICB0ZXN0OiAnYnVuIHdiIHRlc3QnLFxuICAgICAgdHlwZWNoZWNrOiAnYnVuIC0tYnVuIHdiIHR5cGVjaGVjaycsXG4gICAgICB2ZXJpZnk6ICdidW4gLS1idW4gd2IgdmVyaWZ5JyxcbiAgICAgICd2ZXJpZnktZnVsbCc6ICdidW4gLS1idW4gd2IgdmVyaWZ5IC0tZnVsbCcsXG4gICAgfTtcbiAgICBhcHBseU1pc2VUYXNrU2NyaXB0cyhjb25maWcsIHNjcmlwdHMsIG9sZFNjcmlwdHMsIFsnYnVpbGQnLCAnZGV2JywgJ3N0YXJ0JywgJ3Rlc3QnLCAndHlwZWNoZWNrJ10pO1xuICAgIGlmICghaGFzVHlwZWNoZWNrKSB7XG4gICAgICBkZWxldGUgc2NyaXB0cy50eXBlY2hlY2s7XG4gICAgfSBlbHNlIGlmIChjb25maWcuZGVwZW5kaW5nLnB5cmlnaHQpIHtcbiAgICAgIHNjcmlwdHMudHlwZWNoZWNrICs9ICcgJiYgcHlyaWdodCc7XG4gICAgfVxuICAgIHJldHVybiBzY3JpcHRzO1xuICB9IGVsc2Uge1xuICAgIGNvbnN0IGhhc1R5cGVjaGVjayA9IGNvbmZpZy5kb2VzQ29udGFpblR5cGVTY3JpcHQgfHwgY29uZmlnLmRvZXNDb250YWluVHlwZVNjcmlwdEluUGFja2FnZXM7XG4gICAgY29uc3QgaGFzSnNPclRzID0gZG9lc0NvbnRhaW5Kc09yVHMoY29uZmlnKTtcbiAgICBjb25zdCBoYXNKYXZhID0gZG9lc0NvbnRhaW5KYXZhKGNvbmZpZyk7XG4gICAgY29uc3Qgb2xkVGVzdCA9IG9sZFNjcmlwdHMudGVzdDtcbiAgICBsZXQgc2NyaXB0czogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHtcbiAgICAgIGNsZWFudXA6ICd5YXJuIGZvcm1hdCAmJiB5YXJuIGxpbnQtZml4JyxcbiAgICAgIGZvcm1hdDogZ2VuZXJhdGVGb3JtYXRTY3JpcHQoaGFzSnNPclRzLCBoYXNKYXZhKSxcbiAgICAgIGxpbnQ6IGBveGxpbnQgLS1uby1lcnJvci1vbi11bm1hdGNoZWQtcGF0dGVybiAuYCxcbiAgICAgICdsaW50LWZpeCc6ICd5YXJuIGxpbnQgLS1maXgnLFxuICAgICAgJ2Zvcm1hdC1jb2RlJzogYG94Zm10IC0td3JpdGUgLS1uby1lcnJvci1vbi11bm1hdGNoZWQtcGF0dGVybiAuICchKiovcGFja2FnZS5qc29uJ2AsXG4gICAgICB0eXBlY2hlY2s6ICd0c2dvIC0tbm9FbWl0JyxcbiAgICB9O1xuICAgIGlmIChoYXNKYXZhKSB7XG4gICAgICBzY3JpcHRzLnByZXR0aWZ5ID0gYHByZXR0aWVyIC0tY2FjaGUgLS1jb2xvciAtLW5vLWVycm9yLW9uLXVubWF0Y2hlZC1wYXR0ZXJuIC0td3JpdGUgXCIqKi97LiovLH0qLnske2V4dGVuc2lvbnMucHJldHRpZXJPbmx5LmpvaW4oJywnKX19XCIgXCIhKiovdGVzdHstLC99Zml4dHVyZXMvKipcImA7XG4gICAgfVxuICAgIGlmIChjb25maWcuZG9lc0NvbnRhaW5TdWJQYWNrYWdlSnNvbnMpIHtcbiAgICAgIHNjcmlwdHMgPSBtZXJnZShcbiAgICAgICAgeyAuLi5zY3JpcHRzIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBmb3JtYXQ6IGAke3NjcmlwdHMuZm9ybWF0fSAmJiB5YXJuIHdvcmtzcGFjZXMgZm9yZWFjaCAtLWFsbCAtLXBhcmFsbGVsIC0tdmVyYm9zZSBydW4gZm9ybWF0YCxcbiAgICAgICAgICBsaW50OiBgeWFybiB3b3Jrc3BhY2VzIGZvcmVhY2ggLS1hbGwgLS1wYXJhbGxlbCAtLXZlcmJvc2UgcnVuIGxpbnRgLFxuICAgICAgICAgICdsaW50LWZpeCc6ICd5YXJuIHdvcmtzcGFjZXMgZm9yZWFjaCAtLWFsbCAtLXBhcmFsbGVsIC0tdmVyYm9zZSBydW4gbGludC1maXgnLFxuICAgICAgICAgIC8vIENJPTEgcHJldmVudHMgdml0ZXN0IGZyb20gZW5hYmxpbmcgd2F0Y2guXG4gICAgICAgICAgLy8gRk9SQ0VfQ09MT1I9MyBtYWtlIHdiIGVuYWJsZSBjb2xvciBvdXRwdXQuXG4gICAgICAgICAgdGVzdDogJ0NJPTEgRk9SQ0VfQ09MT1I9MyB5YXJuIHdvcmtzcGFjZXMgZm9yZWFjaCAtLWFsbCAtLXZlcmJvc2UgcnVuIHRlc3QnLFxuICAgICAgICAgIHR5cGVjaGVjazogJ3lhcm4gd29ya3NwYWNlcyBmb3JlYWNoIC0tYWxsIC0tcGFyYWxsZWwgLS12ZXJib3NlIHJ1biB0eXBlY2hlY2snLFxuICAgICAgICB9XG4gICAgICApO1xuICAgICAgaWYgKGhhc0phdmEpIHtcbiAgICAgICAgc2NyaXB0cy5wcmV0dGlmeSA9IGBwcmV0dGllciAtLWNhY2hlIC0tY29sb3IgLS1uby1lcnJvci1vbi11bm1hdGNoZWQtcGF0dGVybiAtLXdyaXRlIFwiKiovey4qLyx9Ki57JHtleHRlbnNpb25zLnByZXR0aWVyT25seS5qb2luKFxuICAgICAgICAgICcsJ1xuICAgICAgICApfX1cIiBcIiEqKi9wYWNrYWdlcy8qKlwiIFwiISoqL3Rlc3R7LSwvfWZpeHR1cmVzLyoqXCJgO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoY29uZmlnLmRlcGVuZGluZy5weXJpZ2h0KSB7XG4gICAgICBzY3JpcHRzLnR5cGVjaGVjayA9IHNjcmlwdHMudHlwZWNoZWNrID8gYCR7c2NyaXB0cy50eXBlY2hlY2t9ICYmIGAgOiAnJztcbiAgICAgIHNjcmlwdHMudHlwZWNoZWNrICs9ICdweXJpZ2h0JztcbiAgICB9XG4gICAgaWYgKG9sZFRlc3Q/LmluY2x1ZGVzKCd3YiB0ZXN0JykpIHtcbiAgICAgIHNjcmlwdHMudGVzdCA9IG9sZFRlc3Q7XG4gICAgfVxuICAgIGlmICghaGFzSnNPclRzKSB7XG4gICAgICBkZWxldGUgc2NyaXB0c1snZm9ybWF0LWNvZGUnXTtcbiAgICAgIGRlbGV0ZSBzY3JpcHRzLmxpbnQ7XG4gICAgICBkZWxldGUgc2NyaXB0c1snbGludC1maXgnXTtcbiAgICB9XG4gICAgaWYgKCFoYXNUeXBlY2hlY2spIHtcbiAgICAgIGRlbGV0ZSBzY3JpcHRzLnR5cGVjaGVjaztcbiAgICB9IGVsc2UgaWYgKGNvbmZpZy5kZXBlbmRpbmcud2IpIHtcbiAgICAgIHNjcmlwdHMudHlwZWNoZWNrID0gJ3diIHR5cGVjaGVjayc7XG4gICAgfVxuICAgIGlmIChpc1diUGFja2FnZShjb25maWcucGFja2FnZUpzb24pKSB7XG4gICAgICBzY3JpcHRzLnZlcmlmeSA9IG9sZFNjcmlwdHMudmVyaWZ5ID8/ICd5YXJuIHdvcmtzcGFjZSBAd2lsbGJvb3N0ZXIvd2Igc3RhcnQgLS13b3JraW5nLWRpciBcIiRJTklUX0NXRFwiIHZlcmlmeSc7XG4gICAgICBzY3JpcHRzWyd2ZXJpZnktZnVsbCddID0gb2xkU2NyaXB0c1sndmVyaWZ5LWZ1bGwnXSA/PyAneWFybiB2ZXJpZnkgLS1mdWxsJztcbiAgICB9IGVsc2Uge1xuICAgICAgc2NyaXB0cy52ZXJpZnkgPSAnd2IgdmVyaWZ5JztcbiAgICAgIHNjcmlwdHNbJ3ZlcmlmeS1mdWxsJ10gPSAnd2IgdmVyaWZ5IC0tZnVsbCc7XG4gICAgfVxuICAgIGFwcGx5TWlzZVRhc2tTY3JpcHRzKGNvbmZpZywgc2NyaXB0cywgb2xkU2NyaXB0cywgWydidWlsZCcsICdkZXYnLCAnc3RhcnQnLCAndGVzdCcsICd0eXBlY2hlY2snXSk7XG4gICAgcmV0dXJuIHNjcmlwdHM7XG4gIH1cbn1cblxuZnVuY3Rpb24gaXNXYlBhY2thZ2UocGFja2FnZUpzb246IFBhY2thZ2VKc29uIHwgdW5kZWZpbmVkKTogYm9vbGVhbiB7XG4gIHJldHVybiBwYWNrYWdlSnNvbj8ubmFtZSA9PT0gd2JEZXBlbmRlbmN5O1xufVxuXG5mdW5jdGlvbiBhcHBseU1pc2VUYXNrU2NyaXB0cyhcbiAgY29uZmlnOiBQYWNrYWdlQ29uZmlnLFxuICBzY3JpcHRzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+LFxuICBvbGRTY3JpcHRzOiBQYWNrYWdlSnNvbi5TY3JpcHRzLFxuICBuYW1lczogc3RyaW5nW11cbik6IHZvaWQge1xuICBmb3IgKGNvbnN0IG5hbWUgb2YgbmFtZXMpIHtcbiAgICBpZiAoIWhhc01pc2VUYXNrKGNvbmZpZywgbmFtZSkpIGNvbnRpbnVlO1xuICAgIGlmIChkb2VzTWlzZVRhc2tDYWxsUGFja2FnZVNjcmlwdChjb25maWcsIG5hbWUpKSBjb250aW51ZTtcbiAgICBpZiAob2xkU2NyaXB0c1tuYW1lXSAmJiAhaXNXYmZ5TWFuYWdlZE1pc2VCcmlkZ2Uob2xkU2NyaXB0c1tuYW1lXSwgbmFtZSkgJiYgIShuYW1lIGluIHNjcmlwdHMpKSBjb250aW51ZTtcbiAgICBzY3JpcHRzW25hbWVdID0gYG1pc2UgcnVuICR7bmFtZX1gO1xuICB9XG59XG5cbmZ1bmN0aW9uIGhhc01pc2VUYXNrKGNvbmZpZzogUGFja2FnZUNvbmZpZywgbmFtZTogc3RyaW5nKTogYm9vbGVhbiB7XG4gIHJldHVybiBPYmplY3QuaGFzT3duKGNvbmZpZy5taXNlVGFza3MsIG5hbWUpO1xufVxuXG5mdW5jdGlvbiBkb2VzTWlzZVRhc2tDYWxsUGFja2FnZVNjcmlwdChjb25maWc6IFBhY2thZ2VDb25maWcsIG5hbWU6IHN0cmluZyk6IGJvb2xlYW4ge1xuICBjb25zdCB0YXNrID0gY29uZmlnLm1pc2VUYXNrc1tuYW1lXTtcbiAgaWYgKCF0YXNrKSByZXR1cm4gZmFsc2U7XG4gIGNvbnN0IHBhY2thZ2VNYW5hZ2VycyA9IFsnYnVuJywgJ3lhcm4nLCAnbnBtJywgJ3BucG0nXTtcbiAgcmV0dXJuIHBhY2thZ2VNYW5hZ2Vycy5zb21lKChwYWNrYWdlTWFuYWdlcikgPT5cbiAgICBuZXcgUmVnRXhwKFN0cmluZy5yYXdgXFxiJHtwYWNrYWdlTWFuYWdlcn1cXHMrKD86cnVuXFxzKyk/JHtlc2NhcGVSZWdFeHAobmFtZSl9KD8hW2EtekEtWjAtOV9cXC06Ll0pYCwgJ3UnKS50ZXN0KHRhc2spXG4gICk7XG59XG5cbmZ1bmN0aW9uIGlzV2JmeU1hbmFnZWRNaXNlQnJpZGdlKHNjcmlwdDogdW5rbm93biwgbmFtZTogc3RyaW5nKTogYm9vbGVhbiB7XG4gIHJldHVybiBzY3JpcHQgPT09IGBtaXNlIHJ1biAke25hbWV9YDtcbn1cblxuZnVuY3Rpb24gZXNjYXBlUmVnRXhwKHZhbHVlOiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gdmFsdWUucmVwbGFjZUFsbCgvWy4qKz9eJHt9KCl8W1xcXVxcXFxdL2csIFN0cmluZy5yYXdgXFwkJmApO1xufVxuXG5mdW5jdGlvbiBnZW5lcmF0ZUZvcm1hdFNjcmlwdChoYXNKc09yVHM6IGJvb2xlYW4sIGhhc0phdmE6IGJvb2xlYW4pOiBzdHJpbmcge1xuICBjb25zdCBjb21tYW5kcyA9IFsnc29ydC1wYWNrYWdlLWpzb24nXTtcbiAgaWYgKGhhc0pzT3JUcykge1xuICAgIGNvbW1hbmRzLnB1c2goJ3lhcm4gZm9ybWF0LWNvZGUnKTtcbiAgfVxuICBpZiAoaGFzSmF2YSkge1xuICAgIGNvbW1hbmRzLnB1c2goJ3lhcm4gcHJldHRpZnknKTtcbiAgfVxuICByZXR1cm4gY29tbWFuZHMuam9pbignICYmICcpO1xufVxuXG5hc3luYyBmdW5jdGlvbiBnZW5lcmF0ZVByZXR0aWVyU3VmZml4KGRpclBhdGg6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nPiB7XG4gIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKGRpclBhdGgsICcucHJldHRpZXJpZ25vcmUnKTtcbiAgY29uc3QgZXhpc3RpbmdDb250ZW50ID0gYXdhaXQgZnMucHJvbWlzZXMucmVhZEZpbGUoZmlsZVBhdGgsICd1dGY4JykuY2F0Y2goKCkgPT4gJycpO1xuICBjb25zdCBpbmRleCA9IGV4aXN0aW5nQ29udGVudC5pbmRleE9mKGlnbm9yZUZpbGVVdGlsLnNlcGFyYXRvclByZWZpeCk7XG4gIGlmIChpbmRleCA9PT0gLTEpIHJldHVybiAnJztcblxuICBjb25zdCBvcmlnaW5hbENvbnRlbnQgPSBleGlzdGluZ0NvbnRlbnQuc2xpY2UoMCwgaW5kZXgpO1xuICBjb25zdCBsaW5lcyA9IG9yaWdpbmFsQ29udGVudFxuICAgIC5zcGxpdCgnXFxuJylcbiAgICAubWFwKChsaW5lKSA9PiB7XG4gICAgICBjb25zdCBuZXdMaW5lID0gbGluZS50cmltKCk7XG4gICAgICByZXR1cm4gbmV3TGluZS5lbmRzV2l0aCgnLycpID8gbmV3TGluZS5zbGljZSgwLCAtMSkgOiBuZXdMaW5lO1xuICAgIH0pXG4gICAgLmZpbHRlcigobCkgPT4gbCAmJiAhbC5zdGFydHNXaXRoKCcjJykgJiYgIWwuaW5jbHVkZXMoJy8nKSk7XG5cbiAgcmV0dXJuIGAke2xpbmVzLm1hcCgobGluZSkgPT4gYCBcIiEqKi8ke2xpbmV9LyoqXCJgKS5qb2luKCcnKX0gfHwgdHJ1ZWA7XG59XG5cbmZ1bmN0aW9uIHJlbW92ZVByZXR0aWVyQXJ0aWZhY3RzKGpzb25PYmo6IFdyaXRhYmxlUGFja2FnZUpzb24pOiB2b2lkIHtcbiAgZGVsZXRlIGpzb25PYmoucHJldHRpZXI7XG4gIGNvbnN0IGRlcGVuZGVuY3lTZWN0aW9uczogQXJyYXk8UGFydGlhbDxSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+PiB8IHVuZGVmaW5lZD4gPSBbXG4gICAganNvbk9iai5kZXBlbmRlbmNpZXMsXG4gICAganNvbk9iai5kZXZEZXBlbmRlbmNpZXMsXG4gICAganNvbk9iai5wZWVyRGVwZW5kZW5jaWVzLFxuICBdO1xuICBmb3IgKGNvbnN0IHNlY3Rpb24gb2YgZGVwZW5kZW5jeVNlY3Rpb25zKSB7XG4gICAgaWYgKCFzZWN0aW9uKSBjb250aW51ZTtcbiAgICBkZWxldGUgc2VjdGlvbi5wcmV0dGllcjtcbiAgICBkZWxldGUgc2VjdGlvblsncHJldHRpZXItcGx1Z2luLWphdmEnXTtcbiAgICBkZWxldGUgc2VjdGlvblsncHJldHRpZXItcGx1Z2luLXByaXNtYSddO1xuICAgIGRlbGV0ZSBzZWN0aW9uWydAd2lsbGJvb3N0ZXIvcHJldHRpZXItY29uZmlnJ107XG4gICAgZGVsZXRlIHNlY3Rpb25bJ0B0eXBlcy9wcmV0dGllciddO1xuICB9XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHVwZGF0ZVByaXZhdGVQYWNrYWdlcyhqc29uT2JqOiBXcml0YWJsZVBhY2thZ2VKc29uKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IHBhY2thZ2VOYW1lcyA9IG5ldyBTZXQoWy4uLk9iamVjdC5rZXlzKGpzb25PYmouZGVwZW5kZW5jaWVzKSwgLi4uT2JqZWN0LmtleXMoanNvbk9iai5kZXZEZXBlbmRlbmNpZXMpXSk7XG4gIGNvbnN0IHByaXZhdGVQYWNrYWdlczoge1xuICAgIHBhY2thZ2VOYW1lOiBzdHJpbmc7XG4gICAgcmVwbzogc3RyaW5nO1xuICAgIHRhcmdldDogJ2RlcGVuZGVuY2llcycgfCAnZGV2RGVwZW5kZW5jaWVzJztcbiAgfVtdID0gW1xuICAgIHsgcGFja2FnZU5hbWU6ICdAd2lsbGJvb3N0ZXIvYXV0aCcsIHJlcG86ICdhdXRoJywgdGFyZ2V0OiAnZGVwZW5kZW5jaWVzJyB9LFxuICAgIHsgcGFja2FnZU5hbWU6ICdAZGlzY29yZC1ib3Qvc2hhcmVkJywgcmVwbzogJ2Rpc2NvcmQtYm90JywgdGFyZ2V0OiAnZGVwZW5kZW5jaWVzJyB9LFxuICAgIHsgcGFja2FnZU5hbWU6ICdAd2lsbGJvb3N0ZXIvY29kZS1hbmFseXplcicsIHJlcG86ICdjb2RlLWFuYWx5emVyJywgdGFyZ2V0OiAnZGV2RGVwZW5kZW5jaWVzJyB9LFxuICAgIHsgcGFja2FnZU5hbWU6ICdAd2lsbGJvb3N0ZXIvanVkZ2UnLCByZXBvOiAnanVkZ2UnLCB0YXJnZXQ6ICdkZXBlbmRlbmNpZXMnIH0sXG4gICAgeyBwYWNrYWdlTmFtZTogJ0B3aWxsYm9vc3Rlci9sbG0tcHJveHknLCByZXBvOiAnbGxtLXByb3h5JywgdGFyZ2V0OiAnZGVwZW5kZW5jaWVzJyB9LFxuICBdO1xuXG4gIGF3YWl0IFByb21pc2UuYWxsKFxuICAgIHByaXZhdGVQYWNrYWdlcy5tYXAoYXN5bmMgKHsgcGFja2FnZU5hbWUsIHJlcG8sIHRhcmdldCB9KSA9PiB7XG4gICAgICBpZiAoIXBhY2thZ2VOYW1lcy5oYXMocGFja2FnZU5hbWUpIHx8IGlzV29ya3NwYWNlUGFja2FnZShqc29uT2JqLCBwYWNrYWdlTmFtZSkpIHJldHVybjtcblxuICAgICAgY29uc3Qgb3RoZXJUYXJnZXQgPSB0YXJnZXQgPT09ICdkZXBlbmRlbmNpZXMnID8gJ2RldkRlcGVuZGVuY2llcycgOiAnZGVwZW5kZW5jaWVzJztcbiAgICAgIC8vIFRoZSBsaW50IHJ1bGUgZGlzYWxsb3dzIGBkZWxldGVgIHdpdGggY29tcHV0ZWQgcGFja2FnZSBuYW1lczsgUmVmbGVjdCBoYXMgdGhlIHNhbWUgZGVsZXRpb24gc2VtYW50aWNzIGhlcmUuXG4gICAgICBSZWZsZWN0LmRlbGV0ZVByb3BlcnR5KGpzb25PYmpbb3RoZXJUYXJnZXRdLCBwYWNrYWdlTmFtZSk7XG4gICAgICBqc29uT2JqW3RhcmdldF1bcGFja2FnZU5hbWVdID0gYXdhaXQgZ2V0TGF0ZXN0UHJpdmF0ZVBhY2thZ2VTcGVjaWZpZXIocmVwbyk7XG4gICAgfSlcbiAgKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gZ2V0TGF0ZXN0UHJpdmF0ZVBhY2thZ2VTcGVjaWZpZXIocmVwbzogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgY29uc3QgY29tbWl0SGFzaCA9IGF3YWl0IGdldExhdGVzdENvbW1pdEhhc2goJ1dpbGxCb29zdGVyTGFiJywgcmVwbyk7XG4gIHJldHVybiBgZ2l0QGdpdGh1Yi5jb206V2lsbEJvb3N0ZXJMYWIvJHtyZXBvfS5naXQjJHtjb21taXRIYXNofWA7XG59XG5cbmZ1bmN0aW9uIGlzV29ya3NwYWNlUGFja2FnZShqc29uT2JqOiBQYWNrYWdlSnNvbiwgcGFja2FnZU5hbWU6IHN0cmluZyk6IGJvb2xlYW4ge1xuICByZXR1cm4gKGpzb25PYmouZGV2RGVwZW5kZW5jaWVzPy5bcGFja2FnZU5hbWVdIHx8IGpzb25PYmouZGVwZW5kZW5jaWVzPy5bcGFja2FnZU5hbWVdIHx8ICcnKS5pbmNsdWRlcygnd29ya3NwYWNlJyk7XG59XG4iLCJpbXBvcnQgeyBzcGF3blN5bmNBbmRSZXR1cm5TdGRvdXQgfSBmcm9tICcuLi91dGlscy9zcGF3blV0aWwuanMnO1xuXG5leHBvcnQgZnVuY3Rpb24gZ2V0TGF0ZXN0Q29tbWl0SGFzaChvcmdhbml6YXRpb246IHN0cmluZywgcmVwbzogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgdHJ5IHtcbiAgICBjb25zdCByZXBvVXJsID0gYGdpdEBnaXRodWIuY29tOiR7b3JnYW5pemF0aW9ufS8ke3JlcG99LmdpdGA7XG4gICAgY29uc3Qgb3V0cHV0ID0gc3Bhd25TeW5jQW5kUmV0dXJuU3Rkb3V0KCdnaXQnLCBbJ2xzLXJlbW90ZScsIHJlcG9VcmwsICdIRUFEJ10sIHByb2Nlc3MuY3dkKCkpO1xuICAgIGNvbnN0IGNvbW1pdEhhc2ggPSBvdXRwdXQuc3BsaXQoL1xccysvKVswXTtcbiAgICBpZiAoIWNvbW1pdEhhc2gpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgTm8gY29tbWl0cyBmb3VuZCBmb3IgJHtvcmdhbml6YXRpb259LyR7cmVwb31gKTtcbiAgICB9XG4gICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShjb21taXRIYXNoKTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IEVycm9yKGBGYWlsZWQgdG8gZmV0Y2ggY29tbWl0cyBmb3IgJHtvcmdhbml6YXRpb259LyR7cmVwb306ICR7U3RyaW5nKGVycm9yKX1gKSk7XG4gIH1cbn1cbiIsIi8vIG94bGludC1kaXNhYmxlIGVzbGludC1wbHVnaW4taW1wb3J0L25vLW5hbWVkLWFzLWRlZmF1bHQtbWVtYmVyIC0tIE5hbWVzcGFjZSBZQU1MIGNhbGxzIG1ha2UgZHVtcCB1c2FnZSBjbGVhcmVyLlxuaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHlhbWwgZnJvbSAnanMteWFtbCc7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGV4dGVuc2lvbnMgfSBmcm9tICcuLi91dGlscy9leHRlbnNpb25zLmpzJztcbmltcG9ydCB7IGdldEdlbkkxOG5Uc0NvbW1hbmQgfSBmcm9tICcuLi91dGlscy9nZW5JMThuVHMuanMnO1xuaW1wb3J0IHsgZG9lc0NvbnRhaW5KYXZhLCBkb2VzQ29udGFpbkpzT3JUcyB9IGZyb20gJy4uL3V0aWxzL3BhY2thZ2VDYXBhYmlsaXRpZXMuanMnO1xuaW1wb3J0IHsgc3Bhd25TeW5jIH0gZnJvbSAnLi4vdXRpbHMvc3Bhd25VdGlsLmpzJztcblxuaW1wb3J0IHsgZ2VuZXJhdGVTY3JpcHRzIH0gZnJvbSAnLi9wYWNrYWdlSnNvbi5qcyc7XG5cbmludGVyZmFjZSBMZWZ0aG9va1NldHRpbmdzIHtcbiAgZ2xvYl9tYXRjaGVyOiAnZG91Ymxlc3Rhcic7XG4gICdwb3N0LW1lcmdlJzoge1xuICAgIGpvYnM6IExlZnRob29rSm9iW107XG4gIH07XG4gICdwcmUtY29tbWl0Jzoge1xuICAgIGpvYnM6IExlZnRob29rSm9iW107XG4gIH07XG4gICdwcmUtcHVzaCc6IHtcbiAgICBqb2JzOiBMZWZ0aG9va0pvYltdO1xuICB9O1xufVxuXG5pbnRlcmZhY2UgTGVmdGhvb2tKb2Ige1xuICBuYW1lOiBzdHJpbmc7XG4gIGdsb2I/OiBzdHJpbmc7XG4gIHJ1bj86IHN0cmluZztcbiAgc2NyaXB0Pzogc3RyaW5nO1xuICBydW5uZXI/OiAnYmFzaCc7XG4gIHN0YWdlX2ZpeGVkPzogdHJ1ZTtcbn1cblxuY29uc3QgYmFzZVNldHRpbmdzOiBPbWl0PExlZnRob29rU2V0dGluZ3MsICdwcmUtY29tbWl0Jz4gPSB7XG4gIGdsb2JfbWF0Y2hlcjogJ2RvdWJsZXN0YXInLFxuICAncG9zdC1tZXJnZSc6IHtcbiAgICBqb2JzOiBbXG4gICAgICB7XG4gICAgICAgIG5hbWU6ICdwcmVwYXJlJyxcbiAgICAgICAgc2NyaXB0OiAncHJlcGFyZS5zaCcsXG4gICAgICAgIHJ1bm5lcjogJ2Jhc2gnLFxuICAgICAgfSxcbiAgICBdLFxuICB9LFxuICAncHJlLXB1c2gnOiB7XG4gICAgam9iczogW1xuICAgICAge1xuICAgICAgICBuYW1lOiAnY2hlY2snLFxuICAgICAgICBzY3JpcHQ6ICdjaGVjay5zaCcsXG4gICAgICAgIHJ1bm5lcjogJ2Jhc2gnLFxuICAgICAgfSxcbiAgICBdLFxuICB9LFxufTtcblxuY29uc3QgcHJlQ29tbWl0U2V0dGluZ3M6IExlZnRob29rU2V0dGluZ3NbJ3ByZS1jb21taXQnXSA9IHtcbiAgam9iczogW1xuICAgIHtcbiAgICAgIG5hbWU6ICdjbGVhbnVwJyxcbiAgICAgIGdsb2I6ICcnLFxuICAgICAgcnVuOiAnJyxcbiAgICAgIHN0YWdlX2ZpeGVkOiB0cnVlLFxuICAgIH0sXG4gICAge1xuICAgICAgbmFtZTogJ2NoZWNrLW1pZ3JhdGlvbnMnLFxuICAgICAgZ2xvYjogJyoqL21pZ3JhdGlvbi5zcWwnLFxuICAgICAgcnVuOiBgXG5mYWlsZWQ9MFxuIyBMZWZ0aG9vayBleHBhbmRzIHtzdGFnZWRfZmlsZXN9IGFzIHNoZWxsLWVzY2FwZWQgYXJncywgc28gcGF0aHMgd2l0aCBzcGFjZXMgc3RheSBpbnRhY3QuXG5mb3IgZmlsZSBpbiB7c3RhZ2VkX2ZpbGVzfTsgZG9cbiAgaWYgZ3JlcCAtcSAnV2FybmluZ3M6JyBcIiRmaWxlXCI7IHRoZW5cbiAgICBlY2hvIFwiTWlncmF0aW9uIFNRTCBmaWxlICgkZmlsZSkgY29udGFpbnMgd2FybmluZ3MhIFBsZWFzZSBzb2x2ZSB0aGUgd2FybmluZ3MgYW5kIGNvbW1pdCBhZ2Fpbi5cIlxuICAgIGZhaWxlZD0xXG4gIGZpXG5kb25lXG5leGl0IFwiJGZhaWxlZFwiXG5gLnRyaW0oKSxcbiAgICB9LFxuICBdLFxufTtcblxuY29uc3Qgc2NyaXB0cyA9IHtcbiAgcG9zdE1lcmdlOiBgXG4jIS9iaW4vYmFzaFxuXG5jaGFuZ2VkX2ZpbGVzPVwiJChnaXQgZGlmZi10cmVlIC1yIC0tbmFtZS1vbmx5IC0tbm8tY29tbWl0LWlkIE9SSUdfSEVBRCBIRUFEKVwiXG5cbnJ1bl9pZl9jaGFuZ2VkKCkge1xuICBpZiBlY2hvIFwiJGNoYW5nZWRfZmlsZXNcIiB8IGdyZXAgLS1xdWlldCAtRSBcIiQxXCI7IHRoZW5cbiAgICBldmFsIFwiJDJcIlxuICBmaVxufVxuYC50cmltKCksXG59O1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVMZWZ0aG9va1VwZGF0aW5nUGFja2FnZUpzb24oY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZ2VuZXJhdGVMZWZ0aG9va1VwZGF0aW5nUGFja2FnZUpzb24nLCBhc3luYyAoKSA9PiB7XG4gICAgYXdhaXQgY29yZShjb25maWcpO1xuICB9KTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gY29yZShjb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgZGlyUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJy5sZWZ0aG9vaycpO1xuICBjb25zdCBodXNreURpclBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICcuaHVza3knKTtcbiAgY29uc3QgaGFzSHVza3lEaXIgPSBmcy5leGlzdHNTeW5jKGh1c2t5RGlyUGF0aCk7XG4gIGNvbnN0IHsgbGludCB9ID0gZ2VuZXJhdGVTY3JpcHRzKGNvbmZpZywge30pO1xuICBjb25zdCBzZXR0aW5nczogUGFydGlhbDxMZWZ0aG9va1NldHRpbmdzPiA9IHtcbiAgICAuLi5iYXNlU2V0dGluZ3MsXG4gICAgJ3ByZS1jb21taXQnOiB7XG4gICAgICBqb2JzOiBnZXRQcmVDb21taXRKb2JzKGNvbmZpZyksXG4gICAgfSxcbiAgfTtcbiAgaWYgKCFsaW50KSB7XG4gICAgZGVsZXRlIHNldHRpbmdzWydwcmUtcHVzaCddO1xuICB9XG4gIGF3YWl0IFByb21pc2UuYWxsKFtcbiAgICBmcy5wcm9taXNlcy53cml0ZUZpbGUoXG4gICAgICBwYXRoLmpvaW4oY29uZmlnLmRpclBhdGgsICdsZWZ0aG9vay55bWwnKSxcbiAgICAgIHlhbWwuZHVtcChzZXR0aW5ncywge1xuICAgICAgICBsaW5lV2lkdGg6IC0xLFxuICAgICAgICBub0NvbXBhdE1vZGU6IHRydWUsXG4gICAgICAgIHN0eWxlczoge1xuICAgICAgICAgICchIW51bGwnOiAnZW1wdHknLFxuICAgICAgICB9LFxuICAgICAgfSlcbiAgICApLFxuICAgIGZzLnByb21pc2VzLnJtKGRpclBhdGgsIHsgZm9yY2U6IHRydWUsIHJlY3Vyc2l2ZTogdHJ1ZSB9KSxcbiAgXSk7XG4gIGlmIChoYXNIdXNreURpcikge1xuICAgIGF3YWl0IFByb21pc2UuYWxsKFtcbiAgICAgIGZzLnByb21pc2VzLnJtKGh1c2t5RGlyUGF0aCwgeyBmb3JjZTogdHJ1ZSwgcmVjdXJzaXZlOiB0cnVlIH0pLFxuICAgICAgZnMucHJvbWlzZXMucm0ocGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnLmh1c2t5cmMuanNvbicpLCB7IGZvcmNlOiB0cnVlIH0pLFxuICAgIF0pO1xuICAgIHNwYXduU3luYygnZ2l0JywgWydjb25maWcnLCAnLS11bnNldCcsICdjb3JlLmhvb2tzUGF0aCddLCBjb25maWcuZGlyUGF0aCk7XG4gIH1cblxuICBpZiAobGludCkge1xuICAgIGNvbnN0IHByZVB1c2ggPSBnZXRQcmVQdXNoU2NyaXB0KGNvbmZpZyk7XG4gICAgZnMubWtkaXJTeW5jKHBhdGguam9pbihkaXJQYXRoLCAncHJlLXB1c2gnKSwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gICAgYXdhaXQgZnMucHJvbWlzZXMud3JpdGVGaWxlKHBhdGguam9pbihkaXJQYXRoLCAncHJlLXB1c2gnLCAnY2hlY2suc2gnKSwgcHJlUHVzaCArICdcXG4nLCB7XG4gICAgICBtb2RlOiAwbzc1NSxcbiAgICB9KTtcbiAgfVxuICBjb25zdCBwb3N0TWVyZ2VDb21tYW5kID0gYCR7c2NyaXB0cy5wb3N0TWVyZ2V9XFxuXFxuJHtnZW5lcmF0ZVBvc3RNZXJnZUNvbW1hbmRzKGNvbmZpZykuam9pbignXFxuJyl9XFxuYDtcbiAgZnMubWtkaXJTeW5jKHBhdGguam9pbihkaXJQYXRoLCAncG9zdC1tZXJnZScpLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgYXdhaXQgZnMucHJvbWlzZXMud3JpdGVGaWxlKHBhdGgucmVzb2x2ZShkaXJQYXRoLCAncG9zdC1tZXJnZScsICdwcmVwYXJlLnNoJyksIHBvc3RNZXJnZUNvbW1hbmQsIHtcbiAgICBtb2RlOiAwbzc1NSxcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIGdldFByZVB1c2hTY3JpcHQoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogc3RyaW5nIHtcbiAgbGV0IGxpbnRDb21tYW5kOiBzdHJpbmc7XG4gIGlmIChjb25maWcuaXNCdW4pIHtcbiAgICAvLyBCdW4gcmVwb3MgcmVjZWl2ZSB3YiBhcyBwYXJ0IG9mIHdiZnkncyBtYW5hZ2VkIHRvb2xjaGFpbiwgc28gZ2VuZXJhdGUgdGhlXG4gICAgLy8gZmluYWwgaG9vayBjb21tYW5kIG9uIHRoZSBmaXJzdCBydW4gaW5zdGVhZCBvZiBjaGFuZ2luZyBpdCBvbiB0aGUgc2Vjb25kLlxuICAgIGxpbnRDb21tYW5kID0gJ2J1biAtLWJ1biB3YiBsaW50JztcbiAgfSBlbHNlIHtcbiAgICBsaW50Q29tbWFuZCA9IGNvbmZpZy5kZXBlbmRpbmcud2IgPyAneWFybiB3YiBsaW50JyA6ICd5YXJuIHJ1biBsaW50JztcbiAgfVxuICBjb25zdCBxdWlldExpbnRDb21tYW5kID0gYCR7bGludENvbW1hbmR9IC0tcXVpZXRgO1xuICAvLyBObyBzZXBhcmF0ZSB0eXBlY2hlY2sgc3RlcCBuZWVkZWQg4oCUIHRoZSBsaW50IGNvbW1hbmQgYWxyZWFkeSBpbmNsdWRlcyB0eXBlY2hlY2tpbmcuXG4gIGlmIChjb25maWcucmVwb3NpdG9yeT8uc3RhcnRzV2l0aCgnZ2l0aHViOldpbGxCb29zdGVyTGFiLycpKSB7XG4gICAgcmV0dXJuIGBcbiMhL2Jpbi9iYXNoXG5cbmlmIFsgJChnaXQgYnJhbmNoIC0tc2hvdy1jdXJyZW50KSA9IFwibWFpblwiIF0gJiYgWyAkKGdpdCBjb25maWcgdXNlci5lbWFpbCkgIT0gXCJleGthenV1QGdtYWlsLmNvbVwiIF07IHRoZW5cbiAgZWNobyBcIioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlwiXG4gIGVjaG8gXCIqKiogRG9uJ3QgcHVzaCBtYWluIGJyYW5jaCBkaXJlY3RseS4gVXNlIFBSISAqKipcIlxuICBlY2hvIFwiKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXCJcbiAgZXhpdCAxXG5maVxuXG4ke3F1aWV0TGludENvbW1hbmR9XG5gLnRyaW0oKTtcbiAgfVxuICByZXR1cm4gcXVpZXRMaW50Q29tbWFuZDtcbn1cblxuZnVuY3Rpb24gZ2V0UHJlQ29tbWl0Sm9icyhjb25maWc6IFBhY2thZ2VDb25maWcpOiBMZWZ0aG9va0pvYltdIHtcbiAgcmV0dXJuIHByZUNvbW1pdFNldHRpbmdzLmpvYnMubWFwKChqb2IpID0+XG4gICAgam9iLm5hbWUgPT09ICdjbGVhbnVwJ1xuICAgICAgPyB7XG4gICAgICAgICAgLi4uam9iLFxuICAgICAgICAgIGdsb2I6IGdldENsZWFudXBHbG9icyhjb25maWcpLFxuICAgICAgICAgIHJ1bjogZ2V0Q2xlYW51cENvbW1hbmQoY29uZmlnKSxcbiAgICAgICAgfVxuICAgICAgOiBqb2JcbiAgKTtcbn1cblxuZnVuY3Rpb24gZ2V0Q2xlYW51cEdsb2JzKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IHN0cmluZyB7XG4gIC8vIExldCBgd2IgbGludCAtLWZvcm1hdGAgZGVjaWRlIHdoZXRoZXIgUHJldHRpZXIgaXMgYXZhaWxhYmxlOyB0aGUgaG9va1xuICAvLyBzdGlsbCBuZWVkcyB0byB0cmlnZ2VyIHdoZW4gYWRkaW5nIHRoZSBmaXJzdCBwcmV0dGllci1vbmx5IGZpbGUuXG4gIGNvbnN0IHN1cHBvcnRlZEV4dGVuc2lvbnMgPVxuICAgIGNvbmZpZy5pc0J1biB8fCBjb25maWcuZGVwZW5kaW5nLndiIHx8IGRvZXNDb250YWluSmF2YShjb25maWcpID8gWy4uLmV4dGVuc2lvbnMucHJldHRpZXJPbmx5XSA6IFtdO1xuICBpZiAoZG9lc0NvbnRhaW5Kc09yVHMoY29uZmlnKSkge1xuICAgIHN1cHBvcnRlZEV4dGVuc2lvbnMucHVzaCguLi5leHRlbnNpb25zLm94Zm10LCAuLi5leHRlbnNpb25zLm94bGludCk7XG4gIH1cbiAgaWYgKGNvbmZpZy5kb2VzQ29udGFpblBvZXRyeUxvY2sgfHwgY29uZmlnLmRvZXNDb250YWluVXZMb2NrKSB7XG4gICAgc3VwcG9ydGVkRXh0ZW5zaW9ucy5wdXNoKCdweScpO1xuICB9XG4gIGlmIChjb25maWcuZG9lc0NvbnRhaW5QdWJzcGVjWWFtbCkge1xuICAgIHN1cHBvcnRlZEV4dGVuc2lvbnMucHVzaCgnZGFydCcpO1xuICB9XG4gIGNvbnN0IGZpbHRlcmVkRXh0ZW5zaW9ucyA9IFsuLi5uZXcgU2V0KHN1cHBvcnRlZEV4dGVuc2lvbnMpXS50b1NvcnRlZCgpO1xuICByZXR1cm4gYCoqLyoueyR7ZmlsdGVyZWRFeHRlbnNpb25zLmpvaW4oJywnKX19YDtcbn1cblxuZnVuY3Rpb24gZ2V0Q2xlYW51cENvbW1hbmQoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogc3RyaW5nIHtcbiAgaWYgKGhhc0xvY2FsV2JXb3Jrc3BhY2UoY29uZmlnKSkge1xuICAgIHJldHVybiBTdHJpbmcucmF3YFxuIyBMZWZ0aG9vayBleHBhbmRzIHtzdGFnZWRfZmlsZXN9IGFzIHNoZWxsLWVzY2FwZWQgYXJncywgc28gcGF0aHMgd2l0aCBzcGFjZXMgc3RheSBpbnRhY3QuXG55YXJuIHdvcmtzcGFjZSBAd2lsbGJvb3N0ZXIvd2Igc3RhcnQgLS13b3JraW5nLWRpciBcIiQoZ2l0IHJldi1wYXJzZSAtLXNob3ctdG9wbGV2ZWwpXCIgbGludCAtLWZpeCAtLWZvcm1hdCAtLSB7c3RhZ2VkX2ZpbGVzfVxuYC50cmltKCk7XG4gIH1cbiAgLy8gUHl0aG9uLW9ubHkgQnVuIHJlcG9zIGluc3RhbGwgd2IgZm9yIHNoYXJlZCBzY3JpcHRzIGJ1dCBub3QgT3hsaW50LCBzb1xuICAvLyBzdGFnZWQtZmlsZSBob29rcyBtdXN0IHVzZSB0aGUgbGFuZ3VhZ2Utc3BlY2lmaWMgZm9ybWF0dGVyIHBhdGggYmVsb3cuXG4gIGNvbnN0IGNhblVzZVdiRm9yU3RhZ2VkRmlsZXMgPSBkb2VzQ29udGFpbkpzT3JUcyhjb25maWcpIHx8IGRvZXNDb250YWluSmF2YShjb25maWcpO1xuICBpZiAoKGNvbmZpZy5pc0J1biB8fCBjb25maWcuZGVwZW5kaW5nLndiKSAmJiBjYW5Vc2VXYkZvclN0YWdlZEZpbGVzKSB7XG4gICAgcmV0dXJuIGBcbiMgTGVmdGhvb2sgZXhwYW5kcyB7c3RhZ2VkX2ZpbGVzfSBhcyBzaGVsbC1lc2NhcGVkIGFyZ3MsIHNvIHBhdGhzIHdpdGggc3BhY2VzIHN0YXkgaW50YWN0LlxuJHtjb25maWcuaXNCdW4gPyAnYnVuIC0tYnVuIHdiJyA6ICd5YXJuIHdiJ30gbGludCAtLWZpeCAtLWZvcm1hdCAtLSB7c3RhZ2VkX2ZpbGVzfVxuYC50cmltKCk7XG4gIH1cblxuICBjb25zdCBveGxpbnRQYXR0ZXJuID0gZXh0ZW5zaW9ucy5veGxpbnQubWFwKChleHRlbnNpb24pID0+IFN0cmluZy5yYXdgXFwuJHtleHRlbnNpb259JGApLmpvaW4oJ3wnKTtcbiAgY29uc3Qgb3hmbXRQYXR0ZXJuID0gZXh0ZW5zaW9ucy5veGZtdC5tYXAoKGV4dGVuc2lvbikgPT4gU3RyaW5nLnJhd2BcXC4ke2V4dGVuc2lvbn0kYCkuam9pbignfCcpO1xuICBjb25zdCBwcmV0dGllclBhdHRlcm4gPSBleHRlbnNpb25zLnByZXR0aWVyT25seS5tYXAoKGV4dGVuc2lvbikgPT4gU3RyaW5nLnJhd2BcXC4ke2V4dGVuc2lvbn0kYCkuam9pbignfCcpO1xuICBjb25zdCBoYXNKc09yVHMgPSBkb2VzQ29udGFpbkpzT3JUcyhjb25maWcpO1xuICBjb25zdCBoYXNKYXZhID0gZG9lc0NvbnRhaW5KYXZhKGNvbmZpZyk7XG5cbiAgcmV0dXJuIFN0cmluZy5yYXdgXG4jIExlZnRob29rIGV4cGFuZHMge3N0YWdlZF9maWxlc30gYXMgc2hlbGwtZXNjYXBlZCBhcmdzLCBzbyBwYXRocyB3aXRoIHNwYWNlcyBzdGF5IGludGFjdC5cbiR7aGFzSnNPclRzID8gU3RyaW5nLnJhd2BveGxpbnRfZmlsZXM9XCIkKHByaW50ZiAnJXNcXG4nIHtzdGFnZWRfZmlsZXN9IHwgZ3JlcCAtRSAnKCR7b3hsaW50UGF0dGVybn0pJyB8fCB0cnVlKVwiYCA6ICcnfVxuJHtoYXNKc09yVHMgPyBTdHJpbmcucmF3YG94Zm10X2ZpbGVzPVwiJChwcmludGYgJyVzXFxuJyB7c3RhZ2VkX2ZpbGVzfSB8IGdyZXAgLUUgJygke294Zm10UGF0dGVybn0pJyB8IGdyZXAgLXYgLUUgJyhefC8pcGFja2FnZVxcLmpzb24kJyB8fCB0cnVlKVwiYCA6ICcnfVxuJHtoYXNKYXZhID8gU3RyaW5nLnJhd2BwcmV0dGllcl9maWxlcz1cIiQocHJpbnRmICclc1xcbicge3N0YWdlZF9maWxlc30gfCBncmVwIC1FICcoJHtwcmV0dGllclBhdHRlcm59KScgfHwgdHJ1ZSlcImAgOiAnJ31cbnBhY2thZ2VfanNvbl9maWxlcz1cIiQocHJpbnRmICclc1xcbicge3N0YWdlZF9maWxlc30gfCBncmVwIC1FICcoXnwvKXBhY2thZ2VcXC5qc29uJCcgfHwgdHJ1ZSlcIlxuJHtoYXNQeXRob25QYWNrYWdlTWFuYWdlcihjb25maWcpID8gU3RyaW5nLnJhd2BweXRob25fZmlsZXM9XCIkKHByaW50ZiAnJXNcXG4nIHtzdGFnZWRfZmlsZXN9IHwgZ3JlcCAtRSAnXFwucHkkJyB8fCB0cnVlKVwiYCA6ICcnfVxuJHtjb25maWcuZG9lc0NvbnRhaW5QdWJzcGVjWWFtbCA/IFN0cmluZy5yYXdgZGFydF9maWxlcz1cIiQocHJpbnRmICclc1xcbicge3N0YWdlZF9maWxlc30gfCBncmVwIC1FICdcXC5kYXJ0JCcgfCBncmVwIC12ICdnZW5lcmF0ZWQnIHwgZ3JlcCAtdiAnXFwuZnJlZXplZFxcLmRhcnQkJyB8IGdyZXAgLXYgJ1xcLmdcXC5kYXJ0JCcgfHwgdHJ1ZSlcImAgOiAnJ31cblxuJHtcbiAgaGFzSnNPclRzXG4gICAgPyBTdHJpbmcucmF3YFxuaWYgWyAtbiBcIiRveGZtdF9maWxlc1wiIF07IHRoZW5cbiAgbm9kZSBub2RlX21vZHVsZXMvLmJpbi9veGZtdCAtLXdyaXRlIC0tbm8tZXJyb3Itb24tdW5tYXRjaGVkLXBhdHRlcm4gJyEqKi9wYWNrYWdlLmpzb24nICRveGZtdF9maWxlc1xuZmlcbmBcbiAgICA6ICcnXG59XG4ke1xuICBoYXNKYXZhXG4gICAgPyBTdHJpbmcucmF3YGlmIFsgLW4gXCIkcHJldHRpZXJfZmlsZXNcIiBdOyB0aGVuXG4gIG5vZGUgbm9kZV9tb2R1bGVzLy5iaW4vcHJldHRpZXIgLS1jYWNoZSAtLXdyaXRlIC0taWdub3JlLXVua25vd24gLS0gJHByZXR0aWVyX2ZpbGVzXG5maWBcbiAgICA6ICcnXG59XG4ke1xuICBoYXNKc09yVHNcbiAgICA/IFN0cmluZy5yYXdgXG5pZiBbIC1uIFwiJG94bGludF9maWxlc1wiIF07IHRoZW5cbiAgbm9kZSBub2RlX21vZHVsZXMvLmJpbi9veGxpbnQgLS1maXggJG94bGludF9maWxlc1xuZmlcbmBcbiAgICA6ICcnXG59XG5pZiBbIC1uIFwiJHBhY2thZ2VfanNvbl9maWxlc1wiIF07IHRoZW5cbiAgbm9kZSBub2RlX21vZHVsZXMvLmJpbi9zb3J0LXBhY2thZ2UtanNvbiAtLSAkcGFja2FnZV9qc29uX2ZpbGVzXG5maVxuJHtcbiAgaGFzUHl0aG9uUGFja2FnZU1hbmFnZXIoY29uZmlnKVxuICAgID8gYGlmIFsgLW4gXCIkcHl0aG9uX2ZpbGVzXCIgXTsgdGhlblxuICAke2dldFB5dGhvblJ1bm5lcihjb25maWcpfSBpc29ydCAtLXByb2ZpbGUgYmxhY2sgLS1maWx0ZXItZmlsZXMgJHB5dGhvbl9maWxlc1xuICAke2dldFB5dGhvblJ1bm5lcihjb25maWcpfSBibGFjayAkcHl0aG9uX2ZpbGVzXG4gICR7Z2V0UHl0aG9uUnVubmVyKGNvbmZpZyl9IGZsYWtlOCAkcHl0aG9uX2ZpbGVzXG5maWBcbiAgICA6ICcnXG59XG4ke1xuICBjb25maWcuZG9lc0NvbnRhaW5QdWJzcGVjWWFtbFxuICAgID8gYGlmIFsgLW4gXCIkZGFydF9maWxlc1wiIF07IHRoZW5cbiAgZGFydCBmb3JtYXQgJGRhcnRfZmlsZXNcbmZpYFxuICAgIDogJydcbn1cbmAudHJpbSgpO1xufVxuXG5mdW5jdGlvbiBoYXNMb2NhbFdiV29ya3NwYWNlKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IGJvb2xlYW4ge1xuICBpZiAoIWNvbmZpZy5pc1Jvb3QpIHJldHVybiBmYWxzZTtcblxuICBjb25zdCBsb2NhbFdiUGFja2FnZUpzb25QYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAncGFja2FnZXMnLCAnd2InLCAncGFja2FnZS5qc29uJyk7XG4gIGlmICghZnMuZXhpc3RzU3luYyhsb2NhbFdiUGFja2FnZUpzb25QYXRoKSkgcmV0dXJuIGZhbHNlO1xuXG4gIHRyeSB7XG4gICAgY29uc3QgcGFja2FnZUpzb24gPSBKU09OLnBhcnNlKGZzLnJlYWRGaWxlU3luYyhsb2NhbFdiUGFja2FnZUpzb25QYXRoLCAndXRmOCcpKSBhcyB7IG5hbWU/OiBzdHJpbmcgfTtcbiAgICByZXR1cm4gcGFja2FnZUpzb24ubmFtZSA9PT0gJ0B3aWxsYm9vc3Rlci93Yic7XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxufVxuXG5mdW5jdGlvbiBnZW5lcmF0ZVBvc3RNZXJnZUNvbW1hbmRzKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IHN0cmluZ1tdIHtcbiAgY29uc3QgcG9zdE1lcmdlQ29tbWFuZHM6IHN0cmluZ1tdID0gW107XG4gIGlmIChjb25maWcuaGFzVmVyc2lvblNldHRpbmdzKSB7XG4gICAgY29uc3QgdG9vbHNDaGFuZ2VkUGF0dGVybiA9IFN0cmluZy5yYXdgKG1pc2VcXC50b21sfFxcLm1pc2VcXC50b21sfFxcLnRvb2wtdmVyc2lvbnN8XFwuListdmVyc2lvbilgO1xuICAgIHBvc3RNZXJnZUNvbW1hbmRzLnB1c2goU3RyaW5nLnJhd2BydW5faWZfY2hhbmdlZCBcIiR7dG9vbHNDaGFuZ2VkUGF0dGVybn1cIiBcIm1pc2UgaW5zdGFsbFwiYCk7XG4gIH1cbiAgY29uc3QgaW5zdGFsbENvbW1hbmQgPSBjb25maWcuaXNCdW4gPyAnYnVuIGluc3RhbGwnIDogJ3lhcm4nO1xuICBjb25zdCBybU5leHREaXJlY3RvcnkgPSBjb25maWcuZGVwZW5kaW5nLmJsaXR6IHx8IGNvbmZpZy5kZXBlbmRpbmcubmV4dCA/ICcgJiYgcm0gLVJmIC5uZXh0JyA6ICcnO1xuICBwb3N0TWVyZ2VDb21tYW5kcy5wdXNoKFN0cmluZy5yYXdgcnVuX2lmX2NoYW5nZWQgXCJwYWNrYWdlXFwuanNvblwiIFwiJHtpbnN0YWxsQ29tbWFuZH0ke3JtTmV4dERpcmVjdG9yeX1cImApO1xuICBpZiAoY29uZmlnLmRvZXNDb250YWluUG9ldHJ5TG9jaykge1xuICAgIHBvc3RNZXJnZUNvbW1hbmRzLnB1c2goU3RyaW5nLnJhd2BydW5faWZfY2hhbmdlZCBcInBvZXRyeVxcLmxvY2tcIiBcInBvZXRyeSBpbnN0YWxsXCJgKTtcbiAgfVxuICBpZiAoY29uZmlnLmRvZXNDb250YWluVXZMb2NrKSB7XG4gICAgcG9zdE1lcmdlQ29tbWFuZHMucHVzaChTdHJpbmcucmF3YHJ1bl9pZl9jaGFuZ2VkIFwidXZcXC5sb2NrXCIgXCJ1diBzeW5jIC0tZnJvemVuXCJgKTtcbiAgfVxuICBpZiAoY29uZmlnLmRlcGVuZGluZy5ibGl0eikge1xuICAgIHBvc3RNZXJnZUNvbW1hbmRzLnB1c2goXG4gICAgICBTdHJpbmcucmF3YHJ1bl9pZl9jaGFuZ2VkIFwiLipcXC5wcmlzbWFcIiBcIm5vZGUgbm9kZV9tb2R1bGVzLy5iaW4vYmxpdHogcHJpc21hIG1pZ3JhdGUgZGVwbG95XCJgLFxuICAgICAgU3RyaW5nLnJhd2BydW5faWZfY2hhbmdlZCBcIi4qXFwucHJpc21hXCIgXCJub2RlIG5vZGVfbW9kdWxlcy8uYmluL2JsaXR6IHByaXNtYSBnZW5lcmF0ZVwiYCxcbiAgICAgIFN0cmluZy5yYXdgcnVuX2lmX2NoYW5nZWQgXCIuKlxcLnByaXNtYVwiIFwibm9kZSBub2RlX21vZHVsZXMvLmJpbi9ibGl0eiBjb2RlZ2VuXCJgXG4gICAgKTtcbiAgfSBlbHNlIGlmIChjb25maWcuZGVwZW5kaW5nLnByaXNtYSkge1xuICAgIHBvc3RNZXJnZUNvbW1hbmRzLnB1c2goXG4gICAgICBTdHJpbmcucmF3YHJ1bl9pZl9jaGFuZ2VkIFwiLipcXC5wcmlzbWFcIiBcIm5vZGUgbm9kZV9tb2R1bGVzLy5iaW4vZG90ZW52IC1jIGRldmVsb3BtZW50IC0tIG5vZGUgbm9kZV9tb2R1bGVzLy5iaW4vcHJpc21hIG1pZ3JhdGUgZGVwbG95XCJgLFxuICAgICAgU3RyaW5nLnJhd2BydW5faWZfY2hhbmdlZCBcIi4qXFwucHJpc21hXCIgXCJub2RlIG5vZGVfbW9kdWxlcy8uYmluL2RvdGVudiAtYyBkZXZlbG9wbWVudCAtLSBub2RlIG5vZGVfbW9kdWxlcy8uYmluL3ByaXNtYSBnZW5lcmF0ZVwiYFxuICAgICk7XG4gIH1cbiAgY29uc3QgZ2VuSTE4blRzQ29tbWFuZCA9IGdldEdlbkkxOG5Uc0NvbW1hbmQoY29uZmlnLCBjb25maWcucGFja2FnZUpzb24/LnNjcmlwdHMpO1xuICBpZiAoZ2VuSTE4blRzQ29tbWFuZCkge1xuICAgIC8vIGdlbi1pMThuLXRzIG91dHB1dHMgYXJlIGNvbW1vbmx5IGlnbm9yZWQsIHNvIHBvc3QtbWVyZ2UgcmVnZW5lcmF0ZXMgdGhlbSBhZnRlciBwdWxsZWQgcmVzb3VyY2UgY2hhbmdlcy5cbiAgICBwb3N0TWVyZ2VDb21tYW5kcy5wdXNoKFN0cmluZy5yYXdgcnVuX2lmX2NoYW5nZWQgXCIoXnwvKWkxOG4vLipcXC5qc29uJFwiIFwiJHtnZW5JMThuVHNDb21tYW5kfVwiYCk7XG4gIH1cbiAgcmV0dXJuIHBvc3RNZXJnZUNvbW1hbmRzO1xufVxuXG5mdW5jdGlvbiBoYXNQeXRob25QYWNrYWdlTWFuYWdlcihjb25maWc6IFBhY2thZ2VDb25maWcpOiBib29sZWFuIHtcbiAgcmV0dXJuIGNvbmZpZy5kb2VzQ29udGFpblBvZXRyeUxvY2sgfHwgY29uZmlnLmRvZXNDb250YWluVXZMb2NrO1xufVxuXG5mdW5jdGlvbiBnZXRQeXRob25SdW5uZXIoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogJ3BvZXRyeSBydW4nIHwgJ3V2IHJ1bicge1xuICByZXR1cm4gY29uZmlnLmRvZXNDb250YWluVXZMb2NrID8gJ3V2IHJ1bicgOiAncG9ldHJ5IHJ1bic7XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVMaW50c3RhZ2VkcmMoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZ2VuZXJhdGVMaW50c3RhZ2VkcmMnLCBhc3luYyAoKSA9PiB7XG4gICAgYXdhaXQgUHJvbWlzZS5hbGwoW1xuICAgICAgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzLnByb21pc2VzLnJtKGAke2NvbmZpZy5kaXJQYXRofS8ubGludHN0YWdlZHJjLmNqc2AsIHsgZm9yY2U6IHRydWUgfSkpLFxuICAgICAgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzLnByb21pc2VzLnJtKGAke2NvbmZpZy5kaXJQYXRofS8ubGludHN0YWdlZHJjLmpzYCwgeyBmb3JjZTogdHJ1ZSB9KSksXG4gICAgICBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnMucHJvbWlzZXMucm0oYCR7Y29uZmlnLmRpclBhdGh9Ly5saW50c3RhZ2VkcmMuanNvbmAsIHsgZm9yY2U6IHRydWUgfSkpLFxuICAgIF0pO1xuICB9KTtcbn1cbiIsImV4cG9ydCBmdW5jdGlvbiBub3JtYWxpemVDb25maWdDb250ZW50KGNvbnRlbnQ6IHN0cmluZyB8IHVuZGVmaW5lZCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIHJldHVybiBjb250ZW50Py50cmltKCk7XG59XG4iLCJleHBvcnQgdHlwZSBDb25maWdCbG9ja05hbWUgPSAnYmFzZScgfCAnZXhwb3J0JztcblxuaW50ZXJmYWNlIE1hbmFnZWRDb25maWdCbG9ja3NPcHRpb25zIHtcbiAgYmxvY2tOYW1lczogcmVhZG9ubHkgQ29uZmlnQmxvY2tOYW1lW107XG4gIG1hcmtlclByZWZpeDogc3RyaW5nO1xuICB0b29sTmFtZTogc3RyaW5nO1xufVxuXG5pbnRlcmZhY2UgR2V0Q29uZmlnQ29udGVudE9wdGlvbnMge1xuICBkZXNpcmVkQ29udGVudDogc3RyaW5nO1xuICBleGlzdGluZ0NvbnRlbnQ6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgZmlsZVBhdGg6IHN0cmluZztcbn1cblxuZXhwb3J0IGNsYXNzIE1hbmFnZWRDb25maWdCbG9ja3Mge1xuICBwcml2YXRlIHJlYWRvbmx5IGJsb2NrTmFtZXM6IHJlYWRvbmx5IENvbmZpZ0Jsb2NrTmFtZVtdO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgbWFya2VyUHJlZml4OiBzdHJpbmc7XG5cbiAgcHJpdmF0ZSByZWFkb25seSB0b29sTmFtZTogc3RyaW5nO1xuXG4gIGNvbnN0cnVjdG9yKG9wdGlvbnM6IE1hbmFnZWRDb25maWdCbG9ja3NPcHRpb25zKSB7XG4gICAgdGhpcy5ibG9ja05hbWVzID0gb3B0aW9ucy5ibG9ja05hbWVzO1xuICAgIHRoaXMubWFya2VyUHJlZml4ID0gb3B0aW9ucy5tYXJrZXJQcmVmaXg7XG4gICAgdGhpcy50b29sTmFtZSA9IG9wdGlvbnMudG9vbE5hbWU7XG4gIH1cblxuICBnZXRDb25maWdDb250ZW50KG9wdGlvbnM6IEdldENvbmZpZ0NvbnRlbnRPcHRpb25zKTogc3RyaW5nIHtcbiAgICBpZiAoIW9wdGlvbnMuZXhpc3RpbmdDb250ZW50KSByZXR1cm4gb3B0aW9ucy5kZXNpcmVkQ29udGVudDtcbiAgICBpZiAodGhpcy5oYXNNYW5hZ2VkQmxvY2tzKG9wdGlvbnMuZXhpc3RpbmdDb250ZW50KSkge1xuICAgICAgcmV0dXJuIHRoaXMucmVwbGFjZU1hbmFnZWRCbG9ja3Mob3B0aW9ucy5leGlzdGluZ0NvbnRlbnQsIG9wdGlvbnMuZGVzaXJlZENvbnRlbnQsIG9wdGlvbnMuZmlsZVBhdGgpO1xuICAgIH1cbiAgICByZXR1cm4gb3B0aW9ucy5kZXNpcmVkQ29udGVudDtcbiAgfVxuXG4gIGdldEJsb2NrKGJsb2NrTmFtZTogQ29uZmlnQmxvY2tOYW1lLCBjb250ZW50OiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIHJldHVybiBgJHt0aGlzLmdldFN0YXJ0TWFya2VyKGJsb2NrTmFtZSl9XG4ke2NvbnRlbnR9XG4ke3RoaXMuZ2V0RW5kTWFya2VyKGJsb2NrTmFtZSl9YDtcbiAgfVxuXG4gIHByaXZhdGUgaGFzTWFuYWdlZEJsb2Nrcyhjb250ZW50OiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5ibG9ja05hbWVzLnNvbWUoKGJsb2NrTmFtZSkgPT4gY29udGVudC5pbmNsdWRlcyh0aGlzLmdldFN0YXJ0TWFya2VyKGJsb2NrTmFtZSkpKTtcbiAgfVxuXG4gIHByaXZhdGUgcmVwbGFjZU1hbmFnZWRCbG9ja3MoZXhpc3RpbmdDb250ZW50OiBzdHJpbmcsIGRlc2lyZWRDb250ZW50OiBzdHJpbmcsIGZpbGVQYXRoOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGxldCBjb250ZW50ID0gZXhpc3RpbmdDb250ZW50O1xuICAgIGZvciAoY29uc3QgYmxvY2tOYW1lIG9mIHRoaXMuYmxvY2tOYW1lcykge1xuICAgICAgY29uc3QgcmVwbGFjZW1lbnQgPSB0aGlzLmV4dHJhY3RNYW5hZ2VkQmxvY2soZGVzaXJlZENvbnRlbnQsIGJsb2NrTmFtZSk7XG4gICAgICBpZiAoIXJlcGxhY2VtZW50KSBjb250aW51ZTtcblxuICAgICAgY29uc3QgbmV4dENvbnRlbnQgPSB0aGlzLnJlcGxhY2VNYW5hZ2VkQmxvY2soY29udGVudCwgYmxvY2tOYW1lLCByZXBsYWNlbWVudCk7XG4gICAgICBpZiAoIW5leHRDb250ZW50KSB7XG4gICAgICAgIGNvbnNvbGUud2FybihgU2tpcHBlZCB1cGRhdGluZyBpbmNvbXBsZXRlICR7YmxvY2tOYW1lfSBibG9jayBpbiAke3RoaXMudG9vbE5hbWV9IGNvbmZpZzogJHtmaWxlUGF0aH1gKTtcbiAgICAgICAgcmV0dXJuIGV4aXN0aW5nQ29udGVudDtcbiAgICAgIH1cbiAgICAgIGNvbnRlbnQgPSBuZXh0Q29udGVudDtcbiAgICB9XG4gICAgcmV0dXJuIGNvbnRlbnQ7XG4gIH1cblxuICBwcml2YXRlIGV4dHJhY3RNYW5hZ2VkQmxvY2soY29udGVudDogc3RyaW5nLCBibG9ja05hbWU6IENvbmZpZ0Jsb2NrTmFtZSk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0TWFuYWdlZEJsb2NrUmVnRXhwKGJsb2NrTmFtZSkuZXhlYyhjb250ZW50KT8uWzBdO1xuICB9XG5cbiAgcHJpdmF0ZSByZXBsYWNlTWFuYWdlZEJsb2NrKGNvbnRlbnQ6IHN0cmluZywgYmxvY2tOYW1lOiBDb25maWdCbG9ja05hbWUsIHJlcGxhY2VtZW50OiBzdHJpbmcpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIGNvbnN0IHBhdHRlcm4gPSB0aGlzLmdldE1hbmFnZWRCbG9ja1JlZ0V4cChibG9ja05hbWUpO1xuICAgIGlmICghcGF0dGVybi50ZXN0KGNvbnRlbnQpKSByZXR1cm4gdW5kZWZpbmVkO1xuICAgIHJldHVybiBjb250ZW50LnJlcGxhY2UocGF0dGVybiwgcmVwbGFjZW1lbnQpO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRNYW5hZ2VkQmxvY2tSZWdFeHAoYmxvY2tOYW1lOiBDb25maWdCbG9ja05hbWUpOiBSZWdFeHAge1xuICAgIHJldHVybiBuZXcgUmVnRXhwKFxuICAgICAgYCR7ZXNjYXBlUmVnRXhwKHRoaXMuZ2V0U3RhcnRNYXJrZXIoYmxvY2tOYW1lKSl9W1xcXFxzXFxcXFNdKj8ke2VzY2FwZVJlZ0V4cCh0aGlzLmdldEVuZE1hcmtlcihibG9ja05hbWUpKX1gXG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0U3RhcnRNYXJrZXIoYmxvY2tOYW1lOiBDb25maWdCbG9ja05hbWUpOiBzdHJpbmcge1xuICAgIHJldHVybiBgLy8gd2JmeTpzdGFydCAke3RoaXMubWFya2VyUHJlZml4fS0ke2Jsb2NrTmFtZX1gO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRFbmRNYXJrZXIoYmxvY2tOYW1lOiBDb25maWdCbG9ja05hbWUpOiBzdHJpbmcge1xuICAgIHJldHVybiBgLy8gd2JmeTplbmQgJHt0aGlzLm1hcmtlclByZWZpeH0tJHtibG9ja05hbWV9YDtcbiAgfVxufVxuXG5mdW5jdGlvbiBlc2NhcGVSZWdFeHAodmFsdWU6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiB2YWx1ZS5yZXBsYWNlQWxsKC9bLiorP14ke30oKXxbXFxdXFxcXF0vZywgU3RyaW5nLnJhd2BcXCQmYCk7XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBmc1V0aWwgfSBmcm9tICcuLi91dGlscy9mc1V0aWwuanMnO1xuaW1wb3J0IHsgcHJvbWlzZVBvb2wgfSBmcm9tICcuLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5cbmltcG9ydCB7IG5vcm1hbGl6ZUNvbmZpZ0NvbnRlbnQgfSBmcm9tICcuL2NvbmZpZ0NvbnRlbnQuanMnO1xuaW1wb3J0IHsgTWFuYWdlZENvbmZpZ0Jsb2NrcyB9IGZyb20gJy4vbWFuYWdlZENvbmZpZ0Jsb2NrLmpzJztcblxuY29uc3QgbWFuYWdlZENvbmZpZ0Jsb2NrcyA9IG5ldyBNYW5hZ2VkQ29uZmlnQmxvY2tzKHtcbiAgYmxvY2tOYW1lczogWydiYXNlJywgJ2V4cG9ydCddLFxuICBtYXJrZXJQcmVmaXg6ICdveGZtdCcsXG4gIHRvb2xOYW1lOiAnb3hmbXQnLFxufSk7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZW5lcmF0ZU94Zm10Q29uZmlnKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2dlbmVyYXRlT3hmbXRDb25maWcnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgbGVnYWN5SnNvbkNvbmZpZ1BhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICcub3hmbXRyYy5qc29uJyk7XG4gICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICdveGZtdC5jb25maWcudHMnKTtcbiAgICBjb25zdCBleGlzdGluZ0NvbnRlbnQgPSBhd2FpdCBmc1V0aWwucmVhZEZpbGVJZ25vcmluZ0Vycm9yKGZpbGVQYXRoKTtcbiAgICBjb25zdCBkZXNpcmVkQ29udGVudCA9IG1hbmFnZWRDb25maWdCbG9ja3MuZ2V0Q29uZmlnQ29udGVudCh7XG4gICAgICBkZXNpcmVkQ29udGVudDogZ2V0Q29uZmlnQ29udGVudChjb25maWcpLFxuICAgICAgZXhpc3RpbmdDb250ZW50LFxuICAgICAgZmlsZVBhdGgsXG4gICAgfSk7XG4gICAgY29uc3QgcHJvbWlzZXMgPSBbcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzLnByb21pc2VzLnJtKGxlZ2FjeUpzb25Db25maWdQYXRoLCB7IGZvcmNlOiB0cnVlIH0pKV07XG4gICAgaWYgKG5vcm1hbGl6ZUNvbmZpZ0NvbnRlbnQoZXhpc3RpbmdDb250ZW50KSAhPT0gbm9ybWFsaXplQ29uZmlnQ29udGVudChkZXNpcmVkQ29udGVudCkpIHtcbiAgICAgIHByb21pc2VzLnB1c2gocHJvbWlzZVBvb2wucnVuKCgpID0+IGZzVXRpbC5nZW5lcmF0ZUZpbGUoZmlsZVBhdGgsIGRlc2lyZWRDb250ZW50KSkpO1xuICAgIH1cbiAgICBhd2FpdCBQcm9taXNlLmFsbChwcm9taXNlcyk7XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBnZXRDb25maWdDb250ZW50KGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IHN0cmluZyB7XG4gIC8vIENvbW1vbkpTIHBhY2thZ2VzIG5lZWQgcmVxdWlyZS9tb2R1bGUuZXhwb3J0cyBoZXJlOiBveGZtdCBjb25maWcgZmlsZXMgYXJlXG4gIC8vIG9ubHkgYXV0by1kaXNjb3ZlcmVkIGFzIC50cywgYW5kIHRoZSBzaGFyZWQgY29uZmlnIHBhY2thZ2UgaXMgRVNNLW9ubHkuXG4gIGlmICghY29uZmlnLmlzRXNtUGFja2FnZSkge1xuICAgIHJldHVybiBgJHttYW5hZ2VkQ29uZmlnQmxvY2tzLmdldEJsb2NrKFxuICAgICAgJ2Jhc2UnLFxuICAgICAgYC8vIG94bGludC1kaXNhYmxlIHVuaWNvcm4vcHJlZmVyLW1vZHVsZSAtLSBPeGZtdCBjb25maWcgZmlsZXMgYXJlIG9ubHkgYXV0by1kaXNjb3ZlcmVkIGFzIC50cywgYW5kIENvbW1vbkpTIGF2b2lkcyBOb2RlIHR5cGVsZXNzIEVTTSB3YXJuaW5ncy5cbmNvbnN0IG94Zm10Q29uZmlnID0gcmVxdWlyZSgnQHdpbGxib29zdGVyL294Zm10LWNvbmZpZycpO1xuXG5jb25zdCBveGZtdFJlc29sdmVkQ29uZmlnID0gb3hmbXRDb25maWcuZGVmYXVsdCA/PyBveGZtdENvbmZpZztgXG4gICAgKX1cblxuJHttYW5hZ2VkQ29uZmlnQmxvY2tzLmdldEJsb2NrKCdleHBvcnQnLCAnbW9kdWxlLmV4cG9ydHMgPSBveGZtdFJlc29sdmVkQ29uZmlnOycpfVxuYDtcbiAgfVxuXG4gIHJldHVybiBgJHttYW5hZ2VkQ29uZmlnQmxvY2tzLmdldEJsb2NrKCdiYXNlJywgXCJpbXBvcnQgY29uZmlnIGZyb20gJ0B3aWxsYm9vc3Rlci9veGZtdC1jb25maWcnO1wiKX1cblxuJHttYW5hZ2VkQ29uZmlnQmxvY2tzLmdldEJsb2NrKCdleHBvcnQnLCAnZXhwb3J0IGRlZmF1bHQgY29uZmlnOycpfVxuYDtcbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGZzVXRpbCB9IGZyb20gJy4uL3V0aWxzL2ZzVXRpbC5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcbmltcG9ydCB7IGlzUHVibGlzaGVkV2lsbGJvb3N0ZXJDb25maWdzUGFja2FnZSB9IGZyb20gJy4uL3V0aWxzL3dpbGxib29zdGVyQ29uZmlnc1V0aWwuanMnO1xuXG5pbXBvcnQgeyBub3JtYWxpemVDb25maWdDb250ZW50IH0gZnJvbSAnLi9jb25maWdDb250ZW50LmpzJztcbmltcG9ydCB7IE1hbmFnZWRDb25maWdCbG9ja3MgfSBmcm9tICcuL21hbmFnZWRDb25maWdCbG9jay5qcyc7XG5cbmNvbnN0IG1hbmFnZWRDb25maWdCbG9ja3MgPSBuZXcgTWFuYWdlZENvbmZpZ0Jsb2Nrcyh7XG4gIGJsb2NrTmFtZXM6IFsnYmFzZScsICdleHBvcnQnXSxcbiAgbWFya2VyUHJlZml4OiAnb3hsaW50JyxcbiAgdG9vbE5hbWU6ICdveGxpbnQnLFxufSk7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZW5lcmF0ZU94bGludENvbmZpZyhjb25maWc6IFBhY2thZ2VDb25maWcsIF9yb290Q29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZ2VuZXJhdGVPeGxpbnRDb25maWcnLCBhc3luYyAoKSA9PiB7XG4gICAgLy8gd2lsbGJvb3N0ZXItY29uZmlncyBwdWJsaXNoZXMgY29uZmlnIGZpbGVzIGFzIHByb2R1Y3QgY29kZSwgc28gbWlncmF0aW9uXG4gICAgLy8gbXVzdCBub3QgcmVtb3ZlIHBhY2thZ2UtcHJvdmlkZWQgbGludGVyIHNldHRpbmdzLlxuICAgIGNvbnN0IHNob3VsZFByZXNlcnZlUHVibGlzaGVkTGludGVyQ29uZmlnID0gaXNQdWJsaXNoZWRXaWxsYm9vc3RlckNvbmZpZ3NQYWNrYWdlKGNvbmZpZyk7XG4gICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICdveGxpbnQuY29uZmlnLnRzJyk7XG4gICAgY29uc3QgZXhpc3RpbmdDb250ZW50ID0gYXdhaXQgZnNVdGlsLnJlYWRGaWxlSWdub3JpbmdFcnJvcihmaWxlUGF0aCk7XG4gICAgY29uc3QgZGVzaXJlZENvbnRlbnQgPVxuICAgICAgc2hvdWxkUHJlc2VydmVQdWJsaXNoZWRMaW50ZXJDb25maWcgJiYgZXhpc3RpbmdDb250ZW50XG4gICAgICAgID8gZXhpc3RpbmdDb250ZW50XG4gICAgICAgIDogcmVwbGFjZUxlZ2FjeUNvbmZpZ1JlZmVyZW5jZXMoXG4gICAgICAgICAgICBtYW5hZ2VkQ29uZmlnQmxvY2tzLmdldENvbmZpZ0NvbnRlbnQoe1xuICAgICAgICAgICAgICBkZXNpcmVkQ29udGVudDogZ2V0Q29uZmlnQ29udGVudChjb25maWcpLFxuICAgICAgICAgICAgICBleGlzdGluZ0NvbnRlbnQsXG4gICAgICAgICAgICAgIGZpbGVQYXRoLFxuICAgICAgICAgICAgfSlcbiAgICAgICAgICApO1xuXG4gICAgY29uc3QgcHJvbWlzZXM6IFByb21pc2U8dm9pZD5bXSA9IFtdO1xuICAgIGlmICghc2hvdWxkUHJlc2VydmVQdWJsaXNoZWRMaW50ZXJDb25maWcpIHtcbiAgICAgIHByb21pc2VzLnB1c2goXG4gICAgICAgIHByb21pc2VQb29sLnJ1bigoKSA9PiBmcy5wcm9taXNlcy5ybShwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICcub3hsaW50cmMuanNvbicpLCB7IGZvcmNlOiB0cnVlIH0pKSxcbiAgICAgICAgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzLnByb21pc2VzLnJtKHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJ2Jpb21lLmpzb24nKSwgeyBmb3JjZTogdHJ1ZSB9KSksXG4gICAgICAgIHByb21pc2VQb29sLnJ1bigoKSA9PiBmcy5wcm9taXNlcy5ybShwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICdiaW9tZS5qc29uYycpLCB7IGZvcmNlOiB0cnVlIH0pKSxcbiAgICAgICAgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzLnByb21pc2VzLnJtKHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJy5lc2xpbnRyYycpLCB7IGZvcmNlOiB0cnVlIH0pKSxcbiAgICAgICAgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzLnByb21pc2VzLnJtKHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJy5lc2xpbnRyYy5janMnKSwgeyBmb3JjZTogdHJ1ZSB9KSksXG4gICAgICAgIHByb21pc2VQb29sLnJ1bigoKSA9PiBmcy5wcm9taXNlcy5ybShwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICcuZXNsaW50cmMuanMnKSwgeyBmb3JjZTogdHJ1ZSB9KSksXG4gICAgICAgIHByb21pc2VQb29sLnJ1bigoKSA9PiBmcy5wcm9taXNlcy5ybShwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICcuZXNsaW50cmMuanNvbicpLCB7IGZvcmNlOiB0cnVlIH0pKSxcbiAgICAgICAgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzLnByb21pc2VzLnJtKHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJy5lc2xpbnRyYy55YW1sJyksIHsgZm9yY2U6IHRydWUgfSkpLFxuICAgICAgICBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnMucHJvbWlzZXMucm0ocGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnLmVzbGludHJjLnltbCcpLCB7IGZvcmNlOiB0cnVlIH0pKSxcbiAgICAgICAgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzLnByb21pc2VzLnJtKHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJ2VzbGludC5jb25maWcuY2pzJyksIHsgZm9yY2U6IHRydWUgfSkpLFxuICAgICAgICBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnMucHJvbWlzZXMucm0ocGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnZXNsaW50LmNvbmZpZy5qcycpLCB7IGZvcmNlOiB0cnVlIH0pKSxcbiAgICAgICAgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzLnByb21pc2VzLnJtKHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJ2VzbGludC5jb25maWcubWpzJyksIHsgZm9yY2U6IHRydWUgfSkpLFxuICAgICAgICBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnMucHJvbWlzZXMucm0ocGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnZXNsaW50LmNvbmZpZy50cycpLCB7IGZvcmNlOiB0cnVlIH0pKVxuICAgICAgKTtcbiAgICB9XG4gICAgaWYgKG5vcm1hbGl6ZUNvbmZpZ0NvbnRlbnQoZXhpc3RpbmdDb250ZW50KSAhPT0gbm9ybWFsaXplQ29uZmlnQ29udGVudChkZXNpcmVkQ29udGVudCkpIHtcbiAgICAgIHByb21pc2VzLnB1c2gocHJvbWlzZVBvb2wucnVuKCgpID0+IGZzVXRpbC5nZW5lcmF0ZUZpbGUoZmlsZVBhdGgsIGRlc2lyZWRDb250ZW50KSkpO1xuICAgIH1cbiAgICBhd2FpdCBQcm9taXNlLmFsbChwcm9taXNlcyk7XG4gIH0pO1xufVxuXG5mdW5jdGlvbiByZXBsYWNlTGVnYWN5Q29uZmlnUmVmZXJlbmNlcyhjb250ZW50OiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gY29udGVudC5yZXBsYWNlQWxsKCdjb25maWcuJywgJ294bGludFJlc29sdmVkQ29uZmlnLicpO1xufVxuXG5mdW5jdGlvbiBnZXRDb25maWdDb250ZW50KGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IHN0cmluZyB7XG4gIC8vIERvIG5vdCBjb2xsYXBzZSB0aGlzIHRvIGEgc3RhdGljIGltcG9ydCBmb3IgZXZlcnkgcGFja2FnZS4gQ29tbW9uSlMgcGFja2FnZXNcbiAgLy8gdHlwZS1jaGVjayBhdXRvLWRpc2NvdmVyZWQgb3hsaW50LmNvbmZpZy50cyBhcyBDb21tb25KUywgc28gaW1wb3J0aW5nIHRoZSBFU01cbiAgLy8gQHdpbGxib29zdGVyL294bGludC1jb25maWcgcGFja2FnZSB0cmlnZ2VycyBUUzE0NzkuIEtlZXAgdGhpcyBpbiBzeW5jIHdpdGhcbiAgLy8gbGl0ZXJhY3ktdGVzdCdzIGdlbmVyYXRlZCBjb25maWcgcGF0dGVybi5cbiAgaWYgKCFjb25maWcuaXNFc21QYWNrYWdlKSB7XG4gICAgcmV0dXJuIGAke21hbmFnZWRDb25maWdCbG9ja3MuZ2V0QmxvY2soXG4gICAgICAnYmFzZScsXG4gICAgICBgLy8gb3hsaW50LWRpc2FibGUgdW5pY29ybi9wcmVmZXItbW9kdWxlIC0tIE94bGludCBvbmx5IGF1dG8tZGlzY292ZXJzIC50cyBjb25maWcgZmlsZXMsIGFuZCBDb21tb25KUyBhdm9pZHMgTm9kZSB0eXBlbGVzcyBFU00gd2FybmluZ3MuXG5jb25zdCBveGxpbnRCYXNlQ29uZmlnID0gcmVxdWlyZSgnQHdpbGxib29zdGVyL294bGludC1jb25maWcnKTtcblxuY29uc3Qgb3hsaW50UmVzb2x2ZWRDb25maWcgPSBveGxpbnRCYXNlQ29uZmlnLmRlZmF1bHQgPz8gb3hsaW50QmFzZUNvbmZpZztgXG4gICAgKX1cblxuJHttYW5hZ2VkQ29uZmlnQmxvY2tzLmdldEJsb2NrKCdleHBvcnQnLCAnbW9kdWxlLmV4cG9ydHMgPSBveGxpbnRSZXNvbHZlZENvbmZpZzsnKX1cbmA7XG4gIH1cblxuICByZXR1cm4gYCR7bWFuYWdlZENvbmZpZ0Jsb2Nrcy5nZXRCbG9jaygnYmFzZScsIFwiaW1wb3J0IG94bGludFJlc29sdmVkQ29uZmlnIGZyb20gJ0B3aWxsYm9vc3Rlci9veGxpbnQtY29uZmlnJztcIil9XG5cbiR7bWFuYWdlZENvbmZpZ0Jsb2Nrcy5nZXRCbG9jaygnZXhwb3J0JywgJ2V4cG9ydCBkZWZhdWx0IG94bGludFJlc29sdmVkQ29uZmlnOycpfVxuYDtcbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGZzVXRpbCB9IGZyb20gJy4uL3V0aWxzL2ZzVXRpbC5qcyc7XG5pbXBvcnQgeyBpZ25vcmVGaWxlVXRpbCB9IGZyb20gJy4uL3V0aWxzL2lnbm9yZUZpbGVVdGlsLmpzJztcbmltcG9ydCB7IGRvZXNDb250YWluSmF2YSB9IGZyb20gJy4uL3V0aWxzL3BhY2thZ2VDYXBhYmlsaXRpZXMuanMnO1xuaW1wb3J0IHsgcHJvbWlzZVBvb2wgfSBmcm9tICcuLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5cbmNvbnN0IGNvbW1vbkNvbnRlbnQgPSBgXG4zcmQtcGFydHkvXG5hbmRyb2lkL1xuaW9zL1xubm8tZm9ybWF0L1xudGVzdC1maXh0dXJlcy9cbnRlc3QvZml4dHVyZXMvXG4qLmQudHNcbioubWluLmpzXG4ueWFybi9cbi5wbnAuanNcbmA7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZW5lcmF0ZVByZXR0aWVyaWdub3JlKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2dlbmVyYXRlUHJldHRpZXJpZ25vcmUnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICcucHJldHRpZXJpZ25vcmUnKTtcbiAgICBpZiAoIWRvZXNDb250YWluSmF2YShjb25maWcpKSB7XG4gICAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnMucHJvbWlzZXMucm0oZmlsZVBhdGgsIHsgZm9yY2U6IHRydWUgfSkpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBjb250ZW50ID0gKGF3YWl0IGZzVXRpbC5yZWFkRmlsZUlnbm9yaW5nRXJyb3IoZmlsZVBhdGgpKSA/PyAnJztcbiAgICBjb25zdCBoZWFkVXNlckNvbnRlbnQgPSBpZ25vcmVGaWxlVXRpbC5nZXRIZWFkVXNlckNvbnRlbnQoY29udGVudCk7XG4gICAgY29uc3QgdGFpbFVzZXJDb250ZW50ID0gaWdub3JlRmlsZVV0aWwuZ2V0VGFpbFVzZXJDb250ZW50KGNvbnRlbnQpO1xuXG4gICAgY29uc3QgZ2l0aWdub3JlRmlsZVBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICcuZ2l0aWdub3JlJyk7XG4gICAgY29uc3QgZ2l0aWdub3JlQ29udGVudCA9IChhd2FpdCBpZ25vcmVGaWxlVXRpbC5yZWFkR2l0aWdub3JlV2l0aG91dFNlcGFyYXRvcnMoZ2l0aWdub3JlRmlsZVBhdGgpKSB8fCAnJztcblxuICAgIGxldCBhZGRpdGlvbmFsQ29udGVudCA9ICcnO1xuICAgIGlmIChjb25maWcuZG9lc0NvbnRhaW5QdWJzcGVjWWFtbCkge1xuICAgICAgYWRkaXRpb25hbENvbnRlbnQgPSBgXG5hbmRyb2lkL2FwcC9cbmlvcy9SdW5uZXIvQXNzZXRzLnhjYXNzZXRzL1xucHVic3BlYy55YW1sXG5gO1xuICAgIH1cblxuICAgIGNvbnN0IG5ld0NvbnRlbnQgPSBoZWFkVXNlckNvbnRlbnQgKyBjb21tb25Db250ZW50ICsgYWRkaXRpb25hbENvbnRlbnQgKyBnaXRpZ25vcmVDb250ZW50ICsgdGFpbFVzZXJDb250ZW50O1xuICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiBmc1V0aWwuZ2VuZXJhdGVGaWxlKGZpbGVQYXRoLCBuZXdDb250ZW50KSk7XG4gIH0pO1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IG1lcmdlIGZyb20gJ2RlZXBtZXJnZSc7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGZzVXRpbCB9IGZyb20gJy4uL3V0aWxzL2ZzVXRpbC5qcyc7XG5pbXBvcnQgeyBvdmVyd3JpdGVNZXJnZSB9IGZyb20gJy4uL3V0aWxzL21lcmdlVXRpbC5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcblxuY29uc3QganNvbk9iaiA9IHtcbiAgdmVudlBhdGg6ICcuJyxcbiAgdmVudjogJy52ZW52Jyxcbn07XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZW5lcmF0ZVB5cmlnaHRDb25maWdKc29uKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2dlbmVyYXRlUHlyaWdodENvbmZpZ0pzb24nLCBhc3luYyAoKSA9PiB7XG4gICAgbGV0IG5ld1NldHRpbmdzOiBvYmplY3QgPSBzdHJ1Y3R1cmVkQ2xvbmUoanNvbk9iaik7XG4gICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICdweXJpZ2h0Y29uZmlnLmpzb24nKTtcbiAgICB0cnkge1xuICAgICAgY29uc3Qgb2xkQ29udGVudCA9IGF3YWl0IGZzLnByb21pc2VzLnJlYWRGaWxlKGZpbGVQYXRoLCAndXRmOCcpO1xuICAgICAgY29uc3Qgb2xkU2V0dGluZ3MgPSBKU09OLnBhcnNlKG9sZENvbnRlbnQpIGFzIG9iamVjdDtcbiAgICAgIG5ld1NldHRpbmdzID0gbWVyZ2UuYWxsKFtuZXdTZXR0aW5ncywgb2xkU2V0dGluZ3MsIG5ld1NldHRpbmdzXSwgeyBhcnJheU1lcmdlOiBvdmVyd3JpdGVNZXJnZSB9KTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIGRvIG5vdGhpbmdcbiAgICB9XG4gICAgY29uc3QgbmV3Q29udGVudCA9IEpTT04uc3RyaW5naWZ5KG5ld1NldHRpbmdzLCB1bmRlZmluZWQsIDIpO1xuICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiBmc1V0aWwuZ2VuZXJhdGVGaWxlKGZpbGVQYXRoLCBuZXdDb250ZW50KSk7XG4gIH0pO1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZnNVdGlsIH0gZnJvbSAnLi4vdXRpbHMvZnNVdGlsLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuXG5jb25zdCBzZW1hbnRpY1JlbGVhc2VCYWRnZSA9XG4gICdbIVtzZW1hbnRpYy1yZWxlYXNlXShodHRwczovL2ltZy5zaGllbGRzLmlvL2JhZGdlLyUyMCUyMCVGMCU5RiU5MyVBNiVGMCU5RiU5QSU4MC1zZW1hbnRpYy0tcmVsZWFzZS1lMTAwNzkuc3ZnKV0oaHR0cHM6Ly9naXRodWIuY29tL3NlbWFudGljLXJlbGVhc2Uvc2VtYW50aWMtcmVsZWFzZSknO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVSZWFkbWUoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZ2VuZXJhdGVSZWFkbWUnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICdSRUFETUUubWQnKTtcbiAgICBsZXQgbmV3Q29udGVudCA9IGF3YWl0IGZzLnByb21pc2VzLnJlYWRGaWxlKGZpbGVQYXRoLCAndXRmOCcpO1xuXG4gICAgaWYgKGZzLmV4aXN0c1N5bmMocGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnLnJlbGVhc2VyYy5qc29uJykpKSB7XG4gICAgICBuZXdDb250ZW50ID0gaW5zZXJ0QmFkZ2UobmV3Q29udGVudCwgc2VtYW50aWNSZWxlYXNlQmFkZ2UpO1xuICAgIH1cblxuICAgIGNvbnN0IHJlcG9zaXRvcnkgPSBjb25maWcucmVwb3NpdG9yeT8uc2xpY2UoY29uZmlnLnJlcG9zaXRvcnkuaW5kZXhPZignOicpICsgMSk7XG4gICAgY29uc3Qgd29ya2Zsb3dzUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJy5naXRodWInLCAnd29ya2Zsb3dzJyk7XG4gICAgY29uc3QgZmlsZU5hbWVzID0gZnMuZXhpc3RzU3luYyh3b3JrZmxvd3NQYXRoKSA/IGZzLnJlYWRkaXJTeW5jKHdvcmtmbG93c1BhdGgpIDogW107XG4gICAgZm9yIChjb25zdCBmaWxlTmFtZSBvZiBmaWxlTmFtZXMpIHtcbiAgICAgIGlmICghZmlsZU5hbWUuc3RhcnRzV2l0aCgndGVzdCcpICYmICFmaWxlTmFtZS5zdGFydHNXaXRoKCdkZXBsb3knKSkgY29udGludWU7XG5cbiAgICAgIGxldCBiYWRnZU5hbWUgPSBmaWxlTmFtZTtcbiAgICAgIGJhZGdlTmFtZSA9IChiYWRnZU5hbWVbMF0gfHwgJycpLnRvVXBwZXJDYXNlKCkgKyBiYWRnZU5hbWUuc2xpY2UoMSwgYmFkZ2VOYW1lLmluZGV4T2YoJy4nKSk7XG4gICAgICBiYWRnZU5hbWUgPSBiYWRnZU5hbWUucmVwbGFjZSgnLScsICcgJyk7XG4gICAgICBpZiAoIXJlcG9zaXRvcnkpIGNvbnRpbnVlO1xuICAgICAgY29uc3QgYmFkZ2UgPSBgWyFbJHtiYWRnZU5hbWV9XShodHRwczovL2dpdGh1Yi5jb20vJHtyZXBvc2l0b3J5fS9hY3Rpb25zL3dvcmtmbG93cy8ke2ZpbGVOYW1lfS9iYWRnZS5zdmcpXShodHRwczovL2dpdGh1Yi5jb20vJHtyZXBvc2l0b3J5fS9hY3Rpb25zL3dvcmtmbG93cy8ke2ZpbGVOYW1lfSlgO1xuICAgICAgaWYgKGZzLmV4aXN0c1N5bmMocGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCBgLmdpdGh1Yi93b3JrZmxvd3MvJHtmaWxlTmFtZX1gKSkpIHtcbiAgICAgICAgbmV3Q29udGVudCA9IHJlbW92ZUdpdEh1YkFjdGlvbnNCYWRnZShuZXdDb250ZW50LCBiYWRnZU5hbWUsIGZpbGVOYW1lKTtcbiAgICAgICAgbmV3Q29udGVudCA9IGluc2VydEJhZGdlKG5ld0NvbnRlbnQsIGJhZGdlKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnNVdGlsLmdlbmVyYXRlRmlsZShmaWxlUGF0aCwgbmV3Q29udGVudCkpO1xuICB9KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGluc2VydEJhZGdlKHJlYWRtZTogc3RyaW5nLCBiYWRnZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgLy8g5pei44GrYmFkZ2XjgYzjgYLjgovloLTlkIjjga/liYrpmaRcbiAgcmVhZG1lID0gcmVhZG1lLnJlcGxhY2UoYmFkZ2UsICcnKS5yZXBsYWNlQWxsKC9cXG5cXG5cXG4rL2csICdcXG5cXG4nKTtcblxuICBmb3IgKGxldCBpID0gMDsgaSA8IHJlYWRtZS5sZW5ndGg7IGkrKykge1xuICAgIGlmIChyZWFkbWVbaSAtIDFdID09PSAnXFxuJyAmJiByZWFkbWVbaV0gPT09ICdcXG4nKSB7XG4gICAgICBjb25zdCBiZWZvcmUgPSByZWFkbWUuc2xpY2UoMCwgaSArIDEpO1xuICAgICAgbGV0IGFmdGVyID0gcmVhZG1lLnNsaWNlKGkgKyAxKTtcbiAgICAgIGlmICghYWZ0ZXIuc3RhcnRzV2l0aCgnWycpICYmICFhZnRlci5zdGFydHNXaXRoKCchJykpIHtcbiAgICAgICAgYWZ0ZXIgPSBgXFxuJHthZnRlcn1gO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGAke2JlZm9yZX0ke2JhZGdlfVxcbiR7YWZ0ZXJ9YDtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGAke3JlYWRtZX1cXG4ke2JhZGdlfVxcbmA7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiByZW1vdmVHaXRIdWJBY3Rpb25zQmFkZ2UocmVhZG1lOiBzdHJpbmcsIGJhZGdlTmFtZTogc3RyaW5nLCBmaWxlTmFtZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgY29uc3QgZXNjYXBlZEJhZGdlTmFtZSA9IGVzY2FwZVJlZ0V4cChiYWRnZU5hbWUpO1xuICBjb25zdCBlc2NhcGVkRmlsZU5hbWUgPSBlc2NhcGVSZWdFeHAoZmlsZU5hbWUpO1xuICByZXR1cm4gcmVhZG1lXG4gICAgLnJlcGxhY2VBbGwoXG4gICAgICBuZXcgUmVnRXhwKFxuICAgICAgICBTdHJpbmcucmF3YFxcWyFcXFske2VzY2FwZWRCYWRnZU5hbWV9XFxdXFwoaHR0cHM6Ly9naXRodWJcXC5jb20vW14vXFxzKV0rL1teL1xccyldKy9hY3Rpb25zL3dvcmtmbG93cy8ke2VzY2FwZWRGaWxlTmFtZX0vYmFkZ2VcXC5zdmdcXClcXF1cXChodHRwczovL2dpdGh1YlxcLmNvbS9bXi9cXHMpXSsvW14vXFxzKV0rL2FjdGlvbnMvd29ya2Zsb3dzLyR7ZXNjYXBlZEZpbGVOYW1lfVxcKVxcbj9gLFxuICAgICAgICAnZ3UnXG4gICAgICApLFxuICAgICAgJydcbiAgICApXG4gICAgLnJlcGxhY2VBbGwoL1xcblxcblxcbisvZywgJ1xcblxcbicpO1xufVxuXG5mdW5jdGlvbiBlc2NhcGVSZWdFeHAodmFsdWU6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiB2YWx1ZS5yZXBsYWNlQWxsKC9bLiorP14ke30oKXxbXFxdXFxcXF0vZywgU3RyaW5nLnJhd2BcXCQmYCk7XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgbWVyZ2UgZnJvbSAnZGVlcG1lcmdlJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZnNVdGlsIH0gZnJvbSAnLi4vdXRpbHMvZnNVdGlsLmpzJztcbmltcG9ydCB7IG92ZXJ3cml0ZU1lcmdlIH0gZnJvbSAnLi4vdXRpbHMvbWVyZ2VVdGlsLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVSZWxlYXNlcmMocm9vdENvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2dlbmVyYXRlUmVsZWFzZXJjJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKHJvb3RDb25maWcuZGlyUGF0aCwgJy5yZWxlYXNlcmMuanNvbicpO1xuICAgIGlmICghZnMuZXhpc3RzU3luYyhmaWxlUGF0aCkpIHJldHVybjtcblxuICAgIGNvbnN0IHNldHRpbmdzID0gSlNPTi5wYXJzZShhd2FpdCBmcy5wcm9taXNlcy5yZWFkRmlsZShmaWxlUGF0aCwgJ3V0ZjgnKSkgYXMge1xuICAgICAgcGx1Z2lucz86IChzdHJpbmcgfCBbc3RyaW5nLCB1bmtub3duXSlbXTtcbiAgICB9O1xuICAgIGNvbnN0IHBsdWdpbnMgPSBzZXR0aW5ncy5wbHVnaW5zID8/IFtdO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcGx1Z2lucy5sZW5ndGg7IGkrKykge1xuICAgICAgY29uc3QgcGx1Z2luRW50cnkgPSBwbHVnaW5zW2ldO1xuICAgICAgY29uc3QgaXNBcnJheSA9IEFycmF5LmlzQXJyYXkocGx1Z2luRW50cnkpO1xuICAgICAgY29uc3QgcGx1Z2luID0gaXNBcnJheSA/IHBsdWdpbkVudHJ5WzBdIDogcGx1Z2luRW50cnk7XG4gICAgICBjb25zdCBvbGRDb25maWcgPSAoaXNBcnJheSAmJiBwbHVnaW5FbnRyeVsxXSkgfHwge307XG4gICAgICBpZiAocGx1Z2luID09PSAnQHNlbWFudGljLXJlbGVhc2UvY29tbWl0LWFuYWx5emVyJykge1xuICAgICAgICBwbHVnaW5zW2ldID0gW1xuICAgICAgICAgICdAc2VtYW50aWMtcmVsZWFzZS9jb21taXQtYW5hbHl6ZXInLFxuICAgICAgICAgIG1lcmdlLmFsbChcbiAgICAgICAgICAgIFtcbiAgICAgICAgICAgICAgb2xkQ29uZmlnLFxuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgcHJlc2V0OiAnY29udmVudGlvbmFsY29tbWl0cycsXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgeyBhcnJheU1lcmdlOiBvdmVyd3JpdGVNZXJnZSB9XG4gICAgICAgICAgKSxcbiAgICAgICAgXTtcbiAgICAgIH0gZWxzZSBpZiAocGx1Z2luID09PSAnQHNlbWFudGljLXJlbGVhc2UvZ2l0aHViJykge1xuICAgICAgICBwbHVnaW5zW2ldID0gW1xuICAgICAgICAgICdAc2VtYW50aWMtcmVsZWFzZS9naXRodWInLFxuICAgICAgICAgIG1lcmdlLmFsbChcbiAgICAgICAgICAgIFtcbiAgICAgICAgICAgICAgb2xkQ29uZmlnLFxuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgLy8gY2YuIGh0dHBzOi8vZ2l0aHViLmNvbS9zZW1hbnRpYy1yZWxlYXNlL3NlbWFudGljLXJlbGVhc2UvaXNzdWVzLzIyMDQjaXNzdWVjb21tZW50LTE1MDg0MTc3MDRcbiAgICAgICAgICAgICAgICBzdWNjZXNzQ29tbWVudENvbmRpdGlvbjogZmFsc2UsXG4gICAgICAgICAgICAgICAgZmFpbENvbW1lbnRDb25kaXRpb246IGZhbHNlLFxuICAgICAgICAgICAgICAgIGxhYmVsczogWydyOiBzZW1hbnRpYy1yZWxlYXNlJ10sXG4gICAgICAgICAgICAgICAgcmVsZWFzZWRMYWJlbHM6IFsncmVsZWFzZWQgOmJvb2ttYXJrOiddLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIHsgYXJyYXlNZXJnZTogb3ZlcndyaXRlTWVyZ2UgfVxuICAgICAgICAgICksXG4gICAgICAgIF07XG4gICAgICB9XG4gICAgfVxuICAgIGNvbnN0IG5ld0NvbnRlbnQgPSBKU09OLnN0cmluZ2lmeShzZXR0aW5ncywgdW5kZWZpbmVkLCAyKTtcbiAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnNVdGlsLmdlbmVyYXRlRmlsZShmaWxlUGF0aCwgbmV3Q29udGVudCkpO1xuICB9KTtcbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCBtZXJnZSBmcm9tICdkZWVwbWVyZ2UnO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlQ29uZmlnIH0gZnJvbSAnLi4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBmc1V0aWwgfSBmcm9tICcuLi91dGlscy9mc1V0aWwuanMnO1xuaW1wb3J0IHsgb3ZlcndyaXRlTWVyZ2UgfSBmcm9tICcuLi91dGlscy9tZXJnZVV0aWwuanMnO1xuaW1wb3J0IHsgcHJvbWlzZVBvb2wgfSBmcm9tICcuLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5cbmNvbnN0IGpzb25PYmogPSB7XG4gICRzY2hlbWE6ICdodHRwczovL2RvY3MucmVub3ZhdGVib3QuY29tL3Jlbm92YXRlLXNjaGVtYS5qc29uJyxcbiAgZXh0ZW5kczogWydnaXRodWI+V2lsbEJvb3N0ZXIvd2lsbGJvb3N0ZXItY29uZmlnczpyZW5vdmF0ZS5qc29uNSddLFxufTtcblxudHlwZSBTZXR0aW5ncyA9IHR5cGVvZiBqc29uT2JqICYgeyBwYWNrYWdlUnVsZXM/OiB7IG1hdGNoUGFja2FnZU5hbWVzOiBzdHJpbmdbXTsgZW5hYmxlZD86IGJvb2xlYW4gfVtdIH07XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZW5lcmF0ZVJlbm92YXRlSnNvbihjb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdnZW5lcmF0ZVJlbm92YXRlSnNvbicsIGFzeW5jICgpID0+IHtcbiAgICBsZXQgbmV3U2V0dGluZ3MgPSBzdHJ1Y3R1cmVkQ2xvbmUoanNvbk9iaikgYXMgU2V0dGluZ3M7XG4gICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICdyZW5vdmF0ZS5qc29uJyk7XG4gICAgaWYgKGZzLmV4aXN0c1N5bmMoYCR7ZmlsZVBhdGh9NWApKSB7XG4gICAgICAvLyBTaW5jZSBpdCBpcyBkaWZmaWN1bHQgZm9yIHBhcnNpbmcgcmVub3ZhdGUuanNvbjUsIHdlIGRvIG5vdGhpbmdcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IG9sZENvbnRlbnQgPSBhd2FpdCBmcy5wcm9taXNlcy5yZWFkRmlsZShmaWxlUGF0aCwgJ3V0ZjgnKTtcbiAgICAgIGNvbnN0IG9sZFNldHRpbmdzID0gSlNPTi5wYXJzZShvbGRDb250ZW50KSBhcyBTZXR0aW5ncztcbiAgICAgIG5ld1NldHRpbmdzID0gbWVyZ2UuYWxsKFtuZXdTZXR0aW5ncywgb2xkU2V0dGluZ3MsIG5ld1NldHRpbmdzXSwge1xuICAgICAgICBhcnJheU1lcmdlOiBvdmVyd3JpdGVNZXJnZSxcbiAgICAgIH0pIGFzIFNldHRpbmdzO1xuICAgICAgbmV3U2V0dGluZ3MuZXh0ZW5kcyA9IG5ld1NldHRpbmdzLmV4dGVuZHMuZmlsdGVyKChpdGVtOiBzdHJpbmcpID0+IGl0ZW0gIT09ICdAd2lsbGJvb3N0ZXInKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIGRvIG5vdGhpbmdcbiAgICB9XG5cbiAgICAvLyBEb24ndCB1cGdyYWRlIE5leHQuanMgYXV0b21hdGljYWxseVxuICAgIGlmIChjb25maWcuZGVwZW5kaW5nLmJsaXR6KSB7XG4gICAgICBuZXdTZXR0aW5ncy5wYWNrYWdlUnVsZXMgPz89IFtdO1xuICAgICAgaWYgKFxuICAgICAgICAhbmV3U2V0dGluZ3MucGFja2FnZVJ1bGVzLnNvbWUoKHJ1bGU6IHsgbWF0Y2hQYWNrYWdlTmFtZXM/OiBzdHJpbmdbXSB9KSA9PlxuICAgICAgICAgIHJ1bGUubWF0Y2hQYWNrYWdlTmFtZXM/LmluY2x1ZGVzKCduZXh0JylcbiAgICAgICAgKVxuICAgICAgKSB7XG4gICAgICAgIG5ld1NldHRpbmdzLnBhY2thZ2VSdWxlcy5wdXNoKHsgbWF0Y2hQYWNrYWdlTmFtZXM6IFsnbmV4dCddLCBlbmFibGVkOiBmYWxzZSB9KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnMucHJvbWlzZXMucm0ocGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnLmRlcGVuZGFib3QnKSwgeyBmb3JjZTogdHJ1ZSB9KSk7XG4gICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzLnByb21pc2VzLnJtKHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJy5yZW5vdmF0ZXJjLmpzb24nKSwgeyBmb3JjZTogdHJ1ZSB9KSk7XG4gICAgY29uc3QgbmV3Q29udGVudCA9IEpTT04uc3RyaW5naWZ5KG5ld1NldHRpbmdzLCB1bmRlZmluZWQsIDIpO1xuICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiBmc1V0aWwuZ2VuZXJhdGVGaWxlKGZpbGVQYXRoLCBuZXdDb250ZW50KSk7XG4gIH0pO1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMvcHJvbWlzZXMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gaW5zdGFsbEFnZW50U2tpbGxzKHJvb3RDb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdpbnN0YWxsQWdlbnRTa2lsbHMnLCBhc3luYyAoKSA9PiB7XG4gICAgLy8gVE9ETzogV2UgYXJlIHRlbXBvcmFyaWx5IHJlbW92aW5nIGFnZW50IHNraWxscyBmcm9tIHRoZSByZXBvXG4gICAgLy8gYXdhaXQgcnVuSW5zdGFsbEFnZW50U2tpbGxzKHJvb3RDb25maWcpO1xuICAgIGF3YWl0IFByb21pc2UuYWxsKFtcbiAgICAgIGZzLnJtKHBhdGgucmVzb2x2ZShyb290Q29uZmlnLmRpclBhdGgsICcuYWdlbnRzJyksIHtcbiAgICAgICAgZm9yY2U6IHRydWUsXG4gICAgICAgIHJlY3Vyc2l2ZTogdHJ1ZSxcbiAgICAgIH0pLFxuICAgICAgZnMucm0ocGF0aC5yZXNvbHZlKHJvb3RDb25maWcuZGlyUGF0aCwgJy5jbGF1ZGUnKSwge1xuICAgICAgICBmb3JjZTogdHJ1ZSxcbiAgICAgICAgcmVjdXJzaXZlOiB0cnVlLFxuICAgICAgfSksXG4gICAgICBmcy5ybShwYXRoLnJlc29sdmUocm9vdENvbmZpZy5kaXJQYXRoLCAnc2tpbGxzLWxvY2suanNvbicpLCB7XG4gICAgICAgIGZvcmNlOiB0cnVlLFxuICAgICAgfSksXG4gICAgXSk7XG4gIH0pO1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IG1lcmdlIGZyb20gJ2RlZXBtZXJnZSc7XG5pbXBvcnQgdHlwZSB7IFRzQ29uZmlnSnNvbiB9IGZyb20gJ3R5cGUtZmVzdCc7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGZzVXRpbCB9IGZyb20gJy4uL3V0aWxzL2ZzVXRpbC5qcyc7XG5pbXBvcnQgeyBjb21iaW5lTWVyZ2UgfSBmcm9tICcuLi91dGlscy9tZXJnZVV0aWwuanMnO1xuaW1wb3J0IHsgc29ydEtleXMgfSBmcm9tICcuLi91dGlscy9vYmplY3RVdGlsLmpzJztcbmltcG9ydCB7IHByb21pc2VQb29sIH0gZnJvbSAnLi4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuaW1wb3J0IHsgZ2V0VHNjb25maWdFeHRlbmRzIH0gZnJvbSAnLi4vdXRpbHMvdHNjb25maWdCYXNlLmpzJztcblxuY29uc3Qgcm9vdEpzb25PYmogPSB7XG4gIGNvbXBpbGVyT3B0aW9uczoge1xuICAgIGFsd2F5c1N0cmljdDogdHJ1ZSxcbiAgICBub1VuY2hlY2tlZEluZGV4ZWRBY2Nlc3M6IHRydWUsIC8vIGZvciBAdHlwZXNjcmlwdC1lc2xpbnQvcHJlZmVyLW51bGxpc2gtY29hbGVzY2luZ1xuICAgIGFsbG93U3ludGhldGljRGVmYXVsdEltcG9ydHM6IHRydWUsIC8vIGFsbG93IGBpbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnYFxuICAgIGVzTW9kdWxlSW50ZXJvcDogdHJ1ZSwgLy8gYWxsb3cgZGVmYXVsdCBpbXBvcnQgZnJvbSBDb21tb25KUy9BTUQvVU1EIG1vZHVsZXNcbiAgICByZXNvbHZlSnNvbk1vZHVsZTogdHJ1ZSwgLy8gYWxsb3cgdG8gaW1wb3J0IEpTT04gZmlsZXNcbiAgICBpbXBvcnRIZWxwZXJzOiBmYWxzZSxcbiAgICBub0VtaXQ6IHRydWUsXG4gIH0sXG4gIGV4Y2x1ZGU6IFsncGFja2FnZXMvKi90ZXN0L2ZpeHR1cmVzJywgJ3Rlc3QvZml4dHVyZXMnXSxcbiAgaW5jbHVkZTogW1xuICAgICcqLmNvbmZpZy50cycsXG4gICAgJ3BhY2thZ2VzLyovKi5jb25maWcudHMnLFxuICAgICdwYWNrYWdlcy8qL3NjcmlwdHMvKiovKicsXG4gICAgJ3BhY2thZ2VzLyovc3JjLyoqLyonLFxuICAgICdwYWNrYWdlcy8qL3Rlc3QvKiovKicsXG4gICAgJ3NjcmlwdHMvKiovKicsXG4gICAgJ3NyYy8qKi8qJyxcbiAgICAndGVzdC8qKi8qJyxcbiAgXSxcbn07XG5cbmNvbnN0IHN1Ykpzb25PYmogPSB7XG4gIGNvbXBpbGVyT3B0aW9uczoge1xuICAgIGFsd2F5c1N0cmljdDogdHJ1ZSxcbiAgICBub1VuY2hlY2tlZEluZGV4ZWRBY2Nlc3M6IHRydWUsIC8vIGZvciBAdHlwZXNjcmlwdC1lc2xpbnQvcHJlZmVyLW51bGxpc2gtY29hbGVzY2luZ1xuICAgIGFsbG93U3ludGhldGljRGVmYXVsdEltcG9ydHM6IHRydWUsIC8vIGFsbG93IGBpbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnYFxuICAgIGVzTW9kdWxlSW50ZXJvcDogdHJ1ZSwgLy8gYWxsb3cgZGVmYXVsdCBpbXBvcnQgZnJvbSBDb21tb25KUy9BTUQvVU1EIG1vZHVsZXNcbiAgICByZXNvbHZlSnNvbk1vZHVsZTogdHJ1ZSwgLy8gYWxsb3cgdG8gaW1wb3J0IEpTT04gZmlsZXNcbiAgICBpbXBvcnRIZWxwZXJzOiBmYWxzZSxcbiAgICBub0VtaXQ6IHRydWUsXG4gIH0sXG4gIGV4Y2x1ZGU6IFsndGVzdC9maXh0dXJlcyddLFxuICAvLyB3YmZ5IGdlbmVyYXRlcyByb290LWxldmVsIHRvb2wgY29uZmlncyBzdWNoIGFzIHBsYXl3cmlnaHQuY29uZmlnLnRzLCBhbmRcbiAgLy8gdHlwZS1hd2FyZSBsaW50aW5nIG5lZWRzIHRob3NlIGZpbGVzIGluIHRoZSBwcm9qZWN0IHRvIHNlZSBOb2RlL0J1biBnbG9iYWxzLlxuICBpbmNsdWRlOiBbJyouY29uZmlnLnRzJywgJ3NjcmlwdHMvKiovKicsICdzcmMvKiovKicsICd0ZXN0LyoqLyonXSxcbn07XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZW5lcmF0ZVRzY29uZmlnKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ2dlbmVyYXRlVHNjb25maWcnLCBhc3luYyAoKSA9PiB7XG4gICAgaWYgKGNvbmZpZy5kZXBlbmRpbmcuYmxpdHogfHwgY29uZmlnLmRlcGVuZGluZy5uZXh0KSB7XG4gICAgICBhd2FpdCBjbGVhbnVwTGVnYWN5VHNjb25maWdNb2R1bGVTZXR0aW5ncyhjb25maWcpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGxldCBuZXdTZXR0aW5ncyA9IHN0cnVjdHVyZWRDbG9uZShjb25maWcuaXNSb290ID8gcm9vdEpzb25PYmogOiBzdWJKc29uT2JqKSBhcyBUc0NvbmZpZ0pzb247XG4gICAgY29uc3QgZ2VuZXJhdGVkVHlwZXMgPSBnZXRHZW5lcmF0ZWRUeXBlcyhjb25maWcpO1xuICAgIG5ld1NldHRpbmdzLmV4dGVuZHMgPSBnZXRUc2NvbmZpZ0V4dGVuZHMoY29uZmlnKTtcbiAgICBuZXdTZXR0aW5ncy5jb21waWxlck9wdGlvbnMgPz89IHt9O1xuICAgIG5ld1NldHRpbmdzLmNvbXBpbGVyT3B0aW9ucy5yb290RGlyID0gZ2V0Um9vdERpcihjb25maWcpO1xuICAgIGlmIChnZW5lcmF0ZWRUeXBlcy5sZW5ndGggPiAwKSB7XG4gICAgICBuZXdTZXR0aW5ncy5jb21waWxlck9wdGlvbnMgPSB7IC4uLm5ld1NldHRpbmdzLmNvbXBpbGVyT3B0aW9ucywgdHlwZXM6IGdlbmVyYXRlZFR5cGVzIH07XG4gICAgfVxuICAgIGlmICghY29uZmlnLmRvZXNDb250YWluSnN4T3JUc3ggJiYgIWNvbmZpZy5kb2VzQ29udGFpbkpzeE9yVHN4SW5QYWNrYWdlcykge1xuICAgICAgZGVsZXRlIG5ld1NldHRpbmdzLmNvbXBpbGVyT3B0aW9ucz8uanN4O1xuICAgIH0gZWxzZSBpZiAoIWNvbmZpZy5pc0J1biAmJiAhY29uZmlnLmRlcGVuZGluZy5yZWFjdE5hdGl2ZSkge1xuICAgICAgbmV3U2V0dGluZ3MuY29tcGlsZXJPcHRpb25zID0geyAuLi5uZXdTZXR0aW5ncy5jb21waWxlck9wdGlvbnMsIGpzeDogJ3JlYWN0LWpzeCcgfTtcbiAgICB9XG4gICAgaWYgKGNvbmZpZy5pc1Jvb3QgJiYgIWNvbmZpZy5kb2VzQ29udGFpblN1YlBhY2thZ2VKc29ucykge1xuICAgICAgbmV3U2V0dGluZ3MuaW5jbHVkZSA9IG5ld1NldHRpbmdzLmluY2x1ZGU/LmZpbHRlcigoZGlyUGF0aDogc3RyaW5nKSA9PiAhZGlyUGF0aC5zdGFydHNXaXRoKCdwYWNrYWdlcy8qLycpKTtcbiAgICAgIG5ld1NldHRpbmdzLmV4Y2x1ZGUgPSBuZXdTZXR0aW5ncy5leGNsdWRlPy5maWx0ZXIoKGRpclBhdGg6IHN0cmluZykgPT4gIWRpclBhdGguc3RhcnRzV2l0aCgncGFja2FnZXMvKi8nKSk7XG4gICAgfVxuICAgIGlmIChjb25maWcuZGVwZW5kaW5nLnByaXNtYSkge1xuICAgICAgLy8gUHJpc21hIHNlZWRzIGFuZCBtaWdyYXRpb24gaGVscGVyIHNjcmlwdHMgb2Z0ZW4gbGl2ZSBvdXRzaWRlIHNyYywgYnV0XG4gICAgICAvLyB0eXBlLWF3YXJlIGxpbnRpbmcgc3RpbGwgbmVlZHMgdGhlbSBjb3ZlcmVkIGJ5IHRoZSBwcm9qZWN0IGNvbmZpZy5cbiAgICAgIGFkZEluY2x1ZGVQYXRoKG5ld1NldHRpbmdzLCAncHJpc21hLyoqLyonKTtcbiAgICB9XG5cbiAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJ3RzY29uZmlnLmpzb24nKTtcbiAgICB0cnkge1xuICAgICAgY29uc3QgZXhpc3RpbmdDb250ZW50ID0gYXdhaXQgZnMucHJvbWlzZXMucmVhZEZpbGUoZmlsZVBhdGgsICd1dGY4Jyk7XG4gICAgICBjb25zdCBvbGRTZXR0aW5ncyA9IEpTT04ucGFyc2UoZXhpc3RpbmdDb250ZW50KSBhcyBUc0NvbmZpZ0pzb247XG4gICAgICBjb25zdCBleGlzdGluZ1R5cGVzID0gbm9ybWFsaXplU3RyaW5nQXJyYXkob2xkU2V0dGluZ3MuY29tcGlsZXJPcHRpb25zPy50eXBlcyk7XG4gICAgICBjb25zdCBleGlzdGluZ0VtaXRNZXRhZGF0YSA9IHBpY2tFeGlzdGluZ0VtaXRNZXRhZGF0YShvbGRTZXR0aW5ncy5jb21waWxlck9wdGlvbnMpO1xuICAgICAgbmV3U2V0dGluZ3MuZXh0ZW5kcyA9IG1lcmdlVHNjb25maWdFeHRlbmRzKG5ld1NldHRpbmdzLmV4dGVuZHMsIG9sZFNldHRpbmdzLmV4dGVuZHMpO1xuICAgICAgZGVsZXRlIG9sZFNldHRpbmdzLmV4dGVuZHM7XG4gICAgICBkZWxldGUgb2xkU2V0dGluZ3MuY29tcGlsZXJPcHRpb25zPy5qc3g7XG4gICAgICBuZXdTZXR0aW5ncyA9IG1lcmdlLmFsbChbbmV3U2V0dGluZ3MsIG9sZFNldHRpbmdzLCBuZXdTZXR0aW5nc10sIHsgYXJyYXlNZXJnZTogY29tYmluZU1lcmdlIH0pO1xuICAgICAgbmV3U2V0dGluZ3MuaW5jbHVkZSA9IG5ld1NldHRpbmdzLmluY2x1ZGU/LmZpbHRlcihcbiAgICAgICAgKGRpclBhdGg6IHN0cmluZykgPT5cbiAgICAgICAgICAhZGlyUGF0aC5pbmNsdWRlcygnQHR5cGVzJykgJiYgIWRpclBhdGguaW5jbHVkZXMoJ19fdGVzdHNfXy8nKSAmJiAhZGlyUGF0aC5pbmNsdWRlcygndGVzdHMvJylcbiAgICAgICk7XG4gICAgICBuZXdTZXR0aW5ncy5jb21waWxlck9wdGlvbnMgPz89IHt9O1xuICAgICAgLy8gd2JmeS1nZW5lcmF0ZWQgdHNjb25maWcuanNvbiBpcyBhIGxpbnQvdHlwZWNoZWNrIHByb2plY3QsIG5vdCB0aGUgZW1pdFxuICAgICAgLy8gY29udHJhY3QuIEl0IG11c3Qga2VlcCByb290RGlyIGJyb2FkIGVub3VnaCBmb3Igcm9vdCBjb25maWcgZmlsZXMsXG4gICAgICAvLyBzY3JpcHRzLCBzcmMsIGFuZCB0ZXN0cy4gYnVpbGQtdHMgb3ducyBlbWl0IGFuZCBjcmVhdGVzIGEgdGVtcG9yYXJ5XG4gICAgICAvLyBzcmMtb25seSB0c2NvbmZpZyB3aXRoIG5vRW1pdD1mYWxzZSwgZW1pdERlY2xhcmF0aW9uT25seT10cnVlLFxuICAgICAgLy8gcm9vdERpcj1cInNyY1wiLCBhbmQgaW5jbHVkZT1bXCJzcmMvKiovKlwiXSwgc28gcHJlc2VydmluZyBub0VtaXQ9ZmFsc2Ugb3JcbiAgICAgIC8vIHJvb3REaXI9XCJzcmNcIiBoZXJlIHdvdWxkIG9ubHkgYnJlYWsgbm9uLXNyYyB0eXBlLWF3YXJlIGxpbnQgY292ZXJhZ2UuXG4gICAgICBuZXdTZXR0aW5ncy5jb21waWxlck9wdGlvbnMgPSB7IC4uLm5ld1NldHRpbmdzLmNvbXBpbGVyT3B0aW9ucywgLi4uZXhpc3RpbmdFbWl0TWV0YWRhdGEgfTtcbiAgICAgIGVuc3VyZVRzRXh0ZW5zaW9uRW1pdENvbXBhdGliaWxpdHkobmV3U2V0dGluZ3MuY29tcGlsZXJPcHRpb25zKTtcblxuICAgICAgY29uc3QgbWVyZ2VkVHlwZXMgPSBbLi4ubmV3IFNldChbLi4uZmlsdGVyRXhpc3RpbmdUeXBlcyhleGlzdGluZ1R5cGVzLCBnZW5lcmF0ZWRUeXBlcyksIC4uLmdlbmVyYXRlZFR5cGVzXSldO1xuICAgICAgaWYgKG1lcmdlZFR5cGVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgbmV3U2V0dGluZ3MuY29tcGlsZXJPcHRpb25zLnR5cGVzID0gbWVyZ2VkVHlwZXM7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBkZWxldGUgbmV3U2V0dGluZ3MuY29tcGlsZXJPcHRpb25zLnR5cGVzO1xuICAgICAgfVxuICAgICAgaWYgKHNob3VsZERlbGV0ZVR5cGVSb290cyhnZW5lcmF0ZWRUeXBlcykpIHtcbiAgICAgICAgZGVsZXRlIG5ld1NldHRpbmdzLmNvbXBpbGVyT3B0aW9ucy50eXBlUm9vdHM7XG4gICAgICB9XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBkbyBub3RoaW5nXG4gICAgfVxuICAgIHNvcnRLZXlzKG5ld1NldHRpbmdzKTtcbiAgICBuZXdTZXR0aW5ncy5pbmNsdWRlPy5zb3J0KCk7XG4gICAgLy8gRG9uJ3QgdXNlIG9sZCBkZWNvcmF0b3JcbiAgICBkZWxldGUgbmV3U2V0dGluZ3MuY29tcGlsZXJPcHRpb25zPy5leHBlcmltZW50YWxEZWNvcmF0b3JzO1xuICAgIC8vIFBhY2thZ2UgaW1wb3J0cyBzaG91bGQgcmVzb2x2ZSB0aHJvdWdoIHBhY2thZ2UgZXhwb3J0cyBpbnN0ZWFkIG9mIGJhc2VVcmwuXG4gICAgLy8gcGF0aHMgaXMgaW50ZW50aW9uYWxseSBwcmVzZXJ2ZWQgc28gcmVwby1sb2NhbCB0b29saW5nIGNhbiBrZWVwIGV4cGxpY2l0XG4gICAgLy8gYWxpYXNlcyB3aXRob3V0IHJlbHlpbmcgb24gYmFzZVVybCdzIGJyb2FkIGZhbGxiYWNrIHJlc29sdXRpb24uXG4gICAgZGVsZXRlIG5ld1NldHRpbmdzLmNvbXBpbGVyT3B0aW9ucz8uYmFzZVVybDtcbiAgICBkZWxldGVMZWdhY3lNb2R1bGVTZXR0aW5ncyhuZXdTZXR0aW5ncy5jb21waWxlck9wdGlvbnMsIGNvbmZpZyk7XG4gICAgbm9ybWFsaXplQ29tbW9uSnNUc2NvbmZpZ1NldHRpbmdzKG5ld1NldHRpbmdzLmNvbXBpbGVyT3B0aW9ucywgY29uZmlnKTtcbiAgICBpZiAoY29uZmlnLmRlcGVuZGluZy5yZWFjdE5hdGl2ZSkge1xuICAgICAgZGVsZXRlIG5ld1NldHRpbmdzLmNvbXBpbGVyT3B0aW9ucz8udmVyYmF0aW1Nb2R1bGVTeW50YXg7XG4gICAgfVxuICAgIGNvbnN0IG5ld0NvbnRlbnQgPSBKU09OLnN0cmluZ2lmeShuZXdTZXR0aW5ncywgdW5kZWZpbmVkLCAyKTtcbiAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnNVdGlsLmdlbmVyYXRlRmlsZShmaWxlUGF0aCwgbmV3Q29udGVudCkpO1xuICB9KTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gY2xlYW51cExlZ2FjeVRzY29uZmlnTW9kdWxlU2V0dGluZ3MoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAndHNjb25maWcuanNvbicpO1xuICB0cnkge1xuICAgIGNvbnN0IHNldHRpbmdzID0gSlNPTi5wYXJzZShhd2FpdCBmcy5wcm9taXNlcy5yZWFkRmlsZShmaWxlUGF0aCwgJ3V0ZjgnKSkgYXMgVHNDb25maWdKc29uO1xuICAgIG5vcm1hbGl6ZU5leHRUc2NvbmZpZ01vZHVsZVNldHRpbmdzKHNldHRpbmdzLmNvbXBpbGVyT3B0aW9ucyk7XG4gICAgbm9ybWFsaXplTmV4dFRzY29uZmlnUGF0aEFsaWFzZXMoc2V0dGluZ3MuY29tcGlsZXJPcHRpb25zKTtcbiAgICBhZGRTY3JpcHRzSW5jbHVkZUZvckZyYW1ld29ya1Byb2plY3Qoc2V0dGluZ3MpO1xuICAgIGF3YWl0IHByb21pc2VQb29sLnJ1bigoKSA9PiBmc1V0aWwuZ2VuZXJhdGVGaWxlKGZpbGVQYXRoLCBKU09OLnN0cmluZ2lmeShzZXR0aW5ncywgdW5kZWZpbmVkLCAyKSkpO1xuICB9IGNhdGNoIHtcbiAgICAvLyBOZXh0L0JsaXR6IG93biB0aGVpciB0c2NvbmZpZyBzaGFwZSwgYnV0IFR5cGVTY3JpcHQgNiBubyBsb25nZXIgYWNjZXB0c1xuICAgIC8vIG5vZGUxMCByZXNvbHZlciBzcGVsbGluZ3MgdGhhdCBvbGRlciBwcm9qZWN0cyBjb21tb25seSBpbmhlcml0ZWQuXG4gIH1cbn1cblxuZnVuY3Rpb24gYWRkU2NyaXB0c0luY2x1ZGVGb3JGcmFtZXdvcmtQcm9qZWN0KHNldHRpbmdzOiBUc0NvbmZpZ0pzb24pOiB2b2lkIHtcbiAgLy8gT21pdHRpbmcgaW5jbHVkZSBsZXRzIGZyYW1ld29yayB0c2NvbmZpZ3Mga2VlcCBUeXBlU2NyaXB0J3MgZGVmYXVsdFxuICAvLyBcImFsbCBUUy9UU1ggZmlsZXNcIiBiZWhhdmlvciwgd2hpY2ggYWxyZWFkeSBjb3ZlcnMgc2NyaXB0cy5cbiAgaWYgKCFzZXR0aW5ncy5pbmNsdWRlKSByZXR1cm47XG4gIGlmIChzZXR0aW5ncy5pbmNsdWRlLmluY2x1ZGVzKCdzY3JpcHRzLyoqLyonKSkgcmV0dXJuO1xuXG4gIHNldHRpbmdzLmluY2x1ZGUucHVzaCgnc2NyaXB0cy8qKi8qJyk7XG4gIHNldHRpbmdzLmluY2x1ZGUuc29ydCgpO1xufVxuXG5mdW5jdGlvbiBub3JtYWxpemVOZXh0VHNjb25maWdNb2R1bGVTZXR0aW5ncyhjb21waWxlck9wdGlvbnM6IFRzQ29uZmlnSnNvbi5Db21waWxlck9wdGlvbnMgfCB1bmRlZmluZWQpOiB2b2lkIHtcbiAgaWYgKCFjb21waWxlck9wdGlvbnMpIHJldHVybjtcbiAgaWYgKFxuICAgIGNvbXBpbGVyT3B0aW9ucy5tb2R1bGVSZXNvbHV0aW9uID09PSAnbm9kZScgfHxcbiAgICBjb21waWxlck9wdGlvbnMubW9kdWxlUmVzb2x1dGlvbiA9PT0gJ05vZGUnIHx8XG4gICAgY29tcGlsZXJPcHRpb25zLm1vZHVsZVJlc29sdXRpb24gPT09ICdub2RlMTAnIHx8XG4gICAgY29tcGlsZXJPcHRpb25zLm1vZHVsZVJlc29sdXRpb24gPT09IHVuZGVmaW5lZFxuICApIHtcbiAgICAvLyBOZXh0LmpzIHdyaXRlcyBcIm5vZGVcIiBkdXJpbmcgYnVpbGQgd2hlbiB0aGlzIG9wdGlvbiBpcyBtaXNzaW5nLCBidXRcbiAgICAvLyB0c2dvbGludCB0cmVhdHMgdGhhdCBzcGVsbGluZyBhcyB0aGUgcmVtb3ZlZCBub2RlMTAgcmVzb2x2ZXIuXG4gICAgY29tcGlsZXJPcHRpb25zLm1vZHVsZVJlc29sdXRpb24gPSAnYnVuZGxlcic7XG4gIH1cbn1cblxuZnVuY3Rpb24gbm9ybWFsaXplTmV4dFRzY29uZmlnUGF0aEFsaWFzZXMoY29tcGlsZXJPcHRpb25zOiBUc0NvbmZpZ0pzb24uQ29tcGlsZXJPcHRpb25zIHwgdW5kZWZpbmVkKTogdm9pZCB7XG4gIGlmICghY29tcGlsZXJPcHRpb25zKSByZXR1cm47XG5cbiAgLy8gdHNnb2xpbnQgZm9sbG93cyBUeXBlU2NyaXB0IDYgdmFsaWRhdGlvbiwgd2hlcmUgYmFzZVVybCBpcyByZW1vdmVkIGFuZFxuICAvLyBwYXRoIHRhcmdldHMgbXVzdCBiZSBleHBsaWNpdGx5IHJlbGF0aXZlLiBOZXh0LmpzIHN0aWxsIGFjY2VwdHMgdGhlIGFsaWFzXG4gIC8vIHNoYXBlIGFmdGVyIGVhY2ggdGFyZ2V0IGlzIHdyaXR0ZW4gd2l0aCBhIGxlYWRpbmcgLi8uXG4gIGRlbGV0ZSBjb21waWxlck9wdGlvbnMuYmFzZVVybDtcbiAgaWYgKCFjb21waWxlck9wdGlvbnMucGF0aHMpIHJldHVybjtcblxuICBmb3IgKGNvbnN0IFthbGlhcywgdGFyZ2V0c10gb2YgT2JqZWN0LmVudHJpZXMoY29tcGlsZXJPcHRpb25zLnBhdGhzKSkge1xuICAgIGNvbXBpbGVyT3B0aW9ucy5wYXRoc1thbGlhc10gPSBub3JtYWxpemVQYXRoQWxpYXNUYXJnZXRzKHRhcmdldHMpO1xuICB9XG59XG5cbmZ1bmN0aW9uIG5vcm1hbGl6ZVBhdGhBbGlhc1RhcmdldHModGFyZ2V0czogc3RyaW5nW10pOiBzdHJpbmdbXSB7XG4gIHJldHVybiB0YXJnZXRzLm1hcCgodGFyZ2V0KSA9PiB7XG4gICAgaWYgKHRhcmdldC5zdGFydHNXaXRoKCcuLycpIHx8IHRhcmdldC5zdGFydHNXaXRoKCcuLi8nKSB8fCBwYXRoLmlzQWJzb2x1dGUodGFyZ2V0KSkgcmV0dXJuIHRhcmdldDtcbiAgICByZXR1cm4gYC4vJHt0YXJnZXR9YDtcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIGdldFJvb3REaXIoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogc3RyaW5nIHtcbiAgaWYgKGNvbmZpZy5pc1Jvb3QpIHJldHVybiAnLic7XG4gIHJldHVybiBmcy5leGlzdHNTeW5jKHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJy4uJywgJy4uJywgJ3BhY2thZ2UuanNvbicpKSA/ICcuLi8uLicgOiAnLic7XG59XG5cbmZ1bmN0aW9uIG1lcmdlVHNjb25maWdFeHRlbmRzKFxuICBnZW5lcmF0ZWRFeHRlbmRzOiBUc0NvbmZpZ0pzb25bJ2V4dGVuZHMnXSxcbiAgZXhpc3RpbmdFeHRlbmRzOiBUc0NvbmZpZ0pzb25bJ2V4dGVuZHMnXVxuKTogVHNDb25maWdKc29uWydleHRlbmRzJ10ge1xuICBjb25zdCBtZXJnZWRFeHRlbmRzID0gWy4uLm5vcm1hbGl6ZUV4dGVuZHMoZ2VuZXJhdGVkRXh0ZW5kcyksIC4uLm5vcm1hbGl6ZUV4dGVuZHMoZXhpc3RpbmdFeHRlbmRzKV07XG4gIGNvbnN0IHVuaXF1ZUV4dGVuZHMgPSBbLi4ubmV3IFNldChtZXJnZWRFeHRlbmRzKV07XG4gIGlmICh1bmlxdWVFeHRlbmRzLmxlbmd0aCA9PT0gMCkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgaWYgKHVuaXF1ZUV4dGVuZHMubGVuZ3RoID09PSAxKSByZXR1cm4gdW5pcXVlRXh0ZW5kc1swXTtcbiAgcmV0dXJuIHVuaXF1ZUV4dGVuZHM7XG59XG5cbmZ1bmN0aW9uIGFkZEluY2x1ZGVQYXRoKHNldHRpbmdzOiBUc0NvbmZpZ0pzb24sIGRpclBhdGg6IHN0cmluZyk6IHZvaWQge1xuICBzZXR0aW5ncy5pbmNsdWRlID8/PSBbXTtcbiAgaWYgKCFzZXR0aW5ncy5pbmNsdWRlLmluY2x1ZGVzKGRpclBhdGgpKSB7XG4gICAgc2V0dGluZ3MuaW5jbHVkZS5wdXNoKGRpclBhdGgpO1xuICB9XG59XG5cbmZ1bmN0aW9uIG5vcm1hbGl6ZUV4dGVuZHModmFsdWU6IFRzQ29uZmlnSnNvblsnZXh0ZW5kcyddKTogc3RyaW5nW10ge1xuICBpZiAoIXZhbHVlKSByZXR1cm4gW107XG4gIHJldHVybiBBcnJheS5pc0FycmF5KHZhbHVlKSA/IHZhbHVlIDogW3ZhbHVlXTtcbn1cblxuZnVuY3Rpb24gbm9ybWFsaXplU3RyaW5nQXJyYXkodmFsdWU6IHVua25vd24pOiBzdHJpbmdbXSB7XG4gIGlmICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnKSByZXR1cm4gW3ZhbHVlXTtcbiAgaWYgKCFBcnJheS5pc0FycmF5KHZhbHVlKSkgcmV0dXJuIFtdO1xuICByZXR1cm4gdmFsdWUuZmlsdGVyKChpdGVtKTogaXRlbSBpcyBzdHJpbmcgPT4gdHlwZW9mIGl0ZW0gPT09ICdzdHJpbmcnKTtcbn1cblxuZnVuY3Rpb24gc2hvdWxkRGVsZXRlVHlwZVJvb3RzKHR5cGVOYW1lczogc3RyaW5nW10pOiBib29sZWFuIHtcbiAgLy8gT25seSBnZW5lcmF0ZWQgcGFja2FnZS1vd25lZCB0ZXN0IHR5cGVzIHNob3VsZCB0cmlnZ2VyIHRoaXMuIFVzZXItZGVmaW5lZCBzbGFzaC1iYXNlZFxuICAvLyBlbnRyaWVzIG1heSBpbnRlbnRpb25hbGx5IHJlbHkgb24gY3VzdG9tIHR5cGVSb290cyBhbmQgc2hvdWxkIGJlIHByZXNlcnZlZCBhcy1pcy5cbiAgcmV0dXJuIHR5cGVOYW1lcy5zb21lKCh0eXBlTmFtZSkgPT4gdHlwZU5hbWUgPT09ICdjeXByZXNzJyB8fCB0eXBlTmFtZS5pbmNsdWRlcygnLycpKTtcbn1cblxuZnVuY3Rpb24gZmlsdGVyRXhpc3RpbmdUeXBlcyhleGlzdGluZ1R5cGVzOiBzdHJpbmdbXSwgZ2VuZXJhdGVkVHlwZXM6IHN0cmluZ1tdKTogc3RyaW5nW10ge1xuICBjb25zdCBnZW5lcmF0ZWRUeXBlU2V0ID0gbmV3IFNldChnZW5lcmF0ZWRUeXBlcyk7XG4gIHJldHVybiBleGlzdGluZ1R5cGVzLmZpbHRlcigodHlwZU5hbWUpID0+IHtcbiAgICAvLyB3YmZ5IG93bnMgdGhlc2UgcGFja2FnZS1wcm92aWRlZCB0ZXN0IGdsb2JhbHMuIERyb3Agc3RhbGUgZW50cmllcyB3aGVuIHRoZVxuICAgIC8vIGNvcnJlc3BvbmRpbmcgZGVwZW5kZW5jeSBpcyBubyBsb25nZXIgcHJlc2VudCBzbyBUeXBlU2NyaXB0IHdvbid0IHJlcXVpcmVcbiAgICAvLyBtaXNzaW5nIHBhY2thZ2VzIHN1Y2ggYXMgdml0ZXN0LlxuICAgIGlmIChpc0dlbmVyYXRlZFRlc3RHbG9iYWxUeXBlKHR5cGVOYW1lKSAmJiAhZ2VuZXJhdGVkVHlwZVNldC5oYXModHlwZU5hbWUpKSByZXR1cm4gZmFsc2U7XG4gICAgcmV0dXJuIHRydWU7XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBpc0dlbmVyYXRlZFRlc3RHbG9iYWxUeXBlKHR5cGVOYW1lOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgcmV0dXJuIHR5cGVOYW1lID09PSAnY3lwcmVzcycgfHwgdHlwZU5hbWUgPT09ICdqZXN0JyB8fCB0eXBlTmFtZSA9PT0gJ21vY2hhJyB8fCB0eXBlTmFtZSA9PT0gJ3ZpdGVzdC9nbG9iYWxzJztcbn1cblxuZnVuY3Rpb24gZW5zdXJlVHNFeHRlbnNpb25FbWl0Q29tcGF0aWJpbGl0eShjb21waWxlck9wdGlvbnM6IFRzQ29uZmlnSnNvbi5Db21waWxlck9wdGlvbnMgfCB1bmRlZmluZWQpOiB2b2lkIHtcbiAgaWYgKCFjb21waWxlck9wdGlvbnMpIHJldHVybjtcbiAgaWYgKGNvbXBpbGVyT3B0aW9ucy5ub0VtaXQgIT09IGZhbHNlIHx8IGNvbXBpbGVyT3B0aW9ucy5lbWl0RGVjbGFyYXRpb25Pbmx5ID09PSB0cnVlKSByZXR1cm47XG5cbiAgLy8gQHRzY29uZmlnL2J1biBlbmFibGVzIGFsbG93SW1wb3J0aW5nVHNFeHRlbnNpb25zLCB3aGljaCBUeXBlU2NyaXB0IHBlcm1pdHNcbiAgLy8gZHVyaW5nIGVtaXQgb25seSB3aGVuIHJlbGF0aXZlIFRTIGV4dGVuc2lvbnMgYXJlIHJld3JpdHRlbi5cbiAgY29tcGlsZXJPcHRpb25zLnJld3JpdGVSZWxhdGl2ZUltcG9ydEV4dGVuc2lvbnMgPSB0cnVlO1xufVxuXG5mdW5jdGlvbiBkZWxldGVMZWdhY3lNb2R1bGVTZXR0aW5ncyhcbiAgY29tcGlsZXJPcHRpb25zOiBUc0NvbmZpZ0pzb24uQ29tcGlsZXJPcHRpb25zIHwgdW5kZWZpbmVkLFxuICBjb25maWc6IFBhY2thZ2VDb25maWdcbik6IHZvaWQge1xuICBpZiAoIWNvbXBpbGVyT3B0aW9ucykgcmV0dXJuO1xuXG4gIC8vIFR5cGVTY3JpcHQgNiByZW1vdmVkIHRoZSBvbGQgbm9kZTEwIHJlc29sdmVyIHNwZWxsaW5nLCBzbyBpbmhlcml0ZWQgYmFzZSBjb25maWdzXG4gIC8vIHNob3VsZCBjaG9vc2UgdGhlIHJlc29sdmVyIHVubGVzcyBhIHByb2plY3QgYWxyZWFkeSBvcHRlZCBpbnRvIGEgbW9kZXJuIG9uZS5cbiAgaWYgKFxuICAgIGNvbXBpbGVyT3B0aW9ucy5tb2R1bGVSZXNvbHV0aW9uID09PSAnbm9kZScgfHxcbiAgICBjb21waWxlck9wdGlvbnMubW9kdWxlUmVzb2x1dGlvbiA9PT0gJ05vZGUnIHx8XG4gICAgY29tcGlsZXJPcHRpb25zLm1vZHVsZVJlc29sdXRpb24gPT09ICdub2RlMTAnXG4gICkge1xuICAgIGRlbGV0ZSBjb21waWxlck9wdGlvbnMubW9kdWxlUmVzb2x1dGlvbjtcbiAgfVxuICBpZiAoY29uZmlnLmlzQnVuIHx8IGNvbmZpZy5kZXBlbmRpbmcucmVhY3ROYXRpdmUgfHwgY29tcGlsZXJPcHRpb25zLm1vZHVsZSAhPT0gJ0VTTmV4dCcpIHJldHVybjtcblxuICAvLyBOb2RlIGJhc2UgY29uZmlncyBub3cgcGFpciB0aGVpciByZXNvbHZlciB3aXRoIGEgbWF0Y2hpbmcgbW9kdWxlIGtpbmQuIEtlZXBpbmdcbiAgLy8gb2xkZXIgRVNOZXh0IG92ZXJyaWRlcyBjcmVhdGVzIGludmFsaWQgZ2VuZXJhdGVkIGNvbmZpZ3MgZm9yIFRTIDYuXG4gIGRlbGV0ZSBjb21waWxlck9wdGlvbnMubW9kdWxlO1xufVxuXG5mdW5jdGlvbiBub3JtYWxpemVDb21tb25Kc1RzY29uZmlnU2V0dGluZ3MoXG4gIGNvbXBpbGVyT3B0aW9uczogVHNDb25maWdKc29uLkNvbXBpbGVyT3B0aW9ucyB8IHVuZGVmaW5lZCxcbiAgY29uZmlnOiBQYWNrYWdlQ29uZmlnXG4pOiB2b2lkIHtcbiAgaWYgKCFjb21waWxlck9wdGlvbnMgfHwgY29uZmlnLmlzQnVuIHx8IGNvbmZpZy5kZXBlbmRpbmcucmVhY3ROYXRpdmUgfHwgY29uZmlnLmlzRXNtUGFja2FnZSkgcmV0dXJuO1xuXG4gIGlmIChjb21waWxlck9wdGlvbnMubW9kdWxlPy50b0xvd2VyQ2FzZSgpID09PSAnY29tbW9uanMnKSB7XG4gICAgLy8gQHRzY29uZmlnL25vZGUtbHRzIG5vdyBwcm92aWRlcyBtb2R1bGVSZXNvbHV0aW9uPW5vZGUxNi4gVHlwZVNjcmlwdCByZXF1aXJlc1xuICAgIC8vIHRoZSBtb2R1bGUga2luZCB0byBtb3ZlIHdpdGggdGhhdCByZXNvbHZlciwgd2hpbGUgdmVyYmF0aW1Nb2R1bGVTeW50YXg9ZmFsc2VcbiAgICAvLyBwcmVzZXJ2ZXMgdGhlIGxvbmctc3RhbmRpbmcgQ29tbW9uSlMgZW1pdCBzaGFwZSBmb3IgZXhpc3RpbmcgcGFja2FnZXMuXG4gICAgY29tcGlsZXJPcHRpb25zLm1vZHVsZSA9ICdOb2RlMTYnO1xuICB9XG4gIGNvbXBpbGVyT3B0aW9ucy52ZXJiYXRpbU1vZHVsZVN5bnRheCA9IGZhbHNlO1xufVxuXG5mdW5jdGlvbiBwaWNrRXhpc3RpbmdFbWl0TWV0YWRhdGEoXG4gIGNvbXBpbGVyT3B0aW9uczogVHNDb25maWdKc29uWydjb21waWxlck9wdGlvbnMnXVxuKTogUGljazxOb25OdWxsYWJsZTxUc0NvbmZpZ0pzb25bJ2NvbXBpbGVyT3B0aW9ucyddPiwgJ2RlY2xhcmF0aW9uJyB8ICdkZWNsYXJhdGlvbk1hcCcgfCAnc291cmNlTWFwJz4ge1xuICBjb25zdCBlbWl0T3B0aW9ucyA9IHt9IGFzIFBpY2s8XG4gICAgTm9uTnVsbGFibGU8VHNDb25maWdKc29uWydjb21waWxlck9wdGlvbnMnXT4sXG4gICAgJ2RlY2xhcmF0aW9uJyB8ICdkZWNsYXJhdGlvbk1hcCcgfCAnc291cmNlTWFwJ1xuICA+O1xuICBmb3IgKGNvbnN0IGtleSBvZiBbJ2RlY2xhcmF0aW9uJywgJ2RlY2xhcmF0aW9uTWFwJywgJ3NvdXJjZU1hcCddIGFzIGNvbnN0KSB7XG4gICAgY29uc3QgdmFsdWUgPSBjb21waWxlck9wdGlvbnM/LltrZXldO1xuICAgIGlmICh2YWx1ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBlbWl0T3B0aW9uc1trZXldID0gdmFsdWUgYXMgbmV2ZXI7XG4gICAgfVxuICB9XG4gIHJldHVybiBlbWl0T3B0aW9ucztcbn1cblxuZnVuY3Rpb24gZ2V0R2VuZXJhdGVkVHlwZXMoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogc3RyaW5nW10ge1xuICBjb25zdCB0eXBlTmFtZXMgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgY29uc3QgZGVwZW5kZW5jaWVzID0ge1xuICAgIC4uLmNvbmZpZy5wYWNrYWdlSnNvbj8uZGVwZW5kZW5jaWVzLFxuICAgIC4uLmNvbmZpZy5wYWNrYWdlSnNvbj8uZGV2RGVwZW5kZW5jaWVzLFxuICB9O1xuXG4gIGlmIChjb25maWcuaXNCdW4pIHtcbiAgICB0eXBlTmFtZXMuYWRkKCdidW4nKTtcbiAgfSBlbHNlIGlmICghY29uZmlnLmRlcGVuZGluZy5yZWFjdE5hdGl2ZSkge1xuICAgIHR5cGVOYW1lcy5hZGQoJ25vZGUnKTtcbiAgfVxuICBpZiAoXG4gICAgZGVwZW5kZW5jaWVzLmplc3QgfHxcbiAgICBkZXBlbmRlbmNpZXNbJ0BqZXN0L2dsb2JhbHMnXSB8fFxuICAgIGRlcGVuZGVuY2llc1snamVzdC1lbnZpcm9ubWVudC1qc2RvbSddIHx8XG4gICAgZGVwZW5kZW5jaWVzWyd0cy1qZXN0J11cbiAgKSB7XG4gICAgdHlwZU5hbWVzLmFkZCgnamVzdCcpO1xuICB9XG4gIGlmIChkZXBlbmRlbmNpZXMudml0ZXN0KSB7XG4gICAgdHlwZU5hbWVzLmFkZCgndml0ZXN0L2dsb2JhbHMnKTtcbiAgfVxuICBpZiAoZGVwZW5kZW5jaWVzLm1vY2hhKSB7XG4gICAgdHlwZU5hbWVzLmFkZCgnbW9jaGEnKTtcbiAgfVxuICBpZiAoZGVwZW5kZW5jaWVzLmN5cHJlc3MpIHtcbiAgICB0eXBlTmFtZXMuYWRkKCdjeXByZXNzJyk7XG4gIH1cblxuICByZXR1cm4gWy4uLnR5cGVOYW1lc107XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgbWVyZ2UgZnJvbSAnZGVlcG1lcmdlJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZnNVdGlsIH0gZnJvbSAnLi4vdXRpbHMvZnNVdGlsLmpzJztcbmltcG9ydCB7IHNvcnRLZXlzIH0gZnJvbSAnLi4vdXRpbHMvb2JqZWN0VXRpbC5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcblxuY29uc3QgZXhjbHVkZUZpbGVQYXR0ZXJucyA9IFtcbiAgJyoqLy5naXQvb2JqZWN0cy8qKicsXG4gICcqKi8uZ2l0L3N1YnRyZWUtY2FjaGUvKionLFxuICAnKiovbm9kZV9tb2R1bGVzLyoqJyxcbiAgJyoqL3RtcC8qKicsXG4gICcqKi90ZW1wLyoqJyxcbiAgJyoqL2Rpc3QvKionLFxuXTtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlVnNjb2RlU2V0dGluZ3MoY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBsb2dnZXIuZnVuY3Rpb25JZ25vcmluZ0V4Y2VwdGlvbignZ2VuZXJhdGVWc2NvZGVTZXR0aW5ncycsIGFzeW5jICgpID0+IHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICcudnNjb2RlJywgJ3NldHRpbmdzLmpzb24nKTtcbiAgICAgIGNvbnN0IGV4aXN0aW5nQ29udGVudCA9IGF3YWl0IGZzLnByb21pc2VzLnJlYWRGaWxlKGZpbGVQYXRoLCAndXRmOCcpO1xuICAgICAgbGV0IHNldHRpbmdzID0gSlNPTi5wYXJzZShleGlzdGluZ0NvbnRlbnQpIGFzIG9iamVjdDtcbiAgICAgIGZvciAoY29uc3QgZXhjbHVkZUZpbGVQYXR0ZXJuIG9mIGV4Y2x1ZGVGaWxlUGF0dGVybnMpIHtcbiAgICAgICAgc2V0dGluZ3MgPSBtZXJnZS5hbGwoW3NldHRpbmdzLCBleGNsdWRlU2V0dGluZyhleGNsdWRlRmlsZVBhdHRlcm4pXSk7XG4gICAgICB9XG4gICAgICBpZiAoY29uZmlnLmRvZXNDb250YWluUG9ldHJ5TG9jayB8fCBjb25maWcuZG9lc0NvbnRhaW5VdkxvY2spIHtcbiAgICAgICAgc2V0dGluZ3MgPSBtZXJnZS5hbGwoW3NldHRpbmdzLCBleGNsdWRlU2V0dGluZygnKiovLnZlbnYvKionKV0pO1xuICAgICAgfVxuICAgICAgaWYgKGNvbmZpZy5kZXBlbmRpbmcubmV4dCkge1xuICAgICAgICBzZXR0aW5ncyA9IG1lcmdlLmFsbChbc2V0dGluZ3MsIGV4Y2x1ZGVTZXR0aW5nKCcqKi8ubmV4dC8qKicpXSk7XG4gICAgICB9XG4gICAgICAvLyBMTE3jgavjgojjgot2aWJlIGNvZGluZ+OBp+OBr+OAgeiHquWLleODleOCqeODvOODnuODg+ODiOOChOOCs+ODvOODieOCouOCr+OCt+ODp+ODs+OCkueEoeWKueWMluOBmeOCi+OBk+OBqOOBp1xuICAgICAgLy8g55Sf5oiQ44GV44KM44Gf44Kz44O844OJ44Gu5YWD44Gu5b2i5byP44KS57at5oyB44Gn44GN44KLXG4gICAgICBpZiAoJ2VkaXRvci5jb2RlQWN0aW9uc09uU2F2ZScgaW4gc2V0dGluZ3MpIHtcbiAgICAgICAgZGVsZXRlIHNldHRpbmdzWydlZGl0b3IuY29kZUFjdGlvbnNPblNhdmUnXTtcbiAgICAgIH1cbiAgICAgIGlmICgnZWRpdG9yLmZvcm1hdE9uU2F2ZScgaW4gc2V0dGluZ3MpIHtcbiAgICAgICAgZGVsZXRlIHNldHRpbmdzWydlZGl0b3IuZm9ybWF0T25TYXZlJ107XG4gICAgICB9XG4gICAgICBzb3J0S2V5cyhzZXR0aW5ncyBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPik7XG4gICAgICBjb25zdCBuZXdDb250ZW50ID0gSlNPTi5zdHJpbmdpZnkoc2V0dGluZ3MsIHVuZGVmaW5lZCwgMik7XG4gICAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnNVdGlsLmdlbmVyYXRlRmlsZShmaWxlUGF0aCwgbmV3Q29udGVudCkpO1xuICAgIH0gY2F0Y2gge1xuICAgICAgLy8gZG8gbm90aGluZ1xuICAgIH1cbiAgfSk7XG59XG5cbmZ1bmN0aW9uIGV4Y2x1ZGVTZXR0aW5nKGV4Y2x1ZGVGaWxlUGF0dGVybjogc3RyaW5nKTogb2JqZWN0IHtcbiAgcmV0dXJuIHtcbiAgICAnZmlsZXMud2F0Y2hlckV4Y2x1ZGUnOiB7XG4gICAgICBbZXhjbHVkZUZpbGVQYXR0ZXJuXTogdHJ1ZSxcbiAgICB9LFxuICB9O1xufVxuIiwiLy8gb3hsaW50LWRpc2FibGUgZXNsaW50LXBsdWdpbi1pbXBvcnQvbm8tbmFtZWQtYXMtZGVmYXVsdC1tZW1iZXIgLS0gTmFtZXNwYWNlIFlBTUwgY2FsbHMgbWFrZSBsb2FkL2R1bXAgdXNhZ2UgY2xlYXJlci5cbmltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB0eXBlIHsgQ29uZmlndXJhdGlvblZhbHVlTWFwIH0gZnJvbSAnQHlhcm5wa2cvY29yZSc7XG5pbXBvcnQgeWFtbCBmcm9tICdqcy15YW1sJztcbmltcG9ydCBzZW12ZXIgZnJvbSAnc2VtdmVyJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgcHJvbWlzZVBvb2wgfSBmcm9tICcuLi91dGlscy9wcm9taXNlUG9vbC5qcyc7XG5pbXBvcnQgeyBzcGF3blN5bmMsIHNwYXduU3luY0FuZFJldHVyblN0ZG91dCB9IGZyb20gJy4uL3V0aWxzL3NwYXduVXRpbC5qcyc7XG5cbnR5cGUgU2V0dGluZ3MgPSB7XG4gIGFwcHJvdmVkR2l0UmVwb3NpdG9yaWVzPzogc3RyaW5nW107XG4gIGRlZmF1bHRTZW12ZXJSYW5nZVByZWZpeDogc3RyaW5nO1xuICBubU1vZGU6IHN0cmluZztcbiAgbm9kZUxpbmtlcjogc3RyaW5nO1xuICBucG1NaW5pbWFsQWdlR2F0ZT86IHN0cmluZztcbiAgbnBtUHJlYXBwcm92ZWRQYWNrYWdlcz86IHN0cmluZ1tdO1xuICBwbHVnaW5zPzogUGx1Z2luW107XG59ICYgUGFydGlhbDxDb25maWd1cmF0aW9uVmFsdWVNYXA+O1xuXG5pbnRlcmZhY2UgUGx1Z2luIHtcbiAgY2hlY2tzdW06IHN0cmluZztcbiAgcGF0aDogc3RyaW5nO1xuICBzcGVjOiBzdHJpbmc7XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZW5lcmF0ZVlhcm5yY1ltbChjb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdnZW5lcmF0ZVlhcm5yY1ltbCcsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCB5YXJucmNZbWxQYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnLnlhcm5yYy55bWwnKTtcbiAgICBpZiAoY29uZmlnLmlzQnVuKSB7XG4gICAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnMucHJvbWlzZXMucm0oeWFybnJjWW1sUGF0aCwgeyBmb3JjZTogdHJ1ZSB9KSk7XG4gICAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT5cbiAgICAgICAgZnMucHJvbWlzZXMucm0ocGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnLnlhcm4nKSwgeyBmb3JjZTogdHJ1ZSwgcmVjdXJzaXZlOiB0cnVlIH0pXG4gICAgICApO1xuICAgICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+XG4gICAgICAgIGZzLnByb21pc2VzLnJtKHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJ3lhcm4ubG9jaycpLCB7IGZvcmNlOiB0cnVlLCByZWN1cnNpdmU6IHRydWUgfSlcbiAgICAgICk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgY3VycmVudFZlcnNpb24gPSBzcGF3blN5bmNBbmRSZXR1cm5TdGRvdXQoJ3lhcm4nLCBbJy0tdmVyc2lvbiddLCBjb25maWcuZGlyUGF0aCk7XG4gICAgY29uc3QgbGF0ZXN0VmVyc2lvbiA9IGdldExhdGVzdFZlcnNpb24oJ0B5YXJucGtnL2NsaScsIGNvbmZpZy5kaXJQYXRoKTtcbiAgICBpZiAoaXNOZXdlclZlcnNpb24obGF0ZXN0VmVyc2lvbiwgY3VycmVudFZlcnNpb24pKSB7XG4gICAgICBzcGF3blN5bmMoJ3lhcm4nLCBbJ3NldCcsICd2ZXJzaW9uJywgbGF0ZXN0VmVyc2lvbl0sIGNvbmZpZy5kaXJQYXRoLCAxKTtcbiAgICB9XG5cbiAgICBjb25zdCByZWxlYXNlc1BhdGggPSBwYXRoLmpvaW4oY29uZmlnLmRpclBhdGgsICcueWFybicsICdyZWxlYXNlcycpO1xuICAgIGF3YWl0IGZzLnByb21pc2VzLm1rZGlyKHJlbGVhc2VzUGF0aCwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gICAgZm9yIChjb25zdCBmaWxlIG9mIGF3YWl0IGZzLnByb21pc2VzLnJlYWRkaXIocmVsZWFzZXNQYXRoKSkge1xuICAgICAgaWYgKGZpbGUuc3RhcnRzV2l0aCgneWFybi0nKSAmJiAhZmlsZS5zdGFydHNXaXRoKGB5YXJuLSR7bGF0ZXN0VmVyc2lvbn0uYCkpIHtcbiAgICAgICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzLnByb21pc2VzLnJtKHBhdGguam9pbihyZWxlYXNlc1BhdGgsIGZpbGUpKSk7XG4gICAgICAgIGNvbnNvbGUubG9nKCdSZW1vdmVkJywgcGF0aC5qb2luKHJlbGVhc2VzUGF0aCwgZmlsZSkpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IHlhcm5yY1BhdGggPSBwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICcueWFybnJjJyk7XG4gICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzLnByb21pc2VzLnJtKHlhcm5yY1BhdGgsIHsgZm9yY2U6IHRydWUgfSkpO1xuXG4gICAgbGV0IHNldHRpbmdzID0ge30gYXMgU2V0dGluZ3M7XG4gICAgdHJ5IHtcbiAgICAgIHNldHRpbmdzID0gKHlhbWwubG9hZChhd2FpdCBmcy5wcm9taXNlcy5yZWFkRmlsZSh5YXJucmNZbWxQYXRoLCAndXRmOCcpKSBhcyBTZXR0aW5ncyB8IHVuZGVmaW5lZCkgPz8gc2V0dGluZ3M7XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBkbyBub3RoaW5nXG4gICAgfVxuICAgIHNldHRpbmdzLmRlZmF1bHRTZW12ZXJSYW5nZVByZWZpeCA9ICcnO1xuICAgIHNldHRpbmdzLm5vZGVMaW5rZXIgPSAnbm9kZS1tb2R1bGVzJztcbiAgICBzZXR0aW5ncy5ubU1vZGUgPSAnaGFyZGxpbmtzLWdsb2JhbCc7XG4gICAgc2V0dGluZ3MubnBtTWluaW1hbEFnZUdhdGUgPSAnNWQnO1xuICAgIHNldHRpbmdzLmFwcHJvdmVkR2l0UmVwb3NpdG9yaWVzID0gW1xuICAgICAgLy8gWWFybiA0LjE0IGJsb2NrcyBnaXQgZGVwZW5kZW5jaWVzIHVubGVzcyB0aGUgcmVwb3NpdG9yeSBVUkwgaXMgZXhwbGljaXRseSBhbGxvd2VkLlxuICAgICAgJ2h0dHBzOi8vZ2l0aHViLmNvbS9XaWxsQm9vc3RlckxhYi8qLmdpdCcsXG4gICAgICAnc3NoOi8vZ2l0QGdpdGh1Yi5jb20vV2lsbEJvb3N0ZXJMYWIvKi5naXQnLFxuICAgIF07XG4gICAgc2V0dGluZ3MubnBtUHJlYXBwcm92ZWRQYWNrYWdlcyA9IFtcbiAgICAgIC8vIC0tLS0tLS0tLS0gU1RBUlQ6IFdlIGJlbGlldmUgb3VyIHBhY2thZ2VzIGFyZSBzYWZlIC0tLS0tLS0tLS1cbiAgICAgICdAZXhlcmNvZGUvKicsXG4gICAgICAnQHdpbGxib29zdGVyLyonLFxuICAgICAgJ2FnZW50LXJ1bnRpbWUta2l0JyxcbiAgICAgICdhdC1kZWNvcmF0b3JzJyxcbiAgICAgICdidWlsZC10cycsXG4gICAgICAnZ2VuLWkxOG4tdHMnLFxuICAgICAgJ29uZS13YXktZ2l0LXN5bmMnLFxuICAgICAgLy8gLS0tLS0tLS0tLSBFTkQ6IFdlIGJlbGlldmUgb3VyIHBhY2thZ2VzIGFyZSBzYWZlIC0tLS0tLS0tLS1cblxuICAgICAgLy8gVG8gZGVhbCB3aXRoIENWRSBsaWtlIGh0dHBzOi8vbmV4dGpzLm9yZy9ibG9nL0NWRS0yMDI1LTY2NDc4XG4gICAgICAnbmV4dCcsXG4gICAgICAnQG5leHQvKicsXG4gICAgICAnQHR5cGVzY3JpcHQvKicsXG4gICAgICAnQG94Zm10LyonLFxuICAgICAgJ0BveGxpbnQvKicsXG4gICAgICAnQG94bGludC10c2dvbGludC8qJyxcbiAgICAgICdveGZtdCcsXG4gICAgICAnb3hsaW50JyxcbiAgICAgICdveGxpbnQtdHNnb2xpbnQnLFxuICAgICAgJ3JlYWN0JyxcbiAgICAgICdyZWFjdC1kb20nLFxuICAgIF07XG4gICAgZGVsZXRlIHNldHRpbmdzLmNvbXByZXNzaW9uTGV2ZWw7XG4gICAgaWYgKHNldHRpbmdzLmluamVjdEVudmlyb25tZW50RmlsZXM/Lmxlbmd0aCA9PT0gMCkge1xuICAgICAgZGVsZXRlIHNldHRpbmdzLmluamVjdEVudmlyb25tZW50RmlsZXM7XG4gICAgfVxuICAgIC8vIGNmLiBodHRwczovL2dpdGh1Yi5jb20veWFybnBrZy9iZXJyeS9wdWxsLzQ2OThcbiAgICBzZXR0aW5ncy5lbmFibGVHbG9iYWxDYWNoZSA9IHRydWU7XG4gICAgY29uc3Qgb3JpZ2luYWxMZW5ndGggPSBzZXR0aW5ncy5wbHVnaW5zPy5sZW5ndGggPz8gMDtcbiAgICBzZXR0aW5ncy5wbHVnaW5zID0gc2V0dGluZ3MucGx1Z2lucz8uZmlsdGVyKChwKSA9PiBwLnBhdGggIT09ICcueWFybi9wbHVnaW5zL3VuZGVmaW5lZC5janMnKSA/PyBbXTtcbiAgICBpZiAoc2V0dGluZ3MucGx1Z2lucy5sZW5ndGggIT09IG9yaWdpbmFsTGVuZ3RoKSB7XG4gICAgICBjb25zdCBwbHVnaW5QYXRoID0gcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnLnlhcm4nLCAncGx1Z2lucycsICd1bmRlZmluZWQuY2pzJyk7XG4gICAgICBhd2FpdCBwcm9taXNlUG9vbC5ydW4oKCkgPT4gZnMucHJvbWlzZXMucm0ocGx1Z2luUGF0aCwgeyBmb3JjZTogdHJ1ZSB9KSk7XG4gICAgfVxuICAgIGlmIChzZXR0aW5ncy5wbHVnaW5zLmxlbmd0aCA9PT0gMCkge1xuICAgICAgZGVsZXRlIHNldHRpbmdzLnBsdWdpbnM7XG4gICAgfVxuICAgIGF3YWl0IGZzLnByb21pc2VzLndyaXRlRmlsZSh5YXJucmNZbWxQYXRoLCB5YW1sLmR1bXAoc2V0dGluZ3MsIHsgbGluZVdpZHRoOiAtMSB9KSk7XG5cbiAgICBzcGF3blN5bmMoJ3lhcm4nLCBbJ2RseCcsICd5YXJuLXBsdWdpbi1hdXRvLWluc3RhbGwnXSwgY29uZmlnLmRpclBhdGgpO1xuICAgIC8vIFRoZSB0YXJnZXQgcmVwbyBtYXkgbm90IGhhdmUgcHJldHRpZXIgaW5zdGFsbGVkIHlldCwgYW5kIHlhcm4tcGx1Z2luLWF1dG8taW5zdGFsbCBlZGl0cyB0aGlzIGZpbGUgYWZ0ZXIganMteWFtbC5cbiAgICBzcGF3blN5bmMoJ3lhcm4nLCBnZXRZYXJucmNQcmV0dGllckFyZ3MoY29uZmlnLmRpclBhdGgsIHlhcm5yY1ltbFBhdGgpLCBjb25maWcuZGlyUGF0aCk7XG4gIH0pO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0WWFybnJjUHJldHRpZXJBcmdzKGRpclBhdGg6IHN0cmluZywgeWFybnJjWW1sUGF0aDogc3RyaW5nKTogc3RyaW5nW10ge1xuICByZXR1cm4gWydkbHgnLCAncHJldHRpZXInLCAnLS1uby1jb25maWcnLCAnLS13cml0ZScsIHBhdGgucmVsYXRpdmUoZGlyUGF0aCwgeWFybnJjWW1sUGF0aCldO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0TGF0ZXN0VmVyc2lvbihwYWNrYWdlTmFtZTogc3RyaW5nLCBkaXJQYXRoOiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gc3Bhd25TeW5jQW5kUmV0dXJuU3Rkb3V0KCducG0nLCBbJ3Nob3cnLCBwYWNrYWdlTmFtZSwgJ3ZlcnNpb24nXSwgZGlyUGF0aCkgfHwgJzAuMC4wJztcbn1cblxuZnVuY3Rpb24gaXNOZXdlclZlcnNpb24obmV3VmVyc2lvbjogc3RyaW5nLCBvbGRWZXJzaW9uOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgY29uc3QgdmFsaWROZXdWZXJzaW9uID0gc2VtdmVyLnZhbGlkKG5ld1ZlcnNpb24pO1xuICBpZiAoIXZhbGlkTmV3VmVyc2lvbikgcmV0dXJuIGZhbHNlO1xuXG4gIHJldHVybiBzZW12ZXIuZ3QodmFsaWROZXdWZXJzaW9uLCBzZW12ZXIudmFsaWQob2xkVmVyc2lvbikgPz8gJzAuMC4wJyk7XG59XG4iLCJpbXBvcnQgdHlwZSB7IE9jdG9raXQgfSBmcm9tICdAb2N0b2tpdC9jb3JlJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZ2V0T2N0b2tpdCwgZ2l0SHViVXRpbCwgaGFzR2l0SHViVG9rZW4gfSBmcm9tICcuLi91dGlscy9naXRodWJVdGlsLmpzJztcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHNldHVwTGFiZWxzKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbG9nZ2VyLmZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24oJ3NldHVwTGFiZWxzJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IFtvd25lciwgcmVwb10gPSBnaXRIdWJVdGlsLmdldE9yZ0FuZE5hbWUoY29uZmlnLnJlcG9zaXRvcnkgPz8gJycpO1xuICAgIGlmICghb3duZXIgfHwgIXJlcG8pIHJldHVybjtcbiAgICBpZiAob3duZXIgIT09ICdXaWxsQm9vc3RlcicgJiYgb3duZXIgIT09ICdXaWxsQm9vc3RlckxhYicpIHJldHVybjtcbiAgICBpZiAoIWhhc0dpdEh1YlRva2VuKG93bmVyKSkgcmV0dXJuO1xuXG4gICAgY29uc3Qgb2N0b2tpdCA9IGdldE9jdG9raXQob3duZXIpO1xuXG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdkMTogeC1lYXN5IDpoZWRnZWhvZzonLCAnRURFOUZFJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAnZDI6IGVhc3kgOnJhYmJpdDI6JywgJ0RERDZGRScpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ2QzOiBtZWRpdW0gOm94OicsICdDNEI1RkQnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdkNDogaGFyZCA6c3F1aWQ6JywgJ0E3OEJGQScpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ2Q1OiB4LWhhcmQgOndoYWxlMjonLCAnOEI1Q0Y2Jyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAncDE6IGNyaXRpY2FsIDpmaXJlOjpmaXJlOjpmaXJlOicsICdFRjQ0NDQnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdwMjogdXJnZW50IDpmaXJlOjpmaXJlOicsICdGODcxNzEnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdwMzogaW1wb3J0YW50IDpmaXJlOicsICdGQ0E1QTUnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdwNDogbmljZSB0byBoYXZlIDpkcm9wbGV0OicsICdGRUNBQ0EnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdyOiBibGl0eicsICc1MzAwYmMnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdyOiBmaXJlYmFzZScsICdmZmNhMjgnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdyOiBwcmlzbWEnLCAnMGMzNDRiJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAncjogcmVhY3QnLCAnNjFkYWZiJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAncjogc3ZlbHRlJywgJ2ZmM2UwMCcpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ3I6IHNlbWFudGljLXJlbGVhc2UnLCAnNDk0OTQ5Jyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAncmVhZHkgOnJvY2tldDonLCAnMjJDNTVFJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAncmV2aWV3IHJlcXVlc3RlZCA6bWFnOicsICdGQkNBMDQnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdyZWxlYXNlZCA6Ym9va21hcms6JywgJzYzNjZGMScpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ3M6IDAuNWggOmNsb2NrMTIzMDonLCAnRjNGNEY2Jyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAnczogMWggOmNsb2NrMTonLCAnRTVFN0VCJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAnczogMmggOmNsb2NrMjonLCAnRDFENURCJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAnczogM2ggOmNsb2NrMzonLCAnOUNBM0FGJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAnczogNWggOmNsb2NrNTonLCAnNkI3MjgwJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAnczogOGggOmNsb2NrODonLCAnNEI1NTYzJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAnczogMTNoIDpjbG9jazE6JywgJzM3NDE1MScpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ3Q6IGJ1aWxkIDpoYW1tZXI6JywgJ0JGREJGRScpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ3Q6IGNob3JlIDpicm9vbTonLCAnQkZEQkZFJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAndDogY2kgOmNvbnN0cnVjdGlvbl93b3JrZXI6JywgJ0JGREJGRScpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ3Q6IGRvY3MgOm1lbW86JywgJ0JGREJGRScpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ3Q6IGZlYXQgOnNwYXJrbGVzOicsICdCRkRCRkUnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICd0OiBmaXggOmJ1ZzonLCAnQkZEQkZFJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAndDogcGVyZiA6emFwOicsICdCRkRCRkUnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICd0OiByZWZhY3RvciA6cmVjeWNsZTonLCAnQkZEQkZFJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAndDogc3R5bGUgOmxpcHN0aWNrOicsICdCRkRCRkUnKTtcbiAgICAgIGF3YWl0IHNldHVwTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICd0OiB0ZXN0IDp0ZXN0X3R1YmU6JywgJ0JGREJGRScpO1xuICAgICAgYXdhaXQgc2V0dXBMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ3Byb2plY3QnLCAnMjQyOTJGJyk7XG4gICAgICBhd2FpdCBzZXR1cExhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAnZm9jdXNlZCA6ZGFydDonLCAnMjJDNTVFJyk7XG5cbiAgICAgIGF3YWl0IGRlbGV0ZUxhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAnYnVnJyk7XG4gICAgICBhd2FpdCBkZWxldGVMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ2RvY3VtZW50YXRpb24nKTtcbiAgICAgIGF3YWl0IGRlbGV0ZUxhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAnZHVwbGljYXRlJyk7XG4gICAgICBhd2FpdCBkZWxldGVMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ2VuaGFuY2VtZW50Jyk7XG4gICAgICBhd2FpdCBkZWxldGVMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ2dvb2QgZmlyc3QgaXNzdWUnKTtcbiAgICAgIGF3YWl0IGRlbGV0ZUxhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAnaGVscCB3YW50ZWQnKTtcbiAgICAgIGF3YWl0IGRlbGV0ZUxhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAnaW52YWxpZCcpO1xuICAgICAgYXdhaXQgZGVsZXRlTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdxdWVzdGlvbicpO1xuICAgICAgYXdhaXQgZGVsZXRlTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICd3b250Zml4Jyk7XG5cbiAgICAgIGF3YWl0IGRlbGV0ZUxhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAncmVhZHknKTtcbiAgICAgIGF3YWl0IGRlbGV0ZUxhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAncmV2aWV3IHJlcXVlc3RlZCcpO1xuICAgICAgYXdhaXQgZGVsZXRlTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdyZWxlYXNlZCcpO1xuICAgICAgYXdhaXQgZGVsZXRlTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdzZW1hbnRpYy1yZWxlYXNlJyk7XG4gICAgICBhd2FpdCBkZWxldGVMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ2xsbS1wciA6cm9ib3Q6Jyk7XG4gICAgICBhd2FpdCBkZWxldGVMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ2FpLXByIDpyb2JvdDonKTtcbiAgICAgIGF3YWl0IGRlbGV0ZUxhYmVsKG9jdG9raXQsIG93bmVyLCByZXBvLCAnZ2VuLXByLWFsbCA6cm9ib3Q6Jyk7XG4gICAgICBhd2FpdCBkZWxldGVMYWJlbChvY3Rva2l0LCBvd25lciwgcmVwbywgJ2dlbi1wci1jbGF1ZGUgOnJvYm90OicpO1xuICAgICAgYXdhaXQgZGVsZXRlTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdnZW4tcHItY29kZXggOnJvYm90OicpO1xuICAgICAgYXdhaXQgZGVsZXRlTGFiZWwob2N0b2tpdCwgb3duZXIsIHJlcG8sICdnZW4tcHItZ2VtaW5pIDpyb2JvdDonKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgY29uc29sZS53YXJuKCdTa2lwIHNldHVwTGFiZWxzIGR1ZSB0bzonLCAoZXJyb3IgYXMgRXJyb3IgfCB1bmRlZmluZWQpPy5zdGFjayA/PyBlcnJvcik7XG4gICAgfVxuICB9KTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gc2V0dXBMYWJlbChvY3Rva2l0OiBPY3Rva2l0LCBvd25lcjogc3RyaW5nLCByZXBvOiBzdHJpbmcsIG5hbWU6IHN0cmluZywgY29sb3I6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICB0cnkge1xuICAgIC8vIElzc3VlcyBwZXJtaXNzaW9uXG4gICAgYXdhaXQgb2N0b2tpdC5yZXF1ZXN0KCdQT1NUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9sYWJlbHMnLCB7XG4gICAgICBvd25lcixcbiAgICAgIHJlcG8sXG4gICAgICBuYW1lLFxuICAgICAgY29sb3IsXG4gICAgfSk7XG4gIH0gY2F0Y2gge1xuICAgIC8vIElzc3VlcyBwZXJtaXNzaW9uXG4gICAgYXdhaXQgb2N0b2tpdC5yZXF1ZXN0KCdQQVRDSCAvcmVwb3Mve293bmVyfS97cmVwb30vbGFiZWxzL3tuYW1lfScsIHtcbiAgICAgIG93bmVyLFxuICAgICAgcmVwbyxcbiAgICAgIG5hbWUsXG4gICAgICBjb2xvcixcbiAgICB9KTtcbiAgfVxufVxuXG5hc3luYyBmdW5jdGlvbiBkZWxldGVMYWJlbChvY3Rva2l0OiBPY3Rva2l0LCBvd25lcjogc3RyaW5nLCByZXBvOiBzdHJpbmcsIG5hbWU6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICB0cnkge1xuICAgIC8vIElzc3VlcyBwZXJtaXNzaW9uXG4gICAgYXdhaXQgb2N0b2tpdC5yZXF1ZXN0KCdERUxFVEUgL3JlcG9zL3tvd25lcn0ve3JlcG99L2xhYmVscy97bmFtZX0nLCB7XG4gICAgICBvd25lcixcbiAgICAgIHJlcG8sXG4gICAgICBuYW1lLFxuICAgIH0pO1xuICB9IGNhdGNoIHtcbiAgICAvLyBkbyBub3RoaW5nXG4gIH1cbn1cbiIsImltcG9ydCB7IGNyZWF0ZVJlcXVpcmUgfSBmcm9tICdub2RlOm1vZHVsZSc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgZG90ZW52IGZyb20gJ2RvdGVudic7XG5pbXBvcnQgdHlwZSBzb2RpdW1Nb2R1bGUgZnJvbSAnbGlic29kaXVtLXdyYXBwZXJzJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB7IG9wdGlvbnMgfSBmcm9tICcuLi9vcHRpb25zLmpzJztcbmltcG9ydCB0eXBlIHsgUGFja2FnZUNvbmZpZyB9IGZyb20gJy4uL3BhY2thZ2VDb25maWcuanMnO1xuaW1wb3J0IHsgZ2V0T2N0b2tpdCwgZ2l0SHViVXRpbCwgaGFzR2l0SHViVG9rZW4gfSBmcm9tICcuLi91dGlscy9naXRodWJVdGlsLmpzJztcblxuY29uc3QgREVQUkVDQVRFRF9TRUNSRVRfTkFNRVMgPSBbJ1JFQURZX0RJU0NPUkRfV0VCSE9PS19VUkwnLCAnR0hfQk9UX1BBVCcsICdQVUJMSUNfR0hfQk9UX1BBVCddO1xuY29uc3QgcmVxdWlyZSA9IGNyZWF0ZVJlcXVpcmUoaW1wb3J0Lm1ldGEudXJsKTtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHNldHVwU2VjcmV0cyhjb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdzZXR1cFNlY3JldHMnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgW293bmVyLCByZXBvXSA9IGdpdEh1YlV0aWwuZ2V0T3JnQW5kTmFtZShjb25maWcucmVwb3NpdG9yeSA/PyAnJyk7XG4gICAgaWYgKCFvd25lciB8fCAhcmVwbyB8fCBvd25lciAhPT0gJ1dpbGxCb29zdGVyTGFiJykgcmV0dXJuO1xuICAgIGlmICghaGFzR2l0SHViVG9rZW4ob3duZXIpIHx8ICFvcHRpb25zLmRvZXNVcGxvYWRFbnZWYXJzKSByZXR1cm47XG5cbiAgICBjb25zdCBwYXJzZWQgPSBkb3RlbnYuY29uZmlnKHsgcGF0aDogcGF0aC5yZXNvbHZlKGNvbmZpZy5kaXJQYXRoLCAnLmVudicpLCBxdWlldDogdHJ1ZSB9KS5wYXJzZWQgPz8ge307XG4gICAgaWYgKE9iamVjdC5rZXlzKHBhcnNlZCkubGVuZ3RoID09PSAwKSByZXR1cm47XG5cbiAgICBjb25zdCBvY3Rva2l0ID0gZ2V0T2N0b2tpdChvd25lcik7XG5cbiAgICB0cnkge1xuICAgICAgZm9yIChjb25zdCBzZWNyZXROYW1lIG9mIERFUFJFQ0FURURfU0VDUkVUX05BTUVTKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgLy8gUmVxdWlyZXMgU2VjcmV0cyBwZXJtaXNzaW9uXG4gICAgICAgICAgYXdhaXQgb2N0b2tpdC5yZXF1ZXN0KCdERUxFVEUgL3JlcG9zL3tvd25lcn0ve3JlcG99L2FjdGlvbnMvc2VjcmV0cy97c2VjcmV0X25hbWV9Jywge1xuICAgICAgICAgICAgb3duZXIsXG4gICAgICAgICAgICByZXBvLFxuICAgICAgICAgICAgc2VjcmV0X25hbWU6IHNlY3JldE5hbWUsXG4gICAgICAgICAgfSk7XG4gICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgIC8vIGRvIG5vdGhpbmdcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBSZXF1aXJlcyBTZWNyZXRzIHBlcm1pc3Npb25cbiAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgb2N0b2tpdC5yZXF1ZXN0KCdHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2FjdGlvbnMvc2VjcmV0cy9wdWJsaWMta2V5Jywge1xuICAgICAgICBvd25lcixcbiAgICAgICAgcmVwbyxcbiAgICAgIH0pO1xuICAgICAgY29uc3QgeyBrZXksIGtleV9pZDoga2V5SWQgfSA9IHJlc3BvbnNlLmRhdGE7XG5cbiAgICAgIGNvbnN0IHNvZGl1bSA9IGdldFNvZGl1bSgpO1xuICAgICAgYXdhaXQgc29kaXVtLnJlYWR5O1xuXG4gICAgICBmb3IgKGNvbnN0IFtuYW1lLCBzZWNyZXRdIG9mIE9iamVjdC5lbnRyaWVzKHBhcnNlZCkpIHtcbiAgICAgICAgaWYgKFxuICAgICAgICAgIG5hbWUgPT09ICdHSF9CT1RfUEFUJyB8fFxuICAgICAgICAgIG5hbWUgPT09ICdHSF9CT1RfUEFUX0ZPUl9XSUxMQk9PU1RFUicgfHxcbiAgICAgICAgICBuYW1lID09PSAnR0hfQk9UX1BBVF9GT1JfV0lMTEJPT1NURVJMQUInXG4gICAgICAgICkge1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gQ29udmVydCBTZWNyZXQgJiBCYXNlNjQga2V5IHRvIFVpbnQ4QXJyYXkuXG4gICAgICAgIGNvbnN0IHJhd0tleSA9IHNvZGl1bS5mcm9tX2Jhc2U2NChrZXksIHNvZGl1bS5iYXNlNjRfdmFyaWFudHMuT1JJR0lOQUwpO1xuICAgICAgICBjb25zdCByYXdTZWMgPSBzb2RpdW0uZnJvbV9zdHJpbmcoc2VjcmV0KTtcblxuICAgICAgICAvLyBFbmNyeXB0IHRoZSBzZWNyZXQgdXNpbmcgTGliU29kaXVtXG4gICAgICAgIGNvbnN0IGVuY0J5dGVzID0gc29kaXVtLmNyeXB0b19ib3hfc2VhbChyYXdTZWMsIHJhd0tleSk7XG5cbiAgICAgICAgLy8gQ29udmVydCBlbmNyeXB0ZWQgVWludDhBcnJheSB0byBCYXNlNjRcbiAgICAgICAgY29uc3QgZW5jQmFzZTY0ID0gc29kaXVtLnRvX2Jhc2U2NChlbmNCeXRlcywgc29kaXVtLmJhc2U2NF92YXJpYW50cy5PUklHSU5BTCk7XG5cbiAgICAgICAgLy8gUmVxdWlyZXMgU2VjcmV0cyBwZXJtaXNzaW9uXG4gICAgICAgIGF3YWl0IG9jdG9raXQucmVxdWVzdCgnUFVUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9hY3Rpb25zL3NlY3JldHMve3NlY3JldF9uYW1lfScsIHtcbiAgICAgICAgICBvd25lcixcbiAgICAgICAgICByZXBvLFxuICAgICAgICAgIHNlY3JldF9uYW1lOiBuYW1lLFxuICAgICAgICAgIGVuY3J5cHRlZF92YWx1ZTogZW5jQmFzZTY0LFxuICAgICAgICAgIGtleV9pZDoga2V5SWQsXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBjb25zb2xlLndhcm4oJ1NraXAgc2V0dXBTZWNyZXRzIGR1ZSB0bzonLCAoZXJyb3IgYXMgRXJyb3IgfCB1bmRlZmluZWQpPy5zdGFjayA/PyBlcnJvcik7XG4gICAgfVxuICB9KTtcbn1cblxuZnVuY3Rpb24gZ2V0U29kaXVtKCk6IHR5cGVvZiBzb2RpdW1Nb2R1bGUge1xuICAvLyBsaWJzb2RpdW0td3JhcHBlcnMnIEVTTSBlbnRyeSBjYW4gYmluZCB0byBsaWJzb2RpdW1AMC44LjMsIHdob3NlIGRlZmF1bHRcbiAgLy8gZXhwb3J0IG5vIGxvbmdlciBleHBvc2VzIHJlYWR5LiBUaGUgQ29tbW9uSlMgZW50cnkga2VlcHMgdGhlIEFQSSBzaGFwZS5cbiAgcmV0dXJuIHJlcXVpcmUoJ2xpYnNvZGl1bS13cmFwcGVycycpIGFzIHR5cGVvZiBzb2RpdW1Nb2R1bGU7XG59XG4iLCJpbXBvcnQgeyB3aXRoUmV0cnkgfSBmcm9tICdAd2lsbGJvb3N0ZXIvc2hhcmVkLWxpYi9zcmMnO1xuXG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGdldE9jdG9raXQsIGdpdEh1YlV0aWwsIGhhc0dpdEh1YlRva2VuIH0gZnJvbSAnLi4vdXRpbHMvZ2l0aHViVXRpbC5qcyc7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBzZXR1cEdpdEh1YlNldHRpbmdzKGNvbmZpZzogUGFja2FnZUNvbmZpZyk6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBbb3duZXIsIHJlcG9dID0gZ2l0SHViVXRpbC5nZXRPcmdBbmROYW1lKGNvbmZpZy5yZXBvc2l0b3J5ID8/ICcnKTtcbiAgaWYgKCFvd25lciB8fCAhcmVwbykgcmV0dXJuO1xuICBpZiAob3duZXIgIT09ICdXaWxsQm9vc3RlcicgJiYgb3duZXIgIT09ICdXaWxsQm9vc3RlckxhYicpIHJldHVybjtcbiAgaWYgKCFoYXNHaXRIdWJUb2tlbihvd25lcikpIHJldHVybjtcblxuICBjb25zdCBvY3Rva2l0ID0gZ2V0T2N0b2tpdChvd25lcik7XG5cbiAgLy8gQWRtaW5pc3RyYXRpb24gcGVybWlzc2lvblxuICBhd2FpdCB3aXRoUmV0cnkoKCkgPT5cbiAgICBvY3Rva2l0LnJlcXVlc3QoJ1BBVENIIC9yZXBvcy97b3duZXJ9L3tyZXBvfScsIHtcbiAgICAgIG93bmVyLFxuICAgICAgcmVwbyxcbiAgICAgIGFsbG93X2F1dG9fbWVyZ2U6IHRydWUsXG4gICAgICBhbGxvd19tZXJnZV9jb21taXQ6IGZhbHNlLFxuICAgICAgYWxsb3dfc3F1YXNoX21lcmdlOiB0cnVlLFxuICAgICAgYWxsb3dfcmViYXNlX21lcmdlOiBmYWxzZSxcbiAgICAgIGFsbG93X3VwZGF0ZV9icmFuY2g6IHRydWUsXG4gICAgICBkZWxldGVfYnJhbmNoX29uX21lcmdlOiB0cnVlLFxuICAgICAgc3F1YXNoX21lcmdlX2NvbW1pdF90aXRsZTogJ1BSX1RJVExFJyxcbiAgICAgIHNxdWFzaF9tZXJnZV9jb21taXRfbWVzc2FnZTogJ0JMQU5LJyxcbiAgICAgIGhlYWRlcnM6IHtcbiAgICAgICAgJ1gtR2l0SHViLUFwaS1WZXJzaW9uJzogJzIwMjItMTEtMjgnLFxuICAgICAgfSxcbiAgICAgIC4uLihjb25maWcucmVwb3NpdG9yeT8uc3RhcnRzV2l0aCgnZ2l0aHViOldpbGxCb29zdGVyLycpID8geyBhbGxvd19hdXRvX21lcmdlOiB0cnVlIH0gOiB7fSksXG4gICAgfSlcbiAgKTtcbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB7IGRpc3RhbmNlIH0gZnJvbSAnZmFzdGVzdC1sZXZlbnNodGVpbic7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VDb25maWcgfSBmcm9tICcuLi9wYWNrYWdlQ29uZmlnLmpzJztcbmltcG9ydCB7IGZzVXRpbCB9IGZyb20gJy4uL3V0aWxzL2ZzVXRpbC5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4uL3V0aWxzL3Byb21pc2VQb29sLmpzJztcblxuY29uc3QgcGFja2FnZU1hbmFnZXJSdW5QbGFjZWhvbGRlciA9ICdfX1BNX1JVTl9fJztcblxuY29uc3QgdGVtcGxhdGVzID0ge1xuICAncHVsbF9yZXF1ZXN0X3RlbXBsYXRlLm1kJzogYFxuQ2xvc2UgIzxJc3N1ZU51bWJlcj5cblxuIyMgU2VsZiBDaGVja1xuXG4tIFsgXSBJJ3ZlIGNvbmZpcm1lZCBcXGBBbGwgY2hlY2tzIGhhdmUgcGFzc2VkXFxgIG9uIHRoaXMgcGFnZS5cbiAgLSBQUiB0aXRsZSBmb2xsb3dzIFtBbmd1bGFyJ3MgY29tbWl0IG1lc3NhZ2UgZm9ybWF0XShodHRwczovL2dpdGh1Yi5jb20vYW5ndWxhci9hbmd1bGFyL2Jsb2IvbWFpbi9DT05UUklCVVRJTkcubWQjLWNvbW1pdC1tZXNzYWdlLWZvcm1hdCkuXG4gIC0gUFIgdGl0bGUgZG9lc24ndCBoYXZlIFxcYFdJUDpcXGAuXG4gIC0gVGhlIHRlc3QgY29tbWFuZCAoZS5nLiwgXFxgJHtwYWNrYWdlTWFuYWdlclJ1blBsYWNlaG9sZGVyfSB0ZXN0XFxgKSBwYXNzZWQuXG4gIC0gVGhlIGxpbnQgY29tbWFuZCAoZS5nLiwgXFxgJHtwYWNrYWdlTWFuYWdlclJ1blBsYWNlaG9sZGVyfSBsaW50XFxgKSBwYXNzZWQuXG4gIC0gWW91IG1heSBsZWF2ZSB0aGlzIGJveCB1bmNoZWNrZWQgZHVlIHRvIGxvbmcgd29ya2Zsb3dzLlxuLSBbIF0gSSd2ZSByZXZpZXdlZCBteSBjaGFuZ2VzIG9uIHRoZSBHaXRIdWIgZGlmZiB2aWV3LlxuLSBbIF0gSSd2ZSB3cml0dGVuIHRoZSBzdGVwcyB0byB0ZXN0IG15IGNoYW5nZXMuXG4tIFsgXSBJJ3ZlIGFkZGVkIHNjcmVlbnNob3RzIChpZiB0aGUgVUkgY2hhbmdlZCkuXG4gIC0gWW91IG1heSBsZWF2ZSB0aGlzIGJveCB1bmNoZWNrZWQgaWYgeW91IGRpZG4ndCBtb2RpZnkgdGhlIFVJLlxuXG48IS0tIFBsZWFzZSBhZGQgc2NyZWVuc2hvdHMgaWYgeW91IG1vZGlmeSB0aGUgVUkuXG58IEN1cnJlbnQgICAgICAgICAgICAgICAgICB8IEluIGNvbWluZyAgICAgICAgICAgICAgICB8XG58IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8XG58IDxpbWcgc3JjPVwiXCIgd2lkdGg9XCI0MDBcIj4gfCA8aW1nIHNyYz1cIlwiIHdpZHRoPVwiNDAwXCI+IHxcbi0tPlxuXG48IS0tIFBsZWFzZSBhZGQgc3RlcHMgdG8gdGVzdCB5b3VyIGNoYW5nZXMuXG4jIyBTdGVwcyB0byBUZXN0XG5cbjEuIE9wZW4gaHR0cDovL2xvY2FsaG9zdC1leGVyY29kZS53aWxsYm9vc3Rlci5uZXQ6MzAwMC9qYS1KUC9jb3Vyc2VzL19leGFtcGxlL2xlc3NvbnMvX2V4YW1wbGVfYV9wbHVzX2IvcHJvYmxlbXMvX2V4YW1wbGVfYV9wbHVzX2IgYWZ0ZXIgbG9naW4uXG4yLiBTZWxlY3QgdGhlIGxhbmd1YWdlIFxcYENcXGAuXG4zLiBXcml0ZSB0aGUgZm9sbG93aW5nIGNvZGU6XG4gICBcXGBcXGBcXGBjXG4gICAjaW5jbHVkZSA8c3RkaW8uaD5cblxuICAgaW50IG1haW4odm9pZCkge1xuICAgICBpbnQgYSwgYjtcblxuICAgICBzY2FuZihcIiVkICVkXCIsICZhLCAmYik7XG4gICAgIHByaW50ZihcIiVkXCIsIGEgKyBiKTtcbiAgICAgcmV0dXJuIDA7XG4gICB9XG4gICBcXGBcXGBcXGBcbjQuIFB1c2ggXFxgU3VibWl0XFxgIGJ1dHRvbi5cbjUuIC4uLlxuLS0+XG5gLnRyaW0oKSxcbn07XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZW5lcmF0ZUdpdEh1YlRlbXBsYXRlcyhjb25maWc6IFBhY2thZ2VDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdnZW5lcmF0ZUdpdEh1YlRlbXBsYXRlcycsIGFzeW5jICgpID0+IHtcbiAgICBpZiAoIWNvbmZpZy5pc1dpbGxCb29zdGVyUmVwbykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGZvciAoY29uc3QgW2ZpbGVOYW1lLCBuZXdDb250ZW50XSBvZiBPYmplY3QuZW50cmllcyh0ZW1wbGF0ZXMpKSB7XG4gICAgICBjb25zdCBjb250ZW50ID0gYXBwbHlQYWNrYWdlTWFuYWdlclRlbXBsYXRlKG5ld0NvbnRlbnQsIGNvbmZpZyk7XG4gICAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShjb25maWcuZGlyUGF0aCwgJy5naXRodWInLCBmaWxlTmFtZSk7XG4gICAgICBpZiAoZnMuZXhpc3RzU3luYyhmaWxlUGF0aCkpIHtcbiAgICAgICAgY29uc3Qgb2xkQ29udGVudCA9IGF3YWl0IGZzLnByb21pc2VzLnJlYWRGaWxlKGZpbGVQYXRoLCAndXRmOCcpO1xuICAgICAgICBpZiAoZGlzdGFuY2Uob2xkQ29udGVudCwgY29udGVudCkgPiBjb250ZW50Lmxlbmd0aCAvIDIpIHtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBhd2FpdCBmcy5wcm9taXNlcy5ta2RpcihwYXRoLnJlc29sdmUoY29uZmlnLmRpclBhdGgsICcuZ2l0aHViJyksIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICAgICAgYXdhaXQgcHJvbWlzZVBvb2wucnVuKCgpID0+IGZzVXRpbC5nZW5lcmF0ZUZpbGUoZmlsZVBhdGgsIGNvbnRlbnQpKTtcbiAgICB9XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBhcHBseVBhY2thZ2VNYW5hZ2VyVGVtcGxhdGUodGVtcGxhdGU6IHN0cmluZywgY29uZmlnOiBQYWNrYWdlQ29uZmlnKTogc3RyaW5nIHtcbiAgY29uc3QgcGFja2FnZU1hbmFnZXJDb21tYW5kID0gY29uZmlnLmlzQnVuID8gJ2J1biBydW4nIDogJ3lhcm4nO1xuICByZXR1cm4gdGVtcGxhdGUucmVwbGFjZUFsbChwYWNrYWdlTWFuYWdlclJ1blBsYWNlaG9sZGVyLCBwYWNrYWdlTWFuYWdlckNvbW1hbmQpO1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IGZzcCBmcm9tICdub2RlOmZzL3Byb21pc2VzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCBmZyBmcm9tICdmYXN0LWdsb2InO1xuaW1wb3J0IHsgc2ltcGxlR2l0IH0gZnJvbSAnc2ltcGxlLWdpdCc7XG5pbXBvcnQgdG9tbCBmcm9tICdzbW9sLXRvbWwnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlSnNvbiB9IGZyb20gJ3R5cGUtZmVzdCc7XG5pbXBvcnQgeyB6IH0gZnJvbSAnem9kJztcblxuaW1wb3J0IHsgZ2V0T2N0b2tpdCwgZ2l0SHViVXRpbCB9IGZyb20gJy4vdXRpbHMvZ2l0aHViVXRpbC5qcyc7XG5pbXBvcnQgeyBnbG9iSWdub3JlIH0gZnJvbSAnLi91dGlscy9nbG9iVXRpbC5qcyc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgUGFja2FnZUNvbmZpZyB7XG4gIGRpclBhdGg6IHN0cmluZztcbiAgZG9ja2VyZmlsZTogc3RyaW5nO1xuICBpc1Jvb3Q6IGJvb2xlYW47XG4gIGlzUHVibGljUmVwbzogYm9vbGVhbjtcbiAgaXNSZWZlcnJlZEJ5T3RoZXJSZXBvOiBib29sZWFuO1xuICByZXBvc2l0b3J5Pzogc3RyaW5nO1xuICByZXBvQXV0aG9yPzogc3RyaW5nO1xuICByZXBvTmFtZT86IHN0cmluZztcbiAgaXNXaWxsQm9vc3RlclJlcG86IGJvb2xlYW47XG4gIGlzQnVuOiBib29sZWFuO1xuICBpc0VzbVBhY2thZ2U6IGJvb2xlYW47XG4gIGlzV2lsbEJvb3N0ZXJDb25maWdzOiBib29sZWFuO1xuICAvLyBkZXBlbmRlbmN5IGluZm9ybWF0aW9uXG4gIGRvZXNDb250YWluU3ViUGFja2FnZUpzb25zOiBib29sZWFuO1xuICBkb2VzQ29udGFpbkRvY2tlcmZpbGU6IGJvb2xlYW47XG4gIGRvZXNDb250YWluR2VtZmlsZTogYm9vbGVhbjtcbiAgZG9lc0NvbnRhaW5Hb01vZDogYm9vbGVhbjtcbiAgZG9lc0NvbnRhaW5QYWNrYWdlSnNvbjogYm9vbGVhbjtcbiAgZG9lc0NvbnRhaW5Qb2V0cnlMb2NrOiBib29sZWFuO1xuICBkb2VzQ29udGFpblV2TG9jazogYm9vbGVhbjtcbiAgZG9lc0NvbnRhaW5Qb21YbWw6IGJvb2xlYW47XG4gIGRvZXNDb250YWluUHVic3BlY1lhbWw6IGJvb2xlYW47XG4gIGRvZXNDb250YWluVGVtcGxhdGVZYW1sOiBib29sZWFuO1xuICBkb2VzQ29udGFpblZzY29kZVNldHRpbmdzSnNvbjogYm9vbGVhbjtcbiAgLy8gc291cmNlIGNvZGUgZmlsZXNcbiAgZG9lc0NvbnRhaW5KYXZhU2NyaXB0OiBib29sZWFuO1xuICBkb2VzQ29udGFpblR5cGVTY3JpcHQ6IGJvb2xlYW47XG4gIGRvZXNDb250YWluSnN4T3JUc3g6IGJvb2xlYW47XG4gIGRvZXNDb250YWluSmF2YTogYm9vbGVhbjtcbiAgZG9lc0NvbnRhaW5KYXZhU2NyaXB0SW5QYWNrYWdlczogYm9vbGVhbjtcbiAgZG9lc0NvbnRhaW5UeXBlU2NyaXB0SW5QYWNrYWdlczogYm9vbGVhbjtcbiAgZG9lc0NvbnRhaW5Kc3hPclRzeEluUGFja2FnZXM6IGJvb2xlYW47XG4gIGRvZXNDb250YWluSmF2YUluUGFja2FnZXM6IGJvb2xlYW47XG5cbiAgZGVwZW5kaW5nOiB7XG4gICAgYmxpdHo6IGJvb2xlYW47XG4gICAgZmlyZWJhc2U6IGJvb2xlYW47XG4gICAgZ2VuSTE4blRzOiBib29sZWFuO1xuICAgIGxpdGVzdHJlYW06IGJvb2xlYW47XG4gICAgbmV4dDogYm9vbGVhbjtcbiAgICBwbGF5d3JpZ2h0VGVzdDogYm9vbGVhbjtcbiAgICBwcmlzbWE6IGJvb2xlYW47XG4gICAgcHlyaWdodDogYm9vbGVhbjtcbiAgICByZWFjdDogYm9vbGVhbjtcbiAgICByZWFjdE5hdGl2ZTogYm9vbGVhbjtcbiAgICBzZW1hbnRpY1JlbGVhc2U6IGJvb2xlYW47XG4gICAgc3Rvcnlib29rOiBib29sZWFuO1xuICAgIHdiOiBib29sZWFuO1xuICB9O1xuICByZWxlYXNlOiB7XG4gICAgYnJhbmNoZXM6IHN0cmluZ1tdO1xuICAgIGdpdGh1YjogYm9vbGVhbjtcbiAgICBucG06IGJvb2xlYW47XG4gIH07XG4gIGhhc1ZlcnNpb25TZXR0aW5nczogYm9vbGVhbjtcbiAgbWlzZVRhc2tzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+O1xuICBwYWNrYWdlSnNvbj86IFBhY2thZ2VKc29uO1xuICB3YmZ5SnNvbj86IFdiZnlKc29uO1xufVxuXG50eXBlIFdiZnlKc29uID0gei5pbmZlcjx0eXBlb2Ygd2JmeUpzb25TY2hlbWE+O1xuXG5jb25zdCB3YmZ5SnNvblNjaGVtYSA9IHoub2JqZWN0KHtcbiAgdHlwb3M6IHpcbiAgICAub2JqZWN0KHtcbiAgICAgIGFsbDogei5yZWNvcmQoei5zdHJpbmcoKSwgei5zdHJpbmcoKSkub3B0aW9uYWwoKSxcbiAgICAgIGRvYzogei5yZWNvcmQoei5zdHJpbmcoKSwgei5zdHJpbmcoKSkub3B0aW9uYWwoKSxcbiAgICAgIHRzOiB6LnJlY29yZCh6LnN0cmluZygpLCB6LnN0cmluZygpKS5vcHRpb25hbCgpLFxuICAgICAgdGV4dDogei5yZWNvcmQoei5zdHJpbmcoKSwgei5zdHJpbmcoKSkub3B0aW9uYWwoKSxcbiAgICB9KVxuICAgIC5vcHRpb25hbCgpLFxufSk7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZXRQYWNrYWdlQ29uZmlnKFxuICBkaXJQYXRoOiBzdHJpbmcsXG4gIHJvb3RDb25maWc/OiBQYWNrYWdlQ29uZmlnXG4pOiBQcm9taXNlPFBhY2thZ2VDb25maWcgfCB1bmRlZmluZWQ+IHtcbiAgY29uc3QgcGFja2FnZUpzb25QYXRoID0gcGF0aC5yZXNvbHZlKGRpclBhdGgsICdwYWNrYWdlLmpzb24nKTtcbiAgdHJ5IHtcbiAgICBjb25zdCBkb2VzQ29udGFpblBhY2thZ2VKc29uID0gZnMuZXhpc3RzU3luYyhwYWNrYWdlSnNvblBhdGgpO1xuICAgIGxldCBkZXBlbmRlbmNpZXM6IFBhY2thZ2VKc29uWydkZXBlbmRlbmNpZXMnXSA9IHt9O1xuICAgIGxldCBkZXZEZXBlbmRlbmNpZXM6IFBhY2thZ2VKc29uWydkZXZEZXBlbmRlbmNpZXMnXSA9IHt9O1xuICAgIGxldCBwYWNrYWdlSnNvbjogUGFja2FnZUpzb24gPSB7fTtcbiAgICBsZXQgZXNtUGFja2FnZSA9IGZhbHNlO1xuICAgIGlmIChkb2VzQ29udGFpblBhY2thZ2VKc29uKSB7XG4gICAgICBjb25zdCBwYWNrYWdlSnNvblRleHQgPSBmcy5yZWFkRmlsZVN5bmMocGFja2FnZUpzb25QYXRoLCAndXRmOCcpO1xuICAgICAgcGFja2FnZUpzb24gPSBKU09OLnBhcnNlKHBhY2thZ2VKc29uVGV4dCkgYXMgUGFja2FnZUpzb247XG4gICAgICBkZXBlbmRlbmNpZXMgPSBwYWNrYWdlSnNvbi5kZXBlbmRlbmNpZXMgPz8ge307XG4gICAgICBkZXZEZXBlbmRlbmNpZXMgPSBwYWNrYWdlSnNvbi5kZXZEZXBlbmRlbmNpZXMgPz8ge307XG4gICAgICBlc21QYWNrYWdlID0gcGFja2FnZUpzb24udHlwZSA9PT0gJ21vZHVsZSc7XG4gICAgfVxuXG4gICAgbGV0IHJlbGVhc2VCcmFuY2hlczogc3RyaW5nW10gPSBbXTtcbiAgICBsZXQgcmVsZWFzZVBsdWdpbnM6IHN0cmluZ1tdID0gW107XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJlbGVhc2VyY0pzb25QYXRoID0gcGF0aC5yZXNvbHZlKGRpclBhdGgsICcucmVsZWFzZXJjLmpzb24nKTtcbiAgICAgIGNvbnN0IGpzb24gPSBKU09OLnBhcnNlKGF3YWl0IGZzcC5yZWFkRmlsZShyZWxlYXNlcmNKc29uUGF0aCwgJ3V0ZjgnKSkgYXNcbiAgICAgICAgfCB7XG4gICAgICAgICAgICBicmFuY2hlczogc3RyaW5nW107XG4gICAgICAgICAgICBwbHVnaW5zPzogc3RyaW5nW11bXTtcbiAgICAgICAgICB9XG4gICAgICAgIHwgdW5kZWZpbmVkO1xuICAgICAgcmVsZWFzZUJyYW5jaGVzID0ganNvbj8uYnJhbmNoZXMgPz8gW107XG4gICAgICByZWxlYXNlUGx1Z2lucyA9IGpzb24/LnBsdWdpbnM/LmZsYXQoKSA/PyBbXTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIGRvIG5vdGhpbmdcbiAgICB9XG5cbiAgICBjb25zdCBpc1Jvb3QgPVxuICAgICAgcGF0aC5iYXNlbmFtZShwYXRoLnJlc29sdmUoZGlyUGF0aCwgJy4uJykpICE9PSAncGFja2FnZXMnIHx8XG4gICAgICAhZnMuZXhpc3RzU3luYyhwYXRoLnJlc29sdmUoZGlyUGF0aCwgJy4uJywgJy4uJywgJ3BhY2thZ2UuanNvbicpKTtcblxuICAgIGxldCByZXBvSW5mbzogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gfCB1bmRlZmluZWQ7XG4gICAgaWYgKGlzUm9vdCkge1xuICAgICAgcmVwb0luZm8gPSBhd2FpdCBmZXRjaFJlcG9JbmZvKGRpclBhdGgsIHBhY2thZ2VKc29uKTtcbiAgICB9XG5cbiAgICBsZXQgaGFzVmVyc2lvblNldHRpbmdzID0gaGFzVmVyc2lvblNldHRpbmdzRmlsZShkaXJQYXRoKTtcbiAgICBmb3IgKGNvbnN0IHByZWZpeCBvZiBbJ2phdmEnLCAnbm9kZScsICdweXRob24nXSkge1xuICAgICAgaWYgKGZzLmV4aXN0c1N5bmMocGF0aC5yZXNvbHZlKGRpclBhdGgsIGAuJHtwcmVmaXh9LXZlcnNpb25gKSkpIHtcbiAgICAgICAgaGFzVmVyc2lvblNldHRpbmdzID0gdHJ1ZTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuXG4gICAgbGV0IGRvY2tlcmZpbGUgPSAnJztcbiAgICB0cnkge1xuICAgICAgZG9ja2VyZmlsZSA9IGF3YWl0IGZzcC5yZWFkRmlsZShwYXRoLnJlc29sdmUoZGlyUGF0aCwgJ0RvY2tlcmZpbGUnKSwgJ3V0ZjgnKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIGRvIG5vdGhpbmdcbiAgICB9XG5cbiAgICAvLyBSZWFkIHdiZnkuanNvblxuICAgIGNvbnN0IHdiZnlKc29uUGF0aCA9IHBhdGgucmVzb2x2ZShkaXJQYXRoLCAnd2JmeS5qc29uJyk7XG4gICAgbGV0IHdiZnlKc29uOiBXYmZ5SnNvbiB8IHVuZGVmaW5lZDtcbiAgICB0cnkge1xuICAgICAgY29uc3Qgd2JmeUpzb25UZXh0ID0gYXdhaXQgZnNwLnJlYWRGaWxlKHdiZnlKc29uUGF0aCwgJ3V0ZjgnKTtcbiAgICAgIHdiZnlKc29uID0gd2JmeUpzb25TY2hlbWEucGFyc2UoSlNPTi5wYXJzZSh3YmZ5SnNvblRleHQpKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIGRvIG5vdGhpbmdcbiAgICB9XG5cbiAgICBjb25zdCByZXBvRnVsbE5hbWUgPSB0eXBlb2YgcmVwb0luZm8/LmZ1bGxfbmFtZSA9PT0gJ3N0cmluZycgPyByZXBvSW5mby5mdWxsX25hbWUgOiB1bmRlZmluZWQ7XG4gICAgbGV0IHJlcG9BdXRob3I6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgICBsZXQgcmVwb05hbWU6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgICBpZiAocmVwb0Z1bGxOYW1lKSB7XG4gICAgICBjb25zdCByZXBvUGFydHMgPSByZXBvRnVsbE5hbWUuc3BsaXQoJy8nKTtcbiAgICAgIGlmIChyZXBvUGFydHMubGVuZ3RoID49IDIpIHtcbiAgICAgICAgcmVwb0F1dGhvciA9IHJlcG9QYXJ0c1swXTtcbiAgICAgICAgcmVwb05hbWUgPSByZXBvUGFydHNbMV07XG4gICAgICB9XG4gICAgfVxuICAgIGNvbnN0IHJlcG9zaXRvcnkgPSByZXBvRnVsbE5hbWUgPyBgZ2l0aHViOiR7cmVwb0Z1bGxOYW1lfWAgOiB1bmRlZmluZWQ7XG4gICAgY29uc3QgY29uZmlnOiBQYWNrYWdlQ29uZmlnID0ge1xuICAgICAgZGlyUGF0aCxcbiAgICAgIGRvY2tlcmZpbGUsXG4gICAgICBpc1Jvb3QsXG4gICAgICBpc1B1YmxpY1JlcG86IHJlcG9JbmZvPy5wcml2YXRlID09PSBmYWxzZSxcbiAgICAgIGlzUmVmZXJyZWRCeU90aGVyUmVwbzogISFwYWNrYWdlSnNvbi5maWxlcyxcbiAgICAgIHJlcG9zaXRvcnksXG4gICAgICByZXBvQXV0aG9yLFxuICAgICAgcmVwb05hbWUsXG4gICAgICBpc1dpbGxCb29zdGVyUmVwbzogQm9vbGVhbihcbiAgICAgICAgcmVwb3NpdG9yeT8uc3RhcnRzV2l0aCgnZ2l0aHViOldpbGxCb29zdGVyLycpIHx8IHJlcG9zaXRvcnk/LnN0YXJ0c1dpdGgoJ2dpdGh1YjpXaWxsQm9vc3RlckxhYi8nKVxuICAgICAgKSxcbiAgICAgIGlzQnVuOiByb290Q29uZmlnPy5pc0J1biB8fCBmcy5leGlzdHNTeW5jKHBhdGguam9pbihkaXJQYXRoLCAnYnVuLmxvY2snKSksXG4gICAgICBpc0VzbVBhY2thZ2U6IGVzbVBhY2thZ2UsXG4gICAgICBpc1dpbGxCb29zdGVyQ29uZmlnczogcGFja2FnZUpzb25QYXRoLmluY2x1ZGVzKCcvd2lsbGJvb3N0ZXItY29uZmlncycpLFxuICAgICAgZG9lc0NvbnRhaW5TdWJQYWNrYWdlSnNvbnM6IGNvbnRhaW5zQW55KCdwYWNrYWdlcy8qKi9wYWNrYWdlLmpzb24nLCBkaXJQYXRoKSxcbiAgICAgIGRvZXNDb250YWluRG9ja2VyZmlsZTogISFkb2NrZXJmaWxlIHx8IGZzLmV4aXN0c1N5bmMocGF0aC5yZXNvbHZlKGRpclBhdGgsICdkb2NrZXItY29tcG9zZS55bWwnKSksXG4gICAgICBkb2VzQ29udGFpbkdlbWZpbGU6IGZzLmV4aXN0c1N5bmMocGF0aC5yZXNvbHZlKGRpclBhdGgsICdHZW1maWxlJykpLFxuICAgICAgZG9lc0NvbnRhaW5Hb01vZDogZnMuZXhpc3RzU3luYyhwYXRoLnJlc29sdmUoZGlyUGF0aCwgJ2dvLm1vZCcpKSxcbiAgICAgIGRvZXNDb250YWluUGFja2FnZUpzb246IGZzLmV4aXN0c1N5bmMocGF0aC5yZXNvbHZlKGRpclBhdGgsICdwYWNrYWdlLmpzb24nKSksXG4gICAgICBkb2VzQ29udGFpblBvZXRyeUxvY2s6IGZzLmV4aXN0c1N5bmMocGF0aC5yZXNvbHZlKGRpclBhdGgsICdwb2V0cnkubG9jaycpKSxcbiAgICAgIGRvZXNDb250YWluVXZMb2NrOiBmcy5leGlzdHNTeW5jKHBhdGgucmVzb2x2ZShkaXJQYXRoLCAndXYubG9jaycpKSxcbiAgICAgIGRvZXNDb250YWluUG9tWG1sOiBmcy5leGlzdHNTeW5jKHBhdGgucmVzb2x2ZShkaXJQYXRoLCAncG9tLnhtbCcpKSxcbiAgICAgIGRvZXNDb250YWluUHVic3BlY1lhbWw6IGZzLmV4aXN0c1N5bmMocGF0aC5yZXNvbHZlKGRpclBhdGgsICdwdWJzcGVjLnlhbWwnKSksXG4gICAgICBkb2VzQ29udGFpblRlbXBsYXRlWWFtbDogZnMuZXhpc3RzU3luYyhwYXRoLnJlc29sdmUoZGlyUGF0aCwgJ3RlbXBsYXRlLnlhbWwnKSksXG4gICAgICBkb2VzQ29udGFpblZzY29kZVNldHRpbmdzSnNvbjogZnMuZXhpc3RzU3luYyhwYXRoLnJlc29sdmUoZGlyUGF0aCwgJy52c2NvZGUnLCAnc2V0dGluZ3MuanNvbicpKSxcbiAgICAgIGRvZXNDb250YWluSmF2YVNjcmlwdDogY29udGFpbnNBbnkoJ3thcHAsc3JjLHRlc3Qsc2NyaXB0c30vKiovKi57Y2pzLG1qcyxqcyxqc3h9JywgZGlyUGF0aCksXG4gICAgICBkb2VzQ29udGFpblR5cGVTY3JpcHQ6IGNvbnRhaW5zQW55KCd7YXBwLHNyYyx0ZXN0LHNjcmlwdHN9LyoqLyoue2N0cyxtdHMsdHMsdHN4fScsIGRpclBhdGgpLFxuICAgICAgZG9lc0NvbnRhaW5Kc3hPclRzeDogY29udGFpbnNBbnkoJ3thcHAsc3JjLHRlc3R9LyoqLyoue3Qsan1zeCcsIGRpclBhdGgpLFxuICAgICAgZG9lc0NvbnRhaW5KYXZhOiBjb250YWluc0FueSgnKiovKi5qYXZhJywgZGlyUGF0aCksXG4gICAgICBkb2VzQ29udGFpbkphdmFTY3JpcHRJblBhY2thZ2VzOiBjb250YWluc0FueSgncGFja2FnZXMvKiove2FwcCxzcmMsdGVzdCxzY3JpcHRzfS8qKi8qLntjanMsbWpzLGpzLGpzeH0nLCBkaXJQYXRoKSxcbiAgICAgIGRvZXNDb250YWluVHlwZVNjcmlwdEluUGFja2FnZXM6IGNvbnRhaW5zQW55KCdwYWNrYWdlcy8qKi97YXBwLHNyYyx0ZXN0LHNjcmlwdHN9LyoqLyoue2N0cyxtdHMsdHMsdHN4fScsIGRpclBhdGgpLFxuICAgICAgZG9lc0NvbnRhaW5Kc3hPclRzeEluUGFja2FnZXM6IGNvbnRhaW5zQW55KCdwYWNrYWdlcy8qKi97YXBwLHNyYyx0ZXN0fS8qKi8qLnt0LGp9c3gnLCBkaXJQYXRoKSxcbiAgICAgIGRvZXNDb250YWluSmF2YUluUGFja2FnZXM6IGNvbnRhaW5zQW55KCdwYWNrYWdlcy8qKi8qLmphdmEnLCBkaXJQYXRoKSxcbiAgICAgIGRlcGVuZGluZzoge1xuICAgICAgICBibGl0ejogISFkZXBlbmRlbmNpZXMuYmxpdHosXG4gICAgICAgIGZpcmViYXNlOiAhIWRldkRlcGVuZGVuY2llc1snZmlyZWJhc2UtdG9vbHMnXSxcbiAgICAgICAgZ2VuSTE4blRzOiAhIWRlcGVuZGVuY2llc1snZ2VuLWkxOG4tdHMnXSB8fCAhIWRldkRlcGVuZGVuY2llc1snZ2VuLWkxOG4tdHMnXSxcbiAgICAgICAgbGl0ZXN0cmVhbTogZG9ja2VyZmlsZS5pbmNsdWRlcygnaW5zdGFsbC1saXRlc3RyZWFtLnNoJyksXG4gICAgICAgIHJlYWN0OiAhIWRlcGVuZGVuY2llcy5yZWFjdCxcbiAgICAgICAgbmV4dDogISFkZXBlbmRlbmNpZXMubmV4dCxcbiAgICAgICAgcGxheXdyaWdodFRlc3Q6XG4gICAgICAgICAgISFkZXBlbmRlbmNpZXNbJ0BwbGF5d3JpZ2h0L3Rlc3QnXSB8fCAhIWRldkRlcGVuZGVuY2llc1snQHBsYXl3cmlnaHQvdGVzdCddIHx8ICEhZGV2RGVwZW5kZW5jaWVzLnBsYXl3cmlnaHQsXG4gICAgICAgIHByaXNtYTogISFkZXBlbmRlbmNpZXNbJ0BwcmlzbWEvY2xpZW50J10gfHwgISFkZXZEZXBlbmRlbmNpZXMucHJpc21hLFxuICAgICAgICBweXJpZ2h0OiAhIWRldkRlcGVuZGVuY2llcy5weXJpZ2h0LFxuICAgICAgICByZWFjdE5hdGl2ZTogISFkZXBlbmRlbmNpZXNbJ3JlYWN0LW5hdGl2ZSddLFxuICAgICAgICBzZW1hbnRpY1JlbGVhc2U6ICEhKFxuICAgICAgICAgIGRldkRlcGVuZGVuY2llc1snc2VtYW50aWMtcmVsZWFzZSddIHx8XG4gICAgICAgICAgcmVsZWFzZUJyYW5jaGVzLmxlbmd0aCA+IDAgfHxcbiAgICAgICAgICByZWxlYXNlUGx1Z2lucy5sZW5ndGggPiAwXG4gICAgICAgICksXG4gICAgICAgIHN0b3J5Ym9vazogISFkZXZEZXBlbmRlbmNpZXNbJ0BzdG9yeWJvb2svcmVhY3QnXSxcbiAgICAgICAgd2I6ICEhZGVwZW5kZW5jaWVzWydAd2lsbGJvb3N0ZXIvd2InXSB8fCAhIWRldkRlcGVuZGVuY2llc1snQHdpbGxib29zdGVyL3diJ10sXG4gICAgICB9LFxuICAgICAgcmVsZWFzZToge1xuICAgICAgICBicmFuY2hlczogcmVsZWFzZUJyYW5jaGVzLFxuICAgICAgICBnaXRodWI6IHJlbGVhc2VQbHVnaW5zLmluY2x1ZGVzKCdAc2VtYW50aWMtcmVsZWFzZS9naXRodWInKSxcbiAgICAgICAgbnBtOiByZWxlYXNlUGx1Z2lucy5pbmNsdWRlcygnQHNlbWFudGljLXJlbGVhc2UvbnBtJyksXG4gICAgICB9LFxuICAgICAgaGFzVmVyc2lvblNldHRpbmdzLFxuICAgICAgbWlzZVRhc2tzOiBhd2FpdCByZWFkTWlzZVRhc2tzKGRpclBhdGgpLFxuICAgICAgcGFja2FnZUpzb24sXG4gICAgICB3YmZ5SnNvbixcbiAgICB9O1xuICAgIGlmIChcbiAgICAgIGNvbmZpZy5kb2VzQ29udGFpbkdlbWZpbGUgfHxcbiAgICAgIGNvbmZpZy5kb2VzQ29udGFpbkdvTW9kIHx8XG4gICAgICBjb25maWcuZG9lc0NvbnRhaW5QYWNrYWdlSnNvbiB8fFxuICAgICAgY29uZmlnLmRvZXNDb250YWluUG9ldHJ5TG9jayB8fFxuICAgICAgY29uZmlnLmRvZXNDb250YWluVXZMb2NrIHx8XG4gICAgICBjb25maWcuZG9lc0NvbnRhaW5Qb21YbWwgfHxcbiAgICAgIGNvbmZpZy5kb2VzQ29udGFpblB1YnNwZWNZYW1sIHx8XG4gICAgICBjb25maWcuZG9lc0NvbnRhaW5UZW1wbGF0ZVlhbWxcbiAgICApIHtcbiAgICAgIHJldHVybiBjb25maWc7XG4gICAgfVxuICB9IGNhdGNoIHtcbiAgICAvLyBkbyBub3RoaW5nXG4gIH1cbn1cblxuZnVuY3Rpb24gaGFzVmVyc2lvblNldHRpbmdzRmlsZShkaXJQYXRoOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgY29uc3QgY3VycmVudCA9IHBhdGgucmVzb2x2ZShkaXJQYXRoKTtcbiAgcmV0dXJuIChcbiAgICBmcy5leGlzdHNTeW5jKHBhdGguam9pbihjdXJyZW50LCAnbWlzZS50b21sJykpIHx8XG4gICAgZnMuZXhpc3RzU3luYyhwYXRoLmpvaW4oY3VycmVudCwgJy5taXNlLnRvbWwnKSkgfHxcbiAgICBmcy5leGlzdHNTeW5jKHBhdGguam9pbihjdXJyZW50LCAnLnRvb2wtdmVyc2lvbnMnKSlcbiAgKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gcmVhZE1pc2VUYXNrcyhkaXJQYXRoOiBzdHJpbmcpOiBQcm9taXNlPFJlY29yZDxzdHJpbmcsIHN0cmluZz4+IHtcbiAgY29uc3QgdGFza3M6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7fTtcbiAgZm9yIChjb25zdCBmaWxlTmFtZSBvZiBbJ21pc2UudG9tbCcsICcubWlzZS50b21sJ10pIHtcbiAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShkaXJQYXRoLCBmaWxlTmFtZSk7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHNldHRpbmdzID0gdG9tbC5wYXJzZShhd2FpdCBmc3AucmVhZEZpbGUoZmlsZVBhdGgsICd1dGY4JykpIGFzIHsgdGFza3M/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB9O1xuICAgICAgZm9yIChjb25zdCBbbmFtZSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKHNldHRpbmdzLnRhc2tzID8/IHt9KSkge1xuICAgICAgICB0YXNrc1tuYW1lXSA9IHJlYWRNaXNlVGFza0NvbW1hbmQodmFsdWUpO1xuICAgICAgfVxuICAgIH0gY2F0Y2gge1xuICAgICAgLy8gTWlzc2luZyBvciB0ZW1wb3JhcmlseSBpbnZhbGlkIG1pc2UgZmlsZXMgc2hvdWxkIG5vdCBibG9jayBvdGhlciB3YmZ5IGdlbmVyYXRvcnMuXG4gICAgfVxuICB9XG4gIHJldHVybiB0YXNrcztcbn1cblxuZnVuY3Rpb24gcmVhZE1pc2VUYXNrQ29tbWFuZCh2YWx1ZTogdW5rbm93bik6IHN0cmluZyB7XG4gIGlmICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnKSByZXR1cm4gdmFsdWU7XG4gIC8vIFByZXNlcnZlIGFycmF5LWZvcm0gbWlzZSBjb21tYW5kcyBzbyByZWN1cnNpb24gY2hlY2tzIGNhbiBzdGlsbCBzZWUgcGFja2FnZSBzY3JpcHQgY2FsbHMuXG4gIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkgcmV0dXJuIHZhbHVlLmZpbHRlcigoY29tbWFuZCk6IGNvbW1hbmQgaXMgc3RyaW5nID0+IHR5cGVvZiBjb21tYW5kID09PSAnc3RyaW5nJykuam9pbignXFxuJyk7XG4gIGlmICh2YWx1ZSAmJiB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnKSByZXR1cm4gcmVhZE1pc2VUYXNrQ29tbWFuZCgodmFsdWUgYXMgeyBydW4/OiB1bmtub3duIH0pLnJ1bik7XG4gIHJldHVybiAnJztcbn1cblxuZnVuY3Rpb24gY29udGFpbnNBbnkocGF0dGVybjogc3RyaW5nLCBkaXJQYXRoOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgcmV0dXJuIGZnLmdsb2JTeW5jKHBhdHRlcm4sIHsgZG90OiB0cnVlLCBjd2Q6IGRpclBhdGgsIGlnbm9yZTogZ2xvYklnbm9yZSB9KS5sZW5ndGggPiAwO1xufVxuXG5hc3luYyBmdW5jdGlvbiBmZXRjaFJlcG9JbmZvKGRpclBhdGg6IHN0cmluZywgcGFja2FnZUpzb246IFBhY2thZ2VKc29uKTogUHJvbWlzZTxSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB8IHVuZGVmaW5lZD4ge1xuICBjb25zdCBnaXQgPSBzaW1wbGVHaXQoZGlyUGF0aCk7XG4gIGNvbnN0IHJlbW90ZXMgPSBhd2FpdCBnaXQuZ2V0UmVtb3Rlcyh0cnVlKTtcbiAgY29uc3Qgb3JpZ2luID0gcmVtb3Rlcy5maW5kKChyKSA9PiByLm5hbWUgPT09ICdvcmlnaW4nKTtcbiAgY29uc3QgcmVtb3RlVXJsID0gb3JpZ2luPy5yZWZzLmZldGNoID8/IG9yaWdpbj8ucmVmcy5wdXNoO1xuICBpZiAodHlwZW9mIHJlbW90ZVVybCA9PT0gJ3N0cmluZycpIHtcbiAgICBjb25zdCBqc29uID0gYXdhaXQgcmVxdWVzdFJlcG9JbmZvKHJlbW90ZVVybCk7XG4gICAgaWYgKGpzb24pIHJldHVybiBqc29uO1xuICB9XG5cbiAgY29uc3QgdXJsID0gdHlwZW9mIHBhY2thZ2VKc29uLnJlcG9zaXRvcnkgPT09ICdzdHJpbmcnID8gcGFja2FnZUpzb24ucmVwb3NpdG9yeSA6IHBhY2thZ2VKc29uLnJlcG9zaXRvcnk/LnVybDtcbiAgaWYgKHVybCkge1xuICAgIGNvbnN0IGpzb24gPSBhd2FpdCByZXF1ZXN0UmVwb0luZm8odXJsKTtcbiAgICBpZiAoanNvbiAmJiBqc29uLm1lc3NhZ2UgIT09ICdOb3QgRm91bmQnKSByZXR1cm4ganNvbjtcbiAgfVxufVxuXG5hc3luYyBmdW5jdGlvbiByZXF1ZXN0UmVwb0luZm8odXJsT3JGdWxsTmFtZTogc3RyaW5nKTogUHJvbWlzZTxSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB8IHVuZGVmaW5lZD4ge1xuICBjb25zdCBbb3JnLCBuYW1lXSA9IGdpdEh1YlV0aWwuZ2V0T3JnQW5kTmFtZSh1cmxPckZ1bGxOYW1lKTtcbiAgaWYgKCFvcmcgfHwgIW5hbWUpIHJldHVybjtcblxuICB0cnkge1xuICAgIC8vIE1ldGFkYXRhIHBlcm1pc3Npb25cbiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGdldE9jdG9raXQoKS5yZXF1ZXN0KCdHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99Jywge1xuICAgICAgb3duZXI6IG9yZyxcbiAgICAgIHJlcG86IG5hbWUsXG4gICAgfSk7XG4gICAgcmV0dXJuIHJlc3BvbnNlLmRhdGE7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgY29uc3QgcmVkaXJlY3RlZEZ1bGxOYW1lID0gZ2V0UmVkaXJlY3RlZFJlcG9GdWxsTmFtZShlcnJvcik7XG4gICAgaWYgKHJlZGlyZWN0ZWRGdWxsTmFtZSkge1xuICAgICAgcmV0dXJuIHsgZnVsbF9uYW1lOiByZWRpcmVjdGVkRnVsbE5hbWUgfTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gZ2V0UmVkaXJlY3RlZFJlcG9GdWxsTmFtZShlcnJvcjogdW5rbm93bik6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGlmICghZXJyb3IgfHwgdHlwZW9mIGVycm9yICE9PSAnb2JqZWN0JykgcmV0dXJuO1xuXG4gIGNvbnN0IHJlc3BvbnNlID1cbiAgICAncmVzcG9uc2UnIGluIGVycm9yXG4gICAgICA/IChlcnJvciBhcyB7IHJlc3BvbnNlPzogeyBzdGF0dXM/OiBudW1iZXI7IGhlYWRlcnM/OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmcgfCB1bmRlZmluZWQ+IH0gfSkucmVzcG9uc2VcbiAgICAgIDogdW5kZWZpbmVkO1xuICBjb25zdCBzdGF0dXMgPSByZXNwb25zZT8uc3RhdHVzID8/IChlcnJvciBhcyB7IHN0YXR1cz86IG51bWJlciB9KS5zdGF0dXM7XG4gIGlmIChzdGF0dXMgIT09IDMwMSAmJiBzdGF0dXMgIT09IDMwMikgcmV0dXJuO1xuXG4gIGNvbnN0IGxvY2F0aW9uID0gcmVzcG9uc2U/LmhlYWRlcnM/LmxvY2F0aW9uO1xuICBpZiAodHlwZW9mIGxvY2F0aW9uICE9PSAnc3RyaW5nJykgcmV0dXJuO1xuXG4gIGNvbnN0IFtvcmcsIG5hbWVdID0gZ2l0SHViVXRpbC5nZXRPcmdBbmROYW1lKGxvY2F0aW9uKTtcbiAgaWYgKCFvcmcgfHwgIW5hbWUpIHJldHVybjtcblxuICByZXR1cm4gYCR7b3JnfS8ke25hbWV9YDtcbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB7IGlnbm9yZUVycm9yQXN5bmMgfSBmcm9tICdAd2lsbGJvb3N0ZXIvc2hhcmVkLWxpYi9zcmMnO1xuaW1wb3J0IHlhcmdzIGZyb20gJ3lhcmdzJztcblxuaW1wb3J0IHsgZml4TmV4dENvbmZpZ0pzb24gfSBmcm9tICcuL2ZpeGVycy9uZXh0Q29uZmlnLmpzJztcbmltcG9ydCB7IGZpeFBsYXl3cmlnaHRDb25maWcgfSBmcm9tICcuL2ZpeGVycy9wbGF5d3JpZ2h0Q29uZmlnLmpzJztcbmltcG9ydCB7IGZpeFByaXNtYUVudkZpbGVzIH0gZnJvbSAnLi9maXhlcnMvcHJpc21hLmpzJztcbmltcG9ydCB7IGZpeFRlc3REaXJlY3Rvcmllc1VwZGF0aW5nUGFja2FnZUpzb24gfSBmcm9tICcuL2ZpeGVycy90ZXN0RGlyZWN0b3J5LmpzJztcbmltcG9ydCB7IGZpeFR5cGVEZWZpbml0aW9ucyB9IGZyb20gJy4vZml4ZXJzL3R5cGVEZWZpbml0aW9uLmpzJztcbmltcG9ydCB7IGZpeFR5cG9zIH0gZnJvbSAnLi9maXhlcnMvdHlwb3MuanMnO1xuaW1wb3J0IHsgZ2VuZXJhdGVBZ2VudEluc3RydWN0aW9ucyB9IGZyb20gJy4vZ2VuZXJhdG9ycy9hZ2VudHMuanMnO1xuaW1wb3J0IHsgZ2VuZXJhdGVCdW5maWdUb21sIH0gZnJvbSAnLi9nZW5lcmF0b3JzL2J1bmZpZy5qcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZURvY2tlcmlnbm9yZSB9IGZyb20gJy4vZ2VuZXJhdG9ycy9kb2NrZXJpZ25vcmUuanMnO1xuaW1wb3J0IHsgZ2VuZXJhdGVFZGl0b3Jjb25maWcgfSBmcm9tICcuL2dlbmVyYXRvcnMvZWRpdG9yY29uZmlnLmpzJztcbmltcG9ydCB7IGdlbmVyYXRlR2VtaW5pQ29uZmlnIH0gZnJvbSAnLi9nZW5lcmF0b3JzL2dlbWluaUNvbmZpZy5qcyc7XG5pbXBvcnQgeyByZW1vdmVHZW1pbmlTZXR0aW5ncyB9IGZyb20gJy4vZ2VuZXJhdG9ycy9nZW1pbmlTZXR0aW5ncy5qcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZUdpdGF0dHJpYnV0ZXMgfSBmcm9tICcuL2dlbmVyYXRvcnMvZ2l0YXR0cmlidXRlcy5qcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZUdpdGlnbm9yZSB9IGZyb20gJy4vZ2VuZXJhdG9ycy9naXRpZ25vcmUuanMnO1xuaW1wb3J0IHsgZ2VuZXJhdGVJZGVhU2V0dGluZ3MgfSBmcm9tICcuL2dlbmVyYXRvcnMvaWRlYS5qcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZUxlZnRob29rVXBkYXRpbmdQYWNrYWdlSnNvbiB9IGZyb20gJy4vZ2VuZXJhdG9ycy9sZWZ0aG9vay5qcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZUxpbnRzdGFnZWRyYyB9IGZyb20gJy4vZ2VuZXJhdG9ycy9saW50c3RhZ2VkcmMuanMnO1xuaW1wb3J0IHsgZ2VuZXJhdGVQYWNrYWdlSnNvbiB9IGZyb20gJy4vZ2VuZXJhdG9ycy9wYWNrYWdlSnNvbi5qcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZU94Zm10Q29uZmlnIH0gZnJvbSAnLi9nZW5lcmF0b3JzL294Zm10Q29uZmlnLmpzJztcbmltcG9ydCB7IGdlbmVyYXRlT3hsaW50Q29uZmlnIH0gZnJvbSAnLi9nZW5lcmF0b3JzL294bGludENvbmZpZy5qcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZVByZXR0aWVyaWdub3JlIH0gZnJvbSAnLi9nZW5lcmF0b3JzL3ByZXR0aWVyaWdub3JlLmpzJztcbmltcG9ydCB7IGdlbmVyYXRlUHlyaWdodENvbmZpZ0pzb24gfSBmcm9tICcuL2dlbmVyYXRvcnMvcHlyaWdodENvbmZpZy5qcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZVJlYWRtZSB9IGZyb20gJy4vZ2VuZXJhdG9ycy9yZWFkbWUuanMnO1xuaW1wb3J0IHsgZ2VuZXJhdGVSZWxlYXNlcmMgfSBmcm9tICcuL2dlbmVyYXRvcnMvcmVsZWFzZXJjLmpzJztcbmltcG9ydCB7IGdlbmVyYXRlUmVub3ZhdGVKc29uIH0gZnJvbSAnLi9nZW5lcmF0b3JzL3Jlbm92YXRlSnNvbi5qcyc7XG5pbXBvcnQgeyBpbnN0YWxsQWdlbnRTa2lsbHMgfSBmcm9tICcuL2dlbmVyYXRvcnMvc2tpbGxzLmpzJztcbmltcG9ydCB7IGdlbmVyYXRlVHNjb25maWcgfSBmcm9tICcuL2dlbmVyYXRvcnMvdHNjb25maWcuanMnO1xuaW1wb3J0IHsgZ2VuZXJhdGVWc2NvZGVTZXR0aW5ncyB9IGZyb20gJy4vZ2VuZXJhdG9ycy92c2NvZGVTZXR0aW5ncy5qcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZVdvcmtmbG93cywgaXNSZXVzYWJsZVdvcmtmbG93c1JlcG8gfSBmcm9tICcuL2dlbmVyYXRvcnMvd29ya2Zsb3cuanMnO1xuaW1wb3J0IHsgZ2VuZXJhdGVZYXJucmNZbWwgfSBmcm9tICcuL2dlbmVyYXRvcnMveWFybnJjLmpzJztcbmltcG9ydCB7IHNldHVwTGFiZWxzIH0gZnJvbSAnLi9naXRodWIvbGFiZWwuanMnO1xuaW1wb3J0IHsgc2V0dXBTZWNyZXRzIH0gZnJvbSAnLi9naXRodWIvc2VjcmV0LmpzJztcbmltcG9ydCB7IHNldHVwR2l0SHViU2V0dGluZ3MgfSBmcm9tICcuL2dpdGh1Yi9zZXR0aW5ncy5qcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZUdpdEh1YlRlbXBsYXRlcyB9IGZyb20gJy4vZ2l0aHViL3RlbXBsYXRlLmpzJztcbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4vbG9nZ2VyLmpzJztcbmltcG9ydCB7IG9wdGlvbnMgfSBmcm9tICcuL29wdGlvbnMuanMnO1xuaW1wb3J0IHsgZ2V0UGFja2FnZUNvbmZpZyB9IGZyb20gJy4vcGFja2FnZUNvbmZpZy5qcyc7XG5pbXBvcnQgeyBkb2VzQ29udGFpbkpzT3JUcyB9IGZyb20gJy4vdXRpbHMvcGFja2FnZUNhcGFiaWxpdGllcy5qcyc7XG5pbXBvcnQgeyBwcm9taXNlUG9vbCB9IGZyb20gJy4vdXRpbHMvcHJvbWlzZVBvb2wuanMnO1xuaW1wb3J0IHsgc3Bhd25TeW5jLCBzcGF3blN5bmNBbmRSZXR1cm5TdGF0dXMgfSBmcm9tICcuL3V0aWxzL3NwYXduVXRpbC5qcyc7XG5cbmFzeW5jIGZ1bmN0aW9uIG1haW4oKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IGFyZ3YgPSBhd2FpdCB5YXJncyhwcm9jZXNzLmFyZ3Yuc2xpY2UoMikpXG4gICAgLmNvbW1hbmQoJyQwIFtwYXRocy4uXScsICdNYWtlIGEgZ2l2ZW4gcHJvamVjdCBmb2xsb3cgdGhlIFdpbGxCb29zdGVyIHN0YW5kYXJkJywgKHlhcmdzKSA9PiB7XG4gICAgICB5YXJncy5wb3NpdGlvbmFsKCdwYXRocycsIHtcbiAgICAgICAgZGVzY3JpYmU6ICdwcm9qZWN0IHBhdGhzIHRvIGJlIHdiZmllZCcsXG4gICAgICAgIGFycmF5OiB0cnVlLFxuICAgICAgICB0eXBlOiAnc3RyaW5nJyxcbiAgICAgICAgZGVmYXVsdDogWycuJ10sXG4gICAgICB9KTtcbiAgICB9KVxuICAgIC5vcHRpb25zKHtcbiAgICAgIGVudjoge1xuICAgICAgICBkZXNjcmlwdGlvbjogJ1VwbG9hZCBlbnZpcm9ubWVudCB2YXJpYWJsZXMgYXMgc2VjcmV0cyB0byBHaXRIdWInLFxuICAgICAgICB0eXBlOiAnYm9vbGVhbicsXG4gICAgICAgIGRlZmF1bHQ6IGZhbHNlLFxuICAgICAgICBhbGlhczogJ2UnLFxuICAgICAgfSxcbiAgICAgIHNraXBEZXBzOiB7XG4gICAgICAgIGRlc2NyaXB0aW9uOiAnU2tpcCBkZXBlbmRlbmN5IGluc3RhbGxhdGlvbicsXG4gICAgICAgIHR5cGU6ICdib29sZWFuJyxcbiAgICAgICAgZGVmYXVsdDogZmFsc2UsXG4gICAgICAgIGFsaWFzOiAnZCcsXG4gICAgICB9LFxuICAgICAgdmVyYm9zZToge1xuICAgICAgICBkZXNjcmlwdGlvbjogJ1doZXRoZXIgb3Igbm90IHRvIGVuYWJsZSB2ZXJib3NlIG1vZGUnLFxuICAgICAgICB0eXBlOiAnYm9vbGVhbicsXG4gICAgICAgIGRlZmF1bHQ6IGZhbHNlLFxuICAgICAgICBhbGlhczogJ3YnLFxuICAgICAgfSxcbiAgICB9KVxuICAgIC52ZXJzaW9uKGdldFZlcnNpb24oKSlcbiAgICAuc3RyaWN0KCkuYXJndjtcbiAgb3B0aW9ucy5pc1ZlcmJvc2UgPSBhcmd2LnZlcmJvc2U7XG4gIG9wdGlvbnMuZG9lc1VwbG9hZEVudlZhcnMgPSBhcmd2LmVudjtcblxuICBsZXQgaGFzSW52YWxpZFBhY2thZ2VDb25maWcgPSBmYWxzZTtcbiAgZm9yIChjb25zdCByb290RGlyUGF0aCBvZiBhcmd2LnBhdGhzIGFzIHN0cmluZ1tdKSB7XG4gICAgY29uc3QgcGFja2FnZXNEaXJQYXRoID0gcGF0aC5qb2luKHJvb3REaXJQYXRoLCAncGFja2FnZXMnKTtcbiAgICBjb25zdCBkaXJlbnRzID0gKGF3YWl0IGlnbm9yZUVycm9yQXN5bmMoKCkgPT4gZnMucHJvbWlzZXMucmVhZGRpcihwYWNrYWdlc0RpclBhdGgsIHsgd2l0aEZpbGVUeXBlczogdHJ1ZSB9KSkpID8/IFtdO1xuICAgIGNvbnN0IHN1YkRpclBhdGhzID0gZGlyZW50cy5maWx0ZXIoKGQpID0+IGQuaXNEaXJlY3RvcnkoKSkubWFwKChkKSA9PiBwYXRoLmpvaW4ocGFja2FnZXNEaXJQYXRoLCBkLm5hbWUpKTtcblxuICAgIGF3YWl0IGZpeFRlc3REaXJlY3Rvcmllc1VwZGF0aW5nUGFja2FnZUpzb24oW3Jvb3REaXJQYXRoLCAuLi5zdWJEaXJQYXRoc10pO1xuXG4gICAgY29uc3Qgcm9vdENvbmZpZyA9IGF3YWl0IGdldFBhY2thZ2VDb25maWcocm9vdERpclBhdGgpO1xuICAgIGlmIChvcHRpb25zLmlzVmVyYm9zZSkge1xuICAgICAgY29uc29sZS5sb2coJ3Jvb3RDb25maWc6Jywgcm9vdENvbmZpZyk7XG4gICAgfVxuICAgIGlmICghcm9vdENvbmZpZykge1xuICAgICAgY29uc29sZS5lcnJvcihgdGhlcmUgaXMgbm8gdmFsaWQgcGFja2FnZS5qc29uIGluICR7cm9vdERpclBhdGh9YCk7XG4gICAgICBoYXNJbnZhbGlkUGFja2FnZUNvbmZpZyA9IHRydWU7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgY29uc3QgYWJicmV2aWF0aW9uUHJvbWlzZSA9IGZpeFR5cG9zKHJvb3RDb25maWcpO1xuXG4gICAgY29uc3QgbnVsbGFibGVTdWJQYWNrYWdlQ29uZmlncyA9IGF3YWl0IFByb21pc2UuYWxsKFxuICAgICAgc3ViRGlyUGF0aHMubWFwKChzdWJEaXJQYXRoKSA9PiBnZXRQYWNrYWdlQ29uZmlnKHN1YkRpclBhdGgsIHJvb3RDb25maWcpKVxuICAgICk7XG4gICAgY29uc3Qgc3ViUGFja2FnZUNvbmZpZ3MgPSBudWxsYWJsZVN1YlBhY2thZ2VDb25maWdzLmZpbHRlcigoY29uZmlnKSA9PiAhIWNvbmZpZyk7XG4gICAgY29uc3QgYWxsUGFja2FnZUNvbmZpZ3MgPSBbcm9vdENvbmZpZywgLi4uc3ViUGFja2FnZUNvbmZpZ3NdO1xuXG4gICAgaWYgKG9wdGlvbnMuaXNWZXJib3NlKSB7XG4gICAgICBmb3IgKGNvbnN0IGNvbmZpZyBvZiBhbGxQYWNrYWdlQ29uZmlncykge1xuICAgICAgICBjb25zb2xlLmluZm8oY29uZmlnKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBJbnN0YWxsIHlhcm4gYmVycnlcbiAgICBhd2FpdCBnZW5lcmF0ZVlhcm5yY1ltbChyb290Q29uZmlnKTtcbiAgICBpZiAocm9vdENvbmZpZy5pc0J1bikge1xuICAgICAgYXdhaXQgZ2VuZXJhdGVCdW5maWdUb21sKHJvb3RDb25maWcpO1xuICAgIH1cblxuICAgIGNvbnN0IHNob3VsZFJ1bldvcmtmbG93cyA9XG4gICAgICAhaXNSZXVzYWJsZVdvcmtmbG93c1JlcG8ocm9vdENvbmZpZy5yZXBvc2l0b3J5KSAmJlxuICAgICAgKHJvb3RDb25maWcucmVwb3NpdG9yeT8uc3RhcnRzV2l0aCgnZ2l0aHViOldpbGxCb29zdGVyLycpIHx8XG4gICAgICAgIHJvb3RDb25maWcucmVwb3NpdG9yeT8uc3RhcnRzV2l0aCgnZ2l0aHViOldpbGxCb29zdGVyTGFiLycpKTtcbiAgICBhd2FpdCBQcm9taXNlLmFsbChbXG4gICAgICBmaXhQcmlzbWFFbnZGaWxlcyhyb290Q29uZmlnKSxcbiAgICAgIGFiYnJldmlhdGlvblByb21pc2UudGhlbigoKSA9PiBnZW5lcmF0ZVJlYWRtZShyb290Q29uZmlnKSksXG4gICAgICBnZW5lcmF0ZUFnZW50SW5zdHJ1Y3Rpb25zKHJvb3RDb25maWcsIGFsbFBhY2thZ2VDb25maWdzKSxcbiAgICAgIGdlbmVyYXRlRG9ja2VyaWdub3JlKHJvb3RDb25maWcpLFxuICAgICAgZ2VuZXJhdGVFZGl0b3Jjb25maWcocm9vdENvbmZpZyksXG4gICAgICBnZW5lcmF0ZUdlbWluaUNvbmZpZyhyb290Q29uZmlnLCBhbGxQYWNrYWdlQ29uZmlncyksXG4gICAgICByZW1vdmVHZW1pbmlTZXR0aW5ncyhyb290Q29uZmlnKSxcbiAgICAgIGdlbmVyYXRlR2l0YXR0cmlidXRlcyhyb290Q29uZmlnKSxcbiAgICAgIGdlbmVyYXRlR2l0SHViVGVtcGxhdGVzKHJvb3RDb25maWcpLFxuICAgICAgZ2VuZXJhdGVJZGVhU2V0dGluZ3Mocm9vdENvbmZpZyksXG4gICAgICBnZW5lcmF0ZVJlbm92YXRlSnNvbihyb290Q29uZmlnKSxcbiAgICAgIGdlbmVyYXRlUmVsZWFzZXJjKHJvb3RDb25maWcpLFxuICAgICAgLi4uKHNob3VsZFJ1bldvcmtmbG93cyA/IFtnZW5lcmF0ZVdvcmtmbG93cyhyb290Q29uZmlnKV0gOiBbXSksXG4gICAgICBzZXR1cExhYmVscyhyb290Q29uZmlnKSxcbiAgICAgIHNldHVwU2VjcmV0cyhyb290Q29uZmlnKSxcbiAgICAgIHNldHVwR2l0SHViU2V0dGluZ3Mocm9vdENvbmZpZyksXG4gICAgICBnZW5lcmF0ZUxlZnRob29rVXBkYXRpbmdQYWNrYWdlSnNvbihyb290Q29uZmlnKSxcbiAgICAgIGdlbmVyYXRlTGludHN0YWdlZHJjKHJvb3RDb25maWcpLFxuICAgIF0pO1xuICAgIGF3YWl0IHByb21pc2VQb29sLnByb21pc2VBbGwoKTtcblxuICAgIGNvbnN0IHByb21pc2VzOiBQcm9taXNlPHZvaWQ+W10gPSBbXTtcbiAgICBmb3IgKGNvbnN0IGNvbmZpZyBvZiBhbGxQYWNrYWdlQ29uZmlncykge1xuICAgICAgaWYgKGNvbmZpZy5kb2VzQ29udGFpblR5cGVTY3JpcHQgfHwgY29uZmlnLmRvZXNDb250YWluVHlwZVNjcmlwdEluUGFja2FnZXMpIHtcbiAgICAgICAgcHJvbWlzZXMucHVzaChmaXhUeXBlRGVmaW5pdGlvbnMoY29uZmlnLCBjb25maWcuaXNSb290ID8gYWxsUGFja2FnZUNvbmZpZ3MgOiBbY29uZmlnXSkpO1xuICAgICAgfVxuICAgICAgaWYgKGNvbmZpZy5kZXBlbmRpbmcucGxheXdyaWdodFRlc3QpIHtcbiAgICAgICAgcHJvbWlzZXMucHVzaChmaXhQbGF5d3JpZ2h0Q29uZmlnKGNvbmZpZykpO1xuICAgICAgfVxuICAgICAgaWYgKGNvbmZpZy5kZXBlbmRpbmcubmV4dCkge1xuICAgICAgICBwcm9taXNlcy5wdXNoKGZpeE5leHRDb25maWdKc29uKGNvbmZpZykpO1xuICAgICAgfVxuICAgICAgYXdhaXQgZ2VuZXJhdGVHaXRpZ25vcmUoY29uZmlnLCByb290Q29uZmlnKTtcbiAgICAgIGF3YWl0IHByb21pc2VQb29sLnByb21pc2VBbGwoKTtcbiAgICAgIGlmICghY29uZmlnLmlzUm9vdCAmJiAhY29uZmlnLmRvZXNDb250YWluUGFja2FnZUpzb24pIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBhd2FpdCBnZW5lcmF0ZVByZXR0aWVyaWdub3JlKGNvbmZpZyk7XG4gICAgICBhd2FpdCBnZW5lcmF0ZVBhY2thZ2VKc29uKGNvbmZpZywgcm9vdENvbmZpZywgYXJndi5za2lwRGVwcyk7XG5cbiAgICAgIHByb21pc2VzLnB1c2goZ2VuZXJhdGVMaW50c3RhZ2VkcmMoY29uZmlnKSk7XG4gICAgICBpZiAoY29uZmlnLmRvZXNDb250YWluVnNjb2RlU2V0dGluZ3NKc29uICYmIGNvbmZpZy5kb2VzQ29udGFpblBhY2thZ2VKc29uKSB7XG4gICAgICAgIHByb21pc2VzLnB1c2goZ2VuZXJhdGVWc2NvZGVTZXR0aW5ncyhjb25maWcpKTtcbiAgICAgIH1cbiAgICAgIGlmIChjb25maWcuZG9lc0NvbnRhaW5UeXBlU2NyaXB0IHx8IGNvbmZpZy5kb2VzQ29udGFpblR5cGVTY3JpcHRJblBhY2thZ2VzKSB7XG4gICAgICAgIHByb21pc2VzLnB1c2goZ2VuZXJhdGVUc2NvbmZpZyhjb25maWcpKTtcbiAgICAgIH1cbiAgICAgIGlmIChkb2VzQ29udGFpbkpzT3JUcyhjb25maWcpKSB7XG4gICAgICAgIHByb21pc2VzLnB1c2goZ2VuZXJhdGVPeGZtdENvbmZpZyhjb25maWcpKTtcbiAgICAgICAgcHJvbWlzZXMucHVzaChnZW5lcmF0ZU94bGludENvbmZpZyhjb25maWcsIHJvb3RDb25maWcpKTtcbiAgICAgIH1cbiAgICAgIGlmIChjb25maWcuZGVwZW5kaW5nLnB5cmlnaHQpIHtcbiAgICAgICAgcHJvbWlzZXMucHVzaChnZW5lcmF0ZVB5cmlnaHRDb25maWdKc29uKGNvbmZpZykpO1xuICAgICAgfVxuICAgIH1cbiAgICBhd2FpdCBQcm9taXNlLmFsbChwcm9taXNlcyk7XG4gICAgYXdhaXQgcHJvbWlzZVBvb2wucHJvbWlzZUFsbCgpO1xuXG4gICAgY29uc3QgcGFja2FnZU1hbmFnZXIgPSByb290Q29uZmlnLmlzQnVuID8gJ2J1bicgOiAneWFybic7XG4gICAgLy8gUmVmcmVzaCBsb2NrIGZpbGVzXG4gICAgaWYgKHJvb3RDb25maWcuaXNCdW4pIHtcbiAgICAgIGF3YWl0IGxvZ2dlci5mdW5jdGlvbklnbm9yaW5nRXhjZXB0aW9uKCdyZWZyZXNoQnVuTG9jaycsIGFzeW5jICgpID0+IHtcbiAgICAgICAgYXdhaXQgUHJvbWlzZS5yZXNvbHZlKCk7XG4gICAgICAgIHJlZnJlc2hCdW5Mb2NrKHJvb3REaXJQYXRoKTtcbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICBzcGF3blN5bmMocGFja2FnZU1hbmFnZXIsIFsnaW5zdGFsbCcsICctLW5vLWltbXV0YWJsZSddLCByb290RGlyUGF0aCk7XG4gICAgfVxuICAgIHNwYXduU3luYyhwYWNrYWdlTWFuYWdlciwgWydjbGVhbnVwJ10sIHJvb3REaXJQYXRoKTtcblxuICAgIGF3YWl0IGluc3RhbGxBZ2VudFNraWxscyhyb290Q29uZmlnKTtcbiAgfVxuICBpZiAoaGFzSW52YWxpZFBhY2thZ2VDb25maWcpIHtcbiAgICBwcm9jZXNzLmV4aXRDb2RlID0gMTtcbiAgfVxufVxuXG5mdW5jdGlvbiByZWZyZXNoQnVuTG9jayhyb290RGlyUGF0aDogc3RyaW5nKTogdm9pZCB7XG4gIC8vIHdiZnkgc2hvdWxkIHVwZGF0ZSBvbmx5IHRoZSBwYWNrYWdlcyBpdCBleHBsaWNpdGx5IG1hbmFnZXMgdGhyb3VnaCBidW4gYWRkLlxuICAvLyBSdW5uaW5nIGJ1biB1cGRhdGUgaGVyZSByZWZyZXNoZXMgdW5yZWxhdGVkIGFwcGxpY2F0aW9uIGRlcGVuZGVuY2llcyBhbmRcbiAgLy8gY2FuIGNoYW5nZSBwcm9kdWN0IGJlaGF2aW9yLCBzbyBrZWVwIHRoZSBleGlzdGluZyBsb2NrIGFuZCByZWNvbmNpbGUgaXQuXG4gIGNvbnN0IHN0YXR1cyA9IHNwYXduU3luY0FuZFJldHVyblN0YXR1cygnYnVuJywgWydpbnN0YWxsJ10sIHJvb3REaXJQYXRoKTtcbiAgaWYgKHN0YXR1cyAhPT0gMCkge1xuICAgIHRocm93IG5ldyBFcnJvcihgRmFpbGVkIHRvIHJlZnJlc2ggQnVuIGxvY2tmaWxlOiBidW4gaW5zdGFsbCBleGl0ZWQgd2l0aCBzdGF0dXMgJHtzdGF0dXN9YCk7XG4gIH1cbn1cblxuZnVuY3Rpb24gZ2V0VmVyc2lvbigpOiBzdHJpbmcge1xuICBsZXQgcGFja2FnZUpzb25EaXIgPSBwYXRoLmRpcm5hbWUobmV3IFVSTChpbXBvcnQubWV0YS51cmwpLnBhdGhuYW1lKTtcbiAgd2hpbGUgKCFmcy5leGlzdHNTeW5jKHBhdGguam9pbihwYWNrYWdlSnNvbkRpciwgJ3BhY2thZ2UuanNvbicpKSkge1xuICAgIHBhY2thZ2VKc29uRGlyID0gcGF0aC5kaXJuYW1lKHBhY2thZ2VKc29uRGlyKTtcbiAgfVxuICBjb25zdCBwYWNrYWdlSnNvbiA9IEpTT04ucGFyc2UoZnMucmVhZEZpbGVTeW5jKHBhdGguam9pbihwYWNrYWdlSnNvbkRpciwgJ3BhY2thZ2UuanNvbicpLCAndXRmOCcpKSBhcyB7XG4gICAgdmVyc2lvbjogc3RyaW5nO1xuICB9O1xuICByZXR1cm4gcGFja2FnZUpzb24udmVyc2lvbjtcbn1cblxuYXdhaXQgbWFpbigpO1xuIl0sIm5hbWVzIjpbImFzeW5jIiwic2xlZXAiLCJtaWxsaXNlY29uZHMiLCJQcm9taXNlIiwicmVzb2x2ZSIsInNldFRpbWVvdXQiLCJpZ25vcmVFcnJvckFzeW5jIiwiZm4iLCJpZ25vcmVFbm9lbnRBc3luYyIsImVycm9yIiwiY29kZSIsIm9wdGlvbnMiLCJpc1ZlcmJvc2UiLCJkb2VzVXBsb2FkRW52VmFycyIsImxvZ2dlciIsImZ1bmN0aW9uSWdub3JpbmdFeGNlcHRpb24iLCJuYW1lIiwiZnVuYyIsImNvbnNvbGUiLCJpbmZvIiwiRXJyb3IiLCJzdGFjayIsIlN0cmluZyIsImZzVXRpbCIsInJlYWRGaWxlSWdub3JpbmdFcnJvciIsImZpbGVQYXRoIiwiZnMiLCJwcm9taXNlcyIsInJlYWRGaWxlIiwiZ2VuZXJhdGVGaWxlIiwiY29udGVudCIsIm1rZGlyIiwicGF0aCIsImRpcm5hbWUiLCJyZWN1cnNpdmUiLCJub3JtYWxpemVkQ29udGVudCIsInRyaW0iLCJ3cml0ZUZpbGUiLCJwcm9taXNlUG9vbCIsIlByb21pc2VQb29sIiwiZml4TmV4dENvbmZpZ0pzb24iLCJjb25maWciLCJtYXAiLCJleHQiLCJkaXJQYXRoIiwiZmluZCIsInAiLCJleGlzdHNTeW5jIiwib2xkQ29udGVudCIsIm9iamVjdExpdGVyYWwiLCJzb3VyY2UiLCJ0cyIsImNyZWF0ZVNvdXJjZUZpbGUiLCJTY3JpcHRUYXJnZXQiLCJMYXRlc3QiLCJTY3JpcHRLaW5kIiwiSlMiLCJ2aXNpdCIsIm5vZGUiLCJpc0V4cG9ydEFzc2lnbm1lbnQiLCJpc09iamVjdExpdGVyYWxFeHByZXNzaW9uIiwiZXhwcmVzc2lvbiIsImlzQmluYXJ5RXhwcmVzc2lvbiIsIm9wZXJhdG9yVG9rZW4iLCJraW5kIiwiU3ludGF4S2luZCIsIkVxdWFsc1Rva2VuIiwibGVmdCIsImdldFRleHQiLCJyaWdodCIsImZvckVhY2hDaGlsZCIsImdldE5leHRDb25maWdPYmplY3RMaXRlcmFsIiwicHJvcGVydHlUZXh0cyIsIlNldCIsInByb3BlcnRpZXMiLCJwcm9wZXJ0eSIsImhhcyIsInB1c2giLCJsZW5ndGgiLCJpbnNlcnRpb25Qb2ludCIsImdldEVuZCIsImxhc3RQcm9wZXJ0eSIsImF0IiwiaGFzVHJhaWxpbmdDb21tYSIsInNsaWNlIiwiaW5jbHVkZXMiLCJwcmVmaXgiLCJuZXdDb250ZW50Iiwiam9pbiIsInJ1biIsImRvZXNDb250YWluSnNPclRzIiwiZG9lc0NvbnRhaW5KYXZhU2NyaXB0IiwiZG9lc0NvbnRhaW5KYXZhU2NyaXB0SW5QYWNrYWdlcyIsImRvZXNDb250YWluVHlwZVNjcmlwdCIsImRvZXNDb250YWluVHlwZVNjcmlwdEluUGFja2FnZXMiLCJkb2VzQ29udGFpbkphdmEiLCJkb2VzQ29udGFpbkphdmFJblBhY2thZ2VzIiwiZ2V0UGFja2FnZU1hbmFnZXJDb21tYW5kIiwiaXNCdW4iLCJsaXRlcmFsIiwidmFsdWUiLCJhc09iamVjdCIsImV4dHJhTWVtYmVycyIsInRvUGFyc2VkT2JqZWN0IiwibWVtYmVyT3JkZXIiLCJPYmplY3QiLCJrZXlzIiwia2V5IiwiXyIsImluZGV4IiwiZml4UGxheXdyaWdodENvbmZpZyIsImVudkZpbGVQYXRoIiwiZW52RmlsZU5hbWVzIiwiZW52RmlsZVBhdGhzIiwiY3VycmVudERpclBhdGgiLCJmaWxlTmFtZSIsImdldEVudkZpbGVQYXRocyIsInRlc3QiLCJhc3NlcnROZXh0UHVibGljQmFzZVVybCIsImV4dHJhY3RlZE9iamVjdExpdGVyYWwiLCJUUyIsImZvdW5kIiwiaXNDYWxsRXhwcmVzc2lvbiIsImZpcnN0QXJndW1lbnQiLCJhcmd1bWVudHMiLCJ1bmRlZmluZWQiLCJleHRyYWN0RGVmaW5lQ29uZmlnT2JqZWN0TGl0ZXJhbCIsInBhcnNlZCIsInBhcnNlT2JqZWN0TGl0ZXJhbEV4cHJlc3Npb24iLCJtZXJnZWQiLCJtZXJnZVBhcnNlZE9iamVjdHMiLCJmb3JiaWRPbmx5IiwicmV0cmllcyIsInVzZSIsImJhc2VVUkwiLCJ0cmFjZSIsInNjcmVlbnNob3QiLCJ2aWRlbyIsIndlYlNlcnZlciIsImNvbW1hbmQiLCJnZXRXYlN0YXJ0VGVzdENvbW1hbmQiLCJ1cmwiLCJyZXVzZUV4aXN0aW5nU2VydmVyIiwidGltZW91dCIsInN0ZG91dCIsInN0ZGVyciIsImVudiIsImdyYWNlZnVsU2h1dGRvd24iLCJjcmVhdGVEZWZhdWx0Q29uZmlnIiwib2JqZWN0Iiwic2V0V2ViU2VydmVyQ29tbWFuZCIsIm5ld09iamVjdExpdGVyYWwiLCJzdHJpbmdpZnlWYWx1ZSIsInN0YXJ0IiwiZ2V0U3RhcnQiLCJlbmQiLCJiYXNlIiwib3ZlcnJpZGUiLCJvdmVycmlkZVByb3BlcnR5S2V5cyIsImZpbHRlciIsIm1lbWJlciIsImVudHJpZXMiLCJtZXJnZVBhcnNlZFZhbHVlIiwicGFyc2VFeHByZXNzaW9uIiwicGFyc2VkT2JqZWN0IiwiaXNBcnJheUxpdGVyYWxFeHByZXNzaW9uIiwiZWxlbWVudHMiLCJlbGVtZW50Iiwic29tZSIsImlzU2hvcnRoYW5kUHJvcGVydHlBc3NpZ25tZW50IiwiaXNQcm9wZXJ0eUFzc2lnbm1lbnQiLCJpc0lkZW50aWZpZXIiLCJpc1N0cmluZ0xpdGVyYWwiLCJpbml0aWFsaXplciIsImxldmVsIiwiY2xvc2luZ0luZGVudCIsInJlcGVhdCIsImluZGVudCIsIml0ZW0iLCJzdHJpbmdpZmllZCIsInNwbGl0IiwiZW1pdHRlZFByb3BlcnRpZXMiLCJsYXN0UHJvcGVydHlJbmRleEJ5S2V5IiwiTWFwIiwic2V0IiwiZ2V0TGFzdFByb3BlcnR5SW5kZXhCeUtleSIsImxpbmVzIiwiZmxhdE1hcCIsInN0cmluZ2lmeU9iamVjdE1lbWJlciIsImdldCIsImFkZCIsInN0cmluZ2lmeU9iamVjdFByb3BlcnR5IiwibGluZSIsImdsb2JJZ25vcmUiLCJmaXhQcmlzbWFFbnZGaWxlcyIsInNob3VsZEFkZENvbm5lY3Rpb25MaW1pdCIsImRlcGVuZGluZyIsInByaXNtYSIsImRlcGVuZGVuY2llcyIsInBhY2thZ2VKc29uIiwiZGV2RGVwZW5kZW5jaWVzIiwic2hvdWxkQWRkU3FsaXRlQ29ubmVjdGlvbkxpbWl0IiwiZW52RmlsZXMiLCJmZyIsImdsb2IiLCJkb3QiLCJjd2QiLCJpZ25vcmUiLCJlbnZGaWxlIiwicmVwbGFjZUFsbCIsIm1hdGNoIiwibm9ybWFsaXplU3FsaXRlRGF0YWJhc2VVcmwiLCJxdWVyeVN0YXJ0IiwiaW5kZXhPZiIsInBhdGhQYXJ0IiwicXVlcnlQYXJ0IiwicGFyYW1zIiwiVVJMU2VhcmNoUGFyYW1zIiwiZGVsZXRlIiwibm9ybWFsaXplZFF1ZXJ5IiwidG9TdHJpbmciLCJwcm90b3R5cGUiLCJoYXNPd25Qcm9wZXJ0eSIsImNhbGwiLCJzb3J0T2JqZWN0QnlLZXlOYW1lTGlzdCIsInNvcnRXaXRoIiwic29ydEZuIiwidG90YWwiLCJvYmplY3RLZXlzIiwic29ydCIsIklOREVOVF9SRUdFWCIsIklOREVOVF9UWVBFX1NQQUNFIiwic2hvdWxkSWdub3JlU2luZ2xlU3BhY2UiLCJpZ25vcmVTaW5nbGVTcGFjZXMiLCJpbmRlbnRUeXBlIiwibWFrZUluZGVudHNNYXAiLCJzdHJpbmciLCJpbmRlbnRzIiwicHJldmlvdXNJbmRlbnRUeXBlIiwicHJldmlvdXNTaXplIiwibWF0Y2hlcyIsIndlaWdodCIsImluZGVudERpZmZlcmVuY2UiLCJhYnNvbHV0ZUluZGVudERpZmZlcmVuY2UiLCJNYXRoIiwiYWJzIiwiZW5jb2RlSW5kZW50c0tleSIsImVudHJ5IiwiaW5kZW50QW1vdW50IiwiZGV0ZWN0SW5kZW50IiwiVHlwZUVycm9yIiwic2l6ZSIsImtleU9mTW9zdFVzZWRJbmRlbnQiLCJyZXN1bHQiLCJtYXhVc2VkIiwibWF4V2VpZ2h0IiwidXNlZENvdW50IiwiZ2V0TW9zdFVzZWRLZXkiLCJ0eXBlIiwiYW1vdW50IiwiaW5kZW50c0tleSIsIk51bWJlciIsIm1ha2VJbmRlbnRTdHJpbmciLCJkZXRlY3ROZXdsaW5lR3JhY2VmdWwiLCJuZXdsaW5lcyIsImNybGYiLCJuZXdsaW5lIiwiZGV0ZWN0TmV3bGluZSIsInBpcGUiLCJmbnMiLCJ4IiwiYXJncyIsInJlZHVjZSIsIm9uQXJyYXkiLCJBcnJheSIsImlzQXJyYXkiLCJvblN0cmluZ0FycmF5IiwiZXZlcnkiLCJ1bmlxIiwieHMiLCJzb3J0QXJyYXkiLCJhcnJheSIsInRvU29ydGVkIiwidW5pcUFuZFNvcnRBcnJheSIsIm9uT2JqZWN0IiwiZ2V0UHJvdG90eXBlT2YiLCJTeW1ib2wiLCJ0b1N0cmluZ1RhZyIsIml0ZXJhdG9yIiwiaXNQbGFpbk9iamVjdCIsInNvcnRPYmplY3RCeSIsImNvbXBhcmF0b3IiLCJkZWVwIiwib3ZlciIsImZyb21FbnRyaWVzIiwic29ydE9iamVjdEtleXMiLCJvYmplY3RHcm91cEJ5IiwiZ3JvdXBCeSIsImNhbGxiYWNrIiwiY3JlYXRlIiwic29ydE9iamVjdCIsInNvcnRVUkxPYmplY3QiLCJzb3J0UGVvcGxlT2JqZWN0Iiwic29ydERpcmVjdG9yaWVzIiwib3ZlclByb3BlcnR5IiwiaGFzT3duIiwic29ydEdpdEhvb2tzIiwicGFyc2VOYW1lQW5kVmVyc2lvblJhbmdlIiwic3BlY2lmaWVyIiwibmFtZUFuZFZlcnNpb24iLCJhdE1hdGNoZXMiLCJtYXRjaEFsbCIsInNwbGl0SW5kZXgiLCJwb3AiLCJzdWJzdHJpbmciLCJyYW5nZSIsInNvcnRPYmplY3RCeVNlbXZlciIsImEiLCJiIiwiYU5hbWUiLCJhUmFuZ2UiLCJiTmFtZSIsImJSYW5nZSIsImxvY2FsZUNvbXBhcmUiLCJzZW12ZXJDb21wYXJlIiwic2VtdmVyTWluVmVyc2lvbiIsImdldFBhY2thZ2VOYW1lIiwiaWRlbnQiLCJzdGFydHNXaXRoIiwiY2FjaGUiLCJzaG91bGRTb3J0RGVwZW5kZW5jaWVzTGlrZU5wbSIsInBhY2thZ2VNYW5hZ2VyIiwiZGV2RW5naW5lcyIsInBucG0iLCJlbmdpbmVzIiwibnBtIiwicHJvY2VzcyIsImhhc1lhcm5PclBucG1GaWxlcyIsInNvcnREZXBlbmRlbmNpZXMiLCJzb3J0V29ya3NwYWNlcyIsInNvcnRFc2xpbnRDb25maWciLCJvdmVycmlkZXMiLCJydWxlMSIsInJ1bGUyIiwic29ydFZTQ29kZUJhZGdlT2JqZWN0Iiwic29ydFByZXR0aWVyQ29uZmlnIiwic29ydFZvbHRhIiwic29ydERldkVuZ2luZXMiLCJzb3J0UG5wbUNvbmZpZyIsImRlZmF1bHROcG1TY3JpcHRzIiwiaGFzRGV2RGVwZW5kZW5jeSIsImRlcGVuZGVuY3kiLCJydW5TUmVnRXhwIiwiaGFzU2VxdWVudGlhbFNjcmlwdCIsImZpZWxkIiwidmFsdWVzIiwic2NyaXB0IiwiaXNTZXF1ZW50aWFsU2NyaXB0Iiwic29ydFNjcmlwdE5hbWVzIiwiZ3JvdXBNYXAiLCJpZHgiLCJmcm9tIiwiZ3JvdXBLZXkiLCJjaGlsZHJlbiIsImsiLCJzb3J0U2NyaXB0cyIsInNjcmlwdHMiLCJuYW1lcyIsInByZWZpeGFibGUiLCJvbWl0dGVkIiwicmVwbGFjZSIsInNvcnRDb25kaXRpb25zIiwiY29uZGl0aW9ucyIsImRlZmF1bHRDb25kaXRpb25zIiwicmVzdENvbmRpdGlvbnMiLCJjb25kaXRpb24iLCJzb3J0RXhwb3J0cyIsImV4cG9ydHMiLCJwYXRocyIsImZpZWxkcyIsIm1haW50YWluZXJzIiwiY29udHJpYnV0b3JzIiwicGFja2FnZU5hbWVBIiwicGFja2FnZU5hbWVCIiwiYmFkZ2UiLCJkZWZhdWx0U29ydE9yZGVyIiwib3ZlckZpZWxkcyIsIkJvb2xlYW4iLCJzb3J0UGFja2FnZUpzb24iLCJqc29uSXNoIiwianNvbiIsImVuZENoYXJhY3RlcnMiLCJKU09OIiwicGFyc2UiLCJzdHJpbmdpZnkiLCJlZGl0U3RyaW5nSlNPTiIsInNvcnRPcmRlciIsInByaXZhdGVLZXlzIiwicHVibGljS2V5cyIsImZpeFRlc3REaXJlY3Rvcmllc1VwZGF0aW5nUGFja2FnZUpzb24iLCJwYWNrYWdlRGlyUGF0aHMiLCJhbGwiLCJwYWNrYWdlSnNvblBhdGgiLCJwYWNrYWdlRGlyUGF0aCIsIm5ld1Rlc3REaXJQYXRoIiwib2xkVGVzdERpck5hbWUiLCJvbGRUZXN0RGlyUGF0aCIsIm1vdmVUZXN0RGlyZWN0b3J5IiwiZGlkVXBkYXRlU2NyaXB0Iiwic2NyaXB0TmFtZSIsIm5ld1NjcmlwdCIsInJlbmFtZSIsImRpcmVudHMiLCJyZWFkZGlyIiwid2l0aEZpbGVUeXBlcyIsIm9sZFBhdGgiLCJkaXJlbnQiLCJuZXdQYXRoIiwibmV3UGF0aFN0YXQiLCJzdGF0IiwiaXNEaXJlY3RvcnkiLCJybSIsImZpeFR5cGVEZWZpbml0aW9ucyIsImNvbmZpZ3NJbmNsdWRpbmdDaGlsZHJlbiIsImxpYlR5cGVEaXJQYXRoIiwic3JjVHlwZURpclBhdGgiLCJpc1Jvb3QiLCJkb2VzQ29udGFpblN1YlBhY2thZ2VKc29ucyIsImRpck5hbWUiLCJoYXNUeXBlRGVjbGFyYXRpb25FeHRlbnNpb24iLCJlbmRzV2l0aCIsInBhY2thZ2VOYW1lIiwiaGFzTGlicmFyeSIsImlzRmlsZSIsIm92ZXJ3cml0ZU1lcmdlIiwiZGVzdGluYXRpb25BcnJheSIsInNvdXJjZUFycmF5IiwiY29tYmluZU1lcmdlIiwidGFyZ2V0IiwiZGVzdGluYXRpb24iLCJjbG9uZVVubGVzc090aGVyd2lzZVNwZWNpZmllZCIsImlzTWVyZ2VhYmxlT2JqZWN0IiwibWVyZ2UiLCJzb3J0S2V5cyIsIm9iaiIsImtleUFuZFZhbHVlcyIsImtleTEiLCJrZXkyIiwicHVibGljUmVwb0F1dG9maXhXb3JrZmxvdyIsIm9uIiwicHVsbF9yZXF1ZXN0IiwiYnJhbmNoZXMiLCJwZXJtaXNzaW9ucyIsImNvbnRlbnRzIiwiY29uY3VycmVuY3kiLCJncm91cCIsImpvYnMiLCJhdXRvZml4IiwicHJpdmF0ZVJlcG9BdXRvZml4V29ya2Zsb3ciLCJ1c2VzIiwid29ya2Zsb3dzIiwicmVsZWFzZSIsInB1bGxfcmVxdWVzdF90YXJnZXQiLCJ0eXBlcyIsInN5bmMiLCJnZW5lcmF0ZVdvcmtmbG93cyIsInJvb3RDb25maWciLCJpc1JldXNhYmxlV29ya2Zsb3dzUmVwbyIsInJlcG9zaXRvcnkiLCJ3b3JrZmxvd3NQYXRoIiwic2VtYW50aWNZbWxQYXRoIiwiZm9yY2UiLCJpc09ic29sZXRlR2VuUHJXb3JrZmxvd0ZpbGVOYW1lIiwiZmlsZU5hbWVTZXQiLCJzZW1hbnRpY1JlbGVhc2UiLCJiYXNlbmFtZSIsIndyaXRlV29ya2Zsb3dZYW1sIiwiZGVwbG95UHJvZHVjdGlvbldvcmtmbG93RXhpc3RzIiwid3JpdGVZYW1sIiwiaXNQdWJsaWNSZXBvIiwic3RydWN0dXJlZENsb25lIiwic3RlcHMiLCJ3aXRoIiwiYnVpbGQiLCJhdXRvZml4V29ya2Zsb3ciLCJhdXRvZml4Sm9iIiwiZ2VuZXJhdGVBdXRvZml4V29ya2Zsb3ciLCJuZXdTZXR0aW5ncyIsIm9sZFNldHRpbmdzIiwieWFtbCIsImxvYWQiLCJhcnJheU1lcmdlIiwibW92ZVRvQm90dG9tIiwiYWN0aW9ucyIsInRyaWdnZXJfZGVwbG95X3dvcmtmbG93IiwiaXNSZXVzYWJsZVdvcmtmbG93Iiwiam9iIiwibm9ybWFsaXplSm9iIiwic2NoZWR1bGUiLCJicmFuY2giLCJzeW5jX3BhcmFtc193aXRob3V0X2Rlc3QiLCJ3b3JrZmxvd19kaXNwYXRjaCIsInNlY3JldHMiLCJOUE1fVE9LRU4iLCJHSF9UT0tFTiIsIkZJUkVCQVNFX1RPS0VOIiwiR0NQX1NBX0tFWV9KU09OX0ZPUl9GSVJFQkFTRSIsIkRJU0NPUkRfV0VCSE9PS19VUkwiLCJzZXJ2ZXJfdXJsIiwiZG90X2Vudl9wYXRoIiwiRkxZX0FQSV9UT0tFTiIsImRlcGxveV9jb21tYW5kIiwiZG9lc0NvbnRhaW5Eb2NrZXJmaWxlIiwiY2lfbGFiZWwiLCJnaXRodWJfaG9zdGVkX3J1bm5lciIsIm5ld1NlY3JldHMiLCJ5YW1sVGV4dCIsImR1bXAiLCJsaW5lV2lkdGgiLCJub0NvbXBhdE1vZGUiLCJzdHlsZXMiLCJmaXhUeXBvcyIsInBhY2thZ2VDb25maWciLCJkb2NGaWxlcyIsIm1kRmlsZSIsImZpeFR5cG9zSW5UZXh0IiwicmVwbGFjZVdpdGhDb25maWciLCJ0c0ZpbGVzIiwidHNGaWxlIiwiY29tbWVudCIsInRleHRCYXNlZEZpbGVzIiwiZmlsZSIsInByb21pc2VBbGwiLCJwcm9wTmFtZSIsImJlZm9yZSIsImFmdGVyIiwid2JmeUpzb24iLCJ0eXBvcyIsImdlbmVyYXRlQWdlbnRJbnN0cnVjdGlvbnMiLCJhbGxDb25maWdzIiwiYWdlbnRzRXh0cmFQYXRoIiwiZXh0cmFDb250ZW50IiwidG9vbE5hbWUiLCJnZW5lcmF0ZUFnZW50SW5zdHJ1Y3Rpb24iLCJjdXJzb3JSdWxlc1BhdGgiLCJjdXJzb3JSdWxlc0NvbnRlbnQiLCJmcm9udG1hdHRlciIsImJvZHkiLCJnZW5lcmF0ZUN1cnNvckdlbmVyYWxNZGNDb250ZW50IiwiYmFzZUNvbnRlbnQiLCJkZXNjcmlwdGlvbiIsImlzV2lsbEJvb3N0ZXJSZXBvIiwiY29uZmlncyIsInBsYXl3cmlnaHRUZXN0IiwiZ2VuZXJhdGVBZ2VudENvZGluZ1N0eWxlIiwiaGFzTmV3U2VjdGlvbiIsImMiLCJnZW5JMThuVHMiLCJyZWFjdCIsIm5leHQiLCJtaW5pbXVtUmVsZWFzZUFnZUV4Y2x1ZGVzIiwiZ2VuZXJhdGVCdW5maWdUb21sIiwiZXhpc3RpbmdDb250ZW50IiwicmVhZEZpbGVTeW5jIiwiYnVuZmlnVG9tbCIsInBhcnNlQnVuZmlnVG9tbCIsImJ1biIsImdlbmVyYXRlUnVuU2VjdGlvbiIsImluc3RhbGwiLCJleGFjdCIsInVzZXJDb250ZW50SGVhZGVyIiwidXNlckNvbnRlbnRIZWFkZXJSZWdleCIsInNlcGFyYXRvciIsImRlZmF1bHRIZWFkVXNlckNvbnRlbnQiLCJkZWZhdWx0VGFpbFVzZXJDb250ZW50IiwiaWdub3JlRmlsZVV0aWwiLCJzZXBhcmF0b3JQcmVmaXgiLCJyZWFkR2l0aWdub3JlV2l0aG91dFNlcGFyYXRvcnMiLCJsYXN0SGVhZGVySW5kZXgiLCJnZXRJbmRleE9mVGFpbFVzZXJDb250ZW50SGVhZGVyIiwiZ2V0SGVhZFVzZXJDb250ZW50IiwidGhpcyIsImdldFRhaWxVc2VyQ29udGVudCIsImlzQmVycnlaZXJvSW5zdGFsbEVuYWJsZWQiLCJsYXN0SW5kZXgiLCJsYXN0SW5kZXhPZiIsImdlbmVyYXRlRG9ja2VyaWdub3JlIiwiZXh0ZW5zaW9ucyIsImNvZGVXaXRoMkluZGVudFNpemUiLCJjb2RlV2l0aDRJbmRlbnRTaXplIiwibWFya2Rvd25MaWtlIiwib3hsaW50Iiwib3hmbXQiLCJwcmV0dGllck9ubHkiLCJnZW5lcmF0ZUV4dGVuc2lvbnMiLCJnZW5lcmF0ZUVkaXRvcmNvbmZpZyIsImRlZmF1bHRDb25maWciLCJoYXZlX2Z1biIsImNvZGVfcmV2aWV3IiwiZGlzYWJsZSIsImNvbW1lbnRfc2V2ZXJpdHlfdGhyZXNob2xkIiwibWF4X3Jldmlld19jb21tZW50cyIsInB1bGxfcmVxdWVzdF9vcGVuZWQiLCJoZWxwIiwic3VtbWFyeSIsImlnbm9yZV9wYXR0ZXJucyIsImdlbmVyYXRlR2VtaW5pQ29uZmlnIiwiY29uZmlnRmlsZVBhdGgiLCJzdHlsZWd1aWRlRmlsZVBhdGgiLCJuZXdDb25maWciLCJvbGRDb25maWciLCJ5YW1sQ29udGVudCIsImNvZGluZ1J1bGVFeHRyYUNvbnRlbnQiLCJ0cmltU3RhcnQiLCJzdHlsZWd1aWRlQ29udGVudCIsInRyaW1FbmQiLCJyZW1vdmVHZW1pbmlTZXR0aW5ncyIsImdlbmVyYXRlR2l0YXR0cmlidXRlcyIsImRlZmF1bHROYW1lcyIsImdlbmVyYXRlR2l0aWdub3JlIiwiaGVhZFVzZXJDb250ZW50IiwidGFpbFVzZXJDb250ZW50IiwiZG9lc0NvbnRhaW5HZW1maWxlIiwiZG9lc0NvbnRhaW5Hb01vZCIsImRvZXNDb250YWluUGFja2FnZUpzb24iLCJkb2VzQ29udGFpblBvbVhtbCIsImRvZXNDb250YWluUHVic3BlY1lhbWwiLCJkb2VzQ29udGFpblRlbXBsYXRlWWFtbCIsImRvZXNDb250YWluUG9ldHJ5TG9jayIsImRvZXNDb250YWluVXZMb2NrIiwiYmxpdHoiLCJmaXJlYmFzZSIsInJlYWN0TmF0aXZlIiwic3Rvcnlib29rIiwibGl0ZXN0cmVhbSIsImdlbmVyYXRlZCIsInJlYWRDYWNoZSIsInJlc3BvbnNlIiwiZmV0Y2giLCJyZXNwb25zZVRleHQiLCJ0ZXh0Iiwib2siLCJ3cml0ZUNhY2hlIiwib3MiLCJob21lZGlyIiwiRGF0ZSIsIm5vdyIsIm10aW1lTXMiLCJnZW5lcmF0ZUlkZWFTZXR0aW5ncyIsImNyZWF0ZVRhc2tPcHRpb25zIiwiZ2V0V2F0Y2hlclRhc2tzQ29udGVudCIsInJ1bm5lciIsImV4dGVuc2lvbiIsImdldEdlbkkxOG5Uc0NvbW1hbmQiLCJzcGF3blN5bmMiLCJyZXRyeSIsInNwYXduU3luY0FuZFJldHVyblN0YXR1cyIsIm5ld0NtZCIsIm5ld0FyZ3MiLCJnZXRTcGF3blN5bmNBcmdzIiwic3RhdHVzIiwiY2hpbGRfcHJvY2VzcyIsInNwYXduU3luY0FuZFJldHVyblN0ZG91dCIsInN0ZGlvIiwicHJvYyIsInMiLCJtZXNzYWdlIiwiUEFUSCIsIkJFUlJZX0JJTl9GT0xERVIiLCJlbmNvZGluZyIsInNoZWxsIiwiZ2l0SHViVXRpbCIsImdldE9yZ0FuZE5hbWUiLCJ1cmxPckZ1bGxOYW1lIiwidXJsV2l0aG91dFByb3RvY29sIiwib2N0b2tpdENhY2hlIiwiZ2V0T2N0b2tpdCIsIm93bmVyIiwiY2FjaGVkIiwib2N0b2tpdCIsIk9jdG9raXQiLCJhdXRoIiwiZ2V0R2l0SHViVG9rZW4iLCJoYXNHaXRIdWJUb2tlbiIsIkdIX0JPVF9QQVRfRk9SX1dJTExCT09TVEVSIiwiZ2V0R2l0SHViQ2xpVG9rZW4iLCJHSF9CT1RfUEFUX0ZPUl9XSUxMQk9PU1RFUkxBQiIsIkdJVEhVQl9UT0tFTiIsImdpdEh1YkNsaVRva2VuIiwiY2hpbGRQcm9jZXNzIiwiZXhlY0ZpbGVTeW5jIiwibWFuYWdlZFRzY29uZmlnQmFzZURlcGVuZGVuY2llcyIsImlzUHVibGlzaGVkV2lsbGJvb3N0ZXJDb25maWdzUGFja2FnZSIsImlzV2lsbEJvb3N0ZXJDb25maWdzIiwicHJpdmF0ZSIsImZpbGVzIiwib3hsaW50RGVwcyIsInR5cGVzY3JpcHRHb0RlcGVuZGVuY3kiLCJ0eXBlc2NyaXB0RGVwZW5kZW5jeSIsIndiRGVwZW5kZW5jeSIsImJ1aWxkVHNEZXBlbmRlbmN5Iiwid2lsbEJvb3N0ZXJDb25maWdzTWFuYWdlZERlcGVuZGVuY2llcyIsIm9ic29sZXRlTGludERlcGVuZGVuY2llcyIsIm1pY3JvbWF0Y2hQYWNrYWdlTmFtZXMiLCJtaWNyb21hdGNoSW1wb3J0UGF0dGVybiIsImxhdGVzdERlcGVuZGVuY3lWZXJzaW9uQ2FjaGUiLCJkZXBlbmRlbmN5U2VjdGlvbktleXMiLCJnZW5lcmF0ZVBhY2thZ2VKc29uIiwic2tpcEFkZGluZ0RlcHMiLCJqc29uT2JqIiwianNvblRleHQiLCJwZWVyRGVwZW5kZW5jaWVzIiwicmVhZFBhY2thZ2VKc29uIiwiYXV0aG9yIiwic2VjdGlvbiIsImdldERlcGVuZGVuY3lTZWN0aW9ucyIsIlJlZmxlY3QiLCJkZWxldGVQcm9wZXJ0eSIsInJlbW92ZVNlbGZEZXBlbmRlbmN5IiwidmVyc2lvbiIsImlzV29ya3NwYWNlUHJvdG9jb2xSYW5nZSIsImdldExhdGVzdERlcGVuZGVuY3lWZXJzaW9uIiwicmVwbGFjZVdpbGxCb29zdGVyQ29uZmlnc1dvcmtzcGFjZURlcGVuZGVuY3lSYW5nZXMiLCJ0c2xpYiIsImxlcm5hIiwicGluc3QiLCJwcmV0dGllciIsInNlY3Rpb25zIiwicmVtb3ZlV2lsbEJvb3N0ZXJDb25maWdzTWFuYWdlZERlcGVuZGVuY2llcyIsInByZXNlcnZlTWljcm9tYXRjaCIsImZpbGVQYXRocyIsImdsb2JTeW5jIiwiZG9lc1Byb2R1Y3RDb2RlSW1wb3J0TWljcm9tYXRjaCIsInNob3VsZFByZXNlcnZlTWljcm9tYXRjaCIsInNob3VsZFByZXNlcnZlQ29uZmlnUGFja2FnZUxpbnREZXBlbmRlbmN5IiwicmVtb3ZlT2Jzb2xldGVMaW50RGVwZW5kZW5jaWVzIiwicmVtb3ZlRGVwcmVjYXRlZFN0dWZmIiwicmVtb3ZlTGVnYWN5SW5zdGFsbENvbW1hbmRzIiwiZ2VuZXJhdGVTY3JpcHRzIiwicHJldHRpZnkiLCJjYXRjaCIsIm9yaWdpbmFsQ29udGVudCIsIm5ld0xpbmUiLCJsIiwiZ2VuZXJhdGVQcmV0dGllclN1ZmZpeCIsIm5vcm1hbGl6ZVlhcm5Xb3Jrc3BhY2VGb3JlYWNoU2NyaXB0cyIsInVwZGF0ZVNjcmlwdHMiLCJtb3ZlTWFuYWdlZFRvb2xEZXBlbmRlbmNpZXNUb0RldkRlcGVuZGVuY2llcyIsImRlcGVuZGVuY3lVcGRhdGVzIiwicHl0aG9uRGV2RGVwZW5kZW5jaWVzIiwiaGFzSmF2YSIsImRlcGVuZGVuY3lTZWN0aW9ucyIsInJlbW92ZVByZXR0aWVyQXJ0aWZhY3RzIiwiaHVza3kiLCJwb3N0aW5zdGFsbCIsInBvc3RwdWJsaXNoIiwicHJlcHVibGlzaE9ubHkiLCJwcmVwYWNrIiwicG9zdHBhY2siLCJwcmVwYXJlIiwiYXJ0aWxsZXJ5IiwicGxheXdyaWdodCIsIndvcmtzcGFjZXMiLCJ3b3Jrc3BhY2UiLCJpc1diUGFja2FnZSIsIndiIiwidHNjb25maWdCYXNlRGVwZW5kZW5jaWVzIiwiZ2V0VHNjb25maWdCYXNlRGVwZW5kZW5jaWVzIiwidXNlZERlcGVuZGVuY2llcyIsInVzZWREZXBlbmRlbmN5U2V0IiwiZXhpc3RpbmdUc2NvbmZpZ0Jhc2VEZXBlbmRlbmNpZXMiLCJhYnNvbHV0ZUZpbGVQYXRoIiwicGFyc2VDb25maWdGaWxlVGV4dFRvSnNvbiIsIndhcm4iLCJmb3JtYXRUc0RpYWdub3N0aWMiLCJub3JtYWxpemVUc2NvbmZpZ0V4dGVuZHMiLCJleHRlbmRzIiwiZ2V0RXhpc3RpbmdUc2NvbmZpZ0Jhc2VEZXBlbmRlbmNpZXMiLCJyZW1vdmVVbnVzZWRUc2NvbmZpZ0Jhc2VEZXBlbmRlbmNpZXMiLCJqZXN0IiwiZGVwIiwiYXBwbHlQYWNrYWdlSnNvbkNvbnZlbnRpb25zIiwibGljZW5zZSIsInB1Ymxpc2hDb25maWciLCJhY2Nlc3MiLCJjb25maWdNanNQYXRoIiwiY29uZmlnRHRzUGF0aCIsImNvbmZpZ0RtdHNDb250ZW50Iiwibm9ybWFsaXplUHVibGlzaGVkQ29uZmlnUGFja2FnZU1ldGFkYXRhIiwibWFpbiIsInJlc29sdXRpb25zIiwibGludCIsImRpcnMiLCJkaXIiLCJmb3JtYXQiLCJhcHBlbmRGb3JtYXRDb2RlQ29tbWFuZCIsInB5dGhvblBhY2thZ2VNYW5hZ2VyIiwiZ2V0UHl0aG9uUGFja2FnZU1hbmFnZXIiLCJweXRob25GaWxlcyIsImRpck5hbWVTZXQiLCJweXRob25GaWxlIiwiZmlyc3QiLCJzZWNvbmQiLCJkaXJOYW1lc1N0ciIsInB5dGhvblJ1bm5lciIsImV4aXN0aW5nUmVwb3NpdG9yeSIsIm5vcm1hbGl6ZWRSZXBvc2l0b3J5Iiwibm9ybWFsaXplUmVwb3NpdG9yeVVybEZvclBhY2thZ2VKc29uIiwiYnVpbGROb3JtYWxpemVkUmVwb3NpdG9yeUZvclBhY2thZ2VKc29uIiwibm9ybWFsaXplZEV4aXN0aW5nUmVwb3NpdG9yeSIsImZvcm1hdFJlcG9zaXRvcnlGb3JQYWNrYWdlSnNvbiIsImFkZEdlbkkxOG5Uc1Bvc3RpbnN0YWxsU2NyaXB0Iiwibm9ybWFsaXplUGFja2FnZU1ldGFkYXRhIiwicGFja2FnZUpzb25EZXBlbmRlbmNpZXMiLCJwYWNrYWdlSnNvbkRldkRlcGVuZGVuY2llcyIsImFkZFBhY2thZ2VKc29uRGVwZW5kZW5jaWVzIiwiYWRkRGVwZW5kZW5jeVZlcnNpb25zVG9QYWNrYWdlSnNvbiIsInBhY2thZ2VOYW1lcyIsInByaXZhdGVQYWNrYWdlcyIsInJlcG8iLCJpc1dvcmtzcGFjZVBhY2thZ2UiLCJvdGhlclRhcmdldCIsImNvbW1pdEhhc2giLCJvcmdhbml6YXRpb24iLCJyZWplY3QiLCJnZXRMYXRlc3RDb21taXRIYXNoIiwiZ2V0TGF0ZXN0UHJpdmF0ZVBhY2thZ2VTcGVjaWZpZXIiLCJ1cGRhdGVQcml2YXRlUGFja2FnZXMiLCJyZW1vdmVFbXB0eURlcGVuZGVuY3lTZWN0aW9ucyIsInNlcmlhbGl6ZVBhY2thZ2VKc29uIiwiaW5zdGFsbE5wbURlcGVuZGVuY2llcyIsImluc3RhbGxEZXBlbmRlbmN5VXBkYXRlcyIsInJlbGF0aXZlRmlsZVBhdGgiLCJyZWxhdGl2ZSIsImZvcm1hdFBhY2thZ2VKc29uV2l0aFByb2plY3RGb3JtYXR0ZXIiLCJjb3JlIiwiZm9ybWF0U2NyaXB0Iiwic2NyaXB0UnVubmVyIiwiZGV2IiwiZGVwZW5kZW5jeVNwZWNpZmllcnMiLCJjdXJyZW50VmVyc2lvbiIsImdldERlcGVuZGVuY3lTcGVjaWZpZXIiLCJnZXRJbnN0YWxsRGVwZW5kZW5jeVNwZWNpZmllciIsImRlcGVuZGVuY2llc1RvSW5zdGFsbCIsInNob3VsZFVwZGF0ZUV4aXN0aW5nRGVwZW5kZW5jeSIsInNob3VsZFVwZGF0ZUV4aXN0aW5nTWFuYWdlZERlcGVuZGVuY3kiLCJkaWFnbm9zdGljIiwiZmxhdHRlbkRpYWdub3N0aWNNZXNzYWdlVGV4dCIsIm1lc3NhZ2VUZXh0IiwiY2FjaGVkVmVyc2lvbiIsImdldERlcGVuZGVuY3lWZXJzaW9uRnJvbU5wbSIsImVzbGludCIsInJlcG9zaXRvcnlVcmwiLCJtYXRjaGVkIiwiZXhlYyIsIm5vcm1hbGl6ZWRVcmwiLCJvbGRTY3JpcHRzIiwiaGFzVHlwZWNoZWNrIiwiY2xlYW51cCIsInR5cGVjaGVjayIsInZlcmlmeSIsImFwcGx5TWlzZVRhc2tTY3JpcHRzIiwicHlyaWdodCIsImhhc0pzT3JUcyIsIm9sZFRlc3QiLCJnZW5lcmF0ZUZvcm1hdFNjcmlwdCIsImhhc01pc2VUYXNrIiwiZG9lc01pc2VUYXNrQ2FsbFBhY2thZ2VTY3JpcHQiLCJpc1diZnlNYW5hZ2VkTWlzZUJyaWRnZSIsIm1pc2VUYXNrcyIsInRhc2siLCJSZWdFeHAiLCJyYXciLCJjb21tYW5kcyIsImJhc2VTZXR0aW5ncyIsImdsb2JfbWF0Y2hlciIsInByZUNvbW1pdFNldHRpbmdzIiwic3RhZ2VfZml4ZWQiLCJnZW5lcmF0ZUxlZnRob29rVXBkYXRpbmdQYWNrYWdlSnNvbiIsImh1c2t5RGlyUGF0aCIsImhhc0h1c2t5RGlyIiwic2V0dGluZ3MiLCJnZXRQcmVDb21taXRKb2JzIiwicHJlUHVzaCIsImxpbnRDb21tYW5kIiwicXVpZXRMaW50Q29tbWFuZCIsImdldFByZVB1c2hTY3JpcHQiLCJta2RpclN5bmMiLCJtb2RlIiwicG9zdE1lcmdlQ29tbWFuZCIsInBvc3RNZXJnZUNvbW1hbmRzIiwiaGFzVmVyc2lvblNldHRpbmdzIiwidG9vbHNDaGFuZ2VkUGF0dGVybiIsImluc3RhbGxDb21tYW5kIiwicm1OZXh0RGlyZWN0b3J5IiwiZ2VuSTE4blRzQ29tbWFuZCIsImdlbmVyYXRlUG9zdE1lcmdlQ29tbWFuZHMiLCJnZXRDbGVhbnVwR2xvYnMiLCJnZXRDbGVhbnVwQ29tbWFuZCIsInN1cHBvcnRlZEV4dGVuc2lvbnMiLCJsb2NhbFdiUGFja2FnZUpzb25QYXRoIiwiaGFzTG9jYWxXYldvcmtzcGFjZSIsImNhblVzZVdiRm9yU3RhZ2VkRmlsZXMiLCJveGxpbnRQYXR0ZXJuIiwib3hmbXRQYXR0ZXJuIiwicHJldHRpZXJQYXR0ZXJuIiwiaGFzUHl0aG9uUGFja2FnZU1hbmFnZXIiLCJnZXRQeXRob25SdW5uZXIiLCJnZW5lcmF0ZUxpbnRzdGFnZWRyYyIsIm5vcm1hbGl6ZUNvbmZpZ0NvbnRlbnQiLCJNYW5hZ2VkQ29uZmlnQmxvY2tzIiwiY29uc3RydWN0b3IiLCJibG9ja05hbWVzIiwibWFya2VyUHJlZml4IiwiZ2V0Q29uZmlnQ29udGVudCIsImhhc01hbmFnZWRCbG9ja3MiLCJyZXBsYWNlTWFuYWdlZEJsb2NrcyIsImRlc2lyZWRDb250ZW50IiwiZ2V0QmxvY2siLCJibG9ja05hbWUiLCJnZXRTdGFydE1hcmtlciIsImdldEVuZE1hcmtlciIsInJlcGxhY2VtZW50IiwiZXh0cmFjdE1hbmFnZWRCbG9jayIsIm5leHRDb250ZW50IiwicmVwbGFjZU1hbmFnZWRCbG9jayIsImdldE1hbmFnZWRCbG9ja1JlZ0V4cCIsInBhdHRlcm4iLCJlc2NhcGVSZWdFeHAiLCJtYW5hZ2VkQ29uZmlnQmxvY2tzIiwiZ2VuZXJhdGVPeGZtdENvbmZpZyIsImxlZ2FjeUpzb25Db25maWdQYXRoIiwiaXNFc21QYWNrYWdlIiwiZ2VuZXJhdGVPeGxpbnRDb25maWciLCJfcm9vdENvbmZpZyIsInNob3VsZFByZXNlcnZlUHVibGlzaGVkTGludGVyQ29uZmlnIiwiZ2VuZXJhdGVQcmV0dGllcmlnbm9yZSIsImdpdGlnbm9yZUZpbGVQYXRoIiwiZ2l0aWdub3JlQ29udGVudCIsImFkZGl0aW9uYWxDb250ZW50IiwidmVudlBhdGgiLCJ2ZW52IiwiZ2VuZXJhdGVQeXJpZ2h0Q29uZmlnSnNvbiIsImdlbmVyYXRlUmVhZG1lIiwiaW5zZXJ0QmFkZ2UiLCJmaWxlTmFtZXMiLCJyZWFkZGlyU3luYyIsImJhZGdlTmFtZSIsInRvVXBwZXJDYXNlIiwicmVtb3ZlR2l0SHViQWN0aW9uc0JhZGdlIiwicmVhZG1lIiwiaSIsImVzY2FwZWRCYWRnZU5hbWUiLCJlc2NhcGVkRmlsZU5hbWUiLCJnZW5lcmF0ZVJlbGVhc2VyYyIsInBsdWdpbnMiLCJwbHVnaW5FbnRyeSIsInBsdWdpbiIsInByZXNldCIsInN1Y2Nlc3NDb21tZW50Q29uZGl0aW9uIiwiZmFpbENvbW1lbnRDb25kaXRpb24iLCJsYWJlbHMiLCJyZWxlYXNlZExhYmVscyIsIiRzY2hlbWEiLCJnZW5lcmF0ZVJlbm92YXRlSnNvbiIsInBhY2thZ2VSdWxlcyIsInJ1bGUiLCJtYXRjaFBhY2thZ2VOYW1lcyIsImVuYWJsZWQiLCJpbnN0YWxsQWdlbnRTa2lsbHMiLCJyb290SnNvbk9iaiIsImNvbXBpbGVyT3B0aW9ucyIsImFsd2F5c1N0cmljdCIsIm5vVW5jaGVja2VkSW5kZXhlZEFjY2VzcyIsImFsbG93U3ludGhldGljRGVmYXVsdEltcG9ydHMiLCJlc01vZHVsZUludGVyb3AiLCJyZXNvbHZlSnNvbk1vZHVsZSIsImltcG9ydEhlbHBlcnMiLCJub0VtaXQiLCJleGNsdWRlIiwiaW5jbHVkZSIsInN1Ykpzb25PYmoiLCJnZW5lcmF0ZVRzY29uZmlnIiwibW9kdWxlUmVzb2x1dGlvbiIsIm5vcm1hbGl6ZU5leHRUc2NvbmZpZ01vZHVsZVNldHRpbmdzIiwiYmFzZVVybCIsImFsaWFzIiwidGFyZ2V0cyIsIm5vcm1hbGl6ZVBhdGhBbGlhc1RhcmdldHMiLCJub3JtYWxpemVOZXh0VHNjb25maWdQYXRoQWxpYXNlcyIsImFkZFNjcmlwdHNJbmNsdWRlRm9yRnJhbWV3b3JrUHJvamVjdCIsImNsZWFudXBMZWdhY3lUc2NvbmZpZ01vZHVsZVNldHRpbmdzIiwiZ2VuZXJhdGVkVHlwZXMiLCJ0eXBlTmFtZXMiLCJ2aXRlc3QiLCJtb2NoYSIsImN5cHJlc3MiLCJnZXRHZW5lcmF0ZWRUeXBlcyIsImdldFRzY29uZmlnRXh0ZW5kcyIsInJvb3REaXIiLCJnZXRSb290RGlyIiwiZG9lc0NvbnRhaW5Kc3hPclRzeCIsImRvZXNDb250YWluSnN4T3JUc3hJblBhY2thZ2VzIiwianN4IiwiYWRkSW5jbHVkZVBhdGgiLCJleGlzdGluZ1R5cGVzIiwiZXhpc3RpbmdFbWl0TWV0YWRhdGEiLCJlbWl0T3B0aW9ucyIsInBpY2tFeGlzdGluZ0VtaXRNZXRhZGF0YSIsImdlbmVyYXRlZEV4dGVuZHMiLCJleGlzdGluZ0V4dGVuZHMiLCJtZXJnZWRFeHRlbmRzIiwibm9ybWFsaXplRXh0ZW5kcyIsInVuaXF1ZUV4dGVuZHMiLCJtZXJnZVRzY29uZmlnRXh0ZW5kcyIsImVtaXREZWNsYXJhdGlvbk9ubHkiLCJyZXdyaXRlUmVsYXRpdmVJbXBvcnRFeHRlbnNpb25zIiwiZW5zdXJlVHNFeHRlbnNpb25FbWl0Q29tcGF0aWJpbGl0eSIsIm1lcmdlZFR5cGVzIiwiZmlsdGVyRXhpc3RpbmdUeXBlcyIsInR5cGVOYW1lIiwidHlwZVJvb3RzIiwiZXhwZXJpbWVudGFsRGVjb3JhdG9ycyIsIm1vZHVsZSIsImRlbGV0ZUxlZ2FjeU1vZHVsZVNldHRpbmdzIiwidG9Mb3dlckNhc2UiLCJ2ZXJiYXRpbU1vZHVsZVN5bnRheCIsIm5vcm1hbGl6ZUNvbW1vbkpzVHNjb25maWdTZXR0aW5ncyIsImlzQWJzb2x1dGUiLCJnZW5lcmF0ZWRUeXBlU2V0IiwiaXNHZW5lcmF0ZWRUZXN0R2xvYmFsVHlwZSIsImV4Y2x1ZGVGaWxlUGF0dGVybnMiLCJnZW5lcmF0ZVZzY29kZVNldHRpbmdzIiwiZXhjbHVkZUZpbGVQYXR0ZXJuIiwiZXhjbHVkZVNldHRpbmciLCJnZW5lcmF0ZVlhcm5yY1ltbCIsInlhcm5yY1ltbFBhdGgiLCJsYXRlc3RWZXJzaW9uIiwiZ2V0TGF0ZXN0VmVyc2lvbiIsIm5ld1ZlcnNpb24iLCJvbGRWZXJzaW9uIiwidmFsaWROZXdWZXJzaW9uIiwic2VtdmVyIiwidmFsaWQiLCJndCIsImlzTmV3ZXJWZXJzaW9uIiwicmVsZWFzZXNQYXRoIiwieWFybnJjUGF0aCIsImRlZmF1bHRTZW12ZXJSYW5nZVByZWZpeCIsIm5vZGVMaW5rZXIiLCJubU1vZGUiLCJucG1NaW5pbWFsQWdlR2F0ZSIsImFwcHJvdmVkR2l0UmVwb3NpdG9yaWVzIiwibnBtUHJlYXBwcm92ZWRQYWNrYWdlcyIsImNvbXByZXNzaW9uTGV2ZWwiLCJpbmplY3RFbnZpcm9ubWVudEZpbGVzIiwiZW5hYmxlR2xvYmFsQ2FjaGUiLCJvcmlnaW5hbExlbmd0aCIsInBsdWdpblBhdGgiLCJnZXRZYXJucmNQcmV0dGllckFyZ3MiLCJzZXR1cExhYmVscyIsInNldHVwTGFiZWwiLCJkZWxldGVMYWJlbCIsImNvbG9yIiwicmVxdWVzdCIsIkRFUFJFQ0FURURfU0VDUkVUX05BTUVTIiwicmVxdWlyZSIsImNyZWF0ZVJlcXVpcmUiLCJzZXR1cFNlY3JldHMiLCJkb3RlbnYiLCJxdWlldCIsInNlY3JldE5hbWUiLCJzZWNyZXRfbmFtZSIsImtleV9pZCIsImtleUlkIiwiZGF0YSIsInNvZGl1bSIsInJlYWR5Iiwic2VjcmV0IiwicmF3S2V5IiwiZnJvbV9iYXNlNjQiLCJiYXNlNjRfdmFyaWFudHMiLCJPUklHSU5BTCIsInJhd1NlYyIsImZyb21fc3RyaW5nIiwiZW5jQnl0ZXMiLCJjcnlwdG9fYm94X3NlYWwiLCJlbmNCYXNlNjQiLCJ0b19iYXNlNjQiLCJlbmNyeXB0ZWRfdmFsdWUiLCJzZXR1cEdpdEh1YlNldHRpbmdzIiwiYmVmb3JlUmV0cnkiLCJoYW5kbGVFcnJvciIsInJldHJ5Q291bnQiLCJyZXRyeUxvZ2dlciIsInNob3VsZFJldHJ5Iiwic2xlZXBNaWxsaXNlY29uZHMiLCJ1cGRhdGVTbGVlcE1pbGxpc2Vjb25kcyIsImZhaWxlZENvdW50Iiwid2l0aFJldHJ5IiwiYWxsb3dfYXV0b19tZXJnZSIsImFsbG93X21lcmdlX2NvbW1pdCIsImFsbG93X3NxdWFzaF9tZXJnZSIsImFsbG93X3JlYmFzZV9tZXJnZSIsImFsbG93X3VwZGF0ZV9icmFuY2giLCJkZWxldGVfYnJhbmNoX29uX21lcmdlIiwic3F1YXNoX21lcmdlX2NvbW1pdF90aXRsZSIsInNxdWFzaF9tZXJnZV9jb21taXRfbWVzc2FnZSIsImhlYWRlcnMiLCJwYWNrYWdlTWFuYWdlclJ1blBsYWNlaG9sZGVyIiwidGVtcGxhdGVzIiwiZ2VuZXJhdGVHaXRIdWJUZW1wbGF0ZXMiLCJhcHBseVBhY2thZ2VNYW5hZ2VyVGVtcGxhdGUiLCJkaXN0YW5jZSIsInRlbXBsYXRlIiwicGFja2FnZU1hbmFnZXJDb21tYW5kIiwid2JmeUpzb25TY2hlbWEiLCJ6IiwicmVjb3JkIiwib3B0aW9uYWwiLCJkb2MiLCJnZXRQYWNrYWdlQ29uZmlnIiwiZXNtUGFja2FnZSIsInBhY2thZ2VKc29uVGV4dCIsInJlbGVhc2VCcmFuY2hlcyIsInJlbGVhc2VQbHVnaW5zIiwicmVsZWFzZXJjSnNvblBhdGgiLCJmc3AiLCJmbGF0IiwicmVwb0luZm8iLCJnaXQiLCJzaW1wbGVHaXQiLCJvcmlnaW4iLCJnZXRSZW1vdGVzIiwiciIsInJlbW90ZVVybCIsInJlZnMiLCJyZXF1ZXN0UmVwb0luZm8iLCJmZXRjaFJlcG9JbmZvIiwiY3VycmVudCIsImhhc1ZlcnNpb25TZXR0aW5nc0ZpbGUiLCJkb2NrZXJmaWxlIiwid2JmeUpzb25QYXRoIiwid2JmeUpzb25UZXh0IiwicmVwb0Z1bGxOYW1lIiwiZnVsbF9uYW1lIiwicmVwb0F1dGhvciIsInJlcG9OYW1lIiwicmVwb1BhcnRzIiwiaXNSZWZlcnJlZEJ5T3RoZXJSZXBvIiwiY29udGFpbnNBbnkiLCJkb2VzQ29udGFpblZzY29kZVNldHRpbmdzSnNvbiIsImdpdGh1YiIsInJlYWRNaXNlVGFza3MiLCJ0YXNrcyIsInRvbWwiLCJyZWFkTWlzZVRhc2tDb21tYW5kIiwib3JnIiwicmVkaXJlY3RlZEZ1bGxOYW1lIiwibG9jYXRpb24iLCJnZXRSZWRpcmVjdGVkUmVwb0Z1bGxOYW1lIiwicmVmcmVzaEJ1bkxvY2siLCJyb290RGlyUGF0aCIsImFyZ3YiLCJ5YXJncyIsInBvc2l0aW9uYWwiLCJkZXNjcmliZSIsImRlZmF1bHQiLCJza2lwRGVwcyIsInZlcmJvc2UiLCJwYWNrYWdlSnNvbkRpciIsIlVSTCIsInBhdGhuYW1lIiwiZ2V0VmVyc2lvbiIsInN0cmljdCIsImhhc0ludmFsaWRQYWNrYWdlQ29uZmlnIiwicGFja2FnZXNEaXJQYXRoIiwic3ViRGlyUGF0aHMiLCJkIiwiYWJicmV2aWF0aW9uUHJvbWlzZSIsInN1YlBhY2thZ2VDb25maWdzIiwic3ViRGlyUGF0aCIsImFsbFBhY2thZ2VDb25maWdzIiwic2hvdWxkUnVuV29ya2Zsb3dzIiwidGhlbiIsImV4aXRDb2RlIl0sIm1hcHBpbmdzIjoiOHBCQUFPQSxlQUFlQyxFQUFNQyxHQUMxQixPQUFPLElBQUlDLFFBQVNDLEdB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