build-ts 17.1.28 → 17.1.30
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +27 -3
- package/babel.config.mjs +17 -52
- package/dist/index.js +2 -2
- package/package.json +15 -30
package/README.md
CHANGED
|
@@ -7,7 +7,7 @@ An opinionated tool for building a Node.js app and library written in TypeScript
|
|
|
7
7
|
|
|
8
8
|
## Features
|
|
9
9
|
|
|
10
|
-
- Builder / Bundler (`
|
|
10
|
+
- Builder / Bundler (`rolldown` wrapper)
|
|
11
11
|
- [x] `build-ts app`
|
|
12
12
|
- [x] Bundle TypeScript code as Node.js application
|
|
13
13
|
- [x] `build-ts functions`
|
|
@@ -15,11 +15,35 @@ An opinionated tool for building a Node.js app and library written in TypeScript
|
|
|
15
15
|
- [x] Generate optimized `package.json` for Functions
|
|
16
16
|
- [x] `build-ts lib`
|
|
17
17
|
- [x] Bundle TypeScript code as Node.js / Pure JavaScript / React Library
|
|
18
|
-
- [x] Remove `console
|
|
19
|
-
- Executor (`
|
|
18
|
+
- [x] Remove global `console` calls automatically without Babel
|
|
19
|
+
- Executor (`tsx` wrapper)
|
|
20
20
|
- [x] `build-ts run <TypeScript file>`
|
|
21
21
|
- [x] Run TypeScript code as Node.js script
|
|
22
22
|
|
|
23
|
+
## Build Toolchain
|
|
24
|
+
|
|
25
|
+
`build-ts` uses `rolldown` as the bundler. It no longer depends on Rollup or Rollup plugins for normal builds.
|
|
26
|
+
|
|
27
|
+
The build pipeline keeps Babel out of the hot path as much as possible:
|
|
28
|
+
|
|
29
|
+
- JavaScript and TypeScript bundling is handled by Rolldown.
|
|
30
|
+
- Declaration files are generated by `tsgo`.
|
|
31
|
+
- Global `console` removal is implemented as a Rolldown plugin using Oxc parsing, not `babel-plugin-transform-remove-console`.
|
|
32
|
+
- Babel is still used only for features that currently require it, such as `core-js` polyfill injection or decorator transforms.
|
|
33
|
+
|
|
34
|
+
## Console Removal
|
|
35
|
+
|
|
36
|
+
`build-ts app`, `build-ts functions`, and `build-ts lib` remove global `console` calls during production builds by default. The build command sets `NODE_ENV=production` when `NODE_ENV` is not already set.
|
|
37
|
+
|
|
38
|
+
The restored behavior follows the previous Babel-based `transform-remove-console` behavior:
|
|
39
|
+
|
|
40
|
+
- In `production`, `console.log`, `console.debug`, and other non-excluded global console methods are removed. `console.error`, `console.info`, and `console.warn` are preserved.
|
|
41
|
+
- In `test`, `console.log` and other non-excluded methods are removed. `console.debug`, `console.error`, `console.info`, and `console.warn` are preserved.
|
|
42
|
+
- If `NODE_ENV` is set to another value, console removal is disabled.
|
|
43
|
+
- Local bindings named `console` are preserved, including function parameters, imports, `let`/`const`/`var`, classes, namespaces, switch scopes, and other shadowing forms.
|
|
44
|
+
|
|
45
|
+
There is no `--drop-console` option. Console removal is controlled by `NODE_ENV` to preserve the historical behavior.
|
|
46
|
+
|
|
23
47
|
## Node.js Application
|
|
24
48
|
|
|
25
49
|
`npx build-ts app [project path]`, e.g.,
|
package/babel.config.mjs
CHANGED
|
@@ -2,7 +2,14 @@ import fs from 'node:fs';
|
|
|
2
2
|
import path from 'node:path';
|
|
3
3
|
import url from 'node:url';
|
|
4
4
|
|
|
5
|
-
|
|
5
|
+
import pluginProposalDecorators from '@babel/plugin-proposal-decorators';
|
|
6
|
+
import pluginTransformExplicitResourceManagement from '@babel/plugin-transform-explicit-resource-management';
|
|
7
|
+
import presetEnv from '@babel/preset-env';
|
|
8
|
+
import presetReact from '@babel/preset-react';
|
|
9
|
+
import presetTypescript from '@babel/preset-typescript';
|
|
10
|
+
import pluginPolyfillCorejs3 from 'babel-plugin-polyfill-corejs3';
|
|
11
|
+
|
|
12
|
+
/** @type {import('@babel/core').InputOptions} */
|
|
6
13
|
const config = {
|
|
7
14
|
assumptions: {
|
|
8
15
|
constantReexports: true,
|
|
@@ -19,59 +26,17 @@ const config = {
|
|
|
19
26
|
setPublicClassFields: true,
|
|
20
27
|
superIsCallableConstructor: true,
|
|
21
28
|
},
|
|
22
|
-
presets: [
|
|
23
|
-
[
|
|
24
|
-
'@babel/preset-env',
|
|
25
|
-
{
|
|
26
|
-
bugfixes: true,
|
|
27
|
-
},
|
|
28
|
-
],
|
|
29
|
-
'@babel/typescript',
|
|
30
|
-
],
|
|
29
|
+
presets: [[presetEnv, {}], presetTypescript],
|
|
31
30
|
plugins: [
|
|
32
|
-
|
|
33
|
-
'@babel/plugin-syntax-import-attributes',
|
|
34
|
-
// cf. https://babeljs.io/blog/2023/05/26/7.22.0#explicit-resource-management-15633-15520
|
|
35
|
-
'@babel/plugin-proposal-explicit-resource-management',
|
|
31
|
+
pluginTransformExplicitResourceManagement,
|
|
36
32
|
// cf. https://babeljs.io/blog/2024/02/28/7.24.0#decorators-updates-16242
|
|
37
33
|
[
|
|
38
|
-
|
|
34
|
+
pluginProposalDecorators,
|
|
39
35
|
{
|
|
40
36
|
version: '2023-11',
|
|
41
37
|
},
|
|
42
38
|
],
|
|
43
|
-
...(process.env.BUILDTS_USE_BABLE_RUNTIME ? ['@babel/plugin-transform-runtime'] : []),
|
|
44
39
|
],
|
|
45
|
-
env: {
|
|
46
|
-
production: {
|
|
47
|
-
plugins: [
|
|
48
|
-
[
|
|
49
|
-
'transform-remove-console',
|
|
50
|
-
{
|
|
51
|
-
exclude: ['error', 'info', 'warn'],
|
|
52
|
-
},
|
|
53
|
-
],
|
|
54
|
-
],
|
|
55
|
-
},
|
|
56
|
-
test: {
|
|
57
|
-
plugins: [
|
|
58
|
-
[
|
|
59
|
-
'transform-remove-console',
|
|
60
|
-
{
|
|
61
|
-
exclude: ['error', 'info', 'warn', 'debug'],
|
|
62
|
-
},
|
|
63
|
-
],
|
|
64
|
-
],
|
|
65
|
-
presets: [
|
|
66
|
-
[
|
|
67
|
-
'@babel/preset-env',
|
|
68
|
-
{
|
|
69
|
-
modules: 'auto',
|
|
70
|
-
},
|
|
71
|
-
],
|
|
72
|
-
],
|
|
73
|
-
},
|
|
74
|
-
},
|
|
75
40
|
};
|
|
76
41
|
|
|
77
42
|
if (process.env.BUILD_TS_COREJS || process.env.BUILD_TS_COREJS_WITH_PROPOSALS) {
|
|
@@ -81,19 +46,19 @@ if (process.env.BUILD_TS_COREJS || process.env.BUILD_TS_COREJS_WITH_PROPOSALS) {
|
|
|
81
46
|
const proposals = process.env.BUILD_TS_COREJS_WITH_PROPOSALS ? { proposals: true } : {};
|
|
82
47
|
|
|
83
48
|
if (process.env.BUILD_TS_TARGET_CATEGORY === 'app') {
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
49
|
+
config.plugins.push([
|
|
50
|
+
pluginPolyfillCorejs3,
|
|
51
|
+
{ method: 'usage-global', version: `${major}.${minor}`, ...proposals },
|
|
52
|
+
]);
|
|
88
53
|
} else if (process.env.BUILD_TS_TARGET_CATEGORY === 'lib') {
|
|
89
54
|
// cf. https://github.com/babel/babel-polyfills#injection-methods
|
|
90
|
-
config.plugins.push([
|
|
55
|
+
config.plugins.push([pluginPolyfillCorejs3, { method: 'usage-pure', version: `${major}.${minor}`, ...proposals }]);
|
|
91
56
|
}
|
|
92
57
|
}
|
|
93
58
|
|
|
94
59
|
if (process.env.BUILD_TS_TARGET_DETAIL === 'lib-react') {
|
|
95
60
|
config.presets.push([
|
|
96
|
-
|
|
61
|
+
presetReact,
|
|
97
62
|
{
|
|
98
63
|
runtime: 'automatic',
|
|
99
64
|
},
|
package/dist/index.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import e from"node:fs";import n from"node:path";import{readAndApplyEnvironmentVariables as o,yargsOptionsBuilderForEnv as s,removeNpmAndYarnEnvironmentVariables as t}from"@willbooster/shared-lib-node";import i from"yargs";import{hideBin as r}from"yargs/helpers";import a from"chalk";import c from"date-time";import p from"pretty-ms";import{rollup as l,watch as d}from"rollup";import{onExit as u}from"signal-exit";import m from"node:url";import{babel as f}from"@rollup/plugin-babel";import*as y from"@rollup/plugin-commonjs";import*as h from"@rollup/plugin-json";import*as b from"@rollup/plugin-node-resolve";import*as j from"@rollup/plugin-replace";import*as g from"@rollup/plugin-terser";import*as v from"rollup-plugin-analyzer";import{keepImport as w}from"rollup-plugin-keep-import";import{nodeExternals as x}from"rollup-plugin-node-externals";import S from"rollup-plugin-preserve-directives";import{string as k}from"rollup-plugin-string";import $ from"node:process";import*as T from"node:child_process";import{createRequire as D}from"node:module";let O;function E(e,n){return O||(O=o(e,n),e.verbose&&console.info("Loaded env vars:",Object.keys(O))),O}function _(e,n){const o={},s=new Set([...(e.inline??[]).flatMap(e=>e.toString().split(",")),...e.autoInline?Object.keys(E(e,n)):[]]);for(const e of s)void 0!==process.env[e]&&(o[`process.env.${e}`]=JSON.stringify(process.env[e]));return e.verbose&&console.info("Inline env vars:",Object.keys(o)),o}const F=["app","functions","lib"];async function R(o){const s=n.join(o,"package.json");try{const n=await e.promises.readFile(s,"utf8");return[JSON.parse(n),s]}catch{}return[void 0,s]}const B={...s,silent:{description:"Whether watch mode is enabled or not",type:"boolean",alias:"s"}},N={...B,input:{description:'Paths of source code files to be built. The first file is main. If no option is given, "src/index.{ts,tsx}" from package directory is targeted.',type:"array",alias:"i"},"core-js":{description:"Whether or not core-js is employed.",type:"boolean",default:!1},"core-js-proposals":{description:"Whether or not core-js with proposals support is employed.",type:"boolean",default:!1},minify:{description:"Whether or not minification is enabled.",type:"boolean",default:!0},sourcemap:{description:"Whether or not sourcemap is enabled.",type:"boolean",default:!0},external:{description:"Additional external dependencies.",type:"array"},inline:{description:"Environment variables to be inlined.",type:"array"},"auto-inline":{description:"Inline environment variables defined at env files.",type:"boolean",default:!1},watch:{description:"Whether watch mode is enabled or not",type:"boolean",alias:"w"},keepImport:{description:"Identifiers to be kept as import statements.",type:"array"},bundleBuiltins:{description:"Module names same with builtins (e.g., undici) to be bundled.",type:"array"}},I={...N,moduleType:{description:"esm, cjs, or either (default).",type:"string",alias:"m"}},L={...I,onlyPackageJson:{description:"Whether to generate only package.json.",type:"boolean"}},A={...N,moduleType:{description:"esm, cjs, either, or both (default).",type:"string",alias:"m"},jsExtension:{description:"Whether to use .js in cjs and/or esm: either (default), both, or none.",type:"string",alias:"j"}};function W(o,s,t,i,r,a){const c=[...o.external??[]].map(e=>e.toString());if(t.dependencies?.["@prisma/client"]&&c.push("prisma-client"),c.push(...Object.keys(t.dependencies??{}),...Object.keys(t.peerDependencies??{}),...Object.keys(t.optionalDependencies??{})),e.existsSync(n.join("..","..","package.json"))){const o=e.readdirSync(n.join(".."),{withFileTypes:!0});for(const s of o){if(!s.isDirectory())continue;const o=n.join("..",s.name,"package.json");if(!e.existsSync(o))continue;const i=JSON.parse(e.readFileSync(o,"utf8"));t.dependencies?.[i.name??""]&&c.push(...Object.keys(i.dependencies??{}),...Object.keys(i.peerDependencies??{}),...Object.keys(i.optionalDependencies??{}))}}const p=[".cjs",".mjs",".js",".jsx",".json",".cts",".mts",".ts",".tsx"],l=n.join(m.fileURLToPath(n.dirname(n.dirname(import.meta.url))),"babel.config.mjs"),d=J(j),u=J(h),$=J(b),T=J(y),D=J(g),O=J(v),E=[d({delimiters:["",""],preventAssignment:!0,values:_(o,r)}),u(),x({deps:!0,devDeps:!1,peerDeps:!0,optDeps:!0,include:c.map(e=>new RegExp(`^${e}(?:\\/.+)?`)),exclude:U(s)&&i&&new RegExp(`^@?${i}(?:\\/.+)?`)}),$({extensions:p,preferBuiltins:e=>!o.bundleBuiltins?.includes(e)}),T(),w({moduleNames:o.keepImport?.map(e=>e.toString())??[]})],F="app-node"===s||"functions"===s||!c.includes("@babel/runtime");return process.env.BUILDTS_USE_BABLE_RUNTIME=F?"":"1",E.push(f({configFile:l,extensions:p,babelHelpers:F?"bundled":"runtime",exclude:/^(.+\/)?node_modules\/.+$/}),...a.some(e=>e.preserveModules)?[S()]:[],k({include:["**/*.csv","**/*.txt"]})),o.minify&&E.push(D({compress:{directives:!1}})),E.push(O({summaryOnly:!0})),E}function U(e){return"app-node"===e||"functions"===e}function J(e){return e.default}const P=D(import.meta.url);async function C(o,s){const t=G(s);if(!t)throw new Error(`Failed to find tsconfig.json in ${s}.`);o.verbose&&console.info("Found tsconfig.json:",t);const i=[];let r=n.join("dist",n.basename(s),"src");if(e.existsSync(r)){const o=n.dirname(s),t=await e.promises.readdir(o,{withFileTypes:!0});s=n.resolve(s);for(const r of t){if(!r.isDirectory())continue;const t=n.resolve(o,r.name);if(t===s)continue;const a=G(t),c=n.join("dist",r.name,"src");a&&e.existsSync(c)&&i.push([t,a,c])}}else r="dist";i.push([s,t,r]);let a=!0;for(const[e,t,r]of i)a&&=await M(o,e,t,n.join(s,r));return a}async function M(o,s,t,i){o.verbose&&console.info("runTypeScriptNative()",s,t,i);const r=n.dirname(t),a=n.join(r,`.build-ts-tsgo.${process.pid}.${Date.now()}.json`);try{await e.promises.writeFile(a,JSON.stringify(await async function(o,s,t){const i={declaration:!0,emitDeclarationOnly:!0,noEmit:!1,noEmitOnError:!0,outDir:t,rootDir:"src"};if(await V(n.join(o,"src"))){const s=await async function(n){try{return(await e.promises.readdir(n,{withFileTypes:!0})).filter(e=>e.isDirectory()).map(e=>e.name)}catch{return[]}}(n.join(o,"node_modules","@types"));s.includes("node")&&(i.types=s)}return{compilerOptions:i,extends:Y(n.dirname(s),s),include:["src/**/*"]}}(s,t,i),void 0,2));const o=T.spawnSync(process.execPath,[H(),"-p",a],{cwd:s,stdio:"inherit"});if(o.error)throw o.error;return 0===o.status}finally{await e.promises.rm(a,{force:!0})}}function G(o){let s=n.resolve(o);for(;;){const o=n.join(s,"tsconfig.json");if(e.existsSync(o))return o;const t=n.dirname(s);if(t===s)return;s=t}}function H(){const e=P.resolve("@typescript/native-preview/package.json");return n.join(n.dirname(e),"bin","tsgo.js")}async function V(o){try{const s=await e.promises.readdir(o,{withFileTypes:!0});for(const t of s){const s=n.join(o,t.name);if(t.isDirectory()){if(await V(s))return!0}else if(/\.[cm]?tsx?$/.test(t.name)&&(await e.promises.readFile(s,"utf8")).includes("node:"))return!0}}catch{return!1}return!1}function Y(e,o){const s=n.relative(e,o).replaceAll(n.sep,"/");return s.startsWith(".")?s:`./${s}`}const z={command:"app [package]",describe:"Build an app",builder:I,handler:async e=>Q(e,"app")},q={command:"functions [package]",describe:"Build a GCP/Firebase functions app",builder:L,async handler(e){if(!e.onlyPackageJson)return Q(e,"functions");{const o=n.resolve(e.package?.toString()??"."),[s,t]=await R(o);s||(console.error(`Failed to parse package.json (${t}).`),process.exit(1)),await Z(o,s,e.moduleType)}}},K={command:"lib [package]",describe:"Build a Node.js / React library",builder:A,handler:async e=>Q(e,"lib")};async function Q(o,s){process.env.NODE_ENV||="production";const t=!o.silent&&o.verbose,i=process.cwd(),r=n.resolve(o.package?.toString()??"."),[m,f]=await R(r);m||(console.error(`Failed to parse package.json (${f}).`),process.exit(1)),E(o,r);const y=function(o,s,t){if(o.input&&o.input.length>0)return o.input.map(e=>n.resolve(s,e.toString()));const i=n.join(t,"src");for(const o of["ts","tsx","cts","mts"]){const s=n.join(i,`index.${o}`);if(e.existsSync(s))return[s]}console.error("Failed to detect input file."),process.exit(1)}(o,i,r),h=function(e,o,s){switch(e){case"app":return"app-node";case"functions":return"functions";case"lib":return o.some(e=>e.endsWith(".tsx"))||function(e){const o=n.join(e,"src");return X(o)}(s)?"lib-react":"lib";default:console.error("target option must be one of: "+F.join(", ")),process.exit(1)}}(s,y,r);t&&(console.info("argv:",o),console.info("packageJsonPath:",f),console.info("Target (Category):",`${h} (${s})`));const[b]=function(e){const n=e.name?.toString()??"",o=/@([^/]+)\/(.+)/.exec(n),[,s,t]=o??[];return[s,t]}(m),j="module"===m.type;o["core-js"]?process.env.BUILD_TS_COREJS="1":o["core-js-proposals"]&&(process.env.BUILD_TS_COREJS_WITH_PROPOSALS="1"),t&&(process.env.BUILD_TS_VERBOSE="1"),process.env.BUILD_TS_TARGET_CATEGORY=s,process.env.BUILD_TS_TARGET_DETAIL=h;const g=function(e,o,s,t){const i=n.join(s,"dist");if("app-node"===o||"functions"===o)return[{dir:i,format:ee(t,e.moduleType)?"module":"commonjs",sourcemap:e.sourcemap&&"inline"}];const r=[],a=e.moduleType||"both",c=e.jsExtension||"either";("cjs"===a||"both"===a||"either"===a&&!t)&&r.push({dir:i,entryFileNames:"both"===c||"either"===c&&!t?"[name].js":"[name].cjs",format:"commonjs",preserveModules:!0,preserveModulesRoot:n.join(s,"src"),sourcemap:e.sourcemap});("esm"===a||"both"===a||"either"===a&&t)&&r.push({dir:i,entryFileNames:"both"===c||"either"===c&&t?"[name].js":"[name].mjs",format:"module",preserveModules:!0,preserveModulesRoot:n.join(s,"src"),sourcemap:e.sourcemap});return r}(o,h,r,j);t&&console.info("OutputOptions:",g),0===g.length&&(console.error("Failed to detect output files."),process.exit(1)),process.chdir(r),await e.promises.rm(n.join(r,"dist"),{recursive:!0,force:!0}),"functions"===h&&await Z(r,m,o.moduleType);const v={input:"functions"===h?Object.fromEntries(y.map((e,o)=>[0===o?"index":n.basename(e,n.extname(e)),e])):y,plugins:W(o,h,m,b,r,g),watch:o.watch?{clearScreen:!1}:void 0},w=e=>(Array.isArray(e)?e:[e]).map(e=>n.relative(r,e));if(o.watch)!function(e,n,o,s,t,i){const r=d({...s,output:t}),l=async e=>{process.removeListener("uncaughtException",l),process.stdin.removeListener("end",l),r&&await r.close(),e&&process.exit(e)};u(l),process.on("uncaughtException",l),process.stdin.isTTY||(process.stdin.on("end",l),process.stdin.resume());r.on("event",async s=>{switch(s.code){case"ERROR":!function(e,n=!1){const o=e.name||e.cause?.name,s=o?`${o}: `:"",t=`${e.plugin?`(plugin ${e.plugin}) `:""}${s}${e.message}`,i=[a.bold(a.red(`[!] ${a.bold(t.toString())}`))];e.url&&i.push(a.cyan(e.url)),e.loc?i.push(`${e.loc.file||e.id} (${e.loc.line}:${e.loc.column})`):e.id&&i.push(e.id),e.frame&&i.push(a.dim(e.frame)),e.stack&&i.push(a.dim(e.stack?.replace(`${s}${e.message}\n`,""))),i.push("",""),console.error(i.join("\n")),n||$.exit(1)}(s.error,!0);break;case"BUNDLE_START":{if(e.silent)break;const n=s.input,t=[];"string"==typeof n?t.push(n):t.push(...Array.isArray(n)?n:Object.values(n)),console.info(a.cyan(`Bundles ${a.bold(i(t).join(", "))} → ${a.bold(i(s.output).join(", "))}\non ${o} ...`));break}case"BUNDLE_END":if(e.silent)break;console.info(a.green(`Created ${a.bold(i(s.output).join(", "))} in ${a.bold(p(s.duration))}`)),"app-node"!==n&&"functions"!==n&&await C(e,o);break;case"END":if(e.silent)break;console.info(`\n[${c()}] waiting for changes...`)}"result"in s&&s.result&&s.result.close()})}(o,h,r,v,g,w);else{let e;o.silent||console.info(a.cyan(`Bundles ${a.bold(w(y).join(", "))} → ${a.bold(w(g.map(e=>e.file||e.dir||"")).join(", "))}\non ${r} ...`));let n=!1;try{const n=Date.now(),s=await l(v);e=s,await Promise.all(g.map(e=>s.write(e))),o.silent||console.info(a.green(`Created ${w(g.map(e=>e.file||e.dir||"")).join(", ")} in ${a.bold(p(Date.now()-n))}`))}catch(e){n=!0,console.error("Failed to build due to:",e)}await(e?.close()),n&&process.exit(1),"app-node"===h||"functions"===h||await C(o,r)||process.exit(1)}}function X(o){try{return e.readdirSync(o,{withFileTypes:!0}).some(e=>{const s=n.join(o,e.name);return e.isDirectory()?X(s):e.isFile()&&e.name.endsWith(".tsx")})}catch{return!1}}async function Z(o,s,t){s.name+="-dist";const i="module"===s.type,r=ee(i,t);s.main=i===r?"index.js":r?"index.mjs":"index.cjs",delete s.scripts,delete s.devDependencies,await e.promises.mkdir(n.join(o,"dist"),{recursive:!0}),await e.promises.writeFile(n.join(o,"dist","package.json"),JSON.stringify(s))}function ee(e,n){return"esm"===n||(!n||"either"===n)&&e}const ne={command:"run <file>",describe:"Run script",builder:{...B,module:{description:"A module type: cjs or esm",type:"string",alias:"m"},watch:{description:"Whether watch mode is enabled or not",type:"boolean",alias:"w"}},handler(e){E(e,process.cwd());const n=e.file?.toString()??"",o=process.versions.bun,s=o?"bun":"node",t=o?["--bun"]:["--no-warnings","--import","tsx"];e.watch&&t.push("--watch"),t.push(n);const[,...i]=e._,r=[...t,...i.map(e=>e.toString())];e.verbose&&console.info(`Running '${s} ${r.join(" ")}'`);const a=T.spawnSync(s,r,{stdio:"inherit",env:{...process.env}});process.exit(a.status??1)}};t(process.env),await i(r(process.argv)).scriptName("build-ts").options(B).command(z).command(q).command(K).command(ne).demandCommand().strict().version(function(){let o=n.dirname(new URL(import.meta.url).pathname);for(;!e.existsSync(n.join(o,"package.json"));)o=n.dirname(o);return JSON.parse(e.readFileSync(n.join(o,"package.json"),"utf8")).version}()).help().argv;
|
|
2
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VzIjpbIi4uL3NyYy9lbnYudHMiLCIuLi9zcmMvdHlwZXMudHMiLCIuLi9zcmMvdXRpbHMudHMiLCIuLi9zcmMvc2hhcmVkT3B0aW9uc0J1aWxkZXIudHMiLCIuLi9zcmMvY29tbWFuZHMvYnVpbGQvYnVpbGRlci50cyIsIi4uL3NyYy9jb21tYW5kcy9idWlsZC9wbHVnaW4udHMiLCIuLi9zcmMvY29tbWFuZHMvYnVpbGQvdHlwZVNjcmlwdC50cyIsIi4uL3NyYy9jb21tYW5kcy9idWlsZC9idWlsZC50cyIsIi4uL3NyYy9jb21tYW5kcy9idWlsZC9yb2xsdXBMb2dnZXIudHMiLCIuLi9zcmMvY29tbWFuZHMvcnVuLnRzIiwiLi4vc3JjL2luZGV4LnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IHJlYWRBbmRBcHBseUVudmlyb25tZW50VmFyaWFibGVzIH0gZnJvbSAnQHdpbGxib29zdGVyL3NoYXJlZC1saWItbm9kZSc7XG5cbmltcG9ydCB0eXBlIHsgYnVpbGRlciB9IGZyb20gJy4vY29tbWFuZHMvYnVpbGQvYnVpbGRlci5qcyc7XG5pbXBvcnQgdHlwZSB7IHNoYXJlZE9wdGlvbnNCdWlsZGVyIH0gZnJvbSAnLi9zaGFyZWRPcHRpb25zQnVpbGRlci5qcyc7XG5pbXBvcnQgdHlwZSB7IEFyZ3VtZW50c1R5cGUgfSBmcm9tICcuL3R5cGVzLmpzJztcblxubGV0IGVudlZhcnM6IFJlY29yZDxzdHJpbmcsIHN0cmluZyB8IHVuZGVmaW5lZD4gfCB1bmRlZmluZWQ7XG5cbi8qKlxuICogVGhpcyBmdW5jdGlvbiBsb2FkcyBlbnZpcm9ubWVudCB2YXJpYWJsZXMgZnJvbSBgLmVudmAgZmlsZXMuXG4gKiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGxvYWRFbnZpcm9ubWVudFZhcmlhYmxlc1dpdGhDYWNoZShcbiAgYXJndjogQXJndW1lbnRzVHlwZTx0eXBlb2Ygc2hhcmVkT3B0aW9uc0J1aWxkZXI+LFxuICBjd2Q6IHN0cmluZ1xuKTogUmVjb3JkPHN0cmluZywgc3RyaW5nIHwgdW5kZWZpbmVkPiB7XG4gIGlmICghZW52VmFycykge1xuICAgIGVudlZhcnMgPSByZWFkQW5kQXBwbHlFbnZpcm9ubWVudFZhcmlhYmxlcyhhcmd2LCBjd2QpO1xuICAgIGlmIChhcmd2LnZlcmJvc2UpIHtcbiAgICAgIGNvbnNvbGUuaW5mbygnTG9hZGVkIGVudiB2YXJzOicsIE9iamVjdC5rZXlzKGVudlZhcnMpKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGVudlZhcnM7XG59XG5cbi8qKlxuICogVGhpcyBmdW5jdGlvbiBjcmVhdGVzIGEgZGVmaW5pdGlvbiBvZiBlbnZpcm9ubWVudCB2YXJpYWJsZXMgdGhhdCB3aWxsIGJlIGluamVjdGVkIGludG8gdGhlIGJ1aWxkLlxuICogKi9cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVFbnZpcm9ubWVudFZhcmlhYmxlc0RlZmluaXRpb24oXG4gIGFyZ3Y6IEFyZ3VtZW50c1R5cGU8dHlwZW9mIGJ1aWxkZXI+LFxuICBjd2Q6IHN0cmluZ1xuKTogUmVjb3JkPHN0cmluZywgc3RyaW5nPiB7XG4gIGNvbnN0IGVudlZhcnNEZWY6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7fTtcbiAgY29uc3QgZW52VmFyTmFtZXMgPSBuZXcgU2V0KFtcbiAgICAuLi4oYXJndi5pbmxpbmUgPz8gW10pLmZsYXRNYXAoKGUpID0+IGUudG9TdHJpbmcoKS5zcGxpdCgnLCcpKSxcbiAgICAuLi4oYXJndi5hdXRvSW5saW5lID8gT2JqZWN0LmtleXMobG9hZEVudmlyb25tZW50VmFyaWFibGVzV2l0aENhY2hlKGFyZ3YsIGN3ZCkpIDogW10pLFxuICBdKTtcbiAgZm9yIChjb25zdCBuYW1lIG9mIGVudlZhck5hbWVzKSB7XG4gICAgaWYgKHByb2Nlc3MuZW52W25hbWVdID09PSB1bmRlZmluZWQpIGNvbnRpbnVlO1xuXG4gICAgZW52VmFyc0RlZltgcHJvY2Vzcy5lbnYuJHtuYW1lfWBdID0gSlNPTi5zdHJpbmdpZnkocHJvY2Vzcy5lbnZbbmFtZV0pO1xuICB9XG4gIGlmIChhcmd2LnZlcmJvc2UpIHtcbiAgICBjb25zb2xlLmluZm8oJ0lubGluZSBlbnYgdmFyczonLCBPYmplY3Qua2V5cyhlbnZWYXJzRGVmKSk7XG4gIH1cbiAgcmV0dXJuIGVudlZhcnNEZWY7XG59XG4iLCJpbXBvcnQgdHlwZSB7IEFyZ3VtZW50c0NhbWVsQ2FzZSwgSW5mZXJyZWRPcHRpb25UeXBlcywgT3B0aW9ucyB9IGZyb20gJ3lhcmdzJztcblxuZXhwb3J0IGNvbnN0IGFsbFRhcmdldENhdGVnb3JpZXMgPSBbJ2FwcCcsICdmdW5jdGlvbnMnLCAnbGliJ10gYXMgY29uc3Q7XG5cbmV4cG9ydCB0eXBlIFRhcmdldENhdGVnb3J5ID0gKHR5cGVvZiBhbGxUYXJnZXRDYXRlZ29yaWVzKVtudW1iZXJdO1xuXG5leHBvcnQgY29uc3QgYWxsVGFyZ2V0RGV0YWlscyA9IFsnYXBwLW5vZGUnLCAnZnVuY3Rpb25zJywgJ2xpYicsICdsaWItcmVhY3QnXSBhcyBjb25zdDtcblxuZXhwb3J0IHR5cGUgVGFyZ2V0RGV0YWlsID0gKHR5cGVvZiBhbGxUYXJnZXREZXRhaWxzKVtudW1iZXJdO1xuXG5leHBvcnQgdHlwZSBBcmd1bWVudHNUeXBlPFQgZXh0ZW5kcyBSZWNvcmQ8c3RyaW5nLCBPcHRpb25zPj4gPSBBcmd1bWVudHNDYW1lbENhc2U8SW5mZXJyZWRPcHRpb25UeXBlczxUPj47XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuaW1wb3J0IHVybCBmcm9tICdub2RlOnVybCc7XG5cbmltcG9ydCB0eXBlIHsgUGFja2FnZUpzb24gfSBmcm9tICd0eXBlLWZlc3QnO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcmVhZFBhY2thZ2VKc29uKGRpclBhdGg6IHN0cmluZyk6IFByb21pc2U8W1BhY2thZ2VKc29uIHwgdW5kZWZpbmVkLCBzdHJpbmddPiB7XG4gIGNvbnN0IHBhY2thZ2VKc29uUGF0aCA9IHBhdGguam9pbihkaXJQYXRoLCAncGFja2FnZS5qc29uJyk7XG4gIHRyeSB7XG4gICAgY29uc3QgcGFja2FnZUpzb25UZXh0ID0gYXdhaXQgZnMucHJvbWlzZXMucmVhZEZpbGUocGFja2FnZUpzb25QYXRoLCAndXRmOCcpO1xuICAgIHJldHVybiBbSlNPTi5wYXJzZShwYWNrYWdlSnNvblRleHQpIGFzIFBhY2thZ2VKc29uLCBwYWNrYWdlSnNvblBhdGhdO1xuICB9IGNhdGNoIHtcbiAgICAvLyBkbyBub3RoaW5nXG4gIH1cbiAgcmV0dXJuIFt1bmRlZmluZWQsIHBhY2thZ2VKc29uUGF0aF07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRCdWlsZFRzUm9vdFBhdGgoKTogc3RyaW5nIHtcbiAgcmV0dXJuIHVybC5maWxlVVJMVG9QYXRoKHBhdGguZGlybmFtZShwYXRoLmRpcm5hbWUoaW1wb3J0Lm1ldGEudXJsKSkpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0TmFtZXNwYWNlQW5kTmFtZShwYWNrYWdlSnNvbjogUGFja2FnZUpzb24pOiBbc3RyaW5nIHwgdW5kZWZpbmVkLCBzdHJpbmcgfCB1bmRlZmluZWRdIHtcbiAgY29uc3QgcGFja2FnZU5hbWUgPSBwYWNrYWdlSnNvbi5uYW1lPy50b1N0cmluZygpID8/ICcnO1xuICBjb25zdCBtYXRjaCA9IC9AKFteL10rKVxcLyguKykvLmV4ZWMocGFja2FnZU5hbWUpO1xuICBjb25zdCBbLCBuYW1lc3BhY2UsIG5hbWVdID0gbWF0Y2ggPz8gW107XG4gIHJldHVybiBbbmFtZXNwYWNlLCBuYW1lXTtcbn1cbiIsImltcG9ydCB7IHlhcmdzT3B0aW9uc0J1aWxkZXJGb3JFbnYgfSBmcm9tICdAd2lsbGJvb3N0ZXIvc2hhcmVkLWxpYi1ub2RlJztcblxuZXhwb3J0IGNvbnN0IHNoYXJlZE9wdGlvbnNCdWlsZGVyID0ge1xuICAuLi55YXJnc09wdGlvbnNCdWlsZGVyRm9yRW52LFxuICBzaWxlbnQ6IHtcbiAgICBkZXNjcmlwdGlvbjogJ1doZXRoZXIgd2F0Y2ggbW9kZSBpcyBlbmFibGVkIG9yIG5vdCcsXG4gICAgdHlwZTogJ2Jvb2xlYW4nLFxuICAgIGFsaWFzOiAncycsXG4gIH0sXG59IGFzIGNvbnN0O1xuIiwiaW1wb3J0IHsgc2hhcmVkT3B0aW9uc0J1aWxkZXIgfSBmcm9tICcuLi8uLi9zaGFyZWRPcHRpb25zQnVpbGRlci5qcyc7XG5cbmV4cG9ydCBjb25zdCBidWlsZGVyID0ge1xuICAuLi5zaGFyZWRPcHRpb25zQnVpbGRlcixcbiAgaW5wdXQ6IHtcbiAgICBkZXNjcmlwdGlvbjpcbiAgICAgICdQYXRocyBvZiBzb3VyY2UgY29kZSBmaWxlcyB0byBiZSBidWlsdC4gVGhlIGZpcnN0IGZpbGUgaXMgbWFpbi4gSWYgbm8gb3B0aW9uIGlzIGdpdmVuLCBcInNyYy9pbmRleC57dHMsdHN4fVwiIGZyb20gcGFja2FnZSBkaXJlY3RvcnkgaXMgdGFyZ2V0ZWQuJyxcbiAgICB0eXBlOiAnYXJyYXknLFxuICAgIGFsaWFzOiAnaScsXG4gIH0sXG4gICdjb3JlLWpzJzoge1xuICAgIGRlc2NyaXB0aW9uOiAnV2hldGhlciBvciBub3QgY29yZS1qcyBpcyBlbXBsb3llZC4nLFxuICAgIHR5cGU6ICdib29sZWFuJyxcbiAgICBkZWZhdWx0OiBmYWxzZSxcbiAgfSxcbiAgJ2NvcmUtanMtcHJvcG9zYWxzJzoge1xuICAgIGRlc2NyaXB0aW9uOiAnV2hldGhlciBvciBub3QgY29yZS1qcyB3aXRoIHByb3Bvc2FscyBzdXBwb3J0IGlzIGVtcGxveWVkLicsXG4gICAgdHlwZTogJ2Jvb2xlYW4nLFxuICAgIGRlZmF1bHQ6IGZhbHNlLFxuICB9LFxuICBtaW5pZnk6IHtcbiAgICBkZXNjcmlwdGlvbjogJ1doZXRoZXIgb3Igbm90IG1pbmlmaWNhdGlvbiBpcyBlbmFibGVkLicsXG4gICAgdHlwZTogJ2Jvb2xlYW4nLFxuICAgIGRlZmF1bHQ6IHRydWUsXG4gIH0sXG4gIHNvdXJjZW1hcDoge1xuICAgIGRlc2NyaXB0aW9uOiAnV2hldGhlciBvciBub3Qgc291cmNlbWFwIGlzIGVuYWJsZWQuJyxcbiAgICB0eXBlOiAnYm9vbGVhbicsXG4gICAgZGVmYXVsdDogdHJ1ZSxcbiAgfSxcbiAgZXh0ZXJuYWw6IHtcbiAgICBkZXNjcmlwdGlvbjogJ0FkZGl0aW9uYWwgZXh0ZXJuYWwgZGVwZW5kZW5jaWVzLicsXG4gICAgdHlwZTogJ2FycmF5JyxcbiAgfSxcbiAgaW5saW5lOiB7XG4gICAgZGVzY3JpcHRpb246ICdFbnZpcm9ubWVudCB2YXJpYWJsZXMgdG8gYmUgaW5saW5lZC4nLFxuICAgIHR5cGU6ICdhcnJheScsXG4gIH0sXG4gICdhdXRvLWlubGluZSc6IHtcbiAgICBkZXNjcmlwdGlvbjogJ0lubGluZSBlbnZpcm9ubWVudCB2YXJpYWJsZXMgZGVmaW5lZCBhdCBlbnYgZmlsZXMuJyxcbiAgICB0eXBlOiAnYm9vbGVhbicsXG4gICAgZGVmYXVsdDogZmFsc2UsXG4gIH0sXG4gIHdhdGNoOiB7XG4gICAgZGVzY3JpcHRpb246ICdXaGV0aGVyIHdhdGNoIG1vZGUgaXMgZW5hYmxlZCBvciBub3QnLFxuICAgIHR5cGU6ICdib29sZWFuJyxcbiAgICBhbGlhczogJ3cnLFxuICB9LFxuICBrZWVwSW1wb3J0OiB7XG4gICAgZGVzY3JpcHRpb246ICdJZGVudGlmaWVycyB0byBiZSBrZXB0IGFzIGltcG9ydCBzdGF0ZW1lbnRzLicsXG4gICAgdHlwZTogJ2FycmF5JyxcbiAgfSxcbiAgYnVuZGxlQnVpbHRpbnM6IHtcbiAgICBkZXNjcmlwdGlvbjogJ01vZHVsZSBuYW1lcyBzYW1lIHdpdGggYnVpbHRpbnMgKGUuZy4sIHVuZGljaSkgdG8gYmUgYnVuZGxlZC4nLFxuICAgIHR5cGU6ICdhcnJheScsXG4gIH0sXG59IGFzIGNvbnN0O1xuXG5leHBvcnQgY29uc3QgYXBwQnVpbGRlciA9IHtcbiAgLi4uYnVpbGRlcixcbiAgbW9kdWxlVHlwZToge1xuICAgIGRlc2NyaXB0aW9uOiAnZXNtLCBjanMsIG9yIGVpdGhlciAoZGVmYXVsdCkuJyxcbiAgICB0eXBlOiAnc3RyaW5nJyxcbiAgICBhbGlhczogJ20nLFxuICB9LFxufSBhcyBjb25zdDtcblxuZXhwb3J0IGNvbnN0IGZ1bmN0aW9uc0J1aWxkZXIgPSB7XG4gIC4uLmFwcEJ1aWxkZXIsXG4gIG9ubHlQYWNrYWdlSnNvbjoge1xuICAgIGRlc2NyaXB0aW9uOiAnV2hldGhlciB0byBnZW5lcmF0ZSBvbmx5IHBhY2thZ2UuanNvbi4nLFxuICAgIHR5cGU6ICdib29sZWFuJyxcbiAgfSxcbn0gYXMgY29uc3Q7XG5cbmV4cG9ydCBjb25zdCBsaWJCdWlsZGVyID0ge1xuICAuLi5idWlsZGVyLFxuICBtb2R1bGVUeXBlOiB7XG4gICAgZGVzY3JpcHRpb246ICdlc20sIGNqcywgZWl0aGVyLCBvciBib3RoIChkZWZhdWx0KS4nLFxuICAgIHR5cGU6ICdzdHJpbmcnLFxuICAgIGFsaWFzOiAnbScsXG4gIH0sXG4gIC8vIC5qcyBmaWxlcyBpbiBhIHBhY2thZ2Ugd2l0aCBgXCJ0eXBlXCI6IFwibW9kdWxlXCJgIGFyZSB0cmVhdGVkIGFzIGVzbS5cbiAgLy8gSG93ZXZlciwgd2Ugd2FudCB0byB0cmVhdCB0aGVtIGFzIGNqcyBpbiB0aGUgY2FzZSB3aGVyZSBhIGNqcyBwcm9qZWN0IGltcG9ydHMgYW4gZXNtIHBhY2thZ2UuXG4gIC8vIFRvIGRlYWwgd2l0aCB0aGUgY2FzZSwgd2UgdXNlIC5janMgYW5kIC5tanMgZXh0ZW5zaW9ucyBpbnN0ZWFkIG9mIC5qcyBleHRlbnNpb24uXG4gIGpzRXh0ZW5zaW9uOiB7XG4gICAgZGVzY3JpcHRpb246ICdXaGV0aGVyIHRvIHVzZSAuanMgaW4gY2pzIGFuZC9vciBlc206IGVpdGhlciAoZGVmYXVsdCksIGJvdGgsIG9yIG5vbmUuJyxcbiAgICB0eXBlOiAnc3RyaW5nJyxcbiAgICBhbGlhczogJ2onLFxuICB9LFxufSBhcyBjb25zdDtcblxuZXhwb3J0IHR5cGUgQW55QnVpbGRlclR5cGUgPSB0eXBlb2YgYXBwQnVpbGRlciB8IHR5cGVvZiBmdW5jdGlvbnNCdWlsZGVyIHwgdHlwZW9mIGxpYkJ1aWxkZXI7XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgeyBiYWJlbCB9IGZyb20gJ0Byb2xsdXAvcGx1Z2luLWJhYmVsJztcbmltcG9ydCAqIGFzIGNvbW1vbmpzIGZyb20gJ0Byb2xsdXAvcGx1Z2luLWNvbW1vbmpzJztcbmltcG9ydCAqIGFzIGpzb24gZnJvbSAnQHJvbGx1cC9wbHVnaW4tanNvbic7XG5pbXBvcnQgKiBhcyByZXNvbHZlIGZyb20gJ0Byb2xsdXAvcGx1Z2luLW5vZGUtcmVzb2x2ZSc7XG5pbXBvcnQgKiBhcyByZXBsYWNlIGZyb20gJ0Byb2xsdXAvcGx1Z2luLXJlcGxhY2UnO1xuaW1wb3J0ICogYXMgdGVyc2VyIGZyb20gJ0Byb2xsdXAvcGx1Z2luLXRlcnNlcic7XG5pbXBvcnQgdHlwZSB7IE91dHB1dE9wdGlvbnMsIFBsdWdpbiB9IGZyb20gJ3JvbGx1cCc7XG5pbXBvcnQgKiBhcyBhbmFseXplIGZyb20gJ3JvbGx1cC1wbHVnaW4tYW5hbHl6ZXInO1xuaW1wb3J0IHsga2VlcEltcG9ydCB9IGZyb20gJ3JvbGx1cC1wbHVnaW4ta2VlcC1pbXBvcnQnO1xuaW1wb3J0IHsgbm9kZUV4dGVybmFscyB9IGZyb20gJ3JvbGx1cC1wbHVnaW4tbm9kZS1leHRlcm5hbHMnO1xuaW1wb3J0IHByZXNlcnZlRGlyZWN0aXZlcyBmcm9tICdyb2xsdXAtcGx1Z2luLXByZXNlcnZlLWRpcmVjdGl2ZXMnO1xuaW1wb3J0IHsgc3RyaW5nIH0gZnJvbSAncm9sbHVwLXBsdWdpbi1zdHJpbmcnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlSnNvbiB9IGZyb20gJ3R5cGUtZmVzdCc7XG5cbmltcG9ydCB7IGNyZWF0ZUVudmlyb25tZW50VmFyaWFibGVzRGVmaW5pdGlvbiB9IGZyb20gJy4uLy4uL2Vudi5qcyc7XG5pbXBvcnQgdHlwZSB7IEFyZ3VtZW50c1R5cGUsIFRhcmdldERldGFpbCB9IGZyb20gJy4uLy4uL3R5cGVzLmpzJztcbmltcG9ydCB7IGdldEJ1aWxkVHNSb290UGF0aCB9IGZyb20gJy4uLy4uL3V0aWxzLmpzJztcblxuaW1wb3J0IHR5cGUgeyBidWlsZGVyIH0gZnJvbSAnLi9idWlsZGVyLmpzJztcblxuZXhwb3J0IGZ1bmN0aW9uIHNldHVwUGx1Z2lucyhcbiAgYXJndjogQXJndW1lbnRzVHlwZTx0eXBlb2YgYnVpbGRlcj4sXG4gIHRhcmdldERldGFpbDogVGFyZ2V0RGV0YWlsLFxuICBwYWNrYWdlSnNvbjogUGFja2FnZUpzb24sXG4gIG5hbWVzcGFjZTogc3RyaW5nIHwgdW5kZWZpbmVkLFxuICBwYWNrYWdlRGlyUGF0aDogc3RyaW5nLFxuICBvdXRwdXRPcHRpb25zTGlzdDogT3V0cHV0T3B0aW9uc1tdXG4pOiBQbHVnaW5bXSB7XG4gIGNvbnN0IGV4dGVybmFsRGVwcyA9IFsuLi4oYXJndi5leHRlcm5hbCA/PyBbXSldLm1hcCgoaXRlbSkgPT4gaXRlbS50b1N0cmluZygpKTtcbiAgaWYgKHBhY2thZ2VKc29uLmRlcGVuZGVuY2llcz8uWydAcHJpc21hL2NsaWVudCddKSB7XG4gICAgZXh0ZXJuYWxEZXBzLnB1c2goJ3ByaXNtYS1jbGllbnQnKTtcbiAgfVxuICAvLyBTaW5jZSBgZGVwczogdHJ1ZWAgZG9lcyBub3Qgd29yayBmb3IgYGltcG9ydCBjaHVuayBmcm9tICdsb2Rhc2guY2h1bmsvaW5kZXguanMnO2BcbiAgZXh0ZXJuYWxEZXBzLnB1c2goXG4gICAgLi4uT2JqZWN0LmtleXMocGFja2FnZUpzb24uZGVwZW5kZW5jaWVzID8/IHt9KSxcbiAgICAuLi5PYmplY3Qua2V5cyhwYWNrYWdlSnNvbi5wZWVyRGVwZW5kZW5jaWVzID8/IHt9KSxcbiAgICAuLi5PYmplY3Qua2V5cyhwYWNrYWdlSnNvbi5vcHRpb25hbERlcGVuZGVuY2llcyA/PyB7fSlcbiAgKTtcbiAgLy8gQWRkIGV4dGVybmFsIGRlcGVuZGVuY2llcyBmcm9tIHNpYmxpbmcgcGFja2FnZXNcbiAgaWYgKGZzLmV4aXN0c1N5bmMocGF0aC5qb2luKCcuLicsICcuLicsICdwYWNrYWdlLmpzb24nKSkpIHtcbiAgICBjb25zdCBwYWNrYWdlRGlycyA9IGZzLnJlYWRkaXJTeW5jKHBhdGguam9pbignLi4nKSwgeyB3aXRoRmlsZVR5cGVzOiB0cnVlIH0pO1xuICAgIGZvciAoY29uc3QgcGFja2FnZURpciBvZiBwYWNrYWdlRGlycykge1xuICAgICAgaWYgKCFwYWNrYWdlRGlyLmlzRGlyZWN0b3J5KCkpIGNvbnRpbnVlO1xuXG4gICAgICBjb25zdCBwYWNrYWdlSnNvblBhdGggPSBwYXRoLmpvaW4oJy4uJywgcGFja2FnZURpci5uYW1lLCAncGFja2FnZS5qc29uJyk7XG4gICAgICBpZiAoIWZzLmV4aXN0c1N5bmMocGFja2FnZUpzb25QYXRoKSkgY29udGludWU7XG5cbiAgICAgIGNvbnN0IG90aGVyUGFja2FnZUpzb246IFBhY2thZ2VKc29uID0gSlNPTi5wYXJzZShmcy5yZWFkRmlsZVN5bmMocGFja2FnZUpzb25QYXRoLCAndXRmOCcpKTtcbiAgICAgIGlmIChwYWNrYWdlSnNvbi5kZXBlbmRlbmNpZXM/LltvdGhlclBhY2thZ2VKc29uLm5hbWUgPz8gJyddKSB7XG4gICAgICAgIGV4dGVybmFsRGVwcy5wdXNoKFxuICAgICAgICAgIC4uLk9iamVjdC5rZXlzKG90aGVyUGFja2FnZUpzb24uZGVwZW5kZW5jaWVzID8/IHt9KSxcbiAgICAgICAgICAuLi5PYmplY3Qua2V5cyhvdGhlclBhY2thZ2VKc29uLnBlZXJEZXBlbmRlbmNpZXMgPz8ge30pLFxuICAgICAgICAgIC4uLk9iamVjdC5rZXlzKG90aGVyUGFja2FnZUpzb24ub3B0aW9uYWxEZXBlbmRlbmNpZXMgPz8ge30pXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgY29uc3QgZXh0ZW5zaW9ucyA9IFsnLmNqcycsICcubWpzJywgJy5qcycsICcuanN4JywgJy5qc29uJywgJy5jdHMnLCAnLm10cycsICcudHMnLCAnLnRzeCddO1xuICBjb25zdCBiYWJlbENvbmZpZ1BhdGggPSBwYXRoLmpvaW4oZ2V0QnVpbGRUc1Jvb3RQYXRoKCksICdiYWJlbC5jb25maWcubWpzJyk7XG4gIGNvbnN0IHJlcGxhY2VQbHVnaW4gPSBnZXREZWZhdWx0UGx1Z2luRmFjdG9yeShyZXBsYWNlKTtcbiAgY29uc3QganNvblBsdWdpbiA9IGdldERlZmF1bHRQbHVnaW5GYWN0b3J5KGpzb24pO1xuICBjb25zdCByZXNvbHZlUGx1Z2luID0gZ2V0RGVmYXVsdFBsdWdpbkZhY3RvcnkocmVzb2x2ZSk7XG4gIGNvbnN0IGNvbW1vbmpzUGx1Z2luID0gZ2V0RGVmYXVsdFBsdWdpbkZhY3RvcnkoY29tbW9uanMpO1xuICBjb25zdCB0ZXJzZXJQbHVnaW4gPSBnZXREZWZhdWx0UGx1Z2luRmFjdG9yeSh0ZXJzZXIpO1xuICBjb25zdCBhbmFseXplUGx1Z2luID0gZ2V0RGVmYXVsdFBsdWdpbkZhY3RvcnkoYW5hbHl6ZSk7XG4gIGNvbnN0IHBsdWdpbnM6IFBsdWdpbltdID0gW1xuICAgIHJlcGxhY2VQbHVnaW4oe1xuICAgICAgLy8gSWdub3JlIHdvcmQgYm91bmRhcmllcyBhbmQgcmVwbGFjZSBldmVyeSBpbnN0YW5jZSBvZiB0aGUgc3RyaW5nLlxuICAgICAgLy8gY2YuIGh0dHBzOi8vZ2l0aHViLmNvbS9yb2xsdXAvcGx1Z2lucy90cmVlL21hc3Rlci9wYWNrYWdlcy9yZXBsYWNlI3dvcmQtYm91bmRhcmllc1xuICAgICAgZGVsaW1pdGVyczogWycnLCAnJ10sXG4gICAgICBwcmV2ZW50QXNzaWdubWVudDogdHJ1ZSxcbiAgICAgIHZhbHVlczogY3JlYXRlRW52aXJvbm1lbnRWYXJpYWJsZXNEZWZpbml0aW9uKGFyZ3YsIHBhY2thZ2VEaXJQYXRoKSxcbiAgICB9KSxcbiAgICBqc29uUGx1Z2luKCksXG4gICAgbm9kZUV4dGVybmFscyh7XG4gICAgICBkZXBzOiB0cnVlLFxuICAgICAgZGV2RGVwczogZmFsc2UsXG4gICAgICBwZWVyRGVwczogdHJ1ZSxcbiAgICAgIG9wdERlcHM6IHRydWUsXG4gICAgICBpbmNsdWRlOiBleHRlcm5hbERlcHMubWFwKChuYW1lKSA9PiBuZXcgUmVnRXhwKGBeJHtuYW1lfSg/OlxcXFwvLispP2ApKSxcbiAgICAgIGV4Y2x1ZGU6IHNob3VsZEJ1bmRsZVNhbWVOYW1lc3BhY2VEZXBlbmRlbmNpZXModGFyZ2V0RGV0YWlsKSAmJiBuYW1lc3BhY2UgJiYgbmV3IFJlZ0V4cChgXkA/JHtuYW1lc3BhY2V9KD86XFxcXC8uKyk/YCksXG4gICAgfSksXG4gICAgcmVzb2x2ZVBsdWdpbih7XG4gICAgICBleHRlbnNpb25zLFxuICAgICAgcHJlZmVyQnVpbHRpbnM6IChpZDogc3RyaW5nKSA9PiAhYXJndi5idW5kbGVCdWlsdGlucz8uaW5jbHVkZXMoaWQpLFxuICAgIH0pLFxuICAgIGNvbW1vbmpzUGx1Z2luKCksXG4gICAga2VlcEltcG9ydCh7IG1vZHVsZU5hbWVzOiBhcmd2LmtlZXBJbXBvcnQ/Lm1hcCgoaXRlbSkgPT4gaXRlbS50b1N0cmluZygpKSA/PyBbXSB9KSxcbiAgXTtcbiAgY29uc3QgaXNCYWJlbEhlbHBlcnNCdW5kbGVkID1cbiAgICB0YXJnZXREZXRhaWwgPT09ICdhcHAtbm9kZScgfHwgdGFyZ2V0RGV0YWlsID09PSAnZnVuY3Rpb25zJyB8fCAhZXh0ZXJuYWxEZXBzLmluY2x1ZGVzKCdAYmFiZWwvcnVudGltZScpO1xuICBwcm9jZXNzLmVudi5CVUlMRFRTX1VTRV9CQUJMRV9SVU5USU1FID0gaXNCYWJlbEhlbHBlcnNCdW5kbGVkID8gJycgOiAnMSc7XG4gIHBsdWdpbnMucHVzaChcbiAgICBiYWJlbCh7XG4gICAgICBjb25maWdGaWxlOiBiYWJlbENvbmZpZ1BhdGgsXG4gICAgICBleHRlbnNpb25zLFxuICAgICAgLy8gV2UgbmVlZCBgcnVudGltZSBzaW5jZSBgYnVuZGxlZGAgbWF5IGJyZWFrIGRpcmVjdG9yeSBzdHJ1Y3R1cmUgYnkgY3JlYXRpbmcgX3ZpcnR1YWwgZGlyZWN0b3J5LlxuICAgICAgYmFiZWxIZWxwZXJzOiBpc0JhYmVsSGVscGVyc0J1bmRsZWQgPyAnYnVuZGxlZCcgOiAncnVudGltZScsXG4gICAgICBleGNsdWRlOiAvXiguK1xcLyk/bm9kZV9tb2R1bGVzXFwvLiskLyxcbiAgICB9KSxcbiAgICAuLi4ob3V0cHV0T3B0aW9uc0xpc3Quc29tZSgob3B0cykgPT4gb3B0cy5wcmVzZXJ2ZU1vZHVsZXMpID8gW3ByZXNlcnZlRGlyZWN0aXZlcygpXSA6IFtdKSxcbiAgICBzdHJpbmcoeyBpbmNsdWRlOiBbJyoqLyouY3N2JywgJyoqLyoudHh0J10gfSlcbiAgKTtcbiAgaWYgKGFyZ3YubWluaWZ5KSB7XG4gICAgcGx1Z2lucy5wdXNoKHRlcnNlclBsdWdpbih7IGNvbXByZXNzOiB7IGRpcmVjdGl2ZXM6IGZhbHNlIH0gfSkpO1xuICB9XG4gIHBsdWdpbnMucHVzaChhbmFseXplUGx1Z2luKHsgc3VtbWFyeU9ubHk6IHRydWUgfSkpO1xuICByZXR1cm4gcGx1Z2lucztcbn1cblxuZnVuY3Rpb24gc2hvdWxkQnVuZGxlU2FtZU5hbWVzcGFjZURlcGVuZGVuY2llcyh0YXJnZXREZXRhaWw6IFRhcmdldERldGFpbCk6IGJvb2xlYW4ge1xuICByZXR1cm4gdGFyZ2V0RGV0YWlsID09PSAnYXBwLW5vZGUnIHx8IHRhcmdldERldGFpbCA9PT0gJ2Z1bmN0aW9ucyc7XG59XG5cbnR5cGUgUGx1Z2luRmFjdG9yeSA9IChvcHRpb25zPzogdW5rbm93bikgPT4gUGx1Z2luO1xuXG5mdW5jdGlvbiBnZXREZWZhdWx0UGx1Z2luRmFjdG9yeShtb2R1bGU6IHsgZGVmYXVsdDogdW5rbm93biB9KTogUGx1Z2luRmFjdG9yeSB7XG4gIHJldHVybiBtb2R1bGUuZGVmYXVsdCBhcyBQbHVnaW5GYWN0b3J5O1xufVxuIiwiaW1wb3J0ICogYXMgY2hpbGRfcHJvY2VzcyBmcm9tICdub2RlOmNoaWxkX3Byb2Nlc3MnO1xuaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHsgY3JlYXRlUmVxdWlyZSB9IGZyb20gJ25vZGU6bW9kdWxlJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB0eXBlIHsgQXJndW1lbnRzVHlwZSB9IGZyb20gJy4uLy4uL3R5cGVzLmpzJztcblxuaW1wb3J0IHR5cGUgeyBBbnlCdWlsZGVyVHlwZSB9IGZyb20gJy4vYnVpbGRlci5qcyc7XG5cbmNvbnN0IHJlcXVpcmUgPSBjcmVhdGVSZXF1aXJlKGltcG9ydC5tZXRhLnVybCk7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZW5lcmF0ZURlY2xhcmF0aW9uRmlsZXMoXG4gIGFyZ3Y6IEFyZ3VtZW50c1R5cGU8QW55QnVpbGRlclR5cGU+LFxuICBjb3JlUHJvamVjdERpclBhdGg6IHN0cmluZ1xuKTogUHJvbWlzZTxib29sZWFuPiB7XG4gIGNvbnN0IGNvcmVDb25maWdGaWxlID0gZmluZENvbmZpZ0ZpbGUoY29yZVByb2plY3REaXJQYXRoKTtcbiAgaWYgKCFjb3JlQ29uZmlnRmlsZSkgdGhyb3cgbmV3IEVycm9yKGBGYWlsZWQgdG8gZmluZCB0c2NvbmZpZy5qc29uIGluICR7Y29yZVByb2plY3REaXJQYXRofS5gKTtcbiAgaWYgKGFyZ3YudmVyYm9zZSkge1xuICAgIGNvbnNvbGUuaW5mbygnRm91bmQgdHNjb25maWcuanNvbjonLCBjb3JlQ29uZmlnRmlsZSk7XG4gIH1cblxuICBjb25zdCBwcm9qZWN0czogW3N0cmluZywgc3RyaW5nLCBzdHJpbmddW10gPSBbXTtcbiAgbGV0IG91dERpciA9IHBhdGguam9pbignZGlzdCcsIHBhdGguYmFzZW5hbWUoY29yZVByb2plY3REaXJQYXRoKSwgJ3NyYycpO1xuICBpZiAoZnMuZXhpc3RzU3luYyhvdXREaXIpKSB7XG4gICAgY29uc3QgcGFyZW50RGlyUGF0aCA9IHBhdGguZGlybmFtZShjb3JlUHJvamVjdERpclBhdGgpO1xuICAgIGNvbnN0IGRpcmVudHMgPSBhd2FpdCBmcy5wcm9taXNlcy5yZWFkZGlyKHBhcmVudERpclBhdGgsIHsgd2l0aEZpbGVUeXBlczogdHJ1ZSB9KTtcbiAgICBjb3JlUHJvamVjdERpclBhdGggPSBwYXRoLnJlc29sdmUoY29yZVByb2plY3REaXJQYXRoKTtcbiAgICBmb3IgKGNvbnN0IGRpcmVudCBvZiBkaXJlbnRzKSB7XG4gICAgICBpZiAoIWRpcmVudC5pc0RpcmVjdG9yeSgpKSBjb250aW51ZTtcblxuICAgICAgY29uc3QgcHJvamVjdERpclBhdGggPSBwYXRoLnJlc29sdmUocGFyZW50RGlyUGF0aCwgZGlyZW50Lm5hbWUpO1xuICAgICAgaWYgKHByb2plY3REaXJQYXRoID09PSBjb3JlUHJvamVjdERpclBhdGgpIGNvbnRpbnVlO1xuXG4gICAgICBjb25zdCBjb25maWdGaWxlID0gZmluZENvbmZpZ0ZpbGUocHJvamVjdERpclBhdGgpO1xuICAgICAgY29uc3Qgb3V0RGlyID0gcGF0aC5qb2luKCdkaXN0JywgZGlyZW50Lm5hbWUsICdzcmMnKTtcbiAgICAgIGlmIChjb25maWdGaWxlICYmIGZzLmV4aXN0c1N5bmMob3V0RGlyKSkge1xuICAgICAgICBwcm9qZWN0cy5wdXNoKFtwcm9qZWN0RGlyUGF0aCwgY29uZmlnRmlsZSwgb3V0RGlyXSk7XG4gICAgICB9XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIG91dERpciA9ICdkaXN0JztcbiAgfVxuICBwcm9qZWN0cy5wdXNoKFtjb3JlUHJvamVjdERpclBhdGgsIGNvcmVDb25maWdGaWxlLCBvdXREaXJdKTtcblxuICBsZXQgYWxsU3VjY2VlZGVkID0gdHJ1ZTtcbiAgZm9yIChjb25zdCBbcHJvamVjdERpclBhdGgsIGNvbmZpZ0ZpbGUsIG91dERpcl0gb2YgcHJvamVjdHMpIHtcbiAgICBhbGxTdWNjZWVkZWQgJiY9IGF3YWl0IHJ1blR5cGVTY3JpcHROYXRpdmUoYXJndiwgcHJvamVjdERpclBhdGgsIGNvbmZpZ0ZpbGUsIHBhdGguam9pbihjb3JlUHJvamVjdERpclBhdGgsIG91dERpcikpO1xuICB9XG4gIHJldHVybiBhbGxTdWNjZWVkZWQ7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHJ1blR5cGVTY3JpcHROYXRpdmUoXG4gIGFyZ3Y6IEFyZ3VtZW50c1R5cGU8QW55QnVpbGRlclR5cGU+LFxuICBwcm9qZWN0RGlyUGF0aDogc3RyaW5nLFxuICBjb25maWdGaWxlOiBzdHJpbmcsXG4gIG91dERpcjogc3RyaW5nXG4pOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgaWYgKGFyZ3YudmVyYm9zZSkge1xuICAgIGNvbnNvbGUuaW5mbygncnVuVHlwZVNjcmlwdE5hdGl2ZSgpJywgcHJvamVjdERpclBhdGgsIGNvbmZpZ0ZpbGUsIG91dERpcik7XG4gIH1cblxuICBjb25zdCBjb25maWdGaWxlRGlyUGF0aCA9IHBhdGguZGlybmFtZShjb25maWdGaWxlKTtcbiAgY29uc3QgdGVtcENvbmZpZ0ZpbGUgPSBwYXRoLmpvaW4oY29uZmlnRmlsZURpclBhdGgsIGAuYnVpbGQtdHMtdHNnby4ke3Byb2Nlc3MucGlkfS4ke0RhdGUubm93KCl9Lmpzb25gKTtcbiAgdHJ5IHtcbiAgICBhd2FpdCBmcy5wcm9taXNlcy53cml0ZUZpbGUoXG4gICAgICB0ZW1wQ29uZmlnRmlsZSxcbiAgICAgIEpTT04uc3RyaW5naWZ5KGF3YWl0IGNyZWF0ZVR5cGVTY3JpcHROYXRpdmVDb25maWcocHJvamVjdERpclBhdGgsIGNvbmZpZ0ZpbGUsIG91dERpciksIHVuZGVmaW5lZCwgMilcbiAgICApO1xuICAgIGNvbnN0IHJldCA9IGNoaWxkX3Byb2Nlc3Muc3Bhd25TeW5jKHByb2Nlc3MuZXhlY1BhdGgsIFtnZXRUeXBlU2NyaXB0TmF0aXZlUGF0aCgpLCAnLXAnLCB0ZW1wQ29uZmlnRmlsZV0sIHtcbiAgICAgIGN3ZDogcHJvamVjdERpclBhdGgsXG4gICAgICBzdGRpbzogJ2luaGVyaXQnLFxuICAgIH0pO1xuICAgIGlmIChyZXQuZXJyb3IpIHRocm93IHJldC5lcnJvcjtcbiAgICByZXR1cm4gcmV0LnN0YXR1cyA9PT0gMDtcbiAgfSBmaW5hbGx5IHtcbiAgICBhd2FpdCBmcy5wcm9taXNlcy5ybSh0ZW1wQ29uZmlnRmlsZSwgeyBmb3JjZTogdHJ1ZSB9KTtcbiAgfVxufVxuXG5hc3luYyBmdW5jdGlvbiBjcmVhdGVUeXBlU2NyaXB0TmF0aXZlQ29uZmlnKFxuICBwcm9qZWN0RGlyUGF0aDogc3RyaW5nLFxuICBjb25maWdGaWxlOiBzdHJpbmcsXG4gIG91dERpcjogc3RyaW5nXG4pOiBQcm9taXNlPFJlY29yZDxzdHJpbmcsIHVua25vd24+PiB7XG4gIGNvbnN0IGNvbXBpbGVyT3B0aW9uczogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPSB7XG4gICAgZGVjbGFyYXRpb246IHRydWUsXG4gICAgZW1pdERlY2xhcmF0aW9uT25seTogdHJ1ZSxcbiAgICBub0VtaXQ6IGZhbHNlLFxuICAgIG5vRW1pdE9uRXJyb3I6IHRydWUsXG4gICAgb3V0RGlyLFxuICAgIHJvb3REaXI6ICdzcmMnLFxuICB9O1xuICBpZiAoYXdhaXQgdXNlc05vZGVQcm90b2NvbEltcG9ydChwYXRoLmpvaW4ocHJvamVjdERpclBhdGgsICdzcmMnKSkpIHtcbiAgICBjb25zdCB0eXBlcyA9IGF3YWl0IGNvbGxlY3RUeXBlUGFja2FnZXMocGF0aC5qb2luKHByb2plY3REaXJQYXRoLCAnbm9kZV9tb2R1bGVzJywgJ0B0eXBlcycpKTtcbiAgICBpZiAodHlwZXMuaW5jbHVkZXMoJ25vZGUnKSkge1xuICAgICAgY29tcGlsZXJPcHRpb25zLnR5cGVzID0gdHlwZXM7XG4gICAgfVxuICB9XG4gIHJldHVybiB7XG4gICAgY29tcGlsZXJPcHRpb25zLFxuICAgIGV4dGVuZHM6IHRvUmVsYXRpdmVDb25maWdQYXRoKHBhdGguZGlybmFtZShjb25maWdGaWxlKSwgY29uZmlnRmlsZSksXG4gICAgaW5jbHVkZTogWydzcmMvKiovKiddLFxuICB9O1xufVxuXG5mdW5jdGlvbiBmaW5kQ29uZmlnRmlsZShkaXJQYXRoOiBzdHJpbmcpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBsZXQgY3VycmVudERpclBhdGggPSBwYXRoLnJlc29sdmUoZGlyUGF0aCk7XG4gIHdoaWxlICh0cnVlKSB7XG4gICAgY29uc3QgY29uZmlnRmlsZSA9IHBhdGguam9pbihjdXJyZW50RGlyUGF0aCwgJ3RzY29uZmlnLmpzb24nKTtcbiAgICBpZiAoZnMuZXhpc3RzU3luYyhjb25maWdGaWxlKSkgcmV0dXJuIGNvbmZpZ0ZpbGU7XG5cbiAgICBjb25zdCBwYXJlbnREaXJQYXRoID0gcGF0aC5kaXJuYW1lKGN1cnJlbnREaXJQYXRoKTtcbiAgICBpZiAocGFyZW50RGlyUGF0aCA9PT0gY3VycmVudERpclBhdGgpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgY3VycmVudERpclBhdGggPSBwYXJlbnREaXJQYXRoO1xuICB9XG59XG5cbmZ1bmN0aW9uIGdldFR5cGVTY3JpcHROYXRpdmVQYXRoKCk6IHN0cmluZyB7XG4gIGNvbnN0IHBhY2thZ2VKc29uUGF0aCA9IHJlcXVpcmUucmVzb2x2ZSgnQHR5cGVzY3JpcHQvbmF0aXZlLXByZXZpZXcvcGFja2FnZS5qc29uJyk7XG4gIHJldHVybiBwYXRoLmpvaW4ocGF0aC5kaXJuYW1lKHBhY2thZ2VKc29uUGF0aCksICdiaW4nLCAndHNnby5qcycpO1xufVxuXG5hc3luYyBmdW5jdGlvbiB1c2VzTm9kZVByb3RvY29sSW1wb3J0KGRpclBhdGg6IHN0cmluZyk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICB0cnkge1xuICAgIGNvbnN0IGRpcmVudHMgPSBhd2FpdCBmcy5wcm9taXNlcy5yZWFkZGlyKGRpclBhdGgsIHsgd2l0aEZpbGVUeXBlczogdHJ1ZSB9KTtcbiAgICBmb3IgKGNvbnN0IGRpcmVudCBvZiBkaXJlbnRzKSB7XG4gICAgICBjb25zdCBjaGlsZFBhdGggPSBwYXRoLmpvaW4oZGlyUGF0aCwgZGlyZW50Lm5hbWUpO1xuICAgICAgaWYgKGRpcmVudC5pc0RpcmVjdG9yeSgpKSB7XG4gICAgICAgIGlmIChhd2FpdCB1c2VzTm9kZVByb3RvY29sSW1wb3J0KGNoaWxkUGF0aCkpIHJldHVybiB0cnVlO1xuICAgICAgfSBlbHNlIGlmICgvXFwuW2NtXT90c3g/JC8udGVzdChkaXJlbnQubmFtZSkgJiYgKGF3YWl0IGZzLnByb21pc2VzLnJlYWRGaWxlKGNoaWxkUGF0aCwgJ3V0ZjgnKSkuaW5jbHVkZXMoJ25vZGU6JykpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgfVxuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgcmV0dXJuIGZhbHNlO1xufVxuXG5hc3luYyBmdW5jdGlvbiBjb2xsZWN0VHlwZVBhY2thZ2VzKHR5cGVSb290c0RpclBhdGg6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nW10+IHtcbiAgdHJ5IHtcbiAgICBjb25zdCBkaXJlbnRzID0gYXdhaXQgZnMucHJvbWlzZXMucmVhZGRpcih0eXBlUm9vdHNEaXJQYXRoLCB7IHdpdGhGaWxlVHlwZXM6IHRydWUgfSk7XG4gICAgcmV0dXJuIGRpcmVudHMuZmlsdGVyKChkaXJlbnQpID0+IGRpcmVudC5pc0RpcmVjdG9yeSgpKS5tYXAoKGRpcmVudCkgPT4gZGlyZW50Lm5hbWUpO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gW107XG4gIH1cbn1cblxuZnVuY3Rpb24gdG9SZWxhdGl2ZUNvbmZpZ1BhdGgoZnJvbURpclBhdGg6IHN0cmluZywgdG9GaWxlUGF0aDogc3RyaW5nKTogc3RyaW5nIHtcbiAgY29uc3QgcmVsYXRpdmVQYXRoID0gcGF0aC5yZWxhdGl2ZShmcm9tRGlyUGF0aCwgdG9GaWxlUGF0aCkucmVwbGFjZUFsbChwYXRoLnNlcCwgJy8nKTtcbiAgcmV0dXJuIHJlbGF0aXZlUGF0aC5zdGFydHNXaXRoKCcuJykgPyByZWxhdGl2ZVBhdGggOiBgLi8ke3JlbGF0aXZlUGF0aH1gO1xufVxuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IGNoYWxrIGZyb20gJ2NoYWxrJztcbmltcG9ydCBkYXRlVGltZSBmcm9tICdkYXRlLXRpbWUnO1xuaW1wb3J0IG1zIGZyb20gJ3ByZXR0eS1tcyc7XG5pbXBvcnQgdHlwZSB7IE91dHB1dE9wdGlvbnMsIFJvbGx1cEJ1aWxkLCBSb2xsdXBPcHRpb25zIH0gZnJvbSAncm9sbHVwJztcbmltcG9ydCB7IHJvbGx1cCwgd2F0Y2ggfSBmcm9tICdyb2xsdXAnO1xuaW1wb3J0IHR5cGUgeyBIYW5kbGVyIH0gZnJvbSAnc2lnbmFsLWV4aXQnO1xuaW1wb3J0IHsgb25FeGl0IH0gZnJvbSAnc2lnbmFsLWV4aXQnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlSnNvbiB9IGZyb20gJ3R5cGUtZmVzdCc7XG5pbXBvcnQgdHlwZSB7IENvbW1hbmRNb2R1bGUgfSBmcm9tICd5YXJncyc7XG5cbmltcG9ydCB7IGxvYWRFbnZpcm9ubWVudFZhcmlhYmxlc1dpdGhDYWNoZSB9IGZyb20gJy4uLy4uL2Vudi5qcyc7XG5pbXBvcnQgdHlwZSB7IEFyZ3VtZW50c1R5cGUsIFRhcmdldENhdGVnb3J5LCBUYXJnZXREZXRhaWwgfSBmcm9tICcuLi8uLi90eXBlcy5qcyc7XG5pbXBvcnQgeyBhbGxUYXJnZXRDYXRlZ29yaWVzIH0gZnJvbSAnLi4vLi4vdHlwZXMuanMnO1xuaW1wb3J0IHsgZ2V0TmFtZXNwYWNlQW5kTmFtZSwgcmVhZFBhY2thZ2VKc29uIH0gZnJvbSAnLi4vLi4vdXRpbHMuanMnO1xuXG5pbXBvcnQgdHlwZSB7IEFueUJ1aWxkZXJUeXBlLCBidWlsZGVyIH0gZnJvbSAnLi9idWlsZGVyLmpzJztcbmltcG9ydCB7IGFwcEJ1aWxkZXIsIGZ1bmN0aW9uc0J1aWxkZXIsIGxpYkJ1aWxkZXIgfSBmcm9tICcuL2J1aWxkZXIuanMnO1xuaW1wb3J0IHsgc2V0dXBQbHVnaW5zIH0gZnJvbSAnLi9wbHVnaW4uanMnO1xuaW1wb3J0IHsgaGFuZGxlRXJyb3IgfSBmcm9tICcuL3JvbGx1cExvZ2dlci5qcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZURlY2xhcmF0aW9uRmlsZXMgfSBmcm9tICcuL3R5cGVTY3JpcHQuanMnO1xuXG5leHBvcnQgY29uc3QgYXBwOiBDb21tYW5kTW9kdWxlPHVua25vd24sIEFyZ3VtZW50c1R5cGU8dHlwZW9mIGFwcEJ1aWxkZXI+PiA9IHtcbiAgY29tbWFuZDogJ2FwcCBbcGFja2FnZV0nLFxuICBkZXNjcmliZTogJ0J1aWxkIGFuIGFwcCcsXG4gIGJ1aWxkZXI6IGFwcEJ1aWxkZXIsXG4gIGFzeW5jIGhhbmRsZXIoYXJndikge1xuICAgIHJldHVybiBidWlsZChhcmd2LCAnYXBwJyk7XG4gIH0sXG59O1xuXG5leHBvcnQgY29uc3QgZnVuY3Rpb25zOiBDb21tYW5kTW9kdWxlPHVua25vd24sIEFyZ3VtZW50c1R5cGU8dHlwZW9mIGZ1bmN0aW9uc0J1aWxkZXI+PiA9IHtcbiAgY29tbWFuZDogJ2Z1bmN0aW9ucyBbcGFja2FnZV0nLFxuICBkZXNjcmliZTogJ0J1aWxkIGEgR0NQL0ZpcmViYXNlIGZ1bmN0aW9ucyBhcHAnLFxuICBidWlsZGVyOiBmdW5jdGlvbnNCdWlsZGVyLFxuICBhc3luYyBoYW5kbGVyKGFyZ3YpIHtcbiAgICBpZiAoYXJndi5vbmx5UGFja2FnZUpzb24pIHtcbiAgICAgIGNvbnN0IHBhY2thZ2VEaXJQYXRoID0gcGF0aC5yZXNvbHZlKGFyZ3YucGFja2FnZT8udG9TdHJpbmcoKSA/PyAnLicpO1xuICAgICAgY29uc3QgW3BhY2thZ2VKc29uLCBwYWNrYWdlSnNvblBhdGhdID0gYXdhaXQgcmVhZFBhY2thZ2VKc29uKHBhY2thZ2VEaXJQYXRoKTtcbiAgICAgIGlmICghcGFja2FnZUpzb24pIHtcbiAgICAgICAgY29uc29sZS5lcnJvcihgRmFpbGVkIHRvIHBhcnNlIHBhY2thZ2UuanNvbiAoJHtwYWNrYWdlSnNvblBhdGh9KS5gKTtcbiAgICAgICAgcHJvY2Vzcy5leGl0KDEpO1xuICAgICAgfVxuICAgICAgYXdhaXQgZ2VuZXJhdGVQYWNrYWdlSnNvbkZvckZ1bmN0aW9ucyhwYWNrYWdlRGlyUGF0aCwgcGFja2FnZUpzb24sIGFyZ3YubW9kdWxlVHlwZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBidWlsZChhcmd2LCAnZnVuY3Rpb25zJyk7XG4gICAgfVxuICB9LFxufTtcblxuZXhwb3J0IGNvbnN0IGxpYjogQ29tbWFuZE1vZHVsZTx1bmtub3duLCBBcmd1bWVudHNUeXBlPHR5cGVvZiBsaWJCdWlsZGVyPj4gPSB7XG4gIGNvbW1hbmQ6ICdsaWIgW3BhY2thZ2VdJyxcbiAgZGVzY3JpYmU6ICdCdWlsZCBhIE5vZGUuanMgLyBSZWFjdCBsaWJyYXJ5JyxcbiAgYnVpbGRlcjogbGliQnVpbGRlcixcbiAgYXN5bmMgaGFuZGxlcihhcmd2KSB7XG4gICAgcmV0dXJuIGJ1aWxkKGFyZ3YsICdsaWInKTtcbiAgfSxcbn07XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBidWlsZChhcmd2OiBBcmd1bWVudHNUeXBlPEFueUJ1aWxkZXJUeXBlPiwgdGFyZ2V0Q2F0ZWdvcnk6IFRhcmdldENhdGVnb3J5KTogUHJvbWlzZTx2b2lkPiB7XG4gIHByb2Nlc3MuZW52Lk5PREVfRU5WIHx8PSAncHJvZHVjdGlvbic7XG5cbiAgLy8gYHNpbGVudGAgaXMgc3Ryb25nZXIgdGhhbiBgdmVyYm9zZWAuXG4gIGNvbnN0IHZlcmJvc2UgPSAhYXJndi5zaWxlbnQgJiYgYXJndi52ZXJib3NlO1xuICBjb25zdCBjd2QgPSBwcm9jZXNzLmN3ZCgpO1xuXG4gIGNvbnN0IHBhY2thZ2VEaXJQYXRoID0gcGF0aC5yZXNvbHZlKGFyZ3YucGFja2FnZT8udG9TdHJpbmcoKSA/PyAnLicpO1xuICBjb25zdCBbcGFja2FnZUpzb24sIHBhY2thZ2VKc29uUGF0aF0gPSBhd2FpdCByZWFkUGFja2FnZUpzb24ocGFja2FnZURpclBhdGgpO1xuICBpZiAoIXBhY2thZ2VKc29uKSB7XG4gICAgY29uc29sZS5lcnJvcihgRmFpbGVkIHRvIHBhcnNlIHBhY2thZ2UuanNvbiAoJHtwYWNrYWdlSnNvblBhdGh9KS5gKTtcbiAgICBwcm9jZXNzLmV4aXQoMSk7XG4gIH1cblxuICBsb2FkRW52aXJvbm1lbnRWYXJpYWJsZXNXaXRoQ2FjaGUoYXJndiwgcGFja2FnZURpclBhdGgpO1xuXG4gIGNvbnN0IGlucHV0cyA9IHZlcmlmeUlucHV0KGFyZ3YsIGN3ZCwgcGFja2FnZURpclBhdGgpO1xuICBjb25zdCB0YXJnZXREZXRhaWwgPSBkZXRlY3RUYXJnZXREZXRhaWwodGFyZ2V0Q2F0ZWdvcnksIGlucHV0cywgcGFja2FnZURpclBhdGgpO1xuXG4gIGlmICh2ZXJib3NlKSB7XG4gICAgY29uc29sZS5pbmZvKCdhcmd2OicsIGFyZ3YpO1xuICAgIGNvbnNvbGUuaW5mbygncGFja2FnZUpzb25QYXRoOicsIHBhY2thZ2VKc29uUGF0aCk7XG4gICAgY29uc29sZS5pbmZvKCdUYXJnZXQgKENhdGVnb3J5KTonLCBgJHt0YXJnZXREZXRhaWx9ICgke3RhcmdldENhdGVnb3J5fSlgKTtcbiAgfVxuXG4gIGNvbnN0IFtuYW1lc3BhY2VdID0gZ2V0TmFtZXNwYWNlQW5kTmFtZShwYWNrYWdlSnNvbik7XG4gIGNvbnN0IGlzRXNtUGFja2FnZSA9IHBhY2thZ2VKc29uLnR5cGUgPT09ICdtb2R1bGUnO1xuXG4gIGlmIChhcmd2Wydjb3JlLWpzJ10pIHtcbiAgICBwcm9jZXNzLmVudi5CVUlMRF9UU19DT1JFSlMgPSAnMSc7XG4gIH0gZWxzZSBpZiAoYXJndlsnY29yZS1qcy1wcm9wb3NhbHMnXSkge1xuICAgIHByb2Nlc3MuZW52LkJVSUxEX1RTX0NPUkVKU19XSVRIX1BST1BPU0FMUyA9ICcxJztcbiAgfVxuXG4gIGlmICh2ZXJib3NlKSB7XG4gICAgcHJvY2Vzcy5lbnYuQlVJTERfVFNfVkVSQk9TRSA9ICcxJztcbiAgfVxuICBwcm9jZXNzLmVudi5CVUlMRF9UU19UQVJHRVRfQ0FURUdPUlkgPSB0YXJnZXRDYXRlZ29yeTtcbiAgcHJvY2Vzcy5lbnYuQlVJTERfVFNfVEFSR0VUX0RFVEFJTCA9IHRhcmdldERldGFpbDtcblxuICBjb25zdCBvdXRwdXRPcHRpb25zTGlzdCA9IGdldE91dHB1dE9wdGlvbnNMaXN0KGFyZ3YsIHRhcmdldERldGFpbCwgcGFja2FnZURpclBhdGgsIGlzRXNtUGFja2FnZSk7XG4gIGlmICh2ZXJib3NlKSB7XG4gICAgY29uc29sZS5pbmZvKCdPdXRwdXRPcHRpb25zOicsIG91dHB1dE9wdGlvbnNMaXN0KTtcbiAgfVxuICBpZiAob3V0cHV0T3B0aW9uc0xpc3QubGVuZ3RoID09PSAwKSB7XG4gICAgY29uc29sZS5lcnJvcignRmFpbGVkIHRvIGRldGVjdCBvdXRwdXQgZmlsZXMuJyk7XG4gICAgcHJvY2Vzcy5leGl0KDEpO1xuICB9XG5cbiAgcHJvY2Vzcy5jaGRpcihwYWNrYWdlRGlyUGF0aCk7XG4gIGF3YWl0IGZzLnByb21pc2VzLnJtKHBhdGguam9pbihwYWNrYWdlRGlyUGF0aCwgJ2Rpc3QnKSwgeyByZWN1cnNpdmU6IHRydWUsIGZvcmNlOiB0cnVlIH0pO1xuICBpZiAodGFyZ2V0RGV0YWlsID09PSAnZnVuY3Rpb25zJykge1xuICAgIGF3YWl0IGdlbmVyYXRlUGFja2FnZUpzb25Gb3JGdW5jdGlvbnMocGFja2FnZURpclBhdGgsIHBhY2thZ2VKc29uLCBhcmd2Lm1vZHVsZVR5cGUpO1xuICB9XG5cbiAgY29uc3Qgb3B0aW9uczogUm9sbHVwT3B0aW9ucyA9IHtcbiAgICBpbnB1dDpcbiAgICAgIHRhcmdldERldGFpbCA9PT0gJ2Z1bmN0aW9ucydcbiAgICAgICAgPyBPYmplY3QuZnJvbUVudHJpZXMoXG4gICAgICAgICAgICBpbnB1dHMubWFwKChpbnB1dCwgaW5kZXgpID0+IFtpbmRleCA9PT0gMCA/ICdpbmRleCcgOiBwYXRoLmJhc2VuYW1lKGlucHV0LCBwYXRoLmV4dG5hbWUoaW5wdXQpKSwgaW5wdXRdKVxuICAgICAgICAgIClcbiAgICAgICAgOiBpbnB1dHMsXG4gICAgcGx1Z2luczogc2V0dXBQbHVnaW5zKGFyZ3YsIHRhcmdldERldGFpbCwgcGFja2FnZUpzb24sIG5hbWVzcGFjZSwgcGFja2FnZURpclBhdGgsIG91dHB1dE9wdGlvbnNMaXN0KSxcbiAgICB3YXRjaDogYXJndi53YXRjaCA/IHsgY2xlYXJTY3JlZW46IGZhbHNlIH0gOiB1bmRlZmluZWQsXG4gIH07XG5cbiAgY29uc3QgcGF0aFRvUmVsYXRpdmVQYXRoID0gKHBhdGhzOiBzdHJpbmcgfCBSZWFkb25seTxzdHJpbmdbXT4pOiBzdHJpbmdbXSA9PlxuICAgIChBcnJheS5pc0FycmF5KHBhdGhzKSA/IHBhdGhzIDogW3BhdGhzXSkubWFwKChwKSA9PiBwYXRoLnJlbGF0aXZlKHBhY2thZ2VEaXJQYXRoLCBwKSk7XG4gIGlmIChhcmd2LndhdGNoKSB7XG4gICAgd2F0Y2hSb2xsdXAoYXJndiwgdGFyZ2V0RGV0YWlsLCBwYWNrYWdlRGlyUGF0aCwgb3B0aW9ucywgb3V0cHV0T3B0aW9uc0xpc3QsIHBhdGhUb1JlbGF0aXZlUGF0aCk7XG4gIH0gZWxzZSB7XG4gICAgaWYgKCFhcmd2LnNpbGVudCkge1xuICAgICAgY29uc29sZS5pbmZvKFxuICAgICAgICBjaGFsay5jeWFuKFxuICAgICAgICAgIGBCdW5kbGVzICR7Y2hhbGsuYm9sZChwYXRoVG9SZWxhdGl2ZVBhdGgoaW5wdXRzKS5qb2luKCcsICcpKX0g4oaSICR7Y2hhbGsuYm9sZChcbiAgICAgICAgICAgIHBhdGhUb1JlbGF0aXZlUGF0aChvdXRwdXRPcHRpb25zTGlzdC5tYXAoKG9wdHMpID0+IG9wdHMuZmlsZSB8fCBvcHRzLmRpciB8fCAnJykpLmpvaW4oJywgJylcbiAgICAgICAgICApfVxcbm9uICR7cGFja2FnZURpclBhdGh9IC4uLmBcbiAgICAgICAgKVxuICAgICAgKTtcbiAgICB9XG5cbiAgICBsZXQgYnVuZGxlOiBSb2xsdXBCdWlsZCB8IHVuZGVmaW5lZDtcbiAgICBsZXQgYnVpbGRGYWlsZWQgPSBmYWxzZTtcbiAgICB0cnkge1xuICAgICAgY29uc3Qgc3RhcnRUaW1lID0gRGF0ZS5ub3coKTtcbiAgICAgIGNvbnN0IF9idW5kbGUgPSBhd2FpdCByb2xsdXAob3B0aW9ucyk7XG4gICAgICBidW5kbGUgPSBfYnVuZGxlO1xuICAgICAgYXdhaXQgUHJvbWlzZS5hbGwob3V0cHV0T3B0aW9uc0xpc3QubWFwKChvcHRzKSA9PiBfYnVuZGxlLndyaXRlKG9wdHMpKSk7XG5cbiAgICAgIGlmICghYXJndi5zaWxlbnQpIHtcbiAgICAgICAgY29uc29sZS5pbmZvKFxuICAgICAgICAgIGNoYWxrLmdyZWVuKFxuICAgICAgICAgICAgYENyZWF0ZWQgJHtwYXRoVG9SZWxhdGl2ZVBhdGgob3V0cHV0T3B0aW9uc0xpc3QubWFwKChvcHRzKSA9PiBvcHRzLmZpbGUgfHwgb3B0cy5kaXIgfHwgJycpKS5qb2luKFxuICAgICAgICAgICAgICAnLCAnXG4gICAgICAgICAgICApfSBpbiAke2NoYWxrLmJvbGQobXMoRGF0ZS5ub3coKSAtIHN0YXJ0VGltZSkpfWBcbiAgICAgICAgICApXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGJ1aWxkRmFpbGVkID0gdHJ1ZTtcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ0ZhaWxlZCB0byBidWlsZCBkdWUgdG86JywgZXJyb3IpO1xuICAgIH1cbiAgICBhd2FpdCBidW5kbGU/LmNsb3NlKCk7XG4gICAgaWYgKGJ1aWxkRmFpbGVkKSBwcm9jZXNzLmV4aXQoMSk7XG5cbiAgICBpZiAoXG4gICAgICB0YXJnZXREZXRhaWwgIT09ICdhcHAtbm9kZScgJiZcbiAgICAgIHRhcmdldERldGFpbCAhPT0gJ2Z1bmN0aW9ucycgJiZcbiAgICAgICEoYXdhaXQgZ2VuZXJhdGVEZWNsYXJhdGlvbkZpbGVzKGFyZ3YsIHBhY2thZ2VEaXJQYXRoKSlcbiAgICApIHtcbiAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gd2F0Y2hSb2xsdXAoXG4gIGFyZ3Y6IEFyZ3VtZW50c1R5cGU8QW55QnVpbGRlclR5cGU+LFxuICB0YXJnZXREZXRhaWw6IHN0cmluZyxcbiAgcGFja2FnZURpclBhdGg6IHN0cmluZyxcbiAgb3B0aW9uczogUm9sbHVwT3B0aW9ucyxcbiAgb3V0cHV0T3B0aW9uc0xpc3Q6IE91dHB1dE9wdGlvbnNbXSxcbiAgcGF0aFRvUmVsYXRpdmVQYXRoOiAocGF0aHM6IHN0cmluZyB8IFJlYWRvbmx5PHN0cmluZ1tdPikgPT4gc3RyaW5nW11cbik6IHZvaWQge1xuICBjb25zdCB3YXRjaGVyID0gd2F0Y2goeyAuLi5vcHRpb25zLCBvdXRwdXQ6IG91dHB1dE9wdGlvbnNMaXN0IH0pO1xuXG4gIGNvbnN0IGNsb3NlID0gYXN5bmMgKGNvZGU6IG51bWJlciB8IG51bGwgfCB1bmRlZmluZWQpOiBQcm9taXNlPHZvaWQ+ID0+IHtcbiAgICBwcm9jZXNzLnJlbW92ZUxpc3RlbmVyKCd1bmNhdWdodEV4Y2VwdGlvbicsIGNsb3NlKTtcbiAgICBwcm9jZXNzLnN0ZGluLnJlbW92ZUxpc3RlbmVyKCdlbmQnLCBjbG9zZSk7XG4gICAgaWYgKHdhdGNoZXIpIGF3YWl0IHdhdGNoZXIuY2xvc2UoKTtcbiAgICBpZiAoY29kZSkgcHJvY2Vzcy5leGl0KGNvZGUpO1xuICB9O1xuICBvbkV4aXQoY2xvc2UgYXMgdW5rbm93biBhcyBIYW5kbGVyKTtcbiAgcHJvY2Vzcy5vbigndW5jYXVnaHRFeGNlcHRpb24nLCBjbG9zZSk7XG4gIGlmICghcHJvY2Vzcy5zdGRpbi5pc1RUWSkge1xuICAgIHByb2Nlc3Muc3RkaW4ub24oJ2VuZCcsIGNsb3NlKTtcbiAgICBwcm9jZXNzLnN0ZGluLnJlc3VtZSgpO1xuICB9XG5cbiAgd2F0Y2hlci5vbignZXZlbnQnLCBhc3luYyAoZXZlbnQpID0+IHtcbiAgICBzd2l0Y2ggKGV2ZW50LmNvZGUpIHtcbiAgICAgIGNhc2UgJ0VSUk9SJzoge1xuICAgICAgICBoYW5kbGVFcnJvcihldmVudC5lcnJvciwgdHJ1ZSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgY2FzZSAnQlVORExFX1NUQVJUJzoge1xuICAgICAgICBpZiAoYXJndi5zaWxlbnQpIGJyZWFrO1xuXG4gICAgICAgIGNvbnN0IGV2ZW50SW5wdXQgPSBldmVudC5pbnB1dDtcbiAgICAgICAgY29uc3QgaW5wdXRGaWxlczogc3RyaW5nW10gPSBbXTtcbiAgICAgICAgaWYgKHR5cGVvZiBldmVudElucHV0ID09PSAnc3RyaW5nJykge1xuICAgICAgICAgIGlucHV0RmlsZXMucHVzaChldmVudElucHV0KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBpbnB1dEZpbGVzLnB1c2goXG4gICAgICAgICAgICAuLi4oQXJyYXkuaXNBcnJheShldmVudElucHV0KSA/IGV2ZW50SW5wdXQgOiBPYmplY3QudmFsdWVzKGV2ZW50SW5wdXQgYXMgUmVjb3JkPHN0cmluZywgc3RyaW5nPikpXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zb2xlLmluZm8oXG4gICAgICAgICAgY2hhbGsuY3lhbihcbiAgICAgICAgICAgIGBCdW5kbGVzICR7Y2hhbGsuYm9sZChwYXRoVG9SZWxhdGl2ZVBhdGgoaW5wdXRGaWxlcykuam9pbignLCAnKSl9IOKGkiAke2NoYWxrLmJvbGQoXG4gICAgICAgICAgICAgIHBhdGhUb1JlbGF0aXZlUGF0aChldmVudC5vdXRwdXQpLmpvaW4oJywgJylcbiAgICAgICAgICAgICl9XFxub24gJHtwYWNrYWdlRGlyUGF0aH0gLi4uYFxuICAgICAgICAgIClcbiAgICAgICAgKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBjYXNlICdCVU5ETEVfRU5EJzoge1xuICAgICAgICBpZiAoYXJndi5zaWxlbnQpIGJyZWFrO1xuXG4gICAgICAgIGNvbnNvbGUuaW5mbyhcbiAgICAgICAgICBjaGFsay5ncmVlbihcbiAgICAgICAgICAgIGBDcmVhdGVkICR7Y2hhbGsuYm9sZChwYXRoVG9SZWxhdGl2ZVBhdGgoZXZlbnQub3V0cHV0KS5qb2luKCcsICcpKX0gaW4gJHtjaGFsay5ib2xkKG1zKGV2ZW50LmR1cmF0aW9uKSl9YFxuICAgICAgICAgIClcbiAgICAgICAgKTtcblxuICAgICAgICBpZiAodGFyZ2V0RGV0YWlsICE9PSAnYXBwLW5vZGUnICYmIHRhcmdldERldGFpbCAhPT0gJ2Z1bmN0aW9ucycpIHtcbiAgICAgICAgICBhd2FpdCBnZW5lcmF0ZURlY2xhcmF0aW9uRmlsZXMoYXJndiwgcGFja2FnZURpclBhdGgpO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgY2FzZSAnRU5EJzoge1xuICAgICAgICBpZiAoYXJndi5zaWxlbnQpIGJyZWFrO1xuXG4gICAgICAgIGNvbnNvbGUuaW5mbyhgXFxuWyR7ZGF0ZVRpbWUoKX1dIHdhaXRpbmcgZm9yIGNoYW5nZXMuLi5gKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKCdyZXN1bHQnIGluIGV2ZW50ICYmIGV2ZW50LnJlc3VsdCkge1xuICAgICAgdm9pZCBldmVudC5yZXN1bHQuY2xvc2UoKTtcbiAgICB9XG4gIH0pO1xufVxuXG5mdW5jdGlvbiB2ZXJpZnlJbnB1dChhcmd2OiBBcmd1bWVudHNUeXBlPHR5cGVvZiBidWlsZGVyPiwgY3dkOiBzdHJpbmcsIHBhY2thZ2VEaXJQYXRoOiBzdHJpbmcpOiBzdHJpbmdbXSB7XG4gIGlmIChhcmd2LmlucHV0ICYmIGFyZ3YuaW5wdXQubGVuZ3RoID4gMCkgcmV0dXJuIGFyZ3YuaW5wdXQubWFwKChwKSA9PiBwYXRoLnJlc29sdmUoY3dkLCBwLnRvU3RyaW5nKCkpKTtcblxuICBjb25zdCBzcmNEaXJQYXRoID0gcGF0aC5qb2luKHBhY2thZ2VEaXJQYXRoLCAnc3JjJyk7XG4gIGZvciAoY29uc3QgZXh0IG9mIFsndHMnLCAndHN4JywgJ2N0cycsICdtdHMnXSkge1xuICAgIGNvbnN0IGlucHV0ID0gcGF0aC5qb2luKHNyY0RpclBhdGgsIGBpbmRleC4ke2V4dH1gKTtcbiAgICBpZiAoZnMuZXhpc3RzU3luYyhpbnB1dCkpIHJldHVybiBbaW5wdXRdO1xuICB9XG5cbiAgY29uc29sZS5lcnJvcignRmFpbGVkIHRvIGRldGVjdCBpbnB1dCBmaWxlLicpO1xuICBwcm9jZXNzLmV4aXQoMSk7XG59XG5cbmZ1bmN0aW9uIGRldGVjdFRhcmdldERldGFpbCh0YXJnZXRDYXRlZ29yeTogc3RyaW5nLCBpbnB1dHM6IHN0cmluZ1tdLCBwYWNrYWdlRGlyUGF0aDogc3RyaW5nKTogVGFyZ2V0RGV0YWlsIHtcbiAgc3dpdGNoICh0YXJnZXRDYXRlZ29yeSkge1xuICAgIGNhc2UgJ2FwcCc6IHtcbiAgICAgIHJldHVybiAnYXBwLW5vZGUnO1xuICAgIH1cbiAgICBjYXNlICdmdW5jdGlvbnMnOiB7XG4gICAgICByZXR1cm4gJ2Z1bmN0aW9ucyc7XG4gICAgfVxuICAgIGNhc2UgJ2xpYic6IHtcbiAgICAgIGlmIChpbnB1dHMuc29tZSgoaW5wdXQpID0+IGlucHV0LmVuZHNXaXRoKCcudHN4JykpIHx8IGRvZXNTcmNDb250YWluVHN4KHBhY2thZ2VEaXJQYXRoKSkge1xuICAgICAgICByZXR1cm4gJ2xpYi1yZWFjdCc7XG4gICAgICB9XG4gICAgICByZXR1cm4gJ2xpYic7XG4gICAgfVxuICAgIGRlZmF1bHQ6IHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ3RhcmdldCBvcHRpb24gbXVzdCBiZSBvbmUgb2Y6ICcgKyBhbGxUYXJnZXRDYXRlZ29yaWVzLmpvaW4oJywgJykpO1xuICAgICAgcHJvY2Vzcy5leGl0KDEpO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBkb2VzU3JjQ29udGFpblRzeChwYWNrYWdlRGlyUGF0aDogc3RyaW5nKTogYm9vbGVhbiB7XG4gIGNvbnN0IHNyY0RpclBhdGggPSBwYXRoLmpvaW4ocGFja2FnZURpclBhdGgsICdzcmMnKTtcbiAgcmV0dXJuIGRvZXNEaXJlY3RvcnlDb250YWluVHN4KHNyY0RpclBhdGgpO1xufVxuXG5mdW5jdGlvbiBkb2VzRGlyZWN0b3J5Q29udGFpblRzeChkaXJQYXRoOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgdHJ5IHtcbiAgICBjb25zdCBlbnRyaWVzID0gZnMucmVhZGRpclN5bmMoZGlyUGF0aCwgeyB3aXRoRmlsZVR5cGVzOiB0cnVlIH0pO1xuICAgIHJldHVybiBlbnRyaWVzLnNvbWUoKGVudHJ5KSA9PiB7XG4gICAgICBjb25zdCBlbnRyeVBhdGggPSBwYXRoLmpvaW4oZGlyUGF0aCwgZW50cnkubmFtZSk7XG4gICAgICBpZiAoZW50cnkuaXNEaXJlY3RvcnkoKSkgcmV0dXJuIGRvZXNEaXJlY3RvcnlDb250YWluVHN4KGVudHJ5UGF0aCk7XG4gICAgICByZXR1cm4gZW50cnkuaXNGaWxlKCkgJiYgZW50cnkubmFtZS5lbmRzV2l0aCgnLnRzeCcpO1xuICAgIH0pO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn1cblxuYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVQYWNrYWdlSnNvbkZvckZ1bmN0aW9ucyhcbiAgcGFja2FnZURpclBhdGg6IHN0cmluZyxcbiAgcGFja2FnZUpzb246IFBhY2thZ2VKc29uLFxuICBtb2R1bGVUeXBlOiBzdHJpbmcgfCB1bmRlZmluZWRcbik6IFByb21pc2U8dm9pZD4ge1xuICBwYWNrYWdlSnNvbi5uYW1lICs9ICctZGlzdCc7XG4gIGNvbnN0IGVzbVBhY2thZ2UgPSBwYWNrYWdlSnNvbi50eXBlID09PSAnbW9kdWxlJztcbiAgY29uc3QgZXNtT3V0cHV0ID0gaXNFc21PdXRwdXQoZXNtUGFja2FnZSwgbW9kdWxlVHlwZSk7XG4gIHBhY2thZ2VKc29uLm1haW4gPSBlc21QYWNrYWdlID09PSBlc21PdXRwdXQgPyAnaW5kZXguanMnIDogZXNtT3V0cHV0ID8gJ2luZGV4Lm1qcycgOiAnaW5kZXguY2pzJztcblxuICAvLyBQcmV2ZW50IEZpcmViYXNlIEZ1bmN0aW9ucyBmcm9tIHJ1bm5pbmcgYGJ1aWxkYCBzY3JpcHQgc2luY2Ugd2UgYXJlIGJ1aWxkaW5nIGNvZGUgYmVmb3JlIGRlcGxveWluZy5cbiAgZGVsZXRlIHBhY2thZ2VKc29uLnNjcmlwdHM7XG4gIC8vIGRldkRlcGVuZGVuY2llcyBhcmUgbm90IHJlcXVpcmVkIHNpbmNlIHdlIGFyZSBidWlsZGluZyBjb2RlIGJlZm9yZSBkZXBsb3lpbmcuXG4gIGRlbGV0ZSBwYWNrYWdlSnNvbi5kZXZEZXBlbmRlbmNpZXM7XG5cbiAgYXdhaXQgZnMucHJvbWlzZXMubWtkaXIocGF0aC5qb2luKHBhY2thZ2VEaXJQYXRoLCAnZGlzdCcpLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgYXdhaXQgZnMucHJvbWlzZXMud3JpdGVGaWxlKHBhdGguam9pbihwYWNrYWdlRGlyUGF0aCwgJ2Rpc3QnLCAncGFja2FnZS5qc29uJyksIEpTT04uc3RyaW5naWZ5KHBhY2thZ2VKc29uKSk7XG59XG5cbmZ1bmN0aW9uIGdldE91dHB1dE9wdGlvbnNMaXN0KFxuICBhcmd2OiBBcmd1bWVudHNUeXBlPEFueUJ1aWxkZXJUeXBlPixcbiAgdGFyZ2V0RGV0YWlsOiBUYXJnZXREZXRhaWwsXG4gIHBhY2thZ2VEaXJQYXRoOiBzdHJpbmcsXG4gIGlzRXNtUGFja2FnZTogYm9vbGVhblxuKTogT3V0cHV0T3B0aW9uc1tdIHtcbiAgY29uc3Qgb3V0RGlyUGF0aCA9IHBhdGguam9pbihwYWNrYWdlRGlyUGF0aCwgJ2Rpc3QnKTtcbiAgaWYgKHRhcmdldERldGFpbCA9PT0gJ2FwcC1ub2RlJyB8fCB0YXJnZXREZXRhaWwgPT09ICdmdW5jdGlvbnMnKSB7XG4gICAgcmV0dXJuIFtcbiAgICAgIHtcbiAgICAgICAgZGlyOiBvdXREaXJQYXRoLFxuICAgICAgICBmb3JtYXQ6IGlzRXNtT3V0cHV0KGlzRXNtUGFja2FnZSwgYXJndi5tb2R1bGVUeXBlKSA/ICdtb2R1bGUnIDogJ2NvbW1vbmpzJyxcbiAgICAgICAgc291cmNlbWFwOiBhcmd2LnNvdXJjZW1hcCAmJiAnaW5saW5lJyxcbiAgICAgIH0sXG4gICAgXTtcbiAgfVxuXG4gIC8vIFRoZSBmb2xsb3dpbmcgaW1wb3J0IHN0YXRlbWVudCBpbiBhbiBlc20gbW9kdWxlIGNhdXNlcyB0aGUgZm9sbG93aW5nIGVycm9yOlxuICAvLyBTdGF0ZW1lbnQ6XG4gIC8vICAgaW1wb3J0IHsgdXNlUHJldmlvdXMgfSBmcm9tICdyZWFjdC11c2UnO1xuICAvLyBFcnJvcjpcbiAgLy8gICBOYW1lZCBleHBvcnQgJ3VzZVByZXZpb3VzJyBub3QgZm91bmQuIFRoZSByZXF1ZXN0ZWQgbW9kdWxlICdyZWFjdC11c2UnIGlzIGEgQ29tbW9uSlMgbW9kdWxlLFxuICAvLyAgIHdoaWNoIG1heSBub3Qgc3VwcG9ydCBhbGwgbW9kdWxlLmV4cG9ydHMgYXMgbmFtZWQgZXhwb3J0cy5cbiAgLy8gV2UgbmVlZCBjanMgbW9kdWxlcyBmb3Igd2ViIGFwcHMgdG8gYXZvaWQgdGhlIGVycm9yLlxuICAvLyBBbHNvLCBzcGxpdHRpbmcgYSBsaWJyYXJ5IGlzIHVzZWZ1bCBpbiBib3RoIG1vZHVsZXMsIHNvIHByZXNlcnZlTW9kdWxlcyBzaG91bGQgYmUgdHJ1ZS5cbiAgY29uc3Qgb3V0cHV0T3B0aW9uc0xpc3Q6IE91dHB1dE9wdGlvbnNbXSA9IFtdO1xuICBjb25zdCBtb2R1bGVUeXBlID0gYXJndi5tb2R1bGVUeXBlIHx8ICdib3RoJztcbiAgY29uc3QganNFeHQgPSBhcmd2LmpzRXh0ZW5zaW9uIHx8ICdlaXRoZXInO1xuICBpZiAobW9kdWxlVHlwZSA9PT0gJ2NqcycgfHwgbW9kdWxlVHlwZSA9PT0gJ2JvdGgnIHx8IChtb2R1bGVUeXBlID09PSAnZWl0aGVyJyAmJiAhaXNFc21QYWNrYWdlKSkge1xuICAgIG91dHB1dE9wdGlvbnNMaXN0LnB1c2goe1xuICAgICAgZGlyOiBvdXREaXJQYXRoLFxuICAgICAgZW50cnlGaWxlTmFtZXM6IGpzRXh0ID09PSAnYm90aCcgfHwgKGpzRXh0ID09PSAnZWl0aGVyJyAmJiAhaXNFc21QYWNrYWdlKSA/ICdbbmFtZV0uanMnIDogJ1tuYW1lXS5janMnLFxuICAgICAgZm9ybWF0OiAnY29tbW9uanMnLFxuICAgICAgcHJlc2VydmVNb2R1bGVzOiB0cnVlLFxuICAgICAgcHJlc2VydmVNb2R1bGVzUm9vdDogcGF0aC5qb2luKHBhY2thZ2VEaXJQYXRoLCAnc3JjJyksXG4gICAgICBzb3VyY2VtYXA6IGFyZ3Yuc291cmNlbWFwLFxuICAgIH0pO1xuICB9XG4gIGlmIChtb2R1bGVUeXBlID09PSAnZXNtJyB8fCBtb2R1bGVUeXBlID09PSAnYm90aCcgfHwgKG1vZHVsZVR5cGUgPT09ICdlaXRoZXInICYmIGlzRXNtUGFja2FnZSkpIHtcbiAgICBvdXRwdXRPcHRpb25zTGlzdC5wdXNoKHtcbiAgICAgIGRpcjogb3V0RGlyUGF0aCxcbiAgICAgIGVudHJ5RmlsZU5hbWVzOiBqc0V4dCA9PT0gJ2JvdGgnIHx8IChqc0V4dCA9PT0gJ2VpdGhlcicgJiYgaXNFc21QYWNrYWdlKSA/ICdbbmFtZV0uanMnIDogJ1tuYW1lXS5tanMnLFxuICAgICAgZm9ybWF0OiAnbW9kdWxlJyxcbiAgICAgIHByZXNlcnZlTW9kdWxlczogdHJ1ZSxcbiAgICAgIHByZXNlcnZlTW9kdWxlc1Jvb3Q6IHBhdGguam9pbihwYWNrYWdlRGlyUGF0aCwgJ3NyYycpLFxuICAgICAgc291cmNlbWFwOiBhcmd2LnNvdXJjZW1hcCxcbiAgICB9KTtcbiAgfVxuICByZXR1cm4gb3V0cHV0T3B0aW9uc0xpc3Q7XG59XG5cbmZ1bmN0aW9uIGlzRXNtT3V0cHV0KGlzRXNtUGFja2FnZTogYm9vbGVhbiwgbW9kdWxlVHlwZTogc3RyaW5nIHwgdW5kZWZpbmVkKTogYm9vbGVhbiB7XG4gIHJldHVybiBtb2R1bGVUeXBlID09PSAnZXNtJyB8fCAoKCFtb2R1bGVUeXBlIHx8IG1vZHVsZVR5cGUgPT09ICdlaXRoZXInKSAmJiBpc0VzbVBhY2thZ2UpO1xufVxuIiwiaW1wb3J0IHByb2Nlc3MgZnJvbSAnbm9kZTpwcm9jZXNzJztcblxuaW1wb3J0IGNoYWxrIGZyb20gJ2NoYWxrJztcbmltcG9ydCB0eXBlIHsgUm9sbHVwRXJyb3IgfSBmcm9tICdyb2xsdXAnO1xuXG5leHBvcnQgZnVuY3Rpb24gaGFuZGxlRXJyb3IoZXJyb3I6IFJvbGx1cEVycm9yLCByZWNvdmVyID0gZmFsc2UpOiB2b2lkIHtcbiAgY29uc3QgbmFtZSA9IGVycm9yLm5hbWUgfHwgKGVycm9yLmNhdXNlIGFzIEVycm9yKT8ubmFtZTtcbiAgY29uc3QgbmFtZVNlY3Rpb24gPSBuYW1lID8gYCR7bmFtZX06IGAgOiAnJztcbiAgY29uc3QgcGx1Z2luU2VjdGlvbiA9IGVycm9yLnBsdWdpbiA/IGAocGx1Z2luICR7ZXJyb3IucGx1Z2lufSkgYCA6ICcnO1xuICBjb25zdCBtZXNzYWdlID0gYCR7cGx1Z2luU2VjdGlvbn0ke25hbWVTZWN0aW9ufSR7ZXJyb3IubWVzc2FnZX1gO1xuXG4gIGNvbnN0IG91dHB1dExpbmVzID0gW2NoYWxrLmJvbGQoY2hhbGsucmVkKGBbIV0gJHtjaGFsay5ib2xkKG1lc3NhZ2UudG9TdHJpbmcoKSl9YCkpXTtcblxuICBpZiAoZXJyb3IudXJsKSB7XG4gICAgb3V0cHV0TGluZXMucHVzaChjaGFsay5jeWFuKGVycm9yLnVybCkpO1xuICB9XG5cbiAgaWYgKGVycm9yLmxvYykge1xuICAgIG91dHB1dExpbmVzLnB1c2goYCR7ZXJyb3IubG9jLmZpbGUgfHwgZXJyb3IuaWR9ICgke2Vycm9yLmxvYy5saW5lfToke2Vycm9yLmxvYy5jb2x1bW59KWApO1xuICB9IGVsc2UgaWYgKGVycm9yLmlkKSB7XG4gICAgb3V0cHV0TGluZXMucHVzaChlcnJvci5pZCk7XG4gIH1cblxuICBpZiAoZXJyb3IuZnJhbWUpIHtcbiAgICBvdXRwdXRMaW5lcy5wdXNoKGNoYWxrLmRpbShlcnJvci5mcmFtZSkpO1xuICB9XG5cbiAgaWYgKGVycm9yLnN0YWNrKSB7XG4gICAgb3V0cHV0TGluZXMucHVzaChjaGFsay5kaW0oZXJyb3Iuc3RhY2s/LnJlcGxhY2UoYCR7bmFtZVNlY3Rpb259JHtlcnJvci5tZXNzYWdlfVxcbmAsICcnKSkpO1xuICB9XG5cbiAgb3V0cHV0TGluZXMucHVzaCgnJywgJycpO1xuICBjb25zb2xlLmVycm9yKG91dHB1dExpbmVzLmpvaW4oJ1xcbicpKTtcblxuICBpZiAoIXJlY292ZXIpIHByb2Nlc3MuZXhpdCgxKTtcbn1cbiIsImltcG9ydCAqIGFzIGNoaWxkX3Byb2Nlc3MgZnJvbSAnbm9kZTpjaGlsZF9wcm9jZXNzJztcblxuaW1wb3J0IHR5cGUgeyBDb21tYW5kTW9kdWxlLCBJbmZlcnJlZE9wdGlvblR5cGVzIH0gZnJvbSAneWFyZ3MnO1xuXG5pbXBvcnQgeyBsb2FkRW52aXJvbm1lbnRWYXJpYWJsZXNXaXRoQ2FjaGUgfSBmcm9tICcuLi9lbnYuanMnO1xuaW1wb3J0IHsgc2hhcmVkT3B0aW9uc0J1aWxkZXIgfSBmcm9tICcuLi9zaGFyZWRPcHRpb25zQnVpbGRlci5qcyc7XG5cbmNvbnN0IGJ1aWxkZXIgPSB7XG4gIC4uLnNoYXJlZE9wdGlvbnNCdWlsZGVyLFxuICBtb2R1bGU6IHtcbiAgICBkZXNjcmlwdGlvbjogJ0EgbW9kdWxlIHR5cGU6IGNqcyBvciBlc20nLFxuICAgIHR5cGU6ICdzdHJpbmcnLFxuICAgIGFsaWFzOiAnbScsXG4gIH0sXG4gIHdhdGNoOiB7XG4gICAgZGVzY3JpcHRpb246ICdXaGV0aGVyIHdhdGNoIG1vZGUgaXMgZW5hYmxlZCBvciBub3QnLFxuICAgIHR5cGU6ICdib29sZWFuJyxcbiAgICBhbGlhczogJ3cnLFxuICB9LFxufSBhcyBjb25zdDtcblxuZXhwb3J0IGNvbnN0IHJ1bjogQ29tbWFuZE1vZHVsZTx1bmtub3duLCBJbmZlcnJlZE9wdGlvblR5cGVzPHR5cGVvZiBidWlsZGVyPj4gPSB7XG4gIGNvbW1hbmQ6ICdydW4gPGZpbGU+JyxcbiAgZGVzY3JpYmU6ICdSdW4gc2NyaXB0JyxcbiAgYnVpbGRlcixcbiAgaGFuZGxlcihhcmd2KSB7XG4gICAgbG9hZEVudmlyb25tZW50VmFyaWFibGVzV2l0aENhY2hlKGFyZ3YsIHByb2Nlc3MuY3dkKCkpO1xuXG4gICAgY29uc3QgZmlsZSA9IGFyZ3YuZmlsZT8udG9TdHJpbmcoKSA/PyAnJztcblxuICAgIC8vIGNmLiBodHRwczovL2J1bi5zaC9ndWlkZXMvdXRpbC9kZXRlY3QtYnVuXG4gICAgY29uc3QgaXNSdW5uaW5nT25CdW4gPSBwcm9jZXNzLnZlcnNpb25zLmJ1bjtcbiAgICBjb25zdCBydW50aW1lID0gaXNSdW5uaW5nT25CdW4gPyAnYnVuJyA6ICdub2RlJztcbiAgICBjb25zdCBhcmdzID0gaXNSdW5uaW5nT25CdW4gPyBbJy0tYnVuJ10gOiBbJy0tbm8td2FybmluZ3MnLCAnLS1pbXBvcnQnLCAndHN4J107XG4gICAgaWYgKGFyZ3Yud2F0Y2gpIHtcbiAgICAgIGFyZ3MucHVzaCgnLS13YXRjaCcpO1xuICAgIH1cbiAgICBhcmdzLnB1c2goZmlsZSk7XG4gICAgY29uc3QgWywgLi4uYWRkaXRpb25hbEFyZ3VtZW50c10gPSBhcmd2Ll87XG4gICAgY29uc3QgcnVudGltZUFyZ3MgPSBbLi4uYXJncywgLi4uYWRkaXRpb25hbEFyZ3VtZW50cy5tYXAoKGFyZykgPT4gYXJnLnRvU3RyaW5nKCkpXTtcbiAgICBpZiAoYXJndi52ZXJib3NlKSB7XG4gICAgICBjb25zb2xlLmluZm8oYFJ1bm5pbmcgJyR7cnVudGltZX0gJHtydW50aW1lQXJncy5qb2luKCcgJyl9J2ApO1xuICAgIH1cbiAgICBjb25zdCByZXQgPSBjaGlsZF9wcm9jZXNzLnNwYXduU3luYyhydW50aW1lLCBydW50aW1lQXJncywge1xuICAgICAgc3RkaW86ICdpbmhlcml0JyxcbiAgICAgIGVudjogeyAuLi5wcm9jZXNzLmVudiB9LFxuICAgIH0pO1xuICAgIHByb2Nlc3MuZXhpdChyZXQuc3RhdHVzID8/IDEpO1xuICB9LFxufTtcbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB7IHJlbW92ZU5wbUFuZFlhcm5FbnZpcm9ubWVudFZhcmlhYmxlcyB9IGZyb20gJ0B3aWxsYm9vc3Rlci9zaGFyZWQtbGliLW5vZGUnO1xuaW1wb3J0IHlhcmdzIGZyb20gJ3lhcmdzJztcbmltcG9ydCB7IGhpZGVCaW4gfSBmcm9tICd5YXJncy9oZWxwZXJzJztcblxuaW1wb3J0IHsgYXBwLCBmdW5jdGlvbnMsIGxpYiB9IGZyb20gJy4vY29tbWFuZHMvYnVpbGQvYnVpbGQuanMnO1xuaW1wb3J0IHsgcnVuIH0gZnJvbSAnLi9jb21tYW5kcy9ydW4uanMnO1xuaW1wb3J0IHsgc2hhcmVkT3B0aW9uc0J1aWxkZXIgfSBmcm9tICcuL3NoYXJlZE9wdGlvbnNCdWlsZGVyLmpzJztcblxucmVtb3ZlTnBtQW5kWWFybkVudmlyb25tZW50VmFyaWFibGVzKHByb2Nlc3MuZW52KTtcblxuYXdhaXQgeWFyZ3MoaGlkZUJpbihwcm9jZXNzLmFyZ3YpKVxuICAuc2NyaXB0TmFtZSgnYnVpbGQtdHMnKVxuICAub3B0aW9ucyhzaGFyZWRPcHRpb25zQnVpbGRlcilcbiAgLmNvbW1hbmQoYXBwKVxuICAuY29tbWFuZChmdW5jdGlvbnMpXG4gIC5jb21tYW5kKGxpYilcbiAgLmNvbW1hbmQocnVuKVxuICAuZGVtYW5kQ29tbWFuZCgpXG4gIC5zdHJpY3QoKVxuICAudmVyc2lvbihnZXRWZXJzaW9uKCkpXG4gIC5oZWxwKCkuYXJndjtcblxuZnVuY3Rpb24gZ2V0VmVyc2lvbigpOiBzdHJpbmcge1xuICBsZXQgcGFja2FnZUpzb25EaXIgPSBwYXRoLmRpcm5hbWUobmV3IFVSTChpbXBvcnQubWV0YS51cmwpLnBhdGhuYW1lKTtcbiAgd2hpbGUgKCFmcy5leGlzdHNTeW5jKHBhdGguam9pbihwYWNrYWdlSnNvbkRpciwgJ3BhY2thZ2UuanNvbicpKSkge1xuICAgIHBhY2thZ2VKc29uRGlyID0gcGF0aC5kaXJuYW1lKHBhY2thZ2VKc29uRGlyKTtcbiAgfVxuICBjb25zdCBwYWNrYWdlSnNvbiA9IEpTT04ucGFyc2UoZnMucmVhZEZpbGVTeW5jKHBhdGguam9pbihwYWNrYWdlSnNvbkRpciwgJ3BhY2thZ2UuanNvbicpLCAndXRmOCcpKSBhcyB7XG4gICAgdmVyc2lvbjogc3RyaW5nO1xuICB9O1xuICByZXR1cm4gcGFja2FnZUpzb24udmVyc2lvbjtcbn1cbiJdLCJuYW1lcyI6WyJlbnZWYXJzIiwibG9hZEVudmlyb25tZW50VmFyaWFibGVzV2l0aENhY2hlIiwiYXJndiIsImN3ZCIsInJlYWRBbmRBcHBseUVudmlyb25tZW50VmFyaWFibGVzIiwidmVyYm9zZSIsImNvbnNvbGUiLCJpbmZvIiwiT2JqZWN0Iiwia2V5cyIsImNyZWF0ZUVudmlyb25tZW50VmFyaWFibGVzRGVmaW5pdGlvbiIsImVudlZhcnNEZWYiLCJlbnZWYXJOYW1lcyIsIlNldCIsImlubGluZSIsImZsYXRNYXAiLCJlIiwidG9TdHJpbmciLCJzcGxpdCIsImF1dG9JbmxpbmUiLCJuYW1lIiwidW5kZWZpbmVkIiwicHJvY2VzcyIsImVudiIsIkpTT04iLCJzdHJpbmdpZnkiLCJhbGxUYXJnZXRDYXRlZ29yaWVzIiwiYXN5bmMiLCJyZWFkUGFja2FnZUpzb24iLCJkaXJQYXRoIiwicGFja2FnZUpzb25QYXRoIiwicGF0aCIsImpvaW4iLCJwYWNrYWdlSnNvblRleHQiLCJmcyIsInByb21pc2VzIiwicmVhZEZpbGUiLCJwYXJzZSIsInNoYXJlZE9wdGlvbnNCdWlsZGVyIiwieWFyZ3NPcHRpb25zQnVpbGRlckZvckVudiIsInNpbGVudCIsImRlc2NyaXB0aW9uIiwidHlwZSIsImFsaWFzIiwiYnVpbGRlciIsImlucHV0IiwiZGVmYXVsdCIsIm1pbmlmeSIsInNvdXJjZW1hcCIsImV4dGVybmFsIiwid2F0Y2giLCJrZWVwSW1wb3J0IiwiYnVuZGxlQnVpbHRpbnMiLCJhcHBCdWlsZGVyIiwibW9kdWxlVHlwZSIsImZ1bmN0aW9uc0J1aWxkZXIiLCJvbmx5UGFja2FnZUpzb24iLCJsaWJCdWlsZGVyIiwianNFeHRlbnNpb24iLCJzZXR1cFBsdWdpbnMiLCJ0YXJnZXREZXRhaWwiLCJwYWNrYWdlSnNvbiIsIm5hbWVzcGFjZSIsInBhY2thZ2VEaXJQYXRoIiwib3V0cHV0T3B0aW9uc0xpc3QiLCJleHRlcm5hbERlcHMiLCJtYXAiLCJpdGVtIiwiZGVwZW5kZW5jaWVzIiwicHVzaCIsInBlZXJEZXBlbmRlbmNpZXMiLCJvcHRpb25hbERlcGVuZGVuY2llcyIsImV4aXN0c1N5bmMiLCJwYWNrYWdlRGlycyIsInJlYWRkaXJTeW5jIiwid2l0aEZpbGVUeXBlcyIsInBhY2thZ2VEaXIiLCJpc0RpcmVjdG9yeSIsIm90aGVyUGFja2FnZUpzb24iLCJyZWFkRmlsZVN5bmMiLCJleHRlbnNpb25zIiwiYmFiZWxDb25maWdQYXRoIiwidXJsIiwiZmlsZVVSTFRvUGF0aCIsImRpcm5hbWUiLCJyZXBsYWNlUGx1Z2luIiwiZ2V0RGVmYXVsdFBsdWdpbkZhY3RvcnkiLCJyZXBsYWNlIiwianNvblBsdWdpbiIsImpzb24iLCJyZXNvbHZlUGx1Z2luIiwicmVzb2x2ZSIsImNvbW1vbmpzUGx1Z2luIiwiY29tbW9uanMiLCJ0ZXJzZXJQbHVnaW4iLCJ0ZXJzZXIiLCJhbmFseXplUGx1Z2luIiwiYW5hbHl6ZSIsInBsdWdpbnMiLCJkZWxpbWl0ZXJzIiwicHJldmVudEFzc2lnbm1lbnQiLCJ2YWx1ZXMiLCJub2RlRXh0ZXJuYWxzIiwiZGVwcyIsImRldkRlcHMiLCJwZWVyRGVwcyIsIm9wdERlcHMiLCJpbmNsdWRlIiwiUmVnRXhwIiwiZXhjbHVkZSIsInNob3VsZEJ1bmRsZVNhbWVOYW1lc3BhY2VEZXBlbmRlbmNpZXMiLCJwcmVmZXJCdWlsdGlucyIsImlkIiwiaW5jbHVkZXMiLCJtb2R1bGVOYW1lcyIsImlzQmFiZWxIZWxwZXJzQnVuZGxlZCIsIkJVSUxEVFNfVVNFX0JBQkxFX1JVTlRJTUUiLCJiYWJlbCIsImNvbmZpZ0ZpbGUiLCJiYWJlbEhlbHBlcnMiLCJzb21lIiwib3B0cyIsInByZXNlcnZlTW9kdWxlcyIsInByZXNlcnZlRGlyZWN0aXZlcyIsInN0cmluZyIsImNvbXByZXNzIiwiZGlyZWN0aXZlcyIsInN1bW1hcnlPbmx5IiwibW9kdWxlIiwicmVxdWlyZSIsImNyZWF0ZVJlcXVpcmUiLCJnZW5lcmF0ZURlY2xhcmF0aW9uRmlsZXMiLCJjb3JlUHJvamVjdERpclBhdGgiLCJjb3JlQ29uZmlnRmlsZSIsImZpbmRDb25maWdGaWxlIiwiRXJyb3IiLCJwcm9qZWN0cyIsIm91dERpciIsImJhc2VuYW1lIiwicGFyZW50RGlyUGF0aCIsImRpcmVudHMiLCJyZWFkZGlyIiwiZGlyZW50IiwicHJvamVjdERpclBhdGgiLCJhbGxTdWNjZWVkZWQiLCJydW5UeXBlU2NyaXB0TmF0aXZlIiwiY29uZmlnRmlsZURpclBhdGgiLCJ0ZW1wQ29uZmlnRmlsZSIsInBpZCIsIkRhdGUiLCJub3ciLCJ3cml0ZUZpbGUiLCJjb21waWxlck9wdGlvbnMiLCJkZWNsYXJhdGlvbiIsImVtaXREZWNsYXJhdGlvbk9ubHkiLCJub0VtaXQiLCJub0VtaXRPbkVycm9yIiwicm9vdERpciIsInVzZXNOb2RlUHJvdG9jb2xJbXBvcnQiLCJ0eXBlcyIsInR5cGVSb290c0RpclBhdGgiLCJmaWx0ZXIiLCJjb2xsZWN0VHlwZVBhY2thZ2VzIiwiZXh0ZW5kcyIsInRvUmVsYXRpdmVDb25maWdQYXRoIiwiY3JlYXRlVHlwZVNjcmlwdE5hdGl2ZUNvbmZpZyIsInJldCIsImNoaWxkX3Byb2Nlc3MiLCJzcGF3blN5bmMiLCJleGVjUGF0aCIsImdldFR5cGVTY3JpcHROYXRpdmVQYXRoIiwic3RkaW8iLCJlcnJvciIsInN0YXR1cyIsInJtIiwiZm9yY2UiLCJjdXJyZW50RGlyUGF0aCIsImNoaWxkUGF0aCIsInRlc3QiLCJmcm9tRGlyUGF0aCIsInRvRmlsZVBhdGgiLCJyZWxhdGl2ZVBhdGgiLCJyZWxhdGl2ZSIsInJlcGxhY2VBbGwiLCJzZXAiLCJzdGFydHNXaXRoIiwiYXBwIiwiY29tbWFuZCIsImRlc2NyaWJlIiwiaGFuZGxlciIsImJ1aWxkIiwiZnVuY3Rpb25zIiwicGFja2FnZSIsImV4aXQiLCJnZW5lcmF0ZVBhY2thZ2VKc29uRm9yRnVuY3Rpb25zIiwibGliIiwidGFyZ2V0Q2F0ZWdvcnkiLCJOT0RFX0VOViIsImlucHV0cyIsImxlbmd0aCIsInAiLCJzcmNEaXJQYXRoIiwiZXh0IiwidmVyaWZ5SW5wdXQiLCJlbmRzV2l0aCIsImRvZXNEaXJlY3RvcnlDb250YWluVHN4IiwiZG9lc1NyY0NvbnRhaW5Uc3giLCJkZXRlY3RUYXJnZXREZXRhaWwiLCJwYWNrYWdlTmFtZSIsIm1hdGNoIiwiZXhlYyIsImdldE5hbWVzcGFjZUFuZE5hbWUiLCJpc0VzbVBhY2thZ2UiLCJCVUlMRF9UU19DT1JFSlMiLCJCVUlMRF9UU19DT1JFSlNfV0lUSF9QUk9QT1NBTFMiLCJCVUlMRF9UU19WRVJCT1NFIiwiQlVJTERfVFNfVEFSR0VUX0NBVEVHT1JZIiwiQlVJTERfVFNfVEFSR0VUX0RFVEFJTCIsIm91dERpclBhdGgiLCJkaXIiLCJmb3JtYXQiLCJpc0VzbU91dHB1dCIsImpzRXh0IiwiZW50cnlGaWxlTmFtZXMiLCJwcmVzZXJ2ZU1vZHVsZXNSb290IiwiZ2V0T3V0cHV0T3B0aW9uc0xpc3QiLCJjaGRpciIsInJlY3Vyc2l2ZSIsIm9wdGlvbnMiLCJmcm9tRW50cmllcyIsImluZGV4IiwiZXh0bmFtZSIsImNsZWFyU2NyZWVuIiwicGF0aFRvUmVsYXRpdmVQYXRoIiwicGF0aHMiLCJBcnJheSIsImlzQXJyYXkiLCJ3YXRjaGVyIiwib3V0cHV0IiwiY2xvc2UiLCJyZW1vdmVMaXN0ZW5lciIsInN0ZGluIiwiY29kZSIsIm9uRXhpdCIsIm9uIiwiaXNUVFkiLCJyZXN1bWUiLCJldmVudCIsInJlY292ZXIiLCJjYXVzZSIsIm5hbWVTZWN0aW9uIiwibWVzc2FnZSIsInBsdWdpbiIsIm91dHB1dExpbmVzIiwiY2hhbGsiLCJib2xkIiwicmVkIiwiY3lhbiIsImxvYyIsImZpbGUiLCJsaW5lIiwiY29sdW1uIiwiZnJhbWUiLCJkaW0iLCJzdGFjayIsImhhbmRsZUVycm9yIiwiZXZlbnRJbnB1dCIsImlucHV0RmlsZXMiLCJncmVlbiIsIm1zIiwiZHVyYXRpb24iLCJkYXRlVGltZSIsInJlc3VsdCIsIndhdGNoUm9sbHVwIiwiYnVuZGxlIiwiYnVpbGRGYWlsZWQiLCJzdGFydFRpbWUiLCJfYnVuZGxlIiwicm9sbHVwIiwiUHJvbWlzZSIsImFsbCIsIndyaXRlIiwiZW50cnkiLCJlbnRyeVBhdGgiLCJpc0ZpbGUiLCJlc21QYWNrYWdlIiwiZXNtT3V0cHV0IiwibWFpbiIsInNjcmlwdHMiLCJkZXZEZXBlbmRlbmNpZXMiLCJta2RpciIsInJ1biIsImlzUnVubmluZ09uQnVuIiwidmVyc2lvbnMiLCJidW4iLCJydW50aW1lIiwiYXJncyIsImFkZGl0aW9uYWxBcmd1bWVudHMiLCJfIiwicnVudGltZUFyZ3MiLCJhcmciLCJyZW1vdmVOcG1BbmRZYXJuRW52aXJvbm1lbnRWYXJpYWJsZXMiLCJ5YXJncyIsImhpZGVCaW4iLCJzY3JpcHROYW1lIiwiZGVtYW5kQ29tbWFuZCIsInN0cmljdCIsInZlcnNpb24iLCJwYWNrYWdlSnNvbkRpciIsIlVSTCIsInBhdGhuYW1lIiwiZ2V0VmVyc2lvbiIsImhlbHAiXSwibWFwcGluZ3MiOiIwaENBTUEsSUFBSUEsRUFLRyxTQUFTQyxFQUNkQyxFQUNBQyxHQVFBLE9BTktILElBQ0hBLEVBQVVJLEVBQWlDRixFQUFNQyxHQUM3Q0QsRUFBS0csU0FDUEMsUUFBUUMsS0FBSyxtQkFBb0JDLE9BQU9DLEtBQUtULEtBRzFDQSxDQUNULENBS08sU0FBU1UsRUFDZFIsRUFDQUMsR0FFQSxNQUFNUSxFQUFxQyxDQUFBLEVBQ3JDQyxFQUFjLElBQUlDLElBQUksS0FDdEJYLEVBQUtZLFFBQVUsSUFBSUMsUUFBU0MsR0FBTUEsRUFBRUMsV0FBV0MsTUFBTSxTQUNyRGhCLEVBQUtpQixXQUFhWCxPQUFPQyxLQUFLUixFQUFrQ0MsRUFBTUMsSUFBUSxLQUVwRixJQUFLLE1BQU1pQixLQUFRUixPQUNTUyxJQUF0QkMsUUFBUUMsSUFBSUgsS0FFaEJULEVBQVcsZUFBZVMsS0FBVUksS0FBS0MsVUFBVUgsUUFBUUMsSUFBSUgsS0FLakUsT0FISWxCLEVBQUtHLFNBQ1BDLFFBQVFDLEtBQUssbUJBQW9CQyxPQUFPQyxLQUFLRSxJQUV4Q0EsQ0FDVCxDQzNDTyxNQUFNZSxFQUFzQixDQUFDLE1BQU8sWUFBYSxPQ0lqREMsZUFBZUMsRUFBZ0JDLEdBQ3BDLE1BQU1DLEVBQWtCQyxFQUFLQyxLQUFLSCxFQUFTLGdCQUMzQyxJQUNFLE1BQU1JLFFBQXdCQyxFQUFHQyxTQUFTQyxT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
|
|
1
|
+
import e from"node:fs";import t from"node:path";import{readAndApplyEnvironmentVariables as n,removeNpmAndYarnEnvironmentVariables as o,yargsOptionsBuilderForEnv as r}from"@willbooster/shared-lib-node";import s from"yargs";import{hideBin as i}from"yargs/helpers";import c from"chalk";import a from"date-time";import u from"pretty-ms";import{rolldown as p,watch as d}from"rolldown";import{onExit as l}from"signal-exit";import f from"node:url";import m from"node:process";import{builtinModules as y,createRequire as h}from"node:module";import j from"magic-string";import{parseSync as g,visitorKeys as b}from"oxc-parser";import{minify as w}from"terser";import*as v from"node:child_process";let x;function S(e,t){return x||(x=n(e,t),e.verbose&&console.info("Loaded env vars:",Object.keys(x))),x}function k(e,t){const n={},o=new Set([...(e.inline??[]).flatMap(e=>e.toString().split(",")),...e.autoInline?Object.keys(S(e,t)):[]]);for(const e of o)void 0!==process.env[e]&&(n[`process.env.${e}`]=JSON.stringify(process.env[e]));return e.verbose&&console.info("Inline env vars:",Object.keys(n)),n}const _=["app","functions","lib"];async function O(n){const o=t.join(n,"package.json");try{const t=await e.promises.readFile(o,"utf8");return[JSON.parse(t),o]}catch{}return[void 0,o]}const E={...r,silent:{description:"Whether watch mode is enabled or not",type:"boolean",alias:"s"}},$={...E,input:{description:'Paths of source code files to be built. The first file is main. If no option is given, "src/index.{ts,tsx}" from package directory is targeted.',type:"array",alias:"i"},"core-js":{description:"Whether or not core-js is employed.",type:"boolean",default:!1},"core-js-proposals":{description:"Whether or not core-js with proposals support is employed.",type:"boolean",default:!1},minify:{description:"Whether or not minification is enabled.",type:"boolean",default:!0},sourcemap:{description:"Whether or not sourcemap is enabled.",type:"boolean",default:!0},external:{description:"Additional external dependencies.",type:"array"},inline:{description:"Environment variables to be inlined.",type:"array"},"auto-inline":{description:"Inline environment variables defined at env files.",type:"boolean",default:!1},watch:{description:"Whether watch mode is enabled or not",type:"boolean",alias:"w"},keepImport:{description:"Identifiers to be kept as import statements.",type:"array"},bundleBuiltins:{description:"Module names same with builtins (e.g., undici) to be bundled.",type:"array"}},D={...$,moduleType:{description:"esm, cjs, or either (default).",type:"string",alias:"m"}},F={...D,onlyPackageJson:{description:"Whether to generate only package.json.",type:"boolean"}},T={...$,moduleType:{description:"esm, cjs, either, or both (default).",type:"string",alias:"m"},jsExtension:{description:"Whether to use .js in cjs and/or esm: either (default), both, or none.",type:"string",alias:"j"}};function I(n,o,r,s){const i=function(n,o,r,s){const i=[...n.external??[]].map(e=>e.toString());r.dependencies?.["@prisma/client"]&&i.push("prisma-client");if(i.push(...Object.keys(r.dependencies??{}),...Object.keys(r.peerDependencies??{}),...Object.keys(r.optionalDependencies??{})),e.existsSync(t.join("..","..","package.json"))){const n=e.readdirSync(t.join(".."),{withFileTypes:!0});for(const o of n){if(!o.isDirectory())continue;const n=t.join("..",o.name,"package.json");if(!e.existsSync(n))continue;const s=JSON.parse(e.readFileSync(n,"utf8"));r.dependencies?.[s.name??""]&&i.push(...Object.keys(s.dependencies??{}),...Object.keys(s.peerDependencies??{}),...Object.keys(s.optionalDependencies??{}))}}const c=W(n),a=function(e){return"app-node"===e||"functions"===e}(o)&&s?new RegExp(`^@?${s}(?:/.+)?`):void 0;return i.filter(e=>!c.has(V(e))&&!a?.test(e))}(n,o,r,s),c=W(n);return e=>!U(e,c)&&(q(e)||i.some(t=>e===t||e.startsWith(`${t}/`)))}function P(t,n,o){const r=[C(t,o),(s=t.keepImport?.map(e=>e.toString())??[],{name:"keep-import",resolveDynamicImport:e=>!s.includes(e)&&void 0}),Q()];var s;return t["core-js"]||t["core-js-proposals"]?(r.push(G("babel-core-js",()=>!0)),n.some(e=>e.preserveModules)||r.push({name:"commonjs-runtime-prelude",renderChunk(e,t,n){const o=function(e,t){return e.includes("__commonJSMin")?function(e){return"cjs"===e||"commonjs"===e}(t)?e.includes("__toESM")?Oe:void 0:"var __commonJSMin=(moduleFactory,module)=>()=>(module||(module={exports:{}},moduleFactory(module.exports,module)),module.exports);":void 0}(e,n.format);if(!o)return;const r=new j(e);return function(e,t,n){e.appendLeft(function(e){let t=0;if(e.startsWith("#!")){const n=e.indexOf("\n");if(-1===n)return e.length;t=n+1}const n=/(?:(?:"[^"\n]*"|'[^'\n]*');?\s*)/y;for(;;){if(n.lastIndex=t,!n.exec(e)?.[0])return t;t=n.lastIndex}}(t),`${n}\n`)}(r,e,o),{code:r.toString(),map:r.generateMap({hires:!0})}}})):r.push(G("babel-decorators",Ee)),r.push({name:"text",async load(t){if(!t.endsWith(".csv")&&!t.endsWith(".txt"))return;const n=await e.promises.readFile(t,"utf8");return{code:`export default ${JSON.stringify(n)};`,moduleType:"js"}}}),t.minify&&!n.some(e=>e.preserveModules)&&r.push({name:"terser",async renderChunk(e,t,n){const o=n.sourcemap?{asObject:!0}:void 0,r=await w(e,{compress:{directives:!1},ecma:2022,format:{comments:!1},module:"es"===n.format,sourceMap:o});if(r.code)return{code:r.code,map:r.map}}}),r}function W(e){return new Set(e.bundleBuiltins?.map(e=>V(e.toString()))??[])}function C(n,o){const r=W(n),s=h(t.join(o,"package.json"));return{name:"bundle-builtins",resolveId(n,i,c){const a=U(n,r);if(a)return function(n,o,r,s,i){const c=function(n,o,r){const s=n.resolve.paths(o)??n.resolve.paths("__build_ts_package_lookup__")??[];for(const n of[t.join(r,"node_modules"),...s]){const r=t.join(n,o,"package.json");if(e.existsSync(r))return e.realpathSync(r)}throw new Error(`Failed to resolve package.json for ${o}`)}(n,o,r),a=JSON.parse(e.readFileSync(c,"utf8"));if(!a.exports){const r=function(n,o,r,s){if("."===s)return n.resolve(o);const i=n.resolve(`${o}/${s.slice(2)}`);return q(i)?function(n,o){const r=L(o);if(!r)throw new Error(`Failed to resolve package subpath ${o}`);const s=t.join(n,r),i=M(s)??function(n){const o=t.join(n,"package.json");if(e.existsSync(o)){const r=JSON.parse(e.readFileSync(o,"utf8")),s=M(t.join(n,r.main??"index.js"));if(s)return s}return M(t.join(n,"index"))}(s);if(i)return i;throw new Error(`Failed to resolve package subpath ${o}`)}(r,s):i}(n,o,t.dirname(c),i);if(r!==o&&!r.startsWith("node:"))return r}const u=function(e,t,n){if(e.exports){const o=N(e.exports,t,n);return null===o?void 0:L(o)}return"."===n?e.main??"index.js":L(n)}(a,s,i);if(!u)throw new Error(`Failed to resolve package export for ${o}`);return t.join(t.dirname(c),u)}(s,a,o,function(e){const t=new Set(["node-addons","node","module-sync","default"]);"require-call"===e?t.add("require"):t.add("import");return t}(c.kind),function(e,t){const n=V(e);return n===t?".":`./${n.slice(t.length+1)}`}(n,a))}}}function M(n){return(t.extname(n)?[n]:[n,`${n}.js`,`${n}.json`,`${n}.node`]).find(t=>e.existsSync(t)&&e.statSync(t).isFile())}function N(e,t,n,o){if("string"==typeof e)return"."===n?R(e,o):void 0;if(null===e)return null;if(Array.isArray(e)){if("."!==n)return;for(const r of e){let e;try{e=N(r,t,n,o)}catch{continue}if(e)return e}return}if("object"!=typeof e)return;const r=e;if(function(e){return Object.keys(e).some(e=>"."===e||e.startsWith("./"))}(r)){if(Object.hasOwn(r,n))return N(r[n],t,".");const e=function(e,t){for(const[n,o]of Object.entries(e).sort(([e],[t])=>function(e,t){const n=e.indexOf("*"),o=t.indexOf("*");return-1===n&&-1===o?0:-1===n?1:-1===o?-1:o-n||t.length-e.length}(e,t))){const e=A(n,t);if(void 0!==e)return{value:B(o,e)}}}(r,n);return void 0===e?void 0:N(e.value,t,".")}if("."===n)for(const[e,s]of Object.entries(r)){if(!t.has(e))continue;const r=N(s,t,n,o);if(void 0!==r)return r}}function A(e,t){if(!e.startsWith("./")||!e.includes("*"))return;const[n,o]=e.split("*",2);return t===n||!t.startsWith(n)||!t.endsWith(o)||t.length<e.length?void 0:t.slice(n.length,t.length-o.length)}function B(e,t){return"string"==typeof e?R(e,t):Array.isArray(e)?e.map(e=>B(e,t)):e&&"object"==typeof e?Object.fromEntries(Object.entries(e).map(([e,n])=>[e,B(n,t)])):e}function R(e,t){return function(e){if(!e.startsWith("./"))throw new Error(`Invalid package export target: ${e}`);J(e.slice(2),e)}(e),void 0===t?e:(function(e){J(e,e)}(t),e.replaceAll("*",t))}function J(e,t){const n=function(e,t){try{return decodeURIComponent(e).toLowerCase()}catch{throw new Error(`Invalid package export path segment in ${t}`)}}(e,t),o=new Set(["",".","..","node_modules"]);for(const e of n.split(/[\\/]/u))if(o.has(e))throw new Error(`Invalid package export path segment in ${t}`)}function L(e){return e?.replace(/^\.\//,"")}function U(e,t){const n=V(e);for(const e of t)if(n===e||n.startsWith(`${e}/`))return e}function V(e){return e.startsWith("node:")?e.slice(5):e}function q(e){return e.startsWith("node:")||y.includes(e)}function G(e,n){const o=[".cjs",".mjs",".js",".jsx",".cts",".mts",".ts",".tsx"],r=t.join(f.fileURLToPath(t.dirname(t.dirname(import.meta.url))),"babel.config.mjs");return{name:e,async transform(e,t){if(!n(e)||!o.some(e=>t.endsWith(e))||K(t))return;const{transformAsync:s}=await import("@babel/core"),i=await s(e,{caller:{name:"build-ts",supportsDynamicImport:!0,supportsExportNamespaceFrom:!0,supportsStaticESM:!0},configFile:r,filename:t,sourceMaps:!0});return i?.code?{code:i.code,map:i.map}:void 0}}}function K(e){return e.startsWith("\0")||function(e){return e.includes("/node_modules/")||e.includes("\\node_modules\\")}(e)}function Q(){const e=[".cjs",".mjs",".js",".jsx",".cts",".mts",".ts",".tsx"];return{name:"remove-console",transform(t,n){if(e.some(e=>n.endsWith(e))&&!K(n))return function(e,t){const n=function(){const{env:e}=process;if("production"===e.NODE_ENV)return new Set(["error","info","warn"]);if("test"===e.NODE_ENV)return new Set(["debug","error","info","warn"])}();if(!n)return;const o=function(e,t){const n=function(e){return e.endsWith(".tsx")?"tsx":e.endsWith(".ts")||e.endsWith(".cts")||e.endsWith(".mts")?"ts":e.endsWith(".jsx")?"jsx":"js"}(t),o=function(e){return e.endsWith(".cjs")||e.endsWith(".cts")?"commonjs":"unambiguous"}(t),r=g(t,e,{lang:n,sourceType:o});if(!Y(r))return r;if(t.endsWith(".js")&&"unambiguous"===o){const o=g(t,e,{lang:n,sourceType:"commonjs"});if(!Y(o))return o}}(e,t);if(!o)return;const r=new j(e),s=[];X(o.program,[],[],s,n);for(const e of function(e){const t=[];for(const n of e.toSorted((e,t)=>e.start-t.start||t.end-e.end))t.some(e=>e.start<=n.start&&n.end<=e.end)||t.push(n);return t.toSorted((e,t)=>t.start-e.start)}(s))r.overwrite(e.start,e.end,e.value);return r.hasChanged()?{code:r.toString(),map:r.generateMap({hires:!0})}:void 0}(t,n)}}}function Y(e){return e.errors.some(e=>"Error"===e.severity)}const H="(function () {})",z="(void 0)";function X(e,t,n,o,r){const s=function(e,t){if("Program"===e.type)return{end:e.end,shadowsConsole:Z(e),start:e.start};if(me(e))return{end:e.end,shadowsConsole:ee(e),start:e.start};if("BlockStatement"===e.type){const n=!!t&&me(t);return{end:e.end,shadowsConsole:te(e,!1)||n&&ce(e),start:e.start}}if("CatchClause"===e.type)return{end:e.end,shadowsConsole:fe(e.param),start:e.start};if("ClassExpression"===e.type)return{end:e.end,shadowsConsole:fe(e.id),start:e.start};if("StaticBlock"===e.type||"TSModuleBlock"===e.type)return{end:e.end,shadowsConsole:te(e,!1)||ce(e)||"TSModuleBlock"===e.type&&ue(t),start:e.start};if("SwitchStatement"===e.type)return{end:e.end,shadowsConsole:ne(e),start:oe(e)};if("SwitchCase"===e.type){const n="SwitchStatement"===t?.type&&ne(t);return{end:e.end,shadowsConsole:n||re(e),start:se(e)}}if("ForStatement"===e.type||"ForInStatement"===e.type||"ForOfStatement"===e.type)return{end:e.end,shadowsConsole:ie(e),start:e.start}}(e,t.at(-1));s&&n.push(s),ye(n,e)||"CallExpression"!==e.type||function(e,t,n,o){const r=t.at(-1),s=Se(e,"callee");if(!0===e.optional)return;if(!s||!be(s,o))return void(s&&function(e,t){if("MemberExpression"!==e.type)return!1;const n=Se(e,"object"),o=Se(e,"property");if(!n||!o||"MemberExpression"!==n.type)return!1;if(!0===e.computed||"Identifier"!==o.type||"bind"!==o.name)return!1;if(!ve(Se(n,"object")))return!1;const r=Se(n,"property");return!!r&&!we(n,r,t)}(s,o)&&n.push({kind:"replace",start:e.start,end:e.end,value:je(e,t)}));"ExpressionStatement"===r?.type?n.push({kind:"replace",start:r.start,end:r.end,value:";"}):n.push({kind:"replace",start:e.start,end:e.end,value:he(e,t)})}(e,t,o,r),ye(n,e)||"MemberExpression"!==e.type||function(e,t,n,o){const r=t.at(-1),s=t.at(-2);if(!be(e,o)||"MemberExpression"===r?.type)return;if("CallExpression"===r?.type&&r.callee===e&&!0!==r.optional)return;if(function(e,t,n){return"UpdateExpression"===t?.type&&t.argument===e||(("ForInStatement"===t?.type||"ForOfStatement"===t?.type)&&t.left===e||("ArrayPattern"===t?.type||("AssignmentPattern"===t?.type&&t.left===e||"Property"===t?.type&&t.value===e&&"ObjectPattern"===n?.type)))}(e,r,s))return;if("AssignmentExpression"===r?.type&&r.left===e){const e=Se(r,"right");return void(e&&n.push({kind:"replace",start:e.start,end:e.end,value:je(e,t)}))}n.push({kind:"replace",start:e.start,end:e.end,value:je(e,t)})}(e,t,o,r);const i=[...t,e];for(const t of xe(e))X(t,i,n,o,r);s&&n.pop()}function Z(e){for(const t of ke(e,"body"))if(ae(t,!0))return!0;return ce(e)}function ee(e){if(fe(e.id))return!0;for(const t of ke(e,"params"))if(fe(t))return!0;return!1}function te(e,t){for(const n of ke(e,"body"))if(ae(n,t))return!0;return!1}function ne(e){for(const t of ke(e,"cases"))for(const e of ke(t,"consequent"))if(ae(e,!1))return!0;return!1}function oe(e){for(const t of ke(e,"cases")){const e=se(t);if(e<t.end)return e}return e.end}function re(e){for(const t of ke(e,"consequent"))if(ae(t,!1))return!0;return!1}function se(e){const t=Se(e,"test");return t?t.start:ke(e,"consequent")[0]?.start??e.end}function ie(e){const t=Se(e,"ForStatement"===e.type?"init":"left");return!!t&&"VariableDeclaration"===t.type&&"var"!==t.kind&&le(t)}function ce(e){if(!e)return!1;for(const t of xe(e))if(t===e||!me(t)&&"StaticBlock"!==t.type&&"TSModuleBlock"!==t.type){if("VariableDeclaration"===t.type&&"var"===t.kind&&le(t))return!0;if(ce(t))return!0}return!1}function ae(e,t){const n=function(e){return"ExportNamedDeclaration"!==e.type&&"ExportDefaultDeclaration"!==e.type?void 0:Se(e,"declaration")}(e)??e;return!0!==n.declare&&("ImportDeclaration"===n.type?function(e){return"type"!==e.importKind&&ke(e,"specifiers").some(e=>"type"!==e.importKind&&fe(e.local))}(n):"FunctionDeclaration"===n.type||"ClassDeclaration"===n.type?fe(n.id):"TSImportEqualsDeclaration"===n.type?"type"!==n.importKind&&fe(n.id):"TSEnumDeclaration"===n.type||"TSModuleDeclaration"===n.type?pe(Se(n,"id")):"VariableDeclaration"===n.type&&(t||"var"!==n.kind)&&le(n))}function ue(e){return"TSModuleDeclaration"===e?.type&&!0!==e.declare&&de(Se(e,"id"))}function pe(e){return!!e&&("Identifier"===e.type?"console"===e.name:"TSQualifiedName"===e.type&&pe(Se(e,"left")))}function de(e){return!!e&&("Identifier"===e.type?"console"===e.name:"TSQualifiedName"===e.type&&(de(Se(e,"left"))||de(Se(e,"right"))))}function le(e){return ke(e,"declarations").some(e=>fe(Se(e,"id")))}function fe(e){return!!_e(e)&&("Identifier"===e.type&&"console"===e.name||("AssignmentPattern"===e.type||"RestElement"===e.type?fe(e.left??e.argument):"TSParameterProperty"===e.type?fe(e.parameter):"TSQualifiedName"===e.type?fe(e.left):"ArrayPattern"===e.type?ke(e,"elements").some(e=>fe(e)):"ObjectPattern"===e.type&&ke(e,"properties").some(e=>fe(e.value??e.argument))))}function me(e){return"FunctionDeclaration"===e.type||"FunctionExpression"===e.type||"ArrowFunctionExpression"===e.type}function ye(e,t){return e.some(e=>e.shadowsConsole&&e.start<=t.start&&t.end<=e.end)}function he(e,t){return ge(e,t)?`;${z}`:z}function je(e,t){return ge(e,t)?`;${H}`:H}function ge(e,t){const n=t.findLastIndex(e=>"ExpressionStatement"===e.type);if(n<0)return!1;const o=t[n];if(!o)return!1;const r=t[n-1];return o.start===e.start&&function(e){return"Program"===e?.type||"BlockStatement"===e?.type||"StaticBlock"===e?.type||"TSModuleBlock"===e?.type||"SwitchCase"===e?.type}(r)}function be(e,t){if("MemberExpression"!==e.type)return!1;const n=Se(e,"object"),o=Se(e,"property");return!0!==e.optional&&(!(!n||!o||we(e,o,t))&&(!!ve(n)||"MemberExpression"===n.type&&ve(Se(n,"object"))&&!0!==e.computed&&"Identifier"===o.type&&("call"===o.name||"apply"===o.name)))}function we(e,t,n){return!0!==e.computed&&"Identifier"===t.type&&n.has(t.name)}function ve(e){return"Identifier"===e?.type&&"console"===e.name}function xe(e){return(b[e.type]??[]).flatMap(t=>{const n=e[t];return Array.isArray(n)?n:[n]}).filter(e=>_e(e))}function Se(e,t){const n=e[t];return _e(n)?n:void 0}function ke(e,t){const n=e[t];return Array.isArray(n)?n.filter(e=>_e(e)):[]}function _e(e){return!!e&&"object"==typeof e&&"string"==typeof e.type}const Oe='var __create=Object.create,__defProp=Object.defineProperty,__getOwnPropDesc=Object.getOwnPropertyDescriptor,__getOwnPropNames=Object.getOwnPropertyNames,__getProtoOf=Object.getPrototypeOf,__hasOwnProp=Object.prototype.hasOwnProperty,__commonJSMin=(moduleFactory,module)=>()=>(module||(module={exports:{}},moduleFactory(module.exports,module)),module.exports),__copyProps=(to,from,except,descriptor)=>{if(from&&"object"==typeof from||"function"==typeof from)for(var key,names=__getOwnPropNames(from),index=0,length=names.length;index<length;index++)key=names[index],__hasOwnProp.call(to,key)||key===except||__defProp(to,key,{get:(key=>from[key]).bind(null,key),enumerable:!(descriptor=__getOwnPropDesc(from,key))||descriptor.enumerable});return to},__toESM=(mod,isNodeMode,target)=>(target=null!=mod?__create(__getProtoOf(mod)):{},__copyProps(!isNodeMode&&mod&&mod.__esModule?target:__defProp(target,"default",{value:mod,enumerable:!0}),mod));';function Ee(e){return/(^|[^\p{ID_Continue}*])@\s*[(\p{ID_Start}$_]/u.test(function(e){let t,n="",o=0;for(;o<e.length;){const r=e[o],s=e[o+1];if(t){if("\\"===r){n+=" ",s&&(n+="\n"===s?"\n":" "),o+=2;continue}r===t&&(t=void 0),n+="\n"===r?"\n":" ",o++}else if('"'!==r&&"'"!==r&&"`"!==r){if("/"===r&&"/"!==s&&"*"!==s&&Fe(n)){const t=Ie(e,o);n+=Pe(e.slice(o,t)),o=t;continue}if("/"!==r||"/"!==s)if("/"!==r||"*"!==s)n+=r,o++;else{for(o+=2;o<e.length&&("*"!==e[o]||"/"!==e[o+1]);)n+="\n"===e[o]?"\n":" ",o++;o+=2}else{for(o+=2;o<e.length&&"\n"!==e[o];)o++;n+="\n"}}else t=r,n+=" ",o++}return n}(e))}const $e=new Set(["(","[","{",":",",",";","=","!","?","&","|","^","~","+","-","*","%","<",">"]),De=new Set(["await","case","default","delete","do","else","in","instanceof","new","of","return","throw","typeof","void","yield"]);function Fe(e){const t=Te(e);if(-1===t)return!0;const n=e[t]??"";if(")"===n)return function(e,t){const n=function(e,t){let n=0;for(let o=t;o>=0;o--){const t=e[o];if(")"===t)n++;else if("("===t&&(n--,0===n))return o}return-1}(e,t);if(-1===n)return!1;const o=Te(e,n-1);if(-1===o)return!1;const r=e.slice(0,o+1).match(/[\p{ID_Start}$_][\p{ID_Continue}$\u200c\u200d]*$/u)?.[0];return!!r&&["for","if","while","with"].includes(r)}(e,t);if(("+"===n||"-"===n)&&e[Te(e,t-1)]===n)return!1;if($e.has(n))return!0;const o=e.slice(0,t+1).match(/[\p{ID_Start}$_][\p{ID_Continue}$\u200c\u200d]*$/u)?.[0];return!!o&&De.has(o)}function Te(e,t=e.length-1){for(let n=t;n>=0;n--)if(!/\s/u.test(e[n]??""))return n;return-1}function Ie(e,t){let n=t+1,o=!1;for(;n<e.length;){const t=e[n];if("\\"!==t){if("["===t&&(o=!0),"]"===t&&(o=!1),"/"===t&&!o){for(n++;/[\p{ID_Continue}$\u200c\u200d]/u.test(e[n]??"");)n++;return n}if("\n"===t)return n;n++}else n+=2}return n}function Pe(e){return e.replace(/[^\n]/gu," ")}const We=h(import.meta.url);async function Ce(n,o){const r=Ne(o);if(!r)throw new Error(`Failed to find tsconfig.json in ${o}.`);n.verbose&&console.info("Found tsconfig.json:",r);const s=[];let i=t.join("dist",t.basename(o),"src");if(e.existsSync(i)){const n=t.dirname(o),r=await e.promises.readdir(n,{withFileTypes:!0});o=t.resolve(o);for(const i of r){if(!i.isDirectory())continue;const r=t.resolve(n,i.name);if(r===o)continue;const c=Ne(r),a=t.join("dist",i.name,"src");c&&e.existsSync(a)&&s.push([r,c,a])}}else i="dist";s.push([o,r,i]);let c=!0;for(const[e,r,i]of s)c&&=await Me(n,e,r,t.join(o,i));return c}async function Me(n,o,r,s){n.verbose&&console.info("runTsgo()",o,r,s);const i=t.dirname(r),c=t.join(i,`.build-ts-tsgo.${process.pid}.${Date.now()}.json`);try{await e.promises.writeFile(c,JSON.stringify(await async function(n,o,r){const s={declaration:!0,emitDeclarationOnly:!0,noEmit:!1,noEmitOnError:!0,outDir:r,rootDir:"src"};if(await Be(t.join(n,"src"))){const o=function(n){let o=t.resolve(n);for(;;){const n=t.join(o,"node_modules","@types");if(e.existsSync(n))return n;const r=t.dirname(o);if(r===o)return;o=r}}(n),r=o?await async function(t){try{return(await e.promises.readdir(t,{withFileTypes:!0})).filter(e=>e.isDirectory()).map(e=>e.name)}catch{return[]}}(o):[];r.includes("node")&&(s.types=r)}return{compilerOptions:s,extends:Re(t.dirname(o),o),include:["src/**/*"]}}(o,r,s),void 0,2));const n=v.spawnSync(process.execPath,[Ae(),"-p",c],{cwd:o,stdio:"inherit"});if(n.error)throw n.error;return 0===n.status}finally{await e.promises.rm(c,{force:!0})}}function Ne(n){let o=t.resolve(n);for(;;){const n=t.join(o,"tsconfig.json");if(e.existsSync(n))return n;const r=t.dirname(o);if(r===o)return;o=r}}function Ae(){const e=We.resolve("@typescript/native-preview/package.json");return t.join(t.dirname(e),"bin","tsgo.js")}async function Be(n){try{const o=await e.promises.readdir(n,{withFileTypes:!0});for(const r of o){const o=t.join(n,r.name);if(r.isDirectory()){if(await Be(o))return!0}else if(/\.[cm]?tsx?$/.test(r.name)&&(await e.promises.readFile(o,"utf8")).includes("node:"))return!0}}catch{return!1}return!1}function Re(e,n){const o=t.relative(e,n).replaceAll(t.sep,"/");return o.startsWith(".")?o:`./${o}`}const Je={command:"app [package]",describe:"Build an app",builder:D,handler:async e=>Ve(e,"app")},Le={command:"functions [package]",describe:"Build a GCP/Firebase functions app",builder:F,async handler(e){if(!e.onlyPackageJson)return Ve(e,"functions");{const n=t.resolve(e.package?.toString()??"."),[o,r]=await O(n);o||(console.error(`Failed to parse package.json (${r}).`),process.exit(1)),await Ke(n,o,e.moduleType)}}},Ue={command:"lib [package]",describe:"Build a Node.js / React library",builder:T,handler:async e=>Ve(e,"lib")};async function Ve(n,o){process.env.NODE_ENV||="production";const r=!n.silent&&n.verbose,s=process.cwd(),i=t.resolve(n.package?.toString()??"."),[f,y]=await O(i);f||(console.error(`Failed to parse package.json (${y}).`),process.exit(1)),S(n,i);const h=function(n,o,r){if(n.input&&n.input.length>0)return n.input.map(e=>t.resolve(o,e.toString()));const s=t.join(r,"src");for(const n of["ts","tsx","cts","mts"]){const o=t.join(s,`index.${n}`);if(e.existsSync(o))return[o]}console.error("Failed to detect input file."),process.exit(1)}(n,s,i),j=function(e,n,o){switch(e){case"app":return"app-node";case"functions":return"functions";case"lib":return n.some(e=>e.endsWith(".tsx"))||function(e){return Ge(t.join(e,"src"))}(o)?"lib-react":"lib";default:console.error("target option must be one of: "+_.join(", ")),process.exit(1)}}(o,h,i);r&&(console.info("argv:",n),console.info("packageJsonPath:",y),console.info("Target (Category):",`${j} (${o})`));const[g]=function(e){const t=e.name?.toString()??"",[,n,o]=/@([^/]+)\/(.+)/.exec(t)??[];return[n,o]}(f),b="module"===f.type;n["core-js"]?process.env.BUILD_TS_COREJS="1":n["core-js-proposals"]&&(process.env.BUILD_TS_COREJS_WITH_PROPOSALS="1"),r&&(process.env.BUILD_TS_VERBOSE="1"),process.env.BUILD_TS_TARGET_CATEGORY=o,process.env.BUILD_TS_TARGET_DETAIL=j;const w=function(e,n,o,r){const s=t.join(o,"dist");if("app-node"===n||"functions"===n){const t=Qe(r,e.moduleType);return[{dir:s,format:t?"module":"commonjs",minify:!1,sourcemap:e.sourcemap&&"inline",strict:!t}]}const i=[],c=e.moduleType||"both",a=e.jsExtension||"either";("cjs"===c||"both"===c||"either"===c&&!r)&&i.push({dir:s,entryFileNames:"both"===a||"either"===a&&!r?"[name].js":"[name].cjs",format:"commonjs",minify:e.minify,preserveModules:!0,preserveModulesRoot:t.join(o,"src"),sourcemap:e.sourcemap,strict:!0});("esm"===c||"both"===c||"either"===c&&r)&&i.push({dir:s,entryFileNames:"both"===a||"either"===a&&r?"[name].js":"[name].mjs",format:"module",minify:e.minify,preserveModules:!0,preserveModulesRoot:t.join(o,"src"),sourcemap:e.sourcemap});return i}(n,j,i,b);r&&console.info("OutputOptions:",w),0===w.length&&(console.error("Failed to detect output files."),process.exit(1)),process.chdir(i),await e.promises.rm(t.join(i,"dist"),{recursive:!0,force:!0}),"functions"===j&&await Ke(i,f,n.moduleType);const v={checks:{preferBuiltinFeature:!1},external:I(n,j,f,g),input:"functions"===j?Object.fromEntries(h.map((e,n)=>[0===n?"index":t.basename(e,t.extname(e)),e])):h,plugins:P(n,w,i),resolve:{extensionAlias:{".cjs":[".cjs",".cts"],".js":[".js",".ts",".tsx"],".mjs":[".mjs",".mts"]},extensions:[".cts",".mts",".ts",".tsx",".cjs",".mjs",".js",".jsx",".json"]},treeshake:!n["core-js"]&&!n["core-js-proposals"]&&void 0,transform:qe(n,i),watch:n.watch?{clearScreen:!1}:void 0},x=e=>(Array.isArray(e)?e:[e]).map(e=>t.relative(i,e));if(n.watch)!function(e,t,n,o,r,s){const i=d({...o,output:r}),p=async e=>{process.removeListener("uncaughtException",p),process.stdin.removeListener("end",p),i&&await i.close(),e&&process.exit(e)};l(p),process.on("uncaughtException",p),process.stdin.isTTY||(process.stdin.on("end",p),process.stdin.resume());i.on("event",async i=>{switch(i.code){case"ERROR":!function(e,t=!1){const n=e.name||e.cause?.name,o=n?`${n}: `:"",r=`${e.plugin?`(plugin ${e.plugin}) `:""}${o}${e.message}`,s=[c.bold(c.red(`[!] ${c.bold(r.toString())}`))];e.url&&s.push(c.cyan(e.url)),e.loc?s.push(`${e.loc.file||e.id} (${e.loc.line}:${e.loc.column})`):e.id&&s.push(e.id),e.frame&&s.push(c.dim(e.frame)),e.stack&&s.push(c.dim(e.stack?.replace(`${o}${e.message}\n`,""))),s.push("",""),console.error(s.join("\n")),t||m.exit(1)}(i.error,!0);break;case"BUNDLE_START":if(e.silent)break;console.info(c.cyan(`Bundles ${c.bold(s((p=o.input,p?"string"==typeof p?[p]:Array.isArray(p)?p:Object.values(p):[])).join(", "))} → ${c.bold(s(r.map(e=>e.file||e.dir||"")).join(", "))}\non ${n} ...`));break;case"BUNDLE_END":if(e.silent)break;console.info(c.green(`Created ${c.bold(s(i.output).join(", "))} in ${c.bold(u(i.duration))}`)),"app-node"!==t&&"functions"!==t&&await Ce(e,n);break;case"END":if(e.silent)break;console.info(`\n[${a()}] waiting for changes...`)}var p;"result"in i&&i.result&&i.result.close()})}(n,j,i,v,w,x);else{let e;n.silent||console.info(c.cyan(`Bundles ${c.bold(x(h).join(", "))} → ${c.bold(x(w.map(e=>e.file||e.dir||"")).join(", "))}\non ${i} ...`));let t=!1;try{const t=Date.now(),o=await p(v);e=o,await Promise.all(w.map(e=>o.write(e))),n.silent||console.info(c.green(`Created ${x(w.map(e=>e.file||e.dir||"")).join(", ")} in ${c.bold(u(Date.now()-t))}`))}catch(e){t=!0,console.error("Failed to build due to:",e)}await(e?.close()),t&&process.exit(1),"app-node"===j||"functions"===j||await Ce(n,i)||process.exit(1)}}function qe(e,t){return{define:k(e,t),jsx:"react-jsx",target:"es2022"}}function Ge(n){try{return e.readdirSync(n,{withFileTypes:!0}).some(e=>{const o=t.join(n,e.name);return e.isDirectory()?Ge(o):e.isFile()&&e.name.endsWith(".tsx")})}catch{return!1}}async function Ke(n,o,r){o.name+="-dist";const s="module"===o.type,i=Qe(s,r);o.main=s===i?"index.js":i?"index.mjs":"index.cjs",delete o.scripts,delete o.devDependencies,await e.promises.mkdir(t.join(n,"dist"),{recursive:!0}),await e.promises.writeFile(t.join(n,"dist","package.json"),JSON.stringify(o))}function Qe(e,t){return"esm"===t||(!t||"either"===t)&&e}const Ye={command:"run <file>",describe:"Run script",builder:{...E,module:{description:"A module type: cjs or esm",type:"string",alias:"m"},watch:{description:"Whether watch mode is enabled or not",type:"boolean",alias:"w"}},handler(e){S(e,process.cwd());const t=e.file?.toString()??"",n=process.versions.bun,o=n?"bun":"node",r=n?["--bun"]:["--no-warnings","--import","tsx"];e.watch&&r.push("--watch"),r.push(t);const[,...s]=e._,i=[...r,...s.map(e=>e.toString())];e.verbose&&console.info(`Running '${o} ${i.join(" ")}'`);const c=v.spawnSync(o,i,{stdio:"inherit",env:{...process.env}});process.exit(c.status??1)}};o(process.env),await s(i(process.argv)).scriptName("build-ts").options(E).command(Je).command(Le).command(Ue).command(Ye).demandCommand().strict().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}()).help().argv;
|
|
2
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJuYW1lcyI6WyJidWlsZGVyIl0sInNvdXJjZXMiOlsiLi4vc3JjL2Vudi50cyIsIi4uL3NyYy90eXBlcy50cyIsIi4uL3NyYy91dGlscy50cyIsIi4uL3NyYy9zaGFyZWRPcHRpb25zQnVpbGRlci50cyIsIi4uL3NyYy9jb21tYW5kcy9idWlsZC9idWlsZGVyLnRzIiwiLi4vc3JjL2NvbW1hbmRzL2J1aWxkL2J1bmRsZXJMb2dnZXIudHMiLCIuLi9zcmMvY29tbWFuZHMvYnVpbGQvcGx1Z2luLnRzIiwiLi4vc3JjL2NvbW1hbmRzL2J1aWxkL3R5cGVTY3JpcHQudHMiLCIuLi9zcmMvY29tbWFuZHMvYnVpbGQvYnVpbGQudHMiLCIuLi9zcmMvY29tbWFuZHMvcnVuLnRzIiwiLi4vc3JjL2luZGV4LnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IHJlYWRBbmRBcHBseUVudmlyb25tZW50VmFyaWFibGVzIH0gZnJvbSAnQHdpbGxib29zdGVyL3NoYXJlZC1saWItbm9kZSc7XG5cbmltcG9ydCB0eXBlIHsgYnVpbGRlciB9IGZyb20gJy4vY29tbWFuZHMvYnVpbGQvYnVpbGRlci5qcyc7XG5pbXBvcnQgdHlwZSB7IHNoYXJlZE9wdGlvbnNCdWlsZGVyIH0gZnJvbSAnLi9zaGFyZWRPcHRpb25zQnVpbGRlci5qcyc7XG5pbXBvcnQgdHlwZSB7IEFyZ3VtZW50c1R5cGUgfSBmcm9tICcuL3R5cGVzLmpzJztcblxubGV0IGVudlZhcnM6IFJlY29yZDxzdHJpbmcsIHN0cmluZyB8IHVuZGVmaW5lZD4gfCB1bmRlZmluZWQ7XG5cbi8qKlxuICogVGhpcyBmdW5jdGlvbiBsb2FkcyBlbnZpcm9ubWVudCB2YXJpYWJsZXMgZnJvbSBgLmVudmAgZmlsZXMuXG4gKiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGxvYWRFbnZpcm9ubWVudFZhcmlhYmxlc1dpdGhDYWNoZShcbiAgYXJndjogQXJndW1lbnRzVHlwZTx0eXBlb2Ygc2hhcmVkT3B0aW9uc0J1aWxkZXI+LFxuICBjd2Q6IHN0cmluZ1xuKTogUmVjb3JkPHN0cmluZywgc3RyaW5nIHwgdW5kZWZpbmVkPiB7XG4gIGlmICghZW52VmFycykge1xuICAgIGVudlZhcnMgPSByZWFkQW5kQXBwbHlFbnZpcm9ubWVudFZhcmlhYmxlcyhhcmd2LCBjd2QpO1xuICAgIGlmIChhcmd2LnZlcmJvc2UpIHtcbiAgICAgIGNvbnNvbGUuaW5mbygnTG9hZGVkIGVudiB2YXJzOicsIE9iamVjdC5rZXlzKGVudlZhcnMpKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGVudlZhcnM7XG59XG5cbi8qKlxuICogVGhpcyBmdW5jdGlvbiBjcmVhdGVzIGEgZGVmaW5pdGlvbiBvZiBlbnZpcm9ubWVudCB2YXJpYWJsZXMgdGhhdCB3aWxsIGJlIGluamVjdGVkIGludG8gdGhlIGJ1aWxkLlxuICogKi9cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVFbnZpcm9ubWVudFZhcmlhYmxlc0RlZmluaXRpb24oXG4gIGFyZ3Y6IEFyZ3VtZW50c1R5cGU8dHlwZW9mIGJ1aWxkZXI+LFxuICBjd2Q6IHN0cmluZ1xuKTogUmVjb3JkPHN0cmluZywgc3RyaW5nPiB7XG4gIGNvbnN0IGVudlZhcnNEZWY6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7fTtcbiAgY29uc3QgZW52VmFyTmFtZXMgPSBuZXcgU2V0KFtcbiAgICAuLi4oYXJndi5pbmxpbmUgPz8gW10pLmZsYXRNYXAoKGUpID0+IGUudG9TdHJpbmcoKS5zcGxpdCgnLCcpKSxcbiAgICAuLi4oYXJndi5hdXRvSW5saW5lID8gT2JqZWN0LmtleXMobG9hZEVudmlyb25tZW50VmFyaWFibGVzV2l0aENhY2hlKGFyZ3YsIGN3ZCkpIDogW10pLFxuICBdKTtcbiAgZm9yIChjb25zdCBuYW1lIG9mIGVudlZhck5hbWVzKSB7XG4gICAgaWYgKHByb2Nlc3MuZW52W25hbWVdID09PSB1bmRlZmluZWQpIGNvbnRpbnVlO1xuXG4gICAgZW52VmFyc0RlZltgcHJvY2Vzcy5lbnYuJHtuYW1lfWBdID0gSlNPTi5zdHJpbmdpZnkocHJvY2Vzcy5lbnZbbmFtZV0pO1xuICB9XG4gIGlmIChhcmd2LnZlcmJvc2UpIHtcbiAgICBjb25zb2xlLmluZm8oJ0lubGluZSBlbnYgdmFyczonLCBPYmplY3Qua2V5cyhlbnZWYXJzRGVmKSk7XG4gIH1cbiAgcmV0dXJuIGVudlZhcnNEZWY7XG59XG4iLCJpbXBvcnQgdHlwZSB7IEFyZ3VtZW50c0NhbWVsQ2FzZSwgSW5mZXJyZWRPcHRpb25UeXBlcywgT3B0aW9ucyB9IGZyb20gJ3lhcmdzJztcblxuZXhwb3J0IGNvbnN0IGFsbFRhcmdldENhdGVnb3JpZXMgPSBbJ2FwcCcsICdmdW5jdGlvbnMnLCAnbGliJ10gYXMgY29uc3Q7XG5cbmV4cG9ydCB0eXBlIFRhcmdldENhdGVnb3J5ID0gKHR5cGVvZiBhbGxUYXJnZXRDYXRlZ29yaWVzKVtudW1iZXJdO1xuXG5leHBvcnQgY29uc3QgYWxsVGFyZ2V0RGV0YWlscyA9IFsnYXBwLW5vZGUnLCAnZnVuY3Rpb25zJywgJ2xpYicsICdsaWItcmVhY3QnXSBhcyBjb25zdDtcblxuZXhwb3J0IHR5cGUgVGFyZ2V0RGV0YWlsID0gKHR5cGVvZiBhbGxUYXJnZXREZXRhaWxzKVtudW1iZXJdO1xuXG5leHBvcnQgdHlwZSBBcmd1bWVudHNUeXBlPFQgZXh0ZW5kcyBSZWNvcmQ8c3RyaW5nLCBPcHRpb25zPj4gPSBBcmd1bWVudHNDYW1lbENhc2U8SW5mZXJyZWRPcHRpb25UeXBlczxUPj47XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuaW1wb3J0IHVybCBmcm9tICdub2RlOnVybCc7XG5cbmltcG9ydCB0eXBlIHsgUGFja2FnZUpzb24gfSBmcm9tICd0eXBlLWZlc3QnO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcmVhZFBhY2thZ2VKc29uKGRpclBhdGg6IHN0cmluZyk6IFByb21pc2U8W1BhY2thZ2VKc29uIHwgdW5kZWZpbmVkLCBzdHJpbmddPiB7XG4gIGNvbnN0IHBhY2thZ2VKc29uUGF0aCA9IHBhdGguam9pbihkaXJQYXRoLCAncGFja2FnZS5qc29uJyk7XG4gIHRyeSB7XG4gICAgY29uc3QgcGFja2FnZUpzb25UZXh0ID0gYXdhaXQgZnMucHJvbWlzZXMucmVhZEZpbGUocGFja2FnZUpzb25QYXRoLCAndXRmOCcpO1xuICAgIHJldHVybiBbSlNPTi5wYXJzZShwYWNrYWdlSnNvblRleHQpIGFzIFBhY2thZ2VKc29uLCBwYWNrYWdlSnNvblBhdGhdO1xuICB9IGNhdGNoIHtcbiAgICAvLyBkbyBub3RoaW5nXG4gIH1cbiAgcmV0dXJuIFt1bmRlZmluZWQsIHBhY2thZ2VKc29uUGF0aF07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRCdWlsZFRzUm9vdFBhdGgoKTogc3RyaW5nIHtcbiAgcmV0dXJuIHVybC5maWxlVVJMVG9QYXRoKHBhdGguZGlybmFtZShwYXRoLmRpcm5hbWUoaW1wb3J0Lm1ldGEudXJsKSkpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0TmFtZXNwYWNlQW5kTmFtZShwYWNrYWdlSnNvbjogUGFja2FnZUpzb24pOiBbc3RyaW5nIHwgdW5kZWZpbmVkLCBzdHJpbmcgfCB1bmRlZmluZWRdIHtcbiAgY29uc3QgcGFja2FnZU5hbWUgPSBwYWNrYWdlSnNvbi5uYW1lPy50b1N0cmluZygpID8/ICcnO1xuICBjb25zdCBtYXRjaCA9IC9AKFteL10rKVxcLyguKykvLmV4ZWMocGFja2FnZU5hbWUpO1xuICBjb25zdCBbLCBuYW1lc3BhY2UsIG5hbWVdID0gbWF0Y2ggPz8gW107XG4gIHJldHVybiBbbmFtZXNwYWNlLCBuYW1lXTtcbn1cbiIsImltcG9ydCB7IHlhcmdzT3B0aW9uc0J1aWxkZXJGb3JFbnYgfSBmcm9tICdAd2lsbGJvb3N0ZXIvc2hhcmVkLWxpYi1ub2RlJztcblxuZXhwb3J0IGNvbnN0IHNoYXJlZE9wdGlvbnNCdWlsZGVyID0ge1xuICAuLi55YXJnc09wdGlvbnNCdWlsZGVyRm9yRW52LFxuICBzaWxlbnQ6IHtcbiAgICBkZXNjcmlwdGlvbjogJ1doZXRoZXIgd2F0Y2ggbW9kZSBpcyBlbmFibGVkIG9yIG5vdCcsXG4gICAgdHlwZTogJ2Jvb2xlYW4nLFxuICAgIGFsaWFzOiAncycsXG4gIH0sXG59IGFzIGNvbnN0O1xuIiwiaW1wb3J0IHsgc2hhcmVkT3B0aW9uc0J1aWxkZXIgfSBmcm9tICcuLi8uLi9zaGFyZWRPcHRpb25zQnVpbGRlci5qcyc7XG5cbmV4cG9ydCBjb25zdCBidWlsZGVyID0ge1xuICAuLi5zaGFyZWRPcHRpb25zQnVpbGRlcixcbiAgaW5wdXQ6IHtcbiAgICBkZXNjcmlwdGlvbjpcbiAgICAgICdQYXRocyBvZiBzb3VyY2UgY29kZSBmaWxlcyB0byBiZSBidWlsdC4gVGhlIGZpcnN0IGZpbGUgaXMgbWFpbi4gSWYgbm8gb3B0aW9uIGlzIGdpdmVuLCBcInNyYy9pbmRleC57dHMsdHN4fVwiIGZyb20gcGFja2FnZSBkaXJlY3RvcnkgaXMgdGFyZ2V0ZWQuJyxcbiAgICB0eXBlOiAnYXJyYXknLFxuICAgIGFsaWFzOiAnaScsXG4gIH0sXG4gICdjb3JlLWpzJzoge1xuICAgIGRlc2NyaXB0aW9uOiAnV2hldGhlciBvciBub3QgY29yZS1qcyBpcyBlbXBsb3llZC4nLFxuICAgIHR5cGU6ICdib29sZWFuJyxcbiAgICBkZWZhdWx0OiBmYWxzZSxcbiAgfSxcbiAgJ2NvcmUtanMtcHJvcG9zYWxzJzoge1xuICAgIGRlc2NyaXB0aW9uOiAnV2hldGhlciBvciBub3QgY29yZS1qcyB3aXRoIHByb3Bvc2FscyBzdXBwb3J0IGlzIGVtcGxveWVkLicsXG4gICAgdHlwZTogJ2Jvb2xlYW4nLFxuICAgIGRlZmF1bHQ6IGZhbHNlLFxuICB9LFxuICBtaW5pZnk6IHtcbiAgICBkZXNjcmlwdGlvbjogJ1doZXRoZXIgb3Igbm90IG1pbmlmaWNhdGlvbiBpcyBlbmFibGVkLicsXG4gICAgdHlwZTogJ2Jvb2xlYW4nLFxuICAgIGRlZmF1bHQ6IHRydWUsXG4gIH0sXG4gIHNvdXJjZW1hcDoge1xuICAgIGRlc2NyaXB0aW9uOiAnV2hldGhlciBvciBub3Qgc291cmNlbWFwIGlzIGVuYWJsZWQuJyxcbiAgICB0eXBlOiAnYm9vbGVhbicsXG4gICAgZGVmYXVsdDogdHJ1ZSxcbiAgfSxcbiAgZXh0ZXJuYWw6IHtcbiAgICBkZXNjcmlwdGlvbjogJ0FkZGl0aW9uYWwgZXh0ZXJuYWwgZGVwZW5kZW5jaWVzLicsXG4gICAgdHlwZTogJ2FycmF5JyxcbiAgfSxcbiAgaW5saW5lOiB7XG4gICAgZGVzY3JpcHRpb246ICdFbnZpcm9ubWVudCB2YXJpYWJsZXMgdG8gYmUgaW5saW5lZC4nLFxuICAgIHR5cGU6ICdhcnJheScsXG4gIH0sXG4gICdhdXRvLWlubGluZSc6IHtcbiAgICBkZXNjcmlwdGlvbjogJ0lubGluZSBlbnZpcm9ubWVudCB2YXJpYWJsZXMgZGVmaW5lZCBhdCBlbnYgZmlsZXMuJyxcbiAgICB0eXBlOiAnYm9vbGVhbicsXG4gICAgZGVmYXVsdDogZmFsc2UsXG4gIH0sXG4gIHdhdGNoOiB7XG4gICAgZGVzY3JpcHRpb246ICdXaGV0aGVyIHdhdGNoIG1vZGUgaXMgZW5hYmxlZCBvciBub3QnLFxuICAgIHR5cGU6ICdib29sZWFuJyxcbiAgICBhbGlhczogJ3cnLFxuICB9LFxuICBrZWVwSW1wb3J0OiB7XG4gICAgZGVzY3JpcHRpb246ICdJZGVudGlmaWVycyB0byBiZSBrZXB0IGFzIGltcG9ydCBzdGF0ZW1lbnRzLicsXG4gICAgdHlwZTogJ2FycmF5JyxcbiAgfSxcbiAgYnVuZGxlQnVpbHRpbnM6IHtcbiAgICBkZXNjcmlwdGlvbjogJ01vZHVsZSBuYW1lcyBzYW1lIHdpdGggYnVpbHRpbnMgKGUuZy4sIHVuZGljaSkgdG8gYmUgYnVuZGxlZC4nLFxuICAgIHR5cGU6ICdhcnJheScsXG4gIH0sXG59IGFzIGNvbnN0O1xuXG5leHBvcnQgY29uc3QgYXBwQnVpbGRlciA9IHtcbiAgLi4uYnVpbGRlcixcbiAgbW9kdWxlVHlwZToge1xuICAgIGRlc2NyaXB0aW9uOiAnZXNtLCBjanMsIG9yIGVpdGhlciAoZGVmYXVsdCkuJyxcbiAgICB0eXBlOiAnc3RyaW5nJyxcbiAgICBhbGlhczogJ20nLFxuICB9LFxufSBhcyBjb25zdDtcblxuZXhwb3J0IGNvbnN0IGZ1bmN0aW9uc0J1aWxkZXIgPSB7XG4gIC4uLmFwcEJ1aWxkZXIsXG4gIG9ubHlQYWNrYWdlSnNvbjoge1xuICAgIGRlc2NyaXB0aW9uOiAnV2hldGhlciB0byBnZW5lcmF0ZSBvbmx5IHBhY2thZ2UuanNvbi4nLFxuICAgIHR5cGU6ICdib29sZWFuJyxcbiAgfSxcbn0gYXMgY29uc3Q7XG5cbmV4cG9ydCBjb25zdCBsaWJCdWlsZGVyID0ge1xuICAuLi5idWlsZGVyLFxuICBtb2R1bGVUeXBlOiB7XG4gICAgZGVzY3JpcHRpb246ICdlc20sIGNqcywgZWl0aGVyLCBvciBib3RoIChkZWZhdWx0KS4nLFxuICAgIHR5cGU6ICdzdHJpbmcnLFxuICAgIGFsaWFzOiAnbScsXG4gIH0sXG4gIC8vIC5qcyBmaWxlcyBpbiBhIHBhY2thZ2Ugd2l0aCBgXCJ0eXBlXCI6IFwibW9kdWxlXCJgIGFyZSB0cmVhdGVkIGFzIGVzbS5cbiAgLy8gSG93ZXZlciwgd2Ugd2FudCB0byB0cmVhdCB0aGVtIGFzIGNqcyBpbiB0aGUgY2FzZSB3aGVyZSBhIGNqcyBwcm9qZWN0IGltcG9ydHMgYW4gZXNtIHBhY2thZ2UuXG4gIC8vIFRvIGRlYWwgd2l0aCB0aGUgY2FzZSwgd2UgdXNlIC5janMgYW5kIC5tanMgZXh0ZW5zaW9ucyBpbnN0ZWFkIG9mIC5qcyBleHRlbnNpb24uXG4gIGpzRXh0ZW5zaW9uOiB7XG4gICAgZGVzY3JpcHRpb246ICdXaGV0aGVyIHRvIHVzZSAuanMgaW4gY2pzIGFuZC9vciBlc206IGVpdGhlciAoZGVmYXVsdCksIGJvdGgsIG9yIG5vbmUuJyxcbiAgICB0eXBlOiAnc3RyaW5nJyxcbiAgICBhbGlhczogJ2onLFxuICB9LFxufSBhcyBjb25zdDtcblxuZXhwb3J0IHR5cGUgQW55QnVpbGRlclR5cGUgPSB0eXBlb2YgYXBwQnVpbGRlciB8IHR5cGVvZiBmdW5jdGlvbnNCdWlsZGVyIHwgdHlwZW9mIGxpYkJ1aWxkZXI7XG4iLCJpbXBvcnQgcHJvY2VzcyBmcm9tICdub2RlOnByb2Nlc3MnO1xuXG5pbXBvcnQgY2hhbGsgZnJvbSAnY2hhbGsnO1xuXG5leHBvcnQgZnVuY3Rpb24gaGFuZGxlRXJyb3IoZXJyb3I6IEJ1aWxkRXJyb3IsIHJlY292ZXIgPSBmYWxzZSk6IHZvaWQge1xuICBjb25zdCBuYW1lID0gZXJyb3IubmFtZSB8fCAoZXJyb3IuY2F1c2UgYXMgRXJyb3IpPy5uYW1lO1xuICBjb25zdCBuYW1lU2VjdGlvbiA9IG5hbWUgPyBgJHtuYW1lfTogYCA6ICcnO1xuICBjb25zdCBwbHVnaW5TZWN0aW9uID0gZXJyb3IucGx1Z2luID8gYChwbHVnaW4gJHtlcnJvci5wbHVnaW59KSBgIDogJyc7XG4gIGNvbnN0IG1lc3NhZ2UgPSBgJHtwbHVnaW5TZWN0aW9ufSR7bmFtZVNlY3Rpb259JHtlcnJvci5tZXNzYWdlfWA7XG5cbiAgY29uc3Qgb3V0cHV0TGluZXMgPSBbY2hhbGsuYm9sZChjaGFsay5yZWQoYFshXSAke2NoYWxrLmJvbGQobWVzc2FnZS50b1N0cmluZygpKX1gKSldO1xuXG4gIGlmIChlcnJvci51cmwpIHtcbiAgICBvdXRwdXRMaW5lcy5wdXNoKGNoYWxrLmN5YW4oZXJyb3IudXJsKSk7XG4gIH1cblxuICBpZiAoZXJyb3IubG9jKSB7XG4gICAgb3V0cHV0TGluZXMucHVzaChgJHtlcnJvci5sb2MuZmlsZSB8fCBlcnJvci5pZH0gKCR7ZXJyb3IubG9jLmxpbmV9OiR7ZXJyb3IubG9jLmNvbHVtbn0pYCk7XG4gIH0gZWxzZSBpZiAoZXJyb3IuaWQpIHtcbiAgICBvdXRwdXRMaW5lcy5wdXNoKGVycm9yLmlkKTtcbiAgfVxuXG4gIGlmIChlcnJvci5mcmFtZSkge1xuICAgIG91dHB1dExpbmVzLnB1c2goY2hhbGsuZGltKGVycm9yLmZyYW1lKSk7XG4gIH1cblxuICBpZiAoZXJyb3Iuc3RhY2spIHtcbiAgICBvdXRwdXRMaW5lcy5wdXNoKGNoYWxrLmRpbShlcnJvci5zdGFjaz8ucmVwbGFjZShgJHtuYW1lU2VjdGlvbn0ke2Vycm9yLm1lc3NhZ2V9XFxuYCwgJycpKSk7XG4gIH1cblxuICBvdXRwdXRMaW5lcy5wdXNoKCcnLCAnJyk7XG4gIGNvbnNvbGUuZXJyb3Iob3V0cHV0TGluZXMuam9pbignXFxuJykpO1xuXG4gIGlmICghcmVjb3ZlcikgcHJvY2Vzcy5leGl0KDEpO1xufVxuXG5pbnRlcmZhY2UgQnVpbGRFcnJvciBleHRlbmRzIEVycm9yIHtcbiAgY2F1c2U/OiB1bmtub3duO1xuICBmcmFtZT86IHN0cmluZztcbiAgaWQ/OiBzdHJpbmc7XG4gIGxvYz86IHtcbiAgICBjb2x1bW46IG51bWJlcjtcbiAgICBmaWxlPzogc3RyaW5nO1xuICAgIGxpbmU6IG51bWJlcjtcbiAgfTtcbiAgcGx1Z2luPzogc3RyaW5nO1xuICB1cmw/OiBzdHJpbmc7XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgeyBidWlsdGluTW9kdWxlcyB9IGZyb20gJ25vZGU6bW9kdWxlJztcbmltcG9ydCB7IGNyZWF0ZVJlcXVpcmUgfSBmcm9tICdub2RlOm1vZHVsZSc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgdHlwZSB7IElucHV0T3B0aW9ucyB9IGZyb20gJ0BiYWJlbC9jb3JlJztcbmltcG9ydCBNYWdpY1N0cmluZyBmcm9tICdtYWdpYy1zdHJpbmcnO1xuaW1wb3J0IHsgcGFyc2VTeW5jLCB2aXNpdG9yS2V5cyB9IGZyb20gJ294Yy1wYXJzZXInO1xuaW1wb3J0IHR5cGUgeyBJbXBvcnRLaW5kLCBPdXRwdXRPcHRpb25zLCBQbHVnaW4sIFJvbGxkb3duUGx1Z2luT3B0aW9uLCBTb3VyY2VNYXBJbnB1dCB9IGZyb20gJ3JvbGxkb3duJztcbmltcG9ydCB7IG1pbmlmeSB9IGZyb20gJ3RlcnNlcic7XG5pbXBvcnQgdHlwZSB7IE1pbmlmeU9wdGlvbnMsIFNvdXJjZU1hcE9wdGlvbnMgfSBmcm9tICd0ZXJzZXInO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlSnNvbiB9IGZyb20gJ3R5cGUtZmVzdCc7XG5cbmltcG9ydCB0eXBlIHsgQXJndW1lbnRzVHlwZSwgVGFyZ2V0RGV0YWlsIH0gZnJvbSAnLi4vLi4vdHlwZXMuanMnO1xuaW1wb3J0IHsgZ2V0QnVpbGRUc1Jvb3RQYXRoIH0gZnJvbSAnLi4vLi4vdXRpbHMuanMnO1xuXG5pbXBvcnQgdHlwZSB7IGJ1aWxkZXIgfSBmcm9tICcuL2J1aWxkZXIuanMnO1xuXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlRXh0ZXJuYWxNYXRjaGVyKFxuICBhcmd2OiBBcmd1bWVudHNUeXBlPHR5cGVvZiBidWlsZGVyPixcbiAgdGFyZ2V0RGV0YWlsOiBUYXJnZXREZXRhaWwsXG4gIHBhY2thZ2VKc29uOiBQYWNrYWdlSnNvbixcbiAgbmFtZXNwYWNlOiBzdHJpbmcgfCB1bmRlZmluZWRcbik6IChpZDogc3RyaW5nKSA9PiBib29sZWFuIHtcbiAgY29uc3QgZXh0ZXJuYWxEZXBzID0gY29sbGVjdEV4dGVybmFsRGVwZW5kZW5jaWVzKGFyZ3YsIHRhcmdldERldGFpbCwgcGFja2FnZUpzb24sIG5hbWVzcGFjZSk7XG4gIGNvbnN0IGJ1bmRsZWRCdWlsdGluTmFtZXMgPSBnZXRCdW5kbGVkQnVpbHRpbk5hbWVzKGFyZ3YpO1xuICByZXR1cm4gKGlkKSA9PiB7XG4gICAgaWYgKGdldEJ1bmRsZWRCdWlsdGluUGFja2FnZU5hbWUoaWQsIGJ1bmRsZWRCdWlsdGluTmFtZXMpKSByZXR1cm4gZmFsc2U7XG4gICAgcmV0dXJuIChcbiAgICAgIGlzTm9kZUJ1aWx0aW4oaWQpIHx8IGV4dGVybmFsRGVwcy5zb21lKChkZXBlbmRlbmN5TmFtZSkgPT4gaWQgPT09IGRlcGVuZGVuY3lOYW1lIHx8IGlkLnN0YXJ0c1dpdGgoYCR7ZGVwZW5kZW5jeU5hbWV9L2ApKVxuICAgICk7XG4gIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBzZXR1cFBsdWdpbnMoXG4gIGFyZ3Y6IEFyZ3VtZW50c1R5cGU8dHlwZW9mIGJ1aWxkZXI+LFxuICBvdXRwdXRPcHRpb25zTGlzdDogT3V0cHV0T3B0aW9uc1tdLFxuICBwYWNrYWdlRGlyUGF0aDogc3RyaW5nXG4pOiBSb2xsZG93blBsdWdpbk9wdGlvbltdIHtcbiAgY29uc3QgcGx1Z2luczogUm9sbGRvd25QbHVnaW5PcHRpb25bXSA9IFtcbiAgICBidW5kbGVCdWlsdGluc1BsdWdpbihhcmd2LCBwYWNrYWdlRGlyUGF0aCksXG4gICAga2VlcEltcG9ydFBsdWdpbihhcmd2LmtlZXBJbXBvcnQ/Lm1hcCgoaXRlbSkgPT4gaXRlbS50b1N0cmluZygpKSA/PyBbXSksXG4gICAgcmVtb3ZlQ29uc29sZVBsdWdpbigpLFxuICBdO1xuICBpZiAoYXJndlsnY29yZS1qcyddIHx8IGFyZ3ZbJ2NvcmUtanMtcHJvcG9zYWxzJ10pIHtcbiAgICBwbHVnaW5zLnB1c2goYmFiZWxDb3JlSnNQbHVnaW4oKSk7XG4gICAgaWYgKCFvdXRwdXRPcHRpb25zTGlzdC5zb21lKChvcHRzKSA9PiBvcHRzLnByZXNlcnZlTW9kdWxlcykpIHtcbiAgICAgIHBsdWdpbnMucHVzaChjb21tb25Kc1J1bnRpbWVQcmVsdWRlUGx1Z2luKCkpO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBwbHVnaW5zLnB1c2goYmFiZWxEZWNvcmF0b3JzUGx1Z2luKCkpO1xuICB9XG4gIHBsdWdpbnMucHVzaCh0ZXh0UGx1Z2luKCkpO1xuICBpZiAoYXJndi5taW5pZnkgJiYgIW91dHB1dE9wdGlvbnNMaXN0LnNvbWUoKG9wdHMpID0+IG9wdHMucHJlc2VydmVNb2R1bGVzKSkge1xuICAgIHBsdWdpbnMucHVzaCh0ZXJzZXJQbHVnaW4oKSk7XG4gIH1cbiAgcmV0dXJuIHBsdWdpbnM7XG59XG5cbmZ1bmN0aW9uIGNvbGxlY3RFeHRlcm5hbERlcGVuZGVuY2llcyhcbiAgYXJndjogQXJndW1lbnRzVHlwZTx0eXBlb2YgYnVpbGRlcj4sXG4gIHRhcmdldERldGFpbDogVGFyZ2V0RGV0YWlsLFxuICBwYWNrYWdlSnNvbjogUGFja2FnZUpzb24sXG4gIG5hbWVzcGFjZTogc3RyaW5nIHwgdW5kZWZpbmVkXG4pOiBzdHJpbmdbXSB7XG4gIGNvbnN0IGV4dGVybmFsRGVwcyA9IFsuLi4oYXJndi5leHRlcm5hbCA/PyBbXSldLm1hcCgoaXRlbSkgPT4gaXRlbS50b1N0cmluZygpKTtcbiAgaWYgKHBhY2thZ2VKc29uLmRlcGVuZGVuY2llcz8uWydAcHJpc21hL2NsaWVudCddKSB7XG4gICAgZXh0ZXJuYWxEZXBzLnB1c2goJ3ByaXNtYS1jbGllbnQnKTtcbiAgfVxuICAvLyBgZGVwczogdHJ1ZWAgZGlkIG5vdCBoYW5kbGUgaW1wb3J0cyBzdWNoIGFzIGBsb2Rhc2guY2h1bmsvaW5kZXguanNgLlxuICBleHRlcm5hbERlcHMucHVzaChcbiAgICAuLi5PYmplY3Qua2V5cyhwYWNrYWdlSnNvbi5kZXBlbmRlbmNpZXMgPz8ge30pLFxuICAgIC4uLk9iamVjdC5rZXlzKHBhY2thZ2VKc29uLnBlZXJEZXBlbmRlbmNpZXMgPz8ge30pLFxuICAgIC4uLk9iamVjdC5rZXlzKHBhY2thZ2VKc29uLm9wdGlvbmFsRGVwZW5kZW5jaWVzID8/IHt9KVxuICApO1xuICAvLyBBZGQgZXh0ZXJuYWwgZGVwZW5kZW5jaWVzIGZyb20gc2libGluZyBwYWNrYWdlc1xuICBpZiAoZnMuZXhpc3RzU3luYyhwYXRoLmpvaW4oJy4uJywgJy4uJywgJ3BhY2thZ2UuanNvbicpKSkge1xuICAgIGNvbnN0IHBhY2thZ2VEaXJzID0gZnMucmVhZGRpclN5bmMocGF0aC5qb2luKCcuLicpLCB7IHdpdGhGaWxlVHlwZXM6IHRydWUgfSk7XG4gICAgZm9yIChjb25zdCBwYWNrYWdlRGlyIG9mIHBhY2thZ2VEaXJzKSB7XG4gICAgICBpZiAoIXBhY2thZ2VEaXIuaXNEaXJlY3RvcnkoKSkgY29udGludWU7XG5cbiAgICAgIGNvbnN0IHBhY2thZ2VKc29uUGF0aCA9IHBhdGguam9pbignLi4nLCBwYWNrYWdlRGlyLm5hbWUsICdwYWNrYWdlLmpzb24nKTtcbiAgICAgIGlmICghZnMuZXhpc3RzU3luYyhwYWNrYWdlSnNvblBhdGgpKSBjb250aW51ZTtcblxuICAgICAgY29uc3Qgb3RoZXJQYWNrYWdlSnNvbjogUGFja2FnZUpzb24gPSBKU09OLnBhcnNlKGZzLnJlYWRGaWxlU3luYyhwYWNrYWdlSnNvblBhdGgsICd1dGY4JykpO1xuICAgICAgaWYgKHBhY2thZ2VKc29uLmRlcGVuZGVuY2llcz8uW290aGVyUGFja2FnZUpzb24ubmFtZSA/PyAnJ10pIHtcbiAgICAgICAgZXh0ZXJuYWxEZXBzLnB1c2goXG4gICAgICAgICAgLi4uT2JqZWN0LmtleXMob3RoZXJQYWNrYWdlSnNvbi5kZXBlbmRlbmNpZXMgPz8ge30pLFxuICAgICAgICAgIC4uLk9iamVjdC5rZXlzKG90aGVyUGFja2FnZUpzb24ucGVlckRlcGVuZGVuY2llcyA/PyB7fSksXG4gICAgICAgICAgLi4uT2JqZWN0LmtleXMob3RoZXJQYWNrYWdlSnNvbi5vcHRpb25hbERlcGVuZGVuY2llcyA/PyB7fSlcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBjb25zdCBidW5kbGVkQnVpbHRpbk5hbWVzID0gZ2V0QnVuZGxlZEJ1aWx0aW5OYW1lcyhhcmd2KTtcbiAgY29uc3QgYnVuZGxlZE5hbWVzcGFjZVBhdHRlcm4gPVxuICAgIHNob3VsZEJ1bmRsZVNhbWVOYW1lc3BhY2VEZXBlbmRlbmNpZXModGFyZ2V0RGV0YWlsKSAmJiBuYW1lc3BhY2UgPyBuZXcgUmVnRXhwKGBeQD8ke25hbWVzcGFjZX0oPzovLispP2ApIDogdW5kZWZpbmVkO1xuICByZXR1cm4gZXh0ZXJuYWxEZXBzLmZpbHRlcigoZGVwZW5kZW5jeU5hbWUpID0+IHtcbiAgICBpZiAoYnVuZGxlZEJ1aWx0aW5OYW1lcy5oYXMobm9ybWFsaXplTm9kZUJ1aWx0aW5OYW1lKGRlcGVuZGVuY3lOYW1lKSkpIHJldHVybiBmYWxzZTtcbiAgICByZXR1cm4gIWJ1bmRsZWROYW1lc3BhY2VQYXR0ZXJuPy50ZXN0KGRlcGVuZGVuY3lOYW1lKTtcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIGdldEJ1bmRsZWRCdWlsdGluTmFtZXMoYXJndjogQXJndW1lbnRzVHlwZTx0eXBlb2YgYnVpbGRlcj4pOiBTZXQ8c3RyaW5nPiB7XG4gIHJldHVybiBuZXcgU2V0KGFyZ3YuYnVuZGxlQnVpbHRpbnM/Lm1hcCgoaXRlbSkgPT4gbm9ybWFsaXplTm9kZUJ1aWx0aW5OYW1lKGl0ZW0udG9TdHJpbmcoKSkpID8/IFtdKTtcbn1cblxuZnVuY3Rpb24gc2hvdWxkQnVuZGxlU2FtZU5hbWVzcGFjZURlcGVuZGVuY2llcyh0YXJnZXREZXRhaWw6IFRhcmdldERldGFpbCk6IGJvb2xlYW4ge1xuICByZXR1cm4gdGFyZ2V0RGV0YWlsID09PSAnYXBwLW5vZGUnIHx8IHRhcmdldERldGFpbCA9PT0gJ2Z1bmN0aW9ucyc7XG59XG5cbmZ1bmN0aW9uIGJ1bmRsZUJ1aWx0aW5zUGx1Z2luKGFyZ3Y6IEFyZ3VtZW50c1R5cGU8dHlwZW9mIGJ1aWxkZXI+LCBwYWNrYWdlRGlyUGF0aDogc3RyaW5nKTogUGx1Z2luIHtcbiAgY29uc3QgYnVuZGxlZEJ1aWx0aW5OYW1lcyA9IGdldEJ1bmRsZWRCdWlsdGluTmFtZXMoYXJndik7XG4gIGNvbnN0IHJlcXVpcmUgPSBjcmVhdGVSZXF1aXJlKHBhdGguam9pbihwYWNrYWdlRGlyUGF0aCwgJ3BhY2thZ2UuanNvbicpKTtcbiAgcmV0dXJuIHtcbiAgICBuYW1lOiAnYnVuZGxlLWJ1aWx0aW5zJyxcbiAgICByZXNvbHZlSWQoc291cmNlLCBfaW1wb3J0ZXIsIGV4dHJhT3B0aW9ucykge1xuICAgICAgY29uc3QgcGFja2FnZU5hbWUgPSBnZXRCdW5kbGVkQnVpbHRpblBhY2thZ2VOYW1lKHNvdXJjZSwgYnVuZGxlZEJ1aWx0aW5OYW1lcyk7XG4gICAgICBpZiAoIXBhY2thZ2VOYW1lKSByZXR1cm4gdW5kZWZpbmVkO1xuXG4gICAgICByZXR1cm4gcmVzb2x2ZVBhY2thZ2VFbnRyeShcbiAgICAgICAgcmVxdWlyZSxcbiAgICAgICAgcGFja2FnZU5hbWUsXG4gICAgICAgIHBhY2thZ2VEaXJQYXRoLFxuICAgICAgICBnZXRQYWNrYWdlRXhwb3J0Q29uZGl0aW9ucyhleHRyYU9wdGlvbnMua2luZCksXG4gICAgICAgIGdldFBhY2thZ2VTdWJwYXRoKHNvdXJjZSwgcGFja2FnZU5hbWUpXG4gICAgICApO1xuICAgIH0sXG4gIH07XG59XG5cbmZ1bmN0aW9uIHJlc29sdmVQYWNrYWdlRW50cnkoXG4gIHJlcXVpcmU6IE5vZGVKUy5SZXF1aXJlLFxuICBwYWNrYWdlTmFtZTogc3RyaW5nLFxuICBwYWNrYWdlRGlyUGF0aDogc3RyaW5nLFxuICBjb25kaXRpb25zOiBTZXQ8c3RyaW5nPixcbiAgc3VicGF0aDogc3RyaW5nXG4pOiBzdHJpbmcge1xuICBjb25zdCBwYWNrYWdlSnNvblBhdGggPSBmaW5kUGFja2FnZUpzb25QYXRoKHJlcXVpcmUsIHBhY2thZ2VOYW1lLCBwYWNrYWdlRGlyUGF0aCk7XG4gIGNvbnN0IHBhY2thZ2VKc29uOiBQYWNrYWdlSnNvbiA9IEpTT04ucGFyc2UoZnMucmVhZEZpbGVTeW5jKHBhY2thZ2VKc29uUGF0aCwgJ3V0ZjgnKSk7XG4gIGlmICghcGFja2FnZUpzb24uZXhwb3J0cykge1xuICAgIGNvbnN0IHJlc29sdmVkUGF0aCA9IHJlc29sdmVQYWNrYWdlV2l0aG91dEV4cG9ydHMocmVxdWlyZSwgcGFja2FnZU5hbWUsIHBhdGguZGlybmFtZShwYWNrYWdlSnNvblBhdGgpLCBzdWJwYXRoKTtcbiAgICBpZiAocmVzb2x2ZWRQYXRoICE9PSBwYWNrYWdlTmFtZSAmJiAhcmVzb2x2ZWRQYXRoLnN0YXJ0c1dpdGgoJ25vZGU6JykpIHJldHVybiByZXNvbHZlZFBhdGg7XG4gIH1cblxuICBjb25zdCBlbnRyeVBhdGggPSBnZXRQYWNrYWdlRW50cnlQYXRoKHBhY2thZ2VKc29uLCBjb25kaXRpb25zLCBzdWJwYXRoKTtcbiAgaWYgKCFlbnRyeVBhdGgpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYEZhaWxlZCB0byByZXNvbHZlIHBhY2thZ2UgZXhwb3J0IGZvciAke3BhY2thZ2VOYW1lfWApO1xuICB9XG4gIHJldHVybiBwYXRoLmpvaW4ocGF0aC5kaXJuYW1lKHBhY2thZ2VKc29uUGF0aCksIGVudHJ5UGF0aCk7XG59XG5cbmZ1bmN0aW9uIGdldFBhY2thZ2VFeHBvcnRDb25kaXRpb25zKGltcG9ydEtpbmQ6IEltcG9ydEtpbmQpOiBTZXQ8c3RyaW5nPiB7XG4gIGNvbnN0IGNvbmRpdGlvbnMgPSBuZXcgU2V0KFsnbm9kZS1hZGRvbnMnLCAnbm9kZScsICdtb2R1bGUtc3luYycsICdkZWZhdWx0J10pO1xuICBpZiAoaW1wb3J0S2luZCA9PT0gJ3JlcXVpcmUtY2FsbCcpIHtcbiAgICBjb25kaXRpb25zLmFkZCgncmVxdWlyZScpO1xuICB9IGVsc2Uge1xuICAgIGNvbmRpdGlvbnMuYWRkKCdpbXBvcnQnKTtcbiAgfVxuICByZXR1cm4gY29uZGl0aW9ucztcbn1cblxuZnVuY3Rpb24gcmVzb2x2ZVBhY2thZ2VXaXRob3V0RXhwb3J0cyhcbiAgcmVxdWlyZTogTm9kZUpTLlJlcXVpcmUsXG4gIHBhY2thZ2VOYW1lOiBzdHJpbmcsXG4gIHBhY2thZ2VEaXJQYXRoOiBzdHJpbmcsXG4gIHN1YnBhdGg6IHN0cmluZ1xuKTogc3RyaW5nIHtcbiAgaWYgKHN1YnBhdGggPT09ICcuJykgcmV0dXJuIHJlcXVpcmUucmVzb2x2ZShwYWNrYWdlTmFtZSk7XG4gIGNvbnN0IHJlc29sdmVkUGF0aCA9IHJlcXVpcmUucmVzb2x2ZShgJHtwYWNrYWdlTmFtZX0vJHtzdWJwYXRoLnNsaWNlKCcuLycubGVuZ3RoKX1gKTtcbiAgcmV0dXJuIGlzTm9kZUJ1aWx0aW4ocmVzb2x2ZWRQYXRoKSA/IHJlc29sdmVQYWNrYWdlU3VicGF0aEZyb21EaXIocGFja2FnZURpclBhdGgsIHN1YnBhdGgpIDogcmVzb2x2ZWRQYXRoO1xufVxuXG5mdW5jdGlvbiByZXNvbHZlUGFja2FnZVN1YnBhdGhGcm9tRGlyKHBhY2thZ2VEaXJQYXRoOiBzdHJpbmcsIHN1YnBhdGg6IHN0cmluZyk6IHN0cmluZyB7XG4gIGNvbnN0IHN1YnBhdGhFbnRyeVBhdGggPSBub3JtYWxpemVQYWNrYWdlRW50cnlQYXRoKHN1YnBhdGgpO1xuICBpZiAoIXN1YnBhdGhFbnRyeVBhdGgpIHRocm93IG5ldyBFcnJvcihgRmFpbGVkIHRvIHJlc29sdmUgcGFja2FnZSBzdWJwYXRoICR7c3VicGF0aH1gKTtcblxuICBjb25zdCBlbnRyeVBhdGggPSBwYXRoLmpvaW4ocGFja2FnZURpclBhdGgsIHN1YnBhdGhFbnRyeVBhdGgpO1xuICBjb25zdCByZXNvbHZlZFBhdGggPSByZXNvbHZlRmlsZVBhdGgoZW50cnlQYXRoKSA/PyByZXNvbHZlRGlyZWN0b3J5UGF0aChlbnRyeVBhdGgpO1xuICBpZiAocmVzb2x2ZWRQYXRoKSByZXR1cm4gcmVzb2x2ZWRQYXRoO1xuICB0aHJvdyBuZXcgRXJyb3IoYEZhaWxlZCB0byByZXNvbHZlIHBhY2thZ2Ugc3VicGF0aCAke3N1YnBhdGh9YCk7XG59XG5cbmZ1bmN0aW9uIHJlc29sdmVGaWxlUGF0aChmaWxlUGF0aDogc3RyaW5nKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgZmlsZVBhdGhzID0gcGF0aC5leHRuYW1lKGZpbGVQYXRoKSA/IFtmaWxlUGF0aF0gOiBbZmlsZVBhdGgsIGAke2ZpbGVQYXRofS5qc2AsIGAke2ZpbGVQYXRofS5qc29uYCwgYCR7ZmlsZVBhdGh9Lm5vZGVgXTtcbiAgcmV0dXJuIGZpbGVQYXRocy5maW5kKChjYW5kaWRhdGVQYXRoKSA9PiBmcy5leGlzdHNTeW5jKGNhbmRpZGF0ZVBhdGgpICYmIGZzLnN0YXRTeW5jKGNhbmRpZGF0ZVBhdGgpLmlzRmlsZSgpKTtcbn1cblxuZnVuY3Rpb24gcmVzb2x2ZURpcmVjdG9yeVBhdGgoZGlyUGF0aDogc3RyaW5nKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgcGFja2FnZUpzb25QYXRoID0gcGF0aC5qb2luKGRpclBhdGgsICdwYWNrYWdlLmpzb24nKTtcbiAgaWYgKGZzLmV4aXN0c1N5bmMocGFja2FnZUpzb25QYXRoKSkge1xuICAgIGNvbnN0IHBhY2thZ2VKc29uOiBQYWNrYWdlSnNvbiA9IEpTT04ucGFyc2UoZnMucmVhZEZpbGVTeW5jKHBhY2thZ2VKc29uUGF0aCwgJ3V0ZjgnKSk7XG4gICAgY29uc3QgbWFpblBhdGggPSByZXNvbHZlRmlsZVBhdGgocGF0aC5qb2luKGRpclBhdGgsIHBhY2thZ2VKc29uLm1haW4gPz8gJ2luZGV4LmpzJykpO1xuICAgIGlmIChtYWluUGF0aCkgcmV0dXJuIG1haW5QYXRoO1xuICB9XG4gIHJldHVybiByZXNvbHZlRmlsZVBhdGgocGF0aC5qb2luKGRpclBhdGgsICdpbmRleCcpKTtcbn1cblxuZnVuY3Rpb24gZmluZFBhY2thZ2VKc29uUGF0aChyZXF1aXJlOiBOb2RlSlMuUmVxdWlyZSwgcGFja2FnZU5hbWU6IHN0cmluZywgcGFja2FnZURpclBhdGg6IHN0cmluZyk6IHN0cmluZyB7XG4gIGNvbnN0IG1vZHVsZVBhdGhzID0gcmVxdWlyZS5yZXNvbHZlLnBhdGhzKHBhY2thZ2VOYW1lKSA/PyByZXF1aXJlLnJlc29sdmUucGF0aHMoJ19fYnVpbGRfdHNfcGFja2FnZV9sb29rdXBfXycpID8/IFtdO1xuICBmb3IgKGNvbnN0IG1vZHVsZVBhdGggb2YgW3BhdGguam9pbihwYWNrYWdlRGlyUGF0aCwgJ25vZGVfbW9kdWxlcycpLCAuLi5tb2R1bGVQYXRoc10pIHtcbiAgICBjb25zdCBwYWNrYWdlSnNvblBhdGggPSBwYXRoLmpvaW4obW9kdWxlUGF0aCwgcGFja2FnZU5hbWUsICdwYWNrYWdlLmpzb24nKTtcbiAgICBpZiAoZnMuZXhpc3RzU3luYyhwYWNrYWdlSnNvblBhdGgpKSByZXR1cm4gZnMucmVhbHBhdGhTeW5jKHBhY2thZ2VKc29uUGF0aCk7XG4gIH1cbiAgdGhyb3cgbmV3IEVycm9yKGBGYWlsZWQgdG8gcmVzb2x2ZSBwYWNrYWdlLmpzb24gZm9yICR7cGFja2FnZU5hbWV9YCk7XG59XG5cbmZ1bmN0aW9uIGdldFBhY2thZ2VFbnRyeVBhdGgocGFja2FnZUpzb246IFBhY2thZ2VKc29uLCBjb25kaXRpb25zOiBTZXQ8c3RyaW5nPiwgc3VicGF0aDogc3RyaW5nKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgaWYgKHBhY2thZ2VKc29uLmV4cG9ydHMpIHtcbiAgICBjb25zdCBlbnRyeVBhdGggPSBnZXRFeHBvcnRFbnRyeVBhdGgocGFja2FnZUpzb24uZXhwb3J0cywgY29uZGl0aW9ucywgc3VicGF0aCk7XG4gICAgcmV0dXJuIGVudHJ5UGF0aCA9PT0gbnVsbCA/IHVuZGVmaW5lZCA6IG5vcm1hbGl6ZVBhY2thZ2VFbnRyeVBhdGgoZW50cnlQYXRoKTtcbiAgfVxuICBpZiAoc3VicGF0aCA9PT0gJy4nKSByZXR1cm4gcGFja2FnZUpzb24ubWFpbiA/PyAnaW5kZXguanMnO1xuICByZXR1cm4gbm9ybWFsaXplUGFja2FnZUVudHJ5UGF0aChzdWJwYXRoKTtcbn1cblxuZnVuY3Rpb24gZ2V0RXhwb3J0RW50cnlQYXRoKFxuICBleHBvcnRzRmllbGQ6IHVua25vd24sXG4gIGNvbmRpdGlvbnM6IFNldDxzdHJpbmc+LFxuICBzdWJwYXRoOiBzdHJpbmcsXG4gIHBhdHRlcm5NYXRjaD86IHN0cmluZ1xuKTogc3RyaW5nIHwgdW5kZWZpbmVkIHwgbnVsbCB7XG4gIGlmICh0eXBlb2YgZXhwb3J0c0ZpZWxkID09PSAnc3RyaW5nJykge1xuICAgIHJldHVybiBzdWJwYXRoID09PSAnLicgPyByZXNvbHZlRXhwb3J0VGFyZ2V0KGV4cG9ydHNGaWVsZCwgcGF0dGVybk1hdGNoKSA6IHVuZGVmaW5lZDtcbiAgfVxuICBpZiAoZXhwb3J0c0ZpZWxkID09PSBudWxsKSByZXR1cm4gbnVsbDtcbiAgaWYgKEFycmF5LmlzQXJyYXkoZXhwb3J0c0ZpZWxkKSkge1xuICAgIGlmIChzdWJwYXRoICE9PSAnLicpIHJldHVybiB1bmRlZmluZWQ7XG5cbiAgICBmb3IgKGNvbnN0IGV4cG9ydEVudHJ5IG9mIGV4cG9ydHNGaWVsZCkge1xuICAgICAgbGV0IGVudHJ5UGF0aDogc3RyaW5nIHwgdW5kZWZpbmVkIHwgbnVsbDtcbiAgICAgIHRyeSB7XG4gICAgICAgIGVudHJ5UGF0aCA9IGdldEV4cG9ydEVudHJ5UGF0aChleHBvcnRFbnRyeSwgY29uZGl0aW9ucywgc3VicGF0aCwgcGF0dGVybk1hdGNoKTtcbiAgICAgIH0gY2F0Y2gge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGlmIChlbnRyeVBhdGgpIHJldHVybiBlbnRyeVBhdGg7XG4gICAgfVxuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cbiAgaWYgKHR5cGVvZiBleHBvcnRzRmllbGQgIT09ICdvYmplY3QnKSByZXR1cm4gdW5kZWZpbmVkO1xuXG4gIGNvbnN0IGV4cG9ydFJlY29yZCA9IGV4cG9ydHNGaWVsZCBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgaWYgKGhhc0V4cG9ydFN1YnBhdGhzKGV4cG9ydFJlY29yZCkpIHtcbiAgICBpZiAoT2JqZWN0Lmhhc093bihleHBvcnRSZWNvcmQsIHN1YnBhdGgpKSByZXR1cm4gZ2V0RXhwb3J0RW50cnlQYXRoKGV4cG9ydFJlY29yZFtzdWJwYXRoXSwgY29uZGl0aW9ucywgJy4nKTtcblxuICAgIGNvbnN0IHN1YnBhdGhFeHBvcnQgPSBmaW5kRXhwb3J0U3VicGF0aFBhdHRlcm4oZXhwb3J0UmVjb3JkLCBzdWJwYXRoKTtcbiAgICByZXR1cm4gc3VicGF0aEV4cG9ydCA9PT0gdW5kZWZpbmVkID8gdW5kZWZpbmVkIDogZ2V0RXhwb3J0RW50cnlQYXRoKHN1YnBhdGhFeHBvcnQudmFsdWUsIGNvbmRpdGlvbnMsICcuJyk7XG4gIH1cbiAgaWYgKHN1YnBhdGggIT09ICcuJykgcmV0dXJuIHVuZGVmaW5lZDtcblxuICBmb3IgKGNvbnN0IFtjb25kaXRpb24sIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhleHBvcnRSZWNvcmQpKSB7XG4gICAgaWYgKCFjb25kaXRpb25zLmhhcyhjb25kaXRpb24pKSBjb250aW51ZTtcblxuICAgIGNvbnN0IGVudHJ5UGF0aCA9IGdldEV4cG9ydEVudHJ5UGF0aCh2YWx1ZSwgY29uZGl0aW9ucywgc3VicGF0aCwgcGF0dGVybk1hdGNoKTtcbiAgICBpZiAoZW50cnlQYXRoICE9PSB1bmRlZmluZWQpIHJldHVybiBlbnRyeVBhdGg7XG4gIH1cbiAgcmV0dXJuIHVuZGVmaW5lZDtcbn1cblxuZnVuY3Rpb24gaGFzRXhwb3J0U3VicGF0aHMoZXhwb3J0UmVjb3JkOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPik6IGJvb2xlYW4ge1xuICByZXR1cm4gT2JqZWN0LmtleXMoZXhwb3J0UmVjb3JkKS5zb21lKChrZXkpID0+IGtleSA9PT0gJy4nIHx8IGtleS5zdGFydHNXaXRoKCcuLycpKTtcbn1cblxuZnVuY3Rpb24gZmluZEV4cG9ydFN1YnBhdGhQYXR0ZXJuKGV4cG9ydFJlY29yZDogUmVjb3JkPHN0cmluZywgdW5rbm93bj4sIHN1YnBhdGg6IHN0cmluZyk6IHsgdmFsdWU6IHVua25vd24gfSB8IHVuZGVmaW5lZCB7XG4gIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKGV4cG9ydFJlY29yZCkuc29ydCgoW2tleUFdLCBba2V5Ql0pID0+IGNvbXBhcmVFeHBvcnRQYXR0ZXJuS2V5cyhrZXlBLCBrZXlCKSkpIHtcbiAgICBjb25zdCBwYXR0ZXJuTWF0Y2ggPSBnZXRFeHBvcnRQYXR0ZXJuTWF0Y2goa2V5LCBzdWJwYXRoKTtcbiAgICBpZiAocGF0dGVybk1hdGNoICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiB7IHZhbHVlOiByZXBsYWNlRXhwb3J0UGF0dGVybih2YWx1ZSwgcGF0dGVybk1hdGNoKSB9O1xuICAgIH1cbiAgfVxuICByZXR1cm4gdW5kZWZpbmVkO1xufVxuXG5mdW5jdGlvbiBjb21wYXJlRXhwb3J0UGF0dGVybktleXMoa2V5QTogc3RyaW5nLCBrZXlCOiBzdHJpbmcpOiBudW1iZXIge1xuICBjb25zdCBiYXNlTGVuZ3RoQSA9IGtleUEuaW5kZXhPZignKicpO1xuICBjb25zdCBiYXNlTGVuZ3RoQiA9IGtleUIuaW5kZXhPZignKicpO1xuICBpZiAoYmFzZUxlbmd0aEEgPT09IC0xICYmIGJhc2VMZW5ndGhCID09PSAtMSkgcmV0dXJuIDA7XG4gIGlmIChiYXNlTGVuZ3RoQSA9PT0gLTEpIHJldHVybiAxO1xuICBpZiAoYmFzZUxlbmd0aEIgPT09IC0xKSByZXR1cm4gLTE7XG4gIHJldHVybiBiYXNlTGVuZ3RoQiAtIGJhc2VMZW5ndGhBIHx8IGtleUIubGVuZ3RoIC0ga2V5QS5sZW5ndGg7XG59XG5cbmZ1bmN0aW9uIGdldEV4cG9ydFBhdHRlcm5NYXRjaChwYXR0ZXJuOiBzdHJpbmcsIHN1YnBhdGg6IHN0cmluZyk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGlmICghcGF0dGVybi5zdGFydHNXaXRoKCcuLycpIHx8ICFwYXR0ZXJuLmluY2x1ZGVzKCcqJykpIHJldHVybiB1bmRlZmluZWQ7XG5cbiAgY29uc3QgW3ByZWZpeCwgc3VmZml4XSA9IHBhdHRlcm4uc3BsaXQoJyonLCAyKSBhcyBbc3RyaW5nLCBzdHJpbmddO1xuICBpZiAoc3VicGF0aCA9PT0gcHJlZml4IHx8ICFzdWJwYXRoLnN0YXJ0c1dpdGgocHJlZml4KSB8fCAhc3VicGF0aC5lbmRzV2l0aChzdWZmaXgpIHx8IHN1YnBhdGgubGVuZ3RoIDwgcGF0dGVybi5sZW5ndGgpIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG4gIHJldHVybiBzdWJwYXRoLnNsaWNlKHByZWZpeC5sZW5ndGgsIHN1YnBhdGgubGVuZ3RoIC0gc3VmZml4Lmxlbmd0aCk7XG59XG5cbmZ1bmN0aW9uIHJlcGxhY2VFeHBvcnRQYXR0ZXJuKHZhbHVlOiB1bmtub3duLCBwYXR0ZXJuTWF0Y2g6IHN0cmluZyk6IHVua25vd24ge1xuICBpZiAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJykgcmV0dXJuIHJlc29sdmVFeHBvcnRUYXJnZXQodmFsdWUsIHBhdHRlcm5NYXRjaCk7XG4gIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkgcmV0dXJuIHZhbHVlLm1hcCgoaXRlbSkgPT4gcmVwbGFjZUV4cG9ydFBhdHRlcm4oaXRlbSwgcGF0dGVybk1hdGNoKSk7XG4gIGlmICghdmFsdWUgfHwgdHlwZW9mIHZhbHVlICE9PSAnb2JqZWN0JykgcmV0dXJuIHZhbHVlO1xuXG4gIHJldHVybiBPYmplY3QuZnJvbUVudHJpZXMoXG4gICAgT2JqZWN0LmVudHJpZXModmFsdWUgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pLm1hcCgoW2tleSwgaXRlbV0pID0+IFtrZXksIHJlcGxhY2VFeHBvcnRQYXR0ZXJuKGl0ZW0sIHBhdHRlcm5NYXRjaCldKVxuICApO1xufVxuXG5mdW5jdGlvbiByZXNvbHZlRXhwb3J0VGFyZ2V0KHRhcmdldDogc3RyaW5nLCBwYXR0ZXJuTWF0Y2g6IHN0cmluZyB8IHVuZGVmaW5lZCk6IHN0cmluZyB7XG4gIHZhbGlkYXRlRXhwb3J0VGFyZ2V0KHRhcmdldCk7XG4gIGlmIChwYXR0ZXJuTWF0Y2ggPT09IHVuZGVmaW5lZCkgcmV0dXJuIHRhcmdldDtcblxuICB2YWxpZGF0ZUV4cG9ydFBhdHRlcm5NYXRjaChwYXR0ZXJuTWF0Y2gpO1xuICByZXR1cm4gdGFyZ2V0LnJlcGxhY2VBbGwoJyonLCBwYXR0ZXJuTWF0Y2gpO1xufVxuXG5mdW5jdGlvbiB2YWxpZGF0ZUV4cG9ydFRhcmdldCh0YXJnZXQ6IHN0cmluZyk6IHZvaWQge1xuICBpZiAoIXRhcmdldC5zdGFydHNXaXRoKCcuLycpKSB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgcGFja2FnZSBleHBvcnQgdGFyZ2V0OiAke3RhcmdldH1gKTtcblxuICB2YWxpZGF0ZVBhdGhTZWdtZW50cyh0YXJnZXQuc2xpY2UoJy4vJy5sZW5ndGgpLCB0YXJnZXQpO1xufVxuXG5mdW5jdGlvbiB2YWxpZGF0ZUV4cG9ydFBhdHRlcm5NYXRjaChwYXR0ZXJuTWF0Y2g6IHN0cmluZyk6IHZvaWQge1xuICB2YWxpZGF0ZVBhdGhTZWdtZW50cyhwYXR0ZXJuTWF0Y2gsIHBhdHRlcm5NYXRjaCk7XG59XG5cbmZ1bmN0aW9uIHZhbGlkYXRlUGF0aFNlZ21lbnRzKHBhdGhWYWx1ZTogc3RyaW5nLCBzb3VyY2VWYWx1ZTogc3RyaW5nKTogdm9pZCB7XG4gIGNvbnN0IGRlY29kZWRQYXRoID0gZGVjb2RlUGF0aFZhbHVlKHBhdGhWYWx1ZSwgc291cmNlVmFsdWUpO1xuICBjb25zdCBpbnZhbGlkU2VnbWVudHMgPSBuZXcgU2V0KFsnJywgJy4nLCAnLi4nLCAnbm9kZV9tb2R1bGVzJ10pO1xuICBmb3IgKGNvbnN0IHNlZ21lbnQgb2YgZGVjb2RlZFBhdGguc3BsaXQoL1tcXFxcL10vdSkpIHtcbiAgICBpZiAoaW52YWxpZFNlZ21lbnRzLmhhcyhzZWdtZW50KSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIHBhY2thZ2UgZXhwb3J0IHBhdGggc2VnbWVudCBpbiAke3NvdXJjZVZhbHVlfWApO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBkZWNvZGVQYXRoVmFsdWUocGF0aFZhbHVlOiBzdHJpbmcsIHNvdXJjZVZhbHVlOiBzdHJpbmcpOiBzdHJpbmcge1xuICB0cnkge1xuICAgIHJldHVybiBkZWNvZGVVUklDb21wb25lbnQocGF0aFZhbHVlKS50b0xvd2VyQ2FzZSgpO1xuICB9IGNhdGNoIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgcGFja2FnZSBleHBvcnQgcGF0aCBzZWdtZW50IGluICR7c291cmNlVmFsdWV9YCk7XG4gIH1cbn1cblxuZnVuY3Rpb24gbm9ybWFsaXplUGFja2FnZUVudHJ5UGF0aChlbnRyeVBhdGg6IHN0cmluZyB8IHVuZGVmaW5lZCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIHJldHVybiBlbnRyeVBhdGg/LnJlcGxhY2UoL15cXC5cXC8vLCAnJyk7XG59XG5cbmZ1bmN0aW9uIGdldEJ1bmRsZWRCdWlsdGluUGFja2FnZU5hbWUoaWQ6IHN0cmluZywgYnVuZGxlZEJ1aWx0aW5OYW1lczogU2V0PHN0cmluZz4pOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBjb25zdCBub3JtYWxpemVkSWQgPSBub3JtYWxpemVOb2RlQnVpbHRpbk5hbWUoaWQpO1xuICBmb3IgKGNvbnN0IHBhY2thZ2VOYW1lIG9mIGJ1bmRsZWRCdWlsdGluTmFtZXMpIHtcbiAgICBpZiAobm9ybWFsaXplZElkID09PSBwYWNrYWdlTmFtZSB8fCBub3JtYWxpemVkSWQuc3RhcnRzV2l0aChgJHtwYWNrYWdlTmFtZX0vYCkpIHJldHVybiBwYWNrYWdlTmFtZTtcbiAgfVxuICByZXR1cm4gdW5kZWZpbmVkO1xufVxuXG5mdW5jdGlvbiBnZXRQYWNrYWdlU3VicGF0aChpZDogc3RyaW5nLCBwYWNrYWdlTmFtZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgY29uc3Qgbm9ybWFsaXplZElkID0gbm9ybWFsaXplTm9kZUJ1aWx0aW5OYW1lKGlkKTtcbiAgcmV0dXJuIG5vcm1hbGl6ZWRJZCA9PT0gcGFja2FnZU5hbWUgPyAnLicgOiBgLi8ke25vcm1hbGl6ZWRJZC5zbGljZShwYWNrYWdlTmFtZS5sZW5ndGggKyAxKX1gO1xufVxuXG5mdW5jdGlvbiBub3JtYWxpemVOb2RlQnVpbHRpbk5hbWUoaWQ6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiBpZC5zdGFydHNXaXRoKCdub2RlOicpID8gaWQuc2xpY2UoJ25vZGU6Jy5sZW5ndGgpIDogaWQ7XG59XG5cbmZ1bmN0aW9uIGlzTm9kZUJ1aWx0aW4oaWQ6IHN0cmluZyk6IGJvb2xlYW4ge1xuICByZXR1cm4gaWQuc3RhcnRzV2l0aCgnbm9kZTonKSB8fCBidWlsdGluTW9kdWxlcy5pbmNsdWRlcyhpZCk7XG59XG5cbmZ1bmN0aW9uIGtlZXBJbXBvcnRQbHVnaW4obW9kdWxlTmFtZXM6IHN0cmluZ1tdKTogUGx1Z2luIHtcbiAgcmV0dXJuIHtcbiAgICBuYW1lOiAna2VlcC1pbXBvcnQnLFxuICAgIHJlc29sdmVEeW5hbWljSW1wb3J0KHNvdXJjZSkge1xuICAgICAgcmV0dXJuIG1vZHVsZU5hbWVzLmluY2x1ZGVzKHNvdXJjZSkgPyBmYWxzZSA6IHVuZGVmaW5lZDtcbiAgICB9LFxuICB9O1xufVxuXG5mdW5jdGlvbiBiYWJlbENvcmVKc1BsdWdpbigpOiBQbHVnaW4ge1xuICByZXR1cm4gYmFiZWxQbHVnaW4oJ2JhYmVsLWNvcmUtanMnLCAoKSA9PiB0cnVlKTtcbn1cblxuZnVuY3Rpb24gYmFiZWxEZWNvcmF0b3JzUGx1Z2luKCk6IFBsdWdpbiB7XG4gIHJldHVybiBiYWJlbFBsdWdpbignYmFiZWwtZGVjb3JhdG9ycycsIGNvbnRhaW5zRGVjb3JhdG9yKTtcbn1cblxuZnVuY3Rpb24gYmFiZWxQbHVnaW4obmFtZTogc3RyaW5nLCBzaG91bGRUcmFuc2Zvcm06IChjb2RlOiBzdHJpbmcpID0+IGJvb2xlYW4pOiBQbHVnaW4ge1xuICBjb25zdCBleHRlbnNpb25zID0gWycuY2pzJywgJy5tanMnLCAnLmpzJywgJy5qc3gnLCAnLmN0cycsICcubXRzJywgJy50cycsICcudHN4J107XG4gIGNvbnN0IGJhYmVsQ29uZmlnUGF0aCA9IHBhdGguam9pbihnZXRCdWlsZFRzUm9vdFBhdGgoKSwgJ2JhYmVsLmNvbmZpZy5tanMnKTtcbiAgcmV0dXJuIHtcbiAgICBuYW1lLFxuICAgIGFzeW5jIHRyYW5zZm9ybShjb2RlLCBpZCkge1xuICAgICAgaWYgKCFzaG91bGRUcmFuc2Zvcm0oY29kZSkgfHwgIWV4dGVuc2lvbnMuc29tZSgoZXh0ZW5zaW9uKSA9PiBpZC5lbmRzV2l0aChleHRlbnNpb24pKSB8fCBpc0JhYmVsRXhjbHVkZWRQYXRoKGlkKSkge1xuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgfVxuXG4gICAgICBjb25zdCB7IHRyYW5zZm9ybUFzeW5jIH0gPSBhd2FpdCBpbXBvcnQoJ0BiYWJlbC9jb3JlJyk7XG4gICAgICBjb25zdCBvcHRpb25zOiBJbnB1dE9wdGlvbnMgPSB7XG4gICAgICAgIGNhbGxlcjoge1xuICAgICAgICAgIG5hbWU6ICdidWlsZC10cycsXG4gICAgICAgICAgc3VwcG9ydHNEeW5hbWljSW1wb3J0OiB0cnVlLFxuICAgICAgICAgIHN1cHBvcnRzRXhwb3J0TmFtZXNwYWNlRnJvbTogdHJ1ZSxcbiAgICAgICAgICBzdXBwb3J0c1N0YXRpY0VTTTogdHJ1ZSxcbiAgICAgICAgfSxcbiAgICAgICAgY29uZmlnRmlsZTogYmFiZWxDb25maWdQYXRoLFxuICAgICAgICBmaWxlbmFtZTogaWQsXG4gICAgICAgIHNvdXJjZU1hcHM6IHRydWUsXG4gICAgICB9O1xuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdHJhbnNmb3JtQXN5bmMoY29kZSwgb3B0aW9ucyk7XG4gICAgICBpZiAoIXJlc3VsdD8uY29kZSkgcmV0dXJuIHVuZGVmaW5lZDtcblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgY29kZTogcmVzdWx0LmNvZGUsXG4gICAgICAgIG1hcDogcmVzdWx0Lm1hcCBhcyBTb3VyY2VNYXBJbnB1dCxcbiAgICAgIH07XG4gICAgfSxcbiAgfTtcbn1cblxuZnVuY3Rpb24gaXNCYWJlbEV4Y2x1ZGVkUGF0aChpZDogc3RyaW5nKTogYm9vbGVhbiB7XG4gIHJldHVybiBpZC5zdGFydHNXaXRoKCdcXDAnKSB8fCBpc05vZGVNb2R1bGVzUGF0aChpZCk7XG59XG5cbmZ1bmN0aW9uIHJlbW92ZUNvbnNvbGVQbHVnaW4oKTogUGx1Z2luIHtcbiAgY29uc3QgZXh0ZW5zaW9ucyA9IFsnLmNqcycsICcubWpzJywgJy5qcycsICcuanN4JywgJy5jdHMnLCAnLm10cycsICcudHMnLCAnLnRzeCddO1xuICByZXR1cm4ge1xuICAgIG5hbWU6ICdyZW1vdmUtY29uc29sZScsXG4gICAgdHJhbnNmb3JtKGNvZGUsIGlkKSB7XG4gICAgICBpZiAoIWV4dGVuc2lvbnMuc29tZSgoZXh0ZW5zaW9uKSA9PiBpZC5lbmRzV2l0aChleHRlbnNpb24pKSB8fCBpc0JhYmVsRXhjbHVkZWRQYXRoKGlkKSkge1xuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gcmVtb3ZlQ29uc29sZShjb2RlLCBpZCk7XG4gICAgfSxcbiAgfTtcbn1cblxuZnVuY3Rpb24gcmVtb3ZlQ29uc29sZShjb2RlOiBzdHJpbmcsIGlkOiBzdHJpbmcpOiB7IGNvZGU6IHN0cmluZzsgbWFwOiBTb3VyY2VNYXBJbnB1dCB9IHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgZXhjbHVkZWRNZXRob2RzID0gZ2V0Q29uc29sZVJlbW92YWxFeGNsdWRlZE1ldGhvZHMoKTtcbiAgaWYgKCFleGNsdWRlZE1ldGhvZHMpIHJldHVybiB1bmRlZmluZWQ7XG5cbiAgLy8gRXNjYXBlZCBpZGVudGlmaWVycyBzdWNoIGFzIGBcXHUwMDYzb25zb2xlYCBtdXN0IHN0aWxsIGJlIGhhbmRsZWQsIHNvIGRvIG5vdCBndWFyZCBwYXJzaW5nIHdpdGggYSByYXcgYGNvbnNvbGVgIHN1YnN0cmluZyBjaGVjay5cbiAgY29uc3QgYXN0ID0gcGFyc2VDb25zb2xlUmVtb3ZhbEFzdChjb2RlLCBpZCk7XG4gIGlmICghYXN0KSByZXR1cm4gdW5kZWZpbmVkO1xuXG4gIGNvbnN0IG1hZ2ljU3RyaW5nID0gbmV3IE1hZ2ljU3RyaW5nKGNvZGUpO1xuICBjb25zdCByZXBsYWNlbWVudHM6IENvbnNvbGVSZXBsYWNlbWVudFtdID0gW107XG4gIGNvbnN0IHNjb3BlczogQ29uc29sZVNjb3BlW10gPSBbXTtcbiAgY29sbGVjdENvbnNvbGVSZXBsYWNlbWVudHMoYXN0LnByb2dyYW0gYXMgdW5rbm93biBhcyBDb25zb2xlTm9kZSwgW10sIHNjb3BlcywgcmVwbGFjZW1lbnRzLCBleGNsdWRlZE1ldGhvZHMpO1xuICBmb3IgKGNvbnN0IHJlcGxhY2VtZW50IG9mIHNlbGVjdENvbnNvbGVSZXBsYWNlbWVudHMocmVwbGFjZW1lbnRzKSkge1xuICAgIG1hZ2ljU3RyaW5nLm92ZXJ3cml0ZShyZXBsYWNlbWVudC5zdGFydCwgcmVwbGFjZW1lbnQuZW5kLCByZXBsYWNlbWVudC52YWx1ZSk7XG4gIH1cblxuICBpZiAoIW1hZ2ljU3RyaW5nLmhhc0NoYW5nZWQoKSkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgcmV0dXJuIHtcbiAgICBjb2RlOiBtYWdpY1N0cmluZy50b1N0cmluZygpLFxuICAgIG1hcDogbWFnaWNTdHJpbmcuZ2VuZXJhdGVNYXAoeyBoaXJlczogdHJ1ZSB9KSBhcyBTb3VyY2VNYXBJbnB1dCxcbiAgfTtcbn1cblxuZnVuY3Rpb24gZ2V0Q29uc29sZVJlbW92YWxFeGNsdWRlZE1ldGhvZHMoKTogU2V0PHN0cmluZz4gfCB1bmRlZmluZWQge1xuICBjb25zdCB7IGVudiB9ID0gcHJvY2VzcztcbiAgaWYgKGVudi5OT0RFX0VOViA9PT0gJ3Byb2R1Y3Rpb24nKSByZXR1cm4gbmV3IFNldChbJ2Vycm9yJywgJ2luZm8nLCAnd2FybiddKTtcbiAgaWYgKGVudi5OT0RFX0VOViA9PT0gJ3Rlc3QnKSByZXR1cm4gbmV3IFNldChbJ2RlYnVnJywgJ2Vycm9yJywgJ2luZm8nLCAnd2FybiddKTtcbiAgcmV0dXJuIHVuZGVmaW5lZDtcbn1cblxuZnVuY3Rpb24gcGFyc2VDb25zb2xlUmVtb3ZhbEFzdChjb2RlOiBzdHJpbmcsIGlkOiBzdHJpbmcpOiBSZXR1cm5UeXBlPHR5cGVvZiBwYXJzZVN5bmM+IHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgbGFuZyA9IGdldFBhcnNlckxhbmcoaWQpO1xuICBjb25zdCBzb3VyY2VUeXBlID0gZ2V0UGFyc2VyU291cmNlVHlwZShpZCk7XG4gIGNvbnN0IGFzdCA9IHBhcnNlU3luYyhpZCwgY29kZSwgeyBsYW5nLCBzb3VyY2VUeXBlIH0pO1xuICBpZiAoIWhhc1BhcnNlRXJyb3IoYXN0KSkgcmV0dXJuIGFzdDtcbiAgaWYgKGlkLmVuZHNXaXRoKCcuanMnKSAmJiBzb3VyY2VUeXBlID09PSAndW5hbWJpZ3VvdXMnKSB7XG4gICAgY29uc3QgY29tbW9uSnNBc3QgPSBwYXJzZVN5bmMoaWQsIGNvZGUsIHsgbGFuZywgc291cmNlVHlwZTogJ2NvbW1vbmpzJyB9KTtcbiAgICBpZiAoIWhhc1BhcnNlRXJyb3IoY29tbW9uSnNBc3QpKSByZXR1cm4gY29tbW9uSnNBc3Q7XG4gIH1cbiAgcmV0dXJuIHVuZGVmaW5lZDtcbn1cblxuZnVuY3Rpb24gaGFzUGFyc2VFcnJvcihhc3Q6IFJldHVyblR5cGU8dHlwZW9mIHBhcnNlU3luYz4pOiBib29sZWFuIHtcbiAgcmV0dXJuIGFzdC5lcnJvcnMuc29tZSgoZXJyb3IpID0+IGVycm9yLnNldmVyaXR5ID09PSAnRXJyb3InKTtcbn1cblxuZnVuY3Rpb24gZ2V0UGFyc2VyTGFuZyhpZDogc3RyaW5nKTogJ2pzJyB8ICdqc3gnIHwgJ3RzJyB8ICd0c3gnIHtcbiAgaWYgKGlkLmVuZHNXaXRoKCcudHN4JykpIHJldHVybiAndHN4JztcbiAgaWYgKGlkLmVuZHNXaXRoKCcudHMnKSB8fCBpZC5lbmRzV2l0aCgnLmN0cycpIHx8IGlkLmVuZHNXaXRoKCcubXRzJykpIHJldHVybiAndHMnO1xuICBpZiAoaWQuZW5kc1dpdGgoJy5qc3gnKSkgcmV0dXJuICdqc3gnO1xuICByZXR1cm4gJ2pzJztcbn1cblxuZnVuY3Rpb24gZ2V0UGFyc2VyU291cmNlVHlwZShpZDogc3RyaW5nKTogJ2NvbW1vbmpzJyB8ICd1bmFtYmlndW91cycge1xuICByZXR1cm4gaWQuZW5kc1dpdGgoJy5janMnKSB8fCBpZC5lbmRzV2l0aCgnLmN0cycpID8gJ2NvbW1vbmpzJyA6ICd1bmFtYmlndW91cyc7XG59XG5cbnR5cGUgQ29uc29sZU5vZGUgPSB7XG4gIHR5cGU6IHN0cmluZztcbiAgc3RhcnQ6IG51bWJlcjtcbiAgZW5kOiBudW1iZXI7XG4gIFtrZXk6IHN0cmluZ106IHVua25vd247XG59O1xuXG50eXBlIENvbnNvbGVSZXBsYWNlbWVudCA9IHtcbiAga2luZDogJ3JlcGxhY2UnO1xuICBzdGFydDogbnVtYmVyO1xuICBlbmQ6IG51bWJlcjtcbiAgdmFsdWU6IHN0cmluZztcbn07XG5cbnR5cGUgQ29uc29sZVNjb3BlID0ge1xuICBlbmQ6IG51bWJlcjtcbiAgc2hhZG93c0NvbnNvbGU6IGJvb2xlYW47XG4gIHN0YXJ0OiBudW1iZXI7XG59O1xuXG5jb25zdCBub29wRnVuY3Rpb25FeHByZXNzaW9uID0gJyhmdW5jdGlvbiAoKSB7fSknO1xuY29uc3QgdW5kZWZpbmVkRXhwcmVzc2lvbiA9ICcodm9pZCAwKSc7XG5cbmZ1bmN0aW9uIGNvbGxlY3RDb25zb2xlUmVwbGFjZW1lbnRzKFxuICBub2RlOiBDb25zb2xlTm9kZSxcbiAgYW5jZXN0b3JzOiBDb25zb2xlTm9kZVtdLFxuICBzY29wZXM6IENvbnNvbGVTY29wZVtdLFxuICByZXBsYWNlbWVudHM6IENvbnNvbGVSZXBsYWNlbWVudFtdLFxuICBleGNsdWRlZE1ldGhvZHM6IFNldDxzdHJpbmc+XG4pOiB2b2lkIHtcbiAgY29uc3QgcGFyZW50ID0gYW5jZXN0b3JzLmF0KC0xKTtcbiAgY29uc3Qgc2NvcGUgPSBnZXRDb25zb2xlU2NvcGUobm9kZSwgcGFyZW50KTtcbiAgaWYgKHNjb3BlKSBzY29wZXMucHVzaChzY29wZSk7XG5cbiAgaWYgKCFpc0NvbnNvbGVTaGFkb3dlZChzY29wZXMsIG5vZGUpICYmIG5vZGUudHlwZSA9PT0gJ0NhbGxFeHByZXNzaW9uJykge1xuICAgIGNvbGxlY3RDb25zb2xlQ2FsbFJlcGxhY2VtZW50KG5vZGUsIGFuY2VzdG9ycywgcmVwbGFjZW1lbnRzLCBleGNsdWRlZE1ldGhvZHMpO1xuICB9XG4gIGlmICghaXNDb25zb2xlU2hhZG93ZWQoc2NvcGVzLCBub2RlKSAmJiBub2RlLnR5cGUgPT09ICdNZW1iZXJFeHByZXNzaW9uJykge1xuICAgIGNvbGxlY3RDb25zb2xlTWVtYmVyUmVwbGFjZW1lbnQobm9kZSwgYW5jZXN0b3JzLCByZXBsYWNlbWVudHMsIGV4Y2x1ZGVkTWV0aG9kcyk7XG4gIH1cblxuICBjb25zdCBjaGlsZEFuY2VzdG9ycyA9IFsuLi5hbmNlc3RvcnMsIG5vZGVdO1xuICBmb3IgKGNvbnN0IGNoaWxkIG9mIGdldENvbnNvbGVOb2RlQ2hpbGRyZW4obm9kZSkpIHtcbiAgICBjb2xsZWN0Q29uc29sZVJlcGxhY2VtZW50cyhjaGlsZCwgY2hpbGRBbmNlc3RvcnMsIHNjb3BlcywgcmVwbGFjZW1lbnRzLCBleGNsdWRlZE1ldGhvZHMpO1xuICB9XG5cbiAgaWYgKHNjb3BlKSBzY29wZXMucG9wKCk7XG59XG5cbmZ1bmN0aW9uIGdldENvbnNvbGVTY29wZShub2RlOiBDb25zb2xlTm9kZSwgcGFyZW50OiBDb25zb2xlTm9kZSB8IHVuZGVmaW5lZCk6IENvbnNvbGVTY29wZSB8IHVuZGVmaW5lZCB7XG4gIGlmIChub2RlLnR5cGUgPT09ICdQcm9ncmFtJykge1xuICAgIHJldHVybiB7IGVuZDogbm9kZS5lbmQsIHNoYWRvd3NDb25zb2xlOiBoYXNQcm9ncmFtQ29uc29sZUJpbmRpbmcobm9kZSksIHN0YXJ0OiBub2RlLnN0YXJ0IH07XG4gIH1cbiAgaWYgKGlzQ29uc29sZUZ1bmN0aW9uU2NvcGVOb2RlKG5vZGUpKSB7XG4gICAgcmV0dXJuIHsgZW5kOiBub2RlLmVuZCwgc2hhZG93c0NvbnNvbGU6IGhhc0Z1bmN0aW9uQ29uc29sZUJpbmRpbmcobm9kZSksIHN0YXJ0OiBub2RlLnN0YXJ0IH07XG4gIH1cbiAgaWYgKG5vZGUudHlwZSA9PT0gJ0Jsb2NrU3RhdGVtZW50Jykge1xuICAgIGNvbnN0IGlzRnVuY3Rpb25Cb2R5ID0gcGFyZW50ID8gaXNDb25zb2xlRnVuY3Rpb25TY29wZU5vZGUocGFyZW50KSA6IGZhbHNlO1xuICAgIHJldHVybiB7IGVuZDogbm9kZS5lbmQsIHNoYWRvd3NDb25zb2xlOiBoYXNCbG9ja0NvbnNvbGVCaW5kaW5nKG5vZGUsIGZhbHNlKSB8fCAoaXNGdW5jdGlvbkJvZHkgJiYgaGFzSG9pc3RlZFZhckNvbnNvbGVCaW5kaW5nKG5vZGUpKSwgc3RhcnQ6IG5vZGUuc3RhcnQgfTtcbiAgfVxuICBpZiAobm9kZS50eXBlID09PSAnQ2F0Y2hDbGF1c2UnKSB7XG4gICAgcmV0dXJuIHsgZW5kOiBub2RlLmVuZCwgc2hhZG93c0NvbnNvbGU6IGhhc0NvbnNvbGVCaW5kaW5nUGF0dGVybihub2RlLnBhcmFtKSwgc3RhcnQ6IG5vZGUuc3RhcnQgfTtcbiAgfVxuICBpZiAobm9kZS50eXBlID09PSAnQ2xhc3NFeHByZXNzaW9uJykge1xuICAgIHJldHVybiB7IGVuZDogbm9kZS5lbmQsIHNoYWRvd3NDb25zb2xlOiBoYXNDb25zb2xlQmluZGluZ1BhdHRlcm4obm9kZS5pZCksIHN0YXJ0OiBub2RlLnN0YXJ0IH07XG4gIH1cbiAgaWYgKG5vZGUudHlwZSA9PT0gJ1N0YXRpY0Jsb2NrJyB8fCBub2RlLnR5cGUgPT09ICdUU01vZHVsZUJsb2NrJykge1xuICAgIHJldHVybiB7XG4gICAgICBlbmQ6IG5vZGUuZW5kLFxuICAgICAgc2hhZG93c0NvbnNvbGU6XG4gICAgICAgIGhhc0Jsb2NrQ29uc29sZUJpbmRpbmcobm9kZSwgZmFsc2UpIHx8XG4gICAgICAgIGhhc0hvaXN0ZWRWYXJDb25zb2xlQmluZGluZyhub2RlKSB8fFxuICAgICAgICAobm9kZS50eXBlID09PSAnVFNNb2R1bGVCbG9jaycgJiYgaGFzTmFtZXNwYWNlQ29uc29sZUJpbmRpbmcocGFyZW50KSksXG4gICAgICBzdGFydDogbm9kZS5zdGFydCxcbiAgICB9O1xuICB9XG4gIGlmIChub2RlLnR5cGUgPT09ICdTd2l0Y2hTdGF0ZW1lbnQnKSB7XG4gICAgcmV0dXJuIHsgZW5kOiBub2RlLmVuZCwgc2hhZG93c0NvbnNvbGU6IGhhc1N3aXRjaENvbnNvbGVCaW5kaW5nKG5vZGUpLCBzdGFydDogZ2V0U3dpdGNoU2NvcGVTdGFydChub2RlKSB9O1xuICB9XG4gIGlmIChub2RlLnR5cGUgPT09ICdTd2l0Y2hDYXNlJykge1xuICAgIGNvbnN0IHN3aXRjaFNoYWRvd3NDb25zb2xlID0gcGFyZW50Py50eXBlID09PSAnU3dpdGNoU3RhdGVtZW50JyAmJiBoYXNTd2l0Y2hDb25zb2xlQmluZGluZyhwYXJlbnQpO1xuICAgIHJldHVybiB7XG4gICAgICBlbmQ6IG5vZGUuZW5kLFxuICAgICAgc2hhZG93c0NvbnNvbGU6IHN3aXRjaFNoYWRvd3NDb25zb2xlIHx8IGhhc1N3aXRjaENhc2VDb25zb2xlQmluZGluZyhub2RlKSxcbiAgICAgIHN0YXJ0OiBnZXRTd2l0Y2hDYXNlU2NvcGVTdGFydChub2RlKSxcbiAgICB9O1xuICB9XG4gIGlmIChub2RlLnR5cGUgPT09ICdGb3JTdGF0ZW1lbnQnIHx8IG5vZGUudHlwZSA9PT0gJ0ZvckluU3RhdGVtZW50JyB8fCBub2RlLnR5cGUgPT09ICdGb3JPZlN0YXRlbWVudCcpIHtcbiAgICByZXR1cm4geyBlbmQ6IG5vZGUuZW5kLCBzaGFkb3dzQ29uc29sZTogaGFzTG9vcENvbnNvbGVCaW5kaW5nKG5vZGUpLCBzdGFydDogbm9kZS5zdGFydCB9O1xuICB9XG4gIHJldHVybiB1bmRlZmluZWQ7XG59XG5cbmZ1bmN0aW9uIGhhc1Byb2dyYW1Db25zb2xlQmluZGluZyhub2RlOiBDb25zb2xlTm9kZSk6IGJvb2xlYW4ge1xuICBmb3IgKGNvbnN0IHN0YXRlbWVudCBvZiBnZXRDb25zb2xlQXJyYXlQcm9wZXJ0eShub2RlLCAnYm9keScpKSB7XG4gICAgaWYgKGhhc0RlY2xhcmF0aW9uQ29uc29sZUJpbmRpbmcoc3RhdGVtZW50LCB0cnVlKSkgcmV0dXJuIHRydWU7XG4gIH1cbiAgcmV0dXJuIGhhc0hvaXN0ZWRWYXJDb25zb2xlQmluZGluZyhub2RlKTtcbn1cblxuZnVuY3Rpb24gaGFzRnVuY3Rpb25Db25zb2xlQmluZGluZyhub2RlOiBDb25zb2xlTm9kZSk6IGJvb2xlYW4ge1xuICBpZiAoaGFzQ29uc29sZUJpbmRpbmdQYXR0ZXJuKG5vZGUuaWQpKSByZXR1cm4gdHJ1ZTtcbiAgZm9yIChjb25zdCBwYXJhbSBvZiBnZXRDb25zb2xlQXJyYXlQcm9wZXJ0eShub2RlLCAncGFyYW1zJykpIHtcbiAgICBpZiAoaGFzQ29uc29sZUJpbmRpbmdQYXR0ZXJuKHBhcmFtKSkgcmV0dXJuIHRydWU7XG4gIH1cbiAgcmV0dXJuIGZhbHNlO1xufVxuXG5mdW5jdGlvbiBoYXNCbG9ja0NvbnNvbGVCaW5kaW5nKG5vZGU6IENvbnNvbGVOb2RlLCBpbmNsdWRlVmFyOiBib29sZWFuKTogYm9vbGVhbiB7XG4gIGZvciAoY29uc3Qgc3RhdGVtZW50IG9mIGdldENvbnNvbGVBcnJheVByb3BlcnR5KG5vZGUsICdib2R5JykpIHtcbiAgICBpZiAoaGFzRGVjbGFyYXRpb25Db25zb2xlQmluZGluZyhzdGF0ZW1lbnQsIGluY2x1ZGVWYXIpKSByZXR1cm4gdHJ1ZTtcbiAgfVxuICByZXR1cm4gZmFsc2U7XG59XG5cbmZ1bmN0aW9uIGhhc1N3aXRjaENvbnNvbGVCaW5kaW5nKG5vZGU6IENvbnNvbGVOb2RlKTogYm9vbGVhbiB7XG4gIGZvciAoY29uc3Qgc3dpdGNoQ2FzZSBvZiBnZXRDb25zb2xlQXJyYXlQcm9wZXJ0eShub2RlLCAnY2FzZXMnKSkge1xuICAgIGZvciAoY29uc3Qgc3RhdGVtZW50IG9mIGdldENvbnNvbGVBcnJheVByb3BlcnR5KHN3aXRjaENhc2UsICdjb25zZXF1ZW50JykpIHtcbiAgICAgIGlmIChoYXNEZWNsYXJhdGlvbkNvbnNvbGVCaW5kaW5nKHN0YXRlbWVudCwgZmFsc2UpKSByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGZhbHNlO1xufVxuXG5mdW5jdGlvbiBnZXRTd2l0Y2hTY29wZVN0YXJ0KG5vZGU6IENvbnNvbGVOb2RlKTogbnVtYmVyIHtcbiAgZm9yIChjb25zdCBzd2l0Y2hDYXNlIG9mIGdldENvbnNvbGVBcnJheVByb3BlcnR5KG5vZGUsICdjYXNlcycpKSB7XG4gICAgY29uc3Qgc3RhcnQgPSBnZXRTd2l0Y2hDYXNlU2NvcGVTdGFydChzd2l0Y2hDYXNlKTtcbiAgICBpZiAoc3RhcnQgPCBzd2l0Y2hDYXNlLmVuZCkgcmV0dXJuIHN0YXJ0O1xuICB9XG4gIHJldHVybiBub2RlLmVuZDtcbn1cblxuZnVuY3Rpb24gaGFzU3dpdGNoQ2FzZUNvbnNvbGVCaW5kaW5nKG5vZGU6IENvbnNvbGVOb2RlKTogYm9vbGVhbiB7XG4gIGZvciAoY29uc3Qgc3RhdGVtZW50IG9mIGdldENvbnNvbGVBcnJheVByb3BlcnR5KG5vZGUsICdjb25zZXF1ZW50JykpIHtcbiAgICBpZiAoaGFzRGVjbGFyYXRpb25Db25zb2xlQmluZGluZyhzdGF0ZW1lbnQsIGZhbHNlKSkgcmV0dXJuIHRydWU7XG4gIH1cbiAgcmV0dXJuIGZhbHNlO1xufVxuXG5mdW5jdGlvbiBnZXRTd2l0Y2hDYXNlU2NvcGVTdGFydChub2RlOiBDb25zb2xlTm9kZSk6IG51bWJlciB7XG4gIGNvbnN0IHRlc3QgPSBnZXRDb25zb2xlTm9kZVByb3BlcnR5KG5vZGUsICd0ZXN0Jyk7XG4gIGlmICh0ZXN0KSByZXR1cm4gdGVzdC5zdGFydDtcbiAgcmV0dXJuIGdldENvbnNvbGVBcnJheVByb3BlcnR5KG5vZGUsICdjb25zZXF1ZW50JylbMF0/LnN0YXJ0ID8/IG5vZGUuZW5kO1xufVxuXG5mdW5jdGlvbiBoYXNMb29wQ29uc29sZUJpbmRpbmcobm9kZTogQ29uc29sZU5vZGUpOiBib29sZWFuIHtcbiAgY29uc3QgZGVjbGFyYXRpb24gPSBnZXRDb25zb2xlTm9kZVByb3BlcnR5KG5vZGUsIG5vZGUudHlwZSA9PT0gJ0ZvclN0YXRlbWVudCcgPyAnaW5pdCcgOiAnbGVmdCcpO1xuICByZXR1cm4gISFkZWNsYXJhdGlvbiAmJiBkZWNsYXJhdGlvbi50eXBlID09PSAnVmFyaWFibGVEZWNsYXJhdGlvbicgJiYgZGVjbGFyYXRpb24ua2luZCAhPT0gJ3ZhcicgJiYgaGFzVmFyaWFibGVEZWNsYXJhdGlvbkNvbnNvbGVCaW5kaW5nKGRlY2xhcmF0aW9uKTtcbn1cblxuZnVuY3Rpb24gaGFzSG9pc3RlZFZhckNvbnNvbGVCaW5kaW5nKHJvb3Q6IENvbnNvbGVOb2RlIHwgdW5kZWZpbmVkKTogYm9vbGVhbiB7XG4gIGlmICghcm9vdCkgcmV0dXJuIGZhbHNlO1xuXG4gIGZvciAoY29uc3QgY2hpbGQgb2YgZ2V0Q29uc29sZU5vZGVDaGlsZHJlbihyb290KSkge1xuICAgIGlmIChjaGlsZCAhPT0gcm9vdCAmJiAoaXNDb25zb2xlRnVuY3Rpb25TY29wZU5vZGUoY2hpbGQpIHx8IGNoaWxkLnR5cGUgPT09ICdTdGF0aWNCbG9jaycgfHwgY2hpbGQudHlwZSA9PT0gJ1RTTW9kdWxlQmxvY2snKSkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGlmIChcbiAgICAgIGNoaWxkLnR5cGUgPT09ICdWYXJpYWJsZURlY2xhcmF0aW9uJyAmJlxuICAgICAgY2hpbGQua2luZCA9PT0gJ3ZhcicgJiZcbiAgICAgIGhhc1ZhcmlhYmxlRGVjbGFyYXRpb25Db25zb2xlQmluZGluZyhjaGlsZClcbiAgICApIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBpZiAoaGFzSG9pc3RlZFZhckNvbnNvbGVCaW5kaW5nKGNoaWxkKSkgcmV0dXJuIHRydWU7XG4gIH1cbiAgcmV0dXJuIGZhbHNlO1xufVxuXG5mdW5jdGlvbiBoYXNJbXBvcnRDb25zb2xlQmluZGluZyhub2RlOiBDb25zb2xlTm9kZSk6IGJvb2xlYW4ge1xuICBpZiAobm9kZS5pbXBvcnRLaW5kID09PSAndHlwZScpIHJldHVybiBmYWxzZTtcbiAgcmV0dXJuIGdldENvbnNvbGVBcnJheVByb3BlcnR5KG5vZGUsICdzcGVjaWZpZXJzJykuc29tZShcbiAgICAoc3BlY2lmaWVyKSA9PiBzcGVjaWZpZXIuaW1wb3J0S2luZCAhPT0gJ3R5cGUnICYmIGhhc0NvbnNvbGVCaW5kaW5nUGF0dGVybihzcGVjaWZpZXIubG9jYWwpXG4gICk7XG59XG5cbmZ1bmN0aW9uIGhhc0RlY2xhcmF0aW9uQ29uc29sZUJpbmRpbmcobm9kZTogQ29uc29sZU5vZGUsIGluY2x1ZGVWYXI6IGJvb2xlYW4pOiBib29sZWFuIHtcbiAgY29uc3QgZGVjbGFyYXRpb24gPSBnZXRFeHBvcnREZWNsYXJhdGlvbihub2RlKSA/PyBub2RlO1xuICBpZiAoZGVjbGFyYXRpb24uZGVjbGFyZSA9PT0gdHJ1ZSkgcmV0dXJuIGZhbHNlO1xuICBpZiAoZGVjbGFyYXRpb24udHlwZSA9PT0gJ0ltcG9ydERlY2xhcmF0aW9uJykgcmV0dXJuIGhhc0ltcG9ydENvbnNvbGVCaW5kaW5nKGRlY2xhcmF0aW9uKTtcbiAgaWYgKGRlY2xhcmF0aW9uLnR5cGUgPT09ICdGdW5jdGlvbkRlY2xhcmF0aW9uJyB8fCBkZWNsYXJhdGlvbi50eXBlID09PSAnQ2xhc3NEZWNsYXJhdGlvbicpIHtcbiAgICByZXR1cm4gaGFzQ29uc29sZUJpbmRpbmdQYXR0ZXJuKGRlY2xhcmF0aW9uLmlkKTtcbiAgfVxuICBpZiAoZGVjbGFyYXRpb24udHlwZSA9PT0gJ1RTSW1wb3J0RXF1YWxzRGVjbGFyYXRpb24nKSB7XG4gICAgcmV0dXJuIGRlY2xhcmF0aW9uLmltcG9ydEtpbmQgIT09ICd0eXBlJyAmJiBoYXNDb25zb2xlQmluZGluZ1BhdHRlcm4oZGVjbGFyYXRpb24uaWQpO1xuICB9XG4gIGlmIChkZWNsYXJhdGlvbi50eXBlID09PSAnVFNFbnVtRGVjbGFyYXRpb24nIHx8IGRlY2xhcmF0aW9uLnR5cGUgPT09ICdUU01vZHVsZURlY2xhcmF0aW9uJykge1xuICAgIHJldHVybiBoYXNMZWZ0bW9zdE1vZHVsZUlkQ29uc29sZUJpbmRpbmcoZ2V0Q29uc29sZU5vZGVQcm9wZXJ0eShkZWNsYXJhdGlvbiwgJ2lkJykpO1xuICB9XG4gIHJldHVybiAoXG4gICAgZGVjbGFyYXRpb24udHlwZSA9PT0gJ1ZhcmlhYmxlRGVjbGFyYXRpb24nICYmXG4gICAgKGluY2x1ZGVWYXIgfHwgZGVjbGFyYXRpb24ua2luZCAhPT0gJ3ZhcicpICYmXG4gICAgaGFzVmFyaWFibGVEZWNsYXJhdGlvbkNvbnNvbGVCaW5kaW5nKGRlY2xhcmF0aW9uKVxuICApO1xufVxuXG5mdW5jdGlvbiBoYXNOYW1lc3BhY2VDb25zb2xlQmluZGluZyhub2RlOiBDb25zb2xlTm9kZSB8IHVuZGVmaW5lZCk6IGJvb2xlYW4ge1xuICByZXR1cm4gbm9kZT8udHlwZSA9PT0gJ1RTTW9kdWxlRGVjbGFyYXRpb24nICYmIG5vZGUuZGVjbGFyZSAhPT0gdHJ1ZSAmJiBoYXNNb2R1bGVJZENvbnNvbGVCaW5kaW5nKGdldENvbnNvbGVOb2RlUHJvcGVydHkobm9kZSwgJ2lkJykpO1xufVxuXG5mdW5jdGlvbiBoYXNMZWZ0bW9zdE1vZHVsZUlkQ29uc29sZUJpbmRpbmcoaWQ6IENvbnNvbGVOb2RlIHwgdW5kZWZpbmVkKTogYm9vbGVhbiB7XG4gIGlmICghaWQpIHJldHVybiBmYWxzZTtcbiAgaWYgKGlkLnR5cGUgPT09ICdJZGVudGlmaWVyJykgcmV0dXJuIGlkLm5hbWUgPT09ICdjb25zb2xlJztcbiAgcmV0dXJuIGlkLnR5cGUgPT09ICdUU1F1YWxpZmllZE5hbWUnICYmIGhhc0xlZnRtb3N0TW9kdWxlSWRDb25zb2xlQmluZGluZyhnZXRDb25zb2xlTm9kZVByb3BlcnR5KGlkLCAnbGVmdCcpKTtcbn1cblxuZnVuY3Rpb24gaGFzTW9kdWxlSWRDb25zb2xlQmluZGluZyhpZDogQ29uc29sZU5vZGUgfCB1bmRlZmluZWQpOiBib29sZWFuIHtcbiAgaWYgKCFpZCkgcmV0dXJuIGZhbHNlO1xuICBpZiAoaWQudHlwZSA9PT0gJ0lkZW50aWZpZXInKSByZXR1cm4gaWQubmFtZSA9PT0gJ2NvbnNvbGUnO1xuICByZXR1cm4gKFxuICAgIGlkLnR5cGUgPT09ICdUU1F1YWxpZmllZE5hbWUnICYmXG4gICAgKGhhc01vZHVsZUlkQ29uc29sZUJpbmRpbmcoZ2V0Q29uc29sZU5vZGVQcm9wZXJ0eShpZCwgJ2xlZnQnKSkgfHwgaGFzTW9kdWxlSWRDb25zb2xlQmluZGluZyhnZXRDb25zb2xlTm9kZVByb3BlcnR5KGlkLCAncmlnaHQnKSkpXG4gICk7XG59XG5cbmZ1bmN0aW9uIGhhc1ZhcmlhYmxlRGVjbGFyYXRpb25Db25zb2xlQmluZGluZyhub2RlOiBDb25zb2xlTm9kZSk6IGJvb2xlYW4ge1xuICByZXR1cm4gZ2V0Q29uc29sZUFycmF5UHJvcGVydHkobm9kZSwgJ2RlY2xhcmF0aW9ucycpLnNvbWUoKGRlY2xhcmF0aW9uKSA9PlxuICAgIGhhc0NvbnNvbGVCaW5kaW5nUGF0dGVybihnZXRDb25zb2xlTm9kZVByb3BlcnR5KGRlY2xhcmF0aW9uLCAnaWQnKSlcbiAgKTtcbn1cblxuZnVuY3Rpb24gaGFzQ29uc29sZUJpbmRpbmdQYXR0ZXJuKHZhbHVlOiB1bmtub3duKTogYm9vbGVhbiB7XG4gIGlmICghaXNDb25zb2xlTm9kZSh2YWx1ZSkpIHJldHVybiBmYWxzZTtcblxuICBpZiAodmFsdWUudHlwZSA9PT0gJ0lkZW50aWZpZXInICYmIHZhbHVlLm5hbWUgPT09ICdjb25zb2xlJykgcmV0dXJuIHRydWU7XG4gIGlmICh2YWx1ZS50eXBlID09PSAnQXNzaWdubWVudFBhdHRlcm4nIHx8IHZhbHVlLnR5cGUgPT09ICdSZXN0RWxlbWVudCcpIHtcbiAgICByZXR1cm4gaGFzQ29uc29sZUJpbmRpbmdQYXR0ZXJuKHZhbHVlLmxlZnQgPz8gdmFsdWUuYXJndW1lbnQpO1xuICB9XG4gIGlmICh2YWx1ZS50eXBlID09PSAnVFNQYXJhbWV0ZXJQcm9wZXJ0eScpIHtcbiAgICByZXR1cm4gaGFzQ29uc29sZUJpbmRpbmdQYXR0ZXJuKHZhbHVlLnBhcmFtZXRlcik7XG4gIH1cbiAgaWYgKHZhbHVlLnR5cGUgPT09ICdUU1F1YWxpZmllZE5hbWUnKSB7XG4gICAgcmV0dXJuIGhhc0NvbnNvbGVCaW5kaW5nUGF0dGVybih2YWx1ZS5sZWZ0KTtcbiAgfVxuICBpZiAodmFsdWUudHlwZSA9PT0gJ0FycmF5UGF0dGVybicpIHtcbiAgICByZXR1cm4gZ2V0Q29uc29sZUFycmF5UHJvcGVydHkodmFsdWUsICdlbGVtZW50cycpLnNvbWUoKGVsZW1lbnQpID0+IGhhc0NvbnNvbGVCaW5kaW5nUGF0dGVybihlbGVtZW50KSk7XG4gIH1cbiAgaWYgKHZhbHVlLnR5cGUgPT09ICdPYmplY3RQYXR0ZXJuJykge1xuICAgIHJldHVybiBnZXRDb25zb2xlQXJyYXlQcm9wZXJ0eSh2YWx1ZSwgJ3Byb3BlcnRpZXMnKS5zb21lKChwcm9wZXJ0eSkgPT5cbiAgICAgIGhhc0NvbnNvbGVCaW5kaW5nUGF0dGVybihwcm9wZXJ0eS52YWx1ZSA/PyBwcm9wZXJ0eS5hcmd1bWVudClcbiAgICApO1xuICB9XG4gIHJldHVybiBmYWxzZTtcbn1cblxuZnVuY3Rpb24gaXNDb25zb2xlRnVuY3Rpb25TY29wZU5vZGUobm9kZTogQ29uc29sZU5vZGUpOiBib29sZWFuIHtcbiAgcmV0dXJuIG5vZGUudHlwZSA9PT0gJ0Z1bmN0aW9uRGVjbGFyYXRpb24nIHx8IG5vZGUudHlwZSA9PT0gJ0Z1bmN0aW9uRXhwcmVzc2lvbicgfHwgbm9kZS50eXBlID09PSAnQXJyb3dGdW5jdGlvbkV4cHJlc3Npb24nO1xufVxuXG5mdW5jdGlvbiBpc0NvbnNvbGVTaGFkb3dlZChzY29wZXM6IENvbnNvbGVTY29wZVtdLCBub2RlOiBDb25zb2xlTm9kZSk6IGJvb2xlYW4ge1xuICByZXR1cm4gc2NvcGVzLnNvbWUoKHNjb3BlKSA9PiBzY29wZS5zaGFkb3dzQ29uc29sZSAmJiBzY29wZS5zdGFydCA8PSBub2RlLnN0YXJ0ICYmIG5vZGUuZW5kIDw9IHNjb3BlLmVuZCk7XG59XG5cbmZ1bmN0aW9uIGNvbGxlY3RDb25zb2xlQ2FsbFJlcGxhY2VtZW50KFxuICBub2RlOiBDb25zb2xlTm9kZSxcbiAgYW5jZXN0b3JzOiBDb25zb2xlTm9kZVtdLFxuICByZXBsYWNlbWVudHM6IENvbnNvbGVSZXBsYWNlbWVudFtdLFxuICBleGNsdWRlZE1ldGhvZHM6IFNldDxzdHJpbmc+XG4pOiB2b2lkIHtcbiAgY29uc3QgcGFyZW50ID0gYW5jZXN0b3JzLmF0KC0xKTtcbiAgY29uc3QgY2FsbGVlID0gZ2V0Q29uc29sZU5vZGVQcm9wZXJ0eShub2RlLCAnY2FsbGVlJyk7XG4gIGlmIChub2RlLm9wdGlvbmFsID09PSB0cnVlKSByZXR1cm47XG4gIGlmICghY2FsbGVlIHx8ICFpc0luY2x1ZGVkQ29uc29sZU1lbWJlcihjYWxsZWUsIGV4Y2x1ZGVkTWV0aG9kcykpIHtcbiAgICBpZiAoY2FsbGVlICYmIGlzSW5jbHVkZWRDb25zb2xlQmluZE1lbWJlcihjYWxsZWUsIGV4Y2x1ZGVkTWV0aG9kcykpIHtcbiAgICAgIHJlcGxhY2VtZW50cy5wdXNoKHsga2luZDogJ3JlcGxhY2UnLCBzdGFydDogbm9kZS5zdGFydCwgZW5kOiBub2RlLmVuZCwgdmFsdWU6IGdldE5vb3BGdW5jdGlvblJlcGxhY2VtZW50KG5vZGUsIGFuY2VzdG9ycykgfSk7XG4gICAgfVxuICAgIHJldHVybjtcbiAgfVxuXG4gIGlmIChwYXJlbnQ/LnR5cGUgPT09ICdFeHByZXNzaW9uU3RhdGVtZW50Jykge1xuICAgIHJlcGxhY2VtZW50cy5wdXNoKHsga2luZDogJ3JlcGxhY2UnLCBzdGFydDogcGFyZW50LnN0YXJ0LCBlbmQ6IHBhcmVudC5lbmQsIHZhbHVlOiAnOycgfSk7XG4gIH0gZWxzZSB7XG4gICAgcmVwbGFjZW1lbnRzLnB1c2goeyBraW5kOiAncmVwbGFjZScsIHN0YXJ0OiBub2RlLnN0YXJ0LCBlbmQ6IG5vZGUuZW5kLCB2YWx1ZTogZ2V0VW5kZWZpbmVkRXhwcmVzc2lvblJlcGxhY2VtZW50KG5vZGUsIGFuY2VzdG9ycykgfSk7XG4gIH1cbn1cblxuZnVuY3Rpb24gY29sbGVjdENvbnNvbGVNZW1iZXJSZXBsYWNlbWVudChcbiAgbm9kZTogQ29uc29sZU5vZGUsXG4gIGFuY2VzdG9yczogQ29uc29sZU5vZGVbXSxcbiAgcmVwbGFjZW1lbnRzOiBDb25zb2xlUmVwbGFjZW1lbnRbXSxcbiAgZXhjbHVkZWRNZXRob2RzOiBTZXQ8c3RyaW5nPlxuKTogdm9pZCB7XG4gIGNvbnN0IHBhcmVudCA9IGFuY2VzdG9ycy5hdCgtMSk7XG4gIGNvbnN0IGdyYW5kcGFyZW50ID0gYW5jZXN0b3JzLmF0KC0yKTtcbiAgaWYgKCFpc0luY2x1ZGVkQ29uc29sZU1lbWJlcihub2RlLCBleGNsdWRlZE1ldGhvZHMpIHx8IHBhcmVudD8udHlwZSA9PT0gJ01lbWJlckV4cHJlc3Npb24nKSByZXR1cm47XG4gIGlmIChwYXJlbnQ/LnR5cGUgPT09ICdDYWxsRXhwcmVzc2lvbicgJiYgcGFyZW50LmNhbGxlZSA9PT0gbm9kZSAmJiBwYXJlbnQub3B0aW9uYWwgIT09IHRydWUpIHJldHVybjtcbiAgaWYgKGlzQ29uc29sZUFzc2lnbm1lbnRUYXJnZXQobm9kZSwgcGFyZW50LCBncmFuZHBhcmVudCkpIHJldHVybjtcblxuICBpZiAocGFyZW50Py50eXBlID09PSAnQXNzaWdubWVudEV4cHJlc3Npb24nICYmIHBhcmVudC5sZWZ0ID09PSBub2RlKSB7XG4gICAgY29uc3QgcmlnaHQgPSBnZXRDb25zb2xlTm9kZVByb3BlcnR5KHBhcmVudCwgJ3JpZ2h0Jyk7XG4gICAgaWYgKHJpZ2h0KSB7XG4gICAgICByZXBsYWNlbWVudHMucHVzaCh7IGtpbmQ6ICdyZXBsYWNlJywgc3RhcnQ6IHJpZ2h0LnN0YXJ0LCBlbmQ6IHJpZ2h0LmVuZCwgdmFsdWU6IGdldE5vb3BGdW5jdGlvblJlcGxhY2VtZW50KHJpZ2h0LCBhbmNlc3RvcnMpIH0pO1xuICAgIH1cbiAgICByZXR1cm47XG4gIH1cblxuICByZXBsYWNlbWVudHMucHVzaCh7IGtpbmQ6ICdyZXBsYWNlJywgc3RhcnQ6IG5vZGUuc3RhcnQsIGVuZDogbm9kZS5lbmQsIHZhbHVlOiBnZXROb29wRnVuY3Rpb25SZXBsYWNlbWVudChub2RlLCBhbmNlc3RvcnMpIH0pO1xufVxuXG5mdW5jdGlvbiBnZXRVbmRlZmluZWRFeHByZXNzaW9uUmVwbGFjZW1lbnQobm9kZTogQ29uc29sZU5vZGUsIGFuY2VzdG9yczogQ29uc29sZU5vZGVbXSk6IHN0cmluZyB7XG4gIHJldHVybiBuZWVkc0xlYWRpbmdTdGF0ZW1lbnRTZW1pY29sb24obm9kZSwgYW5jZXN0b3JzKSA/IGA7JHt1bmRlZmluZWRFeHByZXNzaW9ufWAgOiB1bmRlZmluZWRFeHByZXNzaW9uO1xufVxuXG5mdW5jdGlvbiBnZXROb29wRnVuY3Rpb25SZXBsYWNlbWVudChub2RlOiBDb25zb2xlTm9kZSwgYW5jZXN0b3JzOiBDb25zb2xlTm9kZVtdKTogc3RyaW5nIHtcbiAgcmV0dXJuIG5lZWRzTGVhZGluZ1N0YXRlbWVudFNlbWljb2xvbihub2RlLCBhbmNlc3RvcnMpID8gYDske25vb3BGdW5jdGlvbkV4cHJlc3Npb259YCA6IG5vb3BGdW5jdGlvbkV4cHJlc3Npb247XG59XG5cbmZ1bmN0aW9uIG5lZWRzTGVhZGluZ1N0YXRlbWVudFNlbWljb2xvbihub2RlOiBDb25zb2xlTm9kZSwgYW5jZXN0b3JzOiBDb25zb2xlTm9kZVtdKTogYm9vbGVhbiB7XG4gIGNvbnN0IHN0YXRlbWVudEluZGV4ID0gYW5jZXN0b3JzLmZpbmRMYXN0SW5kZXgoKGFuY2VzdG9yKSA9PiBhbmNlc3Rvci50eXBlID09PSAnRXhwcmVzc2lvblN0YXRlbWVudCcpO1xuICBpZiAoc3RhdGVtZW50SW5kZXggPCAwKSByZXR1cm4gZmFsc2U7XG4gIGNvbnN0IHN0YXRlbWVudCA9IGFuY2VzdG9yc1tzdGF0ZW1lbnRJbmRleF07XG4gIGlmICghc3RhdGVtZW50KSByZXR1cm4gZmFsc2U7XG4gIGNvbnN0IHN0YXRlbWVudFBhcmVudCA9IGFuY2VzdG9yc1tzdGF0ZW1lbnRJbmRleCAtIDFdO1xuICByZXR1cm4gc3RhdGVtZW50LnN0YXJ0ID09PSBub2RlLnN0YXJ0ICYmIGlzU3RhdGVtZW50TGlzdE5vZGUoc3RhdGVtZW50UGFyZW50KTtcbn1cblxuZnVuY3Rpb24gaXNTdGF0ZW1lbnRMaXN0Tm9kZShub2RlOiBDb25zb2xlTm9kZSB8IHVuZGVmaW5lZCk6IGJvb2xlYW4ge1xuICByZXR1cm4gKFxuICAgIG5vZGU/LnR5cGUgPT09ICdQcm9ncmFtJyB8fFxuICAgIG5vZGU/LnR5cGUgPT09ICdCbG9ja1N0YXRlbWVudCcgfHxcbiAgICBub2RlPy50eXBlID09PSAnU3RhdGljQmxvY2snIHx8XG4gICAgbm9kZT8udHlwZSA9PT0gJ1RTTW9kdWxlQmxvY2snIHx8XG4gICAgbm9kZT8udHlwZSA9PT0gJ1N3aXRjaENhc2UnXG4gICk7XG59XG5cbmZ1bmN0aW9uIGlzQ29uc29sZUFzc2lnbm1lbnRUYXJnZXQoXG4gIG5vZGU6IENvbnNvbGVOb2RlLFxuICBwYXJlbnQ6IENvbnNvbGVOb2RlIHwgdW5kZWZpbmVkLFxuICBncmFuZHBhcmVudDogQ29uc29sZU5vZGUgfCB1bmRlZmluZWRcbik6IGJvb2xlYW4ge1xuICBpZiAocGFyZW50Py50eXBlID09PSAnVXBkYXRlRXhwcmVzc2lvbicgJiYgcGFyZW50LmFyZ3VtZW50ID09PSBub2RlKSByZXR1cm4gdHJ1ZTtcbiAgaWYgKChwYXJlbnQ/LnR5cGUgPT09ICdGb3JJblN0YXRlbWVudCcgfHwgcGFyZW50Py50eXBlID09PSAnRm9yT2ZTdGF0ZW1lbnQnKSAmJiBwYXJlbnQubGVmdCA9PT0gbm9kZSkgcmV0dXJuIHRydWU7XG4gIGlmIChwYXJlbnQ/LnR5cGUgPT09ICdBcnJheVBhdHRlcm4nKSByZXR1cm4gdHJ1ZTtcbiAgaWYgKHBhcmVudD8udHlwZSA9PT0gJ0Fzc2lnbm1lbnRQYXR0ZXJuJyAmJiBwYXJlbnQubGVmdCA9PT0gbm9kZSkgcmV0dXJuIHRydWU7XG4gIHJldHVybiBwYXJlbnQ/LnR5cGUgPT09ICdQcm9wZXJ0eScgJiYgcGFyZW50LnZhbHVlID09PSBub2RlICYmIGdyYW5kcGFyZW50Py50eXBlID09PSAnT2JqZWN0UGF0dGVybic7XG59XG5cbmZ1bmN0aW9uIGlzSW5jbHVkZWRDb25zb2xlTWVtYmVyKG5vZGU6IENvbnNvbGVOb2RlLCBleGNsdWRlZE1ldGhvZHM6IFNldDxzdHJpbmc+KTogYm9vbGVhbiB7XG4gIGlmIChub2RlLnR5cGUgIT09ICdNZW1iZXJFeHByZXNzaW9uJykgcmV0dXJuIGZhbHNlO1xuXG4gIGNvbnN0IG9iamVjdCA9IGdldENvbnNvbGVOb2RlUHJvcGVydHkobm9kZSwgJ29iamVjdCcpO1xuICBjb25zdCBwcm9wZXJ0eSA9IGdldENvbnNvbGVOb2RlUHJvcGVydHkobm9kZSwgJ3Byb3BlcnR5Jyk7XG4gIGlmIChub2RlLm9wdGlvbmFsID09PSB0cnVlKSByZXR1cm4gZmFsc2U7XG4gIGlmICghb2JqZWN0IHx8ICFwcm9wZXJ0eSB8fCBpc0V4Y2x1ZGVkQ29uc29sZVByb3BlcnR5KG5vZGUsIHByb3BlcnR5LCBleGNsdWRlZE1ldGhvZHMpKSByZXR1cm4gZmFsc2U7XG4gIGlmIChpc0dsb2JhbENvbnNvbGVJZGVudGlmaWVyKG9iamVjdCkpIHJldHVybiB0cnVlO1xuXG4gIHJldHVybiAoXG4gICAgb2JqZWN0LnR5cGUgPT09ICdNZW1iZXJFeHByZXNzaW9uJyAmJlxuICAgIGlzR2xvYmFsQ29uc29sZUlkZW50aWZpZXIoZ2V0Q29uc29sZU5vZGVQcm9wZXJ0eShvYmplY3QsICdvYmplY3QnKSkgJiZcbiAgICAvLyBNYXRjaGVzIGJhYmVsLXBsdWdpbi10cmFuc2Zvcm0tcmVtb3ZlLWNvbnNvbGU6IGNhbGwvYXBwbHkgZXhjbHVzaW9ucyBhcmUgY2hlY2tlZCBvbiB0aGUgb3V0ZXIgcHJvcGVydHkgb25seS5cbiAgICBub2RlLmNvbXB1dGVkICE9PSB0cnVlICYmXG4gICAgcHJvcGVydHkudHlwZSA9PT0gJ0lkZW50aWZpZXInICYmXG4gICAgKHByb3BlcnR5Lm5hbWUgPT09ICdjYWxsJyB8fCBwcm9wZXJ0eS5uYW1lID09PSAnYXBwbHknKVxuICApO1xufVxuXG5mdW5jdGlvbiBpc0luY2x1ZGVkQ29uc29sZUJpbmRNZW1iZXIobm9kZTogQ29uc29sZU5vZGUsIGV4Y2x1ZGVkTWV0aG9kczogU2V0PHN0cmluZz4pOiBib29sZWFuIHtcbiAgaWYgKG5vZGUudHlwZSAhPT0gJ01lbWJlckV4cHJlc3Npb24nKSByZXR1cm4gZmFsc2U7XG5cbiAgY29uc3Qgb2JqZWN0ID0gZ2V0Q29uc29sZU5vZGVQcm9wZXJ0eShub2RlLCAnb2JqZWN0Jyk7XG4gIGNvbnN0IHByb3BlcnR5ID0gZ2V0Q29uc29sZU5vZGVQcm9wZXJ0eShub2RlLCAncHJvcGVydHknKTtcbiAgaWYgKCFvYmplY3QgfHwgIXByb3BlcnR5IHx8IG9iamVjdC50eXBlICE9PSAnTWVtYmVyRXhwcmVzc2lvbicpIHJldHVybiBmYWxzZTtcbiAgaWYgKG5vZGUuY29tcHV0ZWQgPT09IHRydWUgfHwgcHJvcGVydHkudHlwZSAhPT0gJ0lkZW50aWZpZXInIHx8IHByb3BlcnR5Lm5hbWUgIT09ICdiaW5kJykgcmV0dXJuIGZhbHNlO1xuICBpZiAoIWlzR2xvYmFsQ29uc29sZUlkZW50aWZpZXIoZ2V0Q29uc29sZU5vZGVQcm9wZXJ0eShvYmplY3QsICdvYmplY3QnKSkpIHJldHVybiBmYWxzZTtcbiAgY29uc3QgY29uc29sZU1ldGhvZCA9IGdldENvbnNvbGVOb2RlUHJvcGVydHkob2JqZWN0LCAncHJvcGVydHknKTtcbiAgcmV0dXJuICEhY29uc29sZU1ldGhvZCAmJiAhaXNFeGNsdWRlZENvbnNvbGVQcm9wZXJ0eShvYmplY3QsIGNvbnNvbGVNZXRob2QsIGV4Y2x1ZGVkTWV0aG9kcyk7XG59XG5cbmZ1bmN0aW9uIGlzRXhjbHVkZWRDb25zb2xlUHJvcGVydHkoXG4gIG1lbWJlckV4cHJlc3Npb246IENvbnNvbGVOb2RlLFxuICBwcm9wZXJ0eTogQ29uc29sZU5vZGUsXG4gIGV4Y2x1ZGVkTWV0aG9kczogU2V0PHN0cmluZz5cbik6IGJvb2xlYW4ge1xuICAvLyBUaGUgcmVzdG9yZWQgYmVoYXZpb3IgbWF0Y2hlcyBiYWJlbC1wbHVnaW4tdHJhbnNmb3JtLXJlbW92ZS1jb25zb2xlLCB3aG9zZSBleGNsdXNpb25zIG9ubHkgYXBwbHkgdG8gaWRlbnRpZmllciBwcm9wZXJ0aWVzLlxuICByZXR1cm4gbWVtYmVyRXhwcmVzc2lvbi5jb21wdXRlZCAhPT0gdHJ1ZSAmJiBwcm9wZXJ0eS50eXBlID09PSAnSWRlbnRpZmllcicgJiYgZXhjbHVkZWRNZXRob2RzLmhhcyhwcm9wZXJ0eS5uYW1lIGFzIHN0cmluZyk7XG59XG5cbmZ1bmN0aW9uIGlzR2xvYmFsQ29uc29sZUlkZW50aWZpZXIobm9kZTogQ29uc29sZU5vZGUgfCB1bmRlZmluZWQpOiBib29sZWFuIHtcbiAgcmV0dXJuIG5vZGU/LnR5cGUgPT09ICdJZGVudGlmaWVyJyAmJiBub2RlLm5hbWUgPT09ICdjb25zb2xlJztcbn1cblxuZnVuY3Rpb24gc2VsZWN0Q29uc29sZVJlcGxhY2VtZW50cyhyZXBsYWNlbWVudHM6IENvbnNvbGVSZXBsYWNlbWVudFtdKTogQ29uc29sZVJlcGxhY2VtZW50W10ge1xuICBjb25zdCBzZWxlY3RlZDogQ29uc29sZVJlcGxhY2VtZW50W10gPSBbXTtcbiAgZm9yIChjb25zdCByZXBsYWNlbWVudCBvZiByZXBsYWNlbWVudHMudG9Tb3J0ZWQoKGEsIGIpID0+IGEuc3RhcnQgLSBiLnN0YXJ0IHx8IGIuZW5kIC0gYS5lbmQpKSB7XG4gICAgaWYgKHNlbGVjdGVkLnNvbWUoKGl0ZW0pID0+IGl0ZW0uc3RhcnQgPD0gcmVwbGFjZW1lbnQuc3RhcnQgJiYgcmVwbGFjZW1lbnQuZW5kIDw9IGl0ZW0uZW5kKSkgY29udGludWU7XG4gICAgc2VsZWN0ZWQucHVzaChyZXBsYWNlbWVudCk7XG4gIH1cbiAgcmV0dXJuIHNlbGVjdGVkLnRvU29ydGVkKChhLCBiKSA9PiBiLnN0YXJ0IC0gYS5zdGFydCk7XG59XG5cbmZ1bmN0aW9uIGdldENvbnNvbGVOb2RlQ2hpbGRyZW4obm9kZTogQ29uc29sZU5vZGUpOiBDb25zb2xlTm9kZVtdIHtcbiAgcmV0dXJuICh2aXNpdG9yS2V5c1tub2RlLnR5cGVdID8/IFtdKVxuICAgIC5mbGF0TWFwKChrZXkpID0+IHtcbiAgICAgIGNvbnN0IHZhbHVlID0gbm9kZVtrZXldO1xuICAgICAgcmV0dXJuIEFycmF5LmlzQXJyYXkodmFsdWUpID8gdmFsdWUgOiBbdmFsdWVdO1xuICAgIH0pXG4gICAgLmZpbHRlcigodmFsdWUpOiB2YWx1ZSBpcyBDb25zb2xlTm9kZSA9PiBpc0NvbnNvbGVOb2RlKHZhbHVlKSk7XG59XG5cbmZ1bmN0aW9uIGdldENvbnNvbGVOb2RlUHJvcGVydHkobm9kZTogQ29uc29sZU5vZGUsIGtleTogc3RyaW5nKTogQ29uc29sZU5vZGUgfCB1bmRlZmluZWQge1xuICBjb25zdCB2YWx1ZSA9IG5vZGVba2V5XTtcbiAgcmV0dXJuIGlzQ29uc29sZU5vZGUodmFsdWUpID8gdmFsdWUgOiB1bmRlZmluZWQ7XG59XG5cbmZ1bmN0aW9uIGdldEV4cG9ydERlY2xhcmF0aW9uKG5vZGU6IENvbnNvbGVOb2RlKTogQ29uc29sZU5vZGUgfCB1bmRlZmluZWQge1xuICBpZiAobm9kZS50eXBlICE9PSAnRXhwb3J0TmFtZWREZWNsYXJhdGlvbicgJiYgbm9kZS50eXBlICE9PSAnRXhwb3J0RGVmYXVsdERlY2xhcmF0aW9uJykgcmV0dXJuIHVuZGVmaW5lZDtcbiAgcmV0dXJuIGdldENvbnNvbGVOb2RlUHJvcGVydHkobm9kZSwgJ2RlY2xhcmF0aW9uJyk7XG59XG5cbmZ1bmN0aW9uIGdldENvbnNvbGVBcnJheVByb3BlcnR5KG5vZGU6IENvbnNvbGVOb2RlLCBrZXk6IHN0cmluZyk6IENvbnNvbGVOb2RlW10ge1xuICBjb25zdCB2YWx1ZSA9IG5vZGVba2V5XTtcbiAgcmV0dXJuIEFycmF5LmlzQXJyYXkodmFsdWUpID8gdmFsdWUuZmlsdGVyKChpdGVtKTogaXRlbSBpcyBDb25zb2xlTm9kZSA9PiBpc0NvbnNvbGVOb2RlKGl0ZW0pKSA6IFtdO1xufVxuXG5mdW5jdGlvbiBpc0NvbnNvbGVOb2RlKHZhbHVlOiB1bmtub3duKTogdmFsdWUgaXMgQ29uc29sZU5vZGUge1xuICByZXR1cm4gISF2YWx1ZSAmJiB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnICYmIHR5cGVvZiAodmFsdWUgYXMgQ29uc29sZU5vZGUpLnR5cGUgPT09ICdzdHJpbmcnO1xufVxuXG5mdW5jdGlvbiBpc05vZGVNb2R1bGVzUGF0aChpZDogc3RyaW5nKTogYm9vbGVhbiB7XG4gIHJldHVybiBpZC5pbmNsdWRlcygnL25vZGVfbW9kdWxlcy8nKSB8fCBpZC5pbmNsdWRlcygnXFxcXG5vZGVfbW9kdWxlc1xcXFwnKTtcbn1cblxuZnVuY3Rpb24gY29tbW9uSnNSdW50aW1lUHJlbHVkZVBsdWdpbigpOiBQbHVnaW4ge1xuICByZXR1cm4ge1xuICAgIG5hbWU6ICdjb21tb25qcy1ydW50aW1lLXByZWx1ZGUnLFxuICAgIHJlbmRlckNodW5rKGNvZGUsIF9jaHVuaywgb3B0aW9ucykge1xuICAgICAgY29uc3QgcHJlbHVkZSA9IGdldENvbW1vbkpzUnVudGltZVByZWx1ZGUoY29kZSwgb3B0aW9ucy5mb3JtYXQpO1xuICAgICAgaWYgKCFwcmVsdWRlKSByZXR1cm4gdW5kZWZpbmVkO1xuXG4gICAgICBjb25zdCBtYWdpY1N0cmluZyA9IG5ldyBNYWdpY1N0cmluZyhjb2RlKTtcbiAgICAgIGluc2VydFByZWx1ZGUobWFnaWNTdHJpbmcsIGNvZGUsIHByZWx1ZGUpO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgY29kZTogbWFnaWNTdHJpbmcudG9TdHJpbmcoKSxcbiAgICAgICAgbWFwOiBtYWdpY1N0cmluZy5nZW5lcmF0ZU1hcCh7IGhpcmVzOiB0cnVlIH0pIGFzIFNvdXJjZU1hcElucHV0LFxuICAgICAgfTtcbiAgICB9LFxuICB9O1xufVxuXG5jb25zdCBjb21tb25Kc1J1bnRpbWVQcmVsdWRlID0gYHZhciBfX2NyZWF0ZT1PYmplY3QuY3JlYXRlLF9fZGVmUHJvcD1PYmplY3QuZGVmaW5lUHJvcGVydHksX19nZXRPd25Qcm9wRGVzYz1PYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yLF9fZ2V0T3duUHJvcE5hbWVzPU9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzLF9fZ2V0UHJvdG9PZj1PYmplY3QuZ2V0UHJvdG90eXBlT2YsX19oYXNPd25Qcm9wPU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHksX19jb21tb25KU01pbj0obW9kdWxlRmFjdG9yeSxtb2R1bGUpPT4oKT0+KG1vZHVsZXx8KG1vZHVsZT17ZXhwb3J0czp7fX0sbW9kdWxlRmFjdG9yeShtb2R1bGUuZXhwb3J0cyxtb2R1bGUpKSxtb2R1bGUuZXhwb3J0cyksX19jb3B5UHJvcHM9KHRvLGZyb20sZXhjZXB0LGRlc2NyaXB0b3IpPT57aWYoZnJvbSYmXCJvYmplY3RcIj09dHlwZW9mIGZyb218fFwiZnVuY3Rpb25cIj09dHlwZW9mIGZyb20pZm9yKHZhciBrZXksbmFtZXM9X19nZXRPd25Qcm9wTmFtZXMoZnJvbSksaW5kZXg9MCxsZW5ndGg9bmFtZXMubGVuZ3RoO2luZGV4PGxlbmd0aDtpbmRleCsrKWtleT1uYW1lc1tpbmRleF0sX19oYXNPd25Qcm9wLmNhbGwodG8sa2V5KXx8a2V5PT09ZXhjZXB0fHxfX2RlZlByb3AodG8sa2V5LHtnZXQ6KGtleT0+ZnJvbVtrZXldKS5iaW5kKG51bGwsa2V5KSxlbnVtZXJhYmxlOiEoZGVzY3JpcHRvcj1fX2dldE93blByb3BEZXNjKGZyb20sa2V5KSl8fGRlc2NyaXB0b3IuZW51bWVyYWJsZX0pO3JldHVybiB0b30sX190b0VTTT0obW9kLGlzTm9kZU1vZGUsdGFyZ2V0KT0+KHRhcmdldD1udWxsIT1tb2Q/X19jcmVhdGUoX19nZXRQcm90b09mKG1vZCkpOnt9LF9fY29weVByb3BzKCFpc05vZGVNb2RlJiZtb2QmJm1vZC5fX2VzTW9kdWxlP3RhcmdldDpfX2RlZlByb3AodGFyZ2V0LFwiZGVmYXVsdFwiLHt2YWx1ZTptb2QsZW51bWVyYWJsZTohMH0pLG1vZCkpO2A7XG5cbmZ1bmN0aW9uIGdldENvbW1vbkpzUnVudGltZVByZWx1ZGUoY29kZTogc3RyaW5nLCBmb3JtYXQ6IHN0cmluZyk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGlmICghY29kZS5pbmNsdWRlcygnX19jb21tb25KU01pbicpKSByZXR1cm4gdW5kZWZpbmVkO1xuXG4gIC8vIFJvbGxkb3duIDEuMS4yIGNhbiBlbWl0IGhlbHBlcnMgYWZ0ZXIgY29yZS1qcyB3cmFwcGVycyB0aGF0IGFscmVhZHkgY2FsbCB0aGVtLlxuICAvLyBTZWVkaW5nIHRoZSBoZWxwZXJzIGJlZm9yZSBUZXJzZXIgcHJldmVudHMgbWluaWZpZWQgb3V0cHV0IGZyb20gY2FsbGluZyB1bmluaXRpYWxpemVkIGFsaWFzZXMuXG4gIGlmIChpc0NvbW1vbkpzRm9ybWF0KGZvcm1hdCkpIHJldHVybiBjb2RlLmluY2x1ZGVzKCdfX3RvRVNNJykgPyBjb21tb25Kc1J1bnRpbWVQcmVsdWRlIDogdW5kZWZpbmVkO1xuICByZXR1cm4gYHZhciBfX2NvbW1vbkpTTWluPShtb2R1bGVGYWN0b3J5LG1vZHVsZSk9PigpPT4obW9kdWxlfHwobW9kdWxlPXtleHBvcnRzOnt9fSxtb2R1bGVGYWN0b3J5KG1vZHVsZS5leHBvcnRzLG1vZHVsZSkpLG1vZHVsZS5leHBvcnRzKTtgO1xufVxuXG5mdW5jdGlvbiBpc0NvbW1vbkpzRm9ybWF0KGZvcm1hdDogc3RyaW5nKTogYm9vbGVhbiB7XG4gIHJldHVybiBmb3JtYXQgPT09ICdjanMnIHx8IGZvcm1hdCA9PT0gJ2NvbW1vbmpzJztcbn1cblxuZnVuY3Rpb24gaW5zZXJ0UHJlbHVkZShtYWdpY1N0cmluZzogTWFnaWNTdHJpbmcsIGNvZGU6IHN0cmluZywgcHJlbHVkZTogc3RyaW5nKTogdm9pZCB7XG4gIG1hZ2ljU3RyaW5nLmFwcGVuZExlZnQoZ2V0UHJlbHVkZUluc2VydGlvbkluZGV4KGNvZGUpLCBgJHtwcmVsdWRlfVxcbmApO1xufVxuXG5mdW5jdGlvbiBnZXRQcmVsdWRlSW5zZXJ0aW9uSW5kZXgoY29kZTogc3RyaW5nKTogbnVtYmVyIHtcbiAgbGV0IGluZGV4ID0gMDtcbiAgaWYgKGNvZGUuc3RhcnRzV2l0aCgnIyEnKSkge1xuICAgIGNvbnN0IGZpcnN0TGluZUVuZCA9IGNvZGUuaW5kZXhPZignXFxuJyk7XG4gICAgaWYgKGZpcnN0TGluZUVuZCA9PT0gLTEpIHJldHVybiBjb2RlLmxlbmd0aDtcbiAgICBpbmRleCA9IGZpcnN0TGluZUVuZCArIDE7XG4gIH1cblxuICBjb25zdCBkaXJlY3RpdmVQYXR0ZXJuID0gLyg/Oig/OlwiW15cIlxcbl0qXCJ8J1teJ1xcbl0qJyk7P1xccyopL3k7XG4gIHdoaWxlICh0cnVlKSB7XG4gICAgZGlyZWN0aXZlUGF0dGVybi5sYXN0SW5kZXggPSBpbmRleDtcbiAgICBjb25zdCBtYXRjaCA9IGRpcmVjdGl2ZVBhdHRlcm4uZXhlYyhjb2RlKTtcbiAgICBpZiAoIW1hdGNoPy5bMF0pIHJldHVybiBpbmRleDtcbiAgICBpbmRleCA9IGRpcmVjdGl2ZVBhdHRlcm4ubGFzdEluZGV4O1xuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjb250YWluc0RlY29yYXRvcihjb2RlOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgcmV0dXJuIC8oXnxbXlxccHtJRF9Db250aW51ZX0qXSlAXFxzKlsoXFxwe0lEX1N0YXJ0fSRfXS91LnRlc3Qoc3RyaXBDb21tZW50cyhjb2RlKSk7XG59XG5cbmNvbnN0IHJlZ2V4TGl0ZXJhbFByZWZpeENoYXJhY3RlcnMgPSBuZXcgU2V0KFtcbiAgJygnLFxuICAnWycsXG4gICd7JyxcbiAgJzonLFxuICAnLCcsXG4gICc7JyxcbiAgJz0nLFxuICAnIScsXG4gICc/JyxcbiAgJyYnLFxuICAnfCcsXG4gICdeJyxcbiAgJ34nLFxuICAnKycsXG4gICctJyxcbiAgJyonLFxuICAnJScsXG4gICc8JyxcbiAgJz4nLFxuXSk7XG5jb25zdCByZWdleExpdGVyYWxQcmVmaXhLZXl3b3JkcyA9IG5ldyBTZXQoW1xuICAnYXdhaXQnLFxuICAnY2FzZScsXG4gICdkZWZhdWx0JyxcbiAgJ2RlbGV0ZScsXG4gICdkbycsXG4gICdlbHNlJyxcbiAgJ2luJyxcbiAgJ2luc3RhbmNlb2YnLFxuICAnbmV3JyxcbiAgJ29mJyxcbiAgJ3JldHVybicsXG4gICd0aHJvdycsXG4gICd0eXBlb2YnLFxuICAndm9pZCcsXG4gICd5aWVsZCcsXG5dKTtcblxuZnVuY3Rpb24gc3RyaXBDb21tZW50cyhjb2RlOiBzdHJpbmcpOiBzdHJpbmcge1xuICBsZXQgc3RyaXBwZWRDb2RlID0gJyc7XG4gIGxldCBpbmRleCA9IDA7XG4gIGxldCBxdW90ZTogJ1wiJyB8IFwiJ1wiIHwgJ2AnIHwgdW5kZWZpbmVkO1xuXG4gIHdoaWxlIChpbmRleCA8IGNvZGUubGVuZ3RoKSB7XG4gICAgY29uc3QgY3VycmVudCA9IGNvZGVbaW5kZXhdO1xuICAgIGNvbnN0IG5leHQgPSBjb2RlW2luZGV4ICsgMV07XG5cbiAgICBpZiAocXVvdGUpIHtcbiAgICAgIGlmIChjdXJyZW50ID09PSAnXFxcXCcpIHtcbiAgICAgICAgc3RyaXBwZWRDb2RlICs9ICcgJztcbiAgICAgICAgaWYgKG5leHQpIHN0cmlwcGVkQ29kZSArPSBuZXh0ID09PSAnXFxuJyA/ICdcXG4nIDogJyAnO1xuICAgICAgICBpbmRleCArPSAyO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGlmIChjdXJyZW50ID09PSBxdW90ZSkgcXVvdGUgPSB1bmRlZmluZWQ7XG4gICAgICBzdHJpcHBlZENvZGUgKz0gY3VycmVudCA9PT0gJ1xcbicgPyAnXFxuJyA6ICcgJztcbiAgICAgIGluZGV4Kys7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICBpZiAoY3VycmVudCA9PT0gJ1wiJyB8fCBjdXJyZW50ID09PSBcIidcIiB8fCBjdXJyZW50ID09PSAnYCcpIHtcbiAgICAgIHF1b3RlID0gY3VycmVudDtcbiAgICAgIHN0cmlwcGVkQ29kZSArPSAnICc7XG4gICAgICBpbmRleCsrO1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgaWYgKGN1cnJlbnQgPT09ICcvJyAmJiBuZXh0ICE9PSAnLycgJiYgbmV4dCAhPT0gJyonICYmIGlzUmVnZXhMaXRlcmFsU3RhcnQoc3RyaXBwZWRDb2RlKSkge1xuICAgICAgY29uc3QgcmVnZXhFbmRJbmRleCA9IGdldFJlZ2V4TGl0ZXJhbEVuZEluZGV4KGNvZGUsIGluZGV4KTtcbiAgICAgIHN0cmlwcGVkQ29kZSArPSByZXBsYWNlV2l0aFdoaXRlc3BhY2UoY29kZS5zbGljZShpbmRleCwgcmVnZXhFbmRJbmRleCkpO1xuICAgICAgaW5kZXggPSByZWdleEVuZEluZGV4O1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgaWYgKGN1cnJlbnQgPT09ICcvJyAmJiBuZXh0ID09PSAnLycpIHtcbiAgICAgIGluZGV4ICs9IDI7XG4gICAgICB3aGlsZSAoaW5kZXggPCBjb2RlLmxlbmd0aCAmJiBjb2RlW2luZGV4XSAhPT0gJ1xcbicpIGluZGV4Kys7XG4gICAgICBzdHJpcHBlZENvZGUgKz0gJ1xcbic7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICBpZiAoY3VycmVudCA9PT0gJy8nICYmIG5leHQgPT09ICcqJykge1xuICAgICAgaW5kZXggKz0gMjtcbiAgICAgIHdoaWxlIChpbmRleCA8IGNvZGUubGVuZ3RoICYmICEoY29kZVtpbmRleF0gPT09ICcqJyAmJiBjb2RlW2luZGV4ICsgMV0gPT09ICcvJykpIHtcbiAgICAgICAgc3RyaXBwZWRDb2RlICs9IGNvZGVbaW5kZXhdID09PSAnXFxuJyA/ICdcXG4nIDogJyAnO1xuICAgICAgICBpbmRleCsrO1xuICAgICAgfVxuICAgICAgaW5kZXggKz0gMjtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIHN0cmlwcGVkQ29kZSArPSBjdXJyZW50O1xuICAgIGluZGV4Kys7XG4gIH1cbiAgcmV0dXJuIHN0cmlwcGVkQ29kZTtcbn1cblxuZnVuY3Rpb24gaXNSZWdleExpdGVyYWxTdGFydChzdHJpcHBlZENvZGU6IHN0cmluZyk6IGJvb2xlYW4ge1xuICBjb25zdCBwcmV2aW91c0luZGV4ID0gZmluZFByZXZpb3VzU2lnbmlmaWNhbnRJbmRleChzdHJpcHBlZENvZGUpO1xuICBpZiAocHJldmlvdXNJbmRleCA9PT0gLTEpIHJldHVybiB0cnVlO1xuICBjb25zdCBwcmV2aW91cyA9IHN0cmlwcGVkQ29kZVtwcmV2aW91c0luZGV4XSA/PyAnJztcbiAgaWYgKHByZXZpb3VzID09PSAnKScpIHJldHVybiBpc0FmdGVyQ29udHJvbFN0YXRlbWVudENvbmRpdGlvbihzdHJpcHBlZENvZGUsIHByZXZpb3VzSW5kZXgpO1xuICBpZiAoKHByZXZpb3VzID09PSAnKycgfHwgcHJldmlvdXMgPT09ICctJykgJiYgc3RyaXBwZWRDb2RlW2ZpbmRQcmV2aW91c1NpZ25pZmljYW50SW5kZXgoc3RyaXBwZWRDb2RlLCBwcmV2aW91c0luZGV4IC0gMSldID09PSBwcmV2aW91cykge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBpZiAocmVnZXhMaXRlcmFsUHJlZml4Q2hhcmFjdGVycy5oYXMocHJldmlvdXMpKSByZXR1cm4gdHJ1ZTtcblxuICBjb25zdCBwcmV2aW91c0tleXdvcmQgPSBzdHJpcHBlZENvZGUuc2xpY2UoMCwgcHJldmlvdXNJbmRleCArIDEpLm1hdGNoKC9bXFxwe0lEX1N0YXJ0fSRfXVtcXHB7SURfQ29udGludWV9JFxcdTIwMGNcXHUyMDBkXSokL3UpPy5bMF07XG4gIHJldHVybiBwcmV2aW91c0tleXdvcmQgPyByZWdleExpdGVyYWxQcmVmaXhLZXl3b3Jkcy5oYXMocHJldmlvdXNLZXl3b3JkKSA6IGZhbHNlO1xufVxuXG5mdW5jdGlvbiBmaW5kUHJldmlvdXNTaWduaWZpY2FudEluZGV4KGNvZGU6IHN0cmluZywgc3RhcnRJbmRleCA9IGNvZGUubGVuZ3RoIC0gMSk6IG51bWJlciB7XG4gIGZvciAobGV0IGluZGV4ID0gc3RhcnRJbmRleDsgaW5kZXggPj0gMDsgaW5kZXgtLSkge1xuICAgIGlmICghL1xccy91LnRlc3QoY29kZVtpbmRleF0gPz8gJycpKSByZXR1cm4gaW5kZXg7XG4gIH1cbiAgcmV0dXJuIC0xO1xufVxuXG5mdW5jdGlvbiBpc0FmdGVyQ29udHJvbFN0YXRlbWVudENvbmRpdGlvbihjb2RlOiBzdHJpbmcsIGNsb3NlUGFyZW5JbmRleDogbnVtYmVyKTogYm9vbGVhbiB7XG4gIGNvbnN0IG9wZW5QYXJlbkluZGV4ID0gZmluZE1hdGNoaW5nT3BlblBhcmVuSW5kZXgoY29kZSwgY2xvc2VQYXJlbkluZGV4KTtcbiAgaWYgKG9wZW5QYXJlbkluZGV4ID09PSAtMSkgcmV0dXJuIGZhbHNlO1xuXG4gIGNvbnN0IGtleXdvcmRFbmRJbmRleCA9IGZpbmRQcmV2aW91c1NpZ25pZmljYW50SW5kZXgoY29kZSwgb3BlblBhcmVuSW5kZXggLSAxKTtcbiAgaWYgKGtleXdvcmRFbmRJbmRleCA9PT0gLTEpIHJldHVybiBmYWxzZTtcblxuICBjb25zdCBrZXl3b3JkID0gY29kZS5zbGljZSgwLCBrZXl3b3JkRW5kSW5kZXggKyAxKS5tYXRjaCgvW1xccHtJRF9TdGFydH0kX11bXFxwe0lEX0NvbnRpbnVlfSRcXHUyMDBjXFx1MjAwZF0qJC91KT8uWzBdO1xuICByZXR1cm4ga2V5d29yZCA/IFsnZm9yJywgJ2lmJywgJ3doaWxlJywgJ3dpdGgnXS5pbmNsdWRlcyhrZXl3b3JkKSA6IGZhbHNlO1xufVxuXG5mdW5jdGlvbiBmaW5kTWF0Y2hpbmdPcGVuUGFyZW5JbmRleChjb2RlOiBzdHJpbmcsIGNsb3NlUGFyZW5JbmRleDogbnVtYmVyKTogbnVtYmVyIHtcbiAgbGV0IGRlcHRoID0gMDtcbiAgZm9yIChsZXQgaW5kZXggPSBjbG9zZVBhcmVuSW5kZXg7IGluZGV4ID49IDA7IGluZGV4LS0pIHtcbiAgICBjb25zdCBjdXJyZW50ID0gY29kZVtpbmRleF07XG4gICAgaWYgKGN1cnJlbnQgPT09ICcpJykge1xuICAgICAgZGVwdGgrKztcbiAgICB9IGVsc2UgaWYgKGN1cnJlbnQgPT09ICcoJykge1xuICAgICAgZGVwdGgtLTtcbiAgICAgIGlmIChkZXB0aCA9PT0gMCkgcmV0dXJuIGluZGV4O1xuICAgIH1cbiAgfVxuICByZXR1cm4gLTE7XG59XG5cbmZ1bmN0aW9uIGdldFJlZ2V4TGl0ZXJhbEVuZEluZGV4KGNvZGU6IHN0cmluZywgc3RhcnRJbmRleDogbnVtYmVyKTogbnVtYmVyIHtcbiAgbGV0IGluZGV4ID0gc3RhcnRJbmRleCArIDE7XG4gIGxldCBpbkNoYXJhY3RlckNsYXNzID0gZmFsc2U7XG5cbiAgd2hpbGUgKGluZGV4IDwgY29kZS5sZW5ndGgpIHtcbiAgICBjb25zdCBjdXJyZW50ID0gY29kZVtpbmRleF07XG4gICAgaWYgKGN1cnJlbnQgPT09ICdcXFxcJykge1xuICAgICAgaW5kZXggKz0gMjtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBpZiAoY3VycmVudCA9PT0gJ1snKSBpbkNoYXJhY3RlckNsYXNzID0gdHJ1ZTtcbiAgICBpZiAoY3VycmVudCA9PT0gJ10nKSBpbkNoYXJhY3RlckNsYXNzID0gZmFsc2U7XG4gICAgaWYgKGN1cnJlbnQgPT09ICcvJyAmJiAhaW5DaGFyYWN0ZXJDbGFzcykge1xuICAgICAgaW5kZXgrKztcbiAgICAgIHdoaWxlICgvW1xccHtJRF9Db250aW51ZX0kXFx1MjAwY1xcdTIwMGRdL3UudGVzdChjb2RlW2luZGV4XSA/PyAnJykpIGluZGV4Kys7XG4gICAgICByZXR1cm4gaW5kZXg7XG4gICAgfVxuICAgIGlmIChjdXJyZW50ID09PSAnXFxuJykgcmV0dXJuIGluZGV4O1xuICAgIGluZGV4Kys7XG4gIH1cbiAgcmV0dXJuIGluZGV4O1xufVxuXG5mdW5jdGlvbiByZXBsYWNlV2l0aFdoaXRlc3BhY2UodmFsdWU6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiB2YWx1ZS5yZXBsYWNlKC9bXlxcbl0vZ3UsICcgJyk7XG59XG5cbmZ1bmN0aW9uIHRleHRQbHVnaW4oKTogUGx1Z2luIHtcbiAgcmV0dXJuIHtcbiAgICBuYW1lOiAndGV4dCcsXG4gICAgYXN5bmMgbG9hZChpZCkge1xuICAgICAgaWYgKCFpZC5lbmRzV2l0aCgnLmNzdicpICYmICFpZC5lbmRzV2l0aCgnLnR4dCcpKSByZXR1cm4gdW5kZWZpbmVkO1xuXG4gICAgICBjb25zdCBjb250ZW50ID0gYXdhaXQgZnMucHJvbWlzZXMucmVhZEZpbGUoaWQsICd1dGY4Jyk7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBjb2RlOiBgZXhwb3J0IGRlZmF1bHQgJHtKU09OLnN0cmluZ2lmeShjb250ZW50KX07YCxcbiAgICAgICAgbW9kdWxlVHlwZTogJ2pzJyxcbiAgICAgIH07XG4gICAgfSxcbiAgfTtcbn1cblxuZnVuY3Rpb24gdGVyc2VyUGx1Z2luKCk6IFBsdWdpbiB7XG4gIHJldHVybiB7XG4gICAgbmFtZTogJ3RlcnNlcicsXG4gICAgYXN5bmMgcmVuZGVyQ2h1bmsoY29kZSwgX2NodW5rLCBvcHRpb25zKSB7XG4gICAgICBjb25zdCBzb3VyY2VNYXBPcHRpb25zOiBTb3VyY2VNYXBPcHRpb25zIHwgdW5kZWZpbmVkID0gb3B0aW9ucy5zb3VyY2VtYXBcbiAgICAgICAgPyB7IGFzT2JqZWN0OiB0cnVlIH1cbiAgICAgICAgOiB1bmRlZmluZWQ7XG4gICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBtaW5pZnkoY29kZSwge1xuICAgICAgICBjb21wcmVzczogeyBkaXJlY3RpdmVzOiBmYWxzZSB9LFxuICAgICAgICBlY21hOiAyMDIyLFxuICAgICAgICBmb3JtYXQ6IHsgY29tbWVudHM6IGZhbHNlIH0sXG4gICAgICAgIG1vZHVsZTogb3B0aW9ucy5mb3JtYXQgPT09ICdlcycsXG4gICAgICAgIHNvdXJjZU1hcDogc291cmNlTWFwT3B0aW9ucyxcbiAgICAgIH0gc2F0aXNmaWVzIE1pbmlmeU9wdGlvbnMpO1xuICAgICAgaWYgKCFyZXN1bHQuY29kZSkgcmV0dXJuIHVuZGVmaW5lZDtcblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgY29kZTogcmVzdWx0LmNvZGUsXG4gICAgICAgIG1hcDogcmVzdWx0Lm1hcCBhcyBTb3VyY2VNYXBJbnB1dCxcbiAgICAgIH07XG4gICAgfSxcbiAgfTtcbn1cbiIsImltcG9ydCAqIGFzIGNoaWxkX3Byb2Nlc3MgZnJvbSAnbm9kZTpjaGlsZF9wcm9jZXNzJztcbmltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCB7IGNyZWF0ZVJlcXVpcmUgfSBmcm9tICdub2RlOm1vZHVsZSc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgdHlwZSB7IEFyZ3VtZW50c1R5cGUgfSBmcm9tICcuLi8uLi90eXBlcy5qcyc7XG5cbmltcG9ydCB0eXBlIHsgQW55QnVpbGRlclR5cGUgfSBmcm9tICcuL2J1aWxkZXIuanMnO1xuXG5jb25zdCByZXF1aXJlID0gY3JlYXRlUmVxdWlyZShpbXBvcnQubWV0YS51cmwpO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVEZWNsYXJhdGlvbkZpbGVzKFxuICBhcmd2OiBBcmd1bWVudHNUeXBlPEFueUJ1aWxkZXJUeXBlPixcbiAgY29yZVByb2plY3REaXJQYXRoOiBzdHJpbmdcbik6IFByb21pc2U8Ym9vbGVhbj4ge1xuICBjb25zdCBjb3JlQ29uZmlnRmlsZSA9IGZpbmRDb25maWdGaWxlKGNvcmVQcm9qZWN0RGlyUGF0aCk7XG4gIGlmICghY29yZUNvbmZpZ0ZpbGUpIHRocm93IG5ldyBFcnJvcihgRmFpbGVkIHRvIGZpbmQgdHNjb25maWcuanNvbiBpbiAke2NvcmVQcm9qZWN0RGlyUGF0aH0uYCk7XG4gIGlmIChhcmd2LnZlcmJvc2UpIHtcbiAgICBjb25zb2xlLmluZm8oJ0ZvdW5kIHRzY29uZmlnLmpzb246JywgY29yZUNvbmZpZ0ZpbGUpO1xuICB9XG5cbiAgY29uc3QgcHJvamVjdHM6IFtzdHJpbmcsIHN0cmluZywgc3RyaW5nXVtdID0gW107XG4gIGxldCBvdXREaXIgPSBwYXRoLmpvaW4oJ2Rpc3QnLCBwYXRoLmJhc2VuYW1lKGNvcmVQcm9qZWN0RGlyUGF0aCksICdzcmMnKTtcbiAgaWYgKGZzLmV4aXN0c1N5bmMob3V0RGlyKSkge1xuICAgIGNvbnN0IHBhcmVudERpclBhdGggPSBwYXRoLmRpcm5hbWUoY29yZVByb2plY3REaXJQYXRoKTtcbiAgICBjb25zdCBkaXJlbnRzID0gYXdhaXQgZnMucHJvbWlzZXMucmVhZGRpcihwYXJlbnREaXJQYXRoLCB7IHdpdGhGaWxlVHlwZXM6IHRydWUgfSk7XG4gICAgY29yZVByb2plY3REaXJQYXRoID0gcGF0aC5yZXNvbHZlKGNvcmVQcm9qZWN0RGlyUGF0aCk7XG4gICAgZm9yIChjb25zdCBkaXJlbnQgb2YgZGlyZW50cykge1xuICAgICAgaWYgKCFkaXJlbnQuaXNEaXJlY3RvcnkoKSkgY29udGludWU7XG5cbiAgICAgIGNvbnN0IHByb2plY3REaXJQYXRoID0gcGF0aC5yZXNvbHZlKHBhcmVudERpclBhdGgsIGRpcmVudC5uYW1lKTtcbiAgICAgIGlmIChwcm9qZWN0RGlyUGF0aCA9PT0gY29yZVByb2plY3REaXJQYXRoKSBjb250aW51ZTtcblxuICAgICAgY29uc3QgY29uZmlnRmlsZSA9IGZpbmRDb25maWdGaWxlKHByb2plY3REaXJQYXRoKTtcbiAgICAgIGNvbnN0IG91dERpciA9IHBhdGguam9pbignZGlzdCcsIGRpcmVudC5uYW1lLCAnc3JjJyk7XG4gICAgICBpZiAoY29uZmlnRmlsZSAmJiBmcy5leGlzdHNTeW5jKG91dERpcikpIHtcbiAgICAgICAgcHJvamVjdHMucHVzaChbcHJvamVjdERpclBhdGgsIGNvbmZpZ0ZpbGUsIG91dERpcl0pO1xuICAgICAgfVxuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBvdXREaXIgPSAnZGlzdCc7XG4gIH1cbiAgcHJvamVjdHMucHVzaChbY29yZVByb2plY3REaXJQYXRoLCBjb3JlQ29uZmlnRmlsZSwgb3V0RGlyXSk7XG5cbiAgbGV0IGFsbFN1Y2NlZWRlZCA9IHRydWU7XG4gIGZvciAoY29uc3QgW3Byb2plY3REaXJQYXRoLCBjb25maWdGaWxlLCBvdXREaXJdIG9mIHByb2plY3RzKSB7XG4gICAgYWxsU3VjY2VlZGVkICYmPSBhd2FpdCBydW5Uc2dvKGFyZ3YsIHByb2plY3REaXJQYXRoLCBjb25maWdGaWxlLCBwYXRoLmpvaW4oY29yZVByb2plY3REaXJQYXRoLCBvdXREaXIpKTtcbiAgfVxuICByZXR1cm4gYWxsU3VjY2VlZGVkO1xufVxuXG5hc3luYyBmdW5jdGlvbiBydW5Uc2dvKFxuICBhcmd2OiBBcmd1bWVudHNUeXBlPEFueUJ1aWxkZXJUeXBlPixcbiAgcHJvamVjdERpclBhdGg6IHN0cmluZyxcbiAgY29uZmlnRmlsZTogc3RyaW5nLFxuICBvdXREaXI6IHN0cmluZ1xuKTogUHJvbWlzZTxib29sZWFuPiB7XG4gIGlmIChhcmd2LnZlcmJvc2UpIHtcbiAgICBjb25zb2xlLmluZm8oJ3J1blRzZ28oKScsIHByb2plY3REaXJQYXRoLCBjb25maWdGaWxlLCBvdXREaXIpO1xuICB9XG5cbiAgY29uc3QgY29uZmlnRmlsZURpclBhdGggPSBwYXRoLmRpcm5hbWUoY29uZmlnRmlsZSk7XG4gIGNvbnN0IHRlbXBDb25maWdGaWxlID0gcGF0aC5qb2luKGNvbmZpZ0ZpbGVEaXJQYXRoLCBgLmJ1aWxkLXRzLXRzZ28uJHtwcm9jZXNzLnBpZH0uJHtEYXRlLm5vdygpfS5qc29uYCk7XG4gIHRyeSB7XG4gICAgYXdhaXQgZnMucHJvbWlzZXMud3JpdGVGaWxlKFxuICAgICAgdGVtcENvbmZpZ0ZpbGUsXG4gICAgICBKU09OLnN0cmluZ2lmeShhd2FpdCBjcmVhdGVUeXBlU2NyaXB0TmF0aXZlQ29uZmlnKHByb2plY3REaXJQYXRoLCBjb25maWdGaWxlLCBvdXREaXIpLCB1bmRlZmluZWQsIDIpXG4gICAgKTtcbiAgICBjb25zdCByZXQgPSBjaGlsZF9wcm9jZXNzLnNwYXduU3luYyhwcm9jZXNzLmV4ZWNQYXRoLCBbZ2V0VHNnb1BhdGgoKSwgJy1wJywgdGVtcENvbmZpZ0ZpbGVdLCB7XG4gICAgICBjd2Q6IHByb2plY3REaXJQYXRoLFxuICAgICAgc3RkaW86ICdpbmhlcml0JyxcbiAgICB9KTtcbiAgICBpZiAocmV0LmVycm9yKSB0aHJvdyByZXQuZXJyb3I7XG4gICAgcmV0dXJuIHJldC5zdGF0dXMgPT09IDA7XG4gIH0gZmluYWxseSB7XG4gICAgYXdhaXQgZnMucHJvbWlzZXMucm0odGVtcENvbmZpZ0ZpbGUsIHsgZm9yY2U6IHRydWUgfSk7XG4gIH1cbn1cblxuYXN5bmMgZnVuY3Rpb24gY3JlYXRlVHlwZVNjcmlwdE5hdGl2ZUNvbmZpZyhcbiAgcHJvamVjdERpclBhdGg6IHN0cmluZyxcbiAgY29uZmlnRmlsZTogc3RyaW5nLFxuICBvdXREaXI6IHN0cmluZ1xuKTogUHJvbWlzZTxSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj4ge1xuICBjb25zdCBjb21waWxlck9wdGlvbnM6IFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0ge1xuICAgIGRlY2xhcmF0aW9uOiB0cnVlLFxuICAgIGVtaXREZWNsYXJhdGlvbk9ubHk6IHRydWUsXG4gICAgbm9FbWl0OiBmYWxzZSxcbiAgICBub0VtaXRPbkVycm9yOiB0cnVlLFxuICAgIG91dERpcixcbiAgICByb290RGlyOiAnc3JjJyxcbiAgfTtcbiAgaWYgKGF3YWl0IHVzZXNOb2RlUHJvdG9jb2xJbXBvcnQocGF0aC5qb2luKHByb2plY3REaXJQYXRoLCAnc3JjJykpKSB7XG4gICAgY29uc3QgdHlwZXNEaXJQYXRoID0gZmluZFR5cGVzRGlyUGF0aChwcm9qZWN0RGlyUGF0aCk7XG4gICAgY29uc3QgdHlwZXMgPSB0eXBlc0RpclBhdGggPyBhd2FpdCBjb2xsZWN0VHlwZVBhY2thZ2VzKHR5cGVzRGlyUGF0aCkgOiBbXTtcbiAgICBpZiAodHlwZXMuaW5jbHVkZXMoJ25vZGUnKSkge1xuICAgICAgY29tcGlsZXJPcHRpb25zLnR5cGVzID0gdHlwZXM7XG4gICAgfVxuICB9XG4gIHJldHVybiB7XG4gICAgY29tcGlsZXJPcHRpb25zLFxuICAgIGV4dGVuZHM6IHRvUmVsYXRpdmVDb25maWdQYXRoKHBhdGguZGlybmFtZShjb25maWdGaWxlKSwgY29uZmlnRmlsZSksXG4gICAgaW5jbHVkZTogWydzcmMvKiovKiddLFxuICB9O1xufVxuXG5mdW5jdGlvbiBmaW5kQ29uZmlnRmlsZShkaXJQYXRoOiBzdHJpbmcpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBsZXQgY3VycmVudERpclBhdGggPSBwYXRoLnJlc29sdmUoZGlyUGF0aCk7XG4gIHdoaWxlICh0cnVlKSB7XG4gICAgY29uc3QgY29uZmlnRmlsZSA9IHBhdGguam9pbihjdXJyZW50RGlyUGF0aCwgJ3RzY29uZmlnLmpzb24nKTtcbiAgICBpZiAoZnMuZXhpc3RzU3luYyhjb25maWdGaWxlKSkgcmV0dXJuIGNvbmZpZ0ZpbGU7XG5cbiAgICBjb25zdCBwYXJlbnREaXJQYXRoID0gcGF0aC5kaXJuYW1lKGN1cnJlbnREaXJQYXRoKTtcbiAgICBpZiAocGFyZW50RGlyUGF0aCA9PT0gY3VycmVudERpclBhdGgpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgY3VycmVudERpclBhdGggPSBwYXJlbnREaXJQYXRoO1xuICB9XG59XG5cbmZ1bmN0aW9uIGdldFRzZ29QYXRoKCk6IHN0cmluZyB7XG4gIGNvbnN0IHBhY2thZ2VKc29uUGF0aCA9IHJlcXVpcmUucmVzb2x2ZSgnQHR5cGVzY3JpcHQvbmF0aXZlLXByZXZpZXcvcGFja2FnZS5qc29uJyk7XG4gIHJldHVybiBwYXRoLmpvaW4ocGF0aC5kaXJuYW1lKHBhY2thZ2VKc29uUGF0aCksICdiaW4nLCAndHNnby5qcycpO1xufVxuXG5hc3luYyBmdW5jdGlvbiB1c2VzTm9kZVByb3RvY29sSW1wb3J0KGRpclBhdGg6IHN0cmluZyk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICB0cnkge1xuICAgIGNvbnN0IGRpcmVudHMgPSBhd2FpdCBmcy5wcm9taXNlcy5yZWFkZGlyKGRpclBhdGgsIHsgd2l0aEZpbGVUeXBlczogdHJ1ZSB9KTtcbiAgICBmb3IgKGNvbnN0IGRpcmVudCBvZiBkaXJlbnRzKSB7XG4gICAgICBjb25zdCBjaGlsZFBhdGggPSBwYXRoLmpvaW4oZGlyUGF0aCwgZGlyZW50Lm5hbWUpO1xuICAgICAgaWYgKGRpcmVudC5pc0RpcmVjdG9yeSgpKSB7XG4gICAgICAgIGlmIChhd2FpdCB1c2VzTm9kZVByb3RvY29sSW1wb3J0KGNoaWxkUGF0aCkpIHJldHVybiB0cnVlO1xuICAgICAgfSBlbHNlIGlmICgvXFwuW2NtXT90c3g/JC8udGVzdChkaXJlbnQubmFtZSkgJiYgKGF3YWl0IGZzLnByb21pc2VzLnJlYWRGaWxlKGNoaWxkUGF0aCwgJ3V0ZjgnKSkuaW5jbHVkZXMoJ25vZGU6JykpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgfVxuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgcmV0dXJuIGZhbHNlO1xufVxuXG5mdW5jdGlvbiBmaW5kVHlwZXNEaXJQYXRoKGRpclBhdGg6IHN0cmluZyk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGxldCBjdXJyZW50RGlyUGF0aCA9IHBhdGgucmVzb2x2ZShkaXJQYXRoKTtcbiAgd2hpbGUgKHRydWUpIHtcbiAgICBjb25zdCB0eXBlc0RpclBhdGggPSBwYXRoLmpvaW4oY3VycmVudERpclBhdGgsICdub2RlX21vZHVsZXMnLCAnQHR5cGVzJyk7XG4gICAgaWYgKGZzLmV4aXN0c1N5bmModHlwZXNEaXJQYXRoKSkgcmV0dXJuIHR5cGVzRGlyUGF0aDtcblxuICAgIGNvbnN0IHBhcmVudERpclBhdGggPSBwYXRoLmRpcm5hbWUoY3VycmVudERpclBhdGgpO1xuICAgIGlmIChwYXJlbnREaXJQYXRoID09PSBjdXJyZW50RGlyUGF0aCkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICBjdXJyZW50RGlyUGF0aCA9IHBhcmVudERpclBhdGg7XG4gIH1cbn1cblxuYXN5bmMgZnVuY3Rpb24gY29sbGVjdFR5cGVQYWNrYWdlcyh0eXBlUm9vdHNEaXJQYXRoOiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZ1tdPiB7XG4gIHRyeSB7XG4gICAgY29uc3QgZGlyZW50cyA9IGF3YWl0IGZzLnByb21pc2VzLnJlYWRkaXIodHlwZVJvb3RzRGlyUGF0aCwgeyB3aXRoRmlsZVR5cGVzOiB0cnVlIH0pO1xuICAgIHJldHVybiBkaXJlbnRzLmZpbHRlcigoZGlyZW50KSA9PiBkaXJlbnQuaXNEaXJlY3RvcnkoKSkubWFwKChkaXJlbnQpID0+IGRpcmVudC5uYW1lKTtcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIFtdO1xuICB9XG59XG5cbmZ1bmN0aW9uIHRvUmVsYXRpdmVDb25maWdQYXRoKGZyb21EaXJQYXRoOiBzdHJpbmcsIHRvRmlsZVBhdGg6IHN0cmluZyk6IHN0cmluZyB7XG4gIGNvbnN0IHJlbGF0aXZlUGF0aCA9IHBhdGgucmVsYXRpdmUoZnJvbURpclBhdGgsIHRvRmlsZVBhdGgpLnJlcGxhY2VBbGwocGF0aC5zZXAsICcvJyk7XG4gIHJldHVybiByZWxhdGl2ZVBhdGguc3RhcnRzV2l0aCgnLicpID8gcmVsYXRpdmVQYXRoIDogYC4vJHtyZWxhdGl2ZVBhdGh9YDtcbn1cbiIsImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCBjaGFsayBmcm9tICdjaGFsayc7XG5pbXBvcnQgZGF0ZVRpbWUgZnJvbSAnZGF0ZS10aW1lJztcbmltcG9ydCBtcyBmcm9tICdwcmV0dHktbXMnO1xuaW1wb3J0IHsgcm9sbGRvd24sIHdhdGNoIH0gZnJvbSAncm9sbGRvd24nO1xuaW1wb3J0IHR5cGUgeyBPdXRwdXRPcHRpb25zLCBSb2xsZG93bkJ1aWxkLCBSb2xsZG93bk9wdGlvbnMgfSBmcm9tICdyb2xsZG93bic7XG5pbXBvcnQgdHlwZSB7IEhhbmRsZXIgfSBmcm9tICdzaWduYWwtZXhpdCc7XG5pbXBvcnQgeyBvbkV4aXQgfSBmcm9tICdzaWduYWwtZXhpdCc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VKc29uIH0gZnJvbSAndHlwZS1mZXN0JztcbmltcG9ydCB0eXBlIHsgQ29tbWFuZE1vZHVsZSB9IGZyb20gJ3lhcmdzJztcblxuaW1wb3J0IHsgY3JlYXRlRW52aXJvbm1lbnRWYXJpYWJsZXNEZWZpbml0aW9uLCBsb2FkRW52aXJvbm1lbnRWYXJpYWJsZXNXaXRoQ2FjaGUgfSBmcm9tICcuLi8uLi9lbnYuanMnO1xuaW1wb3J0IHR5cGUgeyBBcmd1bWVudHNUeXBlLCBUYXJnZXRDYXRlZ29yeSwgVGFyZ2V0RGV0YWlsIH0gZnJvbSAnLi4vLi4vdHlwZXMuanMnO1xuaW1wb3J0IHsgYWxsVGFyZ2V0Q2F0ZWdvcmllcyB9IGZyb20gJy4uLy4uL3R5cGVzLmpzJztcbmltcG9ydCB7IGdldE5hbWVzcGFjZUFuZE5hbWUsIHJlYWRQYWNrYWdlSnNvbiB9IGZyb20gJy4uLy4uL3V0aWxzLmpzJztcblxuaW1wb3J0IHR5cGUgeyBBbnlCdWlsZGVyVHlwZSwgYnVpbGRlciB9IGZyb20gJy4vYnVpbGRlci5qcyc7XG5pbXBvcnQgeyBhcHBCdWlsZGVyLCBmdW5jdGlvbnNCdWlsZGVyLCBsaWJCdWlsZGVyIH0gZnJvbSAnLi9idWlsZGVyLmpzJztcbmltcG9ydCB7IGhhbmRsZUVycm9yIH0gZnJvbSAnLi9idW5kbGVyTG9nZ2VyLmpzJztcbmltcG9ydCB7IGNyZWF0ZUV4dGVybmFsTWF0Y2hlciwgc2V0dXBQbHVnaW5zIH0gZnJvbSAnLi9wbHVnaW4uanMnO1xuaW1wb3J0IHsgZ2VuZXJhdGVEZWNsYXJhdGlvbkZpbGVzIH0gZnJvbSAnLi90eXBlU2NyaXB0LmpzJztcblxuZXhwb3J0IGNvbnN0IGFwcDogQ29tbWFuZE1vZHVsZTx1bmtub3duLCBBcmd1bWVudHNUeXBlPHR5cGVvZiBhcHBCdWlsZGVyPj4gPSB7XG4gIGNvbW1hbmQ6ICdhcHAgW3BhY2thZ2VdJyxcbiAgZGVzY3JpYmU6ICdCdWlsZCBhbiBhcHAnLFxuICBidWlsZGVyOiBhcHBCdWlsZGVyLFxuICBhc3luYyBoYW5kbGVyKGFyZ3YpIHtcbiAgICByZXR1cm4gYnVpbGQoYXJndiwgJ2FwcCcpO1xuICB9LFxufTtcblxuZXhwb3J0IGNvbnN0IGZ1bmN0aW9uczogQ29tbWFuZE1vZHVsZTx1bmtub3duLCBBcmd1bWVudHNUeXBlPHR5cGVvZiBmdW5jdGlvbnNCdWlsZGVyPj4gPSB7XG4gIGNvbW1hbmQ6ICdmdW5jdGlvbnMgW3BhY2thZ2VdJyxcbiAgZGVzY3JpYmU6ICdCdWlsZCBhIEdDUC9GaXJlYmFzZSBmdW5jdGlvbnMgYXBwJyxcbiAgYnVpbGRlcjogZnVuY3Rpb25zQnVpbGRlcixcbiAgYXN5bmMgaGFuZGxlcihhcmd2KSB7XG4gICAgaWYgKGFyZ3Yub25seVBhY2thZ2VKc29uKSB7XG4gICAgICBjb25zdCBwYWNrYWdlRGlyUGF0aCA9IHBhdGgucmVzb2x2ZShhcmd2LnBhY2thZ2U/LnRvU3RyaW5nKCkgPz8gJy4nKTtcbiAgICAgIGNvbnN0IFtwYWNrYWdlSnNvbiwgcGFja2FnZUpzb25QYXRoXSA9IGF3YWl0IHJlYWRQYWNrYWdlSnNvbihwYWNrYWdlRGlyUGF0aCk7XG4gICAgICBpZiAoIXBhY2thZ2VKc29uKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoYEZhaWxlZCB0byBwYXJzZSBwYWNrYWdlLmpzb24gKCR7cGFja2FnZUpzb25QYXRofSkuYCk7XG4gICAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICAgIH1cbiAgICAgIGF3YWl0IGdlbmVyYXRlUGFja2FnZUpzb25Gb3JGdW5jdGlvbnMocGFja2FnZURpclBhdGgsIHBhY2thZ2VKc29uLCBhcmd2Lm1vZHVsZVR5cGUpO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gYnVpbGQoYXJndiwgJ2Z1bmN0aW9ucycpO1xuICAgIH1cbiAgfSxcbn07XG5cbmV4cG9ydCBjb25zdCBsaWI6IENvbW1hbmRNb2R1bGU8dW5rbm93biwgQXJndW1lbnRzVHlwZTx0eXBlb2YgbGliQnVpbGRlcj4+ID0ge1xuICBjb21tYW5kOiAnbGliIFtwYWNrYWdlXScsXG4gIGRlc2NyaWJlOiAnQnVpbGQgYSBOb2RlLmpzIC8gUmVhY3QgbGlicmFyeScsXG4gIGJ1aWxkZXI6IGxpYkJ1aWxkZXIsXG4gIGFzeW5jIGhhbmRsZXIoYXJndikge1xuICAgIHJldHVybiBidWlsZChhcmd2LCAnbGliJyk7XG4gIH0sXG59O1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gYnVpbGQoYXJndjogQXJndW1lbnRzVHlwZTxBbnlCdWlsZGVyVHlwZT4sIHRhcmdldENhdGVnb3J5OiBUYXJnZXRDYXRlZ29yeSk6IFByb21pc2U8dm9pZD4ge1xuICBwcm9jZXNzLmVudi5OT0RFX0VOViB8fD0gJ3Byb2R1Y3Rpb24nO1xuXG4gIC8vIGBzaWxlbnRgIGlzIHN0cm9uZ2VyIHRoYW4gYHZlcmJvc2VgLlxuICBjb25zdCB2ZXJib3NlID0gIWFyZ3Yuc2lsZW50ICYmIGFyZ3YudmVyYm9zZTtcbiAgY29uc3QgY3dkID0gcHJvY2Vzcy5jd2QoKTtcblxuICBjb25zdCBwYWNrYWdlRGlyUGF0aCA9IHBhdGgucmVzb2x2ZShhcmd2LnBhY2thZ2U/LnRvU3RyaW5nKCkgPz8gJy4nKTtcbiAgY29uc3QgW3BhY2thZ2VKc29uLCBwYWNrYWdlSnNvblBhdGhdID0gYXdhaXQgcmVhZFBhY2thZ2VKc29uKHBhY2thZ2VEaXJQYXRoKTtcbiAgaWYgKCFwYWNrYWdlSnNvbikge1xuICAgIGNvbnNvbGUuZXJyb3IoYEZhaWxlZCB0byBwYXJzZSBwYWNrYWdlLmpzb24gKCR7cGFja2FnZUpzb25QYXRofSkuYCk7XG4gICAgcHJvY2Vzcy5leGl0KDEpO1xuICB9XG5cbiAgbG9hZEVudmlyb25tZW50VmFyaWFibGVzV2l0aENhY2hlKGFyZ3YsIHBhY2thZ2VEaXJQYXRoKTtcblxuICBjb25zdCBpbnB1dHMgPSB2ZXJpZnlJbnB1dChhcmd2LCBjd2QsIHBhY2thZ2VEaXJQYXRoKTtcbiAgY29uc3QgdGFyZ2V0RGV0YWlsID0gZGV0ZWN0VGFyZ2V0RGV0YWlsKHRhcmdldENhdGVnb3J5LCBpbnB1dHMsIHBhY2thZ2VEaXJQYXRoKTtcblxuICBpZiAodmVyYm9zZSkge1xuICAgIGNvbnNvbGUuaW5mbygnYXJndjonLCBhcmd2KTtcbiAgICBjb25zb2xlLmluZm8oJ3BhY2thZ2VKc29uUGF0aDonLCBwYWNrYWdlSnNvblBhdGgpO1xuICAgIGNvbnNvbGUuaW5mbygnVGFyZ2V0IChDYXRlZ29yeSk6JywgYCR7dGFyZ2V0RGV0YWlsfSAoJHt0YXJnZXRDYXRlZ29yeX0pYCk7XG4gIH1cblxuICBjb25zdCBbbmFtZXNwYWNlXSA9IGdldE5hbWVzcGFjZUFuZE5hbWUocGFja2FnZUpzb24pO1xuICBjb25zdCBpc0VzbVBhY2thZ2UgPSBwYWNrYWdlSnNvbi50eXBlID09PSAnbW9kdWxlJztcblxuICBpZiAoYXJndlsnY29yZS1qcyddKSB7XG4gICAgcHJvY2Vzcy5lbnYuQlVJTERfVFNfQ09SRUpTID0gJzEnO1xuICB9IGVsc2UgaWYgKGFyZ3ZbJ2NvcmUtanMtcHJvcG9zYWxzJ10pIHtcbiAgICBwcm9jZXNzLmVudi5CVUlMRF9UU19DT1JFSlNfV0lUSF9QUk9QT1NBTFMgPSAnMSc7XG4gIH1cblxuICBpZiAodmVyYm9zZSkge1xuICAgIHByb2Nlc3MuZW52LkJVSUxEX1RTX1ZFUkJPU0UgPSAnMSc7XG4gIH1cbiAgcHJvY2Vzcy5lbnYuQlVJTERfVFNfVEFSR0VUX0NBVEVHT1JZID0gdGFyZ2V0Q2F0ZWdvcnk7XG4gIHByb2Nlc3MuZW52LkJVSUxEX1RTX1RBUkdFVF9ERVRBSUwgPSB0YXJnZXREZXRhaWw7XG5cbiAgY29uc3Qgb3V0cHV0T3B0aW9uc0xpc3QgPSBnZXRPdXRwdXRPcHRpb25zTGlzdChhcmd2LCB0YXJnZXREZXRhaWwsIHBhY2thZ2VEaXJQYXRoLCBpc0VzbVBhY2thZ2UpO1xuICBpZiAodmVyYm9zZSkge1xuICAgIGNvbnNvbGUuaW5mbygnT3V0cHV0T3B0aW9uczonLCBvdXRwdXRPcHRpb25zTGlzdCk7XG4gIH1cbiAgaWYgKG91dHB1dE9wdGlvbnNMaXN0Lmxlbmd0aCA9PT0gMCkge1xuICAgIGNvbnNvbGUuZXJyb3IoJ0ZhaWxlZCB0byBkZXRlY3Qgb3V0cHV0IGZpbGVzLicpO1xuICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgfVxuXG4gIHByb2Nlc3MuY2hkaXIocGFja2FnZURpclBhdGgpO1xuICBhd2FpdCBmcy5wcm9taXNlcy5ybShwYXRoLmpvaW4ocGFja2FnZURpclBhdGgsICdkaXN0JyksIHsgcmVjdXJzaXZlOiB0cnVlLCBmb3JjZTogdHJ1ZSB9KTtcbiAgaWYgKHRhcmdldERldGFpbCA9PT0gJ2Z1bmN0aW9ucycpIHtcbiAgICBhd2FpdCBnZW5lcmF0ZVBhY2thZ2VKc29uRm9yRnVuY3Rpb25zKHBhY2thZ2VEaXJQYXRoLCBwYWNrYWdlSnNvbiwgYXJndi5tb2R1bGVUeXBlKTtcbiAgfVxuXG4gIGNvbnN0IG9wdGlvbnM6IFJvbGxkb3duT3B0aW9ucyA9IHtcbiAgICBjaGVja3M6IHsgcHJlZmVyQnVpbHRpbkZlYXR1cmU6IGZhbHNlIH0sXG4gICAgZXh0ZXJuYWw6IGNyZWF0ZUV4dGVybmFsTWF0Y2hlcihhcmd2LCB0YXJnZXREZXRhaWwsIHBhY2thZ2VKc29uLCBuYW1lc3BhY2UpLFxuICAgIGlucHV0OlxuICAgICAgdGFyZ2V0RGV0YWlsID09PSAnZnVuY3Rpb25zJ1xuICAgICAgICA/IE9iamVjdC5mcm9tRW50cmllcyhcbiAgICAgICAgICAgIGlucHV0cy5tYXAoKGlucHV0LCBpbmRleCkgPT4gW2luZGV4ID09PSAwID8gJ2luZGV4JyA6IHBhdGguYmFzZW5hbWUoaW5wdXQsIHBhdGguZXh0bmFtZShpbnB1dCkpLCBpbnB1dF0pXG4gICAgICAgICAgKVxuICAgICAgICA6IGlucHV0cyxcbiAgICBwbHVnaW5zOiBzZXR1cFBsdWdpbnMoYXJndiwgb3V0cHV0T3B0aW9uc0xpc3QsIHBhY2thZ2VEaXJQYXRoKSxcbiAgICByZXNvbHZlOiB7XG4gICAgICBleHRlbnNpb25BbGlhczoge1xuICAgICAgICAnLmNqcyc6IFsnLmNqcycsICcuY3RzJ10sXG4gICAgICAgICcuanMnOiBbJy5qcycsICcudHMnLCAnLnRzeCddLFxuICAgICAgICAnLm1qcyc6IFsnLm1qcycsICcubXRzJ10sXG4gICAgICB9LFxuICAgICAgZXh0ZW5zaW9uczogWycuY3RzJywgJy5tdHMnLCAnLnRzJywgJy50c3gnLCAnLmNqcycsICcubWpzJywgJy5qcycsICcuanN4JywgJy5qc29uJ10sXG4gICAgfSxcbiAgICB0cmVlc2hha2U6IGFyZ3ZbJ2NvcmUtanMnXSB8fCBhcmd2Wydjb3JlLWpzLXByb3Bvc2FscyddID8gZmFsc2UgOiB1bmRlZmluZWQsXG4gICAgdHJhbnNmb3JtOiBnZXRUcmFuc2Zvcm1PcHRpb25zKGFyZ3YsIHBhY2thZ2VEaXJQYXRoKSxcbiAgICB3YXRjaDogYXJndi53YXRjaCA/IHsgY2xlYXJTY3JlZW46IGZhbHNlIH0gOiB1bmRlZmluZWQsXG4gIH07XG5cbiAgY29uc3QgcGF0aFRvUmVsYXRpdmVQYXRoID0gKHBhdGhzOiBzdHJpbmcgfCBSZWFkb25seTxzdHJpbmdbXT4pOiBzdHJpbmdbXSA9PlxuICAgIChBcnJheS5pc0FycmF5KHBhdGhzKSA/IHBhdGhzIDogW3BhdGhzXSkubWFwKChwKSA9PiBwYXRoLnJlbGF0aXZlKHBhY2thZ2VEaXJQYXRoLCBwKSk7XG4gIGlmIChhcmd2LndhdGNoKSB7XG4gICAgd2F0Y2hSb2xsZG93bihhcmd2LCB0YXJnZXREZXRhaWwsIHBhY2thZ2VEaXJQYXRoLCBvcHRpb25zLCBvdXRwdXRPcHRpb25zTGlzdCwgcGF0aFRvUmVsYXRpdmVQYXRoKTtcbiAgfSBlbHNlIHtcbiAgICBpZiAoIWFyZ3Yuc2lsZW50KSB7XG4gICAgICBjb25zb2xlLmluZm8oXG4gICAgICAgIGNoYWxrLmN5YW4oXG4gICAgICAgICAgYEJ1bmRsZXMgJHtjaGFsay5ib2xkKHBhdGhUb1JlbGF0aXZlUGF0aChpbnB1dHMpLmpvaW4oJywgJykpfSDihpIgJHtjaGFsay5ib2xkKFxuICAgICAgICAgICAgcGF0aFRvUmVsYXRpdmVQYXRoKG91dHB1dE9wdGlvbnNMaXN0Lm1hcCgob3B0cykgPT4gb3B0cy5maWxlIHx8IG9wdHMuZGlyIHx8ICcnKSkuam9pbignLCAnKVxuICAgICAgICAgICl9XFxub24gJHtwYWNrYWdlRGlyUGF0aH0gLi4uYFxuICAgICAgICApXG4gICAgICApO1xuICAgIH1cblxuICAgIGxldCBidW5kbGU6IFJvbGxkb3duQnVpbGQgfCB1bmRlZmluZWQ7XG4gICAgbGV0IGJ1aWxkRmFpbGVkID0gZmFsc2U7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHN0YXJ0VGltZSA9IERhdGUubm93KCk7XG4gICAgICBjb25zdCBfYnVuZGxlID0gYXdhaXQgcm9sbGRvd24ob3B0aW9ucyk7XG4gICAgICBidW5kbGUgPSBfYnVuZGxlO1xuICAgICAgYXdhaXQgUHJvbWlzZS5hbGwob3V0cHV0T3B0aW9uc0xpc3QubWFwKChvcHRzKSA9PiBfYnVuZGxlLndyaXRlKG9wdHMpKSk7XG5cbiAgICAgIGlmICghYXJndi5zaWxlbnQpIHtcbiAgICAgICAgY29uc29sZS5pbmZvKFxuICAgICAgICAgIGNoYWxrLmdyZWVuKFxuICAgICAgICAgICAgYENyZWF0ZWQgJHtwYXRoVG9SZWxhdGl2ZVBhdGgob3V0cHV0T3B0aW9uc0xpc3QubWFwKChvcHRzKSA9PiBvcHRzLmZpbGUgfHwgb3B0cy5kaXIgfHwgJycpKS5qb2luKFxuICAgICAgICAgICAgICAnLCAnXG4gICAgICAgICAgICApfSBpbiAke2NoYWxrLmJvbGQobXMoRGF0ZS5ub3coKSAtIHN0YXJ0VGltZSkpfWBcbiAgICAgICAgICApXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGJ1aWxkRmFpbGVkID0gdHJ1ZTtcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ0ZhaWxlZCB0byBidWlsZCBkdWUgdG86JywgZXJyb3IpO1xuICAgIH1cbiAgICBhd2FpdCBidW5kbGU/LmNsb3NlKCk7XG4gICAgaWYgKGJ1aWxkRmFpbGVkKSBwcm9jZXNzLmV4aXQoMSk7XG5cbiAgICBpZiAoXG4gICAgICB0YXJnZXREZXRhaWwgIT09ICdhcHAtbm9kZScgJiZcbiAgICAgIHRhcmdldERldGFpbCAhPT0gJ2Z1bmN0aW9ucycgJiZcbiAgICAgICEoYXdhaXQgZ2VuZXJhdGVEZWNsYXJhdGlvbkZpbGVzKGFyZ3YsIHBhY2thZ2VEaXJQYXRoKSlcbiAgICApIHtcbiAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gZ2V0VHJhbnNmb3JtT3B0aW9ucyhhcmd2OiBBcmd1bWVudHNUeXBlPEFueUJ1aWxkZXJUeXBlPiwgcGFja2FnZURpclBhdGg6IHN0cmluZyk6IFJvbGxkb3duT3B0aW9uc1sndHJhbnNmb3JtJ10ge1xuICByZXR1cm4ge1xuICAgIGRlZmluZTogY3JlYXRlRW52aXJvbm1lbnRWYXJpYWJsZXNEZWZpbml0aW9uKGFyZ3YsIHBhY2thZ2VEaXJQYXRoKSxcbiAgICBqc3g6ICdyZWFjdC1qc3gnLFxuICAgIHRhcmdldDogJ2VzMjAyMicsXG4gIH07XG59XG5cbmZ1bmN0aW9uIHdhdGNoUm9sbGRvd24oXG4gIGFyZ3Y6IEFyZ3VtZW50c1R5cGU8QW55QnVpbGRlclR5cGU+LFxuICB0YXJnZXREZXRhaWw6IHN0cmluZyxcbiAgcGFja2FnZURpclBhdGg6IHN0cmluZyxcbiAgb3B0aW9uczogUm9sbGRvd25PcHRpb25zLFxuICBvdXRwdXRPcHRpb25zTGlzdDogT3V0cHV0T3B0aW9uc1tdLFxuICBwYXRoVG9SZWxhdGl2ZVBhdGg6IChwYXRoczogc3RyaW5nIHwgUmVhZG9ubHk8c3RyaW5nW10+KSA9PiBzdHJpbmdbXVxuKTogdm9pZCB7XG4gIGNvbnN0IHdhdGNoZXIgPSB3YXRjaCh7IC4uLm9wdGlvbnMsIG91dHB1dDogb3V0cHV0T3B0aW9uc0xpc3QgfSk7XG5cbiAgY29uc3QgY2xvc2UgPSBhc3luYyAoY29kZTogbnVtYmVyIHwgbnVsbCB8IHVuZGVmaW5lZCk6IFByb21pc2U8dm9pZD4gPT4ge1xuICAgIHByb2Nlc3MucmVtb3ZlTGlzdGVuZXIoJ3VuY2F1Z2h0RXhjZXB0aW9uJywgY2xvc2UpO1xuICAgIHByb2Nlc3Muc3RkaW4ucmVtb3ZlTGlzdGVuZXIoJ2VuZCcsIGNsb3NlKTtcbiAgICBpZiAod2F0Y2hlcikgYXdhaXQgd2F0Y2hlci5jbG9zZSgpO1xuICAgIGlmIChjb2RlKSBwcm9jZXNzLmV4aXQoY29kZSk7XG4gIH07XG4gIG9uRXhpdChjbG9zZSBhcyB1bmtub3duIGFzIEhhbmRsZXIpO1xuICBwcm9jZXNzLm9uKCd1bmNhdWdodEV4Y2VwdGlvbicsIGNsb3NlKTtcbiAgaWYgKCFwcm9jZXNzLnN0ZGluLmlzVFRZKSB7XG4gICAgcHJvY2Vzcy5zdGRpbi5vbignZW5kJywgY2xvc2UpO1xuICAgIHByb2Nlc3Muc3RkaW4ucmVzdW1lKCk7XG4gIH1cblxuICB3YXRjaGVyLm9uKCdldmVudCcsIGFzeW5jIChldmVudCkgPT4ge1xuICAgIHN3aXRjaCAoZXZlbnQuY29kZSkge1xuICAgICAgY2FzZSAnRVJST1InOiB7XG4gICAgICAgIGhhbmRsZUVycm9yKGV2ZW50LmVycm9yLCB0cnVlKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBjYXNlICdCVU5ETEVfU1RBUlQnOiB7XG4gICAgICAgIGlmIChhcmd2LnNpbGVudCkgYnJlYWs7XG5cbiAgICAgICAgY29uc29sZS5pbmZvKFxuICAgICAgICAgIGNoYWxrLmN5YW4oXG4gICAgICAgICAgICBgQnVuZGxlcyAke2NoYWxrLmJvbGQocGF0aFRvUmVsYXRpdmVQYXRoKGdldElucHV0RmlsZXMob3B0aW9ucy5pbnB1dCkpLmpvaW4oJywgJykpfSDihpIgJHtjaGFsay5ib2xkKFxuICAgICAgICAgICAgICBwYXRoVG9SZWxhdGl2ZVBhdGgob3V0cHV0T3B0aW9uc0xpc3QubWFwKChvcHRzKSA9PiBvcHRzLmZpbGUgfHwgb3B0cy5kaXIgfHwgJycpKS5qb2luKCcsICcpXG4gICAgICAgICAgICApfVxcbm9uICR7cGFja2FnZURpclBhdGh9IC4uLmBcbiAgICAgICAgICApXG4gICAgICAgICk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgY2FzZSAnQlVORExFX0VORCc6IHtcbiAgICAgICAgaWYgKGFyZ3Yuc2lsZW50KSBicmVhaztcblxuICAgICAgICBjb25zb2xlLmluZm8oXG4gICAgICAgICAgY2hhbGsuZ3JlZW4oXG4gICAgICAgICAgICBgQ3JlYXRlZCAke2NoYWxrLmJvbGQocGF0aFRvUmVsYXRpdmVQYXRoKGV2ZW50Lm91dHB1dCkuam9pbignLCAnKSl9IGluICR7Y2hhbGsuYm9sZChtcyhldmVudC5kdXJhdGlvbikpfWBcbiAgICAgICAgICApXG4gICAgICAgICk7XG5cbiAgICAgICAgaWYgKHRhcmdldERldGFpbCAhPT0gJ2FwcC1ub2RlJyAmJiB0YXJnZXREZXRhaWwgIT09ICdmdW5jdGlvbnMnKSB7XG4gICAgICAgICAgYXdhaXQgZ2VuZXJhdGVEZWNsYXJhdGlvbkZpbGVzKGFyZ3YsIHBhY2thZ2VEaXJQYXRoKTtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGNhc2UgJ0VORCc6IHtcbiAgICAgICAgaWYgKGFyZ3Yuc2lsZW50KSBicmVhaztcblxuICAgICAgICBjb25zb2xlLmluZm8oYFxcblske2RhdGVUaW1lKCl9XSB3YWl0aW5nIGZvciBjaGFuZ2VzLi4uYCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmICgncmVzdWx0JyBpbiBldmVudCAmJiBldmVudC5yZXN1bHQpIHtcbiAgICAgIHZvaWQgZXZlbnQucmVzdWx0LmNsb3NlKCk7XG4gICAgfVxuICB9KTtcbn1cblxuZnVuY3Rpb24gZ2V0SW5wdXRGaWxlcyhpbnB1dDogUm9sbGRvd25PcHRpb25zWydpbnB1dCddKTogc3RyaW5nW10ge1xuICBpZiAoIWlucHV0KSByZXR1cm4gW107XG4gIGlmICh0eXBlb2YgaW5wdXQgPT09ICdzdHJpbmcnKSByZXR1cm4gW2lucHV0XTtcbiAgcmV0dXJuIEFycmF5LmlzQXJyYXkoaW5wdXQpID8gaW5wdXQgOiBPYmplY3QudmFsdWVzKGlucHV0KTtcbn1cblxuZnVuY3Rpb24gdmVyaWZ5SW5wdXQoYXJndjogQXJndW1lbnRzVHlwZTx0eXBlb2YgYnVpbGRlcj4sIGN3ZDogc3RyaW5nLCBwYWNrYWdlRGlyUGF0aDogc3RyaW5nKTogc3RyaW5nW10ge1xuICBpZiAoYXJndi5pbnB1dCAmJiBhcmd2LmlucHV0Lmxlbmd0aCA+IDApIHJldHVybiBhcmd2LmlucHV0Lm1hcCgocCkgPT4gcGF0aC5yZXNvbHZlKGN3ZCwgcC50b1N0cmluZygpKSk7XG5cbiAgY29uc3Qgc3JjRGlyUGF0aCA9IHBhdGguam9pbihwYWNrYWdlRGlyUGF0aCwgJ3NyYycpO1xuICBmb3IgKGNvbnN0IGV4dCBvZiBbJ3RzJywgJ3RzeCcsICdjdHMnLCAnbXRzJ10pIHtcbiAgICBjb25zdCBpbnB1dCA9IHBhdGguam9pbihzcmNEaXJQYXRoLCBgaW5kZXguJHtleHR9YCk7XG4gICAgaWYgKGZzLmV4aXN0c1N5bmMoaW5wdXQpKSByZXR1cm4gW2lucHV0XTtcbiAgfVxuXG4gIGNvbnNvbGUuZXJyb3IoJ0ZhaWxlZCB0byBkZXRlY3QgaW5wdXQgZmlsZS4nKTtcbiAgcHJvY2Vzcy5leGl0KDEpO1xufVxuXG5mdW5jdGlvbiBkZXRlY3RUYXJnZXREZXRhaWwodGFyZ2V0Q2F0ZWdvcnk6IHN0cmluZywgaW5wdXRzOiBzdHJpbmdbXSwgcGFja2FnZURpclBhdGg6IHN0cmluZyk6IFRhcmdldERldGFpbCB7XG4gIHN3aXRjaCAodGFyZ2V0Q2F0ZWdvcnkpIHtcbiAgICBjYXNlICdhcHAnOiB7XG4gICAgICByZXR1cm4gJ2FwcC1ub2RlJztcbiAgICB9XG4gICAgY2FzZSAnZnVuY3Rpb25zJzoge1xuICAgICAgcmV0dXJuICdmdW5jdGlvbnMnO1xuICAgIH1cbiAgICBjYXNlICdsaWInOiB7XG4gICAgICBpZiAoaW5wdXRzLnNvbWUoKGlucHV0KSA9PiBpbnB1dC5lbmRzV2l0aCgnLnRzeCcpKSB8fCBkb2VzU3JjQ29udGFpblRzeChwYWNrYWdlRGlyUGF0aCkpIHtcbiAgICAgICAgcmV0dXJuICdsaWItcmVhY3QnO1xuICAgICAgfVxuICAgICAgcmV0dXJuICdsaWInO1xuICAgIH1cbiAgICBkZWZhdWx0OiB7XG4gICAgICBjb25zb2xlLmVycm9yKCd0YXJnZXQgb3B0aW9uIG11c3QgYmUgb25lIG9mOiAnICsgYWxsVGFyZ2V0Q2F0ZWdvcmllcy5qb2luKCcsICcpKTtcbiAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gZG9lc1NyY0NvbnRhaW5Uc3gocGFja2FnZURpclBhdGg6IHN0cmluZyk6IGJvb2xlYW4ge1xuICBjb25zdCBzcmNEaXJQYXRoID0gcGF0aC5qb2luKHBhY2thZ2VEaXJQYXRoLCAnc3JjJyk7XG4gIHJldHVybiBkb2VzRGlyZWN0b3J5Q29udGFpblRzeChzcmNEaXJQYXRoKTtcbn1cblxuZnVuY3Rpb24gZG9lc0RpcmVjdG9yeUNvbnRhaW5Uc3goZGlyUGF0aDogc3RyaW5nKTogYm9vbGVhbiB7XG4gIHRyeSB7XG4gICAgY29uc3QgZW50cmllcyA9IGZzLnJlYWRkaXJTeW5jKGRpclBhdGgsIHsgd2l0aEZpbGVUeXBlczogdHJ1ZSB9KTtcbiAgICByZXR1cm4gZW50cmllcy5zb21lKChlbnRyeSkgPT4ge1xuICAgICAgY29uc3QgZW50cnlQYXRoID0gcGF0aC5qb2luKGRpclBhdGgsIGVudHJ5Lm5hbWUpO1xuICAgICAgaWYgKGVudHJ5LmlzRGlyZWN0b3J5KCkpIHJldHVybiBkb2VzRGlyZWN0b3J5Q29udGFpblRzeChlbnRyeVBhdGgpO1xuICAgICAgcmV0dXJuIGVudHJ5LmlzRmlsZSgpICYmIGVudHJ5Lm5hbWUuZW5kc1dpdGgoJy50c3gnKTtcbiAgICB9KTtcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlUGFja2FnZUpzb25Gb3JGdW5jdGlvbnMoXG4gIHBhY2thZ2VEaXJQYXRoOiBzdHJpbmcsXG4gIHBhY2thZ2VKc29uOiBQYWNrYWdlSnNvbixcbiAgbW9kdWxlVHlwZTogc3RyaW5nIHwgdW5kZWZpbmVkXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgcGFja2FnZUpzb24ubmFtZSArPSAnLWRpc3QnO1xuICBjb25zdCBlc21QYWNrYWdlID0gcGFja2FnZUpzb24udHlwZSA9PT0gJ21vZHVsZSc7XG4gIGNvbnN0IGVzbU91dHB1dCA9IGlzRXNtT3V0cHV0KGVzbVBhY2thZ2UsIG1vZHVsZVR5cGUpO1xuICBwYWNrYWdlSnNvbi5tYWluID0gZXNtUGFja2FnZSA9PT0gZXNtT3V0cHV0ID8gJ2luZGV4LmpzJyA6IGVzbU91dHB1dCA/ICdpbmRleC5tanMnIDogJ2luZGV4LmNqcyc7XG5cbiAgLy8gUHJldmVudCBGaXJlYmFzZSBGdW5jdGlvbnMgZnJvbSBydW5uaW5nIGBidWlsZGAgc2NyaXB0IHNpbmNlIHdlIGFyZSBidWlsZGluZyBjb2RlIGJlZm9yZSBkZXBsb3lpbmcuXG4gIGRlbGV0ZSBwYWNrYWdlSnNvbi5zY3JpcHRzO1xuICAvLyBkZXZEZXBlbmRlbmNpZXMgYXJlIG5vdCByZXF1aXJlZCBzaW5jZSB3ZSBhcmUgYnVpbGRpbmcgY29kZSBiZWZvcmUgZGVwbG95aW5nLlxuICBkZWxldGUgcGFja2FnZUpzb24uZGV2RGVwZW5kZW5jaWVzO1xuXG4gIGF3YWl0IGZzLnByb21pc2VzLm1rZGlyKHBhdGguam9pbihwYWNrYWdlRGlyUGF0aCwgJ2Rpc3QnKSwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gIGF3YWl0IGZzLnByb21pc2VzLndyaXRlRmlsZShwYXRoLmpvaW4ocGFja2FnZURpclBhdGgsICdkaXN0JywgJ3BhY2thZ2UuanNvbicpLCBKU09OLnN0cmluZ2lmeShwYWNrYWdlSnNvbikpO1xufVxuXG5mdW5jdGlvbiBnZXRPdXRwdXRPcHRpb25zTGlzdChcbiAgYXJndjogQXJndW1lbnRzVHlwZTxBbnlCdWlsZGVyVHlwZT4sXG4gIHRhcmdldERldGFpbDogVGFyZ2V0RGV0YWlsLFxuICBwYWNrYWdlRGlyUGF0aDogc3RyaW5nLFxuICBpc0VzbVBhY2thZ2U6IGJvb2xlYW5cbik6IE91dHB1dE9wdGlvbnNbXSB7XG4gIGNvbnN0IG91dERpclBhdGggPSBwYXRoLmpvaW4ocGFja2FnZURpclBhdGgsICdkaXN0Jyk7XG4gIGlmICh0YXJnZXREZXRhaWwgPT09ICdhcHAtbm9kZScgfHwgdGFyZ2V0RGV0YWlsID09PSAnZnVuY3Rpb25zJykge1xuICAgIGNvbnN0IGVzbU91dHB1dCA9IGlzRXNtT3V0cHV0KGlzRXNtUGFja2FnZSwgYXJndi5tb2R1bGVUeXBlKTtcbiAgICByZXR1cm4gW1xuICAgICAge1xuICAgICAgICBkaXI6IG91dERpclBhdGgsXG4gICAgICAgIGZvcm1hdDogZXNtT3V0cHV0ID8gJ21vZHVsZScgOiAnY29tbW9uanMnLFxuICAgICAgICBtaW5pZnk6IGZhbHNlLFxuICAgICAgICBzb3VyY2VtYXA6IGFyZ3Yuc291cmNlbWFwICYmICdpbmxpbmUnLFxuICAgICAgICBzdHJpY3Q6ICFlc21PdXRwdXQsXG4gICAgICB9LFxuICAgIF07XG4gIH1cblxuICAvLyBUaGUgZm9sbG93aW5nIGltcG9ydCBzdGF0ZW1lbnQgaW4gYW4gZXNtIG1vZHVsZSBjYXVzZXMgdGhlIGZvbGxvd2luZyBlcnJvcjpcbiAgLy8gU3RhdGVtZW50OlxuICAvLyAgIGltcG9ydCB7IHVzZVByZXZpb3VzIH0gZnJvbSAncmVhY3QtdXNlJztcbiAgLy8gRXJyb3I6XG4gIC8vICAgTmFtZWQgZXhwb3J0ICd1c2VQcmV2aW91cycgbm90IGZvdW5kLiBUaGUgcmVxdWVzdGVkIG1vZHVsZSAncmVhY3QtdXNlJyBpcyBhIENvbW1vbkpTIG1vZHVsZSxcbiAgLy8gICB3aGljaCBtYXkgbm90IHN1cHBvcnQgYWxsIG1vZHVsZS5leHBvcnRzIGFzIG5hbWVkIGV4cG9ydHMuXG4gIC8vIFdlIG5lZWQgY2pzIG1vZHVsZXMgZm9yIHdlYiBhcHBzIHRvIGF2b2lkIHRoZSBlcnJvci5cbiAgLy8gQWxzbywgc3BsaXR0aW5nIGEgbGlicmFyeSBpcyB1c2VmdWwgaW4gYm90aCBtb2R1bGVzLCBzbyBwcmVzZXJ2ZU1vZHVsZXMgc2hvdWxkIGJlIHRydWUuXG4gIGNvbnN0IG91dHB1dE9wdGlvbnNMaXN0OiBPdXRwdXRPcHRpb25zW10gPSBbXTtcbiAgY29uc3QgbW9kdWxlVHlwZSA9IGFyZ3YubW9kdWxlVHlwZSB8fCAnYm90aCc7XG4gIGNvbnN0IGpzRXh0ID0gYXJndi5qc0V4dGVuc2lvbiB8fCAnZWl0aGVyJztcbiAgaWYgKG1vZHVsZVR5cGUgPT09ICdjanMnIHx8IG1vZHVsZVR5cGUgPT09ICdib3RoJyB8fCAobW9kdWxlVHlwZSA9PT0gJ2VpdGhlcicgJiYgIWlzRXNtUGFja2FnZSkpIHtcbiAgICBvdXRwdXRPcHRpb25zTGlzdC5wdXNoKHtcbiAgICAgIGRpcjogb3V0RGlyUGF0aCxcbiAgICAgIGVudHJ5RmlsZU5hbWVzOiBqc0V4dCA9PT0gJ2JvdGgnIHx8IChqc0V4dCA9PT0gJ2VpdGhlcicgJiYgIWlzRXNtUGFja2FnZSkgPyAnW25hbWVdLmpzJyA6ICdbbmFtZV0uY2pzJyxcbiAgICAgIGZvcm1hdDogJ2NvbW1vbmpzJyxcbiAgICAgIG1pbmlmeTogYXJndi5taW5pZnksXG4gICAgICBwcmVzZXJ2ZU1vZHVsZXM6IHRydWUsXG4gICAgICBwcmVzZXJ2ZU1vZHVsZXNSb290OiBwYXRoLmpvaW4ocGFja2FnZURpclBhdGgsICdzcmMnKSxcbiAgICAgIHNvdXJjZW1hcDogYXJndi5zb3VyY2VtYXAsXG4gICAgICBzdHJpY3Q6IHRydWUsXG4gICAgfSk7XG4gIH1cbiAgaWYgKG1vZHVsZVR5cGUgPT09ICdlc20nIHx8IG1vZHVsZVR5cGUgPT09ICdib3RoJyB8fCAobW9kdWxlVHlwZSA9PT0gJ2VpdGhlcicgJiYgaXNFc21QYWNrYWdlKSkge1xuICAgIG91dHB1dE9wdGlvbnNMaXN0LnB1c2goe1xuICAgICAgZGlyOiBvdXREaXJQYXRoLFxuICAgICAgZW50cnlGaWxlTmFtZXM6IGpzRXh0ID09PSAnYm90aCcgfHwgKGpzRXh0ID09PSAnZWl0aGVyJyAmJiBpc0VzbVBhY2thZ2UpID8gJ1tuYW1lXS5qcycgOiAnW25hbWVdLm1qcycsXG4gICAgICBmb3JtYXQ6ICdtb2R1bGUnLFxuICAgICAgbWluaWZ5OiBhcmd2Lm1pbmlmeSxcbiAgICAgIHByZXNlcnZlTW9kdWxlczogdHJ1ZSxcbiAgICAgIHByZXNlcnZlTW9kdWxlc1Jvb3Q6IHBhdGguam9pbihwYWNrYWdlRGlyUGF0aCwgJ3NyYycpLFxuICAgICAgc291cmNlbWFwOiBhcmd2LnNvdXJjZW1hcCxcbiAgICB9KTtcbiAgfVxuICByZXR1cm4gb3V0cHV0T3B0aW9uc0xpc3Q7XG59XG5cbmZ1bmN0aW9uIGlzRXNtT3V0cHV0KGlzRXNtUGFja2FnZTogYm9vbGVhbiwgbW9kdWxlVHlwZTogc3RyaW5nIHwgdW5kZWZpbmVkKTogYm9vbGVhbiB7XG4gIHJldHVybiBtb2R1bGVUeXBlID09PSAnZXNtJyB8fCAoKCFtb2R1bGVUeXBlIHx8IG1vZHVsZVR5cGUgPT09ICdlaXRoZXInKSAmJiBpc0VzbVBhY2thZ2UpO1xufVxuIiwiaW1wb3J0ICogYXMgY2hpbGRfcHJvY2VzcyBmcm9tICdub2RlOmNoaWxkX3Byb2Nlc3MnO1xuXG5pbXBvcnQgdHlwZSB7IENvbW1hbmRNb2R1bGUsIEluZmVycmVkT3B0aW9uVHlwZXMgfSBmcm9tICd5YXJncyc7XG5cbmltcG9ydCB7IGxvYWRFbnZpcm9ubWVudFZhcmlhYmxlc1dpdGhDYWNoZSB9IGZyb20gJy4uL2Vudi5qcyc7XG5pbXBvcnQgeyBzaGFyZWRPcHRpb25zQnVpbGRlciB9IGZyb20gJy4uL3NoYXJlZE9wdGlvbnNCdWlsZGVyLmpzJztcblxuY29uc3QgYnVpbGRlciA9IHtcbiAgLi4uc2hhcmVkT3B0aW9uc0J1aWxkZXIsXG4gIG1vZHVsZToge1xuICAgIGRlc2NyaXB0aW9uOiAnQSBtb2R1bGUgdHlwZTogY2pzIG9yIGVzbScsXG4gICAgdHlwZTogJ3N0cmluZycsXG4gICAgYWxpYXM6ICdtJyxcbiAgfSxcbiAgd2F0Y2g6IHtcbiAgICBkZXNjcmlwdGlvbjogJ1doZXRoZXIgd2F0Y2ggbW9kZSBpcyBlbmFibGVkIG9yIG5vdCcsXG4gICAgdHlwZTogJ2Jvb2xlYW4nLFxuICAgIGFsaWFzOiAndycsXG4gIH0sXG59IGFzIGNvbnN0O1xuXG5leHBvcnQgY29uc3QgcnVuOiBDb21tYW5kTW9kdWxlPHVua25vd24sIEluZmVycmVkT3B0aW9uVHlwZXM8dHlwZW9mIGJ1aWxkZXI+PiA9IHtcbiAgY29tbWFuZDogJ3J1biA8ZmlsZT4nLFxuICBkZXNjcmliZTogJ1J1biBzY3JpcHQnLFxuICBidWlsZGVyLFxuICBoYW5kbGVyKGFyZ3YpIHtcbiAgICBsb2FkRW52aXJvbm1lbnRWYXJpYWJsZXNXaXRoQ2FjaGUoYXJndiwgcHJvY2Vzcy5jd2QoKSk7XG5cbiAgICBjb25zdCBmaWxlID0gYXJndi5maWxlPy50b1N0cmluZygpID8/ICcnO1xuXG4gICAgLy8gY2YuIGh0dHBzOi8vYnVuLnNoL2d1aWRlcy91dGlsL2RldGVjdC1idW5cbiAgICBjb25zdCBpc1J1bm5pbmdPbkJ1biA9IHByb2Nlc3MudmVyc2lvbnMuYnVuO1xuICAgIGNvbnN0IHJ1bnRpbWUgPSBpc1J1bm5pbmdPbkJ1biA/ICdidW4nIDogJ25vZGUnO1xuICAgIGNvbnN0IGFyZ3MgPSBpc1J1bm5pbmdPbkJ1biA/IFsnLS1idW4nXSA6IFsnLS1uby13YXJuaW5ncycsICctLWltcG9ydCcsICd0c3gnXTtcbiAgICBpZiAoYXJndi53YXRjaCkge1xuICAgICAgYXJncy5wdXNoKCctLXdhdGNoJyk7XG4gICAgfVxuICAgIGFyZ3MucHVzaChmaWxlKTtcbiAgICBjb25zdCBbLCAuLi5hZGRpdGlvbmFsQXJndW1lbnRzXSA9IGFyZ3YuXztcbiAgICBjb25zdCBydW50aW1lQXJncyA9IFsuLi5hcmdzLCAuLi5hZGRpdGlvbmFsQXJndW1lbnRzLm1hcCgoYXJnKSA9PiBhcmcudG9TdHJpbmcoKSldO1xuICAgIGlmIChhcmd2LnZlcmJvc2UpIHtcbiAgICAgIGNvbnNvbGUuaW5mbyhgUnVubmluZyAnJHtydW50aW1lfSAke3J1bnRpbWVBcmdzLmpvaW4oJyAnKX0nYCk7XG4gICAgfVxuICAgIGNvbnN0IHJldCA9IGNoaWxkX3Byb2Nlc3Muc3Bhd25TeW5jKHJ1bnRpbWUsIHJ1bnRpbWVBcmdzLCB7XG4gICAgICBzdGRpbzogJ2luaGVyaXQnLFxuICAgICAgZW52OiB7IC4uLnByb2Nlc3MuZW52IH0sXG4gICAgfSk7XG4gICAgcHJvY2Vzcy5leGl0KHJldC5zdGF0dXMgPz8gMSk7XG4gIH0sXG59O1xuIiwiaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHsgcmVtb3ZlTnBtQW5kWWFybkVudmlyb25tZW50VmFyaWFibGVzIH0gZnJvbSAnQHdpbGxib29zdGVyL3NoYXJlZC1saWItbm9kZSc7XG5pbXBvcnQgeWFyZ3MgZnJvbSAneWFyZ3MnO1xuaW1wb3J0IHsgaGlkZUJpbiB9IGZyb20gJ3lhcmdzL2hlbHBlcnMnO1xuXG5pbXBvcnQgeyBhcHAsIGZ1bmN0aW9ucywgbGliIH0gZnJvbSAnLi9jb21tYW5kcy9idWlsZC9idWlsZC5qcyc7XG5pbXBvcnQgeyBydW4gfSBmcm9tICcuL2NvbW1hbmRzL3J1bi5qcyc7XG5pbXBvcnQgeyBzaGFyZWRPcHRpb25zQnVpbGRlciB9IGZyb20gJy4vc2hhcmVkT3B0aW9uc0J1aWxkZXIuanMnO1xuXG5yZW1vdmVOcG1BbmRZYXJuRW52aXJvbm1lbnRWYXJpYWJsZXMocHJvY2Vzcy5lbnYpO1xuXG5hd2FpdCB5YXJncyhoaWRlQmluKHByb2Nlc3MuYXJndikpXG4gIC5zY3JpcHROYW1lKCdidWlsZC10cycpXG4gIC5vcHRpb25zKHNoYXJlZE9wdGlvbnNCdWlsZGVyKVxuICAuY29tbWFuZChhcHApXG4gIC5jb21tYW5kKGZ1bmN0aW9ucylcbiAgLmNvbW1hbmQobGliKVxuICAuY29tbWFuZChydW4pXG4gIC5kZW1hbmRDb21tYW5kKClcbiAgLnN0cmljdCgpXG4gIC52ZXJzaW9uKGdldFZlcnNpb24oKSlcbiAgLmhlbHAoKS5hcmd2O1xuXG5mdW5jdGlvbiBnZXRWZXJzaW9uKCk6IHN0cmluZyB7XG4gIGxldCBwYWNrYWdlSnNvbkRpciA9IHBhdGguZGlybmFtZShuZXcgVVJMKGltcG9ydC5tZXRhLnVybCkucGF0aG5hbWUpO1xuICB3aGlsZSAoIWZzLmV4aXN0c1N5bmMocGF0aC5qb2luKHBhY2thZ2VKc29uRGlyLCAncGFja2FnZS5qc29uJykpKSB7XG4gICAgcGFja2FnZUpzb25EaXIgPSBwYXRoLmRpcm5hbWUocGFja2FnZUpzb25EaXIpO1xuICB9XG4gIGNvbnN0IHBhY2thZ2VKc29uID0gSlNPTi5wYXJzZShmcy5yZWFkRmlsZVN5bmMocGF0aC5qb2luKHBhY2thZ2VKc29uRGlyLCAncGFja2FnZS5qc29uJyksICd1dGY4JykpIGFzIHtcbiAgICB2ZXJzaW9uOiBzdHJpbmc7XG4gIH07XG4gIHJldHVybiBwYWNrYWdlSnNvbi52ZXJzaW9uO1xufVxuIl0sIm1hcHBpbmdzIjoiOHFCQU1BLElBQUksRUFLSixTQUFnQixF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
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "build-ts",
|
|
3
|
-
"version": "17.1.
|
|
3
|
+
"version": "17.1.30",
|
|
4
4
|
"repository": {
|
|
5
5
|
"type": "git",
|
|
6
6
|
"url": "git+https://github.com/WillBooster/build-ts.git"
|
|
@@ -30,37 +30,25 @@
|
|
|
30
30
|
"verify-full": "wb verify --full"
|
|
31
31
|
},
|
|
32
32
|
"dependencies": {
|
|
33
|
-
"@babel/core": "
|
|
34
|
-
"@babel/plugin-proposal-decorators": "
|
|
35
|
-
"@babel/plugin-
|
|
36
|
-
"@babel/
|
|
37
|
-
"@babel/
|
|
38
|
-
"@babel/preset-
|
|
39
|
-
"@
|
|
40
|
-
"@babel/preset-typescript": "7.29.7",
|
|
41
|
-
"@rollup/plugin-babel": "7.1.0",
|
|
42
|
-
"@rollup/plugin-commonjs": "29.0.3",
|
|
43
|
-
"@rollup/plugin-json": "6.1.0",
|
|
44
|
-
"@rollup/plugin-node-resolve": "16.0.3",
|
|
45
|
-
"@rollup/plugin-replace": "6.0.3",
|
|
46
|
-
"@rollup/plugin-terser": "1.0.0",
|
|
47
|
-
"@rollup/pluginutils": "5.4.0",
|
|
48
|
-
"@typescript/native-preview": "7.0.0-dev.20260622.1",
|
|
33
|
+
"@babel/core": "8.0.1",
|
|
34
|
+
"@babel/plugin-proposal-decorators": "8.0.2",
|
|
35
|
+
"@babel/plugin-transform-explicit-resource-management": "8.0.1",
|
|
36
|
+
"@babel/preset-env": "8.0.2",
|
|
37
|
+
"@babel/preset-react": "8.0.1",
|
|
38
|
+
"@babel/preset-typescript": "8.0.1",
|
|
39
|
+
"@typescript/native-preview": "7.0.0-dev.20260620.1",
|
|
49
40
|
"@willbooster/shared-lib-node": "8.5.23",
|
|
50
|
-
"babel-plugin-polyfill-corejs3": "0.
|
|
51
|
-
"babel-plugin-transform-remove-console": "6.9.4",
|
|
41
|
+
"babel-plugin-polyfill-corejs3": "1.0.0",
|
|
52
42
|
"chalk": "5.6.2",
|
|
53
43
|
"core-js": "3.49.0",
|
|
54
44
|
"core-js-pure": "3.49.0",
|
|
55
45
|
"date-time": "4.0.0",
|
|
46
|
+
"magic-string": "0.30.21",
|
|
47
|
+
"oxc-parser": "0.137.0",
|
|
56
48
|
"pretty-ms": "9.3.0",
|
|
57
|
-
"
|
|
58
|
-
"rollup-plugin-analyzer": "4.0.0",
|
|
59
|
-
"rollup-plugin-keep-import": "1.0.3",
|
|
60
|
-
"rollup-plugin-node-externals": "9.0.1",
|
|
61
|
-
"rollup-plugin-preserve-directives": "0.4.0",
|
|
62
|
-
"rollup-plugin-string": "3.0.0",
|
|
49
|
+
"rolldown": "1.1.2",
|
|
63
50
|
"signal-exit": "4.1.0",
|
|
51
|
+
"terser": "5.48.0",
|
|
64
52
|
"tsx": "4.22.4",
|
|
65
53
|
"yargs": "18.0.0"
|
|
66
54
|
},
|
|
@@ -68,16 +56,13 @@
|
|
|
68
56
|
"@tsconfig/node-lts": "24.0.0",
|
|
69
57
|
"@tsconfig/node-ts": "23.6.4",
|
|
70
58
|
"@types/babel__core": "7.20.5",
|
|
71
|
-
"@types/
|
|
72
|
-
"@types/babel__preset-env": "7.10.0",
|
|
73
|
-
"@types/node": "25.9.4",
|
|
59
|
+
"@types/node": "26.0.1",
|
|
74
60
|
"@types/signal-exit": "4.0.0",
|
|
75
61
|
"@types/yargs": "17.0.35",
|
|
76
|
-
"@willbooster/babel-configs": "2.5.1",
|
|
77
62
|
"@willbooster/oxfmt-config": "1.2.2",
|
|
78
63
|
"@willbooster/oxlint-config": "1.4.8",
|
|
79
64
|
"@willbooster/wb": "13.22.18",
|
|
80
|
-
"build-ts": "17.1.
|
|
65
|
+
"build-ts": "17.1.29",
|
|
81
66
|
"conventional-changelog-conventionalcommits": "9.3.1",
|
|
82
67
|
"lefthook": "2.1.9",
|
|
83
68
|
"oxfmt": "0.56.0",
|