projen 0.100.4 → 0.100.6
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/.jsii +58 -58
- package/lib/ai-instructions.js +2 -2
- package/lib/awscdk/auto-discover.js +6 -6
- package/lib/awscdk/awscdk-app-java.js +1 -1
- package/lib/awscdk/awscdk-app-py.js +1 -1
- package/lib/awscdk/awscdk-app-ts.js +38 -23
- package/lib/awscdk/awscdk-construct.js +1 -1
- package/lib/awscdk/awscdk-deps-java.js +1 -1
- package/lib/awscdk/awscdk-deps-js.js +1 -1
- package/lib/awscdk/awscdk-deps-py.js +1 -1
- package/lib/awscdk/awscdk-deps.js +1 -1
- package/lib/awscdk/cdk-config.js +3 -3
- package/lib/awscdk/cdk-tasks.js +1 -1
- package/lib/awscdk/integration-test.js +1 -1
- package/lib/awscdk/lambda-extension.js +1 -1
- package/lib/awscdk/lambda-function.js +2 -2
- package/lib/build/build-workflow.js +1 -1
- package/lib/cdk/auto-discover-base.js +2 -2
- package/lib/cdk/construct-lib.js +1 -1
- package/lib/cdk/integration-test-base.js +1 -1
- package/lib/cdk/jsii-build.js +1 -1
- package/lib/cdk/jsii-docgen.js +1 -1
- package/lib/cdk/jsii-project.js +1 -1
- package/lib/cdk8s/auto-discover.js +2 -2
- package/lib/cdk8s/cdk8s-app-py.js +1 -1
- package/lib/cdk8s/cdk8s-app-ts.js +1 -1
- package/lib/cdk8s/cdk8s-construct.js +1 -1
- package/lib/cdk8s/cdk8s-deps-py.js +1 -1
- package/lib/cdk8s/cdk8s-deps.js +1 -1
- package/lib/cdk8s/integration-test.js +1 -1
- package/lib/cdktf/cdktf-construct.js +1 -1
- package/lib/circleci/circleci.js +1 -1
- package/lib/cli/cmds/new.js +28 -21
- package/lib/cli/macros.js +5 -4
- package/lib/cli/task-runtime.js +8 -13
- package/lib/cli/util.d.ts +4 -4
- package/lib/cli/util.js +19 -10
- package/lib/component.js +1 -1
- package/lib/dependencies.js +1 -1
- package/lib/dev-env.js +1 -1
- package/lib/docker-compose/docker-compose-service.js +1 -1
- package/lib/docker-compose/docker-compose.js +1 -1
- package/lib/file.js +1 -1
- package/lib/gitattributes.js +1 -1
- package/lib/github/actions-provider.js +1 -1
- package/lib/github/auto-approve.js +1 -1
- package/lib/github/auto-merge.js +1 -1
- package/lib/github/auto-queue.js +1 -1
- package/lib/github/dependabot.js +1 -1
- package/lib/github/dependency-review.js +1 -1
- package/lib/github/github-credentials.js +1 -1
- package/lib/github/github-project.js +1 -1
- package/lib/github/github.js +1 -1
- package/lib/github/merge-queue.js +1 -1
- package/lib/github/mergify.js +1 -1
- package/lib/github/pr-template.js +1 -1
- package/lib/github/pull-request-backport.js +1 -1
- package/lib/github/pull-request-lint.js +1 -1
- package/lib/github/stale.js +1 -1
- package/lib/github/task-workflow-job.js +1 -1
- package/lib/github/task-workflow.js +1 -1
- package/lib/github/workflow-actions.js +1 -1
- package/lib/github/workflow-jobs.js +1 -1
- package/lib/github/workflow-steps.js +1 -1
- package/lib/github/workflows.js +1 -1
- package/lib/gitlab/configuration.js +1 -1
- package/lib/gitlab/gitlab-configuration.js +1 -1
- package/lib/gitlab/nested-configuration.js +1 -1
- package/lib/gitpod.js +1 -1
- package/lib/ignore-file.js +1 -1
- package/lib/ini.js +1 -1
- package/lib/java/java-project.js +1 -1
- package/lib/java/junit.js +1 -1
- package/lib/java/maven-compile.js +1 -1
- package/lib/java/maven-packaging.js +1 -1
- package/lib/java/maven-sample.js +1 -1
- package/lib/java/pom.js +2 -2
- package/lib/java/projenrc.js +1 -1
- package/lib/javascript/biome/biome.js +1 -1
- package/lib/javascript/bundler.js +1 -1
- package/lib/javascript/eslint.js +1 -1
- package/lib/javascript/jest.js +4 -4
- package/lib/javascript/license-checker.js +1 -1
- package/lib/javascript/node-package.js +1 -1
- package/lib/javascript/node-project.js +1 -1
- package/lib/javascript/npm-config.js +1 -1
- package/lib/javascript/prettier.js +1 -1
- package/lib/javascript/projenrc.js +1 -1
- package/lib/javascript/typescript-config.js +2 -2
- package/lib/javascript/upgrade-dependencies.js +2 -2
- package/lib/javascript/yarnrc.js +1 -1
- package/lib/json-patch.js +1 -1
- package/lib/json.js +1 -1
- package/lib/license.js +1 -1
- package/lib/logger.js +1 -1
- package/lib/makefile.js +1 -1
- package/lib/object-file.js +1 -1
- package/lib/project-build.js +1 -1
- package/lib/project-tree.js +1 -1
- package/lib/project.js +1 -1
- package/lib/projects.js +1 -1
- package/lib/projenrc-json.js +1 -1
- package/lib/projenrc.js +1 -1
- package/lib/python/pip.js +1 -1
- package/lib/python/poetry.js +10 -7
- package/lib/python/projenrc.js +1 -1
- package/lib/python/pyproject-toml-file.js +1 -1
- package/lib/python/pytest-sample.js +1 -1
- package/lib/python/pytest.js +1 -1
- package/lib/python/python-project.js +1 -1
- package/lib/python/python-sample.js +1 -1
- package/lib/python/requirements-file.js +1 -1
- package/lib/python/setuppy.js +1 -1
- package/lib/python/setuptools.js +1 -1
- package/lib/python/uv.d.ts +3 -3
- package/lib/python/uv.js +6 -6
- package/lib/python/venv.js +4 -4
- package/lib/readme.js +1 -1
- package/lib/release/bump-version.js +16 -19
- package/lib/release/commit-tag-version.d.ts +2 -1
- package/lib/release/commit-tag-version.js +23 -17
- package/lib/release/publisher.js +1 -1
- package/lib/release/release-trigger.js +1 -1
- package/lib/release/release.js +1 -1
- package/lib/release/tag-version.js +3 -3
- package/lib/release/update-changelog.js +4 -2
- package/lib/renovatebot.js +1 -1
- package/lib/run-task.cjs +162 -20
- package/lib/sample-file.js +2 -2
- package/lib/source-code.js +1 -1
- package/lib/task-runner.js +16 -10
- package/lib/task.js +1 -1
- package/lib/tasks.js +1 -1
- package/lib/testing.js +1 -1
- package/lib/textfile.js +1 -1
- package/lib/toml.js +1 -1
- package/lib/typescript/projenrc-ts.js +1 -1
- package/lib/typescript/projenrc.js +1 -1
- package/lib/typescript/typescript-typedoc.js +1 -1
- package/lib/typescript/typescript.js +5 -5
- package/lib/util/exec.d.ts +183 -0
- package/lib/util/exec.js +238 -0
- package/lib/util/fs.d.ts +12 -0
- package/lib/util/fs.js +33 -0
- package/lib/util.d.ts +0 -22
- package/lib/util.js +1 -57
- package/lib/version.js +2 -2
- package/lib/vscode/devcontainer.js +1 -1
- package/lib/vscode/extensions.js +1 -1
- package/lib/vscode/launch-config.js +1 -1
- package/lib/vscode/settings.js +1 -1
- package/lib/vscode/vscode.js +1 -1
- package/lib/web/next.js +3 -3
- package/lib/web/postcss.js +1 -1
- package/lib/web/react.js +3 -3
- package/lib/web/tailwind.js +1 -1
- package/lib/xmlfile.js +1 -1
- package/lib/yaml.js +1 -1
- package/package.json +1 -1
package/lib/util/exec.js
ADDED
|
@@ -0,0 +1,238 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
+
exports.rawShell = exports.npx = exports.npm = exports.node = exports.poetry = exports.uv = exports.git = void 0;
|
|
37
|
+
exports.tool = tool;
|
|
38
|
+
const child_process = __importStar(require("child_process"));
|
|
39
|
+
const dax_1 = require("dax");
|
|
40
|
+
const logging = __importStar(require("../logging"));
|
|
41
|
+
const MAX_BUFFER = 10 * 1024 * 1024;
|
|
42
|
+
function spawnOpts(options) {
|
|
43
|
+
return {
|
|
44
|
+
maxBuffer: MAX_BUFFER,
|
|
45
|
+
cwd: options.cwd,
|
|
46
|
+
env: options.env ? { ...process.env, ...options.env } : undefined,
|
|
47
|
+
// run the program directly, without going through a shell
|
|
48
|
+
shell: false,
|
|
49
|
+
};
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Runs a program with the given arguments, inheriting stdout. Throws if the
|
|
53
|
+
* command exits with a non-zero status.
|
|
54
|
+
*/
|
|
55
|
+
function run(file, args, options) {
|
|
56
|
+
logging.debug(`${file} ${args.join(" ")} (cwd: ${options.cwd})`);
|
|
57
|
+
child_process.execFileSync(file, args, {
|
|
58
|
+
...spawnOpts(options),
|
|
59
|
+
// By default the child's stdout is redirected to STDERR (to keep the
|
|
60
|
+
// parent's STDOUT clean) and its STDERR is piped so it surfaces in
|
|
61
|
+
// exceptions. `inheritStdio` instead streams both straight to the parent.
|
|
62
|
+
stdio: options.inheritStdio ? "inherit" : ["inherit", 2, "pipe"],
|
|
63
|
+
});
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* Runs a program and returns its trimmed STDOUT. Throws if the command exits
|
|
67
|
+
* with a non-zero status.
|
|
68
|
+
*/
|
|
69
|
+
function capture(file, args, options) {
|
|
70
|
+
logging.debug(`${file} ${args.join(" ")} (cwd: ${options.cwd})`);
|
|
71
|
+
return child_process
|
|
72
|
+
.execFileSync(file, args, {
|
|
73
|
+
...spawnOpts(options),
|
|
74
|
+
stdio: ["inherit", "pipe", "pipe"], // "pipe" for STDERR means it appears in exceptions
|
|
75
|
+
})
|
|
76
|
+
.toString("utf-8")
|
|
77
|
+
.trim();
|
|
78
|
+
}
|
|
79
|
+
/**
|
|
80
|
+
* Runs a program and returns its trimmed STDOUT, or `undefined` if the command
|
|
81
|
+
* failed or produced no output.
|
|
82
|
+
*/
|
|
83
|
+
function tryCapture(file, args, options) {
|
|
84
|
+
logging.debug(`${file} ${args.join(" ")} (cwd: ${options.cwd})`);
|
|
85
|
+
try {
|
|
86
|
+
const value = child_process
|
|
87
|
+
.execFileSync(file, args, {
|
|
88
|
+
...spawnOpts(options),
|
|
89
|
+
stdio: ["inherit", "pipe", "pipe"], // "pipe" for STDERR means it appears in exceptions
|
|
90
|
+
})
|
|
91
|
+
.toString("utf-8")
|
|
92
|
+
.trim();
|
|
93
|
+
// an empty string is the same as undefined
|
|
94
|
+
return value || undefined;
|
|
95
|
+
}
|
|
96
|
+
catch {
|
|
97
|
+
return undefined;
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
/**
|
|
101
|
+
* Creates a shell-free {@link Tool} for the given program.
|
|
102
|
+
*
|
|
103
|
+
* @example const git = tool("git"); git.run(["tag", "--delete", tag], { cwd });
|
|
104
|
+
*/
|
|
105
|
+
function tool(file) {
|
|
106
|
+
return {
|
|
107
|
+
run: (args, options) => run(file, args, options),
|
|
108
|
+
capture: (args, options) => capture(file, args, options),
|
|
109
|
+
tryCapture: (args, options) => tryCapture(file, args, options),
|
|
110
|
+
};
|
|
111
|
+
}
|
|
112
|
+
/**
|
|
113
|
+
* Shell-free helper for invoking `git`.
|
|
114
|
+
*
|
|
115
|
+
* @example git.run(["tag", "--delete", tag], { cwd });
|
|
116
|
+
*/
|
|
117
|
+
exports.git = tool("git");
|
|
118
|
+
/**
|
|
119
|
+
* Shell-free helper for invoking `uv` (ships as a native binary on all
|
|
120
|
+
* platforms).
|
|
121
|
+
*/
|
|
122
|
+
exports.uv = tool("uv");
|
|
123
|
+
/**
|
|
124
|
+
* Shell-free helper for invoking `poetry`.
|
|
125
|
+
*/
|
|
126
|
+
exports.poetry = tool("poetry");
|
|
127
|
+
/**
|
|
128
|
+
* Shell-free helper for invoking the current Node.js executable
|
|
129
|
+
* (`process.execPath`).
|
|
130
|
+
*/
|
|
131
|
+
exports.node = tool(process.execPath);
|
|
132
|
+
/**
|
|
133
|
+
* Creates an {@link AsyncTool} that invokes `file` via dax, resolving Windows
|
|
134
|
+
* `.cmd`/`.bat` shims and escaping every argument (so each value is passed as
|
|
135
|
+
* a single literal argument).
|
|
136
|
+
*
|
|
137
|
+
* @example await npx.run(["commit-and-tag-version@^12"], { cwd });
|
|
138
|
+
*/
|
|
139
|
+
function shimTool(file) {
|
|
140
|
+
const build = (args, options) => {
|
|
141
|
+
const cmd = (0, dax_1.$) `${file} ${args}`.cwd(options.cwd).stderr("piped").noThrow();
|
|
142
|
+
return options.env ? cmd.env(options.env) : cmd;
|
|
143
|
+
};
|
|
144
|
+
const ensureOk = (args, result) => {
|
|
145
|
+
if (result.code !== 0) {
|
|
146
|
+
// Mimic the `child_process` error shape (`status`, `stderr`) so callers
|
|
147
|
+
// can inspect stderr (e.g. to detect ENOENT/E404 from npm).
|
|
148
|
+
const error = new Error(`Command failed (exit code ${result.code}): ${file} ${args.join(" ")}`);
|
|
149
|
+
error.status = result.code;
|
|
150
|
+
error.stderr = Buffer.from(result.stderr);
|
|
151
|
+
throw error;
|
|
152
|
+
}
|
|
153
|
+
};
|
|
154
|
+
return {
|
|
155
|
+
run: async (args, options) => {
|
|
156
|
+
logging.debug(`${file} ${args.join(" ")} (cwd: ${options.cwd})`);
|
|
157
|
+
ensureOk(args, await build(args, options));
|
|
158
|
+
},
|
|
159
|
+
capture: async (args, options) => {
|
|
160
|
+
logging.debug(`${file} ${args.join(" ")} (cwd: ${options.cwd})`);
|
|
161
|
+
const result = await build(args, options).stdout("piped");
|
|
162
|
+
ensureOk(args, result);
|
|
163
|
+
return result.stdout.trim();
|
|
164
|
+
},
|
|
165
|
+
};
|
|
166
|
+
}
|
|
167
|
+
/**
|
|
168
|
+
* Cross-platform helper for `npm` (a Windows `.cmd` shim).
|
|
169
|
+
*/
|
|
170
|
+
exports.npm = shimTool("npm");
|
|
171
|
+
/**
|
|
172
|
+
* Cross-platform helper for `npx` (a Windows `.cmd` shim).
|
|
173
|
+
*/
|
|
174
|
+
exports.npx = shimTool("npx");
|
|
175
|
+
exports.rawShell = {
|
|
176
|
+
/**
|
|
177
|
+
* Runs a command line through the system shell and returns a normalized
|
|
178
|
+
* result. Never throws for a non-zero exit (that is reported via `status`);
|
|
179
|
+
* a spawn failure is reported via `error`.
|
|
180
|
+
*
|
|
181
|
+
* The caller is responsible for supplying the full `env`.
|
|
182
|
+
*/
|
|
183
|
+
exec(command, options) {
|
|
184
|
+
logging.debug(`${command} (cwd: ${options.cwd})`);
|
|
185
|
+
const result = child_process.spawnSync(command, {
|
|
186
|
+
cwd: options.cwd,
|
|
187
|
+
shell: true,
|
|
188
|
+
maxBuffer: MAX_BUFFER,
|
|
189
|
+
env: options.env,
|
|
190
|
+
// "pipe" for STDERR (when capturing) means it appears in exceptions.
|
|
191
|
+
stdio: options.capture ? ["inherit", "pipe", "pipe"] : "inherit",
|
|
192
|
+
});
|
|
193
|
+
return {
|
|
194
|
+
status: result.status,
|
|
195
|
+
stdout: result.stdout ?? null,
|
|
196
|
+
stderr: result.stderr ?? null,
|
|
197
|
+
error: result.error,
|
|
198
|
+
};
|
|
199
|
+
},
|
|
200
|
+
/**
|
|
201
|
+
* Runs a user-supplied shell command line and resolves its trimmed STDOUT.
|
|
202
|
+
* Rejects if the command exits non-zero.
|
|
203
|
+
*/
|
|
204
|
+
capture: async (command, options) => {
|
|
205
|
+
const result = exports.rawShell.exec(command, {
|
|
206
|
+
cwd: options.cwd,
|
|
207
|
+
env: { ...process.env, ...options.env },
|
|
208
|
+
capture: true,
|
|
209
|
+
});
|
|
210
|
+
if (result.error) {
|
|
211
|
+
throw result.error;
|
|
212
|
+
}
|
|
213
|
+
if (result.status !== 0) {
|
|
214
|
+
const error = new Error(`Command failed (exit code ${result.status}): ${command}`);
|
|
215
|
+
error.status = result.status;
|
|
216
|
+
error.stderr = result.stderr;
|
|
217
|
+
throw error;
|
|
218
|
+
}
|
|
219
|
+
return (result.stdout?.toString("utf-8") ?? "").trim();
|
|
220
|
+
},
|
|
221
|
+
/**
|
|
222
|
+
* Runs a user-supplied shell command line and resolves its trimmed STDOUT,
|
|
223
|
+
* or `undefined` if the command failed or produced no output.
|
|
224
|
+
*/
|
|
225
|
+
tryCapture: async (command, options) => {
|
|
226
|
+
const result = exports.rawShell.exec(command, {
|
|
227
|
+
cwd: options.cwd,
|
|
228
|
+
env: { ...process.env, ...options.env },
|
|
229
|
+
capture: true,
|
|
230
|
+
});
|
|
231
|
+
if (result.error || result.status !== 0) {
|
|
232
|
+
return undefined;
|
|
233
|
+
}
|
|
234
|
+
const out = (result.stdout?.toString("utf-8") ?? "").trim();
|
|
235
|
+
return out || undefined;
|
|
236
|
+
},
|
|
237
|
+
};
|
|
238
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXhlYy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy91dGlsL2V4ZWMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBK0pBLG9CQU1DO0FBcktELDZEQUErQztBQUMvQyw2QkFBd0I7QUFDeEIsb0RBQXNDO0FBRXRDLE1BQU0sVUFBVSxHQUFHLEVBQUUsR0FBRyxJQUFJLEdBQUcsSUFBSSxDQUFDO0FBZ0RwQyxTQUFTLFNBQVMsQ0FBQyxPQUF3QjtJQUN6QyxPQUFPO1FBQ0wsU0FBUyxFQUFFLFVBQVU7UUFDckIsR0FBRyxFQUFFLE9BQU8sQ0FBQyxHQUFHO1FBQ2hCLEdBQUcsRUFBRSxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEdBQUcsT0FBTyxDQUFDLEdBQUcsRUFBRSxHQUFHLE9BQU8sQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsU0FBUztRQUNqRSwwREFBMEQ7UUFDMUQsS0FBSyxFQUFFLEtBQWM7S0FDdEIsQ0FBQztBQUNKLENBQUM7QUFFRDs7O0dBR0c7QUFDSCxTQUFTLEdBQUcsQ0FBQyxJQUFZLEVBQUUsSUFBYyxFQUFFLE9BQW1CO0lBQzVELE9BQU8sQ0FBQyxLQUFLLENBQUMsR0FBRyxJQUFJLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsVUFBVSxPQUFPLENBQUMsR0FBRyxHQUFHLENBQUMsQ0FBQztJQUVqRSxhQUFhLENBQUMsWUFBWSxDQUFDLElBQUksRUFBRSxJQUFJLEVBQUU7UUFDckMsR0FBRyxTQUFTLENBQUMsT0FBTyxDQUFDO1FBQ3JCLHFFQUFxRTtRQUNyRSxtRUFBbUU7UUFDbkUsMEVBQTBFO1FBQzFFLEtBQUssRUFBRSxPQUFPLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxFQUFFLENBQUMsRUFBRSxNQUFNLENBQUM7S0FDakUsQ0FB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QUNILElBQUksTUFBTSxDQUFDLEtBQUssSUFBSSxNQUFNLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRSxDQUFDO1lBQ3hDLE9BQU8sU0FBUyxDQUFDO1FBQ25CLENBQUM7UUFDRCxNQUFNLEdBQUcsR0FBRyxDQUFDLE1BQU0sQ0FBQyxNQUFNLEVBQUUsUUFBUSxDQUFDLE9BQU8sQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDO1FBQzVELE9BQU8sR0FBRyxJQUFJLFNBQVMsQ0FBQztJQUMxQixDQUFDO0NBQ0YsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAqIGFzIGNoaWxkX3Byb2Nlc3MgZnJvbSBcImNoaWxkX3Byb2Nlc3NcIjtcbmltcG9ydCB7ICQgfSBmcm9tIFwiZGF4XCI7XG5pbXBvcnQgKiBhcyBsb2dnaW5nIGZyb20gXCIuLi9sb2dnaW5nXCI7XG5cbmNvbnN0IE1BWF9CVUZGRVIgPSAxMCAqIDEwMjQgKiAxMDI0O1xuXG4vL1xuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBTaGVsbC1mcmVlIGV4ZWN1dGlvbiAoZXhlY0ZpbGVTeW5jLCBzaGVsbDogZmFsc2UpLlxuLy9cbi8vIFRoZSBwcm9ncmFtIGFuZCBlYWNoIGFyZ3VtZW50IGFyZSBwYXNzZWQgdG8gdGhlIE9TIGRpcmVjdGx5IHdpdGhvdXQgZ29pbmdcbi8vIHRocm91Z2ggYSBzaGVsbCwgc28gdGhlcmUgaXMgbm8gcXVvdGluZyB0byBnZXQgcmlnaHQgYW5kIG5vIGRpZmZlcmVuY2VzXG4vLyBiZXR3ZWVuIHBsYXRmb3JtIHNoZWxscyB0byBhY2NvdW50IGZvciB3aGVuIGNvbW1hbmRzIGluY2x1ZGUgdmFsdWVzIGRlcml2ZWRcbi8vIGZyb20gZmlsZXMsIGdpdCBvdXRwdXQsIGNvbmZpZ3VyYXRpb24sIGV0Yy5cbi8vXG4vLyBPbmx5IHBlci10b29sIGhlbHBlcnMgYXJlIGV4cG9ydGVkIChlLmcuIGBnaXRgKTsgdGhlIGdlbmVyaWMgcHJpbWl0aXZlcyBhcmVcbi8vIGtlcHQgcHJpdmF0ZSBzbyBjYWxsIHNpdGVzIGFyZSBleHBsaWNpdCBhYm91dCB3aGljaCB0b29sIHRoZXkgaW52b2tlLlxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vL1xuXG4vKipcbiAqIE9wdGlvbnMgZm9yIHNoZWxsLWZyZWUgY29tbWFuZCBleGVjdXRpb24uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRXhlY0ZpbGVPcHRpb25zIHtcbiAgLyoqXG4gICAqIFdvcmtpbmcgZGlyZWN0b3J5IGZvciB0aGUgY29tbWFuZC5cbiAgICovXG4gIHJlYWRvbmx5IGN3ZDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBBZGRpdGlvbmFsIGVudmlyb25tZW50IHZhcmlhYmxlcywgbWVyZ2VkIG9uIHRvcCBvZiBgcHJvY2Vzcy5lbnZgLlxuICAgKi9cbiAgcmVhZG9ubHkgZW52PzogUmVjb3JkPHN0cmluZywgc3RyaW5nPjtcbn1cblxuLyoqXG4gKiBPcHRpb25zIGZvciB7QGxpbmsgVG9vbC5ydW59LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFJ1bk9wdGlvbnMgZXh0ZW5kcyBFeGVjRmlsZU9wdGlvbnMge1xuICAvKipcbiAgICogU3RyZWFtIHRoZSBjaGlsZCdzIHN0ZG91dCBhbmQgc3RkZXJyIHN0cmFpZ2h0IHRvIHRoZSBwYXJlbnQncyBzdGRvdXQgYW5kXG4gICAqIHN0ZGVyciAoZnVsbCBpbmhlcml0YW5jZSksIGluc3RlYWQgb2YgcmVkaXJlY3Rpbmcgc3Rkb3V0IHRvIHN0ZGVyciBhbmRcbiAgICogY2FwdHVyaW5nIHN0ZGVyciAodGhlIGRlZmF1bHQpLlxuICAgKlxuICAgKiBVc2UgdGhpcyB3aGVuIGxhdW5jaGluZyBhIGNoaWxkIHByb2Nlc3Mgd2hvc2Ugc3Rkb3V0IGlzIG1lYW5pbmdmdWwgYW5kXG4gICAqIHdob3NlIG91dHB1dCBzaG91bGQgc3RyZWFtIGxpdmUgdG8gdGhlIHVzZXIgKGUuZy4gdGhlIHByb2plbiBDTEkpLlxuICAgKlxuICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgKi9cbiAgcmVhZG9ubHkgaW5oZXJpdFN0ZGlvPzogYm9vbGVhbjtcbn1cblxuZnVuY3Rpb24gc3Bhd25PcHRzKG9wdGlvbnM6IEV4ZWNGaWxlT3B0aW9ucykge1xuICByZXR1cm4ge1xuICAgIG1heEJ1ZmZlcjogTUFYX0JVRkZFUixcbiAgICBjd2Q6IG9wdGlvbnMuY3dkLFxuICAgIGVudjogb3B0aW9ucy5lbnYgPyB7IC4uLnByb2Nlc3MuZW52LCAuLi5vcHRpb25zLmVudiB9IDogdW5kZWZpbmVkLFxuICAgIC8vIHJ1biB0aGUgcHJvZ3JhbSBkaXJlY3RseSwgd2l0aG91dCBnb2luZyB0aHJvdWdoIGEgc2hlbGxcbiAgICBzaGVsbDogZmFsc2UgYXMgY29uc3QsXG4gIH07XG59XG5cbi8qKlxuICogUnVucyBhIHByb2dyYW0gd2l0aCB0aGUgZ2l2ZW4gYXJndW1lbnRzLCBpbmhlcml0aW5nIHN0ZG91dC4gVGhyb3dzIGlmIHRoZVxuICogY29tbWFuZCBleGl0cyB3aXRoIGEgbm9uLXplcm8gc3RhdHVzLlxuICovXG5mdW5jdGlvbiBydW4oZmlsZTogc3RyaW5nLCBhcmdzOiBzdHJpbmdbXSwgb3B0aW9uczogUnVuT3B0aW9ucyk6IHZvaWQge1xuICBsb2dnaW5nLmRlYnVnKGAke2ZpbGV9ICR7YXJncy5qb2luKFwiIFwiKX0gKGN3ZDogJHtvcHRpb25zLmN3ZH0pYCk7XG5cbiAgY2hpbGRfcHJvY2Vzcy5leGVjRmlsZVN5bmMoZmlsZSwgYXJncywge1xuICAgIC4uLnNwYXduT3B0cyhvcHRpb25zKSxcbiAgICAvLyBCeSBkZWZhdWx0IHRoZSBjaGlsZCdzIHN0ZG91dCBpcyByZWRpcmVjdGVkIHRvIFNUREVSUiAodG8ga2VlcCB0aGVcbiAgICAvLyBwYXJlbnQncyBTVERPVVQgY2xlYW4pIGFuZCBpdHMgU1RERVJSIGlzIHBpcGVkIHNvIGl0IHN1cmZhY2VzIGluXG4gICAgLy8gZXhjZXB0aW9ucy4gYGluaGVyaXRTdGRpb2AgaW5zdGVhZCBzdHJlYW1zIGJvdGggc3RyYWlnaHQgdG8gdGhlIHBhcmVudC5cbiAgICBzdGRpbzogb3B0aW9ucy5pbmhlcml0U3RkaW8gPyBcImluaGVyaXRcIiA6IFtcImluaGVyaXRcIiwgMiwgXCJwaXBlXCJdLFxuICB9KTtcbn1cblxuLyoqXG4gKiBSdW5zIGEgcHJvZ3JhbSBhbmQgcmV0dXJucyBpdHMgdHJpbW1lZCBTVERPVVQuIFRocm93cyBpZiB0aGUgY29tbWFuZCBleGl0c1xuICogd2l0aCBhIG5vbi16ZXJvIHN0YXR1cy5cbiAqL1xuZnVuY3Rpb24gY2FwdHVyZShcbiAgZmlsZTogc3RyaW5nLFxuICBhcmdzOiBzdHJpbmdbXSxcbiAgb3B0aW9uczogRXhlY0ZpbGVPcHRpb25zLFxuKTogc3RyaW5nIHtcbiAgbG9nZ2luZy5kZWJ1ZyhgJHtmaWxlfSAke2FyZ3Muam9pbihcIiBcIil9IChjd2Q6ICR7b3B0aW9ucy5jd2R9KWApO1xuXG4gIHJldHVybiBjaGlsZF9wcm9jZXNzXG4gICAgLmV4ZWNGaWxlU3luYyhmaWxlLCBhcmdzLCB7XG4gICAgICAuLi5zcGF3bk9wdHMob3B0aW9ucyksXG4gICAgICBzdGRpbzogW1wiaW5oZXJpdFwiLCBcInBpcGVcIiwgXCJwaXBlXCJdLCAvLyBcInBpcGVcIiBmb3IgU1RERVJSIG1lYW5zIGl0IGFwcGVhcnMgaW4gZXhjZXB0aW9uc1xuICAgIH0pXG4gICAgLnRvU3RyaW5nKFwidXRmLThcIilcbiAgICAudHJpbSgpO1xufVxuXG4vKipcbiAqIFJ1bnMgYSBwcm9ncmFtIGFuZCByZXR1cm5zIGl0cyB0cmltbWVkIFNURE9VVCwgb3IgYHVuZGVmaW5lZGAgaWYgdGhlIGNvbW1hbmRcbiAqIGZhaWxlZCBvciBwcm9kdWNlZCBubyBvdXRwdXQuXG4gKi9cbmZ1bmN0aW9uIHRyeUNhcHR1cmUoXG4gIGZpbGU6IHN0cmluZyxcbiAgYXJnczogc3RyaW5nW10sXG4gIG9wdGlvbnM6IEV4ZWNGaWxlT3B0aW9ucyxcbik6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGxvZ2dpbmcuZGVidWcoYCR7ZmlsZX0gJHthcmdzLmpvaW4oXCIgXCIpfSAoY3dkOiAke29wdGlvbnMuY3dkfSlgKTtcblxuICB0cnkge1xuICAgIGNvbnN0IHZhbHVlID0gY2hpbGRfcHJvY2Vzc1xuICAgICAgLmV4ZWNGaWxlU3luYyhmaWxlLCBhcmdzLCB7XG4gICAgICAgIC4uLnNwYXduT3B0cyhvcHRpb25zKSxcbiAgICAgICAgc3RkaW86IFtcImluaGVyaXRcIiwgXCJwaXBlXCIsIFwicGlwZVwiXSwgLy8gXCJwaXBlXCIgZm9yIFNUREVSUiBtZWFucyBpdCBhcHBlYXJzIGluIGV4Y2VwdGlvbnNcbiAgICAgIH0pXG4gICAgICAudG9TdHJpbmcoXCJ1dGYtOFwiKVxuICAgICAgLnRyaW0oKTtcblxuICAgIC8vIGFuIGVtcHR5IHN0cmluZyBpcyB0aGUgc2FtZSBhcyB1bmRlZmluZWRcbiAgICByZXR1cm4gdmFsdWUgfHwgdW5kZWZpbmVkO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG59XG5cbi8qKlxuICogQSBzaGVsbC1mcmVlIGhhbmRsZSBmb3IgaW52b2tpbmcgYSBzaW5nbGUgcHJvZ3JhbSBieSBuYW1lIG9yIHBhdGguXG4gKlxuICogRWFjaCBhcmd1bWVudCBpcyBwYXNzZWQgdG8gdGhlIHByb2dyYW0gdmVyYmF0aW0gKG5vIHNoZWxsIHBhcnNpbmcpLCBzbyB0aGVyZVxuICogaXMgbm8gcXVvdGluZyB0byBnZXQgcmlnaHQgZm9yIHZhbHVlcyBzdWNoIGFzIHRhZ3MsIHZlcnNpb25zLCBicmFuY2ggbmFtZXNcbiAqIG9yIGZpbGUgcGF0aHMuXG4gKlxuICogTm90ZTogdGhlIHByb2dyYW0gaXMgZXhlY3V0ZWQgZGlyZWN0bHksIHdpdGhvdXQgYSBzaGVsbC4gT24gV2luZG93cyB0aGlzXG4gKiBtZWFucyBpdCBtdXN0IGJlIGEgcmVhbCBleGVjdXRhYmxlIC0gYC5jbWRgL2AuYmF0YCBzaGltcyAoc3VjaCBhc1xuICogbnBtLWluc3RhbGxlZCBDTElzIGxpa2UgbnBtL25weC95YXJuL3BucG0pIGNhbm5vdCBiZSBpbnZva2VkIHRoaXMgd2F5LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFRvb2wge1xuICAvKipcbiAgICogUnVucyBgPHRvb2w+IDxhcmdzPmAsIGluaGVyaXRpbmcgc3Rkb3V0LiBUaHJvd3Mgb24gbm9uLXplcm8gZXhpdC5cbiAgICovXG4gIHJ1bihhcmdzOiBzdHJpbmdbXSwgb3B0aW9uczogUnVuT3B0aW9ucyk6IHZvaWQ7XG5cbiAgLyoqXG4gICAqIFJ1bnMgYDx0b29sPiA8YXJncz5gIGFuZCByZXR1cm5zIGl0cyB0cmltbWVkIFNURE9VVC4gVGhyb3dzIG9uIG5vbi16ZXJvIGV4aXQuXG4gICAqL1xuICBjYXB0dXJlKGFyZ3M6IHN0cmluZ1tdLCBvcHRpb25zOiBFeGVjRmlsZU9wdGlvbnMpOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFJ1bnMgYDx0b29sPiA8YXJncz5gIGFuZCByZXR1cm5zIGl0cyB0cmltbWVkIFNURE9VVCwgb3IgYHVuZGVmaW5lZGAgaWYgdGhlXG4gICAqIGNvbW1hbmQgZmFpbGVkIG9yIHByb2R1Y2VkIG5vIG91dHB1dC5cbiAgICovXG4gIHRyeUNhcHR1cmUoYXJnczogc3RyaW5nW10sIG9wdGlvbnM6IEV4ZWNGaWxlT3B0aW9ucyk6IHN0cmluZyB8IHVuZGVmaW5lZDtcbn1cblxuLyoqXG4gKiBDcmVhdGVzIGEgc2hlbGwtZnJlZSB7QGxpbmsgVG9vbH0gZm9yIHRoZSBnaXZlbiBwcm9ncmFtLlxuICpcbiAqIEBleGFtcGxlIGNvbnN0IGdpdCA9IHRvb2woXCJnaXRcIik7IGdpdC5ydW4oW1widGFnXCIsIFwiLS1kZWxldGVcIiwgdGFnXSwgeyBjd2QgfSk7XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0b29sKGZpbGU6IHN0cmluZyk6IFRvb2wge1xuICByZXR1cm4ge1xuICAgIHJ1bjogKGFyZ3MsIG9wdGlvbnMpID0+IHJ1bihmaWxlLCBhcmdzLCBvcHRpb25zKSxcbiAgICBjYXB0dXJlOiAoYXJncywgb3B0aW9ucykgPT4gY2FwdHVyZShmaWxlLCBhcmdzLCBvcHRpb25zKSxcbiAgICB0cnlDYXB0dXJlOiAoYXJncywgb3B0aW9ucykgPT4gdHJ5Q2FwdHVyZShmaWxlLCBhcmdzLCBvcHRpb25zKSxcbiAgfTtcbn1cblxuLyoqXG4gKiBTaGVsbC1mcmVlIGhlbHBlciBmb3IgaW52b2tpbmcgYGdpdGAuXG4gKlxuICogQGV4YW1wbGUgZ2l0LnJ1bihbXCJ0YWdcIiwgXCItLWRlbGV0ZVwiLCB0YWddLCB7IGN3ZCB9KTtcbiAqL1xuZXhwb3J0IGNvbnN0IGdpdCA9IHRvb2woXCJnaXRcIik7XG5cbi8qKlxuICogU2hlbGwtZnJlZSBoZWxwZXIgZm9yIGludm9raW5nIGB1dmAgKHNoaXBzIGFzIGEgbmF0aXZlIGJpbmFyeSBvbiBhbGxcbiAqIHBsYXRmb3JtcykuXG4gKi9cbmV4cG9ydCBjb25zdCB1diA9IHRvb2woXCJ1dlwiKTtcblxuLyoqXG4gKiBTaGVsbC1mcmVlIGhlbHBlciBmb3IgaW52b2tpbmcgYHBvZXRyeWAuXG4gKi9cbmV4cG9ydCBjb25zdCBwb2V0cnkgPSB0b29sKFwicG9ldHJ5XCIpO1xuXG4vKipcbiAqIFNoZWxsLWZyZWUgaGVscGVyIGZvciBpbnZva2luZyB0aGUgY3VycmVudCBOb2RlLmpzIGV4ZWN1dGFibGVcbiAqIChgcHJvY2Vzcy5leGVjUGF0aGApLlxuICovXG5leHBvcnQgY29uc3Qgbm9kZSA9IHRvb2wocHJvY2Vzcy5leGVjUGF0aCk7XG5cbi8vXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIENyb3NzLXBsYXRmb3JtIGV4ZWN1dGlvbiB2aWEgZGF4IChmb3IgYmluYXJpZXMgdGhhdCBtYXkgYmUgYC5jbWRgIHNoaW1zKS5cbi8vXG4vLyBgdG9vbGAgYWJvdmUgdXNlcyBgZXhlY0ZpbGVTeW5jYCB3aXRoIGBzaGVsbDogZmFsc2VgLCB3aGljaCBjYW5ub3QgbGF1bmNoXG4vLyBXaW5kb3dzIGAuY21kYC9gLmJhdGAgc2hpbXMgc3VjaCBhcyBgbnB4YCBvciBgbnBtYC4gYHNoaW1Ub29sYCBydW5zIHRocm91Z2hcbi8vIGRheCwgd2hpY2ggcmVzb2x2ZXMgdGhvc2Ugc2hpbXMgY3Jvc3MtcGxhdGZvcm0uIEFyZ3VtZW50cyBhcmUgaW50ZXJwb2xhdGVkXG4vLyB0aHJvdWdoIGRheCdzIGVzY2FwaW5nIChOT1QgYCQucmF3YCksIHNvIGVhY2ggdmFsdWUgaXMgcGFzc2VkIGFzIGEgc2luZ2xlXG4vLyBsaXRlcmFsIGFyZ3VtZW50IHdpdGggbm8gcXVvdGluZyB0byBnZXQgcmlnaHQuIGRheCBpcyBhc3luY2hyb25vdXMsIHNvXG4vLyB0aGVzZSBoZWxwZXJzIGFyZSBvbmx5IHVzYWJsZSBmcm9tIGFzeW5jIGNhbGwgc2l0ZXMuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vXG5cbi8qKlxuICogQXN5bmMsIGRheC1iYWNrZWQgZXF1aXZhbGVudCBvZiB7QGxpbmsgVG9vbH0gZm9yIHByb2dyYW1zIHRoYXQgbWF5IGJlIGFcbiAqIFdpbmRvd3MgYC5jbWRgL2AuYmF0YCBzaGltIChlLmcuIGBucHhgLCBgbnBtYCkuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQXN5bmNUb29sIHtcbiAgLyoqXG4gICAqIFJ1bnMgYDx0b29sPiA8YXJncz5gLCBpbmhlcml0aW5nIHN0ZG91dC4gUmVqZWN0cyBvbiBub24temVybyBleGl0LlxuICAgKi9cbiAgcnVuKGFyZ3M6IHN0cmluZ1tdLCBvcHRpb25zOiBFeGVjRmlsZU9wdGlvbnMpOiBQcm9taXNlPHZvaWQ+O1xuXG4gIC8qKlxuICAgKiBSdW5zIGA8dG9vbD4gPGFyZ3M+YCBhbmQgcmVzb2x2ZXMgaXRzIHRyaW1tZWQgU1RET1VULiBSZWplY3RzIG9uIG5vbi16ZXJvXG4gICAqIGV4aXQuXG4gICAqL1xuICBjYXB0dXJlKGFyZ3M6IHN0cmluZ1tdLCBvcHRpb25zOiBFeGVjRmlsZU9wdGlvbnMpOiBQcm9taXNlPHN0cmluZz47XG59XG5cbi8qKlxuICogQ3JlYXRlcyBhbiB7QGxpbmsgQXN5bmNUb29sfSB0aGF0IGludm9rZXMgYGZpbGVgIHZpYSBkYXgsIHJlc29sdmluZyBXaW5kb3dzXG4gKiBgLmNtZGAvYC5iYXRgIHNoaW1zIGFuZCBlc2NhcGluZyBldmVyeSBhcmd1bWVudCAoc28gZWFjaCB2YWx1ZSBpcyBwYXNzZWQgYXNcbiAqIGEgc2luZ2xlIGxpdGVyYWwgYXJndW1lbnQpLlxuICpcbiAqIEBleGFtcGxlIGF3YWl0IG5weC5ydW4oW1wiY29tbWl0LWFuZC10YWctdmVyc2lvbkBeMTJcIl0sIHsgY3dkIH0pO1xuICovXG5mdW5jdGlvbiBzaGltVG9vbChmaWxlOiBzdHJpbmcpOiBBc3luY1Rvb2wge1xuICBjb25zdCBidWlsZCA9IChhcmdzOiBzdHJpbmdbXSwgb3B0aW9uczogRXhlY0ZpbGVPcHRpb25zKSA9PiB7XG4gICAgY29uc3QgY21kID0gJGAke2ZpbGV9ICR7YXJnc31gLmN3ZChvcHRpb25zLmN3ZCkuc3RkZXJyKFwicGlwZWRcIikubm9UaHJvdygpO1xuICAgIHJldHVybiBvcHRpb25zLmVudiA/IGNtZC5lbnYob3B0aW9ucy5lbnYpIDogY21kO1xuICB9O1xuICBjb25zdCBlbnN1cmVPayA9IChcbiAgICBhcmdzOiBzdHJpbmdbXSxcbiAgICByZXN1bHQ6IHsgY29kZTogbnVtYmVyOyBzdGRlcnI6IHN0cmluZyB9LFxuICApID0+IHtcbiAgICBpZiAocmVzdWx0LmNvZGUgIT09IDApIHtcbiAgICAgIC8vIE1pbWljIHRoZSBgY2hpbGRfcHJvY2Vzc2AgZXJyb3Igc2hhcGUgKGBzdGF0dXNgLCBgc3RkZXJyYCkgc28gY2FsbGVyc1xuICAgICAgLy8gY2FuIGluc3BlY3Qgc3RkZXJyIChlLmcuIHRvIGRldGVjdCBFTk9FTlQvRTQwNCBmcm9tIG5wbSkuXG4gICAgICBjb25zdCBlcnJvcjogYW55ID0gbmV3IEVycm9yKFxuICAgICAgICBgQ29tbWFuZCBmYWlsZWQgKGV4aXQgY29kZSAke3Jlc3VsdC5jb2RlfSk6ICR7ZmlsZX0gJHthcmdzLmpvaW4oXCIgXCIpfWAsXG4gICAgICApO1xuICAgICAgZXJyb3Iuc3RhdHVzID0gcmVzdWx0LmNvZGU7XG4gICAgICBlcnJvci5zdGRlcnIgPSBCdWZmZXIuZnJvbShyZXN1bHQuc3RkZXJyKTtcbiAgICAgIHRocm93IGVycm9yO1xuICAgIH1cbiAgfTtcbiAgcmV0dXJuIHtcbiAgICBydW46IGFzeW5jIChhcmdzLCBvcHRpb25zKSA9PiB7XG4gICAgICBsb2dnaW5nLmRlYnVnKGAke2ZpbGV9ICR7YXJncy5qb2luKFwiIFwiKX0gKGN3ZDogJHtvcHRpb25zLmN3ZH0pYCk7XG4gICAgICBlbnN1cmVPayhhcmdzLCBhd2FpdCBidWlsZChhcmdzLCBvcHRpb25zKSk7XG4gICAgfSxcbiAgICBjYXB0dXJlOiBhc3luYyAoYXJncywgb3B0aW9ucykgPT4ge1xuICAgICAgbG9nZ2luZy5kZWJ1ZyhgJHtmaWxlfSAke2FyZ3Muam9pbihcIiBcIil9IChjd2Q6ICR7b3B0aW9ucy5jd2R9KWApO1xuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgYnVpbGQoYXJncywgb3B0aW9ucykuc3Rkb3V0KFwicGlwZWRcIik7XG4gICAgICBlbnN1cmVPayhhcmdzLCByZXN1bHQpO1xuICAgICAgcmV0dXJuIHJlc3VsdC5zdGRvdXQudHJpbSgpO1xuICAgIH0sXG4gIH07XG59XG5cbi8qKlxuICogQ3Jvc3MtcGxhdGZvcm0gaGVscGVyIGZvciBgbnBtYCAoYSBXaW5kb3dzIGAuY21kYCBzaGltKS5cbiAqL1xuZXhwb3J0IGNvbnN0IG5wbSA9IHNoaW1Ub29sKFwibnBtXCIpO1xuXG4vKipcbiAqIENyb3NzLXBsYXRmb3JtIGhlbHBlciBmb3IgYG5weGAgKGEgV2luZG93cyBgLmNtZGAgc2hpbSkuXG4gKi9cbmV4cG9ydCBjb25zdCBucHggPSBzaGltVG9vbChcIm5weFwiKTtcblxuLy9cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gcmF3U2hlbGw6IGFyYml0cmFyeSBzaGVsbCBjb21tYW5kIHN0cmluZ3MgKHZpYSB0aGUgc3lzdGVtIHNoZWxsKS5cbi8vXG4vLyBUaGlzIHJ1bnMgYW4gb3BhcXVlIGNvbW1hbmQgKnN0cmluZyogdGhyb3VnaCB0aGUgb3BlcmF0aW5nIHN5c3RlbSdzIGRlZmF1bHRcbi8vIHNoZWxsIChgL2Jpbi9zaGAgb24gUE9TSVgsIGBjbWQuZXhlYCBvbiBXaW5kb3dzKSAtIHRoZSBzYW1lIG1lY2hhbmlzbSB0aGVcbi8vIGNvZGViYXNlIHVzZWQgcHJldmlvdXNseS4gSXQgaXMgbWVhbnQgZm9yIGNvbW1hbmQgbGluZXMgdGhhdCBjYW5ub3QgYmVcbi8vIGV4cHJlc3NlZCBhcyBhIGZpeGVkIGJpbmFyeSBwbHVzIGEgbGlzdCBvZiBhcmd1bWVudHMsIGUuZy4gYSByZWxlYXNlJ3Ncbi8vIGBuZXh0VmVyc2lvbkNvbW1hbmRgIG9yIGBSZWxlYXNhYmxlQ29tbWl0cy5leGVjKClgIChhbmQgcHJvamVuJ3Mgb3duXG4vLyBnZW5lcmF0ZWQgYFJlbGVhc2FibGVDb21taXRzYCBxdWVyaWVzKSwgYXMgd2VsbCBhcyB0YXNrIHN0ZXBzIG9uIG5vbi1XaW5kb3dzXG4vLyBwbGF0Zm9ybXMuIEZvciBldmVyeXRoaW5nIGVsc2UgcHJlZmVyIHRoZSBzdHJ1Y3R1cmVkIGB0b29sYC9gZ2l0YCBoZWxwZXJzXG4vLyAob3IgYHNoaW1Ub29sYCBmb3IgYC5jbWRgIHNoaW1zKSwgd2hpY2ggdGFrZSBhbiBleHBsaWNpdCBsaXN0IG9mIGFyZ3VtZW50cy5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy9cblxuLyoqXG4gKiBOb3JtYWxpemVkIHJlc3VsdCBvZiBydW5uaW5nIGEgY29tbWFuZCB0aHJvdWdoIHRoZSBzeXN0ZW0gc2hlbGwuIFRoaXMgaXMgYVxuICogc3Vic2V0IG9mIG5vZGUncyBgU3Bhd25TeW5jUmV0dXJuc2Agc2hhcGUuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUmF3U2hlbGxSZXN1bHQge1xuICAvKipcbiAgICogVGhlIGV4aXQgY29kZSwgb3IgYG51bGxgIGlmIHRoZSBwcm9jZXNzIHdhcyB0ZXJtaW5hdGVkIGJ5IGEgc2lnbmFsIG9yXG4gICAqIG5ldmVyIHNwYXduZWQuXG4gICAqL1xuICByZWFkb25seSBzdGF0dXM6IG51bWJlciB8IG51bGw7XG5cbiAgLyoqXG4gICAqIENhcHR1cmVkIHN0ZG91dCwgb3IgYG51bGxgIHdoZW4gc3Rkb3V0IHdhcyBpbmhlcml0ZWQgKG5vdCBjYXB0dXJlZCkuXG4gICAqL1xuICByZWFkb25seSBzdGRvdXQ6IEJ1ZmZlciB8IG51bGw7XG5cbiAgLyoqXG4gICAqIENhcHR1cmVkIHN0ZGVyciwgb3IgYG51bGxgIHdoZW4gc3RkZXJyIHdhcyBpbmhlcml0ZWQgKG5vdCBjYXB0dXJlZCkuXG4gICAqL1xuICByZWFkb25seSBzdGRlcnI6IEJ1ZmZlciB8IG51bGw7XG5cbiAgLyoqXG4gICAqIEFuIGVycm9yIHJhaXNlZCB3aGlsZSBhdHRlbXB0aW5nIHRvIHNwYXduIHRoZSBjb21tYW5kIChub3QgYSBub24temVyb1xuICAgKiBleGl0LCB3aGljaCBpcyByZXBvcnRlZCB2aWEgYHN0YXR1c2ApLlxuICAgKi9cbiAgcmVhZG9ubHkgZXJyb3I/OiBFcnJvcjtcbn1cblxuLyoqXG4gKiBPcHRpb25zIGZvciB7QGxpbmsgcmF3U2hlbGwuZXhlY30uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUmF3U2hlbGxFeGVjT3B0aW9ucyB7XG4gIC8qKlxuICAgKiBXb3JraW5nIGRpcmVjdG9yeSBmb3IgdGhlIGNvbW1hbmQuXG4gICAqL1xuICByZWFkb25seSBjd2Q6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIGZ1bGwgZW52aXJvbm1lbnQgZm9yIHRoZSBjb21tYW5kLiBQYXNzZWQgdGhyb3VnaCB0byB0aGUgc2hlbGwgYXMtaXNcbiAgICogKGl0IGlzICpub3QqIG1lcmdlZCB3aXRoIGBwcm9jZXNzLmVudmApLCBzbyBjYWxsZXJzIHRoYXQgd2FudCB0byBpbmhlcml0XG4gICAqIHRoZSBwYXJlbnQgZW52aXJvbm1lbnQgbXVzdCBpbmNsdWRlIGl0IHRoZW1zZWx2ZXMuXG4gICAqL1xuICByZWFkb25seSBlbnY/OiBOb2RlSlMuUHJvY2Vzc0VudjtcblxuICAvKipcbiAgICogQ2FwdHVyZSBzdGRvdXQvc3RkZXJyIChzbyB0aGUgY2FsbGVyIGNhbiByZWFkIHRoZW0gZnJvbSB0aGUgcmVzdWx0KVxuICAgKiBpbnN0ZWFkIG9mIGluaGVyaXRpbmcgdGhlIHBhcmVudCdzIHN0cmVhbXMuXG4gICAqXG4gICAqIEBkZWZhdWx0IGZhbHNlXG4gICAqL1xuICByZWFkb25seSBjYXB0dXJlPzogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBPcHRpb25zIGZvciB7QGxpbmsgcmF3U2hlbGwuY2FwdHVyZX0gLyB7QGxpbmsgcmF3U2hlbGwudHJ5Q2FwdHVyZX0uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUmF3U2hlbGxDYXB0dXJlT3B0aW9ucyB7XG4gIC8qKlxuICAgKiBXb3JraW5nIGRpcmVjdG9yeSBmb3IgdGhlIGNvbW1hbmQuXG4gICAqL1xuICByZWFkb25seSBjd2Q6IHN0cmluZztcblxuICAvKipcbiAgICogQWRkaXRpb25hbCBlbnZpcm9ubWVudCB2YXJpYWJsZXMsIG1lcmdlZCBvbiB0b3Agb2YgYHByb2Nlc3MuZW52YC5cbiAgICovXG4gIHJlYWRvbmx5IGVudj86IFJlY29yZDxzdHJpbmcsIHN0cmluZz47XG59XG5cbmV4cG9ydCBjb25zdCByYXdTaGVsbCA9IHtcbiAgLyoqXG4gICAqIFJ1bnMgYSBjb21tYW5kIGxpbmUgdGhyb3VnaCB0aGUgc3lzdGVtIHNoZWxsIGFuZCByZXR1cm5zIGEgbm9ybWFsaXplZFxuICAgKiByZXN1bHQuIE5ldmVyIHRocm93cyBmb3IgYSBub24temVybyBleGl0ICh0aGF0IGlzIHJlcG9ydGVkIHZpYSBgc3RhdHVzYCk7XG4gICAqIGEgc3Bhd24gZmFpbHVyZSBpcyByZXBvcnRlZCB2aWEgYGVycm9yYC5cbiAgICpcbiAgICogVGhlIGNhbGxlciBpcyByZXNwb25zaWJsZSBmb3Igc3VwcGx5aW5nIHRoZSBmdWxsIGBlbnZgLlxuICAgKi9cbiAgZXhlYyhjb21tYW5kOiBzdHJpbmcsIG9wdGlvbnM6IFJhd1NoZWxsRXhlY09wdGlvbnMpOiBSYXdTaGVsbFJlc3VsdCB7XG4gICAgbG9nZ2luZy5kZWJ1ZyhgJHtjb21tYW5kfSAoY3dkOiAke29wdGlvbnMuY3dkfSlgKTtcblxuICAgIGNvbnN0IHJlc3VsdCA9IGNoaWxkX3Byb2Nlc3Muc3Bhd25TeW5jKGNvbW1hbmQsIHtcbiAgICAgIGN3ZDogb3B0aW9ucy5jd2QsXG4gICAgICBzaGVsbDogdHJ1ZSxcbiAgICAgIG1heEJ1ZmZlcjogTUFYX0JVRkZFUixcbiAgICAgIGVudjogb3B0aW9ucy5lbnYsXG4gICAgICAvLyBcInBpcGVcIiBmb3IgU1RERVJSICh3aGVuIGNhcHR1cmluZykgbWVhbnMgaXQgYXBwZWFycyBpbiBleGNlcHRpb25zLlxuICAgICAgc3RkaW86IG9wdGlvbnMuY2FwdHVyZSA/IFtcImluaGVyaXRcIiwgXCJwaXBlXCIsIFwicGlwZVwiXSA6IFwiaW5oZXJpdFwiLFxuICAgIH0pO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIHN0YXR1czogcmVzdWx0LnN0YXR1cyxcbiAgICAgIHN0ZG91dDogcmVzdWx0LnN0ZG91dCA/PyBudWxsLFxuICAgICAgc3RkZXJyOiByZXN1bHQuc3RkZXJyID8/IG51bGwsXG4gICAgICBlcnJvcjogcmVzdWx0LmVycm9yLFxuICAgIH07XG4gIH0sXG5cbiAgLyoqXG4gICAqIFJ1bnMgYSB1c2VyLXN1cHBsaWVkIHNoZWxsIGNvbW1hbmQgbGluZSBhbmQgcmVzb2x2ZXMgaXRzIHRyaW1tZWQgU1RET1VULlxuICAgKiBSZWplY3RzIGlmIHRoZSBjb21tYW5kIGV4aXRzIG5vbi16ZXJvLlxuICAgKi9cbiAgY2FwdHVyZTogYXN5bmMgKFxuICAgIGNvbW1hbmQ6IHN0cmluZyxcbiAgICBvcHRpb25zOiBSYXdTaGVsbENhcHR1cmVPcHRpb25zLFxuICApOiBQcm9taXNlPHN0cmluZz4gPT4ge1xuICAgIGNvbnN0IHJlc3VsdCA9IHJhd1NoZWxsLmV4ZWMoY29tbWFuZCwge1xuICAgICAgY3dkOiBvcHRpb25zLmN3ZCxcbiAgICAgIGVudjogeyAuLi5wcm9jZXNzLmVudiwgLi4ub3B0aW9ucy5lbnYgfSxcbiAgICAgIGNhcHR1cmU6IHRydWUsXG4gICAgfSk7XG4gICAgaWYgKHJlc3VsdC5lcnJvcikge1xuICAgICAgdGhyb3cgcmVzdWx0LmVycm9yO1xuICAgIH1cbiAgICBpZiAocmVzdWx0LnN0YXR1cyAhPT0gMCkge1xuICAgICAgY29uc3QgZXJyb3I6IGFueSA9IG5ldyBFcnJvcihcbiAgICAgICAgYENvbW1hbmQgZmFpbGVkIChleGl0IGNvZGUgJHtyZXN1bHQuc3RhdHVzfSk6ICR7Y29tbWFuZH1gLFxuICAgICAgKTtcbiAgICAgIGVycm9yLnN0YXR1cyA9IHJlc3VsdC5zdGF0dXM7XG4gICAgICBlcnJvci5zdGRlcnIgPSByZXN1bHQuc3RkZXJyO1xuICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfVxuICAgIHJldHVybiAocmVzdWx0LnN0ZG91dD8udG9TdHJpbmcoXCJ1dGYtOFwiKSA/PyBcIlwiKS50cmltKCk7XG4gIH0sXG5cbiAgLyoqXG4gICAqIFJ1bnMgYSB1c2VyLXN1cHBsaWVkIHNoZWxsIGNvbW1hbmQgbGluZSBhbmQgcmVzb2x2ZXMgaXRzIHRyaW1tZWQgU1RET1VULFxuICAgKiBvciBgdW5kZWZpbmVkYCBpZiB0aGUgY29tbWFuZCBmYWlsZWQgb3IgcHJvZHVjZWQgbm8gb3V0cHV0LlxuICAgKi9cbiAgdHJ5Q2FwdHVyZTogYXN5bmMgKFxuICAgIGNvbW1hbmQ6IHN0cmluZyxcbiAgICBvcHRpb25zOiBSYXdTaGVsbENhcHR1cmVPcHRpb25zLFxuICApOiBQcm9taXNlPHN0cmluZyB8IHVuZGVmaW5lZD4gPT4ge1xuICAgIGNvbnN0IHJlc3VsdCA9IHJhd1NoZWxsLmV4ZWMoY29tbWFuZCwge1xuICAgICAgY3dkOiBvcHRpb25zLmN3ZCxcbiAgICAgIGVudjogeyAuLi5wcm9jZXNzLmVudiwgLi4ub3B0aW9ucy5lbnYgfSxcbiAgICAgIGNhcHR1cmU6IHRydWUsXG4gICAgfSk7XG4gICAgaWYgKHJlc3VsdC5lcnJvciB8fCByZXN1bHQuc3RhdHVzICE9PSAwKSB7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cbiAgICBjb25zdCBvdXQgPSAocmVzdWx0LnN0ZG91dD8udG9TdHJpbmcoXCJ1dGYtOFwiKSA/PyBcIlwiKS50cmltKCk7XG4gICAgcmV0dXJuIG91dCB8fCB1bmRlZmluZWQ7XG4gIH0sXG59O1xuIl19
|
package/lib/util/fs.d.ts
ADDED
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Recursively determines whether a directory contains at least one file,
|
|
3
|
+
* optionally filtered by file extension.
|
|
4
|
+
*
|
|
5
|
+
* @param dir The directory to search. If it does not exist, `false` is
|
|
6
|
+
* returned.
|
|
7
|
+
* @param ext Optional file extension (e.g. `".ts"`) used to filter files. When
|
|
8
|
+
* provided, only files whose name ends with this extension are considered.
|
|
9
|
+
* @returns `true` if a matching file is found anywhere in the tree, otherwise
|
|
10
|
+
* `false` (including when the directory only contains empty subdirectories).
|
|
11
|
+
*/
|
|
12
|
+
export declare function dirContainsFile(dir: string, ext?: string): boolean;
|
package/lib/util/fs.js
ADDED
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.dirContainsFile = dirContainsFile;
|
|
4
|
+
const fs_1 = require("fs");
|
|
5
|
+
const path_1 = require("path");
|
|
6
|
+
/**
|
|
7
|
+
* Recursively determines whether a directory contains at least one file,
|
|
8
|
+
* optionally filtered by file extension.
|
|
9
|
+
*
|
|
10
|
+
* @param dir The directory to search. If it does not exist, `false` is
|
|
11
|
+
* returned.
|
|
12
|
+
* @param ext Optional file extension (e.g. `".ts"`) used to filter files. When
|
|
13
|
+
* provided, only files whose name ends with this extension are considered.
|
|
14
|
+
* @returns `true` if a matching file is found anywhere in the tree, otherwise
|
|
15
|
+
* `false` (including when the directory only contains empty subdirectories).
|
|
16
|
+
*/
|
|
17
|
+
function dirContainsFile(dir, ext) {
|
|
18
|
+
if (!(0, fs_1.existsSync)(dir)) {
|
|
19
|
+
return false;
|
|
20
|
+
}
|
|
21
|
+
for (const entry of (0, fs_1.readdirSync)(dir, { withFileTypes: true })) {
|
|
22
|
+
if (entry.isDirectory()) {
|
|
23
|
+
if (dirContainsFile((0, path_1.join)(dir, entry.name), ext)) {
|
|
24
|
+
return true;
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
else if (!ext || entry.name.endsWith(ext)) {
|
|
28
|
+
return true;
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
return false;
|
|
32
|
+
}
|
|
33
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZnMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvdXRpbC9mcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQWNBLDBDQWdCQztBQTlCRCwyQkFBNkM7QUFDN0MsK0JBQTRCO0FBRTVCOzs7Ozs7Ozs7O0dBVUc7QUFDSCxTQUFnQixlQUFlLENBQUMsR0FBVyxFQUFFLEdBQVk7SUFDdkQsSUFBSSxDQUFDLElBQUEsZUFBVSxFQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUM7UUFDckIsT0FBTyxLQUFLLENBQUM7SUFDZixDQUFDO0lBRUQsS0FBSyxNQUFNLEtBQUssSUFBSSxJQUFBLGdCQUFXLEVBQUMsR0FBRyxFQUFFLEVBQUUsYUFBYSxFQUFFLElBQUksRUFBRSxDQUFDLEVBQUUsQ0FBQztRQUM5RCxJQUFJLEtBQUssQ0FBQyxXQUFXLEVBQUUsRUFBRSxDQUFDO1lBQ3hCLElBQUksZUFBZSxDQUFDLElBQUEsV0FBSSxFQUFDLEdBQUcsRUFBRSxLQUFLLENBQUMsSUFBSSxDQUFDLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQztnQkFDaEQsT0FBTyxJQUFJLENBQUM7WUFDZCxDQUFDO1FBQ0gsQ0FBQzthQUFNLElBQUksQ0FBQyxHQUFHLElBQUksS0FBSyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQztZQUM1QyxPQUFPLElBQUksQ0FBQztRQUNkLENBQUM7SUFDSCxDQUFDO0lBRUQsT0FBTyxLQUFLLENBQUM7QUFDZixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgZXhpc3RzU3luYywgcmVhZGRpclN5bmMgfSBmcm9tIFwiZnNcIjtcbmltcG9ydCB7IGpvaW4gfSBmcm9tIFwicGF0aFwiO1xuXG4vKipcbiAqIFJlY3Vyc2l2ZWx5IGRldGVybWluZXMgd2hldGhlciBhIGRpcmVjdG9yeSBjb250YWlucyBhdCBsZWFzdCBvbmUgZmlsZSxcbiAqIG9wdGlvbmFsbHkgZmlsdGVyZWQgYnkgZmlsZSBleHRlbnNpb24uXG4gKlxuICogQHBhcmFtIGRpciBUaGUgZGlyZWN0b3J5IHRvIHNlYXJjaC4gSWYgaXQgZG9lcyBub3QgZXhpc3QsIGBmYWxzZWAgaXNcbiAqIHJldHVybmVkLlxuICogQHBhcmFtIGV4dCBPcHRpb25hbCBmaWxlIGV4dGVuc2lvbiAoZS5nLiBgXCIudHNcImApIHVzZWQgdG8gZmlsdGVyIGZpbGVzLiBXaGVuXG4gKiBwcm92aWRlZCwgb25seSBmaWxlcyB3aG9zZSBuYW1lIGVuZHMgd2l0aCB0aGlzIGV4dGVuc2lvbiBhcmUgY29uc2lkZXJlZC5cbiAqIEByZXR1cm5zIGB0cnVlYCBpZiBhIG1hdGNoaW5nIGZpbGUgaXMgZm91bmQgYW55d2hlcmUgaW4gdGhlIHRyZWUsIG90aGVyd2lzZVxuICogYGZhbHNlYCAoaW5jbHVkaW5nIHdoZW4gdGhlIGRpcmVjdG9yeSBvbmx5IGNvbnRhaW5zIGVtcHR5IHN1YmRpcmVjdG9yaWVzKS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRpckNvbnRhaW5zRmlsZShkaXI6IHN0cmluZywgZXh0Pzogc3RyaW5nKTogYm9vbGVhbiB7XG4gIGlmICghZXhpc3RzU3luYyhkaXIpKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgZm9yIChjb25zdCBlbnRyeSBvZiByZWFkZGlyU3luYyhkaXIsIHsgd2l0aEZpbGVUeXBlczogdHJ1ZSB9KSkge1xuICAgIGlmIChlbnRyeS5pc0RpcmVjdG9yeSgpKSB7XG4gICAgICBpZiAoZGlyQ29udGFpbnNGaWxlKGpvaW4oZGlyLCBlbnRyeS5uYW1lKSwgZXh0KSkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKCFleHQgfHwgZW50cnkubmFtZS5lbmRzV2l0aChleHQpKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gZmFsc2U7XG59XG4iXX0=
|
package/lib/util.d.ts
CHANGED
|
@@ -1,26 +1,4 @@
|
|
|
1
|
-
import * as child_process from "child_process";
|
|
2
1
|
import * as path from "path";
|
|
3
|
-
/**
|
|
4
|
-
* Executes a command with STDOUT > STDERR.
|
|
5
|
-
*/
|
|
6
|
-
export declare function exec(command: string, options: {
|
|
7
|
-
cwd: string;
|
|
8
|
-
env?: Record<string, string>;
|
|
9
|
-
stdio?: child_process.StdioOptions;
|
|
10
|
-
}): void;
|
|
11
|
-
/**
|
|
12
|
-
* Executes command and returns STDOUT. If the command fails (non-zero), throws an error.
|
|
13
|
-
*/
|
|
14
|
-
export declare function execCapture(command: string, options: {
|
|
15
|
-
cwd: string;
|
|
16
|
-
modEnv?: Record<string, string>;
|
|
17
|
-
}): Buffer<ArrayBufferLike>;
|
|
18
|
-
/**
|
|
19
|
-
* Executes `command` and returns its value or undefined if the command failed.
|
|
20
|
-
*/
|
|
21
|
-
export declare function execOrUndefined(command: string, options: {
|
|
22
|
-
cwd: string;
|
|
23
|
-
}): string | undefined;
|
|
24
2
|
export interface WriteFileOptions {
|
|
25
3
|
/**
|
|
26
4
|
* Whether the generated file should be marked as executable.
|
package/lib/util.js
CHANGED
|
@@ -33,9 +33,6 @@ var __importStar = (this && this.__importStar) || (function () {
|
|
|
33
33
|
};
|
|
34
34
|
})();
|
|
35
35
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
-
exports.exec = exec;
|
|
37
|
-
exports.execCapture = execCapture;
|
|
38
|
-
exports.execOrUndefined = execOrUndefined;
|
|
39
36
|
exports.getFilePermissions = getFilePermissions;
|
|
40
37
|
exports.writeFile = writeFile;
|
|
41
38
|
exports.decamelizeKeysRecursively = decamelizeKeysRecursively;
|
|
@@ -59,62 +56,9 @@ exports.multipleSelected = multipleSelected;
|
|
|
59
56
|
exports.isRoot = isRoot;
|
|
60
57
|
exports.findUp = findUp;
|
|
61
58
|
exports.normalizePersistedPath = normalizePersistedPath;
|
|
62
|
-
const child_process = __importStar(require("child_process"));
|
|
63
59
|
const fs_1 = require("fs");
|
|
64
60
|
const path = __importStar(require("path"));
|
|
65
61
|
const Case = __importStar(require("case"));
|
|
66
|
-
const logging = __importStar(require("./logging"));
|
|
67
|
-
const MAX_BUFFER = 10 * 1024 * 1024;
|
|
68
|
-
/**
|
|
69
|
-
* Executes a command with STDOUT > STDERR.
|
|
70
|
-
*/
|
|
71
|
-
function exec(command, options) {
|
|
72
|
-
logging.debug(`${command} (cwd: ${options.cwd})`);
|
|
73
|
-
child_process.execSync(command, {
|
|
74
|
-
stdio: options.stdio || ["inherit", 2, "pipe"], // "pipe" for STDERR means it appears in exceptions
|
|
75
|
-
maxBuffer: MAX_BUFFER,
|
|
76
|
-
cwd: options.cwd,
|
|
77
|
-
env: options.env,
|
|
78
|
-
});
|
|
79
|
-
}
|
|
80
|
-
/**
|
|
81
|
-
* Executes command and returns STDOUT. If the command fails (non-zero), throws an error.
|
|
82
|
-
*/
|
|
83
|
-
function execCapture(command, options) {
|
|
84
|
-
logging.debug(`${command} (cwd: ${options.cwd})`);
|
|
85
|
-
return child_process.execSync(command, {
|
|
86
|
-
stdio: ["inherit", "pipe", "pipe"], // "pipe" for STDERR means it appears in exceptions
|
|
87
|
-
maxBuffer: MAX_BUFFER,
|
|
88
|
-
cwd: options.cwd,
|
|
89
|
-
env: {
|
|
90
|
-
...process.env,
|
|
91
|
-
...options.modEnv,
|
|
92
|
-
},
|
|
93
|
-
});
|
|
94
|
-
}
|
|
95
|
-
/**
|
|
96
|
-
* Executes `command` and returns its value or undefined if the command failed.
|
|
97
|
-
*/
|
|
98
|
-
function execOrUndefined(command, options) {
|
|
99
|
-
logging.debug(`${command} (cwd: ${options.cwd})`);
|
|
100
|
-
try {
|
|
101
|
-
const value = child_process
|
|
102
|
-
.execSync(command, {
|
|
103
|
-
stdio: ["inherit", "pipe", "pipe"], // "pipe" for STDERR means it appears in exceptions
|
|
104
|
-
maxBuffer: MAX_BUFFER,
|
|
105
|
-
cwd: options.cwd,
|
|
106
|
-
})
|
|
107
|
-
.toString("utf-8")
|
|
108
|
-
.trim();
|
|
109
|
-
if (!value) {
|
|
110
|
-
return undefined;
|
|
111
|
-
} // an empty string is the same as undefined
|
|
112
|
-
return value;
|
|
113
|
-
}
|
|
114
|
-
catch {
|
|
115
|
-
return undefined;
|
|
116
|
-
}
|
|
117
|
-
}
|
|
118
62
|
function getFilePermissions(options) {
|
|
119
63
|
const readonly = options.readonly ?? false;
|
|
120
64
|
const executable = options.executable ?? false;
|
|
@@ -463,4 +407,4 @@ function findUp(lookFor, cwd = process.cwd()) {
|
|
|
463
407
|
function normalizePersistedPath(p) {
|
|
464
408
|
return p.replace(/\\/g, path.posix.sep);
|
|
465
409
|
}
|
|
466
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy91dGlsLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBb0JBLG9CQWdCQztBQUtELGtDQWVDO0FBS0QsMENBdUJDO0FBa0JELGdEQVlDO0FBRUQsOEJBYUM7QUFnQ0QsOERBMENDO0FBTUQsNEJBS0M7QUFhRCw0QkFPQztBQThCRCw4QkEwRUM7QUFNRCxnQ0FFQztBQUtELHdCQXVCQztBQUVELG9EQUVDO0FBUUQsc0NBT0M7QUFFRCxzQ0FvQkM7QUFFRCxzQ0E4QkM7QUFFRCxrQ0FNQztBQUVELDBDQU1DO0FBRUQsZ0NBT0M7QUFXRCxrRUFZQztBQUVELG9DQVFDO0FBVUQsa0RBT0M7QUFFRCxrQ0FFQztBQUVELDRDQUVDO0FBVUQsd0JBR0M7QUFTRCx3QkFhQztBQWFELHdEQUVDO0FBcGtCRCw2REFBK0M7QUFDL0MsMkJBU1k7QUFDWiwyQ0FBNkI7QUFDN0IsMkNBQTZCO0FBQzdCLG1EQUFxQztBQUVyQyxNQUFNLFVBQVUsR0FBRyxFQUFFLEdBQUcsSUFBSSxHQUFHLElBQUksQ0FBQztBQUVwQzs7R0FFRztBQUNILFNBQWdCLElBQUksQ0FDbEIsT0FBZSxFQUNmLE9BSUM7SUFFRCxPQUFPLENBQUMsS0FBSyxDQUFDLEdBQUcsT0FBTyxVQUFVLE9BQU8sQ0FBQyxHQUFHLEdBQUcsQ0FBQyxDQUFDO0lBRWxELGFBQWEsQ0FBQyxRQUFRLENBQUMsT0FBTyxFQUFFO1FBQzlCLEtBQUssRUFBRSxPQUFPLENBQUMsS0FBSyxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUMsRUFBRSxNQUFNLENBQUMsRUFBRSxtREFBbUQ7UUFDbkcsU0FBUyxFQUFFLFVBQVU7UUFDckIsR0FBRyxFQUFFLE9BQU8sQ0FBQyxHQUFHO1FBQ2hCLEdBQUcsRUFBRSxPQUFPLENBQUMsR0FBRztLQUNqQixDQUFDLENBQUM7QUFDTCxDQUFDO0FBRUQ7O0dB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QUMsR0FBVyxFQUFFLFlBQXlCLElBQUk7SUFDL0QsTUFBTSxNQUFNLEdBQUcsU0FBUyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUN0QyxPQUFPLE1BQU0sS0FBSyxHQUFHLENBQUM7QUFDeEIsQ0FBQztBQUVEOzs7Ozs7R0FNRztBQUNILFNBQWdCLE1BQU0sQ0FDcEIsT0FBZSxFQUNmLE1BQWMsT0FBTyxDQUFDLEdBQUcsRUFBRTtJQUUzQixJQUFJLElBQUEsZUFBVSxFQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLE9BQU8sQ0FBQyxDQUFDLEVBQUUsQ0FBQztRQUN4QyxPQUFPLEdBQUcsQ0FBQztJQUNiLENBQUM7SUFFRCxJQUFJLE1BQU0sQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDO1FBQ2hCLGlCQUFpQjtRQUNqQixPQUFPLFNBQVMsQ0FBQztJQUNuQixDQUFDO0lBQ0QsT0FBTyxNQUFNLENBQUMsT0FBTyxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztBQUM1QyxDQUFDO0FBRUQ7Ozs7Ozs7Ozs7R0FVRztBQUNILFNBQWdCLHNCQUFzQixDQUFDLENBQVM7SUFDOUMsT0FBTyxDQUFDLENBQUMsT0FBTyxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQzFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgKiBhcyBjaGlsZF9wcm9jZXNzIGZyb20gXCJjaGlsZF9wcm9jZXNzXCI7XG5pbXBvcnQge1xuICBhY2Nlc3NTeW5jLFxuICBjaG1vZFN5bmMsXG4gIGNvbnN0YW50cyBhcyBmc19jb25zdGFudHMsXG4gIGV4aXN0c1N5bmMsXG4gIG1rZGlyU3luYyxcbiAgcHJvbWlzZXMgYXMgZnMsXG4gIHJlYWRGaWxlU3luYyxcbiAgd3JpdGVGaWxlU3luYyxcbn0gZnJvbSBcImZzXCI7XG5pbXBvcnQgKiBhcyBwYXRoIGZyb20gXCJwYXRoXCI7XG5pbXBvcnQgKiBhcyBDYXNlIGZyb20gXCJjYXNlXCI7XG5pbXBvcnQgKiBhcyBsb2dnaW5nIGZyb20gXCIuL2xvZ2dpbmdcIjtcblxuY29uc3QgTUFYX0JVRkZFUiA9IDEwICogMTAyNCAqIDEwMjQ7XG5cbi8qKlxuICogRXhlY3V0ZXMgYSBjb21tYW5kIHdpdGggU1RET1VUID4gU1RERVJSLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZXhlYyhcbiAgY29tbWFuZDogc3RyaW5nLFxuICBvcHRpb25zOiB7XG4gICAgY3dkOiBzdHJpbmc7XG4gICAgZW52PzogUmVjb3JkPHN0cmluZywgc3RyaW5nPjtcbiAgICBzdGRpbz86IGNoaWxkX3Byb2Nlc3MuU3RkaW9PcHRpb25zO1xuICB9LFxuKTogdm9pZCB7XG4gIGxvZ2dpbmcuZGVidWcoYCR7Y29tbWFuZH0gKGN3ZDogJHtvcHRpb25zLmN3ZH0pYCk7XG5cbiAgY2hpbGRfcHJvY2Vzcy5leGVjU3luYyhjb21tYW5kLCB7XG4gICAgc3RkaW86IG9wdGlvbnMuc3RkaW8gfHwgW1wiaW5oZXJpdFwiLCAyLCBcInBpcGVcIl0sIC8vIFwicGlwZVwiIGZvciBTVERFUlIgbWVhbnMgaXQgYXBwZWFycyBpbiBleGNlcHRpb25zXG4gICAgbWF4QnVmZmVyOiBNQVhfQlVGRkVSLFxuICAgIGN3ZDogb3B0aW9ucy5jd2QsXG4gICAgZW52OiBvcHRpb25zLmVudixcbiAgfSk7XG59XG5cbi8qKlxuICogRXhlY3V0ZXMgY29tbWFuZCBhbmQgcmV0dXJucyBTVERPVVQuIElmIHRoZSBjb21tYW5kIGZhaWxzIChub24temVybyksIHRocm93cyBhbiBlcnJvci5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGV4ZWNDYXB0dXJlKFxuICBjb21tYW5kOiBzdHJpbmcsXG4gIG9wdGlvbnM6IHsgY3dkOiBzdHJpbmc7IG1vZEVudj86IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gfSxcbikge1xuICBsb2dnaW5nLmRlYnVnKGAke2NvbW1hbmR9IChjd2Q6ICR7b3B0aW9ucy5jd2R9KWApO1xuXG4gIHJldHVybiBjaGlsZF9wcm9jZXNzLmV4ZWNTeW5jKGNvbW1hbmQsIHtcbiAgICBzdGRpbzogW1wiaW5oZXJpdFwiLCBcInBpcGVcIiwgXCJwaXBlXCJdLCAvLyBcInBpcGVcIiBmb3IgU1RERVJSIG1lYW5zIGl0IGFwcGVhcnMgaW4gZXhjZXB0aW9uc1xuICAgIG1heEJ1ZmZlcjogTUFYX0JVRkZFUixcbiAgICBjd2Q6IG9wdGlvbnMuY3dkLFxuICAgIGVudjoge1xuICAgICAgLi4ucHJvY2Vzcy5lbnYsXG4gICAgICAuLi5vcHRpb25zLm1vZEVudixcbiAgICB9LFxuICB9KTtcbn1cblxuLyoqXG4gKiBFeGVjdXRlcyBgY29tbWFuZGAgYW5kIHJldHVybnMgaXRzIHZhbHVlIG9yIHVuZGVmaW5lZCBpZiB0aGUgY29tbWFuZCBmYWlsZWQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBleGVjT3JVbmRlZmluZWQoXG4gIGNvbW1hbmQ6IHN0cmluZyxcbiAgb3B0aW9uczogeyBjd2Q6IHN0cmluZyB9LFxuKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgbG9nZ2luZy5kZWJ1ZyhgJHtjb21tYW5kfSAoY3dkOiAke29wdGlvbnMuY3dkfSlgKTtcblxuICB0cnkge1xuICAgIGNvbnN0IHZhbHVlID0gY2hpbGRfcHJvY2Vzc1xuICAgICAgLmV4ZWNTeW5jKGNvbW1hbmQsIHtcbiAgICAgICAgc3RkaW86IFtcImluaGVyaXRcIiwgXCJwaXBlXCIsIFwicGlwZVwiXSwgLy8gXCJwaXBlXCIgZm9yIFNUREVSUiBtZWFucyBpdCBhcHBlYXJzIGluIGV4Y2VwdGlvbnNcbiAgICAgICAgbWF4QnVmZmVyOiBNQVhfQlVGRkVSLFxuICAgICAgICBjd2Q6IG9wdGlvbnMuY3dkLFxuICAgICAgfSlcbiAgICAgIC50b1N0cmluZyhcInV0Zi04XCIpXG4gICAgICAudHJpbSgpO1xuXG4gICAgaWYgKCF2YWx1ZSkge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9IC8vIGFuIGVtcHR5IHN0cmluZyBpcyB0aGUgc2FtZSBhcyB1bmRlZmluZWRcbiAgICByZXR1cm4gdmFsdWU7XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cbn1cblxuZXhwb3J0IGludGVyZmFjZSBXcml0ZUZpbGVPcHRpb25zIHtcbiAgLyoqXG4gICAqIFdoZXRoZXIgdGhlIGdlbmVyYXRlZCBmaWxlIHNob3VsZCBiZSBtYXJrZWQgYXMgZXhlY3V0YWJsZS5cbiAgICpcbiAgICogQGRlZmF1bHQgZmFsc2VcbiAgICovXG4gIGV4ZWN1dGFibGU/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRoZSBnZW5lcmF0ZWQgZmlsZSBzaG91bGQgYmUgcmVhZG9ubHkuXG4gICAqXG4gICAqIEBkZWZhdWx0IGZhbHNlXG4gICAqL1xuICByZWFkb25seT86IGJvb2xlYW47XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRGaWxlUGVybWlzc2lvbnMob3B0aW9uczogV3JpdGVGaWxlT3B0aW9ucyk6IHN0cmluZyB7XG4gIGNvbnN0IHJlYWRvbmx5ID0gb3B0aW9ucy5yZWFkb25seSA/PyBmYWxzZTtcbiAgY29uc3QgZXhlY3V0YWJsZSA9IG9wdGlvbnMuZXhlY3V0YWJsZSA/PyBmYWxzZTtcbiAgaWYgKHJlYWRvbmx5ICYmIGV4ZWN1dGFibGUpIHtcbiAgICByZXR1cm4gXCI1NDRcIjtcbiAgfSBlbHNlIGlmIChyZWFkb25seSkge1xuICAgIHJldHVybiBcIjQ0NFwiO1xuICB9IGVsc2UgaWYgKGV4ZWN1dGFibGUpIHtcbiAgICByZXR1cm4gXCI3NTVcIjtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gXCI2NDRcIjtcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gd3JpdGVGaWxlKFxuICBmaWxlUGF0aDogc3RyaW5nLFxuICBkYXRhOiBhbnksXG4gIG9wdGlvbnM6IFdyaXRlRmlsZU9wdGlvbnMgPSB7fSxcbikge1xuICBpZiAoZXhpc3RzU3luYyhmaWxlUGF0aCkpIHtcbiAgICBjaG1vZFN5bmMoZmlsZVBhdGgsIFwiNjAwXCIpO1xuICB9XG5cbiAgbWtkaXJTeW5jKHBhdGguZGlybmFtZShmaWxlUGF0aCksIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICB3cml0ZUZpbGVTeW5jKGZpbGVQYXRoLCBkYXRhKTtcblxuICBjaG1vZFN5bmMoZmlsZVBhdGgsIGdldEZpbGVQZXJtaXNzaW9ucyhvcHRpb25zKSk7XG59XG5cbi8qKlxuICogRGVjYW1lbGl6ZXMgdGhlIGtleXMgb2YgYW4gb2JqZWN0IHN0cnVjdHVyZSwgcmVjdXJzaW5nIHRocm91Z2ggY2hpbGQgb2JqZWN0cyBhbmQgYXJyYXlzLlxuICogQGV4cGVyaW1lbnRhbFxuICovXG5leHBvcnQgaW50ZXJmYWNlIERlY2FtZWxpemVSZWN1cnNpdmVseU9wdGlvbnMge1xuICAvKipcbiAgICogTWF4IGRlcHRoIHRvIHJlY3Vyc2UgYmVmb3JlIGVycm9yaW5nLlxuICAgKiBAZGVmYXVsdCAxMFxuICAgKi9cbiAgbWF4RGVwdGg/OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdHJ1ZSB3aGVuIGEga2V5IHNob3VsZCBiZSBkZWNhbWVsaXplZFxuICAgKiBAZGVmYXVsdCAtIGFsbCBrZXlzIGFyZSBkZWNhbWVsaXplZFxuICAgKi9cbiAgc2hvdWxkRGVjYW1lbGl6ZT86IChwYXRoOiBzdHJpbmdbXSwgdmFsdWU6IGFueSkgPT4gYm9vbGVhbjtcblxuICAvKipcbiAgICogU2VwYXJhdG9yIGZvciBkZWNhbWVsaXppbmcuXG4gICAqIEBkZWZhdWx0IFwiX1wiXG4gICAqL1xuICBzZXBhcmF0b3I/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEN1cnJlbnQgcGF0aC5cbiAgICogQGludGVybmFsXG4gICAqL1xuICBwYXRoPzogc3RyaW5nW107XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBkZWNhbWVsaXplS2V5c1JlY3Vyc2l2ZWx5KFxuICBpbnB1dDogYW55LFxuICBvcHQ/OiBEZWNhbWVsaXplUmVjdXJzaXZlbHlPcHRpb25zLFxuKTogYW55IHtcbiAgY29uc3Qgc2hvdWxkQWx3YXlzRGVjYW1lbGl6ZSA9ICgpID0+IHRydWU7XG4gIGNvbnN0IHNob3VsZERlY2FtZWxpemUgPSBvcHQ/LnNob3VsZERlY2FtZWxpemUgPz8gc2hvdWxkQWx3YXlzRGVjYW1lbGl6ZTtcbiAgY29uc3Qgc2VwYXJhdG9yID0gb3B0Py5zZXBhcmF0b3IgPz8gXCJfXCI7XG4gIGNvbnN0IHBhdGhfID0gb3B0Py5wYXRoID8/IFtdO1xuICBjb25zdCBtYXhEZXB0aCA9IG9wdD8ubWF4RGVwdGggPz8gMTA7XG5cbiAgaWYgKHBhdGhfLmxlbmd0aCA+IG1heERlcHRoKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgXCJEZWNhbWVsbGVkIHRvbyBkZWVwbHkgLSBjaGVjayB0aGF0IHRoZSBpbnB1dCBoYXMgbm8gY2lyY3VsYXIgcmVmZXJlbmNlc1wiLFxuICAgICk7XG4gIH1cblxuICBpZiAoQXJyYXkuaXNBcnJheShpbnB1dCkpIHtcbiAgICByZXR1cm4gaW5wdXQubWFwKChrLCBpKSA9PlxuICAgICAgZGVjYW1lbGl6ZUtleXNSZWN1cnNpdmVseShrLCB7XG4gICAgICAgIC4uLm9wdCxcbiAgICAgICAgcGF0aDogWy4uLnBhdGhfLCBpLnRvU3RyaW5nKCldLFxuICAgICAgfSksXG4gICAgKTtcbiAgfVxuXG4gIGlmICh0eXBlb2YgaW5wdXQgPT09IFwib2JqZWN0XCIgJiYgaW5wdXQgIT09IG51bGwpIHtcbiAgICBjb25zdCBtYXBwZWRPYmplY3Q6IFJlY29yZDxzdHJpbmcsIGFueT4gPSB7fTtcbiAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhpbnB1dCkpIHtcbiAgICAgIGNvbnN0IHRyYW5zZm9ybWVkS2V5ID0gc2hvdWxkRGVjYW1lbGl6ZShbLi4ucGF0aF8sIGtleV0sIHZhbHVlKVxuICAgICAgICA/IGRlY2FtZWxpemUoa2V5LCBzZXBhcmF0b3IpXG4gICAgICAgIDoga2V5O1xuXG4gICAgICBtYXBwZWRPYmplY3RbdHJhbnNmb3JtZWRLZXldID0gZGVjYW1lbGl6ZUtleXNSZWN1cnNpdmVseSh2YWx1ZSwge1xuICAgICAgICAuLi5vcHQsXG4gICAgICAgIHBhdGg6IFsuLi5wYXRoXywga2V5XSxcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHJldHVybiBtYXBwZWRPYmplY3Q7XG4gIH1cblxuICByZXR1cm4gaW5wdXQ7XG59XG5cbi8qKlxuICogUmV0dXJucyBmYWxzZSBpZiB2YWx1ZSBpcyB1bnNldCBvciBhIGZhbHNleSB2YWx1ZSwgYW5kIHRydWUgb3RoZXJ3aXNlLlxuICogQHBhcmFtIHZhbHVlIGFuIGVudmlyb25tZW50IHZhcmlhYmxlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc1RydXRoeSh2YWx1ZTogc3RyaW5nIHwgdW5kZWZpbmVkKTogYm9vbGVhbiB7XG4gIHJldHVybiAhKFxuICAgIHZhbHVlID09PSB1bmRlZmluZWQgfHxcbiAgICBbXCJudWxsXCIsIFwidW5kZWZpbmVkXCIsIFwiMFwiLCBcImZhbHNlXCIsIFwiXCJdLmluY2x1ZGVzKHZhbHVlLnRvTG9jYWxlTG93ZXJDYXNlKCkpXG4gICk7XG59XG5cbi8qKlxuICogVHlwZSBvZiBhIG1hcCBtYXBwaW5nIHN0cmluZ3MgdG8gc29tZSBhcmJpdHJhcnkgdHlwZVxuICovXG5leHBvcnQgdHlwZSBPYmo8VD4gPSB7IFtrZXk6IHN0cmluZ106IFQgfTtcblxuLyoqXG4gKiBSZXR1cm4gd2hldGhlciB0aGUgZ2l2ZW4gdmFsdWUgaXMgYSBwbGFpbiBzdHJ1Y3Qgb2JqZWN0XG4gKlxuICogRXZlbiB0aG91Z2ggYXJyYXlzIGFuZCBpbnN0YW5jZXMgb2YgY2xhc3NlcyB0ZWNobmljYWxseSBhcmUgb2JqZWN0cywgd2VcbiAqIHVzdWFsbHkgd2FudCB0byB0cmVhdCB0aGVtIGRpZmZlcmVudGx5LCBzbyB3ZSByZXR1cm4gZmFsc2UgaW4gdGhvc2UgY2FzZXMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc09iamVjdCh4OiBhbnkpOiB4IGlzIE9iajxhbnk+IHtcbiAgcmV0dXJuIChcbiAgICB4ICE9PSBudWxsICYmXG4gICAgdHlwZW9mIHggPT09IFwib2JqZWN0XCIgJiZcbiAgICAhQXJyYXkuaXNBcnJheSh4KSAmJlxuICAgIHguY29uc3RydWN0b3IubmFtZSA9PT0gXCJPYmplY3RcIlxuICApO1xufVxuXG4vKipcbiAqIENvbmZpZ3VyZSB0aGUgYmVoYXZpb3Igb2YgYGRlZXBNZXJnZWAuXG4gKi9cbmludGVyZmFjZSBNZXJnZU9wdGlvbnMge1xuICAvKipcbiAgICogV2hldGhlciB0byBkZWxldGUga2V5cyB3aXRoIGB1bmRlZmluZWRgIHZhbHVlcy5cbiAgICpcbiAgICogQGRlZmF1bHQgZmFsc2VcbiAgICovXG4gIHJlYWRvbmx5IGRlc3RydWN0aXZlPzogYm9vbGVhbjtcbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gbWVyZ2UgYXJyYXlzLlxuICAgKlxuICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgKi9cbiAgcmVhZG9ubHkgbWVyZ2VBcnJheXM/OiBib29sZWFuO1xufVxuXG4vKipcbiAqIFJlY3Vyc2l2ZWx5IG1lcmdlIG9iamVjdHMgdG9nZXRoZXJcbiAqXG4gKiBUaGUgbGVmdG1vc3Qgb2JqZWN0IGlzIG11dGF0ZWQgYW5kIHJldHVybmVkLlxuICpcbiAqIElmIGFuIG9iamVjdCBpcyBtZXJnZWQgaW50byBzb21ldGhpbmcgb3RoZXIgdGhhbiBhbiBvYmplY3QsIHRoZSBub24tb2JqZWN0IGlzIGxvc3QuXG4gKiBBcnJheXMgYXJlIG92ZXJ3cml0dGVuIG5vdCBtZXJnZWQ7IHNldCBgbWVyZ2VBcnJheXM6IHRydWVgIHRvIG1lcmdlIGFycmF5cyBhbmQgZGVkdXBsaWNhdGUgdGhlIHJlc3VsdC5cbiAqIEFuIGB1bmRlZmluZWRgIGtleSBpbiBhIHNvdXJjZSBvYmplY3Qgd2lsbCBwZXJzaXN0OyBzZXQgYGRlc3RydWN0aXZlOiB0cnVlYCB0byBmdWxseSByZW1vdmUgdGhlIGtleSBpbnN0ZWFkLlxuICogRW1wdHkgb2JqZWN0cyBhcyB2YWx1ZXMgYXJlIHByZXNlcnZlZCBpbiB0aGUgb3V0cHV0OyBzZXQgYGRlc3RydWN0aXZlOiB0cnVlYCB0byByZW1vdmUgdGhlbSBpbnN0ZWFkLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZGVlcE1lcmdlKFxuICBvYmplY3RzOiBBcnJheTxPYmo8YW55PiB8IHVuZGVmaW5lZD4sXG4gIHsgZGVzdHJ1Y3RpdmUgPSBmYWxzZSwgbWVyZ2VBcnJheXMgPSBmYWxzZSB9OiBNZXJnZU9wdGlvbnMgPSB7fSxcbikge1xuICBmdW5jdGlvbiBtZXJnZU9uZSh0YXJnZXQ6IE9iajxhbnk+LCBzb3VyY2U6IE9iajxhbnk+KSB7XG4gICAgZm9yIChjb25zdCBrZXkgb2YgT2JqZWN0LmtleXMoc291cmNlKSkge1xuICAgICAgLy8gUHJldmVudCBwcm90b3R5cGUgcG9sbHV0aW9uIGJ5IGJsb2NraW5nIGRhbmdlcm91cyBrZXlzXG4gICAgICBpZiAoa2V5ID09PSBcIl9fcHJvdG9fX1wiIHx8IGtleSA9PT0gXCJjb25zdHJ1Y3RvclwiIHx8IGtleSA9PT0gXCJwcm90b3R5cGVcIikge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHZhbHVlID0gc291cmNlW2tleV07XG5cbiAgICAgIC8vIGlmIHRoZSBjdXJyZW50IHZhbHVlIGlzIGEgcGxhaW4gb2JqZWN0LCB3ZSByZWN1cnNpdmVseSBtZXJnZSBpdFxuICAgICAgaWYgKGlzT2JqZWN0KHZhbHVlKSkge1xuICAgICAgICAvLyBpZiB0aGUgdmFsdWUgYXQgdGhlIHRhcmdldCBpcyBub3QgYW4gb2JqZWN0LCBvdmVycmlkZSBpdCB3aXRoIGFuXG4gICAgICAgIC8vIG9iamVjdCBzbyB3ZSBjYW4gY29udGludWUgdGhlIHJlY3Vyc2lvblxuICAgICAgICBpZiAodHlwZW9mIHRhcmdldFtrZXldICE9PSBcIm9iamVjdFwiKSB7XG4gICAgICAgICAgdGFyZ2V0W2tleV0gPSB2YWx1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFNwZWNpYWwgaGFuZGxpbmcgZm9yIF9fJEFQUEVORCwgd2hpY2ggaXMgdXNlZCB0byBhcHBlbmQgdmFsdWVzIHRvIGFycmF5c1xuICAgICAgICBpZiAoXCJfXyRBUFBFTkRcIiBpbiB2YWx1ZSAmJiBBcnJheS5pc0FycmF5KHZhbHVlLl9fJEFQUEVORCkpIHtcbiAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheSh0YXJnZXRba2V5XSkpIHtcbiAgICAgICAgICAgIHRhcmdldFtrZXldLnB1c2goLi4udmFsdWUuX18kQVBQRU5EKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGFyZ2V0W2tleV0gPSB2YWx1ZS5fXyRBUFBFTkQ7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gcmVjdXJzaXZlbHkgbWVyZ2UgdGhlIG9iamVjdFxuICAgICAgICBtZXJnZU9uZSh0YXJnZXRba2V5XSwgdmFsdWUpO1xuXG4gICAgICAgIC8vIGlmIHRoZSByZXN1bHQgb2YgdGhlIG1lcmdlIGlzIGFuIGVtcHR5IG9iamVjdCwgaXQncyBiZWNhdXNlIHRoZVxuICAgICAgICAvLyBldmVudHVhbCB2YWx1ZSB3ZSBhc3NpZ25lZCBpcyBgdW5kZWZpbmVkYCwgYW5kIHRoZXJlIGFyZSBub1xuICAgICAgICAvLyBzaWJsaW5nIGNvbmNyZXRlIHZhbHVlcyBhbG9uZ3NpZGUsIHNvIHdlIGNhbiBkZWxldGUgdGhpcyB0cmVlLlxuICAgICAgICBpZiAoXG4gICAgICAgICAgZGVzdHJ1Y3RpdmUgJiZcbiAgICAgICAgICB0eXBlb2YgdGFyZ2V0W2tleV0gPT09IFwib2JqZWN0XCIgJiZcbiAgICAgICAgICBPYmplY3Qua2V5cyh0YXJnZXRba2V5XSkubGVuZ3RoID09PSAwXG4gICAgICAgICkge1xuICAgICAgICAgIGRlbGV0ZSB0YXJnZXRba2V5XTtcbiAgICAgICAgfVxuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgLy8gaW4gZGVzdHJ1Y3RpdmUgbW9kZSwgd2UgZGVsZXRlIHRoZSBleGlzdGluZyBrZXkgaWYgdGhlIHZhbHVlIGlzIHVuZGVmaW5lZFxuICAgICAgaWYgKGRlc3RydWN0aXZlICYmIHZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgZGVsZXRlIHRhcmdldFtrZXldO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgLy8gaW4gYXJyYXkgbWVyZ2luZyBtb2RlLCB3ZSBtZXJnZSBhbmQgZGVkdXBsaWNhdGUgYXJyYXlzXG4gICAgICBpZiAobWVyZ2VBcnJheXMgJiYgQXJyYXkuaXNBcnJheSh0YXJnZXRba2V5XSkgJiYgQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgICAgdGFyZ2V0W2tleV0gPSBbLi4ubmV3IFNldChbLi4udGFyZ2V0W2tleV0sIC4uLnZhbHVlXSldO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgLy8gYWxsIG90aGVyIHZhbHVlcyBhcmUgc2ltcGx5IG92ZXJ3cml0dGVuIGJ5IG92ZXJyaWRpbmcgb2JqZWN0XG4gICAgICBpZiAodHlwZW9mIHZhbHVlICE9PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgICAgIHRhcmdldFtrZXldID0gdmFsdWU7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGNvbnN0IG90aGVycyA9IG9iamVjdHMuZmlsdGVyKCh4KSA9PiB4ICE9IG51bGwpIGFzIEFycmF5PE9iajxhbnk+PjtcblxuICBpZiAob3RoZXJzLmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybiB7fTtcbiAgfVxuICBjb25zdCBpbnRvID0gb3RoZXJzLnNwbGljZSgwLCAxKVswXTtcblxuICBvdGhlcnMuZm9yRWFjaCgob3RoZXIpID0+IG1lcmdlT25lKGludG8sIG90aGVyKSk7XG4gIHJldHVybiBpbnRvO1xufVxuXG4vKlxuICogRGVkdXBsaWNhdGUgdmFsdWVzIGluIGEgbGlzdCwgcmV0dXJuaW5nIGEgbmV3IGFycmF5LlxuICogQHBhcmFtIGFycmF5IGxpc3Qgb2YgdmFsdWVzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkZWR1cEFycmF5PFQ+KGFycmF5OiBUW10pOiBUW10ge1xuICByZXR1cm4gYXJyYXkuZmlsdGVyKCh2YWwsIGlkeCkgPT4gYXJyYXkuaW5kZXhPZih2YWwpID09PSBpZHgpO1xufVxuXG4vKipcbiAqIFJldHVybnMgYSBzb3J0ZWQgdmVyc2lvbiBvZiBgeGAgb3IgYHVuZGVmaW5lZGAgaWYgaXQgaXMgYW4gZW1wdHkgYXJyYXkgb3Igb2JqZWN0LlxuICovXG5leHBvcnQgZnVuY3Rpb24gc29ydGVkPFQ+KHg6IFQpIHtcbiAgaWYgKHggPT0gbnVsbCkge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cbiAgaWYgKEFycmF5LmlzQXJyYXkoeCkpIHtcbiAgICBpZiAoeC5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuICAgIHJldHVybiAoeCBhcyB1bmtub3duW10pLnNvcnQoKTtcbiAgfSBlbHNlIGlmICh0eXBlb2YgeCA9PT0gXCJvYmplY3RcIikge1xuICAgIGlmIChPYmplY3Qua2V5cyh4KS5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuICAgIGNvbnN0IHJlc3VsdDogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPSB7fTtcbiAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyh4KS5zb3J0KChbbF0sIFtyXSkgPT5cbiAgICAgIGwubG9jYWxlQ29tcGFyZShyKSxcbiAgICApKSB7XG4gICAgICByZXN1bHRba2V5XSA9IHZhbHVlO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0IGFzIFQ7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIHg7XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGZvcm1hdEFzUHl0aG9uTW9kdWxlKG5hbWU6IHN0cmluZykge1xuICByZXR1cm4gbmFtZS5yZXBsYWNlKC8tL2csIFwiX1wiKS5yZXBsYWNlKC9cXC4vZywgXCJfXCIpO1xufVxuXG4vKipcbiAqIEV4dHJhY3QgZ2l0IHZlcnNpb24gbnVtYmVyIGZyb20gY29tbWFuZCBsaW5lXG4gKlxuICogQHBhcmFtIGdpdFZlcnNpb25PdXRwdXQgdGhlIG91dHB1dCBmcm9tIGBnaXQgdmVyc2lvbmAgQ0xJXG4gKiBAcmV0dXJucyB0aGUgdmVyc2lvbiBvZiBnaXRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldEdpdFZlcnNpb24oZ2l0VmVyc2lvbk91dHB1dDogc3RyaW5nKSB7XG4gIGNvbnN0IG1hdGNoID0gZ2l0VmVyc2lvbk91dHB1dC5tYXRjaCgvXFxkKy5cXGQrLlxcZCsvKTtcbiAgaWYgKCFtYXRjaCkge1xuICAgIHRocm93IG5ldyBFcnJvcihcIlVuYWJsZSB0byByZXRyaWV2ZSBnaXQgdmVyc2lvblwiKTtcbiAgfVxuXG4gIHJldHVybiBtYXRjaFswXTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGtlYmFiQ2FzZUtleXM8VCA9IHVua25vd24+KG9iajogVCwgcmVjdXJzaXZlID0gdHJ1ZSk6IFQge1xuICBpZiAodHlwZW9mIG9iaiAhPT0gXCJvYmplY3RcIiB8fCBvYmogPT0gbnVsbCkge1xuICAgIHJldHVybiBvYmo7XG4gIH1cblxuICBpZiAoQXJyYXkuaXNBcnJheShvYmopKSB7XG4gICAgaWYgKHJlY3Vyc2l2ZSkge1xuICAgICAgb2JqID0gb2JqLm1hcCgodikgPT4ga2ViYWJDYXNlS2V5cyh2LCByZWN1cnNpdmUpKSBhcyBhbnk7XG4gICAgfVxuICAgIHJldHVybiBvYmo7XG4gIH1cblxuICBjb25zdCByZXN1bHQ6IFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0ge307XG4gIGZvciAobGV0IFtrLCB2XSBvZiBPYmplY3QuZW50cmllcyhvYmopKSB7XG4gICAgaWYgKHJlY3Vyc2l2ZSkge1xuICAgICAgdiA9IGtlYmFiQ2FzZUtleXModiwgcmVjdXJzaXZlKTtcbiAgICB9XG4gICAgcmVzdWx0W2RlY2FtZWxpemUoaykucmVwbGFjZSgvXy9nbSwgXCItXCIpXSA9IHY7XG4gIH1cbiAgcmV0dXJuIHJlc3VsdCBhcyBhbnk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBzbmFrZUNhc2VLZXlzPFQgPSB1bmtub3duPihcbiAgb2JqOiBULFxuICByZWN1cnNpdmUgPSB0cnVlLFxuICBleGNsdXNpdmVGb3JSZWNvcmRLZXlzOiBzdHJpbmdbXSA9IFtdLFxuKTogVCB7XG4gIGlmICh0eXBlb2Ygb2JqICE9PSBcIm9iamVjdFwiIHx8IG9iaiA9PSBudWxsKSB7XG4gICAgcmV0dXJuIG9iajtcbiAgfVxuXG4gIGlmIChBcnJheS5pc0FycmF5KG9iaikpIHtcbiAgICBpZiAocmVjdXJzaXZlKSB7XG4gICAgICBvYmogPSBvYmoubWFwKCh2KSA9PlxuICAgICAgICBzbmFrZUNhc2VLZXlzKHYsIHJlY3Vyc2l2ZSwgZXhjbHVzaXZlRm9yUmVjb3JkS2V5cyksXG4gICAgICApIGFzIGFueTtcbiAgICB9XG4gICAgcmV0dXJuIG9iajtcbiAgfVxuXG4gIGNvbnN0IHJlc3VsdDogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPSB7fTtcbiAgZm9yIChsZXQgW2ssIHZdIG9mIE9iamVjdC5lbnRyaWVzKG9iaikpIHtcbiAgICBpZiAocmVjdXJzaXZlKSB7XG4gICAgICB2ID0gc25ha2VDYXNlS2V5cyh2LCByZWN1cnNpdmUsIGV4Y2x1c2l2ZUZvclJlY29yZEtleXMpO1xuICAgIH1cbiAgICBjb25zdCBtb2RpZmllZEtleSA9XG4gICAgICBleGNsdXNpdmVGb3JSZWNvcmRLZXlzLmxlbmd0aCA9PSAwIHx8IGV4Y2x1c2l2ZUZvclJlY29yZEtleXMuaW5jbHVkZXMoaylcbiAgICAgICAgPyBDYXNlLnNuYWtlKGspXG4gICAgICAgIDogaztcbiAgICByZXN1bHRbbW9kaWZpZWRLZXldID0gdjtcbiAgfVxuICByZXR1cm4gcmVzdWx0IGFzIGFueTtcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHRyeVJlYWRGaWxlKGZpbGU6IHN0cmluZykge1xuICBpZiAoIWV4aXN0c1N5bmMoZmlsZSkpIHtcbiAgICByZXR1cm4gXCJcIjtcbiAgfVxuXG4gIHJldHVybiBmcy5yZWFkRmlsZShmaWxlLCBcInV0Zi04XCIpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gdHJ5UmVhZEZpbGVTeW5jKGZpbGU6IHN0cmluZykge1xuICBpZiAoIWV4aXN0c1N5bmMoZmlsZSkpIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG5cbiAgcmV0dXJuIHJlYWRGaWxlU3luYyhmaWxlLCBcInV0Zi04XCIpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNXcml0YWJsZShmaWxlOiBzdHJpbmcpIHtcbiAgdHJ5IHtcbiAgICBhY2Nlc3NTeW5jKGZpbGUsIGZzX2NvbnN0YW50cy5XX09LKTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG59XG5cbi8qKlxuICogQXNzZXJ0cyB0aGF0IHRoZSBmaWxlIHNob3VsZCBiZSBleGVjdXRhYmxlLiBBbHdheXMgcmV0dXJucyB0cnVlIG9uIFdpbmRvd3MuXG4gKlxuICogSW4gV2luZG93cywgdGhlIGV4ZWN1dGFibGUgYXR0cmlidXRlIGlzIHN0b3JlZCBpbiB0aGUgc3lzdGVtIHNldHRpbmcgUEFUSEVYVCwgbm90IGluIGVhY2ggZmlsZS4gVGhlbiwgY2hlY2tpbmcgZm9yIGV4ZWN1dGFiaWxpdHkgaXMgZXF1aXZhbGVudCB0byBjaGVja2luZyBmb3IgZXhpc3RlbmNlLiBUbyBieXBhc3MgY2hlY2tpbmcgZm9yIGV4ZWN1dGFiaWxpdHksIHdlIGFsd2F5cyByZXR1cm4gdHJ1ZSBvbiBXaW5kb3dzLlxuICpcbiAqIEBwYXJhbSBmaWxlUGF0aCBUaGUgcGF0aCB0byB0aGUgZmlsZVxuICogQHBhcmFtIHNob3VsZEJlRXhlY3V0YWJsZSBXaGV0aGVyIHRoZSBmaWxlIHNob3VsZCBiZSBleGVjdXRhYmxlXG4gKiBAcmV0dXJucyB0cnVlIGlmIGBmaWxlUGF0aGAgZXhlY3V0YWJsZSBhdHRyaWJ1dGUgbWF0Y2hlcyBgc2hvdWxkQmVFeGVjdXRhYmxlYCBvciBpZiB0aGUgcGxhdGZvcm0gaXMgV2luZG93cywgZmFsc2Ugb3RoZXJ3aXNlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhc3NlcnRFeGVjdXRhYmxlUGVybWlzc2lvbnMoXG4gIGZpbGVQYXRoOiBzdHJpbmcsXG4gIHNob3VsZEJlRXhlY3V0YWJsZTogYm9vbGVhbixcbik6IGJvb2xlYW4ge1xuICBjb25zdCBpc1dpbmRvd3MgPSBwcm9jZXNzLnBsYXRmb3JtID09PSBcIndpbjMyXCI7XG4gIGlmIChpc1dpbmRvd3MpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIGNvbnN0IHByZXZFeGVjdXRhYmxlID0gaXNFeGVjdXRhYmxlKGZpbGVQYXRoKTtcblxuICByZXR1cm4gcHJldkV4ZWN1dGFibGUgPT09IHNob3VsZEJlRXhlY3V0YWJsZTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzRXhlY3V0YWJsZShmaWxlOiBzdHJpbmcpIHtcbiAgdHJ5IHtcbiAgICBhY2Nlc3NTeW5jKGZpbGUsIGZzX2NvbnN0YW50cy5YX09LKTtcblxuICAgIHJldHVybiB0cnVlO1xuICB9IGNhdGNoIChlKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG59XG5cbmZ1bmN0aW9uIGRlY2FtZWxpemUoczogc3RyaW5nLCBzZXA6IHN0cmluZyA9IFwiX1wiKSB7XG4gIGlmIChDYXNlLm9mKHMpID09PSBcImNhbWVsXCIpIHtcbiAgICByZXR1cm4gQ2FzZS5sb3dlcihzLCBzZXApO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiBzO1xuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXROb2RlTWFqb3JWZXJzaW9uKCk6IG51bWJlciB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IG1hdGNoID0gcHJvY2Vzcy52ZXJzaW9uLm1hdGNoKC8oXFxkKylcXC4oXFxkKylcXC4oXFxkKykvKTtcbiAgaWYgKG1hdGNoKSB7XG4gICAgY29uc3QgW21ham9yXSA9IG1hdGNoLnNsaWNlKDEpLm1hcCgoeCkgPT4gcGFyc2VJbnQoeCkpO1xuICAgIHJldHVybiBtYWpvcjtcbiAgfVxuICByZXR1cm4gdW5kZWZpbmVkO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gYW55U2VsZWN0ZWQob3B0aW9uczogKGJvb2xlYW4gfCB1bmRlZmluZWQpW10pOiBib29sZWFuIHtcbiAgcmV0dXJuIG9wdGlvbnMuc29tZSgob3B0KSA9PiBvcHQpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gbXVsdGlwbGVTZWxlY3RlZChvcHRpb25zOiAoYm9vbGVhbiB8IHVuZGVmaW5lZClbXSk6IGJvb2xlYW4ge1xuICByZXR1cm4gb3B0aW9ucy5maWx0ZXIoKG9wdCkgPT4gb3B0KS5sZW5ndGggPiAxO1xufVxuXG4vKipcbiAqIENoZWNrcyBpZiBhIHBhdGggaXMgYSBGUyByb290XG4gKlxuICogT3B0aW9uYWwgdXNlcyBhIHByb3ZpZGVkIE9TIHNwZWNpZmljIHBhdGggaW1wbGVtZW50YXRpb24sXG4gKiBkZWZhdWx0cyB0byB1c2UgdGhlIGltcGxlbWVudGF0aW9uIGZvciB0aGUgY3VycmVudCBPUy5cbiAqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzUm9vdChkaXI6IHN0cmluZywgb3NQYXRoTGliOiB0eXBlb2YgcGF0aCA9IHBhdGgpOiBib29sZWFuIHtcbiAgY29uc3QgcGFyZW50ID0gb3NQYXRoTGliLmRpcm5hbWUoZGlyKTtcbiAgcmV0dXJuIHBhcmVudCA9PT0gZGlyO1xufVxuXG4vKipcbiAqIFJ1biB1cCBwcm9qZWN0IHRyZWUgdG8gZmluZCBhIGZpbGUgb3IgZGlyZWN0b3J5XG4gKlxuICogQHBhcmFtIGxvb2tGb3IgdGhlIGZpbGUgb3IgZGlyZWN0b3J5IHRvIGxvb2sgZm9yXG4gKiBAcGFyYW0gY3dkIGN1cnJlbnQgd29ya2luZyBkaXJlY3RvcnksIG11c3QgYmUgYW4gYWJzb2x1dGUgcGF0aFxuICogQHJldHVybnMgcGF0aCB0byB0aGUgZmlsZSBvciBkaXJlY3Rvcnkgd2UgYXJlIGxvb2tpbmcgZm9yLCB1bmRlZmluZWQgaWYgbm90IGZvdW5kXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmaW5kVXAoXG4gIGxvb2tGb3I6IHN0cmluZyxcbiAgY3dkOiBzdHJpbmcgPSBwcm9jZXNzLmN3ZCgpLFxuKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgaWYgKGV4aXN0c1N5bmMocGF0aC5qb2luKGN3ZCwgbG9va0ZvcikpKSB7XG4gICAgcmV0dXJuIGN3ZDtcbiAgfVxuXG4gIGlmIChpc1Jvb3QoY3dkKSkge1xuICAgIC8vIFRoaXMgaXMgYSByb290XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuICByZXR1cm4gZmluZFVwKGxvb2tGb3IsIHBhdGguZGlybmFtZShjd2QpKTtcbn1cblxuLyoqXG4gKiBOb3JtYWxpemVzIGEgcGF0aCB0aGF0IGlzIGdvaW5nIHRvIGJlIHBlcnNpc3RlZCB0byBoYXZlIGEgY3Jvc3MgcGxhdGZvcm0gcmVwcmVzZW50YXRpb24uXG4gKlxuICogTm9ybWFsaXplZCBwYXRocyBjYW4gYmUgcGVyc2lzdGVkIGFuZCBkb2Vzbid0IG5lZWQgdG8gYmUgbW9kaWZpZWQgd2hlbiB0aGUgcGxhdGZvcm0gY2hhbmdlcy5cbiAqIGBub3JtYWxpemVQZXJzaXN0ZWRQYXRoYCB0YWtlcyBjYXJlIG9mIHBsYXRmb3JtLXNwZWNpZmljIHByb3BlcnRpZXMgbGlrZSBkaXJlY3Rvcnkgc2VwYXJhdG9yLlxuICogSXQgdXNlcyBgcGF0aC5wb3NpeC5zZXBgIHRoYXQgaXMgc3VwcG9ydGVkIGJvdGggaW4gV2luZG93cyBhbmQgVW5peCBwbGF0Zm9ybXMuXG4gKlxuICpcbiAqIEBwYXJhbSBwIHRoZSBwYXRoIHRvIGJlIG5vcm1hbGl6ZWRcbiAqIEByZXR1cm5zIHRoZSBub3JtYWxpemVkIHBhdGhcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG5vcm1hbGl6ZVBlcnNpc3RlZFBhdGgocDogc3RyaW5nKSB7XG4gIHJldHVybiBwLnJlcGxhY2UoL1xcXFwvZywgcGF0aC5wb3NpeC5zZXApO1xufVxuIl19
|
|
410
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy91dGlsLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBNkJBLGdEQVlDO0FBRUQsOEJBYUM7QUFnQ0QsOERBMENDO0FBTUQsNEJBS0M7QUFhRCw0QkFPQztBQThCRCw4QkEwRUM7QUFNRCxnQ0FFQztBQUtELHdCQXVCQztBQUVELG9EQUVDO0FBUUQsc0NBT0M7QUFFRCxzQ0FvQkM7QUFFRCxzQ0E4QkM7QUFFRCxrQ0FNQztBQUVELDBDQU1DO0FBRUQsZ0NBT0M7QUFXRCxrRUFZQztBQUVELG9DQVFDO0FBVUQsa0RBT0M7QUFFRCxrQ0FFQztBQUVELDRDQUVDO0FBVUQsd0JBR0M7QUFTRCx3QkFhQztBQWFELHdEQUVDO0FBM2ZELDJCQVNZO0FBQ1osMkNBQTZCO0FBQzdCLDJDQUE2QjtBQWtCN0IsU0FBZ0Isa0JBQWtCLENBQUMsT0FBeUI7SUFDMUQsTUFBTSxRQUFRLEdBQUcsT0FBTyxDQUFDLFFBQVEsSUFBSSxLQUFLLENBQUM7SUFDM0MsTUFBTSxVQUFVLEdBQUcsT0FBTyxDQUFDLFVBQVUsSUFBSSxLQUFLLENBQUM7SUFDL0MsSUFBSSxRQUFRLElBQUksVUFBVSxFQUFFLENBQUM7UUFDM0IsT0FBTyxLQUFLLENBQUM7SUFDZixDQUFDO1NBQU0sSUFBSSxRQUFRLEVBQUUsQ0FBQztRQUNwQixPQUFPLEtBQUssQ0FBQztJQUNmLENBQUM7U0FBTSxJQUFJLFVBQVUsRUFBRSxDQUFDO1FBQ3RCLE9BQU8sS0FBSyxDQUFDO0lBQ2YsQ0FBQztTQUFNLENBQUM7UUFDTixPQUFPLEtBQUssQ0FBQztJQUNmLENBQUM7QUFDSCxDQUFDO0FBRUQsU0FBZ0IsU0FBUyxDQUN2QixRQUFnQixFQUNoQixJQUFTLEVBQ1QsVUFBNEIsRUFBRTtJQUU5QixJQUFJLElBQUEsZUFBVSxFQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUM7UUFDekIs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QUFDLENBQUM7QUFDNUMsQ0FBQztBQUVEOzs7Ozs7Ozs7O0dBVUc7QUFDSCxTQUFnQixzQkFBc0IsQ0FBQyxDQUFTO0lBQzlDLE9BQU8sQ0FBQyxDQUFDLE9BQU8sQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUMxQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgYWNjZXNzU3luYyxcbiAgY2htb2RTeW5jLFxuICBjb25zdGFudHMgYXMgZnNfY29uc3RhbnRzLFxuICBleGlzdHNTeW5jLFxuICBta2RpclN5bmMsXG4gIHByb21pc2VzIGFzIGZzLFxuICByZWFkRmlsZVN5bmMsXG4gIHdyaXRlRmlsZVN5bmMsXG59IGZyb20gXCJmc1wiO1xuaW1wb3J0ICogYXMgcGF0aCBmcm9tIFwicGF0aFwiO1xuaW1wb3J0ICogYXMgQ2FzZSBmcm9tIFwiY2FzZVwiO1xuXG5leHBvcnQgaW50ZXJmYWNlIFdyaXRlRmlsZU9wdGlvbnMge1xuICAvKipcbiAgICogV2hldGhlciB0aGUgZ2VuZXJhdGVkIGZpbGUgc2hvdWxkIGJlIG1hcmtlZCBhcyBleGVjdXRhYmxlLlxuICAgKlxuICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgKi9cbiAgZXhlY3V0YWJsZT86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdGhlIGdlbmVyYXRlZCBmaWxlIHNob3VsZCBiZSByZWFkb25seS5cbiAgICpcbiAgICogQGRlZmF1bHQgZmFsc2VcbiAgICovXG4gIHJlYWRvbmx5PzogYm9vbGVhbjtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldEZpbGVQZXJtaXNzaW9ucyhvcHRpb25zOiBXcml0ZUZpbGVPcHRpb25zKTogc3RyaW5nIHtcbiAgY29uc3QgcmVhZG9ubHkgPSBvcHRpb25zLnJlYWRvbmx5ID8/IGZhbHNlO1xuICBjb25zdCBleGVjdXRhYmxlID0gb3B0aW9ucy5leGVjdXRhYmxlID8/IGZhbHNlO1xuICBpZiAocmVhZG9ubHkgJiYgZXhlY3V0YWJsZSkge1xuICAgIHJldHVybiBcIjU0NFwiO1xuICB9IGVsc2UgaWYgKHJlYWRvbmx5KSB7XG4gICAgcmV0dXJuIFwiNDQ0XCI7XG4gIH0gZWxzZSBpZiAoZXhlY3V0YWJsZSkge1xuICAgIHJldHVybiBcIjc1NVwiO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiBcIjY0NFwiO1xuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB3cml0ZUZpbGUoXG4gIGZpbGVQYXRoOiBzdHJpbmcsXG4gIGRhdGE6IGFueSxcbiAgb3B0aW9uczogV3JpdGVGaWxlT3B0aW9ucyA9IHt9LFxuKSB7XG4gIGlmIChleGlzdHNTeW5jKGZpbGVQYXRoKSkge1xuICAgIGNobW9kU3luYyhmaWxlUGF0aCwgXCI2MDBcIik7XG4gIH1cblxuICBta2RpclN5bmMocGF0aC5kaXJuYW1lKGZpbGVQYXRoKSwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gIHdyaXRlRmlsZVN5bmMoZmlsZVBhdGgsIGRhdGEpO1xuXG4gIGNobW9kU3luYyhmaWxlUGF0aCwgZ2V0RmlsZVBlcm1pc3Npb25zKG9wdGlvbnMpKTtcbn1cblxuLyoqXG4gKiBEZWNhbWVsaXplcyB0aGUga2V5cyBvZiBhbiBvYmplY3Qgc3RydWN0dXJlLCByZWN1cnNpbmcgdGhyb3VnaCBjaGlsZCBvYmplY3RzIGFuZCBhcnJheXMuXG4gKiBAZXhwZXJpbWVudGFsXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRGVjYW1lbGl6ZVJlY3Vyc2l2ZWx5T3B0aW9ucyB7XG4gIC8qKlxuICAgKiBNYXggZGVwdGggdG8gcmVjdXJzZSBiZWZvcmUgZXJyb3JpbmcuXG4gICAqIEBkZWZhdWx0IDEwXG4gICAqL1xuICBtYXhEZXB0aD86IG51bWJlcjtcblxuICAvKipcbiAgICogUmV0dXJucyB0cnVlIHdoZW4gYSBrZXkgc2hvdWxkIGJlIGRlY2FtZWxpemVkXG4gICAqIEBkZWZhdWx0IC0gYWxsIGtleXMgYXJlIGRlY2FtZWxpemVkXG4gICAqL1xuICBzaG91bGREZWNhbWVsaXplPzogKHBhdGg6IHN0cmluZ1tdLCB2YWx1ZTogYW55KSA9PiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBTZXBhcmF0b3IgZm9yIGRlY2FtZWxpemluZy5cbiAgICogQGRlZmF1bHQgXCJfXCJcbiAgICovXG4gIHNlcGFyYXRvcj86IHN0cmluZztcblxuICAvKipcbiAgICogQ3VycmVudCBwYXRoLlxuICAgKiBAaW50ZXJuYWxcbiAgICovXG4gIHBhdGg/OiBzdHJpbmdbXTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGRlY2FtZWxpemVLZXlzUmVjdXJzaXZlbHkoXG4gIGlucHV0OiBhbnksXG4gIG9wdD86IERlY2FtZWxpemVSZWN1cnNpdmVseU9wdGlvbnMsXG4pOiBhbnkge1xuICBjb25zdCBzaG91bGRBbHdheXNEZWNhbWVsaXplID0gKCkgPT4gdHJ1ZTtcbiAgY29uc3Qgc2hvdWxkRGVjYW1lbGl6ZSA9IG9wdD8uc2hvdWxkRGVjYW1lbGl6ZSA/PyBzaG91bGRBbHdheXNEZWNhbWVsaXplO1xuICBjb25zdCBzZXBhcmF0b3IgPSBvcHQ/LnNlcGFyYXRvciA/PyBcIl9cIjtcbiAgY29uc3QgcGF0aF8gPSBvcHQ/LnBhdGggPz8gW107XG4gIGNvbnN0IG1heERlcHRoID0gb3B0Py5tYXhEZXB0aCA/PyAxMDtcblxuICBpZiAocGF0aF8ubGVuZ3RoID4gbWF4RGVwdGgpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICBcIkRlY2FtZWxsZWQgdG9vIGRlZXBseSAtIGNoZWNrIHRoYXQgdGhlIGlucHV0IGhhcyBubyBjaXJjdWxhciByZWZlcmVuY2VzXCIsXG4gICAgKTtcbiAgfVxuXG4gIGlmIChBcnJheS5pc0FycmF5KGlucHV0KSkge1xuICAgIHJldHVybiBpbnB1dC5tYXAoKGssIGkpID0+XG4gICAgICBkZWNhbWVsaXplS2V5c1JlY3Vyc2l2ZWx5KGssIHtcbiAgICAgICAgLi4ub3B0LFxuICAgICAgICBwYXRoOiBbLi4ucGF0aF8sIGkudG9TdHJpbmcoKV0sXG4gICAgICB9KSxcbiAgICApO1xuICB9XG5cbiAgaWYgKHR5cGVvZiBpbnB1dCA9PT0gXCJvYmplY3RcIiAmJiBpbnB1dCAhPT0gbnVsbCkge1xuICAgIGNvbnN0IG1hcHBlZE9iamVjdDogUmVjb3JkPHN0cmluZywgYW55PiA9IHt9O1xuICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKGlucHV0KSkge1xuICAgICAgY29uc3QgdHJhbnNmb3JtZWRLZXkgPSBzaG91bGREZWNhbWVsaXplKFsuLi5wYXRoXywga2V5XSwgdmFsdWUpXG4gICAgICAgID8gZGVjYW1lbGl6ZShrZXksIHNlcGFyYXRvcilcbiAgICAgICAgOiBrZXk7XG5cbiAgICAgIG1hcHBlZE9iamVjdFt0cmFuc2Zvcm1lZEtleV0gPSBkZWNhbWVsaXplS2V5c1JlY3Vyc2l2ZWx5KHZhbHVlLCB7XG4gICAgICAgIC4uLm9wdCxcbiAgICAgICAgcGF0aDogWy4uLnBhdGhfLCBrZXldLFxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIG1hcHBlZE9iamVjdDtcbiAgfVxuXG4gIHJldHVybiBpbnB1dDtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIGZhbHNlIGlmIHZhbHVlIGlzIHVuc2V0IG9yIGEgZmFsc2V5IHZhbHVlLCBhbmQgdHJ1ZSBvdGhlcndpc2UuXG4gKiBAcGFyYW0gdmFsdWUgYW4gZW52aXJvbm1lbnQgdmFyaWFibGVcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzVHJ1dGh5KHZhbHVlOiBzdHJpbmcgfCB1bmRlZmluZWQpOiBib29sZWFuIHtcbiAgcmV0dXJuICEoXG4gICAgdmFsdWUgPT09IHVuZGVmaW5lZCB8fFxuICAgIFtcIm51bGxcIiwgXCJ1bmRlZmluZWRcIiwgXCIwXCIsIFwiZmFsc2VcIiwgXCJcIl0uaW5jbHVkZXModmFsdWUudG9Mb2NhbGVMb3dlckNhc2UoKSlcbiAgKTtcbn1cblxuLyoqXG4gKiBUeXBlIG9mIGEgbWFwIG1hcHBpbmcgc3RyaW5ncyB0byBzb21lIGFyYml0cmFyeSB0eXBlXG4gKi9cbmV4cG9ydCB0eXBlIE9iajxUPiA9IHsgW2tleTogc3RyaW5nXTogVCB9O1xuXG4vKipcbiAqIFJldHVybiB3aGV0aGVyIHRoZSBnaXZlbiB2YWx1ZSBpcyBhIHBsYWluIHN0cnVjdCBvYmplY3RcbiAqXG4gKiBFdmVuIHRob3VnaCBhcnJheXMgYW5kIGluc3RhbmNlcyBvZiBjbGFzc2VzIHRlY2huaWNhbGx5IGFyZSBvYmplY3RzLCB3ZVxuICogdXN1YWxseSB3YW50IHRvIHRyZWF0IHRoZW0gZGlmZmVyZW50bHksIHNvIHdlIHJldHVybiBmYWxzZSBpbiB0aG9zZSBjYXNlcy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzT2JqZWN0KHg6IGFueSk6IHggaXMgT2JqPGFueT4ge1xuICByZXR1cm4gKFxuICAgIHggIT09IG51bGwgJiZcbiAgICB0eXBlb2YgeCA9PT0gXCJvYmplY3RcIiAmJlxuICAgICFBcnJheS5pc0FycmF5KHgpICYmXG4gICAgeC5jb25zdHJ1Y3Rvci5uYW1lID09PSBcIk9iamVjdFwiXG4gICk7XG59XG5cbi8qKlxuICogQ29uZmlndXJlIHRoZSBiZWhhdmlvciBvZiBgZGVlcE1lcmdlYC5cbiAqL1xuaW50ZXJmYWNlIE1lcmdlT3B0aW9ucyB7XG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIGRlbGV0ZSBrZXlzIHdpdGggYHVuZGVmaW5lZGAgdmFsdWVzLlxuICAgKlxuICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgKi9cbiAgcmVhZG9ubHkgZGVzdHJ1Y3RpdmU/OiBib29sZWFuO1xuICAvKipcbiAgICogV2hldGhlciB0byBtZXJnZSBhcnJheXMuXG4gICAqXG4gICAqIEBkZWZhdWx0IGZhbHNlXG4gICAqL1xuICByZWFkb25seSBtZXJnZUFycmF5cz86IGJvb2xlYW47XG59XG5cbi8qKlxuICogUmVjdXJzaXZlbHkgbWVyZ2Ugb2JqZWN0cyB0b2dldGhlclxuICpcbiAqIFRoZSBsZWZ0bW9zdCBvYmplY3QgaXMgbXV0YXRlZCBhbmQgcmV0dXJuZWQuXG4gKlxuICogSWYgYW4gb2JqZWN0IGlzIG1lcmdlZCBpbnRvIHNvbWV0aGluZyBvdGhlciB0aGFuIGFuIG9iamVjdCwgdGhlIG5vbi1vYmplY3QgaXMgbG9zdC5cbiAqIEFycmF5cyBhcmUgb3ZlcndyaXR0ZW4gbm90IG1lcmdlZDsgc2V0IGBtZXJnZUFycmF5czogdHJ1ZWAgdG8gbWVyZ2UgYXJyYXlzIGFuZCBkZWR1cGxpY2F0ZSB0aGUgcmVzdWx0LlxuICogQW4gYHVuZGVmaW5lZGAga2V5IGluIGEgc291cmNlIG9iamVjdCB3aWxsIHBlcnNpc3Q7IHNldCBgZGVzdHJ1Y3RpdmU6IHRydWVgIHRvIGZ1bGx5IHJlbW92ZSB0aGUga2V5IGluc3RlYWQuXG4gKiBFbXB0eSBvYmplY3RzIGFzIHZhbHVlcyBhcmUgcHJlc2VydmVkIGluIHRoZSBvdXRwdXQ7IHNldCBgZGVzdHJ1Y3RpdmU6IHRydWVgIHRvIHJlbW92ZSB0aGVtIGluc3RlYWQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkZWVwTWVyZ2UoXG4gIG9iamVjdHM6IEFycmF5PE9iajxhbnk+IHwgdW5kZWZpbmVkPixcbiAgeyBkZXN0cnVjdGl2ZSA9IGZhbHNlLCBtZXJnZUFycmF5cyA9IGZhbHNlIH06IE1lcmdlT3B0aW9ucyA9IHt9LFxuKSB7XG4gIGZ1bmN0aW9uIG1lcmdlT25lKHRhcmdldDogT2JqPGFueT4sIHNvdXJjZTogT2JqPGFueT4pIHtcbiAgICBmb3IgKGNvbnN0IGtleSBvZiBPYmplY3Qua2V5cyhzb3VyY2UpKSB7XG4gICAgICAvLyBQcmV2ZW50IHByb3RvdHlwZSBwb2xsdXRpb24gYnkgYmxvY2tpbmcgZGFuZ2Vyb3VzIGtleXNcbiAgICAgIGlmIChrZXkgPT09IFwiX19wcm90b19fXCIgfHwga2V5ID09PSBcImNvbnN0cnVjdG9yXCIgfHwga2V5ID09PSBcInByb3RvdHlwZVwiKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgY29uc3QgdmFsdWUgPSBzb3VyY2Vba2V5XTtcblxuICAgICAgLy8gaWYgdGhlIGN1cnJlbnQgdmFsdWUgaXMgYSBwbGFpbiBvYmplY3QsIHdlIHJlY3Vyc2l2ZWx5IG1lcmdlIGl0XG4gICAgICBpZiAoaXNPYmplY3QodmFsdWUpKSB7XG4gICAgICAgIC8vIGlmIHRoZSB2YWx1ZSBhdCB0aGUgdGFyZ2V0IGlzIG5vdCBhbiBvYmplY3QsIG92ZXJyaWRlIGl0IHdpdGggYW5cbiAgICAgICAgLy8gb2JqZWN0IHNvIHdlIGNhbiBjb250aW51ZSB0aGUgcmVjdXJzaW9uXG4gICAgICAgIGlmICh0eXBlb2YgdGFyZ2V0W2tleV0gIT09IFwib2JqZWN0XCIpIHtcbiAgICAgICAgICB0YXJnZXRba2V5XSA9IHZhbHVlO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gU3BlY2lhbCBoYW5kbGluZyBmb3IgX18kQVBQRU5ELCB3aGljaCBpcyB1c2VkIHRvIGFwcGVuZCB2YWx1ZXMgdG8gYXJyYXlzXG4gICAgICAgIGlmIChcIl9fJEFQUEVORFwiIGluIHZhbHVlICYmIEFycmF5LmlzQXJyYXkodmFsdWUuX18kQVBQRU5EKSkge1xuICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KHRhcmdldFtrZXldKSkge1xuICAgICAgICAgICAgdGFyZ2V0W2tleV0ucHVzaCguLi52YWx1ZS5fXyRBUFBFTkQpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0YXJnZXRba2V5XSA9IHZhbHVlLl9fJEFQUEVORDtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyByZWN1cnNpdmVseSBtZXJnZSB0aGUgb2JqZWN0XG4gICAgICAgIG1lcmdlT25lKHRhcmdldFtrZXldLCB2YWx1ZSk7XG5cbiAgICAgICAgLy8gaWYgdGhlIHJlc3VsdCBvZiB0aGUgbWVyZ2UgaXMgYW4gZW1wdHkgb2JqZWN0LCBpdCdzIGJlY2F1c2UgdGhlXG4gICAgICAgIC8vIGV2ZW50dWFsIHZhbHVlIHdlIGFzc2lnbmVkIGlzIGB1bmRlZmluZWRgLCBhbmQgdGhlcmUgYXJlIG5vXG4gICAgICAgIC8vIHNpYmxpbmcgY29uY3JldGUgdmFsdWVzIGFsb25nc2lkZSwgc28gd2UgY2FuIGRlbGV0ZSB0aGlzIHRyZWUuXG4gICAgICAgIGlmIChcbiAgICAgICAgICBkZXN0cnVjdGl2ZSAmJlxuICAgICAgICAgIHR5cGVvZiB0YXJnZXRba2V5XSA9PT0gXCJvYmplY3RcIiAmJlxuICAgICAgICAgIE9iamVjdC5rZXlzKHRhcmdldFtrZXldKS5sZW5ndGggPT09IDBcbiAgICAgICAgKSB7XG4gICAgICAgICAgZGVsZXRlIHRhcmdldFtrZXldO1xuICAgICAgICB9XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICAvLyBpbiBkZXN0cnVjdGl2ZSBtb2RlLCB3ZSBkZWxldGUgdGhlIGV4aXN0aW5nIGtleSBpZiB0aGUgdmFsdWUgaXMgdW5kZWZpbmVkXG4gICAgICBpZiAoZGVzdHJ1Y3RpdmUgJiYgdmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICBkZWxldGUgdGFyZ2V0W2tleV07XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICAvLyBpbiBhcnJheSBtZXJnaW5nIG1vZGUsIHdlIG1lcmdlIGFuZCBkZWR1cGxpY2F0ZSBhcnJheXNcbiAgICAgIGlmIChtZXJnZUFycmF5cyAmJiBBcnJheS5pc0FycmF5KHRhcmdldFtrZXldKSAmJiBBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgICAgICB0YXJnZXRba2V5XSA9IFsuLi5uZXcgU2V0KFsuLi50YXJnZXRba2V5XSwgLi4udmFsdWVdKV07XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICAvLyBhbGwgb3RoZXIgdmFsdWVzIGFyZSBzaW1wbHkgb3ZlcndyaXR0ZW4gYnkgb3ZlcnJpZGluZyBvYmplY3RcbiAgICAgIGlmICh0eXBlb2YgdmFsdWUgIT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICAgICAgdGFyZ2V0W2tleV0gPSB2YWx1ZTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgY29uc3Qgb3RoZXJzID0gb2JqZWN0cy5maWx0ZXIoKHgpID0+IHggIT0gbnVsbCkgYXMgQXJyYXk8T2JqPGFueT4+O1xuXG4gIGlmIChvdGhlcnMubGVuZ3RoID09PSAwKSB7XG4gICAgcmV0dXJuIHt9O1xuICB9XG4gIGNvbnN0IGludG8gPSBvdGhlcnMuc3BsaWNlKDAsIDEpWzBdO1xuXG4gIG90aGVycy5mb3JFYWNoKChvdGhlcikgPT4gbWVyZ2VPbmUoaW50bywgb3RoZXIpKTtcbiAgcmV0dXJuIGludG87XG59XG5cbi8qXG4gKiBEZWR1cGxpY2F0ZSB2YWx1ZXMgaW4gYSBsaXN0LCByZXR1cm5pbmcgYSBuZXcgYXJyYXkuXG4gKiBAcGFyYW0gYXJyYXkgbGlzdCBvZiB2YWx1ZXNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRlZHVwQXJyYXk8VD4oYXJyYXk6IFRbXSk6IFRbXSB7XG4gIHJldHVybiBhcnJheS5maWx0ZXIoKHZhbCwgaWR4KSA9PiBhcnJheS5pbmRleE9mKHZhbCkgPT09IGlkeCk7XG59XG5cbi8qKlxuICogUmV0dXJucyBhIHNvcnRlZCB2ZXJzaW9uIG9mIGB4YCBvciBgdW5kZWZpbmVkYCBpZiBpdCBpcyBhbiBlbXB0eSBhcnJheSBvciBvYmplY3QuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzb3J0ZWQ8VD4oeDogVCkge1xuICBpZiAoeCA9PSBudWxsKSB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuICBpZiAoQXJyYXkuaXNBcnJheSh4KSkge1xuICAgIGlmICh4Lmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG4gICAgcmV0dXJuICh4IGFzIHVua25vd25bXSkuc29ydCgpO1xuICB9IGVsc2UgaWYgKHR5cGVvZiB4ID09PSBcIm9iamVjdFwiKSB7XG4gICAgaWYgKE9iamVjdC5rZXlzKHgpLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG4gICAgY29uc3QgcmVzdWx0OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9IHt9O1xuICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKHgpLnNvcnQoKFtsXSwgW3JdKSA9PlxuICAgICAgbC5sb2NhbGVDb21wYXJlKHIpLFxuICAgICkpIHtcbiAgICAgIHJlc3VsdFtrZXldID0gdmFsdWU7XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQgYXMgVDtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4geDtcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gZm9ybWF0QXNQeXRob25Nb2R1bGUobmFtZTogc3RyaW5nKSB7XG4gIHJldHVybiBuYW1lLnJlcGxhY2UoLy0vZywgXCJfXCIpLnJlcGxhY2UoL1xcLi9nLCBcIl9cIik7XG59XG5cbi8qKlxuICogRXh0cmFjdCBnaXQgdmVyc2lvbiBudW1iZXIgZnJvbSBjb21tYW5kIGxpbmVcbiAqXG4gKiBAcGFyYW0gZ2l0VmVyc2lvbk91dHB1dCB0aGUgb3V0cHV0IGZyb20gYGdpdCB2ZXJzaW9uYCBDTElcbiAqIEByZXR1cm5zIHRoZSB2ZXJzaW9uIG9mIGdpdFxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0R2l0VmVyc2lvbihnaXRWZXJzaW9uT3V0cHV0OiBzdHJpbmcpIHtcbiAgY29uc3QgbWF0Y2ggPSBnaXRWZXJzaW9uT3V0cHV0Lm1hdGNoKC9cXGQrLlxcZCsuXFxkKy8pO1xuICBpZiAoIW1hdGNoKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiVW5hYmxlIHRvIHJldHJpZXZlIGdpdCB2ZXJzaW9uXCIpO1xuICB9XG5cbiAgcmV0dXJuIG1hdGNoWzBdO1xufVxuXG5leHBvcnQgZnVuY3Rpb24ga2ViYWJDYXNlS2V5czxUID0gdW5rbm93bj4ob2JqOiBULCByZWN1cnNpdmUgPSB0cnVlKTogVCB7XG4gIGlmICh0eXBlb2Ygb2JqICE9PSBcIm9iamVjdFwiIHx8IG9iaiA9PSBudWxsKSB7XG4gICAgcmV0dXJuIG9iajtcbiAgfVxuXG4gIGlmIChBcnJheS5pc0FycmF5KG9iaikpIHtcbiAgICBpZiAocmVjdXJzaXZlKSB7XG4gICAgICBvYmogPSBvYmoubWFwKCh2KSA9PiBrZWJhYkNhc2VLZXlzKHYsIHJlY3Vyc2l2ZSkpIGFzIGFueTtcbiAgICB9XG4gICAgcmV0dXJuIG9iajtcbiAgfVxuXG4gIGNvbnN0IHJlc3VsdDogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPSB7fTtcbiAgZm9yIChsZXQgW2ssIHZdIG9mIE9iamVjdC5lbnRyaWVzKG9iaikpIHtcbiAgICBpZiAocmVjdXJzaXZlKSB7XG4gICAgICB2ID0ga2ViYWJDYXNlS2V5cyh2LCByZWN1cnNpdmUpO1xuICAgIH1cbiAgICByZXN1bHRbZGVjYW1lbGl6ZShrKS5yZXBsYWNlKC9fL2dtLCBcIi1cIildID0gdjtcbiAgfVxuICByZXR1cm4gcmVzdWx0IGFzIGFueTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHNuYWtlQ2FzZUtleXM8VCA9IHVua25vd24+KFxuICBvYmo6IFQsXG4gIHJlY3Vyc2l2ZSA9IHRydWUsXG4gIGV4Y2x1c2l2ZUZvclJlY29yZEtleXM6IHN0cmluZ1tdID0gW10sXG4pOiBUIHtcbiAgaWYgKHR5cGVvZiBvYmogIT09IFwib2JqZWN0XCIgfHwgb2JqID09IG51bGwpIHtcbiAgICByZXR1cm4gb2JqO1xuICB9XG5cbiAgaWYgKEFycmF5LmlzQXJyYXkob2JqKSkge1xuICAgIGlmIChyZWN1cnNpdmUpIHtcbiAgICAgIG9iaiA9IG9iai5tYXAoKHYpID0+XG4gICAgICAgIHNuYWtlQ2FzZUtleXModiwgcmVjdXJzaXZlLCBleGNsdXNpdmVGb3JSZWNvcmRLZXlzKSxcbiAgICAgICkgYXMgYW55O1xuICAgIH1cbiAgICByZXR1cm4gb2JqO1xuICB9XG5cbiAgY29uc3QgcmVzdWx0OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9IHt9O1xuICBmb3IgKGxldCBbaywgdl0gb2YgT2JqZWN0LmVudHJpZXMob2JqKSkge1xuICAgIGlmIChyZWN1cnNpdmUpIHtcbiAgICAgIHYgPSBzbmFrZUNhc2VLZXlzKHYsIHJlY3Vyc2l2ZSwgZXhjbHVzaXZlRm9yUmVjb3JkS2V5cyk7XG4gICAgfVxuICAgIGNvbnN0IG1vZGlmaWVkS2V5ID1cbiAgICAgIGV4Y2x1c2l2ZUZvclJlY29yZEtleXMubGVuZ3RoID09IDAgfHwgZXhjbHVzaXZlRm9yUmVjb3JkS2V5cy5pbmNsdWRlcyhrKVxuICAgICAgICA/IENhc2Uuc25ha2UoaylcbiAgICAgICAgOiBrO1xuICAgIHJlc3VsdFttb2RpZmllZEtleV0gPSB2O1xuICB9XG4gIHJldHVybiByZXN1bHQgYXMgYW55O1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gdHJ5UmVhZEZpbGUoZmlsZTogc3RyaW5nKSB7XG4gIGlmICghZXhpc3RzU3luYyhmaWxlKSkge1xuICAgIHJldHVybiBcIlwiO1xuICB9XG5cbiAgcmV0dXJuIGZzLnJlYWRGaWxlKGZpbGUsIFwidXRmLThcIik7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB0cnlSZWFkRmlsZVN5bmMoZmlsZTogc3RyaW5nKSB7XG4gIGlmICghZXhpc3RzU3luYyhmaWxlKSkge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cblxuICByZXR1cm4gcmVhZEZpbGVTeW5jKGZpbGUsIFwidXRmLThcIik7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc1dyaXRhYmxlKGZpbGU6IHN0cmluZykge1xuICB0cnkge1xuICAgIGFjY2Vzc1N5bmMoZmlsZSwgZnNfY29uc3RhbnRzLldfT0spO1xuICAgIHJldHVybiB0cnVlO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn1cblxuLyoqXG4gKiBBc3NlcnRzIHRoYXQgdGhlIGZpbGUgc2hvdWxkIGJlIGV4ZWN1dGFibGUuIEFsd2F5cyByZXR1cm5zIHRydWUgb24gV2luZG93cy5cbiAqXG4gKiBJbiBXaW5kb3dzLCB0aGUgZXhlY3V0YWJsZSBhdHRyaWJ1dGUgaXMgc3RvcmVkIGluIHRoZSBzeXN0ZW0gc2V0dGluZyBQQVRIRVhULCBub3QgaW4gZWFjaCBmaWxlLiBUaGVuLCBjaGVja2luZyBmb3IgZXhlY3V0YWJpbGl0eSBpcyBlcXVpdmFsZW50IHRvIGNoZWNraW5nIGZvciBleGlzdGVuY2UuIFRvIGJ5cGFzcyBjaGVja2luZyBmb3IgZXhlY3V0YWJpbGl0eSwgd2UgYWx3YXlzIHJldHVybiB0cnVlIG9uIFdpbmRvd3MuXG4gKlxuICogQHBhcmFtIGZpbGVQYXRoIFRoZSBwYXRoIHRvIHRoZSBmaWxlXG4gKiBAcGFyYW0gc2hvdWxkQmVFeGVjdXRhYmxlIFdoZXRoZXIgdGhlIGZpbGUgc2hvdWxkIGJlIGV4ZWN1dGFibGVcbiAqIEByZXR1cm5zIHRydWUgaWYgYGZpbGVQYXRoYCBleGVjdXRhYmxlIGF0dHJpYnV0ZSBtYXRjaGVzIGBzaG91bGRCZUV4ZWN1dGFibGVgIG9yIGlmIHRoZSBwbGF0Zm9ybSBpcyBXaW5kb3dzLCBmYWxzZSBvdGhlcndpc2VcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGFzc2VydEV4ZWN1dGFibGVQZXJtaXNzaW9ucyhcbiAgZmlsZVBhdGg6IHN0cmluZyxcbiAgc2hvdWxkQmVFeGVjdXRhYmxlOiBib29sZWFuLFxuKTogYm9vbGVhbiB7XG4gIGNvbnN0IGlzV2luZG93cyA9IHByb2Nlc3MucGxhdGZvcm0gPT09IFwid2luMzJcIjtcbiAgaWYgKGlzV2luZG93cykge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgY29uc3QgcHJldkV4ZWN1dGFibGUgPSBpc0V4ZWN1dGFibGUoZmlsZVBhdGgpO1xuXG4gIHJldHVybiBwcmV2RXhlY3V0YWJsZSA9PT0gc2hvdWxkQmVFeGVjdXRhYmxlO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNFeGVjdXRhYmxlKGZpbGU6IHN0cmluZykge1xuICB0cnkge1xuICAgIGFjY2Vzc1N5bmMoZmlsZSwgZnNfY29uc3RhbnRzLlhfT0spO1xuXG4gICAgcmV0dXJuIHRydWU7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn1cblxuZnVuY3Rpb24gZGVjYW1lbGl6ZShzOiBzdHJpbmcsIHNlcDogc3RyaW5nID0gXCJfXCIpIHtcbiAgaWYgKENhc2Uub2YocykgPT09IFwiY2FtZWxcIikge1xuICAgIHJldHVybiBDYXNlLmxvd2VyKHMsIHNlcCk7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIHM7XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldE5vZGVNYWpvclZlcnNpb24oKTogbnVtYmVyIHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgbWF0Y2ggPSBwcm9jZXNzLnZlcnNpb24ubWF0Y2goLyhcXGQrKVxcLihcXGQrKVxcLihcXGQrKS8pO1xuICBpZiAobWF0Y2gpIHtcbiAgICBjb25zdCBbbWFqb3JdID0gbWF0Y2guc2xpY2UoMSkubWFwKCh4KSA9PiBwYXJzZUludCh4KSk7XG4gICAgcmV0dXJuIG1ham9yO1xuICB9XG4gIHJldHVybiB1bmRlZmluZWQ7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBhbnlTZWxlY3RlZChvcHRpb25zOiAoYm9vbGVhbiB8IHVuZGVmaW5lZClbXSk6IGJvb2xlYW4ge1xuICByZXR1cm4gb3B0aW9ucy5zb21lKChvcHQpID0+IG9wdCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBtdWx0aXBsZVNlbGVjdGVkKG9wdGlvbnM6IChib29sZWFuIHwgdW5kZWZpbmVkKVtdKTogYm9vbGVhbiB7XG4gIHJldHVybiBvcHRpb25zLmZpbHRlcigob3B0KSA9PiBvcHQpLmxlbmd0aCA+IDE7XG59XG5cbi8qKlxuICogQ2hlY2tzIGlmIGEgcGF0aCBpcyBhIEZTIHJvb3RcbiAqXG4gKiBPcHRpb25hbCB1c2VzIGEgcHJvdmlkZWQgT1Mgc3BlY2lmaWMgcGF0aCBpbXBsZW1lbnRhdGlvbixcbiAqIGRlZmF1bHRzIHRvIHVzZSB0aGUgaW1wbGVtZW50YXRpb24gZm9yIHRoZSBjdXJyZW50IE9TLlxuICpcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNSb290KGRpcjogc3RyaW5nLCBvc1BhdGhMaWI6IHR5cGVvZiBwYXRoID0gcGF0aCk6IGJvb2xlYW4ge1xuICBjb25zdCBwYXJlbnQgPSBvc1BhdGhMaWIuZGlybmFtZShkaXIpO1xuICByZXR1cm4gcGFyZW50ID09PSBkaXI7XG59XG5cbi8qKlxuICogUnVuIHVwIHByb2plY3QgdHJlZSB0byBmaW5kIGEgZmlsZSBvciBkaXJlY3RvcnlcbiAqXG4gKiBAcGFyYW0gbG9va0ZvciB0aGUgZmlsZSBvciBkaXJlY3RvcnkgdG8gbG9vayBmb3JcbiAqIEBwYXJhbSBjd2QgY3VycmVudCB3b3JraW5nIGRpcmVjdG9yeSwgbXVzdCBiZSBhbiBhYnNvbHV0ZSBwYXRoXG4gKiBAcmV0dXJucyBwYXRoIHRvIHRoZSBmaWxlIG9yIGRpcmVjdG9yeSB3ZSBhcmUgbG9va2luZyBmb3IsIHVuZGVmaW5lZCBpZiBub3QgZm91bmRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGZpbmRVcChcbiAgbG9va0Zvcjogc3RyaW5nLFxuICBjd2Q6IHN0cmluZyA9IHByb2Nlc3MuY3dkKCksXG4pOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBpZiAoZXhpc3RzU3luYyhwYXRoLmpvaW4oY3dkLCBsb29rRm9yKSkpIHtcbiAgICByZXR1cm4gY3dkO1xuICB9XG5cbiAgaWYgKGlzUm9vdChjd2QpKSB7XG4gICAgLy8gVGhpcyBpcyBhIHJvb3RcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG4gIHJldHVybiBmaW5kVXAobG9va0ZvciwgcGF0aC5kaXJuYW1lKGN3ZCkpO1xufVxuXG4vKipcbiAqIE5vcm1hbGl6ZXMgYSBwYXRoIHRoYXQgaXMgZ29pbmcgdG8gYmUgcGVyc2lzdGVkIHRvIGhhdmUgYSBjcm9zcyBwbGF0Zm9ybSByZXByZXNlbnRhdGlvbi5cbiAqXG4gKiBOb3JtYWxpemVkIHBhdGhzIGNhbiBiZSBwZXJzaXN0ZWQgYW5kIGRvZXNuJ3QgbmVlZCB0byBiZSBtb2RpZmllZCB3aGVuIHRoZSBwbGF0Zm9ybSBjaGFuZ2VzLlxuICogYG5vcm1hbGl6ZVBlcnNpc3RlZFBhdGhgIHRha2VzIGNhcmUgb2YgcGxhdGZvcm0tc3BlY2lmaWMgcHJvcGVydGllcyBsaWtlIGRpcmVjdG9yeSBzZXBhcmF0b3IuXG4gKiBJdCB1c2VzIGBwYXRoLnBvc2l4LnNlcGAgdGhhdCBpcyBzdXBwb3J0ZWQgYm90aCBpbiBXaW5kb3dzIGFuZCBVbml4IHBsYXRmb3Jtcy5cbiAqXG4gKlxuICogQHBhcmFtIHAgdGhlIHBhdGggdG8gYmUgbm9ybWFsaXplZFxuICogQHJldHVybnMgdGhlIG5vcm1hbGl6ZWQgcGF0aFxuICovXG5leHBvcnQgZnVuY3Rpb24gbm9ybWFsaXplUGVyc2lzdGVkUGF0aChwOiBzdHJpbmcpIHtcbiAgcmV0dXJuIHAucmVwbGFjZSgvXFxcXC9nLCBwYXRoLnBvc2l4LnNlcCk7XG59XG4iXX0=
|
package/lib/version.js
CHANGED
|
@@ -24,7 +24,7 @@ exports.CHANGES_SINCE_LAST_RELEASE = 'git log --oneline -1 | grep -qv "chore(rel
|
|
|
24
24
|
*/
|
|
25
25
|
const COMMIT_AND_TAG_VERSION_DEFAULT = "commit-and-tag-version@^12";
|
|
26
26
|
class Version extends component_1.Component {
|
|
27
|
-
static [JSII_RTTI_SYMBOL_1] = { fqn: "projen.Version", version: "0.100.
|
|
27
|
+
static [JSII_RTTI_SYMBOL_1] = { fqn: "projen.Version", version: "0.100.6" };
|
|
28
28
|
bumpTask;
|
|
29
29
|
unbumpTask;
|
|
30
30
|
/**
|
|
@@ -141,7 +141,7 @@ exports.Version = Version;
|
|
|
141
141
|
*/
|
|
142
142
|
class ReleasableCommits {
|
|
143
143
|
cmd;
|
|
144
|
-
static [JSII_RTTI_SYMBOL_1] = { fqn: "projen.ReleasableCommits", version: "0.100.
|
|
144
|
+
static [JSII_RTTI_SYMBOL_1] = { fqn: "projen.ReleasableCommits", version: "0.100.6" };
|
|
145
145
|
/**
|
|
146
146
|
* Release every commit
|
|
147
147
|
*
|
|
@@ -13,7 +13,7 @@ const DEVCONTAINER_FILE = ".devcontainer.json";
|
|
|
13
13
|
* codespaces.
|
|
14
14
|
*/
|
|
15
15
|
class DevContainer extends component_1.Component {
|
|
16
|
-
static [JSII_RTTI_SYMBOL_1] = { fqn: "projen.vscode.DevContainer", version: "0.100.
|
|
16
|
+
static [JSII_RTTI_SYMBOL_1] = { fqn: "projen.vscode.DevContainer", version: "0.100.6" };
|
|
17
17
|
dockerImage;
|
|
18
18
|
postCreateTasks;
|
|
19
19
|
ports;
|
package/lib/vscode/extensions.js
CHANGED
|
@@ -9,7 +9,7 @@ const json_1 = require("../json");
|
|
|
9
9
|
* Source: https://code.visualstudio.com/docs/editor/extension-marketplace#_workspace-recommended-extensions
|
|
10
10
|
*/
|
|
11
11
|
class VsCodeRecommendedExtensions extends component_1.Component {
|
|
12
|
-
static [JSII_RTTI_SYMBOL_1] = { fqn: "projen.vscode.VsCodeRecommendedExtensions", version: "0.100.
|
|
12
|
+
static [JSII_RTTI_SYMBOL_1] = { fqn: "projen.vscode.VsCodeRecommendedExtensions", version: "0.100.6" };
|
|
13
13
|
/**
|
|
14
14
|
* List of extensions which should be recommended for users of this workspace.
|
|
15
15
|
* The identifier of an extension is always '${publisher}.${name}'. For example: 'ms-python.python'.
|