@dbx-tools/core 0.9.121 → 0.9.122
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 +14 -6
- package/index.ts +2 -2
- package/lib/index.d.ts +2 -2
- package/lib/index.js +2 -2
- package/lib/src/config-utils.d.ts +2 -10
- package/lib/src/config-utils.js +7 -16
- package/lib/src/exec.d.ts +22 -41
- package/lib/src/exec.js +239 -79
- package/package.json +2 -2
- package/src/config-utils.ts +8 -18
- package/src/exec.ts +336 -132
package/README.md
CHANGED
|
@@ -157,10 +157,11 @@ contains a bundle, and bundle reads are enabled, validation runs. This keeps
|
|
|
157
157
|
pre-boot callers such as `@dbx-tools/appkit` auto-configuration on the same
|
|
158
158
|
deterministic path as CLIs and ordinary Node consumers.
|
|
159
159
|
|
|
160
|
-
Deployed Apps skip dotenv, bundle, and app YAML lookup after
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
160
|
+
Deployed Apps skip dotenv, bundle, and app YAML lookup after
|
|
161
|
+
`environmentUtils.isDatabricksAppEnv()` from `@dbx-tools/shared-core` recognizes
|
|
162
|
+
the required App name, HTTP(S) host, and valid port, or the Apps container source
|
|
163
|
+
tree. Set `DBX_TOOLS_DATABRICKS_APP_ENV=true` or `false` to force that result;
|
|
164
|
+
unrecognized values leave automatic detection in place.
|
|
164
165
|
|
|
165
166
|
`DBX_TOOLS_CONFIG_DOTENV`, `DBX_TOOLS_CONFIG_BUNDLE`, and
|
|
166
167
|
`DBX_TOOLS_CONFIG_APP` independently force those file sources on or off. A
|
|
@@ -218,7 +219,12 @@ if (result.exitCode !== 0) {
|
|
|
218
219
|
|
|
219
220
|
`exec.spawn()` supports inherited, piped, ignored, captured, and line-callback
|
|
220
221
|
stdio. It accepts string stdin and abort signals, making it useful for CLIs and
|
|
221
|
-
watch tasks.
|
|
222
|
+
watch tasks. The returned live child is also awaitable and exposes a memoized
|
|
223
|
+
`shutdown()` method that asks the operating system to terminate its process
|
|
224
|
+
tree, waits 8 seconds, then force-kills survivors and polls for 4 more seconds.
|
|
225
|
+
Callers may override those timeouts but not the platform signal policy. Parent
|
|
226
|
+
termination signals are forwarded through one process-global trap unless
|
|
227
|
+
`forwardTerminationSignals: false` is set.
|
|
222
228
|
|
|
223
229
|
When an executable is missing, `spawn()` and `spawnSync()` return
|
|
224
230
|
`exec.COMMAND_NOT_FOUND_EXIT_CODE` (`127`) unless `check: true` is set. With
|
|
@@ -239,7 +245,9 @@ const rev = exec
|
|
|
239
245
|
```
|
|
240
246
|
|
|
241
247
|
Use `spawnSync()` during projen synthesis or config discovery where async
|
|
242
|
-
control flow is not available.
|
|
248
|
+
control flow is not available. Synchronous children remain in the parent's
|
|
249
|
+
process group so terminal signals reach both processes. JavaScript signal traps
|
|
250
|
+
cannot run while the parent is blocked in `spawnSync()`.
|
|
243
251
|
|
|
244
252
|
## Split Shell-Like Commands
|
|
245
253
|
|
package/index.ts
CHANGED
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
// Hand edits are overwritten on the next watch; this file is read-only.
|
|
4
4
|
|
|
5
5
|
export const PACKAGE_IDENTIFIER = "@dbx-tools/core";
|
|
6
|
-
export const PACKAGE_VERSION = "0.9.
|
|
6
|
+
export const PACKAGE_VERSION = "0.9.122";
|
|
7
7
|
export * as bin from "./src/bin.ts";
|
|
8
8
|
export * as brandFiles from "./src/brand-files.ts";
|
|
9
9
|
export * as bundle from "./src/bundle.ts";
|
|
@@ -21,6 +21,6 @@ export { MAX_TCP_PORT, ENV_ONLY, valueSchema, bundleResourceSchema, bundleEnvEnt
|
|
|
21
21
|
export type { ConfigMapValue, ConfigData, ConfigSource, ConfigOptions, ConfigFile } from "./src/config-utils.ts";
|
|
22
22
|
export type { DependencyResolverOptions, DependencyInfo, ResolvedNpmVersion, NpmSpecifierInput, ResolvedNpmDependencies, MissingDependencyInfo } from "./src/dependency-resolver.ts";
|
|
23
23
|
export { COMMAND_NOT_FOUND_EXIT_CODE } from "./src/exec.ts";
|
|
24
|
-
export type { ExecStdio, LineHandler, LineOutputOptions, StdioOption, ExecResult, ChildProcessResult,
|
|
24
|
+
export type { ExecStdio, LineHandler, LineOutputOptions, StdioOption, ExecResult, ChildProcessResult, ChildProcessTerminationOptions, ExecOptions, SyncExecStdio, SyncExecOptions, SpawnArgs } from "./src/exec.ts";
|
|
25
25
|
export type { FileLockBackend, FileLockAcquisition, FileLockOptions, FileLockLease } from "./src/file-lock.ts";
|
|
26
26
|
export type { ProjectContext, ProjectGhRemote, ProjectGhAccount, ResolveProjectGhAccountOptions, NpmRegistryOptions } from "./src/project-utils.ts";
|
package/lib/index.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
export declare const PACKAGE_IDENTIFIER = "@dbx-tools/core";
|
|
2
|
-
export declare const PACKAGE_VERSION = "0.9.
|
|
2
|
+
export declare const PACKAGE_VERSION = "0.9.122";
|
|
3
3
|
export * as bin from "./src/bin.ts";
|
|
4
4
|
export * as brandFiles from "./src/brand-files.ts";
|
|
5
5
|
export * as bundle from "./src/bundle.ts";
|
|
@@ -17,6 +17,6 @@ export { MAX_TCP_PORT, ENV_ONLY, valueSchema, bundleResourceSchema, bundleEnvEnt
|
|
|
17
17
|
export type { ConfigMapValue, ConfigData, ConfigSource, ConfigOptions, ConfigFile } from "./src/config-utils.ts";
|
|
18
18
|
export type { DependencyResolverOptions, DependencyInfo, ResolvedNpmVersion, NpmSpecifierInput, ResolvedNpmDependencies, MissingDependencyInfo } from "./src/dependency-resolver.ts";
|
|
19
19
|
export { COMMAND_NOT_FOUND_EXIT_CODE } from "./src/exec.ts";
|
|
20
|
-
export type { ExecStdio, LineHandler, LineOutputOptions, StdioOption, ExecResult, ChildProcessResult,
|
|
20
|
+
export type { ExecStdio, LineHandler, LineOutputOptions, StdioOption, ExecResult, ChildProcessResult, ChildProcessTerminationOptions, ExecOptions, SyncExecStdio, SyncExecOptions, SpawnArgs } from "./src/exec.ts";
|
|
21
21
|
export type { FileLockBackend, FileLockAcquisition, FileLockOptions, FileLockLease } from "./src/file-lock.ts";
|
|
22
22
|
export type { ProjectContext, ProjectGhRemote, ProjectGhAccount, ResolveProjectGhAccountOptions, NpmRegistryOptions } from "./src/project-utils.ts";
|
package/lib/index.js
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
// Regenerated from the exporting modules in ./src.
|
|
3
3
|
// Hand edits are overwritten on the next watch; this file is read-only.
|
|
4
4
|
export const PACKAGE_IDENTIFIER = "@dbx-tools/core";
|
|
5
|
-
export const PACKAGE_VERSION = "0.9.
|
|
5
|
+
export const PACKAGE_VERSION = "0.9.122";
|
|
6
6
|
export * as bin from "./src/bin.js";
|
|
7
7
|
export * as brandFiles from "./src/brand-files.js";
|
|
8
8
|
export * as bundle from "./src/bundle.js";
|
|
@@ -16,4 +16,4 @@ export * as projectUtils from "./src/project-utils.js";
|
|
|
16
16
|
export { BrandContextSchema, defaultBrandContext, parseBrandContext, brandContextJsonSchema, brandContextPrompt } from "./src/brand-files.js";
|
|
17
17
|
export { MAX_TCP_PORT, ENV_ONLY, valueSchema, bundleResourceSchema, bundleEnvEntrySchema, bundleAppSchema, appEnvEntrySchema, appSchema, toNumber } from "./src/config-utils.js";
|
|
18
18
|
export { COMMAND_NOT_FOUND_EXIT_CODE } from "./src/exec.js";
|
|
19
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
19
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSwyQ0FBMkM7QUFDM0MsbURBQW1EO0FBQ25ELHdFQUF3RTtBQUV4RSxNQUFNLENBQUMsTUFBTSxrQkFBa0IsR0FBRyxpQkFBaUIsQ0FBQztBQUNwRCxNQUFNLENBQUMsTUFBTSxlQUFlLEdBQUcsU0FBUyxDQUFDO0FBQ3pDLE9BQU8sS0FBSyxHQUFHLE1BQU0sY0FBYyxDQUFDO0FBQ3BDLE9BQU8sS0FBSyxVQUFVLE1BQU0sc0JBQXNCLENBQUM7QUFDbkQsT0FBTyxLQUFLLE1BQU0sTUFBTSxpQkFBaUIsQ0FBQztBQUMxQyxPQUFPLEtBQUssV0FBVyxNQUFNLHVCQUF1QixDQUFDO0FBQ3JELE9BQU8sS0FBSyxrQkFBa0IsTUFBTSw4QkFBOEIsQ0FBQztBQUNuRSxPQUFPLEtBQUssSUFBSSxNQUFNLGVBQWUsQ0FBQztBQUN0QyxPQUFPLEtBQUssSUFBSSxNQUFNLGVBQWUsQ0FBQztBQUN0QyxPQUFPLEtBQUssUUFBUSxNQUFNLG9CQUFvQixDQUFDO0FBQy9DLE9BQU8sS0FBSyxXQUFXLE1BQU0sdUJBQXVCLENBQUM7QUFDckQsT0FBTyxLQUFLLFlBQVksTUFBTSx3QkFBd0IsQ0FBQztBQUV2RCxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsbUJBQW1CLEVBQUUsaUJBQWlCLEVBQUUsc0JBQXNCLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUU5SSxPQUFPLEVBQUUsWUFBWSxFQUFFLFFBQVEsRUFBRSxXQUFXLEVBQUUsb0JBQW9CLEVBQUUsb0JBQW9CLEVBQUUsZUFBZSxFQUFFLGlCQUFpQixFQUFFLFNBQVMsRUFBRSxRQUFRLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUdqTCxPQUFPLEVBQUUsMkJBQTJCLEVBQUUsTUFBTSxlQUFlLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBHRU5FUkFURUQgYnkgcHJvamVuIHdhdGNoIC0gRE8gTk9UIEVESVQuXG4vLyBSZWdlbmVyYXRlZCBmcm9tIHRoZSBleHBvcnRpbmcgbW9kdWxlcyBpbiAuL3NyYy5cbi8vIEhhbmQgZWRpdHMgYXJlIG92ZXJ3cml0dGVuIG9uIHRoZSBuZXh0IHdhdGNoOyB0aGlzIGZpbGUgaXMgcmVhZC1vbmx5LlxuXG5leHBvcnQgY29uc3QgUEFDS0FHRV9JREVOVElGSUVSID0gXCJAZGJ4LXRvb2xzL2NvcmVcIjtcbmV4cG9ydCBjb25zdCBQQUNLQUdFX1ZFUlNJT04gPSBcIjAuOS4xMjJcIjtcbmV4cG9ydCAqIGFzIGJpbiBmcm9tIFwiLi9zcmMvYmluLnRzXCI7XG5leHBvcnQgKiBhcyBicmFuZEZpbGVzIGZyb20gXCIuL3NyYy9icmFuZC1maWxlcy50c1wiO1xuZXhwb3J0ICogYXMgYnVuZGxlIGZyb20gXCIuL3NyYy9idW5kbGUudHNcIjtcbmV4cG9ydCAqIGFzIGNvbmZpZ1V0aWxzIGZyb20gXCIuL3NyYy9jb25maWctdXRpbHMudHNcIjtcbmV4cG9ydCAqIGFzIGRlcGVuZGVuY3lSZXNvbHZlciBmcm9tIFwiLi9zcmMvZGVwZW5kZW5jeS1yZXNvbHZlci50c1wiO1xuZXhwb3J0ICogYXMgZXhlYyBmcm9tIFwiLi9zcmMvZXhlYy50c1wiO1xuZXhwb3J0ICogYXMgZmlsZSBmcm9tIFwiLi9zcmMvZmlsZS50c1wiO1xuZXhwb3J0ICogYXMgZmlsZUxvY2sgZnJvbSBcIi4vc3JjL2ZpbGUtbG9jay50c1wiO1xuZXhwb3J0ICogYXMgcHJvY2Vzc0xvY2sgZnJvbSBcIi4vc3JjL3Byb2Nlc3MtbG9jay50c1wiO1xuZXhwb3J0ICogYXMgcHJvamVjdFV0aWxzIGZyb20gXCIuL3NyYy9wcm9qZWN0LXV0aWxzLnRzXCI7XG5leHBvcnQgdHlwZSB7IEJpbkNvbnRleHQsIEJpblNlbGVjdGlvbkNvbnRleHQsIEJpblNlbGVjdG9yLCBCaW5WZXJzaW9uT3V0cHV0LCBCaW5WZXJzaW9uUGFyc2VyLCBCaW5PcHRpb25zLCBCaW5QYWNrYWdlT3B0aW9ucywgQmluVXJsUmVzb2x2ZUNvbnRleHQsIEJpblNvdXJjZSwgQmluVXJsIH0gZnJvbSBcIi4vc3JjL2Jpbi50c1wiO1xuZXhwb3J0IHsgQnJhbmRDb250ZXh0U2NoZW1hLCBkZWZhdWx0QnJhbmRDb250ZXh0LCBwYXJzZUJyYW5kQ29udGV4dCwgYnJhbmRDb250ZXh0SnNvblNjaGVtYSwgYnJhbmRDb250ZXh0UHJvbXB0IH0gZnJvbSBcIi4vc3JjL2JyYW5kLWZpbGVzLnRzXCI7XG5leHBvcnQgdHlwZSB7IEJyYW5kQ29udGV4dCwgQnJhbmRDb250ZXh0SW5wdXQgfSBmcm9tIFwiLi9zcmMvYnJhbmQtZmlsZXMudHNcIjtcbmV4cG9ydCB7IE1BWF9UQ1BfUE9SVCwgRU5WX09OTFksIHZhbHVlU2NoZW1hLCBidW5kbGVSZXNvdXJjZVNjaGVtYSwgYnVuZGxlRW52RW50cnlTY2hlbWEsIGJ1bmRsZUFwcFNjaGVtYSwgYXBwRW52RW50cnlTY2hlbWEsIGFwcFNjaGVtYSwgdG9OdW1iZXIgfSBmcm9tIFwiLi9zcmMvY29uZmlnLXV0aWxzLnRzXCI7XG5leHBvcnQgdHlwZSB7IENvbmZpZ01hcFZhbHVlLCBDb25maWdEYXRhLCBDb25maWdTb3VyY2UsIENvbmZpZ09wdGlvbnMsIENvbmZpZ0ZpbGUgfSBmcm9tIFwiLi9zcmMvY29uZmlnLXV0aWxzLnRzXCI7XG5leHBvcnQgdHlwZSB7IERlcGVuZGVuY3lSZXNvbHZlck9wdGlvbnMsIERlcGVuZGVuY3lJbmZvLCBSZXNvbHZlZE5wbVZlcnNpb24sIE5wbVNwZWNpZmllcklucHV0LCBSZXNvbHZlZE5wbURlcGVuZGVuY2llcywgTWlzc2luZ0RlcGVuZGVuY3lJbmZvIH0gZnJvbSBcIi4vc3JjL2RlcGVuZGVuY3ktcmVzb2x2ZXIudHNcIjtcbmV4cG9ydCB7IENPTU1BTkRfTk9UX0ZPVU5EX0VYSVRfQ09ERSB9IGZyb20gXCIuL3NyYy9leGVjLnRzXCI7XG5leHBvcnQgdHlwZSB7IEV4ZWNTdGRpbywgTGluZUhhbmRsZXIsIExpbmVPdXRwdXRPcHRpb25zLCBTdGRpb09wdGlvbiwgRXhlY1Jlc3VsdCwgQ2hpbGRQcm9jZXNzUmVzdWx0LCBDaGlsZFByb2Nlc3NUZXJtaW5hdGlvbk9wdGlvbnMsIEV4ZWNPcHRpb25zLCBTeW5jRXhlY1N0ZGlvLCBTeW5jRXhlY09wdGlvbnMsIFNwYXduQXJncyB9IGZyb20gXCIuL3NyYy9leGVjLnRzXCI7XG5leHBvcnQgdHlwZSB7IEZpbGVMb2NrQmFja2VuZCwgRmlsZUxvY2tBY3F1aXNpdGlvbiwgRmlsZUxvY2tPcHRpb25zLCBGaWxlTG9ja0xlYXNlIH0gZnJvbSBcIi4vc3JjL2ZpbGUtbG9jay50c1wiO1xuZXhwb3J0IHR5cGUgeyBQcm9qZWN0Q29udGV4dCwgUHJvamVjdEdoUmVtb3RlLCBQcm9qZWN0R2hBY2NvdW50LCBSZXNvbHZlUHJvamVjdEdoQWNjb3VudE9wdGlvbnMsIE5wbVJlZ2lzdHJ5T3B0aW9ucyB9IGZyb20gXCIuL3NyYy9wcm9qZWN0LXV0aWxzLnRzXCI7XG4iXX0=
|
|
@@ -11,7 +11,8 @@
|
|
|
11
11
|
* read after the bundle source also missed.
|
|
12
12
|
*
|
|
13
13
|
* Inside a deployed Databricks App all three file sources are skipped by default
|
|
14
|
-
* ({@link isDatabricksAppEnv}): the platform has already turned
|
|
14
|
+
* ({@link environmentUtils.isDatabricksAppEnv}): the platform has already turned
|
|
15
|
+
* them into real
|
|
15
16
|
* environment variables, there is no bundle to validate, and the `databricks`
|
|
16
17
|
* CLI is not on the image. Boolean environment overrides can force either file
|
|
17
18
|
* source on or off when a tool needs different behavior.
|
|
@@ -120,15 +121,6 @@ export declare function flattenBundleEnv(data: unknown): Record<string, string>;
|
|
|
120
121
|
export declare function flattenAppEnv(data: unknown): Record<string, string>;
|
|
121
122
|
/** Walk a dot-separated path through parsed bundle data. */
|
|
122
123
|
export declare function getBundlePath(data: Record<string, unknown>, path: string): string | undefined;
|
|
123
|
-
/**
|
|
124
|
-
* Detect a Databricks App runtime from its required name, host, and port.
|
|
125
|
-
*
|
|
126
|
-
* `DBX_TOOLS_DATABRICKS_APP_ENV` takes precedence when it contains a recognized
|
|
127
|
-
* boolean value. This lets local tools emulate the deployed runtime (`true`) or
|
|
128
|
-
* lets unusual deployed processes retain local config lookup (`false`). An
|
|
129
|
-
* absent or unrecognized override falls back to structural detection.
|
|
130
|
-
*/
|
|
131
|
-
export declare function isDatabricksAppEnv(source?: Record<string, string | undefined>): boolean;
|
|
132
124
|
/** Exact, uppercase, and tokenized-uppercase names for a human-friendly key. */
|
|
133
125
|
export declare function environmentKeys(name: string): readonly string[];
|
|
134
126
|
/**
|
package/lib/src/config-utils.js
CHANGED
|
@@ -11,7 +11,8 @@
|
|
|
11
11
|
* read after the bundle source also missed.
|
|
12
12
|
*
|
|
13
13
|
* Inside a deployed Databricks App all three file sources are skipped by default
|
|
14
|
-
* ({@link isDatabricksAppEnv}): the platform has already turned
|
|
14
|
+
* ({@link environmentUtils.isDatabricksAppEnv}): the platform has already turned
|
|
15
|
+
* them into real
|
|
15
16
|
* environment variables, there is no bundle to validate, and the `databricks`
|
|
16
17
|
* CLI is not on the image. Boolean environment overrides can force either file
|
|
17
18
|
* source on or off when a tool needs different behavior.
|
|
@@ -189,17 +190,6 @@ export function getBundlePath(data, path) {
|
|
|
189
190
|
}
|
|
190
191
|
return undefined;
|
|
191
192
|
}
|
|
192
|
-
/**
|
|
193
|
-
* Detect a Databricks App runtime from its required name, host, and port.
|
|
194
|
-
*
|
|
195
|
-
* `DBX_TOOLS_DATABRICKS_APP_ENV` takes precedence when it contains a recognized
|
|
196
|
-
* boolean value. This lets local tools emulate the deployed runtime (`true`) or
|
|
197
|
-
* lets unusual deployed processes retain local config lookup (`false`). An
|
|
198
|
-
* absent or unrecognized override falls back to structural detection.
|
|
199
|
-
*/
|
|
200
|
-
export function isDatabricksAppEnv(source = process.env) {
|
|
201
|
-
return environmentUtils.isDatabricksAppEnv(source);
|
|
202
|
-
}
|
|
203
193
|
/** Exact, uppercase, and tokenized-uppercase names for a human-friendly key. */
|
|
204
194
|
export function environmentKeys(name) {
|
|
205
195
|
const trimmed = name.trim();
|
|
@@ -409,7 +399,8 @@ export function bundleFile(cwd, profile) {
|
|
|
409
399
|
if (override === false)
|
|
410
400
|
return undefined;
|
|
411
401
|
if (override === undefined &&
|
|
412
|
-
(process.env.NODE_ENV?.trim().toLowerCase() === "production" ||
|
|
402
|
+
(process.env.NODE_ENV?.trim().toLowerCase() === "production" ||
|
|
403
|
+
environmentUtils.isDatabricksAppEnv())) {
|
|
413
404
|
return undefined;
|
|
414
405
|
}
|
|
415
406
|
const resolved = resolveWorkingDirectory(cwd);
|
|
@@ -417,7 +408,7 @@ export function bundleFile(cwd, profile) {
|
|
|
417
408
|
}
|
|
418
409
|
/** The parsed `app.yaml` / `app.yml` for `cwd`, when local App config reads are enabled. */
|
|
419
410
|
export function appFile(cwd) {
|
|
420
|
-
const enabled = object.toBoolean(process.env[CONFIG_APP_KEY]) ?? !isDatabricksAppEnv();
|
|
411
|
+
const enabled = object.toBoolean(process.env[CONFIG_APP_KEY]) ?? !environmentUtils.isDatabricksAppEnv();
|
|
421
412
|
if (!enabled)
|
|
422
413
|
return undefined;
|
|
423
414
|
return loadAppFile(resolveWorkingDirectory(cwd));
|
|
@@ -441,7 +432,7 @@ function sourceData(source) {
|
|
|
441
432
|
}
|
|
442
433
|
/** Parsed `.env` for `cwd`, or `{}`; parsed file data is cached by path. */
|
|
443
434
|
function dotenv(cwd) {
|
|
444
|
-
const enabled = object.toBoolean(process.env[CONFIG_DOTENV_KEY]) ?? !isDatabricksAppEnv();
|
|
435
|
+
const enabled = object.toBoolean(process.env[CONFIG_DOTENV_KEY]) ?? !environmentUtils.isDatabricksAppEnv();
|
|
445
436
|
if (!enabled)
|
|
446
437
|
return {};
|
|
447
438
|
const resolved = resolveWorkingDirectory(cwd);
|
|
@@ -587,4 +578,4 @@ function loadAppFile(cwd) {
|
|
|
587
578
|
});
|
|
588
579
|
return data === undefined ? undefined : { path, data };
|
|
589
580
|
}
|
|
590
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uZmlnLXV0aWxzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2NvbmZpZy11dGlscy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBOEJHO0FBRUgsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQy9DLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxTQUFTLENBQUM7QUFDdkMsT0FBTyxFQUFFLE9BQU8sRUFBRSxVQUFVLEVBQUUsUUFBUSxFQUFFLE9BQU8sRUFBRSxHQUFHLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFDeEUsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLFdBQVcsQ0FBQztBQUNyQyxPQUFPLEVBQ0wsZ0JBQWdCLEVBQ2hCLElBQUksRUFDSixHQUFHLEVBQ0gsTUFBTSxFQUNOLE9BQU8sSUFBSSxhQUFhLEVBQ3hCLFdBQVcsR0FDWixNQUFNLHdCQUF3QixDQUFDO0FBQ2hDLE9BQU8sRUFBRSxLQUFLLElBQUksU0FBUyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQzFDLE9BQU8sRUFBRSxDQUFDLEVBQUUsTUFBTSxLQUFLLENBQUM7QUFDeEIsT0FBTyxFQUFFLFlBQVksRUFBRSxRQUFRLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFDbkQsT0FBTyxFQUFFLHVCQUF1QixFQUFFLElBQUksSUFBSSxrQkFBa0IsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBRXpGLE1BQU0sTUFBTSxHQUFHLEdBQUcsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUM7QUFDcEMsTUFBTSxlQUFlLEdBQUcsSUFBSSxHQUFHLEVBQThCLENBQUM7QUErQzlELE1BQU0sYUFBYSxHQUFHLFdBQVcsQ0FBQztBQUNsQyxNQUFNLGVBQWUsR0FBNEIsQ0FBQyxRQUFRLEVBQUUsS0FBSyxFQUFFLFFBQVEsRUFBRSxRQUFRLEVBQUUsS0FBSyxDQUFDLENBQUM7QUFDOUYsTUFB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LEtBQUssU0FBUyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxDQUFDO0FBQ3pELENBQUM7QUFFRCxTQUFTLFdBQVcsQ0FBQyxHQUFXO0lBQzlCLE1BQU0sSUFBSSxHQUFHLGNBQWMsQ0FBQyxHQUFHLEVBQUUsY0FBYyxDQUFDLENBQUM7SUFDakQsSUFBSSxDQUFDLElBQUk7UUFBRSxPQUFPLFNBQVMsQ0FBQztJQUM1QixNQUFNLElBQUksR0FBRyxZQUFZLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsQ0FBQyxFQUFFLEdBQUcsRUFBRTtRQUM1RCxJQUFJLENBQUM7WUFDSCxNQUFNLE1BQU0sR0FBRyxTQUFTLENBQUMsWUFBWSxDQUFDLElBQUksRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFDO1lBQ3JELE9BQU8sTUFBTSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7UUFDdEQsQ0FBQztRQUFDLE1BQU0sQ0FBQztZQUNQLE1BQU0sQ0FBQyxJQUFJLENBQUMsMEJBQTBCLEVBQUUsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO1lBQ2xELE9BQU8sU0FBUyxDQUFDO1FBQ25CLENBQUM7SUFDSCxDQUFDLENBQUMsQ0FBQztJQUNILE9BQU8sSUFBSSxLQUFLLFNBQVMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsQ0FBQztBQUN6RCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBMYXllcmVkIGNvbmZpZ3VyYXRpb24gbG9va3VwOiBlbnZpcm9ubWVudCwgYC5lbnZgLCBidW5kbGUsIGFuZCBgYXBwLnlhbWxgLlxuICpcbiAqIEV2ZXJ5IHBhY2thZ2UgcmVzb2x2ZXMgc2V0dGluZ3MgdGhlIHNhbWUgd2F5OiB0YWtlIHRoZSBjYWxsZXIncyB2YWx1ZSwgZWxzZVxuICogYW4gZW52aXJvbm1lbnQgdmFyaWFibGUsIGVsc2UgYSBkZWZhdWx0LiBMb2NhbCBkZXZlbG9wbWVudCBhZGRzIHR3byBmYWxsYmFja1xuICogbG9jYXRpb25zOiBgLmVudmAgZmlsZXMsIG9uZSBBcHAncyBgcmVzb3VyY2VzLmFwcHMuPGFwcD4uY29uZmlnLmVudmAgaW5cbiAqIGBkYXRhYnJpY2tzLnltbGAsIGFuZCBsaXRlcmFsIGVudiB2YWx1ZXMgaW4gYGFwcC55YW1sYCAvIGBhcHAueW1sYC5cbiAqXG4gKiB7QGxpbmsgdmFsdWVzfSBpcyBMQVpZIChhbiBgb2JqZWN0LlNlcXVlbmNlYCksIHNvIGBkYXRhYnJpY2tzIGJ1bmRsZSB2YWxpZGF0ZWBcbiAqIGlzIG9ubHkgc3Bhd25lZCB3aGVuIHRoZSBlbnZpcm9ubWVudCBhbmQgYC5lbnZgIGJvdGggbWlzc2VkOyBhcHAgWUFNTCBpcyBvbmx5XG4gKiByZWFkIGFmdGVyIHRoZSBidW5kbGUgc291cmNlIGFsc28gbWlzc2VkLlxuICpcbiAqIEluc2lkZSBhIGRlcGxveWVkIERhdGFicmlja3MgQXBwIGFsbCB0aHJlZSBmaWxlIHNvdXJjZXMgYXJlIHNraXBwZWQgYnkgZGVmYXVsdFxuICogKHtAbGluayBpc0RhdGFicmlja3NBcHBFbnZ9KTogdGhlIHBsYXRmb3JtIGhhcyBhbHJlYWR5IHR1cm5lZCB0aGVtIGludG8gcmVhbFxuICogZW52aXJvbm1lbnQgdmFyaWFibGVzLCB0aGVyZSBpcyBubyBidW5kbGUgdG8gdmFsaWRhdGUsIGFuZCB0aGUgYGRhdGFicmlja3NgXG4gKiBDTEkgaXMgbm90IG9uIHRoZSBpbWFnZS4gQm9vbGVhbiBlbnZpcm9ubWVudCBvdmVycmlkZXMgY2FuIGZvcmNlIGVpdGhlciBmaWxlXG4gKiBzb3VyY2Ugb24gb3Igb2ZmIHdoZW4gYSB0b29sIG5lZWRzIGRpZmZlcmVudCBiZWhhdmlvci5cbiAqXG4gKiBPbmx5IHRoZSBzaW5nbGUgYnVuZGxlIGFwcCdzIGBjb25maWcuZW52YCBhbmQgbGl0ZXJhbCBhcHAgWUFNTCBgZW52W10udmFsdWVgXG4gKiBlbnRyaWVzIGFyZSBjb25zdWx0ZWQuIFJvb3QgYnVuZGxlIGB2YXJpYWJsZXNgIGFyZSBub3Q6IHRoZXkgYXJlIGF1dGhvcmluZ1xuICogaW5wdXRzIGZvciB0aGUgYnVuZGxlIGl0c2VsZiAoaW50ZXJwb2xhdGVkIGludG8gdGFyZ2V0cywgcmVzb3VyY2VzLCBhbmQgcGF0aHMpLFxuICogc28gdHJlYXRpbmcgb25lIGFzIGEgcHJvY2VzcyBzZXR0aW5nIHJlc29sdmVzIG5hbWVzIHRoZSBkZXBsb3llZCBhcHAgbmV2ZXIgc2Vlcy5cbiAqXG4gKiBUaGlzIG1vZHVsZSBpcyB0aGUgcmVwb3NpdG9yeS13aWRlIG93bmVyIGZvciBsYXllcmVkIGNvbmZpZ3VyYXRpb24uIFJldXNlIGl0XG4gKiBpbnN0ZWFkIG9mIGFkZGluZyBsb2NhbCBlbnZpcm9ubWVudC1uYW1lIGdlbmVyYXRpb24sIGAuZW52YCByZWFkZXJzLCBidW5kbGVcbiAqIHZhbGlkYXRpb24sIEFwcCBZQU1MIHBhcnNpbmcsIG9yIHNjYWxhciBjb2VyY2lvbiBwb2xpY3kuXG4gKlxuICogTm9kZS1vbmx5IChgY2hpbGRfcHJvY2Vzc2AsIGBmc2AsIGBwcm9jZXNzYCkuXG4gKlxuICogQG1vZHVsZVxuICovXG5cbmltcG9ydCB7IHNwYXduU3luYyB9IGZyb20gXCJub2RlOmNoaWxkX3Byb2Nlc3NcIjtcbmltcG9ydCB7IHJlYWRGaWxlU3luYyB9IGZyb20gXCJub2RlOmZzXCI7XG5pbXBvcnQgeyBkaXJuYW1lLCBpc0Fic29sdXRlLCByZWxhdGl2ZSwgcmVzb2x2ZSwgc2VwIH0gZnJvbSBcIm5vZGU6cGF0aFwiO1xuaW1wb3J0IHsgcGFyc2VFbnYgfSBmcm9tIFwibm9kZTp1dGlsXCI7XG5pbXBvcnQge1xuICBlbnZpcm9ubWVudFV0aWxzLFxuICBqc29uLFxuICBsb2csXG4gIG9iamVjdCxcbiAgb3B0aW9ucyBhcyBzaGFyZWRPcHRpb25zLFxuICBzdHJpbmdVdGlscyxcbn0gZnJvbSBcIkBkYngtdG9vbHMvc2hhcmVkLWNvcmVcIjtcbmltcG9ydCB7IHBhcnNlIGFzIHBhcnNlWWFtbCB9IGZyb20gXCJ5YW1sXCI7XG5pbXBvcnQgeyB6IH0gZnJvbSBcInpvZFwiO1xuaW1wb3J0IHsgY2FjaGVkUmVjb3JkLCBzdGF0U3luYyB9IGZyb20gXCIuL2ZpbGUudHNcIjtcbmltcG9ydCB7IHJlc29sdmVXb3JraW5nRGlyZWN0b3J5LCByb290IGFzIHJlc29sdmVQcm9qZWN0Um9vdCB9IGZyb20gXCIuL3Byb2plY3QtdXRpbHMudHNcIjtcblxuY29uc3QgbG9nZ2VyID0gbG9nLmxvZ2dlcihcImNvbmZpZ1wiKTtcbmNvbnN0IGNvbmZpZ0ZpbGVDYWNoZSA9IG5ldyBNYXA8c3RyaW5nLCBzdHJpbmcgfCB1bmRlZmluZWQ+KCk7XG5cbnR5cGUgQ29uZmlnS2V5ID0gc3RyaW5nIHwgcmVhZG9ubHkgc3RyaW5nW107XG5cbi8qKiBTY2FsYXIgb3IgbGlzdCB2YWx1ZSBhY2NlcHRlZCBieSBhbiBpbi1tZW1vcnkgY29uZmlndXJhdGlvbiBtYXAuICovXG5leHBvcnQgdHlwZSBDb25maWdNYXBWYWx1ZSA9IHN0cmluZyB8IHJlYWRvbmx5IHN0cmluZ1tdIHwgbnVsbCB8IHVuZGVmaW5lZDtcbi8qKiBJbW11dGFibGUgc3RyaW5nLWtleWVkIGNvbmZpZ3VyYXRpb24gdmFsdWVzIHVzZWQgYnkgdGhlIGBjb25maWdgIHNvdXJjZS4gKi9cbmV4cG9ydCB0eXBlIENvbmZpZ0RhdGEgPSBSZWFkb25seTxSZWNvcmQ8c3RyaW5nLCBDb25maWdNYXBWYWx1ZT4+O1xuXG4vKiogV2hlcmUgYSB2YWx1ZSBtYXkgY29tZSBmcm9tLCBjb25zdWx0ZWQgaW4gdGhlIG9yZGVyIGdpdmVuLiAqL1xuZXhwb3J0IHR5cGUgQ29uZmlnU291cmNlID0gXCJjb25maWdcIiB8IFwiZW52XCIgfCBcImRvdGVudlwiIHwgXCJidW5kbGVcIiB8IFwiYXBwXCI7XG5cbi8qKiBTb3VyY2Ugb3JkZXIsIG5hbWVzcGFjZXMsIHBhcnNlZCBmaWxlcywgYW5kIHdvcmtpbmcgZGlyZWN0b3J5IGZvciB2YWx1ZSByZXNvbHV0aW9uLiAqL1xuZXhwb3J0IGludGVyZmFjZSBDb25maWdPcHRpb25zIHtcbiAgLyoqXG4gICAqIE91dGVybW9zdCBuYW1lc3BhY2VzIHRyaWVkIGJlZm9yZSBlYWNoIGtleS4gRGVmYXVsdHMgdG8gYERCWF9UT09MU2AuXG4gICAqL1xuICBzY29wZT86IHN0cmluZyB8IHJlYWRvbmx5IHN0cmluZ1tdO1xuICAvKiogQ2FwYWJpbGl0eSBuYW1lc3BhY2VzIGluc2VydGVkIGFmdGVyIHRoZSBzY29wZSBhbmQgYmVmb3JlIGVhY2gga2V5LiAqL1xuICBwcmVmaXg/OiBzdHJpbmcgfCByZWFkb25seSBzdHJpbmdbXTtcbiAgLyoqIENvbnN0YW50IGNvbmZpZyBtYXBzIHJlYWQgYnkgdGhlIGBjb25maWdgIHNvdXJjZS4gKi9cbiAgZGF0YT86IENvbmZpZ0RhdGEgfCByZWFkb25seSBDb25maWdEYXRhW107XG4gIC8qKiBQYXJzZWQgYnVuZGxlIGRhdGEgdXNlZCBpbnN0ZWFkIG9mIGxvYWRpbmcgYGRhdGFicmlja3MueW1sYC4gKi9cbiAgYnVuZGxlRGF0YT86IENvbmZpZ0ZpbGUgfCBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgLyoqIEF1dGgtcmVzb2x2ZWQgRGF0YWJyaWNrcyBwcm9maWxlIHBhc3NlZCBleHBsaWNpdGx5IHRvIGJ1bmRsZSB2YWxpZGF0aW9uLiAqL1xuICBidW5kbGVQcm9maWxlPzogc3RyaW5nO1xuICAvKiogUGFyc2VkIGFwcCBZQU1MIGRhdGEgdXNlZCBpbnN0ZWFkIG9mIGxvYWRpbmcgYGFwcC55YW1sYC4gKi9cbiAgYXBwRGF0YT86IENvbmZpZ0ZpbGUgfCBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgLyoqIFNvdXJjZXMgaW4gcHJlY2VkZW5jZSBvcmRlci4gRGVmYXVsdDogYGNvbmZpZ2AsIGBlbnZgLCBgZG90ZW52YCwgYGJ1bmRsZWAsIGBhcHBgLiAqL1xuICBzb3VyY2VzPzogQ29uZmlnU291cmNlIHwgcmVhZG9ubHkgQ29uZmlnU291cmNlW107XG4gIC8qKiBEaXJlY3RvcnkgdG8gcmVzb2x2ZSBgLmVudmAgYW5kIHRoZSBidW5kbGUgZnJvbS4gRGVmYXVsdDogYHByb2Nlc3MuY3dkKClgLiAqL1xuICBjd2Q/OiBzdHJpbmc7XG59XG5cbi8qKiBPbmUgcmVzb2x2ZWQgdmFsdWUsIHRhZ2dlZCB3aXRoIHRoZSBrZXkgYW5kIHNvdXJjZSBpdCBjYW1lIGZyb20uICovXG5pbnRlcmZhY2UgQ29uZmlnVmFsdWUge1xuICBrZXk6IHN0cmluZztcbiAgc291cmNlOiBDb25maWdTb3VyY2U7XG4gIHZhbHVlOiBzdHJpbmc7XG59XG5cbi8qKiBBIGNvbmZpZyBmaWxlIGZvdW5kIG9uIGRpc2ssIHdpdGggaXRzIHBhcnNlZCBjb250ZW50cy4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ29uZmlnRmlsZSB7XG4gIHBhdGg6IHN0cmluZztcbiAgZGF0YTogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG59XG5cbmNvbnN0IERFRkFVTFRfU0NPUEUgPSBcIkRCWF9UT09MU1wiO1xuY29uc3QgREVGQVVMVF9TT1VSQ0VTOiByZWFkb25seSBDb25maWdTb3VyY2VbXSA9IFtcImNvbmZpZ1wiLCBcImVudlwiLCBcImRvdGVudlwiLCBcImJ1bmRsZVwiLCBcImFwcFwiXTtcbmNvbnN0IEJVTkRMRV9GSUxFX05BTUVTID0gW1wiZGF0YWJyaWNrcy55bWxcIiwgXCJkYXRhYnJpY2tzLnlhbWxcIl0gYXMgY29uc3Q7XG5jb25zdCBBUFBfRklMRV9OQU1FUyA9IFtcImFwcC55YW1sXCIsIFwiYXBwLnltbFwiXSBhcyBjb25zdDtcbmNvbnN0IERPVEVOVl9GSUxFX05BTUUgPSBcIi5lbnZcIjtcbmNvbnN0IE5PREVfRU5WX0FMVEVSTkFUSVZFUyA9IHtcbiAgcHJvZHVjdGlvbjogW1wicHJvZFwiXSxcbiAgZGV2ZWxvcG1lbnQ6IFtcImRldlwiXSxcbn0gYXMgY29uc3Qgc2F0aXNmaWVzIFJlY29yZDxzdHJpbmcsIHJlYWRvbmx5IHN0cmluZ1tdPjtcblxuLyoqIEhpZ2hlc3QgdmFsaWQgVENQIHBvcnQgbnVtYmVyLiAqL1xuZXhwb3J0IGNvbnN0IE1BWF9UQ1BfUE9SVCA9IHNoYXJlZE9wdGlvbnMuTUFYX1RDUF9QT1JUO1xuXG4vKiogQm9vbGVhbiBlbnZpcm9ubWVudCBvdmVycmlkZSBmb3IgcHJvamVjdCBgLmVudmAgcmVhZHMuICovXG5jb25zdCBDT05GSUdfRE9URU5WX0tFWSA9IFwiREJYX1RPT0xTX0NPTkZJR19ET1RFTlZcIjtcblxuLyoqIEJvb2xlYW4gZW52aXJvbm1lbnQgb3ZlcnJpZGUgZm9yIERhdGFicmlja3MgYnVuZGxlIHJlYWRzLiAqL1xuY29uc3QgQ09ORklHX0JVTkRMRV9LRVkgPSBcIkRCWF9UT09MU19DT05GSUdfQlVORExFXCI7XG5cbi8qKiBCb29sZWFuIGVudmlyb25tZW50IG92ZXJyaWRlIGZvciBEYXRhYnJpY2tzIEFwcCBZQU1MIHJlYWRzLiAqL1xuY29uc3QgQ09ORklHX0FQUF9LRVkgPSBcIkRCWF9UT09MU19DT05GSUdfQVBQXCI7XG5cbi8qKiBFeGFjdCBwcm9jZXNzLWVudmlyb25tZW50IGxvb2t1cCBmb3IgY2FsbGVycyB0aGF0IGRvIG5vdCByZWFkIGxvY2FsIGNvbmZpZyBmaWxlcy4gKi9cbmV4cG9ydCBjb25zdCBFTlZfT05MWSA9IHsgc2NvcGU6IFtdIGFzIGNvbnN0LCBzb3VyY2VzOiBcImVudlwiIGFzIGNvbnN0IH07XG5cbi8qKiBOb24tZW1wdHkgbGl0ZXJhbCBjb25maWd1cmF0aW9uIHZhbHVlIHdpdGggdW5yZXNvbHZlZCBpbnRlcnBvbGF0aW9uIHJlamVjdGVkLiAqL1xuZXhwb3J0IGNvbnN0IHZhbHVlU2NoZW1hID0gelxuICAuc3RyaW5nKClcbiAgLnRyaW0oKVxuICAubWluKDEpXG4gIC5yZWZpbmUoKHZhbHVlOiBzdHJpbmcpID0+ICEvXFwkXFx7W159XStcXH0vLnRlc3QodmFsdWUpLCB7XG4gICAgbWVzc2FnZTogXCJJbnRlcnBvbGF0ZWQgdmFsdWVzIGFyZSBub3QgYWxsb3dlZFwiLFxuICB9KTtcblxuY29uc3QgcG9ydFZhbHVlU2NoZW1hID0gc2hhcmVkT3B0aW9ucy50Y3BQb3J0U2NoZW1hO1xuXG5jb25zdCBwb3NpdGl2ZU51bWJlclZhbHVlID0gei5wcmVwcm9jZXNzKChpbnB1dCkgPT4gb2JqZWN0LnRvTnVtYmVyKGlucHV0KSwgei5udW1iZXIoKS5wb3NpdGl2ZSgpKTtcbmNvbnN0IHBvc2l0aXZlSW50VmFsdWUgPSBwb3NpdGl2ZU51bWJlclZhbHVlLnRyYW5zZm9ybShNYXRoLmZsb29yKTtcblxuLyoqIEEgbmFtZWQgYnVuZGxlIG9yIEFwcCByZXNvdXJjZTsgY29uY3JldGUgcmVzb3VyY2UgZmllbGRzIHBhc3MgdGhyb3VnaC4gKi9cbmV4cG9ydCBjb25zdCBidW5kbGVSZXNvdXJjZVNjaGVtYSA9IHoub2JqZWN0KHsgbmFtZTogdmFsdWVTY2hlbWEub3B0aW9uYWwoKSB9KS5wYXNzdGhyb3VnaCgpO1xuXG4vKiogRGF0YWJyaWNrcyBidW5kbGUgYXBwbGljYXRpb24gZW52aXJvbm1lbnQgZW50cnkuICovXG5leHBvcnQgY29uc3QgYnVuZGxlRW52RW50cnlTY2hlbWEgPSB6Lm9iamVjdCh7XG4gIG5hbWU6IHZhbHVlU2NoZW1hLm9wdGlvbmFsKCksXG4gIHZhbHVlOiB6LnN0cmluZygpLm9wdGlvbmFsKCksXG4gIHZhbHVlX2Zyb206IHZhbHVlU2NoZW1hLm9wdGlvbmFsKCksXG59KTtcblxuLyoqIERhdGFicmlja3MgYnVuZGxlIGFwcGxpY2F0aW9uIGZpZWxkcyB1c2VkIGJ5IGxvY2FsIGNvbmZpZ3VyYXRpb24gcmVzb2x1dGlvbi4gKi9cbmV4cG9ydCBjb25zdCBidW5kbGVBcHBTY2hlbWEgPSB6Lm9iamVjdCh7XG4gIG5hbWU6IHZhbHVlU2NoZW1hLm9wdGlvbmFsKCksXG4gIGNvbmZpZzogei5vYmplY3QoeyBlbnY6IHouYXJyYXkoYnVuZGxlRW52RW50cnlTY2hlbWEpLm9wdGlvbmFsKCkgfSkub3B0aW9uYWwoKSxcbiAgcmVzb3VyY2VzOiB6LmFycmF5KGJ1bmRsZVJlc291cmNlU2NoZW1hKS5vcHRpb25hbCgpLFxufSk7XG5cbi8qKiBEYXRhYnJpY2tzIEFwcCBZQU1MIGVudmlyb25tZW50IGVudHJ5LiAqL1xuZXhwb3J0IGNvbnN0IGFwcEVudkVudHJ5U2NoZW1hID0gei5vYmplY3Qoe1xuICBuYW1lOiB2YWx1ZVNjaGVtYSxcbiAgdmFsdWU6IHouc3RyaW5nKCkub3B0aW9uYWwoKSxcbiAgdmFsdWVGcm9tOiB2YWx1ZVNjaGVtYS5vcHRpb25hbCgpLFxufSk7XG5cbi8qKiBEYXRhYnJpY2tzIEFwcCBZQU1MIGZpZWxkcyB1c2VkIGJ5IGxvY2FsIGNvbmZpZ3VyYXRpb24gcmVzb2x1dGlvbi4gKi9cbmV4cG9ydCBjb25zdCBhcHBTY2hlbWEgPSB6Lm9iamVjdCh7XG4gIGVudjogei5hcnJheShhcHBFbnZFbnRyeVNjaGVtYSkub3B0aW9uYWwoKSxcbiAgcmVzb3VyY2VzOiB6LmFycmF5KGJ1bmRsZVJlc291cmNlU2NoZW1hKS5vcHRpb25hbCgpLFxufSk7XG5cbmNvbnN0IGJ1bmRsZUNvbmZpZ1NjaGVtYSA9IHoub2JqZWN0KHtcbiAgcmVzb3VyY2VzOiB6Lm9iamVjdCh7IGFwcHM6IHoucmVjb3JkKHouc3RyaW5nKCksIGJ1bmRsZUFwcFNjaGVtYSkub3B0aW9uYWwoKSB9KS5vcHRpb25hbCgpLFxufSk7XG5cbi8qKiBGbGF0dGVuIHRoZSBzaW5nbGUgYnVuZGxlIEFwcCdzIGBjb25maWcuZW52YCwgcmVzb2x2aW5nIHJlc291cmNlIHJlZmVyZW5jZXMuICovXG5leHBvcnQgZnVuY3Rpb24gZmxhdHRlbkJ1bmRsZUVudihkYXRhOiB1bmtub3duKTogUmVjb3JkPHN0cmluZywgc3RyaW5nPiB7XG4gIGNvbnN0IHBhcnNlZCA9IGJ1bmRsZUNvbmZpZ1NjaGVtYS5zYWZlUGFyc2UoZGF0YSk7XG4gIGlmICghcGFyc2VkLnN1Y2Nlc3MpIHJldHVybiB7fTtcbiAgY29uc3QgYXBwcyA9IE9iamVjdC52YWx1ZXMocGFyc2VkLmRhdGEucmVzb3VyY2VzPy5hcHBzID8/IHt9KTtcbiAgaWYgKGFwcHMubGVuZ3RoICE9PSAxKSByZXR1cm4ge307XG4gIGNvbnN0IGFwcCA9IGFwcHNbMF07XG4gIGNvbnN0IHJlc291cmNlcyA9IG5ldyBNYXAoXG4gICAgKGFwcD8ucmVzb3VyY2VzID8/IFtdKVxuICAgICAgLmZpbHRlcigocmVzb3VyY2UpID0+IHJlc291cmNlLm5hbWUpXG4gICAgICAubWFwKChyZXNvdXJjZSkgPT4gW3Jlc291cmNlLm5hbWUhLCByZXNvdXJjZV0gYXMgY29uc3QpLFxuICApO1xuICBjb25zdCByZXN1bHQ6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7fTtcbiAgZm9yIChjb25zdCBlbnRyeSBvZiBhcHA/LmNvbmZpZz8uZW52ID8/IFtdKSB7XG4gICAgaWYgKCFlbnRyeS5uYW1lKSBjb250aW51ZTtcbiAgICBjb25zdCBsaXRlcmFsID0gdmFsdWVTY2hlbWEuc2FmZVBhcnNlKGVudHJ5LnZhbHVlKTtcbiAgICBpZiAobGl0ZXJhbC5zdWNjZXNzKSB7XG4gICAgICByZXN1bHRbZW50cnkubmFtZV0gPSBsaXRlcmFsLmRhdGE7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgY29uc3QgcmVmZXJlbmNlZCA9IGVudHJ5LnZhbHVlX2Zyb21cbiAgICAgID8gcmVzb3VyY2VWYWx1ZShyZXNvdXJjZXMuZ2V0KGVudHJ5LnZhbHVlX2Zyb20pKVxuICAgICAgOiB1bmRlZmluZWQ7XG4gICAgaWYgKHJlZmVyZW5jZWQpIHJlc3VsdFtlbnRyeS5uYW1lXSA9IHJlZmVyZW5jZWQ7XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuLyoqIEZsYXR0ZW4gYGFwcC55YW1sYCBlbnYgZW50cmllcywgcmVzb2x2aW5nIGB2YWx1ZUZyb21gIHJlc291cmNlIHJlZmVyZW5jZXMuICovXG5leHBvcnQgZnVuY3Rpb24gZmxhdHRlbkFwcEVudihkYXRhOiB1bmtub3duKTogUmVjb3JkPHN0cmluZywgc3RyaW5nPiB7XG4gIGNvbnN0IHBhcnNlZCA9IGFwcFNjaGVtYS5zYWZlUGFyc2UoZGF0YSk7XG4gIGlmICghcGFyc2VkLnN1Y2Nlc3MpIHJldHVybiB7fTtcbiAgY29uc3QgcmVzb3VyY2VzID0gbmV3IE1hcChcbiAgICAocGFyc2VkLmRhdGEucmVzb3VyY2VzID8/IFtdKVxuICAgICAgLmZpbHRlcigocmVzb3VyY2UpID0+IHJlc291cmNlLm5hbWUpXG4gICAgICAubWFwKChyZXNvdXJjZSkgPT4gW3Jlc291cmNlLm5hbWUhLCByZXNvdXJjZV0gYXMgY29uc3QpLFxuICApO1xuICBjb25zdCByZXN1bHQ6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7fTtcbiAgZm9yIChjb25zdCBlbnRyeSBvZiBwYXJzZWQuZGF0YS5lbnYgPz8gW10pIHtcbiAgICBjb25zdCBsaXRlcmFsID0gdmFsdWVTY2hlbWEuc2FmZVBhcnNlKGVudHJ5LnZhbHVlKTtcbiAgICBpZiAobGl0ZXJhbC5zdWNjZXNzKSB7XG4gICAgICByZXN1bHRbZW50cnkubmFtZV0gPSBsaXRlcmFsLmRhdGE7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgY29uc3QgcmVmZXJlbmNlZCA9IGVudHJ5LnZhbHVlRnJvbSA/IHJlc291cmNlVmFsdWUocmVzb3VyY2VzLmdldChlbnRyeS52YWx1ZUZyb20pKSA6IHVuZGVmaW5lZDtcbiAgICBpZiAocmVmZXJlbmNlZCkgcmVzdWx0W2VudHJ5Lm5hbWVdID0gcmVmZXJlbmNlZDtcbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufVxuXG5mdW5jdGlvbiByZXNvdXJjZVZhbHVlKHJlc291cmNlOiB1bmtub3duKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgZm9yIChjb25zdCBwYXRoIG9mIFtcbiAgICBbXCJzcWxfd2FyZWhvdXNlXCIsIFwiaWRcIl0sXG4gICAgW1wiZ2VuaWVfc3BhY2VcIiwgXCJzcGFjZV9pZFwiXSxcbiAgICBbXCJwb3N0Z3Jlc1wiLCBcImVuZHBvaW50XCJdLFxuICAgIFtcInBvc3RncmVzXCIsIFwiZGF0YWJhc2VcIl0sXG4gICAgW1wicG9zdGdyZXNcIiwgXCJicmFuY2hcIl0sXG4gIF0gYXMgY29uc3QpIHtcbiAgICBsZXQgdmFsdWUgPSByZXNvdXJjZTtcbiAgICBmb3IgKGNvbnN0IHBhcnQgb2YgcGF0aCkgdmFsdWUgPSBvYmplY3QuaXNSZWNvcmQodmFsdWUpID8gdmFsdWVbcGFydF0gOiB1bmRlZmluZWQ7XG4gICAgY29uc3QgcGFyc2VkID0gdmFsdWVTY2hlbWEuc2FmZVBhcnNlKHZhbHVlKTtcbiAgICBpZiAocGFyc2VkLnN1Y2Nlc3MpIHJldHVybiBwYXJzZWQuZGF0YTtcbiAgfVxuICByZXR1cm4gdW5kZWZpbmVkO1xufVxuXG4vKiogV2FsayBhIGRvdC1zZXBhcmF0ZWQgcGF0aCB0aHJvdWdoIHBhcnNlZCBidW5kbGUgZGF0YS4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRCdW5kbGVQYXRoKGRhdGE6IFJlY29yZDxzdHJpbmcsIHVua25vd24+LCBwYXRoOiBzdHJpbmcpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBjb25zdCBwYXJ0cyA9IHBhdGguc3BsaXQoXCIuXCIpLmZpbHRlcihCb29sZWFuKTtcbiAgaWYgKHBhcnRzLmxlbmd0aCA9PT0gMCkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgbGV0IGN1cnJlbnQ6IHVua25vd24gPSBkYXRhO1xuICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgcGFydHMubGVuZ3RoOyBpbmRleCsrKSB7XG4gICAgaWYgKCFvYmplY3QuaXNSZWNvcmQoY3VycmVudCkpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgY29uc3QgbmV4dCA9IGN1cnJlbnRbcGFydHNbaW5kZXhdIV07XG4gICAgaWYgKGluZGV4ID09PSBwYXJ0cy5sZW5ndGggLSAxKSB7XG4gICAgICBjb25zdCBkaXJlY3QgPSB2YWx1ZVNjaGVtYS5zYWZlUGFyc2UobmV4dCk7XG4gICAgICBpZiAoZGlyZWN0LnN1Y2Nlc3MpIHJldHVybiBkaXJlY3QuZGF0YTtcbiAgICAgIGlmIChvYmplY3QuaXNSZWNvcmQobmV4dCkpIHtcbiAgICAgICAgY29uc3QgbmVzdGVkID0gdmFsdWVTY2hlbWEuc2FmZVBhcnNlKG5leHQudmFsdWUpO1xuICAgICAgICByZXR1cm4gbmVzdGVkLnN1Y2Nlc3MgPyBuZXN0ZWQuZGF0YSA6IHVuZGVmaW5lZDtcbiAgICAgIH1cbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuICAgIGN1cnJlbnQgPSBuZXh0O1xuICB9XG4gIHJldHVybiB1bmRlZmluZWQ7XG59XG5cbi8qKlxuICogRGV0ZWN0IGEgRGF0YWJyaWNrcyBBcHAgcnVudGltZSBmcm9tIGl0cyByZXF1aXJlZCBuYW1lLCBob3N0LCBhbmQgcG9ydC5cbiAqXG4gKiBgREJYX1RPT0xTX0RBVEFCUklDS1NfQVBQX0VOVmAgdGFrZXMgcHJlY2VkZW5jZSB3aGVuIGl0IGNvbnRhaW5zIGEgcmVjb2duaXplZFxuICogYm9vbGVhbiB2YWx1ZS4gVGhpcyBsZXRzIGxvY2FsIHRvb2xzIGVtdWxhdGUgdGhlIGRlcGxveWVkIHJ1bnRpbWUgKGB0cnVlYCkgb3JcbiAqIGxldHMgdW51c3VhbCBkZXBsb3llZCBwcm9jZXNzZXMgcmV0YWluIGxvY2FsIGNvbmZpZyBsb29rdXAgKGBmYWxzZWApLiBBblxuICogYWJzZW50IG9yIHVucmVjb2duaXplZCBvdmVycmlkZSBmYWxscyBiYWNrIHRvIHN0cnVjdHVyYWwgZGV0ZWN0aW9uLlxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNEYXRhYnJpY2tzQXBwRW52KFxuICBzb3VyY2U6IFJlY29yZDxzdHJpbmcsIHN0cmluZyB8IHVuZGVmaW5lZD4gPSBwcm9jZXNzLmVudixcbik6IGJvb2xlYW4ge1xuICByZXR1cm4gZW52aXJvbm1lbnRVdGlscy5pc0RhdGFicmlja3NBcHBFbnYoc291cmNlKTtcbn1cblxuLyoqIEV4YWN0LCB1cHBlcmNhc2UsIGFuZCB0b2tlbml6ZWQtdXBwZXJjYXNlIG5hbWVzIGZvciBhIGh1bWFuLWZyaWVuZGx5IGtleS4gKi9cbmV4cG9ydCBmdW5jdGlvbiBlbnZpcm9ubWVudEtleXMobmFtZTogc3RyaW5nKTogcmVhZG9ubHkgc3RyaW5nW10ge1xuICBjb25zdCB0cmltbWVkID0gbmFtZS50cmltKCk7XG4gIGlmICghdHJpbW1lZCkgcmV0dXJuIFtdO1xuICByZXR1cm4gb2JqZWN0XG4gICAgLnNlcXVlbmNlKFxuICAgICAgdHJpbW1lZCxcbiAgICAgIHRyaW1tZWQudG9VcHBlckNhc2UoKSxcbiAgICAgIEFycmF5LmZyb20oc3RyaW5nVXRpbHMudG9rZW5pemUodHJpbW1lZCkpLmpvaW4oXCJfXCIpLnRvVXBwZXJDYXNlKCksXG4gICAgKVxuICAgIC5maWx0ZXIoQm9vbGVhbilcbiAgICAuZGlzdGluY3QoKVxuICAgIC50b0FycmF5KCk7XG59XG5cbi8qKiBDYW5kaWRhdGUgbmFtZXMgaW4gc2NvcGUsIHByZWZpeCwgYW5kIGlucHV0IHByZWNlZGVuY2Ugb3JkZXIuICovXG5mdW5jdGlvbiBrZXlzKFxuICBpbnB1dDogQ29uZmlnS2V5LFxuICBvcHRpb25zOiBQaWNrPENvbmZpZ09wdGlvbnMsIFwic2NvcGVcIiB8IFwicHJlZml4XCI+ID0ge30sXG4pOiByZWFkb25seSBzdHJpbmdbXSB7XG4gIGNvbnN0IHNjb3BlcyA9IG9iamVjdFxuICAgIC5zZXF1ZW5jZShvcHRpb25zLnNjb3BlID8/IERFRkFVTFRfU0NPUEUpXG4gICAgLm1hcChzdHJpbmdVdGlscy50cmltVG9FbXB0eSlcbiAgICAuZmlsdGVyKEJvb2xlYW4pXG4gICAgLmRpc3RpbmN0KClcbiAgICAudG9BcnJheSgpO1xuICBjb25zdCBwcmVmaXhlcyA9XG4gICAgb3B0aW9ucy5wcmVmaXggPT09IHVuZGVmaW5lZFxuICAgICAgPyBbXVxuICAgICAgOiBvYmplY3RcbiAgICAgICAgICAuc2VxdWVuY2Uob3B0aW9ucy5wcmVmaXgpXG4gICAgICAgICAgLm1hcChzdHJpbmdVdGlscy50cmltVG9FbXB0eSlcbiAgICAgICAgICAuZmlsdGVyKEJvb2xlYW4pXG4gICAgICAgICAgLmRpc3RpbmN0KClcbiAgICAgICAgICAudG9BcnJheSgpO1xuICByZXR1cm4gb2JqZWN0XG4gICAgLnNlcXVlbmNlKGlucHV0KVxuICAgIC5tYXAoc3RyaW5nVXRpbHMudHJpbVRvRW1wdHkpXG4gICAgLmZpbHRlcihCb29sZWFuKVxuICAgIC5kaXN0aW5jdCgpXG4gICAgLmZsYXRNYXAoKGtleSkgPT4ge1xuICAgICAgY29uc3QgcHJlZml4ZWQgPSBwcmVmaXhlcy5sZW5ndGggPiAwID8gcHJlZml4ZXMubWFwKChwcmVmaXgpID0+IGAke3ByZWZpeH1fJHtrZXl9YCkgOiBba2V5XTtcbiAgICAgIHJldHVybiBbXG4gICAgICAgIC4uLnNjb3Blcy5mbGF0TWFwKChzY29wZSkgPT4gcHJlZml4ZWQubWFwKChuYW1lKSA9PiBgJHtzY29wZX1fJHtuYW1lfWApKSxcbiAgICAgICAgLi4ucHJlZml4ZWQsXG4gICAgICAgIGtleSxcbiAgICAgIF07XG4gICAgfSlcbiAgICAuZGlzdGluY3QoKVxuICAgIC50b0FycmF5KCk7XG59XG5cbi8qKlxuICogRXZlcnkgdmFsdWUgdGhhdCByZXNvbHZlcyBmb3IgYGlucHV0YCwgaW4gc291cmNlLXRoZW4ta2V5IHByZWNlZGVuY2Ugb3JkZXIsXG4gKiBhcyBhIExBWlkgc2VxdWVuY2U6IG5vdGhpbmcgcGFzdCB0aGUgZmlyc3QgY29uc3VtZWQgZWxlbWVudCBpcyByZWFkLCBzb1xuICogYHZhbHVlcyhrZXkpLmF0KDApYCBuZXZlciBzcGF3bnMgdGhlIERhdGFicmlja3MgQ0xJIHdoZW4gdGhlIGVudmlyb25tZW50XG4gKiBhbHJlYWR5IGFuc3dlcmVkLlxuICpcbiAqL1xuZnVuY3Rpb24gdmFsdWVzKGlucHV0OiBDb25maWdLZXksIG9wdGlvbnM6IENvbmZpZ09wdGlvbnMgPSB7fSk6IG9iamVjdC5TZXF1ZW5jZTxDb25maWdWYWx1ZT4ge1xuICBjb25zdCBjYW5kaWRhdGVzID0ga2V5cyhpbnB1dCwgb3B0aW9ucyk7XG4gIGNvbnN0IHNvdXJjZXMgPSBjb25maWdTb3VyY2VzKG9wdGlvbnMpO1xuICByZXR1cm4gb2JqZWN0LnNlcXVlbmNlKHtcbiAgICAqW1N5bWJvbC5pdGVyYXRvcl0oKTogR2VuZXJhdG9yPENvbmZpZ1ZhbHVlPiB7XG4gICAgICBmb3IgKGNvbnN0IHNvdXJjZSBvZiBzb3VyY2VzKSB7XG4gICAgICAgIGZvciAoY29uc3QgbWFwIG9mIHJlYWQoc291cmNlLCBvcHRpb25zKSkge1xuICAgICAgICAgIGZvciAoY29uc3Qga2V5IG9mIGNhbmRpZGF0ZXMpIHtcbiAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gY29uZmlnTWFwVmFsdWUobWFwW2tleV0pO1xuICAgICAgICAgICAgaWYgKHZhbHVlICE9PSBudWxsKSB5aWVsZCB7IGtleSwgc291cmNlLCB2YWx1ZSB9O1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0sXG4gIH0pO1xufVxuXG5mdW5jdGlvbiBjb25maWdTb3VyY2VzKG9wdGlvbnM6IENvbmZpZ09wdGlvbnMpOiByZWFkb25seSBDb25maWdTb3VyY2VbXSB7XG4gIGNvbnN0IHNvdXJjZXM6IENvbmZpZ1NvdXJjZVtdID0gW1xuICAgIC4uLm9iamVjdC5zZXF1ZW5jZTxDb25maWdTb3VyY2U+KG9wdGlvbnMuc291cmNlcyA/PyBERUZBVUxUX1NPVVJDRVMpLmRpc3RpbmN0KCksXG4gIF07XG4gIGlmIChvcHRpb25zLmRhdGEgIT09IHVuZGVmaW5lZCAmJiBvcHRpb25zLnNvdXJjZXMgIT09IHVuZGVmaW5lZCAmJiAhc291cmNlcy5pbmNsdWRlcyhcImNvbmZpZ1wiKSkge1xuICAgIHNvdXJjZXMucHVzaChcImNvbmZpZ1wiKTtcbiAgfVxuICByZXR1cm4gc291cmNlcztcbn1cblxuZnVuY3Rpb24gY29uZmlnTWFwVmFsdWUodmFsdWU6IENvbmZpZ01hcFZhbHVlIHwgdW5rbm93bik6IHN0cmluZyB8IG51bGwge1xuICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICBmb3IgKGNvbnN0IGVudHJ5IG9mIHZhbHVlKSB7XG4gICAgICBjb25zdCByZXNvbHZlZCA9IHN0cmluZ1V0aWxzLnRyaW1Ub051bGwoZW50cnkpO1xuICAgICAgaWYgKHJlc29sdmVkICE9PSBudWxsKSByZXR1cm4gcmVzb2x2ZWQ7XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xuICB9XG4gIHJldHVybiBzdHJpbmdVdGlscy50cmltVG9OdWxsKHZhbHVlKTtcbn1cblxuLyoqXG4gKiBUaGUgZmlyc3QgdmFsdWUgdGhhdCByZXNvbHZlcyBmb3IgYGlucHV0YCwgb3IgYHVuZGVmaW5lZGAuXG4gKlxuICogQGV4YW1wbGVcbiAqIGNvbnN0IGRvbWFpbiA9IGNvbmZpZy50ZXh0KFtcIlRVTk5FTF9QVUJMSUNfRE9NQUlOXCIsIFwiUFVCTElDX0RPTUFJTlwiXSk7XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0ZXh0KGlucHV0OiBDb25maWdLZXksIG9wdGlvbnM6IENvbmZpZ09wdGlvbnMgPSB7fSk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIHJldHVybiB2YWx1ZXMoaW5wdXQsIG9wdGlvbnMpLmF0KDApPy52YWx1ZTtcbn1cblxuLyoqIFJlc29sdmUgYSBodW1hbi1mcmllbmRseSBuYW1lIHRocm91Z2gge0BsaW5rIGVudmlyb25tZW50S2V5c30gYW5kIHtAbGluayB0ZXh0fS4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZXNvbHZlVmFsdWUobmFtZTogc3RyaW5nLCBvcHRpb25zOiBDb25maWdPcHRpb25zID0ge30pOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICByZXR1cm4gdGV4dChlbnZpcm9ubWVudEtleXMobmFtZSksIG9wdGlvbnMpO1xufVxuXG4vKipcbiAqIFRoZSBQUklNQVJZIChmdWxseS1zY29wZWQpIG5hbWUgZm9yIGBpbnB1dGAgLSB3aGF0IHRvIHByaW50IGluIGEgbG9nIGxpbmUgb3IgYW5cbiAqIGVycm9yLCBzbyB0aGUgbWVzc2FnZSBuYW1lcyB0aGUgdmFyaWFibGUgYSByZWFkZXIgc2hvdWxkIHNldC4gRG8gbm90IGluZGV4XG4gKiBga2V5cyguLi4pWzBdYCBmb3IgdGhpcyBpZiBgaW5wdXRgIG1heSBiZSBhIGJhcmUgc3RyaW5nLlxuICpcbiAqIEBleGFtcGxlXG4gKiBsb2dnZXIud2FybihgJHtjb25maWcubmFtZShKV1RfU0VDUkVUX0VOVil9IGlzIG5vdCBzZXRgKTtcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG5hbWUoXG4gIGlucHV0OiBDb25maWdLZXksXG4gIG9wdGlvbnM6IFBpY2s8Q29uZmlnT3B0aW9ucywgXCJzY29wZVwiIHwgXCJwcmVmaXhcIj4gPSB7fSxcbik6IHN0cmluZyB7XG4gIHJldHVybiBrZXlzKGlucHV0LCBvcHRpb25zKVswXSA/PyBcIlwiO1xufVxuXG4vKipcbiAqIFNhZmUgYC5lbnYuPG5hbWU+YCBzdWZmaXhlcyBmb3IgYSBOb2RlIGVudmlyb25tZW50LCBleGFjdCBzcGVsbGluZyBmaXJzdC5cbiAqIEtub3duIGxvbmcgYW5kIHNob3J0IG5hbWVzIGFyZSBpbnRlcmNoYW5nZWFibGU7IHVua25vd24gbmFtZXMgcGFzcyB0aHJvdWdoLlxuICovXG5mdW5jdGlvbiBub2RlRW52TmFtZXMobm9kZUVudjogdW5rbm93bik6IHN0cmluZ1tdIHtcbiAgY29uc3QgbmFtZSA9IHN0cmluZ1V0aWxzLnRyaW1Ub051bGwobm9kZUVudik/LnRvTG93ZXJDYXNlKCk7XG4gIGlmICghbmFtZSB8fCAhL15bYS16MC05Xy1dKyQvLnRlc3QobmFtZSkpIHJldHVybiBbXTtcbiAgZm9yIChjb25zdCBbY2Fub25pY2FsLCBhbHRlcm5hdGl2ZXNdIG9mIE9iamVjdC5lbnRyaWVzKE5PREVfRU5WX0FMVEVSTkFUSVZFUykpIHtcbiAgICBjb25zdCBuYW1lczogcmVhZG9ubHkgc3RyaW5nW10gPSBhbHRlcm5hdGl2ZXM7XG4gICAgaWYgKG5hbWUgPT09IGNhbm9uaWNhbCB8fCBuYW1lcy5pbmNsdWRlcyhuYW1lKSkge1xuICAgICAgcmV0dXJuIFsuLi5vYmplY3Quc2VxdWVuY2UobmFtZSwgY2Fub25pY2FsLCBhbHRlcm5hdGl2ZXMpLmRpc3RpbmN0KCldO1xuICAgIH1cbiAgfVxuICByZXR1cm4gW25hbWVdO1xufVxuXG4vKipcbiAqIFJlc29sdmUgYSBzdHJpbmc6IGBjb25maWd1cmVkYCB3aGVuIG5vbi1lbXB0eSwgZWxzZSB7QGxpbmsgdGV4dH0sIGVsc2UgYHVuZGVmaW5lZGAuXG4gKlxuICogVGhlIGNvZXJjaW9uIHJ1bGVzIGFyZSBkZWxpYmVyYXRlbHkgbG9vc2UgKGBvbmAgLyBgeWVzYCAvIGAxYCBhcmUgYWxsXG4gKiBgdHJ1ZWApIGJlY2F1c2UgdmFsdWVzIG1heSBjb21lIGZyb20gYSBmaWxlIGEgaHVtYW4gdHlwZWQuXG4gKlxuICogQGV4YW1wbGVcbiAqIGNvbmZpZy5zdHJpbmcob3B0aW9ucy5ob3N0LCBcIlNNVFBfSE9TVFwiKTtcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHN0cmluZyhcbiAgY29uZmlndXJlZDogdW5rbm93bixcbiAgaW5wdXQ6IENvbmZpZ0tleSxcbiAgb3B0aW9ucz86IENvbmZpZ09wdGlvbnMsXG4pOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICByZXR1cm4gc3RyaW5nVXRpbHMudHJpbVRvTnVsbChjb25maWd1cmVkKSA/PyB0ZXh0KGlucHV0LCBvcHRpb25zKTtcbn1cblxuLyoqXG4gKiBSZXNvbHZlIGEgYm9vbGVhbiB0aHJvdWdoIGBvYmplY3QudG9Cb29sZWFuYC4gYHVuZGVmaW5lZGAgd2hlbiBuZWl0aGVyIHNvdXJjZVxuICogaXMgaW50ZXJwcmV0YWJsZSwgc28gdGhlIGNhbGxlciBwaWNrcyBhIGRlZmF1bHQgd2l0aCBgPz9gLlxuICovXG5leHBvcnQgZnVuY3Rpb24gYm9vbGVhbihcbiAgY29uZmlndXJlZDogdW5rbm93bixcbiAgaW5wdXQ6IENvbmZpZ0tleSxcbiAgb3B0aW9ucz86IENvbmZpZ09wdGlvbnMsXG4pOiBib29sZWFuIHwgdW5kZWZpbmVkIHtcbiAgcmV0dXJuIG9iamVjdC50b0Jvb2xlYW4oY29uZmlndXJlZCkgPz8gb2JqZWN0LnRvQm9vbGVhbih0ZXh0KGlucHV0LCBvcHRpb25zKSk7XG59XG5cbi8qKiBQYXJzZSBhIGZpbml0ZSBudW1iZXIgd2l0aCB0aGUgc2hhcmVkIHNjYWxhciBjb2VyY2lvbiBydWxlcy4gKi9cbmV4cG9ydCBjb25zdCB0b051bWJlciA9IG9iamVjdC50b051bWJlcjtcblxuLyoqXG4gKiBSZXNvbHZlIGEgcG9zaXRpdmUgbnVtYmVyIHRoYXQgbWF5IGJlIGZyYWN0aW9uYWwgKGEgc2NvcmUgdGhyZXNob2xkLCBhIHJhdGlvKS5cbiAqIFVzZSB7QGxpbmsgcG9zaXRpdmVJbnR9IGZvciBhIGNvdW50LCBwb3J0LCBvciB0aW1lb3V0LlxuICovXG5leHBvcnQgZnVuY3Rpb24gcG9zaXRpdmVOdW1iZXIoXG4gIGNvbmZpZ3VyZWQ6IHVua25vd24sXG4gIGlucHV0OiBDb25maWdLZXksXG4gIGZhbGxiYWNrOiBudW1iZXIsXG4gIG9wdGlvbnM/OiBDb25maWdPcHRpb25zLFxuKTogbnVtYmVyIHtcbiAgY29uc3QgZnJvbUNvbmZpZyA9IHBvc2l0aXZlTnVtYmVyVmFsdWUuc2FmZVBhcnNlKGNvbmZpZ3VyZWQpO1xuICBpZiAoZnJvbUNvbmZpZy5zdWNjZXNzKSByZXR1cm4gZnJvbUNvbmZpZy5kYXRhO1xuICBjb25zdCBmcm9tU291cmNlcyA9IHBvc2l0aXZlTnVtYmVyVmFsdWUuc2FmZVBhcnNlKHRleHQoaW5wdXQsIG9wdGlvbnMpKTtcbiAgcmV0dXJuIGZyb21Tb3VyY2VzLnN1Y2Nlc3MgPyBmcm9tU291cmNlcy5kYXRhIDogZmFsbGJhY2s7XG59XG5cbi8qKlxuICogUmVzb2x2ZSBhIHBvc2l0aXZlIGludGVnZXIgKGEgcG9ydCwgYSB0aW1lb3V0LCBhIHBhZ2Ugc2l6ZSksIGZsb29yZWQuIEFcbiAqIG5vbi1udW1lcmljIG9yIG5vbi1wb3NpdGl2ZSB2YWx1ZSBpcyB0cmVhdGVkIGFzIEFCU0VOVCByYXRoZXIgdGhhbiBmYXRhbCAtXG4gKiB0aGVzZSBhcmUgY2VpbGluZ3Mgd2hlcmUgYSBzYW5lIGRlZmF1bHQgYmVhdHMgYSBib290IGZhaWx1cmUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwb3NpdGl2ZUludChcbiAgY29uZmlndXJlZDogdW5rbm93bixcbiAgaW5wdXQ6IENvbmZpZ0tleSxcbiAgZmFsbGJhY2s6IG51bWJlcixcbiAgb3B0aW9ucz86IENvbmZpZ09wdGlvbnMsXG4pOiBudW1iZXIge1xuICBjb25zdCBmcm9tQ29uZmlnID0gcG9zaXRpdmVJbnRWYWx1ZS5zYWZlUGFyc2UoY29uZmlndXJlZCk7XG4gIGlmIChmcm9tQ29uZmlnLnN1Y2Nlc3MpIHJldHVybiBmcm9tQ29uZmlnLmRhdGE7XG4gIGNvbnN0IGZyb21Tb3VyY2VzID0gcG9zaXRpdmVJbnRWYWx1ZS5zYWZlUGFyc2UodGV4dChpbnB1dCwgb3B0aW9ucykpO1xuICByZXR1cm4gZnJvbVNvdXJjZXMuc3VjY2VzcyA/IGZyb21Tb3VyY2VzLmRhdGEgOiBNYXRoLmZsb29yKGZhbGxiYWNrKTtcbn1cblxuLyoqXG4gKiBSZXNvbHZlIGEgVENQIHBvcnQgYmV0d2VlbiAxIGFuZCB7QGxpbmsgTUFYX1RDUF9QT1JUfS4gSW52YWxpZCBjb25maWd1cmVkIG9yXG4gKiBzb3VyY2VkIHZhbHVlcyBmYWxsIGJhY2sgdG8gdGhlIGNhbGxlcidzIGRlZmF1bHQsIHdoaWNoIG1heSBiZSBhIHNlbnRpbmVsXG4gKiBzdWNoIGFzIGAwYCB3aGVuIHRoZSBjYWxsZXIgdXNlcyBvbmUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwb3J0KFxuICBjb25maWd1cmVkOiB1bmtub3duLFxuICBpbnB1dDogQ29uZmlnS2V5LFxuICBmYWxsYmFjazogbnVtYmVyLFxuICBvcHRpb25zPzogQ29uZmlnT3B0aW9ucyxcbik6IG51bWJlciB7XG4gIGNvbnN0IGZyb21Db25maWcgPSBwb3J0VmFsdWVTY2hlbWEuc2FmZVBhcnNlKGNvbmZpZ3VyZWQpO1xuICBpZiAoZnJvbUNvbmZpZy5zdWNjZXNzKSByZXR1cm4gZnJvbUNvbmZpZy5kYXRhO1xuICBjb25zdCBmcm9tU291cmNlcyA9IHBvcnRWYWx1ZVNjaGVtYS5zYWZlUGFyc2UodGV4dChpbnB1dCwgb3B0aW9ucykpO1xuICByZXR1cm4gZnJvbVNvdXJjZXMuc3VjY2VzcyA/IGZyb21Tb3VyY2VzLmRhdGEgOiBmYWxsYmFjaztcbn1cblxuLyoqXG4gKiBSZXNvbHZlIGEgbGlzdCB0aHJvdWdoIGBzdHJpbmdVdGlscy5wYXJzZUxpc3RgLCBzbyBhbiBhcnJheSBmcm9tIHR5cGVkIGNvbmZpZyBhbmQgYVxuICogYFwiYSwgYiBjXCJgIHN0cmluZyBub3JtYWxpemUgaWRlbnRpY2FsbHkuIGBbXWAgd2hlbiBuZWl0aGVyIHNvdXJjZSBoYXMgZW50cmllcy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGxpc3QoXG4gIGNvbmZpZ3VyZWQ6IHN0cmluZyB8IHJlYWRvbmx5IHN0cmluZ1tdIHwgdW5kZWZpbmVkIHwgbnVsbCxcbiAgaW5wdXQ6IENvbmZpZ0tleSxcbiAgdHJhbnNmb3JtPzogKGVudHJ5OiBzdHJpbmcpID0+IHN0cmluZyxcbiAgb3B0aW9ucz86IENvbmZpZ09wdGlvbnMsXG4pOiBzdHJpbmdbXSB7XG4gIGNvbnN0IGZyb21Db25maWcgPSBzdHJpbmdVdGlscy5wYXJzZUxpc3QoY29uZmlndXJlZCwgdHJhbnNmb3JtKTtcbiAgcmV0dXJuIGZyb21Db25maWcubGVuZ3RoID4gMFxuICAgID8gZnJvbUNvbmZpZ1xuICAgIDogc3RyaW5nVXRpbHMucGFyc2VMaXN0KHRleHQoaW5wdXQsIG9wdGlvbnMpLCB0cmFuc2Zvcm0pO1xufVxuXG4vKipcbiAqIFRoZSBEYXRhYnJpY2tzIGJ1bmRsZSBvdXRwdXQgZm9yIGBjd2RgIC0gYGRhdGFicmlja3MgYnVuZGxlIHZhbGlkYXRlIC0tb3V0cHV0XG4gKiBqc29uYCBydW4gZnJvbSB0aGUgZGlyZWN0b3J5IGhvbGRpbmcgYGRhdGFicmlja3MueW1sYCwgd2l0aCB0aGUgY29uZmlnIGZpbGUnc1xuICogcGF0aC4gQSBub24temVybyB2YWxpZGF0aW9uIG1heSBzdGlsbCByZXR1cm4gcGFydGlhbCBKU09OIHdpdGggdXNhYmxlIEFwcFxuICogY29uZmlnLiBgdW5kZWZpbmVkYCB3aGVuIGJ1bmRsZSByZWFkcyBhcmUgZGlzYWJsZWQsIHRoZSBwcm9jZXNzIGlzIHByb2R1Y3Rpb25cbiAqIG9yIGEgZGVwbG95ZWQgQXBwIHdpdGhvdXQgYW4gZXhwbGljaXQgb3ZlcnJpZGUsIHRoZXJlIGlzIG5vIGJ1bmRsZSwgb3IgdGhlXG4gKiBDTEkgcHJvZHVjZXMgbm8gSlNPTi5cbiAqXG4gKiBQYXJzZWQgdmFsaWRhdGlvbiBvdXRwdXQgaXMgY2FjaGVkIGJ5IGJ1bmRsZSBwYXRoIGFuZCBEYXRhYnJpY2tzIHByb2ZpbGUuXG4gKlxuICovXG5leHBvcnQgZnVuY3Rpb24gYnVuZGxlRmlsZShjd2Q/OiBzdHJpbmcgfCBudWxsLCBwcm9maWxlPzogc3RyaW5nIHwgbnVsbCk6IENvbmZpZ0ZpbGUgfCB1bmRlZmluZWQge1xuICBjb25zdCBvdmVycmlkZSA9IG9iamVjdC50b0Jvb2xlYW4ocHJvY2Vzcy5lbnZbQ09ORklHX0JVTkRMRV9LRVldKTtcbiAgaWYgKG92ZXJyaWRlID09PSBmYWxzZSkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgaWYgKFxuICAgIG92ZXJyaWRlID09PSB1bmRlZmluZWQgJiZcbiAgICAocHJvY2Vzcy5lbnYuTk9ERV9FTlY/LnRyaW0oKS50b0xvd2VyQ2FzZSgpID09PSBcInByb2R1Y3Rpb25cIiB8fCBpc0RhdGFicmlja3NBcHBFbnYoKSlcbiAgKSB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuICBjb25zdCByZXNvbHZlZCA9IHJlc29sdmVXb3JraW5nRGlyZWN0b3J5KGN3ZCk7XG4gIHJldHVybiBsb2FkQnVuZGxlRmlsZShyZXNvbHZlZCwgc3RyaW5nVXRpbHMudHJpbVRvTnVsbChwcm9maWxlKSk7XG59XG5cbi8qKiBUaGUgcGFyc2VkIGBhcHAueWFtbGAgLyBgYXBwLnltbGAgZm9yIGBjd2RgLCB3aGVuIGxvY2FsIEFwcCBjb25maWcgcmVhZHMgYXJlIGVuYWJsZWQuICovXG5leHBvcnQgZnVuY3Rpb24gYXBwRmlsZShjd2Q/OiBzdHJpbmcgfCBudWxsKTogQ29uZmlnRmlsZSB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IGVuYWJsZWQgPSBvYmplY3QudG9Cb29sZWFuKHByb2Nlc3MuZW52W0NPTkZJR19BUFBfS0VZXSkgPz8gIWlzRGF0YWJyaWNrc0FwcEVudigpO1xuICBpZiAoIWVuYWJsZWQpIHJldHVybiB1bmRlZmluZWQ7XG4gIHJldHVybiBsb2FkQXBwRmlsZShyZXNvbHZlV29ya2luZ0RpcmVjdG9yeShjd2QpKTtcbn1cblxuLyoqIFRoZSBzaW5nbGUgYnVuZGxlIEFwcCdzIHJlc29sdmVkIGVudmlyb25tZW50LCB3aGVuIGF2YWlsYWJsZS4gKi9cbmZ1bmN0aW9uIGJ1bmRsZUVudmlyb25tZW50KG9wdGlvbnM6IENvbmZpZ09wdGlvbnMpOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+IHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgZGF0YSA9XG4gICAgc291cmNlRGF0YShvcHRpb25zLmJ1bmRsZURhdGEpID8/IGJ1bmRsZUZpbGUob3B0aW9ucy5jd2QsIG9wdGlvbnMuYnVuZGxlUHJvZmlsZSk/LmRhdGE7XG4gIHJldHVybiBkYXRhID8gZmxhdHRlbkJ1bmRsZUVudihkYXRhKSA6IHVuZGVmaW5lZDtcbn1cblxuZnVuY3Rpb24gYXBwRW52aXJvbm1lbnQob3B0aW9uczogQ29uZmlnT3B0aW9ucyk6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gfCB1bmRlZmluZWQge1xuICBjb25zdCBkYXRhID0gc291cmNlRGF0YShvcHRpb25zLmFwcERhdGEpID8/IGFwcEZpbGUob3B0aW9ucy5jd2QpPy5kYXRhO1xuICByZXR1cm4gZGF0YSA/IGZsYXR0ZW5BcHBFbnYoZGF0YSkgOiB1bmRlZmluZWQ7XG59XG5cbmZ1bmN0aW9uIHNvdXJjZURhdGEoXG4gIHNvdXJjZTogQ29uZmlnRmlsZSB8IFJlY29yZDxzdHJpbmcsIHVua25vd24+IHwgdW5kZWZpbmVkLFxuKTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gfCB1bmRlZmluZWQge1xuICBpZiAoIXNvdXJjZSkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgaWYgKFwicGF0aFwiIGluIHNvdXJjZSAmJiB0eXBlb2Ygc291cmNlLnBhdGggPT09IFwic3RyaW5nXCIgJiYgb2JqZWN0LmlzUmVjb3JkKHNvdXJjZS5kYXRhKSkge1xuICAgIHJldHVybiBzb3VyY2UuZGF0YTtcbiAgfVxuICByZXR1cm4gc291cmNlIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xufVxuXG4vKiogUGFyc2VkIGAuZW52YCBmb3IgYGN3ZGAsIG9yIGB7fWA7IHBhcnNlZCBmaWxlIGRhdGEgaXMgY2FjaGVkIGJ5IHBhdGguICovXG5mdW5jdGlvbiBkb3RlbnYoY3dkPzogc3RyaW5nIHwgbnVsbCk6IFJlY29yZDxzdHJpbmcsIHN0cmluZyB8IHVuZGVmaW5lZD4ge1xuICBjb25zdCBlbmFibGVkID0gb2JqZWN0LnRvQm9vbGVhbihwcm9jZXNzLmVudltDT05GSUdfRE9URU5WX0tFWV0pID8/ICFpc0RhdGFicmlja3NBcHBFbnYoKTtcbiAgaWYgKCFlbmFibGVkKSByZXR1cm4ge307XG4gIGNvbnN0IHJlc29sdmVkID0gcmVzb2x2ZVdvcmtpbmdEaXJlY3RvcnkoY3dkKTtcbiAgcmV0dXJuIGxvYWREb3RlbnYocmVzb2x2ZWQsIG5vZGVFbnZOYW1lcyhwcm9jZXNzLmVudi5OT0RFX0VOVikpO1xufVxuXG4vKiogTWFwcyBmb3Igb25lIHNvdXJjZSBpbiBwcmVjZWRlbmNlIG9yZGVyLiAqL1xuZnVuY3Rpb24gcmVhZChcbiAgc291cmNlOiBDb25maWdTb3VyY2UsXG4gIG9wdGlvbnM6IENvbmZpZ09wdGlvbnMsXG4pOiBvYmplY3QuU2VxdWVuY2U8UmVhZG9ubHk8UmVjb3JkPHN0cmluZywgdW5rbm93bj4+PiB7XG4gIHJldHVybiBvYmplY3Quc2VxdWVuY2Uoe1xuICAgICpbU3ltYm9sLml0ZXJhdG9yXSgpOiBHZW5lcmF0b3I8UmVhZG9ubHk8UmVjb3JkPHN0cmluZywgdW5rbm93bj4+PiB7XG4gICAgICBzd2l0Y2ggKHNvdXJjZSkge1xuICAgICAgICBjYXNlIFwiY29uZmlnXCI6IHtcbiAgICAgICAgICBjb25zdCBkYXRhID0gb3B0aW9ucy5kYXRhO1xuICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KGRhdGEpKSB7XG4gICAgICAgICAgICB5aWVsZCogZGF0YTtcbiAgICAgICAgICB9IGVsc2UgaWYgKGRhdGEgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgeWllbGQgZGF0YSBhcyBDb25maWdEYXRhO1xuICAgICAgICAgIH1cbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBjYXNlIFwiZW52XCI6XG4gICAgICAgICAgeWllbGQgcHJvY2Vzcy5lbnY7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgXCJkb3RlbnZcIjpcbiAgICAgICAgICB5aWVsZCBkb3RlbnYob3B0aW9ucy5jd2QpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFwiYnVuZGxlXCI6IHtcbiAgICAgICAgICBjb25zdCBlbnZpcm9ubWVudCA9IGJ1bmRsZUVudmlyb25tZW50KG9wdGlvbnMpO1xuICAgICAgICAgIGlmIChlbnZpcm9ubWVudCkgeWllbGQgZW52aXJvbm1lbnQ7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSBcImFwcFwiOiB7XG4gICAgICAgICAgY29uc3QgZW52aXJvbm1lbnQgPSBhcHBFbnZpcm9ubWVudChvcHRpb25zKTtcbiAgICAgICAgICBpZiAoZW52aXJvbm1lbnQpIHlpZWxkIGVudmlyb25tZW50O1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihgVW5rbm93biBjb25maWcgc291cmNlOiAke3NvdXJjZX1gKTtcbiAgICAgIH1cbiAgICB9LFxuICB9KTtcbn1cblxuLyoqXG4gKiBMb2NhdGUgYG5hbWVzYCBmcm9tIGBjd2RgIG91dHdhcmQuIGBjd2RgIGl0c2VsZiBpcyBjaGVja2VkIGJlZm9yZSB0aGVcbiAqIGRpc2NvdmVyZWQgcHJvamVjdCByb290cyBzbyBhIHBhY2thZ2UtbG9jYWwgZmlsZSB3aW5zIG92ZXIgdGhlIHdvcmtzcGFjZSdzLlxuICovXG5mdW5jdGlvbiBmaW5kQ29uZmlnRmlsZShjd2Q6IHN0cmluZywgbmFtZXM6IHJlYWRvbmx5IHN0cmluZ1tdKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgY29uc3Qgc3RhcnQgPSByZXNvbHZlKGN3ZCk7XG4gIGNvbnN0IGtleSA9IEpTT04uc3RyaW5naWZ5KFtzdGFydCwgLi4ubmFtZXNdKTtcbiAgaWYgKGNvbmZpZ0ZpbGVDYWNoZS5oYXMoa2V5KSkgcmV0dXJuIGNvbmZpZ0ZpbGVDYWNoZS5nZXQoa2V5KTtcbiAgY29uc3Qgcm9vdCA9IHJlc29sdmVQcm9qZWN0Um9vdChzdGFydCk7XG4gIGNvbnN0IHBhdGhGcm9tUm9vdCA9IHJvb3QgPyByZWxhdGl2ZShyb290LCBzdGFydCkgOiB1bmRlZmluZWQ7XG4gIGNvbnN0IGJvdW5kYXJ5ID1cbiAgICByb290ICYmXG4gICAgcGF0aEZyb21Sb290ICE9PSB1bmRlZmluZWQgJiZcbiAgICAhaXNBYnNvbHV0ZShwYXRoRnJvbVJvb3QpICYmXG4gICAgcGF0aEZyb21Sb290ICE9PSBcIi4uXCIgJiZcbiAgICAhcGF0aEZyb21Sb290LnN0YXJ0c1dpdGgoYC4uJHtzZXB9YClcbiAgICAgID8gcm9vdFxuICAgICAgOiB1bmRlZmluZWQ7XG4gIGZvciAobGV0IGRpciA9IHN0YXJ0OyA7IGRpciA9IGRpcm5hbWUoZGlyKSkge1xuICAgIGZvciAoY29uc3QgbmFtZSBvZiBuYW1lcykge1xuICAgICAgY29uc3QgcGF0aCA9IHJlc29sdmUoZGlyLCBuYW1lKTtcbiAgICAgIGlmIChzdGF0U3luYyhwYXRoKT8uaXNGaWxlKCkpIHtcbiAgICAgICAgY29uZmlnRmlsZUNhY2hlLnNldChrZXksIHBhdGgpO1xuICAgICAgICByZXR1cm4gcGF0aDtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGJvdW5kYXJ5ID09PSB1bmRlZmluZWQgfHwgZGlyID09PSBib3VuZGFyeSkgYnJlYWs7XG4gIH1cbiAgY29uZmlnRmlsZUNhY2hlLnNldChrZXksIHVuZGVmaW5lZCk7XG4gIHJldHVybiB1bmRlZmluZWQ7XG59XG5cbmZ1bmN0aW9uIGxvYWREb3RlbnYoXG4gIGN3ZDogc3RyaW5nLFxuICBlbnZpcm9ubWVudHM6IHJlYWRvbmx5IHN0cmluZ1tdLFxuKTogUmVjb3JkPHN0cmluZywgc3RyaW5nIHwgdW5kZWZpbmVkPiB7XG4gIGNvbnN0IG5hbWVzID0gWy4uLmVudmlyb25tZW50cy5tYXAoKG5hbWUpID0+IGAke0RPVEVOVl9GSUxFX05BTUV9LiR7bmFtZX1gKSwgRE9URU5WX0ZJTEVfTkFNRV07XG4gIGNvbnN0IHBhdGggPSBmaW5kQ29uZmlnRmlsZShjd2QsIG5hbWVzKTtcbiAgaWYgKCFwYXRoKSByZXR1cm4ge307XG4gIHJldHVybiAoXG4gICAgY2FjaGVkUmVjb3JkKEpTT04uc3RyaW5naWZ5KFtcImRvdGVudlwiLCBwYXRoXSksICgpID0+IHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHJldHVybiBwYXJzZUVudihyZWFkRmlsZVN5bmMocGF0aCwgXCJ1dGY4XCIpKTtcbiAgICAgIH0gY2F0Y2gge1xuICAgICAgICBsb2dnZXIud2FybihcImZhaWxlZCB0byByZWFkIGRvdGVudiBmaWxlXCIsIHsgcGF0aCB9KTtcbiAgICAgICAgcmV0dXJuIHt9O1xuICAgICAgfVxuICAgIH0pID8/IHt9XG4gICk7XG59XG5cbmZ1bmN0aW9uIGxvYWRCdW5kbGVGaWxlKGN3ZDogc3RyaW5nLCBwcm9maWxlOiBzdHJpbmcgfCBudWxsKTogQ29uZmlnRmlsZSB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IHBhdGggPSBmaW5kQ29uZmlnRmlsZShjd2QsIEJVTkRMRV9GSUxFX05BTUVTKTtcbiAgaWYgKCFwYXRoKSByZXR1cm4gdW5kZWZpbmVkO1xuICBjb25zdCBkYXRhID0gY2FjaGVkUmVjb3JkKEpTT04uc3RyaW5naWZ5KFtcImJ1bmRsZVwiLCBwYXRoLCBwcm9maWxlXSksICgpID0+IHtcbiAgICBjb25zdCBhcmdzID0gW1xuICAgICAgXCJidW5kbGVcIixcbiAgICAgIFwidmFsaWRhdGVcIixcbiAgICAgIFwiLS1vdXRwdXRcIixcbiAgICAgIFwianNvblwiLFxuICAgICAgLi4uKHByb2ZpbGUgPT09IG51bGwgPyBbXSA6IFtcIi0tcHJvZmlsZVwiLCBwcm9maWxlXSksXG4gICAgXTtcbiAgICBjb25zdCBlbnZpcm9ubWVudCA9IHsgLi4ucHJvY2Vzcy5lbnYgfTtcbiAgICBkZWxldGUgZW52aXJvbm1lbnQuREFUQUJSSUNLU19DT05GSUdfUFJPRklMRTtcbiAgICBjb25zdCByZXN1bHQgPSBzcGF3blN5bmMoXCJkYXRhYnJpY2tzXCIsIGFyZ3MsIHtcbiAgICAgIGN3ZDogcmVzb2x2ZShwYXRoLCBcIi4uXCIpLFxuICAgICAgZW52OiBlbnZpcm9ubWVudCxcbiAgICAgIGVuY29kaW5nOiBcInV0ZjhcIixcbiAgICAgIHN0ZGlvOiBbXCJpZ25vcmVcIiwgXCJwaXBlXCIsIFwicGlwZVwiXSxcbiAgICB9KTtcbiAgICBjb25zdCBvdXRwdXQgPSBzdHJpbmdVdGlscy50cmltVG9OdWxsKHJlc3VsdC5zdGRvdXQpO1xuICAgIGNvbnN0IGVycm9yID0gc3RyaW5nVXRpbHMudHJpbVRvTnVsbChyZXN1bHQuc3RkZXJyKTtcbiAgICBpZiAob3V0cHV0ID09PSBudWxsKSB7XG4gICAgICBsb2dnZXIuZGVidWcoXCJidW5kbGUgdmFsaWRhdGUgcHJvZHVjZWQgbm8gSlNPTlwiLCB7IHBhdGgsIHN0YXR1czogcmVzdWx0LnN0YXR1cywgZXJyb3IgfSk7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cbiAgICBjb25zdCBwYXJzZWQgPSBqc29uLnBhcnNlUmVjb3JkKG91dHB1dCk7XG4gICAgaWYgKCFwYXJzZWQpIHtcbiAgICAgIGxvZ2dlci53YXJuKFwiZmFpbGVkIHRvIHBhcnNlIGJ1bmRsZSB2YWxpZGF0ZSBvdXRwdXRcIiwgeyBwYXRoLCBzdGF0dXM6IHJlc3VsdC5zdGF0dXMgfSk7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cbiAgICBpZiAocmVzdWx0LnN0YXR1cyAhPT0gMCkge1xuICAgICAgbG9nZ2VyLmRlYnVnKFwidXNpbmcgcGFydGlhbCBidW5kbGUgb3V0cHV0XCIsIHsgcGF0aCwgc3RhdHVzOiByZXN1bHQuc3RhdHVzLCBlcnJvciB9KTtcbiAgICB9XG4gICAgcmV0dXJuIHBhcnNlZDtcbiAgfSk7XG4gIHJldHVybiBkYXRhID09PSB1bmRlZmluZWQgPyB1bmRlZmluZWQgOiB7IHBhdGgsIGRhdGEgfTtcbn1cblxuZnVuY3Rpb24gbG9hZEFwcEZpbGUoY3dkOiBzdHJpbmcpOiBDb25maWdGaWxlIHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgcGF0aCA9IGZpbmRDb25maWdGaWxlKGN3ZCwgQVBQX0ZJTEVfTkFNRVMpO1xuICBpZiAoIXBhdGgpIHJldHVybiB1bmRlZmluZWQ7XG4gIGNvbnN0IGRhdGEgPSBjYWNoZWRSZWNvcmQoSlNPTi5zdHJpbmdpZnkoW1wiYXBwXCIsIHBhdGhdKSwgKCkgPT4ge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBwYXJzZWQgPSBwYXJzZVlhbWwocmVhZEZpbGVTeW5jKHBhdGgsIFwidXRmOFwiKSk7XG4gICAgICByZXR1cm4gb2JqZWN0LmlzUmVjb3JkKHBhcnNlZCkgPyBwYXJzZWQgOiB1bmRlZmluZWQ7XG4gICAgfSBjYXRjaCB7XG4gICAgICBsb2dnZXIud2FybihcImZhaWxlZCB0byBwYXJzZSBhcHAgeWFtbFwiLCB7IHBhdGggfSk7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cbiAgfSk7XG4gIHJldHVybiBkYXRhID09PSB1bmRlZmluZWQgPyB1bmRlZmluZWQgOiB7IHBhdGgsIGRhdGEgfTtcbn1cbiJdfQ==
|
|
581
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uZmlnLXV0aWxzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2NvbmZpZy11dGlscy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQStCRztBQUVILE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUMvQyxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sU0FBUyxDQUFDO0FBQ3ZDLE9BQU8sRUFBRSxPQUFPLEVBQUUsVUFBVSxFQUFFLFFBQVEsRUFBRSxPQUFPLEVBQUUsR0FBRyxFQUFFLE1BQU0sV0FBVyxDQUFDO0FBQ3hFLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFDckMsT0FBTyxFQUNMLGdCQUFnQixFQUNoQixJQUFJLEVBQ0osR0FBRyxFQUNILE1BQU0sRUFDTixPQUFPLElBQUksYUFBYSxFQUN4QixXQUFXLEdBQ1osTUFBTSx3QkFBd0IsQ0FBQztBQUNoQyxPQUFPLEVBQUUsS0FBSyxJQUFJLFNBQVMsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUMxQyxPQUFPLEVBQUUsQ0FBQyxFQUFFLE1BQU0sS0FBSyxDQUFDO0FBQ3hCLE9BQU8sRUFBRSxZQUFZLEVBQUUsUUFBUSxFQUFFLE1BQU0sV0FBVyxDQUFDO0FBQ25ELE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxJQUFJLElBQUksa0JBQWtCLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUV6RixNQUFNLE1BQU0sR0FBRyxHQUFHLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDO0FBQ3BDLE1BQU0sZUFBZSxHQUFHLElBQUksR0FBRyxFQUE4QixDQUFDO0FBK0M5RCxNQUFNLGFBQWEsR0FBRyxXQUFXLENBQUM7QUFDbEMsTUFBTSxlQUFlLEdBQTRCLENBQUMsUUFBUSxFQUFFLEtBQUssRUFBRSxRQUFRLEVBQUUsUUFBUSxFQUFFLEtBQUssQ0FBQyxDQUFDO0FBQzlGLE1B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QUVELFNBQVMsV0FBVyxDQUFDLEdBQVc7SUFDOUIsTUFBTSxJQUFJLEdBQUcsY0FBYyxDQUFDLEdBQUcsRUFBRSxjQUFjLENBQUMsQ0FBQztJQUNqRCxJQUFJLENBQUMsSUFBSTtRQUFFLE9BQU8sU0FBUyxDQUFDO0lBQzVCLE1BQU0sSUFBSSxHQUFHLFlBQVksQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxDQUFDLEVBQUUsR0FBRyxFQUFFO1FBQzVELElBQUksQ0FBQztZQUNILE1BQU0sTUFBTSxHQUFHLFNBQVMsQ0FBQyxZQUFZLENBQUMsSUFBSSxFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUM7WUFDckQsT0FBTyxNQUFNLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQztRQUN0RCxDQUFDO1FBQUMsTUFBTSxDQUFDO1lBQ1AsTUFBTSxDQUFDLElBQUksQ0FBQywwQkFBMEIsRUFBRSxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7WUFDbEQsT0FBTyxTQUFTLENBQUM7UUFDbkIsQ0FBQztJQUNILENBQUMsQ0FBQyxDQUFDO0lBQ0gsT0FBTyxJQUFJLEtBQUssU0FBUyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxDQUFDO0FBQ3pELENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIExheWVyZWQgY29uZmlndXJhdGlvbiBsb29rdXA6IGVudmlyb25tZW50LCBgLmVudmAsIGJ1bmRsZSwgYW5kIGBhcHAueWFtbGAuXG4gKlxuICogRXZlcnkgcGFja2FnZSByZXNvbHZlcyBzZXR0aW5ncyB0aGUgc2FtZSB3YXk6IHRha2UgdGhlIGNhbGxlcidzIHZhbHVlLCBlbHNlXG4gKiBhbiBlbnZpcm9ubWVudCB2YXJpYWJsZSwgZWxzZSBhIGRlZmF1bHQuIExvY2FsIGRldmVsb3BtZW50IGFkZHMgdHdvIGZhbGxiYWNrXG4gKiBsb2NhdGlvbnM6IGAuZW52YCBmaWxlcywgb25lIEFwcCdzIGByZXNvdXJjZXMuYXBwcy48YXBwPi5jb25maWcuZW52YCBpblxuICogYGRhdGFicmlja3MueW1sYCwgYW5kIGxpdGVyYWwgZW52IHZhbHVlcyBpbiBgYXBwLnlhbWxgIC8gYGFwcC55bWxgLlxuICpcbiAqIHtAbGluayB2YWx1ZXN9IGlzIExBWlkgKGFuIGBvYmplY3QuU2VxdWVuY2VgKSwgc28gYGRhdGFicmlja3MgYnVuZGxlIHZhbGlkYXRlYFxuICogaXMgb25seSBzcGF3bmVkIHdoZW4gdGhlIGVudmlyb25tZW50IGFuZCBgLmVudmAgYm90aCBtaXNzZWQ7IGFwcCBZQU1MIGlzIG9ubHlcbiAqIHJlYWQgYWZ0ZXIgdGhlIGJ1bmRsZSBzb3VyY2UgYWxzbyBtaXNzZWQuXG4gKlxuICogSW5zaWRlIGEgZGVwbG95ZWQgRGF0YWJyaWNrcyBBcHAgYWxsIHRocmVlIGZpbGUgc291cmNlcyBhcmUgc2tpcHBlZCBieSBkZWZhdWx0XG4gKiAoe0BsaW5rIGVudmlyb25tZW50VXRpbHMuaXNEYXRhYnJpY2tzQXBwRW52fSk6IHRoZSBwbGF0Zm9ybSBoYXMgYWxyZWFkeSB0dXJuZWRcbiAqIHRoZW0gaW50byByZWFsXG4gKiBlbnZpcm9ubWVudCB2YXJpYWJsZXMsIHRoZXJlIGlzIG5vIGJ1bmRsZSB0byB2YWxpZGF0ZSwgYW5kIHRoZSBgZGF0YWJyaWNrc2BcbiAqIENMSSBpcyBub3Qgb24gdGhlIGltYWdlLiBCb29sZWFuIGVudmlyb25tZW50IG92ZXJyaWRlcyBjYW4gZm9yY2UgZWl0aGVyIGZpbGVcbiAqIHNvdXJjZSBvbiBvciBvZmYgd2hlbiBhIHRvb2wgbmVlZHMgZGlmZmVyZW50IGJlaGF2aW9yLlxuICpcbiAqIE9ubHkgdGhlIHNpbmdsZSBidW5kbGUgYXBwJ3MgYGNvbmZpZy5lbnZgIGFuZCBsaXRlcmFsIGFwcCBZQU1MIGBlbnZbXS52YWx1ZWBcbiAqIGVudHJpZXMgYXJlIGNvbnN1bHRlZC4gUm9vdCBidW5kbGUgYHZhcmlhYmxlc2AgYXJlIG5vdDogdGhleSBhcmUgYXV0aG9yaW5nXG4gKiBpbnB1dHMgZm9yIHRoZSBidW5kbGUgaXRzZWxmIChpbnRlcnBvbGF0ZWQgaW50byB0YXJnZXRzLCByZXNvdXJjZXMsIGFuZCBwYXRocyksXG4gKiBzbyB0cmVhdGluZyBvbmUgYXMgYSBwcm9jZXNzIHNldHRpbmcgcmVzb2x2ZXMgbmFtZXMgdGhlIGRlcGxveWVkIGFwcCBuZXZlciBzZWVzLlxuICpcbiAqIFRoaXMgbW9kdWxlIGlzIHRoZSByZXBvc2l0b3J5LXdpZGUgb3duZXIgZm9yIGxheWVyZWQgY29uZmlndXJhdGlvbi4gUmV1c2UgaXRcbiAqIGluc3RlYWQgb2YgYWRkaW5nIGxvY2FsIGVudmlyb25tZW50LW5hbWUgZ2VuZXJhdGlvbiwgYC5lbnZgIHJlYWRlcnMsIGJ1bmRsZVxuICogdmFsaWRhdGlvbiwgQXBwIFlBTUwgcGFyc2luZywgb3Igc2NhbGFyIGNvZXJjaW9uIHBvbGljeS5cbiAqXG4gKiBOb2RlLW9ubHkgKGBjaGlsZF9wcm9jZXNzYCwgYGZzYCwgYHByb2Nlc3NgKS5cbiAqXG4gKiBAbW9kdWxlXG4gKi9cblxuaW1wb3J0IHsgc3Bhd25TeW5jIH0gZnJvbSBcIm5vZGU6Y2hpbGRfcHJvY2Vzc1wiO1xuaW1wb3J0IHsgcmVhZEZpbGVTeW5jIH0gZnJvbSBcIm5vZGU6ZnNcIjtcbmltcG9ydCB7IGRpcm5hbWUsIGlzQWJzb2x1dGUsIHJlbGF0aXZlLCByZXNvbHZlLCBzZXAgfSBmcm9tIFwibm9kZTpwYXRoXCI7XG5pbXBvcnQgeyBwYXJzZUVudiB9IGZyb20gXCJub2RlOnV0aWxcIjtcbmltcG9ydCB7XG4gIGVudmlyb25tZW50VXRpbHMsXG4gIGpzb24sXG4gIGxvZyxcbiAgb2JqZWN0LFxuICBvcHRpb25zIGFzIHNoYXJlZE9wdGlvbnMsXG4gIHN0cmluZ1V0aWxzLFxufSBmcm9tIFwiQGRieC10b29scy9zaGFyZWQtY29yZVwiO1xuaW1wb3J0IHsgcGFyc2UgYXMgcGFyc2VZYW1sIH0gZnJvbSBcInlhbWxcIjtcbmltcG9ydCB7IHogfSBmcm9tIFwiem9kXCI7XG5pbXBvcnQgeyBjYWNoZWRSZWNvcmQsIHN0YXRTeW5jIH0gZnJvbSBcIi4vZmlsZS50c1wiO1xuaW1wb3J0IHsgcmVzb2x2ZVdvcmtpbmdEaXJlY3RvcnksIHJvb3QgYXMgcmVzb2x2ZVByb2plY3RSb290IH0gZnJvbSBcIi4vcHJvamVjdC11dGlscy50c1wiO1xuXG5jb25zdCBsb2dnZXIgPSBsb2cubG9nZ2VyKFwiY29uZmlnXCIpO1xuY29uc3QgY29uZmlnRmlsZUNhY2hlID0gbmV3IE1hcDxzdHJpbmcsIHN0cmluZyB8IHVuZGVmaW5lZD4oKTtcblxudHlwZSBDb25maWdLZXkgPSBzdHJpbmcgfCByZWFkb25seSBzdHJpbmdbXTtcblxuLyoqIFNjYWxhciBvciBsaXN0IHZhbHVlIGFjY2VwdGVkIGJ5IGFuIGluLW1lbW9yeSBjb25maWd1cmF0aW9uIG1hcC4gKi9cbmV4cG9ydCB0eXBlIENvbmZpZ01hcFZhbHVlID0gc3RyaW5nIHwgcmVhZG9ubHkgc3RyaW5nW10gfCBudWxsIHwgdW5kZWZpbmVkO1xuLyoqIEltbXV0YWJsZSBzdHJpbmcta2V5ZWQgY29uZmlndXJhdGlvbiB2YWx1ZXMgdXNlZCBieSB0aGUgYGNvbmZpZ2Agc291cmNlLiAqL1xuZXhwb3J0IHR5cGUgQ29uZmlnRGF0YSA9IFJlYWRvbmx5PFJlY29yZDxzdHJpbmcsIENvbmZpZ01hcFZhbHVlPj47XG5cbi8qKiBXaGVyZSBhIHZhbHVlIG1heSBjb21lIGZyb20sIGNvbnN1bHRlZCBpbiB0aGUgb3JkZXIgZ2l2ZW4uICovXG5leHBvcnQgdHlwZSBDb25maWdTb3VyY2UgPSBcImNvbmZpZ1wiIHwgXCJlbnZcIiB8IFwiZG90ZW52XCIgfCBcImJ1bmRsZVwiIHwgXCJhcHBcIjtcblxuLyoqIFNvdXJjZSBvcmRlciwgbmFtZXNwYWNlcywgcGFyc2VkIGZpbGVzLCBhbmQgd29ya2luZyBkaXJlY3RvcnkgZm9yIHZhbHVlIHJlc29sdXRpb24uICovXG5leHBvcnQgaW50ZXJmYWNlIENvbmZpZ09wdGlvbnMge1xuICAvKipcbiAgICogT3V0ZXJtb3N0IG5hbWVzcGFjZXMgdHJpZWQgYmVmb3JlIGVhY2gga2V5LiBEZWZhdWx0cyB0byBgREJYX1RPT0xTYC5cbiAgICovXG4gIHNjb3BlPzogc3RyaW5nIHwgcmVhZG9ubHkgc3RyaW5nW107XG4gIC8qKiBDYXBhYmlsaXR5IG5hbWVzcGFjZXMgaW5zZXJ0ZWQgYWZ0ZXIgdGhlIHNjb3BlIGFuZCBiZWZvcmUgZWFjaCBrZXkuICovXG4gIHByZWZpeD86IHN0cmluZyB8IHJlYWRvbmx5IHN0cmluZ1tdO1xuICAvKiogQ29uc3RhbnQgY29uZmlnIG1hcHMgcmVhZCBieSB0aGUgYGNvbmZpZ2Agc291cmNlLiAqL1xuICBkYXRhPzogQ29uZmlnRGF0YSB8IHJlYWRvbmx5IENvbmZpZ0RhdGFbXTtcbiAgLyoqIFBhcnNlZCBidW5kbGUgZGF0YSB1c2VkIGluc3RlYWQgb2YgbG9hZGluZyBgZGF0YWJyaWNrcy55bWxgLiAqL1xuICBidW5kbGVEYXRhPzogQ29uZmlnRmlsZSB8IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICAvKiogQXV0aC1yZXNvbHZlZCBEYXRhYnJpY2tzIHByb2ZpbGUgcGFzc2VkIGV4cGxpY2l0bHkgdG8gYnVuZGxlIHZhbGlkYXRpb24uICovXG4gIGJ1bmRsZVByb2ZpbGU/OiBzdHJpbmc7XG4gIC8qKiBQYXJzZWQgYXBwIFlBTUwgZGF0YSB1c2VkIGluc3RlYWQgb2YgbG9hZGluZyBgYXBwLnlhbWxgLiAqL1xuICBhcHBEYXRhPzogQ29uZmlnRmlsZSB8IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICAvKiogU291cmNlcyBpbiBwcmVjZWRlbmNlIG9yZGVyLiBEZWZhdWx0OiBgY29uZmlnYCwgYGVudmAsIGBkb3RlbnZgLCBgYnVuZGxlYCwgYGFwcGAuICovXG4gIHNvdXJjZXM/OiBDb25maWdTb3VyY2UgfCByZWFkb25seSBDb25maWdTb3VyY2VbXTtcbiAgLyoqIERpcmVjdG9yeSB0byByZXNvbHZlIGAuZW52YCBhbmQgdGhlIGJ1bmRsZSBmcm9tLiBEZWZhdWx0OiBgcHJvY2Vzcy5jd2QoKWAuICovXG4gIGN3ZD86IHN0cmluZztcbn1cblxuLyoqIE9uZSByZXNvbHZlZCB2YWx1ZSwgdGFnZ2VkIHdpdGggdGhlIGtleSBhbmQgc291cmNlIGl0IGNhbWUgZnJvbS4gKi9cbmludGVyZmFjZSBDb25maWdWYWx1ZSB7XG4gIGtleTogc3RyaW5nO1xuICBzb3VyY2U6IENvbmZpZ1NvdXJjZTtcbiAgdmFsdWU6IHN0cmluZztcbn1cblxuLyoqIEEgY29uZmlnIGZpbGUgZm91bmQgb24gZGlzaywgd2l0aCBpdHMgcGFyc2VkIGNvbnRlbnRzLiAqL1xuZXhwb3J0IGludGVyZmFjZSBDb25maWdGaWxlIHtcbiAgcGF0aDogc3RyaW5nO1xuICBkYXRhOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbn1cblxuY29uc3QgREVGQVVMVF9TQ09QRSA9IFwiREJYX1RPT0xTXCI7XG5jb25zdCBERUZBVUxUX1NPVVJDRVM6IHJlYWRvbmx5IENvbmZpZ1NvdXJjZVtdID0gW1wiY29uZmlnXCIsIFwiZW52XCIsIFwiZG90ZW52XCIsIFwiYnVuZGxlXCIsIFwiYXBwXCJdO1xuY29uc3QgQlVORExFX0ZJTEVfTkFNRVMgPSBbXCJkYXRhYnJpY2tzLnltbFwiLCBcImRhdGFicmlja3MueWFtbFwiXSBhcyBjb25zdDtcbmNvbnN0IEFQUF9GSUxFX05BTUVTID0gW1wiYXBwLnlhbWxcIiwgXCJhcHAueW1sXCJdIGFzIGNvbnN0O1xuY29uc3QgRE9URU5WX0ZJTEVfTkFNRSA9IFwiLmVudlwiO1xuY29uc3QgTk9ERV9FTlZfQUxURVJOQVRJVkVTID0ge1xuICBwcm9kdWN0aW9uOiBbXCJwcm9kXCJdLFxuICBkZXZlbG9wbWVudDogW1wiZGV2XCJdLFxufSBhcyBjb25zdCBzYXRpc2ZpZXMgUmVjb3JkPHN0cmluZywgcmVhZG9ubHkgc3RyaW5nW10+O1xuXG4vKiogSGlnaGVzdCB2YWxpZCBUQ1AgcG9ydCBudW1iZXIuICovXG5leHBvcnQgY29uc3QgTUFYX1RDUF9QT1JUID0gc2hhcmVkT3B0aW9ucy5NQVhfVENQX1BPUlQ7XG5cbi8qKiBCb29sZWFuIGVudmlyb25tZW50IG92ZXJyaWRlIGZvciBwcm9qZWN0IGAuZW52YCByZWFkcy4gKi9cbmNvbnN0IENPTkZJR19ET1RFTlZfS0VZID0gXCJEQlhfVE9PTFNfQ09ORklHX0RPVEVOVlwiO1xuXG4vKiogQm9vbGVhbiBlbnZpcm9ubWVudCBvdmVycmlkZSBmb3IgRGF0YWJyaWNrcyBidW5kbGUgcmVhZHMuICovXG5jb25zdCBDT05GSUdfQlVORExFX0tFWSA9IFwiREJYX1RPT0xTX0NPTkZJR19CVU5ETEVcIjtcblxuLyoqIEJvb2xlYW4gZW52aXJvbm1lbnQgb3ZlcnJpZGUgZm9yIERhdGFicmlja3MgQXBwIFlBTUwgcmVhZHMuICovXG5jb25zdCBDT05GSUdfQVBQX0tFWSA9IFwiREJYX1RPT0xTX0NPTkZJR19BUFBcIjtcblxuLyoqIEV4YWN0IHByb2Nlc3MtZW52aXJvbm1lbnQgbG9va3VwIGZvciBjYWxsZXJzIHRoYXQgZG8gbm90IHJlYWQgbG9jYWwgY29uZmlnIGZpbGVzLiAqL1xuZXhwb3J0IGNvbnN0IEVOVl9PTkxZID0geyBzY29wZTogW10gYXMgY29uc3QsIHNvdXJjZXM6IFwiZW52XCIgYXMgY29uc3QgfTtcblxuLyoqIE5vbi1lbXB0eSBsaXRlcmFsIGNvbmZpZ3VyYXRpb24gdmFsdWUgd2l0aCB1bnJlc29sdmVkIGludGVycG9sYXRpb24gcmVqZWN0ZWQuICovXG5leHBvcnQgY29uc3QgdmFsdWVTY2hlbWEgPSB6XG4gIC5zdHJpbmcoKVxuICAudHJpbSgpXG4gIC5taW4oMSlcbiAgLnJlZmluZSgodmFsdWU6IHN0cmluZykgPT4gIS9cXCRcXHtbXn1dK1xcfS8udGVzdCh2YWx1ZSksIHtcbiAgICBtZXNzYWdlOiBcIkludGVycG9sYXRlZCB2YWx1ZXMgYXJlIG5vdCBhbGxvd2VkXCIsXG4gIH0pO1xuXG5jb25zdCBwb3J0VmFsdWVTY2hlbWEgPSBzaGFyZWRPcHRpb25zLnRjcFBvcnRTY2hlbWE7XG5cbmNvbnN0IHBvc2l0aXZlTnVtYmVyVmFsdWUgPSB6LnByZXByb2Nlc3MoKGlucHV0KSA9PiBvYmplY3QudG9OdW1iZXIoaW5wdXQpLCB6Lm51bWJlcigpLnBvc2l0aXZlKCkpO1xuY29uc3QgcG9zaXRpdmVJbnRWYWx1ZSA9IHBvc2l0aXZlTnVtYmVyVmFsdWUudHJhbnNmb3JtKE1hdGguZmxvb3IpO1xuXG4vKiogQSBuYW1lZCBidW5kbGUgb3IgQXBwIHJlc291cmNlOyBjb25jcmV0ZSByZXNvdXJjZSBmaWVsZHMgcGFzcyB0aHJvdWdoLiAqL1xuZXhwb3J0IGNvbnN0IGJ1bmRsZVJlc291cmNlU2NoZW1hID0gei5vYmplY3QoeyBuYW1lOiB2YWx1ZVNjaGVtYS5vcHRpb25hbCgpIH0pLnBhc3N0aHJvdWdoKCk7XG5cbi8qKiBEYXRhYnJpY2tzIGJ1bmRsZSBhcHBsaWNhdGlvbiBlbnZpcm9ubWVudCBlbnRyeS4gKi9cbmV4cG9ydCBjb25zdCBidW5kbGVFbnZFbnRyeVNjaGVtYSA9IHoub2JqZWN0KHtcbiAgbmFtZTogdmFsdWVTY2hlbWEub3B0aW9uYWwoKSxcbiAgdmFsdWU6IHouc3RyaW5nKCkub3B0aW9uYWwoKSxcbiAgdmFsdWVfZnJvbTogdmFsdWVTY2hlbWEub3B0aW9uYWwoKSxcbn0pO1xuXG4vKiogRGF0YWJyaWNrcyBidW5kbGUgYXBwbGljYXRpb24gZmllbGRzIHVzZWQgYnkgbG9jYWwgY29uZmlndXJhdGlvbiByZXNvbHV0aW9uLiAqL1xuZXhwb3J0IGNvbnN0IGJ1bmRsZUFwcFNjaGVtYSA9IHoub2JqZWN0KHtcbiAgbmFtZTogdmFsdWVTY2hlbWEub3B0aW9uYWwoKSxcbiAgY29uZmlnOiB6Lm9iamVjdCh7IGVudjogei5hcnJheShidW5kbGVFbnZFbnRyeVNjaGVtYSkub3B0aW9uYWwoKSB9KS5vcHRpb25hbCgpLFxuICByZXNvdXJjZXM6IHouYXJyYXkoYnVuZGxlUmVzb3VyY2VTY2hlbWEpLm9wdGlvbmFsKCksXG59KTtcblxuLyoqIERhdGFicmlja3MgQXBwIFlBTUwgZW52aXJvbm1lbnQgZW50cnkuICovXG5leHBvcnQgY29uc3QgYXBwRW52RW50cnlTY2hlbWEgPSB6Lm9iamVjdCh7XG4gIG5hbWU6IHZhbHVlU2NoZW1hLFxuICB2YWx1ZTogei5zdHJpbmcoKS5vcHRpb25hbCgpLFxuICB2YWx1ZUZyb206IHZhbHVlU2NoZW1hLm9wdGlvbmFsKCksXG59KTtcblxuLyoqIERhdGFicmlja3MgQXBwIFlBTUwgZmllbGRzIHVzZWQgYnkgbG9jYWwgY29uZmlndXJhdGlvbiByZXNvbHV0aW9uLiAqL1xuZXhwb3J0IGNvbnN0IGFwcFNjaGVtYSA9IHoub2JqZWN0KHtcbiAgZW52OiB6LmFycmF5KGFwcEVudkVudHJ5U2NoZW1hKS5vcHRpb25hbCgpLFxuICByZXNvdXJjZXM6IHouYXJyYXkoYnVuZGxlUmVzb3VyY2VTY2hlbWEpLm9wdGlvbmFsKCksXG59KTtcblxuY29uc3QgYnVuZGxlQ29uZmlnU2NoZW1hID0gei5vYmplY3Qoe1xuICByZXNvdXJjZXM6IHoub2JqZWN0KHsgYXBwczogei5yZWNvcmQoei5zdHJpbmcoKSwgYnVuZGxlQXBwU2NoZW1hKS5vcHRpb25hbCgpIH0pLm9wdGlvbmFsKCksXG59KTtcblxuLyoqIEZsYXR0ZW4gdGhlIHNpbmdsZSBidW5kbGUgQXBwJ3MgYGNvbmZpZy5lbnZgLCByZXNvbHZpbmcgcmVzb3VyY2UgcmVmZXJlbmNlcy4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmbGF0dGVuQnVuZGxlRW52KGRhdGE6IHVua25vd24pOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+IHtcbiAgY29uc3QgcGFyc2VkID0gYnVuZGxlQ29uZmlnU2NoZW1hLnNhZmVQYXJzZShkYXRhKTtcbiAgaWYgKCFwYXJzZWQuc3VjY2VzcykgcmV0dXJuIHt9O1xuICBjb25zdCBhcHBzID0gT2JqZWN0LnZhbHVlcyhwYXJzZWQuZGF0YS5yZXNvdXJjZXM/LmFwcHMgPz8ge30pO1xuICBpZiAoYXBwcy5sZW5ndGggIT09IDEpIHJldHVybiB7fTtcbiAgY29uc3QgYXBwID0gYXBwc1swXTtcbiAgY29uc3QgcmVzb3VyY2VzID0gbmV3IE1hcChcbiAgICAoYXBwPy5yZXNvdXJjZXMgPz8gW10pXG4gICAgICAuZmlsdGVyKChyZXNvdXJjZSkgPT4gcmVzb3VyY2UubmFtZSlcbiAgICAgIC5tYXAoKHJlc291cmNlKSA9PiBbcmVzb3VyY2UubmFtZSEsIHJlc291cmNlXSBhcyBjb25zdCksXG4gICk7XG4gIGNvbnN0IHJlc3VsdDogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHt9O1xuICBmb3IgKGNvbnN0IGVudHJ5IG9mIGFwcD8uY29uZmlnPy5lbnYgPz8gW10pIHtcbiAgICBpZiAoIWVudHJ5Lm5hbWUpIGNvbnRpbnVlO1xuICAgIGNvbnN0IGxpdGVyYWwgPSB2YWx1ZVNjaGVtYS5zYWZlUGFyc2UoZW50cnkudmFsdWUpO1xuICAgIGlmIChsaXRlcmFsLnN1Y2Nlc3MpIHtcbiAgICAgIHJlc3VsdFtlbnRyeS5uYW1lXSA9IGxpdGVyYWwuZGF0YTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBjb25zdCByZWZlcmVuY2VkID0gZW50cnkudmFsdWVfZnJvbVxuICAgICAgPyByZXNvdXJjZVZhbHVlKHJlc291cmNlcy5nZXQoZW50cnkudmFsdWVfZnJvbSkpXG4gICAgICA6IHVuZGVmaW5lZDtcbiAgICBpZiAocmVmZXJlbmNlZCkgcmVzdWx0W2VudHJ5Lm5hbWVdID0gcmVmZXJlbmNlZDtcbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufVxuXG4vKiogRmxhdHRlbiBgYXBwLnlhbWxgIGVudiBlbnRyaWVzLCByZXNvbHZpbmcgYHZhbHVlRnJvbWAgcmVzb3VyY2UgcmVmZXJlbmNlcy4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmbGF0dGVuQXBwRW52KGRhdGE6IHVua25vd24pOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+IHtcbiAgY29uc3QgcGFyc2VkID0gYXBwU2NoZW1hLnNhZmVQYXJzZShkYXRhKTtcbiAgaWYgKCFwYXJzZWQuc3VjY2VzcykgcmV0dXJuIHt9O1xuICBjb25zdCByZXNvdXJjZXMgPSBuZXcgTWFwKFxuICAgIChwYXJzZWQuZGF0YS5yZXNvdXJjZXMgPz8gW10pXG4gICAgICAuZmlsdGVyKChyZXNvdXJjZSkgPT4gcmVzb3VyY2UubmFtZSlcbiAgICAgIC5tYXAoKHJlc291cmNlKSA9PiBbcmVzb3VyY2UubmFtZSEsIHJlc291cmNlXSBhcyBjb25zdCksXG4gICk7XG4gIGNvbnN0IHJlc3VsdDogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHt9O1xuICBmb3IgKGNvbnN0IGVudHJ5IG9mIHBhcnNlZC5kYXRhLmVudiA/PyBbXSkge1xuICAgIGNvbnN0IGxpdGVyYWwgPSB2YWx1ZVNjaGVtYS5zYWZlUGFyc2UoZW50cnkudmFsdWUpO1xuICAgIGlmIChsaXRlcmFsLnN1Y2Nlc3MpIHtcbiAgICAgIHJlc3VsdFtlbnRyeS5uYW1lXSA9IGxpdGVyYWwuZGF0YTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBjb25zdCByZWZlcmVuY2VkID0gZW50cnkudmFsdWVGcm9tID8gcmVzb3VyY2VWYWx1ZShyZXNvdXJjZXMuZ2V0KGVudHJ5LnZhbHVlRnJvbSkpIDogdW5kZWZpbmVkO1xuICAgIGlmIChyZWZlcmVuY2VkKSByZXN1bHRbZW50cnkubmFtZV0gPSByZWZlcmVuY2VkO1xuICB9XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbmZ1bmN0aW9uIHJlc291cmNlVmFsdWUocmVzb3VyY2U6IHVua25vd24pOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBmb3IgKGNvbnN0IHBhdGggb2YgW1xuICAgIFtcInNxbF93YXJlaG91c2VcIiwgXCJpZFwiXSxcbiAgICBbXCJnZW5pZV9zcGFjZVwiLCBcInNwYWNlX2lkXCJdLFxuICAgIFtcInBvc3RncmVzXCIsIFwiZW5kcG9pbnRcIl0sXG4gICAgW1wicG9zdGdyZXNcIiwgXCJkYXRhYmFzZVwiXSxcbiAgICBbXCJwb3N0Z3Jlc1wiLCBcImJyYW5jaFwiXSxcbiAgXSBhcyBjb25zdCkge1xuICAgIGxldCB2YWx1ZSA9IHJlc291cmNlO1xuICAgIGZvciAoY29uc3QgcGFydCBvZiBwYXRoKSB2YWx1ZSA9IG9iamVjdC5pc1JlY29yZCh2YWx1ZSkgPyB2YWx1ZVtwYXJ0XSA6IHVuZGVmaW5lZDtcbiAgICBjb25zdCBwYXJzZWQgPSB2YWx1ZVNjaGVtYS5zYWZlUGFyc2UodmFsdWUpO1xuICAgIGlmIChwYXJzZWQuc3VjY2VzcykgcmV0dXJuIHBhcnNlZC5kYXRhO1xuICB9XG4gIHJldHVybiB1bmRlZmluZWQ7XG59XG5cbi8qKiBXYWxrIGEgZG90LXNlcGFyYXRlZCBwYXRoIHRocm91Z2ggcGFyc2VkIGJ1bmRsZSBkYXRhLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldEJ1bmRsZVBhdGgoZGF0YTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4sIHBhdGg6IHN0cmluZyk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IHBhcnRzID0gcGF0aC5zcGxpdChcIi5cIikuZmlsdGVyKEJvb2xlYW4pO1xuICBpZiAocGFydHMubGVuZ3RoID09PSAwKSByZXR1cm4gdW5kZWZpbmVkO1xuICBsZXQgY3VycmVudDogdW5rbm93biA9IGRhdGE7XG4gIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCBwYXJ0cy5sZW5ndGg7IGluZGV4KyspIHtcbiAgICBpZiAoIW9iamVjdC5pc1JlY29yZChjdXJyZW50KSkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICBjb25zdCBuZXh0ID0gY3VycmVudFtwYXJ0c1tpbmRleF0hXTtcbiAgICBpZiAoaW5kZXggPT09IHBhcnRzLmxlbmd0aCAtIDEpIHtcbiAgICAgIGNvbnN0IGRpcmVjdCA9IHZhbHVlU2NoZW1hLnNhZmVQYXJzZShuZXh0KTtcbiAgICAgIGlmIChkaXJlY3Quc3VjY2VzcykgcmV0dXJuIGRpcmVjdC5kYXRhO1xuICAgICAgaWYgKG9iamVjdC5pc1JlY29yZChuZXh0KSkge1xuICAgICAgICBjb25zdCBuZXN0ZWQgPSB2YWx1ZVNjaGVtYS5zYWZlUGFyc2UobmV4dC52YWx1ZSk7XG4gICAgICAgIHJldHVybiBuZXN0ZWQuc3VjY2VzcyA/IG5lc3RlZC5kYXRhIDogdW5kZWZpbmVkO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG4gICAgY3VycmVudCA9IG5leHQ7XG4gIH1cbiAgcmV0dXJuIHVuZGVmaW5lZDtcbn1cblxuLyoqIEV4YWN0LCB1cHBlcmNhc2UsIGFuZCB0b2tlbml6ZWQtdXBwZXJjYXNlIG5hbWVzIGZvciBhIGh1bWFuLWZyaWVuZGx5IGtleS4gKi9cbmV4cG9ydCBmdW5jdGlvbiBlbnZpcm9ubWVudEtleXMobmFtZTogc3RyaW5nKTogcmVhZG9ubHkgc3RyaW5nW10ge1xuICBjb25zdCB0cmltbWVkID0gbmFtZS50cmltKCk7XG4gIGlmICghdHJpbW1lZCkgcmV0dXJuIFtdO1xuICByZXR1cm4gb2JqZWN0XG4gICAgLnNlcXVlbmNlKFxuICAgICAgdHJpbW1lZCxcbiAgICAgIHRyaW1tZWQudG9VcHBlckNhc2UoKSxcbiAgICAgIEFycmF5LmZyb20oc3RyaW5nVXRpbHMudG9rZW5pemUodHJpbW1lZCkpLmpvaW4oXCJfXCIpLnRvVXBwZXJDYXNlKCksXG4gICAgKVxuICAgIC5maWx0ZXIoQm9vbGVhbilcbiAgICAuZGlzdGluY3QoKVxuICAgIC50b0FycmF5KCk7XG59XG5cbi8qKiBDYW5kaWRhdGUgbmFtZXMgaW4gc2NvcGUsIHByZWZpeCwgYW5kIGlucHV0IHByZWNlZGVuY2Ugb3JkZXIuICovXG5mdW5jdGlvbiBrZXlzKFxuICBpbnB1dDogQ29uZmlnS2V5LFxuICBvcHRpb25zOiBQaWNrPENvbmZpZ09wdGlvbnMsIFwic2NvcGVcIiB8IFwicHJlZml4XCI+ID0ge30sXG4pOiByZWFkb25seSBzdHJpbmdbXSB7XG4gIGNvbnN0IHNjb3BlcyA9IG9iamVjdFxuICAgIC5zZXF1ZW5jZShvcHRpb25zLnNjb3BlID8/IERFRkFVTFRfU0NPUEUpXG4gICAgLm1hcChzdHJpbmdVdGlscy50cmltVG9FbXB0eSlcbiAgICAuZmlsdGVyKEJvb2xlYW4pXG4gICAgLmRpc3RpbmN0KClcbiAgICAudG9BcnJheSgpO1xuICBjb25zdCBwcmVmaXhlcyA9XG4gICAgb3B0aW9ucy5wcmVmaXggPT09IHVuZGVmaW5lZFxuICAgICAgPyBbXVxuICAgICAgOiBvYmplY3RcbiAgICAgICAgICAuc2VxdWVuY2Uob3B0aW9ucy5wcmVmaXgpXG4gICAgICAgICAgLm1hcChzdHJpbmdVdGlscy50cmltVG9FbXB0eSlcbiAgICAgICAgICAuZmlsdGVyKEJvb2xlYW4pXG4gICAgICAgICAgLmRpc3RpbmN0KClcbiAgICAgICAgICAudG9BcnJheSgpO1xuICByZXR1cm4gb2JqZWN0XG4gICAgLnNlcXVlbmNlKGlucHV0KVxuICAgIC5tYXAoc3RyaW5nVXRpbHMudHJpbVRvRW1wdHkpXG4gICAgLmZpbHRlcihCb29sZWFuKVxuICAgIC5kaXN0aW5jdCgpXG4gICAgLmZsYXRNYXAoKGtleSkgPT4ge1xuICAgICAgY29uc3QgcHJlZml4ZWQgPSBwcmVmaXhlcy5sZW5ndGggPiAwID8gcHJlZml4ZXMubWFwKChwcmVmaXgpID0+IGAke3ByZWZpeH1fJHtrZXl9YCkgOiBba2V5XTtcbiAgICAgIHJldHVybiBbXG4gICAgICAgIC4uLnNjb3Blcy5mbGF0TWFwKChzY29wZSkgPT4gcHJlZml4ZWQubWFwKChuYW1lKSA9PiBgJHtzY29wZX1fJHtuYW1lfWApKSxcbiAgICAgICAgLi4ucHJlZml4ZWQsXG4gICAgICAgIGtleSxcbiAgICAgIF07XG4gICAgfSlcbiAgICAuZGlzdGluY3QoKVxuICAgIC50b0FycmF5KCk7XG59XG5cbi8qKlxuICogRXZlcnkgdmFsdWUgdGhhdCByZXNvbHZlcyBmb3IgYGlucHV0YCwgaW4gc291cmNlLXRoZW4ta2V5IHByZWNlZGVuY2Ugb3JkZXIsXG4gKiBhcyBhIExBWlkgc2VxdWVuY2U6IG5vdGhpbmcgcGFzdCB0aGUgZmlyc3QgY29uc3VtZWQgZWxlbWVudCBpcyByZWFkLCBzb1xuICogYHZhbHVlcyhrZXkpLmF0KDApYCBuZXZlciBzcGF3bnMgdGhlIERhdGFicmlja3MgQ0xJIHdoZW4gdGhlIGVudmlyb25tZW50XG4gKiBhbHJlYWR5IGFuc3dlcmVkLlxuICpcbiAqL1xuZnVuY3Rpb24gdmFsdWVzKGlucHV0OiBDb25maWdLZXksIG9wdGlvbnM6IENvbmZpZ09wdGlvbnMgPSB7fSk6IG9iamVjdC5TZXF1ZW5jZTxDb25maWdWYWx1ZT4ge1xuICBjb25zdCBjYW5kaWRhdGVzID0ga2V5cyhpbnB1dCwgb3B0aW9ucyk7XG4gIGNvbnN0IHNvdXJjZXMgPSBjb25maWdTb3VyY2VzKG9wdGlvbnMpO1xuICByZXR1cm4gb2JqZWN0LnNlcXVlbmNlKHtcbiAgICAqW1N5bWJvbC5pdGVyYXRvcl0oKTogR2VuZXJhdG9yPENvbmZpZ1ZhbHVlPiB7XG4gICAgICBmb3IgKGNvbnN0IHNvdXJjZSBvZiBzb3VyY2VzKSB7XG4gICAgICAgIGZvciAoY29uc3QgbWFwIG9mIHJlYWQoc291cmNlLCBvcHRpb25zKSkge1xuICAgICAgICAgIGZvciAoY29uc3Qga2V5IG9mIGNhbmRpZGF0ZXMpIHtcbiAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gY29uZmlnTWFwVmFsdWUobWFwW2tleV0pO1xuICAgICAgICAgICAgaWYgKHZhbHVlICE9PSBudWxsKSB5aWVsZCB7IGtleSwgc291cmNlLCB2YWx1ZSB9O1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0sXG4gIH0pO1xufVxuXG5mdW5jdGlvbiBjb25maWdTb3VyY2VzKG9wdGlvbnM6IENvbmZpZ09wdGlvbnMpOiByZWFkb25seSBDb25maWdTb3VyY2VbXSB7XG4gIGNvbnN0IHNvdXJjZXM6IENvbmZpZ1NvdXJjZVtdID0gW1xuICAgIC4uLm9iamVjdC5zZXF1ZW5jZTxDb25maWdTb3VyY2U+KG9wdGlvbnMuc291cmNlcyA/PyBERUZBVUxUX1NPVVJDRVMpLmRpc3RpbmN0KCksXG4gIF07XG4gIGlmIChvcHRpb25zLmRhdGEgIT09IHVuZGVmaW5lZCAmJiBvcHRpb25zLnNvdXJjZXMgIT09IHVuZGVmaW5lZCAmJiAhc291cmNlcy5pbmNsdWRlcyhcImNvbmZpZ1wiKSkge1xuICAgIHNvdXJjZXMucHVzaChcImNvbmZpZ1wiKTtcbiAgfVxuICByZXR1cm4gc291cmNlcztcbn1cblxuZnVuY3Rpb24gY29uZmlnTWFwVmFsdWUodmFsdWU6IENvbmZpZ01hcFZhbHVlIHwgdW5rbm93bik6IHN0cmluZyB8IG51bGwge1xuICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICBmb3IgKGNvbnN0IGVudHJ5IG9mIHZhbHVlKSB7XG4gICAgICBjb25zdCByZXNvbHZlZCA9IHN0cmluZ1V0aWxzLnRyaW1Ub051bGwoZW50cnkpO1xuICAgICAgaWYgKHJlc29sdmVkICE9PSBudWxsKSByZXR1cm4gcmVzb2x2ZWQ7XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xuICB9XG4gIHJldHVybiBzdHJpbmdVdGlscy50cmltVG9OdWxsKHZhbHVlKTtcbn1cblxuLyoqXG4gKiBUaGUgZmlyc3QgdmFsdWUgdGhhdCByZXNvbHZlcyBmb3IgYGlucHV0YCwgb3IgYHVuZGVmaW5lZGAuXG4gKlxuICogQGV4YW1wbGVcbiAqIGNvbnN0IGRvbWFpbiA9IGNvbmZpZy50ZXh0KFtcIlRVTk5FTF9QVUJMSUNfRE9NQUlOXCIsIFwiUFVCTElDX0RPTUFJTlwiXSk7XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0ZXh0KGlucHV0OiBDb25maWdLZXksIG9wdGlvbnM6IENvbmZpZ09wdGlvbnMgPSB7fSk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIHJldHVybiB2YWx1ZXMoaW5wdXQsIG9wdGlvbnMpLmF0KDApPy52YWx1ZTtcbn1cblxuLyoqIFJlc29sdmUgYSBodW1hbi1mcmllbmRseSBuYW1lIHRocm91Z2gge0BsaW5rIGVudmlyb25tZW50S2V5c30gYW5kIHtAbGluayB0ZXh0fS4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZXNvbHZlVmFsdWUobmFtZTogc3RyaW5nLCBvcHRpb25zOiBDb25maWdPcHRpb25zID0ge30pOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICByZXR1cm4gdGV4dChlbnZpcm9ubWVudEtleXMobmFtZSksIG9wdGlvbnMpO1xufVxuXG4vKipcbiAqIFRoZSBQUklNQVJZIChmdWxseS1zY29wZWQpIG5hbWUgZm9yIGBpbnB1dGAgLSB3aGF0IHRvIHByaW50IGluIGEgbG9nIGxpbmUgb3IgYW5cbiAqIGVycm9yLCBzbyB0aGUgbWVzc2FnZSBuYW1lcyB0aGUgdmFyaWFibGUgYSByZWFkZXIgc2hvdWxkIHNldC4gRG8gbm90IGluZGV4XG4gKiBga2V5cyguLi4pWzBdYCBmb3IgdGhpcyBpZiBgaW5wdXRgIG1heSBiZSBhIGJhcmUgc3RyaW5nLlxuICpcbiAqIEBleGFtcGxlXG4gKiBsb2dnZXIud2FybihgJHtjb25maWcubmFtZShKV1RfU0VDUkVUX0VOVil9IGlzIG5vdCBzZXRgKTtcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG5hbWUoXG4gIGlucHV0OiBDb25maWdLZXksXG4gIG9wdGlvbnM6IFBpY2s8Q29uZmlnT3B0aW9ucywgXCJzY29wZVwiIHwgXCJwcmVmaXhcIj4gPSB7fSxcbik6IHN0cmluZyB7XG4gIHJldHVybiBrZXlzKGlucHV0LCBvcHRpb25zKVswXSA/PyBcIlwiO1xufVxuXG4vKipcbiAqIFNhZmUgYC5lbnYuPG5hbWU+YCBzdWZmaXhlcyBmb3IgYSBOb2RlIGVudmlyb25tZW50LCBleGFjdCBzcGVsbGluZyBmaXJzdC5cbiAqIEtub3duIGxvbmcgYW5kIHNob3J0IG5hbWVzIGFyZSBpbnRlcmNoYW5nZWFibGU7IHVua25vd24gbmFtZXMgcGFzcyB0aHJvdWdoLlxuICovXG5mdW5jdGlvbiBub2RlRW52TmFtZXMobm9kZUVudjogdW5rbm93bik6IHN0cmluZ1tdIHtcbiAgY29uc3QgbmFtZSA9IHN0cmluZ1V0aWxzLnRyaW1Ub051bGwobm9kZUVudik/LnRvTG93ZXJDYXNlKCk7XG4gIGlmICghbmFtZSB8fCAhL15bYS16MC05Xy1dKyQvLnRlc3QobmFtZSkpIHJldHVybiBbXTtcbiAgZm9yIChjb25zdCBbY2Fub25pY2FsLCBhbHRlcm5hdGl2ZXNdIG9mIE9iamVjdC5lbnRyaWVzKE5PREVfRU5WX0FMVEVSTkFUSVZFUykpIHtcbiAgICBjb25zdCBuYW1lczogcmVhZG9ubHkgc3RyaW5nW10gPSBhbHRlcm5hdGl2ZXM7XG4gICAgaWYgKG5hbWUgPT09IGNhbm9uaWNhbCB8fCBuYW1lcy5pbmNsdWRlcyhuYW1lKSkge1xuICAgICAgcmV0dXJuIFsuLi5vYmplY3Quc2VxdWVuY2UobmFtZSwgY2Fub25pY2FsLCBhbHRlcm5hdGl2ZXMpLmRpc3RpbmN0KCldO1xuICAgIH1cbiAgfVxuICByZXR1cm4gW25hbWVdO1xufVxuXG4vKipcbiAqIFJlc29sdmUgYSBzdHJpbmc6IGBjb25maWd1cmVkYCB3aGVuIG5vbi1lbXB0eSwgZWxzZSB7QGxpbmsgdGV4dH0sIGVsc2UgYHVuZGVmaW5lZGAuXG4gKlxuICogVGhlIGNvZXJjaW9uIHJ1bGVzIGFyZSBkZWxpYmVyYXRlbHkgbG9vc2UgKGBvbmAgLyBgeWVzYCAvIGAxYCBhcmUgYWxsXG4gKiBgdHJ1ZWApIGJlY2F1c2UgdmFsdWVzIG1heSBjb21lIGZyb20gYSBmaWxlIGEgaHVtYW4gdHlwZWQuXG4gKlxuICogQGV4YW1wbGVcbiAqIGNvbmZpZy5zdHJpbmcob3B0aW9ucy5ob3N0LCBcIlNNVFBfSE9TVFwiKTtcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHN0cmluZyhcbiAgY29uZmlndXJlZDogdW5rbm93bixcbiAgaW5wdXQ6IENvbmZpZ0tleSxcbiAgb3B0aW9ucz86IENvbmZpZ09wdGlvbnMsXG4pOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICByZXR1cm4gc3RyaW5nVXRpbHMudHJpbVRvTnVsbChjb25maWd1cmVkKSA/PyB0ZXh0KGlucHV0LCBvcHRpb25zKTtcbn1cblxuLyoqXG4gKiBSZXNvbHZlIGEgYm9vbGVhbiB0aHJvdWdoIGBvYmplY3QudG9Cb29sZWFuYC4gYHVuZGVmaW5lZGAgd2hlbiBuZWl0aGVyIHNvdXJjZVxuICogaXMgaW50ZXJwcmV0YWJsZSwgc28gdGhlIGNhbGxlciBwaWNrcyBhIGRlZmF1bHQgd2l0aCBgPz9gLlxuICovXG5leHBvcnQgZnVuY3Rpb24gYm9vbGVhbihcbiAgY29uZmlndXJlZDogdW5rbm93bixcbiAgaW5wdXQ6IENvbmZpZ0tleSxcbiAgb3B0aW9ucz86IENvbmZpZ09wdGlvbnMsXG4pOiBib29sZWFuIHwgdW5kZWZpbmVkIHtcbiAgcmV0dXJuIG9iamVjdC50b0Jvb2xlYW4oY29uZmlndXJlZCkgPz8gb2JqZWN0LnRvQm9vbGVhbih0ZXh0KGlucHV0LCBvcHRpb25zKSk7XG59XG5cbi8qKiBQYXJzZSBhIGZpbml0ZSBudW1iZXIgd2l0aCB0aGUgc2hhcmVkIHNjYWxhciBjb2VyY2lvbiBydWxlcy4gKi9cbmV4cG9ydCBjb25zdCB0b051bWJlciA9IG9iamVjdC50b051bWJlcjtcblxuLyoqXG4gKiBSZXNvbHZlIGEgcG9zaXRpdmUgbnVtYmVyIHRoYXQgbWF5IGJlIGZyYWN0aW9uYWwgKGEgc2NvcmUgdGhyZXNob2xkLCBhIHJhdGlvKS5cbiAqIFVzZSB7QGxpbmsgcG9zaXRpdmVJbnR9IGZvciBhIGNvdW50LCBwb3J0LCBvciB0aW1lb3V0LlxuICovXG5leHBvcnQgZnVuY3Rpb24gcG9zaXRpdmVOdW1iZXIoXG4gIGNvbmZpZ3VyZWQ6IHVua25vd24sXG4gIGlucHV0OiBDb25maWdLZXksXG4gIGZhbGxiYWNrOiBudW1iZXIsXG4gIG9wdGlvbnM/OiBDb25maWdPcHRpb25zLFxuKTogbnVtYmVyIHtcbiAgY29uc3QgZnJvbUNvbmZpZyA9IHBvc2l0aXZlTnVtYmVyVmFsdWUuc2FmZVBhcnNlKGNvbmZpZ3VyZWQpO1xuICBpZiAoZnJvbUNvbmZpZy5zdWNjZXNzKSByZXR1cm4gZnJvbUNvbmZpZy5kYXRhO1xuICBjb25zdCBmcm9tU291cmNlcyA9IHBvc2l0aXZlTnVtYmVyVmFsdWUuc2FmZVBhcnNlKHRleHQoaW5wdXQsIG9wdGlvbnMpKTtcbiAgcmV0dXJuIGZyb21Tb3VyY2VzLnN1Y2Nlc3MgPyBmcm9tU291cmNlcy5kYXRhIDogZmFsbGJhY2s7XG59XG5cbi8qKlxuICogUmVzb2x2ZSBhIHBvc2l0aXZlIGludGVnZXIgKGEgcG9ydCwgYSB0aW1lb3V0LCBhIHBhZ2Ugc2l6ZSksIGZsb29yZWQuIEFcbiAqIG5vbi1udW1lcmljIG9yIG5vbi1wb3NpdGl2ZSB2YWx1ZSBpcyB0cmVhdGVkIGFzIEFCU0VOVCByYXRoZXIgdGhhbiBmYXRhbCAtXG4gKiB0aGVzZSBhcmUgY2VpbGluZ3Mgd2hlcmUgYSBzYW5lIGRlZmF1bHQgYmVhdHMgYSBib290IGZhaWx1cmUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwb3NpdGl2ZUludChcbiAgY29uZmlndXJlZDogdW5rbm93bixcbiAgaW5wdXQ6IENvbmZpZ0tleSxcbiAgZmFsbGJhY2s6IG51bWJlcixcbiAgb3B0aW9ucz86IENvbmZpZ09wdGlvbnMsXG4pOiBudW1iZXIge1xuICBjb25zdCBmcm9tQ29uZmlnID0gcG9zaXRpdmVJbnRWYWx1ZS5zYWZlUGFyc2UoY29uZmlndXJlZCk7XG4gIGlmIChmcm9tQ29uZmlnLnN1Y2Nlc3MpIHJldHVybiBmcm9tQ29uZmlnLmRhdGE7XG4gIGNvbnN0IGZyb21Tb3VyY2VzID0gcG9zaXRpdmVJbnRWYWx1ZS5zYWZlUGFyc2UodGV4dChpbnB1dCwgb3B0aW9ucykpO1xuICByZXR1cm4gZnJvbVNvdXJjZXMuc3VjY2VzcyA/IGZyb21Tb3VyY2VzLmRhdGEgOiBNYXRoLmZsb29yKGZhbGxiYWNrKTtcbn1cblxuLyoqXG4gKiBSZXNvbHZlIGEgVENQIHBvcnQgYmV0d2VlbiAxIGFuZCB7QGxpbmsgTUFYX1RDUF9QT1JUfS4gSW52YWxpZCBjb25maWd1cmVkIG9yXG4gKiBzb3VyY2VkIHZhbHVlcyBmYWxsIGJhY2sgdG8gdGhlIGNhbGxlcidzIGRlZmF1bHQsIHdoaWNoIG1heSBiZSBhIHNlbnRpbmVsXG4gKiBzdWNoIGFzIGAwYCB3aGVuIHRoZSBjYWxsZXIgdXNlcyBvbmUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwb3J0KFxuICBjb25maWd1cmVkOiB1bmtub3duLFxuICBpbnB1dDogQ29uZmlnS2V5LFxuICBmYWxsYmFjazogbnVtYmVyLFxuICBvcHRpb25zPzogQ29uZmlnT3B0aW9ucyxcbik6IG51bWJlciB7XG4gIGNvbnN0IGZyb21Db25maWcgPSBwb3J0VmFsdWVTY2hlbWEuc2FmZVBhcnNlKGNvbmZpZ3VyZWQpO1xuICBpZiAoZnJvbUNvbmZpZy5zdWNjZXNzKSByZXR1cm4gZnJvbUNvbmZpZy5kYXRhO1xuICBjb25zdCBmcm9tU291cmNlcyA9IHBvcnRWYWx1ZVNjaGVtYS5zYWZlUGFyc2UodGV4dChpbnB1dCwgb3B0aW9ucykpO1xuICByZXR1cm4gZnJvbVNvdXJjZXMuc3VjY2VzcyA/IGZyb21Tb3VyY2VzLmRhdGEgOiBmYWxsYmFjaztcbn1cblxuLyoqXG4gKiBSZXNvbHZlIGEgbGlzdCB0aHJvdWdoIGBzdHJpbmdVdGlscy5wYXJzZUxpc3RgLCBzbyBhbiBhcnJheSBmcm9tIHR5cGVkIGNvbmZpZyBhbmQgYVxuICogYFwiYSwgYiBjXCJgIHN0cmluZyBub3JtYWxpemUgaWRlbnRpY2FsbHkuIGBbXWAgd2hlbiBuZWl0aGVyIHNvdXJjZSBoYXMgZW50cmllcy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGxpc3QoXG4gIGNvbmZpZ3VyZWQ6IHN0cmluZyB8IHJlYWRvbmx5IHN0cmluZ1tdIHwgdW5kZWZpbmVkIHwgbnVsbCxcbiAgaW5wdXQ6IENvbmZpZ0tleSxcbiAgdHJhbnNmb3JtPzogKGVudHJ5OiBzdHJpbmcpID0+IHN0cmluZyxcbiAgb3B0aW9ucz86IENvbmZpZ09wdGlvbnMsXG4pOiBzdHJpbmdbXSB7XG4gIGNvbnN0IGZyb21Db25maWcgPSBzdHJpbmdVdGlscy5wYXJzZUxpc3QoY29uZmlndXJlZCwgdHJhbnNmb3JtKTtcbiAgcmV0dXJuIGZyb21Db25maWcubGVuZ3RoID4gMFxuICAgID8gZnJvbUNvbmZpZ1xuICAgIDogc3RyaW5nVXRpbHMucGFyc2VMaXN0KHRleHQoaW5wdXQsIG9wdGlvbnMpLCB0cmFuc2Zvcm0pO1xufVxuXG4vKipcbiAqIFRoZSBEYXRhYnJpY2tzIGJ1bmRsZSBvdXRwdXQgZm9yIGBjd2RgIC0gYGRhdGFicmlja3MgYnVuZGxlIHZhbGlkYXRlIC0tb3V0cHV0XG4gKiBqc29uYCBydW4gZnJvbSB0aGUgZGlyZWN0b3J5IGhvbGRpbmcgYGRhdGFicmlja3MueW1sYCwgd2l0aCB0aGUgY29uZmlnIGZpbGUnc1xuICogcGF0aC4gQSBub24temVybyB2YWxpZGF0aW9uIG1heSBzdGlsbCByZXR1cm4gcGFydGlhbCBKU09OIHdpdGggdXNhYmxlIEFwcFxuICogY29uZmlnLiBgdW5kZWZpbmVkYCB3aGVuIGJ1bmRsZSByZWFkcyBhcmUgZGlzYWJsZWQsIHRoZSBwcm9jZXNzIGlzIHByb2R1Y3Rpb25cbiAqIG9yIGEgZGVwbG95ZWQgQXBwIHdpdGhvdXQgYW4gZXhwbGljaXQgb3ZlcnJpZGUsIHRoZXJlIGlzIG5vIGJ1bmRsZSwgb3IgdGhlXG4gKiBDTEkgcHJvZHVjZXMgbm8gSlNPTi5cbiAqXG4gKiBQYXJzZWQgdmFsaWRhdGlvbiBvdXRwdXQgaXMgY2FjaGVkIGJ5IGJ1bmRsZSBwYXRoIGFuZCBEYXRhYnJpY2tzIHByb2ZpbGUuXG4gKlxuICovXG5leHBvcnQgZnVuY3Rpb24gYnVuZGxlRmlsZShjd2Q/OiBzdHJpbmcgfCBudWxsLCBwcm9maWxlPzogc3RyaW5nIHwgbnVsbCk6IENvbmZpZ0ZpbGUgfCB1bmRlZmluZWQge1xuICBjb25zdCBvdmVycmlkZSA9IG9iamVjdC50b0Jvb2xlYW4ocHJvY2Vzcy5lbnZbQ09ORklHX0JVTkRMRV9LRVldKTtcbiAgaWYgKG92ZXJyaWRlID09PSBmYWxzZSkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgaWYgKFxuICAgIG92ZXJyaWRlID09PSB1bmRlZmluZWQgJiZcbiAgICAocHJvY2Vzcy5lbnYuTk9ERV9FTlY/LnRyaW0oKS50b0xvd2VyQ2FzZSgpID09PSBcInByb2R1Y3Rpb25cIiB8fFxuICAgICAgZW52aXJvbm1lbnRVdGlscy5pc0RhdGFicmlja3NBcHBFbnYoKSlcbiAgKSB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuICBjb25zdCByZXNvbHZlZCA9IHJlc29sdmVXb3JraW5nRGlyZWN0b3J5KGN3ZCk7XG4gIHJldHVybiBsb2FkQnVuZGxlRmlsZShyZXNvbHZlZCwgc3RyaW5nVXRpbHMudHJpbVRvTnVsbChwcm9maWxlKSk7XG59XG5cbi8qKiBUaGUgcGFyc2VkIGBhcHAueWFtbGAgLyBgYXBwLnltbGAgZm9yIGBjd2RgLCB3aGVuIGxvY2FsIEFwcCBjb25maWcgcmVhZHMgYXJlIGVuYWJsZWQuICovXG5leHBvcnQgZnVuY3Rpb24gYXBwRmlsZShjd2Q/OiBzdHJpbmcgfCBudWxsKTogQ29uZmlnRmlsZSB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IGVuYWJsZWQgPVxuICAgIG9iamVjdC50b0Jvb2xlYW4ocHJvY2Vzcy5lbnZbQ09ORklHX0FQUF9LRVldKSA/PyAhZW52aXJvbm1lbnRVdGlscy5pc0RhdGFicmlja3NBcHBFbnYoKTtcbiAgaWYgKCFlbmFibGVkKSByZXR1cm4gdW5kZWZpbmVkO1xuICByZXR1cm4gbG9hZEFwcEZpbGUocmVzb2x2ZVdvcmtpbmdEaXJlY3RvcnkoY3dkKSk7XG59XG5cbi8qKiBUaGUgc2luZ2xlIGJ1bmRsZSBBcHAncyByZXNvbHZlZCBlbnZpcm9ubWVudCwgd2hlbiBhdmFpbGFibGUuICovXG5mdW5jdGlvbiBidW5kbGVFbnZpcm9ubWVudChvcHRpb25zOiBDb25maWdPcHRpb25zKTogUmVjb3JkPHN0cmluZywgc3RyaW5nPiB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IGRhdGEgPVxuICAgIHNvdXJjZURhdGEob3B0aW9ucy5idW5kbGVEYXRhKSA/PyBidW5kbGVGaWxlKG9wdGlvbnMuY3dkLCBvcHRpb25zLmJ1bmRsZVByb2ZpbGUpPy5kYXRhO1xuICByZXR1cm4gZGF0YSA/IGZsYXR0ZW5CdW5kbGVFbnYoZGF0YSkgOiB1bmRlZmluZWQ7XG59XG5cbmZ1bmN0aW9uIGFwcEVudmlyb25tZW50KG9wdGlvbnM6IENvbmZpZ09wdGlvbnMpOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+IHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgZGF0YSA9IHNvdXJjZURhdGEob3B0aW9ucy5hcHBEYXRhKSA/PyBhcHBGaWxlKG9wdGlvbnMuY3dkKT8uZGF0YTtcbiAgcmV0dXJuIGRhdGEgPyBmbGF0dGVuQXBwRW52KGRhdGEpIDogdW5kZWZpbmVkO1xufVxuXG5mdW5jdGlvbiBzb3VyY2VEYXRhKFxuICBzb3VyY2U6IENvbmZpZ0ZpbGUgfCBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB8IHVuZGVmaW5lZCxcbik6IFJlY29yZDxzdHJpbmcsIHVua25vd24+IHwgdW5kZWZpbmVkIHtcbiAgaWYgKCFzb3VyY2UpIHJldHVybiB1bmRlZmluZWQ7XG4gIGlmIChcInBhdGhcIiBpbiBzb3VyY2UgJiYgdHlwZW9mIHNvdXJjZS5wYXRoID09PSBcInN0cmluZ1wiICYmIG9iamVjdC5pc1JlY29yZChzb3VyY2UuZGF0YSkpIHtcbiAgICByZXR1cm4gc291cmNlLmRhdGE7XG4gIH1cbiAgcmV0dXJuIHNvdXJjZSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbn1cblxuLyoqIFBhcnNlZCBgLmVudmAgZm9yIGBjd2RgLCBvciBge31gOyBwYXJzZWQgZmlsZSBkYXRhIGlzIGNhY2hlZCBieSBwYXRoLiAqL1xuZnVuY3Rpb24gZG90ZW52KGN3ZD86IHN0cmluZyB8IG51bGwpOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmcgfCB1bmRlZmluZWQ+IHtcbiAgY29uc3QgZW5hYmxlZCA9XG4gICAgb2JqZWN0LnRvQm9vbGVhbihwcm9jZXNzLmVudltDT05GSUdfRE9URU5WX0tFWV0pID8/ICFlbnZpcm9ubWVudFV0aWxzLmlzRGF0YWJyaWNrc0FwcEVudigpO1xuICBpZiAoIWVuYWJsZWQpIHJldHVybiB7fTtcbiAgY29uc3QgcmVzb2x2ZWQgPSByZXNvbHZlV29ya2luZ0RpcmVjdG9yeShjd2QpO1xuICByZXR1cm4gbG9hZERvdGVudihyZXNvbHZlZCwgbm9kZUVudk5hbWVzKHByb2Nlc3MuZW52Lk5PREVfRU5WKSk7XG59XG5cbi8qKiBNYXBzIGZvciBvbmUgc291cmNlIGluIHByZWNlZGVuY2Ugb3JkZXIuICovXG5mdW5jdGlvbiByZWFkKFxuICBzb3VyY2U6IENvbmZpZ1NvdXJjZSxcbiAgb3B0aW9uczogQ29uZmlnT3B0aW9ucyxcbik6IG9iamVjdC5TZXF1ZW5jZTxSZWFkb25seTxSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj4+IHtcbiAgcmV0dXJuIG9iamVjdC5zZXF1ZW5jZSh7XG4gICAgKltTeW1ib2wuaXRlcmF0b3JdKCk6IEdlbmVyYXRvcjxSZWFkb25seTxSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj4+IHtcbiAgICAgIHN3aXRjaCAoc291cmNlKSB7XG4gICAgICAgIGNhc2UgXCJjb25maWdcIjoge1xuICAgICAgICAgIGNvbnN0IGRhdGEgPSBvcHRpb25zLmRhdGE7XG4gICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoZGF0YSkpIHtcbiAgICAgICAgICAgIHlpZWxkKiBkYXRhO1xuICAgICAgICAgIH0gZWxzZSBpZiAoZGF0YSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB5aWVsZCBkYXRhIGFzIENvbmZpZ0RhdGE7XG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgXCJlbnZcIjpcbiAgICAgICAgICB5aWVsZCBwcm9jZXNzLmVudjtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBcImRvdGVudlwiOlxuICAgICAgICAgIHlpZWxkIGRvdGVudihvcHRpb25zLmN3ZCk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgXCJidW5kbGVcIjoge1xuICAgICAgICAgIGNvbnN0IGVudmlyb25tZW50ID0gYnVuZGxlRW52aXJvbm1lbnQob3B0aW9ucyk7XG4gICAgICAgICAgaWYgKGVudmlyb25tZW50KSB5aWVsZCBlbnZpcm9ubWVudDtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBjYXNlIFwiYXBwXCI6IHtcbiAgICAgICAgICBjb25zdCBlbnZpcm9ubWVudCA9IGFwcEVudmlyb25tZW50KG9wdGlvbnMpO1xuICAgICAgICAgIGlmIChlbnZpcm9ubWVudCkgeWllbGQgZW52aXJvbm1lbnQ7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKGBVbmtub3duIGNvbmZpZyBzb3VyY2U6ICR7c291cmNlfWApO1xuICAgICAgfVxuICAgIH0sXG4gIH0pO1xufVxuXG4vKipcbiAqIExvY2F0ZSBgbmFtZXNgIGZyb20gYGN3ZGAgb3V0d2FyZC4gYGN3ZGAgaXRzZWxmIGlzIGNoZWNrZWQgYmVmb3JlIHRoZVxuICogZGlzY292ZXJlZCBwcm9qZWN0IHJvb3RzIHNvIGEgcGFja2FnZS1sb2NhbCBmaWxlIHdpbnMgb3ZlciB0aGUgd29ya3NwYWNlJ3MuXG4gKi9cbmZ1bmN0aW9uIGZpbmRDb25maWdGaWxlKGN3ZDogc3RyaW5nLCBuYW1lczogcmVhZG9ubHkgc3RyaW5nW10pOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBjb25zdCBzdGFydCA9IHJlc29sdmUoY3dkKTtcbiAgY29uc3Qga2V5ID0gSlNPTi5zdHJpbmdpZnkoW3N0YXJ0LCAuLi5uYW1lc10pO1xuICBpZiAoY29uZmlnRmlsZUNhY2hlLmhhcyhrZXkpKSByZXR1cm4gY29uZmlnRmlsZUNhY2hlLmdldChrZXkpO1xuICBjb25zdCByb290ID0gcmVzb2x2ZVByb2plY3RSb290KHN0YXJ0KTtcbiAgY29uc3QgcGF0aEZyb21Sb290ID0gcm9vdCA/IHJlbGF0aXZlKHJvb3QsIHN0YXJ0KSA6IHVuZGVmaW5lZDtcbiAgY29uc3QgYm91bmRhcnkgPVxuICAgIHJvb3QgJiZcbiAgICBwYXRoRnJvbVJvb3QgIT09IHVuZGVmaW5lZCAmJlxuICAgICFpc0Fic29sdXRlKHBhdGhGcm9tUm9vdCkgJiZcbiAgICBwYXRoRnJvbVJvb3QgIT09IFwiLi5cIiAmJlxuICAgICFwYXRoRnJvbVJvb3Quc3RhcnRzV2l0aChgLi4ke3NlcH1gKVxuICAgICAgPyByb290XG4gICAgICA6IHVuZGVmaW5lZDtcbiAgZm9yIChsZXQgZGlyID0gc3RhcnQ7IDsgZGlyID0gZGlybmFtZShkaXIpKSB7XG4gICAgZm9yIChjb25zdCBuYW1lIG9mIG5hbWVzKSB7XG4gICAgICBjb25zdCBwYXRoID0gcmVzb2x2ZShkaXIsIG5hbWUpO1xuICAgICAgaWYgKHN0YXRTeW5jKHBhdGgpPy5pc0ZpbGUoKSkge1xuICAgICAgICBjb25maWdGaWxlQ2FjaGUuc2V0KGtleSwgcGF0aCk7XG4gICAgICAgIHJldHVybiBwYXRoO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoYm91bmRhcnkgPT09IHVuZGVmaW5lZCB8fCBkaXIgPT09IGJvdW5kYXJ5KSBicmVhaztcbiAgfVxuICBjb25maWdGaWxlQ2FjaGUuc2V0KGtleSwgdW5kZWZpbmVkKTtcbiAgcmV0dXJuIHVuZGVmaW5lZDtcbn1cblxuZnVuY3Rpb24gbG9hZERvdGVudihcbiAgY3dkOiBzdHJpbmcsXG4gIGVudmlyb25tZW50czogcmVhZG9ubHkgc3RyaW5nW10sXG4pOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmcgfCB1bmRlZmluZWQ+IHtcbiAgY29uc3QgbmFtZXMgPSBbLi4uZW52aXJvbm1lbnRzLm1hcCgobmFtZSkgPT4gYCR7RE9URU5WX0ZJTEVfTkFNRX0uJHtuYW1lfWApLCBET1RFTlZfRklMRV9OQU1FXTtcbiAgY29uc3QgcGF0aCA9IGZpbmRDb25maWdGaWxlKGN3ZCwgbmFtZXMpO1xuICBpZiAoIXBhdGgpIHJldHVybiB7fTtcbiAgcmV0dXJuIChcbiAgICBjYWNoZWRSZWNvcmQoSlNPTi5zdHJpbmdpZnkoW1wiZG90ZW52XCIsIHBhdGhdKSwgKCkgPT4ge1xuICAgICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIHBhcnNlRW52KHJlYWRGaWxlU3luYyhwYXRoLCBcInV0ZjhcIikpO1xuICAgICAgfSBjYXRjaCB7XG4gICAgICAgIGxvZ2dlci53YXJuKFwiZmFpbGVkIHRvIHJlYWQgZG90ZW52IGZpbGVcIiwgeyBwYXRoIH0pO1xuICAgICAgICByZXR1cm4ge307XG4gICAgICB9XG4gICAgfSkgPz8ge31cbiAgKTtcbn1cblxuZnVuY3Rpb24gbG9hZEJ1bmRsZUZpbGUoY3dkOiBzdHJpbmcsIHByb2ZpbGU6IHN0cmluZyB8IG51bGwpOiBDb25maWdGaWxlIHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgcGF0aCA9IGZpbmRDb25maWdGaWxlKGN3ZCwgQlVORExFX0ZJTEVfTkFNRVMpO1xuICBpZiAoIXBhdGgpIHJldHVybiB1bmRlZmluZWQ7XG4gIGNvbnN0IGRhdGEgPSBjYWNoZWRSZWNvcmQoSlNPTi5zdHJpbmdpZnkoW1wiYnVuZGxlXCIsIHBhdGgsIHByb2ZpbGVdKSwgKCkgPT4ge1xuICAgIGNvbnN0IGFyZ3MgPSBbXG4gICAgICBcImJ1bmRsZVwiLFxuICAgICAgXCJ2YWxpZGF0ZVwiLFxuICAgICAgXCItLW91dHB1dFwiLFxuICAgICAgXCJqc29uXCIsXG4gICAgICAuLi4ocHJvZmlsZSA9PT0gbnVsbCA/IFtdIDogW1wiLS1wcm9maWxlXCIsIHByb2ZpbGVdKSxcbiAgICBdO1xuICAgIGNvbnN0IGVudmlyb25tZW50ID0geyAuLi5wcm9jZXNzLmVudiB9O1xuICAgIGRlbGV0ZSBlbnZpcm9ubWVudC5EQVRBQlJJQ0tTX0NPTkZJR19QUk9GSUxFO1xuICAgIGNvbnN0IHJlc3VsdCA9IHNwYXduU3luYyhcImRhdGFicmlja3NcIiwgYXJncywge1xuICAgICAgY3dkOiByZXNvbHZlKHBhdGgsIFwiLi5cIiksXG4gICAgICBlbnY6IGVudmlyb25tZW50LFxuICAgICAgZW5jb2Rpbmc6IFwidXRmOFwiLFxuICAgICAgc3RkaW86IFtcImlnbm9yZVwiLCBcInBpcGVcIiwgXCJwaXBlXCJdLFxuICAgIH0pO1xuICAgIGNvbnN0IG91dHB1dCA9IHN0cmluZ1V0aWxzLnRyaW1Ub051bGwocmVzdWx0LnN0ZG91dCk7XG4gICAgY29uc3QgZXJyb3IgPSBzdHJpbmdVdGlscy50cmltVG9OdWxsKHJlc3VsdC5zdGRlcnIpO1xuICAgIGlmIChvdXRwdXQgPT09IG51bGwpIHtcbiAgICAgIGxvZ2dlci5kZWJ1ZyhcImJ1bmRsZSB2YWxpZGF0ZSBwcm9kdWNlZCBubyBKU09OXCIsIHsgcGF0aCwgc3RhdHVzOiByZXN1bHQuc3RhdHVzLCBlcnJvciB9KTtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuICAgIGNvbnN0IHBhcnNlZCA9IGpzb24ucGFyc2VSZWNvcmQob3V0cHV0KTtcbiAgICBpZiAoIXBhcnNlZCkge1xuICAgICAgbG9nZ2VyLndhcm4oXCJmYWlsZWQgdG8gcGFyc2UgYnVuZGxlIHZhbGlkYXRlIG91dHB1dFwiLCB7IHBhdGgsIHN0YXR1czogcmVzdWx0LnN0YXR1cyB9KTtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuICAgIGlmIChyZXN1bHQuc3RhdHVzICE9PSAwKSB7XG4gICAgICBsb2dnZXIuZGVidWcoXCJ1c2luZyBwYXJ0aWFsIGJ1bmRsZSBvdXRwdXRcIiwgeyBwYXRoLCBzdGF0dXM6IHJlc3VsdC5zdGF0dXMsIGVycm9yIH0pO1xuICAgIH1cbiAgICByZXR1cm4gcGFyc2VkO1xuICB9KTtcbiAgcmV0dXJuIGRhdGEgPT09IHVuZGVmaW5lZCA/IHVuZGVmaW5lZCA6IHsgcGF0aCwgZGF0YSB9O1xufVxuXG5mdW5jdGlvbiBsb2FkQXBwRmlsZShjd2Q6IHN0cmluZyk6IENvbmZpZ0ZpbGUgfCB1bmRlZmluZWQge1xuICBjb25zdCBwYXRoID0gZmluZENvbmZpZ0ZpbGUoY3dkLCBBUFBfRklMRV9OQU1FUyk7XG4gIGlmICghcGF0aCkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgY29uc3QgZGF0YSA9IGNhY2hlZFJlY29yZChKU09OLnN0cmluZ2lmeShbXCJhcHBcIiwgcGF0aF0pLCAoKSA9PiB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHBhcnNlZCA9IHBhcnNlWWFtbChyZWFkRmlsZVN5bmMocGF0aCwgXCJ1dGY4XCIpKTtcbiAgICAgIHJldHVybiBvYmplY3QuaXNSZWNvcmQocGFyc2VkKSA/IHBhcnNlZCA6IHVuZGVmaW5lZDtcbiAgICB9IGNhdGNoIHtcbiAgICAgIGxvZ2dlci53YXJuKFwiZmFpbGVkIHRvIHBhcnNlIGFwcCB5YW1sXCIsIHsgcGF0aCB9KTtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuICB9KTtcbiAgcmV0dXJuIGRhdGEgPT09IHVuZGVmaW5lZCA/IHVuZGVmaW5lZCA6IHsgcGF0aCwgZGF0YSB9O1xufVxuIl19
|
package/lib/src/exec.d.ts
CHANGED
|
@@ -98,7 +98,7 @@ export type ExecResult = {
|
|
|
98
98
|
* This is additive - the object still satisfies `Promise<ExecResult>`, so every
|
|
99
99
|
* existing `await spawn(...)` / `spawn(...).then(...)` caller is unchanged. What
|
|
100
100
|
* is new is that the same value is the live child: callers that want to supervise
|
|
101
|
-
* it can read `.pid`, call `.
|
|
101
|
+
* it can read `.pid`, call `.shutdown()`, and listen for `exit` without a
|
|
102
102
|
* second spawn.
|
|
103
103
|
*
|
|
104
104
|
* @example Await it (unchanged)
|
|
@@ -106,16 +106,32 @@ export type ExecResult = {
|
|
|
106
106
|
*
|
|
107
107
|
* @example Supervise it
|
|
108
108
|
* const proc = spawn("bun", ["src/server.ts"]);
|
|
109
|
-
* const shutdown = () =>
|
|
109
|
+
* const shutdown = () => proc.shutdown();
|
|
110
110
|
* const { exitCode } = await proc;
|
|
111
111
|
*/
|
|
112
|
-
export type ChildProcessResult = ChildProcess & Promise<ExecResult
|
|
112
|
+
export type ChildProcessResult = ChildProcess & Promise<ExecResult> & {
|
|
113
|
+
/** Stop the child process tree once using the configured termination policy. */
|
|
114
|
+
shutdown(options?: ChildProcessTerminationOptions): Promise<void>;
|
|
115
|
+
};
|
|
116
|
+
/** Process-tree termination policy used by {@link ChildProcessResult.shutdown}. */
|
|
117
|
+
export interface ChildProcessTerminationOptions {
|
|
118
|
+
/** Time to wait for operating-system termination. Defaults to 8 seconds. */
|
|
119
|
+
terminateTimeout?: number;
|
|
120
|
+
/** Time to poll and force-kill remaining descendants. Defaults to 4 seconds. */
|
|
121
|
+
killTimeout?: number;
|
|
122
|
+
}
|
|
113
123
|
/** Options for {@link spawn}. Extends `SpawnOptions` except `stdio`, which is driven by `stdin` / `stdout` / `stderr`. */
|
|
114
|
-
export type ExecOptions = Omit<SpawnOptions, "stdio"> & {
|
|
124
|
+
export type ExecOptions = Omit<SpawnOptions, "stdio" | "killSignal"> & ChildProcessTerminationOptions & {
|
|
115
125
|
/** `"inherit"` by default; `"pipe"` / `"ignore"` select modes, any other string is input. */
|
|
116
126
|
stdin?: ExecStdio | string;
|
|
117
127
|
stdout?: StdioOption;
|
|
118
128
|
stderr?: StdioOption;
|
|
129
|
+
/**
|
|
130
|
+
* Forward parent termination signals to this child. Defaults to `true`.
|
|
131
|
+
* Set to `false` to skip the shared signal trap; on POSIX, the child is also
|
|
132
|
+
* detached by default so terminal process-group signals are not inherited.
|
|
133
|
+
*/
|
|
134
|
+
forwardTerminationSignals?: boolean;
|
|
119
135
|
/** Throw when the process exits with a non-zero code. */
|
|
120
136
|
check?: boolean;
|
|
121
137
|
/**
|
|
@@ -125,25 +141,10 @@ export type ExecOptions = Omit<SpawnOptions, "stdio"> & {
|
|
|
125
141
|
*/
|
|
126
142
|
trim?: boolean;
|
|
127
143
|
};
|
|
128
|
-
/** Graceful and forced shutdown policy for {@link kill}. */
|
|
129
|
-
export interface KillOptions {
|
|
130
|
-
/** Signal sent to the snapshotted process tree. `false` skips this phase. Defaults to `SIGTERM`. */
|
|
131
|
-
gracefulSignal?: NodeJS.Signals | false;
|
|
132
|
-
/** Processes receiving the graceful signal. Defaults to the complete process tree. */
|
|
133
|
-
gracefulSignalTarget?: "root" | "tree";
|
|
134
|
-
/** Time to wait for graceful shutdown. Defaults to 10 seconds. */
|
|
135
|
-
gracefulTimeoutMs?: number;
|
|
136
|
-
/** Signal sent to survivors. `false` disables forced termination. Defaults to `SIGKILL`. */
|
|
137
|
-
forceSignal?: NodeJS.Signals | false;
|
|
138
|
-
/** Time to poll and force newly discovered descendants. Defaults to 4 seconds. */
|
|
139
|
-
forceTimeoutMs?: number;
|
|
140
|
-
/** Interval used to refresh and poll the process tree. Defaults to 100 milliseconds. */
|
|
141
|
-
pollIntervalMs?: number;
|
|
142
|
-
}
|
|
143
144
|
/** Stdio mode for {@link spawnSync} (no per-line callbacks). */
|
|
144
145
|
export type SyncExecStdio = ExecStdio | "capture";
|
|
145
146
|
/** Options for {@link spawnSync}. Same shape as {@link ExecOptions} but without line-handler stdio. */
|
|
146
|
-
export type SyncExecOptions = Omit<SpawnOptions, "stdio"> & {
|
|
147
|
+
export type SyncExecOptions = Omit<SpawnOptions, "stdio" | "killSignal"> & {
|
|
147
148
|
/** `"inherit"` by default; `"pipe"` / `"ignore"` select modes, any other string is input. */
|
|
148
149
|
stdin?: ExecStdio | string;
|
|
149
150
|
stdout?: SyncExecStdio;
|
|
@@ -159,26 +160,6 @@ export type SyncExecOptions = Omit<SpawnOptions, "stdio"> & {
|
|
|
159
160
|
};
|
|
160
161
|
/** Supported command, argument-array, variadic-argument, and options call forms. */
|
|
161
162
|
export type SpawnArgs<T extends SpawnOptions> = [command: string, ...args: string[]] | [command: string, args: readonly string[]] | [command: string, args: readonly string[], options: T] | [command: string, ...argsAndOptions: [...string[], T]];
|
|
162
|
-
/**
|
|
163
|
-
* Stop a child process and descendants discovered through operating-system
|
|
164
|
-
* process snapshots.
|
|
165
|
-
*
|
|
166
|
-
* The initial tree is retained before signaling so descendants remain
|
|
167
|
-
* targetable after their parent exits or they are reparented. Polling refreshes
|
|
168
|
-
* the process table, merges newly created descendants, and sends each one the
|
|
169
|
-
* active shutdown signal once. Either phase can be disabled for graceful-only
|
|
170
|
-
* or force-only termination. macOS and other POSIX platforms use `ps`; Windows
|
|
171
|
-
* uses the built-in PowerShell CIM process provider.
|
|
172
|
-
*
|
|
173
|
-
* Windows does not implement POSIX signal semantics. Node terminates processes
|
|
174
|
-
* unconditionally for supported signals there, including `SIGTERM`.
|
|
175
|
-
*
|
|
176
|
-
* @param child - Root child process whose snapshotted tree should stop
|
|
177
|
-
* @param options - Graceful signal, force signal, timeout, and polling policy
|
|
178
|
-
* @throws When the process table cannot be captured, a signal cannot be sent,
|
|
179
|
-
* or identity-matched processes remain after the final enabled phase
|
|
180
|
-
*/
|
|
181
|
-
export declare function kill(child: ChildProcess, options?: KillOptions): Promise<void>;
|
|
182
163
|
/**
|
|
183
164
|
* Spawn a subprocess. Returns the LIVE child handle that is ALSO a
|
|
184
165
|
* `Promise<ExecResult>` resolving on exit - see {@link ChildProcessResult}.
|
|
@@ -187,7 +168,7 @@ export declare function kill(child: ChildProcess, options?: KillOptions): Promis
|
|
|
187
168
|
* exit (and any line reads / stdin write), then resolves to the {@link ExecResult}
|
|
188
169
|
* or rejects (spawn error other than a missing executable, or `check` on non-zero
|
|
189
170
|
* exit). Existing `await spawn(...)` callers are unaffected. The handle half lets a
|
|
190
|
-
* caller supervise the process (`.pid`, `.
|
|
171
|
+
* caller supervise the process (`.pid`, `.shutdown()`, `exit` event) without a
|
|
191
172
|
* second spawn.
|
|
192
173
|
*
|
|
193
174
|
* @param command - Executable to run (resolved on `PATH` when `shell` is set on options)
|